summaryrefslogtreecommitdiffstatshomepage
path: root/nl_examples/sn74ls629_osc.c
diff options
context:
space:
mode:
author RobertoFresca <robbie@mamedev.org>2015-11-05 09:38:08 -0300
committer RobertoFresca <robbie@mamedev.org>2015-11-05 09:38:08 -0300
commit4ef4bf42d9938dcdaf1fcd9fedab2c6ac5f5264d (patch)
tree37f05359393bc7bdcc4340b5ce60c855ffa6b37a /nl_examples/sn74ls629_osc.c
parent837f9f1ed54021ac65e8adc1f254697ebba41030 (diff)
New machines marked as NOT_WORKING
---------------------------------- Tropical Delight (PHG0625-02, Export, 92.25%) [Roberto Fresca]
Diffstat (limited to 'nl_examples/sn74ls629_osc.c')
0 files changed, 0 insertions, 0 deletions
-rw-r--r--3rdparty/bgfx/3rdparty/libsquish/LICENSE20
-rw-r--r--3rdparty/bgfx/3rdparty/libsquish/README35
-rw-r--r--3rdparty/bgfx/3rdparty/libsquish/alpha.cpp350
-rw-r--r--3rdparty/bgfx/3rdparty/libsquish/alpha.h41
-rw-r--r--3rdparty/bgfx/3rdparty/libsquish/clusterfit.cpp392
-rw-r--r--3rdparty/bgfx/3rdparty/libsquish/clusterfit.h61
-rw-r--r--3rdparty/bgfx/3rdparty/libsquish/colourblock.cpp214
-rw-r--r--3rdparty/bgfx/3rdparty/libsquish/colourblock.h41
-rw-r--r--3rdparty/bgfx/3rdparty/libsquish/colourfit.cpp54
-rw-r--r--3rdparty/bgfx/3rdparty/libsquish/colourfit.h56
-rw-r--r--3rdparty/bgfx/3rdparty/libsquish/colourset.cpp121
-rw-r--r--3rdparty/bgfx/3rdparty/libsquish/colourset.h58
-rw-r--r--3rdparty/bgfx/3rdparty/libsquish/config.h49
-rw-r--r--3rdparty/bgfx/3rdparty/libsquish/maths.cpp259
-rw-r--r--3rdparty/bgfx/3rdparty/libsquish/maths.h233
-rw-r--r--3rdparty/bgfx/3rdparty/libsquish/rangefit.cpp201
-rw-r--r--3rdparty/bgfx/3rdparty/libsquish/rangefit.h54
-rw-r--r--3rdparty/bgfx/3rdparty/libsquish/simd.h32
-rw-r--r--3rdparty/bgfx/3rdparty/libsquish/simd_float.h183
-rw-r--r--3rdparty/bgfx/3rdparty/libsquish/singlecolourfit.cpp172
-rw-r--r--3rdparty/bgfx/3rdparty/libsquish/singlecolourfit.h58
-rw-r--r--3rdparty/bgfx/3rdparty/libsquish/singlecolourlookup.inl1064
-rw-r--r--3rdparty/bgfx/3rdparty/libsquish/squish.cpp260
-rw-r--r--3rdparty/bgfx/3rdparty/libsquish/squish.h269
-rw-r--r--3rdparty/bgfx/3rdparty/nvtt/NVIDIA_Texture_Tools_LICENSE.txt24
-rw-r--r--3rdparty/bgfx/3rdparty/nvtt/bc6h/bits.h75
-rw-r--r--3rdparty/bgfx/3rdparty/nvtt/bc6h/shapes_two.h133
-rw-r--r--3rdparty/bgfx/3rdparty/nvtt/bc6h/tile.h82
-rw-r--r--3rdparty/bgfx/3rdparty/nvtt/bc6h/zoh.cpp197
-rw-r--r--3rdparty/bgfx/3rdparty/nvtt/bc6h/zoh.h65
-rw-r--r--3rdparty/bgfx/3rdparty/nvtt/bc6h/zoh_utils.cpp324
-rw-r--r--3rdparty/bgfx/3rdparty/nvtt/bc6h/zoh_utils.h72
-rw-r--r--3rdparty/bgfx/3rdparty/nvtt/bc6h/zohone.cpp799
-rw-r--r--3rdparty/bgfx/3rdparty/nvtt/bc6h/zohtwo.cpp883
-rw-r--r--3rdparty/bgfx/3rdparty/nvtt/bc7/avpcl.cpp264
-rw-r--r--3rdparty/bgfx/3rdparty/nvtt/bc7/avpcl.h99
-rw-r--r--3rdparty/bgfx/3rdparty/nvtt/bc7/avpcl_mode0.cpp1066
-rw-r--r--3rdparty/bgfx/3rdparty/nvtt/bc7/avpcl_mode1.cpp1047
-rw-r--r--3rdparty/bgfx/3rdparty/nvtt/bc7/avpcl_mode2.cpp1004
-rw-r--r--3rdparty/bgfx/3rdparty/nvtt/bc7/avpcl_mode3.cpp1059
-rw-r--r--3rdparty/bgfx/3rdparty/nvtt/bc7/avpcl_mode4.cpp1214
-rw-r--r--3rdparty/bgfx/3rdparty/nvtt/bc7/avpcl_mode5.cpp1216
-rw-r--r--3rdparty/bgfx/3rdparty/nvtt/bc7/avpcl_mode6.cpp1055
-rw-r--r--3rdparty/bgfx/3rdparty/nvtt/bc7/avpcl_mode7.cpp1094
-rw-r--r--3rdparty/bgfx/3rdparty/nvtt/bc7/avpcl_utils.cpp389
-rw-r--r--3rdparty/bgfx/3rdparty/nvtt/bc7/avpcl_utils.h61
-rw-r--r--3rdparty/bgfx/3rdparty/nvtt/bc7/bits.h76
-rw-r--r--3rdparty/bgfx/3rdparty/nvtt/bc7/endpts.h81
-rw-r--r--3rdparty/bgfx/3rdparty/nvtt/bc7/shapes_three.h132
-rw-r--r--3rdparty/bgfx/3rdparty/nvtt/bc7/shapes_two.h133
-rw-r--r--3rdparty/bgfx/3rdparty/nvtt/bc7/tile.h41
-rw-r--r--3rdparty/bgfx/3rdparty/nvtt/nvcore/array.h181
-rw-r--r--3rdparty/bgfx/3rdparty/nvtt/nvcore/array.inl437
-rw-r--r--3rdparty/bgfx/3rdparty/nvtt/nvcore/debug.h216
-rw-r--r--3rdparty/bgfx/3rdparty/nvtt/nvcore/defsgnucdarwin.h57
-rw-r--r--3rdparty/bgfx/3rdparty/nvtt/nvcore/defsgnuclinux.h63
-rw-r--r--3rdparty/bgfx/3rdparty/nvtt/nvcore/defsgnucwin32.h65
-rw-r--r--3rdparty/bgfx/3rdparty/nvtt/nvcore/defsvcwin32.h94
-rw-r--r--3rdparty/bgfx/3rdparty/nvtt/nvcore/foreach.h68
-rw-r--r--3rdparty/bgfx/3rdparty/nvtt/nvcore/hash.h83
-rw-r--r--3rdparty/bgfx/3rdparty/nvtt/nvcore/memory.h30
-rw-r--r--3rdparty/bgfx/3rdparty/nvtt/nvcore/nvcore.h363
-rw-r--r--3rdparty/bgfx/3rdparty/nvtt/nvcore/posh.h1030
-rw-r--r--3rdparty/bgfx/3rdparty/nvtt/nvcore/stdstream.h459
-rw-r--r--3rdparty/bgfx/3rdparty/nvtt/nvcore/stream.h163
-rw-r--r--3rdparty/bgfx/3rdparty/nvtt/nvcore/strlib.h429
-rw-r--r--3rdparty/bgfx/3rdparty/nvtt/nvcore/utils.h281
-rw-r--r--3rdparty/bgfx/3rdparty/nvtt/nvmath/fitting.cpp1200
-rw-r--r--3rdparty/bgfx/3rdparty/nvtt/nvmath/fitting.h49
-rw-r--r--3rdparty/bgfx/3rdparty/nvtt/nvmath/matrix.h112
-rw-r--r--3rdparty/bgfx/3rdparty/nvtt/nvmath/matrix.inl1274
-rw-r--r--3rdparty/bgfx/3rdparty/nvtt/nvmath/nvmath.h56
-rw-r--r--3rdparty/bgfx/3rdparty/nvtt/nvmath/plane.h40
-rw-r--r--3rdparty/bgfx/3rdparty/nvtt/nvmath/plane.inl49
-rw-r--r--3rdparty/bgfx/3rdparty/nvtt/nvmath/vector.h148
-rw-r--r--3rdparty/bgfx/3rdparty/nvtt/nvmath/vector.inl921
-rw-r--r--3rdparty/bgfx/3rdparty/nvtt/nvtt.cpp95
-rw-r--r--3rdparty/bgfx/3rdparty/nvtt/nvtt.h13
-rw-r--r--3rdparty/bgfx/3rdparty/ocornut-imgui/imgui.cpp686
-rw-r--r--3rdparty/bgfx/3rdparty/ocornut-imgui/imgui.h73
-rw-r--r--3rdparty/bgfx/3rdparty/ocornut-imgui/imgui_demo.cpp580
-rw-r--r--3rdparty/bgfx/3rdparty/ocornut-imgui/imgui_draw.cpp103
-rw-r--r--3rdparty/bgfx/3rdparty/ocornut-imgui/imgui_internal.h159
-rw-r--r--3rdparty/bgfx/3rdparty/ocornut-imgui/imgui_wm.cpp18
-rw-r--r--3rdparty/bgfx/3rdparty/ocornut-imgui/imgui_wm.h4
-rw-r--r--3rdparty/bgfx/3rdparty/pvrtc/AlphaBitmap.h20
-rw-r--r--3rdparty/bgfx/3rdparty/pvrtc/BitScale.cpp183
-rw-r--r--3rdparty/bgfx/3rdparty/pvrtc/BitScale.h28
-rw-r--r--3rdparty/bgfx/3rdparty/pvrtc/BitUtility.h19
-rw-r--r--3rdparty/bgfx/3rdparty/pvrtc/Bitmap.h36
-rw-r--r--3rdparty/bgfx/3rdparty/pvrtc/ColorRgba.h152
-rw-r--r--3rdparty/bgfx/3rdparty/pvrtc/Interval.h21
-rw-r--r--3rdparty/bgfx/3rdparty/pvrtc/LICENSE.TXT25
-rw-r--r--3rdparty/bgfx/3rdparty/pvrtc/MortonTable.cpp43
-rw-r--r--3rdparty/bgfx/3rdparty/pvrtc/MortonTable.h18
-rw-r--r--3rdparty/bgfx/3rdparty/pvrtc/Point2.h17
-rw-r--r--3rdparty/bgfx/3rdparty/pvrtc/PvrTcDecoder.cpp144
-rw-r--r--3rdparty/bgfx/3rdparty/pvrtc/PvrTcDecoder.h25
-rw-r--r--3rdparty/bgfx/3rdparty/pvrtc/PvrTcEncoder.cpp464
-rw-r--r--3rdparty/bgfx/3rdparty/pvrtc/PvrTcEncoder.h43
-rw-r--r--3rdparty/bgfx/3rdparty/pvrtc/PvrTcPacket.cpp209
-rw-r--r--3rdparty/bgfx/3rdparty/pvrtc/PvrTcPacket.h65
-rw-r--r--3rdparty/bgfx/3rdparty/pvrtc/README.md17
-rw-r--r--3rdparty/bgfx/3rdparty/pvrtc/RgbBitmap.h25
-rw-r--r--3rdparty/bgfx/3rdparty/pvrtc/RgbaBitmap.h24
-rw-r--r--3rdparty/bgfx/3rdparty/remotery/LICENSE175
-rw-r--r--3rdparty/bgfx/3rdparty/remotery/lib/Remotery.c5929
-rw-r--r--3rdparty/bgfx/3rdparty/remotery/lib/Remotery.h558
-rw-r--r--3rdparty/bgfx/3rdparty/remotery/readme.md197
-rw-r--r--3rdparty/bgfx/3rdparty/remotery/sample/sample.c33
-rw-r--r--3rdparty/bgfx/3rdparty/remotery/screenshot.pngbin0 -> 87218 bytes-rw-r--r--3rdparty/bgfx/3rdparty/remotery/vis/Code/Console.js117
-rw-r--r--3rdparty/bgfx/3rdparty/remotery/vis/Code/PixelTimeRange.js61
-rw-r--r--3rdparty/bgfx/3rdparty/remotery/vis/Code/Remotery.js234
-rw-r--r--3rdparty/bgfx/3rdparty/remotery/vis/Code/SampleWindow.js164
-rw-r--r--3rdparty/bgfx/3rdparty/remotery/vis/Code/ThreadFrame.js28
-rw-r--r--3rdparty/bgfx/3rdparty/remotery/vis/Code/TimelineRow.js375
-rw-r--r--3rdparty/bgfx/3rdparty/remotery/vis/Code/TimelineWindow.js270
-rw-r--r--3rdparty/bgfx/3rdparty/remotery/vis/Code/TitleWindow.js59
-rw-r--r--3rdparty/bgfx/3rdparty/remotery/vis/Code/WebSocketConnection.js130
-rw-r--r--3rdparty/bgfx/3rdparty/remotery/vis/Styles/Remotery.css211
-rw-r--r--3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/Core/Code/Animation.js65
-rw-r--r--3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/Core/Code/Bind.js92
-rw-r--r--3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/Core/Code/Convert.js218
-rw-r--r--3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/Core/Code/Core.js20
-rw-r--r--3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/Core/Code/DOM.js499
-rw-r--r--3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/Core/Code/Keyboard.js149
-rw-r--r--3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/Core/Code/LocalStore.js26
-rw-r--r--3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/Core/Code/Mouse.js83
-rw-r--r--3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/Core/Code/MurmurHash3.js68
-rw-r--r--3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/WindowManager/Code/Button.js131
-rw-r--r--3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/WindowManager/Code/ComboBox.js237
-rw-r--r--3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/WindowManager/Code/Container.js34
-rw-r--r--3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/WindowManager/Code/EditBox.js117
-rw-r--r--3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/WindowManager/Code/Grid.js252
-rw-r--r--3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/WindowManager/Code/Label.js31
-rw-r--r--3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/WindowManager/Code/Treeview.js352
-rw-r--r--3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/WindowManager/Code/TreeviewItem.js109
-rw-r--r--3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/WindowManager/Code/Window.js243
-rw-r--r--3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/WindowManager/Code/WindowManager.js54
-rw-r--r--3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/WindowManager/Styles/WindowManager.css546
-rw-r--r--3rdparty/bgfx/3rdparty/remotery/vis/index.html53
-rw-r--r--3rdparty/bgfx/3rdparty/tinyexr/README.md274
-rw-r--r--3rdparty/bgfx/3rdparty/tinyexr/tinyexr.cc2
-rw-r--r--3rdparty/bgfx/3rdparty/tinyexr/tinyexr.h11131
-rw-r--r--3rdparty/bgfx/LICENSE2
-rw-r--r--3rdparty/bgfx/README.md17
-rw-r--r--3rdparty/bgfx/examples/00-helloworld/helloworld.cpp4
-rw-r--r--3rdparty/bgfx/examples/01-cubes/cubes.cpp4
-rw-r--r--3rdparty/bgfx/examples/01-cubes/fs_cubes.sc4
-rw-r--r--3rdparty/bgfx/examples/01-cubes/vs_cubes.sc4
-rw-r--r--3rdparty/bgfx/examples/02-metaballs/fs_metaballs.bin.h51
-rw-r--r--3rdparty/bgfx/examples/02-metaballs/fs_metaballs.sc4
-rw-r--r--3rdparty/bgfx/examples/02-metaballs/metaballs.cpp4
-rw-r--r--3rdparty/bgfx/examples/02-metaballs/vs_metaballs.bin.h36
-rw-r--r--3rdparty/bgfx/examples/02-metaballs/vs_metaballs.sc4
-rw-r--r--3rdparty/bgfx/examples/03-raymarch/fs_raymarching.sc4
-rw-r--r--3rdparty/bgfx/examples/03-raymarch/raymarch.cpp4
-rw-r--r--3rdparty/bgfx/examples/03-raymarch/vs_raymarching.sc4
-rw-r--r--3rdparty/bgfx/examples/04-mesh/fs_mesh.sc4
-rw-r--r--3rdparty/bgfx/examples/04-mesh/mesh.cpp4
-rw-r--r--3rdparty/bgfx/examples/04-mesh/vs_mesh.sc4
-rw-r--r--3rdparty/bgfx/examples/05-instancing/fs_instancing.sc4
-rw-r--r--3rdparty/bgfx/examples/05-instancing/instancing.cpp4
-rw-r--r--3rdparty/bgfx/examples/05-instancing/vs_instancing.sc4
-rw-r--r--3rdparty/bgfx/examples/06-bump/bump.cpp4
-rw-r--r--3rdparty/bgfx/examples/06-bump/fs_bump.sc4
-rw-r--r--3rdparty/bgfx/examples/06-bump/vs_bump.sc4
-rw-r--r--3rdparty/bgfx/examples/06-bump/vs_bump_instanced.sc4
-rw-r--r--3rdparty/bgfx/examples/07-callback/callback.cpp55
-rw-r--r--3rdparty/bgfx/examples/07-callback/fs_callback.sc4
-rw-r--r--3rdparty/bgfx/examples/07-callback/vs_callback.sc4
-rw-r--r--3rdparty/bgfx/examples/08-update/fs_update.sc4
-rw-r--r--3rdparty/bgfx/examples/08-update/fs_update_3d.sc4
-rw-r--r--3rdparty/bgfx/examples/08-update/fs_update_cmp.sc4
-rw-r--r--3rdparty/bgfx/examples/08-update/update.cpp4
-rw-r--r--3rdparty/bgfx/examples/08-update/vs_update.sc4
-rw-r--r--3rdparty/bgfx/examples/09-hdr/common.sh4
-rw-r--r--3rdparty/bgfx/examples/09-hdr/fs_hdr_blur.sc4
-rw-r--r--3rdparty/bgfx/examples/09-hdr/fs_hdr_bright.sc4
-rw-r--r--3rdparty/bgfx/examples/09-hdr/fs_hdr_lum.sc4
-rw-r--r--3rdparty/bgfx/examples/09-hdr/fs_hdr_lumavg.sc4
-rw-r--r--3rdparty/bgfx/examples/09-hdr/fs_hdr_mesh.sc4
-rw-r--r--3rdparty/bgfx/examples/09-hdr/fs_hdr_skybox.sc4
-rw-r--r--3rdparty/bgfx/examples/09-hdr/fs_hdr_tonemap.sc4
-rw-r--r--3rdparty/bgfx/examples/09-hdr/hdr.cpp6
-rw-r--r--3rdparty/bgfx/examples/09-hdr/vs_hdr_blur.sc4
-rw-r--r--3rdparty/bgfx/examples/09-hdr/vs_hdr_bright.sc4
-rw-r--r--3rdparty/bgfx/examples/09-hdr/vs_hdr_lum.sc4
-rw-r--r--3rdparty/bgfx/examples/09-hdr/vs_hdr_lumavg.sc4
-rw-r--r--3rdparty/bgfx/examples/09-hdr/vs_hdr_mesh.sc4
-rw-r--r--3rdparty/bgfx/examples/09-hdr/vs_hdr_skybox.sc4
-rw-r--r--3rdparty/bgfx/examples/09-hdr/vs_hdr_tonemap.sc4
-rw-r--r--3rdparty/bgfx/examples/10-font/font.cpp2
-rw-r--r--3rdparty/bgfx/examples/11-fontsdf/fontsdf.cpp2
-rw-r--r--3rdparty/bgfx/examples/12-lod/fs_tree.sc2
-rw-r--r--3rdparty/bgfx/examples/12-lod/lod.cpp2
-rw-r--r--3rdparty/bgfx/examples/12-lod/vs_tree.sc2
-rw-r--r--3rdparty/bgfx/examples/13-stencil/fs_stencil_color_black.sc2
-rw-r--r--3rdparty/bgfx/examples/13-stencil/fs_stencil_color_lighting.sc (renamed from 3rdparty/bgfx/examples/13-stencil/fs_stencil_color_lightning.sc)16
-rw-r--r--3rdparty/bgfx/examples/13-stencil/fs_stencil_color_texture.sc2
-rw-r--r--3rdparty/bgfx/examples/13-stencil/fs_stencil_texture.sc2
-rw-r--r--3rdparty/bgfx/examples/13-stencil/fs_stencil_texture_lighting.sc (renamed from 3rdparty/bgfx/examples/13-stencil/fs_stencil_texture_lightning.sc)2
-rw-r--r--3rdparty/bgfx/examples/13-stencil/stencil.cpp62
-rw-r--r--3rdparty/bgfx/examples/13-stencil/vs_stencil_color.sc2
-rw-r--r--3rdparty/bgfx/examples/13-stencil/vs_stencil_color_lighting.sc (renamed from 3rdparty/bgfx/examples/13-stencil/vs_stencil_color_lightning.sc)2
-rw-r--r--3rdparty/bgfx/examples/13-stencil/vs_stencil_color_texture.sc2
-rw-r--r--3rdparty/bgfx/examples/13-stencil/vs_stencil_texture.sc2
-rw-r--r--3rdparty/bgfx/examples/13-stencil/vs_stencil_texture_lighting.sc (renamed from 3rdparty/bgfx/examples/13-stencil/vs_stencil_texture_lightning.sc)2
-rw-r--r--3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_color_lighting.sc (renamed from 3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_color_lightning.sc)6
-rw-r--r--3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_color_texture.sc2
-rw-r--r--3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svbackblank.sc2
-rw-r--r--3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svbackcolor.sc2
-rw-r--r--3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svbacktex1.sc2
-rw-r--r--3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svbacktex2.sc2
-rw-r--r--3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svfrontblank.sc2
-rw-r--r--3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svfrontcolor.sc2
-rw-r--r--3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svfronttex1.sc2
-rw-r--r--3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svfronttex2.sc2
-rw-r--r--3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svside.sc2
-rw-r--r--3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svsideblank.sc2
-rw-r--r--3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svsidecolor.sc2
-rw-r--r--3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svsidetex.sc2
-rw-r--r--3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_texture.sc2
-rw-r--r--3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_texture_lighting.sc (renamed from 3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_texture_lightning.sc)6
-rw-r--r--3rdparty/bgfx/examples/14-shadowvolumes/shadowvolumes.cpp40
-rw-r--r--3rdparty/bgfx/examples/14-shadowvolumes/vs_shadowvolume_color_lighting.sc (renamed from 3rdparty/bgfx/examples/14-shadowvolumes/vs_shadowvolume_color_lightning.sc)2
-rw-r--r--3rdparty/bgfx/examples/14-shadowvolumes/vs_shadowvolume_color_texture.sc2
-rw-r--r--3rdparty/bgfx/examples/14-shadowvolumes/vs_shadowvolume_svback.sc2
-rw-r--r--3rdparty/bgfx/examples/14-shadowvolumes/vs_shadowvolume_svfront.sc2
-rw-r--r--3rdparty/bgfx/examples/14-shadowvolumes/vs_shadowvolume_svside.sc2
-rw-r--r--3rdparty/bgfx/examples/14-shadowvolumes/vs_shadowvolume_texture.sc2
-rw-r--r--3rdparty/bgfx/examples/14-shadowvolumes/vs_shadowvolume_texture_lighting.sc (renamed from 3rdparty/bgfx/examples/14-shadowvolumes/vs_shadowvolume_texture_lightning.sc)2
-rw-r--r--3rdparty/bgfx/examples/15-shadowmaps-simple/fs_sms_mesh.sc2
-rw-r--r--3rdparty/bgfx/examples/15-shadowmaps-simple/fs_sms_mesh_pd.sc2
-rw-r--r--3rdparty/bgfx/examples/15-shadowmaps-simple/fs_sms_shadow.sc2
-rw-r--r--3rdparty/bgfx/examples/15-shadowmaps-simple/fs_sms_shadow.sh2
-rw-r--r--3rdparty/bgfx/examples/15-shadowmaps-simple/fs_sms_shadow_pd.sc2
-rw-r--r--3rdparty/bgfx/examples/15-shadowmaps-simple/shadowmaps_simple.cpp4
-rw-r--r--3rdparty/bgfx/examples/15-shadowmaps-simple/vs_sms_mesh.sc2
-rw-r--r--3rdparty/bgfx/examples/15-shadowmaps-simple/vs_sms_shadow.sc2
-rw-r--r--3rdparty/bgfx/examples/15-shadowmaps-simple/vs_sms_shadow_pd.sc2
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/common.sh2
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_black.sc2
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting.sh (renamed from 3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning.sh)2
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_esm.sc15
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_esm_csm.sc (renamed from 3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm_csm.sc)6
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_esm_linear.sc (renamed from 3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm_linear.sc)6
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_esm_linear_csm.sc (renamed from 3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm_linear_csm.sc)6
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_esm_linear_omni.sc (renamed from 3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm_linear_omni.sc)6
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_esm_omni.sc (renamed from 3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm_omni.sc)6
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_hard.sc15
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_hard_csm.sc (renamed from 3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard_csm.sc)6
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_hard_linear.sc (renamed from 3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard_linear.sc)6
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_hard_linear_csm.sc (renamed from 3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard_linear_csm.sc)6
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_hard_linear_omni.sc (renamed from 3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard_linear_omni.sc)6
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_hard_omni.sc (renamed from 3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard_omni.sc)6
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_main.sh (renamed from 3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_main.sh)2
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_pcf.sc15
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_pcf_csm.sc (renamed from 3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf_csm.sc)6
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_pcf_linear.sc (renamed from 3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf_linear.sc)6
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_pcf_linear_csm.sc (renamed from 3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf_linear_csm.sc)6
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_pcf_linear_omni.sc (renamed from 3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf_linear_omni.sc)6
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_pcf_omni.sc (renamed from 3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf_omni.sc)6
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_vsm.sc15
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_vsm_csm.sc (renamed from 3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_csm.sc)6
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_vsm_linear.sc (renamed from 3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_linear.sc)6
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_vsm_linear_csm.sc (renamed from 3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_linear_csm.sc)6
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_vsm_linear_omni.sc (renamed from 3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_linear_omni.sc)6
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_vsm_omni.sc (renamed from 3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_omni.sc)6
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm.sc15
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard.sc15
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf.sc15
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm.sc15
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_texture.sc2
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_hblur.sc2
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_hblur_vsm.sc2
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_packdepth.sc2
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_packdepth_linear.sc2
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_packdepth_vsm.sc2
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_packdepth_vsm_linear.sc2
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_texture.sc2
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_unpackdepth.sc2
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_unpackdepth_vsm.sc2
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_vblur.sc2
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_vblur_vsm.sc2
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/shadowmaps.cpp128
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_color.sc2
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_color_lighting.sc (renamed from 3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_color_lightning.sc)2
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_color_lighting_csm.sc (renamed from 3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_color_lightning_csm.sc)2
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_color_lighting_linear.sc (renamed from 3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_color_lightning_linear.sc)2
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_color_lighting_linear_csm.sc (renamed from 3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_color_lightning_linear_csm.sc)2
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_color_lighting_linear_omni.sc (renamed from 3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_color_lightning_linear_omni.sc)2
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_color_lighting_omni.sc (renamed from 3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_color_lightning_omni.sc)2
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_color_texture.sc2
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_depth.sc2
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_hblur.sc4
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_packdepth.sc2
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_packdepth_linear.sc2
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_texture.sc2
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_texture_lighting.sc (renamed from 3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_texture_lightning.sc)2
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_unpackdepth.sc2
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_vblur.sc2
-rw-r--r--3rdparty/bgfx/examples/17-drawstress/drawstress.cpp9
-rw-r--r--3rdparty/bgfx/examples/17-drawstress/fs_drawstress.bin.h14
-rw-r--r--3rdparty/bgfx/examples/17-drawstress/fs_drawstress.sc4
-rw-r--r--3rdparty/bgfx/examples/17-drawstress/vs_drawstress.bin.h25
-rw-r--r--3rdparty/bgfx/examples/17-drawstress/vs_drawstress.sc4
-rw-r--r--3rdparty/bgfx/examples/18-ibl/fs_ibl_mesh.sc2
-rw-r--r--3rdparty/bgfx/examples/18-ibl/fs_ibl_skybox.sc2
-rw-r--r--3rdparty/bgfx/examples/18-ibl/ibl.cpp4
-rw-r--r--3rdparty/bgfx/examples/18-ibl/vs_ibl_mesh.sc2
-rw-r--r--3rdparty/bgfx/examples/18-ibl/vs_ibl_skybox.sc2
-rw-r--r--3rdparty/bgfx/examples/19-oit/fs_oit.sc4
-rw-r--r--3rdparty/bgfx/examples/19-oit/fs_oit_wb.sc4
-rw-r--r--3rdparty/bgfx/examples/19-oit/fs_oit_wb_blit.sc4
-rw-r--r--3rdparty/bgfx/examples/19-oit/fs_oit_wb_separate.sc4
-rw-r--r--3rdparty/bgfx/examples/19-oit/fs_oit_wb_separate_blit.sc4
-rw-r--r--3rdparty/bgfx/examples/19-oit/oit.cpp4
-rw-r--r--3rdparty/bgfx/examples/19-oit/vs_oit.sc4
-rw-r--r--3rdparty/bgfx/examples/19-oit/vs_oit_blit.sc4
-rw-r--r--3rdparty/bgfx/examples/20-nanovg/nanovg.cpp6
-rw-r--r--3rdparty/bgfx/examples/21-deferred/deferred.cpp4
-rw-r--r--3rdparty/bgfx/examples/21-deferred/fs_deferred_combine.sc4
-rw-r--r--3rdparty/bgfx/examples/21-deferred/fs_deferred_debug.sc4
-rw-r--r--3rdparty/bgfx/examples/21-deferred/fs_deferred_debug_line.sc4
-rw-r--r--3rdparty/bgfx/examples/21-deferred/fs_deferred_geom.sc4
-rw-r--r--3rdparty/bgfx/examples/21-deferred/fs_deferred_light.sc4
-rw-r--r--3rdparty/bgfx/examples/21-deferred/vs_deferred_combine.sc4
-rw-r--r--3rdparty/bgfx/examples/21-deferred/vs_deferred_debug.sc4
-rw-r--r--3rdparty/bgfx/examples/21-deferred/vs_deferred_debug_line.sc4
-rw-r--r--3rdparty/bgfx/examples/21-deferred/vs_deferred_geom.sc4
-rw-r--r--3rdparty/bgfx/examples/21-deferred/vs_deferred_light.sc4
-rw-r--r--3rdparty/bgfx/examples/22-windows/windows.cpp4
-rw-r--r--3rdparty/bgfx/examples/23-vectordisplay/main.cpp2
-rw-r--r--3rdparty/bgfx/examples/23-vectordisplay/vectordisplay.cpp2
-rw-r--r--3rdparty/bgfx/examples/23-vectordisplay/vectordisplay.h2
-rw-r--r--3rdparty/bgfx/examples/24-nbody/cs_indirect.sc2
-rw-r--r--3rdparty/bgfx/examples/24-nbody/cs_init_instances.sc2
-rw-r--r--3rdparty/bgfx/examples/24-nbody/cs_update_instances.sc2
-rw-r--r--3rdparty/bgfx/examples/24-nbody/fs_particle.sc2
-rw-r--r--3rdparty/bgfx/examples/24-nbody/nbody.cpp2
-rw-r--r--3rdparty/bgfx/examples/24-nbody/uniforms.sh2
-rw-r--r--3rdparty/bgfx/examples/24-nbody/vs_particle.sc2
-rw-r--r--3rdparty/bgfx/examples/26-occlusion/occlusion.cpp285
-rw-r--r--3rdparty/bgfx/examples/26-occlusion/screenshot.pngbin0 -> 38183 bytes-rw-r--r--3rdparty/bgfx/examples/27-terrain/fs_terrain.sc13
-rw-r--r--3rdparty/bgfx/examples/27-terrain/makefile17
-rw-r--r--3rdparty/bgfx/examples/27-terrain/screenshot.pngbin0 -> 121187 bytes-rw-r--r--3rdparty/bgfx/examples/27-terrain/terrain.cpp527
-rw-r--r--3rdparty/bgfx/examples/27-terrain/varying.def.sc13
-rw-r--r--3rdparty/bgfx/examples/27-terrain/vs_terrain.sc17
-rw-r--r--3rdparty/bgfx/examples/27-terrain/vs_terrain_height_texture.sc20
-rw-r--r--3rdparty/bgfx/examples/assets/meshes/makefile3
-rw-r--r--3rdparty/bgfx/examples/assets/meshes/orb.obj161081
-rw-r--r--3rdparty/bgfx/examples/common/aviwriter.h18
-rw-r--r--3rdparty/bgfx/examples/common/bgfx_utils.cpp18
-rw-r--r--3rdparty/bgfx/examples/common/bgfx_utils.h4
-rw-r--r--3rdparty/bgfx/examples/common/bounds.cpp356
-rw-r--r--3rdparty/bgfx/examples/common/bounds.h67
-rw-r--r--3rdparty/bgfx/examples/common/camera.cpp10
-rw-r--r--3rdparty/bgfx/examples/common/camera.h2
-rw-r--r--3rdparty/bgfx/examples/common/common.h4
-rw-r--r--3rdparty/bgfx/examples/common/common.sh4
-rw-r--r--3rdparty/bgfx/examples/common/cube_atlas.cpp2
-rw-r--r--3rdparty/bgfx/examples/common/cube_atlas.h2
-rw-r--r--3rdparty/bgfx/examples/common/entry/cmd.cpp4
-rw-r--r--3rdparty/bgfx/examples/common/entry/cmd.h4
-rw-r--r--3rdparty/bgfx/examples/common/entry/dbg.cpp4
-rw-r--r--3rdparty/bgfx/examples/common/entry/dbg.h4
-rw-r--r--3rdparty/bgfx/examples/common/entry/entry.cpp64
-rw-r--r--3rdparty/bgfx/examples/common/entry/entry.h12
-rw-r--r--3rdparty/bgfx/examples/common/entry/entry_android.cpp4
-rw-r--r--3rdparty/bgfx/examples/common/entry/entry_asmjs.cpp4
-rw-r--r--3rdparty/bgfx/examples/common/entry/entry_glfw.cpp4
-rw-r--r--3rdparty/bgfx/examples/common/entry/entry_ios.mm4
-rw-r--r--3rdparty/bgfx/examples/common/entry/entry_nacl.cpp4
-rw-r--r--3rdparty/bgfx/examples/common/entry/entry_osx.mm7
-rw-r--r--3rdparty/bgfx/examples/common/entry/entry_p.h8
-rw-r--r--3rdparty/bgfx/examples/common/entry/entry_qnx.cpp4
-rw-r--r--3rdparty/bgfx/examples/common/entry/entry_sdl.cpp6
-rw-r--r--3rdparty/bgfx/examples/common/entry/entry_windows.cpp5
-rw-r--r--3rdparty/bgfx/examples/common/entry/entry_winrt.cpp4
-rw-r--r--3rdparty/bgfx/examples/common/entry/entry_x11.cpp8
-rw-r--r--3rdparty/bgfx/examples/common/entry/input.cpp4
-rw-r--r--3rdparty/bgfx/examples/common/entry/input.h4
-rw-r--r--3rdparty/bgfx/examples/common/font/font_manager.cpp2
-rw-r--r--3rdparty/bgfx/examples/common/font/font_manager.h2
-rw-r--r--3rdparty/bgfx/examples/common/font/fs_font_basic.bin.h47
-rw-r--r--3rdparty/bgfx/examples/common/font/fs_font_distance_field.bin.h84
-rw-r--r--3rdparty/bgfx/examples/common/font/fs_font_distance_field_subpixel.bin.h102
-rw-r--r--3rdparty/bgfx/examples/common/font/text_buffer_manager.cpp2
-rw-r--r--3rdparty/bgfx/examples/common/font/text_buffer_manager.h2
-rw-r--r--3rdparty/bgfx/examples/common/font/text_metrics.cpp2
-rw-r--r--3rdparty/bgfx/examples/common/font/text_metrics.h2
-rw-r--r--3rdparty/bgfx/examples/common/font/vs_font_basic.bin.h27
-rw-r--r--3rdparty/bgfx/examples/common/font/vs_font_distance_field.bin.h27
-rw-r--r--3rdparty/bgfx/examples/common/font/vs_font_distance_field_subpixel.bin.h27
-rw-r--r--3rdparty/bgfx/examples/common/imgui/fs_imgui_color.bin.h14
-rw-r--r--3rdparty/bgfx/examples/common/imgui/fs_imgui_color.sc4
-rw-r--r--3rdparty/bgfx/examples/common/imgui/fs_imgui_cubemap.bin.h26
-rw-r--r--3rdparty/bgfx/examples/common/imgui/fs_imgui_cubemap.sc4
-rw-r--r--3rdparty/bgfx/examples/common/imgui/fs_imgui_image.bin.h26
-rw-r--r--3rdparty/bgfx/examples/common/imgui/fs_imgui_image.sc2
-rw-r--r--3rdparty/bgfx/examples/common/imgui/fs_imgui_image_swizz.bin.h28
-rw-r--r--3rdparty/bgfx/examples/common/imgui/fs_imgui_image_swizz.sc2
-rw-r--r--3rdparty/bgfx/examples/common/imgui/fs_imgui_latlong.bin.h46
-rw-r--r--3rdparty/bgfx/examples/common/imgui/fs_imgui_latlong.sc2
-rw-r--r--3rdparty/bgfx/examples/common/imgui/fs_imgui_texture.bin.h22
-rw-r--r--3rdparty/bgfx/examples/common/imgui/fs_imgui_texture.sc4
-rw-r--r--3rdparty/bgfx/examples/common/imgui/fs_ocornut_imgui.bin.h17
-rw-r--r--3rdparty/bgfx/examples/common/imgui/imgui.cpp14
-rw-r--r--3rdparty/bgfx/examples/common/imgui/imgui.h6
-rw-r--r--3rdparty/bgfx/examples/common/imgui/ocornut_imgui.cpp133
-rw-r--r--3rdparty/bgfx/examples/common/imgui/ocornut_imgui.h2
-rw-r--r--3rdparty/bgfx/examples/common/imgui/scintilla.cpp4
-rw-r--r--3rdparty/bgfx/examples/common/imgui/scintilla.h2
-rw-r--r--3rdparty/bgfx/examples/common/imgui/vs_imgui_color.bin.h26
-rw-r--r--3rdparty/bgfx/examples/common/imgui/vs_imgui_color.sc4
-rw-r--r--3rdparty/bgfx/examples/common/imgui/vs_imgui_cubemap.bin.h25
-rw-r--r--3rdparty/bgfx/examples/common/imgui/vs_imgui_cubemap.sc4
-rw-r--r--3rdparty/bgfx/examples/common/imgui/vs_imgui_image.bin.h26
-rw-r--r--3rdparty/bgfx/examples/common/imgui/vs_imgui_image.sc2
-rw-r--r--3rdparty/bgfx/examples/common/imgui/vs_imgui_latlong.bin.h25
-rw-r--r--3rdparty/bgfx/examples/common/imgui/vs_imgui_latlong.sc2
-rw-r--r--3rdparty/bgfx/examples/common/imgui/vs_imgui_texture.bin.h30
-rw-r--r--3rdparty/bgfx/examples/common/imgui/vs_imgui_texture.sc4
-rw-r--r--3rdparty/bgfx/examples/common/imgui/vs_ocornut_imgui.bin.h33
-rw-r--r--3rdparty/bgfx/examples/common/nanovg/fontstash.h10
-rw-r--r--3rdparty/bgfx/examples/common/nanovg/fs_nanovg_fill.bin.h132
-rw-r--r--3rdparty/bgfx/examples/common/nanovg/nanovg.cpp20
-rw-r--r--3rdparty/bgfx/examples/common/nanovg/nanovg.h33
-rw-r--r--3rdparty/bgfx/examples/common/nanovg/nanovg_bgfx.cpp15
-rw-r--r--3rdparty/bgfx/examples/common/nanovg/vs_nanovg_fill.bin.h35
-rw-r--r--3rdparty/bgfx/examples/common/packrect.h4
-rw-r--r--3rdparty/bgfx/examples/common/shaderlib.sh4
-rw-r--r--3rdparty/bgfx/examples/makefile4
-rw-r--r--3rdparty/bgfx/examples/runtime/meshes/orb.binbin0 -> 1494272 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_particle.binbin603 -> 603 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_esm.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_esm.bin)bin3573 -> 3573 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_esm_csm.binbin0 -> 6510 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_esm_linear.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_esm_linear.bin)bin3545 -> 3545 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_esm_linear_csm.binbin0 -> 6398 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_esm_linear_omni.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_esm_linear_omni.bin)bin5203 -> 5203 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_esm_omni.binbin0 -> 5231 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_hard.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_hard.bin)bin3457 -> 3457 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_hard_csm.binbin0 -> 6046 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_hard_linear.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_vsm_linear.bin)bin3689 -> 3429 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_hard_linear_csm.binbin0 -> 5934 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_hard_linear_omni.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_hard_linear_omni.bin)bin5087 -> 5087 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_hard_omni.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_hard_omni.bin)bin5115 -> 5115 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_pcf.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_pcf.bin)bin11918 -> 11918 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_pcf_csm.binbin0 -> 39963 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_pcf_linear.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_pcf_linear.bin)bin10850 -> 10842 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_pcf_linear_csm.binbin0 -> 35579 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_pcf_linear_omni.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_pcf_linear_omni.bin)bin12436 -> 12436 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_pcf_omni.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_pcf_omni.bin)bin13524 -> 13524 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_vsm.binbin0 -> 3749 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_vsm_csm.binbin0 -> 7214 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_vsm_linear.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_vsm.bin)bin3717 -> 3721 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_vsm_linear_csm.binbin0 -> 7102 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_vsm_linear_omni.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_esm_omni.bin)bin5231 -> 5379 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_vsm_omni.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_vsm_linear_omni.bin)bin5347 -> 5407 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_esm_csm.binbin6534 -> 0 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_esm_linear_csm.binbin6422 -> 0 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_hard_csm.binbin6070 -> 0 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_hard_linear.binbin3429 -> 0 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_hard_linear_csm.binbin5958 -> 0 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_pcf_csm.binbin40071 -> 0 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_pcf_linear_csm.binbin35715 -> 0 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_vsm_csm.binbin7206 -> 0 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_vsm_linear_csm.binbin7094 -> 0 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_vsm_omni.binbin5375 -> 0 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowvolume_color_lighting.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowvolume_color_lightning.bin)bin2457 -> 2457 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowvolume_texture_lighting.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowvolume_texture_lightning.bin)bin2636 -> 2636 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_sms_mesh.binbin4815 -> 4815 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_sms_mesh_pd.binbin5631 -> 5631 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_stencil_color_lighting.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx11/fs_stencil_color_lightning.bin)bin2287 -> 2287 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_stencil_texture_lighting.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx11/fs_stencil_texture_lightning.bin)bin2480 -> 2480 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_terrain.binbin0 -> 348 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_color_lighting.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_color_lightning.bin)bin1197 -> 1197 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_color_lighting_csm.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_color_lightning_csm.bin)bin2146 -> 2146 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_color_lighting_linear.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_color_lightning_linear.bin)bin1237 -> 1237 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_color_lighting_linear_csm.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_color_lightning_linear_csm.bin)bin2306 -> 2306 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_color_lighting_linear_omni.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_color_lightning_linear_omni.bin)bin2217 -> 2217 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_color_lighting_omni.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_color_lightning_omni.bin)bin2057 -> 2057 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_texture_lighting.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_texture_lightning.bin)bin974 -> 974 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowvolume_color_lighting.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowvolume_color_lightning.bin)bin936 -> 936 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowvolume_texture_lighting.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowvolume_texture_lightning.bin)bin974 -> 974 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_stencil_color_lighting.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx11/vs_stencil_color_lightning.bin)bin906 -> 906 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_stencil_texture_lighting.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx11/vs_stencil_texture_lightning.bin)bin974 -> 974 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_terrain.binbin0 -> 574 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_terrain_height_texture.binbin0 -> 716 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_bump.binbin2278 -> 2274 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_callback.binbin557 -> 553 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_cubes.binbin141 -> 137 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_deferred_combine.binbin622 -> 618 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_deferred_debug.binbin222 -> 218 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_deferred_debug_line.binbin141 -> 137 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_deferred_geom.binbin700 -> 696 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_deferred_light.binbin1092 -> 1088 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_hdr_blur.binbin622 -> 618 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_hdr_bright.binbin1664 -> 1656 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_hdr_lum.binbin1473 -> 1469 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_hdr_lumavg.binbin1797 -> 1793 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_hdr_mesh.binbin1381 -> 1433 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_hdr_skybox.binbin529 -> 525 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_hdr_tonemap.binbin1677 -> 1673 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_ibl_mesh.binbin1661 -> 1661 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_ibl_skybox.binbin560 -> 556 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_instancing.binbin141 -> 137 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_mesh.binbin1206 -> 1278 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_oit.binbin187 -> 183 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_oit_wb.binbin463 -> 459 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_oit_wb_blit.binbin433 -> 429 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_oit_wb_separate.binbin435 -> 431 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_oit_wb_separate_blit.binbin433 -> 429 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_particle.binbin408 -> 404 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_raymarching.binbin47442 -> 47438 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_black.binbin153 -> 149 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_esm.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_esm.bin)bin2730 -> 2726 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_esm_csm.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_esm_csm.bin)bin4511 -> 4507 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_esm_linear.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_esm_linear.bin)bin2726 -> 2722 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_esm_linear_csm.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_esm_linear_csm.bin)bin4475 -> 4471 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_esm_linear_omni.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_esm_omni.bin)bin3780 -> 3772 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_esm_omni.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_esm_linear_omni.bin)bin3776 -> 3776 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_hard.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_hard.bin)bin2690 -> 2686 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_hard_csm.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_hard_csm.bin)bin4379 -> 4375 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_hard_linear.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_hard_linear.bin)bin2686 -> 2682 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_hard_linear_csm.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_hard_linear_csm.bin)bin4423 -> 4419 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_hard_linear_omni.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_hard_linear_omni.bin)bin3748 -> 3744 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_hard_omni.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_hard_omni.bin)bin3732 -> 3728 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_pcf.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_pcf.bin)bin7591 -> 7591 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_pcf_csm.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_pcf_csm.bin)bin24496 -> 24496 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_pcf_linear.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_pcf_linear.bin)bin7267 -> 7267 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_pcf_linear_csm.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_pcf_linear_csm.bin)bin22316 -> 22316 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_pcf_linear_omni.binbin0 -> 7961 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_pcf_omni.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_pcf_omni.bin)bin8669 -> 8665 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_vsm.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_vsm.bin)bin2810 -> 2806 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_vsm_csm.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_vsm_csm.bin)bin4895 -> 4891 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_vsm_linear.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_vsm_linear.bin)bin2794 -> 2790 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_vsm_linear_csm.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_vsm_linear_csm.bin)bin4831 -> 4827 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_vsm_linear_omni.binbin0 -> 3872 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_vsm_omni.binbin0 -> 3888 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_pcf_linear_omni.binbin7965 -> 0 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_vsm_linear_omni.binbin3876 -> 0 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_vsm_omni.binbin3892 -> 0 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_texture.binbin576 -> 572 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_hblur.binbin964 -> 960 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_hblur_vsm.binbin1156 -> 1152 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_packdepth.binbin273 -> 269 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_packdepth_linear.binbin225 -> 221 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_packdepth_vsm.binbin337 -> 333 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_packdepth_vsm_linear.binbin265 -> 261 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_texture.binbin222 -> 218 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_unpackdepth.binbin384 -> 380 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_unpackdepth_vsm.binbin388 -> 384 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_vblur.binbin964 -> 960 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_vblur_vsm.binbin1156 -> 1152 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_color_lighting.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_color_lightning.bin)bin1914 -> 1910 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_color_texture.binbin576 -> 572 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svbackblank.binbin153 -> 149 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svbackcolor.binbin231 -> 227 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svbacktex1.binbin205 -> 201 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svbacktex2.binbin205 -> 201 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svfrontblank.binbin153 -> 149 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svfrontcolor.binbin231 -> 227 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svfronttex1.binbin205 -> 201 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svfronttex2.binbin205 -> 201 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svside.binbin281 -> 277 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svsideblank.binbin153 -> 149 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svsidecolor.binbin231 -> 227 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svsidetex.binbin378 -> 374 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_texture.binbin222 -> 218 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_texture_lighting.binbin0 -> 2061 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_texture_lightning.binbin2065 -> 0 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_sms_mesh.binbin2468 -> 2464 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_sms_mesh_pd.binbin3304 -> 3300 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_sms_shadow.binbin153 -> 149 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_sms_shadow_pd.binbin273 -> 269 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_stencil_color_black.binbin153 -> 149 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_stencil_color_lighting.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx9/fs_stencil_color_lightning.bin)bin1980 -> 1976 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_stencil_color_texture.binbin576 -> 572 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_stencil_texture.binbin222 -> 218 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_stencil_texture_lighting.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx9/fs_stencil_texture_lightning.bin)bin2173 -> 2169 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_terrain.binbin0 -> 201 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_tree.binbin1022 -> 1018 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_update.binbin221 -> 217 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_update_3d.binbin431 -> 427 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_update_cmp.binbin266 -> 262 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_vectordisplay_blit.binbin329 -> 325 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_vectordisplay_blur.binbin817 -> 813 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_vectordisplay_fb.binbin341 -> 337 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_bump.binbin1093 -> 1089 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_bump_instanced.binbin1087 -> 1083 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_callback.binbin465 -> 461 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_cubes.binbin323 -> 319 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_deferred_combine.binbin323 -> 319 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_deferred_debug.binbin323 -> 319 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_deferred_debug_line.binbin323 -> 319 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_deferred_geom.binbin1093 -> 1089 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_deferred_light.binbin323 -> 319 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_hdr_blur.binbin669 -> 665 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_hdr_bright.binbin323 -> 319 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_hdr_lum.binbin323 -> 319 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_hdr_lumavg.binbin323 -> 319 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_hdr_mesh.binbin581 -> 577 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_hdr_skybox.binbin323 -> 319 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_hdr_tonemap.binbin657 -> 653 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_ibl_mesh.binbin676 -> 672 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_ibl_skybox.binbin447 -> 443 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_instancing.binbin478 -> 474 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_mesh.binbin986 -> 982 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_oit.binbin557 -> 553 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_oit_blit.binbin323 -> 319 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_particle.binbin686 -> 682 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_raymarching.binbin359 -> 355 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color.binbin287 -> 283 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color_lighting.binbin0 -> 802 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color_lighting_csm.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color_lightning_csm.bin)bin1455 -> 1451 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color_lighting_linear.binbin0 -> 818 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color_lighting_linear_csm.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color_lightning_linear_csm.bin)bin1519 -> 1515 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color_lighting_linear_omni.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color_lightning_linear_omni.bin)bin1466 -> 1462 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color_lighting_omni.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color_lightning_omni.bin)bin1402 -> 1398 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color_lightning.binbin806 -> 0 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color_lightning_linear.binbin822 -> 0 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color_texture.binbin323 -> 319 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_depth.binbin287 -> 283 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_hblur.binbin758 -> 754 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_packdepth.binbin323 -> 319 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_packdepth_linear.binbin355 -> 351 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_texture.binbin323 -> 319 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_texture_lighting.binbin0 -> 577 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_texture_lightning.binbin581 -> 0 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_unpackdepth.binbin323 -> 319 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_vblur.binbin758 -> 754 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowvolume_color_lighting.binbin0 -> 541 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowvolume_color_lightning.binbin545 -> 0 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowvolume_color_texture.binbin323 -> 319 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowvolume_svback.binbin441 -> 437 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowvolume_svfront.binbin287 -> 283 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowvolume_svside.binbin549 -> 545 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowvolume_texture.binbin323 -> 319 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowvolume_texture_lighting.binbin0 -> 577 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowvolume_texture_lightning.binbin581 -> 0 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_sms_mesh.binbin742 -> 738 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_sms_shadow.binbin287 -> 283 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_sms_shadow_pd.binbin323 -> 319 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_stencil_color.binbin287 -> 283 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_stencil_color_lighting.binbin0 -> 541 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_stencil_color_lightning.binbin545 -> 0 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_stencil_color_texture.binbin323 -> 319 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_stencil_texture.binbin323 -> 319 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_stencil_texture_lighting.binbin0 -> 577 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_stencil_texture_lightning.binbin581 -> 0 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_terrain.binbin0 -> 347 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_terrain_height_texture.binbin0 -> 517 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_tree.binbin633 -> 629 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_update.binbin323 -> 319 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_vectordisplay_fb.binbin359 -> 355 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/gles/fs_oit_wb.binbin371 -> 373 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/gles/fs_oit_wb_separate.binbin318 -> 320 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_esm.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_esm.bin)bin4207 -> 4213 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_esm_csm.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_esm_csm.bin)bin10204 -> 10222 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_esm_linear.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_esm_linear.bin)bin4251 -> 4257 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_esm_linear_csm.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_esm_linear_csm.bin)bin10424 -> 10442 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_esm_linear_omni.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_esm_linear_omni.bin)bin7581 -> 7587 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_esm_omni.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_esm_omni.bin)bin7535 -> 7541 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_hard.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_hard.bin)bin4079 -> 4085 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_hard_csm.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_hard_csm.bin)bin9660 -> 9678 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_hard_linear.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_hard_linear.bin)bin4111 -> 4117 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_hard_linear_csm.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_hard_linear_csm.bin)bin9796 -> 9814 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_hard_linear_omni.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_hard_linear_omni.bin)bin7442 -> 7448 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_hard_omni.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_hard_omni.bin)bin7408 -> 7414 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_pcf.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_pcf.bin)bin15670 -> 15736 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_pcf_csm.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_pcf_csm.bin)bin63214 -> 63472 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_pcf_linear.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_pcf_linear.bin)bin15721 -> 15787 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_pcf_linear_csm.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_pcf_linear_csm.bin)bin63660 -> 63918 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_pcf_linear_omni.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_pcf_linear_omni.bin)bin19262 -> 19328 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_pcf_omni.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_pcf_omni.bin)bin19207 -> 19273 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_vsm.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_vsm.bin)bin4633 -> 4635 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_vsm_csm.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_vsm_csm.bin)bin12150 -> 12152 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_vsm_linear.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_vsm_linear.bin)bin4677 -> 4679 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_vsm_linear_csm.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_vsm_linear_csm.bin)bin12370 -> 12372 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_vsm_linear_omni.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_vsm_linear_omni.bin)bin8009 -> 8011 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_vsm_omni.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_vsm_omni.bin)bin7963 -> 7965 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_hblur.binbin1708 -> 1746 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_packdepth.binbin300 -> 302 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_packdepth_linear.binbin252 -> 254 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_unpackdepth.binbin417 -> 421 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_vblur.binbin1708 -> 1746 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowvolume_color_lighting.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowvolume_color_lightning.bin)bin2327 -> 2327 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowvolume_texture_lighting.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowvolume_texture_lightning.bin)bin2558 -> 2558 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/gles/fs_sms_mesh_pd.binbin8588 -> 8652 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/gles/fs_sms_shadow_pd.binbin300 -> 302 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/gles/fs_stencil_color_lighting.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/gles/fs_stencil_color_lightning.bin)bin2164 -> 2164 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/gles/fs_stencil_texture_lighting.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/gles/fs_stencil_texture_lightning.bin)bin2486 -> 2486 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/gles/fs_terrain.binbin0 -> 235 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/gles/vs_shadowmaps_color_lighting.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/gles/vs_shadowmaps_color_lightning.bin)bin958 -> 958 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/gles/vs_shadowmaps_color_lighting_csm.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/gles/vs_shadowmaps_color_lightning_csm.bin)bin1578 -> 1578 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/gles/vs_shadowmaps_color_lighting_linear.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/gles/vs_shadowmaps_color_lightning_linear.bin)bin1003 -> 1003 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/gles/vs_shadowmaps_color_lighting_linear_csm.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/gles/vs_shadowmaps_color_lightning_linear_csm.bin)bin1742 -> 1742 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/gles/vs_shadowmaps_color_lighting_linear_omni.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/gles/vs_shadowmaps_color_lightning_linear_omni.bin)bin1668 -> 1668 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/gles/vs_shadowmaps_color_lighting_omni.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/gles/vs_shadowmaps_color_lightning_omni.bin)bin1504 -> 1504 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/gles/vs_shadowmaps_texture_lighting.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/gles/vs_shadowmaps_texture_lightning.bin)bin720 -> 720 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/gles/vs_shadowvolume_color_lighting.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/gles/vs_shadowvolume_color_lightning.bin)bin625 -> 625 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/gles/vs_shadowvolume_texture_lighting.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/gles/vs_shadowvolume_texture_lightning.bin)bin720 -> 720 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/gles/vs_stencil_color_lighting.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/gles/vs_stencil_color_lightning.bin)bin625 -> 625 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/gles/vs_stencil_texture_lighting.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/gles/vs_stencil_texture_lightning.bin)bin720 -> 720 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/gles/vs_terrain.binbin0 -> 395 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/gles/vs_terrain_height_texture.binbin0 -> 538 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_oit_wb.binbin353 -> 355 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_oit_wb_separate.binbin300 -> 302 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning.bin)bin2325 -> 2325 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_esm.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_esm.bin)bin3970 -> 3976 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_esm_csm.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_esm_csm.bin)bin9822 -> 9840 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_esm_linear.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_esm_linear.bin)bin4014 -> 4020 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_esm_linear_csm.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_esm_linear_csm.bin)bin10042 -> 10060 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_esm_linear_omni.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_esm_linear_omni.bin)bin7225 -> 7231 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_esm_omni.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_esm_omni.bin)bin7179 -> 7185 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_hard.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_hard.bin)bin3848 -> 3854 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_hard_csm.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_hard_csm.bin)bin9302 -> 9320 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_hard_linear.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_hard_linear.bin)bin3880 -> 3886 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_hard_linear_csm.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_hard_linear_csm.bin)bin9438 -> 9456 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_hard_linear_omni.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_hard_linear_omni.bin)bin7092 -> 7098 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_hard_omni.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_hard_omni.bin)bin7058 -> 7064 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_omni.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_omni.bin)bin3992 -> 3992 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_pcf.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_pcf.bin)bin15057 -> 15123 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_pcf_csm.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_pcf_csm.bin)bin61375 -> 61633 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_pcf_linear.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_pcf_linear.bin)bin15102 -> 15168 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_pcf_linear_csm.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_pcf_linear_csm.bin)bin61797 -> 62055 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_pcf_linear_omni.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_pcf_linear_omni.bin)bin18518 -> 18584 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_pcf_omni.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_pcf_omni.bin)bin18469 -> 18535 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_pfc.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_pfc.bin)bin3535 -> 3535 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_vsm.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_vsm.bin)bin4371 -> 4373 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_vsm_csm.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_vsm_csm.bin)bin11668 -> 11670 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_vsm_linear.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_vsm_linear.bin)bin4415 -> 4417 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_vsm_linear_csm.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_vsm_linear_csm.bin)bin11888 -> 11890 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_vsm_linear_omni.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_vsm_linear_omni.bin)bin7628 -> 7630 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_vsm_omni.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_vsm_omni.bin)bin7582 -> 7584 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_hblur.binbin1581 -> 1619 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_packdepth.binbin288 -> 290 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_packdepth_linear.binbin240 -> 242 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_unpackdepth.binbin352 -> 356 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_vblur.binbin1581 -> 1619 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowvolume_color_lighting.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowvolume_color_lightning.bin)bin2098 -> 2098 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowvolume_texture_lighting.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowvolume_texture_lightning.bin)bin2320 -> 2320 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_sms_mesh_pd.binbin8222 -> 8286 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_sms_shadow_pd.binbin288 -> 290 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_stencil_color_lighting.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/glsl/fs_stencil_color_lightning.bin)bin2050 -> 2050 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_stencil_texture_lighting.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/glsl/fs_stencil_texture_lightning.bin)bin2308 -> 2308 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_terrain.binbin0 -> 215 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_color_lighting.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_color_lightning.bin)bin874 -> 874 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_color_lighting_csm.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_color_lightning_csm.bin)bin1446 -> 1446 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_color_lighting_linear.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_color_lightning_linear.bin)bin919 -> 919 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_color_lighting_linear_csm.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_color_lightning_linear_csm.bin)bin1610 -> 1610 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_color_lighting_linear_omni.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_color_lightning_linear_omni.bin)bin1536 -> 1536 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_color_lighting_omni.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_color_lightning_omni.bin)bin1372 -> 1372 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_texture_lighting.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_texture_lightning.bin)bin654 -> 654 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowvolume_color_lighting.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowvolume_color_lightning.bin)bin571 -> 571 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowvolume_texture_lighting.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowvolume_texture_lightning.bin)bin654 -> 654 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_stencil_color_lighting.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/glsl/vs_stencil_color_lightning.bin)bin571 -> 571 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_stencil_texture_lighting.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/glsl/vs_stencil_texture_lightning.bin)bin654 -> 654 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_terrain.binbin0 -> 359 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_terrain_height_texture.binbin0 -> 501 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_esm.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_esm.bin)bin4597 -> 4597 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_esm_csm.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_esm_csm.bin)bin11097 -> 11097 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_esm_linear.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_esm_linear.bin)bin4641 -> 4641 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_esm_linear_csm.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_esm_linear_csm.bin)bin11317 -> 11317 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_esm_linear_omni.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_esm_linear_omni.bin)bin7861 -> 7861 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_esm_omni.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_esm_omni.bin)bin7815 -> 7815 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_hard.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_hard.bin)bin4425 -> 4425 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_hard_csm.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_hard_csm.bin)bin10377 -> 10377 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_hard_linear.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_hard_linear.bin)bin4457 -> 4457 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_hard_linear_csm.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_hard_linear_csm.bin)bin10513 -> 10513 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_hard_linear_omni.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_hard_linear_omni.bin)bin7678 -> 7678 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_hard_omni.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_hard_omni.bin)bin7644 -> 7644 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_pcf.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_pcf.bin)bin16606 -> 16606 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_pcf_csm.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_pcf_csm.bin)bin66411 -> 66411 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_pcf_linear.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_pcf_linear.bin)bin16555 -> 16555 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_pcf_linear_csm.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_pcf_linear_csm.bin)bin66449 -> 66449 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_pcf_linear_omni.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_pcf_linear_omni.bin)bin19991 -> 19991 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_pcf_omni.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_pcf_omni.bin)bin19940 -> 19940 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_vsm.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_vsm.bin)bin5037 -> 5037 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_vsm_csm.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_vsm_csm.bin)bin13099 -> 13099 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_vsm_linear.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_vsm_linear.bin)bin5081 -> 5081 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_vsm_linear_csm.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_vsm_linear_csm.bin)bin13319 -> 13319 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_vsm_linear_omni.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_vsm_linear_omni.bin)bin8303 -> 8303 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_vsm_omni.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_vsm_omni.bin)bin8257 -> 8257 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowvolume_color_lighting.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowvolume_color_lightning.bin)bin2666 -> 2666 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowvolume_texture_lighting.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowvolume_texture_lightning.bin)bin3054 -> 3054 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_stencil_color_lighting.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/metal/fs_stencil_color_lightning.bin)bin2345 -> 2345 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_stencil_texture_lighting.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/metal/fs_stencil_texture_lightning.bin)bin2745 -> 2745 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_color_lighting.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_color_lightning.bin)bin1223 -> 1223 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_color_lighting_csm.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_color_lightning_csm.bin)bin1751 -> 1751 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_color_lighting_linear.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_color_lightning_linear.bin)bin1282 -> 1282 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_color_lighting_linear_csm.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_color_lightning_linear_csm.bin)bin1971 -> 1971 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_color_lighting_linear_omni.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_color_lightning_linear_omni.bin)bin1913 -> 1913 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_color_lighting_omni.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_color_lightning_omni.bin)bin1693 -> 1693 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_texture_lighting.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_texture_lightning.bin)bin1035 -> 1035 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowvolume_color_lighting.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowvolume_color_lightning.bin)bin931 -> 931 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowvolume_texture_lighting.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowvolume_texture_lightning.bin)bin1035 -> 1035 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_stencil_color_lighting.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/metal/vs_stencil_color_lightning.bin)bin931 -> 931 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_stencil_texture_lighting.bin (renamed from 3rdparty/bgfx/examples/runtime/shaders/metal/vs_stencil_texture_lightning.bin)bin1035 -> 1035 bytes-rw-r--r--3rdparty/bgfx/include/bgfx/bgfx.h116
-rw-r--r--3rdparty/bgfx/include/bgfx/bgfxdefines.h26
-rw-r--r--3rdparty/bgfx/include/bgfx/bgfxplatform.h10
-rw-r--r--3rdparty/bgfx/include/bgfx/c99/bgfx.h246
-rw-r--r--3rdparty/bgfx/include/bgfx/c99/bgfxplatform.h2
-rw-r--r--3rdparty/bgfx/makefile6
-rw-r--r--3rdparty/bgfx/scripts/bgfx.lua6
-rw-r--r--3rdparty/bgfx/scripts/bgfx.pc11
-rw-r--r--3rdparty/bgfx/scripts/example-common.lua4
-rw-r--r--3rdparty/bgfx/scripts/genie.lua29
-rw-r--r--3rdparty/bgfx/scripts/geometryc.lua4
-rw-r--r--3rdparty/bgfx/scripts/makedisttex.lua4
-rw-r--r--3rdparty/bgfx/scripts/shaderc.lua4
-rw-r--r--3rdparty/bgfx/scripts/texturec.lua16
-rw-r--r--3rdparty/bgfx/scripts/tools.mk1
-rw-r--r--3rdparty/bgfx/src/amalgamated.cpp4
-rw-r--r--3rdparty/bgfx/src/amalgamated.mm4
-rw-r--r--3rdparty/bgfx/src/bgfx.cpp508
-rw-r--r--3rdparty/bgfx/src/bgfx_compute.sh4
-rw-r--r--3rdparty/bgfx/src/bgfx_p.h266
-rw-r--r--3rdparty/bgfx/src/bgfx_shader.sh4
-rw-r--r--3rdparty/bgfx/src/charset.h4
-rw-r--r--3rdparty/bgfx/src/config.h45
-rw-r--r--3rdparty/bgfx/src/fs_clear0.sc4
-rw-r--r--3rdparty/bgfx/src/fs_clear1.sc4
-rw-r--r--3rdparty/bgfx/src/fs_clear2.sc4
-rw-r--r--3rdparty/bgfx/src/fs_clear3.sc4
-rw-r--r--3rdparty/bgfx/src/fs_clear4.sc4
-rw-r--r--3rdparty/bgfx/src/fs_clear5.sc4
-rw-r--r--3rdparty/bgfx/src/fs_clear6.sc4
-rw-r--r--3rdparty/bgfx/src/fs_clear7.sc4
-rw-r--r--3rdparty/bgfx/src/fs_debugfont.sc4
-rw-r--r--3rdparty/bgfx/src/glcontext_eagl.h4
-rw-r--r--3rdparty/bgfx/src/glcontext_eagl.mm4
-rw-r--r--3rdparty/bgfx/src/glcontext_egl.cpp23
-rw-r--r--3rdparty/bgfx/src/glcontext_egl.h4
-rw-r--r--3rdparty/bgfx/src/glcontext_glx.cpp8
-rw-r--r--3rdparty/bgfx/src/glcontext_glx.h4
-rw-r--r--3rdparty/bgfx/src/glcontext_nsgl.h4
-rw-r--r--3rdparty/bgfx/src/glcontext_nsgl.mm16
-rw-r--r--3rdparty/bgfx/src/glcontext_ppapi.cpp60
-rw-r--r--3rdparty/bgfx/src/glcontext_ppapi.h4
-rw-r--r--3rdparty/bgfx/src/glcontext_wgl.cpp4
-rw-r--r--3rdparty/bgfx/src/glcontext_wgl.h4
-rw-r--r--3rdparty/bgfx/src/glimports.h6
-rw-r--r--3rdparty/bgfx/src/image.cpp608
-rw-r--r--3rdparty/bgfx/src/image.h57
-rw-r--r--3rdparty/bgfx/src/ovr.cpp4
-rw-r--r--3rdparty/bgfx/src/ovr.h4
-rw-r--r--3rdparty/bgfx/src/renderdoc.cpp4
-rw-r--r--3rdparty/bgfx/src/renderdoc.h4
-rw-r--r--3rdparty/bgfx/src/renderer.h4
-rw-r--r--3rdparty/bgfx/src/renderer_d3d.h9
-rw-r--r--3rdparty/bgfx/src/renderer_d3d11.cpp330
-rw-r--r--3rdparty/bgfx/src/renderer_d3d11.h31
-rw-r--r--3rdparty/bgfx/src/renderer_d3d12.cpp264
-rw-r--r--3rdparty/bgfx/src/renderer_d3d12.h47
-rw-r--r--3rdparty/bgfx/src/renderer_d3d9.cpp226
-rw-r--r--3rdparty/bgfx/src/renderer_d3d9.h32
-rw-r--r--3rdparty/bgfx/src/renderer_gl.cpp283
-rw-r--r--3rdparty/bgfx/src/renderer_gl.h138
-rw-r--r--3rdparty/bgfx/src/renderer_mtl.h38
-rw-r--r--3rdparty/bgfx/src/renderer_mtl.mm1723
-rw-r--r--3rdparty/bgfx/src/renderer_null.cpp4
-rw-r--r--3rdparty/bgfx/src/renderer_vk.cpp4
-rw-r--r--3rdparty/bgfx/src/shader_dx9bc.cpp4
-rw-r--r--3rdparty/bgfx/src/shader_dx9bc.h4
-rw-r--r--3rdparty/bgfx/src/shader_dxbc.cpp4
-rw-r--r--3rdparty/bgfx/src/shader_dxbc.h4
-rw-r--r--3rdparty/bgfx/src/shader_spirv.cpp4
-rw-r--r--3rdparty/bgfx/src/shader_spirv.h4
-rw-r--r--3rdparty/bgfx/src/vertexdecl.cpp4
-rw-r--r--3rdparty/bgfx/src/vertexdecl.h4
-rw-r--r--3rdparty/bgfx/src/vs_clear.sc4
-rw-r--r--3rdparty/bgfx/src/vs_debugfont.sc4
-rw-r--r--3rdparty/bgfx/tools/geometryc/geometryc.cpp10
-rw-r--r--3rdparty/bgfx/tools/makedisttex.cpp4
-rw-r--r--3rdparty/bgfx/tools/shaderc/shaderc.cpp35
-rw-r--r--3rdparty/bgfx/tools/shaderc/shaderc.h6
-rw-r--r--3rdparty/bgfx/tools/shaderc/shaderc_glsl.cpp22
-rw-r--r--3rdparty/bgfx/tools/shaderc/shaderc_hlsl.cpp4
-rw-r--r--3rdparty/bgfx/tools/texturec/texturec.cpp370
-rw-r--r--3rdparty/bx/LICENSE4
-rw-r--r--3rdparty/bx/README.md2
-rw-r--r--3rdparty/bx/include/bx/allocator.h74
-rw-r--r--3rdparty/bx/include/bx/bx.h4
-rw-r--r--3rdparty/bx/include/bx/cl.h4
-rw-r--r--3rdparty/bx/include/bx/commandline.h4
-rw-r--r--3rdparty/bx/include/bx/config.h6
-rw-r--r--3rdparty/bx/include/bx/cpu.h7
-rw-r--r--3rdparty/bx/include/bx/debug.h4
-rw-r--r--3rdparty/bx/include/bx/endian.h4
-rw-r--r--3rdparty/bx/include/bx/float4_langext.h4
-rw-r--r--3rdparty/bx/include/bx/float4_neon.h4
-rw-r--r--3rdparty/bx/include/bx/float4_ni.h4
-rw-r--r--3rdparty/bx/include/bx/float4_ref.h4
-rw-r--r--3rdparty/bx/include/bx/float4_sse.h4
-rw-r--r--3rdparty/bx/include/bx/float4_t.h4
-rw-r--r--3rdparty/bx/include/bx/float4x4_t.h4
-rw-r--r--3rdparty/bx/include/bx/foreach.h4
-rw-r--r--3rdparty/bx/include/bx/fpumath.h270
-rw-r--r--3rdparty/bx/include/bx/handlealloc.h4
-rw-r--r--3rdparty/bx/include/bx/hash.h4
-rw-r--r--3rdparty/bx/include/bx/macros.h4
-rw-r--r--3rdparty/bx/include/bx/maputil.h4
-rw-r--r--3rdparty/bx/include/bx/mpscqueue.h6
-rw-r--r--3rdparty/bx/include/bx/mutex.h4
-rw-r--r--3rdparty/bx/include/bx/os.h12
-rw-r--r--3rdparty/bx/include/bx/platform.h31
-rw-r--r--3rdparty/bx/include/bx/process.h4
-rw-r--r--3rdparty/bx/include/bx/radixsort.h4
-rw-r--r--3rdparty/bx/include/bx/readerwriter.h10
-rw-r--r--3rdparty/bx/include/bx/ringbuffer.h4
-rw-r--r--3rdparty/bx/include/bx/rng.h4
-rw-r--r--3rdparty/bx/include/bx/sem.h31
-rw-r--r--3rdparty/bx/include/bx/spscqueue.h4
-rw-r--r--3rdparty/bx/include/bx/string.h4
-rw-r--r--3rdparty/bx/include/bx/thread.h10
-rw-r--r--3rdparty/bx/include/bx/timer.h4
-rw-r--r--3rdparty/bx/include/bx/tokenizecmd.h4
-rw-r--r--3rdparty/bx/include/bx/uint32_t.h4
-rw-r--r--3rdparty/bx/scripts/bin2c.lua4
-rw-r--r--3rdparty/bx/scripts/bx.lua4
-rw-r--r--3rdparty/bx/scripts/genie.lua4
-rw-r--r--3rdparty/bx/scripts/toolchain.lua2
-rw-r--r--3rdparty/bx/scripts/unittest++.lua4
-rw-r--r--3rdparty/bx/tests/dbg.cpp4
-rw-r--r--3rdparty/bx/tests/dbg.h4
-rw-r--r--3rdparty/bx/tests/float4_t.cpp4
-rw-r--r--3rdparty/bx/tests/fpumath.cpp4
-rw-r--r--3rdparty/bx/tests/handle.cpp4
-rw-r--r--3rdparty/bx/tests/macros.cpp4
-rw-r--r--3rdparty/bx/tests/main.cpp4
-rw-r--r--3rdparty/bx/tests/test.h4
-rw-r--r--3rdparty/bx/tests/thread.cpp4
-rw-r--r--3rdparty/bx/tests/tokenizecmd.cpp4
-rw-r--r--3rdparty/bx/tests/uint32_t.cpp4
-rw-r--r--3rdparty/bx/tools/bin/darwin/geniebin418080 -> 422176 bytes-rw-r--r--3rdparty/bx/tools/bin/linux/geniebin392624 -> 396856 bytes-rw-r--r--3rdparty/bx/tools/bin/windows/genie.exebin396288 -> 399872 bytes-rw-r--r--3rdparty/bx/tools/bin2c/bin2c.cpp8
-rw-r--r--3rdparty/genie/LICENSE6
-rw-r--r--3rdparty/genie/README.md18
-rw-r--r--3rdparty/genie/build/gmake.darwin/genie.make226
-rw-r--r--3rdparty/genie/build/gmake.linux/genie.make220
-rw-r--r--3rdparty/genie/build/gmake.windows/genie.make220
-rw-r--r--3rdparty/genie/src/_manifest.lua3
-rw-r--r--3rdparty/genie/src/actions/make/_make.lua2
-rw-r--r--3rdparty/genie/src/actions/make/make_cpp.lua67
-rw-r--r--3rdparty/genie/src/actions/vstudio/_vstudio.lua2
-rw-r--r--3rdparty/genie/src/actions/vstudio/vs2010_vcxproj.lua4
-rw-r--r--3rdparty/genie/src/actions/vstudio/vs2012.lua1
-rw-r--r--3rdparty/genie/src/actions/vstudio/vs2013.lua1
-rw-r--r--3rdparty/genie/src/actions/vstudio/vs2015.lua3
-rw-r--r--3rdparty/genie/src/base/api.lua6
-rw-r--r--3rdparty/genie/src/base/cmdline.lua4
-rw-r--r--3rdparty/genie/src/base/globals.lua6
-rw-r--r--3rdparty/genie/src/host/scripts.c120
-rw-r--r--3rdparty/genie/src/tools/gcc.lua58
-rw-r--r--3rdparty/genie/src/tools/ghs.lua191
-rw-r--r--3rdparty/jsoncpp/.clang-format47
-rw-r--r--3rdparty/jsoncpp/.gitignore36
-rw-r--r--3rdparty/jsoncpp/.travis.yml25
-rw-r--r--3rdparty/jsoncpp/AUTHORS1
-rw-r--r--3rdparty/jsoncpp/CMakeLists.txt129
-rw-r--r--3rdparty/jsoncpp/LICENSE55
-rw-r--r--3rdparty/jsoncpp/NEWS.txt175
-rw-r--r--3rdparty/jsoncpp/README.md214
-rw-r--r--3rdparty/jsoncpp/SConstruct248
-rw-r--r--3rdparty/jsoncpp/amalgamate.py154
-rw-r--r--3rdparty/jsoncpp/appveyor.yml34
-rw-r--r--3rdparty/jsoncpp/dev.makefile35
-rw-r--r--3rdparty/jsoncpp/devtools/__init__.py6
-rw-r--r--3rdparty/jsoncpp/devtools/agent_vmw7.json33
-rw-r--r--3rdparty/jsoncpp/devtools/agent_vmxp.json26
-rw-r--r--3rdparty/jsoncpp/devtools/antglob.py205
-rw-r--r--3rdparty/jsoncpp/devtools/batchbuild.py278
-rw-r--r--3rdparty/jsoncpp/devtools/fixeol.py69
-rw-r--r--3rdparty/jsoncpp/devtools/licenseupdater.py94
-rw-r--r--3rdparty/jsoncpp/devtools/tarball.py52
-rw-r--r--3rdparty/jsoncpp/doc/doxyfile.in2301
-rw-r--r--3rdparty/jsoncpp/doc/footer.html3
-rw-r--r--3rdparty/jsoncpp/doc/header.html24
-rw-r--r--3rdparty/jsoncpp/doc/jsoncpp.dox164
-rw-r--r--3rdparty/jsoncpp/doc/readme.txt1
-rw-r--r--3rdparty/jsoncpp/doc/roadmap.dox3
-rw-r--r--3rdparty/jsoncpp/doc/web_doxyfile.in2301
-rw-r--r--3rdparty/jsoncpp/doxybuild.py189
-rw-r--r--3rdparty/jsoncpp/include/CMakeLists.txt2
-rw-r--r--3rdparty/jsoncpp/include/json/assertions.h54
-rw-r--r--3rdparty/jsoncpp/include/json/autolink.h25
-rw-r--r--3rdparty/jsoncpp/include/json/config.h109
-rw-r--r--3rdparty/jsoncpp/include/json/features.h57
-rw-r--r--3rdparty/jsoncpp/include/json/forwards.h37
-rw-r--r--3rdparty/jsoncpp/include/json/json.h15
-rw-r--r--3rdparty/jsoncpp/include/json/reader.h401
-rw-r--r--3rdparty/jsoncpp/include/json/value.h826
-rw-r--r--3rdparty/jsoncpp/include/json/version.h14
-rw-r--r--3rdparty/jsoncpp/include/json/writer.h327
-rw-r--r--3rdparty/jsoncpp/makefiles/msvc2010/jsoncpp.sln42
-rw-r--r--3rdparty/jsoncpp/makefiles/msvc2010/jsontest.vcxproj96
-rw-r--r--3rdparty/jsoncpp/makefiles/msvc2010/jsontest.vcxproj.filters13
-rw-r--r--3rdparty/jsoncpp/makefiles/msvc2010/lib_json.vcxproj143
-rw-r--r--3rdparty/jsoncpp/makefiles/msvc2010/lib_json.vcxproj.filters33
-rw-r--r--3rdparty/jsoncpp/makefiles/msvc2010/test_lib_json.vcxproj109
-rw-r--r--3rdparty/jsoncpp/makefiles/msvc2010/test_lib_json.vcxproj.filters24
-rw-r--r--3rdparty/jsoncpp/makefiles/vs71/jsoncpp.sln46
-rw-r--r--3rdparty/jsoncpp/makefiles/vs71/jsontest.vcproj119
-rw-r--r--3rdparty/jsoncpp/makefiles/vs71/lib_json.vcproj205
-rw-r--r--3rdparty/jsoncpp/makefiles/vs71/test_lib_json.vcproj130
-rw-r--r--3rdparty/jsoncpp/makerelease.py390
-rw-r--r--3rdparty/jsoncpp/pkg-config/jsoncpp.pc.in11
-rw-r--r--3rdparty/jsoncpp/scons-tools/globtool.py58
-rw-r--r--3rdparty/jsoncpp/scons-tools/srcdist.py183
-rw-r--r--3rdparty/jsoncpp/scons-tools/substinfile.py85
-rw-r--r--3rdparty/jsoncpp/scons-tools/targz.py87
-rw-r--r--3rdparty/jsoncpp/src/CMakeLists.txt5
-rw-r--r--3rdparty/jsoncpp/src/jsontestrunner/CMakeLists.txt25
-rw-r--r--3rdparty/jsoncpp/src/jsontestrunner/main.cpp325
-rw-r--r--3rdparty/jsoncpp/src/jsontestrunner/sconscript9
-rw-r--r--3rdparty/jsoncpp/src/lib_json/CMakeLists.txt80
-rw-r--r--3rdparty/jsoncpp/src/lib_json/json_reader.cpp1977
-rw-r--r--3rdparty/jsoncpp/src/lib_json/json_tool.h87
-rw-r--r--3rdparty/jsoncpp/src/lib_json/json_value.cpp1544
-rw-r--r--3rdparty/jsoncpp/src/lib_json/json_valueiterator.inl162
-rw-r--r--3rdparty/jsoncpp/src/lib_json/json_writer.cpp1179
-rw-r--r--3rdparty/jsoncpp/src/lib_json/sconscript8
-rw-r--r--3rdparty/jsoncpp/src/lib_json/version.h.in14
-rw-r--r--3rdparty/jsoncpp/src/test_lib_json/CMakeLists.txt38
-rw-r--r--3rdparty/jsoncpp/src/test_lib_json/jsontest.cpp443
-rw-r--r--3rdparty/jsoncpp/src/test_lib_json/jsontest.h280
-rw-r--r--3rdparty/jsoncpp/src/test_lib_json/main.cpp2406
-rw-r--r--3rdparty/jsoncpp/src/test_lib_json/sconscript10
-rw-r--r--3rdparty/jsoncpp/test/cleantests.py16
-rw-r--r--3rdparty/jsoncpp/test/data/fail_test_array_01.json1
-rw-r--r--3rdparty/jsoncpp/test/data/test_array_01.expected1
-rw-r--r--3rdparty/jsoncpp/test/data/test_array_01.json1
-rw-r--r--3rdparty/jsoncpp/test/data/test_array_02.expected2
-rw-r--r--3rdparty/jsoncpp/test/data/test_array_02.json1
-rw-r--r--3rdparty/jsoncpp/test/data/test_array_03.expected6
-rw-r--r--3rdparty/jsoncpp/test/data/test_array_03.json1
-rw-r--r--3rdparty/jsoncpp/test/data/test_array_04.expected5
-rw-r--r--3rdparty/jsoncpp/test/data/test_array_04.json1
-rw-r--r--3rdparty/jsoncpp/test/data/test_array_05.expected100
-rw-r--r--3rdparty/jsoncpp/test/data/test_array_05.json1
-rw-r--r--3rdparty/jsoncpp/test/data/test_array_06.expected5
-rw-r--r--3rdparty/jsoncpp/test/data/test_array_06.json4
-rw-r--r--3rdparty/jsoncpp/test/data/test_array_07.expected2122
-rw-r--r--3rdparty/jsoncpp/test/data/test_array_07.json2
-rw-r--r--3rdparty/jsoncpp/test/data/test_basic_01.expected1
-rw-r--r--3rdparty/jsoncpp/test/data/test_basic_01.json1
-rw-r--r--3rdparty/jsoncpp/test/data/test_basic_02.expected1
-rw-r--r--3rdparty/jsoncpp/test/data/test_basic_02.json1
-rw-r--r--3rdparty/jsoncpp/test/data/test_basic_03.expected3
-rw-r--r--3rdparty/jsoncpp/test/data/test_basic_03.json3
-rw-r--r--3rdparty/jsoncpp/test/data/test_basic_04.expected2
-rw-r--r--3rdparty/jsoncpp/test/data/test_basic_04.json2
-rw-r--r--3rdparty/jsoncpp/test/data/test_basic_05.expected2
-rw-r--r--3rdparty/jsoncpp/test/data/test_basic_05.json2
-rw-r--r--3rdparty/jsoncpp/test/data/test_basic_06.expected2
-rw-r--r--3rdparty/jsoncpp/test/data/test_basic_06.json2
-rw-r--r--3rdparty/jsoncpp/test/data/test_basic_07.expected2
-rw-r--r--3rdparty/jsoncpp/test/data/test_basic_07.json2
-rw-r--r--3rdparty/jsoncpp/test/data/test_basic_08.expected3
-rw-r--r--3rdparty/jsoncpp/test/data/test_basic_08.json3
-rw-r--r--3rdparty/jsoncpp/test/data/test_basic_09.expected4
-rw-r--r--3rdparty/jsoncpp/test/data/test_basic_09.json4
-rw-r--r--3rdparty/jsoncpp/test/data/test_comment_00.expected4
-rw-r--r--3rdparty/jsoncpp/test/data/test_comment_00.json5
-rw-r--r--3rdparty/jsoncpp/test/data/test_comment_01.expected10
-rw-r--r--3rdparty/jsoncpp/test/data/test_comment_01.json10
-rw-r--r--3rdparty/jsoncpp/test/data/test_comment_02.expected23
-rw-r--r--3rdparty/jsoncpp/test/data/test_comment_02.json26
-rw-r--r--3rdparty/jsoncpp/test/data/test_complex_01.expected20
-rw-r--r--3rdparty/jsoncpp/test/data/test_complex_01.json17
-rw-r--r--3rdparty/jsoncpp/test/data/test_integer_01.expected2
-rw-r--r--3rdparty/jsoncpp/test/data/test_integer_01.json2
-rw-r--r--3rdparty/jsoncpp/test/data/test_integer_02.expected2
-rw-r--r--3rdparty/jsoncpp/test/data/test_integer_02.json2
-rw-r--r--3rdparty/jsoncpp/test/data/test_integer_03.expected2
-rw-r--r--3rdparty/jsoncpp/test/data/test_integer_03.json2
-rw-r--r--3rdparty/jsoncpp/test/data/test_integer_04.expected3
-rw-r--r--3rdparty/jsoncpp/test/data/test_integer_04.json3
-rw-r--r--3rdparty/jsoncpp/test/data/test_integer_05.expected2
-rw-r--r--3rdparty/jsoncpp/test/data/test_integer_05.json2
-rw-r--r--3rdparty/jsoncpp/test/data/test_integer_06_64bits.expected1
-rw-r--r--3rdparty/jsoncpp/test/data/test_integer_06_64bits.json2
-rw-r--r--3rdparty/jsoncpp/test/data/test_integer_07_64bits.expected1
-rw-r--r--3rdparty/jsoncpp/test/data/test_integer_07_64bits.json2
-rw-r--r--3rdparty/jsoncpp/test/data/test_integer_08_64bits.expected1
-rw-r--r--3rdparty/jsoncpp/test/data/test_integer_08_64bits.json2
-rw-r--r--3rdparty/jsoncpp/test/data/test_large_01.expected2122
-rw-r--r--3rdparty/jsoncpp/test/data/test_large_01.json2
-rw-r--r--3rdparty/jsoncpp/test/data/test_object_01.expected1
-rw-r--r--3rdparty/jsoncpp/test/data/test_object_01.json1
-rw-r--r--3rdparty/jsoncpp/test/data/test_object_02.expected2
-rw-r--r--3rdparty/jsoncpp/test/data/test_object_02.json1
-rw-r--r--3rdparty/jsoncpp/test/data/test_object_03.expected4
-rw-r--r--3rdparty/jsoncpp/test/data/test_object_03.json5
-rw-r--r--3rdparty/jsoncpp/test/data/test_object_04.expected2
-rw-r--r--3rdparty/jsoncpp/test/data/test_object_04.json3
-rw-r--r--3rdparty/jsoncpp/test/data/test_preserve_comment_01.expected11
-rw-r--r--3rdparty/jsoncpp/test/data/test_preserve_comment_01.json14
-rw-r--r--3rdparty/jsoncpp/test/data/test_real_01.expected3
-rw-r--r--3rdparty/jsoncpp/test/data/test_real_01.json3
-rw-r--r--3rdparty/jsoncpp/test/data/test_real_02.expected3
-rw-r--r--3rdparty/jsoncpp/test/data/test_real_02.json3
-rw-r--r--3rdparty/jsoncpp/test/data/test_real_03.expected3
-rw-r--r--3rdparty/jsoncpp/test/data/test_real_03.json3
-rw-r--r--3rdparty/jsoncpp/test/data/test_real_04.expected3
-rw-r--r--3rdparty/jsoncpp/test/data/test_real_04.json3
-rw-r--r--3rdparty/jsoncpp/test/data/test_real_05.expected4
-rw-r--r--3rdparty/jsoncpp/test/data/test_real_05.json3
-rw-r--r--3rdparty/jsoncpp/test/data/test_real_06.expected4
-rw-r--r--3rdparty/jsoncpp/test/data/test_real_06.json3
-rw-r--r--3rdparty/jsoncpp/test/data/test_real_07.expected4
-rw-r--r--3rdparty/jsoncpp/test/data/test_real_07.json3
-rw-r--r--3rdparty/jsoncpp/test/data/test_real_08.expected4
-rw-r--r--3rdparty/jsoncpp/test/data/test_real_08.json4
-rw-r--r--3rdparty/jsoncpp/test/data/test_real_09.expected4
-rw-r--r--3rdparty/jsoncpp/test/data/test_real_09.json4
-rw-r--r--3rdparty/jsoncpp/test/data/test_real_10.expected4
-rw-r--r--3rdparty/jsoncpp/test/data/test_real_10.json4
-rw-r--r--3rdparty/jsoncpp/test/data/test_real_11.expected4
-rw-r--r--3rdparty/jsoncpp/test/data/test_real_11.json4
-rw-r--r--3rdparty/jsoncpp/test/data/test_real_12.expected2
-rw-r--r--3rdparty/jsoncpp/test/data/test_real_12.json2
-rw-r--r--3rdparty/jsoncpp/test/data/test_string_01.expected1
-rw-r--r--3rdparty/jsoncpp/test/data/test_string_01.json1
-rw-r--r--3rdparty/jsoncpp/test/data/test_string_02.expected1
-rw-r--r--3rdparty/jsoncpp/test/data/test_string_02.json1
-rw-r--r--3rdparty/jsoncpp/test/data/test_string_03.expected1
-rw-r--r--3rdparty/jsoncpp/test/data/test_string_03.json1
-rw-r--r--3rdparty/jsoncpp/test/data/test_string_04.expected2
-rw-r--r--3rdparty/jsoncpp/test/data/test_string_04.json2
-rw-r--r--3rdparty/jsoncpp/test/data/test_string_05.expected2
-rw-r--r--3rdparty/jsoncpp/test/data/test_string_05.json2
-rw-r--r--3rdparty/jsoncpp/test/data/test_string_unicode_01.expected1
-rw-r--r--3rdparty/jsoncpp/test/data/test_string_unicode_01.json1
-rw-r--r--3rdparty/jsoncpp/test/data/test_string_unicode_02.expected1
-rw-r--r--3rdparty/jsoncpp/test/data/test_string_unicode_02.json1
-rw-r--r--3rdparty/jsoncpp/test/data/test_string_unicode_03.expected1
-rw-r--r--3rdparty/jsoncpp/test/data/test_string_unicode_03.json1
-rw-r--r--3rdparty/jsoncpp/test/data/test_string_unicode_04.expected1
-rw-r--r--3rdparty/jsoncpp/test/data/test_string_unicode_04.json1
-rw-r--r--3rdparty/jsoncpp/test/data/test_string_unicode_05.expected2
-rw-r--r--3rdparty/jsoncpp/test/data/test_string_unicode_05.json1
-rw-r--r--3rdparty/jsoncpp/test/generate_expected.py17
-rw-r--r--3rdparty/jsoncpp/test/jsonchecker/fail1.json1
-rw-r--r--3rdparty/jsoncpp/test/jsonchecker/fail10.json1
-rw-r--r--3rdparty/jsoncpp/test/jsonchecker/fail11.json1
-rw-r--r--3rdparty/jsoncpp/test/jsonchecker/fail12.json1
-rw-r--r--3rdparty/jsoncpp/test/jsonchecker/fail13.json1
-rw-r--r--3rdparty/jsoncpp/test/jsonchecker/fail14.json1
-rw-r--r--3rdparty/jsoncpp/test/jsonchecker/fail15.json1
-rw-r--r--3rdparty/jsoncpp/test/jsonchecker/fail16.json1
-rw-r--r--3rdparty/jsoncpp/test/jsonchecker/fail17.json1
-rw-r--r--3rdparty/jsoncpp/test/jsonchecker/fail18.json1
-rw-r--r--3rdparty/jsoncpp/test/jsonchecker/fail19.json1
-rw-r--r--3rdparty/jsoncpp/test/jsonchecker/fail2.json1
-rw-r--r--3rdparty/jsoncpp/test/jsonchecker/fail20.json1
-rw-r--r--3rdparty/jsoncpp/test/jsonchecker/fail21.json1
-rw-r--r--3rdparty/jsoncpp/test/jsonchecker/fail22.json1
-rw-r--r--3rdparty/jsoncpp/test/jsonchecker/fail23.json1
-rw-r--r--3rdparty/jsoncpp/test/jsonchecker/fail24.json1
-rw-r--r--3rdparty/jsoncpp/test/jsonchecker/fail25.json1
-rw-r--r--3rdparty/jsoncpp/test/jsonchecker/fail26.json1
-rw-r--r--3rdparty/jsoncpp/test/jsonchecker/fail27.json2
-rw-r--r--3rdparty/jsoncpp/test/jsonchecker/fail28.json2
-rw-r--r--3rdparty/jsoncpp/test/jsonchecker/fail29.json1
-rw-r--r--3rdparty/jsoncpp/test/jsonchecker/fail3.json1
-rw-r--r--3rdparty/jsoncpp/test/jsonchecker/fail30.json1
-rw-r--r--3rdparty/jsoncpp/test/jsonchecker/fail31.json1
-rw-r--r--3rdparty/jsoncpp/test/jsonchecker/fail32.json1
-rw-r--r--3rdparty/jsoncpp/test/jsonchecker/fail33.json1
-rw-r--r--3rdparty/jsoncpp/test/jsonchecker/fail4.json1
-rw-r--r--3rdparty/jsoncpp/test/jsonchecker/fail5.json1
-rw-r--r--3rdparty/jsoncpp/test/jsonchecker/fail6.json1
-rw-r--r--3rdparty/jsoncpp/test/jsonchecker/fail7.json1
-rw-r--r--3rdparty/jsoncpp/test/jsonchecker/fail8.json1
-rw-r--r--3rdparty/jsoncpp/test/jsonchecker/fail9.json1
-rw-r--r--3rdparty/jsoncpp/test/jsonchecker/pass1.json58
-rw-r--r--3rdparty/jsoncpp/test/jsonchecker/pass2.json1
-rw-r--r--3rdparty/jsoncpp/test/jsonchecker/pass3.json6
-rw-r--r--3rdparty/jsoncpp/test/jsonchecker/readme.txt3
-rw-r--r--3rdparty/jsoncpp/test/pyjsontestrunner.py71
-rw-r--r--3rdparty/jsoncpp/test/runjsontests.py174
-rw-r--r--3rdparty/jsoncpp/test/rununittests.py84
-rw-r--r--3rdparty/jsoncpp/travis.sh29
-rw-r--r--3rdparty/jsoncpp/version1
-rw-r--r--3rdparty/jsoncpp/version.in1
-rw-r--r--3rdparty/win81sdk/Include/um/xaudio2.h1196
-rw-r--r--hash/atom_cass.xml481
-rw-r--r--hash/atom_flop.xml146
-rw-r--r--hash/atom_rom.xml (renamed from hash/atom.xml)13
-rw-r--r--hash/bbc_flop_32016.xml (renamed from hash/bbc_32016_flop.xml)2
-rw-r--r--hash/bbc_flop_6502.xml84
-rw-r--r--hash/bbc_flop_65c102.xml (renamed from hash/bbc_65c102_flop.xml)2
-rw-r--r--hash/bbc_flop_68000.xml (renamed from hash/bbc_68000_flop.xml)10
-rw-r--r--hash/bbc_flop_80186.xml (renamed from hash/bbc_80186_flop.xml)2
-rw-r--r--hash/bbc_flop_arm.xml (renamed from hash/bbc_arm_flop.xml)2
-rw-r--r--hash/bbc_flop_torch.xml172
-rw-r--r--hash/bbc_flop_z80.xml (renamed from hash/bbc_z80_flop.xml)2
-rw-r--r--hash/bbca_cass.xml201
-rw-r--r--hash/bbcb_cass.xml804
-rw-r--r--hash/bbcb_cass_de.xml (renamed from hash/bbcb_de_cass.xml)87
-rw-r--r--hash/bbcb_flop.xml4
-rw-r--r--hash/bbcb_flop_orig.xml (renamed from hash/bbcb_orig_flop.xml)238
-rw-r--r--hash/bbcb_flop_us.xml (renamed from hash/bbcb_us_flop.xml)2
-rw-r--r--hash/bbcm_cart.xml17
-rw-r--r--hash/bbcm_flop.xml12
-rw-r--r--hash/bw14.xml106
-rw-r--r--hash/c64_cart.xml13
-rw-r--r--hash/c64_flop.xml12
-rw-r--r--hash/casloopy.xml30
-rw-r--r--hash/database.xml12
-rw-r--r--hash/dim68k.xml82
-rw-r--r--hash/electron_cart.xml12
-rw-r--r--hash/gamate.xml324
-rw-r--r--hash/gba.xml34
-rw-r--r--hash/gmaster.xml12
-rw-r--r--hash/h21.xml58
-rw-r--r--hash/md2_flop.xml74
-rw-r--r--hash/megadriv.xml24
-rw-r--r--hash/msx2_flop.xml44
-rw-r--r--hash/msx2p_flop.xml17
-rw-r--r--hash/neogeo.xml6
-rw-r--r--hash/pc1000.xml142
-rw-r--r--hash/pico.xml25
-rw-r--r--hash/pro128s_flop.xml14
-rw-r--r--hash/pv1000.xml2
-rw-r--r--hash/r9751.xml150
-rw-r--r--hash/saturn.xml14
-rw-r--r--hash/snotec.xml75
-rw-r--r--hash/supracan.xml15
-rw-r--r--hash/tutor.xml86
-rw-r--r--hash/x1_cass.xml27
-rw-r--r--makefile147
-rw-r--r--scripts/build/makedep.py32
-rw-r--r--scripts/depfilter.awk25
-rw-r--r--scripts/genie.lua131
-rw-r--r--scripts/src/3rdparty.lua133
-rw-r--r--scripts/src/devices.lua3
-rw-r--r--scripts/src/emu.lua32
-rw-r--r--scripts/src/lib.lua1
-rw-r--r--scripts/src/machine.lua11
-rw-r--r--scripts/src/main.lua26
-rw-r--r--scripts/src/osd/modules.lua111
-rw-r--r--scripts/src/osd/osdmini.lua21
-rw-r--r--scripts/src/osd/osdmini_cfg.lua2
-rw-r--r--scripts/src/osd/sdl.lua46
-rw-r--r--scripts/src/osd/sdl_cfg.lua2
-rw-r--r--scripts/src/osd/windows.lua16
-rw-r--r--scripts/src/osd/windows_cfg.lua18
-rw-r--r--scripts/src/sound.lua1
-rw-r--r--scripts/src/video.lua12
-rw-r--r--scripts/target/mame/arcade.lua8
-rw-r--r--scripts/target/mame/dummy.lua1
-rw-r--r--scripts/target/mame/mess.lua39
-rw-r--r--scripts/target/mame/tiny.lua1
-rw-r--r--scripts/toolchain.lua55
-rw-r--r--src/devices/bus/a7800/a78_slot.cpp12
-rw-r--r--src/devices/bus/a7800/a78_slot.h4
-rw-r--r--src/devices/bus/a800/a800_slot.cpp26
-rw-r--r--src/devices/bus/a800/a800_slot.h6
-rw-r--r--src/devices/bus/abckb/abc99.cpp22
-rw-r--r--src/devices/bus/adam/exp.cpp8
-rw-r--r--src/devices/bus/adam/exp.h2
-rw-r--r--src/devices/bus/amiga/zorro/buddha.cpp12
-rw-r--r--src/devices/bus/apf/slot.cpp11
-rw-r--r--src/devices/bus/apf/slot.h2
-rw-r--r--src/devices/bus/arcadia/slot.cpp6
-rw-r--r--src/devices/bus/arcadia/slot.h2
-rw-r--r--src/devices/bus/astrocde/slot.cpp11
-rw-r--r--src/devices/bus/astrocde/slot.h3
-rw-r--r--src/devices/bus/c64/exp.cpp13
-rw-r--r--src/devices/bus/c64/exp.h2
-rw-r--r--src/devices/bus/c64/geocable.h2
-rw-r--r--src/devices/bus/c64/magic_voice.h2
-rw-r--r--src/devices/bus/cbm2/exp.cpp8
-rw-r--r--src/devices/bus/cbm2/exp.h2
-rw-r--r--src/devices/bus/cbm2/hrg.cpp104
-rw-r--r--src/devices/bus/cbm2/hrg.h24
-rw-r--r--src/devices/bus/cbmiec/c1541.cpp4
-rw-r--r--src/devices/bus/cbmiec/c1571.cpp4
-rw-r--r--src/devices/bus/cbmiec/c1571.h2
-rw-r--r--src/devices/bus/cbmiec/c1581.cpp6
-rw-r--r--src/devices/bus/centronics/epson_ex800.cpp5
-rw-r--r--src/devices/bus/centronics/epson_ex800.h1
-rw-r--r--src/devices/bus/centronics/epson_lx800.cpp7
-rw-r--r--src/devices/bus/centronics/epson_lx810l.cpp4
-rw-r--r--src/devices/bus/cgenie/expansion/floppy.h2
-rw-r--r--src/devices/bus/chanf/slot.cpp11
-rw-r--r--src/devices/bus/chanf/slot.h2
-rw-r--r--src/devices/bus/coco/coco_dwsock.cpp3
-rw-r--r--src/devices/bus/coco/coco_fdc.cpp2
-rw-r--r--src/devices/bus/coco/cococart.cpp10
-rw-r--r--src/devices/bus/coco/cococart.h2
-rw-r--r--src/devices/bus/coleco/exp.cpp11
-rw-r--r--src/devices/bus/coleco/exp.h2
-rw-r--r--src/devices/bus/cpc/cpc_rom.cpp7
-rw-r--r--src/devices/bus/cpc/cpc_rom.h4
-rw-r--r--src/devices/bus/cpc/mface2.cpp6
-rw-r--r--src/devices/bus/cpc/mface2.h2
-rw-r--r--src/devices/bus/cpc/symbfac2.cpp14
-rw-r--r--src/devices/bus/cpc/transtape.cpp14
-rw-r--r--src/devices/bus/cpc/transtape.h2
-rw-r--r--src/devices/bus/crvision/slot.cpp11
-rw-r--r--src/devices/bus/crvision/slot.h2
-rw-r--r--src/devices/bus/dmv/k220.cpp4
-rw-r--r--src/devices/bus/econet/e01.cpp4
-rw-r--r--src/devices/bus/econet/e01.h1
-rw-r--r--src/devices/bus/gameboy/gb_slot.cpp24
-rw-r--r--src/devices/bus/gameboy/gb_slot.h4
-rw-r--r--src/devices/bus/gameboy/rom.h2
-rw-r--r--src/devices/bus/gba/gba_slot.cpp11
-rw-r--r--src/devices/bus/gba/gba_slot.h3
-rw-r--r--src/devices/bus/generic/slot.cpp6
-rw-r--r--src/devices/bus/generic/slot.h2
-rw-r--r--src/devices/bus/ieee488/c2031.cpp2
-rw-r--r--src/devices/bus/ieee488/c2040.cpp6
-rw-r--r--src/devices/bus/ieee488/c2040.h2
-rw-r--r--src/devices/bus/ieee488/c8050.cpp6
-rw-r--r--src/devices/bus/ieee488/c8050.h2
-rw-r--r--src/devices/bus/ieee488/c8280.cpp6
-rw-r--r--src/devices/bus/ieee488/d9060.cpp6
-rw-r--r--src/devices/bus/ieee488/d9060.h1
-rw-r--r--src/devices/bus/ieee488/hardbox.cpp6
-rw-r--r--src/devices/bus/ieee488/softbox.cpp6
-rw-r--r--src/devices/bus/imi7000/imi7000.h2
-rw-r--r--src/devices/bus/intv/ecs.cpp164
-rw-r--r--src/devices/bus/intv/slot.cpp15
-rw-r--r--src/devices/bus/intv/slot.h2
-rw-r--r--src/devices/bus/iq151/iq151.cpp8
-rw-r--r--src/devices/bus/iq151/iq151.h2
-rw-r--r--src/devices/bus/iq151/minigraf.cpp2
-rw-r--r--src/devices/bus/iq151/minigraf.h2
-rw-r--r--src/devices/bus/iq151/ms151a.cpp2
-rw-r--r--src/devices/bus/iq151/ms151a.h2
-rw-r--r--src/devices/bus/iq151/video32.cpp2
-rw-r--r--src/devices/bus/iq151/video64.cpp2
-rw-r--r--src/devices/bus/isa/3c505.h2
-rw-r--r--src/devices/bus/isa/aga.cpp26
-rw-r--r--src/devices/bus/isa/aga.h2
-rw-r--r--src/devices/bus/isa/com.cpp8
-rw-r--r--src/devices/bus/isa/ega.cpp4
-rw-r--r--src/devices/bus/isa/gus.cpp4
-rw-r--r--src/devices/bus/isa/hdc.cpp4
-rw-r--r--src/devices/bus/isa/ibm_mfc.cpp2
-rw-r--r--src/devices/bus/isa/mda.cpp6
-rw-r--r--src/devices/bus/isa/mda.h2
-rw-r--r--src/devices/bus/isa/omti8621.cpp121
-rw-r--r--src/devices/bus/isa/omti8621.h30
-rw-r--r--src/devices/bus/isa/pgc.cpp10
-rw-r--r--src/devices/bus/isa/pgc.h6
-rw-r--r--src/devices/bus/isa/sc499.cpp5
-rw-r--r--src/devices/bus/isa/sc499.h3
-rw-r--r--src/devices/bus/isa/trident.cpp2
-rw-r--r--src/devices/bus/kc/kc.cpp8
-rw-r--r--src/devices/bus/kc/kc.h2
-rw-r--r--src/devices/bus/lpci/i82439tx.cpp2
-rw-r--r--src/devices/bus/macpds/macpds.h1
-rw-r--r--src/devices/bus/macpds/pds_tpdfpd.cpp8
-rw-r--r--src/devices/bus/macpds/pds_tpdfpd.h2
-rw-r--r--src/devices/bus/megadrive/md_slot.cpp10
-rw-r--r--src/devices/bus/megadrive/md_slot.h2
-rw-r--r--src/devices/bus/megadrive/rom.cpp2
-rw-r--r--src/devices/bus/megadrive/svp.cpp2
-rw-r--r--src/devices/bus/megadrive/svp.h2
-rw-r--r--src/devices/bus/msx_cart/disk.cpp4
-rw-r--r--src/devices/bus/msx_slot/cartridge.cpp9
-rw-r--r--src/devices/bus/msx_slot/cartridge.h2
-rw-r--r--src/devices/bus/msx_slot/disk.cpp4
-rw-r--r--src/devices/bus/neogeo/bootleg_prot.cpp2
-rw-r--r--src/devices/bus/neogeo/neogeo_intf.h2
-rw-r--r--src/devices/bus/neogeo/neogeo_slot.cpp6
-rw-r--r--src/devices/bus/neogeo/neogeo_slot.h2
-rw-r--r--src/devices/bus/nes/act53.cpp2
-rw-r--r--src/devices/bus/nes/aladdin.cpp10
-rw-r--r--src/devices/bus/nes/aladdin.h2
-rw-r--r--src/devices/bus/nes/bootleg.cpp2
-rw-r--r--src/devices/bus/nes/datach.cpp6
-rw-r--r--src/devices/bus/nes/datach.h2
-rw-r--r--src/devices/bus/nes/disksys.cpp6
-rw-r--r--src/devices/bus/nes/disksys.h2
-rw-r--r--src/devices/bus/nes/karastudio.cpp6
-rw-r--r--src/devices/bus/nes/karastudio.h2
-rw-r--r--src/devices/bus/nes/mmc5.h1
-rw-r--r--src/devices/bus/nes/nes_slot.cpp8
-rw-r--r--src/devices/bus/nes/nes_slot.h2
-rw-r--r--src/devices/bus/nes/sunsoft_dcs.cpp6
-rw-r--r--src/devices/bus/nes/sunsoft_dcs.h2
-rw-r--r--src/devices/bus/nes_ctrl/arkpaddle.cpp2
-rw-r--r--src/devices/bus/nubus/nubus_image.cpp16
-rw-r--r--src/devices/bus/odyssey2/slot.cpp11
-rw-r--r--src/devices/bus/odyssey2/slot.h2
-rw-r--r--src/devices/bus/pc_kbd/pcat84.cpp6
-rw-r--r--src/devices/bus/pce/pce_slot.cpp13
-rw-r--r--src/devices/bus/pce/pce_slot.h3
-rw-r--r--src/devices/bus/pet/64k.cpp2
-rw-r--r--src/devices/bus/pet/hsg.cpp49
-rw-r--r--src/devices/bus/pet/hsg.h4
-rw-r--r--src/devices/bus/plus4/c1551.cpp2
-rw-r--r--src/devices/bus/plus4/c1551.h4
-rw-r--r--src/devices/bus/plus4/exp.cpp6
-rw-r--r--src/devices/bus/plus4/exp.h2
-rw-r--r--src/devices/bus/ql/cst_q_plus4.h1
-rw-r--r--src/devices/bus/ql/cst_qdisc.h1
-rw-r--r--src/devices/bus/ql/cumana_fdi.h1
-rw-r--r--src/devices/bus/ql/kempston_di.h1
-rw-r--r--src/devices/bus/ql/miracle_gold_card.h1
-rw-r--r--src/devices/bus/ql/miracle_hd.h1
-rw-r--r--src/devices/bus/ql/mp_fdi.h1
-rw-r--r--src/devices/bus/ql/opd_basic_master.h1
-rw-r--r--src/devices/bus/ql/pcml_qdisk.h1
-rw-r--r--src/devices/bus/ql/qubide.h1
-rw-r--r--src/devices/bus/ql/rom.cpp8
-rw-r--r--src/devices/bus/ql/rom.h2
-rw-r--r--src/devices/bus/rs232/keyboard.h1
-rw-r--r--src/devices/bus/rs232/xvd701.h3
-rw-r--r--src/devices/bus/saturn/sat_slot.cpp6
-rw-r--r--src/devices/bus/saturn/sat_slot.h2
-rw-r--r--src/devices/bus/scv/slot.cpp11
-rw-r--r--src/devices/bus/scv/slot.h2
-rw-r--r--src/devices/bus/sega8/sega8_slot.cpp13
-rw-r--r--src/devices/bus/sega8/sega8_slot.h5
-rw-r--r--src/devices/bus/sms_ctrl/lphaser.cpp2
-rw-r--r--src/devices/bus/sms_ctrl/paddle.cpp4
-rw-r--r--src/devices/bus/sms_ctrl/rfu.cpp2
-rw-r--r--src/devices/bus/sms_ctrl/sports.cpp6
-rw-r--r--src/devices/bus/sms_ctrl/sportsjp.cpp2
-rw-r--r--src/devices/bus/snes/bsx.cpp2
-rw-r--r--src/devices/bus/snes/bsx.h2
-rw-r--r--src/devices/bus/snes/rom.cpp2
-rw-r--r--src/devices/bus/snes/sa1.cpp10
-rw-r--r--src/devices/bus/snes/sdd1.cpp40
-rw-r--r--src/devices/bus/snes/sdd1.h24
-rw-r--r--src/devices/bus/snes/snes_slot.cpp15
-rw-r--r--src/devices/bus/snes/snes_slot.h2
-rw-r--r--src/devices/bus/snes/spc7110.cpp8
-rw-r--r--src/devices/bus/snes/spc7110.h4
-rw-r--r--src/devices/bus/ti99_peb/bwg.cpp2
-rw-r--r--src/devices/bus/ti99_peb/bwg.h3
-rw-r--r--src/devices/bus/ti99_peb/evpc.cpp10
-rw-r--r--src/devices/bus/ti99_peb/evpc.h2
-rw-r--r--src/devices/bus/ti99_peb/hfdc.cpp2
-rw-r--r--src/devices/bus/ti99_peb/hfdc.h4
-rw-r--r--src/devices/bus/ti99_peb/horizon.cpp4
-rw-r--r--src/devices/bus/ti99_peb/hsgpl.cpp8
-rw-r--r--src/devices/bus/ti99_peb/hsgpl.h4
-rw-r--r--src/devices/bus/ti99_peb/memex.cpp2
-rw-r--r--src/devices/bus/ti99_peb/myarcmem.cpp2
-rw-r--r--src/devices/bus/ti99_peb/samsmem.cpp4
-rw-r--r--src/devices/bus/ti99_peb/spchsyn.h4
-rw-r--r--src/devices/bus/ti99_peb/ti_fdc.h3
-rw-r--r--src/devices/bus/ti99_peb/ti_rs232.cpp14
-rw-r--r--src/devices/bus/ti99_peb/ti_rs232.h3
-rw-r--r--src/devices/bus/ti99x/998board.cpp12
-rw-r--r--src/devices/bus/ti99x/998board.h4
-rw-r--r--src/devices/bus/ti99x/datamux.cpp6
-rw-r--r--src/devices/bus/ti99x/datamux.h2
-rw-r--r--src/devices/bus/ti99x/genboard.cpp2
-rw-r--r--src/devices/bus/ti99x/gromport.cpp54
-rw-r--r--src/devices/bus/ti99x/gromport.h5
-rw-r--r--src/devices/bus/ti99x/handset.h1
-rw-r--r--src/devices/bus/ti99x/videowrp.h12
-rw-r--r--src/devices/bus/vboy/slot.cpp6
-rw-r--r--src/devices/bus/vboy/slot.h3
-rw-r--r--src/devices/bus/vc4000/slot.cpp11
-rw-r--r--src/devices/bus/vc4000/slot.h2
-rwxr-xr-xsrc/devices/bus/vcs/vcs_slot.cpp10
-rwxr-xr-xsrc/devices/bus/vcs/vcs_slot.h2
-rw-r--r--src/devices/bus/vcs_ctrl/ctrl.h1
-rw-r--r--src/devices/bus/vectrex/slot.cpp11
-rw-r--r--src/devices/bus/vectrex/slot.h2
-rw-r--r--src/devices/bus/vic10/exp.cpp13
-rw-r--r--src/devices/bus/vic10/exp.h2
-rw-r--r--src/devices/bus/vic20/exp.cpp6
-rw-r--r--src/devices/bus/vic20/exp.h2
-rw-r--r--src/devices/bus/vidbrain/exp.cpp8
-rw-r--r--src/devices/bus/vidbrain/exp.h2
-rw-r--r--src/devices/bus/wangpc/tig.cpp2
-rw-r--r--src/devices/bus/wswan/slot.cpp11
-rw-r--r--src/devices/bus/wswan/slot.h2
-rw-r--r--src/devices/bus/z88/z88.cpp14
-rw-r--r--src/devices/bus/z88/z88.h2
-rw-r--r--src/devices/cpu/8x300/8x300.cpp4
-rw-r--r--src/devices/cpu/8x300/8x300.h2
-rw-r--r--src/devices/cpu/adsp2100/adsp2100.cpp13
-rw-r--r--src/devices/cpu/adsp2100/adsp2100.h2
-rw-r--r--src/devices/cpu/alph8201/alph8201.cpp2
-rw-r--r--src/devices/cpu/alph8201/alph8201.h2
-rw-r--r--src/devices/cpu/alto2/a2disk.cpp2
-rw-r--r--src/devices/cpu/alto2/a2disp.cpp12
-rw-r--r--src/devices/cpu/alto2/a2disp.h4
-rw-r--r--src/devices/cpu/alto2/a2ether.cpp8
-rw-r--r--src/devices/cpu/alto2/a2ether.h4
-rw-r--r--src/devices/cpu/alto2/a2mem.cpp8
-rw-r--r--src/devices/cpu/alto2/a2mem.h4
-rw-r--r--src/devices/cpu/alto2/a2ram.cpp4
-rw-r--r--src/devices/cpu/alto2/alto2cpu.cpp12
-rw-r--r--src/devices/cpu/alto2/alto2cpu.h10
-rw-r--r--src/devices/cpu/am29000/am29000.cpp2
-rw-r--r--src/devices/cpu/am29000/am29000.h2
-rw-r--r--src/devices/cpu/amis2000/amis2000.cpp2
-rw-r--r--src/devices/cpu/amis2000/amis2000.h2
-rw-r--r--src/devices/cpu/apexc/apexc.cpp2
-rw-r--r--src/devices/cpu/apexc/apexc.h2
-rw-r--r--src/devices/cpu/arcompact/arcompact_execute.cpp20
-rw-r--r--src/devices/cpu/arcompact/arcompactdasm.cpp2
-rw-r--r--src/devices/cpu/arcompact/arcompactdasm_ops.cpp4
-rw-r--r--src/devices/cpu/arm/arm.cpp2
-rw-r--r--src/devices/cpu/arm/arm.h2
-rw-r--r--src/devices/cpu/arm7/arm7.cpp2
-rw-r--r--src/devices/cpu/arm7/arm7.h2
-rw-r--r--src/devices/cpu/arm7/arm7dasm.cpp2
-rw-r--r--src/devices/cpu/arm7/arm7ops.cpp8
-rw-r--r--src/devices/cpu/asap/asap.cpp5
-rw-r--r--src/devices/cpu/asap/asap.h2
-rw-r--r--src/devices/cpu/avr8/avr8.cpp24
-rw-r--r--src/devices/cpu/avr8/avr8.h13
-rw-r--r--src/devices/cpu/avr8/avr8dasm.cpp2
-rw-r--r--src/devices/cpu/ccpu/ccpu.cpp14
-rw-r--r--src/devices/cpu/ccpu/ccpu.h3
-rw-r--r--src/devices/cpu/cop400/cop400.cpp2
-rw-r--r--src/devices/cpu/cop400/cop400.h2
-rw-r--r--src/devices/cpu/cosmac/cosmac.cpp5
-rw-r--r--src/devices/cpu/cosmac/cosmac.h3
-rw-r--r--src/devices/cpu/cp1610/cp1610.cpp2
-rw-r--r--src/devices/cpu/cp1610/cp1610.h2
-rw-r--r--src/devices/cpu/cubeqcpu/cubeqcpu.cpp4
-rw-r--r--src/devices/cpu/cubeqcpu/cubeqcpu.h4
-rw-r--r--src/devices/cpu/drcbeut.cpp2
-rw-r--r--src/devices/cpu/drcbex64.cpp8
-rw-r--r--src/devices/cpu/drcbex86.cpp8
-rw-r--r--src/devices/cpu/drcbex86.h9
-rw-r--r--src/devices/cpu/drcuml.cpp21
-rw-r--r--src/devices/cpu/drcuml.h1
-rw-r--r--src/devices/cpu/dsp16/dsp16.cpp2
-rw-r--r--src/devices/cpu/dsp16/dsp16.h2
-rw-r--r--src/devices/cpu/dsp32/dsp32.cpp5
-rw-r--r--src/devices/cpu/dsp32/dsp32.h2
-rw-r--r--src/devices/cpu/dsp56k/dsp56k.cpp4
-rw-r--r--src/devices/cpu/dsp56k/dsp56k.h4
-rw-r--r--src/devices/cpu/dsp56k/dsp56pcu.cpp44
-rw-r--r--src/devices/cpu/dsp56k/dsp56pcu.h42
-rw-r--r--src/devices/cpu/e0c6200/e0c6200.cpp2
-rw-r--r--src/devices/cpu/e0c6200/e0c6200.h2
-rw-r--r--src/devices/cpu/e0c6200/e0c6200d.cpp2
-rw-r--r--src/devices/cpu/e132xs/32xsdasm.cpp2
-rw-r--r--src/devices/cpu/e132xs/e132xs.cpp2
-rw-r--r--src/devices/cpu/e132xs/e132xs.h6
-rw-r--r--src/devices/cpu/esrip/esrip.cpp8
-rw-r--r--src/devices/cpu/esrip/esrip.h8
-rw-r--r--src/devices/cpu/f8/f8.cpp2
-rw-r--r--src/devices/cpu/f8/f8.h2
-rw-r--r--src/devices/cpu/g65816/g65816.cpp2
-rw-r--r--src/devices/cpu/g65816/g65816.h2
-rw-r--r--src/devices/cpu/h6280/h6280.cpp2
-rw-r--r--src/devices/cpu/h6280/h6280.h2
-rw-r--r--src/devices/cpu/h8/h8.cpp2
-rw-r--r--src/devices/cpu/h8/h8.h2
-rw-r--r--src/devices/cpu/h8/h83008.h1
-rw-r--r--src/devices/cpu/h8/h8_intc.h3
-rw-r--r--src/devices/cpu/h8/h8_timer16.h2
-rw-r--r--src/devices/cpu/hcd62121/hcd62121.cpp2
-rw-r--r--src/devices/cpu/hcd62121/hcd62121.h2
-rw-r--r--src/devices/cpu/hcd62121/hcd62121d.cpp4
-rw-r--r--src/devices/cpu/hd61700/hd61700.cpp11
-rw-r--r--src/devices/cpu/hd61700/hd61700.h2
-rw-r--r--src/devices/cpu/hd61700/hd61700d.cpp2
-rw-r--r--src/devices/cpu/hmcs40/hmcs40.cpp2
-rw-r--r--src/devices/cpu/hmcs40/hmcs40.h2
-rw-r--r--src/devices/cpu/hphybrid/hphybrid.cpp998
-rw-r--r--src/devices/cpu/hphybrid/hphybrid.h229
-rw-r--r--src/devices/cpu/hphybrid/hphybrid_dasm.cpp289
-rw-r--r--src/devices/cpu/i386/cycles.h1
-rw-r--r--src/devices/cpu/i386/i386.cpp59
-rw-r--r--src/devices/cpu/i386/i386.h9
-rw-r--r--src/devices/cpu/i386/i386priv.h2
-rw-r--r--src/devices/cpu/i4004/i4004.cpp7
-rw-r--r--src/devices/cpu/i4004/i4004.h2
-rw-r--r--src/devices/cpu/i8008/i8008.cpp5
-rw-r--r--src/devices/cpu/i8008/i8008.h2
-rw-r--r--src/devices/cpu/i8085/i8085.cpp4
-rw-r--r--src/devices/cpu/i8085/i8085.h6
-rw-r--r--src/devices/cpu/i8089/i8089.cpp6
-rw-r--r--src/devices/cpu/i8089/i8089.h8
-rw-r--r--src/devices/cpu/i86/i286.cpp6
-rw-r--r--src/devices/cpu/i86/i286.h2
-rw-r--r--src/devices/cpu/i86/i86.cpp31
-rw-r--r--src/devices/cpu/i86/i86.h4
-rw-r--r--src/devices/cpu/i86/i86inline.h2
-rw-r--r--src/devices/cpu/i860/i860.cpp2
-rw-r--r--src/devices/cpu/i860/i860.h5
-rw-r--r--src/devices/cpu/i860/i860dis.cpp8
-rw-r--r--src/devices/cpu/i960/i960.cpp2
-rw-r--r--src/devices/cpu/i960/i960.h2
-rw-r--r--src/devices/cpu/ie15/ie15.cpp5
-rw-r--r--src/devices/cpu/ie15/ie15.h2
-rw-r--r--src/devices/cpu/jaguar/jaguar.cpp16
-rw-r--r--src/devices/cpu/jaguar/jaguar.h6
-rw-r--r--src/devices/cpu/lc8670/lc8670.cpp10
-rw-r--r--src/devices/cpu/lc8670/lc8670.h2
-rw-r--r--src/devices/cpu/lh5801/lh5801.cpp2
-rw-r--r--src/devices/cpu/lh5801/lh5801.h2
-rw-r--r--src/devices/cpu/lr35902/lr35902.cpp2
-rw-r--r--src/devices/cpu/lr35902/lr35902.h2
-rw-r--r--src/devices/cpu/lr35902/lr35902d.cpp4
-rw-r--r--src/devices/cpu/m37710/m37710.cpp2
-rw-r--r--src/devices/cpu/m37710/m37710.h2
-rw-r--r--src/devices/cpu/m6502/m6502.cpp2
-rw-r--r--src/devices/cpu/m6502/m6502.h2
-rw-r--r--src/devices/cpu/m6502/m6510.h1
-rw-r--r--src/devices/cpu/m6502/m65ce02.cpp2
-rw-r--r--src/devices/cpu/m6502/m65ce02.h2
-rw-r--r--src/devices/cpu/m6502/m740.cpp2
-rw-r--r--src/devices/cpu/m6502/m740.h2
-rw-r--r--src/devices/cpu/m6800/m6800.cpp2
-rw-r--r--src/devices/cpu/m6800/m6800.h2
-rw-r--r--src/devices/cpu/m68000/m68000.h2
-rw-r--r--src/devices/cpu/m68000/m68k_in.cpp35
-rw-r--r--src/devices/cpu/m68000/m68kcpu.cpp12
-rw-r--r--src/devices/cpu/m68000/m68kfpu.inc2
-rw-r--r--src/devices/cpu/m68000/m68kmake.cpp4
-rw-r--r--src/devices/cpu/m68000/m68kops.cpp24
-rw-r--r--src/devices/cpu/m6805/m6805.cpp2
-rw-r--r--src/devices/cpu/m6805/m6805.h4
-rw-r--r--src/devices/cpu/m6809/m6809.cpp2
-rw-r--r--src/devices/cpu/m6809/m6809.h2
-rw-r--r--src/devices/cpu/mb86233/mb86233.cpp4
-rw-r--r--src/devices/cpu/mb86233/mb86233.h2
-rw-r--r--src/devices/cpu/mb86235/mb86235.cpp2
-rw-r--r--src/devices/cpu/mb86235/mb86235.h2
-rw-r--r--src/devices/cpu/mb88xx/mb88xx.cpp2
-rw-r--r--src/devices/cpu/mb88xx/mb88xx.h6
-rw-r--r--src/devices/cpu/mc68hc11/hc11dasm.cpp2
-rw-r--r--src/devices/cpu/mc68hc11/mc68hc11.cpp2
-rw-r--r--src/devices/cpu/mc68hc11/mc68hc11.h2
-rw-r--r--src/devices/cpu/mcs48/mcs48.cpp6
-rw-r--r--src/devices/cpu/mcs48/mcs48.h2
-rw-r--r--src/devices/cpu/mcs51/mcs51.cpp8
-rw-r--r--src/devices/cpu/mcs51/mcs51.h2
-rw-r--r--src/devices/cpu/mcs96/mcs96.cpp2
-rw-r--r--src/devices/cpu/mcs96/mcs96.h2
-rw-r--r--src/devices/cpu/melps4/melps4.cpp4
-rw-r--r--src/devices/cpu/melps4/melps4.h2
-rw-r--r--src/devices/cpu/minx/minx.cpp2
-rw-r--r--src/devices/cpu/minx/minx.h2
-rw-r--r--src/devices/cpu/minx/minxd.cpp4
-rw-r--r--src/devices/cpu/mips/mips3.cpp8
-rw-r--r--src/devices/cpu/mips/mips3.h6
-rw-r--r--src/devices/cpu/mips/mips3drc.cpp14
-rw-r--r--src/devices/cpu/mips/r3000.cpp2
-rw-r--r--src/devices/cpu/mips/r3000.h2
-rw-r--r--src/devices/cpu/mn10200/mn10200.cpp2
-rw-r--r--src/devices/cpu/mn10200/mn10200.h2
-rw-r--r--src/devices/cpu/nec/nec.cpp2
-rw-r--r--src/devices/cpu/nec/nec.h2
-rw-r--r--src/devices/cpu/nec/v25.cpp2
-rw-r--r--src/devices/cpu/nec/v25.h2
-rw-r--r--src/devices/cpu/patinhofeio/patinho_feio.cpp935
-rw-r--r--src/devices/cpu/patinhofeio/patinho_feio.h108
-rw-r--r--src/devices/cpu/patinhofeio/patinho_feio_dasm.cpp308
-rw-r--r--src/devices/cpu/pdp1/pdp1.cpp2
-rw-r--r--src/devices/cpu/pdp1/pdp1.h2
-rw-r--r--src/devices/cpu/pdp8/pdp8.cpp3
-rw-r--r--src/devices/cpu/pdp8/pdp8.h2
-rw-r--r--src/devices/cpu/pic16c5x/pic16c5x.cpp2
-rw-r--r--src/devices/cpu/pic16c5x/pic16c5x.h2
-rw-r--r--src/devices/cpu/pic16c62x/pic16c62x.cpp2
-rw-r--r--src/devices/cpu/pic16c62x/pic16c62x.h11
-rw-r--r--src/devices/cpu/powerpc/ppc.h9
-rw-r--r--src/devices/cpu/powerpc/ppccom.cpp12
-rw-r--r--src/devices/cpu/powerpc/ppcdrc.cpp28
-rw-r--r--src/devices/cpu/pps4/pps4.cpp2
-rw-r--r--src/devices/cpu/pps4/pps4.h5
-rw-r--r--src/devices/cpu/psx/dma.h2
-rw-r--r--src/devices/cpu/psx/gte.h4
-rw-r--r--src/devices/cpu/psx/psx.cpp2
-rw-r--r--src/devices/cpu/psx/psx.h8
-rw-r--r--src/devices/cpu/psx/sio.h1
-rw-r--r--src/devices/cpu/rsp/rsp.cpp25
-rw-r--r--src/devices/cpu/rsp/rsp.h11
-rw-r--r--src/devices/cpu/rsp/rspcp2.cpp6
-rw-r--r--src/devices/cpu/rsp/rspcp2.h6
-rw-r--r--src/devices/cpu/rsp/rspcp2d.cpp12
-rw-r--r--src/devices/cpu/rsp/rspcp2d.h6
-rw-r--r--src/devices/cpu/rsp/rspdrc.cpp12
-rw-r--r--src/devices/cpu/s2650/s2650.cpp14
-rw-r--r--src/devices/cpu/s2650/s2650.h7
-rw-r--r--src/devices/cpu/saturn/saturn.cpp2
-rw-r--r--src/devices/cpu/saturn/saturn.h2
-rw-r--r--src/devices/cpu/sc61860/sc61860.cpp2
-rw-r--r--src/devices/cpu/sc61860/sc61860.h2
-rw-r--r--src/devices/cpu/scmp/scmp.cpp6
-rw-r--r--src/devices/cpu/scmp/scmp.h2
-rw-r--r--src/devices/cpu/score/score.cpp10
-rw-r--r--src/devices/cpu/score/score.h2
-rw-r--r--src/devices/cpu/scudsp/scudsp.cpp2
-rw-r--r--src/devices/cpu/scudsp/scudsp.h2
-rw-r--r--src/devices/cpu/se3208/se3208.cpp2
-rw-r--r--src/devices/cpu/se3208/se3208.h2
-rw-r--r--src/devices/cpu/sh2/sh2.cpp11
-rw-r--r--src/devices/cpu/sh2/sh2.h6
-rw-r--r--src/devices/cpu/sh2/sh2drc.cpp14
-rw-r--r--src/devices/cpu/sh4/sh4.cpp2
-rw-r--r--src/devices/cpu/sh4/sh4.h2
-rw-r--r--src/devices/cpu/sharc/sharcdsm.cpp4
-rw-r--r--src/devices/cpu/sm8500/sm8500.cpp4
-rw-r--r--src/devices/cpu/sm8500/sm8500.h6
-rw-r--r--src/devices/cpu/sm8500/sm8500d.cpp5
-rw-r--r--src/devices/cpu/spc700/spc700.cpp2
-rw-r--r--src/devices/cpu/spc700/spc700.h2
-rw-r--r--src/devices/cpu/ssem/ssem.cpp2
-rw-r--r--src/devices/cpu/ssem/ssem.h2
-rw-r--r--src/devices/cpu/ssp1601/ssp1601.cpp6
-rw-r--r--src/devices/cpu/ssp1601/ssp1601.h2
-rw-r--r--src/devices/cpu/ssp1601/ssp1601d.cpp2
-rw-r--r--src/devices/cpu/superfx/superfx.cpp10
-rw-r--r--src/devices/cpu/t11/t11.cpp4
-rw-r--r--src/devices/cpu/t11/t11.h4
-rw-r--r--src/devices/cpu/tlcs90/tlcs90.cpp4
-rw-r--r--src/devices/cpu/tlcs90/tlcs90.h2
-rw-r--r--src/devices/cpu/tlcs900/tlcs900.cpp210
-rw-r--r--src/devices/cpu/tlcs900/tlcs900.h29
-rw-r--r--src/devices/cpu/tms0980/tms0980.cpp58
-rw-r--r--src/devices/cpu/tms0980/tms0980.h18
-rw-r--r--src/devices/cpu/tms32010/tms32010.cpp2
-rw-r--r--src/devices/cpu/tms32010/tms32010.h2
-rw-r--r--src/devices/cpu/tms32025/tms32025.cpp6
-rw-r--r--src/devices/cpu/tms32025/tms32025.h3
-rw-r--r--src/devices/cpu/tms32031/tms32031.cpp2
-rw-r--r--src/devices/cpu/tms32031/tms32031.h3
-rw-r--r--src/devices/cpu/tms32051/32051ops.inc245
-rw-r--r--src/devices/cpu/tms32051/dis32051.cpp170
-rw-r--r--src/devices/cpu/tms32051/tms32051.cpp62
-rw-r--r--src/devices/cpu/tms32051/tms32051.h12
-rw-r--r--src/devices/cpu/tms32082/dis_mp.cpp9
-rw-r--r--src/devices/cpu/tms32082/dis_pp.cpp2
-rw-r--r--src/devices/cpu/tms32082/mp_ops.cpp38
-rw-r--r--src/devices/cpu/tms32082/tms32082.cpp88
-rw-r--r--src/devices/cpu/tms32082/tms32082.h8
-rw-r--r--src/devices/cpu/tms34010/tms34010.cpp9
-rw-r--r--src/devices/cpu/tms34010/tms34010.h2
-rw-r--r--src/devices/cpu/tms57002/tms57002.h2
-rw-r--r--src/devices/cpu/tms7000/tms7000.cpp2
-rw-r--r--src/devices/cpu/tms7000/tms7000.h2
-rw-r--r--src/devices/cpu/tms9900/tms9900.cpp8
-rw-r--r--src/devices/cpu/tms9900/tms9900.h8
-rw-r--r--src/devices/cpu/tms9900/tms9995.cpp12
-rw-r--r--src/devices/cpu/tms9900/tms9995.h2
-rw-r--r--src/devices/cpu/ucom4/ucom4.cpp2
-rw-r--r--src/devices/cpu/ucom4/ucom4.h3
-rw-r--r--src/devices/cpu/uml.cpp11
-rw-r--r--src/devices/cpu/uml.h2
-rw-r--r--src/devices/cpu/upd7725/upd7725.cpp2
-rw-r--r--src/devices/cpu/upd7725/upd7725.h5
-rw-r--r--src/devices/cpu/upd7810/upd7810.cpp4
-rw-r--r--src/devices/cpu/upd7810/upd7810.h2
-rw-r--r--src/devices/cpu/v30mz/v30mz.cpp6
-rw-r--r--src/devices/cpu/v30mz/v30mz.h4
-rw-r--r--src/devices/cpu/v60/v60.cpp2
-rw-r--r--src/devices/cpu/v60/v60.h6
-rw-r--r--src/devices/cpu/v810/v810.cpp2
-rw-r--r--src/devices/cpu/v810/v810.h2
-rw-r--r--src/devices/cpu/vtlb.cpp2
-rw-r--r--src/devices/cpu/x86log.cpp122
-rw-r--r--src/devices/cpu/x86log.h126
-rw-r--r--src/devices/cpu/z180/z180.cpp10
-rw-r--r--src/devices/cpu/z180/z180.h2
-rw-r--r--src/devices/cpu/z180/z180dasm.cpp2
-rw-r--r--src/devices/cpu/z8/z8.cpp5
-rw-r--r--src/devices/cpu/z8/z8.h2
-rw-r--r--src/devices/cpu/z80/z80.cpp2
-rw-r--r--src/devices/cpu/z80/z80.h2
-rw-r--r--src/devices/cpu/z8000/z8000.cpp2
-rw-r--r--src/devices/cpu/z8000/z8000.h2
-rw-r--r--src/devices/imagedev/cassette.cpp1
-rw-r--r--src/devices/imagedev/chd_cd.cpp4
-rw-r--r--src/devices/imagedev/chd_cd.h2
-rw-r--r--src/devices/imagedev/diablo.cpp4
-rw-r--r--src/devices/imagedev/diablo.h2
-rw-r--r--src/devices/imagedev/flopdrv.cpp1
-rw-r--r--src/devices/imagedev/floppy.cpp9
-rw-r--r--src/devices/imagedev/floppy.h7
-rw-r--r--src/devices/imagedev/harddriv.cpp4
-rw-r--r--src/devices/imagedev/harddriv.h2
-rw-r--r--src/devices/machine/53c7xx.cpp2
-rw-r--r--src/devices/machine/53c810.cpp2
-rw-r--r--src/devices/machine/53c810.h6
-rw-r--r--src/devices/machine/6821pia.cpp2
-rw-r--r--src/devices/machine/68230pit.cpp2
-rw-r--r--src/devices/machine/68307.cpp2
-rw-r--r--src/devices/machine/68307.h1
-rw-r--r--src/devices/machine/74123.h2
-rw-r--r--src/devices/machine/adc1213x.cpp2
-rw-r--r--src/devices/machine/akiko.cpp10
-rw-r--r--src/devices/machine/akiko.h2
-rw-r--r--src/devices/machine/amigafdc.cpp14
-rw-r--r--src/devices/machine/at29x.cpp20
-rw-r--r--src/devices/machine/at29x.h4
-rw-r--r--src/devices/machine/atahle.h4
-rw-r--r--src/devices/machine/atapihle.cpp8
-rw-r--r--src/devices/machine/diablo_hd.cpp17
-rw-r--r--src/devices/machine/diablo_hd.h2
-rw-r--r--src/devices/machine/dp8390.h1
-rw-r--r--src/devices/machine/ds1315.cpp2
-rw-r--r--src/devices/machine/gayle.cpp2
-rw-r--r--src/devices/machine/hdc92x4.cpp10
-rw-r--r--src/devices/machine/i8255.cpp6
-rw-r--r--src/devices/machine/i8271.cpp1
-rw-r--r--src/devices/machine/i8271.h2
-rw-r--r--src/devices/machine/i8279.cpp6
-rw-r--r--src/devices/machine/i8279.h2
-rw-r--r--src/devices/machine/i8355.h1
-rw-r--r--src/devices/machine/idehd.cpp19
-rw-r--r--src/devices/machine/intelfsh.cpp11
-rw-r--r--src/devices/machine/intelfsh.h11
-rw-r--r--src/devices/machine/k053252.cpp21
-rw-r--r--src/devices/machine/k053252.h6
-rw-r--r--src/devices/machine/laserdsc.cpp14
-rw-r--r--src/devices/machine/laserdsc.h4
-rw-r--r--src/devices/machine/ldpr8210.cpp20
-rw-r--r--src/devices/machine/ldvp931.cpp2
-rw-r--r--src/devices/machine/mc68328.cpp2
-rw-r--r--src/devices/machine/mc68681.cpp4
-rw-r--r--src/devices/machine/microtch.h1
-rw-r--r--src/devices/machine/mos6526.cpp2
-rw-r--r--src/devices/machine/mos6530.cpp2
-rw-r--r--src/devices/machine/mos6530n.cpp2
-rw-r--r--src/devices/machine/ncr5380.cpp2
-rw-r--r--src/devices/machine/ncr5380n.cpp4
-rw-r--r--src/devices/machine/ncr5390.cpp2
-rw-r--r--src/devices/machine/netlist.h7
-rw-r--r--src/devices/machine/nscsi_bus.cpp2
-rw-r--r--src/devices/machine/pci.h4
-rw-r--r--src/devices/machine/pci9050.cpp2
-rw-r--r--src/devices/machine/pckeybrd.cpp14
-rw-r--r--src/devices/machine/pdc.cpp591
-rw-r--r--src/devices/machine/pdc.h118
-rw-r--r--src/devices/machine/pla.cpp2
-rw-r--r--src/devices/machine/roc10937.cpp2
-rw-r--r--src/devices/machine/roc10937.h2
-rw-r--r--src/devices/machine/rp5c15.h1
-rw-r--r--src/devices/machine/rp5h01.cpp9
-rw-r--r--src/devices/machine/rp5h01.h2
-rw-r--r--src/devices/machine/s2636.cpp56
-rw-r--r--src/devices/machine/s2636.h72
-rw-r--r--src/devices/machine/s3c2400.h2
-rw-r--r--src/devices/machine/s3c2410.h2
-rw-r--r--src/devices/machine/s3c2440.h2
-rw-r--r--src/devices/machine/s3c24xx.inc4
-rw-r--r--src/devices/machine/s3c44b0.cpp14
-rw-r--r--src/devices/machine/s3c44b0.h2
-rw-r--r--src/devices/machine/smc91c9x.cpp2
-rw-r--r--src/devices/machine/smpc.cpp12
-rw-r--r--src/devices/machine/steppers.cpp2
-rw-r--r--src/devices/machine/strata.cpp16
-rw-r--r--src/devices/machine/strata.h2
-rw-r--r--src/devices/machine/stvcd.cpp6
-rw-r--r--src/devices/machine/t10mmc.h5
-rw-r--r--src/devices/machine/t10sbc.h5
-rw-r--r--src/devices/machine/t10spc.h4
-rw-r--r--src/devices/machine/tc009xlvc.cpp2
-rw-r--r--src/devices/machine/tc009xlvc.h3
-rw-r--r--src/devices/machine/timekpr.cpp8
-rw-r--r--src/devices/machine/timekpr.h2
-rw-r--r--src/devices/machine/tms6100.cpp370
-rw-r--r--src/devices/machine/tms6100.h141
-rw-r--r--src/devices/machine/upd765.cpp3
-rw-r--r--src/devices/machine/v3021.h3
-rw-r--r--src/devices/machine/wd2010.cpp6
-rw-r--r--src/devices/machine/wd_fdc.cpp3
-rw-r--r--src/devices/machine/z80ctc.cpp2
-rw-r--r--src/devices/machine/z80dma.cpp2
-rw-r--r--src/devices/machine/z80scc.cpp51
-rw-r--r--src/devices/machine/z80scc.h4
-rw-r--r--src/devices/machine/z80sio.h6
-rw-r--r--src/devices/machine/z8536.cpp4
-rw-r--r--src/devices/sound/2610intf.cpp33
-rw-r--r--src/devices/sound/2610intf.h3
-rw-r--r--src/devices/sound/aica.cpp33
-rw-r--r--src/devices/sound/aica.h4
-rw-r--r--src/devices/sound/aicadsp.cpp6
-rw-r--r--src/devices/sound/beep.cpp31
-rw-r--r--src/devices/sound/beep.h5
-rw-r--r--src/devices/sound/c140.cpp58
-rw-r--r--src/devices/sound/c140.h5
-rw-r--r--src/devices/sound/cdda.cpp6
-rw-r--r--src/devices/sound/cdda.h2
-rw-r--r--src/devices/sound/cem3394.cpp22
-rw-r--r--src/devices/sound/cem3394.h4
-rw-r--r--src/devices/sound/disc_cls.h3
-rw-r--r--src/devices/sound/disc_dev.h3
-rw-r--r--src/devices/sound/disc_dev.inc2
-rw-r--r--src/devices/sound/disc_flt.h3
-rw-r--r--src/devices/sound/disc_mth.h3
-rw-r--r--src/devices/sound/disc_mth.inc2
-rw-r--r--src/devices/sound/disc_sys.inc2
-rw-r--r--src/devices/sound/disc_wav.h3
-rw-r--r--src/devices/sound/discrete.cpp9
-rw-r--r--src/devices/sound/discrete.h33
-rw-r--r--src/devices/sound/dmadac.cpp6
-rw-r--r--src/devices/sound/dmadac.h2
-rw-r--r--src/devices/sound/es5506.cpp63
-rw-r--r--src/devices/sound/es5506.h6
-rw-r--r--src/devices/sound/flt_rc.cpp2
-rw-r--r--src/devices/sound/flt_rc.h2
-rw-r--r--src/devices/sound/flt_vol.cpp2
-rw-r--r--src/devices/sound/flt_vol.h2
-rw-r--r--src/devices/sound/fm.cpp22
-rw-r--r--src/devices/sound/fm.h2
-rw-r--r--src/devices/sound/fm2612.cpp4
-rw-r--r--src/devices/sound/fmopl.cpp2
-rw-r--r--src/devices/sound/fmopl.h2
-rw-r--r--src/devices/sound/k005289.cpp14
-rw-r--r--src/devices/sound/k005289.h4
-rw-r--r--src/devices/sound/k007232.cpp2
-rw-r--r--src/devices/sound/k051649.cpp12
-rw-r--r--src/devices/sound/k051649.h4
-rw-r--r--src/devices/sound/k053260.cpp1
-rw-r--r--src/devices/sound/k053260.h4
-rw-r--r--src/devices/sound/k054539.cpp12
-rw-r--r--src/devices/sound/k054539.h2
-rw-r--r--src/devices/sound/k056800.cpp6
-rw-r--r--src/devices/sound/mos6560.cpp4
-rw-r--r--src/devices/sound/mos6560.h4
-rw-r--r--src/devices/sound/mos6581.cpp6
-rw-r--r--src/devices/sound/mos7360.cpp2
-rw-r--r--src/devices/sound/mos7360.h2
-rw-r--r--src/devices/sound/mpeg_audio.h6
-rw-r--r--src/devices/sound/msm5232.cpp2
-rw-r--r--src/devices/sound/msm5232.h2
-rw-r--r--src/devices/sound/multipcm.h1
-rw-r--r--src/devices/sound/namco.cpp31
-rw-r--r--src/devices/sound/namco.h3
-rw-r--r--src/devices/sound/pokey.cpp2
-rw-r--r--src/devices/sound/qs1000.cpp2
-rw-r--r--src/devices/sound/qs1000.h1
-rw-r--r--src/devices/sound/qsound.cpp4
-rw-r--r--src/devices/sound/qsound.h2
-rw-r--r--src/devices/sound/rf5c400.cpp26
-rw-r--r--src/devices/sound/rf5c400.h3
-rw-r--r--src/devices/sound/s14001a.cpp938
-rw-r--r--src/devices/sound/s14001a.h145
-rw-r--r--src/devices/sound/saa1099.cpp7
-rw-r--r--src/devices/sound/scsp.cpp29
-rw-r--r--src/devices/sound/scsp.h37
-rw-r--r--src/devices/sound/scspdsp.cpp8
-rw-r--r--src/devices/sound/segapcm.cpp12
-rw-r--r--src/devices/sound/segapcm.h2
-rw-r--r--src/devices/sound/sid.cpp8
-rw-r--r--src/devices/sound/sidvoice.cpp4
-rw-r--r--src/devices/sound/sn76477.cpp476
-rw-r--r--src/devices/sound/sn76477.h29
-rw-r--r--src/devices/sound/sn76496.cpp2
-rw-r--r--src/devices/sound/sp0256.cpp12
-rw-r--r--src/devices/sound/sp0256.h2
-rw-r--r--src/devices/sound/spu.cpp2
-rw-r--r--src/devices/sound/spu.h3
-rw-r--r--src/devices/sound/spureverb.h1
-rw-r--r--src/devices/sound/tiasound.cpp4
-rw-r--r--src/devices/sound/tms5110.cpp34
-rw-r--r--src/devices/sound/tms5110.h10
-rw-r--r--src/devices/sound/upd7759.cpp124
-rw-r--r--src/devices/sound/upd7759.h2
-rw-r--r--src/devices/sound/vrender0.cpp2
-rw-r--r--src/devices/sound/ym2151.cpp2
-rw-r--r--src/devices/sound/ym2151.h2
-rw-r--r--src/devices/sound/ym2413.cpp4
-rw-r--r--src/devices/sound/ym2413.h2
-rw-r--r--src/devices/sound/ymdeltat.cpp2
-rw-r--r--src/devices/sound/ymdeltat.h2
-rw-r--r--src/devices/sound/ymf262.cpp4
-rw-r--r--src/devices/sound/ymf262.h2
-rw-r--r--src/devices/sound/ymf271.cpp83
-rw-r--r--src/devices/sound/ymf271.h16
-rw-r--r--src/devices/sound/ymf278b.cpp12
-rw-r--r--src/devices/sound/ymf278b.h2
-rw-r--r--src/devices/sound/ymz280b.cpp21
-rw-r--r--src/devices/sound/ymz280b.h2
-rw-r--r--src/devices/sound/zsg2.cpp8
-rw-r--r--src/devices/sound/zsg2.h4
-rw-r--r--src/devices/video/315_5313.cpp86
-rw-r--r--src/devices/video/315_5313.h30
-rw-r--r--src/devices/video/clgd542x.cpp2
-rw-r--r--src/devices/video/ef9340_1.cpp2
-rw-r--r--src/devices/video/ef9365.cpp1197
-rw-r--r--src/devices/video/ef9365.h91
-rw-r--r--src/devices/video/epic12.cpp8
-rw-r--r--src/devices/video/epic12.h4
-rw-r--r--src/devices/video/fixfreq.cpp10
-rw-r--r--src/devices/video/fixfreq.h2
-rw-r--r--src/devices/video/gf4500.cpp8
-rw-r--r--src/devices/video/gf4500.h2
-rw-r--r--src/devices/video/h63484.cpp2
-rw-r--r--src/devices/video/hd44780.cpp2
-rw-r--r--src/devices/video/hd61830.cpp2
-rw-r--r--src/devices/video/hd63484.cpp4
-rw-r--r--src/devices/video/hd63484.h2
-rw-r--r--src/devices/video/huc6260.cpp2
-rw-r--r--src/devices/video/huc6260.h2
-rw-r--r--src/devices/video/huc6261.cpp2
-rw-r--r--src/devices/video/huc6261.h2
-rw-r--r--src/devices/video/huc6270.cpp4
-rw-r--r--src/devices/video/huc6270.h2
-rw-r--r--src/devices/video/i8244.cpp2
-rw-r--r--src/devices/video/i82730.cpp2
-rw-r--r--src/devices/video/i8275.cpp4
-rw-r--r--src/devices/video/m50458.cpp2
-rw-r--r--src/devices/video/m50458.h2
-rw-r--r--src/devices/video/mb_vcu.cpp8
-rw-r--r--src/devices/video/mb_vcu.h4
-rw-r--r--src/devices/video/mc6845.cpp2
-rw-r--r--src/devices/video/mc6847.h9
-rw-r--r--src/devices/video/mos6566.cpp2
-rw-r--r--src/devices/video/msm6222b.cpp2
-rw-r--r--src/devices/video/msm6222b.h1
-rw-r--r--src/devices/video/pc_vga.cpp4
-rw-r--r--src/devices/video/pcd8544.cpp226
-rw-r--r--src/devices/video/pcd8544.h72
-rw-r--r--src/devices/video/poly.h12
-rw-r--r--src/devices/video/polylgcy.cpp2
-rw-r--r--src/devices/video/psx.cpp6
-rw-r--r--src/devices/video/psx.h4
-rw-r--r--src/devices/video/ramdac.cpp2
-rw-r--r--src/devices/video/ramdac.h2
-rw-r--r--src/devices/video/snes_ppu.cpp36
-rw-r--r--src/devices/video/snes_ppu.h7
-rw-r--r--src/devices/video/stvvdp1.cpp20
-rw-r--r--src/devices/video/stvvdp2.cpp56
-rw-r--r--src/devices/video/tms3556.cpp4
-rw-r--r--src/devices/video/upd7220.cpp6
-rw-r--r--src/devices/video/upd7220.h4
-rw-r--r--src/devices/video/vic4567.cpp2
-rw-r--r--src/devices/video/vic4567.h2
-rw-r--r--src/devices/video/vooddefs.h201
-rw-r--r--src/devices/video/voodoo.cpp569
-rw-r--r--src/devices/video/voodoo_rast.inc493
-rw-r--r--src/emu/addrmap.cpp153
-rw-r--r--src/emu/addrmap.h7
-rw-r--r--src/emu/audit.cpp5
-rw-r--r--src/emu/bookkeeping.cpp215
-rw-r--r--src/emu/bookkeeping.h78
-rw-r--r--src/emu/cheat.cpp46
-rw-r--r--src/emu/cheat.h4
-rw-r--r--src/emu/clifront.cpp111
-rw-r--r--src/emu/clifront.h1
-rw-r--r--src/emu/config.cpp159
-rw-r--r--src/emu/config.h47
-rw-r--r--src/emu/crsshair.cpp334
-rw-r--r--src/emu/crsshair.h73
-rw-r--r--src/emu/debug/debugcmd.cpp1
-rw-r--r--src/emu/debug/debugcon.cpp4
-rw-r--r--src/emu/debug/debugcon.h4
-rw-r--r--src/emu/debug/debugcpu.cpp15
-rw-r--r--src/emu/debug/debugcpu.h2
-rw-r--r--src/emu/debug/dvbpoints.cpp1
-rw-r--r--src/emu/debug/dvbpoints.h4
-rw-r--r--src/emu/debug/dvdisasm.cpp3
-rw-r--r--src/emu/debug/dvmemory.cpp2
-rw-r--r--src/emu/debug/dvmemory.h4
-rw-r--r--src/emu/debug/dvstate.cpp2
-rw-r--r--src/emu/debugger.cpp120
-rw-r--r--src/emu/debugger.h30
-rw-r--r--src/emu/devdelegate.h5
-rw-r--r--src/emu/devfind.h7
-rw-r--r--src/emu/device.cpp20
-rw-r--r--src/emu/device.h12
-rw-r--r--src/emu/digfx.cpp2
-rw-r--r--src/emu/digfx.h6
-rw-r--r--src/emu/diimage.cpp113
-rw-r--r--src/emu/diimage.h8
-rw-r--r--src/emu/dimemory.cpp131
-rw-r--r--src/emu/dioutput.cpp14
-rw-r--r--src/emu/dislot.cpp16
-rw-r--r--src/emu/dislot.h2
-rw-r--r--src/emu/distate.cpp19
-rw-r--r--src/emu/distate.h8
-rw-r--r--src/emu/drawgfx.cpp52
-rw-r--r--src/emu/drawgfx.h46
-rw-r--r--src/emu/drivenum.h2
-rw-r--r--src/emu/driver.cpp19
-rw-r--r--src/emu/driver.h5
-rw-r--r--src/emu/emu.h4
-rw-r--r--src/emu/emualloc.h29
-rw-r--r--src/emu/emuopts.cpp24
-rw-r--r--src/emu/emuopts.h8
-rw-r--r--src/emu/fileio.cpp3
-rw-r--r--src/emu/gamedrv.h1
-rw-r--r--src/emu/hash.cpp40
-rw-r--r--src/emu/hash.h8
-rw-r--r--src/emu/hashfile.cpp4
-rw-r--r--src/emu/image.cpp286
-rw-r--r--src/emu/image.h33
-rw-r--r--src/emu/info.cpp18
-rw-r--r--src/emu/inpttype.h4
-rw-r--r--src/emu/input.cpp59
-rw-r--r--src/emu/input.h10
-rw-r--r--src/emu/ioport.cpp67
-rw-r--r--src/emu/ioport.h12
-rw-r--r--src/emu/luaengine.cpp17
-rw-r--r--src/emu/machine.cpp76
-rw-r--r--src/emu/machine.h65
-rw-r--r--src/emu/machine/generic.cpp289
-rw-r--r--src/emu/machine/generic.h69
-rw-r--r--src/emu/mame.cpp4
-rw-r--r--src/emu/mame.h2
-rw-r--r--src/emu/mconfig.cpp15
-rw-r--r--src/emu/memory.h10
-rw-r--r--src/emu/network.cpp60
-rw-r--r--src/emu/network.h18
-rw-r--r--src/emu/output.cpp223
-rw-r--r--src/emu/output.h148
-rw-r--r--src/emu/render.cpp20
-rw-r--r--src/emu/render.h6
-rw-r--r--src/emu/rendlay.cpp4
-rw-r--r--src/emu/romload.cpp538
-rw-r--r--src/emu/romload.h118
-rw-r--r--src/emu/screen.h5
-rw-r--r--src/emu/softlist.cpp4
-rw-r--r--src/emu/sound.cpp20
-rw-r--r--src/emu/sound.h6
-rw-r--r--src/emu/sound/filter.cpp2
-rw-r--r--src/emu/sound/filter.h2
-rw-r--r--src/emu/tilemap.cpp2
-rw-r--r--src/emu/tilemap.h4
-rw-r--r--src/emu/ui/filemngr.cpp4
-rw-r--r--src/emu/ui/imgcntrl.cpp18
-rw-r--r--src/emu/ui/inputmap.cpp6
-rw-r--r--src/emu/ui/mainmenu.cpp46
-rw-r--r--src/emu/ui/menu.cpp20
-rw-r--r--src/emu/ui/menu.h2
-rw-r--r--src/emu/ui/miscmenu.cpp19
-rw-r--r--src/emu/ui/miscmenu.h2
-rw-r--r--src/emu/ui/selgame.cpp14
-rw-r--r--src/emu/ui/sliders.cpp2
-rw-r--r--src/emu/ui/slotopt.cpp12
-rw-r--r--src/emu/ui/swlist.cpp2
-rw-r--r--src/emu/ui/ui.cpp111
-rw-r--r--src/emu/ui/ui.h2
-rw-r--r--src/emu/ui/videoopt.cpp2
-rw-r--r--src/emu/ui/viewgfx.cpp72
-rw-r--r--src/emu/uiinput.cpp255
-rw-r--r--src/emu/uiinput.h175
-rw-r--r--src/emu/validity.cpp96
-rw-r--r--src/emu/validity.h8
-rw-r--r--src/emu/video.cpp33
-rw-r--r--src/emu/video.h2
-rw-r--r--src/emu/video/vector.cpp4
-rw-r--r--src/emu/video/vector.h2
-rw-r--r--src/ldplayer/ldplayer.cpp24
-rw-r--r--src/lib/formats/bbc_dsk.cpp48
-rw-r--r--src/lib/formats/bbc_dsk.h16
-rw-r--r--src/lib/formats/cassimg.cpp2
-rw-r--r--src/lib/formats/cbm_crt.cpp7
-rw-r--r--src/lib/formats/cbm_crt.h2
-rw-r--r--src/lib/formats/ipf_dsk.cpp6
-rw-r--r--src/lib/netlist/build/makefile3
-rw-r--r--src/lib/netlist/plib/pfmtlog.cpp2
-rw-r--r--src/lib/netlist/prg/nltool.cpp8
-rw-r--r--src/lib/netlist/prg/nlwav.cpp8
-rw-r--r--src/lib/util/cdrom.cpp27
-rw-r--r--src/lib/util/corealloc.cpp432
-rw-r--r--src/lib/util/corealloc.h145
-rw-r--r--src/lib/util/corefile.cpp4
-rw-r--r--src/lib/util/corefile.h2
-rw-r--r--src/lib/util/corestr.cpp5
-rw-r--r--src/lib/util/corestr.h2
-rw-r--r--src/lib/util/coretmpl.h47
-rw-r--r--src/lib/util/hashing.cpp28
-rw-r--r--src/lib/util/hashing.h8
-rw-r--r--src/lib/util/options.cpp18
-rw-r--r--src/lib/util/options.h4
-rw-r--r--src/lib/util/tagmap.h2
-rw-r--r--src/mame/arcade.lst363
-rw-r--r--src/mame/audio/8080bw.cpp6
-rw-r--r--src/mame/audio/asteroid.cpp2
-rw-r--r--src/mame/audio/atarifb.cpp4
-rw-r--r--src/mame/audio/atarijsa.cpp8
-rw-r--r--src/mame/audio/bzone.cpp2
-rw-r--r--src/mame/audio/carnival.cpp247
-rw-r--r--src/mame/audio/cclimber.cpp27
-rw-r--r--src/mame/audio/cclimber.h5
-rw-r--r--src/mame/audio/cinemat.cpp4
-rw-r--r--src/mame/audio/copsnrob.cpp4
-rw-r--r--src/mame/audio/crbaloon.cpp2
-rw-r--r--src/mame/audio/cyberbal.cpp4
-rw-r--r--src/mame/audio/dcs.cpp99
-rw-r--r--src/mame/audio/dcs.h9
-rw-r--r--src/mame/audio/depthch.cpp25
-rw-r--r--src/mame/audio/dkong.cpp32
-rw-r--r--src/mame/audio/dragrace.cpp4
-rw-r--r--src/mame/audio/dsbz80.h1
-rw-r--r--src/mame/audio/exidy.h3
-rw-r--r--src/mame/audio/exidy440.cpp16
-rw-r--r--src/mame/audio/exidy440.h4
-rw-r--r--src/mame/audio/firetrk.cpp2
-rw-r--r--src/mame/audio/flower.cpp12
-rw-r--r--src/mame/audio/galaga.cpp2
-rw-r--r--src/mame/audio/geebee.cpp2
-rw-r--r--src/mame/audio/gomoku.cpp14
-rw-r--r--src/mame/audio/gottlieb.cpp4
-rw-r--r--src/mame/audio/hng64.cpp6
-rw-r--r--src/mame/audio/invinco.cpp29
-rw-r--r--src/mame/audio/laserbat.cpp409
-rw-r--r--src/mame/audio/leland.cpp2
-rw-r--r--src/mame/audio/lynx.cpp4
-rw-r--r--src/mame/audio/lynx.h4
-rw-r--r--src/mame/audio/m72.cpp15
-rw-r--r--src/mame/audio/m72.h2
-rw-r--r--src/mame/audio/m79amb.cpp4
-rw-r--r--src/mame/audio/mac.cpp4
-rw-r--r--src/mame/audio/madalien.cpp2
-rw-r--r--src/mame/audio/micro3d.cpp10
-rw-r--r--src/mame/audio/mw8080bw.cpp42
-rw-r--r--src/mame/audio/nitedrvr.cpp2
-rw-r--r--src/mame/audio/norautp.cpp2
-rw-r--r--src/mame/audio/orbit.cpp2
-rw-r--r--src/mame/audio/phoenix.cpp6
-rw-r--r--src/mame/audio/pleiads.cpp4
-rw-r--r--src/mame/audio/pleiads.h2
-rw-r--r--src/mame/audio/polepos.cpp2
-rw-r--r--src/mame/audio/polyplay.cpp2
-rw-r--r--src/mame/audio/poolshrk.cpp2
-rw-r--r--src/mame/audio/pulsar.cpp25
-rw-r--r--src/mame/audio/qix.cpp8
-rw-r--r--src/mame/audio/redbaron.cpp2
-rw-r--r--src/mame/audio/redbaron.h2
-rw-r--r--src/mame/audio/seibu.cpp22
-rw-r--r--src/mame/audio/seibu.h2
-rw-r--r--src/mame/audio/skydiver.cpp2
-rw-r--r--src/mame/audio/skyraid.cpp4
-rw-r--r--src/mame/audio/snes_snd.cpp4
-rw-r--r--src/mame/audio/snes_snd.h2
-rw-r--r--src/mame/audio/spiders.cpp4
-rw-r--r--src/mame/audio/sprint2.cpp2
-rw-r--r--src/mame/audio/sprint4.cpp2
-rw-r--r--src/mame/audio/sprint4.h2
-rw-r--r--src/mame/audio/sprint8.cpp2
-rw-r--r--src/mame/audio/starshp1.cpp2
-rw-r--r--src/mame/audio/subs.cpp2
-rw-r--r--src/mame/audio/suna8.cpp2
-rw-r--r--src/mame/audio/taito_zm.cpp4
-rw-r--r--src/mame/audio/taito_zm.h2
-rw-r--r--src/mame/audio/tank8.cpp2
-rw-r--r--src/mame/audio/trackfld.h2
-rw-r--r--src/mame/audio/triplhnt.cpp2
-rw-r--r--src/mame/audio/turbo.cpp4
-rw-r--r--src/mame/audio/tx1.cpp4
-rw-r--r--src/mame/audio/upd1771.cpp2
-rw-r--r--src/mame/audio/vboy.h3
-rw-r--r--src/mame/audio/vicdual.cpp2
-rw-r--r--src/mame/audio/videopin.cpp2
-rw-r--r--src/mame/audio/warpwarp.cpp2
-rw-r--r--src/mame/audio/warpwarp.h4
-rw-r--r--src/mame/audio/wiping.cpp14
-rw-r--r--src/mame/audio/wiping.h6
-rw-r--r--src/mame/drivers/1942.cpp2
-rw-r--r--src/mame/drivers/1943.cpp2
-rw-r--r--src/mame/drivers/20pacgal.cpp36
-rw-r--r--src/mame/drivers/24cdjuke.cpp2
-rw-r--r--src/mame/drivers/2mindril.cpp8
-rw-r--r--src/mame/drivers/30test.cpp10
-rw-r--r--src/mame/drivers/39in1.cpp2
-rw-r--r--src/mame/drivers/4004clk.cpp4
-rw-r--r--src/mame/drivers/40love.cpp13
-rw-r--r--src/mame/drivers/4dpi.cpp (renamed from src/mame/drivers/sgi_ip6.cpp)2
-rw-r--r--src/mame/drivers/4enraya.cpp3
-rw-r--r--src/mame/drivers/5clown.cpp8
-rw-r--r--src/mame/drivers/8080bw.cpp77
-rw-r--r--src/mame/drivers/88games.cpp4
-rw-r--r--src/mame/drivers/a2600.cpp1
-rw-r--r--src/mame/drivers/a5105.cpp3
-rw-r--r--src/mame/drivers/a7800.cpp3
-rw-r--r--src/mame/drivers/ace.cpp2
-rw-r--r--src/mame/drivers/acefruit.cpp4
-rw-r--r--src/mame/drivers/aces1.cpp4
-rw-r--r--src/mame/drivers/acommand.cpp4
-rw-r--r--src/mame/drivers/acrnsys1.cpp2
-rw-r--r--src/mame/drivers/age_candy.cpp11
-rw-r--r--src/mame/drivers/airbustr.cpp8
-rw-r--r--src/mame/drivers/albazc.cpp10
-rw-r--r--src/mame/drivers/albazg.cpp6
-rw-r--r--src/mame/drivers/aleck64.cpp7
-rw-r--r--src/mame/drivers/alesis.cpp34
-rw-r--r--src/mame/drivers/alg.cpp11
-rw-r--r--src/mame/drivers/aliens.cpp4
-rw-r--r--src/mame/drivers/allied.cpp42
-rw-r--r--src/mame/drivers/alpha68k.cpp2
-rw-r--r--src/mame/drivers/alphasma.cpp4
-rw-r--r--src/mame/drivers/alphatro.cpp3
-rw-r--r--src/mame/drivers/alto2.cpp10
-rw-r--r--src/mame/drivers/amaticmg.cpp18
-rw-r--r--src/mame/drivers/ambush.cpp4
-rw-r--r--src/mame/drivers/amerihok.cpp11
-rw-r--r--src/mame/drivers/amico2k.cpp2
-rw-r--r--src/mame/drivers/amiga.cpp26
-rw-r--r--src/mame/drivers/ampoker2.cpp20
-rw-r--r--src/mame/drivers/amusco.cpp1
-rw-r--r--src/mame/drivers/amust.cpp3
-rw-r--r--src/mame/drivers/apexc.cpp4
-rw-r--r--src/mame/drivers/apollo.cpp10
-rw-r--r--src/mame/drivers/apple2e.cpp40
-rw-r--r--src/mame/drivers/applix.cpp3
-rw-r--r--src/mame/drivers/aquarium.cpp8
-rw-r--r--src/mame/drivers/arabian.cpp4
-rw-r--r--src/mame/drivers/aristmk4.cpp60
-rw-r--r--src/mame/drivers/aristmk5.cpp80
-rw-r--r--src/mame/drivers/aristmk6.cpp2
-rw-r--r--src/mame/drivers/arkanoid.cpp215
-rw-r--r--src/mame/drivers/armedf.cpp20
-rw-r--r--src/mame/drivers/arsystems.cpp31
-rw-r--r--src/mame/drivers/asteroid.cpp4
-rw-r--r--src/mame/drivers/astinvad.cpp6
-rw-r--r--src/mame/drivers/astrafr.cpp8
-rw-r--r--src/mame/drivers/astrcorp.cpp38
-rw-r--r--src/mame/drivers/astrocde.cpp122
-rw-r--r--src/mame/drivers/astrof.cpp6
-rw-r--r--src/mame/drivers/atari400.cpp2
-rw-r--r--src/mame/drivers/atari_s1.cpp6
-rw-r--r--src/mame/drivers/atari_s2.cpp2
-rw-r--r--src/mame/drivers/atarifb.cpp2
-rw-r--r--src/mame/drivers/atarig1.cpp6
-rw-r--r--src/mame/drivers/atarigt.cpp4
-rw-r--r--src/mame/drivers/atarist.cpp2
-rw-r--r--src/mame/drivers/atarisy1.cpp2
-rw-r--r--src/mame/drivers/atarisy2.cpp8
-rw-r--r--src/mame/drivers/atarisy4.cpp20
-rw-r--r--src/mame/drivers/ataxx.cpp2
-rw-r--r--src/mame/drivers/atetris.cpp4
-rw-r--r--src/mame/drivers/atom.cpp94
-rw-r--r--src/mame/drivers/avalnche.cpp10
-rw-r--r--src/mame/drivers/avt.cpp1
-rw-r--r--src/mame/drivers/babbage.cpp4
-rw-r--r--src/mame/drivers/backfire.cpp32
-rw-r--r--src/mame/drivers/bagman.cpp34
-rw-r--r--src/mame/drivers/baraduke.cpp10
-rw-r--r--src/mame/drivers/barata.cpp29
-rw-r--r--src/mame/drivers/batman.cpp2
-rw-r--r--src/mame/drivers/battlane.cpp2
-rw-r--r--src/mame/drivers/battlera.cpp10
-rw-r--r--src/mame/drivers/battlnts.cpp4
-rw-r--r--src/mame/drivers/bbc.cpp217
-rw-r--r--src/mame/drivers/bbcbc.cpp4
-rw-r--r--src/mame/drivers/bbusters.cpp10
-rw-r--r--src/mame/drivers/beathead.cpp2
-rw-r--r--src/mame/drivers/berzerk.cpp94
-rw-r--r--src/mame/drivers/beta.cpp6
-rw-r--r--src/mame/drivers/bfcobra.cpp25
-rw-r--r--src/mame/drivers/bfm_sc1.cpp43
-rw-r--r--src/mame/drivers/bfm_sc2.cpp232
-rw-r--r--src/mame/drivers/bfm_sc4.cpp6240
-rw-r--r--src/mame/drivers/bfm_sc45_helper.cpp5
-rw-r--r--src/mame/drivers/bfm_sc4h.cpp22
-rw-r--r--src/mame/drivers/bfm_swp.cpp4
-rw-r--r--src/mame/drivers/bfmsys85.cpp97
-rw-r--r--src/mame/drivers/bigbord2.cpp7
-rw-r--r--src/mame/drivers/bigevglf.cpp2
-rw-r--r--src/mame/drivers/bingoc.cpp1
-rw-r--r--src/mame/drivers/bionicc.cpp5
-rw-r--r--src/mame/drivers/bitgraph.cpp2
-rw-r--r--src/mame/drivers/bladestl.cpp8
-rw-r--r--src/mame/drivers/blitz.cpp16
-rw-r--r--src/mame/drivers/blitz68k.cpp80
-rw-r--r--src/mame/drivers/blktiger.cpp6
-rw-r--r--src/mame/drivers/blockhl.cpp4
-rw-r--r--src/mame/drivers/blueprnt.cpp4
-rw-r--r--src/mame/drivers/bmcpokr.cpp9
-rw-r--r--src/mame/drivers/bmjr.cpp3
-rw-r--r--src/mame/drivers/bml3.cpp4
-rw-r--r--src/mame/drivers/bnstars.cpp4
-rw-r--r--src/mame/drivers/bob85.cpp2
-rw-r--r--src/mame/drivers/bottom9.cpp4
-rw-r--r--src/mame/drivers/boxer.cpp8
-rw-r--r--src/mame/drivers/br8641.cpp10
-rw-r--r--src/mame/drivers/buster.cpp1
-rw-r--r--src/mame/drivers/bw12.cpp5
-rw-r--r--src/mame/drivers/bwidow.cpp24
-rw-r--r--src/mame/drivers/by17.cpp52
-rw-r--r--src/mame/drivers/by35.cpp54
-rw-r--r--src/mame/drivers/by6803.cpp12
-rw-r--r--src/mame/drivers/byvid.cpp6
-rw-r--r--src/mame/drivers/bzone.cpp2
-rw-r--r--src/mame/drivers/c80.cpp2
-rw-r--r--src/mame/drivers/cabal.cpp4
-rw-r--r--src/mame/drivers/cabaret.cpp10
-rw-r--r--src/mame/drivers/calchase.cpp20
-rw-r--r--src/mame/drivers/calomega.cpp34
-rw-r--r--src/mame/drivers/canyon.cpp2
-rw-r--r--src/mame/drivers/cardline.cpp16
-rw-r--r--src/mame/drivers/casloopy.cpp28
-rw-r--r--src/mame/drivers/caswin.cpp18
-rw-r--r--src/mame/drivers/cave.cpp213
-rw-r--r--src/mame/drivers/cb2001.cpp2
-rw-r--r--src/mame/drivers/cball.cpp2
-rw-r--r--src/mame/drivers/cbasebal.cpp16
-rw-r--r--src/mame/drivers/cc40.cpp12
-rw-r--r--src/mame/drivers/ccastles.cpp10
-rw-r--r--src/mame/drivers/cchance.cpp4
-rw-r--r--src/mame/drivers/cclimber.cpp6
-rw-r--r--src/mame/drivers/ccs2810.cpp2
-rw-r--r--src/mame/drivers/cd2650.cpp3
-rw-r--r--src/mame/drivers/cdi.cpp772
-rw-r--r--src/mame/drivers/centiped.cpp6
-rw-r--r--src/mame/drivers/cesclass.cpp2
-rw-r--r--src/mame/drivers/cham24.cpp40
-rw-r--r--src/mame/drivers/champbwl.cpp14
-rw-r--r--src/mame/drivers/chance32.cpp26
-rw-r--r--src/mame/drivers/changela.cpp4
-rw-r--r--src/mame/drivers/chaos.cpp1
-rw-r--r--src/mame/drivers/chessmst.cpp20
-rw-r--r--src/mame/drivers/chesstrv.cpp10
-rw-r--r--src/mame/drivers/chexx.cpp20
-rw-r--r--src/mame/drivers/chihiro.cpp4
-rw-r--r--src/mame/drivers/chinsan.cpp10
-rw-r--r--src/mame/drivers/chqflag.cpp4
-rw-r--r--src/mame/drivers/chsuper.cpp46
-rw-r--r--src/mame/drivers/cidelsa.cpp6
-rw-r--r--src/mame/drivers/circusc.cpp2
-rw-r--r--src/mame/drivers/cischeat.cpp407
-rw-r--r--src/mame/drivers/cliffhgr.cpp4
-rw-r--r--src/mame/drivers/cloak.cpp4
-rw-r--r--src/mame/drivers/cloud9.cpp4
-rw-r--r--src/mame/drivers/clowndwn.cpp11
-rw-r--r--src/mame/drivers/cobra.cpp204
-rw-r--r--src/mame/drivers/cocoloco.cpp8
-rw-r--r--src/mame/drivers/coinmstr.cpp225
-rw-r--r--src/mame/drivers/coinmvga.cpp2
-rw-r--r--src/mame/drivers/combatsc.cpp4
-rw-r--r--src/mame/drivers/compis.cpp8
-rw-r--r--src/mame/drivers/contra.cpp4
-rw-r--r--src/mame/drivers/coolpool.cpp8
-rw-r--r--src/mame/drivers/coolridr.cpp41
-rw-r--r--src/mame/drivers/cops.cpp48
-rw-r--r--src/mame/drivers/copsnrob.cpp2
-rw-r--r--src/mame/drivers/corona.cpp18
-rw-r--r--src/mame/drivers/cosmicos.cpp26
-rw-r--r--src/mame/drivers/cp1.cpp12
-rw-r--r--src/mame/drivers/cps1.cpp114
-rw-r--r--src/mame/drivers/cps2.cpp70
-rw-r--r--src/mame/drivers/cps3.cpp106
-rw-r--r--src/mame/drivers/crimfght.cpp6
-rw-r--r--src/mame/drivers/csc.cpp61
-rw-r--r--src/mame/drivers/csplayh5.cpp1
-rw-r--r--src/mame/drivers/cubeqst.cpp11
-rw-r--r--src/mame/drivers/cubo.cpp13
-rw-r--r--src/mame/drivers/cultures.cpp2
-rw-r--r--src/mame/drivers/cvicny.cpp2
-rw-r--r--src/mame/drivers/cvs.cpp12
-rw-r--r--src/mame/drivers/d6800.cpp4
-rw-r--r--src/mame/drivers/dacholer.cpp8
-rw-r--r--src/mame/drivers/dai3wksi.cpp2
-rw-r--r--src/mame/drivers/darius.cpp10
-rw-r--r--src/mame/drivers/dassault.cpp2
-rw-r--r--src/mame/drivers/dblcrown.cpp30
-rw-r--r--src/mame/drivers/dblewing.cpp2
-rw-r--r--src/mame/drivers/dbz.cpp4
-rw-r--r--src/mame/drivers/dccons.cpp107
-rw-r--r--src/mame/drivers/ddenlovr.cpp120
-rw-r--r--src/mame/drivers/ddragon.cpp46
-rw-r--r--src/mame/drivers/ddribble.cpp4
-rw-r--r--src/mame/drivers/de_2.cpp19
-rw-r--r--src/mame/drivers/de_3.cpp16
-rw-r--r--src/mame/drivers/dec0.cpp148
-rw-r--r--src/mame/drivers/deco156.cpp8
-rw-r--r--src/mame/drivers/deco_ld.cpp2
-rw-r--r--src/mame/drivers/deco_mlc.cpp34
-rw-r--r--src/mame/drivers/decwritr.cpp17
-rw-r--r--src/mame/drivers/deshoros.cpp13
-rw-r--r--src/mame/drivers/destroyr.cpp10
-rw-r--r--src/mame/drivers/dgpix.cpp10
-rw-r--r--src/mame/drivers/didact.cpp720
-rw-r--r--src/mame/drivers/digel804.cpp8
-rw-r--r--src/mame/drivers/dim68k.cpp5
-rw-r--r--src/mame/drivers/discoboy.cpp1
-rw-r--r--src/mame/drivers/djboy.cpp4
-rw-r--r--src/mame/drivers/djmain.cpp24
-rw-r--r--src/mame/drivers/dkong.cpp25
-rw-r--r--src/mame/drivers/dlair.cpp10
-rw-r--r--src/mame/drivers/dmv.cpp2
-rw-r--r--src/mame/drivers/dolphunk.cpp2
-rw-r--r--src/mame/drivers/dooyong.cpp122
-rw-r--r--src/mame/drivers/dragrace.cpp14
-rw-r--r--src/mame/drivers/dreamwld.cpp22
-rw-r--r--src/mame/drivers/drgnmst.cpp6
-rw-r--r--src/mame/drivers/dunhuang.cpp3
-rw-r--r--src/mame/drivers/dvk_kcgd.cpp7
-rw-r--r--src/mame/drivers/dynax.cpp18
-rw-r--r--src/mame/drivers/eacc.cpp4
-rw-r--r--src/mame/drivers/ecoinf2.cpp52
-rw-r--r--src/mame/drivers/ecoinf3.cpp16
-rw-r--r--src/mame/drivers/ecoinfr.cpp10
-rw-r--r--src/mame/drivers/einstein.cpp4
-rw-r--r--src/mame/drivers/elecbowl.cpp4
-rw-r--r--src/mame/drivers/electron.cpp2
-rw-r--r--src/mame/drivers/elekscmp.cpp2
-rw-r--r--src/mame/drivers/elf.cpp2
-rw-r--r--src/mame/drivers/embargo.cpp2
-rw-r--r--src/mame/drivers/enmirage.cpp4
-rw-r--r--src/mame/drivers/eolith.cpp4
-rw-r--r--src/mame/drivers/eolith16.cpp8
-rw-r--r--src/mame/drivers/esqkt.cpp4
-rw-r--r--src/mame/drivers/esripsys.cpp14
-rw-r--r--src/mame/drivers/et3400.cpp4
-rw-r--r--src/mame/drivers/eti660.cpp2
-rw-r--r--src/mame/drivers/ettrivia.cpp2
-rw-r--r--src/mame/drivers/exedexes.cpp2
-rw-r--r--src/mame/drivers/exerion.cpp2
-rw-r--r--src/mame/drivers/exidy440.cpp2
-rw-r--r--src/mame/drivers/expro02.cpp32
-rw-r--r--src/mame/drivers/exterm.cpp4
-rw-r--r--src/mame/drivers/exzisus.cpp8
-rw-r--r--src/mame/drivers/famibox.cpp13
-rw-r--r--src/mame/drivers/fantland.cpp2
-rw-r--r--src/mame/drivers/fanucspmg.cpp31
-rw-r--r--src/mame/drivers/fastinvaders.cpp781
-rw-r--r--src/mame/drivers/fastlane.cpp4
-rw-r--r--src/mame/drivers/feversoc.cpp10
-rw-r--r--src/mame/drivers/fgoal.cpp2
-rw-r--r--src/mame/drivers/fidel6502.cpp601
-rw-r--r--src/mame/drivers/fidelz80.cpp1546
-rw-r--r--src/mame/drivers/finalizr.cpp4
-rw-r--r--src/mame/drivers/fireball.cpp62
-rw-r--r--src/mame/drivers/firebeat.cpp80
-rw-r--r--src/mame/drivers/firefox.cpp4
-rw-r--r--src/mame/drivers/firetrk.cpp58
-rw-r--r--src/mame/drivers/fitfight.cpp2
-rw-r--r--src/mame/drivers/flicker.cpp2
-rw-r--r--src/mame/drivers/flkatck.cpp4
-rw-r--r--src/mame/drivers/flower.cpp4
-rw-r--r--src/mame/drivers/flyball.cpp4
-rw-r--r--src/mame/drivers/fm7.cpp76
-rw-r--r--src/mame/drivers/fmtowns.cpp16
-rw-r--r--src/mame/drivers/foodf.cpp8
-rw-r--r--src/mame/drivers/fortecar.cpp2
-rw-r--r--src/mame/drivers/fp1100.cpp3
-rw-r--r--src/mame/drivers/fp200.cpp8
-rw-r--r--src/mame/drivers/freekick.cpp2
-rw-r--r--src/mame/drivers/fromanc2.cpp6
-rw-r--r--src/mame/drivers/funkball.cpp9
-rw-r--r--src/mame/drivers/funkybee.cpp2
-rw-r--r--src/mame/drivers/funworld.cpp69
-rw-r--r--src/mame/drivers/g627.cpp20
-rw-r--r--src/mame/drivers/gaelco.cpp4
-rw-r--r--src/mame/drivers/gaelco2.cpp101
-rw-r--r--src/mame/drivers/gaelco3d.cpp6
-rw-r--r--src/mame/drivers/gal3.cpp2
-rw-r--r--src/mame/drivers/galaga.cpp10
-rw-r--r--src/mame/drivers/galastrm.cpp8
-rw-r--r--src/mame/drivers/galaxi.cpp95
-rw-r--r--src/mame/drivers/galaxia.cpp8
-rw-r--r--src/mame/drivers/galaxian.cpp113
-rw-r--r--src/mame/drivers/galpani2.cpp8
-rw-r--r--src/mame/drivers/galpani3.cpp6
-rw-r--r--src/mame/drivers/galpanic.cpp8
-rw-r--r--src/mame/drivers/gamate.cpp25
-rw-r--r--src/mame/drivers/gambl186.cpp1
-rw-r--r--src/mame/drivers/gamecstl.cpp8
-rw-r--r--src/mame/drivers/gameking.cpp40
-rw-r--r--src/mame/drivers/gameplan.cpp2
-rw-r--r--src/mame/drivers/gaplus.cpp10
-rw-r--r--src/mame/drivers/gatron.cpp18
-rw-r--r--src/mame/drivers/gberet.cpp8
-rw-r--r--src/mame/drivers/gcpinbal.cpp4
-rw-r--r--src/mame/drivers/gei.cpp36
-rw-r--r--src/mame/drivers/geneve.cpp10
-rw-r--r--src/mame/drivers/ggconnie.cpp4
-rw-r--r--src/mame/drivers/gkigt.cpp379
-rw-r--r--src/mame/drivers/glasgow.cpp36
-rw-r--r--src/mame/drivers/glass.cpp30
-rw-r--r--src/mame/drivers/gluck2.cpp6
-rw-r--r--src/mame/drivers/gng.cpp2
-rw-r--r--src/mame/drivers/goldnpkr.cpp34
-rw-r--r--src/mame/drivers/goldstar.cpp70
-rw-r--r--src/mame/drivers/gottlieb.cpp14
-rw-r--r--src/mame/drivers/gp32.cpp4
-rw-r--r--src/mame/drivers/gp_1.cpp10
-rw-r--r--src/mame/drivers/gp_2.cpp12
-rw-r--r--src/mame/drivers/gradius3.cpp4
-rw-r--r--src/mame/drivers/grchamp.cpp8
-rw-r--r--src/mame/drivers/gridlee.cpp11
-rw-r--r--src/mame/drivers/groundfx.cpp8
-rw-r--r--src/mame/drivers/gticlub.cpp10
-rw-r--r--src/mame/drivers/gts1.cpp8
-rw-r--r--src/mame/drivers/gts3.cpp2
-rw-r--r--src/mame/drivers/gts3a.cpp2
-rw-r--r--src/mame/drivers/gts80.cpp6
-rw-r--r--src/mame/drivers/gts80a.cpp6
-rw-r--r--src/mame/drivers/gts80b.cpp2
-rw-r--r--src/mame/drivers/gunbustr.cpp14
-rw-r--r--src/mame/drivers/gundealr.cpp47
-rw-r--r--src/mame/drivers/gunpey.cpp4
-rw-r--r--src/mame/drivers/gunsmoke.cpp2
-rw-r--r--src/mame/drivers/h19.cpp3
-rw-r--r--src/mame/drivers/h8.cpp15
-rw-r--r--src/mame/drivers/halleys.cpp30
-rw-r--r--src/mame/drivers/hankin.cpp4
-rw-r--r--src/mame/drivers/harddriv.cpp20
-rw-r--r--src/mame/drivers/hcastle.cpp4
-rw-r--r--src/mame/drivers/hexion.cpp4
-rw-r--r--src/mame/drivers/hh_cop400.cpp22
-rw-r--r--src/mame/drivers/hh_hmcs40.cpp84
-rw-r--r--src/mame/drivers/hh_melps4.cpp10
-rw-r--r--src/mame/drivers/hh_pic16.cpp8
-rw-r--r--src/mame/drivers/hh_sm510.cpp8
-rw-r--r--src/mame/drivers/hh_tms1k.cpp437
-rw-r--r--src/mame/drivers/hh_ucom4.cpp48
-rw-r--r--src/mame/drivers/highvdeo.cpp40
-rw-r--r--src/mame/drivers/hitpoker.cpp13
-rw-r--r--src/mame/drivers/hk68v10.cpp8
-rw-r--r--src/mame/drivers/hng64.cpp10
-rw-r--r--src/mame/drivers/homedata.cpp4
-rw-r--r--src/mame/drivers/hornet.cpp37
-rw-r--r--src/mame/drivers/hp9845.cpp633
-rw-r--r--src/mame/drivers/hvyunit.cpp4
-rw-r--r--src/mame/drivers/hyperspt.cpp2
-rw-r--r--src/mame/drivers/ibmpcjr.cpp1
-rw-r--r--src/mame/drivers/ice_bozopail.cpp11
-rw-r--r--src/mame/drivers/icecold.cpp44
-rw-r--r--src/mame/drivers/ichiban.cpp2
-rw-r--r--src/mame/drivers/ie15.cpp25
-rw-r--r--src/mame/drivers/igs009.cpp24
-rw-r--r--src/mame/drivers/igs011.cpp104
-rw-r--r--src/mame/drivers/igs017.cpp36
-rw-r--r--src/mame/drivers/igspoker.cpp40
-rw-r--r--src/mame/drivers/ikki.cpp4
-rw-r--r--src/mame/drivers/imds2.cpp3
-rw-r--r--src/mame/drivers/imolagp.cpp2
-rw-r--r--src/mame/drivers/inder.cpp4
-rw-r--r--src/mame/drivers/indigo.cpp (renamed from src/mame/drivers/ip20.cpp)333
-rw-r--r--src/mame/drivers/indy_indigo2.cpp (renamed from src/mame/drivers/ip22.cpp)2
-rw-r--r--src/mame/drivers/instruct.cpp6
-rw-r--r--src/mame/drivers/iqblock.cpp2
-rw-r--r--src/mame/drivers/iris3130.cpp (renamed from src/mame/drivers/sgi_ip2.cpp)2
-rw-r--r--src/mame/drivers/iteagle.cpp6
-rw-r--r--src/mame/drivers/itech32.cpp12
-rw-r--r--src/mame/drivers/itech8.cpp50
-rw-r--r--src/mame/drivers/itt3030.cpp3
-rw-r--r--src/mame/drivers/jackal.cpp11
-rw-r--r--src/mame/drivers/jackie.cpp24
-rw-r--r--src/mame/drivers/jade.cpp1
-rw-r--r--src/mame/drivers/jaguar.cpp14
-rw-r--r--src/mame/drivers/jalmah.cpp26
-rw-r--r--src/mame/drivers/jangou.cpp4
-rw-r--r--src/mame/drivers/jankenmn.cpp40
-rw-r--r--src/mame/drivers/jchan.cpp36
-rw-r--r--src/mame/drivers/jclub2.cpp2
-rw-r--r--src/mame/drivers/jedi.cpp2
-rw-r--r--src/mame/drivers/jeutel.cpp6
-rw-r--r--src/mame/drivers/jollyjgr.cpp2
-rw-r--r--src/mame/drivers/jongkyo.cpp2
-rw-r--r--src/mame/drivers/joystand.cpp14
-rw-r--r--src/mame/drivers/jp.cpp14
-rw-r--r--src/mame/drivers/jpmimpct.cpp43
-rw-r--r--src/mame/drivers/jpmmps.cpp446
-rw-r--r--src/mame/drivers/jpmsru.cpp1
-rw-r--r--src/mame/drivers/jpmsys5.cpp55
-rw-r--r--src/mame/drivers/jr100.cpp6
-rw-r--r--src/mame/drivers/jr200.cpp4
-rw-r--r--src/mame/drivers/jtc.cpp18
-rw-r--r--src/mame/drivers/jubilee.cpp19
-rw-r--r--src/mame/drivers/juicebox.cpp10
-rw-r--r--src/mame/drivers/junior.cpp6
-rw-r--r--src/mame/drivers/junofrst.cpp2
-rw-r--r--src/mame/drivers/jupace.cpp1
-rw-r--r--src/mame/drivers/k1003.cpp4
-rw-r--r--src/mame/drivers/kaneko16.cpp314
-rw-r--r--src/mame/drivers/kangaroo.cpp4
-rw-r--r--src/mame/drivers/kas89.cpp90
-rw-r--r--src/mame/drivers/kaypro.cpp4
-rw-r--r--src/mame/drivers/kenseim.cpp22
-rw-r--r--src/mame/drivers/kim1.cpp4
-rw-r--r--src/mame/drivers/kingdrby.cpp4
-rw-r--r--src/mame/drivers/klax.cpp10
-rw-r--r--src/mame/drivers/konamigx.cpp94
-rw-r--r--src/mame/drivers/konamim2.cpp3
-rw-r--r--src/mame/drivers/kopunch.cpp6
-rw-r--r--src/mame/drivers/korgm1.cpp1
-rw-r--r--src/mame/drivers/ksys573.cpp222
-rw-r--r--src/mame/drivers/kungfur.cpp12
-rw-r--r--src/mame/drivers/kurukuru.cpp27
-rw-r--r--src/mame/drivers/kyugo.cpp2
-rw-r--r--src/mame/drivers/labyrunr.cpp4
-rw-r--r--src/mame/drivers/laser3k.cpp8
-rw-r--r--src/mame/drivers/laserbas.cpp1
-rw-r--r--src/mame/drivers/laserbat.cpp1049
-rw-r--r--src/mame/drivers/laz_aftrshok.cpp15
-rw-r--r--src/mame/drivers/laz_awetoss.cpp13
-rw-r--r--src/mame/drivers/laz_ribrac.cpp11
-rw-r--r--src/mame/drivers/lc80.cpp4
-rw-r--r--src/mame/drivers/legionna.cpp68
-rw-r--r--src/mame/drivers/leland.cpp2
-rw-r--r--src/mame/drivers/lethal.cpp2
-rw-r--r--src/mame/drivers/lethalj.cpp20
-rw-r--r--src/mame/drivers/liberatr.cpp60
-rw-r--r--src/mame/drivers/limenko.cpp2
-rw-r--r--src/mame/drivers/lkage.cpp2
-rw-r--r--src/mame/drivers/lockon.cpp8
-rw-r--r--src/mame/drivers/lordgun.cpp6
-rw-r--r--src/mame/drivers/ltd.cpp102
-rw-r--r--src/mame/drivers/luckgrln.cpp32
-rw-r--r--src/mame/drivers/lucky74.cpp24
-rw-r--r--src/mame/drivers/lwings.cpp6
-rw-r--r--src/mame/drivers/m107.cpp4
-rw-r--r--src/mame/drivers/m14.cpp1
-rw-r--r--src/mame/drivers/m20.cpp1
-rw-r--r--src/mame/drivers/m58.cpp46
-rw-r--r--src/mame/drivers/m63.cpp10
-rw-r--r--src/mame/drivers/m72.cpp18
-rw-r--r--src/mame/drivers/m79amb.cpp2
-rw-r--r--src/mame/drivers/m90.cpp4
-rw-r--r--src/mame/drivers/m92.cpp17
-rw-r--r--src/mame/drivers/mac.cpp5
-rw-r--r--src/mame/drivers/macs.cpp12
-rw-r--r--src/mame/drivers/madmotor.cpp2
-rw-r--r--src/mame/drivers/magic10.cpp20
-rw-r--r--src/mame/drivers/magicfly.cpp6
-rw-r--r--src/mame/drivers/magictg.cpp1
-rw-r--r--src/mame/drivers/mainevt.cpp12
-rw-r--r--src/mame/drivers/majorpkr.cpp34
-rw-r--r--src/mame/drivers/malzak.cpp10
-rw-r--r--src/mame/drivers/mappy.cpp8
-rw-r--r--src/mame/drivers/marinedt.cpp12
-rw-r--r--src/mame/drivers/marywu.cpp217
-rw-r--r--src/mame/drivers/maxaflex.cpp28
-rw-r--r--src/mame/drivers/maygay1b.cpp28
-rw-r--r--src/mame/drivers/maygayv1.cpp16
-rw-r--r--src/mame/drivers/mazerbla.cpp25
-rw-r--r--src/mame/drivers/mbdtower.cpp10
-rw-r--r--src/mame/drivers/mcatadv.cpp8
-rw-r--r--src/mame/drivers/mcr.cpp30
-rw-r--r--src/mame/drivers/mcr3.cpp16
-rw-r--r--src/mame/drivers/meadwttl.cpp6
-rw-r--r--src/mame/drivers/mediagx.cpp13
-rw-r--r--src/mame/drivers/megadriv.cpp66
-rw-r--r--src/mame/drivers/megaplay.cpp8
-rw-r--r--src/mame/drivers/megasys1.cpp64
-rw-r--r--src/mame/drivers/megatech.cpp12
-rw-r--r--src/mame/drivers/megazone.cpp2
-rw-r--r--src/mame/drivers/mekd2.cpp2
-rw-r--r--src/mame/drivers/mephisto.cpp24
-rw-r--r--src/mame/drivers/merit.cpp28
-rw-r--r--src/mame/drivers/meritm.cpp26
-rw-r--r--src/mame/drivers/metro.cpp112
-rw-r--r--src/mame/drivers/mexico86.cpp74
-rw-r--r--src/mame/drivers/meyc8080.cpp30
-rw-r--r--src/mame/drivers/meyc8088.cpp4
-rw-r--r--src/mame/drivers/mgames.cpp24
-rw-r--r--src/mame/drivers/mgavegas.cpp64
-rw-r--r--src/mame/drivers/mgolf.cpp2
-rw-r--r--src/mame/drivers/micral.cpp3
-rw-r--r--src/mame/drivers/microdec.cpp4
-rw-r--r--src/mame/drivers/micronic.cpp2
-rw-r--r--src/mame/drivers/micropin.cpp16
-rw-r--r--src/mame/drivers/midas.cpp6
-rw-r--r--src/mame/drivers/midqslvr.cpp56
-rw-r--r--src/mame/drivers/midzeus.cpp7
-rw-r--r--src/mame/drivers/mikie.cpp2
-rw-r--r--src/mame/drivers/mil4000.cpp18
-rw-r--r--src/mame/drivers/miniboy7.cpp12
-rw-r--r--src/mame/drivers/minicom.cpp4
-rw-r--r--src/mame/drivers/mirax.cpp4
-rw-r--r--src/mame/drivers/missile.cpp11
-rw-r--r--src/mame/drivers/mjsister.cpp8
-rw-r--r--src/mame/drivers/mk1.cpp4
-rw-r--r--src/mame/drivers/mk14.cpp2
-rw-r--r--src/mame/drivers/mk2.cpp10
-rw-r--r--src/mame/drivers/mkit09.cpp2
-rw-r--r--src/mame/drivers/mlanding.cpp8
-rw-r--r--src/mame/drivers/mmd1.cpp56
-rw-r--r--src/mame/drivers/mmodular.cpp76
-rw-r--r--src/mame/drivers/model1.cpp12
-rw-r--r--src/mame/drivers/model2.cpp4
-rw-r--r--src/mame/drivers/model3.cpp10
-rw-r--r--src/mame/drivers/molecular.cpp8
-rw-r--r--src/mame/drivers/monty.cpp4
-rw-r--r--src/mame/drivers/monzagp.cpp185
-rw-r--r--src/mame/drivers/mpf1.cpp16
-rw-r--r--src/mame/drivers/mpu3.cpp90
-rw-r--r--src/mame/drivers/mpu4hw.cpp103
-rw-r--r--src/mame/drivers/mpu4vid.cpp5
-rw-r--r--src/mame/drivers/mpu5hw.cpp8
-rw-r--r--src/mame/drivers/mquake.cpp4
-rw-r--r--src/mame/drivers/mrgame.cpp4
-rw-r--r--src/mame/drivers/ms32.cpp2
-rw-r--r--src/mame/drivers/msisaac.cpp4
-rw-r--r--src/mame/drivers/msx.cpp2
-rw-r--r--src/mame/drivers/multfish.cpp70
-rw-r--r--src/mame/drivers/multi8.cpp3
-rw-r--r--src/mame/drivers/multigam.cpp78
-rw-r--r--src/mame/drivers/mvme350.cpp8
-rw-r--r--src/mame/drivers/mw18w.cpp8
-rw-r--r--src/mame/drivers/mw8080bw.cpp52
-rw-r--r--src/mame/drivers/mwsub.cpp10
-rw-r--r--src/mame/drivers/mz2000.cpp3
-rw-r--r--src/mame/drivers/mz2500.cpp50
-rw-r--r--src/mame/drivers/mz3500.cpp11
-rw-r--r--src/mame/drivers/n64.cpp6
-rw-r--r--src/mame/drivers/namcofl.cpp12
-rw-r--r--src/mame/drivers/namcoic.cpp4
-rw-r--r--src/mame/drivers/namcops2.cpp15
-rw-r--r--src/mame/drivers/namcos1.cpp6
-rw-r--r--src/mame/drivers/namcos10.cpp2
-rw-r--r--src/mame/drivers/namcos11.cpp8
-rw-r--r--src/mame/drivers/namcos12.cpp9
-rw-r--r--src/mame/drivers/namcos2.cpp87
-rw-r--r--src/mame/drivers/namcos21.cpp12
-rw-r--r--src/mame/drivers/namcos22.cpp8
-rw-r--r--src/mame/drivers/namcos23.cpp8
-rw-r--r--src/mame/drivers/namcos86.cpp26
-rw-r--r--src/mame/drivers/naomi.cpp353
-rw-r--r--src/mame/drivers/nbmj8688.cpp4
-rw-r--r--src/mame/drivers/nc.cpp2
-rw-r--r--src/mame/drivers/nemesis.cpp10
-rw-r--r--src/mame/drivers/neogeo.cpp26
-rw-r--r--src/mame/drivers/neogeo_noslot.cpp221
-rw-r--r--src/mame/drivers/nes.cpp6
-rw-r--r--src/mame/drivers/newbrain.cpp2
-rw-r--r--src/mame/drivers/ng_aes.cpp11
-rw-r--r--src/mame/drivers/nightgal.cpp8
-rw-r--r--src/mame/drivers/ninjakd2.cpp98
-rw-r--r--src/mame/drivers/niyanpai.cpp4
-rw-r--r--src/mame/drivers/nmk16.cpp6
-rw-r--r--src/mame/drivers/nokia_3310.cpp848
-rw-r--r--src/mame/drivers/norautp.cpp32
-rw-r--r--src/mame/drivers/nova2001.cpp25
-rw-r--r--src/mame/drivers/nsm.cpp2
-rw-r--r--src/mame/drivers/nsmpoker.cpp1
-rw-r--r--src/mame/drivers/nss.cpp8
-rw-r--r--src/mame/drivers/nwk-tr.cpp8
-rw-r--r--src/mame/drivers/ohmygod.cpp4
-rw-r--r--src/mame/drivers/ojankohs.cpp4
-rw-r--r--src/mame/drivers/omegrace.cpp12
-rw-r--r--src/mame/drivers/onetwo.cpp4
-rw-r--r--src/mame/drivers/opwolf.cpp2
-rw-r--r--src/mame/drivers/orbit.cpp10
-rw-r--r--src/mame/drivers/osi.cpp7
-rw-r--r--src/mame/drivers/othunder.cpp4
-rw-r--r--src/mame/drivers/overdriv.cpp6
-rw-r--r--src/mame/drivers/p2000t.cpp2
-rw-r--r--src/mame/drivers/p8k.cpp4
-rw-r--r--src/mame/drivers/pacland.cpp10
-rw-r--r--src/mame/drivers/pacman.cpp60
-rw-r--r--src/mame/drivers/palm.cpp2
-rw-r--r--src/mame/drivers/palmz22.cpp4
-rw-r--r--src/mame/drivers/pandoras.cpp4
-rw-r--r--src/mame/drivers/panicr.cpp15
-rw-r--r--src/mame/drivers/paradise.cpp2
-rw-r--r--src/mame/drivers/parodius.cpp4
-rw-r--r--src/mame/drivers/pasha2.cpp29
-rw-r--r--src/mame/drivers/paso1600.cpp3
-rw-r--r--src/mame/drivers/pasopia.cpp7
-rw-r--r--src/mame/drivers/pasopia7.cpp4
-rw-r--r--src/mame/drivers/patinho_feio.cpp136
-rw-r--r--src/mame/drivers/pb1000.cpp3
-rw-r--r--src/mame/drivers/pc100.cpp3
-rw-r--r--src/mame/drivers/pc1500.cpp28
-rw-r--r--src/mame/drivers/pc2000.cpp42
-rw-r--r--src/mame/drivers/pc4.cpp2
-rw-r--r--src/mame/drivers/pc6001.cpp3
-rw-r--r--src/mame/drivers/pc8801.cpp37
-rw-r--r--src/mame/drivers/pc88va.cpp1
-rw-r--r--src/mame/drivers/pc9801.cpp123
-rw-r--r--src/mame/drivers/pcat_nit.cpp8
-rw-r--r--src/mame/drivers/pce220.cpp74
-rw-r--r--src/mame/drivers/pcw.cpp13
-rw-r--r--src/mame/drivers/pcw16.cpp3
-rw-r--r--src/mame/drivers/pcxt.cpp4
-rw-r--r--src/mame/drivers/pengo.cpp2
-rw-r--r--src/mame/drivers/peoplepc.cpp2
-rw-r--r--src/mame/drivers/peplus.cpp3065
-rw-r--r--src/mame/drivers/peyper.cpp22
-rw-r--r--src/mame/drivers/pgm.cpp10
-rw-r--r--src/mame/drivers/phoenix.cpp2
-rw-r--r--src/mame/drivers/piggypas.cpp2
-rw-r--r--src/mame/drivers/pinball2k.cpp3
-rw-r--r--src/mame/drivers/pingpong.cpp4
-rw-r--r--src/mame/drivers/pipeline.cpp6
-rw-r--r--src/mame/drivers/pirates.cpp31
-rw-r--r--src/mame/drivers/pkscram.cpp2
-rw-r--r--src/mame/drivers/playmark.cpp24
-rw-r--r--src/mame/drivers/pluto5.cpp4
-rw-r--r--src/mame/drivers/plygonet.cpp4
-rw-r--r--src/mame/drivers/pmi80.cpp2
-rw-r--r--src/mame/drivers/polepos.cpp10
-rw-r--r--src/mame/drivers/poly880.cpp2
-rw-r--r--src/mame/drivers/polyplay.cpp4
-rw-r--r--src/mame/drivers/pong.cpp8
-rw-r--r--src/mame/drivers/poolshrk.cpp6
-rw-r--r--src/mame/drivers/popeye.cpp7
-rw-r--r--src/mame/drivers/portrait.cpp14
-rw-r--r--src/mame/drivers/powerbal.cpp2
-rw-r--r--src/mame/drivers/ppmast93.cpp4
-rw-r--r--src/mame/drivers/prestige.cpp42
-rw-r--r--src/mame/drivers/pro80.cpp12
-rw-r--r--src/mame/drivers/proconn.cpp16
-rw-r--r--src/mame/drivers/progolf.cpp6
-rw-r--r--src/mame/drivers/prophet600.cpp301
-rw-r--r--src/mame/drivers/pse.cpp50
-rw-r--r--src/mame/drivers/psikyo4.cpp2
-rw-r--r--src/mame/drivers/psion.cpp12
-rw-r--r--src/mame/drivers/psychic5.cpp38
-rw-r--r--src/mame/drivers/pturn.cpp2
-rw-r--r--src/mame/drivers/pve500.cpp5
-rw-r--r--src/mame/drivers/px4.cpp56
-rw-r--r--src/mame/drivers/px8.cpp6
-rw-r--r--src/mame/drivers/qix.cpp7
-rw-r--r--src/mame/drivers/quantum.cpp11
-rw-r--r--src/mame/drivers/queen.cpp16
-rw-r--r--src/mame/drivers/quizo.cpp6
-rw-r--r--src/mame/drivers/quizshow.cpp10
-rw-r--r--src/mame/drivers/qx10.cpp5
-rw-r--r--src/mame/drivers/r2dx_v33.cpp6
-rw-r--r--src/mame/drivers/r9751.cpp433
-rw-r--r--src/mame/drivers/rabbit.cpp22
-rw-r--r--src/mame/drivers/raiden.cpp7
-rw-r--r--src/mame/drivers/raiden2.cpp48
-rw-r--r--src/mame/drivers/rainbow.cpp76
-rw-r--r--src/mame/drivers/rallyx.cpp12
-rw-r--r--src/mame/drivers/rampart.cpp4
-rw-r--r--src/mame/drivers/rastan.cpp2
-rw-r--r--src/mame/drivers/rastersp.cpp10
-rw-r--r--src/mame/drivers/ravens.cpp6
-rw-r--r--src/mame/drivers/re900.cpp28
-rw-r--r--src/mame/drivers/retofinv.cpp4
-rw-r--r--src/mame/drivers/rex6000.cpp17
-rw-r--r--src/mame/drivers/rmhaihai.cpp4
-rw-r--r--src/mame/drivers/rockrage.cpp4
-rw-r--r--src/mame/drivers/rollerg.cpp4
-rw-r--r--src/mame/drivers/rollext.cpp392
-rw-r--r--src/mame/drivers/roul.cpp10
-rw-r--r--src/mame/drivers/rowamet.cpp4
-rw-r--r--src/mame/drivers/royalmah.cpp30
-rw-r--r--src/mame/drivers/rsc55.cpp4
-rw-r--r--src/mame/drivers/runaway.cpp2
-rw-r--r--src/mame/drivers/rungun.cpp50
-rw-r--r--src/mame/drivers/s11.cpp10
-rw-r--r--src/mame/drivers/s11a.cpp6
-rw-r--r--src/mame/drivers/s11b.cpp16
-rw-r--r--src/mame/drivers/s3.cpp8
-rw-r--r--src/mame/drivers/s4.cpp8
-rw-r--r--src/mame/drivers/s6.cpp8
-rw-r--r--src/mame/drivers/s6a.cpp8
-rw-r--r--src/mame/drivers/s7.cpp7
-rw-r--r--src/mame/drivers/s8.cpp7
-rw-r--r--src/mame/drivers/s8a.cpp7
-rw-r--r--src/mame/drivers/s9.cpp7
-rw-r--r--src/mame/drivers/safarir.cpp12
-rw-r--r--src/mame/drivers/sage2.cpp2
-rw-r--r--src/mame/drivers/sam.cpp398
-rw-r--r--src/mame/drivers/sandscrp.cpp4
-rw-r--r--src/mame/drivers/sangho.cpp20
-rw-r--r--src/mame/drivers/sanremmg.cpp78
-rw-r--r--src/mame/drivers/sanremo.cpp14
-rw-r--r--src/mame/drivers/sansa_fuze.cpp68
-rw-r--r--src/mame/drivers/saturn.cpp12
-rw-r--r--src/mame/drivers/sauro.cpp8
-rw-r--r--src/mame/drivers/savia84.cpp4
-rw-r--r--src/mame/drivers/savquest.cpp44
-rw-r--r--src/mame/drivers/sbasketb.cpp2
-rw-r--r--src/mame/drivers/sbowling.cpp8
-rw-r--r--src/mame/drivers/sbrain.cpp3
-rw-r--r--src/mame/drivers/sbrkout.cpp10
-rw-r--r--src/mame/drivers/sc1.cpp8
-rw-r--r--src/mame/drivers/sc2.cpp20
-rw-r--r--src/mame/drivers/scm_500.cpp4
-rw-r--r--src/mame/drivers/scramble.cpp34
-rw-r--r--src/mame/drivers/scv.cpp1
-rw-r--r--src/mame/drivers/sderby.cpp30
-rw-r--r--src/mame/drivers/sdk85.cpp2
-rw-r--r--src/mame/drivers/sdk86.cpp2
-rw-r--r--src/mame/drivers/seabattl.cpp6
-rw-r--r--src/mame/drivers/seattle.cpp12
-rw-r--r--src/mame/drivers/sega_sawatte.cpp2
-rw-r--r--src/mame/drivers/segac2.cpp114
-rw-r--r--src/mame/drivers/segag80r.cpp6
-rw-r--r--src/mame/drivers/segag80v.cpp4
-rw-r--r--src/mame/drivers/segahang.cpp8
-rw-r--r--src/mame/drivers/segajw.cpp166
-rw-r--r--src/mame/drivers/segaorun.cpp22
-rw-r--r--src/mame/drivers/segas16a.cpp27
-rw-r--r--src/mame/drivers/segas16b.cpp42
-rw-r--r--src/mame/drivers/segas18.cpp114
-rw-r--r--src/mame/drivers/segas24.cpp6
-rw-r--r--src/mame/drivers/segas32.cpp100
-rw-r--r--src/mame/drivers/segaufo.cpp22
-rw-r--r--src/mame/drivers/segaxbd.cpp10
-rw-r--r--src/mame/drivers/segaybd.cpp134
-rw-r--r--src/mame/drivers/seibuspi.cpp4
-rw-r--r--src/mame/drivers/selz80.cpp2
-rw-r--r--src/mame/drivers/sengokmj.cpp6
-rw-r--r--src/mame/drivers/seta.cpp6
-rw-r--r--src/mame/drivers/seta2.cpp52
-rw-r--r--src/mame/drivers/sf.cpp10
-rw-r--r--src/mame/drivers/sfbonus.cpp125
-rw-r--r--src/mame/drivers/sfkick.cpp179
-rw-r--r--src/mame/drivers/sg1000a.cpp2
-rw-r--r--src/mame/drivers/shangha3.cpp24
-rw-r--r--src/mame/drivers/shanghai.cpp4
-rw-r--r--src/mame/drivers/shisen.cpp4
-rw-r--r--src/mame/drivers/shootout.cpp2
-rw-r--r--src/mame/drivers/shougi.cpp2
-rw-r--r--src/mame/drivers/sidearms.cpp2
-rw-r--r--src/mame/drivers/sigmab52.cpp8
-rw-r--r--src/mame/drivers/sigmab98.cpp48
-rw-r--r--src/mame/drivers/silkroad.cpp4
-rw-r--r--src/mame/drivers/simpsons.cpp2
-rw-r--r--src/mame/drivers/sitcom.cpp6
-rw-r--r--src/mame/drivers/skimaxx.cpp12
-rw-r--r--src/mame/drivers/skykid.cpp10
-rw-r--r--src/mame/drivers/skylncr.cpp3
-rw-r--r--src/mame/drivers/skyraid.cpp2
-rw-r--r--src/mame/drivers/slapshot.cpp8
-rw-r--r--src/mame/drivers/slc1.cpp6
-rw-r--r--src/mame/drivers/slotcarn.cpp6
-rw-r--r--src/mame/drivers/smc777.cpp39
-rw-r--r--src/mame/drivers/sms.cpp2
-rw-r--r--src/mame/drivers/smsmcorp.cpp26
-rw-r--r--src/mame/drivers/snes.cpp1
-rw-r--r--src/mame/drivers/snesb.cpp12
-rw-r--r--src/mame/drivers/snk.cpp107
-rw-r--r--src/mame/drivers/snookr10.cpp36
-rw-r--r--src/mame/drivers/snowbros.cpp19
-rw-r--r--src/mame/drivers/softbox.cpp6
-rw-r--r--src/mame/drivers/sonson.cpp4
-rw-r--r--src/mame/drivers/spaceg.cpp2
-rw-r--r--src/mame/drivers/spc1000.cpp34
-rw-r--r--src/mame/drivers/spc1500.cpp973
-rw-r--r--src/mame/drivers/spdodgeb.cpp5
-rw-r--r--src/mame/drivers/spectra.cpp2
-rw-r--r--src/mame/drivers/speedbal.cpp10
-rw-r--r--src/mame/drivers/speglsht.cpp4
-rw-r--r--src/mame/drivers/spiders.cpp2
-rw-r--r--src/mame/drivers/splash.cpp4
-rw-r--r--src/mame/drivers/splus.cpp66
-rw-r--r--src/mame/drivers/spoker.cpp26
-rw-r--r--src/mame/drivers/spool99.cpp2
-rw-r--r--src/mame/drivers/sprint2.cpp12
-rw-r--r--src/mame/drivers/sprint4.cpp12
-rw-r--r--src/mame/drivers/sprint8.cpp4
-rw-r--r--src/mame/drivers/spy.cpp4
-rw-r--r--src/mame/drivers/squale.cpp458
-rw-r--r--src/mame/drivers/srmp2.cpp12
-rw-r--r--src/mame/drivers/srmp5.cpp16
-rw-r--r--src/mame/drivers/srmp6.cpp18
-rw-r--r--src/mame/drivers/srumbler.cpp2
-rw-r--r--src/mame/drivers/sslam.cpp2
-rw-r--r--src/mame/drivers/sspeedr.cpp12
-rw-r--r--src/mame/drivers/ssv.cpp18
-rw-r--r--src/mame/drivers/st17xx.cpp186
-rw-r--r--src/mame/drivers/st_mp100.cpp12
-rw-r--r--src/mame/drivers/st_mp200.cpp38
-rw-r--r--src/mame/drivers/stactics.cpp2
-rw-r--r--src/mame/drivers/starshp1.cpp8
-rw-r--r--src/mame/drivers/starwars.cpp4
-rw-r--r--src/mame/drivers/stratos.cpp8
-rw-r--r--src/mame/drivers/studio2.cpp32
-rw-r--r--src/mame/drivers/stuntair.cpp4
-rw-r--r--src/mame/drivers/stv.cpp19
-rw-r--r--src/mame/drivers/su2000.cpp8
-rw-r--r--src/mame/drivers/subsino.cpp88
-rw-r--r--src/mame/drivers/subsino2.cpp162
-rw-r--r--src/mame/drivers/sun3.cpp84
-rw-r--r--src/mame/drivers/suna16.cpp18
-rw-r--r--src/mame/drivers/suna8.cpp75
-rw-r--r--src/mame/drivers/supdrapo.cpp4
-rw-r--r--src/mame/drivers/super80.cpp1
-rw-r--r--src/mame/drivers/superchs.cpp8
-rw-r--r--src/mame/drivers/supercon.cpp28
-rw-r--r--src/mame/drivers/superdq.cpp4
-rw-r--r--src/mame/drivers/superqix.cpp16
-rw-r--r--src/mame/drivers/supertnk.cpp8
-rw-r--r--src/mame/drivers/superwng.cpp4
-rw-r--r--src/mame/drivers/suprgolf.cpp24
-rw-r--r--src/mame/drivers/suprnova.cpp8
-rw-r--r--src/mame/drivers/suprridr.cpp2
-rw-r--r--src/mame/drivers/surpratk.cpp4
-rw-r--r--src/mame/drivers/svmu.cpp8
-rw-r--r--src/mame/drivers/swtpc.cpp1
-rw-r--r--src/mame/drivers/sym1.cpp2
-rw-r--r--src/mame/drivers/system1.cpp18
-rw-r--r--src/mame/drivers/system16.cpp12
-rw-r--r--src/mame/drivers/taito.cpp4
-rw-r--r--src/mame/drivers/taito_b.cpp10
-rw-r--r--src/mame/drivers/taito_f2.cpp41
-rw-r--r--src/mame/drivers/taito_f3.cpp59
-rw-r--r--src/mame/drivers/taito_l.cpp8
-rw-r--r--src/mame/drivers/taito_x.cpp16
-rw-r--r--src/mame/drivers/taito_z.cpp36
-rw-r--r--src/mame/drivers/taitojc.cpp77
-rw-r--r--src/mame/drivers/taitopjc.cpp457
-rw-r--r--src/mame/drivers/taitosj.cpp12
-rw-r--r--src/mame/drivers/taitotz.cpp709
-rw-r--r--src/mame/drivers/taitowlf.cpp8
-rw-r--r--src/mame/drivers/tamag1.cpp6
-rw-r--r--src/mame/drivers/tank8.cpp4
-rw-r--r--src/mame/drivers/tankbatt.cpp10
-rw-r--r--src/mame/drivers/tankbust.cpp4
-rw-r--r--src/mame/drivers/targeth.cpp8
-rw-r--r--src/mame/drivers/tasman.cpp87
-rw-r--r--src/mame/drivers/tavernie.cpp3
-rw-r--r--src/mame/drivers/tb303.cpp38
-rw-r--r--src/mame/drivers/tbowl.cpp2
-rw-r--r--src/mame/drivers/tec1.cpp4
-rw-r--r--src/mame/drivers/techno.cpp4
-rw-r--r--src/mame/drivers/tecnbras.cpp4
-rw-r--r--src/mame/drivers/tek405x.cpp6
-rw-r--r--src/mame/drivers/tekxp33x.cpp46
-rw-r--r--src/mame/drivers/tempest.cpp10
-rw-r--r--src/mame/drivers/tetrisp2.cpp38
-rw-r--r--src/mame/drivers/thayers.cpp6
-rw-r--r--src/mame/drivers/thedealr.cpp24
-rw-r--r--src/mame/drivers/thoop2.cpp7
-rw-r--r--src/mame/drivers/thunderj.cpp2
-rw-r--r--src/mame/drivers/thunderx.cpp12
-rw-r--r--src/mame/drivers/ti74.cpp2
-rw-r--r--src/mame/drivers/ti99_4p.cpp11
-rw-r--r--src/mame/drivers/ti99_4x.cpp10
-rw-r--r--src/mame/drivers/tiamc1.cpp4
-rw-r--r--src/mame/drivers/ticalc1x.cpp275
-rw-r--r--src/mame/drivers/tiki100.cpp4
-rw-r--r--src/mame/drivers/timeplt.cpp2
-rw-r--r--src/mame/drivers/timex.cpp8
-rw-r--r--src/mame/drivers/tispeak.cpp466
-rw-r--r--src/mame/drivers/tispellb.cpp437
-rw-r--r--src/mame/drivers/tk80.cpp4
-rw-r--r--src/mame/drivers/tm990189.cpp6
-rw-r--r--src/mame/drivers/tmc1800.cpp6
-rw-r--r--src/mame/drivers/tmc2000e.cpp2
-rw-r--r--src/mame/drivers/tmmjprd.cpp29
-rw-r--r--src/mame/drivers/tnzs.cpp6
-rw-r--r--src/mame/drivers/toaplan2.cpp14
-rw-r--r--src/mame/drivers/tomcat.cpp8
-rw-r--r--src/mame/drivers/tonton.cpp4
-rw-r--r--src/mame/drivers/toratora.cpp4
-rw-r--r--src/mame/drivers/tourtabl.cpp12
-rw-r--r--src/mame/drivers/tourvis.cpp676
-rw-r--r--src/mame/drivers/toypop.cpp6
-rw-r--r--src/mame/drivers/tp84.cpp7
-rw-r--r--src/mame/drivers/tr606.cpp130
-rw-r--r--src/mame/drivers/trackfld.cpp2
-rw-r--r--src/mame/drivers/triplhnt.cpp8
-rw-r--r--src/mame/drivers/trvquest.cpp2
-rw-r--r--src/mame/drivers/ts803.cpp531
-rw-r--r--src/mame/drivers/tsamurai.cpp2
-rw-r--r--src/mame/drivers/ttchamp.cpp7
-rw-r--r--src/mame/drivers/tubep.cpp6
-rw-r--r--src/mame/drivers/tumbleb.cpp13
-rw-r--r--src/mame/drivers/tunhunt.cpp6
-rw-r--r--src/mame/drivers/turbo.cpp22
-rw-r--r--src/mame/drivers/turrett.cpp8
-rw-r--r--src/mame/drivers/tutankhm.cpp2
-rw-r--r--src/mame/drivers/tvcapcom.cpp84
-rw-r--r--src/mame/drivers/twin16.cpp10
-rw-r--r--src/mame/drivers/twinkle.cpp24
-rw-r--r--src/mame/drivers/tx1.cpp12
-rw-r--r--src/mame/drivers/uapce.cpp2
-rw-r--r--src/mame/drivers/ultratnk.cpp10
-rw-r--r--src/mame/drivers/ultrsprt.cpp15
-rw-r--r--src/mame/drivers/umipoker.cpp24
-rw-r--r--src/mame/drivers/undrfire.cpp30
-rw-r--r--src/mame/drivers/unico.cpp12
-rw-r--r--src/mame/drivers/univac.cpp1
-rw-r--r--src/mame/drivers/unixpc.cpp8
-rw-r--r--src/mame/drivers/upscope.cpp2
-rw-r--r--src/mame/drivers/usgames.cpp10
-rw-r--r--src/mame/drivers/vamphalf.cpp12
-rw-r--r--src/mame/drivers/vboy.cpp32
-rw-r--r--src/mame/drivers/vcombat.cpp32
-rw-r--r--src/mame/drivers/vcs80.cpp2
-rw-r--r--src/mame/drivers/vd.cpp10
-rw-r--r--src/mame/drivers/vegaeo.cpp6
-rw-r--r--src/mame/drivers/vendetta.cpp4
-rw-r--r--src/mame/drivers/vicdual.cpp66
-rw-r--r--src/mame/drivers/victory.cpp8
-rw-r--r--src/mame/drivers/videopin.cpp14
-rw-r--r--src/mame/drivers/videopkr.cpp39
-rw-r--r--src/mame/drivers/vigilant.cpp8
-rw-r--r--src/mame/drivers/vii.cpp2
-rw-r--r--src/mame/drivers/vip.cpp6
-rw-r--r--src/mame/drivers/viper.cpp60
-rw-r--r--src/mame/drivers/vk100.cpp31
-rw-r--r--src/mame/drivers/vlc.cpp2
-rw-r--r--src/mame/drivers/voyager.cpp8
-rw-r--r--src/mame/drivers/vpoker.cpp8
-rw-r--r--src/mame/drivers/vsnes.cpp34
-rw-r--r--src/mame/drivers/vt100.cpp32
-rw-r--r--src/mame/drivers/vt240.cpp2
-rw-r--r--src/mame/drivers/wacky_gator.cpp12
-rw-r--r--src/mame/drivers/wallc.cpp4
-rw-r--r--src/mame/drivers/wangpc.cpp4
-rw-r--r--src/mame/drivers/warpwarp.cpp20
-rw-r--r--src/mame/drivers/wecleman.cpp4
-rw-r--r--src/mame/drivers/wheelfir.cpp22
-rw-r--r--src/mame/drivers/whitestar.cpp384
-rw-r--r--src/mame/drivers/wicat.cpp12
-rw-r--r--src/mame/drivers/wico.cpp10
-rw-r--r--src/mame/drivers/wildfire.cpp4
-rw-r--r--src/mame/drivers/wildpkr.cpp66
-rw-r--r--src/mame/drivers/williams.cpp24
-rw-r--r--src/mame/drivers/wink.cpp2
-rw-r--r--src/mame/drivers/witch.cpp45
-rw-r--r--src/mame/drivers/wiz.cpp2
-rw-r--r--src/mame/drivers/wolfpack.cpp23
-rw-r--r--src/mame/drivers/wpc_95.cpp6
-rw-r--r--src/mame/drivers/wpc_an.cpp40
-rw-r--r--src/mame/drivers/wpc_dot.cpp2
-rw-r--r--src/mame/drivers/wyvernf0.cpp12
-rw-r--r--src/mame/drivers/x07.cpp5
-rw-r--r--src/mame/drivers/x1.cpp48
-rw-r--r--src/mame/drivers/x68k.cpp30
-rw-r--r--src/mame/drivers/xain.cpp52
-rw-r--r--src/mame/drivers/xerox820.cpp3
-rw-r--r--src/mame/drivers/xexex.cpp4
-rw-r--r--src/mame/drivers/xmen.cpp2
-rw-r--r--src/mame/drivers/xtheball.cpp2
-rw-r--r--src/mame/drivers/xtom3d.cpp56
-rw-r--r--src/mame/drivers/xyonix.cpp8
-rw-r--r--src/mame/drivers/z100.cpp4
-rw-r--r--src/mame/drivers/z80dev.cpp2
-rw-r--r--src/mame/drivers/z9001.cpp3
-rw-r--r--src/mame/drivers/zac_1.cpp2
-rw-r--r--src/mame/drivers/zac_2.cpp2
-rw-r--r--src/mame/drivers/zac_proto.cpp6
-rw-r--r--src/mame/drivers/zaccaria.cpp4
-rw-r--r--src/mame/drivers/zapcomputer.cpp12
-rw-r--r--src/mame/drivers/zaxxon.cpp14
-rw-r--r--src/mame/drivers/zn.cpp8
-rw-r--r--src/mame/drivers/zodiack.cpp4
-rw-r--r--src/mame/drivers/zorba.cpp3
-rw-r--r--src/mame/drivers/zr107.cpp4
-rw-r--r--src/mame/drivers/zrt80.cpp3
-rw-r--r--src/mame/etc/template_cpu.cpp2
-rw-r--r--src/mame/etc/template_cpu.h24
-rw-r--r--src/mame/etc/template_driver.cpp4
-rw-r--r--src/mame/etc/template_readme.txt5
-rw-r--r--src/mame/includes/1942.h2
-rw-r--r--src/mame/includes/1943.h2
-rw-r--r--src/mame/includes/20pacgal.h1
-rw-r--r--src/mame/includes/3do.h6
-rw-r--r--src/mame/includes/40love.h14
-rw-r--r--src/mame/includes/4enraya.h19
-rw-r--r--src/mame/includes/8080bw.h5
-rw-r--r--src/mame/includes/abc1600.h7
-rw-r--r--src/mame/includes/abc80x.h4
-rw-r--r--src/mame/includes/aim65.h3
-rw-r--r--src/mame/includes/amstrad.h3
-rw-r--r--src/mame/includes/apollo.h12
-rw-r--r--src/mame/includes/apple2.h8
-rw-r--r--src/mame/includes/apple2gs.h4
-rw-r--r--src/mame/includes/apple3.h5
-rw-r--r--src/mame/includes/aquarium.h3
-rw-r--r--src/mame/includes/arabian.h4
-rw-r--r--src/mame/includes/arcadia.h2
-rw-r--r--src/mame/includes/argus.h5
-rw-r--r--src/mame/includes/arkanoid.h35
-rw-r--r--src/mame/includes/armedf.h2
-rw-r--r--src/mame/includes/asterix.h1
-rw-r--r--src/mame/includes/astrocde.h4
-rw-r--r--src/mame/includes/astrof.h2
-rw-r--r--src/mame/includes/at.h2
-rw-r--r--src/mame/includes/atarifb.h2
-rw-r--r--src/mame/includes/atarig1.h3
-rw-r--r--src/mame/includes/atarig42.h1
-rw-r--r--src/mame/includes/atarist.h1
-rw-r--r--src/mame/includes/atarisy1.h1
-rw-r--r--src/mame/includes/atom.h3
-rw-r--r--src/mame/includes/banctec.h2
-rw-r--r--src/mame/includes/battlane.h2
-rw-r--r--src/mame/includes/bbc.h10
-rw-r--r--src/mame/includes/beathead.h3
-rw-r--r--src/mame/includes/bebox.h2
-rw-r--r--src/mame/includes/bfm_sc45.h2
-rw-r--r--src/mame/includes/bigevglf.h4
-rw-r--r--src/mame/includes/bionicc.h5
-rw-r--r--src/mame/includes/bking.h7
-rw-r--r--src/mame/includes/blktiger.h4
-rw-r--r--src/mame/includes/blstroid.h1
-rw-r--r--src/mame/includes/brkthru.h1
-rw-r--r--src/mame/includes/btime.h42
-rw-r--r--src/mame/includes/bullet.h5
-rw-r--r--src/mame/includes/bwing.h1
-rw-r--r--src/mame/includes/cabal.h2
-rw-r--r--src/mame/includes/carpolo.h10
-rw-r--r--src/mame/includes/cave.h3
-rw-r--r--src/mame/includes/cbasebal.h5
-rw-r--r--src/mame/includes/cbm2.h2
-rw-r--r--src/mame/includes/ccastles.h4
-rw-r--r--src/mame/includes/cclimber.h2
-rw-r--r--src/mame/includes/cdi.h91
-rw-r--r--src/mame/includes/changela.h6
-rw-r--r--src/mame/includes/cheekyms.h2
-rw-r--r--src/mame/includes/chihiro.h19
-rw-r--r--src/mame/includes/cidelsa.h4
-rw-r--r--src/mame/includes/cischeat.h37
-rw-r--r--src/mame/includes/cloak.h6
-rw-r--r--src/mame/includes/cloud9.h2
-rw-r--r--src/mame/includes/coco.h1
-rw-r--r--src/mame/includes/combatsc.h2
-rw-r--r--src/mame/includes/compis.h8
-rw-r--r--src/mame/includes/comquest.h2
-rw-r--r--src/mame/includes/contra.h4
-rw-r--r--src/mame/includes/cosmic.h1
-rw-r--r--src/mame/includes/cps1.h27
-rw-r--r--src/mame/includes/cps3.h53
-rw-r--r--src/mame/includes/crgolf.h4
-rw-r--r--src/mame/includes/crshrace.h1
-rw-r--r--src/mame/includes/cvs.h1
-rw-r--r--src/mame/includes/cyberbal.h3
-rw-r--r--src/mame/includes/cybiko.h1
-rw-r--r--src/mame/includes/darius.h3
-rw-r--r--src/mame/includes/dbz.h1
-rw-r--r--src/mame/includes/dc.h1
-rw-r--r--src/mame/includes/dcheese.h2
-rw-r--r--src/mame/includes/ddragon3.h1
-rw-r--r--src/mame/includes/deco32.h4
-rw-r--r--src/mame/includes/deco_mlc.h7
-rw-r--r--src/mame/includes/dgn_beta.h1
-rw-r--r--src/mame/includes/dkong.h60
-rw-r--r--src/mame/includes/dogfgt.h2
-rw-r--r--src/mame/includes/dooyong.h9
-rw-r--r--src/mame/includes/dragrace.h2
-rw-r--r--src/mame/includes/drmicro.h2
-rw-r--r--src/mame/includes/dynax.h45
-rw-r--r--src/mame/includes/einstein.h2
-rw-r--r--src/mame/includes/eolith.h2
-rw-r--r--src/mame/includes/ep64.h2
-rw-r--r--src/mame/includes/equites.h2
-rw-r--r--src/mame/includes/esripsys.h16
-rw-r--r--src/mame/includes/exedexes.h2
-rw-r--r--src/mame/includes/exerion.h2
-rw-r--r--src/mame/includes/exidy440.h4
-rw-r--r--src/mame/includes/exp85.h1
-rw-r--r--src/mame/includes/exprraid.h1
-rw-r--r--src/mame/includes/fgoal.h2
-rw-r--r--src/mame/includes/fidelz80.h98
-rw-r--r--src/mame/includes/flower.h5
-rw-r--r--src/mame/includes/fm7.h134
-rw-r--r--src/mame/includes/fmtowns.h11
-rw-r--r--src/mame/includes/fromanc2.h4
-rw-r--r--src/mame/includes/fromance.h4
-rw-r--r--src/mame/includes/fuukifg3.h1
-rw-r--r--src/mame/includes/gaelco2.h13
-rw-r--r--src/mame/includes/gaelco3d.h10
-rw-r--r--src/mame/includes/galastrm.h5
-rw-r--r--src/mame/includes/galaxian.h4
-rw-r--r--src/mame/includes/galaxold.h7
-rw-r--r--src/mame/includes/gameplan.h2
-rw-r--r--src/mame/includes/gb.h2
-rw-r--r--src/mame/includes/gba.h6
-rw-r--r--src/mame/includes/gcpinbal.h3
-rw-r--r--src/mame/includes/glass.h2
-rw-r--r--src/mame/includes/goal92.h2
-rw-r--r--src/mame/includes/goldstar.h1
-rw-r--r--src/mame/includes/gomoku.h4
-rw-r--r--src/mame/includes/gottlieb.h2
-rw-r--r--src/mame/includes/gp32.h6
-rw-r--r--src/mame/includes/grchamp.h3
-rw-r--r--src/mame/includes/gridlee.h4
-rw-r--r--src/mame/includes/groundfx.h2
-rw-r--r--src/mame/includes/gstriker.h1
-rw-r--r--src/mame/includes/gsword.h1
-rw-r--r--src/mame/includes/gunbustr.h2
-rw-r--r--src/mame/includes/gunsmoke.h2
-rw-r--r--src/mame/includes/harddriv.h396
-rw-r--r--src/mame/includes/hh_tms1k.h8
-rw-r--r--src/mame/includes/hng64.h30
-rw-r--r--src/mame/includes/hp48.h3
-rw-r--r--src/mame/includes/huebler.h1
-rw-r--r--src/mame/includes/hyprduel.h8
-rw-r--r--src/mame/includes/intv.h18
-rw-r--r--src/mame/includes/inufuku.h2
-rw-r--r--src/mame/includes/irobot.h4
-rw-r--r--src/mame/includes/itech32.h6
-rw-r--r--src/mame/includes/jackal.h5
-rw-r--r--src/mame/includes/jaguar.h6
-rw-r--r--src/mame/includes/jpmimpct.h5
-rw-r--r--src/mame/includes/jpmsys5.h4
-rw-r--r--src/mame/includes/kaneko16.h5
-rw-r--r--src/mame/includes/kangaroo.h2
-rw-r--r--src/mame/includes/karnov.h2
-rw-r--r--src/mame/includes/kaypro.h1
-rw-r--r--src/mame/includes/kc.h1
-rw-r--r--src/mame/includes/kickgoal.h2
-rw-r--r--src/mame/includes/konamigx.h24
-rw-r--r--src/mame/includes/ladyfrog.h3
-rw-r--r--src/mame/includes/laserbat.h290
-rw-r--r--src/mame/includes/legionna.h12
-rw-r--r--src/mame/includes/leland.h6
-rw-r--r--src/mame/includes/lethalj.h2
-rw-r--r--src/mame/includes/liberate.h4
-rw-r--r--src/mame/includes/liberatr.h24
-rw-r--r--src/mame/includes/lisa.h3
-rw-r--r--src/mame/includes/lockon.h6
-rw-r--r--src/mame/includes/lordgun.h2
-rw-r--r--src/mame/includes/lwings.h2
-rw-r--r--src/mame/includes/m10.h2
-rw-r--r--src/mame/includes/m107.h25
-rw-r--r--src/mame/includes/m58.h14
-rw-r--r--src/mame/includes/m72.h5
-rw-r--r--src/mame/includes/m90.h1
-rw-r--r--src/mame/includes/m92.h2
-rw-r--r--src/mame/includes/mac.h7
-rw-r--r--src/mame/includes/macpci.h5
-rw-r--r--src/mame/includes/macrossp.h5
-rw-r--r--src/mame/includes/madalien.h2
-rw-r--r--src/mame/includes/magmax.h2
-rw-r--r--src/mame/includes/mappy.h2
-rw-r--r--src/mame/includes/matmania.h4
-rw-r--r--src/mame/includes/maygay1b.h4
-rw-r--r--src/mame/includes/mbc55x.h2
-rw-r--r--src/mame/includes/mc1000.h2
-rw-r--r--src/mame/includes/mcatadv.h5
-rw-r--r--src/mame/includes/mcr3.h1
-rw-r--r--src/mame/includes/mcr68.h2
-rw-r--r--src/mame/includes/md_cons.h9
-rw-r--r--src/mame/includes/megadriv.h3
-rw-r--r--src/mame/includes/megasys1.h18
-rw-r--r--src/mame/includes/megazone.h2
-rw-r--r--src/mame/includes/metlclsh.h2
-rw-r--r--src/mame/includes/metro.h4
-rw-r--r--src/mame/includes/mexico86.h1
-rw-r--r--src/mame/includes/micro3d.h8
-rw-r--r--src/mame/includes/microtan.h2
-rw-r--r--src/mame/includes/midtunit.h2
-rw-r--r--src/mame/includes/midvunit.h2
-rw-r--r--src/mame/includes/midyunit.h6
-rw-r--r--src/mame/includes/mikromik.h2
-rw-r--r--src/mame/includes/mitchell.h1
-rw-r--r--src/mame/includes/model1.h13
-rw-r--r--src/mame/includes/model2.h19
-rw-r--r--src/mame/includes/model3.h20
-rw-r--r--src/mame/includes/moo.h2
-rw-r--r--src/mame/includes/mpu4.h7
-rw-r--r--src/mame/includes/mpz80.h1
-rw-r--r--src/mame/includes/ms32.h2
-rw-r--r--src/mame/includes/msisaac.h5
-rw-r--r--src/mame/includes/mugsmash.h1
-rw-r--r--src/mame/includes/munchmo.h2
-rw-r--r--src/mame/includes/mw8080bw.h4
-rw-r--r--src/mame/includes/mystwarr.h1
-rw-r--r--src/mame/includes/mz700.h4
-rw-r--r--src/mame/includes/n64.h59
-rw-r--r--src/mame/includes/namcofl.h2
-rw-r--r--src/mame/includes/namcos2.h7
-rw-r--r--src/mame/includes/namcos21.h16
-rw-r--r--src/mame/includes/namcos22.h20
-rw-r--r--src/mame/includes/namcos86.h22
-rw-r--r--src/mame/includes/nb1414m4.h2
-rw-r--r--src/mame/includes/nbmj8688.h6
-rw-r--r--src/mame/includes/nbmj8891.h22
-rw-r--r--src/mame/includes/nbmj8900.h12
-rw-r--r--src/mame/includes/nbmj8991.h4
-rw-r--r--src/mame/includes/nbmj9195.h6
-rw-r--r--src/mame/includes/nc.h4
-rw-r--r--src/mame/includes/neogeo.h1
-rw-r--r--src/mame/includes/nes.h2
-rw-r--r--src/mame/includes/next.h4
-rw-r--r--src/mame/includes/ninjakd2.h8
-rw-r--r--src/mame/includes/niyanpai.h8
-rw-r--r--src/mame/includes/nmk16.h11
-rw-r--r--src/mame/includes/norautp.h2
-rw-r--r--src/mame/includes/nycaptor.h1
-rw-r--r--src/mame/includes/opwolf.h2
-rw-r--r--src/mame/includes/orbit.h2
-rw-r--r--src/mame/includes/othunder.h2
-rw-r--r--src/mame/includes/overdriv.h2
-rw-r--r--src/mame/includes/p2000t.h2
-rw-r--r--src/mame/includes/pacland.h2
-rw-r--r--src/mame/includes/pastelg.h2
-rw-r--r--src/mame/includes/pc1512.h4
-rw-r--r--src/mame/includes/pc8001.h1
-rw-r--r--src/mame/includes/pcw.h2
-rw-r--r--src/mame/includes/pcw16.h14
-rw-r--r--src/mame/includes/pdp1.h2
-rw-r--r--src/mame/includes/pecom.h2
-rw-r--r--src/mame/includes/pgm.h7
-rw-r--r--src/mame/includes/phoenix.h6
-rw-r--r--src/mame/includes/pitnrun.h2
-rw-r--r--src/mame/includes/pk8020.h2
-rw-r--r--src/mame/includes/playch10.h28
-rw-r--r--src/mame/includes/plus4.h3
-rw-r--r--src/mame/includes/poisk1.h2
-rw-r--r--src/mame/includes/policetr.h2
-rw-r--r--src/mame/includes/polyplay.h2
-rw-r--r--src/mame/includes/poolshrk.h2
-rw-r--r--src/mame/includes/popeye.h9
-rw-r--r--src/mame/includes/psikyo.h4
-rw-r--r--src/mame/includes/psikyosh.h4
-rw-r--r--src/mame/includes/psion.h2
-rw-r--r--src/mame/includes/px8.h1
-rw-r--r--src/mame/includes/qix.h7
-rw-r--r--src/mame/includes/ql.h2
-rw-r--r--src/mame/includes/quasar.h2
-rw-r--r--src/mame/includes/quizdna.h4
-rw-r--r--src/mame/includes/radio86.h2
-rw-r--r--src/mame/includes/raiden.h4
-rw-r--r--src/mame/includes/raiden2.h7
-rw-r--r--src/mame/includes/rastan.h2
-rw-r--r--src/mame/includes/rbisland.h2
-rw-r--r--src/mame/includes/realbrk.h4
-rw-r--r--src/mame/includes/redalert.h2
-rw-r--r--src/mame/includes/rltennis.h2
-rw-r--r--src/mame/includes/rm380z.h4
-rw-r--r--src/mame/includes/rmnimbus.h1
-rw-r--r--src/mame/includes/rungun.h31
-rw-r--r--src/mame/includes/s11.h4
-rw-r--r--src/mame/includes/sage2.h2
-rw-r--r--src/mame/includes/scramble.h4
-rw-r--r--src/mame/includes/segahang.h1
-rw-r--r--src/mame/includes/segas16b.h2
-rw-r--r--src/mame/includes/segas18.h1
-rw-r--r--src/mame/includes/segas24.h19
-rw-r--r--src/mame/includes/segas32.h12
-rw-r--r--src/mame/includes/segaxbd.h3
-rw-r--r--src/mame/includes/segaybd.h5
-rw-r--r--src/mame/includes/seibuspi.h10
-rw-r--r--src/mame/includes/seta2.h2
-rw-r--r--src/mame/includes/shadfrce.h2
-rw-r--r--src/mame/includes/sidearms.h2
-rw-r--r--src/mame/includes/simpl156.h6
-rw-r--r--src/mame/includes/simple_st0016.h1
-rw-r--r--src/mame/includes/simpsons.h5
-rw-r--r--src/mame/includes/skyraid.h2
-rw-r--r--src/mame/includes/slapshot.h4
-rw-r--r--src/mame/includes/sms.h4
-rw-r--r--src/mame/includes/snes.h4
-rw-r--r--src/mame/includes/sorcerer.h1
-rw-r--r--src/mame/includes/spacefb.h2
-rw-r--r--src/mame/includes/special.h2
-rw-r--r--src/mame/includes/speedatk.h2
-rw-r--r--src/mame/includes/sprint4.h3
-rw-r--r--src/mame/includes/sprint8.h2
-rw-r--r--src/mame/includes/srumbler.h2
-rw-r--r--src/mame/includes/sspeedr.h2
-rw-r--r--src/mame/includes/ssrj.h2
-rw-r--r--src/mame/includes/ssv.h7
-rw-r--r--src/mame/includes/ssystem3.h2
-rw-r--r--src/mame/includes/starcrus.h8
-rw-r--r--src/mame/includes/starshp1.h4
-rw-r--r--src/mame/includes/starwars.h8
-rw-r--r--src/mame/includes/stv.h25
-rw-r--r--src/mame/includes/suna16.h2
-rw-r--r--src/mame/includes/suna8.h4
-rw-r--r--src/mame/includes/super6.h1
-rw-r--r--src/mame/includes/super80.h1
-rw-r--r--src/mame/includes/superchs.h2
-rw-r--r--src/mame/includes/superqix.h4
-rw-r--r--src/mame/includes/suprslam.h1
-rw-r--r--src/mame/includes/svi318.h2
-rw-r--r--src/mame/includes/swtpc09.h3
-rw-r--r--src/mame/includes/system1.h8
-rw-r--r--src/mame/includes/system16.h1
-rw-r--r--src/mame/includes/taito_b.h10
-rw-r--r--src/mame/includes/taito_f2.h6
-rw-r--r--src/mame/includes/taito_f3.h18
-rw-r--r--src/mame/includes/taito_l.h1
-rw-r--r--src/mame/includes/taito_z.h3
-rw-r--r--src/mame/includes/taitoair.h6
-rw-r--r--src/mame/includes/taitojc.h62
-rw-r--r--src/mame/includes/tank8.h2
-rw-r--r--src/mame/includes/tankbust.h3
-rw-r--r--src/mame/includes/taotaido.h8
-rw-r--r--src/mame/includes/tatsumi.h6
-rw-r--r--src/mame/includes/tceptor.h4
-rw-r--r--src/mame/includes/tecmo.h1
-rw-r--r--src/mame/includes/tetrisp2.h2
-rw-r--r--src/mame/includes/thepit.h2
-rw-r--r--src/mame/includes/thief.h6
-rw-r--r--src/mame/includes/thomson.h3
-rw-r--r--src/mame/includes/thoop2.h2
-rw-r--r--src/mame/includes/ti85.h4
-rw-r--r--src/mame/includes/tiamc1.h3
-rw-r--r--src/mame/includes/tmnt.h1
-rw-r--r--src/mame/includes/tnzs.h5
-rw-r--r--src/mame/includes/toaplan1.h14
-rw-r--r--src/mame/includes/toaplan2.h1
-rw-r--r--src/mame/includes/tp84.h4
-rw-r--r--src/mame/includes/triplhnt.h2
-rw-r--r--src/mame/includes/trs80m2.h4
-rw-r--r--src/mame/includes/tryout.h4
-rw-r--r--src/mame/includes/tubep.h5
-rw-r--r--src/mame/includes/tumbleb.h1
-rw-r--r--src/mame/includes/tumblep.h4
-rw-r--r--src/mame/includes/turbo.h3
-rw-r--r--src/mame/includes/turrett.h4
-rw-r--r--src/mame/includes/twincobr.h8
-rw-r--r--src/mame/includes/tx0.h1
-rw-r--r--src/mame/includes/tx1.h8
-rw-r--r--src/mame/includes/ultratnk.h2
-rw-r--r--src/mame/includes/undrfire.h2
-rw-r--r--src/mame/includes/unico.h6
-rw-r--r--src/mame/includes/ut88.h2
-rw-r--r--src/mame/includes/v1050.h4
-rw-r--r--src/mame/includes/vc4000.h2
-rw-r--r--src/mame/includes/vertigo.h2
-rw-r--r--src/mame/includes/vic10.h5
-rw-r--r--src/mame/includes/vic20.h3
-rw-r--r--src/mame/includes/vicdual.h3
-rw-r--r--src/mame/includes/victory.h10
-rw-r--r--src/mame/includes/vigilant.h2
-rw-r--r--src/mame/includes/volfied.h4
-rw-r--r--src/mame/includes/vsnes.h27
-rw-r--r--src/mame/includes/wangpc.h1
-rw-r--r--src/mame/includes/williams.h8
-rw-r--r--src/mame/includes/wiz.h2
-rw-r--r--src/mame/includes/wolfpack.h15
-rw-r--r--src/mame/includes/wpc_pin.h1
-rw-r--r--src/mame/includes/wswan.h2
-rw-r--r--src/mame/includes/x1.h18
-rw-r--r--src/mame/includes/x68k.h11
-rw-r--r--src/mame/includes/xbox.h22
-rw-r--r--src/mame/includes/xerox820.h2
-rw-r--r--src/mame/includes/xexex.h2
-rw-r--r--src/mame/includes/xmen.h4
-rw-r--r--src/mame/includes/xor100.h1
-rw-r--r--src/mame/includes/zaxxon.h1
-rw-r--r--src/mame/includes/zx.h5
-rw-r--r--src/mame/layout/captflag.lay107
-rw-r--r--src/mame/layout/fidel_cc.lay69
-rw-r--r--src/mame/layout/fidel_fev.lay40
-rw-r--r--src/mame/layout/fidel_sc12.lay39
-rw-r--r--src/mame/layout/fidel_vbrc.lay (renamed from src/mame/layout/bridgec3.lay)48
-rw-r--r--src/mame/layout/fidel_vcc.lay67
-rw-r--r--src/mame/layout/fidel_vsc.lay (renamed from src/mame/layout/vsc.lay)136
-rw-r--r--src/mame/layout/fidelz80.lay62
-rw-r--r--src/mame/layout/lantutor.lay2
-rw-r--r--src/mame/layout/marywu.lay172
-rwxr-xr-xsrc/mame/layout/md6802.lay125
-rwxr-xr-xsrc/mame/layout/mp68a.lay116
-rw-r--r--src/mame/layout/prophet600.lay35
-rw-r--r--src/mame/layout/rungun_dual.lay34
-rw-r--r--src/mame/layout/snspell.lay2
-rw-r--r--src/mame/layout/spellb.lay67
-rw-r--r--src/mame/layout/ti1250.lay42
-rw-r--r--src/mame/layout/tr606.lay20
-rw-r--r--src/mame/machine/315-5881_crypt.cpp31
-rw-r--r--src/mame/machine/315-5881_crypt.h4
-rw-r--r--src/mame/machine/3do.cpp18
-rw-r--r--src/mame/machine/6883sam.cpp1
-rw-r--r--src/mame/machine/aim65.cpp12
-rw-r--r--src/mame/machine/ajax.cpp20
-rw-r--r--src/mame/machine/alpha8201.cpp4
-rw-r--r--src/mame/machine/alpha8201.h2
-rw-r--r--src/mame/machine/amiga.cpp4
-rw-r--r--src/mame/machine/amigakbd.cpp2
-rw-r--r--src/mame/machine/amigakbd.h1
-rw-r--r--src/mame/machine/amstrad.cpp75
-rw-r--r--src/mame/machine/apollo.cpp32
-rw-r--r--src/mame/machine/apollo_dbg.h20
-rw-r--r--src/mame/machine/apollo_kbd.cpp9
-rw-r--r--src/mame/machine/apollo_kbd.h3
-rw-r--r--src/mame/machine/apple2.cpp6
-rw-r--r--src/mame/machine/apple2gs.cpp8
-rw-r--r--src/mame/machine/arkanoid.cpp171
-rw-r--r--src/mame/machine/asic65.h1
-rw-r--r--src/mame/machine/asteroid.cpp6
-rw-r--r--src/mame/machine/atarifb.cpp36
-rw-r--r--src/mame/machine/atarifdc.cpp6
-rw-r--r--src/mame/machine/atarifdc.h2
-rw-r--r--src/mame/machine/atarigen.cpp50
-rw-r--r--src/mame/machine/atarigen.h20
-rw-r--r--src/mame/machine/awboard.cpp4
-rw-r--r--src/mame/machine/balsente.cpp2
-rw-r--r--src/mame/machine/bbc.cpp33
-rw-r--r--src/mame/machine/bfm_bd1.cpp2
-rw-r--r--src/mame/machine/bfm_bda.cpp4
-rw-r--r--src/mame/machine/bigevglf.cpp2
-rw-r--r--src/mame/machine/bonzeadv.cpp8
-rw-r--r--src/mame/machine/bsktball.cpp4
-rw-r--r--src/mame/machine/bublbobl.cpp2
-rw-r--r--src/mame/machine/carpolo.cpp2
-rw-r--r--src/mame/machine/cchip.cpp8
-rw-r--r--src/mame/machine/cdi070.cpp182
-rw-r--r--src/mame/machine/cdi070.h5
-rw-r--r--src/mame/machine/cdicdic.cpp112
-rw-r--r--src/mame/machine/cdicdic.h6
-rw-r--r--src/mame/machine/cdislave.cpp52
-rw-r--r--src/mame/machine/cdislave.h1
-rw-r--r--src/mame/machine/compiskb.cpp2
-rw-r--r--src/mame/machine/cps2crpt.cpp2
-rw-r--r--src/mame/machine/cps2crypt.h1
-rw-r--r--src/mame/machine/dec_lk201.cpp10
-rw-r--r--src/mame/machine/docg3.cpp42
-rw-r--r--src/mame/machine/docg3.h2
-rw-r--r--src/mame/machine/electron.cpp4
-rw-r--r--src/mame/machine/esqvfd.cpp2
-rw-r--r--src/mame/machine/fd1094.cpp1
-rw-r--r--src/mame/machine/fddebug.cpp6
-rw-r--r--src/mame/machine/gaelco2.cpp46
-rw-r--r--src/mame/machine/galaxold.cpp10
-rw-r--r--src/mame/machine/gamecom.cpp4
-rw-r--r--src/mame/machine/gdrom.cpp146
-rw-r--r--src/mame/machine/harddriv.cpp4
-rw-r--r--src/mame/machine/hp48.cpp29
-rw-r--r--src/mame/machine/irobot.cpp4
-rw-r--r--src/mame/machine/k573dio.cpp4
-rw-r--r--src/mame/machine/k573dio.h2
-rw-r--r--src/mame/machine/kay_kbd.cpp9
-rw-r--r--src/mame/machine/kaypro.cpp8
-rw-r--r--src/mame/machine/kc.cpp2
-rw-r--r--src/mame/machine/konppc.cpp14
-rw-r--r--src/mame/machine/konppc.h6
-rw-r--r--src/mame/machine/leland.cpp6
-rw-r--r--src/mame/machine/lisa.cpp8
-rw-r--r--src/mame/machine/llc.cpp2
-rw-r--r--src/mame/machine/mac.cpp8
-rw-r--r--src/mame/machine/mboard.cpp10
-rw-r--r--src/mame/machine/mega32x.cpp28
-rw-r--r--src/mame/machine/mega32x.h8
-rw-r--r--src/mame/machine/megacd.cpp54
-rw-r--r--src/mame/machine/megacd.h2
-rw-r--r--src/mame/machine/megadriv.cpp8
-rw-r--r--src/mame/machine/meters.cpp137
-rw-r--r--src/mame/machine/meters.h43
-rw-r--r--src/mame/machine/mhavoc.cpp14
-rw-r--r--src/mame/machine/microdrv.cpp12
-rw-r--r--src/mame/machine/microdrv.h4
-rw-r--r--src/mame/machine/microtan.cpp4
-rw-r--r--src/mame/machine/midwayic.cpp16
-rw-r--r--src/mame/machine/midxunit.cpp12
-rw-r--r--src/mame/machine/midyunit.cpp28
-rw-r--r--src/mame/machine/model1.cpp14
-rw-r--r--src/mame/machine/ms7004.cpp2
-rw-r--r--src/mame/machine/msx.cpp4
-rw-r--r--src/mame/machine/mz700.cpp31
-rw-r--r--src/mame/machine/n64.cpp276
-rw-r--r--src/mame/machine/namco62.h4
-rw-r--r--src/mame/machine/namcos2.cpp6
-rw-r--r--src/mame/machine/naomi.cpp21
-rw-r--r--src/mame/machine/naomigd.cpp80
-rw-r--r--src/mame/machine/naomim1.cpp8
-rw-r--r--src/mame/machine/naomim1.h2
-rw-r--r--src/mame/machine/naomim2.cpp6
-rw-r--r--src/mame/machine/naomim2.h2
-rw-r--r--src/mame/machine/naomim4.cpp10
-rw-r--r--src/mame/machine/naomim4.h4
-rw-r--r--src/mame/machine/nb1413m3.cpp6
-rw-r--r--src/mame/machine/nb1414m4.cpp3
-rw-r--r--src/mame/machine/nes.cpp6
-rw-r--r--src/mame/machine/nextkbd.h2
-rw-r--r--src/mame/machine/nitedrvr.cpp2
-rw-r--r--src/mame/machine/ns10crypt.cpp2
-rw-r--r--src/mame/machine/ns10crypt.h2
-rw-r--r--src/mame/machine/opwolf.cpp12
-rw-r--r--src/mame/machine/p2000t.cpp2
-rw-r--r--src/mame/machine/pc1512kb.cpp4
-rw-r--r--src/mame/machine/pc9801_118.cpp4
-rw-r--r--src/mame/machine/pc9801_86.cpp192
-rw-r--r--src/mame/machine/pc9801_86.h28
-rw-r--r--src/mame/machine/pce_cd.cpp32
-rw-r--r--src/mame/machine/pce_cd.h12
-rw-r--r--src/mame/machine/pgmprot_igs027a_type3.cpp16
-rw-r--r--src/mame/machine/playch10.cpp58
-rw-r--r--src/mame/machine/pmd85.cpp8
-rw-r--r--src/mame/machine/psxcd.h1
-rw-r--r--src/mame/machine/qix.cpp15
-rw-r--r--src/mame/machine/radio86.cpp4
-rw-r--r--src/mame/machine/raiden2cop.h2
-rw-r--r--src/mame/machine/rbisland.cpp26
-rw-r--r--src/mame/machine/scramble.cpp15
-rw-r--r--src/mame/machine/simpsons.cpp8
-rw-r--r--src/mame/machine/smartmed.cpp20
-rw-r--r--src/mame/machine/smartmed.h8
-rw-r--r--src/mame/machine/sms.cpp31
-rw-r--r--src/mame/machine/snes.cpp4
-rw-r--r--src/mame/machine/st0016.cpp16
-rw-r--r--src/mame/machine/st0016.h5
-rw-r--r--src/mame/machine/starwars.cpp18
-rw-r--r--src/mame/machine/stfight.cpp4
-rw-r--r--src/mame/machine/subs.cpp4
-rw-r--r--src/mame/machine/subsino.cpp6
-rw-r--r--src/mame/machine/svi318.cpp22
-rw-r--r--src/mame/machine/taitoio.cpp24
-rw-r--r--src/mame/machine/taitosj.cpp2
-rw-r--r--src/mame/machine/tandy2kb.cpp4
-rw-r--r--src/mame/machine/thomson.cpp2
-rw-r--r--src/mame/machine/ti85.cpp14
-rw-r--r--src/mame/machine/ticket.cpp6
-rw-r--r--src/mame/machine/tnzs.cpp44
-rw-r--r--src/mame/machine/toaplan1.cpp50
-rw-r--r--src/mame/machine/trs80m2kb.cpp4
-rw-r--r--src/mame/machine/twincobr.cpp16
-rw-r--r--src/mame/machine/ut88.cpp2
-rw-r--r--src/mame/machine/v1050kb.cpp2
-rw-r--r--src/mame/machine/victor9k_fdc.cpp4
-rw-r--r--src/mame/machine/volfied.cpp12
-rw-r--r--src/mame/machine/vsnes.cpp111
-rw-r--r--src/mame/machine/wangpckb.cpp2
-rw-r--r--src/mame/machine/williams.cpp14
-rw-r--r--src/mame/machine/wpc_lamp.cpp2
-rw-r--r--src/mame/machine/wpc_out.cpp6
-rw-r--r--src/mame/machine/wrally.cpp4
-rw-r--r--src/mame/machine/wswan.cpp4
-rw-r--r--src/mame/machine/x68k_kbd.cpp14
-rw-r--r--src/mame/machine/xbox.cpp228
-rw-r--r--src/mame/machine/xevious.cpp10
-rw-r--r--src/mame/machine/z80ne.cpp10
-rw-r--r--src/mame/mame.cpp4
-rw-r--r--src/mame/mess.cpp4
-rw-r--r--src/mame/mess.lst120
-rw-r--r--src/mame/video/1942.cpp4
-rw-r--r--src/mame/video/1943.cpp6
-rw-r--r--src/mame/video/40love.cpp46
-rw-r--r--src/mame/video/733_asr.cpp2
-rw-r--r--src/mame/video/733_asr.h2
-rw-r--r--src/mame/video/911_vdt.cpp4
-rw-r--r--src/mame/video/alesis.cpp100
-rw-r--r--src/mame/video/antic.cpp18
-rw-r--r--src/mame/video/antic.h8
-rw-r--r--src/mame/video/apollo.cpp10
-rw-r--r--src/mame/video/apple2.cpp10
-rw-r--r--src/mame/video/apple2.h4
-rw-r--r--src/mame/video/apple2gs.cpp4
-rw-r--r--src/mame/video/apple3.cpp2
-rw-r--r--src/mame/video/aquarium.cpp2
-rw-r--r--src/mame/video/arabian.cpp8
-rw-r--r--src/mame/video/arcadia.cpp2
-rw-r--r--src/mame/video/argus.cpp18
-rw-r--r--src/mame/video/arkanoid.cpp8
-rw-r--r--src/mame/video/armedf.cpp12
-rw-r--r--src/mame/video/astrocde.cpp6
-rw-r--r--src/mame/video/atari.cpp4
-rw-r--r--src/mame/video/atarifb.cpp2
-rw-r--r--src/mame/video/atarisy1.cpp6
-rw-r--r--src/mame/video/avgdvg.cpp15
-rw-r--r--src/mame/video/avgdvg.h4
-rw-r--r--src/mame/video/awpvid.cpp8
-rw-r--r--src/mame/video/awpvid.h2
-rw-r--r--src/mame/video/batman.cpp28
-rw-r--r--src/mame/video/battlane.cpp2
-rw-r--r--src/mame/video/battlex.cpp6
-rw-r--r--src/mame/video/bfm_adr2.h2
-rw-r--r--src/mame/video/bfm_dm01.cpp2
-rw-r--r--src/mame/video/bigevglf.cpp6
-rw-r--r--src/mame/video/bionicc.cpp9
-rw-r--r--src/mame/video/bking.cpp2
-rw-r--r--src/mame/video/blktiger.cpp10
-rw-r--r--src/mame/video/btime.cpp50
-rw-r--r--src/mame/video/buggychl.cpp4
-rw-r--r--src/mame/video/c116.cpp2
-rw-r--r--src/mame/video/c45.cpp7
-rw-r--r--src/mame/video/carpolo.cpp10
-rw-r--r--src/mame/video/cave.cpp6
-rw-r--r--src/mame/video/cbasebal.cpp8
-rw-r--r--src/mame/video/ccastles.cpp4
-rw-r--r--src/mame/video/changela.cpp20
-rw-r--r--src/mame/video/cheekyms.cpp2
-rw-r--r--src/mame/video/chihiro.cpp587
-rw-r--r--src/mame/video/cidelsa.cpp8
-rw-r--r--src/mame/video/cinemat.cpp20
-rw-r--r--src/mame/video/cischeat.cpp39
-rw-r--r--src/mame/video/cloak.cpp18
-rw-r--r--src/mame/video/cloud9.cpp6
-rw-r--r--src/mame/video/combatsc.cpp28
-rw-r--r--src/mame/video/commando.cpp4
-rw-r--r--src/mame/video/contra.cpp20
-rw-r--r--src/mame/video/cop01.cpp4
-rw-r--r--src/mame/video/cps1.cpp43
-rw-r--r--src/mame/video/crgolf.cpp8
-rw-r--r--src/mame/video/crt.cpp2
-rw-r--r--src/mame/video/crt.h2
-rw-r--r--src/mame/video/cvs.cpp4
-rw-r--r--src/mame/video/cyberbal.cpp4
-rw-r--r--src/mame/video/darius.cpp2
-rw-r--r--src/mame/video/dcheese.cpp2
-rw-r--r--src/mame/video/dday.cpp4
-rw-r--r--src/mame/video/decbac06.cpp16
-rw-r--r--src/mame/video/decbac06.h5
-rw-r--r--src/mame/video/deco16ic.cpp12
-rw-r--r--src/mame/video/deco16ic.h5
-rw-r--r--src/mame/video/deco32.cpp24
-rw-r--r--src/mame/video/deco_mlc.cpp18
-rw-r--r--src/mame/video/decocomn.cpp4
-rw-r--r--src/mame/video/decocomn.h2
-rw-r--r--src/mame/video/decodmd1.h1
-rw-r--r--src/mame/video/decodmd2.h2
-rw-r--r--src/mame/video/deniam.cpp2
-rw-r--r--src/mame/video/dogfgt.cpp8
-rw-r--r--src/mame/video/dooyong.cpp72
-rw-r--r--src/mame/video/dragrace.cpp2
-rw-r--r--src/mame/video/drmicro.cpp4
-rw-r--r--src/mame/video/dynax.cpp236
-rw-r--r--src/mame/video/electron.cpp47
-rw-r--r--src/mame/video/eolith.cpp4
-rw-r--r--src/mame/video/epos.cpp6
-rw-r--r--src/mame/video/equites.cpp8
-rw-r--r--src/mame/video/esripsys.cpp40
-rw-r--r--src/mame/video/excellent_spr.cpp6
-rw-r--r--src/mame/video/excellent_spr.h4
-rw-r--r--src/mame/video/exedexes.cpp10
-rw-r--r--src/mame/video/exerion.cpp15
-rw-r--r--src/mame/video/exidy440.cpp8
-rw-r--r--src/mame/video/fgoal.cpp2
-rw-r--r--src/mame/video/flkatck.cpp2
-rw-r--r--src/mame/video/fmtowns.cpp4
-rw-r--r--src/mame/video/fromanc2.cpp52
-rw-r--r--src/mame/video/fromance.cpp12
-rw-r--r--src/mame/video/fuukifg.cpp20
-rw-r--r--src/mame/video/fuukifg.h6
-rw-r--r--src/mame/video/fuukifg3.cpp4
-rw-r--r--src/mame/video/gaelco3d.cpp24
-rw-r--r--src/mame/video/galastrm.cpp20
-rw-r--r--src/mame/video/galaxian.cpp2
-rw-r--r--src/mame/video/galaxold.cpp6
-rw-r--r--src/mame/video/galivan.cpp8
-rw-r--r--src/mame/video/gameplan.cpp6
-rw-r--r--src/mame/video/gb_lcd.cpp104
-rw-r--r--src/mame/video/gb_lcd.h7
-rw-r--r--src/mame/video/gime.h1
-rw-r--r--src/mame/video/glass.cpp2
-rw-r--r--src/mame/video/goal92.cpp8
-rw-r--r--src/mame/video/gp9001.cpp18
-rw-r--r--src/mame/video/gp9001.h2
-rw-r--r--src/mame/video/grchamp.cpp2
-rw-r--r--src/mame/video/gridlee.cpp4
-rw-r--r--src/mame/video/groundfx.cpp6
-rw-r--r--src/mame/video/gunbustr.cpp6
-rw-r--r--src/mame/video/gunsmoke.cpp6
-rw-r--r--src/mame/video/higemaru.cpp4
-rw-r--r--src/mame/video/hng64.cpp4
-rw-r--r--src/mame/video/hng64_3d.cpp2
-rw-r--r--src/mame/video/hyprduel.cpp26
-rw-r--r--src/mame/video/igs017_igs031.cpp4
-rw-r--r--src/mame/video/igs017_igs031.h2
-rw-r--r--src/mame/video/inufuku.cpp6
-rw-r--r--src/mame/video/irobot.cpp16
-rw-r--r--src/mame/video/ironhors.cpp4
-rw-r--r--src/mame/video/itech32.cpp4
-rw-r--r--src/mame/video/jackal.cpp7
-rw-r--r--src/mame/video/jalblend.cpp6
-rw-r--r--src/mame/video/jalblend.h2
-rw-r--r--src/mame/video/k001005.cpp36
-rw-r--r--src/mame/video/k001005.h14
-rw-r--r--src/mame/video/k001006.cpp22
-rw-r--r--src/mame/video/k001006.h8
-rw-r--r--src/mame/video/k001604.cpp29
-rw-r--r--src/mame/video/k001604.h6
-rw-r--r--src/mame/video/k007121.cpp7
-rw-r--r--src/mame/video/k007121.h2
-rw-r--r--src/mame/video/k007342.cpp8
-rw-r--r--src/mame/video/k007342.h4
-rw-r--r--src/mame/video/k007420.cpp4
-rw-r--r--src/mame/video/k007420.h2
-rw-r--r--src/mame/video/k037122.cpp26
-rw-r--r--src/mame/video/k037122.h6
-rw-r--r--src/mame/video/k051316.cpp2
-rw-r--r--src/mame/video/k051316.h2
-rw-r--r--src/mame/video/k051960.cpp18
-rw-r--r--src/mame/video/k051960.h2
-rw-r--r--src/mame/video/k052109.cpp6
-rw-r--r--src/mame/video/k052109.h2
-rw-r--r--src/mame/video/k053244_k053245.cpp22
-rw-r--r--src/mame/video/k053244_k053245.h4
-rw-r--r--src/mame/video/k053246_k053247_k055673.cpp20
-rw-r--r--src/mame/video/k053246_k053247_k055673.h2
-rw-r--r--src/mame/video/k053250.cpp2
-rw-r--r--src/mame/video/k053936.cpp23
-rw-r--r--src/mame/video/k053936.h6
-rw-r--r--src/mame/video/k054156_k054157_k056832.cpp23
-rw-r--r--src/mame/video/k054338.cpp14
-rw-r--r--src/mame/video/k054338.h2
-rw-r--r--src/mame/video/k055555.cpp19
-rw-r--r--src/mame/video/k057714.cpp12
-rw-r--r--src/mame/video/k057714.h2
-rw-r--r--src/mame/video/k1ge.cpp6
-rw-r--r--src/mame/video/k1ge.h4
-rw-r--r--src/mame/video/kan_pand.cpp8
-rw-r--r--src/mame/video/kan_pand.h4
-rw-r--r--src/mame/video/kaneko16.cpp8
-rw-r--r--src/mame/video/kaneko_grap2.cpp18
-rw-r--r--src/mame/video/kaneko_grap2.h8
-rw-r--r--src/mame/video/kaneko_spr.cpp17
-rw-r--r--src/mame/video/kaneko_spr.h4
-rw-r--r--src/mame/video/kaneko_tmap.cpp20
-rw-r--r--src/mame/video/kaneko_tmap.h6
-rw-r--r--src/mame/video/kangaroo.cpp4
-rw-r--r--src/mame/video/karnov.cpp4
-rw-r--r--src/mame/video/kncljoe.cpp4
-rw-r--r--src/mame/video/konami_helper.cpp2
-rw-r--r--src/mame/video/konamigx.cpp65
-rw-r--r--src/mame/video/ladyfrog.cpp4
-rw-r--r--src/mame/video/laserbat.cpp377
-rw-r--r--src/mame/video/lastduel.cpp8
-rw-r--r--src/mame/video/legionna.cpp45
-rw-r--r--src/mame/video/leland.cpp8
-rw-r--r--src/mame/video/lethalj.cpp4
-rw-r--r--src/mame/video/liberate.cpp4
-rw-r--r--src/mame/video/liberatr.cpp2
-rw-r--r--src/mame/video/lockon.cpp12
-rw-r--r--src/mame/video/lordgun.cpp2
-rw-r--r--src/mame/video/lwings.cpp2
-rw-r--r--src/mame/video/m10.cpp7
-rw-r--r--src/mame/video/m107.cpp13
-rw-r--r--src/mame/video/m52.cpp4
-rw-r--r--src/mame/video/m57.cpp4
-rw-r--r--src/mame/video/m58.cpp42
-rw-r--r--src/mame/video/m62.cpp4
-rw-r--r--src/mame/video/m72.cpp26
-rw-r--r--src/mame/video/macrossp.cpp16
-rw-r--r--src/mame/video/madalien.cpp2
-rw-r--r--src/mame/video/magmax.cpp2
-rw-r--r--src/mame/video/matmania.cpp4
-rw-r--r--src/mame/video/mb60553.cpp8
-rw-r--r--src/mame/video/mb60553.h4
-rw-r--r--src/mame/video/mcatadv.cpp16
-rw-r--r--src/mame/video/mcd212.cpp120
-rw-r--r--src/mame/video/mcr68.cpp16
-rw-r--r--src/mame/video/megasys1.cpp192
-rw-r--r--src/mame/video/megazone.cpp2
-rw-r--r--src/mame/video/metlclsh.cpp6
-rw-r--r--src/mame/video/metro.cpp4
-rw-r--r--src/mame/video/micro3d.cpp10
-rw-r--r--src/mame/video/microtan.cpp4
-rw-r--r--src/mame/video/midtunit.cpp6
-rw-r--r--src/mame/video/midvunit.cpp2
-rw-r--r--src/mame/video/midyunit.cpp12
-rw-r--r--src/mame/video/mitchell.cpp6
-rw-r--r--src/mame/video/mjkjidai.cpp2
-rw-r--r--src/mame/video/model1.cpp12
-rw-r--r--src/mame/video/model2.cpp6
-rw-r--r--src/mame/video/model3.cpp28
-rw-r--r--src/mame/video/msisaac.cpp2
-rw-r--r--src/mame/video/munchmo.cpp2
-rw-r--r--src/mame/video/mystston.cpp4
-rw-r--r--src/mame/video/mystwarr.cpp8
-rw-r--r--src/mame/video/n64.cpp114
-rw-r--r--src/mame/video/n64.h49
-rw-r--r--src/mame/video/namcos21.cpp34
-rw-r--r--src/mame/video/namcos22.cpp26
-rw-r--r--src/mame/video/nbmj8688.cpp10
-rw-r--r--src/mame/video/nbmj8891.cpp41
-rw-r--r--src/mame/video/nbmj8900.cpp22
-rw-r--r--src/mame/video/nbmj8991.cpp10
-rw-r--r--src/mame/video/nbmj9195.cpp32
-rw-r--r--src/mame/video/nemesis.cpp4
-rw-r--r--src/mame/video/neogeo_spr.cpp16
-rw-r--r--src/mame/video/neogeo_spr.h4
-rw-r--r--src/mame/video/newport.cpp4
-rw-r--r--src/mame/video/newport.h2
-rw-r--r--src/mame/video/nick.cpp1
-rw-r--r--src/mame/video/nick.h3
-rw-r--r--src/mame/video/ninjakd2.cpp18
-rw-r--r--src/mame/video/niyanpai.cpp40
-rw-r--r--src/mame/video/nmk16.cpp26
-rw-r--r--src/mame/video/offtwall.cpp8
-rw-r--r--src/mame/video/ojankohs.cpp10
-rw-r--r--src/mame/video/opwolf.cpp6
-rw-r--r--src/mame/video/orbit.cpp2
-rw-r--r--src/mame/video/othunder.cpp6
-rw-r--r--src/mame/video/p2000m.cpp2
-rw-r--r--src/mame/video/pacland.cpp6
-rw-r--r--src/mame/video/pastelg.cpp4
-rw-r--r--src/mame/video/pc080sn.cpp12
-rw-r--r--src/mame/video/pc080sn.h3
-rw-r--r--src/mame/video/pc090oj.cpp8
-rw-r--r--src/mame/video/pc090oj.h4
-rw-r--r--src/mame/video/pcd.cpp2
-rw-r--r--src/mame/video/pcw.cpp2
-rw-r--r--src/mame/video/pecom.cpp4
-rw-r--r--src/mame/video/pgm.cpp14
-rw-r--r--src/mame/video/phoenix.cpp18
-rw-r--r--src/mame/video/pitnrun.cpp8
-rw-r--r--src/mame/video/plygonet.cpp2
-rw-r--r--src/mame/video/poisk1.cpp8
-rw-r--r--src/mame/video/policetr.cpp2
-rw-r--r--src/mame/video/polyplay.cpp2
-rw-r--r--src/mame/video/poolshrk.cpp2
-rw-r--r--src/mame/video/popeye.cpp17
-rw-r--r--src/mame/video/powervr2.cpp2
-rw-r--r--src/mame/video/powervr2.h7
-rw-r--r--src/mame/video/ppu2c0x.cpp18
-rw-r--r--src/mame/video/ppu2c0x.h8
-rw-r--r--src/mame/video/prehisle.cpp4
-rw-r--r--src/mame/video/psikyo.cpp16
-rw-r--r--src/mame/video/psikyosh.cpp4
-rw-r--r--src/mame/video/psychic5.cpp2
-rw-r--r--src/mame/video/qix.cpp7
-rw-r--r--src/mame/video/quasar.cpp4
-rw-r--r--src/mame/video/quizdna.cpp10
-rw-r--r--src/mame/video/raiden.cpp4
-rw-r--r--src/mame/video/rastan.cpp10
-rw-r--r--src/mame/video/rdptpipe.cpp2
-rw-r--r--src/mame/video/realbrk.cpp8
-rw-r--r--src/mame/video/redalert.cpp4
-rw-r--r--src/mame/video/relief.cpp10
-rw-r--r--src/mame/video/rltennis.cpp8
-rw-r--r--src/mame/video/route16.cpp2
-rw-r--r--src/mame/video/rungun.cpp20
-rw-r--r--src/mame/video/scotrsht.cpp4
-rw-r--r--src/mame/video/sega16sp.cpp7
-rw-r--r--src/mame/video/sega16sp.h3
-rw-r--r--src/mame/video/segaic16.cpp6
-rw-r--r--src/mame/video/segaic16.h2
-rw-r--r--src/mame/video/segaic16_road.cpp22
-rw-r--r--src/mame/video/segaic16_road.h4
-rw-r--r--src/mame/video/segaic24.cpp32
-rw-r--r--src/mame/video/segaic24.h5
-rw-r--r--src/mame/video/segas16b.cpp4
-rw-r--r--src/mame/video/segas32.cpp14
-rw-r--r--src/mame/video/segaybd.cpp4
-rw-r--r--src/mame/video/seibu_crtc.cpp23
-rw-r--r--src/mame/video/seibu_crtc.h12
-rw-r--r--src/mame/video/seibuspi.cpp18
-rw-r--r--src/mame/video/seta.cpp15
-rw-r--r--src/mame/video/seta2.cpp6
-rw-r--r--src/mame/video/shadfrce.cpp6
-rw-r--r--src/mame/video/shuuz.cpp8
-rw-r--r--src/mame/video/sidearms.cpp14
-rw-r--r--src/mame/video/simpl156.cpp18
-rw-r--r--src/mame/video/skydiver.cpp30
-rw-r--r--src/mame/video/skyraid.cpp2
-rw-r--r--src/mame/video/slapshot.cpp10
-rw-r--r--src/mame/video/spacefb.cpp6
-rw-r--r--src/mame/video/special.cpp2
-rw-r--r--src/mame/video/sprint4.cpp2
-rw-r--r--src/mame/video/sprint8.cpp2
-rw-r--r--src/mame/video/srumbler.cpp6
-rw-r--r--src/mame/video/sspeedr.cpp2
-rw-r--r--src/mame/video/ssrj.cpp4
-rw-r--r--src/mame/video/ssv.cpp8
-rw-r--r--src/mame/video/ssystem3.cpp2
-rw-r--r--src/mame/video/st0020.cpp46
-rw-r--r--src/mame/video/st0020.h8
-rw-r--r--src/mame/video/stactics.cpp30
-rw-r--r--src/mame/video/starcrus.cpp12
-rw-r--r--src/mame/video/starshp1.cpp8
-rw-r--r--src/mame/video/suna16.cpp2
-rw-r--r--src/mame/video/super80.cpp10
-rw-r--r--src/mame/video/superchs.cpp6
-rw-r--r--src/mame/video/superqix.cpp8
-rw-r--r--src/mame/video/suprloco.cpp4
-rw-r--r--src/mame/video/system1.cpp24
-rw-r--r--src/mame/video/tagteam.cpp4
-rw-r--r--src/mame/video/taito_b.cpp10
-rw-r--r--src/mame/video/taito_f2.cpp32
-rw-r--r--src/mame/video/taito_f3.cpp60
-rw-r--r--src/mame/video/taitoair.cpp6
-rw-r--r--src/mame/video/taitojc.cpp421
-rw-r--r--src/mame/video/tank8.cpp2
-rw-r--r--src/mame/video/tankbust.cpp2
-rw-r--r--src/mame/video/taotaido.cpp18
-rw-r--r--src/mame/video/tatsumi.cpp16
-rw-r--r--src/mame/video/tc0080vco.cpp30
-rw-r--r--src/mame/video/tc0080vco.h2
-rw-r--r--src/mame/video/tc0100scn.cpp34
-rw-r--r--src/mame/video/tc0100scn.h2
-rw-r--r--src/mame/video/tc0110pcr.cpp4
-rw-r--r--src/mame/video/tc0110pcr.h2
-rw-r--r--src/mame/video/tc0180vcu.cpp8
-rw-r--r--src/mame/video/tc0180vcu.h4
-rw-r--r--src/mame/video/tc0280grd.cpp4
-rw-r--r--src/mame/video/tc0280grd.h2
-rw-r--r--src/mame/video/tc0480scp.cpp2
-rw-r--r--src/mame/video/tc0780fpa.cpp502
-rw-r--r--src/mame/video/tc0780fpa.h81
-rw-r--r--src/mame/video/tceptor.cpp34
-rw-r--r--src/mame/video/tecmo_mix.cpp6
-rw-r--r--src/mame/video/tecmo_mix.h2
-rw-r--r--src/mame/video/tehkanwc.cpp4
-rw-r--r--src/mame/video/terracre.cpp4
-rw-r--r--src/mame/video/tetrisp2.cpp24
-rw-r--r--src/mame/video/thepit.cpp4
-rw-r--r--src/mame/video/thief.cpp12
-rw-r--r--src/mame/video/thomson.cpp6
-rw-r--r--src/mame/video/thoop2.cpp2
-rw-r--r--src/mame/video/thunderj.cpp28
-rw-r--r--src/mame/video/ti85.cpp18
-rw-r--r--src/mame/video/tia.cpp8
-rw-r--r--src/mame/video/tia.h4
-rw-r--r--src/mame/video/tiamc1.cpp20
-rw-r--r--src/mame/video/tigeroad.cpp8
-rw-r--r--src/mame/video/tmnt.cpp26
-rw-r--r--src/mame/video/toaplan1.cpp58
-rw-r--r--src/mame/video/toaplan_scu.cpp4
-rw-r--r--src/mame/video/tp84.cpp4
-rw-r--r--src/mame/video/travrusa.cpp4
-rw-r--r--src/mame/video/triplhnt.cpp2
-rw-r--r--src/mame/video/tryout.cpp10
-rw-r--r--src/mame/video/tubep.cpp8
-rw-r--r--src/mame/video/turbo.cpp4
-rw-r--r--src/mame/video/turrett.cpp2
-rw-r--r--src/mame/video/twincobr.cpp12
-rw-r--r--src/mame/video/tx1.cpp58
-rw-r--r--src/mame/video/ultraman.cpp4
-rw-r--r--src/mame/video/ultratnk.cpp2
-rw-r--r--src/mame/video/undrfire.cpp10
-rw-r--r--src/mame/video/unico.cpp16
-rw-r--r--src/mame/video/vc4000.cpp2
-rw-r--r--src/mame/video/victory.cpp16
-rw-r--r--src/mame/video/vigilant.cpp2
-rw-r--r--src/mame/video/volfied.cpp6
-rw-r--r--src/mame/video/vrender0.h2
-rw-r--r--src/mame/video/vs920a.cpp4
-rw-r--r--src/mame/video/vs920a.h2
-rw-r--r--src/mame/video/vulgus.cpp4
-rw-r--r--src/mame/video/wecleman.cpp4
-rw-r--r--src/mame/video/williams.cpp12
-rw-r--r--src/mame/video/wolfpack.cpp4
-rw-r--r--src/mame/video/x68k.cpp71
-rw-r--r--src/mame/video/xmen.cpp8
-rw-r--r--src/mame/video/yiear.cpp4
-rw-r--r--src/mame/video/zac2650.cpp2
-rw-r--r--src/mame/video/zx.cpp4
-rw-r--r--src/osd/modules/debugger/debugint.cpp437
-rw-r--r--src/osd/modules/debugger/debugqt.cpp35
-rw-r--r--src/osd/modules/debugger/osx/disassemblyviewer.mm4
-rw-r--r--src/osd/modules/debugger/osx/memoryview.mm16
-rw-r--r--src/osd/modules/debugger/qt/breakpointswindow.cpp8
-rw-r--r--src/osd/modules/debugger/qt/breakpointswindow.h2
-rw-r--r--src/osd/modules/debugger/qt/dasmwindow.cpp24
-rw-r--r--src/osd/modules/debugger/qt/dasmwindow.h3
-rw-r--r--src/osd/modules/debugger/qt/debuggerview.cpp131
-rw-r--r--src/osd/modules/debugger/qt/debuggerview.h2
-rw-r--r--src/osd/modules/debugger/qt/deviceinformationwindow.cpp4
-rw-r--r--src/osd/modules/debugger/qt/deviceinformationwindow.h2
-rw-r--r--src/osd/modules/debugger/qt/deviceswindow.cpp6
-rw-r--r--src/osd/modules/debugger/qt/deviceswindow.h2
-rw-r--r--src/osd/modules/debugger/qt/logwindow.cpp2
-rw-r--r--src/osd/modules/debugger/qt/logwindow.h2
-rw-r--r--src/osd/modules/debugger/qt/mainwindow.cpp28
-rw-r--r--src/osd/modules/debugger/qt/mainwindow.h8
-rw-r--r--src/osd/modules/debugger/qt/memorywindow.cpp25
-rw-r--r--src/osd/modules/debugger/qt/memorywindow.h3
-rw-r--r--src/osd/modules/debugger/qt/windowqt.cpp37
-rw-r--r--src/osd/modules/debugger/qt/windowqt.h2
-rw-r--r--src/osd/modules/debugger/win/debugviewinfo.cpp2
-rw-r--r--src/osd/modules/debugger/win/disasmbasewininfo.cpp4
-rw-r--r--src/osd/modules/lib/osdobj_common.cpp10
-rw-r--r--src/osd/modules/lib/osdobj_common.h5
-rw-r--r--src/osd/modules/render/d3d/d3dhlsl.cpp38
-rw-r--r--src/osd/modules/render/drawd3d.cpp4
-rw-r--r--src/osd/modules/render/drawsdl.cpp8
-rw-r--r--src/osd/modules/sound/coreaudio_sound.cpp6
-rw-r--r--src/osd/modules/sound/sdl_sound.cpp2
-rw-r--r--src/osd/modules/sound/xaudio2_sound.cpp731
-rw-r--r--src/osd/osdcore.cpp6
-rw-r--r--src/osd/osdcore.h11
-rw-r--r--src/osd/osdmini/minimisc.cpp12
-rw-r--r--src/osd/osdnet.cpp2
-rw-r--r--src/osd/sdl/input.cpp16
-rw-r--r--src/osd/sdl/osdsdl.h6
-rw-r--r--src/osd/sdl/output.cpp2
-rw-r--r--src/osd/sdl/sdlfile.cpp85
-rw-r--r--src/osd/sdl/sdlsocket.cpp1
-rw-r--r--src/osd/sdl/video.cpp16
-rw-r--r--src/osd/windows/input.cpp4
-rw-r--r--src/osd/windows/ledutil.cpp2
-rw-r--r--src/osd/windows/output.cpp28
-rw-r--r--src/osd/windows/video.cpp8
-rw-r--r--src/osd/windows/window.cpp12
-rw-r--r--src/osd/windows/winfile.cpp7
-rw-r--r--src/osd/windows/winmain.cpp2
-rw-r--r--src/osd/windows/winmain.h4
-rw-r--r--src/osd/windows/winutil.cpp14
-rw-r--r--src/tools/chdman.cpp31
-rw-r--r--src/tools/regrep.cpp6
-rw-r--r--src/version.cpp2
4271 files changed, 276292 insertions, 62307 deletions
diff --git a/3rdparty/bgfx/.editorconfig b/3rdparty/bgfx/.editorconfig
index f39662686c0..350f2a6e82c 100644
--- a/3rdparty/bgfx/.editorconfig
+++ b/3rdparty/bgfx/.editorconfig
@@ -8,7 +8,7 @@ max_line_length = 100
insert_final_newline = true
trim_trailing_whitespace = true
-[*.c99.h]
+[include/bgfx/c99/*.h]
indent_style = space
[*.md]
diff --git a/3rdparty/bgfx/3rdparty/.editorconfig b/3rdparty/bgfx/3rdparty/.editorconfig
index 9f05daea32d..901bf58d065 100644
--- a/3rdparty/bgfx/3rdparty/.editorconfig
+++ b/3rdparty/bgfx/3rdparty/.editorconfig
@@ -1,9 +1,25 @@
root = true
+[etc1/*]
+indent_style = space
+indent_size = 4
+
[fcpp/*]
indent_style = space
indent_size = 2
+[libsquish/*]
+indent_style = tab
+indent_size = 4
+
[ocornut-imgui/*]
indent_style = space
indent_size = 4
+
+[pvrtc/*]
+indent_style = space
+indent_size = 4
+
+[remotery/*]
+indent_style = space
+indent_size = 4
diff --git a/3rdparty/bgfx/3rdparty/dxsdk/include/dxgi.h b/3rdparty/bgfx/3rdparty/dxsdk/include/dxgi.h
index e3b9817340b..8c75e72b552 100644
--- a/3rdparty/bgfx/3rdparty/dxsdk/include/dxgi.h
+++ b/3rdparty/bgfx/3rdparty/dxsdk/include/dxgi.h
@@ -141,6 +141,7 @@ typedef interface IDXGIDevice1 IDXGIDevice1;
#include "oaidl.h"
#include "ocidl.h"
#include "dxgitype.h"
+#include "d3dcommon.h"
#ifdef __cplusplus
extern "C"{
diff --git a/3rdparty/bgfx/3rdparty/etc1/LICENSE b/3rdparty/bgfx/3rdparty/etc1/LICENSE
new file mode 100644
index 00000000000..64635a4089d
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/etc1/LICENSE
@@ -0,0 +1,161 @@
+Apache License
+
+Version 2.0, January 2004
+
+http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+"License" shall mean the terms and conditions for use, reproduction, and
+distribution as defined by Sections 1 through 9 of this document.
+
+"Licensor" shall mean the copyright owner or entity authorized by the
+copyright owner that is granting the License.
+
+"Legal Entity" shall mean the union of the acting entity and all other
+entities that control, are controlled by, or are under common control with
+that entity. For the purposes of this definition, "control" means (i) the
+power, direct or indirect, to cause the direction or management of such
+entity, whether by contract or otherwise, or (ii) ownership of fifty
+percent (50%) or more of the outstanding shares, or (iii) beneficial
+ownership of such entity.
+
+"You" (or "Your") shall mean an individual or Legal Entity exercising
+permissions granted by this License.
+
+"Source" form shall mean the preferred form for making modifications,
+including but not limited to software source code, documentation
+source, and configuration files.
+
+"Object" form shall mean any form resulting from mechanical transformation
+or translation of a Source form, including but not limited to compiled
+object code, generated documentation, and conversions to other media types.
+
+"Work" shall mean the work of authorship, whether in Source or Object
+form, made available under the License, as indicated by a copyright
+notice that is included in or attached to the work (an example is
+provided in the Appendix below).
+
+"Derivative Works" shall mean any work, whether in Source or Object
+form, that is based on (or derived from) the Work and for which the
+editorial revisions, annotations, elaborations, or other modifications
+represent, as a whole, an original work of authorship. For the purposes
+of this License, Derivative Works shall not include works that remain
+separable from, or merely link (or bind by name) to the interfaces of,
+the Work and Derivative Works thereof.
+
+"Contribution" shall mean any work of authorship, including the original
+version of the Work and any modifications or additions to that Work or
+Derivative Works thereof, that is intentionally submitted to Licensor
+for inclusion in the Work by the copyright owner or by an individual or
+Legal Entity authorized to submit on behalf of the copyright owner. For
+the purposes of this definition, "submitted" means any form of electronic,
+verbal, or written communication sent to the Licensor or its
+representatives, including but not limited to communication on electronic
+mailing lists, source code control systems, and issue tracking systems that
+are managed by, or on behalf of, the Licensor for the purpose of discussing
+and improving the Work, but excluding communication that is conspicuously
+marked or otherwise designated in writing by the copyright owner as "Not
+a Contribution."
+
+"Contributor" shall mean Licensor and any individual or Legal Entity on
+behalf of whom a Contribution has been received by Licensor and subsequently
+incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of this
+License, each Contributor hereby grants to You a perpetual, worldwide,
+non-exclusive, no-charge, royalty-free, irrevocable copyright license to
+reproduce, prepare Derivative Works of, publicly display, publicly perform,
+sublicense, and distribute the Work and such Derivative Works in Source or
+Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of this
+License, each Contributor hereby grants to You a perpetual, worldwide,
+non-exclusive, no-charge, royalty-free, irrevocable (except as stated in
+this section) patent license to make, have made, use, offer to sell, sell,
+import, and otherwise transfer the Work, where such license applies only to
+those patent claims licensable by such Contributor that are necessarily
+infringed by their Contribution(s) alone or by combination of their
+Contribution(s) with the Work to which such Contribution(s) was submitted.
+If You institute patent litigation against any entity (including a cross-claim
+or counterclaim in a lawsuit) alleging that the Work or a Contribution
+incorporated within the Work constitutes direct or contributory patent
+infringement, then any patent licenses granted to You under this License
+for that Work shall terminate as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the Work or
+Derivative Works thereof in any medium, with or without modifications, and
+in Source or Object form, provided that You meet the following conditions:
+
+You must give any other recipients of the Work or Derivative Works a copy of
+this License; and
+You must cause any modified files to carry prominent notices stating that
+You changed the files; and
+You must retain, in the Source form of any Derivative Works that You
+distribute, all copyright, patent, trademark, and attribution notices
+from the Source form of the Work, excluding those notices that do not
+pertain to any part of the Derivative Works; and
+If the Work includes a "NOTICE" text file as part of its distribution,
+then any Derivative Works that You distribute must include a readable
+copy of the attribution notices contained within such NOTICE file, excluding
+those notices that do not pertain to any part of the Derivative Works, in
+at least one of the following places: within a NOTICE text file distributed
+as part of the Derivative Works; within the Source form or documentation, if
+provided along with the Derivative Works; or, within a display generated by
+the Derivative Works, if and wherever such third-party notices normally
+appear. The contents of the NOTICE file are for informational purposes
+only and do not modify the License. You may add Your own attribution
+notices within Derivative Works that You distribute, alongside or as
+an addendum to the NOTICE text from the Work, provided that such additional
+attribution notices cannot be construed as modifying the License.
+
+You may add Your own copyright statement to Your modifications and may provide
+additional or different license terms and conditions for use, reproduction, or
+distribution of Your modifications, or for any such Derivative Works as a
+whole, provided Your use, reproduction, and distribution of the Work otherwise
+complies with the conditions stated in this License.
+5. Submission of Contributions. Unless You explicitly state otherwise, any
+Contribution intentionally submitted for inclusion in the Work by You to the
+Licensor shall be under the terms and conditions of this License, without any
+additional terms or conditions. Notwithstanding the above, nothing herein
+shall supersede or modify the terms of any separate license agreement you
+may have executed with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade names,
+trademarks, service marks, or product names of the Licensor, except as
+required for reasonable and customary use in describing the origin of the
+Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or agreed to
+in writing, Licensor provides the Work (and each Contributor provides its
+Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+ANY KIND, either express or implied, including, without limitation, any
+warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or
+FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining
+the appropriateness of using or redistributing the Work and assume any risks
+associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory, whether in
+tort (including negligence), contract, or otherwise, unless required by
+applicable law (such as deliberate and grossly negligent acts) or agreed to
+in writing, shall any Contributor be liable to You for damages, including
+any direct, indirect, special, incidental, or consequential damages of any
+character arising as a result of this License or out of the use or inability
+to use the Work (including but not limited to damages for loss of goodwill,
+work stoppage, computer failure or malfunction, or any and all other
+commercial damages or losses), even if such Contributor has been advised
+of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing the
+Work or Derivative Works thereof, You may choose to offer, and charge a
+fee for, acceptance of support, warranty, indemnity, or other liability
+obligations and/or rights consistent with this License. However, in accepting
+such obligations, You may act only on Your own behalf and on Your sole
+responsibility, not on behalf of any other Contributor, and only if You
+agree to indemnify, defend, and hold each Contributor harmless for any
+liability incurred by, or claims asserted against, such Contributor by
+reason of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS \ No newline at end of file
diff --git a/3rdparty/bgfx/3rdparty/etc1/etc1.cpp b/3rdparty/bgfx/3rdparty/etc1/etc1.cpp
new file mode 100644
index 00000000000..0953f989700
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/etc1/etc1.cpp
@@ -0,0 +1,686 @@
+// Copyright 2009 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+//////////////////////////////////////////////////////////////////////////////////////////
+
+// This is a fork of the AOSP project ETC1 codec. The original code can be found
+// at the following web site:
+// https://android.googlesource.com/platform/frameworks/native/+/master/opengl/include/ETC1/
+
+//////////////////////////////////////////////////////////////////////////////////////////
+
+#include "etc1.h"
+
+#include <cstring>
+
+/* From http://www.khronos.org/registry/gles/extensions/OES/OES_compressed_ETC1_RGB8_texture.txt
+
+ The number of bits that represent a 4x4 texel block is 64 bits if
+ <internalformat> is given by ETC1_RGB8_OES.
+
+ The data for a block is a number of bytes,
+
+ {q0, q1, q2, q3, q4, q5, q6, q7}
+
+ where byte q0 is located at the lowest memory address and q7 at
+ the highest. The 64 bits specifying the block is then represented
+ by the following 64 bit integer:
+
+ int64bit = 256*(256*(256*(256*(256*(256*(256*q0+q1)+q2)+q3)+q4)+q5)+q6)+q7;
+
+ ETC1_RGB8_OES:
+
+ a) bit layout in bits 63 through 32 if diffbit = 0
+
+ 63 62 61 60 59 58 57 56 55 54 53 52 51 50 49 48
+ -----------------------------------------------
+ | base col1 | base col2 | base col1 | base col2 |
+ | R1 (4bits)| R2 (4bits)| G1 (4bits)| G2 (4bits)|
+ -----------------------------------------------
+
+ 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32
+ ---------------------------------------------------
+ | base col1 | base col2 | table | table |diff|flip|
+ | B1 (4bits)| B2 (4bits)| cw 1 | cw 2 |bit |bit |
+ ---------------------------------------------------
+
+
+ b) bit layout in bits 63 through 32 if diffbit = 1
+
+ 63 62 61 60 59 58 57 56 55 54 53 52 51 50 49 48
+ -----------------------------------------------
+ | base col1 | dcol 2 | base col1 | dcol 2 |
+ | R1' (5 bits) | dR2 | G1' (5 bits) | dG2 |
+ -----------------------------------------------
+
+ 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32
+ ---------------------------------------------------
+ | base col 1 | dcol 2 | table | table |diff|flip|
+ | B1' (5 bits) | dB2 | cw 1 | cw 2 |bit |bit |
+ ---------------------------------------------------
+
+
+ c) bit layout in bits 31 through 0 (in both cases)
+
+ 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16
+ -----------------------------------------------
+ | most significant pixel index bits |
+ | p| o| n| m| l| k| j| i| h| g| f| e| d| c| b| a|
+ -----------------------------------------------
+
+ 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+ --------------------------------------------------
+ | least significant pixel index bits |
+ | p| o| n| m| l| k| j| i| h| g| f| e| d| c | b | a |
+ --------------------------------------------------
+
+
+ Add table 3.17.2: Intensity modifier sets for ETC1 compressed textures:
+
+ table codeword modifier table
+ ------------------ ----------------------
+ 0 -8 -2 2 8
+ 1 -17 -5 5 17
+ 2 -29 -9 9 29
+ 3 -42 -13 13 42
+ 4 -60 -18 18 60
+ 5 -80 -24 24 80
+ 6 -106 -33 33 106
+ 7 -183 -47 47 183
+
+
+ Add table 3.17.3 Mapping from pixel index values to modifier values for
+ ETC1 compressed textures:
+
+ pixel index value
+ ---------------
+ msb lsb resulting modifier value
+ ----- ----- -------------------------
+ 1 1 -b (large negative value)
+ 1 0 -a (small negative value)
+ 0 0 a (small positive value)
+ 0 1 b (large positive value)
+
+
+ */
+
+static const int kModifierTable[] = {
+/* 0 */2, 8, -2, -8,
+/* 1 */5, 17, -5, -17,
+/* 2 */9, 29, -9, -29,
+/* 3 */13, 42, -13, -42,
+/* 4 */18, 60, -18, -60,
+/* 5 */24, 80, -24, -80,
+/* 6 */33, 106, -33, -106,
+/* 7 */47, 183, -47, -183 };
+
+static const int kLookup[8] = { 0, 1, 2, 3, -4, -3, -2, -1 };
+
+static inline etc1_byte clamp(int x) {
+ return (etc1_byte) (x >= 0 ? (x < 255 ? x : 255) : 0);
+}
+
+static
+inline int convert4To8(int b) {
+ int c = b & 0xf;
+ return (c << 4) | c;
+}
+
+static
+inline int convert5To8(int b) {
+ int c = b & 0x1f;
+ return (c << 3) | (c >> 2);
+}
+
+static
+inline int convert6To8(int b) {
+ int c = b & 0x3f;
+ return (c << 2) | (c >> 4);
+}
+
+static
+inline int divideBy255(int d) {
+ return (d + 128 + (d >> 8)) >> 8;
+}
+
+static
+inline int convert8To4(int b) {
+ int c = b & 0xff;
+ return divideBy255(c * 15);
+}
+
+static
+inline int convert8To5(int b) {
+ int c = b & 0xff;
+ return divideBy255(c * 31);
+}
+
+static
+inline int convertDiff(int base, int diff) {
+ return convert5To8((0x1f & base) + kLookup[0x7 & diff]);
+}
+
+static
+void decode_subblock(etc1_byte* pOut, int r, int g, int b, const int* table,
+ etc1_uint32 low, bool second, bool flipped) {
+ int baseX = 0;
+ int baseY = 0;
+ if (second) {
+ if (flipped) {
+ baseY = 2;
+ } else {
+ baseX = 2;
+ }
+ }
+ for (int i = 0; i < 8; i++) {
+ int x, y;
+ if (flipped) {
+ x = baseX + (i >> 1);
+ y = baseY + (i & 1);
+ } else {
+ x = baseX + (i >> 2);
+ y = baseY + (i & 3);
+ }
+ int k = y + (x * 4);
+ int offset = ((low >> k) & 1) | ((low >> (k + 15)) & 2);
+ int delta = table[offset];
+ etc1_byte* q = pOut + 3 * (x + 4 * y);
+ *q++ = clamp(r + delta);
+ *q++ = clamp(g + delta);
+ *q++ = clamp(b + delta);
+ }
+}
+
+// Input is an ETC1 compressed version of the data.
+// Output is a 4 x 4 square of 3-byte pixels in form R, G, B
+
+void etc1_decode_block(const etc1_byte* pIn, etc1_byte* pOut) {
+ etc1_uint32 high = (pIn[0] << 24) | (pIn[1] << 16) | (pIn[2] << 8) | pIn[3];
+ etc1_uint32 low = (pIn[4] << 24) | (pIn[5] << 16) | (pIn[6] << 8) | pIn[7];
+ int r1, r2, g1, g2, b1, b2;
+ if (high & 2) {
+ // differential
+ int rBase = high >> 27;
+ int gBase = high >> 19;
+ int bBase = high >> 11;
+ r1 = convert5To8(rBase);
+ r2 = convertDiff(rBase, high >> 24);
+ g1 = convert5To8(gBase);
+ g2 = convertDiff(gBase, high >> 16);
+ b1 = convert5To8(bBase);
+ b2 = convertDiff(bBase, high >> 8);
+ } else {
+ // not differential
+ r1 = convert4To8(high >> 28);
+ r2 = convert4To8(high >> 24);
+ g1 = convert4To8(high >> 20);
+ g2 = convert4To8(high >> 16);
+ b1 = convert4To8(high >> 12);
+ b2 = convert4To8(high >> 8);
+ }
+ int tableIndexA = 7 & (high >> 5);
+ int tableIndexB = 7 & (high >> 2);
+ const int* tableA = kModifierTable + tableIndexA * 4;
+ const int* tableB = kModifierTable + tableIndexB * 4;
+ bool flipped = (high & 1) != 0;
+ decode_subblock(pOut, r1, g1, b1, tableA, low, false, flipped);
+ decode_subblock(pOut, r2, g2, b2, tableB, low, true, flipped);
+}
+
+typedef struct {
+ etc1_uint32 high;
+ etc1_uint32 low;
+ etc1_uint32 score; // Lower is more accurate
+} etc_compressed;
+
+static
+inline void take_best(etc_compressed* a, const etc_compressed* b) {
+ if (a->score > b->score) {
+ *a = *b;
+ }
+}
+
+static
+void etc_average_colors_subblock(const etc1_byte* pIn, etc1_uint32 inMask,
+ etc1_byte* pColors, bool flipped, bool second) {
+ int r = 0;
+ int g = 0;
+ int b = 0;
+
+ if (flipped) {
+ int by = 0;
+ if (second) {
+ by = 2;
+ }
+ for (int y = 0; y < 2; y++) {
+ int yy = by + y;
+ for (int x = 0; x < 4; x++) {
+ int i = x + 4 * yy;
+ if (inMask & (1 << i)) {
+ const etc1_byte* p = pIn + i * 3;
+ r += *(p++);
+ g += *(p++);
+ b += *(p++);
+ }
+ }
+ }
+ } else {
+ int bx = 0;
+ if (second) {
+ bx = 2;
+ }
+ for (int y = 0; y < 4; y++) {
+ for (int x = 0; x < 2; x++) {
+ int xx = bx + x;
+ int i = xx + 4 * y;
+ if (inMask & (1 << i)) {
+ const etc1_byte* p = pIn + i * 3;
+ r += *(p++);
+ g += *(p++);
+ b += *(p++);
+ }
+ }
+ }
+ }
+ pColors[0] = (etc1_byte)((r + 4) >> 3);
+ pColors[1] = (etc1_byte)((g + 4) >> 3);
+ pColors[2] = (etc1_byte)((b + 4) >> 3);
+}
+
+static
+inline int square(int x) {
+ return x * x;
+}
+
+static etc1_uint32 chooseModifier(const etc1_byte* pBaseColors,
+ const etc1_byte* pIn, etc1_uint32 *pLow, int bitIndex,
+ const int* pModifierTable) {
+ etc1_uint32 bestScore = ~0;
+ int bestIndex = 0;
+ int pixelR = pIn[0];
+ int pixelG = pIn[1];
+ int pixelB = pIn[2];
+ int r = pBaseColors[0];
+ int g = pBaseColors[1];
+ int b = pBaseColors[2];
+ for (int i = 0; i < 4; i++) {
+ int modifier = pModifierTable[i];
+ int decodedG = clamp(g + modifier);
+ etc1_uint32 score = (etc1_uint32) (6 * square(decodedG - pixelG));
+ if (score >= bestScore) {
+ continue;
+ }
+ int decodedR = clamp(r + modifier);
+ score += (etc1_uint32) (3 * square(decodedR - pixelR));
+ if (score >= bestScore) {
+ continue;
+ }
+ int decodedB = clamp(b + modifier);
+ score += (etc1_uint32) square(decodedB - pixelB);
+ if (score < bestScore) {
+ bestScore = score;
+ bestIndex = i;
+ }
+ }
+ etc1_uint32 lowMask = (((bestIndex >> 1) << 16) | (bestIndex & 1))
+ << bitIndex;
+ *pLow |= lowMask;
+ return bestScore;
+}
+
+static
+void etc_encode_subblock_helper(const etc1_byte* pIn, etc1_uint32 inMask,
+ etc_compressed* pCompressed, bool flipped, bool second,
+ const etc1_byte* pBaseColors, const int* pModifierTable) {
+ int score = pCompressed->score;
+ if (flipped) {
+ int by = 0;
+ if (second) {
+ by = 2;
+ }
+ for (int y = 0; y < 2; y++) {
+ int yy = by + y;
+ for (int x = 0; x < 4; x++) {
+ int i = x + 4 * yy;
+ if (inMask & (1 << i)) {
+ score += chooseModifier(pBaseColors, pIn + i * 3,
+ &pCompressed->low, yy + x * 4, pModifierTable);
+ }
+ }
+ }
+ } else {
+ int bx = 0;
+ if (second) {
+ bx = 2;
+ }
+ for (int y = 0; y < 4; y++) {
+ for (int x = 0; x < 2; x++) {
+ int xx = bx + x;
+ int i = xx + 4 * y;
+ if (inMask & (1 << i)) {
+ score += chooseModifier(pBaseColors, pIn + i * 3,
+ &pCompressed->low, y + xx * 4, pModifierTable);
+ }
+ }
+ }
+ }
+ pCompressed->score = score;
+}
+
+static bool inRange4bitSigned(int color) {
+ return color >= -4 && color <= 3;
+}
+
+static void etc_encodeBaseColors(etc1_byte* pBaseColors,
+ const etc1_byte* pColors, etc_compressed* pCompressed) {
+ int r1, g1, b1, r2, g2, b2; // 8 bit base colors for sub-blocks
+ bool differential;
+ {
+ int r51 = convert8To5(pColors[0]);
+ int g51 = convert8To5(pColors[1]);
+ int b51 = convert8To5(pColors[2]);
+ int r52 = convert8To5(pColors[3]);
+ int g52 = convert8To5(pColors[4]);
+ int b52 = convert8To5(pColors[5]);
+
+ r1 = convert5To8(r51);
+ g1 = convert5To8(g51);
+ b1 = convert5To8(b51);
+
+ int dr = r52 - r51;
+ int dg = g52 - g51;
+ int db = b52 - b51;
+
+ differential = inRange4bitSigned(dr) && inRange4bitSigned(dg)
+ && inRange4bitSigned(db);
+ if (differential) {
+ r2 = convert5To8(r51 + dr);
+ g2 = convert5To8(g51 + dg);
+ b2 = convert5To8(b51 + db);
+ pCompressed->high |= (r51 << 27) | ((7 & dr) << 24) | (g51 << 19)
+ | ((7 & dg) << 16) | (b51 << 11) | ((7 & db) << 8) | 2;
+ }
+ }
+
+ if (!differential) {
+ int r41 = convert8To4(pColors[0]);
+ int g41 = convert8To4(pColors[1]);
+ int b41 = convert8To4(pColors[2]);
+ int r42 = convert8To4(pColors[3]);
+ int g42 = convert8To4(pColors[4]);
+ int b42 = convert8To4(pColors[5]);
+ r1 = convert4To8(r41);
+ g1 = convert4To8(g41);
+ b1 = convert4To8(b41);
+ r2 = convert4To8(r42);
+ g2 = convert4To8(g42);
+ b2 = convert4To8(b42);
+ pCompressed->high |= (r41 << 28) | (r42 << 24) | (g41 << 20) | (g42
+ << 16) | (b41 << 12) | (b42 << 8);
+ }
+ pBaseColors[0] = r1;
+ pBaseColors[1] = g1;
+ pBaseColors[2] = b1;
+ pBaseColors[3] = r2;
+ pBaseColors[4] = g2;
+ pBaseColors[5] = b2;
+}
+
+static
+void etc_encode_block_helper(const etc1_byte* pIn, etc1_uint32 inMask,
+ const etc1_byte* pColors, etc_compressed* pCompressed, bool flipped) {
+ pCompressed->score = ~0;
+ pCompressed->high = (flipped ? 1 : 0);
+ pCompressed->low = 0;
+
+ etc1_byte pBaseColors[6];
+
+ etc_encodeBaseColors(pBaseColors, pColors, pCompressed);
+
+ int originalHigh = pCompressed->high;
+
+ const int* pModifierTable = kModifierTable;
+ for (int i = 0; i < 8; i++, pModifierTable += 4) {
+ etc_compressed temp;
+ temp.score = 0;
+ temp.high = originalHigh | (i << 5);
+ temp.low = 0;
+ etc_encode_subblock_helper(pIn, inMask, &temp, flipped, false,
+ pBaseColors, pModifierTable);
+ take_best(pCompressed, &temp);
+ }
+ pModifierTable = kModifierTable;
+ etc_compressed firstHalf = *pCompressed;
+ for (int i = 0; i < 8; i++, pModifierTable += 4) {
+ etc_compressed temp;
+ temp.score = firstHalf.score;
+ temp.high = firstHalf.high | (i << 2);
+ temp.low = firstHalf.low;
+ etc_encode_subblock_helper(pIn, inMask, &temp, flipped, true,
+ pBaseColors + 3, pModifierTable);
+ if (i == 0) {
+ *pCompressed = temp;
+ } else {
+ take_best(pCompressed, &temp);
+ }
+ }
+}
+
+static void writeBigEndian(etc1_byte* pOut, etc1_uint32 d) {
+ pOut[0] = (etc1_byte)(d >> 24);
+ pOut[1] = (etc1_byte)(d >> 16);
+ pOut[2] = (etc1_byte)(d >> 8);
+ pOut[3] = (etc1_byte) d;
+}
+
+// Input is a 4 x 4 square of 3-byte pixels in form R, G, B
+// inmask is a 16-bit mask where bit (1 << (x + y * 4)) tells whether the corresponding (x,y)
+// pixel is valid or not. Invalid pixel color values are ignored when compressing.
+// Output is an ETC1 compressed version of the data.
+
+void etc1_encode_block(const etc1_byte* pIn, etc1_uint32 inMask,
+ etc1_byte* pOut) {
+ etc1_byte colors[6];
+ etc1_byte flippedColors[6];
+ etc_average_colors_subblock(pIn, inMask, colors, false, false);
+ etc_average_colors_subblock(pIn, inMask, colors + 3, false, true);
+ etc_average_colors_subblock(pIn, inMask, flippedColors, true, false);
+ etc_average_colors_subblock(pIn, inMask, flippedColors + 3, true, true);
+
+ etc_compressed a, b;
+ etc_encode_block_helper(pIn, inMask, colors, &a, false);
+ etc_encode_block_helper(pIn, inMask, flippedColors, &b, true);
+ take_best(&a, &b);
+ writeBigEndian(pOut, a.high);
+ writeBigEndian(pOut + 4, a.low);
+}
+
+// Return the size of the encoded image data (does not include size of PKM header).
+
+etc1_uint32 etc1_get_encoded_data_size(etc1_uint32 width, etc1_uint32 height) {
+ return (((width + 3) & ~3) * ((height + 3) & ~3)) >> 1;
+}
+
+// Encode an entire image.
+// pIn - pointer to the image data. Formatted such that the Red component of
+// pixel (x,y) is at pIn + pixelSize * x + stride * y + redOffset;
+// pOut - pointer to encoded data. Must be large enough to store entire encoded image.
+
+int etc1_encode_image(const etc1_byte* pIn, etc1_uint32 width, etc1_uint32 height,
+ etc1_uint32 pixelSize, etc1_uint32 stride, etc1_byte* pOut) {
+ if (pixelSize < 2 || pixelSize > 4) {
+ return -1;
+ }
+ static const unsigned short kYMask[] = { 0x0, 0xf, 0xff, 0xfff, 0xffff };
+ static const unsigned short kXMask[] = { 0x0, 0x1111, 0x3333, 0x7777,
+ 0xffff };
+ etc1_byte block[ETC1_DECODED_BLOCK_SIZE];
+ etc1_byte encoded[ETC1_ENCODED_BLOCK_SIZE];
+
+ etc1_uint32 encodedWidth = (width + 3) & ~3;
+ etc1_uint32 encodedHeight = (height + 3) & ~3;
+
+ for (etc1_uint32 y = 0; y < encodedHeight; y += 4) {
+ etc1_uint32 yEnd = height - y;
+ if (yEnd > 4) {
+ yEnd = 4;
+ }
+ int ymask = kYMask[yEnd];
+ for (etc1_uint32 x = 0; x < encodedWidth; x += 4) {
+ etc1_uint32 xEnd = width - x;
+ if (xEnd > 4) {
+ xEnd = 4;
+ }
+ int mask = ymask & kXMask[xEnd];
+ for (etc1_uint32 cy = 0; cy < yEnd; cy++) {
+ etc1_byte* q = block + (cy * 4) * 3;
+ const etc1_byte* p = pIn + pixelSize * x + stride * (y + cy);
+ if (pixelSize >= 3) {
+ for (etc1_uint32 cx = 0; cx < xEnd; cx++) {
+ memcpy(q, p, 3);
+ q += 3;
+ p += pixelSize;
+ }
+ } else {
+ for (etc1_uint32 cx = 0; cx < xEnd; cx++) {
+ int pixel = (p[1] << 8) | p[0];
+ *q++ = convert5To8(pixel >> 11);
+ *q++ = convert6To8(pixel >> 5);
+ *q++ = convert5To8(pixel);
+ p += pixelSize;
+ }
+ }
+ }
+ etc1_encode_block(block, mask, encoded);
+ memcpy(pOut, encoded, sizeof(encoded));
+ pOut += sizeof(encoded);
+ }
+ }
+ return 0;
+}
+
+// Decode an entire image.
+// pIn - pointer to encoded data.
+// pOut - pointer to the image data. Will be written such that the Red component of
+// pixel (x,y) is at pIn + pixelSize * x + stride * y + redOffset. Must be
+// large enough to store entire image.
+
+
+int etc1_decode_image(const etc1_byte* pIn, etc1_byte* pOut,
+ etc1_uint32 width, etc1_uint32 height,
+ etc1_uint32 pixelSize, etc1_uint32 stride) {
+ if (pixelSize < 2 || pixelSize > 4) {
+ return -1;
+ }
+ etc1_byte block[ETC1_DECODED_BLOCK_SIZE];
+
+ etc1_uint32 encodedWidth = (width + 3) & ~3;
+ etc1_uint32 encodedHeight = (height + 3) & ~3;
+
+ for (etc1_uint32 y = 0; y < encodedHeight; y += 4) {
+ etc1_uint32 yEnd = height - y;
+ if (yEnd > 4) {
+ yEnd = 4;
+ }
+ for (etc1_uint32 x = 0; x < encodedWidth; x += 4) {
+ etc1_uint32 xEnd = width - x;
+ if (xEnd > 4) {
+ xEnd = 4;
+ }
+ etc1_decode_block(pIn, block);
+ pIn += ETC1_ENCODED_BLOCK_SIZE;
+ for (etc1_uint32 cy = 0; cy < yEnd; cy++) {
+ const etc1_byte* q = block + (cy * 4) * 3;
+ etc1_byte* p = pOut + pixelSize * x + stride * (y + cy);
+ if (pixelSize >= 3) {
+ for (etc1_uint32 cx = 0; cx < xEnd; cx++) {
+ memcpy(p, q, 3);
+ q += 3;
+ p += pixelSize;
+ }
+ } else {
+ for (etc1_uint32 cx = 0; cx < xEnd; cx++) {
+ etc1_byte r = *q++;
+ etc1_byte g = *q++;
+ etc1_byte b = *q++;
+ etc1_uint32 pixel = ((r >> 3) << 11) | ((g >> 2) << 5) | (b >> 3);
+ *p++ = (etc1_byte) pixel;
+ *p++ = (etc1_byte) (pixel >> 8);
+ }
+ }
+ }
+ }
+ }
+ return 0;
+}
+
+static const char kMagic[] = { 'P', 'K', 'M', ' ', '1', '0' };
+
+static const etc1_uint32 ETC1_PKM_FORMAT_OFFSET = 6;
+static const etc1_uint32 ETC1_PKM_ENCODED_WIDTH_OFFSET = 8;
+static const etc1_uint32 ETC1_PKM_ENCODED_HEIGHT_OFFSET = 10;
+static const etc1_uint32 ETC1_PKM_WIDTH_OFFSET = 12;
+static const etc1_uint32 ETC1_PKM_HEIGHT_OFFSET = 14;
+
+static const etc1_uint32 ETC1_RGB_NO_MIPMAPS = 0;
+
+static void writeBEUint16(etc1_byte* pOut, etc1_uint32 data) {
+ pOut[0] = (etc1_byte) (data >> 8);
+ pOut[1] = (etc1_byte) data;
+}
+
+static etc1_uint32 readBEUint16(const etc1_byte* pIn) {
+ return (pIn[0] << 8) | pIn[1];
+}
+
+// Format a PKM header
+
+void etc1_pkm_format_header(etc1_byte* pHeader, etc1_uint32 width, etc1_uint32 height) {
+ memcpy(pHeader, kMagic, sizeof(kMagic));
+ etc1_uint32 encodedWidth = (width + 3) & ~3;
+ etc1_uint32 encodedHeight = (height + 3) & ~3;
+ writeBEUint16(pHeader + ETC1_PKM_FORMAT_OFFSET, ETC1_RGB_NO_MIPMAPS);
+ writeBEUint16(pHeader + ETC1_PKM_ENCODED_WIDTH_OFFSET, encodedWidth);
+ writeBEUint16(pHeader + ETC1_PKM_ENCODED_HEIGHT_OFFSET, encodedHeight);
+ writeBEUint16(pHeader + ETC1_PKM_WIDTH_OFFSET, width);
+ writeBEUint16(pHeader + ETC1_PKM_HEIGHT_OFFSET, height);
+}
+
+// Check if a PKM header is correctly formatted.
+
+etc1_bool etc1_pkm_is_valid(const etc1_byte* pHeader) {
+ if (memcmp(pHeader, kMagic, sizeof(kMagic))) {
+ return false;
+ }
+ etc1_uint32 format = readBEUint16(pHeader + ETC1_PKM_FORMAT_OFFSET);
+ etc1_uint32 encodedWidth = readBEUint16(pHeader + ETC1_PKM_ENCODED_WIDTH_OFFSET);
+ etc1_uint32 encodedHeight = readBEUint16(pHeader + ETC1_PKM_ENCODED_HEIGHT_OFFSET);
+ etc1_uint32 width = readBEUint16(pHeader + ETC1_PKM_WIDTH_OFFSET);
+ etc1_uint32 height = readBEUint16(pHeader + ETC1_PKM_HEIGHT_OFFSET);
+ return format == ETC1_RGB_NO_MIPMAPS &&
+ encodedWidth >= width && encodedWidth - width < 4 &&
+ encodedHeight >= height && encodedHeight - height < 4;
+}
+
+// Read the image width from a PKM header
+
+etc1_uint32 etc1_pkm_get_width(const etc1_byte* pHeader) {
+ return readBEUint16(pHeader + ETC1_PKM_WIDTH_OFFSET);
+}
+
+// Read the image height from a PKM header
+
+etc1_uint32 etc1_pkm_get_height(const etc1_byte* pHeader){
+ return readBEUint16(pHeader + ETC1_PKM_HEIGHT_OFFSET);
+}
diff --git a/3rdparty/bgfx/3rdparty/etc1/etc1.h b/3rdparty/bgfx/3rdparty/etc1/etc1.h
new file mode 100644
index 00000000000..d66ca9d3e9e
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/etc1/etc1.h
@@ -0,0 +1,114 @@
+// Copyright 2009 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+//////////////////////////////////////////////////////////////////////////////////////////
+
+// This is a fork of the AOSP project ETC1 codec. The original code can be found
+// at the following web site:
+// https://android.googlesource.com/platform/frameworks/native/+/master/opengl/libs/ETC1/
+
+//////////////////////////////////////////////////////////////////////////////////////////
+
+#ifndef __etc1_h__
+#define __etc1_h__
+
+#define ETC1_ENCODED_BLOCK_SIZE 8
+#define ETC1_DECODED_BLOCK_SIZE 48
+
+#ifndef ETC1_RGB8_OES
+#define ETC1_RGB8_OES 0x8D64
+#endif
+
+typedef unsigned char etc1_byte;
+typedef int etc1_bool;
+typedef unsigned int etc1_uint32;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// Encode a block of pixels.
+//
+// pIn is a pointer to a ETC_DECODED_BLOCK_SIZE array of bytes that represent a
+// 4 x 4 square of 3-byte pixels in form R, G, B. Byte (3 * (x + 4 * y) is the R
+// value of pixel (x, y).
+//
+// validPixelMask is a 16-bit mask where bit (1 << (x + y * 4)) indicates whether
+// the corresponding (x,y) pixel is valid. Invalid pixel color values are ignored when compressing.
+//
+// pOut is an ETC1 compressed version of the data.
+
+void etc1_encode_block(const etc1_byte* pIn, etc1_uint32 validPixelMask, etc1_byte* pOut);
+
+// Decode a block of pixels.
+//
+// pIn is an ETC1 compressed version of the data.
+//
+// pOut is a pointer to a ETC_DECODED_BLOCK_SIZE array of bytes that represent a
+// 4 x 4 square of 3-byte pixels in form R, G, B. Byte (3 * (x + 4 * y) is the R
+// value of pixel (x, y).
+
+void etc1_decode_block(const etc1_byte* pIn, etc1_byte* pOut);
+
+// Return the size of the encoded image data (does not include size of PKM header).
+
+etc1_uint32 etc1_get_encoded_data_size(etc1_uint32 width, etc1_uint32 height);
+
+// Encode an entire image.
+// pIn - pointer to the image data. Formatted such that
+// pixel (x,y) is at pIn + pixelSize * x + stride * y;
+// pOut - pointer to encoded data. Must be large enough to store entire encoded image.
+// pixelSize can be 2 or 3. 2 is an GL_UNSIGNED_SHORT_5_6_5 image, 3 is a GL_BYTE RGB image.
+// returns non-zero if there is an error.
+
+int etc1_encode_image(const etc1_byte* pIn, etc1_uint32 width, etc1_uint32 height,
+ etc1_uint32 pixelSize, etc1_uint32 stride, etc1_byte* pOut);
+
+// Decode an entire image.
+// pIn - pointer to encoded data.
+// pOut - pointer to the image data. Will be written such that
+// pixel (x,y) is at pIn + pixelSize * x + stride * y. Must be
+// large enough to store entire image.
+// pixelSize can be 2 or 3. 2 is an GL_UNSIGNED_SHORT_5_6_5 image, 3 is a GL_BYTE RGB image.
+// returns non-zero if there is an error.
+
+int etc1_decode_image(const etc1_byte* pIn, etc1_byte* pOut,
+ etc1_uint32 width, etc1_uint32 height,
+ etc1_uint32 pixelSize, etc1_uint32 stride);
+
+// Size of a PKM header, in bytes.
+
+#define ETC_PKM_HEADER_SIZE 16
+
+// Format a PKM header
+
+void etc1_pkm_format_header(etc1_byte* pHeader, etc1_uint32 width, etc1_uint32 height);
+
+// Check if a PKM header is correctly formatted.
+
+etc1_bool etc1_pkm_is_valid(const etc1_byte* pHeader);
+
+// Read the image width from a PKM header
+
+etc1_uint32 etc1_pkm_get_width(const etc1_byte* pHeader);
+
+// Read the image height from a PKM header
+
+etc1_uint32 etc1_pkm_get_height(const etc1_byte* pHeader);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/3rdparty/bgfx/3rdparty/freetype/freetype.h b/3rdparty/bgfx/3rdparty/freetype/freetype.h
index cec419ac515..fb67c097b21 100644
--- a/3rdparty/bgfx/3rdparty/freetype/freetype.h
+++ b/3rdparty/bgfx/3rdparty/freetype/freetype.h
@@ -1,6 +1,6 @@
#pragma once
-#if defined(_MSC_VER)
+#if defined(_MSC_VER) && !defined(__clang__)
# pragma warning(push)
# pragma warning(disable: 4100) // DISABLE warning C4100: '' : unreferenced formal parameter
# pragma warning(disable: 4146) // DISABLE warning C4146: unary minus operator applied to unsigned type, result still unsigned
@@ -10,6 +10,9 @@
# pragma warning(disable: 4701) // DISABLE warning C4701: potentially uninitialized local variable '' used
#elif defined(__GNUC__)
# pragma GCC system_header
+#elif defined(__clang__)
+# pragma clang diagnostic ignored "-Wshift-negative-value"
+# pragma clang diagnostic ignored "-Wuninitialized"
#endif // defined(__GNUC__)
/***************************************************************************/
diff --git a/3rdparty/bgfx/3rdparty/libsquish/LICENSE b/3rdparty/bgfx/3rdparty/libsquish/LICENSE
new file mode 100644
index 00000000000..ed1c78d9370
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/libsquish/LICENSE
@@ -0,0 +1,20 @@
+ Copyright (c) 2006 Simon Brown si@sjbrown.co.uk
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/3rdparty/bgfx/3rdparty/libsquish/README b/3rdparty/bgfx/3rdparty/libsquish/README
new file mode 100644
index 00000000000..d26b72ed5c7
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/libsquish/README
@@ -0,0 +1,35 @@
+LICENSE
+-------
+
+The squish library is distributed under the terms and conditions of the MIT
+license. This license is specified at the top of each source file and must be
+preserved in its entirety.
+
+BUILDING AND INSTALLING THE LIBRARY
+-----------------------------------
+
+If you are using Visual Studio 2003 or above under Windows then load the Visual
+Studio 2003 project in the vs7 folder. By default, the library is built using
+SSE2 optimisations. To change this either change or remove the SQUISH_USE_SSE=2
+from the preprocessor symbols.
+
+If you are using a Mac then load the Xcode 2.2 project in the distribution. By
+default, the library is built using Altivec optimisations. To change this
+either change or remove SQUISH_USE_ALTIVEC=1 from the preprocessor symbols. I
+guess I'll have to think about changing this for the new Intel Macs that are
+rolling out...
+
+If you are using unix then first edit the config file in the base directory of
+the distribution, enabling Altivec or SSE with the USE_ALTIVEC or USE_SSE
+variables, and editing the optimisation flags passed to the C++ compiler if
+necessary. Then make can be used to build the library, and make install (from
+the superuser account) can be used to install (into /usr/local by default).
+
+REPORTING BUGS OR FEATURE REQUESTS
+----------------------------------
+
+Feedback can be sent to Simon Brown (the developer) at si@sjbrown.co.uk
+
+New releases are announced on the squish library homepage at
+http://sjbrown.co.uk/?code=squish
+
diff --git a/3rdparty/bgfx/3rdparty/libsquish/alpha.cpp b/3rdparty/bgfx/3rdparty/libsquish/alpha.cpp
new file mode 100644
index 00000000000..0f94e2147cd
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/libsquish/alpha.cpp
@@ -0,0 +1,350 @@
+/* -----------------------------------------------------------------------------
+
+ Copyright (c) 2006 Simon Brown si@sjbrown.co.uk
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ -------------------------------------------------------------------------- */
+
+#include "alpha.h"
+
+#include <climits>
+#include <algorithm>
+
+namespace squish {
+
+static int FloatToInt( float a, int limit )
+{
+ // use ANSI round-to-zero behaviour to get round-to-nearest
+ int i = ( int )( a + 0.5f );
+
+ // clamp to the limit
+ if( i < 0 )
+ i = 0;
+ else if( i > limit )
+ i = limit;
+
+ // done
+ return i;
+}
+
+void CompressAlphaDxt3( u8 const* rgba, int mask, void* block )
+{
+ u8* bytes = reinterpret_cast< u8* >( block );
+
+ // quantise and pack the alpha values pairwise
+ for( int i = 0; i < 8; ++i )
+ {
+ // quantise down to 4 bits
+ float alpha1 = ( float )rgba[8*i + 3] * ( 15.0f/255.0f );
+ float alpha2 = ( float )rgba[8*i + 7] * ( 15.0f/255.0f );
+ int quant1 = FloatToInt( alpha1, 15 );
+ int quant2 = FloatToInt( alpha2, 15 );
+
+ // set alpha to zero where masked
+ int bit1 = 1 << ( 2*i );
+ int bit2 = 1 << ( 2*i + 1 );
+ if( ( mask & bit1 ) == 0 )
+ quant1 = 0;
+ if( ( mask & bit2 ) == 0 )
+ quant2 = 0;
+
+ // pack into the byte
+ bytes[i] = ( u8 )( quant1 | ( quant2 << 4 ) );
+ }
+}
+
+void DecompressAlphaDxt3( u8* rgba, void const* block )
+{
+ u8 const* bytes = reinterpret_cast< u8 const* >( block );
+
+ // unpack the alpha values pairwise
+ for( int i = 0; i < 8; ++i )
+ {
+ // quantise down to 4 bits
+ u8 quant = bytes[i];
+
+ // unpack the values
+ u8 lo = quant & 0x0f;
+ u8 hi = quant & 0xf0;
+
+ // convert back up to bytes
+ rgba[8*i + 3] = lo | ( lo << 4 );
+ rgba[8*i + 7] = hi | ( hi >> 4 );
+ }
+}
+
+static void FixRange( int& min, int& max, int steps )
+{
+ if( max - min < steps )
+ max = std::min( min + steps, 255 );
+ if( max - min < steps )
+ min = std::max( 0, max - steps );
+}
+
+static int FitCodes( u8 const* rgba, int mask, u8 const* codes, u8* indices )
+{
+ // fit each alpha value to the codebook
+ int err = 0;
+ for( int i = 0; i < 16; ++i )
+ {
+ // check this pixel is valid
+ int bit = 1 << i;
+ if( ( mask & bit ) == 0 )
+ {
+ // use the first code
+ indices[i] = 0;
+ continue;
+ }
+
+ // find the least error and corresponding index
+ int value = rgba[4*i + 3];
+ int least = INT_MAX;
+ int index = 0;
+ for( int j = 0; j < 8; ++j )
+ {
+ // get the squared error from this code
+ int dist = ( int )value - ( int )codes[j];
+ dist *= dist;
+
+ // compare with the best so far
+ if( dist < least )
+ {
+ least = dist;
+ index = j;
+ }
+ }
+
+ // save this index and accumulate the error
+ indices[i] = ( u8 )index;
+ err += least;
+ }
+
+ // return the total error
+ return err;
+}
+
+static void WriteAlphaBlock( int alpha0, int alpha1, u8 const* indices, void* block )
+{
+ u8* bytes = reinterpret_cast< u8* >( block );
+
+ // write the first two bytes
+ bytes[0] = ( u8 )alpha0;
+ bytes[1] = ( u8 )alpha1;
+
+ // pack the indices with 3 bits each
+ u8* dest = bytes + 2;
+ u8 const* src = indices;
+ for( int i = 0; i < 2; ++i )
+ {
+ // pack 8 3-bit values
+ int value = 0;
+ for( int j = 0; j < 8; ++j )
+ {
+ int index = *src++;
+ value |= ( index << 3*j );
+ }
+
+ // store in 3 bytes
+ for( int j = 0; j < 3; ++j )
+ {
+ int byte = ( value >> 8*j ) & 0xff;
+ *dest++ = ( u8 )byte;
+ }
+ }
+}
+
+static void WriteAlphaBlock5( int alpha0, int alpha1, u8 const* indices, void* block )
+{
+ // check the relative values of the endpoints
+ if( alpha0 > alpha1 )
+ {
+ // swap the indices
+ u8 swapped[16];
+ for( int i = 0; i < 16; ++i )
+ {
+ u8 index = indices[i];
+ if( index == 0 )
+ swapped[i] = 1;
+ else if( index == 1 )
+ swapped[i] = 0;
+ else if( index <= 5 )
+ swapped[i] = 7 - index;
+ else
+ swapped[i] = index;
+ }
+
+ // write the block
+ WriteAlphaBlock( alpha1, alpha0, swapped, block );
+ }
+ else
+ {
+ // write the block
+ WriteAlphaBlock( alpha0, alpha1, indices, block );
+ }
+}
+
+static void WriteAlphaBlock7( int alpha0, int alpha1, u8 const* indices, void* block )
+{
+ // check the relative values of the endpoints
+ if( alpha0 < alpha1 )
+ {
+ // swap the indices
+ u8 swapped[16];
+ for( int i = 0; i < 16; ++i )
+ {
+ u8 index = indices[i];
+ if( index == 0 )
+ swapped[i] = 1;
+ else if( index == 1 )
+ swapped[i] = 0;
+ else
+ swapped[i] = 9 - index;
+ }
+
+ // write the block
+ WriteAlphaBlock( alpha1, alpha0, swapped, block );
+ }
+ else
+ {
+ // write the block
+ WriteAlphaBlock( alpha0, alpha1, indices, block );
+ }
+}
+
+void CompressAlphaDxt5( u8 const* rgba, int mask, void* block )
+{
+ // get the range for 5-alpha and 7-alpha interpolation
+ int min5 = 255;
+ int max5 = 0;
+ int min7 = 255;
+ int max7 = 0;
+ for( int i = 0; i < 16; ++i )
+ {
+ // check this pixel is valid
+ int bit = 1 << i;
+ if( ( mask & bit ) == 0 )
+ continue;
+
+ // incorporate into the min/max
+ int value = rgba[4*i + 3];
+ if( value < min7 )
+ min7 = value;
+ if( value > max7 )
+ max7 = value;
+ if( value != 0 && value < min5 )
+ min5 = value;
+ if( value != 255 && value > max5 )
+ max5 = value;
+ }
+
+ // handle the case that no valid range was found
+ if( min5 > max5 )
+ min5 = max5;
+ if( min7 > max7 )
+ min7 = max7;
+
+ // fix the range to be the minimum in each case
+ FixRange( min5, max5, 5 );
+ FixRange( min7, max7, 7 );
+
+ // set up the 5-alpha code book
+ u8 codes5[8];
+ codes5[0] = ( u8 )min5;
+ codes5[1] = ( u8 )max5;
+ for( int i = 1; i < 5; ++i )
+ codes5[1 + i] = ( u8 )( ( ( 5 - i )*min5 + i*max5 )/5 );
+ codes5[6] = 0;
+ codes5[7] = 255;
+
+ // set up the 7-alpha code book
+ u8 codes7[8];
+ codes7[0] = ( u8 )min7;
+ codes7[1] = ( u8 )max7;
+ for( int i = 1; i < 7; ++i )
+ codes7[1 + i] = ( u8 )( ( ( 7 - i )*min7 + i*max7 )/7 );
+
+ // fit the data to both code books
+ u8 indices5[16];
+ u8 indices7[16];
+ int err5 = FitCodes( rgba, mask, codes5, indices5 );
+ int err7 = FitCodes( rgba, mask, codes7, indices7 );
+
+ // save the block with least error
+ if( err5 <= err7 )
+ WriteAlphaBlock5( min5, max5, indices5, block );
+ else
+ WriteAlphaBlock7( min7, max7, indices7, block );
+}
+
+void DecompressAlphaDxt5( u8* rgba, void const* block )
+{
+ // get the two alpha values
+ u8 const* bytes = reinterpret_cast< u8 const* >( block );
+ int alpha0 = bytes[0];
+ int alpha1 = bytes[1];
+
+ // compare the values to build the codebook
+ u8 codes[8];
+ codes[0] = ( u8 )alpha0;
+ codes[1] = ( u8 )alpha1;
+ if( alpha0 <= alpha1 )
+ {
+ // use 5-alpha codebook
+ for( int i = 1; i < 5; ++i )
+ codes[1 + i] = ( u8 )( ( ( 5 - i )*alpha0 + i*alpha1 )/5 );
+ codes[6] = 0;
+ codes[7] = 255;
+ }
+ else
+ {
+ // use 7-alpha codebook
+ for( int i = 1; i < 7; ++i )
+ codes[1 + i] = ( u8 )( ( ( 7 - i )*alpha0 + i*alpha1 )/7 );
+ }
+
+ // decode the indices
+ u8 indices[16];
+ u8 const* src = bytes + 2;
+ u8* dest = indices;
+ for( int i = 0; i < 2; ++i )
+ {
+ // grab 3 bytes
+ int value = 0;
+ for( int j = 0; j < 3; ++j )
+ {
+ int byte = *src++;
+ value |= ( byte << 8*j );
+ }
+
+ // unpack 8 3-bit values from it
+ for( int j = 0; j < 8; ++j )
+ {
+ int index = ( value >> 3*j ) & 0x7;
+ *dest++ = ( u8 )index;
+ }
+ }
+
+ // write out the indexed codebook values
+ for( int i = 0; i < 16; ++i )
+ rgba[4*i + 3] = codes[indices[i]];
+}
+
+} // namespace squish
diff --git a/3rdparty/bgfx/3rdparty/libsquish/alpha.h b/3rdparty/bgfx/3rdparty/libsquish/alpha.h
new file mode 100644
index 00000000000..e5e7f320aa8
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/libsquish/alpha.h
@@ -0,0 +1,41 @@
+/* -----------------------------------------------------------------------------
+
+ Copyright (c) 2006 Simon Brown si@sjbrown.co.uk
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ -------------------------------------------------------------------------- */
+
+#ifndef SQUISH_ALPHA_H
+#define SQUISH_ALPHA_H
+
+#include "squish.h"
+
+namespace squish {
+
+void CompressAlphaDxt3( u8 const* rgba, int mask, void* block );
+void CompressAlphaDxt5( u8 const* rgba, int mask, void* block );
+
+void DecompressAlphaDxt3( u8* rgba, void const* block );
+void DecompressAlphaDxt5( u8* rgba, void const* block );
+
+} // namespace squish
+
+#endif // ndef SQUISH_ALPHA_H
diff --git a/3rdparty/bgfx/3rdparty/libsquish/clusterfit.cpp b/3rdparty/bgfx/3rdparty/libsquish/clusterfit.cpp
new file mode 100644
index 00000000000..96704460ec7
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/libsquish/clusterfit.cpp
@@ -0,0 +1,392 @@
+/* -----------------------------------------------------------------------------
+
+ Copyright (c) 2006 Simon Brown si@sjbrown.co.uk
+ Copyright (c) 2007 Ignacio Castano icastano@nvidia.com
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ -------------------------------------------------------------------------- */
+
+#include "clusterfit.h"
+#include "colourset.h"
+#include "colourblock.h"
+#include <cfloat>
+
+namespace squish {
+
+ClusterFit::ClusterFit( ColourSet const* colours, int flags, float* metric )
+ : ColourFit( colours, flags )
+{
+ // set the iteration count
+ m_iterationCount = ( m_flags & kColourIterativeClusterFit ) ? kMaxIterations : 1;
+
+ // initialise the metric (old perceptual = 0.2126f, 0.7152f, 0.0722f)
+ if( metric )
+ m_metric = Vec4( metric[0], metric[1], metric[2], 1.0f );
+ else
+ m_metric = VEC4_CONST( 1.0f );
+
+ // initialise the best error
+ m_besterror = VEC4_CONST( FLT_MAX );
+
+ // cache some values
+ int const count = m_colours->GetCount();
+ Vec3 const* values = m_colours->GetPoints();
+
+ // get the covariance matrix
+ Sym3x3 covariance = ComputeWeightedCovariance( count, values, m_colours->GetWeights() );
+
+ // compute the principle component
+ m_principle = ComputePrincipleComponent( covariance );
+}
+
+bool ClusterFit::ConstructOrdering( Vec3 const& axis, int iteration )
+{
+ // cache some values
+ int const count = m_colours->GetCount();
+ Vec3 const* values = m_colours->GetPoints();
+
+ // build the list of dot products
+ float dps[16];
+ u8* order = ( u8* )m_order + 16*iteration;
+ for( int i = 0; i < count; ++i )
+ {
+ dps[i] = Dot( values[i], axis );
+ order[i] = ( u8 )i;
+ }
+
+ // stable sort using them
+ for( int i = 0; i < count; ++i )
+ {
+ for( int j = i; j > 0 && dps[j] < dps[j - 1]; --j )
+ {
+ std::swap( dps[j], dps[j - 1] );
+ std::swap( order[j], order[j - 1] );
+ }
+ }
+
+ // check this ordering is unique
+ for( int it = 0; it < iteration; ++it )
+ {
+ u8 const* prev = ( u8* )m_order + 16*it;
+ bool same = true;
+ for( int i = 0; i < count; ++i )
+ {
+ if( order[i] != prev[i] )
+ {
+ same = false;
+ break;
+ }
+ }
+ if( same )
+ return false;
+ }
+
+ // copy the ordering and weight all the points
+ Vec3 const* unweighted = m_colours->GetPoints();
+ float const* weights = m_colours->GetWeights();
+ m_xsum_wsum = VEC4_CONST( 0.0f );
+ for( int i = 0; i < count; ++i )
+ {
+ int j = order[i];
+ Vec4 p( unweighted[j].X(), unweighted[j].Y(), unweighted[j].Z(), 1.0f );
+ Vec4 w( weights[j] );
+ Vec4 x = p*w;
+ m_points_weights[i] = x;
+ m_xsum_wsum += x;
+ }
+ return true;
+}
+
+void ClusterFit::Compress3( void* block )
+{
+ // declare variables
+ int const count = m_colours->GetCount();
+ Vec4 const two = VEC4_CONST( 2.0 );
+ Vec4 const one = VEC4_CONST( 1.0f );
+ Vec4 const half_half2( 0.5f, 0.5f, 0.5f, 0.25f );
+ Vec4 const zero = VEC4_CONST( 0.0f );
+ Vec4 const half = VEC4_CONST( 0.5f );
+ Vec4 const grid( 31.0f, 63.0f, 31.0f, 0.0f );
+ Vec4 const gridrcp( 1.0f/31.0f, 1.0f/63.0f, 1.0f/31.0f, 0.0f );
+
+ // prepare an ordering using the principle axis
+ ConstructOrdering( m_principle, 0 );
+
+ // check all possible clusters and iterate on the total order
+ Vec4 beststart = VEC4_CONST( 0.0f );
+ Vec4 bestend = VEC4_CONST( 0.0f );
+ Vec4 besterror = m_besterror;
+ u8 bestindices[16];
+ int bestiteration = 0;
+ int besti = 0, bestj = 0;
+
+ // loop over iterations (we avoid the case that all points in first or last cluster)
+ for( int iterationIndex = 0;; )
+ {
+ // first cluster [0,i) is at the start
+ Vec4 part0 = VEC4_CONST( 0.0f );
+ for( int i = 0; i < count; ++i )
+ {
+ // second cluster [i,j) is half along
+ Vec4 part1 = ( i == 0 ) ? m_points_weights[0] : VEC4_CONST( 0.0f );
+ int jmin = ( i == 0 ) ? 1 : i;
+ for( int j = jmin;; )
+ {
+ // last cluster [j,count) is at the end
+ Vec4 part2 = m_xsum_wsum - part1 - part0;
+
+ // compute least squares terms directly
+ Vec4 alphax_sum = MultiplyAdd( part1, half_half2, part0 );
+ Vec4 alpha2_sum = alphax_sum.SplatW();
+
+ Vec4 betax_sum = MultiplyAdd( part1, half_half2, part2 );
+ Vec4 beta2_sum = betax_sum.SplatW();
+
+ Vec4 alphabeta_sum = ( part1*half_half2 ).SplatW();
+
+ // compute the least-squares optimal points
+ Vec4 factor = Reciprocal( NegativeMultiplySubtract( alphabeta_sum, alphabeta_sum, alpha2_sum*beta2_sum ) );
+ Vec4 a = NegativeMultiplySubtract( betax_sum, alphabeta_sum, alphax_sum*beta2_sum )*factor;
+ Vec4 b = NegativeMultiplySubtract( alphax_sum, alphabeta_sum, betax_sum*alpha2_sum )*factor;
+
+ // clamp to the grid
+ a = Min( one, Max( zero, a ) );
+ b = Min( one, Max( zero, b ) );
+ a = Truncate( MultiplyAdd( grid, a, half ) )*gridrcp;
+ b = Truncate( MultiplyAdd( grid, b, half ) )*gridrcp;
+
+ // compute the error (we skip the constant xxsum)
+ Vec4 e1 = MultiplyAdd( a*a, alpha2_sum, b*b*beta2_sum );
+ Vec4 e2 = NegativeMultiplySubtract( a, alphax_sum, a*b*alphabeta_sum );
+ Vec4 e3 = NegativeMultiplySubtract( b, betax_sum, e2 );
+ Vec4 e4 = MultiplyAdd( two, e3, e1 );
+
+ // apply the metric to the error term
+ Vec4 e5 = e4*m_metric;
+ Vec4 error = e5.SplatX() + e5.SplatY() + e5.SplatZ();
+
+ // keep the solution if it wins
+ if( CompareAnyLessThan( error, besterror ) )
+ {
+ beststart = a;
+ bestend = b;
+ besti = i;
+ bestj = j;
+ besterror = error;
+ bestiteration = iterationIndex;
+ }
+
+ // advance
+ if( j == count )
+ break;
+ part1 += m_points_weights[j];
+ ++j;
+ }
+
+ // advance
+ part0 += m_points_weights[i];
+ }
+
+ // stop if we didn't improve in this iteration
+ if( bestiteration != iterationIndex )
+ break;
+
+ // advance if possible
+ ++iterationIndex;
+ if( iterationIndex == m_iterationCount )
+ break;
+
+ // stop if a new iteration is an ordering that has already been tried
+ Vec3 axis = ( bestend - beststart ).GetVec3();
+ if( !ConstructOrdering( axis, iterationIndex ) )
+ break;
+ }
+
+ // save the block if necessary
+ if( CompareAnyLessThan( besterror, m_besterror ) )
+ {
+ // remap the indices
+ u8 const* order = ( u8* )m_order + 16*bestiteration;
+
+ u8 unordered[16];
+ for( int m = 0; m < besti; ++m )
+ unordered[order[m]] = 0;
+ for( int m = besti; m < bestj; ++m )
+ unordered[order[m]] = 2;
+ for( int m = bestj; m < count; ++m )
+ unordered[order[m]] = 1;
+
+ m_colours->RemapIndices( unordered, bestindices );
+
+ // save the block
+ WriteColourBlock3( beststart.GetVec3(), bestend.GetVec3(), bestindices, block );
+
+ // save the error
+ m_besterror = besterror;
+ }
+}
+
+void ClusterFit::Compress4( void* block )
+{
+ // declare variables
+ int const count = m_colours->GetCount();
+ Vec4 const two = VEC4_CONST( 2.0f );
+ Vec4 const one = VEC4_CONST( 1.0f );
+ Vec4 const onethird_onethird2( 1.0f/3.0f, 1.0f/3.0f, 1.0f/3.0f, 1.0f/9.0f );
+ Vec4 const twothirds_twothirds2( 2.0f/3.0f, 2.0f/3.0f, 2.0f/3.0f, 4.0f/9.0f );
+ Vec4 const twonineths = VEC4_CONST( 2.0f/9.0f );
+ Vec4 const zero = VEC4_CONST( 0.0f );
+ Vec4 const half = VEC4_CONST( 0.5f );
+ Vec4 const grid( 31.0f, 63.0f, 31.0f, 0.0f );
+ Vec4 const gridrcp( 1.0f/31.0f, 1.0f/63.0f, 1.0f/31.0f, 0.0f );
+
+ // prepare an ordering using the principle axis
+ ConstructOrdering( m_principle, 0 );
+
+ // check all possible clusters and iterate on the total order
+ Vec4 beststart = VEC4_CONST( 0.0f );
+ Vec4 bestend = VEC4_CONST( 0.0f );
+ Vec4 besterror = m_besterror;
+ u8 bestindices[16];
+ int bestiteration = 0;
+ int besti = 0, bestj = 0, bestk = 0;
+
+ // loop over iterations (we avoid the case that all points in first or last cluster)
+ for( int iterationIndex = 0;; )
+ {
+ // first cluster [0,i) is at the start
+ Vec4 part0 = VEC4_CONST( 0.0f );
+ for( int i = 0; i < count; ++i )
+ {
+ // second cluster [i,j) is one third along
+ Vec4 part1 = VEC4_CONST( 0.0f );
+ for( int j = i;; )
+ {
+ // third cluster [j,k) is two thirds along
+ Vec4 part2 = ( j == 0 ) ? m_points_weights[0] : VEC4_CONST( 0.0f );
+ int kmin = ( j == 0 ) ? 1 : j;
+ for( int k = kmin;; )
+ {
+ // last cluster [k,count) is at the end
+ Vec4 part3 = m_xsum_wsum - part2 - part1 - part0;
+
+ // compute least squares terms directly
+ Vec4 const alphax_sum = MultiplyAdd( part2, onethird_onethird2, MultiplyAdd( part1, twothirds_twothirds2, part0 ) );
+ Vec4 const alpha2_sum = alphax_sum.SplatW();
+
+ Vec4 const betax_sum = MultiplyAdd( part1, onethird_onethird2, MultiplyAdd( part2, twothirds_twothirds2, part3 ) );
+ Vec4 const beta2_sum = betax_sum.SplatW();
+
+ Vec4 const alphabeta_sum = twonineths*( part1 + part2 ).SplatW();
+
+ // compute the least-squares optimal points
+ Vec4 factor = Reciprocal( NegativeMultiplySubtract( alphabeta_sum, alphabeta_sum, alpha2_sum*beta2_sum ) );
+ Vec4 a = NegativeMultiplySubtract( betax_sum, alphabeta_sum, alphax_sum*beta2_sum )*factor;
+ Vec4 b = NegativeMultiplySubtract( alphax_sum, alphabeta_sum, betax_sum*alpha2_sum )*factor;
+
+ // clamp to the grid
+ a = Min( one, Max( zero, a ) );
+ b = Min( one, Max( zero, b ) );
+ a = Truncate( MultiplyAdd( grid, a, half ) )*gridrcp;
+ b = Truncate( MultiplyAdd( grid, b, half ) )*gridrcp;
+
+ // compute the error (we skip the constant xxsum)
+ Vec4 e1 = MultiplyAdd( a*a, alpha2_sum, b*b*beta2_sum );
+ Vec4 e2 = NegativeMultiplySubtract( a, alphax_sum, a*b*alphabeta_sum );
+ Vec4 e3 = NegativeMultiplySubtract( b, betax_sum, e2 );
+ Vec4 e4 = MultiplyAdd( two, e3, e1 );
+
+ // apply the metric to the error term
+ Vec4 e5 = e4*m_metric;
+ Vec4 error = e5.SplatX() + e5.SplatY() + e5.SplatZ();
+
+ // keep the solution if it wins
+ if( CompareAnyLessThan( error, besterror ) )
+ {
+ beststart = a;
+ bestend = b;
+ besterror = error;
+ besti = i;
+ bestj = j;
+ bestk = k;
+ bestiteration = iterationIndex;
+ }
+
+ // advance
+ if( k == count )
+ break;
+ part2 += m_points_weights[k];
+ ++k;
+ }
+
+ // advance
+ if( j == count )
+ break;
+ part1 += m_points_weights[j];
+ ++j;
+ }
+
+ // advance
+ part0 += m_points_weights[i];
+ }
+
+ // stop if we didn't improve in this iteration
+ if( bestiteration != iterationIndex )
+ break;
+
+ // advance if possible
+ ++iterationIndex;
+ if( iterationIndex == m_iterationCount )
+ break;
+
+ // stop if a new iteration is an ordering that has already been tried
+ Vec3 axis = ( bestend - beststart ).GetVec3();
+ if( !ConstructOrdering( axis, iterationIndex ) )
+ break;
+ }
+
+ // save the block if necessary
+ if( CompareAnyLessThan( besterror, m_besterror ) )
+ {
+ // remap the indices
+ u8 const* order = ( u8* )m_order + 16*bestiteration;
+
+ u8 unordered[16];
+ for( int m = 0; m < besti; ++m )
+ unordered[order[m]] = 0;
+ for( int m = besti; m < bestj; ++m )
+ unordered[order[m]] = 2;
+ for( int m = bestj; m < bestk; ++m )
+ unordered[order[m]] = 3;
+ for( int m = bestk; m < count; ++m )
+ unordered[order[m]] = 1;
+
+ m_colours->RemapIndices( unordered, bestindices );
+
+ // save the block
+ WriteColourBlock4( beststart.GetVec3(), bestend.GetVec3(), bestindices, block );
+
+ // save the error
+ m_besterror = besterror;
+ }
+}
+
+} // namespace squish
diff --git a/3rdparty/bgfx/3rdparty/libsquish/clusterfit.h b/3rdparty/bgfx/3rdparty/libsquish/clusterfit.h
new file mode 100644
index 00000000000..c882469c8be
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/libsquish/clusterfit.h
@@ -0,0 +1,61 @@
+/* -----------------------------------------------------------------------------
+
+ Copyright (c) 2006 Simon Brown si@sjbrown.co.uk
+ Copyright (c) 2007 Ignacio Castano icastano@nvidia.com
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ -------------------------------------------------------------------------- */
+
+#ifndef SQUISH_CLUSTERFIT_H
+#define SQUISH_CLUSTERFIT_H
+
+#include "squish.h"
+#include "maths.h"
+#include "simd.h"
+#include "colourfit.h"
+
+namespace squish {
+
+class ClusterFit : public ColourFit
+{
+public:
+ ClusterFit( ColourSet const* colours, int flags, float* metric );
+
+private:
+ bool ConstructOrdering( Vec3 const& axis, int iteration );
+
+ virtual void Compress3( void* block );
+ virtual void Compress4( void* block );
+
+ enum { kMaxIterations = 8 };
+
+ int m_iterationCount;
+ Vec3 m_principle;
+ u8 m_order[16*kMaxIterations];
+ Vec4 m_points_weights[16];
+ Vec4 m_xsum_wsum;
+ Vec4 m_metric;
+ Vec4 m_besterror;
+};
+
+} // namespace squish
+
+#endif // ndef SQUISH_CLUSTERFIT_H
diff --git a/3rdparty/bgfx/3rdparty/libsquish/colourblock.cpp b/3rdparty/bgfx/3rdparty/libsquish/colourblock.cpp
new file mode 100644
index 00000000000..e6a5788b748
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/libsquish/colourblock.cpp
@@ -0,0 +1,214 @@
+/* -----------------------------------------------------------------------------
+
+ Copyright (c) 2006 Simon Brown si@sjbrown.co.uk
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ -------------------------------------------------------------------------- */
+
+#include "colourblock.h"
+
+namespace squish {
+
+static int FloatToInt( float a, int limit )
+{
+ // use ANSI round-to-zero behaviour to get round-to-nearest
+ int i = ( int )( a + 0.5f );
+
+ // clamp to the limit
+ if( i < 0 )
+ i = 0;
+ else if( i > limit )
+ i = limit;
+
+ // done
+ return i;
+}
+
+static int FloatTo565( Vec3::Arg colour )
+{
+ // get the components in the correct range
+ int r = FloatToInt( 31.0f*colour.X(), 31 );
+ int g = FloatToInt( 63.0f*colour.Y(), 63 );
+ int b = FloatToInt( 31.0f*colour.Z(), 31 );
+
+ // pack into a single value
+ return ( r << 11 ) | ( g << 5 ) | b;
+}
+
+static void WriteColourBlock( int a, int b, u8* indices, void* block )
+{
+ // get the block as bytes
+ u8* bytes = ( u8* )block;
+
+ // write the endpoints
+ bytes[0] = ( u8 )( a & 0xff );
+ bytes[1] = ( u8 )( a >> 8 );
+ bytes[2] = ( u8 )( b & 0xff );
+ bytes[3] = ( u8 )( b >> 8 );
+
+ // write the indices
+ for( int i = 0; i < 4; ++i )
+ {
+ u8 const* ind = indices + 4*i;
+ bytes[4 + i] = ind[0] | ( ind[1] << 2 ) | ( ind[2] << 4 ) | ( ind[3] << 6 );
+ }
+}
+
+void WriteColourBlock3( Vec3::Arg start, Vec3::Arg end, u8 const* indices, void* block )
+{
+ // get the packed values
+ int a = FloatTo565( start );
+ int b = FloatTo565( end );
+
+ // remap the indices
+ u8 remapped[16];
+ if( a <= b )
+ {
+ // use the indices directly
+ for( int i = 0; i < 16; ++i )
+ remapped[i] = indices[i];
+ }
+ else
+ {
+ // swap a and b
+ std::swap( a, b );
+ for( int i = 0; i < 16; ++i )
+ {
+ if( indices[i] == 0 )
+ remapped[i] = 1;
+ else if( indices[i] == 1 )
+ remapped[i] = 0;
+ else
+ remapped[i] = indices[i];
+ }
+ }
+
+ // write the block
+ WriteColourBlock( a, b, remapped, block );
+}
+
+void WriteColourBlock4( Vec3::Arg start, Vec3::Arg end, u8 const* indices, void* block )
+{
+ // get the packed values
+ int a = FloatTo565( start );
+ int b = FloatTo565( end );
+
+ // remap the indices
+ u8 remapped[16];
+ if( a < b )
+ {
+ // swap a and b
+ std::swap( a, b );
+ for( int i = 0; i < 16; ++i )
+ remapped[i] = ( indices[i] ^ 0x1 ) & 0x3;
+ }
+ else if( a == b )
+ {
+ // use index 0
+ for( int i = 0; i < 16; ++i )
+ remapped[i] = 0;
+ }
+ else
+ {
+ // use the indices directly
+ for( int i = 0; i < 16; ++i )
+ remapped[i] = indices[i];
+ }
+
+ // write the block
+ WriteColourBlock( a, b, remapped, block );
+}
+
+static int Unpack565( u8 const* packed, u8* colour )
+{
+ // build the packed value
+ int value = ( int )packed[0] | ( ( int )packed[1] << 8 );
+
+ // get the components in the stored range
+ u8 red = ( u8 )( ( value >> 11 ) & 0x1f );
+ u8 green = ( u8 )( ( value >> 5 ) & 0x3f );
+ u8 blue = ( u8 )( value & 0x1f );
+
+ // scale up to 8 bits
+ colour[0] = ( red << 3 ) | ( red >> 2 );
+ colour[1] = ( green << 2 ) | ( green >> 4 );
+ colour[2] = ( blue << 3 ) | ( blue >> 2 );
+ colour[3] = 255;
+
+ // return the value
+ return value;
+}
+
+void DecompressColour( u8* rgba, void const* block, bool isDxt1 )
+{
+ // get the block bytes
+ u8 const* bytes = reinterpret_cast< u8 const* >( block );
+
+ // unpack the endpoints
+ u8 codes[16];
+ int a = Unpack565( bytes, codes );
+ int b = Unpack565( bytes + 2, codes + 4 );
+
+ // generate the midpoints
+ for( int i = 0; i < 3; ++i )
+ {
+ int c = codes[i];
+ int d = codes[4 + i];
+
+ if( isDxt1 && a <= b )
+ {
+ codes[8 + i] = ( u8 )( ( c + d )/2 );
+ codes[12 + i] = 0;
+ }
+ else
+ {
+ codes[8 + i] = ( u8 )( ( 2*c + d )/3 );
+ codes[12 + i] = ( u8 )( ( c + 2*d )/3 );
+ }
+ }
+
+ // fill in alpha for the intermediate values
+ codes[8 + 3] = 255;
+ codes[12 + 3] = ( isDxt1 && a <= b ) ? 0 : 255;
+
+ // unpack the indices
+ u8 indices[16];
+ for( int i = 0; i < 4; ++i )
+ {
+ u8* ind = indices + 4*i;
+ u8 packed = bytes[4 + i];
+
+ ind[0] = packed & 0x3;
+ ind[1] = ( packed >> 2 ) & 0x3;
+ ind[2] = ( packed >> 4 ) & 0x3;
+ ind[3] = ( packed >> 6 ) & 0x3;
+ }
+
+ // store out the colours
+ for( int i = 0; i < 16; ++i )
+ {
+ u8 offset = 4*indices[i];
+ for( int j = 0; j < 4; ++j )
+ rgba[4*i + j] = codes[offset + j];
+ }
+}
+
+} // namespace squish
diff --git a/3rdparty/bgfx/3rdparty/libsquish/colourblock.h b/3rdparty/bgfx/3rdparty/libsquish/colourblock.h
new file mode 100644
index 00000000000..2562561d73e
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/libsquish/colourblock.h
@@ -0,0 +1,41 @@
+/* -----------------------------------------------------------------------------
+
+ Copyright (c) 2006 Simon Brown si@sjbrown.co.uk
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ -------------------------------------------------------------------------- */
+
+#ifndef SQUISH_COLOURBLOCK_H
+#define SQUISH_COLOURBLOCK_H
+
+#include "squish.h"
+#include "maths.h"
+
+namespace squish {
+
+void WriteColourBlock3( Vec3::Arg start, Vec3::Arg end, u8 const* indices, void* block );
+void WriteColourBlock4( Vec3::Arg start, Vec3::Arg end, u8 const* indices, void* block );
+
+void DecompressColour( u8* rgba, void const* block, bool isDxt1 );
+
+} // namespace squish
+
+#endif // ndef SQUISH_COLOURBLOCK_H
diff --git a/3rdparty/bgfx/3rdparty/libsquish/colourfit.cpp b/3rdparty/bgfx/3rdparty/libsquish/colourfit.cpp
new file mode 100644
index 00000000000..11efa467482
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/libsquish/colourfit.cpp
@@ -0,0 +1,54 @@
+/* -----------------------------------------------------------------------------
+
+ Copyright (c) 2006 Simon Brown si@sjbrown.co.uk
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ -------------------------------------------------------------------------- */
+
+#include "colourfit.h"
+#include "colourset.h"
+
+namespace squish {
+
+ColourFit::ColourFit( ColourSet const* colours, int flags )
+ : m_colours( colours ),
+ m_flags( flags )
+{
+}
+
+ColourFit::~ColourFit()
+{
+}
+
+void ColourFit::Compress( void* block )
+{
+ bool isDxt1 = ( ( m_flags & kDxt1 ) != 0 );
+ if( isDxt1 )
+ {
+ Compress3( block );
+ if( !m_colours->IsTransparent() )
+ Compress4( block );
+ }
+ else
+ Compress4( block );
+}
+
+} // namespace squish
diff --git a/3rdparty/bgfx/3rdparty/libsquish/colourfit.h b/3rdparty/bgfx/3rdparty/libsquish/colourfit.h
new file mode 100644
index 00000000000..75932232932
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/libsquish/colourfit.h
@@ -0,0 +1,56 @@
+/* -----------------------------------------------------------------------------
+
+ Copyright (c) 2006 Simon Brown si@sjbrown.co.uk
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ -------------------------------------------------------------------------- */
+
+#ifndef SQUISH_COLOURFIT_H
+#define SQUISH_COLOURFIT_H
+
+#include "squish.h"
+#include "maths.h"
+
+#include <climits>
+
+namespace squish {
+
+class ColourSet;
+
+class ColourFit
+{
+public:
+ ColourFit( ColourSet const* colours, int flags );
+ virtual ~ColourFit();
+
+ void Compress( void* block );
+
+protected:
+ virtual void Compress3( void* block ) = 0;
+ virtual void Compress4( void* block ) = 0;
+
+ ColourSet const* m_colours;
+ int m_flags;
+};
+
+} // namespace squish
+
+#endif // ndef SQUISH_COLOURFIT_H
diff --git a/3rdparty/bgfx/3rdparty/libsquish/colourset.cpp b/3rdparty/bgfx/3rdparty/libsquish/colourset.cpp
new file mode 100644
index 00000000000..97d29d9873e
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/libsquish/colourset.cpp
@@ -0,0 +1,121 @@
+/* -----------------------------------------------------------------------------
+
+ Copyright (c) 2006 Simon Brown si@sjbrown.co.uk
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ -------------------------------------------------------------------------- */
+
+#include "colourset.h"
+
+namespace squish {
+
+ColourSet::ColourSet( u8 const* rgba, int mask, int flags )
+ : m_count( 0 ),
+ m_transparent( false )
+{
+ // check the compression mode for dxt1
+ bool isDxt1 = ( ( flags & kDxt1 ) != 0 );
+ bool weightByAlpha = ( ( flags & kWeightColourByAlpha ) != 0 );
+
+ // create the minimal set
+ for( int i = 0; i < 16; ++i )
+ {
+ // check this pixel is enabled
+ int bit = 1 << i;
+ if( ( mask & bit ) == 0 )
+ {
+ m_remap[i] = -1;
+ continue;
+ }
+
+ // check for transparent pixels when using dxt1
+ if( isDxt1 && rgba[4*i + 3] < 128 )
+ {
+ m_remap[i] = -1;
+ m_transparent = true;
+ continue;
+ }
+
+ // loop over previous points for a match
+ for( int j = 0;; ++j )
+ {
+ // allocate a new point
+ if( j == i )
+ {
+ // normalise coordinates to [0,1]
+ float x = ( float )rgba[4*i] / 255.0f;
+ float y = ( float )rgba[4*i + 1] / 255.0f;
+ float z = ( float )rgba[4*i + 2] / 255.0f;
+
+ // ensure there is always non-zero weight even for zero alpha
+ float w = ( float )( rgba[4*i + 3] + 1 ) / 256.0f;
+
+ // add the point
+ m_points[m_count] = Vec3( x, y, z );
+ m_weights[m_count] = ( weightByAlpha ? w : 1.0f );
+ m_remap[i] = m_count;
+
+ // advance
+ ++m_count;
+ break;
+ }
+
+ // check for a match
+ int oldbit = 1 << j;
+ bool match = ( ( mask & oldbit ) != 0 )
+ && ( rgba[4*i] == rgba[4*j] )
+ && ( rgba[4*i + 1] == rgba[4*j + 1] )
+ && ( rgba[4*i + 2] == rgba[4*j + 2] )
+ && ( rgba[4*j + 3] >= 128 || !isDxt1 );
+ if( match )
+ {
+ // get the index of the match
+ int index = m_remap[j];
+
+ // ensure there is always non-zero weight even for zero alpha
+ float w = ( float )( rgba[4*i + 3] + 1 ) / 256.0f;
+
+ // map to this point and increase the weight
+ m_weights[index] += ( weightByAlpha ? w : 1.0f );
+ m_remap[i] = index;
+ break;
+ }
+ }
+ }
+
+ // square root the weights
+ for( int i = 0; i < m_count; ++i )
+ m_weights[i] = std::sqrt( m_weights[i] );
+}
+
+void ColourSet::RemapIndices( u8 const* source, u8* target ) const
+{
+ for( int i = 0; i < 16; ++i )
+ {
+ int j = m_remap[i];
+ if( j == -1 )
+ target[i] = 3;
+ else
+ target[i] = source[j];
+ }
+}
+
+} // namespace squish
diff --git a/3rdparty/bgfx/3rdparty/libsquish/colourset.h b/3rdparty/bgfx/3rdparty/libsquish/colourset.h
new file mode 100644
index 00000000000..0c66fe44027
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/libsquish/colourset.h
@@ -0,0 +1,58 @@
+/* -----------------------------------------------------------------------------
+
+ Copyright (c) 2006 Simon Brown si@sjbrown.co.uk
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ -------------------------------------------------------------------------- */
+
+#ifndef SQUISH_COLOURSET_H
+#define SQUISH_COLOURSET_H
+
+#include "squish.h"
+#include "maths.h"
+
+namespace squish {
+
+/*! @brief Represents a set of block colours
+*/
+class ColourSet
+{
+public:
+ ColourSet( u8 const* rgba, int mask, int flags );
+
+ int GetCount() const { return m_count; }
+ Vec3 const* GetPoints() const { return m_points; }
+ float const* GetWeights() const { return m_weights; }
+ bool IsTransparent() const { return m_transparent; }
+
+ void RemapIndices( u8 const* source, u8* target ) const;
+
+private:
+ int m_count;
+ Vec3 m_points[16];
+ float m_weights[16];
+ int m_remap[16];
+ bool m_transparent;
+};
+
+} // namespace sqish
+
+#endif // ndef SQUISH_COLOURSET_H
diff --git a/3rdparty/bgfx/3rdparty/libsquish/config.h b/3rdparty/bgfx/3rdparty/libsquish/config.h
new file mode 100644
index 00000000000..2fad5576a90
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/libsquish/config.h
@@ -0,0 +1,49 @@
+/* -----------------------------------------------------------------------------
+
+ Copyright (c) 2006 Simon Brown si@sjbrown.co.uk
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ -------------------------------------------------------------------------- */
+
+#ifndef SQUISH_CONFIG_H
+#define SQUISH_CONFIG_H
+
+// Set to 1 when building squish to use Altivec instructions.
+#ifndef SQUISH_USE_ALTIVEC
+#define SQUISH_USE_ALTIVEC 0
+#endif
+
+// Set to 1 or 2 when building squish to use SSE or SSE2 instructions.
+#ifndef SQUISH_USE_SSE
+#define SQUISH_USE_SSE 0
+#endif
+
+// Internally set SQUISH_USE_SIMD when either Altivec or SSE is available.
+#if SQUISH_USE_ALTIVEC && SQUISH_USE_SSE
+#error "Cannot enable both Altivec and SSE!"
+#endif
+#if SQUISH_USE_ALTIVEC || SQUISH_USE_SSE
+#define SQUISH_USE_SIMD 1
+#else
+#define SQUISH_USE_SIMD 0
+#endif
+
+#endif // ndef SQUISH_CONFIG_H
diff --git a/3rdparty/bgfx/3rdparty/libsquish/maths.cpp b/3rdparty/bgfx/3rdparty/libsquish/maths.cpp
new file mode 100644
index 00000000000..9af4197d386
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/libsquish/maths.cpp
@@ -0,0 +1,259 @@
+/* -----------------------------------------------------------------------------
+
+ Copyright (c) 2006 Simon Brown si@sjbrown.co.uk
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ -------------------------------------------------------------------------- */
+
+/*! @file
+
+ The symmetric eigensystem solver algorithm is from
+ http://www.geometrictools.com/Documentation/EigenSymmetric3x3.pdf
+*/
+
+#include "maths.h"
+#include "simd.h"
+#include <cfloat>
+
+namespace squish {
+
+Sym3x3 ComputeWeightedCovariance( int n, Vec3 const* points, float const* weights )
+{
+ // compute the centroid
+ float total = 0.0f;
+ Vec3 centroid( 0.0f );
+ for( int i = 0; i < n; ++i )
+ {
+ total += weights[i];
+ centroid += weights[i]*points[i];
+ }
+ if( total > FLT_EPSILON )
+ centroid /= total;
+
+ // accumulate the covariance matrix
+ Sym3x3 covariance( 0.0f );
+ for( int i = 0; i < n; ++i )
+ {
+ Vec3 a = points[i] - centroid;
+ Vec3 b = weights[i]*a;
+
+ covariance[0] += a.X()*b.X();
+ covariance[1] += a.X()*b.Y();
+ covariance[2] += a.X()*b.Z();
+ covariance[3] += a.Y()*b.Y();
+ covariance[4] += a.Y()*b.Z();
+ covariance[5] += a.Z()*b.Z();
+ }
+
+ // return it
+ return covariance;
+}
+
+#if 0
+
+static Vec3 GetMultiplicity1Evector( Sym3x3 const& matrix, float evalue )
+{
+ // compute M
+ Sym3x3 m;
+ m[0] = matrix[0] - evalue;
+ m[1] = matrix[1];
+ m[2] = matrix[2];
+ m[3] = matrix[3] - evalue;
+ m[4] = matrix[4];
+ m[5] = matrix[5] - evalue;
+
+ // compute U
+ Sym3x3 u;
+ u[0] = m[3]*m[5] - m[4]*m[4];
+ u[1] = m[2]*m[4] - m[1]*m[5];
+ u[2] = m[1]*m[4] - m[2]*m[3];
+ u[3] = m[0]*m[5] - m[2]*m[2];
+ u[4] = m[1]*m[2] - m[4]*m[0];
+ u[5] = m[0]*m[3] - m[1]*m[1];
+
+ // find the largest component
+ float mc = std::fabs( u[0] );
+ int mi = 0;
+ for( int i = 1; i < 6; ++i )
+ {
+ float c = std::fabs( u[i] );
+ if( c > mc )
+ {
+ mc = c;
+ mi = i;
+ }
+ }
+
+ // pick the column with this component
+ switch( mi )
+ {
+ case 0:
+ return Vec3( u[0], u[1], u[2] );
+
+ case 1:
+ case 3:
+ return Vec3( u[1], u[3], u[4] );
+
+ default:
+ return Vec3( u[2], u[4], u[5] );
+ }
+}
+
+static Vec3 GetMultiplicity2Evector( Sym3x3 const& matrix, float evalue )
+{
+ // compute M
+ Sym3x3 m;
+ m[0] = matrix[0] - evalue;
+ m[1] = matrix[1];
+ m[2] = matrix[2];
+ m[3] = matrix[3] - evalue;
+ m[4] = matrix[4];
+ m[5] = matrix[5] - evalue;
+
+ // find the largest component
+ float mc = std::fabs( m[0] );
+ int mi = 0;
+ for( int i = 1; i < 6; ++i )
+ {
+ float c = std::fabs( m[i] );
+ if( c > mc )
+ {
+ mc = c;
+ mi = i;
+ }
+ }
+
+ // pick the first eigenvector based on this index
+ switch( mi )
+ {
+ case 0:
+ case 1:
+ return Vec3( -m[1], m[0], 0.0f );
+
+ case 2:
+ return Vec3( m[2], 0.0f, -m[0] );
+
+ case 3:
+ case 4:
+ return Vec3( 0.0f, -m[4], m[3] );
+
+ default:
+ return Vec3( 0.0f, -m[5], m[4] );
+ }
+}
+
+Vec3 ComputePrincipleComponent( Sym3x3 const& matrix )
+{
+ // compute the cubic coefficients
+ float c0 = matrix[0]*matrix[3]*matrix[5]
+ + 2.0f*matrix[1]*matrix[2]*matrix[4]
+ - matrix[0]*matrix[4]*matrix[4]
+ - matrix[3]*matrix[2]*matrix[2]
+ - matrix[5]*matrix[1]*matrix[1];
+ float c1 = matrix[0]*matrix[3] + matrix[0]*matrix[5] + matrix[3]*matrix[5]
+ - matrix[1]*matrix[1] - matrix[2]*matrix[2] - matrix[4]*matrix[4];
+ float c2 = matrix[0] + matrix[3] + matrix[5];
+
+ // compute the quadratic coefficients
+ float a = c1 - ( 1.0f/3.0f )*c2*c2;
+ float b = ( -2.0f/27.0f )*c2*c2*c2 + ( 1.0f/3.0f )*c1*c2 - c0;
+
+ // compute the root count check
+ float Q = 0.25f*b*b + ( 1.0f/27.0f )*a*a*a;
+
+ // test the multiplicity
+ if( FLT_EPSILON < Q )
+ {
+ // only one root, which implies we have a multiple of the identity
+ return Vec3( 1.0f );
+ }
+ else if( Q < -FLT_EPSILON )
+ {
+ // three distinct roots
+ float theta = std::atan2( std::sqrt( -Q ), -0.5f*b );
+ float rho = std::sqrt( 0.25f*b*b - Q );
+
+ float rt = std::pow( rho, 1.0f/3.0f );
+ float ct = std::cos( theta/3.0f );
+ float st = std::sin( theta/3.0f );
+
+ float l1 = ( 1.0f/3.0f )*c2 + 2.0f*rt*ct;
+ float l2 = ( 1.0f/3.0f )*c2 - rt*( ct + ( float )sqrt( 3.0f )*st );
+ float l3 = ( 1.0f/3.0f )*c2 - rt*( ct - ( float )sqrt( 3.0f )*st );
+
+ // pick the larger
+ if( std::fabs( l2 ) > std::fabs( l1 ) )
+ l1 = l2;
+ if( std::fabs( l3 ) > std::fabs( l1 ) )
+ l1 = l3;
+
+ // get the eigenvector
+ return GetMultiplicity1Evector( matrix, l1 );
+ }
+ else // if( -FLT_EPSILON <= Q && Q <= FLT_EPSILON )
+ {
+ // two roots
+ float rt;
+ if( b < 0.0f )
+ rt = -std::pow( -0.5f*b, 1.0f/3.0f );
+ else
+ rt = std::pow( 0.5f*b, 1.0f/3.0f );
+
+ float l1 = ( 1.0f/3.0f )*c2 + rt; // repeated
+ float l2 = ( 1.0f/3.0f )*c2 - 2.0f*rt;
+
+ // get the eigenvector
+ if( std::fabs( l1 ) > std::fabs( l2 ) )
+ return GetMultiplicity2Evector( matrix, l1 );
+ else
+ return GetMultiplicity1Evector( matrix, l2 );
+ }
+}
+
+#else
+
+#define POWER_ITERATION_COUNT 8
+
+Vec3 ComputePrincipleComponent( Sym3x3 const& matrix )
+{
+ Vec4 const row0( matrix[0], matrix[1], matrix[2], 0.0f );
+ Vec4 const row1( matrix[1], matrix[3], matrix[4], 0.0f );
+ Vec4 const row2( matrix[2], matrix[4], matrix[5], 0.0f );
+ Vec4 v = VEC4_CONST( 1.0f );
+ for( int i = 0; i < POWER_ITERATION_COUNT; ++i )
+ {
+ // matrix multiply
+ Vec4 w = row0*v.SplatX();
+ w = MultiplyAdd(row1, v.SplatY(), w);
+ w = MultiplyAdd(row2, v.SplatZ(), w);
+
+ // get max component from xyz in all channels
+ Vec4 a = Max(w.SplatX(), Max(w.SplatY(), w.SplatZ()));
+
+ // divide through and advance
+ v = w*Reciprocal(a);
+ }
+ return v.GetVec3();
+}
+
+#endif
+
+} // namespace squish
diff --git a/3rdparty/bgfx/3rdparty/libsquish/maths.h b/3rdparty/bgfx/3rdparty/libsquish/maths.h
new file mode 100644
index 00000000000..769ae463f72
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/libsquish/maths.h
@@ -0,0 +1,233 @@
+/* -----------------------------------------------------------------------------
+
+ Copyright (c) 2006 Simon Brown si@sjbrown.co.uk
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ -------------------------------------------------------------------------- */
+
+#ifndef SQUISH_MATHS_H
+#define SQUISH_MATHS_H
+
+#include <cmath>
+#include <algorithm>
+#include "config.h"
+
+namespace squish {
+
+class Vec3
+{
+public:
+ typedef Vec3 const& Arg;
+
+ Vec3()
+ {
+ }
+
+ explicit Vec3( float s )
+ {
+ m_x = s;
+ m_y = s;
+ m_z = s;
+ }
+
+ Vec3( float x, float y, float z )
+ {
+ m_x = x;
+ m_y = y;
+ m_z = z;
+ }
+
+ float X() const { return m_x; }
+ float Y() const { return m_y; }
+ float Z() const { return m_z; }
+
+ Vec3 operator-() const
+ {
+ return Vec3( -m_x, -m_y, -m_z );
+ }
+
+ Vec3& operator+=( Arg v )
+ {
+ m_x += v.m_x;
+ m_y += v.m_y;
+ m_z += v.m_z;
+ return *this;
+ }
+
+ Vec3& operator-=( Arg v )
+ {
+ m_x -= v.m_x;
+ m_y -= v.m_y;
+ m_z -= v.m_z;
+ return *this;
+ }
+
+ Vec3& operator*=( Arg v )
+ {
+ m_x *= v.m_x;
+ m_y *= v.m_y;
+ m_z *= v.m_z;
+ return *this;
+ }
+
+ Vec3& operator*=( float s )
+ {
+ m_x *= s;
+ m_y *= s;
+ m_z *= s;
+ return *this;
+ }
+
+ Vec3& operator/=( Arg v )
+ {
+ m_x /= v.m_x;
+ m_y /= v.m_y;
+ m_z /= v.m_z;
+ return *this;
+ }
+
+ Vec3& operator/=( float s )
+ {
+ float t = 1.0f/s;
+ m_x *= t;
+ m_y *= t;
+ m_z *= t;
+ return *this;
+ }
+
+ friend Vec3 operator+( Arg left, Arg right )
+ {
+ Vec3 copy( left );
+ return copy += right;
+ }
+
+ friend Vec3 operator-( Arg left, Arg right )
+ {
+ Vec3 copy( left );
+ return copy -= right;
+ }
+
+ friend Vec3 operator*( Arg left, Arg right )
+ {
+ Vec3 copy( left );
+ return copy *= right;
+ }
+
+ friend Vec3 operator*( Arg left, float right )
+ {
+ Vec3 copy( left );
+ return copy *= right;
+ }
+
+ friend Vec3 operator*( float left, Arg right )
+ {
+ Vec3 copy( right );
+ return copy *= left;
+ }
+
+ friend Vec3 operator/( Arg left, Arg right )
+ {
+ Vec3 copy( left );
+ return copy /= right;
+ }
+
+ friend Vec3 operator/( Arg left, float right )
+ {
+ Vec3 copy( left );
+ return copy /= right;
+ }
+
+ friend float Dot( Arg left, Arg right )
+ {
+ return left.m_x*right.m_x + left.m_y*right.m_y + left.m_z*right.m_z;
+ }
+
+ friend Vec3 Min( Arg left, Arg right )
+ {
+ return Vec3(
+ std::min( left.m_x, right.m_x ),
+ std::min( left.m_y, right.m_y ),
+ std::min( left.m_z, right.m_z )
+ );
+ }
+
+ friend Vec3 Max( Arg left, Arg right )
+ {
+ return Vec3(
+ std::max( left.m_x, right.m_x ),
+ std::max( left.m_y, right.m_y ),
+ std::max( left.m_z, right.m_z )
+ );
+ }
+
+ friend Vec3 Truncate( Arg v )
+ {
+ return Vec3(
+ v.m_x > 0.0f ? std::floor( v.m_x ) : std::ceil( v.m_x ),
+ v.m_y > 0.0f ? std::floor( v.m_y ) : std::ceil( v.m_y ),
+ v.m_z > 0.0f ? std::floor( v.m_z ) : std::ceil( v.m_z )
+ );
+ }
+
+private:
+ float m_x;
+ float m_y;
+ float m_z;
+};
+
+inline float LengthSquared( Vec3::Arg v )
+{
+ return Dot( v, v );
+}
+
+class Sym3x3
+{
+public:
+ Sym3x3()
+ {
+ }
+
+ Sym3x3( float s )
+ {
+ for( int i = 0; i < 6; ++i )
+ m_x[i] = s;
+ }
+
+ float operator[]( int index ) const
+ {
+ return m_x[index];
+ }
+
+ float& operator[]( int index )
+ {
+ return m_x[index];
+ }
+
+private:
+ float m_x[6];
+};
+
+Sym3x3 ComputeWeightedCovariance( int n, Vec3 const* points, float const* weights );
+Vec3 ComputePrincipleComponent( Sym3x3 const& matrix );
+
+} // namespace squish
+
+#endif // ndef SQUISH_MATHS_H
diff --git a/3rdparty/bgfx/3rdparty/libsquish/rangefit.cpp b/3rdparty/bgfx/3rdparty/libsquish/rangefit.cpp
new file mode 100644
index 00000000000..3fca1245eb0
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/libsquish/rangefit.cpp
@@ -0,0 +1,201 @@
+/* -----------------------------------------------------------------------------
+
+ Copyright (c) 2006 Simon Brown si@sjbrown.co.uk
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ -------------------------------------------------------------------------- */
+
+#include "rangefit.h"
+#include "colourset.h"
+#include "colourblock.h"
+#include <cfloat>
+
+namespace squish {
+
+RangeFit::RangeFit( ColourSet const* colours, int flags, float* metric )
+ : ColourFit( colours, flags )
+{
+ // initialise the metric (old perceptual = 0.2126f, 0.7152f, 0.0722f)
+ if( metric )
+ m_metric = Vec3( metric[0], metric[1], metric[2] );
+ else
+ m_metric = Vec3( 1.0f );
+
+ // initialise the best error
+ m_besterror = FLT_MAX;
+
+ // cache some values
+ int const count = m_colours->GetCount();
+ Vec3 const* values = m_colours->GetPoints();
+ float const* weights = m_colours->GetWeights();
+
+ // get the covariance matrix
+ Sym3x3 covariance = ComputeWeightedCovariance( count, values, weights );
+
+ // compute the principle component
+ Vec3 principle = ComputePrincipleComponent( covariance );
+
+ // get the min and max range as the codebook endpoints
+ Vec3 start( 0.0f );
+ Vec3 end( 0.0f );
+ if( count > 0 )
+ {
+ float min, max;
+
+ // compute the range
+ start = end = values[0];
+ min = max = Dot( values[0], principle );
+ for( int i = 1; i < count; ++i )
+ {
+ float val = Dot( values[i], principle );
+ if( val < min )
+ {
+ start = values[i];
+ min = val;
+ }
+ else if( val > max )
+ {
+ end = values[i];
+ max = val;
+ }
+ }
+ }
+
+ // clamp the output to [0, 1]
+ Vec3 const one( 1.0f );
+ Vec3 const zero( 0.0f );
+ start = Min( one, Max( zero, start ) );
+ end = Min( one, Max( zero, end ) );
+
+ // clamp to the grid and save
+ Vec3 const grid( 31.0f, 63.0f, 31.0f );
+ Vec3 const gridrcp( 1.0f/31.0f, 1.0f/63.0f, 1.0f/31.0f );
+ Vec3 const half( 0.5f );
+ m_start = Truncate( grid*start + half )*gridrcp;
+ m_end = Truncate( grid*end + half )*gridrcp;
+}
+
+void RangeFit::Compress3( void* block )
+{
+ // cache some values
+ int const count = m_colours->GetCount();
+ Vec3 const* values = m_colours->GetPoints();
+
+ // create a codebook
+ Vec3 codes[3];
+ codes[0] = m_start;
+ codes[1] = m_end;
+ codes[2] = 0.5f*m_start + 0.5f*m_end;
+
+ // match each point to the closest code
+ u8 closest[16];
+ float error = 0.0f;
+ for( int i = 0; i < count; ++i )
+ {
+ // find the closest code
+ float dist = FLT_MAX;
+ int idx = 0;
+ for( int j = 0; j < 3; ++j )
+ {
+ float d = LengthSquared( m_metric*( values[i] - codes[j] ) );
+ if( d < dist )
+ {
+ dist = d;
+ idx = j;
+ }
+ }
+
+ // save the index
+ closest[i] = ( u8 )idx;
+
+ // accumulate the error
+ error += dist;
+ }
+
+ // save this scheme if it wins
+ if( error < m_besterror )
+ {
+ // remap the indices
+ u8 indices[16];
+ m_colours->RemapIndices( closest, indices );
+
+ // save the block
+ WriteColourBlock3( m_start, m_end, indices, block );
+
+ // save the error
+ m_besterror = error;
+ }
+}
+
+void RangeFit::Compress4( void* block )
+{
+ // cache some values
+ int const count = m_colours->GetCount();
+ Vec3 const* values = m_colours->GetPoints();
+
+ // create a codebook
+ Vec3 codes[4];
+ codes[0] = m_start;
+ codes[1] = m_end;
+ codes[2] = ( 2.0f/3.0f )*m_start + ( 1.0f/3.0f )*m_end;
+ codes[3] = ( 1.0f/3.0f )*m_start + ( 2.0f/3.0f )*m_end;
+
+ // match each point to the closest code
+ u8 closest[16];
+ float error = 0.0f;
+ for( int i = 0; i < count; ++i )
+ {
+ // find the closest code
+ float dist = FLT_MAX;
+ int idx = 0;
+ for( int j = 0; j < 4; ++j )
+ {
+ float d = LengthSquared( m_metric*( values[i] - codes[j] ) );
+ if( d < dist )
+ {
+ dist = d;
+ idx = j;
+ }
+ }
+
+ // save the index
+ closest[i] = ( u8 )idx;
+
+ // accumulate the error
+ error += dist;
+ }
+
+ // save this scheme if it wins
+ if( error < m_besterror )
+ {
+ // remap the indices
+ u8 indices[16];
+ m_colours->RemapIndices( closest, indices );
+
+ // save the block
+ WriteColourBlock4( m_start, m_end, indices, block );
+
+ // save the error
+ m_besterror = error;
+ }
+}
+
+} // namespace squish
diff --git a/3rdparty/bgfx/3rdparty/libsquish/rangefit.h b/3rdparty/bgfx/3rdparty/libsquish/rangefit.h
new file mode 100644
index 00000000000..e293bdcf366
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/libsquish/rangefit.h
@@ -0,0 +1,54 @@
+/* -----------------------------------------------------------------------------
+
+ Copyright (c) 2006 Simon Brown si@sjbrown.co.uk
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ -------------------------------------------------------------------------- */
+
+#ifndef SQUISH_RANGEFIT_H
+#define SQUISH_RANGEFIT_H
+
+#include "squish.h"
+#include "colourfit.h"
+#include "maths.h"
+
+namespace squish {
+
+class ColourSet;
+
+class RangeFit : public ColourFit
+{
+public:
+ RangeFit( ColourSet const* colours, int flags, float* metric );
+
+private:
+ virtual void Compress3( void* block );
+ virtual void Compress4( void* block );
+
+ Vec3 m_metric;
+ Vec3 m_start;
+ Vec3 m_end;
+ float m_besterror;
+};
+
+} // squish
+
+#endif // ndef SQUISH_RANGEFIT_H
diff --git a/3rdparty/bgfx/3rdparty/libsquish/simd.h b/3rdparty/bgfx/3rdparty/libsquish/simd.h
new file mode 100644
index 00000000000..92965e02e77
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/libsquish/simd.h
@@ -0,0 +1,32 @@
+/* -----------------------------------------------------------------------------
+
+ Copyright (c) 2006 Simon Brown si@sjbrown.co.uk
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ -------------------------------------------------------------------------- */
+
+#ifndef SQUISH_SIMD_H
+#define SQUISH_SIMD_H
+
+#include "maths.h"
+#include "simd_float.h"
+
+#endif // ndef SQUISH_SIMD_H
diff --git a/3rdparty/bgfx/3rdparty/libsquish/simd_float.h b/3rdparty/bgfx/3rdparty/libsquish/simd_float.h
new file mode 100644
index 00000000000..e6351b80eb0
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/libsquish/simd_float.h
@@ -0,0 +1,183 @@
+/* -----------------------------------------------------------------------------
+
+ Copyright (c) 2006 Simon Brown si@sjbrown.co.uk
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ -------------------------------------------------------------------------- */
+
+#ifndef SQUISH_SIMD_FLOAT_H
+#define SQUISH_SIMD_FLOAT_H
+
+#include <algorithm>
+
+namespace squish {
+
+#define VEC4_CONST( X ) Vec4( X )
+
+class Vec4
+{
+public:
+ typedef Vec4 const& Arg;
+
+ Vec4() {}
+
+ explicit Vec4( float s )
+ : m_x( s ),
+ m_y( s ),
+ m_z( s ),
+ m_w( s )
+ {
+ }
+
+ Vec4( float x, float y, float z, float w )
+ : m_x( x ),
+ m_y( y ),
+ m_z( z ),
+ m_w( w )
+ {
+ }
+
+ Vec3 GetVec3() const
+ {
+ return Vec3( m_x, m_y, m_z );
+ }
+
+ Vec4 SplatX() const { return Vec4( m_x ); }
+ Vec4 SplatY() const { return Vec4( m_y ); }
+ Vec4 SplatZ() const { return Vec4( m_z ); }
+ Vec4 SplatW() const { return Vec4( m_w ); }
+
+ Vec4& operator+=( Arg v )
+ {
+ m_x += v.m_x;
+ m_y += v.m_y;
+ m_z += v.m_z;
+ m_w += v.m_w;
+ return *this;
+ }
+
+ Vec4& operator-=( Arg v )
+ {
+ m_x -= v.m_x;
+ m_y -= v.m_y;
+ m_z -= v.m_z;
+ m_w -= v.m_w;
+ return *this;
+ }
+
+ Vec4& operator*=( Arg v )
+ {
+ m_x *= v.m_x;
+ m_y *= v.m_y;
+ m_z *= v.m_z;
+ m_w *= v.m_w;
+ return *this;
+ }
+
+ friend Vec4 operator+( Vec4::Arg left, Vec4::Arg right )
+ {
+ Vec4 copy( left );
+ return copy += right;
+ }
+
+ friend Vec4 operator-( Vec4::Arg left, Vec4::Arg right )
+ {
+ Vec4 copy( left );
+ return copy -= right;
+ }
+
+ friend Vec4 operator*( Vec4::Arg left, Vec4::Arg right )
+ {
+ Vec4 copy( left );
+ return copy *= right;
+ }
+
+ //! Returns a*b + c
+ friend Vec4 MultiplyAdd( Vec4::Arg a, Vec4::Arg b, Vec4::Arg c )
+ {
+ return a*b + c;
+ }
+
+ //! Returns -( a*b - c )
+ friend Vec4 NegativeMultiplySubtract( Vec4::Arg a, Vec4::Arg b, Vec4::Arg c )
+ {
+ return c - a*b;
+ }
+
+ friend Vec4 Reciprocal( Vec4::Arg v )
+ {
+ return Vec4(
+ 1.0f/v.m_x,
+ 1.0f/v.m_y,
+ 1.0f/v.m_z,
+ 1.0f/v.m_w
+ );
+ }
+
+ friend Vec4 Min( Vec4::Arg left, Vec4::Arg right )
+ {
+ return Vec4(
+ std::min( left.m_x, right.m_x ),
+ std::min( left.m_y, right.m_y ),
+ std::min( left.m_z, right.m_z ),
+ std::min( left.m_w, right.m_w )
+ );
+ }
+
+ friend Vec4 Max( Vec4::Arg left, Vec4::Arg right )
+ {
+ return Vec4(
+ std::max( left.m_x, right.m_x ),
+ std::max( left.m_y, right.m_y ),
+ std::max( left.m_z, right.m_z ),
+ std::max( left.m_w, right.m_w )
+ );
+ }
+
+ friend Vec4 Truncate( Vec4::Arg v )
+ {
+ return Vec4(
+ v.m_x > 0.0f ? std::floor( v.m_x ) : std::ceil( v.m_x ),
+ v.m_y > 0.0f ? std::floor( v.m_y ) : std::ceil( v.m_y ),
+ v.m_z > 0.0f ? std::floor( v.m_z ) : std::ceil( v.m_z ),
+ v.m_w > 0.0f ? std::floor( v.m_w ) : std::ceil( v.m_w )
+ );
+ }
+
+ friend bool CompareAnyLessThan( Vec4::Arg left, Vec4::Arg right )
+ {
+ return left.m_x < right.m_x
+ || left.m_y < right.m_y
+ || left.m_z < right.m_z
+ || left.m_w < right.m_w;
+ }
+
+private:
+ float m_x;
+ float m_y;
+ float m_z;
+ float m_w;
+};
+
+} // namespace squish
+
+#endif // ndef SQUISH_SIMD_FLOAT_H
+
diff --git a/3rdparty/bgfx/3rdparty/libsquish/singlecolourfit.cpp b/3rdparty/bgfx/3rdparty/libsquish/singlecolourfit.cpp
new file mode 100644
index 00000000000..e8a01176980
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/libsquish/singlecolourfit.cpp
@@ -0,0 +1,172 @@
+/* -----------------------------------------------------------------------------
+
+ Copyright (c) 2006 Simon Brown si@sjbrown.co.uk
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ -------------------------------------------------------------------------- */
+
+#include "singlecolourfit.h"
+#include "colourset.h"
+#include "colourblock.h"
+
+namespace squish {
+
+struct SourceBlock
+{
+ u8 start;
+ u8 end;
+ u8 error;
+};
+
+struct SingleColourLookup
+{
+ SourceBlock sources[2];
+};
+
+#include "singlecolourlookup.inl"
+
+static int FloatToInt( float a, int limit )
+{
+ // use ANSI round-to-zero behaviour to get round-to-nearest
+ int i = ( int )( a + 0.5f );
+
+ // clamp to the limit
+ if( i < 0 )
+ i = 0;
+ else if( i > limit )
+ i = limit;
+
+ // done
+ return i;
+}
+
+SingleColourFit::SingleColourFit( ColourSet const* colours, int flags )
+ : ColourFit( colours, flags )
+{
+ // grab the single colour
+ Vec3 const* values = m_colours->GetPoints();
+ m_colour[0] = ( u8 )FloatToInt( 255.0f*values->X(), 255 );
+ m_colour[1] = ( u8 )FloatToInt( 255.0f*values->Y(), 255 );
+ m_colour[2] = ( u8 )FloatToInt( 255.0f*values->Z(), 255 );
+
+ // initialise the best error
+ m_besterror = INT_MAX;
+}
+
+void SingleColourFit::Compress3( void* block )
+{
+ // build the table of lookups
+ SingleColourLookup const* const lookups[] =
+ {
+ lookup_5_3,
+ lookup_6_3,
+ lookup_5_3
+ };
+
+ // find the best end-points and index
+ ComputeEndPoints( lookups );
+
+ // build the block if we win
+ if( m_error < m_besterror )
+ {
+ // remap the indices
+ u8 indices[16];
+ m_colours->RemapIndices( &m_index, indices );
+
+ // save the block
+ WriteColourBlock3( m_start, m_end, indices, block );
+
+ // save the error
+ m_besterror = m_error;
+ }
+}
+
+void SingleColourFit::Compress4( void* block )
+{
+ // build the table of lookups
+ SingleColourLookup const* const lookups[] =
+ {
+ lookup_5_4,
+ lookup_6_4,
+ lookup_5_4
+ };
+
+ // find the best end-points and index
+ ComputeEndPoints( lookups );
+
+ // build the block if we win
+ if( m_error < m_besterror )
+ {
+ // remap the indices
+ u8 indices[16];
+ m_colours->RemapIndices( &m_index, indices );
+
+ // save the block
+ WriteColourBlock4( m_start, m_end, indices, block );
+
+ // save the error
+ m_besterror = m_error;
+ }
+}
+
+void SingleColourFit::ComputeEndPoints( SingleColourLookup const* const* lookups )
+{
+ // check each index combination (endpoint or intermediate)
+ m_error = INT_MAX;
+ for( int index = 0; index < 2; ++index )
+ {
+ // check the error for this codebook index
+ SourceBlock const* sources[3];
+ int error = 0;
+ for( int channel = 0; channel < 3; ++channel )
+ {
+ // grab the lookup table and index for this channel
+ SingleColourLookup const* lookup = lookups[channel];
+ int target = m_colour[channel];
+
+ // store a pointer to the source for this channel
+ sources[channel] = lookup[target].sources + index;
+
+ // accumulate the error
+ int diff = sources[channel]->error;
+ error += diff*diff;
+ }
+
+ // keep it if the error is lower
+ if( error < m_error )
+ {
+ m_start = Vec3(
+ ( float )sources[0]->start/31.0f,
+ ( float )sources[1]->start/63.0f,
+ ( float )sources[2]->start/31.0f
+ );
+ m_end = Vec3(
+ ( float )sources[0]->end/31.0f,
+ ( float )sources[1]->end/63.0f,
+ ( float )sources[2]->end/31.0f
+ );
+ m_index = ( u8 )( 2*index );
+ m_error = error;
+ }
+ }
+}
+
+} // namespace squish
diff --git a/3rdparty/bgfx/3rdparty/libsquish/singlecolourfit.h b/3rdparty/bgfx/3rdparty/libsquish/singlecolourfit.h
new file mode 100644
index 00000000000..54ec17ebb85
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/libsquish/singlecolourfit.h
@@ -0,0 +1,58 @@
+/* -----------------------------------------------------------------------------
+
+ Copyright (c) 2006 Simon Brown si@sjbrown.co.uk
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ -------------------------------------------------------------------------- */
+
+#ifndef SQUISH_SINGLECOLOURFIT_H
+#define SQUISH_SINGLECOLOURFIT_H
+
+#include "squish.h"
+#include "colourfit.h"
+
+namespace squish {
+
+class ColourSet;
+struct SingleColourLookup;
+
+class SingleColourFit : public ColourFit
+{
+public:
+ SingleColourFit( ColourSet const* colours, int flags );
+
+private:
+ virtual void Compress3( void* block );
+ virtual void Compress4( void* block );
+
+ void ComputeEndPoints( SingleColourLookup const* const* lookups );
+
+ u8 m_colour[3];
+ Vec3 m_start;
+ Vec3 m_end;
+ u8 m_index;
+ int m_error;
+ int m_besterror;
+};
+
+} // namespace squish
+
+#endif // ndef SQUISH_SINGLECOLOURFIT_H
diff --git a/3rdparty/bgfx/3rdparty/libsquish/singlecolourlookup.inl b/3rdparty/bgfx/3rdparty/libsquish/singlecolourlookup.inl
new file mode 100644
index 00000000000..5e911745e41
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/libsquish/singlecolourlookup.inl
@@ -0,0 +1,1064 @@
+/* -----------------------------------------------------------------------------
+
+ Copyright (c) 2006 Simon Brown si@sjbrown.co.uk
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ -------------------------------------------------------------------------- */
+
+static SingleColourLookup const lookup_5_3[] =
+{
+ { { { 0, 0, 0 }, { 0, 0, 0 } } },
+ { { { 0, 0, 1 }, { 0, 0, 1 } } },
+ { { { 0, 0, 2 }, { 0, 0, 2 } } },
+ { { { 0, 0, 3 }, { 0, 1, 1 } } },
+ { { { 0, 0, 4 }, { 0, 1, 0 } } },
+ { { { 1, 0, 3 }, { 0, 1, 1 } } },
+ { { { 1, 0, 2 }, { 0, 1, 2 } } },
+ { { { 1, 0, 1 }, { 0, 2, 1 } } },
+ { { { 1, 0, 0 }, { 0, 2, 0 } } },
+ { { { 1, 0, 1 }, { 0, 2, 1 } } },
+ { { { 1, 0, 2 }, { 0, 2, 2 } } },
+ { { { 1, 0, 3 }, { 0, 3, 1 } } },
+ { { { 1, 0, 4 }, { 0, 3, 0 } } },
+ { { { 2, 0, 3 }, { 0, 3, 1 } } },
+ { { { 2, 0, 2 }, { 0, 3, 2 } } },
+ { { { 2, 0, 1 }, { 0, 4, 1 } } },
+ { { { 2, 0, 0 }, { 0, 4, 0 } } },
+ { { { 2, 0, 1 }, { 0, 4, 1 } } },
+ { { { 2, 0, 2 }, { 0, 4, 2 } } },
+ { { { 2, 0, 3 }, { 0, 5, 1 } } },
+ { { { 2, 0, 4 }, { 0, 5, 0 } } },
+ { { { 3, 0, 3 }, { 0, 5, 1 } } },
+ { { { 3, 0, 2 }, { 0, 5, 2 } } },
+ { { { 3, 0, 1 }, { 0, 6, 1 } } },
+ { { { 3, 0, 0 }, { 0, 6, 0 } } },
+ { { { 3, 0, 1 }, { 0, 6, 1 } } },
+ { { { 3, 0, 2 }, { 0, 6, 2 } } },
+ { { { 3, 0, 3 }, { 0, 7, 1 } } },
+ { { { 3, 0, 4 }, { 0, 7, 0 } } },
+ { { { 4, 0, 4 }, { 0, 7, 1 } } },
+ { { { 4, 0, 3 }, { 0, 7, 2 } } },
+ { { { 4, 0, 2 }, { 1, 7, 1 } } },
+ { { { 4, 0, 1 }, { 1, 7, 0 } } },
+ { { { 4, 0, 0 }, { 0, 8, 0 } } },
+ { { { 4, 0, 1 }, { 0, 8, 1 } } },
+ { { { 4, 0, 2 }, { 2, 7, 1 } } },
+ { { { 4, 0, 3 }, { 2, 7, 0 } } },
+ { { { 4, 0, 4 }, { 0, 9, 0 } } },
+ { { { 5, 0, 3 }, { 0, 9, 1 } } },
+ { { { 5, 0, 2 }, { 3, 7, 1 } } },
+ { { { 5, 0, 1 }, { 3, 7, 0 } } },
+ { { { 5, 0, 0 }, { 0, 10, 0 } } },
+ { { { 5, 0, 1 }, { 0, 10, 1 } } },
+ { { { 5, 0, 2 }, { 0, 10, 2 } } },
+ { { { 5, 0, 3 }, { 0, 11, 1 } } },
+ { { { 5, 0, 4 }, { 0, 11, 0 } } },
+ { { { 6, 0, 3 }, { 0, 11, 1 } } },
+ { { { 6, 0, 2 }, { 0, 11, 2 } } },
+ { { { 6, 0, 1 }, { 0, 12, 1 } } },
+ { { { 6, 0, 0 }, { 0, 12, 0 } } },
+ { { { 6, 0, 1 }, { 0, 12, 1 } } },
+ { { { 6, 0, 2 }, { 0, 12, 2 } } },
+ { { { 6, 0, 3 }, { 0, 13, 1 } } },
+ { { { 6, 0, 4 }, { 0, 13, 0 } } },
+ { { { 7, 0, 3 }, { 0, 13, 1 } } },
+ { { { 7, 0, 2 }, { 0, 13, 2 } } },
+ { { { 7, 0, 1 }, { 0, 14, 1 } } },
+ { { { 7, 0, 0 }, { 0, 14, 0 } } },
+ { { { 7, 0, 1 }, { 0, 14, 1 } } },
+ { { { 7, 0, 2 }, { 0, 14, 2 } } },
+ { { { 7, 0, 3 }, { 0, 15, 1 } } },
+ { { { 7, 0, 4 }, { 0, 15, 0 } } },
+ { { { 8, 0, 4 }, { 0, 15, 1 } } },
+ { { { 8, 0, 3 }, { 0, 15, 2 } } },
+ { { { 8, 0, 2 }, { 1, 15, 1 } } },
+ { { { 8, 0, 1 }, { 1, 15, 0 } } },
+ { { { 8, 0, 0 }, { 0, 16, 0 } } },
+ { { { 8, 0, 1 }, { 0, 16, 1 } } },
+ { { { 8, 0, 2 }, { 2, 15, 1 } } },
+ { { { 8, 0, 3 }, { 2, 15, 0 } } },
+ { { { 8, 0, 4 }, { 0, 17, 0 } } },
+ { { { 9, 0, 3 }, { 0, 17, 1 } } },
+ { { { 9, 0, 2 }, { 3, 15, 1 } } },
+ { { { 9, 0, 1 }, { 3, 15, 0 } } },
+ { { { 9, 0, 0 }, { 0, 18, 0 } } },
+ { { { 9, 0, 1 }, { 0, 18, 1 } } },
+ { { { 9, 0, 2 }, { 0, 18, 2 } } },
+ { { { 9, 0, 3 }, { 0, 19, 1 } } },
+ { { { 9, 0, 4 }, { 0, 19, 0 } } },
+ { { { 10, 0, 3 }, { 0, 19, 1 } } },
+ { { { 10, 0, 2 }, { 0, 19, 2 } } },
+ { { { 10, 0, 1 }, { 0, 20, 1 } } },
+ { { { 10, 0, 0 }, { 0, 20, 0 } } },
+ { { { 10, 0, 1 }, { 0, 20, 1 } } },
+ { { { 10, 0, 2 }, { 0, 20, 2 } } },
+ { { { 10, 0, 3 }, { 0, 21, 1 } } },
+ { { { 10, 0, 4 }, { 0, 21, 0 } } },
+ { { { 11, 0, 3 }, { 0, 21, 1 } } },
+ { { { 11, 0, 2 }, { 0, 21, 2 } } },
+ { { { 11, 0, 1 }, { 0, 22, 1 } } },
+ { { { 11, 0, 0 }, { 0, 22, 0 } } },
+ { { { 11, 0, 1 }, { 0, 22, 1 } } },
+ { { { 11, 0, 2 }, { 0, 22, 2 } } },
+ { { { 11, 0, 3 }, { 0, 23, 1 } } },
+ { { { 11, 0, 4 }, { 0, 23, 0 } } },
+ { { { 12, 0, 4 }, { 0, 23, 1 } } },
+ { { { 12, 0, 3 }, { 0, 23, 2 } } },
+ { { { 12, 0, 2 }, { 1, 23, 1 } } },
+ { { { 12, 0, 1 }, { 1, 23, 0 } } },
+ { { { 12, 0, 0 }, { 0, 24, 0 } } },
+ { { { 12, 0, 1 }, { 0, 24, 1 } } },
+ { { { 12, 0, 2 }, { 2, 23, 1 } } },
+ { { { 12, 0, 3 }, { 2, 23, 0 } } },
+ { { { 12, 0, 4 }, { 0, 25, 0 } } },
+ { { { 13, 0, 3 }, { 0, 25, 1 } } },
+ { { { 13, 0, 2 }, { 3, 23, 1 } } },
+ { { { 13, 0, 1 }, { 3, 23, 0 } } },
+ { { { 13, 0, 0 }, { 0, 26, 0 } } },
+ { { { 13, 0, 1 }, { 0, 26, 1 } } },
+ { { { 13, 0, 2 }, { 0, 26, 2 } } },
+ { { { 13, 0, 3 }, { 0, 27, 1 } } },
+ { { { 13, 0, 4 }, { 0, 27, 0 } } },
+ { { { 14, 0, 3 }, { 0, 27, 1 } } },
+ { { { 14, 0, 2 }, { 0, 27, 2 } } },
+ { { { 14, 0, 1 }, { 0, 28, 1 } } },
+ { { { 14, 0, 0 }, { 0, 28, 0 } } },
+ { { { 14, 0, 1 }, { 0, 28, 1 } } },
+ { { { 14, 0, 2 }, { 0, 28, 2 } } },
+ { { { 14, 0, 3 }, { 0, 29, 1 } } },
+ { { { 14, 0, 4 }, { 0, 29, 0 } } },
+ { { { 15, 0, 3 }, { 0, 29, 1 } } },
+ { { { 15, 0, 2 }, { 0, 29, 2 } } },
+ { { { 15, 0, 1 }, { 0, 30, 1 } } },
+ { { { 15, 0, 0 }, { 0, 30, 0 } } },
+ { { { 15, 0, 1 }, { 0, 30, 1 } } },
+ { { { 15, 0, 2 }, { 0, 30, 2 } } },
+ { { { 15, 0, 3 }, { 0, 31, 1 } } },
+ { { { 15, 0, 4 }, { 0, 31, 0 } } },
+ { { { 16, 0, 4 }, { 0, 31, 1 } } },
+ { { { 16, 0, 3 }, { 0, 31, 2 } } },
+ { { { 16, 0, 2 }, { 1, 31, 1 } } },
+ { { { 16, 0, 1 }, { 1, 31, 0 } } },
+ { { { 16, 0, 0 }, { 4, 28, 0 } } },
+ { { { 16, 0, 1 }, { 4, 28, 1 } } },
+ { { { 16, 0, 2 }, { 2, 31, 1 } } },
+ { { { 16, 0, 3 }, { 2, 31, 0 } } },
+ { { { 16, 0, 4 }, { 4, 29, 0 } } },
+ { { { 17, 0, 3 }, { 4, 29, 1 } } },
+ { { { 17, 0, 2 }, { 3, 31, 1 } } },
+ { { { 17, 0, 1 }, { 3, 31, 0 } } },
+ { { { 17, 0, 0 }, { 4, 30, 0 } } },
+ { { { 17, 0, 1 }, { 4, 30, 1 } } },
+ { { { 17, 0, 2 }, { 4, 30, 2 } } },
+ { { { 17, 0, 3 }, { 4, 31, 1 } } },
+ { { { 17, 0, 4 }, { 4, 31, 0 } } },
+ { { { 18, 0, 3 }, { 4, 31, 1 } } },
+ { { { 18, 0, 2 }, { 4, 31, 2 } } },
+ { { { 18, 0, 1 }, { 5, 31, 1 } } },
+ { { { 18, 0, 0 }, { 5, 31, 0 } } },
+ { { { 18, 0, 1 }, { 5, 31, 1 } } },
+ { { { 18, 0, 2 }, { 5, 31, 2 } } },
+ { { { 18, 0, 3 }, { 6, 31, 1 } } },
+ { { { 18, 0, 4 }, { 6, 31, 0 } } },
+ { { { 19, 0, 3 }, { 6, 31, 1 } } },
+ { { { 19, 0, 2 }, { 6, 31, 2 } } },
+ { { { 19, 0, 1 }, { 7, 31, 1 } } },
+ { { { 19, 0, 0 }, { 7, 31, 0 } } },
+ { { { 19, 0, 1 }, { 7, 31, 1 } } },
+ { { { 19, 0, 2 }, { 7, 31, 2 } } },
+ { { { 19, 0, 3 }, { 8, 31, 1 } } },
+ { { { 19, 0, 4 }, { 8, 31, 0 } } },
+ { { { 20, 0, 4 }, { 8, 31, 1 } } },
+ { { { 20, 0, 3 }, { 8, 31, 2 } } },
+ { { { 20, 0, 2 }, { 9, 31, 1 } } },
+ { { { 20, 0, 1 }, { 9, 31, 0 } } },
+ { { { 20, 0, 0 }, { 12, 28, 0 } } },
+ { { { 20, 0, 1 }, { 12, 28, 1 } } },
+ { { { 20, 0, 2 }, { 10, 31, 1 } } },
+ { { { 20, 0, 3 }, { 10, 31, 0 } } },
+ { { { 20, 0, 4 }, { 12, 29, 0 } } },
+ { { { 21, 0, 3 }, { 12, 29, 1 } } },
+ { { { 21, 0, 2 }, { 11, 31, 1 } } },
+ { { { 21, 0, 1 }, { 11, 31, 0 } } },
+ { { { 21, 0, 0 }, { 12, 30, 0 } } },
+ { { { 21, 0, 1 }, { 12, 30, 1 } } },
+ { { { 21, 0, 2 }, { 12, 30, 2 } } },
+ { { { 21, 0, 3 }, { 12, 31, 1 } } },
+ { { { 21, 0, 4 }, { 12, 31, 0 } } },
+ { { { 22, 0, 3 }, { 12, 31, 1 } } },
+ { { { 22, 0, 2 }, { 12, 31, 2 } } },
+ { { { 22, 0, 1 }, { 13, 31, 1 } } },
+ { { { 22, 0, 0 }, { 13, 31, 0 } } },
+ { { { 22, 0, 1 }, { 13, 31, 1 } } },
+ { { { 22, 0, 2 }, { 13, 31, 2 } } },
+ { { { 22, 0, 3 }, { 14, 31, 1 } } },
+ { { { 22, 0, 4 }, { 14, 31, 0 } } },
+ { { { 23, 0, 3 }, { 14, 31, 1 } } },
+ { { { 23, 0, 2 }, { 14, 31, 2 } } },
+ { { { 23, 0, 1 }, { 15, 31, 1 } } },
+ { { { 23, 0, 0 }, { 15, 31, 0 } } },
+ { { { 23, 0, 1 }, { 15, 31, 1 } } },
+ { { { 23, 0, 2 }, { 15, 31, 2 } } },
+ { { { 23, 0, 3 }, { 16, 31, 1 } } },
+ { { { 23, 0, 4 }, { 16, 31, 0 } } },
+ { { { 24, 0, 4 }, { 16, 31, 1 } } },
+ { { { 24, 0, 3 }, { 16, 31, 2 } } },
+ { { { 24, 0, 2 }, { 17, 31, 1 } } },
+ { { { 24, 0, 1 }, { 17, 31, 0 } } },
+ { { { 24, 0, 0 }, { 20, 28, 0 } } },
+ { { { 24, 0, 1 }, { 20, 28, 1 } } },
+ { { { 24, 0, 2 }, { 18, 31, 1 } } },
+ { { { 24, 0, 3 }, { 18, 31, 0 } } },
+ { { { 24, 0, 4 }, { 20, 29, 0 } } },
+ { { { 25, 0, 3 }, { 20, 29, 1 } } },
+ { { { 25, 0, 2 }, { 19, 31, 1 } } },
+ { { { 25, 0, 1 }, { 19, 31, 0 } } },
+ { { { 25, 0, 0 }, { 20, 30, 0 } } },
+ { { { 25, 0, 1 }, { 20, 30, 1 } } },
+ { { { 25, 0, 2 }, { 20, 30, 2 } } },
+ { { { 25, 0, 3 }, { 20, 31, 1 } } },
+ { { { 25, 0, 4 }, { 20, 31, 0 } } },
+ { { { 26, 0, 3 }, { 20, 31, 1 } } },
+ { { { 26, 0, 2 }, { 20, 31, 2 } } },
+ { { { 26, 0, 1 }, { 21, 31, 1 } } },
+ { { { 26, 0, 0 }, { 21, 31, 0 } } },
+ { { { 26, 0, 1 }, { 21, 31, 1 } } },
+ { { { 26, 0, 2 }, { 21, 31, 2 } } },
+ { { { 26, 0, 3 }, { 22, 31, 1 } } },
+ { { { 26, 0, 4 }, { 22, 31, 0 } } },
+ { { { 27, 0, 3 }, { 22, 31, 1 } } },
+ { { { 27, 0, 2 }, { 22, 31, 2 } } },
+ { { { 27, 0, 1 }, { 23, 31, 1 } } },
+ { { { 27, 0, 0 }, { 23, 31, 0 } } },
+ { { { 27, 0, 1 }, { 23, 31, 1 } } },
+ { { { 27, 0, 2 }, { 23, 31, 2 } } },
+ { { { 27, 0, 3 }, { 24, 31, 1 } } },
+ { { { 27, 0, 4 }, { 24, 31, 0 } } },
+ { { { 28, 0, 4 }, { 24, 31, 1 } } },
+ { { { 28, 0, 3 }, { 24, 31, 2 } } },
+ { { { 28, 0, 2 }, { 25, 31, 1 } } },
+ { { { 28, 0, 1 }, { 25, 31, 0 } } },
+ { { { 28, 0, 0 }, { 28, 28, 0 } } },
+ { { { 28, 0, 1 }, { 28, 28, 1 } } },
+ { { { 28, 0, 2 }, { 26, 31, 1 } } },
+ { { { 28, 0, 3 }, { 26, 31, 0 } } },
+ { { { 28, 0, 4 }, { 28, 29, 0 } } },
+ { { { 29, 0, 3 }, { 28, 29, 1 } } },
+ { { { 29, 0, 2 }, { 27, 31, 1 } } },
+ { { { 29, 0, 1 }, { 27, 31, 0 } } },
+ { { { 29, 0, 0 }, { 28, 30, 0 } } },
+ { { { 29, 0, 1 }, { 28, 30, 1 } } },
+ { { { 29, 0, 2 }, { 28, 30, 2 } } },
+ { { { 29, 0, 3 }, { 28, 31, 1 } } },
+ { { { 29, 0, 4 }, { 28, 31, 0 } } },
+ { { { 30, 0, 3 }, { 28, 31, 1 } } },
+ { { { 30, 0, 2 }, { 28, 31, 2 } } },
+ { { { 30, 0, 1 }, { 29, 31, 1 } } },
+ { { { 30, 0, 0 }, { 29, 31, 0 } } },
+ { { { 30, 0, 1 }, { 29, 31, 1 } } },
+ { { { 30, 0, 2 }, { 29, 31, 2 } } },
+ { { { 30, 0, 3 }, { 30, 31, 1 } } },
+ { { { 30, 0, 4 }, { 30, 31, 0 } } },
+ { { { 31, 0, 3 }, { 30, 31, 1 } } },
+ { { { 31, 0, 2 }, { 30, 31, 2 } } },
+ { { { 31, 0, 1 }, { 31, 31, 1 } } },
+ { { { 31, 0, 0 }, { 31, 31, 0 } } }
+};
+
+static SingleColourLookup const lookup_6_3[] =
+{
+ { { { 0, 0, 0 }, { 0, 0, 0 } } },
+ { { { 0, 0, 1 }, { 0, 1, 1 } } },
+ { { { 0, 0, 2 }, { 0, 1, 0 } } },
+ { { { 1, 0, 1 }, { 0, 2, 1 } } },
+ { { { 1, 0, 0 }, { 0, 2, 0 } } },
+ { { { 1, 0, 1 }, { 0, 3, 1 } } },
+ { { { 1, 0, 2 }, { 0, 3, 0 } } },
+ { { { 2, 0, 1 }, { 0, 4, 1 } } },
+ { { { 2, 0, 0 }, { 0, 4, 0 } } },
+ { { { 2, 0, 1 }, { 0, 5, 1 } } },
+ { { { 2, 0, 2 }, { 0, 5, 0 } } },
+ { { { 3, 0, 1 }, { 0, 6, 1 } } },
+ { { { 3, 0, 0 }, { 0, 6, 0 } } },
+ { { { 3, 0, 1 }, { 0, 7, 1 } } },
+ { { { 3, 0, 2 }, { 0, 7, 0 } } },
+ { { { 4, 0, 1 }, { 0, 8, 1 } } },
+ { { { 4, 0, 0 }, { 0, 8, 0 } } },
+ { { { 4, 0, 1 }, { 0, 9, 1 } } },
+ { { { 4, 0, 2 }, { 0, 9, 0 } } },
+ { { { 5, 0, 1 }, { 0, 10, 1 } } },
+ { { { 5, 0, 0 }, { 0, 10, 0 } } },
+ { { { 5, 0, 1 }, { 0, 11, 1 } } },
+ { { { 5, 0, 2 }, { 0, 11, 0 } } },
+ { { { 6, 0, 1 }, { 0, 12, 1 } } },
+ { { { 6, 0, 0 }, { 0, 12, 0 } } },
+ { { { 6, 0, 1 }, { 0, 13, 1 } } },
+ { { { 6, 0, 2 }, { 0, 13, 0 } } },
+ { { { 7, 0, 1 }, { 0, 14, 1 } } },
+ { { { 7, 0, 0 }, { 0, 14, 0 } } },
+ { { { 7, 0, 1 }, { 0, 15, 1 } } },
+ { { { 7, 0, 2 }, { 0, 15, 0 } } },
+ { { { 8, 0, 1 }, { 0, 16, 1 } } },
+ { { { 8, 0, 0 }, { 0, 16, 0 } } },
+ { { { 8, 0, 1 }, { 0, 17, 1 } } },
+ { { { 8, 0, 2 }, { 0, 17, 0 } } },
+ { { { 9, 0, 1 }, { 0, 18, 1 } } },
+ { { { 9, 0, 0 }, { 0, 18, 0 } } },
+ { { { 9, 0, 1 }, { 0, 19, 1 } } },
+ { { { 9, 0, 2 }, { 0, 19, 0 } } },
+ { { { 10, 0, 1 }, { 0, 20, 1 } } },
+ { { { 10, 0, 0 }, { 0, 20, 0 } } },
+ { { { 10, 0, 1 }, { 0, 21, 1 } } },
+ { { { 10, 0, 2 }, { 0, 21, 0 } } },
+ { { { 11, 0, 1 }, { 0, 22, 1 } } },
+ { { { 11, 0, 0 }, { 0, 22, 0 } } },
+ { { { 11, 0, 1 }, { 0, 23, 1 } } },
+ { { { 11, 0, 2 }, { 0, 23, 0 } } },
+ { { { 12, 0, 1 }, { 0, 24, 1 } } },
+ { { { 12, 0, 0 }, { 0, 24, 0 } } },
+ { { { 12, 0, 1 }, { 0, 25, 1 } } },
+ { { { 12, 0, 2 }, { 0, 25, 0 } } },
+ { { { 13, 0, 1 }, { 0, 26, 1 } } },
+ { { { 13, 0, 0 }, { 0, 26, 0 } } },
+ { { { 13, 0, 1 }, { 0, 27, 1 } } },
+ { { { 13, 0, 2 }, { 0, 27, 0 } } },
+ { { { 14, 0, 1 }, { 0, 28, 1 } } },
+ { { { 14, 0, 0 }, { 0, 28, 0 } } },
+ { { { 14, 0, 1 }, { 0, 29, 1 } } },
+ { { { 14, 0, 2 }, { 0, 29, 0 } } },
+ { { { 15, 0, 1 }, { 0, 30, 1 } } },
+ { { { 15, 0, 0 }, { 0, 30, 0 } } },
+ { { { 15, 0, 1 }, { 0, 31, 1 } } },
+ { { { 15, 0, 2 }, { 0, 31, 0 } } },
+ { { { 16, 0, 2 }, { 1, 31, 1 } } },
+ { { { 16, 0, 1 }, { 1, 31, 0 } } },
+ { { { 16, 0, 0 }, { 0, 32, 0 } } },
+ { { { 16, 0, 1 }, { 2, 31, 0 } } },
+ { { { 16, 0, 2 }, { 0, 33, 0 } } },
+ { { { 17, 0, 1 }, { 3, 31, 0 } } },
+ { { { 17, 0, 0 }, { 0, 34, 0 } } },
+ { { { 17, 0, 1 }, { 4, 31, 0 } } },
+ { { { 17, 0, 2 }, { 0, 35, 0 } } },
+ { { { 18, 0, 1 }, { 5, 31, 0 } } },
+ { { { 18, 0, 0 }, { 0, 36, 0 } } },
+ { { { 18, 0, 1 }, { 6, 31, 0 } } },
+ { { { 18, 0, 2 }, { 0, 37, 0 } } },
+ { { { 19, 0, 1 }, { 7, 31, 0 } } },
+ { { { 19, 0, 0 }, { 0, 38, 0 } } },
+ { { { 19, 0, 1 }, { 8, 31, 0 } } },
+ { { { 19, 0, 2 }, { 0, 39, 0 } } },
+ { { { 20, 0, 1 }, { 9, 31, 0 } } },
+ { { { 20, 0, 0 }, { 0, 40, 0 } } },
+ { { { 20, 0, 1 }, { 10, 31, 0 } } },
+ { { { 20, 0, 2 }, { 0, 41, 0 } } },
+ { { { 21, 0, 1 }, { 11, 31, 0 } } },
+ { { { 21, 0, 0 }, { 0, 42, 0 } } },
+ { { { 21, 0, 1 }, { 12, 31, 0 } } },
+ { { { 21, 0, 2 }, { 0, 43, 0 } } },
+ { { { 22, 0, 1 }, { 13, 31, 0 } } },
+ { { { 22, 0, 0 }, { 0, 44, 0 } } },
+ { { { 22, 0, 1 }, { 14, 31, 0 } } },
+ { { { 22, 0, 2 }, { 0, 45, 0 } } },
+ { { { 23, 0, 1 }, { 15, 31, 0 } } },
+ { { { 23, 0, 0 }, { 0, 46, 0 } } },
+ { { { 23, 0, 1 }, { 0, 47, 1 } } },
+ { { { 23, 0, 2 }, { 0, 47, 0 } } },
+ { { { 24, 0, 1 }, { 0, 48, 1 } } },
+ { { { 24, 0, 0 }, { 0, 48, 0 } } },
+ { { { 24, 0, 1 }, { 0, 49, 1 } } },
+ { { { 24, 0, 2 }, { 0, 49, 0 } } },
+ { { { 25, 0, 1 }, { 0, 50, 1 } } },
+ { { { 25, 0, 0 }, { 0, 50, 0 } } },
+ { { { 25, 0, 1 }, { 0, 51, 1 } } },
+ { { { 25, 0, 2 }, { 0, 51, 0 } } },
+ { { { 26, 0, 1 }, { 0, 52, 1 } } },
+ { { { 26, 0, 0 }, { 0, 52, 0 } } },
+ { { { 26, 0, 1 }, { 0, 53, 1 } } },
+ { { { 26, 0, 2 }, { 0, 53, 0 } } },
+ { { { 27, 0, 1 }, { 0, 54, 1 } } },
+ { { { 27, 0, 0 }, { 0, 54, 0 } } },
+ { { { 27, 0, 1 }, { 0, 55, 1 } } },
+ { { { 27, 0, 2 }, { 0, 55, 0 } } },
+ { { { 28, 0, 1 }, { 0, 56, 1 } } },
+ { { { 28, 0, 0 }, { 0, 56, 0 } } },
+ { { { 28, 0, 1 }, { 0, 57, 1 } } },
+ { { { 28, 0, 2 }, { 0, 57, 0 } } },
+ { { { 29, 0, 1 }, { 0, 58, 1 } } },
+ { { { 29, 0, 0 }, { 0, 58, 0 } } },
+ { { { 29, 0, 1 }, { 0, 59, 1 } } },
+ { { { 29, 0, 2 }, { 0, 59, 0 } } },
+ { { { 30, 0, 1 }, { 0, 60, 1 } } },
+ { { { 30, 0, 0 }, { 0, 60, 0 } } },
+ { { { 30, 0, 1 }, { 0, 61, 1 } } },
+ { { { 30, 0, 2 }, { 0, 61, 0 } } },
+ { { { 31, 0, 1 }, { 0, 62, 1 } } },
+ { { { 31, 0, 0 }, { 0, 62, 0 } } },
+ { { { 31, 0, 1 }, { 0, 63, 1 } } },
+ { { { 31, 0, 2 }, { 0, 63, 0 } } },
+ { { { 32, 0, 2 }, { 1, 63, 1 } } },
+ { { { 32, 0, 1 }, { 1, 63, 0 } } },
+ { { { 32, 0, 0 }, { 16, 48, 0 } } },
+ { { { 32, 0, 1 }, { 2, 63, 0 } } },
+ { { { 32, 0, 2 }, { 16, 49, 0 } } },
+ { { { 33, 0, 1 }, { 3, 63, 0 } } },
+ { { { 33, 0, 0 }, { 16, 50, 0 } } },
+ { { { 33, 0, 1 }, { 4, 63, 0 } } },
+ { { { 33, 0, 2 }, { 16, 51, 0 } } },
+ { { { 34, 0, 1 }, { 5, 63, 0 } } },
+ { { { 34, 0, 0 }, { 16, 52, 0 } } },
+ { { { 34, 0, 1 }, { 6, 63, 0 } } },
+ { { { 34, 0, 2 }, { 16, 53, 0 } } },
+ { { { 35, 0, 1 }, { 7, 63, 0 } } },
+ { { { 35, 0, 0 }, { 16, 54, 0 } } },
+ { { { 35, 0, 1 }, { 8, 63, 0 } } },
+ { { { 35, 0, 2 }, { 16, 55, 0 } } },
+ { { { 36, 0, 1 }, { 9, 63, 0 } } },
+ { { { 36, 0, 0 }, { 16, 56, 0 } } },
+ { { { 36, 0, 1 }, { 10, 63, 0 } } },
+ { { { 36, 0, 2 }, { 16, 57, 0 } } },
+ { { { 37, 0, 1 }, { 11, 63, 0 } } },
+ { { { 37, 0, 0 }, { 16, 58, 0 } } },
+ { { { 37, 0, 1 }, { 12, 63, 0 } } },
+ { { { 37, 0, 2 }, { 16, 59, 0 } } },
+ { { { 38, 0, 1 }, { 13, 63, 0 } } },
+ { { { 38, 0, 0 }, { 16, 60, 0 } } },
+ { { { 38, 0, 1 }, { 14, 63, 0 } } },
+ { { { 38, 0, 2 }, { 16, 61, 0 } } },
+ { { { 39, 0, 1 }, { 15, 63, 0 } } },
+ { { { 39, 0, 0 }, { 16, 62, 0 } } },
+ { { { 39, 0, 1 }, { 16, 63, 1 } } },
+ { { { 39, 0, 2 }, { 16, 63, 0 } } },
+ { { { 40, 0, 1 }, { 17, 63, 1 } } },
+ { { { 40, 0, 0 }, { 17, 63, 0 } } },
+ { { { 40, 0, 1 }, { 18, 63, 1 } } },
+ { { { 40, 0, 2 }, { 18, 63, 0 } } },
+ { { { 41, 0, 1 }, { 19, 63, 1 } } },
+ { { { 41, 0, 0 }, { 19, 63, 0 } } },
+ { { { 41, 0, 1 }, { 20, 63, 1 } } },
+ { { { 41, 0, 2 }, { 20, 63, 0 } } },
+ { { { 42, 0, 1 }, { 21, 63, 1 } } },
+ { { { 42, 0, 0 }, { 21, 63, 0 } } },
+ { { { 42, 0, 1 }, { 22, 63, 1 } } },
+ { { { 42, 0, 2 }, { 22, 63, 0 } } },
+ { { { 43, 0, 1 }, { 23, 63, 1 } } },
+ { { { 43, 0, 0 }, { 23, 63, 0 } } },
+ { { { 43, 0, 1 }, { 24, 63, 1 } } },
+ { { { 43, 0, 2 }, { 24, 63, 0 } } },
+ { { { 44, 0, 1 }, { 25, 63, 1 } } },
+ { { { 44, 0, 0 }, { 25, 63, 0 } } },
+ { { { 44, 0, 1 }, { 26, 63, 1 } } },
+ { { { 44, 0, 2 }, { 26, 63, 0 } } },
+ { { { 45, 0, 1 }, { 27, 63, 1 } } },
+ { { { 45, 0, 0 }, { 27, 63, 0 } } },
+ { { { 45, 0, 1 }, { 28, 63, 1 } } },
+ { { { 45, 0, 2 }, { 28, 63, 0 } } },
+ { { { 46, 0, 1 }, { 29, 63, 1 } } },
+ { { { 46, 0, 0 }, { 29, 63, 0 } } },
+ { { { 46, 0, 1 }, { 30, 63, 1 } } },
+ { { { 46, 0, 2 }, { 30, 63, 0 } } },
+ { { { 47, 0, 1 }, { 31, 63, 1 } } },
+ { { { 47, 0, 0 }, { 31, 63, 0 } } },
+ { { { 47, 0, 1 }, { 32, 63, 1 } } },
+ { { { 47, 0, 2 }, { 32, 63, 0 } } },
+ { { { 48, 0, 2 }, { 33, 63, 1 } } },
+ { { { 48, 0, 1 }, { 33, 63, 0 } } },
+ { { { 48, 0, 0 }, { 48, 48, 0 } } },
+ { { { 48, 0, 1 }, { 34, 63, 0 } } },
+ { { { 48, 0, 2 }, { 48, 49, 0 } } },
+ { { { 49, 0, 1 }, { 35, 63, 0 } } },
+ { { { 49, 0, 0 }, { 48, 50, 0 } } },
+ { { { 49, 0, 1 }, { 36, 63, 0 } } },
+ { { { 49, 0, 2 }, { 48, 51, 0 } } },
+ { { { 50, 0, 1 }, { 37, 63, 0 } } },
+ { { { 50, 0, 0 }, { 48, 52, 0 } } },
+ { { { 50, 0, 1 }, { 38, 63, 0 } } },
+ { { { 50, 0, 2 }, { 48, 53, 0 } } },
+ { { { 51, 0, 1 }, { 39, 63, 0 } } },
+ { { { 51, 0, 0 }, { 48, 54, 0 } } },
+ { { { 51, 0, 1 }, { 40, 63, 0 } } },
+ { { { 51, 0, 2 }, { 48, 55, 0 } } },
+ { { { 52, 0, 1 }, { 41, 63, 0 } } },
+ { { { 52, 0, 0 }, { 48, 56, 0 } } },
+ { { { 52, 0, 1 }, { 42, 63, 0 } } },
+ { { { 52, 0, 2 }, { 48, 57, 0 } } },
+ { { { 53, 0, 1 }, { 43, 63, 0 } } },
+ { { { 53, 0, 0 }, { 48, 58, 0 } } },
+ { { { 53, 0, 1 }, { 44, 63, 0 } } },
+ { { { 53, 0, 2 }, { 48, 59, 0 } } },
+ { { { 54, 0, 1 }, { 45, 63, 0 } } },
+ { { { 54, 0, 0 }, { 48, 60, 0 } } },
+ { { { 54, 0, 1 }, { 46, 63, 0 } } },
+ { { { 54, 0, 2 }, { 48, 61, 0 } } },
+ { { { 55, 0, 1 }, { 47, 63, 0 } } },
+ { { { 55, 0, 0 }, { 48, 62, 0 } } },
+ { { { 55, 0, 1 }, { 48, 63, 1 } } },
+ { { { 55, 0, 2 }, { 48, 63, 0 } } },
+ { { { 56, 0, 1 }, { 49, 63, 1 } } },
+ { { { 56, 0, 0 }, { 49, 63, 0 } } },
+ { { { 56, 0, 1 }, { 50, 63, 1 } } },
+ { { { 56, 0, 2 }, { 50, 63, 0 } } },
+ { { { 57, 0, 1 }, { 51, 63, 1 } } },
+ { { { 57, 0, 0 }, { 51, 63, 0 } } },
+ { { { 57, 0, 1 }, { 52, 63, 1 } } },
+ { { { 57, 0, 2 }, { 52, 63, 0 } } },
+ { { { 58, 0, 1 }, { 53, 63, 1 } } },
+ { { { 58, 0, 0 }, { 53, 63, 0 } } },
+ { { { 58, 0, 1 }, { 54, 63, 1 } } },
+ { { { 58, 0, 2 }, { 54, 63, 0 } } },
+ { { { 59, 0, 1 }, { 55, 63, 1 } } },
+ { { { 59, 0, 0 }, { 55, 63, 0 } } },
+ { { { 59, 0, 1 }, { 56, 63, 1 } } },
+ { { { 59, 0, 2 }, { 56, 63, 0 } } },
+ { { { 60, 0, 1 }, { 57, 63, 1 } } },
+ { { { 60, 0, 0 }, { 57, 63, 0 } } },
+ { { { 60, 0, 1 }, { 58, 63, 1 } } },
+ { { { 60, 0, 2 }, { 58, 63, 0 } } },
+ { { { 61, 0, 1 }, { 59, 63, 1 } } },
+ { { { 61, 0, 0 }, { 59, 63, 0 } } },
+ { { { 61, 0, 1 }, { 60, 63, 1 } } },
+ { { { 61, 0, 2 }, { 60, 63, 0 } } },
+ { { { 62, 0, 1 }, { 61, 63, 1 } } },
+ { { { 62, 0, 0 }, { 61, 63, 0 } } },
+ { { { 62, 0, 1 }, { 62, 63, 1 } } },
+ { { { 62, 0, 2 }, { 62, 63, 0 } } },
+ { { { 63, 0, 1 }, { 63, 63, 1 } } },
+ { { { 63, 0, 0 }, { 63, 63, 0 } } }
+};
+
+static SingleColourLookup const lookup_5_4[] =
+{
+ { { { 0, 0, 0 }, { 0, 0, 0 } } },
+ { { { 0, 0, 1 }, { 0, 1, 1 } } },
+ { { { 0, 0, 2 }, { 0, 1, 0 } } },
+ { { { 0, 0, 3 }, { 0, 1, 1 } } },
+ { { { 0, 0, 4 }, { 0, 2, 1 } } },
+ { { { 1, 0, 3 }, { 0, 2, 0 } } },
+ { { { 1, 0, 2 }, { 0, 2, 1 } } },
+ { { { 1, 0, 1 }, { 0, 3, 1 } } },
+ { { { 1, 0, 0 }, { 0, 3, 0 } } },
+ { { { 1, 0, 1 }, { 1, 2, 1 } } },
+ { { { 1, 0, 2 }, { 1, 2, 0 } } },
+ { { { 1, 0, 3 }, { 0, 4, 0 } } },
+ { { { 1, 0, 4 }, { 0, 5, 1 } } },
+ { { { 2, 0, 3 }, { 0, 5, 0 } } },
+ { { { 2, 0, 2 }, { 0, 5, 1 } } },
+ { { { 2, 0, 1 }, { 0, 6, 1 } } },
+ { { { 2, 0, 0 }, { 0, 6, 0 } } },
+ { { { 2, 0, 1 }, { 2, 3, 1 } } },
+ { { { 2, 0, 2 }, { 2, 3, 0 } } },
+ { { { 2, 0, 3 }, { 0, 7, 0 } } },
+ { { { 2, 0, 4 }, { 1, 6, 1 } } },
+ { { { 3, 0, 3 }, { 1, 6, 0 } } },
+ { { { 3, 0, 2 }, { 0, 8, 0 } } },
+ { { { 3, 0, 1 }, { 0, 9, 1 } } },
+ { { { 3, 0, 0 }, { 0, 9, 0 } } },
+ { { { 3, 0, 1 }, { 0, 9, 1 } } },
+ { { { 3, 0, 2 }, { 0, 10, 1 } } },
+ { { { 3, 0, 3 }, { 0, 10, 0 } } },
+ { { { 3, 0, 4 }, { 2, 7, 1 } } },
+ { { { 4, 0, 4 }, { 2, 7, 0 } } },
+ { { { 4, 0, 3 }, { 0, 11, 0 } } },
+ { { { 4, 0, 2 }, { 1, 10, 1 } } },
+ { { { 4, 0, 1 }, { 1, 10, 0 } } },
+ { { { 4, 0, 0 }, { 0, 12, 0 } } },
+ { { { 4, 0, 1 }, { 0, 13, 1 } } },
+ { { { 4, 0, 2 }, { 0, 13, 0 } } },
+ { { { 4, 0, 3 }, { 0, 13, 1 } } },
+ { { { 4, 0, 4 }, { 0, 14, 1 } } },
+ { { { 5, 0, 3 }, { 0, 14, 0 } } },
+ { { { 5, 0, 2 }, { 2, 11, 1 } } },
+ { { { 5, 0, 1 }, { 2, 11, 0 } } },
+ { { { 5, 0, 0 }, { 0, 15, 0 } } },
+ { { { 5, 0, 1 }, { 1, 14, 1 } } },
+ { { { 5, 0, 2 }, { 1, 14, 0 } } },
+ { { { 5, 0, 3 }, { 0, 16, 0 } } },
+ { { { 5, 0, 4 }, { 0, 17, 1 } } },
+ { { { 6, 0, 3 }, { 0, 17, 0 } } },
+ { { { 6, 0, 2 }, { 0, 17, 1 } } },
+ { { { 6, 0, 1 }, { 0, 18, 1 } } },
+ { { { 6, 0, 0 }, { 0, 18, 0 } } },
+ { { { 6, 0, 1 }, { 2, 15, 1 } } },
+ { { { 6, 0, 2 }, { 2, 15, 0 } } },
+ { { { 6, 0, 3 }, { 0, 19, 0 } } },
+ { { { 6, 0, 4 }, { 1, 18, 1 } } },
+ { { { 7, 0, 3 }, { 1, 18, 0 } } },
+ { { { 7, 0, 2 }, { 0, 20, 0 } } },
+ { { { 7, 0, 1 }, { 0, 21, 1 } } },
+ { { { 7, 0, 0 }, { 0, 21, 0 } } },
+ { { { 7, 0, 1 }, { 0, 21, 1 } } },
+ { { { 7, 0, 2 }, { 0, 22, 1 } } },
+ { { { 7, 0, 3 }, { 0, 22, 0 } } },
+ { { { 7, 0, 4 }, { 2, 19, 1 } } },
+ { { { 8, 0, 4 }, { 2, 19, 0 } } },
+ { { { 8, 0, 3 }, { 0, 23, 0 } } },
+ { { { 8, 0, 2 }, { 1, 22, 1 } } },
+ { { { 8, 0, 1 }, { 1, 22, 0 } } },
+ { { { 8, 0, 0 }, { 0, 24, 0 } } },
+ { { { 8, 0, 1 }, { 0, 25, 1 } } },
+ { { { 8, 0, 2 }, { 0, 25, 0 } } },
+ { { { 8, 0, 3 }, { 0, 25, 1 } } },
+ { { { 8, 0, 4 }, { 0, 26, 1 } } },
+ { { { 9, 0, 3 }, { 0, 26, 0 } } },
+ { { { 9, 0, 2 }, { 2, 23, 1 } } },
+ { { { 9, 0, 1 }, { 2, 23, 0 } } },
+ { { { 9, 0, 0 }, { 0, 27, 0 } } },
+ { { { 9, 0, 1 }, { 1, 26, 1 } } },
+ { { { 9, 0, 2 }, { 1, 26, 0 } } },
+ { { { 9, 0, 3 }, { 0, 28, 0 } } },
+ { { { 9, 0, 4 }, { 0, 29, 1 } } },
+ { { { 10, 0, 3 }, { 0, 29, 0 } } },
+ { { { 10, 0, 2 }, { 0, 29, 1 } } },
+ { { { 10, 0, 1 }, { 0, 30, 1 } } },
+ { { { 10, 0, 0 }, { 0, 30, 0 } } },
+ { { { 10, 0, 1 }, { 2, 27, 1 } } },
+ { { { 10, 0, 2 }, { 2, 27, 0 } } },
+ { { { 10, 0, 3 }, { 0, 31, 0 } } },
+ { { { 10, 0, 4 }, { 1, 30, 1 } } },
+ { { { 11, 0, 3 }, { 1, 30, 0 } } },
+ { { { 11, 0, 2 }, { 4, 24, 0 } } },
+ { { { 11, 0, 1 }, { 1, 31, 1 } } },
+ { { { 11, 0, 0 }, { 1, 31, 0 } } },
+ { { { 11, 0, 1 }, { 1, 31, 1 } } },
+ { { { 11, 0, 2 }, { 2, 30, 1 } } },
+ { { { 11, 0, 3 }, { 2, 30, 0 } } },
+ { { { 11, 0, 4 }, { 2, 31, 1 } } },
+ { { { 12, 0, 4 }, { 2, 31, 0 } } },
+ { { { 12, 0, 3 }, { 4, 27, 0 } } },
+ { { { 12, 0, 2 }, { 3, 30, 1 } } },
+ { { { 12, 0, 1 }, { 3, 30, 0 } } },
+ { { { 12, 0, 0 }, { 4, 28, 0 } } },
+ { { { 12, 0, 1 }, { 3, 31, 1 } } },
+ { { { 12, 0, 2 }, { 3, 31, 0 } } },
+ { { { 12, 0, 3 }, { 3, 31, 1 } } },
+ { { { 12, 0, 4 }, { 4, 30, 1 } } },
+ { { { 13, 0, 3 }, { 4, 30, 0 } } },
+ { { { 13, 0, 2 }, { 6, 27, 1 } } },
+ { { { 13, 0, 1 }, { 6, 27, 0 } } },
+ { { { 13, 0, 0 }, { 4, 31, 0 } } },
+ { { { 13, 0, 1 }, { 5, 30, 1 } } },
+ { { { 13, 0, 2 }, { 5, 30, 0 } } },
+ { { { 13, 0, 3 }, { 8, 24, 0 } } },
+ { { { 13, 0, 4 }, { 5, 31, 1 } } },
+ { { { 14, 0, 3 }, { 5, 31, 0 } } },
+ { { { 14, 0, 2 }, { 5, 31, 1 } } },
+ { { { 14, 0, 1 }, { 6, 30, 1 } } },
+ { { { 14, 0, 0 }, { 6, 30, 0 } } },
+ { { { 14, 0, 1 }, { 6, 31, 1 } } },
+ { { { 14, 0, 2 }, { 6, 31, 0 } } },
+ { { { 14, 0, 3 }, { 8, 27, 0 } } },
+ { { { 14, 0, 4 }, { 7, 30, 1 } } },
+ { { { 15, 0, 3 }, { 7, 30, 0 } } },
+ { { { 15, 0, 2 }, { 8, 28, 0 } } },
+ { { { 15, 0, 1 }, { 7, 31, 1 } } },
+ { { { 15, 0, 0 }, { 7, 31, 0 } } },
+ { { { 15, 0, 1 }, { 7, 31, 1 } } },
+ { { { 15, 0, 2 }, { 8, 30, 1 } } },
+ { { { 15, 0, 3 }, { 8, 30, 0 } } },
+ { { { 15, 0, 4 }, { 10, 27, 1 } } },
+ { { { 16, 0, 4 }, { 10, 27, 0 } } },
+ { { { 16, 0, 3 }, { 8, 31, 0 } } },
+ { { { 16, 0, 2 }, { 9, 30, 1 } } },
+ { { { 16, 0, 1 }, { 9, 30, 0 } } },
+ { { { 16, 0, 0 }, { 12, 24, 0 } } },
+ { { { 16, 0, 1 }, { 9, 31, 1 } } },
+ { { { 16, 0, 2 }, { 9, 31, 0 } } },
+ { { { 16, 0, 3 }, { 9, 31, 1 } } },
+ { { { 16, 0, 4 }, { 10, 30, 1 } } },
+ { { { 17, 0, 3 }, { 10, 30, 0 } } },
+ { { { 17, 0, 2 }, { 10, 31, 1 } } },
+ { { { 17, 0, 1 }, { 10, 31, 0 } } },
+ { { { 17, 0, 0 }, { 12, 27, 0 } } },
+ { { { 17, 0, 1 }, { 11, 30, 1 } } },
+ { { { 17, 0, 2 }, { 11, 30, 0 } } },
+ { { { 17, 0, 3 }, { 12, 28, 0 } } },
+ { { { 17, 0, 4 }, { 11, 31, 1 } } },
+ { { { 18, 0, 3 }, { 11, 31, 0 } } },
+ { { { 18, 0, 2 }, { 11, 31, 1 } } },
+ { { { 18, 0, 1 }, { 12, 30, 1 } } },
+ { { { 18, 0, 0 }, { 12, 30, 0 } } },
+ { { { 18, 0, 1 }, { 14, 27, 1 } } },
+ { { { 18, 0, 2 }, { 14, 27, 0 } } },
+ { { { 18, 0, 3 }, { 12, 31, 0 } } },
+ { { { 18, 0, 4 }, { 13, 30, 1 } } },
+ { { { 19, 0, 3 }, { 13, 30, 0 } } },
+ { { { 19, 0, 2 }, { 16, 24, 0 } } },
+ { { { 19, 0, 1 }, { 13, 31, 1 } } },
+ { { { 19, 0, 0 }, { 13, 31, 0 } } },
+ { { { 19, 0, 1 }, { 13, 31, 1 } } },
+ { { { 19, 0, 2 }, { 14, 30, 1 } } },
+ { { { 19, 0, 3 }, { 14, 30, 0 } } },
+ { { { 19, 0, 4 }, { 14, 31, 1 } } },
+ { { { 20, 0, 4 }, { 14, 31, 0 } } },
+ { { { 20, 0, 3 }, { 16, 27, 0 } } },
+ { { { 20, 0, 2 }, { 15, 30, 1 } } },
+ { { { 20, 0, 1 }, { 15, 30, 0 } } },
+ { { { 20, 0, 0 }, { 16, 28, 0 } } },
+ { { { 20, 0, 1 }, { 15, 31, 1 } } },
+ { { { 20, 0, 2 }, { 15, 31, 0 } } },
+ { { { 20, 0, 3 }, { 15, 31, 1 } } },
+ { { { 20, 0, 4 }, { 16, 30, 1 } } },
+ { { { 21, 0, 3 }, { 16, 30, 0 } } },
+ { { { 21, 0, 2 }, { 18, 27, 1 } } },
+ { { { 21, 0, 1 }, { 18, 27, 0 } } },
+ { { { 21, 0, 0 }, { 16, 31, 0 } } },
+ { { { 21, 0, 1 }, { 17, 30, 1 } } },
+ { { { 21, 0, 2 }, { 17, 30, 0 } } },
+ { { { 21, 0, 3 }, { 20, 24, 0 } } },
+ { { { 21, 0, 4 }, { 17, 31, 1 } } },
+ { { { 22, 0, 3 }, { 17, 31, 0 } } },
+ { { { 22, 0, 2 }, { 17, 31, 1 } } },
+ { { { 22, 0, 1 }, { 18, 30, 1 } } },
+ { { { 22, 0, 0 }, { 18, 30, 0 } } },
+ { { { 22, 0, 1 }, { 18, 31, 1 } } },
+ { { { 22, 0, 2 }, { 18, 31, 0 } } },
+ { { { 22, 0, 3 }, { 20, 27, 0 } } },
+ { { { 22, 0, 4 }, { 19, 30, 1 } } },
+ { { { 23, 0, 3 }, { 19, 30, 0 } } },
+ { { { 23, 0, 2 }, { 20, 28, 0 } } },
+ { { { 23, 0, 1 }, { 19, 31, 1 } } },
+ { { { 23, 0, 0 }, { 19, 31, 0 } } },
+ { { { 23, 0, 1 }, { 19, 31, 1 } } },
+ { { { 23, 0, 2 }, { 20, 30, 1 } } },
+ { { { 23, 0, 3 }, { 20, 30, 0 } } },
+ { { { 23, 0, 4 }, { 22, 27, 1 } } },
+ { { { 24, 0, 4 }, { 22, 27, 0 } } },
+ { { { 24, 0, 3 }, { 20, 31, 0 } } },
+ { { { 24, 0, 2 }, { 21, 30, 1 } } },
+ { { { 24, 0, 1 }, { 21, 30, 0 } } },
+ { { { 24, 0, 0 }, { 24, 24, 0 } } },
+ { { { 24, 0, 1 }, { 21, 31, 1 } } },
+ { { { 24, 0, 2 }, { 21, 31, 0 } } },
+ { { { 24, 0, 3 }, { 21, 31, 1 } } },
+ { { { 24, 0, 4 }, { 22, 30, 1 } } },
+ { { { 25, 0, 3 }, { 22, 30, 0 } } },
+ { { { 25, 0, 2 }, { 22, 31, 1 } } },
+ { { { 25, 0, 1 }, { 22, 31, 0 } } },
+ { { { 25, 0, 0 }, { 24, 27, 0 } } },
+ { { { 25, 0, 1 }, { 23, 30, 1 } } },
+ { { { 25, 0, 2 }, { 23, 30, 0 } } },
+ { { { 25, 0, 3 }, { 24, 28, 0 } } },
+ { { { 25, 0, 4 }, { 23, 31, 1 } } },
+ { { { 26, 0, 3 }, { 23, 31, 0 } } },
+ { { { 26, 0, 2 }, { 23, 31, 1 } } },
+ { { { 26, 0, 1 }, { 24, 30, 1 } } },
+ { { { 26, 0, 0 }, { 24, 30, 0 } } },
+ { { { 26, 0, 1 }, { 26, 27, 1 } } },
+ { { { 26, 0, 2 }, { 26, 27, 0 } } },
+ { { { 26, 0, 3 }, { 24, 31, 0 } } },
+ { { { 26, 0, 4 }, { 25, 30, 1 } } },
+ { { { 27, 0, 3 }, { 25, 30, 0 } } },
+ { { { 27, 0, 2 }, { 28, 24, 0 } } },
+ { { { 27, 0, 1 }, { 25, 31, 1 } } },
+ { { { 27, 0, 0 }, { 25, 31, 0 } } },
+ { { { 27, 0, 1 }, { 25, 31, 1 } } },
+ { { { 27, 0, 2 }, { 26, 30, 1 } } },
+ { { { 27, 0, 3 }, { 26, 30, 0 } } },
+ { { { 27, 0, 4 }, { 26, 31, 1 } } },
+ { { { 28, 0, 4 }, { 26, 31, 0 } } },
+ { { { 28, 0, 3 }, { 28, 27, 0 } } },
+ { { { 28, 0, 2 }, { 27, 30, 1 } } },
+ { { { 28, 0, 1 }, { 27, 30, 0 } } },
+ { { { 28, 0, 0 }, { 28, 28, 0 } } },
+ { { { 28, 0, 1 }, { 27, 31, 1 } } },
+ { { { 28, 0, 2 }, { 27, 31, 0 } } },
+ { { { 28, 0, 3 }, { 27, 31, 1 } } },
+ { { { 28, 0, 4 }, { 28, 30, 1 } } },
+ { { { 29, 0, 3 }, { 28, 30, 0 } } },
+ { { { 29, 0, 2 }, { 30, 27, 1 } } },
+ { { { 29, 0, 1 }, { 30, 27, 0 } } },
+ { { { 29, 0, 0 }, { 28, 31, 0 } } },
+ { { { 29, 0, 1 }, { 29, 30, 1 } } },
+ { { { 29, 0, 2 }, { 29, 30, 0 } } },
+ { { { 29, 0, 3 }, { 29, 30, 1 } } },
+ { { { 29, 0, 4 }, { 29, 31, 1 } } },
+ { { { 30, 0, 3 }, { 29, 31, 0 } } },
+ { { { 30, 0, 2 }, { 29, 31, 1 } } },
+ { { { 30, 0, 1 }, { 30, 30, 1 } } },
+ { { { 30, 0, 0 }, { 30, 30, 0 } } },
+ { { { 30, 0, 1 }, { 30, 31, 1 } } },
+ { { { 30, 0, 2 }, { 30, 31, 0 } } },
+ { { { 30, 0, 3 }, { 30, 31, 1 } } },
+ { { { 30, 0, 4 }, { 31, 30, 1 } } },
+ { { { 31, 0, 3 }, { 31, 30, 0 } } },
+ { { { 31, 0, 2 }, { 31, 30, 1 } } },
+ { { { 31, 0, 1 }, { 31, 31, 1 } } },
+ { { { 31, 0, 0 }, { 31, 31, 0 } } }
+};
+
+static SingleColourLookup const lookup_6_4[] =
+{
+ { { { 0, 0, 0 }, { 0, 0, 0 } } },
+ { { { 0, 0, 1 }, { 0, 1, 0 } } },
+ { { { 0, 0, 2 }, { 0, 2, 0 } } },
+ { { { 1, 0, 1 }, { 0, 3, 1 } } },
+ { { { 1, 0, 0 }, { 0, 3, 0 } } },
+ { { { 1, 0, 1 }, { 0, 4, 0 } } },
+ { { { 1, 0, 2 }, { 0, 5, 0 } } },
+ { { { 2, 0, 1 }, { 0, 6, 1 } } },
+ { { { 2, 0, 0 }, { 0, 6, 0 } } },
+ { { { 2, 0, 1 }, { 0, 7, 0 } } },
+ { { { 2, 0, 2 }, { 0, 8, 0 } } },
+ { { { 3, 0, 1 }, { 0, 9, 1 } } },
+ { { { 3, 0, 0 }, { 0, 9, 0 } } },
+ { { { 3, 0, 1 }, { 0, 10, 0 } } },
+ { { { 3, 0, 2 }, { 0, 11, 0 } } },
+ { { { 4, 0, 1 }, { 0, 12, 1 } } },
+ { { { 4, 0, 0 }, { 0, 12, 0 } } },
+ { { { 4, 0, 1 }, { 0, 13, 0 } } },
+ { { { 4, 0, 2 }, { 0, 14, 0 } } },
+ { { { 5, 0, 1 }, { 0, 15, 1 } } },
+ { { { 5, 0, 0 }, { 0, 15, 0 } } },
+ { { { 5, 0, 1 }, { 0, 16, 0 } } },
+ { { { 5, 0, 2 }, { 1, 15, 0 } } },
+ { { { 6, 0, 1 }, { 0, 17, 0 } } },
+ { { { 6, 0, 0 }, { 0, 18, 0 } } },
+ { { { 6, 0, 1 }, { 0, 19, 0 } } },
+ { { { 6, 0, 2 }, { 3, 14, 0 } } },
+ { { { 7, 0, 1 }, { 0, 20, 0 } } },
+ { { { 7, 0, 0 }, { 0, 21, 0 } } },
+ { { { 7, 0, 1 }, { 0, 22, 0 } } },
+ { { { 7, 0, 2 }, { 4, 15, 0 } } },
+ { { { 8, 0, 1 }, { 0, 23, 0 } } },
+ { { { 8, 0, 0 }, { 0, 24, 0 } } },
+ { { { 8, 0, 1 }, { 0, 25, 0 } } },
+ { { { 8, 0, 2 }, { 6, 14, 0 } } },
+ { { { 9, 0, 1 }, { 0, 26, 0 } } },
+ { { { 9, 0, 0 }, { 0, 27, 0 } } },
+ { { { 9, 0, 1 }, { 0, 28, 0 } } },
+ { { { 9, 0, 2 }, { 7, 15, 0 } } },
+ { { { 10, 0, 1 }, { 0, 29, 0 } } },
+ { { { 10, 0, 0 }, { 0, 30, 0 } } },
+ { { { 10, 0, 1 }, { 0, 31, 0 } } },
+ { { { 10, 0, 2 }, { 9, 14, 0 } } },
+ { { { 11, 0, 1 }, { 0, 32, 0 } } },
+ { { { 11, 0, 0 }, { 0, 33, 0 } } },
+ { { { 11, 0, 1 }, { 2, 30, 0 } } },
+ { { { 11, 0, 2 }, { 0, 34, 0 } } },
+ { { { 12, 0, 1 }, { 0, 35, 0 } } },
+ { { { 12, 0, 0 }, { 0, 36, 0 } } },
+ { { { 12, 0, 1 }, { 3, 31, 0 } } },
+ { { { 12, 0, 2 }, { 0, 37, 0 } } },
+ { { { 13, 0, 1 }, { 0, 38, 0 } } },
+ { { { 13, 0, 0 }, { 0, 39, 0 } } },
+ { { { 13, 0, 1 }, { 5, 30, 0 } } },
+ { { { 13, 0, 2 }, { 0, 40, 0 } } },
+ { { { 14, 0, 1 }, { 0, 41, 0 } } },
+ { { { 14, 0, 0 }, { 0, 42, 0 } } },
+ { { { 14, 0, 1 }, { 6, 31, 0 } } },
+ { { { 14, 0, 2 }, { 0, 43, 0 } } },
+ { { { 15, 0, 1 }, { 0, 44, 0 } } },
+ { { { 15, 0, 0 }, { 0, 45, 0 } } },
+ { { { 15, 0, 1 }, { 8, 30, 0 } } },
+ { { { 15, 0, 2 }, { 0, 46, 0 } } },
+ { { { 16, 0, 2 }, { 0, 47, 0 } } },
+ { { { 16, 0, 1 }, { 1, 46, 0 } } },
+ { { { 16, 0, 0 }, { 0, 48, 0 } } },
+ { { { 16, 0, 1 }, { 0, 49, 0 } } },
+ { { { 16, 0, 2 }, { 0, 50, 0 } } },
+ { { { 17, 0, 1 }, { 2, 47, 0 } } },
+ { { { 17, 0, 0 }, { 0, 51, 0 } } },
+ { { { 17, 0, 1 }, { 0, 52, 0 } } },
+ { { { 17, 0, 2 }, { 0, 53, 0 } } },
+ { { { 18, 0, 1 }, { 4, 46, 0 } } },
+ { { { 18, 0, 0 }, { 0, 54, 0 } } },
+ { { { 18, 0, 1 }, { 0, 55, 0 } } },
+ { { { 18, 0, 2 }, { 0, 56, 0 } } },
+ { { { 19, 0, 1 }, { 5, 47, 0 } } },
+ { { { 19, 0, 0 }, { 0, 57, 0 } } },
+ { { { 19, 0, 1 }, { 0, 58, 0 } } },
+ { { { 19, 0, 2 }, { 0, 59, 0 } } },
+ { { { 20, 0, 1 }, { 7, 46, 0 } } },
+ { { { 20, 0, 0 }, { 0, 60, 0 } } },
+ { { { 20, 0, 1 }, { 0, 61, 0 } } },
+ { { { 20, 0, 2 }, { 0, 62, 0 } } },
+ { { { 21, 0, 1 }, { 8, 47, 0 } } },
+ { { { 21, 0, 0 }, { 0, 63, 0 } } },
+ { { { 21, 0, 1 }, { 1, 62, 0 } } },
+ { { { 21, 0, 2 }, { 1, 63, 0 } } },
+ { { { 22, 0, 1 }, { 10, 46, 0 } } },
+ { { { 22, 0, 0 }, { 2, 62, 0 } } },
+ { { { 22, 0, 1 }, { 2, 63, 0 } } },
+ { { { 22, 0, 2 }, { 3, 62, 0 } } },
+ { { { 23, 0, 1 }, { 11, 47, 0 } } },
+ { { { 23, 0, 0 }, { 3, 63, 0 } } },
+ { { { 23, 0, 1 }, { 4, 62, 0 } } },
+ { { { 23, 0, 2 }, { 4, 63, 0 } } },
+ { { { 24, 0, 1 }, { 13, 46, 0 } } },
+ { { { 24, 0, 0 }, { 5, 62, 0 } } },
+ { { { 24, 0, 1 }, { 5, 63, 0 } } },
+ { { { 24, 0, 2 }, { 6, 62, 0 } } },
+ { { { 25, 0, 1 }, { 14, 47, 0 } } },
+ { { { 25, 0, 0 }, { 6, 63, 0 } } },
+ { { { 25, 0, 1 }, { 7, 62, 0 } } },
+ { { { 25, 0, 2 }, { 7, 63, 0 } } },
+ { { { 26, 0, 1 }, { 16, 45, 0 } } },
+ { { { 26, 0, 0 }, { 8, 62, 0 } } },
+ { { { 26, 0, 1 }, { 8, 63, 0 } } },
+ { { { 26, 0, 2 }, { 9, 62, 0 } } },
+ { { { 27, 0, 1 }, { 16, 48, 0 } } },
+ { { { 27, 0, 0 }, { 9, 63, 0 } } },
+ { { { 27, 0, 1 }, { 10, 62, 0 } } },
+ { { { 27, 0, 2 }, { 10, 63, 0 } } },
+ { { { 28, 0, 1 }, { 16, 51, 0 } } },
+ { { { 28, 0, 0 }, { 11, 62, 0 } } },
+ { { { 28, 0, 1 }, { 11, 63, 0 } } },
+ { { { 28, 0, 2 }, { 12, 62, 0 } } },
+ { { { 29, 0, 1 }, { 16, 54, 0 } } },
+ { { { 29, 0, 0 }, { 12, 63, 0 } } },
+ { { { 29, 0, 1 }, { 13, 62, 0 } } },
+ { { { 29, 0, 2 }, { 13, 63, 0 } } },
+ { { { 30, 0, 1 }, { 16, 57, 0 } } },
+ { { { 30, 0, 0 }, { 14, 62, 0 } } },
+ { { { 30, 0, 1 }, { 14, 63, 0 } } },
+ { { { 30, 0, 2 }, { 15, 62, 0 } } },
+ { { { 31, 0, 1 }, { 16, 60, 0 } } },
+ { { { 31, 0, 0 }, { 15, 63, 0 } } },
+ { { { 31, 0, 1 }, { 24, 46, 0 } } },
+ { { { 31, 0, 2 }, { 16, 62, 0 } } },
+ { { { 32, 0, 2 }, { 16, 63, 0 } } },
+ { { { 32, 0, 1 }, { 17, 62, 0 } } },
+ { { { 32, 0, 0 }, { 25, 47, 0 } } },
+ { { { 32, 0, 1 }, { 17, 63, 0 } } },
+ { { { 32, 0, 2 }, { 18, 62, 0 } } },
+ { { { 33, 0, 1 }, { 18, 63, 0 } } },
+ { { { 33, 0, 0 }, { 27, 46, 0 } } },
+ { { { 33, 0, 1 }, { 19, 62, 0 } } },
+ { { { 33, 0, 2 }, { 19, 63, 0 } } },
+ { { { 34, 0, 1 }, { 20, 62, 0 } } },
+ { { { 34, 0, 0 }, { 28, 47, 0 } } },
+ { { { 34, 0, 1 }, { 20, 63, 0 } } },
+ { { { 34, 0, 2 }, { 21, 62, 0 } } },
+ { { { 35, 0, 1 }, { 21, 63, 0 } } },
+ { { { 35, 0, 0 }, { 30, 46, 0 } } },
+ { { { 35, 0, 1 }, { 22, 62, 0 } } },
+ { { { 35, 0, 2 }, { 22, 63, 0 } } },
+ { { { 36, 0, 1 }, { 23, 62, 0 } } },
+ { { { 36, 0, 0 }, { 31, 47, 0 } } },
+ { { { 36, 0, 1 }, { 23, 63, 0 } } },
+ { { { 36, 0, 2 }, { 24, 62, 0 } } },
+ { { { 37, 0, 1 }, { 24, 63, 0 } } },
+ { { { 37, 0, 0 }, { 32, 47, 0 } } },
+ { { { 37, 0, 1 }, { 25, 62, 0 } } },
+ { { { 37, 0, 2 }, { 25, 63, 0 } } },
+ { { { 38, 0, 1 }, { 26, 62, 0 } } },
+ { { { 38, 0, 0 }, { 32, 50, 0 } } },
+ { { { 38, 0, 1 }, { 26, 63, 0 } } },
+ { { { 38, 0, 2 }, { 27, 62, 0 } } },
+ { { { 39, 0, 1 }, { 27, 63, 0 } } },
+ { { { 39, 0, 0 }, { 32, 53, 0 } } },
+ { { { 39, 0, 1 }, { 28, 62, 0 } } },
+ { { { 39, 0, 2 }, { 28, 63, 0 } } },
+ { { { 40, 0, 1 }, { 29, 62, 0 } } },
+ { { { 40, 0, 0 }, { 32, 56, 0 } } },
+ { { { 40, 0, 1 }, { 29, 63, 0 } } },
+ { { { 40, 0, 2 }, { 30, 62, 0 } } },
+ { { { 41, 0, 1 }, { 30, 63, 0 } } },
+ { { { 41, 0, 0 }, { 32, 59, 0 } } },
+ { { { 41, 0, 1 }, { 31, 62, 0 } } },
+ { { { 41, 0, 2 }, { 31, 63, 0 } } },
+ { { { 42, 0, 1 }, { 32, 61, 0 } } },
+ { { { 42, 0, 0 }, { 32, 62, 0 } } },
+ { { { 42, 0, 1 }, { 32, 63, 0 } } },
+ { { { 42, 0, 2 }, { 41, 46, 0 } } },
+ { { { 43, 0, 1 }, { 33, 62, 0 } } },
+ { { { 43, 0, 0 }, { 33, 63, 0 } } },
+ { { { 43, 0, 1 }, { 34, 62, 0 } } },
+ { { { 43, 0, 2 }, { 42, 47, 0 } } },
+ { { { 44, 0, 1 }, { 34, 63, 0 } } },
+ { { { 44, 0, 0 }, { 35, 62, 0 } } },
+ { { { 44, 0, 1 }, { 35, 63, 0 } } },
+ { { { 44, 0, 2 }, { 44, 46, 0 } } },
+ { { { 45, 0, 1 }, { 36, 62, 0 } } },
+ { { { 45, 0, 0 }, { 36, 63, 0 } } },
+ { { { 45, 0, 1 }, { 37, 62, 0 } } },
+ { { { 45, 0, 2 }, { 45, 47, 0 } } },
+ { { { 46, 0, 1 }, { 37, 63, 0 } } },
+ { { { 46, 0, 0 }, { 38, 62, 0 } } },
+ { { { 46, 0, 1 }, { 38, 63, 0 } } },
+ { { { 46, 0, 2 }, { 47, 46, 0 } } },
+ { { { 47, 0, 1 }, { 39, 62, 0 } } },
+ { { { 47, 0, 0 }, { 39, 63, 0 } } },
+ { { { 47, 0, 1 }, { 40, 62, 0 } } },
+ { { { 47, 0, 2 }, { 48, 46, 0 } } },
+ { { { 48, 0, 2 }, { 40, 63, 0 } } },
+ { { { 48, 0, 1 }, { 41, 62, 0 } } },
+ { { { 48, 0, 0 }, { 41, 63, 0 } } },
+ { { { 48, 0, 1 }, { 48, 49, 0 } } },
+ { { { 48, 0, 2 }, { 42, 62, 0 } } },
+ { { { 49, 0, 1 }, { 42, 63, 0 } } },
+ { { { 49, 0, 0 }, { 43, 62, 0 } } },
+ { { { 49, 0, 1 }, { 48, 52, 0 } } },
+ { { { 49, 0, 2 }, { 43, 63, 0 } } },
+ { { { 50, 0, 1 }, { 44, 62, 0 } } },
+ { { { 50, 0, 0 }, { 44, 63, 0 } } },
+ { { { 50, 0, 1 }, { 48, 55, 0 } } },
+ { { { 50, 0, 2 }, { 45, 62, 0 } } },
+ { { { 51, 0, 1 }, { 45, 63, 0 } } },
+ { { { 51, 0, 0 }, { 46, 62, 0 } } },
+ { { { 51, 0, 1 }, { 48, 58, 0 } } },
+ { { { 51, 0, 2 }, { 46, 63, 0 } } },
+ { { { 52, 0, 1 }, { 47, 62, 0 } } },
+ { { { 52, 0, 0 }, { 47, 63, 0 } } },
+ { { { 52, 0, 1 }, { 48, 61, 0 } } },
+ { { { 52, 0, 2 }, { 48, 62, 0 } } },
+ { { { 53, 0, 1 }, { 56, 47, 0 } } },
+ { { { 53, 0, 0 }, { 48, 63, 0 } } },
+ { { { 53, 0, 1 }, { 49, 62, 0 } } },
+ { { { 53, 0, 2 }, { 49, 63, 0 } } },
+ { { { 54, 0, 1 }, { 58, 46, 0 } } },
+ { { { 54, 0, 0 }, { 50, 62, 0 } } },
+ { { { 54, 0, 1 }, { 50, 63, 0 } } },
+ { { { 54, 0, 2 }, { 51, 62, 0 } } },
+ { { { 55, 0, 1 }, { 59, 47, 0 } } },
+ { { { 55, 0, 0 }, { 51, 63, 0 } } },
+ { { { 55, 0, 1 }, { 52, 62, 0 } } },
+ { { { 55, 0, 2 }, { 52, 63, 0 } } },
+ { { { 56, 0, 1 }, { 61, 46, 0 } } },
+ { { { 56, 0, 0 }, { 53, 62, 0 } } },
+ { { { 56, 0, 1 }, { 53, 63, 0 } } },
+ { { { 56, 0, 2 }, { 54, 62, 0 } } },
+ { { { 57, 0, 1 }, { 62, 47, 0 } } },
+ { { { 57, 0, 0 }, { 54, 63, 0 } } },
+ { { { 57, 0, 1 }, { 55, 62, 0 } } },
+ { { { 57, 0, 2 }, { 55, 63, 0 } } },
+ { { { 58, 0, 1 }, { 56, 62, 1 } } },
+ { { { 58, 0, 0 }, { 56, 62, 0 } } },
+ { { { 58, 0, 1 }, { 56, 63, 0 } } },
+ { { { 58, 0, 2 }, { 57, 62, 0 } } },
+ { { { 59, 0, 1 }, { 57, 63, 1 } } },
+ { { { 59, 0, 0 }, { 57, 63, 0 } } },
+ { { { 59, 0, 1 }, { 58, 62, 0 } } },
+ { { { 59, 0, 2 }, { 58, 63, 0 } } },
+ { { { 60, 0, 1 }, { 59, 62, 1 } } },
+ { { { 60, 0, 0 }, { 59, 62, 0 } } },
+ { { { 60, 0, 1 }, { 59, 63, 0 } } },
+ { { { 60, 0, 2 }, { 60, 62, 0 } } },
+ { { { 61, 0, 1 }, { 60, 63, 1 } } },
+ { { { 61, 0, 0 }, { 60, 63, 0 } } },
+ { { { 61, 0, 1 }, { 61, 62, 0 } } },
+ { { { 61, 0, 2 }, { 61, 63, 0 } } },
+ { { { 62, 0, 1 }, { 62, 62, 1 } } },
+ { { { 62, 0, 0 }, { 62, 62, 0 } } },
+ { { { 62, 0, 1 }, { 62, 63, 0 } } },
+ { { { 62, 0, 2 }, { 63, 62, 0 } } },
+ { { { 63, 0, 1 }, { 63, 63, 1 } } },
+ { { { 63, 0, 0 }, { 63, 63, 0 } } }
+};
diff --git a/3rdparty/bgfx/3rdparty/libsquish/squish.cpp b/3rdparty/bgfx/3rdparty/libsquish/squish.cpp
new file mode 100644
index 00000000000..cd91f874646
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/libsquish/squish.cpp
@@ -0,0 +1,260 @@
+/* -----------------------------------------------------------------------------
+
+ Copyright (c) 2006 Simon Brown si@sjbrown.co.uk
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ -------------------------------------------------------------------------- */
+
+#include "squish.h"
+#include "colourset.h"
+#include "maths.h"
+#include "rangefit.h"
+#include "clusterfit.h"
+#include "colourblock.h"
+#include "alpha.h"
+#include "singlecolourfit.h"
+
+namespace squish {
+
+static int FixFlags( int flags )
+{
+ // grab the flag bits
+ int method = flags & ( kDxt1 | kDxt3 | kDxt5 | kBc4 | kBc5 );
+ int fit = flags & ( kColourIterativeClusterFit | kColourClusterFit | kColourRangeFit );
+ int extra = flags & kWeightColourByAlpha;
+
+ // set defaults
+ if ( method != kDxt3
+ && method != kDxt5
+ && method != kBc4
+ && method != kBc5 )
+ {
+ method = kDxt1;
+ }
+ if( fit != kColourRangeFit && fit != kColourIterativeClusterFit )
+ fit = kColourClusterFit;
+
+ // done
+ return method | fit | extra;
+}
+
+void CompressMasked( u8 const* rgba, int mask, void* block, int flags, float* metric )
+{
+ // fix any bad flags
+ flags = FixFlags( flags );
+
+ if ( ( flags & ( kBc4 | kBc5 ) ) != 0 )
+ {
+ u8 alpha[16*4];
+ for( int i = 0; i < 16; ++i )
+ {
+ alpha[i*4 + 3] = rgba[i*4 + 0]; // copy R to A
+ }
+
+ u8* rBlock = reinterpret_cast< u8* >( block );
+ CompressAlphaDxt5( alpha, mask, rBlock );
+
+ if ( ( flags & ( kBc5 ) ) != 0 )
+ {
+ for( int i = 0; i < 16; ++i )
+ {
+ alpha[i*4 + 3] = rgba[i*4 + 1]; // copy G to A
+ }
+
+ u8* gBlock = reinterpret_cast< u8* >( block ) + 8;
+ CompressAlphaDxt5( alpha, mask, gBlock );
+ }
+
+ return;
+ }
+
+ // get the block locations
+ void* colourBlock = block;
+ void* alphaBlock = block;
+ if( ( flags & ( kDxt3 | kDxt5 ) ) != 0 )
+ colourBlock = reinterpret_cast< u8* >( block ) + 8;
+
+ // create the minimal point set
+ ColourSet colours( rgba, mask, flags );
+
+ // check the compression type and compress colour
+ if( colours.GetCount() == 1 )
+ {
+ // always do a single colour fit
+ SingleColourFit fit( &colours, flags );
+ fit.Compress( colourBlock );
+ }
+ else if( ( flags & kColourRangeFit ) != 0 || colours.GetCount() == 0 )
+ {
+ // do a range fit
+ RangeFit fit( &colours, flags, metric );
+ fit.Compress( colourBlock );
+ }
+ else
+ {
+ // default to a cluster fit (could be iterative or not)
+ ClusterFit fit( &colours, flags, metric );
+ fit.Compress( colourBlock );
+ }
+
+ // compress alpha separately if necessary
+ if( ( flags & kDxt3 ) != 0 )
+ CompressAlphaDxt3( rgba, mask, alphaBlock );
+ else if( ( flags & kDxt5 ) != 0 )
+ CompressAlphaDxt5( rgba, mask, alphaBlock );
+}
+
+void Decompress( u8* rgba, void const* block, int flags )
+{
+ // fix any bad flags
+ flags = FixFlags( flags );
+
+ // get the block locations
+ void const* colourBlock = block;
+ void const* alphaBock = block;
+ if( ( flags & ( kDxt3 | kDxt5 ) ) != 0 )
+ colourBlock = reinterpret_cast< u8 const* >( block ) + 8;
+
+ // decompress colour
+ DecompressColour( rgba, colourBlock, ( flags & kDxt1 ) != 0 );
+
+ // decompress alpha separately if necessary
+ if( ( flags & kDxt3 ) != 0 )
+ DecompressAlphaDxt3( rgba, alphaBock );
+ else if( ( flags & kDxt5 ) != 0 )
+ DecompressAlphaDxt5( rgba, alphaBock );
+}
+
+int GetStorageRequirements( int width, int height, int flags )
+{
+ // fix any bad flags
+ flags = FixFlags( flags );
+
+ // compute the storage requirements
+ int blockcount = ( ( width + 3 )/4 ) * ( ( height + 3 )/4 );
+ int blocksize = ( ( flags & ( kDxt1 | kBc4 ) ) != 0 ) ? 8 : 16;
+ return blockcount*blocksize;
+}
+
+void CompressImage( u8 const* rgba, int width, int height, void* blocks, int flags, float* metric )
+{
+ // fix any bad flags
+ flags = FixFlags( flags );
+
+ // initialise the block output
+ u8* targetBlock = reinterpret_cast< u8* >( blocks );
+ int bytesPerBlock = ( ( flags & ( kDxt1 | kBc4 ) ) != 0 ) ? 8 : 16;
+
+ // loop over blocks
+ for( int y = 0; y < height; y += 4 )
+ {
+ for( int x = 0; x < width; x += 4 )
+ {
+ // build the 4x4 block of pixels
+ u8 sourceRgba[16*4];
+ u8* targetPixel = sourceRgba;
+ int mask = 0;
+ for( int py = 0; py < 4; ++py )
+ {
+ for( int px = 0; px < 4; ++px )
+ {
+ // get the source pixel in the image
+ int sx = x + px;
+ int sy = y + py;
+
+ // enable if we're in the image
+ if( sx < width && sy < height )
+ {
+ // copy the rgba value
+ u8 const* sourcePixel = rgba + 4*( width*sy + sx );
+ for( int i = 0; i < 4; ++i )
+ *targetPixel++ = *sourcePixel++;
+
+ // enable this pixel
+ mask |= ( 1 << ( 4*py + px ) );
+ }
+ else
+ {
+ // skip this pixel as its outside the image
+ targetPixel += 4;
+ }
+ }
+ }
+
+ // compress it into the output
+ CompressMasked( sourceRgba, mask, targetBlock, flags, metric );
+
+ // advance
+ targetBlock += bytesPerBlock;
+ }
+ }
+}
+
+void DecompressImage( u8* rgba, int width, int height, void const* blocks, int flags )
+{
+ // fix any bad flags
+ flags = FixFlags( flags );
+
+ // initialise the block input
+ u8 const* sourceBlock = reinterpret_cast< u8 const* >( blocks );
+ int bytesPerBlock = ( ( flags & ( kDxt1 | kBc4 ) ) != 0 ) ? 8 : 16;
+
+ // loop over blocks
+ for( int y = 0; y < height; y += 4 )
+ {
+ for( int x = 0; x < width; x += 4 )
+ {
+ // decompress the block
+ u8 targetRgba[4*16];
+ Decompress( targetRgba, sourceBlock, flags );
+
+ // write the decompressed pixels to the correct image locations
+ u8 const* sourcePixel = targetRgba;
+ for( int py = 0; py < 4; ++py )
+ {
+ for( int px = 0; px < 4; ++px )
+ {
+ // get the target location
+ int sx = x + px;
+ int sy = y + py;
+ if( sx < width && sy < height )
+ {
+ u8* targetPixel = rgba + 4*( width*sy + sx );
+
+ // copy the rgba value
+ for( int i = 0; i < 4; ++i )
+ *targetPixel++ = *sourcePixel++;
+ }
+ else
+ {
+ // skip this pixel as its outside the image
+ sourcePixel += 4;
+ }
+ }
+ }
+
+ // advance
+ sourceBlock += bytesPerBlock;
+ }
+ }
+}
+
+} // namespace squish
diff --git a/3rdparty/bgfx/3rdparty/libsquish/squish.h b/3rdparty/bgfx/3rdparty/libsquish/squish.h
new file mode 100644
index 00000000000..175375f832b
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/libsquish/squish.h
@@ -0,0 +1,269 @@
+/* -----------------------------------------------------------------------------
+
+ Copyright (c) 2006 Simon Brown si@sjbrown.co.uk
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ -------------------------------------------------------------------------- */
+
+#ifndef SQUISH_H
+#define SQUISH_H
+
+//! All squish API functions live in this namespace.
+namespace squish {
+
+// -----------------------------------------------------------------------------
+
+//! Typedef a quantity that is a single unsigned byte.
+typedef unsigned char u8;
+
+// -----------------------------------------------------------------------------
+
+enum
+{
+ //! Use DXT1 compression.
+ kDxt1 = ( 1 << 0 ),
+
+ //! Use DXT3 compression.
+ kDxt3 = ( 1 << 1 ),
+
+ //! Use DXT5 compression.
+ kDxt5 = ( 1 << 2 ),
+
+ //! Use BC4 compression.
+ kBc4 = ( 1 << 3 ),
+
+ //! Use BC5 compression.
+ kBc5 = ( 1 << 4 ),
+
+ //! Use a slow but high quality colour compressor (the default).
+ kColourClusterFit = ( 1 << 5 ),
+
+ //! Use a fast but low quality colour compressor.
+ kColourRangeFit = ( 1 << 6 ),
+
+ //! Weight the colour by alpha during cluster fit (disabled by default).
+ kWeightColourByAlpha = ( 1 << 7 ),
+
+ //! Use a very slow but very high quality colour compressor.
+ kColourIterativeClusterFit = ( 1 << 8 ),
+};
+
+// -----------------------------------------------------------------------------
+
+/*! @brief Compresses a 4x4 block of pixels.
+
+ @param rgba The rgba values of the 16 source pixels.
+ @param mask The valid pixel mask.
+ @param block Storage for the compressed DXT block.
+ @param flags Compression flags.
+ @param metric An optional perceptual metric.
+
+ The source pixels should be presented as a contiguous array of 16 rgba
+ values, with each component as 1 byte each. In memory this should be:
+
+ { r1, g1, b1, a1, .... , r16, g16, b16, a16 }
+
+ The mask parameter enables only certain pixels within the block. The lowest
+ bit enables the first pixel and so on up to the 16th bit. Bits beyond the
+ 16th bit are ignored. Pixels that are not enabled are allowed to take
+ arbitrary colours in the output block. An example of how this can be used
+ is in the CompressImage function to disable pixels outside the bounds of
+ the image when the width or height is not divisible by 4.
+
+ The flags parameter should specify either kDxt1, kDxt3 or kDxt5 compression,
+ however, DXT1 will be used by default if none is specified. When using DXT1
+ compression, 8 bytes of storage are required for the compressed DXT block.
+ DXT3 and DXT5 compression require 16 bytes of storage per block.
+
+ The flags parameter can also specify a preferred colour compressor to use
+ when fitting the RGB components of the data. Possible colour compressors
+ are: kColourClusterFit (the default), kColourRangeFit (very fast, low
+ quality) or kColourIterativeClusterFit (slowest, best quality).
+
+ When using kColourClusterFit or kColourIterativeClusterFit, an additional
+ flag can be specified to weight the importance of each pixel by its alpha
+ value. For images that are rendered using alpha blending, this can
+ significantly increase the perceived quality.
+
+ The metric parameter can be used to weight the relative importance of each
+ colour channel, or pass NULL to use the default uniform weight of
+ { 1.0f, 1.0f, 1.0f }. This replaces the previous flag-based control that
+ allowed either uniform or "perceptual" weights with the fixed values
+ { 0.2126f, 0.7152f, 0.0722f }. If non-NULL, the metric should point to a
+ contiguous array of 3 floats.
+*/
+void CompressMasked( u8 const* rgba, int mask, void* block, int flags, float* metric = 0 );
+
+// -----------------------------------------------------------------------------
+
+/*! @brief Compresses a 4x4 block of pixels.
+
+ @param rgba The rgba values of the 16 source pixels.
+ @param block Storage for the compressed DXT block.
+ @param flags Compression flags.
+ @param metric An optional perceptual metric.
+
+ The source pixels should be presented as a contiguous array of 16 rgba
+ values, with each component as 1 byte each. In memory this should be:
+
+ { r1, g1, b1, a1, .... , r16, g16, b16, a16 }
+
+ The flags parameter should specify either kDxt1, kDxt3 or kDxt5 compression,
+ however, DXT1 will be used by default if none is specified. When using DXT1
+ compression, 8 bytes of storage are required for the compressed DXT block.
+ DXT3 and DXT5 compression require 16 bytes of storage per block.
+
+ The flags parameter can also specify a preferred colour compressor to use
+ when fitting the RGB components of the data. Possible colour compressors
+ are: kColourClusterFit (the default), kColourRangeFit (very fast, low
+ quality) or kColourIterativeClusterFit (slowest, best quality).
+
+ When using kColourClusterFit or kColourIterativeClusterFit, an additional
+ flag can be specified to weight the importance of each pixel by its alpha
+ value. For images that are rendered using alpha blending, this can
+ significantly increase the perceived quality.
+
+ The metric parameter can be used to weight the relative importance of each
+ colour channel, or pass NULL to use the default uniform weight of
+ { 1.0f, 1.0f, 1.0f }. This replaces the previous flag-based control that
+ allowed either uniform or "perceptual" weights with the fixed values
+ { 0.2126f, 0.7152f, 0.0722f }. If non-NULL, the metric should point to a
+ contiguous array of 3 floats.
+
+ This method is an inline that calls CompressMasked with a mask of 0xffff,
+ provided for compatibility with older versions of squish.
+*/
+inline void Compress( u8 const* rgba, void* block, int flags, float* metric = 0 )
+{
+ CompressMasked( rgba, 0xffff, block, flags, metric );
+}
+
+// -----------------------------------------------------------------------------
+
+/*! @brief Decompresses a 4x4 block of pixels.
+
+ @param rgba Storage for the 16 decompressed pixels.
+ @param block The compressed DXT block.
+ @param flags Compression flags.
+
+ The decompressed pixels will be written as a contiguous array of 16 rgba
+ values, with each component as 1 byte each. In memory this is:
+
+ { r1, g1, b1, a1, .... , r16, g16, b16, a16 }
+
+ The flags parameter should specify either kDxt1, kDxt3 or kDxt5 compression,
+ however, DXT1 will be used by default if none is specified. All other flags
+ are ignored.
+*/
+void Decompress( u8* rgba, void const* block, int flags );
+
+// -----------------------------------------------------------------------------
+
+/*! @brief Computes the amount of compressed storage required.
+
+ @param width The width of the image.
+ @param height The height of the image.
+ @param flags Compression flags.
+
+ The flags parameter should specify either kDxt1, kDxt3 or kDxt5 compression,
+ however, DXT1 will be used by default if none is specified. All other flags
+ are ignored.
+
+ Most DXT images will be a multiple of 4 in each dimension, but this
+ function supports arbitrary size images by allowing the outer blocks to
+ be only partially used.
+*/
+int GetStorageRequirements( int width, int height, int flags );
+
+// -----------------------------------------------------------------------------
+
+/*! @brief Compresses an image in memory.
+
+ @param rgba The pixels of the source.
+ @param width The width of the source image.
+ @param height The height of the source image.
+ @param blocks Storage for the compressed output.
+ @param flags Compression flags.
+ @param metric An optional perceptual metric.
+
+ The source pixels should be presented as a contiguous array of width*height
+ rgba values, with each component as 1 byte each. In memory this should be:
+
+ { r1, g1, b1, a1, .... , rn, gn, bn, an } for n = width*height
+
+ The flags parameter should specify either kDxt1, kDxt3 or kDxt5 compression,
+ however, DXT1 will be used by default if none is specified. When using DXT1
+ compression, 8 bytes of storage are required for each compressed DXT block.
+ DXT3 and DXT5 compression require 16 bytes of storage per block.
+
+ The flags parameter can also specify a preferred colour compressor to use
+ when fitting the RGB components of the data. Possible colour compressors
+ are: kColourClusterFit (the default), kColourRangeFit (very fast, low
+ quality) or kColourIterativeClusterFit (slowest, best quality).
+
+ When using kColourClusterFit or kColourIterativeClusterFit, an additional
+ flag can be specified to weight the importance of each pixel by its alpha
+ value. For images that are rendered using alpha blending, this can
+ significantly increase the perceived quality.
+
+ The metric parameter can be used to weight the relative importance of each
+ colour channel, or pass NULL to use the default uniform weight of
+ { 1.0f, 1.0f, 1.0f }. This replaces the previous flag-based control that
+ allowed either uniform or "perceptual" weights with the fixed values
+ { 0.2126f, 0.7152f, 0.0722f }. If non-NULL, the metric should point to a
+ contiguous array of 3 floats.
+
+ Internally this function calls squish::CompressMasked for each block, which
+ allows for pixels outside the image to take arbitrary values. The function
+ squish::GetStorageRequirements can be called to compute the amount of memory
+ to allocate for the compressed output.
+*/
+void CompressImage( u8 const* rgba, int width, int height, void* blocks, int flags, float* metric = 0 );
+
+// -----------------------------------------------------------------------------
+
+/*! @brief Decompresses an image in memory.
+
+ @param rgba Storage for the decompressed pixels.
+ @param width The width of the source image.
+ @param height The height of the source image.
+ @param blocks The compressed DXT blocks.
+ @param flags Compression flags.
+
+ The decompressed pixels will be written as a contiguous array of width*height
+ 16 rgba values, with each component as 1 byte each. In memory this is:
+
+ { r1, g1, b1, a1, .... , rn, gn, bn, an } for n = width*height
+
+ The flags parameter should specify either kDxt1, kDxt3 or kDxt5 compression,
+ however, DXT1 will be used by default if none is specified. All other flags
+ are ignored.
+
+ Internally this function calls squish::Decompress for each block.
+*/
+void DecompressImage( u8* rgba, int width, int height, void const* blocks, int flags );
+
+// -----------------------------------------------------------------------------
+
+} // namespace squish
+
+#endif // ndef SQUISH_H
+
diff --git a/3rdparty/bgfx/3rdparty/nvtt/NVIDIA_Texture_Tools_LICENSE.txt b/3rdparty/bgfx/3rdparty/nvtt/NVIDIA_Texture_Tools_LICENSE.txt
new file mode 100644
index 00000000000..da5b64215f2
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/nvtt/NVIDIA_Texture_Tools_LICENSE.txt
@@ -0,0 +1,24 @@
+NVIDIA Texture Tools 2.0 is licensed under the MIT license.
+
+Copyright (c) 2007 NVIDIA Corporation
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
diff --git a/3rdparty/bgfx/3rdparty/nvtt/bc6h/bits.h b/3rdparty/bgfx/3rdparty/nvtt/bc6h/bits.h
new file mode 100644
index 00000000000..c47a7c6e936
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/nvtt/bc6h/bits.h
@@ -0,0 +1,75 @@
+/*
+Copyright 2007 nVidia, Inc.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
+
+You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+See the License for the specific language governing permissions and limitations under the License.
+*/
+#ifndef _ZOH_BITS_H
+#define _ZOH_BITS_H
+
+// read/write a bitstream
+
+#include "nvcore/debug.h"
+
+namespace ZOH {
+
+class Bits
+{
+public:
+
+ Bits(char *data, int maxdatabits) { nvAssert (data && maxdatabits > 0); bptr = bend = 0; bits = data; maxbits = maxdatabits; readonly = 0;}
+ Bits(const char *data, int availdatabits) { nvAssert (data && availdatabits > 0); bptr = 0; bend = availdatabits; cbits = data; maxbits = availdatabits; readonly = 1;}
+
+ void write(int value, int nbits) {
+ nvAssert (nbits >= 0 && nbits < 32);
+ nvAssert (sizeof(int)>= 4);
+ for (int i=0; i<nbits; ++i)
+ writeone(value>>i);
+ }
+ int read(int nbits) {
+ nvAssert (nbits >= 0 && nbits < 32);
+ nvAssert (sizeof(int)>= 4);
+ int out = 0;
+ for (int i=0; i<nbits; ++i)
+ out |= readone() << i;
+ return out;
+ }
+ int getptr() { return bptr; }
+ void setptr(int ptr) { nvAssert (ptr >= 0 && ptr < maxbits); bptr = ptr; }
+ int getsize() { return bend; }
+
+private:
+ int bptr; // next bit to read
+ int bend; // last written bit + 1
+ char *bits; // ptr to user bit stream
+ const char *cbits; // ptr to const user bit stream
+ int maxbits; // max size of user bit stream
+ char readonly; // 1 if this is a read-only stream
+
+ int readone() {
+ nvAssert (bptr < bend);
+ if (bptr >= bend) return 0;
+ int bit = (readonly ? cbits[bptr>>3] : bits[bptr>>3]) & (1 << (bptr & 7));
+ ++bptr;
+ return bit != 0;
+ }
+ void writeone(int bit) {
+ nvAssert (!readonly); // "Writing a read-only bit stream"
+ nvAssert (bptr < maxbits);
+ if (bptr >= maxbits) return;
+ if (bit&1)
+ bits[bptr>>3] |= 1 << (bptr & 7);
+ else
+ bits[bptr>>3] &= ~(1 << (bptr & 7));
+ if (bptr++ >= bend) bend = bptr;
+ }
+};
+
+}
+
+#endif
diff --git a/3rdparty/bgfx/3rdparty/nvtt/bc6h/shapes_two.h b/3rdparty/bgfx/3rdparty/nvtt/bc6h/shapes_two.h
new file mode 100644
index 00000000000..2fc555995cd
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/nvtt/bc6h/shapes_two.h
@@ -0,0 +1,133 @@
+/*
+Copyright 2007 nVidia, Inc.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
+
+You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+See the License for the specific language governing permissions and limitations under the License.
+*/
+#pragma once
+#ifndef _ZOH_SHAPES_TWO_H
+#define _ZOH_SHAPES_TWO_H
+
+// shapes for two regions
+
+#define NREGIONS 2
+#define NSHAPES 64
+#define SHAPEBITS 6
+
+static const int shapes[NSHAPES*16] =
+{
+0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1,
+0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1,
+0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1,
+0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1,
+
+0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0,
+0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1,
+0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1,
+0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1,
+
+0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0,
+0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1,
+0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1,
+
+0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+
+0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1,
+1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1,
+1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1,
+1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0,
+
+0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,
+0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
+0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1,
+0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1,
+
+0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1,
+0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0,
+0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0,
+0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0,
+
+0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1,
+0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1,
+1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1,
+1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0,
+
+0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1,
+0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1,
+0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0,
+0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0,
+
+0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1,
+1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0,
+0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0,
+1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1,
+
+0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1,
+0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1,
+1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1,
+1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0,
+
+0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0,
+1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0,
+1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0,
+0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0,
+
+0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0,
+0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0,
+0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0,
+
+0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1,
+1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1,
+1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0,
+0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0,
+
+0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1,
+1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0,
+1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0,
+1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1,
+
+0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0,
+1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0,
+0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1,
+0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1,
+
+};
+
+#define REGION(x,y,si) shapes[((si)&3)*4+((si)>>2)*64+(x)+(y)*16]
+
+static const int shapeindex_to_compressed_indices[NSHAPES*2] =
+{
+ 0,15, 0,15, 0,15, 0,15,
+ 0,15, 0,15, 0,15, 0,15,
+ 0,15, 0,15, 0,15, 0,15,
+ 0,15, 0,15, 0,15, 0,15,
+
+ 0,15, 0, 2, 0, 8, 0, 2,
+ 0, 2, 0, 8, 0, 8, 0,15,
+ 0, 2, 0, 8, 0, 2, 0, 2,
+ 0, 8, 0, 8, 0, 2, 0, 2,
+
+ 0,15, 0,15, 0, 6, 0, 8,
+ 0, 2, 0, 8, 0,15, 0,15,
+ 0, 2, 0, 8, 0, 2, 0, 2,
+ 0, 2, 0,15, 0,15, 0, 6,
+
+ 0, 6, 0, 2, 0, 6, 0, 8,
+ 0,15, 0,15, 0, 2, 0, 2,
+ 0,15, 0,15, 0,15, 0,15,
+ 0,15, 0, 2, 0, 2, 0,15
+
+};
+#define SHAPEINDEX_TO_COMPRESSED_INDICES(si,region) shapeindex_to_compressed_indices[(si)*2+(region)]
+
+#endif
diff --git a/3rdparty/bgfx/3rdparty/nvtt/bc6h/tile.h b/3rdparty/bgfx/3rdparty/nvtt/bc6h/tile.h
new file mode 100644
index 00000000000..6e642a269d8
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/nvtt/bc6h/tile.h
@@ -0,0 +1,82 @@
+/*
+Copyright 2007 nVidia, Inc.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
+
+You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+See the License for the specific language governing permissions and limitations under the License.
+*/
+#ifndef _ZOH_TILE_H
+#define _ZOH_TILE_H
+
+#include "zoh_utils.h"
+#include "nvmath/vector.h"
+#include <math.h>
+
+namespace ZOH {
+
+//#define USE_IMPORTANCE_MAP 1 // define this if you want to increase importance of some pixels in tile
+class Tile
+{
+public:
+ // NOTE: this returns the appropriately-clamped BIT PATTERN of the half as an INTEGRAL float value
+ static float half2float(uint16 h)
+ {
+ return (float) Utils::ushort_to_format(h);
+ }
+ // NOTE: this is the inverse of the above operation
+ static uint16 float2half(float f)
+ {
+ return Utils::format_to_ushort((int)f);
+ }
+
+ // look for adjacent pixels that are identical. if there are enough of them, increase their importance
+ void generate_importance_map()
+ {
+ // initialize
+ for (int y=0; y<size_y; ++y)
+ for (int x=0; x<size_x; ++x)
+ {
+ // my importance is increased if I am identical to any of my 4-neighbors
+ importance_map[y][x] = match_4_neighbor(x,y) ? 5.0f : 1.0f;
+ }
+ }
+ bool is_equal(int x, int y, int xn, int yn)
+ {
+ if (xn < 0 || xn >= size_x || yn < 0 || yn >= size_y)
+ return false;
+ return( (data[y][x].x == data[yn][xn].x) &&
+ (data[y][x].y == data[yn][xn].y) &&
+ (data[y][x].z == data[yn][xn].z) );
+ }
+
+#ifdef USE_IMPORTANCE_MAP
+ bool match_4_neighbor(int x, int y)
+ {
+ return is_equal(x,y,x-1,y) || is_equal(x,y,x+1,y) || is_equal(x,y,x,y-1) || is_equal(x,y,x,y+1);
+ }
+#else
+ bool match_4_neighbor(int, int)
+ {
+ return false;
+ }
+#endif
+
+ Tile() {};
+ ~Tile(){};
+ Tile(int xs, int ys) {size_x = xs; size_y = ys;}
+
+ static const int TILE_H = 4;
+ static const int TILE_W = 4;
+ static const int TILE_TOTAL = TILE_H * TILE_W;
+ nv::Vector3 data[TILE_H][TILE_W];
+ float importance_map[TILE_H][TILE_W];
+ int size_x, size_y; // actual size of tile
+};
+
+}
+
+#endif // _ZOH_TILE_H
diff --git a/3rdparty/bgfx/3rdparty/nvtt/bc6h/zoh.cpp b/3rdparty/bgfx/3rdparty/nvtt/bc6h/zoh.cpp
new file mode 100644
index 00000000000..3053ea1590c
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/nvtt/bc6h/zoh.cpp
@@ -0,0 +1,197 @@
+/*
+Copyright 2007 nVidia, Inc.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
+
+You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+See the License for the specific language governing permissions and limitations under the License.
+*/
+
+// the zoh compressor and decompressor
+
+#include "tile.h"
+#include "zoh.h"
+
+#include <string.h> // memcpy
+
+using namespace ZOH;
+
+
+bool ZOH::isone(const char *block)
+{
+ char code = block[0] & 0x1F;
+
+ return (code == 0x03 || code == 0x07 || code == 0x0b || code == 0x0f);
+}
+
+void ZOH::compress(const Tile &t, char *block)
+{
+ char oneblock[ZOH::BLOCKSIZE], twoblock[ZOH::BLOCKSIZE];
+
+ float mseone = ZOH::compressone(t, oneblock);
+ float msetwo = ZOH::compresstwo(t, twoblock);
+
+ if (mseone <= msetwo)
+ memcpy(block, oneblock, ZOH::BLOCKSIZE);
+ else
+ memcpy(block, twoblock, ZOH::BLOCKSIZE);
+}
+
+void ZOH::decompress(const char *block, Tile &t)
+{
+ if (ZOH::isone(block))
+ ZOH::decompressone(block, t);
+ else
+ ZOH::decompresstwo(block, t);
+}
+
+/*
+void ZOH::compress(string inf, string zohf)
+{
+ Array2D<Rgba> pixels;
+ int w, h;
+ char block[ZOH::BLOCKSIZE];
+
+ Exr::readRgba(inf, pixels, w, h);
+ FILE *zohfile = fopen(zohf.c_str(), "wb");
+ if (zohfile == NULL) throw "Unable to open .zoh file for write";
+
+ // stuff for progress bar O.o
+ int ntiles = ((h+Tile::TILE_H-1)/Tile::TILE_H)*((w+Tile::TILE_W-1)/Tile::TILE_W);
+ int tilecnt = 0;
+ int ndots = 25;
+ int dotcnt = 0;
+ printf("Progress [");
+ for (int i=0; i<ndots;++i) printf(" ");
+ printf("]\rProgress ["); fflush(stdout);
+
+ // convert to tiles and compress each tile
+ for (int y=0; y<h; y+=Tile::TILE_H)
+ {
+ int ysize = min(Tile::TILE_H, h-y);
+ for (int x=0; x<w; x+=Tile::TILE_W)
+ {
+ int xsize = min(Tile::TILE_W, w-x);
+ Tile t(xsize, ysize);
+
+ t.insert(pixels, x, y);
+
+ ZOH::compress(t, block);
+ if (fwrite(block, sizeof(char), ZOH::BLOCKSIZE, zohfile) != ZOH::BLOCKSIZE)
+ throw "File error on write";
+
+ // progress bar
+ ++tilecnt;
+ if (tilecnt > (ntiles * dotcnt)/ndots) { printf("."); fflush(stdout); ++dotcnt; }
+ }
+ }
+
+ printf("]\n"); // advance to next line finally
+
+ if (fclose(zohfile)) throw "Close failed on .zoh file";
+}
+
+static int str2int(std::string s)
+{
+ int thing;
+ std::stringstream str (stringstream::in | stringstream::out);
+ str << s;
+ str >> thing;
+ return thing;
+}
+
+// zoh file name is ...-w-h.zoh, extract width and height
+static void extract(string zohf, int &w, int &h)
+{
+ size_t n = zohf.rfind('.', zohf.length()-1);
+ size_t n1 = zohf.rfind('-', n-1);
+ size_t n2 = zohf.rfind('-', n1-1);
+ string width = zohf.substr(n2+1, n1-n2-1);
+ w = str2int(width);
+ string height = zohf.substr(n1+1, n-n1-1);
+ h = str2int(height);
+}
+
+static int mode_to_prec[] = {
+ 10,7,11,10,
+ 10,7,11,11,
+ 10,7,11,12,
+ 10,7,9,16,
+ 10,7,8,-1,
+ 10,7,8,-1,
+ 10,7,8,-1,
+ 10,7,6,-1,
+};
+
+static int shapeindexhist[32], modehist[32], prechistone[16], prechisttwo[16], oneregion, tworegions;
+
+static void stats(char block[ZOH::BLOCKSIZE])
+{
+ char mode = block[0] & 0x1F; if ((mode & 0x3) == 0) mode = 0; if ((mode & 0x3) == 1) mode = 1; modehist[mode]++;
+ int prec = mode_to_prec[mode];
+ nvAssert (prec != -1);
+ if (!ZOH::isone(block))
+ {
+ tworegions++;
+ prechisttwo[prec]++;
+ int shapeindex = ((block[0] & 0xe0) >> 5) | ((block[1] & 0x3) << 3);
+ shapeindexhist[shapeindex]++;
+ }
+ else
+ {
+ oneregion++;
+ prechistone[prec]++;
+ }
+}
+
+static void printstats()
+{
+ printf("\nPrecision histogram 10b to 16b one region: "); for (int i=10; i<=16; ++i) printf("%d,", prechistone[i]);
+ printf("\nPrecision histogram 6b to 11b two regions: "); for (int i=6; i<=11; ++i) printf("%d,", prechisttwo[i]);
+ printf("\nMode histogram: "); for (int i=0; i<32; ++i) printf("%d,", modehist[i]);
+ printf("\nShape index histogram: "); for (int i=0; i<32; ++i) printf("%d,", shapeindexhist[i]);
+ printf("\nOne region %5.2f%% Two regions %5.2f%%", 100.0*oneregion/float(oneregion+tworegions), 100.0*tworegions/float(oneregion+tworegions));
+ printf("\n");
+}
+
+void ZOH::decompress(string zohf, string outf)
+{
+ Array2D<Rgba> pixels;
+ int w, h;
+ char block[ZOH::BLOCKSIZE];
+
+ extract(zohf, w, h);
+ FILE *zohfile = fopen(zohf.c_str(), "rb");
+ if (zohfile == NULL) throw "Unable to open .zoh file for read";
+ pixels.resizeErase(h, w);
+
+ // convert to tiles and decompress each tile
+ for (int y=0; y<h; y+=Tile::TILE_H)
+ {
+ int ysize = min(Tile::TILE_H, h-y);
+ for (int x=0; x<w; x+=Tile::TILE_W)
+ {
+ int xsize = min(Tile::TILE_W, w-x);
+ Tile t(xsize, ysize);
+
+ if (fread(block, sizeof(char), ZOH::BLOCKSIZE, zohfile) != ZOH::BLOCKSIZE)
+ throw "File error on read";
+
+ stats(block); // collect statistics
+
+ ZOH::decompress(block, t);
+
+ t.extract(pixels, x, y);
+ }
+ }
+ if (fclose(zohfile)) throw "Close failed on .zoh file";
+ Exr::writeRgba(outf, pixels, w, h);
+
+#ifndef EXTERNAL_RELEASE
+ printstats(); // print statistics
+#endif
+}
+*/
diff --git a/3rdparty/bgfx/3rdparty/nvtt/bc6h/zoh.h b/3rdparty/bgfx/3rdparty/nvtt/bc6h/zoh.h
new file mode 100644
index 00000000000..d3003cbc391
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/nvtt/bc6h/zoh.h
@@ -0,0 +1,65 @@
+/*
+Copyright 2007 nVidia, Inc.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
+
+You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+See the License for the specific language governing permissions and limitations under the License.
+*/
+#pragma once
+#ifndef _ZOH_H
+#define _ZOH_H
+
+#include "tile.h"
+
+namespace ZOH {
+
+// UNUSED ZOH MODES are 0x13, 0x17, 0x1b, 0x1f
+
+static const int NREGIONS_TWO = 2;
+static const int NREGIONS_ONE = 1;
+static const int NCHANNELS = 3;
+
+struct FltEndpts
+{
+ nv::Vector3 A;
+ nv::Vector3 B;
+};
+
+struct IntEndpts
+{
+ int A[NCHANNELS];
+ int B[NCHANNELS];
+};
+
+struct ComprEndpts
+{
+ uint A[NCHANNELS];
+ uint B[NCHANNELS];
+};
+
+static const int BLOCKSIZE=16;
+static const int BITSIZE=128;
+
+void compress(const Tile &t, char *block);
+void decompress(const char *block, Tile &t);
+
+float compressone(const Tile &t, char *block);
+float compresstwo(const Tile &t, char *block);
+void decompressone(const char *block, Tile &t);
+void decompresstwo(const char *block, Tile &t);
+
+float refinetwo(const Tile &tile, int shapeindex_best, const FltEndpts endpts[NREGIONS_TWO], char *block);
+float roughtwo(const Tile &tile, int shape, FltEndpts endpts[NREGIONS_TWO]);
+
+float refineone(const Tile &tile, int shapeindex_best, const FltEndpts endpts[NREGIONS_ONE], char *block);
+float roughone(const Tile &tile, int shape, FltEndpts endpts[NREGIONS_ONE]);
+
+bool isone(const char *block);
+
+}
+
+#endif // _ZOH_H
diff --git a/3rdparty/bgfx/3rdparty/nvtt/bc6h/zoh_utils.cpp b/3rdparty/bgfx/3rdparty/nvtt/bc6h/zoh_utils.cpp
new file mode 100644
index 00000000000..fde3200e641
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/nvtt/bc6h/zoh_utils.cpp
@@ -0,0 +1,324 @@
+/*
+Copyright 2007 nVidia, Inc.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
+
+You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+See the License for the specific language governing permissions and limitations under the License.
+*/
+
+// Utility and common routines
+
+#include "zoh_utils.h"
+#include "nvmath/vector.inl"
+#include <math.h>
+
+using namespace nv;
+using namespace ZOH;
+
+static const int denom7_weights_64[] = {0, 9, 18, 27, 37, 46, 55, 64}; // divided by 64
+static const int denom15_weights_64[] = {0, 4, 9, 13, 17, 21, 26, 30, 34, 38, 43, 47, 51, 55, 60, 64}; // divided by 64
+
+/*static*/ Format Utils::FORMAT;
+
+int Utils::lerp(int a, int b, int i, int denom)
+{
+ nvDebugCheck (denom == 3 || denom == 7 || denom == 15);
+ nvDebugCheck (i >= 0 && i <= denom);
+
+ int round = 32, shift = 6;
+ const int *weights;
+
+ switch(denom)
+ {
+ case 3: denom *= 5; i *= 5; // fall through to case 15
+ case 15: weights = denom15_weights_64; break;
+ case 7: weights = denom7_weights_64; break;
+ default: nvDebugCheck(0);
+ }
+
+ return (a*weights[denom-i] +b*weights[i] + round) >> shift;
+}
+
+Vector3 Utils::lerp(const Vector3& a, const Vector3 &b, int i, int denom)
+{
+ nvDebugCheck (denom == 3 || denom == 7 || denom == 15);
+ nvDebugCheck (i >= 0 && i <= denom);
+
+ int shift = 6;
+ const int *weights;
+
+ switch(denom)
+ {
+ case 3: denom *= 5; i *= 5; // fall through to case 15
+ case 15: weights = denom15_weights_64; break;
+ case 7: weights = denom7_weights_64; break;
+ default: nvUnreachable();
+ }
+
+ // no need to round these as this is an exact division
+ return (a*float(weights[denom-i]) +b*float(weights[i])) / float(1 << shift);
+}
+
+
+/*
+ For unsigned f16, clamp the input to [0,F16MAX]. Thus u15.
+ For signed f16, clamp the input to [-F16MAX,F16MAX]. Thus s16.
+
+ The conversions proceed as follows:
+
+ unsigned f16: get bits. if high bit set, clamp to 0, else clamp to F16MAX.
+ signed f16: get bits. extract exp+mantissa and clamp to F16MAX. return -value if sign bit was set, else value
+ unsigned int: get bits. return as a positive value.
+ signed int. get bits. return as a value in -32768..32767.
+
+ The inverse conversions are just the inverse of the above.
+*/
+
+// clamp the 3 channels of the input vector to the allowable range based on FORMAT
+// note that each channel is a float storing the allowable range as a bit pattern converted to float
+// that is, for unsigned f16 say, we would clamp each channel to the range [0, F16MAX]
+
+void Utils::clamp(Vector3 &v)
+{
+ for (int i=0; i<3; ++i)
+ {
+ switch(Utils::FORMAT)
+ {
+ case UNSIGNED_F16:
+ if (v.component[i] < 0.0) v.component[i] = 0;
+ else if (v.component[i] > F16MAX) v.component[i] = F16MAX;
+ break;
+
+ case SIGNED_F16:
+ if (v.component[i] < -F16MAX) v.component[i] = -F16MAX;
+ else if (v.component[i] > F16MAX) v.component[i] = F16MAX;
+ break;
+
+ default:
+ nvUnreachable();
+ }
+ }
+}
+
+// convert a u16 value to s17 (represented as an int) based on the format expected
+int Utils::ushort_to_format(unsigned short input)
+{
+ int out, s;
+
+ // clamp to the valid range we are expecting
+ switch (Utils::FORMAT)
+ {
+ case UNSIGNED_F16:
+ if (input & F16S_MASK) out = 0;
+ else if (input > F16MAX) out = F16MAX;
+ else out = input;
+ break;
+
+ case SIGNED_F16:
+ s = input & F16S_MASK;
+ input &= F16EM_MASK;
+ if (input > F16MAX) out = F16MAX;
+ else out = input;
+ out = s ? -out : out;
+ break;
+ }
+ return out;
+}
+
+// convert a s17 value to u16 based on the format expected
+unsigned short Utils::format_to_ushort(int input)
+{
+ unsigned short out;
+
+ // clamp to the valid range we are expecting
+ switch (Utils::FORMAT)
+ {
+ case UNSIGNED_F16:
+ nvDebugCheck (input >= 0 && input <= F16MAX);
+ out = input;
+ break;
+
+ case SIGNED_F16:
+ nvDebugCheck (input >= -F16MAX && input <= F16MAX);
+ // convert to sign-magnitude
+ int s;
+ if (input < 0) { s = F16S_MASK; input = -input; }
+ else { s = 0; }
+ out = s | input;
+ break;
+ }
+ return out;
+}
+
+// quantize the input range into equal-sized bins
+int Utils::quantize(float value, int prec)
+{
+ int q, ivalue, s;
+
+ nvDebugCheck (prec > 1); // didn't bother to make it work for 1
+
+ value = (float)floor(value + 0.5);
+
+ int bias = (prec > 10) ? ((1<<(prec-1))-1) : 0; // bias precisions 11..16 to get a more accurate quantization
+
+ switch (Utils::FORMAT)
+ {
+ case UNSIGNED_F16:
+ nvDebugCheck (value >= 0 && value <= F16MAX);
+ ivalue = (int)value;
+ q = ((ivalue << prec) + bias) / (F16MAX+1);
+ nvDebugCheck (q >= 0 && q < (1 << prec));
+ break;
+
+ case SIGNED_F16:
+ nvDebugCheck (value >= -F16MAX && value <= F16MAX);
+ // convert to sign-magnitude
+ ivalue = (int)value;
+ if (ivalue < 0) { s = 1; ivalue = -ivalue; } else s = 0;
+
+ q = ((ivalue << (prec-1)) + bias) / (F16MAX+1);
+ if (s)
+ q = -q;
+ nvDebugCheck (q > -(1 << (prec-1)) && q < (1 << (prec-1)));
+ break;
+ }
+
+ return q;
+}
+
+int Utils::finish_unquantize(int q, int prec)
+{
+ if (Utils::FORMAT == UNSIGNED_F16)
+ return (q * 31) >> 6; // scale the magnitude by 31/64
+ else if (Utils::FORMAT == SIGNED_F16)
+ return (q < 0) ? -(((-q) * 31) >> 5) : (q * 31) >> 5; // scale the magnitude by 31/32
+ else
+ return q;
+}
+
+// unquantize each bin to midpoint of original bin range, except
+// for the end bins which we push to an endpoint of the bin range.
+// we do this to ensure we can represent all possible original values.
+// the asymmetric end bins do not affect PSNR for the test images.
+//
+// code this function assuming an arbitrary bit pattern as the encoded block
+int Utils::unquantize(int q, int prec)
+{
+ int unq, s;
+
+ nvDebugCheck (prec > 1); // not implemented for prec 1
+
+ switch (Utils::FORMAT)
+ {
+ // modify this case to move the multiplication by 31 after interpolation.
+ // Need to use finish_unquantize.
+
+ // since we have 16 bits available, let's unquantize this to 16 bits unsigned
+ // thus the scale factor is [0-7c00)/[0-10000) = 31/64
+ case UNSIGNED_F16:
+ if (prec >= 15)
+ unq = q;
+ else if (q == 0)
+ unq = 0;
+ else if (q == ((1<<prec)-1))
+ unq = U16MAX;
+ else
+ unq = (q * (U16MAX+1) + (U16MAX+1)/2) >> prec;
+ break;
+
+ // here, let's stick with S16 (no apparent quality benefit from going to S17)
+ // range is (-7c00..7c00)/(-8000..8000) = 31/32
+ case SIGNED_F16:
+ // don't remove this test even though it appears equivalent to the code below
+ // as it isn't -- the code below can overflow for prec = 16
+ if (prec >= 16)
+ unq = q;
+ else
+ {
+ if (q < 0) { s = 1; q = -q; } else s = 0;
+
+ if (q == 0)
+ unq = 0;
+ else if (q >= ((1<<(prec-1))-1))
+ unq = s ? -S16MAX : S16MAX;
+ else
+ {
+ unq = (q * (S16MAX+1) + (S16MAX+1)/2) >> (prec-1);
+ if (s)
+ unq = -unq;
+ }
+ }
+ break;
+ }
+ return unq;
+}
+
+
+
+// pick a norm!
+#define NORM_EUCLIDEAN 1
+
+float Utils::norm(const Vector3 &a, const Vector3 &b)
+{
+#ifdef NORM_EUCLIDEAN
+ return lengthSquared(a - b);
+#endif
+#ifdef NORM_ABS
+ Vector3 err = a - b;
+ return fabs(err.x) + fabs(err.y) + fabs(err.z);
+#endif
+}
+
+// parse <name>[<start>{:<end>}]{,}
+// the pointer starts here ^
+// name is 1 or 2 chars and matches field names. start and end are decimal numbers
+void Utils::parse(const char *encoding, int &ptr, Field &field, int &endbit, int &len)
+{
+ if (ptr <= 0) return;
+ --ptr;
+ if (encoding[ptr] == ',') --ptr;
+ nvDebugCheck (encoding[ptr] == ']');
+ --ptr;
+ endbit = 0;
+ int scale = 1;
+ while (encoding[ptr] != ':' && encoding[ptr] != '[')
+ {
+ nvDebugCheck(encoding[ptr] >= '0' && encoding[ptr] <= '9');
+ endbit += (encoding[ptr--] - '0') * scale;
+ scale *= 10;
+ }
+ int startbit = 0; scale = 1;
+ if (encoding[ptr] == '[')
+ startbit = endbit;
+ else
+ {
+ ptr--;
+ while (encoding[ptr] != '[')
+ {
+ nvDebugCheck(encoding[ptr] >= '0' && encoding[ptr] <= '9');
+ startbit += (encoding[ptr--] - '0') * scale;
+ scale *= 10;
+ }
+ }
+ len = startbit - endbit + 1; // startbit>=endbit note
+ --ptr;
+ if (encoding[ptr] == 'm') field = FIELD_M;
+ else if (encoding[ptr] == 'd') field = FIELD_D;
+ else {
+ // it's wxyz
+ nvDebugCheck (encoding[ptr] >= 'w' && encoding[ptr] <= 'z');
+ int foo = encoding[ptr--] - 'w';
+ // now it is r g or b
+ if (encoding[ptr] == 'r') foo += 10;
+ else if (encoding[ptr] == 'g') foo += 20;
+ else if (encoding[ptr] == 'b') foo += 30;
+ else nvDebugCheck(0);
+ field = (Field) foo;
+ }
+}
+
+
diff --git a/3rdparty/bgfx/3rdparty/nvtt/bc6h/zoh_utils.h b/3rdparty/bgfx/3rdparty/nvtt/bc6h/zoh_utils.h
new file mode 100644
index 00000000000..3ce33ce94e0
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/nvtt/bc6h/zoh_utils.h
@@ -0,0 +1,72 @@
+/*
+Copyright 2007 nVidia, Inc.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
+
+You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+See the License for the specific language governing permissions and limitations under the License.
+*/
+
+// utility class holding common routines
+#ifndef _ZOH_UTILS_H
+#define _ZOH_UTILS_H
+
+#include "nvmath/vector.h"
+
+namespace ZOH {
+
+inline int SIGN_EXTEND(int x, int nb) { return ((((signed(x))&(1<<((nb)-1)))?((~0)<<(nb)):0)|(signed(x))); }
+
+enum Field {
+ FIELD_M = 1, // mode
+ FIELD_D = 2, // distribution/shape
+ FIELD_RW = 10+0, FIELD_RX = 10+1, FIELD_RY = 10+2, FIELD_RZ = 10+3, // red channel endpoints or deltas
+ FIELD_GW = 20+0, FIELD_GX = 20+1, FIELD_GY = 20+2, FIELD_GZ = 20+3, // green channel endpoints or deltas
+ FIELD_BW = 30+0, FIELD_BX = 30+1, FIELD_BY = 30+2, FIELD_BZ = 30+3, // blue channel endpoints or deltas
+};
+
+// some constants
+static const int F16S_MASK = 0x8000; // f16 sign mask
+static const int F16EM_MASK = 0x7fff; // f16 exp & mantissa mask
+static const int U16MAX = 0xffff;
+static const int S16MIN = -0x8000;
+static const int S16MAX = 0x7fff;
+static const int INT16_MASK = 0xffff;
+static const int F16MAX = 0x7bff; // MAXFLT bit pattern for halfs
+
+enum Format { UNSIGNED_F16, SIGNED_F16 };
+
+class Utils
+{
+public:
+ static Format FORMAT; // this is a global -- we're either handling unsigned or unsigned half values
+
+ // error metrics
+ static float norm(const nv::Vector3 &a, const nv::Vector3 &b);
+ static float mpsnr_norm(const nv::Vector3 &a, int exposure, const nv::Vector3 &b);
+
+ // conversion & clamp
+ static int ushort_to_format(unsigned short input);
+ static unsigned short format_to_ushort(int input);
+
+ // clamp to format
+ static void clamp(nv::Vector3 &v);
+
+ // quantization and unquantization
+ static int finish_unquantize(int q, int prec);
+ static int unquantize(int q, int prec);
+ static int quantize(float value, int prec);
+
+ static void parse(const char *encoding, int &ptr, Field & field, int &endbit, int &len);
+
+ // lerping
+ static int lerp(int a, int b, int i, int denom);
+ static nv::Vector3 lerp(const nv::Vector3 & a, const nv::Vector3 & b, int i, int denom);
+};
+
+}
+
+#endif // _ZOH_UTILS_H
diff --git a/3rdparty/bgfx/3rdparty/nvtt/bc6h/zohone.cpp b/3rdparty/bgfx/3rdparty/nvtt/bc6h/zohone.cpp
new file mode 100644
index 00000000000..36526761464
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/nvtt/bc6h/zohone.cpp
@@ -0,0 +1,799 @@
+/*
+Copyright 2007 nVidia, Inc.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
+
+You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+See the License for the specific language governing permissions and limitations under the License.
+*/
+
+// one region zoh compress/decompress code
+// Thanks to Jacob Munkberg (jacob@cs.lth.se) for the shortcut of using SVD to do the equivalent of principal components analysis
+
+#include "bits.h"
+#include "tile.h"
+#include "zoh.h"
+#include "zoh_utils.h"
+
+#include "nvmath/vector.inl"
+#include "nvmath/fitting.h"
+
+#include <string.h> // strlen
+#include <float.h> // FLT_MAX
+
+using namespace nv;
+using namespace ZOH;
+
+#define NINDICES 16
+#define INDEXBITS 4
+#define HIGH_INDEXBIT (1<<(INDEXBITS-1))
+#define DENOM (NINDICES-1)
+
+#define NSHAPES 1
+
+static const int shapes[NSHAPES] =
+{
+ 0x0000
+}; // only 1 shape
+
+#define REGION(x,y,shapeindex) ((shapes[shapeindex]&(1<<(15-(x)-4*(y))))!=0)
+
+#define POS_TO_X(pos) ((pos)&3)
+#define POS_TO_Y(pos) (((pos)>>2)&3)
+
+#define NDELTA 2
+
+struct Chanpat
+{
+ int prec[NDELTA]; // precision pattern for one channel
+};
+
+struct Pattern
+{
+ Chanpat chan[NCHANNELS];// allow different bit patterns per channel -- but we still want constant precision per channel
+ int transformed; // if 0, deltas are unsigned and no transform; otherwise, signed and transformed
+ int mode; // associated mode value
+ int modebits; // number of mode bits
+ const char *encoding; // verilog description of encoding for this mode
+};
+
+#define MAXMODEBITS 5
+#define MAXMODES (1<<MAXMODEBITS)
+
+#define NPATTERNS 4
+
+static const Pattern patterns[NPATTERNS] =
+{
+ 16,4, 16,4, 16,4, 1, 0x0f, 5, "bw[10],bw[11],bw[12],bw[13],bw[14],bw[15],bx[3:0],gw[10],gw[11],gw[12],gw[13],gw[14],gw[15],gx[3:0],rw[10],rw[11],rw[12],rw[13],rw[14],rw[15],rx[3:0],bw[9:0],gw[9:0],rw[9:0],m[4:0]",
+ 12,8, 12,8, 12,8, 1, 0x0b, 5, "bw[10],bw[11],bx[7:0],gw[10],gw[11],gx[7:0],rw[10],rw[11],rx[7:0],bw[9:0],gw[9:0],rw[9:0],m[4:0]",
+ 11,9, 11,9, 11,9, 1, 0x07, 5, "bw[10],bx[8:0],gw[10],gx[8:0],rw[10],rx[8:0],bw[9:0],gw[9:0],rw[9:0],m[4:0]",
+ 10,10, 10,10, 10,10, 0, 0x03, 5, "bx[9:0],gx[9:0],rx[9:0],bw[9:0],gw[9:0],rw[9:0],m[4:0]",
+};
+
+// mapping of mode to the corresponding index in pattern
+static const int mode_to_pat[MAXMODES] = {
+ -1,-1,-1,
+ 3, // 0x03
+ -1,-1,-1,
+ 2, // 0x07
+ -1,-1,-1,
+ 1, // 0x0b
+ -1,-1,-1,
+ 0, // 0x0f
+ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+};
+
+#define R_0(ep) (ep)[0].A[i]
+#define R_1(ep) (ep)[0].B[i]
+#define MASK(n) ((1<<(n))-1)
+
+// compress endpoints
+static void compress_endpts(const IntEndpts in[NREGIONS_ONE], ComprEndpts out[NREGIONS_ONE], const Pattern &p)
+{
+ if (p.transformed)
+ {
+ for (int i=0; i<NCHANNELS; ++i)
+ {
+ R_0(out) = R_0(in) & MASK(p.chan[i].prec[0]);
+ R_1(out) = (R_1(in) - R_0(in)) & MASK(p.chan[i].prec[1]);
+ }
+ }
+ else
+ {
+ for (int i=0; i<NCHANNELS; ++i)
+ {
+ R_0(out) = R_0(in) & MASK(p.chan[i].prec[0]);
+ R_1(out) = R_1(in) & MASK(p.chan[i].prec[1]);
+ }
+ }
+}
+
+// decompress endpoints
+static void decompress_endpts(const ComprEndpts in[NREGIONS_ONE], IntEndpts out[NREGIONS_ONE], const Pattern &p)
+{
+ bool issigned = Utils::FORMAT == SIGNED_F16;
+
+ if (p.transformed)
+ {
+ for (int i=0; i<NCHANNELS; ++i)
+ {
+ R_0(out) = issigned ? SIGN_EXTEND(R_0(in),p.chan[i].prec[0]) : R_0(in);
+ int t;
+ t = SIGN_EXTEND(R_1(in), p.chan[i].prec[1]);
+ t = (t + R_0(in)) & MASK(p.chan[i].prec[0]);
+ R_1(out) = issigned ? SIGN_EXTEND(t,p.chan[i].prec[0]) : t;
+ }
+ }
+ else
+ {
+ for (int i=0; i<NCHANNELS; ++i)
+ {
+ R_0(out) = issigned ? SIGN_EXTEND(R_0(in),p.chan[i].prec[0]) : R_0(in);
+ R_1(out) = issigned ? SIGN_EXTEND(R_1(in),p.chan[i].prec[1]) : R_1(in);
+ }
+ }
+}
+
+static void quantize_endpts(const FltEndpts endpts[NREGIONS_ONE], int prec, IntEndpts q_endpts[NREGIONS_ONE])
+{
+ for (int region = 0; region < NREGIONS_ONE; ++region)
+ {
+ q_endpts[region].A[0] = Utils::quantize(endpts[region].A.x, prec);
+ q_endpts[region].A[1] = Utils::quantize(endpts[region].A.y, prec);
+ q_endpts[region].A[2] = Utils::quantize(endpts[region].A.z, prec);
+ q_endpts[region].B[0] = Utils::quantize(endpts[region].B.x, prec);
+ q_endpts[region].B[1] = Utils::quantize(endpts[region].B.y, prec);
+ q_endpts[region].B[2] = Utils::quantize(endpts[region].B.z, prec);
+ }
+}
+
+// swap endpoints as needed to ensure that the indices at index_one and index_one have a 0 high-order bit
+// index_one is 0 at x=0 y=0 and 15 at x=3 y=3 so y = (index >> 2) & 3 and x = index & 3
+static void swap_indices(IntEndpts endpts[NREGIONS_ONE], int indices[Tile::TILE_H][Tile::TILE_W], int shapeindex)
+{
+ int index_positions[NREGIONS_ONE];
+
+ index_positions[0] = 0; // since WLOG we have the high bit of the shapes at 0
+
+ for (int region = 0; region < NREGIONS_ONE; ++region)
+ {
+ int x = index_positions[region] & 3;
+ int y = (index_positions[region] >> 2) & 3;
+ nvDebugCheck(REGION(x,y,shapeindex) == region); // double check the table
+ if (indices[y][x] & HIGH_INDEXBIT)
+ {
+ // high bit is set, swap the endpts and indices for this region
+ int t;
+ for (int i=0; i<NCHANNELS; ++i) { t = endpts[region].A[i]; endpts[region].A[i] = endpts[region].B[i]; endpts[region].B[i] = t; }
+
+ for (int y = 0; y < Tile::TILE_H; y++)
+ for (int x = 0; x < Tile::TILE_W; x++)
+ if (REGION(x,y,shapeindex) == region)
+ indices[y][x] = NINDICES - 1 - indices[y][x];
+ }
+ }
+}
+
+// endpoints fit only if the compression was lossless
+static bool endpts_fit(const IntEndpts orig[NREGIONS_ONE], const ComprEndpts compressed[NREGIONS_ONE], const Pattern &p)
+{
+ IntEndpts uncompressed[NREGIONS_ONE];
+
+ decompress_endpts(compressed, uncompressed, p);
+
+ for (int j=0; j<NREGIONS_ONE; ++j)
+ for (int i=0; i<NCHANNELS; ++i)
+ {
+ if (orig[j].A[i] != uncompressed[j].A[i]) return false;
+ if (orig[j].B[i] != uncompressed[j].B[i]) return false;
+ }
+ return true;
+}
+
+static void write_header(const ComprEndpts endpts[NREGIONS_ONE], const Pattern &p, Bits &out)
+{
+ // interpret the verilog backwards and process it
+ int m = p.mode;
+ int rw = endpts[0].A[0], rx = endpts[0].B[0];
+ int gw = endpts[0].A[1], gx = endpts[0].B[1];
+ int bw = endpts[0].A[2], bx = endpts[0].B[2];
+ int ptr = int(strlen(p.encoding));
+ while (ptr)
+ {
+ Field field;
+ int endbit, len;
+
+ // !!!UNDONE: get rid of string parsing!!!
+ Utils::parse(p.encoding, ptr, field, endbit, len);
+ switch(field)
+ {
+ case FIELD_M: out.write( m >> endbit, len); break;
+ case FIELD_RW: out.write(rw >> endbit, len); break;
+ case FIELD_RX: out.write(rx >> endbit, len); break;
+ case FIELD_GW: out.write(gw >> endbit, len); break;
+ case FIELD_GX: out.write(gx >> endbit, len); break;
+ case FIELD_BW: out.write(bw >> endbit, len); break;
+ case FIELD_BX: out.write(bx >> endbit, len); break;
+
+ case FIELD_D:
+ case FIELD_RY:
+ case FIELD_RZ:
+ case FIELD_GY:
+ case FIELD_GZ:
+ case FIELD_BY:
+ case FIELD_BZ:
+ default: nvUnreachable();
+ }
+ }
+}
+
+static void read_header(Bits &in, ComprEndpts endpts[NREGIONS_ONE], Pattern &p)
+{
+ // reading isn't quite symmetric with writing -- we don't know the encoding until we decode the mode
+ int mode = in.read(2);
+ if (mode != 0x00 && mode != 0x01)
+ mode = (in.read(3) << 2) | mode;
+
+ int pat_index = mode_to_pat[mode];
+
+ nvDebugCheck (pat_index >= 0 && pat_index < NPATTERNS);
+ nvDebugCheck (in.getptr() == patterns[pat_index].modebits);
+
+ p = patterns[pat_index];
+
+ int d;
+ int rw, rx;
+ int gw, gx;
+ int bw, bx;
+
+ d = 0;
+ rw = rx = 0;
+ gw = gx = 0;
+ bw = bx = 0;
+
+ int ptr = int(strlen(p.encoding));
+
+ while (ptr)
+ {
+ Field field;
+ int endbit, len;
+
+ // !!!UNDONE: get rid of string parsing!!!
+ Utils::parse(p.encoding, ptr, field, endbit, len);
+
+ switch(field)
+ {
+ case FIELD_M: break; // already processed so ignore
+ case FIELD_RW: rw |= in.read(len) << endbit; break;
+ case FIELD_RX: rx |= in.read(len) << endbit; break;
+ case FIELD_GW: gw |= in.read(len) << endbit; break;
+ case FIELD_GX: gx |= in.read(len) << endbit; break;
+ case FIELD_BW: bw |= in.read(len) << endbit; break;
+ case FIELD_BX: bx |= in.read(len) << endbit; break;
+
+ case FIELD_D:
+ case FIELD_RY:
+ case FIELD_RZ:
+ case FIELD_GY:
+ case FIELD_GZ:
+ case FIELD_BY:
+ case FIELD_BZ:
+ default: nvUnreachable();
+ }
+ }
+
+ nvDebugCheck (in.getptr() == 128 - 63);
+
+ endpts[0].A[0] = rw; endpts[0].B[0] = rx;
+ endpts[0].A[1] = gw; endpts[0].B[1] = gx;
+ endpts[0].A[2] = bw; endpts[0].B[2] = bx;
+}
+
+// compress index 0
+static void write_indices(const int indices[Tile::TILE_H][Tile::TILE_W], int shapeindex, Bits &out)
+{
+ for (int pos = 0; pos < Tile::TILE_TOTAL; ++pos)
+ {
+ int x = POS_TO_X(pos);
+ int y = POS_TO_Y(pos);
+
+ out.write(indices[y][x], INDEXBITS - ((pos == 0) ? 1 : 0));
+ }
+}
+
+static void emit_block(const ComprEndpts endpts[NREGIONS_ONE], int shapeindex, const Pattern &p, const int indices[Tile::TILE_H][Tile::TILE_W], char *block)
+{
+ Bits out(block, ZOH::BITSIZE);
+
+ write_header(endpts, p, out);
+
+ write_indices(indices, shapeindex, out);
+
+ nvDebugCheck(out.getptr() == ZOH::BITSIZE);
+}
+
+static void generate_palette_quantized(const IntEndpts &endpts, int prec, Vector3 palette[NINDICES])
+{
+ // scale endpoints
+ int a, b; // really need a IntVector3...
+
+ a = Utils::unquantize(endpts.A[0], prec);
+ b = Utils::unquantize(endpts.B[0], prec);
+
+ // interpolate
+ for (int i = 0; i < NINDICES; ++i)
+ palette[i].x = float(Utils::finish_unquantize(Utils::lerp(a, b, i, DENOM), prec));
+
+ a = Utils::unquantize(endpts.A[1], prec);
+ b = Utils::unquantize(endpts.B[1], prec);
+
+ // interpolate
+ for (int i = 0; i < NINDICES; ++i)
+ palette[i].y = float(Utils::finish_unquantize(Utils::lerp(a, b, i, DENOM), prec));
+
+ a = Utils::unquantize(endpts.A[2], prec);
+ b = Utils::unquantize(endpts.B[2], prec);
+
+ // interpolate
+ for (int i = 0; i < NINDICES; ++i)
+ palette[i].z = float(Utils::finish_unquantize(Utils::lerp(a, b, i, DENOM), prec));
+}
+
+// position 0 was compressed
+static void read_indices(Bits &in, int shapeindex, int indices[Tile::TILE_H][Tile::TILE_W])
+{
+ for (int pos = 0; pos < Tile::TILE_TOTAL; ++pos)
+ {
+ int x = POS_TO_X(pos);
+ int y = POS_TO_Y(pos);
+
+ indices[y][x]= in.read(INDEXBITS - ((pos == 0) ? 1 : 0));
+ }
+}
+
+void ZOH::decompressone(const char *block, Tile &t)
+{
+ Bits in(block, ZOH::BITSIZE);
+
+ Pattern p;
+ IntEndpts endpts[NREGIONS_ONE];
+ ComprEndpts compr_endpts[NREGIONS_ONE];
+
+ read_header(in, compr_endpts, p);
+ int shapeindex = 0; // only one shape
+
+ decompress_endpts(compr_endpts, endpts, p);
+
+ Vector3 palette[NREGIONS_ONE][NINDICES];
+ for (int r = 0; r < NREGIONS_ONE; ++r)
+ generate_palette_quantized(endpts[r], p.chan[0].prec[0], &palette[r][0]);
+
+ // read indices
+ int indices[Tile::TILE_H][Tile::TILE_W];
+
+ read_indices(in, shapeindex, indices);
+
+ nvDebugCheck(in.getptr() == ZOH::BITSIZE);
+
+ // lookup
+ for (int y = 0; y < Tile::TILE_H; y++)
+ for (int x = 0; x < Tile::TILE_W; x++)
+ t.data[y][x] = palette[REGION(x,y,shapeindex)][indices[y][x]];
+}
+
+// given a collection of colors and quantized endpoints, generate a palette, choose best entries, and return a single toterr
+static float map_colors(const Vector3 colors[], const float importance[], int np, const IntEndpts &endpts, int prec)
+{
+ Vector3 palette[NINDICES];
+ float toterr = 0;
+ Vector3 err;
+
+ generate_palette_quantized(endpts, prec, palette);
+
+ for (int i = 0; i < np; ++i)
+ {
+ float err, besterr;
+
+ besterr = Utils::norm(colors[i], palette[0]) * importance[i];
+
+ for (int j = 1; j < NINDICES && besterr > 0; ++j)
+ {
+ err = Utils::norm(colors[i], palette[j]) * importance[i];
+
+ if (err > besterr) // error increased, so we're done searching
+ break;
+ if (err < besterr)
+ besterr = err;
+ }
+ toterr += besterr;
+ }
+ return toterr;
+}
+
+// assign indices given a tile, shape, and quantized endpoints, return toterr for each region
+static void assign_indices(const Tile &tile, int shapeindex, IntEndpts endpts[NREGIONS_ONE], int prec,
+ int indices[Tile::TILE_H][Tile::TILE_W], float toterr[NREGIONS_ONE])
+{
+ // build list of possibles
+ Vector3 palette[NREGIONS_ONE][NINDICES];
+
+ for (int region = 0; region < NREGIONS_ONE; ++region)
+ {
+ generate_palette_quantized(endpts[region], prec, &palette[region][0]);
+ toterr[region] = 0;
+ }
+
+ Vector3 err;
+
+ for (int y = 0; y < tile.size_y; y++)
+ for (int x = 0; x < tile.size_x; x++)
+ {
+ int region = REGION(x,y,shapeindex);
+ float err, besterr;
+
+ besterr = Utils::norm(tile.data[y][x], palette[region][0]);
+ indices[y][x] = 0;
+
+ for (int i = 1; i < NINDICES && besterr > 0; ++i)
+ {
+ err = Utils::norm(tile.data[y][x], palette[region][i]);
+
+ if (err > besterr) // error increased, so we're done searching
+ break;
+ if (err < besterr)
+ {
+ besterr = err;
+ indices[y][x] = i;
+ }
+ }
+ toterr[region] += besterr;
+ }
+}
+
+static float perturb_one(const Vector3 colors[], const float importance[], int np, int ch, int prec, const IntEndpts &old_endpts, IntEndpts &new_endpts,
+ float old_err, int do_b)
+{
+ // we have the old endpoints: old_endpts
+ // we have the perturbed endpoints: new_endpts
+ // we have the temporary endpoints: temp_endpts
+
+ IntEndpts temp_endpts;
+ float min_err = old_err; // start with the best current error
+ int beststep;
+
+ // copy real endpoints so we can perturb them
+ for (int i=0; i<NCHANNELS; ++i) { temp_endpts.A[i] = new_endpts.A[i] = old_endpts.A[i]; temp_endpts.B[i] = new_endpts.B[i] = old_endpts.B[i]; }
+
+ // do a logarithmic search for the best error for this endpoint (which)
+ for (int step = 1 << (prec-1); step; step >>= 1)
+ {
+ bool improved = false;
+ for (int sign = -1; sign <= 1; sign += 2)
+ {
+ if (do_b == 0)
+ {
+ temp_endpts.A[ch] = new_endpts.A[ch] + sign * step;
+ if (temp_endpts.A[ch] < 0 || temp_endpts.A[ch] >= (1 << prec))
+ continue;
+ }
+ else
+ {
+ temp_endpts.B[ch] = new_endpts.B[ch] + sign * step;
+ if (temp_endpts.B[ch] < 0 || temp_endpts.B[ch] >= (1 << prec))
+ continue;
+ }
+
+ float err = map_colors(colors, importance, np, temp_endpts, prec);
+
+ if (err < min_err)
+ {
+ improved = true;
+ min_err = err;
+ beststep = sign * step;
+ }
+ }
+ // if this was an improvement, move the endpoint and continue search from there
+ if (improved)
+ {
+ if (do_b == 0)
+ new_endpts.A[ch] += beststep;
+ else
+ new_endpts.B[ch] += beststep;
+ }
+ }
+ return min_err;
+}
+
+static void optimize_one(const Vector3 colors[], const float importance[], int np, float orig_err, const IntEndpts &orig_endpts, int prec, IntEndpts &opt_endpts)
+{
+ float opt_err = orig_err;
+ for (int ch = 0; ch < NCHANNELS; ++ch)
+ {
+ opt_endpts.A[ch] = orig_endpts.A[ch];
+ opt_endpts.B[ch] = orig_endpts.B[ch];
+ }
+ /*
+ err0 = perturb(rgb0, delta0)
+ err1 = perturb(rgb1, delta1)
+ if (err0 < err1)
+ if (err0 >= initial_error) break
+ rgb0 += delta0
+ next = 1
+ else
+ if (err1 >= initial_error) break
+ rgb1 += delta1
+ next = 0
+ initial_err = map()
+ for (;;)
+ err = perturb(next ? rgb1:rgb0, delta)
+ if (err >= initial_err) break
+ next? rgb1 : rgb0 += delta
+ initial_err = err
+ */
+ IntEndpts new_a, new_b;
+ IntEndpts new_endpt;
+ int do_b;
+
+ // now optimize each channel separately
+ for (int ch = 0; ch < NCHANNELS; ++ch)
+ {
+ // figure out which endpoint when perturbed gives the most improvement and start there
+ // if we just alternate, we can easily end up in a local minima
+ float err0 = perturb_one(colors, importance, np, ch, prec, opt_endpts, new_a, opt_err, 0); // perturb endpt A
+ float err1 = perturb_one(colors, importance, np, ch, prec, opt_endpts, new_b, opt_err, 1); // perturb endpt B
+
+ if (err0 < err1)
+ {
+ if (err0 >= opt_err)
+ continue;
+
+ opt_endpts.A[ch] = new_a.A[ch];
+ opt_err = err0;
+ do_b = 1; // do B next
+ }
+ else
+ {
+ if (err1 >= opt_err)
+ continue;
+ opt_endpts.B[ch] = new_b.B[ch];
+ opt_err = err1;
+ do_b = 0; // do A next
+ }
+
+ // now alternate endpoints and keep trying until there is no improvement
+ for (;;)
+ {
+ float err = perturb_one(colors, importance, np, ch, prec, opt_endpts, new_endpt, opt_err, do_b);
+ if (err >= opt_err)
+ break;
+ if (do_b == 0)
+ opt_endpts.A[ch] = new_endpt.A[ch];
+ else
+ opt_endpts.B[ch] = new_endpt.B[ch];
+ opt_err = err;
+ do_b = 1 - do_b; // now move the other endpoint
+ }
+ }
+}
+
+static void optimize_endpts(const Tile &tile, int shapeindex, const float orig_err[NREGIONS_ONE],
+ const IntEndpts orig_endpts[NREGIONS_ONE], int prec, IntEndpts opt_endpts[NREGIONS_ONE])
+{
+ Vector3 pixels[Tile::TILE_TOTAL];
+ float importance[Tile::TILE_TOTAL];
+ float err = 0;
+
+ for (int region=0; region<NREGIONS_ONE; ++region)
+ {
+ // collect the pixels in the region
+ int np = 0;
+
+ for (int y = 0; y < tile.size_y; y++) {
+ for (int x = 0; x < tile.size_x; x++) {
+ if (REGION(x, y, shapeindex) == region) {
+ pixels[np] = tile.data[y][x];
+ importance[np] = tile.importance_map[y][x];
+ ++np;
+ }
+ }
+ }
+
+ optimize_one(pixels, importance, np, orig_err[region], orig_endpts[region], prec, opt_endpts[region]);
+ }
+}
+
+/* optimization algorithm
+ for each pattern
+ convert endpoints using pattern precision
+ assign indices and get initial error
+ compress indices (and possibly reorder endpoints)
+ transform endpoints
+ if transformed endpoints fit pattern
+ get original endpoints back
+ optimize endpoints, get new endpoints, new indices, and new error // new error will almost always be better
+ compress new indices
+ transform new endpoints
+ if new endpoints fit pattern AND if error is improved
+ emit compressed block with new data
+ else
+ emit compressed block with original data // to try to preserve maximum endpoint precision
+*/
+
+float ZOH::refineone(const Tile &tile, int shapeindex_best, const FltEndpts endpts[NREGIONS_ONE], char *block)
+{
+ float orig_err[NREGIONS_ONE], opt_err[NREGIONS_ONE], orig_toterr, opt_toterr;
+ IntEndpts orig_endpts[NREGIONS_ONE], opt_endpts[NREGIONS_ONE];
+ ComprEndpts compr_orig[NREGIONS_ONE], compr_opt[NREGIONS_ONE];
+ int orig_indices[Tile::TILE_H][Tile::TILE_W], opt_indices[Tile::TILE_H][Tile::TILE_W];
+
+ for (int sp = 0; sp < NPATTERNS; ++sp)
+ {
+ // precisions for all channels need to be the same
+ for (int i=1; i<NCHANNELS; ++i) nvDebugCheck (patterns[sp].chan[0].prec[0] == patterns[sp].chan[i].prec[0]);
+
+ quantize_endpts(endpts, patterns[sp].chan[0].prec[0], orig_endpts);
+ assign_indices(tile, shapeindex_best, orig_endpts, patterns[sp].chan[0].prec[0], orig_indices, orig_err);
+ swap_indices(orig_endpts, orig_indices, shapeindex_best);
+ compress_endpts(orig_endpts, compr_orig, patterns[sp]);
+ if (endpts_fit(orig_endpts, compr_orig, patterns[sp]))
+ {
+ optimize_endpts(tile, shapeindex_best, orig_err, orig_endpts, patterns[sp].chan[0].prec[0], opt_endpts);
+ assign_indices(tile, shapeindex_best, opt_endpts, patterns[sp].chan[0].prec[0], opt_indices, opt_err);
+ swap_indices(opt_endpts, opt_indices, shapeindex_best);
+ compress_endpts(opt_endpts, compr_opt, patterns[sp]);
+ orig_toterr = opt_toterr = 0;
+ for (int i=0; i < NREGIONS_ONE; ++i) { orig_toterr += orig_err[i]; opt_toterr += opt_err[i]; }
+
+ if (endpts_fit(opt_endpts, compr_opt, patterns[sp]) && opt_toterr < orig_toterr)
+ {
+ emit_block(compr_opt, shapeindex_best, patterns[sp], opt_indices, block);
+ return opt_toterr;
+ }
+ else
+ {
+ // either it stopped fitting when we optimized it, or there was no improvement
+ // so go back to the unoptimized endpoints which we know will fit
+ emit_block(compr_orig, shapeindex_best, patterns[sp], orig_indices, block);
+ return orig_toterr;
+ }
+ }
+ }
+
+ nvAssert (false); // "No candidate found, should never happen (refineone.)";
+ return FLT_MAX;
+}
+
+static void generate_palette_unquantized(const FltEndpts endpts[NREGIONS_ONE], Vector3 palette[NREGIONS_ONE][NINDICES])
+{
+ for (int region = 0; region < NREGIONS_ONE; ++region)
+ for (int i = 0; i < NINDICES; ++i)
+ palette[region][i] = Utils::lerp(endpts[region].A, endpts[region].B, i, DENOM);
+}
+
+// generate a palette from unquantized endpoints, then pick best palette color for all pixels in each region, return toterr for all regions combined
+static float map_colors(const Tile &tile, int shapeindex, const FltEndpts endpts[NREGIONS_ONE])
+{
+ // build list of possibles
+ Vector3 palette[NREGIONS_ONE][NINDICES];
+
+ generate_palette_unquantized(endpts, palette);
+
+ float toterr = 0;
+ Vector3 err;
+
+ for (int y = 0; y < tile.size_y; y++)
+ for (int x = 0; x < tile.size_x; x++)
+ {
+ int region = REGION(x,y,shapeindex);
+ float err, besterr;
+
+ besterr = Utils::norm(tile.data[y][x], palette[region][0]) * tile.importance_map[y][x];
+
+ for (int i = 1; i < NINDICES && besterr > 0; ++i)
+ {
+ err = Utils::norm(tile.data[y][x], palette[region][i]) * tile.importance_map[y][x];
+
+ if (err > besterr) // error increased, so we're done searching
+ break;
+ if (err < besterr)
+ besterr = err;
+ }
+ toterr += besterr;
+ }
+ return toterr;
+}
+
+float ZOH::roughone(const Tile &tile, int shapeindex, FltEndpts endpts[NREGIONS_ONE])
+{
+ for (int region=0; region<NREGIONS_ONE; ++region)
+ {
+ int np = 0;
+ Vector3 colors[Tile::TILE_TOTAL];
+ Vector3 mean(0,0,0);
+
+ for (int y = 0; y < tile.size_y; y++) {
+ for (int x = 0; x < tile.size_x; x++) {
+ if (REGION(x,y,shapeindex) == region)
+ {
+ colors[np] = tile.data[y][x];
+ mean += tile.data[y][x];
+ ++np;
+ }
+ }
+ }
+
+ // handle simple cases
+ if (np == 0)
+ {
+ Vector3 zero(0,0,0);
+ endpts[region].A = zero;
+ endpts[region].B = zero;
+ continue;
+ }
+ else if (np == 1)
+ {
+ endpts[region].A = colors[0];
+ endpts[region].B = colors[0];
+ continue;
+ }
+ else if (np == 2)
+ {
+ endpts[region].A = colors[0];
+ endpts[region].B = colors[1];
+ continue;
+ }
+
+ mean /= float(np);
+
+ Vector3 direction = Fit::computePrincipalComponent_EigenSolver(np, colors);
+
+ // project each pixel value along the principal direction
+ float minp = FLT_MAX, maxp = -FLT_MAX;
+ for (int i = 0; i < np; i++)
+ {
+ float dp = dot(colors[i]-mean, direction);
+ if (dp < minp) minp = dp;
+ if (dp > maxp) maxp = dp;
+ }
+
+ // choose as endpoints 2 points along the principal direction that span the projections of all of the pixel values
+ endpts[region].A = mean + minp*direction;
+ endpts[region].B = mean + maxp*direction;
+
+ // clamp endpoints
+ // the argument for clamping is that the actual endpoints need to be clamped and thus we need to choose the best
+ // shape based on endpoints being clamped
+ Utils::clamp(endpts[region].A);
+ Utils::clamp(endpts[region].B);
+ }
+
+ return map_colors(tile, shapeindex, endpts);
+}
+
+float ZOH::compressone(const Tile &t, char *block)
+{
+ int shapeindex_best = 0;
+ FltEndpts endptsbest[NREGIONS_ONE], tempendpts[NREGIONS_ONE];
+ float msebest = FLT_MAX;
+
+ /*
+ collect the mse values that are within 5% of the best values
+ optimize each one and choose the best
+ */
+ // hack for now -- just use the best value WORK
+ for (int i=0; i<NSHAPES && msebest>0.0; ++i)
+ {
+ float mse = roughone(t, i, tempendpts);
+ if (mse < msebest)
+ {
+ msebest = mse;
+ shapeindex_best = i;
+ memcpy(endptsbest, tempendpts, sizeof(endptsbest));
+ }
+
+ }
+ return refineone(t, shapeindex_best, endptsbest, block);
+}
diff --git a/3rdparty/bgfx/3rdparty/nvtt/bc6h/zohtwo.cpp b/3rdparty/bgfx/3rdparty/nvtt/bc6h/zohtwo.cpp
new file mode 100644
index 00000000000..5a142945ba7
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/nvtt/bc6h/zohtwo.cpp
@@ -0,0 +1,883 @@
+/*
+Copyright 2007 nVidia, Inc.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
+
+You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+See the License for the specific language governing permissions and limitations under the License.
+*/
+
+// two regions zoh compress/decompress code
+// Thanks to Jacob Munkberg (jacob@cs.lth.se) for the shortcut of using SVD to do the equivalent of principal components analysis
+
+/* optimization algorithm
+
+ get initial float endpoints
+ convert endpoints using 16 bit precision, transform, and get bit delta. choose likely endpoint compression candidates.
+ note that there will be 1 or 2 candidates; 2 will be chosen when the delta values are close to the max possible.
+ for each EC candidate in order from max precision to smaller precision
+ convert endpoints using the appropriate precision.
+ optimize the endpoints and minimize square error. save the error and index assignments. apply index compression as well.
+ (thus the endpoints and indices are in final form.)
+ transform and get bit delta.
+ if the bit delta fits, exit
+ if we ended up with no candidates somehow, choose the tail set of EC candidates and retry. this should happen hardly ever.
+ add a state variable to nvDebugCheck we only do this once.
+ convert to bit stream.
+ return the error.
+
+ Global optimization
+ order all tiles based on their errors
+ do something special for high-error tiles
+ the goal here is to try to avoid tiling artifacts. but I think this is a research problem. let's just generate an error image...
+
+ display an image that shows partitioning and precision selected for each tile
+*/
+
+#include "bits.h"
+#include "tile.h"
+#include "zoh.h"
+#include "zoh_utils.h"
+
+#include "nvmath/fitting.h"
+#include "nvmath/vector.inl"
+
+#include <string.h> // strlen
+#include <float.h> // FLT_MAX
+
+using namespace nv;
+using namespace ZOH;
+
+#define NINDICES 8
+#define INDEXBITS 3
+#define HIGH_INDEXBIT (1<<(INDEXBITS-1))
+#define DENOM (NINDICES-1)
+
+// WORK: determine optimal traversal pattern to search for best shape -- what does the error curve look like?
+// i.e. can we search shapes in a particular order so we can see the global error minima easily and
+// stop without having to touch all shapes?
+
+#include "shapes_two.h"
+// use only the first 32 available shapes
+#undef NSHAPES
+#undef SHAPEBITS
+#define NSHAPES 32
+#define SHAPEBITS 5
+
+#define POS_TO_X(pos) ((pos)&3)
+#define POS_TO_Y(pos) (((pos)>>2)&3)
+
+#define NDELTA 4
+
+struct Chanpat
+{
+ int prec[NDELTA]; // precision pattern for one channel
+};
+
+struct Pattern
+{
+ Chanpat chan[NCHANNELS]; // allow different bit patterns per channel -- but we still want constant precision per channel
+ int transformed; // if 0, deltas are unsigned and no transform; otherwise, signed and transformed
+ int mode; // associated mode value
+ int modebits; // number of mode bits
+ const char *encoding; // verilog description of encoding for this mode
+};
+
+#define MAXMODEBITS 5
+#define MAXMODES (1<<MAXMODEBITS)
+
+#define NPATTERNS 10
+
+static const Pattern patterns[NPATTERNS] =
+{
+ 11,5,5,5, 11,4,4,4, 11,4,4,4, 1, 0x02, 5, "d[4:0],bz[3],rz[4:0],bz[2],ry[4:0],by[3:0],bz[1],bw[10],bx[3:0],gz[3:0],bz[0],gw[10],gx[3:0],gy[3:0],rw[10],rx[4:0],bw[9:0],gw[9:0],rw[9:0],m[4:0]",
+ 11,4,4,4, 11,5,5,5, 11,4,4,4, 1, 0x06, 5, "d[4:0],bz[3],gy[4],rz[3:0],bz[2],bz[0],ry[3:0],by[3:0],bz[1],bw[10],bx[3:0],gz[3:0],gw[10],gx[4:0],gy[3:0],gz[4],rw[10],rx[3:0],bw[9:0],gw[9:0],rw[9:0],m[4:0]",
+ 11,4,4,4, 11,4,4,4, 11,5,5,5, 1, 0x0a, 5, "d[4:0],bz[3],bz[4],rz[3:0],bz[2:1],ry[3:0],by[3:0],bw[10],bx[4:0],gz[3:0],bz[0],gw[10],gx[3:0],gy[3:0],by[4],rw[10],rx[3:0],bw[9:0],gw[9:0],rw[9:0],m[4:0]",
+ 10,5,5,5, 10,5,5,5, 10,5,5,5, 1, 0x00, 2, "d[4:0],bz[3],rz[4:0],bz[2],ry[4:0],by[3:0],bz[1],bx[4:0],gz[3:0],bz[0],gx[4:0],gy[3:0],gz[4],rx[4:0],bw[9:0],gw[9:0],rw[9:0],bz[4],by[4],gy[4],m[1:0]",
+ 9,5,5,5, 9,5,5,5, 9,5,5,5, 1, 0x0e, 5, "d[4:0],bz[3],rz[4:0],bz[2],ry[4:0],by[3:0],bz[1],bx[4:0],gz[3:0],bz[0],gx[4:0],gy[3:0],gz[4],rx[4:0],bz[4],bw[8:0],gy[4],gw[8:0],by[4],rw[8:0],m[4:0]",
+ 8,6,6,6, 8,5,5,5, 8,5,5,5, 1, 0x12, 5, "d[4:0],rz[5:0],ry[5:0],by[3:0],bz[1],bx[4:0],gz[3:0],bz[0],gx[4:0],gy[3:0],rx[5:0],bz[4:3],bw[7:0],gy[4],bz[2],gw[7:0],by[4],gz[4],rw[7:0],m[4:0]",
+ 8,5,5,5, 8,6,6,6, 8,5,5,5, 1, 0x16, 5, "d[4:0],bz[3],rz[4:0],bz[2],ry[4:0],by[3:0],bz[1],bx[4:0],gz[3:0],gx[5:0],gy[3:0],gz[4],rx[4:0],bz[4],gz[5],bw[7:0],gy[4],gy[5],gw[7:0],by[4],bz[0],rw[7:0],m[4:0]",
+ 8,5,5,5, 8,5,5,5, 8,6,6,6, 1, 0x1a, 5, "d[4:0],bz[3],rz[4:0],bz[2],ry[4:0],by[3:0],bx[5:0],gz[3:0],bz[0],gx[4:0],gy[3:0],gz[4],rx[4:0],bz[4],bz[5],bw[7:0],gy[4],by[5],gw[7:0],by[4],bz[1],rw[7:0],m[4:0]",
+ 7,6,6,6, 7,6,6,6, 7,6,6,6, 1, 0x01, 2, "d[4:0],rz[5:0],ry[5:0],by[3:0],bx[5:0],gz[3:0],gx[5:0],gy[3:0],rx[5:0],bz[4],bz[5],bz[3],bw[6:0],gy[4],bz[2],by[5],gw[6:0],by[4],bz[1:0],rw[6:0],gz[5:4],gy[5],m[1:0]",
+ 6,6,6,6, 6,6,6,6, 6,6,6,6, 0, 0x1e, 5, "d[4:0],rz[5:0],ry[5:0],by[3:0],bx[5:0],gz[3:0],gx[5:0],gy[3:0],rx[5:0],bz[4],bz[5],bz[3],gz[5],bw[5:0],gy[4],bz[2],by[5],gy[5],gw[5:0],by[4],bz[1:0],gz[4],rw[5:0],m[4:0]",
+};
+
+// mapping of mode to the corresponding index in pattern
+// UNUSED ZOH MODES are 0x13, 0x17, 0x1b, 0x1f -- return -2 for these
+static const int mode_to_pat[MAXMODES] = {
+ 3, // 0x00
+ 8, // 0x01
+ 0, // 0x02
+ -1,-1,-1,
+ 1, // 0x06
+ -1,-1,-1,
+ 2, // 0x0a
+ -1,-1,-1,
+ 4, // 0x0e
+ -1,-1,-1,
+ 5, // 0x12
+ -2,-1,-1,
+ 6, // 0x16
+ -2,-1,-1,
+ 7, // 0x1a
+ -2,-1,-1,
+ 9, // 0x1e
+ -2
+};
+
+#define R_0(ep) (ep)[0].A[i]
+#define R_1(ep) (ep)[0].B[i]
+#define R_2(ep) (ep)[1].A[i]
+#define R_3(ep) (ep)[1].B[i]
+#define MASK(n) ((1<<(n))-1)
+
+// compress endpoints
+static void compress_endpts(const IntEndpts in[NREGIONS_TWO], ComprEndpts out[NREGIONS_TWO], const Pattern &p)
+{
+ if (p.transformed)
+ {
+ for (int i=0; i<NCHANNELS; ++i)
+ {
+ R_0(out) = R_0(in) & MASK(p.chan[i].prec[0]);
+ R_1(out) = (R_1(in) - R_0(in)) & MASK(p.chan[i].prec[1]);
+ R_2(out) = (R_2(in) - R_0(in)) & MASK(p.chan[i].prec[2]);
+ R_3(out) = (R_3(in) - R_0(in)) & MASK(p.chan[i].prec[3]);
+ }
+ }
+ else
+ {
+ for (int i=0; i<NCHANNELS; ++i)
+ {
+ R_0(out) = R_0(in) & MASK(p.chan[i].prec[0]);
+ R_1(out) = R_1(in) & MASK(p.chan[i].prec[1]);
+ R_2(out) = R_2(in) & MASK(p.chan[i].prec[2]);
+ R_3(out) = R_3(in) & MASK(p.chan[i].prec[3]);
+ }
+ }
+}
+
+// decompress endpoints
+static void decompress_endpts(const ComprEndpts in[NREGIONS_TWO], IntEndpts out[NREGIONS_TWO], const Pattern &p)
+{
+ bool issigned = Utils::FORMAT == SIGNED_F16;
+
+ if (p.transformed)
+ {
+ for (int i=0; i<NCHANNELS; ++i)
+ {
+ R_0(out) = issigned ? SIGN_EXTEND(R_0(in),p.chan[i].prec[0]) : R_0(in);
+ int t;
+ t = SIGN_EXTEND(R_1(in), p.chan[i].prec[1]);
+ t = (t + R_0(in)) & MASK(p.chan[i].prec[0]);
+ R_1(out) = issigned ? SIGN_EXTEND(t,p.chan[i].prec[0]) : t;
+ t = SIGN_EXTEND(R_2(in), p.chan[i].prec[2]);
+ t = (t + R_0(in)) & MASK(p.chan[i].prec[0]);
+ R_2(out) = issigned ? SIGN_EXTEND(t,p.chan[i].prec[0]) : t;
+ t = SIGN_EXTEND(R_3(in), p.chan[i].prec[3]);
+ t = (t + R_0(in)) & MASK(p.chan[i].prec[0]);
+ R_3(out) = issigned ? SIGN_EXTEND(t,p.chan[i].prec[0]) : t;
+ }
+ }
+ else
+ {
+ for (int i=0; i<NCHANNELS; ++i)
+ {
+ R_0(out) = issigned ? SIGN_EXTEND(R_0(in),p.chan[i].prec[0]) : R_0(in);
+ R_1(out) = issigned ? SIGN_EXTEND(R_1(in),p.chan[i].prec[1]) : R_1(in);
+ R_2(out) = issigned ? SIGN_EXTEND(R_2(in),p.chan[i].prec[2]) : R_2(in);
+ R_3(out) = issigned ? SIGN_EXTEND(R_3(in),p.chan[i].prec[3]) : R_3(in);
+ }
+ }
+}
+
+static void quantize_endpts(const FltEndpts endpts[NREGIONS_TWO], int prec, IntEndpts q_endpts[NREGIONS_TWO])
+{
+ for (int region = 0; region < NREGIONS_TWO; ++region)
+ {
+ q_endpts[region].A[0] = Utils::quantize(endpts[region].A.x, prec);
+ q_endpts[region].A[1] = Utils::quantize(endpts[region].A.y, prec);
+ q_endpts[region].A[2] = Utils::quantize(endpts[region].A.z, prec);
+ q_endpts[region].B[0] = Utils::quantize(endpts[region].B.x, prec);
+ q_endpts[region].B[1] = Utils::quantize(endpts[region].B.y, prec);
+ q_endpts[region].B[2] = Utils::quantize(endpts[region].B.z, prec);
+ }
+}
+
+// swap endpoints as needed to ensure that the indices at index_positions have a 0 high-order bit
+static void swap_indices(IntEndpts endpts[NREGIONS_TWO], int indices[Tile::TILE_H][Tile::TILE_W], int shapeindex)
+{
+ for (int region = 0; region < NREGIONS_TWO; ++region)
+ {
+ int position = SHAPEINDEX_TO_COMPRESSED_INDICES(shapeindex,region);
+
+ int x = POS_TO_X(position);
+ int y = POS_TO_Y(position);
+ nvDebugCheck(REGION(x,y,shapeindex) == region); // double check the table
+ if (indices[y][x] & HIGH_INDEXBIT)
+ {
+ // high bit is set, swap the endpts and indices for this region
+ int t;
+ for (int i=0; i<NCHANNELS; ++i)
+ {
+ t = endpts[region].A[i]; endpts[region].A[i] = endpts[region].B[i]; endpts[region].B[i] = t;
+ }
+
+ for (int y = 0; y < Tile::TILE_H; y++)
+ for (int x = 0; x < Tile::TILE_W; x++)
+ if (REGION(x,y,shapeindex) == region)
+ indices[y][x] = NINDICES - 1 - indices[y][x];
+ }
+ }
+}
+
+// endpoints fit only if the compression was lossless
+static bool endpts_fit(const IntEndpts orig[NREGIONS_TWO], const ComprEndpts compressed[NREGIONS_TWO], const Pattern &p)
+{
+ IntEndpts uncompressed[NREGIONS_TWO];
+
+ decompress_endpts(compressed, uncompressed, p);
+
+ for (int j=0; j<NREGIONS_TWO; ++j)
+ {
+ for (int i=0; i<NCHANNELS; ++i)
+ {
+ if (orig[j].A[i] != uncompressed[j].A[i]) return false;
+ if (orig[j].B[i] != uncompressed[j].B[i]) return false;
+ }
+ }
+ return true;
+}
+
+static void write_header(const ComprEndpts endpts[NREGIONS_TWO], int shapeindex, const Pattern &p, Bits &out)
+{
+ // interpret the verilog backwards and process it
+ int m = p.mode;
+ int d = shapeindex;
+ int rw = endpts[0].A[0], rx = endpts[0].B[0], ry = endpts[1].A[0], rz = endpts[1].B[0];
+ int gw = endpts[0].A[1], gx = endpts[0].B[1], gy = endpts[1].A[1], gz = endpts[1].B[1];
+ int bw = endpts[0].A[2], bx = endpts[0].B[2], by = endpts[1].A[2], bz = endpts[1].B[2];
+ int ptr = int(strlen(p.encoding));
+ while (ptr)
+ {
+ Field field;
+ int endbit, len;
+
+ // !!!UNDONE: get rid of string parsing!!!
+ Utils::parse(p.encoding, ptr, field, endbit, len);
+ switch(field)
+ {
+ case FIELD_M: out.write( m >> endbit, len); break;
+ case FIELD_D: out.write( d >> endbit, len); break;
+ case FIELD_RW: out.write(rw >> endbit, len); break;
+ case FIELD_RX: out.write(rx >> endbit, len); break;
+ case FIELD_RY: out.write(ry >> endbit, len); break;
+ case FIELD_RZ: out.write(rz >> endbit, len); break;
+ case FIELD_GW: out.write(gw >> endbit, len); break;
+ case FIELD_GX: out.write(gx >> endbit, len); break;
+ case FIELD_GY: out.write(gy >> endbit, len); break;
+ case FIELD_GZ: out.write(gz >> endbit, len); break;
+ case FIELD_BW: out.write(bw >> endbit, len); break;
+ case FIELD_BX: out.write(bx >> endbit, len); break;
+ case FIELD_BY: out.write(by >> endbit, len); break;
+ case FIELD_BZ: out.write(bz >> endbit, len); break;
+ default: nvUnreachable();
+ }
+ }
+}
+
+static bool read_header(Bits &in, ComprEndpts endpts[NREGIONS_TWO], int &shapeindex, Pattern &p)
+{
+ // reading isn't quite symmetric with writing -- we don't know the encoding until we decode the mode
+ int mode = in.read(2);
+ if (mode != 0x00 && mode != 0x01)
+ mode = (in.read(3) << 2) | mode;
+
+ int pat_index = mode_to_pat[mode];
+
+ if (pat_index == -2)
+ return false; // reserved mode found
+
+ nvDebugCheck (pat_index >= 0 && pat_index < NPATTERNS);
+ nvDebugCheck (in.getptr() == patterns[pat_index].modebits);
+
+ p = patterns[pat_index];
+
+ int d;
+ int rw, rx, ry, rz;
+ int gw, gx, gy, gz;
+ int bw, bx, by, bz;
+
+ d = 0;
+ rw = rx = ry = rz = 0;
+ gw = gx = gy = gz = 0;
+ bw = bx = by = bz = 0;
+
+ int ptr = int(strlen(p.encoding));
+
+ while (ptr)
+ {
+ Field field;
+ int endbit, len;
+
+ // !!!UNDONE: get rid of string parsing!!!
+ Utils::parse(p.encoding, ptr, field, endbit, len);
+
+ switch(field)
+ {
+ case FIELD_M: break; // already processed so ignore
+ case FIELD_D: d |= in.read(len) << endbit; break;
+ case FIELD_RW: rw |= in.read(len) << endbit; break;
+ case FIELD_RX: rx |= in.read(len) << endbit; break;
+ case FIELD_RY: ry |= in.read(len) << endbit; break;
+ case FIELD_RZ: rz |= in.read(len) << endbit; break;
+ case FIELD_GW: gw |= in.read(len) << endbit; break;
+ case FIELD_GX: gx |= in.read(len) << endbit; break;
+ case FIELD_GY: gy |= in.read(len) << endbit; break;
+ case FIELD_GZ: gz |= in.read(len) << endbit; break;
+ case FIELD_BW: bw |= in.read(len) << endbit; break;
+ case FIELD_BX: bx |= in.read(len) << endbit; break;
+ case FIELD_BY: by |= in.read(len) << endbit; break;
+ case FIELD_BZ: bz |= in.read(len) << endbit; break;
+ default: nvUnreachable();
+ }
+ }
+
+ nvDebugCheck (in.getptr() == 128 - 46);
+
+ shapeindex = d;
+ endpts[0].A[0] = rw; endpts[0].B[0] = rx; endpts[1].A[0] = ry; endpts[1].B[0] = rz;
+ endpts[0].A[1] = gw; endpts[0].B[1] = gx; endpts[1].A[1] = gy; endpts[1].B[1] = gz;
+ endpts[0].A[2] = bw; endpts[0].B[2] = bx; endpts[1].A[2] = by; endpts[1].B[2] = bz;
+
+ return true;
+}
+
+static void write_indices(const int indices[Tile::TILE_H][Tile::TILE_W], int shapeindex, Bits &out)
+{
+ int positions[NREGIONS_TWO];
+
+ for (int r = 0; r < NREGIONS_TWO; ++r)
+ positions[r] = SHAPEINDEX_TO_COMPRESSED_INDICES(shapeindex,r);
+
+ for (int pos = 0; pos < Tile::TILE_TOTAL; ++pos)
+ {
+ int x = POS_TO_X(pos);
+ int y = POS_TO_Y(pos);
+
+ bool match = false;
+
+ for (int r = 0; r < NREGIONS_TWO; ++r)
+ if (positions[r] == pos) { match = true; break; }
+
+ out.write(indices[y][x], INDEXBITS - (match ? 1 : 0));
+ }
+}
+
+static void emit_block(const ComprEndpts compr_endpts[NREGIONS_TWO], int shapeindex, const Pattern &p, const int indices[Tile::TILE_H][Tile::TILE_W], char *block)
+{
+ Bits out(block, ZOH::BITSIZE);
+
+ write_header(compr_endpts, shapeindex, p, out);
+
+ write_indices(indices, shapeindex, out);
+
+ nvDebugCheck(out.getptr() == ZOH::BITSIZE);
+}
+
+static void generate_palette_quantized(const IntEndpts &endpts, int prec, Vector3 palette[NINDICES])
+{
+ // scale endpoints
+ int a, b; // really need a IntVector3...
+
+ a = Utils::unquantize(endpts.A[0], prec);
+ b = Utils::unquantize(endpts.B[0], prec);
+
+ // interpolate
+ for (int i = 0; i < NINDICES; ++i)
+ palette[i].x = float(Utils::finish_unquantize(Utils::lerp(a, b, i, DENOM), prec));
+
+ a = Utils::unquantize(endpts.A[1], prec);
+ b = Utils::unquantize(endpts.B[1], prec);
+
+ // interpolate
+ for (int i = 0; i < NINDICES; ++i)
+ palette[i].y = float(Utils::finish_unquantize(Utils::lerp(a, b, i, DENOM), prec));
+
+ a = Utils::unquantize(endpts.A[2], prec);
+ b = Utils::unquantize(endpts.B[2], prec);
+
+ // interpolate
+ for (int i = 0; i < NINDICES; ++i)
+ palette[i].z = float(Utils::finish_unquantize(Utils::lerp(a, b, i, DENOM), prec));
+}
+
+static void read_indices(Bits &in, int shapeindex, int indices[Tile::TILE_H][Tile::TILE_W])
+{
+ int positions[NREGIONS_TWO];
+
+ for (int r = 0; r < NREGIONS_TWO; ++r)
+ positions[r] = SHAPEINDEX_TO_COMPRESSED_INDICES(shapeindex,r);
+
+ for (int pos = 0; pos < Tile::TILE_TOTAL; ++pos)
+ {
+ int x = POS_TO_X(pos);
+ int y = POS_TO_Y(pos);
+
+ bool match = false;
+
+ for (int r = 0; r < NREGIONS_TWO; ++r)
+ if (positions[r] == pos) { match = true; break; }
+
+ indices[y][x]= in.read(INDEXBITS - (match ? 1 : 0));
+ }
+}
+
+void ZOH::decompresstwo(const char *block, Tile &t)
+{
+ Bits in(block, ZOH::BITSIZE);
+
+ Pattern p;
+ IntEndpts endpts[NREGIONS_TWO];
+ ComprEndpts compr_endpts[NREGIONS_TWO];
+ int shapeindex;
+
+ if (!read_header(in, compr_endpts, shapeindex, p))
+ {
+ // reserved mode, return all zeroes
+ for (int y = 0; y < Tile::TILE_H; y++)
+ for (int x = 0; x < Tile::TILE_W; x++)
+ t.data[y][x] = Vector3(0.0f);
+
+ return;
+ }
+
+ decompress_endpts(compr_endpts, endpts, p);
+
+ Vector3 palette[NREGIONS_TWO][NINDICES];
+ for (int r = 0; r < NREGIONS_TWO; ++r)
+ generate_palette_quantized(endpts[r], p.chan[0].prec[0], &palette[r][0]);
+
+ int indices[Tile::TILE_H][Tile::TILE_W];
+
+ read_indices(in, shapeindex, indices);
+
+ nvDebugCheck(in.getptr() == ZOH::BITSIZE);
+
+ // lookup
+ for (int y = 0; y < Tile::TILE_H; y++)
+ for (int x = 0; x < Tile::TILE_W; x++)
+ t.data[y][x] = palette[REGION(x,y,shapeindex)][indices[y][x]];
+}
+
+// given a collection of colors and quantized endpoints, generate a palette, choose best entries, and return a single toterr
+static float map_colors(const Vector3 colors[], const float importance[], int np, const IntEndpts &endpts, int prec)
+{
+ Vector3 palette[NINDICES];
+ float toterr = 0;
+ Vector3 err;
+
+ generate_palette_quantized(endpts, prec, palette);
+
+ for (int i = 0; i < np; ++i)
+ {
+ float err, besterr;
+
+ besterr = Utils::norm(colors[i], palette[0]) * importance[i];
+
+ for (int j = 1; j < NINDICES && besterr > 0; ++j)
+ {
+ err = Utils::norm(colors[i], palette[j]) * importance[i];
+
+ if (err > besterr) // error increased, so we're done searching
+ break;
+ if (err < besterr)
+ besterr = err;
+ }
+ toterr += besterr;
+ }
+ return toterr;
+}
+
+// assign indices given a tile, shape, and quantized endpoints, return toterr for each region
+static void assign_indices(const Tile &tile, int shapeindex, IntEndpts endpts[NREGIONS_TWO], int prec,
+ int indices[Tile::TILE_H][Tile::TILE_W], float toterr[NREGIONS_TWO])
+{
+ // build list of possibles
+ Vector3 palette[NREGIONS_TWO][NINDICES];
+
+ for (int region = 0; region < NREGIONS_TWO; ++region)
+ {
+ generate_palette_quantized(endpts[region], prec, &palette[region][0]);
+ toterr[region] = 0;
+ }
+
+ Vector3 err;
+
+ for (int y = 0; y < tile.size_y; y++)
+ for (int x = 0; x < tile.size_x; x++)
+ {
+ int region = REGION(x,y,shapeindex);
+ float err, besterr;
+
+ besterr = Utils::norm(tile.data[y][x], palette[region][0]);
+ indices[y][x] = 0;
+
+ for (int i = 1; i < NINDICES && besterr > 0; ++i)
+ {
+ err = Utils::norm(tile.data[y][x], palette[region][i]);
+
+ if (err > besterr) // error increased, so we're done searching
+ break;
+ if (err < besterr)
+ {
+ besterr = err;
+ indices[y][x] = i;
+ }
+ }
+ toterr[region] += besterr;
+ }
+}
+
+static float perturb_one(const Vector3 colors[], const float importance[], int np, int ch, int prec, const IntEndpts &old_endpts, IntEndpts &new_endpts,
+ float old_err, int do_b)
+{
+ // we have the old endpoints: old_endpts
+ // we have the perturbed endpoints: new_endpts
+ // we have the temporary endpoints: temp_endpts
+
+ IntEndpts temp_endpts;
+ float min_err = old_err; // start with the best current error
+ int beststep;
+
+ // copy real endpoints so we can perturb them
+ for (int i=0; i<NCHANNELS; ++i) { temp_endpts.A[i] = new_endpts.A[i] = old_endpts.A[i]; temp_endpts.B[i] = new_endpts.B[i] = old_endpts.B[i]; }
+
+ // do a logarithmic search for the best error for this endpoint (which)
+ for (int step = 1 << (prec-1); step; step >>= 1)
+ {
+ bool improved = false;
+ for (int sign = -1; sign <= 1; sign += 2)
+ {
+ if (do_b == 0)
+ {
+ temp_endpts.A[ch] = new_endpts.A[ch] + sign * step;
+ if (temp_endpts.A[ch] < 0 || temp_endpts.A[ch] >= (1 << prec))
+ continue;
+ }
+ else
+ {
+ temp_endpts.B[ch] = new_endpts.B[ch] + sign * step;
+ if (temp_endpts.B[ch] < 0 || temp_endpts.B[ch] >= (1 << prec))
+ continue;
+ }
+
+ float err = map_colors(colors, importance, np, temp_endpts, prec);
+
+ if (err < min_err)
+ {
+ improved = true;
+ min_err = err;
+ beststep = sign * step;
+ }
+ }
+ // if this was an improvement, move the endpoint and continue search from there
+ if (improved)
+ {
+ if (do_b == 0)
+ new_endpts.A[ch] += beststep;
+ else
+ new_endpts.B[ch] += beststep;
+ }
+ }
+ return min_err;
+}
+
+static void optimize_one(const Vector3 colors[], const float importance[], int np, float orig_err, const IntEndpts &orig_endpts, int prec, IntEndpts &opt_endpts)
+{
+ float opt_err = orig_err;
+ for (int ch = 0; ch < NCHANNELS; ++ch)
+ {
+ opt_endpts.A[ch] = orig_endpts.A[ch];
+ opt_endpts.B[ch] = orig_endpts.B[ch];
+ }
+ /*
+ err0 = perturb(rgb0, delta0)
+ err1 = perturb(rgb1, delta1)
+ if (err0 < err1)
+ if (err0 >= initial_error) break
+ rgb0 += delta0
+ next = 1
+ else
+ if (err1 >= initial_error) break
+ rgb1 += delta1
+ next = 0
+ initial_err = map()
+ for (;;)
+ err = perturb(next ? rgb1:rgb0, delta)
+ if (err >= initial_err) break
+ next? rgb1 : rgb0 += delta
+ initial_err = err
+ */
+ IntEndpts new_a, new_b;
+ IntEndpts new_endpt;
+ int do_b;
+
+ // now optimize each channel separately
+ for (int ch = 0; ch < NCHANNELS; ++ch)
+ {
+ // figure out which endpoint when perturbed gives the most improvement and start there
+ // if we just alternate, we can easily end up in a local minima
+ float err0 = perturb_one(colors, importance, np, ch, prec, opt_endpts, new_a, opt_err, 0); // perturb endpt A
+ float err1 = perturb_one(colors, importance, np, ch, prec, opt_endpts, new_b, opt_err, 1); // perturb endpt B
+
+ if (err0 < err1)
+ {
+ if (err0 >= opt_err)
+ continue;
+
+ opt_endpts.A[ch] = new_a.A[ch];
+ opt_err = err0;
+ do_b = 1; // do B next
+ }
+ else
+ {
+ if (err1 >= opt_err)
+ continue;
+ opt_endpts.B[ch] = new_b.B[ch];
+ opt_err = err1;
+ do_b = 0; // do A next
+ }
+
+ // now alternate endpoints and keep trying until there is no improvement
+ for (;;)
+ {
+ float err = perturb_one(colors, importance, np, ch, prec, opt_endpts, new_endpt, opt_err, do_b);
+ if (err >= opt_err)
+ break;
+ if (do_b == 0)
+ opt_endpts.A[ch] = new_endpt.A[ch];
+ else
+ opt_endpts.B[ch] = new_endpt.B[ch];
+ opt_err = err;
+ do_b = 1 - do_b; // now move the other endpoint
+ }
+ }
+}
+
+static void optimize_endpts(const Tile &tile, int shapeindex, const float orig_err[NREGIONS_TWO],
+ const IntEndpts orig_endpts[NREGIONS_TWO], int prec, IntEndpts opt_endpts[NREGIONS_TWO])
+{
+ Vector3 pixels[Tile::TILE_TOTAL];
+ float importance[Tile::TILE_TOTAL];
+ float err = 0;
+
+ for (int region=0; region<NREGIONS_TWO; ++region)
+ {
+ // collect the pixels in the region
+ int np = 0;
+
+ for (int y = 0; y < tile.size_y; y++)
+ for (int x = 0; x < tile.size_x; x++)
+ if (REGION(x,y,shapeindex) == region)
+ {
+ pixels[np] = tile.data[y][x];
+ importance[np] = tile.importance_map[y][x];
+ ++np;
+ }
+
+ optimize_one(pixels, importance, np, orig_err[region], orig_endpts[region], prec, opt_endpts[region]);
+ }
+}
+
+/* optimization algorithm
+ for each pattern
+ convert endpoints using pattern precision
+ assign indices and get initial error
+ compress indices (and possibly reorder endpoints)
+ transform endpoints
+ if transformed endpoints fit pattern
+ get original endpoints back
+ optimize endpoints, get new endpoints, new indices, and new error // new error will almost always be better
+ compress new indices
+ transform new endpoints
+ if new endpoints fit pattern AND if error is improved
+ emit compressed block with new data
+ else
+ emit compressed block with original data // to try to preserve maximum endpoint precision
+*/
+
+float ZOH::refinetwo(const Tile &tile, int shapeindex_best, const FltEndpts endpts[NREGIONS_TWO], char *block)
+{
+ float orig_err[NREGIONS_TWO], opt_err[NREGIONS_TWO], orig_toterr, opt_toterr;
+ IntEndpts orig_endpts[NREGIONS_TWO], opt_endpts[NREGIONS_TWO];
+ ComprEndpts compr_orig[NREGIONS_TWO], compr_opt[NREGIONS_TWO];
+ int orig_indices[Tile::TILE_H][Tile::TILE_W], opt_indices[Tile::TILE_H][Tile::TILE_W];
+
+ for (int sp = 0; sp < NPATTERNS; ++sp)
+ {
+ // precisions for all channels need to be the same
+ for (int i=1; i<NCHANNELS; ++i) nvDebugCheck (patterns[sp].chan[0].prec[0] == patterns[sp].chan[i].prec[0]);
+
+ quantize_endpts(endpts, patterns[sp].chan[0].prec[0], orig_endpts);
+ assign_indices(tile, shapeindex_best, orig_endpts, patterns[sp].chan[0].prec[0], orig_indices, orig_err);
+ swap_indices(orig_endpts, orig_indices, shapeindex_best);
+ compress_endpts(orig_endpts, compr_orig, patterns[sp]);
+ if (endpts_fit(orig_endpts, compr_orig, patterns[sp]))
+ {
+ optimize_endpts(tile, shapeindex_best, orig_err, orig_endpts, patterns[sp].chan[0].prec[0], opt_endpts);
+ assign_indices(tile, shapeindex_best, opt_endpts, patterns[sp].chan[0].prec[0], opt_indices, opt_err);
+ swap_indices(opt_endpts, opt_indices, shapeindex_best);
+ compress_endpts(opt_endpts, compr_opt, patterns[sp]);
+ orig_toterr = opt_toterr = 0;
+ for (int i=0; i < NREGIONS_TWO; ++i) { orig_toterr += orig_err[i]; opt_toterr += opt_err[i]; }
+ if (endpts_fit(opt_endpts, compr_opt, patterns[sp]) && opt_toterr < orig_toterr)
+ {
+ emit_block(compr_opt, shapeindex_best, patterns[sp], opt_indices, block);
+ return opt_toterr;
+ }
+ else
+ {
+ // either it stopped fitting when we optimized it, or there was no improvement
+ // so go back to the unoptimized endpoints which we know will fit
+ emit_block(compr_orig, shapeindex_best, patterns[sp], orig_indices, block);
+ return orig_toterr;
+ }
+ }
+ }
+ nvAssert(false); //throw "No candidate found, should never happen (refinetwo.)";
+ return FLT_MAX;
+}
+
+static void generate_palette_unquantized(const FltEndpts endpts[NREGIONS_TWO], Vector3 palette[NREGIONS_TWO][NINDICES])
+{
+ for (int region = 0; region < NREGIONS_TWO; ++region)
+ for (int i = 0; i < NINDICES; ++i)
+ palette[region][i] = Utils::lerp(endpts[region].A, endpts[region].B, i, DENOM);
+}
+
+// generate a palette from unquantized endpoints, then pick best palette color for all pixels in each region, return toterr for all regions combined
+static float map_colors(const Tile &tile, int shapeindex, const FltEndpts endpts[NREGIONS_TWO])
+{
+ // build list of possibles
+ Vector3 palette[NREGIONS_TWO][NINDICES];
+
+ generate_palette_unquantized(endpts, palette);
+
+ float toterr = 0;
+ Vector3 err;
+
+ for (int y = 0; y < tile.size_y; y++)
+ for (int x = 0; x < tile.size_x; x++)
+ {
+ int region = REGION(x,y,shapeindex);
+ float err, besterr;
+
+ besterr = Utils::norm(tile.data[y][x], palette[region][0]) * tile.importance_map[y][x];
+
+ for (int i = 1; i < NINDICES && besterr > 0; ++i)
+ {
+ err = Utils::norm(tile.data[y][x], palette[region][i]) * tile.importance_map[y][x];
+
+ if (err > besterr) // error increased, so we're done searching
+ break;
+ if (err < besterr)
+ besterr = err;
+ }
+ toterr += besterr;
+ }
+ return toterr;
+}
+
+float ZOH::roughtwo(const Tile &tile, int shapeindex, FltEndpts endpts[NREGIONS_TWO])
+{
+ for (int region=0; region<NREGIONS_TWO; ++region)
+ {
+ int np = 0;
+ Vector3 colors[Tile::TILE_TOTAL];
+ Vector3 mean(0,0,0);
+
+ for (int y = 0; y < tile.size_y; y++)
+ for (int x = 0; x < tile.size_x; x++)
+ if (REGION(x,y,shapeindex) == region)
+ {
+ colors[np] = tile.data[y][x];
+ mean += tile.data[y][x];
+ ++np;
+ }
+
+ // handle simple cases
+ if (np == 0)
+ {
+ Vector3 zero(0,0,0);
+ endpts[region].A = zero;
+ endpts[region].B = zero;
+ continue;
+ }
+ else if (np == 1)
+ {
+ endpts[region].A = colors[0];
+ endpts[region].B = colors[0];
+ continue;
+ }
+ else if (np == 2)
+ {
+ endpts[region].A = colors[0];
+ endpts[region].B = colors[1];
+ continue;
+ }
+
+ mean /= float(np);
+
+ Vector3 direction = Fit::computePrincipalComponent_EigenSolver(np, colors);
+
+ // project each pixel value along the principal direction
+ float minp = FLT_MAX, maxp = -FLT_MAX;
+ for (int i = 0; i < np; i++)
+ {
+ float dp = dot(colors[i]-mean, direction);
+ if (dp < minp) minp = dp;
+ if (dp > maxp) maxp = dp;
+ }
+
+ // choose as endpoints 2 points along the principal direction that span the projections of all of the pixel values
+ endpts[region].A = mean + minp*direction;
+ endpts[region].B = mean + maxp*direction;
+
+ // clamp endpoints
+ // the argument for clamping is that the actual endpoints need to be clamped and thus we need to choose the best
+ // shape based on endpoints being clamped
+ Utils::clamp(endpts[region].A);
+ Utils::clamp(endpts[region].B);
+ }
+
+ return map_colors(tile, shapeindex, endpts);
+}
+
+float ZOH::compresstwo(const Tile &t, char *block)
+{
+ int shapeindex_best = 0;
+ FltEndpts endptsbest[NREGIONS_TWO], tempendpts[NREGIONS_TWO];
+ float msebest = FLT_MAX;
+
+ /*
+ collect the mse values that are within 5% of the best values
+ optimize each one and choose the best
+ */
+ // hack for now -- just use the best value WORK
+ for (int i=0; i<NSHAPES && msebest>0.0; ++i)
+ {
+ float mse = roughtwo(t, i, tempendpts);
+ if (mse < msebest)
+ {
+ msebest = mse;
+ shapeindex_best = i;
+ memcpy(endptsbest, tempendpts, sizeof(endptsbest));
+ }
+
+ }
+ return refinetwo(t, shapeindex_best, endptsbest, block);
+}
+
diff --git a/3rdparty/bgfx/3rdparty/nvtt/bc7/avpcl.cpp b/3rdparty/bgfx/3rdparty/nvtt/bc7/avpcl.cpp
new file mode 100644
index 00000000000..8e0b1695f22
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/nvtt/bc7/avpcl.cpp
@@ -0,0 +1,264 @@
+/*
+Copyright 2007 nVidia, Inc.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
+
+You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+See the License for the specific language governing permissions and limitations under the License.
+*/
+
+// the avpcl compressor and decompressor
+
+#include "tile.h"
+#include "avpcl.h"
+#include "nvcore/debug.h"
+#include "nvmath/vector.inl"
+#include <string.h>
+#include <float.h>
+
+using namespace nv;
+using namespace AVPCL;
+
+// global flags
+bool AVPCL::flag_premult = false;
+bool AVPCL::flag_nonuniform = false;
+bool AVPCL::flag_nonuniform_ati = false;
+
+// global mode
+bool AVPCL::mode_rgb = false; // true if image had constant alpha = 255
+
+void AVPCL::compress(const Tile &t, char *block)
+{
+ char tempblock[AVPCL::BLOCKSIZE];
+ float msebest = FLT_MAX;
+
+ float mse_mode0 = AVPCL::compress_mode0(t, tempblock); if(mse_mode0 < msebest) { msebest = mse_mode0; memcpy(block, tempblock, AVPCL::BLOCKSIZE); }
+ float mse_mode1 = AVPCL::compress_mode1(t, tempblock); if(mse_mode1 < msebest) { msebest = mse_mode1; memcpy(block, tempblock, AVPCL::BLOCKSIZE); }
+ float mse_mode2 = AVPCL::compress_mode2(t, tempblock); if(mse_mode2 < msebest) { msebest = mse_mode2; memcpy(block, tempblock, AVPCL::BLOCKSIZE); }
+ float mse_mode3 = AVPCL::compress_mode3(t, tempblock); if(mse_mode3 < msebest) { msebest = mse_mode3; memcpy(block, tempblock, AVPCL::BLOCKSIZE); }
+ float mse_mode4 = AVPCL::compress_mode4(t, tempblock); if(mse_mode4 < msebest) { msebest = mse_mode4; memcpy(block, tempblock, AVPCL::BLOCKSIZE); }
+ float mse_mode5 = AVPCL::compress_mode5(t, tempblock); if(mse_mode5 < msebest) { msebest = mse_mode5; memcpy(block, tempblock, AVPCL::BLOCKSIZE); }
+ float mse_mode6 = AVPCL::compress_mode6(t, tempblock); if(mse_mode6 < msebest) { msebest = mse_mode6; memcpy(block, tempblock, AVPCL::BLOCKSIZE); }
+ float mse_mode7 = AVPCL::compress_mode7(t, tempblock); if(mse_mode7 < msebest) { msebest = mse_mode7; memcpy(block, tempblock, AVPCL::BLOCKSIZE); }
+
+ /*if (errfile)
+ {
+ float errs[21];
+ int nerrs = 8;
+ errs[0] = mse_mode0;
+ errs[1] = mse_mode1;
+ errs[2] = mse_mode2;
+ errs[3] = mse_mode3;
+ errs[4] = mse_mode4;
+ errs[5] = mse_mode5;
+ errs[6] = mse_mode6;
+ errs[7] = mse_mode7;
+ if (fwrite(errs, sizeof(float), nerrs, errfile) != nerrs)
+ throw "Write error on error file";
+ }*/
+}
+
+/*
+static int getbit(char *b, int start)
+{
+ if (start < 0 || start >= 128) return 0; // out of range
+
+ int ix = start >> 3;
+ return (b[ix] & (1 << (start & 7))) != 0;
+}
+
+static int getbits(char *b, int start, int len)
+{
+ int out = 0;
+ for (int i=0; i<len; ++i)
+ out |= getbit(b, start+i) << i;
+ return out;
+}
+
+static void setbit(char *b, int start, int bit)
+{
+ if (start < 0 || start >= 128) return; // out of range
+
+ int ix = start >> 3;
+
+ if (bit & 1)
+ b[ix] |= (1 << (start & 7));
+ else
+ b[ix] &= ~(1 << (start & 7));
+}
+
+static void setbits(char *b, int start, int len, int bits)
+{
+ for (int i=0; i<len; ++i)
+ setbit(b, start+i, bits >> i);
+}
+*/
+
+void AVPCL::decompress(const char *cblock, Tile &t)
+{
+ char block[AVPCL::BLOCKSIZE];
+ memcpy(block, cblock, AVPCL::BLOCKSIZE);
+
+ switch(getmode(block))
+ {
+ case 0: AVPCL::decompress_mode0(block, t); break;
+ case 1: AVPCL::decompress_mode1(block, t); break;
+ case 2: AVPCL::decompress_mode2(block, t); break;
+ case 3: AVPCL::decompress_mode3(block, t); break;
+ case 4: AVPCL::decompress_mode4(block, t); break;
+ case 5: AVPCL::decompress_mode5(block, t); break;
+ case 6: AVPCL::decompress_mode6(block, t); break;
+ case 7: AVPCL::decompress_mode7(block, t); break;
+ case 8: // return a black tile if you get a reserved mode
+ for (int y=0; y<Tile::TILE_H; ++y)
+ for (int x=0; x<Tile::TILE_W; ++x)
+ t.data[y][x].set(0, 0, 0, 0);
+ break;
+ default: nvUnreachable();
+ }
+}
+
+/*
+void AVPCL::compress(string inf, string avpclf, string errf)
+{
+ Array2D<RGBA> pixels;
+ int w, h;
+ char block[AVPCL::BLOCKSIZE];
+
+ Targa::read(inf, pixels, w, h);
+ FILE *avpclfile = fopen(avpclf.c_str(), "wb");
+ if (avpclfile == NULL) throw "Unable to open .avpcl file for write";
+ FILE *errfile = NULL;
+ if (errf != "")
+ {
+ errfile = fopen(errf.c_str(), "wb");
+ if (errfile == NULL) throw "Unable to open error file for write";
+ }
+
+ // Look at alpha channel and override the premult flag if alpha is constant (but only if premult is set)
+ if (AVPCL::flag_premult)
+ {
+ if (AVPCL::mode_rgb)
+ {
+ AVPCL::flag_premult = false;
+ cout << endl << "NOTE: Source image alpha is constant 255, turning off premultiplied-alpha error metric." << endl << endl;
+ }
+ }
+
+ // stuff for progress bar O.o
+ int ntiles = ((h+Tile::TILE_H-1)/Tile::TILE_H)*((w+Tile::TILE_W-1)/Tile::TILE_W);
+ int tilecnt = 0;
+ clock_t start, prev, cur;
+
+ start = prev = clock();
+
+ // convert to tiles and compress each tile
+ for (int y=0; y<h; y+=Tile::TILE_H)
+ {
+ int ysize = min(Tile::TILE_H, h-y);
+ for (int x=0; x<w; x+=Tile::TILE_W)
+ {
+ if ((tilecnt%100) == 0) { cur = clock(); printf("Progress %d of %d, %5.2f seconds per 100 tiles\r", tilecnt, ntiles, float(cur-prev)/CLOCKS_PER_SEC); fflush(stdout); prev = cur; }
+
+ int xsize = min(Tile::TILE_W, w-x);
+ Tile t(xsize, ysize);
+
+ t.insert(pixels, x, y);
+
+ AVPCL::compress(t, block, errfile);
+ if (fwrite(block, sizeof(char), AVPCL::BLOCKSIZE, avpclfile) != AVPCL::BLOCKSIZE)
+ throw "File error on write";
+
+ // progress bar
+ ++tilecnt;
+ }
+ }
+
+ cur = clock();
+ printf("\nTotal time to compress: %.2f seconds\n\n", float(cur-start)/CLOCKS_PER_SEC); // advance to next line finally
+
+ if (fclose(avpclfile)) throw "Close failed on .avpcl file";
+ if (errfile && fclose(errfile)) throw "Close failed on error file";
+}
+
+static int str2int(std::string s)
+{
+ int thing;
+ std::stringstream str (stringstream::in | stringstream::out);
+ str << s;
+ str >> thing;
+ return thing;
+}
+
+// avpcl file name is ...-w-h-RGB[A].avpcl, extract width and height
+static void extract(string avpclf, int &w, int &h, bool &mode_rgb)
+{
+ size_t n = avpclf.rfind('.', avpclf.length()-1);
+ size_t n1 = avpclf.rfind('-', n-1);
+ size_t n2 = avpclf.rfind('-', n1-1);
+ size_t n3 = avpclf.rfind('-', n2-1);
+ // ...-wwww-hhhh-RGB[A].avpcl
+ // ^ ^ ^ ^
+ // n3 n2 n1 n n3<n2<n1<n
+ string width = avpclf.substr(n3+1, n2-n3-1);
+ w = str2int(width);
+ string height = avpclf.substr(n2+1, n1-n2-1);
+ h = str2int(height);
+ string mode = avpclf.substr(n1+1, n-n1-1);
+ mode_rgb = mode == "RGB";
+}
+
+static int modehist[8];
+
+static void stats(char block[AVPCL::BLOCKSIZE])
+{
+ int m = AVPCL::getmode(block);
+ modehist[m]++;
+}
+
+static void printstats()
+{
+ printf("\nMode histogram: "); for (int i=0; i<8; ++i) { printf("%d,", modehist[i]); }
+ printf("\n");
+}
+
+void AVPCL::decompress(string avpclf, string outf)
+{
+ Array2D<RGBA> pixels;
+ int w, h;
+ char block[AVPCL::BLOCKSIZE];
+
+ extract(avpclf, w, h, AVPCL::mode_rgb);
+ FILE *avpclfile = fopen(avpclf.c_str(), "rb");
+ if (avpclfile == NULL) throw "Unable to open .avpcl file for read";
+ pixels.resizeErase(h, w);
+
+ // convert to tiles and decompress each tile
+ for (int y=0; y<h; y+=Tile::TILE_H)
+ {
+ int ysize = min(Tile::TILE_H, h-y);
+ for (int x=0; x<w; x+=Tile::TILE_W)
+ {
+ int xsize = min(Tile::TILE_W, w-x);
+ Tile t(xsize, ysize);
+
+ if (fread(block, sizeof(char), AVPCL::BLOCKSIZE, avpclfile) != AVPCL::BLOCKSIZE)
+ throw "File error on read";
+
+ stats(block); // collect statistics
+
+ AVPCL::decompress(block, t);
+
+ t.extract(pixels, x, y);
+ }
+ }
+ if (fclose(avpclfile)) throw "Close failed on .avpcl file";
+
+ Targa::write(outf, pixels, w, h);
+
+ printstats(); // print statistics
+}
+*/
diff --git a/3rdparty/bgfx/3rdparty/nvtt/bc7/avpcl.h b/3rdparty/bgfx/3rdparty/nvtt/bc7/avpcl.h
new file mode 100644
index 00000000000..44ea504977b
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/nvtt/bc7/avpcl.h
@@ -0,0 +1,99 @@
+/*
+Copyright 2007 nVidia, Inc.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
+
+You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+See the License for the specific language governing permissions and limitations under the License.
+*/
+
+#ifndef _AVPCL_H
+#define _AVPCL_H
+
+#include "tile.h"
+#include "bits.h"
+
+#define DISABLE_EXHAUSTIVE 1 // define this if you don't want to spend a lot of time on exhaustive compression
+#define USE_ZOH_INTERP 1 // use zoh interpolator, otherwise use exact avpcl interpolators
+#define USE_ZOH_INTERP_ROUNDED 1 // use the rounded versions!
+
+namespace AVPCL {
+
+static const int NREGIONS_TWO = 2;
+static const int NREGIONS_THREE = 3;
+
+static const int BLOCKSIZE=16;
+static const int BITSIZE=128;
+
+// global flags
+extern bool flag_premult;
+extern bool flag_nonuniform;
+extern bool flag_nonuniform_ati;
+
+// global mode
+extern bool mode_rgb; // true if image had constant alpha = 255
+
+void compress(const Tile &t, char *block);
+void decompress(const char *block, Tile &t);
+
+float compress_mode0(const Tile &t, char *block);
+void decompress_mode0(const char *block, Tile &t);
+
+float compress_mode1(const Tile &t, char *block);
+void decompress_mode1(const char *block, Tile &t);
+
+float compress_mode2(const Tile &t, char *block);
+void decompress_mode2(const char *block, Tile &t);
+
+float compress_mode3(const Tile &t, char *block);
+void decompress_mode3(const char *block, Tile &t);
+
+float compress_mode4(const Tile &t, char *block);
+void decompress_mode4(const char *block, Tile &t);
+
+float compress_mode5(const Tile &t, char *block);
+void decompress_mode5(const char *block, Tile &t);
+
+float compress_mode6(const Tile &t, char *block);
+void decompress_mode6(const char *block, Tile &t);
+
+float compress_mode7(const Tile &t, char *block);
+void decompress_mode7(const char *block, Tile &t);
+
+inline int getmode(Bits &in)
+{
+ int mode = 0;
+
+ if (in.read(1)) mode = 0;
+ else if (in.read(1)) mode = 1;
+ else if (in.read(1)) mode = 2;
+ else if (in.read(1)) mode = 3;
+ else if (in.read(1)) mode = 4;
+ else if (in.read(1)) mode = 5;
+ else if (in.read(1)) mode = 6;
+ else if (in.read(1)) mode = 7;
+ else mode = 8; // reserved
+ return mode;
+}
+inline int getmode(const char *block)
+{
+ int bits = block[0], mode = 0;
+
+ if (bits & 1) mode = 0;
+ else if ((bits&3) == 2) mode = 1;
+ else if ((bits&7) == 4) mode = 2;
+ else if ((bits & 0xF) == 8) mode = 3;
+ else if ((bits & 0x1F) == 16) mode = 4;
+ else if ((bits & 0x3F) == 32) mode = 5;
+ else if ((bits & 0x7F) == 64) mode = 6;
+ else if ((bits & 0xFF) == 128) mode = 7;
+ else mode = 8; // reserved
+ return mode;
+}
+
+}
+
+#endif
diff --git a/3rdparty/bgfx/3rdparty/nvtt/bc7/avpcl_mode0.cpp b/3rdparty/bgfx/3rdparty/nvtt/bc7/avpcl_mode0.cpp
new file mode 100644
index 00000000000..82dd6075510
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/nvtt/bc7/avpcl_mode0.cpp
@@ -0,0 +1,1066 @@
+/*
+Copyright 2007 nVidia, Inc.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
+
+You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+See the License for the specific language governing permissions and limitations under the License.
+*/
+
+// Thanks to Jacob Munkberg (jacob@cs.lth.se) for the shortcut of using SVD to do the equivalent of principal components analysis
+
+// x1 444.1x6 16p 45b (3bi)
+
+#include "bits.h"
+#include "tile.h"
+#include "avpcl.h"
+#include "nvcore/debug.h"
+#include "nvmath/vector.inl"
+#include "nvmath/matrix.inl"
+#include "nvmath/fitting.h"
+#include "avpcl_utils.h"
+#include "endpts.h"
+#include <string.h>
+#include <float.h>
+
+#include "shapes_three.h"
+
+// use only the first 16 available shapes
+#undef NSHAPES
+#undef SHAPEBITS
+#define NSHAPES 16
+#define SHAPEBITS 4
+
+using namespace nv;
+using namespace AVPCL;
+
+#define NLSBMODES 4 // number of different lsb modes per region. since we have two .1 per region, that can have 4 values
+
+#define NINDICES 8
+#define INDEXBITS 3
+#define HIGH_INDEXBIT (1<<(INDEXBITS-1))
+#define DENOM (NINDICES-1)
+#define BIAS (DENOM/2)
+
+// WORK: determine optimal traversal pattern to search for best shape -- what does the error curve look like?
+// i.e. can we search shapes in a particular order so we can see the global error minima easily and
+// stop without having to touch all shapes?
+
+#define POS_TO_X(pos) ((pos)&3)
+#define POS_TO_Y(pos) (((pos)>>2)&3)
+
+#define NBITSIZES (NREGIONS*2)
+#define ABITINDEX(region) (2*(region)+0)
+#define BBITINDEX(region) (2*(region)+1)
+
+struct ChanBits
+{
+ int nbitsizes[NBITSIZES]; // bitsizes for one channel
+};
+
+struct Pattern
+{
+ ChanBits chan[NCHANNELS_RGB];// bit patterns used per channel
+ int transformed; // if 0, deltas are unsigned and no transform; otherwise, signed and transformed
+ int mode; // associated mode value
+ int modebits; // number of mode bits
+ const char *encoding; // verilog description of encoding for this mode
+};
+
+#define NPATTERNS 1
+
+static Pattern patterns[NPATTERNS] =
+{
+ // red green blue xfm mode mb
+ 4,4,4,4,4,4, 4,4,4,4,4,4, 4,4,4,4,4,4, 0, 0x1, 1, "", // really 444.1 x 6
+};
+
+struct RegionPrec
+{
+ int endpt_a_prec[NCHANNELS_RGB];
+ int endpt_b_prec[NCHANNELS_RGB];
+};
+
+struct PatternPrec
+{
+ RegionPrec region_precs[NREGIONS];
+};
+
+// this is the precision for each channel and region
+// NOTE: this MUST match the corresponding data in "patterns" above -- WARNING: there is NO nvAssert to check this!
+static PatternPrec pattern_precs[NPATTERNS] =
+{
+ 4,4,4, 4,4,4, 4,4,4, 4,4,4, 4,4,4, 4,4,4,
+};
+
+// return # of bits needed to store n. handle signed or unsigned cases properly
+static int nbits(int n, bool issigned)
+{
+ int nb;
+ if (n==0)
+ return 0; // no bits needed for 0, signed or not
+ else if (n > 0)
+ {
+ for (nb=0; n; ++nb, n>>=1) ;
+ return nb + (issigned?1:0);
+ }
+ else
+ {
+ nvAssert (issigned);
+ for (nb=0; n<-1; ++nb, n>>=1) ;
+ return nb + 1;
+ }
+}
+
+static void transform_forward(IntEndptsRGB_2 ep[NREGIONS])
+{
+ nvUnreachable();
+}
+
+static void transform_inverse(IntEndptsRGB_2 ep[NREGIONS])
+{
+ nvUnreachable();
+}
+
+// endpoints are 555,555; reduce to 444,444 and put the lsb bit majority in compr_bits
+static void compress_one(const IntEndptsRGB& endpts, IntEndptsRGB_2& compr_endpts)
+{
+ int onescnt;
+
+ onescnt = 0;
+ for (int j=0; j<NCHANNELS_RGB; ++j)
+ {
+ onescnt += endpts.A[j] & 1;
+ compr_endpts.A[j] = endpts.A[j] >> 1;
+ nvAssert (compr_endpts.A[j] < 16);
+ }
+ compr_endpts.a_lsb = onescnt >= 2;
+
+ onescnt = 0;
+ for (int j=0; j<NCHANNELS_RGB; ++j)
+ {
+ onescnt += endpts.B[j] & 1;
+ compr_endpts.B[j] = endpts.B[j] >> 1;
+ nvAssert (compr_endpts.B[j] < 16);
+ }
+ compr_endpts.b_lsb = onescnt >= 2;
+}
+
+static void uncompress_one(const IntEndptsRGB_2& compr_endpts, IntEndptsRGB& endpts)
+{
+ for (int j=0; j<NCHANNELS_RGB; ++j)
+ {
+ endpts.A[j] = (compr_endpts.A[j] << 1) | compr_endpts.a_lsb;
+ endpts.B[j] = (compr_endpts.B[j] << 1) | compr_endpts.b_lsb;
+ }
+}
+
+static void uncompress_endpoints(const IntEndptsRGB_2 compr_endpts[NREGIONS], IntEndptsRGB endpts[NREGIONS])
+{
+ for (int i=0; i<NREGIONS; ++i)
+ uncompress_one(compr_endpts[i], endpts[i]);
+}
+
+static void compress_endpoints(const IntEndptsRGB endpts[NREGIONS], IntEndptsRGB_2 compr_endpts[NREGIONS])
+{
+ for (int i=0; i<NREGIONS; ++i)
+ compress_one(endpts[i], compr_endpts[i]);
+}
+
+
+static void quantize_endpts(const FltEndpts endpts[NREGIONS], const PatternPrec &pattern_prec, IntEndptsRGB_2 q_endpts[NREGIONS])
+{
+ IntEndptsRGB full_endpts[NREGIONS];
+
+ for (int region = 0; region < NREGIONS; ++region)
+ {
+ full_endpts[region].A[0] = Utils::quantize(endpts[region].A.x, pattern_prec.region_precs[region].endpt_a_prec[0]+1); // +1 since we are in uncompressed space
+ full_endpts[region].A[1] = Utils::quantize(endpts[region].A.y, pattern_prec.region_precs[region].endpt_a_prec[1]+1);
+ full_endpts[region].A[2] = Utils::quantize(endpts[region].A.z, pattern_prec.region_precs[region].endpt_a_prec[2]+1);
+ full_endpts[region].B[0] = Utils::quantize(endpts[region].B.x, pattern_prec.region_precs[region].endpt_b_prec[0]+1);
+ full_endpts[region].B[1] = Utils::quantize(endpts[region].B.y, pattern_prec.region_precs[region].endpt_b_prec[1]+1);
+ full_endpts[region].B[2] = Utils::quantize(endpts[region].B.z, pattern_prec.region_precs[region].endpt_b_prec[2]+1);
+ compress_one(full_endpts[region], q_endpts[region]);
+ }
+}
+
+// swap endpoints as needed to ensure that the indices at index_positions have a 0 high-order bit
+static void swap_indices(IntEndptsRGB_2 endpts[NREGIONS], int indices[Tile::TILE_H][Tile::TILE_W], int shapeindex)
+{
+ for (int region = 0; region < NREGIONS; ++region)
+ {
+ int position = SHAPEINDEX_TO_COMPRESSED_INDICES(shapeindex,region);
+
+ int x = POS_TO_X(position);
+ int y = POS_TO_Y(position);
+ nvAssert(REGION(x,y,shapeindex) == region); // double check the table
+ if (indices[y][x] & HIGH_INDEXBIT)
+ {
+ // high bit is set, swap the endpts and indices for this region
+ int t;
+ for (int i=0; i<NCHANNELS_RGB; ++i)
+ {
+ t = endpts[region].A[i]; endpts[region].A[i] = endpts[region].B[i]; endpts[region].B[i] = t;
+ }
+ t = endpts[region].a_lsb; endpts[region].a_lsb = endpts[region].b_lsb; endpts[region].b_lsb = t;
+
+ for (int y = 0; y < Tile::TILE_H; y++)
+ for (int x = 0; x < Tile::TILE_W; x++)
+ if (REGION(x,y,shapeindex) == region)
+ indices[y][x] = NINDICES - 1 - indices[y][x];
+ }
+ }
+}
+
+static bool endpts_fit(IntEndptsRGB_2 endpts[NREGIONS], const Pattern &p)
+{
+ return true;
+}
+
+static void write_header(const IntEndptsRGB_2 endpts[NREGIONS], int shapeindex, const Pattern &p, Bits &out)
+{
+ out.write(p.mode, p.modebits);
+ out.write(shapeindex, SHAPEBITS);
+
+ for (int j=0; j<NCHANNELS_RGB; ++j)
+ for (int i=0; i<NREGIONS; ++i)
+ {
+ out.write(endpts[i].A[j], p.chan[j].nbitsizes[ABITINDEX(i)]);
+ out.write(endpts[i].B[j], p.chan[j].nbitsizes[BBITINDEX(i)]);
+ }
+
+ for (int i=0; i<NREGIONS; ++i)
+ {
+ out.write(endpts[i].a_lsb, 1);
+ out.write(endpts[i].b_lsb, 1);
+ }
+
+ nvAssert (out.getptr() == 83);
+}
+
+static void read_header(Bits &in, IntEndptsRGB_2 endpts[NREGIONS], int &shapeindex, Pattern &p, int &pat_index)
+{
+ int mode = AVPCL::getmode(in);
+
+ pat_index = 0;
+ nvAssert (pat_index >= 0 && pat_index < NPATTERNS);
+ nvAssert (in.getptr() == patterns[pat_index].modebits);
+
+ shapeindex = in.read(SHAPEBITS);
+ p = patterns[pat_index];
+
+ for (int j=0; j<NCHANNELS_RGB; ++j)
+ for (int i=0; i<NREGIONS; ++i)
+ {
+ endpts[i].A[j] = in.read(p.chan[j].nbitsizes[ABITINDEX(i)]);
+ endpts[i].B[j] = in.read(p.chan[j].nbitsizes[BBITINDEX(i)]);
+ }
+
+ for (int i=0; i<NREGIONS; ++i)
+ {
+ endpts[i].a_lsb = in.read(1);
+ endpts[i].b_lsb = in.read(1);
+ }
+
+ nvAssert (in.getptr() == 83);
+}
+
+static void write_indices(const int indices[Tile::TILE_H][Tile::TILE_W], int shapeindex, Bits &out)
+{
+ int positions[NREGIONS];
+
+ for (int r = 0; r < NREGIONS; ++r)
+ positions[r] = SHAPEINDEX_TO_COMPRESSED_INDICES(shapeindex,r);
+
+ for (int pos = 0; pos < Tile::TILE_TOTAL; ++pos)
+ {
+ int x = POS_TO_X(pos);
+ int y = POS_TO_Y(pos);
+
+ bool match = false;
+
+ for (int r = 0; r < NREGIONS; ++r)
+ if (positions[r] == pos) { match = true; break; }
+
+ out.write(indices[y][x], INDEXBITS - (match ? 1 : 0));
+ }
+}
+
+static void read_indices(Bits &in, int shapeindex, int indices[Tile::TILE_H][Tile::TILE_W])
+{
+ int positions[NREGIONS];
+
+ for (int r = 0; r < NREGIONS; ++r)
+ positions[r] = SHAPEINDEX_TO_COMPRESSED_INDICES(shapeindex,r);
+
+ for (int pos = 0; pos < Tile::TILE_TOTAL; ++pos)
+ {
+ int x = POS_TO_X(pos);
+ int y = POS_TO_Y(pos);
+
+ bool match = false;
+
+ for (int r = 0; r < NREGIONS; ++r)
+ if (positions[r] == pos) { match = true; break; }
+
+ indices[y][x]= in.read(INDEXBITS - (match ? 1 : 0));
+ }
+}
+
+static void emit_block(const IntEndptsRGB_2 endpts[NREGIONS], int shapeindex, const Pattern &p, const int indices[Tile::TILE_H][Tile::TILE_W], char *block)
+{
+ Bits out(block, AVPCL::BITSIZE);
+
+ write_header(endpts, shapeindex, p, out);
+
+ write_indices(indices, shapeindex, out);
+
+ nvAssert(out.getptr() == AVPCL::BITSIZE);
+}
+
+static void generate_palette_quantized(const IntEndptsRGB_2 &endpts_2, const RegionPrec &region_prec, Vector4 palette[NINDICES])
+{
+ IntEndptsRGB endpts;
+
+ uncompress_one(endpts_2, endpts);
+
+ // scale endpoints
+ int a, b; // really need a IntVec4...
+
+ a = Utils::unquantize(endpts.A[0], region_prec.endpt_a_prec[0]+1); // +1 since we are in uncompressed space
+ b = Utils::unquantize(endpts.B[0], region_prec.endpt_b_prec[0]+1);
+
+ // interpolate
+ for (int i = 0; i < NINDICES; ++i)
+ palette[i].x = float(Utils::lerp(a, b, i, BIAS, DENOM));
+
+ a = Utils::unquantize(endpts.A[1], region_prec.endpt_a_prec[1]+1);
+ b = Utils::unquantize(endpts.B[1], region_prec.endpt_b_prec[1]+1);
+
+ // interpolate
+ for (int i = 0; i < NINDICES; ++i)
+ palette[i].y = float(Utils::lerp(a, b, i, BIAS, DENOM));
+
+ a = Utils::unquantize(endpts.A[2], region_prec.endpt_a_prec[2]+1);
+ b = Utils::unquantize(endpts.B[2], region_prec.endpt_b_prec[2]+1);
+
+ // interpolate
+ for (int i = 0; i < NINDICES; ++i)
+ palette[i].z = float(Utils::lerp(a, b, i, BIAS, DENOM));
+
+ // constant alpha
+ for (int i = 0; i < NINDICES; ++i)
+ palette[i].w = 255.0f;
+}
+
+static void sign_extend(Pattern &p, IntEndptsRGB_2 endpts[NREGIONS])
+{
+ nvUnreachable();
+}
+
+void AVPCL::decompress_mode0(const char *block, Tile &t)
+{
+ Bits in(block, AVPCL::BITSIZE);
+
+ Pattern p;
+ IntEndptsRGB_2 endpts[NREGIONS];
+ int shapeindex, pat_index;
+
+ read_header(in, endpts, shapeindex, p, pat_index);
+
+ if (p.transformed)
+ {
+ sign_extend(p, endpts);
+ transform_inverse(endpts);
+ }
+
+ Vector4 palette[NREGIONS][NINDICES];
+ for (int r = 0; r < NREGIONS; ++r)
+ generate_palette_quantized(endpts[r], pattern_precs[pat_index].region_precs[r], &palette[r][0]);
+
+ int indices[Tile::TILE_H][Tile::TILE_W];
+
+ read_indices(in, shapeindex, indices);
+
+ nvAssert(in.getptr() == AVPCL::BITSIZE);
+
+ // lookup
+ for (int y = 0; y < Tile::TILE_H; y++)
+ for (int x = 0; x < Tile::TILE_W; x++)
+ t.data[y][x] = palette[REGION(x,y,shapeindex)][indices[y][x]];
+}
+
+// given a collection of colors and quantized endpoints, generate a palette, choose best entries, and return a single toterr
+static float map_colors(const Vector4 colors[], const float importance[], int np, const IntEndptsRGB_2 &endpts, const RegionPrec &region_prec, float current_err, int indices[Tile::TILE_TOTAL])
+{
+ Vector4 palette[NINDICES];
+ float toterr = 0;
+ Vector4 err;
+
+ generate_palette_quantized(endpts, region_prec, palette);
+
+ for (int i = 0; i < np; ++i)
+ {
+ float besterr = FLT_MAX;
+
+ for (int j = 0; j < NINDICES && besterr > 0; ++j)
+ {
+ float err = Utils::metric4(colors[i], palette[j]) * importance[i];
+
+ if (err > besterr) // error increased, so we're done searching
+ break;
+ if (err < besterr)
+ {
+ besterr = err;
+ indices[i] = j;
+ }
+ }
+ toterr += besterr;
+
+ // check for early exit
+ if (toterr > current_err)
+ {
+ // fill out bogus index values so it's initialized at least
+ for (int k = i; k < np; ++k)
+ indices[k] = -1;
+
+ return FLT_MAX;
+ }
+ }
+ return toterr;
+}
+
+// assign indices given a tile, shape, and quantized endpoints, return toterr for each region
+static void assign_indices(const Tile &tile, int shapeindex, IntEndptsRGB_2 endpts[NREGIONS], const PatternPrec &pattern_prec,
+ int indices[Tile::TILE_H][Tile::TILE_W], float toterr[NREGIONS])
+{
+ // build list of possibles
+ Vector4 palette[NREGIONS][NINDICES];
+
+ for (int region = 0; region < NREGIONS; ++region)
+ {
+ generate_palette_quantized(endpts[region], pattern_prec.region_precs[region], &palette[region][0]);
+ toterr[region] = 0;
+ }
+
+ Vector4 err;
+
+ for (int y = 0; y < tile.size_y; y++)
+ for (int x = 0; x < tile.size_x; x++)
+ {
+ int region = REGION(x,y,shapeindex);
+ float err, besterr = FLT_MAX;
+
+ for (int i = 0; i < NINDICES && besterr > 0; ++i)
+ {
+ err = Utils::metric4(tile.data[y][x], palette[region][i]);
+
+ if (err > besterr) // error increased, so we're done searching
+ break;
+ if (err < besterr)
+ {
+ besterr = err;
+ indices[y][x] = i;
+ }
+ }
+ toterr[region] += besterr;
+ }
+}
+
+// note: indices are valid only if the value returned is less than old_err; otherwise they contain -1's
+// this function returns either old_err or a value smaller (if it was successful in improving the error)
+static float perturb_one(const Vector4 colors[], const float importance[], int np, int ch, const RegionPrec &region_prec, const IntEndptsRGB_2 &old_endpts, IntEndptsRGB_2 &new_endpts,
+ float old_err, int do_b, int indices[Tile::TILE_TOTAL])
+{
+ // we have the old endpoints: old_endpts
+ // we have the perturbed endpoints: new_endpts
+ // we have the temporary endpoints: temp_endpts
+
+ IntEndptsRGB_2 temp_endpts;
+ float min_err = old_err; // start with the best current error
+ int beststep;
+ int temp_indices[Tile::TILE_TOTAL];
+
+ for (int i=0; i<np; ++i)
+ indices[i] = -1;
+
+ // copy real endpoints so we can perturb them
+ temp_endpts = new_endpts = old_endpts;
+
+ int prec = do_b ? region_prec.endpt_b_prec[ch] : region_prec.endpt_a_prec[ch];
+
+ // do a logarithmic search for the best error for this endpoint (which)
+ for (int step = 1 << (prec-1); step; step >>= 1)
+ {
+ bool improved = false;
+ for (int sign = -1; sign <= 1; sign += 2)
+ {
+ if (do_b == 0)
+ {
+ temp_endpts.A[ch] = new_endpts.A[ch] + sign * step;
+ if (temp_endpts.A[ch] < 0 || temp_endpts.A[ch] >= (1 << prec))
+ continue;
+ }
+ else
+ {
+ temp_endpts.B[ch] = new_endpts.B[ch] + sign * step;
+ if (temp_endpts.B[ch] < 0 || temp_endpts.B[ch] >= (1 << prec))
+ continue;
+ }
+
+ float err = map_colors(colors, importance, np, temp_endpts, region_prec, min_err, temp_indices);
+
+ if (err < min_err)
+ {
+ improved = true;
+ min_err = err;
+ beststep = sign * step;
+ for (int i=0; i<np; ++i)
+ indices[i] = temp_indices[i];
+ }
+ }
+ // if this was an improvement, move the endpoint and continue search from there
+ if (improved)
+ {
+ if (do_b == 0)
+ new_endpts.A[ch] += beststep;
+ else
+ new_endpts.B[ch] += beststep;
+ }
+ }
+ return min_err;
+}
+
+// the larger the error the more time it is worth spending on an exhaustive search.
+// perturb the endpoints at least -3 to 3.
+// if err > 5000 perturb endpoints 50% of precision
+// if err > 1000 25%
+// if err > 200 12.5%
+// if err > 40 6.25%
+// for np = 16 -- adjust error thresholds as a function of np
+// always ensure endpoint ordering is preserved (no need to overlap the scan)
+// if orig_err returned from this is less than its input value, then indices[] will contain valid indices
+static float exhaustive(const Vector4 colors[], const float importance[], int np, int ch, const RegionPrec &region_prec, float &orig_err, IntEndptsRGB_2 &opt_endpts, int indices[Tile::TILE_TOTAL])
+{
+ IntEndptsRGB_2 temp_endpts;
+ float best_err = orig_err;
+ int aprec = region_prec.endpt_a_prec[ch];
+ int bprec = region_prec.endpt_b_prec[ch];
+ int good_indices[Tile::TILE_TOTAL];
+ int temp_indices[Tile::TILE_TOTAL];
+
+ for (int i=0; i<np; ++i)
+ indices[i] = -1;
+
+ float thr_scale = (float)np / (float)Tile::TILE_TOTAL;
+
+ if (orig_err == 0) return orig_err;
+
+ int adelta = 0, bdelta = 0;
+ if (orig_err > 5000.0*thr_scale) { adelta = (1 << aprec)/2; bdelta = (1 << bprec)/2; }
+ else if (orig_err > 1000.0*thr_scale) { adelta = (1 << aprec)/4; bdelta = (1 << bprec)/4; }
+ else if (orig_err > 200.0*thr_scale) { adelta = (1 << aprec)/8; bdelta = (1 << bprec)/8; }
+ else if (orig_err > 40.0*thr_scale) { adelta = (1 << aprec)/16; bdelta = (1 << bprec)/16; }
+ adelta = max(adelta, 3);
+ bdelta = max(bdelta, 3);
+
+#ifdef DISABLE_EXHAUSTIVE
+ adelta = bdelta = 3;
+#endif
+
+ temp_endpts = opt_endpts;
+
+ // ok figure out the range of A and B
+ int alow = max(0, opt_endpts.A[ch] - adelta);
+ int ahigh = min((1<<aprec)-1, opt_endpts.A[ch] + adelta);
+ int blow = max(0, opt_endpts.B[ch] - bdelta);
+ int bhigh = min((1<<bprec)-1, opt_endpts.B[ch] + bdelta);
+
+ // now there's no need to swap the ordering of A and B
+ bool a_le_b = opt_endpts.A[ch] <= opt_endpts.B[ch];
+
+ int amin, bmin;
+
+ if (opt_endpts.A[ch] <= opt_endpts.B[ch])
+ {
+ // keep a <= b
+ for (int a = alow; a <= ahigh; ++a)
+ for (int b = max(a, blow); b < bhigh; ++b)
+ {
+ temp_endpts.A[ch] = a;
+ temp_endpts.B[ch] = b;
+
+ float err = map_colors(colors, importance, np, temp_endpts, region_prec, best_err, temp_indices);
+ if (err < best_err)
+ {
+ amin = a;
+ bmin = b;
+ best_err = err;
+ for (int i=0; i<np; ++i)
+ good_indices[i] = temp_indices[i];
+ }
+ }
+ }
+ else
+ {
+ // keep b <= a
+ for (int b = blow; b < bhigh; ++b)
+ for (int a = max(b, alow); a <= ahigh; ++a)
+ {
+ temp_endpts.A[ch] = a;
+ temp_endpts.B[ch] = b;
+
+ float err = map_colors(colors, importance, np, temp_endpts, region_prec, best_err, temp_indices);
+ if (err < best_err)
+ {
+ amin = a;
+ bmin = b;
+ best_err = err;
+ for (int i=0; i<np; ++i)
+ good_indices[i] = temp_indices[i];
+ }
+ }
+ }
+ if (best_err < orig_err)
+ {
+ opt_endpts.A[ch] = amin;
+ opt_endpts.B[ch] = bmin;
+ orig_err = best_err;
+ // if we actually improved, update the indices
+ for (int i=0; i<np; ++i)
+ indices[i] = good_indices[i];
+ }
+ return best_err;
+}
+
+static float optimize_one(const Vector4 colors[], const float importance[], int np, float orig_err, const IntEndptsRGB_2 &orig_endpts, const RegionPrec &region_prec, IntEndptsRGB_2 &opt_endpts)
+{
+ float opt_err = orig_err;
+
+ opt_endpts = orig_endpts;
+
+ /*
+ err0 = perturb(rgb0, delta0)
+ err1 = perturb(rgb1, delta1)
+ if (err0 < err1)
+ if (err0 >= initial_error) break
+ rgb0 += delta0
+ next = 1
+ else
+ if (err1 >= initial_error) break
+ rgb1 += delta1
+ next = 0
+ initial_err = map()
+ for (;;)
+ err = perturb(next ? rgb1:rgb0, delta)
+ if (err >= initial_err) break
+ next? rgb1 : rgb0 += delta
+ initial_err = err
+ */
+ IntEndptsRGB_2 new_a, new_b;
+ IntEndptsRGB_2 new_endpt;
+ int do_b;
+ int orig_indices[Tile::TILE_TOTAL];
+ int new_indices[Tile::TILE_TOTAL];
+ int temp_indices0[Tile::TILE_TOTAL];
+ int temp_indices1[Tile::TILE_TOTAL];
+
+ // now optimize each channel separately
+ // for the first error improvement, we save the indices. then, for any later improvement, we compare the indices
+ // if they differ, we restart the loop (which then falls back to looking for a first improvement.)
+ for (int ch = 0; ch < NCHANNELS_RGB; ++ch)
+ {
+ // figure out which endpoint when perturbed gives the most improvement and start there
+ // if we just alternate, we can easily end up in a local minima
+ float err0 = perturb_one(colors, importance, np, ch, region_prec, opt_endpts, new_a, opt_err, 0, temp_indices0); // perturb endpt A
+ float err1 = perturb_one(colors, importance, np, ch, region_prec, opt_endpts, new_b, opt_err, 1, temp_indices1); // perturb endpt B
+
+ if (err0 < err1)
+ {
+ if (err0 >= opt_err)
+ continue;
+
+ for (int i=0; i<np; ++i)
+ {
+ new_indices[i] = orig_indices[i] = temp_indices0[i];
+ nvAssert (orig_indices[i] != -1);
+ }
+
+ opt_endpts.A[ch] = new_a.A[ch];
+ opt_err = err0;
+ do_b = 1; // do B next
+ }
+ else
+ {
+ if (err1 >= opt_err)
+ continue;
+
+ for (int i=0; i<np; ++i)
+ {
+ new_indices[i] = orig_indices[i] = temp_indices1[i];
+ nvAssert (orig_indices[i] != -1);
+ }
+
+ opt_endpts.B[ch] = new_b.B[ch];
+ opt_err = err1;
+ do_b = 0; // do A next
+ }
+
+ // now alternate endpoints and keep trying until there is no improvement
+ for (;;)
+ {
+ float err = perturb_one(colors, importance, np, ch, region_prec, opt_endpts, new_endpt, opt_err, do_b, temp_indices0);
+ if (err >= opt_err)
+ break;
+
+ for (int i=0; i<np; ++i)
+ {
+ new_indices[i] = temp_indices0[i];
+ nvAssert (new_indices[i] != -1);
+ }
+
+ if (do_b == 0)
+ opt_endpts.A[ch] = new_endpt.A[ch];
+ else
+ opt_endpts.B[ch] = new_endpt.B[ch];
+ opt_err = err;
+ do_b = 1 - do_b; // now move the other endpoint
+ }
+
+ // see if the indices have changed
+ int i;
+ for (i=0; i<np; ++i)
+ if (orig_indices[i] != new_indices[i])
+ break;
+
+ if (i<np)
+ ch = -1; // start over
+ }
+
+ // finally, do a small exhaustive search around what we think is the global minima to be sure
+ // note this is independent of the above search, so we don't care about the indices from the above
+ // we don't care about the above because if they differ, so what? we've already started at ch=0
+ bool first = true;
+ for (int ch = 0; ch < NCHANNELS_RGB; ++ch)
+ {
+ float new_err = exhaustive(colors, importance, np, ch, region_prec, opt_err, opt_endpts, temp_indices0);
+
+ if (new_err < opt_err)
+ {
+ opt_err = new_err;
+
+ if (first)
+ {
+ for (int i=0; i<np; ++i)
+ {
+ orig_indices[i] = temp_indices0[i];
+ nvAssert (orig_indices[i] != -1);
+ }
+ first = false;
+ }
+ else
+ {
+ // see if the indices have changed
+ int i;
+ for (i=0; i<np; ++i)
+ if (orig_indices[i] != temp_indices0[i])
+ break;
+
+ if (i<np)
+ {
+ ch = -1; // start over
+ first = true;
+ }
+ }
+ }
+ }
+
+ return opt_err;
+}
+
+// this will return a valid set of endpoints in opt_endpts regardless of whether it improve orig_endpts or not
+static void optimize_endpts(const Tile &tile, int shapeindex, const float orig_err[NREGIONS],
+ const IntEndptsRGB_2 orig_endpts[NREGIONS], const PatternPrec &pattern_prec, float opt_err[NREGIONS], IntEndptsRGB_2 opt_endpts[NREGIONS])
+{
+ Vector4 pixels[Tile::TILE_TOTAL];
+ float importance[Tile::TILE_TOTAL];
+ IntEndptsRGB_2 temp_in, temp_out;
+ int temp_indices[Tile::TILE_TOTAL];
+
+ for (int region=0; region<NREGIONS; ++region)
+ {
+ // collect the pixels in the region
+ int np = 0;
+
+ for (int y = 0; y < tile.size_y; y++) {
+ for (int x = 0; x < tile.size_x; x++) {
+ if (REGION(x, y, shapeindex) == region) {
+ pixels[np] = tile.data[y][x];
+ importance[np] = tile.importance_map[y][x];
+ np++;
+ }
+ }
+ }
+
+ opt_endpts[region] = temp_in = orig_endpts[region];
+ opt_err[region] = orig_err[region];
+
+ float best_err = orig_err[region];
+
+ for (int lsbmode=0; lsbmode<NLSBMODES; ++lsbmode)
+ {
+ temp_in.a_lsb = lsbmode & 1;
+ temp_in.b_lsb = (lsbmode >> 1) & 1;
+
+ // make sure we have a valid error for temp_in
+ // we use FLT_MAX here because we want an accurate temp_in_err, no shortcuts
+ // (mapcolors will compute a mapping but will stop if the error exceeds the value passed in the FLT_MAX position)
+ float temp_in_err = map_colors(pixels, importance, np, temp_in, pattern_prec.region_precs[region], FLT_MAX, temp_indices);
+
+ // now try to optimize these endpoints
+ float temp_out_err = optimize_one(pixels, importance, np, temp_in_err, temp_in, pattern_prec.region_precs[region], temp_out);
+
+ // if we find an improvement, update the best so far and correct the output endpoints and errors
+ if (temp_out_err < best_err)
+ {
+ best_err = temp_out_err;
+ opt_err[region] = temp_out_err;
+ opt_endpts[region] = temp_out;
+ }
+ }
+ }
+}
+
+/* optimization algorithm
+ for each pattern
+ convert endpoints using pattern precision
+ assign indices and get initial error
+ compress indices (and possibly reorder endpoints)
+ transform endpoints
+ if transformed endpoints fit pattern
+ get original endpoints back
+ optimize endpoints, get new endpoints, new indices, and new error // new error will almost always be better
+ compress new indices
+ transform new endpoints
+ if new endpoints fit pattern AND if error is improved
+ emit compressed block with new data
+ else
+ emit compressed block with original data // to try to preserve maximum endpoint precision
+*/
+
+static float refine(const Tile &tile, int shapeindex_best, const FltEndpts endpts[NREGIONS], char *block)
+{
+ float orig_err[NREGIONS], opt_err[NREGIONS], orig_toterr, opt_toterr, expected_opt_err[NREGIONS];
+ IntEndptsRGB_2 orig_endpts[NREGIONS], opt_endpts[NREGIONS];
+ int orig_indices[Tile::TILE_H][Tile::TILE_W], opt_indices[Tile::TILE_H][Tile::TILE_W];
+
+ for (int sp = 0; sp < NPATTERNS; ++sp)
+ {
+ quantize_endpts(endpts, pattern_precs[sp], orig_endpts);
+ assign_indices(tile, shapeindex_best, orig_endpts, pattern_precs[sp], orig_indices, orig_err);
+ swap_indices(orig_endpts, orig_indices, shapeindex_best);
+ if (patterns[sp].transformed)
+ transform_forward(orig_endpts);
+ // apply a heuristic here -- we check if the endpoints fit before we try to optimize them.
+ // the assumption made is that if they don't fit now, they won't fit after optimizing.
+ if (endpts_fit(orig_endpts, patterns[sp]))
+ {
+ if (patterns[sp].transformed)
+ transform_inverse(orig_endpts);
+ optimize_endpts(tile, shapeindex_best, orig_err, orig_endpts, pattern_precs[sp], expected_opt_err, opt_endpts);
+ assign_indices(tile, shapeindex_best, opt_endpts, pattern_precs[sp], opt_indices, opt_err);
+ // (nreed) Commented out asserts because they go off all the time...not sure why
+ //for (int i=0; i<NREGIONS; ++i)
+ // nvAssert(expected_opt_err[i] == opt_err[i]);
+ swap_indices(opt_endpts, opt_indices, shapeindex_best);
+ if (patterns[sp].transformed)
+ transform_forward(opt_endpts);
+ orig_toterr = opt_toterr = 0;
+ for (int i=0; i < NREGIONS; ++i) { orig_toterr += orig_err[i]; opt_toterr += opt_err[i]; }
+ if (endpts_fit(opt_endpts, patterns[sp]) && opt_toterr < orig_toterr)
+ {
+ emit_block(opt_endpts, shapeindex_best, patterns[sp], opt_indices, block);
+ return opt_toterr;
+ }
+ else
+ {
+ // either it stopped fitting when we optimized it, or there was no improvement
+ // so go back to the unoptimized endpoints which we know will fit
+ if (patterns[sp].transformed)
+ transform_forward(orig_endpts);
+ emit_block(orig_endpts, shapeindex_best, patterns[sp], orig_indices, block);
+ return orig_toterr;
+ }
+ }
+ }
+ nvAssert(false); // throw "No candidate found, should never happen (mode avpcl 0).";
+ return FLT_MAX;
+}
+
+static void clamp(Vector4 &v)
+{
+ if (v.x < 0.0f) v.x = 0.0f;
+ if (v.x > 255.0f) v.x = 255.0f;
+ if (v.y < 0.0f) v.y = 0.0f;
+ if (v.y > 255.0f) v.y = 255.0f;
+ if (v.z < 0.0f) v.z = 0.0f;
+ if (v.z > 255.0f) v.z = 255.0f;
+ v.w = 255.0f;
+}
+
+static void generate_palette_unquantized(const FltEndpts endpts[NREGIONS], Vector4 palette[NREGIONS][NINDICES])
+{
+ for (int region = 0; region < NREGIONS; ++region)
+ for (int i = 0; i < NINDICES; ++i)
+ palette[region][i] = Utils::lerp(endpts[region].A, endpts[region].B, i, 0, DENOM);
+}
+
+// generate a palette from unquantized endpoints, then pick best palette color for all pixels in each region, return toterr for all regions combined
+static float map_colors(const Tile &tile, int shapeindex, const FltEndpts endpts[NREGIONS])
+{
+ // build list of possibles
+ Vector4 palette[NREGIONS][NINDICES];
+
+ generate_palette_unquantized(endpts, palette);
+
+ float toterr = 0;
+ Vector4 err;
+
+ for (int y = 0; y < tile.size_y; y++)
+ for (int x = 0; x < tile.size_x; x++)
+ {
+ int region = REGION(x,y,shapeindex);
+ float err, besterr = FLT_MAX;
+
+ for (int i = 0; i < NINDICES && besterr > 0; ++i)
+ {
+ err = Utils::metric4(tile.data[y][x], palette[region][i]);
+
+ if (err > besterr) // error increased, so we're done searching. this works for most norms.
+ break;
+ if (err < besterr)
+ besterr = err;
+ }
+ toterr += besterr;
+ }
+ return toterr;
+}
+
+// for this mode, we assume alpha = 255 constant and compress only the RGB portion.
+// however, we do the error check against the actual alpha values supplied for the tile.
+static float rough(const Tile &tile, int shapeindex, FltEndpts endpts[NREGIONS])
+{
+ for (int region=0; region<NREGIONS; ++region)
+ {
+ int np = 0;
+ Vector3 colors[Tile::TILE_TOTAL];
+ float alphas[2];
+ Vector4 mean(0,0,0,0);
+
+ for (int y = 0; y < tile.size_y; y++)
+ for (int x = 0; x < tile.size_x; x++)
+ if (REGION(x,y,shapeindex) == region)
+ {
+ colors[np] = tile.data[y][x].xyz();
+ if (np < 2) alphas[np] = tile.data[y][x].w;
+ mean += tile.data[y][x];
+ ++np;
+ }
+
+ // handle simple cases
+ if (np == 0)
+ {
+ Vector4 zero(0,0,0,255.0f);
+ endpts[region].A = zero;
+ endpts[region].B = zero;
+ continue;
+ }
+ else if (np == 1)
+ {
+ endpts[region].A = Vector4(colors[0], alphas[0]);
+ endpts[region].B = Vector4(colors[0], alphas[0]);
+ continue;
+ }
+ else if (np == 2)
+ {
+ endpts[region].A = Vector4(colors[0], alphas[0]);
+ endpts[region].B = Vector4(colors[1], alphas[1]);
+ continue;
+ }
+
+ mean /= float(np);
+
+ Vector3 direction = Fit::computePrincipalComponent_EigenSolver(np, colors);
+
+ // project each pixel value along the principal direction
+ float minp = FLT_MAX, maxp = -FLT_MAX;
+ for (int i = 0; i < np; i++)
+ {
+ float dp = dot(colors[i]-mean.xyz(), direction);
+ if (dp < minp) minp = dp;
+ if (dp > maxp) maxp = dp;
+ }
+
+ // choose as endpoints 2 points along the principal direction that span the projections of all of the pixel values
+ endpts[region].A = mean + minp*Vector4(direction, 0);
+ endpts[region].B = mean + maxp*Vector4(direction, 0);
+
+ // clamp endpoints
+ // the argument for clamping is that the actual endpoints need to be clamped and thus we need to choose the best
+ // shape based on endpoints being clamped
+ clamp(endpts[region].A);
+ clamp(endpts[region].B);
+ }
+
+ return map_colors(tile, shapeindex, endpts);
+}
+
+static void swap(float *list1, int *list2, int i, int j)
+{
+ float t = list1[i]; list1[i] = list1[j]; list1[j] = t;
+ int t1 = list2[i]; list2[i] = list2[j]; list2[j] = t1;
+}
+
+float AVPCL::compress_mode0(const Tile &t, char *block)
+{
+ // number of rough cases to look at. reasonable values of this are 1, NSHAPES/4, and NSHAPES
+ // NSHAPES/4 gets nearly all the cases; you can increase that a bit (say by 3 or 4) if you really want to squeeze the last bit out
+ const int NITEMS=NSHAPES/4;
+
+ // pick the best NITEMS shapes and refine these.
+ struct {
+ FltEndpts endpts[NREGIONS];
+ } all[NSHAPES];
+ float roughmse[NSHAPES];
+ int index[NSHAPES];
+ char tempblock[AVPCL::BLOCKSIZE];
+ float msebest = FLT_MAX;
+
+ for (int i=0; i<NSHAPES; ++i)
+ {
+ roughmse[i] = rough(t, i, &all[i].endpts[0]);
+ index[i] = i;
+ }
+
+ // bubble sort -- only need to bubble up the first NITEMS items
+ for (int i=0; i<NITEMS; ++i)
+ for (int j=i+1; j<NSHAPES; ++j)
+ if (roughmse[i] > roughmse[j])
+ swap(roughmse, index, i, j);
+
+ for (int i=0; i<NITEMS && msebest>0; ++i)
+ {
+ int shape = index[i];
+ float mse = refine(t, shape, &all[shape].endpts[0], tempblock);
+ if (mse < msebest)
+ {
+ memcpy(block, tempblock, sizeof(tempblock));
+ msebest = mse;
+ }
+ }
+ return msebest;
+}
+
diff --git a/3rdparty/bgfx/3rdparty/nvtt/bc7/avpcl_mode1.cpp b/3rdparty/bgfx/3rdparty/nvtt/bc7/avpcl_mode1.cpp
new file mode 100644
index 00000000000..fb1bfea8837
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/nvtt/bc7/avpcl_mode1.cpp
@@ -0,0 +1,1047 @@
+/*
+Copyright 2007 nVidia, Inc.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
+
+You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+See the License for the specific language governing permissions and limitations under the License.
+*/
+
+// Thanks to Jacob Munkberg (jacob@cs.lth.se) for the shortcut of using SVD to do the equivalent of principal components analysis
+
+// x10 (666x2).1 (666x2).1 64p 3bi
+
+#include "bits.h"
+#include "tile.h"
+#include "avpcl.h"
+#include "nvcore/debug.h"
+#include "nvmath/vector.inl"
+#include "nvmath/matrix.inl"
+#include "nvmath/fitting.h"
+#include "avpcl_utils.h"
+#include "endpts.h"
+#include <string.h>
+#include <float.h>
+
+#include "shapes_two.h"
+
+using namespace nv;
+using namespace AVPCL;
+
+#define NLSBMODES 2 // number of different lsb modes per region. since we have one .1 per region, that can have 2 values
+
+#define NINDICES 8
+#define INDEXBITS 3
+#define HIGH_INDEXBIT (1<<(INDEXBITS-1))
+#define DENOM (NINDICES-1)
+#define BIAS (DENOM/2)
+
+// WORK: determine optimal traversal pattern to search for best shape -- what does the error curve look like?
+// i.e. can we search shapes in a particular order so we can see the global error minima easily and
+// stop without having to touch all shapes?
+
+#define POS_TO_X(pos) ((pos)&3)
+#define POS_TO_Y(pos) (((pos)>>2)&3)
+
+#define NBITSIZES (NREGIONS*2)
+#define ABITINDEX(region) (2*(region)+0)
+#define BBITINDEX(region) (2*(region)+1)
+
+struct ChanBits
+{
+ int nbitsizes[NBITSIZES]; // bitsizes for one channel
+};
+
+struct Pattern
+{
+ ChanBits chan[NCHANNELS_RGB];// bit patterns used per channel
+ int transformed; // if 0, deltas are unsigned and no transform; otherwise, signed and transformed
+ int mode; // associated mode value
+ int modebits; // number of mode bits
+ const char *encoding; // verilog description of encoding for this mode
+};
+
+#define NPATTERNS 1
+
+static Pattern patterns[NPATTERNS] =
+{
+ // red green blue xfm mode mb
+ 6,6,6,6, 6,6,6,6, 6,6,6,6, 0, 0x2, 2, "",
+};
+
+struct RegionPrec
+{
+ int endpt_a_prec[NCHANNELS_RGB];
+ int endpt_b_prec[NCHANNELS_RGB];
+};
+
+struct PatternPrec
+{
+ RegionPrec region_precs[NREGIONS];
+};
+
+
+// this is the precision for each channel and region
+// NOTE: this MUST match the corresponding data in "patterns" above -- WARNING: there is NO nvAssert to check this!
+static PatternPrec pattern_precs[NPATTERNS] =
+{
+ 6,6,6, 6,6,6, 6,6,6, 6,6,6,
+};
+
+// return # of bits needed to store n. handle signed or unsigned cases properly
+static int nbits(int n, bool issigned)
+{
+ int nb;
+ if (n==0)
+ return 0; // no bits needed for 0, signed or not
+ else if (n > 0)
+ {
+ for (nb=0; n; ++nb, n>>=1) ;
+ return nb + (issigned?1:0);
+ }
+ else
+ {
+ nvAssert (issigned);
+ for (nb=0; n<-1; ++nb, n>>=1) ;
+ return nb + 1;
+ }
+}
+
+
+static void transform_forward(IntEndptsRGB_1 ep[NREGIONS])
+{
+ nvUnreachable();
+}
+
+static void transform_inverse(IntEndptsRGB_1 ep[NREGIONS])
+{
+ nvUnreachable();
+}
+
+// endpoints are 777,777; reduce to 666,666 and put the lsb bit majority in compr_bits
+static void compress_one(const IntEndptsRGB& endpts, IntEndptsRGB_1& compr_endpts)
+{
+ int onescnt;
+
+ onescnt = 0;
+ for (int j=0; j<NCHANNELS_RGB; ++j)
+ {
+ onescnt += endpts.A[j] & 1;
+ compr_endpts.A[j] = endpts.A[j] >> 1;
+ onescnt += endpts.B[j] & 1;
+ compr_endpts.B[j] = endpts.B[j] >> 1;
+ nvAssert (compr_endpts.A[j] < 64);
+ nvAssert (compr_endpts.B[j] < 64);
+ }
+ compr_endpts.lsb = onescnt >= 3;
+}
+
+static void uncompress_one(const IntEndptsRGB_1& compr_endpts, IntEndptsRGB& endpts)
+{
+ for (int j=0; j<NCHANNELS_RGB; ++j)
+ {
+ endpts.A[j] = (compr_endpts.A[j] << 1) | compr_endpts.lsb;
+ endpts.B[j] = (compr_endpts.B[j] << 1) | compr_endpts.lsb;
+ }
+}
+
+static void uncompress_endpoints(const IntEndptsRGB_1 compr_endpts[NREGIONS], IntEndptsRGB endpts[NREGIONS])
+{
+ for (int i=0; i<NREGIONS; ++i)
+ uncompress_one(compr_endpts[i], endpts[i]);
+}
+
+static void compress_endpoints(const IntEndptsRGB endpts[NREGIONS], IntEndptsRGB_1 compr_endpts[NREGIONS])
+{
+ for (int i=0; i<NREGIONS; ++i)
+ compress_one(endpts[i], compr_endpts[i]);
+}
+
+
+static void quantize_endpts(const FltEndpts endpts[NREGIONS], const PatternPrec &pattern_prec, IntEndptsRGB_1 q_endpts[NREGIONS])
+{
+ IntEndptsRGB full_endpts[NREGIONS];
+
+ for (int region = 0; region < NREGIONS; ++region)
+ {
+ full_endpts[region].A[0] = Utils::quantize(endpts[region].A.x, pattern_prec.region_precs[region].endpt_a_prec[0]+1); // +1 since we are in uncompressed space
+ full_endpts[region].A[1] = Utils::quantize(endpts[region].A.y, pattern_prec.region_precs[region].endpt_a_prec[1]+1);
+ full_endpts[region].A[2] = Utils::quantize(endpts[region].A.z, pattern_prec.region_precs[region].endpt_a_prec[2]+1);
+ full_endpts[region].B[0] = Utils::quantize(endpts[region].B.x, pattern_prec.region_precs[region].endpt_b_prec[0]+1);
+ full_endpts[region].B[1] = Utils::quantize(endpts[region].B.y, pattern_prec.region_precs[region].endpt_b_prec[1]+1);
+ full_endpts[region].B[2] = Utils::quantize(endpts[region].B.z, pattern_prec.region_precs[region].endpt_b_prec[2]+1);
+ compress_one(full_endpts[region], q_endpts[region]);
+ }
+}
+
+// swap endpoints as needed to ensure that the indices at index_positions have a 0 high-order bit
+static void swap_indices(IntEndptsRGB_1 endpts[NREGIONS], int indices[Tile::TILE_H][Tile::TILE_W], int shapeindex)
+{
+ for (int region = 0; region < NREGIONS; ++region)
+ {
+ int position = SHAPEINDEX_TO_COMPRESSED_INDICES(shapeindex,region);
+
+ int x = POS_TO_X(position);
+ int y = POS_TO_Y(position);
+ nvAssert(REGION(x,y,shapeindex) == region); // double check the table
+ if (indices[y][x] & HIGH_INDEXBIT)
+ {
+ // high bit is set, swap the endpts and indices for this region
+ int t;
+ for (int i=0; i<NCHANNELS_RGB; ++i) { t = endpts[region].A[i]; endpts[region].A[i] = endpts[region].B[i]; endpts[region].B[i] = t; }
+
+ for (int y = 0; y < Tile::TILE_H; y++)
+ for (int x = 0; x < Tile::TILE_W; x++)
+ if (REGION(x,y,shapeindex) == region)
+ indices[y][x] = NINDICES - 1 - indices[y][x];
+ }
+ }
+}
+
+static bool endpts_fit(IntEndptsRGB_1 endpts[NREGIONS], const Pattern &p)
+{
+ return true;
+}
+
+
+static void write_header(const IntEndptsRGB_1 endpts[NREGIONS], int shapeindex, const Pattern &p, Bits &out)
+{
+ out.write(p.mode, p.modebits);
+ out.write(shapeindex, SHAPEBITS);
+
+ for (int j=0; j<NCHANNELS_RGB; ++j)
+ for (int i=0; i<NREGIONS; ++i)
+ {
+ out.write(endpts[i].A[j], p.chan[j].nbitsizes[ABITINDEX(i)]);
+ out.write(endpts[i].B[j], p.chan[j].nbitsizes[BBITINDEX(i)]);
+ }
+
+ for (int i=0; i<NREGIONS; ++i)
+ out.write(endpts[i].lsb, 1);
+
+ nvAssert (out.getptr() == 82);
+}
+
+static void read_header(Bits &in, IntEndptsRGB_1 endpts[NREGIONS], int &shapeindex, Pattern &p, int &pat_index)
+{
+ int mode = AVPCL::getmode(in);
+
+ pat_index = 0;
+ nvAssert (pat_index >= 0 && pat_index < NPATTERNS);
+ nvAssert (in.getptr() == patterns[pat_index].modebits);
+
+ shapeindex = in.read(SHAPEBITS);
+ p = patterns[pat_index];
+
+ for (int j=0; j<NCHANNELS_RGB; ++j)
+ for (int i=0; i<NREGIONS; ++i)
+ {
+ endpts[i].A[j] = in.read(p.chan[j].nbitsizes[ABITINDEX(i)]);
+ endpts[i].B[j] = in.read(p.chan[j].nbitsizes[BBITINDEX(i)]);
+ }
+
+ for (int i=0; i<NREGIONS; ++i)
+ endpts[i].lsb = in.read(1);
+
+ nvAssert (in.getptr() == 82);
+}
+
+static void write_indices(const int indices[Tile::TILE_H][Tile::TILE_W], int shapeindex, Bits &out)
+{
+ int positions[NREGIONS];
+
+ for (int r = 0; r < NREGIONS; ++r)
+ positions[r] = SHAPEINDEX_TO_COMPRESSED_INDICES(shapeindex,r);
+
+ for (int pos = 0; pos < Tile::TILE_TOTAL; ++pos)
+ {
+ int x = POS_TO_X(pos);
+ int y = POS_TO_Y(pos);
+
+ bool match = false;
+
+ for (int r = 0; r < NREGIONS; ++r)
+ if (positions[r] == pos) { match = true; break; }
+
+ out.write(indices[y][x], INDEXBITS - (match ? 1 : 0));
+ }
+}
+
+static void read_indices(Bits &in, int shapeindex, int indices[Tile::TILE_H][Tile::TILE_W])
+{
+ int positions[NREGIONS];
+
+ for (int r = 0; r < NREGIONS; ++r)
+ positions[r] = SHAPEINDEX_TO_COMPRESSED_INDICES(shapeindex,r);
+
+ for (int pos = 0; pos < Tile::TILE_TOTAL; ++pos)
+ {
+ int x = POS_TO_X(pos);
+ int y = POS_TO_Y(pos);
+
+ bool match = false;
+
+ for (int r = 0; r < NREGIONS; ++r)
+ if (positions[r] == pos) { match = true; break; }
+
+ indices[y][x]= in.read(INDEXBITS - (match ? 1 : 0));
+ }
+}
+
+static void emit_block(const IntEndptsRGB_1 endpts[NREGIONS], int shapeindex, const Pattern &p, const int indices[Tile::TILE_H][Tile::TILE_W], char *block)
+{
+ Bits out(block, AVPCL::BITSIZE);
+
+ write_header(endpts, shapeindex, p, out);
+
+ write_indices(indices, shapeindex, out);
+
+ nvAssert(out.getptr() == AVPCL::BITSIZE);
+}
+
+static void generate_palette_quantized(const IntEndptsRGB_1 &endpts_1, const RegionPrec &region_prec, Vector4 palette[NINDICES])
+{
+ IntEndptsRGB endpts;
+
+ uncompress_one(endpts_1, endpts);
+
+ // scale endpoints
+ int a, b; // really need a IntVec4...
+
+ a = Utils::unquantize(endpts.A[0], region_prec.endpt_a_prec[0]+1); // +1 since we are in uncompressed space
+ b = Utils::unquantize(endpts.B[0], region_prec.endpt_b_prec[0]+1);
+
+ // note: don't simplify to a + ((b-a)*i + BIAS)/DENOM as that doesn't work due to the way C handles integer division of negatives
+
+ // interpolate
+ for (int i = 0; i < NINDICES; ++i)
+ palette[i].x = float(Utils::lerp(a, b, i, BIAS, DENOM));
+
+ a = Utils::unquantize(endpts.A[1], region_prec.endpt_a_prec[1]+1);
+ b = Utils::unquantize(endpts.B[1], region_prec.endpt_b_prec[1]+1);
+
+ // interpolate
+ for (int i = 0; i < NINDICES; ++i)
+ palette[i].y = float(Utils::lerp(a, b, i, BIAS, DENOM));
+
+ a = Utils::unquantize(endpts.A[2], region_prec.endpt_a_prec[2]+1);
+ b = Utils::unquantize(endpts.B[2], region_prec.endpt_b_prec[2]+1);
+
+ // interpolate
+ for (int i = 0; i < NINDICES; ++i)
+ palette[i].z = float(Utils::lerp(a, b, i, BIAS, DENOM));
+
+ // constant alpha
+ for (int i = 0; i < NINDICES; ++i)
+ palette[i].w = 255.0f;
+}
+
+// sign extend but only if it was transformed
+static void sign_extend(Pattern &p, IntEndptsRGB_1 endpts[NREGIONS])
+{
+ nvUnreachable();
+}
+
+void AVPCL::decompress_mode1(const char *block, Tile &t)
+{
+ Bits in(block, AVPCL::BITSIZE);
+
+ Pattern p;
+ IntEndptsRGB_1 endpts[NREGIONS];
+ int shapeindex, pat_index;
+
+ read_header(in, endpts, shapeindex, p, pat_index);
+
+ if (p.transformed)
+ {
+ sign_extend(p, endpts);
+ transform_inverse(endpts);
+ }
+
+ Vector4 palette[NREGIONS][NINDICES];
+ for (int r = 0; r < NREGIONS; ++r)
+ generate_palette_quantized(endpts[r], pattern_precs[pat_index].region_precs[r], &palette[r][0]);
+
+ int indices[Tile::TILE_H][Tile::TILE_W];
+
+ read_indices(in, shapeindex, indices);
+
+ nvAssert(in.getptr() == AVPCL::BITSIZE);
+
+ // lookup
+ for (int y = 0; y < Tile::TILE_H; y++)
+ for (int x = 0; x < Tile::TILE_W; x++)
+ t.data[y][x] = palette[REGION(x,y,shapeindex)][indices[y][x]];
+}
+
+// given a collection of colors and quantized endpoints, generate a palette, choose best entries, and return a single toterr
+static float map_colors(const Vector4 colors[], const float importance[], int np, const IntEndptsRGB_1 &endpts, const RegionPrec &region_prec, float current_err, int indices[Tile::TILE_TOTAL])
+{
+ Vector4 palette[NINDICES];
+ float toterr = 0;
+ Vector4 err;
+
+ generate_palette_quantized(endpts, region_prec, palette);
+
+ for (int i = 0; i < np; ++i)
+ {
+ float besterr = FLT_MAX;
+
+ for (int j = 0; j < NINDICES && besterr > 0; ++j)
+ {
+ float err = Utils::metric4(colors[i], palette[j]) * importance[i];
+
+ if (err > besterr) // error increased, so we're done searching
+ break;
+ if (err < besterr)
+ {
+ besterr = err;
+ indices[i] = j;
+ }
+ }
+ toterr += besterr;
+
+ // check for early exit
+ if (toterr > current_err)
+ {
+ // fill out bogus index values so it's initialized at least
+ for (int k = i; k < np; ++k)
+ indices[k] = -1;
+
+ return FLT_MAX;
+ }
+ }
+ return toterr;
+}
+
+// assign indices given a tile, shape, and quantized endpoints, return toterr for each region
+static void assign_indices(const Tile &tile, int shapeindex, IntEndptsRGB_1 endpts[NREGIONS], const PatternPrec &pattern_prec,
+ int indices[Tile::TILE_H][Tile::TILE_W], float toterr[NREGIONS])
+{
+ // build list of possibles
+ Vector4 palette[NREGIONS][NINDICES];
+
+ for (int region = 0; region < NREGIONS; ++region)
+ {
+ generate_palette_quantized(endpts[region], pattern_prec.region_precs[region], &palette[region][0]);
+ toterr[region] = 0;
+ }
+
+ Vector4 err;
+
+ for (int y = 0; y < tile.size_y; y++)
+ for (int x = 0; x < tile.size_x; x++)
+ {
+ int region = REGION(x,y,shapeindex);
+ float err, besterr = FLT_MAX;
+
+ for (int i = 0; i < NINDICES && besterr > 0; ++i)
+ {
+ err = Utils::metric4(tile.data[y][x], palette[region][i]);
+
+ if (err > besterr) // error increased, so we're done searching
+ break;
+ if (err < besterr)
+ {
+ besterr = err;
+ indices[y][x] = i;
+ }
+ }
+ toterr[region] += besterr;
+ }
+}
+
+// note: indices are valid only if the value returned is less than old_err; otherwise they contain -1's
+// this function returns either old_err or a value smaller (if it was successful in improving the error)
+static float perturb_one(const Vector4 colors[], const float importance[], int np, int ch, const RegionPrec &region_prec, const IntEndptsRGB_1 &old_endpts, IntEndptsRGB_1 &new_endpts,
+ float old_err, int do_b, int indices[Tile::TILE_TOTAL])
+{
+ // we have the old endpoints: old_endpts
+ // we have the perturbed endpoints: new_endpts
+ // we have the temporary endpoints: temp_endpts
+
+ IntEndptsRGB_1 temp_endpts;
+ float min_err = old_err; // start with the best current error
+ int beststep;
+ int temp_indices[Tile::TILE_TOTAL];
+
+ for (int i=0; i<np; ++i)
+ indices[i] = -1;
+
+ // copy real endpoints so we can perturb them
+ temp_endpts = new_endpts = old_endpts;
+
+ int prec = do_b ? region_prec.endpt_b_prec[ch] : region_prec.endpt_a_prec[ch];
+
+ // do a logarithmic search for the best error for this endpoint (which)
+ for (int step = 1 << (prec-1); step; step >>= 1)
+ {
+ bool improved = false;
+ for (int sign = -1; sign <= 1; sign += 2)
+ {
+ if (do_b == 0)
+ {
+ temp_endpts.A[ch] = new_endpts.A[ch] + sign * step;
+ if (temp_endpts.A[ch] < 0 || temp_endpts.A[ch] >= (1 << prec))
+ continue;
+ }
+ else
+ {
+ temp_endpts.B[ch] = new_endpts.B[ch] + sign * step;
+ if (temp_endpts.B[ch] < 0 || temp_endpts.B[ch] >= (1 << prec))
+ continue;
+ }
+
+ float err = map_colors(colors, importance, np, temp_endpts, region_prec, min_err, temp_indices);
+
+ if (err < min_err)
+ {
+ improved = true;
+ min_err = err;
+ beststep = sign * step;
+ for (int i=0; i<np; ++i)
+ indices[i] = temp_indices[i];
+ }
+ }
+ // if this was an improvement, move the endpoint and continue search from there
+ if (improved)
+ {
+ if (do_b == 0)
+ new_endpts.A[ch] += beststep;
+ else
+ new_endpts.B[ch] += beststep;
+ }
+ }
+ return min_err;
+}
+
+// the larger the error the more time it is worth spending on an exhaustive search.
+// perturb the endpoints at least -3 to 3.
+// if err > 5000 perturb endpoints 50% of precision
+// if err > 1000 25%
+// if err > 200 12.5%
+// if err > 40 6.25%
+// for np = 16 -- adjust error thresholds as a function of np
+// always ensure endpoint ordering is preserved (no need to overlap the scan)
+// if orig_err returned from this is less than its input value, then indices[] will contain valid indices
+static float exhaustive(const Vector4 colors[], const float importance[], int np, int ch, const RegionPrec &region_prec, float orig_err, IntEndptsRGB_1 &opt_endpts, int indices[Tile::TILE_TOTAL])
+{
+ IntEndptsRGB_1 temp_endpts;
+ float best_err = orig_err;
+ int aprec = region_prec.endpt_a_prec[ch];
+ int bprec = region_prec.endpt_b_prec[ch];
+ int good_indices[Tile::TILE_TOTAL];
+ int temp_indices[Tile::TILE_TOTAL];
+
+ for (int i=0; i<np; ++i)
+ indices[i] = -1;
+
+ float thr_scale = (float)np / (float)Tile::TILE_TOTAL;
+
+ if (orig_err == 0) return orig_err;
+
+ int adelta = 0, bdelta = 0;
+ if (orig_err > 5000.0*thr_scale) { adelta = (1 << aprec)/2; bdelta = (1 << bprec)/2; }
+ else if (orig_err > 1000.0*thr_scale) { adelta = (1 << aprec)/4; bdelta = (1 << bprec)/4; }
+ else if (orig_err > 200.0*thr_scale) { adelta = (1 << aprec)/8; bdelta = (1 << bprec)/8; }
+ else if (orig_err > 40.0*thr_scale) { adelta = (1 << aprec)/16; bdelta = (1 << bprec)/16; }
+ adelta = max(adelta, 3);
+ bdelta = max(bdelta, 3);
+
+#ifdef DISABLE_EXHAUSTIVE
+ adelta = bdelta = 3;
+#endif
+
+ temp_endpts = opt_endpts;
+
+ // ok figure out the range of A and B
+ int alow = max(0, opt_endpts.A[ch] - adelta);
+ int ahigh = min((1<<aprec)-1, opt_endpts.A[ch] + adelta);
+ int blow = max(0, opt_endpts.B[ch] - bdelta);
+ int bhigh = min((1<<bprec)-1, opt_endpts.B[ch] + bdelta);
+
+ // now there's no need to swap the ordering of A and B
+ bool a_le_b = opt_endpts.A[ch] <= opt_endpts.B[ch];
+
+ int amin, bmin;
+
+ if (opt_endpts.A[ch] <= opt_endpts.B[ch])
+ {
+ // keep a <= b
+ for (int a = alow; a <= ahigh; ++a)
+ for (int b = max(a, blow); b < bhigh; ++b)
+ {
+ temp_endpts.A[ch] = a;
+ temp_endpts.B[ch] = b;
+
+ float err = map_colors(colors, importance, np, temp_endpts, region_prec, best_err, temp_indices);
+ if (err < best_err)
+ {
+ amin = a;
+ bmin = b;
+ best_err = err;
+ for (int i=0; i<np; ++i)
+ good_indices[i] = temp_indices[i];
+ }
+ }
+ }
+ else
+ {
+ // keep b <= a
+ for (int b = blow; b < bhigh; ++b)
+ for (int a = max(b, alow); a <= ahigh; ++a)
+ {
+ temp_endpts.A[ch] = a;
+ temp_endpts.B[ch] = b;
+
+ float err = map_colors(colors, importance, np, temp_endpts, region_prec, best_err, temp_indices);
+ if (err < best_err)
+ {
+ amin = a;
+ bmin = b;
+ best_err = err;
+ for (int i=0; i<np; ++i)
+ good_indices[i] = temp_indices[i];
+ }
+ }
+ }
+ if (best_err < orig_err)
+ {
+ opt_endpts.A[ch] = amin;
+ opt_endpts.B[ch] = bmin;
+ // if we actually improved, update the indices
+ for (int i=0; i<np; ++i)
+ indices[i] = good_indices[i];
+ }
+ return best_err;
+}
+
+static float optimize_one(const Vector4 colors[], const float importance[], int np, float orig_err, const IntEndptsRGB_1 &orig_endpts, const RegionPrec &region_prec, IntEndptsRGB_1 &opt_endpts)
+{
+ float opt_err = orig_err;
+
+ opt_endpts = orig_endpts;
+
+ /*
+ err0 = perturb(rgb0, delta0)
+ err1 = perturb(rgb1, delta1)
+ if (err0 < err1)
+ if (err0 >= initial_error) break
+ rgb0 += delta0
+ next = 1
+ else
+ if (err1 >= initial_error) break
+ rgb1 += delta1
+ next = 0
+ initial_err = map()
+ for (;;)
+ err = perturb(next ? rgb1:rgb0, delta)
+ if (err >= initial_err) break
+ next? rgb1 : rgb0 += delta
+ initial_err = err
+ */
+ IntEndptsRGB_1 new_a, new_b;
+ IntEndptsRGB_1 new_endpt;
+ int do_b;
+ int orig_indices[Tile::TILE_TOTAL];
+ int new_indices[Tile::TILE_TOTAL];
+ int temp_indices0[Tile::TILE_TOTAL];
+ int temp_indices1[Tile::TILE_TOTAL];
+
+ // now optimize each channel separately
+ // for the first error improvement, we save the indices. then, for any later improvement, we compare the indices
+ // if they differ, we restart the loop (which then falls back to looking for a first improvement.)
+ for (int ch = 0; ch < NCHANNELS_RGB; ++ch)
+ {
+ // figure out which endpoint when perturbed gives the most improvement and start there
+ // if we just alternate, we can easily end up in a local minima
+ float err0 = perturb_one(colors, importance, np, ch, region_prec, opt_endpts, new_a, opt_err, 0, temp_indices0); // perturb endpt A
+ float err1 = perturb_one(colors, importance, np, ch, region_prec, opt_endpts, new_b, opt_err, 1, temp_indices1); // perturb endpt B
+
+ if (err0 < err1)
+ {
+ if (err0 >= opt_err)
+ continue;
+
+ for (int i=0; i<np; ++i)
+ {
+ new_indices[i] = orig_indices[i] = temp_indices0[i];
+ nvAssert (orig_indices[i] != -1);
+ }
+
+ opt_endpts.A[ch] = new_a.A[ch];
+ opt_err = err0;
+ do_b = 1; // do B next
+ }
+ else
+ {
+ if (err1 >= opt_err)
+ continue;
+
+ for (int i=0; i<np; ++i)
+ {
+ new_indices[i] = orig_indices[i] = temp_indices1[i];
+ nvAssert (orig_indices[i] != -1);
+ }
+
+ opt_endpts.B[ch] = new_b.B[ch];
+ opt_err = err1;
+ do_b = 0; // do A next
+ }
+
+ // now alternate endpoints and keep trying until there is no improvement
+ for (;;)
+ {
+ float err = perturb_one(colors, importance, np, ch, region_prec, opt_endpts, new_endpt, opt_err, do_b, temp_indices0);
+ if (err >= opt_err)
+ break;
+
+ for (int i=0; i<np; ++i)
+ {
+ new_indices[i] = temp_indices0[i];
+ nvAssert (new_indices[i] != -1);
+ }
+
+ if (do_b == 0)
+ opt_endpts.A[ch] = new_endpt.A[ch];
+ else
+ opt_endpts.B[ch] = new_endpt.B[ch];
+ opt_err = err;
+ do_b = 1 - do_b; // now move the other endpoint
+ }
+
+ // see if the indices have changed
+ int i;
+ for (i=0; i<np; ++i)
+ if (orig_indices[i] != new_indices[i])
+ break;
+
+ if (i<np)
+ ch = -1; // start over
+ }
+
+ // finally, do a small exhaustive search around what we think is the global minima to be sure
+ // note this is independent of the above search, so we don't care about the indices from the above
+ // we don't care about the above because if they differ, so what? we've already started at ch=0
+ bool first = true;
+ for (int ch = 0; ch < NCHANNELS_RGB; ++ch)
+ {
+ float new_err = exhaustive(colors, importance, np, ch, region_prec, opt_err, opt_endpts, temp_indices0);
+
+ if (new_err < opt_err)
+ {
+ opt_err = new_err;
+
+ if (first)
+ {
+ for (int i=0; i<np; ++i)
+ {
+ orig_indices[i] = temp_indices0[i];
+ nvAssert (orig_indices[i] != -1);
+ }
+ first = false;
+ }
+ else
+ {
+ // see if the indices have changed
+ int i;
+ for (i=0; i<np; ++i)
+ if (orig_indices[i] != temp_indices0[i])
+ break;
+
+ if (i<np)
+ {
+ ch = -1; // start over
+ first = true;
+ }
+ }
+ }
+ }
+
+ return opt_err;
+}
+
+static void optimize_endpts(const Tile &tile, int shapeindex, const float orig_err[NREGIONS],
+ IntEndptsRGB_1 orig_endpts[NREGIONS], const PatternPrec &pattern_prec, float opt_err[NREGIONS], IntEndptsRGB_1 opt_endpts[NREGIONS])
+{
+ Vector4 pixels[Tile::TILE_TOTAL];
+ float importance[Tile::TILE_TOTAL];
+ IntEndptsRGB_1 temp_in, temp_out;
+ int temp_indices[Tile::TILE_TOTAL];
+
+ for (int region=0; region<NREGIONS; ++region)
+ {
+ // collect the pixels in the region
+ int np = 0;
+
+ for (int y = 0; y < tile.size_y; y++) {
+ for (int x = 0; x < tile.size_x; x++) {
+ if (REGION(x, y, shapeindex) == region) {
+ pixels[np] = tile.data[y][x];
+ importance[np] = tile.importance_map[y][x];
+ np++;
+ }
+ }
+ }
+
+ opt_endpts[region] = temp_in = orig_endpts[region];
+ opt_err[region] = orig_err[region];
+
+ float best_err = orig_err[region];
+
+ for (int lsbmode=0; lsbmode<NLSBMODES; ++lsbmode)
+ {
+ temp_in.lsb = lsbmode;
+
+ // make sure we have a valid error for temp_in
+ // we use FLT_MAX here because we want an accurate temp_in_err, no shortcuts
+ // (mapcolors will compute a mapping but will stop if the error exceeds the value passed in the FLT_MAX position)
+ float temp_in_err = map_colors(pixels, importance, np, temp_in, pattern_prec.region_precs[region], FLT_MAX, temp_indices);
+
+ // now try to optimize these endpoints
+ float temp_out_err = optimize_one(pixels, importance, np, temp_in_err, temp_in, pattern_prec.region_precs[region], temp_out);
+
+ // if we find an improvement, update the best so far and correct the output endpoints and errors
+ if (temp_out_err < best_err)
+ {
+ best_err = temp_out_err;
+ opt_err[region] = temp_out_err;
+ opt_endpts[region] = temp_out;
+ }
+ }
+ }
+}
+
+
+/* optimization algorithm
+ for each pattern
+ convert endpoints using pattern precision
+ assign indices and get initial error
+ compress indices (and possibly reorder endpoints)
+ transform endpoints
+ if transformed endpoints fit pattern
+ get original endpoints back
+ optimize endpoints, get new endpoints, new indices, and new error // new error will almost always be better
+ compress new indices
+ transform new endpoints
+ if new endpoints fit pattern AND if error is improved
+ emit compressed block with new data
+ else
+ emit compressed block with original data // to try to preserve maximum endpoint precision
+*/
+
+static float refine(const Tile &tile, int shapeindex_best, const FltEndpts endpts[NREGIONS], char *block)
+{
+ float orig_err[NREGIONS], opt_err[NREGIONS], orig_toterr, opt_toterr, expected_opt_err[NREGIONS];
+ IntEndptsRGB_1 orig_endpts[NREGIONS], opt_endpts[NREGIONS];
+ int orig_indices[Tile::TILE_H][Tile::TILE_W], opt_indices[Tile::TILE_H][Tile::TILE_W];
+
+ for (int sp = 0; sp < NPATTERNS; ++sp)
+ {
+ quantize_endpts(endpts, pattern_precs[sp], orig_endpts);
+ assign_indices(tile, shapeindex_best, orig_endpts, pattern_precs[sp], orig_indices, orig_err);
+ swap_indices(orig_endpts, orig_indices, shapeindex_best);
+ if (patterns[sp].transformed)
+ transform_forward(orig_endpts);
+ // apply a heuristic here -- we check if the endpoints fit before we try to optimize them.
+ // the assumption made is that if they don't fit now, they won't fit after optimizing.
+ if (endpts_fit(orig_endpts, patterns[sp]))
+ {
+ if (patterns[sp].transformed)
+ transform_inverse(orig_endpts);
+ optimize_endpts(tile, shapeindex_best, orig_err, orig_endpts, pattern_precs[sp], expected_opt_err, opt_endpts);
+ assign_indices(tile, shapeindex_best, opt_endpts, pattern_precs[sp], opt_indices, opt_err);
+ // (nreed) Commented out asserts because they go off all the time...not sure why
+ //for (int i=0; i<NREGIONS; ++i)
+ // nvAssert(expected_opt_err[i] == opt_err[i]);
+ swap_indices(opt_endpts, opt_indices, shapeindex_best);
+ if (patterns[sp].transformed)
+ transform_forward(opt_endpts);
+ orig_toterr = opt_toterr = 0;
+ for (int i=0; i < NREGIONS; ++i) { orig_toterr += orig_err[i]; opt_toterr += opt_err[i]; }
+ //nvAssert(opt_toterr <= orig_toterr);
+ if (endpts_fit(opt_endpts, patterns[sp]) && opt_toterr < orig_toterr)
+ {
+ emit_block(opt_endpts, shapeindex_best, patterns[sp], opt_indices, block);
+ return opt_toterr;
+ }
+ else
+ {
+ // either it stopped fitting when we optimized it, or there was no improvement
+ // so go back to the unoptimized endpoints which we know will fit
+ if (patterns[sp].transformed)
+ transform_forward(orig_endpts);
+ emit_block(orig_endpts, shapeindex_best, patterns[sp], orig_indices, block);
+ return orig_toterr;
+ }
+ }
+ }
+ nvAssert(false); //throw "No candidate found, should never happen (mode avpcl 1).";
+ return FLT_MAX;
+}
+
+static void clamp(Vector4 &v)
+{
+ if (v.x < 0.0f) v.x = 0.0f;
+ if (v.x > 255.0f) v.x = 255.0f;
+ if (v.y < 0.0f) v.y = 0.0f;
+ if (v.y > 255.0f) v.y = 255.0f;
+ if (v.z < 0.0f) v.z = 0.0f;
+ if (v.z > 255.0f) v.z = 255.0f;
+ v.w = 255.0f;
+}
+
+static void generate_palette_unquantized(const FltEndpts endpts[NREGIONS], Vector4 palette[NREGIONS][NINDICES])
+{
+ for (int region = 0; region < NREGIONS; ++region)
+ for (int i = 0; i < NINDICES; ++i)
+ palette[region][i] = Utils::lerp(endpts[region].A, endpts[region].B, i, 0, DENOM);
+}
+
+// generate a palette from unquantized endpoints, then pick best palette color for all pixels in each region, return toterr for all regions combined
+static float map_colors(const Tile &tile, int shapeindex, const FltEndpts endpts[NREGIONS])
+{
+ // build list of possibles
+ Vector4 palette[NREGIONS][NINDICES];
+
+ generate_palette_unquantized(endpts, palette);
+
+ float toterr = 0;
+ Vector4 err;
+
+ for (int y = 0; y < tile.size_y; y++)
+ for (int x = 0; x < tile.size_x; x++)
+ {
+ int region = REGION(x,y,shapeindex);
+ float besterr = FLT_MAX;
+
+ for (int i = 0; i < NINDICES && besterr > 0; ++i)
+ {
+ float err = Utils::metric4(tile.data[y][x], palette[region][i]) * tile.importance_map[y][x];
+
+ if (err > besterr) // error increased, so we're done searching. this works for most norms.
+ break;
+ if (err < besterr)
+ besterr = err;
+ }
+ toterr += besterr;
+ }
+ return toterr;
+}
+
+static float rough(const Tile &tile, int shapeindex, FltEndpts endpts[NREGIONS])
+{
+ for (int region=0; region<NREGIONS; ++region)
+ {
+ int np = 0;
+ Vector3 colors[Tile::TILE_TOTAL];
+ float alphas[2];
+ Vector4 mean(0,0,0,0);
+
+ for (int y = 0; y < tile.size_y; y++)
+ for (int x = 0; x < tile.size_x; x++)
+ if (REGION(x,y,shapeindex) == region)
+ {
+ colors[np] = tile.data[y][x].xyz();
+ if (np < 2) alphas[np] = tile.data[y][x].w;
+ mean += tile.data[y][x];
+ ++np;
+ }
+
+ // handle simple cases
+ if (np == 0)
+ {
+ Vector4 zero(0,0,0,255.0f);
+ endpts[region].A = zero;
+ endpts[region].B = zero;
+ continue;
+ }
+ else if (np == 1)
+ {
+ endpts[region].A = Vector4(colors[0], alphas[0]);
+ endpts[region].B = Vector4(colors[0], alphas[0]);
+ continue;
+ }
+ else if (np == 2)
+ {
+ endpts[region].A = Vector4(colors[0], alphas[0]);
+ endpts[region].B = Vector4(colors[1], alphas[1]);
+ continue;
+ }
+
+ mean /= float(np);
+
+ Vector3 direction = Fit::computePrincipalComponent_EigenSolver(np, colors);
+
+ // project each pixel value along the principal direction
+ float minp = FLT_MAX, maxp = -FLT_MAX;
+ for (int i = 0; i < np; i++)
+ {
+ float dp = dot(colors[i]-mean.xyz(), direction);
+ if (dp < minp) minp = dp;
+ if (dp > maxp) maxp = dp;
+ }
+
+ // choose as endpoints 2 points along the principal direction that span the projections of all of the pixel values
+ endpts[region].A = mean + minp*Vector4(direction, 0);
+ endpts[region].B = mean + maxp*Vector4(direction, 0);
+
+ // clamp endpoints
+ // the argument for clamping is that the actual endpoints need to be clamped and thus we need to choose the best
+ // shape based on endpoints being clamped
+ clamp(endpts[region].A);
+ clamp(endpts[region].B);
+ }
+
+ return map_colors(tile, shapeindex, endpts);
+}
+
+static void swap(float *list1, int *list2, int i, int j)
+{
+ float t = list1[i]; list1[i] = list1[j]; list1[j] = t;
+ int t1 = list2[i]; list2[i] = list2[j]; list2[j] = t1;
+}
+
+float AVPCL::compress_mode1(const Tile &t, char *block)
+{
+ // number of rough cases to look at. reasonable values of this are 1, NSHAPES/4, and NSHAPES
+ // NSHAPES/4 gets nearly all the cases; you can increase that a bit (say by 3 or 4) if you really want to squeeze the last bit out
+ const int NITEMS=NSHAPES/4;
+
+ // pick the best NITEMS shapes and refine these.
+ struct {
+ FltEndpts endpts[NREGIONS];
+ } all[NSHAPES];
+ float roughmse[NSHAPES];
+ int index[NSHAPES];
+ char tempblock[AVPCL::BLOCKSIZE];
+ float msebest = FLT_MAX;
+
+ for (int i=0; i<NSHAPES; ++i)
+ {
+ roughmse[i] = rough(t, i, &all[i].endpts[0]);
+ index[i] = i;
+ }
+
+ // bubble sort -- only need to bubble up the first NITEMS items
+ for (int i=0; i<NITEMS; ++i)
+ for (int j=i+1; j<NSHAPES; ++j)
+ if (roughmse[i] > roughmse[j])
+ swap(roughmse, index, i, j);
+
+ for (int i=0; i<NITEMS && msebest>0; ++i)
+ {
+ int shape = index[i];
+ float mse = refine(t, shape, &all[shape].endpts[0], tempblock);
+ if (mse < msebest)
+ {
+ memcpy(block, tempblock, sizeof(tempblock));
+ msebest = mse;
+ }
+ }
+ return msebest;
+}
+
diff --git a/3rdparty/bgfx/3rdparty/nvtt/bc7/avpcl_mode2.cpp b/3rdparty/bgfx/3rdparty/nvtt/bc7/avpcl_mode2.cpp
new file mode 100644
index 00000000000..380ffcef5f9
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/nvtt/bc7/avpcl_mode2.cpp
@@ -0,0 +1,1004 @@
+/*
+Copyright 2007 nVidia, Inc.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
+
+You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+See the License for the specific language governing permissions and limitations under the License.
+*/
+
+// Thanks to Jacob Munkberg (jacob@cs.lth.se) for the shortcut of using SVD to do the equivalent of principal components analysis
+
+// x100 555x6 64p 2bi
+
+#include "bits.h"
+#include "tile.h"
+#include "avpcl.h"
+#include "nvcore/debug.h"
+#include "nvmath/vector.inl"
+#include "nvmath/matrix.inl"
+#include "nvmath/fitting.h"
+#include "avpcl_utils.h"
+#include "endpts.h"
+#include <string.h>
+#include <float.h>
+
+#include "shapes_three.h"
+
+using namespace nv;
+using namespace AVPCL;
+
+#define NINDICES 4
+#define INDEXBITS 2
+#define HIGH_INDEXBIT (1<<(INDEXBITS-1))
+#define DENOM (NINDICES-1)
+#define BIAS (DENOM/2)
+
+// WORK: determine optimal traversal pattern to search for best shape -- what does the error curve look like?
+// i.e. can we search shapes in a particular order so we can see the global error minima easily and
+// stop without having to touch all shapes?
+
+#define POS_TO_X(pos) ((pos)&3)
+#define POS_TO_Y(pos) (((pos)>>2)&3)
+
+#define NBITSIZES 6
+
+struct ChanBits
+{
+ int nbitsizes[NBITSIZES]; // bitsizes for one channel
+};
+
+struct Pattern
+{
+ ChanBits chan[NCHANNELS_RGB];// bit patterns used per channel
+ int transformed; // if 0, deltas are unsigned and no transform; otherwise, signed and transformed
+ int mode; // associated mode value
+ int modebits; // number of mode bits
+ const char *encoding; // verilog description of encoding for this mode
+};
+
+#define NPATTERNS 1
+
+static Pattern patterns[NPATTERNS] =
+{
+ // red green blue xfm mode mb
+ 5,5,5,5,5,5, 5,5,5,5,5,5, 5,5,5,5,5,5, 0, 0x4, 3, "",
+};
+
+
+struct RegionPrec
+{
+ int endpt_a_prec[NCHANNELS_RGB];
+ int endpt_b_prec[NCHANNELS_RGB];
+};
+
+struct PatternPrec
+{
+ RegionPrec region_precs[NREGIONS_THREE];
+};
+
+
+// this is the precision for each channel and region
+// NOTE: this MUST match the corresponding data in "patterns" above -- WARNING: there is NO nvAssert to check this!
+
+static PatternPrec pattern_precs[NPATTERNS] =
+{
+ 5,5,5, 5,5,5, 5,5,5, 5,5,5, 5,5,5, 5,5,5,
+};
+
+// return # of bits needed to store n. handle signed or unsigned cases properly
+static int nbits(int n, bool issigned)
+{
+ int nb;
+ if (n==0)
+ return 0; // no bits needed for 0, signed or not
+ else if (n > 0)
+ {
+ for (nb=0; n; ++nb, n>>=1) ;
+ return nb + (issigned?1:0);
+ }
+ else
+ {
+ nvAssert (issigned);
+ for (nb=0; n<-1; ++nb, n>>=1) ;
+ return nb + 1;
+ }
+}
+
+#define R_0 ep[0].A[i]
+#define R_1 ep[0].B[i]
+#define R_2 ep[1].A[i]
+#define R_3 ep[1].B[i]
+
+static void transform_forward(IntEndptsRGB ep[NREGIONS])
+{
+ for (int i=0; i<NCHANNELS_RGB; ++i)
+ {
+ R_1 -= R_3; R_2 -= R_3; R_0 -= R_3;
+ }
+}
+
+static void transform_inverse(IntEndptsRGB ep[NREGIONS])
+{
+ for (int i=0; i<NCHANNELS_RGB; ++i)
+ {
+ R_0 += R_3; R_2 += R_3; R_1 += R_3;
+ }
+}
+
+static void quantize_endpts(const FltEndpts endpts[NREGIONS_THREE], const PatternPrec &pattern_prec, IntEndptsRGB q_endpts[NREGIONS_THREE])
+{
+ for (int region = 0; region < NREGIONS_THREE; ++region)
+ {
+ q_endpts[region].A[0] = Utils::quantize(endpts[region].A.x, pattern_prec.region_precs[region].endpt_a_prec[0]);
+ q_endpts[region].A[1] = Utils::quantize(endpts[region].A.y, pattern_prec.region_precs[region].endpt_a_prec[1]);
+ q_endpts[region].A[2] = Utils::quantize(endpts[region].A.z, pattern_prec.region_precs[region].endpt_a_prec[2]);
+ q_endpts[region].B[0] = Utils::quantize(endpts[region].B.x, pattern_prec.region_precs[region].endpt_b_prec[0]);
+ q_endpts[region].B[1] = Utils::quantize(endpts[region].B.y, pattern_prec.region_precs[region].endpt_b_prec[1]);
+ q_endpts[region].B[2] = Utils::quantize(endpts[region].B.z, pattern_prec.region_precs[region].endpt_b_prec[2]);
+ }
+}
+
+// swap endpoints as needed to ensure that the indices at index_positions have a 0 high-order bit
+static void swap_indices(IntEndptsRGB endpts[NREGIONS_THREE], int indices[Tile::TILE_H][Tile::TILE_W], int shapeindex)
+{
+ for (int region = 0; region < NREGIONS_THREE; ++region)
+ {
+ int position = SHAPEINDEX_TO_COMPRESSED_INDICES(shapeindex,region);
+
+ int x = POS_TO_X(position);
+ int y = POS_TO_Y(position);
+ nvAssert(REGION(x,y,shapeindex) == region); // double check the table
+ if (indices[y][x] & HIGH_INDEXBIT)
+ {
+ // high bit is set, swap the endpts and indices for this region
+ int t;
+ for (int i=0; i<NCHANNELS_RGB; ++i) { t = endpts[region].A[i]; endpts[region].A[i] = endpts[region].B[i]; endpts[region].B[i] = t; }
+
+ for (int y = 0; y < Tile::TILE_H; y++)
+ for (int x = 0; x < Tile::TILE_W; x++)
+ if (REGION(x,y,shapeindex) == region)
+ indices[y][x] = NINDICES - 1 - indices[y][x];
+ }
+ }
+}
+
+static bool endpts_fit(IntEndptsRGB endpts[NREGIONS_THREE], const Pattern &p)
+{
+ return true;
+}
+
+
+static void write_header(const IntEndptsRGB endpts[NREGIONS_THREE], int shapeindex, const Pattern &p, Bits &out)
+{
+ out.write(p.mode, p.modebits);
+ out.write(shapeindex, SHAPEBITS);
+
+ for (int j=0; j<NCHANNELS_RGB; ++j)
+ for (int i=0; i<NREGIONS_THREE; ++i)
+ {
+ out.write(endpts[i].A[j], p.chan[j].nbitsizes[i*2+0]);
+ out.write(endpts[i].B[j], p.chan[j].nbitsizes[i*2+1]);
+ }
+ nvAssert (out.getptr() == 99);
+}
+
+static void read_header(Bits &in, IntEndptsRGB endpts[NREGIONS_THREE], int &shapeindex, Pattern &p, int &pat_index)
+{
+ int mode = AVPCL::getmode(in);
+
+ pat_index = 0;
+ nvAssert (pat_index >= 0 && pat_index < NPATTERNS);
+ nvAssert (in.getptr() == patterns[pat_index].modebits);
+
+ shapeindex = in.read(SHAPEBITS);
+
+ p = patterns[pat_index];
+
+ for (int j=0; j<NCHANNELS_RGB; ++j)
+ for (int i=0; i<NREGIONS_THREE; ++i)
+ {
+ endpts[i].A[j] = in.read(p.chan[j].nbitsizes[i*2+0]);
+ endpts[i].B[j] = in.read(p.chan[j].nbitsizes[i*2+1]);
+ }
+ nvAssert (in.getptr() == 99);
+}
+
+
+// WORK PLACEHOLDER -- keep it simple for now
+static void write_indices(const int indices[Tile::TILE_H][Tile::TILE_W], int shapeindex, Bits &out)
+{
+ int positions[NREGIONS_THREE];
+
+ for (int r = 0; r < NREGIONS_THREE; ++r)
+ positions[r] = SHAPEINDEX_TO_COMPRESSED_INDICES(shapeindex,r);
+
+ for (int pos = 0; pos < Tile::TILE_TOTAL; ++pos)
+ {
+ int x = POS_TO_X(pos);
+ int y = POS_TO_Y(pos);
+
+ bool match = false;
+
+ for (int r = 0; r < NREGIONS_THREE; ++r)
+ if (positions[r] == pos) { match = true; break; }
+
+ out.write(indices[y][x], INDEXBITS - (match ? 1 : 0));
+ }
+}
+
+static void read_indices(Bits &in, int shapeindex, int indices[Tile::TILE_H][Tile::TILE_W])
+{
+ int positions[NREGIONS_THREE];
+
+ for (int r = 0; r < NREGIONS_THREE; ++r)
+ positions[r] = SHAPEINDEX_TO_COMPRESSED_INDICES(shapeindex,r);
+
+ for (int pos = 0; pos < Tile::TILE_TOTAL; ++pos)
+ {
+ int x = POS_TO_X(pos);
+ int y = POS_TO_Y(pos);
+
+ bool match = false;
+
+ for (int r = 0; r < NREGIONS_THREE; ++r)
+ if (positions[r] == pos) { match = true; break; }
+
+ indices[y][x]= in.read(INDEXBITS - (match ? 1 : 0));
+ }
+}
+
+static void emit_block(const IntEndptsRGB endpts[NREGIONS_THREE], int shapeindex, const Pattern &p, const int indices[Tile::TILE_H][Tile::TILE_W], char *block)
+{
+ Bits out(block, AVPCL::BITSIZE);
+
+ write_header(endpts, shapeindex, p, out);
+
+ write_indices(indices, shapeindex, out);
+
+ nvAssert(out.getptr() == AVPCL::BITSIZE);
+}
+
+static void generate_palette_quantized(const IntEndptsRGB &endpts, const RegionPrec &region_prec, Vector4 palette[NINDICES])
+{
+ // scale endpoints
+ int a, b; // really need a IntVec4...
+
+ a = Utils::unquantize(endpts.A[0], region_prec.endpt_a_prec[0]);
+ b = Utils::unquantize(endpts.B[0], region_prec.endpt_b_prec[0]);
+
+ // interpolate
+ for (int i = 0; i < NINDICES; ++i)
+ palette[i].x = float(Utils::lerp(a, b, i, BIAS, DENOM));
+
+ a = Utils::unquantize(endpts.A[1], region_prec.endpt_a_prec[1]);
+ b = Utils::unquantize(endpts.B[1], region_prec.endpt_b_prec[1]);
+
+ // interpolate
+ for (int i = 0; i < NINDICES; ++i)
+ palette[i].y = float(Utils::lerp(a, b, i, BIAS, DENOM));
+
+ a = Utils::unquantize(endpts.A[2], region_prec.endpt_a_prec[2]);
+ b = Utils::unquantize(endpts.B[2], region_prec.endpt_b_prec[2]);
+
+ // interpolate
+ for (int i = 0; i < NINDICES; ++i)
+ palette[i].z = float(Utils::lerp(a, b, i, BIAS, DENOM));
+
+ // constant alpha
+ for (int i = 0; i < NINDICES; ++i)
+ palette[i].w = 255.0f;
+}
+
+// sign extend but only if it was transformed
+static void sign_extend(Pattern &p, IntEndptsRGB endpts[NREGIONS_THREE])
+{
+ nvAssert (p.transformed != 0);
+
+ for (int i=0; i<NCHANNELS_RGB; ++i)
+ {
+ // endpts[0].A[i] = SIGN_EXTEND(endpts[0].B[i], p.chan[i].nbitsizes[0]); // always positive here
+ endpts[0].B[i] = SIGN_EXTEND(endpts[0].B[i], p.chan[i].nbitsizes[1]);
+ endpts[1].A[i] = SIGN_EXTEND(endpts[1].A[i], p.chan[i].nbitsizes[2]);
+ endpts[1].B[i] = SIGN_EXTEND(endpts[1].B[i], p.chan[i].nbitsizes[3]);
+ endpts[2].A[i] = SIGN_EXTEND(endpts[2].A[i], p.chan[i].nbitsizes[4]);
+ endpts[2].B[i] = SIGN_EXTEND(endpts[2].B[i], p.chan[i].nbitsizes[5]);
+ }
+}
+
+void AVPCL::decompress_mode2(const char *block, Tile &t)
+{
+ Bits in(block, AVPCL::BITSIZE);
+
+ Pattern p;
+ IntEndptsRGB endpts[NREGIONS_THREE];
+ int shapeindex, pat_index;
+
+ read_header(in, endpts, shapeindex, p, pat_index);
+
+ if (p.transformed)
+ {
+ sign_extend(p, endpts);
+ transform_inverse(endpts);
+ }
+
+ Vector4 palette[NREGIONS_THREE][NINDICES];
+ for (int r = 0; r < NREGIONS_THREE; ++r)
+ generate_palette_quantized(endpts[r], pattern_precs[pat_index].region_precs[r], &palette[r][0]);
+
+ int indices[Tile::TILE_H][Tile::TILE_W];
+
+ read_indices(in, shapeindex, indices);
+
+ nvAssert(in.getptr() == AVPCL::BITSIZE);
+
+ // lookup
+ for (int y = 0; y < Tile::TILE_H; y++)
+ for (int x = 0; x < Tile::TILE_W; x++)
+ t.data[y][x] = palette[REGION(x,y,shapeindex)][indices[y][x]];
+}
+
+// given a collection of colors and quantized endpoints, generate a palette, choose best entries, and return a single toterr
+static float map_colors(const Vector4 colors[], const float importance[], int np, const IntEndptsRGB &endpts, const RegionPrec &region_prec, float current_err, int indices[Tile::TILE_TOTAL])
+{
+ Vector4 palette[NINDICES];
+ float toterr = 0;
+ Vector4 err;
+
+ generate_palette_quantized(endpts, region_prec, palette);
+
+ for (int i = 0; i < np; ++i)
+ {
+ float besterr = FLT_MAX;
+
+ for (int j = 0; j < NINDICES && besterr > 0; ++j)
+ {
+ float err = Utils::metric4(colors[i], palette[j]) * importance[i];
+
+ if (err > besterr) // error increased, so we're done searching
+ break;
+ if (err < besterr)
+ {
+ besterr = err;
+ indices[i] = j;
+ }
+ }
+ toterr += besterr;
+
+ // check for early exit
+ if (toterr > current_err)
+ {
+ // fill out bogus index values so it's initialized at least
+ for (int k = i; k < np; ++k)
+ indices[k] = -1;
+
+ return FLT_MAX;
+ }
+ }
+ return toterr;
+}
+
+// assign indices given a tile, shape, and quantized endpoints, return toterr for each region
+static void assign_indices(const Tile &tile, int shapeindex, IntEndptsRGB endpts[NREGIONS_THREE], const PatternPrec &pattern_prec,
+ int indices[Tile::TILE_H][Tile::TILE_W], float toterr[NREGIONS_THREE])
+{
+ // build list of possibles
+ Vector4 palette[NREGIONS_THREE][NINDICES];
+
+ for (int region = 0; region < NREGIONS_THREE; ++region)
+ {
+ generate_palette_quantized(endpts[region], pattern_prec.region_precs[region], &palette[region][0]);
+ toterr[region] = 0;
+ }
+
+ Vector4 err;
+
+ for (int y = 0; y < tile.size_y; y++)
+ for (int x = 0; x < tile.size_x; x++)
+ {
+ int region = REGION(x,y,shapeindex);
+ float err, besterr = FLT_MAX;
+
+ for (int i = 0; i < NINDICES && besterr > 0; ++i)
+ {
+ err = Utils::metric4(tile.data[y][x], palette[region][i]);
+
+ if (err > besterr) // error increased, so we're done searching
+ break;
+ if (err < besterr)
+ {
+ besterr = err;
+ indices[y][x] = i;
+ }
+ }
+ toterr[region] += besterr;
+ }
+}
+
+// note: indices are valid only if the value returned is less than old_err; otherwise they contain -1's
+// this function returns either old_err or a value smaller (if it was successful in improving the error)
+static float perturb_one(const Vector4 colors[], const float importance[], int np, int ch, const RegionPrec &region_prec, const IntEndptsRGB &old_endpts, IntEndptsRGB &new_endpts,
+ float old_err, int do_b, int indices[Tile::TILE_TOTAL])
+{
+ // we have the old endpoints: old_endpts
+ // we have the perturbed endpoints: new_endpts
+ // we have the temporary endpoints: temp_endpts
+
+ IntEndptsRGB temp_endpts;
+ float min_err = old_err; // start with the best current error
+ int beststep;
+ int temp_indices[Tile::TILE_TOTAL];
+
+ for (int i=0; i<np; ++i)
+ indices[i] = -1;
+
+ // copy real endpoints so we can perturb them
+ temp_endpts = new_endpts = old_endpts;
+
+ int prec = do_b ? region_prec.endpt_b_prec[ch] : region_prec.endpt_a_prec[ch];
+
+ // do a logarithmic search for the best error for this endpoint (which)
+ for (int step = 1 << (prec-1); step; step >>= 1)
+ {
+ bool improved = false;
+ for (int sign = -1; sign <= 1; sign += 2)
+ {
+ if (do_b == 0)
+ {
+ temp_endpts.A[ch] = new_endpts.A[ch] + sign * step;
+ if (temp_endpts.A[ch] < 0 || temp_endpts.A[ch] >= (1 << prec))
+ continue;
+ }
+ else
+ {
+ temp_endpts.B[ch] = new_endpts.B[ch] + sign * step;
+ if (temp_endpts.B[ch] < 0 || temp_endpts.B[ch] >= (1 << prec))
+ continue;
+ }
+
+ float err = map_colors(colors, importance, np, temp_endpts, region_prec, min_err, temp_indices);
+
+ if (err < min_err)
+ {
+ improved = true;
+ min_err = err;
+ beststep = sign * step;
+ for (int i=0; i<np; ++i)
+ indices[i] = temp_indices[i];
+ }
+ }
+ // if this was an improvement, move the endpoint and continue search from there
+ if (improved)
+ {
+ if (do_b == 0)
+ new_endpts.A[ch] += beststep;
+ else
+ new_endpts.B[ch] += beststep;
+ }
+ }
+ return min_err;
+}
+
+// the larger the error the more time it is worth spending on an exhaustive search.
+// perturb the endpoints at least -3 to 3.
+// if err > 5000 perturb endpoints 50% of precision
+// if err > 1000 25%
+// if err > 200 12.5%
+// if err > 40 6.25%
+// for np = 16 -- adjust error thresholds as a function of np
+// always ensure endpoint ordering is preserved (no need to overlap the scan)
+// if orig_err returned from this is less than its input value, then indices[] will contain valid indices
+static float exhaustive(const Vector4 colors[], const float importance[], int np, int ch, const RegionPrec &region_prec, float orig_err, IntEndptsRGB &opt_endpts, int indices[Tile::TILE_TOTAL])
+{
+ IntEndptsRGB temp_endpts;
+ float best_err = orig_err;
+ int aprec = region_prec.endpt_a_prec[ch];
+ int bprec = region_prec.endpt_b_prec[ch];
+ int good_indices[Tile::TILE_TOTAL];
+ int temp_indices[Tile::TILE_TOTAL];
+
+ for (int i=0; i<np; ++i)
+ indices[i] = -1;
+
+ float thr_scale = (float)np / (float)Tile::TILE_TOTAL;
+
+ if (orig_err == 0) return orig_err;
+
+ int adelta = 0, bdelta = 0;
+ if (orig_err > 5000.0*thr_scale) { adelta = (1 << aprec)/2; bdelta = (1 << bprec)/2; }
+ else if (orig_err > 1000.0*thr_scale) { adelta = (1 << aprec)/4; bdelta = (1 << bprec)/4; }
+ else if (orig_err > 200.0*thr_scale) { adelta = (1 << aprec)/8; bdelta = (1 << bprec)/8; }
+ else if (orig_err > 40.0*thr_scale) { adelta = (1 << aprec)/16; bdelta = (1 << bprec)/16; }
+ adelta = max(adelta, 3);
+ bdelta = max(bdelta, 3);
+
+#ifdef DISABLE_EXHAUSTIVE
+ adelta = bdelta = 3;
+#endif
+
+ temp_endpts = opt_endpts;
+
+ // ok figure out the range of A and B
+ int alow = max(0, opt_endpts.A[ch] - adelta);
+ int ahigh = min((1<<aprec)-1, opt_endpts.A[ch] + adelta);
+ int blow = max(0, opt_endpts.B[ch] - bdelta);
+ int bhigh = min((1<<bprec)-1, opt_endpts.B[ch] + bdelta);
+
+ // now there's no need to swap the ordering of A and B
+ bool a_le_b = opt_endpts.A[ch] <= opt_endpts.B[ch];
+
+ int amin, bmin;
+
+ if (opt_endpts.A[ch] <= opt_endpts.B[ch])
+ {
+ // keep a <= b
+ for (int a = alow; a <= ahigh; ++a)
+ for (int b = max(a, blow); b < bhigh; ++b)
+ {
+ temp_endpts.A[ch] = a;
+ temp_endpts.B[ch] = b;
+
+ float err = map_colors(colors, importance, np, temp_endpts, region_prec, best_err, temp_indices);
+ if (err < best_err)
+ {
+ amin = a;
+ bmin = b;
+ best_err = err;
+ for (int i=0; i<np; ++i)
+ good_indices[i] = temp_indices[i];
+ }
+ }
+ }
+ else
+ {
+ // keep b <= a
+ for (int b = blow; b < bhigh; ++b)
+ for (int a = max(b, alow); a <= ahigh; ++a)
+ {
+ temp_endpts.A[ch] = a;
+ temp_endpts.B[ch] = b;
+
+ float err = map_colors(colors, importance, np, temp_endpts, region_prec, best_err, temp_indices);
+ if (err < best_err)
+ {
+ amin = a;
+ bmin = b;
+ best_err = err;
+ for (int i=0; i<np; ++i)
+ good_indices[i] = temp_indices[i];
+ }
+ }
+ }
+ if (best_err < orig_err)
+ {
+ opt_endpts.A[ch] = amin;
+ opt_endpts.B[ch] = bmin;
+ orig_err = best_err;
+ // if we actually improved, update the indices
+ for (int i=0; i<np; ++i)
+ indices[i] = good_indices[i];
+ }
+ return best_err;
+}
+
+static float optimize_one(const Vector4 colors[], const float importance[], int np, float orig_err, const IntEndptsRGB &orig_endpts, const RegionPrec &region_prec, IntEndptsRGB &opt_endpts)
+{
+ float opt_err = orig_err;
+
+ opt_endpts = orig_endpts;
+
+ /*
+ err0 = perturb(rgb0, delta0)
+ err1 = perturb(rgb1, delta1)
+ if (err0 < err1)
+ if (err0 >= initial_error) break
+ rgb0 += delta0
+ next = 1
+ else
+ if (err1 >= initial_error) break
+ rgb1 += delta1
+ next = 0
+ initial_err = map()
+ for (;;)
+ err = perturb(next ? rgb1:rgb0, delta)
+ if (err >= initial_err) break
+ next? rgb1 : rgb0 += delta
+ initial_err = err
+ */
+ IntEndptsRGB new_a, new_b;
+ IntEndptsRGB new_endpt;
+ int do_b;
+ int orig_indices[Tile::TILE_TOTAL];
+ int new_indices[Tile::TILE_TOTAL];
+ int temp_indices0[Tile::TILE_TOTAL];
+ int temp_indices1[Tile::TILE_TOTAL];
+
+ // now optimize each channel separately
+ // for the first error improvement, we save the indices. then, for any later improvement, we compare the indices
+ // if they differ, we restart the loop (which then falls back to looking for a first improvement.)
+ for (int ch = 0; ch < NCHANNELS_RGB; ++ch)
+ {
+ // figure out which endpoint when perturbed gives the most improvement and start there
+ // if we just alternate, we can easily end up in a local minima
+ float err0 = perturb_one(colors, importance, np, ch, region_prec, opt_endpts, new_a, opt_err, 0, temp_indices0); // perturb endpt A
+ float err1 = perturb_one(colors, importance, np, ch, region_prec, opt_endpts, new_b, opt_err, 1, temp_indices1); // perturb endpt B
+
+ if (err0 < err1)
+ {
+ if (err0 >= opt_err)
+ continue;
+
+ for (int i=0; i<np; ++i)
+ {
+ new_indices[i] = orig_indices[i] = temp_indices0[i];
+ nvAssert (orig_indices[i] != -1);
+ }
+
+ opt_endpts.A[ch] = new_a.A[ch];
+ opt_err = err0;
+ do_b = 1; // do B next
+ }
+ else
+ {
+ if (err1 >= opt_err)
+ continue;
+
+ for (int i=0; i<np; ++i)
+ {
+ new_indices[i] = orig_indices[i] = temp_indices1[i];
+ nvAssert (orig_indices[i] != -1);
+ }
+
+ opt_endpts.B[ch] = new_b.B[ch];
+ opt_err = err1;
+ do_b = 0; // do A next
+ }
+
+ // now alternate endpoints and keep trying until there is no improvement
+ for (;;)
+ {
+ float err = perturb_one(colors, importance, np, ch, region_prec, opt_endpts, new_endpt, opt_err, do_b, temp_indices0);
+ if (err >= opt_err)
+ break;
+
+ for (int i=0; i<np; ++i)
+ {
+ new_indices[i] = temp_indices0[i];
+ nvAssert (new_indices[i] != -1);
+ }
+
+ if (do_b == 0)
+ opt_endpts.A[ch] = new_endpt.A[ch];
+ else
+ opt_endpts.B[ch] = new_endpt.B[ch];
+ opt_err = err;
+ do_b = 1 - do_b; // now move the other endpoint
+ }
+
+ // see if the indices have changed
+ int i;
+ for (i=0; i<np; ++i)
+ if (orig_indices[i] != new_indices[i])
+ break;
+
+ if (i<np)
+ ch = -1; // start over
+ }
+
+ // finally, do a small exhaustive search around what we think is the global minima to be sure
+ // note this is independent of the above search, so we don't care about the indices from the above
+ // we don't care about the above because if they differ, so what? we've already started at ch=0
+ bool first = true;
+ for (int ch = 0; ch < NCHANNELS_RGB; ++ch)
+ {
+ float new_err = exhaustive(colors, importance, np, ch, region_prec, opt_err, opt_endpts, temp_indices0);
+
+ if (new_err < opt_err)
+ {
+ opt_err = new_err;
+
+ if (first)
+ {
+ for (int i=0; i<np; ++i)
+ {
+ orig_indices[i] = temp_indices0[i];
+ nvAssert (orig_indices[i] != -1);
+ }
+ first = false;
+ }
+ else
+ {
+ // see if the indices have changed
+ int i;
+ for (i=0; i<np; ++i)
+ if (orig_indices[i] != temp_indices0[i])
+ break;
+
+ if (i<np)
+ {
+ ch = -1; // start over
+ first = true;
+ }
+ }
+ }
+ }
+
+ return opt_err;
+}
+
+static void optimize_endpts(const Tile &tile, int shapeindex, const float orig_err[NREGIONS_THREE],
+ const IntEndptsRGB orig_endpts[NREGIONS_THREE], const PatternPrec &pattern_prec, float opt_err[NREGIONS], IntEndptsRGB opt_endpts[NREGIONS_THREE])
+{
+ Vector4 pixels[Tile::TILE_TOTAL];
+ float importance[Tile::TILE_TOTAL];
+ IntEndptsRGB temp_in, temp_out;
+
+ for (int region=0; region<NREGIONS_THREE; ++region)
+ {
+ // collect the pixels in the region
+ int np = 0;
+
+ for (int y = 0; y < tile.size_y; y++) {
+ for (int x = 0; x < tile.size_x; x++) {
+ if (REGION(x, y, shapeindex) == region) {
+ pixels[np] = tile.data[y][x];
+ importance[np] = tile.importance_map[y][x];
+ np++;
+ }
+ }
+ }
+
+ opt_endpts[region] = temp_in = orig_endpts[region];
+ opt_err[region] = orig_err[region];
+
+ float best_err = orig_err[region];
+
+ // make sure we have a valid error for temp_in
+ // we didn't change temp_in, so orig_err[region] is still valid
+ float temp_in_err = orig_err[region];
+
+ // now try to optimize these endpoints
+ float temp_out_err = optimize_one(pixels, importance, np, temp_in_err, temp_in, pattern_prec.region_precs[region], temp_out);
+
+ // if we find an improvement, update the best so far and correct the output endpoints and errors
+ if (temp_out_err < best_err)
+ {
+ best_err = temp_out_err;
+ opt_err[region] = temp_out_err;
+ opt_endpts[region] = temp_out;
+ }
+ }
+}
+
+/* optimization algorithm
+ for each pattern
+ convert endpoints using pattern precision
+ assign indices and get initial error
+ compress indices (and possibly reorder endpoints)
+ transform endpoints
+ if transformed endpoints fit pattern
+ get original endpoints back
+ optimize endpoints, get new endpoints, new indices, and new error // new error will almost always be better
+ compress new indices
+ transform new endpoints
+ if new endpoints fit pattern AND if error is improved
+ emit compressed block with new data
+ else
+ emit compressed block with original data // to try to preserve maximum endpoint precision
+*/
+
+static float refine(const Tile &tile, int shapeindex_best, const FltEndpts endpts[NREGIONS_THREE], char *block)
+{
+ float orig_err[NREGIONS_THREE], opt_err[NREGIONS_THREE], orig_toterr, opt_toterr, expected_opt_err[NREGIONS];
+ IntEndptsRGB orig_endpts[NREGIONS_THREE], opt_endpts[NREGIONS_THREE];
+ int orig_indices[Tile::TILE_H][Tile::TILE_W], opt_indices[Tile::TILE_H][Tile::TILE_W];
+
+ for (int sp = 0; sp < NPATTERNS; ++sp)
+ {
+ quantize_endpts(endpts, pattern_precs[sp], orig_endpts);
+ assign_indices(tile, shapeindex_best, orig_endpts, pattern_precs[sp], orig_indices, orig_err);
+ swap_indices(orig_endpts, orig_indices, shapeindex_best);
+ if (patterns[sp].transformed)
+ transform_forward(orig_endpts);
+ // apply a heuristic here -- we check if the endpoints fit before we try to optimize them.
+ // the assumption made is that if they don't fit now, they won't fit after optimizing.
+ if (endpts_fit(orig_endpts, patterns[sp]))
+ {
+ if (patterns[sp].transformed)
+ transform_inverse(orig_endpts);
+ optimize_endpts(tile, shapeindex_best, orig_err, orig_endpts, pattern_precs[sp], expected_opt_err, opt_endpts);
+ assign_indices(tile, shapeindex_best, opt_endpts, pattern_precs[sp], opt_indices, opt_err);
+ // (nreed) Commented out asserts because they go off all the time...not sure why
+ //for (int i=0; i<NREGIONS; ++i)
+ // nvAssert(expected_opt_err[i] == opt_err[i]);
+ swap_indices(opt_endpts, opt_indices, shapeindex_best);
+ if (patterns[sp].transformed)
+ transform_forward(opt_endpts);
+ orig_toterr = opt_toterr = 0;
+ for (int i=0; i < NREGIONS_THREE; ++i) { orig_toterr += orig_err[i]; opt_toterr += opt_err[i]; }
+ if (endpts_fit(opt_endpts, patterns[sp]) && opt_toterr < orig_toterr)
+ {
+ emit_block(opt_endpts, shapeindex_best, patterns[sp], opt_indices, block);
+ return opt_toterr;
+ }
+ else
+ {
+ // either it stopped fitting when we optimized it, or there was no improvement
+ // so go back to the unoptimized endpoints which we know will fit
+ if (patterns[sp].transformed)
+ transform_forward(orig_endpts);
+ emit_block(orig_endpts, shapeindex_best, patterns[sp], orig_indices, block);
+ return orig_toterr;
+ }
+ }
+ }
+ nvAssert(false); //throw "No candidate found, should never happen (mode avpcl 2).";
+ return FLT_MAX;
+
+}
+
+static void clamp(Vector4 &v)
+{
+ if (v.x < 0.0f) v.x = 0.0f;
+ if (v.x > 255.0f) v.x = 255.0f;
+ if (v.y < 0.0f) v.y = 0.0f;
+ if (v.y > 255.0f) v.y = 255.0f;
+ if (v.z < 0.0f) v.z = 0.0f;
+ if (v.z > 255.0f) v.z = 255.0f;
+ v.w = 255.0f;
+}
+
+static void generate_palette_unquantized(const FltEndpts endpts[NREGIONS_THREE], Vector4 palette[NREGIONS_THREE][NINDICES])
+{
+ for (int region = 0; region < NREGIONS_THREE; ++region)
+ for (int i = 0; i < NINDICES; ++i)
+ palette[region][i] = Utils::lerp(endpts[region].A, endpts[region].B, i, 0, DENOM);
+}
+
+// generate a palette from unquantized endpoints, then pick best palette color for all pixels in each region, return toterr for all regions combined
+static float map_colors(const Tile &tile, int shapeindex, const FltEndpts endpts[NREGIONS_THREE])
+{
+ // build list of possibles
+ Vector4 palette[NREGIONS_THREE][NINDICES];
+
+ generate_palette_unquantized(endpts, palette);
+
+ float toterr = 0;
+ Vector4 err;
+
+ for (int y = 0; y < tile.size_y; y++)
+ for (int x = 0; x < tile.size_x; x++)
+ {
+ int region = REGION(x,y,shapeindex);
+ float err, besterr = FLT_MAX;
+
+ for (int i = 0; i < NINDICES && besterr > 0; ++i)
+ {
+ err = Utils::metric4(tile.data[y][x], palette[region][i]);
+
+ if (err > besterr) // error increased, so we're done searching. this works for most norms.
+ break;
+ if (err < besterr)
+ besterr = err;
+ }
+ toterr += besterr;
+ }
+ return toterr;
+}
+
+static float rough(const Tile &tile, int shapeindex, FltEndpts endpts[NREGIONS_THREE])
+{
+ for (int region=0; region<NREGIONS_THREE; ++region)
+ {
+ int np = 0;
+ Vector3 colors[Tile::TILE_TOTAL];
+ float alphas[2];
+ Vector4 mean(0,0,0,0);
+
+ for (int y = 0; y < tile.size_y; y++)
+ for (int x = 0; x < tile.size_x; x++)
+ if (REGION(x,y,shapeindex) == region)
+ {
+ colors[np] = tile.data[y][x].xyz();
+ if (np < 2) alphas[np] = tile.data[y][x].w;
+ mean += tile.data[y][x];
+ ++np;
+ }
+
+ // handle simple cases
+ if (np == 0)
+ {
+ Vector4 zero(0,0,0,255.0f);
+ endpts[region].A = zero;
+ endpts[region].B = zero;
+ continue;
+ }
+ else if (np == 1)
+ {
+ endpts[region].A = Vector4(colors[0], alphas[0]);
+ endpts[region].B = Vector4(colors[0], alphas[0]);
+ continue;
+ }
+ else if (np == 2)
+ {
+ endpts[region].A = Vector4(colors[0], alphas[0]);
+ endpts[region].B = Vector4(colors[1], alphas[1]);
+ continue;
+ }
+
+ mean /= float(np);
+
+ Vector3 direction = Fit::computePrincipalComponent_EigenSolver(np, colors);
+
+ // project each pixel value along the principal direction
+ float minp = FLT_MAX, maxp = -FLT_MAX;
+ for (int i = 0; i < np; i++)
+ {
+ float dp = dot(colors[i]-mean.xyz(), direction);
+ if (dp < minp) minp = dp;
+ if (dp > maxp) maxp = dp;
+ }
+
+ // choose as endpoints 2 points along the principal direction that span the projections of all of the pixel values
+ endpts[region].A = mean + minp*Vector4(direction, 0);
+ endpts[region].B = mean + maxp*Vector4(direction, 0);
+
+ // clamp endpoints
+ // the argument for clamping is that the actual endpoints need to be clamped and thus we need to choose the best
+ // shape based on endpoints being clamped
+ clamp(endpts[region].A);
+ clamp(endpts[region].B);
+ }
+
+ return map_colors(tile, shapeindex, endpts);
+}
+
+static void swap(float *list1, int *list2, int i, int j)
+{
+ float t = list1[i]; list1[i] = list1[j]; list1[j] = t;
+ int t1 = list2[i]; list2[i] = list2[j]; list2[j] = t1;
+}
+
+float AVPCL::compress_mode2(const Tile &t, char *block)
+{
+ // number of rough cases to look at. reasonable values of this are 1, NSHAPES/4, and NSHAPES
+ // NSHAPES/4 gets nearly all the cases; you can increase that a bit (say by 3 or 4) if you really want to squeeze the last bit out
+ const int NITEMS=NSHAPES/4;
+
+ // pick the best NITEMS shapes and refine these.
+ struct {
+ FltEndpts endpts[NREGIONS_THREE];
+ } all[NSHAPES];
+ float roughmse[NSHAPES];
+ int index[NSHAPES];
+ char tempblock[AVPCL::BLOCKSIZE];
+ float msebest = FLT_MAX;
+
+ for (int i=0; i<NSHAPES; ++i)
+ {
+ roughmse[i] = rough(t, i, &all[i].endpts[0]);
+ index[i] = i;
+ }
+
+ // bubble sort -- only need to bubble up the first NITEMS items
+ for (int i=0; i<NITEMS; ++i)
+ for (int j=i+1; j<NSHAPES; ++j)
+ if (roughmse[i] > roughmse[j])
+ swap(roughmse, index, i, j);
+
+ for (int i=0; i<NITEMS && msebest>0; ++i)
+ {
+ int shape = index[i];
+ float mse = refine(t, shape, &all[shape].endpts[0], tempblock);
+ if (mse < msebest)
+ {
+ memcpy(block, tempblock, sizeof(tempblock));
+ msebest = mse;
+ }
+ }
+ return msebest;
+}
+
diff --git a/3rdparty/bgfx/3rdparty/nvtt/bc7/avpcl_mode3.cpp b/3rdparty/bgfx/3rdparty/nvtt/bc7/avpcl_mode3.cpp
new file mode 100644
index 00000000000..0020d8aef20
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/nvtt/bc7/avpcl_mode3.cpp
@@ -0,0 +1,1059 @@
+/*
+Copyright 2007 nVidia, Inc.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
+
+You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+See the License for the specific language governing permissions and limitations under the License.
+*/
+
+// Thanks to Jacob Munkberg (jacob@cs.lth.se) for the shortcut of using SVD to do the equivalent of principal components analysis
+
+// x1000 777.1x4 64p 2bi (30b)
+
+#include "bits.h"
+#include "tile.h"
+#include "avpcl.h"
+#include "nvcore/debug.h"
+#include "nvmath/vector.inl"
+#include "nvmath/matrix.inl"
+#include "nvmath/fitting.h"
+#include "avpcl_utils.h"
+#include "endpts.h"
+#include <string.h>
+#include <float.h>
+
+#include "shapes_two.h"
+
+using namespace nv;
+using namespace AVPCL;
+
+#define NLSBMODES 4 // number of different lsb modes per region. since we have two .1 per region, that can have 4 values
+
+#define NINDICES 4
+#define INDEXBITS 2
+#define HIGH_INDEXBIT (1<<(INDEXBITS-1))
+#define DENOM (NINDICES-1)
+#define BIAS (DENOM/2)
+
+// WORK: determine optimal traversal pattern to search for best shape -- what does the error curve look like?
+// i.e. can we search shapes in a particular order so we can see the global error minima easily and
+// stop without having to touch all shapes?
+
+#define POS_TO_X(pos) ((pos)&3)
+#define POS_TO_Y(pos) (((pos)>>2)&3)
+
+#define NBITSIZES (NREGIONS*2)
+#define ABITINDEX(region) (2*(region)+0)
+#define BBITINDEX(region) (2*(region)+1)
+
+struct ChanBits
+{
+ int nbitsizes[NBITSIZES]; // bitsizes for one channel
+};
+
+struct Pattern
+{
+ ChanBits chan[NCHANNELS_RGB];// bit patterns used per channel
+ int transformed; // if 0, deltas are unsigned and no transform; otherwise, signed and transformed
+ int mode; // associated mode value
+ int modebits; // number of mode bits
+ const char *encoding; // verilog description of encoding for this mode
+};
+
+#define NPATTERNS 1
+#define NREGIONS 2
+
+static Pattern patterns[NPATTERNS] =
+{
+ // red green blue xfm mode mb
+ 7,7,7,7, 7,7,7,7, 7,7,7,7, 0, 0x8, 4, "",
+};
+
+struct RegionPrec
+{
+ int endpt_a_prec[NCHANNELS_RGB];
+ int endpt_b_prec[NCHANNELS_RGB];
+};
+
+struct PatternPrec
+{
+ RegionPrec region_precs[NREGIONS];
+};
+
+
+// this is the precision for each channel and region
+// NOTE: this MUST match the corresponding data in "patterns" above -- WARNING: there is NO nvAssert to check this!
+static PatternPrec pattern_precs[NPATTERNS] =
+{
+ 7,7,7, 7,7,7, 7,7,7, 7,7,7,
+};
+
+// return # of bits needed to store n. handle signed or unsigned cases properly
+static int nbits(int n, bool issigned)
+{
+ int nb;
+ if (n==0)
+ return 0; // no bits needed for 0, signed or not
+ else if (n > 0)
+ {
+ for (nb=0; n; ++nb, n>>=1) ;
+ return nb + (issigned?1:0);
+ }
+ else
+ {
+ nvAssert (issigned);
+ for (nb=0; n<-1; ++nb, n>>=1) ;
+ return nb + 1;
+ }
+}
+
+static void transform_forward(IntEndptsRGB_2 ep[NREGIONS])
+{
+ nvUnreachable();
+}
+
+static void transform_inverse(IntEndptsRGB_2 ep[NREGIONS])
+{
+ nvUnreachable();
+}
+
+// endpoints are 888,888; reduce to 777,777 and put the lsb bit majority in compr_bits
+static void compress_one(const IntEndptsRGB& endpts, IntEndptsRGB_2& compr_endpts)
+{
+ int onescnt;
+
+ onescnt = 0;
+ for (int j=0; j<NCHANNELS_RGB; ++j)
+ {
+ onescnt += endpts.A[j] & 1;
+ compr_endpts.A[j] = endpts.A[j] >> 1;
+ nvAssert (compr_endpts.A[j] < 128);
+ }
+ compr_endpts.a_lsb = onescnt >= 2;
+
+ onescnt = 0;
+ for (int j=0; j<NCHANNELS_RGB; ++j)
+ {
+ onescnt += endpts.B[j] & 1;
+ compr_endpts.B[j] = endpts.B[j] >> 1;
+ nvAssert (compr_endpts.B[j] < 128);
+ }
+ compr_endpts.b_lsb = onescnt >= 2;
+}
+
+static void uncompress_one(const IntEndptsRGB_2& compr_endpts, IntEndptsRGB& endpts)
+{
+ for (int j=0; j<NCHANNELS_RGB; ++j)
+ {
+ endpts.A[j] = (compr_endpts.A[j] << 1) | compr_endpts.a_lsb;
+ endpts.B[j] = (compr_endpts.B[j] << 1) | compr_endpts.b_lsb;
+ }
+}
+
+static void uncompress_endpoints(const IntEndptsRGB_2 compr_endpts[NREGIONS], IntEndptsRGB endpts[NREGIONS])
+{
+ for (int i=0; i<NREGIONS; ++i)
+ uncompress_one(compr_endpts[i], endpts[i]);
+}
+
+static void compress_endpoints(const IntEndptsRGB endpts[NREGIONS], IntEndptsRGB_2 compr_endpts[NREGIONS])
+{
+ for (int i=0; i<NREGIONS; ++i)
+ compress_one(endpts[i], compr_endpts[i]);
+}
+
+
+static void quantize_endpts(const FltEndpts endpts[NREGIONS], const PatternPrec &pattern_prec, IntEndptsRGB_2 q_endpts[NREGIONS])
+{
+ IntEndptsRGB full_endpts[NREGIONS];
+
+ for (int region = 0; region < NREGIONS; ++region)
+ {
+ full_endpts[region].A[0] = Utils::quantize(endpts[region].A.x, pattern_prec.region_precs[region].endpt_a_prec[0]+1); // +1 since we are in uncompressed space
+ full_endpts[region].A[1] = Utils::quantize(endpts[region].A.y, pattern_prec.region_precs[region].endpt_a_prec[1]+1);
+ full_endpts[region].A[2] = Utils::quantize(endpts[region].A.z, pattern_prec.region_precs[region].endpt_a_prec[2]+1);
+ full_endpts[region].B[0] = Utils::quantize(endpts[region].B.x, pattern_prec.region_precs[region].endpt_b_prec[0]+1);
+ full_endpts[region].B[1] = Utils::quantize(endpts[region].B.y, pattern_prec.region_precs[region].endpt_b_prec[1]+1);
+ full_endpts[region].B[2] = Utils::quantize(endpts[region].B.z, pattern_prec.region_precs[region].endpt_b_prec[2]+1);
+ compress_one(full_endpts[region], q_endpts[region]);
+ }
+}
+
+// swap endpoints as needed to ensure that the indices at index_positions have a 0 high-order bit
+static void swap_indices(IntEndptsRGB_2 endpts[NREGIONS], int indices[Tile::TILE_H][Tile::TILE_W], int shapeindex)
+{
+ for (int region = 0; region < NREGIONS; ++region)
+ {
+ int position = SHAPEINDEX_TO_COMPRESSED_INDICES(shapeindex,region);
+
+ int x = POS_TO_X(position);
+ int y = POS_TO_Y(position);
+ nvAssert(REGION(x,y,shapeindex) == region); // double check the table
+ if (indices[y][x] & HIGH_INDEXBIT)
+ {
+ // high bit is set, swap the endpts and indices for this region
+ int t;
+ for (int i=0; i<NCHANNELS_RGB; ++i)
+ {
+ t = endpts[region].A[i]; endpts[region].A[i] = endpts[region].B[i]; endpts[region].B[i] = t;
+ }
+ t = endpts[region].a_lsb; endpts[region].a_lsb = endpts[region].b_lsb; endpts[region].b_lsb = t;
+
+ for (int y = 0; y < Tile::TILE_H; y++)
+ for (int x = 0; x < Tile::TILE_W; x++)
+ if (REGION(x,y,shapeindex) == region)
+ indices[y][x] = NINDICES - 1 - indices[y][x];
+ }
+ }
+}
+
+static bool endpts_fit(IntEndptsRGB_2 endpts[NREGIONS], const Pattern &p)
+{
+ return true;
+}
+
+static void write_header(const IntEndptsRGB_2 endpts[NREGIONS], int shapeindex, const Pattern &p, Bits &out)
+{
+ out.write(p.mode, p.modebits);
+ out.write(shapeindex, SHAPEBITS);
+
+ for (int j=0; j<NCHANNELS_RGB; ++j)
+ for (int i=0; i<NREGIONS; ++i)
+ {
+ out.write(endpts[i].A[j], p.chan[j].nbitsizes[ABITINDEX(i)]);
+ out.write(endpts[i].B[j], p.chan[j].nbitsizes[BBITINDEX(i)]);
+ }
+
+ for (int i=0; i<NREGIONS; ++i)
+ {
+ out.write(endpts[i].a_lsb, 1);
+ out.write(endpts[i].b_lsb, 1);
+ }
+
+ nvAssert (out.getptr() == 98);
+}
+
+static void read_header(Bits &in, IntEndptsRGB_2 endpts[NREGIONS], int &shapeindex, Pattern &p, int &pat_index)
+{
+ int mode = AVPCL::getmode(in);
+
+ pat_index = 0;
+ nvAssert (pat_index >= 0 && pat_index < NPATTERNS);
+ nvAssert (in.getptr() == patterns[pat_index].modebits);
+
+ shapeindex = in.read(SHAPEBITS);
+ p = patterns[pat_index];
+
+ for (int j=0; j<NCHANNELS_RGB; ++j)
+ for (int i=0; i<NREGIONS; ++i)
+ {
+ endpts[i].A[j] = in.read(p.chan[j].nbitsizes[ABITINDEX(i)]);
+ endpts[i].B[j] = in.read(p.chan[j].nbitsizes[BBITINDEX(i)]);
+ }
+
+ for (int i=0; i<NREGIONS; ++i)
+ {
+ endpts[i].a_lsb = in.read(1);
+ endpts[i].b_lsb = in.read(1);
+ }
+
+ nvAssert (in.getptr() == 98);
+}
+
+static void write_indices(const int indices[Tile::TILE_H][Tile::TILE_W], int shapeindex, Bits &out)
+{
+ int positions[NREGIONS];
+
+ for (int r = 0; r < NREGIONS; ++r)
+ positions[r] = SHAPEINDEX_TO_COMPRESSED_INDICES(shapeindex,r);
+
+ for (int pos = 0; pos < Tile::TILE_TOTAL; ++pos)
+ {
+ int x = POS_TO_X(pos);
+ int y = POS_TO_Y(pos);
+
+ bool match = false;
+
+ for (int r = 0; r < NREGIONS; ++r)
+ if (positions[r] == pos) { match = true; break; }
+
+ out.write(indices[y][x], INDEXBITS - (match ? 1 : 0));
+ }
+}
+
+static void read_indices(Bits &in, int shapeindex, int indices[Tile::TILE_H][Tile::TILE_W])
+{
+ int positions[NREGIONS];
+
+ for (int r = 0; r < NREGIONS; ++r)
+ positions[r] = SHAPEINDEX_TO_COMPRESSED_INDICES(shapeindex,r);
+
+ for (int pos = 0; pos < Tile::TILE_TOTAL; ++pos)
+ {
+ int x = POS_TO_X(pos);
+ int y = POS_TO_Y(pos);
+
+ bool match = false;
+
+ for (int r = 0; r < NREGIONS; ++r)
+ if (positions[r] == pos) { match = true; break; }
+
+ indices[y][x]= in.read(INDEXBITS - (match ? 1 : 0));
+ }
+}
+
+static void emit_block(const IntEndptsRGB_2 endpts[NREGIONS], int shapeindex, const Pattern &p, const int indices[Tile::TILE_H][Tile::TILE_W], char *block)
+{
+ Bits out(block, AVPCL::BITSIZE);
+
+ write_header(endpts, shapeindex, p, out);
+
+ write_indices(indices, shapeindex, out);
+
+ nvAssert(out.getptr() == AVPCL::BITSIZE);
+}
+
+static void generate_palette_quantized(const IntEndptsRGB_2 &endpts_2, const RegionPrec &region_prec, Vector4 palette[NINDICES])
+{
+ IntEndptsRGB endpts;
+
+ uncompress_one(endpts_2, endpts);
+
+ // scale endpoints
+ int a, b; // really need a IntVec4...
+
+ a = Utils::unquantize(endpts.A[0], region_prec.endpt_a_prec[0]+1); // +1 since we are in uncompressed space
+ b = Utils::unquantize(endpts.B[0], region_prec.endpt_b_prec[0]+1);
+
+ // interpolate
+ for (int i = 0; i < NINDICES; ++i)
+ palette[i].x = float(Utils::lerp(a, b, i, BIAS, DENOM));
+
+ a = Utils::unquantize(endpts.A[1], region_prec.endpt_a_prec[1]+1);
+ b = Utils::unquantize(endpts.B[1], region_prec.endpt_b_prec[1]+1);
+
+ // interpolate
+ for (int i = 0; i < NINDICES; ++i)
+ palette[i].y = float(Utils::lerp(a, b, i, BIAS, DENOM));
+
+ a = Utils::unquantize(endpts.A[2], region_prec.endpt_a_prec[2]+1);
+ b = Utils::unquantize(endpts.B[2], region_prec.endpt_b_prec[2]+1);
+
+ // interpolate
+ for (int i = 0; i < NINDICES; ++i)
+ palette[i].z = float(Utils::lerp(a, b, i, BIAS, DENOM));
+
+ // constant alpha
+ for (int i = 0; i < NINDICES; ++i)
+ palette[i].w = 255.0f;
+}
+
+static void sign_extend(Pattern &p, IntEndptsRGB_2 endpts[NREGIONS])
+{
+ nvUnreachable();
+}
+
+void AVPCL::decompress_mode3(const char *block, Tile &t)
+{
+ Bits in(block, AVPCL::BITSIZE);
+
+ Pattern p;
+ IntEndptsRGB_2 endpts[NREGIONS];
+ int shapeindex, pat_index;
+
+ read_header(in, endpts, shapeindex, p, pat_index);
+
+ if (p.transformed)
+ {
+ sign_extend(p, endpts);
+ transform_inverse(endpts);
+ }
+
+ Vector4 palette[NREGIONS][NINDICES];
+ for (int r = 0; r < NREGIONS; ++r)
+ generate_palette_quantized(endpts[r], pattern_precs[pat_index].region_precs[r], &palette[r][0]);
+
+ int indices[Tile::TILE_H][Tile::TILE_W];
+
+ read_indices(in, shapeindex, indices);
+
+ nvAssert(in.getptr() == AVPCL::BITSIZE);
+
+ // lookup
+ for (int y = 0; y < Tile::TILE_H; y++)
+ for (int x = 0; x < Tile::TILE_W; x++)
+ t.data[y][x] = palette[REGION(x,y,shapeindex)][indices[y][x]];
+}
+
+// given a collection of colors and quantized endpoints, generate a palette, choose best entries, and return a single toterr
+static float map_colors(const Vector4 colors[], const float importance[], int np, const IntEndptsRGB_2 &endpts, const RegionPrec &region_prec, float current_err, int indices[Tile::TILE_TOTAL])
+{
+ Vector4 palette[NINDICES];
+ float toterr = 0;
+ Vector4 err;
+
+ generate_palette_quantized(endpts, region_prec, palette);
+
+ for (int i = 0; i < np; ++i)
+ {
+ float besterr = FLT_MAX;
+
+ for (int j = 0; j < NINDICES && besterr > 0; ++j)
+ {
+ float err = Utils::metric4(colors[i], palette[j]) * importance[i];
+
+ if (err > besterr) // error increased, so we're done searching
+ break;
+ if (err < besterr)
+ {
+ besterr = err;
+ indices[i] = j;
+ }
+ }
+ toterr += besterr;
+
+ // check for early exit
+ if (toterr > current_err)
+ {
+ // fill out bogus index values so it's initialized at least
+ for (int k = i; k < np; ++k)
+ indices[k] = -1;
+
+ return FLT_MAX;
+ }
+ }
+ return toterr;
+}
+
+static void assign_indices(const Tile &tile, int shapeindex, IntEndptsRGB_2 endpts[NREGIONS], const PatternPrec &pattern_prec,
+ int indices[Tile::TILE_H][Tile::TILE_W], float toterr[NREGIONS])
+{
+ // build list of possibles
+ Vector4 palette[NREGIONS][NINDICES];
+
+ for (int region = 0; region < NREGIONS; ++region)
+ {
+ generate_palette_quantized(endpts[region], pattern_prec.region_precs[region], &palette[region][0]);
+ toterr[region] = 0;
+ }
+
+ Vector4 err;
+
+ for (int y = 0; y < tile.size_y; y++)
+ for (int x = 0; x < tile.size_x; x++)
+ {
+ int region = REGION(x,y,shapeindex);
+ float err, besterr = FLT_MAX;
+
+ for (int i = 0; i < NINDICES && besterr > 0; ++i)
+ {
+ err = Utils::metric4(tile.data[y][x], palette[region][i]);
+
+ if (err > besterr) // error increased, so we're done searching
+ break;
+ if (err < besterr)
+ {
+ besterr = err;
+ indices[y][x] = i;
+ }
+ }
+ toterr[region] += besterr;
+ }
+}
+
+// note: indices are valid only if the value returned is less than old_err; otherwise they contain -1's
+// this function returns either old_err or a value smaller (if it was successful in improving the error)
+static float perturb_one(const Vector4 colors[], const float importance[], int np, int ch, const RegionPrec &region_prec, const IntEndptsRGB_2 &old_endpts, IntEndptsRGB_2 &new_endpts,
+ float old_err, int do_b, int indices[Tile::TILE_TOTAL])
+{
+ // we have the old endpoints: old_endpts
+ // we have the perturbed endpoints: new_endpts
+ // we have the temporary endpoints: temp_endpts
+
+ IntEndptsRGB_2 temp_endpts;
+ float min_err = old_err; // start with the best current error
+ int beststep;
+ int temp_indices[Tile::TILE_TOTAL];
+
+ for (int i=0; i<np; ++i)
+ indices[i] = -1;
+
+ // copy real endpoints so we can perturb them
+ temp_endpts = new_endpts = old_endpts;
+
+ int prec = do_b ? region_prec.endpt_b_prec[ch] : region_prec.endpt_a_prec[ch];
+
+ // do a logarithmic search for the best error for this endpoint (which)
+ for (int step = 1 << (prec-1); step; step >>= 1)
+ {
+ bool improved = false;
+ for (int sign = -1; sign <= 1; sign += 2)
+ {
+ if (do_b == 0)
+ {
+ temp_endpts.A[ch] = new_endpts.A[ch] + sign * step;
+ if (temp_endpts.A[ch] < 0 || temp_endpts.A[ch] >= (1 << prec))
+ continue;
+ }
+ else
+ {
+ temp_endpts.B[ch] = new_endpts.B[ch] + sign * step;
+ if (temp_endpts.B[ch] < 0 || temp_endpts.B[ch] >= (1 << prec))
+ continue;
+ }
+
+ float err = map_colors(colors, importance, np, temp_endpts, region_prec, min_err, temp_indices);
+
+ if (err < min_err)
+ {
+ improved = true;
+ min_err = err;
+ beststep = sign * step;
+ for (int i=0; i<np; ++i)
+ indices[i] = temp_indices[i];
+ }
+ }
+ // if this was an improvement, move the endpoint and continue search from there
+ if (improved)
+ {
+ if (do_b == 0)
+ new_endpts.A[ch] += beststep;
+ else
+ new_endpts.B[ch] += beststep;
+ }
+ }
+ return min_err;
+}
+
+// the larger the error the more time it is worth spending on an exhaustive search.
+// perturb the endpoints at least -3 to 3.
+// if err > 5000 perturb endpoints 50% of precision
+// if err > 1000 25%
+// if err > 200 12.5%
+// if err > 40 6.25%
+// for np = 16 -- adjust error thresholds as a function of np
+// always ensure endpoint ordering is preserved (no need to overlap the scan)
+// if orig_err returned from this is less than its input value, then indices[] will contain valid indices
+static float exhaustive(const Vector4 colors[], const float importance[], int np, int ch, const RegionPrec &region_prec, float &orig_err, IntEndptsRGB_2 &opt_endpts, int indices[Tile::TILE_TOTAL])
+{
+ IntEndptsRGB_2 temp_endpts;
+ float best_err = orig_err;
+ int aprec = region_prec.endpt_a_prec[ch];
+ int bprec = region_prec.endpt_b_prec[ch];
+ int good_indices[Tile::TILE_TOTAL];
+ int temp_indices[Tile::TILE_TOTAL];
+
+ for (int i=0; i<np; ++i)
+ indices[i] = -1;
+
+ float thr_scale = (float)np / (float)Tile::TILE_TOTAL;
+
+ if (orig_err == 0) return orig_err;
+
+ int adelta = 0, bdelta = 0;
+ if (orig_err > 5000.0*thr_scale) { adelta = (1 << aprec)/2; bdelta = (1 << bprec)/2; }
+ else if (orig_err > 1000.0*thr_scale) { adelta = (1 << aprec)/4; bdelta = (1 << bprec)/4; }
+ else if (orig_err > 200.0*thr_scale) { adelta = (1 << aprec)/8; bdelta = (1 << bprec)/8; }
+ else if (orig_err > 40.0*thr_scale) { adelta = (1 << aprec)/16; bdelta = (1 << bprec)/16; }
+ adelta = max(adelta, 3);
+ bdelta = max(bdelta, 3);
+
+#ifdef DISABLE_EXHAUSTIVE
+ adelta = bdelta = 3;
+#endif
+
+ temp_endpts = opt_endpts;
+
+ // ok figure out the range of A and B
+ int alow = max(0, opt_endpts.A[ch] - adelta);
+ int ahigh = min((1<<aprec)-1, opt_endpts.A[ch] + adelta);
+ int blow = max(0, opt_endpts.B[ch] - bdelta);
+ int bhigh = min((1<<bprec)-1, opt_endpts.B[ch] + bdelta);
+
+ // now there's no need to swap the ordering of A and B
+ bool a_le_b = opt_endpts.A[ch] <= opt_endpts.B[ch];
+
+ int amin, bmin;
+
+ if (opt_endpts.A[ch] <= opt_endpts.B[ch])
+ {
+ // keep a <= b
+ for (int a = alow; a <= ahigh; ++a)
+ for (int b = max(a, blow); b < bhigh; ++b)
+ {
+ temp_endpts.A[ch] = a;
+ temp_endpts.B[ch] = b;
+
+ float err = map_colors(colors, importance, np, temp_endpts, region_prec, best_err, temp_indices);
+ if (err < best_err)
+ {
+ amin = a;
+ bmin = b;
+ best_err = err;
+ for (int i=0; i<np; ++i)
+ good_indices[i] = temp_indices[i];
+ }
+ }
+ }
+ else
+ {
+ // keep b <= a
+ for (int b = blow; b < bhigh; ++b)
+ for (int a = max(b, alow); a <= ahigh; ++a)
+ {
+ temp_endpts.A[ch] = a;
+ temp_endpts.B[ch] = b;
+
+ float err = map_colors(colors, importance, np, temp_endpts, region_prec, best_err, temp_indices);
+ if (err < best_err)
+ {
+ amin = a;
+ bmin = b;
+ best_err = err;
+ for (int i=0; i<np; ++i)
+ good_indices[i] = temp_indices[i];
+ }
+ }
+ }
+ if (best_err < orig_err)
+ {
+ opt_endpts.A[ch] = amin;
+ opt_endpts.B[ch] = bmin;
+ orig_err = best_err;
+ // if we actually improved, update the indices
+ for (int i=0; i<np; ++i)
+ indices[i] = good_indices[i];
+ }
+ return best_err;
+}
+
+static float optimize_one(const Vector4 colors[], const float importance[], int np, float orig_err, const IntEndptsRGB_2 &orig_endpts, const RegionPrec &region_prec, IntEndptsRGB_2 &opt_endpts)
+{
+ float opt_err = orig_err;
+
+ opt_endpts = orig_endpts;
+
+ /*
+ err0 = perturb(rgb0, delta0)
+ err1 = perturb(rgb1, delta1)
+ if (err0 < err1)
+ if (err0 >= initial_error) break
+ rgb0 += delta0
+ next = 1
+ else
+ if (err1 >= initial_error) break
+ rgb1 += delta1
+ next = 0
+ initial_err = map()
+ for (;;)
+ err = perturb(next ? rgb1:rgb0, delta)
+ if (err >= initial_err) break
+ next? rgb1 : rgb0 += delta
+ initial_err = err
+ */
+ IntEndptsRGB_2 new_a, new_b;
+ IntEndptsRGB_2 new_endpt;
+ int do_b;
+ int orig_indices[Tile::TILE_TOTAL];
+ int new_indices[Tile::TILE_TOTAL];
+ int temp_indices0[Tile::TILE_TOTAL];
+ int temp_indices1[Tile::TILE_TOTAL];
+
+ // now optimize each channel separately
+ // for the first error improvement, we save the indices. then, for any later improvement, we compare the indices
+ // if they differ, we restart the loop (which then falls back to looking for a first improvement.)
+ for (int ch = 0; ch < NCHANNELS_RGB; ++ch)
+ {
+ // figure out which endpoint when perturbed gives the most improvement and start there
+ // if we just alternate, we can easily end up in a local minima
+ float err0 = perturb_one(colors, importance, np, ch, region_prec, opt_endpts, new_a, opt_err, 0, temp_indices0); // perturb endpt A
+ float err1 = perturb_one(colors, importance, np, ch, region_prec, opt_endpts, new_b, opt_err, 1, temp_indices1); // perturb endpt B
+
+ if (err0 < err1)
+ {
+ if (err0 >= opt_err)
+ continue;
+
+ for (int i=0; i<np; ++i)
+ {
+ new_indices[i] = orig_indices[i] = temp_indices0[i];
+ nvAssert (orig_indices[i] != -1);
+ }
+
+ opt_endpts.A[ch] = new_a.A[ch];
+ opt_err = err0;
+ do_b = 1; // do B next
+ }
+ else
+ {
+ if (err1 >= opt_err)
+ continue;
+
+ for (int i=0; i<np; ++i)
+ {
+ new_indices[i] = orig_indices[i] = temp_indices1[i];
+ nvAssert (orig_indices[i] != -1);
+ }
+
+ opt_endpts.B[ch] = new_b.B[ch];
+ opt_err = err1;
+ do_b = 0; // do A next
+ }
+
+ // now alternate endpoints and keep trying until there is no improvement
+ for (;;)
+ {
+ float err = perturb_one(colors, importance, np, ch, region_prec, opt_endpts, new_endpt, opt_err, do_b, temp_indices0);
+ if (err >= opt_err)
+ break;
+
+ for (int i=0; i<np; ++i)
+ {
+ new_indices[i] = temp_indices0[i];
+ nvAssert (new_indices[i] != -1);
+ }
+
+ if (do_b == 0)
+ opt_endpts.A[ch] = new_endpt.A[ch];
+ else
+ opt_endpts.B[ch] = new_endpt.B[ch];
+ opt_err = err;
+ do_b = 1 - do_b; // now move the other endpoint
+ }
+
+ // see if the indices have changed
+ int i;
+ for (i=0; i<np; ++i)
+ if (orig_indices[i] != new_indices[i])
+ break;
+
+ if (i<np)
+ ch = -1; // start over
+ }
+
+ // finally, do a small exhaustive search around what we think is the global minima to be sure
+ // note this is independent of the above search, so we don't care about the indices from the above
+ // we don't care about the above because if they differ, so what? we've already started at ch=0
+ bool first = true;
+ for (int ch = 0; ch < NCHANNELS_RGB; ++ch)
+ {
+ float new_err = exhaustive(colors, importance, np, ch, region_prec, opt_err, opt_endpts, temp_indices0);
+
+ if (new_err < opt_err)
+ {
+ opt_err = new_err;
+
+ if (first)
+ {
+ for (int i=0; i<np; ++i)
+ {
+ orig_indices[i] = temp_indices0[i];
+ nvAssert (orig_indices[i] != -1);
+ }
+ first = false;
+ }
+ else
+ {
+ // see if the indices have changed
+ int i;
+ for (i=0; i<np; ++i)
+ if (orig_indices[i] != temp_indices0[i])
+ break;
+
+ if (i<np)
+ {
+ ch = -1; // start over
+ first = true;
+ }
+ }
+ }
+ }
+
+ return opt_err;
+}
+
+// this will return a valid set of endpoints in opt_endpts regardless of whether it improve orig_endpts or not
+static void optimize_endpts(const Tile &tile, int shapeindex, const float orig_err[NREGIONS],
+ const IntEndptsRGB_2 orig_endpts[NREGIONS], const PatternPrec &pattern_prec, float opt_err[NREGIONS], IntEndptsRGB_2 opt_endpts[NREGIONS])
+{
+ Vector4 pixels[Tile::TILE_TOTAL];
+ float importance[Tile::TILE_TOTAL];
+ IntEndptsRGB_2 temp_in, temp_out;
+ int temp_indices[Tile::TILE_TOTAL];
+
+ for (int region=0; region<NREGIONS; ++region)
+ {
+ // collect the pixels in the region
+ int np = 0;
+
+ for (int y = 0; y < tile.size_y; y++) {
+ for (int x = 0; x < tile.size_x; x++) {
+ if (REGION(x, y, shapeindex) == region) {
+ pixels[np] = tile.data[y][x];
+ importance[np] = tile.importance_map[y][x];
+ np++;
+ }
+ }
+ }
+
+ opt_endpts[region] = temp_in = orig_endpts[region];
+ opt_err[region] = orig_err[region];
+
+ float best_err = orig_err[region];
+
+ for (int lsbmode=0; lsbmode<NLSBMODES; ++lsbmode)
+ {
+ temp_in.a_lsb = lsbmode & 1;
+ temp_in.b_lsb = (lsbmode >> 1) & 1;
+
+ // make sure we have a valid error for temp_in
+ // we use FLT_MAX here because we want an accurate temp_in_err, no shortcuts
+ // (mapcolors will compute a mapping but will stop if the error exceeds the value passed in the FLT_MAX position)
+ float temp_in_err = map_colors(pixels, importance, np, temp_in, pattern_prec.region_precs[region], FLT_MAX, temp_indices);
+
+ // now try to optimize these endpoints
+ float temp_out_err = optimize_one(pixels, importance, np, temp_in_err, temp_in, pattern_prec.region_precs[region], temp_out);
+
+ // if we find an improvement, update the best so far and correct the output endpoints and errors
+ if (temp_out_err < best_err)
+ {
+ best_err = temp_out_err;
+ opt_err[region] = temp_out_err;
+ opt_endpts[region] = temp_out;
+ }
+ }
+ }
+}
+
+/* optimization algorithm
+ for each pattern
+ convert endpoints using pattern precision
+ assign indices and get initial error
+ compress indices (and possibly reorder endpoints)
+ transform endpoints
+ if transformed endpoints fit pattern
+ get original endpoints back
+ optimize endpoints, get new endpoints, new indices, and new error // new error will almost always be better
+ compress new indices
+ transform new endpoints
+ if new endpoints fit pattern AND if error is improved
+ emit compressed block with new data
+ else
+ emit compressed block with original data // to try to preserve maximum endpoint precision
+*/
+
+static float refine(const Tile &tile, int shapeindex_best, const FltEndpts endpts[NREGIONS], char *block)
+{
+ float orig_err[NREGIONS], opt_err[NREGIONS], orig_toterr, opt_toterr, expected_opt_err[NREGIONS];
+ IntEndptsRGB_2 orig_endpts[NREGIONS], opt_endpts[NREGIONS];
+ int orig_indices[Tile::TILE_H][Tile::TILE_W], opt_indices[Tile::TILE_H][Tile::TILE_W];
+
+ for (int sp = 0; sp < NPATTERNS; ++sp)
+ {
+ quantize_endpts(endpts, pattern_precs[sp], orig_endpts);
+ assign_indices(tile, shapeindex_best, orig_endpts, pattern_precs[sp], orig_indices, orig_err);
+ swap_indices(orig_endpts, orig_indices, shapeindex_best);
+ if (patterns[sp].transformed)
+ transform_forward(orig_endpts);
+ // apply a heuristic here -- we check if the endpoints fit before we try to optimize them.
+ // the assumption made is that if they don't fit now, they won't fit after optimizing.
+ if (endpts_fit(orig_endpts, patterns[sp]))
+ {
+ if (patterns[sp].transformed)
+ transform_inverse(orig_endpts);
+ optimize_endpts(tile, shapeindex_best, orig_err, orig_endpts, pattern_precs[sp], expected_opt_err, opt_endpts);
+ assign_indices(tile, shapeindex_best, opt_endpts, pattern_precs[sp], opt_indices, opt_err);
+ // (nreed) Commented out asserts because they go off all the time...not sure why
+ //for (int i=0; i<NREGIONS; ++i)
+ // nvAssert(expected_opt_err[i] == opt_err[i]);
+ swap_indices(opt_endpts, opt_indices, shapeindex_best);
+ if (patterns[sp].transformed)
+ transform_forward(opt_endpts);
+ orig_toterr = opt_toterr = 0;
+ for (int i=0; i < NREGIONS; ++i) { orig_toterr += orig_err[i]; opt_toterr += opt_err[i]; }
+ if (endpts_fit(opt_endpts, patterns[sp]) && opt_toterr < orig_toterr)
+ {
+ emit_block(opt_endpts, shapeindex_best, patterns[sp], opt_indices, block);
+ return opt_toterr;
+ }
+ else
+ {
+ // either it stopped fitting when we optimized it, or there was no improvement
+ // so go back to the unoptimized endpoints which we know will fit
+ if (patterns[sp].transformed)
+ transform_forward(orig_endpts);
+ emit_block(orig_endpts, shapeindex_best, patterns[sp], orig_indices, block);
+ return orig_toterr;
+ }
+ }
+ }
+ nvAssert(false); //throw "No candidate found, should never happen (mode avpcl 3).";
+ return FLT_MAX;
+}
+
+static void clamp(Vector4 &v)
+{
+ if (v.x < 0.0f) v.x = 0.0f;
+ if (v.x > 255.0f) v.x = 255.0f;
+ if (v.y < 0.0f) v.y = 0.0f;
+ if (v.y > 255.0f) v.y = 255.0f;
+ if (v.z < 0.0f) v.z = 0.0f;
+ if (v.z > 255.0f) v.z = 255.0f;
+ v.w = 255.0f;
+}
+
+static void generate_palette_unquantized(const FltEndpts endpts[NREGIONS], Vector4 palette[NREGIONS][NINDICES])
+{
+ for (int region = 0; region < NREGIONS; ++region)
+ for (int i = 0; i < NINDICES; ++i)
+ palette[region][i] = Utils::lerp(endpts[region].A, endpts[region].B, i, 0, DENOM);
+}
+
+// generate a palette from unquantized endpoints, then pick best palette color for all pixels in each region, return toterr for all regions combined
+static float map_colors(const Tile &tile, int shapeindex, const FltEndpts endpts[NREGIONS])
+{
+ // build list of possibles
+ Vector4 palette[NREGIONS][NINDICES];
+
+ generate_palette_unquantized(endpts, palette);
+
+ float toterr = 0;
+ Vector4 err;
+
+ for (int y = 0; y < tile.size_y; y++)
+ for (int x = 0; x < tile.size_x; x++)
+ {
+ int region = REGION(x,y,shapeindex);
+ float err, besterr = FLT_MAX;
+
+ for (int i = 0; i < NINDICES && besterr > 0; ++i)
+ {
+ err = Utils::metric4(tile.data[y][x], palette[region][i]);
+
+ if (err > besterr) // error increased, so we're done searching. this works for most norms.
+ break;
+ if (err < besterr)
+ besterr = err;
+ }
+ toterr += besterr;
+ }
+ return toterr;
+}
+
+static float rough(const Tile &tile, int shapeindex, FltEndpts endpts[NREGIONS])
+{
+ for (int region=0; region<NREGIONS; ++region)
+ {
+ int np = 0;
+ Vector3 colors[Tile::TILE_TOTAL];
+ float alphas[2];
+ Vector4 mean(0,0,0,0);
+
+ for (int y = 0; y < tile.size_y; y++)
+ for (int x = 0; x < tile.size_x; x++)
+ if (REGION(x,y,shapeindex) == region)
+ {
+ colors[np] = tile.data[y][x].xyz();
+ if (np < 2) alphas[np] = tile.data[y][x].w;
+ mean += tile.data[y][x];
+ ++np;
+ }
+
+ // handle simple cases
+ if (np == 0)
+ {
+ Vector4 zero(0,0,0,255.0f);
+ endpts[region].A = zero;
+ endpts[region].B = zero;
+ continue;
+ }
+ else if (np == 1)
+ {
+ endpts[region].A = Vector4(colors[0], alphas[0]);
+ endpts[region].B = Vector4(colors[0], alphas[0]);
+ continue;
+ }
+ else if (np == 2)
+ {
+ endpts[region].A = Vector4(colors[0], alphas[0]);
+ endpts[region].B = Vector4(colors[1], alphas[1]);
+ continue;
+ }
+
+ mean /= float(np);
+
+ Vector3 direction = Fit::computePrincipalComponent_EigenSolver(np, colors);
+
+ // project each pixel value along the principal direction
+ float minp = FLT_MAX, maxp = -FLT_MAX;
+ for (int i = 0; i < np; i++)
+ {
+ float dp = dot(colors[i]-mean.xyz(), direction);
+ if (dp < minp) minp = dp;
+ if (dp > maxp) maxp = dp;
+ }
+
+ // choose as endpoints 2 points along the principal direction that span the projections of all of the pixel values
+ endpts[region].A = mean + minp*Vector4(direction, 0);
+ endpts[region].B = mean + maxp*Vector4(direction, 0);
+
+ // clamp endpoints
+ // the argument for clamping is that the actual endpoints need to be clamped and thus we need to choose the best
+ // shape based on endpoints being clamped
+ clamp(endpts[region].A);
+ clamp(endpts[region].B);
+ }
+
+ return map_colors(tile, shapeindex, endpts);
+}
+
+static void swap(float *list1, int *list2, int i, int j)
+{
+ float t = list1[i]; list1[i] = list1[j]; list1[j] = t;
+ int t1 = list2[i]; list2[i] = list2[j]; list2[j] = t1;
+}
+
+float AVPCL::compress_mode3(const Tile &t, char *block)
+{
+ // number of rough cases to look at. reasonable values of this are 1, NSHAPES/4, and NSHAPES
+ // NSHAPES/4 gets nearly all the cases; you can increase that a bit (say by 3 or 4) if you really want to squeeze the last bit out
+ const int NITEMS=NSHAPES/4;
+
+ // pick the best NITEMS shapes and refine these.
+ struct {
+ FltEndpts endpts[NREGIONS];
+ } all[NSHAPES];
+ float roughmse[NSHAPES];
+ int index[NSHAPES];
+ char tempblock[AVPCL::BLOCKSIZE];
+ float msebest = FLT_MAX;
+
+ for (int i=0; i<NSHAPES; ++i)
+ {
+ roughmse[i] = rough(t, i, &all[i].endpts[0]);
+ index[i] = i;
+ }
+
+ // bubble sort -- only need to bubble up the first NITEMS items
+ for (int i=0; i<NITEMS; ++i)
+ for (int j=i+1; j<NSHAPES; ++j)
+ if (roughmse[i] > roughmse[j])
+ swap(roughmse, index, i, j);
+
+ for (int i=0; i<NITEMS && msebest>0; ++i)
+ {
+ int shape = index[i];
+ float mse = refine(t, shape, &all[shape].endpts[0], tempblock);
+ if (mse < msebest)
+ {
+ memcpy(block, tempblock, sizeof(tempblock));
+ msebest = mse;
+ }
+ }
+ return msebest;
+}
+
diff --git a/3rdparty/bgfx/3rdparty/nvtt/bc7/avpcl_mode4.cpp b/3rdparty/bgfx/3rdparty/nvtt/bc7/avpcl_mode4.cpp
new file mode 100644
index 00000000000..5115d7ced05
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/nvtt/bc7/avpcl_mode4.cpp
@@ -0,0 +1,1214 @@
+/*
+Copyright 2007 nVidia, Inc.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
+
+You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+See the License for the specific language governing permissions and limitations under the License.
+*/
+
+// Thanks to Jacob Munkberg (jacob@cs.lth.se) for the shortcut of using SVD to do the equivalent of principal components analysis
+
+// x10000 2r 1i 555x2 6x2 2bi 3bi
+
+#include "bits.h"
+#include "tile.h"
+#include "avpcl.h"
+#include "nvcore/debug.h"
+#include "nvmath/vector.inl"
+#include "nvmath/matrix.inl"
+#include "nvmath/fitting.h"
+#include "avpcl_utils.h"
+#include "endpts.h"
+#include <string.h>
+#include <float.h>
+
+using namespace nv;
+using namespace AVPCL;
+
+// there are 2 index arrays. INDEXMODE selects between the arrays being 2 & 3 bits or 3 & 2 bits
+// array 0 is always the RGB array and array 1 is always the A array
+#define NINDEXARRAYS 2
+#define INDEXARRAY_RGB 0
+#define INDEXARRAY_A 1
+#define INDEXARRAY_2BITS(indexmode) ((indexmode == INDEXMODE_ALPHA_IS_2BITS) ? INDEXARRAY_A : INDEXARRAY_RGB)
+#define INDEXARRAY_3BITS(indexmode) ((indexmode == INDEXMODE_ALPHA_IS_3BITS) ? INDEXARRAY_A : INDEXARRAY_RGB)
+
+#define NINDICES3 8
+#define INDEXBITS3 3
+#define HIGH_INDEXBIT3 (1<<(INDEXBITS3-1))
+#define DENOM3 (NINDICES3-1)
+#define BIAS3 (DENOM3/2)
+
+#define NINDICES2 4
+#define INDEXBITS2 2
+#define HIGH_INDEXBIT2 (1<<(INDEXBITS2-1))
+#define DENOM2 (NINDICES2-1)
+#define BIAS2 (DENOM2/2)
+
+#define NINDICES_RGB(indexmode) ((indexmode == INDEXMODE_ALPHA_IS_2BITS) ? NINDICES3 : NINDICES2)
+#define INDEXBITS_RGB(indexmode) ((indexmode == INDEXMODE_ALPHA_IS_2BITS) ? INDEXBITS3 : INDEXBITS2)
+#define HIGH_INDEXBIT_RGB(indexmode)((indexmode == INDEXMODE_ALPHA_IS_2BITS) ? HIGH_INDEXBIT3 : HIGH_INDEXBIT2)
+#define DENOM_RGB(indexmode) ((indexmode == INDEXMODE_ALPHA_IS_2BITS) ? DENOM3 : DENOM2)
+#define BIAS_RGB(indexmode) ((indexmode == INDEXMODE_ALPHA_IS_2BITS) ? BIAS3 : BIAS2)
+
+#define NINDICES_A(indexmode) ((indexmode == INDEXMODE_ALPHA_IS_2BITS) ? NINDICES2 : NINDICES3)
+#define INDEXBITS_A(indexmode) ((indexmode == INDEXMODE_ALPHA_IS_2BITS) ? INDEXBITS2 : INDEXBITS3)
+#define HIGH_INDEXBIT_A(indexmode) ((indexmode == INDEXMODE_ALPHA_IS_2BITS) ? HIGH_INDEXBIT2 : HIGH_INDEXBIT3)
+#define DENOM_A(indexmode) ((indexmode == INDEXMODE_ALPHA_IS_2BITS) ? DENOM2 : DENOM3)
+#define BIAS_A(indexmode) ((indexmode == INDEXMODE_ALPHA_IS_2BITS) ? BIAS2 : BIAS3)
+
+#define NSHAPES 1
+
+static int shapes[NSHAPES] =
+{
+ 0x0000,
+};
+
+#define REGION(x,y,shapeindex) ((shapes[shapeindex]&(1<<(15-(x)-4*(y))))!=0)
+
+#define NREGIONS 1 // keep the region stuff in just in case...
+
+// encoded index compression location: region 0 is always at 0,0.
+
+#define NBITSIZES 2 // one endpoint pair
+
+struct ChanBits
+{
+ int nbitsizes[NBITSIZES]; // bitsizes for one channel
+};
+
+struct Pattern
+{
+ ChanBits chan[NCHANNELS_RGBA];// bit patterns used per channel
+ int transform_mode; // x0 means alpha channel not transformed, x1 otherwise. 0x rgb not transformed, 1x otherwise.
+ int mode; // associated mode value
+ int modebits; // number of mode bits
+ const char *encoding; // verilog description of encoding for this mode
+};
+
+#define TRANSFORM_MODE_ALPHA 1
+#define TRANSFORM_MODE_RGB 2
+
+#define NPATTERNS 1
+
+static Pattern patterns[NPATTERNS] =
+{
+ // red green blue alpha xfm mode mb encoding
+ 5,5, 5,5, 5,5, 6,6, 0x0, 0x10, 5, "",
+};
+
+struct RegionPrec
+{
+ int endpt_a_prec[NCHANNELS_RGBA];
+ int endpt_b_prec[NCHANNELS_RGBA];
+};
+
+struct PatternPrec
+{
+ RegionPrec region_precs[NREGIONS];
+};
+
+// this is the precision for each channel and region
+// NOTE: this MUST match the corresponding data in "patterns" above -- WARNING: there is NO nvAssert to check this!
+static PatternPrec pattern_precs[NPATTERNS] =
+{
+ 5,5,5,6, 5,5,5,6,
+};
+
+
+// return # of bits needed to store n. handle signed or unsigned cases properly
+static int nbits(int n, bool issigned)
+{
+ int nb;
+ if (n==0)
+ return 0; // no bits needed for 0, signed or not
+ else if (n > 0)
+ {
+ for (nb=0; n; ++nb, n>>=1) ;
+ return nb + (issigned?1:0);
+ }
+ else
+ {
+ nvAssert (issigned);
+ for (nb=0; n<-1; ++nb, n>>=1) ;
+ return nb + 1;
+ }
+}
+
+#define R_0 ep[0].A[i]
+#define R_1 ep[0].B[i]
+
+static void transform_forward(int transform_mode, IntEndptsRGBA ep[NREGIONS])
+{
+ int i;
+
+ if (transform_mode & TRANSFORM_MODE_RGB)
+ for (i=CHANNEL_R; i<CHANNEL_A; ++i)
+ R_1 -= R_0;
+ if (transform_mode & TRANSFORM_MODE_ALPHA)
+ {
+ i = CHANNEL_A;
+ R_1 -= R_0;
+ }
+}
+
+static void transform_inverse(int transform_mode, IntEndptsRGBA ep[NREGIONS])
+{
+ int i;
+
+ if (transform_mode & TRANSFORM_MODE_RGB)
+ for (i=CHANNEL_R; i<CHANNEL_A; ++i)
+ R_1 += R_0;
+ if (transform_mode & TRANSFORM_MODE_ALPHA)
+ {
+ i = CHANNEL_A;
+ R_1 += R_0;
+ }
+}
+
+static void quantize_endpts(const FltEndpts endpts[NREGIONS], const PatternPrec &pattern_prec, IntEndptsRGBA q_endpts[NREGIONS])
+{
+ for (int region = 0; region < NREGIONS; ++region)
+ {
+ q_endpts[region].A[0] = Utils::quantize(endpts[region].A.x, pattern_prec.region_precs[region].endpt_a_prec[0]);
+ q_endpts[region].A[1] = Utils::quantize(endpts[region].A.y, pattern_prec.region_precs[region].endpt_a_prec[1]);
+ q_endpts[region].A[2] = Utils::quantize(endpts[region].A.z, pattern_prec.region_precs[region].endpt_a_prec[2]);
+ q_endpts[region].A[3] = Utils::quantize(endpts[region].A.w, pattern_prec.region_precs[region].endpt_a_prec[3]);
+
+ q_endpts[region].B[0] = Utils::quantize(endpts[region].B.x, pattern_prec.region_precs[region].endpt_b_prec[0]);
+ q_endpts[region].B[1] = Utils::quantize(endpts[region].B.y, pattern_prec.region_precs[region].endpt_b_prec[1]);
+ q_endpts[region].B[2] = Utils::quantize(endpts[region].B.z, pattern_prec.region_precs[region].endpt_b_prec[2]);
+ q_endpts[region].B[3] = Utils::quantize(endpts[region].B.w, pattern_prec.region_precs[region].endpt_b_prec[3]);
+ }
+}
+
+// swap endpoints as needed to ensure that the indices at index_one and index_two have a 0 high-order bit
+// index_two is 0 at x=0 y=0 and 15 at x=3 y=3 so y = (index >> 2) & 3 and x = index & 3
+static void swap_indices(int shapeindex, int indexmode, IntEndptsRGBA endpts[NREGIONS], int indices[NINDEXARRAYS][Tile::TILE_H][Tile::TILE_W])
+{
+ int index_positions[NREGIONS];
+
+ index_positions[0] = 0; // since WLOG we have the high bit of the shapes at 0
+
+ for (int region = 0; region < NREGIONS; ++region)
+ {
+ int x = index_positions[region] & 3;
+ int y = (index_positions[region] >> 2) & 3;
+ nvAssert(REGION(x,y,shapeindex) == region); // double check the table
+
+ // swap RGB
+ if (indices[INDEXARRAY_RGB][y][x] & HIGH_INDEXBIT_RGB(indexmode))
+ {
+ // high bit is set, swap the endpts and indices for this region
+ int t;
+ for (int i=CHANNEL_R; i<=CHANNEL_B; ++i) { t = endpts[region].A[i]; endpts[region].A[i] = endpts[region].B[i]; endpts[region].B[i] = t; }
+
+ for (int y = 0; y < Tile::TILE_H; y++)
+ for (int x = 0; x < Tile::TILE_W; x++)
+ if (REGION(x,y,shapeindex) == region)
+ indices[INDEXARRAY_RGB][y][x] = NINDICES_RGB(indexmode) - 1 - indices[INDEXARRAY_RGB][y][x];
+ }
+
+ // swap A
+ if (indices[INDEXARRAY_A][y][x] & HIGH_INDEXBIT_A(indexmode))
+ {
+ // high bit is set, swap the endpts and indices for this region
+ int t;
+ for (int i=CHANNEL_A; i<=CHANNEL_A; ++i) { t = endpts[region].A[i]; endpts[region].A[i] = endpts[region].B[i]; endpts[region].B[i] = t; }
+
+ for (int y = 0; y < Tile::TILE_H; y++)
+ for (int x = 0; x < Tile::TILE_W; x++)
+ if (REGION(x,y,shapeindex) == region)
+ indices[INDEXARRAY_A][y][x] = NINDICES_A(indexmode) - 1 - indices[INDEXARRAY_A][y][x];
+ }
+ }
+}
+
+static bool endpts_fit(IntEndptsRGBA endpts[NREGIONS], const Pattern &p)
+{
+ return true;
+}
+
+static void write_header(const IntEndptsRGBA endpts[NREGIONS], int shapeindex, const Pattern &p, int rotatemode, int indexmode, Bits &out)
+{
+ // ignore shapeindex
+ out.write(p.mode, p.modebits);
+ out.write(rotatemode, ROTATEMODE_BITS);
+ out.write(indexmode, INDEXMODE_BITS);
+ for (int i=0; i<NREGIONS; ++i)
+ for (int j=0; j<NCHANNELS_RGBA; ++j)
+ {
+ out.write(endpts[i].A[j], p.chan[j].nbitsizes[0]);
+ out.write(endpts[i].B[j], p.chan[j].nbitsizes[1]);
+ }
+ nvAssert (out.getptr() == 50);
+}
+
+static void read_header(Bits &in, IntEndptsRGBA endpts[NREGIONS], int &shapeindex, int &rotatemode, int &indexmode, Pattern &p, int &pat_index)
+{
+ int mode = AVPCL::getmode(in);
+
+ pat_index = 0;
+
+ nvAssert (pat_index >= 0 && pat_index < NPATTERNS);
+ nvAssert (in.getptr() == patterns[pat_index].modebits);
+
+ p = patterns[pat_index];
+
+ shapeindex = 0; // we don't have any
+
+ rotatemode = in.read(ROTATEMODE_BITS);
+ indexmode = in.read(INDEXMODE_BITS);
+ for (int i=0; i<NREGIONS; ++i)
+ for (int j=0; j<NCHANNELS_RGBA; ++j)
+ {
+ endpts[i].A[j] = in.read(p.chan[j].nbitsizes[0]);
+ endpts[i].B[j] = in.read(p.chan[j].nbitsizes[1]);
+ }
+ nvAssert (in.getptr() == 50);
+}
+
+static void write_indices(const int indices[NINDEXARRAYS][Tile::TILE_H][Tile::TILE_W], int shapeindex, int indexmode, Bits &out)
+{
+ // the indices we shorten is always index 0
+
+ // do the 2 bit indices first
+ nvAssert ((indices[INDEXARRAY_2BITS(indexmode)][0][0] & HIGH_INDEXBIT2) == 0);
+ for (int i = 0; i < Tile::TILE_TOTAL; ++i)
+ out.write(indices[INDEXARRAY_2BITS(indexmode)][i>>2][i&3], INDEXBITS2 - (i==0?1:0)); // write i..[1:0] or i..[0]
+
+ // then the 3 bit indices
+ nvAssert ((indices[INDEXARRAY_3BITS(indexmode)][0][0] & HIGH_INDEXBIT3) == 0);
+ for (int i = 0; i < Tile::TILE_TOTAL; ++i)
+ out.write(indices[INDEXARRAY_3BITS(indexmode)][i>>2][i&3], INDEXBITS3 - (i==0?1:0)); // write i..[2:0] or i..[1:0]
+}
+
+static void read_indices(Bits &in, int shapeindex, int indexmode, int indices[NINDEXARRAYS][Tile::TILE_H][Tile::TILE_W])
+{
+ // the indices we shorten is always index 0
+
+ // do the 2 bit indices first
+ for (int i = 0; i < Tile::TILE_TOTAL; ++i)
+ indices[INDEXARRAY_2BITS(indexmode)][i>>2][i&3] = in.read(INDEXBITS2 - (i==0?1:0)); // read i..[1:0] or i..[0]
+
+ // then the 3 bit indices
+ for (int i = 0; i < Tile::TILE_TOTAL; ++i)
+ indices[INDEXARRAY_3BITS(indexmode)][i>>2][i&3] = in.read(INDEXBITS3 - (i==0?1:0)); // read i..[1:0] or i..[0]
+}
+
+static void emit_block(const IntEndptsRGBA endpts[NREGIONS], int shapeindex, const Pattern &p, const int indices[NINDEXARRAYS][Tile::TILE_H][Tile::TILE_W], int rotatemode, int indexmode, char *block)
+{
+ Bits out(block, AVPCL::BITSIZE);
+
+ write_header(endpts, shapeindex, p, rotatemode, indexmode, out);
+
+ write_indices(indices, shapeindex, indexmode, out);
+
+ nvAssert(out.getptr() == AVPCL::BITSIZE);
+}
+
+static void generate_palette_quantized_rgb_a(const IntEndptsRGBA &endpts, const RegionPrec &region_prec, int indexmode, Vector3 palette_rgb[NINDICES3], float palette_a[NINDICES3])
+{
+ // scale endpoints for RGB
+ int a, b;
+
+ a = Utils::unquantize(endpts.A[0], region_prec.endpt_a_prec[0]);
+ b = Utils::unquantize(endpts.B[0], region_prec.endpt_b_prec[0]);
+
+ // interpolate R
+ for (int i = 0; i < NINDICES_RGB(indexmode); ++i)
+ palette_rgb[i].x = float(Utils::lerp(a, b, i, BIAS_RGB(indexmode), DENOM_RGB(indexmode)));
+
+ a = Utils::unquantize(endpts.A[1], region_prec.endpt_a_prec[1]);
+ b = Utils::unquantize(endpts.B[1], region_prec.endpt_b_prec[1]);
+
+ // interpolate G
+ for (int i = 0; i < NINDICES_RGB(indexmode); ++i)
+ palette_rgb[i].y = float(Utils::lerp(a, b, i, BIAS_RGB(indexmode), DENOM_RGB(indexmode)));
+
+ a = Utils::unquantize(endpts.A[2], region_prec.endpt_a_prec[2]);
+ b = Utils::unquantize(endpts.B[2], region_prec.endpt_b_prec[2]);
+
+ // interpolate B
+ for (int i = 0; i < NINDICES_RGB(indexmode); ++i)
+ palette_rgb[i].z = float(Utils::lerp(a, b, i, BIAS_RGB(indexmode), DENOM_RGB(indexmode)));
+
+ a = Utils::unquantize(endpts.A[3], region_prec.endpt_a_prec[3]);
+ b = Utils::unquantize(endpts.B[3], region_prec.endpt_b_prec[3]);
+
+ // interpolate A
+ for (int i = 0; i < NINDICES_A(indexmode); ++i)
+ palette_a[i] = float(Utils::lerp(a, b, i, BIAS_A(indexmode), DENOM_A(indexmode)));
+
+}
+
+static void sign_extend(Pattern &p, IntEndptsRGBA endpts[NREGIONS])
+{
+ for (int i=0; i<NCHANNELS_RGBA; ++i)
+ {
+ if (p.transform_mode)
+ {
+ // endpts[0].A[i] = SIGN_EXTEND(endpts[0].B[i], p.chan[i].nbitsizes[0]); // always positive here
+ endpts[0].B[i] = SIGN_EXTEND(endpts[0].B[i], p.chan[i].nbitsizes[0]);
+ endpts[1].A[i] = SIGN_EXTEND(endpts[1].A[i], p.chan[i].nbitsizes[1]);
+ endpts[1].B[i] = SIGN_EXTEND(endpts[1].B[i], p.chan[i].nbitsizes[1]);
+ }
+ }
+}
+
+static void rotate_tile(const Tile &in, int rotatemode, Tile &out)
+{
+ out.size_x = in.size_x;
+ out.size_y = in.size_y;
+
+ for (int y=0; y<in.size_y; ++y)
+ for (int x=0; x<in.size_x; ++x)
+ {
+ float t;
+ out.data[y][x] = in.data[y][x];
+
+ switch(rotatemode)
+ {
+ case ROTATEMODE_RGBA_RGBA: break;
+ case ROTATEMODE_RGBA_AGBR: t = (out.data[y][x]).x; (out.data[y][x]).x = (out.data[y][x]).w; (out.data[y][x]).w = t; break;
+ case ROTATEMODE_RGBA_RABG: t = (out.data[y][x]).y; (out.data[y][x]).y = (out.data[y][x]).w; (out.data[y][x]).w = t; break;
+ case ROTATEMODE_RGBA_RGAB: t = (out.data[y][x]).z; (out.data[y][x]).z = (out.data[y][x]).w; (out.data[y][x]).w = t; break;
+ default: nvUnreachable();
+ }
+ }
+}
+
+void AVPCL::decompress_mode4(const char *block, Tile &t)
+{
+ Bits in(block, AVPCL::BITSIZE);
+
+ Pattern p;
+ IntEndptsRGBA endpts[NREGIONS];
+ int shapeindex, pat_index, rotatemode, indexmode;
+
+ read_header(in, endpts, shapeindex, rotatemode, indexmode, p, pat_index);
+
+ sign_extend(p, endpts);
+
+ if (p.transform_mode)
+ transform_inverse(p.transform_mode, endpts);
+
+ Vector3 palette_rgb[NREGIONS][NINDICES3]; // could be nindices2
+ float palette_a[NREGIONS][NINDICES3]; // could be nindices2
+
+ for (int region = 0; region < NREGIONS; ++region)
+ generate_palette_quantized_rgb_a(endpts[region], pattern_precs[pat_index].region_precs[region], indexmode, &palette_rgb[region][0], &palette_a[region][0]);
+
+ int indices[NINDEXARRAYS][Tile::TILE_H][Tile::TILE_W];
+
+ read_indices(in, shapeindex, indexmode, indices);
+
+ nvAssert(in.getptr() == AVPCL::BITSIZE);
+
+ Tile temp(t.size_x, t.size_y);
+
+ // lookup
+ for (int y = 0; y < Tile::TILE_H; y++)
+ for (int x = 0; x < Tile::TILE_W; x++)
+ temp.data[y][x] = Vector4(palette_rgb[REGION(x,y,shapeindex)][indices[INDEXARRAY_RGB][y][x]], palette_a[REGION(x,y,shapeindex)][indices[INDEXARRAY_A][y][x]]);
+
+ rotate_tile(temp, rotatemode, t);
+}
+
+// given a collection of colors and quantized endpoints, generate a palette, choose best entries, and return a single toterr
+// we already have a candidate mapping when we call this function, thus an error. take an early exit if the accumulated error so far
+// exceeds what we already have
+static float map_colors(const Vector4 colors[], const float importance[], int np, int rotatemode, int indexmode, const IntEndptsRGBA &endpts, const RegionPrec &region_prec, float current_besterr, int indices[NINDEXARRAYS][Tile::TILE_TOTAL])
+{
+ Vector3 palette_rgb[NINDICES3]; // could be nindices2
+ float palette_a[NINDICES3]; // could be nindices2
+ float toterr = 0;
+
+ generate_palette_quantized_rgb_a(endpts, region_prec, indexmode, &palette_rgb[0], &palette_a[0]);
+
+ Vector3 rgb;
+ float a;
+
+ for (int i = 0; i < np; ++i)
+ {
+ float err, besterr;
+ float palette_alpha = 0, tile_alpha = 0;
+
+ if(AVPCL::flag_premult)
+ tile_alpha = (rotatemode == ROTATEMODE_RGBA_AGBR) ? (colors[i]).x :
+ (rotatemode == ROTATEMODE_RGBA_RABG) ? (colors[i]).y :
+ (rotatemode == ROTATEMODE_RGBA_RGAB) ? (colors[i]).z : (colors[i]).w;
+
+ rgb.x = (colors[i]).x;
+ rgb.y = (colors[i]).y;
+ rgb.z = (colors[i]).z;
+ a = (colors[i]).w;
+
+ // compute the two indices separately
+ // if we're doing premultiplied alpha, we need to choose first the index that
+ // determines the alpha value, and then do the other index
+
+ if (rotatemode == ROTATEMODE_RGBA_RGBA)
+ {
+ // do A index first as it has the alpha
+ besterr = FLT_MAX;
+ for (int j = 0; j < NINDICES_A(indexmode) && besterr > 0; ++j)
+ {
+ err = Utils::metric1(a, palette_a[j], rotatemode);
+
+ if (err > besterr) // error increased, so we're done searching
+ break;
+ if (err < besterr)
+ {
+ besterr = err;
+ palette_alpha = palette_a[j];
+ indices[INDEXARRAY_A][i] = j;
+ }
+ }
+ toterr += besterr; // squared-error norms are additive since we don't do the square root
+
+ // do RGB index
+ besterr = FLT_MAX;
+ for (int j = 0; j < NINDICES_RGB(indexmode) && besterr > 0; ++j)
+ {
+ err = !AVPCL::flag_premult ? Utils::metric3(rgb, palette_rgb[j], rotatemode) :
+ Utils::metric3premult_alphaout(rgb, tile_alpha, palette_rgb[j], palette_alpha);
+
+ if (err > besterr) // error increased, so we're done searching
+ break;
+ if (err < besterr)
+ {
+ besterr = err;
+ indices[INDEXARRAY_RGB][i] = j;
+ }
+ }
+ toterr += besterr;
+ if (toterr > current_besterr)
+ {
+ // fill out bogus index values so it's initialized at least
+ for (int k = i; k < np; ++k)
+ {
+ indices[INDEXARRAY_RGB][k] = -1;
+ indices[INDEXARRAY_A][k] = -1;
+ }
+ return FLT_MAX;
+ }
+ }
+ else
+ {
+ // do RGB index
+ besterr = FLT_MAX;
+ int bestindex;
+ for (int j = 0; j < NINDICES_RGB(indexmode) && besterr > 0; ++j)
+ {
+ err = !AVPCL::flag_premult ? Utils::metric3(rgb, palette_rgb[j], rotatemode) :
+ Utils::metric3premult_alphain(rgb, palette_rgb[j], rotatemode);
+
+ if (err > besterr) // error increased, so we're done searching
+ break;
+ if (err < besterr)
+ {
+ besterr = err;
+ bestindex = j;
+ indices[INDEXARRAY_RGB][i] = j;
+ }
+ }
+ palette_alpha = (rotatemode == ROTATEMODE_RGBA_AGBR) ? (palette_rgb[bestindex]).x :
+ (rotatemode == ROTATEMODE_RGBA_RABG) ? (palette_rgb[bestindex]).y :
+ (rotatemode == ROTATEMODE_RGBA_RGAB) ? (palette_rgb[bestindex]).z : nvCheckMacro(0);
+ toterr += besterr;
+
+ // do A index
+ besterr = FLT_MAX;
+ for (int j = 0; j < NINDICES_A(indexmode) && besterr > 0; ++j)
+ {
+ err = !AVPCL::flag_premult ? Utils::metric1(a, palette_a[j], rotatemode) :
+ Utils::metric1premult(a, tile_alpha, palette_a[j], palette_alpha, rotatemode);
+
+ if (err > besterr) // error increased, so we're done searching
+ break;
+ if (err < besterr)
+ {
+ besterr = err;
+ indices[INDEXARRAY_A][i] = j;
+ }
+ }
+ toterr += besterr; // squared-error norms are additive since we don't do the square root
+ if (toterr > current_besterr)
+ {
+ // fill out bogus index values so it's initialized at least
+ for (int k = i; k < np; ++k)
+ {
+ indices[INDEXARRAY_RGB][k] = -1;
+ indices[INDEXARRAY_A][k] = -1;
+ }
+ return FLT_MAX;
+ }
+ }
+ }
+ return toterr;
+}
+
+// assign indices given a tile, shape, and quantized endpoints, return toterr for each region
+static void assign_indices(const Tile &tile, int shapeindex, int rotatemode, int indexmode, IntEndptsRGBA endpts[NREGIONS], const PatternPrec &pattern_prec,
+ int indices[NINDEXARRAYS][Tile::TILE_H][Tile::TILE_W], float toterr[NREGIONS])
+{
+ Vector3 palette_rgb[NREGIONS][NINDICES3]; // could be nindices2
+ float palette_a[NREGIONS][NINDICES3]; // could be nindices2
+
+ for (int region = 0; region < NREGIONS; ++region)
+ {
+ generate_palette_quantized_rgb_a(endpts[region], pattern_prec.region_precs[region], indexmode, &palette_rgb[region][0], &palette_a[region][0]);
+ toterr[region] = 0;
+ }
+
+ Vector3 rgb;
+ float a;
+
+ for (int y = 0; y < tile.size_y; y++)
+ for (int x = 0; x < tile.size_x; x++)
+ {
+ int region = REGION(x,y,shapeindex);
+ float err, besterr;
+ float palette_alpha = 0, tile_alpha = 0;
+
+ rgb.x = (tile.data[y][x]).x;
+ rgb.y = (tile.data[y][x]).y;
+ rgb.z = (tile.data[y][x]).z;
+ a = (tile.data[y][x]).w;
+
+ if(AVPCL::flag_premult)
+ tile_alpha = (rotatemode == ROTATEMODE_RGBA_AGBR) ? (tile.data[y][x]).x :
+ (rotatemode == ROTATEMODE_RGBA_RABG) ? (tile.data[y][x]).y :
+ (rotatemode == ROTATEMODE_RGBA_RGAB) ? (tile.data[y][x]).z : (tile.data[y][x]).w;
+
+ // compute the two indices separately
+ // if we're doing premultiplied alpha, we need to choose first the index that
+ // determines the alpha value, and then do the other index
+
+ if (rotatemode == ROTATEMODE_RGBA_RGBA)
+ {
+ // do A index first as it has the alpha
+ besterr = FLT_MAX;
+ for (int i = 0; i < NINDICES_A(indexmode) && besterr > 0; ++i)
+ {
+ err = Utils::metric1(a, palette_a[region][i], rotatemode);
+
+ if (err > besterr) // error increased, so we're done searching
+ break;
+ if (err < besterr)
+ {
+ besterr = err;
+ indices[INDEXARRAY_A][y][x] = i;
+ palette_alpha = palette_a[region][i];
+ }
+ }
+ toterr[region] += besterr; // squared-error norms are additive since we don't do the square root
+
+ // do RGB index
+ besterr = FLT_MAX;
+ for (int i = 0; i < NINDICES_RGB(indexmode) && besterr > 0; ++i)
+ {
+ err = !AVPCL::flag_premult ? Utils::metric3(rgb, palette_rgb[region][i], rotatemode) :
+ Utils::metric3premult_alphaout(rgb, tile_alpha, palette_rgb[region][i], palette_alpha);
+
+ if (err > besterr) // error increased, so we're done searching
+ break;
+ if (err < besterr)
+ {
+ besterr = err;
+ indices[INDEXARRAY_RGB][y][x] = i;
+ }
+ }
+ toterr[region] += besterr;
+ }
+ else
+ {
+ // do RGB index first as it has the alpha
+ besterr = FLT_MAX;
+ int bestindex;
+ for (int i = 0; i < NINDICES_RGB(indexmode) && besterr > 0; ++i)
+ {
+ err = !AVPCL::flag_premult ? Utils::metric3(rgb, palette_rgb[region][i], rotatemode) :
+ Utils::metric3premult_alphain(rgb, palette_rgb[region][i], rotatemode);
+
+ if (err > besterr) // error increased, so we're done searching
+ break;
+ if (err < besterr)
+ {
+ besterr = err;
+ indices[INDEXARRAY_RGB][y][x] = i;
+ bestindex = i;
+ }
+ }
+ palette_alpha = (rotatemode == ROTATEMODE_RGBA_AGBR) ? (palette_rgb[region][bestindex]).x :
+ (rotatemode == ROTATEMODE_RGBA_RABG) ? (palette_rgb[region][bestindex]).y :
+ (rotatemode == ROTATEMODE_RGBA_RGAB) ? (palette_rgb[region][bestindex]).z : nvCheckMacro(0);
+ toterr[region] += besterr;
+
+ // do A index
+ besterr = FLT_MAX;
+ for (int i = 0; i < NINDICES_A(indexmode) && besterr > 0; ++i)
+ {
+ err = !AVPCL::flag_premult ? Utils::metric1(a, palette_a[region][i], rotatemode) :
+ Utils::metric1premult(a, tile_alpha, palette_a[region][i], palette_alpha, rotatemode);
+
+ if (err > besterr) // error increased, so we're done searching
+ break;
+ if (err < besterr)
+ {
+ besterr = err;
+ indices[INDEXARRAY_A][y][x] = i;
+ }
+ }
+ toterr[region] += besterr; // squared-error norms are additive since we don't do the square root
+ }
+ }
+}
+
+// note: indices are valid only if the value returned is less than old_err; otherwise they contain -1's
+// this function returns either old_err or a value smaller (if it was successful in improving the error)
+static float perturb_one(const Vector4 colors[], const float importance[], int np, int rotatemode, int indexmode, int ch, const RegionPrec &region_prec, const IntEndptsRGBA &old_endpts, IntEndptsRGBA &new_endpts,
+ float old_err, int do_b, int indices[NINDEXARRAYS][Tile::TILE_TOTAL])
+{
+ // we have the old endpoints: old_endpts
+ // we have the perturbed endpoints: new_endpts
+ // we have the temporary endpoints: temp_endpts
+
+ IntEndptsRGBA temp_endpts;
+ float min_err = old_err; // start with the best current error
+ int beststep;
+ int temp_indices[NINDEXARRAYS][Tile::TILE_TOTAL];
+
+ for (int j=0; j<NINDEXARRAYS; ++j)
+ for (int i=0; i<np; ++i)
+ indices[j][i] = -1;
+
+ // copy real endpoints so we can perturb them
+ temp_endpts = new_endpts = old_endpts;
+
+ int prec = do_b ? region_prec.endpt_b_prec[ch] : region_prec.endpt_a_prec[ch];
+
+ // do a logarithmic search for the best error for this endpoint (which)
+ for (int step = 1 << (prec-1); step; step >>= 1)
+ {
+ bool improved = false;
+ for (int sign = -1; sign <= 1; sign += 2)
+ {
+ if (do_b == 0)
+ {
+ temp_endpts.A[ch] = new_endpts.A[ch] + sign * step;
+ if (temp_endpts.A[ch] < 0 || temp_endpts.A[ch] >= (1 << prec))
+ continue;
+ }
+ else
+ {
+ temp_endpts.B[ch] = new_endpts.B[ch] + sign * step;
+ if (temp_endpts.B[ch] < 0 || temp_endpts.B[ch] >= (1 << prec))
+ continue;
+ }
+
+ float err = map_colors(colors, importance, np, rotatemode, indexmode, temp_endpts, region_prec, min_err, temp_indices);
+
+ if (err < min_err)
+ {
+ improved = true;
+ min_err = err;
+ beststep = sign * step;
+ for (int j=0; j<NINDEXARRAYS; ++j)
+ for (int i=0; i<np; ++i)
+ indices[j][i] = temp_indices[j][i];
+ }
+ }
+ // if this was an improvement, move the endpoint and continue search from there
+ if (improved)
+ {
+ if (do_b == 0)
+ new_endpts.A[ch] += beststep;
+ else
+ new_endpts.B[ch] += beststep;
+ }
+ }
+ return min_err;
+}
+
+// the larger the error the more time it is worth spending on an exhaustive search.
+// perturb the endpoints at least -3 to 3.
+// if err > 5000 perturb endpoints 50% of precision
+// if err > 1000 25%
+// if err > 200 12.5%
+// if err > 40 6.25%
+// for np = 16 -- adjust error thresholds as a function of np
+// always ensure endpoint ordering is preserved (no need to overlap the scan)
+static float exhaustive(const Vector4 colors[], const float importance[], int np, int rotatemode, int indexmode, int ch, const RegionPrec &region_prec, float orig_err, IntEndptsRGBA &opt_endpts, int indices[NINDEXARRAYS][Tile::TILE_TOTAL])
+{
+ IntEndptsRGBA temp_endpts;
+ float best_err = orig_err;
+ int aprec = region_prec.endpt_a_prec[ch];
+ int bprec = region_prec.endpt_b_prec[ch];
+ int good_indices[NINDEXARRAYS][Tile::TILE_TOTAL];
+ int temp_indices[NINDEXARRAYS][Tile::TILE_TOTAL];
+
+ for (int j=0; j<NINDEXARRAYS; ++j)
+ for (int i=0; i<np; ++i)
+ indices[j][i] = -1;
+
+ float thr_scale = (float)np / (float)Tile::TILE_TOTAL;
+
+ if (orig_err == 0) return orig_err;
+
+ int adelta = 0, bdelta = 0;
+ if (orig_err > 5000.0*thr_scale) { adelta = (1 << aprec)/2; bdelta = (1 << bprec)/2; }
+ else if (orig_err > 1000.0*thr_scale) { adelta = (1 << aprec)/4; bdelta = (1 << bprec)/4; }
+ else if (orig_err > 200.0*thr_scale) { adelta = (1 << aprec)/8; bdelta = (1 << bprec)/8; }
+ else if (orig_err > 40.0*thr_scale) { adelta = (1 << aprec)/16; bdelta = (1 << bprec)/16; }
+ adelta = max(adelta, 3);
+ bdelta = max(bdelta, 3);
+
+#ifdef DISABLE_EXHAUSTIVE
+ adelta = bdelta = 3;
+#endif
+
+ temp_endpts = opt_endpts;
+
+ // ok figure out the range of A and B
+ int alow = max(0, opt_endpts.A[ch] - adelta);
+ int ahigh = min((1<<aprec)-1, opt_endpts.A[ch] + adelta);
+ int blow = max(0, opt_endpts.B[ch] - bdelta);
+ int bhigh = min((1<<bprec)-1, opt_endpts.B[ch] + bdelta);
+
+ // now there's no need to swap the ordering of A and B
+ bool a_le_b = opt_endpts.A[ch] <= opt_endpts.B[ch];
+
+ int amin, bmin;
+
+ if (opt_endpts.A[ch] <= opt_endpts.B[ch])
+ {
+ // keep a <= b
+ for (int a = alow; a <= ahigh; ++a)
+ for (int b = max(a, blow); b < bhigh; ++b)
+ {
+ temp_endpts.A[ch] = a;
+ temp_endpts.B[ch] = b;
+
+ float err = map_colors(colors, importance, np, rotatemode, indexmode, temp_endpts, region_prec, best_err, temp_indices);
+ if (err < best_err)
+ {
+ amin = a;
+ bmin = b;
+ best_err = err;
+ for (int j=0; j<NINDEXARRAYS; ++j)
+ for (int i=0; i<np; ++i)
+ good_indices[j][i] = temp_indices[j][i];
+ }
+ }
+ }
+ else
+ {
+ // keep b <= a
+ for (int b = blow; b < bhigh; ++b)
+ for (int a = max(b, alow); a <= ahigh; ++a)
+ {
+ temp_endpts.A[ch] = a;
+ temp_endpts.B[ch] = b;
+
+ float err = map_colors(colors, importance, np, rotatemode, indexmode, temp_endpts, region_prec, best_err, temp_indices);
+ if (err < best_err)
+ {
+ amin = a;
+ bmin = b;
+ best_err = err;
+ for (int j=0; j<NINDEXARRAYS; ++j)
+ for (int i=0; i<np; ++i)
+ good_indices[j][i] = temp_indices[j][i];
+ }
+ }
+ }
+ if (best_err < orig_err)
+ {
+ opt_endpts.A[ch] = amin;
+ opt_endpts.B[ch] = bmin;
+ orig_err = best_err;
+ for (int j=0; j<NINDEXARRAYS; ++j)
+ for (int i=0; i<np; ++i)
+ indices[j][i] = good_indices[j][i];
+ }
+
+ return best_err;
+}
+
+static float optimize_one(const Vector4 colors[], const float importance[], int np, int rotatemode, int indexmode, float orig_err, const IntEndptsRGBA &orig_endpts, const RegionPrec &region_prec, IntEndptsRGBA &opt_endpts)
+{
+ float opt_err = orig_err;
+
+ opt_endpts = orig_endpts;
+
+ /*
+ err0 = perturb(rgb0, delta0)
+ err1 = perturb(rgb1, delta1)
+ if (err0 < err1)
+ if (err0 >= initial_error) break
+ rgb0 += delta0
+ next = 1
+ else
+ if (err1 >= initial_error) break
+ rgb1 += delta1
+ next = 0
+ initial_err = map()
+ for (;;)
+ err = perturb(next ? rgb1:rgb0, delta)
+ if (err >= initial_err) break
+ next? rgb1 : rgb0 += delta
+ initial_err = err
+ */
+ IntEndptsRGBA new_a, new_b;
+ IntEndptsRGBA new_endpt;
+ int do_b;
+ int orig_indices[NINDEXARRAYS][Tile::TILE_TOTAL];
+ int new_indices[NINDEXARRAYS][Tile::TILE_TOTAL];
+ int temp_indices0[NINDEXARRAYS][Tile::TILE_TOTAL];
+ int temp_indices1[NINDEXARRAYS][Tile::TILE_TOTAL];
+
+ // now optimize each channel separately
+ for (int ch = 0; ch < NCHANNELS_RGBA; ++ch)
+ {
+ // figure out which endpoint when perturbed gives the most improvement and start there
+ // if we just alternate, we can easily end up in a local minima
+ float err0 = perturb_one(colors, importance, np, rotatemode, indexmode, ch, region_prec, opt_endpts, new_a, opt_err, 0, temp_indices0); // perturb endpt A
+ float err1 = perturb_one(colors, importance, np, rotatemode, indexmode, ch, region_prec, opt_endpts, new_b, opt_err, 1, temp_indices1); // perturb endpt B
+
+ if (err0 < err1)
+ {
+ if (err0 >= opt_err)
+ continue;
+
+ for (int j=0; j<NINDEXARRAYS; ++j)
+ for (int i=0; i<np; ++i)
+ {
+ new_indices[j][i] = orig_indices[j][i] = temp_indices0[j][i];
+ nvAssert (orig_indices[j][i] != -1);
+ }
+
+ opt_endpts.A[ch] = new_a.A[ch];
+ opt_err = err0;
+ do_b = 1; // do B next
+ }
+ else
+ {
+ if (err1 >= opt_err)
+ continue;
+
+ for (int j=0; j<NINDEXARRAYS; ++j)
+ for (int i=0; i<np; ++i)
+ {
+ new_indices[j][i] = orig_indices[j][i] = temp_indices1[j][i];
+ nvAssert (orig_indices[j][i] != -1);
+ }
+
+ opt_endpts.B[ch] = new_b.B[ch];
+ opt_err = err1;
+ do_b = 0; // do A next
+ }
+
+ // now alternate endpoints and keep trying until there is no improvement
+ for (;;)
+ {
+ float err = perturb_one(colors, importance, np, rotatemode, indexmode, ch, region_prec, opt_endpts, new_endpt, opt_err, do_b, temp_indices0);
+ if (err >= opt_err)
+ break;
+
+ for (int j=0; j<NINDEXARRAYS; ++j)
+ for (int i=0; i<np; ++i)
+ {
+ new_indices[j][i] = temp_indices0[j][i];
+ nvAssert (orig_indices[j][i] != -1);
+ }
+
+ if (do_b == 0)
+ opt_endpts.A[ch] = new_endpt.A[ch];
+ else
+ opt_endpts.B[ch] = new_endpt.B[ch];
+ opt_err = err;
+ do_b = 1 - do_b; // now move the other endpoint
+ }
+
+ // see if the indices have changed
+ int i;
+ for (i=0; i<np; ++i)
+ if (orig_indices[INDEXARRAY_RGB][i] != new_indices[INDEXARRAY_RGB][i] || orig_indices[INDEXARRAY_A][i] != new_indices[INDEXARRAY_A][i])
+ break;
+
+ if (i<np)
+ ch = -1; // start over
+ }
+
+ // finally, do a small exhaustive search around what we think is the global minima to be sure
+ bool first = true;
+ for (int ch = 0; ch < NCHANNELS_RGBA; ++ch)
+ {
+ float new_err = exhaustive(colors, importance, np, rotatemode, indexmode, ch, region_prec, opt_err, opt_endpts, temp_indices0);
+
+ if (new_err < opt_err)
+ {
+ opt_err = new_err;
+
+ if (first)
+ {
+ for (int j=0; j<NINDEXARRAYS; ++j)
+ for (int i=0; i<np; ++i)
+ {
+ orig_indices[j][i] = temp_indices0[j][i];
+ nvAssert (orig_indices[j][i] != -1);
+ }
+ first = false;
+ }
+ else
+ {
+ // see if the indices have changed
+ int i;
+ for (i=0; i<np; ++i)
+ if (orig_indices[INDEXARRAY_RGB][i] != temp_indices0[INDEXARRAY_RGB][i] || orig_indices[INDEXARRAY_A][i] != temp_indices0[INDEXARRAY_A][i])
+ break;
+
+ if (i<np)
+ {
+ ch = -1; // start over
+ first = true;
+ }
+ }
+ }
+ }
+
+ return opt_err;
+}
+
+static void optimize_endpts(const Tile &tile, int shapeindex, int rotatemode, int indexmode, const float orig_err[NREGIONS],
+ const IntEndptsRGBA orig_endpts[NREGIONS], const PatternPrec &pattern_prec, float opt_err[NREGIONS], IntEndptsRGBA opt_endpts[NREGIONS])
+{
+ Vector4 pixels[Tile::TILE_TOTAL];
+ float importance[Tile::TILE_TOTAL];
+ IntEndptsRGBA temp_in, temp_out;
+
+ for (int region=0; region<NREGIONS; ++region)
+ {
+ // collect the pixels in the region
+ int np = 0;
+
+ for (int y = 0; y < tile.size_y; y++) {
+ for (int x = 0; x < tile.size_x; x++) {
+ if (REGION(x, y, shapeindex) == region) {
+ pixels[np] = tile.data[y][x];
+ importance[np] = tile.importance_map[y][x];
+ np++;
+ }
+ }
+ }
+
+ opt_endpts[region] = temp_in = orig_endpts[region];
+ opt_err[region] = orig_err[region];
+
+ float best_err = orig_err[region];
+
+ // make sure we have a valid error for temp_in
+ // we didn't change temp_in, so orig_err[region] is still valid
+ float temp_in_err = orig_err[region];
+
+ // now try to optimize these endpoints
+ float temp_out_err = optimize_one(pixels, importance, np, rotatemode, indexmode, temp_in_err, temp_in, pattern_prec.region_precs[region], temp_out);
+
+ // if we find an improvement, update the best so far and correct the output endpoints and errors
+ if (temp_out_err < best_err)
+ {
+ best_err = temp_out_err;
+ opt_err[region] = temp_out_err;
+ opt_endpts[region] = temp_out;
+ }
+ }
+}
+
+/* optimization algorithm
+ for each pattern
+ convert endpoints using pattern precision
+ assign indices and get initial error
+ compress indices (and possibly reorder endpoints)
+ transform endpoints
+ if transformed endpoints fit pattern
+ get original endpoints back
+ optimize endpoints, get new endpoints, new indices, and new error // new error will almost always be better
+ compress new indices
+ transform new endpoints
+ if new endpoints fit pattern AND if error is improved
+ emit compressed block with new data
+ else
+ emit compressed block with original data // to try to preserve maximum endpoint precision
+*/
+
+static float refine(const Tile &tile, int shapeindex_best, int rotatemode, int indexmode, const FltEndpts endpts[NREGIONS], char *block)
+{
+ float orig_err[NREGIONS], opt_err[NREGIONS], orig_toterr, opt_toterr, expected_opt_err[NREGIONS];
+ IntEndptsRGBA orig_endpts[NREGIONS], opt_endpts[NREGIONS];
+ int orig_indices[NINDEXARRAYS][Tile::TILE_H][Tile::TILE_W], opt_indices[NINDEXARRAYS][Tile::TILE_H][Tile::TILE_W];
+
+ for (int sp = 0; sp < NPATTERNS; ++sp)
+ {
+ quantize_endpts(endpts, pattern_precs[sp], orig_endpts);
+
+ assign_indices(tile, shapeindex_best, rotatemode, indexmode, orig_endpts, pattern_precs[sp], orig_indices, orig_err);
+ swap_indices(shapeindex_best, indexmode, orig_endpts, orig_indices);
+
+ if (patterns[sp].transform_mode)
+ transform_forward(patterns[sp].transform_mode, orig_endpts);
+
+ // apply a heuristic here -- we check if the endpoints fit before we try to optimize them.
+ // the assumption made is that if they don't fit now, they won't fit after optimizing.
+ if (endpts_fit(orig_endpts, patterns[sp]))
+ {
+ if (patterns[sp].transform_mode)
+ transform_inverse(patterns[sp].transform_mode, orig_endpts);
+
+ optimize_endpts(tile, shapeindex_best, rotatemode, indexmode, orig_err, orig_endpts, pattern_precs[sp], expected_opt_err, opt_endpts);
+
+ assign_indices(tile, shapeindex_best, rotatemode, indexmode, opt_endpts, pattern_precs[sp], opt_indices, opt_err);
+ // (nreed) Commented out asserts because they go off all the time...not sure why
+ //for (int i=0; i<NREGIONS; ++i)
+ // nvAssert(expected_opt_err[i] == opt_err[i]);
+ swap_indices(shapeindex_best, indexmode, opt_endpts, opt_indices);
+
+ if (patterns[sp].transform_mode)
+ transform_forward(patterns[sp].transform_mode, opt_endpts);
+
+ orig_toterr = opt_toterr = 0;
+ for (int i=0; i < NREGIONS; ++i) { orig_toterr += orig_err[i]; opt_toterr += opt_err[i]; }
+ if (endpts_fit(opt_endpts, patterns[sp]) && opt_toterr < orig_toterr)
+ {
+ emit_block(opt_endpts, shapeindex_best, patterns[sp], opt_indices, rotatemode, indexmode, block);
+ return opt_toterr;
+ }
+ else
+ {
+ // either it stopped fitting when we optimized it, or there was no improvement
+ // so go back to the unoptimized endpoints which we know will fit
+ if (patterns[sp].transform_mode)
+ transform_forward(patterns[sp].transform_mode, orig_endpts);
+ emit_block(orig_endpts, shapeindex_best, patterns[sp], orig_indices, rotatemode, indexmode, block);
+ return orig_toterr;
+ }
+ }
+ }
+ nvAssert(false); //throw "No candidate found, should never happen (mode avpcl 4).";
+ return FLT_MAX;
+}
+
+static void clamp(Vector4 &v)
+{
+ if (v.x < 0.0f) v.x = 0.0f;
+ if (v.x > 255.0f) v.x = 255.0f;
+ if (v.y < 0.0f) v.y = 0.0f;
+ if (v.y > 255.0f) v.y = 255.0f;
+ if (v.z < 0.0f) v.z = 0.0f;
+ if (v.z > 255.0f) v.z = 255.0f;
+ if (v.w < 0.0f) v.w = 0.0f;
+ if (v.w > 255.0f) v.w = 255.0f;
+}
+
+// compute initial endpoints for the "RGB" portion and the "A" portion.
+// Note these channels may have been rotated.
+static void rough(const Tile &tile, int shapeindex, FltEndpts endpts[NREGIONS])
+{
+ for (int region=0; region<NREGIONS; ++region)
+ {
+ int np = 0;
+ Vector3 colors[Tile::TILE_TOTAL];
+ float alphas[Tile::TILE_TOTAL];
+ Vector4 mean(0,0,0,0);
+
+ for (int y = 0; y < tile.size_y; y++)
+ for (int x = 0; x < tile.size_x; x++)
+ if (REGION(x,y,shapeindex) == region)
+ {
+ colors[np] = tile.data[y][x].xyz();
+ alphas[np] = tile.data[y][x].w;
+ mean += tile.data[y][x];
+ ++np;
+ }
+
+ // handle simple cases
+ if (np == 0)
+ {
+ Vector4 zero(0,0,0,255.0f);
+ endpts[region].A = zero;
+ endpts[region].B = zero;
+ continue;
+ }
+ else if (np == 1)
+ {
+ endpts[region].A = Vector4(colors[0], alphas[0]);
+ endpts[region].B = Vector4(colors[0], alphas[0]);
+ continue;
+ }
+ else if (np == 2)
+ {
+ endpts[region].A = Vector4(colors[0], alphas[0]);
+ endpts[region].B = Vector4(colors[1], alphas[1]);
+ continue;
+ }
+
+ mean /= float(np);
+
+ Vector3 direction = Fit::computePrincipalComponent_EigenSolver(np, colors);
+
+ // project each pixel value along the principal direction
+ float minp = FLT_MAX, maxp = -FLT_MAX;
+ float mina = FLT_MAX, maxa = -FLT_MAX;
+ for (int i = 0; i < np; i++)
+ {
+ float dp = dot(colors[i]-mean.xyz(), direction);
+ if (dp < minp) minp = dp;
+ if (dp > maxp) maxp = dp;
+
+ dp = alphas[i] - mean.w;
+ if (dp < mina) mina = dp;
+ if (dp > maxa) maxa = dp;
+ }
+
+ // choose as endpoints 2 points along the principal direction that span the projections of all of the pixel values
+ endpts[region].A = mean + Vector4(minp*direction, mina);
+ endpts[region].B = mean + Vector4(maxp*direction, maxa);
+
+ // clamp endpoints
+ // the argument for clamping is that the actual endpoints need to be clamped and thus we need to choose the best
+ // shape based on endpoints being clamped
+ clamp(endpts[region].A);
+ clamp(endpts[region].B);
+ }
+}
+
+float AVPCL::compress_mode4(const Tile &t, char *block)
+{
+ FltEndpts endpts[NREGIONS];
+ char tempblock[AVPCL::BLOCKSIZE];
+ float msebest = FLT_MAX;
+ int shape = 0;
+ Tile t1;
+
+ // try all rotations. refine tries the 2 different indexings.
+ for (int r = 0; r < NROTATEMODES && msebest > 0; ++r)
+ {
+ rotate_tile(t, r, t1);
+ rough(t1, shape, endpts);
+ for (int i = 0; i < NINDEXMODES && msebest > 0; ++i)
+ {
+ float mse = refine(t1, shape, r, i, endpts, tempblock);
+ if (mse < msebest)
+ {
+ memcpy(block, tempblock, sizeof(tempblock));
+ msebest = mse;
+ }
+ }
+ }
+ return msebest;
+}
diff --git a/3rdparty/bgfx/3rdparty/nvtt/bc7/avpcl_mode5.cpp b/3rdparty/bgfx/3rdparty/nvtt/bc7/avpcl_mode5.cpp
new file mode 100644
index 00000000000..f1f163658e7
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/nvtt/bc7/avpcl_mode5.cpp
@@ -0,0 +1,1216 @@
+/*
+Copyright 2007 nVidia, Inc.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
+
+You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+See the License for the specific language governing permissions and limitations under the License.
+*/
+
+// Thanks to Jacob Munkberg (jacob@cs.lth.se) for the shortcut of using SVD to do the equivalent of principal components analysis
+
+// x100000 2r 777x2 8x2 2bi 2bi
+
+#include "bits.h"
+#include "tile.h"
+#include "avpcl.h"
+#include "nvcore/debug.h"
+#include "nvmath/vector.inl"
+#include "nvmath/matrix.inl"
+#include "nvmath/fitting.h"
+#include "avpcl_utils.h"
+#include "endpts.h"
+#include <string.h>
+#include <float.h>
+
+using namespace nv;
+using namespace AVPCL;
+
+// there are 2 index arrays. INDEXMODE selects between the arrays being 2 & 3 bits or 3 & 2 bits
+// array 0 is always the RGB array and array 1 is always the A array
+#define NINDEXARRAYS 2
+#define INDEXARRAY_RGB 0
+#define INDEXARRAY_A 1
+#define INDEXARRAY_2BITS(indexmode) ((indexmode == INDEXMODE_ALPHA_IS_2BITS) ? INDEXARRAY_A : INDEXARRAY_RGB)
+#define INDEXARRAY_3BITS(indexmode) ((indexmode == INDEXMODE_ALPHA_IS_3BITS) ? INDEXARRAY_A : INDEXARRAY_RGB)
+
+#define NINDICES3 4
+#define INDEXBITS3 2
+#define HIGH_INDEXBIT3 (1<<(INDEXBITS3-1))
+#define DENOM3 (NINDICES3-1)
+#define BIAS3 (DENOM3/2)
+
+#define NINDICES2 4
+#define INDEXBITS2 2
+#define HIGH_INDEXBIT2 (1<<(INDEXBITS2-1))
+#define DENOM2 (NINDICES2-1)
+#define BIAS2 (DENOM2/2)
+
+#define NINDICES_RGB(indexmode) ((indexmode == INDEXMODE_ALPHA_IS_2BITS) ? NINDICES3 : NINDICES2)
+#define INDEXBITS_RGB(indexmode) ((indexmode == INDEXMODE_ALPHA_IS_2BITS) ? INDEXBITS3 : INDEXBITS2)
+#define HIGH_INDEXBIT_RGB(indexmode)((indexmode == INDEXMODE_ALPHA_IS_2BITS) ? HIGH_INDEXBIT3 : HIGH_INDEXBIT2)
+#define DENOM_RGB(indexmode) ((indexmode == INDEXMODE_ALPHA_IS_2BITS) ? DENOM3 : DENOM2)
+#define BIAS_RGB(indexmode) ((indexmode == INDEXMODE_ALPHA_IS_2BITS) ? BIAS3 : BIAS2)
+
+#define NINDICES_A(indexmode) ((indexmode == INDEXMODE_ALPHA_IS_2BITS) ? NINDICES2 : NINDICES3)
+#define INDEXBITS_A(indexmode) ((indexmode == INDEXMODE_ALPHA_IS_2BITS) ? INDEXBITS2 : INDEXBITS3)
+#define HIGH_INDEXBIT_A(indexmode) ((indexmode == INDEXMODE_ALPHA_IS_2BITS) ? HIGH_INDEXBIT2 : HIGH_INDEXBIT3)
+#define DENOM_A(indexmode) ((indexmode == INDEXMODE_ALPHA_IS_2BITS) ? DENOM2 : DENOM3)
+#define BIAS_A(indexmode) ((indexmode == INDEXMODE_ALPHA_IS_2BITS) ? BIAS2 : BIAS3)
+
+#define NSHAPES 1
+
+static int shapes[NSHAPES] =
+{
+ 0x0000,
+};
+
+#define REGION(x,y,shapeindex) ((shapes[shapeindex]&(1<<(15-(x)-4*(y))))!=0)
+
+#define NREGIONS 1 // keep the region stuff in just in case...
+
+// encoded index compression location: region 0 is always at 0,0.
+
+#define NBITSIZES 2 // one endpoint pair
+
+struct ChanBits
+{
+ int nbitsizes[NBITSIZES]; // bitsizes for one channel
+};
+
+struct Pattern
+{
+ ChanBits chan[NCHANNELS_RGBA];// bit patterns used per channel
+ int transform_mode; // x0 means alpha channel not transformed, x1 otherwise. 0x rgb not transformed, 1x otherwise.
+ int mode; // associated mode value
+ int modebits; // number of mode bits
+ const char *encoding; // verilog description of encoding for this mode
+};
+
+#define TRANSFORM_MODE_ALPHA 1
+#define TRANSFORM_MODE_RGB 2
+
+#define NPATTERNS 1
+
+static Pattern patterns[NPATTERNS] =
+{
+ // red green blue alpha xfm mode mb encoding
+ 7,7, 7,7, 7,7, 8,8, 0x0, 0x20, 6, "",
+};
+
+struct RegionPrec
+{
+ int endpt_a_prec[NCHANNELS_RGBA];
+ int endpt_b_prec[NCHANNELS_RGBA];
+};
+
+struct PatternPrec
+{
+ RegionPrec region_precs[NREGIONS];
+};
+
+// this is the precision for each channel and region
+// NOTE: this MUST match the corresponding data in "patterns" above -- WARNING: there is NO nvAssert to check this!
+static PatternPrec pattern_precs[NPATTERNS] =
+{
+ 7,7,7,8, 7,7,7,8,
+};
+
+
+// return # of bits needed to store n. handle signed or unsigned cases properly
+static int nbits(int n, bool issigned)
+{
+ int nb;
+ if (n==0)
+ return 0; // no bits needed for 0, signed or not
+ else if (n > 0)
+ {
+ for (nb=0; n; ++nb, n>>=1) ;
+ return nb + (issigned?1:0);
+ }
+ else
+ {
+ nvAssert (issigned);
+ for (nb=0; n<-1; ++nb, n>>=1) ;
+ return nb + 1;
+ }
+}
+
+#define R_0 ep[0].A[i]
+#define R_1 ep[0].B[i]
+
+static void transform_forward(int transform_mode, IntEndptsRGBA ep[NREGIONS])
+{
+ int i;
+
+ if (transform_mode & TRANSFORM_MODE_RGB)
+ for (i=CHANNEL_R; i<CHANNEL_A; ++i)
+ R_1 -= R_0;
+ if (transform_mode & TRANSFORM_MODE_ALPHA)
+ {
+ i = CHANNEL_A;
+ R_1 -= R_0;
+ }
+}
+
+static void transform_inverse(int transform_mode, IntEndptsRGBA ep[NREGIONS])
+{
+ int i;
+
+ if (transform_mode & TRANSFORM_MODE_RGB)
+ for (i=CHANNEL_R; i<CHANNEL_A; ++i)
+ R_1 += R_0;
+ if (transform_mode & TRANSFORM_MODE_ALPHA)
+ {
+ i = CHANNEL_A;
+ R_1 += R_0;
+ }
+}
+
+static void quantize_endpts(const FltEndpts endpts[NREGIONS], const PatternPrec &pattern_prec, IntEndptsRGBA q_endpts[NREGIONS])
+{
+ for (int region = 0; region < NREGIONS; ++region)
+ {
+ q_endpts[region].A[0] = Utils::quantize(endpts[region].A.x, pattern_prec.region_precs[region].endpt_a_prec[0]);
+ q_endpts[region].A[1] = Utils::quantize(endpts[region].A.y, pattern_prec.region_precs[region].endpt_a_prec[1]);
+ q_endpts[region].A[2] = Utils::quantize(endpts[region].A.z, pattern_prec.region_precs[region].endpt_a_prec[2]);
+ q_endpts[region].A[3] = Utils::quantize(endpts[region].A.w, pattern_prec.region_precs[region].endpt_a_prec[3]);
+
+ q_endpts[region].B[0] = Utils::quantize(endpts[region].B.x, pattern_prec.region_precs[region].endpt_b_prec[0]);
+ q_endpts[region].B[1] = Utils::quantize(endpts[region].B.y, pattern_prec.region_precs[region].endpt_b_prec[1]);
+ q_endpts[region].B[2] = Utils::quantize(endpts[region].B.z, pattern_prec.region_precs[region].endpt_b_prec[2]);
+ q_endpts[region].B[3] = Utils::quantize(endpts[region].B.w, pattern_prec.region_precs[region].endpt_b_prec[3]);
+ }
+}
+
+// swap endpoints as needed to ensure that the indices at index_one and index_two have a 0 high-order bit
+// index_two is 0 at x=0 y=0 and 15 at x=3 y=3 so y = (index >> 2) & 3 and x = index & 3
+static void swap_indices(int shapeindex, int indexmode, IntEndptsRGBA endpts[NREGIONS], int indices[NINDEXARRAYS][Tile::TILE_H][Tile::TILE_W])
+{
+ int index_positions[NREGIONS];
+
+ index_positions[0] = 0; // since WLOG we have the high bit of the shapes at 0
+
+ for (int region = 0; region < NREGIONS; ++region)
+ {
+ int x = index_positions[region] & 3;
+ int y = (index_positions[region] >> 2) & 3;
+ nvAssert(REGION(x,y,shapeindex) == region); // double check the table
+
+ // swap RGB
+ if (indices[INDEXARRAY_RGB][y][x] & HIGH_INDEXBIT_RGB(indexmode))
+ {
+ // high bit is set, swap the endpts and indices for this region
+ int t;
+ for (int i=CHANNEL_R; i<=CHANNEL_B; ++i) { t = endpts[region].A[i]; endpts[region].A[i] = endpts[region].B[i]; endpts[region].B[i] = t; }
+
+ for (int y = 0; y < Tile::TILE_H; y++)
+ for (int x = 0; x < Tile::TILE_W; x++)
+ if (REGION(x,y,shapeindex) == region)
+ indices[INDEXARRAY_RGB][y][x] = NINDICES_RGB(indexmode) - 1 - indices[INDEXARRAY_RGB][y][x];
+ }
+
+ // swap A
+ if (indices[INDEXARRAY_A][y][x] & HIGH_INDEXBIT_A(indexmode))
+ {
+ // high bit is set, swap the endpts and indices for this region
+ int t;
+ for (int i=CHANNEL_A; i<=CHANNEL_A; ++i) { t = endpts[region].A[i]; endpts[region].A[i] = endpts[region].B[i]; endpts[region].B[i] = t; }
+
+ for (int y = 0; y < Tile::TILE_H; y++)
+ for (int x = 0; x < Tile::TILE_W; x++)
+ if (REGION(x,y,shapeindex) == region)
+ indices[INDEXARRAY_A][y][x] = NINDICES_A(indexmode) - 1 - indices[INDEXARRAY_A][y][x];
+ }
+ }
+}
+
+static bool endpts_fit(IntEndptsRGBA endpts[NREGIONS], const Pattern &p)
+{
+ return true;
+}
+
+static void write_header(const IntEndptsRGBA endpts[NREGIONS], int shapeindex, const Pattern &p, int rotatemode, int indexmode, Bits &out)
+{
+ // ignore shapeindex
+ out.write(p.mode, p.modebits);
+ out.write(rotatemode, ROTATEMODE_BITS);
+// out.write(indexmode, INDEXMODE_BITS);
+ for (int i=0; i<NREGIONS; ++i)
+ for (int j=0; j<NCHANNELS_RGBA; ++j)
+ {
+ out.write(endpts[i].A[j], p.chan[j].nbitsizes[0]);
+ out.write(endpts[i].B[j], p.chan[j].nbitsizes[1]);
+ }
+ nvAssert (out.getptr() == 66);
+}
+
+static void read_header(Bits &in, IntEndptsRGBA endpts[NREGIONS], int &shapeindex, int &rotatemode, int &indexmode, Pattern &p, int &pat_index)
+{
+ int mode = AVPCL::getmode(in);
+
+ pat_index = 0;
+
+ nvAssert (pat_index >= 0 && pat_index < NPATTERNS);
+ nvAssert (in.getptr() == patterns[pat_index].modebits);
+
+ p = patterns[pat_index];
+
+ shapeindex = 0; // we don't have any
+
+ rotatemode = in.read(ROTATEMODE_BITS);
+
+ indexmode = 0; // we don't have any
+
+ for (int i=0; i<NREGIONS; ++i)
+ for (int j=0; j<NCHANNELS_RGBA; ++j)
+ {
+ endpts[i].A[j] = in.read(p.chan[j].nbitsizes[0]);
+ endpts[i].B[j] = in.read(p.chan[j].nbitsizes[1]);
+ }
+ nvAssert (in.getptr() == 66);
+}
+
+static void write_indices(const int indices[NINDEXARRAYS][Tile::TILE_H][Tile::TILE_W], int shapeindex, int indexmode, Bits &out)
+{
+ // the indices we shorten is always index 0
+
+ // do the 2 bit indices first
+ nvAssert ((indices[INDEXARRAY_2BITS(indexmode)][0][0] & HIGH_INDEXBIT2) == 0);
+ for (int i = 0; i < Tile::TILE_TOTAL; ++i)
+ out.write(indices[INDEXARRAY_2BITS(indexmode)][i>>2][i&3], INDEXBITS2 - (i==0?1:0)); // write i..[1:0] or i..[0]
+
+ // then the 3 bit indices
+ nvAssert ((indices[INDEXARRAY_3BITS(indexmode)][0][0] & HIGH_INDEXBIT3) == 0);
+ for (int i = 0; i < Tile::TILE_TOTAL; ++i)
+ out.write(indices[INDEXARRAY_3BITS(indexmode)][i>>2][i&3], INDEXBITS3 - (i==0?1:0)); // write i..[2:0] or i..[1:0]
+}
+
+static void read_indices(Bits &in, int shapeindex, int indexmode, int indices[NINDEXARRAYS][Tile::TILE_H][Tile::TILE_W])
+{
+ // the indices we shorten is always index 0
+
+ // do the 2 bit indices first
+ for (int i = 0; i < Tile::TILE_TOTAL; ++i)
+ indices[INDEXARRAY_2BITS(indexmode)][i>>2][i&3] = in.read(INDEXBITS2 - (i==0?1:0)); // read i..[1:0] or i..[0]
+
+ // then the 3 bit indices
+ for (int i = 0; i < Tile::TILE_TOTAL; ++i)
+ indices[INDEXARRAY_3BITS(indexmode)][i>>2][i&3] = in.read(INDEXBITS3 - (i==0?1:0)); // read i..[1:0] or i..[0]
+}
+
+static void emit_block(const IntEndptsRGBA endpts[NREGIONS], int shapeindex, const Pattern &p, const int indices[NINDEXARRAYS][Tile::TILE_H][Tile::TILE_W], int rotatemode, int indexmode, char *block)
+{
+ Bits out(block, AVPCL::BITSIZE);
+
+ write_header(endpts, shapeindex, p, rotatemode, indexmode, out);
+
+ write_indices(indices, shapeindex, indexmode, out);
+
+ nvAssert(out.getptr() == AVPCL::BITSIZE);
+}
+
+static void generate_palette_quantized_rgb_a(const IntEndptsRGBA &endpts, const RegionPrec &region_prec, int indexmode, Vector3 palette_rgb[NINDICES3], float palette_a[NINDICES3])
+{
+ // scale endpoints for RGB
+ int a, b;
+
+ a = Utils::unquantize(endpts.A[0], region_prec.endpt_a_prec[0]);
+ b = Utils::unquantize(endpts.B[0], region_prec.endpt_b_prec[0]);
+
+ // interpolate R
+ for (int i = 0; i < NINDICES_RGB(indexmode); ++i)
+ palette_rgb[i].x = float(Utils::lerp(a, b, i, BIAS_RGB(indexmode), DENOM_RGB(indexmode)));
+
+ a = Utils::unquantize(endpts.A[1], region_prec.endpt_a_prec[1]);
+ b = Utils::unquantize(endpts.B[1], region_prec.endpt_b_prec[1]);
+
+ // interpolate G
+ for (int i = 0; i < NINDICES_RGB(indexmode); ++i)
+ palette_rgb[i].y = float(Utils::lerp(a, b, i, BIAS_RGB(indexmode), DENOM_RGB(indexmode)));
+
+ a = Utils::unquantize(endpts.A[2], region_prec.endpt_a_prec[2]);
+ b = Utils::unquantize(endpts.B[2], region_prec.endpt_b_prec[2]);
+
+ // interpolate B
+ for (int i = 0; i < NINDICES_RGB(indexmode); ++i)
+ palette_rgb[i].z = float(Utils::lerp(a, b, i, BIAS_RGB(indexmode), DENOM_RGB(indexmode)));
+
+ a = Utils::unquantize(endpts.A[3], region_prec.endpt_a_prec[3]);
+ b = Utils::unquantize(endpts.B[3], region_prec.endpt_b_prec[3]);
+
+ // interpolate A
+ for (int i = 0; i < NINDICES_A(indexmode); ++i)
+ palette_a[i] = float(Utils::lerp(a, b, i, BIAS_A(indexmode), DENOM_A(indexmode)));
+}
+
+static void sign_extend(Pattern &p, IntEndptsRGBA endpts[NREGIONS])
+{
+ for (int i=0; i<NCHANNELS_RGBA; ++i)
+ {
+ if (p.transform_mode)
+ {
+ // endpts[0].A[i] = SIGN_EXTEND(endpts[0].B[i], p.chan[i].nbitsizes[0]); // always positive here
+ endpts[0].B[i] = SIGN_EXTEND(endpts[0].B[i], p.chan[i].nbitsizes[0]);
+ endpts[1].A[i] = SIGN_EXTEND(endpts[1].A[i], p.chan[i].nbitsizes[1]);
+ endpts[1].B[i] = SIGN_EXTEND(endpts[1].B[i], p.chan[i].nbitsizes[1]);
+ }
+ }
+}
+
+static void rotate_tile(const Tile &in, int rotatemode, Tile &out)
+{
+ out.size_x = in.size_x;
+ out.size_y = in.size_y;
+
+ for (int y=0; y<in.size_y; ++y)
+ for (int x=0; x<in.size_x; ++x)
+ {
+ float t;
+ out.data[y][x] = in.data[y][x];
+
+ switch(rotatemode)
+ {
+ case ROTATEMODE_RGBA_RGBA: break;
+ case ROTATEMODE_RGBA_AGBR: t = (out.data[y][x]).x; (out.data[y][x]).x = (out.data[y][x]).w; (out.data[y][x]).w = t; break;
+ case ROTATEMODE_RGBA_RABG: t = (out.data[y][x]).y; (out.data[y][x]).y = (out.data[y][x]).w; (out.data[y][x]).w = t; break;
+ case ROTATEMODE_RGBA_RGAB: t = (out.data[y][x]).z; (out.data[y][x]).z = (out.data[y][x]).w; (out.data[y][x]).w = t; break;
+ default: nvUnreachable();
+ }
+ }
+}
+
+void AVPCL::decompress_mode5(const char *block, Tile &t)
+{
+ Bits in(block, AVPCL::BITSIZE);
+
+ Pattern p;
+ IntEndptsRGBA endpts[NREGIONS];
+ int shapeindex, pat_index, rotatemode, indexmode;
+
+ read_header(in, endpts, shapeindex, rotatemode, indexmode, p, pat_index);
+
+ sign_extend(p, endpts);
+
+ if (p.transform_mode)
+ transform_inverse(p.transform_mode, endpts);
+
+ Vector3 palette_rgb[NREGIONS][NINDICES3]; // could be nindices2
+ float palette_a[NREGIONS][NINDICES3]; // could be nindices2
+
+ for (int region = 0; region < NREGIONS; ++region)
+ generate_palette_quantized_rgb_a(endpts[region], pattern_precs[pat_index].region_precs[region], indexmode, &palette_rgb[region][0], &palette_a[region][0]);
+
+ int indices[NINDEXARRAYS][Tile::TILE_H][Tile::TILE_W];
+
+ read_indices(in, shapeindex, indexmode, indices);
+
+ nvAssert(in.getptr() == AVPCL::BITSIZE);
+
+ Tile temp(t.size_x, t.size_y);
+
+ // lookup
+ for (int y = 0; y < Tile::TILE_H; y++)
+ for (int x = 0; x < Tile::TILE_W; x++)
+ temp.data[y][x] = Vector4(palette_rgb[REGION(x,y,shapeindex)][indices[INDEXARRAY_RGB][y][x]], palette_a[REGION(x,y,shapeindex)][indices[INDEXARRAY_A][y][x]]);
+
+ rotate_tile(temp, rotatemode, t);
+}
+
+// given a collection of colors and quantized endpoints, generate a palette, choose best entries, and return a single toterr
+// we already have a candidate mapping when we call this function, thus an error. take an early exit if the accumulated error so far
+// exceeds what we already have
+static float map_colors(const Vector4 colors[], const float importance[], int np, int rotatemode, int indexmode, const IntEndptsRGBA &endpts, const RegionPrec &region_prec, float current_besterr, int indices[NINDEXARRAYS][Tile::TILE_TOTAL])
+{
+ Vector3 palette_rgb[NINDICES3]; // could be nindices2
+ float palette_a[NINDICES3]; // could be nindices2
+ float toterr = 0;
+
+ generate_palette_quantized_rgb_a(endpts, region_prec, indexmode, &palette_rgb[0], &palette_a[0]);
+
+ Vector3 rgb;
+ float a;
+
+ for (int i = 0; i < np; ++i)
+ {
+ float err, besterr;
+ float palette_alpha = 0, tile_alpha = 0;
+
+ if(AVPCL::flag_premult)
+ tile_alpha = (rotatemode == ROTATEMODE_RGBA_AGBR) ? (colors[i]).x :
+ (rotatemode == ROTATEMODE_RGBA_RABG) ? (colors[i]).y :
+ (rotatemode == ROTATEMODE_RGBA_RGAB) ? (colors[i]).z : (colors[i]).w;
+
+ rgb.x = (colors[i]).x;
+ rgb.y = (colors[i]).y;
+ rgb.z = (colors[i]).z;
+ a = (colors[i]).w;
+
+ // compute the two indices separately
+ // if we're doing premultiplied alpha, we need to choose first the index that
+ // determines the alpha value, and then do the other index
+
+ if (rotatemode == ROTATEMODE_RGBA_RGBA)
+ {
+ // do A index first as it has the alpha
+ besterr = FLT_MAX;
+ for (int j = 0; j < NINDICES_A(indexmode) && besterr > 0; ++j)
+ {
+ err = Utils::metric1(a, palette_a[j], rotatemode);
+
+ if (err > besterr) // error increased, so we're done searching
+ break;
+ if (err < besterr)
+ {
+ besterr = err;
+ palette_alpha = palette_a[j];
+ indices[INDEXARRAY_A][i] = j;
+ }
+ }
+ toterr += besterr; // squared-error norms are additive since we don't do the square root
+
+ // do RGB index
+ besterr = FLT_MAX;
+ for (int j = 0; j < NINDICES_RGB(indexmode) && besterr > 0; ++j)
+ {
+ err = !AVPCL::flag_premult ? Utils::metric3(rgb, palette_rgb[j], rotatemode) :
+ Utils::metric3premult_alphaout(rgb, tile_alpha, palette_rgb[j], palette_alpha);
+
+ if (err > besterr) // error increased, so we're done searching
+ break;
+ if (err < besterr)
+ {
+ besterr = err;
+ indices[INDEXARRAY_RGB][i] = j;
+ }
+ }
+ toterr += besterr;
+ if (toterr > current_besterr)
+ {
+ // fill out bogus index values so it's initialized at least
+ for (int k = i; k < np; ++k)
+ {
+ indices[INDEXARRAY_RGB][k] = -1;
+ indices[INDEXARRAY_A][k] = -1;
+ }
+ return FLT_MAX;
+ }
+ }
+ else
+ {
+ // do RGB index
+ besterr = FLT_MAX;
+ int bestindex;
+ for (int j = 0; j < NINDICES_RGB(indexmode) && besterr > 0; ++j)
+ {
+ err = !AVPCL::flag_premult ? Utils::metric3(rgb, palette_rgb[j], rotatemode) :
+ Utils::metric3premult_alphain(rgb, palette_rgb[j], rotatemode);
+
+ if (err > besterr) // error increased, so we're done searching
+ break;
+ if (err < besterr)
+ {
+ besterr = err;
+ bestindex = j;
+ indices[INDEXARRAY_RGB][i] = j;
+ }
+ }
+ palette_alpha = (rotatemode == ROTATEMODE_RGBA_AGBR) ? (palette_rgb[bestindex]).x :
+ (rotatemode == ROTATEMODE_RGBA_RABG) ? (palette_rgb[bestindex]).y :
+ (rotatemode == ROTATEMODE_RGBA_RGAB) ? (palette_rgb[bestindex]).z : nvCheckMacro(0);
+ toterr += besterr;
+
+ // do A index
+ besterr = FLT_MAX;
+ for (int j = 0; j < NINDICES_A(indexmode) && besterr > 0; ++j)
+ {
+ err = !AVPCL::flag_premult ? Utils::metric1(a, palette_a[j], rotatemode) :
+ Utils::metric1premult(a, tile_alpha, palette_a[j], palette_alpha, rotatemode);
+
+ if (err > besterr) // error increased, so we're done searching
+ break;
+ if (err < besterr)
+ {
+ besterr = err;
+ indices[INDEXARRAY_A][i] = j;
+ }
+ }
+ toterr += besterr; // squared-error norms are additive since we don't do the square root
+ if (toterr > current_besterr)
+ {
+ // fill out bogus index values so it's initialized at least
+ for (int k = i; k < np; ++k)
+ {
+ indices[INDEXARRAY_RGB][k] = -1;
+ indices[INDEXARRAY_A][k] = -1;
+ }
+ return FLT_MAX;
+ }
+ }
+ }
+ return toterr;
+}
+
+// assign indices given a tile, shape, and quantized endpoints, return toterr for each region
+static void assign_indices(const Tile &tile, int shapeindex, int rotatemode, int indexmode, IntEndptsRGBA endpts[NREGIONS], const PatternPrec &pattern_prec,
+ int indices[NINDEXARRAYS][Tile::TILE_H][Tile::TILE_W], float toterr[NREGIONS])
+{
+ Vector3 palette_rgb[NREGIONS][NINDICES3]; // could be nindices2
+ float palette_a[NREGIONS][NINDICES3]; // could be nindices2
+
+ for (int region = 0; region < NREGIONS; ++region)
+ {
+ generate_palette_quantized_rgb_a(endpts[region], pattern_prec.region_precs[region], indexmode, &palette_rgb[region][0], &palette_a[region][0]);
+ toterr[region] = 0;
+ }
+
+ Vector3 rgb;
+ float a;
+
+ for (int y = 0; y < tile.size_y; y++)
+ for (int x = 0; x < tile.size_x; x++)
+ {
+ int region = REGION(x,y,shapeindex);
+ float err, besterr;
+ float palette_alpha = 0, tile_alpha = 0;
+
+ rgb.x = (tile.data[y][x]).x;
+ rgb.y = (tile.data[y][x]).y;
+ rgb.z = (tile.data[y][x]).z;
+ a = (tile.data[y][x]).w;
+
+ if(AVPCL::flag_premult)
+ tile_alpha = (rotatemode == ROTATEMODE_RGBA_AGBR) ? (tile.data[y][x]).x :
+ (rotatemode == ROTATEMODE_RGBA_RABG) ? (tile.data[y][x]).y :
+ (rotatemode == ROTATEMODE_RGBA_RGAB) ? (tile.data[y][x]).z : (tile.data[y][x]).w;
+
+ // compute the two indices separately
+ // if we're doing premultiplied alpha, we need to choose first the index that
+ // determines the alpha value, and then do the other index
+
+ if (rotatemode == ROTATEMODE_RGBA_RGBA)
+ {
+ // do A index first as it has the alpha
+ besterr = FLT_MAX;
+ for (int i = 0; i < NINDICES_A(indexmode) && besterr > 0; ++i)
+ {
+ err = Utils::metric1(a, palette_a[region][i], rotatemode);
+
+ if (err > besterr) // error increased, so we're done searching
+ break;
+ if (err < besterr)
+ {
+ besterr = err;
+ indices[INDEXARRAY_A][y][x] = i;
+ palette_alpha = palette_a[region][i];
+ }
+ }
+ toterr[region] += besterr; // squared-error norms are additive since we don't do the square root
+
+ // do RGB index
+ besterr = FLT_MAX;
+ for (int i = 0; i < NINDICES_RGB(indexmode) && besterr > 0; ++i)
+ {
+ err = !AVPCL::flag_premult ? Utils::metric3(rgb, palette_rgb[region][i], rotatemode) :
+ Utils::metric3premult_alphaout(rgb, tile_alpha, palette_rgb[region][i], palette_alpha);
+
+ if (err > besterr) // error increased, so we're done searching
+ break;
+ if (err < besterr)
+ {
+ besterr = err;
+ indices[INDEXARRAY_RGB][y][x] = i;
+ }
+ }
+ toterr[region] += besterr;
+ }
+ else
+ {
+ // do RGB index first as it has the alpha
+ besterr = FLT_MAX;
+ int bestindex;
+ for (int i = 0; i < NINDICES_RGB(indexmode) && besterr > 0; ++i)
+ {
+ err = !AVPCL::flag_premult ? Utils::metric3(rgb, palette_rgb[region][i], rotatemode) :
+ Utils::metric3premult_alphain(rgb, palette_rgb[region][i], rotatemode);
+
+ if (err > besterr) // error increased, so we're done searching
+ break;
+ if (err < besterr)
+ {
+ besterr = err;
+ indices[INDEXARRAY_RGB][y][x] = i;
+ bestindex = i;
+ }
+ }
+ palette_alpha = (rotatemode == ROTATEMODE_RGBA_AGBR) ? (palette_rgb[region][bestindex]).x :
+ (rotatemode == ROTATEMODE_RGBA_RABG) ? (palette_rgb[region][bestindex]).y :
+ (rotatemode == ROTATEMODE_RGBA_RGAB) ? (palette_rgb[region][bestindex]).z : nvCheckMacro(0);
+ toterr[region] += besterr;
+
+ // do A index
+ besterr = FLT_MAX;
+ for (int i = 0; i < NINDICES_A(indexmode) && besterr > 0; ++i)
+ {
+ err = !AVPCL::flag_premult ? Utils::metric1(a, palette_a[region][i], rotatemode) :
+ Utils::metric1premult(a, tile_alpha, palette_a[region][i], palette_alpha, rotatemode);
+
+ if (err > besterr) // error increased, so we're done searching
+ break;
+ if (err < besterr)
+ {
+ besterr = err;
+ indices[INDEXARRAY_A][y][x] = i;
+ }
+ }
+ toterr[region] += besterr; // squared-error norms are additive since we don't do the square root
+ }
+ }
+}
+
+// note: indices are valid only if the value returned is less than old_err; otherwise they contain -1's
+// this function returns either old_err or a value smaller (if it was successful in improving the error)
+static float perturb_one(const Vector4 colors[], const float importance[], int np, int rotatemode, int indexmode, int ch, const RegionPrec &region_prec, const IntEndptsRGBA &old_endpts, IntEndptsRGBA &new_endpts,
+ float old_err, int do_b, int indices[NINDEXARRAYS][Tile::TILE_TOTAL])
+{
+ // we have the old endpoints: old_endpts
+ // we have the perturbed endpoints: new_endpts
+ // we have the temporary endpoints: temp_endpts
+
+ IntEndptsRGBA temp_endpts;
+ float min_err = old_err; // start with the best current error
+ int beststep;
+ int temp_indices[NINDEXARRAYS][Tile::TILE_TOTAL];
+
+ for (int j=0; j<NINDEXARRAYS; ++j)
+ for (int i=0; i<np; ++i)
+ indices[j][i] = -1;
+
+ // copy real endpoints so we can perturb them
+ temp_endpts = new_endpts = old_endpts;
+
+ int prec = do_b ? region_prec.endpt_b_prec[ch] : region_prec.endpt_a_prec[ch];
+
+ // do a logarithmic search for the best error for this endpoint (which)
+ for (int step = 1 << (prec-1); step; step >>= 1)
+ {
+ bool improved = false;
+ for (int sign = -1; sign <= 1; sign += 2)
+ {
+ if (do_b == 0)
+ {
+ temp_endpts.A[ch] = new_endpts.A[ch] + sign * step;
+ if (temp_endpts.A[ch] < 0 || temp_endpts.A[ch] >= (1 << prec))
+ continue;
+ }
+ else
+ {
+ temp_endpts.B[ch] = new_endpts.B[ch] + sign * step;
+ if (temp_endpts.B[ch] < 0 || temp_endpts.B[ch] >= (1 << prec))
+ continue;
+ }
+
+ float err = map_colors(colors, importance, np, rotatemode, indexmode, temp_endpts, region_prec, min_err, temp_indices);
+
+ if (err < min_err)
+ {
+ improved = true;
+ min_err = err;
+ beststep = sign * step;
+ for (int j=0; j<NINDEXARRAYS; ++j)
+ for (int i=0; i<np; ++i)
+ indices[j][i] = temp_indices[j][i];
+ }
+ }
+ // if this was an improvement, move the endpoint and continue search from there
+ if (improved)
+ {
+ if (do_b == 0)
+ new_endpts.A[ch] += beststep;
+ else
+ new_endpts.B[ch] += beststep;
+ }
+ }
+ return min_err;
+}
+
+// the larger the error the more time it is worth spending on an exhaustive search.
+// perturb the endpoints at least -3 to 3.
+// if err > 5000 perturb endpoints 50% of precision
+// if err > 1000 25%
+// if err > 200 12.5%
+// if err > 40 6.25%
+// for np = 16 -- adjust error thresholds as a function of np
+// always ensure endpoint ordering is preserved (no need to overlap the scan)
+static float exhaustive(const Vector4 colors[], const float importance[], int np, int rotatemode, int indexmode, int ch, const RegionPrec &region_prec, float orig_err, IntEndptsRGBA &opt_endpts, int indices[NINDEXARRAYS][Tile::TILE_TOTAL])
+{
+ IntEndptsRGBA temp_endpts;
+ float best_err = orig_err;
+ int aprec = region_prec.endpt_a_prec[ch];
+ int bprec = region_prec.endpt_b_prec[ch];
+ int good_indices[NINDEXARRAYS][Tile::TILE_TOTAL];
+ int temp_indices[NINDEXARRAYS][Tile::TILE_TOTAL];
+
+ for (int j=0; j<NINDEXARRAYS; ++j)
+ for (int i=0; i<np; ++i)
+ indices[j][i] = -1;
+
+ float thr_scale = (float)np / (float)Tile::TILE_TOTAL;
+
+ if (orig_err == 0) return orig_err;
+
+ int adelta = 0, bdelta = 0;
+ if (orig_err > 5000.0*thr_scale) { adelta = (1 << aprec)/2; bdelta = (1 << bprec)/2; }
+ else if (orig_err > 1000.0*thr_scale) { adelta = (1 << aprec)/4; bdelta = (1 << bprec)/4; }
+ else if (orig_err > 200.0*thr_scale) { adelta = (1 << aprec)/8; bdelta = (1 << bprec)/8; }
+ else if (orig_err > 40.0*thr_scale) { adelta = (1 << aprec)/16; bdelta = (1 << bprec)/16; }
+ adelta = max(adelta, 3);
+ bdelta = max(bdelta, 3);
+
+#ifdef DISABLE_EXHAUSTIVE
+ adelta = bdelta = 3;
+#endif
+
+ temp_endpts = opt_endpts;
+
+ // ok figure out the range of A and B
+ int alow = max(0, opt_endpts.A[ch] - adelta);
+ int ahigh = min((1<<aprec)-1, opt_endpts.A[ch] + adelta);
+ int blow = max(0, opt_endpts.B[ch] - bdelta);
+ int bhigh = min((1<<bprec)-1, opt_endpts.B[ch] + bdelta);
+
+ // now there's no need to swap the ordering of A and B
+ bool a_le_b = opt_endpts.A[ch] <= opt_endpts.B[ch];
+
+ int amin, bmin;
+
+ if (opt_endpts.A[ch] <= opt_endpts.B[ch])
+ {
+ // keep a <= b
+ for (int a = alow; a <= ahigh; ++a)
+ for (int b = max(a, blow); b < bhigh; ++b)
+ {
+ temp_endpts.A[ch] = a;
+ temp_endpts.B[ch] = b;
+
+ float err = map_colors(colors, importance, np, rotatemode, indexmode, temp_endpts, region_prec, best_err, temp_indices);
+ if (err < best_err)
+ {
+ amin = a;
+ bmin = b;
+ best_err = err;
+ for (int j=0; j<NINDEXARRAYS; ++j)
+ for (int i=0; i<np; ++i)
+ good_indices[j][i] = temp_indices[j][i];
+ }
+ }
+ }
+ else
+ {
+ // keep b <= a
+ for (int b = blow; b < bhigh; ++b)
+ for (int a = max(b, alow); a <= ahigh; ++a)
+ {
+ temp_endpts.A[ch] = a;
+ temp_endpts.B[ch] = b;
+
+ float err = map_colors(colors, importance, np, rotatemode, indexmode, temp_endpts, region_prec, best_err, temp_indices);
+ if (err < best_err)
+ {
+ amin = a;
+ bmin = b;
+ best_err = err;
+ for (int j=0; j<NINDEXARRAYS; ++j)
+ for (int i=0; i<np; ++i)
+ good_indices[j][i] = temp_indices[j][i];
+ }
+ }
+ }
+ if (best_err < orig_err)
+ {
+ opt_endpts.A[ch] = amin;
+ opt_endpts.B[ch] = bmin;
+ orig_err = best_err;
+ for (int j=0; j<NINDEXARRAYS; ++j)
+ for (int i=0; i<np; ++i)
+ indices[j][i] = good_indices[j][i];
+ }
+
+ return best_err;
+}
+
+static float optimize_one(const Vector4 colors[], const float importance[], int np, int rotatemode, int indexmode, float orig_err, const IntEndptsRGBA &orig_endpts, const RegionPrec &region_prec, IntEndptsRGBA &opt_endpts)
+{
+ float opt_err = orig_err;
+
+ opt_endpts = orig_endpts;
+
+ /*
+ err0 = perturb(rgb0, delta0)
+ err1 = perturb(rgb1, delta1)
+ if (err0 < err1)
+ if (err0 >= initial_error) break
+ rgb0 += delta0
+ next = 1
+ else
+ if (err1 >= initial_error) break
+ rgb1 += delta1
+ next = 0
+ initial_err = map()
+ for (;;)
+ err = perturb(next ? rgb1:rgb0, delta)
+ if (err >= initial_err) break
+ next? rgb1 : rgb0 += delta
+ initial_err = err
+ */
+ IntEndptsRGBA new_a, new_b;
+ IntEndptsRGBA new_endpt;
+ int do_b;
+ int orig_indices[NINDEXARRAYS][Tile::TILE_TOTAL];
+ int new_indices[NINDEXARRAYS][Tile::TILE_TOTAL];
+ int temp_indices0[NINDEXARRAYS][Tile::TILE_TOTAL];
+ int temp_indices1[NINDEXARRAYS][Tile::TILE_TOTAL];
+
+ // now optimize each channel separately
+ for (int ch = 0; ch < NCHANNELS_RGBA; ++ch)
+ {
+ // figure out which endpoint when perturbed gives the most improvement and start there
+ // if we just alternate, we can easily end up in a local minima
+ float err0 = perturb_one(colors, importance, np, rotatemode, indexmode, ch, region_prec, opt_endpts, new_a, opt_err, 0, temp_indices0); // perturb endpt A
+ float err1 = perturb_one(colors, importance, np, rotatemode, indexmode, ch, region_prec, opt_endpts, new_b, opt_err, 1, temp_indices1); // perturb endpt B
+
+ if (err0 < err1)
+ {
+ if (err0 >= opt_err)
+ continue;
+
+ for (int j=0; j<NINDEXARRAYS; ++j)
+ for (int i=0; i<np; ++i)
+ {
+ new_indices[j][i] = orig_indices[j][i] = temp_indices0[j][i];
+ nvAssert (orig_indices[j][i] != -1);
+ }
+
+ opt_endpts.A[ch] = new_a.A[ch];
+ opt_err = err0;
+ do_b = 1; // do B next
+ }
+ else
+ {
+ if (err1 >= opt_err)
+ continue;
+
+ for (int j=0; j<NINDEXARRAYS; ++j)
+ for (int i=0; i<np; ++i)
+ {
+ new_indices[j][i] = orig_indices[j][i] = temp_indices1[j][i];
+ nvAssert (orig_indices[j][i] != -1);
+ }
+
+ opt_endpts.B[ch] = new_b.B[ch];
+ opt_err = err1;
+ do_b = 0; // do A next
+ }
+
+ // now alternate endpoints and keep trying until there is no improvement
+ for (;;)
+ {
+ float err = perturb_one(colors, importance, np, rotatemode, indexmode, ch, region_prec, opt_endpts, new_endpt, opt_err, do_b, temp_indices0);
+ if (err >= opt_err)
+ break;
+
+ for (int j=0; j<NINDEXARRAYS; ++j)
+ for (int i=0; i<np; ++i)
+ {
+ new_indices[j][i] = temp_indices0[j][i];
+ nvAssert (orig_indices[j][i] != -1);
+ }
+
+ if (do_b == 0)
+ opt_endpts.A[ch] = new_endpt.A[ch];
+ else
+ opt_endpts.B[ch] = new_endpt.B[ch];
+ opt_err = err;
+ do_b = 1 - do_b; // now move the other endpoint
+ }
+
+ // see if the indices have changed
+ int i;
+ for (i=0; i<np; ++i)
+ if (orig_indices[INDEXARRAY_RGB][i] != new_indices[INDEXARRAY_RGB][i] || orig_indices[INDEXARRAY_A][i] != new_indices[INDEXARRAY_A][i])
+ break;
+
+ if (i<np)
+ ch = -1; // start over
+ }
+
+ // finally, do a small exhaustive search around what we think is the global minima to be sure
+ bool first = true;
+ for (int ch = 0; ch < NCHANNELS_RGBA; ++ch)
+ {
+ float new_err = exhaustive(colors, importance, np, rotatemode, indexmode, ch, region_prec, opt_err, opt_endpts, temp_indices0);
+
+ if (new_err < opt_err)
+ {
+ opt_err = new_err;
+
+ if (first)
+ {
+ for (int j=0; j<NINDEXARRAYS; ++j)
+ for (int i=0; i<np; ++i)
+ {
+ orig_indices[j][i] = temp_indices0[j][i];
+ nvAssert (orig_indices[j][i] != -1);
+ }
+ first = false;
+ }
+ else
+ {
+ // see if the indices have changed
+ int i;
+ for (i=0; i<np; ++i)
+ if (orig_indices[INDEXARRAY_RGB][i] != temp_indices0[INDEXARRAY_RGB][i] || orig_indices[INDEXARRAY_A][i] != temp_indices0[INDEXARRAY_A][i])
+ break;
+
+ if (i<np)
+ {
+ ch = -1; // start over
+ first = true;
+ }
+ }
+ }
+ }
+
+ return opt_err;
+}
+
+static void optimize_endpts(const Tile &tile, int shapeindex, int rotatemode, int indexmode, const float orig_err[NREGIONS],
+ const IntEndptsRGBA orig_endpts[NREGIONS], const PatternPrec &pattern_prec, float opt_err[NREGIONS], IntEndptsRGBA opt_endpts[NREGIONS])
+{
+ Vector4 pixels[Tile::TILE_TOTAL];
+ float importance[Tile::TILE_TOTAL];
+ IntEndptsRGBA temp_in, temp_out;
+
+ for (int region=0; region<NREGIONS; ++region)
+ {
+ // collect the pixels in the region
+ int np = 0;
+
+ for (int y = 0; y < tile.size_y; y++) {
+ for (int x = 0; x < tile.size_x; x++) {
+ if (REGION(x, y, shapeindex) == region) {
+ pixels[np] = tile.data[y][x];
+ importance[np] = tile.importance_map[y][x];
+ np++;
+ }
+ }
+ }
+
+ opt_endpts[region] = temp_in = orig_endpts[region];
+ opt_err[region] = orig_err[region];
+
+ float best_err = orig_err[region];
+
+ // make sure we have a valid error for temp_in
+ // we didn't change temp_in, so orig_err[region] is still valid
+ float temp_in_err = orig_err[region];
+
+ // now try to optimize these endpoints
+ float temp_out_err = optimize_one(pixels, importance, np, rotatemode, indexmode, temp_in_err, temp_in, pattern_prec.region_precs[region], temp_out);
+
+ // if we find an improvement, update the best so far and correct the output endpoints and errors
+ if (temp_out_err < best_err)
+ {
+ best_err = temp_out_err;
+ opt_err[region] = temp_out_err;
+ opt_endpts[region] = temp_out;
+ }
+ }
+}
+
+/* optimization algorithm
+ for each pattern
+ convert endpoints using pattern precision
+ assign indices and get initial error
+ compress indices (and possibly reorder endpoints)
+ transform endpoints
+ if transformed endpoints fit pattern
+ get original endpoints back
+ optimize endpoints, get new endpoints, new indices, and new error // new error will almost always be better
+ compress new indices
+ transform new endpoints
+ if new endpoints fit pattern AND if error is improved
+ emit compressed block with new data
+ else
+ emit compressed block with original data // to try to preserve maximum endpoint precision
+*/
+
+static float refine(const Tile &tile, int shapeindex_best, int rotatemode, int indexmode, const FltEndpts endpts[NREGIONS], char *block)
+{
+ float orig_err[NREGIONS], opt_err[NREGIONS], orig_toterr, opt_toterr, expected_opt_err[NREGIONS];
+ IntEndptsRGBA orig_endpts[NREGIONS], opt_endpts[NREGIONS];
+ int orig_indices[NINDEXARRAYS][Tile::TILE_H][Tile::TILE_W], opt_indices[NINDEXARRAYS][Tile::TILE_H][Tile::TILE_W];
+
+ for (int sp = 0; sp < NPATTERNS; ++sp)
+ {
+ quantize_endpts(endpts, pattern_precs[sp], orig_endpts);
+
+ assign_indices(tile, shapeindex_best, rotatemode, indexmode, orig_endpts, pattern_precs[sp], orig_indices, orig_err);
+ swap_indices(shapeindex_best, indexmode, orig_endpts, orig_indices);
+
+ if (patterns[sp].transform_mode)
+ transform_forward(patterns[sp].transform_mode, orig_endpts);
+
+ // apply a heuristic here -- we check if the endpoints fit before we try to optimize them.
+ // the assumption made is that if they don't fit now, they won't fit after optimizing.
+ if (endpts_fit(orig_endpts, patterns[sp]))
+ {
+ if (patterns[sp].transform_mode)
+ transform_inverse(patterns[sp].transform_mode, orig_endpts);
+
+ optimize_endpts(tile, shapeindex_best, rotatemode, indexmode, orig_err, orig_endpts, pattern_precs[sp], expected_opt_err, opt_endpts);
+
+ assign_indices(tile, shapeindex_best, rotatemode, indexmode, opt_endpts, pattern_precs[sp], opt_indices, opt_err);
+ // (nreed) Commented out asserts because they go off all the time...not sure why
+ //for (int i=0; i<NREGIONS; ++i)
+ // nvAssert(expected_opt_err[i] == opt_err[i]);
+ swap_indices(shapeindex_best, indexmode, opt_endpts, opt_indices);
+
+ if (patterns[sp].transform_mode)
+ transform_forward(patterns[sp].transform_mode, opt_endpts);
+
+ orig_toterr = opt_toterr = 0;
+ for (int i=0; i < NREGIONS; ++i) { orig_toterr += orig_err[i]; opt_toterr += opt_err[i]; }
+ if (endpts_fit(opt_endpts, patterns[sp]) && opt_toterr < orig_toterr)
+ {
+ emit_block(opt_endpts, shapeindex_best, patterns[sp], opt_indices, rotatemode, indexmode, block);
+ return opt_toterr;
+ }
+ else
+ {
+ // either it stopped fitting when we optimized it, or there was no improvement
+ // so go back to the unoptimized endpoints which we know will fit
+ if (patterns[sp].transform_mode)
+ transform_forward(patterns[sp].transform_mode, orig_endpts);
+ emit_block(orig_endpts, shapeindex_best, patterns[sp], orig_indices, rotatemode, indexmode, block);
+ return orig_toterr;
+ }
+ }
+ }
+ nvAssert(false); //throw "No candidate found, should never happen (mode avpcl 5).";
+ return FLT_MAX;
+}
+
+static void clamp(Vector4 &v)
+{
+ if (v.x < 0.0f) v.x = 0.0f;
+ if (v.x > 255.0f) v.x = 255.0f;
+ if (v.y < 0.0f) v.y = 0.0f;
+ if (v.y > 255.0f) v.y = 255.0f;
+ if (v.z < 0.0f) v.z = 0.0f;
+ if (v.z > 255.0f) v.z = 255.0f;
+ if (v.w < 0.0f) v.w = 0.0f;
+ if (v.w > 255.0f) v.w = 255.0f;
+}
+
+// compute initial endpoints for the "RGB" portion and the "A" portion.
+// Note these channels may have been rotated.
+static void rough(const Tile &tile, int shapeindex, FltEndpts endpts[NREGIONS])
+{
+ for (int region=0; region<NREGIONS; ++region)
+ {
+ int np = 0;
+ Vector3 colors[Tile::TILE_TOTAL];
+ float alphas[Tile::TILE_TOTAL];
+ Vector4 mean(0,0,0,0);
+
+ for (int y = 0; y < tile.size_y; y++)
+ for (int x = 0; x < tile.size_x; x++)
+ if (REGION(x,y,shapeindex) == region)
+ {
+ colors[np] = tile.data[y][x].xyz();
+ alphas[np] = tile.data[y][x].w;
+ mean += tile.data[y][x];
+ ++np;
+ }
+
+ // handle simple cases
+ if (np == 0)
+ {
+ Vector4 zero(0,0,0,255.0f);
+ endpts[region].A = zero;
+ endpts[region].B = zero;
+ continue;
+ }
+ else if (np == 1)
+ {
+ endpts[region].A = Vector4(colors[0], alphas[0]);
+ endpts[region].B = Vector4(colors[0], alphas[0]);
+ continue;
+ }
+ else if (np == 2)
+ {
+ endpts[region].A = Vector4(colors[0], alphas[0]);
+ endpts[region].B = Vector4(colors[1], alphas[1]);
+ continue;
+ }
+
+ mean /= float(np);
+
+ Vector3 direction = Fit::computePrincipalComponent_EigenSolver(np, colors);
+
+ // project each pixel value along the principal direction
+ float minp = FLT_MAX, maxp = -FLT_MAX;
+ float mina = FLT_MAX, maxa = -FLT_MAX;
+ for (int i = 0; i < np; i++)
+ {
+ float dp = dot(colors[i]-mean.xyz(), direction);
+ if (dp < minp) minp = dp;
+ if (dp > maxp) maxp = dp;
+
+ dp = alphas[i] - mean.w;
+ if (dp < mina) mina = dp;
+ if (dp > maxa) maxa = dp;
+ }
+
+ // choose as endpoints 2 points along the principal direction that span the projections of all of the pixel values
+ endpts[region].A = mean + Vector4(minp*direction, mina);
+ endpts[region].B = mean + Vector4(maxp*direction, maxa);
+
+ // clamp endpoints
+ // the argument for clamping is that the actual endpoints need to be clamped and thus we need to choose the best
+ // shape based on endpoints being clamped
+ clamp(endpts[region].A);
+ clamp(endpts[region].B);
+ }
+}
+
+float AVPCL::compress_mode5(const Tile &t, char *block)
+{
+ FltEndpts endpts[NREGIONS];
+ char tempblock[AVPCL::BLOCKSIZE];
+ float msebest = FLT_MAX;
+ int shape = 0;
+ Tile t1;
+
+ // try all rotations. refine tries the 2 different indexings.
+ for (int r = 0; r < NROTATEMODES && msebest > 0; ++r)
+ {
+ rotate_tile(t, r, t1);
+ rough(t1, shape, endpts);
+// for (int i = 0; i < NINDEXMODES && msebest > 0; ++i)
+ for (int i = 0; i < 1 && msebest > 0; ++i)
+ {
+ float mse = refine(t1, shape, r, i, endpts, tempblock);
+ if (mse < msebest)
+ {
+ memcpy(block, tempblock, sizeof(tempblock));
+ msebest = mse;
+ }
+ }
+ }
+ return msebest;
+}
diff --git a/3rdparty/bgfx/3rdparty/nvtt/bc7/avpcl_mode6.cpp b/3rdparty/bgfx/3rdparty/nvtt/bc7/avpcl_mode6.cpp
new file mode 100644
index 00000000000..38e3a259cf7
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/nvtt/bc7/avpcl_mode6.cpp
@@ -0,0 +1,1055 @@
+/*
+Copyright 2007 nVidia, Inc.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
+
+You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+See the License for the specific language governing permissions and limitations under the License.
+*/
+
+// Thanks to Jacob Munkberg (jacob@cs.lth.se) for the shortcut of using SVD to do the equivalent of principal components analysis
+
+// x1000000 7777.1x2 4bi
+
+#include "bits.h"
+#include "tile.h"
+#include "avpcl.h"
+#include "nvcore/debug.h"
+#include "nvmath/vector.inl"
+#include "nvmath/matrix.inl"
+#include "nvmath/fitting.h"
+#include "avpcl_utils.h"
+#include "endpts.h"
+#include <string.h>
+#include <float.h>
+
+using namespace nv;
+using namespace AVPCL;
+
+#define NLSBMODES 4 // number of different lsb modes per region. since we have two .1 per region, that can have 4 values
+
+#define NINDICES 16
+#define INDEXBITS 4
+#define HIGH_INDEXBIT (1<<(INDEXBITS-1))
+#define DENOM (NINDICES-1)
+#define BIAS (DENOM/2)
+
+#define NSHAPES 1
+
+static int shapes[NSHAPES] =
+{
+ 0x0000,
+};
+
+#define REGION(x,y,shapeindex) ((shapes[shapeindex]&(1<<(15-(x)-4*(y))))!=0)
+
+#define NREGIONS 1
+
+#define NBITSIZES (NREGIONS*2)
+#define ABITINDEX(region) (2*(region)+0)
+#define BBITINDEX(region) (2*(region)+1)
+
+struct ChanBits
+{
+ int nbitsizes[NBITSIZES]; // bitsizes for one channel
+};
+
+struct Pattern
+{
+ ChanBits chan[NCHANNELS_RGBA];// bit patterns used per channel
+ int mode; // associated mode value
+ int modebits; // number of mode bits
+ const char *encoding; // verilog description of encoding for this mode
+};
+
+#define NPATTERNS 1
+
+static Pattern patterns[NPATTERNS] =
+{
+ // red green blue alpha mode mb verilog
+ 7,7, 7,7, 7,7, 7,7, 0x40, 7, "",
+};
+
+struct RegionPrec
+{
+ int endpt_a_prec[NCHANNELS_RGBA];
+ int endpt_b_prec[NCHANNELS_RGBA];
+};
+
+struct PatternPrec
+{
+ RegionPrec region_precs[NREGIONS];
+};
+
+// this is the precision for each channel and region
+// NOTE: this MUST match the corresponding data in "patterns" above -- WARNING: there is NO nvAssert to check this!
+static PatternPrec pattern_precs[NPATTERNS] =
+{
+ 7,7,7,7, 7,7,7,7,
+};
+
+// return # of bits needed to store n. handle signed or unsigned cases properly
+static int nbits(int n, bool issigned)
+{
+ int nb;
+ if (n==0)
+ return 0; // no bits needed for 0, signed or not
+ else if (n > 0)
+ {
+ for (nb=0; n; ++nb, n>>=1) ;
+ return nb + (issigned?1:0);
+ }
+ else
+ {
+ nvAssert (issigned);
+ for (nb=0; n<-1; ++nb, n>>=1) ;
+ return nb + 1;
+ }
+}
+
+/*
+we're using this table to assign lsbs
+abgr >=2 correct
+0000 0 0
+0001 0 0
+0010 0 0
+0011 1 x1
+0100 0 0
+0101 1 x1
+0110 1 x1
+0111 1 1
+1000 0 0
+1001 1 x0
+1010 1 x0
+1011 1 1
+1100 1 x0
+1101 1 1
+1110 1 1
+1111 1 1
+
+we need 8 0's and 8 1's. the x's can be either 0 or 1 as long as you get 8/8.
+I choose to assign the lsbs so that the rgb channels are as good as possible.
+*/
+
+// 8888 ->7777.1, use the "correct" column above to assign the lsb
+static void compress_one(const IntEndptsRGBA& endpts, IntEndptsRGBA_2& compr_endpts)
+{
+ int onescnt;
+
+ onescnt = 0;
+ for (int j=0; j<NCHANNELS_RGBA; ++j)
+ {
+ // ignore the alpha channel in the count
+ onescnt += (j==CHANNEL_A) ? 0 : (endpts.A[j] & 1);
+ compr_endpts.A[j] = endpts.A[j] >> 1;
+ nvAssert (compr_endpts.A[j] < 128);
+ }
+ compr_endpts.a_lsb = onescnt >= 2;
+
+ onescnt = 0;
+ for (int j=0; j<NCHANNELS_RGBA; ++j)
+ {
+ onescnt += (j==CHANNEL_A) ? 0 : (endpts.B[j] & 1);
+ compr_endpts.B[j] = endpts.B[j] >> 1;
+ nvAssert (compr_endpts.B[j] < 128);
+ }
+ compr_endpts.b_lsb = onescnt >= 2;
+}
+
+static void uncompress_one(const IntEndptsRGBA_2& compr_endpts, IntEndptsRGBA& endpts)
+{
+ for (int j=0; j<NCHANNELS_RGBA; ++j)
+ {
+ endpts.A[j] = (compr_endpts.A[j] << 1) | compr_endpts.a_lsb;
+ endpts.B[j] = (compr_endpts.B[j] << 1) | compr_endpts.b_lsb;
+ }
+}
+
+static void uncompress_endpoints(const IntEndptsRGBA_2 compr_endpts[NREGIONS], IntEndptsRGBA endpts[NREGIONS])
+{
+ for (int i=0; i<NREGIONS; ++i)
+ uncompress_one(compr_endpts[i], endpts[i]);
+}
+
+static void compress_endpoints(const IntEndptsRGBA endpts[NREGIONS], IntEndptsRGBA_2 compr_endpts[NREGIONS])
+{
+ for (int i=0; i<NREGIONS; ++i)
+ compress_one(endpts[i], compr_endpts[i]);
+}
+
+
+
+static void quantize_endpts(const FltEndpts endpts[NREGIONS], const PatternPrec &pattern_prec, IntEndptsRGBA_2 q_endpts[NREGIONS])
+{
+ IntEndptsRGBA full_endpts[NREGIONS];
+
+ for (int region = 0; region < NREGIONS; ++region)
+ {
+ full_endpts[region].A[0] = Utils::quantize(endpts[region].A.x, pattern_prec.region_precs[region].endpt_a_prec[0]+1); // +1 since we are in uncompressed space
+ full_endpts[region].A[1] = Utils::quantize(endpts[region].A.y, pattern_prec.region_precs[region].endpt_a_prec[1]+1);
+ full_endpts[region].A[2] = Utils::quantize(endpts[region].A.z, pattern_prec.region_precs[region].endpt_a_prec[2]+1);
+ full_endpts[region].A[3] = Utils::quantize(endpts[region].A.w, pattern_prec.region_precs[region].endpt_a_prec[3]+1);
+
+ full_endpts[region].B[0] = Utils::quantize(endpts[region].B.x, pattern_prec.region_precs[region].endpt_b_prec[0]+1);
+ full_endpts[region].B[1] = Utils::quantize(endpts[region].B.y, pattern_prec.region_precs[region].endpt_b_prec[1]+1);
+ full_endpts[region].B[2] = Utils::quantize(endpts[region].B.z, pattern_prec.region_precs[region].endpt_b_prec[2]+1);
+ full_endpts[region].B[3] = Utils::quantize(endpts[region].B.w, pattern_prec.region_precs[region].endpt_b_prec[3]+1);
+
+ compress_one(full_endpts[region], q_endpts[region]);
+ }
+}
+
+// swap endpoints as needed to ensure that the indices at index_one and index_two have a 0 high-order bit
+// index_two is 0 at x=0 y=0 and 15 at x=3 y=3 so y = (index >> 2) & 3 and x = index & 3
+static void swap_indices(IntEndptsRGBA_2 endpts[NREGIONS], int indices[Tile::TILE_H][Tile::TILE_W], int shapeindex)
+{
+ int index_positions[NREGIONS];
+
+ index_positions[0] = 0; // since WLOG we have the high bit of the shapes at 0
+
+ for (int region = 0; region < NREGIONS; ++region)
+ {
+ int x = index_positions[region] & 3;
+ int y = (index_positions[region] >> 2) & 3;
+ nvAssert(REGION(x,y,shapeindex) == region); // double check the table
+ if (indices[y][x] & HIGH_INDEXBIT)
+ {
+ // high bit is set, swap the endpts and indices for this region
+ int t;
+ for (int i=0; i<NCHANNELS_RGBA; ++i)
+ {
+ t = endpts[region].A[i]; endpts[region].A[i] = endpts[region].B[i]; endpts[region].B[i] = t;
+ }
+ t = endpts[region].a_lsb; endpts[region].a_lsb = endpts[region].b_lsb; endpts[region].b_lsb = t;
+
+ for (int y = 0; y < Tile::TILE_H; y++)
+ for (int x = 0; x < Tile::TILE_W; x++)
+ if (REGION(x,y,shapeindex) == region)
+ indices[y][x] = NINDICES - 1 - indices[y][x];
+ }
+ }
+}
+
+static bool endpts_fit(IntEndptsRGBA_2 endpts[NREGIONS], const Pattern &p)
+{
+ return true;
+}
+
+static void write_header(const IntEndptsRGBA_2 endpts[NREGIONS], int shapeindex, const Pattern &p, Bits &out)
+{
+ out.write(p.mode, p.modebits);
+
+ for (int j=0; j<NCHANNELS_RGBA; ++j)
+ for (int i=0; i<NREGIONS; ++i)
+ {
+ out.write(endpts[i].A[j], p.chan[j].nbitsizes[ABITINDEX(i)]);
+ out.write(endpts[i].B[j], p.chan[j].nbitsizes[BBITINDEX(i)]);
+ }
+
+ for (int i=0; i<NREGIONS; ++i)
+ {
+ out.write(endpts[i].a_lsb, 1);
+ out.write(endpts[i].b_lsb, 1);
+ }
+
+ nvAssert (out.getptr() == 65);
+}
+
+static void read_header(Bits &in, IntEndptsRGBA_2 endpts[NREGIONS], int &shapeindex, Pattern &p, int &pat_index)
+{
+ int mode = AVPCL::getmode(in);
+
+ pat_index = 0;
+
+ nvAssert (pat_index >= 0 && pat_index < NPATTERNS);
+ nvAssert (in.getptr() == patterns[pat_index].modebits);
+
+ p = patterns[pat_index];
+
+ shapeindex = 0; // we don't have any
+
+ for (int j=0; j<NCHANNELS_RGBA; ++j)
+ for (int i=0; i<NREGIONS; ++i)
+ {
+ endpts[i].A[j] = in.read(p.chan[j].nbitsizes[ABITINDEX(i)]);
+ endpts[i].B[j] = in.read(p.chan[j].nbitsizes[BBITINDEX(i)]);
+ }
+
+ for (int i=0; i<NREGIONS; ++i)
+ {
+ endpts[i].a_lsb = in.read(1);
+ endpts[i].b_lsb = in.read(1);
+ }
+
+ nvAssert (in.getptr() == 65);
+}
+
+static void write_indices(const int indices[Tile::TILE_H][Tile::TILE_W], int shapeindex, Bits &out)
+{
+ nvAssert ((indices[0][0] & HIGH_INDEXBIT) == 0);
+
+ // the index we shorten is always index 0
+ for (int i = 0; i < Tile::TILE_TOTAL; ++i)
+ {
+ if (i==0)
+ out.write(indices[i>>2][i&3], INDEXBITS-1); // write i..[2:0]
+ else
+ out.write(indices[i>>2][i&3], INDEXBITS); // write i..[3:0]
+ }
+
+}
+
+static void read_indices(Bits &in, int shapeindex, int indices[Tile::TILE_H][Tile::TILE_W])
+{
+ // the index we shorten is always index 0
+ for (int i = 0; i < Tile::TILE_TOTAL; ++i)
+ {
+ if (i==0)
+ indices[i>>2][i&3] = in.read(INDEXBITS-1); // read i..[1:0]
+ else
+ indices[i>>2][i&3] = in.read(INDEXBITS); // read i..[2:0]
+ }
+}
+
+static void emit_block(const IntEndptsRGBA_2 endpts[NREGIONS], int shapeindex, const Pattern &p, const int indices[Tile::TILE_H][Tile::TILE_W], char *block)
+{
+ Bits out(block, AVPCL::BITSIZE);
+
+ write_header(endpts, shapeindex, p, out);
+
+ write_indices(indices, shapeindex, out);
+
+ nvAssert(out.getptr() == AVPCL::BITSIZE);
+}
+
+static void generate_palette_quantized(const IntEndptsRGBA_2 &endpts_2, const RegionPrec &region_prec, Vector4 palette[NINDICES])
+{
+ IntEndptsRGBA endpts;
+
+ uncompress_one(endpts_2, endpts);
+
+ // scale endpoints
+ int a, b; // really need a IntVec4...
+
+ a = Utils::unquantize(endpts.A[0], region_prec.endpt_a_prec[0]+1); // +1 since we are in uncompressed space
+ b = Utils::unquantize(endpts.B[0], region_prec.endpt_b_prec[0]+1);
+
+ // interpolate
+ for (int i = 0; i < NINDICES; ++i)
+ palette[i].x = float(Utils::lerp(a, b, i, BIAS, DENOM));
+
+ a = Utils::unquantize(endpts.A[1], region_prec.endpt_a_prec[1]+1);
+ b = Utils::unquantize(endpts.B[1], region_prec.endpt_b_prec[1]+1);
+
+ // interpolate
+ for (int i = 0; i < NINDICES; ++i)
+ palette[i].y = float(Utils::lerp(a, b, i, BIAS, DENOM));
+
+ a = Utils::unquantize(endpts.A[2], region_prec.endpt_a_prec[2]+1);
+ b = Utils::unquantize(endpts.B[2], region_prec.endpt_b_prec[2]+1);
+
+ // interpolate
+ for (int i = 0; i < NINDICES; ++i)
+ palette[i].z = float(Utils::lerp(a, b, i, BIAS, DENOM));
+
+ a = Utils::unquantize(endpts.A[3], region_prec.endpt_a_prec[3]+1);
+ b = Utils::unquantize(endpts.B[3], region_prec.endpt_b_prec[3]+1);
+
+ // interpolate
+ for (int i = 0; i < NINDICES; ++i)
+ palette[i].w = float(Utils::lerp(a, b, i, BIAS, DENOM));
+}
+
+void AVPCL::decompress_mode6(const char *block, Tile &t)
+{
+ Bits in(block, AVPCL::BITSIZE);
+
+ Pattern p;
+ IntEndptsRGBA_2 endpts[NREGIONS];
+ int shapeindex, pat_index;
+
+ read_header(in, endpts, shapeindex, p, pat_index);
+
+ Vector4 palette[NREGIONS][NINDICES];
+ for (int r = 0; r < NREGIONS; ++r)
+ generate_palette_quantized(endpts[r], pattern_precs[pat_index].region_precs[r], &palette[r][0]);
+
+ int indices[Tile::TILE_H][Tile::TILE_W];
+
+ read_indices(in, shapeindex, indices);
+
+ nvAssert(in.getptr() == AVPCL::BITSIZE);
+
+ // lookup
+ for (int y = 0; y < Tile::TILE_H; y++)
+ for (int x = 0; x < Tile::TILE_W; x++)
+ t.data[y][x] = palette[REGION(x,y,shapeindex)][indices[y][x]];
+}
+
+// given a collection of colors and quantized endpoints, generate a palette, choose best entries, and return a single toterr
+static float map_colors(const Vector4 colors[], const float importance[], int np, const IntEndptsRGBA_2 &endpts, const RegionPrec &region_prec, float current_err, int indices[Tile::TILE_TOTAL])
+{
+ Vector4 palette[NINDICES];
+ float toterr = 0;
+ Vector4 err;
+
+ generate_palette_quantized(endpts, region_prec, palette);
+
+ for (int i = 0; i < np; ++i)
+ {
+ float err, besterr = FLT_MAX;
+
+ for (int j = 0; j < NINDICES && besterr > 0; ++j)
+ {
+ err = !AVPCL::flag_premult ? Utils::metric4(colors[i], palette[j]) :
+ Utils::metric4premult(colors[i], palette[j]) ;
+
+ if (err > besterr) // error increased, so we're done searching
+ break;
+ if (err < besterr)
+ {
+ besterr = err;
+ indices[i] = j;
+ }
+ }
+ toterr += besterr;
+
+ // check for early exit
+ if (toterr > current_err)
+ {
+ // fill out bogus index values so it's initialized at least
+ for (int k = i; k < np; ++k)
+ indices[k] = -1;
+
+ return FLT_MAX;
+ }
+ }
+ return toterr;
+}
+
+// assign indices given a tile, shape, and quantized endpoints, return toterr for each region
+static void assign_indices(const Tile &tile, int shapeindex, IntEndptsRGBA_2 endpts[NREGIONS], const PatternPrec &pattern_prec,
+ int indices[Tile::TILE_H][Tile::TILE_W], float toterr[NREGIONS])
+{
+ // build list of possibles
+ Vector4 palette[NREGIONS][NINDICES];
+
+ for (int region = 0; region < NREGIONS; ++region)
+ {
+ generate_palette_quantized(endpts[region], pattern_prec.region_precs[region], &palette[region][0]);
+ toterr[region] = 0;
+ }
+
+ Vector4 err;
+
+ for (int y = 0; y < tile.size_y; y++)
+ for (int x = 0; x < tile.size_x; x++)
+ {
+ int region = REGION(x,y,shapeindex);
+ float err, besterr = FLT_MAX;
+
+ for (int i = 0; i < NINDICES && besterr > 0; ++i)
+ {
+ err = !AVPCL::flag_premult ? Utils::metric4(tile.data[y][x], palette[region][i]) :
+ Utils::metric4premult(tile.data[y][x], palette[region][i]) ;
+
+ if (err > besterr) // error increased, so we're done searching
+ break;
+ if (err < besterr)
+ {
+ besterr = err;
+ indices[y][x] = i;
+ }
+ }
+ toterr[region] += besterr;
+ }
+}
+
+// note: indices are valid only if the value returned is less than old_err; otherwise they contain -1's
+// this function returns either old_err or a value smaller (if it was successful in improving the error)
+static float perturb_one(const Vector4 colors[], const float importance[], int np, int ch, const RegionPrec &region_prec, const IntEndptsRGBA_2 &old_endpts, IntEndptsRGBA_2 &new_endpts,
+ float old_err, int do_b, int indices[Tile::TILE_TOTAL])
+{
+ // we have the old endpoints: old_endpts
+ // we have the perturbed endpoints: new_endpts
+ // we have the temporary endpoints: temp_endpts
+
+ IntEndptsRGBA_2 temp_endpts;
+ float min_err = old_err; // start with the best current error
+ int beststep;
+ int temp_indices[Tile::TILE_TOTAL];
+
+ for (int i=0; i<np; ++i)
+ indices[i] = -1;
+
+ // copy real endpoints so we can perturb them
+ temp_endpts = new_endpts = old_endpts;
+
+ int prec = do_b ? region_prec.endpt_b_prec[ch] : region_prec.endpt_a_prec[ch];
+
+ // do a logarithmic search for the best error for this endpoint (which)
+ for (int step = 1 << (prec-1); step; step >>= 1)
+ {
+ bool improved = false;
+ for (int sign = -1; sign <= 1; sign += 2)
+ {
+ if (do_b == 0)
+ {
+ temp_endpts.A[ch] = new_endpts.A[ch] + sign * step;
+ if (temp_endpts.A[ch] < 0 || temp_endpts.A[ch] >= (1 << prec))
+ continue;
+ }
+ else
+ {
+ temp_endpts.B[ch] = new_endpts.B[ch] + sign * step;
+ if (temp_endpts.B[ch] < 0 || temp_endpts.B[ch] >= (1 << prec))
+ continue;
+ }
+
+ float err = map_colors(colors, importance, np, temp_endpts, region_prec, min_err, temp_indices);
+
+ if (err < min_err)
+ {
+ improved = true;
+ min_err = err;
+ beststep = sign * step;
+ for (int i=0; i<np; ++i)
+ indices[i] = temp_indices[i];
+ }
+ }
+ // if this was an improvement, move the endpoint and continue search from there
+ if (improved)
+ {
+ if (do_b == 0)
+ new_endpts.A[ch] += beststep;
+ else
+ new_endpts.B[ch] += beststep;
+ }
+ }
+ return min_err;
+}
+
+// the larger the error the more time it is worth spending on an exhaustive search.
+// perturb the endpoints at least -3 to 3.
+// if err > 5000 perturb endpoints 50% of precision
+// if err > 1000 25%
+// if err > 200 12.5%
+// if err > 40 6.25%
+// for np = 16 -- adjust error thresholds as a function of np
+// always ensure endpoint ordering is preserved (no need to overlap the scan)
+// if orig_err returned from this is less than its input value, then indices[] will contain valid indices
+static float exhaustive(const Vector4 colors[], const float importance[], int np, int ch, const RegionPrec &region_prec, float orig_err, IntEndptsRGBA_2 &opt_endpts, int indices[Tile::TILE_TOTAL])
+{
+ IntEndptsRGBA_2 temp_endpts;
+ float best_err = orig_err;
+ int aprec = region_prec.endpt_a_prec[ch];
+ int bprec = region_prec.endpt_b_prec[ch];
+ int good_indices[Tile::TILE_TOTAL];
+ int temp_indices[Tile::TILE_TOTAL];
+
+ for (int i=0; i<np; ++i)
+ indices[i] = -1;
+
+ float thr_scale = (float)np / (float)Tile::TILE_TOTAL;
+
+ if (orig_err == 0) return orig_err;
+
+ int adelta = 0, bdelta = 0;
+ if (orig_err > 5000.0*thr_scale) { adelta = (1 << aprec)/2; bdelta = (1 << bprec)/2; }
+ else if (orig_err > 1000.0*thr_scale) { adelta = (1 << aprec)/4; bdelta = (1 << bprec)/4; }
+ else if (orig_err > 200.0*thr_scale) { adelta = (1 << aprec)/8; bdelta = (1 << bprec)/8; }
+ else if (orig_err > 40.0*thr_scale) { adelta = (1 << aprec)/16; bdelta = (1 << bprec)/16; }
+ adelta = max(adelta, 3);
+ bdelta = max(bdelta, 3);
+
+#ifdef DISABLE_EXHAUSTIVE
+ adelta = bdelta = 3;
+#endif
+
+ temp_endpts = opt_endpts;
+
+ // ok figure out the range of A and B
+ int alow = max(0, opt_endpts.A[ch] - adelta);
+ int ahigh = min((1<<aprec)-1, opt_endpts.A[ch] + adelta);
+ int blow = max(0, opt_endpts.B[ch] - bdelta);
+ int bhigh = min((1<<bprec)-1, opt_endpts.B[ch] + bdelta);
+
+ // now there's no need to swap the ordering of A and B
+ bool a_le_b = opt_endpts.A[ch] <= opt_endpts.B[ch];
+
+ int amin, bmin;
+
+ if (opt_endpts.A[ch] <= opt_endpts.B[ch])
+ {
+ // keep a <= b
+ for (int a = alow; a <= ahigh; ++a)
+ for (int b = max(a, blow); b < bhigh; ++b)
+ {
+ temp_endpts.A[ch] = a;
+ temp_endpts.B[ch] = b;
+
+ float err = map_colors(colors, importance, np, temp_endpts, region_prec, best_err, temp_indices);
+ if (err < best_err)
+ {
+ amin = a;
+ bmin = b;
+ best_err = err;
+ for (int i=0; i<np; ++i)
+ good_indices[i] = temp_indices[i];
+ }
+ }
+ }
+ else
+ {
+ // keep b <= a
+ for (int b = blow; b < bhigh; ++b)
+ for (int a = max(b, alow); a <= ahigh; ++a)
+ {
+ temp_endpts.A[ch] = a;
+ temp_endpts.B[ch] = b;
+
+ float err = map_colors(colors, importance, np, temp_endpts, region_prec, best_err, temp_indices);
+ if (err < best_err)
+ {
+ amin = a;
+ bmin = b;
+ best_err = err;
+ for (int i=0; i<np; ++i)
+ good_indices[i] = temp_indices[i];
+ }
+ }
+ }
+ if (best_err < orig_err)
+ {
+ opt_endpts.A[ch] = amin;
+ opt_endpts.B[ch] = bmin;
+ orig_err = best_err;
+ // if we actually improved, update the indices
+ for (int i=0; i<np; ++i)
+ indices[i] = good_indices[i];
+ }
+ return best_err;
+}
+
+static float optimize_one(const Vector4 colors[], const float importance[], int np, float orig_err, const IntEndptsRGBA_2 &orig_endpts, const RegionPrec &region_prec, IntEndptsRGBA_2 &opt_endpts)
+{
+ float opt_err = orig_err;
+
+ opt_endpts = orig_endpts;
+
+ /*
+ err0 = perturb(rgb0, delta0)
+ err1 = perturb(rgb1, delta1)
+ if (err0 < err1)
+ if (err0 >= initial_error) break
+ rgb0 += delta0
+ next = 1
+ else
+ if (err1 >= initial_error) break
+ rgb1 += delta1
+ next = 0
+ initial_err = map()
+ for (;;)
+ err = perturb(next ? rgb1:rgb0, delta)
+ if (err >= initial_err) break
+ next? rgb1 : rgb0 += delta
+ initial_err = err
+ */
+ IntEndptsRGBA_2 new_a, new_b;
+ IntEndptsRGBA_2 new_endpt;
+ int do_b;
+ int orig_indices[Tile::TILE_TOTAL];
+ int new_indices[Tile::TILE_TOTAL];
+ int temp_indices0[Tile::TILE_TOTAL];
+ int temp_indices1[Tile::TILE_TOTAL];
+
+ // now optimize each channel separately
+ // for the first error improvement, we save the indices. then, for any later improvement, we compare the indices
+ // if they differ, we restart the loop (which then falls back to looking for a first improvement.)
+ for (int ch = 0; ch < NCHANNELS_RGBA; ++ch)
+ {
+ // figure out which endpoint when perturbed gives the most improvement and start there
+ // if we just alternate, we can easily end up in a local minima
+ float err0 = perturb_one(colors, importance, np, ch, region_prec, opt_endpts, new_a, opt_err, 0, temp_indices0); // perturb endpt A
+ float err1 = perturb_one(colors, importance, np, ch, region_prec, opt_endpts, new_b, opt_err, 1, temp_indices1); // perturb endpt B
+
+ if (err0 < err1)
+ {
+ if (err0 >= opt_err)
+ continue;
+
+ for (int i=0; i<np; ++i)
+ {
+ new_indices[i] = orig_indices[i] = temp_indices0[i];
+ nvAssert (orig_indices[i] != -1);
+ }
+
+ opt_endpts.A[ch] = new_a.A[ch];
+ opt_err = err0;
+ do_b = 1; // do B next
+ }
+ else
+ {
+ if (err1 >= opt_err)
+ continue;
+
+ for (int i=0; i<np; ++i)
+ {
+ new_indices[i] = orig_indices[i] = temp_indices1[i];
+ nvAssert (orig_indices[i] != -1);
+ }
+
+ opt_endpts.B[ch] = new_b.B[ch];
+ opt_err = err1;
+ do_b = 0; // do A next
+ }
+
+ // now alternate endpoints and keep trying until there is no improvement
+ for (;;)
+ {
+ float err = perturb_one(colors, importance, np, ch, region_prec, opt_endpts, new_endpt, opt_err, do_b, temp_indices0);
+ if (err >= opt_err)
+ break;
+
+ for (int i=0; i<np; ++i)
+ {
+ new_indices[i] = temp_indices0[i];
+ nvAssert (new_indices[i] != -1);
+ }
+
+ if (do_b == 0)
+ opt_endpts.A[ch] = new_endpt.A[ch];
+ else
+ opt_endpts.B[ch] = new_endpt.B[ch];
+ opt_err = err;
+ do_b = 1 - do_b; // now move the other endpoint
+ }
+
+ // see if the indices have changed
+ int i;
+ for (i=0; i<np; ++i)
+ if (orig_indices[i] != new_indices[i])
+ break;
+
+ if (i<np)
+ ch = -1; // start over
+ }
+
+ // finally, do a small exhaustive search around what we think is the global minima to be sure
+ // note this is independent of the above search, so we don't care about the indices from the above
+ // we don't care about the above because if they differ, so what? we've already started at ch=0
+ bool first = true;
+ for (int ch = 0; ch < NCHANNELS_RGBA; ++ch)
+ {
+ float new_err = exhaustive(colors, importance, np, ch, region_prec, opt_err, opt_endpts, temp_indices0);
+
+ if (new_err < opt_err)
+ {
+ opt_err = new_err;
+
+ if (first)
+ {
+ for (int i=0; i<np; ++i)
+ {
+ orig_indices[i] = temp_indices0[i];
+ nvAssert (orig_indices[i] != -1);
+ }
+ first = false;
+ }
+ else
+ {
+ // see if the indices have changed
+ int i;
+ for (i=0; i<np; ++i)
+ if (orig_indices[i] != temp_indices0[i])
+ break;
+
+ if (i<np)
+ {
+ ch = -1; // start over
+ first = true;
+ }
+ }
+ }
+ }
+
+ return opt_err;
+}
+
+static void optimize_endpts(const Tile &tile, int shapeindex, const float orig_err[NREGIONS],
+ IntEndptsRGBA_2 orig_endpts[NREGIONS], const PatternPrec &pattern_prec, float opt_err[NREGIONS], IntEndptsRGBA_2 opt_endpts[NREGIONS])
+{
+ Vector4 pixels[Tile::TILE_TOTAL];
+ float importance[Tile::TILE_TOTAL];
+ IntEndptsRGBA_2 temp_in, temp_out;
+ int temp_indices[Tile::TILE_TOTAL];
+
+ for (int region=0; region<NREGIONS; ++region)
+ {
+ // collect the pixels in the region
+ int np = 0;
+
+ for (int y = 0; y < tile.size_y; y++) {
+ for (int x = 0; x < tile.size_x; x++) {
+ if (REGION(x, y, shapeindex) == region) {
+ pixels[np] = tile.data[y][x];
+ importance[np] = tile.importance_map[y][x];
+ np++;
+ }
+ }
+ }
+
+ opt_endpts[region] = temp_in = orig_endpts[region];
+ opt_err[region] = orig_err[region];
+
+ float best_err = orig_err[region];
+
+ // try all lsb modes as we search for better endpoints
+ for (int lsbmode=0; lsbmode<NLSBMODES; ++lsbmode)
+ {
+ temp_in.a_lsb = lsbmode & 1;
+ temp_in.b_lsb = (lsbmode >> 1) & 1;
+
+ // make sure we have a valid error for temp_in
+ // we use FLT_MAX here because we want an accurate temp_in_err, no shortcuts
+ // (mapcolors will compute a mapping but will stop if the error exceeds the value passed in the FLT_MAX position)
+ float temp_in_err = map_colors(pixels, importance, np, temp_in, pattern_prec.region_precs[region], FLT_MAX, temp_indices);
+
+ // now try to optimize these endpoints
+ float temp_out_err = optimize_one(pixels, importance, np, temp_in_err, temp_in, pattern_prec.region_precs[region], temp_out);
+
+ // if we find an improvement, update the best so far and correct the output endpoints and errors
+ if (temp_out_err < best_err)
+ {
+ best_err = temp_out_err;
+ opt_err[region] = temp_out_err;
+ opt_endpts[region] = temp_out;
+ }
+ }
+ }
+}
+
+/* optimization algorithm
+ for each pattern
+ convert endpoints using pattern precision
+ assign indices and get initial error
+ compress indices (and possibly reorder endpoints)
+ transform endpoints
+ if transformed endpoints fit pattern
+ get original endpoints back
+ optimize endpoints, get new endpoints, new indices, and new error // new error will almost always be better
+ compress new indices
+ transform new endpoints
+ if new endpoints fit pattern AND if error is improved
+ emit compressed block with new data
+ else
+ emit compressed block with original data // to try to preserve maximum endpoint precision
+
+ simplify the above given that there is no transform now and that endpoints will always fit
+*/
+
+static float refine(const Tile &tile, int shapeindex_best, const FltEndpts endpts[NREGIONS], char *block)
+{
+ float orig_err[NREGIONS], opt_err[NREGIONS], orig_toterr, opt_toterr, expected_opt_err[NREGIONS];
+ IntEndptsRGBA_2 orig_endpts[NREGIONS], opt_endpts[NREGIONS];
+ int orig_indices[Tile::TILE_H][Tile::TILE_W], opt_indices[Tile::TILE_H][Tile::TILE_W];
+
+ for (int sp = 0; sp < NPATTERNS; ++sp)
+ {
+ quantize_endpts(endpts, pattern_precs[sp], orig_endpts);
+ assign_indices(tile, shapeindex_best, orig_endpts, pattern_precs[sp], orig_indices, orig_err);
+ swap_indices(orig_endpts, orig_indices, shapeindex_best);
+
+ optimize_endpts(tile, shapeindex_best, orig_err, orig_endpts, pattern_precs[sp], expected_opt_err, opt_endpts);
+
+ assign_indices(tile, shapeindex_best, opt_endpts, pattern_precs[sp], opt_indices, opt_err);
+ // (nreed) Commented out asserts because they go off all the time...not sure why
+ //for (int i=0; i<NREGIONS; ++i)
+ // nvAssert(expected_opt_err[i] == opt_err[i]);
+ swap_indices(opt_endpts, opt_indices, shapeindex_best);
+
+ orig_toterr = opt_toterr = 0;
+ for (int i=0; i < NREGIONS; ++i) { orig_toterr += orig_err[i]; opt_toterr += opt_err[i]; }
+ //nvAssert(opt_toterr <= orig_toterr);
+
+ if (opt_toterr < orig_toterr)
+ {
+ emit_block(opt_endpts, shapeindex_best, patterns[sp], opt_indices, block);
+ return opt_toterr;
+ }
+ else
+ {
+ emit_block(orig_endpts, shapeindex_best, patterns[sp], orig_indices, block);
+ return orig_toterr;
+ }
+ }
+ nvAssert(false); //throw "No candidate found, should never happen (mode avpcl 6).";
+ return FLT_MAX;
+}
+
+static void clamp(Vector4 &v)
+{
+ if (v.x < 0.0f) v.x = 0.0f;
+ if (v.x > 255.0f) v.x = 255.0f;
+ if (v.y < 0.0f) v.y = 0.0f;
+ if (v.y > 255.0f) v.y = 255.0f;
+ if (v.z < 0.0f) v.z = 0.0f;
+ if (v.z > 255.0f) v.z = 255.0f;
+ if (v.w < 0.0f) v.w = 0.0f;
+ if (v.w > 255.0f) v.w = 255.0f;
+}
+
+static void generate_palette_unquantized(const FltEndpts endpts[NREGIONS], Vector4 palette[NREGIONS][NINDICES])
+{
+ for (int region = 0; region < NREGIONS; ++region)
+ for (int i = 0; i < NINDICES; ++i)
+ palette[region][i] = Utils::lerp(endpts[region].A, endpts[region].B, i, 0, DENOM);
+}
+
+// generate a palette from unquantized endpoints, then pick best palette color for all pixels in each region, return toterr for all regions combined
+static float map_colors(const Tile &tile, int shapeindex, const FltEndpts endpts[NREGIONS])
+{
+ // build list of possibles
+ Vector4 palette[NREGIONS][NINDICES];
+
+ generate_palette_unquantized(endpts, palette);
+
+ float toterr = 0;
+ Vector4 err;
+
+ for (int y = 0; y < tile.size_y; y++)
+ for (int x = 0; x < tile.size_x; x++)
+ {
+ int region = REGION(x,y,shapeindex);
+ float err, besterr;
+
+ besterr = Utils::metric4(tile.data[y][x], palette[region][0]);
+
+ for (int i = 1; i < NINDICES && besterr > 0; ++i)
+ {
+ err = Utils::metric4(tile.data[y][x], palette[region][i]);
+
+ if (err > besterr) // error increased, so we're done searching. this works for most norms.
+ break;
+ if (err < besterr)
+ besterr = err;
+ }
+ toterr += besterr;
+ }
+ return toterr;
+}
+
+static float rough(const Tile &tile, int shapeindex, FltEndpts endpts[NREGIONS])
+{
+ for (int region=0; region<NREGIONS; ++region)
+ {
+ int np = 0;
+ Vector4 colors[Tile::TILE_TOTAL];
+ Vector4 mean(0,0,0,0);
+
+ for (int y = 0; y < tile.size_y; y++)
+ for (int x = 0; x < tile.size_x; x++)
+ if (REGION(x,y,shapeindex) == region)
+ {
+ colors[np] = tile.data[y][x];
+ mean += tile.data[y][x];
+ ++np;
+ }
+
+ // handle simple cases
+ if (np == 0)
+ {
+ Vector4 zero(0,0,0,255.0f);
+ endpts[region].A = zero;
+ endpts[region].B = zero;
+ continue;
+ }
+ else if (np == 1)
+ {
+ endpts[region].A = colors[0];
+ endpts[region].B = colors[0];
+ continue;
+ }
+ else if (np == 2)
+ {
+ endpts[region].A = colors[0];
+ endpts[region].B = colors[1];
+ continue;
+ }
+
+ mean /= float(np);
+
+ Vector4 direction = Fit::computePrincipalComponent_EigenSolver(np, colors);
+
+ // project each pixel value along the principal direction
+ float minp = FLT_MAX, maxp = -FLT_MAX;
+ for (int i = 0; i < np; i++)
+ {
+ float dp = dot(colors[i]-mean, direction);
+ if (dp < minp) minp = dp;
+ if (dp > maxp) maxp = dp;
+ }
+
+ // choose as endpoints 2 points along the principal direction that span the projections of all of the pixel values
+ endpts[region].A = mean + minp*direction;
+ endpts[region].B = mean + maxp*direction;
+
+ // clamp endpoints
+ // the argument for clamping is that the actual endpoints need to be clamped and thus we need to choose the best
+ // shape based on endpoints being clamped
+ clamp(endpts[region].A);
+ clamp(endpts[region].B);
+ }
+
+ return map_colors(tile, shapeindex, endpts);
+}
+
+static void swap(float *list1, int *list2, int i, int j)
+{
+ float t = list1[i]; list1[i] = list1[j]; list1[j] = t;
+ int t1 = list2[i]; list2[i] = list2[j]; list2[j] = t1;
+}
+
+float AVPCL::compress_mode6(const Tile &t, char *block)
+{
+ // number of rough cases to look at. reasonable values of this are 1, NSHAPES/4, and NSHAPES
+ // NSHAPES/4 gets nearly all the cases; you can increase that a bit (say by 3 or 4) if you really want to squeeze the last bit out
+ const int NITEMS=1;
+
+ // pick the best NITEMS shapes and refine these.
+ struct {
+ FltEndpts endpts[NREGIONS];
+ } all[NSHAPES];
+ float roughmse[NSHAPES];
+ int index[NSHAPES];
+ char tempblock[AVPCL::BLOCKSIZE];
+ float msebest = FLT_MAX;
+
+ for (int i=0; i<NSHAPES; ++i)
+ {
+ roughmse[i] = rough(t, i, &all[i].endpts[0]);
+ index[i] = i;
+ }
+
+ // bubble sort -- only need to bubble up the first NITEMS items
+ for (int i=0; i<NITEMS; ++i)
+ for (int j=i+1; j<NSHAPES; ++j)
+ if (roughmse[i] > roughmse[j])
+ swap(roughmse, index, i, j);
+
+ for (int i=0; i<NITEMS && msebest>0; ++i)
+ {
+ int shape = index[i];
+ float mse = refine(t, shape, &all[shape].endpts[0], tempblock);
+ if (mse < msebest)
+ {
+ memcpy(block, tempblock, sizeof(tempblock));
+ msebest = mse;
+ }
+ }
+ return msebest;
+}
+
diff --git a/3rdparty/bgfx/3rdparty/nvtt/bc7/avpcl_mode7.cpp b/3rdparty/bgfx/3rdparty/nvtt/bc7/avpcl_mode7.cpp
new file mode 100644
index 00000000000..441c4ac8bf2
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/nvtt/bc7/avpcl_mode7.cpp
@@ -0,0 +1,1094 @@
+/*
+Copyright 2007 nVidia, Inc.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
+
+You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+See the License for the specific language governing permissions and limitations under the License.
+*/
+
+// Thanks to Jacob Munkberg (jacob@cs.lth.se) for the shortcut of using SVD to do the equivalent of principal components analysis
+
+// x10000000 5555.1x4 64p 2bi (30b)
+
+#include "bits.h"
+#include "tile.h"
+#include "avpcl.h"
+#include "nvcore/debug.h"
+#include "nvmath/vector.inl"
+#include "nvmath/matrix.inl"
+#include "nvmath/fitting.h"
+#include "avpcl_utils.h"
+#include "endpts.h"
+#include <string.h>
+#include <float.h>
+
+#include "shapes_two.h"
+
+using namespace nv;
+using namespace AVPCL;
+
+#define NLSBMODES 4 // number of different lsb modes per region. since we have two .1 per region, that can have 4 values
+
+#define NINDICES 4
+#define INDEXBITS 2
+#define HIGH_INDEXBIT (1<<(INDEXBITS-1))
+#define DENOM (NINDICES-1)
+#define BIAS (DENOM/2)
+
+// WORK: determine optimal traversal pattern to search for best shape -- what does the error curve look like?
+// i.e. can we search shapes in a particular order so we can see the global error minima easily and
+// stop without having to touch all shapes?
+
+#define POS_TO_X(pos) ((pos)&3)
+#define POS_TO_Y(pos) (((pos)>>2)&3)
+
+#define NBITSIZES (NREGIONS*2)
+#define ABITINDEX(region) (2*(region)+0)
+#define BBITINDEX(region) (2*(region)+1)
+
+struct ChanBits
+{
+ int nbitsizes[NBITSIZES]; // bitsizes for one channel
+};
+
+struct Pattern
+{
+ ChanBits chan[NCHANNELS_RGBA];// bit patterns used per channel
+ int transformed; // if 0, deltas are unsigned and no transform; otherwise, signed and transformed
+ int mode; // associated mode value
+ int modebits; // number of mode bits
+ const char *encoding; // verilog description of encoding for this mode
+};
+
+#define NPATTERNS 1
+#define NREGIONS 2
+
+static Pattern patterns[NPATTERNS] =
+{
+ // red green blue alpha xfm mode mb
+ 5,5,5,5, 5,5,5,5, 5,5,5,5, 5,5,5,5, 0, 0x80, 8, "",
+};
+
+struct RegionPrec
+{
+ int endpt_a_prec[NCHANNELS_RGBA];
+ int endpt_b_prec[NCHANNELS_RGBA];
+};
+
+struct PatternPrec
+{
+ RegionPrec region_precs[NREGIONS];
+};
+
+
+// this is the precision for each channel and region
+// NOTE: this MUST match the corresponding data in "patterns" above -- WARNING: there is NO nvAssert to check this!
+static PatternPrec pattern_precs[NPATTERNS] =
+{
+ 5,5,5,5, 5,5,5,5, 5,5,5,5, 5,5,5,5,
+};
+
+// return # of bits needed to store n. handle signed or unsigned cases properly
+static int nbits(int n, bool issigned)
+{
+ int nb;
+ if (n==0)
+ return 0; // no bits needed for 0, signed or not
+ else if (n > 0)
+ {
+ for (nb=0; n; ++nb, n>>=1) ;
+ return nb + (issigned?1:0);
+ }
+ else
+ {
+ nvAssert (issigned);
+ for (nb=0; n<-1; ++nb, n>>=1) ;
+ return nb + 1;
+ }
+}
+
+static void transform_forward(IntEndptsRGBA_2 ep[NREGIONS])
+{
+ nvUnreachable();
+}
+
+static void transform_inverse(IntEndptsRGBA_2 ep[NREGIONS])
+{
+ nvUnreachable();
+}
+
+/*
+we're using this table to assign lsbs
+abgr >=2 correct
+0000 0 0
+0001 0 0
+0010 0 0
+0011 1 x1
+0100 0 0
+0101 1 x1
+0110 1 x1
+0111 1 1
+1000 0 0
+1001 1 x0
+1010 1 x0
+1011 1 1
+1100 1 x0
+1101 1 1
+1110 1 1
+1111 1 1
+
+we need 8 0's and 8 1's. the x's can be either 0 or 1 as long as you get 8/8.
+I choose to assign the lsbs so that the rgb channels are as good as possible.
+*/
+
+// 6666 ->5555.1, use the "correct" column above to assign the lsb
+static void compress_one(const IntEndptsRGBA& endpts, IntEndptsRGBA_2& compr_endpts)
+{
+ int onescnt;
+
+ onescnt = 0;
+ for (int j=0; j<NCHANNELS_RGBA; ++j)
+ {
+ // ignore the alpha channel in the count
+ onescnt += (j==CHANNEL_A) ? 0 : (endpts.A[j] & 1);
+ compr_endpts.A[j] = endpts.A[j] >> 1;
+ nvAssert (compr_endpts.A[j] < 32);
+ }
+ compr_endpts.a_lsb = onescnt >= 2;
+
+ onescnt = 0;
+ for (int j=0; j<NCHANNELS_RGBA; ++j)
+ {
+ onescnt += (j==CHANNEL_A) ? 0 : (endpts.B[j] & 1);
+ compr_endpts.B[j] = endpts.B[j] >> 1;
+ nvAssert (compr_endpts.B[j] < 32);
+ }
+ compr_endpts.b_lsb = onescnt >= 2;
+}
+
+static void uncompress_one(const IntEndptsRGBA_2& compr_endpts, IntEndptsRGBA& endpts)
+{
+ for (int j=0; j<NCHANNELS_RGBA; ++j)
+ {
+ endpts.A[j] = (compr_endpts.A[j] << 1) | compr_endpts.a_lsb;
+ endpts.B[j] = (compr_endpts.B[j] << 1) | compr_endpts.b_lsb;
+ }
+}
+static void uncompress_endpoints(const IntEndptsRGBA_2 compr_endpts[NREGIONS], IntEndptsRGBA endpts[NREGIONS])
+{
+ for (int i=0; i<NREGIONS; ++i)
+ uncompress_one(compr_endpts[i], endpts[i]);
+}
+
+static void compress_endpoints(const IntEndptsRGBA endpts[NREGIONS], IntEndptsRGBA_2 compr_endpts[NREGIONS])
+{
+ for (int i=0; i<NREGIONS; ++i)
+ compress_one(endpts[i], compr_endpts[i]);
+}
+
+static void quantize_endpts(const FltEndpts endpts[NREGIONS], const PatternPrec &pattern_prec, IntEndptsRGBA_2 q_endpts[NREGIONS])
+{
+ IntEndptsRGBA full_endpts[NREGIONS];
+
+ for (int region = 0; region < NREGIONS; ++region)
+ {
+ full_endpts[region].A[0] = Utils::quantize(endpts[region].A.x, pattern_prec.region_precs[region].endpt_a_prec[0]+1); // +1 since we are in uncompressed space
+ full_endpts[region].A[1] = Utils::quantize(endpts[region].A.y, pattern_prec.region_precs[region].endpt_a_prec[1]+1);
+ full_endpts[region].A[2] = Utils::quantize(endpts[region].A.z, pattern_prec.region_precs[region].endpt_a_prec[2]+1);
+ full_endpts[region].A[3] = Utils::quantize(endpts[region].A.w, pattern_prec.region_precs[region].endpt_a_prec[3]+1);
+
+ full_endpts[region].B[0] = Utils::quantize(endpts[region].B.x, pattern_prec.region_precs[region].endpt_b_prec[0]+1);
+ full_endpts[region].B[1] = Utils::quantize(endpts[region].B.y, pattern_prec.region_precs[region].endpt_b_prec[1]+1);
+ full_endpts[region].B[2] = Utils::quantize(endpts[region].B.z, pattern_prec.region_precs[region].endpt_b_prec[2]+1);
+ full_endpts[region].B[3] = Utils::quantize(endpts[region].B.w, pattern_prec.region_precs[region].endpt_b_prec[3]+1);
+
+ compress_one(full_endpts[region], q_endpts[region]);
+ }
+}
+
+// swap endpoints as needed to ensure that the indices at index_one and index_two have a 0 high-order bit
+// index_two is 0 at x=0 y=0 and 15 at x=3 y=3 so y = (index >> 2) & 3 and x = index & 3
+static void swap_indices(IntEndptsRGBA_2 endpts[NREGIONS], int indices[Tile::TILE_H][Tile::TILE_W], int shapeindex)
+{
+ for (int region = 0; region < NREGIONS; ++region)
+ {
+ int position = SHAPEINDEX_TO_COMPRESSED_INDICES(shapeindex,region);
+
+ int x = POS_TO_X(position);
+ int y = POS_TO_Y(position);
+ nvAssert(REGION(x,y,shapeindex) == region); // double check the table
+ if (indices[y][x] & HIGH_INDEXBIT)
+ {
+ // high bit is set, swap the endpts and indices for this region
+ int t;
+ for (int i=0; i<NCHANNELS_RGBA; ++i)
+ {
+ t = endpts[region].A[i]; endpts[region].A[i] = endpts[region].B[i]; endpts[region].B[i] = t;
+ }
+ t = endpts[region].a_lsb; endpts[region].a_lsb = endpts[region].b_lsb; endpts[region].b_lsb = t;
+
+ for (int y = 0; y < Tile::TILE_H; y++)
+ for (int x = 0; x < Tile::TILE_W; x++)
+ if (REGION(x,y,shapeindex) == region)
+ indices[y][x] = NINDICES - 1 - indices[y][x];
+ }
+ }
+}
+
+static bool endpts_fit(IntEndptsRGBA_2 endpts[NREGIONS], const Pattern &p)
+{
+ return true;
+}
+
+static void write_header(const IntEndptsRGBA_2 endpts[NREGIONS], int shapeindex, const Pattern &p, Bits &out)
+{
+ out.write(p.mode, p.modebits);
+ out.write(shapeindex, SHAPEBITS);
+
+ for (int j=0; j<NCHANNELS_RGBA; ++j)
+ for (int i=0; i<NREGIONS; ++i)
+ {
+ out.write(endpts[i].A[j], p.chan[j].nbitsizes[ABITINDEX(i)]);
+ out.write(endpts[i].B[j], p.chan[j].nbitsizes[BBITINDEX(i)]);
+ }
+
+ for (int i=0; i<NREGIONS; ++i)
+ {
+ out.write(endpts[i].a_lsb, 1);
+ out.write(endpts[i].b_lsb, 1);
+ }
+
+ nvAssert (out.getptr() == 98);
+}
+
+static void read_header(Bits &in, IntEndptsRGBA_2 endpts[NREGIONS], int &shapeindex, Pattern &p, int &pat_index)
+{
+ int mode = AVPCL::getmode(in);
+
+ pat_index = 0;
+ nvAssert (pat_index >= 0 && pat_index < NPATTERNS);
+ nvAssert (in.getptr() == patterns[pat_index].modebits);
+
+ shapeindex = in.read(SHAPEBITS);
+ p = patterns[pat_index];
+
+ for (int j=0; j<NCHANNELS_RGBA; ++j)
+ for (int i=0; i<NREGIONS; ++i)
+ {
+ endpts[i].A[j] = in.read(p.chan[j].nbitsizes[ABITINDEX(i)]);
+ endpts[i].B[j] = in.read(p.chan[j].nbitsizes[BBITINDEX(i)]);
+ }
+
+ for (int i=0; i<NREGIONS; ++i)
+ {
+ endpts[i].a_lsb = in.read(1);
+ endpts[i].b_lsb = in.read(1);
+ }
+
+ nvAssert (in.getptr() == 98);
+}
+
+// WORK PLACEHOLDER -- keep it simple for now
+static void write_indices(const int indices[Tile::TILE_H][Tile::TILE_W], int shapeindex, Bits &out)
+{
+ int positions[NREGIONS];
+
+ for (int r = 0; r < NREGIONS; ++r)
+ positions[r] = SHAPEINDEX_TO_COMPRESSED_INDICES(shapeindex,r);
+
+ for (int pos = 0; pos < Tile::TILE_TOTAL; ++pos)
+ {
+ int x = POS_TO_X(pos);
+ int y = POS_TO_Y(pos);
+
+ bool match = false;
+
+ for (int r = 0; r < NREGIONS; ++r)
+ if (positions[r] == pos) { match = true; break; }
+
+ out.write(indices[y][x], INDEXBITS - (match ? 1 : 0));
+ }
+}
+
+static void read_indices(Bits &in, int shapeindex, int indices[Tile::TILE_H][Tile::TILE_W])
+{
+ int positions[NREGIONS];
+
+ for (int r = 0; r < NREGIONS; ++r)
+ positions[r] = SHAPEINDEX_TO_COMPRESSED_INDICES(shapeindex,r);
+
+ for (int pos = 0; pos < Tile::TILE_TOTAL; ++pos)
+ {
+ int x = POS_TO_X(pos);
+ int y = POS_TO_Y(pos);
+
+ bool match = false;
+
+ for (int r = 0; r < NREGIONS; ++r)
+ if (positions[r] == pos) { match = true; break; }
+
+ indices[y][x]= in.read(INDEXBITS - (match ? 1 : 0));
+ }
+}
+
+static void emit_block(const IntEndptsRGBA_2 endpts[NREGIONS], int shapeindex, const Pattern &p, const int indices[Tile::TILE_H][Tile::TILE_W], char *block)
+{
+ Bits out(block, AVPCL::BITSIZE);
+
+ write_header(endpts, shapeindex, p, out);
+
+ write_indices(indices, shapeindex, out);
+
+ nvAssert(out.getptr() == AVPCL::BITSIZE);
+}
+
+static void generate_palette_quantized(const IntEndptsRGBA_2 &endpts_2, const RegionPrec &region_prec, Vector4 palette[NINDICES])
+{
+ IntEndptsRGBA endpts;
+
+ uncompress_one(endpts_2, endpts);
+
+ // scale endpoints
+ int a, b; // really need a IntVec4...
+
+ a = Utils::unquantize(endpts.A[0], region_prec.endpt_a_prec[0]+1); // +1 since we are in uncompressed space
+ b = Utils::unquantize(endpts.B[0], region_prec.endpt_b_prec[0]+1);
+
+ // interpolate
+ for (int i = 0; i < NINDICES; ++i)
+ palette[i].x = float(Utils::lerp(a, b, i, BIAS, DENOM));
+
+ a = Utils::unquantize(endpts.A[1], region_prec.endpt_a_prec[1]+1);
+ b = Utils::unquantize(endpts.B[1], region_prec.endpt_b_prec[1]+1);
+
+ // interpolate
+ for (int i = 0; i < NINDICES; ++i)
+ palette[i].y = float(Utils::lerp(a, b, i, BIAS, DENOM));
+
+ a = Utils::unquantize(endpts.A[2], region_prec.endpt_a_prec[2]+1);
+ b = Utils::unquantize(endpts.B[2], region_prec.endpt_b_prec[2]+1);
+
+ // interpolate
+ for (int i = 0; i < NINDICES; ++i)
+ palette[i].z = float(Utils::lerp(a, b, i, BIAS, DENOM));
+
+ a = Utils::unquantize(endpts.A[3], region_prec.endpt_a_prec[3]+1);
+ b = Utils::unquantize(endpts.B[3], region_prec.endpt_b_prec[3]+1);
+
+ // interpolate
+ for (int i = 0; i < NINDICES; ++i)
+ palette[i].w = float(Utils::lerp(a, b, i, BIAS, DENOM));
+}
+
+// sign extend but only if it was transformed
+static void sign_extend(Pattern &p, IntEndptsRGBA_2 endpts[NREGIONS])
+{
+ nvUnreachable();
+}
+
+void AVPCL::decompress_mode7(const char *block, Tile &t)
+{
+ Bits in(block, AVPCL::BITSIZE);
+
+ Pattern p;
+ IntEndptsRGBA_2 endpts[NREGIONS];
+ int shapeindex, pat_index;
+
+ read_header(in, endpts, shapeindex, p, pat_index);
+
+ if (p.transformed)
+ {
+ sign_extend(p, endpts);
+ transform_inverse(endpts);
+ }
+
+ Vector4 palette[NREGIONS][NINDICES];
+ for (int r = 0; r < NREGIONS; ++r)
+ generate_palette_quantized(endpts[r], pattern_precs[pat_index].region_precs[r], &palette[r][0]);
+
+ int indices[Tile::TILE_H][Tile::TILE_W];
+
+ read_indices(in, shapeindex, indices);
+
+ nvAssert(in.getptr() == AVPCL::BITSIZE);
+
+ // lookup
+ for (int y = 0; y < Tile::TILE_H; y++)
+ for (int x = 0; x < Tile::TILE_W; x++)
+ t.data[y][x] = palette[REGION(x,y,shapeindex)][indices[y][x]];
+}
+
+// given a collection of colors and quantized endpoints, generate a palette, choose best entries, and return a single toterr
+static float map_colors(const Vector4 colors[], const float importance[], int np, const IntEndptsRGBA_2 &endpts, const RegionPrec &region_prec, float current_err, int indices[Tile::TILE_TOTAL])
+{
+ Vector4 palette[NINDICES];
+ float toterr = 0;
+ Vector4 err;
+
+ generate_palette_quantized(endpts, region_prec, palette);
+
+ for (int i = 0; i < np; ++i)
+ {
+ float err, besterr = FLT_MAX;
+
+ for (int j = 0; j < NINDICES && besterr > 0; ++j)
+ {
+ err = !AVPCL::flag_premult ? Utils::metric4(colors[i], palette[j]) :
+ Utils::metric4premult(colors[i], palette[j]) ;
+
+ if (err > besterr) // error increased, so we're done searching
+ break;
+ if (err < besterr)
+ {
+ besterr = err;
+ indices[i] = j;
+ }
+ }
+ toterr += besterr;
+
+ // check for early exit
+ if (toterr > current_err)
+ {
+ // fill out bogus index values so it's initialized at least
+ for (int k = i; k < np; ++k)
+ indices[k] = -1;
+
+ return FLT_MAX;
+ }
+ }
+ return toterr;
+}
+
+// assign indices given a tile, shape, and quantized endpoints, return toterr for each region
+static void assign_indices(const Tile &tile, int shapeindex, IntEndptsRGBA_2 endpts[NREGIONS], const PatternPrec &pattern_prec,
+ int indices[Tile::TILE_H][Tile::TILE_W], float toterr[NREGIONS])
+{
+ // build list of possibles
+ Vector4 palette[NREGIONS][NINDICES];
+
+ for (int region = 0; region < NREGIONS; ++region)
+ {
+ generate_palette_quantized(endpts[region], pattern_prec.region_precs[region], &palette[region][0]);
+ toterr[region] = 0;
+ }
+
+ Vector4 err;
+
+ for (int y = 0; y < tile.size_y; y++)
+ for (int x = 0; x < tile.size_x; x++)
+ {
+ int region = REGION(x,y,shapeindex);
+ float err, besterr = FLT_MAX;
+
+ for (int i = 0; i < NINDICES && besterr > 0; ++i)
+ {
+ err = !AVPCL::flag_premult ? Utils::metric4(tile.data[y][x], palette[region][i]) :
+ Utils::metric4premult(tile.data[y][x], palette[region][i]) ;
+
+ if (err > besterr) // error increased, so we're done searching
+ break;
+ if (err < besterr)
+ {
+ besterr = err;
+ indices[y][x] = i;
+ }
+ }
+ toterr[region] += besterr;
+ }
+}
+
+// note: indices are valid only if the value returned is less than old_err; otherwise they contain -1's
+// this function returns either old_err or a value smaller (if it was successful in improving the error)
+static float perturb_one(const Vector4 colors[], const float importance[], int np, int ch, const RegionPrec &region_prec, const IntEndptsRGBA_2 &old_endpts, IntEndptsRGBA_2 &new_endpts,
+ float old_err, int do_b, int indices[Tile::TILE_TOTAL])
+{
+ // we have the old endpoints: old_endpts
+ // we have the perturbed endpoints: new_endpts
+ // we have the temporary endpoints: temp_endpts
+
+ IntEndptsRGBA_2 temp_endpts;
+ float min_err = old_err; // start with the best current error
+ int beststep;
+ int temp_indices[Tile::TILE_TOTAL];
+
+ for (int i=0; i<np; ++i)
+ indices[i] = -1;
+
+ // copy real endpoints so we can perturb them
+ temp_endpts = new_endpts = old_endpts;
+
+ int prec = do_b ? region_prec.endpt_b_prec[ch] : region_prec.endpt_a_prec[ch];
+
+ // do a logarithmic search for the best error for this endpoint (which)
+ for (int step = 1 << (prec-1); step; step >>= 1)
+ {
+ bool improved = false;
+ for (int sign = -1; sign <= 1; sign += 2)
+ {
+ if (do_b == 0)
+ {
+ temp_endpts.A[ch] = new_endpts.A[ch] + sign * step;
+ if (temp_endpts.A[ch] < 0 || temp_endpts.A[ch] >= (1 << prec))
+ continue;
+ }
+ else
+ {
+ temp_endpts.B[ch] = new_endpts.B[ch] + sign * step;
+ if (temp_endpts.B[ch] < 0 || temp_endpts.B[ch] >= (1 << prec))
+ continue;
+ }
+
+ float err = map_colors(colors, importance, np, temp_endpts, region_prec, min_err, temp_indices);
+
+ if (err < min_err)
+ {
+ improved = true;
+ min_err = err;
+ beststep = sign * step;
+ for (int i=0; i<np; ++i)
+ indices[i] = temp_indices[i];
+ }
+ }
+ // if this was an improvement, move the endpoint and continue search from there
+ if (improved)
+ {
+ if (do_b == 0)
+ new_endpts.A[ch] += beststep;
+ else
+ new_endpts.B[ch] += beststep;
+ }
+ }
+ return min_err;
+}
+
+// the larger the error the more time it is worth spending on an exhaustive search.
+// perturb the endpoints at least -3 to 3.
+// if err > 5000 perturb endpoints 50% of precision
+// if err > 1000 25%
+// if err > 200 12.5%
+// if err > 40 6.25%
+// for np = 16 -- adjust error thresholds as a function of np
+// always ensure endpoint ordering is preserved (no need to overlap the scan)
+// if orig_err returned from this is less than its input value, then indices[] will contain valid indices
+static float exhaustive(const Vector4 colors[], const float importance[], int np, int ch, const RegionPrec &region_prec, float orig_err, IntEndptsRGBA_2 &opt_endpts, int indices[Tile::TILE_TOTAL])
+{
+ IntEndptsRGBA_2 temp_endpts;
+ float best_err = orig_err;
+ int aprec = region_prec.endpt_a_prec[ch];
+ int bprec = region_prec.endpt_b_prec[ch];
+ int good_indices[Tile::TILE_TOTAL];
+ int temp_indices[Tile::TILE_TOTAL];
+
+ for (int i=0; i<np; ++i)
+ indices[i] = -1;
+
+ float thr_scale = (float)np / (float)Tile::TILE_TOTAL;
+
+ if (orig_err == 0) return orig_err;
+
+ int adelta = 0, bdelta = 0;
+ if (orig_err > 5000.0*thr_scale) { adelta = (1 << aprec)/2; bdelta = (1 << bprec)/2; }
+ else if (orig_err > 1000.0*thr_scale) { adelta = (1 << aprec)/4; bdelta = (1 << bprec)/4; }
+ else if (orig_err > 200.0*thr_scale) { adelta = (1 << aprec)/8; bdelta = (1 << bprec)/8; }
+ else if (orig_err > 40.0*thr_scale) { adelta = (1 << aprec)/16; bdelta = (1 << bprec)/16; }
+ adelta = max(adelta, 3);
+ bdelta = max(bdelta, 3);
+
+#ifdef DISABLE_EXHAUSTIVE
+ adelta = bdelta = 3;
+#endif
+
+ temp_endpts = opt_endpts;
+
+ // ok figure out the range of A and B
+ int alow = max(0, opt_endpts.A[ch] - adelta);
+ int ahigh = min((1<<aprec)-1, opt_endpts.A[ch] + adelta);
+ int blow = max(0, opt_endpts.B[ch] - bdelta);
+ int bhigh = min((1<<bprec)-1, opt_endpts.B[ch] + bdelta);
+
+ // now there's no need to swap the ordering of A and B
+ bool a_le_b = opt_endpts.A[ch] <= opt_endpts.B[ch];
+
+ int amin, bmin;
+
+ if (opt_endpts.A[ch] <= opt_endpts.B[ch])
+ {
+ // keep a <= b
+ for (int a = alow; a <= ahigh; ++a)
+ for (int b = max(a, blow); b < bhigh; ++b)
+ {
+ temp_endpts.A[ch] = a;
+ temp_endpts.B[ch] = b;
+
+ float err = map_colors(colors, importance, np, temp_endpts, region_prec, best_err, temp_indices);
+ if (err < best_err)
+ {
+ amin = a;
+ bmin = b;
+ best_err = err;
+ for (int i=0; i<np; ++i)
+ good_indices[i] = temp_indices[i];
+ }
+ }
+ }
+ else
+ {
+ // keep b <= a
+ for (int b = blow; b < bhigh; ++b)
+ for (int a = max(b, alow); a <= ahigh; ++a)
+ {
+ temp_endpts.A[ch] = a;
+ temp_endpts.B[ch] = b;
+
+ float err = map_colors(colors, importance, np, temp_endpts, region_prec, best_err, temp_indices);
+ if (err < best_err)
+ {
+ amin = a;
+ bmin = b;
+ best_err = err;
+ for (int i=0; i<np; ++i)
+ good_indices[i] = temp_indices[i];
+ }
+ }
+ }
+ if (best_err < orig_err)
+ {
+ opt_endpts.A[ch] = amin;
+ opt_endpts.B[ch] = bmin;
+ orig_err = best_err;
+ // if we actually improved, update the indices
+ for (int i=0; i<np; ++i)
+ indices[i] = good_indices[i];
+ }
+ return best_err;
+}
+
+static float optimize_one(const Vector4 colors[], const float importance[], int np, float orig_err, const IntEndptsRGBA_2 &orig_endpts, const RegionPrec &region_prec, IntEndptsRGBA_2 &opt_endpts)
+{
+ float opt_err = orig_err;
+
+ opt_endpts = orig_endpts;
+
+ /*
+ err0 = perturb(rgb0, delta0)
+ err1 = perturb(rgb1, delta1)
+ if (err0 < err1)
+ if (err0 >= initial_error) break
+ rgb0 += delta0
+ next = 1
+ else
+ if (err1 >= initial_error) break
+ rgb1 += delta1
+ next = 0
+ initial_err = map()
+ for (;;)
+ err = perturb(next ? rgb1:rgb0, delta)
+ if (err >= initial_err) break
+ next? rgb1 : rgb0 += delta
+ initial_err = err
+ */
+ IntEndptsRGBA_2 new_a, new_b;
+ IntEndptsRGBA_2 new_endpt;
+ int do_b;
+ int orig_indices[Tile::TILE_TOTAL];
+ int new_indices[Tile::TILE_TOTAL];
+ int temp_indices0[Tile::TILE_TOTAL];
+ int temp_indices1[Tile::TILE_TOTAL];
+
+ // now optimize each channel separately
+ // for the first error improvement, we save the indices. then, for any later improvement, we compare the indices
+ // if they differ, we restart the loop (which then falls back to looking for a first improvement.)
+ for (int ch = 0; ch < NCHANNELS_RGBA; ++ch)
+ {
+ // figure out which endpoint when perturbed gives the most improvement and start there
+ // if we just alternate, we can easily end up in a local minima
+ float err0 = perturb_one(colors, importance, np, ch, region_prec, opt_endpts, new_a, opt_err, 0, temp_indices0); // perturb endpt A
+ float err1 = perturb_one(colors, importance, np, ch, region_prec, opt_endpts, new_b, opt_err, 1, temp_indices1); // perturb endpt B
+
+ if (err0 < err1)
+ {
+ if (err0 >= opt_err)
+ continue;
+
+ for (int i=0; i<np; ++i)
+ {
+ new_indices[i] = orig_indices[i] = temp_indices0[i];
+ nvAssert (orig_indices[i] != -1);
+ }
+
+ opt_endpts.A[ch] = new_a.A[ch];
+ opt_err = err0;
+ do_b = 1; // do B next
+ }
+ else
+ {
+ if (err1 >= opt_err)
+ continue;
+
+ for (int i=0; i<np; ++i)
+ {
+ new_indices[i] = orig_indices[i] = temp_indices1[i];
+ nvAssert (orig_indices[i] != -1);
+ }
+
+ opt_endpts.B[ch] = new_b.B[ch];
+ opt_err = err1;
+ do_b = 0; // do A next
+ }
+
+ // now alternate endpoints and keep trying until there is no improvement
+ for (;;)
+ {
+ float err = perturb_one(colors, importance, np, ch, region_prec, opt_endpts, new_endpt, opt_err, do_b, temp_indices0);
+ if (err >= opt_err)
+ break;
+
+ for (int i=0; i<np; ++i)
+ {
+ new_indices[i] = temp_indices0[i];
+ nvAssert (new_indices[i] != -1);
+ }
+
+ if (do_b == 0)
+ opt_endpts.A[ch] = new_endpt.A[ch];
+ else
+ opt_endpts.B[ch] = new_endpt.B[ch];
+ opt_err = err;
+ do_b = 1 - do_b; // now move the other endpoint
+ }
+
+ // see if the indices have changed
+ int i;
+ for (i=0; i<np; ++i)
+ if (orig_indices[i] != new_indices[i])
+ break;
+
+ if (i<np)
+ ch = -1; // start over
+ }
+
+ // finally, do a small exhaustive search around what we think is the global minima to be sure
+ // note this is independent of the above search, so we don't care about the indices from the above
+ // we don't care about the above because if they differ, so what? we've already started at ch=0
+ bool first = true;
+ for (int ch = 0; ch < NCHANNELS_RGBA; ++ch)
+ {
+ float new_err = exhaustive(colors, importance, np, ch, region_prec, opt_err, opt_endpts, temp_indices0);
+
+ if (new_err < opt_err)
+ {
+ opt_err = new_err;
+
+ if (first)
+ {
+ for (int i=0; i<np; ++i)
+ {
+ orig_indices[i] = temp_indices0[i];
+ nvAssert (orig_indices[i] != -1);
+ }
+ first = false;
+ }
+ else
+ {
+ // see if the indices have changed
+ int i;
+ for (i=0; i<np; ++i)
+ if (orig_indices[i] != temp_indices0[i])
+ break;
+
+ if (i<np)
+ {
+ ch = -1; // start over
+ first = true;
+ }
+ }
+ }
+ }
+
+ return opt_err;
+}
+
+static void optimize_endpts(const Tile &tile, int shapeindex, const float orig_err[NREGIONS],
+ IntEndptsRGBA_2 orig_endpts[NREGIONS], const PatternPrec &pattern_prec, float opt_err[NREGIONS], IntEndptsRGBA_2 opt_endpts[NREGIONS])
+{
+ Vector4 pixels[Tile::TILE_TOTAL];
+ float importance[Tile::TILE_TOTAL];
+ IntEndptsRGBA_2 temp_in, temp_out;
+ int temp_indices[Tile::TILE_TOTAL];
+
+ for (int region=0; region<NREGIONS; ++region)
+ {
+ // collect the pixels in the region
+ int np = 0;
+
+ for (int y = 0; y < tile.size_y; y++) {
+ for (int x = 0; x < tile.size_x; x++) {
+ if (REGION(x, y, shapeindex) == region) {
+ pixels[np] = tile.data[y][x];
+ importance[np] = tile.importance_map[y][x];
+ np++;
+ }
+ }
+ }
+
+ opt_endpts[region] = temp_in = orig_endpts[region];
+ opt_err[region] = orig_err[region];
+
+ float best_err = orig_err[region];
+
+ // try all lsb modes as we search for better endpoints
+ for (int lsbmode=0; lsbmode<NLSBMODES; ++lsbmode)
+ {
+ temp_in.a_lsb = lsbmode & 1;
+ temp_in.b_lsb = (lsbmode >> 1) & 1;
+
+ // make sure we have a valid error for temp_in
+ // we use FLT_MAX here because we want an accurate temp_in_err, no shortcuts
+ // (mapcolors will compute a mapping but will stop if the error exceeds the value passed in the FLT_MAX position)
+ float temp_in_err = map_colors(pixels, importance, np, temp_in, pattern_prec.region_precs[region], FLT_MAX, temp_indices);
+
+ // now try to optimize these endpoints
+ float temp_out_err = optimize_one(pixels, importance, np, temp_in_err, temp_in, pattern_prec.region_precs[region], temp_out);
+
+ // if we find an improvement, update the best so far and correct the output endpoints and errors
+ if (temp_out_err < best_err)
+ {
+ best_err = temp_out_err;
+ opt_err[region] = temp_out_err;
+ opt_endpts[region] = temp_out;
+ }
+ }
+ }
+}
+
+/* optimization algorithm
+ for each pattern
+ convert endpoints using pattern precision
+ assign indices and get initial error
+ compress indices (and possibly reorder endpoints)
+ transform endpoints
+ if transformed endpoints fit pattern
+ get original endpoints back
+ optimize endpoints, get new endpoints, new indices, and new error // new error will almost always be better
+ compress new indices
+ transform new endpoints
+ if new endpoints fit pattern AND if error is improved
+ emit compressed block with new data
+ else
+ emit compressed block with original data // to try to preserve maximum endpoint precision
+*/
+
+static float refine(const Tile &tile, int shapeindex_best, const FltEndpts endpts[NREGIONS], char *block)
+{
+ float orig_err[NREGIONS], opt_err[NREGIONS], orig_toterr, opt_toterr, expected_opt_err[NREGIONS];
+ IntEndptsRGBA_2 orig_endpts[NREGIONS], opt_endpts[NREGIONS];
+ int orig_indices[Tile::TILE_H][Tile::TILE_W], opt_indices[Tile::TILE_H][Tile::TILE_W];
+
+ for (int sp = 0; sp < NPATTERNS; ++sp)
+ {
+ quantize_endpts(endpts, pattern_precs[sp], orig_endpts);
+ assign_indices(tile, shapeindex_best, orig_endpts, pattern_precs[sp], orig_indices, orig_err);
+ swap_indices(orig_endpts, orig_indices, shapeindex_best);
+ if (patterns[sp].transformed)
+ transform_forward(orig_endpts);
+ // apply a heuristic here -- we check if the endpoints fit before we try to optimize them.
+ // the assumption made is that if they don't fit now, they won't fit after optimizing.
+ if (endpts_fit(orig_endpts, patterns[sp]))
+ {
+ if (patterns[sp].transformed)
+ transform_inverse(orig_endpts);
+ optimize_endpts(tile, shapeindex_best, orig_err, orig_endpts, pattern_precs[sp], expected_opt_err, opt_endpts);
+ assign_indices(tile, shapeindex_best, opt_endpts, pattern_precs[sp], opt_indices, opt_err);
+ // (nreed) Commented out asserts because they go off all the time...not sure why
+ //for (int i=0; i<NREGIONS; ++i)
+ // nvAssert(expected_opt_err[i] == opt_err[i]);
+ swap_indices(opt_endpts, opt_indices, shapeindex_best);
+ if (patterns[sp].transformed)
+ transform_forward(opt_endpts);
+ orig_toterr = opt_toterr = 0;
+ for (int i=0; i < NREGIONS; ++i) { orig_toterr += orig_err[i]; opt_toterr += opt_err[i]; }
+ if (endpts_fit(opt_endpts, patterns[sp]) && opt_toterr < orig_toterr)
+ {
+ emit_block(opt_endpts, shapeindex_best, patterns[sp], opt_indices, block);
+ return opt_toterr;
+ }
+ else
+ {
+ // either it stopped fitting when we optimized it, or there was no improvement
+ // so go back to the unoptimized endpoints which we know will fit
+ if (patterns[sp].transformed)
+ transform_forward(orig_endpts);
+ emit_block(orig_endpts, shapeindex_best, patterns[sp], orig_indices, block);
+ return orig_toterr;
+ }
+ }
+ }
+ nvAssert(false); //throw "No candidate found, should never happen (mode avpcl 7).";
+ return FLT_MAX;
+}
+
+static void clamp(Vector4 &v)
+{
+ if (v.x < 0.0f) v.x = 0.0f;
+ if (v.x > 255.0f) v.x = 255.0f;
+ if (v.y < 0.0f) v.y = 0.0f;
+ if (v.y > 255.0f) v.y = 255.0f;
+ if (v.z < 0.0f) v.z = 0.0f;
+ if (v.z > 255.0f) v.z = 255.0f;
+ if (v.w < 0.0f) v.w = 0.0f;
+ if (v.w > 255.0f) v.w = 255.0f;
+}
+
+static void generate_palette_unquantized(const FltEndpts endpts[NREGIONS], Vector4 palette[NREGIONS][NINDICES])
+{
+ for (int region = 0; region < NREGIONS; ++region)
+ for (int i = 0; i < NINDICES; ++i)
+ palette[region][i] = Utils::lerp(endpts[region].A, endpts[region].B, i, 0, DENOM);
+}
+
+// generate a palette from unquantized endpoints, then pick best palette color for all pixels in each region, return toterr for all regions combined
+static float map_colors(const Tile &tile, int shapeindex, const FltEndpts endpts[NREGIONS])
+{
+ // build list of possibles
+ Vector4 palette[NREGIONS][NINDICES];
+
+ generate_palette_unquantized(endpts, palette);
+
+ float toterr = 0;
+ Vector4 err;
+
+ for (int y = 0; y < tile.size_y; y++)
+ for (int x = 0; x < tile.size_x; x++)
+ {
+ int region = REGION(x,y,shapeindex);
+ float err, besterr = FLT_MAX;
+
+ for (int i = 0; i < NINDICES && besterr > 0; ++i)
+ {
+ err = Utils::metric4(tile.data[y][x], palette[region][i]);
+
+ if (err > besterr) // error increased, so we're done searching. this works for most norms.
+ break;
+ if (err < besterr)
+ besterr = err;
+ }
+ toterr += besterr;
+ }
+ return toterr;
+}
+
+static float rough(const Tile &tile, int shapeindex, FltEndpts endpts[NREGIONS])
+{
+ for (int region=0; region<NREGIONS; ++region)
+ {
+ int np = 0;
+ Vector4 colors[Tile::TILE_TOTAL];
+ Vector4 mean(0,0,0,0);
+
+ for (int y = 0; y < tile.size_y; y++)
+ for (int x = 0; x < tile.size_x; x++)
+ if (REGION(x,y,shapeindex) == region)
+ {
+ colors[np] = tile.data[y][x];
+ mean += tile.data[y][x];
+ ++np;
+ }
+
+ // handle simple cases
+ if (np == 0)
+ {
+ Vector4 zero(0,0,0,255.0f);
+ endpts[region].A = zero;
+ endpts[region].B = zero;
+ continue;
+ }
+ else if (np == 1)
+ {
+ endpts[region].A = colors[0];
+ endpts[region].B = colors[0];
+ continue;
+ }
+ else if (np == 2)
+ {
+ endpts[region].A = colors[0];
+ endpts[region].B = colors[1];
+ continue;
+ }
+
+ mean /= float(np);
+
+ Vector4 direction = Fit::computePrincipalComponent_EigenSolver(np, colors);
+
+ // project each pixel value along the principal direction
+ float minp = FLT_MAX, maxp = -FLT_MAX;
+ for (int i = 0; i < np; i++)
+ {
+ float dp = dot(colors[i]-mean, direction);
+ if (dp < minp) minp = dp;
+ if (dp > maxp) maxp = dp;
+ }
+
+ // choose as endpoints 2 points along the principal direction that span the projections of all of the pixel values
+ endpts[region].A = mean + minp*direction;
+ endpts[region].B = mean + maxp*direction;
+
+ // clamp endpoints
+ // the argument for clamping is that the actual endpoints need to be clamped and thus we need to choose the best
+ // shape based on endpoints being clamped
+ clamp(endpts[region].A);
+ clamp(endpts[region].B);
+ }
+
+ return map_colors(tile, shapeindex, endpts);
+}
+
+static void swap(float *list1, int *list2, int i, int j)
+{
+ float t = list1[i]; list1[i] = list1[j]; list1[j] = t;
+ int t1 = list2[i]; list2[i] = list2[j]; list2[j] = t1;
+}
+
+float AVPCL::compress_mode7(const Tile &t, char *block)
+{
+ // number of rough cases to look at. reasonable values of this are 1, NSHAPES/4, and NSHAPES
+ // NSHAPES/4 gets nearly all the cases; you can increase that a bit (say by 3 or 4) if you really want to squeeze the last bit out
+ const int NITEMS=NSHAPES/4;
+
+ // pick the best NITEMS shapes and refine these.
+ struct {
+ FltEndpts endpts[NREGIONS];
+ } all[NSHAPES];
+ float roughmse[NSHAPES];
+ int index[NSHAPES];
+ char tempblock[AVPCL::BLOCKSIZE];
+ float msebest = FLT_MAX;
+
+ for (int i=0; i<NSHAPES; ++i)
+ {
+ roughmse[i] = rough(t, i, &all[i].endpts[0]);
+ index[i] = i;
+ }
+
+ // bubble sort -- only need to bubble up the first NITEMS items
+ for (int i=0; i<NITEMS; ++i)
+ for (int j=i+1; j<NSHAPES; ++j)
+ if (roughmse[i] > roughmse[j])
+ swap(roughmse, index, i, j);
+
+ for (int i=0; i<NITEMS && msebest>0; ++i)
+ {
+ int shape = index[i];
+ float mse = refine(t, shape, &all[shape].endpts[0], tempblock);
+ if (mse < msebest)
+ {
+ memcpy(block, tempblock, sizeof(tempblock));
+ msebest = mse;
+ }
+ }
+ return msebest;
+}
+
diff --git a/3rdparty/bgfx/3rdparty/nvtt/bc7/avpcl_utils.cpp b/3rdparty/bgfx/3rdparty/nvtt/bc7/avpcl_utils.cpp
new file mode 100644
index 00000000000..af99711083f
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/nvtt/bc7/avpcl_utils.cpp
@@ -0,0 +1,389 @@
+/*
+Copyright 2007 nVidia, Inc.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
+
+You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+See the License for the specific language governing permissions and limitations under the License.
+*/
+
+// Utility and common routines
+
+#include "avpcl_utils.h"
+#include "avpcl.h"
+#include "nvmath/vector.inl"
+#include <math.h>
+
+using namespace nv;
+using namespace AVPCL;
+
+static const int denom7_weights[] = {0, 9, 18, 27, 37, 46, 55, 64}; // divided by 64
+static const int denom15_weights[] = {0, 4, 9, 13, 17, 21, 26, 30, 34, 38, 43, 47, 51, 55, 60, 64}; // divided by 64
+
+int Utils::lerp(int a, int b, int i, int bias, int denom)
+{
+#ifdef USE_ZOH_INTERP
+ nvAssert (denom == 3 || denom == 7 || denom == 15);
+ nvAssert (i >= 0 && i <= denom);
+ nvAssert (bias >= 0 && bias <= denom/2);
+ nvAssert (a >= 0 && b >= 0);
+
+ int round = 0;
+#ifdef USE_ZOH_INTERP_ROUNDED
+ round = 32;
+#endif
+
+ switch (denom)
+ {
+ case 3: denom *= 5; i *= 5; // fall through to case 15
+ case 15:return (a*denom15_weights[denom-i] + b*denom15_weights[i] + round) >> 6;
+ case 7: return (a*denom7_weights[denom-i] + b*denom7_weights[i] + round) >> 6;
+ default: nvUnreachable(); return 0;
+ }
+#else
+ return (((a)*((denom)-i)+(b)*(i)+(bias))/(denom)); // simple exact interpolation
+#endif
+}
+
+Vector4 Utils::lerp(Vector4::Arg a, Vector4::Arg b, int i, int bias, int denom)
+{
+#ifdef USE_ZOH_INTERP
+ nvAssert (denom == 3 || denom == 7 || denom == 15);
+ nvAssert (i >= 0 && i <= denom);
+ nvAssert (bias >= 0 && bias <= denom/2);
+// nvAssert (a >= 0 && b >= 0);
+
+ // no need to bias these as this is an exact division
+
+ switch (denom)
+ {
+ case 3: denom *= 5; i *= 5; // fall through to case 15
+ case 15:return (a*float(denom15_weights[denom-i]) + b*float(denom15_weights[i])) / 64.0f;
+ case 7: return (a*float(denom7_weights[denom-i]) + b*float(denom7_weights[i])) / 64.0f;
+ default: nvUnreachable(); return Vector4(0);
+ }
+#else
+ return (((a)*((denom)-i)+(b)*(i)+(bias))/(denom)); // simple exact interpolation
+#endif
+}
+
+
+int Utils::unquantize(int q, int prec)
+{
+ int unq;
+
+ nvAssert (prec > 3); // we only want to do one replicate
+
+#ifdef USE_ZOH_QUANT
+ if (prec >= 8)
+ unq = q;
+ else if (q == 0)
+ unq = 0;
+ else if (q == ((1<<prec)-1))
+ unq = 255;
+ else
+ unq = (q * 256 + 128) >> prec;
+#else
+ // avpcl unquantizer -- bit replicate
+ unq = (q << (8-prec)) | (q >> (2*prec-8));
+#endif
+
+ return unq;
+}
+
+// quantize to the best value -- i.e., minimize unquantize error
+int Utils::quantize(float value, int prec)
+{
+ int q, unq;
+
+ nvAssert (prec > 3); // we only want to do one replicate
+
+ unq = (int)floor(value + 0.5f);
+ nvAssert (unq <= 255);
+
+#ifdef USE_ZOH_QUANT
+ q = (prec >= 8) ? unq : (unq << prec) / 256;
+#else
+ // avpcl quantizer -- scale properly for best possible bit-replicated result
+ q = (unq * ((1<<prec)-1) + 127)/255;
+#endif
+
+ nvAssert (q >= 0 && q < (1 << prec));
+
+ return q;
+}
+
+float Utils::metric4(Vector4::Arg a, Vector4::Arg b)
+{
+ Vector4 err = a - b;
+
+ // if nonuniform, select weights and weigh away
+ if (AVPCL::flag_nonuniform || AVPCL::flag_nonuniform_ati)
+ {
+ float rwt, gwt, bwt;
+ if (AVPCL::flag_nonuniform)
+ {
+ rwt = 0.299f; gwt = 0.587f; bwt = 0.114f;
+ }
+ else /*if (AVPCL::flag_nonuniform_ati)*/
+ {
+ rwt = 0.3086f; gwt = 0.6094f; bwt = 0.0820f;
+ }
+
+ // weigh the components
+ err.x *= rwt;
+ err.y *= gwt;
+ err.z *= bwt;
+ }
+
+ return lengthSquared(err);
+}
+
+// WORK -- implement rotatemode for the below -- that changes where the rwt, gwt, and bwt's go.
+float Utils::metric3(Vector3::Arg a, Vector3::Arg b, int rotatemode)
+{
+ Vector3 err = a - b;
+
+ // if nonuniform, select weights and weigh away
+ if (AVPCL::flag_nonuniform || AVPCL::flag_nonuniform_ati)
+ {
+ float rwt, gwt, bwt;
+ if (AVPCL::flag_nonuniform)
+ {
+ rwt = 0.299f; gwt = 0.587f; bwt = 0.114f;
+ }
+ else if (AVPCL::flag_nonuniform_ati)
+ {
+ rwt = 0.3086f; gwt = 0.6094f; bwt = 0.0820f;
+ }
+
+ // adjust weights based on rotatemode
+ switch(rotatemode)
+ {
+ case ROTATEMODE_RGBA_RGBA: break;
+ case ROTATEMODE_RGBA_AGBR: rwt = 1.0f; break;
+ case ROTATEMODE_RGBA_RABG: gwt = 1.0f; break;
+ case ROTATEMODE_RGBA_RGAB: bwt = 1.0f; break;
+ default: nvUnreachable();
+ }
+
+ // weigh the components
+ err.x *= rwt;
+ err.y *= gwt;
+ err.z *= bwt;
+ }
+
+ return lengthSquared(err);
+}
+
+float Utils::metric1(const float a, const float b, int rotatemode)
+{
+ float err = a - b;
+
+ // if nonuniform, select weights and weigh away
+ if (AVPCL::flag_nonuniform || AVPCL::flag_nonuniform_ati)
+ {
+ float rwt, gwt, bwt, awt;
+ if (AVPCL::flag_nonuniform)
+ {
+ rwt = 0.299f; gwt = 0.587f; bwt = 0.114f;
+ }
+ else if (AVPCL::flag_nonuniform_ati)
+ {
+ rwt = 0.3086f; gwt = 0.6094f; bwt = 0.0820f;
+ }
+
+ // adjust weights based on rotatemode
+ switch(rotatemode)
+ {
+ case ROTATEMODE_RGBA_RGBA: awt = 1.0f; break;
+ case ROTATEMODE_RGBA_AGBR: awt = rwt; break;
+ case ROTATEMODE_RGBA_RABG: awt = gwt; break;
+ case ROTATEMODE_RGBA_RGAB: awt = bwt; break;
+ default: nvUnreachable();
+ }
+
+ // weigh the components
+ err *= awt;
+ }
+
+ return err * err;
+}
+
+float Utils::premult(float r, float a)
+{
+ // note that the args are really integers stored in floats
+ int R = int(r), A = int(a);
+
+ nvAssert ((R==r) && (A==a));
+
+ return float((R*A + 127)/255);
+}
+
+static void premult4(Vector4& rgba)
+{
+ rgba.x = Utils::premult(rgba.x, rgba.w);
+ rgba.y = Utils::premult(rgba.y, rgba.w);
+ rgba.z = Utils::premult(rgba.z, rgba.w);
+}
+
+static void premult3(Vector3& rgb, float a)
+{
+ rgb.x = Utils::premult(rgb.x, a);
+ rgb.y = Utils::premult(rgb.y, a);
+ rgb.z = Utils::premult(rgb.z, a);
+}
+
+float Utils::metric4premult(Vector4::Arg a, Vector4::Arg b)
+{
+ Vector4 pma = a, pmb = b;
+
+ premult4(pma);
+ premult4(pmb);
+
+ Vector4 err = pma - pmb;
+
+ // if nonuniform, select weights and weigh away
+ if (AVPCL::flag_nonuniform || AVPCL::flag_nonuniform_ati)
+ {
+ float rwt, gwt, bwt;
+ if (AVPCL::flag_nonuniform)
+ {
+ rwt = 0.299f; gwt = 0.587f; bwt = 0.114f;
+ }
+ else /*if (AVPCL::flag_nonuniform_ati)*/
+ {
+ rwt = 0.3086f; gwt = 0.6094f; bwt = 0.0820f;
+ }
+
+ // weigh the components
+ err.x *= rwt;
+ err.y *= gwt;
+ err.z *= bwt;
+ }
+
+ return lengthSquared(err);
+}
+
+float Utils::metric3premult_alphaout(Vector3::Arg rgb0, float a0, Vector3::Arg rgb1, float a1)
+{
+ Vector3 pma = rgb0, pmb = rgb1;
+
+ premult3(pma, a0);
+ premult3(pmb, a1);
+
+ Vector3 err = pma - pmb;
+
+ // if nonuniform, select weights and weigh away
+ if (AVPCL::flag_nonuniform || AVPCL::flag_nonuniform_ati)
+ {
+ float rwt, gwt, bwt;
+ if (AVPCL::flag_nonuniform)
+ {
+ rwt = 0.299f; gwt = 0.587f; bwt = 0.114f;
+ }
+ else /*if (AVPCL::flag_nonuniform_ati)*/
+ {
+ rwt = 0.3086f; gwt = 0.6094f; bwt = 0.0820f;
+ }
+
+ // weigh the components
+ err.x *= rwt;
+ err.y *= gwt;
+ err.z *= bwt;
+ }
+
+ return lengthSquared(err);
+}
+
+float Utils::metric3premult_alphain(Vector3::Arg rgb0, Vector3::Arg rgb1, int rotatemode)
+{
+ Vector3 pma = rgb0, pmb = rgb1;
+
+ switch(rotatemode)
+ {
+ case ROTATEMODE_RGBA_RGBA:
+ // this function isn't supposed to be called for this rotatemode
+ nvUnreachable();
+ break;
+ case ROTATEMODE_RGBA_AGBR:
+ pma.y = premult(pma.y, pma.x);
+ pma.z = premult(pma.z, pma.x);
+ pmb.y = premult(pmb.y, pmb.x);
+ pmb.z = premult(pmb.z, pmb.x);
+ break;
+ case ROTATEMODE_RGBA_RABG:
+ pma.x = premult(pma.x, pma.y);
+ pma.z = premult(pma.z, pma.y);
+ pmb.x = premult(pmb.x, pmb.y);
+ pmb.z = premult(pmb.z, pmb.y);
+ break;
+ case ROTATEMODE_RGBA_RGAB:
+ pma.x = premult(pma.x, pma.z);
+ pma.y = premult(pma.y, pma.z);
+ pmb.x = premult(pmb.x, pmb.z);
+ pmb.y = premult(pmb.y, pmb.z);
+ break;
+ default: nvUnreachable();
+ }
+
+ Vector3 err = pma - pmb;
+
+ // if nonuniform, select weights and weigh away
+ if (AVPCL::flag_nonuniform || AVPCL::flag_nonuniform_ati)
+ {
+ float rwt, gwt, bwt;
+ if (AVPCL::flag_nonuniform)
+ {
+ rwt = 0.299f; gwt = 0.587f; bwt = 0.114f;
+ }
+ else /*if (AVPCL::flag_nonuniform_ati)*/
+ {
+ rwt = 0.3086f; gwt = 0.6094f; bwt = 0.0820f;
+ }
+
+ // weigh the components
+ err.x *= rwt;
+ err.y *= gwt;
+ err.z *= bwt;
+ }
+
+ return lengthSquared(err);
+}
+
+float Utils::metric1premult(float rgb0, float a0, float rgb1, float a1, int rotatemode)
+{
+ float err = premult(rgb0, a0) - premult(rgb1, a1);
+
+ // if nonuniform, select weights and weigh away
+ if (AVPCL::flag_nonuniform || AVPCL::flag_nonuniform_ati)
+ {
+ float rwt, gwt, bwt, awt;
+ if (AVPCL::flag_nonuniform)
+ {
+ rwt = 0.299f; gwt = 0.587f; bwt = 0.114f;
+ }
+ else if (AVPCL::flag_nonuniform_ati)
+ {
+ rwt = 0.3086f; gwt = 0.6094f; bwt = 0.0820f;
+ }
+
+ // adjust weights based on rotatemode
+ switch(rotatemode)
+ {
+ case ROTATEMODE_RGBA_RGBA: awt = 1.0f; break;
+ case ROTATEMODE_RGBA_AGBR: awt = rwt; break;
+ case ROTATEMODE_RGBA_RABG: awt = gwt; break;
+ case ROTATEMODE_RGBA_RGAB: awt = bwt; break;
+ default: nvUnreachable();
+ }
+
+ // weigh the components
+ err *= awt;
+ }
+
+ return err * err;
+}
diff --git a/3rdparty/bgfx/3rdparty/nvtt/bc7/avpcl_utils.h b/3rdparty/bgfx/3rdparty/nvtt/bc7/avpcl_utils.h
new file mode 100644
index 00000000000..cb546d54719
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/nvtt/bc7/avpcl_utils.h
@@ -0,0 +1,61 @@
+/*
+Copyright 2007 nVidia, Inc.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
+
+You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+See the License for the specific language governing permissions and limitations under the License.
+*/
+
+// utility class holding common routines
+#ifndef _AVPCL_UTILS_H
+#define _AVPCL_UTILS_H
+
+#include "nvmath/vector.h"
+
+namespace AVPCL {
+
+inline int SIGN_EXTEND(int x, int nb) { return ((((x)&(1<<((nb)-1)))?((~0)<<(nb)):0)|(x)); }
+
+static const int INDEXMODE_BITS = 1; // 2 different index modes
+static const int NINDEXMODES = (1<<(INDEXMODE_BITS));
+static const int INDEXMODE_ALPHA_IS_3BITS = 0;
+static const int INDEXMODE_ALPHA_IS_2BITS = 1;
+
+static const int ROTATEMODE_BITS = 2; // 4 different rotate modes
+static const int NROTATEMODES = (1<<(ROTATEMODE_BITS));
+static const int ROTATEMODE_RGBA_RGBA = 0;
+static const int ROTATEMODE_RGBA_AGBR = 1;
+static const int ROTATEMODE_RGBA_RABG = 2;
+static const int ROTATEMODE_RGBA_RGAB = 3;
+
+class Utils
+{
+public:
+ // error metrics
+ static float metric4(nv::Vector4::Arg a, nv::Vector4::Arg b);
+ static float metric3(nv::Vector3::Arg a, nv::Vector3::Arg b, int rotatemode);
+ static float metric1(float a, float b, int rotatemode);
+
+ static float metric4premult(nv::Vector4::Arg rgba0, nv::Vector4::Arg rgba1);
+ static float metric3premult_alphaout(nv::Vector3::Arg rgb0, float a0, nv::Vector3::Arg rgb1, float a1);
+ static float metric3premult_alphain(nv::Vector3::Arg rgb0, nv::Vector3::Arg rgb1, int rotatemode);
+ static float metric1premult(float rgb0, float a0, float rgb1, float a1, int rotatemode);
+
+ static float premult(float r, float a);
+
+ // quantization and unquantization
+ static int unquantize(int q, int prec);
+ static int quantize(float value, int prec);
+
+ // lerping
+ static int lerp(int a, int b, int i, int bias, int denom);
+ static nv::Vector4 lerp(nv::Vector4::Arg a, nv::Vector4::Arg b, int i, int bias, int denom);
+};
+
+}
+
+#endif
diff --git a/3rdparty/bgfx/3rdparty/nvtt/bc7/bits.h b/3rdparty/bgfx/3rdparty/nvtt/bc7/bits.h
new file mode 100644
index 00000000000..782f6559730
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/nvtt/bc7/bits.h
@@ -0,0 +1,76 @@
+/*
+Copyright 2007 nVidia, Inc.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
+
+You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+See the License for the specific language governing permissions and limitations under the License.
+*/
+
+#ifndef _AVPCL_BITS_H
+#define _AVPCL_BITS_H
+
+// read/write a bitstream
+
+#include "nvcore/debug.h"
+
+namespace AVPCL {
+
+class Bits
+{
+public:
+
+ Bits(char *data, int maxdatabits) { nvAssert (data && maxdatabits > 0); bptr = bend = 0; bits = data; maxbits = maxdatabits; readonly = 0;}
+ Bits(const char *data, int availdatabits) { nvAssert (data && availdatabits > 0); bptr = 0; bend = availdatabits; cbits = data; maxbits = availdatabits; readonly = 1;}
+
+ void write(int value, int nbits) {
+ nvAssert (nbits >= 0 && nbits < 32);
+ nvAssert (sizeof(int)>= 4);
+ for (int i=0; i<nbits; ++i)
+ writeone(value>>i);
+ }
+ int read(int nbits) {
+ nvAssert (nbits >= 0 && nbits < 32);
+ nvAssert (sizeof(int)>= 4);
+ int out = 0;
+ for (int i=0; i<nbits; ++i)
+ out |= readone() << i;
+ return out;
+ }
+ int getptr() { return bptr; }
+ void setptr(int ptr) { nvAssert (ptr >= 0 && ptr < maxbits); bptr = ptr; }
+ int getsize() { return bend; }
+
+private:
+ int bptr; // next bit to read
+ int bend; // last written bit + 1
+ char *bits; // ptr to user bit stream
+ const char *cbits; // ptr to const user bit stream
+ int maxbits; // max size of user bit stream
+ char readonly; // 1 if this is a read-only stream
+
+ int readone() {
+ nvAssert (bptr < bend);
+ if (bptr >= bend) return 0;
+ int bit = (readonly ? cbits[bptr>>3] : bits[bptr>>3]) & (1 << (bptr & 7));
+ ++bptr;
+ return bit != 0;
+ }
+ void writeone(int bit) {
+ nvAssert (!readonly); // "Writing a read-only bit stream"
+ nvAssert (bptr < maxbits);
+ if (bptr >= maxbits) return;
+ if (bit&1)
+ bits[bptr>>3] |= 1 << (bptr & 7);
+ else
+ bits[bptr>>3] &= ~(1 << (bptr & 7));
+ if (bptr++ >= bend) bend = bptr;
+ }
+};
+
+}
+
+#endif
diff --git a/3rdparty/bgfx/3rdparty/nvtt/bc7/endpts.h b/3rdparty/bgfx/3rdparty/nvtt/bc7/endpts.h
new file mode 100644
index 00000000000..4f42a166fbd
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/nvtt/bc7/endpts.h
@@ -0,0 +1,81 @@
+/*
+Copyright 2007 nVidia, Inc.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
+
+You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+See the License for the specific language governing permissions and limitations under the License.
+*/
+
+#ifndef _AVPCL_ENDPTS_H
+#define _AVPCL_ENDPTS_H
+
+// endpoint definitions and routines to search through endpoint space
+
+#include "nvmath/vector.h"
+
+namespace AVPCL {
+
+static const int NCHANNELS_RGB = 3;
+static const int NCHANNELS_RGBA = 4;
+static const int CHANNEL_R = 0;
+static const int CHANNEL_G = 1;
+static const int CHANNEL_B = 2;
+static const int CHANNEL_A = 3;
+
+struct FltEndpts
+{
+ nv::Vector4 A;
+ nv::Vector4 B;
+};
+
+struct IntEndptsRGB
+{
+ int A[NCHANNELS_RGB];
+ int B[NCHANNELS_RGB];
+};
+
+struct IntEndptsRGB_1
+{
+ int A[NCHANNELS_RGB];
+ int B[NCHANNELS_RGB];
+ int lsb; // shared lsb for A and B
+};
+
+struct IntEndptsRGB_2
+{
+ int A[NCHANNELS_RGB];
+ int B[NCHANNELS_RGB];
+ int a_lsb; // lsb for A
+ int b_lsb; // lsb for B
+};
+
+
+struct IntEndptsRGBA
+{
+ int A[NCHANNELS_RGBA];
+ int B[NCHANNELS_RGBA];
+};
+
+struct IntEndptsRGBA_2
+{
+ int A[NCHANNELS_RGBA];
+ int B[NCHANNELS_RGBA];
+ int a_lsb; // lsb for A
+ int b_lsb; // lsb for B
+};
+
+struct IntEndptsRGBA_2a
+{
+ int A[NCHANNELS_RGBA];
+ int B[NCHANNELS_RGBA];
+ int a_lsb; // lsb for RGB channels of A
+ int b_lsb; // lsb for RGB channels of A
+};
+
+}
+
+#endif
diff --git a/3rdparty/bgfx/3rdparty/nvtt/bc7/shapes_three.h b/3rdparty/bgfx/3rdparty/nvtt/bc7/shapes_three.h
new file mode 100644
index 00000000000..dc95ba5f407
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/nvtt/bc7/shapes_three.h
@@ -0,0 +1,132 @@
+/*
+Copyright 2007 nVidia, Inc.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
+
+You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+See the License for the specific language governing permissions and limitations under the License.
+*/
+
+#ifndef _AVPCL_SHAPES_THREE_H
+#define _AVPCL_SHAPES_THREE_H
+
+// shapes for 3 regions
+
+#define NREGIONS 3
+#define NSHAPES 64
+#define SHAPEBITS 6
+
+static int shapes[NSHAPES*16] =
+{
+0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 2, 2,
+0, 0, 1, 1, 0, 0, 1, 1, 2, 0, 0, 1, 0, 0, 2, 2,
+0, 2, 2, 1, 2, 2, 1, 1, 2, 2, 1, 1, 0, 0, 1, 1,
+2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 1, 1, 0, 1, 1, 1,
+
+0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 2, 2, 0, 0, 1, 1,
+0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 2, 2, 0, 0, 1, 1,
+1, 1, 2, 2, 0, 0, 2, 2, 1, 1, 1, 1, 2, 2, 1, 1,
+1, 1, 2, 2, 0, 0, 2, 2, 1, 1, 1, 1, 2, 2, 1, 1,
+
+0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2,
+0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 2,
+1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 0, 0, 1, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 1, 2,
+
+0, 1, 1, 2, 0, 1, 2, 2, 0, 0, 1, 1, 0, 0, 1, 1,
+0, 1, 1, 2, 0, 1, 2, 2, 0, 1, 1, 2, 2, 0, 0, 1,
+0, 1, 1, 2, 0, 1, 2, 2, 1, 1, 2, 2, 2, 2, 0, 0,
+0, 1, 1, 2, 0, 1, 2, 2, 1, 2, 2, 2, 2, 2, 2, 0,
+
+0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 2, 2,
+0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 2, 2, 0, 0, 2, 2,
+0, 1, 1, 2, 2, 0, 0, 1, 1, 1, 2, 2, 0, 0, 2, 2,
+1, 1, 2, 2, 2, 2, 0, 0, 1, 1, 2, 2, 1, 1, 1, 1,
+
+0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0,
+0, 2, 2, 2, 2, 2, 2, 1, 0, 1, 2, 2, 2, 2, 1, 0,
+0, 2, 2, 2, 2, 2, 2, 1, 0, 1, 2, 2, 2, 2, 1, 0,
+
+0, 1, 2, 2, 0, 0, 1, 2, 0, 1, 1, 0, 0, 0, 0, 0,
+0, 1, 2, 2, 0, 0, 1, 2, 1, 2, 2, 1, 0, 1, 1, 0,
+0, 0, 1, 1, 1, 1, 2, 2, 1, 2, 2, 1, 1, 2, 2, 1,
+0, 0, 0, 0, 2, 2, 2, 2, 0, 1, 1, 0, 1, 2, 2, 1,
+
+0, 0, 2, 2, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0,
+1, 1, 0, 2, 0, 1, 1, 0, 0, 1, 2, 2, 2, 0, 0, 0,
+1, 1, 0, 2, 2, 0, 0, 2, 0, 1, 2, 2, 2, 2, 1, 1,
+0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 1, 1, 2, 2, 2, 1,
+
+0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 1, 1, 0, 1, 2, 0,
+0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 1, 2, 0, 1, 2, 0,
+1, 1, 2, 2, 0, 0, 1, 2, 0, 0, 2, 2, 0, 1, 2, 0,
+1, 2, 2, 2, 0, 0, 1, 1, 0, 2, 2, 2, 0, 1, 2, 0,
+
+0, 0, 0, 0, 0, 1, 2, 0, 0, 1, 2, 0, 0, 0, 1, 1,
+1, 1, 1, 1, 1, 2, 0, 1, 2, 0, 1, 2, 2, 2, 0, 0,
+2, 2, 2, 2, 2, 0, 1, 2, 1, 2, 0, 1, 1, 1, 2, 2,
+0, 0, 0, 0, 0, 1, 2, 0, 0, 1, 2, 0, 0, 0, 1, 1,
+
+0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 2, 2,
+1, 1, 2, 2, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 2, 2,
+2, 2, 0, 0, 2, 2, 2, 2, 2, 1, 2, 1, 0, 0, 2, 2,
+0, 0, 1, 1, 2, 2, 2, 2, 2, 1, 2, 1, 1, 1, 2, 2,
+
+0, 0, 2, 2, 0, 2, 2, 0, 0, 1, 0, 1, 0, 0, 0, 0,
+0, 0, 1, 1, 1, 2, 2, 1, 2, 2, 2, 2, 2, 1, 2, 1,
+0, 0, 2, 2, 0, 2, 2, 0, 2, 2, 2, 2, 2, 1, 2, 1,
+0, 0, 1, 1, 1, 2, 2, 1, 0, 1, 0, 1, 2, 1, 2, 1,
+
+0, 1, 0, 1, 0, 2, 2, 2, 0, 0, 0, 2, 0, 0, 0, 0,
+0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 2,
+0, 1, 0, 1, 0, 2, 2, 2, 0, 0, 0, 2, 2, 1, 1, 2,
+2, 2, 2, 2, 0, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 2,
+
+0, 2, 2, 2, 0, 0, 0, 2, 0, 1, 1, 0, 0, 0, 0, 0,
+0, 1, 1, 1, 1, 1, 1, 2, 0, 1, 1, 0, 0, 0, 0, 0,
+0, 1, 1, 1, 1, 1, 1, 2, 0, 1, 1, 0, 2, 1, 1, 2,
+0, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 2,
+
+0, 1, 1, 0, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 0, 0,
+0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 2, 2, 0, 0, 0, 0,
+2, 2, 2, 2, 0, 0, 1, 1, 1, 1, 2, 2, 0, 0, 0, 0,
+2, 2, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 2, 1, 1, 2,
+
+0, 0, 0, 2, 0, 2, 2, 2, 0, 1, 0, 1, 0, 1, 1, 1,
+0, 0, 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 0, 1, 1,
+0, 0, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 1,
+0, 0, 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0,
+};
+
+#define REGION(x,y,si) shapes[((si)&3)*4+((si)>>2)*64+(x)+(y)*16]
+
+static int shapeindex_to_compressed_indices[NSHAPES*3] =
+{
+ 0, 3,15, 0, 3, 8, 0,15, 8, 0,15, 3,
+ 0, 8,15, 0, 3,15, 0,15, 3, 0,15, 8,
+ 0, 8,15, 0, 8,15, 0, 6,15, 0, 6,15,
+ 0, 6,15, 0, 5,15, 0, 3,15, 0, 3, 8,
+
+ 0, 3,15, 0, 3, 8, 0, 8,15, 0,15, 3,
+ 0, 3,15, 0, 3, 8, 0, 6,15, 0,10, 8,
+ 0, 5, 3, 0, 8,15, 0, 8, 6, 0, 6,10,
+ 0, 8,15, 0, 5,15, 0,15,10, 0,15, 8,
+
+ 0, 8,15, 0,15, 3, 0, 3,15, 0, 5,10,
+ 0, 6,10, 0,10, 8, 0, 8, 9, 0,15,10,
+ 0,15, 6, 0, 3,15, 0,15, 8, 0, 5,15,
+ 0,15, 3, 0,15, 6, 0,15, 6, 0,15, 8,
+
+ 0, 3,15, 0,15, 3, 0, 5,15, 0, 5,15,
+ 0, 5,15, 0, 8,15, 0, 5,15, 0,10,15,
+ 0, 5,15, 0,10,15, 0, 8,15, 0,13,15,
+ 0,15, 3, 0,12,15, 0, 3,15, 0, 3, 8
+
+};
+#define SHAPEINDEX_TO_COMPRESSED_INDICES(si,region) shapeindex_to_compressed_indices[(si)*3+(region)]
+
+#endif
diff --git a/3rdparty/bgfx/3rdparty/nvtt/bc7/shapes_two.h b/3rdparty/bgfx/3rdparty/nvtt/bc7/shapes_two.h
new file mode 100644
index 00000000000..853d557a6f0
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/nvtt/bc7/shapes_two.h
@@ -0,0 +1,133 @@
+/*
+Copyright 2007 nVidia, Inc.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
+
+You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+See the License for the specific language governing permissions and limitations under the License.
+*/
+
+#ifndef _AVPCL_SHAPES_TWO_H
+#define _AVPCL_SHAPES_TWO_H
+
+// shapes for two regions
+
+#define NREGIONS 2
+#define NSHAPES 64
+#define SHAPEBITS 6
+
+static int shapes[NSHAPES*16] =
+{
+0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1,
+0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1,
+0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1,
+0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1,
+
+0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0,
+0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1,
+0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1,
+0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1,
+
+0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0,
+0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1,
+0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1,
+
+0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+
+0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1,
+1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1,
+1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1,
+1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0,
+
+0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,
+0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
+0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1,
+0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1,
+
+0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1,
+0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0,
+0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0,
+0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0,
+
+0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1,
+0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1,
+1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1,
+1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0,
+
+0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1,
+0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1,
+0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0,
+0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0,
+
+0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1,
+1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0,
+0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0,
+1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1,
+
+0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1,
+0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1,
+1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1,
+1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0,
+
+0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0,
+1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0,
+1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0,
+0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0,
+
+0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0,
+0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0,
+0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0,
+
+0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1,
+1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1,
+1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0,
+0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0,
+
+0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1,
+1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0,
+1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0,
+1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1,
+
+0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0,
+1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0,
+0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1,
+0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1,
+
+};
+
+#define REGION(x,y,si) shapes[((si)&3)*4+((si)>>2)*64+(x)+(y)*16]
+
+static int shapeindex_to_compressed_indices[NSHAPES*2] =
+{
+ 0,15, 0,15, 0,15, 0,15,
+ 0,15, 0,15, 0,15, 0,15,
+ 0,15, 0,15, 0,15, 0,15,
+ 0,15, 0,15, 0,15, 0,15,
+
+ 0,15, 0, 2, 0, 8, 0, 2,
+ 0, 2, 0, 8, 0, 8, 0,15,
+ 0, 2, 0, 8, 0, 2, 0, 2,
+ 0, 8, 0, 8, 0, 2, 0, 2,
+
+ 0,15, 0,15, 0, 6, 0, 8,
+ 0, 2, 0, 8, 0,15, 0,15,
+ 0, 2, 0, 8, 0, 2, 0, 2,
+ 0, 2, 0,15, 0,15, 0, 6,
+
+ 0, 6, 0, 2, 0, 6, 0, 8,
+ 0,15, 0,15, 0, 2, 0, 2,
+ 0,15, 0,15, 0,15, 0,15,
+ 0,15, 0, 2, 0, 2, 0,15
+
+};
+#define SHAPEINDEX_TO_COMPRESSED_INDICES(si,region) shapeindex_to_compressed_indices[(si)*2+(region)]
+
+#endif
diff --git a/3rdparty/bgfx/3rdparty/nvtt/bc7/tile.h b/3rdparty/bgfx/3rdparty/nvtt/bc7/tile.h
new file mode 100644
index 00000000000..730d9bac146
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/nvtt/bc7/tile.h
@@ -0,0 +1,41 @@
+/*
+Copyright 2007 nVidia, Inc.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
+
+You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+See the License for the specific language governing permissions and limitations under the License.
+*/
+
+#ifndef _AVPCL_TILE_H
+#define _AVPCL_TILE_H
+
+#include "nvmath/vector.h"
+#include <math.h>
+#include "avpcl_utils.h"
+
+namespace AVPCL {
+
+// extract a tile of pixels from an array
+
+class Tile
+{
+public:
+ static const int TILE_H = 4;
+ static const int TILE_W = 4;
+ static const int TILE_TOTAL = TILE_H * TILE_W;
+ nv::Vector4 data[TILE_H][TILE_W];
+ float importance_map[TILE_H][TILE_W];
+ int size_x, size_y; // actual size of tile
+
+ Tile() {};
+ ~Tile(){};
+ Tile(int xs, int ys) {size_x = xs; size_y = ys;}
+};
+
+}
+
+#endif
diff --git a/3rdparty/bgfx/3rdparty/nvtt/nvcore/array.h b/3rdparty/bgfx/3rdparty/nvtt/nvcore/array.h
new file mode 100644
index 00000000000..f4460f3b430
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/nvtt/nvcore/array.h
@@ -0,0 +1,181 @@
+// This code is in the public domain -- Ignacio Castaño <castano@gmail.com>
+
+#ifndef NV_CORE_ARRAY_H
+#define NV_CORE_ARRAY_H
+
+/*
+This array class requires the elements to be relocable; it uses memmove and realloc. Ideally I should be
+using swap, but I honestly don't care. The only thing that you should be aware of is that internal pointers
+are not supported.
+
+Note also that push_back and resize does not support inserting arguments elements that are in the same
+container. This is forbidden to prevent an extra copy.
+*/
+
+
+#include "memory.h"
+#include "debug.h"
+#include "foreach.h" // pseudoindex
+
+
+namespace nv
+{
+ class Stream;
+
+ /**
+ * Replacement for std::vector that is easier to debug and provides
+ * some nice foreach enumerators.
+ */
+ template<typename T>
+ class NVCORE_CLASS Array {
+ public:
+ typedef uint size_type;
+
+ // Default constructor.
+ NV_FORCEINLINE Array() : m_buffer(NULL), m_capacity(0), m_size(0) {}
+
+ // Copy constructor.
+ NV_FORCEINLINE Array(const Array & a) : m_buffer(NULL), m_capacity(0), m_size(0) {
+ copy(a.m_buffer, a.m_size);
+ }
+
+ // Constructor that initializes the vector with the given elements.
+ NV_FORCEINLINE Array(const T * ptr, uint num) : m_buffer(NULL), m_capacity(0), m_size(0) {
+ copy(ptr, num);
+ }
+
+ // Allocate array.
+ NV_FORCEINLINE explicit Array(uint capacity) : m_buffer(NULL), m_capacity(0), m_size(0) {
+ setArrayCapacity(capacity);
+ }
+
+ // Destructor.
+ NV_FORCEINLINE ~Array() {
+ clear();
+ free<T>(m_buffer);
+ }
+
+
+ /// Const element access.
+ NV_FORCEINLINE const T & operator[]( uint index ) const
+ {
+ nvDebugCheck(index < m_size);
+ return m_buffer[index];
+ }
+ NV_FORCEINLINE const T & at( uint index ) const
+ {
+ nvDebugCheck(index < m_size);
+ return m_buffer[index];
+ }
+
+ /// Element access.
+ NV_FORCEINLINE T & operator[] ( uint index )
+ {
+ nvDebugCheck(index < m_size);
+ return m_buffer[index];
+ }
+ NV_FORCEINLINE T & at( uint index )
+ {
+ nvDebugCheck(index < m_size);
+ return m_buffer[index];
+ }
+
+ /// Get vector size.
+ NV_FORCEINLINE uint size() const { return m_size; }
+
+ /// Get vector size.
+ NV_FORCEINLINE uint count() const { return m_size; }
+
+ /// Get vector capacity.
+ NV_FORCEINLINE uint capacity() const { return m_capacity; }
+
+ /// Get const vector pointer.
+ NV_FORCEINLINE const T * buffer() const { return m_buffer; }
+
+ /// Get vector pointer.
+ NV_FORCEINLINE T * buffer() { return m_buffer; }
+
+ /// Provide begin/end pointers for C++11 range-based for loops.
+ NV_FORCEINLINE T * begin() { return m_buffer; }
+ NV_FORCEINLINE T * end() { return m_buffer + m_size; }
+ NV_FORCEINLINE const T * begin() const { return m_buffer; }
+ NV_FORCEINLINE const T * end() const { return m_buffer + m_size; }
+
+ /// Is vector empty.
+ NV_FORCEINLINE bool isEmpty() const { return m_size == 0; }
+
+ /// Is a null vector.
+ NV_FORCEINLINE bool isNull() const { return m_buffer == NULL; }
+
+
+ T & append();
+ void push_back( const T & val );
+ void pushBack( const T & val );
+ Array<T> & append( const T & val );
+ Array<T> & operator<< ( T & t );
+ void pop_back();
+ void popBack(uint count = 1);
+ void popFront(uint count = 1);
+ const T & back() const;
+ T & back();
+ const T & front() const;
+ T & front();
+ bool contains(const T & e) const;
+ bool find(const T & element, uint * indexPtr) const;
+ bool find(const T & element, uint begin, uint end, uint * indexPtr) const;
+ void removeAt(uint index);
+ bool remove(const T & element);
+ void insertAt(uint index, const T & val = T());
+ void append(const Array<T> & other);
+ void append(const T other[], uint count);
+ void replaceWithLast(uint index);
+ void resize(uint new_size);
+ void resize(uint new_size, const T & elem);
+ void fill(const T & elem);
+ void clear();
+ void shrink();
+ void reserve(uint desired_size);
+ void copy(const T * data, uint count);
+ Array<T> & operator=( const Array<T> & a );
+ T * release();
+
+
+ // Array enumerator.
+ typedef uint PseudoIndex;
+
+ NV_FORCEINLINE PseudoIndex start() const { return 0; }
+ NV_FORCEINLINE bool isDone(const PseudoIndex & i) const { nvDebugCheck(i <= this->m_size); return i == this->m_size; }
+ NV_FORCEINLINE void advance(PseudoIndex & i) const { nvDebugCheck(i <= this->m_size); i++; }
+
+#if NV_CC_MSVC
+ NV_FORCEINLINE T & operator[]( const PseudoIndexWrapper & i ) {
+ return m_buffer[i(this)];
+ }
+ NV_FORCEINLINE const T & operator[]( const PseudoIndexWrapper & i ) const {
+ return m_buffer[i(this)];
+ }
+#endif
+
+ // Friends.
+ template <typename Typ>
+ friend Stream & operator<< ( Stream & s, Array<Typ> & p );
+
+ template <typename Typ>
+ friend void swap(Array<Typ> & a, Array<Typ> & b);
+
+
+ protected:
+
+ void setArraySize(uint new_size);
+ void setArrayCapacity(uint new_capacity);
+
+ T * m_buffer;
+ uint m_capacity;
+ uint m_size;
+
+ };
+
+
+} // nv namespace
+
+#endif // NV_CORE_ARRAY_H
diff --git a/3rdparty/bgfx/3rdparty/nvtt/nvcore/array.inl b/3rdparty/bgfx/3rdparty/nvtt/nvcore/array.inl
new file mode 100644
index 00000000000..937dce76dae
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/nvtt/nvcore/array.inl
@@ -0,0 +1,437 @@
+// This code is in the public domain -- Ignacio Castaño <castano@gmail.com>
+
+#ifndef NV_CORE_ARRAY_INL
+#define NV_CORE_ARRAY_INL
+
+#include "array.h"
+
+#include "stream.h"
+#include "utils.h" // swap
+
+#include <string.h> // memmove
+#include <new> // for placement new
+
+
+
+namespace nv
+{
+ template <typename T>
+ NV_FORCEINLINE T & Array<T>::append()
+ {
+ uint old_size = m_size;
+ uint new_size = m_size + 1;
+
+ setArraySize(new_size);
+
+ construct_range(m_buffer, new_size, old_size);
+
+ return m_buffer[old_size]; // Return reference to last element.
+ }
+
+ // Push an element at the end of the vector.
+ template <typename T>
+ NV_FORCEINLINE void Array<T>::push_back( const T & val )
+ {
+#if 1
+ nvDebugCheck(&val < m_buffer || &val >= m_buffer+m_size);
+
+ uint old_size = m_size;
+ uint new_size = m_size + 1;
+
+ setArraySize(new_size);
+
+ construct_range(m_buffer, new_size, old_size, val);
+#else
+ uint new_size = m_size + 1;
+
+ if (new_size > m_capacity)
+ {
+ // @@ Is there any way to avoid this copy?
+ // @@ Can we create a copy without side effects? Ie. without calls to constructor/destructor. Use alloca + memcpy?
+ // @@ Assert instead of copy?
+ const T copy(val); // create a copy in case value is inside of this array.
+
+ setArraySize(new_size);
+
+ new (m_buffer+new_size-1) T(copy);
+ }
+ else
+ {
+ m_size = new_size;
+ new(m_buffer+new_size-1) T(val);
+ }
+#endif // 0/1
+ }
+ template <typename T>
+ NV_FORCEINLINE void Array<T>::pushBack( const T & val )
+ {
+ push_back(val);
+ }
+ template <typename T>
+ NV_FORCEINLINE Array<T> & Array<T>::append( const T & val )
+ {
+ push_back(val);
+ return *this;
+ }
+
+ // Qt like push operator.
+ template <typename T>
+ NV_FORCEINLINE Array<T> & Array<T>::operator<< ( T & t )
+ {
+ push_back(t);
+ return *this;
+ }
+
+ // Pop the element at the end of the vector.
+ template <typename T>
+ NV_FORCEINLINE void Array<T>::pop_back()
+ {
+ nvDebugCheck( m_size > 0 );
+ resize( m_size - 1 );
+ }
+ template <typename T>
+ NV_FORCEINLINE void Array<T>::popBack(uint count)
+ {
+ nvDebugCheck(m_size >= count);
+ resize(m_size - count);
+ }
+
+ template <typename T>
+ NV_FORCEINLINE void Array<T>::popFront(uint count)
+ {
+ nvDebugCheck(m_size >= count);
+ //resize(m_size - count);
+
+ if (m_size == count) {
+ clear();
+ }
+ else {
+ destroy_range(m_buffer, 0, count);
+
+ memmove(m_buffer, m_buffer + count, sizeof(T) * (m_size - count));
+
+ m_size -= count;
+ }
+
+ }
+
+
+ // Get back element.
+ template <typename T>
+ NV_FORCEINLINE const T & Array<T>::back() const
+ {
+ nvDebugCheck( m_size > 0 );
+ return m_buffer[m_size-1];
+ }
+
+ // Get back element.
+ template <typename T>
+ NV_FORCEINLINE T & Array<T>::back()
+ {
+ nvDebugCheck( m_size > 0 );
+ return m_buffer[m_size-1];
+ }
+
+ // Get front element.
+ template <typename T>
+ NV_FORCEINLINE const T & Array<T>::front() const
+ {
+ nvDebugCheck( m_size > 0 );
+ return m_buffer[0];
+ }
+
+ // Get front element.
+ template <typename T>
+ NV_FORCEINLINE T & Array<T>::front()
+ {
+ nvDebugCheck( m_size > 0 );
+ return m_buffer[0];
+ }
+
+ // Check if the given element is contained in the array.
+ template <typename T>
+ NV_FORCEINLINE bool Array<T>::contains(const T & e) const
+ {
+ return find(e, NULL);
+ }
+
+ // Return true if element found.
+ template <typename T>
+ NV_FORCEINLINE bool Array<T>::find(const T & element, uint * indexPtr) const
+ {
+ return find(element, 0, m_size, indexPtr);
+ }
+
+ // Return true if element found within the given range.
+ template <typename T>
+ NV_FORCEINLINE bool Array<T>::find(const T & element, uint begin, uint end, uint * indexPtr) const
+ {
+ return ::nv::find(element, m_buffer, begin, end, indexPtr);
+ }
+
+
+ // Remove the element at the given index. This is an expensive operation!
+ template <typename T>
+ void Array<T>::removeAt(uint index)
+ {
+ nvDebugCheck(index >= 0 && index < m_size);
+
+ if (m_size == 1) {
+ clear();
+ }
+ else {
+ m_buffer[index].~T();
+
+ memmove(m_buffer+index, m_buffer+index+1, sizeof(T) * (m_size - 1 - index));
+ m_size--;
+ }
+ }
+
+ // Remove the first instance of the given element.
+ template <typename T>
+ bool Array<T>::remove(const T & element)
+ {
+ uint index;
+ if (find(element, &index)) {
+ removeAt(index);
+ return true;
+ }
+ return false;
+ }
+
+ // Insert the given element at the given index shifting all the elements up.
+ template <typename T>
+ void Array<T>::insertAt(uint index, const T & val/*=T()*/)
+ {
+ nvDebugCheck( index >= 0 && index <= m_size );
+
+ setArraySize(m_size + 1);
+
+ if (index < m_size - 1) {
+ memmove(m_buffer+index+1, m_buffer+index, sizeof(T) * (m_size - 1 - index));
+ }
+
+ // Copy-construct into the newly opened slot.
+ new(m_buffer+index) T(val);
+ }
+
+ // Append the given data to our vector.
+ template <typename T>
+ NV_FORCEINLINE void Array<T>::append(const Array<T> & other)
+ {
+ append(other.m_buffer, other.m_size);
+ }
+
+ // Append the given data to our vector.
+ template <typename T>
+ void Array<T>::append(const T other[], uint count)
+ {
+ if (count > 0) {
+ const uint old_size = m_size;
+
+ setArraySize(m_size + count);
+
+ for (uint i = 0; i < count; i++ ) {
+ new(m_buffer + old_size + i) T(other[i]);
+ }
+ }
+ }
+
+
+ // Remove the given element by replacing it with the last one.
+ template <typename T>
+ void Array<T>::replaceWithLast(uint index)
+ {
+ nvDebugCheck( index < m_size );
+ nv::swap(m_buffer[index], back()); // @@ Is this OK when index == size-1?
+ (m_buffer+m_size-1)->~T();
+ m_size--;
+ }
+
+ // Resize the vector preserving existing elements.
+ template <typename T>
+ void Array<T>::resize(uint new_size)
+ {
+ uint old_size = m_size;
+
+ // Destruct old elements (if we're shrinking).
+ destroy_range(m_buffer, new_size, old_size);
+
+ setArraySize(new_size);
+
+ // Call default constructors
+ construct_range(m_buffer, new_size, old_size);
+ }
+
+
+ // Resize the vector preserving existing elements and initializing the
+ // new ones with the given value.
+ template <typename T>
+ void Array<T>::resize(uint new_size, const T & elem)
+ {
+ nvDebugCheck(&elem < m_buffer || &elem > m_buffer+m_size);
+
+ uint old_size = m_size;
+
+ // Destruct old elements (if we're shrinking).
+ destroy_range(m_buffer, new_size, old_size);
+
+ setArraySize(new_size);
+
+ // Call copy constructors
+ construct_range(m_buffer, new_size, old_size, elem);
+ }
+
+ // Fill array with the given value.
+ template <typename T>
+ void Array<T>::fill(const T & elem)
+ {
+ fill(m_buffer, m_size, elem);
+ }
+
+ // Clear the buffer.
+ template <typename T>
+ NV_FORCEINLINE void Array<T>::clear()
+ {
+ nvDebugCheck(isValidPtr(m_buffer));
+
+ // Destruct old elements
+ destroy_range(m_buffer, 0, m_size);
+
+ m_size = 0;
+ }
+
+ // Shrink the allocated vector.
+ template <typename T>
+ NV_FORCEINLINE void Array<T>::shrink()
+ {
+ if (m_size < m_capacity) {
+ setArrayCapacity(m_size);
+ }
+ }
+
+ // Preallocate space.
+ template <typename T>
+ NV_FORCEINLINE void Array<T>::reserve(uint desired_size)
+ {
+ if (desired_size > m_capacity) {
+ setArrayCapacity(desired_size);
+ }
+ }
+
+ // Copy elements to this array. Resizes it if needed.
+ template <typename T>
+ NV_FORCEINLINE void Array<T>::copy(const T * data, uint count)
+ {
+#if 1 // More simple, but maybe not be as efficient?
+ destroy_range(m_buffer, 0, m_size);
+
+ setArraySize(count);
+
+ construct_range(m_buffer, count, 0, data);
+#else
+ const uint old_size = m_size;
+
+ destroy_range(m_buffer, count, old_size);
+
+ setArraySize(count);
+
+ copy_range(m_buffer, data, old_size);
+
+ construct_range(m_buffer, count, old_size, data);
+#endif
+ }
+
+ // Assignment operator.
+ template <typename T>
+ NV_FORCEINLINE Array<T> & Array<T>::operator=( const Array<T> & a )
+ {
+ copy(a.m_buffer, a.m_size);
+ return *this;
+ }
+
+ // Release ownership of allocated memory and returns pointer to it.
+ template <typename T>
+ T * Array<T>::release() {
+ T * tmp = m_buffer;
+ m_buffer = NULL;
+ m_capacity = 0;
+ m_size = 0;
+ return tmp;
+ }
+
+
+
+ // Change array size.
+ template <typename T>
+ inline void Array<T>::setArraySize(uint new_size) {
+ m_size = new_size;
+
+ if (new_size > m_capacity) {
+ uint new_buffer_size;
+ if (m_capacity == 0) {
+ // first allocation is exact
+ new_buffer_size = new_size;
+ }
+ else {
+ // following allocations grow array by 25%
+ new_buffer_size = new_size + (new_size >> 2);
+ }
+
+ setArrayCapacity( new_buffer_size );
+ }
+ }
+
+ // Change array capacity.
+ template <typename T>
+ inline void Array<T>::setArrayCapacity(uint new_capacity) {
+ nvDebugCheck(new_capacity >= m_size);
+
+ if (new_capacity == 0) {
+ // free the buffer.
+ if (m_buffer != NULL) {
+ free<T>(m_buffer);
+ m_buffer = NULL;
+ }
+ }
+ else {
+ // realloc the buffer
+ m_buffer = realloc<T>(m_buffer, new_capacity);
+ }
+
+ m_capacity = new_capacity;
+ }
+
+ // Array serialization.
+ template <typename Typ>
+ inline Stream & operator<< ( Stream & s, Array<Typ> & p )
+ {
+ if (s.isLoading()) {
+ uint size;
+ s << size;
+ p.resize( size );
+ }
+ else {
+ s << p.m_size;
+ }
+
+ for (uint i = 0; i < p.m_size; i++) {
+ s << p.m_buffer[i];
+ }
+
+ return s;
+ }
+
+ // Swap the members of the two given vectors.
+ template <typename Typ>
+ inline void swap(Array<Typ> & a, Array<Typ> & b)
+ {
+ nv::swap(a.m_buffer, b.m_buffer);
+ nv::swap(a.m_capacity, b.m_capacity);
+ nv::swap(a.m_size, b.m_size);
+ }
+
+
+} // nv namespace
+
+#endif // NV_CORE_ARRAY_INL
diff --git a/3rdparty/bgfx/3rdparty/nvtt/nvcore/debug.h b/3rdparty/bgfx/3rdparty/nvtt/nvcore/debug.h
new file mode 100644
index 00000000000..61fbd2fcf46
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/nvtt/nvcore/debug.h
@@ -0,0 +1,216 @@
+// This code is in the public domain -- Ignacio Castaño <castano@gmail.com>
+
+#ifndef NV_CORE_DEBUG_H
+#define NV_CORE_DEBUG_H
+
+#include "nvcore.h"
+
+#include <stdarg.h> // va_list
+
+
+// Make sure we are using our assert.
+#undef assert
+
+#define NV_ABORT_DEBUG 1
+#define NV_ABORT_IGNORE 2
+#define NV_ABORT_EXIT 3
+
+#define nvNoAssert(exp) \
+ NV_MULTI_LINE_MACRO_BEGIN \
+ (void)sizeof(exp); \
+ NV_MULTI_LINE_MACRO_END
+
+#if NV_NO_ASSERT
+
+# define nvAssert(exp) nvNoAssert(exp)
+# define nvCheck(exp) nvNoAssert(exp)
+# define nvDebugAssert(exp) nvNoAssert(exp)
+# define nvDebugCheck(exp) nvNoAssert(exp)
+# define nvDebugBreak() nvNoAssert(0)
+
+#else // NV_NO_ASSERT
+
+# if NV_CC_MSVC
+ // @@ Does this work in msvc-6 and earlier?
+# define nvDebugBreak() __debugbreak()
+//# define nvDebugBreak() __asm { int 3 }
+# elif NV_OS_ORBIS
+# define nvDebugBreak() __debugbreak()
+# elif NV_CC_GNUC
+# define nvDebugBreak() __builtin_trap()
+# else
+# error "No nvDebugBreak()!"
+# endif
+
+/*
+# elif NV_CC_GNUC || NV_CPU_PPC && NV_OS_DARWIN
+ // @@ Use __builtin_trap() on GCC
+# define nvDebugBreak() __asm__ volatile ("trap")
+# elif (NV_CC_GNUC || NV_CPU_X86 || NV_CPU_X86_64) && NV_OS_DARWIN
+# define nvDebugBreak() __asm__ volatile ("int3")
+# elif NV_CC_GNUC || NV_CPU_X86 || NV_CPU_X86_64
+# define nvDebugBreak() __asm__ ( "int %0" : :"I"(3) )
+# else
+# include <signal.h>
+# define nvDebugBreak() raise(SIGTRAP)
+# endif
+*/
+
+#define nvDebugBreakOnce() \
+ NV_MULTI_LINE_MACRO_BEGIN \
+ static bool firstTime = true; \
+ if (firstTime) { firstTime = false; nvDebugBreak(); } \
+ NV_MULTI_LINE_MACRO_END
+
+#define nvAssertMacro(exp) \
+ NV_MULTI_LINE_MACRO_BEGIN \
+ if (!(exp)) { \
+ if (nvAbort(#exp, __FILE__, __LINE__, __FUNC__) == NV_ABORT_DEBUG) { \
+ nvDebugBreak(); \
+ } \
+ } \
+ NV_MULTI_LINE_MACRO_END
+
+// GCC, LLVM need "##" before the __VA_ARGS__, MSVC doesn't care
+#define nvAssertMacroWithIgnoreAll(exp,...) \
+ NV_MULTI_LINE_MACRO_BEGIN \
+ static bool ignoreAll = false; \
+ if (!ignoreAll && !(exp)) { \
+ int result = nvAbort(#exp, __FILE__, __LINE__, __FUNC__, ##__VA_ARGS__); \
+ if (result == NV_ABORT_DEBUG) { \
+ nvDebugBreak(); \
+ } else if (result == NV_ABORT_IGNORE) { \
+ ignoreAll = true; \
+ } \
+ } \
+ NV_MULTI_LINE_MACRO_END
+
+// Interesting assert macro from Insomniac:
+// http://www.gdcvault.com/play/1015319/Developing-Imperfect-Software-How-to
+// Used as follows:
+// if (nvCheck(i < count)) {
+// normal path
+// } else {
+// fixup code.
+// }
+// This style of macro could be combined with __builtin_expect to let the compiler know failure is unlikely.
+#define nvCheckMacro(exp) \
+ (\
+ (exp) ? true : ( \
+ (nvAbort(#exp, __FILE__, __LINE__, __FUNC__) == NV_ABORT_DEBUG) ? (nvDebugBreak(), true) : ( false ) \
+ ) \
+ )
+
+
+#define nvAssert(exp) nvAssertMacro(exp)
+#define nvCheck(exp) nvAssertMacro(exp)
+
+#if defined(_DEBUG)
+# define nvDebugAssert(exp) nvAssertMacro(exp)
+# define nvDebugCheck(exp) nvAssertMacro(exp)
+#else // _DEBUG
+# define nvDebugAssert(exp) nvNoAssert(exp)
+# define nvDebugCheck(exp) nvNoAssert(exp)
+#endif // _DEBUG
+
+#endif // NV_NO_ASSERT
+
+// Use nvAssume for very simple expresions only: nvAssume(0), nvAssume(value == true), etc.
+/*#if !defined(_DEBUG)
+# if NV_CC_MSVC
+# define nvAssume(exp) __assume(exp)
+# else
+# define nvAssume(exp) nvCheck(exp)
+# endif
+#else
+# define nvAssume(exp) nvCheck(exp)
+#endif*/
+
+#if defined(_DEBUG)
+# if NV_CC_MSVC
+# define nvUnreachable() nvAssert(0 && "unreachable"); __assume(0)
+# else
+# define nvUnreachable() nvAssert(0 && "unreachable"); __builtin_unreachable()
+# endif
+#else
+# if NV_CC_MSVC
+# define nvUnreachable() __assume(0)
+# else
+# define nvUnreachable() __builtin_unreachable()
+# endif
+#endif
+
+
+#define nvError(x) nvAbort(x, __FILE__, __LINE__, __FUNC__)
+#define nvWarning(x) nvDebugPrint("*** Warning %s/%d: %s\n", __FILE__, __LINE__, (x))
+
+#ifndef NV_DEBUG_PRINT
+#define NV_DEBUG_PRINT 1 //defined(_DEBUG)
+#endif
+
+#if NV_DEBUG_PRINT
+#define nvDebug(...) nvDebugPrint(__VA_ARGS__)
+#else
+#if NV_CC_MSVC
+#define nvDebug(...) __noop(__VA_ARGS__)
+#else
+#define nvDebug(...) ((void)0) // Non-msvc platforms do not evaluate arguments?
+#endif
+#endif
+
+
+NVCORE_API int nvAbort(const char *exp, const char *file, int line, const char * func = NULL, const char * msg = NULL, ...) __attribute__((format (printf, 5, 6)));
+NVCORE_API void NV_CDECL nvDebugPrint( const char *msg, ... ) __attribute__((format (printf, 1, 2)));
+
+namespace nv
+{
+ inline bool isValidPtr(const void * ptr) {
+ #if NV_CPU_X86_64
+ if (ptr == NULL) return true;
+ if (reinterpret_cast<uint64>(ptr) < 0x10000ULL) return false;
+ if (reinterpret_cast<uint64>(ptr) >= 0x000007FFFFFEFFFFULL) return false;
+ #else
+ if (reinterpret_cast<uint32>(ptr) == 0xcccccccc) return false;
+ if (reinterpret_cast<uint32>(ptr) == 0xcdcdcdcd) return false;
+ if (reinterpret_cast<uint32>(ptr) == 0xdddddddd) return false;
+ if (reinterpret_cast<uint32>(ptr) == 0xffffffff) return false;
+ #endif
+ return true;
+ }
+
+ // Message handler interface.
+ struct MessageHandler {
+ virtual void log(const char * str, va_list arg) = 0;
+ virtual ~MessageHandler() {}
+ };
+
+ // Assert handler interface.
+ struct AssertHandler {
+ virtual int assertion(const char *exp, const char *file, int line, const char *func, const char *msg, va_list arg) = 0;
+ virtual ~AssertHandler() {}
+ };
+
+
+ namespace debug
+ {
+ NVCORE_API void dumpInfo();
+ NVCORE_API void dumpCallstack( MessageHandler *messageHandler, int callstackLevelsToSkip = 0 );
+
+ NVCORE_API void setMessageHandler( MessageHandler * messageHandler );
+ NVCORE_API void resetMessageHandler();
+
+ NVCORE_API void setAssertHandler( AssertHandler * assertHanlder );
+ NVCORE_API void resetAssertHandler();
+
+ NVCORE_API void enableSigHandler(bool interactive);
+ NVCORE_API void disableSigHandler();
+
+ NVCORE_API bool isDebuggerPresent();
+ NVCORE_API bool attachToDebugger();
+
+ NVCORE_API void terminate(int code);
+ }
+
+} // nv namespace
+
+#endif // NV_CORE_DEBUG_H
diff --git a/3rdparty/bgfx/3rdparty/nvtt/nvcore/defsgnucdarwin.h b/3rdparty/bgfx/3rdparty/nvtt/nvcore/defsgnucdarwin.h
new file mode 100644
index 00000000000..04900cfb0a0
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/nvtt/nvcore/defsgnucdarwin.h
@@ -0,0 +1,57 @@
+#ifndef NV_CORE_H
+#error "Do not include this file directly."
+#endif
+
+#include <stdint.h> // uint8_t, int8_t, ... uintptr_t
+#include <stddef.h> // operator new, size_t, NULL
+
+#ifndef __STDC_VERSION__
+# define __STDC_VERSION__ 0
+#endif // __STDC_VERSION__
+
+// Function linkage
+#define DLL_IMPORT
+#if __GNUC__ >= 4
+# define DLL_EXPORT __attribute__((visibility("default")))
+# define DLL_EXPORT_CLASS DLL_EXPORT
+#else
+# define DLL_EXPORT
+# define DLL_EXPORT_CLASS
+#endif
+
+// Function calling modes
+#if NV_CPU_X86
+# define NV_CDECL __attribute__((cdecl))
+# define NV_STDCALL __attribute__((stdcall))
+#else
+# define NV_CDECL
+# define NV_STDCALL
+#endif
+
+#define NV_FASTCALL __attribute__((fastcall))
+#define NV_FORCEINLINE __attribute__((always_inline)) inline
+#define NV_DEPRECATED __attribute__((deprecated))
+#define NV_THREAD_LOCAL //ACS: there's no "__thread" or equivalent on iOS/OSX
+
+#if __GNUC__ > 2
+#define NV_PURE __attribute__((pure))
+#define NV_CONST __attribute__((const))
+#else
+#define NV_PURE
+#define NV_CONST
+#endif
+
+#define NV_NOINLINE __attribute__((noinline))
+
+// Define __FUNC__ properly.
+#if defined(__STDC_VERSION__) && __STDC_VERSION__ < 199901L
+# if __GNUC__ >= 2
+# define __FUNC__ __PRETTY_FUNCTION__ // __FUNCTION__
+# else
+# define __FUNC__ "<unknown>"
+# endif
+#else
+# define __FUNC__ __PRETTY_FUNCTION__
+#endif
+
+#define restrict __restrict__
diff --git a/3rdparty/bgfx/3rdparty/nvtt/nvcore/defsgnuclinux.h b/3rdparty/bgfx/3rdparty/nvtt/nvcore/defsgnuclinux.h
new file mode 100644
index 00000000000..5d2e4b8dcd0
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/nvtt/nvcore/defsgnuclinux.h
@@ -0,0 +1,63 @@
+#ifndef NV_CORE_H
+#error "Do not include this file directly."
+#endif
+
+#include <stdint.h> // uint8_t, int8_t, ... uintptr_t
+#include <stddef.h> // operator new, size_t, NULL
+
+#ifndef __STDC_VERSION__
+# define __STDC_VERSION__ 0
+#endif
+
+// Function linkage
+#define DLL_IMPORT
+#if __GNUC__ >= 4
+# define DLL_EXPORT __attribute__((visibility("default")))
+# define DLL_EXPORT_CLASS DLL_EXPORT
+#else
+# define DLL_EXPORT
+# define DLL_EXPORT_CLASS
+#endif
+
+// Function calling modes
+#if NV_CPU_X86
+# define NV_CDECL __attribute__((cdecl))
+# define NV_STDCALL __attribute__((stdcall))
+#else
+# define NV_CDECL
+# define NV_STDCALL
+#endif
+
+#define NV_FASTCALL __attribute__((fastcall))
+//#if __GNUC__ > 3
+// It seems that GCC does not assume always_inline implies inline. I think this depends on the GCC version :(
+#define NV_FORCEINLINE inline __attribute__((always_inline))
+//#else
+// Some compilers complain that inline and always_inline are redundant.
+//#define NV_FORCEINLINE __attribute__((always_inline))
+//#endif
+#define NV_DEPRECATED __attribute__((deprecated))
+#define NV_THREAD_LOCAL __thread
+
+#if __GNUC__ > 2
+#define NV_PURE __attribute__((pure))
+#define NV_CONST __attribute__((const))
+#else
+#define NV_PURE
+#define NV_CONST
+#endif
+
+#define NV_NOINLINE __attribute__((noinline))
+
+// Define __FUNC__ properly.
+#if defined(__STDC_VERSION__) && __STDC_VERSION__ < 199901L
+# if __GNUC__ >= 2
+# define __FUNC__ __PRETTY_FUNCTION__ // __FUNCTION__
+# else
+# define __FUNC__ "<unknown>"
+# endif
+#else
+# define __FUNC__ __PRETTY_FUNCTION__
+#endif
+
+#define restrict __restrict__
diff --git a/3rdparty/bgfx/3rdparty/nvtt/nvcore/defsgnucwin32.h b/3rdparty/bgfx/3rdparty/nvtt/nvcore/defsgnucwin32.h
new file mode 100644
index 00000000000..e416d3d4153
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/nvtt/nvcore/defsgnucwin32.h
@@ -0,0 +1,65 @@
+#ifndef NV_CORE_H
+#error "Do not include this file directly."
+#endif
+
+//#include <cstddef> // size_t, NULL
+
+// Function linkage
+#define DLL_IMPORT __declspec(dllimport)
+#define DLL_EXPORT __declspec(dllexport)
+#define DLL_EXPORT_CLASS DLL_EXPORT
+
+// Function calling modes
+#if NV_CPU_X86
+# define NV_CDECL __attribute__((cdecl))
+# define NV_STDCALL __attribute__((stdcall))
+#else
+# define NV_CDECL
+# define NV_STDCALL
+#endif
+
+#define NV_FASTCALL __attribute__((fastcall))
+#define NV_FORCEINLINE __attribute__((always_inline))
+#define NV_DEPRECATED __attribute__((deprecated))
+
+#if __GNUC__ > 2
+#define NV_PURE __attribute__((pure))
+#define NV_CONST __attribute__((const))
+#else
+#define NV_PURE
+#define NV_CONST
+#endif
+
+#define NV_NOINLINE __attribute__((noinline))
+
+// Define __FUNC__ properly.
+#if defined(__STDC_VERSION__) && __STDC_VERSION__ < 199901L
+# if __GNUC__ >= 2
+# define __FUNC__ __PRETTY_FUNCTION__ // __FUNCTION__
+# else
+# define __FUNC__ "<unknown>"
+# endif
+#else
+# define __FUNC__ __PRETTY_FUNCTION__
+#endif
+
+#define restrict __restrict__
+
+/*
+// Type definitions
+typedef unsigned char uint8;
+typedef signed char int8;
+
+typedef unsigned short uint16;
+typedef signed short int16;
+
+typedef unsigned int uint32;
+typedef signed int int32;
+
+typedef unsigned long long uint64;
+typedef signed long long int64;
+
+// Aliases
+typedef uint32 uint;
+*/
+
diff --git a/3rdparty/bgfx/3rdparty/nvtt/nvcore/defsvcwin32.h b/3rdparty/bgfx/3rdparty/nvtt/nvcore/defsvcwin32.h
new file mode 100644
index 00000000000..7b3876ab4b3
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/nvtt/nvcore/defsvcwin32.h
@@ -0,0 +1,94 @@
+// This code is in the public domain -- Ignacio Castaño <castano@gmail.com>
+
+#ifndef NV_CORE_H
+#error "Do not include this file directly."
+#endif
+
+// Function linkage
+#define DLL_IMPORT __declspec(dllimport)
+#define DLL_EXPORT __declspec(dllexport)
+#define DLL_EXPORT_CLASS DLL_EXPORT
+
+// Function calling modes
+#define NV_CDECL __cdecl
+#define NV_STDCALL __stdcall
+#define NV_FASTCALL __fastcall
+#define NV_DEPRECATED
+
+#define NV_PURE
+#define NV_CONST
+
+// Set standard function names.
+#if _MSC_VER < 1900
+# define snprintf _snprintf
+#endif
+#if _MSC_VER < 1500
+# define vsnprintf _vsnprintf
+#endif
+#if _MSC_VER < 1700
+# define strtoll _strtoi64
+# define strtoull _strtoui64
+#endif
+#define chdir _chdir
+#define getcwd _getcwd
+
+#if _MSC_VER < 1800 // Not sure what version introduced this.
+#define va_copy(a, b) (a) = (b)
+#endif
+
+#if !defined restrict
+#define restrict
+#endif
+
+// Ignore gcc attributes.
+#define __attribute__(X)
+
+#if !defined __FUNC__
+#define __FUNC__ __FUNCTION__
+#endif
+
+#define NV_NOINLINE __declspec(noinline)
+#define NV_FORCEINLINE __forceinline
+
+#define NV_THREAD_LOCAL __declspec(thread)
+
+/*
+// Type definitions
+typedef unsigned char uint8;
+typedef signed char int8;
+
+typedef unsigned short uint16;
+typedef signed short int16;
+
+typedef unsigned int uint32;
+typedef signed int int32;
+
+typedef unsigned __int64 uint64;
+typedef signed __int64 int64;
+
+// Aliases
+typedef uint32 uint;
+*/
+
+// Unwanted VC++ warnings to disable.
+/*
+#pragma warning(disable : 4244) // conversion to float, possible loss of data
+#pragma warning(disable : 4245) // conversion from 'enum ' to 'unsigned long', signed/unsigned mismatch
+#pragma warning(disable : 4100) // unreferenced formal parameter
+#pragma warning(disable : 4514) // unreferenced inline function has been removed
+#pragma warning(disable : 4710) // inline function not expanded
+#pragma warning(disable : 4127) // Conditional expression is constant
+#pragma warning(disable : 4305) // truncation from 'const double' to 'float'
+#pragma warning(disable : 4505) // unreferenced local function has been removed
+
+#pragma warning(disable : 4702) // unreachable code in inline expanded function
+#pragma warning(disable : 4711) // function selected for automatic inlining
+#pragma warning(disable : 4725) // Pentium fdiv bug
+
+#pragma warning(disable : 4786) // Identifier was truncated and cannot be debugged.
+
+#pragma warning(disable : 4675) // resolved overload was found by argument-dependent lookup
+*/
+
+#pragma warning(1 : 4705) // Report unused local variables.
+#pragma warning(1 : 4555) // Expression has no effect.
diff --git a/3rdparty/bgfx/3rdparty/nvtt/nvcore/foreach.h b/3rdparty/bgfx/3rdparty/nvtt/nvcore/foreach.h
new file mode 100644
index 00000000000..71b19f778fa
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/nvtt/nvcore/foreach.h
@@ -0,0 +1,68 @@
+// This code is in the public domain -- Ignacio Castaño <castano@gmail.com>
+
+#pragma once
+#ifndef NV_CORE_FOREACH_H
+#define NV_CORE_FOREACH_H
+
+/*
+These foreach macros are very non-standard and somewhat confusing, but I like them.
+*/
+
+#include "nvcore.h"
+
+#if NV_CC_GNUC // If typeof or decltype is available:
+#if !NV_CC_CPP11
+# define NV_DECLTYPE typeof // Using a non-standard extension over typeof that behaves as C++11 decltype
+#else
+# define NV_DECLTYPE decltype
+#endif
+
+/*
+Ideally we would like to write this:
+
+#define NV_FOREACH(i, container) \
+ for(NV_DECLTYPE(container)::PseudoIndex i((container).start()); !(container).isDone(i); (container).advance(i))
+
+But gcc versions prior to 4.7 required an intermediate type. See:
+https://gcc.gnu.org/bugzilla/show_bug.cgi?id=6709
+*/
+
+#define NV_FOREACH(i, container) \
+ typedef NV_DECLTYPE(container) NV_STRING_JOIN2(cont,__LINE__); \
+ for(NV_STRING_JOIN2(cont,__LINE__)::PseudoIndex i((container).start()); !(container).isDone(i); (container).advance(i))
+
+#else // If typeof not available:
+
+#include <new> // placement new
+
+struct PseudoIndexWrapper {
+ template <typename T>
+ PseudoIndexWrapper(const T & container) {
+ nvStaticCheck(sizeof(typename T::PseudoIndex) <= sizeof(memory));
+ new (memory) typename T::PseudoIndex(container.start());
+ }
+ // PseudoIndex cannot have a dtor!
+
+ template <typename T> typename T::PseudoIndex & operator()(const T * /*container*/) {
+ return *reinterpret_cast<typename T::PseudoIndex *>(memory);
+ }
+ template <typename T> const typename T::PseudoIndex & operator()(const T * /*container*/) const {
+ return *reinterpret_cast<const typename T::PseudoIndex *>(memory);
+ }
+
+ uint8 memory[4]; // Increase the size if we have bigger enumerators.
+};
+
+#define NV_FOREACH(i, container) \
+ for(PseudoIndexWrapper i(container); !(container).isDone(i(&(container))); (container).advance(i(&(container))))
+
+#endif
+
+// Declare foreach keyword.
+#if !defined NV_NO_USE_KEYWORDS
+# define foreach NV_FOREACH
+# define foreach_index NV_FOREACH
+#endif
+
+
+#endif // NV_CORE_FOREACH_H
diff --git a/3rdparty/bgfx/3rdparty/nvtt/nvcore/hash.h b/3rdparty/bgfx/3rdparty/nvtt/nvcore/hash.h
new file mode 100644
index 00000000000..a8b0b2c63b1
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/nvtt/nvcore/hash.h
@@ -0,0 +1,83 @@
+// This code is in the public domain -- Ignacio Castaño <castano@gmail.com>
+
+#pragma once
+#ifndef NV_CORE_HASH_H
+#define NV_CORE_HASH_H
+
+#include "nvcore.h"
+
+namespace nv
+{
+ inline uint sdbmHash(const void * data_in, uint size, uint h = 5381)
+ {
+ const uint8 * data = (const uint8 *) data_in;
+ uint i = 0;
+ while (i < size) {
+ h = (h << 16) + (h << 6) - h + (uint) data[i++];
+ }
+ return h;
+ }
+
+ // Note that this hash does not handle NaN properly.
+ inline uint sdbmFloatHash(const float * f, uint count, uint h = 5381)
+ {
+ for (uint i = 0; i < count; i++) {
+ //nvDebugCheck(nv::isFinite(*f));
+ union { float f; uint32 i; } x = { f[i] };
+ if (x.i == 0x80000000) x.i = 0;
+ h = sdbmHash(&x, 4, h);
+ }
+ return h;
+ }
+
+
+ template <typename T>
+ inline uint hash(const T & t, uint h = 5381)
+ {
+ return sdbmHash(&t, sizeof(T), h);
+ }
+
+ template <>
+ inline uint hash(const float & f, uint h)
+ {
+ return sdbmFloatHash(&f, 1, h);
+ }
+
+
+ // Functors for hash table:
+ template <typename Key> struct Hash
+ {
+ uint operator()(const Key & k) const {
+ return hash(k);
+ }
+ };
+
+ template <typename Key> struct Equal
+ {
+ bool operator()(const Key & k0, const Key & k1) const {
+ return k0 == k1;
+ }
+ };
+
+
+ // @@ Move to Utils.h?
+ template <typename T1, typename T2>
+ struct Pair {
+ T1 first;
+ T2 second;
+ };
+
+ template <typename T1, typename T2>
+ bool operator==(const Pair<T1,T2> & p0, const Pair<T1,T2> & p1) {
+ return p0.first == p1.first && p0.second == p1.second;
+ }
+
+ template <typename T1, typename T2>
+ uint hash(const Pair<T1,T2> & p, uint h = 5381) {
+ return hash(p.second, hash(p.first));
+ }
+
+
+} // nv namespace
+
+#endif // NV_CORE_HASH_H
diff --git a/3rdparty/bgfx/3rdparty/nvtt/nvcore/memory.h b/3rdparty/bgfx/3rdparty/nvtt/nvcore/memory.h
new file mode 100644
index 00000000000..b332fab8ed6
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/nvtt/nvcore/memory.h
@@ -0,0 +1,30 @@
+// This code is in the public domain -- Ignacio Castaño <castano@gmail.com>
+
+#ifndef NV_CORE_MEMORY_H
+#define NV_CORE_MEMORY_H
+
+#include "nvcore.h"
+#include <stdlib.h>
+
+namespace nv {
+
+ // C++ helpers.
+ template <typename T> inline T * malloc(size_t count) {
+ return (T *)::malloc(sizeof(T) * count);
+ }
+
+ template <typename T> inline T * realloc(T * ptr, size_t count) {
+ return (T *)::realloc(ptr, sizeof(T) * count);
+ }
+
+ template <typename T> inline void free(const T * ptr) {
+ ::free((void *)ptr);
+ }
+
+ template <typename T> inline void zero(T & data) {
+ memset(&data, 0, sizeof(T));
+ }
+
+} // nv namespace
+
+#endif // NV_CORE_MEMORY_H
diff --git a/3rdparty/bgfx/3rdparty/nvtt/nvcore/nvcore.h b/3rdparty/bgfx/3rdparty/nvtt/nvcore/nvcore.h
new file mode 100644
index 00000000000..689feff4cad
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/nvtt/nvcore/nvcore.h
@@ -0,0 +1,363 @@
+// This code is in the public domain -- Ignacio Castaño <castano@gmail.com>
+
+#ifndef NV_CORE_H
+#define NV_CORE_H
+
+#define NVCORE_SHARED 0
+#define NV_NO_ASSERT 0
+
+// Function linkage
+#if NVCORE_SHARED
+#ifdef NVCORE_EXPORTS
+#define NVCORE_API DLL_EXPORT
+#define NVCORE_CLASS DLL_EXPORT_CLASS
+#else
+#define NVCORE_API DLL_IMPORT
+#define NVCORE_CLASS DLL_IMPORT
+#endif
+#else // NVCORE_SHARED
+#define NVCORE_API
+#define NVCORE_CLASS
+#endif // NVCORE_SHARED
+
+// Platform definitions
+#include "posh.h"
+
+#define NV_OS_STRING POSH_OS_STRING
+
+#if defined POSH_OS_LINUX
+# define NV_OS_LINUX 1
+# define NV_OS_UNIX 1
+#elif defined POSH_OS_ORBIS
+# define NV_OS_ORBIS 1
+#elif defined POSH_OS_FREEBSD
+# define NV_OS_FREEBSD 1
+# define NV_OS_UNIX 1
+#elif defined POSH_OS_OPENBSD
+# define NV_OS_OPENBSD 1
+# define NV_OS_UNIX 1
+#elif defined POSH_OS_CYGWIN32
+# define NV_OS_CYGWIN 1
+#elif defined POSH_OS_MINGW
+# define NV_OS_MINGW 1
+# define NV_OS_WIN32 1
+#elif defined POSH_OS_OSX
+# define NV_OS_DARWIN 1
+# define NV_OS_UNIX 1
+#elif defined POSH_OS_IOS
+# define NV_OS_DARWIN 1 //ACS should we keep this on IOS?
+# define NV_OS_UNIX 1
+# define NV_OS_IOS 1
+#elif defined POSH_OS_UNIX
+# define NV_OS_UNIX 1
+#elif defined POSH_OS_WIN64
+# define NV_OS_WIN32 1
+# define NV_OS_WIN64 1
+#elif defined POSH_OS_WIN32
+# define NV_OS_WIN32 1
+#elif defined POSH_OS_XBOX
+# define NV_OS_XBOX 1
+#else
+# error "Unsupported OS"
+#endif
+
+#ifndef NV_OS_WIN32
+# define NV_OS_WIN32 0
+#endif // NV_OS_WIN32
+
+#ifndef NV_OS_WIN64
+# define NV_OS_WIN64 0
+#endif // NV_OS_WIN64
+
+#ifndef NV_OS_MINGW
+# define NV_OS_MINGW 0
+#endif // NV_OS_MINGW
+
+#ifndef NV_OS_CYGWIN
+# define NV_OS_CYGWIN 0
+#endif // NV_OS_CYGWIN
+
+#ifndef NV_OS_LINUX
+# define NV_OS_LINUX 0
+#endif // NV_OS_LINUX
+
+#ifndef NV_OS_FREEBSD
+# define NV_OS_FREEBSD 0
+#endif // NV_OS_FREEBSD
+
+#ifndef NV_OS_OPENBSD
+# define NV_OS_OPENBSD 0
+#endif // NV_OS_OPENBSD
+
+#ifndef NV_OS_UNIX
+# define NV_OS_UNIX 0
+#endif // NV_OS_UNIX
+
+#ifndef NV_OS_DARWIN
+# define NV_OS_DARWIN 0
+#endif // NV_OS_DARWIN
+
+#ifndef NV_OS_XBOX
+# define NV_OS_XBOX 0
+#endif // NV_OS_XBOX
+
+#ifndef NV_OS_ORBIS
+# define NV_OS_ORBIS 0
+#endif // NV_OS_ORBIS
+
+#ifndef NV_OS_IOS
+# define NV_OS_IOS 0
+#endif // NV_OS_IOS
+
+// Threading:
+// some platforms don't implement __thread or similar for thread-local-storage
+#if NV_OS_UNIX || NV_OS_ORBIS || NV_OS_IOS //ACStodoIOS darwin instead of ios?
+# define NV_OS_USE_PTHREAD 1
+# if NV_OS_DARWIN || NV_OS_IOS
+# define NV_OS_HAS_TLS_QUALIFIER 0
+# else
+# define NV_OS_HAS_TLS_QUALIFIER 1
+# endif
+#else
+# define NV_OS_USE_PTHREAD 0
+# define NV_OS_HAS_TLS_QUALIFIER 1
+#endif
+
+
+// CPUs:
+
+#define NV_CPU_STRING POSH_CPU_STRING
+
+#if defined POSH_CPU_X86_64
+//# define NV_CPU_X86 1
+# define NV_CPU_X86_64 1
+#elif defined POSH_CPU_X86
+# define NV_CPU_X86 1
+#elif defined POSH_CPU_PPC
+# define NV_CPU_PPC 1
+#elif defined POSH_CPU_STRONGARM
+# define NV_CPU_ARM 1
+#elif defined POSH_CPU_AARCH64
+# define NV_CPU_AARCH64 1
+#else
+# error "Unsupported CPU"
+#endif
+
+#ifndef NV_CPU_X86
+# define NV_CPU_X86 0
+#endif // NV_CPU_X86
+
+#ifndef NV_CPU_X86_64
+# define NV_CPU_X86_64 0
+#endif // NV_CPU_X86_64
+
+#ifndef NV_CPU_PPC
+# define NV_CPU_PPC 0
+#endif // NV_CPU_PPC
+
+#ifndef NV_CPU_ARM
+# define NV_CPU_ARM 0
+#endif // NV_CPU_ARM
+
+#ifndef NV_CPU_AARCH64
+# define NV_CPU_AARCH64 0
+#endif // NV_CPU_AARCH64
+
+// Compiler:
+
+#if defined POSH_COMPILER_CLANG
+# define NV_CC_CLANG 1
+# define NV_CC_GNUC 1 // Clang is compatible with GCC.
+# define NV_CC_STRING "clang"
+# pragma clang diagnostic ignored "-Wmissing-braces"
+# pragma clang diagnostic ignored "-Wshadow"
+# pragma clang diagnostic ignored "-Wunused-local-typedef"
+# pragma clang diagnostic ignored "-Wunused-function"
+# pragma clang diagnostic ignored "-Wunused-variable"
+# pragma clang diagnostic ignored "-Wunused-parameter"
+# pragma clang diagnostic ignored "-Wsometimes-uninitialized"
+#elif defined POSH_COMPILER_GCC
+# define NV_CC_GNUC 1
+# define NV_CC_STRING "gcc"
+# pragma GCC diagnostic ignored "-Wshadow"
+# pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
+# pragma GCC diagnostic ignored "-Wunused-function"
+# pragma GCC diagnostic ignored "-Wunused-but-set-variable"
+# pragma GCC diagnostic ignored "-Wunused-variable"
+# pragma GCC diagnostic ignored "-Wunused-parameter"
+# pragma GCC diagnostic ignored "-Warray-bounds"
+#elif defined POSH_COMPILER_MSVC
+# define NV_CC_MSVC 1
+# define NV_CC_STRING "msvc"
+#else
+# error "Unsupported compiler"
+#endif
+
+#ifndef NV_CC_GNUC
+# define NV_CC_GNUC 0
+#endif // NV_CC_GNUC
+
+#ifndef NV_CC_MSVC
+# define NV_CC_MSVC 0
+#endif // NV_CC_MSVC
+
+#ifndef NV_CC_CLANG
+# define NV_CC_CLANG 0
+#endif // NV_CC_CLANG
+
+#if NV_CC_MSVC
+#define NV_CC_CPP11 (__cplusplus > 199711L || _MSC_VER >= 1800) // Visual Studio 2013 has all the features we use, but doesn't advertise full C++11 support yet.
+#else
+// @@ IC: This works in CLANG, about GCC?
+// @@ ES: Doesn't work in gcc. These 3 features are available in GCC >= 4.4.
+#ifdef __clang__
+#define NV_CC_CPP11 (__has_feature(cxx_deleted_functions) && __has_feature(cxx_rvalue_references) && __has_feature(cxx_static_assert))
+#elif defined __GNUC__
+#define NV_CC_CPP11 ( __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+#endif
+#endif
+
+// Endiannes:
+#define NV_LITTLE_ENDIAN POSH_LITTLE_ENDIAN
+#define NV_BIG_ENDIAN POSH_BIG_ENDIAN
+#define NV_ENDIAN_STRING POSH_ENDIAN_STRING
+
+
+// Type definitions:
+typedef posh_u8_t uint8;
+typedef posh_i8_t int8;
+
+typedef posh_u16_t uint16;
+typedef posh_i16_t int16;
+
+typedef posh_u32_t uint32;
+typedef posh_i32_t int32;
+
+typedef posh_u64_t uint64;
+typedef posh_i64_t int64;
+
+// Aliases
+typedef uint32 uint;
+
+
+// Version string:
+#define NV_VERSION_STRING \
+ NV_OS_STRING "/" NV_CC_STRING "/" NV_CPU_STRING"/" \
+ NV_ENDIAN_STRING"-endian - " __DATE__ "-" __TIME__
+
+
+// Disable copy constructor and assignment operator.
+#if NV_CC_CPP11
+#define NV_FORBID_COPY(C) \
+ C( const C & ) = delete; \
+ C &operator=( const C & ) = delete
+#else
+#define NV_FORBID_COPY(C) \
+ private: \
+ C( const C & ); \
+ C &operator=( const C & )
+#endif
+
+// Disable dynamic allocation on the heap.
+// See Prohibiting Heap-Based Objects in More Effective C++.
+#define NV_FORBID_HEAPALLOC() \
+ private: \
+ void *operator new(size_t size); \
+ void *operator new[](size_t size)
+
+// String concatenation macros.
+#define NV_STRING_JOIN2(arg1, arg2) NV_DO_STRING_JOIN2(arg1, arg2)
+#define NV_DO_STRING_JOIN2(arg1, arg2) arg1 ## arg2
+#define NV_STRING_JOIN3(arg1, arg2, arg3) NV_DO_STRING_JOIN3(arg1, arg2, arg3)
+#define NV_DO_STRING_JOIN3(arg1, arg2, arg3) arg1 ## arg2 ## arg3
+#define NV_STRING2(x) #x
+#define NV_STRING(x) NV_STRING2(x)
+
+#if NV_CC_MSVC
+#define NV_MULTI_LINE_MACRO_BEGIN do {
+#define NV_MULTI_LINE_MACRO_END \
+ __pragma(warning(push)) \
+ __pragma(warning(disable:4127)) \
+ } while(false) \
+ __pragma(warning(pop))
+#else
+#define NV_MULTI_LINE_MACRO_BEGIN do {
+#define NV_MULTI_LINE_MACRO_END } while(false)
+#endif
+
+#if NV_CC_CPP11
+#define nvStaticCheck(x) static_assert((x), "Static assert "#x" failed")
+#else
+#define nvStaticCheck(x) typedef char NV_STRING_JOIN2(__static_assert_,__LINE__)[(x)]
+#endif
+#define NV_COMPILER_CHECK(x) nvStaticCheck(x) // I like this name best.
+
+// Make sure type definitions are fine.
+NV_COMPILER_CHECK(sizeof(int8) == 1);
+NV_COMPILER_CHECK(sizeof(uint8) == 1);
+NV_COMPILER_CHECK(sizeof(int16) == 2);
+NV_COMPILER_CHECK(sizeof(uint16) == 2);
+NV_COMPILER_CHECK(sizeof(int32) == 4);
+NV_COMPILER_CHECK(sizeof(uint32) == 4);
+NV_COMPILER_CHECK(sizeof(int32) == 4);
+NV_COMPILER_CHECK(sizeof(uint32) == 4);
+
+
+#define NV_ARRAY_SIZE(x) (sizeof(x)/sizeof((x)[0]))
+
+#if 0 // Disabled in The Witness.
+#if NV_CC_MSVC
+#define NV_MESSAGE(x) message(__FILE__ "(" NV_STRING(__LINE__) ") : " x)
+#else
+#define NV_MESSAGE(x) message(x)
+#endif
+#else
+#define NV_MESSAGE(x)
+#endif
+
+
+// Startup initialization macro.
+#define NV_AT_STARTUP(some_code) \
+ namespace { \
+ static struct NV_STRING_JOIN2(AtStartup_, __LINE__) { \
+ NV_STRING_JOIN2(AtStartup_, __LINE__)() { some_code; } \
+ } \
+ NV_STRING_JOIN3(AtStartup_, __LINE__, Instance); \
+ }
+
+// Indicate the compiler that the parameter is not used to suppress compier warnings.
+#define NV_UNUSED(a) ((a)=(a))
+
+// Null index. @@ Move this somewhere else... it's only used by nvmesh.
+//const unsigned int NIL = unsigned int(~0);
+//#define NIL uint(~0)
+
+// Null pointer.
+#ifndef NULL
+#define NULL 0
+#endif
+
+// Platform includes
+#if NV_CC_MSVC
+# if NV_OS_WIN32
+# include "defsvcwin32.h"
+# elif NV_OS_XBOX
+# include "defsvcxbox.h"
+# else
+# error "MSVC: Platform not supported"
+# endif
+#elif NV_CC_GNUC
+# if NV_OS_LINUX
+# include "defsgnuclinux.h"
+# elif NV_OS_DARWIN || NV_OS_FREEBSD || NV_OS_OPENBSD
+# include "defsgnucdarwin.h"
+# elif NV_OS_MINGW
+# include "defsgnucwin32.h"
+# elif NV_OS_CYGWIN
+# error "GCC: Cygwin not supported"
+# else
+# error "GCC: Platform not supported"
+# endif
+#endif
+
+#endif // NV_CORE_H
diff --git a/3rdparty/bgfx/3rdparty/nvtt/nvcore/posh.h b/3rdparty/bgfx/3rdparty/nvtt/nvcore/posh.h
new file mode 100644
index 00000000000..e401fb8f498
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/nvtt/nvcore/posh.h
@@ -0,0 +1,1030 @@
+/**
+@file posh.h
+@author Brian Hook
+@version 1.3.001
+
+Header file for POSH, the Portable Open Source Harness project.
+
+NOTE: Unlike most header files, this one is designed to be included
+multiple times, which is why it does not have the @#ifndef/@#define
+preamble.
+
+POSH relies on environment specified preprocessor symbols in order
+to infer as much as possible about the target OS/architecture and
+the host compiler capabilities.
+
+NOTE: POSH is simple and focused. It attempts to provide basic
+functionality and information, but it does NOT attempt to emulate
+missing functionality. I am also not willing to make POSH dirty
+and hackish to support truly ancient and/or outmoded and/or bizarre
+technologies such as non-ANSI compilers, systems with non-IEEE
+floating point formats, segmented 16-bit operating systems, etc.
+
+Please refer to the accompanying HTML documentation or visit
+http://www.poshlib.org for more information on how to use POSH.
+
+LICENSE:
+
+Copyright (c) 2004, Brian Hook
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+
+ * The names of this package'ss contributors contributors may not
+ be used to endorse or promote products derived from this
+ software without specific prior written permission.
+
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+REVISION:
+
+I've been lax about revision histories, so this starts at, um, 1.3.001.
+Sorry for any inconveniences.
+
+1.3.001 - 2/23/2006 - Incorporated fix for bug reported by Bill Cary,
+ where I was not detecting Visual Studio
+ compilation on x86-64 systems. Added check for
+ _M_X64 which should fix that.
+
+*/
+/*
+I have yet to find an authoritative reference on preprocessor
+symbols, but so far this is what I've gleaned:
+
+GNU GCC/G++:
+ - __GNUC__: GNU C version
+ - __GNUG__: GNU C++ compiler
+ - __sun__ : on Sun platforms
+ - __svr4__: on Solaris and other SysV R4 platforms
+ - __mips__: on MIPS processor platforms
+ - __sparc_v9__: on Sparc 64-bit CPUs
+ - __sparcv9: 64-bit Solaris
+ - __MIPSEL__: mips processor, compiled for little endian
+ - __MIPSEB__: mips processor, compiled for big endian
+ - _R5900: MIPS/Sony/Toshiba R5900 (PS2)
+ - mc68000: 68K
+ - m68000: 68K
+ - m68k: 68K
+ - __palmos__: PalmOS
+
+Intel C/C++ Compiler:
+ - __ECC : compiler version, IA64 only
+ - __EDG__
+ - __ELF__
+ - __GXX_ABI_VERSION
+ - __i386 : IA-32 only
+ - __i386__ : IA-32 only
+ - i386 : IA-32 only
+ - __ia64 : IA-64 only
+ - __ia64__ : IA-64 only
+ - ia64 : IA-64 only
+ - __ICC : IA-32 only
+ - __INTEL_COMPILER : IA-32 or IA-64, newer versions only
+
+Apple's C/C++ Compiler for OS X:
+ - __APPLE_CC__
+ - __APPLE__
+ - __BIG_ENDIAN__
+ - __APPLE__
+ - __ppc__
+ - __MACH__
+
+DJGPP:
+ - __MSDOS__
+ - __unix__
+ - __unix
+ - __GNUC__
+ - __GO32
+ - DJGPP
+ - __i386, __i386, i386
+
+Cray's C compiler:
+ - _ADDR64: if 64-bit pointers
+ - _UNICOS:
+ - __unix:
+
+SGI's CC compiler predefines the following (and more) with -ansi:
+ - __sgi
+ - __unix
+ - __host_mips
+ - _SYSTYPE_SVR4
+ - __mips
+ - _MIPSEB
+ - anyone know if there is a predefined symbol for the compiler?!
+
+MinGW:
+ - as GnuC but also defines _WIN32, __WIN32, WIN32, _X86_, __i386, __i386__, and several others
+ - __MINGW32__
+
+Cygwin:
+ - as Gnu C, but also
+ - __unix__
+ - __CYGWIN32__
+
+Microsoft Visual Studio predefines the following:
+ - _MSC_VER
+ - _WIN32: on Win32
+ - _M_IX6 (on x86 systems)
+ - _M_X64: on x86-64 systems
+ - _M_ALPHA (on DEC AXP systems)
+ - _SH3: WinCE, Hitachi SH-3
+ - _MIPS: WinCE, MIPS
+ - _ARM: WinCE, ARM
+
+Sun's C Compiler:
+ - sun and _sun
+ - unix and _unix
+ - sparc and _sparc (SPARC systems only)
+ - i386 and _i386 (x86 systems only)
+ - __SVR4 (Solaris only)
+ - __sparcv9: 64-bit solaris
+ - __SUNPRO_C
+ - _LP64: defined in 64-bit LP64 mode, but only if <sys/types.h> is included
+
+Borland C/C++ predefines the following:
+ - __BORLANDC__:
+
+DEC/Compaq C/C++ on Alpha:
+ - __alpha
+ - __arch64__
+ - __unix__ (on Tru64 Unix)
+ - __osf__
+ - __DECC
+ - __DECCXX (C++ compilation)
+ - __DECC_VER
+ - __DECCXX_VER
+
+IBM's AIX compiler:
+ - __64BIT__ if 64-bit mode
+ - _AIX
+ - __IBMC__: C compiler version
+ - __IBMCPP__: C++ compiler version
+ - _LONG_LONG: compiler allows long long
+
+Watcom:
+ - __WATCOMC__
+ - __DOS__ : if targeting DOS
+ - __386__ : if 32-bit support
+ - __WIN32__ : if targetin 32-bit Windows
+
+HP-UX C/C++ Compiler:
+ - __hpux
+ - __unix
+ - __hppa (on PA-RISC)
+ - __LP64__: if compiled in 64-bit mode
+
+Metrowerks:
+ - __MWERKS__
+ - __powerpc__
+ - _powerc
+ - __MC68K__
+ - macintosh when compiling for MacOS
+ - __INTEL__ for x86 targets
+ - __POWERPC__
+
+LLVM:
+ - __llvm__
+ - __clang__
+*/
+
+/*
+** ----------------------------------------------------------------------------
+** Include <limits.h> optionally
+** ----------------------------------------------------------------------------
+*/
+#ifdef POSH_USE_LIMITS_H
+# include <limits.h>
+#endif
+
+/*
+** ----------------------------------------------------------------------------
+** Determine compilation environment
+** ----------------------------------------------------------------------------
+*/
+#if defined __ECC || defined __ICC || defined __INTEL_COMPILER
+# define POSH_COMPILER_STRING "Intel C/C++"
+# define POSH_COMPILER_INTEL 1
+#endif
+
+#if ( defined __host_mips || defined __sgi ) && !defined __GNUC__
+# define POSH_COMPILER_STRING "MIPSpro C/C++"
+# define POSH_COMPILER_MIPSPRO 1
+#endif
+
+#if defined __hpux && !defined __GNUC__
+# define POSH_COMPILER_STRING "HP-UX CC"
+# define POSH_COMPILER_HPCC 1
+#endif
+
+#if defined __clang__
+# define POSH_COMPILER_STRING "Clang"
+# define POSH_COMPILER_CLANG 1
+#endif
+
+#if defined __GNUC__ && !defined __clang__
+# define POSH_COMPILER_STRING "Gnu GCC"
+# define POSH_COMPILER_GCC 1
+#endif
+
+#if defined __APPLE_CC__
+ /* we don't define the compiler string here, let it be GNU */
+# define POSH_COMPILER_APPLECC 1
+#endif
+
+#if defined __IBMC__ || defined __IBMCPP__
+# define POSH_COMPILER_STRING "IBM C/C++"
+# define POSH_COMPILER_IBM 1
+#endif
+
+#if defined _MSC_VER
+# define POSH_COMPILER_STRING "Microsoft Visual C++"
+# define POSH_COMPILER_MSVC 1
+#endif
+
+#if defined __SUNPRO_C
+# define POSH_COMPILER_STRING "Sun Pro"
+# define POSH_COMPILER_SUN 1
+#endif
+
+#if defined __BORLANDC__
+# define POSH_COMPILER_STRING "Borland C/C++"
+# define POSH_COMPILER_BORLAND 1
+#endif
+
+#if defined __MWERKS__
+# define POSH_COMPILER_STRING "MetroWerks CodeWarrior"
+# define POSH_COMPILER_METROWERKS 1
+#endif
+
+#if defined __DECC || defined __DECCXX
+# define POSH_COMPILER_STRING "Compaq/DEC C/C++"
+# define POSH_COMPILER_DEC 1
+#endif
+
+#if defined __WATCOMC__
+# define POSH_COMPILER_STRING "Watcom C/C++"
+# define POSH_COMPILER_WATCOM 1
+#endif
+
+#if !defined POSH_COMPILER_STRING
+# define POSH_COMPILER_STRING "Unknown compiler"
+#endif
+
+/*
+** ----------------------------------------------------------------------------
+** Determine target operating system
+** ----------------------------------------------------------------------------
+*/
+#if defined linux || defined __linux__
+# define POSH_OS_LINUX 1
+# define POSH_OS_STRING "Linux"
+#endif
+
+#if defined __FreeBSD__
+# define POSH_OS_FREEBSD 1
+# define POSH_OS_STRING "FreeBSD"
+#endif
+
+#if defined __OpenBSD__
+# define POSH_OS_OPENBSD 1
+# define POSH_OS_STRING "OpenBSD"
+#endif
+
+#if defined __CYGWIN32__
+# define POSH_OS_CYGWIN32 1
+# define POSH_OS_STRING "Cygwin"
+#endif
+
+#if defined GEKKO
+# define POSH_OS_GAMECUBE
+# define __powerpc__
+# define POSH_OS_STRING "GameCube"
+#endif
+
+#if defined __MINGW32__
+# define POSH_OS_MINGW 1
+# define POSH_OS_STRING "MinGW"
+#endif
+
+#if defined GO32 && defined DJGPP && defined __MSDOS__
+# define POSH_OS_GO32 1
+# define POSH_OS_STRING "GO32/MS-DOS"
+#endif
+
+/* NOTE: make sure you use /bt=DOS if compiling for 32-bit DOS,
+ otherwise Watcom assumes host=target */
+#if defined __WATCOMC__ && defined __386__ && defined __DOS__
+# define POSH_OS_DOS32 1
+# define POSH_OS_STRING "DOS/32-bit"
+#endif
+
+#if defined _UNICOS
+# define POSH_OS_UNICOS 1
+# define POSH_OS_STRING "UNICOS"
+#endif
+
+#if ( defined __MWERKS__ && defined __powerc && !defined macintosh ) || defined __APPLE_CC__ || defined macosx
+# define POSH_OS_OSX 1
+# define POSH_OS_STRING "MacOS X"
+#endif
+
+#if defined __sun__ || defined sun || defined __sun || defined __solaris__
+# if defined __SVR4 || defined __svr4__ || defined __solaris__
+# define POSH_OS_STRING "Solaris"
+# define POSH_OS_SOLARIS 1
+# endif
+# if !defined POSH_OS_STRING
+# define POSH_OS_STRING "SunOS"
+# define POSH_OS_SUNOS 1
+# endif
+#endif
+
+#if defined __sgi__ || defined sgi || defined __sgi
+# define POSH_OS_IRIX 1
+# define POSH_OS_STRING "Irix"
+#endif
+
+#if defined __hpux__ || defined __hpux
+# define POSH_OS_HPUX 1
+# define POSH_OS_STRING "HP-UX"
+#endif
+
+#if defined _AIX
+# define POSH_OS_AIX 1
+# define POSH_OS_STRING "AIX"
+#endif
+
+#if ( defined __alpha && defined __osf__ )
+# define POSH_OS_TRU64 1
+# define POSH_OS_STRING "Tru64"
+#endif
+
+#if defined __BEOS__ || defined __beos__
+# define POSH_OS_BEOS 1
+# define POSH_OS_STRING "BeOS"
+#endif
+
+#if defined amiga || defined amigados || defined AMIGA || defined _AMIGA
+# define POSH_OS_AMIGA 1
+# define POSH_OS_STRING "Amiga"
+#endif
+
+#if defined __unix__
+# define POSH_OS_UNIX 1
+# if !defined POSH_OS_STRING
+# define POSH_OS_STRING "Unix-like(generic)"
+# endif
+#endif
+
+#if defined _WIN32_WCE
+# define POSH_OS_WINCE 1
+# define POSH_OS_STRING "Windows CE"
+#endif
+
+#if defined _XBOX || defined _XBOX_VER
+# define POSH_OS_XBOX 1
+# define POSH_OS_STRING "XBOX"
+#endif
+
+#if defined _WIN32 || defined WIN32 || defined __NT__ || defined __WIN32__
+# define POSH_OS_WIN32 1
+# if !defined POSH_OS_XBOX
+# if defined _WIN64
+# define POSH_OS_WIN64 1
+# define POSH_OS_STRING "Win64"
+# else
+# if !defined POSH_OS_STRING
+# define POSH_OS_STRING "Win32"
+# endif
+# endif
+# endif
+#endif
+
+#if defined __palmos__
+# define POSH_OS_PALM 1
+# define POSH_OS_STRING "PalmOS"
+#endif
+
+#if defined THINK_C || defined macintosh
+# define POSH_OS_MACOS 1
+# define POSH_OS_STRING "MacOS"
+#endif
+
+/*
+** -----------------------------------------------------------------------------
+** Determine target CPU
+** -----------------------------------------------------------------------------
+*/
+
+#if defined GEKKO
+# define POSH_CPU_PPC750 1
+# define POSH_CPU_STRING "IBM PowerPC 750 (NGC)"
+#endif
+
+#if defined mc68000 || defined m68k || defined __MC68K__ || defined m68000
+# define POSH_CPU_68K 1
+# define POSH_CPU_STRING "MC68000"
+#endif
+
+#if defined __PPC__ || defined __POWERPC__ || defined powerpc || defined _POWER || defined __ppc__ || defined __powerpc__ || defined _M_PPC
+# define POSH_CPU_PPC 1
+# if !defined POSH_CPU_STRING
+# if defined __powerpc64__
+# define POSH_CPU_STRING "PowerPC64"
+# else
+# define POSH_CPU_STRING "PowerPC"
+# endif
+# endif
+#endif
+
+#if defined _CRAYT3E || defined _CRAYMPP
+# define POSH_CPU_CRAYT3E 1 /* target processor is a DEC Alpha 21164 used in a Cray T3E*/
+# define POSH_CPU_STRING "Cray T3E (Alpha 21164)"
+#endif
+
+#if defined CRAY || defined _CRAY && !defined _CRAYT3E
+# error Non-AXP Cray systems not supported
+#endif
+
+#if defined _SH3
+# define POSH_CPU_SH3 1
+# define POSH_CPU_STRING "Hitachi SH-3"
+#endif
+
+#if defined __sh4__ || defined __SH4__
+# define POSH_CPU_SH3 1
+# define POSH_CPU_SH4 1
+# define POSH_CPU_STRING "Hitachi SH-4"
+#endif
+
+#if defined __sparc__ || defined __sparc
+# if defined __arch64__ || defined __sparcv9 || defined __sparc_v9__
+# define POSH_CPU_SPARC64 1
+# define POSH_CPU_STRING "Sparc/64"
+# else
+# define POSH_CPU_STRING "Sparc/32"
+# endif
+# define POSH_CPU_SPARC 1
+#endif
+
+#if defined ARM || defined __arm__ || defined _ARM
+# define POSH_CPU_STRONGARM 1
+# define POSH_CPU_STRING "ARM"
+#endif
+
+#if defined __aarch64__
+# define POSH_CPU_AARCH64 1
+# define POSH_CPU_STRING "ARM64"
+#endif
+
+#if defined mips || defined __mips__ || defined __MIPS__ || defined _MIPS
+# define POSH_CPU_MIPS 1
+# if defined _R5900
+# define POSH_CPU_STRING "MIPS R5900 (PS2)"
+# else
+# define POSH_CPU_STRING "MIPS"
+# endif
+#endif
+
+#if defined __ia64 || defined _M_IA64 || defined __ia64__
+# define POSH_CPU_IA64 1
+# define POSH_CPU_STRING "IA64"
+#endif
+
+#if defined __X86__ || defined __i386__ || defined i386 || defined _M_IX86 || defined __386__ || defined __x86_64__ || defined _M_X64
+# define POSH_CPU_X86 1
+# if defined __x86_64__ || defined _M_X64
+# define POSH_CPU_X86_64 1
+# endif
+# if defined POSH_CPU_X86_64
+# define POSH_CPU_STRING "AMD x86-64"
+# else
+# define POSH_CPU_STRING "Intel 386+"
+# endif
+#endif
+
+#if defined __alpha || defined alpha || defined _M_ALPHA || defined __alpha__
+# define POSH_CPU_AXP 1
+# define POSH_CPU_STRING "AXP"
+#endif
+
+#if defined __hppa || defined hppa
+# define POSH_CPU_HPPA 1
+# define POSH_CPU_STRING "PA-RISC"
+#endif
+
+#if !defined POSH_CPU_STRING
+# error POSH cannot determine target CPU
+# define POSH_CPU_STRING "Unknown" /* this is here for Doxygen's benefit */
+#endif
+
+/*
+** -----------------------------------------------------------------------------
+** Attempt to autodetect building for embedded on Sony PS2
+** -----------------------------------------------------------------------------
+*/
+#if !defined POSH_OS_STRING
+# if !defined FORCE_DOXYGEN
+# define POSH_OS_EMBEDDED 1
+# endif
+# if defined _R5900
+# define POSH_OS_STRING "Sony PS2(embedded)"
+# else
+# define POSH_OS_STRING "Embedded/Unknown"
+# endif
+#endif
+
+/*
+** ---------------------------------------------------------------------------
+** Handle cdecl, stdcall, fastcall, etc.
+** ---------------------------------------------------------------------------
+*/
+#if defined POSH_CPU_X86 && !defined POSH_CPU_X86_64
+# if defined __GNUC__
+# define POSH_CDECL __attribute__((cdecl))
+# define POSH_STDCALL __attribute__((stdcall))
+# define POSH_FASTCALL __attribute__((fastcall))
+# elif ( defined _MSC_VER || defined __WATCOMC__ || defined __BORLANDC__ || defined __MWERKS__ )
+# define POSH_CDECL __cdecl
+# define POSH_STDCALL __stdcall
+# define POSH_FASTCALL __fastcall
+# endif
+#else
+# define POSH_CDECL
+# define POSH_STDCALL
+# define POSH_FASTCALL
+#endif
+
+/*
+** ---------------------------------------------------------------------------
+** Define POSH_IMPORTEXPORT signature based on POSH_DLL and POSH_BUILDING_LIB
+** ---------------------------------------------------------------------------
+*/
+
+/*
+** We undefine this so that multiple inclusions will work
+*/
+#if defined POSH_IMPORTEXPORT
+# undef POSH_IMPORTEXPORT
+#endif
+
+#if defined POSH_DLL
+# if defined POSH_OS_WIN32
+# if defined _MSC_VER
+# if ( _MSC_VER >= 800 )
+# if defined POSH_BUILDING_LIB
+# define POSH_IMPORTEXPORT __declspec( dllexport )
+# else
+# define POSH_IMPORTEXPORT __declspec( dllimport )
+# endif
+# else
+# if defined POSH_BUILDING_LIB
+# define POSH_IMPORTEXPORT __export
+# else
+# define POSH_IMPORTEXPORT
+# endif
+# endif
+# endif /* defined _MSC_VER */
+# if defined __BORLANDC__
+# if ( __BORLANDC__ >= 0x500 )
+# if defined POSH_BUILDING_LIB
+# define POSH_IMPORTEXPORT __declspec( dllexport )
+# else
+# define POSH_IMPORTEXPORT __declspec( dllimport )
+# endif
+# else
+# if defined POSH_BUILDING_LIB
+# define POSH_IMPORTEXPORT __export
+# else
+# define POSH_IMPORTEXPORT
+# endif
+# endif
+# endif /* defined __BORLANDC__ */
+ /* for all other compilers, we're just making a blanket assumption */
+# if defined __GNUC__ || defined __WATCOMC__ || defined __MWERKS__
+# if defined POSH_BUILDING_LIB
+# define POSH_IMPORTEXPORT __declspec( dllexport )
+# else
+# define POSH_IMPORTEXPORT __declspec( dllimport )
+# endif
+# endif /* all other compilers */
+# if !defined POSH_IMPORTEXPORT
+# error Building DLLs not supported on this compiler (poshlib@poshlib.org if you know how)
+# endif
+# endif /* defined POSH_OS_WIN32 */
+#endif
+
+/* On pretty much everything else, we can thankfully just ignore this */
+#if !defined POSH_IMPORTEXPORT
+# define POSH_IMPORTEXPORT
+#endif
+
+#if defined FORCE_DOXYGEN
+# define POSH_DLL
+# define POSH_BUILDING_LIB
+# undef POSH_DLL
+# undef POSH_BUILDING_LIB
+#endif
+
+/*
+** ----------------------------------------------------------------------------
+** (Re)define POSH_PUBLIC_API export signature
+** ----------------------------------------------------------------------------
+*/
+#ifdef POSH_PUBLIC_API
+# undef POSH_PUBLIC_API
+#endif
+
+#if ( ( defined _MSC_VER ) && ( _MSC_VER < 800 ) ) || ( defined __BORLANDC__ && ( __BORLANDC__ < 0x500 ) )
+# define POSH_PUBLIC_API(rtype) extern rtype POSH_IMPORTEXPORT
+#else
+# define POSH_PUBLIC_API(rtype) extern POSH_IMPORTEXPORT rtype
+#endif
+
+/*
+** ----------------------------------------------------------------------------
+** Try to infer endianess. Basically we just go through the CPUs we know are
+** little endian, and assume anything that isn't one of those is big endian.
+** As a sanity check, we also do this with operating systems we know are
+** little endian, such as Windows. Some processors are bi-endian, such as
+** the MIPS series, so we have to be careful about those.
+** ----------------------------------------------------------------------------
+*/
+#if defined POSH_CPU_X86 || defined POSH_CPU_AXP || defined POSH_CPU_STRONGARM || defined POSH_CPU_AARCH64 || defined POSH_OS_WIN32 || defined POSH_OS_WINCE || defined __MIPSEL__
+# define POSH_ENDIAN_STRING "little"
+# define POSH_LITTLE_ENDIAN 1
+#else
+# define POSH_ENDIAN_STRING "big"
+# define POSH_BIG_ENDIAN 1
+#endif
+
+#if defined FORCE_DOXYGEN
+# define POSH_LITTLE_ENDIAN
+#endif
+
+/*
+** ----------------------------------------------------------------------------
+** Cross-platform compile time assertion macro
+** ----------------------------------------------------------------------------
+*/
+#define POSH_COMPILE_TIME_ASSERT(name, x) typedef int _POSH_dummy_ ## name[(x) ? 1 : -1 ]
+
+/*
+** ----------------------------------------------------------------------------
+** 64-bit Integer
+**
+** We don't require 64-bit support, nor do we emulate its functionality, we
+** simply export it if it's available. Since we can't count on <limits.h>
+** for 64-bit support, we ignore the POSH_USE_LIMITS_H directive.
+** ----------------------------------------------------------------------------
+*/
+#if defined ( __LP64__ ) || defined ( __powerpc64__ ) || defined POSH_CPU_SPARC64
+# define POSH_64BIT_INTEGER 1
+typedef long posh_i64_t;
+typedef unsigned long posh_u64_t;
+# define POSH_I64( x ) ((posh_i64_t)x)
+# define POSH_U64( x ) ((posh_u64_t)x)
+# define POSH_I64_PRINTF_PREFIX "l"
+#elif defined _MSC_VER || defined __BORLANDC__ || defined __WATCOMC__ || ( defined __alpha && defined __DECC )
+# define POSH_64BIT_INTEGER 1
+typedef __int64 posh_i64_t;
+typedef unsigned __int64 posh_u64_t;
+# define POSH_I64( x ) ((posh_i64_t)(x##i64))
+# define POSH_U64( x ) ((posh_u64_t)(x##ui64))
+# define POSH_I64_PRINTF_PREFIX "I64"
+#elif defined __GNUC__ || defined __MWERKS__ || defined __SUNPRO_C || defined __SUNPRO_CC || defined __APPLE_CC__ || defined POSH_OS_IRIX || defined _LONG_LONG || defined _CRAYC
+# define POSH_64BIT_INTEGER 1
+typedef long long posh_i64_t;
+typedef unsigned long long posh_u64_t;
+# define POSH_U64( x ) ((posh_u64_t)(x##LL))
+# define POSH_I64( x ) ((posh_i64_t)(x##LL))
+# define POSH_I64_PRINTF_PREFIX "ll"
+#endif
+
+/* hack */
+/*#ifdef __MINGW32__
+#undef POSH_I64
+#undef POSH_U64
+#undef POSH_I64_PRINTF_PREFIX
+#define POSH_I64( x ) ((posh_i64_t)x)
+#define POSH_U64( x ) ((posh_u64_t)x)
+#define POSH_I64_PRINTF_PREFIX "I64"
+#endif*/
+
+#ifdef FORCE_DOXYGEN
+typedef long long posh_i64_t;
+typedef unsigned long posh_u64_t;
+# define POSH_64BIT_INTEGER
+# define POSH_I64_PRINTF_PREFIX
+# define POSH_I64(x)
+# define POSH_U64(x)
+#endif
+
+/** Minimum value for a 64-bit signed integer */
+#define POSH_I64_MIN POSH_I64(0x8000000000000000)
+/** Maximum value for a 64-bit signed integer */
+#define POSH_I64_MAX POSH_I64(0x7FFFFFFFFFFFFFFF)
+/** Minimum value for a 64-bit unsigned integer */
+#define POSH_U64_MIN POSH_U64(0)
+/** Maximum value for a 64-bit unsigned integer */
+#define POSH_U64_MAX POSH_U64(0xFFFFFFFFFFFFFFFF)
+
+/* ----------------------------------------------------------------------------
+** Basic Sized Types
+**
+** These types are expected to be EXACTLY sized so you can use them for
+** serialization.
+** ----------------------------------------------------------------------------
+*/
+#define POSH_FALSE 0
+#define POSH_TRUE 1
+
+typedef int posh_bool_t;
+typedef unsigned char posh_byte_t;
+
+/* NOTE: These assume that CHAR_BIT is 8!! */
+typedef unsigned char posh_u8_t;
+typedef signed char posh_i8_t;
+
+#if defined POSH_USE_LIMITS_H
+# if CHAR_BITS > 8
+# error This machine uses 9-bit characters. This is a warning, you can comment this out now.
+# endif /* CHAR_BITS > 8 */
+
+/* 16-bit */
+# if ( USHRT_MAX == 65535 )
+ typedef unsigned short posh_u16_t;
+ typedef short posh_i16_t;
+# else
+ /* Yes, in theory there could still be a 16-bit character type and shorts are
+ 32-bits in size...if you find such an architecture, let me know =P */
+# error No 16-bit type found
+# endif
+
+/* 32-bit */
+# if ( INT_MAX == 2147483647 )
+ typedef unsigned posh_u32_t;
+ typedef int posh_i32_t;
+# elif ( LONG_MAX == 2147483647 )
+ typedef unsigned long posh_u32_t;
+ typedef long posh_i32_t;
+# else
+ error No 32-bit type found
+# endif
+
+#else /* POSH_USE_LIMITS_H */
+
+ typedef unsigned short posh_u16_t;
+ typedef short posh_i16_t;
+
+# if !defined POSH_OS_PALM
+ typedef unsigned posh_u32_t;
+ typedef int posh_i32_t;
+# else
+ typedef unsigned long posh_u32_t;
+ typedef long posh_i32_t;
+# endif
+#endif
+
+/** Minimum value for a byte */
+#define POSH_BYTE_MIN 0
+/** Maximum value for an 8-bit unsigned value */
+#define POSH_BYTE_MAX 255
+/** Minimum value for a byte */
+#define POSH_I16_MIN ( ( posh_i16_t ) 0x8000 )
+/** Maximum value for a 16-bit signed value */
+#define POSH_I16_MAX ( ( posh_i16_t ) 0x7FFF )
+/** Minimum value for a 16-bit unsigned value */
+#define POSH_U16_MIN 0
+/** Maximum value for a 16-bit unsigned value */
+#define POSH_U16_MAX ( ( posh_u16_t ) 0xFFFF )
+/** Minimum value for a 32-bit signed value */
+#define POSH_I32_MIN ( ( posh_i32_t ) 0x80000000 )
+/** Maximum value for a 32-bit signed value */
+#define POSH_I32_MAX ( ( posh_i32_t ) 0x7FFFFFFF )
+/** Minimum value for a 32-bit unsigned value */
+#define POSH_U32_MIN 0
+/** Maximum value for a 32-bit unsigned value */
+#define POSH_U32_MAX ( ( posh_u32_t ) 0xFFFFFFFF )
+
+/*
+** ----------------------------------------------------------------------------
+** Sanity checks on expected sizes
+** ----------------------------------------------------------------------------
+*/
+#if !defined FORCE_DOXYGEN
+
+POSH_COMPILE_TIME_ASSERT(posh_byte_t, sizeof(posh_byte_t) == 1);
+POSH_COMPILE_TIME_ASSERT(posh_u8_t, sizeof(posh_u8_t) == 1);
+POSH_COMPILE_TIME_ASSERT(posh_i8_t, sizeof(posh_i8_t) == 1);
+POSH_COMPILE_TIME_ASSERT(posh_u16_t, sizeof(posh_u16_t) == 2);
+POSH_COMPILE_TIME_ASSERT(posh_i16_t, sizeof(posh_i16_t) == 2);
+POSH_COMPILE_TIME_ASSERT(posh_u32_t, sizeof(posh_u32_t) == 4);
+POSH_COMPILE_TIME_ASSERT(posh_i32_t, sizeof(posh_i32_t) == 4);
+
+#if !defined POSH_NO_FLOAT
+ POSH_COMPILE_TIME_ASSERT(posh_testfloat_t, sizeof(float)==4 );
+ POSH_COMPILE_TIME_ASSERT(posh_testdouble_t, sizeof(double)==8);
+#endif
+
+#if defined POSH_64BIT_INTEGER
+ POSH_COMPILE_TIME_ASSERT(posh_u64_t, sizeof(posh_u64_t) == 8);
+ POSH_COMPILE_TIME_ASSERT(posh_i64_t, sizeof(posh_i64_t) == 8);
+#endif
+
+#endif
+
+/*
+** ----------------------------------------------------------------------------
+** 64-bit pointer support
+** ----------------------------------------------------------------------------
+*/
+#if defined POSH_CPU_AXP && ( defined POSH_OS_TRU64 || defined POSH_OS_LINUX )
+# define POSH_64BIT_POINTER 1
+#endif
+
+#if defined POSH_CPU_X86_64 && defined POSH_OS_LINUX
+# define POSH_64BIT_POINTER 1
+#endif
+
+#if defined POSH_CPU_SPARC64 || defined POSH_OS_WIN64 || defined __64BIT__ || defined __LP64 || defined _LP64 || defined __LP64__ || defined _ADDR64 || defined _CRAYC
+# define POSH_64BIT_POINTER 1
+#endif
+
+#if defined POSH_64BIT_POINTER
+ POSH_COMPILE_TIME_ASSERT( posh_64bit_pointer, sizeof( void * ) == 8 );
+#elif !defined FORCE_DOXYGEN
+/* if this assertion is hit then you're on a system that either has 64-bit
+ addressing and we didn't catch it, or you're on a system with 16-bit
+ pointers. In the latter case, POSH doesn't actually care, we're just
+ triggering this assertion to make sure you're aware of the situation,
+ so feel free to delete it.
+
+ If this assertion is triggered on a known 32 or 64-bit platform,
+ please let us know (poshlib@poshlib.org) */
+ POSH_COMPILE_TIME_ASSERT( posh_32bit_pointer, sizeof( void * ) == 4 );
+#endif
+
+#if defined FORCE_DOXYGEN
+# define POSH_64BIT_POINTER
+#endif
+
+/*
+** ----------------------------------------------------------------------------
+** POSH Utility Functions
+**
+** These are optional POSH utility functions that are not required if you don't
+** need anything except static checking of your host and target environment.
+**
+** These functions are NOT wrapped with POSH_PUBLIC_API because I didn't want
+** to enforce their export if your own library is only using them internally.
+** ----------------------------------------------------------------------------
+*/
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+const char *POSH_GetArchString( void );
+
+#if !defined POSH_NO_FLOAT
+
+posh_u32_t POSH_LittleFloatBits( float f );
+posh_u32_t POSH_BigFloatBits( float f );
+float POSH_FloatFromLittleBits( posh_u32_t bits );
+float POSH_FloatFromBigBits( posh_u32_t bits );
+
+void POSH_DoubleBits( double d, posh_byte_t dst[ 8 ] );
+double POSH_DoubleFromBits( const posh_byte_t src[ 8 ] );
+
+/* unimplemented
+float *POSH_WriteFloatToLittle( void *dst, float f );
+float *POSH_WriteFloatToBig( void *dst, float f );
+float POSH_ReadFloatFromLittle( const void *src );
+float POSH_ReadFloatFromBig( const void *src );
+
+double *POSH_WriteDoubleToLittle( void *dst, double d );
+double *POSH_WriteDoubleToBig( void *dst, double d );
+double POSH_ReadDoubleFromLittle( const void *src );
+double POSH_ReadDoubleFromBig( const void *src );
+*/
+#endif /* !defined POSH_NO_FLOAT */
+
+#if defined FORCE_DOXYGEN
+# define POSH_NO_FLOAT
+# undef POSH_NO_FLOAT
+#endif
+
+extern posh_u16_t POSH_SwapU16( posh_u16_t u );
+extern posh_i16_t POSH_SwapI16( posh_i16_t u );
+extern posh_u32_t POSH_SwapU32( posh_u32_t u );
+extern posh_i32_t POSH_SwapI32( posh_i32_t u );
+
+#if defined POSH_64BIT_INTEGER
+
+extern posh_u64_t POSH_SwapU64( posh_u64_t u );
+extern posh_i64_t POSH_SwapI64( posh_i64_t u );
+
+#endif /*POSH_64BIT_INTEGER */
+
+extern posh_u16_t *POSH_WriteU16ToLittle( void *dst, posh_u16_t value );
+extern posh_i16_t *POSH_WriteI16ToLittle( void *dst, posh_i16_t value );
+extern posh_u32_t *POSH_WriteU32ToLittle( void *dst, posh_u32_t value );
+extern posh_i32_t *POSH_WriteI32ToLittle( void *dst, posh_i32_t value );
+
+extern posh_u16_t *POSH_WriteU16ToBig( void *dst, posh_u16_t value );
+extern posh_i16_t *POSH_WriteI16ToBig( void *dst, posh_i16_t value );
+extern posh_u32_t *POSH_WriteU32ToBig( void *dst, posh_u32_t value );
+extern posh_i32_t *POSH_WriteI32ToBig( void *dst, posh_i32_t value );
+
+extern posh_u16_t POSH_ReadU16FromLittle( const void *src );
+extern posh_i16_t POSH_ReadI16FromLittle( const void *src );
+extern posh_u32_t POSH_ReadU32FromLittle( const void *src );
+extern posh_i32_t POSH_ReadI32FromLittle( const void *src );
+
+extern posh_u16_t POSH_ReadU16FromBig( const void *src );
+extern posh_i16_t POSH_ReadI16FromBig( const void *src );
+extern posh_u32_t POSH_ReadU32FromBig( const void *src );
+extern posh_i32_t POSH_ReadI32FromBig( const void *src );
+
+#if defined POSH_64BIT_INTEGER
+extern posh_u64_t *POSH_WriteU64ToLittle( void *dst, posh_u64_t value );
+extern posh_i64_t *POSH_WriteI64ToLittle( void *dst, posh_i64_t value );
+extern posh_u64_t *POSH_WriteU64ToBig( void *dst, posh_u64_t value );
+extern posh_i64_t *POSH_WriteI64ToBig( void *dst, posh_i64_t value );
+
+extern posh_u64_t POSH_ReadU64FromLittle( const void *src );
+extern posh_i64_t POSH_ReadI64FromLittle( const void *src );
+extern posh_u64_t POSH_ReadU64FromBig( const void *src );
+extern posh_i64_t POSH_ReadI64FromBig( const void *src );
+#endif /* POSH_64BIT_INTEGER */
+
+#if defined POSH_LITTLE_ENDIAN
+
+# define POSH_LittleU16(x) (x)
+# define POSH_LittleU32(x) (x)
+# define POSH_LittleI16(x) (x)
+# define POSH_LittleI32(x) (x)
+# if defined POSH_64BIT_INTEGER
+# define POSH_LittleU64(x) (x)
+# define POSH_LittleI64(x) (x)
+# endif /* defined POSH_64BIT_INTEGER */
+
+# define POSH_BigU16(x) POSH_SwapU16(x)
+# define POSH_BigU32(x) POSH_SwapU32(x)
+# define POSH_BigI16(x) POSH_SwapI16(x)
+# define POSH_BigI32(x) POSH_SwapI32(x)
+# if defined POSH_64BIT_INTEGER
+# define POSH_BigU64(x) POSH_SwapU64(x)
+# define POSH_BigI64(x) POSH_SwapI64(x)
+# endif /* defined POSH_64BIT_INTEGER */
+
+#else
+
+# define POSH_BigU16(x) (x)
+# define POSH_BigU32(x) (x)
+# define POSH_BigI16(x) (x)
+# define POSH_BigI32(x) (x)
+
+# if defined POSH_64BIT_INTEGER
+# define POSH_BigU64(x) (x)
+# define POSH_BigI64(x) (x)
+# endif /* POSH_64BIT_INTEGER */
+
+# define POSH_LittleU16(x) POSH_SwapU16(x)
+# define POSH_LittleU32(x) POSH_SwapU32(x)
+# define POSH_LittleI16(x) POSH_SwapI16(x)
+# define POSH_LittleI32(x) POSH_SwapI32(x)
+
+# if defined POSH_64BIT_INTEGER
+# define POSH_LittleU64(x) POSH_SwapU64(x)
+# define POSH_LittleI64(x) POSH_SwapI64(x)
+# endif /* POSH_64BIT_INTEGER */
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+
diff --git a/3rdparty/bgfx/3rdparty/nvtt/nvcore/stdstream.h b/3rdparty/bgfx/3rdparty/nvtt/nvcore/stdstream.h
new file mode 100644
index 00000000000..4f0a10a42b9
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/nvtt/nvcore/stdstream.h
@@ -0,0 +1,459 @@
+// This code is in the public domain -- Ignacio Castaño <castano@gmail.com>
+
+#include "nvcore.h"
+#include "stream.h"
+#include "array.h"
+
+#include <stdio.h> // fopen
+#include <string.h> // memcpy
+
+namespace nv
+{
+
+ // Portable version of fopen.
+ inline FILE * fileOpen(const char * fileName, const char * mode)
+ {
+ nvCheck(fileName != NULL);
+#if NV_CC_MSVC && _MSC_VER >= 1400
+ FILE * fp;
+ if (fopen_s(&fp, fileName, mode) == 0) {
+ return fp;
+ }
+ return NULL;
+#else
+ return fopen(fileName, mode);
+#endif
+ }
+
+
+ /// Base stdio stream.
+ class NVCORE_CLASS StdStream : public Stream
+ {
+ NV_FORBID_COPY(StdStream);
+ public:
+
+ /// Ctor.
+ StdStream( FILE * fp, bool autoclose ) : m_fp(fp), m_autoclose(autoclose) { }
+
+ /// Dtor.
+ virtual ~StdStream()
+ {
+ if( m_fp != NULL && m_autoclose ) {
+#if NV_OS_WIN32
+ _fclose_nolock( m_fp );
+#else
+ fclose( m_fp );
+#endif
+ }
+ }
+
+
+ /** @name Stream implementation. */
+ //@{
+ virtual void seek( uint pos )
+ {
+ nvDebugCheck(m_fp != NULL);
+ nvDebugCheck(pos <= size());
+#if NV_OS_WIN32
+ _fseek_nolock(m_fp, pos, SEEK_SET);
+#else
+ fseek(m_fp, pos, SEEK_SET);
+#endif
+ }
+
+ virtual uint tell() const
+ {
+ nvDebugCheck(m_fp != NULL);
+#if NV_OS_WIN32
+ return _ftell_nolock(m_fp);
+#else
+ return (uint)ftell(m_fp);
+#endif
+ }
+
+ virtual uint size() const
+ {
+ nvDebugCheck(m_fp != NULL);
+#if NV_OS_WIN32
+ uint pos = _ftell_nolock(m_fp);
+ _fseek_nolock(m_fp, 0, SEEK_END);
+ uint end = _ftell_nolock(m_fp);
+ _fseek_nolock(m_fp, pos, SEEK_SET);
+#else
+ uint pos = (uint)ftell(m_fp);
+ fseek(m_fp, 0, SEEK_END);
+ uint end = (uint)ftell(m_fp);
+ fseek(m_fp, pos, SEEK_SET);
+#endif
+ return end;
+ }
+
+ virtual bool isError() const
+ {
+ return m_fp == NULL || ferror( m_fp ) != 0;
+ }
+
+ virtual void clearError()
+ {
+ nvDebugCheck(m_fp != NULL);
+ clearerr(m_fp);
+ }
+
+ // @@ The original implementation uses feof, which only returns true when we attempt to read *past* the end of the stream.
+ // That is, if we read the last byte of a file, then isAtEnd would still return false, even though the stream pointer is at the file end. This is not the intent and was inconsistent with the implementation of the MemoryStream, a better
+ // implementation uses use ftell and fseek to determine our location within the file.
+ virtual bool isAtEnd() const
+ {
+ if (m_fp == NULL) return true;
+ //nvDebugCheck(m_fp != NULL);
+ //return feof( m_fp ) != 0;
+#if NV_OS_WIN32
+ uint pos = _ftell_nolock(m_fp);
+ _fseek_nolock(m_fp, 0, SEEK_END);
+ uint end = _ftell_nolock(m_fp);
+ _fseek_nolock(m_fp, pos, SEEK_SET);
+#else
+ uint pos = (uint)ftell(m_fp);
+ fseek(m_fp, 0, SEEK_END);
+ uint end = (uint)ftell(m_fp);
+ fseek(m_fp, pos, SEEK_SET);
+#endif
+ return pos == end;
+ }
+
+ /// Always true.
+ virtual bool isSeekable() const { return true; }
+ //@}
+
+ protected:
+
+ FILE * m_fp;
+ bool m_autoclose;
+
+ };
+
+
+ /// Standard output stream.
+ class NVCORE_CLASS StdOutputStream : public StdStream
+ {
+ NV_FORBID_COPY(StdOutputStream);
+ public:
+
+ /// Construct stream by file name.
+ StdOutputStream( const char * name ) : StdStream(fileOpen(name, "wb"), /*autoclose=*/true) { }
+
+ /// Construct stream by file handle.
+ StdOutputStream( FILE * fp, bool autoclose ) : StdStream(fp, autoclose)
+ {
+ }
+
+ /** @name Stream implementation. */
+ //@{
+ /// Write data.
+ virtual uint serialize( void * data, uint len )
+ {
+ nvDebugCheck(data != NULL);
+ nvDebugCheck(m_fp != NULL);
+#if NV_OS_WIN32
+ return (uint)_fwrite_nolock(data, 1, len, m_fp);
+#elif NV_OS_LINUX
+ return (uint)fwrite_unlocked(data, 1, len, m_fp);
+#elif NV_OS_DARWIN
+ // @@ No error checking, always returns len.
+ for (uint i = 0; i < len; i++) {
+ putc_unlocked(((char *)data)[i], m_fp);
+ }
+ return len;
+#else
+ return (uint)fwrite(data, 1, len, m_fp);
+#endif
+ }
+
+ virtual bool isLoading() const
+ {
+ return false;
+ }
+
+ virtual bool isSaving() const
+ {
+ return true;
+ }
+ //@}
+
+ };
+
+
+ /// Standard input stream.
+ class NVCORE_CLASS StdInputStream : public StdStream
+ {
+ NV_FORBID_COPY(StdInputStream);
+ public:
+
+ /// Construct stream by file name.
+ StdInputStream( const char * name ) : StdStream(fileOpen(name, "rb"), /*autoclose=*/true) { }
+
+ /// Construct stream by file handle.
+ StdInputStream( FILE * fp, bool autoclose=true ) : StdStream(fp, autoclose)
+ {
+ }
+
+ /** @name Stream implementation. */
+ //@{
+ /// Read data.
+ virtual uint serialize( void * data, uint len )
+ {
+ nvDebugCheck(data != NULL);
+ nvDebugCheck(m_fp != NULL);
+#if NV_OS_WIN32
+ return (uint)_fread_nolock(data, 1, len, m_fp);
+#elif NV_OS_LINUX
+ return (uint)fread_unlocked(data, 1, len, m_fp);
+#elif NV_OS_DARWIN
+ // @@ No error checking, always returns len.
+ for (uint i = 0; i < len; i++) {
+ ((char *)data)[i] = getc_unlocked(m_fp);
+ }
+ return len;
+#else
+ return (uint)fread(data, 1, len, m_fp);
+#endif
+
+ }
+
+ virtual bool isLoading() const
+ {
+ return true;
+ }
+
+ virtual bool isSaving() const
+ {
+ return false;
+ }
+ //@}
+ };
+
+
+
+ /// Memory input stream.
+ class NVCORE_CLASS MemoryInputStream : public Stream
+ {
+ NV_FORBID_COPY(MemoryInputStream);
+ public:
+
+ /// Ctor.
+ MemoryInputStream( const uint8 * mem, uint size ) : m_mem(mem), m_ptr(mem), m_size(size) { }
+
+ /** @name Stream implementation. */
+ //@{
+ /// Read data.
+ virtual uint serialize( void * data, uint len )
+ {
+ nvDebugCheck(data != NULL);
+ nvDebugCheck(!isError());
+
+ uint left = m_size - tell();
+ if (len > left) len = left;
+
+ memcpy( data, m_ptr, len );
+ m_ptr += len;
+
+ return len;
+ }
+
+ virtual void seek( uint pos )
+ {
+ nvDebugCheck(!isError());
+ m_ptr = m_mem + pos;
+ nvDebugCheck(!isError());
+ }
+
+ virtual uint tell() const
+ {
+ nvDebugCheck(m_ptr >= m_mem);
+ return uint(m_ptr - m_mem);
+ }
+
+ virtual uint size() const
+ {
+ return m_size;
+ }
+
+ virtual bool isError() const
+ {
+ return m_mem == NULL || m_ptr > m_mem + m_size || m_ptr < m_mem;
+ }
+
+ virtual void clearError()
+ {
+ // Nothing to do.
+ }
+
+ virtual bool isAtEnd() const
+ {
+ return m_ptr == m_mem + m_size;
+ }
+
+ /// Always true.
+ virtual bool isSeekable() const
+ {
+ return true;
+ }
+
+ virtual bool isLoading() const
+ {
+ return true;
+ }
+
+ virtual bool isSaving() const
+ {
+ return false;
+ }
+ //@}
+
+ const uint8 * ptr() const { return m_ptr; }
+
+
+ private:
+
+ const uint8 * m_mem;
+ const uint8 * m_ptr;
+ uint m_size;
+
+ };
+
+
+ /// Buffer output stream.
+ class NVCORE_CLASS BufferOutputStream : public Stream
+ {
+ NV_FORBID_COPY(BufferOutputStream);
+ public:
+
+ BufferOutputStream(Array<uint8> & buffer) : m_buffer(buffer) { }
+
+ virtual uint serialize( void * data, uint len )
+ {
+ nvDebugCheck(data != NULL);
+ m_buffer.append((uint8 *)data, len);
+ return len;
+ }
+
+ virtual void seek( uint /*pos*/ ) { /*Not implemented*/ }
+ virtual uint tell() const { return m_buffer.size(); }
+ virtual uint size() const { return m_buffer.size(); }
+
+ virtual bool isError() const { return false; }
+ virtual void clearError() {}
+
+ virtual bool isAtEnd() const { return true; }
+ virtual bool isSeekable() const { return false; }
+ virtual bool isLoading() const { return false; }
+ virtual bool isSaving() const { return true; }
+
+ private:
+ Array<uint8> & m_buffer;
+ };
+
+
+ /// Protected input stream.
+ class NVCORE_CLASS ProtectedStream : public Stream
+ {
+ NV_FORBID_COPY(ProtectedStream);
+ public:
+
+ /// Ctor.
+ ProtectedStream( Stream & s ) : m_s(&s), m_autodelete(false)
+ {
+ }
+
+ /// Ctor.
+ ProtectedStream( Stream * s, bool autodelete = true ) :
+ m_s(s), m_autodelete(autodelete)
+ {
+ nvDebugCheck(m_s != NULL);
+ }
+
+ /// Dtor.
+ virtual ~ProtectedStream()
+ {
+ if( m_autodelete ) {
+ delete m_s;
+ }
+ }
+
+ /** @name Stream implementation. */
+ //@{
+ /// Read data.
+ virtual uint serialize( void * data, uint len )
+ {
+ nvDebugCheck(data != NULL);
+ len = m_s->serialize( data, len );
+
+ if( m_s->isError() ) {
+ throw;
+ }
+
+ return len;
+ }
+
+ virtual void seek( uint pos )
+ {
+ m_s->seek( pos );
+
+ if( m_s->isError() ) {
+ throw;
+ }
+ }
+
+ virtual uint tell() const
+ {
+ return m_s->tell();
+ }
+
+ virtual uint size() const
+ {
+ return m_s->size();
+ }
+
+ virtual bool isError() const
+ {
+ return m_s->isError();
+ }
+
+ virtual void clearError()
+ {
+ m_s->clearError();
+ }
+
+ virtual bool isAtEnd() const
+ {
+ return m_s->isAtEnd();
+ }
+
+ virtual bool isSeekable() const
+ {
+ return m_s->isSeekable();
+ }
+
+ virtual bool isLoading() const
+ {
+ return m_s->isLoading();
+ }
+
+ virtual bool isSaving() const
+ {
+ return m_s->isSaving();
+ }
+ //@}
+
+
+ private:
+
+ Stream * const m_s;
+ bool const m_autodelete;
+
+ };
+
+} // nv namespace
+
+
+//#endif // NV_CORE_STDSTREAM_H
diff --git a/3rdparty/bgfx/3rdparty/nvtt/nvcore/stream.h b/3rdparty/bgfx/3rdparty/nvtt/nvcore/stream.h
new file mode 100644
index 00000000000..9252d9efe0e
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/nvtt/nvcore/stream.h
@@ -0,0 +1,163 @@
+// This code is in the public domain -- Ignacio Castaño <castano@gmail.com>
+
+#ifndef NV_CORE_STREAM_H
+#define NV_CORE_STREAM_H
+
+#include "nvcore.h"
+#include "debug.h"
+
+namespace nv
+{
+
+ /// Base stream class.
+ class NVCORE_CLASS Stream {
+ public:
+
+ enum ByteOrder {
+ LittleEndian = false,
+ BigEndian = true,
+ };
+
+ /// Get the byte order of the system.
+ static ByteOrder getSystemByteOrder() {
+#if NV_LITTLE_ENDIAN
+ return LittleEndian;
+#else
+ return BigEndian;
+#endif
+ }
+
+
+ /// Ctor.
+ Stream() : m_byteOrder(LittleEndian) { }
+
+ /// Virtual destructor.
+ virtual ~Stream() {}
+
+ /// Set byte order.
+ void setByteOrder(ByteOrder bo) { m_byteOrder = bo; }
+
+ /// Get byte order.
+ ByteOrder byteOrder() const { return m_byteOrder; }
+
+
+ /// Serialize the given data.
+ virtual uint serialize( void * data, uint len ) = 0;
+
+ /// Move to the given position in the archive.
+ virtual void seek( uint pos ) = 0;
+
+ /// Return the current position in the archive.
+ virtual uint tell() const = 0;
+
+ /// Return the current size of the archive.
+ virtual uint size() const = 0;
+
+ /// Determine if there has been any error.
+ virtual bool isError() const = 0;
+
+ /// Clear errors.
+ virtual void clearError() = 0;
+
+ /// Return true if the stream is at the end.
+ virtual bool isAtEnd() const = 0;
+
+ /// Return true if the stream is seekable.
+ virtual bool isSeekable() const = 0;
+
+ /// Return true if this is an input stream.
+ virtual bool isLoading() const = 0;
+
+ /// Return true if this is an output stream.
+ virtual bool isSaving() const = 0;
+
+
+ void advance(uint offset) { seek(tell() + offset); }
+
+
+ // friends
+ friend Stream & operator<<( Stream & s, bool & c ) {
+#if NV_OS_DARWIN && !NV_CC_CPP11
+ nvStaticCheck(sizeof(bool) == 4);
+ uint8 b = c ? 1 : 0;
+ s.serialize( &b, 1 );
+ c = (b == 1);
+#else
+ nvStaticCheck(sizeof(bool) == 1);
+ s.serialize( &c, 1 );
+#endif
+ return s;
+ }
+ friend Stream & operator<<( Stream & s, char & c ) {
+ nvStaticCheck(sizeof(char) == 1);
+ s.serialize( &c, 1 );
+ return s;
+ }
+ friend Stream & operator<<( Stream & s, uint8 & c ) {
+ nvStaticCheck(sizeof(uint8) == 1);
+ s.serialize( &c, 1 );
+ return s;
+ }
+ friend Stream & operator<<( Stream & s, int8 & c ) {
+ nvStaticCheck(sizeof(int8) == 1);
+ s.serialize( &c, 1 );
+ return s;
+ }
+ friend Stream & operator<<( Stream & s, uint16 & c ) {
+ nvStaticCheck(sizeof(uint16) == 2);
+ return s.byteOrderSerialize( &c, 2 );
+ }
+ friend Stream & operator<<( Stream & s, int16 & c ) {
+ nvStaticCheck(sizeof(int16) == 2);
+ return s.byteOrderSerialize( &c, 2 );
+ }
+ friend Stream & operator<<( Stream & s, uint32 & c ) {
+ nvStaticCheck(sizeof(uint32) == 4);
+ return s.byteOrderSerialize( &c, 4 );
+ }
+ friend Stream & operator<<( Stream & s, int32 & c ) {
+ nvStaticCheck(sizeof(int32) == 4);
+ return s.byteOrderSerialize( &c, 4 );
+ }
+ friend Stream & operator<<( Stream & s, uint64 & c ) {
+ nvStaticCheck(sizeof(uint64) == 8);
+ return s.byteOrderSerialize( &c, 8 );
+ }
+ friend Stream & operator<<( Stream & s, int64 & c ) {
+ nvStaticCheck(sizeof(int64) == 8);
+ return s.byteOrderSerialize( &c, 8 );
+ }
+ friend Stream & operator<<( Stream & s, float & c ) {
+ nvStaticCheck(sizeof(float) == 4);
+ return s.byteOrderSerialize( &c, 4 );
+ }
+ friend Stream & operator<<( Stream & s, double & c ) {
+ nvStaticCheck(sizeof(double) == 8);
+ return s.byteOrderSerialize( &c, 8 );
+ }
+
+ protected:
+
+ /// Serialize in the stream byte order.
+ Stream & byteOrderSerialize( void * v, uint len ) {
+ if( m_byteOrder == getSystemByteOrder() ) {
+ serialize( v, len );
+ }
+ else {
+ for( uint i = len; i > 0; i-- ) {
+ serialize( (uint8 *)v + i - 1, 1 );
+ }
+ }
+ return *this;
+ }
+
+
+ private:
+
+ ByteOrder m_byteOrder;
+
+ };
+
+} // nv namespace
+
+#endif // NV_CORE_STREAM_H
diff --git a/3rdparty/bgfx/3rdparty/nvtt/nvcore/strlib.h b/3rdparty/bgfx/3rdparty/nvtt/nvcore/strlib.h
new file mode 100644
index 00000000000..80a957cbbe1
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/nvtt/nvcore/strlib.h
@@ -0,0 +1,429 @@
+// This code is in the public domain -- Ignacio Castaño <castano@gmail.com>
+
+#ifndef NV_CORE_STRING_H
+#define NV_CORE_STRING_H
+
+#include "debug.h"
+#include "hash.h" // hash
+
+//#include <string.h> // strlen, etc.
+
+#if NV_OS_WIN32
+#define NV_PATH_SEPARATOR '\\'
+#else
+#define NV_PATH_SEPARATOR '/'
+#endif
+
+namespace nv
+{
+
+ NVCORE_API uint strHash(const char * str, uint h) NV_PURE;
+
+ /// String hash based on Bernstein's hash.
+ inline uint strHash(const char * data, uint h = 5381)
+ {
+ uint i = 0;
+ while(data[i] != 0) {
+ h = (33 * h) ^ uint(data[i]);
+ i++;
+ }
+ return h;
+ }
+
+ template <> struct Hash<const char *> {
+ uint operator()(const char * str) const { return strHash(str); }
+ };
+
+ NVCORE_API uint strLen(const char * str) NV_PURE; // Asserts on NULL strings.
+
+ NVCORE_API int strDiff(const char * s1, const char * s2) NV_PURE; // Asserts on NULL strings.
+ NVCORE_API int strCaseDiff(const char * s1, const char * s2) NV_PURE; // Asserts on NULL strings.
+ NVCORE_API bool strEqual(const char * s1, const char * s2) NV_PURE; // Accepts NULL strings.
+ NVCORE_API bool strCaseEqual(const char * s1, const char * s2) NV_PURE; // Accepts NULL strings.
+
+ template <> struct Equal<const char *> {
+ bool operator()(const char * a, const char * b) const { return strEqual(a, b); }
+ };
+
+ NVCORE_API bool strBeginsWith(const char * dst, const char * prefix) NV_PURE;
+ NVCORE_API bool strEndsWith(const char * dst, const char * suffix) NV_PURE;
+
+
+ NVCORE_API void strCpy(char * dst, uint size, const char * src);
+ NVCORE_API void strCpy(char * dst, uint size, const char * src, uint len);
+ NVCORE_API void strCat(char * dst, uint size, const char * src);
+
+ NVCORE_API const char * strSkipWhiteSpace(const char * str);
+ NVCORE_API char * strSkipWhiteSpace(char * str);
+
+ NVCORE_API bool strMatch(const char * str, const char * pat) NV_PURE;
+
+ NVCORE_API bool isNumber(const char * str) NV_PURE;
+
+ /* @@ Implement these two functions and modify StringBuilder to use them?
+ NVCORE_API void strFormat(const char * dst, const char * fmt, ...);
+ NVCORE_API void strFormatList(const char * dst, const char * fmt, va_list arg);
+
+ template <size_t count> void strFormatSafe(char (&buffer)[count], const char *fmt, ...) __attribute__((format (printf, 2, 3)));
+ template <size_t count> void strFormatSafe(char (&buffer)[count], const char *fmt, ...) {
+ va_list args;
+ va_start(args, fmt);
+ strFormatList(buffer, count, fmt, args);
+ va_end(args);
+ }
+ template <size_t count> void strFormatListSafe(char (&buffer)[count], const char *fmt, va_list arg) {
+ va_list tmp;
+ va_copy(tmp, args);
+ strFormatList(buffer, count, fmt, tmp);
+ va_end(tmp);
+ }*/
+
+ template <int count> void strCpySafe(char (&buffer)[count], const char *src) {
+ strCpy(buffer, count, src);
+ }
+
+ template <int count> void strCatSafe(char (&buffer)[count], const char * src) {
+ strCat(buffer, count, src);
+ }
+
+
+
+ /// String builder.
+ class NVCORE_CLASS StringBuilder
+ {
+ public:
+
+ StringBuilder();
+ explicit StringBuilder( uint size_hint );
+ StringBuilder(const char * str);
+ StringBuilder(const char * str, uint len);
+ StringBuilder(const StringBuilder & other);
+
+ ~StringBuilder();
+
+ StringBuilder & format( const char * format, ... ) __attribute__((format (printf, 2, 3)));
+ StringBuilder & formatList( const char * format, va_list arg );
+
+ StringBuilder & append(const char * str);
+ StringBuilder & append(const char * str, uint len);
+ StringBuilder & appendFormat(const char * format, ...) __attribute__((format (printf, 2, 3)));
+ StringBuilder & appendFormatList(const char * format, va_list arg);
+
+ StringBuilder & appendSpace(uint n);
+
+ StringBuilder & number( int i, int base = 10 );
+ StringBuilder & number( uint i, int base = 10 );
+
+ StringBuilder & reserve(uint size_hint);
+ StringBuilder & copy(const char * str);
+ StringBuilder & copy(const char * str, uint len);
+ StringBuilder & copy(const StringBuilder & str);
+
+ StringBuilder & toLower();
+ StringBuilder & toUpper();
+
+ bool endsWith(const char * str) const;
+ bool beginsWith(const char * str) const;
+
+ char * reverseFind(char c);
+
+ void reset();
+ bool isNull() const { return m_size == 0; }
+
+ // const char * accessors
+ //operator const char * () const { return m_str; }
+ //operator char * () { return m_str; }
+ const char * str() const { return m_str; }
+ char * str() { return m_str; }
+
+ char * release();
+
+ /// Implement value semantics.
+ StringBuilder & operator=( const StringBuilder & s ) {
+ return copy(s);
+ }
+
+ /// Implement value semantics.
+ StringBuilder & operator=( const char * s ) {
+ return copy(s);
+ }
+
+ /// Equal operator.
+ bool operator==( const StringBuilder & s ) const {
+ return strMatch(s.m_str, m_str);
+ }
+
+ /// Return the exact length.
+ uint length() const { return isNull() ? 0 : strLen(m_str); }
+
+ /// Return the size of the string container.
+ uint capacity() const { return m_size; }
+
+ /// Return the hash of the string.
+ uint hash() const { return isNull() ? 0 : strHash(m_str); }
+
+ // Swap strings.
+ friend void swap(StringBuilder & a, StringBuilder & b);
+
+ protected:
+
+ /// Size of the string container.
+ uint m_size;
+
+ /// String.
+ char * m_str;
+
+ };
+
+
+ /// Path string. @@ This should be called PathBuilder.
+ class NVCORE_CLASS Path : public StringBuilder
+ {
+ public:
+ Path() : StringBuilder() {}
+ explicit Path(int size_hint) : StringBuilder(size_hint) {}
+ Path(const char * str) : StringBuilder(str) {}
+ Path(const Path & path) : StringBuilder(path) {}
+
+ const char * fileName() const;
+ const char * extension() const;
+
+ void translatePath(char pathSeparator = NV_PATH_SEPARATOR);
+
+ void appendSeparator(char pathSeparator = NV_PATH_SEPARATOR);
+
+ void stripFileName();
+ void stripExtension();
+
+ // statics
+ NVCORE_API static char separator();
+ NVCORE_API static const char * fileName(const char *);
+ NVCORE_API static const char * extension(const char *);
+
+ NVCORE_API static void translatePath(char * path, char pathSeparator = NV_PATH_SEPARATOR);
+ };
+
+
+ /// String class.
+ class NVCORE_CLASS String
+ {
+ public:
+
+ /// Constructs a null string. @sa isNull()
+ String()
+ {
+ data = NULL;
+ }
+
+ /// Constructs a shared copy of str.
+ String(const String & str)
+ {
+ data = str.data;
+ if (data != NULL) addRef();
+ }
+
+ /// Constructs a shared string from a standard string.
+ String(const char * str)
+ {
+ setString(str);
+ }
+
+ /// Constructs a shared string from a standard string.
+ String(const char * str, int length)
+ {
+ setString(str, length);
+ }
+
+ /// Constructs a shared string from a StringBuilder.
+ String(const StringBuilder & str)
+ {
+ setString(str);
+ }
+
+ /// Dtor.
+ ~String()
+ {
+ release();
+ }
+
+ String clone() const;
+
+ /// Release the current string and allocate a new one.
+ const String & operator=( const char * str )
+ {
+ release();
+ setString( str );
+ return *this;
+ }
+
+ /// Release the current string and allocate a new one.
+ const String & operator=( const StringBuilder & str )
+ {
+ release();
+ setString( str );
+ return *this;
+ }
+
+ /// Implement value semantics.
+ String & operator=( const String & str )
+ {
+ if (str.data != data)
+ {
+ release();
+ data = str.data;
+ addRef();
+ }
+ return *this;
+ }
+
+ /// Equal operator.
+ bool operator==( const String & str ) const
+ {
+ return strMatch(str.data, data);
+ }
+
+ /// Equal operator.
+ bool operator==( const char * str ) const
+ {
+ return strMatch(str, data);
+ }
+
+ /// Not equal operator.
+ bool operator!=( const String & str ) const
+ {
+ return !strMatch(str.data, data);
+ }
+
+ /// Not equal operator.
+ bool operator!=( const char * str ) const
+ {
+ return !strMatch(str, data);
+ }
+
+ /// Returns true if this string is the null string.
+ bool isNull() const { return data == NULL; }
+
+ /// Return the exact length.
+ uint length() const { nvDebugCheck(data != NULL); return strLen(data); }
+
+ /// Return the hash of the string.
+ uint hash() const { nvDebugCheck(data != NULL); return strHash(data); }
+
+ /// const char * cast operator.
+ operator const char * () const { return data; }
+
+ /// Get string pointer.
+ const char * str() const { return data; }
+
+
+ private:
+
+ // Add reference count.
+ void addRef();
+
+ // Decrease reference count.
+ void release();
+
+ uint16 getRefCount() const
+ {
+ nvDebugCheck(data != NULL);
+ return *reinterpret_cast<const uint16 *>(data - 2);
+ }
+
+ void setRefCount(uint16 count) {
+ nvDebugCheck(data != NULL);
+ nvCheck(count < 0xFFFF);
+ *reinterpret_cast<uint16 *>(const_cast<char *>(data - 2)) = uint16(count);
+ }
+
+ void setData(const char * str) {
+ data = str + 2;
+ }
+
+ void allocString(const char * str)
+ {
+ allocString(str, strLen(str));
+ }
+
+ void allocString(const char * str, uint length);
+
+ void setString(const char * str);
+ void setString(const char * str, uint length);
+ void setString(const StringBuilder & str);
+
+ // Swap strings.
+ friend void swap(String & a, String & b);
+
+ private:
+
+ const char * data;
+
+ };
+
+ template <> struct Hash<String> {
+ uint operator()(const String & str) const { return str.hash(); }
+ };
+
+
+ // Like AutoPtr, but for const char strings.
+ class AutoString
+ {
+ NV_FORBID_COPY(AutoString);
+ NV_FORBID_HEAPALLOC();
+ public:
+
+ // Ctor.
+ AutoString(const char * p = NULL) : m_ptr(p) { }
+
+#if NV_CC_CPP11
+ // Move ctor.
+ AutoString(AutoString && ap) : m_ptr(ap.m_ptr) { ap.m_ptr = NULL; }
+#endif
+
+ // Dtor. Deletes owned pointer.
+ ~AutoString() {
+ delete [] m_ptr;
+ m_ptr = NULL;
+ }
+
+ // Delete owned pointer and assign new one.
+ void operator=(const char * p) {
+ if (p != m_ptr)
+ {
+ delete [] m_ptr;
+ m_ptr = p;
+ }
+ }
+
+ // Get pointer.
+ const char * ptr() const { return m_ptr; }
+ operator const char *() const { return m_ptr; }
+
+ // Relinquish ownership of the underlying pointer and returns that pointer.
+ const char * release() {
+ const char * tmp = m_ptr;
+ m_ptr = NULL;
+ return tmp;
+ }
+
+ // comparison operators.
+ friend bool operator == (const AutoString & ap, const char * const p) {
+ return (ap.ptr() == p);
+ }
+ friend bool operator != (const AutoString & ap, const char * const p) {
+ return (ap.ptr() != p);
+ }
+ friend bool operator == (const char * const p, const AutoString & ap) {
+ return (ap.ptr() == p);
+ }
+ friend bool operator != (const char * const p, const AutoString & ap) {
+ return (ap.ptr() != p);
+ }
+
+ private:
+ const char * m_ptr;
+ };
+
+} // nv namespace
+
+#endif // NV_CORE_STRING_H
diff --git a/3rdparty/bgfx/3rdparty/nvtt/nvcore/utils.h b/3rdparty/bgfx/3rdparty/nvtt/nvcore/utils.h
new file mode 100644
index 00000000000..364b629287b
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/nvtt/nvcore/utils.h
@@ -0,0 +1,281 @@
+// This code is in the public domain -- Ignacio Castaño <castano@gmail.com>
+
+#ifndef NV_CORE_UTILS_H
+#define NV_CORE_UTILS_H
+
+#include "debug.h" // nvdebugcheck
+
+#include <new> // for placement new
+
+
+// Just in case. Grrr.
+#undef min
+#undef max
+
+#define NV_INT8_MIN (-128)
+#define NV_INT8_MAX 127
+#define NV_UINT8_MAX 255
+#define NV_INT16_MIN (-32767-1)
+#define NV_INT16_MAX 32767
+#define NV_UINT16_MAX 0xffff
+#define NV_INT32_MIN (-2147483647-1)
+#define NV_INT32_MAX 2147483647
+#define NV_UINT32_MAX 0xffffffff
+#define NV_INT64_MAX POSH_I64(9223372036854775807)
+#define NV_INT64_MIN (-POSH_I64(9223372036854775807)-1)
+#define NV_UINT64_MAX POSH_U64(0xffffffffffffffff)
+
+#define NV_HALF_MAX 65504.0F
+#define NV_FLOAT_MAX 3.402823466e+38F
+
+#define NV_INTEGER_TO_FLOAT_MAX 16777217 // Largest integer such that it and all smaller integers can be stored in a 32bit float.
+
+
+namespace nv
+{
+ // Less error prone than casting. From CB:
+ // http://cbloomrants.blogspot.com/2011/06/06-17-11-c-casting-is-devil.html
+
+ // These intentionally look like casts.
+
+ // uint32 casts:
+ template <typename T> inline uint32 U32(T x) { return x; }
+ template <> inline uint32 U32<uint64>(uint64 x) { nvDebugCheck(x <= NV_UINT32_MAX); return (uint32)x; }
+ template <> inline uint32 U32<int64>(int64 x) { nvDebugCheck(x >= 0 && x <= NV_UINT32_MAX); return (uint32)x; }
+ //template <> inline uint32 U32<uint32>(uint32 x) { return x; }
+ template <> inline uint32 U32<int32>(int32 x) { nvDebugCheck(x >= 0); return (uint32)x; }
+ //template <> inline uint32 U32<uint16>(uint16 x) { return x; }
+ template <> inline uint32 U32<int16>(int16 x) { nvDebugCheck(x >= 0); return (uint32)x; }
+ //template <> inline uint32 U32<uint8>(uint8 x) { return x; }
+ template <> inline uint32 U32<int8>(int8 x) { nvDebugCheck(x >= 0); return (uint32)x; }
+
+ // int32 casts:
+ template <typename T> inline int32 I32(T x) { return x; }
+ template <> inline int32 I32<uint64>(uint64 x) { nvDebugCheck(x <= NV_INT32_MAX); return (int32)x; }
+ template <> inline int32 I32<int64>(int64 x) { nvDebugCheck(x >= NV_INT32_MIN && x <= NV_UINT32_MAX); return (int32)x; }
+ template <> inline int32 I32<uint32>(uint32 x) { nvDebugCheck(x <= NV_INT32_MAX); return (int32)x; }
+ //template <> inline int32 I32<int32>(int32 x) { return x; }
+ //template <> inline int32 I32<uint16>(uint16 x) { return x; }
+ //template <> inline int32 I32<int16>(int16 x) { return x; }
+ //template <> inline int32 I32<uint8>(uint8 x) { return x; }
+ //template <> inline int32 I32<int8>(int8 x) { return x; }
+
+ // uint16 casts:
+ template <typename T> inline uint16 U16(T x) { return x; }
+ template <> inline uint16 U16<uint64>(uint64 x) { nvDebugCheck(x <= NV_UINT16_MAX); return (uint16)x; }
+ template <> inline uint16 U16<int64>(int64 x) { nvDebugCheck(x >= 0 && x <= NV_UINT16_MAX); return (uint16)x; }
+ template <> inline uint16 U16<uint32>(uint32 x) { nvDebugCheck(x <= NV_UINT16_MAX); return (uint16)x; }
+ template <> inline uint16 U16<int32>(int32 x) { nvDebugCheck(x >= 0 && x <= NV_UINT16_MAX); return (uint16)x; }
+ //template <> inline uint16 U16<uint16>(uint16 x) { return x; }
+ template <> inline uint16 U16<int16>(int16 x) { nvDebugCheck(x >= 0); return (uint16)x; }
+ //template <> inline uint16 U16<uint8>(uint8 x) { return x; }
+ template <> inline uint16 U16<int8>(int8 x) { nvDebugCheck(x >= 0); return (uint16)x; }
+
+ // int16 casts:
+ template <typename T> inline int16 I16(T x) { return x; }
+ template <> inline int16 I16<uint64>(uint64 x) { nvDebugCheck(x <= NV_INT16_MAX); return (int16)x; }
+ template <> inline int16 I16<int64>(int64 x) { nvDebugCheck(x >= NV_INT16_MIN && x <= NV_UINT16_MAX); return (int16)x; }
+ template <> inline int16 I16<uint32>(uint32 x) { nvDebugCheck(x <= NV_INT16_MAX); return (int16)x; }
+ template <> inline int16 I16<int32>(int32 x) { nvDebugCheck(x >= NV_INT16_MIN && x <= NV_UINT16_MAX); return (int16)x; }
+ template <> inline int16 I16<uint16>(uint16 x) { nvDebugCheck(x <= NV_INT16_MAX); return (int16)x; }
+ //template <> inline int16 I16<int16>(int16 x) { return x; }
+ //template <> inline int16 I16<uint8>(uint8 x) { return x; }
+ //template <> inline int16 I16<int8>(int8 x) { return x; }
+
+ // uint8 casts:
+ template <typename T> inline uint8 U8(T x) { return x; }
+ template <> inline uint8 U8<uint64>(uint64 x) { nvDebugCheck(x <= NV_UINT8_MAX); return (uint8)x; }
+ template <> inline uint8 U8<int64>(int64 x) { nvDebugCheck(x >= 0 && x <= NV_UINT8_MAX); return (uint8)x; }
+ template <> inline uint8 U8<uint32>(uint32 x) { nvDebugCheck(x <= NV_UINT8_MAX); return (uint8)x; }
+ template <> inline uint8 U8<int32>(int32 x) { nvDebugCheck(x >= 0 && x <= NV_UINT8_MAX); return (uint8)x; }
+ template <> inline uint8 U8<uint16>(uint16 x) { nvDebugCheck(x <= NV_UINT8_MAX); return (uint8)x; }
+ template <> inline uint8 U8<int16>(int16 x) { nvDebugCheck(x >= 0 && x <= NV_UINT8_MAX); return (uint8)x; }
+ //template <> inline uint8 U8<uint8>(uint8 x) { return x; }
+ template <> inline uint8 U8<int8>(int8 x) { nvDebugCheck(x >= 0); return (uint8)x; }
+ //template <> inline uint8 U8<float>(int8 x) { nvDebugCheck(x >= 0.0f && x <= 255.0f); return (uint8)x; }
+
+ // int8 casts:
+ template <typename T> inline int8 I8(T x) { return x; }
+ template <> inline int8 I8<uint64>(uint64 x) { nvDebugCheck(x <= NV_INT8_MAX); return (int8)x; }
+ template <> inline int8 I8<int64>(int64 x) { nvDebugCheck(x >= NV_INT8_MIN && x <= NV_UINT8_MAX); return (int8)x; }
+ template <> inline int8 I8<uint32>(uint32 x) { nvDebugCheck(x <= NV_INT8_MAX); return (int8)x; }
+ template <> inline int8 I8<int32>(int32 x) { nvDebugCheck(x >= NV_INT8_MIN && x <= NV_UINT8_MAX); return (int8)x; }
+ template <> inline int8 I8<uint16>(uint16 x) { nvDebugCheck(x <= NV_INT8_MAX); return (int8)x; }
+ template <> inline int8 I8<int16>(int16 x) { nvDebugCheck(x >= NV_INT8_MIN && x <= NV_UINT8_MAX); return (int8)x; }
+ template <> inline int8 I8<uint8>(uint8 x) { nvDebugCheck(x <= NV_INT8_MAX); return (int8)x; }
+ //template <> inline int8 I8<int8>(int8 x) { return x; }
+
+ // float casts:
+ template <typename T> inline float F32(T x) { return x; }
+ template <> inline float F32<uint64>(uint64 x) { nvDebugCheck(x <= NV_INTEGER_TO_FLOAT_MAX); return (float)x; }
+ template <> inline float F32<int64>(int64 x) { nvDebugCheck(x >= -NV_INTEGER_TO_FLOAT_MAX && x <= NV_INTEGER_TO_FLOAT_MAX); return (float)x; }
+ template <> inline float F32<uint32>(uint32 x) { nvDebugCheck(x <= NV_INTEGER_TO_FLOAT_MAX); return (float)x; }
+ template <> inline float F32<int32>(int32 x) { nvDebugCheck(x >= -NV_INTEGER_TO_FLOAT_MAX && x <= NV_INTEGER_TO_FLOAT_MAX); return (float)x; }
+ // The compiler should not complain about these conversions:
+ //template <> inline float F32<uint16>(uint16 x) { nvDebugCheck(return (float)x; }
+ //template <> inline float F32<int16>(int16 x) { nvDebugCheck(return (float)x; }
+ //template <> inline float F32<uint8>(uint8 x) { nvDebugCheck(return (float)x; }
+ //template <> inline float F32<int8>(int8 x) { nvDebugCheck(return (float)x; }
+
+
+ /// Swap two values.
+ template <typename T>
+ inline void swap(T & a, T & b)
+ {
+ T temp(a);
+ a = b;
+ b = temp;
+ }
+
+ /// Return the maximum of the two arguments. For floating point values, it returns the second value if the first is NaN.
+ template <typename T>
+ //inline const T & max(const T & a, const T & b)
+ inline T max(const T & a, const T & b)
+ {
+ return (b < a) ? a : b;
+ }
+
+ /// Return the maximum of the four arguments.
+ template <typename T>
+ //inline const T & max4(const T & a, const T & b, const T & c)
+ inline T max4(const T & a, const T & b, const T & c, const T & d)
+ {
+ return max(max(a, b), max(c, d));
+ }
+
+ /// Return the maximum of the three arguments.
+ template <typename T>
+ //inline const T & max3(const T & a, const T & b, const T & c)
+ inline T max3(const T & a, const T & b, const T & c)
+ {
+ return max(a, max(b, c));
+ }
+
+ /// Return the minimum of two values.
+ template <typename T>
+ //inline const T & min(const T & a, const T & b)
+ inline T min(const T & a, const T & b)
+ {
+ return (a < b) ? a : b;
+ }
+
+ /// Return the maximum of the three arguments.
+ template <typename T>
+ //inline const T & min3(const T & a, const T & b, const T & c)
+ inline T min3(const T & a, const T & b, const T & c)
+ {
+ return min(a, min(b, c));
+ }
+
+ /// Clamp between two values.
+ template <typename T>
+ //inline const T & clamp(const T & x, const T & a, const T & b)
+ inline T clamp(const T & x, const T & a, const T & b)
+ {
+ return min(max(x, a), b);
+ }
+
+ /** Return the next power of two.
+ * @see http://graphics.stanford.edu/~seander/bithacks.html
+ * @warning Behaviour for 0 is undefined.
+ * @note isPowerOfTwo(x) == true -> nextPowerOfTwo(x) == x
+ * @note nextPowerOfTwo(x) = 2 << log2(x-1)
+ */
+ inline uint nextPowerOfTwo( uint x )
+ {
+ nvDebugCheck( x != 0 );
+#if 1 // On modern CPUs this is supposed to be as fast as using the bsr instruction.
+ x--;
+ x |= x >> 1;
+ x |= x >> 2;
+ x |= x >> 4;
+ x |= x >> 8;
+ x |= x >> 16;
+ return x+1;
+#else
+ uint p = 1;
+ while( x > p ) {
+ p += p;
+ }
+ return p;
+#endif
+ }
+
+ /// Return true if @a n is a power of two.
+ inline bool isPowerOfTwo( uint n )
+ {
+ return (n & (n-1)) == 0;
+ }
+
+
+ // @@ Move this to utils?
+ /// Delete all the elements of a container.
+ template <typename T>
+ void deleteAll(T & container)
+ {
+ for (typename T::PseudoIndex i = container.start(); !container.isDone(i); container.advance(i))
+ {
+ delete container[i];
+ }
+ }
+
+
+
+ // @@ Specialize these methods for numeric, pointer, and pod types.
+
+ template <typename T>
+ void construct_range(T * restrict ptr, uint new_size, uint old_size) {
+ for (uint i = old_size; i < new_size; i++) {
+ new(ptr+i) T; // placement new
+ }
+ }
+
+ template <typename T>
+ void construct_range(T * restrict ptr, uint new_size, uint old_size, const T & elem) {
+ for (uint i = old_size; i < new_size; i++) {
+ new(ptr+i) T(elem); // placement new
+ }
+ }
+
+ template <typename T>
+ void construct_range(T * restrict ptr, uint new_size, uint old_size, const T * src) {
+ for (uint i = old_size; i < new_size; i++) {
+ new(ptr+i) T(src[i]); // placement new
+ }
+ }
+
+ template <typename T>
+ void destroy_range(T * restrict ptr, uint new_size, uint old_size) {
+ for (uint i = new_size; i < old_size; i++) {
+ (ptr+i)->~T(); // Explicit call to the destructor
+ }
+ }
+
+ template <typename T>
+ void fill(T * restrict dst, uint count, const T & value) {
+ for (uint i = 0; i < count; i++) {
+ dst[i] = value;
+ }
+ }
+
+ template <typename T>
+ void copy_range(T * restrict dst, const T * restrict src, uint count) {
+ for (uint i = 0; i < count; i++) {
+ dst[i] = src[i];
+ }
+ }
+
+ template <typename T>
+ bool find(const T & element, const T * restrict ptr, uint begin, uint end, uint * index) {
+ for (uint i = begin; i < end; i++) {
+ if (ptr[i] == element) {
+ if (index != NULL) *index = i;
+ return true;
+ }
+ }
+ return false;
+ }
+
+} // nv namespace
+
+#endif // NV_CORE_UTILS_H
diff --git a/3rdparty/bgfx/3rdparty/nvtt/nvmath/fitting.cpp b/3rdparty/bgfx/3rdparty/nvtt/nvmath/fitting.cpp
new file mode 100644
index 00000000000..ba01b1fc1af
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/nvtt/nvmath/fitting.cpp
@@ -0,0 +1,1200 @@
+// This code is in the public domain -- Ignacio Castaño <castano@gmail.com>
+
+#include "fitting.h"
+#include "vector.inl"
+#include "plane.inl"
+#include "matrix.inl"
+
+#include "nvcore/array.inl"
+#include "nvcore/utils.h" // max, swap
+
+using namespace nv;
+
+// @@ Move to EigenSolver.h
+
+// @@ We should be able to do something cheaper...
+static Vector3 estimatePrincipalComponent(const float * __restrict matrix)
+{
+ const Vector3 row0(matrix[0], matrix[1], matrix[2]);
+ const Vector3 row1(matrix[1], matrix[3], matrix[4]);
+ const Vector3 row2(matrix[2], matrix[4], matrix[5]);
+
+ float r0 = lengthSquared(row0);
+ float r1 = lengthSquared(row1);
+ float r2 = lengthSquared(row2);
+
+ if (r0 > r1 && r0 > r2) return row0;
+ if (r1 > r2) return row1;
+ return row2;
+}
+
+
+static inline Vector3 firstEigenVector_PowerMethod(const float *__restrict matrix)
+{
+ if (matrix[0] == 0 && matrix[3] == 0 && matrix[5] == 0)
+ {
+ return Vector3(0.0f);
+ }
+
+ Vector3 v = estimatePrincipalComponent(matrix);
+
+ const int NUM = 8;
+ for (int i = 0; i < NUM; i++)
+ {
+ float x = v.x * matrix[0] + v.y * matrix[1] + v.z * matrix[2];
+ float y = v.x * matrix[1] + v.y * matrix[3] + v.z * matrix[4];
+ float z = v.x * matrix[2] + v.y * matrix[4] + v.z * matrix[5];
+
+ float norm = max(max(x, y), z);
+
+ v = Vector3(x, y, z) / norm;
+ }
+
+ return v;
+}
+
+
+Vector3 nv::Fit::computeCentroid(int n, const Vector3 *__restrict points)
+{
+ Vector3 centroid(0.0f);
+
+ for (int i = 0; i < n; i++)
+ {
+ centroid += points[i];
+ }
+ centroid /= float(n);
+
+ return centroid;
+}
+
+Vector3 nv::Fit::computeCentroid(int n, const Vector3 *__restrict points, const float *__restrict weights, Vector3::Arg metric)
+{
+ Vector3 centroid(0.0f);
+ float total = 0.0f;
+
+ for (int i = 0; i < n; i++)
+ {
+ total += weights[i];
+ centroid += weights[i]*points[i];
+ }
+ centroid /= total;
+
+ return centroid;
+}
+
+Vector4 nv::Fit::computeCentroid(int n, const Vector4 *__restrict points)
+{
+ Vector4 centroid(0.0f);
+
+ for (int i = 0; i < n; i++)
+ {
+ centroid += points[i];
+ }
+ centroid /= float(n);
+
+ return centroid;
+}
+
+Vector4 nv::Fit::computeCentroid(int n, const Vector4 *__restrict points, const float *__restrict weights, Vector4::Arg metric)
+{
+ Vector4 centroid(0.0f);
+ float total = 0.0f;
+
+ for (int i = 0; i < n; i++)
+ {
+ total += weights[i];
+ centroid += weights[i]*points[i];
+ }
+ centroid /= total;
+
+ return centroid;
+}
+
+
+
+Vector3 nv::Fit::computeCovariance(int n, const Vector3 *__restrict points, float *__restrict covariance)
+{
+ // compute the centroid
+ Vector3 centroid = computeCentroid(n, points);
+
+ // compute covariance matrix
+ for (int i = 0; i < 6; i++)
+ {
+ covariance[i] = 0.0f;
+ }
+
+ for (int i = 0; i < n; i++)
+ {
+ Vector3 v = points[i] - centroid;
+
+ covariance[0] += v.x * v.x;
+ covariance[1] += v.x * v.y;
+ covariance[2] += v.x * v.z;
+ covariance[3] += v.y * v.y;
+ covariance[4] += v.y * v.z;
+ covariance[5] += v.z * v.z;
+ }
+
+ return centroid;
+}
+
+Vector3 nv::Fit::computeCovariance(int n, const Vector3 *__restrict points, const float *__restrict weights, Vector3::Arg metric, float *__restrict covariance)
+{
+ // compute the centroid
+ Vector3 centroid = computeCentroid(n, points, weights, metric);
+
+ // compute covariance matrix
+ for (int i = 0; i < 6; i++)
+ {
+ covariance[i] = 0.0f;
+ }
+
+ for (int i = 0; i < n; i++)
+ {
+ Vector3 a = (points[i] - centroid) * metric;
+ Vector3 b = weights[i]*a;
+
+ covariance[0] += a.x * b.x;
+ covariance[1] += a.x * b.y;
+ covariance[2] += a.x * b.z;
+ covariance[3] += a.y * b.y;
+ covariance[4] += a.y * b.z;
+ covariance[5] += a.z * b.z;
+ }
+
+ return centroid;
+}
+
+Vector4 nv::Fit::computeCovariance(int n, const Vector4 *__restrict points, float *__restrict covariance)
+{
+ // compute the centroid
+ Vector4 centroid = computeCentroid(n, points);
+
+ // compute covariance matrix
+ for (int i = 0; i < 10; i++)
+ {
+ covariance[i] = 0.0f;
+ }
+
+ for (int i = 0; i < n; i++)
+ {
+ Vector4 v = points[i] - centroid;
+
+ covariance[0] += v.x * v.x;
+ covariance[1] += v.x * v.y;
+ covariance[2] += v.x * v.z;
+ covariance[3] += v.x * v.w;
+
+ covariance[4] += v.y * v.y;
+ covariance[5] += v.y * v.z;
+ covariance[6] += v.y * v.w;
+
+ covariance[7] += v.z * v.z;
+ covariance[8] += v.z * v.w;
+
+ covariance[9] += v.w * v.w;
+ }
+
+ return centroid;
+}
+
+Vector4 nv::Fit::computeCovariance(int n, const Vector4 *__restrict points, const float *__restrict weights, Vector4::Arg metric, float *__restrict covariance)
+{
+ // compute the centroid
+ Vector4 centroid = computeCentroid(n, points, weights, metric);
+
+ // compute covariance matrix
+ for (int i = 0; i < 10; i++)
+ {
+ covariance[i] = 0.0f;
+ }
+
+ for (int i = 0; i < n; i++)
+ {
+ Vector4 a = (points[i] - centroid) * metric;
+ Vector4 b = weights[i]*a;
+
+ covariance[0] += a.x * b.x;
+ covariance[1] += a.x * b.y;
+ covariance[2] += a.x * b.z;
+ covariance[3] += a.x * b.w;
+
+ covariance[4] += a.y * b.y;
+ covariance[5] += a.y * b.z;
+ covariance[6] += a.y * b.w;
+
+ covariance[7] += a.z * b.z;
+ covariance[8] += a.z * b.w;
+
+ covariance[9] += a.w * b.w;
+ }
+
+ return centroid;
+}
+
+
+
+Vector3 nv::Fit::computePrincipalComponent_PowerMethod(int n, const Vector3 *__restrict points)
+{
+ float matrix[6];
+ computeCovariance(n, points, matrix);
+
+ return firstEigenVector_PowerMethod(matrix);
+}
+
+Vector3 nv::Fit::computePrincipalComponent_PowerMethod(int n, const Vector3 *__restrict points, const float *__restrict weights, Vector3::Arg metric)
+{
+ float matrix[6];
+ computeCovariance(n, points, weights, metric, matrix);
+
+ return firstEigenVector_PowerMethod(matrix);
+}
+
+
+
+static inline Vector3 firstEigenVector_EigenSolver3(const float *__restrict matrix)
+{
+ if (matrix[0] == 0 && matrix[3] == 0 && matrix[5] == 0)
+ {
+ return Vector3(0.0f);
+ }
+
+ float eigenValues[3];
+ Vector3 eigenVectors[3];
+ if (!nv::Fit::eigenSolveSymmetric3(matrix, eigenValues, eigenVectors))
+ {
+ return Vector3(0.0f);
+ }
+
+ return eigenVectors[0];
+}
+
+Vector3 nv::Fit::computePrincipalComponent_EigenSolver(int n, const Vector3 *__restrict points)
+{
+ float matrix[6];
+ computeCovariance(n, points, matrix);
+
+ return firstEigenVector_EigenSolver3(matrix);
+}
+
+Vector3 nv::Fit::computePrincipalComponent_EigenSolver(int n, const Vector3 *__restrict points, const float *__restrict weights, Vector3::Arg metric)
+{
+ float matrix[6];
+ computeCovariance(n, points, weights, metric, matrix);
+
+ return firstEigenVector_EigenSolver3(matrix);
+}
+
+
+
+static inline Vector4 firstEigenVector_EigenSolver4(const float *__restrict matrix)
+{
+ if (matrix[0] == 0 && matrix[4] == 0 && matrix[7] == 0&& matrix[9] == 0)
+ {
+ return Vector4(0.0f);
+ }
+
+ float eigenValues[4];
+ Vector4 eigenVectors[4];
+ if (!nv::Fit::eigenSolveSymmetric4(matrix, eigenValues, eigenVectors))
+ {
+ return Vector4(0.0f);
+ }
+
+ return eigenVectors[0];
+}
+
+Vector4 nv::Fit::computePrincipalComponent_EigenSolver(int n, const Vector4 *__restrict points)
+{
+ float matrix[10];
+ computeCovariance(n, points, matrix);
+
+ return firstEigenVector_EigenSolver4(matrix);
+}
+
+Vector4 nv::Fit::computePrincipalComponent_EigenSolver(int n, const Vector4 *__restrict points, const float *__restrict weights, Vector4::Arg metric)
+{
+ float matrix[10];
+ computeCovariance(n, points, weights, metric, matrix);
+
+ return firstEigenVector_EigenSolver4(matrix);
+}
+
+
+
+void ArvoSVD(int rows, int cols, float * Q, float * diag, float * R);
+
+Vector3 nv::Fit::computePrincipalComponent_SVD(int n, const Vector3 *__restrict points)
+{
+ // Store the points in an n x n matrix
+ Array<float> Q; Q.resize(n*n, 0.0f);
+ for (int i = 0; i < n; ++i)
+ {
+ Q[i*n+0] = points[i].x;
+ Q[i*n+1] = points[i].y;
+ Q[i*n+2] = points[i].z;
+ }
+
+ // Alloc space for the SVD outputs
+ Array<float> diag; diag.resize(n, 0.0f);
+ Array<float> R; R.resize(n*n, 0.0f);
+
+ ArvoSVD(n, n, &Q[0], &diag[0], &R[0]);
+
+ // Get the principal component
+ return Vector3(R[0], R[1], R[2]);
+}
+
+Vector4 nv::Fit::computePrincipalComponent_SVD(int n, const Vector4 *__restrict points)
+{
+ // Store the points in an n x n matrix
+ Array<float> Q; Q.resize(n*n, 0.0f);
+ for (int i = 0; i < n; ++i)
+ {
+ Q[i*n+0] = points[i].x;
+ Q[i*n+1] = points[i].y;
+ Q[i*n+2] = points[i].z;
+ Q[i*n+3] = points[i].w;
+ }
+
+ // Alloc space for the SVD outputs
+ Array<float> diag; diag.resize(n, 0.0f);
+ Array<float> R; R.resize(n*n, 0.0f);
+
+ ArvoSVD(n, n, &Q[0], &diag[0], &R[0]);
+
+ // Get the principal component
+ return Vector4(R[0], R[1], R[2], R[3]);
+}
+
+
+
+Plane nv::Fit::bestPlane(int n, const Vector3 *__restrict points)
+{
+ // compute the centroid and covariance
+ float matrix[6];
+ Vector3 centroid = computeCovariance(n, points, matrix);
+
+ if (matrix[0] == 0 && matrix[3] == 0 && matrix[5] == 0)
+ {
+ // If no plane defined, then return a horizontal plane.
+ return Plane(Vector3(0, 0, 1), centroid);
+ }
+
+ float eigenValues[3];
+ Vector3 eigenVectors[3];
+ if (!eigenSolveSymmetric3(matrix, eigenValues, eigenVectors)) {
+ // If no plane defined, then return a horizontal plane.
+ return Plane(Vector3(0, 0, 1), centroid);
+ }
+
+ return Plane(eigenVectors[2], centroid);
+}
+
+bool nv::Fit::isPlanar(int n, const Vector3 * points, float epsilon/*=NV_EPSILON*/)
+{
+ // compute the centroid and covariance
+ float matrix[6];
+ computeCovariance(n, points, matrix);
+
+ float eigenValues[3];
+ Vector3 eigenVectors[3];
+ if (!eigenSolveSymmetric3(matrix, eigenValues, eigenVectors)) {
+ return false;
+ }
+
+ return eigenValues[2] < epsilon;
+}
+
+
+
+// Tridiagonal solver from Charles Bloom.
+// Householder transforms followed by QL decomposition.
+// Seems to be based on the code from Numerical Recipes in C.
+
+static void EigenSolver3_Tridiagonal(float mat[3][3], float * diag, float * subd);
+static bool EigenSolver3_QLAlgorithm(float mat[3][3], float * diag, float * subd);
+
+bool nv::Fit::eigenSolveSymmetric3(const float matrix[6], float eigenValues[3], Vector3 eigenVectors[3])
+{
+ nvDebugCheck(matrix != NULL && eigenValues != NULL && eigenVectors != NULL);
+
+ float subd[3];
+ float diag[3];
+ float work[3][3];
+
+ work[0][0] = matrix[0];
+ work[0][1] = work[1][0] = matrix[1];
+ work[0][2] = work[2][0] = matrix[2];
+ work[1][1] = matrix[3];
+ work[1][2] = work[2][1] = matrix[4];
+ work[2][2] = matrix[5];
+
+ EigenSolver3_Tridiagonal(work, diag, subd);
+ if (!EigenSolver3_QLAlgorithm(work, diag, subd))
+ {
+ for (int i = 0; i < 3; i++) {
+ eigenValues[i] = 0;
+ eigenVectors[i] = Vector3(0);
+ }
+ return false;
+ }
+
+ for (int i = 0; i < 3; i++) {
+ eigenValues[i] = (float)diag[i];
+ }
+
+ // eigenvectors are the columns; make them the rows :
+
+ for (int i=0; i < 3; i++)
+ {
+ for (int j = 0; j < 3; j++)
+ {
+ eigenVectors[j].component[i] = (float) work[i][j];
+ }
+ }
+
+ // shuffle to sort by singular value :
+ if (eigenValues[2] > eigenValues[0] && eigenValues[2] > eigenValues[1])
+ {
+ swap(eigenValues[0], eigenValues[2]);
+ swap(eigenVectors[0], eigenVectors[2]);
+ }
+ if (eigenValues[1] > eigenValues[0])
+ {
+ swap(eigenValues[0], eigenValues[1]);
+ swap(eigenVectors[0], eigenVectors[1]);
+ }
+ if (eigenValues[2] > eigenValues[1])
+ {
+ swap(eigenValues[1], eigenValues[2]);
+ swap(eigenVectors[1], eigenVectors[2]);
+ }
+
+ nvDebugCheck(eigenValues[0] >= eigenValues[1] && eigenValues[0] >= eigenValues[2]);
+ nvDebugCheck(eigenValues[1] >= eigenValues[2]);
+
+ return true;
+}
+
+static void EigenSolver3_Tridiagonal(float mat[3][3], float * diag, float * subd)
+{
+ // Householder reduction T = Q^t M Q
+ // Input:
+ // mat, symmetric 3x3 matrix M
+ // Output:
+ // mat, orthogonal matrix Q
+ // diag, diagonal entries of T
+ // subd, subdiagonal entries of T (T is symmetric)
+ const float epsilon = 1e-08f;
+
+ float a = mat[0][0];
+ float b = mat[0][1];
+ float c = mat[0][2];
+ float d = mat[1][1];
+ float e = mat[1][2];
+ float f = mat[2][2];
+
+ diag[0] = a;
+ subd[2] = 0.f;
+ if (fabsf(c) >= epsilon)
+ {
+ const float ell = sqrtf(b*b+c*c);
+ b /= ell;
+ c /= ell;
+ const float q = 2*b*e+c*(f-d);
+ diag[1] = d+c*q;
+ diag[2] = f-c*q;
+ subd[0] = ell;
+ subd[1] = e-b*q;
+ mat[0][0] = 1; mat[0][1] = 0; mat[0][2] = 0;
+ mat[1][0] = 0; mat[1][1] = b; mat[1][2] = c;
+ mat[2][0] = 0; mat[2][1] = c; mat[2][2] = -b;
+ }
+ else
+ {
+ diag[1] = d;
+ diag[2] = f;
+ subd[0] = b;
+ subd[1] = e;
+ mat[0][0] = 1; mat[0][1] = 0; mat[0][2] = 0;
+ mat[1][0] = 0; mat[1][1] = 1; mat[1][2] = 0;
+ mat[2][0] = 0; mat[2][1] = 0; mat[2][2] = 1;
+ }
+}
+
+static bool EigenSolver3_QLAlgorithm(float mat[3][3], float * diag, float * subd)
+{
+ // QL iteration with implicit shifting to reduce matrix from tridiagonal
+ // to diagonal
+ const int maxiter = 32;
+
+ for (int ell = 0; ell < 3; ell++)
+ {
+ int iter;
+ for (iter = 0; iter < maxiter; iter++)
+ {
+ int m;
+ for (m = ell; m <= 1; m++)
+ {
+ float dd = fabsf(diag[m]) + fabsf(diag[m+1]);
+ if ( fabsf(subd[m]) + dd == dd )
+ break;
+ }
+ if ( m == ell )
+ break;
+
+ float g = (diag[ell+1]-diag[ell])/(2*subd[ell]);
+ float r = sqrtf(g*g+1);
+ if ( g < 0 )
+ g = diag[m]-diag[ell]+subd[ell]/(g-r);
+ else
+ g = diag[m]-diag[ell]+subd[ell]/(g+r);
+ float s = 1, c = 1, p = 0;
+ for (int i = m-1; i >= ell; i--)
+ {
+ float f = s*subd[i], b = c*subd[i];
+ if ( fabsf(f) >= fabsf(g) )
+ {
+ c = g/f;
+ r = sqrtf(c*c+1);
+ subd[i+1] = f*r;
+ c *= (s = 1/r);
+ }
+ else
+ {
+ s = f/g;
+ r = sqrtf(s*s+1);
+ subd[i+1] = g*r;
+ s *= (c = 1/r);
+ }
+ g = diag[i+1]-p;
+ r = (diag[i]-g)*s+2*b*c;
+ p = s*r;
+ diag[i+1] = g+p;
+ g = c*r-b;
+
+ for (int k = 0; k < 3; k++)
+ {
+ f = mat[k][i+1];
+ mat[k][i+1] = s*mat[k][i]+c*f;
+ mat[k][i] = c*mat[k][i]-s*f;
+ }
+ }
+ diag[ell] -= p;
+ subd[ell] = g;
+ subd[m] = 0;
+ }
+
+ if ( iter == maxiter )
+ // should not get here under normal circumstances
+ return false;
+ }
+
+ return true;
+}
+
+
+
+// Tridiagonal solver for 4x4 symmetric matrices.
+
+static void EigenSolver4_Tridiagonal(float mat[4][4], float * diag, float * subd);
+static bool EigenSolver4_QLAlgorithm(float mat[4][4], float * diag, float * subd);
+
+bool nv::Fit::eigenSolveSymmetric4(const float matrix[10], float eigenValues[4], Vector4 eigenVectors[4])
+{
+ nvDebugCheck(matrix != NULL && eigenValues != NULL && eigenVectors != NULL);
+
+ float subd[4];
+ float diag[4];
+ float work[4][4];
+
+ work[0][0] = matrix[0];
+ work[0][1] = work[1][0] = matrix[1];
+ work[0][2] = work[2][0] = matrix[2];
+ work[0][3] = work[3][0] = matrix[3];
+ work[1][1] = matrix[4];
+ work[1][2] = work[2][1] = matrix[5];
+ work[1][3] = work[3][1] = matrix[6];
+ work[2][2] = matrix[7];
+ work[2][3] = work[3][2] = matrix[8];
+ work[3][3] = matrix[9];
+
+ EigenSolver4_Tridiagonal(work, diag, subd);
+ if (!EigenSolver4_QLAlgorithm(work, diag, subd))
+ {
+ for (int i = 0; i < 4; i++) {
+ eigenValues[i] = 0;
+ eigenVectors[i] = Vector4(0);
+ }
+ return false;
+ }
+
+ for (int i = 0; i < 4; i++) {
+ eigenValues[i] = (float)diag[i];
+ }
+
+ // eigenvectors are the columns; make them the rows
+
+ for (int i = 0; i < 4; i++)
+ {
+ for (int j = 0; j < 4; j++)
+ {
+ eigenVectors[j].component[i] = (float) work[i][j];
+ }
+ }
+
+ // sort by singular value
+
+ for (int i = 0; i < 3; ++i)
+ {
+ for (int j = i+1; j < 4; ++j)
+ {
+ if (eigenValues[j] > eigenValues[i])
+ {
+ swap(eigenValues[i], eigenValues[j]);
+ swap(eigenVectors[i], eigenVectors[j]);
+ }
+ }
+ }
+
+ nvDebugCheck(eigenValues[0] >= eigenValues[1] && eigenValues[0] >= eigenValues[2] && eigenValues[0] >= eigenValues[3]);
+ nvDebugCheck(eigenValues[1] >= eigenValues[2] && eigenValues[1] >= eigenValues[3]);
+ nvDebugCheck(eigenValues[2] >= eigenValues[2]);
+
+ return true;
+}
+
+inline float signNonzero(float x)
+{
+ return (x >= 0.0f) ? 1.0f : -1.0f;
+}
+
+static void EigenSolver4_Tridiagonal(float mat[4][4], float * diag, float * subd)
+{
+ // Householder reduction T = Q^t M Q
+ // Input:
+ // mat, symmetric 3x3 matrix M
+ // Output:
+ // mat, orthogonal matrix Q
+ // diag, diagonal entries of T
+ // subd, subdiagonal entries of T (T is symmetric)
+
+ static const int n = 4;
+
+ // Set epsilon relative to size of elements in matrix
+ static const float relEpsilon = 1e-6f;
+ float maxElement = FLT_MAX;
+ for (int i = 0; i < n; ++i)
+ for (int j = 0; j < n; ++j)
+ maxElement = max(maxElement, fabsf(mat[i][j]));
+ float epsilon = relEpsilon * maxElement;
+
+ // Iterative algorithm, works for any size of matrix but might be slower than
+ // a closed-form solution for symmetric 4x4 matrices. Based on this article:
+ // http://en.wikipedia.org/wiki/Householder_transformation#Tridiagonalization
+
+ Matrix A, Q(identity);
+ memcpy(&A, mat, sizeof(float)*n*n);
+
+ // We proceed from left to right, making the off-tridiagonal entries zero in
+ // one column of the matrix at a time.
+ for (int k = 0; k < n - 2; ++k)
+ {
+ float sum = 0.0f;
+ for (int j = k+1; j < n; ++j)
+ sum += A(j,k)*A(j,k);
+ float alpha = -signNonzero(A(k+1,k)) * sqrtf(sum);
+ float r = sqrtf(0.5f * (alpha*alpha - A(k+1,k)*alpha));
+
+ // If r is zero, skip this column - already in tridiagonal form
+ if (fabsf(r) < epsilon)
+ continue;
+
+ float v[n] = {};
+ v[k+1] = 0.5f * (A(k+1,k) - alpha) / r;
+ for (int j = k+2; j < n; ++j)
+ v[j] = 0.5f * A(j,k) / r;
+
+ Matrix P(identity);
+ for (int i = 0; i < n; ++i)
+ for (int j = 0; j < n; ++j)
+ P(i,j) -= 2.0f * v[i] * v[j];
+
+ A = mul(mul(P, A), P);
+ Q = mul(Q, P);
+ }
+
+ nvDebugCheck(fabsf(A(2,0)) < epsilon);
+ nvDebugCheck(fabsf(A(0,2)) < epsilon);
+ nvDebugCheck(fabsf(A(3,0)) < epsilon);
+ nvDebugCheck(fabsf(A(0,3)) < epsilon);
+ nvDebugCheck(fabsf(A(3,1)) < epsilon);
+ nvDebugCheck(fabsf(A(1,3)) < epsilon);
+
+ for (int i = 0; i < n; ++i)
+ diag[i] = A(i,i);
+ for (int i = 0; i < n - 1; ++i)
+ subd[i] = A(i+1,i);
+ subd[n-1] = 0.0f;
+
+ memcpy(mat, &Q, sizeof(float)*n*n);
+}
+
+static bool EigenSolver4_QLAlgorithm(float mat[4][4], float * diag, float * subd)
+{
+ // QL iteration with implicit shifting to reduce matrix from tridiagonal
+ // to diagonal
+ const int maxiter = 32;
+
+ for (int ell = 0; ell < 4; ell++)
+ {
+ int iter;
+ for (iter = 0; iter < maxiter; iter++)
+ {
+ int m;
+ for (m = ell; m < 3; m++)
+ {
+ float dd = fabsf(diag[m]) + fabsf(diag[m+1]);
+ if ( fabsf(subd[m]) + dd == dd )
+ break;
+ }
+ if ( m == ell )
+ break;
+
+ float g = (diag[ell+1]-diag[ell])/(2*subd[ell]);
+ float r = sqrtf(g*g+1);
+ if ( g < 0 )
+ g = diag[m]-diag[ell]+subd[ell]/(g-r);
+ else
+ g = diag[m]-diag[ell]+subd[ell]/(g+r);
+ float s = 1, c = 1, p = 0;
+ for (int i = m-1; i >= ell; i--)
+ {
+ float f = s*subd[i], b = c*subd[i];
+ if ( fabsf(f) >= fabsf(g) )
+ {
+ c = g/f;
+ r = sqrtf(c*c+1);
+ subd[i+1] = f*r;
+ c *= (s = 1/r);
+ }
+ else
+ {
+ s = f/g;
+ r = sqrtf(s*s+1);
+ subd[i+1] = g*r;
+ s *= (c = 1/r);
+ }
+ g = diag[i+1]-p;
+ r = (diag[i]-g)*s+2*b*c;
+ p = s*r;
+ diag[i+1] = g+p;
+ g = c*r-b;
+
+ for (int k = 0; k < 4; k++)
+ {
+ f = mat[k][i+1];
+ mat[k][i+1] = s*mat[k][i]+c*f;
+ mat[k][i] = c*mat[k][i]-s*f;
+ }
+ }
+ diag[ell] -= p;
+ subd[ell] = g;
+ subd[m] = 0;
+ }
+
+ if ( iter == maxiter )
+ // should not get here under normal circumstances
+ return false;
+ }
+
+ return true;
+}
+
+
+
+int nv::Fit::compute4Means(int n, const Vector3 *__restrict points, const float *__restrict weights, Vector3::Arg metric, Vector3 *__restrict cluster)
+{
+ // Compute principal component.
+ float matrix[6];
+ Vector3 centroid = computeCovariance(n, points, weights, metric, matrix);
+ Vector3 principal = firstEigenVector_PowerMethod(matrix);
+
+ // Pick initial solution.
+ int mini, maxi;
+ mini = maxi = 0;
+
+ float mindps, maxdps;
+ mindps = maxdps = dot(points[0] - centroid, principal);
+
+ for (int i = 1; i < n; ++i)
+ {
+ float dps = dot(points[i] - centroid, principal);
+
+ if (dps < mindps) {
+ mindps = dps;
+ mini = i;
+ }
+ else {
+ maxdps = dps;
+ maxi = i;
+ }
+ }
+
+ cluster[0] = centroid + mindps * principal;
+ cluster[1] = centroid + maxdps * principal;
+ cluster[2] = (2.0f * cluster[0] + cluster[1]) / 3.0f;
+ cluster[3] = (2.0f * cluster[1] + cluster[0]) / 3.0f;
+
+ // Now we have to iteratively refine the clusters.
+ while (true)
+ {
+ Vector3 newCluster[4] = { Vector3(0.0f), Vector3(0.0f), Vector3(0.0f), Vector3(0.0f) };
+ float total[4] = {0, 0, 0, 0};
+
+ for (int i = 0; i < n; ++i)
+ {
+ // Find nearest cluster.
+ int nearest = 0;
+ float mindist = FLT_MAX;
+ for (int j = 0; j < 4; j++)
+ {
+ float dist = lengthSquared((cluster[j] - points[i]) * metric);
+ if (dist < mindist)
+ {
+ mindist = dist;
+ nearest = j;
+ }
+ }
+
+ newCluster[nearest] += weights[i] * points[i];
+ total[nearest] += weights[i];
+ }
+
+ for (int j = 0; j < 4; j++)
+ {
+ if (total[j] != 0)
+ newCluster[j] /= total[j];
+ }
+
+ if (equal(cluster[0], newCluster[0]) && equal(cluster[1], newCluster[1]) &&
+ equal(cluster[2], newCluster[2]) && equal(cluster[3], newCluster[3]))
+ {
+ return (total[0] != 0) + (total[1] != 0) + (total[2] != 0) + (total[3] != 0);
+ }
+
+ cluster[0] = newCluster[0];
+ cluster[1] = newCluster[1];
+ cluster[2] = newCluster[2];
+ cluster[3] = newCluster[3];
+
+ // Sort clusters by weight.
+ for (int i = 0; i < 4; i++)
+ {
+ for (int j = i; j > 0 && total[j] > total[j - 1]; j--)
+ {
+ swap( total[j], total[j - 1] );
+ swap( cluster[j], cluster[j - 1] );
+ }
+ }
+ }
+}
+
+
+
+// Adaptation of James Arvo's SVD code, as found in ZOH.
+
+inline float Sqr(float x) { return x*x; }
+
+inline float svd_pythag( float a, float b )
+{
+ float at = fabsf(a);
+ float bt = fabsf(b);
+ if( at > bt )
+ return at * sqrtf( 1.0f + Sqr( bt / at ) );
+ else if( bt > 0.0f )
+ return bt * sqrtf( 1.0f + Sqr( at / bt ) );
+ else return 0.0f;
+}
+
+inline float SameSign( float a, float b )
+{
+ float t;
+ if( b >= 0.0f ) t = fabsf( a );
+ else t = -fabsf( a );
+ return t;
+}
+
+void ArvoSVD(int rows, int cols, float * Q, float * diag, float * R)
+{
+ static const int MaxIterations = 30;
+
+ int i, j, k, l, p, q, iter;
+ float c, f, h, s, x, y, z;
+ float norm = 0.0f;
+ float g = 0.0f;
+ float scale = 0.0f;
+
+ Array<float> temp; temp.resize(cols, 0.0f);
+
+ for( i = 0; i < cols; i++ )
+ {
+ temp[i] = scale * g;
+ scale = 0.0f;
+ g = 0.0f;
+ s = 0.0f;
+ l = i + 1;
+
+ if( i < rows )
+ {
+ for( k = i; k < rows; k++ ) scale += fabsf( Q[k*cols+i] );
+ if( scale != 0.0f )
+ {
+ for( k = i; k < rows; k++ )
+ {
+ Q[k*cols+i] /= scale;
+ s += Sqr( Q[k*cols+i] );
+ }
+ f = Q[i*cols+i];
+ g = -SameSign( sqrtf(s), f );
+ h = f * g - s;
+ Q[i*cols+i] = f - g;
+ if( i != cols - 1 )
+ {
+ for( j = l; j < cols; j++ )
+ {
+ s = 0.0f;
+ for( k = i; k < rows; k++ ) s += Q[k*cols+i] * Q[k*cols+j];
+ f = s / h;
+ for( k = i; k < rows; k++ ) Q[k*cols+j] += f * Q[k*cols+i];
+ }
+ }
+ for( k = i; k < rows; k++ ) Q[k*cols+i] *= scale;
+ }
+ }
+
+ diag[i] = scale * g;
+ g = 0.0f;
+ s = 0.0f;
+ scale = 0.0f;
+
+ if( i < rows && i != cols - 1 )
+ {
+ for( k = l; k < cols; k++ ) scale += fabsf( Q[i*cols+k] );
+ if( scale != 0.0f )
+ {
+ for( k = l; k < cols; k++ )
+ {
+ Q[i*cols+k] /= scale;
+ s += Sqr( Q[i*cols+k] );
+ }
+ f = Q[i*cols+l];
+ g = -SameSign( sqrtf(s), f );
+ h = f * g - s;
+ Q[i*cols+l] = f - g;
+ for( k = l; k < cols; k++ ) temp[k] = Q[i*cols+k] / h;
+ if( i != rows - 1 )
+ {
+ for( j = l; j < rows; j++ )
+ {
+ s = 0.0f;
+ for( k = l; k < cols; k++ ) s += Q[j*cols+k] * Q[i*cols+k];
+ for( k = l; k < cols; k++ ) Q[j*cols+k] += s * temp[k];
+ }
+ }
+ for( k = l; k < cols; k++ ) Q[i*cols+k] *= scale;
+ }
+ }
+ norm = max( norm, fabsf( diag[i] ) + fabsf( temp[i] ) );
+ }
+
+
+ for( i = cols - 1; i >= 0; i-- )
+ {
+ if( i < cols - 1 )
+ {
+ if( g != 0.0f )
+ {
+ for( j = l; j < cols; j++ ) R[i*cols+j] = ( Q[i*cols+j] / Q[i*cols+l] ) / g;
+ for( j = l; j < cols; j++ )
+ {
+ s = 0.0f;
+ for( k = l; k < cols; k++ ) s += Q[i*cols+k] * R[j*cols+k];
+ for( k = l; k < cols; k++ ) R[j*cols+k] += s * R[i*cols+k];
+ }
+ }
+ for( j = l; j < cols; j++ )
+ {
+ R[i*cols+j] = 0.0f;
+ R[j*cols+i] = 0.0f;
+ }
+ }
+ R[i*cols+i] = 1.0f;
+ g = temp[i];
+ l = i;
+ }
+
+
+ for( i = cols - 1; i >= 0; i-- )
+ {
+ l = i + 1;
+ g = diag[i];
+ if( i < cols - 1 ) for( j = l; j < cols; j++ ) Q[i*cols+j] = 0.0f;
+ if( g != 0.0f )
+ {
+ g = 1.0f / g;
+ if( i != cols - 1 )
+ {
+ for( j = l; j < cols; j++ )
+ {
+ s = 0.0f;
+ for( k = l; k < rows; k++ ) s += Q[k*cols+i] * Q[k*cols+j];
+ f = ( s / Q[i*cols+i] ) * g;
+ for( k = i; k < rows; k++ ) Q[k*cols+j] += f * Q[k*cols+i];
+ }
+ }
+ for( j = i; j < rows; j++ ) Q[j*cols+i] *= g;
+ }
+ else
+ {
+ for( j = i; j < rows; j++ ) Q[j*cols+i] = 0.0f;
+ }
+ Q[i*cols+i] += 1.0f;
+ }
+
+
+ for( k = cols - 1; k >= 0; k-- )
+ {
+ for( iter = 1; iter <= MaxIterations; iter++ )
+ {
+ int jump;
+
+ for( l = k; l >= 0; l-- )
+ {
+ q = l - 1;
+ if( fabsf( temp[l] ) + norm == norm ) { jump = 1; break; }
+ if( fabsf( diag[q] ) + norm == norm ) { jump = 0; break; }
+ }
+
+ if( !jump )
+ {
+ c = 0.0f;
+ s = 1.0f;
+ for( i = l; i <= k; i++ )
+ {
+ f = s * temp[i];
+ temp[i] *= c;
+ if( fabsf( f ) + norm == norm ) break;
+ g = diag[i];
+ h = svd_pythag( f, g );
+ diag[i] = h;
+ h = 1.0f / h;
+ c = g * h;
+ s = -f * h;
+ for( j = 0; j < rows; j++ )
+ {
+ y = Q[j*cols+q];
+ z = Q[j*cols+i];
+ Q[j*cols+q] = y * c + z * s;
+ Q[j*cols+i] = z * c - y * s;
+ }
+ }
+ }
+
+ z = diag[k];
+ if( l == k )
+ {
+ if( z < 0.0f )
+ {
+ diag[k] = -z;
+ for( j = 0; j < cols; j++ ) R[k*cols+j] *= -1.0f;
+ }
+ break;
+ }
+ if( iter >= MaxIterations ) return;
+ x = diag[l];
+ q = k - 1;
+ y = diag[q];
+ g = temp[q];
+ h = temp[k];
+ f = ( ( y - z ) * ( y + z ) + ( g - h ) * ( g + h ) ) / ( 2.0f * h * y );
+ g = svd_pythag( f, 1.0f );
+ f = ( ( x - z ) * ( x + z ) + h * ( ( y / ( f + SameSign( g, f ) ) ) - h ) ) / x;
+ c = 1.0f;
+ s = 1.0f;
+ for( j = l; j <= q; j++ )
+ {
+ i = j + 1;
+ g = temp[i];
+ y = diag[i];
+ h = s * g;
+ g = c * g;
+ z = svd_pythag( f, h );
+ temp[j] = z;
+ c = f / z;
+ s = h / z;
+ f = x * c + g * s;
+ g = g * c - x * s;
+ h = y * s;
+ y = y * c;
+ for( p = 0; p < cols; p++ )
+ {
+ x = R[j*cols+p];
+ z = R[i*cols+p];
+ R[j*cols+p] = x * c + z * s;
+ R[i*cols+p] = z * c - x * s;
+ }
+ z = svd_pythag( f, h );
+ diag[j] = z;
+ if( z != 0.0f )
+ {
+ z = 1.0f / z;
+ c = f * z;
+ s = h * z;
+ }
+ f = c * g + s * y;
+ x = c * y - s * g;
+ for( p = 0; p < rows; p++ )
+ {
+ y = Q[p*cols+j];
+ z = Q[p*cols+i];
+ Q[p*cols+j] = y * c + z * s;
+ Q[p*cols+i] = z * c - y * s;
+ }
+ }
+ temp[l] = 0.0f;
+ temp[k] = f;
+ diag[k] = x;
+ }
+ }
+
+ // Sort the singular values into descending order.
+
+ for( i = 0; i < cols - 1; i++ )
+ {
+ float biggest = diag[i]; // Biggest singular value so far.
+ int bindex = i; // The row/col it occurred in.
+ for( j = i + 1; j < cols; j++ )
+ {
+ if( diag[j] > biggest )
+ {
+ biggest = diag[j];
+ bindex = j;
+ }
+ }
+ if( bindex != i ) // Need to swap rows and columns.
+ {
+ // Swap columns in Q.
+ for (int j = 0; j < rows; ++j)
+ swap(Q[j*cols+i], Q[j*cols+bindex]);
+
+ // Swap rows in R.
+ for (int j = 0; j < rows; ++j)
+ swap(R[i*cols+j], R[bindex*cols+j]);
+
+ // Swap elements in diag.
+ swap(diag[i], diag[bindex]);
+ }
+ }
+}
diff --git a/3rdparty/bgfx/3rdparty/nvtt/nvmath/fitting.h b/3rdparty/bgfx/3rdparty/nvtt/nvmath/fitting.h
new file mode 100644
index 00000000000..e8350458058
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/nvtt/nvmath/fitting.h
@@ -0,0 +1,49 @@
+// This code is in the public domain -- Ignacio Castaño <castano@gmail.com>
+
+#ifndef NV_MATH_FITTING_H
+#define NV_MATH_FITTING_H
+
+#include "vector.h"
+#include "plane.h"
+
+namespace nv
+{
+ namespace Fit
+ {
+ Vector3 computeCentroid(int n, const Vector3 * points);
+ Vector3 computeCentroid(int n, const Vector3 * points, const float * weights, const Vector3 & metric);
+
+ Vector4 computeCentroid(int n, const Vector4 * points);
+ Vector4 computeCentroid(int n, const Vector4 * points, const float * weights, const Vector4 & metric);
+
+ Vector3 computeCovariance(int n, const Vector3 * points, float * covariance);
+ Vector3 computeCovariance(int n, const Vector3 * points, const float * weights, const Vector3 & metric, float * covariance);
+
+ Vector4 computeCovariance(int n, const Vector4 * points, float * covariance);
+ Vector4 computeCovariance(int n, const Vector4 * points, const float * weights, const Vector4 & metric, float * covariance);
+
+ Vector3 computePrincipalComponent_PowerMethod(int n, const Vector3 * points);
+ Vector3 computePrincipalComponent_PowerMethod(int n, const Vector3 * points, const float * weights, const Vector3 & metric);
+
+ Vector3 computePrincipalComponent_EigenSolver(int n, const Vector3 * points);
+ Vector3 computePrincipalComponent_EigenSolver(int n, const Vector3 * points, const float * weights, const Vector3 & metric);
+
+ Vector4 computePrincipalComponent_EigenSolver(int n, const Vector4 * points);
+ Vector4 computePrincipalComponent_EigenSolver(int n, const Vector4 * points, const float * weights, const Vector4 & metric);
+
+ Vector3 computePrincipalComponent_SVD(int n, const Vector3 * points);
+ Vector4 computePrincipalComponent_SVD(int n, const Vector4 * points);
+
+ Plane bestPlane(int n, const Vector3 * points);
+ bool isPlanar(int n, const Vector3 * points, float epsilon = NV_EPSILON);
+
+ bool eigenSolveSymmetric3(const float matrix[6], float eigenValues[3], Vector3 eigenVectors[3]);
+ bool eigenSolveSymmetric4(const float matrix[10], float eigenValues[4], Vector4 eigenVectors[4]);
+
+ // Returns number of clusters [1-4].
+ int compute4Means(int n, const Vector3 * points, const float * weights, const Vector3 & metric, Vector3 * cluster);
+ }
+
+} // nv namespace
+
+#endif // NV_MATH_FITTING_H
diff --git a/3rdparty/bgfx/3rdparty/nvtt/nvmath/matrix.h b/3rdparty/bgfx/3rdparty/nvtt/nvmath/matrix.h
new file mode 100644
index 00000000000..901a98278dd
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/nvtt/nvmath/matrix.h
@@ -0,0 +1,112 @@
+// This code is in the public domain -- castanyo@yahoo.es
+
+#ifndef NV_MATH_MATRIX_H
+#define NV_MATH_MATRIX_H
+
+#include "vector.h"
+
+// - Matrices are stored in memory in *column major* order.
+// - Points are to be though of as column vectors.
+// - Transformation of a point p by a matrix M is: p' = M * p
+
+namespace nv
+{
+ enum identity_t { identity };
+
+ // 3x3 matrix.
+ class NVMATH_CLASS Matrix3
+ {
+ public:
+ Matrix3();
+ explicit Matrix3(float f);
+ explicit Matrix3(identity_t);
+ Matrix3(const Matrix3 & m);
+ Matrix3(Vector3::Arg v0, Vector3::Arg v1, Vector3::Arg v2);
+
+ float data(uint idx) const;
+ float & data(uint idx);
+ float get(uint row, uint col) const;
+ float operator()(uint row, uint col) const;
+ float & operator()(uint row, uint col);
+
+ Vector3 row(uint i) const;
+ Vector3 column(uint i) const;
+
+ void operator*=(float s);
+ void operator/=(float s);
+ void operator+=(const Matrix3 & m);
+ void operator-=(const Matrix3 & m);
+
+ void scale(float s);
+ void scale(Vector3::Arg s);
+ float determinant() const;
+
+ private:
+ float m_data[9];
+ };
+
+ // Solve equation system using LU decomposition and back-substitution.
+ extern bool solveLU(const Matrix3 & m, const Vector3 & b, Vector3 * x);
+
+ // Solve equation system using Cramer's inverse.
+ extern bool solveCramer(const Matrix3 & A, const Vector3 & b, Vector3 * x);
+
+
+ // 4x4 matrix.
+ class NVMATH_CLASS Matrix
+ {
+ public:
+ typedef Matrix const & Arg;
+
+ Matrix();
+ explicit Matrix(float f);
+ explicit Matrix(identity_t);
+ Matrix(const Matrix3 & m);
+ Matrix(const Matrix & m);
+ Matrix(Vector4::Arg v0, Vector4::Arg v1, Vector4::Arg v2, Vector4::Arg v3);
+ //explicit Matrix(const float m[]); // m is assumed to contain 16 elements
+
+ float data(uint idx) const;
+ float & data(uint idx);
+ float get(uint row, uint col) const;
+ float operator()(uint row, uint col) const;
+ float & operator()(uint row, uint col);
+ const float * ptr() const;
+
+ Vector4 row(uint i) const;
+ Vector4 column(uint i) const;
+
+ void zero();
+ void identity();
+
+ void scale(float s);
+ void scale(Vector3::Arg s);
+ void translate(Vector3::Arg t);
+ void rotate(float theta, float v0, float v1, float v2);
+ float determinant() const;
+
+ void operator+=(const Matrix & m);
+ void operator-=(const Matrix & m);
+
+ void apply(Matrix::Arg m);
+
+ private:
+ float m_data[16];
+ };
+
+ // Solve equation system using LU decomposition and back-substitution.
+ extern bool solveLU(const Matrix & A, const Vector4 & b, Vector4 * x);
+
+ // Solve equation system using Cramer's inverse.
+ extern bool solveCramer(const Matrix & A, const Vector4 & b, Vector4 * x);
+
+ // Compute inverse using LU decomposition.
+ extern Matrix inverseLU(const Matrix & m);
+
+ // Compute inverse using Gaussian elimination and partial pivoting.
+ extern Matrix inverse(const Matrix & m);
+ extern Matrix3 inverse(const Matrix3 & m);
+
+} // nv namespace
+
+#endif // NV_MATH_MATRIX_H
diff --git a/3rdparty/bgfx/3rdparty/nvtt/nvmath/matrix.inl b/3rdparty/bgfx/3rdparty/nvtt/nvmath/matrix.inl
new file mode 100644
index 00000000000..60b56941c53
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/nvtt/nvmath/matrix.inl
@@ -0,0 +1,1274 @@
+// This code is in the public domain -- castanyo@yahoo.es
+
+#pragma once
+#ifndef NV_MATH_MATRIX_INL
+#define NV_MATH_MATRIX_INL
+
+#include "matrix.h"
+
+namespace nv
+{
+ inline Matrix3::Matrix3() {}
+
+ inline Matrix3::Matrix3(float f)
+ {
+ for(int i = 0; i < 9; i++) {
+ m_data[i] = f;
+ }
+ }
+
+ inline Matrix3::Matrix3(identity_t)
+ {
+ for(int i = 0; i < 3; i++) {
+ for(int j = 0; j < 3; j++) {
+ m_data[3*j+i] = (i == j) ? 1.0f : 0.0f;
+ }
+ }
+ }
+
+ inline Matrix3::Matrix3(const Matrix3 & m)
+ {
+ for(int i = 0; i < 9; i++) {
+ m_data[i] = m.m_data[i];
+ }
+ }
+
+ inline Matrix3::Matrix3(Vector3::Arg v0, Vector3::Arg v1, Vector3::Arg v2)
+ {
+ m_data[0] = v0.x; m_data[1] = v0.y; m_data[2] = v0.z;
+ m_data[3] = v1.x; m_data[4] = v1.y; m_data[5] = v1.z;
+ m_data[6] = v2.x; m_data[7] = v2.y; m_data[8] = v2.z;
+ }
+
+ inline float Matrix3::data(uint idx) const
+ {
+ nvDebugCheck(idx < 9);
+ return m_data[idx];
+ }
+ inline float & Matrix3::data(uint idx)
+ {
+ nvDebugCheck(idx < 9);
+ return m_data[idx];
+ }
+ inline float Matrix3::get(uint row, uint col) const
+ {
+ nvDebugCheck(row < 3 && col < 3);
+ return m_data[col * 3 + row];
+ }
+ inline float Matrix3::operator()(uint row, uint col) const
+ {
+ nvDebugCheck(row < 3 && col < 3);
+ return m_data[col * 3 + row];
+ }
+ inline float & Matrix3::operator()(uint row, uint col)
+ {
+ nvDebugCheck(row < 3 && col < 3);
+ return m_data[col * 3 + row];
+ }
+
+ inline Vector3 Matrix3::row(uint i) const
+ {
+ nvDebugCheck(i < 3);
+ return Vector3(get(i, 0), get(i, 1), get(i, 2));
+ }
+ inline Vector3 Matrix3::column(uint i) const
+ {
+ nvDebugCheck(i < 3);
+ return Vector3(get(0, i), get(1, i), get(2, i));
+ }
+
+ inline void Matrix3::operator*=(float s)
+ {
+ for(int i = 0; i < 9; i++) {
+ m_data[i] *= s;
+ }
+ }
+
+ inline void Matrix3::operator/=(float s)
+ {
+ float is = 1.0f /s;
+ for(int i = 0; i < 9; i++) {
+ m_data[i] *= is;
+ }
+ }
+
+ inline void Matrix3::operator+=(const Matrix3 & m)
+ {
+ for(int i = 0; i < 9; i++) {
+ m_data[i] += m.m_data[i];
+ }
+ }
+
+ inline void Matrix3::operator-=(const Matrix3 & m)
+ {
+ for(int i = 0; i < 9; i++) {
+ m_data[i] -= m.m_data[i];
+ }
+ }
+
+ inline Matrix3 operator+(const Matrix3 & a, const Matrix3 & b)
+ {
+ Matrix3 m = a;
+ m += b;
+ return m;
+ }
+
+ inline Matrix3 operator-(const Matrix3 & a, const Matrix3 & b)
+ {
+ Matrix3 m = a;
+ m -= b;
+ return m;
+ }
+
+ inline Matrix3 operator*(const Matrix3 & a, float s)
+ {
+ Matrix3 m = a;
+ m *= s;
+ return m;
+ }
+
+ inline Matrix3 operator*(float s, const Matrix3 & a)
+ {
+ Matrix3 m = a;
+ m *= s;
+ return m;
+ }
+
+ inline Matrix3 operator/(const Matrix3 & a, float s)
+ {
+ Matrix3 m = a;
+ m /= s;
+ return m;
+ }
+
+ inline Matrix3 mul(const Matrix3 & a, const Matrix3 & b)
+ {
+ Matrix3 m;
+
+ for(int i = 0; i < 3; i++) {
+ const float ai0 = a(i,0), ai1 = a(i,1), ai2 = a(i,2);
+ m(i, 0) = ai0 * b(0,0) + ai1 * b(1,0) + ai2 * b(2,0);
+ m(i, 1) = ai0 * b(0,1) + ai1 * b(1,1) + ai2 * b(2,1);
+ m(i, 2) = ai0 * b(0,2) + ai1 * b(1,2) + ai2 * b(2,2);
+ }
+
+ return m;
+ }
+
+ inline Matrix3 operator*(const Matrix3 & a, const Matrix3 & b)
+ {
+ return mul(a, b);
+ }
+
+ // Transform the given 3d vector with the given matrix.
+ inline Vector3 transform(const Matrix3 & m, const Vector3 & p)
+ {
+ return Vector3(
+ p.x * m(0,0) + p.y * m(0,1) + p.z * m(0,2),
+ p.x * m(1,0) + p.y * m(1,1) + p.z * m(1,2),
+ p.x * m(2,0) + p.y * m(2,1) + p.z * m(2,2));
+ }
+
+ inline void Matrix3::scale(float s)
+ {
+ for (int i = 0; i < 9; i++) {
+ m_data[i] *= s;
+ }
+ }
+
+ inline void Matrix3::scale(Vector3::Arg s)
+ {
+ m_data[0] *= s.x; m_data[1] *= s.x; m_data[2] *= s.x;
+ m_data[3] *= s.y; m_data[4] *= s.y; m_data[5] *= s.y;
+ m_data[6] *= s.z; m_data[7] *= s.z; m_data[8] *= s.z;
+ }
+
+ inline float Matrix3::determinant() const
+ {
+ return
+ get(0,0) * get(1,1) * get(2,2) +
+ get(0,1) * get(1,2) * get(2,0) +
+ get(0,2) * get(1,0) * get(2,1) -
+ get(0,2) * get(1,1) * get(2,0) -
+ get(0,1) * get(1,0) * get(2,2) -
+ get(0,0) * get(1,2) * get(2,1);
+ }
+
+ // Inverse using Cramer's rule.
+ inline Matrix3 inverseCramer(const Matrix3 & m)
+ {
+ const float det = m.determinant();
+ if (equal(det, 0.0f, 0.0f)) {
+ return Matrix3(0);
+ }
+
+ Matrix3 r;
+
+ r.data(0) = - m.data(5) * m.data(7) + m.data(4) * m.data(8);
+ r.data(1) = + m.data(5) * m.data(6) - m.data(3) * m.data(8);
+ r.data(2) = - m.data(4) * m.data(6) + m.data(3) * m.data(7);
+
+ r.data(3) = + m.data(2) * m.data(7) - m.data(1) * m.data(8);
+ r.data(4) = - m.data(2) * m.data(6) + m.data(0) * m.data(8);
+ r.data(5) = + m.data(1) * m.data(6) - m.data(0) * m.data(7);
+
+ r.data(6) = - m.data(2) * m.data(4) + m.data(1) * m.data(5);
+ r.data(7) = + m.data(2) * m.data(3) - m.data(0) * m.data(5);
+ r.data(8) = - m.data(1) * m.data(3) + m.data(0) * m.data(4);
+
+ r.scale(1.0f / det);
+
+ return r;
+ }
+
+
+
+ inline Matrix::Matrix()
+ {
+ }
+
+ inline Matrix::Matrix(float f)
+ {
+ for(int i = 0; i < 16; i++) {
+ m_data[i] = 0.0f;
+ }
+ }
+
+ inline Matrix::Matrix(identity_t)
+ {
+ for(int i = 0; i < 4; i++) {
+ for(int j = 0; j < 4; j++) {
+ m_data[4*j+i] = (i == j) ? 1.0f : 0.0f;
+ }
+ }
+ }
+
+ inline Matrix::Matrix(const Matrix & m)
+ {
+ for(int i = 0; i < 16; i++) {
+ m_data[i] = m.m_data[i];
+ }
+ }
+
+ inline Matrix::Matrix(const Matrix3 & m)
+ {
+ for(int i = 0; i < 3; i++) {
+ for(int j = 0; j < 3; j++) {
+ operator()(i, j) = m.get(i, j);
+ }
+ }
+ for(int i = 0; i < 4; i++) {
+ operator()(3, i) = 0;
+ operator()(i, 3) = 0;
+ }
+ }
+
+ inline Matrix::Matrix(Vector4::Arg v0, Vector4::Arg v1, Vector4::Arg v2, Vector4::Arg v3)
+ {
+ m_data[ 0] = v0.x; m_data[ 1] = v0.y; m_data[ 2] = v0.z; m_data[ 3] = v0.w;
+ m_data[ 4] = v1.x; m_data[ 5] = v1.y; m_data[ 6] = v1.z; m_data[ 7] = v1.w;
+ m_data[ 8] = v2.x; m_data[ 9] = v2.y; m_data[10] = v2.z; m_data[11] = v2.w;
+ m_data[12] = v3.x; m_data[13] = v3.y; m_data[14] = v3.z; m_data[15] = v3.w;
+ }
+
+ /*inline Matrix::Matrix(const float m[])
+ {
+ for(int i = 0; i < 16; i++) {
+ m_data[i] = m[i];
+ }
+ }*/
+
+
+ // Accessors
+ inline float Matrix::data(uint idx) const
+ {
+ nvDebugCheck(idx < 16);
+ return m_data[idx];
+ }
+ inline float & Matrix::data(uint idx)
+ {
+ nvDebugCheck(idx < 16);
+ return m_data[idx];
+ }
+ inline float Matrix::get(uint row, uint col) const
+ {
+ nvDebugCheck(row < 4 && col < 4);
+ return m_data[col * 4 + row];
+ }
+ inline float Matrix::operator()(uint row, uint col) const
+ {
+ nvDebugCheck(row < 4 && col < 4);
+ return m_data[col * 4 + row];
+ }
+ inline float & Matrix::operator()(uint row, uint col)
+ {
+ nvDebugCheck(row < 4 && col < 4);
+ return m_data[col * 4 + row];
+ }
+
+ inline const float * Matrix::ptr() const
+ {
+ return m_data;
+ }
+
+ inline Vector4 Matrix::row(uint i) const
+ {
+ nvDebugCheck(i < 4);
+ return Vector4(get(i, 0), get(i, 1), get(i, 2), get(i, 3));
+ }
+
+ inline Vector4 Matrix::column(uint i) const
+ {
+ nvDebugCheck(i < 4);
+ return Vector4(get(0, i), get(1, i), get(2, i), get(3, i));
+ }
+
+ inline void Matrix::zero()
+ {
+ m_data[0] = 0; m_data[1] = 0; m_data[2] = 0; m_data[3] = 0;
+ m_data[4] = 0; m_data[5] = 0; m_data[6] = 0; m_data[7] = 0;
+ m_data[8] = 0; m_data[9] = 0; m_data[10] = 0; m_data[11] = 0;
+ m_data[12] = 0; m_data[13] = 0; m_data[14] = 0; m_data[15] = 0;
+ }
+
+ inline void Matrix::identity()
+ {
+ m_data[0] = 1; m_data[1] = 0; m_data[2] = 0; m_data[3] = 0;
+ m_data[4] = 0; m_data[5] = 1; m_data[6] = 0; m_data[7] = 0;
+ m_data[8] = 0; m_data[9] = 0; m_data[10] = 1; m_data[11] = 0;
+ m_data[12] = 0; m_data[13] = 0; m_data[14] = 0; m_data[15] = 1;
+ }
+
+ // Apply scale.
+ inline void Matrix::scale(float s)
+ {
+ m_data[0] *= s; m_data[1] *= s; m_data[2] *= s; m_data[3] *= s;
+ m_data[4] *= s; m_data[5] *= s; m_data[6] *= s; m_data[7] *= s;
+ m_data[8] *= s; m_data[9] *= s; m_data[10] *= s; m_data[11] *= s;
+ m_data[12] *= s; m_data[13] *= s; m_data[14] *= s; m_data[15] *= s;
+ }
+
+ // Apply scale.
+ inline void Matrix::scale(Vector3::Arg s)
+ {
+ m_data[0] *= s.x; m_data[1] *= s.x; m_data[2] *= s.x; m_data[3] *= s.x;
+ m_data[4] *= s.y; m_data[5] *= s.y; m_data[6] *= s.y; m_data[7] *= s.y;
+ m_data[8] *= s.z; m_data[9] *= s.z; m_data[10] *= s.z; m_data[11] *= s.z;
+ }
+
+ // Apply translation.
+ inline void Matrix::translate(Vector3::Arg t)
+ {
+ m_data[12] = m_data[0] * t.x + m_data[4] * t.y + m_data[8] * t.z + m_data[12];
+ m_data[13] = m_data[1] * t.x + m_data[5] * t.y + m_data[9] * t.z + m_data[13];
+ m_data[14] = m_data[2] * t.x + m_data[6] * t.y + m_data[10] * t.z + m_data[14];
+ m_data[15] = m_data[3] * t.x + m_data[7] * t.y + m_data[11] * t.z + m_data[15];
+ }
+
+ Matrix rotation(float theta, float v0, float v1, float v2);
+
+ // Apply rotation.
+ inline void Matrix::rotate(float theta, float v0, float v1, float v2)
+ {
+ Matrix R(rotation(theta, v0, v1, v2));
+ apply(R);
+ }
+
+ // Apply transform.
+ inline void Matrix::apply(Matrix::Arg m)
+ {
+ nvDebugCheck(this != &m);
+
+ for(int i = 0; i < 4; i++) {
+ const float ai0 = get(i,0), ai1 = get(i,1), ai2 = get(i,2), ai3 = get(i,3);
+ m_data[0 + i] = ai0 * m(0,0) + ai1 * m(1,0) + ai2 * m(2,0) + ai3 * m(3,0);
+ m_data[4 + i] = ai0 * m(0,1) + ai1 * m(1,1) + ai2 * m(2,1) + ai3 * m(3,1);
+ m_data[8 + i] = ai0 * m(0,2) + ai1 * m(1,2) + ai2 * m(2,2) + ai3 * m(3,2);
+ m_data[12+ i] = ai0 * m(0,3) + ai1 * m(1,3) + ai2 * m(2,3) + ai3 * m(3,3);
+ }
+ }
+
+ // Get scale matrix.
+ inline Matrix scale(Vector3::Arg s)
+ {
+ Matrix m(identity);
+ m(0,0) = s.x;
+ m(1,1) = s.y;
+ m(2,2) = s.z;
+ return m;
+ }
+
+ // Get scale matrix.
+ inline Matrix scale(float s)
+ {
+ Matrix m(identity);
+ m(0,0) = m(1,1) = m(2,2) = s;
+ return m;
+ }
+
+ // Get translation matrix.
+ inline Matrix translation(Vector3::Arg t)
+ {
+ Matrix m(identity);
+ m(0,3) = t.x;
+ m(1,3) = t.y;
+ m(2,3) = t.z;
+ return m;
+ }
+
+ // Get rotation matrix.
+ inline Matrix rotation(float theta, float v0, float v1, float v2)
+ {
+ float cost = cosf(theta);
+ float sint = sinf(theta);
+
+ Matrix m(identity);
+
+ if( 1 == v0 && 0 == v1 && 0 == v2 ) {
+ m(1,1) = cost; m(2,1) = -sint;
+ m(1,2) = sint; m(2,2) = cost;
+ }
+ else if( 0 == v0 && 1 == v1 && 0 == v2 ) {
+ m(0,0) = cost; m(2,0) = sint;
+ m(1,2) = -sint; m(2,2) = cost;
+ }
+ else if( 0 == v0 && 0 == v1 && 1 == v2 ) {
+ m(0,0) = cost; m(1,0) = -sint;
+ m(0,1) = sint; m(1,1) = cost;
+ }
+ else {
+ float a2, b2, c2;
+ a2 = v0 * v0;
+ b2 = v1 * v1;
+ c2 = v2 * v2;
+
+ float iscale = 1.0f / sqrtf(a2 + b2 + c2);
+ v0 *= iscale;
+ v1 *= iscale;
+ v2 *= iscale;
+
+ float abm, acm, bcm;
+ float mcos, asin, bsin, csin;
+ mcos = 1.0f - cost;
+ abm = v0 * v1 * mcos;
+ acm = v0 * v2 * mcos;
+ bcm = v1 * v2 * mcos;
+ asin = v0 * sint;
+ bsin = v1 * sint;
+ csin = v2 * sint;
+ m(0,0) = a2 * mcos + cost;
+ m(1,0) = abm - csin;
+ m(2,0) = acm + bsin;
+ m(3,0) = abm + csin;
+ m(1,1) = b2 * mcos + cost;
+ m(2,1) = bcm - asin;
+ m(3,1) = acm - bsin;
+ m(1,2) = bcm + asin;
+ m(2,2) = c2 * mcos + cost;
+ }
+ return m;
+ }
+
+ //Matrix rotation(float yaw, float pitch, float roll);
+ //Matrix skew(float angle, Vector3::Arg v1, Vector3::Arg v2);
+
+ // Get frustum matrix.
+ inline Matrix frustum(float xmin, float xmax, float ymin, float ymax, float zNear, float zFar)
+ {
+ Matrix m(0.0f);
+
+ float doubleznear = 2.0f * zNear;
+ float one_deltax = 1.0f / (xmax - xmin);
+ float one_deltay = 1.0f / (ymax - ymin);
+ float one_deltaz = 1.0f / (zFar - zNear);
+
+ m(0,0) = doubleznear * one_deltax;
+ m(1,1) = doubleznear * one_deltay;
+ m(0,2) = (xmax + xmin) * one_deltax;
+ m(1,2) = (ymax + ymin) * one_deltay;
+ m(2,2) = -(zFar + zNear) * one_deltaz;
+ m(3,2) = -1.0f;
+ m(2,3) = -(zFar * doubleznear) * one_deltaz;
+
+ return m;
+ }
+
+ // Get inverse frustum matrix.
+ inline Matrix frustumInverse(float xmin, float xmax, float ymin, float ymax, float zNear, float zFar)
+ {
+ Matrix m(0.0f);
+
+ float one_doubleznear = 1.0f / (2.0f * zNear);
+ float one_doubleznearzfar = 1.0f / (2.0f * zNear * zFar);
+
+ m(0,0) = (xmax - xmin) * one_doubleznear;
+ m(0,3) = (xmax + xmin) * one_doubleznear;
+ m(1,1) = (ymax - ymin) * one_doubleznear;
+ m(1,3) = (ymax + ymin) * one_doubleznear;
+ m(2,3) = -1;
+ m(3,2) = -(zFar - zNear) * one_doubleznearzfar;
+ m(3,3) = (zFar + zNear) * one_doubleznearzfar;
+
+ return m;
+ }
+
+ // Get infinite frustum matrix.
+ inline Matrix frustum(float xmin, float xmax, float ymin, float ymax, float zNear)
+ {
+ Matrix m(0.0f);
+
+ float doubleznear = 2.0f * zNear;
+ float one_deltax = 1.0f / (xmax - xmin);
+ float one_deltay = 1.0f / (ymax - ymin);
+ float nudge = 1.0; // 0.999;
+
+ m(0,0) = doubleznear * one_deltax;
+ m(1,1) = doubleznear * one_deltay;
+ m(0,2) = (xmax + xmin) * one_deltax;
+ m(1,2) = (ymax + ymin) * one_deltay;
+ m(2,2) = -1.0f * nudge;
+ m(3,2) = -1.0f;
+ m(2,3) = -doubleznear * nudge;
+
+ return m;
+ }
+
+ // Get perspective matrix.
+ inline Matrix perspective(float fovy, float aspect, float zNear, float zFar)
+ {
+ float xmax = zNear * tanf(fovy / 2);
+ float xmin = -xmax;
+
+ float ymax = xmax / aspect;
+ float ymin = -ymax;
+
+ return frustum(xmin, xmax, ymin, ymax, zNear, zFar);
+ }
+
+ // Get inverse perspective matrix.
+ inline Matrix perspectiveInverse(float fovy, float aspect, float zNear, float zFar)
+ {
+ float xmax = zNear * tanf(fovy / 2);
+ float xmin = -xmax;
+
+ float ymax = xmax / aspect;
+ float ymin = -ymax;
+
+ return frustumInverse(xmin, xmax, ymin, ymax, zNear, zFar);
+ }
+
+ // Get infinite perspective matrix.
+ inline Matrix perspective(float fovy, float aspect, float zNear)
+ {
+ float x = zNear * tanf(fovy / 2);
+ float y = x / aspect;
+ return frustum( -x, x, -y, y, zNear );
+ }
+
+ // Get matrix determinant.
+ inline float Matrix::determinant() const
+ {
+ return
+ m_data[3] * m_data[6] * m_data[ 9] * m_data[12] - m_data[2] * m_data[7] * m_data[ 9] * m_data[12] - m_data[3] * m_data[5] * m_data[10] * m_data[12] + m_data[1] * m_data[7] * m_data[10] * m_data[12] +
+ m_data[2] * m_data[5] * m_data[11] * m_data[12] - m_data[1] * m_data[6] * m_data[11] * m_data[12] - m_data[3] * m_data[6] * m_data[ 8] * m_data[13] + m_data[2] * m_data[7] * m_data[ 8] * m_data[13] +
+ m_data[3] * m_data[4] * m_data[10] * m_data[13] - m_data[0] * m_data[7] * m_data[10] * m_data[13] - m_data[2] * m_data[4] * m_data[11] * m_data[13] + m_data[0] * m_data[6] * m_data[11] * m_data[13] +
+ m_data[3] * m_data[5] * m_data[ 8] * m_data[14] - m_data[1] * m_data[7] * m_data[ 8] * m_data[14] - m_data[3] * m_data[4] * m_data[ 9] * m_data[14] + m_data[0] * m_data[7] * m_data[ 9] * m_data[14] +
+ m_data[1] * m_data[4] * m_data[11] * m_data[14] - m_data[0] * m_data[5] * m_data[11] * m_data[14] - m_data[2] * m_data[5] * m_data[ 8] * m_data[15] + m_data[1] * m_data[6] * m_data[ 8] * m_data[15] +
+ m_data[2] * m_data[4] * m_data[ 9] * m_data[15] - m_data[0] * m_data[6] * m_data[ 9] * m_data[15] - m_data[1] * m_data[4] * m_data[10] * m_data[15] + m_data[0] * m_data[5] * m_data[10] * m_data[15];
+ }
+
+ inline Matrix transpose(Matrix::Arg m)
+ {
+ Matrix r;
+ for (int i = 0; i < 4; i++)
+ {
+ for (int j = 0; j < 4; j++)
+ {
+ r(i, j) = m(j, i);
+ }
+ }
+ return r;
+ }
+
+ // Inverse using Cramer's rule.
+ inline Matrix inverseCramer(Matrix::Arg m)
+ {
+ Matrix r;
+ r.data( 0) = m.data(6)*m.data(11)*m.data(13) - m.data(7)*m.data(10)*m.data(13) + m.data(7)*m.data(9)*m.data(14) - m.data(5)*m.data(11)*m.data(14) - m.data(6)*m.data(9)*m.data(15) + m.data(5)*m.data(10)*m.data(15);
+ r.data( 1) = m.data(3)*m.data(10)*m.data(13) - m.data(2)*m.data(11)*m.data(13) - m.data(3)*m.data(9)*m.data(14) + m.data(1)*m.data(11)*m.data(14) + m.data(2)*m.data(9)*m.data(15) - m.data(1)*m.data(10)*m.data(15);
+ r.data( 2) = m.data(2)*m.data( 7)*m.data(13) - m.data(3)*m.data( 6)*m.data(13) + m.data(3)*m.data(5)*m.data(14) - m.data(1)*m.data( 7)*m.data(14) - m.data(2)*m.data(5)*m.data(15) + m.data(1)*m.data( 6)*m.data(15);
+ r.data( 3) = m.data(3)*m.data( 6)*m.data( 9) - m.data(2)*m.data( 7)*m.data( 9) - m.data(3)*m.data(5)*m.data(10) + m.data(1)*m.data( 7)*m.data(10) + m.data(2)*m.data(5)*m.data(11) - m.data(1)*m.data( 6)*m.data(11);
+ r.data( 4) = m.data(7)*m.data(10)*m.data(12) - m.data(6)*m.data(11)*m.data(12) - m.data(7)*m.data(8)*m.data(14) + m.data(4)*m.data(11)*m.data(14) + m.data(6)*m.data(8)*m.data(15) - m.data(4)*m.data(10)*m.data(15);
+ r.data( 5) = m.data(2)*m.data(11)*m.data(12) - m.data(3)*m.data(10)*m.data(12) + m.data(3)*m.data(8)*m.data(14) - m.data(0)*m.data(11)*m.data(14) - m.data(2)*m.data(8)*m.data(15) + m.data(0)*m.data(10)*m.data(15);
+ r.data( 6) = m.data(3)*m.data( 6)*m.data(12) - m.data(2)*m.data( 7)*m.data(12) - m.data(3)*m.data(4)*m.data(14) + m.data(0)*m.data( 7)*m.data(14) + m.data(2)*m.data(4)*m.data(15) - m.data(0)*m.data( 6)*m.data(15);
+ r.data( 7) = m.data(2)*m.data( 7)*m.data( 8) - m.data(3)*m.data( 6)*m.data( 8) + m.data(3)*m.data(4)*m.data(10) - m.data(0)*m.data( 7)*m.data(10) - m.data(2)*m.data(4)*m.data(11) + m.data(0)*m.data( 6)*m.data(11);
+ r.data( 8) = m.data(5)*m.data(11)*m.data(12) - m.data(7)*m.data( 9)*m.data(12) + m.data(7)*m.data(8)*m.data(13) - m.data(4)*m.data(11)*m.data(13) - m.data(5)*m.data(8)*m.data(15) + m.data(4)*m.data( 9)*m.data(15);
+ r.data( 9) = m.data(3)*m.data( 9)*m.data(12) - m.data(1)*m.data(11)*m.data(12) - m.data(3)*m.data(8)*m.data(13) + m.data(0)*m.data(11)*m.data(13) + m.data(1)*m.data(8)*m.data(15) - m.data(0)*m.data( 9)*m.data(15);
+ r.data(10) = m.data(1)*m.data( 7)*m.data(12) - m.data(3)*m.data( 5)*m.data(12) + m.data(3)*m.data(4)*m.data(13) - m.data(0)*m.data( 7)*m.data(13) - m.data(1)*m.data(4)*m.data(15) + m.data(0)*m.data( 5)*m.data(15);
+ r.data(11) = m.data(3)*m.data( 5)*m.data( 8) - m.data(1)*m.data( 7)*m.data( 8) - m.data(3)*m.data(4)*m.data( 9) + m.data(0)*m.data( 7)*m.data( 9) + m.data(1)*m.data(4)*m.data(11) - m.data(0)*m.data( 5)*m.data(11);
+ r.data(12) = m.data(6)*m.data( 9)*m.data(12) - m.data(5)*m.data(10)*m.data(12) - m.data(6)*m.data(8)*m.data(13) + m.data(4)*m.data(10)*m.data(13) + m.data(5)*m.data(8)*m.data(14) - m.data(4)*m.data( 9)*m.data(14);
+ r.data(13) = m.data(1)*m.data(10)*m.data(12) - m.data(2)*m.data( 9)*m.data(12) + m.data(2)*m.data(8)*m.data(13) - m.data(0)*m.data(10)*m.data(13) - m.data(1)*m.data(8)*m.data(14) + m.data(0)*m.data( 9)*m.data(14);
+ r.data(14) = m.data(2)*m.data( 5)*m.data(12) - m.data(1)*m.data( 6)*m.data(12) - m.data(2)*m.data(4)*m.data(13) + m.data(0)*m.data( 6)*m.data(13) + m.data(1)*m.data(4)*m.data(14) - m.data(0)*m.data( 5)*m.data(14);
+ r.data(15) = m.data(1)*m.data( 6)*m.data( 8) - m.data(2)*m.data( 5)*m.data( 8) + m.data(2)*m.data(4)*m.data( 9) - m.data(0)*m.data( 6)*m.data( 9) - m.data(1)*m.data(4)*m.data(10) + m.data(0)*m.data( 5)*m.data(10);
+ r.scale(1.0f / m.determinant());
+ return r;
+ }
+
+ inline Matrix isometryInverse(Matrix::Arg m)
+ {
+ Matrix r(identity);
+
+ // transposed 3x3 upper left matrix
+ for (int i = 0; i < 3; i++)
+ {
+ for (int j = 0; j < 3; j++)
+ {
+ r(i, j) = m(j, i);
+ }
+ }
+
+ // translate by the negative offsets
+ r.translate(-Vector3(m.data(12), m.data(13), m.data(14)));
+
+ return r;
+ }
+
+ // Transform the given 3d point with the given matrix.
+ inline Vector3 transformPoint(Matrix::Arg m, Vector3::Arg p)
+ {
+ return Vector3(
+ p.x * m(0,0) + p.y * m(0,1) + p.z * m(0,2) + m(0,3),
+ p.x * m(1,0) + p.y * m(1,1) + p.z * m(1,2) + m(1,3),
+ p.x * m(2,0) + p.y * m(2,1) + p.z * m(2,2) + m(2,3));
+ }
+
+ // Transform the given 3d vector with the given matrix.
+ inline Vector3 transformVector(Matrix::Arg m, Vector3::Arg p)
+ {
+ return Vector3(
+ p.x * m(0,0) + p.y * m(0,1) + p.z * m(0,2),
+ p.x * m(1,0) + p.y * m(1,1) + p.z * m(1,2),
+ p.x * m(2,0) + p.y * m(2,1) + p.z * m(2,2));
+ }
+
+ // Transform the given 4d vector with the given matrix.
+ inline Vector4 transform(Matrix::Arg m, Vector4::Arg p)
+ {
+ return Vector4(
+ p.x * m(0,0) + p.y * m(0,1) + p.z * m(0,2) + p.w * m(0,3),
+ p.x * m(1,0) + p.y * m(1,1) + p.z * m(1,2) + p.w * m(1,3),
+ p.x * m(2,0) + p.y * m(2,1) + p.z * m(2,2) + p.w * m(2,3),
+ p.x * m(3,0) + p.y * m(3,1) + p.z * m(3,2) + p.w * m(3,3));
+ }
+
+ inline Matrix mul(Matrix::Arg a, Matrix::Arg b)
+ {
+ // @@ Is this the right order? mul(a, b) = b * a
+ Matrix m = a;
+ m.apply(b);
+ return m;
+ }
+
+ inline void Matrix::operator+=(const Matrix & m)
+ {
+ for(int i = 0; i < 16; i++) {
+ m_data[i] += m.m_data[i];
+ }
+ }
+
+ inline void Matrix::operator-=(const Matrix & m)
+ {
+ for(int i = 0; i < 16; i++) {
+ m_data[i] -= m.m_data[i];
+ }
+ }
+
+ inline Matrix operator+(const Matrix & a, const Matrix & b)
+ {
+ Matrix m = a;
+ m += b;
+ return m;
+ }
+
+ inline Matrix operator-(const Matrix & a, const Matrix & b)
+ {
+ Matrix m = a;
+ m -= b;
+ return m;
+ }
+
+
+} // nv namespace
+
+
+#if 0 // old code.
+/** @name Special matrices. */
+//@{
+/** Generate a translation matrix. */
+void TranslationMatrix(const Vec3 & v) {
+ data[0] = 1; data[1] = 0; data[2] = 0; data[3] = 0;
+ data[4] = 0; data[5] = 1; data[6] = 0; data[7] = 0;
+ data[8] = 0; data[9] = 0; data[10] = 1; data[11] = 0;
+ data[12] = v.x; data[13] = v.y; data[14] = v.z; data[15] = 1;
+}
+
+/** Rotate theta degrees around v. */
+void RotationMatrix( float theta, float v0, float v1, float v2 ) {
+ float cost = cos(theta);
+ float sint = sin(theta);
+
+ if( 1 == v0 && 0 == v1 && 0 == v2 ) {
+ data[0] = 1.0f; data[1] = 0.0f; data[2] = 0.0f; data[3] = 0.0f;
+ data[4] = 0.0f; data[5] = cost; data[6] = -sint;data[7] = 0.0f;
+ data[8] = 0.0f; data[9] = sint; data[10] = cost;data[11] = 0.0f;
+ data[12] = 0.0f;data[13] = 0.0f;data[14] = 0.0f;data[15] = 1.0f;
+ }
+ else if( 0 == v0 && 1 == v1 && 0 == v2 ) {
+ data[0] = cost; data[1] = 0.0f; data[2] = sint; data[3] = 0.0f;
+ data[4] = 0.0f; data[5] = 1.0f; data[6] = 0.0f; data[7] = 0.0f;
+ data[8] = -sint;data[9] = 0.0f;data[10] = cost; data[11] = 0.0f;
+ data[12] = 0.0f;data[13] = 0.0f;data[14] = 0.0f;data[15] = 1.0f;
+ }
+ else if( 0 == v0 && 0 == v1 && 1 == v2 ) {
+ data[0] = cost; data[1] = -sint;data[2] = 0.0f; data[3] = 0.0f;
+ data[4] = sint; data[5] = cost; data[6] = 0.0f; data[7] = 0.0f;
+ data[8] = 0.0f; data[9] = 0.0f; data[10] = 1.0f;data[11] = 0.0f;
+ data[12] = 0.0f;data[13] = 0.0f;data[14] = 0.0f;data[15] = 1.0f;
+ }
+ else {
+ //we need scale a,b,c to unit length.
+ float a2, b2, c2;
+ a2 = v0 * v0;
+ b2 = v1 * v1;
+ c2 = v2 * v2;
+
+ float iscale = 1.0f / sqrtf(a2 + b2 + c2);
+ v0 *= iscale;
+ v1 *= iscale;
+ v2 *= iscale;
+
+ float abm, acm, bcm;
+ float mcos, asin, bsin, csin;
+ mcos = 1.0f - cost;
+ abm = v0 * v1 * mcos;
+ acm = v0 * v2 * mcos;
+ bcm = v1 * v2 * mcos;
+ asin = v0 * sint;
+ bsin = v1 * sint;
+ csin = v2 * sint;
+ data[0] = a2 * mcos + cost;
+ data[1] = abm - csin;
+ data[2] = acm + bsin;
+ data[3] = abm + csin;
+ data[4] = 0.0f;
+ data[5] = b2 * mcos + cost;
+ data[6] = bcm - asin;
+ data[7] = acm - bsin;
+ data[8] = 0.0f;
+ data[9] = bcm + asin;
+ data[10] = c2 * mcos + cost;
+ data[11] = 0.0f;
+ data[12] = 0.0f;
+ data[13] = 0.0f;
+ data[14] = 0.0f;
+ data[15] = 1.0f;
+ }
+}
+
+/*
+void SkewMatrix(float angle, const Vec3 & v1, const Vec3 & v2) {
+v1.Normalize();
+v2.Normalize();
+
+Vec3 v3;
+v3.Cross(v1, v2);
+v3.Normalize();
+
+// Get skew factor.
+float costheta = Vec3DotProduct(v1, v2);
+float sintheta = Real.Sqrt(1 - costheta * costheta);
+float skew = tan(Trig.DegreesToRadians(angle) + acos(sintheta)) * sintheta - costheta;
+
+// Build orthonormal matrix.
+v1 = FXVector3.Cross(v3, v2);
+v1.Normalize();
+
+Matrix R = Matrix::Identity;
+R[0, 0] = v3.X; // Not sure this is in the correct order...
+R[1, 0] = v3.Y;
+R[2, 0] = v3.Z;
+R[0, 1] = v1.X;
+R[1, 1] = v1.Y;
+R[2, 1] = v1.Z;
+R[0, 2] = v2.X;
+R[1, 2] = v2.Y;
+R[2, 2] = v2.Z;
+
+// Build skew matrix.
+Matrix S = Matrix::Identity;
+S[2, 1] = -skew;
+
+// Return skew transform.
+return R * S * R.Transpose; // Not sure this is in the correct order...
+}
+*/
+
+/**
+* Generate rotation matrix for the euler angles. This is the same as computing
+* 3 rotation matrices and multiplying them together in our custom order.
+*
+* @todo Have to recompute this code for our new convention.
+**/
+void RotationMatrix( float yaw, float pitch, float roll ) {
+ float sy = sin(yaw+ToRadian(90));
+ float cy = cos(yaw+ToRadian(90));
+ float sp = sin(pitch-ToRadian(90));
+ float cp = cos(pitch-ToRadian(90));
+ float sr = sin(roll);
+ float cr = cos(roll);
+
+ data[0] = cr*cy + sr*sp*sy;
+ data[1] = cp*sy;
+ data[2] = -sr*cy + cr*sp*sy;
+ data[3] = 0;
+
+ data[4] = -cr*sy + sr*sp*cy;
+ data[5] = cp*cy;
+ data[6] = sr*sy + cr*sp*cy;
+ data[7] = 0;
+
+ data[8] = sr*cp;
+ data[9] = -sp;
+ data[10] = cr*cp;
+ data[11] = 0;
+
+ data[12] = 0;
+ data[13] = 0;
+ data[14] = 0;
+ data[15] = 1;
+}
+
+/** Create a frustum matrix with the far plane at the infinity. */
+void Frustum( float xmin, float xmax, float ymin, float ymax, float zNear, float zFar ) {
+ float one_deltax, one_deltay, one_deltaz, doubleznear;
+
+ doubleznear = 2.0f * zNear;
+ one_deltax = 1.0f / (xmax - xmin);
+ one_deltay = 1.0f / (ymax - ymin);
+ one_deltaz = 1.0f / (zFar - zNear);
+
+ data[0] = (float)(doubleznear * one_deltax);
+ data[1] = 0.0f;
+ data[2] = 0.0f;
+ data[3] = 0.0f;
+ data[4] = 0.0f;
+ data[5] = (float)(doubleznear * one_deltay);
+ data[6] = 0.f;
+ data[7] = 0.f;
+ data[8] = (float)((xmax + xmin) * one_deltax);
+ data[9] = (float)((ymax + ymin) * one_deltay);
+ data[10] = (float)(-(zFar + zNear) * one_deltaz);
+ data[11] = -1.f;
+ data[12] = 0.f;
+ data[13] = 0.f;
+ data[14] = (float)(-(zFar * doubleznear) * one_deltaz);
+ data[15] = 0.f;
+}
+
+/** Create a frustum matrix with the far plane at the infinity. */
+void FrustumInf( float xmin, float xmax, float ymin, float ymax, float zNear ) {
+ float one_deltax, one_deltay, doubleznear, nudge;
+
+ doubleznear = 2.0f * zNear;
+ one_deltax = 1.0f / (xmax - xmin);
+ one_deltay = 1.0f / (ymax - ymin);
+ nudge = 1.0; // 0.999;
+
+ data[0] = doubleznear * one_deltax;
+ data[1] = 0.0f;
+ data[2] = 0.0f;
+ data[3] = 0.0f;
+
+ data[4] = 0.0f;
+ data[5] = doubleznear * one_deltay;
+ data[6] = 0.f;
+ data[7] = 0.f;
+
+ data[8] = (xmax + xmin) * one_deltax;
+ data[9] = (ymax + ymin) * one_deltay;
+ data[10] = -1.0f * nudge;
+ data[11] = -1.0f;
+
+ data[12] = 0.f;
+ data[13] = 0.f;
+ data[14] = -doubleznear * nudge;
+ data[15] = 0.f;
+}
+
+/** Create an inverse frustum matrix with the far plane at the infinity. */
+void FrustumInfInv( float left, float right, float bottom, float top, float zNear ) {
+ // this matrix is wrong (not tested floatly) I think it should be transposed.
+ data[0] = (right - left) / (2 * zNear);
+ data[1] = 0;
+ data[2] = 0;
+ data[3] = (right + left) / (2 * zNear);
+ data[4] = 0;
+ data[5] = (top - bottom) / (2 * zNear);
+ data[6] = 0;
+ data[7] = (top + bottom) / (2 * zNear);
+ data[8] = 0;
+ data[9] = 0;
+ data[10] = 0;
+ data[11] = -1;
+ data[12] = 0;
+ data[13] = 0;
+ data[14] = -1 / (2 * zNear);
+ data[15] = 1 / (2 * zNear);
+}
+
+/** Create an homogeneous projection matrix. */
+void Perspective( float fov, float aspect, float zNear, float zFar ) {
+ float xmin, xmax, ymin, ymax;
+
+ xmax = zNear * tan( fov/2 );
+ xmin = -xmax;
+
+ ymax = xmax / aspect;
+ ymin = -ymax;
+
+ Frustum(xmin, xmax, ymin, ymax, zNear, zFar);
+}
+
+/** Create a projection matrix with the far plane at the infinity. */
+void PerspectiveInf( float fov, float aspect, float zNear ) {
+ float x = zNear * tan( fov/2 );
+ float y = x / aspect;
+ FrustumInf( -x, x, -y, y, zNear );
+}
+
+/** Create an inverse projection matrix with far plane at the infinity. */
+void PerspectiveInfInv( float fov, float aspect, float zNear ) {
+ float x = zNear * tan( fov/2 );
+ float y = x / aspect;
+ FrustumInfInv( -x, x, -y, y, zNear );
+}
+
+/** Build bone matrix from quatertion and offset. */
+void BoneMatrix(const Quat & q, const Vec3 & offset) {
+ float x2, y2, z2, xx, xy, xz, yy, yz, zz, wx, wy, wz;
+
+ // calculate coefficients
+ x2 = q.x + q.x;
+ y2 = q.y + q.y;
+ z2 = q.z + q.z;
+
+ xx = q.x * x2; xy = q.x * y2; xz = q.x * z2;
+ yy = q.y * y2; yz = q.y * z2; zz = q.z * z2;
+ wx = q.w * x2; wy = q.w * y2; wz = q.w * z2;
+
+ data[0] = 1.0f - (yy + zz);
+ data[1] = xy - wz;
+ data[2] = xz + wy;
+ data[3] = 0.0f;
+
+ data[4] = xy + wz;
+ data[5] = 1.0f - (xx + zz);
+ data[6] = yz - wx;
+ data[7] = 0.0f;
+
+ data[8] = xz - wy;
+ data[9] = yz + wx;
+ data[10] = 1.0f - (xx + yy);
+ data[11] = 0.0f;
+
+ data[12] = offset.x;
+ data[13] = offset.y;
+ data[14] = offset.z;
+ data[15] = 1.0f;
+}
+
+//@}
+
+
+/** @name Transformations: */
+//@{
+
+/** Apply a general scale. */
+void Scale( float x, float y, float z ) {
+ data[0] *= x; data[4] *= y; data[8] *= z;
+ data[1] *= x; data[5] *= y; data[9] *= z;
+ data[2] *= x; data[6] *= y; data[10] *= z;
+ data[3] *= x; data[7] *= y; data[11] *= z;
+}
+
+/** Apply a rotation of theta degrees around the axis v*/
+void Rotate( float theta, const Vec3 & v ) {
+ Matrix b;
+ b.RotationMatrix( theta, v[0], v[1], v[2] );
+ Multiply4x3( b );
+}
+
+/** Apply a rotation of theta degrees around the axis v*/
+void Rotate( float theta, float v0, float v1, float v2 ) {
+ Matrix b;
+ b.RotationMatrix( theta, v0, v1, v2 );
+ Multiply4x3( b );
+}
+
+/**
+* Translate the matrix by t. This is the same as multiplying by a
+* translation matrix with the given offset.
+* this = T * this
+*/
+void Translate( const Vec3 &t ) {
+ data[12] = data[0] * t.x + data[4] * t.y + data[8] * t.z + data[12];
+ data[13] = data[1] * t.x + data[5] * t.y + data[9] * t.z + data[13];
+ data[14] = data[2] * t.x + data[6] * t.y + data[10] * t.z + data[14];
+ data[15] = data[3] * t.x + data[7] * t.y + data[11] * t.z + data[15];
+}
+
+/**
+* Translate the matrix by x, y, z. This is the same as multiplying by a
+* translation matrix with the given offsets.
+*/
+void Translate( float x, float y, float z ) {
+ data[12] = data[0] * x + data[4] * y + data[8] * z + data[12];
+ data[13] = data[1] * x + data[5] * y + data[9] * z + data[13];
+ data[14] = data[2] * x + data[6] * y + data[10] * z + data[14];
+ data[15] = data[3] * x + data[7] * y + data[11] * z + data[15];
+}
+
+/** Compute the transposed matrix. */
+void Transpose() {
+ piSwap(data[1], data[4]);
+ piSwap(data[2], data[8]);
+ piSwap(data[6], data[9]);
+ piSwap(data[3], data[12]);
+ piSwap(data[7], data[13]);
+ piSwap(data[11], data[14]);
+}
+
+/** Compute the inverse of a rigid-body/isometry/orthonormal matrix. */
+void IsometryInverse() {
+ // transposed 3x3 upper left matrix
+ piSwap(data[1], data[4]);
+ piSwap(data[2], data[8]);
+ piSwap(data[6], data[9]);
+
+ // translate by the negative offsets
+ Vec3 v(-data[12], -data[13], -data[14]);
+ data[12] = data[13] = data[14] = 0;
+ Translate(v);
+}
+
+/** Compute the inverse of the affine portion of this matrix. */
+void AffineInverse() {
+ data[12] = data[13] = data[14] = 0;
+ Transpose();
+}
+//@}
+
+/** @name Matrix operations: */
+//@{
+
+/** Return the determinant of this matrix. */
+float Determinant() const {
+ return data[0] * data[5] * data[10] * data[15] +
+ data[1] * data[6] * data[11] * data[12] +
+ data[2] * data[7] * data[ 8] * data[13] +
+ data[3] * data[4] * data[ 9] * data[14] -
+ data[3] * data[6] * data[ 9] * data[12] -
+ data[2] * data[5] * data[ 8] * data[15] -
+ data[1] * data[4] * data[11] * data[14] -
+ data[0] * data[7] * data[10] * data[12];
+}
+
+
+/** Standard matrix product: this *= B. */
+void Multiply4x4( const Matrix & restrict B ) {
+ Multiply4x4(*this, B);
+}
+
+/** Standard matrix product: this = A * B. this != B*/
+void Multiply4x4( const Matrix & A, const Matrix & restrict B ) {
+ piDebugCheck(this != &B);
+
+ for(int i = 0; i < 4; i++) {
+ const float ai0 = A(i,0), ai1 = A(i,1), ai2 = A(i,2), ai3 = A(i,3);
+ GetElem(i,0) = ai0 * B(0,0) + ai1 * B(1,0) + ai2 * B(2,0) + ai3 * B(3,0);
+ GetElem(i,1) = ai0 * B(0,1) + ai1 * B(1,1) + ai2 * B(2,1) + ai3 * B(3,1);
+ GetElem(i,2) = ai0 * B(0,2) + ai1 * B(1,2) + ai2 * B(2,2) + ai3 * B(3,2);
+ GetElem(i,3) = ai0 * B(0,3) + ai1 * B(1,3) + ai2 * B(2,3) + ai3 * B(3,3);
+ }
+
+ /* Unrolled but does not allow this == A
+ data[0] = A.data[0] * B.data[0] + A.data[4] * B.data[1] + A.data[8] * B.data[2] + A.data[12] * B.data[3];
+ data[1] = A.data[1] * B.data[0] + A.data[5] * B.data[1] + A.data[9] * B.data[2] + A.data[13] * B.data[3];
+ data[2] = A.data[2] * B.data[0] + A.data[6] * B.data[1] + A.data[10] * B.data[2] + A.data[14] * B.data[3];
+ data[3] = A.data[3] * B.data[0] + A.data[7] * B.data[1] + A.data[11] * B.data[2] + A.data[15] * B.data[3];
+ data[4] = A.data[0] * B.data[4] + A.data[4] * B.data[5] + A.data[8] * B.data[6] + A.data[12] * B.data[7];
+ data[5] = A.data[1] * B.data[4] + A.data[5] * B.data[5] + A.data[9] * B.data[6] + A.data[13] * B.data[7];
+ data[6] = A.data[2] * B.data[4] + A.data[6] * B.data[5] + A.data[10] * B.data[6] + A.data[14] * B.data[7];
+ data[7] = A.data[3] * B.data[4] + A.data[7] * B.data[5] + A.data[11] * B.data[6] + A.data[15] * B.data[7];
+ data[8] = A.data[0] * B.data[8] + A.data[4] * B.data[9] + A.data[8] * B.data[10] + A.data[12] * B.data[11];
+ data[9] = A.data[1] * B.data[8] + A.data[5] * B.data[9] + A.data[9] * B.data[10] + A.data[13] * B.data[11];
+ data[10]= A.data[2] * B.data[8] + A.data[6] * B.data[9] + A.data[10] * B.data[10] + A.data[14] * B.data[11];
+ data[11]= A.data[3] * B.data[8] + A.data[7] * B.data[9] + A.data[11] * B.data[10] + A.data[15] * B.data[11];
+ data[12]= A.data[0] * B.data[12] + A.data[4] * B.data[13] + A.data[8] * B.data[14] + A.data[12] * B.data[15];
+ data[13]= A.data[1] * B.data[12] + A.data[5] * B.data[13] + A.data[9] * B.data[14] + A.data[13] * B.data[15];
+ data[14]= A.data[2] * B.data[12] + A.data[6] * B.data[13] + A.data[10] * B.data[14] + A.data[14] * B.data[15];
+ data[15]= A.data[3] * B.data[12] + A.data[7] * B.data[13] + A.data[11] * B.data[14] + A.data[15] * B.data[15];
+ */
+}
+
+/** Standard matrix product: this *= B. */
+void Multiply4x3( const Matrix & restrict B ) {
+ Multiply4x3(*this, B);
+}
+
+/** Standard product of matrices, where the last row is [0 0 0 1]. */
+void Multiply4x3( const Matrix & A, const Matrix & restrict B ) {
+ piDebugCheck(this != &B);
+
+ for(int i = 0; i < 3; i++) {
+ const float ai0 = A(i,0), ai1 = A(i,1), ai2 = A(i,2), ai3 = A(i,3);
+ GetElem(i,0) = ai0 * B(0,0) + ai1 * B(1,0) + ai2 * B(2,0) + ai3 * B(3,0);
+ GetElem(i,1) = ai0 * B(0,1) + ai1 * B(1,1) + ai2 * B(2,1) + ai3 * B(3,1);
+ GetElem(i,2) = ai0 * B(0,2) + ai1 * B(1,2) + ai2 * B(2,2) + ai3 * B(3,2);
+ GetElem(i,3) = ai0 * B(0,3) + ai1 * B(1,3) + ai2 * B(2,3) + ai3 * B(3,3);
+ }
+ data[3] = 0.0f; data[7] = 0.0f; data[11] = 0.0f; data[15] = 1.0f;
+
+ /* Unrolled but does not allow this == A
+ data[0] = a.data[0] * b.data[0] + a.data[4] * b.data[1] + a.data[8] * b.data[2] + a.data[12] * b.data[3];
+ data[1] = a.data[1] * b.data[0] + a.data[5] * b.data[1] + a.data[9] * b.data[2] + a.data[13] * b.data[3];
+ data[2] = a.data[2] * b.data[0] + a.data[6] * b.data[1] + a.data[10] * b.data[2] + a.data[14] * b.data[3];
+ data[3] = 0.0f;
+ data[4] = a.data[0] * b.data[4] + a.data[4] * b.data[5] + a.data[8] * b.data[6] + a.data[12] * b.data[7];
+ data[5] = a.data[1] * b.data[4] + a.data[5] * b.data[5] + a.data[9] * b.data[6] + a.data[13] * b.data[7];
+ data[6] = a.data[2] * b.data[4] + a.data[6] * b.data[5] + a.data[10] * b.data[6] + a.data[14] * b.data[7];
+ data[7] = 0.0f;
+ data[8] = a.data[0] * b.data[8] + a.data[4] * b.data[9] + a.data[8] * b.data[10] + a.data[12] * b.data[11];
+ data[9] = a.data[1] * b.data[8] + a.data[5] * b.data[9] + a.data[9] * b.data[10] + a.data[13] * b.data[11];
+ data[10]= a.data[2] * b.data[8] + a.data[6] * b.data[9] + a.data[10] * b.data[10] + a.data[14] * b.data[11];
+ data[11]= 0.0f;
+ data[12]= a.data[0] * b.data[12] + a.data[4] * b.data[13] + a.data[8] * b.data[14] + a.data[12] * b.data[15];
+ data[13]= a.data[1] * b.data[12] + a.data[5] * b.data[13] + a.data[9] * b.data[14] + a.data[13] * b.data[15];
+ data[14]= a.data[2] * b.data[12] + a.data[6] * b.data[13] + a.data[10] * b.data[14] + a.data[14] * b.data[15];
+ data[15]= 1.0f;
+ */
+}
+//@}
+
+
+/** @name Vector operations: */
+//@{
+
+/** Transform 3d vector (w=0). */
+void TransformVec3(const Vec3 & restrict orig, Vec3 * restrict dest) const {
+ piDebugCheck(&orig != dest);
+ dest->x = orig.x * data[0] + orig.y * data[4] + orig.z * data[8];
+ dest->y = orig.x * data[1] + orig.y * data[5] + orig.z * data[9];
+ dest->z = orig.x * data[2] + orig.y * data[6] + orig.z * data[10];
+}
+/** Transform 3d vector by the transpose (w=0). */
+void TransformVec3T(const Vec3 & restrict orig, Vec3 * restrict dest) const {
+ piDebugCheck(&orig != dest);
+ dest->x = orig.x * data[0] + orig.y * data[1] + orig.z * data[2];
+ dest->y = orig.x * data[4] + orig.y * data[5] + orig.z * data[6];
+ dest->z = orig.x * data[8] + orig.y * data[9] + orig.z * data[10];
+}
+
+/** Transform a 3d homogeneous vector, where the fourth coordinate is assumed to be 1. */
+void TransformPoint(const Vec3 & restrict orig, Vec3 * restrict dest) const {
+ piDebugCheck(&orig != dest);
+ dest->x = orig.x * data[0] + orig.y * data[4] + orig.z * data[8] + data[12];
+ dest->y = orig.x * data[1] + orig.y * data[5] + orig.z * data[9] + data[13];
+ dest->z = orig.x * data[2] + orig.y * data[6] + orig.z * data[10] + data[14];
+}
+
+/** Transform a point, normalize it, and return w. */
+float TransformPointAndNormalize(const Vec3 & restrict orig, Vec3 * restrict dest) const {
+ piDebugCheck(&orig != dest);
+ float w;
+ dest->x = orig.x * data[0] + orig.y * data[4] + orig.z * data[8] + data[12];
+ dest->y = orig.x * data[1] + orig.y * data[5] + orig.z * data[9] + data[13];
+ dest->z = orig.x * data[2] + orig.y * data[6] + orig.z * data[10] + data[14];
+ w = 1 / (orig.x * data[3] + orig.y * data[7] + orig.z * data[11] + data[15]);
+ *dest *= w;
+ return w;
+}
+
+/** Transform a point and return w. */
+float TransformPointReturnW(const Vec3 & restrict orig, Vec3 * restrict dest) const {
+ piDebugCheck(&orig != dest);
+ dest->x = orig.x * data[0] + orig.y * data[4] + orig.z * data[8] + data[12];
+ dest->y = orig.x * data[1] + orig.y * data[5] + orig.z * data[9] + data[13];
+ dest->z = orig.x * data[2] + orig.y * data[6] + orig.z * data[10] + data[14];
+ return orig.x * data[3] + orig.y * data[7] + orig.z * data[11] + data[15];
+}
+
+/** Transform a normalized 3d point by a 4d matrix and return the resulting 4d vector. */
+void TransformVec4(const Vec3 & orig, Vec4 * dest) const {
+ dest->x = orig.x * data[0] + orig.y * data[4] + orig.z * data[8] + data[12];
+ dest->y = orig.x * data[1] + orig.y * data[5] + orig.z * data[9] + data[13];
+ dest->z = orig.x * data[2] + orig.y * data[6] + orig.z * data[10] + data[14];
+ dest->w = orig.x * data[3] + orig.y * data[7] + orig.z * data[11] + data[15];
+}
+//@}
+
+/** @name Matrix analysis. */
+//@{
+
+/** Get the ZYZ euler angles from the matrix. Assumes the matrix is orthonormal. */
+void GetEulerAnglesZYZ(float * s, float * t, float * r) const {
+ if( GetElem(2,2) < 1.0f ) {
+ if( GetElem(2,2) > -1.0f ) {
+ // cs*ct*cr-ss*sr -ss*ct*cr-cs*sr st*cr
+ // cs*ct*sr+ss*cr -ss*ct*sr+cs*cr st*sr
+ // -cs*st ss*st ct
+ *s = atan2(GetElem(1,2), -GetElem(0,2));
+ *t = acos(GetElem(2,2));
+ *r = atan2(GetElem(2,1), GetElem(2,0));
+ }
+ else {
+ // -c(s-r) s(s-r) 0
+ // s(s-r) c(s-r) 0
+ // 0 0 -1
+ *s = atan2(GetElem(0, 1), -GetElem(0, 0)); // = s-r
+ *t = PI;
+ *r = 0;
+ }
+ }
+ else {
+ // c(s+r) -s(s+r) 0
+ // s(s+r) c(s+r) 0
+ // 0 0 1
+ *s = atan2(GetElem(0, 1), GetElem(0, 0)); // = s+r
+ *t = 0;
+ *r = 0;
+ }
+}
+
+//@}
+
+MATHLIB_API friend PiStream & operator<< ( PiStream & s, Matrix & m );
+
+/** Print to debug output. */
+void Print() const {
+ piDebug( "[ %5.2f %5.2f %5.2f %5.2f ]\n", data[0], data[4], data[8], data[12] );
+ piDebug( "[ %5.2f %5.2f %5.2f %5.2f ]\n", data[1], data[5], data[9], data[13] );
+ piDebug( "[ %5.2f %5.2f %5.2f %5.2f ]\n", data[2], data[6], data[10], data[14] );
+ piDebug( "[ %5.2f %5.2f %5.2f %5.2f ]\n", data[3], data[7], data[11], data[15] );
+}
+
+
+public:
+
+ float data[16];
+
+};
+#endif
+
+
+#endif // NV_MATH_MATRIX_INL
diff --git a/3rdparty/bgfx/3rdparty/nvtt/nvmath/nvmath.h b/3rdparty/bgfx/3rdparty/nvtt/nvmath/nvmath.h
new file mode 100644
index 00000000000..7a64f600153
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/nvtt/nvmath/nvmath.h
@@ -0,0 +1,56 @@
+// This code is in the public domain -- castanyo@yahoo.es
+
+#ifndef NV_MATH_H
+#define NV_MATH_H
+
+#include <cmath>
+#include <float.h> // finite, isnan
+
+#include "nvcore/utils.h" // max, clamp
+
+#define NVMATH_API
+#define NVMATH_CLASS
+
+#define PI float(3.1415926535897932384626433833)
+#define NV_EPSILON (0.0001f)
+#define NV_NORMAL_EPSILON (0.001f)
+
+namespace nv
+{
+ inline float toRadian(float degree) { return degree * (PI / 180.0f); }
+ inline float toDegree(float radian) { return radian * (180.0f / PI); }
+
+ // Robust floating point comparisons:
+ // http://realtimecollisiondetection.net/blog/?p=89
+ inline bool equal(const float f0, const float f1, const float epsilon = NV_EPSILON)
+ {
+ //return fabs(f0-f1) <= epsilon;
+ return fabs(f0-f1) <= epsilon * max3(1.0f, fabsf(f0), fabsf(f1));
+ }
+
+ inline bool isZero(const float f, const float epsilon = NV_EPSILON)
+ {
+ return fabsf(f) <= epsilon;
+ }
+
+ inline bool isFinite(const float f)
+ {
+ return std::isfinite(f);
+ }
+
+ // Eliminates negative zeros from a float array.
+ inline void floatCleanup(float * fp, int n)
+ {
+ for (int i = 0; i < n; i++) {
+ //nvDebugCheck(isFinite(fp[i]));
+ union { float f; uint32 i; } x = { fp[i] };
+ if (x.i == 0x80000000) fp[i] = 0.0f;
+ }
+ }
+
+ inline float saturate(float f) {
+ return clamp(f, 0.0f, 1.0f);
+ }
+}
+
+#endif // NV_MATH_H
diff --git a/3rdparty/bgfx/3rdparty/nvtt/nvmath/plane.h b/3rdparty/bgfx/3rdparty/nvtt/nvmath/plane.h
new file mode 100644
index 00000000000..eb544b137c5
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/nvtt/nvmath/plane.h
@@ -0,0 +1,40 @@
+// This code is in the public domain -- Ignacio Castaño <castano@gmail.com>
+
+#ifndef NV_MATH_PLANE_H
+#define NV_MATH_PLANE_H
+
+#include "nvmath.h"
+#include "vector.h"
+
+namespace nv
+{
+ class Matrix;
+
+ class NVMATH_CLASS Plane
+ {
+ public:
+ Plane();
+ Plane(float x, float y, float z, float w);
+ Plane(const Vector4 & v);
+ Plane(const Vector3 & v, float d);
+ Plane(const Vector3 & normal, const Vector3 & point);
+ Plane(const Vector3 & v0, const Vector3 & v1, const Vector3 & v2);
+
+ const Plane & operator=(const Plane & v);
+
+ Vector3 vector() const;
+ float offset() const;
+
+ void operator*=(float s);
+
+ Vector4 v;
+ };
+
+ Plane transformPlane(const Matrix &, const Plane &);
+
+ Vector3 planeIntersection(const Plane & a, const Plane & b, const Plane & c);
+
+
+} // nv namespace
+
+#endif // NV_MATH_PLANE_H
diff --git a/3rdparty/bgfx/3rdparty/nvtt/nvmath/plane.inl b/3rdparty/bgfx/3rdparty/nvtt/nvmath/plane.inl
new file mode 100644
index 00000000000..7baf8048534
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/nvtt/nvmath/plane.inl
@@ -0,0 +1,49 @@
+// This code is in the public domain -- Ignacio Castaño <castano@gmail.com>
+
+#pragma once
+#ifndef NV_MATH_PLANE_INL
+#define NV_MATH_PLANE_INL
+
+#include "plane.h"
+#include "vector.inl"
+
+namespace nv
+{
+ inline Plane::Plane() {}
+ inline Plane::Plane(float x, float y, float z, float w) : v(x, y, z, w) {}
+ inline Plane::Plane(const Vector4 & v) : v(v) {}
+ inline Plane::Plane(const Vector3 & v, float d) : v(v, d) {}
+ inline Plane::Plane(const Vector3 & normal, const Vector3 & point) : v(normal, -dot(normal, point)) {}
+ inline Plane::Plane(const Vector3 & v0, const Vector3 & v1, const Vector3 & v2) {
+ Vector3 n = cross(v1-v0, v2-v0);
+ float d = -dot(n, v0);
+ v = Vector4(n, d);
+ }
+
+ inline const Plane & Plane::operator=(const Plane & p) { v = p.v; return *this; }
+
+ inline Vector3 Plane::vector() const { return v.xyz(); }
+ inline float Plane::offset() const { return v.w; }
+
+ // Normalize plane.
+ inline Plane normalize(const Plane & plane, float epsilon = NV_EPSILON)
+ {
+ const float len = length(plane.vector());
+ const float inv = isZero(len, epsilon) ? 0 : 1.0f / len;
+ return Plane(plane.v * inv);
+ }
+
+ // Get the signed distance from the given point to this plane.
+ inline float distance(const Plane & plane, const Vector3 & point)
+ {
+ return dot(plane.vector(), point) + plane.offset();
+ }
+
+ inline void Plane::operator*=(float s)
+ {
+ v *= s;
+ }
+
+} // nv namespace
+
+#endif // NV_MATH_PLANE_H
diff --git a/3rdparty/bgfx/3rdparty/nvtt/nvmath/vector.h b/3rdparty/bgfx/3rdparty/nvtt/nvmath/vector.h
new file mode 100644
index 00000000000..180cfab0e1f
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/nvtt/nvmath/vector.h
@@ -0,0 +1,148 @@
+// This code is in the public domain -- castanyo@yahoo.es
+
+#ifndef NV_MATH_VECTOR_H
+#define NV_MATH_VECTOR_H
+
+#include "nvmath.h"
+
+namespace nv
+{
+ class NVMATH_CLASS Vector2
+ {
+ public:
+ typedef Vector2 const & Arg;
+
+ Vector2();
+ explicit Vector2(float f);
+ Vector2(float x, float y);
+ Vector2(Vector2::Arg v);
+
+ //template <typename T> explicit Vector2(const T & v) : x(v.x), y(v.y) {}
+ //template <typename T> operator T() const { return T(x, y); }
+
+ const Vector2 & operator=(Vector2::Arg v);
+
+ const float * ptr() const;
+
+ void set(float x, float y);
+
+ Vector2 operator-() const;
+ void operator+=(Vector2::Arg v);
+ void operator-=(Vector2::Arg v);
+ void operator*=(float s);
+ void operator*=(Vector2::Arg v);
+
+ friend bool operator==(Vector2::Arg a, Vector2::Arg b);
+ friend bool operator!=(Vector2::Arg a, Vector2::Arg b);
+
+ union {
+ struct {
+ float x, y;
+ };
+ float component[2];
+ };
+ };
+
+ class NVMATH_CLASS Vector3
+ {
+ public:
+ typedef Vector3 const & Arg;
+
+ Vector3();
+ explicit Vector3(float x);
+ //explicit Vector3(int x) : x(float(x)), y(float(x)), z(float(x)) {}
+ Vector3(float x, float y, float z);
+ Vector3(Vector2::Arg v, float z);
+ Vector3(Vector3::Arg v);
+
+ //template <typename T> explicit Vector3(const T & v) : x(v.x), y(v.y), z(v.z) {}
+ //template <typename T> operator T() const { return T(x, y, z); }
+
+ const Vector3 & operator=(Vector3::Arg v);
+
+ Vector2 xy() const;
+
+ const float * ptr() const;
+
+ void set(float x, float y, float z);
+
+ Vector3 operator-() const;
+ void operator+=(Vector3::Arg v);
+ void operator-=(Vector3::Arg v);
+ void operator*=(float s);
+ void operator/=(float s);
+ void operator*=(Vector3::Arg v);
+ void operator/=(Vector3::Arg v);
+
+ friend bool operator==(Vector3::Arg a, Vector3::Arg b);
+ friend bool operator!=(Vector3::Arg a, Vector3::Arg b);
+
+ union {
+ struct {
+ float x, y, z;
+ };
+ float component[3];
+ };
+ };
+
+ class NVMATH_CLASS Vector4
+ {
+ public:
+ typedef Vector4 const & Arg;
+
+ Vector4();
+ explicit Vector4(float x);
+ Vector4(float x, float y, float z, float w);
+ Vector4(Vector2::Arg v, float z, float w);
+ Vector4(Vector2::Arg v, Vector2::Arg u);
+ Vector4(Vector3::Arg v, float w);
+ Vector4(Vector4::Arg v);
+ // Vector4(const Quaternion & v);
+
+ //template <typename T> explicit Vector4(const T & v) : x(v.x), y(v.y), z(v.z), w(v.w) {}
+ //template <typename T> operator T() const { return T(x, y, z, w); }
+
+ const Vector4 & operator=(Vector4::Arg v);
+
+ Vector2 xy() const;
+ Vector2 zw() const;
+ Vector3 xyz() const;
+
+ const float * ptr() const;
+
+ void set(float x, float y, float z, float w);
+
+ Vector4 operator-() const;
+ void operator+=(Vector4::Arg v);
+ void operator-=(Vector4::Arg v);
+ void operator*=(float s);
+ void operator/=(float s);
+ void operator*=(Vector4::Arg v);
+ void operator/=(Vector4::Arg v);
+
+ friend bool operator==(Vector4::Arg a, Vector4::Arg b);
+ friend bool operator!=(Vector4::Arg a, Vector4::Arg b);
+
+ union {
+ struct {
+ float x, y, z, w;
+ };
+ float component[4];
+ };
+ };
+
+} // nv namespace
+
+// If we had these functions, they would be ambiguous, the compiler would not know which one to pick:
+//template <typename T> Vector2 to(const T & v) { return Vector2(v.x, v.y); }
+//template <typename T> Vector3 to(const T & v) { return Vector3(v.x, v.y, v.z); }
+//template <typename T> Vector4 to(const T & v) { return Vector4(v.x, v.y, v.z, v.z); }
+
+// We could use a cast operator so that we could infer the expected type, but that doesn't work the same way in all compilers and produces horrible error messages.
+
+// Instead we simply have explicit casts:
+template <typename T> T to(const nv::Vector2 & v) { NV_COMPILER_CHECK(sizeof(T) == sizeof(nv::Vector2)); return T(v.x, v.y); }
+template <typename T> T to(const nv::Vector3 & v) { NV_COMPILER_CHECK(sizeof(T) == sizeof(nv::Vector3)); return T(v.x, v.y, v.z); }
+template <typename T> T to(const nv::Vector4 & v) { NV_COMPILER_CHECK(sizeof(T) == sizeof(nv::Vector4)); return T(v.x, v.y, v.z, v.w); }
+
+#endif // NV_MATH_VECTOR_H
diff --git a/3rdparty/bgfx/3rdparty/nvtt/nvmath/vector.inl b/3rdparty/bgfx/3rdparty/nvtt/nvmath/vector.inl
new file mode 100644
index 00000000000..8f1da1ecaa6
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/nvtt/nvmath/vector.inl
@@ -0,0 +1,921 @@
+// This code is in the public domain -- castanyo@yahoo.es
+
+#ifndef NV_MATH_VECTOR_INL
+#define NV_MATH_VECTOR_INL
+
+#include "vector.h"
+#include "nvcore/utils.h" // min, max
+#include "nvcore/hash.h" // hash
+
+namespace nv
+{
+
+ // Helpers to convert vector types. Assume T has x,y members and 2 argument constructor.
+ //template <typename T> T to(Vector2::Arg v) { return T(v.x, v.y); }
+
+ // Helpers to convert vector types. Assume T has x,y,z members and 3 argument constructor.
+ //template <typename T> T to(Vector3::Arg v) { return T(v.x, v.y, v.z); }
+
+ // Helpers to convert vector types. Assume T has x,y,z members and 3 argument constructor.
+ //template <typename T> T to(Vector4::Arg v) { return T(v.x, v.y, v.z, v.w); }
+
+
+ // Vector2
+ inline Vector2::Vector2() {}
+ inline Vector2::Vector2(float f) : x(f), y(f) {}
+ inline Vector2::Vector2(float x, float y) : x(x), y(y) {}
+ inline Vector2::Vector2(Vector2::Arg v) : x(v.x), y(v.y) {}
+
+ inline const Vector2 & Vector2::operator=(Vector2::Arg v)
+ {
+ x = v.x;
+ y = v.y;
+ return *this;
+ }
+
+ inline const float * Vector2::ptr() const
+ {
+ return &x;
+ }
+
+ inline void Vector2::set(float x, float y)
+ {
+ this->x = x;
+ this->y = y;
+ }
+
+ inline Vector2 Vector2::operator-() const
+ {
+ return Vector2(-x, -y);
+ }
+
+ inline void Vector2::operator+=(Vector2::Arg v)
+ {
+ x += v.x;
+ y += v.y;
+ }
+
+ inline void Vector2::operator-=(Vector2::Arg v)
+ {
+ x -= v.x;
+ y -= v.y;
+ }
+
+ inline void Vector2::operator*=(float s)
+ {
+ x *= s;
+ y *= s;
+ }
+
+ inline void Vector2::operator*=(Vector2::Arg v)
+ {
+ x *= v.x;
+ y *= v.y;
+ }
+
+ inline bool operator==(Vector2::Arg a, Vector2::Arg b)
+ {
+ return a.x == b.x && a.y == b.y;
+ }
+ inline bool operator!=(Vector2::Arg a, Vector2::Arg b)
+ {
+ return a.x != b.x || a.y != b.y;
+ }
+
+
+ // Vector3
+ inline Vector3::Vector3() {}
+ inline Vector3::Vector3(float f) : x(f), y(f), z(f) {}
+ inline Vector3::Vector3(float x, float y, float z) : x(x), y(y), z(z) {}
+ inline Vector3::Vector3(Vector2::Arg v, float z) : x(v.x), y(v.y), z(z) {}
+ inline Vector3::Vector3(Vector3::Arg v) : x(v.x), y(v.y), z(v.z) {}
+
+ inline const Vector3 & Vector3::operator=(Vector3::Arg v)
+ {
+ x = v.x;
+ y = v.y;
+ z = v.z;
+ return *this;
+ }
+
+
+ inline Vector2 Vector3::xy() const
+ {
+ return Vector2(x, y);
+ }
+
+ inline const float * Vector3::ptr() const
+ {
+ return &x;
+ }
+
+ inline void Vector3::set(float x, float y, float z)
+ {
+ this->x = x;
+ this->y = y;
+ this->z = z;
+ }
+
+ inline Vector3 Vector3::operator-() const
+ {
+ return Vector3(-x, -y, -z);
+ }
+
+ inline void Vector3::operator+=(Vector3::Arg v)
+ {
+ x += v.x;
+ y += v.y;
+ z += v.z;
+ }
+
+ inline void Vector3::operator-=(Vector3::Arg v)
+ {
+ x -= v.x;
+ y -= v.y;
+ z -= v.z;
+ }
+
+ inline void Vector3::operator*=(float s)
+ {
+ x *= s;
+ y *= s;
+ z *= s;
+ }
+
+ inline void Vector3::operator/=(float s)
+ {
+ float is = 1.0f / s;
+ x *= is;
+ y *= is;
+ z *= is;
+ }
+
+ inline void Vector3::operator*=(Vector3::Arg v)
+ {
+ x *= v.x;
+ y *= v.y;
+ z *= v.z;
+ }
+
+ inline void Vector3::operator/=(Vector3::Arg v)
+ {
+ x /= v.x;
+ y /= v.y;
+ z /= v.z;
+ }
+
+ inline bool operator==(Vector3::Arg a, Vector3::Arg b)
+ {
+ return a.x == b.x && a.y == b.y && a.z == b.z;
+ }
+ inline bool operator!=(Vector3::Arg a, Vector3::Arg b)
+ {
+ return a.x != b.x || a.y != b.y || a.z != b.z;
+ }
+
+
+ // Vector4
+ inline Vector4::Vector4() {}
+ inline Vector4::Vector4(float f) : x(f), y(f), z(f), w(f) {}
+ inline Vector4::Vector4(float x, float y, float z, float w) : x(x), y(y), z(z), w(w) {}
+ inline Vector4::Vector4(Vector2::Arg v, float z, float w) : x(v.x), y(v.y), z(z), w(w) {}
+ inline Vector4::Vector4(Vector2::Arg v, Vector2::Arg u) : x(v.x), y(v.y), z(u.x), w(u.y) {}
+ inline Vector4::Vector4(Vector3::Arg v, float w) : x(v.x), y(v.y), z(v.z), w(w) {}
+ inline Vector4::Vector4(Vector4::Arg v) : x(v.x), y(v.y), z(v.z), w(v.w) {}
+
+ inline const Vector4 & Vector4::operator=(const Vector4 & v)
+ {
+ x = v.x;
+ y = v.y;
+ z = v.z;
+ w = v.w;
+ return *this;
+ }
+
+ inline Vector2 Vector4::xy() const
+ {
+ return Vector2(x, y);
+ }
+
+ inline Vector2 Vector4::zw() const
+ {
+ return Vector2(z, w);
+ }
+
+ inline Vector3 Vector4::xyz() const
+ {
+ return Vector3(x, y, z);
+ }
+
+ inline const float * Vector4::ptr() const
+ {
+ return &x;
+ }
+
+ inline void Vector4::set(float x, float y, float z, float w)
+ {
+ this->x = x;
+ this->y = y;
+ this->z = z;
+ this->w = w;
+ }
+
+ inline Vector4 Vector4::operator-() const
+ {
+ return Vector4(-x, -y, -z, -w);
+ }
+
+ inline void Vector4::operator+=(Vector4::Arg v)
+ {
+ x += v.x;
+ y += v.y;
+ z += v.z;
+ w += v.w;
+ }
+
+ inline void Vector4::operator-=(Vector4::Arg v)
+ {
+ x -= v.x;
+ y -= v.y;
+ z -= v.z;
+ w -= v.w;
+ }
+
+ inline void Vector4::operator*=(float s)
+ {
+ x *= s;
+ y *= s;
+ z *= s;
+ w *= s;
+ }
+
+ inline void Vector4::operator/=(float s)
+ {
+ x /= s;
+ y /= s;
+ z /= s;
+ w /= s;
+ }
+
+ inline void Vector4::operator*=(Vector4::Arg v)
+ {
+ x *= v.x;
+ y *= v.y;
+ z *= v.z;
+ w *= v.w;
+ }
+
+ inline void Vector4::operator/=(Vector4::Arg v)
+ {
+ x /= v.x;
+ y /= v.y;
+ z /= v.z;
+ w /= v.w;
+ }
+
+ inline bool operator==(Vector4::Arg a, Vector4::Arg b)
+ {
+ return a.x == b.x && a.y == b.y && a.z == b.z && a.w == b.w;
+ }
+ inline bool operator!=(Vector4::Arg a, Vector4::Arg b)
+ {
+ return a.x != b.x || a.y != b.y || a.z != b.z || a.w != b.w;
+ }
+
+
+
+ // Functions
+
+
+ // Vector2
+
+ inline Vector2 add(Vector2::Arg a, Vector2::Arg b)
+ {
+ return Vector2(a.x + b.x, a.y + b.y);
+ }
+ inline Vector2 operator+(Vector2::Arg a, Vector2::Arg b)
+ {
+ return add(a, b);
+ }
+
+ inline Vector2 sub(Vector2::Arg a, Vector2::Arg b)
+ {
+ return Vector2(a.x - b.x, a.y - b.y);
+ }
+ inline Vector2 operator-(Vector2::Arg a, Vector2::Arg b)
+ {
+ return sub(a, b);
+ }
+
+ inline Vector2 scale(Vector2::Arg v, float s)
+ {
+ return Vector2(v.x * s, v.y * s);
+ }
+
+ inline Vector2 scale(Vector2::Arg v, Vector2::Arg s)
+ {
+ return Vector2(v.x * s.x, v.y * s.y);
+ }
+
+ inline Vector2 operator*(Vector2::Arg v, float s)
+ {
+ return scale(v, s);
+ }
+
+ inline Vector2 operator*(Vector2::Arg v1, Vector2::Arg v2)
+ {
+ return Vector2(v1.x*v2.x, v1.y*v2.y);
+ }
+
+ inline Vector2 operator*(float s, Vector2::Arg v)
+ {
+ return scale(v, s);
+ }
+
+ inline Vector2 operator/(Vector2::Arg v, float s)
+ {
+ return scale(v, 1.0f/s);
+ }
+
+ inline Vector2 lerp(Vector2::Arg v1, Vector2::Arg v2, float t)
+ {
+ const float s = 1.0f - t;
+ return Vector2(v1.x * s + t * v2.x, v1.y * s + t * v2.y);
+ }
+
+ inline float dot(Vector2::Arg a, Vector2::Arg b)
+ {
+ return a.x * b.x + a.y * b.y;
+ }
+
+ inline float lengthSquared(Vector2::Arg v)
+ {
+ return v.x * v.x + v.y * v.y;
+ }
+
+ inline float length(Vector2::Arg v)
+ {
+ return sqrtf(lengthSquared(v));
+ }
+
+ inline float distance(Vector2::Arg a, Vector2::Arg b)
+ {
+ return length(a - b);
+ }
+
+ inline float inverseLength(Vector2::Arg v)
+ {
+ return 1.0f / sqrtf(lengthSquared(v));
+ }
+
+ inline bool isNormalized(Vector2::Arg v, float epsilon = NV_NORMAL_EPSILON)
+ {
+ return equal(length(v), 1, epsilon);
+ }
+
+ inline Vector2 normalize(Vector2::Arg v, float epsilon = NV_EPSILON)
+ {
+ float l = length(v);
+ NV_UNUSED(epsilon);
+ nvDebugCheck(!isZero(l, epsilon));
+ Vector2 n = scale(v, 1.0f / l);
+ nvDebugCheck(isNormalized(n));
+ return n;
+ }
+
+ inline Vector2 normalizeSafe(Vector2::Arg v, Vector2::Arg fallback, float epsilon = NV_EPSILON)
+ {
+ float l = length(v);
+ if (isZero(l, epsilon)) {
+ return fallback;
+ }
+ return scale(v, 1.0f / l);
+ }
+
+ // Safe, branchless normalization from Andy Firth. All error checking ommitted.
+ // http://altdevblogaday.com/2011/08/21/practical-flt-point-tricks/
+ inline Vector2 normalizeFast(Vector2::Arg v)
+ {
+ const float very_small_float = 1.0e-037f;
+ float l = very_small_float + length(v);
+ return scale(v, 1.0f / l);
+ }
+
+ inline bool equal(Vector2::Arg v1, Vector2::Arg v2, float epsilon = NV_EPSILON)
+ {
+ return equal(v1.x, v2.x, epsilon) && equal(v1.y, v2.y, epsilon);
+ }
+
+ inline Vector2 min(Vector2::Arg a, Vector2::Arg b)
+ {
+ return Vector2(min(a.x, b.x), min(a.y, b.y));
+ }
+
+ inline Vector2 max(Vector2::Arg a, Vector2::Arg b)
+ {
+ return Vector2(max(a.x, b.x), max(a.y, b.y));
+ }
+
+ inline Vector2 clamp(Vector2::Arg v, float min, float max)
+ {
+ return Vector2(clamp(v.x, min, max), clamp(v.y, min, max));
+ }
+
+ inline Vector2 saturate(Vector2::Arg v)
+ {
+ return Vector2(saturate(v.x), saturate(v.y));
+ }
+
+ inline bool isFinite(Vector2::Arg v)
+ {
+ return isFinite(v.x) && isFinite(v.y);
+ }
+
+ inline Vector2 validate(Vector2::Arg v, Vector2::Arg fallback = Vector2(0.0f))
+ {
+ if (!isFinite(v)) return fallback;
+ Vector2 vf = v;
+ nv::floatCleanup(vf.component, 2);
+ return vf;
+ }
+
+ // Note, this is the area scaled by 2!
+ inline float triangleArea(Vector2::Arg v0, Vector2::Arg v1)
+ {
+ return (v0.x * v1.y - v0.y * v1.x); // * 0.5f;
+ }
+ inline float triangleArea(Vector2::Arg a, Vector2::Arg b, Vector2::Arg c)
+ {
+ // IC: While it may be appealing to use the following expression:
+ //return (c.x * a.y + a.x * b.y + b.x * c.y - b.x * a.y - c.x * b.y - a.x * c.y); // * 0.5f;
+
+ // That's actually a terrible idea. Small triangles far from the origin can end up producing fairly large floating point
+ // numbers and the results becomes very unstable and dependent on the order of the factors.
+
+ // Instead, it's preferable to substract the vertices first, and multiply the resulting small values together. The result
+ // in this case is always much more accurate (as long as the triangle is small) and less dependent of the location of
+ // the triangle.
+
+ //return ((a.x - c.x) * (b.y - c.y) - (a.y - c.y) * (b.x - c.x)); // * 0.5f;
+ return triangleArea(a-c, b-c);
+ }
+
+
+ template <>
+ inline uint hash(const Vector2 & v, uint h)
+ {
+ return sdbmFloatHash(v.component, 2, h);
+ }
+
+
+
+ // Vector3
+
+ inline Vector3 add(Vector3::Arg a, Vector3::Arg b)
+ {
+ return Vector3(a.x + b.x, a.y + b.y, a.z + b.z);
+ }
+ inline Vector3 add(Vector3::Arg a, float b)
+ {
+ return Vector3(a.x + b, a.y + b, a.z + b);
+ }
+ inline Vector3 operator+(Vector3::Arg a, Vector3::Arg b)
+ {
+ return add(a, b);
+ }
+ inline Vector3 operator+(Vector3::Arg a, float b)
+ {
+ return add(a, b);
+ }
+
+ inline Vector3 sub(Vector3::Arg a, Vector3::Arg b)
+ {
+ return Vector3(a.x - b.x, a.y - b.y, a.z - b.z);
+ }
+ inline Vector3 sub(Vector3::Arg a, float b)
+ {
+ return Vector3(a.x - b, a.y - b, a.z - b);
+ }
+ inline Vector3 operator-(Vector3::Arg a, Vector3::Arg b)
+ {
+ return sub(a, b);
+ }
+ inline Vector3 operator-(Vector3::Arg a, float b)
+ {
+ return sub(a, b);
+ }
+
+ inline Vector3 cross(Vector3::Arg a, Vector3::Arg b)
+ {
+ return Vector3(a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x);
+ }
+
+ inline Vector3 scale(Vector3::Arg v, float s)
+ {
+ return Vector3(v.x * s, v.y * s, v.z * s);
+ }
+
+ inline Vector3 scale(Vector3::Arg v, Vector3::Arg s)
+ {
+ return Vector3(v.x * s.x, v.y * s.y, v.z * s.z);
+ }
+
+ inline Vector3 operator*(Vector3::Arg v, float s)
+ {
+ return scale(v, s);
+ }
+
+ inline Vector3 operator*(float s, Vector3::Arg v)
+ {
+ return scale(v, s);
+ }
+
+ inline Vector3 operator*(Vector3::Arg v, Vector3::Arg s)
+ {
+ return scale(v, s);
+ }
+
+ inline Vector3 operator/(Vector3::Arg v, float s)
+ {
+ return scale(v, 1.0f/s);
+ }
+
+ /*inline Vector3 add_scaled(Vector3::Arg a, Vector3::Arg b, float s)
+ {
+ return Vector3(a.x + b.x * s, a.y + b.y * s, a.z + b.z * s);
+ }*/
+
+ inline Vector3 lerp(Vector3::Arg v1, Vector3::Arg v2, float t)
+ {
+ const float s = 1.0f - t;
+ return Vector3(v1.x * s + t * v2.x, v1.y * s + t * v2.y, v1.z * s + t * v2.z);
+ }
+
+ inline float dot(Vector3::Arg a, Vector3::Arg b)
+ {
+ return a.x * b.x + a.y * b.y + a.z * b.z;
+ }
+
+ inline float lengthSquared(Vector3::Arg v)
+ {
+ return v.x * v.x + v.y * v.y + v.z * v.z;
+ }
+
+ inline float length(Vector3::Arg v)
+ {
+ return sqrtf(lengthSquared(v));
+ }
+
+ inline float distance(Vector3::Arg a, Vector3::Arg b)
+ {
+ return length(a - b);
+ }
+
+ inline float distanceSquared(Vector3::Arg a, Vector3::Arg b)
+ {
+ return lengthSquared(a - b);
+ }
+
+ inline float inverseLength(Vector3::Arg v)
+ {
+ return 1.0f / sqrtf(lengthSquared(v));
+ }
+
+ inline bool isNormalized(Vector3::Arg v, float epsilon = NV_NORMAL_EPSILON)
+ {
+ return equal(length(v), 1, epsilon);
+ }
+
+ inline Vector3 normalize(Vector3::Arg v, float epsilon = NV_EPSILON)
+ {
+ float l = length(v);
+ NV_UNUSED(epsilon);
+ nvDebugCheck(!isZero(l, epsilon));
+ Vector3 n = scale(v, 1.0f / l);
+ nvDebugCheck(isNormalized(n));
+ return n;
+ }
+
+ inline Vector3 normalizeSafe(Vector3::Arg v, Vector3::Arg fallback, float epsilon = NV_EPSILON)
+ {
+ float l = length(v);
+ if (isZero(l, epsilon)) {
+ return fallback;
+ }
+ return scale(v, 1.0f / l);
+ }
+
+ // Safe, branchless normalization from Andy Firth. All error checking ommitted.
+ // http://altdevblogaday.com/2011/08/21/practical-flt-point-tricks/
+ inline Vector3 normalizeFast(Vector3::Arg v)
+ {
+ const float very_small_float = 1.0e-037f;
+ float l = very_small_float + length(v);
+ return scale(v, 1.0f / l);
+ }
+
+ inline bool equal(Vector3::Arg v1, Vector3::Arg v2, float epsilon = NV_EPSILON)
+ {
+ return equal(v1.x, v2.x, epsilon) && equal(v1.y, v2.y, epsilon) && equal(v1.z, v2.z, epsilon);
+ }
+
+ inline Vector3 min(Vector3::Arg a, Vector3::Arg b)
+ {
+ return Vector3(min(a.x, b.x), min(a.y, b.y), min(a.z, b.z));
+ }
+
+ inline Vector3 max(Vector3::Arg a, Vector3::Arg b)
+ {
+ return Vector3(max(a.x, b.x), max(a.y, b.y), max(a.z, b.z));
+ }
+
+ inline Vector3 clamp(Vector3::Arg v, float min, float max)
+ {
+ return Vector3(clamp(v.x, min, max), clamp(v.y, min, max), clamp(v.z, min, max));
+ }
+
+ inline Vector3 saturate(Vector3::Arg v)
+ {
+ return Vector3(saturate(v.x), saturate(v.y), saturate(v.z));
+ }
+
+ inline Vector3 floor(Vector3::Arg v)
+ {
+ return Vector3(floorf(v.x), floorf(v.y), floorf(v.z));
+ }
+
+ inline Vector3 ceil(Vector3::Arg v)
+ {
+ return Vector3(ceilf(v.x), ceilf(v.y), ceilf(v.z));
+ }
+
+ inline bool isFinite(Vector3::Arg v)
+ {
+ return isFinite(v.x) && isFinite(v.y) && isFinite(v.z);
+ }
+
+ inline Vector3 validate(Vector3::Arg v, Vector3::Arg fallback = Vector3(0.0f))
+ {
+ if (!isFinite(v)) return fallback;
+ Vector3 vf = v;
+ nv::floatCleanup(vf.component, 3);
+ return vf;
+ }
+
+ inline Vector3 reflect(Vector3::Arg v, Vector3::Arg n)
+ {
+ return v - (2 * dot(v, n)) * n;
+ }
+
+ template <>
+ inline uint hash(const Vector3 & v, uint h)
+ {
+ return sdbmFloatHash(v.component, 3, h);
+ }
+
+
+ // Vector4
+
+ inline Vector4 add(Vector4::Arg a, Vector4::Arg b)
+ {
+ return Vector4(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w);
+ }
+ inline Vector4 operator+(Vector4::Arg a, Vector4::Arg b)
+ {
+ return add(a, b);
+ }
+
+ inline Vector4 sub(Vector4::Arg a, Vector4::Arg b)
+ {
+ return Vector4(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w);
+ }
+ inline Vector4 operator-(Vector4::Arg a, Vector4::Arg b)
+ {
+ return sub(a, b);
+ }
+
+ inline Vector4 scale(Vector4::Arg v, float s)
+ {
+ return Vector4(v.x * s, v.y * s, v.z * s, v.w * s);
+ }
+
+ inline Vector4 scale(Vector4::Arg v, Vector4::Arg s)
+ {
+ return Vector4(v.x * s.x, v.y * s.y, v.z * s.z, v.w * s.w);
+ }
+
+ inline Vector4 operator*(Vector4::Arg v, float s)
+ {
+ return scale(v, s);
+ }
+
+ inline Vector4 operator*(float s, Vector4::Arg v)
+ {
+ return scale(v, s);
+ }
+
+ inline Vector4 operator*(Vector4::Arg v, Vector4::Arg s)
+ {
+ return scale(v, s);
+ }
+
+ inline Vector4 operator/(Vector4::Arg v, float s)
+ {
+ return scale(v, 1.0f/s);
+ }
+
+ /*inline Vector4 add_scaled(Vector4::Arg a, Vector4::Arg b, float s)
+ {
+ return Vector4(a.x + b.x * s, a.y + b.y * s, a.z + b.z * s, a.w + b.w * s);
+ }*/
+
+ inline Vector4 lerp(Vector4::Arg v1, Vector4::Arg v2, float t)
+ {
+ const float s = 1.0f - t;
+ return Vector4(v1.x * s + t * v2.x, v1.y * s + t * v2.y, v1.z * s + t * v2.z, v1.w * s + t * v2.w);
+ }
+
+ inline float dot(Vector4::Arg a, Vector4::Arg b)
+ {
+ return a.x * b.x + a.y * b.y + a.z * b.z + a.w * b.w;
+ }
+
+ inline float lengthSquared(Vector4::Arg v)
+ {
+ return v.x * v.x + v.y * v.y + v.z * v.z + v.w * v.w;
+ }
+
+ inline float length(Vector4::Arg v)
+ {
+ return sqrtf(lengthSquared(v));
+ }
+
+ inline float inverseLength(Vector4::Arg v)
+ {
+ return 1.0f / sqrtf(lengthSquared(v));
+ }
+
+ inline bool isNormalized(Vector4::Arg v, float epsilon = NV_NORMAL_EPSILON)
+ {
+ return equal(length(v), 1, epsilon);
+ }
+
+ inline Vector4 normalize(Vector4::Arg v, float epsilon = NV_EPSILON)
+ {
+ float l = length(v);
+ NV_UNUSED(epsilon);
+ nvDebugCheck(!isZero(l, epsilon));
+ Vector4 n = scale(v, 1.0f / l);
+ nvDebugCheck(isNormalized(n));
+ return n;
+ }
+
+ inline Vector4 normalizeSafe(Vector4::Arg v, Vector4::Arg fallback, float epsilon = NV_EPSILON)
+ {
+ float l = length(v);
+ if (isZero(l, epsilon)) {
+ return fallback;
+ }
+ return scale(v, 1.0f / l);
+ }
+
+ // Safe, branchless normalization from Andy Firth. All error checking ommitted.
+ // http://altdevblogaday.com/2011/08/21/practical-flt-point-tricks/
+ inline Vector4 normalizeFast(Vector4::Arg v)
+ {
+ const float very_small_float = 1.0e-037f;
+ float l = very_small_float + length(v);
+ return scale(v, 1.0f / l);
+ }
+
+ inline bool equal(Vector4::Arg v1, Vector4::Arg v2, float epsilon = NV_EPSILON)
+ {
+ return equal(v1.x, v2.x, epsilon) && equal(v1.y, v2.y, epsilon) && equal(v1.z, v2.z, epsilon) && equal(v1.w, v2.w, epsilon);
+ }
+
+ inline Vector4 min(Vector4::Arg a, Vector4::Arg b)
+ {
+ return Vector4(min(a.x, b.x), min(a.y, b.y), min(a.z, b.z), min(a.w, b.w));
+ }
+
+ inline Vector4 max(Vector4::Arg a, Vector4::Arg b)
+ {
+ return Vector4(max(a.x, b.x), max(a.y, b.y), max(a.z, b.z), max(a.w, b.w));
+ }
+
+ inline Vector4 clamp(Vector4::Arg v, float min, float max)
+ {
+ return Vector4(clamp(v.x, min, max), clamp(v.y, min, max), clamp(v.z, min, max), clamp(v.w, min, max));
+ }
+
+ inline Vector4 saturate(Vector4::Arg v)
+ {
+ return Vector4(saturate(v.x), saturate(v.y), saturate(v.z), saturate(v.w));
+ }
+
+ inline bool isFinite(Vector4::Arg v)
+ {
+ return isFinite(v.x) && isFinite(v.y) && isFinite(v.z) && isFinite(v.w);
+ }
+
+ inline Vector4 validate(Vector4::Arg v, Vector4::Arg fallback = Vector4(0.0f))
+ {
+ if (!isFinite(v)) return fallback;
+ Vector4 vf = v;
+ nv::floatCleanup(vf.component, 4);
+ return vf;
+ }
+
+ template <>
+ inline uint hash(const Vector4 & v, uint h)
+ {
+ return sdbmFloatHash(v.component, 4, h);
+ }
+
+
+#if NV_OS_IOS // LLVM is not happy with implicit conversion of immediate constants to float
+
+ //int:
+
+ inline Vector2 scale(Vector2::Arg v, int s)
+ {
+ return Vector2(v.x * s, v.y * s);
+ }
+
+ inline Vector2 operator*(Vector2::Arg v, int s)
+ {
+ return scale(v, s);
+ }
+
+ inline Vector2 operator*(int s, Vector2::Arg v)
+ {
+ return scale(v, s);
+ }
+
+ inline Vector2 operator/(Vector2::Arg v, int s)
+ {
+ return scale(v, 1.0f/s);
+ }
+
+ inline Vector3 scale(Vector3::Arg v, int s)
+ {
+ return Vector3(v.x * s, v.y * s, v.z * s);
+ }
+
+ inline Vector3 operator*(Vector3::Arg v, int s)
+ {
+ return scale(v, s);
+ }
+
+ inline Vector3 operator*(int s, Vector3::Arg v)
+ {
+ return scale(v, s);
+ }
+
+ inline Vector3 operator/(Vector3::Arg v, int s)
+ {
+ return scale(v, 1.0f/s);
+ }
+
+ inline Vector4 scale(Vector4::Arg v, int s)
+ {
+ return Vector4(v.x * s, v.y * s, v.z * s, v.w * s);
+ }
+
+ inline Vector4 operator*(Vector4::Arg v, int s)
+ {
+ return scale(v, s);
+ }
+
+ inline Vector4 operator*(int s, Vector4::Arg v)
+ {
+ return scale(v, s);
+ }
+
+ inline Vector4 operator/(Vector4::Arg v, int s)
+ {
+ return scale(v, 1.0f/s);
+ }
+
+ //double:
+
+ inline Vector3 operator*(Vector3::Arg v, double s)
+ {
+ return scale(v, (float)s);
+ }
+
+ inline Vector3 operator*(double s, Vector3::Arg v)
+ {
+ return scale(v, (float)s);
+ }
+
+ inline Vector3 operator/(Vector3::Arg v, double s)
+ {
+ return scale(v, 1.f/((float)s));
+ }
+
+#endif //NV_OS_IOS
+
+} // nv namespace
+
+#endif // NV_MATH_VECTOR_INL
diff --git a/3rdparty/bgfx/3rdparty/nvtt/nvtt.cpp b/3rdparty/bgfx/3rdparty/nvtt/nvtt.cpp
new file mode 100644
index 00000000000..404b5572efd
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/nvtt/nvtt.cpp
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
+ */
+
+#include "nvtt.h"
+
+#include <string.h>
+#include <bx/uint32_t.h>
+
+#include "bc6h/zoh.h"
+#include "bc7/avpcl.h"
+#include "nvmath/vector.inl"
+
+NVCORE_API int nvAbort(const char *, const char *, int , const char *, const char *, ...)
+{
+ abort();
+ return 0;
+}
+
+namespace nvtt
+{
+ using namespace nv;
+
+ void compressBC6H(const void* _input, uint32_t _width, uint32_t _height, uint32_t _stride, void* _output)
+ {
+ const uint8_t* src = (const uint8_t*)_input;
+ char* dst = (char*)_output;
+
+ for (uint32_t yy = 0; yy < _height; yy += 4)
+ {
+ for (uint32_t xx = 0; xx < _width; xx += 4)
+ {
+ const Vector4* rgba = (const Vector4*)&src[yy*_stride + xx*sizeof(float)*4];
+
+ ZOH::Utils::FORMAT = ZOH::UNSIGNED_F16;
+ ZOH::Tile zohTile(4, 4);
+
+ memset(zohTile.data, 0, sizeof(zohTile.data) );
+ memset(zohTile.importance_map, 0, sizeof(zohTile.importance_map) );
+
+ for (uint32_t blockY = 0; blockY < 4; ++blockY)
+ {
+ for (uint32_t blockX = 0; blockX < 4; ++blockX)
+ {
+ Vector4 color = rgba[blockY*4 + blockX];
+ uint16 rHalf = bx::halfFromFloat(color.x);
+ uint16 gHalf = bx::halfFromFloat(color.y);
+ uint16 bHalf = bx::halfFromFloat(color.z);
+ zohTile.data[blockY][blockX].x = ZOH::Tile::half2float(rHalf);
+ zohTile.data[blockY][blockX].y = ZOH::Tile::half2float(gHalf);
+ zohTile.data[blockY][blockX].z = ZOH::Tile::half2float(bHalf);
+ zohTile.importance_map[blockY][blockX] = 1.0f;
+ }
+ }
+
+ ZOH::compress(zohTile, &dst[( (yy*_width) + xx)/4 * 16]);
+ }
+ }
+ }
+
+ void compressBC7(const void* _input, uint32_t _width, uint32_t _height, uint32_t _stride, void* _output)
+ {
+ const uint8_t* src = (const uint8_t*)_input;
+ char* dst = (char*)_output;
+
+ for (uint32_t yy = 0; yy < _height; yy += 4)
+ {
+ for (uint32_t xx = 0; xx < _width; xx += 4)
+ {
+ const Vector4* rgba = (const Vector4*)&src[yy*_stride + xx*sizeof(float)*4];
+
+ AVPCL::mode_rgb = false;
+ AVPCL::flag_premult = false;
+ AVPCL::flag_nonuniform = false;
+ AVPCL::flag_nonuniform_ati = false;
+
+ AVPCL::Tile avpclTile(4, 4);
+ memset(avpclTile.data, 0, sizeof(avpclTile.data) );
+ for (uint32_t blockY = 0; blockY < 4; ++blockY)
+ {
+ for (uint32_t blockX = 0; blockX < 4; ++blockX)
+ {
+ Vector4 color = rgba[blockY*4 + blockX];
+ avpclTile.data[blockY][blockX] = color * 255.0f;
+ avpclTile.importance_map[blockY][blockX] = 1.0f;
+ }
+ }
+
+ AVPCL::compress(avpclTile, &dst[( (yy*_width) + xx)/4 * 16]);
+ }
+ }
+ }
+
+} //namespace nvtt
diff --git a/3rdparty/bgfx/3rdparty/nvtt/nvtt.h b/3rdparty/bgfx/3rdparty/nvtt/nvtt.h
new file mode 100644
index 00000000000..a37c7cfb232
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/nvtt/nvtt.h
@@ -0,0 +1,13 @@
+#ifndef NVTT_H
+#define NVTT_H
+
+#include <stdint.h>
+
+namespace nvtt
+{
+void compressBC6H(const void* _input, uint32_t _width, uint32_t _height, uint32_t _stride, void* _output);
+void compressBC7(const void* _input, uint32_t _width, uint32_t _height, uint32_t _stride, void* _output);
+
+} // namespace nvtt
+
+#endif // NVTT_H
diff --git a/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui.cpp b/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui.cpp
index 81a6d0795e8..c7adf2efba6 100644
--- a/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui.cpp
+++ b/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui.cpp
@@ -1,8 +1,8 @@
-// ImGui library v1.47 WIP
-// Main code & documentation
+// dear imgui, v1.48 WIP
+// (main code and documentation)
// See ImGui::ShowTestWindow() in imgui_demo.cpp for demo code.
-// Read 'Programmer guide' below for notes on how to setup ImGui in your codebase.
+// Newcomers, read 'Programmer guide' below for notes on how to setup ImGui in your codebase.
// Get latest version at https://github.com/ocornut/imgui
// Releases change-log at https://github.com/ocornut/imgui/releases
// Developed by Omar Cornut and every direct or indirect contributors to the GitHub.
@@ -76,18 +76,20 @@
- read the FAQ below this section!
- your code creates the UI, if your code doesn't run the UI is gone! == very dynamic UI, no construction/destructions steps, less data retention on your side, no state duplication, less sync, less bugs.
- call and read ImGui::ShowTestWindow() for demo code demonstrating most features.
- - see examples/ folder for standalone sample applications. e.g. examples/opengl_example/
+ - see examples/ folder for standalone sample applications. Prefer reading examples/opengl_example/ first at it is the simplest.
- customization: PushStyleColor()/PushStyleVar() or the style editor to tweak the look of the interface (e.g. if you want a more compact UI or a different color scheme).
- getting started:
- - initialisation: call ImGui::GetIO() to retrieve the ImGuiIO structure and fill the 'Settings' data.
+ - init: call ImGui::GetIO() to retrieve the ImGuiIO structure and fill the fields marked 'Settings'.
+ - init: call io.Fonts->GetTexDataAsRGBA32(...) and load the font texture pixels into graphics memory.
- every frame:
- 1/ in your mainloop or right after you got your keyboard/mouse info, call ImGui::GetIO() and fill the 'Input' data, then call ImGui::NewFrame().
- 2/ use any ImGui function you want between NewFrame() and Render()
- 3/ ImGui::Render() to render all the accumulated command-lists. it will call your RenderDrawListFn handler that you set in the IO structure.
+ 1/ in your mainloop or right after you got your keyboard/mouse info, call ImGui::GetIO() and fill the fields marked 'Input'
+ 2/ call ImGui::NewFrame().
+ 3/ use any ImGui function you want between NewFrame() and Render()
+ 4/ call ImGui::Render() to render all the accumulated command-lists. it will call your RenderDrawListFn handler that you set in the IO structure.
- all rendering information are stored into command-lists until ImGui::Render() is called.
- ImGui never touches or know about your GPU state. the only function that knows about GPU is the RenderDrawListFn handler that you must provide.
- - effectively it means you can create widgets at any time in your code, regardless of "update" vs "render" considerations.
+ - effectively it means you can create widgets at any time in your code, regardless of considerations of being in "update" vs "render" phases.
- refer to the examples applications in the examples/ folder for instruction on how to setup your code.
- a typical application skeleton may be:
@@ -100,32 +102,34 @@
// TODO: Fill others settings of the io structure
// Load texture atlas
+ // There is a default font so you don't need to care about choosing a font yet
unsigned char* pixels;
- int width, height, bytes_per_pixels;
- io.Fonts->GetTexDataAsRGBA32(pixels, &width, &height, &bytes_per_pixels);
- // TODO: copy texture to graphics memory.
- // TODO: store your texture pointer/identifier in 'io.Fonts->TexID'
+ int width, height;
+ io.Fonts->GetTexDataAsRGBA32(pixels, &width, &height);
+ // TODO: At this points you've got a texture pointed to by 'pixels' and you need to upload that your your graphic system
+ // TODO: Store your texture pointer/identifier (whatever your engine uses) in 'io.Fonts->TexID'
// Application main loop
while (true)
{
- // 1) get low-level input
- // e.g. on Win32, GetKeyboardState(), or poll your events, etc.
-
- // 2) TODO: fill all fields of IO structure and call NewFrame
+ // 1) get low-level inputs (e.g. on Win32, GetKeyboardState(), or poll your events, etc.)
+ // TODO: fill all fields of IO structure and call NewFrame
ImGuiIO& io = ImGui::GetIO();
io.DeltaTime = 1.0f/60.0f;
io.MousePos = mouse_pos;
io.MouseDown[0] = mouse_button_0;
+ io.MouseDown[1] = mouse_button_1;
io.KeysDown[i] = ...
+
+ // 2) call NewFrame(), after this point you can use ImGui::* functions anytime
ImGui::NewFrame();
- // 3) most of your application code here - you can use any of ImGui::* functions at any point in the frame
+ // 3) most of your application code here
ImGui::Begin("My window");
ImGui::Text("Hello, world.");
ImGui::End();
- GameUpdate();
- GameRender();
+ MyGameUpdate(); // may use ImGui functions
+ MyGameRender(); // may use ImGui functions
// 4) render & swap video buffers
ImGui::Render();
@@ -144,6 +148,8 @@
Here is a change-log of API breaking changes, if you are using one of the functions listed, expect to have to fix some code.
Also read releases logs https://github.com/ocornut/imgui/releases for more details.
+ - 2015/12/27 (1.48) - fixed ImDrawList::AddRect() which used to render a rectangle 1 px too large on each axis.
+ - 2015/12/04 (1.47) - renamed Color() helpers to ValueColor() - dangerously named, rarely used and probably to be made obsolete.
- 2015/08/29 (1.45) - with the addition of horizontal scrollbar we made various fixes to inconsistencies with dealing with cursor position.
GetCursorPos()/SetCursorPos() functions now include the scrolled amount. It shouldn't affect the majority of users, but take note that SetCursorPosX(100.0f) puts you at +100 from the starting x position which may include scrolling, not at +100 from the window left side.
GetContentRegionMax()/GetWindowContentRegionMin()/GetWindowContentRegionMax() functions allow include the scrolled amount. Typically those were used in cases where no scrolling would happen so it may not be a problem, but watch out!
@@ -401,7 +407,8 @@
- window: maximum window size settings (per-axis). for large popups in particular user may not want the popup to fill all space.
- window: add a way for very transient windows (non-saved, temporary overlay over hundreds of objects) to "clean" up from the global window list. perhaps a lightweight explicit cleanup pass.
- - window: auto-fit feedback loop when user relies on any dynamic layout (window width multiplier, column). clarify.
+ - window: calling SetNextWindowSize() every frame with <= 0 doesn't do anything, may be useful to allow (particularly when used for a single axis).
+ - window: auto-fit feedback loop when user relies on any dynamic layout (window width multiplier, column) appears weird to end-user. clarify.
- window: allow resizing of child windows (possibly given min/max for each axis?)
- window: background options for child windows, border option (disable rounding)
- window: add a way to clear an existing window instead of appending (e.g. for tooltip override using a consistent api rather than the deferred tooltip)
@@ -410,15 +417,20 @@
- window: get size/pos helpers given names (see discussion in #249)
- window: a collapsed window can be stuck behind the main menu bar?
- window: detect extra End() call that pop the "Debug" window out and assert at call site instead of later.
+ - window: consider renaming "GetWindowFont" which conflict with old Windows #define (#340)
+ - window/tooltip: allow to set the width of a tooltip to allow TextWrapped() etc. while keeping the height automatic.
+ - draw-list: maintaining bounding box per command would allow to merge draw command when clipping isn't relied on (typical non-scrolling window or non-overflowing column would merge with previous command).
!- scrolling: allow immediately effective change of scroll if we haven't appended items yet
- splitter: formalize the splitter idiom into an official api (we want to handle n-way split)
- widgets: display mode: widget-label, label-widget (aligned on column or using fixed size), label-newline-tab-widget etc.
- widgets: clean up widgets internal toward exposing everything.
- widgets: add disabled and read-only modes (#211)
- main: considering adding EndFrame()/Init(). some constructs are awkward in the implementation because of the lack of them.
+ - main: make it so that a frame with no window registered won't refocus every window on subsequent frames (~bump LastFrameActive of all windows).
- main: IsItemHovered() make it more consistent for various type of widgets, widgets with multiple components, etc. also effectively IsHovered() region sometimes differs from hot region, e.g tree nodes
- main: IsItemHovered() info stored in a stack? so that 'if TreeNode() { Text; TreePop; } if IsHovered' return the hover state of the TreeNode?
- input text: add ImGuiInputTextFlags_EnterToApply? (off #218)
+ - input text multi-line: don't directly call AddText() which does an unnecessary vertex reserve for character count prior to clipping. and/or more line-based clipping to AddText(). and/or reorganize TextUnformatted/RenderText for more efficiency for large text (e.g TextUnformatted could clip and log separately, etc).
- input text multi-line: way to dynamically grow the buffer without forcing the user to initially allocate for worse case (follow up on #200)
- input text multi-line: line numbers? status bar? (follow up on #200)
- input number: optional range min/max for Input*() functions
@@ -429,13 +441,15 @@
- image/image button: misalignment on padded/bordered button?
- image/image button: parameters are confusing, image() has tint_col,border_col whereas imagebutton() has bg_col/tint_col. Even thou they are different parameters ordering could be more consistent. can we fix that?
- layout: horizontal layout helper (#97)
+ - layout: horizontal flow until no space left (#404)
- layout: more generic alignment state (left/right/centered) for single items?
- layout: clean up the InputFloatN/SliderFloatN/ColorEdit4 layout code. item width should include frame padding.
- columns: separator function or parameter that works within the column (currently Separator() bypass all columns) (#125)
- columns: declare column set (each column: fixed size, %, fill, distribute default size among fills) (#125)
- columns: columns header to act as button (~sort op) and allow resize/reorder (#125)
- columns: user specify columns size (#125)
- - popup: border options. richer api like BeginChild() perhaps? (#197)
+ - columns: flag to add horizontal separator above/below?
+ - columns/layout: setup minimum line height (equivalent of automatically calling AlignFirstTextHeightToWidgets)
- combo: sparse combo boxes (via function call?)
- combo: contents should extends to fit label if combo widget is small
- combo/listbox: keyboard control. need InputText-like non-active focus + key handling. considering keyboard for custom listbox (pr #203)
@@ -443,7 +457,9 @@
- listbox: user may want to initial scroll to focus on the one selected value?
- listbox: keyboard navigation.
- listbox: scrolling should track modified selection.
--! menus/popups: clarify usage of popups id, how MenuItem/Selectable closing parent popups affects the ID, etc. this is quite fishy needs improvement! (#331)
+!- popups/menus: clarify usage of popups id, how MenuItem/Selectable closing parent popups affects the ID, etc. this is quite fishy needs improvement! (#331, #402)
+ - popups: add variant using global identifier similar to Begin/End (#402)
+ - popups: border options. richer api like BeginChild() perhaps? (#197)
- menus: local shortcuts, global shortcuts (#126)
- menus: icons
- menus: menubars: some sort of priority / effect of main menu-bar on desktop size?
@@ -451,18 +467,19 @@
- tabs
- separator: separator on the initial position of a window is not visible (cursorpos.y <= clippos.y)
- gauge: various forms of gauge/loading bars widgets
+ - color: the color helpers/typing is a mess and needs sorting out.
- color: add a better color picker
- plot: PlotLines() should use the polygon-stroke facilities (currently issues with averaging normals)
- plot: make it easier for user to draw extra stuff into the graph (e.g: draw basis, highlight certain points, 2d plots, multiple plots)
- plot: "smooth" automatic scale over time, user give an input 0.0(full user scale) 1.0(full derived from value)
- plot: add a helper e.g. Plot(char* label, float value, float time_span=2.0f) that stores values and Plot them for you - probably another function name. and/or automatically allow to plot ANY displayed value (more reliance on stable ID)
- - applet: file selection widget (as an example)
- slider: allow using the [-]/[+] buttons used by InputFloat()/InputInt()
- slider: initial absolute click is imprecise. change to relative movement slider (same as scrollbar).
- slider: add dragging-based widgets to edit values with mouse (on 2 axises), saving screen real-estate.
- slider: tint background based on value (e.g. v_min -> v_max, or use 0.0f either side of the sign)
- slider & drag: int data passing through a float
- drag float: up/down axis
+ - drag float: added leeway on edge (e.g. a few invisible steps past the clamp limits)
- text edit: clean up the mess caused by converting UTF-8 <> wchar. the code is rather inefficient right now.
- text edit: centered text for slider as input text so it matches typical positioning.
- text edit: flag to disable live update of the user buffer.
@@ -470,13 +487,17 @@
- tree node / optimization: avoid formatting when clipped.
- tree node: tree-node/header right-most side doesn't take account of horizontal scrolling.
- tree node: add treenode/treepush int variants? because (void*) cast from int warns on some platforms/settings
+ - tree node / selectable render mismatch which is visible if you use them both next to each other (e.g. cf. property viewer)
- textwrapped: figure out better way to use TextWrapped() in an always auto-resize context (tooltip, etc.) (git issue #249)
- settings: write more decent code to allow saving/loading new fields
- settings: api for per-tool simple persistent data (bool,int,float,columns sizes,etc.) in .ini file
- - style: store rounded corners in texture to use 1 quad per corner (filled and wireframe). so rounding have minor cost.
+ - style/optimization: store rounded corners in texture to use 1 quad per corner (filled and wireframe) to lower the cost of rounding.
- style: color-box not always square?
- style: a concept of "compact style" that the end-user can easily rely on (e.g. PushStyleCompact()?) that maps to other settings? avoid implementing duplicate helpers such as SmallCheckbox(), etc.
+ - style: try to make PushStyleVar() more robust to incorrect parameters (to be more friendly to edit & continues situation).
+ - style: global scale setting.
- text: simple markup language for color change?
+ - font: helper to add glyph redirect/replacements (e.g. redirect alternate apostrophe unicode code points to ascii one, etc.)
- log: LogButtons() options for specifying depth and/or hiding depth slider
- log: have more control over the log scope (e.g. stop logging when leaving current tree node scope)
- log: be able to log anything (e.g. right-click on a window/tree-node, shows context menu? log into tty/file/clipboard)
@@ -487,13 +508,14 @@
!- keyboard: tooltip & combo boxes are messing up / not honoring keyboard tabbing
- keyboard: full keyboard navigation and focus.
- focus: SetKeyboardFocusHere() on with >= 0 offset could be done on same frame (else latch and modulate on beginning of next frame)
- - input: rework IO to be able to pass actual events to fix temporal aliasing issues.
+ - input: rework IO system to be able to pass actual ordered/timestamped events.
- input: support track pad style scrolling & slider edit.
- misc: provide a way to compile out the entire implementation while providing a dummy API (e.g. #define IMGUI_DUMMY_IMPL)
- misc: double-clicking on title bar to minimize isn't consistent, perhaps move to single-click on left-most collapse icon?
- - style editor: have a more global HSV setter (e.g. alter hue on all elements). consider replacing active/hovered by offset in HSV space?
+ - style editor: have a more global HSV setter (e.g. alter hue on all elements). consider replacing active/hovered by offset in HSV space? (#438)
- style editor: color child window height expressed in multiple of line height.
-!- examples: directx9/directx11: resizing window duplicate the font data :(
+ - drawlist: user probably can't call Clear() because we expect a texture to be pushed in the stack.
+ - examples: directx9/directx11: save/restore device state more thoroughly.
- optimization: use another hash function than crc32, e.g. FNV1a
- optimization/render: merge command-lists with same clip-rect into one even if they aren't sequential? (as long as in-between clip rectangle don't overlap)?
- optimization: turn some the various stack vectors into statically-sized arrays
@@ -510,6 +532,7 @@
#include <ctype.h> // toupper, isprint
#include <math.h> // sqrtf, fabsf, fmodf, powf, cosf, sinf, floorf, ceilf
+#include <stdlib.h> // NULL, malloc, free, qsort, atoi
#include <stdio.h> // vsnprintf, sscanf, printf
#include <new> // new (ptr)
#if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier
@@ -579,9 +602,7 @@ static void LoadSettings();
static void SaveSettings();
static void MarkSettingsDirty();
-static void PushClipRect(const ImRect& clip_rect, bool clipped_by_current = true);
static void PushColumnClipRect(int column_index = -1);
-static void PopClipRect();
static ImRect GetVisibleRect();
static bool BeginPopupEx(const char* str_id, ImGuiWindowFlags extra_flags);
@@ -753,7 +774,7 @@ void ImGuiIO::AddInputCharactersUTF8(const char* utf8_chars)
const int wchars_buf_len = sizeof(ImGuiIO::InputCharacters) / sizeof(ImWchar);
ImWchar wchars[wchars_buf_len];
ImTextStrFromUtf8(wchars, wchars_buf_len, utf8_chars, NULL);
- for (int i = 0; wchars[i] != 0 && i < wchars_buf_len; i++)
+ for (int i = 0; i < wchars_buf_len && wchars[i] != 0; i++)
AddInputCharacter(wchars[i]);
}
@@ -1590,7 +1611,7 @@ void ImGui::SetActiveID(ImGuiID id, ImGuiWindow* window = NULL)
{
ImGuiState& g = *GImGui;
g.ActiveId = id;
- g.ActiveIdAllowHoveringOthers = false;
+ g.ActiveIdAllowOverlap = false;
g.ActiveIdIsJustActivated = true;
g.ActiveIdWindow = window;
}
@@ -1599,7 +1620,7 @@ void ImGui::SetHoveredID(ImGuiID id)
{
ImGuiState& g = *GImGui;
g.HoveredId = id;
- g.HoveredIdAllowHoveringOthers = false;
+ g.HoveredIdAllowOverlap = false;
}
void ImGui::KeepAliveID(ImGuiID id)
@@ -1621,7 +1642,7 @@ void ImGui::ItemSize(const ImVec2& size, float text_offset_y)
const float line_height = ImMax(window->DC.CurrentLineHeight, size.y);
const float text_base_offset = ImMax(window->DC.CurrentLineTextBaseOffset, text_offset_y);
window->DC.CursorPosPrevLine = ImVec2(window->DC.CursorPos.x + size.x, window->DC.CursorPos.y);
- window->DC.CursorPos = ImVec2((float)(int)(window->Pos.x + window->DC.ColumnsStartX + window->DC.ColumnsOffsetX), (float)(int)(window->DC.CursorPos.y + line_height + g.Style.ItemSpacing.y));
+ window->DC.CursorPos = ImVec2((float)(int)(window->Pos.x + window->DC.IndentX + window->DC.ColumnsOffsetX), (float)(int)(window->DC.CursorPos.y + line_height + g.Style.ItemSpacing.y));
window->DC.CursorMaxPos.x = ImMax(window->DC.CursorMaxPos.x, window->DC.CursorPosPrevLine.x);
window->DC.CursorMaxPos.y = ImMax(window->DC.CursorMaxPos.y, window->DC.CursorPos.y);
@@ -1660,7 +1681,7 @@ bool ImGui::ItemAdd(const ImRect& bb, const ImGuiID* id)
window->DC.LastItemHoveredRect = true;
window->DC.LastItemHoveredAndUsable = false;
if (g.HoveredRootWindow == window->RootWindow)
- if (g.ActiveId == 0 || (id && g.ActiveId == *id) || g.ActiveIdAllowHoveringOthers || (g.ActiveId == window->MoveID))
+ if (g.ActiveId == 0 || (id && g.ActiveId == *id) || g.ActiveIdAllowOverlap || (g.ActiveId == window->MoveID))
if (IsWindowContentHoverable(window))
window->DC.LastItemHoveredAndUsable = true;
}
@@ -1689,11 +1710,11 @@ bool ImGui::IsClippedEx(const ImRect& bb, const ImGuiID* id, bool clip_even_when
bool ImGui::IsHovered(const ImRect& bb, ImGuiID id, bool flatten_childs)
{
ImGuiState& g = *GImGui;
- if (g.HoveredId == 0 || g.HoveredId == id || g.HoveredIdAllowHoveringOthers)
+ if (g.HoveredId == 0 || g.HoveredId == id || g.HoveredIdAllowOverlap)
{
ImGuiWindow* window = GetCurrentWindowRead();
if (g.HoveredWindow == window || (flatten_childs && g.HoveredRootWindow == window->RootWindow))
- if ((g.ActiveId == 0 || g.ActiveId == id || g.ActiveIdAllowHoveringOthers) && ImGui::IsMouseHoveringRect(bb.Min, bb.Max))
+ if ((g.ActiveId == 0 || g.ActiveId == id || g.ActiveIdAllowOverlap) && ImGui::IsMouseHoveringRect(bb.Min, bb.Max))
if (IsWindowContentHoverable(g.HoveredRootWindow))
return true;
}
@@ -1841,11 +1862,11 @@ void ImGui::NewFrame()
ImGuiState& g = *GImGui;
// Check user data
- IM_ASSERT(g.IO.DeltaTime >= 0.0f);
+ IM_ASSERT(g.IO.DeltaTime >= 0.0f); // Need a positive DeltaTime (zero is tolerated but will cause some timing issues)
IM_ASSERT(g.IO.DisplaySize.x >= 0.0f && g.IO.DisplaySize.y >= 0.0f);
IM_ASSERT(g.IO.Fonts->Fonts.Size > 0); // Font Atlas not created. Did you call io.Fonts->GetTexDataAsRGBA32 / GetTexDataAsAlpha8 ?
IM_ASSERT(g.IO.Fonts->Fonts[0]->IsLoaded()); // Font Atlas not created. Did you call io.Fonts->GetTexDataAsRGBA32 / GetTexDataAsAlpha8 ?
- IM_ASSERT(g.Style.CurveTessellationTol > 0.0f); // Invalid
+ IM_ASSERT(g.Style.CurveTessellationTol > 0.0f); // Invalid style setting
if (!g.Initialized)
{
@@ -1921,7 +1942,7 @@ void ImGui::NewFrame()
// Clear reference to active widget if the widget isn't alive anymore
g.HoveredIdPreviousFrame = g.HoveredId;
g.HoveredId = 0;
- g.HoveredIdAllowHoveringOthers = false;
+ g.HoveredIdAllowOverlap = false;
if (!g.ActiveIdIsAlive && g.ActiveIdPreviousFrame == g.ActiveId && g.ActiveId != 0)
SetActiveID(0);
g.ActiveIdPreviousFrame = g.ActiveId;
@@ -1975,6 +1996,7 @@ void ImGui::NewFrame()
g.IO.WantTextInput = (g.ActiveId != 0 && g.InputTextState.Id == g.ActiveId);
g.MouseCursor = ImGuiMouseCursor_Arrow;
g.CaptureMouseNextFrame = g.CaptureKeyboardNextFrame = false;
+ g.OsImePosRequest = ImVec2(1.0f, 1.0f); // OS Input Method Editor showing on top-left of our window by default
// If mouse was first clicked outside of ImGui bounds we also cancel out hovering.
if (mouse_owned_by_application)
@@ -2040,6 +2062,12 @@ void ImGui::NewFrame()
void ImGui::Shutdown()
{
ImGuiState& g = *GImGui;
+
+ // The fonts atlas can be used prior to calling NewFrame(), so we clear it even if g.Initialized is FALSE (which would happen if we never called NewFrame)
+ if (g.IO.Fonts) // Testing for NULL to allow user to NULLify in case of running Shutdown() on multiple contexts. Bit hacky.
+ g.IO.Fonts->Clear();
+
+ // Cleanup of other data are conditional on actually having used ImGui.
if (!g.Initialized)
return;
@@ -2088,9 +2116,6 @@ void ImGui::Shutdown()
ImGui::MemFree(g.LogClipboard);
}
- if (g.IO.Fonts) // Testing for NULL to allow user to NULLify in case of running Shutdown() on multiple contexts. Bit hacky.
- g.IO.Fonts->Clear();
-
g.Initialized = false;
}
@@ -2258,7 +2283,8 @@ static void AddDrawListToRenderList(ImVector<ImDrawList*>& out_render_list, ImDr
// Check that draw_list doesn't use more vertices than indexable (default ImDrawIdx = 2 bytes = 64K vertices)
// If this assert triggers because you are drawing lots of stuff manually, A) workaround by calling BeginChild()/EndChild() to put your draw commands in multiple draw lists, B) #define ImDrawIdx to a 'unsigned int' in imconfig.h and render accordingly.
const unsigned long long int max_vtx_idx = (unsigned long long int)1L << (sizeof(ImDrawIdx)*8);
- IM_ASSERT((unsigned long long int)draw_list->_VtxCurrentIdx <= max_vtx_idx);
+ (void)max_vtx_idx;
+ IM_ASSERT((unsigned long long int)draw_list->_VtxCurrentIdx <= max_vtx_idx); // Too many vertices in same ImDrawList
GImGui->IO.MetricsRenderVertices += draw_list->VtxBuffer.Size;
GImGui->IO.MetricsRenderIndices += draw_list->IdxBuffer.Size;
@@ -2279,12 +2305,12 @@ static void AddWindowToRenderList(ImVector<ImDrawList*>& out_render_list, ImGuiW
}
}
-static void PushClipRect(const ImRect& clip_rect, bool clipped)
+void ImGui::PushClipRect(const ImVec2& clip_rect_min, const ImVec2& clip_rect_max, bool intersect_with_existing_clip_rect)
{
- ImGuiWindow* window = ImGui::GetCurrentWindow();
+ ImGuiWindow* window = GetCurrentWindow();
- ImRect cr = clip_rect;
- if (clipped)
+ ImRect cr(clip_rect_min, clip_rect_max);
+ if (intersect_with_existing_clip_rect)
{
// Clip our argument with the current clip rect
cr.Clip(window->ClipRect);
@@ -2297,9 +2323,9 @@ static void PushClipRect(const ImRect& clip_rect, bool clipped)
window->DrawList->PushClipRect(ImVec4(cr.Min.x, cr.Min.y, cr.Max.x, cr.Max.y));
}
-static void PopClipRect()
+void ImGui::PopClipRect()
{
- ImGuiWindow* window = ImGui::GetCurrentWindow();
+ ImGuiWindow* window = GetCurrentWindow();
window->DrawList->PopClipRect();
window->ClipRect = window->DrawList->_ClipRectStack.back();
}
@@ -2319,8 +2345,15 @@ void ImGui::EndFrame()
ImGui::EndTooltip();
}
+ // Notify OS when our Input Method Editor cursor has moved (e.g. CJK inputs using Microsoft IME)
+ if (g.IO.ImeSetInputScreenPosFn && ImLengthSqr(g.OsImePosRequest - g.OsImePosSet) > 0.0001f)
+ {
+ g.IO.ImeSetInputScreenPosFn((int)g.OsImePosRequest.x, (int)g.OsImePosRequest.y);
+ g.OsImePosSet = g.OsImePosRequest;
+ }
+
// Hide implicit "Debug" window if it hasn't been used
- IM_ASSERT(g.CurrentWindowStack.Size == 1); // Mismatched Begin/End
+ IM_ASSERT(g.CurrentWindowStack.Size == 1); // Mismatched Begin()/End() calls
if (g.CurrentWindow && !g.CurrentWindow->Accessed)
g.CurrentWindow->Active = false;
ImGui::End();
@@ -2356,9 +2389,8 @@ void ImGui::EndFrame()
for (int i = 0; i != g.Windows.Size; i++)
{
ImGuiWindow* window = g.Windows[i];
- if (window->Flags & ImGuiWindowFlags_ChildWindow) // if a child is active its parent will add it
- if (window->Active)
- continue;
+ if (window->Active && (window->Flags & ImGuiWindowFlags_ChildWindow)) // if a child is active its parent will add it
+ continue;
AddWindowToSortedBuffer(g.WindowsSortBuffer, window);
}
IM_ASSERT(g.Windows.Size == g.WindowsSortBuffer.Size); // we done something wrong
@@ -2564,10 +2596,7 @@ void ImGui::RenderText(ImVec2 pos, const char* text, const char* text_end, bool
const int text_len = (int)(text_display_end - text);
if (text_len > 0)
{
- // Render
- window->DrawList->AddText(g.Font, g.FontSize, pos, window->Color(ImGuiCol_Text), text, text_display_end);
-
- // Log as text
+ window->DrawList->AddText(g.Font, g.FontSize, pos, GetColorU32(ImGuiCol_Text), text, text_display_end);
if (g.LogEnabled)
LogRenderedText(pos, text, text_display_end);
}
@@ -2584,12 +2613,13 @@ void ImGui::RenderTextWrapped(ImVec2 pos, const char* text, const char* text_end
const int text_len = (int)(text_end - text);
if (text_len > 0)
{
- window->DrawList->AddText(g.Font, g.FontSize, pos, window->Color(ImGuiCol_Text), text, text_end, wrap_width);
+ window->DrawList->AddText(g.Font, g.FontSize, pos, GetColorU32(ImGuiCol_Text), text, text_end, wrap_width);
if (g.LogEnabled)
LogRenderedText(pos, text, text_end);
}
}
+// Handle clipping on CPU immediately (vs typically let the GPU clip the triangles that are overlapping the clipping rectangle edges)
void ImGui::RenderTextClipped(const ImVec2& pos_min, const ImVec2& pos_max, const char* text, const char* text_end, const ImVec2* text_size_if_known, ImGuiAlign align, const ImVec2* clip_min, const ImVec2* clip_max)
{
// Hide anything after a '##' string
@@ -2618,11 +2648,11 @@ void ImGui::RenderTextClipped(const ImVec2& pos_min, const ImVec2& pos_max, cons
if (need_clipping)
{
ImVec4 fine_clip_rect(clip_min->x, clip_min->y, clip_max->x, clip_max->y);
- window->DrawList->AddText(g.Font, g.FontSize, pos, window->Color(ImGuiCol_Text), text, text_display_end, 0.0f, &fine_clip_rect);
+ window->DrawList->AddText(g.Font, g.FontSize, pos, GetColorU32(ImGuiCol_Text), text, text_display_end, 0.0f, &fine_clip_rect);
}
else
{
- window->DrawList->AddText(g.Font, g.FontSize, pos, window->Color(ImGuiCol_Text), text, text_display_end, 0.0f, NULL);
+ window->DrawList->AddText(g.Font, g.FontSize, pos, GetColorU32(ImGuiCol_Text), text, text_display_end, 0.0f, NULL);
}
if (g.LogEnabled)
LogRenderedText(pos, text, text_display_end);
@@ -2636,8 +2666,8 @@ void ImGui::RenderFrame(ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, bool border,
window->DrawList->AddRectFilled(p_min, p_max, fill_col, rounding);
if (border && (window->Flags & ImGuiWindowFlags_ShowBorders))
{
- window->DrawList->AddRect(p_min+ImVec2(1,1), p_max, window->Color(ImGuiCol_BorderShadow), rounding);
- window->DrawList->AddRect(p_min, p_max-ImVec2(1,1), window->Color(ImGuiCol_Border), rounding);
+ window->DrawList->AddRect(p_min+ImVec2(1,1), p_max+ImVec2(1,1), GetColorU32(ImGuiCol_BorderShadow), rounding);
+ window->DrawList->AddRect(p_min, p_max, GetColorU32(ImGuiCol_Border), rounding);
}
}
@@ -2667,8 +2697,8 @@ void ImGui::RenderCollapseTriangle(ImVec2 p_min, bool opened, float scale, bool
}
if (shadow && (window->Flags & ImGuiWindowFlags_ShowBorders) != 0)
- window->DrawList->AddTriangleFilled(a+ImVec2(2,2), b+ImVec2(2,2), c+ImVec2(2,2), window->Color(ImGuiCol_BorderShadow));
- window->DrawList->AddTriangleFilled(a, b, c, window->Color(ImGuiCol_Text));
+ window->DrawList->AddTriangleFilled(a+ImVec2(2,2), b+ImVec2(2,2), c+ImVec2(2,2), GetColorU32(ImGuiCol_BorderShadow));
+ window->DrawList->AddTriangleFilled(a, b, c, GetColorU32(ImGuiCol_Text));
}
void ImGui::RenderCheckMark(ImVec2 pos, ImU32 col)
@@ -2713,6 +2743,7 @@ ImVec2 ImGui::CalcTextSize(const char* text, const char* text_end, bool hide_tex
const float character_spacing_x = 1.0f * font_scale;
if (text_size.x > 0.0f)
text_size.x -= character_spacing_x;
+ text_size.x = (float)(int)(text_size.x + 0.95f);
return text_size;
}
@@ -2999,6 +3030,16 @@ bool ImGui::IsItemVisible()
return r.Overlaps(window->DC.LastItemRect);
}
+// Allow last item to be overlapped by a subsequent item. Both may be activated during the same frame before the later one takes priority.
+void ImGui::SetItemAllowOverlap()
+{
+ ImGuiState& g = *GImGui;
+ if (g.HoveredId == g.CurrentWindow->DC.LastItemID)
+ g.HoveredIdAllowOverlap = true;
+ if (g.ActiveId == g.CurrentWindow->DC.LastItemID)
+ g.ActiveIdAllowOverlap = true;
+}
+
ImVec2 ImGui::GetItemRectMin()
{
ImGuiWindow* window = GetCurrentWindowRead();
@@ -3057,7 +3098,7 @@ void ImGui::BeginTooltip()
void ImGui::EndTooltip()
{
- IM_ASSERT(GetCurrentWindowRead()->Flags & ImGuiWindowFlags_Tooltip);
+ IM_ASSERT(GetCurrentWindowRead()->Flags & ImGuiWindowFlags_Tooltip); // Mismatched BeginTooltip()/EndTooltip() calls
ImGui::End();
}
@@ -3068,8 +3109,11 @@ static bool IsPopupOpen(ImGuiID id)
return opened;
}
+// Mark popup as open (toggle toward open state).
+// Popups are closed when user click outside, or activate a pressable item, or CloseCurrentPopup() is called within a BeginPopup()/EndPopup() block.
+// Popup identifiers are relative to the current ID-stack (so OpenPopup and BeginPopup needs to be at the same level).
// One open popup per level of the popup hierarchy (NB: when assigning we reset the Window member of ImGuiPopupRef to NULL)
-void ImGui::OpenPopup(const char* str_id)
+void ImGui::OpenPopupEx(const char* str_id, bool reopen_existing)
{
ImGuiState& g = *GImGui;
ImGuiWindow* window = g.CurrentWindow;
@@ -3078,13 +3122,18 @@ void ImGui::OpenPopup(const char* str_id)
ImGuiPopupRef popup_ref = ImGuiPopupRef(id, window, window->GetID("##menus"), g.IO.MousePos); // Tagged as new ref because constructor sets Window to NULL (we are passing the ParentWindow info here)
if (g.OpenedPopupStack.Size < current_stack_size + 1)
g.OpenedPopupStack.push_back(popup_ref);
- else if (g.OpenedPopupStack[current_stack_size].PopupID != id)
+ else if (reopen_existing || g.OpenedPopupStack[current_stack_size].PopupID != id)
{
g.OpenedPopupStack.resize(current_stack_size+1);
g.OpenedPopupStack[current_stack_size] = popup_ref;
}
}
+void ImGui::OpenPopup(const char* str_id)
+{
+ ImGui::OpenPopupEx(str_id, false);
+}
+
static void CloseInactivePopups()
{
ImGuiState& g = *GImGui;
@@ -3156,10 +3205,11 @@ void ImGui::CloseCurrentPopup()
ClosePopupToLevel(popup_idx);
}
-static void ClearSetNextWindowData()
+static inline void ClearSetNextWindowData()
{
ImGuiState& g = *GImGui;
- g.SetNextWindowPosCond = g.SetNextWindowSizeCond = g.SetNextWindowContentSizeCond = g.SetNextWindowCollapsedCond = g.SetNextWindowFocus = 0;
+ g.SetNextWindowPosCond = g.SetNextWindowSizeCond = g.SetNextWindowContentSizeCond = g.SetNextWindowCollapsedCond = 0;
+ g.SetNextWindowFocus = false;
}
static bool BeginPopupEx(const char* str_id, ImGuiWindowFlags extra_flags)
@@ -3194,6 +3244,11 @@ static bool BeginPopupEx(const char* str_id, ImGuiWindowFlags extra_flags)
bool ImGui::BeginPopup(const char* str_id)
{
+ if (GImGui->OpenedPopupStack.Size <= GImGui->CurrentPopupStack.Size) // Early out for performance
+ {
+ ClearSetNextWindowData(); // We behave like Begin() and need to consume those values
+ return false;
+ }
return BeginPopupEx(str_id, ImGuiWindowFlags_ShowBorders);
}
@@ -3224,17 +3279,25 @@ bool ImGui::BeginPopupModal(const char* name, bool* p_opened, ImGuiWindowFlags e
void ImGui::EndPopup()
{
ImGuiWindow* window = GetCurrentWindow();
- IM_ASSERT(window->Flags & ImGuiWindowFlags_Popup);
+ IM_ASSERT(window->Flags & ImGuiWindowFlags_Popup); // Mismatched BeginPopup()/EndPopup() calls
IM_ASSERT(GImGui->CurrentPopupStack.Size > 0);
ImGui::End();
if (!(window->Flags & ImGuiWindowFlags_Modal))
ImGui::PopStyleVar();
}
+// This is a helper to handle the most simple case of associating one named popup to one given widget.
+// 1. If you have many possible popups (for different "instances" of a same widget, or for wholly different widgets), you may be better off handling
+// this yourself so you can store data relative to the widget that opened the popup instead of choosing different popup identifiers.
+// 2. If you want right-clicking on the same item to reopen the popup at new location, use the same code replacing IsItemHovered() with IsItemHoveredRect()
+// and passing true to the OpenPopupEx().
+// Because: hovering an item in a window below the popup won't normally trigger is hovering behavior/coloring. The pattern of ignoring the fact that
+// the item isn't interactable (because it is blocked by the active popup) may useful in some situation when e.g. large canvas as one item, content of menu
+// driven by click position.
bool ImGui::BeginPopupContextItem(const char* str_id, int mouse_button)
{
if (ImGui::IsItemHovered() && ImGui::IsMouseClicked(mouse_button))
- ImGui::OpenPopup(str_id);
+ ImGui::OpenPopupEx(str_id, false);
return ImGui::BeginPopup(str_id);
}
@@ -3243,7 +3306,7 @@ bool ImGui::BeginPopupContextWindow(bool also_over_items, const char* str_id, in
if (!str_id) str_id = "window_context_menu";
if (ImGui::IsMouseHoveringWindow() && ImGui::IsMouseClicked(mouse_button))
if (also_over_items || !ImGui::IsAnyItemHovered())
- ImGui::OpenPopup(str_id);
+ ImGui::OpenPopupEx(str_id, true);
return ImGui::BeginPopup(str_id);
}
@@ -3251,7 +3314,7 @@ bool ImGui::BeginPopupContextVoid(const char* str_id, int mouse_button)
{
if (!str_id) str_id = "void_context_menu";
if (!ImGui::IsMouseHoveringAnyWindow() && ImGui::IsMouseClicked(mouse_button))
- ImGui::OpenPopup(str_id);
+ ImGui::OpenPopupEx(str_id, true);
return ImGui::BeginPopup(str_id);
}
@@ -3302,7 +3365,7 @@ void ImGui::EndChild()
{
ImGuiWindow* window = GetCurrentWindow();
- IM_ASSERT(window->Flags & ImGuiWindowFlags_ChildWindow);
+ IM_ASSERT(window->Flags & ImGuiWindowFlags_ChildWindow); // Mismatched BeginChild()/EndChild() callss
if ((window->Flags & ImGuiWindowFlags_ComboBox) || window->BeginCount > 1)
{
ImGui::End();
@@ -3362,9 +3425,10 @@ static ImVec2 FindBestPopupWindowPos(const ImVec2& base_pos, const ImVec2& size,
{
const ImGuiStyle& style = GImGui->Style;
- // Clamp into visible area while not overlapping the cursor
+ // Clamp into visible area while not overlapping the cursor. Safety padding is optional if our popup size won't fit without it.
+ ImVec2 safe_padding = style.DisplaySafeAreaPadding;
ImRect r_outer(GetVisibleRect());
- r_outer.Reduce(style.DisplaySafeAreaPadding);
+ r_outer.Reduce(ImVec2((size.x - r_outer.GetWidth() > safe_padding.x*2) ? safe_padding.x : 0.0f, (size.y - r_outer.GetHeight() > safe_padding.y*2) ? safe_padding.y : 0.0f));
ImVec2 base_pos_clamped = ImClamp(base_pos, r_outer.Min, r_outer.Max - size);
for (int n = (*last_dir != -1) ? -1 : 0; n < 4; n++) // Right, down, up, left. Favor last used direction.
@@ -3459,7 +3523,10 @@ static ImGuiWindow* CreateNewWindow(const char* name, ImVec2 size, ImGuiWindowFl
window->AutoFitOnlyGrows = (window->AutoFitFramesX > 0) || (window->AutoFitFramesY > 0);
}
- g.Windows.push_back(window);
+ if (flags & ImGuiWindowFlags_NoBringToFrontOnFocus)
+ g.Windows.insert(g.Windows.begin(), window); // Quite slow but rare and only once
+ else
+ g.Windows.push_back(window);
return window;
}
@@ -3598,10 +3665,11 @@ bool ImGui::Begin(const char* name, bool* p_opened, const ImVec2& size_on_first_
// Setup texture, outer clipping rectangle
window->DrawList->PushTextureID(g.Font->ContainerAtlas->TexID);
+ ImRect fullscreen_rect(GetVisibleRect());
if ((flags & ImGuiWindowFlags_ChildWindow) && !(flags & (ImGuiWindowFlags_ComboBox|ImGuiWindowFlags_Popup)))
- PushClipRect(parent_window->ClipRect);
+ PushClipRect(parent_window->ClipRect.Min, parent_window->ClipRect.Max, true);
else
- PushClipRect(GetVisibleRect());
+ PushClipRect(fullscreen_rect.Min, fullscreen_rect.Max, true);
// New windows appears in front
if (!window_was_active)
@@ -3638,8 +3706,8 @@ bool ImGui::Begin(const char* name, bool* p_opened, const ImVec2& size_on_first_
// SIZE
// Save contents size from last frame for auto-fitting (unless explicitly specified)
- window->SizeContents.x = (window->SizeContentsExplicit.x != 0.0f) ? window->SizeContentsExplicit.x : ((window_is_new ? 0.0f : window->DC.CursorMaxPos.x - window->Pos.x) + window->Scroll.x);
- window->SizeContents.y = (window->SizeContentsExplicit.y != 0.0f) ? window->SizeContentsExplicit.y : ((window_is_new ? 0.0f : window->DC.CursorMaxPos.y - window->Pos.y) + window->Scroll.y);
+ window->SizeContents.x = (float)(int)((window->SizeContentsExplicit.x != 0.0f) ? window->SizeContentsExplicit.x : ((window_is_new ? 0.0f : window->DC.CursorMaxPos.x - window->Pos.x) + window->Scroll.x));
+ window->SizeContents.y = (float)(int)((window->SizeContentsExplicit.y != 0.0f) ? window->SizeContentsExplicit.y : ((window_is_new ? 0.0f : window->DC.CursorMaxPos.y - window->Pos.y) + window->Scroll.y));
// Hide popup/tooltip window when first appearing while we measure size (because we recycle them)
if (window->HiddenFrames > 0)
@@ -3667,7 +3735,7 @@ bool ImGui::Begin(const char* name, bool* p_opened, const ImVec2& size_on_first_
}
else
{
- size_auto_fit = ImClamp(window->SizeContents + window->WindowPadding, style.WindowMinSize, ImMax(style.WindowMinSize, g.IO.DisplaySize - window->WindowPadding));
+ size_auto_fit = ImClamp(window->SizeContents + window->WindowPadding, style.WindowMinSize, ImMax(style.WindowMinSize, g.IO.DisplaySize - g.Style.DisplaySafeAreaPadding));
// Handling case of auto fit window not fitting in screen on one axis, we are growing auto fit size on the other axis to compensate for expected scrollbar. FIXME: Might turn bigger than DisplaySize-WindowPadding.
if (size_auto_fit.x < window->SizeContents.x && !(flags & ImGuiWindowFlags_NoScrollbar) && (flags & ImGuiWindowFlags_HorizontalScrollbar))
@@ -3732,7 +3800,6 @@ bool ImGui::Begin(const char* name, bool* p_opened, const ImVec2& size_on_first_
if (window_pos_center)
{
// Center (any sort of window)
- ImRect fullscreen_rect(GetVisibleRect());
SetWindowPos(ImMax(style.DisplaySafeAreaPadding, fullscreen_rect.GetCenter() - window->SizeFull * 0.5f));
}
else if (flags & ImGuiWindowFlags_ChildMenu)
@@ -3822,10 +3889,7 @@ bool ImGui::Begin(const char* name, bool* p_opened, const ImVec2& size_on_first_
// Modal window darkens what is behind them
if ((flags & ImGuiWindowFlags_Modal) != 0 && window == GetFrontMostModalRootWindow())
- {
- ImRect fullscreen_rect = GetVisibleRect();
- window->DrawList->AddRectFilled(fullscreen_rect.Min, fullscreen_rect.Max, window->Color(ImGuiCol_ModalWindowDarkening, g.ModalWindowDarkeningRatio));
- }
+ window->DrawList->AddRectFilled(fullscreen_rect.Min, fullscreen_rect.Max, GetColorU32(ImGuiCol_ModalWindowDarkening, g.ModalWindowDarkeningRatio));
// Draw window + handle manual resize
ImRect title_bar_rect = window->TitleBarRect();
@@ -3833,12 +3897,7 @@ bool ImGui::Begin(const char* name, bool* p_opened, const ImVec2& size_on_first_
if (window->Collapsed)
{
// Draw title bar only
- window->DrawList->AddRectFilled(title_bar_rect.GetTL(), title_bar_rect.GetBR(), window->Color(ImGuiCol_TitleBgCollapsed), window_rounding);
- if (flags & ImGuiWindowFlags_ShowBorders)
- {
- window->DrawList->AddRect(title_bar_rect.GetTL()+ImVec2(1,1), title_bar_rect.GetBR()+ImVec2(1,1), window->Color(ImGuiCol_BorderShadow), window_rounding);
- window->DrawList->AddRect(title_bar_rect.GetTL(), title_bar_rect.GetBR(), window->Color(ImGuiCol_Border), window_rounding);
- }
+ RenderFrame(title_bar_rect.GetTL(), title_bar_rect.GetBR(), GetColorU32(ImGuiCol_TitleBgCollapsed), true, window_rounding);
}
else
{
@@ -3852,7 +3911,7 @@ bool ImGui::Begin(const char* name, bool* p_opened, const ImVec2& size_on_first_
const ImGuiID resize_id = window->GetID("#RESIZE");
bool hovered, held;
ButtonBehavior(resize_rect, resize_id, &hovered, &held, ImGuiButtonFlags_FlattenChilds);
- resize_col = window->Color(held ? ImGuiCol_ResizeGripActive : hovered ? ImGuiCol_ResizeGripHovered : ImGuiCol_ResizeGrip);
+ resize_col = GetColorU32(held ? ImGuiCol_ResizeGripActive : hovered ? ImGuiCol_ResizeGripHovered : ImGuiCol_ResizeGrip);
if (hovered || held)
g.MouseCursor = ImGuiMouseCursor_ResizeNWSE;
@@ -3884,36 +3943,29 @@ bool ImGui::Begin(const char* name, bool* p_opened, const ImVec2& size_on_first_
// Window background
if (bg_alpha > 0.0f)
{
+ ImGuiCol col_idx;
if ((flags & ImGuiWindowFlags_ComboBox) != 0)
- window->DrawList->AddRectFilled(window->Pos, window->Pos+window->Size, window->Color(ImGuiCol_ComboBg, bg_alpha), window_rounding);
+ col_idx = ImGuiCol_ComboBg;
else if ((flags & ImGuiWindowFlags_Tooltip) != 0)
- window->DrawList->AddRectFilled(window->Pos, window->Pos+window->Size, window->Color(ImGuiCol_TooltipBg, bg_alpha), window_rounding);
+ col_idx = ImGuiCol_TooltipBg;
else if ((flags & ImGuiWindowFlags_Popup) != 0)
- window->DrawList->AddRectFilled(window->Pos, window->Pos+window->Size, window->Color(ImGuiCol_WindowBg, bg_alpha), window_rounding);
+ col_idx = ImGuiCol_WindowBg;
else if ((flags & ImGuiWindowFlags_ChildWindow) != 0)
- window->DrawList->AddRectFilled(window->Pos, window->Pos+window->Size, window->Color(ImGuiCol_ChildWindowBg, bg_alpha), window_rounding);
+ col_idx = ImGuiCol_ChildWindowBg;
else
- window->DrawList->AddRectFilled(window->Pos, window->Pos+window->Size, window->Color(ImGuiCol_WindowBg, bg_alpha), window_rounding);
+ col_idx = ImGuiCol_WindowBg;
+ window->DrawList->AddRectFilled(window->Pos, window->Pos+window->Size, GetColorU32(col_idx, bg_alpha), window_rounding);
}
// Title bar
if (!(flags & ImGuiWindowFlags_NoTitleBar))
- window->DrawList->AddRectFilled(title_bar_rect.GetTL(), title_bar_rect.GetBR(), window->Color((g.FocusedWindow && window->RootNonPopupWindow == g.FocusedWindow->RootNonPopupWindow) ? ImGuiCol_TitleBgActive : ImGuiCol_TitleBg), window_rounding, 1|2);
+ window->DrawList->AddRectFilled(title_bar_rect.GetTL(), title_bar_rect.GetBR(), GetColorU32((g.FocusedWindow && window->RootNonPopupWindow == g.FocusedWindow->RootNonPopupWindow) ? ImGuiCol_TitleBgActive : ImGuiCol_TitleBg), window_rounding, 1|2);
// Menu bar
if (flags & ImGuiWindowFlags_MenuBar)
{
ImRect menu_bar_rect = window->MenuBarRect();
- window->DrawList->AddRectFilled(menu_bar_rect.GetTL(), menu_bar_rect.GetBR(), window->Color(ImGuiCol_MenuBarBg), (flags & ImGuiWindowFlags_NoTitleBar) ? window_rounding : 0.0f, 1|2);
- }
-
- // Borders
- if (flags & ImGuiWindowFlags_ShowBorders)
- {
- window->DrawList->AddRect(window->Pos+ImVec2(1,1), window->Pos+window->Size+ImVec2(1,1), window->Color(ImGuiCol_BorderShadow), window_rounding);
- window->DrawList->AddRect(window->Pos, window->Pos+window->Size, window->Color(ImGuiCol_Border), window_rounding);
- if (!(flags & ImGuiWindowFlags_NoTitleBar))
- window->DrawList->AddLine(title_bar_rect.GetBL(), title_bar_rect.GetBR(), window->Color(ImGuiCol_Border));
+ window->DrawList->AddRectFilled(menu_bar_rect.GetTL(), menu_bar_rect.GetBR(), GetColorU32(ImGuiCol_MenuBarBg), (flags & ImGuiWindowFlags_NoTitleBar) ? window_rounding : 0.0f, 1|2);
}
// Scrollbars
@@ -3926,18 +3978,28 @@ bool ImGui::Begin(const char* name, bool* p_opened, const ImVec2& size_on_first_
// (after the input handling so we don't have a frame of latency)
if (!(flags & ImGuiWindowFlags_NoResize))
{
+ const float border_size = (window->Flags & ImGuiWindowFlags_ShowBorders) ? 1.0f : 0.0f;
const ImVec2 br = window->Rect().GetBR();
- window->DrawList->PathLineTo(br + ImVec2(-resize_corner_size, 0.0f));
- window->DrawList->PathLineTo(br + ImVec2(0.0f, -resize_corner_size));
- window->DrawList->PathArcToFast(ImVec2(br.x - window_rounding, br.y - window_rounding), window_rounding, 0, 3);
+ window->DrawList->PathLineTo(br + ImVec2(-resize_corner_size, -border_size));
+ window->DrawList->PathLineTo(br + ImVec2(-border_size, -resize_corner_size));
+ window->DrawList->PathArcToFast(ImVec2(br.x - window_rounding - border_size, br.y - window_rounding - border_size), window_rounding, 0, 3);
window->DrawList->PathFill(resize_col);
}
+
+ // Borders
+ if (flags & ImGuiWindowFlags_ShowBorders)
+ {
+ window->DrawList->AddRect(window->Pos+ImVec2(1,1), window->Pos+window->Size+ImVec2(1,1), GetColorU32(ImGuiCol_BorderShadow), window_rounding);
+ window->DrawList->AddRect(window->Pos, window->Pos+window->Size, GetColorU32(ImGuiCol_Border), window_rounding);
+ if (!(flags & ImGuiWindowFlags_NoTitleBar))
+ window->DrawList->AddLine(title_bar_rect.GetBL()+ImVec2(1,0), title_bar_rect.GetBR()-ImVec2(1,0), GetColorU32(ImGuiCol_Border));
+ }
}
// Setup drawing context
- window->DC.ColumnsStartX = 0.0f + window->WindowPadding.x - window->Scroll.x;
+ window->DC.IndentX = 0.0f + window->WindowPadding.x - window->Scroll.x;
window->DC.ColumnsOffsetX = 0.0f;
- window->DC.CursorStartPos = window->Pos + ImVec2(window->DC.ColumnsStartX + window->DC.ColumnsOffsetX, window->TitleBarHeight() + window->MenuBarHeight() + window->WindowPadding.y - window->Scroll.y);
+ window->DC.CursorStartPos = window->Pos + ImVec2(window->DC.IndentX + window->DC.ColumnsOffsetX, window->TitleBarHeight() + window->MenuBarHeight() + window->WindowPadding.y - window->Scroll.y);
window->DC.CursorPos = window->DC.CursorStartPos;
window->DC.CursorPosPrevLine = window->DC.CursorPos;
window->DC.CursorMaxPos = window->DC.CursorStartPos;
@@ -3959,8 +4021,8 @@ bool ImGui::Begin(const char* name, bool* p_opened, const ImVec2& size_on_first_
window->DC.ColorEditMode = ImGuiColorEditMode_UserSelect;
window->DC.ColumnsCurrent = 0;
window->DC.ColumnsCount = 1;
- window->DC.ColumnsStartPos = window->DC.CursorPos;
- window->DC.ColumnsCellMinY = window->DC.ColumnsCellMaxY = window->DC.ColumnsStartPos.y;
+ window->DC.ColumnsStartPosY = window->DC.CursorPos.y;
+ window->DC.ColumnsCellMinY = window->DC.ColumnsCellMaxY = window->DC.ColumnsStartPosY;
window->DC.TreeDepth = 0;
window->DC.StateStorage = &window->StateStorage;
window->DC.GroupStack.resize(0);
@@ -4010,12 +4072,14 @@ bool ImGui::Begin(const char* name, bool* p_opened, const ImVec2& size_on_first_
// We set this up after processing the resize grip so that our clip rectangle doesn't lag by a frame
// Note that if our window is collapsed we will end up with a null clipping rectangle which is the correct behavior.
const ImRect title_bar_rect = window->TitleBarRect();
- ImRect clip_rect(title_bar_rect.Min.x+0.5f+window->WindowPadding.x*0.5f, title_bar_rect.Max.y+window->MenuBarHeight()+0.5f, window->Pos.x+window->Size.x-window->WindowPadding.x*0.5f, window->Pos.y+window->Size.y);
- if ((flags & ImGuiWindowFlags_ChildWindow) && (flags & ImGuiWindowFlags_ShowBorders))
- clip_rect.Min += ImVec2(1.0f,1.0f);
- clip_rect.Max.x -= window->ScrollbarY ? style.ScrollbarSize : 0.0f;
- clip_rect.Max.y -= window->ScrollbarX ? style.ScrollbarSize : 0.0f;
- PushClipRect(clip_rect);
+ const float border_size = (flags & ImGuiWindowFlags_ShowBorders) ? 1.0f : 0.0f;
+ ImRect clip_rect;
+ clip_rect.Min.x = title_bar_rect.Min.x + 0.5f + ImMax(border_size, window->WindowPadding.x*0.5f);
+ clip_rect.Min.y = title_bar_rect.Max.y + window->MenuBarHeight() + 0.5f + border_size;
+ clip_rect.Max.x = window->Pos.x + window->Size.x - window->ScrollbarSizes.x - ImMax(border_size, window->WindowPadding.x*0.5f);
+ clip_rect.Max.y = window->Pos.y + window->Size.y - border_size - window->ScrollbarSizes.y;
+
+ PushClipRect(clip_rect.Min, clip_rect.Max, true);
// Clear 'accessed' flag last thing
if (first_begin_of_the_frame)
@@ -4081,12 +4145,12 @@ static void Scrollbar(ImGuiWindow* window, bool horizontal)
bool other_scrollbar = (horizontal ? window->ScrollbarY : window->ScrollbarX);
float other_scrollbar_size_w = other_scrollbar ? style.ScrollbarSize : 0.0f;
const ImRect window_rect = window->Rect();
- const float border_offset = (window->Flags & ImGuiWindowFlags_ShowBorders) ? 1.0f : 0.0f;
+ const float border_size = (window->Flags & ImGuiWindowFlags_ShowBorders) ? 1.0f : 0.0f;
ImRect bb = horizontal
- ? ImRect(window->Pos.x + border_offset, window_rect.Max.y - style.ScrollbarSize, window_rect.Max.x - other_scrollbar_size_w, window_rect.Max.y)
- : ImRect(window_rect.Max.x - style.ScrollbarSize, window->Pos.y + border_offset, window_rect.Max.x, window_rect.Max.y - other_scrollbar_size_w);
+ ? ImRect(window->Pos.x + border_size, window_rect.Max.y - style.ScrollbarSize, window_rect.Max.x - other_scrollbar_size_w - border_size, window_rect.Max.y - border_size)
+ : ImRect(window_rect.Max.x - style.ScrollbarSize, window->Pos.y + border_size, window_rect.Max.x - border_size, window_rect.Max.y - other_scrollbar_size_w - border_size);
if (!horizontal)
- bb.Min.y += window->TitleBarHeight() + ((window->Flags & ImGuiWindowFlags_MenuBar) ? window->MenuBarHeight() - border_offset : 0.0f);
+ bb.Min.y += window->TitleBarHeight() + ((window->Flags & ImGuiWindowFlags_MenuBar) ? window->MenuBarHeight() - border_size : 0.0f);
float window_rounding = (window->Flags & ImGuiWindowFlags_ChildWindow) ? style.ChildWindowRounding : style.WindowRounding;
int window_rounding_corners;
@@ -4094,7 +4158,7 @@ static void Scrollbar(ImGuiWindow* window, bool horizontal)
window_rounding_corners = 8 | (other_scrollbar ? 0 : 4);
else
window_rounding_corners = ((window->Flags & ImGuiWindowFlags_NoTitleBar) ? 2 : 0) | (other_scrollbar ? 0 : 4);
- window->DrawList->AddRectFilled(bb.Min, bb.Max, window->Color(ImGuiCol_ScrollbarBg), window_rounding, window_rounding_corners);
+ window->DrawList->AddRectFilled(bb.Min, bb.Max, ImGui::GetColorU32(ImGuiCol_ScrollbarBg), window_rounding, window_rounding_corners);
bb.Reduce(ImVec2(ImClamp((float)(int)((bb.Max.x - bb.Min.x - 2.0f) * 0.5f), 0.0f, 3.0f), ImClamp((float)(int)((bb.Max.y - bb.Min.y - 2.0f) * 0.5f), 0.0f, 3.0f)));
// V denote the main axis of the scrollbar
@@ -4161,7 +4225,7 @@ static void Scrollbar(ImGuiWindow* window, bool horizontal)
}
// Render
- const ImU32 grab_col = window->Color(held ? ImGuiCol_ScrollbarGrabActive : hovered ? ImGuiCol_ScrollbarGrabHovered : ImGuiCol_ScrollbarGrab);
+ const ImU32 grab_col = ImGui::GetColorU32(held ? ImGuiCol_ScrollbarGrabActive : hovered ? ImGuiCol_ScrollbarGrabHovered : ImGuiCol_ScrollbarGrab);
if (horizontal)
window->DrawList->AddRectFilled(ImVec2(ImLerp(bb.Min.x, bb.Max.x, grab_v_norm), bb.Min.y), ImVec2(ImLerp(bb.Min.x, bb.Max.x, grab_v_norm) + grab_h_pixels, bb.Max.y), grab_col, style.ScrollbarRounding);
else
@@ -4247,7 +4311,7 @@ float ImGui::CalcItemWidth()
static void SetCurrentFont(ImFont* font)
{
ImGuiState& g = *GImGui;
- IM_ASSERT(font && font->IsLoaded());
+ IM_ASSERT(font && font->IsLoaded()); // Font Atlas not created. Did you call io.Fonts->GetTexDataAsRGBA32 / GetTexDataAsAlpha8 ?
IM_ASSERT(font->Scale > 0.0f);
g.Font = font;
g.FontBaseSize = g.IO.FontGlobalScale * g.Font->FontSize * g.Font->Scale;
@@ -4348,6 +4412,7 @@ static float* GetStyleVarFloatAddr(ImGuiStyleVar idx)
case ImGuiStyleVar_FrameRounding: return &g.Style.FrameRounding;
case ImGuiStyleVar_IndentSpacing: return &g.Style.IndentSpacing;
case ImGuiStyleVar_GrabMinSize: return &g.Style.GrabMinSize;
+ case ImGuiStyleVar_ViewId: return &g.Style.ViewId;
}
return NULL;
}
@@ -4684,6 +4749,7 @@ void ImGui::SetNextWindowFocus()
}
// In window space (not screen space!)
+// FIXME-OPT: Could cache and maintain it (pretty much only change on columns change)
ImVec2 ImGui::GetContentRegionMax()
{
ImGuiWindow* window = GetCurrentWindowRead();
@@ -5222,7 +5288,7 @@ bool ImGui::ButtonEx(const char* label, const ImVec2& size_arg, ImGuiButtonFlags
bool pressed = ButtonBehavior(bb, id, &hovered, &held, flags);
// Render
- const ImU32 col = window->Color((hovered && held) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button);
+ const ImU32 col = GetColorU32((hovered && held) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button);
RenderFrame(bb.Min, bb.Max, col, true, style.FrameRounding);
RenderTextClipped(bb.Min, bb.Max, label, NULL, &label_size, ImGuiAlign_Center | ImGuiAlign_VCenter);
@@ -5283,15 +5349,15 @@ static bool CloseWindowButton(bool* p_opened)
bool pressed = ImGui::ButtonBehavior(bb, id, &hovered, &held);
// Render
- const ImU32 col = window->Color((held && hovered) ? ImGuiCol_CloseButtonActive : hovered ? ImGuiCol_CloseButtonHovered : ImGuiCol_CloseButton);
+ const ImU32 col = ImGui::GetColorU32((held && hovered) ? ImGuiCol_CloseButtonActive : hovered ? ImGuiCol_CloseButtonHovered : ImGuiCol_CloseButton);
const ImVec2 center = bb.GetCenter();
window->DrawList->AddCircleFilled(center, ImMax(2.0f,size*0.5f), col, 16);
const float cross_extent = (size * 0.5f * 0.7071f) - 1.0f;
if (hovered)
{
- window->DrawList->AddLine(center + ImVec2(+cross_extent,+cross_extent), center + ImVec2(-cross_extent,-cross_extent), window->Color(ImGuiCol_Text));
- window->DrawList->AddLine(center + ImVec2(+cross_extent,-cross_extent), center + ImVec2(-cross_extent,+cross_extent), window->Color(ImGuiCol_Text));
+ window->DrawList->AddLine(center + ImVec2(+cross_extent,+cross_extent), center + ImVec2(-cross_extent,-cross_extent), ImGui::GetColorU32(ImGuiCol_Text));
+ window->DrawList->AddLine(center + ImVec2(+cross_extent,-cross_extent), center + ImVec2(-cross_extent,+cross_extent), ImGui::GetColorU32(ImGuiCol_Text));
}
if (p_opened != NULL && pressed)
@@ -5315,12 +5381,12 @@ void ImGui::Image(ImTextureID user_texture_id, const ImVec2& size, const ImVec2&
if (border_col.w > 0.0f)
{
- window->DrawList->AddRect(bb.Min, bb.Max, window->Color(border_col), 0.0f);
- window->DrawList->AddImage(user_texture_id, bb.Min+ImVec2(1,1), bb.Max-ImVec2(1,1), uv0, uv1, window->Color(tint_col));
+ window->DrawList->AddRect(bb.Min, bb.Max, GetColorU32(border_col), 0.0f);
+ window->DrawList->AddImage(user_texture_id, bb.Min+ImVec2(1,1), bb.Max-ImVec2(1,1), uv0, uv1, GetColorU32(tint_col));
}
else
{
- window->DrawList->AddImage(user_texture_id, bb.Min, bb.Max, uv0, uv1, window->Color(tint_col));
+ window->DrawList->AddImage(user_texture_id, bb.Min, bb.Max, uv0, uv1, GetColorU32(tint_col));
}
}
@@ -5354,11 +5420,11 @@ bool ImGui::ImageButton(ImTextureID user_texture_id, const ImVec2& size, const I
bool pressed = ButtonBehavior(bb, id, &hovered, &held);
// Render
- const ImU32 col = window->Color((hovered && held) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button);
- RenderFrame(bb.Min, bb.Max, col);
+ const ImU32 col = GetColorU32((hovered && held) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button);
+ RenderFrame(bb.Min, bb.Max, col, true, ImClamp((float)ImMin(padding.x, padding.y), 0.0f, style.FrameRounding));
if (bg_col.w > 0.0f)
- window->DrawList->AddRectFilled(image_bb.Min, image_bb.Max, window->Color(bg_col));
- window->DrawList->AddImage(user_texture_id, image_bb.Min, image_bb.Max, uv0, uv1, window->Color(tint_col));
+ window->DrawList->AddRectFilled(image_bb.Min, image_bb.Max, GetColorU32(bg_col));
+ window->DrawList->AddImage(user_texture_id, image_bb.Min, image_bb.Max, uv0, uv1, GetColorU32(tint_col));
return pressed;
}
@@ -5517,6 +5583,7 @@ bool ImGui::TreeNodeBehaviorIsOpened(ImGuiID id, ImGuiTreeNodeFlags flags)
return opened;
}
+// FIXME: Split into CollapsingHeader(label, default_open?) and TreeNodeBehavior(label), obsolete the 4 parameters function.
bool ImGui::CollapsingHeader(const char* label, const char* str_id, bool display_frame, bool default_open)
{
ImGuiWindow* window = GetCurrentWindow();
@@ -5525,6 +5592,7 @@ bool ImGui::CollapsingHeader(const char* label, const char* str_id, bool display
ImGuiState& g = *GImGui;
const ImGuiStyle& style = g.Style;
+ const ImVec2 padding = display_frame ? style.FramePadding : ImVec2(style.FramePadding.x, 0.0f);
IM_ASSERT(str_id != NULL || label != NULL);
if (str_id == NULL)
@@ -5532,27 +5600,27 @@ bool ImGui::CollapsingHeader(const char* label, const char* str_id, bool display
if (label == NULL)
label = str_id;
const ImGuiID id = window->GetID(str_id);
-
- // Framed header expand a little outside the default padding
- const ImVec2 window_padding = window->WindowPadding;
const ImVec2 label_size = CalcTextSize(label, NULL, true);
- const ImVec2 pos_min = window->DC.CursorPos;
- const ImVec2 pos_max = window->Pos + GetContentRegionMax();
- ImRect bb = ImRect(pos_min, ImVec2(pos_max.x, pos_min.y + label_size.y));
+
+ // We vertically grow up to current line height up the typical widget height.
+ const float text_base_offset_y = ImMax(0.0f, window->DC.CurrentLineTextBaseOffset - padding.y); // Latch before ItemSize changes it
+ const float frame_height = ImMax(ImMin(window->DC.CurrentLineHeight, g.FontSize + g.Style.FramePadding.y*2), label_size.y + padding.y*2);
+ ImRect bb = ImRect(window->DC.CursorPos, ImVec2(window->Pos.x + GetContentRegionMax().x, window->DC.CursorPos.y + frame_height));
if (display_frame)
{
- bb.Min.x -= (float)(int)(window_padding.x*0.5f) - 1;
- bb.Max.x += (float)(int)(window_padding.x*0.5f) - 1;
- bb.Max.y += style.FramePadding.y * 2;
+ // Framed header expand a little outside the default padding
+ bb.Min.x -= (float)(int)(window->WindowPadding.x*0.5f) - 1;
+ bb.Max.x += (float)(int)(window->WindowPadding.x*0.5f) - 1;
}
- const float collapser_width = g.FontSize + style.FramePadding.x*2;
- const ImRect text_bb(bb.Min, bb.Min + ImVec2(collapser_width + style.FramePadding.x*2*0 + (label_size.x > 0.0f ? label_size.x : 0.0f), label_size.y));
- ItemSize(ImVec2(text_bb.GetSize().x, bb.GetSize().y), display_frame ? style.FramePadding.y : 0.0f);
+ const float collapser_width = g.FontSize + (display_frame ? padding.x*2 : padding.x);
+ const float text_width = g.FontSize + (label_size.x > 0.0f ? label_size.x + padding.x*2 : 0.0f); // Include collapser
+ ItemSize(ImVec2(text_width, frame_height), text_base_offset_y);
- const ImRect interact_bb = display_frame ? bb : ImRect(text_bb.Min, text_bb.Max + ImVec2(style.FramePadding.x*2,0.0f)); // FIXME
+ // For regular tree nodes, we arbitrary allow to click past 2 worth of ItemSpacing
+ // (Ideally we'd want to add a flag for the user to specify we want want the hit test to be done up to the right side of the content or not)
+ const ImRect interact_bb = display_frame ? bb : ImRect(bb.Min.x, bb.Min.y, bb.Min.x + text_width + style.ItemSpacing.x*2, bb.Max.y);
bool opened = TreeNodeBehaviorIsOpened(id, (default_open ? ImGuiTreeNodeFlags_DefaultOpen : 0) | (display_frame ? ImGuiTreeNodeFlags_NoAutoExpandOnLog : 0));
-
if (!ItemAdd(interact_bb, &id))
return opened;
@@ -5565,34 +5633,37 @@ bool ImGui::CollapsingHeader(const char* label, const char* str_id, bool display
}
// Render
- const ImU32 col = window->Color((held && hovered) ? ImGuiCol_HeaderActive : hovered ? ImGuiCol_HeaderHovered : ImGuiCol_Header);
+ const ImU32 col = GetColorU32((held && hovered) ? ImGuiCol_HeaderActive : hovered ? ImGuiCol_HeaderHovered : ImGuiCol_Header);
+ const ImVec2 text_pos = bb.Min + padding + ImVec2(collapser_width, text_base_offset_y);
if (display_frame)
{
// Framed type
RenderFrame(bb.Min, bb.Max, col, true, style.FrameRounding);
- RenderCollapseTriangle(bb.Min + style.FramePadding, opened, 1.0f, true);
+ RenderCollapseTriangle(bb.Min + padding + ImVec2(0.0f, text_base_offset_y), opened, 1.0f, true);
if (g.LogEnabled)
{
// NB: '##' is normally used to hide text (as a library-wide feature), so we need to specify the text range to make sure the ## aren't stripped out here.
const char log_prefix[] = "\n##";
- LogRenderedText(bb.Min + style.FramePadding, log_prefix, log_prefix+3);
+ const char log_suffix[] = "##";
+ LogRenderedText(text_pos, log_prefix, log_prefix+3);
+ RenderTextClipped(text_pos, bb.Max, label, NULL, &label_size);
+ LogRenderedText(text_pos, log_suffix+1, log_suffix+3);
}
- RenderTextClipped(bb.Min + style.FramePadding + ImVec2(collapser_width,0), bb.Max, label, NULL, &label_size);
- if (g.LogEnabled)
+ else
{
- const char log_suffix[] = "##";
- LogRenderedText(bb.Min + style.FramePadding, log_suffix, log_suffix+2);
+ RenderTextClipped(text_pos, bb.Max, label, NULL, &label_size);
}
}
else
{
// Unframed typed for tree nodes
- if ((held && hovered) || hovered)
+ if (hovered)
RenderFrame(bb.Min, bb.Max, col, false);
- RenderCollapseTriangle(bb.Min + ImVec2(style.FramePadding.x, g.FontSize*0.15f), opened, 0.70f, false);
+
+ RenderCollapseTriangle(bb.Min + ImVec2(padding.x, g.FontSize*0.15f + text_base_offset_y), opened, 0.70f, false);
if (g.LogEnabled)
- LogRenderedText(bb.Min, ">");
- RenderText(bb.Min + ImVec2(collapser_width,0), label);
+ LogRenderedText(text_pos, ">");
+ RenderText(text_pos, label);
}
return opened;
@@ -5606,21 +5677,21 @@ void ImGui::Bullet()
ImGuiState& g = *GImGui;
const ImGuiStyle& style = g.Style;
- const float line_height = g.FontSize;
- const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(line_height, line_height));
+ const float line_height = ImMax(ImMin(window->DC.CurrentLineHeight, g.FontSize + g.Style.FramePadding.y*2), g.FontSize);
+ const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(g.FontSize, line_height));
ItemSize(bb);
if (!ItemAdd(bb, NULL))
{
- ImGui::SameLine(0, -1);
+ ImGui::SameLine(0, style.FramePadding.x*2);
return;
}
// Render
- const float bullet_size = line_height*0.15f;
- window->DrawList->AddCircleFilled(bb.Min + ImVec2(style.FramePadding.x + line_height*0.5f, line_height*0.5f), bullet_size, window->Color(ImGuiCol_Text));
+ const float bullet_size = g.FontSize*0.15f;
+ window->DrawList->AddCircleFilled(bb.Min + ImVec2(style.FramePadding.x + g.FontSize*0.5f, line_height*0.5f), bullet_size, GetColorU32(ImGuiCol_Text));
// Stay on same line
- ImGui::SameLine(0, -1);
+ ImGui::SameLine(0, style.FramePadding.x*2);
}
// Text with a little bullet aligned to the typical tree node.
@@ -5635,17 +5706,18 @@ void ImGui::BulletTextV(const char* fmt, va_list args)
const char* text_begin = g.TempBuffer;
const char* text_end = text_begin + ImFormatStringV(g.TempBuffer, IM_ARRAYSIZE(g.TempBuffer), fmt, args);
- const float line_height = g.FontSize;
const ImVec2 label_size = CalcTextSize(text_begin, text_end, true);
- const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(line_height + (label_size.x > 0.0f ? (style.FramePadding.x*2) : 0.0f),0) + label_size); // Empty text doesn't add padding
+ const float text_base_offset_y = ImMax(0.0f, window->DC.CurrentLineTextBaseOffset); // Latch before ItemSize changes it
+ const float line_height = ImMax(ImMin(window->DC.CurrentLineHeight, g.FontSize + g.Style.FramePadding.y*2), g.FontSize);
+ const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(g.FontSize + (label_size.x > 0.0f ? (label_size.x + style.FramePadding.x*2) : 0.0f), ImMax(line_height, label_size.y))); // Empty text doesn't add padding
ItemSize(bb);
if (!ItemAdd(bb, NULL))
return;
// Render
- const float bullet_size = line_height*0.15f;
- window->DrawList->AddCircleFilled(bb.Min + ImVec2(style.FramePadding.x + line_height*0.5f, line_height*0.5f), bullet_size, window->Color(ImGuiCol_Text));
- RenderText(bb.Min+ImVec2(g.FontSize + style.FramePadding.x*2,0), text_begin, text_end);
+ const float bullet_size = g.FontSize*0.15f;
+ window->DrawList->AddCircleFilled(bb.Min + ImVec2(style.FramePadding.x + g.FontSize*0.5f, line_height*0.5f), bullet_size, GetColorU32(ImGuiCol_Text));
+ RenderText(bb.Min+ImVec2(g.FontSize + style.FramePadding.x*2, text_base_offset_y), text_begin, text_end);
}
void ImGui::BulletText(const char* fmt, ...)
@@ -5954,7 +6026,7 @@ bool ImGui::SliderBehavior(const ImRect& frame_bb, ImGuiID id, float* v, float v
const ImGuiStyle& style = g.Style;
// Draw frame
- RenderFrame(frame_bb.Min, frame_bb.Max, window->Color(ImGuiCol_FrameBg), true, style.FrameRounding);
+ RenderFrame(frame_bb.Min, frame_bb.Max, GetColorU32(ImGuiCol_FrameBg), true, style.FrameRounding);
const bool is_non_linear = fabsf(power - 1.0f) > 0.0001f;
const bool is_horizontal = (flags & ImGuiSliderFlags_Vertical) == 0;
@@ -6070,7 +6142,7 @@ bool ImGui::SliderBehavior(const ImRect& frame_bb, ImGuiID id, float* v, float v
grab_bb = ImRect(ImVec2(grab_pos - grab_sz*0.5f, frame_bb.Min.y + grab_padding), ImVec2(grab_pos + grab_sz*0.5f, frame_bb.Max.y - grab_padding));
else
grab_bb = ImRect(ImVec2(frame_bb.Min.x + grab_padding, grab_pos - grab_sz*0.5f), ImVec2(frame_bb.Max.x - grab_padding, grab_pos + grab_sz*0.5f));
- window->DrawList->AddRectFilled(grab_bb.Min, grab_bb.Max, window->Color(g.ActiveId == id ? ImGuiCol_SliderGrabActive : ImGuiCol_SliderGrab), style.GrabRounding);
+ window->DrawList->AddRectFilled(grab_bb.Min, grab_bb.Max, GetColorU32(g.ActiveId == id ? ImGuiCol_SliderGrabActive : ImGuiCol_SliderGrab), style.GrabRounding);
return value_changed;
}
@@ -6306,11 +6378,10 @@ bool ImGui::SliderInt4(const char* label, int v[4], int v_min, int v_max, const
bool ImGui::DragBehavior(const ImRect& frame_bb, ImGuiID id, float* v, float v_speed, float v_min, float v_max, int decimal_precision, float power)
{
ImGuiState& g = *GImGui;
- ImGuiWindow* window = GetCurrentWindow();
const ImGuiStyle& style = g.Style;
// Draw frame
- const ImU32 frame_col = window->Color(g.ActiveId == id ? ImGuiCol_FrameBgActive : g.HoveredId == id ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg);
+ const ImU32 frame_col = GetColorU32(g.ActiveId == id ? ImGuiCol_FrameBgActive : g.HoveredId == id ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg);
RenderFrame(frame_bb.Min, frame_bb.Max, frame_col, true, style.FrameRounding);
bool value_changed = false;
@@ -6626,7 +6697,7 @@ void ImGui::PlotEx(ImGuiPlotType plot_type, const char* label, float (*values_ge
scale_max = v_max;
}
- RenderFrame(frame_bb.Min, frame_bb.Max, window->Color(ImGuiCol_FrameBg), true, style.FrameRounding);
+ RenderFrame(frame_bb.Min, frame_bb.Max, GetColorU32(ImGuiCol_FrameBg), true, style.FrameRounding);
int res_w = ImMin((int)graph_size.x, values_count) + ((plot_type == ImGuiPlotType_Lines) ? -1 : 0);
int item_count = values_count + ((plot_type == ImGuiPlotType_Lines) ? -1 : 0);
@@ -6654,8 +6725,8 @@ void ImGui::PlotEx(ImGuiPlotType plot_type, const char* label, float (*values_ge
float t0 = 0.0f;
ImVec2 tp0 = ImVec2( t0, 1.0f - ImSaturate((v0 - scale_min) / (scale_max - scale_min)) ); // Point in the normalized space of our target rectangle
- const ImU32 col_base = window->Color((plot_type == ImGuiPlotType_Lines) ? ImGuiCol_PlotLines : ImGuiCol_PlotHistogram);
- const ImU32 col_hovered = window->Color((plot_type == ImGuiPlotType_Lines) ? ImGuiCol_PlotLinesHovered : ImGuiCol_PlotHistogramHovered);
+ const ImU32 col_base = GetColorU32((plot_type == ImGuiPlotType_Lines) ? ImGuiCol_PlotLines : ImGuiCol_PlotHistogram);
+ const ImU32 col_hovered = GetColorU32((plot_type == ImGuiPlotType_Lines) ? ImGuiCol_PlotLinesHovered : ImGuiCol_PlotHistogramHovered);
for (int n = 0; n < res_w; n++)
{
@@ -6727,6 +6798,41 @@ void ImGui::PlotHistogram(const char* label, float (*values_getter)(void* data,
PlotEx(ImGuiPlotType_Histogram, label, values_getter, data, values_count, values_offset, overlay_text, scale_min, scale_max, graph_size);
}
+// size_arg (for each axis) < 0.0f: align to end, 0.0f: auto, > 0.0f: specified size
+void ImGui::ProgressBar(float fraction, const ImVec2& size_arg, const char* overlay)
+{
+ ImGuiWindow* window = GetCurrentWindow();
+ if (window->SkipItems)
+ return;
+
+ ImGuiState& g = *GImGui;
+ const ImGuiStyle& style = g.Style;
+
+ ImVec2 pos = window->DC.CursorPos;
+ const ImRect bb(pos, pos + CalcItemSize(size_arg, CalcItemWidth() + style.FramePadding.x*2.0f, g.FontSize + style.FramePadding.y*2.0f));
+ ItemSize(bb, style.FramePadding.y);
+ if (!ItemAdd(bb, NULL))
+ return;
+
+ // Render
+ fraction = ImSaturate(fraction);
+ const ImVec2 fill_br = ImVec2(ImLerp(bb.Min.x, bb.Max.x, fraction), bb.Max.y);
+ RenderFrame(bb.Min, bb.Max, GetColorU32(ImGuiCol_FrameBg), true, style.FrameRounding);
+ RenderFrame(bb.Min, fill_br, GetColorU32(ImGuiCol_PlotHistogram), false, style.FrameRounding);
+
+ // Default displaying the fraction as percentage string, but user can override it
+ char overlay_buf[32];
+ if (!overlay)
+ {
+ ImFormatString(overlay_buf, IM_ARRAYSIZE(overlay_buf), "%.0f%%", fraction*100+0.01f);
+ overlay = overlay_buf;
+ }
+
+ ImVec2 overlay_size = CalcTextSize(overlay, NULL);
+ if (overlay_size.x > 0.0f)
+ RenderTextClipped(ImVec2(ImClamp(fill_br.x + style.ItemSpacing.x, bb.Min.x, bb.Max.x - overlay_size.x - style.ItemInnerSpacing.x), bb.Min.y), bb.Max, overlay, NULL, &overlay_size, ImGuiAlign_Left|ImGuiAlign_VCenter, &bb.Min, &bb.Max);
+}
+
bool ImGui::Checkbox(const char* label, bool* v)
{
ImGuiWindow* window = GetCurrentWindow();
@@ -6759,12 +6865,12 @@ bool ImGui::Checkbox(const char* label, bool* v)
if (pressed)
*v = !(*v);
- RenderFrame(check_bb.Min, check_bb.Max, window->Color((held && hovered) ? ImGuiCol_FrameBgActive : hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg), true, style.FrameRounding);
+ RenderFrame(check_bb.Min, check_bb.Max, GetColorU32((held && hovered) ? ImGuiCol_FrameBgActive : hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg), true, style.FrameRounding);
if (*v)
{
const float check_sz = ImMin(check_bb.GetWidth(), check_bb.GetHeight());
const float pad = ImMax(1.0f, (float)(int)(check_sz / 6.0f));
- window->DrawList->AddRectFilled(check_bb.Min+ImVec2(pad,pad), check_bb.Max-ImVec2(pad,pad), window->Color(ImGuiCol_CheckMark), style.FrameRounding);
+ window->DrawList->AddRectFilled(check_bb.Min+ImVec2(pad,pad), check_bb.Max-ImVec2(pad,pad), GetColorU32(ImGuiCol_CheckMark), style.FrameRounding);
}
if (g.LogEnabled)
@@ -6820,18 +6926,18 @@ bool ImGui::RadioButton(const char* label, bool active)
bool hovered, held;
bool pressed = ButtonBehavior(total_bb, id, &hovered, &held);
- window->DrawList->AddCircleFilled(center, radius, window->Color((held && hovered) ? ImGuiCol_FrameBgActive : hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg), 16);
+ window->DrawList->AddCircleFilled(center, radius, GetColorU32((held && hovered) ? ImGuiCol_FrameBgActive : hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg), 16);
if (active)
{
const float check_sz = ImMin(check_bb.GetWidth(), check_bb.GetHeight());
const float pad = ImMax(1.0f, (float)(int)(check_sz / 6.0f));
- window->DrawList->AddCircleFilled(center, radius-pad, window->Color(ImGuiCol_CheckMark), 16);
+ window->DrawList->AddCircleFilled(center, radius-pad, GetColorU32(ImGuiCol_CheckMark), 16);
}
if (window->Flags & ImGuiWindowFlags_ShowBorders)
{
- window->DrawList->AddCircle(center+ImVec2(1,1), radius, window->Color(ImGuiCol_BorderShadow), 16);
- window->DrawList->AddCircle(center, radius, window->Color(ImGuiCol_Border), 16);
+ window->DrawList->AddCircle(center+ImVec2(1,1), radius, GetColorU32(ImGuiCol_BorderShadow), 16);
+ window->DrawList->AddCircle(center, radius, GetColorU32(ImGuiCol_Border), 16);
}
if (g.LogEnabled)
@@ -7093,7 +7199,7 @@ static bool InputTextFilterCharacter(unsigned int* p_char, ImGuiInputTextFlags f
}
// Edit a string of text
-// FIXME: This is rather complex partly because we are doing UTF8 > u16 > UTF8 conversions on the go to more easily handle stb_textedit calls. Ideally we should stay in UTF-8 all the time.
+// FIXME: Rather messy function partly because we are doing UTF8 > u16 > UTF8 conversions on the go to more easily handle stb_textedit calls. Ideally we should stay in UTF-8 all the time. See https://github.com/nothings/stb/issues/188
bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2& size_arg, ImGuiInputTextFlags flags, ImGuiTextEditCallback callback, void* user_data)
{
ImGuiWindow* window = GetCurrentWindow();
@@ -7110,8 +7216,9 @@ bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
const ImGuiID id = window->GetID(label);
const bool is_multiline = (flags & ImGuiInputTextFlags_Multiline) != 0;
const bool is_editable = (flags & ImGuiInputTextFlags_ReadOnly) == 0;
+ const bool is_password = (flags & ImGuiInputTextFlags_Password) != 0;
- ImVec2 label_size = ImGui::CalcTextSize(label, NULL, true);
+ const ImVec2 label_size = ImGui::CalcTextSize(label, NULL, true);
ImVec2 size = CalcItemSize(size_arg, CalcItemWidth(), is_multiline ? ImGui::GetTextLineHeight() * 8.0f : label_size.y); // Arbitrary default of 8 lines high for multi-line
const ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + size + style.FramePadding*2.0f);
const ImRect total_bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? (style.ItemInnerSpacing.x + label_size.x) : 0.0f, 0.0f));
@@ -7137,6 +7244,23 @@ bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
return false;
}
+ // Password pushes a temporary font with only a fallback glyph
+ if (is_password)
+ {
+ const ImFont::Glyph* glyph = g.Font->FindGlyph('*');
+ ImFont* password_font = &g.InputTextPasswordFont;
+ password_font->FontSize = g.Font->FontSize;
+ password_font->Scale = g.Font->Scale;
+ password_font->DisplayOffset = g.Font->DisplayOffset;
+ password_font->Ascent = g.Font->Ascent;
+ password_font->Descent = g.Font->Descent;
+ password_font->ContainerAtlas = g.Font->ContainerAtlas;
+ password_font->FallbackGlyph = glyph;
+ password_font->FallbackXAdvance = glyph->XAdvance;
+ IM_ASSERT(password_font->Glyphs.empty() && password_font->IndexXAdvance.empty() && password_font->IndexLookup.empty());
+ ImGui::PushFont(password_font);
+ }
+
// NB: we are only allowed to access 'edit_state' if we are the active widget.
ImGuiTextEditState& edit_state = g.InputTextState;
@@ -7163,7 +7287,7 @@ bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
{
// Start edition
// Take a copy of the initial buffer value (both in original UTF-8 format and converted to wchar)
- // From the moment we focused we are ignoring the content of 'buf'
+ // From the moment we focused we are ignoring the content of 'buf' (unless we are in read-only mode)
const int prev_len_w = edit_state.CurLenW;
edit_state.Text.resize(buf_size+1); // wchar count <= utf-8 count. we use +1 to make sure that .Data isn't NULL so it doesn't crash.
edit_state.InitialText.resize(buf_size+1); // utf-8. we use +1 to make sure that .Data isn't NULL so it doesn't crash.
@@ -7171,7 +7295,6 @@ bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
const char* buf_end = NULL;
edit_state.CurLenW = ImTextStrFromUtf8(edit_state.Text.Data, edit_state.Text.Size, buf, NULL, &buf_end);
edit_state.CurLenA = (int)(buf_end - buf); // We can't get the result from ImFormatString() above because it is not UTF-8 aware. Here we'll cut off malformed UTF-8.
- edit_state.InputCursorScreenPos = ImVec2(-1.f, -1.f);
edit_state.CursorAnimReset();
// Preserve cursor position and undo/redo stack if we come back to same widget
@@ -7207,7 +7330,6 @@ bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
}
bool value_changed = false;
- bool cancel_edit = false;
bool enter_pressed = false;
if (g.ActiveId == id)
@@ -7225,8 +7347,8 @@ bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
edit_state.BufSizeA = buf_size;
// Although we are active we don't prevent mouse from hovering other elements unless we are interacting right now with the widget.
- // Down the line we should have a cleaner concept of focused vs active in the library.
- g.ActiveIdAllowHoveringOthers = !io.MouseDown[0];
+ // Down the line we should have a cleaner library-wide concept of Selected vs Active.
+ g.ActiveIdAllowOverlap = !io.MouseDown[0];
// Edit in progress
const float mouse_x = (g.IO.MousePos.x - frame_bb.Min.x - style.FramePadding.x) + edit_state.ScrollX;
@@ -7242,7 +7364,7 @@ bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
stb_textedit_click(&edit_state, &edit_state.StbState, mouse_x, mouse_y);
edit_state.CursorAnimReset();
}
- else if (io.MouseDown[0] && !edit_state.SelectedAllMouseLock)
+ else if (io.MouseDown[0] && !edit_state.SelectedAllMouseLock && (io.MouseDelta.x != 0.0f || io.MouseDelta.y != 0.0f))
{
stb_textedit_drag(&edit_state, &edit_state.StbState, mouse_x, mouse_y);
edit_state.CursorAnimReset();
@@ -7272,6 +7394,7 @@ bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
}
// Handle various key-presses
+ bool cancel_edit = false;
const int k_mask = (is_shift_down ? STB_TEXTEDIT_K_SHIFT : 0);
const bool is_ctrl_only = is_ctrl_down && !is_alt_down && !is_shift_down;
if (IsKeyPressedMap(ImGuiKey_LeftArrow)) { edit_state.OnKeyPressed(is_ctrl_down ? STB_TEXTEDIT_K_WORDLEFT | k_mask : STB_TEXTEDIT_K_LEFT | k_mask); }
@@ -7307,7 +7430,7 @@ bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
else if (is_ctrl_only && IsKeyPressedMap(ImGuiKey_Z) && is_editable) { edit_state.OnKeyPressed(STB_TEXTEDIT_K_UNDO); edit_state.ClearSelection(); }
else if (is_ctrl_only && IsKeyPressedMap(ImGuiKey_Y) && is_editable) { edit_state.OnKeyPressed(STB_TEXTEDIT_K_REDO); edit_state.ClearSelection(); }
else if (is_ctrl_only && IsKeyPressedMap(ImGuiKey_A)) { edit_state.SelectAll(); edit_state.CursorFollow = true; }
- else if (is_ctrl_only && ((IsKeyPressedMap(ImGuiKey_X) && is_editable) || IsKeyPressedMap(ImGuiKey_C)) && (!is_multiline || edit_state.HasSelection()))
+ else if (is_ctrl_only && !is_password && ((IsKeyPressedMap(ImGuiKey_X) && is_editable) || IsKeyPressedMap(ImGuiKey_C)) && (!is_multiline || edit_state.HasSelection()))
{
// Cut, Copy
const bool cut = IsKeyPressedMap(ImGuiKey_X);
@@ -7373,9 +7496,9 @@ bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
else
{
// Apply new value immediately - copy modified buffer back
- // Note that as soon as we can focus into the input box, the in-widget value gets priority over any underlying modification of the input buffer
- // FIXME: We actually always render 'buf' when calling DrawList->AddText
- // FIXME-OPT: CPU waste to do this every time the widget is active, should mark dirty state from the stb_textedit callbacks
+ // Note that as soon as the input box is active, the in-widget value gets priority over any underlying modification of the input buffer
+ // FIXME: We actually always render 'buf' when calling DrawList->AddText, making the comment above incorrect.
+ // FIXME-OPT: CPU waste to do this every time the widget is active, should mark dirty state from the stb_textedit callbacks.
if (is_editable)
{
edit_state.TempTextBuffer.resize(edit_state.Text.Size * 4);
@@ -7454,7 +7577,7 @@ bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
}
if (!is_multiline)
- RenderFrame(frame_bb.Min, frame_bb.Max, window->Color(ImGuiCol_FrameBg), true, style.FrameRounding);
+ RenderFrame(frame_bb.Min, frame_bb.Max, GetColorU32(ImGuiCol_FrameBg), true, style.FrameRounding);
// Render
const ImVec4 clip_rect(frame_bb.Min.x, frame_bb.Min.y, frame_bb.Min.x + size.x + style.FramePadding.x*2.0f, frame_bb.Min.y + size.y + style.FramePadding.y*2.0f);
@@ -7556,7 +7679,7 @@ bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
float bg_offy_up = is_multiline ? 0.0f : -1.0f; // FIXME: those offsets should be part of the style? they don't play so well with multi-line selection.
float bg_offy_dn = is_multiline ? 0.0f : 2.0f;
- ImU32 bg_color = draw_window->Color(ImGuiCol_TextSelectedBg);
+ ImU32 bg_color = GetColorU32(ImGuiCol_TextSelectedBg);
ImVec2 rect_pos = render_pos + select_start_offset - render_scroll;
for (const ImWchar* p = text_selected_begin; p < text_selected_end; )
{
@@ -7582,19 +7705,17 @@ bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
}
}
- draw_window->DrawList->AddText(g.Font, g.FontSize, render_pos - render_scroll, draw_window->Color(ImGuiCol_Text), buf, buf+edit_state.CurLenA, 0.0f, is_multiline ? NULL : &clip_rect);
+ draw_window->DrawList->AddText(g.Font, g.FontSize, render_pos - render_scroll, GetColorU32(ImGuiCol_Text), buf, buf+edit_state.CurLenA, 0.0f, is_multiline ? NULL : &clip_rect);
// Draw blinking cursor
ImVec2 cursor_screen_pos = render_pos + cursor_offset - render_scroll;
bool cursor_is_visible = (g.InputTextState.CursorAnim <= 0.0f) || fmodf(g.InputTextState.CursorAnim, 1.20f) <= 0.80f;
if (cursor_is_visible)
- draw_window->DrawList->AddLine(cursor_screen_pos + ImVec2(0.0f,-g.FontSize+0.5f), cursor_screen_pos + ImVec2(0.0f,-1.5f), window->Color(ImGuiCol_Text));
-
- // Notify OS of text input position for advanced IME
- if (is_editable && io.ImeSetInputScreenPosFn && ImLengthSqr(edit_state.InputCursorScreenPos - cursor_screen_pos) > 0.0001f)
- io.ImeSetInputScreenPosFn((int)cursor_screen_pos.x - 1, (int)(cursor_screen_pos.y - g.FontSize)); // -1 x offset so that Windows IME can cover our cursor. Bit of an extra nicety.
+ draw_window->DrawList->AddLine(cursor_screen_pos + ImVec2(0.0f,-g.FontSize+0.5f), cursor_screen_pos + ImVec2(0.0f,-1.5f), GetColorU32(ImGuiCol_Text));
- edit_state.InputCursorScreenPos = cursor_screen_pos;
+ // Notify OS of text input position for advanced IME (-1 x offset so that Windows IME can cover our cursor. Bit of an extra nicety.)
+ if (is_editable)
+ g.OsImePosRequest = ImVec2(cursor_screen_pos.x - 1, cursor_screen_pos.y - g.FontSize);
}
else
{
@@ -7602,7 +7723,7 @@ bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
const char* buf_end = NULL;
if (is_multiline)
text_size = ImVec2(size.x, InputTextCalcTextLenAndLineCount(buf, &buf_end) * g.FontSize); // We don't need width
- draw_window->DrawList->AddText(g.Font, g.FontSize, render_pos, draw_window->Color(ImGuiCol_Text), buf, buf_end, 0.0f, is_multiline ? NULL : &clip_rect);
+ draw_window->DrawList->AddText(g.Font, g.FontSize, render_pos, GetColorU32(ImGuiCol_Text), buf, buf_end, 0.0f, is_multiline ? NULL : &clip_rect);
}
if (is_multiline)
@@ -7612,8 +7733,11 @@ bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
ImGui::EndGroup();
}
+ if (is_password)
+ ImGui::PopFont();
+
// Log as text
- if (g.LogEnabled)
+ if (g.LogEnabled && !is_password)
LogRenderedText(render_pos, buf, NULL);
if (label_size.x > 0)
@@ -7875,8 +7999,8 @@ bool ImGui::Combo(const char* label, int* current_item, bool (*items_getter)(voi
const bool hovered = IsHovered(frame_bb, id);
const ImRect value_bb(frame_bb.Min, frame_bb.Max - ImVec2(arrow_size, 0.0f));
- RenderFrame(frame_bb.Min, frame_bb.Max, window->Color(ImGuiCol_FrameBg), true, style.FrameRounding);
- RenderFrame(ImVec2(frame_bb.Max.x-arrow_size, frame_bb.Min.y), frame_bb.Max, window->Color(hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button), true, style.FrameRounding); // FIXME-ROUNDING
+ RenderFrame(frame_bb.Min, frame_bb.Max, GetColorU32(ImGuiCol_FrameBg), true, style.FrameRounding);
+ RenderFrame(ImVec2(frame_bb.Max.x-arrow_size, frame_bb.Min.y), frame_bb.Max, GetColorU32(hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button), true, style.FrameRounding); // FIXME-ROUNDING
RenderCollapseTriangle(ImVec2(frame_bb.Max.x-arrow_size, frame_bb.Min.y) + style.FramePadding, true);
if (*current_item >= 0 && *current_item < items_count)
@@ -8011,7 +8135,7 @@ bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags fl
// Render
if (hovered || selected)
{
- const ImU32 col = window->Color((held && hovered) ? ImGuiCol_HeaderActive : hovered ? ImGuiCol_HeaderHovered : ImGuiCol_Header);
+ const ImU32 col = GetColorU32((held && hovered) ? ImGuiCol_HeaderActive : hovered ? ImGuiCol_HeaderHovered : ImGuiCol_Header);
RenderFrame(bb_with_spacing.Min, bb_with_spacing.Max, col, false, 0.0f);
}
@@ -8156,7 +8280,7 @@ bool ImGui::MenuItem(const char* label, const char* shortcut, bool selected, boo
}
if (selected)
- RenderCheckMark(pos + ImVec2(window->MenuColumns.Pos[2] + extra_w + g.FontSize * 0.20f, 0.0f), window->Color(ImGuiCol_Text));
+ RenderCheckMark(pos + ImVec2(window->MenuColumns.Pos[2] + extra_w + g.FontSize * 0.20f, 0.0f), GetColorU32(ImGuiCol_Text));
return pressed;
}
@@ -8209,7 +8333,8 @@ bool ImGui::BeginMenuBar()
ImGui::BeginGroup(); // Save position
ImGui::PushID("##menubar");
ImRect rect = window->MenuBarRect();
- PushClipRect(ImVec4(rect.Min.x+0.5f, rect.Min.y-0.5f, rect.Max.x+0.5f, rect.Max.y-1.5f), false);
+ float border_size = (window->Flags & ImGuiWindowFlags_ShowBorders) ? 1.0f : 0.0f;
+ PushClipRect(ImVec2(rect.Min.x+0.5f, rect.Min.y-0.5f+border_size), ImVec2(rect.Max.x+0.5f, rect.Max.y-0.5f), false);
window->DC.CursorPos = ImVec2(rect.Min.x + window->DC.MenuBarOffsetX, rect.Min.y);// + g.Style.FramePadding.y);
window->DC.LayoutType = ImGuiLayoutType_Horizontal;
window->DC.MenuBarAppending = true;
@@ -8361,7 +8486,7 @@ bool ImGui::ColorButton(const ImVec4& col, bool small_height, bool outline_borde
bool hovered, held;
bool pressed = ButtonBehavior(bb, id, &hovered, &held);
- RenderFrame(bb.Min, bb.Max, window->Color(col), outline_border, style.FrameRounding);
+ RenderFrame(bb.Min, bb.Max, GetColorU32(col), outline_border, style.FrameRounding);
if (hovered)
ImGui::SetTooltip("Color:\n(%.2f,%.2f,%.2f,%.2f)\n#%02X%02X%02X%02X", col.x, col.y, col.z, col.w, IM_F32_TO_INT8(col.x), IM_F32_TO_INT8(col.y), IM_F32_TO_INT8(col.z), IM_F32_TO_INT8(col.z));
@@ -8539,7 +8664,7 @@ void ImGui::Separator()
float x1 = window->Pos.x;
float x2 = window->Pos.x + window->Size.x;
if (!window->DC.GroupStack.empty())
- x1 += window->DC.ColumnsStartX;
+ x1 += window->DC.IndentX;
const ImRect bb(ImVec2(x1, window->DC.CursorPos.y), ImVec2(x2, window->DC.CursorPos.y));
ItemSize(ImVec2(0.0f, 0.0f)); // NB: we don't provide our width so that it doesn't get feed back into AutoFit // FIXME: Height should be 1.0f not 0.0f ?
@@ -8550,7 +8675,7 @@ void ImGui::Separator()
return;
}
- window->DrawList->AddLine(bb.Min, bb.Max, window->Color(ImGuiCol_Border));
+ window->DrawList->AddLine(bb.Min, bb.Max, GetColorU32(ImGuiCol_Border));
ImGuiState& g = *GImGui;
if (g.LogEnabled)
@@ -8596,13 +8721,13 @@ void ImGui::BeginGroup()
ImGuiGroupData& group_data = window->DC.GroupStack.back();
group_data.BackupCursorPos = window->DC.CursorPos;
group_data.BackupCursorMaxPos = window->DC.CursorMaxPos;
- group_data.BackupColumnsStartX = window->DC.ColumnsStartX;
+ group_data.BackupIndentX = window->DC.IndentX;
group_data.BackupCurrentLineHeight = window->DC.CurrentLineHeight;
group_data.BackupCurrentLineTextBaseOffset = window->DC.CurrentLineTextBaseOffset;
group_data.BackupLogLinePosY = window->DC.LogLinePosY;
group_data.AdvanceCursor = true;
- window->DC.ColumnsStartX = window->DC.CursorPos.x - window->Pos.x;
+ window->DC.IndentX = window->DC.CursorPos.x - window->Pos.x;
window->DC.CursorMaxPos = window->DC.CursorPos;
window->DC.CurrentLineHeight = 0.0f;
window->DC.LogLinePosY = window->DC.CursorPos.y - 9999.0f;
@@ -8613,7 +8738,7 @@ void ImGui::EndGroup()
ImGuiWindow* window = GetCurrentWindow();
ImGuiStyle& style = ImGui::GetStyle();
- IM_ASSERT(!window->DC.GroupStack.empty());
+ IM_ASSERT(!window->DC.GroupStack.empty()); // Mismatched BeginGroup()/EndGroup() calls
ImGuiGroupData& group_data = window->DC.GroupStack.back();
@@ -8625,7 +8750,7 @@ void ImGui::EndGroup()
window->DC.CursorMaxPos = ImMax(group_data.BackupCursorMaxPos, window->DC.CursorMaxPos);
window->DC.CurrentLineHeight = group_data.BackupCurrentLineHeight;
window->DC.CurrentLineTextBaseOffset = group_data.BackupCurrentLineTextBaseOffset;
- window->DC.ColumnsStartX = group_data.BackupColumnsStartX;
+ window->DC.IndentX = group_data.BackupIndentX;
window->DC.LogLinePosY = window->DC.CursorPos.y - 9999.0f;
if (group_data.AdvanceCursor)
@@ -8685,7 +8810,8 @@ void ImGui::NextColumn()
window->DC.ColumnsCellMaxY = ImMax(window->DC.ColumnsCellMaxY, window->DC.CursorPos.y);
if (++window->DC.ColumnsCurrent < window->DC.ColumnsCount)
{
- window->DC.ColumnsOffsetX = ImGui::GetColumnOffset(window->DC.ColumnsCurrent) - window->DC.ColumnsStartX + g.Style.ItemSpacing.x;
+ // Columns 1+ cancel out IndentX
+ window->DC.ColumnsOffsetX = ImGui::GetColumnOffset(window->DC.ColumnsCurrent) - window->DC.IndentX + g.Style.ItemSpacing.x;
window->DrawList->ChannelsSetCurrent(window->DC.ColumnsCurrent);
}
else
@@ -8695,13 +8821,13 @@ void ImGui::NextColumn()
window->DC.ColumnsCellMinY = window->DC.ColumnsCellMaxY;
window->DrawList->ChannelsSetCurrent(0);
}
- window->DC.CursorPos.x = (float)(int)(window->Pos.x + window->DC.ColumnsStartX + window->DC.ColumnsOffsetX);
+ window->DC.CursorPos.x = (float)(int)(window->Pos.x + window->DC.IndentX + window->DC.ColumnsOffsetX);
window->DC.CursorPos.y = window->DC.ColumnsCellMinY;
window->DC.CurrentLineHeight = 0.0f;
window->DC.CurrentLineTextBaseOffset = 0.0f;
PushColumnClipRect();
- ImGui::PushItemWidth(ImGui::GetColumnWidth() * 0.65f); // FIXME
+ ImGui::PushItemWidth(ImGui::GetColumnWidth() * 0.65f); // FIXME: Move on columns setup
}
}
@@ -8720,7 +8846,7 @@ int ImGui::GetColumnsCount()
static float GetDraggedColumnOffset(int column_index)
{
// Active (dragged) column always follow mouse. The reason we need this is that dragging a column to the right edge of an auto-resizing
- // window creates a feedback loop because we store normalized positions/ So while dragging we enforce absolute positioning
+ // window creates a feedback loop because we store normalized positions. So while dragging we enforce absolute positioning.
ImGuiState& g = *GImGui;
ImGuiWindow* window = ImGui::GetCurrentWindowRead();
IM_ASSERT(column_index > 0); // We cannot drag column 0. If you get this assert you may have a conflict between the ID of your columns and another widgets.
@@ -8746,33 +8872,24 @@ float ImGui::GetColumnOffset(int column_index)
return GetDraggedColumnOffset(column_index);
}
- // Read from cache
- IM_ASSERT(column_index < window->DC.ColumnsOffsetsT.Size);
- const float t = window->DC.ColumnsOffsetsT[column_index];
-
- const float content_region_width = window->SizeContentsExplicit.x ? window->SizeContentsExplicit.x : window->Size.x;
- const float min_x = window->DC.ColumnsStartX;
- const float max_x = content_region_width - window->Scroll.x - ((window->Flags & ImGuiWindowFlags_NoScrollbar) ? 0 : g.Style.ScrollbarSize);// - window->WindowPadding().x;
- const float x = min_x + t * (max_x - min_x);
- return (float)(int)x;
+ IM_ASSERT(column_index < window->DC.ColumnsData.Size);
+ const float t = window->DC.ColumnsData[column_index].OffsetNorm;
+ const float x_offset = window->DC.ColumnsMinX + t * (window->DC.ColumnsMaxX - window->DC.ColumnsMinX);
+ return (float)(int)x_offset;
}
void ImGui::SetColumnOffset(int column_index, float offset)
{
- ImGuiState& g = *GImGui;
ImGuiWindow* window = GetCurrentWindow();
if (column_index < 0)
column_index = window->DC.ColumnsCurrent;
- IM_ASSERT(column_index < window->DC.ColumnsOffsetsT.Size);
- const ImGuiID column_id = window->DC.ColumnsSetID + ImGuiID(column_index);
+ IM_ASSERT(column_index < window->DC.ColumnsData.Size);
+ const float t = (offset - window->DC.ColumnsMinX) / (window->DC.ColumnsMaxX - window->DC.ColumnsMinX);
+ window->DC.ColumnsData[column_index].OffsetNorm = t;
- const float content_region_width = window->SizeContentsExplicit.x ? window->SizeContentsExplicit.x : window->Size.x;
- const float min_x = window->DC.ColumnsStartX;
- const float max_x = content_region_width - window->Scroll.x - ((window->Flags & ImGuiWindowFlags_NoScrollbar) ? 0 : g.Style.ScrollbarSize);// - window->WindowPadding().x;
- const float t = (offset - min_x) / (max_x - min_x);
+ const ImGuiID column_id = window->DC.ColumnsSetID + ImGuiID(column_index);
window->DC.StateStorage->SetFloat(column_id, t);
- window->DC.ColumnsOffsetsT[column_index] = t;
}
float ImGui::GetColumnWidth(int column_index)
@@ -8793,13 +8910,14 @@ static void PushColumnClipRect(int column_index)
const float x1 = window->Pos.x + ImGui::GetColumnOffset(column_index) - 1;
const float x2 = window->Pos.x + ImGui::GetColumnOffset(column_index+1) - 1;
- PushClipRect(ImVec4(x1,-FLT_MAX,x2,+FLT_MAX));
+ ImGui::PushClipRect(ImVec2(x1,-FLT_MAX), ImVec2(x2,+FLT_MAX), true);
}
void ImGui::Columns(int columns_count, const char* id, bool border)
{
ImGuiState& g = *GImGui;
ImGuiWindow* window = GetCurrentWindow();
+ IM_ASSERT(columns_count >= 1);
if (window->DC.ColumnsCount != 1)
{
@@ -8816,7 +8934,7 @@ void ImGui::Columns(int columns_count, const char* id, bool border)
// Draw columns borders and handle resize at the time of "closing" a columns set
if (window->DC.ColumnsCount != columns_count && window->DC.ColumnsCount != 1 && window->DC.ColumnsShowBorders && !window->SkipItems)
{
- const float y1 = window->DC.ColumnsStartPos.y;
+ const float y1 = window->DC.ColumnsStartPosY;
const float y2 = window->DC.CursorPos.y;
for (int i = 1; i < window->DC.ColumnsCount; i++)
{
@@ -8832,7 +8950,7 @@ void ImGui::Columns(int columns_count, const char* id, bool border)
g.MouseCursor = ImGuiMouseCursor_ResizeEW;
// Draw before resize so our items positioning are in sync with the line being drawn
- const ImU32 col = window->Color(held ? ImGuiCol_ColumnActive : hovered ? ImGuiCol_ColumnHovered : ImGuiCol_Column);
+ const ImU32 col = GetColorU32(held ? ImGuiCol_ColumnActive : hovered ? ImGuiCol_ColumnHovered : ImGuiCol_Column);
const float xi = (float)(int)x;
window->DrawList->AddLine(ImVec2(xi, y1+1.0f), ImVec2(xi, y2), col);
@@ -8847,29 +8965,36 @@ void ImGui::Columns(int columns_count, const char* id, bool border)
}
}
- // Set state for first column
- ImGui::PushID(0x11223344); // Differentiate column ID with an arbitrary/random prefix for cases where users name their columns set the same as another non-scope widget
- window->DC.ColumnsSetID = window->GetID(id ? id : "");
+ // Differentiate column ID with an arbitrary prefix for cases where users name their columns set the same as another widget.
+ // In addition, when an identifier isn't explicitly provided we include the number of columns in the hash to make it uniquer.
+ ImGui::PushID(0x11223347 + (id ? 0 : columns_count));
+ window->DC.ColumnsSetID = window->GetID(id ? id : "columns");
ImGui::PopID();
+
+ // Set state for first column
window->DC.ColumnsCurrent = 0;
window->DC.ColumnsCount = columns_count;
window->DC.ColumnsShowBorders = border;
- window->DC.ColumnsStartPos = window->DC.CursorPos;
+
+ const float content_region_width = window->SizeContentsExplicit.x ? window->SizeContentsExplicit.x : window->Size.x;
+ window->DC.ColumnsMinX = window->DC.IndentX; // Lock our horizontal range
+ window->DC.ColumnsMaxX = content_region_width - window->Scroll.x - ((window->Flags & ImGuiWindowFlags_NoScrollbar) ? 0 : g.Style.ScrollbarSize);// - window->WindowPadding().x;
+ window->DC.ColumnsStartPosY = window->DC.CursorPos.y;
window->DC.ColumnsCellMinY = window->DC.ColumnsCellMaxY = window->DC.CursorPos.y;
window->DC.ColumnsOffsetX = 0.0f;
- window->DC.CursorPos.x = (float)(int)(window->Pos.x + window->DC.ColumnsStartX + window->DC.ColumnsOffsetX);
+ window->DC.CursorPos.x = (float)(int)(window->Pos.x + window->DC.IndentX + window->DC.ColumnsOffsetX);
if (window->DC.ColumnsCount != 1)
{
// Cache column offsets
- window->DC.ColumnsOffsetsT.resize(columns_count + 1);
+ window->DC.ColumnsData.resize(columns_count + 1);
for (int column_index = 0; column_index < columns_count + 1; column_index++)
{
const ImGuiID column_id = window->DC.ColumnsSetID + ImGuiID(column_index);
KeepAliveID(column_id);
const float default_t = column_index / (float)window->DC.ColumnsCount;
const float t = window->DC.StateStorage->GetFloat(column_id, default_t); // Cheaply store our floating point value inside the integer (could store an union into the map?)
- window->DC.ColumnsOffsetsT[column_index] = t;
+ window->DC.ColumnsData[column_index].OffsetNorm = t;
}
window->DrawList->ChannelsSplit(window->DC.ColumnsCount);
PushColumnClipRect();
@@ -8877,9 +9002,7 @@ void ImGui::Columns(int columns_count, const char* id, bool border)
}
else
{
- window->DC.ColumnsOffsetsT.resize(2);
- window->DC.ColumnsOffsetsT[0] = 0.0f;
- window->DC.ColumnsOffsetsT[1] = 1.0f;
+ window->DC.ColumnsData.resize(0);
}
}
@@ -8887,16 +9010,16 @@ void ImGui::Indent()
{
ImGuiState& g = *GImGui;
ImGuiWindow* window = GetCurrentWindow();
- window->DC.ColumnsStartX += g.Style.IndentSpacing;
- window->DC.CursorPos.x = window->Pos.x + window->DC.ColumnsStartX + window->DC.ColumnsOffsetX;
+ window->DC.IndentX += g.Style.IndentSpacing;
+ window->DC.CursorPos.x = window->Pos.x + window->DC.IndentX + window->DC.ColumnsOffsetX;
}
void ImGui::Unindent()
{
ImGuiState& g = *GImGui;
ImGuiWindow* window = GetCurrentWindow();
- window->DC.ColumnsStartX -= g.Style.IndentSpacing;
- window->DC.CursorPos.x = window->Pos.x + window->DC.ColumnsStartX + window->DC.ColumnsOffsetX;
+ window->DC.IndentX -= g.Style.IndentSpacing;
+ window->DC.CursorPos.x = window->Pos.x + window->DC.IndentX + window->DC.ColumnsOffsetX;
}
void ImGui::TreePush(const char* str_id)
@@ -8953,14 +9076,14 @@ void ImGui::Value(const char* prefix, float v, const char* float_format)
}
// FIXME: May want to remove those helpers?
-void ImGui::Color(const char* prefix, const ImVec4& v)
+void ImGui::ValueColor(const char* prefix, const ImVec4& v)
{
ImGui::Text("%s: (%.2f,%.2f,%.2f,%.2f)", prefix, v.x, v.y, v.z, v.w);
ImGui::SameLine();
ImGui::ColorButton(v, true);
}
-void ImGui::Color(const char* prefix, unsigned int v)
+void ImGui::ValueColor(const char* prefix, unsigned int v)
{
ImGui::Text("%s: %08X", prefix, v);
ImGui::SameLine();
@@ -9117,21 +9240,22 @@ void ImGui::ShowMetricsWindow(bool* opened)
for (const ImDrawCmd* pcmd = draw_list->CmdBuffer.begin(); pcmd < draw_list->CmdBuffer.end(); elem_offset += pcmd->ElemCount, pcmd++)
{
if (pcmd->UserCallback)
+ {
ImGui::BulletText("Callback %p, user_data %p", pcmd->UserCallback, pcmd->UserCallbackData);
- else
+ continue;
+ }
+ ImGui::BulletText("Draw %-4d %s vtx, tex = %p, clip_rect = (%.0f,%.0f)..(%.0f,%.0f)", pcmd->ElemCount, draw_list->IdxBuffer.Size > 0 ? "indexed" : "non-indexed", pcmd->TextureId, pcmd->ClipRect.x, pcmd->ClipRect.y, pcmd->ClipRect.z, pcmd->ClipRect.w);
+ if (show_clip_rects && ImGui::IsItemHovered())
{
- ImGui::BulletText("Draw %d indexed vtx, tex = %p, clip_rect = (%.0f,%.0f)..(%.0f,%.0f)", pcmd->ElemCount, pcmd->TextureId, pcmd->ClipRect.x, pcmd->ClipRect.y, pcmd->ClipRect.z, pcmd->ClipRect.w);
- if (show_clip_rects && ImGui::IsItemHovered())
- {
- ImRect clip_rect = pcmd->ClipRect;
- ImRect vtxs_rect;
- for (int i = elem_offset; i < elem_offset + (int)pcmd->ElemCount; i++)
- vtxs_rect.Add(draw_list->VtxBuffer[draw_list->IdxBuffer[i]].pos);
- GImGui->OverlayDrawList.PushClipRectFullScreen();
- clip_rect.Round(); GImGui->OverlayDrawList.AddRect(clip_rect.Min, clip_rect.Max, ImColor(255,255,0));
- vtxs_rect.Round(); GImGui->OverlayDrawList.AddRect(vtxs_rect.Min, vtxs_rect.Max, ImColor(255,0,255));
- GImGui->OverlayDrawList.PopClipRect();
- }
+ ImRect clip_rect = pcmd->ClipRect;
+ ImRect vtxs_rect;
+ ImDrawIdx* idx_buffer = (draw_list->IdxBuffer.Size > 0) ? draw_list->IdxBuffer.Data : NULL;
+ for (int i = elem_offset; i < elem_offset + (int)pcmd->ElemCount; i++)
+ vtxs_rect.Add(draw_list->VtxBuffer[idx_buffer ? idx_buffer[i] : i].pos);
+ GImGui->OverlayDrawList.PushClipRectFullScreen();
+ clip_rect.Round(); GImGui->OverlayDrawList.AddRect(clip_rect.Min, clip_rect.Max, ImColor(255,255,0));
+ vtxs_rect.Round(); GImGui->OverlayDrawList.AddRect(vtxs_rect.Min, vtxs_rect.Max, ImColor(255,0,255));
+ GImGui->OverlayDrawList.PopClipRect();
}
}
ImGui::TreePop();
@@ -9192,8 +9316,8 @@ void ImGui::ShowMetricsWindow(bool* opened)
//-----------------------------------------------------------------------------
-//---- Include imgui_user.inl at the end of imgui.cpp
-//---- So you can include code that extends ImGui using its private data/functions.
+// Include imgui_user.inl at the end of imgui.cpp to access private data/functions that aren't exposed.
+// Prefer just including imgui_internal.h from your code rather than using this define. If a declaration is missing from imgui_internal.h add it or request it on the github.
#ifdef IMGUI_INCLUDE_IMGUI_USER_INL
#include "imgui_user.inl"
#endif
diff --git a/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui.h b/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui.h
index d2c4155d918..b7b0a0113a6 100644
--- a/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui.h
+++ b/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui.h
@@ -1,5 +1,5 @@
-// ImGui library v1.47 WIP
-// Headers
+// dear imgui, v1.48 WIP
+// (headers)
// See imgui.cpp file for documentation.
// See ImGui::ShowTestWindow() in imgui_demo.cpp for demo code.
@@ -14,10 +14,9 @@
#include <float.h> // FLT_MAX
#include <stdarg.h> // va_list
#include <stddef.h> // ptrdiff_t, NULL
-#include <stdlib.h> // NULL, malloc, free, qsort, atoi
#include <string.h> // memset, memmove, memcpy, strlen, strchr, strcpy, strcmp
-#define IMGUI_VERSION "1.47 WIP"
+#define IMGUI_VERSION "1.48 WIP"
// Define assertion handler.
#ifndef IM_ASSERT
@@ -42,6 +41,7 @@ struct ImDrawList;
struct ImDrawData;
struct ImFont;
struct ImFontAtlas;
+struct ImColor;
struct ImGuiIO;
struct ImGuiStorage;
struct ImGuiStyle;
@@ -173,6 +173,8 @@ namespace ImGui
IMGUI_API void PushStyleVar(ImGuiStyleVar idx, float val);
IMGUI_API void PushStyleVar(ImGuiStyleVar idx, const ImVec2& val);
IMGUI_API void PopStyleVar(int count = 1);
+ IMGUI_API ImU32 GetColorU32(ImGuiCol idx, float alpha_mul = 1.0f); // retrieve given style color with style alpha applied and optional extra alpha multiplier
+ IMGUI_API ImU32 GetColorU32(const ImVec4& col); // retrieve given color with style alpha applied
// Parameters stacks (current window)
IMGUI_API void PushItemWidth(float item_width); // width of items for the common item+label case, pixels. 0.0f = default to ~2/3 of windows width, >0.0f: width in pixels, <0.0f align xx pixels to the right of window (so -1.0f always align width to the right side)
@@ -194,7 +196,7 @@ namespace ImGui
IMGUI_API void Dummy(const ImVec2& size); // add a dummy item of given size
IMGUI_API void Indent(); // move content position toward the right by style.IndentSpacing pixels
IMGUI_API void Unindent(); // move content position back to the left (cancel Indent)
- IMGUI_API void Columns(int count = 1, const char* id = NULL, bool border=true); // setup number of columns. use an identifier to distinguish multiple column sets. close with Columns(1).
+ IMGUI_API void Columns(int count = 1, const char* id = NULL, bool border = true); // setup number of columns. use an identifier to distinguish multiple column sets. close with Columns(1).
IMGUI_API void NextColumn(); // next column
IMGUI_API int GetColumnIndex(); // get current column index
IMGUI_API float GetColumnOffset(int column_index = -1); // get position of column line (in pixels, from the left side of the contents region). pass -1 to use current column, otherwise 0..GetcolumnsCount() inclusive. column 0 is usually 0.0f and not resizable unless you call this
@@ -217,7 +219,7 @@ namespace ImGui
// ID scopes
// If you are creating widgets in a loop you most likely want to push a unique identifier so ImGui can differentiate them.
- // You can also use "##extra" within your widget name to distinguish them from each others. Read the FAQ for more details.
+ // You can also use the "##foobar" syntax within widget label to distinguish them from each others. Read "A primer on the use of labels/IDs" in the FAQ for more details.
IMGUI_API void PushID(const char* str_id); // push identifier into the ID stack. IDs are hash of the *entire* stack!
IMGUI_API void PushID(const char* str_id_begin, const char* str_id_end);
IMGUI_API void PushID(const void* ptr_id);
@@ -258,13 +260,14 @@ namespace ImGui
IMGUI_API bool ColorButton(const ImVec4& col, bool small_height = false, bool outline_border = true);
IMGUI_API bool ColorEdit3(const char* label, float col[3]);
IMGUI_API bool ColorEdit4(const char* label, float col[4], bool show_alpha = true);
- IMGUI_API void ColorEditMode(ImGuiColorEditMode mode);
+ IMGUI_API void ColorEditMode(ImGuiColorEditMode mode); // FIXME-OBSOLETE: This is inconsistent with most of the API and should be obsoleted.
IMGUI_API void PlotLines(const char* label, const float* values, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0,0), int stride = sizeof(float));
IMGUI_API void PlotLines(const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0,0));
IMGUI_API void PlotHistogram(const char* label, const float* values, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0,0), int stride = sizeof(float));
IMGUI_API void PlotHistogram(const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0,0));
+ IMGUI_API void ProgressBar(float fraction, const ImVec2& size_arg = ImVec2(-1,0), const char* overlay = NULL);
- // Widgets: Drags (tip: ctrl+click on a drag box to input text)
+ // Widgets: Drags (tip: ctrl+click on a drag box to input with keyboard. manually input values aren't clamped, can go off-bounds)
IMGUI_API bool DragFloat(const char* label, float* v, float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* display_format = "%.3f", float power = 1.0f); // If v_min >= v_max we have no bound
IMGUI_API bool DragFloat2(const char* label, float v[2], float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* display_format = "%.3f", float power = 1.0f);
IMGUI_API bool DragFloat3(const char* label, float v[3], float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* display_format = "%.3f", float power = 1.0f);
@@ -276,7 +279,7 @@ namespace ImGui
IMGUI_API bool DragInt4(const char* label, int v[4], float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* display_format = "%.0f");
IMGUI_API bool DragIntRange2(const char* label, int* v_current_min, int* v_current_max, float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* display_format = "%.0f", const char* display_format_max = NULL);
- // Widgets: Input
+ // Widgets: Input with Keyboard
IMGUI_API bool InputText(const char* label, char* buf, size_t buf_size, ImGuiInputTextFlags flags = 0, ImGuiTextEditCallback callback = NULL, void* user_data = NULL);
IMGUI_API bool InputTextMultiline(const char* label, char* buf, size_t buf_size, const ImVec2& size = ImVec2(0,0), ImGuiInputTextFlags flags = 0, ImGuiTextEditCallback callback = NULL, void* user_data = NULL);
IMGUI_API bool InputFloat(const char* label, float* v, float step = 0.0f, float step_fast = 0.0f, int decimal_precision = -1, ImGuiInputTextFlags extra_flags = 0);
@@ -288,7 +291,7 @@ namespace ImGui
IMGUI_API bool InputInt3(const char* label, int v[3], ImGuiInputTextFlags extra_flags = 0);
IMGUI_API bool InputInt4(const char* label, int v[4], ImGuiInputTextFlags extra_flags = 0);
- // Widgets: Sliders (tip: ctrl+click on a slider to input text)
+ // Widgets: Sliders (tip: ctrl+click on a slider to input with keyboard. manually input values aren't clamped, can go off-bounds)
IMGUI_API bool SliderFloat(const char* label, float* v, float v_min, float v_max, const char* display_format = "%.3f", float power = 1.0f); // adjust display_format to decorate the value with a prefix or a suffix. Use power!=1.0 for logarithmic sliders
IMGUI_API bool SliderFloat2(const char* label, float v[2], float v_min, float v_max, const char* display_format = "%.3f", float power = 1.0f);
IMGUI_API bool SliderFloat3(const char* label, float v[3], float v_min, float v_max, const char* display_format = "%.3f", float power = 1.0f);
@@ -326,8 +329,8 @@ namespace ImGui
IMGUI_API void Value(const char* prefix, int v);
IMGUI_API void Value(const char* prefix, unsigned int v);
IMGUI_API void Value(const char* prefix, float v, const char* float_format = NULL);
- IMGUI_API void Color(const char* prefix, const ImVec4& v);
- IMGUI_API void Color(const char* prefix, unsigned int v);
+ IMGUI_API void ValueColor(const char* prefix, const ImVec4& v);
+ IMGUI_API void ValueColor(const char* prefix, unsigned int v);
// Tooltip
IMGUI_API void SetTooltip(const char* fmt, ...) IM_PRINTFARGS(1); // set tooltip under mouse-cursor, typically use with ImGui::IsHovered(). last call wins
@@ -346,12 +349,12 @@ namespace ImGui
IMGUI_API bool MenuItem(const char* label, const char* shortcut, bool* p_selected, bool enabled = true); // return true when activated + toggle (*p_selected) if p_selected != NULL
// Popup
- IMGUI_API void OpenPopup(const char* str_id); // mark popup as open. popup identifiers are relative to the current ID-stack (so OpenPopup and BeginPopup needs to be at the same level). close childs popups if any. will close popup when user click outside, or activate a pressable item, or CloseCurrentPopup() is called within a BeginPopup()/EndPopup() block.
+ IMGUI_API void OpenPopup(const char* str_id); // mark popup as open. popups are closed when user click outside, or activate a pressable item, or CloseCurrentPopup() is called within a BeginPopup()/EndPopup() block. popup identifiers are relative to the current ID-stack (so OpenPopup and BeginPopup needs to be at the same level).
IMGUI_API bool BeginPopup(const char* str_id); // return true if popup if opened and start outputting to it. only call EndPopup() if BeginPopup() returned true!
IMGUI_API bool BeginPopupModal(const char* name, bool* p_opened = NULL, ImGuiWindowFlags extra_flags = 0); // modal dialog (can't close them by clicking outside)
- IMGUI_API bool BeginPopupContextItem(const char* str_id, int mouse_button = 1); // helper to open and begin popup when clicked on last item
- IMGUI_API bool BeginPopupContextWindow(bool also_over_items = true, const char* str_id = NULL, int mouse_button = 1); // helper to open and begin popup when clicked on current window
- IMGUI_API bool BeginPopupContextVoid(const char* str_id = NULL, int mouse_button = 1); // helper to open and begin popup when clicked in void (no window)
+ IMGUI_API bool BeginPopupContextItem(const char* str_id, int mouse_button = 1); // helper to open and begin popup when clicked on last item. read comments in .cpp!
+ IMGUI_API bool BeginPopupContextWindow(bool also_over_items = true, const char* str_id = NULL, int mouse_button = 1); // helper to open and begin popup when clicked on current window.
+ IMGUI_API bool BeginPopupContextVoid(const char* str_id = NULL, int mouse_button = 1); // helper to open and begin popup when clicked in void (no window).
IMGUI_API void EndPopup();
IMGUI_API void CloseCurrentPopup(); // close the popup we have begin-ed into. clicking on a MenuItem or Selectable automatically close the current popup.
@@ -365,7 +368,7 @@ namespace ImGui
// Utilities
IMGUI_API bool IsItemHovered(); // was the last item hovered by mouse?
- IMGUI_API bool IsItemHoveredRect(); // was the last item hovered by mouse? even if another item is active while we are hovering this
+ IMGUI_API bool IsItemHoveredRect(); // was the last item hovered by mouse? even if another item is active or window is blocked by popup while we are hovering this
IMGUI_API bool IsItemActive(); // was the last item active? (e.g. button being held, text field being edited- items that don't interact will always return false)
IMGUI_API bool IsItemVisible(); // was the last item visible? (aka not out of sight due to clipping/scrolling.)
IMGUI_API bool IsAnyItemHovered();
@@ -491,6 +494,7 @@ enum ImGuiInputTextFlags_
ImGuiInputTextFlags_NoHorizontalScroll = 1 << 12, // Disable following the cursor horizontally
ImGuiInputTextFlags_AlwaysInsertMode = 1 << 13, // Insert mode
ImGuiInputTextFlags_ReadOnly = 1 << 14, // Read-only mode
+ ImGuiInputTextFlags_Password = 1 << 15, // Password mode, display all characters as '*'
// [Internal]
ImGuiInputTextFlags_Multiline = 1 << 20 // For internal use by InputTextMultiline()
};
@@ -591,7 +595,8 @@ enum ImGuiStyleVar_
ImGuiStyleVar_ItemSpacing, // ImVec2
ImGuiStyleVar_ItemInnerSpacing, // ImVec2
ImGuiStyleVar_IndentSpacing, // float
- ImGuiStyleVar_GrabMinSize // float
+ ImGuiStyleVar_GrabMinSize, // float
+ ImGuiStyleVar_ViewId // uint8_t
};
enum ImGuiAlign_
@@ -656,6 +661,7 @@ struct ImGuiStyle
float ScrollbarSize; // Width of the vertical scrollbar, Height of the horizontal scrollbar
float ScrollbarRounding; // Radius of grab corners for scrollbar
float GrabMinSize; // Minimum width/height of a grab box for slider/scrollbar
+ float ViewId;
float GrabRounding; // Radius of grabs corners rounding. Set to 0.0f to have rectangular slider grabs.
ImVec2 DisplayWindowPadding; // Window positions are clamped to be visible within the display area by at least this amount. Only covers regular windows.
ImVec2 DisplaySafeAreaPadding; // If you cannot see the edge of your screen (e.g. on a TV) increase the safe area padding. Covers popups/tooltips as well regular windows.
@@ -734,8 +740,9 @@ struct ImGuiIO
ImWchar InputCharacters[16+1]; // List of characters input (translated by user from keypress+keyboard state). Fill using AddInputCharacter() helper.
// Functions
- IMGUI_API void AddInputCharacter(ImWchar c); // Helper to add a new character into InputCharacters[]
- IMGUI_API void AddInputCharactersUTF8(const char* utf8_chars); // Helper to add new characters into InputCharacters[] from an UTF-8 string
+ IMGUI_API void AddInputCharacter(ImWchar c); // Helper to add a new character into InputCharacters[]
+ IMGUI_API void AddInputCharactersUTF8(const char* utf8_chars); // Helper to add new characters into InputCharacters[] from an UTF-8 string
+ IMGUI_API void ClearInputCharacters() { InputCharacters[0] = 0; } // Helper to clear the text input buffer
//------------------------------------------------------------------
// Output - Retrieve after calling NewFrame(), you can use them to discard inputs or hide them from the rest of your application
@@ -826,8 +833,8 @@ public:
inline void push_back(const value_type& v) { if (Size == Capacity) reserve(_grow_capacity(Size+1)); Data[Size++] = v; }
inline void pop_back() { IM_ASSERT(Size > 0); Size--; }
- inline iterator erase(const_iterator it) { IM_ASSERT(it >= begin() && it < end()); const ptrdiff_t off = it - begin(); memmove(Data + off, Data + off + 1, ((size_t)Size - (size_t)off - 1) * sizeof(value_type)); Size--; return Data + off; }
- inline iterator insert(const_iterator it, const value_type& v) { IM_ASSERT(it >= begin() && it <= end()); const ptrdiff_t off = it - begin(); if (Size == Capacity) reserve(Capacity ? Capacity * 2 : 4); if (off < (int)Size) memmove(Data + off + 1, Data + off, ((size_t)Size - (size_t)off) * sizeof(value_type)); Data[off] = v; Size++; return Data + off; }
+ inline iterator erase(const_iterator it) { IM_ASSERT(it >= Data && it < Data+Size); const ptrdiff_t off = it - Data; memmove(Data + off, Data + off + 1, ((size_t)Size - (size_t)off - 1) * sizeof(value_type)); Size--; return Data + off; }
+ inline iterator insert(const_iterator it, const value_type& v) { IM_ASSERT(it >= Data && it <= Data+Size); const ptrdiff_t off = it - Data; if (Size == Capacity) reserve(Capacity ? Capacity * 2 : 4); if (off < (int)Size) memmove(Data + off + 1, Data + off, ((size_t)Size - (size_t)off) * sizeof(value_type)); Data[off] = v; Size++; return Data + off; }
};
// Helper: execute a block of code once a frame only
@@ -887,7 +894,7 @@ struct ImGuiTextBuffer
const char* begin() const { return &Buf.front(); }
const char* end() const { return &Buf.back(); } // Buf is zero-terminated, so end() will point on the zero-terminator
int size() const { return Buf.Size - 1; }
- bool empty() { return Buf.Size >= 2; }
+ bool empty() { return Buf.Size <= 1; }
void clear() { Buf.clear(); Buf.push_back(0); }
const char* c_str() const { return Buf.Data; }
IMGUI_API void append(const char* fmt, ...) IM_PRINTFARGS(2);
@@ -970,12 +977,15 @@ struct ImColor
{
ImVec4 Value;
+ ImColor() { Value.x = Value.y = Value.z = Value.w = 0.0f; }
ImColor(int r, int g, int b, int a = 255) { float sc = 1.0f/255.0f; Value.x = (float)r * sc; Value.y = (float)g * sc; Value.z = (float)b * sc; Value.w = (float)a * sc; }
ImColor(ImU32 rgba) { float sc = 1.0f/255.0f; Value.x = (float)(rgba&0xFF) * sc; Value.y = (float)((rgba>>8)&0xFF) * sc; Value.z = (float)((rgba>>16)&0xFF) * sc; Value.w = (float)(rgba >> 24) * sc; }
ImColor(float r, float g, float b, float a = 1.0f) { Value.x = r; Value.y = g; Value.z = b; Value.w = a; }
ImColor(const ImVec4& col) { Value = col; }
- operator ImU32() const { return ImGui::ColorConvertFloat4ToU32(Value); }
- operator ImVec4() const { return Value; }
+ inline operator ImU32() const { return ImGui::ColorConvertFloat4ToU32(Value); }
+ inline operator ImVec4() const { return Value; }
+
+ inline void SetHSV(float h, float s, float v, float a = 1.0f){ ImGui::ColorConvertHSVtoRGB(h, s, v, Value.x, Value.y, Value.z); Value.w = a; }
static ImColor HSV(float h, float s, float v, float a = 1.0f) { float r,g,b; ImGui::ColorConvertHSVtoRGB(h, s, v, r, g, b); return ImColor(r,g,b,a); }
};
@@ -1037,8 +1047,9 @@ struct ImDrawCmd
ImTextureID TextureId; // User-provided texture ID. Set by user in ImfontAtlas::SetTexID() for fonts or passed to Image*() functions. Ignore if never using images or multiple fonts atlas.
ImDrawCallback UserCallback; // If != NULL, call the function instead of rendering the vertices. clip_rect and texture_id will be set normally.
void* UserCallbackData; // The draw callback code can access this.
+ unsigned char ViewId;
- ImDrawCmd() { ElemCount = 0; ClipRect.x = ClipRect.y = -8192.0f; ClipRect.z = ClipRect.w = +8192.0f; TextureId = NULL; UserCallback = NULL; UserCallbackData = NULL; }
+ ImDrawCmd() { ElemCount = 0; ClipRect.x = ClipRect.y = -8192.0f; ClipRect.z = ClipRect.w = +8192.0f; TextureId = NULL; UserCallback = NULL; UserCallbackData = NULL; ViewId = 0; }
};
// Vertex index (override with, e.g. '#define ImDrawIdx unsigned int' in ImConfig)
@@ -1097,9 +1108,7 @@ struct ImDrawList
ImDrawList() { _OwnerName = NULL; Clear(); }
~ImDrawList() { ClearFreeMemory(); }
- IMGUI_API void Clear();
- IMGUI_API void ClearFreeMemory();
- IMGUI_API void PushClipRect(const ImVec4& clip_rect); // Scissoring. The values are x1, y1, x2, y2.
+ IMGUI_API void PushClipRect(const ImVec4& clip_rect); // Scissoring. The values are x1, y1, x2, y2. Only apply to rendering. Prefer using higher-level ImGui::PushClipRect() to affect logic (hit-testing and widget culling)
IMGUI_API void PushClipRectFullScreen();
IMGUI_API void PopClipRect();
IMGUI_API void PushTextureID(const ImTextureID& texture_id);
@@ -1107,8 +1116,8 @@ struct ImDrawList
// Primitives
IMGUI_API void AddLine(const ImVec2& a, const ImVec2& b, ImU32 col, float thickness = 1.0f);
- IMGUI_API void AddRect(const ImVec2& a, const ImVec2& b, ImU32 col, float rounding = 0.0f, int rounding_corners = 0x0F);
- IMGUI_API void AddRectFilled(const ImVec2& a, const ImVec2& b, ImU32 col, float rounding = 0.0f, int rounding_corners = 0x0F);
+ IMGUI_API void AddRect(const ImVec2& a, const ImVec2& b, ImU32 col, float rounding = 0.0f, int rounding_corners = 0x0F); // a: upper-left, b: lower-right
+ IMGUI_API void AddRectFilled(const ImVec2& a, const ImVec2& b, ImU32 col, float rounding = 0.0f, int rounding_corners = 0x0F); // a: upper-left, b: lower-right
IMGUI_API void AddRectFilledMultiColor(const ImVec2& a, const ImVec2& b, ImU32 col_upr_left, ImU32 col_upr_right, ImU32 col_bot_right, ImU32 col_bot_left);
IMGUI_API void AddTriangleFilled(const ImVec2& a, const ImVec2& b, const ImVec2& c, ImU32 col);
IMGUI_API void AddCircle(const ImVec2& centre, float radius, ImU32 col, int num_segments = 12);
@@ -1144,6 +1153,8 @@ struct ImDrawList
// Internal helpers
// NB: all primitives needs to be reserved via PrimReserve() beforehand!
+ IMGUI_API void Clear();
+ IMGUI_API void ClearFreeMemory();
IMGUI_API void PrimReserve(int idx_count, int vtx_count);
IMGUI_API void PrimRect(const ImVec2& a, const ImVec2& b, ImU32 col);
IMGUI_API void PrimRectUV(const ImVec2& a, const ImVec2& b, const ImVec2& uv_a, const ImVec2& uv_b, ImU32 col);
diff --git a/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui_demo.cpp b/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui_demo.cpp
index 838070dd93c..5f734abb1e7 100644
--- a/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui_demo.cpp
+++ b/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui_demo.cpp
@@ -1,5 +1,5 @@
-// ImGui library v1.47 WIP
-// Demo code
+// dear imgui, v1.48 WIP
+// (demo code)
// Don't remove this file from your project! It is useful reference code that you can execute.
// You can call ImGui::ShowTestWindow() in your code to learn about various features of ImGui.
@@ -10,10 +10,15 @@
#endif
#include "imgui.h"
-#include <ctype.h> // toupper, isprint
-#include <math.h> // sqrtf, fabsf, fmodf, powf, cosf, sinf, floorf, ceilf
-#include <stdio.h> // vsnprintf, sscanf, printf
-#include <stdint.h> // intptr_t
+#include <ctype.h> // toupper, isprint
+#include <math.h> // sqrtf, fabsf, fmodf, powf, cosf, sinf, floorf, ceilf
+#include <stdio.h> // vsnprintf, sscanf, printf
+#include <stdlib.h> // NULL, malloc, free, qsort, atoi
+#if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier
+#include <stddef.h> // intptr_t
+#else
+#include <stdint.h> // intptr_t
+#endif
#ifdef _MSC_VER
#pragma warning (disable: 4996) // 'This function or variable may be unsafe': strcpy, strdup, sprintf, vsnprintf, sscanf, fopen
@@ -47,6 +52,7 @@
static void ShowExampleAppConsole(bool* opened);
static void ShowExampleAppLog(bool* opened);
static void ShowExampleAppLayout(bool* opened);
+static void ShowExampleAppPropertyEditor(bool* opened);
static void ShowExampleAppLongText(bool* opened);
static void ShowExampleAppAutoResize(bool* opened);
static void ShowExampleAppFixedOverlay(bool* opened);
@@ -85,34 +91,41 @@ void ImGui::ShowUserGuide()
}
// Demonstrate most ImGui features (big function!)
-void ImGui::ShowTestWindow(bool* opened)
+void ImGui::ShowTestWindow(bool* p_opened)
{
// Examples apps
- static bool show_app_metrics = false;
static bool show_app_main_menu_bar = false;
static bool show_app_console = false;
static bool show_app_log = false;
static bool show_app_layout = false;
+ static bool show_app_property_editor = false;
static bool show_app_long_text = false;
static bool show_app_auto_resize = false;
static bool show_app_fixed_overlay = false;
- static bool show_app_custom_rendering = false;
static bool show_app_manipulating_window_title = false;
+ static bool show_app_custom_rendering = false;
+ static bool show_app_style_editor = false;
+
+ static bool show_app_metrics = false;
static bool show_app_about = false;
- if (show_app_metrics) ImGui::ShowMetricsWindow(&show_app_metrics);
+
if (show_app_main_menu_bar) ShowExampleAppMainMenuBar();
if (show_app_console) ShowExampleAppConsole(&show_app_console);
if (show_app_log) ShowExampleAppLog(&show_app_log);
if (show_app_layout) ShowExampleAppLayout(&show_app_layout);
+ if (show_app_property_editor) ShowExampleAppPropertyEditor(&show_app_property_editor);
if (show_app_long_text) ShowExampleAppLongText(&show_app_long_text);
if (show_app_auto_resize) ShowExampleAppAutoResize(&show_app_auto_resize);
if (show_app_fixed_overlay) ShowExampleAppFixedOverlay(&show_app_fixed_overlay);
if (show_app_manipulating_window_title) ShowExampleAppManipulatingWindowTitle(&show_app_manipulating_window_title);
if (show_app_custom_rendering) ShowExampleAppCustomRendering(&show_app_custom_rendering);
+
+ if (show_app_metrics) ImGui::ShowMetricsWindow(&show_app_metrics);
+ if (show_app_style_editor) { ImGui::Begin("Style Editor", &show_app_style_editor); ImGui::ShowStyleEditor(); ImGui::End(); }
if (show_app_about)
{
ImGui::Begin("About ImGui", &show_app_about, ImGuiWindowFlags_AlwaysAutoResize);
- ImGui::Text("ImGui %s", ImGui::GetVersion());
+ ImGui::Text("dear imgui, %s", ImGui::GetVersion());
ImGui::Separator();
ImGui::Text("By Omar Cornut and all github contributors.");
ImGui::Text("ImGui is licensed under the MIT License, see LICENSE for more information.");
@@ -126,7 +139,7 @@ void ImGui::ShowTestWindow(bool* opened)
static bool no_scrollbar = false;
static bool no_collapse = false;
static bool no_menu = false;
- static float bg_alpha = 0.65f;
+ static float bg_alpha = -0.01f; // <0: default
// Demonstrate the various window flags. Typically you would just use the default.
ImGuiWindowFlags window_flags = 0;
@@ -137,7 +150,7 @@ void ImGui::ShowTestWindow(bool* opened)
if (no_scrollbar) window_flags |= ImGuiWindowFlags_NoScrollbar;
if (no_collapse) window_flags |= ImGuiWindowFlags_NoCollapse;
if (!no_menu) window_flags |= ImGuiWindowFlags_MenuBar;
- if (!ImGui::Begin("ImGui Demo", opened, ImVec2(550,680), bg_alpha, window_flags))
+ if (!ImGui::Begin("ImGui Demo", p_opened, ImVec2(550,680), bg_alpha, window_flags))
{
// Early out if the window is collapsed, as an optimization.
ImGui::End();
@@ -147,7 +160,7 @@ void ImGui::ShowTestWindow(bool* opened)
//ImGui::PushItemWidth(ImGui::GetWindowWidth() * 0.65f); // 2/3 of the space for widget and 1/3 for labels
ImGui::PushItemWidth(-140); // Right align, keep 140 pixels for labels
- ImGui::Text("ImGui says hello.");
+ ImGui::Text("Dear ImGui says hello.");
// Menu
if (ImGui::BeginMenuBar())
@@ -163,6 +176,7 @@ void ImGui::ShowTestWindow(bool* opened)
ImGui::MenuItem("Console", NULL, &show_app_console);
ImGui::MenuItem("Log", NULL, &show_app_log);
ImGui::MenuItem("Simple layout", NULL, &show_app_layout);
+ ImGui::MenuItem("Property editor", NULL, &show_app_property_editor);
ImGui::MenuItem("Long text display", NULL, &show_app_long_text);
ImGui::MenuItem("Auto-resizing window", NULL, &show_app_auto_resize);
ImGui::MenuItem("Simple overlay", NULL, &show_app_fixed_overlay);
@@ -173,6 +187,7 @@ void ImGui::ShowTestWindow(bool* opened)
if (ImGui::BeginMenu("Help"))
{
ImGui::MenuItem("Metrics", NULL, &show_app_metrics);
+ ImGui::MenuItem("Style Editor", NULL, &show_app_style_editor);
ImGui::MenuItem("About ImGui", NULL, &show_app_about);
ImGui::EndMenu();
}
@@ -188,14 +203,17 @@ void ImGui::ShowTestWindow(bool* opened)
if (ImGui::CollapsingHeader("Window options"))
{
- ImGui::Checkbox("no titlebar", &no_titlebar); ImGui::SameLine(150);
- ImGui::Checkbox("no border", &no_border); ImGui::SameLine(300);
- ImGui::Checkbox("no resize", &no_resize);
- ImGui::Checkbox("no move", &no_move); ImGui::SameLine(150);
- ImGui::Checkbox("no scrollbar", &no_scrollbar); ImGui::SameLine(300);
- ImGui::Checkbox("no collapse", &no_collapse);
- ImGui::Checkbox("no menu", &no_menu);
- ImGui::SliderFloat("bg alpha", &bg_alpha, 0.0f, 1.0f);
+ ImGui::Checkbox("No titlebar", &no_titlebar); ImGui::SameLine(150);
+ ImGui::Checkbox("No border", &no_border); ImGui::SameLine(300);
+ ImGui::Checkbox("No resize", &no_resize);
+ ImGui::Checkbox("No move", &no_move); ImGui::SameLine(150);
+ ImGui::Checkbox("No scrollbar", &no_scrollbar); ImGui::SameLine(300);
+ ImGui::Checkbox("No collapse", &no_collapse);
+ ImGui::Checkbox("No menu", &no_menu);
+
+ ImGui::PushItemWidth(100);
+ ImGui::DragFloat("Window Fill Alpha", &bg_alpha, 0.005f, -0.01f, 1.0f, bg_alpha < 0.0f ? "(default)" : "%.3f"); // Not exposing zero here so user doesn't "lose" the UI (zero alpha clips all widgets). But application code could have a toggle to switch between zero and non-zero.
+ ImGui::PopItemWidth();
if (ImGui::TreeNode("Style"))
{
@@ -205,7 +223,8 @@ void ImGui::ShowTestWindow(bool* opened)
if (ImGui::TreeNode("Fonts", "Fonts (%d)", ImGui::GetIO().Fonts->Fonts.Size))
{
- ImGui::TextWrapped("Tip: Load fonts with io.Fonts->AddFontFromFileTTF().");
+ ImGui::SameLine();
+ ShowHelpMarker("Tip: Load fonts with io.Fonts->AddFontFromFileTTF()\nbefore calling io.Fonts->GetTex* functions.");
ImFontAtlas* atlas = ImGui::GetIO().Fonts;
if (ImGui::TreeNode("Atlas texture", "Atlas texture (%dx%d pixels)", atlas->TexWidth, atlas->TexHeight))
{
@@ -217,7 +236,7 @@ void ImGui::ShowTestWindow(bool* opened)
{
ImFont* font = atlas->Fonts[i];
ImGui::BulletText("Font %d: \'%s\', %.2f px, %d glyphs", i, font->ConfigData ? font->ConfigData[0].Name : "", font->FontSize, font->Glyphs.Size);
- ImGui::TreePush((void*)intptr_t(i));
+ ImGui::TreePush((void*)(intptr_t)i);
if (i > 0) { ImGui::SameLine(); if (ImGui::SmallButton("Set as default")) { atlas->Fonts[i] = atlas->Fonts[0]; atlas->Fonts[0] = font; } }
ImGui::PushFont(font);
ImGui::Text("The quick brown fox jumps over the lazy dog");
@@ -228,7 +247,10 @@ void ImGui::ShowTestWindow(bool* opened)
ImGui::Text("Ascent: %f, Descent: %f, Height: %f", font->Ascent, font->Descent, font->Ascent - font->Descent);
ImGui::Text("Fallback character: '%c' (%d)", font->FallbackChar, font->FallbackChar);
for (int config_i = 0; config_i < font->ConfigDataCount; config_i++)
- ImGui::BulletText("Input %d: \'%s\'", config_i, font->ConfigData[config_i].Name);
+ {
+ ImFontConfig* cfg = &font->ConfigData[config_i];
+ ImGui::BulletText("Input %d: \'%s\'\nOversample: (%d,%d), PixelSnapH: %d", config_i, cfg->Name, cfg->OversampleH, cfg->OversampleV, cfg->PixelSnapH);
+ }
ImGui::TreePop();
}
ImGui::TreePop();
@@ -255,7 +277,7 @@ void ImGui::ShowTestWindow(bool* opened)
{
for (int i = 0; i < 5; i++)
{
- if (ImGui::TreeNode((void*)intptr_t(i), "Child %d", i))
+ if (ImGui::TreeNode((void*)(intptr_t)i, "Child %d", i))
{
ImGui::Text("blah blah");
ImGui::SameLine();
@@ -417,6 +439,13 @@ void ImGui::ShowTestWindow(bool* opened)
static char buf5[64] = ""; ImGui::InputText("no blank", buf5, 64, ImGuiInputTextFlags_CharsNoBlank);
struct TextFilters { static int FilterImGuiLetters(ImGuiTextEditCallbackData* data) { if (data->EventChar < 256 && strchr("imgui", (char)data->EventChar)) return 0; return 1; } };
static char buf6[64] = ""; ImGui::InputText("\"imgui\" letters", buf6, 64, ImGuiInputTextFlags_CallbackCharFilter, TextFilters::FilterImGuiLetters);
+
+ ImGui::Text("Password input");
+ static char bufpass[64] = "password123";
+ ImGui::InputText("password", bufpass, 64, ImGuiInputTextFlags_Password);
+ ImGui::SameLine(); ShowHelpMarker("Display all characters as '*'.\nDisable clipboard cut and copy.\nDisable logging.\n");
+ ImGui::InputText("password (clear)", bufpass, 64);
+
ImGui::TreePop();
}
@@ -679,13 +708,15 @@ void ImGui::ShowTestWindow(bool* opened)
if (ImGui::CollapsingHeader("Graphs widgets"))
{
+ static bool animate = true;
+ ImGui::Checkbox("Animate", &animate);
+
static float arr[] = { 0.6f, 0.1f, 1.0f, 0.5f, 0.92f, 0.1f, 0.2f };
ImGui::PlotLines("Frame Times", arr, IM_ARRAYSIZE(arr));
- static bool pause;
static ImVector<float> values; if (values.empty()) { values.resize(90); memset(values.Data, 0, values.Size*sizeof(float)); }
static int values_offset = 0;
- if (!pause)
+ if (animate)
{
static float refresh_time = ImGui::GetTime(); // Create dummy data at fixed 60 hz rate for the demo
for (; ImGui::GetTime() > refresh_time + 1.0f/60.0f; refresh_time += 1.0f/60.0f)
@@ -696,12 +727,7 @@ void ImGui::ShowTestWindow(bool* opened)
phase += 0.10f*values_offset;
}
}
- ImGui::PlotLines("##Lines", values.Data, values.Size, values_offset, "avg 0.0", -1.0f, 1.0f, ImVec2(0,80));
- ImGui::SameLine(0, ImGui::GetStyle().ItemInnerSpacing.x);
- ImGui::BeginGroup();
- ImGui::Text("Lines");
- ImGui::Checkbox("pause", &pause);
- ImGui::EndGroup();
+ ImGui::PlotLines("Lines", values.Data, values.Size, values_offset, "avg 0.0", -1.0f, 1.0f, ImVec2(0,80));
ImGui::PlotHistogram("Histogram", arr, IM_ARRAYSIZE(arr), 0, NULL, 0.0f, 1.0f, ImVec2(0,80));
// Use functions to generate output
@@ -719,6 +745,26 @@ void ImGui::ShowTestWindow(bool* opened)
float (*func)(void*, int) = (func_type == 0) ? Funcs::Sin : Funcs::Saw;
ImGui::PlotLines("Lines", func, NULL, display_count, 0, NULL, -1.0f, 1.0f, ImVec2(0,80));
ImGui::PlotHistogram("Histogram", func, NULL, display_count, 0, NULL, -1.0f, 1.0f, ImVec2(0,80));
+ ImGui::Separator();
+
+ // Animate a simple progress bar
+ static float progress = 0.0f, progress_dir = 1.0f;
+ if (animate)
+ {
+ progress += progress_dir * 0.4f * ImGui::GetIO().DeltaTime;
+ if (progress >= +1.1f) { progress = +1.1f; progress_dir *= -1.0f; }
+ if (progress <= -0.1f) { progress = -0.1f; progress_dir *= -1.0f; }
+ }
+
+ // Typically we would use ImVec2(-1.0f,0.0f) to use all available width, or ImVec2(width,0.0f) for a specified width. ImVec2(0.0f,0.0f) uses ItemWidth.
+ ImGui::ProgressBar(progress, ImVec2(0.0f,0.0f));
+ ImGui::SameLine(0.0f, ImGui::GetStyle().ItemInnerSpacing.x);
+ ImGui::Text("Progress Bar");
+
+ float progress_saturated = (progress < 0.0f) ? 0.0f : (progress > 1.0f) ? 1.0f : progress;
+ char buf[32];
+ sprintf(buf, "%d/%d", (int)(progress_saturated*1753), 1753);
+ ImGui::ProgressBar(progress, ImVec2(0.f,0.f), buf);
}
if (ImGui::CollapsingHeader("Layout"))
@@ -763,7 +809,7 @@ void ImGui::ShowTestWindow(bool* opened)
ImGui::TreePop();
}
- if (ImGui::TreeNode("Widgets Alignment"))
+ if (ImGui::TreeNode("Widgets Width"))
{
static float f = 0.0f;
ImGui::Text("PushItemWidth(100)");
@@ -934,6 +980,26 @@ void ImGui::ShowTestWindow(bool* opened)
ImGui::Text("Widget"); ImGui::SameLine();
ImGui::SmallButton("Widget");
+ // Tree
+ const float spacing = ImGui::GetStyle().ItemInnerSpacing.x;
+ ImGui::Button("Button##1");
+ ImGui::SameLine(0.0f, spacing);
+ if (ImGui::TreeNode("Node##1")) { for (int i = 0; i < 6; i++) ImGui::BulletText("Item %d..", i); ImGui::TreePop(); } // Dummy tree data
+
+ ImGui::AlignFirstTextHeightToWidgets(); // Vertically align text node a bit lower so it'll be vertically centered with upcoming widget. Otherwise you can use SmallButton (smaller fit).
+ bool tree_opened = ImGui::TreeNode("Node##2"); // Common mistake to avoid: if we want to SameLine after TreeNode we need to do it before we add child content.
+ ImGui::SameLine(0.0f, spacing); ImGui::Button("Button##2");
+ if (tree_opened) { for (int i = 0; i < 6; i++) ImGui::BulletText("Item %d..", i); ImGui::TreePop(); } // Dummy tree data
+
+ // Bullet
+ ImGui::Button("Button##3");
+ ImGui::SameLine(0.0f, spacing);
+ ImGui::BulletText("Bullet text");
+
+ ImGui::AlignFirstTextHeightToWidgets();
+ ImGui::BulletText("Node");
+ ImGui::SameLine(0.0f, spacing); ImGui::Button("Button##4");
+
ImGui::TreePop();
}
@@ -953,7 +1019,7 @@ void ImGui::ShowTestWindow(bool* opened)
if (i > 0) ImGui::SameLine();
ImGui::BeginGroup();
ImGui::Text("%s", i == 0 ? "Top" : i == 1 ? "25%" : i == 2 ? "Center" : i == 3 ? "75%" : "Bottom");
- ImGui::BeginChild(ImGui::GetID((void*)intptr_t(i)), ImVec2(ImGui::GetWindowWidth() * 0.17f, 200.0f), true);
+ ImGui::BeginChild(ImGui::GetID((void*)(intptr_t)i), ImVec2(ImGui::GetWindowWidth() * 0.17f, 200.0f), true);
if (scroll_to)
ImGui::SetScrollFromPosY(ImGui::GetCursorStartPos().y + scroll_to_px, i * 0.25f);
for (int line = 0; line < 100; line++)
@@ -1022,13 +1088,13 @@ void ImGui::ShowTestWindow(bool* opened)
static ImVec2 size(100, 100), offset(50, 20);
ImGui::TextWrapped("On a per-widget basis we are occasionally clipping text CPU-side if it won't fit in its frame. Otherwise we are doing coarser clipping + passing a scissor rectangle to the renderer. The system is designed to try minimizing both execution and CPU/GPU rendering cost.");
ImGui::DragFloat2("size", (float*)&size, 0.5f, 0.0f, 200.0f, "%.0f");
- ImGui::DragFloat2("offset", (float*)&offset, 0.5f, -200, 200.0f, "%.0f");
+ ImGui::TextWrapped("(Click and drag)");
ImVec2 pos = ImGui::GetCursorScreenPos();
ImVec4 clip_rect(pos.x, pos.y, pos.x+size.x, pos.y+size.y);
- ImGui::GetWindowDrawList()->AddRectFilled(pos, ImVec2(pos.x+size.x,pos.y+size.y), ImColor(90,90,120,255));
- ImGui::GetWindowDrawList()->AddText(ImGui::GetWindowFont(), ImGui::GetWindowFontSize()*2.0f, ImVec2(pos.x+offset.x,pos.y+offset.y), ImColor(255,255,255,255), "Line 1 hello\nLine 2 clip me!", NULL, 0.0f, &clip_rect);
ImGui::InvisibleButton("##dummy", size);
if (ImGui::IsItemActive() && ImGui::IsMouseDragging()) { offset.x += ImGui::GetIO().MouseDelta.x; offset.y += ImGui::GetIO().MouseDelta.y; }
+ ImGui::GetWindowDrawList()->AddRectFilled(pos, ImVec2(pos.x+size.x,pos.y+size.y), ImColor(90,90,120,255));
+ ImGui::GetWindowDrawList()->AddText(ImGui::GetWindowFont(), ImGui::GetWindowFontSize()*2.0f, ImVec2(pos.x+offset.x,pos.y+offset.y), ImColor(255,255,255,255), "Line 1 hello\nLine 2 clip me!", NULL, 0.0f, &clip_rect);
ImGui::TreePop();
}
}
@@ -1098,14 +1164,20 @@ void ImGui::ShowTestWindow(bool* opened)
ImGui::EndPopup();
}
+ ImGui::Spacing();
ImGui::TextWrapped("Below we are testing adding menu items to a regular window. It's rather unusual but should work!");
ImGui::Separator();
+ // NB: As a quirk in this very specific example, we want to differentiate the parent of this menu from the parent of the various popup menus above.
+ // To do so we are encloding the items in a PushID()/PopID() block to make them two different menusets. If we don't, opening any popup above and hovering our menu here
+ // would open it. This is because once a menu is active, we allow to switch to a sibling menu by just hovering on it, which is the desired behavior for regular menus.
+ ImGui::PushID("foo");
ImGui::MenuItem("Menu item", "CTRL+M");
- if (ImGui::BeginMenu("Menu"))
+ if (ImGui::BeginMenu("Menu inside a regular window"))
{
ShowExampleMenuFile();
ImGui::EndMenu();
}
+ ImGui::PopID();
ImGui::Separator();
ImGui::TreePop();
@@ -1187,142 +1259,135 @@ void ImGui::ShowTestWindow(bool* opened)
if (ImGui::CollapsingHeader("Columns"))
{
// Basic columns
- ImGui::Text("Basic:");
- ImGui::Columns(4, "mycolumns");
- ImGui::Separator();
- ImGui::Text("ID"); ImGui::NextColumn();
- ImGui::Text("Name"); ImGui::NextColumn();
- ImGui::Text("Path"); ImGui::NextColumn();
- ImGui::Text("Flags"); ImGui::NextColumn();
- ImGui::Separator();
- const char* names[3] = { "One", "Two", "Three" };
- const char* paths[3] = { "/path/one", "/path/two", "/path/three" };
- static int selected = -1;
- for (int i = 0; i < 3; i++)
- {
- char label[32];
- sprintf(label, "%04d", i);
- if (ImGui::Selectable(label, selected == i, ImGuiSelectableFlags_SpanAllColumns))
- selected = i;
- ImGui::NextColumn();
- ImGui::Text(names[i]); ImGui::NextColumn();
- ImGui::Text(paths[i]); ImGui::NextColumn();
- ImGui::Text("...."); ImGui::NextColumn();
+ if (ImGui::TreeNode("Basic"))
+ {
+ ImGui::Columns(4, "mycolumns");
+ ImGui::Separator();
+ ImGui::Text("ID"); ImGui::NextColumn();
+ ImGui::Text("Name"); ImGui::NextColumn();
+ ImGui::Text("Path"); ImGui::NextColumn();
+ ImGui::Text("Flags"); ImGui::NextColumn();
+ ImGui::Separator();
+ const char* names[3] = { "One", "Two", "Three" };
+ const char* paths[3] = { "/path/one", "/path/two", "/path/three" };
+ static int selected = -1;
+ for (int i = 0; i < 3; i++)
+ {
+ char label[32];
+ sprintf(label, "%04d", i);
+ if (ImGui::Selectable(label, selected == i, ImGuiSelectableFlags_SpanAllColumns))
+ selected = i;
+ ImGui::NextColumn();
+ ImGui::Text(names[i]); ImGui::NextColumn();
+ ImGui::Text(paths[i]); ImGui::NextColumn();
+ ImGui::Text("...."); ImGui::NextColumn();
+ }
+ ImGui::Columns(1);
+ ImGui::Separator();
+ ImGui::TreePop();
}
- ImGui::Columns(1);
-
- ImGui::Separator();
- ImGui::Spacing();
// Scrolling columns
/*
- ImGui::Text("Scrolling:");
- ImGui::BeginChild("##header", ImVec2(0, ImGui::GetTextLineHeightWithSpacing()+ImGui::GetStyle().ItemSpacing.y));
- ImGui::Columns(3);
- ImGui::Text("ID"); ImGui::NextColumn();
- ImGui::Text("Name"); ImGui::NextColumn();
- ImGui::Text("Path"); ImGui::NextColumn();
- ImGui::Columns(1);
- ImGui::Separator();
- ImGui::EndChild();
- ImGui::BeginChild("##scrollingregion", ImVec2(0, 60));
- ImGui::Columns(3);
- for (int i = 0; i < 10; i++)
+ if (ImGui::TreeNode("Scrolling"))
{
- ImGui::Text("%04d", i); ImGui::NextColumn();
- ImGui::Text("Foobar"); ImGui::NextColumn();
- ImGui::Text("/path/foobar/%04d/", i); ImGui::NextColumn();
+ ImGui::BeginChild("##header", ImVec2(0, ImGui::GetTextLineHeightWithSpacing()+ImGui::GetStyle().ItemSpacing.y));
+ ImGui::Columns(3);
+ ImGui::Text("ID"); ImGui::NextColumn();
+ ImGui::Text("Name"); ImGui::NextColumn();
+ ImGui::Text("Path"); ImGui::NextColumn();
+ ImGui::Columns(1);
+ ImGui::Separator();
+ ImGui::EndChild();
+ ImGui::BeginChild("##scrollingregion", ImVec2(0, 60));
+ ImGui::Columns(3);
+ for (int i = 0; i < 10; i++)
+ {
+ ImGui::Text("%04d", i); ImGui::NextColumn();
+ ImGui::Text("Foobar"); ImGui::NextColumn();
+ ImGui::Text("/path/foobar/%04d/", i); ImGui::NextColumn();
+ }
+ ImGui::Columns(1);
+ ImGui::EndChild();
+ ImGui::TreePop();
}
- ImGui::Columns(1);
- ImGui::EndChild();
-
- ImGui::Separator();
- ImGui::Spacing();
*/
// Create multiple items in a same cell before switching to next column
- ImGui::Text("Mixed items:");
- ImGui::Columns(3, "mixed");
- ImGui::Separator();
-
- static int e = 0;
- ImGui::Text("Hello");
- ImGui::Button("Banana");
- ImGui::RadioButton("radio a", &e, 0);
- ImGui::NextColumn();
-
- ImGui::Text("ImGui");
- ImGui::Button("Apple");
- ImGui::RadioButton("radio b", &e, 1);
- static float foo = 1.0f;
- ImGui::InputFloat("red", &foo, 0.05f, 0, 3);
- ImGui::Text("An extra line here.");
- ImGui::NextColumn();
-
- ImGui::Text("Sailor");
- ImGui::Button("Corniflower");
- ImGui::RadioButton("radio c", &e, 2);
- static float bar = 1.0f;
- ImGui::InputFloat("blue", &bar, 0.05f, 0, 3);
- ImGui::NextColumn();
+ if (ImGui::TreeNode("Mixed items"))
+ {
+ ImGui::Columns(3, "mixed");
+ ImGui::Separator();
- if (ImGui::CollapsingHeader("Category A")) ImGui::Text("Blah blah blah"); ImGui::NextColumn();
- if (ImGui::CollapsingHeader("Category B")) ImGui::Text("Blah blah blah"); ImGui::NextColumn();
- if (ImGui::CollapsingHeader("Category C")) ImGui::Text("Blah blah blah"); ImGui::NextColumn();
- ImGui::Columns(1);
+ ImGui::Text("Hello");
+ ImGui::Button("Banana");
+ ImGui::NextColumn();
- ImGui::Separator();
- ImGui::Spacing();
+ ImGui::Text("ImGui");
+ ImGui::Button("Apple");
+ static float foo = 1.0f;
+ ImGui::InputFloat("red", &foo, 0.05f, 0, 3);
+ ImGui::Text("An extra line here.");
+ ImGui::NextColumn();
- // Tree items
- ImGui::Text("Tree items:");
- ImGui::Columns(2, "tree items");
- ImGui::Separator();
- if (ImGui::TreeNode("Hello")) { ImGui::BulletText("Sailor"); ImGui::TreePop(); } ImGui::NextColumn();
- if (ImGui::TreeNode("Bonjour")) { ImGui::BulletText("Marin"); ImGui::TreePop(); } ImGui::NextColumn();
- ImGui::Columns(1);
+ ImGui::Text("Sailor");
+ ImGui::Button("Corniflower");
+ static float bar = 1.0f;
+ ImGui::InputFloat("blue", &bar, 0.05f, 0, 3);
+ ImGui::NextColumn();
- ImGui::Separator();
- ImGui::Spacing();
+ if (ImGui::CollapsingHeader("Category A")) ImGui::Text("Blah blah blah"); ImGui::NextColumn();
+ if (ImGui::CollapsingHeader("Category B")) ImGui::Text("Blah blah blah"); ImGui::NextColumn();
+ if (ImGui::CollapsingHeader("Category C")) ImGui::Text("Blah blah blah"); ImGui::NextColumn();
+ ImGui::Columns(1);
+ ImGui::Separator();
+ ImGui::TreePop();
+ }
// Word wrapping
- ImGui::Text("Word-wrapping:");
- ImGui::Columns(2, "word-wrapping");
- ImGui::Separator();
- ImGui::TextWrapped("The quick brown fox jumps over the lazy dog.");
- ImGui::Text("Hello Left");
- ImGui::NextColumn();
- ImGui::TextWrapped("The quick brown fox jumps over the lazy dog.");
- ImGui::Text("Hello Right");
- ImGui::Columns(1);
-
- ImGui::Separator();
- ImGui::Spacing();
+ if (ImGui::TreeNode("Word-wrapping"))
+ {
+ ImGui::Columns(2, "word-wrapping");
+ ImGui::Separator();
+ ImGui::TextWrapped("The quick brown fox jumps over the lazy dog.");
+ ImGui::TextWrapped("Hello Left");
+ ImGui::NextColumn();
+ ImGui::TextWrapped("The quick brown fox jumps over the lazy dog.");
+ ImGui::TextWrapped("Hello Right");
+ ImGui::Columns(1);
+ ImGui::Separator();
+ ImGui::TreePop();
+ }
- if (ImGui::TreeNode("Inside a tree.."))
+ if (ImGui::TreeNode("Borders"))
{
- if (ImGui::TreeNode("node 1 (with borders)"))
+ static bool h_borders = true;
+ static bool v_borders = true;
+ ImGui::Checkbox("horizontal", &h_borders);
+ ImGui::SameLine();
+ ImGui::Checkbox("vertical", &v_borders);
+ ImGui::Columns(4, NULL, v_borders);
+ if (h_borders) ImGui::Separator();
+ for (int i = 0; i < 8; i++)
{
- ImGui::Columns(4);
- for (int i = 0; i < 8; i++)
- {
- ImGui::Text("%c%c%c", 'a'+i, 'a'+i, 'a'+i);
- ImGui::NextColumn();
- }
- ImGui::Columns(1);
- ImGui::TreePop();
- }
- if (ImGui::TreeNode("node 2 (without borders)"))
- {
- ImGui::Columns(4, NULL, false);
- for (int i = 0; i < 8; i++)
- {
- ImGui::Text("%c%c%c", 'a'+i, 'a'+i, 'a'+i);
- ImGui::NextColumn();
- }
- ImGui::Columns(1);
- ImGui::TreePop();
+ ImGui::Text("%c%c%c", 'a'+i, 'a'+i, 'a'+i);
+ ImGui::NextColumn();
}
+ ImGui::Columns(1);
+ if (h_borders) ImGui::Separator();
+ ImGui::TreePop();
+ }
+
+ bool node_opened = ImGui::TreeNode("Tree within single cell");
+ ImGui::SameLine(); ShowHelpMarker("NB: Tree node must be poped before ending the cell.\nThere's no storage of state per-cell.");
+ if (node_opened)
+ {
+ ImGui::Columns(2, "tree items");
+ ImGui::Separator();
+ if (ImGui::TreeNode("Hello")) { ImGui::BulletText("Sailor"); ImGui::TreePop(); } ImGui::NextColumn();
+ if (ImGui::TreeNode("Bonjour")) { ImGui::BulletText("Marin"); ImGui::TreePop(); } ImGui::NextColumn();
+ ImGui::Columns(1);
+ ImGui::Separator();
ImGui::TreePop();
}
}
@@ -1477,13 +1542,14 @@ void ImGui::ShowStyleEditor(ImGuiStyle* ref)
ImGui::PushItemWidth(100);
ImGui::DragFloat("Curve Tessellation Tolerance", &style.CurveTessellationTol, 0.02f, 0.10f, FLT_MAX, NULL, 2.0f);
if (style.CurveTessellationTol < 0.0f) style.CurveTessellationTol = 0.10f;
+ ImGui::DragFloat("Global Alpha", &style.Alpha, 0.005f, 0.20f, 1.0f, "%.2f"); // Not exposing zero here so user doesn't "lose" the UI (zero alpha clips all widgets). But application code could have a toggle to switch between zero and non-zero.
+ ImGui::DragFloat("Window Fill Alpha Default", &style.WindowFillAlphaDefault, 0.005f, 0.0f, 1.0f, "%.2f");
ImGui::PopItemWidth();
ImGui::TreePop();
}
if (ImGui::TreeNode("Sizes"))
{
- ImGui::SliderFloat("Alpha", &style.Alpha, 0.20f, 1.0f, "%.2f"); // Not exposing zero here so user doesn't "lose" the UI. But application code could have a toggle to switch between zero and non-zero.
ImGui::SliderFloat2("WindowPadding", (float*)&style.WindowPadding, 0.0f, 20.0f, "%.0f");
ImGui::SliderFloat("WindowRounding", &style.WindowRounding, 0.0f, 16.0f, "%.0f");
ImGui::SliderFloat("ChildWindowRounding", &style.ChildWindowRounding, 0.0f, 16.0f, "%.0f");
@@ -1504,7 +1570,7 @@ void ImGui::ShowStyleEditor(ImGuiStyle* ref)
{
static int output_dest = 0;
static bool output_only_modified = false;
- if (ImGui::Button("Output Colors"))
+ if (ImGui::Button("Copy Colors"))
{
if (output_dest == 0)
ImGui::LogToClipboard();
@@ -1697,7 +1763,7 @@ static void ShowExampleAppManipulatingWindowTitle(bool* opened)
static void ShowExampleAppCustomRendering(bool* opened)
{
- ImGui::SetNextWindowSize(ImVec2(300,350), ImGuiSetCond_FirstUseEver);
+ ImGui::SetNextWindowSize(ImVec2(350,560), ImGuiSetCond_FirstUseEver);
if (!ImGui::Begin("Example: Custom rendering", opened))
{
ImGui::End();
@@ -1707,59 +1773,88 @@ static void ShowExampleAppCustomRendering(bool* opened)
// Tip: If you do a lot of custom rendering, you probably want to use your own geometrical types and benefit of overloaded operators, etc.
// Define IM_VEC2_CLASS_EXTRA in imconfig.h to create implicit conversions between your types and ImVec2/ImVec4.
// ImGui defines overloaded operators but they are internal to imgui.cpp and not exposed outside (to avoid messing with your types)
- // In this example we aren't using the operators.
-
- static ImVector<ImVec2> points;
- static bool adding_line = false;
- if (ImGui::Button("Clear")) points.clear();
- if (points.Size >= 2) { ImGui::SameLine(); if (ImGui::Button("Undo")) { points.pop_back(); points.pop_back(); } }
- ImGui::Text("Left-click and drag to add lines");
- ImGui::Text("Right-click to undo");
-
+ // In this example we are not using the maths operators!
ImDrawList* draw_list = ImGui::GetWindowDrawList();
- // Here we are using InvisibleButton() as a convenience to 1) advance the cursor and 2) allows us to use IsItemHovered()
- // However you can draw directly and poll mouse/keyboard by yourself. You can manipulate the cursor using GetCursorPos() and SetCursorPos().
- // If you only use the ImDrawList API, you can notify the owner window of its extends by using SetCursorPos(max).
- ImVec2 canvas_pos = ImGui::GetCursorScreenPos(); // ImDrawList API uses screen coordinates!
- ImVec2 canvas_size = ImGui::GetContentRegionAvail(); // Resize canvas to what's available
- if (canvas_size.x < 50.0f) canvas_size.x = 50.0f;
- if (canvas_size.y < 50.0f) canvas_size.y = 50.0f;
- draw_list->AddRectFilledMultiColor(canvas_pos, ImVec2(canvas_pos.x + canvas_size.x, canvas_pos.y + canvas_size.y), ImColor(0,0,0), ImColor(255,0,0), ImColor(255,255,0), ImColor(0,255,0));
- draw_list->AddRect(canvas_pos, ImVec2(canvas_pos.x + canvas_size.x, canvas_pos.y + canvas_size.y), ImColor(255,255,255));
-
- draw_list->AddBezierCurve(ImVec2(canvas_pos.x+20,canvas_pos.y+20), ImVec2(canvas_pos.x+100,canvas_pos.y+20), ImVec2(canvas_pos.x+canvas_size.x-100,canvas_pos.y+canvas_size.y-20), ImVec2(canvas_pos.x+canvas_size.x-20,canvas_pos.y+canvas_size.y-20), ImColor(255,200,0), 5.0f);
-
- bool adding_preview = false;
- ImGui::InvisibleButton("canvas", canvas_size);
- if (ImGui::IsItemHovered())
+ // Primitives
+ ImGui::Text("Primitives");
+ static float sz = 36.0f;
+ static ImVec4 col = ImVec4(1.0f,1.0f,0.4f,1.0f);
+ ImGui::DragFloat("Size", &sz, 0.2f, 2.0f, 72.0f, "%.0f");
+ ImGui::ColorEdit3("Color", &col.x);
{
- ImVec2 mouse_pos_in_canvas = ImVec2(ImGui::GetIO().MousePos.x - canvas_pos.x, ImGui::GetIO().MousePos.y - canvas_pos.y);
- if (!adding_line && ImGui::IsMouseClicked(0))
- {
- points.push_back(mouse_pos_in_canvas);
- adding_line = true;
- }
- if (adding_line)
+ const ImVec2 p = ImGui::GetCursorScreenPos();
+ const ImU32 col32 = ImColor(col);
+ float x = p.x + 4.0f, y = p.y + 4.0f, spacing = 8.0f;
+ draw_list->AddCircle(ImVec2(x+sz*0.5f, y+sz*0.5f), sz*0.5f, col32, 32); x += sz+spacing;
+ draw_list->AddRect(ImVec2(x, y), ImVec2(x+sz, y+sz), col32); x += sz+spacing;
+ draw_list->AddRect(ImVec2(x, y), ImVec2(x+sz, y+sz), col32, 10.0f); x += sz+spacing;
+ draw_list->AddLine(ImVec2(x, y), ImVec2(x+sz, y ), col32); x += sz+spacing;
+ draw_list->AddLine(ImVec2(x, y), ImVec2(x+sz, y+sz), col32); x += sz+spacing;
+ draw_list->AddLine(ImVec2(x, y), ImVec2(x, y+sz), col32); x += spacing;
+ draw_list->AddBezierCurve(ImVec2(x, y), ImVec2(x+sz*1.3f,y+sz*0.3f), ImVec2(x+sz-sz*1.3f,y+sz-sz*0.3f), ImVec2(x+sz, y+sz), col32, 1.0f);
+ x = p.x + 4;
+ y += sz+spacing;
+ draw_list->AddCircleFilled(ImVec2(x+sz*0.5f, y+sz*0.5f), sz*0.5f, col32, 32); x += sz+spacing;
+ draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x+sz, y+sz), col32); x += sz+spacing;
+ draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x+sz, y+sz), col32, 10.0f); x += sz+spacing;
+ draw_list->AddLine(ImVec2(x, y), ImVec2(x+sz, y ), col32, 4.0f); x += sz+spacing;
+ draw_list->AddLine(ImVec2(x, y), ImVec2(x+sz, y+sz), col32, 4.0f); x += sz+spacing;
+ draw_list->AddLine(ImVec2(x, y), ImVec2(x, y+sz), col32, 4.0f); x += spacing;
+ draw_list->AddBezierCurve(ImVec2(x, y), ImVec2(x+sz*1.3f,y+sz*0.3f), ImVec2(x+sz-sz*1.3f,y+sz-sz*0.3f), ImVec2(x+sz, y+sz), col32, 4.0f); x += sz+spacing;
+ draw_list->AddRectFilledMultiColor(ImVec2(x, y), ImVec2(x+sz, y+sz), ImColor(0,0,0), ImColor(255,0,0), ImColor(255,255,0), ImColor(0,255,0));
+ ImGui::Dummy(ImVec2((sz+spacing)*8, (sz+spacing)*2));
+ }
+ ImGui::Separator();
+ {
+ static ImVector<ImVec2> points;
+ static bool adding_line = false;
+ ImGui::Text("Canvas example");
+ if (ImGui::Button("Clear")) points.clear();
+ if (points.Size >= 2) { ImGui::SameLine(); if (ImGui::Button("Undo")) { points.pop_back(); points.pop_back(); } }
+ ImGui::Text("Left-click and drag to add lines,\nRight-click to undo");
+
+ // Here we are using InvisibleButton() as a convenience to 1) advance the cursor and 2) allows us to use IsItemHovered()
+ // However you can draw directly and poll mouse/keyboard by yourself. You can manipulate the cursor using GetCursorPos() and SetCursorPos().
+ // If you only use the ImDrawList API, you can notify the owner window of its extends by using SetCursorPos(max).
+ ImVec2 canvas_pos = ImGui::GetCursorScreenPos(); // ImDrawList API uses screen coordinates!
+ ImVec2 canvas_size = ImGui::GetContentRegionAvail(); // Resize canvas to what's available
+ if (canvas_size.x < 50.0f) canvas_size.x = 50.0f;
+ if (canvas_size.y < 50.0f) canvas_size.y = 50.0f;
+ draw_list->AddRectFilledMultiColor(canvas_pos, ImVec2(canvas_pos.x + canvas_size.x, canvas_pos.y + canvas_size.y), ImColor(50,50,50), ImColor(50,50,60), ImColor(60,60,70), ImColor(50,50,60));
+ draw_list->AddRect(canvas_pos, ImVec2(canvas_pos.x + canvas_size.x, canvas_pos.y + canvas_size.y), ImColor(255,255,255));
+
+ bool adding_preview = false;
+ ImGui::InvisibleButton("canvas", canvas_size);
+ if (ImGui::IsItemHovered())
{
- adding_preview = true;
- points.push_back(mouse_pos_in_canvas);
- if (!ImGui::GetIO().MouseDown[0])
+ ImVec2 mouse_pos_in_canvas = ImVec2(ImGui::GetIO().MousePos.x - canvas_pos.x, ImGui::GetIO().MousePos.y - canvas_pos.y);
+ if (!adding_line && ImGui::IsMouseClicked(0))
+ {
+ points.push_back(mouse_pos_in_canvas);
+ adding_line = true;
+ }
+ if (adding_line)
+ {
+ adding_preview = true;
+ points.push_back(mouse_pos_in_canvas);
+ if (!ImGui::GetIO().MouseDown[0])
+ adding_line = adding_preview = false;
+ }
+ if (ImGui::IsMouseClicked(1) && !points.empty())
+ {
adding_line = adding_preview = false;
+ points.pop_back();
+ points.pop_back();
+ }
}
- if (ImGui::IsMouseClicked(1) && !points.empty())
- {
- adding_line = adding_preview = false;
+ draw_list->PushClipRect(ImVec4(canvas_pos.x, canvas_pos.y, canvas_pos.x+canvas_size.x, canvas_pos.y+canvas_size.y)); // clip lines within the canvas (if we resize it, etc.)
+ for (int i = 0; i < points.Size - 1; i += 2)
+ draw_list->AddLine(ImVec2(canvas_pos.x + points[i].x, canvas_pos.y + points[i].y), ImVec2(canvas_pos.x + points[i+1].x, canvas_pos.y + points[i+1].y), 0xFF00FFFF, 2.0f);
+ draw_list->PopClipRect();
+ if (adding_preview)
points.pop_back();
- points.pop_back();
- }
}
- draw_list->PushClipRect(ImVec4(canvas_pos.x, canvas_pos.y, canvas_pos.x+canvas_size.x, canvas_pos.y+canvas_size.y)); // clip lines within the canvas (if we resize it, etc.)
- for (int i = 0; i < points.Size - 1; i += 2)
- draw_list->AddLine(ImVec2(canvas_pos.x + points[i].x, canvas_pos.y + points[i].y), ImVec2(canvas_pos.x + points[i+1].x, canvas_pos.y + points[i+1].y), 0xFF00FFFF, 2.0f);
- draw_list->PopClipRect();
- if (adding_preview)
- points.pop_back();
ImGui::End();
}
@@ -1776,6 +1871,7 @@ struct ExampleAppConsole
ExampleAppConsole()
{
ClearLog();
+ memset(InputBuf, 0, sizeof(InputBuf));
HistoryPos = -1;
Commands.push_back("HELP");
Commands.push_back("HISTORY");
@@ -1877,7 +1973,7 @@ struct ExampleAppConsole
// Demonstrate keeping auto focus on the input box
if (ImGui::IsItemHovered() || (ImGui::IsRootWindowOrAnyChildFocused() && !ImGui::IsAnyItemActive() && !ImGui::IsMouseClicked(0)))
- ImGui::SetKeyboardFocusHere(-1); // Auto focus
+ ImGui::SetKeyboardFocusHere(-1); // Auto focus previous widget
ImGui::End();
}
@@ -2161,6 +2257,78 @@ static void ShowExampleAppLayout(bool* opened)
ImGui::End();
}
+static void ShowExampleAppPropertyEditor(bool* p_opened)
+{
+ ImGui::SetNextWindowSize(ImVec2(430,450), ImGuiSetCond_FirstUseEver);
+ if (!ImGui::Begin("Example: Property editor", p_opened))
+ {
+ ImGui::End();
+ return;
+ }
+
+ ShowHelpMarker("This example shows how you may implement a property editor using two columns.\nAll objects/fields data are dummies here.\nRemember that in many simple cases, you can use ImGui::SameLine(xxx) to position\nyour cursor horizontally instead of using the Columns() API.");
+
+ ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(2,2));
+ ImGui::Columns(2);
+ ImGui::Separator();
+
+ struct funcs
+ {
+ static void ShowDummyObject(const char* prefix, ImU32 uid)
+ {
+ ImGui::PushID(uid); // Use object uid as identifier. Most commonly you could also use the object pointer as a base ID.
+ ImGui::AlignFirstTextHeightToWidgets(); // Text and Tree nodes are less high than regular widgets, here we add vertical spacing to make the tree lines equal high.
+ bool opened = ImGui::TreeNode("Object", "%s_%u", prefix, uid);
+ ImGui::NextColumn();
+ ImGui::AlignFirstTextHeightToWidgets();
+ ImGui::Text("my sailor is rich");
+ ImGui::NextColumn();
+ if (opened)
+ {
+ static float dummy_members[8] = { 0.0f,0.0f,1.0f,3.1416f,100.0f,999.0f };
+ for (int i = 0; i < 8; i++)
+ {
+ ImGui::PushID(i); // Use field index as identifier.
+ if (i < 2)
+ {
+ ShowDummyObject("Child", ImGui::GetID("foo"));
+ }
+ else
+ {
+ ImGui::AlignFirstTextHeightToWidgets();
+ // Here we use a Selectable (instead of Text) to highlight on hover
+ //ImGui::Text("Field_%d", i);
+ char label[32];
+ sprintf(label, "Field_%d", i);
+ ImGui::Bullet();
+ ImGui::Selectable(label);
+ ImGui::NextColumn();
+ ImGui::PushItemWidth(-1);
+ if (i >= 5)
+ ImGui::InputFloat("##value", &dummy_members[i], 1.0f);
+ else
+ ImGui::DragFloat("##value", &dummy_members[i], 0.01f);
+ ImGui::PopItemWidth();
+ ImGui::NextColumn();
+ }
+ ImGui::PopID();
+ }
+ ImGui::TreePop();
+ }
+ ImGui::PopID();
+ }
+ };
+
+ // Iterate dummy objects with dummy members (all the same data)
+ for (int obj_i = 0; obj_i < 3; obj_i++)
+ funcs::ShowDummyObject("Object", obj_i);
+
+ ImGui::Columns(1);
+ ImGui::Separator();
+ ImGui::PopStyleVar();
+ ImGui::End();
+}
+
static void ShowExampleAppLongText(bool* opened)
{
ImGui::SetNextWindowSize(ImVec2(520,600), ImGuiSetCond_FirstUseEver);
diff --git a/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui_draw.cpp b/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui_draw.cpp
index 5baae31170e..b5d25eaa0be 100644
--- a/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui_draw.cpp
+++ b/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui_draw.cpp
@@ -1,5 +1,5 @@
-// ImGui library v1.47 WIP
-// Drawing and font code
+// dear imgui, v1.48 WIP
+// (drawing and font code)
// Contains implementation for
// - ImDrawList
@@ -19,7 +19,7 @@
#include <stdio.h> // vsnprintf, sscanf, printf
#include <new> // new (ptr)
#if !defined(alloca) && !defined(__FreeBSD__)
-#if _WIN32
+#ifdef _WIN32
#include <malloc.h> // alloca
#else
#include <alloca.h> // alloca
@@ -31,6 +31,14 @@
#pragma warning (disable: 4996) // 'This function or variable may be unsafe': strcpy, strdup, sprintf, vsnprintf, sscanf, fopen
#define snprintf _snprintf
#endif
+
+#ifdef __clang__
+#pragma clang diagnostic ignored "-Wold-style-cast" // warning : use of old-style cast // yes, they are more terse.
+#pragma clang diagnostic ignored "-Wfloat-equal" // warning : comparing floating point with == or != is unsafe // storing and comparing against same constants ok.
+#pragma clang diagnostic ignored "-Wglobal-constructors" // warning : declaration requires a global destructor // similar to above, not sure what the exact difference it.
+#pragma clang diagnostic ignored "-Wsign-conversion" // warning : implicit conversion changes signedness //
+#pragma clang diagnostic ignored "-Wreserved-id-macro" // warning : macro name is a reserved identifier //
+#endif
#ifdef __GNUC__
#pragma GCC diagnostic ignored "-Wunused-function" // warning: 'xxxx' defined but not used
#endif
@@ -55,6 +63,7 @@ namespace IMGUI_STB_NAMESPACE
#ifdef __clang__
#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wold-style-cast" // warning : use of old-style cast // yes, they are more terse.
#pragma clang diagnostic ignored "-Wunused-function"
#pragma clang diagnostic ignored "-Wmissing-prototypes"
#endif
@@ -94,7 +103,7 @@ using namespace IMGUI_STB_NAMESPACE;
// ImDrawList
//-----------------------------------------------------------------------------
-static ImVec4 GNullClipRect(-8192.0f, -8192.0f, +8192.0f, +8192.0f); // Large values that are easy to encode in a few bits+shift
+static const ImVec4 GNullClipRect(-8192.0f, -8192.0f, +8192.0f, +8192.0f); // Large values that are easy to encode in a few bits+shift
void ImDrawList::Clear()
{
@@ -134,11 +143,16 @@ void ImDrawList::ClearFreeMemory()
_Channels.clear();
}
+// Use macros because C++ is a terrible language, we want guaranteed inline, no code in header, and no overhead in Debug mode
+#define GetCurrentClipRect() (_ClipRectStack.Size ? _ClipRectStack.Data[_ClipRectStack.Size-1] : GNullClipRect)
+#define GetCurrentTextureId() (_TextureIdStack.Size ? _TextureIdStack.Data[_TextureIdStack.Size-1] : NULL)
+
void ImDrawList::AddDrawCmd()
{
ImDrawCmd draw_cmd;
- draw_cmd.ClipRect = _ClipRectStack.Size ? _ClipRectStack.back() : GNullClipRect;
- draw_cmd.TextureId = _TextureIdStack.Size ? _TextureIdStack.back() : NULL;
+ draw_cmd.ClipRect = GetCurrentClipRect();
+ draw_cmd.TextureId = GetCurrentTextureId();
+ draw_cmd.ViewId = (unsigned char)(GImGui->Style.ViewId);
IM_ASSERT(draw_cmd.ClipRect.x <= draw_cmd.ClipRect.z && draw_cmd.ClipRect.y <= draw_cmd.ClipRect.w);
CmdBuffer.push_back(draw_cmd);
@@ -155,28 +169,53 @@ void ImDrawList::AddCallback(ImDrawCallback callback, void* callback_data)
current_cmd->UserCallback = callback;
current_cmd->UserCallbackData = callback_data;
- // Force a new command after us (we function this way so that the most common calls AddLine, AddRect, etc. always have a command to add to without doing any check).
- AddDrawCmd();
+ AddDrawCmd(); // Force a new command after us (see comment below)
}
+// Our scheme may appears a bit unusual, basically we want the most-common calls AddLine AddRect etc. to not have to perform any check so we always have a command ready in the stack.
+// The cost of figuring out if a new command has to be added or if we can merge is paid in those Update** functions only.
void ImDrawList::UpdateClipRect()
{
- ImDrawCmd* current_cmd = CmdBuffer.Size ? &CmdBuffer.back() : NULL;
- if (!current_cmd || (current_cmd->ElemCount != 0) || current_cmd->UserCallback != NULL)
+ // If current command is used with different settings we need to add a new command
+ const ImVec4 curr_clip_rect = GetCurrentClipRect();
+ ImDrawCmd* curr_cmd = CmdBuffer.Size > 0 ? &CmdBuffer.Data[CmdBuffer.Size-1] : NULL;
+ if (!curr_cmd || (curr_cmd->ElemCount != 0 && memcmp(&curr_cmd->ClipRect, &curr_clip_rect, sizeof(ImVec4)) != 0) || curr_cmd->UserCallback != NULL)
{
AddDrawCmd();
+ return;
}
+
+ // Try to merge with previous command if it matches, else use current command
+ ImDrawCmd* prev_cmd = CmdBuffer.Size > 1 ? curr_cmd - 1 : NULL;
+ if (prev_cmd && memcmp(&prev_cmd->ClipRect, &curr_clip_rect, sizeof(ImVec4)) == 0 && prev_cmd->TextureId == GetCurrentTextureId() && prev_cmd->UserCallback == NULL)
+ CmdBuffer.pop_back();
else
+ curr_cmd->ClipRect = curr_clip_rect;
+}
+
+void ImDrawList::UpdateTextureID()
+{
+ // If current command is used with different settings we need to add a new command
+ const ImTextureID curr_texture_id = GetCurrentTextureId();
+ ImDrawCmd* curr_cmd = CmdBuffer.Size ? &CmdBuffer.back() : NULL;
+ if (!curr_cmd || (curr_cmd->ElemCount != 0 && curr_cmd->TextureId != curr_texture_id) || curr_cmd->UserCallback != NULL)
{
- ImVec4 current_clip_rect = _ClipRectStack.Size ? _ClipRectStack.back() : GNullClipRect;
- if (CmdBuffer.Size >= 2 && ImLengthSqr(CmdBuffer.Data[CmdBuffer.Size-2].ClipRect - current_clip_rect) < 0.00001f)
- CmdBuffer.pop_back();
- else
- current_cmd->ClipRect = current_clip_rect;
+ AddDrawCmd();
+ return;
}
+
+ // Try to merge with previous command if it matches, else use current command
+ ImDrawCmd* prev_cmd = CmdBuffer.Size > 1 ? curr_cmd - 1 : NULL;
+ if (prev_cmd && prev_cmd->TextureId == curr_texture_id && memcmp(&prev_cmd->ClipRect, &GetCurrentClipRect(), sizeof(ImVec4)) == 0 && prev_cmd->UserCallback == NULL)
+ CmdBuffer.pop_back();
+ else
+ curr_cmd->TextureId = curr_texture_id;
}
-// Scissoring. The values in clip_rect are x1, y1, x2, y2.
+#undef GetCurrentClipRect
+#undef GetCurrentTextureId
+
+// Scissoring. The values in clip_rect are x1, y1, x2, y2. Only apply to rendering! Prefer using higher-level ImGui::PushClipRect() to affect logic (hit-testing and widget culling)
void ImDrawList::PushClipRect(const ImVec4& clip_rect)
{
_ClipRectStack.push_back(clip_rect);
@@ -199,16 +238,6 @@ void ImDrawList::PopClipRect()
UpdateClipRect();
}
-void ImDrawList::UpdateTextureID()
-{
- ImDrawCmd* current_cmd = CmdBuffer.Size ? &CmdBuffer.back() : NULL;
- const ImTextureID texture_id = _TextureIdStack.Size ? _TextureIdStack.back() : NULL;
- if (!current_cmd || (current_cmd->ElemCount != 0 && current_cmd->TextureId != texture_id) || current_cmd->UserCallback != NULL)
- AddDrawCmd();
- else
- current_cmd->TextureId = texture_id;
-}
-
void ImDrawList::PushTextureID(const ImTextureID& texture_id)
{
_TextureIdStack.push_back(texture_id);
@@ -250,6 +279,7 @@ void ImDrawList::ChannelsSplit(int channels_count)
ImDrawCmd draw_cmd;
draw_cmd.ClipRect = _ClipRectStack.back();
draw_cmd.TextureId = _TextureIdStack.back();
+ draw_cmd.ViewId = (unsigned char)(GImGui->Style.ViewId);
_Channels[i].CmdBuffer.push_back(draw_cmd);
}
}
@@ -743,11 +773,12 @@ void ImDrawList::AddLine(const ImVec2& a, const ImVec2& b, ImU32 col, float thic
PathStroke(col, false, thickness);
}
+// a: upper-left, b: lower-right. we don't render 1 px sized rectangles properly.
void ImDrawList::AddRect(const ImVec2& a, const ImVec2& b, ImU32 col, float rounding, int rounding_corners)
{
if ((col >> 24) == 0)
return;
- PathRect(a + ImVec2(0.5f,0.5f), b + ImVec2(0.5f,0.5f), rounding, rounding_corners);
+ PathRect(a + ImVec2(0.5f,0.5f), b - ImVec2(0.5f,0.5f), rounding, rounding_corners);
PathStroke(col, true);
}
@@ -799,7 +830,7 @@ void ImDrawList::AddCircle(const ImVec2& centre, float radius, ImU32 col, int nu
return;
const float a_max = IM_PI*2.0f * ((float)num_segments - 1.0f) / (float)num_segments;
- PathArcTo(centre, radius, 0.0f, a_max, num_segments);
+ PathArcTo(centre, radius-0.5f, 0.0f, a_max, num_segments);
PathStroke(col, true);
}
@@ -1155,7 +1186,7 @@ ImFont* ImFontAtlas::AddFontFromMemoryCompressedTTF(const void* compressed_ttf_d
ImFont* ImFontAtlas::AddFontFromMemoryCompressedBase85TTF(const char* compressed_ttf_data_base85, float size_pixels, const ImFontConfig* font_cfg, const ImWchar* glyph_ranges)
{
int compressed_ttf_size = (((int)strlen(compressed_ttf_data_base85) + 4) / 5) * 4;
- void* compressed_ttf = ImGui::MemAlloc(compressed_ttf_size);
+ void* compressed_ttf = ImGui::MemAlloc((size_t)compressed_ttf_size);
Decode85((const unsigned char*)compressed_ttf_data_base85, (unsigned char*)compressed_ttf);
ImFont* font = AddFontFromMemoryCompressedTTF(compressed_ttf, compressed_ttf_size, size_pixels, font_cfg, glyph_ranges);
ImGui::MemFree(compressed_ttf);
@@ -1533,25 +1564,27 @@ const ImWchar* ImFontAtlas::GetGlyphRangesJapanese()
19,3,8,0,0,0,4,4,16,0,4,1,5,1,3,0,3,4,6,2,17,10,10,31,6,4,3,6,10,126,7,3,2,2,0,9,0,0,5,20,13,0,15,0,6,0,2,5,8,64,50,3,2,12,2,9,0,0,11,8,20,
109,2,18,23,0,0,9,61,3,0,28,41,77,27,19,17,81,5,2,14,5,83,57,252,14,154,263,14,20,8,13,6,57,39,38,
};
- static int ranges_unpacked = false;
- static ImWchar ranges[8 + IM_ARRAYSIZE(offsets_from_0x4E00)*2 + 1] =
+ static ImWchar base_ranges[] =
{
0x0020, 0x00FF, // Basic Latin + Latin Supplement
0x3000, 0x30FF, // Punctuations, Hiragana, Katakana
0x31F0, 0x31FF, // Katakana Phonetic Extensions
0xFF00, 0xFFEF, // Half-width characters
};
- if (!ranges_unpacked)
+ static bool full_ranges_unpacked = false;
+ static ImWchar full_ranges[IM_ARRAYSIZE(base_ranges) + IM_ARRAYSIZE(offsets_from_0x4E00)*2 + 1];
+ if (!full_ranges_unpacked)
{
// Unpack
int codepoint = 0x4e00;
- ImWchar* dst = &ranges[8];
+ memcpy(full_ranges, base_ranges, sizeof(base_ranges));
+ ImWchar* dst = full_ranges + IM_ARRAYSIZE(base_ranges);;
for (int n = 0; n < IM_ARRAYSIZE(offsets_from_0x4E00); n++, dst += 2)
dst[0] = dst[1] = (ImWchar)(codepoint += (offsets_from_0x4E00[n] + 1));
dst[0] = 0;
- ranges_unpacked = true;
+ full_ranges_unpacked = true;
}
- return &ranges[0];
+ return &full_ranges[0];
}
const ImWchar* ImFontAtlas::GetGlyphRangesCyrillic()
diff --git a/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui_internal.h b/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui_internal.h
index 8e266b627c5..3c028c38cb8 100644
--- a/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui_internal.h
+++ b/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui_internal.h
@@ -1,7 +1,7 @@
-// ImGui library v1.47 WIP
-// Internals
-// You may use this file to debug, understand or extend ImGui features but we don't provide any guarantee of forward compatibility!
+// dear imgui, v1.48 WIP
+// (internals)
+// You may use this file to debug, understand or extend ImGui features but we don't provide any guarantee of forward compatibility!
// Implement maths operators for ImVec2 (disabled by default to not collide with using IM_VEC2_CLASS_EXTRA along with your own math types+operators)
// #define IMGUI_DEFINE_MATH_OPERATORS
@@ -117,7 +117,7 @@ static inline ImVec2& operator+=(ImVec2& lhs, const ImVec2& rhs)
static inline ImVec2& operator-=(ImVec2& lhs, const ImVec2& rhs) { lhs.x -= rhs.x; lhs.y -= rhs.y; return lhs; }
static inline ImVec2& operator*=(ImVec2& lhs, const float rhs) { lhs.x *= rhs; lhs.y *= rhs; return lhs; }
static inline ImVec2& operator/=(ImVec2& lhs, const float rhs) { lhs.x /= rhs; lhs.y /= rhs; return lhs; }
-static inline ImVec4 operator-(const ImVec4& lhs, const ImVec4& rhs) { return ImVec4(lhs.x-rhs.x, lhs.y-rhs.y, lhs.z-rhs.z, lhs.w-lhs.w); }
+static inline ImVec4 operator-(const ImVec4& lhs, const ImVec4& rhs) { return ImVec4(lhs.x-rhs.x, lhs.y-rhs.y, lhs.z-rhs.z, lhs.w-rhs.w); }
#endif
static inline int ImMin(int lhs, int rhs) { return lhs < rhs ? lhs : rhs; }
@@ -161,7 +161,7 @@ enum ImGuiTreeNodeFlags_
enum ImGuiSliderFlags_
{
- ImGuiSliderFlags_Vertical = 1 << 0,
+ ImGuiSliderFlags_Vertical = 1 << 0
};
enum ImGuiSelectableFlagsPrivate_
@@ -196,33 +196,33 @@ enum ImGuiDataType
// NB: we can't rely on ImVec2 math operators being available here
struct IMGUI_API ImRect
{
- ImVec2 Min; // Upper-left
- ImVec2 Max; // Lower-right
+ ImVec2 Min; // Upper-left
+ ImVec2 Max; // Lower-right
ImRect() : Min(FLT_MAX,FLT_MAX), Max(-FLT_MAX,-FLT_MAX) {}
ImRect(const ImVec2& min, const ImVec2& max) : Min(min), Max(max) {}
ImRect(const ImVec4& v) : Min(v.x, v.y), Max(v.z, v.w) {}
ImRect(float x1, float y1, float x2, float y2) : Min(x1, y1), Max(x2, y2) {}
- ImVec2 GetCenter() const { return ImVec2((Min.x+Max.x)*0.5f, (Min.y+Max.y)*0.5f); }
- ImVec2 GetSize() const { return ImVec2(Max.x-Min.x, Max.y-Min.y); }
- float GetWidth() const { return Max.x-Min.x; }
- float GetHeight() const { return Max.y-Min.y; }
- ImVec2 GetTL() const { return Min; }
- ImVec2 GetTR() const { return ImVec2(Max.x, Min.y); }
- ImVec2 GetBL() const { return ImVec2(Min.x, Max.y); }
- ImVec2 GetBR() const { return Max; }
- bool Contains(const ImVec2& p) const { return p.x >= Min.x && p.y >= Min.y && p.x < Max.x && p.y < Max.y; }
- bool Contains(const ImRect& r) const { return r.Min.x >= Min.x && r.Min.y >= Min.y && r.Max.x < Max.x && r.Max.y < Max.y; }
- bool Overlaps(const ImRect& r) const { return r.Min.y < Max.y && r.Max.y > Min.y && r.Min.x < Max.x && r.Max.x > Min.x; }
- void Add(const ImVec2& rhs) { if (Min.x > rhs.x) Min.x = rhs.x; if (Min.y > rhs.y) Min.y = rhs.y; if (Max.x < rhs.x) Max.x = rhs.x; if (Max.y < rhs.y) Max.y = rhs.y; }
- void Add(const ImRect& rhs) { if (Min.x > rhs.Min.x) Min.x = rhs.Min.x; if (Min.y > rhs.Min.y) Min.y = rhs.Min.y; if (Max.x < rhs.Max.x) Max.x = rhs.Max.x; if (Max.y < rhs.Max.y) Max.y = rhs.Max.y; }
- void Expand(const float amount) { Min.x -= amount; Min.y -= amount; Max.x += amount; Max.y += amount; }
- void Expand(const ImVec2& amount) { Min.x -= amount.x; Min.y -= amount.y; Max.x += amount.x; Max.y += amount.y; }
- void Reduce(const ImVec2& amount) { Min.x += amount.x; Min.y += amount.y; Max.x -= amount.x; Max.y -= amount.y; }
- void Clip(const ImRect& clip) { if (Min.x < clip.Min.x) Min.x = clip.Min.x; if (Min.y < clip.Min.y) Min.y = clip.Min.y; if (Max.x > clip.Max.x) Max.x = clip.Max.x; if (Max.y > clip.Max.y) Max.y = clip.Max.y; }
- void Round() { Min.x = (float)(int)Min.x; Min.y = (float)(int)Min.y; Max.x = (float)(int)Max.x; Max.y = (float)(int)Max.y; }
- ImVec2 GetClosestPoint(ImVec2 p, bool on_edge) const
+ ImVec2 GetCenter() const { return ImVec2((Min.x+Max.x)*0.5f, (Min.y+Max.y)*0.5f); }
+ ImVec2 GetSize() const { return ImVec2(Max.x-Min.x, Max.y-Min.y); }
+ float GetWidth() const { return Max.x-Min.x; }
+ float GetHeight() const { return Max.y-Min.y; }
+ ImVec2 GetTL() const { return Min; } // Top-left
+ ImVec2 GetTR() const { return ImVec2(Max.x, Min.y); } // Top-right
+ ImVec2 GetBL() const { return ImVec2(Min.x, Max.y); } // Bottom-left
+ ImVec2 GetBR() const { return Max; } // Bottom-right
+ bool Contains(const ImVec2& p) const { return p.x >= Min.x && p.y >= Min.y && p.x < Max.x && p.y < Max.y; }
+ bool Contains(const ImRect& r) const { return r.Min.x >= Min.x && r.Min.y >= Min.y && r.Max.x < Max.x && r.Max.y < Max.y; }
+ bool Overlaps(const ImRect& r) const { return r.Min.y < Max.y && r.Max.y > Min.y && r.Min.x < Max.x && r.Max.x > Min.x; }
+ void Add(const ImVec2& rhs) { if (Min.x > rhs.x) Min.x = rhs.x; if (Min.y > rhs.y) Min.y = rhs.y; if (Max.x < rhs.x) Max.x = rhs.x; if (Max.y < rhs.y) Max.y = rhs.y; }
+ void Add(const ImRect& rhs) { if (Min.x > rhs.Min.x) Min.x = rhs.Min.x; if (Min.y > rhs.Min.y) Min.y = rhs.Min.y; if (Max.x < rhs.Max.x) Max.x = rhs.Max.x; if (Max.y < rhs.Max.y) Max.y = rhs.Max.y; }
+ void Expand(const float amount) { Min.x -= amount; Min.y -= amount; Max.x += amount; Max.y += amount; }
+ void Expand(const ImVec2& amount) { Min.x -= amount.x; Min.y -= amount.y; Max.x += amount.x; Max.y += amount.y; }
+ void Reduce(const ImVec2& amount) { Min.x += amount.x; Min.y += amount.y; Max.x -= amount.x; Max.y -= amount.y; }
+ void Clip(const ImRect& clip) { if (Min.x < clip.Min.x) Min.x = clip.Min.x; if (Min.y < clip.Min.y) Min.y = clip.Min.y; if (Max.x > clip.Max.x) Max.x = clip.Max.x; if (Max.y > clip.Max.y) Max.y = clip.Max.y; }
+ void Round() { Min.x = (float)(int)Min.x; Min.y = (float)(int)Min.y; Max.x = (float)(int)Max.x; Max.y = (float)(int)Max.y; }
+ ImVec2 GetClosestPoint(ImVec2 p, bool on_edge) const
{
if (!on_edge && Contains(p))
return p;
@@ -237,8 +237,8 @@ struct IMGUI_API ImRect
// Stacked color modifier, backup of modified data so we can restore it
struct ImGuiColMod
{
- ImGuiCol Col;
- ImVec4 PreviousValue;
+ ImGuiCol Col;
+ ImVec4 PreviousValue;
};
// Stacked style modifier, backup of modified data so we can restore it
@@ -251,27 +251,34 @@ struct ImGuiStyleMod
// Stacked data for BeginGroup()/EndGroup()
struct ImGuiGroupData
{
- ImVec2 BackupCursorPos;
- ImVec2 BackupCursorMaxPos;
- float BackupColumnsStartX;
- float BackupCurrentLineHeight;
- float BackupCurrentLineTextBaseOffset;
- float BackupLogLinePosY;
- bool AdvanceCursor;
+ ImVec2 BackupCursorPos;
+ ImVec2 BackupCursorMaxPos;
+ float BackupIndentX;
+ float BackupCurrentLineHeight;
+ float BackupCurrentLineTextBaseOffset;
+ float BackupLogLinePosY;
+ bool AdvanceCursor;
+};
+
+// Per column data for Columns()
+struct ImGuiColumnData
+{
+ float OffsetNorm; // Column start offset, normalized 0.0 (far left) -> 1.0 (far right)
+ //float IndentX;
};
-// Simple column measurement currently used for MenuItem() only. This is very short-sighted for now and not a generic helper.
+// Simple column measurement currently used for MenuItem() only. This is very short-sighted for now and NOT a generic helper.
struct IMGUI_API ImGuiSimpleColumns
{
- int Count;
- float Spacing;
- float Width, NextWidth;
- float Pos[8], NextWidths[8];
+ int Count;
+ float Spacing;
+ float Width, NextWidth;
+ float Pos[8], NextWidths[8];
ImGuiSimpleColumns();
- void Update(int count, float spacing, bool clear);
- float DeclColumns(float w0, float w1, float w2);
- float CalcExtraSpace(float avail_w);
+ void Update(int count, float spacing, bool clear);
+ float DeclColumns(float w0, float w1, float w2);
+ float CalcExtraSpace(float avail_w);
};
// Internal state of the currently focused/edited text input box
@@ -287,7 +294,6 @@ struct IMGUI_API ImGuiTextEditState
ImGuiStb::STB_TexteditState StbState;
float CursorAnim;
bool CursorFollow;
- ImVec2 InputCursorScreenPos; // Cursor position in screen space to be used by IME callback.
bool SelectedAllMouseLock;
ImGuiTextEditState() { memset(this, 0, sizeof(*this)); }
@@ -302,11 +308,11 @@ struct IMGUI_API ImGuiTextEditState
// Data saved in imgui.ini file
struct ImGuiIniData
{
- char* Name;
- ImGuiID ID;
- ImVec2 Pos;
- ImVec2 Size;
- bool Collapsed;
+ char* Name;
+ ImGuiID ID;
+ ImVec2 Pos;
+ ImVec2 Size;
+ bool Collapsed;
};
// Mouse cursor data (used when io.MouseDrawCursor is set)
@@ -322,11 +328,11 @@ struct ImGuiMouseCursorData
// Storage for current popup stack
struct ImGuiPopupRef
{
- ImGuiID PopupID; // Set on OpenPopup()
- ImGuiWindow* Window; // Resolved on BeginPopup() - may stay unresolved if user never calls OpenPopup()
- ImGuiWindow* ParentWindow; // Set on OpenPopup()
- ImGuiID ParentMenuSet; // Set on OpenPopup()
- ImVec2 MousePosOnOpen; // Copy of mouse position at the time of opening popup
+ ImGuiID PopupID; // Set on OpenPopup()
+ ImGuiWindow* Window; // Resolved on BeginPopup() - may stay unresolved if user never calls OpenPopup()
+ ImGuiWindow* ParentWindow; // Set on OpenPopup()
+ ImGuiID ParentMenuSet; // Set on OpenPopup()
+ ImVec2 MousePosOnOpen; // Copy of mouse position at the time of opening popup
ImGuiPopupRef(ImGuiID id, ImGuiWindow* parent_window, ImGuiID parent_menu_set, const ImVec2& mouse_pos) { PopupID = id; Window = NULL; ParentWindow = parent_window; ParentMenuSet = parent_menu_set; MousePosOnOpen = mouse_pos; }
};
@@ -354,13 +360,13 @@ struct ImGuiState
ImGuiWindow* HoveredWindow; // Will catch mouse inputs
ImGuiWindow* HoveredRootWindow; // Will catch mouse inputs (for focus/move only)
ImGuiID HoveredId; // Hovered widget
- bool HoveredIdAllowHoveringOthers;
+ bool HoveredIdAllowOverlap;
ImGuiID HoveredIdPreviousFrame;
ImGuiID ActiveId; // Active widget
ImGuiID ActiveIdPreviousFrame;
bool ActiveIdIsAlive;
bool ActiveIdIsJustActivated; // Set at the time of activation for one frame
- bool ActiveIdAllowHoveringOthers; // Set only by active widget
+ bool ActiveIdAllowOverlap; // Set only by active widget
ImGuiWindow* ActiveIdWindow;
ImGuiWindow* MovedWindow; // Track the child window we clicked on to move a window. Pointer is only valid if ActiveID is the "#MOVE" identifier of a window.
ImVector<ImGuiIniData> Settings; // .ini Settings
@@ -395,6 +401,7 @@ struct ImGuiState
// Widget state
ImGuiTextEditState InputTextState;
+ ImFont InputTextPasswordFont;
ImGuiID ScalarAsInputTextId; // Temporary text input when CTRL+clicking on a slider, etc.
ImGuiStorage ColorEditModeStorage; // Store user selection of color edit mode
ImVec2 ActiveClickDeltaToCenter;
@@ -406,6 +413,7 @@ struct ImGuiState
ImVec2 ScrollbarClickDeltaToGrabCenter; // Distance between mouse and center of grab box, normalized in parent space. Use storage?
char Tooltip[1024];
char* PrivateClipboard; // If no custom clipboard handler is defined
+ ImVec2 OsImePosRequest, OsImePosSet; // Cursor position request & last passed to the OS Input Method Editor
// Logging
bool LogEnabled;
@@ -437,13 +445,13 @@ struct ImGuiState
HoveredWindow = NULL;
HoveredRootWindow = NULL;
HoveredId = 0;
- HoveredIdAllowHoveringOthers = false;
+ HoveredIdAllowOverlap = false;
HoveredIdPreviousFrame = 0;
ActiveId = 0;
ActiveIdPreviousFrame = 0;
ActiveIdIsAlive = false;
ActiveIdIsJustActivated = false;
- ActiveIdAllowHoveringOthers = false;
+ ActiveIdAllowOverlap = false;
ActiveIdWindow = NULL;
MovedWindow = NULL;
SettingsDirtyTimer = 0.0f;
@@ -454,6 +462,7 @@ struct ImGuiState
SetNextWindowCollapsedVal = false;
SetNextWindowPosCond = 0;
SetNextWindowSizeCond = 0;
+ SetNextWindowContentSizeCond = 0;
SetNextWindowCollapsedCond = 0;
SetNextWindowFocus = false;
SetNextTreeNodeOpenedVal = false;
@@ -469,10 +478,12 @@ struct ImGuiState
ScrollbarClickDeltaToGrabCenter = ImVec2(0.0f, 0.0f);
memset(Tooltip, 0, sizeof(Tooltip));
PrivateClipboard = NULL;
+ OsImePosRequest = OsImePosSet = ImVec2(-1.0f, -1.0f);
ModalWindowDarkeningRatio = 0.0f;
OverlayDrawList._OwnerName = "##Overlay"; // Give it a name for debugging
MouseCursor = ImGuiMouseCursor_Arrow;
+ memset(MouseCursorData, 0, sizeof(MouseCursorData));
LogEnabled = false;
LogFile = NULL;
@@ -484,6 +495,7 @@ struct ImGuiState
FramerateSecPerFrameIdx = 0;
FramerateSecPerFrameAccum = 0.0f;
CaptureMouseNextFrame = CaptureKeyboardNextFrame = false;
+ memset(TempBuffer, 0, sizeof(TempBuffer));
}
};
@@ -503,8 +515,8 @@ struct IMGUI_API ImGuiDrawContext
int TreeDepth;
ImGuiID LastItemID;
ImRect LastItemRect;
- bool LastItemHoveredAndUsable;
- bool LastItemHoveredRect;
+ bool LastItemHoveredAndUsable; // Item rectangle is hovered, and its window is currently interactable with (not blocked by a popup preventing access to the window)
+ bool LastItemHoveredRect; // Item rectangle is hovered, but its window may or not be currently interactable with (might be blocked by a popup preventing access to the window)
bool MenuBarAppending;
float MenuBarOffsetX;
ImVector<ImGuiWindow*> ChildWindows;
@@ -524,16 +536,18 @@ struct IMGUI_API ImGuiDrawContext
ImGuiColorEditMode ColorEditMode;
int StackSizesBackup[6]; // Store size of various stacks for asserting
- float ColumnsStartX; // Indentation / start position from left of window (increased by TreePush/TreePop, etc.)
+ float IndentX; // Indentation / start position from left of window (increased by TreePush/TreePop, etc.)
float ColumnsOffsetX; // Offset to the current column (if ColumnsCurrent > 0). FIXME: This and the above should be a stack to allow use cases like Tree->Column->Tree. Need revamp columns API.
int ColumnsCurrent;
int ColumnsCount;
- ImVec2 ColumnsStartPos;
+ float ColumnsMinX;
+ float ColumnsMaxX;
+ float ColumnsStartPosY;
float ColumnsCellMinY;
float ColumnsCellMaxY;
bool ColumnsShowBorders;
ImGuiID ColumnsSetID;
- ImVector<float> ColumnsOffsetsT; // Columns offset normalized 0.0 (far left) -> 1.0 (far right)
+ ImVector<ImGuiColumnData> ColumnsData;
ImGuiDrawContext()
{
@@ -556,11 +570,12 @@ struct IMGUI_API ImGuiDrawContext
ColorEditMode = ImGuiColorEditMode_RGB;
memset(StackSizesBackup, 0, sizeof(StackSizesBackup));
- ColumnsStartX = 0.0f;
+ IndentX = 0.0f;
ColumnsOffsetX = 0.0f;
ColumnsCurrent = 0;
ColumnsCount = 1;
- ColumnsStartPos = ImVec2(0.0f, 0.0f);
+ ColumnsMinX = ColumnsMaxX = 0.0f;
+ ColumnsStartPosY = 0.0f;
ColumnsCellMinY = ColumnsCellMaxY = 0.0f;
ColumnsShowBorders = true;
ColumnsSetID = 0;
@@ -636,8 +651,6 @@ public:
ImRect TitleBarRect() const { return ImRect(Pos, ImVec2(Pos.x + SizeFull.x, Pos.y + TitleBarHeight())); }
float MenuBarHeight() const { return (Flags & ImGuiWindowFlags_MenuBar) ? CalcFontSize() + GImGui->Style.FramePadding.y * 2.0f : 0.0f; }
ImRect MenuBarRect() const { float y1 = Pos.y + TitleBarHeight(); return ImRect(Pos.x, y1, Pos.x + SizeFull.x, y1 + MenuBarHeight()); }
- ImU32 Color(ImGuiCol idx, float a=1.f) const { ImVec4 c = GImGui->Style.Colors[idx]; c.w *= GImGui->Style.Alpha * a; return ImGui::ColorConvertFloat4ToU32(c); }
- ImU32 Color(const ImVec4& col) const { ImVec4 c = col; c.w *= GImGui->Style.Alpha; return ImGui::ColorConvertFloat4ToU32(c); }
};
//-----------------------------------------------------------------------------
@@ -660,7 +673,7 @@ namespace ImGui
IMGUI_API void SetHoveredID(ImGuiID id);
IMGUI_API void KeepAliveID(ImGuiID id);
- IMGUI_API void EndFrame(); // This automatically called by Render()
+ IMGUI_API void EndFrame(); // Automatically called by Render()
IMGUI_API void ItemSize(const ImVec2& size, float text_offset_y = 0.0f);
IMGUI_API void ItemSize(const ImRect& bb, float text_offset_y = 0.0f);
@@ -671,8 +684,15 @@ namespace ImGui
IMGUI_API void FocusableItemUnregister(ImGuiWindow* window);
IMGUI_API ImVec2 CalcItemSize(ImVec2 size, float default_x, float default_y);
IMGUI_API float CalcWrapWidthForPos(const ImVec2& pos, float wrap_pos_x);
+ IMGUI_API void SetItemAllowOverlap(); // Allow last item to be overlapped by a subsequent item
+
+ IMGUI_API void OpenPopupEx(const char* str_id, bool reopen_existing);
+
+ inline IMGUI_API ImU32 GetColorU32(ImGuiCol idx, float alpha_mul) { ImVec4 c = GImGui->Style.Colors[idx]; c.w *= GImGui->Style.Alpha * alpha_mul; return ImGui::ColorConvertFloat4ToU32(c); }
+ inline IMGUI_API ImU32 GetColorU32(const ImVec4& col) { ImVec4 c = col; c.w *= GImGui->Style.Alpha; return ImGui::ColorConvertFloat4ToU32(c); }
// NB: All position are in absolute pixels coordinates (not window coordinates)
+ // FIXME: Refactor all RenderText* functions into one.
IMGUI_API void RenderText(ImVec2 pos, const char* text, const char* text_end = NULL, bool hide_text_after_hash = true);
IMGUI_API void RenderTextWrapped(ImVec2 pos, const char* text, const char* text_end, float wrap_width);
IMGUI_API void RenderTextClipped(const ImVec2& pos_min, const ImVec2& pos_max, const char* text, const char* text_end, const ImVec2* text_size_if_known, ImGuiAlign align = ImGuiAlign_Default, const ImVec2* clip_min = NULL, const ImVec2* clip_max = NULL);
@@ -680,6 +700,9 @@ namespace ImGui
IMGUI_API void RenderCollapseTriangle(ImVec2 p_min, bool opened, float scale = 1.0f, bool shadow = false);
IMGUI_API void RenderCheckMark(ImVec2 pos, ImU32 col);
+ IMGUI_API void PushClipRect(const ImVec2& clip_rect_min, const ImVec2& clip_rect_max, bool intersect_with_existing_clip_rect = true);
+ IMGUI_API void PopClipRect();
+
IMGUI_API bool ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool* out_held, ImGuiButtonFlags flags = 0);
IMGUI_API bool ButtonEx(const char* label, const ImVec2& size_arg = ImVec2(0,0), ImGuiButtonFlags flags = 0);
diff --git a/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui_wm.cpp b/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui_wm.cpp
index 2f27fc192d9..8551bc3da58 100644
--- a/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui_wm.cpp
+++ b/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui_wm.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
/*
@@ -16,7 +16,7 @@
#include <algorithm>
#define IMGUI_NEW(type) new (ImGui::MemAlloc(sizeof(type) ) ) type
-#define IMGUI_DELETE(type, obj) reinterpret_cast<type*>(obj)->~type(), ImGui::MemFree(obj)
+#define IMGUI_DELETE(type, obj) static_cast<type*>(obj)->~type(), ImGui::MemFree(obj)
#define IMGUI_DELETE_NULL(type, obj) for (;;) { if (NULL != obj) { IMGUI_DELETE(type, obj); obj = NULL; } break; }
namespace ImGuiWM
@@ -768,7 +768,6 @@ namespace ImGuiWM
//ImGui::PushStyleColor(ImGuiCol_ChildWindowBg, ImColor(59, 59, 59, 255));
ImGui::BeginChild((*itActiveWindow)->GetId(), ImVec2(0, 0), false, ImGuiWindowFlags_HorizontalScrollbar);
-
ImVec2 oWinPos = ImGui::GetWindowPos();
ImVec2 oWinSize = ImGui::GetWindowSize();
@@ -921,7 +920,7 @@ namespace ImGuiWM
void* pTemp = ImGui::GetInternalState();
m_pState = ImGui::MemAlloc(ImGui::GetInternalStateSize());
- ImGui::SetInternalState(m_pState, true);
+ ImGui::SetInternalState(m_pState, false);
ImGui::GetIO().IniFilename = NULL;
ImGui::SetInternalState(pTemp);
}
@@ -935,7 +934,7 @@ namespace ImGuiWM
{
ImGui::GetIO().Fonts = NULL;
}
- ImGui::Shutdown();
+
RestoreState();
ImGui::MemFree(m_pState);
}
@@ -977,7 +976,9 @@ namespace ImGuiWM
void PlatformWindow::Paint()
{
+ PaintBegin();
WindowManager::GetInstance()->Paint(this);
+ PaintEnd();
}
bool PlatformWindow::IsMain()
@@ -1343,7 +1344,7 @@ namespace ImGuiWM
m_lOrphanWindows.remove(pAction->m_pWindow);
- IMGUI_DELETE(PlatformWindowAction, pAction);
+ IMGUI_DELETE(DockAction, pAction);
m_lDockActions.erase(m_lDockActions.begin());
}
}
@@ -1385,13 +1386,10 @@ namespace ImGuiWM
}
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(5.0f, 5.0f));
-
char name[64];
ImFormatString(name, sizeof(name), "Window %p", pWindow);
ImGui::Begin(name, NULL, iFlags);
- pWindow->PaintBegin();
pWindow->PaintContainer();
- pWindow->PaintEnd();
ImGui::End();
ImGui::PopStyleVar(1);
diff --git a/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui_wm.h b/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui_wm.h
index 797f4a3f17f..ac8bf001a77 100644
--- a/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui_wm.h
+++ b/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui_wm.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
/*
diff --git a/3rdparty/bgfx/3rdparty/pvrtc/AlphaBitmap.h b/3rdparty/bgfx/3rdparty/pvrtc/AlphaBitmap.h
new file mode 100644
index 00000000000..41973320673
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/pvrtc/AlphaBitmap.h
@@ -0,0 +1,20 @@
+#pragma once
+
+#include "Bitmap.h"
+
+namespace Javelin {
+
+class AlphaBitmap : public Bitmap {
+public:
+ AlphaBitmap() {}
+
+ AlphaBitmap(int w, int h)
+ : Bitmap(w, h, 1) {
+ }
+
+ const unsigned char *GetData() const { return data; }
+
+ unsigned char *GetData() { return data; }
+};
+
+}
diff --git a/3rdparty/bgfx/3rdparty/pvrtc/BitScale.cpp b/3rdparty/bgfx/3rdparty/pvrtc/BitScale.cpp
new file mode 100644
index 00000000000..3e741934330
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/pvrtc/BitScale.cpp
@@ -0,0 +1,183 @@
+#include "BitScale.h"
+
+const uint8_t Javelin::Data::BITSCALE_5_TO_8[32] = {
+ 0, 8, 16, 24, 32, 41, 49, 57, 65, 74,
+ 82, 90, 98, 106, 115, 123, 131, 139, 148, 156,
+ 164, 172, 180, 189, 197, 205, 213, 222, 230, 238,
+ 246, 255};
+
+const uint8_t Javelin::Data::BITSCALE_4_TO_8[16] = {
+ 0, 17, 34, 51, 68, 85, 102, 119, 136, 153,
+ 170, 187, 204, 221, 238, 255};
+
+const uint8_t Javelin::Data::BITSCALE_3_TO_8[8] = {
+ 0, 36, 72, 109, 145, 182, 218, 255};
+
+const uint8_t Javelin::Data::BITSCALE_8_TO_5_FLOOR[256] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+ 1, 1, 1, 1, 1, 1, 1, 2, 2, 2,
+ 2, 2, 2, 2, 2, 3, 3, 3, 3, 3,
+ 3, 3, 3, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 5, 5, 5, 5, 5, 5, 5, 5,
+ 6, 6, 6, 6, 6, 6, 6, 6, 7, 7,
+ 7, 7, 7, 7, 7, 7, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 9, 9, 9, 9, 9,
+ 9, 9, 9, 10, 10, 10, 10, 10, 10, 10,
+ 10, 11, 11, 11, 11, 11, 11, 11, 11, 12,
+ 12, 12, 12, 12, 12, 12, 12, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 14, 14, 14, 14,
+ 14, 14, 14, 14, 15, 15, 15, 15, 15, 15,
+ 15, 15, 16, 16, 16, 16, 16, 16, 16, 16,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 18,
+ 18, 18, 18, 18, 18, 18, 18, 19, 19, 19,
+ 19, 19, 19, 19, 19, 20, 20, 20, 20, 20,
+ 20, 20, 20, 21, 21, 21, 21, 21, 21, 21,
+ 21, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 23, 23, 23, 23, 23, 23, 23, 23, 24, 24,
+ 24, 24, 24, 24, 24, 24, 25, 25, 25, 25,
+ 25, 25, 25, 25, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 27, 27, 27, 27, 27, 27, 27,
+ 27, 28, 28, 28, 28, 28, 28, 28, 28, 29,
+ 29, 29, 29, 29, 29, 29, 29, 30, 30, 30,
+ 30, 30, 30, 30, 30, 31};
+
+const uint8_t Javelin::Data::BITSCALE_8_TO_4_FLOOR[256] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 15};
+
+const uint8_t Javelin::Data::BITSCALE_8_TO_3_FLOOR[256] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 7};
+
+const uint8_t Javelin::Data::BITSCALE_8_TO_5_CEIL[256] = {
+ 0, 1, 1, 1, 1, 1, 1, 1, 1, 2,
+ 2, 2, 2, 2, 2, 2, 2, 3, 3, 3,
+ 3, 3, 3, 3, 3, 4, 4, 4, 4, 4,
+ 4, 4, 4, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 6, 6, 6, 6, 6, 6, 6, 6,
+ 7, 7, 7, 7, 7, 7, 7, 7, 8, 8,
+ 8, 8, 8, 8, 8, 8, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 10, 10, 10, 10, 10,
+ 10, 10, 10, 11, 11, 11, 11, 11, 11, 11,
+ 11, 12, 12, 12, 12, 12, 12, 12, 12, 13,
+ 13, 13, 13, 13, 13, 13, 13, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 15, 15, 15, 15,
+ 15, 15, 15, 15, 16, 16, 16, 16, 16, 16,
+ 16, 16, 17, 17, 17, 17, 17, 17, 17, 17,
+ 18, 18, 18, 18, 18, 18, 18, 18, 18, 19,
+ 19, 19, 19, 19, 19, 19, 19, 20, 20, 20,
+ 20, 20, 20, 20, 20, 21, 21, 21, 21, 21,
+ 21, 21, 21, 22, 22, 22, 22, 22, 22, 22,
+ 22, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 24, 24, 24, 24, 24, 24, 24, 24, 25, 25,
+ 25, 25, 25, 25, 25, 25, 26, 26, 26, 26,
+ 26, 26, 26, 26, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 28, 28, 28, 28, 28, 28, 28,
+ 28, 29, 29, 29, 29, 29, 29, 29, 29, 30,
+ 30, 30, 30, 30, 30, 30, 30, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31};
+
+const uint8_t Javelin::Data::BITSCALE_8_TO_4_CEIL[256] = {
+ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15};
+
+const uint8_t Javelin::Data::BITSCALE_8_TO_3_CEIL[256] = {
+ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7};
+
diff --git a/3rdparty/bgfx/3rdparty/pvrtc/BitScale.h b/3rdparty/bgfx/3rdparty/pvrtc/BitScale.h
new file mode 100644
index 00000000000..a9e5cec32e6
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/pvrtc/BitScale.h
@@ -0,0 +1,28 @@
+//============================================================================
+
+#pragma once
+
+#include <cstdint>
+
+//============================================================================
+
+namespace Javelin
+{
+ namespace Data
+ {
+//============================================================================
+
+ extern const uint8_t BITSCALE_5_TO_8[32];
+ extern const uint8_t BITSCALE_4_TO_8[16];
+ extern const uint8_t BITSCALE_3_TO_8[8];
+ extern const uint8_t BITSCALE_8_TO_5_FLOOR[256];
+ extern const uint8_t BITSCALE_8_TO_4_FLOOR[256];
+ extern const uint8_t BITSCALE_8_TO_3_FLOOR[256];
+ extern const uint8_t BITSCALE_8_TO_5_CEIL[256];
+ extern const uint8_t BITSCALE_8_TO_4_CEIL[256];
+ extern const uint8_t BITSCALE_8_TO_3_CEIL[256];
+
+//============================================================================
+ } // namespace Data
+} // namespace Javelin
+//============================================================================
diff --git a/3rdparty/bgfx/3rdparty/pvrtc/BitUtility.h b/3rdparty/bgfx/3rdparty/pvrtc/BitUtility.h
new file mode 100644
index 00000000000..588ff3e8926
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/pvrtc/BitUtility.h
@@ -0,0 +1,19 @@
+#pragma once
+
+namespace Javelin {
+
+class BitUtility {
+public:
+ static bool IsPowerOf2(unsigned int x) {
+ return (x & (x - 1)) == 0;
+ }
+
+ static unsigned int RotateRight(unsigned int value, unsigned int shift) {
+ if ((shift &= sizeof(value) * 8 - 1) == 0) {
+ return value;
+ }
+ return (value >> shift) | (value << (sizeof(value) * 8 - shift));
+ }
+};
+
+}
diff --git a/3rdparty/bgfx/3rdparty/pvrtc/Bitmap.h b/3rdparty/bgfx/3rdparty/pvrtc/Bitmap.h
new file mode 100644
index 00000000000..409ef1e4d64
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/pvrtc/Bitmap.h
@@ -0,0 +1,36 @@
+#pragma once
+
+#include "Point2.h"
+
+namespace Javelin {
+
+class Bitmap {
+public:
+ int width;
+ int height;
+ unsigned char *data;
+
+ Bitmap() {}
+
+ Bitmap(int w, int h, int bytesPerPixel)
+ : width(w)
+ , height(h)
+ , data(new unsigned char[width * height * bytesPerPixel]) {
+ }
+
+ virtual ~Bitmap() {
+ delete [] data;
+ }
+
+ Point2<int> GetSize() const { return Point2<int>(width, height); }
+
+ int GetArea() const { return width * height; }
+
+ int GetBitmapWidth() const { return width; }
+
+ int GetBitmapHeight() const { return height; }
+
+ const unsigned char *GetRawData() const { return data; }
+};
+
+}
diff --git a/3rdparty/bgfx/3rdparty/pvrtc/ColorRgba.h b/3rdparty/bgfx/3rdparty/pvrtc/ColorRgba.h
new file mode 100644
index 00000000000..e3ec6aa7c8a
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/pvrtc/ColorRgba.h
@@ -0,0 +1,152 @@
+#pragma once
+
+namespace Javelin {
+
+template<typename T>
+class ColorRgb {
+public:
+ T r;
+ T g;
+ T b;
+
+
+ ColorRgb()
+ : r(0)
+ , g(0)
+ , b(0) {
+ }
+
+ ColorRgb(T red, T green, T blue)
+ : r(red)
+ , g(green)
+ , b(blue) {
+ }
+
+ ColorRgb(const ColorRgb<T> &x)
+ : r(x.r)
+ , g(x.g)
+ , b(x.b) {
+ }
+
+ ColorRgb<int> operator *(int x) {
+ return ColorRgb<int>(r * x, g * x, b * x);
+ }
+
+ ColorRgb<int> operator +(const ColorRgb<T> &x) const {
+ return ColorRgb<int>(r + (int)x.r, g + (int)x.g, b + (int)x.b);
+ }
+
+ ColorRgb<int> operator -(const ColorRgb<T> &x) const {
+ return ColorRgb<int>(r - (int)x.r, g - (int)x.g, b - (int)x.b);
+ }
+
+ int operator %(const ColorRgb<T> &x) const {
+ return r * (int)x.r + g * (int)x.g + b * (int)x.b;
+ }
+
+ bool operator ==(const ColorRgb<T> &x) const {
+ return r == x.r && g == x.g && b == x.b;
+ }
+
+ bool operator !=(const ColorRgb<T> &x) const {
+ return r != x.r || g != x.g || b != x.b;
+ }
+
+ void SetMin(const ColorRgb<T> &x) {
+ if (x.r < r) {
+ r = x.r;
+ }
+ if (x.g < g) {
+ g = x.g;
+ }
+ if (x.b < b) {
+ b = x.b;
+ }
+ }
+
+ void SetMax(const ColorRgb<T> &x) {
+ if (x.r > r) {
+ r = x.r;
+ }
+ if (x.g > g) {
+ g = x.g;
+ }
+ if (x.b > b) {
+ b = x.b;
+ }
+ }
+};
+
+template<typename T>
+class ColorRgba : public ColorRgb<T> {
+public:
+ T a;
+
+ ColorRgba() :
+ a(0) {
+ }
+
+ ColorRgba(T red, T green, T blue, T alpha)
+ : ColorRgb<T>(red, green, blue)
+ , a(alpha) {
+ }
+
+ ColorRgba(const ColorRgba<T> &x)
+ : ColorRgb<T>(x.r, x.g, x.b)
+ , a(x.a) {
+ }
+
+ ColorRgba<int> operator *(int x) {
+ return ColorRgba<T>(ColorRgb<T>::r * x,
+ ColorRgb<T>::g * x,
+ ColorRgb<T>::b * x,
+ a * x);
+ }
+
+ ColorRgba<int> operator +(const ColorRgba<T> &x) {
+ return ColorRgba<T>(ColorRgb<T>::r + (int)x.r,
+ ColorRgb<T>::g + (int)x.g,
+ ColorRgb<T>::b + (int)x.b,
+ a + (int)x.a);
+ }
+
+ ColorRgba<int> operator -(const ColorRgba<T> &x) {
+ return ColorRgba<T>(ColorRgb<T>::r - (int)x.r,
+ ColorRgb<T>::g - (int)x.g,
+ ColorRgb<T>::b - (int)x.b,
+ a - (int)x.a);
+ }
+
+ int operator %(const ColorRgba<T> &x) {
+ return ColorRgb<T>::r * (int)x.r +
+ ColorRgb<T>::g * (int)x.g +
+ ColorRgb<T>::b * (int)x.b +
+ a * (int)x.a;
+ }
+
+ bool operator ==(const ColorRgba<T> &x) {
+ return ColorRgb<T>::r == x.r && ColorRgb<T>::g == x.g &&
+ ColorRgb<T>::b == x.b && a == x.a;
+ }
+
+ bool operator !=(const ColorRgba<T> &x) {
+ return ColorRgb<T>::r != x.r || ColorRgb<T>::g != x.g ||
+ ColorRgb<T>::b != x.b || a != x.a;
+ }
+
+ void SetMin(const ColorRgba<T> &x) {
+ ColorRgb<T>::SetMin(x);
+ if (x.a < a) {
+ a = x.a;
+ }
+ }
+
+ void SetMax(const ColorRgba<T> &x) {
+ ColorRgb<T>::SetMax(x);
+ if (x.a > a) {
+ a = x.a;
+ }
+ }
+};
+
+}
diff --git a/3rdparty/bgfx/3rdparty/pvrtc/Interval.h b/3rdparty/bgfx/3rdparty/pvrtc/Interval.h
new file mode 100644
index 00000000000..a7252e8375d
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/pvrtc/Interval.h
@@ -0,0 +1,21 @@
+#pragma once
+
+namespace Javelin {
+
+template<typename T>
+class Interval {
+public:
+ T min;
+ T max;
+
+ Interval() {
+ }
+
+ Interval<T> &operator|=(const T &x) {
+ min.SetMin(x);
+ max.SetMax(x);
+ return *this;
+ }
+};
+
+}
diff --git a/3rdparty/bgfx/3rdparty/pvrtc/LICENSE.TXT b/3rdparty/bgfx/3rdparty/pvrtc/LICENSE.TXT
new file mode 100644
index 00000000000..974fc09e25d
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/pvrtc/LICENSE.TXT
@@ -0,0 +1,25 @@
+Copyright © 2014, Jeffrey Lim. All Rights Reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+3. The name of the author may not be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR
+BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
diff --git a/3rdparty/bgfx/3rdparty/pvrtc/MortonTable.cpp b/3rdparty/bgfx/3rdparty/pvrtc/MortonTable.cpp
new file mode 100644
index 00000000000..29a5af67f6d
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/pvrtc/MortonTable.cpp
@@ -0,0 +1,43 @@
+//============================================================================
+
+#include "MortonTable.h"
+
+//============================================================================
+
+const unsigned short Javelin::Data::MORTON_TABLE[256] =
+{
+ 0x0000, 0x0001, 0x0004, 0x0005, 0x0010, 0x0011, 0x0014, 0x0015,
+ 0x0040, 0x0041, 0x0044, 0x0045, 0x0050, 0x0051, 0x0054, 0x0055,
+ 0x0100, 0x0101, 0x0104, 0x0105, 0x0110, 0x0111, 0x0114, 0x0115,
+ 0x0140, 0x0141, 0x0144, 0x0145, 0x0150, 0x0151, 0x0154, 0x0155,
+ 0x0400, 0x0401, 0x0404, 0x0405, 0x0410, 0x0411, 0x0414, 0x0415,
+ 0x0440, 0x0441, 0x0444, 0x0445, 0x0450, 0x0451, 0x0454, 0x0455,
+ 0x0500, 0x0501, 0x0504, 0x0505, 0x0510, 0x0511, 0x0514, 0x0515,
+ 0x0540, 0x0541, 0x0544, 0x0545, 0x0550, 0x0551, 0x0554, 0x0555,
+ 0x1000, 0x1001, 0x1004, 0x1005, 0x1010, 0x1011, 0x1014, 0x1015,
+ 0x1040, 0x1041, 0x1044, 0x1045, 0x1050, 0x1051, 0x1054, 0x1055,
+ 0x1100, 0x1101, 0x1104, 0x1105, 0x1110, 0x1111, 0x1114, 0x1115,
+ 0x1140, 0x1141, 0x1144, 0x1145, 0x1150, 0x1151, 0x1154, 0x1155,
+ 0x1400, 0x1401, 0x1404, 0x1405, 0x1410, 0x1411, 0x1414, 0x1415,
+ 0x1440, 0x1441, 0x1444, 0x1445, 0x1450, 0x1451, 0x1454, 0x1455,
+ 0x1500, 0x1501, 0x1504, 0x1505, 0x1510, 0x1511, 0x1514, 0x1515,
+ 0x1540, 0x1541, 0x1544, 0x1545, 0x1550, 0x1551, 0x1554, 0x1555,
+ 0x4000, 0x4001, 0x4004, 0x4005, 0x4010, 0x4011, 0x4014, 0x4015,
+ 0x4040, 0x4041, 0x4044, 0x4045, 0x4050, 0x4051, 0x4054, 0x4055,
+ 0x4100, 0x4101, 0x4104, 0x4105, 0x4110, 0x4111, 0x4114, 0x4115,
+ 0x4140, 0x4141, 0x4144, 0x4145, 0x4150, 0x4151, 0x4154, 0x4155,
+ 0x4400, 0x4401, 0x4404, 0x4405, 0x4410, 0x4411, 0x4414, 0x4415,
+ 0x4440, 0x4441, 0x4444, 0x4445, 0x4450, 0x4451, 0x4454, 0x4455,
+ 0x4500, 0x4501, 0x4504, 0x4505, 0x4510, 0x4511, 0x4514, 0x4515,
+ 0x4540, 0x4541, 0x4544, 0x4545, 0x4550, 0x4551, 0x4554, 0x4555,
+ 0x5000, 0x5001, 0x5004, 0x5005, 0x5010, 0x5011, 0x5014, 0x5015,
+ 0x5040, 0x5041, 0x5044, 0x5045, 0x5050, 0x5051, 0x5054, 0x5055,
+ 0x5100, 0x5101, 0x5104, 0x5105, 0x5110, 0x5111, 0x5114, 0x5115,
+ 0x5140, 0x5141, 0x5144, 0x5145, 0x5150, 0x5151, 0x5154, 0x5155,
+ 0x5400, 0x5401, 0x5404, 0x5405, 0x5410, 0x5411, 0x5414, 0x5415,
+ 0x5440, 0x5441, 0x5444, 0x5445, 0x5450, 0x5451, 0x5454, 0x5455,
+ 0x5500, 0x5501, 0x5504, 0x5505, 0x5510, 0x5511, 0x5514, 0x5515,
+ 0x5540, 0x5541, 0x5544, 0x5545, 0x5550, 0x5551, 0x5554, 0x5555
+};
+
+//============================================================================
diff --git a/3rdparty/bgfx/3rdparty/pvrtc/MortonTable.h b/3rdparty/bgfx/3rdparty/pvrtc/MortonTable.h
new file mode 100644
index 00000000000..7a27e595443
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/pvrtc/MortonTable.h
@@ -0,0 +1,18 @@
+//============================================================================
+
+#pragma once
+
+//============================================================================
+
+namespace Javelin
+{
+ namespace Data
+ {
+//============================================================================
+
+ extern const unsigned short MORTON_TABLE[256];
+
+//============================================================================
+ } // namespace Data
+} // namespace Javelin
+//============================================================================
diff --git a/3rdparty/bgfx/3rdparty/pvrtc/Point2.h b/3rdparty/bgfx/3rdparty/pvrtc/Point2.h
new file mode 100644
index 00000000000..89fa4b63228
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/pvrtc/Point2.h
@@ -0,0 +1,17 @@
+#pragma once
+
+namespace Javelin {
+
+template<typename T>
+class Point2 {
+public:
+ T x;
+ T y;
+
+ Point2(int a, int b)
+ : x(a)
+ , y(b) {
+ }
+};
+
+}
diff --git a/3rdparty/bgfx/3rdparty/pvrtc/PvrTcDecoder.cpp b/3rdparty/bgfx/3rdparty/pvrtc/PvrTcDecoder.cpp
new file mode 100644
index 00000000000..d8a36b342c0
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/pvrtc/PvrTcDecoder.cpp
@@ -0,0 +1,144 @@
+//============================================================================
+
+#include "PvrTcDecoder.h"
+#include "PvrTcPacket.h"
+
+#include "MortonTable.h"
+#include <assert.h>
+
+//============================================================================
+
+using namespace Javelin;
+using Data::MORTON_TABLE;
+
+//============================================================================
+
+inline unsigned PvrTcDecoder::GetMortonNumber(int x, int y)
+{
+ return MORTON_TABLE[x >> 8] << 17 | MORTON_TABLE[y >> 8] << 16 | MORTON_TABLE[x & 0xFF] << 1 | MORTON_TABLE[y & 0xFF];
+}
+
+//============================================================================
+
+void PvrTcDecoder::DecodeRgb4Bpp(ColorRgb<unsigned char>* result, const Point2<int>& size, const void* data)
+{
+ assert(size.x == size.y);
+
+ const int blocks = size.x / 4;
+ const int blockMask = blocks-1;
+ const PvrTcPacket* packets = static_cast<const PvrTcPacket*>(data);
+
+ for(int y = 0; y < blocks; ++y)
+ {
+ for(int x = 0; x < blocks; ++x)
+ {
+ const PvrTcPacket* packet = packets + GetMortonNumber(x, y);
+
+ unsigned mod = packet->modulationData;
+ const unsigned char (*weights)[4] = PvrTcPacket::WEIGHTS + 4*packet->usePunchthroughAlpha;
+ const unsigned char (*factor)[4] = PvrTcPacket::BILINEAR_FACTORS;
+
+ for(int py = 0; py < 4; ++py)
+ {
+ const int yOffset = (py < 2) ? -1 : 0;
+ const int y0 = (y + yOffset) & blockMask;
+ const int y1 = (y0+1) & blockMask;
+
+ for(int px = 0; px < 4; ++px)
+ {
+ const int xOffset = (px < 2) ? -1 : 0;
+ const int x0 = (x + xOffset) & blockMask;
+ const int x1 = (x0+1) & blockMask;
+
+ const PvrTcPacket* p0 = packets + GetMortonNumber(x0, y0);
+ const PvrTcPacket* p1 = packets + GetMortonNumber(x1, y0);
+ const PvrTcPacket* p2 = packets + GetMortonNumber(x0, y1);
+ const PvrTcPacket* p3 = packets + GetMortonNumber(x1, y1);
+
+ ColorRgb<int> ca = p0->GetColorRgbA() * (*factor)[0] +
+ p1->GetColorRgbA() * (*factor)[1] +
+ p2->GetColorRgbA() * (*factor)[2] +
+ p3->GetColorRgbA() * (*factor)[3];
+
+ ColorRgb<int> cb = p0->GetColorRgbB() * (*factor)[0] +
+ p1->GetColorRgbB() * (*factor)[1] +
+ p2->GetColorRgbB() * (*factor)[2] +
+ p3->GetColorRgbB() * (*factor)[3];
+
+ const unsigned char* w = weights[mod&3];
+ ColorRgb<unsigned char> c;
+ c.r = (ca.r * w[0] + cb.r * w[1]) >> 7;
+ c.g = (ca.g * w[0] + cb.g * w[1]) >> 7;
+ c.b = (ca.b * w[0] + cb.b * w[1]) >> 7;
+
+ result[(py+y*4)*size.x + (px+x*4)] = c;
+ mod >>= 2;
+ factor++;
+ }
+ }
+ }
+ }
+}
+
+void PvrTcDecoder::DecodeRgba4Bpp(ColorRgba<unsigned char>* result, const Point2<int>& size, const void* data)
+{
+ assert(size.x == size.y);
+
+ const int blocks = size.x / 4;
+ const int blockMask = blocks-1;
+ const PvrTcPacket* packets = static_cast<const PvrTcPacket*>(data);
+
+ for(int y = 0; y < blocks; ++y)
+ {
+ for(int x = 0; x < blocks; ++x)
+ {
+ const PvrTcPacket* packet = packets + GetMortonNumber(x, y);
+
+ unsigned mod = packet->modulationData;
+ const unsigned char (*weights)[4] = PvrTcPacket::WEIGHTS + 4*packet->usePunchthroughAlpha;
+ const unsigned char (*factor)[4] = PvrTcPacket::BILINEAR_FACTORS;
+
+ for(int py = 0; py < 4; ++py)
+ {
+ const int yOffset = (py < 2) ? -1 : 0;
+ const int y0 = (y + yOffset) & blockMask;
+ const int y1 = (y0+1) & blockMask;
+
+ for(int px = 0; px < 4; ++px)
+ {
+ const int xOffset = (px < 2) ? -1 : 0;
+ const int x0 = (x + xOffset) & blockMask;
+ const int x1 = (x0+1) & blockMask;
+
+ const PvrTcPacket* p0 = packets + GetMortonNumber(x0, y0);
+ const PvrTcPacket* p1 = packets + GetMortonNumber(x1, y0);
+ const PvrTcPacket* p2 = packets + GetMortonNumber(x0, y1);
+ const PvrTcPacket* p3 = packets + GetMortonNumber(x1, y1);
+
+ ColorRgba<int> ca = p0->GetColorRgbaA() * (*factor)[0] +
+ p1->GetColorRgbaA() * (*factor)[1] +
+ p2->GetColorRgbaA() * (*factor)[2] +
+ p3->GetColorRgbaA() * (*factor)[3];
+
+ ColorRgba<int> cb = p0->GetColorRgbaB() * (*factor)[0] +
+ p1->GetColorRgbaB() * (*factor)[1] +
+ p2->GetColorRgbaB() * (*factor)[2] +
+ p3->GetColorRgbaB() * (*factor)[3];
+
+ const unsigned char* w = weights[mod&3];
+ ColorRgba<unsigned char> c;
+ c.r = (ca.r * w[0] + cb.r * w[1]) >> 7;
+ c.g = (ca.g * w[0] + cb.g * w[1]) >> 7;
+ c.b = (ca.b * w[0] + cb.b * w[1]) >> 7;
+ c.a = (ca.a * w[2] + cb.a * w[3]) >> 7;
+
+ result[(py+y*4)*size.x + (px+x*4)] = c;
+ mod >>= 2;
+ factor++;
+ }
+ }
+ }
+ }
+}
+
+//============================================================================
diff --git a/3rdparty/bgfx/3rdparty/pvrtc/PvrTcDecoder.h b/3rdparty/bgfx/3rdparty/pvrtc/PvrTcDecoder.h
new file mode 100644
index 00000000000..1b6fcf964c3
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/pvrtc/PvrTcDecoder.h
@@ -0,0 +1,25 @@
+//============================================================================
+
+#pragma once
+#include "Point2.h"
+#include "ColorRgba.h"
+
+//============================================================================
+
+namespace Javelin
+{
+//============================================================================
+
+ class PvrTcDecoder
+ {
+ public:
+ static void DecodeRgb4Bpp(ColorRgb<unsigned char>* result, const Point2<int>& size, const void* data);
+ static void DecodeRgba4Bpp(ColorRgba<unsigned char>* result, const Point2<int>& size, const void* data);
+
+ private:
+ static unsigned GetMortonNumber(int x, int y);
+ };
+
+//============================================================================
+}
+//============================================================================
diff --git a/3rdparty/bgfx/3rdparty/pvrtc/PvrTcEncoder.cpp b/3rdparty/bgfx/3rdparty/pvrtc/PvrTcEncoder.cpp
new file mode 100644
index 00000000000..56cc8e03c56
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/pvrtc/PvrTcEncoder.cpp
@@ -0,0 +1,464 @@
+//============================================================================
+
+#include "PvrTcEncoder.h"
+#include "AlphaBitmap.h"
+#include "PvrTcPacket.h"
+#include "RgbBitmap.h"
+#include "RgbaBitmap.h"
+#include "MortonTable.h"
+#include "BitUtility.h"
+#include "Interval.h"
+#include <assert.h>
+#include <math.h>
+#include <stdint.h>
+
+//============================================================================
+
+using namespace Javelin;
+using Data::MORTON_TABLE;
+
+//============================================================================
+
+static const unsigned char MODULATION_LUT[16] =
+{
+ 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3
+};
+
+//============================================================================
+
+inline unsigned PvrTcEncoder::GetMortonNumber(int x, int y)
+{
+ return MORTON_TABLE[x >> 8] << 17 | MORTON_TABLE[y >> 8] << 16 | MORTON_TABLE[x & 0xFF] << 1 | MORTON_TABLE[y & 0xFF];
+}
+
+//============================================================================
+
+void PvrTcEncoder::EncodeAlpha2Bpp(void* result, const AlphaBitmap& bitmap)
+{
+ int size = bitmap.GetBitmapWidth();
+ assert(size == bitmap.GetBitmapHeight());
+ assert(BitUtility::IsPowerOf2(size));
+
+ // Blocks in each dimension.
+ int xBlocks = size/8;
+ int yBlocks = size/4;
+
+ const unsigned char* bitmapData = bitmap.GetRawData();
+
+ PvrTcPacket* packets = static_cast<PvrTcPacket*>(result);
+ for(int y = 0; y < yBlocks; ++y)
+ {
+ for(int x = 0; x < xBlocks; ++x)
+ {
+ PvrTcPacket* packet = packets + GetMortonNumber(x, y);
+ packet->usePunchthroughAlpha = 0;
+ packet->colorAIsOpaque = 0;
+ packet->colorA = 0x7ff; // White, with 0 alpha
+ packet->colorBIsOpaque = 1;
+ packet->colorB = 0x7fff; // White with full alpha
+
+ const unsigned char* blockBitmapData = &bitmapData[y*4*size + x*8];
+
+ uint32_t modulationData = 0;
+ for(int py = 0; py < 4; ++py)
+ {
+ const unsigned char* rowBitmapData = blockBitmapData;
+ for(int px = 0; px < 8; ++px)
+ {
+ unsigned char pixel = *rowBitmapData++;
+ modulationData = BitUtility::RotateRight(modulationData | (pixel >> 7), 1);
+ }
+ blockBitmapData += size;
+ }
+ packet->modulationData = modulationData;
+ }
+ }
+}
+
+void PvrTcEncoder::EncodeAlpha4Bpp(void* result, const AlphaBitmap& bitmap)
+{
+ int size = bitmap.GetBitmapWidth();
+ assert(size == bitmap.GetBitmapHeight());
+ assert(BitUtility::IsPowerOf2(size));
+
+ // Blocks in each dimension.
+ int blocks = size/4;
+
+ const unsigned char* bitmapData = bitmap.GetRawData();
+
+ PvrTcPacket* packets = static_cast<PvrTcPacket*>(result);
+ for(int y = 0; y < blocks; ++y)
+ {
+ for(int x = 0; x < blocks; ++x)
+ {
+ PvrTcPacket* packet = packets + GetMortonNumber(x, y);
+ packet->usePunchthroughAlpha = 0;
+ packet->colorAIsOpaque = 0;
+ packet->colorA = 0x7ff; // White, with 0 alpha
+ packet->colorBIsOpaque = 1;
+ packet->colorB = 0x7fff; // White with full alpha
+
+ const unsigned char* blockBitmapData = &bitmapData[(y*size + x)*4];
+
+ uint32_t modulationData = 0;
+ for(int py = 0; py < 4; ++py)
+ {
+ const unsigned char* rowBitmapData = blockBitmapData;
+ for(int px = 0; px < 4; ++px)
+ {
+ unsigned char pixel = *rowBitmapData++;
+ modulationData = BitUtility::RotateRight(modulationData | MODULATION_LUT[pixel>>4], 2);
+ }
+ blockBitmapData += size;
+ }
+ packet->modulationData = modulationData;
+ }
+ }
+}
+
+//============================================================================
+
+typedef Interval<ColorRgb<unsigned char> > ColorRgbBoundingBox;
+
+static void CalculateBoundingBox(ColorRgbBoundingBox& cbb, const RgbBitmap& bitmap, int blockX, int blockY)
+{
+ int size = bitmap.GetBitmapWidth();
+ const ColorRgb<unsigned char>* data = bitmap.GetData() + blockY * 4 * size + blockX * 4;
+
+ cbb.min = data[0];
+ cbb.max = data[0];
+ cbb |= data[1];
+ cbb |= data[2];
+ cbb |= data[3];
+
+ cbb |= data[size];
+ cbb |= data[size+1];
+ cbb |= data[size+2];
+ cbb |= data[size+3];
+
+ cbb |= data[2*size];
+ cbb |= data[2*size+1];
+ cbb |= data[2*size+2];
+ cbb |= data[2*size+3];
+
+ cbb |= data[3*size];
+ cbb |= data[3*size+1];
+ cbb |= data[3*size+2];
+ cbb |= data[3*size+3];
+}
+
+void PvrTcEncoder::EncodeRgb4Bpp(void* result, const RgbBitmap& bitmap)
+{
+ assert(bitmap.GetBitmapWidth() == bitmap.GetBitmapHeight());
+ assert(BitUtility::IsPowerOf2(bitmap.GetBitmapWidth()));
+ const int size = bitmap.GetBitmapWidth();
+ const int blocks = size / 4;
+ const int blockMask = blocks-1;
+
+ PvrTcPacket* packets = static_cast<PvrTcPacket*>(result);
+
+ for(int y = 0; y < blocks; ++y)
+ {
+ for(int x = 0; x < blocks; ++x)
+ {
+ ColorRgbBoundingBox cbb;
+ CalculateBoundingBox(cbb, bitmap, x, y);
+ PvrTcPacket* packet = packets + GetMortonNumber(x, y);
+ packet->usePunchthroughAlpha = 0;
+ packet->SetColorA(cbb.min);
+ packet->SetColorB(cbb.max);
+ }
+ }
+
+ for(int y = 0; y < blocks; ++y)
+ {
+ for(int x = 0; x < blocks; ++x)
+ {
+ const unsigned char (*factor)[4] = PvrTcPacket::BILINEAR_FACTORS;
+ const ColorRgb<unsigned char>* data = bitmap.GetData() + y * 4 * size + x * 4;
+
+ uint32_t modulationData = 0;
+
+ for(int py = 0; py < 4; ++py)
+ {
+ const int yOffset = (py < 2) ? -1 : 0;
+ const int y0 = (y + yOffset) & blockMask;
+ const int y1 = (y0+1) & blockMask;
+
+ for(int px = 0; px < 4; ++px)
+ {
+ const int xOffset = (px < 2) ? -1 : 0;
+ const int x0 = (x + xOffset) & blockMask;
+ const int x1 = (x0+1) & blockMask;
+
+ const PvrTcPacket* p0 = packets + GetMortonNumber(x0, y0);
+ const PvrTcPacket* p1 = packets + GetMortonNumber(x1, y0);
+ const PvrTcPacket* p2 = packets + GetMortonNumber(x0, y1);
+ const PvrTcPacket* p3 = packets + GetMortonNumber(x1, y1);
+
+ ColorRgb<int> ca = p0->GetColorRgbA() * (*factor)[0] +
+ p1->GetColorRgbA() * (*factor)[1] +
+ p2->GetColorRgbA() * (*factor)[2] +
+ p3->GetColorRgbA() * (*factor)[3];
+
+ ColorRgb<int> cb = p0->GetColorRgbB() * (*factor)[0] +
+ p1->GetColorRgbB() * (*factor)[1] +
+ p2->GetColorRgbB() * (*factor)[2] +
+ p3->GetColorRgbB() * (*factor)[3];
+
+ const ColorRgb<unsigned char>& pixel = data[py*size + px];
+ ColorRgb<int> d = cb - ca;
+ ColorRgb<int> p(pixel.r*16, pixel.g*16, pixel.b*16);
+ ColorRgb<int> v = p - ca;
+
+ // PVRTC uses weightings of 0, 3/8, 5/8 and 1
+ // The boundaries for these are 3/16, 1/2 (=8/16), 13/16
+ int projection = (v % d) * 16;
+ int lengthSquared = d % d;
+ if(projection > 3*lengthSquared) modulationData++;
+ if(projection > 8*lengthSquared) modulationData++;
+ if(projection > 13*lengthSquared) modulationData++;
+
+ modulationData = BitUtility::RotateRight(modulationData, 2);
+
+ factor++;
+ }
+ }
+
+ PvrTcPacket* packet = packets + GetMortonNumber(x, y);
+ packet->modulationData = modulationData;
+ }
+ }
+}
+
+//============================================================================
+
+static void CalculateBoundingBox(ColorRgbBoundingBox& cbb, const RgbaBitmap& bitmap, int blockX, int blockY)
+{
+ int size = bitmap.GetBitmapWidth();
+ const ColorRgba<unsigned char>* data = bitmap.GetData() + blockY * 4 * size + blockX * 4;
+
+ cbb.min = data[0];
+ cbb.max = data[0];
+
+ cbb |= data[1];
+ cbb |= data[2];
+ cbb |= data[3];
+
+ cbb |= data[size];
+ cbb |= data[size+1];
+ cbb |= data[size+2];
+ cbb |= data[size+3];
+
+ cbb |= data[2*size];
+ cbb |= data[2*size+1];
+ cbb |= data[2*size+2];
+ cbb |= data[2*size+3];
+
+ cbb |= data[3*size];
+ cbb |= data[3*size+1];
+ cbb |= data[3*size+2];
+ cbb |= data[3*size+3];
+}
+
+void PvrTcEncoder::EncodeRgb4Bpp(void* result, const RgbaBitmap& bitmap)
+{
+ assert(bitmap.GetBitmapWidth() == bitmap.GetBitmapHeight());
+ assert(BitUtility::IsPowerOf2(bitmap.GetBitmapWidth()));
+ const int size = bitmap.GetBitmapWidth();
+ const int blocks = size / 4;
+ const int blockMask = blocks-1;
+
+ PvrTcPacket* packets = static_cast<PvrTcPacket*>(result);
+
+ for(int y = 0; y < blocks; ++y)
+ {
+ for(int x = 0; x < blocks; ++x)
+ {
+ ColorRgbBoundingBox cbb;
+ CalculateBoundingBox(cbb, bitmap, x, y);
+ PvrTcPacket* packet = packets + GetMortonNumber(x, y);
+ packet->usePunchthroughAlpha = 0;
+ packet->SetColorA(cbb.min);
+ packet->SetColorB(cbb.max);
+ }
+ }
+
+ for(int y = 0; y < blocks; ++y)
+ {
+ for(int x = 0; x < blocks; ++x)
+ {
+ const unsigned char (*factor)[4] = PvrTcPacket::BILINEAR_FACTORS;
+ const ColorRgba<unsigned char>* data = bitmap.GetData() + y * 4 * size + x * 4;
+
+ uint32_t modulationData = 0;
+
+ for(int py = 0; py < 4; ++py)
+ {
+ const int yOffset = (py < 2) ? -1 : 0;
+ const int y0 = (y + yOffset) & blockMask;
+ const int y1 = (y0+1) & blockMask;
+
+ for(int px = 0; px < 4; ++px)
+ {
+ const int xOffset = (px < 2) ? -1 : 0;
+ const int x0 = (x + xOffset) & blockMask;
+ const int x1 = (x0+1) & blockMask;
+
+ const PvrTcPacket* p0 = packets + GetMortonNumber(x0, y0);
+ const PvrTcPacket* p1 = packets + GetMortonNumber(x1, y0);
+ const PvrTcPacket* p2 = packets + GetMortonNumber(x0, y1);
+ const PvrTcPacket* p3 = packets + GetMortonNumber(x1, y1);
+
+ ColorRgb<int> ca = p0->GetColorRgbA() * (*factor)[0] +
+ p1->GetColorRgbA() * (*factor)[1] +
+ p2->GetColorRgbA() * (*factor)[2] +
+ p3->GetColorRgbA() * (*factor)[3];
+
+ ColorRgb<int> cb = p0->GetColorRgbB() * (*factor)[0] +
+ p1->GetColorRgbB() * (*factor)[1] +
+ p2->GetColorRgbB() * (*factor)[2] +
+ p3->GetColorRgbB() * (*factor)[3];
+
+ const ColorRgb<unsigned char>& pixel = data[py*size + px];
+ ColorRgb<int> d = cb - ca;
+ ColorRgb<int> p(pixel.r*16, pixel.g*16, pixel.b*16);
+ ColorRgb<int> v = p - ca;
+
+ // PVRTC uses weightings of 0, 3/8, 5/8 and 1
+ // The boundaries for these are 3/16, 1/2 (=8/16), 13/16
+ int projection = (v % d) * 16;
+ int lengthSquared = d % d;
+ if(projection > 3*lengthSquared) modulationData++;
+ if(projection > 8*lengthSquared) modulationData++;
+ if(projection > 13*lengthSquared) modulationData++;
+
+ modulationData = BitUtility::RotateRight(modulationData, 2);
+
+ factor++;
+ }
+ }
+
+ PvrTcPacket* packet = packets + GetMortonNumber(x, y);
+ packet->modulationData = modulationData;
+ }
+ }
+}
+
+//============================================================================
+
+typedef Interval<ColorRgba<unsigned char> > ColorRgbaBoundingBox;
+
+static void CalculateBoundingBox(ColorRgbaBoundingBox& cbb, const RgbaBitmap& bitmap, int blockX, int blockY)
+{
+ int size = bitmap.GetBitmapWidth();
+ const ColorRgba<unsigned char>* data = bitmap.GetData() + blockY * 4 * size + blockX * 4;
+
+ cbb.min = data[0];
+ cbb.max = data[0];
+
+ cbb |= data[1];
+ cbb |= data[2];
+ cbb |= data[3];
+
+ cbb |= data[size];
+ cbb |= data[size+1];
+ cbb |= data[size+2];
+ cbb |= data[size+3];
+
+ cbb |= data[2*size];
+ cbb |= data[2*size+1];
+ cbb |= data[2*size+2];
+ cbb |= data[2*size+3];
+
+ cbb |= data[3*size];
+ cbb |= data[3*size+1];
+ cbb |= data[3*size+2];
+ cbb |= data[3*size+3];
+}
+
+void PvrTcEncoder::EncodeRgba4Bpp(void* result, const RgbaBitmap& bitmap)
+{
+ assert(bitmap.GetBitmapWidth() == bitmap.GetBitmapHeight());
+ assert(BitUtility::IsPowerOf2(bitmap.GetBitmapWidth()));
+ const int size = bitmap.GetBitmapWidth();
+ const int blocks = size / 4;
+ const int blockMask = blocks-1;
+
+ PvrTcPacket* packets = static_cast<PvrTcPacket*>(result);
+
+ for(int y = 0; y < blocks; ++y)
+ {
+ for(int x = 0; x < blocks; ++x)
+ {
+ ColorRgbaBoundingBox cbb;
+ CalculateBoundingBox(cbb, bitmap, x, y);
+ PvrTcPacket* packet = packets + GetMortonNumber(x, y);
+ packet->usePunchthroughAlpha = 0;
+ packet->SetColorA(cbb.min);
+ packet->SetColorB(cbb.max);
+ }
+ }
+
+ for(int y = 0; y < blocks; ++y)
+ {
+ for(int x = 0; x < blocks; ++x)
+ {
+ const unsigned char (*factor)[4] = PvrTcPacket::BILINEAR_FACTORS;
+ const ColorRgba<unsigned char>* data = bitmap.GetData() + y * 4 * size + x * 4;
+
+ uint32_t modulationData = 0;
+
+ for(int py = 0; py < 4; ++py)
+ {
+ const int yOffset = (py < 2) ? -1 : 0;
+ const int y0 = (y + yOffset) & blockMask;
+ const int y1 = (y0+1) & blockMask;
+
+ for(int px = 0; px < 4; ++px)
+ {
+ const int xOffset = (px < 2) ? -1 : 0;
+ const int x0 = (x + xOffset) & blockMask;
+ const int x1 = (x0+1) & blockMask;
+
+ const PvrTcPacket* p0 = packets + GetMortonNumber(x0, y0);
+ const PvrTcPacket* p1 = packets + GetMortonNumber(x1, y0);
+ const PvrTcPacket* p2 = packets + GetMortonNumber(x0, y1);
+ const PvrTcPacket* p3 = packets + GetMortonNumber(x1, y1);
+
+ ColorRgba<int> ca = p0->GetColorRgbaA() * (*factor)[0] +
+ p1->GetColorRgbaA() * (*factor)[1] +
+ p2->GetColorRgbaA() * (*factor)[2] +
+ p3->GetColorRgbaA() * (*factor)[3];
+
+ ColorRgba<int> cb = p0->GetColorRgbaB() * (*factor)[0] +
+ p1->GetColorRgbaB() * (*factor)[1] +
+ p2->GetColorRgbaB() * (*factor)[2] +
+ p3->GetColorRgbaB() * (*factor)[3];
+
+ const ColorRgba<unsigned char>& pixel = data[py*size + px];
+ ColorRgba<int> d = cb - ca;
+ ColorRgba<int> p(pixel.r*16, pixel.g*16, pixel.b*16, pixel.a*16);
+ ColorRgba<int> v = p - ca;
+
+ // PVRTC uses weightings of 0, 3/8, 5/8 and 1
+ // The boundaries for these are 3/16, 1/2 (=8/16), 13/16
+ int projection = (v % d) * 16;
+ int lengthSquared = d % d;
+ if(projection > 3*lengthSquared) modulationData++;
+ if(projection > 8*lengthSquared) modulationData++;
+ if(projection > 13*lengthSquared) modulationData++;
+
+ modulationData = BitUtility::RotateRight(modulationData, 2);
+
+ factor++;
+ }
+ }
+
+ PvrTcPacket* packet = packets + GetMortonNumber(x, y);
+ packet->modulationData = modulationData;
+ }
+ }
+}
+
+//============================================================================
diff --git a/3rdparty/bgfx/3rdparty/pvrtc/PvrTcEncoder.h b/3rdparty/bgfx/3rdparty/pvrtc/PvrTcEncoder.h
new file mode 100644
index 00000000000..fd244846a36
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/pvrtc/PvrTcEncoder.h
@@ -0,0 +1,43 @@
+//============================================================================
+
+#pragma once
+#include "ColorRgba.h"
+#include "AlphaBitmap.h"
+#include "RgbBitmap.h"
+#include "RgbaBitmap.h"
+
+//============================================================================
+
+namespace Javelin
+{
+//============================================================================
+
+ class AlphaBitmap;
+ class RgbBitmap;
+ class RgbaBitmap;
+
+ class PvrTcEncoder
+ {
+ public:
+ // Result must be large enough for bitmap.GetArea()/4 bytes
+ static void EncodeAlpha2Bpp(void* result, const AlphaBitmap& bitmap);
+
+ // Result must be large enough for bitmap.GetArea()/2 bytes
+ static void EncodeAlpha4Bpp(void* result, const AlphaBitmap& bitmap);
+
+ // Result must be large enough for bitmap.GetArea()/2 bytes
+ static void EncodeRgb4Bpp(void* result, const RgbBitmap& bitmap);
+
+ // Result must be large enough for bitmap.GetArea()/2 bytes
+ static void EncodeRgb4Bpp(void* result, const RgbaBitmap& bitmap);
+
+ // Result must be large enough for bitmap.GetArea()/2 bytes
+ static void EncodeRgba4Bpp(void* result, const RgbaBitmap& bitmap);
+
+ private:
+ static unsigned GetMortonNumber(int x, int y);
+ };
+
+//============================================================================
+}
+//============================================================================
diff --git a/3rdparty/bgfx/3rdparty/pvrtc/PvrTcPacket.cpp b/3rdparty/bgfx/3rdparty/pvrtc/PvrTcPacket.cpp
new file mode 100644
index 00000000000..2e40d371e8a
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/pvrtc/PvrTcPacket.cpp
@@ -0,0 +1,209 @@
+//============================================================================
+
+#include "PvrTcPacket.h"
+#include "BitScale.h"
+
+//============================================================================
+
+using namespace Javelin;
+
+//============================================================================
+
+const unsigned char PvrTcPacket::BILINEAR_FACTORS[16][4] =
+{
+ { 4, 4, 4, 4 },
+ { 2, 6, 2, 6 },
+ { 8, 0, 8, 0 },
+ { 6, 2, 6, 2 },
+
+ { 2, 2, 6, 6 },
+ { 1, 3, 3, 9 },
+ { 4, 0, 12, 0 },
+ { 3, 1, 9, 3 },
+
+ { 8, 8, 0, 0 },
+ { 4, 12, 0, 0 },
+ { 16, 0, 0, 0 },
+ { 12, 4, 0, 0 },
+
+ { 6, 6, 2, 2 },
+ { 3, 9, 1, 3 },
+ { 12, 0, 4, 0 },
+ { 9, 3, 3, 1 },
+};
+
+// Weights are { colorA, colorB, alphaA, alphaB }
+const unsigned char PvrTcPacket::WEIGHTS[8][4] =
+{
+ // Weights for Mode=0
+ { 8, 0, 8, 0 },
+ { 5, 3, 5, 3 },
+ { 3, 5, 3, 5 },
+ { 0, 8, 0, 8 },
+
+ // Weights for Mode=1
+ { 8, 0, 8, 0 },
+ { 4, 4, 4, 4 },
+ { 4, 4, 0, 0 },
+ { 0, 8, 0, 8 },
+};
+
+//============================================================================
+
+ColorRgb<int> PvrTcPacket::GetColorRgbA() const
+{
+ if(colorAIsOpaque)
+ {
+ unsigned char r = colorA >> 9;
+ unsigned char g = colorA >> 4 & 0x1f;
+ unsigned char b = colorA & 0xf;
+ return ColorRgb<int>(Data::BITSCALE_5_TO_8[r],
+ Data::BITSCALE_5_TO_8[g],
+ Data::BITSCALE_4_TO_8[b]);
+ }
+ else
+ {
+ unsigned char r = (colorA >> 7) & 0xf;
+ unsigned char g = (colorA >> 3) & 0xf;
+ unsigned char b = colorA & 7;
+ return ColorRgb<int>(Data::BITSCALE_4_TO_8[r],
+ Data::BITSCALE_4_TO_8[g],
+ Data::BITSCALE_3_TO_8[b]);
+ }
+}
+
+ColorRgb<int> PvrTcPacket::GetColorRgbB() const
+{
+ if(colorBIsOpaque)
+ {
+ unsigned char r = colorB >> 10;
+ unsigned char g = colorB >> 5 & 0x1f;
+ unsigned char b = colorB & 0x1f;
+ return ColorRgb<int>(Data::BITSCALE_5_TO_8[r],
+ Data::BITSCALE_5_TO_8[g],
+ Data::BITSCALE_5_TO_8[b]);
+ }
+ else
+ {
+ unsigned char r = colorB >> 8 & 0xf;
+ unsigned char g = colorB >> 4 & 0xf;
+ unsigned char b = colorB & 0xf;
+ return ColorRgb<int>(Data::BITSCALE_4_TO_8[r],
+ Data::BITSCALE_4_TO_8[g],
+ Data::BITSCALE_4_TO_8[b]);
+ }
+}
+
+ColorRgba<int> PvrTcPacket::GetColorRgbaA() const
+{
+ if(colorAIsOpaque)
+ {
+ unsigned char r = colorA >> 9;
+ unsigned char g = colorA >> 4 & 0x1f;
+ unsigned char b = colorA & 0xf;
+ return ColorRgba<int>(Data::BITSCALE_5_TO_8[r],
+ Data::BITSCALE_5_TO_8[g],
+ Data::BITSCALE_4_TO_8[b],
+ 255);
+ }
+ else
+ {
+ unsigned char a = colorA >> 11 & 7;
+ unsigned char r = colorA >> 7 & 0xf;
+ unsigned char g = colorA >> 3 & 0xf;
+ unsigned char b = colorA & 7;
+ return ColorRgba<int>(Data::BITSCALE_4_TO_8[r],
+ Data::BITSCALE_4_TO_8[g],
+ Data::BITSCALE_3_TO_8[b],
+ Data::BITSCALE_3_TO_8[a]);
+ }
+}
+
+ColorRgba<int> PvrTcPacket::GetColorRgbaB() const
+{
+ if(colorBIsOpaque)
+ {
+ unsigned char r = colorB >> 10;
+ unsigned char g = colorB >> 5 & 0x1f;
+ unsigned char b = colorB & 0x1f;
+ return ColorRgba<int>(Data::BITSCALE_5_TO_8[r],
+ Data::BITSCALE_5_TO_8[g],
+ Data::BITSCALE_5_TO_8[b],
+ 255);
+ }
+ else
+ {
+ unsigned char a = colorB >> 12 & 7;
+ unsigned char r = colorB >> 8 & 0xf;
+ unsigned char g = colorB >> 4 & 0xf;
+ unsigned char b = colorB & 0xf;
+ return ColorRgba<int>(Data::BITSCALE_4_TO_8[r],
+ Data::BITSCALE_4_TO_8[g],
+ Data::BITSCALE_4_TO_8[b],
+ Data::BITSCALE_3_TO_8[a]);
+ }
+}
+
+//============================================================================
+
+void PvrTcPacket::SetColorA(const ColorRgb<unsigned char>& c)
+{
+ int r = Data::BITSCALE_8_TO_5_FLOOR[c.r];
+ int g = Data::BITSCALE_8_TO_5_FLOOR[c.g];
+ int b = Data::BITSCALE_8_TO_4_FLOOR[c.b];
+ colorA = r<<9 | g<<4 | b;
+ colorAIsOpaque = true;
+}
+
+void PvrTcPacket::SetColorB(const ColorRgb<unsigned char>& c)
+{
+ int r = Data::BITSCALE_8_TO_5_CEIL[c.r];
+ int g = Data::BITSCALE_8_TO_5_CEIL[c.g];
+ int b = Data::BITSCALE_8_TO_5_CEIL[c.b];
+ colorB = r<<10 | g<<5 | b;
+ colorBIsOpaque = true;
+}
+
+void PvrTcPacket::SetColorA(const ColorRgba<unsigned char>& c)
+{
+ int a = Data::BITSCALE_8_TO_3_FLOOR[c.a];
+ if(a == 7)
+ {
+ int r = Data::BITSCALE_8_TO_5_FLOOR[c.r];
+ int g = Data::BITSCALE_8_TO_5_FLOOR[c.g];
+ int b = Data::BITSCALE_8_TO_4_FLOOR[c.b];
+ colorA = r<<9 | g<<4 | b;
+ colorAIsOpaque = true;
+ }
+ else
+ {
+ int r = Data::BITSCALE_8_TO_4_FLOOR[c.r];
+ int g = Data::BITSCALE_8_TO_4_FLOOR[c.g];
+ int b = Data::BITSCALE_8_TO_3_FLOOR[c.b];
+ colorA = a<<11 | r<<7 | g<<3 | b;
+ colorAIsOpaque = false;
+ }
+}
+
+void PvrTcPacket::SetColorB(const ColorRgba<unsigned char>& c)
+{
+ int a = Data::BITSCALE_8_TO_3_CEIL[c.a];
+ if(a == 7)
+ {
+ int r = Data::BITSCALE_8_TO_5_CEIL[c.r];
+ int g = Data::BITSCALE_8_TO_5_CEIL[c.g];
+ int b = Data::BITSCALE_8_TO_5_CEIL[c.b];
+ colorB = r<<10 | g<<5 | b;
+ colorBIsOpaque = true;
+ }
+ else
+ {
+ int r = Data::BITSCALE_8_TO_4_CEIL[c.r];
+ int g = Data::BITSCALE_8_TO_4_CEIL[c.g];
+ int b = Data::BITSCALE_8_TO_4_CEIL[c.b];
+ colorB = a<<12 | r<<8 | g<<4 | b;
+ colorBIsOpaque = false;
+ }
+}
+
+//============================================================================
diff --git a/3rdparty/bgfx/3rdparty/pvrtc/PvrTcPacket.h b/3rdparty/bgfx/3rdparty/pvrtc/PvrTcPacket.h
new file mode 100644
index 00000000000..ac3b6a4dd10
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/pvrtc/PvrTcPacket.h
@@ -0,0 +1,65 @@
+//============================================================================
+//
+// Modulation data specifies weightings of colorA to colorB for each pixel
+//
+// For mode = 0
+// 00: 0/8
+// 01: 3/8
+// 10: 5/8
+// 11: 8/8
+//
+// For mode = 1
+// 00: 0/8
+// 01: 4/8
+// 10: 4/8 with alpha punchthrough
+// 11: 8/8
+//
+// For colorIsOpaque=0
+// 3 bits A
+// 4 bits R
+// 4 bits G
+// 3/4 bits B
+//
+// For colorIsOpaque=1
+// 5 bits R
+// 5 bits G
+// 4/5 bits B
+//
+//============================================================================
+
+#pragma once
+#include "ColorRgba.h"
+
+//============================================================================
+
+namespace Javelin
+{
+//============================================================================
+
+ struct PvrTcPacket
+ {
+ unsigned int modulationData;
+ unsigned usePunchthroughAlpha : 1;
+ unsigned colorA : 14;
+ unsigned colorAIsOpaque : 1;
+ unsigned colorB : 15;
+ unsigned colorBIsOpaque : 1;
+
+ ColorRgb<int> GetColorRgbA() const;
+ ColorRgb<int> GetColorRgbB() const;
+ ColorRgba<int> GetColorRgbaA() const;
+ ColorRgba<int> GetColorRgbaB() const;
+
+ void SetColorA(const ColorRgb<unsigned char>& c);
+ void SetColorB(const ColorRgb<unsigned char>& c);
+
+ void SetColorA(const ColorRgba<unsigned char>& c);
+ void SetColorB(const ColorRgba<unsigned char>& c);
+
+ static const unsigned char BILINEAR_FACTORS[16][4];
+ static const unsigned char WEIGHTS[8][4];
+ };
+
+//============================================================================
+} // namespace Javelin
+//============================================================================
diff --git a/3rdparty/bgfx/3rdparty/pvrtc/README.md b/3rdparty/bgfx/3rdparty/pvrtc/README.md
new file mode 100644
index 00000000000..fb31a18200f
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/pvrtc/README.md
@@ -0,0 +1,17 @@
+PvrTcCompressor
+===============
+
+This was an afternoon project to determine whether crude approximations could
+produce reasonable results.
+
+~~This is *NOT* complete sourcecode. It includes enough code to show the details
+of how the algorithm works.~~
+
+~~If anyone decides to make this compile separately, send a pull request.~~
+
+Thanks to Brendan Duncan for contributing a pull request to fill in all of the
+classes and to build a simple test case. Specifically, he has contributed all of
+the files that do NOT begin with PvrTc
+
+http://roartindon.blogspot.sg/2014/08/pvr-texture-compression-exploration.html
+
diff --git a/3rdparty/bgfx/3rdparty/pvrtc/RgbBitmap.h b/3rdparty/bgfx/3rdparty/pvrtc/RgbBitmap.h
new file mode 100644
index 00000000000..4f3c57b5c07
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/pvrtc/RgbBitmap.h
@@ -0,0 +1,25 @@
+#pragma once
+
+#include "Bitmap.h"
+#include "ColorRgba.h"
+
+namespace Javelin {
+
+class RgbBitmap : public Bitmap {
+public:
+ RgbBitmap() {}
+
+ RgbBitmap(int w, int h)
+ : Bitmap(w, h, 3) {
+ }
+
+ const ColorRgb<unsigned char> *GetData() const {
+ return reinterpret_cast<ColorRgb<unsigned char> *>(data);
+ }
+
+ ColorRgb<unsigned char> *GetData() {
+ return reinterpret_cast<ColorRgb<unsigned char> *>(data);
+ }
+};
+
+}
diff --git a/3rdparty/bgfx/3rdparty/pvrtc/RgbaBitmap.h b/3rdparty/bgfx/3rdparty/pvrtc/RgbaBitmap.h
new file mode 100644
index 00000000000..ae43a779dac
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/pvrtc/RgbaBitmap.h
@@ -0,0 +1,24 @@
+#pragma once
+
+#include "ColorRgba.h"
+
+namespace Javelin {
+
+class RgbaBitmap : public Bitmap {
+public:
+ RgbaBitmap() {}
+
+ RgbaBitmap(int w, int h)
+ : Bitmap(w, h, 4) {
+ }
+
+ const ColorRgba<unsigned char> *GetData() const {
+ return reinterpret_cast<ColorRgba<unsigned char> *>(data);
+ }
+
+ ColorRgba<unsigned char> *GetData() {
+ return reinterpret_cast<ColorRgba<unsigned char> *>(data);
+ }
+};
+
+}
diff --git a/3rdparty/bgfx/3rdparty/remotery/LICENSE b/3rdparty/bgfx/3rdparty/remotery/LICENSE
new file mode 100644
index 00000000000..67db8588217
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/remotery/LICENSE
@@ -0,0 +1,175 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
diff --git a/3rdparty/bgfx/3rdparty/remotery/lib/Remotery.c b/3rdparty/bgfx/3rdparty/remotery/lib/Remotery.c
new file mode 100644
index 00000000000..d8af75bb010
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/remotery/lib/Remotery.c
@@ -0,0 +1,5929 @@
+//
+// Copyright 2014 Celtoys Ltd
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+/*
+@Contents:
+
+ @DEPS: External Dependencies
+ @TIMERS: Platform-specific timers
+ @TLS: Thread-Local Storage
+ @ATOMIC: Atomic Operations
+ @VMBUFFER: Mirror Buffer using Virtual Memory for auto-wrap
+ @NEW: New/Delete operators with error values for simplifying object create/destroy
+ @THREADS: Threads
+ @SAFEC: Safe C Library excerpts
+ @OBJALLOC: Reusable Object Allocator
+ @DYNBUF: Dynamic Buffer
+ @SOCKETS: Sockets TCP/IP Wrapper
+ @SHA1: SHA-1 Cryptographic Hash Function
+ @BASE64: Base-64 encoder
+ @MURMURHASH: Murmur-Hash 3
+ @WEBSOCKETS: WebSockets
+ @MESSAGEQ: Multiple producer, single consumer message queue
+ @NETWORK: Network Server
+ @JSON: Basic, text-based JSON serialisation
+ @SAMPLE: Base Sample Description (CPU by default)
+ @SAMPLETREE: A tree of samples with their allocator
+ @TSAMPLER: Per-Thread Sampler
+ @REMOTERY: Remotery
+ @CUDA: CUDA event sampling
+ @D3D11: Direct3D 11 event sampling
+ @OPENGL: OpenGL event sampling
+*/
+
+#define RMT_IMPL
+#include "Remotery.h"
+
+
+#ifdef RMT_PLATFORM_WINDOWS
+ #pragma comment(lib, "ws2_32.lib")
+#endif
+
+
+#if RMT_ENABLED
+
+
+// Global settings
+static rmtSettings g_Settings;
+static rmtBool g_SettingsInitialized = RMT_FALSE;
+
+
+/*
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+ @DEPS: External Dependencies
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+*/
+
+
+
+//
+// Required CRT dependencies
+//
+#if RMT_USE_TINYCRT
+
+ #include <TinyCRT/TinyCRT.h>
+ #include <TinyCRT/TinyWinsock.h>
+ #include <Memory/Memory.h>
+
+ #define CreateFileMapping CreateFileMappingA
+
+#else
+
+ #ifdef RMT_PLATFORM_MACOS
+ #include <mach/mach_time.h>
+ #include <mach/vm_map.h>
+ #include <mach/mach.h>
+ #include <sys/time.h>
+ #else
+ #include <malloc.h>
+ #endif
+
+ #include <assert.h>
+
+ #ifdef RMT_PLATFORM_WINDOWS
+ #include <winsock2.h>
+ #ifndef __MINGW32__
+ #include <intrin.h>
+ #endif
+ #undef min
+ #undef max
+ #endif
+
+ #ifdef RMT_PLATFORM_LINUX
+ #include <time.h>
+ #include <sys/prctl.h>
+ #endif
+
+ #if defined(RMT_PLATFORM_POSIX)
+ #include <stdlib.h>
+ #include <pthread.h>
+ #include <unistd.h>
+ #include <string.h>
+ #include <sys/socket.h>
+ #include <sys/mman.h>
+ #include <netinet/in.h>
+ #include <fcntl.h>
+ #include <errno.h>
+ #include <dlfcn.h>
+ #endif
+
+ #ifdef __MINGW32__
+ #include <pthread.h>
+ #endif
+
+#endif
+
+
+#define RMT_UNREFERENCED_PARAMETER(i) (void)(1 ? (void)0 : ((void)i))
+
+
+#if RMT_USE_CUDA
+ #include <cuda.h>
+#endif
+
+
+rmtU8 minU8(rmtU8 a, rmtU8 b)
+{
+ return a < b ? a : b;
+}
+rmtS64 minS64(rmtS64 a, rmtS64 b)
+{
+ return a < b ? a : b;
+}
+
+
+rmtU8 maxU8(rmtU8 a, rmtU8 b)
+{
+ return a > b ? a : b;
+}
+rmtS64 maxS64(rmtS64 a, rmtS64 b)
+{
+ return a > b ? a : b;
+}
+
+
+// Memory management functions
+static void* rmtMalloc( rmtU32 size )
+{
+ return g_Settings.malloc( g_Settings.mm_context, size );
+}
+
+static void* rmtRealloc( void* ptr, rmtU32 size)
+{
+ return g_Settings.realloc( g_Settings.mm_context, ptr, size );
+}
+
+static void rmtFree( void* ptr )
+{
+ g_Settings.free( g_Settings.mm_context, ptr );
+}
+
+
+// DLL/Shared Library functions
+void* rmtLoadLibrary(const char* path)
+{
+ #if defined(RMT_PLATFORM_WINDOWS)
+ return (void*)LoadLibraryA(path);
+ #elif defined(RMT_PLATFORM_POSIX)
+ return dlopen(path, RTLD_LOCAL | RTLD_LAZY);
+ #else
+ return NULL;
+ #endif
+}
+
+static void rmtFreeLibrary(void* handle)
+{
+ #if defined(RMT_PLATFORM_WINDOWS)
+ FreeLibrary((HMODULE)handle);
+ #elif defined(RMT_PLATFORM_POSIX)
+ dlclose(handle);
+ #endif
+}
+
+static void* rmtGetProcAddress(void* handle, const char* symbol)
+{
+ #if defined(RMT_PLATFORM_WINDOWS)
+ return GetProcAddress((HMODULE)handle, (LPCSTR)symbol);
+ #elif defined(RMT_PLATFORM_POSIX)
+ return dlsym(handle, symbol);
+ #else
+ return NULL;
+ #endif
+}
+
+
+/*
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+ @TIMERS: Platform-specific timers
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+*/
+
+
+
+//
+// Get millisecond timer value that has only one guarantee: multiple calls are consistently comparable.
+// On some platforms, even though this returns milliseconds, the timer may be far less accurate.
+//
+static rmtU32 msTimer_Get()
+{
+ #ifdef RMT_PLATFORM_WINDOWS
+ return (rmtU32)GetTickCount();
+ #else
+ clock_t time = clock();
+ rmtU32 msTime = (rmtU32) (time / (CLOCKS_PER_SEC / 1000));
+ return msTime;
+ #endif
+}
+
+
+//
+// Micro-second accuracy high performance counter
+//
+#ifndef RMT_PLATFORM_WINDOWS
+ typedef rmtU64 LARGE_INTEGER;
+#endif
+typedef struct
+{
+ LARGE_INTEGER counter_start;
+ double counter_scale;
+} usTimer;
+
+
+static void usTimer_Init(usTimer* timer)
+{
+ #if defined(RMT_PLATFORM_WINDOWS)
+ LARGE_INTEGER performance_frequency;
+
+ assert(timer != NULL);
+
+ // Calculate the scale from performance counter to microseconds
+ QueryPerformanceFrequency(&performance_frequency);
+ timer->counter_scale = 1000000.0 / performance_frequency.QuadPart;
+
+ // Record the offset for each read of the counter
+ QueryPerformanceCounter(&timer->counter_start);
+
+ #elif defined(RMT_PLATFORM_MACOS)
+
+ mach_timebase_info_data_t nsScale;
+ mach_timebase_info( &nsScale );
+ const double ns_per_us = 1.0e3;
+ timer->counter_scale = (double)(nsScale.numer) / ((double)nsScale.denom * ns_per_us);
+
+ timer->counter_start = mach_absolute_time();
+
+ #elif defined(RMT_PLATFORM_LINUX)
+
+ struct timespec tv;
+ clock_gettime(CLOCK_REALTIME, &tv);
+ timer->counter_start = (rmtU64)(tv.tv_sec * 1000000) + (rmtU64)(tv.tv_nsec * 0.001);
+
+ #endif
+}
+
+
+static rmtU64 usTimer_Get(usTimer* timer)
+{
+ #if defined(RMT_PLATFORM_WINDOWS)
+ LARGE_INTEGER performance_count;
+
+ assert(timer != NULL);
+
+ // Read counter and convert to microseconds
+ QueryPerformanceCounter(&performance_count);
+ return (rmtU64)((performance_count.QuadPart - timer->counter_start.QuadPart) * timer->counter_scale);
+
+ #elif defined(RMT_PLATFORM_MACOS)
+
+ rmtU64 curr_time = mach_absolute_time();
+ return (rmtU64)((curr_time - timer->counter_start) * timer->counter_scale);
+
+ #elif defined(RMT_PLATFORM_LINUX)
+
+ struct timespec tv;
+ clock_gettime(CLOCK_REALTIME, &tv);
+ return ((rmtU64)(tv.tv_sec * 1000000) + (rmtU64)(tv.tv_nsec * 0.001)) - timer->counter_start;
+
+ #endif
+}
+
+
+static void msSleep(rmtU32 time_ms)
+{
+ #ifdef RMT_PLATFORM_WINDOWS
+ Sleep(time_ms);
+ #elif defined(RMT_PLATFORM_POSIX)
+ usleep(time_ms * 1000);
+ #endif
+}
+
+
+
+/*
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+ @TLS: Thread-Local Storage
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+*/
+
+
+
+#define TLS_INVALID_HANDLE 0xFFFFFFFF
+
+#if defined(RMT_PLATFORM_WINDOWS)
+ typedef rmtU32 rmtTLS;
+#else
+ typedef pthread_key_t rmtTLS;
+#endif
+
+static rmtError tlsAlloc(rmtTLS* handle)
+{
+ assert(handle != NULL);
+
+#if defined(RMT_PLATFORM_WINDOWS)
+
+ *handle = (rmtTLS)TlsAlloc();
+ if (*handle == TLS_OUT_OF_INDEXES)
+ {
+ *handle = TLS_INVALID_HANDLE;
+ return RMT_ERROR_TLS_ALLOC_FAIL;
+ }
+
+#elif defined(RMT_PLATFORM_POSIX)
+
+ if (pthread_key_create(handle, NULL) != 0)
+ {
+ *handle = TLS_INVALID_HANDLE;
+ return RMT_ERROR_TLS_ALLOC_FAIL;
+ }
+
+#endif
+
+ return RMT_ERROR_NONE;
+}
+
+
+static void tlsFree(rmtTLS handle)
+{
+ assert(handle != TLS_INVALID_HANDLE);
+
+#if defined(RMT_PLATFORM_WINDOWS)
+
+ TlsFree(handle);
+
+#elif defined(RMT_PLATFORM_POSIX)
+
+ pthread_key_delete((pthread_key_t)handle);
+
+#endif
+}
+
+
+static void tlsSet(rmtTLS handle, void* value)
+{
+ assert(handle != TLS_INVALID_HANDLE);
+
+#if defined(RMT_PLATFORM_WINDOWS)
+
+ TlsSetValue(handle, value);
+
+#elif defined(RMT_PLATFORM_POSIX)
+
+ pthread_setspecific((pthread_key_t)handle, value);
+
+#endif
+}
+
+
+static void* tlsGet(rmtTLS handle)
+{
+ assert(handle != TLS_INVALID_HANDLE);
+
+#if defined(RMT_PLATFORM_WINDOWS)
+
+ return TlsGetValue(handle);
+
+#elif defined(RMT_PLATFORM_POSIX)
+
+ return pthread_getspecific((pthread_key_t)handle);
+
+#endif
+}
+
+
+
+/*
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+ @ATOMIC: Atomic Operations
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+*/
+
+
+static rmtBool AtomicCompareAndSwap(rmtU32 volatile* val, long old_val, long new_val)
+{
+ #if defined(RMT_PLATFORM_WINDOWS) && !defined(__MINGW32__)
+ return _InterlockedCompareExchange((long volatile*)val, new_val, old_val) == old_val ? RMT_TRUE : RMT_FALSE;
+ #elif defined(RMT_PLATFORM_POSIX) || defined(__MINGW32__)
+ return __sync_bool_compare_and_swap(val, old_val, new_val) ? RMT_TRUE : RMT_FALSE;
+ #endif
+}
+
+
+static rmtBool AtomicCompareAndSwapPointer(long* volatile* ptr, long* old_ptr, long* new_ptr)
+{
+ #if defined(RMT_PLATFORM_WINDOWS) && !defined(__MINGW32__)
+ #ifdef _WIN64
+ return _InterlockedCompareExchange64((__int64 volatile*)ptr, (__int64)new_ptr, (__int64)old_ptr) == (__int64)old_ptr ? RMT_TRUE : RMT_FALSE;
+ #else
+ return _InterlockedCompareExchange((long volatile*)ptr, (long)new_ptr, (long)old_ptr) == (long)old_ptr ? RMT_TRUE : RMT_FALSE;
+ #endif
+ #elif defined(RMT_PLATFORM_POSIX) || defined(__MINGW32__)
+ return __sync_bool_compare_and_swap(ptr, old_ptr, new_ptr) ? RMT_TRUE : RMT_FALSE;
+ #endif
+}
+
+
+//
+// NOTE: Does not guarantee a memory barrier
+// TODO: Make sure all platforms don't insert a memory barrier as this is only for stats
+// Alternatively, add strong/weak memory order equivalents
+//
+static rmtS32 AtomicAdd(rmtS32 volatile* value, rmtS32 add)
+{
+ #if defined(RMT_PLATFORM_WINDOWS) && !defined(__MINGW32__)
+ return _InterlockedExchangeAdd((long volatile*)value, (long)add);
+ #elif defined(RMT_PLATFORM_POSIX) || defined(__MINGW32__)
+ return __sync_fetch_and_add(value, add);
+ #endif
+}
+
+
+static void AtomicSub(rmtS32 volatile* value, rmtS32 sub)
+{
+ // Not all platforms have an implementation so just negate and add
+ AtomicAdd(value, -sub);
+}
+
+
+// Compiler write fences (windows implementation)
+static void WriteFence()
+{
+#if defined(RMT_PLATFORM_WINDOWS) && !defined(__MINGW32__)
+ _WriteBarrier();
+#else
+ asm volatile ("" : : : "memory");
+#endif
+}
+
+
+
+/*
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+ @NEW: New/Delete operators with error values for simplifying object create/destroy
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+*/
+
+
+
+// Ensures the pointer is non-NULL, calls the destructor, frees memory and sets the pointer to NULL
+#define Delete(type, obj) \
+ if (obj != NULL) \
+ { \
+ type##_Destructor(obj); \
+ rmtFree(obj); \
+ obj = NULL; \
+ }
+
+
+// New is implemented in terms of two begin/end macros
+// New will allocate enough space for the object and call the constructor
+// If allocation fails the constructor won't be called
+// If the constructor fails, the destructor is called and memory is released
+// NOTE: Use of sizeof() requires that the type be defined at the point of call
+// This is a disadvantage over requiring only a custom Create function
+#define BeginNew(type, obj) \
+ { \
+ obj = (type*)rmtMalloc(sizeof(type)); \
+ if (obj == NULL) \
+ { \
+ error = RMT_ERROR_MALLOC_FAIL; \
+ } \
+ else \
+ { \
+
+
+#define EndNew(type, obj) \
+ if (error != RMT_ERROR_NONE) \
+ Delete(type, obj); \
+ } \
+ }
+
+
+// Specialisations for New with varying constructor parameter counts
+#define New_0(type, obj) \
+ BeginNew(type, obj); error = type##_Constructor(obj); EndNew(type, obj)
+#define New_1(type, obj, a0) \
+ BeginNew(type, obj); error = type##_Constructor(obj, a0); EndNew(type, obj)
+#define New_2(type, obj, a0, a1) \
+ BeginNew(type, obj); error = type##_Constructor(obj, a0, a1); EndNew(type, obj)
+#define New_3(type, obj, a0, a1, a2) \
+ BeginNew(type, obj); error = type##_Constructor(obj, a0, a1, a2); EndNew(type, obj)
+
+
+
+/*
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+ @VMBUFFER: Mirror Buffer using Virtual Memory for auto-wrap
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+*/
+
+
+
+typedef struct VirtualMirrorBuffer
+{
+ // Page-rounded size of the buffer without mirroring
+ rmtU32 size;
+
+ // Pointer to the first part of the mirror
+ // The second part comes directly after at ptr+size bytes
+ rmtU8* ptr;
+
+#ifdef RMT_PLATFORM_WINDOWS
+ HANDLE file_map_handle;
+#endif
+
+} VirtualMirrorBuffer;
+
+
+#ifdef __ANDROID__
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/ioctl.h>
+#include <linux/ashmem.h>
+#include <fcntl.h>
+#include <string.h>
+#define ASHMEM_DEVICE "/dev/ashmem"
+
+/*
+ * ashmem_create_region - creates a new ashmem region and returns the file
+ * descriptor, or <0 on error
+ *
+ * `name' is an optional label to give the region (visible in /proc/pid/maps)
+ * `size' is the size of the region, in page-aligned bytes
+ */
+int ashmem_create_region(const char *name, size_t size)
+{
+ int fd, ret;
+
+ fd = open(ASHMEM_DEVICE, O_RDWR);
+ if (fd < 0)
+ return fd;
+
+ if (name) {
+ char buf[ASHMEM_NAME_LEN] = {0};
+
+ strncpy(buf, name, sizeof(buf));
+ buf[sizeof(buf)-1] = 0;
+ ret = ioctl(fd, ASHMEM_SET_NAME, buf);
+ if (ret < 0)
+ goto error;
+ }
+
+ ret = ioctl(fd, ASHMEM_SET_SIZE, size);
+ if (ret < 0)
+ goto error;
+
+ return fd;
+
+error:
+ close(fd);
+ return ret;
+}
+#endif // __ANDROID__
+
+
+static rmtError VirtualMirrorBuffer_Constructor(VirtualMirrorBuffer* buffer, rmtU32 size, int nb_attempts)
+{
+ static const rmtU32 k_64 = 64 * 1024;
+ RMT_UNREFERENCED_PARAMETER(nb_attempts);
+
+#ifdef RMT_PLATFORM_LINUX
+ char path[] = "/dev/shm/ring-buffer-XXXXXX";
+ int file_descriptor;
+#endif
+
+ // Round up to page-granulation; the nearest 64k boundary for now
+ size = (size + k_64 - 1) / k_64 * k_64;
+
+ // Set defaults
+ buffer->size = size;
+ buffer->ptr = NULL;
+#ifdef RMT_PLATFORM_WINDOWS
+ buffer->file_map_handle = INVALID_HANDLE_VALUE;
+#endif
+
+#ifdef RMT_PLATFORM_WINDOWS
+
+ // Windows version based on https://gist.github.com/rygorous/3158316
+
+ while (nb_attempts-- > 0)
+ {
+ rmtU8* desired_addr;
+
+ // Create a file mapping for pointing to its physical address with multiple virtual pages
+ buffer->file_map_handle = CreateFileMapping(
+ INVALID_HANDLE_VALUE,
+ 0,
+ PAGE_READWRITE,
+ 0,
+ size,
+ 0);
+ if (buffer->file_map_handle == NULL)
+ break;
+
+ // Reserve two contiguous pages of virtual memory
+ desired_addr = (rmtU8*)VirtualAlloc(0, size * 2, MEM_RESERVE, PAGE_NOACCESS);
+ if (desired_addr == NULL)
+ break;
+
+ // Release the range immediately but retain the address for the next sequence of code to
+ // try and map to it. In the mean-time some other OS thread may come along and allocate this
+ // address range from underneath us so multiple attempts need to be made.
+ VirtualFree(desired_addr, 0, MEM_RELEASE);
+
+ // Immediately try to point both pages at the file mapping
+ if (MapViewOfFileEx(buffer->file_map_handle, FILE_MAP_ALL_ACCESS, 0, 0, size, desired_addr) == desired_addr &&
+ MapViewOfFileEx(buffer->file_map_handle, FILE_MAP_ALL_ACCESS, 0, 0, size, desired_addr + size) == desired_addr + size)
+ {
+ buffer->ptr = desired_addr;
+ break;
+ }
+
+ // Failed to map the virtual pages; cleanup and try again
+ CloseHandle(buffer->file_map_handle);
+ buffer->file_map_handle = NULL;
+ }
+
+#endif
+
+#ifdef RMT_PLATFORM_MACOS
+
+ //
+ // Mac version based on https://github.com/mikeash/MAMirroredQueue
+ //
+ // Copyright (c) 2010, Michael Ash
+ // All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without modification, are permitted provided that
+ // the following conditions are met:
+ //
+ // Redistributions of source code must retain the above copyright notice, this list of conditions and the following
+ // disclaimer.
+ //
+ // Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the
+ // following disclaimer in the documentation and/or other materials provided with the distribution.
+ // Neither the name of Michael Ash nor the names of its contributors may be used to endorse or promote products
+ // derived from this software without specific prior written permission.
+ //
+ // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ // OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ //
+
+ while (nb_attempts-- > 0)
+ {
+ vm_prot_t cur_prot, max_prot;
+ kern_return_t mach_error;
+ rmtU8* ptr = NULL;
+ rmtU8* target = NULL;
+
+ // Allocate 2 contiguous pages of virtual memory
+ if (vm_allocate(mach_task_self(), (vm_address_t*)&ptr, size * 2, VM_FLAGS_ANYWHERE) != KERN_SUCCESS)
+ break;
+
+ // Try to deallocate the last page, leaving its virtual memory address free
+ target = ptr + size;
+ if (vm_deallocate(mach_task_self(), (vm_address_t)target, size) != KERN_SUCCESS)
+ {
+ vm_deallocate(mach_task_self(), (vm_address_t)ptr, size * 2);
+ break;
+ }
+
+ // Attempt to remap the page just deallocated to the buffer again
+ mach_error = vm_remap(
+ mach_task_self(),
+ (vm_address_t*)&target,
+ size,
+ 0, // mask
+ 0, // anywhere
+ mach_task_self(),
+ (vm_address_t)ptr,
+ 0, //copy
+ &cur_prot,
+ &max_prot,
+ VM_INHERIT_COPY);
+
+ if (mach_error == KERN_NO_SPACE)
+ {
+ // Failed on this pass, cleanup and make another attempt
+ if (vm_deallocate(mach_task_self(), (vm_address_t)ptr, size) != KERN_SUCCESS)
+ break;
+ }
+
+ else if (mach_error == KERN_SUCCESS)
+ {
+ // Leave the loop on success
+ buffer->ptr = ptr;
+ break;
+ }
+
+ else
+ {
+ // Unknown error, can't recover
+ vm_deallocate(mach_task_self(), (vm_address_t)ptr, size);
+ break;
+ }
+ }
+
+#endif
+
+#ifdef RMT_PLATFORM_LINUX
+
+ // Linux version based on now-defunct Wikipedia section http://en.wikipedia.org/w/index.php?title=Circular_buffer&oldid=600431497
+
+
+#ifdef __ANDROID__
+ file_descriptor = ashmem_create_region("remotery_shm", size * 2);
+ if (file_descriptor < 0) {
+ return RMT_ERROR_VIRTUAL_MEMORY_BUFFER_FAIL;
+ }
+#else
+ // Create a unique temporary filename in the shared memory folder
+ file_descriptor = mkstemp(path);
+ if (file_descriptor < 0)
+ return RMT_ERROR_VIRTUAL_MEMORY_BUFFER_FAIL;
+
+ // Delete the name
+ if (unlink(path))
+ return RMT_ERROR_VIRTUAL_MEMORY_BUFFER_FAIL;
+
+ // Set the file size to twice the buffer size
+ // TODO: this 2x behaviour can be avoided with similar solution to Win/Mac
+ if (ftruncate (file_descriptor, size * 2))
+ return RMT_ERROR_VIRTUAL_MEMORY_BUFFER_FAIL;
+
+#endif
+ // Map 2 contiguous pages
+ buffer->ptr = (rmtU8*)mmap(NULL, size * 2, PROT_NONE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
+ if (buffer->ptr == MAP_FAILED)
+ {
+ buffer->ptr = NULL;
+ return RMT_ERROR_VIRTUAL_MEMORY_BUFFER_FAIL;
+ }
+
+ // Point both pages to the same memory file
+ if (mmap(buffer->ptr, size, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_SHARED, file_descriptor, 0) != buffer->ptr ||
+ mmap(buffer->ptr + size, size, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_SHARED, file_descriptor, 0) != buffer->ptr + size)
+ return RMT_ERROR_VIRTUAL_MEMORY_BUFFER_FAIL;
+
+#endif
+
+ // Cleanup if exceeded number of attempts or failed
+ if (buffer->ptr == NULL)
+ return RMT_ERROR_VIRTUAL_MEMORY_BUFFER_FAIL;
+
+ return RMT_ERROR_NONE;
+}
+
+
+static void VirtualMirrorBuffer_Destructor(VirtualMirrorBuffer* buffer)
+{
+ assert(buffer != 0);
+
+#ifdef RMT_PLATFORM_WINDOWS
+ if (buffer->file_map_handle != NULL)
+ {
+ CloseHandle(buffer->file_map_handle);
+ buffer->file_map_handle = NULL;
+ }
+#endif
+
+#ifdef RMT_PLATFORM_MACOS
+ if (buffer->ptr != NULL)
+ vm_deallocate(mach_task_self(), (vm_address_t)buffer->ptr, buffer->size * 2);
+#endif
+
+#ifdef RMT_PLATFORM_LINUX
+ if (buffer->ptr != NULL)
+ munmap(buffer->ptr, buffer->size * 2);
+#endif
+
+ buffer->ptr = NULL;
+}
+
+
+
+/*
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+ @THREADS: Threads
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+*/
+
+
+typedef struct Thread Thread;
+typedef rmtError(*ThreadProc)(Thread* thread);
+
+typedef struct Thread
+{
+ // OS-specific data
+ #if defined(RMT_PLATFORM_WINDOWS)
+ HANDLE handle;
+ #else
+ pthread_t handle;
+ #endif
+
+ // Callback executed when the thread is created
+ ThreadProc callback;
+
+ // Caller-specified parameter passed to Thread_Create
+ void* param;
+
+ // Error state returned from callback
+ rmtError error;
+
+ // External threads can set this to request an exit
+ volatile rmtBool request_exit;
+
+} Thread;
+
+
+typedef rmtError (*ThreadProc)(Thread* thread);
+
+
+#if defined(RMT_PLATFORM_WINDOWS)
+
+ static DWORD WINAPI ThreadProcWindows(LPVOID lpParameter)
+ {
+ Thread* thread = (Thread*)lpParameter;
+ assert(thread != NULL);
+ thread->error = thread->callback(thread);
+ return thread->error == RMT_ERROR_NONE ? 1 : 0;
+ }
+
+#else
+ static void* StartFunc( void* pArgs )
+ {
+ Thread* thread = (Thread*)pArgs;
+ assert(thread != NULL);
+ thread->error = thread->callback(thread);
+ return NULL; // returned error not use, check thread->error.
+ }
+#endif
+
+
+static int Thread_Valid(Thread* thread)
+{
+ assert(thread != NULL);
+
+ #if defined(RMT_PLATFORM_WINDOWS)
+ return thread->handle != NULL;
+ #else
+ return !pthread_equal(thread->handle, pthread_self());
+ #endif
+}
+
+
+static rmtError Thread_Constructor(Thread* thread, ThreadProc callback, void* param)
+{
+ assert(thread != NULL);
+
+ thread->callback = callback;
+ thread->param = param;
+ thread->error = RMT_ERROR_NONE;
+ thread->request_exit = RMT_FALSE;
+
+ // OS-specific thread creation
+
+ #if defined (RMT_PLATFORM_WINDOWS)
+
+ thread->handle = CreateThread(
+ NULL, // lpThreadAttributes
+ 0, // dwStackSize
+ ThreadProcWindows, // lpStartAddress
+ thread, // lpParameter
+ 0, // dwCreationFlags
+ NULL); // lpThreadId
+
+ if (thread->handle == NULL)
+ return RMT_ERROR_CREATE_THREAD_FAIL;
+
+ #else
+
+ int32_t error = pthread_create( &thread->handle, NULL, StartFunc, thread );
+ if (error)
+ {
+ // Contents of 'thread' parameter to pthread_create() are undefined after
+ // failure call so can't pre-set to invalid value before hand.
+ thread->handle = pthread_self();
+ return RMT_ERROR_CREATE_THREAD_FAIL;
+ }
+
+ #endif
+
+ return RMT_ERROR_NONE;
+}
+
+
+static void Thread_RequestExit(Thread* thread)
+{
+ // Not really worried about memory barriers or delayed visibility to the target thread
+ assert(thread != NULL);
+ thread->request_exit = RMT_TRUE;
+}
+
+
+static void Thread_Join(Thread* thread)
+{
+ assert(Thread_Valid(thread));
+
+ #if defined(RMT_PLATFORM_WINDOWS)
+ WaitForSingleObject(thread->handle, INFINITE);
+ #else
+ pthread_join(thread->handle, NULL);
+ #endif
+}
+
+
+static void Thread_Destructor(Thread* thread)
+{
+ assert(thread != NULL);
+
+ if (Thread_Valid(thread))
+ {
+ // Shutdown the thread
+ Thread_RequestExit(thread);
+ Thread_Join(thread);
+
+ // OS-specific release of thread resources
+
+ #if defined(RMT_PLATFORM_WINDOWS)
+ CloseHandle(thread->handle);
+ thread->handle = NULL;
+ #endif
+ }
+}
+
+
+
+/*
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+ @SAFEC: Safe C Library excerpts
+ http://sourceforge.net/projects/safeclib/
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+*/
+
+
+
+/*------------------------------------------------------------------
+ *
+ * November 2008, Bo Berry
+ *
+ * Copyright (c) 2008-2011 by Cisco Systems, Inc
+ * All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *------------------------------------------------------------------
+ */
+
+
+// NOTE: Microsoft also has its own version of these functions so I'm do some hacky PP to remove them
+#define strnlen_s strnlen_s_safe_c
+#define strncat_s strncat_s_safe_c
+
+
+#define RSIZE_MAX_STR (4UL << 10) /* 4KB */
+#define RCNEGATE(x) x
+
+
+#define EOK ( 0 )
+#define ESNULLP ( 400 ) /* null ptr */
+#define ESZEROL ( 401 ) /* length is zero */
+#define ESLEMAX ( 403 ) /* length exceeds max */
+#define ESOVRLP ( 404 ) /* overlap undefined */
+#define ESNOSPC ( 406 ) /* not enough space for s2 */
+#define ESUNTERM ( 407 ) /* unterminated string */
+#define ESNOTFND ( 409 ) /* not found */
+
+#ifndef _ERRNO_T_DEFINED
+#define _ERRNO_T_DEFINED
+typedef int errno_t;
+#endif
+
+#if !defined(_WIN64) && !defined(__APPLE__) || defined(__MINGW32__)
+typedef unsigned int rsize_t;
+#endif
+
+#if defined(RMT_PLATFORM_MACOS) && !defined(_RSIZE_T)
+typedef __darwin_size_t rsize_t;
+#endif
+
+static rsize_t
+strnlen_s (const char *dest, rsize_t dmax)
+{
+ rsize_t count;
+
+ if (dest == NULL) {
+ return RCNEGATE(0);
+ }
+
+ if (dmax == 0) {
+ return RCNEGATE(0);
+ }
+
+ if (dmax > RSIZE_MAX_STR) {
+ return RCNEGATE(0);
+ }
+
+ count = 0;
+ while (*dest && dmax) {
+ count++;
+ dmax--;
+ dest++;
+ }
+
+ return RCNEGATE(count);
+}
+
+
+static errno_t
+strstr_s (char *dest, rsize_t dmax,
+ const char *src, rsize_t slen, char **substring)
+{
+ rsize_t len;
+ rsize_t dlen;
+ int i;
+
+ if (substring == NULL) {
+ return RCNEGATE(ESNULLP);
+ }
+ *substring = NULL;
+
+ if (dest == NULL) {
+ return RCNEGATE(ESNULLP);
+ }
+
+ if (dmax == 0) {
+ return RCNEGATE(ESZEROL);
+ }
+
+ if (dmax > RSIZE_MAX_STR) {
+ return RCNEGATE(ESLEMAX);
+ }
+
+ if (src == NULL) {
+ return RCNEGATE(ESNULLP);
+ }
+
+ if (slen == 0) {
+ return RCNEGATE(ESZEROL);
+ }
+
+ if (slen > RSIZE_MAX_STR) {
+ return RCNEGATE(ESLEMAX);
+ }
+
+ /*
+ * src points to a string with zero length, or
+ * src equals dest, return dest
+ */
+ if (*src == '\0' || dest == src) {
+ *substring = dest;
+ return RCNEGATE(EOK);
+ }
+
+ while (*dest && dmax) {
+ i = 0;
+ len = slen;
+ dlen = dmax;
+
+ while (src[i] && dlen) {
+
+ /* not a match, not a substring */
+ if (dest[i] != src[i]) {
+ break;
+ }
+
+ /* move to the next char */
+ i++;
+ len--;
+ dlen--;
+
+ if (src[i] == '\0' || !len) {
+ *substring = dest;
+ return RCNEGATE(EOK);
+ }
+ }
+ dest++;
+ dmax--;
+ }
+
+ /*
+ * substring was not found, return NULL
+ */
+ *substring = NULL;
+ return RCNEGATE(ESNOTFND);
+}
+
+
+static errno_t
+strncat_s (char *dest, rsize_t dmax, const char *src, rsize_t slen)
+{
+ const char *overlap_bumper;
+
+ if (dest == NULL) {
+ return RCNEGATE(ESNULLP);
+ }
+
+ if (src == NULL) {
+ return RCNEGATE(ESNULLP);
+ }
+
+ if (slen > RSIZE_MAX_STR) {
+ return RCNEGATE(ESLEMAX);
+ }
+
+ if (dmax == 0) {
+ return RCNEGATE(ESZEROL);
+ }
+
+ if (dmax > RSIZE_MAX_STR) {
+ return RCNEGATE(ESLEMAX);
+ }
+
+ /* hold base of dest in case src was not copied */
+
+ if (dest < src) {
+ overlap_bumper = src;
+
+ /* Find the end of dest */
+ while (*dest != '\0') {
+
+ if (dest == overlap_bumper) {
+ return RCNEGATE(ESOVRLP);
+ }
+
+ dest++;
+ dmax--;
+ if (dmax == 0) {
+ return RCNEGATE(ESUNTERM);
+ }
+ }
+
+ while (dmax > 0) {
+ if (dest == overlap_bumper) {
+ return RCNEGATE(ESOVRLP);
+ }
+
+ /*
+ * Copying truncated before the source null is encountered
+ */
+ if (slen == 0) {
+ *dest = '\0';
+ return RCNEGATE(EOK);
+ }
+
+ *dest = *src;
+ if (*dest == '\0') {
+ return RCNEGATE(EOK);
+ }
+
+ dmax--;
+ slen--;
+ dest++;
+ src++;
+ }
+
+ } else {
+ overlap_bumper = dest;
+
+ /* Find the end of dest */
+ while (*dest != '\0') {
+
+ /*
+ * NOTE: no need to check for overlap here since src comes first
+ * in memory and we're not incrementing src here.
+ */
+ dest++;
+ dmax--;
+ if (dmax == 0) {
+ return RCNEGATE(ESUNTERM);
+ }
+ }
+
+ while (dmax > 0) {
+ if (src == overlap_bumper) {
+ return RCNEGATE(ESOVRLP);
+ }
+
+ /*
+ * Copying truncated
+ */
+ if (slen == 0) {
+ *dest = '\0';
+ return RCNEGATE(EOK);
+ }
+
+ *dest = *src;
+ if (*dest == '\0') {
+ return RCNEGATE(EOK);
+ }
+
+ dmax--;
+ slen--;
+ dest++;
+ src++;
+ }
+ }
+
+ /*
+ * the entire src was not copied, so the string will be nulled.
+ */
+ return RCNEGATE(ESNOSPC);
+}
+
+
+
+/* very simple integer to hex */
+static const char* hex_encoding_table = "0123456789ABCDEF";
+
+static void itoahex_s( char *dest, rsize_t dmax, rmtS32 value )
+{
+ rsize_t len;
+ rmtS32 halfbytepos;
+
+ halfbytepos = 8;
+
+ /* strip leading 0's */
+ while (halfbytepos > 1)
+ {
+ --halfbytepos;
+ if (value >> (4 * halfbytepos) & 0xF)
+ {
+ ++halfbytepos;
+ break;
+ }
+ }
+
+ len = 0;
+ while(len + 1 < dmax && halfbytepos > 0)
+ {
+ --halfbytepos;
+ dest[len] = hex_encoding_table[value >> (4 * halfbytepos) & 0xF];
+ ++len;
+ }
+
+ if (len < dmax)
+ {
+ dest[len] = 0;
+ }
+}
+
+
+/*
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+ @OBJALLOC: Reusable Object Allocator
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+*/
+
+
+
+//
+// All objects that require free-list-backed allocation need to inherit from this type.
+//
+typedef struct ObjectLink_s
+{
+ struct ObjectLink_s* volatile next;
+} ObjectLink;
+
+
+static void ObjectLink_Constructor(ObjectLink* link)
+{
+ assert(link != NULL);
+ link->next = NULL;
+}
+
+
+typedef rmtError (*ObjConstructor)(void*);
+typedef void (*ObjDestructor)(void*);
+
+
+typedef struct
+{
+ // Object create/destroy parameters
+ rmtU32 object_size;
+ ObjConstructor constructor;
+ ObjDestructor destructor;
+
+ // Number of objects in the free list
+ volatile rmtS32 nb_free;
+
+ // Number of objects used by callers
+ volatile rmtS32 nb_inuse;
+
+ // Total allocation count
+ volatile rmtS32 nb_allocated;
+
+ ObjectLink* first_free;
+} ObjectAllocator;
+
+
+static rmtError ObjectAllocator_Constructor(ObjectAllocator* allocator, rmtU32 object_size, ObjConstructor constructor, ObjDestructor destructor)
+{
+ allocator->object_size = object_size;
+ allocator->constructor = constructor;
+ allocator->destructor = destructor;
+ allocator->nb_free = 0;
+ allocator->nb_inuse = 0;
+ allocator->nb_allocated = 0;
+ allocator->first_free = NULL;
+ return RMT_ERROR_NONE;
+}
+
+
+static void ObjectAllocator_Destructor(ObjectAllocator* allocator)
+{
+ // Ensure everything has been released to the allocator
+ assert(allocator != NULL);
+ assert(allocator->nb_inuse == 0);
+
+ // Destroy all objects released to the allocator
+ while (allocator->first_free != NULL)
+ {
+ ObjectLink* next = allocator->first_free->next;
+ assert(allocator->destructor != NULL);
+ allocator->destructor(allocator->first_free);
+ rmtFree(allocator->first_free);
+ allocator->first_free = next;
+ }
+}
+
+
+static void ObjectAllocator_Push(ObjectAllocator* allocator, ObjectLink* start, ObjectLink* end)
+{
+ assert(allocator != NULL);
+ assert(start != NULL);
+ assert(end != NULL);
+
+ // CAS pop add range to the front of the list
+ for (;;)
+ {
+ ObjectLink* old_link = (ObjectLink*)allocator->first_free;
+ end->next = old_link;
+ if (AtomicCompareAndSwapPointer((long* volatile*)&allocator->first_free, (long*)old_link, (long*)start) == RMT_TRUE)
+ break;
+ }
+}
+
+
+static ObjectLink* ObjectAllocator_Pop(ObjectAllocator* allocator)
+{
+ ObjectLink* link;
+
+ assert(allocator != NULL);
+ assert(allocator->first_free != NULL);
+
+ // CAS pop from the front of the list
+ for (;;)
+ {
+ ObjectLink* old_link = (ObjectLink*)allocator->first_free;
+ ObjectLink* next_link = old_link->next;
+ if (AtomicCompareAndSwapPointer((long* volatile*)&allocator->first_free, (long*)old_link, (long*)next_link) == RMT_TRUE)
+ {
+ link = old_link;
+ break;
+ }
+ }
+
+ link->next = NULL;
+
+ return link;
+}
+
+
+static rmtError ObjectAllocator_Alloc(ObjectAllocator* allocator, void** object)
+{
+ // This function only calls the object constructor on initial malloc of an object
+
+ assert(allocator != NULL);
+ assert(object != NULL);
+
+ // Has the free list run out?
+ if (allocator->first_free == NULL)
+ {
+ rmtError error;
+
+ // Allocate/construct a new object
+ void* free_object = rmtMalloc( allocator->object_size );
+ if (free_object == NULL)
+ return RMT_ERROR_MALLOC_FAIL;
+ assert(allocator->constructor != NULL);
+ error = allocator->constructor(free_object);
+ if (error != RMT_ERROR_NONE)
+ {
+ // Auto-teardown on failure
+ assert(allocator->destructor != NULL);
+ allocator->destructor(free_object);
+ rmtFree(free_object);
+ return error;
+ }
+
+ // Add to the free list
+ ObjectAllocator_Push(allocator, (ObjectLink*)free_object, (ObjectLink*)free_object);
+ AtomicAdd(&allocator->nb_allocated, 1);
+ AtomicAdd(&allocator->nb_free, 1);
+ }
+
+ // Pull available objects from the free list
+ *object = ObjectAllocator_Pop(allocator);
+ AtomicSub(&allocator->nb_free, 1);
+ AtomicAdd(&allocator->nb_inuse, 1);
+
+ return RMT_ERROR_NONE;
+}
+
+
+static void ObjectAllocator_Free(ObjectAllocator* allocator, void* object)
+{
+ // Add back to the free-list
+ assert(allocator != NULL);
+ ObjectAllocator_Push(allocator, (ObjectLink*)object, (ObjectLink*)object);
+ AtomicSub(&allocator->nb_inuse, 1);
+ AtomicAdd(&allocator->nb_free, 1);
+}
+
+
+static void ObjectAllocator_FreeRange(ObjectAllocator* allocator, void* start, void* end, rmtU32 count)
+{
+ assert(allocator != NULL);
+ ObjectAllocator_Push(allocator, (ObjectLink*)start, (ObjectLink*)end);
+ AtomicSub(&allocator->nb_inuse, count);
+ AtomicAdd(&allocator->nb_free, count);
+}
+
+
+
+/*
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+ @DYNBUF: Dynamic Buffer
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+*/
+
+
+
+typedef struct
+{
+ rmtU32 alloc_granularity;
+
+ rmtU32 bytes_allocated;
+ rmtU32 bytes_used;
+
+ rmtU8* data;
+} Buffer;
+
+
+static rmtError Buffer_Constructor(Buffer* buffer, rmtU32 alloc_granularity)
+{
+ assert(buffer != NULL);
+ buffer->alloc_granularity = alloc_granularity;
+ buffer->bytes_allocated = 0;
+ buffer->bytes_used = 0;
+ buffer->data = NULL;
+ return RMT_ERROR_NONE;
+}
+
+
+static void Buffer_Destructor(Buffer* buffer)
+{
+ assert(buffer != NULL);
+
+ if (buffer->data != NULL)
+ {
+ rmtFree(buffer->data);
+ buffer->data = NULL;
+ }
+}
+
+
+static rmtError Buffer_Write(Buffer* buffer, void* data, rmtU32 length)
+{
+ assert(buffer != NULL);
+
+ // Reallocate the buffer on overflow
+ if (buffer->bytes_used + length > buffer->bytes_allocated)
+ {
+ // Calculate size increase rounded up to the requested allocation granularity
+ rmtU32 g = buffer->alloc_granularity;
+ rmtU32 a = buffer->bytes_allocated + length;
+ a = a + ((g - 1) - ((a - 1) % g));
+ buffer->bytes_allocated = a;
+ buffer->data = (rmtU8*)rmtRealloc(buffer->data, buffer->bytes_allocated);
+ if (buffer->data == NULL)
+ return RMT_ERROR_MALLOC_FAIL;
+ }
+
+ // Copy all bytes
+ memcpy(buffer->data + buffer->bytes_used, data, length);
+ buffer->bytes_used += length;
+
+ // NULL terminate (if possible) for viewing in debug
+ if (buffer->bytes_used < buffer->bytes_allocated)
+ buffer->data[buffer->bytes_used] = 0;
+
+ return RMT_ERROR_NONE;
+}
+
+
+static rmtError Buffer_WriteString(Buffer* buffer, rmtPStr string)
+{
+ assert(string != NULL);
+ return Buffer_Write(buffer, (void*)string, (rmtU32)strnlen_s(string, 2048));
+}
+
+
+
+/*
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+ @SOCKETS: Sockets TCP/IP Wrapper
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+*/
+
+#ifndef RMT_PLATFORM_WINDOWS
+ typedef int SOCKET;
+ #define INVALID_SOCKET -1
+ #define SOCKET_ERROR -1
+ #define SD_SEND SHUT_WR
+ #define closesocket close
+#endif
+typedef struct
+{
+ SOCKET socket;
+} TCPSocket;
+
+
+typedef struct
+{
+ rmtBool can_read;
+ rmtBool can_write;
+ rmtError error_state;
+} SocketStatus;
+
+
+//
+// Function prototypes
+//
+static void TCPSocket_Close(TCPSocket* tcp_socket);
+
+
+static rmtError InitialiseNetwork()
+{
+ #ifdef RMT_PLATFORM_WINDOWS
+
+ WSADATA wsa_data;
+ if (WSAStartup(MAKEWORD(2, 2), &wsa_data))
+ return RMT_ERROR_SOCKET_INIT_NETWORK_FAIL;
+ if (LOBYTE(wsa_data.wVersion) != 2 || HIBYTE(wsa_data.wVersion) != 2)
+ return RMT_ERROR_SOCKET_INIT_NETWORK_FAIL;
+
+ return RMT_ERROR_NONE;
+
+ #else
+
+ return RMT_ERROR_NONE;
+
+ #endif
+}
+
+
+static void ShutdownNetwork()
+{
+ #ifdef RMT_PLATFORM_WINDOWS
+ WSACleanup();
+ #endif
+}
+
+
+static rmtError TCPSocket_Constructor(TCPSocket* tcp_socket)
+{
+ assert(tcp_socket != NULL);
+ tcp_socket->socket = INVALID_SOCKET;
+ return InitialiseNetwork();
+}
+
+
+static void TCPSocket_Destructor(TCPSocket* tcp_socket)
+{
+ assert(tcp_socket != NULL);
+ TCPSocket_Close(tcp_socket);
+ ShutdownNetwork();
+}
+
+
+static rmtError TCPSocket_RunServer(TCPSocket* tcp_socket, rmtU16 port)
+{
+ SOCKET s = INVALID_SOCKET;
+ struct sockaddr_in sin;
+ #ifdef RMT_PLATFORM_WINDOWS
+ u_long nonblock = 1;
+ #endif
+
+ memset(&sin, 0, sizeof(sin) );
+ assert(tcp_socket != NULL);
+
+ // Try to create the socket
+ s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+ if (s == SOCKET_ERROR)
+ return RMT_ERROR_SOCKET_CREATE_FAIL;
+
+ // Bind the socket to the incoming port
+ sin.sin_family = AF_INET;
+ sin.sin_addr.s_addr = INADDR_ANY;
+ sin.sin_port = htons(port);
+ if (bind(s, (struct sockaddr*)&sin, sizeof(sin)) == SOCKET_ERROR)
+ return RMT_ERROR_SOCKET_BIND_FAIL;
+
+ // Connection is valid, remaining code is socket state modification
+ tcp_socket->socket = s;
+
+ // Enter a listening state with a backlog of 1 connection
+ if (listen(s, 1) == SOCKET_ERROR)
+ return RMT_ERROR_SOCKET_LISTEN_FAIL;
+
+ // Set as non-blocking
+ #ifdef RMT_PLATFORM_WINDOWS
+ if (ioctlsocket(tcp_socket->socket, FIONBIO, &nonblock) == SOCKET_ERROR)
+ return RMT_ERROR_SOCKET_SET_NON_BLOCKING_FAIL;
+ #else
+ if (fcntl(tcp_socket->socket, F_SETFL, O_NONBLOCK) == SOCKET_ERROR)
+ return RMT_ERROR_SOCKET_SET_NON_BLOCKING_FAIL;
+ #endif
+
+ return RMT_ERROR_NONE;
+}
+
+
+static void TCPSocket_Close(TCPSocket* tcp_socket)
+{
+ assert(tcp_socket != NULL);
+
+ if (tcp_socket->socket != INVALID_SOCKET)
+ {
+ // Shutdown the connection, stopping all sends
+ int result = shutdown(tcp_socket->socket, SD_SEND);
+ if (result != SOCKET_ERROR)
+ {
+ // Keep receiving until the peer closes the connection
+ int total = 0;
+ char temp_buf[128];
+ while (result > 0)
+ {
+ result = (int)recv(tcp_socket->socket, temp_buf, sizeof(temp_buf), 0);
+ total += result;
+ }
+ }
+
+ // Close the socket and issue a network shutdown request
+ closesocket(tcp_socket->socket);
+ tcp_socket->socket = INVALID_SOCKET;
+ }
+}
+
+
+static SocketStatus TCPSocket_PollStatus(TCPSocket* tcp_socket)
+{
+ SocketStatus status;
+ fd_set fd_read, fd_write, fd_errors;
+ struct timeval tv;
+
+ status.can_read = RMT_FALSE;
+ status.can_write = RMT_FALSE;
+ status.error_state = RMT_ERROR_NONE;
+
+ assert(tcp_socket != NULL);
+ if (tcp_socket->socket == INVALID_SOCKET)
+ {
+ status.error_state = RMT_ERROR_SOCKET_INVALID_POLL;
+ return status;
+ }
+
+ // Set read/write/error markers for the socket
+ FD_ZERO(&fd_read);
+ FD_ZERO(&fd_write);
+ FD_ZERO(&fd_errors);
+#ifdef _MSC_VER
+# pragma warning(push)
+# pragma warning(disable:4127) // warning C4127: conditional expression is constant
+#endif // _MSC_VER
+ FD_SET(tcp_socket->socket, &fd_read);
+ FD_SET(tcp_socket->socket, &fd_write);
+ FD_SET(tcp_socket->socket, &fd_errors);
+#ifdef _MSC_VER
+# pragma warning(pop)
+#endif // _MSC_VER
+
+ // Poll socket status without blocking
+ tv.tv_sec = 0;
+ tv.tv_usec = 0;
+ if (select(((int)tcp_socket->socket)+1, &fd_read, &fd_write, &fd_errors, &tv) == SOCKET_ERROR)
+ {
+ status.error_state = RMT_ERROR_SOCKET_SELECT_FAIL;
+ return status;
+ }
+
+ status.can_read = FD_ISSET(tcp_socket->socket, &fd_read) != 0 ? RMT_TRUE : RMT_FALSE;
+ status.can_write = FD_ISSET(tcp_socket->socket, &fd_write) != 0 ? RMT_TRUE : RMT_FALSE;
+ status.error_state = FD_ISSET(tcp_socket->socket, &fd_errors) != 0 ? RMT_ERROR_SOCKET_POLL_ERRORS : RMT_ERROR_NONE;
+ return status;
+}
+
+
+static rmtError TCPSocket_AcceptConnection(TCPSocket* tcp_socket, TCPSocket** client_socket)
+{
+ SocketStatus status;
+ SOCKET s;
+ rmtError error;
+
+ // Ensure there is an incoming connection
+ assert(tcp_socket != NULL);
+ status = TCPSocket_PollStatus(tcp_socket);
+ if (status.error_state != RMT_ERROR_NONE || !status.can_read)
+ return status.error_state;
+
+ // Accept the connection
+ s = accept(tcp_socket->socket, 0, 0);
+ if (s == SOCKET_ERROR)
+ return RMT_ERROR_SOCKET_ACCEPT_FAIL;
+
+ // Create a client socket for the new connection
+ assert(client_socket != NULL);
+ New_0(TCPSocket, *client_socket);
+ if (error != RMT_ERROR_NONE)
+ return error;
+ (*client_socket)->socket = s;
+
+ return RMT_ERROR_NONE;
+}
+
+
+static int TCPSocketWouldBlock()
+{
+#ifdef RMT_PLATFORM_WINDOWS
+ DWORD error = WSAGetLastError();
+ return (error == WSAEWOULDBLOCK);
+ #else
+ int error = errno;
+ return (error == EAGAIN || error == EWOULDBLOCK);
+#endif
+
+}
+
+
+static rmtError TCPSocket_Send(TCPSocket* tcp_socket, const void* data, rmtU32 length, rmtU32 timeout_ms)
+{
+ SocketStatus status;
+ char* cur_data = NULL;
+ char* end_data = NULL;
+ rmtU32 start_ms = 0;
+ rmtU32 cur_ms = 0;
+
+ assert(tcp_socket != NULL);
+
+ start_ms = msTimer_Get();
+
+ // Loop until timeout checking whether data can be written
+ status.can_write = RMT_FALSE;
+ while (!status.can_write)
+ {
+ status = TCPSocket_PollStatus(tcp_socket);
+ if (status.error_state != RMT_ERROR_NONE)
+ return status.error_state;
+
+ cur_ms = msTimer_Get();
+ if (cur_ms - start_ms > timeout_ms)
+ return RMT_ERROR_SOCKET_SEND_TIMEOUT;
+ }
+
+ cur_data = (char*)data;
+ end_data = cur_data + length;
+
+ while (cur_data < end_data)
+ {
+ // Attempt to send the remaining chunk of data
+ int bytes_sent = (int)send(tcp_socket->socket, cur_data, (int)(end_data - cur_data), 0);
+
+ if (bytes_sent == SOCKET_ERROR || bytes_sent == 0)
+ {
+ // Close the connection if sending fails for any other reason other than blocking
+ if (bytes_sent != 0 && !TCPSocketWouldBlock())
+ return RMT_ERROR_SOCKET_SEND_FAIL;
+
+ // First check for tick-count overflow and reset, giving a slight hitch every 49.7 days
+ cur_ms = msTimer_Get();
+ if (cur_ms < start_ms)
+ {
+ start_ms = cur_ms;
+ continue;
+ }
+
+ //
+ // Timeout can happen when:
+ //
+ // 1) endpoint is no longer there
+ // 2) endpoint can't consume quick enough
+ // 3) local buffers overflow
+ //
+ // As none of these are actually errors, we have to pass this timeout back to the caller.
+ //
+ // TODO: This strategy breaks down if a send partially completes and then times out!
+ //
+ if (cur_ms - start_ms > timeout_ms)
+ {
+ return RMT_ERROR_SOCKET_SEND_TIMEOUT;
+ }
+ }
+ else
+ {
+ // Jump over the data sent
+ cur_data += bytes_sent;
+ }
+ }
+
+ return RMT_ERROR_NONE;
+}
+
+
+static rmtError TCPSocket_Receive(TCPSocket* tcp_socket, void* data, rmtU32 length, rmtU32 timeout_ms)
+{
+ SocketStatus status;
+ char* cur_data = NULL;
+ char* end_data = NULL;
+ rmtU32 start_ms = 0;
+ rmtU32 cur_ms = 0;
+
+ assert(tcp_socket != NULL);
+
+ // Ensure there is data to receive
+ status = TCPSocket_PollStatus(tcp_socket);
+ if (status.error_state != RMT_ERROR_NONE)
+ return status.error_state;
+ if (!status.can_read)
+ return RMT_ERROR_SOCKET_RECV_NO_DATA;
+
+ cur_data = (char*)data;
+ end_data = cur_data + length;
+
+ // Loop until all data has been received
+ start_ms = msTimer_Get();
+ while (cur_data < end_data)
+ {
+ int bytes_received = (int)recv(tcp_socket->socket, cur_data, (int)(end_data - cur_data), 0);
+
+ if (bytes_received == SOCKET_ERROR || bytes_received == 0)
+ {
+ // Close the connection if receiving fails for any other reason other than blocking
+ if (bytes_received != 0 && !TCPSocketWouldBlock())
+ return RMT_ERROR_SOCKET_RECV_FAILED;
+
+ // First check for tick-count overflow and reset, giving a slight hitch every 49.7 days
+ cur_ms = msTimer_Get();
+ if (cur_ms < start_ms)
+ {
+ start_ms = cur_ms;
+ continue;
+ }
+
+ //
+ // Timeout can happen when:
+ //
+ // 1) data is delayed by sender
+ // 2) sender fails to send a complete set of packets
+ //
+ // As not all of these scenarios are errors, we need to pass this information back to the caller.
+ //
+ // TODO: This strategy breaks down if a receive partially completes and then times out!
+ //
+ if (cur_ms - start_ms > timeout_ms)
+ {
+ return RMT_ERROR_SOCKET_RECV_TIMEOUT;
+ }
+ }
+ else
+ {
+ // Jump over the data received
+ cur_data += bytes_received;
+ }
+ }
+
+ return RMT_ERROR_NONE;
+}
+
+
+
+/*
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+ @SHA1: SHA-1 Cryptographic Hash Function
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+*/
+
+
+//
+// Typed to allow enforced data size specification
+//
+typedef struct
+{
+ rmtU8 data[20];
+} SHA1;
+
+
+/*
+ Copyright (c) 2011, Micael Hildenborg
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of Micael Hildenborg nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY Micael Hildenborg ''AS IS'' AND ANY
+ EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL Micael Hildenborg BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ Contributors:
+ Gustav
+ Several members in the gamedev.se forum.
+ Gregory Petrosyan
+ */
+
+
+// Rotate an integer value to left.
+static unsigned int rol(const unsigned int value, const unsigned int steps)
+{
+ return ((value << steps) | (value >> (32 - steps)));
+}
+
+
+// Sets the first 16 integers in the buffert to zero.
+// Used for clearing the W buffert.
+static void clearWBuffert(unsigned int* buffert)
+{
+ int pos;
+ for (pos = 16; --pos >= 0;)
+ {
+ buffert[pos] = 0;
+ }
+}
+
+static void innerHash(unsigned int* result, unsigned int* w)
+{
+ unsigned int a = result[0];
+ unsigned int b = result[1];
+ unsigned int c = result[2];
+ unsigned int d = result[3];
+ unsigned int e = result[4];
+
+ int round = 0;
+
+ #define sha1macro(func,val) \
+ { \
+ const unsigned int t = rol(a, 5) + (func) + e + val + w[round]; \
+ e = d; \
+ d = c; \
+ c = rol(b, 30); \
+ b = a; \
+ a = t; \
+ }
+
+ while (round < 16)
+ {
+ sha1macro((b & c) | (~b & d), 0x5a827999)
+ ++round;
+ }
+ while (round < 20)
+ {
+ w[round] = rol((w[round - 3] ^ w[round - 8] ^ w[round - 14] ^ w[round - 16]), 1);
+ sha1macro((b & c) | (~b & d), 0x5a827999)
+ ++round;
+ }
+ while (round < 40)
+ {
+ w[round] = rol((w[round - 3] ^ w[round - 8] ^ w[round - 14] ^ w[round - 16]), 1);
+ sha1macro(b ^ c ^ d, 0x6ed9eba1)
+ ++round;
+ }
+ while (round < 60)
+ {
+ w[round] = rol((w[round - 3] ^ w[round - 8] ^ w[round - 14] ^ w[round - 16]), 1);
+ sha1macro((b & c) | (b & d) | (c & d), 0x8f1bbcdc)
+ ++round;
+ }
+ while (round < 80)
+ {
+ w[round] = rol((w[round - 3] ^ w[round - 8] ^ w[round - 14] ^ w[round - 16]), 1);
+ sha1macro(b ^ c ^ d, 0xca62c1d6)
+ ++round;
+ }
+
+ #undef sha1macro
+
+ result[0] += a;
+ result[1] += b;
+ result[2] += c;
+ result[3] += d;
+ result[4] += e;
+}
+
+
+static void calc(const void* src, const int bytelength, unsigned char* hash)
+{
+ int roundPos;
+ int lastBlockBytes;
+ int hashByte;
+
+ // Init the result array.
+ unsigned int result[5] = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0 };
+
+ // Cast the void src pointer to be the byte array we can work with.
+ const unsigned char* sarray = (const unsigned char*) src;
+
+ // The reusable round buffer
+ unsigned int w[80];
+
+ // Loop through all complete 64byte blocks.
+ const int endOfFullBlocks = bytelength - 64;
+ int endCurrentBlock;
+ int currentBlock = 0;
+
+ while (currentBlock <= endOfFullBlocks)
+ {
+ endCurrentBlock = currentBlock + 64;
+
+ // Init the round buffer with the 64 byte block data.
+ for (roundPos = 0; currentBlock < endCurrentBlock; currentBlock += 4)
+ {
+ // This line will swap endian on big endian and keep endian on little endian.
+ w[roundPos++] = (unsigned int) sarray[currentBlock + 3]
+ | (((unsigned int) sarray[currentBlock + 2]) << 8)
+ | (((unsigned int) sarray[currentBlock + 1]) << 16)
+ | (((unsigned int) sarray[currentBlock]) << 24);
+ }
+ innerHash(result, w);
+ }
+
+ // Handle the last and not full 64 byte block if existing.
+ endCurrentBlock = bytelength - currentBlock;
+ clearWBuffert(w);
+ lastBlockBytes = 0;
+ for (;lastBlockBytes < endCurrentBlock; ++lastBlockBytes)
+ {
+ w[lastBlockBytes >> 2] |= (unsigned int) sarray[lastBlockBytes + currentBlock] << ((3 - (lastBlockBytes & 3)) << 3);
+ }
+ w[lastBlockBytes >> 2] |= 0x80 << ((3 - (lastBlockBytes & 3)) << 3);
+ if (endCurrentBlock >= 56)
+ {
+ innerHash(result, w);
+ clearWBuffert(w);
+ }
+ w[15] = bytelength << 3;
+ innerHash(result, w);
+
+ // Store hash in result pointer, and make sure we get in in the correct order on both endian models.
+ for (hashByte = 20; --hashByte >= 0;)
+ {
+ hash[hashByte] = (result[hashByte >> 2] >> (((3 - hashByte) & 0x3) << 3)) & 0xff;
+ }
+}
+
+
+static SHA1 SHA1_Calculate(const void* src, unsigned int length)
+{
+ SHA1 hash;
+ assert((int)length >= 0);
+ calc(src, length, hash.data);
+ return hash;
+}
+
+
+
+/*
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+ @BASE64: Base-64 encoder
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+*/
+
+
+
+static const char* b64_encoding_table =
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ "abcdefghijklmnopqrstuvwxyz"
+ "0123456789+/";
+
+
+static rmtU32 Base64_CalculateEncodedLength(rmtU32 length)
+{
+ // ceil(l * 4/3)
+ return 4 * ((length + 2) / 3);
+}
+
+
+static void Base64_Encode(const rmtU8* in_bytes, rmtU32 length, rmtU8* out_bytes)
+{
+ rmtU32 i;
+ rmtU32 encoded_length;
+ rmtU32 remaining_bytes;
+
+ rmtU8* optr = out_bytes;
+
+ for (i = 0; i < length; )
+ {
+ // Read input 3 values at a time, null terminating
+ rmtU32 c0 = i < length ? in_bytes[i++] : 0;
+ rmtU32 c1 = i < length ? in_bytes[i++] : 0;
+ rmtU32 c2 = i < length ? in_bytes[i++] : 0;
+
+ // Encode 4 bytes for ever 3 input bytes
+ rmtU32 triple = (c0 << 0x10) + (c1 << 0x08) + c2;
+ *optr++ = b64_encoding_table[(triple >> 3 * 6) & 0x3F];
+ *optr++ = b64_encoding_table[(triple >> 2 * 6) & 0x3F];
+ *optr++ = b64_encoding_table[(triple >> 1 * 6) & 0x3F];
+ *optr++ = b64_encoding_table[(triple >> 0 * 6) & 0x3F];
+ }
+
+ // Pad output to multiple of 3 bytes with terminating '='
+ encoded_length = Base64_CalculateEncodedLength(length);
+ remaining_bytes = (3 - ((length + 2) % 3)) - 1;
+ for (i = 0; i < remaining_bytes; i++)
+ out_bytes[encoded_length - 1 - i] = '=';
+
+ // Null terminate
+ out_bytes[encoded_length] = 0;
+}
+
+
+
+/*
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+ @MURMURHASH: MurmurHash3
+ https://code.google.com/p/smhasher
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+*/
+
+
+//-----------------------------------------------------------------------------
+// MurmurHash3 was written by Austin Appleby, and is placed in the public
+// domain. The author hereby disclaims copyright to this source code.
+//-----------------------------------------------------------------------------
+
+
+static rmtU32 rotl32(rmtU32 x, rmtS8 r)
+{
+ return (x << r) | (x >> (32 - r));
+}
+
+
+// Block read - if your platform needs to do endian-swapping or can only
+// handle aligned reads, do the conversion here
+static rmtU32 getblock32(const rmtU32* p, int i)
+{
+ return p[i];
+}
+
+
+// Finalization mix - force all bits of a hash block to avalanche
+static rmtU32 fmix32(rmtU32 h)
+{
+ h ^= h >> 16;
+ h *= 0x85ebca6b;
+ h ^= h >> 13;
+ h *= 0xc2b2ae35;
+ h ^= h >> 16;
+ return h;
+}
+
+
+static rmtU32 MurmurHash3_x86_32(const void* key, int len, rmtU32 seed)
+{
+ const rmtU8* data = (const rmtU8*)key;
+ const int nblocks = len / 4;
+
+ rmtU32 h1 = seed;
+
+ const rmtU32 c1 = 0xcc9e2d51;
+ const rmtU32 c2 = 0x1b873593;
+
+ int i;
+
+ const rmtU32 * blocks = (const rmtU32 *)(data + nblocks*4);
+ const rmtU8 * tail = (const rmtU8*)(data + nblocks*4);
+
+ rmtU32 k1 = 0;
+
+ //----------
+ // body
+
+ for (i = -nblocks; i; i++)
+ {
+ rmtU32 k2 = getblock32(blocks,i);
+
+ k2 *= c1;
+ k2 = rotl32(k2,15);
+ k2 *= c2;
+
+ h1 ^= k2;
+ h1 = rotl32(h1,13);
+ h1 = h1*5+0xe6546b64;
+ }
+
+ //----------
+ // tail
+
+ switch(len & 3)
+ {
+ case 3: k1 ^= tail[2] << 16;
+ case 2: k1 ^= tail[1] << 8;
+ case 1: k1 ^= tail[0];
+ k1 *= c1;
+ k1 = rotl32(k1,15);
+ k1 *= c2;
+ h1 ^= k1;
+ };
+
+ //----------
+ // finalization
+
+ h1 ^= len;
+
+ h1 = fmix32(h1);
+
+ return h1;
+}
+
+
+
+/*
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+ @WEBSOCKETS: WebSockets
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+*/
+
+
+
+enum WebSocketMode
+{
+ WEBSOCKET_NONE = 0,
+ WEBSOCKET_TEXT = 1,
+ WEBSOCKET_BINARY = 2,
+};
+
+
+typedef struct
+{
+ TCPSocket* tcp_socket;
+
+ enum WebSocketMode mode;
+
+ rmtU32 frame_bytes_remaining;
+ rmtU32 mask_offset;
+
+ union
+ {
+ rmtU8 data_mask[4];
+ rmtU32 data_mask_u32;
+ };
+} WebSocket;
+
+
+static void WebSocket_Close(WebSocket* web_socket);
+
+
+static char* GetField(char* buffer, rsize_t buffer_length, rmtPStr field_name)
+{
+ char* field = NULL;
+ char* buffer_end = buffer + buffer_length - 1;
+
+ rsize_t field_length = strnlen_s(field_name, buffer_length);
+ if (field_length == 0)
+ return NULL;
+
+ // Search for the start of the field
+ if (strstr_s(buffer, buffer_length, field_name, field_length, &field) != EOK)
+ return NULL;
+
+ // Field name is now guaranteed to be in the buffer so its safe to jump over it without hitting the bounds
+ field += strlen(field_name);
+
+ // Skip any trailing whitespace
+ while (*field == ' ')
+ {
+ if (field >= buffer_end)
+ return NULL;
+ field++;
+ }
+
+ return field;
+}
+
+
+static const char websocket_guid[] = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
+static const char websocket_response[] =
+ "HTTP/1.1 101 Switching Protocols\r\n"
+ "Upgrade: websocket\r\n"
+ "Connection: Upgrade\r\n"
+ "Sec-WebSocket-Accept: ";
+
+
+static rmtError WebSocketHandshake(TCPSocket* tcp_socket, rmtPStr limit_host)
+{
+ rmtU32 start_ms, now_ms;
+
+ // Parsing scratchpad
+ char buffer[1024];
+ char* buffer_ptr = buffer;
+ int buffer_len = sizeof(buffer) - 1;
+ char* buffer_end = buffer + buffer_len;
+
+ char response_buffer[256];
+ int response_buffer_len = sizeof(response_buffer) - 1;
+
+ char* version;
+ char* host;
+ char* key;
+ char* key_end;
+ SHA1 hash;
+
+ assert(tcp_socket != NULL);
+
+ start_ms = msTimer_Get();
+
+ // Really inefficient way of receiving the handshake data from the browser
+ // Not really sure how to do this any better, as the termination requirement is \r\n\r\n
+ while (buffer_ptr - buffer < buffer_len)
+ {
+ rmtError error = TCPSocket_Receive(tcp_socket, buffer_ptr, 1, 20);
+ if (error == RMT_ERROR_SOCKET_RECV_FAILED)
+ return error;
+
+ // If there's a stall receiving the data, check for a handshake timeout
+ if (error == RMT_ERROR_SOCKET_RECV_NO_DATA || error == RMT_ERROR_SOCKET_RECV_TIMEOUT)
+ {
+ now_ms = msTimer_Get();
+ if (now_ms - start_ms > 1000)
+ return RMT_ERROR_SOCKET_RECV_TIMEOUT;
+
+ continue;
+ }
+
+ // Just in case new enums are added...
+ assert(error == RMT_ERROR_NONE);
+
+ if (buffer_ptr - buffer >= 4)
+ {
+ if (*(buffer_ptr - 3) == '\r' &&
+ *(buffer_ptr - 2) == '\n' &&
+ *(buffer_ptr - 1) == '\r' &&
+ *(buffer_ptr - 0) == '\n')
+ break;
+ }
+
+ buffer_ptr++;
+ }
+ *buffer_ptr = 0;
+
+ // HTTP GET instruction
+ if (memcmp(buffer, "GET", 3) != 0)
+ return RMT_ERROR_WEBSOCKET_HANDSHAKE_NOT_GET;
+
+ // Look for the version number and verify that it's supported
+ version = GetField(buffer, buffer_len, "Sec-WebSocket-Version:");
+ if (version == NULL)
+ return RMT_ERROR_WEBSOCKET_HANDSHAKE_NO_VERSION;
+ if (buffer_end - version < 2 || (version[0] != '8' && (version[0] != '1' || version[1] != '3')))
+ return RMT_ERROR_WEBSOCKET_HANDSHAKE_BAD_VERSION;
+
+ // Make sure this connection comes from a known host
+ host = GetField(buffer, buffer_len, "Host:");
+ if (host == NULL)
+ return RMT_ERROR_WEBSOCKET_HANDSHAKE_NO_HOST;
+ if (limit_host != NULL)
+ {
+ rsize_t limit_host_len = strnlen_s(limit_host, 128);
+ char* found = NULL;
+ if (strstr_s(host, buffer_end - host, limit_host, limit_host_len, &found) != EOK)
+ return RMT_ERROR_WEBSOCKET_HANDSHAKE_BAD_HOST;
+ }
+
+ // Look for the key start and null-terminate it within the receive buffer
+ key = GetField(buffer, buffer_len, "Sec-WebSocket-Key:");
+ if (key == NULL)
+ return RMT_ERROR_WEBSOCKET_HANDSHAKE_NO_KEY;
+ if (strstr_s(key, buffer_end - key, "\r\n", 2, &key_end) != EOK)
+ return RMT_ERROR_WEBSOCKET_HANDSHAKE_BAD_KEY;
+ *key_end = 0;
+
+ // Concatenate the browser's key with the WebSocket Protocol GUID and base64 encode
+ // the hash, to prove to the browser that this is a bonafide WebSocket server
+ buffer[0] = 0;
+ if (strncat_s(buffer, buffer_len, key, key_end - key) != EOK)
+ return RMT_ERROR_WEBSOCKET_HANDSHAKE_STRING_FAIL;
+ if (strncat_s(buffer, buffer_len, websocket_guid, sizeof(websocket_guid)) != EOK)
+ return RMT_ERROR_WEBSOCKET_HANDSHAKE_STRING_FAIL;
+ hash = SHA1_Calculate(buffer, (rmtU32)strnlen_s(buffer, buffer_len));
+ Base64_Encode(hash.data, sizeof(hash.data), (rmtU8*)buffer);
+
+ // Send the response back to the server with a longer timeout than usual
+ response_buffer[0] = 0;
+ if (strncat_s(response_buffer, response_buffer_len, websocket_response, sizeof(websocket_response)) != EOK)
+ return RMT_ERROR_WEBSOCKET_HANDSHAKE_STRING_FAIL;
+ if (strncat_s(response_buffer, response_buffer_len, buffer, buffer_len) != EOK)
+ return RMT_ERROR_WEBSOCKET_HANDSHAKE_STRING_FAIL;
+ if (strncat_s(response_buffer, response_buffer_len, "\r\n\r\n", 4) != EOK)
+ return RMT_ERROR_WEBSOCKET_HANDSHAKE_STRING_FAIL;
+
+ return TCPSocket_Send(tcp_socket, response_buffer, (rmtU32)strnlen_s(response_buffer, response_buffer_len), 1000);
+}
+
+
+static rmtError WebSocket_Constructor(WebSocket* web_socket, TCPSocket* tcp_socket)
+{
+ rmtError error = RMT_ERROR_NONE;
+
+ assert(web_socket != NULL);
+ web_socket->tcp_socket = tcp_socket;
+ web_socket->mode = WEBSOCKET_NONE;
+ web_socket->frame_bytes_remaining = 0;
+ web_socket->mask_offset = 0;
+ web_socket->data_mask[0] = 0;
+ web_socket->data_mask[1] = 0;
+ web_socket->data_mask[2] = 0;
+ web_socket->data_mask[3] = 0;
+
+ // Caller can optionally specify which TCP socket to use
+ if (web_socket->tcp_socket == NULL)
+ New_0(TCPSocket, web_socket->tcp_socket);
+
+ return error;
+}
+
+
+static void WebSocket_Destructor(WebSocket* web_socket)
+{
+ WebSocket_Close(web_socket);
+}
+
+
+static rmtError WebSocket_RunServer(WebSocket* web_socket, rmtU32 port, enum WebSocketMode mode)
+{
+ // Create the server's listening socket
+ assert(web_socket != NULL);
+ web_socket->mode = mode;
+ return TCPSocket_RunServer(web_socket->tcp_socket, (rmtU16)port);
+}
+
+
+static void WebSocket_Close(WebSocket* web_socket)
+{
+ assert(web_socket != NULL);
+ Delete(TCPSocket, web_socket->tcp_socket);
+}
+
+
+static SocketStatus WebSocket_PollStatus(WebSocket* web_socket)
+{
+ assert(web_socket != NULL);
+ return TCPSocket_PollStatus(web_socket->tcp_socket);
+}
+
+
+static rmtError WebSocket_AcceptConnection(WebSocket* web_socket, WebSocket** client_socket)
+{
+ TCPSocket* tcp_socket = NULL;
+ rmtError error;
+
+ // Is there a waiting connection?
+ assert(web_socket != NULL);
+ error = TCPSocket_AcceptConnection(web_socket->tcp_socket, &tcp_socket);
+ if (error != RMT_ERROR_NONE || tcp_socket == NULL)
+ return error;
+
+ // Need a successful handshake between client/server before allowing the connection
+ // TODO: Specify limit_host
+ error = WebSocketHandshake(tcp_socket, NULL);
+ if (error != RMT_ERROR_NONE)
+ return error;
+
+ // Allocate and return a new client socket
+ assert(client_socket != NULL);
+ New_1(WebSocket, *client_socket, tcp_socket);
+ if (error != RMT_ERROR_NONE)
+ return error;
+
+ (*client_socket)->mode = web_socket->mode;
+
+ return RMT_ERROR_NONE;
+}
+
+
+static void WriteSize(rmtU32 size, rmtU8* dest, rmtU32 dest_size, rmtU32 dest_offset)
+{
+ int size_size = dest_size - dest_offset;
+ rmtU32 i;
+ for (i = 0; i < dest_size; i++)
+ {
+ int j = i - dest_offset;
+ dest[i] = (j < 0) ? 0 : (size >> ((size_size - j - 1) * 8)) & 0xFF;
+ }
+}
+
+
+static rmtError WebSocket_Send(WebSocket* web_socket, const void* data, rmtU32 length, rmtU32 timeout_ms)
+{
+ rmtError error;
+ SocketStatus status;
+ rmtU8 final_fragment, frame_type, frame_header[10];
+ rmtU32 frame_header_size;
+
+ assert(web_socket != NULL);
+
+ // Can't send if there are socket errors
+ status = WebSocket_PollStatus(web_socket);
+ if (status.error_state != RMT_ERROR_NONE)
+ return status.error_state;
+
+ final_fragment = 0x1 << 7;
+ frame_type = (rmtU8)web_socket->mode;
+ frame_header[0] = final_fragment | frame_type;
+
+ // Construct the frame header, correctly applying the narrowest size
+ frame_header_size = 0;
+ if (length <= 125)
+ {
+ frame_header_size = 2;
+ frame_header[1] = (rmtU8)length;
+ }
+ else if (length <= 65535)
+ {
+ frame_header_size = 2 + 2;
+ frame_header[1] = 126;
+ WriteSize(length, frame_header + 2, 2, 0);
+ }
+ else
+ {
+ frame_header_size = 2 + 8;
+ frame_header[1] = 127;
+ WriteSize(length, frame_header + 2, 8, 4);
+ }
+
+ // Send frame header
+ assert(data != NULL);
+ error = TCPSocket_Send(web_socket->tcp_socket, frame_header, frame_header_size, timeout_ms);
+ if (error != RMT_ERROR_NONE)
+ return error;
+
+ // Send frame data separately so that we don't have to allocate memory or memcpy it into
+ // the same buffer as the header.
+ // If this step times out then the frame data will be discarded and the browser will receive
+ // an invalid frame without its data, forcing a disconnect error.
+ // Before things get that far, flag this as a send fail and let the server schedule a graceful
+ // disconnect.
+ error = TCPSocket_Send(web_socket->tcp_socket, data, length, timeout_ms);
+ if (error == RMT_ERROR_SOCKET_SEND_TIMEOUT)
+ error = RMT_ERROR_SOCKET_SEND_FAIL;
+
+ return error;
+}
+
+
+static rmtError ReceiveFrameHeader(WebSocket* web_socket)
+{
+ // TODO: Specify infinite timeout?
+
+ rmtError error;
+ rmtU8 msg_header[2] = { 0, 0 };
+ int msg_length, size_bytes_remaining, i;
+ rmtBool mask_present;
+
+ assert(web_socket != NULL);
+
+ // Get message header
+ error = TCPSocket_Receive(web_socket->tcp_socket, msg_header, 2, 20);
+ if (error != RMT_ERROR_NONE)
+ return error;
+
+ // Check for WebSocket Protocol disconnect
+ if (msg_header[0] == 0x88)
+ return RMT_ERROR_WEBSOCKET_DISCONNECTED;
+
+ // Check that the client isn't sending messages we don't understand
+ if (msg_header[0] != 0x81 && msg_header[0] != 0x82)
+ return RMT_ERROR_WEBSOCKET_BAD_FRAME_HEADER;
+
+ // Get message length and check to see if it's a marker for a wider length
+ msg_length = msg_header[1] & 0x7F;
+ size_bytes_remaining = 0;
+ switch (msg_length)
+ {
+ case 126: size_bytes_remaining = 2; break;
+ case 127: size_bytes_remaining = 8; break;
+ }
+
+ if (size_bytes_remaining > 0)
+ {
+ // Receive the wider bytes of the length
+ rmtU8 size_bytes[4];
+ error = TCPSocket_Receive(web_socket->tcp_socket, size_bytes, size_bytes_remaining, 20);
+ if (error != RMT_ERROR_NONE)
+ return RMT_ERROR_WEBSOCKET_BAD_FRAME_HEADER_SIZE;
+
+ // Calculate new length, MSB first
+ msg_length = 0;
+ for (i = 0; i < size_bytes_remaining; i++)
+ msg_length |= size_bytes[i] << ((size_bytes_remaining - 1 - i) * 8);
+ }
+
+ // Receive any message data masks
+ mask_present = (msg_header[1] & 0x80) != 0 ? RMT_TRUE : RMT_FALSE;
+ if (mask_present)
+ {
+ error = TCPSocket_Receive(web_socket->tcp_socket, web_socket->data_mask, 4, 20);
+ if (error != RMT_ERROR_NONE)
+ return error;
+ }
+
+ web_socket->frame_bytes_remaining = msg_length;
+ web_socket->mask_offset = 0;
+
+ return RMT_ERROR_NONE;
+}
+
+
+static rmtError WebSocket_Receive(WebSocket* web_socket, void* data, rmtU32* msg_len, rmtU32 length, rmtU32 timeout_ms)
+{
+ SocketStatus status;
+ char* cur_data;
+ char* end_data;
+ rmtU32 start_ms, now_ms;
+ rmtU32 bytes_to_read;
+ rmtError error;
+
+ assert(web_socket != NULL);
+
+ // Can't read with any socket errors
+ status = WebSocket_PollStatus(web_socket);
+ if (status.error_state != RMT_ERROR_NONE)
+ return status.error_state;
+
+ cur_data = (char*)data;
+ end_data = cur_data + length;
+
+ start_ms = msTimer_Get();
+ while (cur_data < end_data)
+ {
+ // Get next WebSocket frame if we've run out of data to read from the socket
+ if (web_socket->frame_bytes_remaining == 0)
+ {
+ error = ReceiveFrameHeader(web_socket);
+ if (error != RMT_ERROR_NONE)
+ return error;
+
+ // Set output message length only on initial receive
+ if (msg_len != NULL)
+ *msg_len = web_socket->frame_bytes_remaining;
+ }
+
+ // Read as much required data as possible
+ bytes_to_read = web_socket->frame_bytes_remaining < length ? web_socket->frame_bytes_remaining : length;
+ error = TCPSocket_Receive(web_socket->tcp_socket, cur_data, bytes_to_read, 20);
+ if (error == RMT_ERROR_SOCKET_RECV_FAILED)
+ return error;
+
+ // If there's a stall receiving the data, check for timeout
+ if (error == RMT_ERROR_SOCKET_RECV_NO_DATA || error == RMT_ERROR_SOCKET_RECV_TIMEOUT)
+ {
+ now_ms = msTimer_Get();
+ if (now_ms - start_ms > timeout_ms)
+ return RMT_ERROR_SOCKET_RECV_TIMEOUT;
+ continue;
+ }
+
+ // Apply data mask
+ if (web_socket->data_mask_u32 != 0)
+ {
+ rmtU32 i;
+ for (i = 0; i < bytes_to_read; i++)
+ {
+ *((rmtU8*)cur_data + i) ^= web_socket->data_mask[web_socket->mask_offset & 3];
+ web_socket->mask_offset++;
+ }
+ }
+
+ cur_data += bytes_to_read;
+ web_socket->frame_bytes_remaining -= bytes_to_read;
+ }
+
+ return RMT_ERROR_NONE;
+}
+
+
+
+/*
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+ @MESSAGEQ: Multiple producer, single consumer message queue
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+*/
+
+
+typedef enum MessageID
+{
+ MsgID_NotReady,
+ MsgID_LogText,
+ MsgID_SampleTree,
+} MessageID;
+
+
+typedef struct Message
+{
+ MessageID id;
+
+ rmtU32 payload_size;
+
+ // For telling which thread the message came from in the debugger
+ struct ThreadSampler* thread_sampler;
+
+ rmtU8 payload[1];
+} Message;
+
+
+// Multiple producer, single consumer message queue that uses its own data buffer
+// to store the message data.
+typedef struct MessageQueue
+{
+ rmtU32 size;
+
+ // The physical address of this data buffer is pointed to by two sequential
+ // virtual memory pages, allowing automatic wrap-around of any reads or writes
+ // that exceed the limits of the buffer.
+ VirtualMirrorBuffer* data;
+
+ // Read/write position never wrap allowing trivial overflow checks
+ // with easier debugging
+ rmtU32 read_pos;
+ rmtU32 write_pos;
+
+} MessageQueue;
+
+
+static rmtError MessageQueue_Constructor(MessageQueue* queue, rmtU32 size)
+{
+ rmtError error;
+
+ assert(queue != NULL);
+
+ // Set defaults
+ queue->size = 0;
+ queue->data = NULL;
+ queue->read_pos = 0;
+ queue->write_pos = 0;
+
+ New_2(VirtualMirrorBuffer, queue->data, size, 10);
+ if (error != RMT_ERROR_NONE)
+ return error;
+
+ // The mirror buffer needs to be page-aligned and will change the requested
+ // size to match that.
+ queue->size = queue->data->size;
+
+ // Set the entire buffer to not ready message
+ memset(queue->data->ptr, MsgID_NotReady, queue->size);
+
+ return RMT_ERROR_NONE;
+}
+
+
+static void MessageQueue_Destructor(MessageQueue* queue)
+{
+ assert(queue != NULL);
+ Delete(VirtualMirrorBuffer, queue->data);
+}
+
+
+static Message* MessageQueue_AllocMessage(MessageQueue* queue, rmtU32 payload_size, struct ThreadSampler* thread_sampler)
+{
+ Message* msg;
+
+ rmtU32 write_size = sizeof(Message) + payload_size;
+
+ assert(queue != NULL);
+
+ for (;;)
+ {
+ // Check for potential overflow
+ rmtU32 s = queue->size;
+ rmtU32 r = queue->read_pos;
+ rmtU32 w = queue->write_pos;
+ if ((int)(w - r) > ((int)(s - write_size)))
+ return NULL;
+
+ // Point to the newly allocated space
+ msg = (Message*)(queue->data->ptr + (w & (s - 1)));
+
+ // Increment the write position, leaving the loop if this is the thread that succeeded
+ if (AtomicCompareAndSwap(&queue->write_pos, w, w + write_size) == RMT_TRUE)
+ {
+ // Safe to set payload size after thread claims ownership of this allocated range
+ msg->payload_size = payload_size;
+ msg->thread_sampler = thread_sampler;
+ break;
+ }
+ }
+
+ return msg;
+}
+
+
+static void MessageQueue_CommitMessage(MessageQueue* queue, Message* message, MessageID id)
+{
+ assert(queue != NULL);
+ assert(message != NULL);
+
+ // Ensure message writes complete before commit
+ WriteFence();
+
+ // Setting the message ID signals to the consumer that the message is ready
+ assert(message->id == MsgID_NotReady);
+ message->id = id;
+
+ RMT_UNREFERENCED_PARAMETER(queue);
+}
+
+
+Message* MessageQueue_PeekNextMessage(MessageQueue* queue)
+{
+ Message* ptr;
+ rmtU32 r;
+
+ assert(queue != NULL);
+
+ // First check that there are bytes queued
+ if (queue->write_pos - queue->read_pos == 0)
+ return NULL;
+
+ // Messages are in the queue but may not have been commit yet
+ // Messages behind this one may have been commit but it's not reachable until
+ // the next one in the queue is ready.
+ r = queue->read_pos & (queue->size - 1);
+ ptr = (Message*)(queue->data->ptr + r);
+ if (ptr->id != MsgID_NotReady)
+ return ptr;
+
+ return NULL;
+}
+
+
+static void MessageQueue_ConsumeNextMessage(MessageQueue* queue, Message* message)
+{
+ rmtU32 message_size;
+
+ assert(queue != NULL);
+ assert(message != NULL);
+
+ // Setting the message ID to "not ready" serves as a marker to the consumer that even though
+ // space has been allocated for a message, the message isn't ready to be consumed
+ // yet.
+ //
+ // We can't do that when allocating the message because multiple threads will be fighting for
+ // the same location. Instead, clear out any messages just read by the consumer before advancing
+ // the read position so that a winning thread's allocation will inherit the "not ready" state.
+ //
+ // This costs some write bandwidth and has the potential to flush cache to other cores.
+ message_size = sizeof(Message) + message->payload_size;
+ memset(message, MsgID_NotReady, message_size);
+
+ // Ensure clear completes before advancing the read position
+ WriteFence();
+ queue->read_pos += message_size;
+}
+
+
+/*
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+ @NETWORK: Network Server
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+*/
+
+
+
+typedef struct
+{
+ WebSocket* listen_socket;
+
+ WebSocket* client_socket;
+
+ rmtU32 last_ping_time;
+
+ rmtU16 port;
+} Server;
+
+
+static rmtError Server_CreateListenSocket(Server* server, rmtU16 port)
+{
+ rmtError error = RMT_ERROR_NONE;
+
+ New_1(WebSocket, server->listen_socket, NULL);
+ if (error == RMT_ERROR_NONE)
+ error = WebSocket_RunServer(server->listen_socket, port, WEBSOCKET_TEXT);
+
+ return error;
+}
+
+
+static rmtError Server_Constructor(Server* server, rmtU16 port)
+{
+ assert(server != NULL);
+ server->listen_socket = NULL;
+ server->client_socket = NULL;
+ server->last_ping_time = 0;
+ server->port = port;
+
+ // Create the listening WebSocket
+ return Server_CreateListenSocket(server, port);
+}
+
+
+static void Server_Destructor(Server* server)
+{
+ assert(server != NULL);
+ Delete(WebSocket, server->client_socket);
+ Delete(WebSocket, server->listen_socket);
+}
+
+
+static rmtBool Server_IsClientConnected(Server* server)
+{
+ assert(server != NULL);
+ return server->client_socket != NULL ? RMT_TRUE : RMT_FALSE;
+}
+
+
+static void Server_DisconnectClient(Server* server)
+{
+ WebSocket* client_socket;
+
+ assert(server != NULL);
+
+ // NULL the variable before destroying the socket
+ client_socket = server->client_socket;
+ server->client_socket = NULL;
+ WriteFence();
+ Delete(WebSocket, client_socket);
+}
+
+
+static rmtError Server_Send(Server* server, const void* data, rmtU32 length, rmtU32 timeout)
+{
+ assert(server != NULL);
+ if (Server_IsClientConnected(server))
+ {
+ rmtError error = WebSocket_Send(server->client_socket, data, length, timeout);
+ if (error == RMT_ERROR_SOCKET_SEND_FAIL)
+ Server_DisconnectClient(server);
+
+ return error;
+ }
+
+ return RMT_ERROR_NONE;
+}
+
+
+static rmtError Server_ReceiveMessage(Server* server, char message_first_byte, rmtU32 message_length)
+{
+ char message_data[1024];
+ rmtError error;
+
+ // Check for potential message data overflow
+ if (message_length >= sizeof(message_data) - 1)
+ {
+ rmt_LogText("Ignoring console input bigger than internal receive buffer (1024 bytes)");
+ return RMT_ERROR_NONE;
+ }
+
+ // Receive the rest of the message
+ message_data[0] = message_first_byte;
+ error = WebSocket_Receive(server->client_socket, message_data + 1, NULL, message_length - 1, 100);
+ if (error != RMT_ERROR_NONE)
+ return error;
+ message_data[message_length] = 0;
+
+ // Each message must have a descriptive 4 byte header
+ if (message_length < 4)
+ return RMT_ERROR_NONE;
+
+ // Silly check for console input message ('CONI')
+ // (don't want to add safe strcmp to lib yet)
+ if (message_data[0] == 'C' && message_data[1] == 'O' && message_data[2] == 'N' && message_data[3] == 'I')
+ {
+ // Pass on to any registered handler
+ if (g_Settings.input_handler != NULL)
+ g_Settings.input_handler(message_data + 4, g_Settings.input_handler_context);
+
+ rmt_LogText("Console message received...");
+ rmt_LogText(message_data + 4);
+ }
+
+ return RMT_ERROR_NONE;
+}
+
+
+static void Server_Update(Server* server)
+{
+ rmtU32 cur_time;
+
+ assert(server != NULL);
+
+ // Recreate the listening socket if it's been destroyed earlier
+ if (server->listen_socket == NULL)
+ Server_CreateListenSocket(server, server->port);
+
+ if (server->listen_socket != NULL && server->client_socket == NULL)
+ {
+ // Accept connections as long as there is no client connected
+ WebSocket* client_socket = NULL;
+ rmtError error = WebSocket_AcceptConnection(server->listen_socket, &client_socket);
+ if (error == RMT_ERROR_NONE)
+ {
+ server->client_socket = client_socket;
+ }
+ else
+ {
+ // Destroy the listen socket on failure to accept
+ // It will get recreated in another update
+ Delete(WebSocket, server->listen_socket);
+ }
+ }
+
+ else
+ {
+ // Check for any incoming messages
+ char message_first_byte;
+ rmtU32 message_length;
+ rmtError error = WebSocket_Receive(server->client_socket, &message_first_byte, &message_length, 1, 0);
+ if (error == RMT_ERROR_NONE)
+ {
+ // Parse remaining message
+ error = Server_ReceiveMessage(server, message_first_byte, message_length);
+ if (error != RMT_ERROR_NONE)
+ Server_DisconnectClient(server);
+ }
+ else if (error == RMT_ERROR_SOCKET_RECV_NO_DATA)
+ {
+ // no data available
+ }
+ else if (error == RMT_ERROR_SOCKET_RECV_TIMEOUT)
+ {
+ // data not available yet, can afford to ignore as we're only reading the first byte
+ }
+ else
+ {
+ // Anything else is an error that may have closed the connection
+ Server_DisconnectClient(server);
+ }
+ }
+
+ // Send pings to the client every second
+ cur_time = msTimer_Get();
+ if (cur_time - server->last_ping_time > 1000)
+ {
+ rmtPStr ping_message = "{ \"id\": \"PING\" }";
+ Server_Send(server, ping_message, (rmtU32)strlen(ping_message), 20);
+ server->last_ping_time = cur_time;
+ }
+}
+
+
+
+/*
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+ @JSON: Basic, text-based JSON serialisation
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+*/
+
+
+
+//
+// Simple macro for hopefully making the serialisation a little clearer by hiding the error handling
+//
+#define JSON_ERROR_CHECK(stmt) { error = stmt; if (error != RMT_ERROR_NONE) return error; }
+
+
+
+static rmtError json_OpenObject(Buffer* buffer)
+{
+ return Buffer_Write(buffer, (void*)"{", 1);
+}
+
+
+static rmtError json_CloseObject(Buffer* buffer)
+{
+ return Buffer_Write(buffer, (void*)"}", 1);
+}
+
+
+static rmtError json_Comma(Buffer* buffer)
+{
+ return Buffer_Write(buffer, (void*)",", 1);
+}
+
+
+static rmtError json_Colon(Buffer* buffer)
+{
+ return Buffer_Write(buffer, (void*)":", 1);
+}
+
+
+static rmtError json_String(Buffer* buffer, rmtPStr string)
+{
+ rmtError error;
+ JSON_ERROR_CHECK(Buffer_Write(buffer, (void*)"\"", 1));
+ JSON_ERROR_CHECK(Buffer_WriteString(buffer, string));
+ return Buffer_Write(buffer, (void*)"\"", 1);
+}
+
+
+static rmtError json_FieldStr(Buffer* buffer, rmtPStr name, rmtPStr value)
+{
+ rmtError error;
+ JSON_ERROR_CHECK(json_String(buffer, name));
+ JSON_ERROR_CHECK(json_Colon(buffer));
+ return json_String(buffer, value);
+}
+
+
+static rmtError json_FieldU64(Buffer* buffer, rmtPStr name, rmtU64 value)
+{
+ static char temp_buf[32];
+
+ char* end;
+ char* tptr;
+
+ json_String(buffer, name);
+ json_Colon(buffer);
+
+ if (value == 0)
+ return Buffer_Write(buffer, (void*)"0", 1);
+
+ // Null terminate and start at the end
+ end = temp_buf + sizeof(temp_buf) - 1;
+ *end = 0;
+ tptr = end;
+
+ // Loop through the value with radix 10
+ do
+ {
+ rmtU64 next_value = value / 10;
+ *--tptr = (char)('0' + (value - next_value * 10));
+ value = next_value;
+ } while (value);
+
+ return Buffer_Write(buffer, tptr, (rmtU32)(end - tptr));
+}
+
+
+static rmtError json_OpenArray(Buffer* buffer, rmtPStr name)
+{
+ rmtError error;
+ JSON_ERROR_CHECK(json_String(buffer, name));
+ JSON_ERROR_CHECK(json_Colon(buffer));
+ return Buffer_Write(buffer, (void*)"[", 1);
+}
+
+
+static rmtError json_CloseArray(Buffer* buffer)
+{
+ return Buffer_Write(buffer, (void*)"]", 1);
+}
+
+
+
+/*
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+ @SAMPLE: Base Sample Description for CPU by default
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+*/
+
+
+
+enum SampleType
+{
+ SampleType_CPU,
+ SampleType_CUDA,
+ SampleType_D3D11,
+ SampleType_OpenGL,
+ SampleType_Count,
+};
+
+
+typedef struct Sample
+{
+ // Inherit so that samples can be quickly allocated
+ ObjectLink Link;
+
+ enum SampleType type;
+
+ // Used to anonymously copy sample data without knowning its type
+ rmtU32 size_bytes;
+
+ // Sample name and unique hash
+ rmtPStr name;
+ rmtU32 name_hash;
+
+ // Unique, persistent ID among all samples
+ rmtU32 unique_id;
+
+ // Null-terminated string storing the hash-prefixed 6-digit colour
+ rmtU8 unique_id_html_colour[8];
+
+ // Links to related samples in the tree
+ struct Sample* parent;
+ struct Sample* first_child;
+ struct Sample* last_child;
+ struct Sample* next_sibling;
+
+ // Keep track of child count to distinguish from repeated calls to the same function at the same stack level
+ // This is also mixed with the callstack hash to allow consistent addressing of any point in the tree
+ rmtU32 nb_children;
+
+ // Start and end of the sample in microseconds
+ rmtU64 us_start;
+ rmtU64 us_end;
+
+} Sample;
+
+
+static rmtError Sample_Constructor(Sample* sample)
+{
+ assert(sample != NULL);
+
+ ObjectLink_Constructor((ObjectLink*)sample);
+
+ sample->type = SampleType_CPU;
+ sample->size_bytes = sizeof(Sample);
+ sample->name = NULL;
+ sample->name_hash = 0;
+ sample->unique_id = 0;
+ sample->unique_id_html_colour[0] = '#';
+ sample->unique_id_html_colour[1] = 0;
+ sample->unique_id_html_colour[7] = 0;
+ sample->parent = NULL;
+ sample->first_child = NULL;
+ sample->last_child = NULL;
+ sample->next_sibling = NULL;
+ sample->nb_children = 0;
+ sample->us_start = 0;
+ sample->us_end = 0;
+
+ return RMT_ERROR_NONE;
+}
+
+
+static void Sample_Destructor(Sample* sample)
+{
+ RMT_UNREFERENCED_PARAMETER(sample);
+}
+
+
+static void Sample_Prepare(Sample* sample, rmtPStr name, rmtU32 name_hash, Sample* parent)
+{
+ sample->name = name;
+ sample->name_hash = name_hash;
+ sample->unique_id = 0;
+ sample->parent = parent;
+ sample->first_child = NULL;
+ sample->last_child = NULL;
+ sample->next_sibling = NULL;
+ sample->nb_children = 0;
+ sample->us_start = 0;
+ sample->us_end = 0;
+}
+
+
+static rmtError json_SampleArray(Buffer* buffer, Sample* first_sample, rmtPStr name);
+
+
+static rmtError json_Sample(Buffer* buffer, Sample* sample)
+{
+ rmtError error;
+
+ assert(sample != NULL);
+
+ JSON_ERROR_CHECK(json_OpenObject(buffer));
+
+ JSON_ERROR_CHECK(json_FieldStr(buffer, "name", sample->name));
+ JSON_ERROR_CHECK(json_Comma(buffer));
+ JSON_ERROR_CHECK(json_FieldU64(buffer, "id", sample->unique_id));
+ JSON_ERROR_CHECK(json_Comma(buffer));
+ JSON_ERROR_CHECK(json_FieldStr(buffer, "colour", (rmtPStr)sample->unique_id_html_colour));
+ JSON_ERROR_CHECK(json_Comma(buffer));
+ JSON_ERROR_CHECK(json_FieldU64(buffer, "us_start", sample->us_start));
+ JSON_ERROR_CHECK(json_Comma(buffer));
+ JSON_ERROR_CHECK(json_FieldU64(buffer, "us_length", maxS64(sample->us_end - sample->us_start, 0)));
+
+ if (sample->first_child != NULL)
+ {
+ JSON_ERROR_CHECK(json_Comma(buffer));
+ JSON_ERROR_CHECK(json_SampleArray(buffer, sample->first_child, "children"));
+ }
+
+ return json_CloseObject(buffer);
+}
+
+
+static rmtError json_SampleArray(Buffer* buffer, Sample* first_sample, rmtPStr name)
+{
+ rmtError error;
+
+ Sample* sample;
+
+ JSON_ERROR_CHECK(json_OpenArray(buffer, name));
+
+ for (sample = first_sample; sample != NULL; sample = sample->next_sibling)
+ {
+ JSON_ERROR_CHECK(json_Sample(buffer, sample));
+ if (sample->next_sibling != NULL)
+ JSON_ERROR_CHECK(json_Comma(buffer));
+ }
+
+ return json_CloseArray(buffer);
+}
+
+
+
+/*
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+ @SAMPLETREE: A tree of samples with their allocator
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+*/
+
+
+
+typedef struct SampleTree
+{
+ // Allocator for all samples
+ ObjectAllocator* allocator;
+
+ // Root sample for all samples created by this thread
+ Sample* root;
+
+ // Most recently pushed sample
+ Sample* current_parent;
+
+} SampleTree;
+
+
+static rmtError SampleTree_Constructor(SampleTree* tree, rmtU32 sample_size, ObjConstructor constructor, ObjDestructor destructor)
+{
+ rmtError error;
+
+ assert(tree != NULL);
+
+ tree->allocator = NULL;
+ tree->root = NULL;
+ tree->current_parent = NULL;
+
+ // Create the sample allocator
+ New_3(ObjectAllocator, tree->allocator, sample_size, constructor, destructor);
+ if (error != RMT_ERROR_NONE)
+ return error;
+
+ // Create a root sample that's around for the lifetime of the thread
+ error = ObjectAllocator_Alloc(tree->allocator, (void**)&tree->root);
+ if (error != RMT_ERROR_NONE)
+ return error;
+ Sample_Prepare(tree->root, "<Root Sample>", 0, NULL);
+ tree->current_parent = tree->root;
+
+ return RMT_ERROR_NONE;
+}
+
+
+static void SampleTree_Destructor(SampleTree* tree)
+{
+ assert(tree != NULL);
+
+ if (tree->root != NULL)
+ {
+ ObjectAllocator_Free(tree->allocator, tree->root);
+ tree->root = NULL;
+ }
+
+ Delete(ObjectAllocator, tree->allocator);
+}
+
+
+static rmtU32 HashCombine(rmtU32 hash_a, rmtU32 hash_b)
+{
+ // A sequence of 32 uniformly random bits so that each bit of the combined hash is changed on application
+ // Derived from the golden ratio: UINT_MAX / ((1 + sqrt(5)) / 2)
+ // In reality it's just an arbitrary value which happens to work well, avoiding mapping all zeros to zeros.
+ // http://burtleburtle.net/bob/hash/doobs.html
+ static rmtU32 random_bits = 0x9E3779B9;
+ hash_a ^= hash_b + random_bits + (hash_a << 6) + (hash_a >> 2);
+ return hash_a;
+}
+
+
+static rmtError SampleTree_Push(SampleTree* tree, rmtPStr name, rmtU32 name_hash, Sample** sample)
+{
+ Sample* parent;
+ rmtError error;
+ rmtU32 unique_id;
+
+ // As each tree has a root sample node allocated, a parent must always be present
+ assert(tree != NULL);
+ assert(tree->current_parent != NULL);
+ parent = tree->current_parent;
+
+ if (parent->last_child != NULL && parent->last_child->name_hash == name_hash)
+ {
+ // TODO: Collapse siblings with flag exception?
+ // Note that above check is not enough - requires a linear search
+ }
+ if (parent->name_hash == name_hash)
+ {
+ // TODO: Collapse recursion on flag?
+ }
+
+ // Allocate a new sample
+ error = ObjectAllocator_Alloc(tree->allocator, (void**)sample);
+ if (error != RMT_ERROR_NONE)
+ return error;
+ Sample_Prepare(*sample, name, name_hash, parent);
+
+ // Generate a unique ID for this sample in the tree
+ unique_id = parent->unique_id;
+ unique_id = HashCombine(unique_id, (*sample)->name_hash);
+ unique_id = HashCombine(unique_id, parent->nb_children);
+ (*sample)->unique_id = unique_id;
+
+ // Add sample to its parent
+ parent->nb_children++;
+ if (parent->first_child == NULL)
+ {
+ parent->first_child = *sample;
+ parent->last_child = *sample;
+ }
+ else
+ {
+ assert(parent->last_child != NULL);
+ parent->last_child->next_sibling = *sample;
+ parent->last_child = *sample;
+ }
+
+ // Make this sample the new parent of any newly created samples
+ tree->current_parent = *sample;
+
+ return RMT_ERROR_NONE;
+}
+
+
+static void SampleTree_Pop(SampleTree* tree, Sample* sample)
+{
+ assert(tree != NULL);
+ assert(sample != NULL);
+ assert(sample != tree->root);
+ tree->current_parent = sample->parent;
+}
+
+
+static ObjectLink* FlattenSampleTree(Sample* sample, rmtU32* nb_samples)
+{
+ Sample* child;
+ ObjectLink* cur_link = &sample->Link;
+
+ assert(sample != NULL);
+ assert(nb_samples != NULL);
+
+ *nb_samples += 1;
+ sample->Link.next = (ObjectLink*)sample->first_child;
+
+ // Link all children together
+ for (child = sample->first_child; child != NULL; child = child->next_sibling)
+ {
+ ObjectLink* last_link = FlattenSampleTree(child, nb_samples);
+ last_link->next = (ObjectLink*)child->next_sibling;
+ cur_link = last_link;
+ }
+
+ // Clear child info
+ sample->first_child = NULL;
+ sample->last_child = NULL;
+ sample->nb_children = 0;
+
+ return cur_link;
+}
+
+
+static void FreeSampleTree(Sample* sample, ObjectAllocator* allocator)
+{
+ // Chain all samples together in a flat list
+ rmtU32 nb_cleared_samples = 0;
+ ObjectLink* last_link = FlattenSampleTree(sample, &nb_cleared_samples);
+
+ // Release the complete sample memory range
+ if (sample->Link.next != NULL)
+ ObjectAllocator_FreeRange(allocator, sample, last_link, nb_cleared_samples);
+ else
+ ObjectAllocator_Free(allocator, sample);
+}
+
+
+typedef struct Msg_SampleTree
+{
+ Sample* root_sample;
+
+ ObjectAllocator* allocator;
+
+ rmtPStr thread_name;
+} Msg_SampleTree;
+
+
+static void AddSampleTreeMessage(MessageQueue* queue, Sample* sample, ObjectAllocator* allocator, rmtPStr thread_name, struct ThreadSampler* thread_sampler)
+{
+ Msg_SampleTree* payload;
+
+ // Attempt to allocate a message for sending the tree to the viewer
+ Message* message = MessageQueue_AllocMessage(queue, sizeof(Msg_SampleTree), thread_sampler);
+ if (message == NULL)
+ {
+ // Discard the tree on failure
+ FreeSampleTree(sample, allocator);
+ return;
+ }
+
+ // Populate and commit
+ payload = (Msg_SampleTree*)message->payload;
+ payload->root_sample = sample;
+ payload->allocator = allocator;
+ payload->thread_name = thread_name;
+ MessageQueue_CommitMessage(queue, message, MsgID_SampleTree);
+}
+
+
+
+
+/*
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+ @TSAMPLER: Per-Thread Sampler
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+*/
+
+
+
+typedef struct ThreadSampler
+{
+ // Name to assign to the thread in the viewer
+ rmtS8 name[64];
+
+ // Store a unique sample tree for each type
+ SampleTree* sample_trees[SampleType_Count];
+
+ // Next in the global list of active thread samplers
+ struct ThreadSampler* volatile next;
+
+} ThreadSampler;
+
+static rmtS32 countThreads = 0;
+
+static rmtError ThreadSampler_Constructor(ThreadSampler* thread_sampler)
+{
+ rmtError error;
+ int i;
+
+ assert(thread_sampler != NULL);
+
+ // Set defaults
+ for (i = 0; i < SampleType_Count; i++)
+ thread_sampler->sample_trees[i] = NULL;
+ thread_sampler->next = NULL;
+
+ // Set the initial name to Thread0 etc. or use the existing Linux name.
+ thread_sampler->name[0] = 0;
+ #if defined(RMT_PLATFORM_LINUX) && RMT_USE_POSIX_THREADNAMES
+ prctl(PR_GET_NAME,thread_sampler->name,0,0,0);
+ #else
+ strncat_s(thread_sampler->name, sizeof(thread_sampler->name), "Thread", 6);
+ itoahex_s(thread_sampler->name + 6, sizeof(thread_sampler->name) - 6, AtomicAdd(&countThreads, 1));
+ #endif
+
+ // Create the CPU sample tree only - the rest are created on-demand as they need
+ // extra context information to function correctly.
+ New_3(SampleTree, thread_sampler->sample_trees[SampleType_CPU], sizeof(Sample), (ObjConstructor)Sample_Constructor, (ObjDestructor)Sample_Destructor);
+ if (error != RMT_ERROR_NONE)
+ return error;
+
+ return RMT_ERROR_NONE;
+}
+
+
+static void ThreadSampler_Destructor(ThreadSampler* ts)
+{
+ int i;
+
+ assert(ts != NULL);
+ for (i = 0; i < SampleType_Count; i++)
+ Delete(SampleTree, ts->sample_trees[i]);
+}
+
+
+static rmtError ThreadSampler_Push(ThreadSampler* ts, SampleTree* tree, rmtPStr name, rmtU32 name_hash, Sample** sample)
+{
+ RMT_UNREFERENCED_PARAMETER(ts);
+ return SampleTree_Push(tree, name, name_hash, sample);
+}
+
+
+static rmtBool ThreadSampler_Pop(ThreadSampler* ts, MessageQueue* queue, Sample* sample)
+{
+ SampleTree* tree = ts->sample_trees[sample->type];
+ SampleTree_Pop(tree, sample);
+
+ // Are we back at the root?
+ if (tree->current_parent == tree->root)
+ {
+ // Disconnect all samples from the root and pack in the chosen message queue
+ Sample* root = tree->root;
+ root->first_child = NULL;
+ root->last_child = NULL;
+ root->nb_children = 0;
+ AddSampleTreeMessage(queue, sample, tree->allocator, ts->name, ts);
+
+ return RMT_TRUE;
+ }
+
+ return RMT_FALSE;
+}
+
+
+
+/*
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+ @REMOTERY: Remotery
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+*/
+
+
+
+#if RMT_USE_D3D11
+typedef struct D3D11 D3D11;
+static rmtError D3D11_Create(D3D11** d3d11);
+static void D3D11_Destructor(D3D11* d3d11);
+#endif
+
+
+#if RMT_USE_OPENGL
+typedef struct OpenGL OpenGL;
+static rmtError OpenGL_Create(OpenGL** opengl);
+static void OpenGL_Destructor(OpenGL* opengl);
+#endif
+
+
+struct Remotery
+{
+ Server* server;
+
+ // Microsecond accuracy timer for CPU timestamps
+ usTimer timer;
+
+ rmtTLS thread_sampler_tls_handle;
+
+ // Linked list of all known threads being sampled
+ ThreadSampler* volatile first_thread_sampler;
+
+ // Queue between clients and main remotery thread
+ MessageQueue* mq_to_rmt_thread;
+
+ // A dynamically-sized buffer used for encoding the sample tree as JSON and sending to the client
+ Buffer* json_buf;
+
+ // The main server thread
+ Thread* thread;
+
+#if RMT_USE_CUDA
+ rmtCUDABind cuda;
+#endif
+
+#if RMT_USE_D3D11
+ D3D11* d3d11;
+#endif
+
+#if RMT_USE_OPENGL
+ OpenGL* opengl;
+#endif
+};
+
+
+//
+// Global remotery context
+//
+static Remotery* g_Remotery = NULL;
+
+
+//
+// This flag marks the EXE/DLL that created the global remotery instance. We want to allow
+// only the creating EXE/DLL to destroy the remotery instance.
+//
+static rmtBool g_RemoteryCreated = RMT_FALSE;
+
+
+static void Remotery_DestroyThreadSamplers(Remotery* rmt);
+
+
+static const rmtU8 g_DecimalToHex[17] = "0123456789abcdef";
+
+
+static void GetSampleDigest(Sample* sample, rmtU32* digest_hash, rmtU32* nb_samples)
+{
+ Sample* child;
+
+ assert(sample != NULL);
+ assert(digest_hash != NULL);
+ assert(nb_samples != NULL);
+
+ // Concatenate this sample
+ (*nb_samples)++;
+ *digest_hash = MurmurHash3_x86_32(&sample->unique_id, sizeof(sample->unique_id), *digest_hash);
+
+ {
+ rmtU8 shift = 4;
+
+ // Get 6 nibbles for lower 3 bytes of the unique sample ID
+ rmtU8* sample_id = (rmtU8*)&sample->unique_id;
+ rmtU8 hex_sample_id[6];
+ hex_sample_id[0] = sample_id[0] & 15;
+ hex_sample_id[1] = sample_id[0] >> 4;
+ hex_sample_id[2] = sample_id[1] & 15;
+ hex_sample_id[3] = sample_id[1] >> 4;
+ hex_sample_id[4] = sample_id[2] & 15;
+ hex_sample_id[5] = sample_id[2] >> 4;
+
+ // As the nibbles will be used as hex colour digits, shift them up to make pastel colours
+ hex_sample_id[0] = minU8(hex_sample_id[0] + shift, 15);
+ hex_sample_id[1] = minU8(hex_sample_id[1] + shift, 15);
+ hex_sample_id[2] = minU8(hex_sample_id[2] + shift, 15);
+ hex_sample_id[3] = minU8(hex_sample_id[3] + shift, 15);
+ hex_sample_id[4] = minU8(hex_sample_id[4] + shift, 15);
+ hex_sample_id[5] = minU8(hex_sample_id[5] + shift, 15);
+
+ // Convert the nibbles to hex for the final colour
+ sample->unique_id_html_colour[1] = g_DecimalToHex[hex_sample_id[0]];
+ sample->unique_id_html_colour[2] = g_DecimalToHex[hex_sample_id[1]];
+ sample->unique_id_html_colour[3] = g_DecimalToHex[hex_sample_id[2]];
+ sample->unique_id_html_colour[4] = g_DecimalToHex[hex_sample_id[3]];
+ sample->unique_id_html_colour[5] = g_DecimalToHex[hex_sample_id[4]];
+ sample->unique_id_html_colour[6] = g_DecimalToHex[hex_sample_id[5]];
+ }
+
+ // Concatenate children
+ for (child = sample->first_child; child != NULL; child = child->next_sibling)
+ GetSampleDigest(child, digest_hash, nb_samples);
+}
+
+
+static rmtError Remotery_SendLogTextMessage(Remotery* rmt, Message* message)
+{
+ assert(rmt != NULL);
+ assert(message != NULL);
+ return Server_Send(rmt->server, message->payload, message->payload_size, 20);
+}
+
+
+static rmtError json_SampleTree(Buffer* buffer, Msg_SampleTree* msg)
+{
+ Sample* root_sample;
+ char thread_name[64];
+ rmtU32 digest_hash = 0, nb_samples = 0;
+ rmtError error;
+
+ assert(buffer != NULL);
+ assert(msg != NULL);
+
+ // Get the message root sample
+ root_sample = msg->root_sample;
+ assert(root_sample != NULL);
+
+ // Reset the buffer position to the start
+ buffer->bytes_used = 0;
+
+ // Add any sample types as a thread name post-fix to ensure they get their own viewer
+ thread_name[0] = 0;
+ strncat_s(thread_name, sizeof(thread_name), msg->thread_name, strnlen_s(msg->thread_name, 64));
+ if (root_sample->type == SampleType_CUDA)
+ strncat_s(thread_name, sizeof(thread_name), " (CUDA)", 7);
+ if (root_sample->type == SampleType_D3D11)
+ strncat_s(thread_name, sizeof(thread_name), " (D3D11)", 8);
+ if (root_sample->type == SampleType_OpenGL)
+ strncat_s(thread_name, sizeof(thread_name), " (OpenGL)", 9);
+
+ // Get digest hash of samples so that viewer can efficiently rebuild its tables
+ GetSampleDigest(root_sample, &digest_hash, &nb_samples);
+
+ // Build the sample data
+ JSON_ERROR_CHECK(json_OpenObject(buffer));
+
+ JSON_ERROR_CHECK(json_FieldStr(buffer, "id", "SAMPLES"));
+ JSON_ERROR_CHECK(json_Comma(buffer));
+ JSON_ERROR_CHECK(json_FieldStr(buffer, "thread_name", thread_name));
+ JSON_ERROR_CHECK(json_Comma(buffer));
+ JSON_ERROR_CHECK(json_FieldU64(buffer, "nb_samples", nb_samples));
+ JSON_ERROR_CHECK(json_Comma(buffer));
+ JSON_ERROR_CHECK(json_FieldU64(buffer, "sample_digest", digest_hash));
+ JSON_ERROR_CHECK(json_Comma(buffer));
+ JSON_ERROR_CHECK(json_SampleArray(buffer, root_sample, "samples"));
+
+ JSON_ERROR_CHECK(json_CloseObject(buffer));
+
+ return RMT_ERROR_NONE;
+}
+
+
+#if RMT_USE_CUDA
+static rmtBool AreCUDASamplesReady(Sample* sample);
+static rmtBool GetCUDASampleTimes(Sample* root_sample, Sample* sample);
+#endif
+
+
+static rmtError Remotery_SendSampleTreeMessage(Remotery* rmt, Message* message)
+{
+ Msg_SampleTree* sample_tree;
+ rmtError error = RMT_ERROR_NONE;
+ Sample* sample;
+
+ assert(rmt != NULL);
+ assert(message != NULL);
+
+ // Get the message root sample
+ sample_tree = (Msg_SampleTree*)message->payload;
+ sample = sample_tree->root_sample;
+ assert(sample != NULL);
+
+ #if RMT_USE_CUDA
+ if (sample->type == SampleType_CUDA)
+ {
+ // If these CUDA samples aren't ready yet, stick them to the back of the queue and continue
+ rmtBool are_samples_ready;
+ rmt_BeginCPUSample(AreCUDASamplesReady);
+ are_samples_ready = AreCUDASamplesReady(sample);
+ rmt_EndCPUSample();
+ if (!are_samples_ready)
+ {
+ AddSampleTreeMessage(rmt->mq_to_rmt_thread, sample, sample_tree->allocator, sample_tree->thread_name, message->thread_sampler);
+ return RMT_ERROR_NONE;
+ }
+
+ // Retrieve timing of all CUDA samples
+ rmt_BeginCPUSample(GetCUDASampleTimes);
+ GetCUDASampleTimes(sample->parent, sample);
+ rmt_EndCPUSample();
+ }
+ #endif
+
+ // Serialise the sample tree and send to the viewer with a reasonably long timeout as the size
+ // of the sample data may be large
+ error = json_SampleTree(rmt->json_buf, sample_tree);
+ if (error == RMT_ERROR_NONE)
+ error = Server_Send(rmt->server, rmt->json_buf->data, rmt->json_buf->bytes_used, 5000);
+
+ // Release the sample tree back to its allocator
+ FreeSampleTree(sample, sample_tree->allocator);
+
+ return error;
+}
+
+
+static rmtError Remotery_ConsumeMessageQueue(Remotery* rmt)
+{
+ rmtU32 nb_messages_sent = 0;
+ const rmtU32 maxNbMessagesPerUpdate = g_Settings.maxNbMessagesPerUpdate;
+
+ assert(rmt != NULL);
+
+ // Absorb as many messages in the queue while disconnected
+ if (Server_IsClientConnected(rmt->server) == RMT_FALSE)
+ return RMT_ERROR_NONE;
+
+ // Loop reading the max number of messages for this update
+ while( nb_messages_sent++ < maxNbMessagesPerUpdate )
+ {
+ rmtError error = RMT_ERROR_NONE;
+ Message* message = MessageQueue_PeekNextMessage(rmt->mq_to_rmt_thread);
+ if (message == NULL)
+ break;
+
+ switch (message->id)
+ {
+ // This shouldn't be possible
+ case MsgID_NotReady:
+ assert(RMT_FALSE);
+ break;
+
+ // Dispatch to message handler
+ case MsgID_LogText:
+ error = Remotery_SendLogTextMessage(rmt, message);
+ break;
+ case MsgID_SampleTree:
+ error = Remotery_SendSampleTreeMessage(rmt, message);
+ break;
+ }
+
+ // Consume the message before reacting to any errors
+ MessageQueue_ConsumeNextMessage(rmt->mq_to_rmt_thread, message);
+ if (error != RMT_ERROR_NONE)
+ return error;
+ }
+
+ return RMT_ERROR_NONE;
+}
+
+
+static void Remotery_FlushMessageQueue(Remotery* rmt)
+{
+ assert(rmt != NULL);
+
+ // Loop reading all remaining messages
+ for (;;)
+ {
+ Message* message = MessageQueue_PeekNextMessage(rmt->mq_to_rmt_thread);
+ if (message == NULL)
+ break;
+
+ switch (message->id)
+ {
+ // These can be safely ignored
+ case MsgID_NotReady:
+ case MsgID_LogText:
+ break;
+
+ // Release all samples back to their allocators
+ case MsgID_SampleTree:
+ {
+ Msg_SampleTree* sample_tree = (Msg_SampleTree*)message->payload;
+ FreeSampleTree(sample_tree->root_sample, sample_tree->allocator);
+ break;
+ }
+ }
+
+ MessageQueue_ConsumeNextMessage(rmt->mq_to_rmt_thread, message);
+ }
+}
+
+
+static rmtError Remotery_ThreadMain(Thread* thread)
+{
+ Remotery* rmt = (Remotery*)thread->param;
+ assert(rmt != NULL);
+
+ rmt_SetCurrentThreadName("Remotery");
+
+ while (thread->request_exit == RMT_FALSE)
+ {
+ rmt_BeginCPUSample(Wakeup);
+
+ rmt_BeginCPUSample(ServerUpdate);
+ Server_Update(rmt->server);
+ rmt_EndCPUSample();
+
+ rmt_BeginCPUSample(ConsumeMessageQueue);
+ Remotery_ConsumeMessageQueue(rmt);
+ rmt_EndCPUSample();
+
+ rmt_EndCPUSample();
+
+ //
+ // [NOTE-A]
+ //
+ // Possible sequence of user events at this point:
+ //
+ // 1. Add samples to the queue.
+ // 2. Shutdown remotery.
+ //
+ // This loop will exit with unrelease samples.
+ //
+
+ msSleep(g_Settings.msSleepBetweenServerUpdates);
+ }
+
+ // Release all samples to their allocators as a consequence of [NOTE-A]
+ Remotery_FlushMessageQueue(rmt);
+
+ return RMT_ERROR_NONE;
+}
+
+
+static rmtError Remotery_Constructor(Remotery* rmt)
+{
+ rmtError error;
+
+ assert(rmt != NULL);
+
+ // Set default state
+ rmt->server = NULL;
+ rmt->thread_sampler_tls_handle = TLS_INVALID_HANDLE;
+ rmt->first_thread_sampler = NULL;
+ rmt->mq_to_rmt_thread = NULL;
+ rmt->json_buf = NULL;
+ rmt->thread = NULL;
+
+ // Kick-off the timer
+ usTimer_Init(&rmt->timer);
+
+ // Allocate a TLS handle for the thread sampler
+ error = tlsAlloc(&rmt->thread_sampler_tls_handle);
+ if (error != RMT_ERROR_NONE)
+ return error;
+
+ // Create the server
+ New_1( Server, rmt->server, g_Settings.port );
+ if (error != RMT_ERROR_NONE)
+ return error;
+
+ // Create the main message thread with only one page
+ New_1(MessageQueue, rmt->mq_to_rmt_thread, g_Settings.messageQueueSizeInBytes);
+ if (error != RMT_ERROR_NONE)
+ return error;
+
+ // Create the JSON serialisation buffer
+ New_1(Buffer, rmt->json_buf, 4096);
+ if (error != RMT_ERROR_NONE)
+ return error;
+
+ #if RMT_USE_CUDA
+
+ rmt->cuda.CtxSetCurrent = NULL;
+ rmt->cuda.EventCreate = NULL;
+ rmt->cuda.EventDestroy = NULL;
+ rmt->cuda.EventElapsedTime = NULL;
+ rmt->cuda.EventQuery = NULL;
+ rmt->cuda.EventRecord = NULL;
+
+ #endif
+
+ #if RMT_USE_D3D11
+ rmt->d3d11 = NULL;
+ error = D3D11_Create(&rmt->d3d11);
+ if (error != RMT_ERROR_NONE)
+ return error;
+ #endif
+
+ #if RMT_USE_OPENGL
+ rmt->opengl = NULL;
+ error = OpenGL_Create(&rmt->opengl);
+ if (error != RMT_ERROR_NONE)
+ return error;
+ #endif
+
+ // Set as the global instance before creating any threads that uses it for sampling itself
+ assert(g_Remotery == NULL);
+ g_Remotery = rmt;
+ g_RemoteryCreated = RMT_TRUE;
+
+ // Ensure global instance writes complete before other threads get a chance to use it
+ WriteFence();
+
+ // Create the main update thread once everything has been defined for the global remotery object
+ New_2(Thread, rmt->thread, Remotery_ThreadMain, rmt);
+ return error;
+}
+
+
+static void Remotery_Destructor(Remotery* rmt)
+{
+ assert(rmt != NULL);
+
+ // Join the remotery thread before clearing the global object as the thread is profiling itself
+ Delete(Thread, rmt->thread);
+
+ // Ensure this is the module that created it
+ assert(g_RemoteryCreated == RMT_TRUE);
+ assert(g_Remotery == rmt);
+ g_Remotery = NULL;
+ g_RemoteryCreated = RMT_FALSE;
+
+ #if RMT_USE_D3D11
+ Delete(D3D11, rmt->d3d11);
+ #endif
+
+ #if RMT_USE_OPENGL
+ Delete(OpenGL, rmt->opengl);
+ #endif
+
+ Delete(Buffer, rmt->json_buf);
+ Delete(MessageQueue, rmt->mq_to_rmt_thread);
+
+ Remotery_DestroyThreadSamplers(rmt);
+
+ Delete(Server, rmt->server);
+
+ if (rmt->thread_sampler_tls_handle != TLS_INVALID_HANDLE)
+ {
+ tlsFree(rmt->thread_sampler_tls_handle);
+ rmt->thread_sampler_tls_handle = 0;
+ }
+}
+
+
+static rmtError Remotery_GetThreadSampler(Remotery* rmt, ThreadSampler** thread_sampler)
+{
+ ThreadSampler* ts;
+
+ // Is there a thread sampler associated with this thread yet?
+ assert(rmt != NULL);
+ ts = (ThreadSampler*)tlsGet(rmt->thread_sampler_tls_handle);
+ if (ts == NULL)
+ {
+ // Allocate on-demand
+ rmtError error;
+ New_0(ThreadSampler, *thread_sampler);
+ if (error != RMT_ERROR_NONE)
+ return error;
+ ts = *thread_sampler;
+
+ // Add to the beginning of the global linked list of thread samplers
+ for (;;)
+ {
+ ThreadSampler* old_ts = rmt->first_thread_sampler;
+ ts->next = old_ts;
+
+ // If the old value is what we expect it to be then no other thread has
+ // changed it since this thread sampler was used as a candidate first list item
+ if (AtomicCompareAndSwapPointer((long* volatile*)&rmt->first_thread_sampler, (long*)old_ts, (long*)ts) == RMT_TRUE)
+ break;
+ }
+
+ tlsSet(rmt->thread_sampler_tls_handle, ts);
+ }
+
+ assert(thread_sampler != NULL);
+ *thread_sampler = ts;
+ return RMT_ERROR_NONE;
+}
+
+
+static void Remotery_DestroyThreadSamplers(Remotery* rmt)
+{
+ // If the handle failed to create in the first place then it shouldn't be possible to create thread samplers
+ assert(rmt != NULL);
+ if (rmt->thread_sampler_tls_handle == TLS_INVALID_HANDLE)
+ {
+ assert(rmt->first_thread_sampler == NULL);
+ return;
+ }
+
+ // Keep popping thread samplers off the linked list until they're all gone
+ // This does not make any assumptions, making it possible for thread samplers to be created while they're all
+ // deleted. While this is erroneous calling code, this will prevent a confusing crash.
+ while (rmt->first_thread_sampler != NULL)
+ {
+ ThreadSampler* ts;
+
+ for (;;)
+ {
+ ThreadSampler* old_ts = rmt->first_thread_sampler;
+ ThreadSampler* next_ts = old_ts->next;
+
+ if (AtomicCompareAndSwapPointer((long* volatile*)&rmt->first_thread_sampler, (long*)old_ts, (long*)next_ts) == RMT_TRUE)
+ {
+ ts = old_ts;
+ break;
+ }
+ }
+
+ Delete(ThreadSampler, ts);
+ }
+}
+
+
+static void* CRTMalloc(void* mm_context, rmtU32 size)
+{
+ RMT_UNREFERENCED_PARAMETER(mm_context);
+ return malloc((size_t)size);
+}
+
+
+static void CRTFree(void* mm_context, void* ptr)
+{
+ RMT_UNREFERENCED_PARAMETER(mm_context);
+ free(ptr);
+}
+
+static void* CRTRealloc(void* mm_context, void* ptr, rmtU32 size)
+{
+ RMT_UNREFERENCED_PARAMETER(mm_context);
+ return realloc(ptr, size);
+}
+
+
+RMT_API rmtSettings* _rmt_Settings(void)
+{
+ // Default-initialize on first call
+ if( g_SettingsInitialized == RMT_FALSE )
+ {
+ g_Settings.port = 0x4597;
+ g_Settings.msSleepBetweenServerUpdates = 10;
+ g_Settings.messageQueueSizeInBytes = 64 * 1024;
+ g_Settings.maxNbMessagesPerUpdate = 100;
+ g_Settings.malloc = CRTMalloc;
+ g_Settings.free = CRTFree;
+ g_Settings.realloc = CRTRealloc;
+ g_Settings.input_handler = NULL;
+ g_Settings.input_handler_context = NULL;
+ g_Settings.logFilename = "rmtLog.txt";
+
+ g_SettingsInitialized = RMT_TRUE;
+ }
+
+ return &g_Settings;
+}
+
+
+RMT_API rmtError _rmt_CreateGlobalInstance(Remotery** remotery)
+{
+ rmtError error;
+
+ // Default-initialise if user has not set values
+ rmt_Settings();
+
+ // Creating the Remotery instance also records it as the global instance
+ assert(remotery != NULL);
+ New_0(Remotery, *remotery);
+ return error;
+}
+
+
+RMT_API void _rmt_DestroyGlobalInstance(Remotery* remotery)
+{
+ Delete(Remotery, remotery);
+}
+
+
+RMT_API void _rmt_SetGlobalInstance(Remotery* remotery)
+{
+ // Default-initialise if user has not set values
+ rmt_Settings();
+
+ g_Remotery = remotery;
+}
+
+
+RMT_API Remotery* _rmt_GetGlobalInstance(void)
+{
+ return g_Remotery;
+}
+
+
+#ifdef RMT_PLATFORM_WINDOWS
+ #pragma pack(push,8)
+ typedef struct tagTHREADNAME_INFO
+ {
+ DWORD dwType; // Must be 0x1000.
+ LPCSTR szName; // Pointer to name (in user addr space).
+ DWORD dwThreadID; // Thread ID (-1=caller thread).
+ DWORD dwFlags; // Reserved for future use, must be zero.
+ } THREADNAME_INFO;
+ #pragma pack(pop)
+#endif
+
+static void SetDebuggerThreadName(const char* name)
+{
+ #ifdef RMT_PLATFORM_WINDOWS
+ THREADNAME_INFO info;
+ info.dwType = 0x1000;
+ info.szName = name;
+ info.dwThreadID = (DWORD)-1;
+ info.dwFlags = 0;
+
+ #ifndef __MINGW32__
+ __try
+ {
+ RaiseException(0x406D1388, 0, sizeof(info)/sizeof(ULONG_PTR), (ULONG_PTR*)&info);
+ }
+ __except(1 /* EXCEPTION_EXECUTE_HANDLER */)
+ {
+ }
+ #endif
+ #else
+ RMT_UNREFERENCED_PARAMETER(name);
+ #endif
+
+ #ifdef RMT_PLATFORM_LINUX
+ // pthread_setname_np is a non-standard GNU extension.
+ char name_clamp[16];
+ name_clamp[0] = 0;
+ strncat_s(name_clamp, sizeof(name_clamp), name, 15);
+ prctl(PR_SET_NAME,name_clamp,0,0,0);
+ #endif
+}
+
+
+RMT_API void _rmt_SetCurrentThreadName(rmtPStr thread_name)
+{
+ ThreadSampler* ts;
+ rsize_t slen;
+
+ if (g_Remotery == NULL)
+ return;
+
+ // Get data for this thread
+ if (Remotery_GetThreadSampler(g_Remotery, &ts) != RMT_ERROR_NONE)
+ return;
+
+ // Use strcat to strcpy the thread name over
+ slen = strnlen_s(thread_name, sizeof(ts->name));
+ ts->name[0] = 0;
+ strncat_s(ts->name, sizeof(ts->name), thread_name, slen);
+
+ // Apply to the debugger
+ SetDebuggerThreadName(thread_name);
+}
+
+
+static rmtBool QueueLine(MessageQueue* queue, char* text, rmtU32 size, struct ThreadSampler* thread_sampler)
+{
+ Message* message;
+
+ assert(queue != NULL);
+
+ // String/JSON block/null terminate
+ text[size++] = '\"';
+ text[size++] = '}';
+ text[size] = 0;
+
+ // Allocate some space for the line
+ message = MessageQueue_AllocMessage(queue, size, thread_sampler);
+ if (message == NULL)
+ return RMT_FALSE;
+
+ // Copy the text and commit the message
+ memcpy(message->payload, text, size);
+ MessageQueue_CommitMessage(queue, message, MsgID_LogText);
+
+ return RMT_TRUE;
+}
+
+
+static const char log_message[] = "{ \"id\": \"LOG\", \"text\": \"";
+
+
+RMT_API void _rmt_LogText(rmtPStr text)
+{
+ int start_offset, prev_offset, i;
+ char line_buffer[1024] = { 0 };
+ ThreadSampler* ts;
+
+ if (g_Remotery == NULL)
+ return;
+
+ Remotery_GetThreadSampler(g_Remotery, &ts);
+
+ // Start the line buffer off with the JSON message markup
+ strncat_s(line_buffer, sizeof(line_buffer), log_message, sizeof(log_message));
+ start_offset = (int)strnlen_s(line_buffer, sizeof(line_buffer) - 1);
+
+ // There might be newlines in the buffer, so split them into multiple network calls
+ prev_offset = start_offset;
+ for (i = 0; text[i] != 0; i++)
+ {
+ char c = text[i];
+
+ // Line wrap when too long or newline encountered
+ if (prev_offset == sizeof(line_buffer) - 3 || c == '\n')
+ {
+ if (QueueLine(g_Remotery->mq_to_rmt_thread, line_buffer, prev_offset, ts) == RMT_FALSE)
+ return;
+
+ // Restart line
+ prev_offset = start_offset;
+ }
+
+ // Safe to insert 2 characters here as previous check would split lines if not enough space left
+ switch (c)
+ {
+ // Skip newline, dealt with above
+ case '\n':
+ break;
+
+ // Escape these
+ case '\\':
+ line_buffer[prev_offset++] = '\\';
+ line_buffer[prev_offset++] = '\\';
+ break;
+
+ case '\"':
+ line_buffer[prev_offset++] = '\\';
+ line_buffer[prev_offset++] = '\"';
+ break;
+
+ // Add the rest
+ default:
+ line_buffer[prev_offset++] = c;
+ break;
+ }
+ }
+
+ // Send the last line
+ if (prev_offset > start_offset)
+ {
+ assert(prev_offset < ((int)sizeof(line_buffer) - 3));
+ QueueLine(g_Remotery->mq_to_rmt_thread, line_buffer, prev_offset, ts);
+ }
+}
+
+
+static rmtU32 GetNameHash(rmtPStr name, rmtU32* hash_cache)
+{
+ // Hash cache provided?
+ if (hash_cache != NULL)
+ {
+ // Calculate the hash first time round only
+ if (*hash_cache == 0)
+ {
+ assert(name != NULL);
+ *hash_cache = MurmurHash3_x86_32(name, (int)strnlen_s(name, 256), 0);
+ }
+
+ return *hash_cache;
+ }
+
+ // Have to recalculate every time when no cache storage exists
+ return MurmurHash3_x86_32(name, (int)strnlen_s(name, 256), 0);
+}
+
+
+RMT_API void _rmt_BeginCPUSample(rmtPStr name, rmtU32* hash_cache)
+{
+ // 'hash_cache' stores a pointer to a sample name's hash value. Internally this is used to identify unique callstacks and it
+ // would be ideal that it's not recalculated each time the sample is used. This can be statically cached at the point
+ // of call or stored elsewhere when dynamic names are required.
+ //
+ // If 'hash_cache' is NULL then this call becomes more expensive, as it has to recalculate the hash of the name.
+
+ ThreadSampler* ts;
+
+ if (g_Remotery == NULL)
+ return;
+
+ // TODO: Time how long the bits outside here cost and subtract them from the parent
+
+ if (Remotery_GetThreadSampler(g_Remotery, &ts) == RMT_ERROR_NONE)
+ {
+ Sample* sample;
+ rmtU32 name_hash = GetNameHash(name, hash_cache);
+ if (ThreadSampler_Push(ts, ts->sample_trees[SampleType_CPU], name, name_hash, &sample) == RMT_ERROR_NONE)
+ sample->us_start = usTimer_Get(&g_Remotery->timer);
+ }
+}
+
+
+RMT_API void _rmt_EndCPUSample(void)
+{
+ ThreadSampler* ts;
+
+ if (g_Remotery == NULL)
+ return;
+
+ if (Remotery_GetThreadSampler(g_Remotery, &ts) == RMT_ERROR_NONE)
+ {
+ Sample* sample = ts->sample_trees[SampleType_CPU]->current_parent;
+ sample->us_end = usTimer_Get(&g_Remotery->timer);
+ ThreadSampler_Pop(ts, g_Remotery->mq_to_rmt_thread, sample);
+ }
+}
+
+
+
+/*
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+ @CUDA: CUDA event sampling
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+*/
+
+
+
+#if RMT_USE_CUDA
+
+
+typedef struct CUDASample
+{
+ // IS-A inheritance relationship
+ Sample Sample;
+
+ // Pair of events that wrap the sample
+ CUevent event_start;
+ CUevent event_end;
+
+} CUDASample;
+
+
+static rmtError MapCUDAResult(CUresult result)
+{
+ switch (result)
+ {
+ case CUDA_SUCCESS: return RMT_ERROR_NONE;
+ case CUDA_ERROR_DEINITIALIZED: return RMT_ERROR_CUDA_DEINITIALIZED;
+ case CUDA_ERROR_NOT_INITIALIZED: return RMT_ERROR_CUDA_NOT_INITIALIZED;
+ case CUDA_ERROR_INVALID_CONTEXT: return RMT_ERROR_CUDA_INVALID_CONTEXT;
+ case CUDA_ERROR_INVALID_VALUE: return RMT_ERROR_CUDA_INVALID_VALUE;
+ case CUDA_ERROR_INVALID_HANDLE: return RMT_ERROR_CUDA_INVALID_HANDLE;
+ case CUDA_ERROR_OUT_OF_MEMORY: return RMT_ERROR_CUDA_OUT_OF_MEMORY;
+ case CUDA_ERROR_NOT_READY: return RMT_ERROR_ERROR_NOT_READY;
+ default: return RMT_ERROR_CUDA_UNKNOWN;
+ }
+}
+
+
+#define CUDA_MAKE_FUNCTION(name, params) \
+ typedef CUresult (CUDAAPI *name##Ptr) params; \
+ name##Ptr name = (name##Ptr)g_Remotery->cuda.name;
+
+
+#define CUDA_GUARD(call) \
+ { \
+ rmtError error = call; \
+ if (error != RMT_ERROR_NONE) \
+ return error; \
+ }
+
+
+// Wrappers around CUDA driver functions that manage the active context.
+static rmtError CUDASetContext(void* context)
+{
+ CUDA_MAKE_FUNCTION(CtxSetCurrent, (CUcontext ctx));
+ assert(CtxSetCurrent != NULL);
+ return MapCUDAResult(CtxSetCurrent((CUcontext)context));
+}
+static rmtError CUDAGetContext(void** context)
+{
+ CUDA_MAKE_FUNCTION(CtxGetCurrent, (CUcontext* ctx));
+ assert(CtxGetCurrent != NULL);
+ return MapCUDAResult(CtxGetCurrent((CUcontext*)context));
+}
+static rmtError CUDAEnsureContext()
+{
+ void* current_context;
+ CUDA_GUARD(CUDAGetContext(&current_context));
+
+ assert(g_Remotery != NULL);
+ if (current_context != g_Remotery->cuda.context)
+ CUDA_GUARD(CUDASetContext(g_Remotery->cuda.context));
+
+ return RMT_ERROR_NONE;
+}
+
+
+// Wrappers around CUDA driver functions that manage events
+static rmtError CUDAEventCreate(CUevent* phEvent, unsigned int Flags)
+{
+ CUDA_MAKE_FUNCTION(EventCreate, (CUevent *phEvent, unsigned int Flags));
+ CUDA_GUARD(CUDAEnsureContext());
+ return MapCUDAResult(EventCreate(phEvent, Flags));
+}
+static rmtError CUDAEventDestroy(CUevent hEvent)
+{
+ CUDA_MAKE_FUNCTION(EventDestroy, (CUevent hEvent));
+ CUDA_GUARD(CUDAEnsureContext());
+ return MapCUDAResult(EventDestroy(hEvent));
+}
+static rmtError CUDAEventRecord(CUevent hEvent, void* hStream)
+{
+ CUDA_MAKE_FUNCTION(EventRecord, (CUevent hEvent, CUstream hStream));
+ CUDA_GUARD(CUDAEnsureContext());
+ return MapCUDAResult(EventRecord(hEvent, (CUstream)hStream));
+}
+static rmtError CUDAEventQuery(CUevent hEvent)
+{
+ CUDA_MAKE_FUNCTION(EventQuery, (CUevent hEvent));
+ CUDA_GUARD(CUDAEnsureContext());
+ return MapCUDAResult(EventQuery(hEvent));
+}
+static rmtError CUDAEventElapsedTime(float* pMilliseconds, CUevent hStart, CUevent hEnd)
+{
+ CUDA_MAKE_FUNCTION(EventElapsedTime, (float *pMilliseconds, CUevent hStart, CUevent hEnd));
+ CUDA_GUARD(CUDAEnsureContext());
+ return MapCUDAResult(EventElapsedTime(pMilliseconds, hStart, hEnd));
+}
+
+
+static rmtError CUDASample_Constructor(CUDASample* sample)
+{
+ rmtError error;
+
+ assert(sample != NULL);
+
+ // Chain to sample constructor
+ Sample_Constructor((Sample*)sample);
+ sample->Sample.type = SampleType_CUDA;
+ sample->Sample.size_bytes = sizeof(CUDASample);
+ sample->event_start = NULL;
+ sample->event_end = NULL;
+
+ // Create non-blocking events with timing
+ assert(g_Remotery != NULL);
+ error = CUDAEventCreate(&sample->event_start, CU_EVENT_DEFAULT);
+ if (error == RMT_ERROR_NONE)
+ error = CUDAEventCreate(&sample->event_end, CU_EVENT_DEFAULT);
+ return error;
+}
+
+
+static void CUDASample_Destructor(CUDASample* sample)
+{
+ assert(sample != NULL);
+
+ // Destroy events
+ if (sample->event_start != NULL)
+ CUDAEventDestroy(sample->event_start);
+ if (sample->event_end != NULL)
+ CUDAEventDestroy(sample->event_end);
+
+ Sample_Destructor((Sample*)sample);
+}
+
+
+static rmtBool AreCUDASamplesReady(Sample* sample)
+{
+ rmtError error;
+ Sample* child;
+
+ CUDASample* cuda_sample = (CUDASample*)sample;
+ assert(sample->type == SampleType_CUDA);
+
+ // Check to see if both of the CUDA events have been processed
+ error = CUDAEventQuery(cuda_sample->event_start);
+ if (error != RMT_ERROR_NONE)
+ return RMT_FALSE;
+ error = CUDAEventQuery(cuda_sample->event_end);
+ if (error != RMT_ERROR_NONE)
+ return RMT_FALSE;
+
+ // Check child sample events
+ for (child = sample->first_child; child != NULL; child = child->next_sibling)
+ {
+ if (!AreCUDASamplesReady(child))
+ return RMT_FALSE;
+ }
+
+ return RMT_TRUE;
+}
+
+
+static rmtBool GetCUDASampleTimes(Sample* root_sample, Sample* sample)
+{
+ Sample* child;
+
+ CUDASample* cuda_root_sample = (CUDASample*)root_sample;
+ CUDASample* cuda_sample = (CUDASample*)sample;
+
+ float ms_start, ms_end;
+
+ assert(root_sample != NULL);
+ assert(sample != NULL);
+
+ // Get millisecond timing of each sample event, relative to initial root sample
+ if (CUDAEventElapsedTime(&ms_start, cuda_root_sample->event_start, cuda_sample->event_start) != RMT_ERROR_NONE)
+ return RMT_FALSE;
+ if (CUDAEventElapsedTime(&ms_end, cuda_root_sample->event_start, cuda_sample->event_end) != RMT_ERROR_NONE)
+ return RMT_FALSE;
+
+ // Convert to microseconds and add to the sample
+ sample->us_start = (rmtU64)(ms_start * 1000);
+ sample->us_end = (rmtU64)(ms_end * 1000);
+
+ // Get child sample times
+ for (child = sample->first_child; child != NULL; child = child->next_sibling)
+ {
+ if (!GetCUDASampleTimes(root_sample, child))
+ return RMT_FALSE;
+ }
+
+ return RMT_TRUE;
+}
+
+
+RMT_API void _rmt_BindCUDA(const rmtCUDABind* bind)
+{
+ assert(bind != NULL);
+ if (g_Remotery != NULL)
+ g_Remotery->cuda = *bind;
+}
+
+
+RMT_API void _rmt_BeginCUDASample(rmtPStr name, rmtU32* hash_cache, void* stream)
+{
+ ThreadSampler* ts;
+
+ if (g_Remotery == NULL)
+ return;
+
+ if (Remotery_GetThreadSampler(g_Remotery, &ts) == RMT_ERROR_NONE)
+ {
+ rmtError error;
+ Sample* sample;
+ rmtU32 name_hash = GetNameHash(name, hash_cache);
+
+ // Create the CUDA tree on-demand as the tree needs an up-front-created root.
+ // This is not possible to create on initialisation as a CUDA binding is not yet available.
+ SampleTree** cuda_tree = &ts->sample_trees[SampleType_CUDA];
+ if (*cuda_tree == NULL)
+ {
+ CUDASample* root_sample;
+
+ New_3(SampleTree, *cuda_tree, sizeof(CUDASample), (ObjConstructor)CUDASample_Constructor, (ObjDestructor)CUDASample_Destructor);
+ if (error != RMT_ERROR_NONE)
+ return;
+
+ // Record an event once on the root sample, used to measure absolute sample
+ // times since this point
+ root_sample = (CUDASample*)(*cuda_tree)->root;
+ error = CUDAEventRecord(root_sample->event_start, stream);
+ if (error != RMT_ERROR_NONE)
+ return;
+ }
+
+ // Push the same and record its event
+ if (ThreadSampler_Push(ts, *cuda_tree, name, name_hash, &sample) == RMT_ERROR_NONE)
+ {
+ CUDASample* cuda_sample = (CUDASample*)sample;
+ CUDAEventRecord(cuda_sample->event_start, stream);
+ }
+ }
+}
+
+
+RMT_API void _rmt_EndCUDASample(void* stream)
+{
+ ThreadSampler* ts;
+
+ if (g_Remotery == NULL)
+ return;
+
+ if (Remotery_GetThreadSampler(g_Remotery, &ts) == RMT_ERROR_NONE)
+ {
+ CUDASample* sample = (CUDASample*)ts->sample_trees[SampleType_CUDA]->current_parent;
+ CUDAEventRecord(sample->event_end, stream);
+ ThreadSampler_Pop(ts, g_Remotery->mq_to_rmt_thread, (Sample*)sample);
+ }
+}
+
+
+#endif // RMT_USE_CUDA
+
+
+
+/*
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+ @D3D11: Direct3D 11 event sampling
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+*/
+
+
+
+#if RMT_USE_D3D11
+
+
+// As clReflect has no way of disabling C++ compile mode, this forces C interfaces everywhere...
+#define CINTERFACE
+
+// ...unfortunately these C++ helpers aren't wrapped by the same macro but they can be disabled individually
+#define D3D11_NO_HELPERS
+
+// Allow use of the D3D11 helper macros for accessing the C-style vtable
+#define COBJMACROS
+
+#include <d3d11.h>
+
+
+typedef struct D3D11
+{
+ // Context set by user
+ ID3D11Device* device;
+ ID3D11DeviceContext* context;
+
+ HRESULT last_error;
+
+ // An allocator separate to the samples themselves so that D3D resource lifetime can be controlled
+ // outside of the Remotery thread.
+ ObjectAllocator* timestamp_allocator;
+
+ // Queue to the D3D 11 main update thread
+ // Given that BeginSample/EndSample need to be called from the same thread that does the update, there
+ // is really no need for this to be a thread-safe queue. I'm using it for its convenience.
+ MessageQueue* mq_to_d3d11_main;
+
+ // Mark the first time so that remaining timestamps are offset from this
+ rmtU64 first_timestamp;
+} D3D11;
+
+
+static rmtError D3D11_Create(D3D11** d3d11)
+{
+ rmtError error;
+
+ assert(d3d11 != NULL);
+
+ // Allocate space for the D3D11 data
+ *d3d11 = (D3D11*)rmtMalloc(sizeof(D3D11));
+ if (*d3d11 == NULL)
+ return RMT_ERROR_MALLOC_FAIL;
+
+ // Set defaults
+ (*d3d11)->device = NULL;
+ (*d3d11)->context = NULL;
+ (*d3d11)->last_error = S_OK;
+ (*d3d11)->timestamp_allocator = NULL;
+ (*d3d11)->mq_to_d3d11_main = NULL;
+ (*d3d11)->first_timestamp = 0;
+
+ New_1(MessageQueue, (*d3d11)->mq_to_d3d11_main, g_Settings.messageQueueSizeInBytes);
+ if (error != RMT_ERROR_NONE)
+ {
+ Delete(D3D11, *d3d11);
+ return error;
+ }
+
+ return RMT_ERROR_NONE;
+}
+
+
+static void D3D11_Destructor(D3D11* d3d11)
+{
+ assert(d3d11 != NULL);
+
+ Delete(ObjectAllocator, d3d11->timestamp_allocator);
+ Delete(MessageQueue, d3d11->mq_to_d3d11_main);
+}
+
+
+typedef struct D3D11Timestamp
+{
+ // Inherit so that timestamps can be quickly allocated
+ ObjectLink Link;
+
+ // Pair of timestamp queries that wrap the sample
+ ID3D11Query* query_start;
+ ID3D11Query* query_end;
+
+ // A disjoint to measure frequency/stability
+ // TODO: Does *each* sample need one of these?
+ ID3D11Query* query_disjoint;
+} D3D11Timestamp;
+
+
+static rmtError D3D11Timestamp_Constructor(D3D11Timestamp* stamp)
+{
+ D3D11_QUERY_DESC timestamp_desc;
+ D3D11_QUERY_DESC disjoint_desc;
+ ID3D11Device* device;
+ HRESULT* last_error;
+
+ assert(stamp != NULL);
+
+ ObjectLink_Constructor((ObjectLink*)stamp);
+
+ // Set defaults
+ stamp->query_start = NULL;
+ stamp->query_end = NULL;
+ stamp->query_disjoint = NULL;
+
+ assert(g_Remotery != NULL);
+ assert(g_Remotery->d3d11 != NULL);
+ device = g_Remotery->d3d11->device;
+ last_error = &g_Remotery->d3d11->last_error;
+
+ // Create start/end timestamp queries
+ timestamp_desc.Query = D3D11_QUERY_TIMESTAMP;
+ timestamp_desc.MiscFlags = 0;
+ *last_error = ID3D11Device_CreateQuery(device, &timestamp_desc, &stamp->query_start);
+ if (*last_error != S_OK)
+ return RMT_ERROR_D3D11_FAILED_TO_CREATE_QUERY;
+ *last_error = ID3D11Device_CreateQuery(device, &timestamp_desc, &stamp->query_end);
+ if (*last_error != S_OK)
+ return RMT_ERROR_D3D11_FAILED_TO_CREATE_QUERY;
+
+ // Create disjoint query
+ disjoint_desc.Query = D3D11_QUERY_TIMESTAMP_DISJOINT;
+ disjoint_desc.MiscFlags = 0;
+ *last_error = ID3D11Device_CreateQuery(device, &disjoint_desc, &stamp->query_disjoint);
+ if (*last_error != S_OK)
+ return RMT_ERROR_D3D11_FAILED_TO_CREATE_QUERY;
+
+ return RMT_ERROR_NONE;
+}
+
+
+static void D3D11Timestamp_Destructor(D3D11Timestamp* stamp)
+{
+ assert(stamp != NULL);
+
+ // Destroy queries
+ if (stamp->query_disjoint != NULL)
+ ID3D11Query_Release(stamp->query_disjoint);
+ if (stamp->query_end != NULL)
+ ID3D11Query_Release(stamp->query_end);
+ if (stamp->query_start != NULL)
+ ID3D11Query_Release(stamp->query_start);
+}
+
+
+static void D3D11Timestamp_Begin(D3D11Timestamp* stamp, ID3D11DeviceContext* context)
+{
+ assert(stamp != NULL);
+
+ // Start of disjoint and first query
+ ID3D11DeviceContext_Begin(context, (ID3D11Asynchronous*)stamp->query_disjoint);
+ ID3D11DeviceContext_End(context, (ID3D11Asynchronous*)stamp->query_start);
+}
+
+
+static void D3D11Timestamp_End(D3D11Timestamp* stamp, ID3D11DeviceContext* context)
+{
+ assert(stamp != NULL);
+
+ // End of disjoint and second query
+ ID3D11DeviceContext_End(context, (ID3D11Asynchronous*)stamp->query_end);
+ ID3D11DeviceContext_End(context, (ID3D11Asynchronous*)stamp->query_disjoint);
+}
+
+
+static HRESULT D3D11Timestamp_GetData(D3D11Timestamp* stamp, ID3D11DeviceContext* context, rmtU64* out_start, rmtU64* out_end, rmtU64* out_first_timestamp)
+{
+ ID3D11Asynchronous* query_start;
+ ID3D11Asynchronous* query_end;
+ ID3D11Asynchronous* query_disjoint;
+ HRESULT result;
+
+ UINT64 start;
+ UINT64 end;
+ D3D11_QUERY_DATA_TIMESTAMP_DISJOINT disjoint;
+
+ assert(stamp != NULL);
+ query_start = (ID3D11Asynchronous*)stamp->query_start;
+ query_end = (ID3D11Asynchronous*)stamp->query_end;
+ query_disjoint = (ID3D11Asynchronous*)stamp->query_disjoint;
+
+ // Check to see if all queries are ready
+ // If any fail to arrive, wait until later
+ result = ID3D11DeviceContext_GetData(context, query_start, &start, sizeof(start), D3D11_ASYNC_GETDATA_DONOTFLUSH);
+ if (result != S_OK)
+ return result;
+ result = ID3D11DeviceContext_GetData(context, query_end, &end, sizeof(end), D3D11_ASYNC_GETDATA_DONOTFLUSH);
+ if (result != S_OK)
+ return result;
+ result = ID3D11DeviceContext_GetData(context, query_disjoint, &disjoint, sizeof(disjoint), D3D11_ASYNC_GETDATA_DONOTFLUSH);
+ if (result != S_OK)
+ return result;
+
+ if (disjoint.Disjoint == FALSE)
+ {
+ double frequency = disjoint.Frequency / 1000000.0;
+
+ // Mark the first timestamp
+ assert(out_first_timestamp != NULL);
+ if (*out_first_timestamp == 0)
+ *out_first_timestamp = start;
+
+ // Calculate start and end timestamps from the disjoint info
+ *out_start = (rmtU64)((start - *out_first_timestamp) / frequency);
+ *out_end = (rmtU64)((end - *out_first_timestamp) / frequency);
+ }
+
+ return S_OK;
+}
+
+
+typedef struct D3D11Sample
+{
+ // IS-A inheritance relationship
+ Sample Sample;
+
+ D3D11Timestamp* timestamp;
+
+} D3D11Sample;
+
+
+static rmtError D3D11Sample_Constructor(D3D11Sample* sample)
+{
+ assert(sample != NULL);
+
+ // Chain to sample constructor
+ Sample_Constructor((Sample*)sample);
+ sample->Sample.type = SampleType_D3D11;
+ sample->Sample.size_bytes = sizeof(D3D11Sample);
+ sample->timestamp = NULL;
+
+ return RMT_ERROR_NONE;
+}
+
+
+static void D3D11Sample_Destructor(D3D11Sample* sample)
+{
+ Sample_Destructor((Sample*)sample);
+}
+
+
+RMT_API void _rmt_BindD3D11(void* device, void* context)
+{
+ if (g_Remotery != NULL)
+ {
+ assert(g_Remotery->d3d11 != NULL);
+
+ assert(device != NULL);
+ g_Remotery->d3d11->device = (ID3D11Device*)device;
+ assert(context != NULL);
+ g_Remotery->d3d11->context = (ID3D11DeviceContext*)context;
+ }
+}
+
+
+static void FreeD3D11TimeStamps(Sample* sample)
+{
+ Sample* child;
+
+ D3D11Sample* d3d_sample = (D3D11Sample*)sample;
+
+ assert(g_Remotery != NULL);
+ assert(g_Remotery->d3d11 != NULL);
+ assert(d3d_sample->timestamp != NULL);
+ ObjectAllocator_Free(g_Remotery->d3d11->timestamp_allocator, (void*)d3d_sample->timestamp);
+ d3d_sample->timestamp = NULL;
+
+ for (child = sample->first_child; child != NULL; child = child->next_sibling)
+ FreeD3D11TimeStamps(child);
+}
+
+
+RMT_API void _rmt_UnbindD3D11(void)
+{
+ if (g_Remotery != NULL)
+ {
+ D3D11* d3d11 = g_Remotery->d3d11;
+ assert(d3d11 != NULL);
+
+ // Inform sampler to not add any more samples
+ d3d11->device = NULL;
+ d3d11->context = NULL;
+
+ // Flush the main queue of allocated D3D timestamps
+ for (;;)
+ {
+ Msg_SampleTree* sample_tree;
+ Sample* sample;
+
+ Message* message = MessageQueue_PeekNextMessage(d3d11->mq_to_d3d11_main);
+ if (message == NULL)
+ break;
+
+ // There's only one valid message type in this queue
+ assert(message->id == MsgID_SampleTree);
+ sample_tree = (Msg_SampleTree*)message->payload;
+ sample = sample_tree->root_sample;
+ assert(sample->type == SampleType_D3D11);
+ FreeD3D11TimeStamps(sample);
+ FreeSampleTree(sample, sample_tree->allocator);
+
+ MessageQueue_ConsumeNextMessage(d3d11->mq_to_d3d11_main, message);
+ }
+
+ // Free all allocated D3D resources
+ Delete(ObjectAllocator, d3d11->timestamp_allocator);
+ }
+}
+
+
+RMT_API void _rmt_BeginD3D11Sample(rmtPStr name, rmtU32* hash_cache)
+{
+ ThreadSampler* ts;
+ D3D11* d3d11;
+
+ if (g_Remotery == NULL)
+ return;
+
+ // Has D3D11 been unbound?
+ d3d11 = g_Remotery->d3d11;
+ assert(d3d11 != NULL);
+ if (d3d11->device == NULL || d3d11->context == NULL)
+ return;
+
+ if (Remotery_GetThreadSampler(g_Remotery, &ts) == RMT_ERROR_NONE)
+ {
+ rmtError error;
+ Sample* sample;
+ rmtU32 name_hash = GetNameHash(name, hash_cache);
+
+ // Create the D3D11 tree on-demand as the tree needs an up-front-created root.
+ // This is not possible to create on initialisation as a D3D11 binding is not yet available.
+ SampleTree** d3d_tree = &ts->sample_trees[SampleType_D3D11];
+ if (*d3d_tree == NULL)
+ {
+ New_3(SampleTree, *d3d_tree, sizeof(D3D11Sample), (ObjConstructor)D3D11Sample_Constructor, (ObjDestructor)D3D11Sample_Destructor);
+ if (error != RMT_ERROR_NONE)
+ return;
+ }
+
+ // Also create the timestamp allocator on-demand to keep the D3D11 code localised to the same file section
+ if (d3d11->timestamp_allocator == NULL)
+ New_3(ObjectAllocator, d3d11->timestamp_allocator, sizeof(D3D11Timestamp), (ObjConstructor)D3D11Timestamp_Constructor, (ObjDestructor)D3D11Timestamp_Destructor);
+
+ // Push the sample
+ if (ThreadSampler_Push(ts, *d3d_tree, name, name_hash, &sample) == RMT_ERROR_NONE)
+ {
+ D3D11Sample* d3d_sample = (D3D11Sample*)sample;
+
+ // Allocate a timestamp for the sample and activate it
+ assert(d3d_sample->timestamp == NULL);
+ error = ObjectAllocator_Alloc(d3d11->timestamp_allocator, (void**)&d3d_sample->timestamp);
+ if (error == RMT_ERROR_NONE)
+ D3D11Timestamp_Begin(d3d_sample->timestamp, d3d11->context);
+ }
+ }
+}
+
+
+static rmtBool GetD3D11SampleTimes(Sample* sample, rmtU64* out_first_timestamp)
+{
+ Sample* child;
+
+ D3D11Sample* d3d_sample = (D3D11Sample*)sample;
+
+ assert(sample != NULL);
+ if (d3d_sample->timestamp != NULL)
+ {
+ HRESULT result;
+
+ D3D11* d3d11 = g_Remotery->d3d11;
+ assert(d3d11 != NULL);
+
+ result = D3D11Timestamp_GetData(
+ d3d_sample->timestamp,
+ d3d11->context,
+ &sample->us_start,
+ &sample->us_end,
+ out_first_timestamp);
+
+ if (result != S_OK)
+ {
+ d3d11->last_error = result;
+ return RMT_FALSE;
+ }
+ }
+
+ // Get child sample times
+ for (child = sample->first_child; child != NULL; child = child->next_sibling)
+ {
+ if (!GetD3D11SampleTimes(child, out_first_timestamp))
+ return RMT_FALSE;
+ }
+
+ return RMT_TRUE;
+}
+
+
+static void UpdateD3D11Frame(void)
+{
+ D3D11* d3d11;
+
+ if (g_Remotery == NULL)
+ return;
+
+ d3d11 = g_Remotery->d3d11;
+ assert(d3d11 != NULL);
+
+ rmt_BeginCPUSample(rmt_UpdateD3D11Frame);
+
+ // Process all messages in the D3D queue
+ for (;;)
+ {
+ Msg_SampleTree* sample_tree;
+ Sample* sample;
+
+ Message* message = MessageQueue_PeekNextMessage(d3d11->mq_to_d3d11_main);
+ if (message == NULL)
+ break;
+
+ // There's only one valid message type in this queue
+ assert(message->id == MsgID_SampleTree);
+ sample_tree = (Msg_SampleTree*)message->payload;
+ sample = sample_tree->root_sample;
+ assert(sample->type == SampleType_D3D11);
+
+ // Retrieve timing of all D3D11 samples
+ // If they aren't ready leave the message unconsumed, holding up later frames and maintaining order
+ if (!GetD3D11SampleTimes(sample, &d3d11->first_timestamp))
+ break;
+
+ // Pass samples onto the remotery thread for sending to the viewer
+ FreeD3D11TimeStamps(sample);
+ AddSampleTreeMessage(g_Remotery->mq_to_rmt_thread, sample, sample_tree->allocator, sample_tree->thread_name, message->thread_sampler);
+ MessageQueue_ConsumeNextMessage(d3d11->mq_to_d3d11_main, message);
+ }
+
+ rmt_EndCPUSample();
+}
+
+
+RMT_API void _rmt_EndD3D11Sample(void)
+{
+ ThreadSampler* ts;
+ D3D11* d3d11;
+
+ if (g_Remotery == NULL)
+ return;
+
+ // Has D3D11 been unbound?
+ d3d11 = g_Remotery->d3d11;
+ assert(d3d11 != NULL);
+ if (d3d11->device == NULL || d3d11->context == NULL)
+ return;
+
+ if (Remotery_GetThreadSampler(g_Remotery, &ts) == RMT_ERROR_NONE)
+ {
+ // Close the timestamp
+ D3D11Sample* d3d_sample = (D3D11Sample*)ts->sample_trees[SampleType_D3D11]->current_parent;
+ if (d3d_sample->timestamp != NULL)
+ D3D11Timestamp_End(d3d_sample->timestamp, d3d11->context);
+
+ // Send to the update loop for ready-polling
+ if (ThreadSampler_Pop(ts, d3d11->mq_to_d3d11_main, (Sample*)d3d_sample))
+ // Perform ready-polling on popping of the root sample
+ UpdateD3D11Frame();
+ }
+}
+
+
+#endif // RMT_USE_D3D11
+
+
+
+/*
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+@OpenGL: OpenGL event sampling
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+*/
+
+
+
+#if RMT_USE_OPENGL
+
+
+#ifndef APIENTRY
+# if defined(__MINGW32__) || defined(__CYGWIN__)
+# define APIENTRY __stdcall
+# elif (defined(_MSC_VER) && (_MSC_VER >= 800)) || defined(_STDCALL_SUPPORTED) || defined(__BORLANDC__)
+# define APIENTRY __stdcall
+# else
+# define APIENTRY
+# endif
+#endif
+
+#ifndef GLAPI
+# if defined(__MINGW32__) || defined(__CYGWIN__)
+# define GLAPI extern
+# elif defined (_WIN32)
+# define GLAPI WINGDIAPI
+# else
+# define GLAPI extern
+# endif
+#endif
+
+#ifndef GLAPIENTRY
+#define GLAPIENTRY APIENTRY
+#endif
+
+typedef rmtU32 GLenum;
+typedef rmtU32 GLuint;
+typedef rmtS32 GLint;
+typedef rmtS32 GLsizei;
+typedef rmtU64 GLuint64;
+typedef rmtS64 GLint64;
+typedef unsigned char GLubyte;
+
+typedef GLenum (GLAPIENTRY * PFNGLGETERRORPROC) (void);
+typedef void (GLAPIENTRY * PFNGLGENQUERIESPROC) (GLsizei n, GLuint* ids);
+typedef void (GLAPIENTRY * PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint* ids);
+typedef void (GLAPIENTRY * PFNGLBEGINQUERYPROC) (GLenum target, GLuint id);
+typedef void (GLAPIENTRY * PFNGLENDQUERYPROC) (GLenum target);
+typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTIVPROC) (GLuint id, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint* params);
+typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTI64VPROC) (GLuint id, GLenum pname, GLint64* params);
+typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUI64VPROC) (GLuint id, GLenum pname, GLuint64* params);
+typedef void (GLAPIENTRY * PFNGLQUERYCOUNTERPROC) (GLuint id, GLenum target);
+
+#define GL_NO_ERROR 0
+#define GL_QUERY_RESULT 0x8866
+#define GL_QUERY_RESULT_AVAILABLE 0x8867
+#define GL_TIME_ELAPSED 0x88BF
+#define GL_TIMESTAMP 0x8E28
+
+#define RMT_GL_GET_FUN(x) assert(g_Remotery->opengl->x != NULL), g_Remotery->opengl->x
+
+#define glGenQueries RMT_GL_GET_FUN(__glGenQueries)
+#define glDeleteQueries RMT_GL_GET_FUN(__glDeleteQueries)
+#define glBeginQuery RMT_GL_GET_FUN(__glBeginQuery)
+#define glEndQuery RMT_GL_GET_FUN(__glEndQuery)
+#define glGetQueryObjectiv RMT_GL_GET_FUN(__glGetQueryObjectiv)
+#define glGetQueryObjectuiv RMT_GL_GET_FUN(__glGetQueryObjectuiv)
+#define glGetQueryObjecti64v RMT_GL_GET_FUN(__glGetQueryObjecti64v)
+#define glGetQueryObjectui64v RMT_GL_GET_FUN(__glGetQueryObjectui64v)
+#define glQueryCounter RMT_GL_GET_FUN(__glQueryCounter)
+
+
+typedef struct OpenGL
+{
+ // Handle to the OS OpenGL DLL
+ void* dll_handle;
+
+ PFNGLGETERRORPROC __glGetError;
+ PFNGLGENQUERIESPROC __glGenQueries;
+ PFNGLDELETEQUERIESPROC __glDeleteQueries;
+ PFNGLBEGINQUERYPROC __glBeginQuery;
+ PFNGLENDQUERYPROC __glEndQuery;
+ PFNGLGETQUERYOBJECTIVPROC __glGetQueryObjectiv;
+ PFNGLGETQUERYOBJECTUIVPROC __glGetQueryObjectuiv;
+ PFNGLGETQUERYOBJECTI64VPROC __glGetQueryObjecti64v;
+ PFNGLGETQUERYOBJECTUI64VPROC __glGetQueryObjectui64v;
+ PFNGLQUERYCOUNTERPROC __glQueryCounter;
+
+ // An allocator separate to the samples themselves so that OpenGL resource lifetime can be controlled
+ // outside of the Remotery thread.
+ ObjectAllocator* timestamp_allocator;
+
+ // Queue to the OpenGL main update thread
+ // Given that BeginSample/EndSample need to be called from the same thread that does the update, there
+ // is really no need for this to be a thread-safe queue. I'm using it for its convenience.
+ MessageQueue* mq_to_opengl_main;
+
+ // Mark the first time so that remaining timestamps are offset from this
+ rmtU64 first_timestamp;
+} OpenGL;
+
+
+static GLenum rmtglGetError(void)
+{
+ if (g_Remotery != NULL)
+ {
+ assert(g_Remotery->opengl != NULL);
+ if (g_Remotery->opengl->__glGetError != NULL)
+ return g_Remotery->opengl->__glGetError();
+ }
+
+ return (GLenum)0;
+}
+
+
+#ifdef RMT_PLATFORM_LINUX
+ #ifdef __cplusplus
+ extern "C" void* glXGetProcAddressARB(const GLubyte*);
+ #else
+ extern void* glXGetProcAddressARB(const GLubyte*);
+ #endif
+#endif
+
+
+static void* rmtglGetProcAddress(OpenGL* opengl, const char* symbol)
+{
+ assert(opengl != NULL);
+
+ #if defined(RMT_PLATFORM_WINDOWS)
+ {
+ // Get OpenGL extension-loading function for each call
+ typedef void* (*wglGetProcAddressFn)(LPCSTR);
+ {
+ wglGetProcAddressFn wglGetProcAddress = (wglGetProcAddressFn)rmtGetProcAddress(opengl->dll_handle, "wglGetProcAddress");
+ if (wglGetProcAddress != NULL)
+ return wglGetProcAddress(symbol);
+ }
+ }
+
+ #elif defined(__APPLE__) && !defined(GLEW_APPLE_GLX)
+
+ return NSGLGetProcAddress((const GLubyte*)symbol);
+
+ #elif defined(RMT_PLATFORM_LINUX)
+
+ return glXGetProcAddressARB((const GLubyte*)symbol);
+
+ #endif
+
+ return NULL;
+}
+
+
+static rmtError OpenGL_Create(OpenGL** opengl)
+{
+ rmtError error;
+
+ assert(opengl != NULL);
+
+ *opengl = (OpenGL*)rmtMalloc(sizeof(OpenGL));
+ if (*opengl == NULL)
+ return RMT_ERROR_MALLOC_FAIL;
+
+ (*opengl)->dll_handle = NULL;
+
+ (*opengl)->__glGetError = NULL;
+ (*opengl)->__glGenQueries = NULL;
+ (*opengl)->__glDeleteQueries = NULL;
+ (*opengl)->__glBeginQuery = NULL;
+ (*opengl)->__glEndQuery = NULL;
+ (*opengl)->__glGetQueryObjectiv = NULL;
+ (*opengl)->__glGetQueryObjectuiv = NULL;
+ (*opengl)->__glGetQueryObjecti64v = NULL;
+ (*opengl)->__glGetQueryObjectui64v = NULL;
+ (*opengl)->__glQueryCounter = NULL;
+
+ (*opengl)->timestamp_allocator = NULL;
+ (*opengl)->mq_to_opengl_main = NULL;
+ (*opengl)->first_timestamp = 0;
+
+ New_1(MessageQueue, (*opengl)->mq_to_opengl_main, g_Settings.messageQueueSizeInBytes);
+ return error;
+}
+
+
+static void OpenGL_Destructor(OpenGL* opengl)
+{
+ assert(opengl != NULL);
+ Delete(ObjectAllocator, opengl->timestamp_allocator);
+ Delete(MessageQueue, opengl->mq_to_opengl_main);
+}
+
+
+typedef struct OpenGLTimestamp
+{
+ // Inherit so that timestamps can be quickly allocated
+ ObjectLink Link;
+
+ // Pair of timestamp queries that wrap the sample
+ GLuint queries[2];
+} OpenGLTimestamp;
+
+
+static rmtError OpenGLTimestamp_Constructor(OpenGLTimestamp* stamp)
+{
+ int error;
+
+ assert(stamp != NULL);
+
+ ObjectLink_Constructor((ObjectLink*)stamp);
+
+ // Set defaults
+ stamp->queries[0] = stamp->queries[1] = 0;
+
+ // Create start/end timestamp queries
+ assert(g_Remotery != NULL);
+ glGenQueries(2, stamp->queries);
+ error = rmtglGetError();
+ if (error != GL_NO_ERROR)
+ return RMT_ERROR_OPENGL_ERROR;
+
+ return RMT_ERROR_NONE;
+}
+
+
+static void OpenGLTimestamp_Destructor(OpenGLTimestamp* stamp)
+{
+ assert(stamp != NULL);
+
+ // Destroy queries
+ if (stamp->queries[0] != 0)
+ {
+ int error;
+ glDeleteQueries(2, stamp->queries);
+ error = rmtglGetError();
+ assert(error == GL_NO_ERROR);
+ }
+}
+
+
+static void OpenGLTimestamp_Begin(OpenGLTimestamp* stamp)
+{
+ int error;
+
+ assert(stamp != NULL);
+
+ // Start of disjoint and first query
+ assert(g_Remotery != NULL);
+ glQueryCounter(stamp->queries[0], GL_TIMESTAMP);
+ error = rmtglGetError();
+ assert(error == GL_NO_ERROR);
+}
+
+
+static void OpenGLTimestamp_End(OpenGLTimestamp* stamp)
+{
+ int error;
+
+ assert(stamp != NULL);
+
+ // End of disjoint and second query
+ assert(g_Remotery != NULL);
+ glQueryCounter(stamp->queries[1], GL_TIMESTAMP);
+ error = rmtglGetError();
+ assert(error == GL_NO_ERROR);
+}
+
+
+static rmtBool OpenGLTimestamp_GetData(OpenGLTimestamp* stamp, rmtU64* out_start, rmtU64* out_end, rmtU64* out_first_timestamp)
+{
+ GLuint64 start = 0, end = 0;
+ GLint startAvailable = 0, endAvailable = 0;
+ int error;
+
+ assert(g_Remotery != NULL);
+
+ assert(stamp != NULL);
+ assert(stamp->queries[0] != 0 && stamp->queries[1] != 0);
+
+ // Check to see if all queries are ready
+ // If any fail to arrive, wait until later
+ glGetQueryObjectiv(stamp->queries[0], GL_QUERY_RESULT_AVAILABLE, &startAvailable);
+ error = rmtglGetError();
+ assert(error == GL_NO_ERROR);
+ if (!startAvailable)
+ return RMT_FALSE;
+ glGetQueryObjectiv(stamp->queries[1], GL_QUERY_RESULT_AVAILABLE, &endAvailable);
+ error = rmtglGetError();
+ assert(error == GL_NO_ERROR);
+ if (!endAvailable)
+ return RMT_FALSE;
+
+ glGetQueryObjectui64v(stamp->queries[0], GL_QUERY_RESULT, &start);
+ error = rmtglGetError();
+ assert(error == GL_NO_ERROR);
+ glGetQueryObjectui64v(stamp->queries[1], GL_QUERY_RESULT, &end);
+ error = rmtglGetError();
+ assert(error == GL_NO_ERROR);
+
+ // Mark the first timestamp
+ assert(out_first_timestamp != NULL);
+ if (*out_first_timestamp == 0)
+ *out_first_timestamp = start;
+
+ // Calculate start and end timestamps (we want us, the queries give us ns)
+ *out_start = (rmtU64)(start - *out_first_timestamp) / 1000ULL;
+ *out_end = (rmtU64)(end - *out_first_timestamp) / 1000ULL;
+
+ return RMT_TRUE;
+}
+
+
+typedef struct OpenGLSample
+{
+ // IS-A inheritance relationship
+ Sample m_sample;
+
+ OpenGLTimestamp* timestamp;
+
+} OpenGLSample;
+
+
+static rmtError OpenGLSample_Constructor(OpenGLSample* sample)
+{
+ assert(sample != NULL);
+
+ // Chain to sample constructor
+ Sample_Constructor((Sample*)sample);
+ sample->m_sample.type = SampleType_OpenGL;
+ sample->m_sample.size_bytes = sizeof(OpenGLSample);
+ sample->timestamp = NULL;
+
+ return RMT_ERROR_NONE;
+}
+
+
+static void OpenGLSample_Destructor(OpenGLSample* sample)
+{
+ Sample_Destructor((Sample*)sample);
+}
+
+
+RMT_API void _rmt_BindOpenGL()
+{
+ if (g_Remotery != NULL)
+ {
+ OpenGL* opengl = g_Remotery->opengl;
+ assert(opengl != NULL);
+
+ #if defined (RMT_PLATFORM_WINDOWS)
+ opengl->dll_handle = rmtLoadLibrary("opengl32.dll");
+ #endif
+
+ opengl->__glGetError = (PFNGLGETERRORPROC)rmtGetProcAddress(opengl->dll_handle, "glGetError");
+ opengl->__glGenQueries = (PFNGLGENQUERIESPROC)rmtglGetProcAddress(opengl, "glGenQueries");
+ opengl->__glDeleteQueries = (PFNGLDELETEQUERIESPROC)rmtglGetProcAddress(opengl, "glDeleteQueries");
+ opengl->__glBeginQuery = (PFNGLBEGINQUERYPROC)rmtglGetProcAddress(opengl, "glBeginQuery");
+ opengl->__glEndQuery = (PFNGLENDQUERYPROC)rmtglGetProcAddress(opengl, "glEndQuery");
+ opengl->__glGetQueryObjectiv = (PFNGLGETQUERYOBJECTIVPROC)rmtglGetProcAddress(opengl, "glGetQueryObjectiv");
+ opengl->__glGetQueryObjectuiv = (PFNGLGETQUERYOBJECTUIVPROC)rmtglGetProcAddress(opengl, "glGetQueryObjectuiv");
+ opengl->__glGetQueryObjecti64v = (PFNGLGETQUERYOBJECTI64VPROC)rmtglGetProcAddress(opengl, "glGetQueryObjecti64v");
+ opengl->__glGetQueryObjectui64v = (PFNGLGETQUERYOBJECTUI64VPROC)rmtglGetProcAddress(opengl, "glGetQueryObjectui64v");
+ opengl->__glQueryCounter = (PFNGLQUERYCOUNTERPROC)rmtglGetProcAddress(opengl, "glQueryCounter");
+ }
+}
+
+
+static void FreeOpenGLTimeStamps(Sample* sample)
+{
+ Sample* child;
+
+ OpenGLSample* ogl_sample = (OpenGLSample*)sample;
+
+ assert(ogl_sample->timestamp != NULL);
+ ObjectAllocator_Free(g_Remotery->opengl->timestamp_allocator, (void*)ogl_sample->timestamp);
+ ogl_sample->timestamp = NULL;
+
+ for (child = sample->first_child; child != NULL; child = child->next_sibling)
+ FreeOpenGLTimeStamps(child);
+}
+
+
+RMT_API void _rmt_UnbindOpenGL(void)
+{
+ if (g_Remotery != NULL)
+ {
+ OpenGL* opengl = g_Remotery->opengl;
+ assert(opengl != NULL);
+
+ // Flush the main queue of allocated OpenGL timestamps
+ while (1)
+ {
+ Msg_SampleTree* sample_tree;
+ Sample* sample;
+
+ Message* message = MessageQueue_PeekNextMessage(opengl->mq_to_opengl_main);
+ if (message == NULL)
+ break;
+
+ // There's only one valid message type in this queue
+ assert(message->id == MsgID_SampleTree);
+ sample_tree = (Msg_SampleTree*)message->payload;
+ sample = sample_tree->root_sample;
+ assert(sample->type == SampleType_OpenGL);
+ FreeOpenGLTimeStamps(sample);
+ FreeSampleTree(sample, sample_tree->allocator);
+
+ MessageQueue_ConsumeNextMessage(opengl->mq_to_opengl_main, message);
+ }
+
+ // Free all allocated OpenGL resources
+ Delete(ObjectAllocator, opengl->timestamp_allocator);
+
+ // Release reference to the OpenGL DLL
+ if (opengl->dll_handle != NULL)
+ {
+ rmtFreeLibrary(opengl->dll_handle);
+ opengl->dll_handle = NULL;
+ }
+ }
+}
+
+
+RMT_API void _rmt_BeginOpenGLSample(rmtPStr name, rmtU32* hash_cache)
+{
+ ThreadSampler* ts;
+
+ if (g_Remotery == NULL)
+ return;
+
+ if (Remotery_GetThreadSampler(g_Remotery, &ts) == RMT_ERROR_NONE)
+ {
+ rmtError error;
+ Sample* sample;
+ rmtU32 name_hash = GetNameHash(name, hash_cache);
+
+ OpenGL* opengl = g_Remotery->opengl;
+
+ // Create the OpenGL tree on-demand as the tree needs an up-front-created root.
+ // This is not possible to create on initialisation as a OpenGL binding is not yet available.
+ SampleTree** ogl_tree = &ts->sample_trees[SampleType_OpenGL];
+ if (*ogl_tree == NULL)
+ {
+ New_3(SampleTree, *ogl_tree, sizeof(OpenGLSample), (ObjConstructor)OpenGLSample_Constructor, (ObjDestructor)OpenGLSample_Destructor);
+ if (error != RMT_ERROR_NONE)
+ return;
+ }
+
+ // Also create the timestamp allocator on-demand to keep the OpenGL code localised to the same file section
+ assert(opengl != NULL);
+ if (opengl->timestamp_allocator == NULL)
+ New_3(ObjectAllocator, opengl->timestamp_allocator, sizeof(OpenGLTimestamp), (ObjConstructor)OpenGLTimestamp_Constructor, (ObjDestructor)OpenGLTimestamp_Destructor);
+
+ // Push the sample
+ if (ThreadSampler_Push(ts, *ogl_tree, name, name_hash, &sample) == RMT_ERROR_NONE)
+ {
+ OpenGLSample* ogl_sample = (OpenGLSample*)sample;
+
+ // Allocate a timestamp for the sample and activate it
+ assert(ogl_sample->timestamp == NULL);
+ error = ObjectAllocator_Alloc(opengl->timestamp_allocator, (void**)&ogl_sample->timestamp);
+ if (error == RMT_ERROR_NONE)
+ OpenGLTimestamp_Begin(ogl_sample->timestamp);
+ }
+ }
+}
+
+
+static rmtBool GetOpenGLSampleTimes(Sample* sample, rmtU64* out_first_timestamp)
+{
+ Sample* child;
+
+ OpenGLSample* ogl_sample = (OpenGLSample*)sample;
+
+ assert(sample != NULL);
+ if (ogl_sample->timestamp != NULL)
+ {
+ if (!OpenGLTimestamp_GetData(ogl_sample->timestamp, &sample->us_start, &sample->us_end, out_first_timestamp))
+ return RMT_FALSE;
+ }
+
+ // Get child sample times
+ for (child = sample->first_child; child != NULL; child = child->next_sibling)
+ {
+ if (!GetOpenGLSampleTimes(child, out_first_timestamp))
+ return RMT_FALSE;
+ }
+
+ return RMT_TRUE;
+}
+
+
+static void UpdateOpenGLFrame(void)
+{
+ OpenGL* opengl;
+
+ if (g_Remotery == NULL)
+ return;
+
+ opengl = g_Remotery->opengl;
+ assert(opengl != NULL);
+
+ rmt_BeginCPUSample(rmt_UpdateOpenGLFrame);
+
+ // Process all messages in the OpenGL queue
+ while (1)
+ {
+ Msg_SampleTree* sample_tree;
+ Sample* sample;
+
+ Message* message = MessageQueue_PeekNextMessage(opengl->mq_to_opengl_main);
+ if (message == NULL)
+ break;
+
+ // There's only one valid message type in this queue
+ assert(message->id == MsgID_SampleTree);
+ sample_tree = (Msg_SampleTree*)message->payload;
+ sample = sample_tree->root_sample;
+ assert(sample->type == SampleType_OpenGL);
+
+ // Retrieve timing of all OpenGL samples
+ // If they aren't ready leave the message unconsumed, holding up later frames and maintaining order
+ if (!GetOpenGLSampleTimes(sample, &opengl->first_timestamp))
+ break;
+
+ // Pass samples onto the remotery thread for sending to the viewer
+ FreeOpenGLTimeStamps(sample);
+ AddSampleTreeMessage(g_Remotery->mq_to_rmt_thread, sample, sample_tree->allocator, sample_tree->thread_name, message->thread_sampler);
+ MessageQueue_ConsumeNextMessage(opengl->mq_to_opengl_main, message);
+ }
+
+ rmt_EndCPUSample();
+}
+
+
+RMT_API void _rmt_EndOpenGLSample(void)
+{
+ ThreadSampler* ts;
+
+ if (g_Remotery == NULL)
+ return;
+
+ if (Remotery_GetThreadSampler(g_Remotery, &ts) == RMT_ERROR_NONE)
+ {
+ // Close the timestamp
+ OpenGLSample* ogl_sample = (OpenGLSample*)ts->sample_trees[SampleType_OpenGL]->current_parent;
+ if (ogl_sample->timestamp != NULL)
+ OpenGLTimestamp_End(ogl_sample->timestamp);
+
+ // Send to the update loop for ready-polling
+ if (ThreadSampler_Pop(ts, g_Remotery->opengl->mq_to_opengl_main, (Sample*)ogl_sample))
+ // Perform ready-polling on popping of the root sample
+ UpdateOpenGLFrame();
+ }
+}
+
+
+
+#endif // RMT_USE_OPENGL
+
+
+#endif // RMT_ENABLED
diff --git a/3rdparty/bgfx/3rdparty/remotery/lib/Remotery.h b/3rdparty/bgfx/3rdparty/remotery/lib/Remotery.h
new file mode 100644
index 00000000000..20836f68610
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/remotery/lib/Remotery.h
@@ -0,0 +1,558 @@
+
+
+/*
+Copyright 2014 Celtoys Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+
+/*
+
+Compiling
+---------
+
+* Windows (MSVC) - add lib/Remotery.c and lib/Remotery.h to your program. Set include
+ directories to add Remotery/lib path. The required library ws2_32.lib should be picked
+ up through the use of the #pragma comment(lib, "ws2_32.lib") directive in Remotery.c.
+
+* Mac OS X (XCode) - simply add lib/Remotery.c and lib/Remotery.h to your program.
+
+* Linux (GCC) - add the source in lib folder. Compilation of the code requires -pthreads for
+ library linkage. For example to compile the same run: cc lib/Remotery.c sample/sample.c
+ -I lib -pthread -lm
+
+You can define some extra macros to modify what features are compiled into Remotery. These are
+documented just below this comment.
+
+*/
+
+
+#ifndef RMT_INCLUDED_H
+#define RMT_INCLUDED_H
+
+
+// Set to 0 to not include any bits of Remotery in your build
+#ifndef RMT_ENABLED
+#define RMT_ENABLED 1
+#endif
+
+// Used by the Celtoys TinyCRT library (not released yet)
+#ifndef RMT_USE_TINYCRT
+#define RMT_USE_TINYCRT 0
+#endif
+
+// Assuming CUDA headers/libs are setup, allow CUDA profiling
+#ifndef RMT_USE_CUDA
+#define RMT_USE_CUDA 0
+#endif
+
+// Assuming Direct3D 11 headers/libs are setup, allow D3D11 profiling
+#ifndef RMT_USE_D3D11
+#define RMT_USE_D3D11 0
+#endif
+
+// Allow OpenGL profiling
+#ifndef RMT_USE_OPENGL
+#define RMT_USE_OPENGL 0
+#endif
+
+// Initially use POSIX thread names to name threads instead of Thread0, 1, ...
+#ifndef RMT_USE_POSIX_THREADNAMES
+#define RMT_USE_POSIX_THREADNAMES 0
+#endif
+
+
+/*
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+ Compiler/Platform Detection and Preprocessor Utilities
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+*/
+
+
+
+// Compiler identification
+#if defined(_MSC_VER)
+ #define RMT_COMPILER_MSVC
+#elif defined(__GNUC__)
+ #define RMT_COMPILER_GNUC
+#elif defined(__clang__)
+ #define RMT_COMPILER_CLANG
+#endif
+
+
+// Platform identification
+#if defined(_WINDOWS) || defined(_WIN32)
+ #define RMT_PLATFORM_WINDOWS
+#elif defined(__linux__)
+ #define RMT_PLATFORM_LINUX
+ #define RMT_PLATFORM_POSIX
+#elif defined(__APPLE__)
+ #define RMT_PLATFORM_MACOS
+ #define RMT_PLATFORM_POSIX
+#endif
+
+#ifdef RMT_DLL
+ #if defined (RMT_PLATFORM_WINDOWS)
+ #if defined (RMT_IMPL)
+ #define RMT_API __declspec(dllexport)
+ #else
+ #define RMT_API __declspec(dllimport)
+ #endif
+ #elif defined (RMT_PLATFORM_POSIX)
+ #if defined (RMT_IMPL)
+ #define RMT_API __attribute__((visibility("default")))
+ #else
+ #define RMT_API
+ #endif
+ #endif
+#else
+ #define RMT_API
+#endif
+
+// Allows macros to be written that can work around the inability to do: #define(x) #ifdef x
+// with the C preprocessor.
+#if RMT_ENABLED
+ #define IFDEF_RMT_ENABLED(t, f) t
+#else
+ #define IFDEF_RMT_ENABLED(t, f) f
+#endif
+#if RMT_ENABLED && RMT_USE_CUDA
+ #define IFDEF_RMT_USE_CUDA(t, f) t
+#else
+ #define IFDEF_RMT_USE_CUDA(t, f) f
+#endif
+#if RMT_ENABLED && RMT_USE_D3D11
+ #define IFDEF_RMT_USE_D3D11(t, f) t
+#else
+ #define IFDEF_RMT_USE_D3D11(t, f) f
+#endif
+#if RMT_ENABLED && RMT_USE_OPENGL
+#define IFDEF_RMT_USE_OPENGL(t, f) t
+#else
+#define IFDEF_RMT_USE_OPENGL(t, f) f
+#endif
+
+
+// Public interface is written in terms of these macros to easily enable/disable itself
+#define RMT_OPTIONAL(macro, x) IFDEF_ ## macro(x, )
+#define RMT_OPTIONAL_RET(macro, x, y) IFDEF_ ## macro(x, (y))
+
+
+
+/*
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+ Types
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+*/
+
+
+
+// Boolean
+typedef unsigned int rmtBool;
+#define RMT_TRUE ((rmtBool)1)
+#define RMT_FALSE ((rmtBool)0)
+
+
+// Unsigned integer types
+typedef unsigned char rmtU8;
+typedef unsigned short rmtU16;
+typedef unsigned int rmtU32;
+typedef unsigned long long rmtU64;
+
+
+// Signed integer types
+typedef char rmtS8;
+typedef short rmtS16;
+typedef int rmtS32;
+typedef long long rmtS64;
+
+
+// Const, null-terminated string pointer
+typedef const char* rmtPStr;
+
+
+// Handle to the main remotery instance
+typedef struct Remotery Remotery;
+
+
+// All possible error codes
+typedef enum rmtError
+{
+ RMT_ERROR_NONE,
+
+ // System errors
+ RMT_ERROR_MALLOC_FAIL, // Malloc call within remotery failed
+ RMT_ERROR_TLS_ALLOC_FAIL, // Attempt to allocate thread local storage failed
+ RMT_ERROR_VIRTUAL_MEMORY_BUFFER_FAIL, // Failed to create a virtual memory mirror buffer
+ RMT_ERROR_CREATE_THREAD_FAIL, // Failed to create a thread for the server
+
+ // Network TCP/IP socket errors
+ RMT_ERROR_SOCKET_INIT_NETWORK_FAIL, // Network initialisation failure (e.g. on Win32, WSAStartup fails)
+ RMT_ERROR_SOCKET_CREATE_FAIL, // Can't create a socket for connection to the remote viewer
+ RMT_ERROR_SOCKET_BIND_FAIL, // Can't bind a socket for the server
+ RMT_ERROR_SOCKET_LISTEN_FAIL, // Created server socket failed to enter a listen state
+ RMT_ERROR_SOCKET_SET_NON_BLOCKING_FAIL, // Created server socket failed to switch to a non-blocking state
+ RMT_ERROR_SOCKET_INVALID_POLL, // Poll attempt on an invalid socket
+ RMT_ERROR_SOCKET_SELECT_FAIL, // Server failed to call select on socket
+ RMT_ERROR_SOCKET_POLL_ERRORS, // Poll notified that the socket has errors
+ RMT_ERROR_SOCKET_ACCEPT_FAIL, // Server failed to accept connection from client
+ RMT_ERROR_SOCKET_SEND_TIMEOUT, // Timed out trying to send data
+ RMT_ERROR_SOCKET_SEND_FAIL, // Unrecoverable error occured while client/server tried to send data
+ RMT_ERROR_SOCKET_RECV_NO_DATA, // No data available when attempting a receive
+ RMT_ERROR_SOCKET_RECV_TIMEOUT, // Timed out trying to receive data
+ RMT_ERROR_SOCKET_RECV_FAILED, // Unrecoverable error occured while client/server tried to receive data
+
+ // WebSocket errors
+ RMT_ERROR_WEBSOCKET_HANDSHAKE_NOT_GET, // WebSocket server handshake failed, not HTTP GET
+ RMT_ERROR_WEBSOCKET_HANDSHAKE_NO_VERSION, // WebSocket server handshake failed, can't locate WebSocket version
+ RMT_ERROR_WEBSOCKET_HANDSHAKE_BAD_VERSION, // WebSocket server handshake failed, unsupported WebSocket version
+ RMT_ERROR_WEBSOCKET_HANDSHAKE_NO_HOST, // WebSocket server handshake failed, can't locate host
+ RMT_ERROR_WEBSOCKET_HANDSHAKE_BAD_HOST, // WebSocket server handshake failed, host is not allowed to connect
+ RMT_ERROR_WEBSOCKET_HANDSHAKE_NO_KEY, // WebSocket server handshake failed, can't locate WebSocket key
+ RMT_ERROR_WEBSOCKET_HANDSHAKE_BAD_KEY, // WebSocket server handshake failed, WebSocket key is ill-formed
+ RMT_ERROR_WEBSOCKET_HANDSHAKE_STRING_FAIL, // WebSocket server handshake failed, internal error, bad string code
+ RMT_ERROR_WEBSOCKET_DISCONNECTED, // WebSocket server received a disconnect request and closed the socket
+ RMT_ERROR_WEBSOCKET_BAD_FRAME_HEADER, // Couldn't parse WebSocket frame header
+ RMT_ERROR_WEBSOCKET_BAD_FRAME_HEADER_SIZE, // Partially received wide frame header size
+ RMT_ERROR_WEBSOCKET_BAD_FRAME_HEADER_MASK, // Partially received frame header data mask
+ RMT_ERROR_WEBSOCKET_RECEIVE_TIMEOUT, // Timeout receiving frame header
+
+ RMT_ERROR_REMOTERY_NOT_CREATED, // Remotery object has not been created
+ RMT_ERROR_SEND_ON_INCOMPLETE_PROFILE, // An attempt was made to send an incomplete profile tree to the client
+
+ // CUDA error messages
+ RMT_ERROR_CUDA_DEINITIALIZED, // This indicates that the CUDA driver is in the process of shutting down
+ RMT_ERROR_CUDA_NOT_INITIALIZED, // This indicates that the CUDA driver has not been initialized with cuInit() or that initialization has failed
+ RMT_ERROR_CUDA_INVALID_CONTEXT, // This most frequently indicates that there is no context bound to the current thread
+ RMT_ERROR_CUDA_INVALID_VALUE, // This indicates that one or more of the parameters passed to the API call is not within an acceptable range of values
+ RMT_ERROR_CUDA_INVALID_HANDLE, // This indicates that a resource handle passed to the API call was not valid
+ RMT_ERROR_CUDA_OUT_OF_MEMORY, // The API call failed because it was unable to allocate enough memory to perform the requested operation
+ RMT_ERROR_ERROR_NOT_READY, // This indicates that a resource handle passed to the API call was not valid
+
+ // Direct3D 11 error messages
+ RMT_ERROR_D3D11_FAILED_TO_CREATE_QUERY, // Failed to create query for sample
+
+ // OpenGL error messages
+ RMT_ERROR_OPENGL_ERROR, // Generic OpenGL error, no real need to expose more detail since app will probably have an OpenGL error callback registered
+
+ RMT_ERROR_CUDA_UNKNOWN,
+} rmtError;
+
+
+
+/*
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+ Public Interface
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+*/
+
+
+
+// Can call remotery functions on a null pointer
+// TODO: Can embed extern "C" in these macros?
+
+#define rmt_Settings() \
+ RMT_OPTIONAL_RET(RMT_ENABLED, _rmt_Settings(), NULL )
+
+#define rmt_CreateGlobalInstance(rmt) \
+ RMT_OPTIONAL_RET(RMT_ENABLED, _rmt_CreateGlobalInstance(rmt), RMT_ERROR_NONE)
+
+#define rmt_DestroyGlobalInstance(rmt) \
+ RMT_OPTIONAL(RMT_ENABLED, _rmt_DestroyGlobalInstance(rmt))
+
+#define rmt_SetGlobalInstance(rmt) \
+ RMT_OPTIONAL(RMT_ENABLED, _rmt_SetGlobalInstance(rmt))
+
+#define rmt_GetGlobalInstance() \
+ RMT_OPTIONAL_RET(RMT_ENABLED, _rmt_GetGlobalInstance(), NULL)
+
+#define rmt_SetCurrentThreadName(rmt) \
+ RMT_OPTIONAL(RMT_ENABLED, _rmt_SetCurrentThreadName(rmt))
+
+#define rmt_LogText(text) \
+ RMT_OPTIONAL(RMT_ENABLED, _rmt_LogText(text))
+
+#define rmt_BeginCPUSample(name) \
+ RMT_OPTIONAL(RMT_ENABLED, { \
+ static rmtU32 rmt_sample_hash_##name = 0; \
+ _rmt_BeginCPUSample(#name, &rmt_sample_hash_##name); \
+ })
+
+#define rmt_BeginCPUSampleDynamic(namestr) \
+ RMT_OPTIONAL(RMT_ENABLED, _rmt_BeginCPUSample(namestr, NULL))
+
+#define rmt_EndCPUSample() \
+ RMT_OPTIONAL(RMT_ENABLED, _rmt_EndCPUSample())
+
+
+// Callback function pointer types
+typedef void* (*rmtMallocPtr)(void* mm_context, rmtU32 size);
+typedef void* (*rmtReallocPtr)(void* mm_context, void* ptr, rmtU32 size);
+typedef void (*rmtFreePtr)(void* mm_context, void* ptr);
+typedef void (*rmtInputHandlerPtr)(const char* text, void* context);
+
+
+// Struture to fill in to modify Remotery default settings
+typedef struct rmtSettings
+{
+ rmtU16 port;
+
+ // How long to sleep between server updates, hopefully trying to give
+ // a little CPU back to other threads.
+ rmtU32 msSleepBetweenServerUpdates;
+
+ // Size of the internal message queues Remotery uses
+ // Will be rounded to page granularity of 64k
+ rmtU32 messageQueueSizeInBytes;
+
+ // If the user continuously pushes to the message queue, the server network
+ // code won't get a chance to update unless there's an upper-limit on how
+ // many messages can be consumed per loop.
+ rmtU32 maxNbMessagesPerUpdate;
+
+ // Callback pointers for memory allocation
+ rmtMallocPtr malloc;
+ rmtReallocPtr realloc;
+ rmtFreePtr free;
+ void* mm_context;
+
+ // Callback pointer for receiving input from the Remotery console
+ rmtInputHandlerPtr input_handler;
+
+ // Context pointer that gets sent to Remotery console callback function
+ void* input_handler_context;
+
+ rmtPStr logFilename;
+} rmtSettings;
+
+
+// Structure to fill in when binding CUDA to Remotery
+typedef struct rmtCUDABind
+{
+ // The main context that all driver functions apply before each call
+ void* context;
+
+ // Driver API function pointers that need to be pointed to
+ // Untyped so that the CUDA headers are not required in this file
+ // NOTE: These are named differently to the CUDA functions because the CUDA API has a habit of using
+ // macros to point function calls to different versions, e.g. cuEventDestroy is a macro for
+ // cuEventDestroy_v2.
+ void* CtxSetCurrent;
+ void* CtxGetCurrent;
+ void* EventCreate;
+ void* EventDestroy;
+ void* EventRecord;
+ void* EventQuery;
+ void* EventElapsedTime;
+
+} rmtCUDABind;
+
+
+// Call once after you've initialised CUDA to bind it to Remotery
+#define rmt_BindCUDA(bind) \
+ RMT_OPTIONAL(RMT_USE_CUDA, _rmt_BindCUDA(bind))
+
+// Mark the beginning of a CUDA sample on the specified asynchronous stream
+#define rmt_BeginCUDASample(name, stream) \
+ RMT_OPTIONAL(RMT_USE_CUDA, { \
+ static rmtU32 rmt_sample_hash_##name = 0; \
+ _rmt_BeginCUDASample(#name, &rmt_sample_hash_##name, stream); \
+ })
+
+// Mark the end of a CUDA sample on the specified asynchronous stream
+#define rmt_EndCUDASample(stream) \
+ RMT_OPTIONAL(RMT_USE_CUDA, _rmt_EndCUDASample(stream))
+
+
+#define rmt_BindD3D11(device, context) \
+ RMT_OPTIONAL(RMT_USE_D3D11, _rmt_BindD3D11(device, context))
+
+#define rmt_UnbindD3D11() \
+ RMT_OPTIONAL(RMT_USE_D3D11, _rmt_UnbindD3D11())
+
+#define rmt_BeginD3D11Sample(name) \
+ RMT_OPTIONAL(RMT_USE_D3D11, { \
+ static rmtU32 rmt_sample_hash_##name = 0; \
+ _rmt_BeginD3D11Sample(#name, &rmt_sample_hash_##name); \
+ })
+
+#define rmt_BeginD3D11SampleDynamic(namestr) \
+ RMT_OPTIONAL(RMT_USE_D3D11, _rmt_BeginD3D11Sample(namestr, NULL))
+
+#define rmt_EndD3D11Sample() \
+ RMT_OPTIONAL(RMT_USE_D3D11, _rmt_EndD3D11Sample())
+
+
+#define rmt_BindOpenGL() \
+ RMT_OPTIONAL(RMT_USE_OPENGL, _rmt_BindOpenGL())
+
+#define rmt_UnbindOpenGL() \
+ RMT_OPTIONAL(RMT_USE_OPENGL, _rmt_UnbindOpenGL())
+
+#define rmt_BeginOpenGLSample(name) \
+ RMT_OPTIONAL(RMT_USE_OPENGL, { \
+ static rmtU32 rmt_sample_hash_##name = 0; \
+ _rmt_BeginOpenGLSample(#name, &rmt_sample_hash_##name); \
+ })
+
+#define rmt_BeginOpenGLSampleDynamic(namestr) \
+ RMT_OPTIONAL(RMT_USE_OPENGL, _rmt_BeginOpenGLSample(namestr, NULL))
+
+#define rmt_EndOpenGLSample() \
+ RMT_OPTIONAL(RMT_USE_OPENGL, _rmt_EndOpenGLSample())
+
+
+
+/*
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+ C++ Public Interface Extensions
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+*/
+
+
+
+#ifdef __cplusplus
+
+
+#if RMT_ENABLED
+
+// Types that end samples in their destructors
+extern "C" RMT_API void _rmt_EndCPUSample(void);
+struct rmt_EndCPUSampleOnScopeExit
+{
+ ~rmt_EndCPUSampleOnScopeExit()
+ {
+ _rmt_EndCPUSample();
+ }
+};
+#if RMT_USE_CUDA
+extern "C" RMT_API void _rmt_EndCUDASample(void* stream);
+struct rmt_EndCUDASampleOnScopeExit
+{
+ rmt_EndCUDASampleOnScopeExit(void* stream) : stream(stream)
+ {
+ }
+ ~rmt_EndCUDASampleOnScopeExit()
+ {
+ _rmt_EndCUDASample(stream);
+ }
+ void* stream;
+};
+#endif
+#if RMT_USE_D3D11
+extern "C" RMT_API void _rmt_EndD3D11Sample(void);
+struct rmt_EndD3D11SampleOnScopeExit
+{
+ ~rmt_EndD3D11SampleOnScopeExit()
+ {
+ _rmt_EndD3D11Sample();
+ }
+};
+#endif
+
+#if RMT_USE_OPENGL
+extern "C" RMT_API void _rmt_EndOpenGLSample(void);
+struct rmt_EndOpenGLSampleOnScopeExit
+{
+ ~rmt_EndOpenGLSampleOnScopeExit()
+ {
+ _rmt_EndOpenGLSample();
+ }
+};
+#endif
+
+#endif
+
+
+
+// Pairs a call to rmt_Begin<TYPE>Sample with its call to rmt_End<TYPE>Sample when leaving scope
+#define rmt_ScopedCPUSample(name) \
+ RMT_OPTIONAL(RMT_ENABLED, rmt_BeginCPUSample(name)); \
+ RMT_OPTIONAL(RMT_ENABLED, rmt_EndCPUSampleOnScopeExit rmt_ScopedCPUSample##name);
+#define rmt_ScopedCUDASample(name, stream) \
+ RMT_OPTIONAL(RMT_USE_CUDA, rmt_BeginCUDASample(name, stream)); \
+ RMT_OPTIONAL(RMT_USE_CUDA, rmt_EndCUDASampleOnScopeExit rmt_ScopedCUDASample##name(stream));
+#define rmt_ScopedD3D11Sample(name) \
+ RMT_OPTIONAL(RMT_USE_D3D11, rmt_BeginD3D11Sample(name)); \
+ RMT_OPTIONAL(RMT_USE_D3D11, rmt_EndD3D11SampleOnScopeExit rmt_ScopedD3D11Sample##name);
+#define rmt_ScopedOpenGLSample(name) \
+ RMT_OPTIONAL(RMT_USE_OPENGL, rmt_BeginOpenGLSample(name)); \
+ RMT_OPTIONAL(RMT_USE_OPENGL, rmt_EndOpenGLSampleOnScopeExit rmt_ScopedOpenGLSample##name);
+
+#endif
+
+
+
+/*
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+ Private Interface - don't directly call these
+------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------------------------
+*/
+
+
+
+#if RMT_ENABLED
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+RMT_API rmtSettings* _rmt_Settings( void );
+RMT_API enum rmtError _rmt_CreateGlobalInstance(Remotery** remotery);
+RMT_API void _rmt_DestroyGlobalInstance(Remotery* remotery);
+RMT_API void _rmt_SetGlobalInstance(Remotery* remotery);
+RMT_API Remotery* _rmt_GetGlobalInstance(void);
+RMT_API void _rmt_SetCurrentThreadName(rmtPStr thread_name);
+RMT_API void _rmt_LogText(rmtPStr text);
+RMT_API void _rmt_BeginCPUSample(rmtPStr name, rmtU32* hash_cache);
+RMT_API void _rmt_EndCPUSample(void);
+
+#if RMT_USE_CUDA
+RMT_API void _rmt_BindCUDA(const rmtCUDABind* bind);
+RMT_API void _rmt_BeginCUDASample(rmtPStr name, rmtU32* hash_cache, void* stream);
+RMT_API void _rmt_EndCUDASample(void* stream);
+#endif
+
+#if RMT_USE_D3D11
+RMT_API void _rmt_BindD3D11(void* device, void* context);
+RMT_API void _rmt_UnbindD3D11(void);
+RMT_API void _rmt_BeginD3D11Sample(rmtPStr name, rmtU32* hash_cache);
+RMT_API void _rmt_EndD3D11Sample(void);
+#endif
+
+#if RMT_USE_OPENGL
+RMT_API void _rmt_BindOpenGL();
+RMT_API void _rmt_UnbindOpenGL(void);
+RMT_API void _rmt_BeginOpenGLSample(rmtPStr name, rmtU32* hash_cache);
+RMT_API void _rmt_EndOpenGLSample(void);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // RMT_ENABLED
+
+
+#endif
diff --git a/3rdparty/bgfx/3rdparty/remotery/readme.md b/3rdparty/bgfx/3rdparty/remotery/readme.md
new file mode 100644
index 00000000000..99cbdf9ad7f
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/remotery/readme.md
@@ -0,0 +1,197 @@
+Remotery
+--------
+
+A realtime CPU/GPU profiler hosted in a single C file with a viewer that runs in a web browser.
+
+![screenshot](screenshot.png?raw=true)
+
+Supported features:
+
+* Lightweight instrumentation of multiple threads running on the CPU.
+* Web viewer that runs in Chrome, Firefox and Safari. Custom WebSockets server
+ transmits sample data to the browser on a latent thread.
+* Profiles itself and shows how it's performing in the viewer.
+* Can optionally sample CUDA/D3D11/OpenGL GPU activity.
+* Console output for logging text.
+* Console input for sending commands to your game.
+
+
+Compiling
+---------
+
+* Windows (MSVC) - add lib/Remotery.c and lib/Remotery.h to your program. Set include
+ directories to add Remotery/lib path. The required library ws2_32.lib should be picked
+ up through the use of the #pragma comment(lib, "ws2_32.lib") directive in Remotery.c.
+
+* Mac OS X (XCode) - simply add lib/Remotery.c and lib/Remotery.h to your program.
+
+* Linux (GCC) - add the source in lib folder. Compilation of the code requires -pthreads for
+ library linkage. For example to compile the same run: cc lib/Remotery.c sample/sample.c
+ -I lib -pthread -lm
+
+You can define some extra macros to modify what features are compiled into Remotery:
+
+ Macro Default Description
+
+ RMT_ENABLED 1 Disable this to not include any bits of Remotery in your build
+ RMT_USE_TINYCRT 0 Used by the Celtoys TinyCRT library (not released yet)
+ RMT_USE_CUDA 0 Assuming CUDA headers/libs are setup, allow CUDA profiling
+ RMT_USE_D3D11 0 Assuming Direct3D 11 headers/libs are setup, allow D3D11 GPU profiling
+ RMT_USE_OPENGL 0 Allow OpenGL GPU profiling (standalone except you must link to OpenGL which you already do if you use it)
+
+
+Basic Use
+---------
+
+See the sample directory for further examples. A quick example:
+
+ int main()
+ {
+ // Create the main instance of Remotery.
+ // You need only do this once per program.
+ Remotery* rmt;
+ rmt_CreateGlobalInstance(&rmt);
+
+ // Explicit begin/end for C
+ {
+ rmt_BeginCPUSample(LogText);
+ rmt_LogText("Time me, please!");
+ rmt_EndCPUSample();
+ }
+
+ // Scoped begin/end for C++
+ {
+ rmt_ScopedCPUSample(LogText);
+ rmt_LogText("Time me, too!");
+ }
+
+ // Destroy the main instance of Remotery.
+ rmt_DestroyGlobalInstance(rmt);
+ }
+
+
+Running the Viewer
+------------------
+
+Double-click or launch `vis/index.html` from the browser.
+
+
+Sampling CUDA GPU activity
+--------------------------
+
+Remotery allows for profiling multiple threads of CUDA execution using different asynchronous streams
+that must all share the same context. After initialising both Remotery and CUDA you need to bind the
+two together using the call:
+
+ rmtCUDABind bind;
+ bind.context = m_Context;
+ bind.CtxSetCurrent = &cuCtxSetCurrent;
+ bind.CtxGetCurrent = &cuCtxGetCurrent;
+ bind.EventCreate = &cuEventCreate;
+ bind.EventDestroy = &cuEventDestroy;
+ bind.EventRecord = &cuEventRecord;
+ bind.EventQuery = &cuEventQuery;
+ bind.EventElapsedTime = &cuEventElapsedTime;
+ rmt_BindCUDA(&bind);
+
+Explicitly pointing to the CUDA interface allows Remotery to be included anywhere in your project without
+need for you to link with the required CUDA libraries. After the bind completes you can safely sample any
+CUDA activity:
+
+ CUstream stream;
+
+ // Explicit begin/end for C
+ {
+ rmt_BeginCUDASample(UnscopedSample, stream);
+ // ... CUDA code ...
+ rmt_EndCUDASample(stream);
+ }
+
+ // Scoped begin/end for C++
+ {
+ rmt_ScopedCUDASample(ScopedSample, stream);
+ // ... CUDA code ...
+ }
+
+Remotery supports only one context for all threads and will use cuCtxGetCurrent and cuCtxSetCurrent to
+ensure the current thread has the context you specify in rmtCUDABind.context.
+
+
+Sampling Direct3D 11 GPU activity
+---------------------------------
+
+Remotery allows sampling of GPU activity on your main D3D11 context. After initialising Remotery, you need
+to bind it to D3D11 with a single call from the thread that owns the device context:
+
+ // Parameters are ID3D11Device* and ID3D11DeviceContext*
+ rmt_BindD3D11(d3d11_device, d3d11_context);
+
+Sampling is then a simple case of:
+
+ // Explicit begin/end for C
+ {
+ rmt_BeginD3D11Sample(UnscopedSample);
+ // ... D3D code ...
+ rmt_EndD3D11Sample();
+ }
+
+ // Scoped begin/end for C++
+ {
+ rmt_ScopedD3D11Sample(ScopedSample);
+ // ... D3D code ...
+ }
+
+Support for multiple contexts can be added pretty easily if there is demand for the feature. When you shutdown
+your D3D11 device and context, ensure you notify Remotery before shutting down Remotery itself:
+
+ rmt_UnbindD3D11();
+
+
+Sampling OpenGL GPU activity
+----------------------------
+
+Remotery allows sampling of GPU activity on your main OpenGL context. After initialising Remotery, you need
+to bind it to OpenGL with the single call:
+
+ rmt_BindOpenGL();
+
+Sampling is then a simple case of:
+
+ // Explicit begin/end for C
+ {
+ rmt_BeginOpenGLSample(UnscopedSample);
+ // ... OpenGL code ...
+ rmt_EndOpenGLSample();
+ }
+
+ // Scoped begin/end for C++
+ {
+ rmt_ScopedOpenGLSample(ScopedSample);
+ // ... OpenGL code ...
+ }
+
+Support for multiple contexts can be added pretty easily if there is demand for the feature. When you shutdown
+your OpenGL device and context, ensure you notify Remotery before shutting down Remotery itself:
+
+ rmt_UnbindOpenGL();
+
+
+Applying Configuration Settings
+-------------------------------
+
+Before creating your Remotery instance, you can configure its behaviour by retrieving its settings object:
+
+ rmtSettings* settings = rmt_Settings();
+
+Some important settings are:
+
+ // Redirect any Remotery allocations to your own malloc/free, with an additional context pointer
+ // that gets passed to your callbacks.
+ settings->malloc;
+ settings->free;
+ settings->mm_context;
+
+ // Specify an input handler that receives text input from the Remotery console, with an additional
+ // context pointer that gets passed to your callback.
+ settings->input_handler;
+ settings->input_handler_context;
diff --git a/3rdparty/bgfx/3rdparty/remotery/sample/sample.c b/3rdparty/bgfx/3rdparty/remotery/sample/sample.c
new file mode 100644
index 00000000000..3339fa35f60
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/remotery/sample/sample.c
@@ -0,0 +1,33 @@
+#include <stdlib.h>
+#include <math.h>
+#include "Remotery.h"
+
+double delay() {
+ int i, end;
+ double j = 0;
+
+ rmt_BeginCPUSample(delay);
+ for( i = 0, end = rand()/100; i < end; ++i ) {
+ j += sin(i);
+ }
+ rmt_EndCPUSample();
+ return j;
+}
+
+
+int main( int argc, const char **argv ) {
+ Remotery *rmt;
+
+ if( RMT_ERROR_NONE != rmt_CreateGlobalInstance(&rmt) ) {
+ return -1;
+ }
+
+ for(;;) {
+ rmt_LogText("start profiling");
+ delay();
+ rmt_LogText("end profiling");
+ }
+
+ rmt_DestroyGlobalInstance(rmt);
+ return 0;
+}
diff --git a/3rdparty/bgfx/3rdparty/remotery/screenshot.png b/3rdparty/bgfx/3rdparty/remotery/screenshot.png
new file mode 100644
index 00000000000..62e044e158f
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/remotery/screenshot.png
Binary files differ
diff --git a/3rdparty/bgfx/3rdparty/remotery/vis/Code/Console.js b/3rdparty/bgfx/3rdparty/remotery/vis/Code/Console.js
new file mode 100644
index 00000000000..06f5e55a8cc
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/remotery/vis/Code/Console.js
@@ -0,0 +1,117 @@
+
+Console = (function()
+{
+ var BORDER = 10;
+ var HEIGHT = 200;
+
+
+ function Console(wm, server)
+ {
+ // Create the window and its controls
+ this.Window = wm.AddWindow("Console", 10, 10, 100, 100);
+ this.PageContainer = this.Window.AddControlNew(new WM.Container(10, 10, 400, 160));
+ DOM.Node.AddClass(this.PageContainer.Node, "ConsoleText");
+ this.AppContainer = this.Window.AddControlNew(new WM.Container(10, 10, 400, 160));
+ DOM.Node.AddClass(this.AppContainer.Node, "ConsoleText");
+ this.UserInput = this.Window.AddControlNew(new WM.EditBox(10, 5, 400, 30, "Input", ""));
+ this.UserInput.SetChangeHandler(Bind(ProcessInput, this));
+ this.Window.ShowNoAnim();
+
+ // This accumulates log text as fast as is required
+ this.PageTextBuffer = "";
+ this.AppTextBuffer = "";
+
+ // At a much lower frequency this will update the console window
+ window.setInterval(Bind(UpdateHTML, this), 500);
+
+ // Setup log requests from the server
+ this.Server = server;
+ server.SetConsole(this);
+ server.AddMessageHandler("LOG", Bind(OnLog, this));
+ }
+
+
+ Console.prototype.Log = function(text)
+ {
+ this.PageTextBuffer = LogText(this.PageTextBuffer, text);
+ }
+
+
+ Console.prototype.WindowResized = function(width, height)
+ {
+ // Place window
+ this.Window.SetPosition(BORDER, height - BORDER - 200);
+ this.Window.SetSize(width - 2 * BORDER, HEIGHT);
+
+ // Place controls
+ var parent_size = this.Window.Size;
+ var mid_w = parent_size[0] / 3;
+ this.UserInput.SetPosition(BORDER, parent_size[1] - 2 * BORDER - 30);
+ this.UserInput.SetSize(parent_size[0] - 100, 18);
+ var output_height = this.UserInput.Position[1] - 2 * BORDER;
+ this.PageContainer.SetPosition(BORDER, BORDER);
+ this.PageContainer.SetSize(mid_w - 2 * BORDER, output_height);
+ this.AppContainer.SetPosition(mid_w, BORDER);
+ this.AppContainer.SetSize(parent_size[0] - mid_w - BORDER, output_height);
+ }
+
+
+ function OnLog(self, socket, message)
+ {
+ self.AppTextBuffer = LogText(self.AppTextBuffer, message.text);
+ }
+
+
+ function LogText(existing_text, new_text)
+ {
+ // Filter the text a little to make it safer
+ if (new_text == null)
+ new_text = "NULL";
+
+ // Find and convert any HTML entities, ensuring the browser doesn't parse any embedded HTML code
+ // This also allows the log to contain arbitrary C++ code (e.g. assert comparison operators)
+ new_text = Convert.string_to_html_entities(new_text);
+
+ // Prefix date and end with new line
+ var d = new Date();
+ new_text = "[" + d.toLocaleTimeString() + "] " + new_text + "<br>";
+
+ // Append to local text buffer and ensure clip the oldest text to ensure a max size
+ existing_text = existing_text + new_text;
+ var max_len = 10 * 1024;
+ var len = existing_text.length;
+ if (len > max_len)
+ existing_text = existing_text.substr(len - max_len, max_len);
+
+ return existing_text;
+ }
+
+
+ function UpdateHTML(self)
+ {
+ // Reset the current text buffer as html
+
+ var page_node = self.PageContainer.Node;
+ page_node.innerHTML = self.PageTextBuffer;
+ page_node.scrollTop = page_node.scrollHeight;
+
+ var app_node = self.AppContainer.Node;
+ app_node.innerHTML = self.AppTextBuffer;
+ app_node.scrollTop = app_node.scrollHeight;
+ }
+
+
+ function ProcessInput(self, node)
+ {
+ // Send the message exactly
+ var msg = node.value;
+ self.Server.Send("CONI" + msg);
+
+ // Emit to console and clear
+ self.Log("> " + msg);
+ self.UserInput.SetValue("");
+ }
+
+
+ return Console;
+})();
diff --git a/3rdparty/bgfx/3rdparty/remotery/vis/Code/PixelTimeRange.js b/3rdparty/bgfx/3rdparty/remotery/vis/Code/PixelTimeRange.js
new file mode 100644
index 00000000000..14a06683b3b
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/remotery/vis/Code/PixelTimeRange.js
@@ -0,0 +1,61 @@
+
+
+PixelTimeRange = (function()
+{
+ function PixelTimeRange(start_us, span_us, span_px)
+ {
+ this.Span_px = span_px;
+ this.Set(start_us, span_us);
+ }
+
+
+ PixelTimeRange.prototype.Set = function(start_us, span_us)
+ {
+ this.Start_us = start_us;
+ this.Span_us = span_us;
+ this.End_us = this.Start_us + span_us;
+ this.usPerPixel = this.Span_px / this.Span_us;
+ }
+
+
+ PixelTimeRange.prototype.SetStart = function(start_us)
+ {
+ this.Start_us = start_us;
+ this.End_us = start_us + this.Span_us;
+ }
+
+
+ PixelTimeRange.prototype.SetEnd = function(end_us)
+ {
+ this.End_us = end_us;
+ this.Start_us = end_us - this.Span_us;
+ }
+
+
+ PixelTimeRange.prototype.SetPixelSpan = function(span_px)
+ {
+ this.Span_px = span_px;
+ this.usPerPixel = this.Span_px / this.Span_us;
+ }
+
+
+ PixelTimeRange.prototype.PixelOffset = function(time_us)
+ {
+ return Math.floor((time_us - this.Start_us) * this.usPerPixel);
+ }
+
+
+ PixelTimeRange.prototype.PixelSize = function(time_us)
+ {
+ return Math.floor(time_us * this.usPerPixel);
+ }
+
+
+ PixelTimeRange.prototype.Clone = function()
+ {
+ return new PixelTimeRange(this.Start_us, this.Span_us, this.Span_px);
+ }
+
+
+ return PixelTimeRange;
+})();
diff --git a/3rdparty/bgfx/3rdparty/remotery/vis/Code/Remotery.js b/3rdparty/bgfx/3rdparty/remotery/vis/Code/Remotery.js
new file mode 100644
index 00000000000..31fe09dc239
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/remotery/vis/Code/Remotery.js
@@ -0,0 +1,234 @@
+
+//
+// TODO: Window resizing needs finer-grain control
+// TODO: Take into account where user has moved the windows
+// TODO: Controls need automatic resizing within their parent windows
+//
+
+
+Settings = (function()
+{
+ function Settings()
+ {
+ this.IsPaused = false;
+ }
+
+ return Settings;
+
+})();
+
+
+Remotery = (function()
+{
+ function Remotery()
+ {
+ this.WindowManager = new WM.WindowManager();
+ this.Settings = new Settings();
+
+ this.ConnectionAddress = LocalStore.Get("App", "Global", "ConnectionAddress", "ws://127.0.0.1:17815/rmt");
+ this.Server = new WebSocketConnection();
+ this.Server.AddConnectHandler(Bind(OnConnect, this));
+
+ // Create the console up front as everything reports to it
+ this.Console = new Console(this.WindowManager, this.Server);
+
+ // Create required windows
+ this.TitleWindow = new TitleWindow(this.WindowManager, this.Settings, this.Server, this.ConnectionAddress);
+ this.TitleWindow.SetConnectionAddressChanged(Bind(OnAddressChanged, this));
+ this.TimelineWindow = new TimelineWindow(this.WindowManager, this.Settings, this.Server, Bind(OnTimelineCheck, this));
+ this.TimelineWindow.SetOnHover(Bind(OnSampleHover, this));
+ this.TimelineWindow.SetOnSelected(Bind(OnSampleSelected, this));
+
+ this.NbSampleWindows = 0;
+ this.SampleWindows = { };
+ this.FrameHistory = { };
+ this.SelectedFrames = { };
+
+ this.Server.AddMessageHandler("SAMPLES", Bind(OnSamples, this));
+
+ // Kick-off the auto-connect loop
+ AutoConnect(this);
+
+ // Hook up resize event handler
+ DOM.Event.AddHandler(window, "resize", Bind(OnResizeWindow, this));
+ OnResizeWindow(this);
+
+ // Hook up browser-native canvas refresh
+ this.DisplayFrame = 0;
+ this.LastKnownPause = this.Settings.IsPaused;
+ var self = this;
+ (function display_loop()
+ {
+ window.requestAnimationFrame(display_loop);
+ DrawTimeline(self);
+ })();
+ }
+
+
+ function AutoConnect(self)
+ {
+ // Only attempt to connect if there isn't already a connection or an attempt to connect
+ if (!self.Server.Connected())
+ self.Server.Connect(self.ConnectionAddress);
+
+ // Always schedule another check
+ window.setTimeout(Bind(AutoConnect, self), 2000);
+ }
+
+
+ function OnConnect(self)
+ {
+ // Connection address has been validated
+ LocalStore.Set("App", "Global", "ConnectionAddress", self.ConnectionAddress);
+
+ self.TimelineWindow.ResetTimeRange();
+ self.FrameHistory = { };
+ self.SelectedFrames = { };
+ }
+
+
+ function OnAddressChanged(self, node)
+ {
+ // Update and disconnect, relying on auto-connect to reconnect
+ self.ConnectionAddress = node.value;
+ self.Server.Disconnect();
+ }
+
+
+ function DrawTimeline(self)
+ {
+ // Has pause state changed?
+ if (self.Settings.IsPaused != self.LastKnownPaused)
+ {
+ // When switching TO paused, draw one last frame to ensure the sample text gets drawn
+ self.LastKnownPaused = self.Settings.IsPaused;
+ self.TimelineWindow.DrawAllRows();
+ return;
+ }
+
+ // Don't waste time drawing the timeline when paused
+ if (self.Settings.IsPaused)
+ return;
+
+ // requestAnimationFrame can run up to 60hz which is way too much for drawing the timeline
+ // Assume it's running at 60hz and skip frames to achieve 10hz instead
+ // Doing this instead of using setTimeout because it's better for browser rendering (or; will be once WebGL is in use)
+ if ((self.DisplayFrame % 10) == 0)
+ self.TimelineWindow.DrawAllRows();
+
+ self.DisplayFrame++;
+ }
+
+
+ function OnSamples(self, socket, message)
+ {
+ var name = message.thread_name;
+
+ // Discard any new samples while paused
+ if (self.Settings.IsPaused)
+ return;
+
+ // Add to frame history for this thread
+ var thread_frame = new ThreadFrame(message);
+ if (!(name in self.FrameHistory))
+ self.FrameHistory[name] = [ ];
+ var frame_history = self.FrameHistory[name];
+ frame_history.push(thread_frame);
+
+ // Discard old frames to keep memory-use constant
+ var max_nb_frames = 10000;
+ var extra_frames = frame_history.length - max_nb_frames;
+ if (extra_frames > 0)
+ frame_history.splice(0, extra_frames);
+
+ // Create sample windows on-demand
+ if (!(name in self.SampleWindows))
+ {
+ self.SampleWindows[name] = new SampleWindow(self.WindowManager, name, self.NbSampleWindows);
+ self.SampleWindows[name].WindowResized(self.TimelineWindow.Window, self.Console.Window);
+ self.NbSampleWindows++;
+ MoveSampleWindows(this);
+ }
+
+ // Set on the window and timeline
+ self.SampleWindows[name].OnSamples(message.nb_samples, message.sample_digest, message.samples);
+ self.TimelineWindow.OnSamples(name, frame_history);
+ }
+
+
+ function OnTimelineCheck(self, name, evt)
+ {
+ // Show/hide the equivalent sample window and move all the others to occupy any left-over space
+ var target = DOM.Event.GetNode(evt);
+ self.SampleWindows[name].SetVisible(target.checked);
+ MoveSampleWindows(self);
+ }
+
+
+ function MoveSampleWindows(self)
+ {
+ // Stack all windows next to each other
+ var xpos = 0;
+ for (var i in self.SampleWindows)
+ {
+ var sample_window = self.SampleWindows[i];
+ if (sample_window.Visible)
+ sample_window.SetXPos(xpos++, self.TimelineWindow.Window, self.Console.Window);
+ }
+ }
+
+
+ function OnSampleHover(self, thread_name, hover)
+ {
+ // Hover only changes sample window contents when paused
+ var sample_window = self.SampleWindows[thread_name];
+ if (sample_window && self.Settings.IsPaused)
+ {
+ if (hover == null)
+ {
+ // When there's no hover, go back to the selected frame
+ if (self.SelectedFrames[thread_name])
+ {
+ var frame = self.SelectedFrames[thread_name];
+ sample_window.OnSamples(frame.NbSamples, frame.SampleDigest, frame.Samples);
+ }
+ }
+
+ else
+ {
+ // Populate with sample under hover
+ var frame = hover[0];
+ sample_window.OnSamples(frame.NbSamples, frame.SampleDigest, frame.Samples);
+ }
+ }
+ }
+
+
+ function OnSampleSelected(self, thread_name, select)
+ {
+ // Lookup sample window set the frame samples on it
+ if (select && thread_name in self.SampleWindows)
+ {
+ var sample_window = self.SampleWindows[thread_name];
+ var frame = select[0];
+ self.SelectedFrames[thread_name] = frame;
+ sample_window.OnSamples(frame.NbSamples, frame.SampleDigest, frame.Samples);
+ }
+ }
+
+
+ function OnResizeWindow(self)
+ {
+ // Resize windows
+ var w = window.innerWidth;
+ var h = window.innerHeight;
+ self.Console.WindowResized(w, h);
+ self.TitleWindow.WindowResized(w, h);
+ self.TimelineWindow.WindowResized(w, h, self.TitleWindow.Window);
+ for (var i in self.SampleWindows)
+ self.SampleWindows[i].WindowResized(self.TimelineWindow.Window, self.Console.Window);
+ }
+
+
+ return Remotery;
+})(); \ No newline at end of file
diff --git a/3rdparty/bgfx/3rdparty/remotery/vis/Code/SampleWindow.js b/3rdparty/bgfx/3rdparty/remotery/vis/Code/SampleWindow.js
new file mode 100644
index 00000000000..7d7fa6cf551
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/remotery/vis/Code/SampleWindow.js
@@ -0,0 +1,164 @@
+
+SampleWindow = (function()
+{
+ function SampleWindow(wm, name, offset)
+ {
+ // Sample digest for checking if grid needs to be repopulated
+ this.NbSamples = 0;
+ this.SampleDigest = null;
+
+ this.XPos = 10 + offset * 410;
+ this.Window = wm.AddWindow(name, 100, 100, 100, 100);
+ this.Window.Show();
+ this.Visible = true;
+
+ // Create a grid that's indexed by the unique sample ID
+ this.Grid = this.Window.AddControlNew(new WM.Grid(0, 0, 380, 400));
+ this.RootRow = this.Grid.Rows.Add({ "Name": "Samples" }, "GridGroup", { "Name": "GridGroup" });
+ this.RootRow.Rows.AddIndex("_ID");
+ }
+
+
+ SampleWindow.prototype.SetXPos = function(xpos, top_window, bottom_window)
+ {
+ Anim.Animate(
+ Bind(AnimatedMove, this, top_window, bottom_window),
+ this.XPos, 10 + xpos * 410, 0.25);
+ }
+
+
+ function AnimatedMove(self, top_window, bottom_window, val)
+ {
+ self.XPos = val;
+ self.WindowResized(top_window, bottom_window);
+ }
+
+
+ SampleWindow.prototype.SetVisible = function(visible)
+ {
+ if (visible != this.Visible)
+ {
+ if (visible == true)
+ this.Window.Show();
+ else
+ this.Window.Hide();
+
+ this.Visible = visible;
+ }
+ }
+
+
+ SampleWindow.prototype.WindowResized = function(top_window, bottom_window)
+ {
+ var top = top_window.Position[1] + top_window.Size[1] + 10;
+ this.Window.SetPosition(this.XPos, top_window.Position[1] + top_window.Size[1] + 10);
+ this.Window.SetSize(400, bottom_window.Position[1] - 10 - top);
+ }
+
+
+ SampleWindow.prototype.OnSamples = function(nb_samples, sample_digest, samples)
+ {
+ if (!this.Visible)
+ return;
+
+ // Recreate all the HTML if the number of samples gets bigger
+ if (nb_samples > this.NbSamples)
+ {
+ GrowGrid(this.RootRow, nb_samples);
+ this.NbSamples = nb_samples;
+ }
+
+ // If the content of the samples changes from previous update, update them all
+ if (this.SampleDigest != sample_digest)
+ {
+ this.RootRow.Rows.ClearIndex("_ID");
+ var index = UpdateSamples(this.RootRow, samples, 0, "");
+ this.SampleDigest = sample_digest;
+
+ // Clear out any left-over rows
+ for (var i = index; i < this.RootRow.Rows.Rows.length; i++)
+ {
+ var row = this.RootRow.Rows.Rows[i];
+ DOM.Node.Hide(row.Node);
+ }
+ }
+
+ else if (this.Visible)
+ {
+ // Otherwise just update the existing sample times
+ UpdateSampleTimes(this.RootRow, samples);
+ }
+ }
+
+
+ function GrowGrid(parent_row, nb_samples)
+ {
+ parent_row.Rows.Clear();
+
+ for (var i = 0; i < nb_samples; i++)
+ {
+ var cell_data =
+ {
+ _ID: i,
+ Name: "",
+ Control: new WM.Label()
+ };
+
+ var cell_classes =
+ {
+ Name: "SampleNameCell",
+ };
+
+ parent_row.Rows.Add(cell_data, null, cell_classes);
+ }
+ }
+
+
+ function UpdateSamples(parent_row, samples, index, indent)
+ {
+ for (var i in samples)
+ {
+ var sample = samples[i];
+
+ // Match row allocation in GrowGrid
+ var row = parent_row.Rows.Rows[index++];
+
+ // Sample row may have been hidden previously
+ DOM.Node.Show(row.Node);
+
+ // Assign unique ID so that the common fast path of updating sample times only
+ // can lookup target samples in the grid
+ row.CellData._ID = sample.id;
+ parent_row.Rows.AddRowToIndex("_ID", sample.id, row);
+
+ // Set sample name and colour
+ var name_node = row.CellNodes["Name"];
+ name_node.innerHTML = indent + sample.name;
+ DOM.Node.SetColour(name_node, sample.colour);
+
+ row.CellData.Control.SetText(sample.us_length);
+
+ index = UpdateSamples(parent_row, sample.children, index, indent + "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;");
+ }
+
+ return index;
+ }
+
+
+ function UpdateSampleTimes(parent_row, samples)
+ {
+ for (var i in samples)
+ {
+ var sample = samples[i];
+
+ var row = parent_row.Rows.GetBy("_ID", sample.id);
+ if (row)
+ row.CellData.Control.SetText(sample.us_length);
+
+ UpdateSampleTimes(parent_row, sample.children);
+ }
+ }
+
+
+ return SampleWindow;
+})(); \ No newline at end of file
diff --git a/3rdparty/bgfx/3rdparty/remotery/vis/Code/ThreadFrame.js b/3rdparty/bgfx/3rdparty/remotery/vis/Code/ThreadFrame.js
new file mode 100644
index 00000000000..a631590c666
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/remotery/vis/Code/ThreadFrame.js
@@ -0,0 +1,28 @@
+
+
+ThreadFrame = (function()
+{
+ function ThreadFrame(message)
+ {
+ // Persist the required message data
+ this.NbSamples = message.nb_samples;
+ this.SampleDigest = message.sample_digest;
+ this.Samples = message.samples;
+
+ // Calculate the frame start/end times
+ this.StartTime_us = 0;
+ this.EndTime_us = 0;
+ var nb_root_samples = this.Samples.length;
+ if (nb_root_samples > 0)
+ {
+ var last_sample = this.Samples[nb_root_samples - 1];
+ this.StartTime_us = this.Samples[0].us_start;
+ this.EndTime_us = last_sample.us_start + last_sample.us_length;
+ }
+
+ this.Length_us = this.EndTime_us - this.StartTime_us;
+ }
+
+
+ return ThreadFrame;
+})();
diff --git a/3rdparty/bgfx/3rdparty/remotery/vis/Code/TimelineRow.js b/3rdparty/bgfx/3rdparty/remotery/vis/Code/TimelineRow.js
new file mode 100644
index 00000000000..40af0430329
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/remotery/vis/Code/TimelineRow.js
@@ -0,0 +1,375 @@
+
+
+TimelineRow = (function()
+{
+ var row_template = function(){/*
+ <div class='TimelineRow'>
+ <div class='TimelineRowCheck TimelineBox'>
+ <input class='TimelineRowCheckbox' type='checkbox' />
+ </div>
+ <div class='TimelineRowExpand TimelineBox NoSelect'>
+ <div class='TimelineRowExpandButton'>+</div>
+ </div>
+ <div class='TimelineRowExpand TimelineBox NoSelect'>
+ <div class='TimelineRowExpandButton'>-</div>
+ </div>
+ <div class='TimelineRowLabel TimelineBox'></div>
+ <canvas class='TimelineRowCanvas'></canvas>
+ <div style="clear:left"></div>
+ </div>
+*/}.toString().split(/\n/).slice(1, -1).join("\n");
+
+
+ var CANVAS_Y_OFFSET = 0;
+ var CANVAS_BORDER = 1;
+ var SAMPLE_HEIGHT = 16;
+ var SAMPLE_BORDER = 1;
+ var SAMPLE_Y_SPACING = SAMPLE_HEIGHT + SAMPLE_BORDER * 2;
+ var SAMPLE_Y_OFFSET = CANVAS_Y_OFFSET + CANVAS_BORDER + 1;
+
+
+ function TimelineRow(name, width, parent_node, frame_history, check_handler)
+ {
+ this.Name = name;
+
+ // Create the row HTML and add to the parent
+ this.ContainerNode = DOM.Node.CreateHTML(row_template);
+ this.Node = DOM.Node.FindWithClass(this.ContainerNode, "TimelineRowData");
+ this.LabelNode = DOM.Node.FindWithClass(this.ContainerNode, "TimelineRowLabel");
+ this.LabelNode.innerHTML = name;
+ this.CheckboxNode = DOM.Node.FindWithClass(this.ContainerNode, "TimelineRowCheckbox");
+ var expand_node_0 = DOM.Node.FindWithClass(this.ContainerNode, "TimelineRowExpand", 0);
+ var expand_node_1 = DOM.Node.FindWithClass(this.ContainerNode, "TimelineRowExpand", 1);
+ this.IncNode = DOM.Node.FindWithClass(expand_node_0, "TimelineRowExpandButton");
+ this.DecNode = DOM.Node.FindWithClass(expand_node_1, "TimelineRowExpandButton");
+ this.CanvasNode = DOM.Node.FindWithClass(this.ContainerNode, "TimelineRowCanvas");
+ parent_node.appendChild(this.ContainerNode);
+
+ // All sample view windows visible by default
+ this.CheckboxNode.checked = true;
+ DOM.Event.AddHandler(this.CheckboxNode, "change", function(evt) { check_handler(name, evt); });
+
+ // Manually hook-up events to simulate div:active
+ // I can't get the equivalent CSS to work in Firefox, so...
+ DOM.Event.AddHandler(this.IncNode, "mousedown", ExpandButtonDown);
+ DOM.Event.AddHandler(this.IncNode, "mouseup", ExpandButtonUp);
+ DOM.Event.AddHandler(this.IncNode, "mouseleave", ExpandButtonUp);
+ DOM.Event.AddHandler(this.DecNode, "mousedown", ExpandButtonDown);
+ DOM.Event.AddHandler(this.DecNode, "mouseup", ExpandButtonUp);
+ DOM.Event.AddHandler(this.DecNode, "mouseleave", ExpandButtonUp);
+
+ // Pressing +/i increases/decreases depth
+ DOM.Event.AddHandler(this.IncNode, "click", Bind(IncDepth, this));
+ DOM.Event.AddHandler(this.DecNode, "click", Bind(DecDepth, this));
+
+ // Setup the canvas
+ this.Depth = 1;
+ this.Ctx = this.CanvasNode.getContext("2d");
+ this.SetSize(width);
+ this.Clear();
+
+ // Frame index to start at when looking for first visible sample
+ this.StartFrameIndex = 0;
+
+ this.FrameHistory = frame_history;
+ this.VisibleFrames = [ ];
+ this.VisibleTimeRange = null;
+
+ // Sample the mouse is currently hovering over
+ this.HoverSample = null;
+ this.HoverSampleDepth = 0;
+
+ // Currently selected sample
+ this.SelectedSample = null;
+ this.SelectedSampleDepth = 0;
+ }
+
+
+ TimelineRow.prototype.SetSize = function(width)
+ {
+ // Must ALWAYS set the width/height properties together. Setting one on its own has weird side-effects.
+ this.CanvasNode.width = width;
+ this.CanvasNode.height = CANVAS_BORDER + SAMPLE_BORDER + SAMPLE_Y_SPACING * this.Depth;
+ this.Draw(true);
+ }
+
+
+ TimelineRow.prototype.Clear = function()
+ {
+ // Fill box that shows the boundary between thread rows
+ this.Ctx.fillStyle = "#666"
+ var b = CANVAS_BORDER;
+ this.Ctx.fillRect(b, b, this.CanvasNode.width - b * 2, this.CanvasNode.height - b * 2);
+ }
+
+
+ TimelineRow.prototype.SetVisibleFrames = function(time_range)
+ {
+ // Clear previous visible list
+ this.VisibleFrames = [ ];
+ if (this.FrameHistory.length == 0)
+ return;
+
+ // Store a copy of the visible time range rather than referencing it
+ // This prevents external modifications to the time range from affecting rendering/selection
+ time_range = time_range.Clone();
+ this.VisibleTimeRange = time_range;
+
+ // The frame history can be reset outside this class
+ // This also catches the overflow to the end of the frame list below when a thread stops sending samples
+ var max_frame = Math.max(this.FrameHistory.length - 1, 0);
+ var start_frame_index = Math.min(this.StartFrameIndex, max_frame);
+
+ // First do a back-track in case the time range moves negatively
+ while (start_frame_index > 0)
+ {
+ var frame = this.FrameHistory[start_frame_index];
+ if (time_range.Start_us > frame.StartTime_us)
+ break;
+ start_frame_index--;
+ }
+
+ // Then search from this point for the first visible frame
+ while (start_frame_index < this.FrameHistory.length)
+ {
+ var frame = this.FrameHistory[start_frame_index];
+ if (frame.EndTime_us > time_range.Start_us)
+ break;
+ start_frame_index++;
+ }
+
+ // Gather all frames up to the end point
+ this.StartFrameIndex = start_frame_index;
+ for (var i = start_frame_index; i < this.FrameHistory.length; i++)
+ {
+ var frame = this.FrameHistory[i];
+ if (frame.StartTime_us > time_range.End_us)
+ break;
+ this.VisibleFrames.push(frame);
+ }
+ }
+
+
+ TimelineRow.prototype.Draw = function(draw_text)
+ {
+ this.Clear();
+
+ // Draw all root samples in the visible frame set
+ for (var i in this.VisibleFrames)
+ {
+ var frame = this.VisibleFrames[i];
+ DrawSamples(this, frame.Samples, 1, draw_text);
+ }
+ }
+
+
+ function DrawSamples(self, samples, depth, draw_text)
+ {
+ for (var i in samples)
+ {
+ var sample = samples[i];
+ DrawSample(self, sample, depth, draw_text);
+
+ if (depth < self.Depth && sample.children != null)
+ DrawSamples(self, sample.children, depth + 1, draw_text);
+ }
+ }
+
+
+ TimelineRow.prototype.UpdateHoverSample = function(mouse_state, x_offset)
+ {
+ var hover = GetSampleAtPosition(this, mouse_state, x_offset);
+ if (hover)
+ this.SetHoverSample(hover[1], hover[2]);
+ return hover;
+ }
+
+
+ TimelineRow.prototype.UpdateSelectedSample = function(mouse_state, x_offset)
+ {
+ var select = GetSampleAtPosition(this, mouse_state, x_offset);
+ if (select)
+ this.SetSelectedSample(select[1], select[2]);
+ return select;
+ }
+
+
+ TimelineRow.prototype.SetHoverSample = function(sample, sample_depth)
+ {
+ if (sample != this.HoverSample)
+ {
+ // Discard old highlight
+ // TODO: When zoomed right out, tiny samples are anti-aliased and this becomes inaccurate
+ var old_sample = this.HoverSample;
+ var old_sample_depth = this.HoverSampleDepth;
+ this.HoverSample = null;
+ this.HoverSampleDepth = 0;
+ DrawSample(this, old_sample, old_sample_depth, true);
+
+ // Add new highlight
+ this.HoverSample = sample;
+ this.HoverSampleDepth = sample_depth;
+ DrawSample(this, sample, sample_depth, true);
+ }
+ }
+
+
+ TimelineRow.prototype.SetSelectedSample = function(sample, sample_depth)
+ {
+ if (sample != this.SelectedSample)
+ {
+ // Discard old highlight
+ // TODO: When zoomed right out, tiny samples are anti-aliased and this becomes inaccurate
+ var old_sample = this.SelectedSample;
+ var old_sample_depth = this.SelectedSampleDepth;
+ this.SelectedSample = null;
+ this.SelectedSampleDepth = 0;
+ DrawSample(this, old_sample, old_sample_depth, true);
+
+ // Add new highlight
+ this.SelectedSample = sample;
+ this.SelectedSampleDepth = sample_depth;
+ DrawSample(this, sample, sample_depth, true);
+ }
+ }
+
+
+ function ExpandButtonDown(evt)
+ {
+ var node = DOM.Event.GetNode(evt);
+ DOM.Node.AddClass(node, "TimelineRowExpandButtonActive");
+ }
+
+
+ function ExpandButtonUp(evt)
+ {
+ var node = DOM.Event.GetNode(evt);
+ DOM.Node.RemoveClass(node, "TimelineRowExpandButtonActive");
+ }
+
+
+ function IncDepth(self)
+ {
+ self.Depth++;
+ self.SetSize(self.CanvasNode.width);
+ }
+
+
+ function DecDepth(self)
+ {
+ if (self.Depth > 1)
+ {
+ self.Depth--;
+ self.SetSize(self.CanvasNode.width);
+ }
+ }
+
+
+ function GetSampleAtPosition(self, mouse_state, x_offset)
+ {
+ // Mouse movement can occur before any data is sent to a timeline row
+ var time_range = self.VisibleTimeRange;
+ if (time_range == null)
+ return;
+
+ // Get the time the mouse is over
+ var x = mouse_state.Position[0] - x_offset;
+ var time_us = time_range.Start_us + x / time_range.usPerPixel;
+
+ var canvas_y_offset = DOM.Node.GetPosition(self.CanvasNode)[1];
+ var mouse_y_offset = mouse_state.Position[1] - canvas_y_offset;
+ mouse_y_offset = Math.min(Math.max(mouse_y_offset, 0), self.CanvasNode.height);
+ var depth = Math.floor(mouse_y_offset / SAMPLE_Y_SPACING) + 1;
+
+ // Search for the first frame to intersect this time
+ for (var i in self.VisibleFrames)
+ {
+ var frame = self.VisibleFrames[i];
+ if (time_us >= frame.StartTime_us && time_us < frame.EndTime_us)
+ {
+ var found_sample = FindSample(self, frame.Samples, time_us, depth, 1);
+ if (found_sample != null)
+ return [ frame, found_sample[0], found_sample[1] ];
+ }
+ }
+
+ return null;
+ }
+
+
+ function FindSample(self, samples, time_us, target_depth, depth)
+ {
+ for (var i in samples)
+ {
+ var sample = samples[i];
+ if (depth == target_depth)
+ {
+ if (time_us >= sample.us_start && time_us < sample.us_start + sample.us_length)
+ return [ sample, depth ];
+ }
+
+ else if (depth < target_depth && sample.children != null)
+ {
+ var found_sample = FindSample(self, sample.children, time_us, target_depth, depth + 1);
+ if (found_sample != null)
+ return found_sample;
+ }
+ }
+
+ return null;
+ }
+
+
+ function DrawSample(self, sample, depth, draw_text)
+ {
+ if (sample == null)
+ return;
+
+ // Determine pixel range of the sample
+ var time_range = self.VisibleTimeRange;
+ var x0 = time_range.PixelOffset(sample.us_start);
+ var x1 = x0 + time_range.PixelSize(sample.us_length);
+
+ // Clip to padded timeline row
+ var min_x = 3;
+ var max_x = self.CanvasNode.width - 5;
+ x0 = Math.min(Math.max(x0, min_x), max_x);
+ x1 = Math.min(Math.max(x1, min_x), max_x);
+
+ var offset_x = x0;
+ var offset_y = SAMPLE_Y_OFFSET + (depth - 1) * SAMPLE_Y_SPACING;
+ var size_x = x1 - x0;
+ var size_y = SAMPLE_HEIGHT;
+
+ // Normal rendering
+ var ctx = self.Ctx;
+ ctx.fillStyle = sample.colour;
+ ctx.fillRect(offset_x, offset_y, size_x, size_y);
+
+ // Highlight rendering
+ var b = (sample == self.HoverSample) ? 255 : 0;
+ var r = (sample == self.SelectedSample) ? 255 : 0;
+ if (b + r > 0)
+ {
+ ctx.lineWidth = 1;
+ ctx.strokeStyle = "rgb(" + r + ", 0, " + b + ")";
+ ctx.strokeRect(offset_x + 0.5, offset_y + 0.5, size_x - 1, size_y - 1);
+ }
+
+ // Draw sample names clipped to the bounds of the sample
+ if (draw_text)
+ {
+ ctx.save();
+ ctx.beginPath();
+ ctx.rect(offset_x + 2.5, offset_y + 1.5, size_x - 5, size_y - 3);
+ ctx.clip();
+ ctx.font = "9px verdana";
+ ctx.fillStyle = "black";
+ ctx.fillText(sample.name, offset_x + 5.5, offset_y + 1.5 + 9);
+ ctx.restore();
+ }
+ }
+
+
+ return TimelineRow;
+})();
diff --git a/3rdparty/bgfx/3rdparty/remotery/vis/Code/TimelineWindow.js b/3rdparty/bgfx/3rdparty/remotery/vis/Code/TimelineWindow.js
new file mode 100644
index 00000000000..06479b7d40b
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/remotery/vis/Code/TimelineWindow.js
@@ -0,0 +1,270 @@
+
+//
+// TODO: Use WebGL and instancing for quicker renders
+//
+
+
+TimelineWindow = (function()
+{
+ var BORDER = 10;
+
+ var ROW_START_SIZE = 210;
+
+ var ROW_END_SIZE = 20; // make room for scrollbar
+
+ var box_template = "<div class='TimelineBox'></div>";
+
+
+ function TimelineWindow(wm, settings, server, check_handler)
+ {
+ this.Settings = settings;
+
+ // Ordered list of thread rows on the timeline
+ this.ThreadRows = [ ];
+
+ // Create window and containers
+ this.Window = wm.AddWindow("Timeline", 10, 20, 100, 100);
+ this.Window.ShowNoAnim();
+ this.TimelineContainer = this.Window.AddControlNew(new WM.Container(10, 10, 800, 160));
+ DOM.Node.AddClass(this.TimelineContainer.Node, "TimelineContainer");
+
+ var mouse_wheel_event = (/Firefox/i.test(navigator.userAgent)) ? "DOMMouseScroll" : "mousewheel";
+ DOM.Event.AddHandler(this.TimelineContainer.Node, mouse_wheel_event, Bind(OnMouseScroll, this));
+
+ // Setup timeline manipulation
+ this.MouseDown = false;
+ this.TimelineMoved = false;
+ this.OnHoverHandler = null;
+ this.OnSelectedHandler = null;
+ DOM.Event.AddHandler(this.TimelineContainer.Node, "mousedown", Bind(OnMouseDown, this));
+ DOM.Event.AddHandler(this.TimelineContainer.Node, "mouseup", Bind(OnMouseUp, this));
+ DOM.Event.AddHandler(this.TimelineContainer.Node, "mousemove", Bind(OnMouseMove, this));
+
+ // Set time range AFTER the window has been created, as it uses the window to determine pixel coverage
+ this.TimeRange = new PixelTimeRange(0, 200 * 1000, RowWidth(this));
+
+ this.CheckHandler = check_handler;
+ }
+
+
+ TimelineWindow.prototype.SetOnHover = function(handler)
+ {
+ this.OnHoverHandler = handler;
+ }
+
+
+ TimelineWindow.prototype.SetOnSelected = function(handler)
+ {
+ this.OnSelectedHandler = handler;
+ }
+
+
+ TimelineWindow.prototype.WindowResized = function(width, height, top_window)
+ {
+ // Resize window
+ var top = top_window.Position[1] + top_window.Size[1] + 10;
+ this.Window.SetPosition(10, top);
+ this.Window.SetSize(width - 2 * 10, 200);
+
+ // Resize controls
+ var parent_size = this.Window.Size;
+ this.TimelineContainer.SetPosition(BORDER, 10);
+ this.TimelineContainer.SetSize(parent_size[0] - 2 * BORDER, 160);
+
+ // Resize rows
+ var row_width = RowWidth(this);
+ for (var i in this.ThreadRows)
+ {
+ var row = this.ThreadRows[i];
+ row.SetSize(row_width);
+ }
+
+ // Adjust time range to new width
+ this.TimeRange.SetPixelSpan(row_width);
+ this.DrawAllRows();
+ }
+
+
+ TimelineWindow.prototype.ResetTimeRange = function()
+ {
+ this.TimeRange.SetStart(0);
+ }
+
+
+ TimelineWindow.prototype.OnSamples = function(thread_name, frame_history)
+ {
+ // Shift the timeline to the last entry on this thread
+ // As multiple threads come through here with different end frames, only do this for the latest
+ var last_frame = frame_history[frame_history.length - 1];
+ if (last_frame.EndTime_us > this.TimeRange.End_us)
+ this.TimeRange.SetEnd(last_frame.EndTime_us);
+
+ // Search for the index of this thread
+ var thread_index = -1;
+ for (var i in this.ThreadRows)
+ {
+ if (this.ThreadRows[i].Name == thread_name)
+ {
+ thread_index = i;
+ break;
+ }
+ }
+
+ // If this thread has not been seen before, add a new row to the list and re-sort
+ if (thread_index == -1)
+ {
+ var row = new TimelineRow(thread_name, RowWidth(this), this.TimelineContainer.Node, frame_history, this.CheckHandler);
+ this.ThreadRows.push(row);
+ this.ThreadRows.sort(function(a, b) { return b.Name.localeCompare(a.Name); });
+ }
+ }
+
+
+ TimelineWindow.prototype.DrawAllRows = function()
+ {
+ var time_range = this.TimeRange;
+ var draw_text = this.Settings.IsPaused;
+ for (var i in this.ThreadRows)
+ {
+ var thread_row = this.ThreadRows[i];
+ thread_row.SetVisibleFrames(time_range);
+ thread_row.Draw(draw_text);
+ }
+ }
+
+
+ function RowXOffset(self)
+ {
+ // Add sizing of the label
+ // TODO: Use computed size
+ return DOM.Node.GetPosition(self.TimelineContainer.Node)[0] + ROW_START_SIZE;
+ }
+
+
+ function RowWidth(self)
+ {
+ // Subtract sizing of the label
+ // TODO: Use computed size
+ return self.TimelineContainer.Size[0] - (ROW_START_SIZE + ROW_END_SIZE);
+ }
+
+
+ function OnMouseScroll(self, evt)
+ {
+ var mouse_state = new Mouse.State(evt);
+ var scale = 1.11;
+ if (mouse_state.WheelDelta > 0)
+ scale = 1 / scale;
+
+ // What time is the mouse hovering over?
+ var x = mouse_state.Position[0] - RowXOffset(self);
+ var time_us = self.TimeRange.Start_us + x / self.TimeRange.usPerPixel;
+
+ // Calculate start time relative to the mouse hover position
+ var time_start_us = self.TimeRange.Start_us - time_us;
+
+ // Scale and offset back to the hover time
+ self.TimeRange.Set(time_start_us * scale + time_us, self.TimeRange.Span_us * scale);
+ self.DrawAllRows();
+
+ // Prevent vertical scrolling on mouse-wheel
+ DOM.Event.StopDefaultAction(evt);
+ }
+
+
+ function OnMouseDown(self, evt)
+ {
+ // Only manipulate the timelime when paused
+ if (!self.Settings.IsPaused)
+ return;
+
+ self.MouseDown = true;
+ self.TimelineMoved = false;
+ DOM.Event.StopDefaultAction(evt);
+ }
+
+
+ function OnMouseUp(self, evt)
+ {
+ // Only manipulate the timelime when paused
+ if (!self.Settings.IsPaused)
+ return;
+
+ var mouse_state = new Mouse.State(evt);
+
+ self.MouseDown = false;
+
+ if (!self.TimelineMoved)
+ {
+ // Search for the row being clicked and update its selection
+ var row_node = DOM.Event.GetNode(evt);
+ for (var i in self.ThreadRows)
+ {
+ var thread_row = self.ThreadRows[i];
+ if (thread_row.CanvasNode == row_node)
+ {
+ var select = thread_row.UpdateSelectedSample(mouse_state, RowXOffset(self));
+
+ // Call any selection handlers
+ if (self.OnSelectedHandler)
+ self.OnSelectedHandler(thread_row.Name, select);
+
+ break;
+ }
+ }
+ }
+ }
+
+
+ function OnMouseMove(self, evt)
+ {
+ // Only manipulate the timelime when paused
+ if (!self.Settings.IsPaused)
+ return;
+
+ var mouse_state = new Mouse.State(evt);
+
+ if (self.MouseDown)
+ {
+ // Get the time the mouse is over
+ var x = mouse_state.Position[0] - RowXOffset(self);
+ var time_us = self.TimeRange.Start_us + x / self.TimeRange.usPerPixel;
+
+ // Shift the visible time range with mouse movement
+ var time_offset_us = mouse_state.PositionDelta[0] / self.TimeRange.usPerPixel;
+ if (time_offset_us)
+ {
+ self.TimeRange.SetStart(self.TimeRange.Start_us - time_offset_us);
+ self.DrawAllRows();
+ self.TimelineMoved = true;
+ }
+ }
+
+ else
+ {
+ // Highlight any samples the mouse moves over
+ var row_node = DOM.Event.GetNode(evt);
+ for (var i in self.ThreadRows)
+ {
+ var thread_row = self.ThreadRows[i];
+ if (thread_row.CanvasNode == row_node)
+ {
+ var hover = thread_row.UpdateHoverSample(mouse_state, RowXOffset(self));
+
+ if (self.OnHoverHandler)
+ self.OnHoverHandler(thread_row.Name, hover);
+ }
+ else
+ {
+ thread_row.SetHoverSample(null, 0);
+ if (self.OnHoverHandler)
+ self.OnHoverHandler(thread_row.Name, null);
+ }
+ }
+ }
+ }
+
+
+ return TimelineWindow;
+})();
+
diff --git a/3rdparty/bgfx/3rdparty/remotery/vis/Code/TitleWindow.js b/3rdparty/bgfx/3rdparty/remotery/vis/Code/TitleWindow.js
new file mode 100644
index 00000000000..6e197597563
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/remotery/vis/Code/TitleWindow.js
@@ -0,0 +1,59 @@
+
+TitleWindow = (function()
+{
+ function TitleWindow(wm, settings, server, connection_address)
+ {
+ this.Settings = settings;
+
+ this.Window = wm.AddWindow("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Remotery", 10, 10, 100, 100);
+ this.Window.ShowNoAnim();
+
+ this.PingContainer = this.Window.AddControlNew(new WM.Container(4, -13, 10, 10));
+ DOM.Node.AddClass(this.PingContainer.Node, "PingContainer");
+
+ this.EditBox = this.Window.AddControlNew(new WM.EditBox(10, 5, 300, 18, "Connection Address", connection_address));
+
+ // Setup pause button
+ this.PauseButton = this.Window.AddControlNew(new WM.Button("Pause", 5, 5, { toggle: true }));
+ this.PauseButton.SetOnClick(Bind(OnPausePressed, this));
+
+ server.AddMessageHandler("PING", Bind(OnPing, this));
+ }
+
+
+ TitleWindow.prototype.SetConnectionAddressChanged = function(handler)
+ {
+ this.EditBox.SetChangeHandler(handler);
+ }
+
+
+ TitleWindow.prototype.WindowResized = function(width, height)
+ {
+ this.Window.SetSize(width - 2 * 10, 50);
+ this.PauseButton.SetPosition(width - 80, 5);
+ }
+
+
+ function OnPausePressed(self)
+ {
+ self.Settings.IsPaused = self.PauseButton.IsPressed();
+ if (self.Settings.IsPaused)
+ self.PauseButton.SetText("Paused");
+ else
+ self.PauseButton.SetText("Pause");
+ }
+
+
+ function OnPing(self, server)
+ {
+ // Set the ping container as active and take it off half a second later
+ DOM.Node.AddClass(self.PingContainer.Node, "PingContainerActive");
+ window.setTimeout(Bind(function(self)
+ {
+ DOM.Node.RemoveClass(self.PingContainer.Node, "PingContainerActive");
+ }, self), 500);
+ }
+
+
+ return TitleWindow;
+})(); \ No newline at end of file
diff --git a/3rdparty/bgfx/3rdparty/remotery/vis/Code/WebSocketConnection.js b/3rdparty/bgfx/3rdparty/remotery/vis/Code/WebSocketConnection.js
new file mode 100644
index 00000000000..2fbc31b7453
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/remotery/vis/Code/WebSocketConnection.js
@@ -0,0 +1,130 @@
+
+WebSocketConnection = (function()
+{
+ function WebSocketConnection()
+ {
+ this.MessageHandlers = { };
+ this.Socket = null;
+ this.Console = null;
+ }
+
+
+ WebSocketConnection.prototype.SetConsole = function(console)
+ {
+ this.Console = console;
+ }
+
+
+ WebSocketConnection.prototype.Connected = function()
+ {
+ // Will return true if the socket is also in the process of connecting
+ return this.Socket != null;
+ }
+
+
+ WebSocketConnection.prototype.AddConnectHandler = function(handler)
+ {
+ this.AddMessageHandler("__OnConnect__", handler);
+ }
+
+
+ WebSocketConnection.prototype.AddDisconnectHandler = function(handler)
+ {
+ this.AddMessageHandler("__OnDisconnect__", handler);
+ }
+
+
+ WebSocketConnection.prototype.AddMessageHandler = function(message_name, handler)
+ {
+ // Create the message handler array on-demand
+ if (!(message_name in this.MessageHandlers))
+ this.MessageHandlers[message_name] = [ ];
+ this.MessageHandlers[message_name].push(handler);
+ }
+
+
+ WebSocketConnection.prototype.Connect = function(address)
+ {
+ // Disconnect if already connected
+ if (this.Connected())
+ this.Disconnect();
+
+ Log(this, "Connecting to " + address);
+
+ this.Socket = new WebSocket(address);
+ this.Socket.onopen = Bind(OnOpen, this);
+ this.Socket.onmessage = Bind(OnMessage, this);
+ this.Socket.onclose = Bind(OnClose, this);
+ this.Socket.onerror = Bind(OnError, this);
+ }
+
+
+ WebSocketConnection.prototype.Disconnect = function()
+ {
+ Log(this, "Disconnecting");
+ if (this.Connected())
+ this.Socket.close();
+ }
+
+
+ WebSocketConnection.prototype.Send = function(msg)
+ {
+ if (this.Connected())
+ this.Socket.send(msg);
+ }
+
+
+ function Log(self, message)
+ {
+ self.Console.Log(message);
+ }
+
+
+ function CallMessageHandlers(self, message_name, message)
+ {
+ if (message_name in self.MessageHandlers)
+ {
+ var handlers = self.MessageHandlers[message_name];
+ for (var i in handlers)
+ handlers[i](self, message);
+ }
+ }
+
+
+ function OnOpen(self, event)
+ {
+ Log(self, "Connected");
+ CallMessageHandlers(self, "__OnConnect__");
+ }
+
+
+ function OnClose(self, event)
+ {
+ // Clear all references
+ self.Socket.onopen = null;
+ self.Socket.onmessage = null;
+ self.Socket.onclose = null;
+ self.Socket.onerror = null;
+ self.Socket = null;
+
+ Log(self, "Disconnected");
+ CallMessageHandlers(self, "__OnDisconnect__");
+ }
+
+
+ function OnError(self, event)
+ {
+ Log(self, "Connection Error ");
+ }
+
+
+ function OnMessage(self, event)
+ {
+ var message = JSON.parse(event.data);
+ if ("id" in message)
+ CallMessageHandlers(self, message.id, message);
+ }
+
+
+ return WebSocketConnection;
+})();
diff --git a/3rdparty/bgfx/3rdparty/remotery/vis/Styles/Remotery.css b/3rdparty/bgfx/3rdparty/remotery/vis/Styles/Remotery.css
new file mode 100644
index 00000000000..836dd68d734
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/remotery/vis/Styles/Remotery.css
@@ -0,0 +1,211 @@
+
+body
+{
+ /* Take up the full page */
+ width: 100%;
+ height: 100%;
+ margin: 0px;
+
+ background-color: #AAA;
+}
+
+
+.NoSelect
+{
+ /* Disable text selection so that it doesn't interfere with faux-button clicking */
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+
+ /* Stops the text cursor over the label */
+ cursor:default;
+}
+
+
+/* Override default window styles to remove 3D effect */
+.Window
+{
+ background: #555;
+ box-shadow: none;
+ border-radius: 3px;
+}
+/*.WindowTitleBar
+{
+ border-bottom: none;
+ border-radius: 0px;
+}
+.WindowBody
+{
+ border-top: none;
+}*/
+
+
+/* Override default container style to remove 3D effect */
+.Container
+{
+ border: none;
+ box-shadow: none;
+}
+
+
+/* Override default edit box style to remove 3D effect */
+.EditBox
+{
+ border: none;
+ box-shadow: none;
+ width:200;
+}
+
+
+
+.ConsoleText
+{
+ overflow:auto;
+ color: #BBB;
+ font: 9px Verdana;
+ margin: 2px;
+}
+
+
+.PingContainer
+{
+ background-color: #F55;
+ border-radius: 2px;
+
+ /* Transition from green is gradual */
+ transition: background-color 0.25s ease-in;
+}
+
+
+.PingContainerActive
+{
+ background-color: #5F5;
+
+ /* Transition to green is instant */
+ transition: none;
+}
+
+
+.SampleNameCell
+{
+ width:300px;
+}
+
+
+.TimelineBox
+{
+ /* Following style generally copies GridRowCell.GridGroup from BrowserLib */
+
+ padding: 1px 1px 1px 2px;
+ margin: 1px;
+
+ border: 1px solid;
+ border-radius: 2px;
+ border-top-color:#555;
+ border-left-color:#555;
+ border-bottom-color:#111;
+ border-right-color:#111;
+
+ background: #222;
+
+ font: 9px Verdana;
+ color: #BBB;
+}
+.TimelineRow
+{
+ width: 100%;
+}
+.TimelineRowCheckbox
+{
+ width: 12px;
+ height: 12px;
+ margin: 0px;
+}
+.TimelineRowCheck
+{
+ /* Pull .TimelineRowExpand to the right of the checkbox */
+ float:left;
+
+ width: 14px;
+ height: 14px;
+}
+.TimelineRowExpand
+{
+ /* Pull .TimelineRowLabel to the right of +/- buttons */
+ float:left;
+
+ width: 14px;
+ height: 14px;
+}
+.TimelineRowExpandButton
+{
+ width: 11px;
+ height: 12px;
+
+ color: #333;
+
+ border: 1px solid;
+
+ border-top-color:#F4F4F4;
+ border-left-color:#F4F4F4;
+ border-bottom-color:#8E8F8F;
+ border-right-color:#8E8F8F;
+
+ /* Top-right to bottom-left grey background gradient */
+ background: #f6f6f6; /* Old browsers */
+ background: -moz-linear-gradient(-45deg, #f6f6f6 0%, #abaeb2 100%); /* FF3.6+ */
+ background: -webkit-gradient(linear, left top, right bottom, color-stop(0%,#f6f6f6), color-stop(100%,#abaeb2)); /* Chrome,Safari4+ */
+ background: -webkit-linear-gradient(-45deg, #f6f6f6 0%,#abaeb2 100%); /* Chrome10+,Safari5.1+ */
+ background: -o-linear-gradient(-45deg, #f6f6f6 0%,#abaeb2 100%); /* Opera 11.10+ */
+ background: -ms-linear-gradient(-45deg, #f6f6f6 0%,#abaeb2 100%); /* IE10+ */
+ background: linear-gradient(135deg, #f6f6f6 0%,#abaeb2 100%); /* W3C */
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f6f6f6', endColorstr='#abaeb2',GradientType=1 ); /* IE6-9 fallback on horizontal gradient */
+
+ text-align: center;
+ vertical-align: center;
+}
+.TimelineRowExpandButton:hover
+{
+ border-top-color:#79C6F9;
+ border-left-color:#79C6F9;
+ border-bottom-color:#385D72;
+ border-right-color:#385D72;
+
+ /* Top-right to bottom-left blue background gradient, matching border */
+ background: #f3f3f3; /* Old browsers */
+ background: -moz-linear-gradient(-45deg, #f3f3f3 0%, #79c6f9 100%); /* FF3.6+ */
+ background: -webkit-gradient(linear, left top, right bottom, color-stop(0%,#f3f3f3), color-stop(100%,#79c6f9)); /* Chrome,Safari4+ */
+ background: -webkit-linear-gradient(-45deg, #f3f3f3 0%,#79c6f9 100%); /* Chrome10+,Safari5.1+ */
+ background: -o-linear-gradient(-45deg, #f3f3f3 0%,#79c6f9 100%); /* Opera 11.10+ */
+ background: -ms-linear-gradient(-45deg, #f3f3f3 0%,#79c6f9 100%); /* IE10+ */
+ background: linear-gradient(135deg, #f3f3f3 0%,#79c6f9 100%); /* W3C */
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f3f3f3', endColorstr='#79c6f9',GradientType=1 ); /* IE6-9 fallback on horizontal gradient */
+}
+.TimelineRowExpandButtonActive
+{
+ /* Simple means of shifting text within a div to the bottom-right */
+ padding-left:1px;
+ padding-top:1px;
+ width:10px;
+ height:11px;
+}
+.TimelineRowLabel
+{
+ /* Pull .TimelineRowCanvas to the right of the label */
+ float:left;
+
+ width: 140px;
+ height: 14px;
+}
+.TimelineRowCanvas
+{
+}
+
+/* enable vertical scrollbar in TimelineContainer (useful for many threads) */
+.TimelineContainer
+{
+ overflow-y: scroll;
+}
diff --git a/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/Core/Code/Animation.js b/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/Core/Code/Animation.js
new file mode 100644
index 00000000000..516aa9cf80c
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/Core/Code/Animation.js
@@ -0,0 +1,65 @@
+
+//
+// Very basic linear value animation system, for now.
+//
+
+
+namespace("Anim");
+
+
+Anim.Animation = (function()
+{
+ var anim_hz = 60;
+
+
+ function Animation(anim_func, start_value, end_value, time, end_callback)
+ {
+ // Setup initial parameters
+ this.StartValue = start_value;
+ this.EndValue = end_value;
+ this.ValueInc = (end_value - start_value) / (time * anim_hz);
+ this.Value = start_value;
+ this.Complete = false;
+ this.EndCallback = end_callback;
+
+ // Cache the update function to prevent recreating the closure
+ var self = this;
+ this.AnimFunc = anim_func;
+ this.AnimUpdate = function() { Update(self); }
+
+ // Call for the start value
+ this.AnimUpdate();
+ }
+
+
+ function Update(self)
+ {
+ // Queue up the next frame immediately
+ var id = window.setTimeout(self.AnimUpdate, 1000 / anim_hz);
+
+ // Linear step the value and check for completion
+ self.Value += self.ValueInc;
+ if (Math.abs(self.Value - self.EndValue) < 0.01)
+ {
+ self.Value = self.EndValue;
+ self.Complete = true;
+
+ if (self.EndCallback)
+ self.EndCallback();
+
+ window.clearTimeout(id);
+ }
+
+ // Pass to the animation function
+ self.AnimFunc(self.Value);
+ }
+
+
+ return Animation;
+})();
+
+
+Anim.Animate = function(anim_func, start_value, end_value, time, end_callback)
+{
+ return new Anim.Animation(anim_func, start_value, end_value, time, end_callback);
+}
diff --git a/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/Core/Code/Bind.js b/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/Core/Code/Bind.js
new file mode 100644
index 00000000000..102ee26f60d
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/Core/Code/Bind.js
@@ -0,0 +1,92 @@
+//
+// This will generate a closure for the given function and optionally bind an arbitrary number of
+// its initial arguments to specific values.
+//
+// Parameters:
+//
+// 0: Either the function scope or the function.
+// 1: If 0 is the function scope, this is the function.
+// Otherwise it's the start of the optional bound argument list.
+// 2: Start of the optional bound argument list if 1 is the function.
+//
+// Examples:
+//
+// function GlobalFunction(p0, p1, p2) { }
+// function ThisFunction(p0, p1, p2) { }
+//
+// var a = Bind("GlobalFunction");
+// var b = Bind(this, "ThisFunction");
+// var c = Bind("GlobalFunction", BoundParam0, BoundParam1);
+// var d = Bind(this, "ThisFunction", BoundParam0, BoundParam1);
+// var e = Bind(GlobalFunction);
+// var f = Bind(this, ThisFunction);
+// var g = Bind(GlobalFunction, BoundParam0, BoundParam1);
+// var h = Bind(this, ThisFunction, BoundParam0, BoundParam1);
+//
+// a(0, 1, 2);
+// b(0, 1, 2);
+// c(2);
+// d(2);
+// e(0, 1, 2);
+// f(0, 1, 2);
+// g(2);
+// h(2);
+//
+function Bind()
+{
+ // No closure to define?
+ if (arguments.length == 0)
+ return null;
+
+ // Figure out which of the 4 call types is being used to bind
+ // Locate scope, function and bound parameter start index
+
+ if (typeof(arguments[0]) == "string")
+ {
+ var scope = window;
+ var func = window[arguments[0]];
+ var start = 1;
+ }
+
+ else if (typeof(arguments[0]) == "function")
+ {
+ var scope = window;
+ var func = arguments[0];
+ var start = 1;
+ }
+
+ else if (typeof(arguments[1]) == "string")
+ {
+ var scope = arguments[0];
+ var func = scope[arguments[1]];
+ var start = 2;
+ }
+
+ else if (typeof(arguments[1]) == "function")
+ {
+ var scope = arguments[0];
+ var func = arguments[1];
+ var start = 2;
+ }
+
+ else
+ {
+ // unknown
+ console.log("Bind() ERROR: Unknown bind parameter configuration");
+ return;
+ }
+
+ // Convert the arguments list to an array
+ var arg_array = Array.prototype.slice.call(arguments, start);
+ start = arg_array.length;
+
+ return function()
+ {
+ // Concatenate incoming arguments
+ for (var i = 0; i < arguments.length; i++)
+ arg_array[start + i] = arguments[i];
+
+ // Call the function in the given scope with the new arguments
+ return func.apply(scope, arg_array);
+ }
+}
diff --git a/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/Core/Code/Convert.js b/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/Core/Code/Convert.js
new file mode 100644
index 00000000000..b1f54613174
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/Core/Code/Convert.js
@@ -0,0 +1,218 @@
+
+namespace("Convert");
+
+
+//
+// Convert between utf8 and b64 without raising character out of range exceptions with unicode strings
+// Technique described here: http://monsur.hossa.in/2012/07/20/utf-8-in-javascript.html
+//
+Convert.utf8string_to_b64string = function(str)
+{
+ return btoa(unescape(encodeURIComponent(str)));
+}
+Convert.b64string_to_utf8string = function(str)
+{
+ return decodeURIComponent(escape(atob(str)));
+}
+
+
+//
+// More general approach, converting between byte arrays and b64
+// Info here: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Base64_encoding_and_decoding
+//
+Convert.b64string_to_Uint8Array = function(sBase64, nBlocksSize)
+{
+ function b64ToUint6 (nChr)
+ {
+ return nChr > 64 && nChr < 91 ?
+ nChr - 65
+ : nChr > 96 && nChr < 123 ?
+ nChr - 71
+ : nChr > 47 && nChr < 58 ?
+ nChr + 4
+ : nChr === 43 ?
+ 62
+ : nChr === 47 ?
+ 63
+ :
+ 0;
+ }
+
+ var
+ sB64Enc = sBase64.replace(/[^A-Za-z0-9\+\/]/g, ""),
+ nInLen = sB64Enc.length,
+ nOutLen = nBlocksSize ? Math.ceil((nInLen * 3 + 1 >> 2) / nBlocksSize) * nBlocksSize : nInLen * 3 + 1 >> 2,
+ taBytes = new Uint8Array(nOutLen);
+
+ for (var nMod3, nMod4, nUint24 = 0, nOutIdx = 0, nInIdx = 0; nInIdx < nInLen; nInIdx++)
+ {
+ nMod4 = nInIdx & 3;
+ nUint24 |= b64ToUint6(sB64Enc.charCodeAt(nInIdx)) << 18 - 6 * nMod4;
+ if (nMod4 === 3 || nInLen - nInIdx === 1)
+ {
+ for (nMod3 = 0; nMod3 < 3 && nOutIdx < nOutLen; nMod3++, nOutIdx++)
+ taBytes[nOutIdx] = nUint24 >>> (16 >>> nMod3 & 24) & 255;
+ nUint24 = 0;
+ }
+ }
+
+ return taBytes;
+}
+Convert.Uint8Array_to_b64string = function(aBytes)
+{
+ function uint6ToB64 (nUint6)
+ {
+ return nUint6 < 26 ?
+ nUint6 + 65
+ : nUint6 < 52 ?
+ nUint6 + 71
+ : nUint6 < 62 ?
+ nUint6 - 4
+ : nUint6 === 62 ?
+ 43
+ : nUint6 === 63 ?
+ 47
+ :
+ 65;
+ }
+
+ var nMod3, sB64Enc = "";
+
+ for (var nLen = aBytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; nIdx++)
+ {
+ nMod3 = nIdx % 3;
+ if (nIdx > 0 && (nIdx * 4 / 3) % 76 === 0)
+ sB64Enc += "\r\n";
+ nUint24 |= aBytes[nIdx] << (16 >>> nMod3 & 24);
+ if (nMod3 === 2 || aBytes.length - nIdx === 1)
+ {
+ sB64Enc += String.fromCharCode(uint6ToB64(nUint24 >>> 18 & 63), uint6ToB64(nUint24 >>> 12 & 63), uint6ToB64(nUint24 >>> 6 & 63), uint6ToB64(nUint24 & 63));
+ nUint24 = 0;
+ }
+ }
+
+ return sB64Enc.replace(/A(?=A$|$)/g, "=");
+}
+
+
+//
+// Unicode and arbitrary value safe conversion between strings and Uint8Arrays
+//
+Convert.Uint8Array_to_string = function(aBytes)
+{
+ var sView = "";
+
+ for (var nPart, nLen = aBytes.length, nIdx = 0; nIdx < nLen; nIdx++)
+ {
+ nPart = aBytes[nIdx];
+ sView += String.fromCharCode(
+ nPart > 251 && nPart < 254 && nIdx + 5 < nLen ? /* six bytes */
+ /* (nPart - 252 << 32) is not possible in ECMAScript! So...: */
+ (nPart - 252) * 1073741824 + (aBytes[++nIdx] - 128 << 24) + (aBytes[++nIdx] - 128 << 18) + (aBytes[++nIdx] - 128 << 12) + (aBytes[++nIdx] - 128 << 6) + aBytes[++nIdx] - 128
+ : nPart > 247 && nPart < 252 && nIdx + 4 < nLen ? /* five bytes */
+ (nPart - 248 << 24) + (aBytes[++nIdx] - 128 << 18) + (aBytes[++nIdx] - 128 << 12) + (aBytes[++nIdx] - 128 << 6) + aBytes[++nIdx] - 128
+ : nPart > 239 && nPart < 248 && nIdx + 3 < nLen ? /* four bytes */
+ (nPart - 240 << 18) + (aBytes[++nIdx] - 128 << 12) + (aBytes[++nIdx] - 128 << 6) + aBytes[++nIdx] - 128
+ : nPart > 223 && nPart < 240 && nIdx + 2 < nLen ? /* three bytes */
+ (nPart - 224 << 12) + (aBytes[++nIdx] - 128 << 6) + aBytes[++nIdx] - 128
+ : nPart > 191 && nPart < 224 && nIdx + 1 < nLen ? /* two bytes */
+ (nPart - 192 << 6) + aBytes[++nIdx] - 128
+ : /* nPart < 127 ? */ /* one byte */
+ nPart
+ );
+ }
+
+ return sView;
+}
+Convert.string_to_Uint8Array = function(sDOMStr)
+{
+ var aBytes, nChr, nStrLen = sDOMStr.length, nArrLen = 0;
+
+ /* mapping... */
+
+ for (var nMapIdx = 0; nMapIdx < nStrLen; nMapIdx++)
+ {
+ nChr = sDOMStr.charCodeAt(nMapIdx);
+ nArrLen += nChr < 0x80 ? 1 : nChr < 0x800 ? 2 : nChr < 0x10000 ? 3 : nChr < 0x200000 ? 4 : nChr < 0x4000000 ? 5 : 6;
+ }
+
+ aBytes = new Uint8Array(nArrLen);
+
+ /* transcription... */
+
+ for (var nIdx = 0, nChrIdx = 0; nIdx < nArrLen; nChrIdx++)
+ {
+ nChr = sDOMStr.charCodeAt(nChrIdx);
+ if (nChr < 128)
+ {
+ /* one byte */
+ aBytes[nIdx++] = nChr;
+ }
+ else if (nChr < 0x800)
+ {
+ /* two bytes */
+ aBytes[nIdx++] = 192 + (nChr >>> 6);
+ aBytes[nIdx++] = 128 + (nChr & 63);
+ }
+ else if (nChr < 0x10000)
+ {
+ /* three bytes */
+ aBytes[nIdx++] = 224 + (nChr >>> 12);
+ aBytes[nIdx++] = 128 + (nChr >>> 6 & 63);
+ aBytes[nIdx++] = 128 + (nChr & 63);
+ }
+ else if (nChr < 0x200000)
+ {
+ /* four bytes */
+ aBytes[nIdx++] = 240 + (nChr >>> 18);
+ aBytes[nIdx++] = 128 + (nChr >>> 12 & 63);
+ aBytes[nIdx++] = 128 + (nChr >>> 6 & 63);
+ aBytes[nIdx++] = 128 + (nChr & 63);
+ }
+ else if (nChr < 0x4000000)
+ {
+ /* five bytes */
+ aBytes[nIdx++] = 248 + (nChr >>> 24);
+ aBytes[nIdx++] = 128 + (nChr >>> 18 & 63);
+ aBytes[nIdx++] = 128 + (nChr >>> 12 & 63);
+ aBytes[nIdx++] = 128 + (nChr >>> 6 & 63);
+ aBytes[nIdx++] = 128 + (nChr & 63);
+ }
+ else /* if (nChr <= 0x7fffffff) */
+ {
+ /* six bytes */
+ aBytes[nIdx++] = 252 + /* (nChr >>> 32) is not possible in ECMAScript! So...: */ (nChr / 1073741824);
+ aBytes[nIdx++] = 128 + (nChr >>> 24 & 63);
+ aBytes[nIdx++] = 128 + (nChr >>> 18 & 63);
+ aBytes[nIdx++] = 128 + (nChr >>> 12 & 63);
+ aBytes[nIdx++] = 128 + (nChr >>> 6 & 63);
+ aBytes[nIdx++] = 128 + (nChr & 63);
+ }
+ }
+
+ return aBytes;
+}
+
+
+//
+// Converts all characters in a string that have equivalent entities to their ampersand/entity names.
+// Based on https://gist.github.com/jonathantneal/6093551
+//
+Convert.string_to_html_entities = (function()
+{
+ 'use strict';
+
+ var data = '34quot38amp39apos60lt62gt160nbsp161iexcl162cent163pound164curren165yen166brvbar167sect168uml169copy170ordf171laquo172not173shy174reg175macr176deg177plusmn178sup2179sup3180acute181micro182para183middot184cedil185sup1186ordm187raquo188frac14189frac12190frac34191iquest192Agrave193Aacute194Acirc195Atilde196Auml197Aring198AElig199Ccedil200Egrave201Eacute202Ecirc203Euml204Igrave205Iacute206Icirc207Iuml208ETH209Ntilde210Ograve211Oacute212Ocirc213Otilde214Ouml215times216Oslash217Ugrave218Uacute219Ucirc220Uuml221Yacute222THORN223szlig224agrave225aacute226acirc227atilde228auml229aring230aelig231ccedil232egrave233eacute234ecirc235euml236igrave237iacute238icirc239iuml240eth241ntilde242ograve243oacute244ocirc245otilde246ouml247divide248oslash249ugrave250uacute251ucirc252uuml253yacute254thorn255yuml402fnof913Alpha914Beta915Gamma916Delta917Epsilon918Zeta919Eta920Theta921Iota922Kappa923Lambda924Mu925Nu926Xi927Omicron928Pi929Rho931Sigma932Tau933Upsilon934Phi935Chi936Psi937Omega945alpha946beta947gamma948delta949epsilon950zeta951eta952theta953iota954kappa955lambda956mu957nu958xi959omicron960pi961rho962sigmaf963sigma964tau965upsilon966phi967chi968psi969omega977thetasym978upsih982piv8226bull8230hellip8242prime8243Prime8254oline8260frasl8472weierp8465image8476real8482trade8501alefsym8592larr8593uarr8594rarr8595darr8596harr8629crarr8656lArr8657uArr8658rArr8659dArr8660hArr8704forall8706part8707exist8709empty8711nabla8712isin8713notin8715ni8719prod8721sum8722minus8727lowast8730radic8733prop8734infin8736ang8743and8744or8745cap8746cup8747int8756there48764sim8773cong8776asymp8800ne8801equiv8804le8805ge8834sub8835sup8836nsub8838sube8839supe8853oplus8855otimes8869perp8901sdot8968lceil8969rceil8970lfloor8971rfloor9001lang9002rang9674loz9824spades9827clubs9829hearts9830diams338OElig339oelig352Scaron353scaron376Yuml710circ732tilde8194ensp8195emsp8201thinsp8204zwnj8205zwj8206lrm8207rlm8211ndash8212mdash8216lsquo8217rsquo8218sbquo8220ldquo8221rdquo8222bdquo8224dagger8225Dagger8240permil8249lsaquo8250rsaquo8364euro';
+ var charCodes = data.split(/[A-z]+/);
+ var entities = data.split(/\d+/).slice(1);
+
+ return function encodeHTMLEntities(text)
+ {
+ return text.replace(/[\u00A0-\u2666<>"'&]/g, function (match)
+ {
+ var charCode = String(match.charCodeAt(0));
+ var index = charCodes.indexOf(charCode);
+ return '&' + (entities[index] ? entities[index] : '#' + charCode) + ';';
+ });
+ };
+})();
diff --git a/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/Core/Code/Core.js b/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/Core/Code/Core.js
new file mode 100644
index 00000000000..aab35c9207d
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/Core/Code/Core.js
@@ -0,0 +1,20 @@
+
+// TODO: requires function for checking existence of dependencies
+
+
+function namespace(name)
+{
+ // Ensure all nested namespaces are created only once
+
+ var ns_list = name.split(".");
+ var parent_ns = window;
+
+ for (var i in ns_list)
+ {
+ var ns_name = ns_list[i];
+ if (!(ns_name in parent_ns))
+ parent_ns[ns_name] = { };
+
+ parent_ns = parent_ns[ns_name];
+ }
+} \ No newline at end of file
diff --git a/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/Core/Code/DOM.js b/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/Core/Code/DOM.js
new file mode 100644
index 00000000000..f11fb192bcd
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/Core/Code/DOM.js
@@ -0,0 +1,499 @@
+
+namespace("DOM.Node");
+namespace("DOM.Event");
+namespace("DOM.Applet");
+
+
+
+//
+// =====================================================================================================================
+// ----- DOCUMENT NODE/ELEMENT EXTENSIONS ------------------------------------------------------------------------------
+// =====================================================================================================================
+//
+
+
+
+DOM.Node.Get = function(id)
+{
+ return document.getElementById(id);
+}
+
+
+//
+// Set node position
+//
+DOM.Node.SetPosition = function(node, position)
+{
+ node.style.left = position[0];
+ node.style.top = position[1];
+}
+DOM.Node.SetX = function(node, x)
+{
+ node.style.left = x;
+}
+DOM.Node.SetY = function(node, y)
+{
+ node.style.top = y;
+}
+
+
+//
+// Get the absolute position of a HTML element on the page
+//
+DOM.Node.GetPosition = function(element, account_for_scroll)
+{
+ // Recurse up through parents, summing offsets from their parent
+ var x = 0, y = 0;
+ for (var node = element; node != null; node = node.offsetParent)
+ {
+ x += node.offsetLeft;
+ y += node.offsetTop;
+ }
+
+ if (account_for_scroll)
+ {
+ // Walk up the hierarchy subtracting away any scrolling
+ for (var node = element; node != document.body; node = node.parentNode)
+ {
+ x -= node.scrollLeft;
+ y -= node.scrollTop;
+ }
+ }
+
+ return [x, y];
+}
+
+
+//
+// Set node size
+//
+DOM.Node.SetSize = function(node, size)
+{
+ node.style.width = size[0];
+ node.style.height = size[1];
+}
+DOM.Node.SetWidth = function(node, width)
+{
+ node.style.width = width;
+}
+DOM.Node.SetHeight = function(node, height)
+{
+ node.style.height = height;
+}
+
+
+//
+// Get node OFFSET size:
+// clientX includes padding
+// offsetX includes padding and borders
+// scrollX includes padding, borders and size of contained node
+//
+DOM.Node.GetSize = function(node)
+{
+ return [ node.offsetWidth, node.offsetHeight ];
+}
+DOM.Node.GetWidth = function(node)
+{
+ return node.offsetWidth;
+}
+DOM.Node.GetHeight = function(node)
+{
+ return node.offsetHeight;
+}
+
+
+//
+// Set node opacity
+//
+DOM.Node.SetOpacity = function(node, value)
+{
+ node.style.opacity = value;
+}
+
+
+DOM.Node.SetColour = function(node, colour)
+{
+ node.style.color = colour;
+}
+
+
+//
+// Hide a node by completely disabling its rendering (it no longer contributes to document layout)
+//
+DOM.Node.Hide = function(node)
+{
+ node.style.display = "none";
+}
+
+
+//
+// Show a node by restoring its influcen in document layout
+//
+DOM.Node.Show = function(node)
+{
+ node.style.display = "block";
+}
+
+
+//
+// Add a CSS class to a HTML element, specified last
+//
+DOM.Node.AddClass = function(node, class_name)
+{
+ // Ensure the class hasn't already been added
+ DOM.Node.RemoveClass(node, class_name);
+ node.className += " " + class_name;
+}
+
+
+//
+// Remove a CSS class from a HTML element
+//
+DOM.Node.RemoveClass = function(node, class_name)
+{
+ // Remove all variations of where the class name can be in the string list
+ var regexp = new RegExp("\\b" + class_name + "\\b");
+ node.className = node.className.replace(regexp, "");
+}
+
+
+
+//
+// Check to see if a HTML element contains a class
+//
+DOM.Node.HasClass = function(node, class_name)
+{
+ var regexp = new RegExp("\\b" + class_name + "\\b");
+ return regexp.test(node.className);
+}
+
+
+//
+// Recursively search for a node with the given class name
+//
+DOM.Node.FindWithClass = function(parent_node, class_name, index)
+{
+ // Search the children looking for a node with the given class name
+ for (var i in parent_node.childNodes)
+ {
+ var node = parent_node.childNodes[i];
+ if (DOM.Node.HasClass(node, class_name))
+ {
+ if (index === undefined || index-- == 0)
+ return node;
+ }
+
+ // Recurse into children
+ node = DOM.Node.FindWithClass(node, class_name);
+ if (node != null)
+ return node;
+ }
+
+ return null;
+}
+
+
+//
+// Check to see if one node logically contains another
+//
+DOM.Node.Contains = function(node, container_node)
+{
+ while (node != null && node != container_node)
+ node = node.parentNode;
+ return node != null;
+}
+
+
+//
+// Create the HTML nodes specified in the text passed in
+// Assumes there is only one root node in the text
+//
+DOM.Node.CreateHTML = function(html)
+{
+ var div = document.createElement("div");
+ div.innerHTML = html;
+
+ // First child may be a text node, followed by the created HTML
+ var child = div.firstChild;
+ if (child != null && child.nodeType == 3)
+ child = child.nextSibling;
+ return child;
+}
+
+
+//
+// Make a copy of a HTML element, making it visible and clearing its ID to ensure it's not a duplicate
+//
+DOM.Node.Clone = function(name)
+{
+ // Get the template element and clone it, making sure it's renderable
+ var node = DOM.Node.Get(name);
+ node = node.cloneNode(true);
+ node.id = null;
+ node.style.display = "block";
+ return node;
+}
+
+
+//
+// Append an arbitrary block of HTML to an existing node
+//
+DOM.Node.AppendHTML = function(node, html)
+{
+ var child = DOM.Node.CreateHTML(html);
+ node.appendChild(child);
+ return child;
+}
+
+
+//
+// Append a div that clears the float style
+//
+DOM.Node.AppendClearFloat = function(node)
+{
+ var div = document.createElement("div");
+ div.style.clear = "both";
+ node.appendChild(div);
+}
+
+
+//
+// Check to see that the object passed in is an instance of a DOM node
+//
+DOM.Node.IsNode = function(object)
+{
+ return object instanceof Element;
+}
+
+
+//
+// Create an "iframe shim" so that elements within it render over a Java Applet
+// http://web.archive.org/web/20110707212850/http://www.oratransplant.nl/2007/10/26/using-iframe-shim-to-partly-cover-a-java-applet/
+//
+DOM.Node.CreateShim = function(parent)
+{
+ var shimmer = document.createElement("iframe");
+
+ // Position the shimmer so that it's the same location/size as its parent
+ shimmer.style.position = "fixed";
+ shimmer.style.left = parent.style.left;
+ shimmer.style.top = parent.style.top;
+ shimmer.style.width = parent.offsetWidth;
+ shimmer.style.height = parent.offsetHeight;
+
+ // We want the shimmer to be one level below its contents
+ shimmer.style.zIndex = parent.style.zIndex - 1;
+
+ // Ensure its empty
+ shimmer.setAttribute("frameborder", "0");
+ shimmer.setAttribute("src", "");
+
+ // Add to the document and the parent
+ document.body.appendChild(shimmer);
+ parent.Shimmer = shimmer;
+ return shimmer;
+}
+
+
+
+//
+// =====================================================================================================================
+// ----- EVENT HANDLING EXTENSIONS -------------------------------------------------------------------------------------
+// =====================================================================================================================
+//
+
+
+
+//
+// Retrieves the event from the first parameter passed into an HTML event
+//
+DOM.Event.Get = function(evt)
+{
+ // Internet explorer doesn't pass the event
+ return window.event || evt;
+}
+
+
+//
+// Retrieves the element that triggered an event from the event object
+//
+DOM.Event.GetNode = function(evt)
+{
+ evt = DOM.Event.Get(evt);
+
+ // Get the target element
+ var element;
+ if (evt.target)
+ element = evt.target;
+ else if (e.srcElement)
+ element = evt.srcElement;
+
+ // Default Safari bug
+ if (element.nodeType == 3)
+ element = element.parentNode;
+
+ return element;
+}
+
+
+//
+// Stop default action for an event
+//
+DOM.Event.StopDefaultAction = function(evt)
+{
+ if (evt && evt.preventDefault)
+ evt.preventDefault();
+ else if (window.event && window.event.returnValue)
+ window.event.returnValue = false;
+}
+
+
+//
+// Stops events bubbling up to parent event handlers
+//
+DOM.Event.StopPropagation = function(evt)
+{
+ evt = DOM.Event.Get(evt);
+ if (evt)
+ {
+ evt.cancelBubble = true;
+ if (evt.stopPropagation)
+ evt.stopPropagation();
+ }
+}
+
+
+//
+// Stop both event default action and propagation
+//
+DOM.Event.StopAll = function(evt)
+{
+ DOM.Event.StopDefaultAction(evt);
+ DOM.Event.StopPropagation(evt);
+}
+
+
+//
+// Adds an event handler to an event
+//
+DOM.Event.AddHandler = function(obj, evt, func)
+{
+ if (obj)
+ {
+ if (obj.addEventListener)
+ obj.addEventListener(evt, func, false);
+ else if (obj.attachEvent)
+ obj.attachEvent("on" + evt, func);
+ }
+}
+
+
+//
+// Removes an event handler from an event
+//
+DOM.Event.RemoveHandler = function(obj, evt, func)
+{
+ if (obj)
+ {
+ if (obj.removeEventListener)
+ obj.removeEventListener(evt, func, false);
+ else if (obj.detachEvent)
+ obj.detachEvent("on" + evt, func);
+ }
+}
+
+
+//
+// Get the position of the mouse cursor, page relative
+//
+DOM.Event.GetMousePosition = function(evt)
+{
+ evt = DOM.Event.Get(evt);
+
+ var px = 0;
+ var py = 0;
+ if (evt.pageX || evt.pageY)
+ {
+ px = evt.pageX;
+ py = evt.pageY;
+ }
+ else if (evt.clientX || evt.clientY)
+ {
+ px = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
+ py = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
+ }
+
+ return [px, py];
+}
+
+
+
+//
+// =====================================================================================================================
+// ----- JAVA APPLET EXTENSIONS ----------------------------------------------------------------------------------------
+// =====================================================================================================================
+//
+
+
+
+//
+// Create an applet element for loading a Java applet, attaching it to the specified node
+//
+DOM.Applet.Load = function(dest_id, id, code, archive)
+{
+ // Lookup the applet destination
+ var dest = DOM.Node.Get(dest_id);
+ if (!dest)
+ return;
+
+ // Construct the applet element and add it to the destination
+ Debug.Log("Injecting applet DOM code");
+ var applet = "<applet id='" + id + "' code='" + code + "' archive='" + archive + "'";
+ applet += " width='" + dest.offsetWidth + "' height='" + dest.offsetHeight + "'>";
+ applet += "</applet>";
+ dest.innerHTML = applet;
+}
+
+
+//
+// Moves and resizes a named applet so that it fits in the destination div element.
+// The applet must be contained by a div element itself. This container div is moved along
+// with the applet.
+//
+DOM.Applet.Move = function(dest_div, applet, z_index, hide)
+{
+ if (!applet || !dest_div)
+ return;
+
+ // Before modifying any location information, hide the applet so that it doesn't render over
+ // any newly visible elements that appear while the location information is being modified.
+ if (hide)
+ applet.style.visibility = "hidden";
+
+ // Get its view rect
+ var pos = DOM.Node.GetPosition(dest_div);
+ var w = dest_div.offsetWidth;
+ var h = dest_div.offsetHeight;
+
+ // It needs to be embedded in a <div> for correct scale/position adjustment
+ var container = applet.parentNode;
+ if (!container || container.localName != "div")
+ {
+ Debug.Log("ERROR: Couldn't find source applet's div container");
+ return;
+ }
+
+ // Reposition and resize the containing div element
+ container.style.left = pos[0];
+ container.style.top = pos[1];
+ container.style.width = w;
+ container.style.height = h;
+ container.style.zIndex = z_index;
+
+ // Resize the applet itself
+ applet.style.width = w;
+ applet.style.height = h;
+
+ // Everything modified, safe to show
+ applet.style.visibility = "visible";
+}
diff --git a/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/Core/Code/Keyboard.js b/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/Core/Code/Keyboard.js
new file mode 100644
index 00000000000..f70f4ea0355
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/Core/Code/Keyboard.js
@@ -0,0 +1,149 @@
+
+namespace("Keyboard")
+
+
+// =====================================================================================================================
+// Key codes copied from closure-library
+// https://code.google.com/p/closure-library/source/browse/closure/goog/events/keycodes.js
+// ---------------------------------------------------------------------------------------------------------------------
+// Copyright 2006 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+Keyboard.Codes = {
+ WIN_KEY_FF_LINUX : 0,
+ MAC_ENTER : 3,
+ BACKSPACE : 8,
+ TAB : 9,
+ NUM_CENTER : 12, // NUMLOCK on FF/Safari Mac
+ ENTER : 13,
+ SHIFT : 16,
+ CTRL : 17,
+ ALT : 18,
+ PAUSE : 19,
+ CAPS_LOCK : 20,
+ ESC : 27,
+ SPACE : 32,
+ PAGE_UP : 33, // also NUM_NORTH_EAST
+ PAGE_DOWN : 34, // also NUM_SOUTH_EAST
+ END : 35, // also NUM_SOUTH_WEST
+ HOME : 36, // also NUM_NORTH_WEST
+ LEFT : 37, // also NUM_WEST
+ UP : 38, // also NUM_NORTH
+ RIGHT : 39, // also NUM_EAST
+ DOWN : 40, // also NUM_SOUTH
+ PRINT_SCREEN : 44,
+ INSERT : 45, // also NUM_INSERT
+ DELETE : 46, // also NUM_DELETE
+ ZERO : 48,
+ ONE : 49,
+ TWO : 50,
+ THREE : 51,
+ FOUR : 52,
+ FIVE : 53,
+ SIX : 54,
+ SEVEN : 55,
+ EIGHT : 56,
+ NINE : 57,
+ FF_SEMICOLON : 59, // Firefox (Gecko) fires this for semicolon instead of 186
+ FF_EQUALS : 61, // Firefox (Gecko) fires this for equals instead of 187
+ FF_DASH : 173, // Firefox (Gecko) fires this for dash instead of 189
+ QUESTION_MARK : 63, // needs localization
+ A : 65,
+ B : 66,
+ C : 67,
+ D : 68,
+ E : 69,
+ F : 70,
+ G : 71,
+ H : 72,
+ I : 73,
+ J : 74,
+ K : 75,
+ L : 76,
+ M : 77,
+ N : 78,
+ O : 79,
+ P : 80,
+ Q : 81,
+ R : 82,
+ S : 83,
+ T : 84,
+ U : 85,
+ V : 86,
+ W : 87,
+ X : 88,
+ Y : 89,
+ Z : 90,
+ META : 91, // WIN_KEY_LEFT
+ WIN_KEY_RIGHT : 92,
+ CONTEXT_MENU : 93,
+ NUM_ZERO : 96,
+ NUM_ONE : 97,
+ NUM_TWO : 98,
+ NUM_THREE : 99,
+ NUM_FOUR : 100,
+ NUM_FIVE : 101,
+ NUM_SIX : 102,
+ NUM_SEVEN : 103,
+ NUM_EIGHT : 104,
+ NUM_NINE : 105,
+ NUM_MULTIPLY : 106,
+ NUM_PLUS : 107,
+ NUM_MINUS : 109,
+ NUM_PERIOD : 110,
+ NUM_DIVISION : 111,
+ F1 : 112,
+ F2 : 113,
+ F3 : 114,
+ F4 : 115,
+ F5 : 116,
+ F6 : 117,
+ F7 : 118,
+ F8 : 119,
+ F9 : 120,
+ F10 : 121,
+ F11 : 122,
+ F12 : 123,
+ NUMLOCK : 144,
+ SCROLL_LOCK : 145,
+
+ // OS-specific media keys like volume controls and browser controls.
+ FIRST_MEDIA_KEY : 166,
+ LAST_MEDIA_KEY : 183,
+
+ SEMICOLON : 186, // needs localization
+ DASH : 189, // needs localization
+ EQUALS : 187, // needs localization
+ COMMA : 188, // needs localization
+ PERIOD : 190, // needs localization
+ SLASH : 191, // needs localization
+ APOSTROPHE : 192, // needs localization
+ TILDE : 192, // needs localization
+ SINGLE_QUOTE : 222, // needs localization
+ OPEN_SQUARE_BRACKET : 219, // needs localization
+ BACKSLASH : 220, // needs localization
+ CLOSE_SQUARE_BRACKET: 221, // needs localization
+ WIN_KEY : 224,
+ MAC_FF_META : 224, // Firefox (Gecko) fires this for the meta key instead of 91
+ MAC_WK_CMD_LEFT : 91, // WebKit Left Command key fired, same as META
+ MAC_WK_CMD_RIGHT : 93, // WebKit Right Command key fired, different from META
+ WIN_IME : 229,
+
+ // We've seen users whose machines fire this keycode at regular one
+ // second intervals. The common thread among these users is that
+ // they're all using Dell Inspiron laptops, so we suspect that this
+ // indicates a hardware/bios problem.
+ // http://en.community.dell.com/support-forums/laptop/f/3518/p/19285957/19523128.aspx
+ PHANTOM : 255
+};
+// =====================================================================================================================
diff --git a/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/Core/Code/LocalStore.js b/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/Core/Code/LocalStore.js
new file mode 100644
index 00000000000..5e34206bcf7
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/Core/Code/LocalStore.js
@@ -0,0 +1,26 @@
+
+namespace("LocalStore");
+
+
+LocalStore.Set = function(class_name, class_id, variable_id, data)
+{
+ if (typeof(Storage) != "undefined")
+ {
+ var name = class_name + "_" + class_id + "_" + variable_id;
+ localStorage[name] = JSON.stringify(data);
+ }
+}
+
+
+LocalStore.Get = function(class_name, class_id, variable_id, default_data)
+{
+ if (typeof(Storage) != "undefined")
+ {
+ var name = class_name + "_" + class_id + "_" + variable_id;
+ var data = localStorage[name]
+ if (data)
+ return JSON.parse(data);
+ }
+
+ return default_data;
+} \ No newline at end of file
diff --git a/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/Core/Code/Mouse.js b/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/Core/Code/Mouse.js
new file mode 100644
index 00000000000..a694b806983
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/Core/Code/Mouse.js
@@ -0,0 +1,83 @@
+
+namespace("Mouse");
+
+
+Mouse.State =(function()
+{
+ function State(event)
+ {
+ // Get button press states
+ if (typeof event.buttons != "undefined")
+ {
+ // Firefox
+ this.Left = (event.buttons & 1) != 0;
+ this.Right = (event.buttons & 2) != 0;
+ this.Middle = (event.buttons & 4) != 0;
+ }
+ else
+ {
+ // Chrome
+ this.Left = (event.button == 0);
+ this.Middle = (event.button == 1);
+ this.Right = (event.button == 2);
+ }
+
+ // Get page-relative mouse position
+ this.Position = DOM.Event.GetMousePosition(event);
+
+ // Get wheel delta
+ var delta = 0;
+ if (event.wheelDelta)
+ delta = event.wheelDelta / 120; // IE/Opera
+ else if (event.detail)
+ delta = -event.detail / 3; // Mozilla
+ this.WheelDelta = delta;
+
+ // Get the mouse position delta
+ // Requires Pointer Lock API support
+ this.PositionDelta = [
+ event.movementX || event.mozMovementX || event.webkitMovementX || 0,
+ event.movementY || event.mozMovementY || event.webkitMovementY || 0
+ ];
+ }
+
+ return State;
+})();
+
+
+//
+// Basic Pointer Lock API support
+// https://developer.mozilla.org/en-US/docs/WebAPI/Pointer_Lock
+// http://www.chromium.org/developers/design-documents/mouse-lock
+//
+// Note that API has not been standardised yet so browsers can implement functions with prefixes
+//
+
+
+Mouse.PointerLockSupported = function()
+{
+ return 'pointerLockElement' in document || 'mozPointerLockElement' in document || 'webkitPointerLockElement' in document;
+}
+
+
+Mouse.RequestPointerLock = function(element)
+{
+ element.requestPointerLock = element.requestPointerLock || element.mozRequestPointerLock || element.webkitRequestPointerLock;
+ if (element.requestPointerLock)
+ element.requestPointerLock();
+}
+
+
+Mouse.ExitPointerLock = function()
+{
+ document.exitPointerLock = document.exitPointerLock || document.mozExitPointerLock || document.webkitExitPointerLock;
+ if (document.exitPointerLock)
+ document.exitPointerLock();
+}
+
+
+// Can use this element to detect whether pointer lock is enabled (returns non-null)
+Mouse.PointerLockElement = function()
+{
+ return document.pointerLockElement || document.mozPointerLockElement || document.webkitPointerLockElement;
+}
diff --git a/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/Core/Code/MurmurHash3.js b/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/Core/Code/MurmurHash3.js
new file mode 100644
index 00000000000..c423d49debf
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/Core/Code/MurmurHash3.js
@@ -0,0 +1,68 @@
+
+namespace("Hash");
+
+/**
+ * JS Implementation of MurmurHash3 (r136) (as of May 20, 2011)
+ *
+ * @author <a href="mailto:gary.court@gmail.com">Gary Court</a>
+ * @see http://github.com/garycourt/murmurhash-js
+ * @author <a href="mailto:aappleby@gmail.com">Austin Appleby</a>
+ * @see http://sites.google.com/site/murmurhash/
+ *
+ * @param {string} key ASCII only
+ * @param {number} seed Positive integer only
+ * @return {number} 32-bit positive integer hash
+ */
+
+Hash.Murmur3 = function(key, seed)
+{
+ var remainder, bytes, h1, h1b, c1, c1b, c2, c2b, k1, i;
+
+ remainder = key.length & 3; // key.length % 4
+ bytes = key.length - remainder;
+ h1 = seed;
+ c1 = 0xcc9e2d51;
+ c2 = 0x1b873593;
+ i = 0;
+
+ while (i < bytes) {
+ k1 =
+ ((key.charCodeAt(i) & 0xff)) |
+ ((key.charCodeAt(++i) & 0xff) << 8) |
+ ((key.charCodeAt(++i) & 0xff) << 16) |
+ ((key.charCodeAt(++i) & 0xff) << 24);
+ ++i;
+
+ k1 = ((((k1 & 0xffff) * c1) + ((((k1 >>> 16) * c1) & 0xffff) << 16))) & 0xffffffff;
+ k1 = (k1 << 15) | (k1 >>> 17);
+ k1 = ((((k1 & 0xffff) * c2) + ((((k1 >>> 16) * c2) & 0xffff) << 16))) & 0xffffffff;
+
+ h1 ^= k1;
+ h1 = (h1 << 13) | (h1 >>> 19);
+ h1b = ((((h1 & 0xffff) * 5) + ((((h1 >>> 16) * 5) & 0xffff) << 16))) & 0xffffffff;
+ h1 = (((h1b & 0xffff) + 0x6b64) + ((((h1b >>> 16) + 0xe654) & 0xffff) << 16));
+ }
+
+ k1 = 0;
+
+ switch (remainder) {
+ case 3: k1 ^= (key.charCodeAt(i + 2) & 0xff) << 16;
+ case 2: k1 ^= (key.charCodeAt(i + 1) & 0xff) << 8;
+ case 1: k1 ^= (key.charCodeAt(i) & 0xff);
+
+ k1 = (((k1 & 0xffff) * c1) + ((((k1 >>> 16) * c1) & 0xffff) << 16)) & 0xffffffff;
+ k1 = (k1 << 15) | (k1 >>> 17);
+ k1 = (((k1 & 0xffff) * c2) + ((((k1 >>> 16) * c2) & 0xffff) << 16)) & 0xffffffff;
+ h1 ^= k1;
+ }
+
+ h1 ^= key.length;
+
+ h1 ^= h1 >>> 16;
+ h1 = (((h1 & 0xffff) * 0x85ebca6b) + ((((h1 >>> 16) * 0x85ebca6b) & 0xffff) << 16)) & 0xffffffff;
+ h1 ^= h1 >>> 13;
+ h1 = ((((h1 & 0xffff) * 0xc2b2ae35) + ((((h1 >>> 16) * 0xc2b2ae35) & 0xffff) << 16))) & 0xffffffff;
+ h1 ^= h1 >>> 16;
+
+ return h1 >>> 0;
+} \ No newline at end of file
diff --git a/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/WindowManager/Code/Button.js b/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/WindowManager/Code/Button.js
new file mode 100644
index 00000000000..12e09815b08
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/WindowManager/Code/Button.js
@@ -0,0 +1,131 @@
+
+namespace("WM");
+
+
+WM.Button = (function()
+{
+ var template_html = "<div class='Button notextsel'></div>";
+
+
+ function Button(text, x, y, opts)
+ {
+ this.OnClick = null;
+ this.Toggle = opts && opts.toggle;
+
+ this.Node = DOM.Node.CreateHTML(template_html);
+
+ // Set node dimensions
+ this.SetPosition(x, y);
+ if (opts && opts.w && opts.h)
+ this.SetSize(opts.w, opts.h);
+
+ // Override the default class name
+ if (opts && opts.class)
+ this.Node.className = opts.class;
+
+ this.SetText(text);
+
+ // Create the mouse press event handlers
+ DOM.Event.AddHandler(this.Node, "mousedown", Bind(OnMouseDown, this));
+ this.OnMouseOutDelegate = Bind(OnMouseUp, this, false);
+ this.OnMouseUpDelegate = Bind(OnMouseUp, this, true);
+ }
+
+
+ Button.prototype.SetPosition = function(x, y)
+ {
+ this.Position = [ x, y ];
+ DOM.Node.SetPosition(this.Node, this.Position);
+ }
+
+
+ Button.prototype.SetSize = function(w, h)
+ {
+ this.Size = [ w, h ];
+ DOM.Node.SetSize(this.Node, this.Size);
+ }
+
+
+ Button.prototype.SetText = function(text)
+ {
+ this.Node.innerHTML = text;
+ }
+
+
+ Button.prototype.SetOnClick = function(on_click)
+ {
+ this.OnClick = on_click;
+ }
+
+
+ Button.prototype.SetState = function(pressed)
+ {
+ if (pressed)
+ DOM.Node.AddClass(this.Node, "ButtonHeld");
+ else
+ DOM.Node.RemoveClass(this.Node, "ButtonHeld");
+ }
+
+
+ Button.prototype.ToggleState = function()
+ {
+ if (DOM.Node.HasClass(this.Node, "ButtonHeld"))
+ this.SetState(false);
+ else
+ this.SetState(true);
+ }
+
+
+ Button.prototype.IsPressed = function()
+ {
+ return DOM.Node.HasClass(this.Node, "ButtonHeld");
+ }
+
+
+ function OnMouseDown(self, evt)
+ {
+ // Decide how to set the button state
+ if (self.Toggle)
+ self.ToggleState();
+ else
+ self.SetState(true);
+
+ // Activate release handlers
+ DOM.Event.AddHandler(self.Node, "mouseout", self.OnMouseOutDelegate);
+ DOM.Event.AddHandler(self.Node, "mouseup", self.OnMouseUpDelegate);
+
+ DOM.Event.StopAll(evt);
+ }
+
+
+ function OnMouseUp(self, confirm, evt)
+ {
+ if (confirm)
+ {
+ // Only release for non-toggles
+ if (!self.Toggle)
+ self.SetState(false);
+ }
+ else
+ {
+ // Decide how to set the button state
+ if (self.Toggle)
+ self.ToggleState();
+ else
+ self.SetState(false);
+ }
+
+ // Remove release handlers
+ DOM.Event.RemoveHandler(self.Node, "mouseout", self.OnMouseOutDelegate);
+ DOM.Event.RemoveHandler(self.Node, "mouseup", self.OnMouseUpDelegate);
+
+ // Call the click handler if this is a button press
+ if (confirm && self.OnClick)
+ self.OnClick(self);
+
+ DOM.Event.StopAll(evt);
+ }
+
+
+ return Button;
+})(); \ No newline at end of file
diff --git a/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/WindowManager/Code/ComboBox.js b/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/WindowManager/Code/ComboBox.js
new file mode 100644
index 00000000000..d199b3abda1
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/WindowManager/Code/ComboBox.js
@@ -0,0 +1,237 @@
+
+namespace("WM");
+
+
+WM.ComboBoxPopup = (function()
+{
+ var body_template_html = "<div class='ComboBoxPopup'></div>";
+
+ var item_template_html = " \
+ <div class='ComboBoxPopupItem notextsel'> \
+ <div class='ComboBoxPopupItemText'></div> \
+ <div class='ComboBoxPopupItemIcon'><img src='BrowserLibImages/tick.gif'></div> \
+ <div style='clear:both'></div> \
+ </div>";
+
+
+ function ComboBoxPopup(combo_box)
+ {
+ this.ComboBox = combo_box;
+ this.ParentNode = combo_box.Node;
+ this.ValueNodes = [ ];
+
+ // Create the template node
+ this.Node = DOM.Node.CreateHTML(body_template_html);
+
+ DOM.Event.AddHandler(this.Node, "mousedown", Bind(SelectItem, this));
+ this.CancelDelegate = Bind(this, "Cancel");
+ }
+
+
+ ComboBoxPopup.prototype.SetValues = function(values)
+ {
+ // Clear existing values
+ this.Node.innerHTML = "";
+
+ // Generate HTML nodes for each value
+ this.ValueNodes = [ ];
+ for (var i in values)
+ {
+ var item_node = DOM.Node.CreateHTML(item_template_html);
+ var text_node = DOM.Node.FindWithClass(item_node, "ComboBoxPopupItemText");
+
+ item_node.Value = values[i];
+ text_node.innerHTML = values[i];
+
+ this.Node.appendChild(item_node);
+ this.ValueNodes.push(item_node);
+ }
+ }
+
+
+ ComboBoxPopup.prototype.Show = function(selection_index)
+ {
+ // Initially match the position of the parent node
+ var pos = DOM.Node.GetPosition(this.ParentNode);
+ DOM.Node.SetPosition(this.Node, pos);
+
+ // Take the width/z-index from the parent node
+ this.Node.style.width = this.ParentNode.offsetWidth;
+ this.Node.style.zIndex = this.ParentNode.style.zIndex + 1;
+
+ // Setup event handlers
+ DOM.Event.AddHandler(document.body, "mousedown", this.CancelDelegate);
+
+ // Show the popup so that the HTML layout engine kicks in before
+ // the layout info is used below
+ this.ParentNode.appendChild(this.Node);
+
+ // Show/hide the tick image based on which node is selected
+ for (var i in this.ValueNodes)
+ {
+ var node = this.ValueNodes[i];
+ var icon_node = DOM.Node.FindWithClass(node, "ComboBoxPopupItemIcon");
+
+ if (i == selection_index)
+ {
+ icon_node.style.display = "block";
+
+ // Also, shift the popup up so that the mouse is over the selected item and is highlighted
+ var item_pos = DOM.Node.GetPosition(this.ValueNodes[selection_index]);
+ var diff_pos = [ item_pos[0] - pos[0], item_pos[1] - pos[1] ];
+ pos = [ pos[0] - diff_pos[0], pos[1] - diff_pos[1] ];
+ }
+ else
+ {
+ icon_node.style.display = "none";
+ }
+ }
+
+ DOM.Node.SetPosition(this.Node, pos);
+ }
+
+
+ ComboBoxPopup.prototype.Hide = function()
+ {
+ DOM.Event.RemoveHandler(document.body, "mousedown", this.CancelDelegate);
+ this.ParentNode.removeChild(this.Node);
+ }
+
+
+ function SelectItem(self, evt)
+ {
+ // Search for which item node is being clicked on
+ var node = DOM.Event.GetNode(evt);
+ for (var i in self.ValueNodes)
+ {
+ var value_node = self.ValueNodes[i];
+ if (DOM.Node.Contains(node, value_node))
+ {
+ // Set the value on the combo box
+ self.ComboBox.SetValue(value_node.Value);
+ self.Hide();
+ break;
+ }
+ }
+ }
+
+
+ function Cancel(self, evt)
+ {
+ // Don't cancel if the mouse up is anywhere on the popup or combo box
+ var node = DOM.Event.GetNode(evt);
+ if (!DOM.Node.Contains(node, self.Node) &&
+ !DOM.Node.Contains(node, self.ParentNode))
+ {
+ self.Hide();
+ }
+
+
+ DOM.Event.StopAll(evt);
+ }
+
+
+ return ComboBoxPopup;
+})();
+
+
+WM.ComboBox = (function()
+{
+ var template_html = " \
+ <div class='ComboBox'> \
+ <div class='ComboBoxText notextsel'></div> \
+ <div class='ComboBoxIcon'><img src='BrowserLibImages/up_down.gif'></div> \
+ <div style='clear:both'></div> \
+ </div>";
+
+
+ function ComboBox()
+ {
+ this.OnChange = null;
+
+ // Create the template node and locate key nodes
+ this.Node = DOM.Node.CreateHTML(template_html);
+ this.TextNode = DOM.Node.FindWithClass(this.Node, "ComboBoxText");
+
+ // Create a reusable popup
+ this.Popup = new WM.ComboBoxPopup(this);
+
+ // Set an empty set of values
+ this.SetValues([]);
+ this.SetValue("&lt;empty&gt;");
+
+ // Create the mouse press event handlers
+ DOM.Event.AddHandler(this.Node, "mousedown", Bind(OnMouseDown, this));
+ this.OnMouseOutDelegate = Bind(OnMouseUp, this, false);
+ this.OnMouseUpDelegate = Bind(OnMouseUp, this, true);
+ }
+
+
+ ComboBox.prototype.SetOnChange = function(on_change)
+ {
+ this.OnChange = on_change;
+ }
+
+
+ ComboBox.prototype.SetValues = function(values)
+ {
+ this.Values = values;
+ this.Popup.SetValues(values);
+ }
+
+
+ ComboBox.prototype.SetValue = function(value)
+ {
+ // Set the value and its HTML rep
+ var old_value = this.Value;
+ this.Value = value;
+ this.TextNode.innerHTML = value;
+
+ // Call change handler
+ if (this.OnChange)
+ this.OnChange(value, old_value);
+ }
+
+
+ ComboBox.prototype.GetValue = function()
+ {
+ return this.Value;
+ }
+
+
+ function OnMouseDown(self, evt)
+ {
+ // If this check isn't made, the click will trigger from the popup, too
+ var node = DOM.Event.GetNode(evt);
+ if (DOM.Node.Contains(node, self.Node))
+ {
+ // Add the depression class and activate release handlers
+ DOM.Node.AddClass(self.Node, "ComboBoxPressed");
+ DOM.Event.AddHandler(self.Node, "mouseout", self.OnMouseOutDelegate);
+ DOM.Event.AddHandler(self.Node, "mouseup", self.OnMouseUpDelegate);
+
+ DOM.Event.StopAll(evt);
+ }
+ }
+
+
+ function OnMouseUp(self, confirm, evt)
+ {
+ // Remove depression class and remove release handlers
+ DOM.Node.RemoveClass(self.Node, "ComboBoxPressed");
+ DOM.Event.RemoveHandler(self.Node, "mouseout", self.OnMouseOutDelegate);
+ DOM.Event.RemoveHandler(self.Node, "mouseup", self.OnMouseUpDelegate);
+
+ // If this is a confirmed press and there are some values in the list, show the popup
+ if (confirm && self.Values.length > 0)
+ {
+ var selection_index = self.Values.indexOf(self.Value);
+ self.Popup.Show(selection_index);
+ }
+
+ DOM.Event.StopAll(evt);
+ }
+
+
+ return ComboBox;
+})();
diff --git a/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/WindowManager/Code/Container.js b/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/WindowManager/Code/Container.js
new file mode 100644
index 00000000000..2ba1388d146
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/WindowManager/Code/Container.js
@@ -0,0 +1,34 @@
+
+namespace("WM");
+
+
+WM.Container = (function()
+{
+ var template_html = "<div class='Container'></div>";
+
+
+ function Container(x, y, w, h)
+ {
+ // Create a simple container node
+ this.Node = DOM.Node.CreateHTML(template_html);
+ this.SetPosition(x, y);
+ this.SetSize(w, h);
+ }
+
+
+ Container.prototype.SetPosition = function(x, y)
+ {
+ this.Position = [ x, y ];
+ DOM.Node.SetPosition(this.Node, this.Position);
+ }
+
+
+ Container.prototype.SetSize = function(w, h)
+ {
+ this.Size = [ w, h ];
+ DOM.Node.SetSize(this.Node, this.Size);
+ }
+
+
+ return Container;
+})(); \ No newline at end of file
diff --git a/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/WindowManager/Code/EditBox.js b/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/WindowManager/Code/EditBox.js
new file mode 100644
index 00000000000..b78c9725d53
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/WindowManager/Code/EditBox.js
@@ -0,0 +1,117 @@
+
+namespace("WM");
+
+
+WM.EditBox = (function()
+{
+ var template_html = " \
+ <div class='EditBoxContainer'> \
+ <div class='EditBoxLabel'>Label</div> \
+ <input class='EditBox'> \
+ </div>";
+
+
+ function EditBox(x, y, w, h, label, text)
+ {
+ this.ChangeHandler = null;
+
+ // Create node and locate its internal nodes
+ this.Node = DOM.Node.CreateHTML(template_html);
+ this.LabelNode = DOM.Node.FindWithClass(this.Node, "EditBoxLabel");
+ this.EditNode = DOM.Node.FindWithClass(this.Node, "EditBox");
+
+ // Set label and value
+ this.LabelNode.innerHTML = label;
+ this.SetValue(text);
+
+ this.SetPosition(x, y);
+ this.SetSize(w, h);
+
+ // Hook up the event handlers
+ DOM.Event.AddHandler(this.EditNode, "focus", Bind(OnFocus, this));
+ DOM.Event.AddHandler(this.EditNode, "keypress", Bind(OnKeyPress, this));
+ DOM.Event.AddHandler(this.EditNode, "keydown", Bind(OnKeyDown, this));
+ DOM.Event.AddHandler(this.EditNode, "change", Bind(OnChange, this));
+ }
+
+
+ EditBox.prototype.SetPosition = function(x, y)
+ {
+ this.Position = [ x, y ];
+ DOM.Node.SetPosition(this.Node, this.Position);
+ }
+
+
+ EditBox.prototype.SetSize = function(w, h)
+ {
+ this.Size = [ w, h ];
+ DOM.Node.SetSize(this.EditNode, this.Size);
+ }
+
+
+ EditBox.prototype.SetChangeHandler = function(handler)
+ {
+ this.ChangeHandler = handler;
+ }
+
+
+ EditBox.prototype.SetValue = function(value)
+ {
+ if (this.EditNode)
+ this.EditNode.value = value;
+ }
+
+
+ EditBox.prototype.GetValue = function()
+ {
+ if (this.EditNode)
+ return this.EditNode.value;
+
+ return null;
+ }
+
+
+ EditBox.prototype.LoseFocus = function()
+ {
+ if (this.EditNode)
+ this.EditNode.blur();
+ }
+
+
+ function OnFocus(self, evt)
+ {
+ // Backup on focus
+ self.PreviousValue = self.EditNode.value;
+ }
+
+
+ function OnKeyPress(self, evt)
+ {
+ // Allow enter to confirm the text only when there's data
+ if (evt.keyCode == 13 && self.EditNode.value != "")
+ {
+ self.EditNode.blur();
+ }
+ }
+
+
+ function OnKeyDown(self, evt)
+ {
+ // Allow escape to cancel any text changes
+ if (evt.keyCode == 27)
+ {
+ self.EditNode.value = self.PreviousValue;
+ self.EditNode.blur();
+ }
+ }
+
+
+ function OnChange(self, evt)
+ {
+ if (self.ChangeHandler)
+ self.ChangeHandler(self.EditNode);
+ }
+
+
+ return EditBox;
+})();
diff --git a/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/WindowManager/Code/Grid.js b/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/WindowManager/Code/Grid.js
new file mode 100644
index 00000000000..4c35cef91e2
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/WindowManager/Code/Grid.js
@@ -0,0 +1,252 @@
+
+namespace("WM");
+
+
+WM.GridRows = (function()
+{
+ function GridRows(parent_object)
+ {
+ this.ParentObject = parent_object;
+
+ // Array of rows in the order they were added
+ this.Rows = [ ];
+
+ // Collection of custom row indexes for fast lookup
+ this.Indexes = { };
+ }
+
+
+ GridRows.prototype.AddIndex = function(cell_field_name)
+ {
+ var index = { };
+
+ // Go through existing rows and add to the index
+ for (var i in this.Rows)
+ {
+ var row = this.Rows[i];
+ if (cell_field_name in row.CellData)
+ {
+ var cell_field = row.CellData[cell_field_name];
+ index[cell_field] = row;
+ }
+ }
+
+ this.Indexes[cell_field_name] = index;
+ }
+
+
+ GridRows.prototype.ClearIndex = function(index_name)
+ {
+ this.Indexes[index_name] = { };
+ }
+
+ GridRows.prototype.AddRowToIndex = function(index_name, cell_data, row)
+ {
+ this.Indexes[index_name][cell_data] = row;
+ }
+
+
+ GridRows.prototype.Add = function(cell_data, row_classes, cell_classes)
+ {
+ var row = new WM.GridRow(this.ParentObject, cell_data, row_classes, cell_classes);
+ this.Rows.push(row);
+ return row;
+ }
+
+
+ GridRows.prototype.GetBy = function(cell_field_name, cell_data)
+ {
+ var index = this.Indexes[cell_field_name];
+ return index[cell_data];
+ }
+
+
+ GridRows.prototype.Clear = function()
+ {
+ // Remove all node references from the parent
+ for (var i in this.Rows)
+ {
+ var row = this.Rows[i];
+ row.Parent.BodyNode.removeChild(row.Node);
+ }
+
+ // Clear all indexes
+ for (var i in this.Indexes)
+ this.Indexes[i] = { };
+
+ this.Rows = [ ];
+ }
+
+
+ return GridRows;
+})();
+
+
+WM.GridRow = (function()
+{
+ var template_html = "<div class='GridRow'></div>";
+
+
+ //
+ // 'cell_data' is an object with a variable number of fields.
+ // Any fields prefixed with an underscore are hidden.
+ //
+ function GridRow(parent, cell_data, row_classes, cell_classes)
+ {
+ // Setup data
+ this.Parent = parent;
+ this.IsOpen = true;
+ this.AnimHandle = null;
+ this.Rows = new WM.GridRows(this);
+ this.CellData = cell_data;
+ this.CellNodes = { }
+
+ // Create the main row node
+ this.Node = DOM.Node.CreateHTML(template_html);
+ if (row_classes)
+ DOM.Node.AddClass(this.Node, row_classes);
+
+ // Embed a pointer to the row in the root node so that it can be clicked
+ this.Node.GridRow = this;
+
+ // Create nodes for each required cell
+ for (var attr in this.CellData)
+ {
+ if (this.CellData.hasOwnProperty(attr))
+ {
+ var data = this.CellData[attr];
+
+ // Update any grid row index references
+ if (attr in parent.Rows.Indexes)
+ parent.Rows.AddRowToIndex(attr, data, this);
+
+ // Hide any cells with underscore prefixes
+ if (attr[0] == "_")
+ continue;
+
+ // Create a node for the cell and add any custom classes
+ var node = DOM.Node.AppendHTML(this.Node, "<div class='GridRowCell'></div>");
+ if (cell_classes && attr in cell_classes)
+ DOM.Node.AddClass(node, cell_classes[attr]);
+ this.CellNodes[attr] = node;
+
+ // If this is a Window Control, add its node to the cell
+ if (data instanceof Object && "Node" in data && DOM.Node.IsNode(data.Node))
+ {
+ data.ParentNode = node;
+ node.appendChild(data.Node);
+ }
+
+ else
+ {
+ // Otherwise just assign the data as text
+ node.innerHTML = data;
+ }
+ }
+ }
+
+ // Add the body node for any children
+ DOM.Node.AppendClearFloat(this.Node);
+ this.BodyNode = DOM.Node.AppendHTML(this.Node, "<div class='GridRowBody'></div>");
+
+ // Add the row to the parent
+ this.Parent.BodyNode.appendChild(this.Node);
+ }
+
+
+ GridRow.prototype.Open = function()
+ {
+ // Don't allow open while animating
+ if (this.AnimHandle == null || this.AnimHandle.Complete)
+ {
+ this.IsOpen = true;
+
+ // Kick off open animation
+ var node = this.BodyNode;
+ this.AnimHandle = Anim.Animate(
+ function (val) { DOM.Node.SetHeight(node, val) },
+ 0, this.Height, 0.2);
+ }
+ }
+
+
+ GridRow.prototype.Close = function()
+ {
+ // Don't allow close while animating
+ if (this.AnimHandle == null || this.AnimHandle.Complete)
+ {
+ this.IsOpen = false;
+
+ // Record height for the next open request
+ this.Height = this.BodyNode.offsetHeight;
+
+ // Kick off close animation
+ var node = this.BodyNode;
+ this.AnimHandle = Anim.Animate(
+ function (val) { DOM.Node.SetHeight(node, val) },
+ this.Height, 0, 0.2);
+ }
+ }
+
+
+ GridRow.prototype.Toggle = function()
+ {
+ if (this.IsOpen)
+ this.Close();
+ else
+ this.Open();
+ }
+
+
+ return GridRow;
+})();
+
+
+WM.Grid = (function()
+{
+ var template_html = " \
+ <div class='Grid'> \
+ <div class='GridBody'></div> \
+ </div>";
+
+
+ function Grid(x, y, width, height)
+ {
+ this.Rows = new WM.GridRows(this);
+
+ this.Node = DOM.Node.CreateHTML(template_html);
+ this.BodyNode = DOM.Node.FindWithClass(this.Node, "GridBody");
+
+ DOM.Node.SetPosition(this.Node, [ x, y ]);
+ DOM.Node.SetSize(this.Node, [ width, height ]);
+
+ DOM.Event.AddHandler(this.Node, "dblclick", OnDblClick);
+
+ var mouse_wheel_event = (/Firefox/i.test(navigator.userAgent)) ? "DOMMouseScroll" : "mousewheel";
+ DOM.Event.AddHandler(this.Node, mouse_wheel_event, Bind(OnMouseScroll, this));
+ }
+
+
+ function OnDblClick(evt)
+ {
+ // Clicked on a header?
+ var node = DOM.Event.GetNode(evt);
+ if (DOM.Node.HasClass(node, "GridRowName"))
+ {
+ // Toggle rows open/close
+ var row = node.parentNode.GridRow;
+ if (row)
+ row.Toggle();
+ }
+ }
+
+
+ function OnMouseScroll(self, evt)
+ {
+ var mouse_state = new Mouse.State(evt);
+ self.Node.scrollTop -= mouse_state.WheelDelta * 20;
+ }
+
+
+ return Grid;
+})();
diff --git a/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/WindowManager/Code/Label.js b/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/WindowManager/Code/Label.js
new file mode 100644
index 00000000000..9b1d8525117
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/WindowManager/Code/Label.js
@@ -0,0 +1,31 @@
+
+namespace("WM");
+
+
+WM.Label = (function()
+{
+ var template_html = "<div class='Label'></div>";
+
+
+ function Label(x, y, text)
+ {
+ // Create the node
+ this.Node = DOM.Node.CreateHTML(template_html);
+
+ // Allow position to be optional
+ if (x != null && y != null)
+ DOM.Node.SetPosition(this.Node, [x, y]);
+
+ this.SetText(text);
+ }
+
+
+ Label.prototype.SetText = function(text)
+ {
+ if (text != null)
+ this.Node.innerHTML = text;
+ }
+
+
+ return Label;
+})(); \ No newline at end of file
diff --git a/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/WindowManager/Code/Treeview.js b/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/WindowManager/Code/Treeview.js
new file mode 100644
index 00000000000..66ef80ed1fe
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/WindowManager/Code/Treeview.js
@@ -0,0 +1,352 @@
+
+namespace("WM");
+
+
+WM.Treeview = (function()
+{
+ var Margin = 10;
+
+
+ var tree_template_html = " \
+ <div class='Treeview'> \
+ <div class='TreeviewItemChildren' style='width:90%;float:left'></div> \
+ <div class='TreeviewScrollbarInset'> \
+ <div class='TreeviewScrollbar'></div> \
+ </div> \
+ <div style='clear:both'></div> \
+ </div>";
+
+
+ var item_template_html = " \
+ <div class='TreeViewItem basicfont notextsel'> \
+ <img src='' class='TreeviewItemImage'> \
+ <div class='TreeviewItemText'></div> \
+ <div style='clear:both'></div> \
+ <div class='TreeviewItemChildren'></div> \
+ <div style='clear:both'></div> \
+ </div>";
+
+
+ // TODO: Remove parent_node (required for stuff that doesn't use the WM yet)
+ function Treeview(x, y, width, height, parent_node)
+ {
+ // Cache initialisation options
+ this.ParentNode = parent_node;
+ this.Position = [ x, y ];
+ this.Size = [ width, height ];
+
+ this.Node = null;
+ this.ScrollbarNode = null;
+ this.SelectedItem = null;
+ this.ContentsNode = null;
+
+ // Setup options
+ this.HighlightOnHover = false;
+ this.EnableScrollbar = true;
+ this.HorizontalLayoutDepth = 1;
+
+ // Generate an empty tree
+ this.Clear();
+ }
+
+
+ Treeview.prototype.SetHighlightOnHover = function(highlight)
+ {
+ this.HighlightOnHover = highlight;
+ }
+
+
+ Treeview.prototype.SetEnableScrollbar = function(enable)
+ {
+ this.EnableScrollbar = enable;
+ }
+
+
+ Treeview.prototype.SetHorizontalLayoutDepth = function(depth)
+ {
+ this.HorizontalLayoutDepth = depth;
+ }
+
+
+ Treeview.prototype.SetNodeSelectedHandler = function(handler)
+ {
+ this.NodeSelectedHandler = handler;
+ }
+
+
+ Treeview.prototype.Clear = function()
+ {
+ this.RootItem = new WM.TreeviewItem(this, null, null, null, null);
+ this.GenerateHTML();
+ }
+
+
+ Treeview.prototype.Root = function()
+ {
+ return this.RootItem;
+ }
+
+
+ Treeview.prototype.ClearSelection = function()
+ {
+ if (this.SelectedItem != null)
+ {
+ DOM.Node.RemoveClass(this.SelectedItem.Node, "TreeviewItemSelected");
+ this.SelectedItem = null;
+ }
+ }
+
+
+ Treeview.prototype.SelectItem = function(item, mouse_pos)
+ {
+ // Notify the select handler
+ if (this.NodeSelectedHandler)
+ this.NodeSelectedHandler(item.Node, this.SelectedItem, item, mouse_pos);
+
+ // Remove highlight from the old selection
+ this.ClearSelection();
+
+ // Swap in new selection and apply highlight
+ this.SelectedItem = item;
+ DOM.Node.AddClass(this.SelectedItem.Node, "TreeviewItemSelected");
+ }
+
+
+ Treeview.prototype.GenerateHTML = function()
+ {
+ // Clone the template and locate important nodes
+ var old_node = this.Node;
+ this.Node = DOM.Node.CreateHTML(tree_template_html);
+ this.ChildrenNode = DOM.Node.FindWithClass(this.Node, "TreeviewItemChildren");
+ this.ScrollbarNode = DOM.Node.FindWithClass(this.Node, "TreeviewScrollbar");
+
+ DOM.Node.SetPosition(this.Node, this.Position);
+ DOM.Node.SetSize(this.Node, this.Size);
+
+ // Generate the contents of the treeview
+ GenerateTree(this, this.ChildrenNode, this.RootItem.Children, 0);
+
+ // Cross-browser (?) means of adding a mouse wheel handler
+ var mouse_wheel_event = (/Firefox/i.test(navigator.userAgent)) ? "DOMMouseScroll" : "mousewheel";
+ DOM.Event.AddHandler(this.Node, mouse_wheel_event, Bind(OnMouseScroll, this));
+
+ DOM.Event.AddHandler(this.Node, "dblclick", Bind(OnMouseDoubleClick, this));
+ DOM.Event.AddHandler(this.Node, "mousedown", Bind(OnMouseDown, this));
+ DOM.Event.AddHandler(this.Node, "mouseup", OnMouseUp);
+
+ // Swap in the newly generated control node if it's already been attached to a parent
+ if (old_node && old_node.parentNode)
+ {
+ old_node.parentNode.removeChild(old_node);
+ this.ParentNode.appendChild(this.Node);
+ }
+
+ if (this.EnableScrollbar)
+ {
+ this.UpdateScrollbar();
+ DOM.Event.AddHandler(this.ScrollbarNode, "mousedown", Bind(OnMouseDown_Scrollbar, this));
+ DOM.Event.AddHandler(this.ScrollbarNode, "mouseup", Bind(OnMouseUp_Scrollbar, this));
+ DOM.Event.AddHandler(this.ScrollbarNode, "mouseout", Bind(OnMouseUp_Scrollbar, this));
+ DOM.Event.AddHandler(this.ScrollbarNode, "mousemove", Bind(OnMouseMove_Scrollbar, this));
+ }
+
+ else
+ {
+ DOM.Node.Hide(DOM.Node.FindWithClass(this.Node, "TreeviewScrollbarInset"));
+ }
+ }
+
+
+ Treeview.prototype.UpdateScrollbar = function()
+ {
+ if (!this.EnableScrollbar)
+ return;
+
+ var scrollbar_scale = Math.min((this.Node.offsetHeight - Margin * 2) / this.ChildrenNode.offsetHeight, 1);
+ this.ScrollbarNode.style.height = parseInt(scrollbar_scale * 100) + "%";
+
+ // Shift the scrollbar container along with the parent window
+ this.ScrollbarNode.parentNode.style.top = this.Node.scrollTop;
+
+ var scroll_fraction = this.Node.scrollTop / (this.Node.scrollHeight - this.Node.offsetHeight);
+ var max_height = this.Node.offsetHeight - Margin;
+ var max_scrollbar_offset = max_height - this.ScrollbarNode.offsetHeight;
+ var scrollbar_offset = scroll_fraction * max_scrollbar_offset;
+ this.ScrollbarNode.style.top = scrollbar_offset;
+ }
+
+
+ function GenerateTree(self, parent_node, items, depth)
+ {
+ if (items.length == 0)
+ return null;
+
+ for (var i in items)
+ {
+ var item = items[i];
+
+ // Create the node for this item and locate important nodes
+ var node = DOM.Node.CreateHTML(item_template_html);
+ var img = DOM.Node.FindWithClass(node, "TreeviewItemImage");
+ var text = DOM.Node.FindWithClass(node, "TreeviewItemText");
+ var children = DOM.Node.FindWithClass(node, "TreeviewItemChildren");
+
+ // Attach the item to the node
+ node.TreeviewItem = item;
+ item.Node = node;
+
+ // Add the class which highlights selection on hover
+ if (self.HighlightOnHover)
+ DOM.Node.AddClass(node, "TreeviewItemHover");
+
+ // Instruct the children to wrap around
+ if (depth >= self.HorizontalLayoutDepth)
+ node.style.cssFloat = "left";
+
+ if (item.OpenImage == null || item.CloseImage == null)
+ {
+ // If there no images, remove the image node
+ node.removeChild(img);
+ }
+ else
+ {
+ // Set the image source to open
+ img.src = item.OpenImage.src;
+ img.style.width = item.OpenImage.width;
+ img.style.height = item.OpenImage.height;
+ item.ImageNode = img;
+ }
+
+ // Setup the text to display
+ text.innerHTML = item.Label;
+
+ // Add the div to the parent and recurse into children
+ parent_node.appendChild(node);
+ GenerateTree(self, children, item.Children, depth + 1);
+ item.ChildrenNode = children;
+ }
+
+ // Clear the wrap-around
+ if (depth >= self.HorizontalLayoutDepth)
+ DOM.Node.AppendClearFloat(parent_node.parentNode);
+ }
+
+
+ function OnMouseScroll(self, evt)
+ {
+ // Get mouse wheel movement
+ var delta = evt.detail ? evt.detail * -1 : evt.wheelDelta;
+ delta *= 8;
+
+ // Scroll the main window with wheel movement and clamp
+ self.Node.scrollTop -= delta;
+ self.Node.scrollTop = Math.min(self.Node.scrollTop, (self.ChildrenNode.offsetHeight - self.Node.offsetHeight) + Margin * 2);
+
+ self.UpdateScrollbar();
+ }
+
+
+ function OnMouseDoubleClick(self, evt)
+ {
+ DOM.Event.StopDefaultAction(evt);
+
+ // Get the tree view item being clicked, if any
+ var node = DOM.Event.GetNode(evt);
+ var tvitem = GetTreeviewItemFromNode(self, node);
+ if (tvitem == null)
+ return;
+
+ if (tvitem.Children.length)
+ tvitem.Toggle();
+ }
+
+
+ function OnMouseDown(self, evt)
+ {
+ DOM.Event.StopDefaultAction(evt);
+
+ // Get the tree view item being clicked, if any
+ var node = DOM.Event.GetNode(evt);
+ var tvitem = GetTreeviewItemFromNode(self, node);
+ if (tvitem == null)
+ return;
+
+ // If clicking on the image, expand any children
+ if (node.tagName == "IMG" && tvitem.Children.length)
+ {
+ tvitem.Toggle();
+ }
+
+ else
+ {
+ var mouse_pos = DOM.Event.GetMousePosition(evt);
+ self.SelectItem(tvitem, mouse_pos);
+ }
+ }
+
+
+ function OnMouseUp(evt)
+ {
+ // Event handler used merely to stop events bubbling up to containers
+ DOM.Event.StopPropagation(evt);
+ }
+
+
+ function OnMouseDown_Scrollbar(self, evt)
+ {
+ self.ScrollbarHeld = true;
+
+ // Cache the mouse height relative to the scrollbar
+ self.LastY = evt.clientY;
+ self.ScrollY = self.Node.scrollTop;
+
+ DOM.Node.AddClass(self.ScrollbarNode, "TreeviewScrollbarHeld");
+ DOM.Event.StopDefaultAction(evt);
+ }
+
+
+ function OnMouseUp_Scrollbar(self, evt)
+ {
+ self.ScrollbarHeld = false;
+ DOM.Node.RemoveClass(self.ScrollbarNode, "TreeviewScrollbarHeld");
+ }
+
+
+ function OnMouseMove_Scrollbar(self, evt)
+ {
+ if (self.ScrollbarHeld)
+ {
+ var delta_y = evt.clientY - self.LastY;
+ self.LastY = evt.clientY;
+
+ var max_height = self.Node.offsetHeight - Margin;
+ var max_scrollbar_offset = max_height - self.ScrollbarNode.offsetHeight;
+ var max_contents_scroll = self.Node.scrollHeight - self.Node.offsetHeight;
+ var scale = max_contents_scroll / max_scrollbar_offset;
+
+ // Increment the local float variable and assign, as scrollTop is of type int
+ self.ScrollY += delta_y * scale;
+ self.Node.scrollTop = self.ScrollY;
+ self.Node.scrollTop = Math.min(self.Node.scrollTop, (self.ChildrenNode.offsetHeight - self.Node.offsetHeight) + Margin * 2);
+
+ self.UpdateScrollbar();
+ }
+ }
+
+
+ function GetTreeviewItemFromNode(self, node)
+ {
+ // Walk up toward the tree view node looking for this first item
+ while (node && node != self.Node)
+ {
+ if ("TreeviewItem" in node)
+ return node.TreeviewItem;
+
+ node = node.parentNode;
+ }
+
+ return null;
+ }
+
+ return Treeview;
+})();
diff --git a/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/WindowManager/Code/TreeviewItem.js b/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/WindowManager/Code/TreeviewItem.js
new file mode 100644
index 00000000000..ac6133e820a
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/WindowManager/Code/TreeviewItem.js
@@ -0,0 +1,109 @@
+
+namespace("WM");
+
+
+WM.TreeviewItem = (function()
+{
+ function TreeviewItem(treeview, name, data, open_image, close_image)
+ {
+ // Assign members
+ this.Treeview = treeview;
+ this.Label = name;
+ this.Data = data;
+ this.OpenImage = open_image;
+ this.CloseImage = close_image;
+
+ this.Children = [ ];
+
+ // The HTML node wrapping the item and its children
+ this.Node = null;
+
+ // The HTML node storing the image for the open/close state feedback
+ this.ImageNode = null;
+
+ // The HTML node storing just the children
+ this.ChildrenNode = null;
+
+ // Animation handle for opening and closing the child nodes, only used
+ // if the tree view item as children
+ this.AnimHandle = null;
+
+ // Open state of the item
+ this.IsOpen = true;
+ }
+
+
+ TreeviewItem.prototype.AddItem = function(name, data, open_image, close_image)
+ {
+ var item = new WM.TreeviewItem(this.Treeview, name, data, open_image, close_image);
+ this.Children.push(item);
+ return item;
+ }
+
+
+ TreeviewItem.prototype.Open = function()
+ {
+ if (this.AnimHandle == null || this.AnimHandle.Complete)
+ {
+ // Swap to the open state
+ this.IsOpen = true;
+ if (this.ImageNode != null && this.OpenImage != null)
+ this.ImageNode.src = this.OpenImage.src;
+
+ // Cache for closure binding
+ var child_node = this.ChildrenNode;
+ var end_height = this.StartHeight;
+ var treeview = this.Treeview;
+
+ // Reveal the children and animate their height to max
+ this.ChildrenNode.style.display = "block";
+ this.AnimHandle = Anim.Animate(
+ function (val) { DOM.Node.SetHeight(child_node, val) },
+ 0, end_height, 0.2,
+ function() { treeview.UpdateScrollbar(); });
+
+ // Fade the children in
+ Anim.Animate(function(val) { DOM.Node.SetOpacity(child_node, val) }, 0, 1, 0.2);
+ }
+ }
+
+
+ TreeviewItem.prototype.Close = function()
+ {
+ if (this.AnimHandle == null || this.AnimHandle.Complete)
+ {
+ // Swap to the close state
+ this.IsOpen = false;
+ if (this.ImageNode != null && this.CloseImage != null)
+ this.ImageNode.src = this.CloseImage.src;
+
+ // Cache for closure binding
+ var child_node = this.ChildrenNode;
+ var treeview = this.Treeview;
+
+ // Mark the height of the item for reload later
+ this.StartHeight = child_node.offsetHeight;
+
+ // Shrink the height of the children and hide them upon completion
+ this.AnimHandle = Anim.Animate(
+ function (val) { DOM.Node.SetHeight(child_node, val) },
+ this.ChildrenNode.offsetHeight, 0, 0.2,
+ function() { child_node.style.display = "none"; treeview.UpdateScrollbar(); });
+
+ // Fade the children out
+ Anim.Animate(function(val) { DOM.Node.SetOpacity(child_node, val) }, 1, 0, 0.2);
+ }
+ }
+
+
+ TreeviewItem.prototype.Toggle = function()
+ {
+ if (this.IsOpen)
+ this.Close();
+ else
+ this.Open();
+ }
+
+
+ return TreeviewItem;
+})();
diff --git a/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/WindowManager/Code/Window.js b/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/WindowManager/Code/Window.js
new file mode 100644
index 00000000000..e5e986f7d04
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/WindowManager/Code/Window.js
@@ -0,0 +1,243 @@
+
+namespace("WM");
+
+
+WM.Window = (function()
+{
+ var template_html = " \
+ <div class='Window'> \
+ <div class='WindowTitleBar'> \
+ <div class='WindowTitleBarText notextsel' style='float:left'>Window Title Bar</div> \
+ <div class='WindowTitleBarClose notextsel' style='float:right'>O</div> \
+ </div> \
+ <div class='WindowBody'> \
+ </div> \
+ </div>";
+
+
+ function Window(manager, title, x, y, width, height, parent_node)
+ {
+ this.Manager = manager;
+ this.ParentNode = parent_node || document.body;
+ this.OnMove = null;
+ this.Visible = false;
+ this.AnimatedShow = false;
+
+ // Clone the window template and locate key nodes within it
+ this.Node = DOM.Node.CreateHTML(template_html);
+ this.TitleBarNode = DOM.Node.FindWithClass(this.Node, "WindowTitleBar");
+ this.TitleBarTextNode = DOM.Node.FindWithClass(this.Node, "WindowTitleBarText");
+ this.TitleBarCloseNode = DOM.Node.FindWithClass(this.Node, "WindowTitleBarClose");
+ this.BodyNode = DOM.Node.FindWithClass(this.Node, "WindowBody");
+
+ // Setup the position and dimensions of the window
+ this.SetPosition(x, y);
+ this.SetSize(width, height);
+
+ // Set the title text
+ this.TitleBarTextNode.innerHTML = title;
+
+ // Hook up event handlers
+ DOM.Event.AddHandler(this.Node, "mousedown", Bind(this, "SetTop"));
+ DOM.Event.AddHandler(this.TitleBarNode, "mousedown", Bind(this, "BeginMove"));
+ DOM.Event.AddHandler(this.TitleBarCloseNode, "mousedown", Bind(this, "Hide"));
+
+ // Create delegates for removable handlers
+ this.MoveDelegate = Bind(this, "Move");
+ this.EndMoveDelegate = Bind(this, "EndMove");
+ }
+
+
+ Window.prototype.SetOnMove = function(on_move)
+ {
+ this.OnMove = on_move;
+ }
+
+
+ Window.prototype.Show = function()
+ {
+ if (this.Node.parentNode != this.ParentNode)
+ {
+ this.ShowNoAnim();
+ Anim.Animate(Bind(this, "OpenAnimation"), 0, 1, 1);
+ }
+ }
+
+
+ Window.prototype.ShowNoAnim = function()
+ {
+ // Add to the document
+ this.ParentNode.appendChild(this.Node);
+ this.AnimatedShow = false;
+ this.Visible = true;
+ }
+
+
+ Window.prototype.Hide = function()
+ {
+ if (this.Node.parentNode == this.ParentNode)
+ {
+ if (this.AnimatedShow)
+ {
+ // Trigger animation that ends with removing the window from the document
+ Anim.Animate(
+ Bind(this, "CloseAnimation"),
+ 0, 1, 0.25,
+ Bind(this, "HideNoAnim"));
+ }
+ else
+ {
+ this.HideNoAnim();
+ }
+ }
+ }
+
+
+ Window.prototype.HideNoAnim = function()
+ {
+ // Remove node
+ this.ParentNode.removeChild(this.Node);
+ this.Visible = false;
+ }
+
+
+ Window.prototype.SetTop = function()
+ {
+ this.Manager.SetTopWindow(this);
+ }
+
+
+
+ Window.prototype.SetTitle = function(title)
+ {
+ this.TitleBarTextNode.innerHTML = title;
+ }
+
+
+ // TODO: Update this
+ Window.prototype.AddControl = function(control)
+ {
+ // Get all arguments to this function and replace the first with this window node
+ var args = [].slice.call(arguments);
+ args[0] = this.BodyNode;
+
+ // Create the control and call its Init method with the modified arguments
+ var instance = new control();
+ instance.Init.apply(instance, args);
+
+ return instance;
+ }
+
+
+ Window.prototype.AddControlNew = function(control)
+ {
+ control.ParentNode = this.BodyNode;
+ this.BodyNode.appendChild(control.Node);
+ return control;
+ }
+
+
+ Window.prototype.Scale = function(t)
+ {
+ // Calculate window bounds centre/extents
+ var ext_x = this.Size[0] / 2;
+ var ext_y = this.Size[1] / 2;
+ var mid_x = this.Position[0] + ext_x;
+ var mid_y = this.Position[1] + ext_y;
+
+ // Scale from the mid-point
+ DOM.Node.SetPosition(this.Node, [ mid_x - ext_x * t, mid_y - ext_y * t ]);
+ DOM.Node.SetSize(this.Node, [ this.Size[0] * t, this.Size[1] * t ]);
+ }
+
+
+ Window.prototype.OpenAnimation = function(val)
+ {
+ // Power ease in
+ var t = 1 - Math.pow(1 - val, 8);
+ this.Scale(t);
+ DOM.Node.SetOpacity(this.Node, 1 - Math.pow(1 - val, 8));
+ this.AnimatedShow = true;
+ }
+
+
+ Window.prototype.CloseAnimation = function(val)
+ {
+ // Power ease out
+ var t = 1 - Math.pow(val, 4);
+ this.Scale(t);
+ DOM.Node.SetOpacity(this.Node, t);
+ }
+
+
+ Window.prototype.NotifyChange = function()
+ {
+ if (this.OnMove)
+ {
+ var pos = DOM.Node.GetPosition(this.Node);
+ this.OnMove(this, pos);
+ }
+ }
+
+
+ Window.prototype.BeginMove = function(evt)
+ {
+ // Calculate offset of the window from the mouse down position
+ var mouse_pos = DOM.Event.GetMousePosition(evt);
+ this.Offset = [ mouse_pos[0] - this.Position[0], mouse_pos[1] - this.Position[1] ];
+
+ // Dynamically add handlers for movement and release
+ DOM.Event.AddHandler(document, "mousemove", this.MoveDelegate);
+ DOM.Event.AddHandler(document, "mouseup", this.EndMoveDelegate);
+
+ DOM.Event.StopDefaultAction(evt);
+ }
+
+
+ Window.prototype.Move = function(evt)
+ {
+ // Use the offset at the beginning of movement to drag the window around
+ var mouse_pos = DOM.Event.GetMousePosition(evt);
+ var offset = this.Offset;
+ var pos = [ mouse_pos[0] - offset[0], mouse_pos[1] - offset[1] ];
+ this.SetPosition(pos[0], pos[1]);
+
+ if (this.OnMove)
+ this.OnMove(this, pos);
+
+ DOM.Event.StopDefaultAction(evt);
+ }
+
+
+ Window.prototype.EndMove = function(evt)
+ {
+ // Remove handlers added during mouse down
+ DOM.Event.RemoveHandler(document, "mousemove", this.MoveDelegate);
+ DOM.Event.RemoveHandler(document, "mouseup", this.EndMoveDelegate);
+
+ DOM.Event.StopDefaultAction(evt);
+ }
+
+
+ Window.prototype.SetPosition = function(x, y)
+ {
+ this.Position = [ x, y ];
+ DOM.Node.SetPosition(this.Node, this.Position);
+ }
+
+
+ Window.prototype.SetSize = function(w, h)
+ {
+ this.Size = [ w, h ];
+ DOM.Node.SetSize(this.Node, this.Size);
+ }
+
+
+ Window.prototype.GetZIndex = function()
+ {
+ return parseInt(this.Node.style.zIndex);
+ }
+
+
+ return Window;
+})(); \ No newline at end of file
diff --git a/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/WindowManager/Code/WindowManager.js b/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/WindowManager/Code/WindowManager.js
new file mode 100644
index 00000000000..bef33c2f1f0
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/WindowManager/Code/WindowManager.js
@@ -0,0 +1,54 @@
+
+namespace("WM");
+
+
+WM.WindowManager = (function()
+{
+ function WindowManager()
+ {
+ // An empty list of windows under window manager control
+ this.Windows = [ ];
+ }
+
+
+ WindowManager.prototype.AddWindow = function(title, x, y, width, height, parent_node)
+ {
+ // Create the window and add it to the list of windows
+ var wnd = new WM.Window(this, title, x, y, width, height, parent_node);
+ this.Windows.push(wnd);
+
+ // Always bring to the top on creation
+ wnd.SetTop();
+
+ return wnd;
+ }
+
+
+ WindowManager.prototype.SetTopWindow = function(top_wnd)
+ {
+ // Bring the window to the top of the window list
+ var top_wnd_index = this.Windows.indexOf(top_wnd);
+ if (top_wnd_index != -1)
+ this.Windows.splice(top_wnd_index, 1);
+ this.Windows.push(top_wnd);
+
+ // Set a CSS z-index for each visible window from the bottom up
+ for (var i in this.Windows)
+ {
+ var wnd = this.Windows[i];
+ if (!wnd.Visible)
+ continue;
+
+ // Ensure there's space between each window for the elements inside to be sorted
+ var z = (parseInt(i) + 1) * 10;
+ wnd.Node.style.zIndex = z;
+
+ // Notify window that its z-order has changed
+ wnd.NotifyChange();
+ }
+ }
+
+
+ return WindowManager;
+
+})(); \ No newline at end of file
diff --git a/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/WindowManager/Styles/WindowManager.css b/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/WindowManager/Styles/WindowManager.css
new file mode 100644
index 00000000000..169a57ded9d
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/remotery/vis/extern/BrowserLib/WindowManager/Styles/WindowManager.css
@@ -0,0 +1,546 @@
+
+
+.notextsel
+{
+ /* Disable text selection so that it doesn't interfere with button-clicking */
+ user-select:none;
+
+ /* Stops the text cursor over the label */
+ cursor:default;
+}
+
+
+
+/* ------------------------------------------------------------------------------------------------------------------ */
+/* Window Styles */
+/* ------------------------------------------------------------------------------------------------------------------ */
+
+
+
+.Window
+{
+ /* Allows movement of the window to exceed browser region without triggering scroll bars */
+ position:fixed;
+
+ /* Clip all contents to the window border */
+ overflow: hidden;
+
+ background: #404040;
+
+ border-radius: 5px;
+ -moz-border-radius: 5px;
+
+ -webkit-box-shadow: 3px 3px 3px #111, 1px 1px 1px #606060 inset;
+ box-shadow: 3px 3px 3px #111, 1px 1px 1px #606060 inset;
+}
+
+.Window_Transparent
+{
+ /* Set transparency changes to fade in/out */
+ opacity: 0.5;
+ transition: opacity 0.5s ease-out;
+ -moz-transition: opacity 0.5s ease-out;
+ -webkit-transition: opacity 0.5s ease-out;
+}
+
+.Window_Transparent:hover
+{
+ opacity: 1;
+}
+
+.WindowTitleBar
+{
+ height: 17px;
+ cursor: move;
+
+ border-bottom: 1px solid #303030;
+ border-radius: 5px;
+}
+
+.WindowTitleBarText
+{
+ color: #BBB;
+ font: 9px Verdana;
+
+ padding: 3px;
+ cursor: move;
+}
+
+.WindowTitleBarClose
+{
+ color: #999999;
+ font: 9px Verdana;
+
+ padding: 3px;
+ cursor: default;
+}
+
+.WindowBody
+{
+ /* Turns this node into a "positioned node" so that its children can be placed relative to it */
+ position: absolute;
+
+ /* Fill the parent window node */
+ width: 100%;
+ height: 100%;
+
+ padding:10px;
+ border-top: 1px solid #606060;
+}
+
+
+
+/* ------------------------------------------------------------------------------------------------------------------ */
+/* Container Styles */
+/* ------------------------------------------------------------------------------------------------------------------ */
+
+
+
+.Container
+{
+ /* Position relative to the parent window */
+ position: absolute;
+
+ background:#2C2C2C;
+
+ border: 1px black solid;
+
+ /* Two inset box shadows to simulate depressing */
+ -webkit-box-shadow: -1px -1px 1px #222 inset, 1px 1px 1px #222 inset;
+ box-shadow: -1px -1px 1px #222 inset, 1px 1px 1px #222 inset;
+}
+
+
+
+/* ------------------------------------------------------------------------------------------------------------------ */
+/* Treeview Styles */
+/* ------------------------------------------------------------------------------------------------------------------ */
+
+
+
+.Treeview
+{
+ position: absolute;
+
+ background:#2C2C2C;
+ border: 1px solid black;
+ overflow:hidden;
+
+ /* Two inset box shadows to simulate depressing */
+ -webkit-box-shadow: -1px -1px 1px #222 inset, 1px 1px 1px #222 inset;
+ box-shadow: -1px -1px 1px #222 inset, 1px 1px 1px #222 inset;
+}
+
+.TreeviewItem
+{
+ margin:1px;
+ padding:2px;
+ border:solid 1px #2C2C2C;
+ background-color:#2C2C2C;
+}
+
+.TreeviewItemImage
+{
+ float: left;
+}
+
+.TreeviewItemText
+{
+ float: left;
+ margin-left:4px;
+}
+
+.TreeviewItemChildren
+{
+ overflow: hidden;
+}
+
+.TreeviewItemSelected
+{
+ background-color:#444;
+ border-color:#FFF;
+
+ -webkit-transition: background-color 0.2s ease-in-out;
+ -moz-transition: background-color 0.2s ease-in-out;
+ -webkit-transition: border-color 0.2s ease-in-out;
+ -moz-transition: border-color 0.2s ease-in-out;
+}
+
+/* Used to populate treeviews that want highlight on hover behaviour */
+.TreeviewItemHover
+{
+}
+
+.TreeviewItemHover:hover
+{
+ background-color:#111;
+ border-color:#444;
+
+ -webkit-transition: background-color 0.2s ease-in-out;
+ -moz-transition: background-color 0.2s ease-in-out;
+ -webkit-transition: border-color 0.2s ease-in-out;
+ -moz-transition: border-color 0.2s ease-in-out;
+}
+
+.TreeviewScrollbarInset
+{
+ float: right;
+
+ position:relative;
+
+ height: 100%;
+
+ /* CRAZINESS PART A: Trying to get the inset and scrollbar to have 100% height match its container */
+ margin: -8px -8px 0 0;
+ padding: 0 1px 14px 1px;
+
+ width:20px;
+ background:#2C2C2C;
+ border: 1px solid black;
+
+ /* Two inset box shadows to simulate depressing */
+ -webkit-box-shadow: -1px -1px 1px #222 inset, 1px 1px 1px #222 inset;
+ box-shadow: -1px -1px 1px #222 inset, 1px 1px 1px #222 inset;
+}
+
+.TreeviewScrollbar
+{
+ position:relative;
+
+ background:#2C2C2C;
+ border: 1px solid black;
+
+ /* CRAZINESS PART B: Trying to get the inset and scrollbar to have 100% height match its container */
+ padding: 0 0 10px 0;
+ margin: 1px 0 0 0;
+
+ width: 18px;
+ height: 100%;
+
+ border-radius:6px;
+ border-color:#000;
+ border-width:1px;
+ border-style:solid;
+
+ /* The gradient for the button background */
+ background-color:#666;
+ background: -webkit-gradient(linear, left top, left bottom, from(#666), to(#383838));
+ background: -moz-linear-gradient(top, #666, #383838);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#666666', endColorstr='#383838');
+
+ /* A box shadow and inset box highlight */
+ -webkit-box-shadow: 1px 1px 1px #222, 1px 1px 1px #777 inset;
+ box-shadow: 1px 1px 1px #222, 1px 1px 1px #777 inset;
+}
+
+.TreeviewScrollbarHeld
+{
+ /* Reset the gradient to a full-colour background */
+ background:#383838;
+
+ /* Two inset box shadows to simulate depressing */
+ -webkit-box-shadow: -1px -1px 1px #222 inset, 1px 1px 1px #222 inset;
+ box-shadow: -1px -1px 1px #222 inset, 1px 1px 1px #222 inset;
+}
+
+
+
+/* ------------------------------------------------------------------------------------------------------------------ */
+/* Treeview Styles */
+/* ------------------------------------------------------------------------------------------------------------------ */
+
+
+
+.EditBoxContainer
+{
+ position: absolute;
+ padding:2px 10px 2px 10px;
+}
+
+.EditBoxLabel
+{
+ float:left;
+ padding: 3px 4px 4px 4px;
+ font: 9px Verdana;
+}
+
+.EditBox
+{
+ float:left;
+
+ background:#666;
+ border: 1px solid;
+ border-radius: 6px;
+ padding: 3px 4px 3px 4px;
+ height: 20px;
+
+ box-shadow: 1px 1px 1px #222 inset;
+
+ transition: all 0.3s ease-in-out;
+}
+
+.EditBox:focus
+{
+ background:#FFF;
+ outline:0;
+}
+
+
+
+/* ------------------------------------------------------------------------------------------------------------------ */
+/* Label Styles */
+/* ------------------------------------------------------------------------------------------------------------------ */
+
+
+
+.Label
+{
+ /* Position relative to the parent window */
+ position:absolute;
+
+ color: #BBB;
+ font: 9px Verdana;
+}
+
+
+
+/* ------------------------------------------------------------------------------------------------------------------ */
+/* Combo Box Styles */
+/* ------------------------------------------------------------------------------------------------------------------ */
+
+
+
+.ComboBox
+{
+ position:absolute;
+
+ /* TEMP! */
+ width:90px;
+
+ /* Height is fixed to match the font */
+ height:14px;
+
+ /* Align the text within the combo box */
+ padding: 1px 0 0 5px;
+
+ /* Solid, rounded border */
+ border: 1px solid #111;
+ border-radius: 5px;
+
+ /* http://www.colorzilla.com/gradient-editor/#e3e3e3+0,c6c6c6+22,b7b7b7+33,afafaf+50,a7a7a7+67,797979+82,414141+100;Custom */
+ background: #e3e3e3;
+ background: -moz-linear-gradient(top, #e3e3e3 0%, #c6c6c6 22%, #b7b7b7 33%, #afafaf 50%, #a7a7a7 67%, #797979 82%, #414141 100%);
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#e3e3e3), color-stop(22%,#c6c6c6), color-stop(33%,#b7b7b7), color-stop(50%,#afafaf), color-stop(67%,#a7a7a7), color-stop(82%,#797979), color-stop(100%,#414141));
+ background: -webkit-linear-gradient(top, #e3e3e3 0%,#c6c6c6 22%,#b7b7b7 33%,#afafaf 50%,#a7a7a7 67%,#797979 82%,#414141 100%);
+ background: -o-linear-gradient(top, #e3e3e3 0%,#c6c6c6 22%,#b7b7b7 33%,#afafaf 50%,#a7a7a7 67%,#797979 82%,#414141 100%);
+ background: -ms-linear-gradient(top, #e3e3e3 0%,#c6c6c6 22%,#b7b7b7 33%,#afafaf 50%,#a7a7a7 67%,#797979 82%,#414141 100%);
+ background: linear-gradient(top, #e3e3e3 0%,#c6c6c6 22%,#b7b7b7 33%,#afafaf 50%,#a7a7a7 67%,#797979 82%,#414141 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#e3e3e3', endColorstr='#414141',GradientType=0 );
+}
+
+.ComboBoxPressed
+{
+ /* The reverse of the default background, simulating depression */
+ background: #414141;
+ background: -moz-linear-gradient(top, #414141 0%, #797979 18%, #a7a7a7 33%, #afafaf 50%, #b7b7b7 67%, #c6c6c6 78%, #e3e3e3 100%);
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#414141), color-stop(18%,#797979), color-stop(33%,#a7a7a7), color-stop(50%,#afafaf), color-stop(67%,#b7b7b7), color-stop(78%,#c6c6c6), color-stop(100%,#e3e3e3));
+ background: -webkit-linear-gradient(top, #414141 0%,#797979 18%,#a7a7a7 33%,#afafaf 50%,#b7b7b7 67%,#c6c6c6 78%,#e3e3e3 100%);
+ background: -o-linear-gradient(top, #414141 0%,#797979 18%,#a7a7a7 33%,#afafaf 50%,#b7b7b7 67%,#c6c6c6 78%,#e3e3e3 100%);
+ background: -ms-linear-gradient(top, #414141 0%,#797979 18%,#a7a7a7 33%,#afafaf 50%,#b7b7b7 67%,#c6c6c6 78%,#e3e3e3 100%);
+ background: linear-gradient(top, #414141 0%,#797979 18%,#a7a7a7 33%,#afafaf 50%,#b7b7b7 67%,#c6c6c6 78%,#e3e3e3 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#414141', endColorstr='#e3e3e3',GradientType=0 );
+}
+
+.ComboBoxText
+{
+ /* Text info */
+ color: #000;
+ font: 9px Verdana;
+
+ float:left;
+}
+
+.ComboBoxIcon
+{
+ /* Push the image to the far right */
+ float:right;
+
+ /* Align the image with the combo box */
+ padding: 2px 5px 0 0;
+}
+
+.ComboBoxPopup
+{
+ position: fixed;
+
+ background: #CCC;
+
+ border-radius: 5px;
+
+ padding: 1px 0 1px 0;
+}
+
+.ComboBoxPopupItem
+{
+ /* Text info */
+ color: #000;
+ font: 9px Verdana;
+
+ padding: 1px 1px 1px 5px;
+
+ border-bottom: 1px solid #AAA;
+ border-top: 1px solid #FFF;
+}
+
+.ComboBoxPopupItemText
+{
+ float:left;
+}
+
+.ComboBoxPopupItemIcon
+{
+ /* Push the image to the far right */
+ float:right;
+
+ /* Align the image with the combo box */
+ padding: 2px 5px 0 0;
+}
+
+.ComboBoxPopupItem:first-child
+{
+ border-top: 0px;
+}
+
+.ComboBoxPopupItem:last-child
+{
+ border-bottom: 0px;
+}
+
+.ComboBoxPopupItem:hover
+{
+ color:#FFF;
+ background: #2036E1;
+}
+
+
+
+/* ------------------------------------------------------------------------------------------------------------------ */
+/* Grid Styles */
+/* ------------------------------------------------------------------------------------------------------------------ */
+
+
+
+.Grid
+{
+ /* Clip contents */
+ overflow: hidden;
+
+ position: relative;
+
+ background: #333;
+
+ border-radius: 2px;
+}
+
+.GridBody
+{
+}
+
+.GridRow
+{
+ background:#303030;
+
+ color: #BBB;
+ font: 9px Verdana;
+
+ padding: 2px;
+}
+
+.GridRow.GridGroup
+{
+ padding: 0px;
+}
+
+.GridRow:nth-child(odd)
+{
+ background:#333;
+}
+
+.GridRowCell
+{
+ float:left;
+}
+.GridRowCell.GridGroup
+{
+ color: #BBB;
+
+ /* Override default from name */
+ width: 100%;
+
+ padding: 1px 1px 1px 2px;
+ border: 1px solid;
+ border-radius: 2px;
+
+ border-top-color:#555;
+ border-left-color:#555;
+ border-bottom-color:#111;
+ border-right-color:#111;
+
+ background: #222;
+}
+
+.GridRowBody
+{
+ /* Clip all contents for show/hide group*/
+ overflow: hidden;
+
+ /* Crazy CSS rules: controls for properties don't clip if this isn't set on this parent */
+ position: relative;
+}
+
+
+
+/* ------------------------------------------------------------------------------------------------------------------ */
+/* Button Styles */
+/* ------------------------------------------------------------------------------------------------------------------ */
+
+
+
+.Button
+{
+ /* Position relative to the parent window */
+ position:absolute;
+
+ border-radius:6px;
+ border-color:#000;
+ border-width:1px;
+ border-style:solid;
+
+ /* Padding at the top includes 2px for the text drop-shadow */
+ padding: 2px 5px 3px 5px;
+
+ color: #BBB;
+ font: 9px Verdana;
+ text-shadow: 1px 1px 1px black;
+ text-align: center;
+
+ /* The gradient for the button background */
+ background-color:#666;
+ background: -webkit-gradient(linear, left top, left bottom, from(#666), to(#383838));
+ background: -moz-linear-gradient(top, #666, #383838);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#666666', endColorstr='#383838');
+
+ /* A box shadow and inset box highlight */
+ -webkit-box-shadow: 1px 1px 1px #222, 1px 1px 1px #777 inset;
+ box-shadow: 1px 1px 1px #222, 1px 1px 1px #777 inset;
+}
+
+.ButtonHeld
+{
+ /* Reset the gradient to a full-colour background */
+ background:#383838;
+
+ /* Two inset box shadows to simulate depressing */
+ -webkit-box-shadow: -1px -1px 1px #222 inset, 1px 1px 1px #222 inset;
+ box-shadow: -1px -1px 1px #222 inset, 1px 1px 1px #222 inset;
+}
diff --git a/3rdparty/bgfx/3rdparty/remotery/vis/index.html b/3rdparty/bgfx/3rdparty/remotery/vis/index.html
new file mode 100644
index 00000000000..7d1620d5aca
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/remotery/vis/index.html
@@ -0,0 +1,53 @@
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+ <head>
+
+ <title>Remotery Viewer</title>
+
+ <!-- Style Sheets -->
+ <link rel="stylesheet" type="text/css" href="extern/BrowserLib/WindowManager/Styles/WindowManager.css" />
+ <link rel="stylesheet" type="text/css" href="Styles/Remotery.css" />
+
+ <!-- Utilities -->
+ <script type="text/javascript" src="extern/BrowserLib/Core/Code/Core.js"></script>
+ <script type="text/javascript" src="extern/BrowserLib/Core/Code/DOM.js"></script>
+ <script type="text/javascript" src="extern/BrowserLib/Core/Code/Bind.js"></script>
+ <script type="text/javascript" src="extern/BrowserLib/Core/Code/Animation.js"></script>
+ <script type="text/javascript" src="extern/BrowserLib/Core/Code/Convert.js"></script>
+ <script type="text/javascript" src="extern/BrowserLib/Core/Code/LocalStore.js"></script>
+ <script type="text/javascript" src="extern/BrowserLib/Core/Code/Mouse.js"></script>
+
+ <!-- User Interface Window Manager -->
+ <script type="text/javascript" src="extern/BrowserLib/WindowManager/Code/WindowManager.js"></script>
+ <script type="text/javascript" src="extern/BrowserLib/WindowManager/Code/Window.js"></script>
+ <script type="text/javascript" src="extern/BrowserLib/WindowManager/Code/Container.js"></script>
+ <script type="text/javascript" src="extern/BrowserLib/WindowManager/Code/EditBox.js"></script>
+ <script type="text/javascript" src="extern/BrowserLib/WindowManager/Code/Grid.js"></script>
+ <script type="text/javascript" src="extern/BrowserLib/WindowManager/Code/Label.js"></script>
+ <script type="text/javascript" src="extern/BrowserLib/WindowManager/Code/Button.js"></script>
+
+ <!-- Main Application -->
+ <script type="text/javascript" src="Code/Console.js"></script>
+ <script type="text/javascript" src="Code/WebSocketConnection.js"></script>
+ <script type="text/javascript" src="Code/TitleWindow.js"></script>
+ <script type="text/javascript" src="Code/SampleWindow.js"></script>
+ <script type="text/javascript" src="Code/PixelTimeRange.js"></script>
+ <script type="text/javascript" src="Code/TimelineRow.js"></script>
+ <script type="text/javascript" src="Code/TimelineWindow.js"></script>
+ <script type="text/javascript" src="Code/ThreadFrame.js"></script>
+ <script type="text/javascript" src="Code/Remotery.js"></script>
+
+ </head>
+
+ <body>
+
+ <script type="text/javascript">
+
+ var remotery = new Remotery();
+
+ </script>
+
+ </body>
+
+</html> \ No newline at end of file
diff --git a/3rdparty/bgfx/3rdparty/tinyexr/README.md b/3rdparty/bgfx/3rdparty/tinyexr/README.md
new file mode 100644
index 00000000000..aea03fd97a4
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/tinyexr/README.md
@@ -0,0 +1,274 @@
+# Tiny OpenEXR image library.
+
+![Example](https://github.com/syoyo/tinyexr/blob/master/asakusa.png?raw=true)
+
+[![AppVeyor build status](https://ci.appveyor.com/api/projects/status/k07ftfe4ph057qau/branch/master?svg=true)](https://ci.appveyor.com/project/syoyo/tinyexr/branch/master)
+
+[![Travis build Status](https://travis-ci.org/syoyo/tinyexr.svg)](https://travis-ci.org/syoyo/tinyexr)
+
+[![Coverity Scan Build Status](https://scan.coverity.com/projects/5827/badge.svg)](https://scan.coverity.com/projects/5827)
+
+`tinyexr` is a small, single header-only library to load and save OpenEXR(.exr) images.
+`tinyexr` is written in portable C++(no library dependency except for STL), thus `tinyexr` is good to embed into your application.
+To use `tinyexr`, simply copy `tinyexr.h` into your project.
+
+`tinyexr` currently supports:
+
+* OpenEXR version 1.x.
+* Normal image
+ * Scanline format.
+ * Uncompress("compress" = 0), ZIPS("compress" = 2), ZIP compression("compress" = 3) and PIZ compression("compress" = 4).
+ * Half/Uint/Float pixel type.
+ * Custom attributes(up to 128)
+* Deep image
+ * Scanline format.
+ * ZIPS compression("compress" = 2).
+ * Half, float pixel type.
+* Litte endian machine.
+* Limited support for big endian machine.
+ * read/write normal image.
+* C interface.
+ * You can easily write language bindings(e.g. golang)
+* EXR saving
+ * with ZIP compression.
+* JavaScript library
+ * Through emscripten.
+
+# Use case
+
+* mallie https://github.com/lighttransport/mallie
+* PBRT v3 https://github.com/mmp/pbrt-v3
+* Cinder 0.9.0 https://libcinder.org/notes/v0.9.0
+* Piccante(develop branch) http://piccantelib.net/
+* Your project here!
+
+## Examples
+
+* [examples/deepview/](examples/deepview) Deep image view
+* [examples/rgbe2exr/](examples/rgbe2exr) .hdr to EXR converter
+* [examples/exr2rgbe/](examples/exr2rgbe) EXR to .hdr converter
+
+## Usage
+
+NOTE: **API is still subject to change**. See the source code for details.
+
+Include `tinyexr.h` with `TINYEXR_IMPLEMENTATION` flag(do this only for **one** .cc file).
+
+```
+#define TINYEXR_IMPLEMENTATION
+#include "tinyexr.h"
+```
+
+Quickly reading RGB(A) EXR file.
+
+```
+ const char* input = "asakusa.exr";
+ float* out; // width * height * RGBA
+ int width;
+ int height;
+ const char* err;
+
+ int ret = LoadEXR(&out, &width, &height, input, &err);
+```
+
+Loading EXR from a file.
+
+```
+ const char* input = "asakusa.exr";
+ const char* err;
+
+ EXRImage exrImage;
+ InitEXRImage(&exrImage);
+
+ int ret = ParseMultiChannelEXRHeaderFromFile(&exrImage, input, &err);
+ if (ret != 0) {
+ fprintf(stderr, "Parse EXR err: %s\n", err);
+ return;
+ }
+
+ //// Uncomment if you want reading HALF image as FLOAT.
+ //for (int i = 0; i < exrImage.num_channels; i++) {
+ // if (exrImage.pixel_types[i] = TINYEXR_PIXELTYPE_HALF) {
+ // exrImage.requested_pixel_types[i] = TINYEXR_PIXELTYPE_FLOAT;
+ // }
+ //}
+
+ ret = LoadMultiChannelEXRFromFile(&exrImage, input, &err);
+ if (ret != 0) {
+ fprintf(stderr, "Load EXR err: %s\n", err);
+ return;
+ }
+```
+
+Saving EXR file.
+
+```
+ bool SaveEXR(const float* rgb, int width, int height, const char* outfilename) {
+
+ float* channels[3];
+
+ EXRImage image;
+ InitEXRImage(&image);
+
+ image.num_channels = 3;
+
+ // Must be BGR(A) order, since most of EXR viewers expect this channel order.
+ const char* channel_names[] = {"B", "G", "R"}; // "B", "G", "R", "A" for RGBA image
+
+ std::vector<float> images[3];
+ images[0].resize(width * height);
+ images[1].resize(width * height);
+ images[2].resize(width * height);
+
+ for (int i = 0; i < width * height; i++) {
+ images[0][i] = rgb[3*i+0];
+ images[1][i] = rgb[3*i+1];
+ images[2][i] = rgb[3*i+2];
+ }
+
+ float* image_ptr[3];
+ image_ptr[0] = &(images[2].at(0)); // B
+ image_ptr[1] = &(images[1].at(0)); // G
+ image_ptr[2] = &(images[0].at(0)); // R
+
+ image.channel_names = channel_names;
+ image.images = (unsigned char**)image_ptr;
+ image.width = width;
+ image.height = height;
+ image.compression = TINYEXR_COMPRESSIONTYPE_ZIP;
+
+ image.pixel_types = (int *)malloc(sizeof(int) * image.num_channels);
+ image.requested_pixel_types = (int *)malloc(sizeof(int) * image.num_channels);
+ for (int i = 0; i < image.num_channels; i++) {
+ image.pixel_types[i] = TINYEXR_PIXELTYPE_FLOAT; // pixel type of input image
+ image.requested_pixel_types[i] = TINYEXR_PIXELTYPE_HALF; // pixel type of output image to be stored in .EXR
+ }
+
+ const char* err;
+ int ret = SaveMultiChannelEXRToFile(&image, outfilename, &err);
+ if (ret != 0) {
+ fprintf(stderr, "Save EXR err: %s\n", err);
+ return ret;
+ }
+ printf("Saved exr file. [ %s ] \n", outfilename);
+
+ free(image.pixel_types);
+ free(image.requested_pixel_types);
+
+ return ret;
+
+ }
+```
+
+
+Reading deep image EXR file.
+See `example/deepview` for actual usage.
+
+```
+ const char* input = "deepimage.exr";
+ const char* err;
+ DeepImage deepImage;
+
+ int ret = LoadDeepEXR(&deepImage, input, &err);
+
+ // acccess to each sample in the deep pixel.
+ for (int y = 0; y < deepImage.height; y++) {
+ int sampleNum = deepImage.offset_table[y][deepImage.width-1];
+ for (int x = 0; x < deepImage.width-1; x++) {
+ int s_start = deepImage.offset_table[y][x];
+ int s_end = deepImage.offset_table[y][x+1];
+ if (s_start >= sampleNum) {
+ continue;
+ }
+ s_end = (s_end < sampleNum) ? s_end : sampleNum;
+ for (int s = s_start; s < s_end; s++) {
+ float val = deepImage.image[depthChan][y][s];
+ ...
+ }
+ }
+ }
+
+```
+
+### deepview
+
+`examples/deepview` is simple deep image viewer in OpenGL.
+
+![DeepViewExample](https://github.com/syoyo/tinyexr/blob/master/examples/deepview/deepview_screencast.gif?raw=true)
+
+## TODO
+
+Contribution is welcome!
+
+- [ ] Compression
+ - [ ] NONE("compress" = 0, load)
+ - [ ] RLE("compress" = 1, load)
+ - [x] ZIPS("compress" = 2, load)
+ - [x] ZIP("compress" = 3, load)
+ - [x] PIZ("compress" = 4, load)
+ - [x] NONE("compress" = 0, save)
+ - [ ] RLE("compress" = 1, save)
+ - [x] ZIPS("compress" = 2, save)
+ - [x] ZIP("compress" = 3, save)
+ - [ ] PIZ("compress" = 4, save)
+- [ ] Custom attributes
+ - [x] Normal image(EXR 1.x)
+ - [ ] Deep image(EXR 2.x)
+- [ ] JavaScript library
+ - [x] LoadEXRFromMemory
+ - [ ] SaveMultiChannelEXR
+ - [ ] Deep image save/load
+- [ ] Write from/to memory buffer.
+ - [x] SaveMultiChannelEXR
+ - [x] LoadMultiChannelEXR
+ - [ ] Deep image save/load
+- [ ] Tile format.
+- [ ] Support for various compression type.
+ - [x] zstd compression(Not in OpenEXR spec, though)
+- [x] Multi-channel.
+- [ ] Multi-part(EXR2.0)
+- [ ] Line order.
+ - [x] Increasing, decreasing(load)
+ - [ ] Random?
+ - [ ] Increasing, decreasing(save)
+- [ ] Pixel format(UINT, FLOAT).
+ - [x] UINT, FLOAT(load)
+ - [x] UINT, FLOAT(deep load)
+ - [x] UINT, FLOAT(save)
+ - [ ] UINT, FLOAT(deep save)
+- [ ] Full support for big endian machine.
+ - [x] Loading multi channel EXR
+ - [x] Saving multi channel EXR
+ - [ ] Loading deep image
+ - [ ] Saving deep image
+- [ ] Optimization
+ - [ ] ISPC?
+ - [x] OpenMP multi-threading in EXR loading.
+ - [x] OpenMP multi-threading in EXR saving.
+ - [ ] OpenMP multi-threading in deep image loading.
+ - [ ] OpenMP multi-threading in deep image saving.
+
+## Similar or related projects
+
+* miniexr: https://github.com/aras-p/miniexr (Write OpenEXR)
+* stb_image_resize.h: https://github.com/nothings/stb (Good for HDR image resizing)
+
+## License
+
+3-clause BSD
+
+`tinyexr` uses miniz, which is developed by Rich Geldreich <richgel99@gmail.com>, and licensed under public domain.
+
+`tinyexr` tools uses stb, which is licensed under public domain: https://github.com/nothings/stb
+`tinyexr` uses some code from OpenEXR, which is licensed under 3-clause BSD license.
+
+## Author(s)
+
+Syoyo Fujita(syoyo@lighttransport.com)
+
+## Contributor(s)
+
+* Matt Ebb (http://mattebb.com) : deep image example. Thanks!
+* Matt Pharr (http://pharr.org/matt/) : Testing tinyexr with OpenEXR(IlmImf). Thanks!
+* Andrew Bell (https://github.com/andrewfb) & Richard Eakin (https://github.com/richardeakin) : Improving TinyEXR API. Thanks!
+* Mike Wong (https://github.com/mwkm) : ZIPS compression support in loading. Thanks!
diff --git a/3rdparty/bgfx/3rdparty/tinyexr/tinyexr.cc b/3rdparty/bgfx/3rdparty/tinyexr/tinyexr.cc
new file mode 100644
index 00000000000..969a6d505d6
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/tinyexr/tinyexr.cc
@@ -0,0 +1,2 @@
+#define TINYEXR_IMPLEMENTATION
+#include "tinyexr.h"
diff --git a/3rdparty/bgfx/3rdparty/tinyexr/tinyexr.h b/3rdparty/bgfx/3rdparty/tinyexr/tinyexr.h
new file mode 100644
index 00000000000..d6ed38b7254
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/tinyexr/tinyexr.h
@@ -0,0 +1,11131 @@
+/*
+Copyright (c) 2014 - 2015, Syoyo Fujita
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of the <organization> nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef __TINYEXR_H__
+#define __TINYEXR_H__
+
+//
+//
+// Do this:
+// #define TINYEXR_IMPLEMENTATION
+// before you include this file in *one* C or C++ file to create the
+// implementation.
+//
+// // i.e. it should look like this:
+// #include ...
+// #include ...
+// #include ...
+// #define TINYEXR_IMPLEMENTATION
+// #include "tinyexr.h"
+//
+//
+
+#include <stddef.h> // for size_t
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// pixel type: possible values are: UINT = 0 HALF = 1 FLOAT = 2
+#define TINYEXR_PIXELTYPE_UINT (0)
+#define TINYEXR_PIXELTYPE_HALF (1)
+#define TINYEXR_PIXELTYPE_FLOAT (2)
+
+#define TINYEXR_MAX_ATTRIBUTES (128)
+
+#define TINYEXR_COMPRESSIONTYPE_NONE (0)
+//#define TINYEXR_COMPRESSIONTYPE_RLE (1) // not supported yet
+#define TINYEXR_COMPRESSIONTYPE_ZIPS (2)
+#define TINYEXR_COMPRESSIONTYPE_ZIP (3)
+#define TINYEXR_COMPRESSIONTYPE_PIZ (4)
+
+typedef struct _EXRAttribute {
+ char *name;
+ char *type;
+ int size;
+ unsigned char *value; // uint8_t*
+} EXRAttribute;
+
+typedef struct _EXRImage {
+ // Custom attributes(exludes required attributes(e.g. `channels`,
+ // `compression`, etc)
+ EXRAttribute custom_attributes[TINYEXR_MAX_ATTRIBUTES];
+ int num_custom_attributes;
+
+ int num_channels;
+ const char **channel_names;
+
+ unsigned char **images; // image[channels][pixels]
+ int *pixel_types; // Loaded pixel type(TINYEXR_PIXELTYPE_*) of `images` for
+ // each channel
+
+ int *requested_pixel_types; // Filled initially by
+ // ParseEXRHeaderFrom(Meomory|File), then users
+ // can edit it(only valid for HALF pixel type
+ // channel)
+
+ int width;
+ int height;
+ float pixel_aspect_ratio;
+ int compression; // compression type(TINYEXR_COMPRESSIONTYPE_*)
+ int line_order;
+ int data_window[4];
+ int display_window[4];
+ float screen_window_center[2];
+ float screen_window_width;
+} EXRImage;
+
+typedef struct _DeepImage {
+ int num_channels;
+ const char **channel_names;
+ float ***image; // image[channels][scanlines][samples]
+ int **offset_table; // offset_table[scanline][offsets]
+ int width;
+ int height;
+} DeepImage;
+
+// @deprecated { to be removed. }
+// Loads single-frame OpenEXR image. Assume EXR image contains RGB(A) channels.
+// Application must free image data as returned by `out_rgba`
+// Result image format is: float x RGBA x width x hight
+// Return 0 if success
+// Returns error string in `err` when there's an error
+extern int LoadEXR(float **out_rgba, int *width, int *height,
+ const char *filename, const char **err);
+
+// Parse single-frame OpenEXR header from a file and initialize `EXRImage`
+// struct.
+// Users then call LoadMultiChannelEXRFromFile to actually load image data into
+// `EXRImage`
+extern int ParseMultiChannelEXRHeaderFromFile(EXRImage *image,
+ const char *filename,
+ const char **err);
+
+// Parse single-frame OpenEXR header from a memory and initialize `EXRImage`
+// struct.
+// Users then call LoadMultiChannelEXRFromMemory to actually load image data
+// into `EXRImage`
+extern int ParseMultiChannelEXRHeaderFromMemory(EXRImage *image,
+ const unsigned char *memory,
+ const char **err);
+
+// Loads multi-channel, single-frame OpenEXR image from a file.
+// Application must setup `ParseMultiChannelEXRHeaderFromFile` before calling
+// `LoadMultiChannelEXRFromFile`.
+// Application can free EXRImage using `FreeExrImage`
+// Return 0 if success
+// Returns error string in `err` when there's an error
+extern int LoadMultiChannelEXRFromFile(EXRImage *image, const char *filename,
+ const char **err);
+
+// Loads multi-channel, single-frame OpenEXR image from a memory.
+// Application must setup `EXRImage` with `ParseMultiChannelEXRHeaderFromMemory`
+// before calling `LoadMultiChannelEXRFromMemory`.
+// Application can free EXRImage using `FreeExrImage`
+// Return 0 if success
+// Returns error string in `err` when there's an error
+extern int LoadMultiChannelEXRFromMemory(EXRImage *image,
+ const unsigned char *memory,
+ const char **err);
+
+// Saves floating point RGBA image as OpenEXR.
+// Image is compressed using EXRImage.compression value.
+// Return 0 if success
+// Returns error string in `err` when there's an error
+// extern int SaveEXR(const float *in_rgba, int width, int height,
+// const char *filename, const char **err);
+
+// Saves multi-channel, single-frame OpenEXR image to a file.
+// `compression_type` is one of TINYEXR_COMPRESSIONTYPE_*.
+// Returns 0 if success
+// Returns error string in `err` when there's an error
+extern int SaveMultiChannelEXRToFile(const EXRImage *image,
+ const char *filename, const char **err);
+
+// Saves multi-channel, single-frame OpenEXR image to a memory.
+// Image is compressed using EXRImage.compression value.
+// Return the number of bytes if succes.
+// Retruns 0 if success, negative number when failed.
+// Returns error string in `err` when there's an error
+extern size_t SaveMultiChannelEXRToMemory(const EXRImage *image,
+ unsigned char **memory,
+ const char **err);
+
+// Loads single-frame OpenEXR deep image.
+// Application must free memory of variables in DeepImage(image, offset_table)
+// Returns 0 if success
+// Returns error string in `err` when there's an error
+extern int LoadDeepEXR(DeepImage *out_image, const char *filename,
+ const char **err);
+
+// NOT YET IMPLEMENTED:
+// Saves single-frame OpenEXR deep image.
+// Return 0 if success
+// Returns error string in `err` when there's an error
+// extern int SaveDeepEXR(const DeepImage *in_image, const char *filename,
+// const char **err);
+
+// NOT YET IMPLEMENTED:
+// Loads multi-part OpenEXR deep image.
+// Application must free memory of variables in DeepImage(image, offset_table)
+// extern int LoadMultiPartDeepEXR(DeepImage **out_image, int num_parts, const
+// char *filename,
+// const char **err);
+
+// Initialize of EXRImage struct
+extern void InitEXRImage(EXRImage *exrImage);
+
+// Free's internal data of EXRImage struct
+// Returns 0 if success.
+extern int FreeEXRImage(EXRImage *exrImage);
+
+// For emscripten.
+// Parse single-frame OpenEXR header from memory.
+// Return 0 if success
+extern int ParseEXRHeaderFromMemory(EXRAttribute *customAttributes,
+ int *numCustomAttributes, int *width,
+ int *height, const unsigned char *memory);
+
+// For emscripten.
+// Loads single-frame OpenEXR image from memory. Assume EXR image contains
+// RGB(A) channels.
+// `out_rgba` must have enough memory(at least sizeof(float) x 4(RGBA) x width x
+// hight)
+// Return 0 if success
+// Returns error string in `err` when there's an error
+extern int LoadEXRFromMemory(float *out_rgba, const unsigned char *memory,
+ const char **err);
+
+#ifdef __cplusplus
+}
+#endif
+
+#ifdef TINYEXR_IMPLEMENTATION
+#include <cstdio>
+#include <cstdlib>
+#include <cassert>
+#include <cstring>
+#include <algorithm>
+
+#include <string>
+#include <vector>
+
+#include "tinyexr.h"
+
+#ifdef _OPENMP
+#include <omp.h>
+#endif
+
+namespace {
+
+namespace miniz {
+
+/* miniz.c v1.15 - public domain deflate/inflate, zlib-subset, ZIP
+ reading/writing/appending, PNG writing
+ See "unlicense" statement at the end of this file.
+ Rich Geldreich <richgel99@gmail.com>, last updated Oct. 13, 2013
+ Implements RFC 1950: http://www.ietf.org/rfc/rfc1950.txt and RFC 1951:
+ http://www.ietf.org/rfc/rfc1951.txt
+
+ Most API's defined in miniz.c are optional. For example, to disable the
+ archive related functions just define
+ MINIZ_NO_ARCHIVE_APIS, or to get rid of all stdio usage define MINIZ_NO_STDIO
+ (see the list below for more macros).
+
+ * Change History
+ 10/13/13 v1.15 r4 - Interim bugfix release while I work on the next major
+ release with Zip64 support (almost there!):
+ - Critical fix for the MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY bug
+ (thanks kahmyong.moon@hp.com) which could cause locate files to not find
+ files. This bug
+ would only have occured in earlier versions if you explicitly used this
+ flag, OR if you used mz_zip_extract_archive_file_to_heap() or
+ mz_zip_add_mem_to_archive_file_in_place()
+ (which used this flag). If you can't switch to v1.15 but want to fix
+ this bug, just remove the uses of this flag from both helper funcs (and of
+ course don't use the flag).
+ - Bugfix in mz_zip_reader_extract_to_mem_no_alloc() from kymoon when
+ pUser_read_buf is not NULL and compressed size is > uncompressed size
+ - Fixing mz_zip_reader_extract_*() funcs so they don't try to extract
+ compressed data from directory entries, to account for weird zipfiles which
+ contain zero-size compressed data on dir entries.
+ Hopefully this fix won't cause any issues on weird zip archives,
+ because it assumes the low 16-bits of zip external attributes are DOS
+ attributes (which I believe they always are in practice).
+ - Fixing mz_zip_reader_is_file_a_directory() so it doesn't check the
+ internal attributes, just the filename and external attributes
+ - mz_zip_reader_init_file() - missing MZ_FCLOSE() call if the seek failed
+ - Added cmake support for Linux builds which builds all the examples,
+ tested with clang v3.3 and gcc v4.6.
+ - Clang fix for tdefl_write_image_to_png_file_in_memory() from toffaletti
+ - Merged MZ_FORCEINLINE fix from hdeanclark
+ - Fix <time.h> include before config #ifdef, thanks emil.brink
+ - Added tdefl_write_image_to_png_file_in_memory_ex(): supports Y flipping
+ (super useful for OpenGL apps), and explicit control over the compression
+ level (so you can
+ set it to 1 for real-time compression).
+ - Merged in some compiler fixes from paulharris's github repro.
+ - Retested this build under Windows (VS 2010, including static analysis),
+ tcc 0.9.26, gcc v4.6 and clang v3.3.
+ - Added example6.c, which dumps an image of the mandelbrot set to a PNG
+ file.
+ - Modified example2 to help test the
+ MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY flag more.
+ - In r3: Bugfix to mz_zip_writer_add_file() found during merge: Fix
+ possible src file fclose() leak if alignment bytes+local header file write
+ faiiled
+ - In r4: Minor bugfix to mz_zip_writer_add_from_zip_reader():
+ Was pushing the wrong central dir header offset, appears harmless in this
+ release, but it became a problem in the zip64 branch
+ 5/20/12 v1.14 - MinGW32/64 GCC 4.6.1 compiler fixes: added MZ_FORCEINLINE,
+ #include <time.h> (thanks fermtect).
+ 5/19/12 v1.13 - From jason@cornsyrup.org and kelwert@mtu.edu - Fix
+ mz_crc32() so it doesn't compute the wrong CRC-32's when mz_ulong is 64-bit.
+ - Temporarily/locally slammed in "typedef unsigned long mz_ulong" and
+ re-ran a randomized regression test on ~500k files.
+ - Eliminated a bunch of warnings when compiling with GCC 32-bit/64.
+ - Ran all examples, miniz.c, and tinfl.c through MSVC 2008's /analyze
+ (static analysis) option and fixed all warnings (except for the silly
+ "Use of the comma-operator in a tested expression.." analysis warning,
+ which I purposely use to work around a MSVC compiler warning).
+ - Created 32-bit and 64-bit Codeblocks projects/workspace. Built and
+ tested Linux executables. The codeblocks workspace is compatible with
+ Linux+Win32/x64.
+ - Added miniz_tester solution/project, which is a useful little app
+ derived from LZHAM's tester app that I use as part of the regression test.
+ - Ran miniz.c and tinfl.c through another series of regression testing on
+ ~500,000 files and archives.
+ - Modified example5.c so it purposely disables a bunch of high-level
+ functionality (MINIZ_NO_STDIO, etc.). (Thanks to corysama for the
+ MINIZ_NO_STDIO bug report.)
+ - Fix ftell() usage in examples so they exit with an error on files which
+ are too large (a limitation of the examples, not miniz itself).
+ 4/12/12 v1.12 - More comments, added low-level example5.c, fixed a couple
+ minor level_and_flags issues in the archive API's.
+ level_and_flags can now be set to MZ_DEFAULT_COMPRESSION. Thanks to Bruce
+ Dawson <bruced@valvesoftware.com> for the feedback/bug report.
+ 5/28/11 v1.11 - Added statement from unlicense.org
+ 5/27/11 v1.10 - Substantial compressor optimizations:
+ - Level 1 is now ~4x faster than before. The L1 compressor's throughput
+ now varies between 70-110MB/sec. on a
+ - Core i7 (actual throughput varies depending on the type of data, and x64
+ vs. x86).
+ - Improved baseline L2-L9 compression perf. Also, greatly improved
+ compression perf. issues on some file types.
+ - Refactored the compression code for better readability and
+ maintainability.
+ - Added level 10 compression level (L10 has slightly better ratio than
+ level 9, but could have a potentially large
+ drop in throughput on some files).
+ 5/15/11 v1.09 - Initial stable release.
+
+ * Low-level Deflate/Inflate implementation notes:
+
+ Compression: Use the "tdefl" API's. The compressor supports raw, static,
+ and dynamic blocks, lazy or
+ greedy parsing, match length filtering, RLE-only, and Huffman-only streams.
+ It performs and compresses
+ approximately as well as zlib.
+
+ Decompression: Use the "tinfl" API's. The entire decompressor is
+ implemented as a single function
+ coroutine: see tinfl_decompress(). It supports decompression into a 32KB
+ (or larger power of 2) wrapping buffer, or into a memory
+ block large enough to hold the entire file.
+
+ The low-level tdefl/tinfl API's do not make any use of dynamic memory
+ allocation.
+
+ * zlib-style API notes:
+
+ miniz.c implements a fairly large subset of zlib. There's enough
+ functionality present for it to be a drop-in
+ zlib replacement in many apps:
+ The z_stream struct, optional memory allocation callbacks
+ deflateInit/deflateInit2/deflate/deflateReset/deflateEnd/deflateBound
+ inflateInit/inflateInit2/inflate/inflateEnd
+ compress, compress2, compressBound, uncompress
+ CRC-32, Adler-32 - Using modern, minimal code size, CPU cache friendly
+ routines.
+ Supports raw deflate streams or standard zlib streams with adler-32
+ checking.
+
+ Limitations:
+ The callback API's are not implemented yet. No support for gzip headers or
+ zlib static dictionaries.
+ I've tried to closely emulate zlib's various flavors of stream flushing
+ and return status codes, but
+ there are no guarantees that miniz.c pulls this off perfectly.
+
+ * PNG writing: See the tdefl_write_image_to_png_file_in_memory() function,
+ originally written by
+ Alex Evans. Supports 1-4 bytes/pixel images.
+
+ * ZIP archive API notes:
+
+ The ZIP archive API's where designed with simplicity and efficiency in
+ mind, with just enough abstraction to
+ get the job done with minimal fuss. There are simple API's to retrieve file
+ information, read files from
+ existing archives, create new archives, append new files to existing
+ archives, or clone archive data from
+ one archive to another. It supports archives located in memory or the heap,
+ on disk (using stdio.h),
+ or you can specify custom file read/write callbacks.
+
+ - Archive reading: Just call this function to read a single file from a
+ disk archive:
+
+ void *mz_zip_extract_archive_file_to_heap(const char *pZip_filename, const
+ char *pArchive_name,
+ size_t *pSize, mz_uint zip_flags);
+
+ For more complex cases, use the "mz_zip_reader" functions. Upon opening an
+ archive, the entire central
+ directory is located and read as-is into memory, and subsequent file access
+ only occurs when reading individual files.
+
+ - Archives file scanning: The simple way is to use this function to scan a
+ loaded archive for a specific file:
+
+ int mz_zip_reader_locate_file(mz_zip_archive *pZip, const char *pName,
+ const char *pComment, mz_uint flags);
+
+ The locate operation can optionally check file comments too, which (as one
+ example) can be used to identify
+ multiple versions of the same file in an archive. This function uses a
+ simple linear search through the central
+ directory, so it's not very fast.
+
+ Alternately, you can iterate through all the files in an archive (using
+ mz_zip_reader_get_num_files()) and
+ retrieve detailed info on each file by calling mz_zip_reader_file_stat().
+
+ - Archive creation: Use the "mz_zip_writer" functions. The ZIP writer
+ immediately writes compressed file data
+ to disk and builds an exact image of the central directory in memory. The
+ central directory image is written
+ all at once at the end of the archive file when the archive is finalized.
+
+ The archive writer can optionally align each file's local header and file
+ data to any power of 2 alignment,
+ which can be useful when the archive will be read from optical media. Also,
+ the writer supports placing
+ arbitrary data blobs at the very beginning of ZIP archives. Archives
+ written using either feature are still
+ readable by any ZIP tool.
+
+ - Archive appending: The simple way to add a single file to an archive is
+ to call this function:
+
+ mz_bool mz_zip_add_mem_to_archive_file_in_place(const char *pZip_filename,
+ const char *pArchive_name,
+ const void *pBuf, size_t buf_size, const void *pComment, mz_uint16
+ comment_size, mz_uint level_and_flags);
+
+ The archive will be created if it doesn't already exist, otherwise it'll be
+ appended to.
+ Note the appending is done in-place and is not an atomic operation, so if
+ something goes wrong
+ during the operation it's possible the archive could be left without a
+ central directory (although the local
+ file headers and file data will be fine, so the archive will be
+ recoverable).
+
+ For more complex archive modification scenarios:
+ 1. The safest way is to use a mz_zip_reader to read the existing archive,
+ cloning only those bits you want to
+ preserve into a new archive using using the
+ mz_zip_writer_add_from_zip_reader() function (which compiles the
+ compressed file data as-is). When you're done, delete the old archive and
+ rename the newly written archive, and
+ you're done. This is safe but requires a bunch of temporary disk space or
+ heap memory.
+
+ 2. Or, you can convert an mz_zip_reader in-place to an mz_zip_writer using
+ mz_zip_writer_init_from_reader(),
+ append new files as needed, then finalize the archive which will write an
+ updated central directory to the
+ original archive. (This is basically what
+ mz_zip_add_mem_to_archive_file_in_place() does.) There's a
+ possibility that the archive's central directory could be lost with this
+ method if anything goes wrong, though.
+
+ - ZIP archive support limitations:
+ No zip64 or spanning support. Extraction functions can only handle
+ unencrypted, stored or deflated files.
+ Requires streams capable of seeking.
+
+ * This is a header file library, like stb_image.c. To get only a header file,
+ either cut and paste the
+ below header, or create miniz.h, #define MINIZ_HEADER_FILE_ONLY, and then
+ include miniz.c from it.
+
+ * Important: For best perf. be sure to customize the below macros for your
+ target platform:
+ #define MINIZ_USE_UNALIGNED_LOADS_AND_STORES 1
+ #define MINIZ_LITTLE_ENDIAN 1
+ #define MINIZ_HAS_64BIT_REGISTERS 1
+
+ * On platforms using glibc, Be sure to "#define _LARGEFILE64_SOURCE 1" before
+ including miniz.c to ensure miniz
+ uses the 64-bit variants: fopen64(), stat64(), etc. Otherwise you won't be
+ able to process large files
+ (i.e. 32-bit stat() fails for me on files > 0x7FFFFFFF bytes).
+*/
+
+#ifndef MINIZ_HEADER_INCLUDED
+#define MINIZ_HEADER_INCLUDED
+
+#include <stdlib.h>
+
+// Defines to completely disable specific portions of miniz.c:
+// If all macros here are defined the only functionality remaining will be
+// CRC-32, adler-32, tinfl, and tdefl.
+
+// Define MINIZ_NO_STDIO to disable all usage and any functions which rely on
+// stdio for file I/O.
+//#define MINIZ_NO_STDIO
+
+// If MINIZ_NO_TIME is specified then the ZIP archive functions will not be able
+// to get the current time, or
+// get/set file times, and the C run-time funcs that get/set times won't be
+// called.
+// The current downside is the times written to your archives will be from 1979.
+//#define MINIZ_NO_TIME
+
+// Define MINIZ_NO_ARCHIVE_APIS to disable all ZIP archive API's.
+//#define MINIZ_NO_ARCHIVE_APIS
+
+// Define MINIZ_NO_ARCHIVE_APIS to disable all writing related ZIP archive
+// API's.
+//#define MINIZ_NO_ARCHIVE_WRITING_APIS
+
+// Define MINIZ_NO_ZLIB_APIS to remove all ZLIB-style compression/decompression
+// API's.
+//#define MINIZ_NO_ZLIB_APIS
+
+// Define MINIZ_NO_ZLIB_COMPATIBLE_NAME to disable zlib names, to prevent
+// conflicts against stock zlib.
+//#define MINIZ_NO_ZLIB_COMPATIBLE_NAMES
+
+// Define MINIZ_NO_MALLOC to disable all calls to malloc, free, and realloc.
+// Note if MINIZ_NO_MALLOC is defined then the user must always provide custom
+// user alloc/free/realloc
+// callbacks to the zlib and archive API's, and a few stand-alone helper API's
+// which don't provide custom user
+// functions (such as tdefl_compress_mem_to_heap() and
+// tinfl_decompress_mem_to_heap()) won't work.
+//#define MINIZ_NO_MALLOC
+
+#if defined(__TINYC__) && (defined(__linux) || defined(__linux__))
+// TODO: Work around "error: include file 'sys\utime.h' when compiling with tcc
+// on Linux
+#define MINIZ_NO_TIME
+#endif
+
+#if !defined(MINIZ_NO_TIME) && !defined(MINIZ_NO_ARCHIVE_APIS)
+#include <time.h>
+#endif
+
+#if defined(_M_IX86) || defined(_M_X64) || defined(__i386__) || \
+ defined(__i386) || defined(__i486__) || defined(__i486) || \
+ defined(i386) || defined(__ia64__) || defined(__x86_64__)
+// MINIZ_X86_OR_X64_CPU is only used to help set the below macros.
+#define MINIZ_X86_OR_X64_CPU 1
+#endif
+
+#if defined(__sparcv9)
+// Big endian
+#else
+#if (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) || MINIZ_X86_OR_X64_CPU
+// Set MINIZ_LITTLE_ENDIAN to 1 if the processor is little endian.
+#define MINIZ_LITTLE_ENDIAN 1
+#endif
+#endif
+
+#if MINIZ_X86_OR_X64_CPU
+// Set MINIZ_USE_UNALIGNED_LOADS_AND_STORES to 1 on CPU's that permit efficient
+// integer loads and stores from unaligned addresses.
+//#define MINIZ_USE_UNALIGNED_LOADS_AND_STORES 1
+#define MINIZ_USE_UNALIGNED_LOADS_AND_STORES \
+ 0 // disable to suppress compiler warnings
+#endif
+
+#if defined(_M_X64) || defined(_WIN64) || defined(__MINGW64__) || \
+ defined(_LP64) || defined(__LP64__) || defined(__ia64__) || \
+ defined(__x86_64__)
+// Set MINIZ_HAS_64BIT_REGISTERS to 1 if operations on 64-bit integers are
+// reasonably fast (and don't involve compiler generated calls to helper
+// functions).
+#define MINIZ_HAS_64BIT_REGISTERS 1
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// ------------------- zlib-style API Definitions.
+
+// For more compatibility with zlib, miniz.c uses unsigned long for some
+// parameters/struct members. Beware: mz_ulong can be either 32 or 64-bits!
+typedef unsigned long mz_ulong;
+
+// mz_free() internally uses the MZ_FREE() macro (which by default calls free()
+// unless you've modified the MZ_MALLOC macro) to release a block allocated from
+// the heap.
+void mz_free(void *p);
+
+#define MZ_ADLER32_INIT (1)
+// mz_adler32() returns the initial adler-32 value to use when called with
+// ptr==NULL.
+mz_ulong mz_adler32(mz_ulong adler, const unsigned char *ptr, size_t buf_len);
+
+#define MZ_CRC32_INIT (0)
+// mz_crc32() returns the initial CRC-32 value to use when called with
+// ptr==NULL.
+mz_ulong mz_crc32(mz_ulong crc, const unsigned char *ptr, size_t buf_len);
+
+// Compression strategies.
+enum {
+ MZ_DEFAULT_STRATEGY = 0,
+ MZ_FILTERED = 1,
+ MZ_HUFFMAN_ONLY = 2,
+ MZ_RLE = 3,
+ MZ_FIXED = 4
+};
+
+// Method
+#define MZ_DEFLATED 8
+
+#ifndef MINIZ_NO_ZLIB_APIS
+
+// Heap allocation callbacks.
+// Note that mz_alloc_func parameter types purpsosely differ from zlib's:
+// items/size is size_t, not unsigned long.
+typedef void *(*mz_alloc_func)(void *opaque, size_t items, size_t size);
+typedef void (*mz_free_func)(void *opaque, void *address);
+typedef void *(*mz_realloc_func)(void *opaque, void *address, size_t items,
+ size_t size);
+
+#define MZ_VERSION "9.1.15"
+#define MZ_VERNUM 0x91F0
+#define MZ_VER_MAJOR 9
+#define MZ_VER_MINOR 1
+#define MZ_VER_REVISION 15
+#define MZ_VER_SUBREVISION 0
+
+// Flush values. For typical usage you only need MZ_NO_FLUSH and MZ_FINISH. The
+// other values are for advanced use (refer to the zlib docs).
+enum {
+ MZ_NO_FLUSH = 0,
+ MZ_PARTIAL_FLUSH = 1,
+ MZ_SYNC_FLUSH = 2,
+ MZ_FULL_FLUSH = 3,
+ MZ_FINISH = 4,
+ MZ_BLOCK = 5
+};
+
+// Return status codes. MZ_PARAM_ERROR is non-standard.
+enum {
+ MZ_OK = 0,
+ MZ_STREAM_END = 1,
+ MZ_NEED_DICT = 2,
+ MZ_ERRNO = -1,
+ MZ_STREAM_ERROR = -2,
+ MZ_DATA_ERROR = -3,
+ MZ_MEM_ERROR = -4,
+ MZ_BUF_ERROR = -5,
+ MZ_VERSION_ERROR = -6,
+ MZ_PARAM_ERROR = -10000
+};
+
+// Compression levels: 0-9 are the standard zlib-style levels, 10 is best
+// possible compression (not zlib compatible, and may be very slow),
+// MZ_DEFAULT_COMPRESSION=MZ_DEFAULT_LEVEL.
+enum {
+ MZ_NO_COMPRESSION = 0,
+ MZ_BEST_SPEED = 1,
+ MZ_BEST_COMPRESSION = 9,
+ MZ_UBER_COMPRESSION = 10,
+ MZ_DEFAULT_LEVEL = 6,
+ MZ_DEFAULT_COMPRESSION = -1
+};
+
+// Window bits
+#define MZ_DEFAULT_WINDOW_BITS 15
+
+struct mz_internal_state;
+
+// Compression/decompression stream struct.
+typedef struct mz_stream_s {
+ const unsigned char *next_in; // pointer to next byte to read
+ unsigned int avail_in; // number of bytes available at next_in
+ mz_ulong total_in; // total number of bytes consumed so far
+
+ unsigned char *next_out; // pointer to next byte to write
+ unsigned int avail_out; // number of bytes that can be written to next_out
+ mz_ulong total_out; // total number of bytes produced so far
+
+ char *msg; // error msg (unused)
+ struct mz_internal_state *state; // internal state, allocated by zalloc/zfree
+
+ mz_alloc_func
+ zalloc; // optional heap allocation function (defaults to malloc)
+ mz_free_func zfree; // optional heap free function (defaults to free)
+ void *opaque; // heap alloc function user pointer
+
+ int data_type; // data_type (unused)
+ mz_ulong adler; // adler32 of the source or uncompressed data
+ mz_ulong reserved; // not used
+} mz_stream;
+
+typedef mz_stream *mz_streamp;
+
+// Returns the version string of miniz.c.
+const char *mz_version(void);
+
+// mz_deflateInit() initializes a compressor with default options:
+// Parameters:
+// pStream must point to an initialized mz_stream struct.
+// level must be between [MZ_NO_COMPRESSION, MZ_BEST_COMPRESSION].
+// level 1 enables a specially optimized compression function that's been
+// optimized purely for performance, not ratio.
+// (This special func. is currently only enabled when
+// MINIZ_USE_UNALIGNED_LOADS_AND_STORES and MINIZ_LITTLE_ENDIAN are defined.)
+// Return values:
+// MZ_OK on success.
+// MZ_STREAM_ERROR if the stream is bogus.
+// MZ_PARAM_ERROR if the input parameters are bogus.
+// MZ_MEM_ERROR on out of memory.
+int mz_deflateInit(mz_streamp pStream, int level);
+
+// mz_deflateInit2() is like mz_deflate(), except with more control:
+// Additional parameters:
+// method must be MZ_DEFLATED
+// window_bits must be MZ_DEFAULT_WINDOW_BITS (to wrap the deflate stream with
+// zlib header/adler-32 footer) or -MZ_DEFAULT_WINDOW_BITS (raw deflate/no
+// header or footer)
+// mem_level must be between [1, 9] (it's checked but ignored by miniz.c)
+int mz_deflateInit2(mz_streamp pStream, int level, int method, int window_bits,
+ int mem_level, int strategy);
+
+// Quickly resets a compressor without having to reallocate anything. Same as
+// calling mz_deflateEnd() followed by mz_deflateInit()/mz_deflateInit2().
+int mz_deflateReset(mz_streamp pStream);
+
+// mz_deflate() compresses the input to output, consuming as much of the input
+// and producing as much output as possible.
+// Parameters:
+// pStream is the stream to read from and write to. You must initialize/update
+// the next_in, avail_in, next_out, and avail_out members.
+// flush may be MZ_NO_FLUSH, MZ_PARTIAL_FLUSH/MZ_SYNC_FLUSH, MZ_FULL_FLUSH, or
+// MZ_FINISH.
+// Return values:
+// MZ_OK on success (when flushing, or if more input is needed but not
+// available, and/or there's more output to be written but the output buffer
+// is full).
+// MZ_STREAM_END if all input has been consumed and all output bytes have been
+// written. Don't call mz_deflate() on the stream anymore.
+// MZ_STREAM_ERROR if the stream is bogus.
+// MZ_PARAM_ERROR if one of the parameters is invalid.
+// MZ_BUF_ERROR if no forward progress is possible because the input and/or
+// output buffers are empty. (Fill up the input buffer or free up some output
+// space and try again.)
+int mz_deflate(mz_streamp pStream, int flush);
+
+// mz_deflateEnd() deinitializes a compressor:
+// Return values:
+// MZ_OK on success.
+// MZ_STREAM_ERROR if the stream is bogus.
+int mz_deflateEnd(mz_streamp pStream);
+
+// mz_deflateBound() returns a (very) conservative upper bound on the amount of
+// data that could be generated by deflate(), assuming flush is set to only
+// MZ_NO_FLUSH or MZ_FINISH.
+mz_ulong mz_deflateBound(mz_streamp pStream, mz_ulong source_len);
+
+// Single-call compression functions mz_compress() and mz_compress2():
+// Returns MZ_OK on success, or one of the error codes from mz_deflate() on
+// failure.
+int mz_compress(unsigned char *pDest, mz_ulong *pDest_len,
+ const unsigned char *pSource, mz_ulong source_len);
+int mz_compress2(unsigned char *pDest, mz_ulong *pDest_len,
+ const unsigned char *pSource, mz_ulong source_len, int level);
+
+// mz_compressBound() returns a (very) conservative upper bound on the amount of
+// data that could be generated by calling mz_compress().
+mz_ulong mz_compressBound(mz_ulong source_len);
+
+// Initializes a decompressor.
+int mz_inflateInit(mz_streamp pStream);
+
+// mz_inflateInit2() is like mz_inflateInit() with an additional option that
+// controls the window size and whether or not the stream has been wrapped with
+// a zlib header/footer:
+// window_bits must be MZ_DEFAULT_WINDOW_BITS (to parse zlib header/footer) or
+// -MZ_DEFAULT_WINDOW_BITS (raw deflate).
+int mz_inflateInit2(mz_streamp pStream, int window_bits);
+
+// Decompresses the input stream to the output, consuming only as much of the
+// input as needed, and writing as much to the output as possible.
+// Parameters:
+// pStream is the stream to read from and write to. You must initialize/update
+// the next_in, avail_in, next_out, and avail_out members.
+// flush may be MZ_NO_FLUSH, MZ_SYNC_FLUSH, or MZ_FINISH.
+// On the first call, if flush is MZ_FINISH it's assumed the input and output
+// buffers are both sized large enough to decompress the entire stream in a
+// single call (this is slightly faster).
+// MZ_FINISH implies that there are no more source bytes available beside
+// what's already in the input buffer, and that the output buffer is large
+// enough to hold the rest of the decompressed data.
+// Return values:
+// MZ_OK on success. Either more input is needed but not available, and/or
+// there's more output to be written but the output buffer is full.
+// MZ_STREAM_END if all needed input has been consumed and all output bytes
+// have been written. For zlib streams, the adler-32 of the decompressed data
+// has also been verified.
+// MZ_STREAM_ERROR if the stream is bogus.
+// MZ_DATA_ERROR if the deflate stream is invalid.
+// MZ_PARAM_ERROR if one of the parameters is invalid.
+// MZ_BUF_ERROR if no forward progress is possible because the input buffer is
+// empty but the inflater needs more input to continue, or if the output
+// buffer is not large enough. Call mz_inflate() again
+// with more input data, or with more room in the output buffer (except when
+// using single call decompression, described above).
+int mz_inflate(mz_streamp pStream, int flush);
+
+// Deinitializes a decompressor.
+int mz_inflateEnd(mz_streamp pStream);
+
+// Single-call decompression.
+// Returns MZ_OK on success, or one of the error codes from mz_inflate() on
+// failure.
+int mz_uncompress(unsigned char *pDest, mz_ulong *pDest_len,
+ const unsigned char *pSource, mz_ulong source_len);
+
+// Returns a string description of the specified error code, or NULL if the
+// error code is invalid.
+const char *mz_error(int err);
+
+// Redefine zlib-compatible names to miniz equivalents, so miniz.c can be used
+// as a drop-in replacement for the subset of zlib that miniz.c supports.
+// Define MINIZ_NO_ZLIB_COMPATIBLE_NAMES to disable zlib-compatibility if you
+// use zlib in the same project.
+#ifndef MINIZ_NO_ZLIB_COMPATIBLE_NAMES
+typedef unsigned char Byte;
+typedef unsigned int uInt;
+typedef mz_ulong uLong;
+typedef Byte Bytef;
+typedef uInt uIntf;
+typedef char charf;
+typedef int intf;
+typedef void *voidpf;
+typedef uLong uLongf;
+typedef void *voidp;
+typedef void *const voidpc;
+#define Z_NULL 0
+#define Z_NO_FLUSH MZ_NO_FLUSH
+#define Z_PARTIAL_FLUSH MZ_PARTIAL_FLUSH
+#define Z_SYNC_FLUSH MZ_SYNC_FLUSH
+#define Z_FULL_FLUSH MZ_FULL_FLUSH
+#define Z_FINISH MZ_FINISH
+#define Z_BLOCK MZ_BLOCK
+#define Z_OK MZ_OK
+#define Z_STREAM_END MZ_STREAM_END
+#define Z_NEED_DICT MZ_NEED_DICT
+#define Z_ERRNO MZ_ERRNO
+#define Z_STREAM_ERROR MZ_STREAM_ERROR
+#define Z_DATA_ERROR MZ_DATA_ERROR
+#define Z_MEM_ERROR MZ_MEM_ERROR
+#define Z_BUF_ERROR MZ_BUF_ERROR
+#define Z_VERSION_ERROR MZ_VERSION_ERROR
+#define Z_PARAM_ERROR MZ_PARAM_ERROR
+#define Z_NO_COMPRESSION MZ_NO_COMPRESSION
+#define Z_BEST_SPEED MZ_BEST_SPEED
+#define Z_BEST_COMPRESSION MZ_BEST_COMPRESSION
+#define Z_DEFAULT_COMPRESSION MZ_DEFAULT_COMPRESSION
+#define Z_DEFAULT_STRATEGY MZ_DEFAULT_STRATEGY
+#define Z_FILTERED MZ_FILTERED
+#define Z_HUFFMAN_ONLY MZ_HUFFMAN_ONLY
+#define Z_RLE MZ_RLE
+#define Z_FIXED MZ_FIXED
+#define Z_DEFLATED MZ_DEFLATED
+#define Z_DEFAULT_WINDOW_BITS MZ_DEFAULT_WINDOW_BITS
+#define alloc_func mz_alloc_func
+#define free_func mz_free_func
+#define internal_state mz_internal_state
+#define z_stream mz_stream
+#define deflateInit mz_deflateInit
+#define deflateInit2 mz_deflateInit2
+#define deflateReset mz_deflateReset
+#define deflate mz_deflate
+#define deflateEnd mz_deflateEnd
+#define deflateBound mz_deflateBound
+#define compress mz_compress
+#define compress2 mz_compress2
+#define compressBound mz_compressBound
+#define inflateInit mz_inflateInit
+#define inflateInit2 mz_inflateInit2
+#define inflate mz_inflate
+#define inflateEnd mz_inflateEnd
+#define uncompress mz_uncompress
+#define crc32 mz_crc32
+#define adler32 mz_adler32
+#define MAX_WBITS 15
+#define MAX_MEM_LEVEL 9
+#define zError mz_error
+#define ZLIB_VERSION MZ_VERSION
+#define ZLIB_VERNUM MZ_VERNUM
+#define ZLIB_VER_MAJOR MZ_VER_MAJOR
+#define ZLIB_VER_MINOR MZ_VER_MINOR
+#define ZLIB_VER_REVISION MZ_VER_REVISION
+#define ZLIB_VER_SUBREVISION MZ_VER_SUBREVISION
+#define zlibVersion mz_version
+#define zlib_version mz_version()
+#endif // #ifndef MINIZ_NO_ZLIB_COMPATIBLE_NAMES
+
+#endif // MINIZ_NO_ZLIB_APIS
+
+// ------------------- Types and macros
+
+typedef unsigned char mz_uint8;
+typedef signed short mz_int16;
+typedef unsigned short mz_uint16;
+typedef unsigned int mz_uint32;
+typedef unsigned int mz_uint;
+typedef long long mz_int64;
+typedef unsigned long long mz_uint64;
+typedef int mz_bool;
+
+#define MZ_FALSE (0)
+#define MZ_TRUE (1)
+
+// An attempt to work around MSVC's spammy "warning C4127: conditional
+// expression is constant" message.
+#ifdef _MSC_VER
+#define MZ_MACRO_END while (0, 0)
+#else
+#define MZ_MACRO_END while (0)
+#endif
+
+// ------------------- ZIP archive reading/writing
+
+#ifndef MINIZ_NO_ARCHIVE_APIS
+
+enum {
+ MZ_ZIP_MAX_IO_BUF_SIZE = 64 * 1024,
+ MZ_ZIP_MAX_ARCHIVE_FILENAME_SIZE = 260,
+ MZ_ZIP_MAX_ARCHIVE_FILE_COMMENT_SIZE = 256
+};
+
+typedef struct {
+ mz_uint32 m_file_index;
+ mz_uint32 m_central_dir_ofs;
+ mz_uint16 m_version_made_by;
+ mz_uint16 m_version_needed;
+ mz_uint16 m_bit_flag;
+ mz_uint16 m_method;
+#ifndef MINIZ_NO_TIME
+ time_t m_time;
+#endif
+ mz_uint32 m_crc32;
+ mz_uint64 m_comp_size;
+ mz_uint64 m_uncomp_size;
+ mz_uint16 m_internal_attr;
+ mz_uint32 m_external_attr;
+ mz_uint64 m_local_header_ofs;
+ mz_uint32 m_comment_size;
+ char m_filename[MZ_ZIP_MAX_ARCHIVE_FILENAME_SIZE];
+ char m_comment[MZ_ZIP_MAX_ARCHIVE_FILE_COMMENT_SIZE];
+} mz_zip_archive_file_stat;
+
+typedef size_t (*mz_file_read_func)(void *pOpaque, mz_uint64 file_ofs,
+ void *pBuf, size_t n);
+typedef size_t (*mz_file_write_func)(void *pOpaque, mz_uint64 file_ofs,
+ const void *pBuf, size_t n);
+
+struct mz_zip_internal_state_tag;
+typedef struct mz_zip_internal_state_tag mz_zip_internal_state;
+
+typedef enum {
+ MZ_ZIP_MODE_INVALID = 0,
+ MZ_ZIP_MODE_READING = 1,
+ MZ_ZIP_MODE_WRITING = 2,
+ MZ_ZIP_MODE_WRITING_HAS_BEEN_FINALIZED = 3
+} mz_zip_mode;
+
+typedef struct mz_zip_archive_tag {
+ mz_uint64 m_archive_size;
+ mz_uint64 m_central_directory_file_ofs;
+ mz_uint m_total_files;
+ mz_zip_mode m_zip_mode;
+
+ mz_uint m_file_offset_alignment;
+
+ mz_alloc_func m_pAlloc;
+ mz_free_func m_pFree;
+ mz_realloc_func m_pRealloc;
+ void *m_pAlloc_opaque;
+
+ mz_file_read_func m_pRead;
+ mz_file_write_func m_pWrite;
+ void *m_pIO_opaque;
+
+ mz_zip_internal_state *m_pState;
+
+} mz_zip_archive;
+
+typedef enum {
+ MZ_ZIP_FLAG_CASE_SENSITIVE = 0x0100,
+ MZ_ZIP_FLAG_IGNORE_PATH = 0x0200,
+ MZ_ZIP_FLAG_COMPRESSED_DATA = 0x0400,
+ MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY = 0x0800
+} mz_zip_flags;
+
+// ZIP archive reading
+
+// Inits a ZIP archive reader.
+// These functions read and validate the archive's central directory.
+mz_bool mz_zip_reader_init(mz_zip_archive *pZip, mz_uint64 size,
+ mz_uint32 flags);
+mz_bool mz_zip_reader_init_mem(mz_zip_archive *pZip, const void *pMem,
+ size_t size, mz_uint32 flags);
+
+#ifndef MINIZ_NO_STDIO
+mz_bool mz_zip_reader_init_file(mz_zip_archive *pZip, const char *pFilename,
+ mz_uint32 flags);
+#endif
+
+// Returns the total number of files in the archive.
+mz_uint mz_zip_reader_get_num_files(mz_zip_archive *pZip);
+
+// Returns detailed information about an archive file entry.
+mz_bool mz_zip_reader_file_stat(mz_zip_archive *pZip, mz_uint file_index,
+ mz_zip_archive_file_stat *pStat);
+
+// Determines if an archive file entry is a directory entry.
+mz_bool mz_zip_reader_is_file_a_directory(mz_zip_archive *pZip,
+ mz_uint file_index);
+mz_bool mz_zip_reader_is_file_encrypted(mz_zip_archive *pZip,
+ mz_uint file_index);
+
+// Retrieves the filename of an archive file entry.
+// Returns the number of bytes written to pFilename, or if filename_buf_size is
+// 0 this function returns the number of bytes needed to fully store the
+// filename.
+mz_uint mz_zip_reader_get_filename(mz_zip_archive *pZip, mz_uint file_index,
+ char *pFilename, mz_uint filename_buf_size);
+
+// Attempts to locates a file in the archive's central directory.
+// Valid flags: MZ_ZIP_FLAG_CASE_SENSITIVE, MZ_ZIP_FLAG_IGNORE_PATH
+// Returns -1 if the file cannot be found.
+int mz_zip_reader_locate_file(mz_zip_archive *pZip, const char *pName,
+ const char *pComment, mz_uint flags);
+
+// Extracts a archive file to a memory buffer using no memory allocation.
+mz_bool mz_zip_reader_extract_to_mem_no_alloc(mz_zip_archive *pZip,
+ mz_uint file_index, void *pBuf,
+ size_t buf_size, mz_uint flags,
+ void *pUser_read_buf,
+ size_t user_read_buf_size);
+mz_bool mz_zip_reader_extract_file_to_mem_no_alloc(
+ mz_zip_archive *pZip, const char *pFilename, void *pBuf, size_t buf_size,
+ mz_uint flags, void *pUser_read_buf, size_t user_read_buf_size);
+
+// Extracts a archive file to a memory buffer.
+mz_bool mz_zip_reader_extract_to_mem(mz_zip_archive *pZip, mz_uint file_index,
+ void *pBuf, size_t buf_size,
+ mz_uint flags);
+mz_bool mz_zip_reader_extract_file_to_mem(mz_zip_archive *pZip,
+ const char *pFilename, void *pBuf,
+ size_t buf_size, mz_uint flags);
+
+// Extracts a archive file to a dynamically allocated heap buffer.
+void *mz_zip_reader_extract_to_heap(mz_zip_archive *pZip, mz_uint file_index,
+ size_t *pSize, mz_uint flags);
+void *mz_zip_reader_extract_file_to_heap(mz_zip_archive *pZip,
+ const char *pFilename, size_t *pSize,
+ mz_uint flags);
+
+// Extracts a archive file using a callback function to output the file's data.
+mz_bool mz_zip_reader_extract_to_callback(mz_zip_archive *pZip,
+ mz_uint file_index,
+ mz_file_write_func pCallback,
+ void *pOpaque, mz_uint flags);
+mz_bool mz_zip_reader_extract_file_to_callback(mz_zip_archive *pZip,
+ const char *pFilename,
+ mz_file_write_func pCallback,
+ void *pOpaque, mz_uint flags);
+
+#ifndef MINIZ_NO_STDIO
+// Extracts a archive file to a disk file and sets its last accessed and
+// modified times.
+// This function only extracts files, not archive directory records.
+mz_bool mz_zip_reader_extract_to_file(mz_zip_archive *pZip, mz_uint file_index,
+ const char *pDst_filename, mz_uint flags);
+mz_bool mz_zip_reader_extract_file_to_file(mz_zip_archive *pZip,
+ const char *pArchive_filename,
+ const char *pDst_filename,
+ mz_uint flags);
+#endif
+
+// Ends archive reading, freeing all allocations, and closing the input archive
+// file if mz_zip_reader_init_file() was used.
+mz_bool mz_zip_reader_end(mz_zip_archive *pZip);
+
+// ZIP archive writing
+
+#ifndef MINIZ_NO_ARCHIVE_WRITING_APIS
+
+// Inits a ZIP archive writer.
+mz_bool mz_zip_writer_init(mz_zip_archive *pZip, mz_uint64 existing_size);
+mz_bool mz_zip_writer_init_heap(mz_zip_archive *pZip,
+ size_t size_to_reserve_at_beginning,
+ size_t initial_allocation_size);
+
+#ifndef MINIZ_NO_STDIO
+mz_bool mz_zip_writer_init_file(mz_zip_archive *pZip, const char *pFilename,
+ mz_uint64 size_to_reserve_at_beginning);
+#endif
+
+// Converts a ZIP archive reader object into a writer object, to allow efficient
+// in-place file appends to occur on an existing archive.
+// For archives opened using mz_zip_reader_init_file, pFilename must be the
+// archive's filename so it can be reopened for writing. If the file can't be
+// reopened, mz_zip_reader_end() will be called.
+// For archives opened using mz_zip_reader_init_mem, the memory block must be
+// growable using the realloc callback (which defaults to realloc unless you've
+// overridden it).
+// Finally, for archives opened using mz_zip_reader_init, the mz_zip_archive's
+// user provided m_pWrite function cannot be NULL.
+// Note: In-place archive modification is not recommended unless you know what
+// you're doing, because if execution stops or something goes wrong before
+// the archive is finalized the file's central directory will be hosed.
+mz_bool mz_zip_writer_init_from_reader(mz_zip_archive *pZip,
+ const char *pFilename);
+
+// Adds the contents of a memory buffer to an archive. These functions record
+// the current local time into the archive.
+// To add a directory entry, call this method with an archive name ending in a
+// forwardslash with empty buffer.
+// level_and_flags - compression level (0-10, see MZ_BEST_SPEED,
+// MZ_BEST_COMPRESSION, etc.) logically OR'd with zero or more mz_zip_flags, or
+// just set to MZ_DEFAULT_COMPRESSION.
+mz_bool mz_zip_writer_add_mem(mz_zip_archive *pZip, const char *pArchive_name,
+ const void *pBuf, size_t buf_size,
+ mz_uint level_and_flags);
+mz_bool mz_zip_writer_add_mem_ex(mz_zip_archive *pZip,
+ const char *pArchive_name, const void *pBuf,
+ size_t buf_size, const void *pComment,
+ mz_uint16 comment_size,
+ mz_uint level_and_flags, mz_uint64 uncomp_size,
+ mz_uint32 uncomp_crc32);
+
+#ifndef MINIZ_NO_STDIO
+// Adds the contents of a disk file to an archive. This function also records
+// the disk file's modified time into the archive.
+// level_and_flags - compression level (0-10, see MZ_BEST_SPEED,
+// MZ_BEST_COMPRESSION, etc.) logically OR'd with zero or more mz_zip_flags, or
+// just set to MZ_DEFAULT_COMPRESSION.
+mz_bool mz_zip_writer_add_file(mz_zip_archive *pZip, const char *pArchive_name,
+ const char *pSrc_filename, const void *pComment,
+ mz_uint16 comment_size, mz_uint level_and_flags);
+#endif
+
+// Adds a file to an archive by fully cloning the data from another archive.
+// This function fully clones the source file's compressed data (no
+// recompression), along with its full filename, extra data, and comment fields.
+mz_bool mz_zip_writer_add_from_zip_reader(mz_zip_archive *pZip,
+ mz_zip_archive *pSource_zip,
+ mz_uint file_index);
+
+// Finalizes the archive by writing the central directory records followed by
+// the end of central directory record.
+// After an archive is finalized, the only valid call on the mz_zip_archive
+// struct is mz_zip_writer_end().
+// An archive must be manually finalized by calling this function for it to be
+// valid.
+mz_bool mz_zip_writer_finalize_archive(mz_zip_archive *pZip);
+mz_bool mz_zip_writer_finalize_heap_archive(mz_zip_archive *pZip, void **pBuf,
+ size_t *pSize);
+
+// Ends archive writing, freeing all allocations, and closing the output file if
+// mz_zip_writer_init_file() was used.
+// Note for the archive to be valid, it must have been finalized before ending.
+mz_bool mz_zip_writer_end(mz_zip_archive *pZip);
+
+// Misc. high-level helper functions:
+
+// mz_zip_add_mem_to_archive_file_in_place() efficiently (but not atomically)
+// appends a memory blob to a ZIP archive.
+// level_and_flags - compression level (0-10, see MZ_BEST_SPEED,
+// MZ_BEST_COMPRESSION, etc.) logically OR'd with zero or more mz_zip_flags, or
+// just set to MZ_DEFAULT_COMPRESSION.
+mz_bool mz_zip_add_mem_to_archive_file_in_place(
+ const char *pZip_filename, const char *pArchive_name, const void *pBuf,
+ size_t buf_size, const void *pComment, mz_uint16 comment_size,
+ mz_uint level_and_flags);
+
+// Reads a single file from an archive into a heap block.
+// Returns NULL on failure.
+void *mz_zip_extract_archive_file_to_heap(const char *pZip_filename,
+ const char *pArchive_name,
+ size_t *pSize, mz_uint zip_flags);
+
+#endif // #ifndef MINIZ_NO_ARCHIVE_WRITING_APIS
+
+#endif // #ifndef MINIZ_NO_ARCHIVE_APIS
+
+// ------------------- Low-level Decompression API Definitions
+
+// Decompression flags used by tinfl_decompress().
+// TINFL_FLAG_PARSE_ZLIB_HEADER: If set, the input has a valid zlib header and
+// ends with an adler32 checksum (it's a valid zlib stream). Otherwise, the
+// input is a raw deflate stream.
+// TINFL_FLAG_HAS_MORE_INPUT: If set, there are more input bytes available
+// beyond the end of the supplied input buffer. If clear, the input buffer
+// contains all remaining input.
+// TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF: If set, the output buffer is large
+// enough to hold the entire decompressed stream. If clear, the output buffer is
+// at least the size of the dictionary (typically 32KB).
+// TINFL_FLAG_COMPUTE_ADLER32: Force adler-32 checksum computation of the
+// decompressed bytes.
+enum {
+ TINFL_FLAG_PARSE_ZLIB_HEADER = 1,
+ TINFL_FLAG_HAS_MORE_INPUT = 2,
+ TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF = 4,
+ TINFL_FLAG_COMPUTE_ADLER32 = 8
+};
+
+// High level decompression functions:
+// tinfl_decompress_mem_to_heap() decompresses a block in memory to a heap block
+// allocated via malloc().
+// On entry:
+// pSrc_buf, src_buf_len: Pointer and size of the Deflate or zlib source data
+// to decompress.
+// On return:
+// Function returns a pointer to the decompressed data, or NULL on failure.
+// *pOut_len will be set to the decompressed data's size, which could be larger
+// than src_buf_len on uncompressible data.
+// The caller must call mz_free() on the returned block when it's no longer
+// needed.
+void *tinfl_decompress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len,
+ size_t *pOut_len, int flags);
+
+// tinfl_decompress_mem_to_mem() decompresses a block in memory to another block
+// in memory.
+// Returns TINFL_DECOMPRESS_MEM_TO_MEM_FAILED on failure, or the number of bytes
+// written on success.
+#define TINFL_DECOMPRESS_MEM_TO_MEM_FAILED ((size_t)(-1))
+size_t tinfl_decompress_mem_to_mem(void *pOut_buf, size_t out_buf_len,
+ const void *pSrc_buf, size_t src_buf_len,
+ int flags);
+
+// tinfl_decompress_mem_to_callback() decompresses a block in memory to an
+// internal 32KB buffer, and a user provided callback function will be called to
+// flush the buffer.
+// Returns 1 on success or 0 on failure.
+typedef int (*tinfl_put_buf_func_ptr)(const void *pBuf, int len, void *pUser);
+int tinfl_decompress_mem_to_callback(const void *pIn_buf, size_t *pIn_buf_size,
+ tinfl_put_buf_func_ptr pPut_buf_func,
+ void *pPut_buf_user, int flags);
+
+struct tinfl_decompressor_tag;
+typedef struct tinfl_decompressor_tag tinfl_decompressor;
+
+// Max size of LZ dictionary.
+#define TINFL_LZ_DICT_SIZE 32768
+
+// Return status.
+typedef enum {
+ TINFL_STATUS_BAD_PARAM = -3,
+ TINFL_STATUS_ADLER32_MISMATCH = -2,
+ TINFL_STATUS_FAILED = -1,
+ TINFL_STATUS_DONE = 0,
+ TINFL_STATUS_NEEDS_MORE_INPUT = 1,
+ TINFL_STATUS_HAS_MORE_OUTPUT = 2
+} tinfl_status;
+
+// Initializes the decompressor to its initial state.
+#define tinfl_init(r) \
+ do { \
+ (r)->m_state = 0; \
+ } \
+ MZ_MACRO_END
+#define tinfl_get_adler32(r) (r)->m_check_adler32
+
+// Main low-level decompressor coroutine function. This is the only function
+// actually needed for decompression. All the other functions are just
+// high-level helpers for improved usability.
+// This is a universal API, i.e. it can be used as a building block to build any
+// desired higher level decompression API. In the limit case, it can be called
+// once per every byte input or output.
+tinfl_status tinfl_decompress(tinfl_decompressor *r,
+ const mz_uint8 *pIn_buf_next,
+ size_t *pIn_buf_size, mz_uint8 *pOut_buf_start,
+ mz_uint8 *pOut_buf_next, size_t *pOut_buf_size,
+ const mz_uint32 decomp_flags);
+
+// Internal/private bits follow.
+enum {
+ TINFL_MAX_HUFF_TABLES = 3,
+ TINFL_MAX_HUFF_SYMBOLS_0 = 288,
+ TINFL_MAX_HUFF_SYMBOLS_1 = 32,
+ TINFL_MAX_HUFF_SYMBOLS_2 = 19,
+ TINFL_FAST_LOOKUP_BITS = 10,
+ TINFL_FAST_LOOKUP_SIZE = 1 << TINFL_FAST_LOOKUP_BITS
+};
+
+typedef struct {
+ mz_uint8 m_code_size[TINFL_MAX_HUFF_SYMBOLS_0];
+ mz_int16 m_look_up[TINFL_FAST_LOOKUP_SIZE],
+ m_tree[TINFL_MAX_HUFF_SYMBOLS_0 * 2];
+} tinfl_huff_table;
+
+#if MINIZ_HAS_64BIT_REGISTERS
+#define TINFL_USE_64BIT_BITBUF 1
+#endif
+
+#if TINFL_USE_64BIT_BITBUF
+typedef mz_uint64 tinfl_bit_buf_t;
+#define TINFL_BITBUF_SIZE (64)
+#else
+typedef mz_uint32 tinfl_bit_buf_t;
+#define TINFL_BITBUF_SIZE (32)
+#endif
+
+struct tinfl_decompressor_tag {
+ mz_uint32 m_state, m_num_bits, m_zhdr0, m_zhdr1, m_z_adler32, m_final, m_type,
+ m_check_adler32, m_dist, m_counter, m_num_extra,
+ m_table_sizes[TINFL_MAX_HUFF_TABLES];
+ tinfl_bit_buf_t m_bit_buf;
+ size_t m_dist_from_out_buf_start;
+ tinfl_huff_table m_tables[TINFL_MAX_HUFF_TABLES];
+ mz_uint8 m_raw_header[4],
+ m_len_codes[TINFL_MAX_HUFF_SYMBOLS_0 + TINFL_MAX_HUFF_SYMBOLS_1 + 137];
+};
+
+// ------------------- Low-level Compression API Definitions
+
+// Set TDEFL_LESS_MEMORY to 1 to use less memory (compression will be slightly
+// slower, and raw/dynamic blocks will be output more frequently).
+#define TDEFL_LESS_MEMORY 0
+
+// tdefl_init() compression flags logically OR'd together (low 12 bits contain
+// the max. number of probes per dictionary search):
+// TDEFL_DEFAULT_MAX_PROBES: The compressor defaults to 128 dictionary probes
+// per dictionary search. 0=Huffman only, 1=Huffman+LZ (fastest/crap
+// compression), 4095=Huffman+LZ (slowest/best compression).
+enum {
+ TDEFL_HUFFMAN_ONLY = 0,
+ TDEFL_DEFAULT_MAX_PROBES = 128,
+ TDEFL_MAX_PROBES_MASK = 0xFFF
+};
+
+// TDEFL_WRITE_ZLIB_HEADER: If set, the compressor outputs a zlib header before
+// the deflate data, and the Adler-32 of the source data at the end. Otherwise,
+// you'll get raw deflate data.
+// TDEFL_COMPUTE_ADLER32: Always compute the adler-32 of the input data (even
+// when not writing zlib headers).
+// TDEFL_GREEDY_PARSING_FLAG: Set to use faster greedy parsing, instead of more
+// efficient lazy parsing.
+// TDEFL_NONDETERMINISTIC_PARSING_FLAG: Enable to decrease the compressor's
+// initialization time to the minimum, but the output may vary from run to run
+// given the same input (depending on the contents of memory).
+// TDEFL_RLE_MATCHES: Only look for RLE matches (matches with a distance of 1)
+// TDEFL_FILTER_MATCHES: Discards matches <= 5 chars if enabled.
+// TDEFL_FORCE_ALL_STATIC_BLOCKS: Disable usage of optimized Huffman tables.
+// TDEFL_FORCE_ALL_RAW_BLOCKS: Only use raw (uncompressed) deflate blocks.
+// The low 12 bits are reserved to control the max # of hash probes per
+// dictionary lookup (see TDEFL_MAX_PROBES_MASK).
+enum {
+ TDEFL_WRITE_ZLIB_HEADER = 0x01000,
+ TDEFL_COMPUTE_ADLER32 = 0x02000,
+ TDEFL_GREEDY_PARSING_FLAG = 0x04000,
+ TDEFL_NONDETERMINISTIC_PARSING_FLAG = 0x08000,
+ TDEFL_RLE_MATCHES = 0x10000,
+ TDEFL_FILTER_MATCHES = 0x20000,
+ TDEFL_FORCE_ALL_STATIC_BLOCKS = 0x40000,
+ TDEFL_FORCE_ALL_RAW_BLOCKS = 0x80000
+};
+
+// High level compression functions:
+// tdefl_compress_mem_to_heap() compresses a block in memory to a heap block
+// allocated via malloc().
+// On entry:
+// pSrc_buf, src_buf_len: Pointer and size of source block to compress.
+// flags: The max match finder probes (default is 128) logically OR'd against
+// the above flags. Higher probes are slower but improve compression.
+// On return:
+// Function returns a pointer to the compressed data, or NULL on failure.
+// *pOut_len will be set to the compressed data's size, which could be larger
+// than src_buf_len on uncompressible data.
+// The caller must free() the returned block when it's no longer needed.
+void *tdefl_compress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len,
+ size_t *pOut_len, int flags);
+
+// tdefl_compress_mem_to_mem() compresses a block in memory to another block in
+// memory.
+// Returns 0 on failure.
+size_t tdefl_compress_mem_to_mem(void *pOut_buf, size_t out_buf_len,
+ const void *pSrc_buf, size_t src_buf_len,
+ int flags);
+
+// Compresses an image to a compressed PNG file in memory.
+// On entry:
+// pImage, w, h, and num_chans describe the image to compress. num_chans may be
+// 1, 2, 3, or 4.
+// The image pitch in bytes per scanline will be w*num_chans. The leftmost
+// pixel on the top scanline is stored first in memory.
+// level may range from [0,10], use MZ_NO_COMPRESSION, MZ_BEST_SPEED,
+// MZ_BEST_COMPRESSION, etc. or a decent default is MZ_DEFAULT_LEVEL
+// If flip is true, the image will be flipped on the Y axis (useful for OpenGL
+// apps).
+// On return:
+// Function returns a pointer to the compressed data, or NULL on failure.
+// *pLen_out will be set to the size of the PNG image file.
+// The caller must mz_free() the returned heap block (which will typically be
+// larger than *pLen_out) when it's no longer needed.
+void *tdefl_write_image_to_png_file_in_memory_ex(const void *pImage, int w,
+ int h, int num_chans,
+ size_t *pLen_out,
+ mz_uint level, mz_bool flip);
+void *tdefl_write_image_to_png_file_in_memory(const void *pImage, int w, int h,
+ int num_chans, size_t *pLen_out);
+
+// Output stream interface. The compressor uses this interface to write
+// compressed data. It'll typically be called TDEFL_OUT_BUF_SIZE at a time.
+typedef mz_bool (*tdefl_put_buf_func_ptr)(const void *pBuf, int len,
+ void *pUser);
+
+// tdefl_compress_mem_to_output() compresses a block to an output stream. The
+// above helpers use this function internally.
+mz_bool tdefl_compress_mem_to_output(const void *pBuf, size_t buf_len,
+ tdefl_put_buf_func_ptr pPut_buf_func,
+ void *pPut_buf_user, int flags);
+
+enum {
+ TDEFL_MAX_HUFF_TABLES = 3,
+ TDEFL_MAX_HUFF_SYMBOLS_0 = 288,
+ TDEFL_MAX_HUFF_SYMBOLS_1 = 32,
+ TDEFL_MAX_HUFF_SYMBOLS_2 = 19,
+ TDEFL_LZ_DICT_SIZE = 32768,
+ TDEFL_LZ_DICT_SIZE_MASK = TDEFL_LZ_DICT_SIZE - 1,
+ TDEFL_MIN_MATCH_LEN = 3,
+ TDEFL_MAX_MATCH_LEN = 258
+};
+
+// TDEFL_OUT_BUF_SIZE MUST be large enough to hold a single entire compressed
+// output block (using static/fixed Huffman codes).
+#if TDEFL_LESS_MEMORY
+enum {
+ TDEFL_LZ_CODE_BUF_SIZE = 24 * 1024,
+ TDEFL_OUT_BUF_SIZE = (TDEFL_LZ_CODE_BUF_SIZE * 13) / 10,
+ TDEFL_MAX_HUFF_SYMBOLS = 288,
+ TDEFL_LZ_HASH_BITS = 12,
+ TDEFL_LEVEL1_HASH_SIZE_MASK = 4095,
+ TDEFL_LZ_HASH_SHIFT = (TDEFL_LZ_HASH_BITS + 2) / 3,
+ TDEFL_LZ_HASH_SIZE = 1 << TDEFL_LZ_HASH_BITS
+};
+#else
+enum {
+ TDEFL_LZ_CODE_BUF_SIZE = 64 * 1024,
+ TDEFL_OUT_BUF_SIZE = (TDEFL_LZ_CODE_BUF_SIZE * 13) / 10,
+ TDEFL_MAX_HUFF_SYMBOLS = 288,
+ TDEFL_LZ_HASH_BITS = 15,
+ TDEFL_LEVEL1_HASH_SIZE_MASK = 4095,
+ TDEFL_LZ_HASH_SHIFT = (TDEFL_LZ_HASH_BITS + 2) / 3,
+ TDEFL_LZ_HASH_SIZE = 1 << TDEFL_LZ_HASH_BITS
+};
+#endif
+
+// The low-level tdefl functions below may be used directly if the above helper
+// functions aren't flexible enough. The low-level functions don't make any heap
+// allocations, unlike the above helper functions.
+typedef enum {
+ TDEFL_STATUS_BAD_PARAM = -2,
+ TDEFL_STATUS_PUT_BUF_FAILED = -1,
+ TDEFL_STATUS_OKAY = 0,
+ TDEFL_STATUS_DONE = 1,
+} tdefl_status;
+
+// Must map to MZ_NO_FLUSH, MZ_SYNC_FLUSH, etc. enums
+typedef enum {
+ TDEFL_NO_FLUSH = 0,
+ TDEFL_SYNC_FLUSH = 2,
+ TDEFL_FULL_FLUSH = 3,
+ TDEFL_FINISH = 4
+} tdefl_flush;
+
+// tdefl's compression state structure.
+typedef struct {
+ tdefl_put_buf_func_ptr m_pPut_buf_func;
+ void *m_pPut_buf_user;
+ mz_uint m_flags, m_max_probes[2];
+ int m_greedy_parsing;
+ mz_uint m_adler32, m_lookahead_pos, m_lookahead_size, m_dict_size;
+ mz_uint8 *m_pLZ_code_buf, *m_pLZ_flags, *m_pOutput_buf, *m_pOutput_buf_end;
+ mz_uint m_num_flags_left, m_total_lz_bytes, m_lz_code_buf_dict_pos, m_bits_in,
+ m_bit_buffer;
+ mz_uint m_saved_match_dist, m_saved_match_len, m_saved_lit,
+ m_output_flush_ofs, m_output_flush_remaining, m_finished, m_block_index,
+ m_wants_to_finish;
+ tdefl_status m_prev_return_status;
+ const void *m_pIn_buf;
+ void *m_pOut_buf;
+ size_t *m_pIn_buf_size, *m_pOut_buf_size;
+ tdefl_flush m_flush;
+ const mz_uint8 *m_pSrc;
+ size_t m_src_buf_left, m_out_buf_ofs;
+ mz_uint8 m_dict[TDEFL_LZ_DICT_SIZE + TDEFL_MAX_MATCH_LEN - 1];
+ mz_uint16 m_huff_count[TDEFL_MAX_HUFF_TABLES][TDEFL_MAX_HUFF_SYMBOLS];
+ mz_uint16 m_huff_codes[TDEFL_MAX_HUFF_TABLES][TDEFL_MAX_HUFF_SYMBOLS];
+ mz_uint8 m_huff_code_sizes[TDEFL_MAX_HUFF_TABLES][TDEFL_MAX_HUFF_SYMBOLS];
+ mz_uint8 m_lz_code_buf[TDEFL_LZ_CODE_BUF_SIZE];
+ mz_uint16 m_next[TDEFL_LZ_DICT_SIZE];
+ mz_uint16 m_hash[TDEFL_LZ_HASH_SIZE];
+ mz_uint8 m_output_buf[TDEFL_OUT_BUF_SIZE];
+} tdefl_compressor;
+
+// Initializes the compressor.
+// There is no corresponding deinit() function because the tdefl API's do not
+// dynamically allocate memory.
+// pBut_buf_func: If NULL, output data will be supplied to the specified
+// callback. In this case, the user should call the tdefl_compress_buffer() API
+// for compression.
+// If pBut_buf_func is NULL the user should always call the tdefl_compress()
+// API.
+// flags: See the above enums (TDEFL_HUFFMAN_ONLY, TDEFL_WRITE_ZLIB_HEADER,
+// etc.)
+tdefl_status tdefl_init(tdefl_compressor *d,
+ tdefl_put_buf_func_ptr pPut_buf_func,
+ void *pPut_buf_user, int flags);
+
+// Compresses a block of data, consuming as much of the specified input buffer
+// as possible, and writing as much compressed data to the specified output
+// buffer as possible.
+tdefl_status tdefl_compress(tdefl_compressor *d, const void *pIn_buf,
+ size_t *pIn_buf_size, void *pOut_buf,
+ size_t *pOut_buf_size, tdefl_flush flush);
+
+// tdefl_compress_buffer() is only usable when the tdefl_init() is called with a
+// non-NULL tdefl_put_buf_func_ptr.
+// tdefl_compress_buffer() always consumes the entire input buffer.
+tdefl_status tdefl_compress_buffer(tdefl_compressor *d, const void *pIn_buf,
+ size_t in_buf_size, tdefl_flush flush);
+
+tdefl_status tdefl_get_prev_return_status(tdefl_compressor *d);
+mz_uint32 tdefl_get_adler32(tdefl_compressor *d);
+
+// Can't use tdefl_create_comp_flags_from_zip_params if MINIZ_NO_ZLIB_APIS isn't
+// defined, because it uses some of its macros.
+#ifndef MINIZ_NO_ZLIB_APIS
+// Create tdefl_compress() flags given zlib-style compression parameters.
+// level may range from [0,10] (where 10 is absolute max compression, but may be
+// much slower on some files)
+// window_bits may be -15 (raw deflate) or 15 (zlib)
+// strategy may be either MZ_DEFAULT_STRATEGY, MZ_FILTERED, MZ_HUFFMAN_ONLY,
+// MZ_RLE, or MZ_FIXED
+mz_uint tdefl_create_comp_flags_from_zip_params(int level, int window_bits,
+ int strategy);
+#endif // #ifndef MINIZ_NO_ZLIB_APIS
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // MINIZ_HEADER_INCLUDED
+
+// ------------------- End of Header: Implementation follows. (If you only want
+// the header, define MINIZ_HEADER_FILE_ONLY.)
+
+#ifndef MINIZ_HEADER_FILE_ONLY
+
+typedef unsigned char mz_validate_uint16[sizeof(mz_uint16) == 2 ? 1 : -1];
+typedef unsigned char mz_validate_uint32[sizeof(mz_uint32) == 4 ? 1 : -1];
+typedef unsigned char mz_validate_uint64[sizeof(mz_uint64) == 8 ? 1 : -1];
+
+#include <string.h>
+#include <assert.h>
+
+#define MZ_ASSERT(x) assert(x)
+
+#ifdef MINIZ_NO_MALLOC
+#define MZ_MALLOC(x) NULL
+#define MZ_FREE(x) (void) x, ((void)0)
+#define MZ_REALLOC(p, x) NULL
+#else
+#define MZ_MALLOC(x) malloc(x)
+#define MZ_FREE(x) free(x)
+#define MZ_REALLOC(p, x) realloc(p, x)
+#endif
+
+#define MZ_MAX(a, b) (((a) > (b)) ? (a) : (b))
+#define MZ_MIN(a, b) (((a) < (b)) ? (a) : (b))
+#define MZ_CLEAR_OBJ(obj) memset(&(obj), 0, sizeof(obj))
+
+#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN
+#define MZ_READ_LE16(p) *((const mz_uint16 *)(p))
+#define MZ_READ_LE32(p) *((const mz_uint32 *)(p))
+#else
+#define MZ_READ_LE16(p) \
+ ((mz_uint32)(((const mz_uint8 *)(p))[0]) | \
+ ((mz_uint32)(((const mz_uint8 *)(p))[1]) << 8U))
+#define MZ_READ_LE32(p) \
+ ((mz_uint32)(((const mz_uint8 *)(p))[0]) | \
+ ((mz_uint32)(((const mz_uint8 *)(p))[1]) << 8U) | \
+ ((mz_uint32)(((const mz_uint8 *)(p))[2]) << 16U) | \
+ ((mz_uint32)(((const mz_uint8 *)(p))[3]) << 24U))
+#endif
+
+#ifdef _MSC_VER
+#define MZ_FORCEINLINE __forceinline
+#elif defined(__GNUC__)
+#define MZ_FORCEINLINE inline __attribute__((__always_inline__))
+#else
+#define MZ_FORCEINLINE inline
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// ------------------- zlib-style API's
+
+mz_ulong mz_adler32(mz_ulong adler, const unsigned char *ptr, size_t buf_len) {
+ mz_uint32 i, s1 = (mz_uint32)(adler & 0xffff), s2 = (mz_uint32)(adler >> 16);
+ size_t block_len = buf_len % 5552;
+ if (!ptr)
+ return MZ_ADLER32_INIT;
+ while (buf_len) {
+ for (i = 0; i + 7 < block_len; i += 8, ptr += 8) {
+ s1 += ptr[0], s2 += s1;
+ s1 += ptr[1], s2 += s1;
+ s1 += ptr[2], s2 += s1;
+ s1 += ptr[3], s2 += s1;
+ s1 += ptr[4], s2 += s1;
+ s1 += ptr[5], s2 += s1;
+ s1 += ptr[6], s2 += s1;
+ s1 += ptr[7], s2 += s1;
+ }
+ for (; i < block_len; ++i)
+ s1 += *ptr++, s2 += s1;
+ s1 %= 65521U, s2 %= 65521U;
+ buf_len -= block_len;
+ block_len = 5552;
+ }
+ return (s2 << 16) + s1;
+}
+
+// Karl Malbrain's compact CRC-32. See "A compact CCITT crc16 and crc32 C
+// implementation that balances processor cache usage against speed":
+// http://www.geocities.com/malbrain/
+mz_ulong mz_crc32(mz_ulong crc, const mz_uint8 *ptr, size_t buf_len) {
+ static const mz_uint32 s_crc32[16] = {
+ 0, 0x1db71064, 0x3b6e20c8, 0x26d930ac, 0x76dc4190, 0x6b6b51f4,
+ 0x4db26158, 0x5005713c, 0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c,
+ 0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c};
+ mz_uint32 crcu32 = (mz_uint32)crc;
+ if (!ptr)
+ return MZ_CRC32_INIT;
+ crcu32 = ~crcu32;
+ while (buf_len--) {
+ mz_uint8 b = *ptr++;
+ crcu32 = (crcu32 >> 4) ^ s_crc32[(crcu32 & 0xF) ^ (b & 0xF)];
+ crcu32 = (crcu32 >> 4) ^ s_crc32[(crcu32 & 0xF) ^ (b >> 4)];
+ }
+ return ~crcu32;
+}
+
+void mz_free(void *p) { MZ_FREE(p); }
+
+#ifndef MINIZ_NO_ZLIB_APIS
+
+static void *def_alloc_func(void *opaque, size_t items, size_t size) {
+ (void)opaque, (void)items, (void)size;
+ return MZ_MALLOC(items * size);
+}
+static void def_free_func(void *opaque, void *address) {
+ (void)opaque, (void)address;
+ MZ_FREE(address);
+}
+static void *def_realloc_func(void *opaque, void *address, size_t items,
+ size_t size) {
+ (void)opaque, (void)address, (void)items, (void)size;
+ return MZ_REALLOC(address, items * size);
+}
+
+const char *mz_version(void) { return MZ_VERSION; }
+
+int mz_deflateInit(mz_streamp pStream, int level) {
+ return mz_deflateInit2(pStream, level, MZ_DEFLATED, MZ_DEFAULT_WINDOW_BITS, 9,
+ MZ_DEFAULT_STRATEGY);
+}
+
+int mz_deflateInit2(mz_streamp pStream, int level, int method, int window_bits,
+ int mem_level, int strategy) {
+ tdefl_compressor *pComp;
+ mz_uint comp_flags =
+ TDEFL_COMPUTE_ADLER32 |
+ tdefl_create_comp_flags_from_zip_params(level, window_bits, strategy);
+
+ if (!pStream)
+ return MZ_STREAM_ERROR;
+ if ((method != MZ_DEFLATED) || ((mem_level < 1) || (mem_level > 9)) ||
+ ((window_bits != MZ_DEFAULT_WINDOW_BITS) &&
+ (-window_bits != MZ_DEFAULT_WINDOW_BITS)))
+ return MZ_PARAM_ERROR;
+
+ pStream->data_type = 0;
+ pStream->adler = MZ_ADLER32_INIT;
+ pStream->msg = NULL;
+ pStream->reserved = 0;
+ pStream->total_in = 0;
+ pStream->total_out = 0;
+ if (!pStream->zalloc)
+ pStream->zalloc = def_alloc_func;
+ if (!pStream->zfree)
+ pStream->zfree = def_free_func;
+
+ pComp = (tdefl_compressor *)pStream->zalloc(pStream->opaque, 1,
+ sizeof(tdefl_compressor));
+ if (!pComp)
+ return MZ_MEM_ERROR;
+
+ pStream->state = (struct mz_internal_state *)pComp;
+
+ if (tdefl_init(pComp, NULL, NULL, comp_flags) != TDEFL_STATUS_OKAY) {
+ mz_deflateEnd(pStream);
+ return MZ_PARAM_ERROR;
+ }
+
+ return MZ_OK;
+}
+
+int mz_deflateReset(mz_streamp pStream) {
+ if ((!pStream) || (!pStream->state) || (!pStream->zalloc) ||
+ (!pStream->zfree))
+ return MZ_STREAM_ERROR;
+ pStream->total_in = pStream->total_out = 0;
+ tdefl_init((tdefl_compressor *)pStream->state, NULL, NULL,
+ ((tdefl_compressor *)pStream->state)->m_flags);
+ return MZ_OK;
+}
+
+int mz_deflate(mz_streamp pStream, int flush) {
+ size_t in_bytes, out_bytes;
+ mz_ulong orig_total_in, orig_total_out;
+ int mz_status = MZ_OK;
+
+ if ((!pStream) || (!pStream->state) || (flush < 0) || (flush > MZ_FINISH) ||
+ (!pStream->next_out))
+ return MZ_STREAM_ERROR;
+ if (!pStream->avail_out)
+ return MZ_BUF_ERROR;
+
+ if (flush == MZ_PARTIAL_FLUSH)
+ flush = MZ_SYNC_FLUSH;
+
+ if (((tdefl_compressor *)pStream->state)->m_prev_return_status ==
+ TDEFL_STATUS_DONE)
+ return (flush == MZ_FINISH) ? MZ_STREAM_END : MZ_BUF_ERROR;
+
+ orig_total_in = pStream->total_in;
+ orig_total_out = pStream->total_out;
+ for (;;) {
+ tdefl_status defl_status;
+ in_bytes = pStream->avail_in;
+ out_bytes = pStream->avail_out;
+
+ defl_status = tdefl_compress((tdefl_compressor *)pStream->state,
+ pStream->next_in, &in_bytes, pStream->next_out,
+ &out_bytes, (tdefl_flush)flush);
+ pStream->next_in += (mz_uint)in_bytes;
+ pStream->avail_in -= (mz_uint)in_bytes;
+ pStream->total_in += (mz_uint)in_bytes;
+ pStream->adler = tdefl_get_adler32((tdefl_compressor *)pStream->state);
+
+ pStream->next_out += (mz_uint)out_bytes;
+ pStream->avail_out -= (mz_uint)out_bytes;
+ pStream->total_out += (mz_uint)out_bytes;
+
+ if (defl_status < 0) {
+ mz_status = MZ_STREAM_ERROR;
+ break;
+ } else if (defl_status == TDEFL_STATUS_DONE) {
+ mz_status = MZ_STREAM_END;
+ break;
+ } else if (!pStream->avail_out)
+ break;
+ else if ((!pStream->avail_in) && (flush != MZ_FINISH)) {
+ if ((flush) || (pStream->total_in != orig_total_in) ||
+ (pStream->total_out != orig_total_out))
+ break;
+ return MZ_BUF_ERROR; // Can't make forward progress without some input.
+ }
+ }
+ return mz_status;
+}
+
+int mz_deflateEnd(mz_streamp pStream) {
+ if (!pStream)
+ return MZ_STREAM_ERROR;
+ if (pStream->state) {
+ pStream->zfree(pStream->opaque, pStream->state);
+ pStream->state = NULL;
+ }
+ return MZ_OK;
+}
+
+mz_ulong mz_deflateBound(mz_streamp pStream, mz_ulong source_len) {
+ (void)pStream;
+ // This is really over conservative. (And lame, but it's actually pretty
+ // tricky to compute a true upper bound given the way tdefl's blocking works.)
+ return MZ_MAX(128 + (source_len * 110) / 100,
+ 128 + source_len + ((source_len / (31 * 1024)) + 1) * 5);
+}
+
+int mz_compress2(unsigned char *pDest, mz_ulong *pDest_len,
+ const unsigned char *pSource, mz_ulong source_len, int level) {
+ int status;
+ mz_stream stream;
+ memset(&stream, 0, sizeof(stream));
+
+ // In case mz_ulong is 64-bits (argh I hate longs).
+ if ((source_len | *pDest_len) > 0xFFFFFFFFU)
+ return MZ_PARAM_ERROR;
+
+ stream.next_in = pSource;
+ stream.avail_in = (mz_uint32)source_len;
+ stream.next_out = pDest;
+ stream.avail_out = (mz_uint32)*pDest_len;
+
+ status = mz_deflateInit(&stream, level);
+ if (status != MZ_OK)
+ return status;
+
+ status = mz_deflate(&stream, MZ_FINISH);
+ if (status != MZ_STREAM_END) {
+ mz_deflateEnd(&stream);
+ return (status == MZ_OK) ? MZ_BUF_ERROR : status;
+ }
+
+ *pDest_len = stream.total_out;
+ return mz_deflateEnd(&stream);
+}
+
+int mz_compress(unsigned char *pDest, mz_ulong *pDest_len,
+ const unsigned char *pSource, mz_ulong source_len) {
+ return mz_compress2(pDest, pDest_len, pSource, source_len,
+ MZ_DEFAULT_COMPRESSION);
+}
+
+mz_ulong mz_compressBound(mz_ulong source_len) {
+ return mz_deflateBound(NULL, source_len);
+}
+
+typedef struct {
+ tinfl_decompressor m_decomp;
+ mz_uint m_dict_ofs, m_dict_avail, m_first_call, m_has_flushed;
+ int m_window_bits;
+ mz_uint8 m_dict[TINFL_LZ_DICT_SIZE];
+ tinfl_status m_last_status;
+} inflate_state;
+
+int mz_inflateInit2(mz_streamp pStream, int window_bits) {
+ inflate_state *pDecomp;
+ if (!pStream)
+ return MZ_STREAM_ERROR;
+ if ((window_bits != MZ_DEFAULT_WINDOW_BITS) &&
+ (-window_bits != MZ_DEFAULT_WINDOW_BITS))
+ return MZ_PARAM_ERROR;
+
+ pStream->data_type = 0;
+ pStream->adler = 0;
+ pStream->msg = NULL;
+ pStream->total_in = 0;
+ pStream->total_out = 0;
+ pStream->reserved = 0;
+ if (!pStream->zalloc)
+ pStream->zalloc = def_alloc_func;
+ if (!pStream->zfree)
+ pStream->zfree = def_free_func;
+
+ pDecomp = (inflate_state *)pStream->zalloc(pStream->opaque, 1,
+ sizeof(inflate_state));
+ if (!pDecomp)
+ return MZ_MEM_ERROR;
+
+ pStream->state = (struct mz_internal_state *)pDecomp;
+
+ tinfl_init(&pDecomp->m_decomp);
+ pDecomp->m_dict_ofs = 0;
+ pDecomp->m_dict_avail = 0;
+ pDecomp->m_last_status = TINFL_STATUS_NEEDS_MORE_INPUT;
+ pDecomp->m_first_call = 1;
+ pDecomp->m_has_flushed = 0;
+ pDecomp->m_window_bits = window_bits;
+
+ return MZ_OK;
+}
+
+int mz_inflateInit(mz_streamp pStream) {
+ return mz_inflateInit2(pStream, MZ_DEFAULT_WINDOW_BITS);
+}
+
+int mz_inflate(mz_streamp pStream, int flush) {
+ inflate_state *pState;
+ mz_uint n, first_call, decomp_flags = TINFL_FLAG_COMPUTE_ADLER32;
+ size_t in_bytes, out_bytes, orig_avail_in;
+ tinfl_status status;
+
+ if ((!pStream) || (!pStream->state))
+ return MZ_STREAM_ERROR;
+ if (flush == MZ_PARTIAL_FLUSH)
+ flush = MZ_SYNC_FLUSH;
+ if ((flush) && (flush != MZ_SYNC_FLUSH) && (flush != MZ_FINISH))
+ return MZ_STREAM_ERROR;
+
+ pState = (inflate_state *)pStream->state;
+ if (pState->m_window_bits > 0)
+ decomp_flags |= TINFL_FLAG_PARSE_ZLIB_HEADER;
+ orig_avail_in = pStream->avail_in;
+
+ first_call = pState->m_first_call;
+ pState->m_first_call = 0;
+ if (pState->m_last_status < 0)
+ return MZ_DATA_ERROR;
+
+ if (pState->m_has_flushed && (flush != MZ_FINISH))
+ return MZ_STREAM_ERROR;
+ pState->m_has_flushed |= (flush == MZ_FINISH);
+
+ if ((flush == MZ_FINISH) && (first_call)) {
+ // MZ_FINISH on the first call implies that the input and output buffers are
+ // large enough to hold the entire compressed/decompressed file.
+ decomp_flags |= TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF;
+ in_bytes = pStream->avail_in;
+ out_bytes = pStream->avail_out;
+ status = tinfl_decompress(&pState->m_decomp, pStream->next_in, &in_bytes,
+ pStream->next_out, pStream->next_out, &out_bytes,
+ decomp_flags);
+ pState->m_last_status = status;
+ pStream->next_in += (mz_uint)in_bytes;
+ pStream->avail_in -= (mz_uint)in_bytes;
+ pStream->total_in += (mz_uint)in_bytes;
+ pStream->adler = tinfl_get_adler32(&pState->m_decomp);
+ pStream->next_out += (mz_uint)out_bytes;
+ pStream->avail_out -= (mz_uint)out_bytes;
+ pStream->total_out += (mz_uint)out_bytes;
+
+ if (status < 0)
+ return MZ_DATA_ERROR;
+ else if (status != TINFL_STATUS_DONE) {
+ pState->m_last_status = TINFL_STATUS_FAILED;
+ return MZ_BUF_ERROR;
+ }
+ return MZ_STREAM_END;
+ }
+ // flush != MZ_FINISH then we must assume there's more input.
+ if (flush != MZ_FINISH)
+ decomp_flags |= TINFL_FLAG_HAS_MORE_INPUT;
+
+ if (pState->m_dict_avail) {
+ n = MZ_MIN(pState->m_dict_avail, pStream->avail_out);
+ memcpy(pStream->next_out, pState->m_dict + pState->m_dict_ofs, n);
+ pStream->next_out += n;
+ pStream->avail_out -= n;
+ pStream->total_out += n;
+ pState->m_dict_avail -= n;
+ pState->m_dict_ofs = (pState->m_dict_ofs + n) & (TINFL_LZ_DICT_SIZE - 1);
+ return ((pState->m_last_status == TINFL_STATUS_DONE) &&
+ (!pState->m_dict_avail))
+ ? MZ_STREAM_END
+ : MZ_OK;
+ }
+
+ for (;;) {
+ in_bytes = pStream->avail_in;
+ out_bytes = TINFL_LZ_DICT_SIZE - pState->m_dict_ofs;
+
+ status = tinfl_decompress(
+ &pState->m_decomp, pStream->next_in, &in_bytes, pState->m_dict,
+ pState->m_dict + pState->m_dict_ofs, &out_bytes, decomp_flags);
+ pState->m_last_status = status;
+
+ pStream->next_in += (mz_uint)in_bytes;
+ pStream->avail_in -= (mz_uint)in_bytes;
+ pStream->total_in += (mz_uint)in_bytes;
+ pStream->adler = tinfl_get_adler32(&pState->m_decomp);
+
+ pState->m_dict_avail = (mz_uint)out_bytes;
+
+ n = MZ_MIN(pState->m_dict_avail, pStream->avail_out);
+ memcpy(pStream->next_out, pState->m_dict + pState->m_dict_ofs, n);
+ pStream->next_out += n;
+ pStream->avail_out -= n;
+ pStream->total_out += n;
+ pState->m_dict_avail -= n;
+ pState->m_dict_ofs = (pState->m_dict_ofs + n) & (TINFL_LZ_DICT_SIZE - 1);
+
+ if (status < 0)
+ return MZ_DATA_ERROR; // Stream is corrupted (there could be some
+ // uncompressed data left in the output dictionary -
+ // oh well).
+ else if ((status == TINFL_STATUS_NEEDS_MORE_INPUT) && (!orig_avail_in))
+ return MZ_BUF_ERROR; // Signal caller that we can't make forward progress
+ // without supplying more input or by setting flush
+ // to MZ_FINISH.
+ else if (flush == MZ_FINISH) {
+ // The output buffer MUST be large to hold the remaining uncompressed data
+ // when flush==MZ_FINISH.
+ if (status == TINFL_STATUS_DONE)
+ return pState->m_dict_avail ? MZ_BUF_ERROR : MZ_STREAM_END;
+ // status here must be TINFL_STATUS_HAS_MORE_OUTPUT, which means there's
+ // at least 1 more byte on the way. If there's no more room left in the
+ // output buffer then something is wrong.
+ else if (!pStream->avail_out)
+ return MZ_BUF_ERROR;
+ } else if ((status == TINFL_STATUS_DONE) || (!pStream->avail_in) ||
+ (!pStream->avail_out) || (pState->m_dict_avail))
+ break;
+ }
+
+ return ((status == TINFL_STATUS_DONE) && (!pState->m_dict_avail))
+ ? MZ_STREAM_END
+ : MZ_OK;
+}
+
+int mz_inflateEnd(mz_streamp pStream) {
+ if (!pStream)
+ return MZ_STREAM_ERROR;
+ if (pStream->state) {
+ pStream->zfree(pStream->opaque, pStream->state);
+ pStream->state = NULL;
+ }
+ return MZ_OK;
+}
+
+int mz_uncompress(unsigned char *pDest, mz_ulong *pDest_len,
+ const unsigned char *pSource, mz_ulong source_len) {
+ mz_stream stream;
+ int status;
+ memset(&stream, 0, sizeof(stream));
+
+ // In case mz_ulong is 64-bits (argh I hate longs).
+ if ((source_len | *pDest_len) > 0xFFFFFFFFU)
+ return MZ_PARAM_ERROR;
+
+ stream.next_in = pSource;
+ stream.avail_in = (mz_uint32)source_len;
+ stream.next_out = pDest;
+ stream.avail_out = (mz_uint32)*pDest_len;
+
+ status = mz_inflateInit(&stream);
+ if (status != MZ_OK)
+ return status;
+
+ status = mz_inflate(&stream, MZ_FINISH);
+ if (status != MZ_STREAM_END) {
+ mz_inflateEnd(&stream);
+ return ((status == MZ_BUF_ERROR) && (!stream.avail_in)) ? MZ_DATA_ERROR
+ : status;
+ }
+ *pDest_len = stream.total_out;
+
+ return mz_inflateEnd(&stream);
+}
+
+const char *mz_error(int err) {
+ static struct {
+ int m_err;
+ const char *m_pDesc;
+ } s_error_descs[] = {{MZ_OK, ""},
+ {MZ_STREAM_END, "stream end"},
+ {MZ_NEED_DICT, "need dictionary"},
+ {MZ_ERRNO, "file error"},
+ {MZ_STREAM_ERROR, "stream error"},
+ {MZ_DATA_ERROR, "data error"},
+ {MZ_MEM_ERROR, "out of memory"},
+ {MZ_BUF_ERROR, "buf error"},
+ {MZ_VERSION_ERROR, "version error"},
+ {MZ_PARAM_ERROR, "parameter error"}};
+ mz_uint i;
+ for (i = 0; i < sizeof(s_error_descs) / sizeof(s_error_descs[0]); ++i)
+ if (s_error_descs[i].m_err == err)
+ return s_error_descs[i].m_pDesc;
+ return NULL;
+}
+
+#endif // MINIZ_NO_ZLIB_APIS
+
+// ------------------- Low-level Decompression (completely independent from all
+// compression API's)
+
+#define TINFL_MEMCPY(d, s, l) memcpy(d, s, l)
+#define TINFL_MEMSET(p, c, l) memset(p, c, l)
+
+#define TINFL_CR_BEGIN \
+ switch (r->m_state) { \
+ case 0:
+#define TINFL_CR_RETURN(state_index, result) \
+ do { \
+ status = result; \
+ r->m_state = state_index; \
+ goto common_exit; \
+ case state_index: \
+ ; \
+ } \
+ MZ_MACRO_END
+#define TINFL_CR_RETURN_FOREVER(state_index, result) \
+ do { \
+ for (;;) { \
+ TINFL_CR_RETURN(state_index, result); \
+ } \
+ } \
+ MZ_MACRO_END
+#define TINFL_CR_FINISH }
+
+// TODO: If the caller has indicated that there's no more input, and we attempt
+// to read beyond the input buf, then something is wrong with the input because
+// the inflator never
+// reads ahead more than it needs to. Currently TINFL_GET_BYTE() pads the end of
+// the stream with 0's in this scenario.
+#define TINFL_GET_BYTE(state_index, c) \
+ do { \
+ if (pIn_buf_cur >= pIn_buf_end) { \
+ for (;;) { \
+ if (decomp_flags & TINFL_FLAG_HAS_MORE_INPUT) { \
+ TINFL_CR_RETURN(state_index, TINFL_STATUS_NEEDS_MORE_INPUT); \
+ if (pIn_buf_cur < pIn_buf_end) { \
+ c = *pIn_buf_cur++; \
+ break; \
+ } \
+ } else { \
+ c = 0; \
+ break; \
+ } \
+ } \
+ } else \
+ c = *pIn_buf_cur++; \
+ } \
+ MZ_MACRO_END
+
+#define TINFL_NEED_BITS(state_index, n) \
+ do { \
+ mz_uint c; \
+ TINFL_GET_BYTE(state_index, c); \
+ bit_buf |= (((tinfl_bit_buf_t)c) << num_bits); \
+ num_bits += 8; \
+ } while (num_bits < (mz_uint)(n))
+#define TINFL_SKIP_BITS(state_index, n) \
+ do { \
+ if (num_bits < (mz_uint)(n)) { \
+ TINFL_NEED_BITS(state_index, n); \
+ } \
+ bit_buf >>= (n); \
+ num_bits -= (n); \
+ } \
+ MZ_MACRO_END
+#define TINFL_GET_BITS(state_index, b, n) \
+ do { \
+ if (num_bits < (mz_uint)(n)) { \
+ TINFL_NEED_BITS(state_index, n); \
+ } \
+ b = bit_buf & ((1 << (n)) - 1); \
+ bit_buf >>= (n); \
+ num_bits -= (n); \
+ } \
+ MZ_MACRO_END
+
+// TINFL_HUFF_BITBUF_FILL() is only used rarely, when the number of bytes
+// remaining in the input buffer falls below 2.
+// It reads just enough bytes from the input stream that are needed to decode
+// the next Huffman code (and absolutely no more). It works by trying to fully
+// decode a
+// Huffman code by using whatever bits are currently present in the bit buffer.
+// If this fails, it reads another byte, and tries again until it succeeds or
+// until the
+// bit buffer contains >=15 bits (deflate's max. Huffman code size).
+#define TINFL_HUFF_BITBUF_FILL(state_index, pHuff) \
+ do { \
+ temp = (pHuff)->m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]; \
+ if (temp >= 0) { \
+ code_len = temp >> 9; \
+ if ((code_len) && (num_bits >= code_len)) \
+ break; \
+ } else if (num_bits > TINFL_FAST_LOOKUP_BITS) { \
+ code_len = TINFL_FAST_LOOKUP_BITS; \
+ do { \
+ temp = (pHuff)->m_tree[~temp + ((bit_buf >> code_len++) & 1)]; \
+ } while ((temp < 0) && (num_bits >= (code_len + 1))); \
+ if (temp >= 0) \
+ break; \
+ } \
+ TINFL_GET_BYTE(state_index, c); \
+ bit_buf |= (((tinfl_bit_buf_t)c) << num_bits); \
+ num_bits += 8; \
+ } while (num_bits < 15);
+
+// TINFL_HUFF_DECODE() decodes the next Huffman coded symbol. It's more complex
+// than you would initially expect because the zlib API expects the decompressor
+// to never read
+// beyond the final byte of the deflate stream. (In other words, when this macro
+// wants to read another byte from the input, it REALLY needs another byte in
+// order to fully
+// decode the next Huffman code.) Handling this properly is particularly
+// important on raw deflate (non-zlib) streams, which aren't followed by a byte
+// aligned adler-32.
+// The slow path is only executed at the very end of the input buffer.
+#define TINFL_HUFF_DECODE(state_index, sym, pHuff) \
+ do { \
+ int temp; \
+ mz_uint code_len, c; \
+ if (num_bits < 15) { \
+ if ((pIn_buf_end - pIn_buf_cur) < 2) { \
+ TINFL_HUFF_BITBUF_FILL(state_index, pHuff); \
+ } else { \
+ bit_buf |= (((tinfl_bit_buf_t)pIn_buf_cur[0]) << num_bits) | \
+ (((tinfl_bit_buf_t)pIn_buf_cur[1]) << (num_bits + 8)); \
+ pIn_buf_cur += 2; \
+ num_bits += 16; \
+ } \
+ } \
+ if ((temp = (pHuff)->m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= \
+ 0) \
+ code_len = temp >> 9, temp &= 511; \
+ else { \
+ code_len = TINFL_FAST_LOOKUP_BITS; \
+ do { \
+ temp = (pHuff)->m_tree[~temp + ((bit_buf >> code_len++) & 1)]; \
+ } while (temp < 0); \
+ } \
+ sym = temp; \
+ bit_buf >>= code_len; \
+ num_bits -= code_len; \
+ } \
+ MZ_MACRO_END
+
+tinfl_status tinfl_decompress(tinfl_decompressor *r,
+ const mz_uint8 *pIn_buf_next,
+ size_t *pIn_buf_size, mz_uint8 *pOut_buf_start,
+ mz_uint8 *pOut_buf_next, size_t *pOut_buf_size,
+ const mz_uint32 decomp_flags) {
+ static const int s_length_base[31] = {
+ 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
+ 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0};
+ static const int s_length_extra[31] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,
+ 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4,
+ 4, 4, 5, 5, 5, 5, 0, 0, 0};
+ static const int s_dist_base[32] = {
+ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33,
+ 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537,
+ 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 0, 0};
+ static const int s_dist_extra[32] = {0, 0, 0, 0, 1, 1, 2, 2, 3, 3,
+ 4, 4, 5, 5, 6, 6, 7, 7, 8, 8,
+ 9, 9, 10, 10, 11, 11, 12, 12, 13, 13};
+ static const mz_uint8 s_length_dezigzag[19] = {
+ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
+ static const int s_min_table_sizes[3] = {257, 1, 4};
+
+ tinfl_status status = TINFL_STATUS_FAILED;
+ mz_uint32 num_bits, dist, counter, num_extra;
+ tinfl_bit_buf_t bit_buf;
+ const mz_uint8 *pIn_buf_cur = pIn_buf_next,
+ *const pIn_buf_end = pIn_buf_next + *pIn_buf_size;
+ mz_uint8 *pOut_buf_cur = pOut_buf_next,
+ *const pOut_buf_end = pOut_buf_next + *pOut_buf_size;
+ size_t out_buf_size_mask =
+ (decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF)
+ ? (size_t)-1
+ : ((pOut_buf_next - pOut_buf_start) + *pOut_buf_size) - 1,
+ dist_from_out_buf_start;
+
+ // Ensure the output buffer's size is a power of 2, unless the output buffer
+ // is large enough to hold the entire output file (in which case it doesn't
+ // matter).
+ if (((out_buf_size_mask + 1) & out_buf_size_mask) ||
+ (pOut_buf_next < pOut_buf_start)) {
+ *pIn_buf_size = *pOut_buf_size = 0;
+ return TINFL_STATUS_BAD_PARAM;
+ }
+
+ num_bits = r->m_num_bits;
+ bit_buf = r->m_bit_buf;
+ dist = r->m_dist;
+ counter = r->m_counter;
+ num_extra = r->m_num_extra;
+ dist_from_out_buf_start = r->m_dist_from_out_buf_start;
+ TINFL_CR_BEGIN
+
+ bit_buf = num_bits = dist = counter = num_extra = r->m_zhdr0 = r->m_zhdr1 = 0;
+ r->m_z_adler32 = r->m_check_adler32 = 1;
+ if (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER) {
+ TINFL_GET_BYTE(1, r->m_zhdr0);
+ TINFL_GET_BYTE(2, r->m_zhdr1);
+ counter = (((r->m_zhdr0 * 256 + r->m_zhdr1) % 31 != 0) ||
+ (r->m_zhdr1 & 32) || ((r->m_zhdr0 & 15) != 8));
+ if (!(decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF))
+ counter |= (((1U << (8U + (r->m_zhdr0 >> 4))) > 32768U) ||
+ ((out_buf_size_mask + 1) <
+ (size_t)(1U << (8U + (r->m_zhdr0 >> 4)))));
+ if (counter) {
+ TINFL_CR_RETURN_FOREVER(36, TINFL_STATUS_FAILED);
+ }
+ }
+
+ do {
+ TINFL_GET_BITS(3, r->m_final, 3);
+ r->m_type = r->m_final >> 1;
+ if (r->m_type == 0) {
+ TINFL_SKIP_BITS(5, num_bits & 7);
+ for (counter = 0; counter < 4; ++counter) {
+ if (num_bits)
+ TINFL_GET_BITS(6, r->m_raw_header[counter], 8);
+ else
+ TINFL_GET_BYTE(7, r->m_raw_header[counter]);
+ }
+ if ((counter = (r->m_raw_header[0] | (r->m_raw_header[1] << 8))) !=
+ (mz_uint)(0xFFFF ^
+ (r->m_raw_header[2] | (r->m_raw_header[3] << 8)))) {
+ TINFL_CR_RETURN_FOREVER(39, TINFL_STATUS_FAILED);
+ }
+ while ((counter) && (num_bits)) {
+ TINFL_GET_BITS(51, dist, 8);
+ while (pOut_buf_cur >= pOut_buf_end) {
+ TINFL_CR_RETURN(52, TINFL_STATUS_HAS_MORE_OUTPUT);
+ }
+ *pOut_buf_cur++ = (mz_uint8)dist;
+ counter--;
+ }
+ while (counter) {
+ size_t n;
+ while (pOut_buf_cur >= pOut_buf_end) {
+ TINFL_CR_RETURN(9, TINFL_STATUS_HAS_MORE_OUTPUT);
+ }
+ while (pIn_buf_cur >= pIn_buf_end) {
+ if (decomp_flags & TINFL_FLAG_HAS_MORE_INPUT) {
+ TINFL_CR_RETURN(38, TINFL_STATUS_NEEDS_MORE_INPUT);
+ } else {
+ TINFL_CR_RETURN_FOREVER(40, TINFL_STATUS_FAILED);
+ }
+ }
+ n = MZ_MIN(MZ_MIN((size_t)(pOut_buf_end - pOut_buf_cur),
+ (size_t)(pIn_buf_end - pIn_buf_cur)),
+ counter);
+ TINFL_MEMCPY(pOut_buf_cur, pIn_buf_cur, n);
+ pIn_buf_cur += n;
+ pOut_buf_cur += n;
+ counter -= (mz_uint)n;
+ }
+ } else if (r->m_type == 3) {
+ TINFL_CR_RETURN_FOREVER(10, TINFL_STATUS_FAILED);
+ } else {
+ if (r->m_type == 1) {
+ mz_uint8 *p = r->m_tables[0].m_code_size;
+ mz_uint i;
+ r->m_table_sizes[0] = 288;
+ r->m_table_sizes[1] = 32;
+ TINFL_MEMSET(r->m_tables[1].m_code_size, 5, 32);
+ for (i = 0; i <= 143; ++i)
+ *p++ = 8;
+ for (; i <= 255; ++i)
+ *p++ = 9;
+ for (; i <= 279; ++i)
+ *p++ = 7;
+ for (; i <= 287; ++i)
+ *p++ = 8;
+ } else {
+ for (counter = 0; counter < 3; counter++) {
+ TINFL_GET_BITS(11, r->m_table_sizes[counter], "\05\05\04"[counter]);
+ r->m_table_sizes[counter] += s_min_table_sizes[counter];
+ }
+ MZ_CLEAR_OBJ(r->m_tables[2].m_code_size);
+ for (counter = 0; counter < r->m_table_sizes[2]; counter++) {
+ mz_uint s;
+ TINFL_GET_BITS(14, s, 3);
+ r->m_tables[2].m_code_size[s_length_dezigzag[counter]] = (mz_uint8)s;
+ }
+ r->m_table_sizes[2] = 19;
+ }
+ for (; (int)r->m_type >= 0; r->m_type--) {
+ int tree_next, tree_cur;
+ tinfl_huff_table *pTable;
+ mz_uint i, j, used_syms, total, sym_index, next_code[17],
+ total_syms[16];
+ pTable = &r->m_tables[r->m_type];
+ MZ_CLEAR_OBJ(total_syms);
+ MZ_CLEAR_OBJ(pTable->m_look_up);
+ MZ_CLEAR_OBJ(pTable->m_tree);
+ for (i = 0; i < r->m_table_sizes[r->m_type]; ++i)
+ total_syms[pTable->m_code_size[i]]++;
+ used_syms = 0, total = 0;
+ next_code[0] = next_code[1] = 0;
+ for (i = 1; i <= 15; ++i) {
+ used_syms += total_syms[i];
+ next_code[i + 1] = (total = ((total + total_syms[i]) << 1));
+ }
+ if ((65536 != total) && (used_syms > 1)) {
+ TINFL_CR_RETURN_FOREVER(35, TINFL_STATUS_FAILED);
+ }
+ for (tree_next = -1, sym_index = 0;
+ sym_index < r->m_table_sizes[r->m_type]; ++sym_index) {
+ mz_uint rev_code = 0, l, cur_code,
+ code_size = pTable->m_code_size[sym_index];
+ if (!code_size)
+ continue;
+ cur_code = next_code[code_size]++;
+ for (l = code_size; l > 0; l--, cur_code >>= 1)
+ rev_code = (rev_code << 1) | (cur_code & 1);
+ if (code_size <= TINFL_FAST_LOOKUP_BITS) {
+ mz_int16 k = (mz_int16)((code_size << 9) | sym_index);
+ while (rev_code < TINFL_FAST_LOOKUP_SIZE) {
+ pTable->m_look_up[rev_code] = k;
+ rev_code += (1 << code_size);
+ }
+ continue;
+ }
+ if (0 ==
+ (tree_cur = pTable->m_look_up[rev_code &
+ (TINFL_FAST_LOOKUP_SIZE - 1)])) {
+ pTable->m_look_up[rev_code & (TINFL_FAST_LOOKUP_SIZE - 1)] =
+ (mz_int16)tree_next;
+ tree_cur = tree_next;
+ tree_next -= 2;
+ }
+ rev_code >>= (TINFL_FAST_LOOKUP_BITS - 1);
+ for (j = code_size; j > (TINFL_FAST_LOOKUP_BITS + 1); j--) {
+ tree_cur -= ((rev_code >>= 1) & 1);
+ if (!pTable->m_tree[-tree_cur - 1]) {
+ pTable->m_tree[-tree_cur - 1] = (mz_int16)tree_next;
+ tree_cur = tree_next;
+ tree_next -= 2;
+ } else
+ tree_cur = pTable->m_tree[-tree_cur - 1];
+ }
+ tree_cur -= ((rev_code >>= 1) & 1);
+ pTable->m_tree[-tree_cur - 1] = (mz_int16)sym_index;
+ }
+ if (r->m_type == 2) {
+ for (counter = 0;
+ counter < (r->m_table_sizes[0] + r->m_table_sizes[1]);) {
+ mz_uint s;
+ TINFL_HUFF_DECODE(16, dist, &r->m_tables[2]);
+ if (dist < 16) {
+ r->m_len_codes[counter++] = (mz_uint8)dist;
+ continue;
+ }
+ if ((dist == 16) && (!counter)) {
+ TINFL_CR_RETURN_FOREVER(17, TINFL_STATUS_FAILED);
+ }
+ num_extra = "\02\03\07"[dist - 16];
+ TINFL_GET_BITS(18, s, num_extra);
+ s += "\03\03\013"[dist - 16];
+ TINFL_MEMSET(r->m_len_codes + counter,
+ (dist == 16) ? r->m_len_codes[counter - 1] : 0, s);
+ counter += s;
+ }
+ if ((r->m_table_sizes[0] + r->m_table_sizes[1]) != counter) {
+ TINFL_CR_RETURN_FOREVER(21, TINFL_STATUS_FAILED);
+ }
+ TINFL_MEMCPY(r->m_tables[0].m_code_size, r->m_len_codes,
+ r->m_table_sizes[0]);
+ TINFL_MEMCPY(r->m_tables[1].m_code_size,
+ r->m_len_codes + r->m_table_sizes[0],
+ r->m_table_sizes[1]);
+ }
+ }
+ for (;;) {
+ mz_uint8 *pSrc;
+ for (;;) {
+ if (((pIn_buf_end - pIn_buf_cur) < 4) ||
+ ((pOut_buf_end - pOut_buf_cur) < 2)) {
+ TINFL_HUFF_DECODE(23, counter, &r->m_tables[0]);
+ if (counter >= 256)
+ break;
+ while (pOut_buf_cur >= pOut_buf_end) {
+ TINFL_CR_RETURN(24, TINFL_STATUS_HAS_MORE_OUTPUT);
+ }
+ *pOut_buf_cur++ = (mz_uint8)counter;
+ } else {
+ int sym2;
+ mz_uint code_len;
+#if TINFL_USE_64BIT_BITBUF
+ if (num_bits < 30) {
+ bit_buf |=
+ (((tinfl_bit_buf_t)MZ_READ_LE32(pIn_buf_cur)) << num_bits);
+ pIn_buf_cur += 4;
+ num_bits += 32;
+ }
+#else
+ if (num_bits < 15) {
+ bit_buf |=
+ (((tinfl_bit_buf_t)MZ_READ_LE16(pIn_buf_cur)) << num_bits);
+ pIn_buf_cur += 2;
+ num_bits += 16;
+ }
+#endif
+ if ((sym2 =
+ r->m_tables[0]
+ .m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >=
+ 0)
+ code_len = sym2 >> 9;
+ else {
+ code_len = TINFL_FAST_LOOKUP_BITS;
+ do {
+ sym2 = r->m_tables[0]
+ .m_tree[~sym2 + ((bit_buf >> code_len++) & 1)];
+ } while (sym2 < 0);
+ }
+ counter = sym2;
+ bit_buf >>= code_len;
+ num_bits -= code_len;
+ if (counter & 256)
+ break;
+
+#if !TINFL_USE_64BIT_BITBUF
+ if (num_bits < 15) {
+ bit_buf |=
+ (((tinfl_bit_buf_t)MZ_READ_LE16(pIn_buf_cur)) << num_bits);
+ pIn_buf_cur += 2;
+ num_bits += 16;
+ }
+#endif
+ if ((sym2 =
+ r->m_tables[0]
+ .m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >=
+ 0)
+ code_len = sym2 >> 9;
+ else {
+ code_len = TINFL_FAST_LOOKUP_BITS;
+ do {
+ sym2 = r->m_tables[0]
+ .m_tree[~sym2 + ((bit_buf >> code_len++) & 1)];
+ } while (sym2 < 0);
+ }
+ bit_buf >>= code_len;
+ num_bits -= code_len;
+
+ pOut_buf_cur[0] = (mz_uint8)counter;
+ if (sym2 & 256) {
+ pOut_buf_cur++;
+ counter = sym2;
+ break;
+ }
+ pOut_buf_cur[1] = (mz_uint8)sym2;
+ pOut_buf_cur += 2;
+ }
+ }
+ if ((counter &= 511) == 256)
+ break;
+
+ num_extra = s_length_extra[counter - 257];
+ counter = s_length_base[counter - 257];
+ if (num_extra) {
+ mz_uint extra_bits;
+ TINFL_GET_BITS(25, extra_bits, num_extra);
+ counter += extra_bits;
+ }
+
+ TINFL_HUFF_DECODE(26, dist, &r->m_tables[1]);
+ num_extra = s_dist_extra[dist];
+ dist = s_dist_base[dist];
+ if (num_extra) {
+ mz_uint extra_bits;
+ TINFL_GET_BITS(27, extra_bits, num_extra);
+ dist += extra_bits;
+ }
+
+ dist_from_out_buf_start = pOut_buf_cur - pOut_buf_start;
+ if ((dist > dist_from_out_buf_start) &&
+ (decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF)) {
+ TINFL_CR_RETURN_FOREVER(37, TINFL_STATUS_FAILED);
+ }
+
+ pSrc = pOut_buf_start +
+ ((dist_from_out_buf_start - dist) & out_buf_size_mask);
+
+ if ((MZ_MAX(pOut_buf_cur, pSrc) + counter) > pOut_buf_end) {
+ while (counter--) {
+ while (pOut_buf_cur >= pOut_buf_end) {
+ TINFL_CR_RETURN(53, TINFL_STATUS_HAS_MORE_OUTPUT);
+ }
+ *pOut_buf_cur++ =
+ pOut_buf_start[(dist_from_out_buf_start++ - dist) &
+ out_buf_size_mask];
+ }
+ continue;
+ }
+#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES
+ else if ((counter >= 9) && (counter <= dist)) {
+ const mz_uint8 *pSrc_end = pSrc + (counter & ~7);
+ do {
+ ((mz_uint32 *)pOut_buf_cur)[0] = ((const mz_uint32 *)pSrc)[0];
+ ((mz_uint32 *)pOut_buf_cur)[1] = ((const mz_uint32 *)pSrc)[1];
+ pOut_buf_cur += 8;
+ } while ((pSrc += 8) < pSrc_end);
+ if ((counter &= 7) < 3) {
+ if (counter) {
+ pOut_buf_cur[0] = pSrc[0];
+ if (counter > 1)
+ pOut_buf_cur[1] = pSrc[1];
+ pOut_buf_cur += counter;
+ }
+ continue;
+ }
+ }
+#endif
+ do {
+ pOut_buf_cur[0] = pSrc[0];
+ pOut_buf_cur[1] = pSrc[1];
+ pOut_buf_cur[2] = pSrc[2];
+ pOut_buf_cur += 3;
+ pSrc += 3;
+ } while ((int)(counter -= 3) > 2);
+ if ((int)counter > 0) {
+ pOut_buf_cur[0] = pSrc[0];
+ if ((int)counter > 1)
+ pOut_buf_cur[1] = pSrc[1];
+ pOut_buf_cur += counter;
+ }
+ }
+ }
+ } while (!(r->m_final & 1));
+ if (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER) {
+ TINFL_SKIP_BITS(32, num_bits & 7);
+ for (counter = 0; counter < 4; ++counter) {
+ mz_uint s;
+ if (num_bits)
+ TINFL_GET_BITS(41, s, 8);
+ else
+ TINFL_GET_BYTE(42, s);
+ r->m_z_adler32 = (r->m_z_adler32 << 8) | s;
+ }
+ }
+ TINFL_CR_RETURN_FOREVER(34, TINFL_STATUS_DONE);
+ TINFL_CR_FINISH
+
+common_exit:
+ r->m_num_bits = num_bits;
+ r->m_bit_buf = bit_buf;
+ r->m_dist = dist;
+ r->m_counter = counter;
+ r->m_num_extra = num_extra;
+ r->m_dist_from_out_buf_start = dist_from_out_buf_start;
+ *pIn_buf_size = pIn_buf_cur - pIn_buf_next;
+ *pOut_buf_size = pOut_buf_cur - pOut_buf_next;
+ if ((decomp_flags &
+ (TINFL_FLAG_PARSE_ZLIB_HEADER | TINFL_FLAG_COMPUTE_ADLER32)) &&
+ (status >= 0)) {
+ const mz_uint8 *ptr = pOut_buf_next;
+ size_t buf_len = *pOut_buf_size;
+ mz_uint32 i, s1 = r->m_check_adler32 & 0xffff,
+ s2 = r->m_check_adler32 >> 16;
+ size_t block_len = buf_len % 5552;
+ while (buf_len) {
+ for (i = 0; i + 7 < block_len; i += 8, ptr += 8) {
+ s1 += ptr[0], s2 += s1;
+ s1 += ptr[1], s2 += s1;
+ s1 += ptr[2], s2 += s1;
+ s1 += ptr[3], s2 += s1;
+ s1 += ptr[4], s2 += s1;
+ s1 += ptr[5], s2 += s1;
+ s1 += ptr[6], s2 += s1;
+ s1 += ptr[7], s2 += s1;
+ }
+ for (; i < block_len; ++i)
+ s1 += *ptr++, s2 += s1;
+ s1 %= 65521U, s2 %= 65521U;
+ buf_len -= block_len;
+ block_len = 5552;
+ }
+ r->m_check_adler32 = (s2 << 16) + s1;
+ if ((status == TINFL_STATUS_DONE) &&
+ (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER) &&
+ (r->m_check_adler32 != r->m_z_adler32))
+ status = TINFL_STATUS_ADLER32_MISMATCH;
+ }
+ return status;
+}
+
+// Higher level helper functions.
+void *tinfl_decompress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len,
+ size_t *pOut_len, int flags) {
+ tinfl_decompressor decomp;
+ void *pBuf = NULL, *pNew_buf;
+ size_t src_buf_ofs = 0, out_buf_capacity = 0;
+ *pOut_len = 0;
+ tinfl_init(&decomp);
+ for (;;) {
+ size_t src_buf_size = src_buf_len - src_buf_ofs,
+ dst_buf_size = out_buf_capacity - *pOut_len, new_out_buf_capacity;
+ tinfl_status status = tinfl_decompress(
+ &decomp, (const mz_uint8 *)pSrc_buf + src_buf_ofs, &src_buf_size,
+ (mz_uint8 *)pBuf, pBuf ? (mz_uint8 *)pBuf + *pOut_len : NULL,
+ &dst_buf_size, (flags & ~TINFL_FLAG_HAS_MORE_INPUT) |
+ TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF);
+ if ((status < 0) || (status == TINFL_STATUS_NEEDS_MORE_INPUT)) {
+ MZ_FREE(pBuf);
+ *pOut_len = 0;
+ return NULL;
+ }
+ src_buf_ofs += src_buf_size;
+ *pOut_len += dst_buf_size;
+ if (status == TINFL_STATUS_DONE)
+ break;
+ new_out_buf_capacity = out_buf_capacity * 2;
+ if (new_out_buf_capacity < 128)
+ new_out_buf_capacity = 128;
+ pNew_buf = MZ_REALLOC(pBuf, new_out_buf_capacity);
+ if (!pNew_buf) {
+ MZ_FREE(pBuf);
+ *pOut_len = 0;
+ return NULL;
+ }
+ pBuf = pNew_buf;
+ out_buf_capacity = new_out_buf_capacity;
+ }
+ return pBuf;
+}
+
+size_t tinfl_decompress_mem_to_mem(void *pOut_buf, size_t out_buf_len,
+ const void *pSrc_buf, size_t src_buf_len,
+ int flags) {
+ tinfl_decompressor decomp;
+ tinfl_status status;
+ tinfl_init(&decomp);
+ status =
+ tinfl_decompress(&decomp, (const mz_uint8 *)pSrc_buf, &src_buf_len,
+ (mz_uint8 *)pOut_buf, (mz_uint8 *)pOut_buf, &out_buf_len,
+ (flags & ~TINFL_FLAG_HAS_MORE_INPUT) |
+ TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF);
+ return (status != TINFL_STATUS_DONE) ? TINFL_DECOMPRESS_MEM_TO_MEM_FAILED
+ : out_buf_len;
+}
+
+int tinfl_decompress_mem_to_callback(const void *pIn_buf, size_t *pIn_buf_size,
+ tinfl_put_buf_func_ptr pPut_buf_func,
+ void *pPut_buf_user, int flags) {
+ int result = 0;
+ tinfl_decompressor decomp;
+ mz_uint8 *pDict = (mz_uint8 *)MZ_MALLOC(TINFL_LZ_DICT_SIZE);
+ size_t in_buf_ofs = 0, dict_ofs = 0;
+ if (!pDict)
+ return TINFL_STATUS_FAILED;
+ tinfl_init(&decomp);
+ for (;;) {
+ size_t in_buf_size = *pIn_buf_size - in_buf_ofs,
+ dst_buf_size = TINFL_LZ_DICT_SIZE - dict_ofs;
+ tinfl_status status =
+ tinfl_decompress(&decomp, (const mz_uint8 *)pIn_buf + in_buf_ofs,
+ &in_buf_size, pDict, pDict + dict_ofs, &dst_buf_size,
+ (flags &
+ ~(TINFL_FLAG_HAS_MORE_INPUT |
+ TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF)));
+ in_buf_ofs += in_buf_size;
+ if ((dst_buf_size) &&
+ (!(*pPut_buf_func)(pDict + dict_ofs, (int)dst_buf_size, pPut_buf_user)))
+ break;
+ if (status != TINFL_STATUS_HAS_MORE_OUTPUT) {
+ result = (status == TINFL_STATUS_DONE);
+ break;
+ }
+ dict_ofs = (dict_ofs + dst_buf_size) & (TINFL_LZ_DICT_SIZE - 1);
+ }
+ MZ_FREE(pDict);
+ *pIn_buf_size = in_buf_ofs;
+ return result;
+}
+
+// ------------------- Low-level Compression (independent from all decompression
+// API's)
+
+// Purposely making these tables static for faster init and thread safety.
+static const mz_uint16 s_tdefl_len_sym[256] = {
+ 257, 258, 259, 260, 261, 262, 263, 264, 265, 265, 266, 266, 267, 267, 268,
+ 268, 269, 269, 269, 269, 270, 270, 270, 270, 271, 271, 271, 271, 272, 272,
+ 272, 272, 273, 273, 273, 273, 273, 273, 273, 273, 274, 274, 274, 274, 274,
+ 274, 274, 274, 275, 275, 275, 275, 275, 275, 275, 275, 276, 276, 276, 276,
+ 276, 276, 276, 276, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
+ 277, 277, 277, 277, 277, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278,
+ 278, 278, 278, 278, 278, 278, 279, 279, 279, 279, 279, 279, 279, 279, 279,
+ 279, 279, 279, 279, 279, 279, 279, 280, 280, 280, 280, 280, 280, 280, 280,
+ 280, 280, 280, 280, 280, 280, 280, 280, 281, 281, 281, 281, 281, 281, 281,
+ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
+ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 282, 282, 282, 282, 282,
+ 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282,
+ 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 283, 283, 283,
+ 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283,
+ 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 284,
+ 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284,
+ 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284,
+ 285};
+
+static const mz_uint8 s_tdefl_len_extra[256] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0};
+
+static const mz_uint8 s_tdefl_small_dist_sym[512] = {
+ 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8,
+ 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17};
+
+static const mz_uint8 s_tdefl_small_dist_extra[512] = {
+ 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7};
+
+static const mz_uint8 s_tdefl_large_dist_sym[128] = {
+ 0, 0, 18, 19, 20, 20, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24,
+ 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29};
+
+static const mz_uint8 s_tdefl_large_dist_extra[128] = {
+ 0, 0, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13};
+
+// Radix sorts tdefl_sym_freq[] array by 16-bit key m_key. Returns ptr to sorted
+// values.
+typedef struct { mz_uint16 m_key, m_sym_index; } tdefl_sym_freq;
+static tdefl_sym_freq *tdefl_radix_sort_syms(mz_uint num_syms,
+ tdefl_sym_freq *pSyms0,
+ tdefl_sym_freq *pSyms1) {
+ mz_uint32 total_passes = 2, pass_shift, pass, i, hist[256 * 2];
+ tdefl_sym_freq *pCur_syms = pSyms0, *pNew_syms = pSyms1;
+ MZ_CLEAR_OBJ(hist);
+ for (i = 0; i < num_syms; i++) {
+ mz_uint freq = pSyms0[i].m_key;
+ hist[freq & 0xFF]++;
+ hist[256 + ((freq >> 8) & 0xFF)]++;
+ }
+ while ((total_passes > 1) && (num_syms == hist[(total_passes - 1) * 256]))
+ total_passes--;
+ for (pass_shift = 0, pass = 0; pass < total_passes; pass++, pass_shift += 8) {
+ const mz_uint32 *pHist = &hist[pass << 8];
+ mz_uint offsets[256], cur_ofs = 0;
+ for (i = 0; i < 256; i++) {
+ offsets[i] = cur_ofs;
+ cur_ofs += pHist[i];
+ }
+ for (i = 0; i < num_syms; i++)
+ pNew_syms[offsets[(pCur_syms[i].m_key >> pass_shift) & 0xFF]++] =
+ pCur_syms[i];
+ {
+ tdefl_sym_freq *t = pCur_syms;
+ pCur_syms = pNew_syms;
+ pNew_syms = t;
+ }
+ }
+ return pCur_syms;
+}
+
+// tdefl_calculate_minimum_redundancy() originally written by: Alistair Moffat,
+// alistair@cs.mu.oz.au, Jyrki Katajainen, jyrki@diku.dk, November 1996.
+static void tdefl_calculate_minimum_redundancy(tdefl_sym_freq *A, int n) {
+ int root, leaf, next, avbl, used, dpth;
+ if (n == 0)
+ return;
+ else if (n == 1) {
+ A[0].m_key = 1;
+ return;
+ }
+ A[0].m_key += A[1].m_key;
+ root = 0;
+ leaf = 2;
+ for (next = 1; next < n - 1; next++) {
+ if (leaf >= n || A[root].m_key < A[leaf].m_key) {
+ A[next].m_key = A[root].m_key;
+ A[root++].m_key = (mz_uint16)next;
+ } else
+ A[next].m_key = A[leaf++].m_key;
+ if (leaf >= n || (root < next && A[root].m_key < A[leaf].m_key)) {
+ A[next].m_key = (mz_uint16)(A[next].m_key + A[root].m_key);
+ A[root++].m_key = (mz_uint16)next;
+ } else
+ A[next].m_key = (mz_uint16)(A[next].m_key + A[leaf++].m_key);
+ }
+ A[n - 2].m_key = 0;
+ for (next = n - 3; next >= 0; next--)
+ A[next].m_key = A[A[next].m_key].m_key + 1;
+ avbl = 1;
+ used = dpth = 0;
+ root = n - 2;
+ next = n - 1;
+ while (avbl > 0) {
+ while (root >= 0 && (int)A[root].m_key == dpth) {
+ used++;
+ root--;
+ }
+ while (avbl > used) {
+ A[next--].m_key = (mz_uint16)(dpth);
+ avbl--;
+ }
+ avbl = 2 * used;
+ dpth++;
+ used = 0;
+ }
+}
+
+// Limits canonical Huffman code table's max code size.
+enum { TDEFL_MAX_SUPPORTED_HUFF_CODESIZE = 32 };
+static void tdefl_huffman_enforce_max_code_size(int *pNum_codes,
+ int code_list_len,
+ int max_code_size) {
+ int i;
+ mz_uint32 total = 0;
+ if (code_list_len <= 1)
+ return;
+ for (i = max_code_size + 1; i <= TDEFL_MAX_SUPPORTED_HUFF_CODESIZE; i++)
+ pNum_codes[max_code_size] += pNum_codes[i];
+ for (i = max_code_size; i > 0; i--)
+ total += (((mz_uint32)pNum_codes[i]) << (max_code_size - i));
+ while (total != (1UL << max_code_size)) {
+ pNum_codes[max_code_size]--;
+ for (i = max_code_size - 1; i > 0; i--)
+ if (pNum_codes[i]) {
+ pNum_codes[i]--;
+ pNum_codes[i + 1] += 2;
+ break;
+ }
+ total--;
+ }
+}
+
+static void tdefl_optimize_huffman_table(tdefl_compressor *d, int table_num,
+ int table_len, int code_size_limit,
+ int static_table) {
+ int i, j, l, num_codes[1 + TDEFL_MAX_SUPPORTED_HUFF_CODESIZE];
+ mz_uint next_code[TDEFL_MAX_SUPPORTED_HUFF_CODESIZE + 1];
+ MZ_CLEAR_OBJ(num_codes);
+ if (static_table) {
+ for (i = 0; i < table_len; i++)
+ num_codes[d->m_huff_code_sizes[table_num][i]]++;
+ } else {
+ tdefl_sym_freq syms0[TDEFL_MAX_HUFF_SYMBOLS], syms1[TDEFL_MAX_HUFF_SYMBOLS],
+ *pSyms;
+ int num_used_syms = 0;
+ const mz_uint16 *pSym_count = &d->m_huff_count[table_num][0];
+ for (i = 0; i < table_len; i++)
+ if (pSym_count[i]) {
+ syms0[num_used_syms].m_key = (mz_uint16)pSym_count[i];
+ syms0[num_used_syms++].m_sym_index = (mz_uint16)i;
+ }
+
+ pSyms = tdefl_radix_sort_syms(num_used_syms, syms0, syms1);
+ tdefl_calculate_minimum_redundancy(pSyms, num_used_syms);
+
+ for (i = 0; i < num_used_syms; i++)
+ num_codes[pSyms[i].m_key]++;
+
+ tdefl_huffman_enforce_max_code_size(num_codes, num_used_syms,
+ code_size_limit);
+
+ MZ_CLEAR_OBJ(d->m_huff_code_sizes[table_num]);
+ MZ_CLEAR_OBJ(d->m_huff_codes[table_num]);
+ for (i = 1, j = num_used_syms; i <= code_size_limit; i++)
+ for (l = num_codes[i]; l > 0; l--)
+ d->m_huff_code_sizes[table_num][pSyms[--j].m_sym_index] = (mz_uint8)(i);
+ }
+
+ next_code[1] = 0;
+ for (j = 0, i = 2; i <= code_size_limit; i++)
+ next_code[i] = j = ((j + num_codes[i - 1]) << 1);
+
+ for (i = 0; i < table_len; i++) {
+ mz_uint rev_code = 0, code, code_size;
+ if ((code_size = d->m_huff_code_sizes[table_num][i]) == 0)
+ continue;
+ code = next_code[code_size]++;
+ for (l = code_size; l > 0; l--, code >>= 1)
+ rev_code = (rev_code << 1) | (code & 1);
+ d->m_huff_codes[table_num][i] = (mz_uint16)rev_code;
+ }
+}
+
+#define TDEFL_PUT_BITS(b, l) \
+ do { \
+ mz_uint bits = b; \
+ mz_uint len = l; \
+ MZ_ASSERT(bits <= ((1U << len) - 1U)); \
+ d->m_bit_buffer |= (bits << d->m_bits_in); \
+ d->m_bits_in += len; \
+ while (d->m_bits_in >= 8) { \
+ if (d->m_pOutput_buf < d->m_pOutput_buf_end) \
+ *d->m_pOutput_buf++ = (mz_uint8)(d->m_bit_buffer); \
+ d->m_bit_buffer >>= 8; \
+ d->m_bits_in -= 8; \
+ } \
+ } \
+ MZ_MACRO_END
+
+#define TDEFL_RLE_PREV_CODE_SIZE() \
+ { \
+ if (rle_repeat_count) { \
+ if (rle_repeat_count < 3) { \
+ d->m_huff_count[2][prev_code_size] = (mz_uint16)( \
+ d->m_huff_count[2][prev_code_size] + rle_repeat_count); \
+ while (rle_repeat_count--) \
+ packed_code_sizes[num_packed_code_sizes++] = prev_code_size; \
+ } else { \
+ d->m_huff_count[2][16] = (mz_uint16)(d->m_huff_count[2][16] + 1); \
+ packed_code_sizes[num_packed_code_sizes++] = 16; \
+ packed_code_sizes[num_packed_code_sizes++] = \
+ (mz_uint8)(rle_repeat_count - 3); \
+ } \
+ rle_repeat_count = 0; \
+ } \
+ }
+
+#define TDEFL_RLE_ZERO_CODE_SIZE() \
+ { \
+ if (rle_z_count) { \
+ if (rle_z_count < 3) { \
+ d->m_huff_count[2][0] = \
+ (mz_uint16)(d->m_huff_count[2][0] + rle_z_count); \
+ while (rle_z_count--) \
+ packed_code_sizes[num_packed_code_sizes++] = 0; \
+ } else if (rle_z_count <= 10) { \
+ d->m_huff_count[2][17] = (mz_uint16)(d->m_huff_count[2][17] + 1); \
+ packed_code_sizes[num_packed_code_sizes++] = 17; \
+ packed_code_sizes[num_packed_code_sizes++] = \
+ (mz_uint8)(rle_z_count - 3); \
+ } else { \
+ d->m_huff_count[2][18] = (mz_uint16)(d->m_huff_count[2][18] + 1); \
+ packed_code_sizes[num_packed_code_sizes++] = 18; \
+ packed_code_sizes[num_packed_code_sizes++] = \
+ (mz_uint8)(rle_z_count - 11); \
+ } \
+ rle_z_count = 0; \
+ } \
+ }
+
+static mz_uint8 s_tdefl_packed_code_size_syms_swizzle[] = {
+ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
+
+static void tdefl_start_dynamic_block(tdefl_compressor *d) {
+ int num_lit_codes, num_dist_codes, num_bit_lengths;
+ mz_uint i, total_code_sizes_to_pack, num_packed_code_sizes, rle_z_count,
+ rle_repeat_count, packed_code_sizes_index;
+ mz_uint8
+ code_sizes_to_pack[TDEFL_MAX_HUFF_SYMBOLS_0 + TDEFL_MAX_HUFF_SYMBOLS_1],
+ packed_code_sizes[TDEFL_MAX_HUFF_SYMBOLS_0 + TDEFL_MAX_HUFF_SYMBOLS_1],
+ prev_code_size = 0xFF;
+
+ d->m_huff_count[0][256] = 1;
+
+ tdefl_optimize_huffman_table(d, 0, TDEFL_MAX_HUFF_SYMBOLS_0, 15, MZ_FALSE);
+ tdefl_optimize_huffman_table(d, 1, TDEFL_MAX_HUFF_SYMBOLS_1, 15, MZ_FALSE);
+
+ for (num_lit_codes = 286; num_lit_codes > 257; num_lit_codes--)
+ if (d->m_huff_code_sizes[0][num_lit_codes - 1])
+ break;
+ for (num_dist_codes = 30; num_dist_codes > 1; num_dist_codes--)
+ if (d->m_huff_code_sizes[1][num_dist_codes - 1])
+ break;
+
+ memcpy(code_sizes_to_pack, &d->m_huff_code_sizes[0][0], num_lit_codes);
+ memcpy(code_sizes_to_pack + num_lit_codes, &d->m_huff_code_sizes[1][0],
+ num_dist_codes);
+ total_code_sizes_to_pack = num_lit_codes + num_dist_codes;
+ num_packed_code_sizes = 0;
+ rle_z_count = 0;
+ rle_repeat_count = 0;
+
+ memset(&d->m_huff_count[2][0], 0,
+ sizeof(d->m_huff_count[2][0]) * TDEFL_MAX_HUFF_SYMBOLS_2);
+ for (i = 0; i < total_code_sizes_to_pack; i++) {
+ mz_uint8 code_size = code_sizes_to_pack[i];
+ if (!code_size) {
+ TDEFL_RLE_PREV_CODE_SIZE();
+ if (++rle_z_count == 138) {
+ TDEFL_RLE_ZERO_CODE_SIZE();
+ }
+ } else {
+ TDEFL_RLE_ZERO_CODE_SIZE();
+ if (code_size != prev_code_size) {
+ TDEFL_RLE_PREV_CODE_SIZE();
+ d->m_huff_count[2][code_size] =
+ (mz_uint16)(d->m_huff_count[2][code_size] + 1);
+ packed_code_sizes[num_packed_code_sizes++] = code_size;
+ } else if (++rle_repeat_count == 6) {
+ TDEFL_RLE_PREV_CODE_SIZE();
+ }
+ }
+ prev_code_size = code_size;
+ }
+ if (rle_repeat_count) {
+ TDEFL_RLE_PREV_CODE_SIZE();
+ } else {
+ TDEFL_RLE_ZERO_CODE_SIZE();
+ }
+
+ tdefl_optimize_huffman_table(d, 2, TDEFL_MAX_HUFF_SYMBOLS_2, 7, MZ_FALSE);
+
+ TDEFL_PUT_BITS(2, 2);
+
+ TDEFL_PUT_BITS(num_lit_codes - 257, 5);
+ TDEFL_PUT_BITS(num_dist_codes - 1, 5);
+
+ for (num_bit_lengths = 18; num_bit_lengths >= 0; num_bit_lengths--)
+ if (d->m_huff_code_sizes
+ [2][s_tdefl_packed_code_size_syms_swizzle[num_bit_lengths]])
+ break;
+ num_bit_lengths = MZ_MAX(4, (num_bit_lengths + 1));
+ TDEFL_PUT_BITS(num_bit_lengths - 4, 4);
+ for (i = 0; (int)i < num_bit_lengths; i++)
+ TDEFL_PUT_BITS(
+ d->m_huff_code_sizes[2][s_tdefl_packed_code_size_syms_swizzle[i]], 3);
+
+ for (packed_code_sizes_index = 0;
+ packed_code_sizes_index < num_packed_code_sizes;) {
+ mz_uint code = packed_code_sizes[packed_code_sizes_index++];
+ MZ_ASSERT(code < TDEFL_MAX_HUFF_SYMBOLS_2);
+ TDEFL_PUT_BITS(d->m_huff_codes[2][code], d->m_huff_code_sizes[2][code]);
+ if (code >= 16)
+ TDEFL_PUT_BITS(packed_code_sizes[packed_code_sizes_index++],
+ "\02\03\07"[code - 16]);
+ }
+}
+
+static void tdefl_start_static_block(tdefl_compressor *d) {
+ mz_uint i;
+ mz_uint8 *p = &d->m_huff_code_sizes[0][0];
+
+ for (i = 0; i <= 143; ++i)
+ *p++ = 8;
+ for (; i <= 255; ++i)
+ *p++ = 9;
+ for (; i <= 279; ++i)
+ *p++ = 7;
+ for (; i <= 287; ++i)
+ *p++ = 8;
+
+ memset(d->m_huff_code_sizes[1], 5, 32);
+
+ tdefl_optimize_huffman_table(d, 0, 288, 15, MZ_TRUE);
+ tdefl_optimize_huffman_table(d, 1, 32, 15, MZ_TRUE);
+
+ TDEFL_PUT_BITS(1, 2);
+}
+
+static const mz_uint mz_bitmasks[17] = {
+ 0x0000, 0x0001, 0x0003, 0x0007, 0x000F, 0x001F, 0x003F, 0x007F, 0x00FF,
+ 0x01FF, 0x03FF, 0x07FF, 0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF};
+
+#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN && \
+ MINIZ_HAS_64BIT_REGISTERS
+static mz_bool tdefl_compress_lz_codes(tdefl_compressor *d) {
+ mz_uint flags;
+ mz_uint8 *pLZ_codes;
+ mz_uint8 *pOutput_buf = d->m_pOutput_buf;
+ mz_uint8 *pLZ_code_buf_end = d->m_pLZ_code_buf;
+ mz_uint64 bit_buffer = d->m_bit_buffer;
+ mz_uint bits_in = d->m_bits_in;
+
+#define TDEFL_PUT_BITS_FAST(b, l) \
+ { \
+ bit_buffer |= (((mz_uint64)(b)) << bits_in); \
+ bits_in += (l); \
+ }
+
+ flags = 1;
+ for (pLZ_codes = d->m_lz_code_buf; pLZ_codes < pLZ_code_buf_end;
+ flags >>= 1) {
+ if (flags == 1)
+ flags = *pLZ_codes++ | 0x100;
+
+ if (flags & 1) {
+ mz_uint s0, s1, n0, n1, sym, num_extra_bits;
+ mz_uint match_len = pLZ_codes[0],
+ match_dist = *(const mz_uint16 *)(pLZ_codes + 1);
+ pLZ_codes += 3;
+
+ MZ_ASSERT(d->m_huff_code_sizes[0][s_tdefl_len_sym[match_len]]);
+ TDEFL_PUT_BITS_FAST(d->m_huff_codes[0][s_tdefl_len_sym[match_len]],
+ d->m_huff_code_sizes[0][s_tdefl_len_sym[match_len]]);
+ TDEFL_PUT_BITS_FAST(match_len & mz_bitmasks[s_tdefl_len_extra[match_len]],
+ s_tdefl_len_extra[match_len]);
+
+ // This sequence coaxes MSVC into using cmov's vs. jmp's.
+ s0 = s_tdefl_small_dist_sym[match_dist & 511];
+ n0 = s_tdefl_small_dist_extra[match_dist & 511];
+ s1 = s_tdefl_large_dist_sym[match_dist >> 8];
+ n1 = s_tdefl_large_dist_extra[match_dist >> 8];
+ sym = (match_dist < 512) ? s0 : s1;
+ num_extra_bits = (match_dist < 512) ? n0 : n1;
+
+ MZ_ASSERT(d->m_huff_code_sizes[1][sym]);
+ TDEFL_PUT_BITS_FAST(d->m_huff_codes[1][sym],
+ d->m_huff_code_sizes[1][sym]);
+ TDEFL_PUT_BITS_FAST(match_dist & mz_bitmasks[num_extra_bits],
+ num_extra_bits);
+ } else {
+ mz_uint lit = *pLZ_codes++;
+ MZ_ASSERT(d->m_huff_code_sizes[0][lit]);
+ TDEFL_PUT_BITS_FAST(d->m_huff_codes[0][lit],
+ d->m_huff_code_sizes[0][lit]);
+
+ if (((flags & 2) == 0) && (pLZ_codes < pLZ_code_buf_end)) {
+ flags >>= 1;
+ lit = *pLZ_codes++;
+ MZ_ASSERT(d->m_huff_code_sizes[0][lit]);
+ TDEFL_PUT_BITS_FAST(d->m_huff_codes[0][lit],
+ d->m_huff_code_sizes[0][lit]);
+
+ if (((flags & 2) == 0) && (pLZ_codes < pLZ_code_buf_end)) {
+ flags >>= 1;
+ lit = *pLZ_codes++;
+ MZ_ASSERT(d->m_huff_code_sizes[0][lit]);
+ TDEFL_PUT_BITS_FAST(d->m_huff_codes[0][lit],
+ d->m_huff_code_sizes[0][lit]);
+ }
+ }
+ }
+
+ if (pOutput_buf >= d->m_pOutput_buf_end)
+ return MZ_FALSE;
+
+ *(mz_uint64 *)pOutput_buf = bit_buffer;
+ pOutput_buf += (bits_in >> 3);
+ bit_buffer >>= (bits_in & ~7);
+ bits_in &= 7;
+ }
+
+#undef TDEFL_PUT_BITS_FAST
+
+ d->m_pOutput_buf = pOutput_buf;
+ d->m_bits_in = 0;
+ d->m_bit_buffer = 0;
+
+ while (bits_in) {
+ mz_uint32 n = MZ_MIN(bits_in, 16);
+ TDEFL_PUT_BITS((mz_uint)bit_buffer & mz_bitmasks[n], n);
+ bit_buffer >>= n;
+ bits_in -= n;
+ }
+
+ TDEFL_PUT_BITS(d->m_huff_codes[0][256], d->m_huff_code_sizes[0][256]);
+
+ return (d->m_pOutput_buf < d->m_pOutput_buf_end);
+}
+#else
+static mz_bool tdefl_compress_lz_codes(tdefl_compressor *d) {
+ mz_uint flags;
+ mz_uint8 *pLZ_codes;
+
+ flags = 1;
+ for (pLZ_codes = d->m_lz_code_buf; pLZ_codes < d->m_pLZ_code_buf;
+ flags >>= 1) {
+ if (flags == 1)
+ flags = *pLZ_codes++ | 0x100;
+ if (flags & 1) {
+ mz_uint sym, num_extra_bits;
+ mz_uint match_len = pLZ_codes[0],
+ match_dist = (pLZ_codes[1] | (pLZ_codes[2] << 8));
+ pLZ_codes += 3;
+
+ MZ_ASSERT(d->m_huff_code_sizes[0][s_tdefl_len_sym[match_len]]);
+ TDEFL_PUT_BITS(d->m_huff_codes[0][s_tdefl_len_sym[match_len]],
+ d->m_huff_code_sizes[0][s_tdefl_len_sym[match_len]]);
+ TDEFL_PUT_BITS(match_len & mz_bitmasks[s_tdefl_len_extra[match_len]],
+ s_tdefl_len_extra[match_len]);
+
+ if (match_dist < 512) {
+ sym = s_tdefl_small_dist_sym[match_dist];
+ num_extra_bits = s_tdefl_small_dist_extra[match_dist];
+ } else {
+ sym = s_tdefl_large_dist_sym[match_dist >> 8];
+ num_extra_bits = s_tdefl_large_dist_extra[match_dist >> 8];
+ }
+ MZ_ASSERT(d->m_huff_code_sizes[1][sym]);
+ TDEFL_PUT_BITS(d->m_huff_codes[1][sym], d->m_huff_code_sizes[1][sym]);
+ TDEFL_PUT_BITS(match_dist & mz_bitmasks[num_extra_bits], num_extra_bits);
+ } else {
+ mz_uint lit = *pLZ_codes++;
+ MZ_ASSERT(d->m_huff_code_sizes[0][lit]);
+ TDEFL_PUT_BITS(d->m_huff_codes[0][lit], d->m_huff_code_sizes[0][lit]);
+ }
+ }
+
+ TDEFL_PUT_BITS(d->m_huff_codes[0][256], d->m_huff_code_sizes[0][256]);
+
+ return (d->m_pOutput_buf < d->m_pOutput_buf_end);
+}
+#endif // MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN &&
+ // MINIZ_HAS_64BIT_REGISTERS
+
+static mz_bool tdefl_compress_block(tdefl_compressor *d, mz_bool static_block) {
+ if (static_block)
+ tdefl_start_static_block(d);
+ else
+ tdefl_start_dynamic_block(d);
+ return tdefl_compress_lz_codes(d);
+}
+
+static int tdefl_flush_block(tdefl_compressor *d, int flush) {
+ mz_uint saved_bit_buf, saved_bits_in;
+ mz_uint8 *pSaved_output_buf;
+ mz_bool comp_block_succeeded = MZ_FALSE;
+ int n, use_raw_block =
+ ((d->m_flags & TDEFL_FORCE_ALL_RAW_BLOCKS) != 0) &&
+ (d->m_lookahead_pos - d->m_lz_code_buf_dict_pos) <= d->m_dict_size;
+ mz_uint8 *pOutput_buf_start =
+ ((d->m_pPut_buf_func == NULL) &&
+ ((*d->m_pOut_buf_size - d->m_out_buf_ofs) >= TDEFL_OUT_BUF_SIZE))
+ ? ((mz_uint8 *)d->m_pOut_buf + d->m_out_buf_ofs)
+ : d->m_output_buf;
+
+ d->m_pOutput_buf = pOutput_buf_start;
+ d->m_pOutput_buf_end = d->m_pOutput_buf + TDEFL_OUT_BUF_SIZE - 16;
+
+ MZ_ASSERT(!d->m_output_flush_remaining);
+ d->m_output_flush_ofs = 0;
+ d->m_output_flush_remaining = 0;
+
+ *d->m_pLZ_flags = (mz_uint8)(*d->m_pLZ_flags >> d->m_num_flags_left);
+ d->m_pLZ_code_buf -= (d->m_num_flags_left == 8);
+
+ if ((d->m_flags & TDEFL_WRITE_ZLIB_HEADER) && (!d->m_block_index)) {
+ TDEFL_PUT_BITS(0x78, 8);
+ TDEFL_PUT_BITS(0x01, 8);
+ }
+
+ TDEFL_PUT_BITS(flush == TDEFL_FINISH, 1);
+
+ pSaved_output_buf = d->m_pOutput_buf;
+ saved_bit_buf = d->m_bit_buffer;
+ saved_bits_in = d->m_bits_in;
+
+ if (!use_raw_block)
+ comp_block_succeeded =
+ tdefl_compress_block(d, (d->m_flags & TDEFL_FORCE_ALL_STATIC_BLOCKS) ||
+ (d->m_total_lz_bytes < 48));
+
+ // If the block gets expanded, forget the current contents of the output
+ // buffer and send a raw block instead.
+ if (((use_raw_block) ||
+ ((d->m_total_lz_bytes) && ((d->m_pOutput_buf - pSaved_output_buf + 1U) >=
+ d->m_total_lz_bytes))) &&
+ ((d->m_lookahead_pos - d->m_lz_code_buf_dict_pos) <= d->m_dict_size)) {
+ mz_uint i;
+ d->m_pOutput_buf = pSaved_output_buf;
+ d->m_bit_buffer = saved_bit_buf, d->m_bits_in = saved_bits_in;
+ TDEFL_PUT_BITS(0, 2);
+ if (d->m_bits_in) {
+ TDEFL_PUT_BITS(0, 8 - d->m_bits_in);
+ }
+ for (i = 2; i; --i, d->m_total_lz_bytes ^= 0xFFFF) {
+ TDEFL_PUT_BITS(d->m_total_lz_bytes & 0xFFFF, 16);
+ }
+ for (i = 0; i < d->m_total_lz_bytes; ++i) {
+ TDEFL_PUT_BITS(
+ d->m_dict[(d->m_lz_code_buf_dict_pos + i) & TDEFL_LZ_DICT_SIZE_MASK],
+ 8);
+ }
+ }
+ // Check for the extremely unlikely (if not impossible) case of the compressed
+ // block not fitting into the output buffer when using dynamic codes.
+ else if (!comp_block_succeeded) {
+ d->m_pOutput_buf = pSaved_output_buf;
+ d->m_bit_buffer = saved_bit_buf, d->m_bits_in = saved_bits_in;
+ tdefl_compress_block(d, MZ_TRUE);
+ }
+
+ if (flush) {
+ if (flush == TDEFL_FINISH) {
+ if (d->m_bits_in) {
+ TDEFL_PUT_BITS(0, 8 - d->m_bits_in);
+ }
+ if (d->m_flags & TDEFL_WRITE_ZLIB_HEADER) {
+ mz_uint i, a = d->m_adler32;
+ for (i = 0; i < 4; i++) {
+ TDEFL_PUT_BITS((a >> 24) & 0xFF, 8);
+ a <<= 8;
+ }
+ }
+ } else {
+ mz_uint i, z = 0;
+ TDEFL_PUT_BITS(0, 3);
+ if (d->m_bits_in) {
+ TDEFL_PUT_BITS(0, 8 - d->m_bits_in);
+ }
+ for (i = 2; i; --i, z ^= 0xFFFF) {
+ TDEFL_PUT_BITS(z & 0xFFFF, 16);
+ }
+ }
+ }
+
+ MZ_ASSERT(d->m_pOutput_buf < d->m_pOutput_buf_end);
+
+ memset(&d->m_huff_count[0][0], 0,
+ sizeof(d->m_huff_count[0][0]) * TDEFL_MAX_HUFF_SYMBOLS_0);
+ memset(&d->m_huff_count[1][0], 0,
+ sizeof(d->m_huff_count[1][0]) * TDEFL_MAX_HUFF_SYMBOLS_1);
+
+ d->m_pLZ_code_buf = d->m_lz_code_buf + 1;
+ d->m_pLZ_flags = d->m_lz_code_buf;
+ d->m_num_flags_left = 8;
+ d->m_lz_code_buf_dict_pos += d->m_total_lz_bytes;
+ d->m_total_lz_bytes = 0;
+ d->m_block_index++;
+
+ if ((n = (int)(d->m_pOutput_buf - pOutput_buf_start)) != 0) {
+ if (d->m_pPut_buf_func) {
+ *d->m_pIn_buf_size = d->m_pSrc - (const mz_uint8 *)d->m_pIn_buf;
+ if (!(*d->m_pPut_buf_func)(d->m_output_buf, n, d->m_pPut_buf_user))
+ return (d->m_prev_return_status = TDEFL_STATUS_PUT_BUF_FAILED);
+ } else if (pOutput_buf_start == d->m_output_buf) {
+ int bytes_to_copy = (int)MZ_MIN(
+ (size_t)n, (size_t)(*d->m_pOut_buf_size - d->m_out_buf_ofs));
+ memcpy((mz_uint8 *)d->m_pOut_buf + d->m_out_buf_ofs, d->m_output_buf,
+ bytes_to_copy);
+ d->m_out_buf_ofs += bytes_to_copy;
+ if ((n -= bytes_to_copy) != 0) {
+ d->m_output_flush_ofs = bytes_to_copy;
+ d->m_output_flush_remaining = n;
+ }
+ } else {
+ d->m_out_buf_ofs += n;
+ }
+ }
+
+ return d->m_output_flush_remaining;
+}
+
+#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES
+#define TDEFL_READ_UNALIGNED_WORD(p) *(const mz_uint16 *)(p)
+static MZ_FORCEINLINE void
+tdefl_find_match(tdefl_compressor *d, mz_uint lookahead_pos, mz_uint max_dist,
+ mz_uint max_match_len, mz_uint *pMatch_dist,
+ mz_uint *pMatch_len) {
+ mz_uint dist, pos = lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK,
+ match_len = *pMatch_len, probe_pos = pos, next_probe_pos,
+ probe_len;
+ mz_uint num_probes_left = d->m_max_probes[match_len >= 32];
+ const mz_uint16 *s = (const mz_uint16 *)(d->m_dict + pos), *p, *q;
+ mz_uint16 c01 = TDEFL_READ_UNALIGNED_WORD(&d->m_dict[pos + match_len - 1]),
+ s01 = TDEFL_READ_UNALIGNED_WORD(s);
+ MZ_ASSERT(max_match_len <= TDEFL_MAX_MATCH_LEN);
+ if (max_match_len <= match_len)
+ return;
+ for (;;) {
+ for (;;) {
+ if (--num_probes_left == 0)
+ return;
+#define TDEFL_PROBE \
+ next_probe_pos = d->m_next[probe_pos]; \
+ if ((!next_probe_pos) || \
+ ((dist = (mz_uint16)(lookahead_pos - next_probe_pos)) > max_dist)) \
+ return; \
+ probe_pos = next_probe_pos & TDEFL_LZ_DICT_SIZE_MASK; \
+ if (TDEFL_READ_UNALIGNED_WORD(&d->m_dict[probe_pos + match_len - 1]) == c01) \
+ break;
+ TDEFL_PROBE;
+ TDEFL_PROBE;
+ TDEFL_PROBE;
+ }
+ if (!dist)
+ break;
+ q = (const mz_uint16 *)(d->m_dict + probe_pos);
+ if (TDEFL_READ_UNALIGNED_WORD(q) != s01)
+ continue;
+ p = s;
+ probe_len = 32;
+ do {
+ } while (
+ (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) &&
+ (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) &&
+ (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) &&
+ (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) &&
+ (--probe_len > 0));
+ if (!probe_len) {
+ *pMatch_dist = dist;
+ *pMatch_len = MZ_MIN(max_match_len, TDEFL_MAX_MATCH_LEN);
+ break;
+ } else if ((probe_len = ((mz_uint)(p - s) * 2) +
+ (mz_uint)(*(const mz_uint8 *)p ==
+ *(const mz_uint8 *)q)) > match_len) {
+ *pMatch_dist = dist;
+ if ((*pMatch_len = match_len = MZ_MIN(max_match_len, probe_len)) ==
+ max_match_len)
+ break;
+ c01 = TDEFL_READ_UNALIGNED_WORD(&d->m_dict[pos + match_len - 1]);
+ }
+ }
+}
+#else
+static MZ_FORCEINLINE void
+tdefl_find_match(tdefl_compressor *d, mz_uint lookahead_pos, mz_uint max_dist,
+ mz_uint max_match_len, mz_uint *pMatch_dist,
+ mz_uint *pMatch_len) {
+ mz_uint dist, pos = lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK,
+ match_len = *pMatch_len, probe_pos = pos, next_probe_pos,
+ probe_len;
+ mz_uint num_probes_left = d->m_max_probes[match_len >= 32];
+ const mz_uint8 *s = d->m_dict + pos, *p, *q;
+ mz_uint8 c0 = d->m_dict[pos + match_len], c1 = d->m_dict[pos + match_len - 1];
+ MZ_ASSERT(max_match_len <= TDEFL_MAX_MATCH_LEN);
+ if (max_match_len <= match_len)
+ return;
+ for (;;) {
+ for (;;) {
+ if (--num_probes_left == 0)
+ return;
+#define TDEFL_PROBE \
+ next_probe_pos = d->m_next[probe_pos]; \
+ if ((!next_probe_pos) || \
+ ((dist = (mz_uint16)(lookahead_pos - next_probe_pos)) > max_dist)) \
+ return; \
+ probe_pos = next_probe_pos & TDEFL_LZ_DICT_SIZE_MASK; \
+ if ((d->m_dict[probe_pos + match_len] == c0) && \
+ (d->m_dict[probe_pos + match_len - 1] == c1)) \
+ break;
+ TDEFL_PROBE;
+ TDEFL_PROBE;
+ TDEFL_PROBE;
+ }
+ if (!dist)
+ break;
+ p = s;
+ q = d->m_dict + probe_pos;
+ for (probe_len = 0; probe_len < max_match_len; probe_len++)
+ if (*p++ != *q++)
+ break;
+ if (probe_len > match_len) {
+ *pMatch_dist = dist;
+ if ((*pMatch_len = match_len = probe_len) == max_match_len)
+ return;
+ c0 = d->m_dict[pos + match_len];
+ c1 = d->m_dict[pos + match_len - 1];
+ }
+ }
+}
+#endif // #if MINIZ_USE_UNALIGNED_LOADS_AND_STORES
+
+#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN
+static mz_bool tdefl_compress_fast(tdefl_compressor *d) {
+ // Faster, minimally featured LZRW1-style match+parse loop with better
+ // register utilization. Intended for applications where raw throughput is
+ // valued more highly than ratio.
+ mz_uint lookahead_pos = d->m_lookahead_pos,
+ lookahead_size = d->m_lookahead_size, dict_size = d->m_dict_size,
+ total_lz_bytes = d->m_total_lz_bytes,
+ num_flags_left = d->m_num_flags_left;
+ mz_uint8 *pLZ_code_buf = d->m_pLZ_code_buf, *pLZ_flags = d->m_pLZ_flags;
+ mz_uint cur_pos = lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK;
+
+ while ((d->m_src_buf_left) || ((d->m_flush) && (lookahead_size))) {
+ const mz_uint TDEFL_COMP_FAST_LOOKAHEAD_SIZE = 4096;
+ mz_uint dst_pos =
+ (lookahead_pos + lookahead_size) & TDEFL_LZ_DICT_SIZE_MASK;
+ mz_uint num_bytes_to_process = (mz_uint)MZ_MIN(
+ d->m_src_buf_left, TDEFL_COMP_FAST_LOOKAHEAD_SIZE - lookahead_size);
+ d->m_src_buf_left -= num_bytes_to_process;
+ lookahead_size += num_bytes_to_process;
+
+ while (num_bytes_to_process) {
+ mz_uint32 n = MZ_MIN(TDEFL_LZ_DICT_SIZE - dst_pos, num_bytes_to_process);
+ memcpy(d->m_dict + dst_pos, d->m_pSrc, n);
+ if (dst_pos < (TDEFL_MAX_MATCH_LEN - 1))
+ memcpy(d->m_dict + TDEFL_LZ_DICT_SIZE + dst_pos, d->m_pSrc,
+ MZ_MIN(n, (TDEFL_MAX_MATCH_LEN - 1) - dst_pos));
+ d->m_pSrc += n;
+ dst_pos = (dst_pos + n) & TDEFL_LZ_DICT_SIZE_MASK;
+ num_bytes_to_process -= n;
+ }
+
+ dict_size = MZ_MIN(TDEFL_LZ_DICT_SIZE - lookahead_size, dict_size);
+ if ((!d->m_flush) && (lookahead_size < TDEFL_COMP_FAST_LOOKAHEAD_SIZE))
+ break;
+
+ while (lookahead_size >= 4) {
+ mz_uint cur_match_dist, cur_match_len = 1;
+ mz_uint8 *pCur_dict = d->m_dict + cur_pos;
+ mz_uint first_trigram = (*(const mz_uint32 *)pCur_dict) & 0xFFFFFF;
+ mz_uint hash =
+ (first_trigram ^ (first_trigram >> (24 - (TDEFL_LZ_HASH_BITS - 8)))) &
+ TDEFL_LEVEL1_HASH_SIZE_MASK;
+ mz_uint probe_pos = d->m_hash[hash];
+ d->m_hash[hash] = (mz_uint16)lookahead_pos;
+
+ if (((cur_match_dist = (mz_uint16)(lookahead_pos - probe_pos)) <=
+ dict_size) &&
+ ((*(const mz_uint32 *)(d->m_dict +
+ (probe_pos &= TDEFL_LZ_DICT_SIZE_MASK)) &
+ 0xFFFFFF) == first_trigram)) {
+ const mz_uint16 *p = (const mz_uint16 *)pCur_dict;
+ const mz_uint16 *q = (const mz_uint16 *)(d->m_dict + probe_pos);
+ mz_uint32 probe_len = 32;
+ do {
+ } while ((TDEFL_READ_UNALIGNED_WORD(++p) ==
+ TDEFL_READ_UNALIGNED_WORD(++q)) &&
+ (TDEFL_READ_UNALIGNED_WORD(++p) ==
+ TDEFL_READ_UNALIGNED_WORD(++q)) &&
+ (TDEFL_READ_UNALIGNED_WORD(++p) ==
+ TDEFL_READ_UNALIGNED_WORD(++q)) &&
+ (TDEFL_READ_UNALIGNED_WORD(++p) ==
+ TDEFL_READ_UNALIGNED_WORD(++q)) &&
+ (--probe_len > 0));
+ cur_match_len = ((mz_uint)(p - (const mz_uint16 *)pCur_dict) * 2) +
+ (mz_uint)(*(const mz_uint8 *)p == *(const mz_uint8 *)q);
+ if (!probe_len)
+ cur_match_len = cur_match_dist ? TDEFL_MAX_MATCH_LEN : 0;
+
+ if ((cur_match_len < TDEFL_MIN_MATCH_LEN) ||
+ ((cur_match_len == TDEFL_MIN_MATCH_LEN) &&
+ (cur_match_dist >= 8U * 1024U))) {
+ cur_match_len = 1;
+ *pLZ_code_buf++ = (mz_uint8)first_trigram;
+ *pLZ_flags = (mz_uint8)(*pLZ_flags >> 1);
+ d->m_huff_count[0][(mz_uint8)first_trigram]++;
+ } else {
+ mz_uint32 s0, s1;
+ cur_match_len = MZ_MIN(cur_match_len, lookahead_size);
+
+ MZ_ASSERT((cur_match_len >= TDEFL_MIN_MATCH_LEN) &&
+ (cur_match_dist >= 1) &&
+ (cur_match_dist <= TDEFL_LZ_DICT_SIZE));
+
+ cur_match_dist--;
+
+ pLZ_code_buf[0] = (mz_uint8)(cur_match_len - TDEFL_MIN_MATCH_LEN);
+ *(mz_uint16 *)(&pLZ_code_buf[1]) = (mz_uint16)cur_match_dist;
+ pLZ_code_buf += 3;
+ *pLZ_flags = (mz_uint8)((*pLZ_flags >> 1) | 0x80);
+
+ s0 = s_tdefl_small_dist_sym[cur_match_dist & 511];
+ s1 = s_tdefl_large_dist_sym[cur_match_dist >> 8];
+ d->m_huff_count[1][(cur_match_dist < 512) ? s0 : s1]++;
+
+ d->m_huff_count[0][s_tdefl_len_sym[cur_match_len -
+ TDEFL_MIN_MATCH_LEN]]++;
+ }
+ } else {
+ *pLZ_code_buf++ = (mz_uint8)first_trigram;
+ *pLZ_flags = (mz_uint8)(*pLZ_flags >> 1);
+ d->m_huff_count[0][(mz_uint8)first_trigram]++;
+ }
+
+ if (--num_flags_left == 0) {
+ num_flags_left = 8;
+ pLZ_flags = pLZ_code_buf++;
+ }
+
+ total_lz_bytes += cur_match_len;
+ lookahead_pos += cur_match_len;
+ dict_size = MZ_MIN(dict_size + cur_match_len, TDEFL_LZ_DICT_SIZE);
+ cur_pos = (cur_pos + cur_match_len) & TDEFL_LZ_DICT_SIZE_MASK;
+ MZ_ASSERT(lookahead_size >= cur_match_len);
+ lookahead_size -= cur_match_len;
+
+ if (pLZ_code_buf > &d->m_lz_code_buf[TDEFL_LZ_CODE_BUF_SIZE - 8]) {
+ int n;
+ d->m_lookahead_pos = lookahead_pos;
+ d->m_lookahead_size = lookahead_size;
+ d->m_dict_size = dict_size;
+ d->m_total_lz_bytes = total_lz_bytes;
+ d->m_pLZ_code_buf = pLZ_code_buf;
+ d->m_pLZ_flags = pLZ_flags;
+ d->m_num_flags_left = num_flags_left;
+ if ((n = tdefl_flush_block(d, 0)) != 0)
+ return (n < 0) ? MZ_FALSE : MZ_TRUE;
+ total_lz_bytes = d->m_total_lz_bytes;
+ pLZ_code_buf = d->m_pLZ_code_buf;
+ pLZ_flags = d->m_pLZ_flags;
+ num_flags_left = d->m_num_flags_left;
+ }
+ }
+
+ while (lookahead_size) {
+ mz_uint8 lit = d->m_dict[cur_pos];
+
+ total_lz_bytes++;
+ *pLZ_code_buf++ = lit;
+ *pLZ_flags = (mz_uint8)(*pLZ_flags >> 1);
+ if (--num_flags_left == 0) {
+ num_flags_left = 8;
+ pLZ_flags = pLZ_code_buf++;
+ }
+
+ d->m_huff_count[0][lit]++;
+
+ lookahead_pos++;
+ dict_size = MZ_MIN(dict_size + 1, TDEFL_LZ_DICT_SIZE);
+ cur_pos = (cur_pos + 1) & TDEFL_LZ_DICT_SIZE_MASK;
+ lookahead_size--;
+
+ if (pLZ_code_buf > &d->m_lz_code_buf[TDEFL_LZ_CODE_BUF_SIZE - 8]) {
+ int n;
+ d->m_lookahead_pos = lookahead_pos;
+ d->m_lookahead_size = lookahead_size;
+ d->m_dict_size = dict_size;
+ d->m_total_lz_bytes = total_lz_bytes;
+ d->m_pLZ_code_buf = pLZ_code_buf;
+ d->m_pLZ_flags = pLZ_flags;
+ d->m_num_flags_left = num_flags_left;
+ if ((n = tdefl_flush_block(d, 0)) != 0)
+ return (n < 0) ? MZ_FALSE : MZ_TRUE;
+ total_lz_bytes = d->m_total_lz_bytes;
+ pLZ_code_buf = d->m_pLZ_code_buf;
+ pLZ_flags = d->m_pLZ_flags;
+ num_flags_left = d->m_num_flags_left;
+ }
+ }
+ }
+
+ d->m_lookahead_pos = lookahead_pos;
+ d->m_lookahead_size = lookahead_size;
+ d->m_dict_size = dict_size;
+ d->m_total_lz_bytes = total_lz_bytes;
+ d->m_pLZ_code_buf = pLZ_code_buf;
+ d->m_pLZ_flags = pLZ_flags;
+ d->m_num_flags_left = num_flags_left;
+ return MZ_TRUE;
+}
+#endif // MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN
+
+static MZ_FORCEINLINE void tdefl_record_literal(tdefl_compressor *d,
+ mz_uint8 lit) {
+ d->m_total_lz_bytes++;
+ *d->m_pLZ_code_buf++ = lit;
+ *d->m_pLZ_flags = (mz_uint8)(*d->m_pLZ_flags >> 1);
+ if (--d->m_num_flags_left == 0) {
+ d->m_num_flags_left = 8;
+ d->m_pLZ_flags = d->m_pLZ_code_buf++;
+ }
+ d->m_huff_count[0][lit]++;
+}
+
+static MZ_FORCEINLINE void
+tdefl_record_match(tdefl_compressor *d, mz_uint match_len, mz_uint match_dist) {
+ mz_uint32 s0, s1;
+
+ MZ_ASSERT((match_len >= TDEFL_MIN_MATCH_LEN) && (match_dist >= 1) &&
+ (match_dist <= TDEFL_LZ_DICT_SIZE));
+
+ d->m_total_lz_bytes += match_len;
+
+ d->m_pLZ_code_buf[0] = (mz_uint8)(match_len - TDEFL_MIN_MATCH_LEN);
+
+ match_dist -= 1;
+ d->m_pLZ_code_buf[1] = (mz_uint8)(match_dist & 0xFF);
+ d->m_pLZ_code_buf[2] = (mz_uint8)(match_dist >> 8);
+ d->m_pLZ_code_buf += 3;
+
+ *d->m_pLZ_flags = (mz_uint8)((*d->m_pLZ_flags >> 1) | 0x80);
+ if (--d->m_num_flags_left == 0) {
+ d->m_num_flags_left = 8;
+ d->m_pLZ_flags = d->m_pLZ_code_buf++;
+ }
+
+ s0 = s_tdefl_small_dist_sym[match_dist & 511];
+ s1 = s_tdefl_large_dist_sym[(match_dist >> 8) & 127];
+ d->m_huff_count[1][(match_dist < 512) ? s0 : s1]++;
+
+ if (match_len >= TDEFL_MIN_MATCH_LEN)
+ d->m_huff_count[0][s_tdefl_len_sym[match_len - TDEFL_MIN_MATCH_LEN]]++;
+}
+
+static mz_bool tdefl_compress_normal(tdefl_compressor *d) {
+ const mz_uint8 *pSrc = d->m_pSrc;
+ size_t src_buf_left = d->m_src_buf_left;
+ tdefl_flush flush = d->m_flush;
+
+ while ((src_buf_left) || ((flush) && (d->m_lookahead_size))) {
+ mz_uint len_to_move, cur_match_dist, cur_match_len, cur_pos;
+ // Update dictionary and hash chains. Keeps the lookahead size equal to
+ // TDEFL_MAX_MATCH_LEN.
+ if ((d->m_lookahead_size + d->m_dict_size) >= (TDEFL_MIN_MATCH_LEN - 1)) {
+ mz_uint dst_pos = (d->m_lookahead_pos + d->m_lookahead_size) &
+ TDEFL_LZ_DICT_SIZE_MASK,
+ ins_pos = d->m_lookahead_pos + d->m_lookahead_size - 2;
+ mz_uint hash = (d->m_dict[ins_pos & TDEFL_LZ_DICT_SIZE_MASK]
+ << TDEFL_LZ_HASH_SHIFT) ^
+ d->m_dict[(ins_pos + 1) & TDEFL_LZ_DICT_SIZE_MASK];
+ mz_uint num_bytes_to_process = (mz_uint)MZ_MIN(
+ src_buf_left, TDEFL_MAX_MATCH_LEN - d->m_lookahead_size);
+ const mz_uint8 *pSrc_end = pSrc + num_bytes_to_process;
+ src_buf_left -= num_bytes_to_process;
+ d->m_lookahead_size += num_bytes_to_process;
+ while (pSrc != pSrc_end) {
+ mz_uint8 c = *pSrc++;
+ d->m_dict[dst_pos] = c;
+ if (dst_pos < (TDEFL_MAX_MATCH_LEN - 1))
+ d->m_dict[TDEFL_LZ_DICT_SIZE + dst_pos] = c;
+ hash = ((hash << TDEFL_LZ_HASH_SHIFT) ^ c) & (TDEFL_LZ_HASH_SIZE - 1);
+ d->m_next[ins_pos & TDEFL_LZ_DICT_SIZE_MASK] = d->m_hash[hash];
+ d->m_hash[hash] = (mz_uint16)(ins_pos);
+ dst_pos = (dst_pos + 1) & TDEFL_LZ_DICT_SIZE_MASK;
+ ins_pos++;
+ }
+ } else {
+ while ((src_buf_left) && (d->m_lookahead_size < TDEFL_MAX_MATCH_LEN)) {
+ mz_uint8 c = *pSrc++;
+ mz_uint dst_pos = (d->m_lookahead_pos + d->m_lookahead_size) &
+ TDEFL_LZ_DICT_SIZE_MASK;
+ src_buf_left--;
+ d->m_dict[dst_pos] = c;
+ if (dst_pos < (TDEFL_MAX_MATCH_LEN - 1))
+ d->m_dict[TDEFL_LZ_DICT_SIZE + dst_pos] = c;
+ if ((++d->m_lookahead_size + d->m_dict_size) >= TDEFL_MIN_MATCH_LEN) {
+ mz_uint ins_pos = d->m_lookahead_pos + (d->m_lookahead_size - 1) - 2;
+ mz_uint hash = ((d->m_dict[ins_pos & TDEFL_LZ_DICT_SIZE_MASK]
+ << (TDEFL_LZ_HASH_SHIFT * 2)) ^
+ (d->m_dict[(ins_pos + 1) & TDEFL_LZ_DICT_SIZE_MASK]
+ << TDEFL_LZ_HASH_SHIFT) ^
+ c) &
+ (TDEFL_LZ_HASH_SIZE - 1);
+ d->m_next[ins_pos & TDEFL_LZ_DICT_SIZE_MASK] = d->m_hash[hash];
+ d->m_hash[hash] = (mz_uint16)(ins_pos);
+ }
+ }
+ }
+ d->m_dict_size =
+ MZ_MIN(TDEFL_LZ_DICT_SIZE - d->m_lookahead_size, d->m_dict_size);
+ if ((!flush) && (d->m_lookahead_size < TDEFL_MAX_MATCH_LEN))
+ break;
+
+ // Simple lazy/greedy parsing state machine.
+ len_to_move = 1;
+ cur_match_dist = 0;
+ cur_match_len =
+ d->m_saved_match_len ? d->m_saved_match_len : (TDEFL_MIN_MATCH_LEN - 1);
+ cur_pos = d->m_lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK;
+ if (d->m_flags & (TDEFL_RLE_MATCHES | TDEFL_FORCE_ALL_RAW_BLOCKS)) {
+ if ((d->m_dict_size) && (!(d->m_flags & TDEFL_FORCE_ALL_RAW_BLOCKS))) {
+ mz_uint8 c = d->m_dict[(cur_pos - 1) & TDEFL_LZ_DICT_SIZE_MASK];
+ cur_match_len = 0;
+ while (cur_match_len < d->m_lookahead_size) {
+ if (d->m_dict[cur_pos + cur_match_len] != c)
+ break;
+ cur_match_len++;
+ }
+ if (cur_match_len < TDEFL_MIN_MATCH_LEN)
+ cur_match_len = 0;
+ else
+ cur_match_dist = 1;
+ }
+ } else {
+ tdefl_find_match(d, d->m_lookahead_pos, d->m_dict_size,
+ d->m_lookahead_size, &cur_match_dist, &cur_match_len);
+ }
+ if (((cur_match_len == TDEFL_MIN_MATCH_LEN) &&
+ (cur_match_dist >= 8U * 1024U)) ||
+ (cur_pos == cur_match_dist) ||
+ ((d->m_flags & TDEFL_FILTER_MATCHES) && (cur_match_len <= 5))) {
+ cur_match_dist = cur_match_len = 0;
+ }
+ if (d->m_saved_match_len) {
+ if (cur_match_len > d->m_saved_match_len) {
+ tdefl_record_literal(d, (mz_uint8)d->m_saved_lit);
+ if (cur_match_len >= 128) {
+ tdefl_record_match(d, cur_match_len, cur_match_dist);
+ d->m_saved_match_len = 0;
+ len_to_move = cur_match_len;
+ } else {
+ d->m_saved_lit = d->m_dict[cur_pos];
+ d->m_saved_match_dist = cur_match_dist;
+ d->m_saved_match_len = cur_match_len;
+ }
+ } else {
+ tdefl_record_match(d, d->m_saved_match_len, d->m_saved_match_dist);
+ len_to_move = d->m_saved_match_len - 1;
+ d->m_saved_match_len = 0;
+ }
+ } else if (!cur_match_dist)
+ tdefl_record_literal(d,
+ d->m_dict[MZ_MIN(cur_pos, sizeof(d->m_dict) - 1)]);
+ else if ((d->m_greedy_parsing) || (d->m_flags & TDEFL_RLE_MATCHES) ||
+ (cur_match_len >= 128)) {
+ tdefl_record_match(d, cur_match_len, cur_match_dist);
+ len_to_move = cur_match_len;
+ } else {
+ d->m_saved_lit = d->m_dict[MZ_MIN(cur_pos, sizeof(d->m_dict) - 1)];
+ d->m_saved_match_dist = cur_match_dist;
+ d->m_saved_match_len = cur_match_len;
+ }
+ // Move the lookahead forward by len_to_move bytes.
+ d->m_lookahead_pos += len_to_move;
+ MZ_ASSERT(d->m_lookahead_size >= len_to_move);
+ d->m_lookahead_size -= len_to_move;
+ d->m_dict_size = MZ_MIN(d->m_dict_size + len_to_move, (mz_uint)TDEFL_LZ_DICT_SIZE);
+ // Check if it's time to flush the current LZ codes to the internal output
+ // buffer.
+ if ((d->m_pLZ_code_buf > &d->m_lz_code_buf[TDEFL_LZ_CODE_BUF_SIZE - 8]) ||
+ ((d->m_total_lz_bytes > 31 * 1024) &&
+ (((((mz_uint)(d->m_pLZ_code_buf - d->m_lz_code_buf) * 115) >> 7) >=
+ d->m_total_lz_bytes) ||
+ (d->m_flags & TDEFL_FORCE_ALL_RAW_BLOCKS)))) {
+ int n;
+ d->m_pSrc = pSrc;
+ d->m_src_buf_left = src_buf_left;
+ if ((n = tdefl_flush_block(d, 0)) != 0)
+ return (n < 0) ? MZ_FALSE : MZ_TRUE;
+ }
+ }
+
+ d->m_pSrc = pSrc;
+ d->m_src_buf_left = src_buf_left;
+ return MZ_TRUE;
+}
+
+static tdefl_status tdefl_flush_output_buffer(tdefl_compressor *d) {
+ if (d->m_pIn_buf_size) {
+ *d->m_pIn_buf_size = d->m_pSrc - (const mz_uint8 *)d->m_pIn_buf;
+ }
+
+ if (d->m_pOut_buf_size) {
+ size_t n = MZ_MIN(*d->m_pOut_buf_size - d->m_out_buf_ofs,
+ d->m_output_flush_remaining);
+ memcpy((mz_uint8 *)d->m_pOut_buf + d->m_out_buf_ofs,
+ d->m_output_buf + d->m_output_flush_ofs, n);
+ d->m_output_flush_ofs += (mz_uint)n;
+ d->m_output_flush_remaining -= (mz_uint)n;
+ d->m_out_buf_ofs += n;
+
+ *d->m_pOut_buf_size = d->m_out_buf_ofs;
+ }
+
+ return (d->m_finished && !d->m_output_flush_remaining) ? TDEFL_STATUS_DONE
+ : TDEFL_STATUS_OKAY;
+}
+
+tdefl_status tdefl_compress(tdefl_compressor *d, const void *pIn_buf,
+ size_t *pIn_buf_size, void *pOut_buf,
+ size_t *pOut_buf_size, tdefl_flush flush) {
+ if (!d) {
+ if (pIn_buf_size)
+ *pIn_buf_size = 0;
+ if (pOut_buf_size)
+ *pOut_buf_size = 0;
+ return TDEFL_STATUS_BAD_PARAM;
+ }
+
+ d->m_pIn_buf = pIn_buf;
+ d->m_pIn_buf_size = pIn_buf_size;
+ d->m_pOut_buf = pOut_buf;
+ d->m_pOut_buf_size = pOut_buf_size;
+ d->m_pSrc = (const mz_uint8 *)(pIn_buf);
+ d->m_src_buf_left = pIn_buf_size ? *pIn_buf_size : 0;
+ d->m_out_buf_ofs = 0;
+ d->m_flush = flush;
+
+ if (((d->m_pPut_buf_func != NULL) ==
+ ((pOut_buf != NULL) || (pOut_buf_size != NULL))) ||
+ (d->m_prev_return_status != TDEFL_STATUS_OKAY) ||
+ (d->m_wants_to_finish && (flush != TDEFL_FINISH)) ||
+ (pIn_buf_size && *pIn_buf_size && !pIn_buf) ||
+ (pOut_buf_size && *pOut_buf_size && !pOut_buf)) {
+ if (pIn_buf_size)
+ *pIn_buf_size = 0;
+ if (pOut_buf_size)
+ *pOut_buf_size = 0;
+ return (d->m_prev_return_status = TDEFL_STATUS_BAD_PARAM);
+ }
+ d->m_wants_to_finish |= (flush == TDEFL_FINISH);
+
+ if ((d->m_output_flush_remaining) || (d->m_finished))
+ return (d->m_prev_return_status = tdefl_flush_output_buffer(d));
+
+#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN
+ if (((d->m_flags & TDEFL_MAX_PROBES_MASK) == 1) &&
+ ((d->m_flags & TDEFL_GREEDY_PARSING_FLAG) != 0) &&
+ ((d->m_flags & (TDEFL_FILTER_MATCHES | TDEFL_FORCE_ALL_RAW_BLOCKS |
+ TDEFL_RLE_MATCHES)) == 0)) {
+ if (!tdefl_compress_fast(d))
+ return d->m_prev_return_status;
+ } else
+#endif // #if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN
+ {
+ if (!tdefl_compress_normal(d))
+ return d->m_prev_return_status;
+ }
+
+ if ((d->m_flags & (TDEFL_WRITE_ZLIB_HEADER | TDEFL_COMPUTE_ADLER32)) &&
+ (pIn_buf))
+ d->m_adler32 =
+ (mz_uint32)mz_adler32(d->m_adler32, (const mz_uint8 *)pIn_buf,
+ d->m_pSrc - (const mz_uint8 *)pIn_buf);
+
+ if ((flush) && (!d->m_lookahead_size) && (!d->m_src_buf_left) &&
+ (!d->m_output_flush_remaining)) {
+ if (tdefl_flush_block(d, flush) < 0)
+ return d->m_prev_return_status;
+ d->m_finished = (flush == TDEFL_FINISH);
+ if (flush == TDEFL_FULL_FLUSH) {
+ MZ_CLEAR_OBJ(d->m_hash);
+ MZ_CLEAR_OBJ(d->m_next);
+ d->m_dict_size = 0;
+ }
+ }
+
+ return (d->m_prev_return_status = tdefl_flush_output_buffer(d));
+}
+
+tdefl_status tdefl_compress_buffer(tdefl_compressor *d, const void *pIn_buf,
+ size_t in_buf_size, tdefl_flush flush) {
+ MZ_ASSERT(d->m_pPut_buf_func);
+ return tdefl_compress(d, pIn_buf, &in_buf_size, NULL, NULL, flush);
+}
+
+tdefl_status tdefl_init(tdefl_compressor *d,
+ tdefl_put_buf_func_ptr pPut_buf_func,
+ void *pPut_buf_user, int flags) {
+ d->m_pPut_buf_func = pPut_buf_func;
+ d->m_pPut_buf_user = pPut_buf_user;
+ d->m_flags = (mz_uint)(flags);
+ d->m_max_probes[0] = 1 + ((flags & 0xFFF) + 2) / 3;
+ d->m_greedy_parsing = (flags & TDEFL_GREEDY_PARSING_FLAG) != 0;
+ d->m_max_probes[1] = 1 + (((flags & 0xFFF) >> 2) + 2) / 3;
+ if (!(flags & TDEFL_NONDETERMINISTIC_PARSING_FLAG))
+ MZ_CLEAR_OBJ(d->m_hash);
+ d->m_lookahead_pos = d->m_lookahead_size = d->m_dict_size =
+ d->m_total_lz_bytes = d->m_lz_code_buf_dict_pos = d->m_bits_in = 0;
+ d->m_output_flush_ofs = d->m_output_flush_remaining = d->m_finished =
+ d->m_block_index = d->m_bit_buffer = d->m_wants_to_finish = 0;
+ d->m_pLZ_code_buf = d->m_lz_code_buf + 1;
+ d->m_pLZ_flags = d->m_lz_code_buf;
+ d->m_num_flags_left = 8;
+ d->m_pOutput_buf = d->m_output_buf;
+ d->m_pOutput_buf_end = d->m_output_buf;
+ d->m_prev_return_status = TDEFL_STATUS_OKAY;
+ d->m_saved_match_dist = d->m_saved_match_len = d->m_saved_lit = 0;
+ d->m_adler32 = 1;
+ d->m_pIn_buf = NULL;
+ d->m_pOut_buf = NULL;
+ d->m_pIn_buf_size = NULL;
+ d->m_pOut_buf_size = NULL;
+ d->m_flush = TDEFL_NO_FLUSH;
+ d->m_pSrc = NULL;
+ d->m_src_buf_left = 0;
+ d->m_out_buf_ofs = 0;
+ memset(&d->m_huff_count[0][0], 0,
+ sizeof(d->m_huff_count[0][0]) * TDEFL_MAX_HUFF_SYMBOLS_0);
+ memset(&d->m_huff_count[1][0], 0,
+ sizeof(d->m_huff_count[1][0]) * TDEFL_MAX_HUFF_SYMBOLS_1);
+ return TDEFL_STATUS_OKAY;
+}
+
+tdefl_status tdefl_get_prev_return_status(tdefl_compressor *d) {
+ return d->m_prev_return_status;
+}
+
+mz_uint32 tdefl_get_adler32(tdefl_compressor *d) { return d->m_adler32; }
+
+mz_bool tdefl_compress_mem_to_output(const void *pBuf, size_t buf_len,
+ tdefl_put_buf_func_ptr pPut_buf_func,
+ void *pPut_buf_user, int flags) {
+ tdefl_compressor *pComp;
+ mz_bool succeeded;
+ if (((buf_len) && (!pBuf)) || (!pPut_buf_func))
+ return MZ_FALSE;
+ pComp = (tdefl_compressor *)MZ_MALLOC(sizeof(tdefl_compressor));
+ if (!pComp)
+ return MZ_FALSE;
+ succeeded = (tdefl_init(pComp, pPut_buf_func, pPut_buf_user, flags) ==
+ TDEFL_STATUS_OKAY);
+ succeeded =
+ succeeded && (tdefl_compress_buffer(pComp, pBuf, buf_len, TDEFL_FINISH) ==
+ TDEFL_STATUS_DONE);
+ MZ_FREE(pComp);
+ return succeeded;
+}
+
+typedef struct {
+ size_t m_size, m_capacity;
+ mz_uint8 *m_pBuf;
+ mz_bool m_expandable;
+} tdefl_output_buffer;
+
+static mz_bool tdefl_output_buffer_putter(const void *pBuf, int len,
+ void *pUser) {
+ tdefl_output_buffer *p = (tdefl_output_buffer *)pUser;
+ size_t new_size = p->m_size + len;
+ if (new_size > p->m_capacity) {
+ size_t new_capacity = p->m_capacity;
+ mz_uint8 *pNew_buf;
+ if (!p->m_expandable)
+ return MZ_FALSE;
+ do {
+ new_capacity = MZ_MAX(128U, new_capacity << 1U);
+ } while (new_size > new_capacity);
+ pNew_buf = (mz_uint8 *)MZ_REALLOC(p->m_pBuf, new_capacity);
+ if (!pNew_buf)
+ return MZ_FALSE;
+ p->m_pBuf = pNew_buf;
+ p->m_capacity = new_capacity;
+ }
+ memcpy((mz_uint8 *)p->m_pBuf + p->m_size, pBuf, len);
+ p->m_size = new_size;
+ return MZ_TRUE;
+}
+
+void *tdefl_compress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len,
+ size_t *pOut_len, int flags) {
+ tdefl_output_buffer out_buf;
+ MZ_CLEAR_OBJ(out_buf);
+ if (!pOut_len)
+ return MZ_FALSE;
+ else
+ *pOut_len = 0;
+ out_buf.m_expandable = MZ_TRUE;
+ if (!tdefl_compress_mem_to_output(
+ pSrc_buf, src_buf_len, tdefl_output_buffer_putter, &out_buf, flags))
+ return NULL;
+ *pOut_len = out_buf.m_size;
+ return out_buf.m_pBuf;
+}
+
+size_t tdefl_compress_mem_to_mem(void *pOut_buf, size_t out_buf_len,
+ const void *pSrc_buf, size_t src_buf_len,
+ int flags) {
+ tdefl_output_buffer out_buf;
+ MZ_CLEAR_OBJ(out_buf);
+ if (!pOut_buf)
+ return 0;
+ out_buf.m_pBuf = (mz_uint8 *)pOut_buf;
+ out_buf.m_capacity = out_buf_len;
+ if (!tdefl_compress_mem_to_output(
+ pSrc_buf, src_buf_len, tdefl_output_buffer_putter, &out_buf, flags))
+ return 0;
+ return out_buf.m_size;
+}
+
+#ifndef MINIZ_NO_ZLIB_APIS
+static const mz_uint s_tdefl_num_probes[11] = {0, 1, 6, 32, 16, 32,
+ 128, 256, 512, 768, 1500};
+
+// level may actually range from [0,10] (10 is a "hidden" max level, where we
+// want a bit more compression and it's fine if throughput to fall off a cliff
+// on some files).
+mz_uint tdefl_create_comp_flags_from_zip_params(int level, int window_bits,
+ int strategy) {
+ mz_uint comp_flags =
+ s_tdefl_num_probes[(level >= 0) ? MZ_MIN(10, level) : MZ_DEFAULT_LEVEL] |
+ ((level <= 3) ? TDEFL_GREEDY_PARSING_FLAG : 0);
+ if (window_bits > 0)
+ comp_flags |= TDEFL_WRITE_ZLIB_HEADER;
+
+ if (!level)
+ comp_flags |= TDEFL_FORCE_ALL_RAW_BLOCKS;
+ else if (strategy == MZ_FILTERED)
+ comp_flags |= TDEFL_FILTER_MATCHES;
+ else if (strategy == MZ_HUFFMAN_ONLY)
+ comp_flags &= ~TDEFL_MAX_PROBES_MASK;
+ else if (strategy == MZ_FIXED)
+ comp_flags |= TDEFL_FORCE_ALL_STATIC_BLOCKS;
+ else if (strategy == MZ_RLE)
+ comp_flags |= TDEFL_RLE_MATCHES;
+
+ return comp_flags;
+}
+#endif // MINIZ_NO_ZLIB_APIS
+
+#ifdef _MSC_VER
+#pragma warning(push)
+#pragma warning(disable : 4204) // nonstandard extension used : non-constant
+ // aggregate initializer (also supported by GNU
+ // C and C99, so no big deal)
+#pragma warning(disable : 4244) // 'initializing': conversion from '__int64' to
+ // 'int', possible loss of data
+#pragma warning(disable : 4267) // 'argument': conversion from '__int64' to 'int',
+ // possible loss of data
+#pragma warning(disable : 4996) // 'strdup': The POSIX name for this item is
+ // deprecated. Instead, use the ISO C and C++
+ // conformant name: _strdup.
+#endif
+
+// Simple PNG writer function by Alex Evans, 2011. Released into the public
+// domain: https://gist.github.com/908299, more context at
+// http://altdevblogaday.org/2011/04/06/a-smaller-jpg-encoder/.
+// This is actually a modification of Alex's original code so PNG files
+// generated by this function pass pngcheck.
+void *tdefl_write_image_to_png_file_in_memory_ex(const void *pImage, int w,
+ int h, int num_chans,
+ size_t *pLen_out,
+ mz_uint level, mz_bool flip) {
+ // Using a local copy of this array here in case MINIZ_NO_ZLIB_APIS was
+ // defined.
+ static const mz_uint s_tdefl_png_num_probes[11] = {
+ 0, 1, 6, 32, 16, 32, 128, 256, 512, 768, 1500};
+ tdefl_compressor *pComp =
+ (tdefl_compressor *)MZ_MALLOC(sizeof(tdefl_compressor));
+ tdefl_output_buffer out_buf;
+ int i, bpl = w * num_chans, y, z;
+ mz_uint32 c;
+ *pLen_out = 0;
+ if (!pComp)
+ return NULL;
+ MZ_CLEAR_OBJ(out_buf);
+ out_buf.m_expandable = MZ_TRUE;
+ out_buf.m_capacity = 57 + MZ_MAX(64, (1 + bpl) * h);
+ if (NULL == (out_buf.m_pBuf = (mz_uint8 *)MZ_MALLOC(out_buf.m_capacity))) {
+ MZ_FREE(pComp);
+ return NULL;
+ }
+ // write dummy header
+ for (z = 41; z; --z)
+ tdefl_output_buffer_putter(&z, 1, &out_buf);
+ // compress image data
+ tdefl_init(pComp, tdefl_output_buffer_putter, &out_buf,
+ s_tdefl_png_num_probes[MZ_MIN(10, level)] |
+ TDEFL_WRITE_ZLIB_HEADER);
+ for (y = 0; y < h; ++y) {
+ tdefl_compress_buffer(pComp, &z, 1, TDEFL_NO_FLUSH);
+ tdefl_compress_buffer(pComp,
+ (mz_uint8 *)pImage + (flip ? (h - 1 - y) : y) * bpl,
+ bpl, TDEFL_NO_FLUSH);
+ }
+ if (tdefl_compress_buffer(pComp, NULL, 0, TDEFL_FINISH) !=
+ TDEFL_STATUS_DONE) {
+ MZ_FREE(pComp);
+ MZ_FREE(out_buf.m_pBuf);
+ return NULL;
+ }
+ // write real header
+ *pLen_out = out_buf.m_size - 41;
+ {
+ static const mz_uint8 chans[] = {0x00, 0x00, 0x04, 0x02, 0x06};
+ mz_uint8 pnghdr[41] = {
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
+ 0x49, 0x48, 0x44, 0x52, 0, 0, (mz_uint8)(w >> 8), (mz_uint8)w, 0, 0,
+ (mz_uint8)(h >> 8), (mz_uint8)h, 8, chans[num_chans], 0, 0, 0, 0, 0, 0,
+ 0, (mz_uint8)(*pLen_out >> 24), (mz_uint8)(*pLen_out >> 16),
+ (mz_uint8)(*pLen_out >> 8), (mz_uint8)*pLen_out, 0x49, 0x44, 0x41,
+ 0x54};
+ c = (mz_uint32)mz_crc32(MZ_CRC32_INIT, pnghdr + 12, 17);
+ for (i = 0; i < 4; ++i, c <<= 8)
+ ((mz_uint8 *)(pnghdr + 29))[i] = (mz_uint8)(c >> 24);
+ memcpy(out_buf.m_pBuf, pnghdr, 41);
+ }
+ // write footer (IDAT CRC-32, followed by IEND chunk)
+ if (!tdefl_output_buffer_putter(
+ "\0\0\0\0\0\0\0\0\x49\x45\x4e\x44\xae\x42\x60\x82", 16, &out_buf)) {
+ *pLen_out = 0;
+ MZ_FREE(pComp);
+ MZ_FREE(out_buf.m_pBuf);
+ return NULL;
+ }
+ c = (mz_uint32)mz_crc32(MZ_CRC32_INIT, out_buf.m_pBuf + 41 - 4,
+ *pLen_out + 4);
+ for (i = 0; i < 4; ++i, c <<= 8)
+ (out_buf.m_pBuf + out_buf.m_size - 16)[i] = (mz_uint8)(c >> 24);
+ // compute final size of file, grab compressed data buffer and return
+ *pLen_out += 57;
+ MZ_FREE(pComp);
+ return out_buf.m_pBuf;
+}
+void *tdefl_write_image_to_png_file_in_memory(const void *pImage, int w, int h,
+ int num_chans, size_t *pLen_out) {
+ // Level 6 corresponds to TDEFL_DEFAULT_MAX_PROBES or MZ_DEFAULT_LEVEL (but we
+ // can't depend on MZ_DEFAULT_LEVEL being available in case the zlib API's
+ // where #defined out)
+ return tdefl_write_image_to_png_file_in_memory_ex(pImage, w, h, num_chans,
+ pLen_out, 6, MZ_FALSE);
+}
+
+// ------------------- .ZIP archive reading
+
+#ifndef MINIZ_NO_ARCHIVE_APIS
+
+#ifdef MINIZ_NO_STDIO
+#define MZ_FILE void *
+#else
+#include <stdio.h>
+#include <sys/stat.h>
+
+#if defined(_MSC_VER) || defined(__MINGW64__)
+static FILE *mz_fopen(const char *pFilename, const char *pMode) {
+ FILE *pFile = NULL;
+ fopen_s(&pFile, pFilename, pMode);
+ return pFile;
+}
+static FILE *mz_freopen(const char *pPath, const char *pMode, FILE *pStream) {
+ FILE *pFile = NULL;
+ if (freopen_s(&pFile, pPath, pMode, pStream))
+ return NULL;
+ return pFile;
+}
+#ifndef MINIZ_NO_TIME
+#include <sys/utime.h>
+#endif
+#define MZ_FILE FILE
+#define MZ_FOPEN mz_fopen
+#define MZ_FCLOSE fclose
+#define MZ_FREAD fread
+#define MZ_FWRITE fwrite
+#define MZ_FTELL64 _ftelli64
+#define MZ_FSEEK64 _fseeki64
+#define MZ_FILE_STAT_STRUCT _stat
+#define MZ_FILE_STAT _stat
+#define MZ_FFLUSH fflush
+#define MZ_FREOPEN mz_freopen
+#define MZ_DELETE_FILE remove
+#elif defined(__MINGW32__)
+#ifndef MINIZ_NO_TIME
+#include <sys/utime.h>
+#endif
+#define MZ_FILE FILE
+#define MZ_FOPEN(f, m) fopen(f, m)
+#define MZ_FCLOSE fclose
+#define MZ_FREAD fread
+#define MZ_FWRITE fwrite
+#define MZ_FTELL64 ftello64
+#define MZ_FSEEK64 fseeko64
+#define MZ_FILE_STAT_STRUCT _stat
+#define MZ_FILE_STAT _stat
+#define MZ_FFLUSH fflush
+#define MZ_FREOPEN(f, m, s) freopen(f, m, s)
+#define MZ_DELETE_FILE remove
+#elif defined(__TINYC__)
+#ifndef MINIZ_NO_TIME
+#include <sys/utime.h>
+#endif
+#define MZ_FILE FILE
+#define MZ_FOPEN(f, m) fopen(f, m)
+#define MZ_FCLOSE fclose
+#define MZ_FREAD fread
+#define MZ_FWRITE fwrite
+#define MZ_FTELL64 ftell
+#define MZ_FSEEK64 fseek
+#define MZ_FILE_STAT_STRUCT stat
+#define MZ_FILE_STAT stat
+#define MZ_FFLUSH fflush
+#define MZ_FREOPEN(f, m, s) freopen(f, m, s)
+#define MZ_DELETE_FILE remove
+#elif defined(__GNUC__) && defined(_LARGEFILE64_SOURCE) && _LARGEFILE64_SOURCE
+#ifndef MINIZ_NO_TIME
+#include <utime.h>
+#endif
+#define MZ_FILE FILE
+#define MZ_FOPEN(f, m) fopen64(f, m)
+#define MZ_FCLOSE fclose
+#define MZ_FREAD fread
+#define MZ_FWRITE fwrite
+#define MZ_FTELL64 ftello64
+#define MZ_FSEEK64 fseeko64
+#define MZ_FILE_STAT_STRUCT stat64
+#define MZ_FILE_STAT stat64
+#define MZ_FFLUSH fflush
+#define MZ_FREOPEN(p, m, s) freopen64(p, m, s)
+#define MZ_DELETE_FILE remove
+#else
+#ifndef MINIZ_NO_TIME
+#include <utime.h>
+#endif
+#define MZ_FILE FILE
+#define MZ_FOPEN(f, m) fopen(f, m)
+#define MZ_FCLOSE fclose
+#define MZ_FREAD fread
+#define MZ_FWRITE fwrite
+#define MZ_FTELL64 ftello
+#define MZ_FSEEK64 fseeko
+#define MZ_FILE_STAT_STRUCT stat
+#define MZ_FILE_STAT stat
+#define MZ_FFLUSH fflush
+#define MZ_FREOPEN(f, m, s) freopen(f, m, s)
+#define MZ_DELETE_FILE remove
+#endif // #ifdef _MSC_VER
+#endif // #ifdef MINIZ_NO_STDIO
+
+#define MZ_TOLOWER(c) ((((c) >= 'A') && ((c) <= 'Z')) ? ((c) - 'A' + 'a') : (c))
+
+// Various ZIP archive enums. To completely avoid cross platform compiler
+// alignment and platform endian issues, miniz.c doesn't use structs for any of
+// this stuff.
+enum {
+ // ZIP archive identifiers and record sizes
+ MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIG = 0x06054b50,
+ MZ_ZIP_CENTRAL_DIR_HEADER_SIG = 0x02014b50,
+ MZ_ZIP_LOCAL_DIR_HEADER_SIG = 0x04034b50,
+ MZ_ZIP_LOCAL_DIR_HEADER_SIZE = 30,
+ MZ_ZIP_CENTRAL_DIR_HEADER_SIZE = 46,
+ MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE = 22,
+ // Central directory header record offsets
+ MZ_ZIP_CDH_SIG_OFS = 0,
+ MZ_ZIP_CDH_VERSION_MADE_BY_OFS = 4,
+ MZ_ZIP_CDH_VERSION_NEEDED_OFS = 6,
+ MZ_ZIP_CDH_BIT_FLAG_OFS = 8,
+ MZ_ZIP_CDH_METHOD_OFS = 10,
+ MZ_ZIP_CDH_FILE_TIME_OFS = 12,
+ MZ_ZIP_CDH_FILE_DATE_OFS = 14,
+ MZ_ZIP_CDH_CRC32_OFS = 16,
+ MZ_ZIP_CDH_COMPRESSED_SIZE_OFS = 20,
+ MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS = 24,
+ MZ_ZIP_CDH_FILENAME_LEN_OFS = 28,
+ MZ_ZIP_CDH_EXTRA_LEN_OFS = 30,
+ MZ_ZIP_CDH_COMMENT_LEN_OFS = 32,
+ MZ_ZIP_CDH_DISK_START_OFS = 34,
+ MZ_ZIP_CDH_INTERNAL_ATTR_OFS = 36,
+ MZ_ZIP_CDH_EXTERNAL_ATTR_OFS = 38,
+ MZ_ZIP_CDH_LOCAL_HEADER_OFS = 42,
+ // Local directory header offsets
+ MZ_ZIP_LDH_SIG_OFS = 0,
+ MZ_ZIP_LDH_VERSION_NEEDED_OFS = 4,
+ MZ_ZIP_LDH_BIT_FLAG_OFS = 6,
+ MZ_ZIP_LDH_METHOD_OFS = 8,
+ MZ_ZIP_LDH_FILE_TIME_OFS = 10,
+ MZ_ZIP_LDH_FILE_DATE_OFS = 12,
+ MZ_ZIP_LDH_CRC32_OFS = 14,
+ MZ_ZIP_LDH_COMPRESSED_SIZE_OFS = 18,
+ MZ_ZIP_LDH_DECOMPRESSED_SIZE_OFS = 22,
+ MZ_ZIP_LDH_FILENAME_LEN_OFS = 26,
+ MZ_ZIP_LDH_EXTRA_LEN_OFS = 28,
+ // End of central directory offsets
+ MZ_ZIP_ECDH_SIG_OFS = 0,
+ MZ_ZIP_ECDH_NUM_THIS_DISK_OFS = 4,
+ MZ_ZIP_ECDH_NUM_DISK_CDIR_OFS = 6,
+ MZ_ZIP_ECDH_CDIR_NUM_ENTRIES_ON_DISK_OFS = 8,
+ MZ_ZIP_ECDH_CDIR_TOTAL_ENTRIES_OFS = 10,
+ MZ_ZIP_ECDH_CDIR_SIZE_OFS = 12,
+ MZ_ZIP_ECDH_CDIR_OFS_OFS = 16,
+ MZ_ZIP_ECDH_COMMENT_SIZE_OFS = 20,
+};
+
+typedef struct {
+ void *m_p;
+ size_t m_size, m_capacity;
+ mz_uint m_element_size;
+} mz_zip_array;
+
+struct mz_zip_internal_state_tag {
+ mz_zip_array m_central_dir;
+ mz_zip_array m_central_dir_offsets;
+ mz_zip_array m_sorted_central_dir_offsets;
+ MZ_FILE *m_pFile;
+ void *m_pMem;
+ size_t m_mem_size;
+ size_t m_mem_capacity;
+};
+
+#define MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(array_ptr, element_size) \
+ (array_ptr)->m_element_size = element_size
+#define MZ_ZIP_ARRAY_ELEMENT(array_ptr, element_type, index) \
+ ((element_type *)((array_ptr)->m_p))[index]
+
+static MZ_FORCEINLINE void mz_zip_array_clear(mz_zip_archive *pZip,
+ mz_zip_array *pArray) {
+ pZip->m_pFree(pZip->m_pAlloc_opaque, pArray->m_p);
+ memset(pArray, 0, sizeof(mz_zip_array));
+}
+
+static mz_bool mz_zip_array_ensure_capacity(mz_zip_archive *pZip,
+ mz_zip_array *pArray,
+ size_t min_new_capacity,
+ mz_uint growing) {
+ void *pNew_p;
+ size_t new_capacity = min_new_capacity;
+ MZ_ASSERT(pArray->m_element_size);
+ if (pArray->m_capacity >= min_new_capacity)
+ return MZ_TRUE;
+ if (growing) {
+ new_capacity = MZ_MAX(1, pArray->m_capacity);
+ while (new_capacity < min_new_capacity)
+ new_capacity *= 2;
+ }
+ if (NULL == (pNew_p = pZip->m_pRealloc(pZip->m_pAlloc_opaque, pArray->m_p,
+ pArray->m_element_size, new_capacity)))
+ return MZ_FALSE;
+ pArray->m_p = pNew_p;
+ pArray->m_capacity = new_capacity;
+ return MZ_TRUE;
+}
+
+static MZ_FORCEINLINE mz_bool
+mz_zip_array_reserve(mz_zip_archive *pZip, mz_zip_array *pArray,
+ size_t new_capacity, mz_uint growing) {
+ if (new_capacity > pArray->m_capacity) {
+ if (!mz_zip_array_ensure_capacity(pZip, pArray, new_capacity, growing))
+ return MZ_FALSE;
+ }
+ return MZ_TRUE;
+}
+
+static MZ_FORCEINLINE mz_bool
+mz_zip_array_resize(mz_zip_archive *pZip, mz_zip_array *pArray, size_t new_size,
+ mz_uint growing) {
+ if (new_size > pArray->m_capacity) {
+ if (!mz_zip_array_ensure_capacity(pZip, pArray, new_size, growing))
+ return MZ_FALSE;
+ }
+ pArray->m_size = new_size;
+ return MZ_TRUE;
+}
+
+static MZ_FORCEINLINE mz_bool
+mz_zip_array_ensure_room(mz_zip_archive *pZip, mz_zip_array *pArray, size_t n) {
+ return mz_zip_array_reserve(pZip, pArray, pArray->m_size + n, MZ_TRUE);
+}
+
+static MZ_FORCEINLINE mz_bool
+mz_zip_array_push_back(mz_zip_archive *pZip, mz_zip_array *pArray,
+ const void *pElements, size_t n) {
+ size_t orig_size = pArray->m_size;
+ if (!mz_zip_array_resize(pZip, pArray, orig_size + n, MZ_TRUE))
+ return MZ_FALSE;
+ memcpy((mz_uint8 *)pArray->m_p + orig_size * pArray->m_element_size,
+ pElements, n * pArray->m_element_size);
+ return MZ_TRUE;
+}
+
+#ifndef MINIZ_NO_TIME
+static time_t mz_zip_dos_to_time_t(int dos_time, int dos_date) {
+ struct tm tm;
+ memset(&tm, 0, sizeof(tm));
+ tm.tm_isdst = -1;
+ tm.tm_year = ((dos_date >> 9) & 127) + 1980 - 1900;
+ tm.tm_mon = ((dos_date >> 5) & 15) - 1;
+ tm.tm_mday = dos_date & 31;
+ tm.tm_hour = (dos_time >> 11) & 31;
+ tm.tm_min = (dos_time >> 5) & 63;
+ tm.tm_sec = (dos_time << 1) & 62;
+ return mktime(&tm);
+}
+
+static void mz_zip_time_to_dos_time(time_t time, mz_uint16 *pDOS_time,
+ mz_uint16 *pDOS_date) {
+#ifdef _MSC_VER
+ struct tm tm_struct;
+ struct tm *tm = &tm_struct;
+ errno_t err = localtime_s(tm, &time);
+ if (err) {
+ *pDOS_date = 0;
+ *pDOS_time = 0;
+ return;
+ }
+#else
+ struct tm *tm = localtime(&time);
+#endif
+ *pDOS_time = (mz_uint16)(((tm->tm_hour) << 11) + ((tm->tm_min) << 5) +
+ ((tm->tm_sec) >> 1));
+ *pDOS_date = (mz_uint16)(((tm->tm_year + 1900 - 1980) << 9) +
+ ((tm->tm_mon + 1) << 5) + tm->tm_mday);
+}
+#endif
+
+#ifndef MINIZ_NO_STDIO
+static mz_bool mz_zip_get_file_modified_time(const char *pFilename,
+ mz_uint16 *pDOS_time,
+ mz_uint16 *pDOS_date) {
+#ifdef MINIZ_NO_TIME
+ (void)pFilename;
+ *pDOS_date = *pDOS_time = 0;
+#else
+ struct MZ_FILE_STAT_STRUCT file_stat;
+ // On Linux with x86 glibc, this call will fail on large files (>= 0x80000000
+ // bytes) unless you compiled with _LARGEFILE64_SOURCE. Argh.
+ if (MZ_FILE_STAT(pFilename, &file_stat) != 0)
+ return MZ_FALSE;
+ mz_zip_time_to_dos_time(file_stat.st_mtime, pDOS_time, pDOS_date);
+#endif // #ifdef MINIZ_NO_TIME
+ return MZ_TRUE;
+}
+
+#ifndef MINIZ_NO_TIME
+static mz_bool mz_zip_set_file_times(const char *pFilename, time_t access_time,
+ time_t modified_time) {
+ struct utimbuf t;
+ t.actime = access_time;
+ t.modtime = modified_time;
+ return !utime(pFilename, &t);
+}
+#endif // #ifndef MINIZ_NO_TIME
+#endif // #ifndef MINIZ_NO_STDIO
+
+static mz_bool mz_zip_reader_init_internal(mz_zip_archive *pZip,
+ mz_uint32 flags) {
+ (void)flags;
+ if ((!pZip) || (pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_INVALID))
+ return MZ_FALSE;
+
+ if (!pZip->m_pAlloc)
+ pZip->m_pAlloc = def_alloc_func;
+ if (!pZip->m_pFree)
+ pZip->m_pFree = def_free_func;
+ if (!pZip->m_pRealloc)
+ pZip->m_pRealloc = def_realloc_func;
+
+ pZip->m_zip_mode = MZ_ZIP_MODE_READING;
+ pZip->m_archive_size = 0;
+ pZip->m_central_directory_file_ofs = 0;
+ pZip->m_total_files = 0;
+
+ if (NULL == (pZip->m_pState = (mz_zip_internal_state *)pZip->m_pAlloc(
+ pZip->m_pAlloc_opaque, 1, sizeof(mz_zip_internal_state))))
+ return MZ_FALSE;
+ memset(pZip->m_pState, 0, sizeof(mz_zip_internal_state));
+ MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_central_dir,
+ sizeof(mz_uint8));
+ MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_central_dir_offsets,
+ sizeof(mz_uint32));
+ MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_sorted_central_dir_offsets,
+ sizeof(mz_uint32));
+ return MZ_TRUE;
+}
+
+static MZ_FORCEINLINE mz_bool
+mz_zip_reader_filename_less(const mz_zip_array *pCentral_dir_array,
+ const mz_zip_array *pCentral_dir_offsets,
+ mz_uint l_index, mz_uint r_index) {
+ const mz_uint8 *pL = &MZ_ZIP_ARRAY_ELEMENT(
+ pCentral_dir_array, mz_uint8,
+ MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_offsets, mz_uint32,
+ l_index)),
+ *pE;
+ const mz_uint8 *pR =
+ &MZ_ZIP_ARRAY_ELEMENT(
+ pCentral_dir_array, mz_uint8,
+ MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_offsets, mz_uint32, r_index));
+ mz_uint l_len = MZ_READ_LE16(pL + MZ_ZIP_CDH_FILENAME_LEN_OFS),
+ r_len = MZ_READ_LE16(pR + MZ_ZIP_CDH_FILENAME_LEN_OFS);
+ mz_uint8 l = 0, r = 0;
+ pL += MZ_ZIP_CENTRAL_DIR_HEADER_SIZE;
+ pR += MZ_ZIP_CENTRAL_DIR_HEADER_SIZE;
+ pE = pL + MZ_MIN(l_len, r_len);
+ while (pL < pE) {
+ if ((l = MZ_TOLOWER(*pL)) != (r = MZ_TOLOWER(*pR)))
+ break;
+ pL++;
+ pR++;
+ }
+ return (pL == pE) ? (l_len < r_len) : (l < r);
+}
+
+#define MZ_SWAP_UINT32(a, b) \
+ do { \
+ mz_uint32 t = a; \
+ a = b; \
+ b = t; \
+ } \
+ MZ_MACRO_END
+
+// Heap sort of lowercased filenames, used to help accelerate plain central
+// directory searches by mz_zip_reader_locate_file(). (Could also use qsort(),
+// but it could allocate memory.)
+static void
+mz_zip_reader_sort_central_dir_offsets_by_filename(mz_zip_archive *pZip) {
+ mz_zip_internal_state *pState = pZip->m_pState;
+ const mz_zip_array *pCentral_dir_offsets = &pState->m_central_dir_offsets;
+ const mz_zip_array *pCentral_dir = &pState->m_central_dir;
+ mz_uint32 *pIndices =
+ &MZ_ZIP_ARRAY_ELEMENT(&pState->m_sorted_central_dir_offsets, mz_uint32,
+ 0);
+ const int size = pZip->m_total_files;
+ int start = (size - 2) >> 1, end;
+ while (start >= 0) {
+ int child, root = start;
+ for (;;) {
+ if ((child = (root << 1) + 1) >= size)
+ break;
+ child +=
+ (((child + 1) < size) &&
+ (mz_zip_reader_filename_less(pCentral_dir, pCentral_dir_offsets,
+ pIndices[child], pIndices[child + 1])));
+ if (!mz_zip_reader_filename_less(pCentral_dir, pCentral_dir_offsets,
+ pIndices[root], pIndices[child]))
+ break;
+ MZ_SWAP_UINT32(pIndices[root], pIndices[child]);
+ root = child;
+ }
+ start--;
+ }
+
+ end = size - 1;
+ while (end > 0) {
+ int child, root = 0;
+ MZ_SWAP_UINT32(pIndices[end], pIndices[0]);
+ for (;;) {
+ if ((child = (root << 1) + 1) >= end)
+ break;
+ child +=
+ (((child + 1) < end) &&
+ mz_zip_reader_filename_less(pCentral_dir, pCentral_dir_offsets,
+ pIndices[child], pIndices[child + 1]));
+ if (!mz_zip_reader_filename_less(pCentral_dir, pCentral_dir_offsets,
+ pIndices[root], pIndices[child]))
+ break;
+ MZ_SWAP_UINT32(pIndices[root], pIndices[child]);
+ root = child;
+ }
+ end--;
+ }
+}
+
+static mz_bool mz_zip_reader_read_central_dir(mz_zip_archive *pZip,
+ mz_uint32 flags) {
+ mz_uint cdir_size, num_this_disk, cdir_disk_index;
+ mz_uint64 cdir_ofs;
+ mz_int64 cur_file_ofs;
+ const mz_uint8 *p;
+ mz_uint32 buf_u32[4096 / sizeof(mz_uint32)];
+ mz_uint8 *pBuf = (mz_uint8 *)buf_u32;
+ mz_bool sort_central_dir =
+ ((flags & MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY) == 0);
+ // Basic sanity checks - reject files which are too small, and check the first
+ // 4 bytes of the file to make sure a local header is there.
+ if (pZip->m_archive_size < MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE)
+ return MZ_FALSE;
+ // Find the end of central directory record by scanning the file from the end
+ // towards the beginning.
+ cur_file_ofs =
+ MZ_MAX((mz_int64)pZip->m_archive_size - (mz_int64)sizeof(buf_u32), 0);
+ for (;;) {
+ int i,
+ n = (int)MZ_MIN(sizeof(buf_u32), pZip->m_archive_size - cur_file_ofs);
+ if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pBuf, n) != (mz_uint)n)
+ return MZ_FALSE;
+ for (i = n - 4; i >= 0; --i)
+ if (MZ_READ_LE32(pBuf + i) == MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIG)
+ break;
+ if (i >= 0) {
+ cur_file_ofs += i;
+ break;
+ }
+ if ((!cur_file_ofs) || ((pZip->m_archive_size - cur_file_ofs) >=
+ (0xFFFF + MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE)))
+ return MZ_FALSE;
+ cur_file_ofs = MZ_MAX(cur_file_ofs - (sizeof(buf_u32) - 3), 0);
+ }
+ // Read and verify the end of central directory record.
+ if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pBuf,
+ MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE) !=
+ MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE)
+ return MZ_FALSE;
+ if ((MZ_READ_LE32(pBuf + MZ_ZIP_ECDH_SIG_OFS) !=
+ MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIG) ||
+ ((pZip->m_total_files =
+ MZ_READ_LE16(pBuf + MZ_ZIP_ECDH_CDIR_TOTAL_ENTRIES_OFS)) !=
+ MZ_READ_LE16(pBuf + MZ_ZIP_ECDH_CDIR_NUM_ENTRIES_ON_DISK_OFS)))
+ return MZ_FALSE;
+
+ num_this_disk = MZ_READ_LE16(pBuf + MZ_ZIP_ECDH_NUM_THIS_DISK_OFS);
+ cdir_disk_index = MZ_READ_LE16(pBuf + MZ_ZIP_ECDH_NUM_DISK_CDIR_OFS);
+ if (((num_this_disk | cdir_disk_index) != 0) &&
+ ((num_this_disk != 1) || (cdir_disk_index != 1)))
+ return MZ_FALSE;
+
+ if ((cdir_size = MZ_READ_LE32(pBuf + MZ_ZIP_ECDH_CDIR_SIZE_OFS)) <
+ pZip->m_total_files * MZ_ZIP_CENTRAL_DIR_HEADER_SIZE)
+ return MZ_FALSE;
+
+ cdir_ofs = MZ_READ_LE32(pBuf + MZ_ZIP_ECDH_CDIR_OFS_OFS);
+ if ((cdir_ofs + (mz_uint64)cdir_size) > pZip->m_archive_size)
+ return MZ_FALSE;
+
+ pZip->m_central_directory_file_ofs = cdir_ofs;
+
+ if (pZip->m_total_files) {
+ mz_uint i, n;
+
+ // Read the entire central directory into a heap block, and allocate another
+ // heap block to hold the unsorted central dir file record offsets, and
+ // another to hold the sorted indices.
+ if ((!mz_zip_array_resize(pZip, &pZip->m_pState->m_central_dir, cdir_size,
+ MZ_FALSE)) ||
+ (!mz_zip_array_resize(pZip, &pZip->m_pState->m_central_dir_offsets,
+ pZip->m_total_files, MZ_FALSE)))
+ return MZ_FALSE;
+
+ if (sort_central_dir) {
+ if (!mz_zip_array_resize(pZip,
+ &pZip->m_pState->m_sorted_central_dir_offsets,
+ pZip->m_total_files, MZ_FALSE))
+ return MZ_FALSE;
+ }
+
+ if (pZip->m_pRead(pZip->m_pIO_opaque, cdir_ofs,
+ pZip->m_pState->m_central_dir.m_p,
+ cdir_size) != cdir_size)
+ return MZ_FALSE;
+
+ // Now create an index into the central directory file records, do some
+ // basic sanity checking on each record, and check for zip64 entries (which
+ // are not yet supported).
+ p = (const mz_uint8 *)pZip->m_pState->m_central_dir.m_p;
+ for (n = cdir_size, i = 0; i < pZip->m_total_files; ++i) {
+ mz_uint total_header_size, comp_size, decomp_size, disk_index;
+ if ((n < MZ_ZIP_CENTRAL_DIR_HEADER_SIZE) ||
+ (MZ_READ_LE32(p) != MZ_ZIP_CENTRAL_DIR_HEADER_SIG))
+ return MZ_FALSE;
+ MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir_offsets, mz_uint32,
+ i) =
+ (mz_uint32)(p - (const mz_uint8 *)pZip->m_pState->m_central_dir.m_p);
+ if (sort_central_dir)
+ MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_sorted_central_dir_offsets,
+ mz_uint32, i) = i;
+ comp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS);
+ decomp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS);
+ if (((!MZ_READ_LE32(p + MZ_ZIP_CDH_METHOD_OFS)) &&
+ (decomp_size != comp_size)) ||
+ (decomp_size && !comp_size) || (decomp_size == 0xFFFFFFFF) ||
+ (comp_size == 0xFFFFFFFF))
+ return MZ_FALSE;
+ disk_index = MZ_READ_LE16(p + MZ_ZIP_CDH_DISK_START_OFS);
+ if ((disk_index != num_this_disk) && (disk_index != 1))
+ return MZ_FALSE;
+ if (((mz_uint64)MZ_READ_LE32(p + MZ_ZIP_CDH_LOCAL_HEADER_OFS) +
+ MZ_ZIP_LOCAL_DIR_HEADER_SIZE + comp_size) > pZip->m_archive_size)
+ return MZ_FALSE;
+ if ((total_header_size = MZ_ZIP_CENTRAL_DIR_HEADER_SIZE +
+ MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS) +
+ MZ_READ_LE16(p + MZ_ZIP_CDH_EXTRA_LEN_OFS) +
+ MZ_READ_LE16(p + MZ_ZIP_CDH_COMMENT_LEN_OFS)) >
+ n)
+ return MZ_FALSE;
+ n -= total_header_size;
+ p += total_header_size;
+ }
+ }
+
+ if (sort_central_dir)
+ mz_zip_reader_sort_central_dir_offsets_by_filename(pZip);
+
+ return MZ_TRUE;
+}
+
+mz_bool mz_zip_reader_init(mz_zip_archive *pZip, mz_uint64 size,
+ mz_uint32 flags) {
+ if ((!pZip) || (!pZip->m_pRead))
+ return MZ_FALSE;
+ if (!mz_zip_reader_init_internal(pZip, flags))
+ return MZ_FALSE;
+ pZip->m_archive_size = size;
+ if (!mz_zip_reader_read_central_dir(pZip, flags)) {
+ mz_zip_reader_end(pZip);
+ return MZ_FALSE;
+ }
+ return MZ_TRUE;
+}
+
+static size_t mz_zip_mem_read_func(void *pOpaque, mz_uint64 file_ofs,
+ void *pBuf, size_t n) {
+ mz_zip_archive *pZip = (mz_zip_archive *)pOpaque;
+ size_t s = (file_ofs >= pZip->m_archive_size)
+ ? 0
+ : (size_t)MZ_MIN(pZip->m_archive_size - file_ofs, n);
+ memcpy(pBuf, (const mz_uint8 *)pZip->m_pState->m_pMem + file_ofs, s);
+ return s;
+}
+
+mz_bool mz_zip_reader_init_mem(mz_zip_archive *pZip, const void *pMem,
+ size_t size, mz_uint32 flags) {
+ if (!mz_zip_reader_init_internal(pZip, flags))
+ return MZ_FALSE;
+ pZip->m_archive_size = size;
+ pZip->m_pRead = mz_zip_mem_read_func;
+ pZip->m_pIO_opaque = pZip;
+#ifdef __cplusplus
+ pZip->m_pState->m_pMem = const_cast<void *>(pMem);
+#else
+ pZip->m_pState->m_pMem = (void *)pMem;
+#endif
+ pZip->m_pState->m_mem_size = size;
+ if (!mz_zip_reader_read_central_dir(pZip, flags)) {
+ mz_zip_reader_end(pZip);
+ return MZ_FALSE;
+ }
+ return MZ_TRUE;
+}
+
+#ifndef MINIZ_NO_STDIO
+static size_t mz_zip_file_read_func(void *pOpaque, mz_uint64 file_ofs,
+ void *pBuf, size_t n) {
+ mz_zip_archive *pZip = (mz_zip_archive *)pOpaque;
+ mz_int64 cur_ofs = MZ_FTELL64(pZip->m_pState->m_pFile);
+ if (((mz_int64)file_ofs < 0) ||
+ (((cur_ofs != (mz_int64)file_ofs)) &&
+ (MZ_FSEEK64(pZip->m_pState->m_pFile, (mz_int64)file_ofs, SEEK_SET))))
+ return 0;
+ return MZ_FREAD(pBuf, 1, n, pZip->m_pState->m_pFile);
+}
+
+mz_bool mz_zip_reader_init_file(mz_zip_archive *pZip, const char *pFilename,
+ mz_uint32 flags) {
+ mz_uint64 file_size;
+ MZ_FILE *pFile = MZ_FOPEN(pFilename, "rb");
+ if (!pFile)
+ return MZ_FALSE;
+ if (MZ_FSEEK64(pFile, 0, SEEK_END)) {
+ MZ_FCLOSE(pFile);
+ return MZ_FALSE;
+ }
+ file_size = MZ_FTELL64(pFile);
+ if (!mz_zip_reader_init_internal(pZip, flags)) {
+ MZ_FCLOSE(pFile);
+ return MZ_FALSE;
+ }
+ pZip->m_pRead = mz_zip_file_read_func;
+ pZip->m_pIO_opaque = pZip;
+ pZip->m_pState->m_pFile = pFile;
+ pZip->m_archive_size = file_size;
+ if (!mz_zip_reader_read_central_dir(pZip, flags)) {
+ mz_zip_reader_end(pZip);
+ return MZ_FALSE;
+ }
+ return MZ_TRUE;
+}
+#endif // #ifndef MINIZ_NO_STDIO
+
+mz_uint mz_zip_reader_get_num_files(mz_zip_archive *pZip) {
+ return pZip ? pZip->m_total_files : 0;
+}
+
+static MZ_FORCEINLINE const mz_uint8 *
+mz_zip_reader_get_cdh(mz_zip_archive *pZip, mz_uint file_index) {
+ if ((!pZip) || (!pZip->m_pState) || (file_index >= pZip->m_total_files) ||
+ (pZip->m_zip_mode != MZ_ZIP_MODE_READING))
+ return NULL;
+ return &MZ_ZIP_ARRAY_ELEMENT(
+ &pZip->m_pState->m_central_dir, mz_uint8,
+ MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir_offsets,
+ mz_uint32, file_index));
+}
+
+mz_bool mz_zip_reader_is_file_encrypted(mz_zip_archive *pZip,
+ mz_uint file_index) {
+ mz_uint m_bit_flag;
+ const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index);
+ if (!p)
+ return MZ_FALSE;
+ m_bit_flag = MZ_READ_LE16(p + MZ_ZIP_CDH_BIT_FLAG_OFS);
+ return (m_bit_flag & 1);
+}
+
+mz_bool mz_zip_reader_is_file_a_directory(mz_zip_archive *pZip,
+ mz_uint file_index) {
+ mz_uint filename_len, external_attr;
+ const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index);
+ if (!p)
+ return MZ_FALSE;
+
+ // First see if the filename ends with a '/' character.
+ filename_len = MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS);
+ if (filename_len) {
+ if (*(p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + filename_len - 1) == '/')
+ return MZ_TRUE;
+ }
+
+ // Bugfix: This code was also checking if the internal attribute was non-zero,
+ // which wasn't correct.
+ // Most/all zip writers (hopefully) set DOS file/directory attributes in the
+ // low 16-bits, so check for the DOS directory flag and ignore the source OS
+ // ID in the created by field.
+ // FIXME: Remove this check? Is it necessary - we already check the filename.
+ external_attr = MZ_READ_LE32(p + MZ_ZIP_CDH_EXTERNAL_ATTR_OFS);
+ if ((external_attr & 0x10) != 0)
+ return MZ_TRUE;
+
+ return MZ_FALSE;
+}
+
+mz_bool mz_zip_reader_file_stat(mz_zip_archive *pZip, mz_uint file_index,
+ mz_zip_archive_file_stat *pStat) {
+ mz_uint n;
+ const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index);
+ if ((!p) || (!pStat))
+ return MZ_FALSE;
+
+ // Unpack the central directory record.
+ pStat->m_file_index = file_index;
+ pStat->m_central_dir_ofs = MZ_ZIP_ARRAY_ELEMENT(
+ &pZip->m_pState->m_central_dir_offsets, mz_uint32, file_index);
+ pStat->m_version_made_by = MZ_READ_LE16(p + MZ_ZIP_CDH_VERSION_MADE_BY_OFS);
+ pStat->m_version_needed = MZ_READ_LE16(p + MZ_ZIP_CDH_VERSION_NEEDED_OFS);
+ pStat->m_bit_flag = MZ_READ_LE16(p + MZ_ZIP_CDH_BIT_FLAG_OFS);
+ pStat->m_method = MZ_READ_LE16(p + MZ_ZIP_CDH_METHOD_OFS);
+#ifndef MINIZ_NO_TIME
+ pStat->m_time =
+ mz_zip_dos_to_time_t(MZ_READ_LE16(p + MZ_ZIP_CDH_FILE_TIME_OFS),
+ MZ_READ_LE16(p + MZ_ZIP_CDH_FILE_DATE_OFS));
+#endif
+ pStat->m_crc32 = MZ_READ_LE32(p + MZ_ZIP_CDH_CRC32_OFS);
+ pStat->m_comp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS);
+ pStat->m_uncomp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS);
+ pStat->m_internal_attr = MZ_READ_LE16(p + MZ_ZIP_CDH_INTERNAL_ATTR_OFS);
+ pStat->m_external_attr = MZ_READ_LE32(p + MZ_ZIP_CDH_EXTERNAL_ATTR_OFS);
+ pStat->m_local_header_ofs = MZ_READ_LE32(p + MZ_ZIP_CDH_LOCAL_HEADER_OFS);
+
+ // Copy as much of the filename and comment as possible.
+ n = MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS);
+ n = MZ_MIN(n, MZ_ZIP_MAX_ARCHIVE_FILENAME_SIZE - 1);
+ memcpy(pStat->m_filename, p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE, n);
+ pStat->m_filename[n] = '\0';
+
+ n = MZ_READ_LE16(p + MZ_ZIP_CDH_COMMENT_LEN_OFS);
+ n = MZ_MIN(n, MZ_ZIP_MAX_ARCHIVE_FILE_COMMENT_SIZE - 1);
+ pStat->m_comment_size = n;
+ memcpy(pStat->m_comment, p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE +
+ MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS) +
+ MZ_READ_LE16(p + MZ_ZIP_CDH_EXTRA_LEN_OFS),
+ n);
+ pStat->m_comment[n] = '\0';
+
+ return MZ_TRUE;
+}
+
+mz_uint mz_zip_reader_get_filename(mz_zip_archive *pZip, mz_uint file_index,
+ char *pFilename, mz_uint filename_buf_size) {
+ mz_uint n;
+ const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index);
+ if (!p) {
+ if (filename_buf_size)
+ pFilename[0] = '\0';
+ return 0;
+ }
+ n = MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS);
+ if (filename_buf_size) {
+ n = MZ_MIN(n, filename_buf_size - 1);
+ memcpy(pFilename, p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE, n);
+ pFilename[n] = '\0';
+ }
+ return n + 1;
+}
+
+static MZ_FORCEINLINE mz_bool
+mz_zip_reader_string_equal(const char *pA, const char *pB, mz_uint len,
+ mz_uint flags) {
+ mz_uint i;
+ if (flags & MZ_ZIP_FLAG_CASE_SENSITIVE)
+ return 0 == memcmp(pA, pB, len);
+ for (i = 0; i < len; ++i)
+ if (MZ_TOLOWER(pA[i]) != MZ_TOLOWER(pB[i]))
+ return MZ_FALSE;
+ return MZ_TRUE;
+}
+
+static MZ_FORCEINLINE int
+mz_zip_reader_filename_compare(const mz_zip_array *pCentral_dir_array,
+ const mz_zip_array *pCentral_dir_offsets,
+ mz_uint l_index, const char *pR, mz_uint r_len) {
+ const mz_uint8 *pL = &MZ_ZIP_ARRAY_ELEMENT(
+ pCentral_dir_array, mz_uint8,
+ MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_offsets, mz_uint32,
+ l_index)),
+ *pE;
+ mz_uint l_len = MZ_READ_LE16(pL + MZ_ZIP_CDH_FILENAME_LEN_OFS);
+ mz_uint8 l = 0, r = 0;
+ pL += MZ_ZIP_CENTRAL_DIR_HEADER_SIZE;
+ pE = pL + MZ_MIN(l_len, r_len);
+ while (pL < pE) {
+ if ((l = MZ_TOLOWER(*pL)) != (r = MZ_TOLOWER(*pR)))
+ break;
+ pL++;
+ pR++;
+ }
+ return (pL == pE) ? (int)(l_len - r_len) : (l - r);
+}
+
+static int mz_zip_reader_locate_file_binary_search(mz_zip_archive *pZip,
+ const char *pFilename) {
+ mz_zip_internal_state *pState = pZip->m_pState;
+ const mz_zip_array *pCentral_dir_offsets = &pState->m_central_dir_offsets;
+ const mz_zip_array *pCentral_dir = &pState->m_central_dir;
+ mz_uint32 *pIndices =
+ &MZ_ZIP_ARRAY_ELEMENT(&pState->m_sorted_central_dir_offsets, mz_uint32,
+ 0);
+ const int size = pZip->m_total_files;
+ const mz_uint filename_len = (mz_uint)strlen(pFilename);
+ int l = 0, h = size - 1;
+ while (l <= h) {
+ int m = (l + h) >> 1, file_index = pIndices[m],
+ comp =
+ mz_zip_reader_filename_compare(pCentral_dir, pCentral_dir_offsets,
+ file_index, pFilename, filename_len);
+ if (!comp)
+ return file_index;
+ else if (comp < 0)
+ l = m + 1;
+ else
+ h = m - 1;
+ }
+ return -1;
+}
+
+int mz_zip_reader_locate_file(mz_zip_archive *pZip, const char *pName,
+ const char *pComment, mz_uint flags) {
+ mz_uint file_index;
+ size_t name_len, comment_len;
+ if ((!pZip) || (!pZip->m_pState) || (!pName) ||
+ (pZip->m_zip_mode != MZ_ZIP_MODE_READING))
+ return -1;
+ if (((flags & (MZ_ZIP_FLAG_IGNORE_PATH | MZ_ZIP_FLAG_CASE_SENSITIVE)) == 0) &&
+ (!pComment) && (pZip->m_pState->m_sorted_central_dir_offsets.m_size))
+ return mz_zip_reader_locate_file_binary_search(pZip, pName);
+ name_len = strlen(pName);
+ if (name_len > 0xFFFF)
+ return -1;
+ comment_len = pComment ? strlen(pComment) : 0;
+ if (comment_len > 0xFFFF)
+ return -1;
+ for (file_index = 0; file_index < pZip->m_total_files; file_index++) {
+ const mz_uint8 *pHeader =
+ &MZ_ZIP_ARRAY_ELEMENT(
+ &pZip->m_pState->m_central_dir, mz_uint8,
+ MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir_offsets,
+ mz_uint32, file_index));
+ mz_uint filename_len = MZ_READ_LE16(pHeader + MZ_ZIP_CDH_FILENAME_LEN_OFS);
+ const char *pFilename =
+ (const char *)pHeader + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE;
+ if (filename_len < name_len)
+ continue;
+ if (comment_len) {
+ mz_uint file_extra_len = MZ_READ_LE16(pHeader + MZ_ZIP_CDH_EXTRA_LEN_OFS),
+ file_comment_len =
+ MZ_READ_LE16(pHeader + MZ_ZIP_CDH_COMMENT_LEN_OFS);
+ const char *pFile_comment = pFilename + filename_len + file_extra_len;
+ if ((file_comment_len != comment_len) ||
+ (!mz_zip_reader_string_equal(pComment, pFile_comment,
+ file_comment_len, flags)))
+ continue;
+ }
+ if ((flags & MZ_ZIP_FLAG_IGNORE_PATH) && (filename_len)) {
+ int ofs = filename_len - 1;
+ do {
+ if ((pFilename[ofs] == '/') || (pFilename[ofs] == '\\') ||
+ (pFilename[ofs] == ':'))
+ break;
+ } while (--ofs >= 0);
+ ofs++;
+ pFilename += ofs;
+ filename_len -= ofs;
+ }
+ if ((filename_len == name_len) &&
+ (mz_zip_reader_string_equal(pName, pFilename, filename_len, flags)))
+ return file_index;
+ }
+ return -1;
+}
+
+mz_bool mz_zip_reader_extract_to_mem_no_alloc(mz_zip_archive *pZip,
+ mz_uint file_index, void *pBuf,
+ size_t buf_size, mz_uint flags,
+ void *pUser_read_buf,
+ size_t user_read_buf_size) {
+ int status = TINFL_STATUS_DONE;
+ mz_uint64 needed_size, cur_file_ofs, comp_remaining,
+ out_buf_ofs = 0, read_buf_size, read_buf_ofs = 0, read_buf_avail;
+ mz_zip_archive_file_stat file_stat;
+ void *pRead_buf;
+ mz_uint32
+ local_header_u32[(MZ_ZIP_LOCAL_DIR_HEADER_SIZE + sizeof(mz_uint32) - 1) /
+ sizeof(mz_uint32)];
+ mz_uint8 *pLocal_header = (mz_uint8 *)local_header_u32;
+ tinfl_decompressor inflator;
+
+ if ((buf_size) && (!pBuf))
+ return MZ_FALSE;
+
+ if (!mz_zip_reader_file_stat(pZip, file_index, &file_stat))
+ return MZ_FALSE;
+
+ // Empty file, or a directory (but not always a directory - I've seen odd zips
+ // with directories that have compressed data which inflates to 0 bytes)
+ if (!file_stat.m_comp_size)
+ return MZ_TRUE;
+
+ // Entry is a subdirectory (I've seen old zips with dir entries which have
+ // compressed deflate data which inflates to 0 bytes, but these entries claim
+ // to uncompress to 512 bytes in the headers).
+ // I'm torn how to handle this case - should it fail instead?
+ if (mz_zip_reader_is_file_a_directory(pZip, file_index))
+ return MZ_TRUE;
+
+ // Encryption and patch files are not supported.
+ if (file_stat.m_bit_flag & (1 | 32))
+ return MZ_FALSE;
+
+ // This function only supports stored and deflate.
+ if ((!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) && (file_stat.m_method != 0) &&
+ (file_stat.m_method != MZ_DEFLATED))
+ return MZ_FALSE;
+
+ // Ensure supplied output buffer is large enough.
+ needed_size = (flags & MZ_ZIP_FLAG_COMPRESSED_DATA) ? file_stat.m_comp_size
+ : file_stat.m_uncomp_size;
+ if (buf_size < needed_size)
+ return MZ_FALSE;
+
+ // Read and parse the local directory entry.
+ cur_file_ofs = file_stat.m_local_header_ofs;
+ if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pLocal_header,
+ MZ_ZIP_LOCAL_DIR_HEADER_SIZE) !=
+ MZ_ZIP_LOCAL_DIR_HEADER_SIZE)
+ return MZ_FALSE;
+ if (MZ_READ_LE32(pLocal_header) != MZ_ZIP_LOCAL_DIR_HEADER_SIG)
+ return MZ_FALSE;
+
+ cur_file_ofs += MZ_ZIP_LOCAL_DIR_HEADER_SIZE +
+ MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_FILENAME_LEN_OFS) +
+ MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_EXTRA_LEN_OFS);
+ if ((cur_file_ofs + file_stat.m_comp_size) > pZip->m_archive_size)
+ return MZ_FALSE;
+
+ if ((flags & MZ_ZIP_FLAG_COMPRESSED_DATA) || (!file_stat.m_method)) {
+ // The file is stored or the caller has requested the compressed data.
+ if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pBuf,
+ (size_t)needed_size) != needed_size)
+ return MZ_FALSE;
+ return ((flags & MZ_ZIP_FLAG_COMPRESSED_DATA) != 0) ||
+ (mz_crc32(MZ_CRC32_INIT, (const mz_uint8 *)pBuf,
+ (size_t)file_stat.m_uncomp_size) == file_stat.m_crc32);
+ }
+
+ // Decompress the file either directly from memory or from a file input
+ // buffer.
+ tinfl_init(&inflator);
+
+ if (pZip->m_pState->m_pMem) {
+ // Read directly from the archive in memory.
+ pRead_buf = (mz_uint8 *)pZip->m_pState->m_pMem + cur_file_ofs;
+ read_buf_size = read_buf_avail = file_stat.m_comp_size;
+ comp_remaining = 0;
+ } else if (pUser_read_buf) {
+ // Use a user provided read buffer.
+ if (!user_read_buf_size)
+ return MZ_FALSE;
+ pRead_buf = (mz_uint8 *)pUser_read_buf;
+ read_buf_size = user_read_buf_size;
+ read_buf_avail = 0;
+ comp_remaining = file_stat.m_comp_size;
+ } else {
+ // Temporarily allocate a read buffer.
+ read_buf_size = MZ_MIN(file_stat.m_comp_size, (mz_uint)MZ_ZIP_MAX_IO_BUF_SIZE);
+#ifdef _MSC_VER
+ if (((0, sizeof(size_t) == sizeof(mz_uint32))) &&
+ (read_buf_size > 0x7FFFFFFF))
+#else
+ if (((sizeof(size_t) == sizeof(mz_uint32))) && (read_buf_size > 0x7FFFFFFF))
+#endif
+ return MZ_FALSE;
+ if (NULL == (pRead_buf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1,
+ (size_t)read_buf_size)))
+ return MZ_FALSE;
+ read_buf_avail = 0;
+ comp_remaining = file_stat.m_comp_size;
+ }
+
+ do {
+ size_t in_buf_size,
+ out_buf_size = (size_t)(file_stat.m_uncomp_size - out_buf_ofs);
+ if ((!read_buf_avail) && (!pZip->m_pState->m_pMem)) {
+ read_buf_avail = MZ_MIN(read_buf_size, comp_remaining);
+ if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pRead_buf,
+ (size_t)read_buf_avail) != read_buf_avail) {
+ status = TINFL_STATUS_FAILED;
+ break;
+ }
+ cur_file_ofs += read_buf_avail;
+ comp_remaining -= read_buf_avail;
+ read_buf_ofs = 0;
+ }
+ in_buf_size = (size_t)read_buf_avail;
+ status = tinfl_decompress(
+ &inflator, (mz_uint8 *)pRead_buf + read_buf_ofs, &in_buf_size,
+ (mz_uint8 *)pBuf, (mz_uint8 *)pBuf + out_buf_ofs, &out_buf_size,
+ TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF |
+ (comp_remaining ? TINFL_FLAG_HAS_MORE_INPUT : 0));
+ read_buf_avail -= in_buf_size;
+ read_buf_ofs += in_buf_size;
+ out_buf_ofs += out_buf_size;
+ } while (status == TINFL_STATUS_NEEDS_MORE_INPUT);
+
+ if (status == TINFL_STATUS_DONE) {
+ // Make sure the entire file was decompressed, and check its CRC.
+ if ((out_buf_ofs != file_stat.m_uncomp_size) ||
+ (mz_crc32(MZ_CRC32_INIT, (const mz_uint8 *)pBuf,
+ (size_t)file_stat.m_uncomp_size) != file_stat.m_crc32))
+ status = TINFL_STATUS_FAILED;
+ }
+
+ if ((!pZip->m_pState->m_pMem) && (!pUser_read_buf))
+ pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf);
+
+ return status == TINFL_STATUS_DONE;
+}
+
+mz_bool mz_zip_reader_extract_file_to_mem_no_alloc(
+ mz_zip_archive *pZip, const char *pFilename, void *pBuf, size_t buf_size,
+ mz_uint flags, void *pUser_read_buf, size_t user_read_buf_size) {
+ int file_index = mz_zip_reader_locate_file(pZip, pFilename, NULL, flags);
+ if (file_index < 0)
+ return MZ_FALSE;
+ return mz_zip_reader_extract_to_mem_no_alloc(pZip, file_index, pBuf, buf_size,
+ flags, pUser_read_buf,
+ user_read_buf_size);
+}
+
+mz_bool mz_zip_reader_extract_to_mem(mz_zip_archive *pZip, mz_uint file_index,
+ void *pBuf, size_t buf_size,
+ mz_uint flags) {
+ return mz_zip_reader_extract_to_mem_no_alloc(pZip, file_index, pBuf, buf_size,
+ flags, NULL, 0);
+}
+
+mz_bool mz_zip_reader_extract_file_to_mem(mz_zip_archive *pZip,
+ const char *pFilename, void *pBuf,
+ size_t buf_size, mz_uint flags) {
+ return mz_zip_reader_extract_file_to_mem_no_alloc(pZip, pFilename, pBuf,
+ buf_size, flags, NULL, 0);
+}
+
+void *mz_zip_reader_extract_to_heap(mz_zip_archive *pZip, mz_uint file_index,
+ size_t *pSize, mz_uint flags) {
+ mz_uint64 comp_size, uncomp_size, alloc_size;
+ const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index);
+ void *pBuf;
+
+ if (pSize)
+ *pSize = 0;
+ if (!p)
+ return NULL;
+
+ comp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS);
+ uncomp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS);
+
+ alloc_size = (flags & MZ_ZIP_FLAG_COMPRESSED_DATA) ? comp_size : uncomp_size;
+#ifdef _MSC_VER
+ if (((0, sizeof(size_t) == sizeof(mz_uint32))) && (alloc_size > 0x7FFFFFFF))
+#else
+ if (((sizeof(size_t) == sizeof(mz_uint32))) && (alloc_size > 0x7FFFFFFF))
+#endif
+ return NULL;
+ if (NULL ==
+ (pBuf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, (size_t)alloc_size)))
+ return NULL;
+
+ if (!mz_zip_reader_extract_to_mem(pZip, file_index, pBuf, (size_t)alloc_size,
+ flags)) {
+ pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf);
+ return NULL;
+ }
+
+ if (pSize)
+ *pSize = (size_t)alloc_size;
+ return pBuf;
+}
+
+void *mz_zip_reader_extract_file_to_heap(mz_zip_archive *pZip,
+ const char *pFilename, size_t *pSize,
+ mz_uint flags) {
+ int file_index = mz_zip_reader_locate_file(pZip, pFilename, NULL, flags);
+ if (file_index < 0) {
+ if (pSize)
+ *pSize = 0;
+ return MZ_FALSE;
+ }
+ return mz_zip_reader_extract_to_heap(pZip, file_index, pSize, flags);
+}
+
+mz_bool mz_zip_reader_extract_to_callback(mz_zip_archive *pZip,
+ mz_uint file_index,
+ mz_file_write_func pCallback,
+ void *pOpaque, mz_uint flags) {
+ int status = TINFL_STATUS_DONE;
+ mz_uint file_crc32 = MZ_CRC32_INIT;
+ mz_uint64 read_buf_size, read_buf_ofs = 0, read_buf_avail, comp_remaining,
+ out_buf_ofs = 0, cur_file_ofs;
+ mz_zip_archive_file_stat file_stat;
+ void *pRead_buf = NULL;
+ void *pWrite_buf = NULL;
+ mz_uint32
+ local_header_u32[(MZ_ZIP_LOCAL_DIR_HEADER_SIZE + sizeof(mz_uint32) - 1) /
+ sizeof(mz_uint32)];
+ mz_uint8 *pLocal_header = (mz_uint8 *)local_header_u32;
+
+ if (!mz_zip_reader_file_stat(pZip, file_index, &file_stat))
+ return MZ_FALSE;
+
+ // Empty file, or a directory (but not always a directory - I've seen odd zips
+ // with directories that have compressed data which inflates to 0 bytes)
+ if (!file_stat.m_comp_size)
+ return MZ_TRUE;
+
+ // Entry is a subdirectory (I've seen old zips with dir entries which have
+ // compressed deflate data which inflates to 0 bytes, but these entries claim
+ // to uncompress to 512 bytes in the headers).
+ // I'm torn how to handle this case - should it fail instead?
+ if (mz_zip_reader_is_file_a_directory(pZip, file_index))
+ return MZ_TRUE;
+
+ // Encryption and patch files are not supported.
+ if (file_stat.m_bit_flag & (1 | 32))
+ return MZ_FALSE;
+
+ // This function only supports stored and deflate.
+ if ((!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) && (file_stat.m_method != 0) &&
+ (file_stat.m_method != MZ_DEFLATED))
+ return MZ_FALSE;
+
+ // Read and parse the local directory entry.
+ cur_file_ofs = file_stat.m_local_header_ofs;
+ if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pLocal_header,
+ MZ_ZIP_LOCAL_DIR_HEADER_SIZE) !=
+ MZ_ZIP_LOCAL_DIR_HEADER_SIZE)
+ return MZ_FALSE;
+ if (MZ_READ_LE32(pLocal_header) != MZ_ZIP_LOCAL_DIR_HEADER_SIG)
+ return MZ_FALSE;
+
+ cur_file_ofs += MZ_ZIP_LOCAL_DIR_HEADER_SIZE +
+ MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_FILENAME_LEN_OFS) +
+ MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_EXTRA_LEN_OFS);
+ if ((cur_file_ofs + file_stat.m_comp_size) > pZip->m_archive_size)
+ return MZ_FALSE;
+
+ // Decompress the file either directly from memory or from a file input
+ // buffer.
+ if (pZip->m_pState->m_pMem) {
+ pRead_buf = (mz_uint8 *)pZip->m_pState->m_pMem + cur_file_ofs;
+ read_buf_size = read_buf_avail = file_stat.m_comp_size;
+ comp_remaining = 0;
+ } else {
+ read_buf_size = MZ_MIN(file_stat.m_comp_size, (mz_uint)MZ_ZIP_MAX_IO_BUF_SIZE);
+ if (NULL == (pRead_buf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1,
+ (size_t)read_buf_size)))
+ return MZ_FALSE;
+ read_buf_avail = 0;
+ comp_remaining = file_stat.m_comp_size;
+ }
+
+ if ((flags & MZ_ZIP_FLAG_COMPRESSED_DATA) || (!file_stat.m_method)) {
+ // The file is stored or the caller has requested the compressed data.
+ if (pZip->m_pState->m_pMem) {
+#ifdef _MSC_VER
+ if (((0, sizeof(size_t) == sizeof(mz_uint32))) &&
+ (file_stat.m_comp_size > 0xFFFFFFFF))
+#else
+ if (((sizeof(size_t) == sizeof(mz_uint32))) &&
+ (file_stat.m_comp_size > 0xFFFFFFFF))
+#endif
+ return MZ_FALSE;
+ if (pCallback(pOpaque, out_buf_ofs, pRead_buf,
+ (size_t)file_stat.m_comp_size) != file_stat.m_comp_size)
+ status = TINFL_STATUS_FAILED;
+ else if (!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA))
+ file_crc32 =
+ (mz_uint32)mz_crc32(file_crc32, (const mz_uint8 *)pRead_buf,
+ (size_t)file_stat.m_comp_size);
+ cur_file_ofs += file_stat.m_comp_size;
+ out_buf_ofs += file_stat.m_comp_size;
+ comp_remaining = 0;
+ } else {
+ while (comp_remaining) {
+ read_buf_avail = MZ_MIN(read_buf_size, comp_remaining);
+ if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pRead_buf,
+ (size_t)read_buf_avail) != read_buf_avail) {
+ status = TINFL_STATUS_FAILED;
+ break;
+ }
+
+ if (!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA))
+ file_crc32 = (mz_uint32)mz_crc32(
+ file_crc32, (const mz_uint8 *)pRead_buf, (size_t)read_buf_avail);
+
+ if (pCallback(pOpaque, out_buf_ofs, pRead_buf,
+ (size_t)read_buf_avail) != read_buf_avail) {
+ status = TINFL_STATUS_FAILED;
+ break;
+ }
+ cur_file_ofs += read_buf_avail;
+ out_buf_ofs += read_buf_avail;
+ comp_remaining -= read_buf_avail;
+ }
+ }
+ } else {
+ tinfl_decompressor inflator;
+ tinfl_init(&inflator);
+
+ if (NULL == (pWrite_buf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1,
+ TINFL_LZ_DICT_SIZE)))
+ status = TINFL_STATUS_FAILED;
+ else {
+ do {
+ mz_uint8 *pWrite_buf_cur =
+ (mz_uint8 *)pWrite_buf + (out_buf_ofs & (TINFL_LZ_DICT_SIZE - 1));
+ size_t in_buf_size,
+ out_buf_size =
+ TINFL_LZ_DICT_SIZE - (out_buf_ofs & (TINFL_LZ_DICT_SIZE - 1));
+ if ((!read_buf_avail) && (!pZip->m_pState->m_pMem)) {
+ read_buf_avail = MZ_MIN(read_buf_size, comp_remaining);
+ if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pRead_buf,
+ (size_t)read_buf_avail) != read_buf_avail) {
+ status = TINFL_STATUS_FAILED;
+ break;
+ }
+ cur_file_ofs += read_buf_avail;
+ comp_remaining -= read_buf_avail;
+ read_buf_ofs = 0;
+ }
+
+ in_buf_size = (size_t)read_buf_avail;
+ status = tinfl_decompress(
+ &inflator, (const mz_uint8 *)pRead_buf + read_buf_ofs, &in_buf_size,
+ (mz_uint8 *)pWrite_buf, pWrite_buf_cur, &out_buf_size,
+ comp_remaining ? TINFL_FLAG_HAS_MORE_INPUT : 0);
+ read_buf_avail -= in_buf_size;
+ read_buf_ofs += in_buf_size;
+
+ if (out_buf_size) {
+ if (pCallback(pOpaque, out_buf_ofs, pWrite_buf_cur, out_buf_size) !=
+ out_buf_size) {
+ status = TINFL_STATUS_FAILED;
+ break;
+ }
+ file_crc32 =
+ (mz_uint32)mz_crc32(file_crc32, pWrite_buf_cur, out_buf_size);
+ if ((out_buf_ofs += out_buf_size) > file_stat.m_uncomp_size) {
+ status = TINFL_STATUS_FAILED;
+ break;
+ }
+ }
+ } while ((status == TINFL_STATUS_NEEDS_MORE_INPUT) ||
+ (status == TINFL_STATUS_HAS_MORE_OUTPUT));
+ }
+ }
+
+ if ((status == TINFL_STATUS_DONE) &&
+ (!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA))) {
+ // Make sure the entire file was decompressed, and check its CRC.
+ if ((out_buf_ofs != file_stat.m_uncomp_size) ||
+ (file_crc32 != file_stat.m_crc32))
+ status = TINFL_STATUS_FAILED;
+ }
+
+ if (!pZip->m_pState->m_pMem)
+ pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf);
+ if (pWrite_buf)
+ pZip->m_pFree(pZip->m_pAlloc_opaque, pWrite_buf);
+
+ return status == TINFL_STATUS_DONE;
+}
+
+mz_bool mz_zip_reader_extract_file_to_callback(mz_zip_archive *pZip,
+ const char *pFilename,
+ mz_file_write_func pCallback,
+ void *pOpaque, mz_uint flags) {
+ int file_index = mz_zip_reader_locate_file(pZip, pFilename, NULL, flags);
+ if (file_index < 0)
+ return MZ_FALSE;
+ return mz_zip_reader_extract_to_callback(pZip, file_index, pCallback, pOpaque,
+ flags);
+}
+
+#ifndef MINIZ_NO_STDIO
+static size_t mz_zip_file_write_callback(void *pOpaque, mz_uint64 ofs,
+ const void *pBuf, size_t n) {
+ (void)ofs;
+ return MZ_FWRITE(pBuf, 1, n, (MZ_FILE *)pOpaque);
+}
+
+mz_bool mz_zip_reader_extract_to_file(mz_zip_archive *pZip, mz_uint file_index,
+ const char *pDst_filename,
+ mz_uint flags) {
+ mz_bool status;
+ mz_zip_archive_file_stat file_stat;
+ MZ_FILE *pFile;
+ if (!mz_zip_reader_file_stat(pZip, file_index, &file_stat))
+ return MZ_FALSE;
+ pFile = MZ_FOPEN(pDst_filename, "wb");
+ if (!pFile)
+ return MZ_FALSE;
+ status = mz_zip_reader_extract_to_callback(
+ pZip, file_index, mz_zip_file_write_callback, pFile, flags);
+ if (MZ_FCLOSE(pFile) == EOF)
+ return MZ_FALSE;
+#ifndef MINIZ_NO_TIME
+ if (status)
+ mz_zip_set_file_times(pDst_filename, file_stat.m_time, file_stat.m_time);
+#endif
+ return status;
+}
+#endif // #ifndef MINIZ_NO_STDIO
+
+mz_bool mz_zip_reader_end(mz_zip_archive *pZip) {
+ if ((!pZip) || (!pZip->m_pState) || (!pZip->m_pAlloc) || (!pZip->m_pFree) ||
+ (pZip->m_zip_mode != MZ_ZIP_MODE_READING))
+ return MZ_FALSE;
+
+ if (pZip->m_pState) {
+ mz_zip_internal_state *pState = pZip->m_pState;
+ pZip->m_pState = NULL;
+ mz_zip_array_clear(pZip, &pState->m_central_dir);
+ mz_zip_array_clear(pZip, &pState->m_central_dir_offsets);
+ mz_zip_array_clear(pZip, &pState->m_sorted_central_dir_offsets);
+
+#ifndef MINIZ_NO_STDIO
+ if (pState->m_pFile) {
+ MZ_FCLOSE(pState->m_pFile);
+ pState->m_pFile = NULL;
+ }
+#endif // #ifndef MINIZ_NO_STDIO
+
+ pZip->m_pFree(pZip->m_pAlloc_opaque, pState);
+ }
+ pZip->m_zip_mode = MZ_ZIP_MODE_INVALID;
+
+ return MZ_TRUE;
+}
+
+#ifndef MINIZ_NO_STDIO
+mz_bool mz_zip_reader_extract_file_to_file(mz_zip_archive *pZip,
+ const char *pArchive_filename,
+ const char *pDst_filename,
+ mz_uint flags) {
+ int file_index =
+ mz_zip_reader_locate_file(pZip, pArchive_filename, NULL, flags);
+ if (file_index < 0)
+ return MZ_FALSE;
+ return mz_zip_reader_extract_to_file(pZip, file_index, pDst_filename, flags);
+}
+#endif
+
+// ------------------- .ZIP archive writing
+
+#ifndef MINIZ_NO_ARCHIVE_WRITING_APIS
+
+static void mz_write_le16(mz_uint8 *p, mz_uint16 v) {
+ p[0] = (mz_uint8)v;
+ p[1] = (mz_uint8)(v >> 8);
+}
+static void mz_write_le32(mz_uint8 *p, mz_uint32 v) {
+ p[0] = (mz_uint8)v;
+ p[1] = (mz_uint8)(v >> 8);
+ p[2] = (mz_uint8)(v >> 16);
+ p[3] = (mz_uint8)(v >> 24);
+}
+#define MZ_WRITE_LE16(p, v) mz_write_le16((mz_uint8 *)(p), (mz_uint16)(v))
+#define MZ_WRITE_LE32(p, v) mz_write_le32((mz_uint8 *)(p), (mz_uint32)(v))
+
+mz_bool mz_zip_writer_init(mz_zip_archive *pZip, mz_uint64 existing_size) {
+ if ((!pZip) || (pZip->m_pState) || (!pZip->m_pWrite) ||
+ (pZip->m_zip_mode != MZ_ZIP_MODE_INVALID))
+ return MZ_FALSE;
+
+ if (pZip->m_file_offset_alignment) {
+ // Ensure user specified file offset alignment is a power of 2.
+ if (pZip->m_file_offset_alignment & (pZip->m_file_offset_alignment - 1))
+ return MZ_FALSE;
+ }
+
+ if (!pZip->m_pAlloc)
+ pZip->m_pAlloc = def_alloc_func;
+ if (!pZip->m_pFree)
+ pZip->m_pFree = def_free_func;
+ if (!pZip->m_pRealloc)
+ pZip->m_pRealloc = def_realloc_func;
+
+ pZip->m_zip_mode = MZ_ZIP_MODE_WRITING;
+ pZip->m_archive_size = existing_size;
+ pZip->m_central_directory_file_ofs = 0;
+ pZip->m_total_files = 0;
+
+ if (NULL == (pZip->m_pState = (mz_zip_internal_state *)pZip->m_pAlloc(
+ pZip->m_pAlloc_opaque, 1, sizeof(mz_zip_internal_state))))
+ return MZ_FALSE;
+ memset(pZip->m_pState, 0, sizeof(mz_zip_internal_state));
+ MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_central_dir,
+ sizeof(mz_uint8));
+ MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_central_dir_offsets,
+ sizeof(mz_uint32));
+ MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_sorted_central_dir_offsets,
+ sizeof(mz_uint32));
+ return MZ_TRUE;
+}
+
+static size_t mz_zip_heap_write_func(void *pOpaque, mz_uint64 file_ofs,
+ const void *pBuf, size_t n) {
+ mz_zip_archive *pZip = (mz_zip_archive *)pOpaque;
+ mz_zip_internal_state *pState = pZip->m_pState;
+ mz_uint64 new_size = MZ_MAX(file_ofs + n, pState->m_mem_size);
+#ifdef _MSC_VER
+ if ((!n) ||
+ ((0, sizeof(size_t) == sizeof(mz_uint32)) && (new_size > 0x7FFFFFFF)))
+#else
+ if ((!n) ||
+ ((sizeof(size_t) == sizeof(mz_uint32)) && (new_size > 0x7FFFFFFF)))
+#endif
+ return 0;
+ if (new_size > pState->m_mem_capacity) {
+ void *pNew_block;
+ size_t new_capacity = MZ_MAX(64, pState->m_mem_capacity);
+ while (new_capacity < new_size)
+ new_capacity *= 2;
+ if (NULL == (pNew_block = pZip->m_pRealloc(
+ pZip->m_pAlloc_opaque, pState->m_pMem, 1, new_capacity)))
+ return 0;
+ pState->m_pMem = pNew_block;
+ pState->m_mem_capacity = new_capacity;
+ }
+ memcpy((mz_uint8 *)pState->m_pMem + file_ofs, pBuf, n);
+ pState->m_mem_size = (size_t)new_size;
+ return n;
+}
+
+mz_bool mz_zip_writer_init_heap(mz_zip_archive *pZip,
+ size_t size_to_reserve_at_beginning,
+ size_t initial_allocation_size) {
+ pZip->m_pWrite = mz_zip_heap_write_func;
+ pZip->m_pIO_opaque = pZip;
+ if (!mz_zip_writer_init(pZip, size_to_reserve_at_beginning))
+ return MZ_FALSE;
+ if (0 != (initial_allocation_size = MZ_MAX(initial_allocation_size,
+ size_to_reserve_at_beginning))) {
+ if (NULL == (pZip->m_pState->m_pMem = pZip->m_pAlloc(
+ pZip->m_pAlloc_opaque, 1, initial_allocation_size))) {
+ mz_zip_writer_end(pZip);
+ return MZ_FALSE;
+ }
+ pZip->m_pState->m_mem_capacity = initial_allocation_size;
+ }
+ return MZ_TRUE;
+}
+
+#ifndef MINIZ_NO_STDIO
+static size_t mz_zip_file_write_func(void *pOpaque, mz_uint64 file_ofs,
+ const void *pBuf, size_t n) {
+ mz_zip_archive *pZip = (mz_zip_archive *)pOpaque;
+ mz_int64 cur_ofs = MZ_FTELL64(pZip->m_pState->m_pFile);
+ if (((mz_int64)file_ofs < 0) ||
+ (((cur_ofs != (mz_int64)file_ofs)) &&
+ (MZ_FSEEK64(pZip->m_pState->m_pFile, (mz_int64)file_ofs, SEEK_SET))))
+ return 0;
+ return MZ_FWRITE(pBuf, 1, n, pZip->m_pState->m_pFile);
+}
+
+mz_bool mz_zip_writer_init_file(mz_zip_archive *pZip, const char *pFilename,
+ mz_uint64 size_to_reserve_at_beginning) {
+ MZ_FILE *pFile;
+ pZip->m_pWrite = mz_zip_file_write_func;
+ pZip->m_pIO_opaque = pZip;
+ if (!mz_zip_writer_init(pZip, size_to_reserve_at_beginning))
+ return MZ_FALSE;
+ if (NULL == (pFile = MZ_FOPEN(pFilename, "wb"))) {
+ mz_zip_writer_end(pZip);
+ return MZ_FALSE;
+ }
+ pZip->m_pState->m_pFile = pFile;
+ if (size_to_reserve_at_beginning) {
+ mz_uint64 cur_ofs = 0;
+ char buf[4096];
+ MZ_CLEAR_OBJ(buf);
+ do {
+ size_t n = (size_t)MZ_MIN(sizeof(buf), size_to_reserve_at_beginning);
+ if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_ofs, buf, n) != n) {
+ mz_zip_writer_end(pZip);
+ return MZ_FALSE;
+ }
+ cur_ofs += n;
+ size_to_reserve_at_beginning -= n;
+ } while (size_to_reserve_at_beginning);
+ }
+ return MZ_TRUE;
+}
+#endif // #ifndef MINIZ_NO_STDIO
+
+mz_bool mz_zip_writer_init_from_reader(mz_zip_archive *pZip,
+ const char *pFilename) {
+ mz_zip_internal_state *pState;
+ if ((!pZip) || (!pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_READING))
+ return MZ_FALSE;
+ // No sense in trying to write to an archive that's already at the support max
+ // size
+ if ((pZip->m_total_files == 0xFFFF) ||
+ ((pZip->m_archive_size + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE +
+ MZ_ZIP_LOCAL_DIR_HEADER_SIZE) > 0xFFFFFFFF))
+ return MZ_FALSE;
+
+ pState = pZip->m_pState;
+
+ if (pState->m_pFile) {
+#ifdef MINIZ_NO_STDIO
+ pFilename;
+ return MZ_FALSE;
+#else
+ // Archive is being read from stdio - try to reopen as writable.
+ if (pZip->m_pIO_opaque != pZip)
+ return MZ_FALSE;
+ if (!pFilename)
+ return MZ_FALSE;
+ pZip->m_pWrite = mz_zip_file_write_func;
+ if (NULL ==
+ (pState->m_pFile = MZ_FREOPEN(pFilename, "r+b", pState->m_pFile))) {
+ // The mz_zip_archive is now in a bogus state because pState->m_pFile is
+ // NULL, so just close it.
+ mz_zip_reader_end(pZip);
+ return MZ_FALSE;
+ }
+#endif // #ifdef MINIZ_NO_STDIO
+ } else if (pState->m_pMem) {
+ // Archive lives in a memory block. Assume it's from the heap that we can
+ // resize using the realloc callback.
+ if (pZip->m_pIO_opaque != pZip)
+ return MZ_FALSE;
+ pState->m_mem_capacity = pState->m_mem_size;
+ pZip->m_pWrite = mz_zip_heap_write_func;
+ }
+ // Archive is being read via a user provided read function - make sure the
+ // user has specified a write function too.
+ else if (!pZip->m_pWrite)
+ return MZ_FALSE;
+
+ // Start writing new files at the archive's current central directory
+ // location.
+ pZip->m_archive_size = pZip->m_central_directory_file_ofs;
+ pZip->m_zip_mode = MZ_ZIP_MODE_WRITING;
+ pZip->m_central_directory_file_ofs = 0;
+
+ return MZ_TRUE;
+}
+
+mz_bool mz_zip_writer_add_mem(mz_zip_archive *pZip, const char *pArchive_name,
+ const void *pBuf, size_t buf_size,
+ mz_uint level_and_flags) {
+ return mz_zip_writer_add_mem_ex(pZip, pArchive_name, pBuf, buf_size, NULL, 0,
+ level_and_flags, 0, 0);
+}
+
+typedef struct {
+ mz_zip_archive *m_pZip;
+ mz_uint64 m_cur_archive_file_ofs;
+ mz_uint64 m_comp_size;
+} mz_zip_writer_add_state;
+
+static mz_bool mz_zip_writer_add_put_buf_callback(const void *pBuf, int len,
+ void *pUser) {
+ mz_zip_writer_add_state *pState = (mz_zip_writer_add_state *)pUser;
+ if ((int)pState->m_pZip->m_pWrite(pState->m_pZip->m_pIO_opaque,
+ pState->m_cur_archive_file_ofs, pBuf,
+ len) != len)
+ return MZ_FALSE;
+ pState->m_cur_archive_file_ofs += len;
+ pState->m_comp_size += len;
+ return MZ_TRUE;
+}
+
+static mz_bool mz_zip_writer_create_local_dir_header(
+ mz_zip_archive *pZip, mz_uint8 *pDst, mz_uint16 filename_size,
+ mz_uint16 extra_size, mz_uint64 uncomp_size, mz_uint64 comp_size,
+ mz_uint32 uncomp_crc32, mz_uint16 method, mz_uint16 bit_flags,
+ mz_uint16 dos_time, mz_uint16 dos_date) {
+ (void)pZip;
+ memset(pDst, 0, MZ_ZIP_LOCAL_DIR_HEADER_SIZE);
+ MZ_WRITE_LE32(pDst + MZ_ZIP_LDH_SIG_OFS, MZ_ZIP_LOCAL_DIR_HEADER_SIG);
+ MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_VERSION_NEEDED_OFS, method ? 20 : 0);
+ MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_BIT_FLAG_OFS, bit_flags);
+ MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_METHOD_OFS, method);
+ MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_FILE_TIME_OFS, dos_time);
+ MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_FILE_DATE_OFS, dos_date);
+ MZ_WRITE_LE32(pDst + MZ_ZIP_LDH_CRC32_OFS, uncomp_crc32);
+ MZ_WRITE_LE32(pDst + MZ_ZIP_LDH_COMPRESSED_SIZE_OFS, comp_size);
+ MZ_WRITE_LE32(pDst + MZ_ZIP_LDH_DECOMPRESSED_SIZE_OFS, uncomp_size);
+ MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_FILENAME_LEN_OFS, filename_size);
+ MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_EXTRA_LEN_OFS, extra_size);
+ return MZ_TRUE;
+}
+
+static mz_bool mz_zip_writer_create_central_dir_header(
+ mz_zip_archive *pZip, mz_uint8 *pDst, mz_uint16 filename_size,
+ mz_uint16 extra_size, mz_uint16 comment_size, mz_uint64 uncomp_size,
+ mz_uint64 comp_size, mz_uint32 uncomp_crc32, mz_uint16 method,
+ mz_uint16 bit_flags, mz_uint16 dos_time, mz_uint16 dos_date,
+ mz_uint64 local_header_ofs, mz_uint32 ext_attributes) {
+ (void)pZip;
+ memset(pDst, 0, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE);
+ MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_SIG_OFS, MZ_ZIP_CENTRAL_DIR_HEADER_SIG);
+ MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_VERSION_NEEDED_OFS, method ? 20 : 0);
+ MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_BIT_FLAG_OFS, bit_flags);
+ MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_METHOD_OFS, method);
+ MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_FILE_TIME_OFS, dos_time);
+ MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_FILE_DATE_OFS, dos_date);
+ MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_CRC32_OFS, uncomp_crc32);
+ MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS, comp_size);
+ MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS, uncomp_size);
+ MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_FILENAME_LEN_OFS, filename_size);
+ MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_EXTRA_LEN_OFS, extra_size);
+ MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_COMMENT_LEN_OFS, comment_size);
+ MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_EXTERNAL_ATTR_OFS, ext_attributes);
+ MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_LOCAL_HEADER_OFS, local_header_ofs);
+ return MZ_TRUE;
+}
+
+static mz_bool mz_zip_writer_add_to_central_dir(
+ mz_zip_archive *pZip, const char *pFilename, mz_uint16 filename_size,
+ const void *pExtra, mz_uint16 extra_size, const void *pComment,
+ mz_uint16 comment_size, mz_uint64 uncomp_size, mz_uint64 comp_size,
+ mz_uint32 uncomp_crc32, mz_uint16 method, mz_uint16 bit_flags,
+ mz_uint16 dos_time, mz_uint16 dos_date, mz_uint64 local_header_ofs,
+ mz_uint32 ext_attributes) {
+ mz_zip_internal_state *pState = pZip->m_pState;
+ mz_uint32 central_dir_ofs = (mz_uint32)pState->m_central_dir.m_size;
+ size_t orig_central_dir_size = pState->m_central_dir.m_size;
+ mz_uint8 central_dir_header[MZ_ZIP_CENTRAL_DIR_HEADER_SIZE];
+
+ // No zip64 support yet
+ if ((local_header_ofs > 0xFFFFFFFF) ||
+ (((mz_uint64)pState->m_central_dir.m_size +
+ MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + filename_size + extra_size +
+ comment_size) > 0xFFFFFFFF))
+ return MZ_FALSE;
+
+ if (!mz_zip_writer_create_central_dir_header(
+ pZip, central_dir_header, filename_size, extra_size, comment_size,
+ uncomp_size, comp_size, uncomp_crc32, method, bit_flags, dos_time,
+ dos_date, local_header_ofs, ext_attributes))
+ return MZ_FALSE;
+
+ if ((!mz_zip_array_push_back(pZip, &pState->m_central_dir, central_dir_header,
+ MZ_ZIP_CENTRAL_DIR_HEADER_SIZE)) ||
+ (!mz_zip_array_push_back(pZip, &pState->m_central_dir, pFilename,
+ filename_size)) ||
+ (!mz_zip_array_push_back(pZip, &pState->m_central_dir, pExtra,
+ extra_size)) ||
+ (!mz_zip_array_push_back(pZip, &pState->m_central_dir, pComment,
+ comment_size)) ||
+ (!mz_zip_array_push_back(pZip, &pState->m_central_dir_offsets,
+ &central_dir_ofs, 1))) {
+ // Try to push the central directory array back into its original state.
+ mz_zip_array_resize(pZip, &pState->m_central_dir, orig_central_dir_size,
+ MZ_FALSE);
+ return MZ_FALSE;
+ }
+
+ return MZ_TRUE;
+}
+
+static mz_bool mz_zip_writer_validate_archive_name(const char *pArchive_name) {
+ // Basic ZIP archive filename validity checks: Valid filenames cannot start
+ // with a forward slash, cannot contain a drive letter, and cannot use
+ // DOS-style backward slashes.
+ if (*pArchive_name == '/')
+ return MZ_FALSE;
+ while (*pArchive_name) {
+ if ((*pArchive_name == '\\') || (*pArchive_name == ':'))
+ return MZ_FALSE;
+ pArchive_name++;
+ }
+ return MZ_TRUE;
+}
+
+static mz_uint
+mz_zip_writer_compute_padding_needed_for_file_alignment(mz_zip_archive *pZip) {
+ mz_uint32 n;
+ if (!pZip->m_file_offset_alignment)
+ return 0;
+ n = (mz_uint32)(pZip->m_archive_size & (pZip->m_file_offset_alignment - 1));
+ return (pZip->m_file_offset_alignment - n) &
+ (pZip->m_file_offset_alignment - 1);
+}
+
+static mz_bool mz_zip_writer_write_zeros(mz_zip_archive *pZip,
+ mz_uint64 cur_file_ofs, mz_uint32 n) {
+ char buf[4096];
+ memset(buf, 0, MZ_MIN(sizeof(buf), n));
+ while (n) {
+ mz_uint32 s = MZ_MIN(sizeof(buf), n);
+ if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_file_ofs, buf, s) != s)
+ return MZ_FALSE;
+ cur_file_ofs += s;
+ n -= s;
+ }
+ return MZ_TRUE;
+}
+
+mz_bool mz_zip_writer_add_mem_ex(mz_zip_archive *pZip,
+ const char *pArchive_name, const void *pBuf,
+ size_t buf_size, const void *pComment,
+ mz_uint16 comment_size,
+ mz_uint level_and_flags, mz_uint64 uncomp_size,
+ mz_uint32 uncomp_crc32) {
+ mz_uint16 method = 0, dos_time = 0, dos_date = 0;
+ mz_uint level, ext_attributes = 0, num_alignment_padding_bytes;
+ mz_uint64 local_dir_header_ofs = pZip->m_archive_size,
+ cur_archive_file_ofs = pZip->m_archive_size, comp_size = 0;
+ size_t archive_name_size;
+ mz_uint8 local_dir_header[MZ_ZIP_LOCAL_DIR_HEADER_SIZE];
+ tdefl_compressor *pComp = NULL;
+ mz_bool store_data_uncompressed;
+ mz_zip_internal_state *pState;
+
+ if ((int)level_and_flags < 0)
+ level_and_flags = MZ_DEFAULT_LEVEL;
+ level = level_and_flags & 0xF;
+ store_data_uncompressed =
+ ((!level) || (level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA));
+
+ if ((!pZip) || (!pZip->m_pState) ||
+ (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING) || ((buf_size) && (!pBuf)) ||
+ (!pArchive_name) || ((comment_size) && (!pComment)) ||
+ (pZip->m_total_files == 0xFFFF) || (level > MZ_UBER_COMPRESSION))
+ return MZ_FALSE;
+
+ pState = pZip->m_pState;
+
+ if ((!(level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) && (uncomp_size))
+ return MZ_FALSE;
+ // No zip64 support yet
+ if ((buf_size > 0xFFFFFFFF) || (uncomp_size > 0xFFFFFFFF))
+ return MZ_FALSE;
+ if (!mz_zip_writer_validate_archive_name(pArchive_name))
+ return MZ_FALSE;
+
+#ifndef MINIZ_NO_TIME
+ {
+ time_t cur_time;
+ time(&cur_time);
+ mz_zip_time_to_dos_time(cur_time, &dos_time, &dos_date);
+ }
+#endif // #ifndef MINIZ_NO_TIME
+
+ archive_name_size = strlen(pArchive_name);
+ if (archive_name_size > 0xFFFF)
+ return MZ_FALSE;
+
+ num_alignment_padding_bytes =
+ mz_zip_writer_compute_padding_needed_for_file_alignment(pZip);
+
+ // no zip64 support yet
+ if ((pZip->m_total_files == 0xFFFF) ||
+ ((pZip->m_archive_size + num_alignment_padding_bytes +
+ MZ_ZIP_LOCAL_DIR_HEADER_SIZE + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE +
+ comment_size + archive_name_size) > 0xFFFFFFFF))
+ return MZ_FALSE;
+
+ if ((archive_name_size) && (pArchive_name[archive_name_size - 1] == '/')) {
+ // Set DOS Subdirectory attribute bit.
+ ext_attributes |= 0x10;
+ // Subdirectories cannot contain data.
+ if ((buf_size) || (uncomp_size))
+ return MZ_FALSE;
+ }
+
+ // Try to do any allocations before writing to the archive, so if an
+ // allocation fails the file remains unmodified. (A good idea if we're doing
+ // an in-place modification.)
+ if ((!mz_zip_array_ensure_room(pZip, &pState->m_central_dir,
+ MZ_ZIP_CENTRAL_DIR_HEADER_SIZE +
+ archive_name_size + comment_size)) ||
+ (!mz_zip_array_ensure_room(pZip, &pState->m_central_dir_offsets, 1)))
+ return MZ_FALSE;
+
+ if ((!store_data_uncompressed) && (buf_size)) {
+ if (NULL == (pComp = (tdefl_compressor *)pZip->m_pAlloc(
+ pZip->m_pAlloc_opaque, 1, sizeof(tdefl_compressor))))
+ return MZ_FALSE;
+ }
+
+ if (!mz_zip_writer_write_zeros(pZip, cur_archive_file_ofs,
+ num_alignment_padding_bytes +
+ sizeof(local_dir_header))) {
+ pZip->m_pFree(pZip->m_pAlloc_opaque, pComp);
+ return MZ_FALSE;
+ }
+ local_dir_header_ofs += num_alignment_padding_bytes;
+ if (pZip->m_file_offset_alignment) {
+ MZ_ASSERT((local_dir_header_ofs & (pZip->m_file_offset_alignment - 1)) ==
+ 0);
+ }
+ cur_archive_file_ofs +=
+ num_alignment_padding_bytes + sizeof(local_dir_header);
+
+ MZ_CLEAR_OBJ(local_dir_header);
+ if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, pArchive_name,
+ archive_name_size) != archive_name_size) {
+ pZip->m_pFree(pZip->m_pAlloc_opaque, pComp);
+ return MZ_FALSE;
+ }
+ cur_archive_file_ofs += archive_name_size;
+
+ if (!(level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) {
+ uncomp_crc32 =
+ (mz_uint32)mz_crc32(MZ_CRC32_INIT, (const mz_uint8 *)pBuf, buf_size);
+ uncomp_size = buf_size;
+ if (uncomp_size <= 3) {
+ level = 0;
+ store_data_uncompressed = MZ_TRUE;
+ }
+ }
+
+ if (store_data_uncompressed) {
+ if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, pBuf,
+ buf_size) != buf_size) {
+ pZip->m_pFree(pZip->m_pAlloc_opaque, pComp);
+ return MZ_FALSE;
+ }
+
+ cur_archive_file_ofs += buf_size;
+ comp_size = buf_size;
+
+ if (level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA)
+ method = MZ_DEFLATED;
+ } else if (buf_size) {
+ mz_zip_writer_add_state state;
+
+ state.m_pZip = pZip;
+ state.m_cur_archive_file_ofs = cur_archive_file_ofs;
+ state.m_comp_size = 0;
+
+ if ((tdefl_init(pComp, mz_zip_writer_add_put_buf_callback, &state,
+ tdefl_create_comp_flags_from_zip_params(
+ level, -15, MZ_DEFAULT_STRATEGY)) !=
+ TDEFL_STATUS_OKAY) ||
+ (tdefl_compress_buffer(pComp, pBuf, buf_size, TDEFL_FINISH) !=
+ TDEFL_STATUS_DONE)) {
+ pZip->m_pFree(pZip->m_pAlloc_opaque, pComp);
+ return MZ_FALSE;
+ }
+
+ comp_size = state.m_comp_size;
+ cur_archive_file_ofs = state.m_cur_archive_file_ofs;
+
+ method = MZ_DEFLATED;
+ }
+
+ pZip->m_pFree(pZip->m_pAlloc_opaque, pComp);
+ pComp = NULL;
+
+ // no zip64 support yet
+ if ((comp_size > 0xFFFFFFFF) || (cur_archive_file_ofs > 0xFFFFFFFF))
+ return MZ_FALSE;
+
+ if (!mz_zip_writer_create_local_dir_header(
+ pZip, local_dir_header, (mz_uint16)archive_name_size, 0, uncomp_size,
+ comp_size, uncomp_crc32, method, 0, dos_time, dos_date))
+ return MZ_FALSE;
+
+ if (pZip->m_pWrite(pZip->m_pIO_opaque, local_dir_header_ofs, local_dir_header,
+ sizeof(local_dir_header)) != sizeof(local_dir_header))
+ return MZ_FALSE;
+
+ if (!mz_zip_writer_add_to_central_dir(
+ pZip, pArchive_name, (mz_uint16)archive_name_size, NULL, 0, pComment,
+ comment_size, uncomp_size, comp_size, uncomp_crc32, method, 0,
+ dos_time, dos_date, local_dir_header_ofs, ext_attributes))
+ return MZ_FALSE;
+
+ pZip->m_total_files++;
+ pZip->m_archive_size = cur_archive_file_ofs;
+
+ return MZ_TRUE;
+}
+
+#ifndef MINIZ_NO_STDIO
+mz_bool mz_zip_writer_add_file(mz_zip_archive *pZip, const char *pArchive_name,
+ const char *pSrc_filename, const void *pComment,
+ mz_uint16 comment_size,
+ mz_uint level_and_flags) {
+ mz_uint uncomp_crc32 = MZ_CRC32_INIT, level, num_alignment_padding_bytes;
+ mz_uint16 method = 0, dos_time = 0, dos_date = 0, ext_attributes = 0;
+ mz_uint64 local_dir_header_ofs = pZip->m_archive_size,
+ cur_archive_file_ofs = pZip->m_archive_size, uncomp_size = 0,
+ comp_size = 0;
+ size_t archive_name_size;
+ mz_uint8 local_dir_header[MZ_ZIP_LOCAL_DIR_HEADER_SIZE];
+ MZ_FILE *pSrc_file = NULL;
+
+ if ((int)level_and_flags < 0)
+ level_and_flags = MZ_DEFAULT_LEVEL;
+ level = level_and_flags & 0xF;
+
+ if ((!pZip) || (!pZip->m_pState) ||
+ (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING) || (!pArchive_name) ||
+ ((comment_size) && (!pComment)) || (level > MZ_UBER_COMPRESSION))
+ return MZ_FALSE;
+ if (level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA)
+ return MZ_FALSE;
+ if (!mz_zip_writer_validate_archive_name(pArchive_name))
+ return MZ_FALSE;
+
+ archive_name_size = strlen(pArchive_name);
+ if (archive_name_size > 0xFFFF)
+ return MZ_FALSE;
+
+ num_alignment_padding_bytes =
+ mz_zip_writer_compute_padding_needed_for_file_alignment(pZip);
+
+ // no zip64 support yet
+ if ((pZip->m_total_files == 0xFFFF) ||
+ ((pZip->m_archive_size + num_alignment_padding_bytes +
+ MZ_ZIP_LOCAL_DIR_HEADER_SIZE + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE +
+ comment_size + archive_name_size) > 0xFFFFFFFF))
+ return MZ_FALSE;
+
+ if (!mz_zip_get_file_modified_time(pSrc_filename, &dos_time, &dos_date))
+ return MZ_FALSE;
+
+ pSrc_file = MZ_FOPEN(pSrc_filename, "rb");
+ if (!pSrc_file)
+ return MZ_FALSE;
+ MZ_FSEEK64(pSrc_file, 0, SEEK_END);
+ uncomp_size = MZ_FTELL64(pSrc_file);
+ MZ_FSEEK64(pSrc_file, 0, SEEK_SET);
+
+ if (uncomp_size > 0xFFFFFFFF) {
+ // No zip64 support yet
+ MZ_FCLOSE(pSrc_file);
+ return MZ_FALSE;
+ }
+ if (uncomp_size <= 3)
+ level = 0;
+
+ if (!mz_zip_writer_write_zeros(pZip, cur_archive_file_ofs,
+ num_alignment_padding_bytes +
+ sizeof(local_dir_header))) {
+ MZ_FCLOSE(pSrc_file);
+ return MZ_FALSE;
+ }
+ local_dir_header_ofs += num_alignment_padding_bytes;
+ if (pZip->m_file_offset_alignment) {
+ MZ_ASSERT((local_dir_header_ofs & (pZip->m_file_offset_alignment - 1)) ==
+ 0);
+ }
+ cur_archive_file_ofs +=
+ num_alignment_padding_bytes + sizeof(local_dir_header);
+
+ MZ_CLEAR_OBJ(local_dir_header);
+ if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, pArchive_name,
+ archive_name_size) != archive_name_size) {
+ MZ_FCLOSE(pSrc_file);
+ return MZ_FALSE;
+ }
+ cur_archive_file_ofs += archive_name_size;
+
+ if (uncomp_size) {
+ mz_uint64 uncomp_remaining = uncomp_size;
+ void *pRead_buf =
+ pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, MZ_ZIP_MAX_IO_BUF_SIZE);
+ if (!pRead_buf) {
+ MZ_FCLOSE(pSrc_file);
+ return MZ_FALSE;
+ }
+
+ if (!level) {
+ while (uncomp_remaining) {
+ mz_uint n = (mz_uint)MZ_MIN((mz_uint)MZ_ZIP_MAX_IO_BUF_SIZE, uncomp_remaining);
+ if ((MZ_FREAD(pRead_buf, 1, n, pSrc_file) != n) ||
+ (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, pRead_buf,
+ n) != n)) {
+ pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf);
+ MZ_FCLOSE(pSrc_file);
+ return MZ_FALSE;
+ }
+ uncomp_crc32 =
+ (mz_uint32)mz_crc32(uncomp_crc32, (const mz_uint8 *)pRead_buf, n);
+ uncomp_remaining -= n;
+ cur_archive_file_ofs += n;
+ }
+ comp_size = uncomp_size;
+ } else {
+ mz_bool result = MZ_FALSE;
+ mz_zip_writer_add_state state;
+ tdefl_compressor *pComp = (tdefl_compressor *)pZip->m_pAlloc(
+ pZip->m_pAlloc_opaque, 1, sizeof(tdefl_compressor));
+ if (!pComp) {
+ pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf);
+ MZ_FCLOSE(pSrc_file);
+ return MZ_FALSE;
+ }
+
+ state.m_pZip = pZip;
+ state.m_cur_archive_file_ofs = cur_archive_file_ofs;
+ state.m_comp_size = 0;
+
+ if (tdefl_init(pComp, mz_zip_writer_add_put_buf_callback, &state,
+ tdefl_create_comp_flags_from_zip_params(
+ level, -15, MZ_DEFAULT_STRATEGY)) !=
+ TDEFL_STATUS_OKAY) {
+ pZip->m_pFree(pZip->m_pAlloc_opaque, pComp);
+ pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf);
+ MZ_FCLOSE(pSrc_file);
+ return MZ_FALSE;
+ }
+
+ for (;;) {
+ size_t in_buf_size =
+ (mz_uint32)MZ_MIN(uncomp_remaining, (mz_uint)MZ_ZIP_MAX_IO_BUF_SIZE);
+ tdefl_status status;
+
+ if (MZ_FREAD(pRead_buf, 1, in_buf_size, pSrc_file) != in_buf_size)
+ break;
+
+ uncomp_crc32 = (mz_uint32)mz_crc32(
+ uncomp_crc32, (const mz_uint8 *)pRead_buf, in_buf_size);
+ uncomp_remaining -= in_buf_size;
+
+ status = tdefl_compress_buffer(pComp, pRead_buf, in_buf_size,
+ uncomp_remaining ? TDEFL_NO_FLUSH
+ : TDEFL_FINISH);
+ if (status == TDEFL_STATUS_DONE) {
+ result = MZ_TRUE;
+ break;
+ } else if (status != TDEFL_STATUS_OKAY)
+ break;
+ }
+
+ pZip->m_pFree(pZip->m_pAlloc_opaque, pComp);
+
+ if (!result) {
+ pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf);
+ MZ_FCLOSE(pSrc_file);
+ return MZ_FALSE;
+ }
+
+ comp_size = state.m_comp_size;
+ cur_archive_file_ofs = state.m_cur_archive_file_ofs;
+
+ method = MZ_DEFLATED;
+ }
+
+ pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf);
+ }
+
+ MZ_FCLOSE(pSrc_file);
+ pSrc_file = NULL;
+
+ // no zip64 support yet
+ if ((comp_size > 0xFFFFFFFF) || (cur_archive_file_ofs > 0xFFFFFFFF))
+ return MZ_FALSE;
+
+ if (!mz_zip_writer_create_local_dir_header(
+ pZip, local_dir_header, (mz_uint16)archive_name_size, 0, uncomp_size,
+ comp_size, uncomp_crc32, method, 0, dos_time, dos_date))
+ return MZ_FALSE;
+
+ if (pZip->m_pWrite(pZip->m_pIO_opaque, local_dir_header_ofs, local_dir_header,
+ sizeof(local_dir_header)) != sizeof(local_dir_header))
+ return MZ_FALSE;
+
+ if (!mz_zip_writer_add_to_central_dir(
+ pZip, pArchive_name, (mz_uint16)archive_name_size, NULL, 0, pComment,
+ comment_size, uncomp_size, comp_size, uncomp_crc32, method, 0,
+ dos_time, dos_date, local_dir_header_ofs, ext_attributes))
+ return MZ_FALSE;
+
+ pZip->m_total_files++;
+ pZip->m_archive_size = cur_archive_file_ofs;
+
+ return MZ_TRUE;
+}
+#endif // #ifndef MINIZ_NO_STDIO
+
+mz_bool mz_zip_writer_add_from_zip_reader(mz_zip_archive *pZip,
+ mz_zip_archive *pSource_zip,
+ mz_uint file_index) {
+ mz_uint n, bit_flags, num_alignment_padding_bytes;
+ mz_uint64 comp_bytes_remaining, local_dir_header_ofs;
+ mz_uint64 cur_src_file_ofs, cur_dst_file_ofs;
+ mz_uint32
+ local_header_u32[(MZ_ZIP_LOCAL_DIR_HEADER_SIZE + sizeof(mz_uint32) - 1) /
+ sizeof(mz_uint32)];
+ mz_uint8 *pLocal_header = (mz_uint8 *)local_header_u32;
+ mz_uint8 central_header[MZ_ZIP_CENTRAL_DIR_HEADER_SIZE];
+ size_t orig_central_dir_size;
+ mz_zip_internal_state *pState;
+ void *pBuf;
+ const mz_uint8 *pSrc_central_header;
+
+ if ((!pZip) || (!pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING))
+ return MZ_FALSE;
+ if (NULL ==
+ (pSrc_central_header = mz_zip_reader_get_cdh(pSource_zip, file_index)))
+ return MZ_FALSE;
+ pState = pZip->m_pState;
+
+ num_alignment_padding_bytes =
+ mz_zip_writer_compute_padding_needed_for_file_alignment(pZip);
+
+ // no zip64 support yet
+ if ((pZip->m_total_files == 0xFFFF) ||
+ ((pZip->m_archive_size + num_alignment_padding_bytes +
+ MZ_ZIP_LOCAL_DIR_HEADER_SIZE + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE) >
+ 0xFFFFFFFF))
+ return MZ_FALSE;
+
+ cur_src_file_ofs =
+ MZ_READ_LE32(pSrc_central_header + MZ_ZIP_CDH_LOCAL_HEADER_OFS);
+ cur_dst_file_ofs = pZip->m_archive_size;
+
+ if (pSource_zip->m_pRead(pSource_zip->m_pIO_opaque, cur_src_file_ofs,
+ pLocal_header, MZ_ZIP_LOCAL_DIR_HEADER_SIZE) !=
+ MZ_ZIP_LOCAL_DIR_HEADER_SIZE)
+ return MZ_FALSE;
+ if (MZ_READ_LE32(pLocal_header) != MZ_ZIP_LOCAL_DIR_HEADER_SIG)
+ return MZ_FALSE;
+ cur_src_file_ofs += MZ_ZIP_LOCAL_DIR_HEADER_SIZE;
+
+ if (!mz_zip_writer_write_zeros(pZip, cur_dst_file_ofs,
+ num_alignment_padding_bytes))
+ return MZ_FALSE;
+ cur_dst_file_ofs += num_alignment_padding_bytes;
+ local_dir_header_ofs = cur_dst_file_ofs;
+ if (pZip->m_file_offset_alignment) {
+ MZ_ASSERT((local_dir_header_ofs & (pZip->m_file_offset_alignment - 1)) ==
+ 0);
+ }
+
+ if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_dst_file_ofs, pLocal_header,
+ MZ_ZIP_LOCAL_DIR_HEADER_SIZE) !=
+ MZ_ZIP_LOCAL_DIR_HEADER_SIZE)
+ return MZ_FALSE;
+ cur_dst_file_ofs += MZ_ZIP_LOCAL_DIR_HEADER_SIZE;
+
+ n = MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_FILENAME_LEN_OFS) +
+ MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_EXTRA_LEN_OFS);
+ comp_bytes_remaining =
+ n + MZ_READ_LE32(pSrc_central_header + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS);
+
+ if (NULL ==
+ (pBuf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1,
+ (size_t)MZ_MAX(sizeof(mz_uint32) * 4,
+ MZ_MIN((mz_uint)MZ_ZIP_MAX_IO_BUF_SIZE,
+ comp_bytes_remaining)))))
+ return MZ_FALSE;
+
+ while (comp_bytes_remaining) {
+ n = (mz_uint)MZ_MIN((mz_uint)MZ_ZIP_MAX_IO_BUF_SIZE, comp_bytes_remaining);
+ if (pSource_zip->m_pRead(pSource_zip->m_pIO_opaque, cur_src_file_ofs, pBuf,
+ n) != n) {
+ pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf);
+ return MZ_FALSE;
+ }
+ cur_src_file_ofs += n;
+
+ if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_dst_file_ofs, pBuf, n) != n) {
+ pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf);
+ return MZ_FALSE;
+ }
+ cur_dst_file_ofs += n;
+
+ comp_bytes_remaining -= n;
+ }
+
+ bit_flags = MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_BIT_FLAG_OFS);
+ if (bit_flags & 8) {
+ // Copy data descriptor
+ if (pSource_zip->m_pRead(pSource_zip->m_pIO_opaque, cur_src_file_ofs, pBuf,
+ sizeof(mz_uint32) * 4) != sizeof(mz_uint32) * 4) {
+ pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf);
+ return MZ_FALSE;
+ }
+
+ n = sizeof(mz_uint32) * ((MZ_READ_LE32(pBuf) == 0x08074b50) ? 4 : 3);
+ if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_dst_file_ofs, pBuf, n) != n) {
+ pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf);
+ return MZ_FALSE;
+ }
+
+ cur_src_file_ofs += n;
+ cur_dst_file_ofs += n;
+ }
+ pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf);
+
+ // no zip64 support yet
+ if (cur_dst_file_ofs > 0xFFFFFFFF)
+ return MZ_FALSE;
+
+ orig_central_dir_size = pState->m_central_dir.m_size;
+
+ memcpy(central_header, pSrc_central_header, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE);
+ MZ_WRITE_LE32(central_header + MZ_ZIP_CDH_LOCAL_HEADER_OFS,
+ local_dir_header_ofs);
+ if (!mz_zip_array_push_back(pZip, &pState->m_central_dir, central_header,
+ MZ_ZIP_CENTRAL_DIR_HEADER_SIZE))
+ return MZ_FALSE;
+
+ n = MZ_READ_LE16(pSrc_central_header + MZ_ZIP_CDH_FILENAME_LEN_OFS) +
+ MZ_READ_LE16(pSrc_central_header + MZ_ZIP_CDH_EXTRA_LEN_OFS) +
+ MZ_READ_LE16(pSrc_central_header + MZ_ZIP_CDH_COMMENT_LEN_OFS);
+ if (!mz_zip_array_push_back(
+ pZip, &pState->m_central_dir,
+ pSrc_central_header + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE, n)) {
+ mz_zip_array_resize(pZip, &pState->m_central_dir, orig_central_dir_size,
+ MZ_FALSE);
+ return MZ_FALSE;
+ }
+
+ if (pState->m_central_dir.m_size > 0xFFFFFFFF)
+ return MZ_FALSE;
+ n = (mz_uint32)orig_central_dir_size;
+ if (!mz_zip_array_push_back(pZip, &pState->m_central_dir_offsets, &n, 1)) {
+ mz_zip_array_resize(pZip, &pState->m_central_dir, orig_central_dir_size,
+ MZ_FALSE);
+ return MZ_FALSE;
+ }
+
+ pZip->m_total_files++;
+ pZip->m_archive_size = cur_dst_file_ofs;
+
+ return MZ_TRUE;
+}
+
+mz_bool mz_zip_writer_finalize_archive(mz_zip_archive *pZip) {
+ mz_zip_internal_state *pState;
+ mz_uint64 central_dir_ofs, central_dir_size;
+ mz_uint8 hdr[MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE];
+
+ if ((!pZip) || (!pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING))
+ return MZ_FALSE;
+
+ pState = pZip->m_pState;
+
+ // no zip64 support yet
+ if ((pZip->m_total_files > 0xFFFF) ||
+ ((pZip->m_archive_size + pState->m_central_dir.m_size +
+ MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE) > 0xFFFFFFFF))
+ return MZ_FALSE;
+
+ central_dir_ofs = 0;
+ central_dir_size = 0;
+ if (pZip->m_total_files) {
+ // Write central directory
+ central_dir_ofs = pZip->m_archive_size;
+ central_dir_size = pState->m_central_dir.m_size;
+ pZip->m_central_directory_file_ofs = central_dir_ofs;
+ if (pZip->m_pWrite(pZip->m_pIO_opaque, central_dir_ofs,
+ pState->m_central_dir.m_p,
+ (size_t)central_dir_size) != central_dir_size)
+ return MZ_FALSE;
+ pZip->m_archive_size += central_dir_size;
+ }
+
+ // Write end of central directory record
+ MZ_CLEAR_OBJ(hdr);
+ MZ_WRITE_LE32(hdr + MZ_ZIP_ECDH_SIG_OFS,
+ MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIG);
+ MZ_WRITE_LE16(hdr + MZ_ZIP_ECDH_CDIR_NUM_ENTRIES_ON_DISK_OFS,
+ pZip->m_total_files);
+ MZ_WRITE_LE16(hdr + MZ_ZIP_ECDH_CDIR_TOTAL_ENTRIES_OFS, pZip->m_total_files);
+ MZ_WRITE_LE32(hdr + MZ_ZIP_ECDH_CDIR_SIZE_OFS, central_dir_size);
+ MZ_WRITE_LE32(hdr + MZ_ZIP_ECDH_CDIR_OFS_OFS, central_dir_ofs);
+
+ if (pZip->m_pWrite(pZip->m_pIO_opaque, pZip->m_archive_size, hdr,
+ sizeof(hdr)) != sizeof(hdr))
+ return MZ_FALSE;
+#ifndef MINIZ_NO_STDIO
+ if ((pState->m_pFile) && (MZ_FFLUSH(pState->m_pFile) == EOF))
+ return MZ_FALSE;
+#endif // #ifndef MINIZ_NO_STDIO
+
+ pZip->m_archive_size += sizeof(hdr);
+
+ pZip->m_zip_mode = MZ_ZIP_MODE_WRITING_HAS_BEEN_FINALIZED;
+ return MZ_TRUE;
+}
+
+mz_bool mz_zip_writer_finalize_heap_archive(mz_zip_archive *pZip, void **pBuf,
+ size_t *pSize) {
+ if ((!pZip) || (!pZip->m_pState) || (!pBuf) || (!pSize))
+ return MZ_FALSE;
+ if (pZip->m_pWrite != mz_zip_heap_write_func)
+ return MZ_FALSE;
+ if (!mz_zip_writer_finalize_archive(pZip))
+ return MZ_FALSE;
+
+ *pBuf = pZip->m_pState->m_pMem;
+ *pSize = pZip->m_pState->m_mem_size;
+ pZip->m_pState->m_pMem = NULL;
+ pZip->m_pState->m_mem_size = pZip->m_pState->m_mem_capacity = 0;
+ return MZ_TRUE;
+}
+
+mz_bool mz_zip_writer_end(mz_zip_archive *pZip) {
+ mz_zip_internal_state *pState;
+ mz_bool status = MZ_TRUE;
+ if ((!pZip) || (!pZip->m_pState) || (!pZip->m_pAlloc) || (!pZip->m_pFree) ||
+ ((pZip->m_zip_mode != MZ_ZIP_MODE_WRITING) &&
+ (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING_HAS_BEEN_FINALIZED)))
+ return MZ_FALSE;
+
+ pState = pZip->m_pState;
+ pZip->m_pState = NULL;
+ mz_zip_array_clear(pZip, &pState->m_central_dir);
+ mz_zip_array_clear(pZip, &pState->m_central_dir_offsets);
+ mz_zip_array_clear(pZip, &pState->m_sorted_central_dir_offsets);
+
+#ifndef MINIZ_NO_STDIO
+ if (pState->m_pFile) {
+ MZ_FCLOSE(pState->m_pFile);
+ pState->m_pFile = NULL;
+ }
+#endif // #ifndef MINIZ_NO_STDIO
+
+ if ((pZip->m_pWrite == mz_zip_heap_write_func) && (pState->m_pMem)) {
+ pZip->m_pFree(pZip->m_pAlloc_opaque, pState->m_pMem);
+ pState->m_pMem = NULL;
+ }
+
+ pZip->m_pFree(pZip->m_pAlloc_opaque, pState);
+ pZip->m_zip_mode = MZ_ZIP_MODE_INVALID;
+ return status;
+}
+
+#ifndef MINIZ_NO_STDIO
+mz_bool mz_zip_add_mem_to_archive_file_in_place(
+ const char *pZip_filename, const char *pArchive_name, const void *pBuf,
+ size_t buf_size, const void *pComment, mz_uint16 comment_size,
+ mz_uint level_and_flags) {
+ mz_bool status, created_new_archive = MZ_FALSE;
+ mz_zip_archive zip_archive;
+ struct MZ_FILE_STAT_STRUCT file_stat;
+ MZ_CLEAR_OBJ(zip_archive);
+ if ((int)level_and_flags < 0)
+ level_and_flags = MZ_DEFAULT_LEVEL;
+ if ((!pZip_filename) || (!pArchive_name) || ((buf_size) && (!pBuf)) ||
+ ((comment_size) && (!pComment)) ||
+ ((level_and_flags & 0xF) > MZ_UBER_COMPRESSION))
+ return MZ_FALSE;
+ if (!mz_zip_writer_validate_archive_name(pArchive_name))
+ return MZ_FALSE;
+ if (MZ_FILE_STAT(pZip_filename, &file_stat) != 0) {
+ // Create a new archive.
+ if (!mz_zip_writer_init_file(&zip_archive, pZip_filename, 0))
+ return MZ_FALSE;
+ created_new_archive = MZ_TRUE;
+ } else {
+ // Append to an existing archive.
+ if (!mz_zip_reader_init_file(&zip_archive, pZip_filename,
+ level_and_flags |
+ MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY))
+ return MZ_FALSE;
+ if (!mz_zip_writer_init_from_reader(&zip_archive, pZip_filename)) {
+ mz_zip_reader_end(&zip_archive);
+ return MZ_FALSE;
+ }
+ }
+ status =
+ mz_zip_writer_add_mem_ex(&zip_archive, pArchive_name, pBuf, buf_size,
+ pComment, comment_size, level_and_flags, 0, 0);
+ // Always finalize, even if adding failed for some reason, so we have a valid
+ // central directory. (This may not always succeed, but we can try.)
+ if (!mz_zip_writer_finalize_archive(&zip_archive))
+ status = MZ_FALSE;
+ if (!mz_zip_writer_end(&zip_archive))
+ status = MZ_FALSE;
+ if ((!status) && (created_new_archive)) {
+ // It's a new archive and something went wrong, so just delete it.
+ int ignoredStatus = MZ_DELETE_FILE(pZip_filename);
+ (void)ignoredStatus;
+ }
+ return status;
+}
+
+void *mz_zip_extract_archive_file_to_heap(const char *pZip_filename,
+ const char *pArchive_name,
+ size_t *pSize, mz_uint flags) {
+ int file_index;
+ mz_zip_archive zip_archive;
+ void *p = NULL;
+
+ if (pSize)
+ *pSize = 0;
+
+ if ((!pZip_filename) || (!pArchive_name))
+ return NULL;
+
+ MZ_CLEAR_OBJ(zip_archive);
+ if (!mz_zip_reader_init_file(&zip_archive, pZip_filename,
+ flags |
+ MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY))
+ return NULL;
+
+ if ((file_index = mz_zip_reader_locate_file(&zip_archive, pArchive_name, NULL,
+ flags)) >= 0)
+ p = mz_zip_reader_extract_to_heap(&zip_archive, file_index, pSize, flags);
+
+ mz_zip_reader_end(&zip_archive);
+ return p;
+}
+
+#endif // #ifndef MINIZ_NO_STDIO
+
+#endif // #ifndef MINIZ_NO_ARCHIVE_WRITING_APIS
+
+#endif // #ifndef MINIZ_NO_ARCHIVE_APIS
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // MINIZ_HEADER_FILE_ONLY
+
+/*
+ This is free and unencumbered software released into the public domain.
+
+ Anyone is free to copy, modify, publish, use, compile, sell, or
+ distribute this software, either in source code form or as a compiled
+ binary, for any purpose, commercial or non-commercial, and by any
+ means.
+
+ In jurisdictions that recognize copyright laws, the author or authors
+ of this software dedicate any and all copyright interest in the
+ software to the public domain. We make this dedication for the benefit
+ of the public at large and to the detriment of our heirs and
+ successors. We intend this dedication to be an overt act of
+ relinquishment in perpetuity of all present and future rights to this
+ software under copyright law.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ OTHER DEALINGS IN THE SOFTWARE.
+
+ For more information, please refer to <http://unlicense.org/>
+*/
+
+// ---------------------- end of miniz ----------------------------------------
+}
+
+bool IsBigEndian(void) {
+ union {
+ unsigned int i;
+ char c[4];
+ } bint = {0x01020304};
+
+ return bint.c[0] == 1;
+}
+
+void swap2(unsigned short *val) {
+ unsigned short tmp = *val;
+ unsigned char *dst = (unsigned char *)val;
+ unsigned char *src = (unsigned char *)&tmp;
+
+ dst[0] = src[1];
+ dst[1] = src[0];
+}
+
+void swap4(unsigned int *val) {
+ unsigned int tmp = *val;
+ unsigned char *dst = (unsigned char *)val;
+ unsigned char *src = (unsigned char *)&tmp;
+
+ dst[0] = src[3];
+ dst[1] = src[2];
+ dst[2] = src[1];
+ dst[3] = src[0];
+}
+
+void swap8(unsigned long long *val) {
+ unsigned long long tmp = (*val);
+ unsigned char *dst = (unsigned char *)val;
+ unsigned char *src = (unsigned char *)&tmp;
+
+ dst[0] = src[7];
+ dst[1] = src[6];
+ dst[2] = src[5];
+ dst[3] = src[4];
+ dst[4] = src[3];
+ dst[5] = src[2];
+ dst[6] = src[1];
+ dst[7] = src[0];
+}
+
+// https://gist.github.com/rygorous/2156668
+// Reuse MINIZ_LITTLE_ENDIAN flag from miniz.
+union FP32 {
+ unsigned int u;
+ float f;
+ struct {
+#if MINIZ_LITTLE_ENDIAN
+ unsigned int Mantissa : 23;
+ unsigned int Exponent : 8;
+ unsigned int Sign : 1;
+#else
+ unsigned int Sign : 1;
+ unsigned int Exponent : 8;
+ unsigned int Mantissa : 23;
+#endif
+ } s;
+};
+
+union FP16 {
+ unsigned short u;
+ struct {
+#if MINIZ_LITTLE_ENDIAN
+ unsigned int Mantissa : 10;
+ unsigned int Exponent : 5;
+ unsigned int Sign : 1;
+#else
+ unsigned int Sign : 1;
+ unsigned int Exponent : 5;
+ unsigned int Mantissa : 10;
+#endif
+ } s;
+};
+
+FP32 half_to_float(FP16 h) {
+ static const FP32 magic = {113 << 23};
+ static const unsigned int shifted_exp = 0x7c00
+ << 13; // exponent mask after shift
+ FP32 o;
+
+ o.u = (h.u & 0x7fff) << 13; // exponent/mantissa bits
+ unsigned int exp_ = shifted_exp & o.u; // just the exponent
+ o.u += (127 - 15) << 23; // exponent adjust
+
+ // handle exponent special cases
+ if (exp_ == shifted_exp) // Inf/NaN?
+ o.u += (128 - 16) << 23; // extra exp adjust
+ else if (exp_ == 0) // Zero/Denormal?
+ {
+ o.u += 1 << 23; // extra exp adjust
+ o.f -= magic.f; // renormalize
+ }
+
+ o.u |= (h.u & 0x8000) << 16; // sign bit
+ return o;
+}
+
+FP16 float_to_half_full(FP32 f) {
+ FP16 o = {0};
+
+ // Based on ISPC reference code (with minor modifications)
+ if (f.s.Exponent == 0) // Signed zero/denormal (which will underflow)
+ o.s.Exponent = 0;
+ else if (f.s.Exponent == 255) // Inf or NaN (all exponent bits set)
+ {
+ o.s.Exponent = 31;
+ o.s.Mantissa = f.s.Mantissa ? 0x200 : 0; // NaN->qNaN and Inf->Inf
+ } else // Normalized number
+ {
+ // Exponent unbias the single, then bias the halfp
+ int newexp = f.s.Exponent - 127 + 15;
+ if (newexp >= 31) // Overflow, return signed infinity
+ o.s.Exponent = 31;
+ else if (newexp <= 0) // Underflow
+ {
+ if ((14 - newexp) <= 24) // Mantissa might be non-zero
+ {
+ unsigned int mant = f.s.Mantissa | 0x800000; // Hidden 1 bit
+ o.s.Mantissa = mant >> (14 - newexp);
+ if ((mant >> (13 - newexp)) & 1) // Check for rounding
+ o.u++; // Round, might overflow into exp bit, but this is OK
+ }
+ } else {
+ o.s.Exponent = newexp;
+ o.s.Mantissa = f.s.Mantissa >> 13;
+ if (f.s.Mantissa & 0x1000) // Check for rounding
+ o.u++; // Round, might overflow to inf, this is OK
+ }
+ }
+
+ o.s.Sign = f.s.Sign;
+ return o;
+}
+
+// NOTE: From OpenEXR code
+// #define IMF_INCREASING_Y 0
+// #define IMF_DECREASING_Y 1
+// #define IMF_RAMDOM_Y 2
+//
+// #define IMF_NO_COMPRESSION 0
+// #define IMF_RLE_COMPRESSION 1
+// #define IMF_ZIPS_COMPRESSION 2
+// #define IMF_ZIP_COMPRESSION 3
+// #define IMF_PIZ_COMPRESSION 4
+// #define IMF_PXR24_COMPRESSION 5
+// #define IMF_B44_COMPRESSION 6
+// #define IMF_B44A_COMPRESSION 7
+
+const char *ReadString(std::string &s, const char *ptr) {
+ // Read untile NULL(\0).
+ const char *p = ptr;
+ const char *q = ptr;
+ while ((*q) != 0)
+ q++;
+
+ s = std::string(p, q);
+
+ return q + 1; // skip '\0'
+}
+
+const char *ReadAttribute(std::string &name, std::string &ty,
+ std::vector<unsigned char> &data, const char *ptr) {
+
+ if ((*ptr) == 0) {
+ // end of attribute.
+ return NULL;
+ }
+
+ const char *p = ReadString(name, ptr);
+
+ p = ReadString(ty, p);
+
+ int dataLen;
+ memcpy(&dataLen, p, sizeof(int));
+ p += 4;
+
+ if (IsBigEndian()) {
+ swap4(reinterpret_cast<unsigned int *>(&dataLen));
+ }
+
+ data.resize(dataLen);
+ memcpy(&data.at(0), p, dataLen);
+ p += dataLen;
+
+ return p;
+}
+
+void WriteAttribute(FILE *fp, const char *name, const char *type,
+ const unsigned char *data, int len) {
+ size_t n = fwrite(name, 1, strlen(name) + 1, fp);
+ assert(n == strlen(name) + 1);
+
+ n = fwrite(type, 1, strlen(type) + 1, fp);
+ assert(n == strlen(type) + 1);
+
+ int outLen = len;
+ if (IsBigEndian()) {
+ swap4(reinterpret_cast<unsigned int *>(&outLen));
+ }
+ n = fwrite(&outLen, 1, sizeof(int), fp);
+ assert(n == sizeof(int));
+
+ n = fwrite(data, 1, len, fp);
+ assert(n == (size_t)len);
+
+ (void)n;
+}
+
+void WriteAttributeToMemory(std::vector<unsigned char> &out, const char *name,
+ const char *type, const unsigned char *data,
+ int len) {
+ out.insert(out.end(), name, name + strlen(name) + 1);
+ out.insert(out.end(), type, type + strlen(type) + 1);
+
+ int outLen = len;
+ if (IsBigEndian()) {
+ swap4(reinterpret_cast<unsigned int *>(&outLen));
+ }
+ out.insert(out.end(), reinterpret_cast<unsigned char *>(&outLen),
+ reinterpret_cast<unsigned char *>(&outLen) + sizeof(int));
+ out.insert(out.end(), data, data + len);
+}
+
+typedef struct {
+ std::string name; // less than 255 bytes long
+ int pixelType;
+ unsigned char pLinear;
+ int xSampling;
+ int ySampling;
+} ChannelInfo;
+
+void ReadChannelInfo(std::vector<ChannelInfo> &channels,
+ const std::vector<unsigned char> &data) {
+ const char *p = reinterpret_cast<const char *>(&data.at(0));
+
+ for (;;) {
+ if ((*p) == 0) {
+ break;
+ }
+ ChannelInfo info;
+ p = ReadString(info.name, p);
+
+ memcpy(&info.pixelType, p, sizeof(int));
+ p += 4;
+ info.pLinear = p[0]; // uchar
+ p += 1 + 3; // reserved: uchar[3]
+ memcpy(&info.xSampling, p, sizeof(int)); // int
+ p += 4;
+ memcpy(&info.ySampling, p, sizeof(int)); // int
+ p += 4;
+
+ if (IsBigEndian()) {
+ swap4(reinterpret_cast<unsigned int *>(&info.pixelType));
+ swap4(reinterpret_cast<unsigned int *>(&info.xSampling));
+ swap4(reinterpret_cast<unsigned int *>(&info.ySampling));
+ }
+
+ channels.push_back(info);
+ }
+}
+
+void WriteChannelInfo(std::vector<unsigned char> &data,
+ const std::vector<ChannelInfo> &channels) {
+
+ size_t sz = 0;
+
+ // Calculate total size.
+ for (size_t c = 0; c < channels.size(); c++) {
+ sz += strlen(channels[c].name.c_str()) + 1; // +1 for \0
+ sz += 16; // 4 * int
+ }
+ data.resize(sz + 1);
+
+ unsigned char *p = &data.at(0);
+
+ for (size_t c = 0; c < channels.size(); c++) {
+ memcpy(p, channels[c].name.c_str(), strlen(channels[c].name.c_str()));
+ p += strlen(channels[c].name.c_str());
+ (*p) = '\0';
+ p++;
+
+ int pixelType = channels[c].pixelType;
+ int xSampling = channels[c].xSampling;
+ int ySampling = channels[c].ySampling;
+ if (IsBigEndian()) {
+ swap4(reinterpret_cast<unsigned int *>(&pixelType));
+ swap4(reinterpret_cast<unsigned int *>(&xSampling));
+ swap4(reinterpret_cast<unsigned int *>(&ySampling));
+ }
+
+ memcpy(p, &pixelType, sizeof(int));
+ p += sizeof(int);
+
+ (*p) = channels[c].pLinear;
+ p += 4;
+
+ memcpy(p, &xSampling, sizeof(int));
+ p += sizeof(int);
+
+ memcpy(p, &ySampling, sizeof(int));
+ p += sizeof(int);
+ }
+
+ (*p) = '\0';
+}
+
+void CompressZip(unsigned char *dst, unsigned long long &compressedSize,
+ const unsigned char *src, unsigned long srcSize) {
+
+ std::vector<unsigned char> tmpBuf(srcSize);
+
+ //
+ // Apply EXR-specific? postprocess. Grabbed from OpenEXR's
+ // ImfZipCompressor.cpp
+ //
+
+ //
+ // Reorder the pixel data.
+ //
+
+ {
+ char *t1 = (char *)&tmpBuf.at(0);
+ char *t2 = (char *)&tmpBuf.at(0) + (srcSize + 1) / 2;
+ const char *stop = (const char *)src + srcSize;
+
+ while (true) {
+ if ((const char *)src < stop)
+ *(t1++) = *(src++);
+ else
+ break;
+
+ if ((const char *)src < stop)
+ *(t2++) = *(src++);
+ else
+ break;
+ }
+ }
+
+ //
+ // Predictor.
+ //
+
+ {
+ unsigned char *t = &tmpBuf.at(0) + 1;
+ unsigned char *stop = &tmpBuf.at(0) + srcSize;
+ int p = t[-1];
+
+ while (t < stop) {
+ int d = int(t[0]) - p + (128 + 256);
+ p = t[0];
+ t[0] = d;
+ ++t;
+ }
+ }
+
+ //
+ // Compress the data using miniz
+ //
+
+ miniz::mz_ulong outSize = miniz::mz_compressBound(srcSize);
+ int ret = miniz::mz_compress(dst, &outSize,
+ (const unsigned char *)&tmpBuf.at(0), srcSize);
+ assert(ret == miniz::MZ_OK);
+ (void)ret;
+
+ compressedSize = outSize;
+}
+
+void DecompressZip(unsigned char *dst, unsigned long &uncompressedSize,
+ const unsigned char *src, unsigned long srcSize) {
+ std::vector<unsigned char> tmpBuf(uncompressedSize);
+
+ int ret =
+ miniz::mz_uncompress(&tmpBuf.at(0), &uncompressedSize, src, srcSize);
+ assert(ret == miniz::MZ_OK);
+ (void)ret;
+
+ //
+ // Apply EXR-specific? postprocess. Grabbed from OpenEXR's
+ // ImfZipCompressor.cpp
+ //
+
+ // Predictor.
+ {
+ unsigned char *t = &tmpBuf.at(0) + 1;
+ unsigned char *stop = &tmpBuf.at(0) + uncompressedSize;
+
+ while (t < stop) {
+ int d = int(t[-1]) + int(t[0]) - 128;
+ t[0] = d;
+ ++t;
+ }
+ }
+
+ // Reorder the pixel data.
+ {
+ const char *t1 = reinterpret_cast<const char *>(&tmpBuf.at(0));
+ const char *t2 = reinterpret_cast<const char *>(&tmpBuf.at(0)) +
+ (uncompressedSize + 1) / 2;
+ char *s = reinterpret_cast<char *>(dst);
+ char *stop = s + uncompressedSize;
+
+ while (true) {
+ if (s < stop)
+ *(s++) = *(t1++);
+ else
+ break;
+
+ if (s < stop)
+ *(s++) = *(t2++);
+ else
+ break;
+ }
+ }
+}
+
+//
+// PIZ compress/uncompress, based on OpenEXR's ImfPizCompressor.cpp
+//
+// -----------------------------------------------------------------
+// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas
+// Digital Ltd. LLC)
+// (3 clause BSD license)
+//
+
+struct PIZChannelData {
+ unsigned short *start;
+ unsigned short *end;
+ int nx;
+ int ny;
+ int ys;
+ int size;
+};
+
+//-----------------------------------------------------------------------------
+//
+// 16-bit Haar Wavelet encoding and decoding
+//
+// The source code in this file is derived from the encoding
+// and decoding routines written by Christian Rouet for his
+// PIZ image file format.
+//
+//-----------------------------------------------------------------------------
+
+//
+// Wavelet basis functions without modulo arithmetic; they produce
+// the best compression ratios when the wavelet-transformed data are
+// Huffman-encoded, but the wavelet transform works only for 14-bit
+// data (untransformed data values must be less than (1 << 14)).
+//
+
+#if 0 // @todo
+inline void wenc14(unsigned short a, unsigned short b, unsigned short &l,
+ unsigned short &h) {
+ short as = a;
+ short bs = b;
+
+ short ms = (as + bs) >> 1;
+ short ds = as - bs;
+
+ l = ms;
+ h = ds;
+}
+#endif
+
+inline void wdec14(unsigned short l, unsigned short h, unsigned short &a,
+ unsigned short &b) {
+ short ls = l;
+ short hs = h;
+
+ int hi = hs;
+ int ai = ls + (hi & 1) + (hi >> 1);
+
+ short as = ai;
+ short bs = ai - hi;
+
+ a = as;
+ b = bs;
+}
+
+//
+// Wavelet basis functions with modulo arithmetic; they work with full
+// 16-bit data, but Huffman-encoding the wavelet-transformed data doesn't
+// compress the data quite as well.
+//
+
+const int NBITS = 16;
+const int A_OFFSET = 1 << (NBITS - 1);
+// const int M_OFFSET = 1 << (NBITS - 1);
+const int MOD_MASK = (1 << NBITS) - 1;
+
+#if 0 // @ood
+inline void wenc16(unsigned short a, unsigned short b, unsigned short &l,
+ unsigned short &h) {
+ int ao = (a + A_OFFSET) & MOD_MASK;
+ int m = ((ao + b) >> 1);
+ int d = ao - b;
+
+ if (d < 0)
+ m = (m + M_OFFSET) & MOD_MASK;
+
+ d &= MOD_MASK;
+
+ l = m;
+ h = d;
+}
+#endif
+
+inline void wdec16(unsigned short l, unsigned short h, unsigned short &a,
+ unsigned short &b) {
+ int m = l;
+ int d = h;
+ int bb = (m - (d >> 1)) & MOD_MASK;
+ int aa = (d + bb - A_OFFSET) & MOD_MASK;
+ b = bb;
+ a = aa;
+}
+
+//
+// 2D Wavelet encoding:
+//
+
+#if 0 // @todo
+void wav2Encode(unsigned short *in, // io: values are transformed in place
+ int nx, // i : x size
+ int ox, // i : x offset
+ int ny, // i : y size
+ int oy, // i : y offset
+ unsigned short mx) // i : maximum in[x][y] value
+{
+ bool w14 = (mx < (1 << 14));
+ int n = (nx > ny) ? ny : nx;
+ int p = 1; // == 1 << level
+ int p2 = 2; // == 1 << (level+1)
+
+ //
+ // Hierachical loop on smaller dimension n
+ //
+
+ while (p2 <= n) {
+ unsigned short *py = in;
+ unsigned short *ey = in + oy * (ny - p2);
+ int oy1 = oy * p;
+ int oy2 = oy * p2;
+ int ox1 = ox * p;
+ int ox2 = ox * p2;
+ unsigned short i00, i01, i10, i11;
+
+ //
+ // Y loop
+ //
+
+ for (; py <= ey; py += oy2) {
+ unsigned short *px = py;
+ unsigned short *ex = py + ox * (nx - p2);
+
+ //
+ // X loop
+ //
+
+ for (; px <= ex; px += ox2) {
+ unsigned short *p01 = px + ox1;
+ unsigned short *p10 = px + oy1;
+ unsigned short *p11 = p10 + ox1;
+
+ //
+ // 2D wavelet encoding
+ //
+
+ if (w14) {
+ wenc14(*px, *p01, i00, i01);
+ wenc14(*p10, *p11, i10, i11);
+ wenc14(i00, i10, *px, *p10);
+ wenc14(i01, i11, *p01, *p11);
+ } else {
+ wenc16(*px, *p01, i00, i01);
+ wenc16(*p10, *p11, i10, i11);
+ wenc16(i00, i10, *px, *p10);
+ wenc16(i01, i11, *p01, *p11);
+ }
+ }
+
+ //
+ // Encode (1D) odd column (still in Y loop)
+ //
+
+ if (nx & p) {
+ unsigned short *p10 = px + oy1;
+
+ if (w14)
+ wenc14(*px, *p10, i00, *p10);
+ else
+ wenc16(*px, *p10, i00, *p10);
+
+ *px = i00;
+ }
+ }
+
+ //
+ // Encode (1D) odd line (must loop in X)
+ //
+
+ if (ny & p) {
+ unsigned short *px = py;
+ unsigned short *ex = py + ox * (nx - p2);
+
+ for (; px <= ex; px += ox2) {
+ unsigned short *p01 = px + ox1;
+
+ if (w14)
+ wenc14(*px, *p01, i00, *p01);
+ else
+ wenc16(*px, *p01, i00, *p01);
+
+ *px = i00;
+ }
+ }
+
+ //
+ // Next level
+ //
+
+ p = p2;
+ p2 <<= 1;
+ }
+}
+#endif
+
+//
+// 2D Wavelet decoding:
+//
+
+void wav2Decode(unsigned short *in, // io: values are transformed in place
+ int nx, // i : x size
+ int ox, // i : x offset
+ int ny, // i : y size
+ int oy, // i : y offset
+ unsigned short mx) // i : maximum in[x][y] value
+{
+ bool w14 = (mx < (1 << 14));
+ int n = (nx > ny) ? ny : nx;
+ int p = 1;
+ int p2;
+
+ //
+ // Search max level
+ //
+
+ while (p <= n)
+ p <<= 1;
+
+ p >>= 1;
+ p2 = p;
+ p >>= 1;
+
+ //
+ // Hierarchical loop on smaller dimension n
+ //
+
+ while (p >= 1) {
+ unsigned short *py = in;
+ unsigned short *ey = in + oy * (ny - p2);
+ int oy1 = oy * p;
+ int oy2 = oy * p2;
+ int ox1 = ox * p;
+ int ox2 = ox * p2;
+ unsigned short i00, i01, i10, i11;
+
+ //
+ // Y loop
+ //
+
+ for (; py <= ey; py += oy2) {
+ unsigned short *px = py;
+ unsigned short *ex = py + ox * (nx - p2);
+
+ //
+ // X loop
+ //
+
+ for (; px <= ex; px += ox2) {
+ unsigned short *p01 = px + ox1;
+ unsigned short *p10 = px + oy1;
+ unsigned short *p11 = p10 + ox1;
+
+ //
+ // 2D wavelet decoding
+ //
+
+ if (w14) {
+ wdec14(*px, *p10, i00, i10);
+ wdec14(*p01, *p11, i01, i11);
+ wdec14(i00, i01, *px, *p01);
+ wdec14(i10, i11, *p10, *p11);
+ } else {
+ wdec16(*px, *p10, i00, i10);
+ wdec16(*p01, *p11, i01, i11);
+ wdec16(i00, i01, *px, *p01);
+ wdec16(i10, i11, *p10, *p11);
+ }
+ }
+
+ //
+ // Decode (1D) odd column (still in Y loop)
+ //
+
+ if (nx & p) {
+ unsigned short *p10 = px + oy1;
+
+ if (w14)
+ wdec14(*px, *p10, i00, *p10);
+ else
+ wdec16(*px, *p10, i00, *p10);
+
+ *px = i00;
+ }
+ }
+
+ //
+ // Decode (1D) odd line (must loop in X)
+ //
+
+ if (ny & p) {
+ unsigned short *px = py;
+ unsigned short *ex = py + ox * (nx - p2);
+
+ for (; px <= ex; px += ox2) {
+ unsigned short *p01 = px + ox1;
+
+ if (w14)
+ wdec14(*px, *p01, i00, *p01);
+ else
+ wdec16(*px, *p01, i00, *p01);
+
+ *px = i00;
+ }
+ }
+
+ //
+ // Next level
+ //
+
+ p2 = p;
+ p >>= 1;
+ }
+}
+
+//-----------------------------------------------------------------------------
+//
+// 16-bit Huffman compression and decompression.
+//
+// The source code in this file is derived from the 8-bit
+// Huffman compression and decompression routines written
+// by Christian Rouet for his PIZ image file format.
+//
+//-----------------------------------------------------------------------------
+
+// Adds some modification for tinyexr.
+
+const int HUF_ENCBITS = 16; // literal (value) bit length
+const int HUF_DECBITS = 14; // decoding bit size (>= 8)
+
+const int HUF_ENCSIZE = (1 << HUF_ENCBITS) + 1; // encoding table size
+const int HUF_DECSIZE = 1 << HUF_DECBITS; // decoding table size
+const int HUF_DECMASK = HUF_DECSIZE - 1;
+
+struct HufDec { // short code long code
+ //-------------------------------
+ int len : 8; // code length 0
+ int lit : 24; // lit p size
+ int *p; // 0 lits
+};
+
+inline long long hufLength(long long code) { return code & 63; }
+
+inline long long hufCode(long long code) { return code >> 6; }
+
+#if 0
+inline void outputBits(int nBits, long long bits, long long &c, int &lc,
+ char *&out) {
+ c <<= nBits;
+ lc += nBits;
+
+ c |= bits;
+
+ while (lc >= 8)
+ *out++ = (c >> (lc -= 8));
+}
+#endif
+
+inline long long getBits(int nBits, long long &c, int &lc, const char *&in) {
+ while (lc < nBits) {
+ c = (c << 8) | *(unsigned char *)(in++);
+ lc += 8;
+ }
+
+ lc -= nBits;
+ return (c >> lc) & ((1 << nBits) - 1);
+}
+
+//
+// ENCODING TABLE BUILDING & (UN)PACKING
+//
+
+//
+// Build a "canonical" Huffman code table:
+// - for each (uncompressed) symbol, hcode contains the length
+// of the corresponding code (in the compressed data)
+// - canonical codes are computed and stored in hcode
+// - the rules for constructing canonical codes are as follows:
+// * shorter codes (if filled with zeroes to the right)
+// have a numerically higher value than longer codes
+// * for codes with the same length, numerical values
+// increase with numerical symbol values
+// - because the canonical code table can be constructed from
+// symbol lengths alone, the code table can be transmitted
+// without sending the actual code values
+// - see http://www.compressconsult.com/huffman/
+//
+
+void hufCanonicalCodeTable(long long hcode[HUF_ENCSIZE]) {
+ long long n[59];
+
+ //
+ // For each i from 0 through 58, count the
+ // number of different codes of length i, and
+ // store the count in n[i].
+ //
+
+ for (int i = 0; i <= 58; ++i)
+ n[i] = 0;
+
+ for (int i = 0; i < HUF_ENCSIZE; ++i)
+ n[hcode[i]] += 1;
+
+ //
+ // For each i from 58 through 1, compute the
+ // numerically lowest code with length i, and
+ // store that code in n[i].
+ //
+
+ long long c = 0;
+
+ for (int i = 58; i > 0; --i) {
+ long long nc = ((c + n[i]) >> 1);
+ n[i] = c;
+ c = nc;
+ }
+
+ //
+ // hcode[i] contains the length, l, of the
+ // code for symbol i. Assign the next available
+ // code of length l to the symbol and store both
+ // l and the code in hcode[i].
+ //
+
+ for (int i = 0; i < HUF_ENCSIZE; ++i) {
+ int l = hcode[i];
+
+ if (l > 0)
+ hcode[i] = l | (n[l]++ << 6);
+ }
+}
+
+//
+// Compute Huffman codes (based on frq input) and store them in frq:
+// - code structure is : [63:lsb - 6:msb] | [5-0: bit length];
+// - max code length is 58 bits;
+// - codes outside the range [im-iM] have a null length (unused values);
+// - original frequencies are destroyed;
+// - encoding tables are used by hufEncode() and hufBuildDecTable();
+//
+#if 0 // @todo
+
+struct FHeapCompare {
+ bool operator()(long long *a, long long *b) { return *a > *b; }
+};
+
+void hufBuildEncTable(
+ long long *frq, // io: input frequencies [HUF_ENCSIZE], output table
+ int *im, // o: min frq index
+ int *iM) // o: max frq index
+{
+ //
+ // This function assumes that when it is called, array frq
+ // indicates the frequency of all possible symbols in the data
+ // that are to be Huffman-encoded. (frq[i] contains the number
+ // of occurrences of symbol i in the data.)
+ //
+ // The loop below does three things:
+ //
+ // 1) Finds the minimum and maximum indices that point
+ // to non-zero entries in frq:
+ //
+ // frq[im] != 0, and frq[i] == 0 for all i < im
+ // frq[iM] != 0, and frq[i] == 0 for all i > iM
+ //
+ // 2) Fills array fHeap with pointers to all non-zero
+ // entries in frq.
+ //
+ // 3) Initializes array hlink such that hlink[i] == i
+ // for all array entries.
+ //
+
+ int hlink[HUF_ENCSIZE];
+ long long *fHeap[HUF_ENCSIZE];
+
+ *im = 0;
+
+ while (!frq[*im])
+ (*im)++;
+
+ int nf = 0;
+
+ for (int i = *im; i < HUF_ENCSIZE; i++) {
+ hlink[i] = i;
+
+ if (frq[i]) {
+ fHeap[nf] = &frq[i];
+ nf++;
+ *iM = i;
+ }
+ }
+
+ //
+ // Add a pseudo-symbol, with a frequency count of 1, to frq;
+ // adjust the fHeap and hlink array accordingly. Function
+ // hufEncode() uses the pseudo-symbol for run-length encoding.
+ //
+
+ (*iM)++;
+ frq[*iM] = 1;
+ fHeap[nf] = &frq[*iM];
+ nf++;
+
+ //
+ // Build an array, scode, such that scode[i] contains the number
+ // of bits assigned to symbol i. Conceptually this is done by
+ // constructing a tree whose leaves are the symbols with non-zero
+ // frequency:
+ //
+ // Make a heap that contains all symbols with a non-zero frequency,
+ // with the least frequent symbol on top.
+ //
+ // Repeat until only one symbol is left on the heap:
+ //
+ // Take the two least frequent symbols off the top of the heap.
+ // Create a new node that has first two nodes as children, and
+ // whose frequency is the sum of the frequencies of the first
+ // two nodes. Put the new node back into the heap.
+ //
+ // The last node left on the heap is the root of the tree. For each
+ // leaf node, the distance between the root and the leaf is the length
+ // of the code for the corresponding symbol.
+ //
+ // The loop below doesn't actually build the tree; instead we compute
+ // the distances of the leaves from the root on the fly. When a new
+ // node is added to the heap, then that node's descendants are linked
+ // into a single linear list that starts at the new node, and the code
+ // lengths of the descendants (that is, their distance from the root
+ // of the tree) are incremented by one.
+ //
+
+ std::make_heap(&fHeap[0], &fHeap[nf], FHeapCompare());
+
+ long long scode[HUF_ENCSIZE];
+ memset(scode, 0, sizeof(long long) * HUF_ENCSIZE);
+
+ while (nf > 1) {
+ //
+ // Find the indices, mm and m, of the two smallest non-zero frq
+ // values in fHeap, add the smallest frq to the second-smallest
+ // frq, and remove the smallest frq value from fHeap.
+ //
+
+ int mm = fHeap[0] - frq;
+ std::pop_heap(&fHeap[0], &fHeap[nf], FHeapCompare());
+ --nf;
+
+ int m = fHeap[0] - frq;
+ std::pop_heap(&fHeap[0], &fHeap[nf], FHeapCompare());
+
+ frq[m] += frq[mm];
+ std::push_heap(&fHeap[0], &fHeap[nf], FHeapCompare());
+
+ //
+ // The entries in scode are linked into lists with the
+ // entries in hlink serving as "next" pointers and with
+ // the end of a list marked by hlink[j] == j.
+ //
+ // Traverse the lists that start at scode[m] and scode[mm].
+ // For each element visited, increment the length of the
+ // corresponding code by one bit. (If we visit scode[j]
+ // during the traversal, then the code for symbol j becomes
+ // one bit longer.)
+ //
+ // Merge the lists that start at scode[m] and scode[mm]
+ // into a single list that starts at scode[m].
+ //
+
+ //
+ // Add a bit to all codes in the first list.
+ //
+
+ for (int j = m; true; j = hlink[j]) {
+ scode[j]++;
+
+ assert(scode[j] <= 58);
+
+ if (hlink[j] == j) {
+ //
+ // Merge the two lists.
+ //
+
+ hlink[j] = mm;
+ break;
+ }
+ }
+
+ //
+ // Add a bit to all codes in the second list
+ //
+
+ for (int j = mm; true; j = hlink[j]) {
+ scode[j]++;
+
+ assert(scode[j] <= 58);
+
+ if (hlink[j] == j)
+ break;
+ }
+ }
+
+ //
+ // Build a canonical Huffman code table, replacing the code
+ // lengths in scode with (code, code length) pairs. Copy the
+ // code table from scode into frq.
+ //
+
+ hufCanonicalCodeTable(scode);
+ memcpy(frq, scode, sizeof(long long) * HUF_ENCSIZE);
+}
+#endif
+
+//
+// Pack an encoding table:
+// - only code lengths, not actual codes, are stored
+// - runs of zeroes are compressed as follows:
+//
+// unpacked packed
+// --------------------------------
+// 1 zero 0 (6 bits)
+// 2 zeroes 59
+// 3 zeroes 60
+// 4 zeroes 61
+// 5 zeroes 62
+// n zeroes (6 or more) 63 n-6 (6 + 8 bits)
+//
+
+const int SHORT_ZEROCODE_RUN = 59;
+const int LONG_ZEROCODE_RUN = 63;
+const int SHORTEST_LONG_RUN = 2 + LONG_ZEROCODE_RUN - SHORT_ZEROCODE_RUN;
+// const int LONGEST_LONG_RUN = 255 + SHORTEST_LONG_RUN;
+
+#if 0
+void hufPackEncTable(const long long *hcode, // i : encoding table [HUF_ENCSIZE]
+ int im, // i : min hcode index
+ int iM, // i : max hcode index
+ char **pcode) // o: ptr to packed table (updated)
+{
+ char *p = *pcode;
+ long long c = 0;
+ int lc = 0;
+
+ for (; im <= iM; im++) {
+ int l = hufLength(hcode[im]);
+
+ if (l == 0) {
+ int zerun = 1;
+
+ while ((im < iM) && (zerun < LONGEST_LONG_RUN)) {
+ if (hufLength(hcode[im + 1]) > 0)
+ break;
+ im++;
+ zerun++;
+ }
+
+ if (zerun >= 2) {
+ if (zerun >= SHORTEST_LONG_RUN) {
+ outputBits(6, LONG_ZEROCODE_RUN, c, lc, p);
+ outputBits(8, zerun - SHORTEST_LONG_RUN, c, lc, p);
+ } else {
+ outputBits(6, SHORT_ZEROCODE_RUN + zerun - 2, c, lc, p);
+ }
+ continue;
+ }
+ }
+
+ outputBits(6, l, c, lc, p);
+ }
+
+ if (lc > 0)
+ *p++ = (unsigned char)(c << (8 - lc));
+
+ *pcode = p;
+}
+#endif
+
+//
+// Unpack an encoding table packed by hufPackEncTable():
+//
+
+bool hufUnpackEncTable(const char **pcode, // io: ptr to packed table (updated)
+ int ni, // i : input size (in bytes)
+ int im, // i : min hcode index
+ int iM, // i : max hcode index
+ long long *hcode) // o: encoding table [HUF_ENCSIZE]
+{
+ memset(hcode, 0, sizeof(long long) * HUF_ENCSIZE);
+
+ const char *p = *pcode;
+ long long c = 0;
+ int lc = 0;
+
+ for (; im <= iM; im++) {
+ if (p - *pcode > ni) {
+ return false;
+ }
+
+ long long l = hcode[im] = getBits(6, c, lc, p); // code length
+
+ if (l == (long long)LONG_ZEROCODE_RUN) {
+ if (p - *pcode > ni) {
+ return false;
+ }
+
+ int zerun = getBits(8, c, lc, p) + SHORTEST_LONG_RUN;
+
+ if (im + zerun > iM + 1) {
+ return false;
+ }
+
+ while (zerun--)
+ hcode[im++] = 0;
+
+ im--;
+ } else if (l >= (long long)SHORT_ZEROCODE_RUN) {
+ int zerun = l - SHORT_ZEROCODE_RUN + 2;
+
+ if (im + zerun > iM + 1) {
+ return false;
+ }
+
+ while (zerun--)
+ hcode[im++] = 0;
+
+ im--;
+ }
+ }
+
+ *pcode = const_cast<char *>(p);
+
+ hufCanonicalCodeTable(hcode);
+
+ return true;
+}
+
+//
+// DECODING TABLE BUILDING
+//
+
+//
+// Clear a newly allocated decoding table so that it contains only zeroes.
+//
+
+void hufClearDecTable(HufDec *hdecod) // io: (allocated by caller)
+ // decoding table [HUF_DECSIZE]
+{
+ for (int i = 0; i < HUF_DECSIZE; i++) {
+ hdecod[i].len = 0;
+ hdecod[i].lit = 0;
+ hdecod[i].p = NULL;
+ }
+ // memset(hdecod, 0, sizeof(HufDec) * HUF_DECSIZE);
+}
+
+//
+// Build a decoding hash table based on the encoding table hcode:
+// - short codes (<= HUF_DECBITS) are resolved with a single table access;
+// - long code entry allocations are not optimized, because long codes are
+// unfrequent;
+// - decoding tables are used by hufDecode();
+//
+
+bool hufBuildDecTable(const long long *hcode, // i : encoding table
+ int im, // i : min index in hcode
+ int iM, // i : max index in hcode
+ HufDec *hdecod) // o: (allocated by caller)
+// decoding table [HUF_DECSIZE]
+{
+ //
+ // Init hashtable & loop on all codes.
+ // Assumes that hufClearDecTable(hdecod) has already been called.
+ //
+
+ for (; im <= iM; im++) {
+ long long c = hufCode(hcode[im]);
+ int l = hufLength(hcode[im]);
+
+ if (c >> l) {
+ //
+ // Error: c is supposed to be an l-bit code,
+ // but c contains a value that is greater
+ // than the largest l-bit number.
+ //
+
+ // invalidTableEntry();
+ return false;
+ }
+
+ if (l > HUF_DECBITS) {
+ //
+ // Long code: add a secondary entry
+ //
+
+ HufDec *pl = hdecod + (c >> (l - HUF_DECBITS));
+
+ if (pl->len) {
+ //
+ // Error: a short code has already
+ // been stored in table entry *pl.
+ //
+
+ // invalidTableEntry();
+ return false;
+ }
+
+ pl->lit++;
+
+ if (pl->p) {
+ int *p = pl->p;
+ pl->p = new int[pl->lit];
+
+ for (int i = 0; i < pl->lit - 1; ++i)
+ pl->p[i] = p[i];
+
+ delete[] p;
+ } else {
+ pl->p = new int[1];
+ }
+
+ pl->p[pl->lit - 1] = im;
+ } else if (l) {
+ //
+ // Short code: init all primary entries
+ //
+
+ HufDec *pl = hdecod + (c << (HUF_DECBITS - l));
+
+ for (long long i = 1 << (HUF_DECBITS - l); i > 0; i--, pl++) {
+ if (pl->len || pl->p) {
+ //
+ // Error: a short code or a long code has
+ // already been stored in table entry *pl.
+ //
+
+ // invalidTableEntry();
+ return false;
+ }
+
+ pl->len = l;
+ pl->lit = im;
+ }
+ }
+ }
+
+ return true;
+}
+
+//
+// Free the long code entries of a decoding table built by hufBuildDecTable()
+//
+
+void hufFreeDecTable(HufDec *hdecod) // io: Decoding table
+{
+ for (int i = 0; i < HUF_DECSIZE; i++) {
+ if (hdecod[i].p) {
+ delete[] hdecod[i].p;
+ hdecod[i].p = 0;
+ }
+ }
+}
+
+//
+// ENCODING
+//
+
+#if 0 // @todo
+inline void outputCode(long long code, long long &c, int &lc, char *&out) {
+ outputBits(hufLength(code), hufCode(code), c, lc, out);
+}
+
+inline void sendCode(long long sCode, int runCount, long long runCode,
+ long long &c, int &lc, char *&out) {
+ //
+ // Output a run of runCount instances of the symbol sCount.
+ // Output the symbols explicitly, or if that is shorter, output
+ // the sCode symbol once followed by a runCode symbol and runCount
+ // expressed as an 8-bit number.
+ //
+
+ if (hufLength(sCode) + hufLength(runCode) + 8 < hufLength(sCode) * runCount) {
+ outputCode(sCode, c, lc, out);
+ outputCode(runCode, c, lc, out);
+ outputBits(8, runCount, c, lc, out);
+ } else {
+ while (runCount-- >= 0)
+ outputCode(sCode, c, lc, out);
+ }
+}
+
+//
+// Encode (compress) ni values based on the Huffman encoding table hcode:
+//
+
+int hufEncode // return: output size (in bits)
+ (const long long *hcode, // i : encoding table
+ const unsigned short *in, // i : uncompressed input buffer
+ const int ni, // i : input buffer size (in bytes)
+ int rlc, // i : rl code
+ char *out) // o: compressed output buffer
+{
+ char *outStart = out;
+ long long c = 0; // bits not yet written to out
+ int lc = 0; // number of valid bits in c (LSB)
+ int s = in[0];
+ int cs = 0;
+
+ //
+ // Loop on input values
+ //
+
+ for (int i = 1; i < ni; i++) {
+ //
+ // Count same values or send code
+ //
+
+ if (s == in[i] && cs < 255) {
+ cs++;
+ } else {
+ sendCode(hcode[s], cs, hcode[rlc], c, lc, out);
+ cs = 0;
+ }
+
+ s = in[i];
+ }
+
+ //
+ // Send remaining code
+ //
+
+ sendCode(hcode[s], cs, hcode[rlc], c, lc, out);
+
+ if (lc)
+ *out = (c << (8 - lc)) & 0xff;
+
+ return (out - outStart) * 8 + lc;
+}
+#endif
+
+//
+// DECODING
+//
+
+//
+// In order to force the compiler to inline them,
+// getChar() and getCode() are implemented as macros
+// instead of "inline" functions.
+//
+
+#define getChar(c, lc, in) \
+ { \
+ c = (c << 8) | *(unsigned char *)(in++); \
+ lc += 8; \
+ }
+
+#define getCode(po, rlc, c, lc, in, out, oe) \
+ { \
+ if (po == rlc) { \
+ if (lc < 8) \
+ getChar(c, lc, in); \
+ \
+ lc -= 8; \
+ \
+ unsigned char cs = (c >> lc); \
+ \
+ if (out + cs > oe) \
+ return false; \
+ \
+ unsigned short s = out[-1]; \
+ \
+ while (cs-- > 0) \
+ *out++ = s; \
+ } else if (out < oe) { \
+ *out++ = po; \
+ } else { \
+ return false; \
+ } \
+ }
+
+//
+// Decode (uncompress) ni bits based on encoding & decoding tables:
+//
+
+bool hufDecode(const long long *hcode, // i : encoding table
+ const HufDec *hdecod, // i : decoding table
+ const char *in, // i : compressed input buffer
+ int ni, // i : input size (in bits)
+ int rlc, // i : run-length code
+ int no, // i : expected output size (in bytes)
+ unsigned short *out) // o: uncompressed output buffer
+{
+ long long c = 0;
+ int lc = 0;
+ unsigned short *outb = out;
+ unsigned short *oe = out + no;
+ const char *ie = in + (ni + 7) / 8; // input byte size
+
+ //
+ // Loop on input bytes
+ //
+
+ while (in < ie) {
+ getChar(c, lc, in);
+
+ //
+ // Access decoding table
+ //
+
+ while (lc >= HUF_DECBITS) {
+ const HufDec pl = hdecod[(c >> (lc - HUF_DECBITS)) & HUF_DECMASK];
+
+ if (pl.len) {
+ //
+ // Get short code
+ //
+
+ lc -= pl.len;
+ getCode(pl.lit, rlc, c, lc, in, out, oe);
+ } else {
+ if (!pl.p) {
+ return false;
+ }
+ // invalidCode(); // wrong code
+
+ //
+ // Search long code
+ //
+
+ int j;
+
+ for (j = 0; j < pl.lit; j++) {
+ int l = hufLength(hcode[pl.p[j]]);
+
+ while (lc < l && in < ie) // get more bits
+ getChar(c, lc, in);
+
+ if (lc >= l) {
+ if (hufCode(hcode[pl.p[j]]) ==
+ ((c >> (lc - l)) & (((long long)(1) << l) - 1))) {
+ //
+ // Found : get long code
+ //
+
+ lc -= l;
+ getCode(pl.p[j], rlc, c, lc, in, out, oe);
+ break;
+ }
+ }
+ }
+
+ if (j == pl.lit) {
+ return false;
+ // invalidCode(); // Not found
+ }
+ }
+ }
+ }
+
+ //
+ // Get remaining (short) codes
+ //
+
+ int i = (8 - ni) & 7;
+ c >>= i;
+ lc -= i;
+
+ while (lc > 0) {
+ const HufDec pl = hdecod[(c << (HUF_DECBITS - lc)) & HUF_DECMASK];
+
+ if (pl.len) {
+ lc -= pl.len;
+ getCode(pl.lit, rlc, c, lc, in, out, oe);
+ } else {
+ return false;
+ // invalidCode(); // wrong (long) code
+ }
+ }
+
+ if (out - outb != no) {
+ return false;
+ }
+ // notEnoughData ();
+
+ return true;
+}
+
+#if 0 // @todo
+void countFrequencies(long long freq[HUF_ENCSIZE],
+ const unsigned short data[/*n*/], int n) {
+ for (int i = 0; i < HUF_ENCSIZE; ++i)
+ freq[i] = 0;
+
+ for (int i = 0; i < n; ++i)
+ ++freq[data[i]];
+}
+
+void writeUInt(char buf[4], unsigned int i) {
+ unsigned char *b = (unsigned char *)buf;
+
+ b[0] = i;
+ b[1] = i >> 8;
+ b[2] = i >> 16;
+ b[3] = i >> 24;
+}
+#endif
+
+unsigned int readUInt(const char buf[4]) {
+ const unsigned char *b = (const unsigned char *)buf;
+
+ return (b[0] & 0x000000ff) | ((b[1] << 8) & 0x0000ff00) |
+ ((b[2] << 16) & 0x00ff0000) | ((b[3] << 24) & 0xff000000);
+}
+
+//
+// EXTERNAL INTERFACE
+//
+
+#if 0 // @todo
+int hufCompress(const unsigned short raw[], int nRaw, char compressed[]) {
+ if (nRaw == 0)
+ return 0;
+
+ long long freq[HUF_ENCSIZE];
+
+ countFrequencies(freq, raw, nRaw);
+
+ int im = 0;
+ int iM = 0;
+ hufBuildEncTable(freq, &im, &iM);
+
+ char *tableStart = compressed + 20;
+ char *tableEnd = tableStart;
+ hufPackEncTable(freq, im, iM, &tableEnd);
+ int tableLength = tableEnd - tableStart;
+
+ char *dataStart = tableEnd;
+ int nBits = hufEncode(freq, raw, nRaw, iM, dataStart);
+ int dataLength = (nBits + 7) / 8;
+
+ writeUInt(compressed, im);
+ writeUInt(compressed + 4, iM);
+ writeUInt(compressed + 8, tableLength);
+ writeUInt(compressed + 12, nBits);
+ writeUInt(compressed + 16, 0); // room for future extensions
+
+ return dataStart + dataLength - compressed;
+}
+#endif
+
+bool hufUncompress(const char compressed[], int nCompressed,
+ unsigned short raw[], int nRaw) {
+ if (nCompressed == 0) {
+ if (nRaw != 0)
+ return false;
+
+ return false;
+ }
+
+ int im = readUInt(compressed);
+ int iM = readUInt(compressed + 4);
+ // int tableLength = readUInt (compressed + 8);
+ int nBits = readUInt(compressed + 12);
+
+ if (im < 0 || im >= HUF_ENCSIZE || iM < 0 || iM >= HUF_ENCSIZE)
+ return false;
+
+ const char *ptr = compressed + 20;
+
+ //
+ // Fast decoder needs at least 2x64-bits of compressed data, and
+ // needs to be run-able on this platform. Otherwise, fall back
+ // to the original decoder
+ //
+
+ // if (FastHufDecoder::enabled() && nBits > 128)
+ //{
+ // FastHufDecoder fhd (ptr, nCompressed - (ptr - compressed), im, iM, iM);
+ // fhd.decode ((unsigned char*)ptr, nBits, raw, nRaw);
+ //}
+ // else
+ {
+ std::vector<long long> freq(HUF_ENCSIZE);
+ std::vector<HufDec> hdec(HUF_DECSIZE);
+
+ hufClearDecTable(&hdec.at(0));
+
+ hufUnpackEncTable(&ptr, nCompressed - (ptr - compressed), im, iM,
+ &freq.at(0));
+
+ {
+ if (nBits > 8 * (nCompressed - (ptr - compressed))) {
+ return false;
+ }
+
+ hufBuildDecTable(&freq.at(0), im, iM, &hdec.at(0));
+ hufDecode(&freq.at(0), &hdec.at(0), ptr, nBits, iM, nRaw, raw);
+ }
+ // catch (...)
+ //{
+ // hufFreeDecTable (hdec);
+ // throw;
+ //}
+
+ hufFreeDecTable(&hdec.at(0));
+ }
+
+ return true;
+}
+
+//
+// Functions to compress the range of values in the pixel data
+//
+
+const int USHORT_RANGE = (1 << 16);
+const int BITMAP_SIZE = (USHORT_RANGE >> 3);
+
+#if 0 // @todo
+
+void bitmapFromData(const unsigned short data[/*nData*/], int nData,
+ unsigned char bitmap[BITMAP_SIZE],
+ unsigned short &minNonZero, unsigned short &maxNonZero) {
+ for (int i = 0; i < BITMAP_SIZE; ++i)
+ bitmap[i] = 0;
+
+ for (int i = 0; i < nData; ++i)
+ bitmap[data[i] >> 3] |= (1 << (data[i] & 7));
+
+ bitmap[0] &= ~1; // zero is not explicitly stored in
+ // the bitmap; we assume that the
+ // data always contain zeroes
+ minNonZero = BITMAP_SIZE - 1;
+ maxNonZero = 0;
+
+ for (int i = 0; i < BITMAP_SIZE; ++i) {
+ if (bitmap[i]) {
+ if (minNonZero > i)
+ minNonZero = i;
+ if (maxNonZero < i)
+ maxNonZero = i;
+ }
+ }
+}
+
+unsigned short forwardLutFromBitmap(const unsigned char bitmap[BITMAP_SIZE],
+ unsigned short lut[USHORT_RANGE]) {
+ int k = 0;
+
+ for (int i = 0; i < USHORT_RANGE; ++i) {
+ if ((i == 0) || (bitmap[i >> 3] & (1 << (i & 7))))
+ lut[i] = k++;
+ else
+ lut[i] = 0;
+ }
+
+ return k - 1; // maximum value stored in lut[],
+} // i.e. number of ones in bitmap minus 1
+#endif
+
+unsigned short reverseLutFromBitmap(const unsigned char bitmap[BITMAP_SIZE],
+ unsigned short lut[USHORT_RANGE]) {
+ int k = 0;
+
+ for (int i = 0; i < USHORT_RANGE; ++i) {
+ if ((i == 0) || (bitmap[i >> 3] & (1 << (i & 7))))
+ lut[k++] = i;
+ }
+
+ int n = k - 1;
+
+ while (k < USHORT_RANGE)
+ lut[k++] = 0;
+
+ return n; // maximum k where lut[k] is non-zero,
+} // i.e. number of ones in bitmap minus 1
+
+void applyLut(const unsigned short lut[USHORT_RANGE],
+ unsigned short data[/*nData*/], int nData) {
+ for (int i = 0; i < nData; ++i)
+ data[i] = lut[data[i]];
+}
+
+#if 0 // @todo
+bool CompressPiz(unsigned char *outPtr, unsigned int &outSize) {
+ unsigned char bitmap[BITMAP_SIZE];
+ unsigned short minNonZero;
+ unsigned short maxNonZero;
+
+ if (IsBigEndian()) {
+ // @todo { PIZ compression on BigEndian architecture. }
+ assert(0);
+ return false;
+ }
+
+ std::vector<unsigned short> tmpBuffer;
+ int nData = tmpBuffer.size();
+
+ bitmapFromData(&tmpBuffer.at(0), nData, bitmap, minNonZero, maxNonZero);
+
+ unsigned short lut[USHORT_RANGE];
+ //unsigned short maxValue = forwardLutFromBitmap(bitmap, lut);
+ applyLut(lut, &tmpBuffer.at(0), nData);
+
+ //
+ // Store range compression info in _outBuffer
+ //
+
+ char *buf = reinterpret_cast<char *>(outPtr);
+
+ memcpy(buf, &minNonZero, sizeof(unsigned short));
+ buf += sizeof(unsigned short);
+ memcpy(buf, &maxNonZero, sizeof(unsigned short));
+ buf += sizeof(unsigned short);
+
+ if (minNonZero <= maxNonZero) {
+ memcpy(buf, (char *)&bitmap[0] + minNonZero, maxNonZero - minNonZero + 1);
+ buf += maxNonZero - minNonZero + 1;
+ }
+
+#if 0 // @todo
+ //
+ // Apply wavelet encoding
+ //
+
+ for (int i = 0; i < channels; ++i)
+ {
+ ChannelData &cd = _channelData[i];
+
+ for (int j = 0; j < cd.size; ++j)
+ {
+ wav2Encode (cd.start + j,
+ cd.nx, cd.size,
+ cd.ny, cd.nx * cd.size,
+ maxValue);
+ }
+ }
+
+ //
+ // Apply Huffman encoding; append the result to _outBuffer
+ //
+
+ char *lengthPtr = buf;
+ int zero = 0;
+ memcpy(buf, &zero, sizeof(int)); buf += sizeof(int);
+
+ int length = hufCompress (_tmpBuffer, tmpBufferEnd - _tmpBuffer, buf);
+ memcpy(lengthPtr, tmpBuffer, length);
+ //Xdr::write <CharPtrIO> (lengthPtr, length);
+
+ outPtr = _outBuffer;
+ return buf - _outBuffer + length;
+#endif
+ assert(0);
+
+ return true;
+}
+#endif
+
+bool DecompressPiz(unsigned char *outPtr, unsigned int &,
+ const unsigned char *inPtr, size_t tmpBufSize,
+ const std::vector<ChannelInfo> &channelInfo, int dataWidth,
+ int numLines) {
+ unsigned char bitmap[BITMAP_SIZE];
+ unsigned short minNonZero;
+ unsigned short maxNonZero;
+
+ if (IsBigEndian()) {
+ // @todo { PIZ compression on BigEndian architecture. }
+ assert(0);
+ return false;
+ }
+
+ memset(bitmap, 0, BITMAP_SIZE);
+
+ const unsigned char *ptr = inPtr;
+ minNonZero = *(reinterpret_cast<const unsigned short *>(ptr));
+ maxNonZero = *(reinterpret_cast<const unsigned short *>(ptr + 2));
+ ptr += 4;
+
+ if (maxNonZero >= BITMAP_SIZE) {
+ return false;
+ }
+
+ if (minNonZero <= maxNonZero) {
+ memcpy((char *)&bitmap[0] + minNonZero, ptr, maxNonZero - minNonZero + 1);
+ ptr += maxNonZero - minNonZero + 1;
+ }
+
+ unsigned short lut[USHORT_RANGE];
+ memset(lut, 0, sizeof(unsigned short) * USHORT_RANGE);
+ unsigned short maxValue = reverseLutFromBitmap(bitmap, lut);
+
+ //
+ // Huffman decoding
+ //
+
+ int length;
+
+ length = *(reinterpret_cast<const int *>(ptr));
+ ptr += sizeof(int);
+
+ std::vector<unsigned short> tmpBuffer(tmpBufSize);
+ hufUncompress(reinterpret_cast<const char *>(ptr), length, &tmpBuffer.at(0),
+ tmpBufSize);
+
+ //
+ // Wavelet decoding
+ //
+
+ std::vector<PIZChannelData> channelData(channelInfo.size());
+
+ unsigned short *tmpBufferEnd = &tmpBuffer.at(0);
+
+ for (size_t i = 0; i < channelInfo.size(); ++i) {
+ const ChannelInfo &chan = channelInfo[i];
+
+ int pixelSize = sizeof(int); // UINT and FLOAT
+ if (chan.pixelType == TINYEXR_PIXELTYPE_HALF) {
+ pixelSize = sizeof(short);
+ }
+
+ channelData[i].start = tmpBufferEnd;
+ channelData[i].end = channelData[i].start;
+ channelData[i].nx = dataWidth;
+ channelData[i].ny = numLines;
+ // channelData[i].ys = 1;
+ channelData[i].size = pixelSize / sizeof(short);
+
+ tmpBufferEnd += channelData[i].nx * channelData[i].ny * channelData[i].size;
+ }
+
+ for (size_t i = 0; i < channelData.size(); ++i) {
+ PIZChannelData &cd = channelData[i];
+
+ for (int j = 0; j < cd.size; ++j) {
+ wav2Decode(cd.start + j, cd.nx, cd.size, cd.ny, cd.nx * cd.size,
+ maxValue);
+ }
+ }
+
+ //
+ // Expand the pixel data to their original range
+ //
+
+ applyLut(lut, &tmpBuffer.at(0), tmpBufSize);
+
+ // @todo { Xdr }
+
+ for (int y = 0; y < numLines; y++) {
+ for (size_t i = 0; i < channelData.size(); ++i) {
+ PIZChannelData &cd = channelData[i];
+
+ // if (modp (y, cd.ys) != 0)
+ // continue;
+
+ int n = cd.nx * cd.size;
+ memcpy(outPtr, cd.end, n * sizeof(unsigned short));
+ outPtr += n * sizeof(unsigned short);
+ cd.end += n;
+ }
+ }
+
+ return true;
+}
+//
+// -----------------------------------------------------------------
+//
+
+} // namespace
+
+int LoadEXR(float **out_rgba, int *width, int *height, const char *filename,
+ const char **err) {
+
+ if (out_rgba == NULL) {
+ if (err) {
+ (*err) = "Invalid argument.\n";
+ }
+ return -1;
+ }
+
+ EXRImage exrImage;
+ InitEXRImage(&exrImage);
+
+ {
+ int ret = ParseMultiChannelEXRHeaderFromFile(&exrImage, filename, err);
+ if (ret != 0) {
+ return ret;
+ }
+ }
+
+ // Read HALF channel as FLOAT.
+ for (int i = 0; i < exrImage.num_channels; i++) {
+ if (exrImage.pixel_types[i] == TINYEXR_PIXELTYPE_HALF) {
+ exrImage.requested_pixel_types[i] = TINYEXR_PIXELTYPE_FLOAT;
+ }
+ }
+
+ {
+ int ret = LoadMultiChannelEXRFromFile(&exrImage, filename, err);
+ if (ret != 0) {
+ return ret;
+ }
+ }
+
+ // RGBA
+ int idxR = -1;
+ int idxG = -1;
+ int idxB = -1;
+ int idxA = -1;
+ for (int c = 0; c < exrImage.num_channels; c++) {
+ if (strcmp(exrImage.channel_names[c], "R") == 0) {
+ idxR = c;
+ } else if (strcmp(exrImage.channel_names[c], "G") == 0) {
+ idxG = c;
+ } else if (strcmp(exrImage.channel_names[c], "B") == 0) {
+ idxB = c;
+ } else if (strcmp(exrImage.channel_names[c], "A") == 0) {
+ idxA = c;
+ }
+ }
+
+ if (idxR == -1) {
+ if (err) {
+ (*err) = "R channel not found\n";
+ }
+
+ // @todo { free exrImage }
+ return -1;
+ }
+
+ if (idxG == -1) {
+ if (err) {
+ (*err) = "G channel not found\n";
+ }
+ // @todo { free exrImage }
+ return -1;
+ }
+
+ if (idxB == -1) {
+ if (err) {
+ (*err) = "B channel not found\n";
+ }
+ // @todo { free exrImage }
+ return -1;
+ }
+
+ (*out_rgba) =
+ (float *)malloc(4 * sizeof(float) * exrImage.width * exrImage.height);
+ for (int i = 0; i < exrImage.width * exrImage.height; i++) {
+ (*out_rgba)[4 * i + 0] =
+ reinterpret_cast<float **>(exrImage.images)[idxR][i];
+ (*out_rgba)[4 * i + 1] =
+ reinterpret_cast<float **>(exrImage.images)[idxG][i];
+ (*out_rgba)[4 * i + 2] =
+ reinterpret_cast<float **>(exrImage.images)[idxB][i];
+ if (idxA > 0) {
+ (*out_rgba)[4 * i + 3] =
+ reinterpret_cast<float **>(exrImage.images)[idxA][i];
+ } else {
+ (*out_rgba)[4 * i + 3] = 1.0;
+ }
+ }
+
+ (*width) = exrImage.width;
+ (*height) = exrImage.height;
+
+ // @todo { free exrImage }
+ return 0;
+}
+
+int ParseEXRHeaderFromMemory(EXRAttribute *customAttributes,
+ int *numCustomAttributes, int *width, int *height,
+ const unsigned char *memory) {
+
+ if (memory == NULL) {
+ // Invalid argument
+ return -1;
+ }
+
+ const char *buf = reinterpret_cast<const char *>(memory);
+
+ const char *marker = &buf[0];
+
+ // Header check.
+ {
+ const char header[] = {0x76, 0x2f, 0x31, 0x01};
+
+ if (memcmp(marker, header, 4) != 0) {
+ // if (err) {
+ // (*err) = "Header mismatch.";
+ //}
+ return -3;
+ }
+ marker += 4;
+ }
+
+ // Version, scanline.
+ {
+ // must be [2, 0, 0, 0]
+ if (marker[0] != 2 || marker[1] != 0 || marker[2] != 0 || marker[3] != 0) {
+ // if (err) {
+ // (*err) = "Unsupported version or scanline.";
+ //}
+ return -4;
+ }
+
+ marker += 4;
+ }
+
+ int dx = -1;
+ int dy = -1;
+ int dw = -1;
+ int dh = -1;
+ int lineOrder = 0; // @fixme
+ int displayWindow[4] = {-1, -1, -1, -1}; // @fixme
+ float screenWindowCenter[2] = {0.0f, 0.0f}; // @fixme
+ float screenWindowWidth = 1.0f; // @fixme
+ int numChannels = -1;
+ float pixelAspectRatio = 1.0f; // @fixme
+ std::vector<ChannelInfo> channels;
+ std::vector<EXRAttribute> attribs;
+
+ if (numCustomAttributes) {
+ (*numCustomAttributes) = 0;
+ }
+
+ // Read attributes
+ for (;;) {
+ std::string attrName;
+ std::string attrType;
+ std::vector<unsigned char> data;
+ const char *marker_next = ReadAttribute(attrName, attrType, data, marker);
+ if (marker_next == NULL) {
+ marker++; // skip '\0'
+ break;
+ }
+
+ if (attrName.compare("compression") == TINYEXR_COMPRESSIONTYPE_NONE) {
+ // mwkm
+ // 0 : NO_COMPRESSION
+ // 1 : RLE
+ // 2 : ZIPS (Single scanline)
+ // 3 : ZIP (16-line block)
+ // 4 : PIZ (32-line block)
+ if (data[0] > TINYEXR_COMPRESSIONTYPE_PIZ) {
+ // if (err) {
+ // (*err) = "Unsupported compression type.";
+ //}
+ return -5;
+ }
+
+ } else if (attrName.compare("channels") == 0) {
+
+ // name: zero-terminated string, from 1 to 255 bytes long
+ // pixel type: int, possible values are: UINT = 0 HALF = 1 FLOAT = 2
+ // pLinear: unsigned char, possible values are 0 and 1
+ // reserved: three chars, should be zero
+ // xSampling: int
+ // ySampling: int
+
+ ReadChannelInfo(channels, data);
+
+ numChannels = channels.size();
+
+ if (numChannels < 1) {
+ // if (err) {
+ // (*err) = "Invalid channels format.";
+ //}
+ return -6;
+ }
+
+ } else if (attrName.compare("dataWindow") == 0) {
+ memcpy(&dx, &data.at(0), sizeof(int));
+ memcpy(&dy, &data.at(4), sizeof(int));
+ memcpy(&dw, &data.at(8), sizeof(int));
+ memcpy(&dh, &data.at(12), sizeof(int));
+ if (IsBigEndian()) {
+ swap4(reinterpret_cast<unsigned int *>(&dx));
+ swap4(reinterpret_cast<unsigned int *>(&dy));
+ swap4(reinterpret_cast<unsigned int *>(&dw));
+ swap4(reinterpret_cast<unsigned int *>(&dh));
+ }
+ } else if (attrName.compare("displayWindow") == 0) {
+ memcpy(&displayWindow[0], &data.at(0), sizeof(int));
+ memcpy(&displayWindow[1], &data.at(4), sizeof(int));
+ memcpy(&displayWindow[2], &data.at(8), sizeof(int));
+ memcpy(&displayWindow[3], &data.at(12), sizeof(int));
+ if (IsBigEndian()) {
+ swap4(reinterpret_cast<unsigned int *>(&displayWindow[0]));
+ swap4(reinterpret_cast<unsigned int *>(&displayWindow[1]));
+ swap4(reinterpret_cast<unsigned int *>(&displayWindow[2]));
+ swap4(reinterpret_cast<unsigned int *>(&displayWindow[3]));
+ }
+ } else if (attrName.compare("lineOrder") == 0) {
+ memcpy(&lineOrder, &data.at(0), sizeof(float));
+ if (IsBigEndian()) {
+ swap4(reinterpret_cast<unsigned int *>(&lineOrder));
+ }
+ } else if (attrName.compare("pixelAspectRatio") == 0) {
+ memcpy(&pixelAspectRatio, &data.at(0), sizeof(float));
+ if (IsBigEndian()) {
+ swap4(reinterpret_cast<unsigned int *>(&pixelAspectRatio));
+ }
+ } else if (attrName.compare("screenWindowCenter") == 0) {
+ memcpy(&screenWindowCenter[0], &data.at(0), sizeof(float));
+ memcpy(&screenWindowCenter[1], &data.at(4), sizeof(float));
+ if (IsBigEndian()) {
+ swap4(reinterpret_cast<unsigned int *>(&screenWindowCenter[0]));
+ swap4(reinterpret_cast<unsigned int *>(&screenWindowCenter[1]));
+ }
+ } else if (attrName.compare("screenWindowWidth") == 0) {
+ memcpy(&screenWindowWidth, &data.at(0), sizeof(float));
+ if (IsBigEndian()) {
+ swap4(reinterpret_cast<unsigned int *>(&screenWindowWidth));
+ }
+
+ } else {
+ // Custom attribute(up to TINYEXR_MAX_ATTRIBUTES)
+ if (numCustomAttributes &&
+ ((*numCustomAttributes) < TINYEXR_MAX_ATTRIBUTES)) {
+ EXRAttribute attrib;
+ attrib.name = strdup(attrName.c_str());
+ attrib.type = strdup(attrType.c_str());
+ attrib.size = data.size();
+ attrib.value = (unsigned char *)malloc(data.size());
+ memcpy((char *)attrib.value, &data.at(0), data.size());
+ attribs.push_back(attrib);
+ }
+ }
+
+ marker = marker_next;
+ }
+
+ assert(dx >= 0);
+ assert(dy >= 0);
+ assert(dw >= 0);
+ assert(dh >= 0);
+ assert(numChannels >= 1);
+
+ int dataWidth = dw - dx + 1;
+ int dataHeight = dh - dy + 1;
+
+ (*width) = dataWidth;
+ (*height) = dataHeight;
+
+ if (numCustomAttributes) {
+ assert(attribs.size() < TINYEXR_MAX_ATTRIBUTES);
+ (*numCustomAttributes) = attribs.size();
+
+ // Assume the pointer to customAttributes has enough memory to store.
+ for (int i = 0; i < (int)attribs.size(); i++) {
+ customAttributes[i] = attribs[i];
+ }
+ }
+
+ return 0;
+}
+
+int LoadEXRFromMemory(float *out_rgba, const unsigned char *memory,
+ const char **err) {
+
+ if (out_rgba == NULL || memory == NULL) {
+ if (err) {
+ (*err) = "Invalid argument.\n";
+ }
+ return -1;
+ }
+
+ EXRImage exrImage;
+ InitEXRImage(&exrImage);
+ int ret = LoadMultiChannelEXRFromMemory(&exrImage, memory, err);
+ if (ret != 0) {
+ return ret;
+ }
+
+ // RGBA
+ int idxR = -1;
+ int idxG = -1;
+ int idxB = -1;
+ int idxA = -1;
+ for (int c = 0; c < exrImage.num_channels; c++) {
+ if (strcmp(exrImage.channel_names[c], "R") == 0) {
+ idxR = c;
+ } else if (strcmp(exrImage.channel_names[c], "G") == 0) {
+ idxG = c;
+ } else if (strcmp(exrImage.channel_names[c], "B") == 0) {
+ idxB = c;
+ } else if (strcmp(exrImage.channel_names[c], "A") == 0) {
+ idxA = c;
+ }
+ }
+
+ if (idxR == -1) {
+ if (err) {
+ (*err) = "R channel not found\n";
+ }
+
+ // @todo { free exrImage }
+ return -1;
+ }
+
+ if (idxG == -1) {
+ if (err) {
+ (*err) = "G channel not found\n";
+ }
+ // @todo { free exrImage }
+ return -1;
+ }
+
+ if (idxB == -1) {
+ if (err) {
+ (*err) = "B channel not found\n";
+ }
+ // @todo { free exrImage }
+ return -1;
+ }
+
+ // Assume `out_rgba` have enough memory allocated.
+ for (int i = 0; i < exrImage.width * exrImage.height; i++) {
+ out_rgba[4 * i + 0] = reinterpret_cast<float **>(exrImage.images)[idxR][i];
+ out_rgba[4 * i + 1] = reinterpret_cast<float **>(exrImage.images)[idxG][i];
+ out_rgba[4 * i + 2] = reinterpret_cast<float **>(exrImage.images)[idxB][i];
+ if (idxA > 0) {
+ out_rgba[4 * i + 3] =
+ reinterpret_cast<float **>(exrImage.images)[idxA][i];
+ } else {
+ out_rgba[4 * i + 3] = 1.0;
+ }
+ }
+
+ return 0;
+}
+
+int LoadMultiChannelEXRFromFile(EXRImage *exrImage, const char *filename,
+ const char **err) {
+ if (exrImage == NULL) {
+ if (err) {
+ (*err) = "Invalid argument.";
+ }
+ return -1;
+ }
+
+ FILE *fp = fopen(filename, "rb");
+ if (!fp) {
+ if (err) {
+ (*err) = "Cannot read file.";
+ }
+ return -1;
+ }
+
+ size_t filesize;
+ // Compute size
+ fseek(fp, 0, SEEK_END);
+ filesize = ftell(fp);
+ fseek(fp, 0, SEEK_SET);
+
+ std::vector<unsigned char> buf(filesize); // @todo { use mmap }
+ {
+ size_t ret;
+ ret = fread(&buf[0], 1, filesize, fp);
+ assert(ret == filesize);
+ fclose(fp);
+ (void)ret;
+ }
+
+ return LoadMultiChannelEXRFromMemory(exrImage, &buf.at(0), err);
+}
+
+int LoadMultiChannelEXRFromMemory(EXRImage *exrImage,
+ const unsigned char *memory,
+ const char **err) {
+ if (exrImage == NULL || memory == NULL) {
+ if (err) {
+ (*err) = "Invalid argument.";
+ }
+ return -1;
+ }
+
+ const char *buf = reinterpret_cast<const char *>(memory);
+
+ const char *head = &buf[0];
+ const char *marker = &buf[0];
+
+ // Header check.
+ {
+ const char header[] = {0x76, 0x2f, 0x31, 0x01};
+
+ if (memcmp(marker, header, 4) != 0) {
+ if (err) {
+ (*err) = "Header mismatch.";
+ }
+ return -3;
+ }
+ marker += 4;
+ }
+
+ // Version, scanline.
+ {
+ // must be [2, 0, 0, 0]
+ if (marker[0] != 2 || marker[1] != 0 || marker[2] != 0 || marker[3] != 0) {
+ if (err) {
+ (*err) = "Unsupported version or scanline.";
+ }
+ return -4;
+ }
+
+ marker += 4;
+ }
+
+ int dx = -1;
+ int dy = -1;
+ int dw = -1;
+ int dh = -1;
+ int numScanlineBlocks = 1; // 16 for ZIP compression.
+ int compressionType = -1;
+ int numChannels = -1;
+ unsigned char lineOrder = 0; // 0 -> increasing y; 1 -> decreasing
+ std::vector<ChannelInfo> channels;
+
+ // Read attributes
+ for (;;) {
+ std::string attrName;
+ std::string attrType;
+ std::vector<unsigned char> data;
+ const char *marker_next = ReadAttribute(attrName, attrType, data, marker);
+ if (marker_next == NULL) {
+ marker++; // skip '\0'
+ break;
+ }
+
+ if (attrName.compare("compression") == 0) {
+ // mwkm
+ // 0 : NO_COMPRESSION
+ // 1 : RLE
+ // 2 : ZIPS (Single scanline)
+ // 3 : ZIP (16-line block)
+ // 4 : PIZ (32-line block)
+ if (data[0] != TINYEXR_COMPRESSIONTYPE_NONE &&
+ data[0] != TINYEXR_COMPRESSIONTYPE_ZIPS &&
+ data[0] != TINYEXR_COMPRESSIONTYPE_ZIP &&
+ data[0] != TINYEXR_COMPRESSIONTYPE_PIZ) {
+
+ if (err) {
+ (*err) = "Unsupported compression type.";
+ }
+ return -5;
+ }
+
+ compressionType = data[0];
+
+ if (compressionType == TINYEXR_COMPRESSIONTYPE_ZIP) {
+ numScanlineBlocks = 16;
+ } else if (compressionType == TINYEXR_COMPRESSIONTYPE_PIZ) {
+ numScanlineBlocks = 32;
+ }
+
+ } else if (attrName.compare("channels") == 0) {
+
+ // name: zero-terminated string, from 1 to 255 bytes long
+ // pixel type: int, possible values are: UINT = 0 HALF = 1 FLOAT = 2
+ // pLinear: unsigned char, possible values are 0 and 1
+ // reserved: three chars, should be zero
+ // xSampling: int
+ // ySampling: int
+
+ ReadChannelInfo(channels, data);
+
+ numChannels = channels.size();
+
+ if (numChannels < 1) {
+ if (err) {
+ (*err) = "Invalid channels format.";
+ }
+ return -6;
+ }
+
+ } else if (attrName.compare("dataWindow") == 0) {
+ memcpy(&dx, &data.at(0), sizeof(int));
+ memcpy(&dy, &data.at(4), sizeof(int));
+ memcpy(&dw, &data.at(8), sizeof(int));
+ memcpy(&dh, &data.at(12), sizeof(int));
+ if (IsBigEndian()) {
+ swap4(reinterpret_cast<unsigned int *>(&dx));
+ swap4(reinterpret_cast<unsigned int *>(&dy));
+ swap4(reinterpret_cast<unsigned int *>(&dw));
+ swap4(reinterpret_cast<unsigned int *>(&dh));
+ }
+ } else if (attrName.compare("displayWindow") == 0) {
+ int x, y, w, h;
+ memcpy(&x, &data.at(0), sizeof(int));
+ memcpy(&y, &data.at(4), sizeof(int));
+ memcpy(&w, &data.at(8), sizeof(int));
+ memcpy(&h, &data.at(12), sizeof(int));
+ if (IsBigEndian()) {
+ swap4(reinterpret_cast<unsigned int *>(&x));
+ swap4(reinterpret_cast<unsigned int *>(&y));
+ swap4(reinterpret_cast<unsigned int *>(&w));
+ swap4(reinterpret_cast<unsigned int *>(&h));
+ }
+ } else if (attrName.compare("lineOrder") == 0) {
+ memcpy(&lineOrder, &data.at(0), sizeof(lineOrder));
+ }
+
+ marker = marker_next;
+ }
+
+ assert(dx >= 0);
+ assert(dy >= 0);
+ assert(dw >= 0);
+ assert(dh >= 0);
+ assert(numChannels >= 1);
+
+ int dataWidth = dw - dx + 1;
+ int dataHeight = dh - dy + 1;
+
+ // Read offset tables.
+ int numBlocks = dataHeight / numScanlineBlocks;
+ if (numBlocks * numScanlineBlocks < dataHeight) {
+ numBlocks++;
+ }
+
+ std::vector<long long> offsets(numBlocks);
+
+ for (int y = 0; y < numBlocks; y++) {
+ long long offset;
+ memcpy(&offset, marker, sizeof(long long));
+ if (IsBigEndian()) {
+ swap8(reinterpret_cast<unsigned long long *>(&offset));
+ }
+ marker += sizeof(long long); // = 8
+ offsets[y] = offset;
+ }
+
+ exrImage->images = reinterpret_cast<unsigned char **>(
+ (float **)malloc(sizeof(float *) * numChannels));
+
+ std::vector<size_t> channelOffsetList(numChannels);
+ int pixelDataSize = 0;
+ size_t channelOffset = 0;
+ for (int c = 0; c < numChannels; c++) {
+ channelOffsetList[c] = channelOffset;
+ if (channels[c].pixelType == TINYEXR_PIXELTYPE_HALF) {
+ pixelDataSize += sizeof(unsigned short);
+ channelOffset += sizeof(unsigned short);
+ // Alloc internal image for half type.
+ if (exrImage->requested_pixel_types[c] == TINYEXR_PIXELTYPE_HALF) {
+ exrImage->images[c] =
+ reinterpret_cast<unsigned char *>((unsigned short *)malloc(
+ sizeof(unsigned short) * dataWidth * dataHeight));
+ } else if (exrImage->requested_pixel_types[c] ==
+ TINYEXR_PIXELTYPE_FLOAT) {
+ exrImage->images[c] = reinterpret_cast<unsigned char *>(
+ (float *)malloc(sizeof(float) * dataWidth * dataHeight));
+ } else {
+ assert(0);
+ }
+ } else if (channels[c].pixelType == TINYEXR_PIXELTYPE_FLOAT) {
+ pixelDataSize += sizeof(float);
+ channelOffset += sizeof(float);
+ exrImage->images[c] = reinterpret_cast<unsigned char *>(
+ (float *)malloc(sizeof(float) * dataWidth * dataHeight));
+ } else if (channels[c].pixelType == TINYEXR_PIXELTYPE_UINT) {
+ pixelDataSize += sizeof(unsigned int);
+ channelOffset += sizeof(unsigned int);
+ exrImage->images[c] = reinterpret_cast<unsigned char *>((
+ unsigned int *)malloc(sizeof(unsigned int) * dataWidth * dataHeight));
+ } else {
+ assert(0);
+ }
+ }
+
+#ifdef _OPENMP
+#pragma omp parallel for
+#endif
+ for (int y = 0; y < numBlocks; y++) {
+ const unsigned char *dataPtr =
+ reinterpret_cast<const unsigned char *>(head + offsets[y]);
+ // 4 byte: scan line
+ // 4 byte: data size
+ // ~ : pixel data(uncompressed or compressed)
+ int lineNo;
+ memcpy(&lineNo, dataPtr, sizeof(int));
+ int dataLen;
+ memcpy(&dataLen, dataPtr + 4, sizeof(int));
+ if (IsBigEndian()) {
+ swap4(reinterpret_cast<unsigned int *>(&lineNo));
+ swap4(reinterpret_cast<unsigned int *>(&dataLen));
+ }
+
+ int endLineNo = (std::min)(lineNo + numScanlineBlocks, dataHeight);
+
+ int numLines = endLineNo - lineNo;
+
+ if (compressionType == 4) { // PIZ
+ // Allocate original data size.
+ std::vector<unsigned char> outBuf(dataWidth * numLines * pixelDataSize);
+ unsigned int dstLen;
+ size_t tmpBufLen = dataWidth * numLines * pixelDataSize;
+
+ DecompressPiz(reinterpret_cast<unsigned char *>(&outBuf.at(0)), dstLen,
+ dataPtr + 8, tmpBufLen, channels, dataWidth, numLines);
+
+ bool isBigEndian = IsBigEndian();
+
+ // For ZIP_COMPRESSION:
+ // pixel sample data for channel 0 for scanline 0
+ // pixel sample data for channel 1 for scanline 0
+ // pixel sample data for channel ... for scanline 0
+ // pixel sample data for channel n for scanline 0
+ // pixel sample data for channel 0 for scanline 1
+ // pixel sample data for channel 1 for scanline 1
+ // pixel sample data for channel ... for scanline 1
+ // pixel sample data for channel n for scanline 1
+ // ...
+ for (int c = 0; c < numChannels; c++) {
+
+ if (channels[c].pixelType == TINYEXR_PIXELTYPE_HALF) {
+ for (int v = 0; v < numLines; v++) {
+ const unsigned short *linePtr = reinterpret_cast<unsigned short *>(
+ &outBuf.at(v * pixelDataSize * dataWidth +
+ channelOffsetList[c] * dataWidth));
+ for (int u = 0; u < dataWidth; u++) {
+ FP16 hf;
+
+ hf.u = linePtr[u];
+
+ if (isBigEndian) {
+ swap2(reinterpret_cast<unsigned short *>(&hf.u));
+ }
+
+ if (exrImage->requested_pixel_types[c] ==
+ TINYEXR_PIXELTYPE_HALF) {
+ unsigned short *image =
+ reinterpret_cast<unsigned short **>(exrImage->images)[c];
+ if (lineOrder == 0) {
+ image += (lineNo + v) * dataWidth + u;
+ } else {
+ image += (dataHeight - 1 - (lineNo + v)) * dataWidth + u;
+ }
+ *image = hf.u;
+ } else { // HALF -> FLOAT
+ FP32 f32 = half_to_float(hf);
+ float *image = reinterpret_cast<float **>(exrImage->images)[c];
+ if (lineOrder == 0) {
+ image += (lineNo + v) * dataWidth + u;
+ } else {
+ image += (dataHeight - 1 - (lineNo + v)) * dataWidth + u;
+ }
+ *image = f32.f;
+ }
+ }
+ }
+ } else if (channels[c].pixelType == TINYEXR_PIXELTYPE_UINT) {
+
+ assert(exrImage->requested_pixel_types[c] == TINYEXR_PIXELTYPE_UINT);
+
+ for (int v = 0; v < numLines; v++) {
+ const unsigned int *linePtr = reinterpret_cast<unsigned int *>(
+ &outBuf.at(v * pixelDataSize * dataWidth +
+ channelOffsetList[c] * dataWidth));
+ for (int u = 0; u < dataWidth; u++) {
+
+ unsigned int val = linePtr[u];
+
+ if (isBigEndian) {
+ swap4(&val);
+ }
+
+ unsigned int *image =
+ reinterpret_cast<unsigned int **>(exrImage->images)[c];
+ if (lineOrder == 0) {
+ image += (lineNo + v) * dataWidth + u;
+ } else {
+ image += (dataHeight - 1 - (lineNo + v)) * dataWidth + u;
+ }
+ *image = val;
+ }
+ }
+ } else if (channels[c].pixelType == TINYEXR_PIXELTYPE_FLOAT) {
+ assert(exrImage->requested_pixel_types[c] == TINYEXR_PIXELTYPE_FLOAT);
+ for (int v = 0; v < numLines; v++) {
+ const float *linePtr = reinterpret_cast<float *>(
+ &outBuf.at(v * pixelDataSize * dataWidth +
+ channelOffsetList[c] * dataWidth));
+ for (int u = 0; u < dataWidth; u++) {
+
+ float val = linePtr[u];
+
+ if (isBigEndian) {
+ swap4(reinterpret_cast<unsigned int *>(&val));
+ }
+
+ float *image = reinterpret_cast<float **>(exrImage->images)[c];
+ if (lineOrder == 0) {
+ image += (lineNo + v) * dataWidth + u;
+ } else {
+ image += (dataHeight - 1 - (lineNo + v)) * dataWidth + u;
+ }
+ *image = val;
+ }
+ }
+ } else {
+ assert(0);
+ }
+ }
+
+ // mwkm, ZIPS or ZIP both good to go
+ } else if (compressionType == 2 || compressionType == 3) { // ZIP
+
+ // Allocate original data size.
+ std::vector<unsigned char> outBuf(dataWidth * numLines * pixelDataSize);
+
+ unsigned long dstLen = outBuf.size();
+ DecompressZip(reinterpret_cast<unsigned char *>(&outBuf.at(0)), dstLen,
+ dataPtr + 8, dataLen);
+
+
+ bool isBigEndian = IsBigEndian();
+
+ // For ZIP_COMPRESSION:
+ // pixel sample data for channel 0 for scanline 0
+ // pixel sample data for channel 1 for scanline 0
+ // pixel sample data for channel ... for scanline 0
+ // pixel sample data for channel n for scanline 0
+ // pixel sample data for channel 0 for scanline 1
+ // pixel sample data for channel 1 for scanline 1
+ // pixel sample data for channel ... for scanline 1
+ // pixel sample data for channel n for scanline 1
+ // ...
+ for (int c = 0; c < numChannels; c++) {
+
+ if (channels[c].pixelType == TINYEXR_PIXELTYPE_HALF) {
+ for (int v = 0; v < numLines; v++) {
+ const unsigned short *linePtr = reinterpret_cast<unsigned short *>(
+ &outBuf.at(v * pixelDataSize * dataWidth +
+ channelOffsetList[c] * dataWidth));
+ for (int u = 0; u < dataWidth; u++) {
+ FP16 hf;
+
+ hf.u = linePtr[u];
+
+ if (isBigEndian) {
+ swap2(reinterpret_cast<unsigned short *>(&hf.u));
+ }
+
+ if (exrImage->requested_pixel_types[c] ==
+ TINYEXR_PIXELTYPE_HALF) {
+ unsigned short *image =
+ reinterpret_cast<unsigned short **>(exrImage->images)[c];
+ if (lineOrder == 0) {
+ image += (lineNo + v) * dataWidth + u;
+ } else {
+ image += (dataHeight - 1 - (lineNo + v)) * dataWidth + u;
+ }
+ *image = hf.u;
+ } else { // HALF -> FLOAT
+ FP32 f32 = half_to_float(hf);
+ float *image = reinterpret_cast<float **>(exrImage->images)[c];
+ if (lineOrder == 0) {
+ image += (lineNo + v) * dataWidth + u;
+ } else {
+ image += (dataHeight - 1 - (lineNo + v)) * dataWidth + u;
+ }
+ *image = f32.f;
+ }
+ }
+ }
+ } else if (channels[c].pixelType == TINYEXR_PIXELTYPE_UINT) {
+
+ assert(exrImage->requested_pixel_types[c] == TINYEXR_PIXELTYPE_UINT);
+
+ for (int v = 0; v < numLines; v++) {
+ const unsigned int *linePtr = reinterpret_cast<unsigned int *>(
+ &outBuf.at(v * pixelDataSize * dataWidth +
+ channelOffsetList[c] * dataWidth));
+ for (int u = 0; u < dataWidth; u++) {
+
+ unsigned int val = linePtr[u];
+
+ if (isBigEndian) {
+ swap4(&val);
+ }
+
+ unsigned int *image =
+ reinterpret_cast<unsigned int **>(exrImage->images)[c];
+ if (lineOrder == 0) {
+ image += (lineNo + v) * dataWidth + u;
+ } else {
+ image += (dataHeight - 1 - (lineNo + v)) * dataWidth + u;
+ }
+ *image = val;
+ }
+ }
+ } else if (channels[c].pixelType == TINYEXR_PIXELTYPE_FLOAT) {
+ assert(exrImage->requested_pixel_types[c] == TINYEXR_PIXELTYPE_FLOAT);
+ for (int v = 0; v < numLines; v++) {
+ const float *linePtr = reinterpret_cast<float *>(
+ &outBuf.at(v * pixelDataSize * dataWidth +
+ channelOffsetList[c] * dataWidth));
+ for (int u = 0; u < dataWidth; u++) {
+
+ float val = linePtr[u];
+
+ if (isBigEndian) {
+ swap4(reinterpret_cast<unsigned int *>(&val));
+ }
+
+ float *image = reinterpret_cast<float **>(exrImage->images)[c];
+ if (lineOrder == 0) {
+ image += (lineNo + v) * dataWidth + u;
+ } else {
+ image += (dataHeight - 1 - (lineNo + v)) * dataWidth + u;
+ }
+ *image = val;
+ }
+ }
+ } else {
+ assert(0);
+ }
+ }
+
+ } else if (compressionType == 0) { // No compression
+
+ bool isBigEndian = IsBigEndian();
+
+ for (int c = 0; c < numChannels; c++) {
+
+ if (channels[c].pixelType == TINYEXR_PIXELTYPE_HALF) {
+
+ const unsigned short *linePtr =
+ reinterpret_cast<const unsigned short *>(
+ dataPtr + 8 + c * dataWidth * sizeof(unsigned short));
+
+ if (exrImage->requested_pixel_types[c] == TINYEXR_PIXELTYPE_HALF) {
+ unsigned short *outLine =
+ reinterpret_cast<unsigned short *>(exrImage->images[c]);
+ if (lineOrder == 0) {
+ outLine += y * dataWidth;
+ } else {
+ outLine += (dataHeight - 1 - y) * dataWidth;
+ }
+
+ for (int u = 0; u < dataWidth; u++) {
+ FP16 hf;
+
+ hf.u = linePtr[u];
+
+ if (isBigEndian) {
+ swap2(reinterpret_cast<unsigned short *>(&hf.u));
+ }
+
+ outLine[u] = hf.u;
+ }
+ } else if (exrImage->requested_pixel_types[c] ==
+ TINYEXR_PIXELTYPE_FLOAT) {
+ float *outLine = reinterpret_cast<float *>(exrImage->images[c]);
+ if (lineOrder == 0) {
+ outLine += y * dataWidth;
+ } else {
+ outLine += (dataHeight - 1 - y) * dataWidth;
+ }
+
+ for (int u = 0; u < dataWidth; u++) {
+ FP16 hf;
+
+ hf.u = linePtr[u];
+
+ if (isBigEndian) {
+ swap2(reinterpret_cast<unsigned short *>(&hf.u));
+ }
+
+ FP32 f32 = half_to_float(hf);
+
+ outLine[u] = f32.f;
+ }
+ } else {
+ assert(0);
+ }
+ } else if (channels[c].pixelType == TINYEXR_PIXELTYPE_FLOAT) {
+
+ const float *linePtr = reinterpret_cast<const float *>(
+ dataPtr + 8 + c * dataWidth * sizeof(float));
+
+ float *outLine = reinterpret_cast<float *>(exrImage->images[c]);
+ if (lineOrder == 0) {
+ outLine += y * dataWidth;
+ } else {
+ outLine += (dataHeight - 1 - y) * dataWidth;
+ }
+
+ for (int u = 0; u < dataWidth; u++) {
+ float val = linePtr[u];
+
+ if (isBigEndian) {
+ swap4(reinterpret_cast<unsigned int *>(&val));
+ }
+
+ outLine[u] = val;
+ }
+ } else if (channels[c].pixelType == TINYEXR_PIXELTYPE_UINT) {
+
+ const unsigned int *linePtr = reinterpret_cast<const unsigned int *>(
+ dataPtr + 8 + c * dataWidth * sizeof(unsigned int));
+
+ unsigned int *outLine =
+ reinterpret_cast<unsigned int *>(exrImage->images[c]);
+ if (lineOrder == 0) {
+ outLine += y * dataWidth;
+ } else {
+ outLine += (dataHeight - 1 - y) * dataWidth;
+ }
+
+ for (int u = 0; u < dataWidth; u++) {
+ unsigned int val = linePtr[u];
+
+ if (isBigEndian) {
+ swap4(reinterpret_cast<unsigned int *>(&val));
+ }
+
+ outLine[u] = val;
+ }
+ }
+ }
+ }
+ } // omp parallel
+
+ {
+ exrImage->channel_names =
+ (const char **)malloc(sizeof(const char *) * numChannels);
+ for (int c = 0; c < numChannels; c++) {
+#ifdef _WIN32
+ exrImage->channel_names[c] = _strdup(channels[c].name.c_str());
+#else
+ exrImage->channel_names[c] = strdup(channels[c].name.c_str());
+#endif
+ }
+ exrImage->num_channels = numChannels;
+
+ exrImage->width = dataWidth;
+ exrImage->height = dataHeight;
+
+ // Fill with requested_pixel_types.
+ exrImage->pixel_types = (int *)malloc(sizeof(int *) * numChannels);
+ for (int c = 0; c < numChannels; c++) {
+ exrImage->pixel_types[c] = exrImage->requested_pixel_types[c];
+ }
+ }
+
+ return 0; // OK
+}
+
+// @deprecated
+#if 0
+int SaveEXR(const float *in_rgba, int width, int height, const char *filename,
+ const char **err) {
+ if (in_rgba == NULL || filename == NULL) {
+ if (err) {
+ (*err) = "Invalid argument.";
+ }
+ return -1;
+ }
+
+ FILE *fp = fopen(filename, "wb");
+ if (!fp) {
+ if (err) {
+ (*err) = "Cannot write a file.";
+ }
+ return -1;
+ }
+
+ // Header
+ {
+ const char header[] = {0x76, 0x2f, 0x31, 0x01};
+ size_t n = fwrite(header, 1, 4, fp);
+ assert(n == 4);
+ }
+
+ // Version, scanline.
+ {
+ const char marker[] = {2, 0, 0, 0};
+ size_t n = fwrite(marker, 1, 4, fp);
+ assert(n == 4);
+ }
+
+ int numScanlineBlocks = 16; // 16 for ZIP compression.
+
+ // Write attributes.
+ {
+ unsigned char data[] = {
+ 'A', 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 'B',
+ 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 'G', 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 'R', 0, 1,
+ 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0}; // last 0 =
+ // terminator.
+
+ WriteAttribute(fp, "channels", "chlist", data, 18 * 4 + 1); // +1 = null
+ }
+
+ {
+ int compressionType = 3; // ZIP compression
+ WriteAttribute(fp, "compression", "compression",
+ reinterpret_cast<const unsigned char *>(&compressionType),
+ 1);
+ }
+
+ {
+ int data[4] = {0, 0, width - 1, height - 1};
+ WriteAttribute(fp, "dataWindow", "box2i",
+ reinterpret_cast<const unsigned char *>(data),
+ sizeof(int) * 4);
+ WriteAttribute(fp, "displayWindow", "box2i",
+ reinterpret_cast<const unsigned char *>(data),
+ sizeof(int) * 4);
+ }
+
+ {
+ unsigned char lineOrder = 0; // increasingY
+ WriteAttribute(fp, "lineOrder", "lineOrder", &lineOrder, 1);
+ }
+
+ {
+ float aspectRatio = 1.0f;
+ WriteAttribute(fp, "pixelAspectRatio", "float",
+ reinterpret_cast<const unsigned char *>(&aspectRatio),
+ sizeof(float));
+ }
+
+ {
+ float center[2] = {0.0f, 0.0f};
+ WriteAttribute(fp, "screenWindowCenter", "v2f",
+ reinterpret_cast<const unsigned char *>(center),
+ 2 * sizeof(float));
+ }
+
+ {
+ float w = (float)width;
+ WriteAttribute(fp, "screenWindowWidth", "float",
+ reinterpret_cast<const unsigned char *>(&w), sizeof(float));
+ }
+
+ { // end of header
+ unsigned char e = 0;
+ fwrite(&e, 1, 1, fp);
+ }
+
+ int numBlocks = height / numScanlineBlocks;
+ if (numBlocks * numScanlineBlocks < height) {
+ numBlocks++;
+ }
+
+ std::vector<long long> offsets(numBlocks);
+
+ size_t headerSize = ftell(fp); // sizeof(header)
+ long long offset =
+ headerSize +
+ numBlocks * sizeof(long long); // sizeof(header) + sizeof(offsetTable)
+
+ std::vector<unsigned char> data;
+
+ for (int i = 0; i < numBlocks; i++) {
+ int startY = numScanlineBlocks * i;
+ int endY = (std::min)(numScanlineBlocks * (i + 1), height);
+ int h = endY - startY;
+
+ std::vector<unsigned short> buf(4 * width * h);
+
+ for (int y = 0; y < h; y++) {
+ for (int x = 0; x < width; x++) {
+ FP32 r, g, b, a;
+ r.f = in_rgba[4 * ((y + startY) * width + x) + 0];
+ g.f = in_rgba[4 * ((y + startY) * width + x) + 1];
+ b.f = in_rgba[4 * ((y + startY) * width + x) + 2];
+ a.f = in_rgba[4 * ((y + startY) * width + x) + 3];
+
+ FP16 hr, hg, hb, ha;
+ hr = float_to_half_full(r);
+ hg = float_to_half_full(g);
+ hb = float_to_half_full(b);
+ ha = float_to_half_full(a);
+
+ // Assume increasing Y
+ buf[4 * y * width + 3 * width + x] = hr.u;
+ buf[4 * y * width + 2 * width + x] = hg.u;
+ buf[4 * y * width + 1 * width + x] = hb.u;
+ buf[4 * y * width + 0 * width + x] = ha.u;
+ }
+ }
+
+ int bound = miniz::mz_compressBound(buf.size() * sizeof(unsigned short));
+
+ std::vector<unsigned char> block(
+ miniz::mz_compressBound(buf.size() * sizeof(unsigned short)));
+ unsigned long long outSize = block.size();
+
+ CompressZip(&block.at(0), outSize,
+ reinterpret_cast<const unsigned char *>(&buf.at(0)),
+ buf.size() * sizeof(unsigned short));
+
+ // 4 byte: scan line
+ // 4 byte: data size
+ // ~ : pixel data(compressed)
+ std::vector<unsigned char> header(8);
+ unsigned int dataLen = outSize; // truncate
+ memcpy(&header.at(0), &startY, sizeof(int));
+ memcpy(&header.at(4), &dataLen, sizeof(unsigned int));
+
+ data.insert(data.end(), header.begin(), header.end());
+ data.insert(data.end(), block.begin(), block.begin() + dataLen);
+
+ offsets[i] = offset;
+ offset += dataLen + 8; // 8 = sizeof(blockHeader)
+ }
+
+ fwrite(&offsets.at(0), 1, sizeof(unsigned long long) * numBlocks, fp);
+
+ fwrite(&data.at(0), 1, data.size(), fp);
+
+ fclose(fp);
+
+ return 0; // OK
+}
+#endif
+
+size_t SaveMultiChannelEXRToMemory(const EXRImage *exrImage,
+ unsigned char **memory_out,
+ const char **err) {
+ if (exrImage == NULL || memory_out == NULL || exrImage->compression < 0 ||
+ exrImage->compression > TINYEXR_COMPRESSIONTYPE_PIZ) {
+ if (err) {
+ (*err) = "Invalid argument.";
+ }
+ return 0;
+ }
+
+ std::vector<unsigned char> memory;
+
+ // Header
+ {
+ const char header[] = {0x76, 0x2f, 0x31, 0x01};
+ memory.insert(memory.end(), header, header + 4);
+ }
+
+ // Version, scanline.
+ {
+ const char marker[] = {2, 0, 0, 0};
+ memory.insert(memory.end(), marker, marker + 4);
+ }
+
+ int numScanlineBlocks = 1;
+ if (exrImage->compression == TINYEXR_COMPRESSIONTYPE_ZIP) {
+ numScanlineBlocks = 16;
+ } else if (exrImage->compression == TINYEXR_COMPRESSIONTYPE_PIZ) {
+ numScanlineBlocks = 32;
+ }
+
+ // Write attributes.
+ {
+ std::vector<unsigned char> data;
+
+ std::vector<ChannelInfo> channels;
+ for (int c = 0; c < exrImage->num_channels; c++) {
+ ChannelInfo info;
+ info.pLinear = 0;
+ info.pixelType = exrImage->requested_pixel_types[c];
+ info.xSampling = 1;
+ info.ySampling = 1;
+ info.name = std::string(exrImage->channel_names[c]);
+ channels.push_back(info);
+ }
+
+ WriteChannelInfo(data, channels);
+
+ WriteAttributeToMemory(memory, "channels", "chlist", &data.at(0),
+ data.size()); // +1 = null
+ }
+
+ {
+ int comp = exrImage->compression;
+ if (IsBigEndian()) {
+ swap4(reinterpret_cast<unsigned int *>(&comp));
+ }
+ WriteAttributeToMemory(memory, "compression", "compression",
+ reinterpret_cast<const unsigned char *>(&comp), 1);
+ }
+
+ {
+ int data[4] = {0, 0, exrImage->width - 1, exrImage->height - 1};
+ if (IsBigEndian()) {
+ swap4(reinterpret_cast<unsigned int *>(&data[0]));
+ swap4(reinterpret_cast<unsigned int *>(&data[1]));
+ swap4(reinterpret_cast<unsigned int *>(&data[2]));
+ swap4(reinterpret_cast<unsigned int *>(&data[3]));
+ }
+ WriteAttributeToMemory(memory, "dataWindow", "box2i",
+ reinterpret_cast<const unsigned char *>(data),
+ sizeof(int) * 4);
+ WriteAttributeToMemory(memory, "displayWindow", "box2i",
+ reinterpret_cast<const unsigned char *>(data),
+ sizeof(int) * 4);
+ }
+
+ {
+ unsigned char lineOrder = 0; // increasingY
+ WriteAttributeToMemory(memory, "lineOrder", "lineOrder", &lineOrder, 1);
+ }
+
+ {
+ float aspectRatio = 1.0f;
+ if (IsBigEndian()) {
+ swap4(reinterpret_cast<unsigned int *>(&aspectRatio));
+ }
+ WriteAttributeToMemory(
+ memory, "pixelAspectRatio", "float",
+ reinterpret_cast<const unsigned char *>(&aspectRatio), sizeof(float));
+ }
+
+ {
+ float center[2] = {0.0f, 0.0f};
+ if (IsBigEndian()) {
+ swap4(reinterpret_cast<unsigned int *>(&center[0]));
+ swap4(reinterpret_cast<unsigned int *>(&center[1]));
+ }
+ WriteAttributeToMemory(memory, "screenWindowCenter", "v2f",
+ reinterpret_cast<const unsigned char *>(center),
+ 2 * sizeof(float));
+ }
+
+ {
+ float w = (float)exrImage->width;
+ if (IsBigEndian()) {
+ swap4(reinterpret_cast<unsigned int *>(&w));
+ }
+ WriteAttributeToMemory(memory, "screenWindowWidth", "float",
+ reinterpret_cast<const unsigned char *>(&w),
+ sizeof(float));
+ }
+
+ // Custom attributes
+ if (exrImage->num_custom_attributes > 0) {
+ // @todo { endian }
+ for (int i = 0; i < exrImage->num_custom_attributes; i++) {
+ WriteAttributeToMemory(memory, exrImage->custom_attributes[i].name,
+ exrImage->custom_attributes[i].type,
+ reinterpret_cast<const unsigned char *>(
+ &exrImage->custom_attributes[i].value),
+ exrImage->custom_attributes[i].size);
+ }
+ }
+
+ { // end of header
+ unsigned char e = 0;
+ memory.push_back(e);
+ }
+
+ int numBlocks = exrImage->height / numScanlineBlocks;
+ if (numBlocks * numScanlineBlocks < exrImage->height) {
+ numBlocks++;
+ }
+
+ std::vector<long long> offsets(numBlocks);
+
+ size_t headerSize = memory.size();
+ long long offset =
+ headerSize +
+ numBlocks * sizeof(long long); // sizeof(header) + sizeof(offsetTable)
+
+ std::vector<unsigned char> data;
+
+ bool isBigEndian = IsBigEndian();
+
+ std::vector<std::vector<unsigned char> > dataList(numBlocks);
+ std::vector<size_t> channelOffsetList(exrImage->num_channels);
+
+ int pixelDataSize = 0;
+ size_t channelOffset = 0;
+ for (int c = 0; c < exrImage->num_channels; c++) {
+ channelOffsetList[c] = channelOffset;
+ if (exrImage->requested_pixel_types[c] == TINYEXR_PIXELTYPE_HALF) {
+ pixelDataSize += sizeof(unsigned short);
+ channelOffset += sizeof(unsigned short);
+ } else if (exrImage->requested_pixel_types[c] == TINYEXR_PIXELTYPE_FLOAT) {
+ pixelDataSize += sizeof(float);
+ channelOffset += sizeof(float);
+ } else if (exrImage->requested_pixel_types[c] == TINYEXR_PIXELTYPE_UINT) {
+ pixelDataSize += sizeof(unsigned int);
+ channelOffset += sizeof(unsigned int);
+ } else {
+ assert(0);
+ }
+ }
+
+#ifdef _OPENMP
+#pragma omp parallel for
+#endif
+ for (int i = 0; i < numBlocks; i++) {
+ int startY = numScanlineBlocks * i;
+ int endY = (std::min)(numScanlineBlocks * (i + 1), exrImage->height);
+ int h = endY - startY;
+
+ std::vector<unsigned char> buf(exrImage->width * h * pixelDataSize);
+
+ for (int c = 0; c < exrImage->num_channels; c++) {
+ if (exrImage->pixel_types[c] == TINYEXR_PIXELTYPE_HALF) {
+
+ if (exrImage->requested_pixel_types[c] == TINYEXR_PIXELTYPE_FLOAT) {
+ for (int y = 0; y < h; y++) {
+ for (int x = 0; x < exrImage->width; x++) {
+ FP16 h16;
+ h16.u = reinterpret_cast<unsigned short **>(
+ exrImage->images)[c][(y + startY) * exrImage->width + x];
+
+ FP32 f32 = half_to_float(h16);
+
+ if (isBigEndian) {
+ swap4(reinterpret_cast<unsigned int *>(&f32.f));
+ }
+
+ // Assume increasing Y
+ float *linePtr = reinterpret_cast<float *>(
+ &buf.at(pixelDataSize * y * exrImage->width +
+ channelOffsetList[c] * exrImage->width));
+ linePtr[x] = f32.f;
+ }
+ }
+ } else if (exrImage->requested_pixel_types[c] ==
+ TINYEXR_PIXELTYPE_HALF) {
+ for (int y = 0; y < h; y++) {
+ for (int x = 0; x < exrImage->width; x++) {
+ unsigned short val = reinterpret_cast<unsigned short **>(
+ exrImage->images)[c][(y + startY) * exrImage->width + x];
+
+ if (isBigEndian) {
+ swap2(&val);
+ }
+
+ // Assume increasing Y
+ unsigned short *linePtr = reinterpret_cast<unsigned short *>(
+ &buf.at(pixelDataSize * y * exrImage->width +
+ channelOffsetList[c] * exrImage->width));
+ linePtr[x] = val;
+ }
+ }
+ } else {
+ assert(0);
+ }
+
+ } else if (exrImage->pixel_types[c] == TINYEXR_PIXELTYPE_FLOAT) {
+
+ if (exrImage->requested_pixel_types[c] == TINYEXR_PIXELTYPE_HALF) {
+ for (int y = 0; y < h; y++) {
+ for (int x = 0; x < exrImage->width; x++) {
+ FP32 f32;
+ f32.f = reinterpret_cast<float **>(
+ exrImage->images)[c][(y + startY) * exrImage->width + x];
+
+ FP16 h16;
+ h16 = float_to_half_full(f32);
+
+ if (isBigEndian) {
+ swap2(reinterpret_cast<unsigned short *>(&h16.u));
+ }
+
+ // Assume increasing Y
+ unsigned short *linePtr = reinterpret_cast<unsigned short *>(
+ &buf.at(pixelDataSize * y * exrImage->width +
+ channelOffsetList[c] * exrImage->width));
+ linePtr[x] = h16.u;
+ }
+ }
+ } else if (exrImage->requested_pixel_types[c] ==
+ TINYEXR_PIXELTYPE_FLOAT) {
+ for (int y = 0; y < h; y++) {
+ for (int x = 0; x < exrImage->width; x++) {
+ float val = reinterpret_cast<float **>(
+ exrImage->images)[c][(y + startY) * exrImage->width + x];
+
+ if (isBigEndian) {
+ swap4(reinterpret_cast<unsigned int *>(&val));
+ }
+
+ // Assume increasing Y
+ float *linePtr = reinterpret_cast<float *>(
+ &buf.at(pixelDataSize * y * exrImage->width +
+ channelOffsetList[c] * exrImage->width));
+ linePtr[x] = val;
+ }
+ }
+ } else {
+ assert(0);
+ }
+ } else if (exrImage->pixel_types[c] == TINYEXR_PIXELTYPE_UINT) {
+
+ for (int y = 0; y < h; y++) {
+ for (int x = 0; x < exrImage->width; x++) {
+ unsigned int val = reinterpret_cast<unsigned int **>(
+ exrImage->images)[c][(y + startY) * exrImage->width + x];
+
+ if (isBigEndian) {
+ swap4(&val);
+ }
+
+ // Assume increasing Y
+ unsigned int *linePtr = reinterpret_cast<unsigned int *>(
+ &buf.at(pixelDataSize * y * exrImage->width +
+ channelOffsetList[c] * exrImage->width));
+ linePtr[x] = val;
+ }
+ }
+ }
+ }
+
+ if (exrImage->compression == TINYEXR_COMPRESSIONTYPE_NONE) {
+
+ // 4 byte: scan line
+ // 4 byte: data size
+ // ~ : pixel data(uncompressed)
+ std::vector<unsigned char> header(8);
+ unsigned int dataLen = (unsigned int)buf.size();
+ memcpy(&header.at(0), &startY, sizeof(int));
+ memcpy(&header.at(4), &dataLen, sizeof(unsigned int));
+
+ if (IsBigEndian()) {
+ swap4(reinterpret_cast<unsigned int *>(&header.at(0)));
+ swap4(reinterpret_cast<unsigned int *>(&header.at(4)));
+ }
+
+ dataList[i].insert(dataList[i].end(), header.begin(), header.end());
+ dataList[i].insert(dataList[i].end(), buf.begin(), buf.begin() + dataLen);
+
+ } else if ((exrImage->compression == TINYEXR_COMPRESSIONTYPE_ZIPS) ||
+ (exrImage->compression == TINYEXR_COMPRESSIONTYPE_ZIP)) {
+
+ std::vector<unsigned char> block(miniz::mz_compressBound(buf.size()));
+ unsigned long long outSize = block.size();
+
+ CompressZip(&block.at(0), outSize,
+ reinterpret_cast<const unsigned char *>(&buf.at(0)),
+ buf.size());
+
+ // 4 byte: scan line
+ // 4 byte: data size
+ // ~ : pixel data(compressed)
+ std::vector<unsigned char> header(8);
+ unsigned int dataLen = outSize; // truncate
+ memcpy(&header.at(0), &startY, sizeof(int));
+ memcpy(&header.at(4), &dataLen, sizeof(unsigned int));
+
+ if (IsBigEndian()) {
+ swap4(reinterpret_cast<unsigned int *>(&header.at(0)));
+ swap4(reinterpret_cast<unsigned int *>(&header.at(4)));
+ }
+
+ dataList[i].insert(dataList[i].end(), header.begin(), header.end());
+ dataList[i].insert(dataList[i].end(), block.begin(),
+ block.begin() + dataLen);
+
+ } else if (exrImage->compression == TINYEXR_COMPRESSIONTYPE_PIZ) {
+ // @todo
+ assert(0);
+ } else {
+ assert(0);
+ }
+
+ } // omp parallel
+
+ for (int i = 0; i < numBlocks; i++) {
+
+ data.insert(data.end(), dataList[i].begin(), dataList[i].end());
+
+ offsets[i] = offset;
+ if (IsBigEndian()) {
+ swap8(reinterpret_cast<unsigned long long *>(&offsets[i]));
+ }
+ offset += dataList[i].size();
+ }
+
+ {
+ memory.insert(memory.end(),
+ reinterpret_cast<unsigned char *>(&offsets.at(0)),
+ reinterpret_cast<unsigned char *>(&offsets.at(0)) +
+ sizeof(unsigned long long) * numBlocks);
+ }
+
+ { memory.insert(memory.end(), data.begin(), data.end()); }
+
+ assert(memory.size() > 0);
+
+ (*memory_out) = (unsigned char *)malloc(memory.size());
+ memcpy((*memory_out), &memory.at(0), memory.size());
+
+ return memory.size(); // OK
+}
+
+int SaveMultiChannelEXRToFile(const EXRImage *exrImage, const char *filename,
+ const char **err) {
+ if (exrImage == NULL || filename == NULL || exrImage->compression < 0 ||
+ exrImage->compression > TINYEXR_COMPRESSIONTYPE_PIZ) {
+ if (err) {
+ (*err) = "Invalid argument.";
+ }
+ return -1;
+ }
+
+ FILE *fp = fopen(filename, "wb");
+ if (!fp) {
+ if (err) {
+ (*err) = "Cannot write a file.";
+ }
+ return -1;
+ }
+
+ unsigned char *mem = NULL;
+ size_t mem_size = SaveMultiChannelEXRToMemory(exrImage, &mem, err);
+
+ if ((mem_size > 0) && mem) {
+
+ fwrite(mem, 1, mem_size, fp);
+ }
+ free(mem);
+
+ fclose(fp);
+
+ return 0; // OK
+}
+
+int LoadDeepEXR(DeepImage *deepImage, const char *filename, const char **err) {
+ if (deepImage == NULL) {
+ if (err) {
+ (*err) = "Invalid argument.";
+ }
+ return -1;
+ }
+
+ FILE *fp = fopen(filename, "rb");
+ if (!fp) {
+ if (err) {
+ (*err) = "Cannot read file.";
+ }
+ return -1;
+ }
+
+ size_t filesize;
+ // Compute size
+ fseek(fp, 0, SEEK_END);
+ filesize = ftell(fp);
+ fseek(fp, 0, SEEK_SET);
+
+ if (filesize == 0) {
+ fclose(fp);
+ if (err) {
+ (*err) = "File size is zero.";
+ }
+ return -1;
+ }
+
+ std::vector<char> buf(filesize); // @todo { use mmap }
+ {
+ size_t ret;
+ ret = fread(&buf[0], 1, filesize, fp);
+ assert(ret == filesize);
+ (void)ret;
+ }
+ fclose(fp);
+
+ const char *head = &buf[0];
+ const char *marker = &buf[0];
+
+ // Header check.
+ {
+ const char header[] = {0x76, 0x2f, 0x31, 0x01};
+
+ if (memcmp(marker, header, 4) != 0) {
+ if (err) {
+ (*err) = "Header mismatch.";
+ }
+ return -3;
+ }
+ marker += 4;
+ }
+
+ // Version, scanline.
+ {
+ // ver 2.0, scanline, deep bit on(0x800)
+ // must be [2, 0, 0, 0]
+ if (marker[0] != 2 || marker[1] != 8 || marker[2] != 0 || marker[3] != 0) {
+ if (err) {
+ (*err) = "Unsupported version or scanline.";
+ }
+ return -4;
+ }
+
+ marker += 4;
+ }
+
+ int dx = -1;
+ int dy = -1;
+ int dw = -1;
+ int dh = -1;
+ int numScanlineBlocks = 1; // 16 for ZIP compression.
+ int compressionType = -1;
+ int numChannels = -1;
+ std::vector<ChannelInfo> channels;
+
+ // Read attributes
+ for (;;) {
+ std::string attrName;
+ std::string attrType;
+ std::vector<unsigned char> data;
+ const char *marker_next = ReadAttribute(attrName, attrType, data, marker);
+ if (marker_next == NULL) {
+ marker++; // skip '\0'
+ break;
+ }
+
+ if (attrName.compare("compression") == 0) {
+ // must be 0:No compression, 1: RLE, 2: ZIPs or 3: ZIP
+ if (data[0] > 3) {
+ if (err) {
+ (*err) = "Unsupported compression type.";
+ }
+ return -5;
+ }
+
+ compressionType = data[0];
+
+ if (compressionType == 3) { // ZIP
+ numScanlineBlocks = 16;
+ }
+
+ } else if (attrName.compare("channels") == 0) {
+
+ // name: zero-terminated string, from 1 to 255 bytes long
+ // pixel type: int, possible values are: UINT = 0 HALF = 1 FLOAT = 2
+ // pLinear: unsigned char, possible values are 0 and 1
+ // reserved: three chars, should be zero
+ // xSampling: int
+ // ySampling: int
+
+ ReadChannelInfo(channels, data);
+
+ numChannels = channels.size();
+
+ if (numChannels < 1) {
+ if (err) {
+ (*err) = "Invalid channels format.";
+ }
+ return -6;
+ }
+
+ } else if (attrName.compare("dataWindow") == 0) {
+ memcpy(&dx, &data.at(0), sizeof(int));
+ memcpy(&dy, &data.at(4), sizeof(int));
+ memcpy(&dw, &data.at(8), sizeof(int));
+ memcpy(&dh, &data.at(12), sizeof(int));
+ if (IsBigEndian()) {
+ swap4(reinterpret_cast<unsigned int *>(&dx));
+ swap4(reinterpret_cast<unsigned int *>(&dy));
+ swap4(reinterpret_cast<unsigned int *>(&dw));
+ swap4(reinterpret_cast<unsigned int *>(&dh));
+ }
+
+ } else if (attrName.compare("displayWindow") == 0) {
+ int x;
+ int y;
+ int w;
+ int h;
+ memcpy(&x, &data.at(0), sizeof(int));
+ memcpy(&y, &data.at(4), sizeof(int));
+ memcpy(&w, &data.at(8), sizeof(int));
+ memcpy(&h, &data.at(12), sizeof(int));
+ if (IsBigEndian()) {
+ swap4(reinterpret_cast<unsigned int *>(&x));
+ swap4(reinterpret_cast<unsigned int *>(&y));
+ swap4(reinterpret_cast<unsigned int *>(&w));
+ swap4(reinterpret_cast<unsigned int *>(&h));
+ }
+ }
+
+ marker = marker_next;
+ }
+
+ assert(dx >= 0);
+ assert(dy >= 0);
+ assert(dw >= 0);
+ assert(dh >= 0);
+ assert(numChannels >= 1);
+
+ int dataWidth = dw - dx + 1;
+ int dataHeight = dh - dy + 1;
+
+ std::vector<float> image(dataWidth * dataHeight * 4); // 4 = RGBA
+
+ // Read offset tables.
+ int numBlocks = dataHeight / numScanlineBlocks;
+ if (numBlocks * numScanlineBlocks < dataHeight) {
+ numBlocks++;
+ }
+
+ std::vector<long long> offsets(numBlocks);
+
+ for (int y = 0; y < numBlocks; y++) {
+ long long offset;
+ memcpy(&offset, marker, sizeof(long long));
+ if (IsBigEndian()) {
+ swap8(reinterpret_cast<unsigned long long *>(&offset));
+ }
+ marker += sizeof(long long); // = 8
+ offsets[y] = offset;
+ }
+
+ if (compressionType != 0 && compressionType != 2 && compressionType != 3) {
+ if (err) {
+ (*err) = "Unsupported format.";
+ }
+ return -10;
+ }
+
+ deepImage->image = (float ***)malloc(sizeof(float **) * numChannels);
+ for (int c = 0; c < numChannels; c++) {
+ deepImage->image[c] = (float **)malloc(sizeof(float *) * dataHeight);
+ for (int y = 0; y < dataHeight; y++) {
+ }
+ }
+
+ deepImage->offset_table = (int **)malloc(sizeof(int *) * dataHeight);
+ for (int y = 0; y < dataHeight; y++) {
+ deepImage->offset_table[y] = (int *)malloc(sizeof(int) * dataWidth);
+ }
+
+ for (int y = 0; y < numBlocks; y++) {
+ const unsigned char *dataPtr =
+ reinterpret_cast<const unsigned char *>(head + offsets[y]);
+
+ // int: y coordinate
+ // int64: packed size of pixel offset table
+ // int64: packed size of sample data
+ // int64: unpacked size of sample data
+ // compressed pixel offset table
+ // compressed sample data
+ int lineNo;
+ long long packedOffsetTableSize;
+ long long packedSampleDataSize;
+ long long unpackedSampleDataSize;
+ memcpy(&lineNo, dataPtr, sizeof(int));
+ memcpy(&packedOffsetTableSize, dataPtr + 4, sizeof(long long));
+ memcpy(&packedSampleDataSize, dataPtr + 12, sizeof(long long));
+ memcpy(&unpackedSampleDataSize, dataPtr + 20, sizeof(long long));
+
+ if (IsBigEndian()) {
+ swap4(reinterpret_cast<unsigned int *>(&lineNo));
+ swap8(reinterpret_cast<unsigned long long *>(&packedOffsetTableSize));
+ swap8(reinterpret_cast<unsigned long long *>(&packedSampleDataSize));
+ swap8(reinterpret_cast<unsigned long long *>(&unpackedSampleDataSize));
+ }
+
+ std::vector<int> pixelOffsetTable(dataWidth);
+
+ // decode pixel offset table.
+ {
+ unsigned long dstLen = pixelOffsetTable.size() * sizeof(int);
+ DecompressZip(reinterpret_cast<unsigned char *>(&pixelOffsetTable.at(0)),
+ dstLen, dataPtr + 28, packedOffsetTableSize);
+
+ assert(dstLen == pixelOffsetTable.size() * sizeof(int));
+ for (int i = 0; i < dataWidth; i++) {
+ deepImage->offset_table[y][i] = pixelOffsetTable[i];
+ }
+ }
+
+ std::vector<unsigned char> sampleData(unpackedSampleDataSize);
+
+ // decode sample data.
+ {
+ unsigned long dstLen = unpackedSampleDataSize;
+ DecompressZip(reinterpret_cast<unsigned char *>(&sampleData.at(0)),
+ dstLen, dataPtr + 28 + packedOffsetTableSize,
+ packedSampleDataSize);
+ assert(dstLen == (unsigned long)unpackedSampleDataSize);
+ }
+
+ // decode sample
+ int sampleSize = -1;
+ std::vector<int> channelOffsetList(numChannels);
+ {
+ int channelOffset = 0;
+ for (int i = 0; i < numChannels; i++) {
+ channelOffsetList[i] = channelOffset;
+ if (channels[i].pixelType == TINYEXR_PIXELTYPE_UINT) { // UINT
+ channelOffset += 4;
+ } else if (channels[i].pixelType == TINYEXR_PIXELTYPE_HALF) { // half
+ channelOffset += 2;
+ } else if (channels[i].pixelType == TINYEXR_PIXELTYPE_FLOAT) { // float
+ channelOffset += 4;
+ } else {
+ assert(0);
+ }
+ }
+ sampleSize = channelOffset;
+ }
+ assert(sampleSize >= 2);
+
+ assert((size_t)(pixelOffsetTable[dataWidth - 1] * sampleSize) ==
+ sampleData.size());
+ int samplesPerLine = sampleData.size() / sampleSize;
+
+ //
+ // Alloc memory
+ //
+
+ //
+ // pixel data is stored as image[channels][pixel_samples]
+ //
+ {
+ unsigned long long dataOffset = 0;
+ for (int c = 0; c < numChannels; c++) {
+
+ deepImage->image[c][y] =
+ (float *)malloc(sizeof(float) * samplesPerLine);
+
+ if (channels[c].pixelType == 0) { // UINT
+ for (int x = 0; x < samplesPerLine; x++) {
+ unsigned int ui = *reinterpret_cast<unsigned int *>(
+ &sampleData.at(dataOffset + x * sizeof(int)));
+ deepImage->image[c][y][x] = (float)ui; // @fixme
+ }
+ dataOffset += sizeof(unsigned int) * samplesPerLine;
+ } else if (channels[c].pixelType == 1) { // half
+ for (int x = 0; x < samplesPerLine; x++) {
+ FP16 f16;
+ f16.u = *reinterpret_cast<unsigned short *>(
+ &sampleData.at(dataOffset + x * sizeof(short)));
+ FP32 f32 = half_to_float(f16);
+ deepImage->image[c][y][x] = f32.f;
+ }
+ dataOffset += sizeof(short) * samplesPerLine;
+ } else { // float
+ for (int x = 0; x < samplesPerLine; x++) {
+ float f = *reinterpret_cast<float *>(
+ &sampleData.at(dataOffset + x * sizeof(float)));
+ deepImage->image[c][y][x] = f;
+ }
+ dataOffset += sizeof(float) * samplesPerLine;
+ }
+ }
+ }
+
+ } // y
+
+ deepImage->width = dataWidth;
+ deepImage->height = dataHeight;
+
+ deepImage->channel_names =
+ (const char **)malloc(sizeof(const char *) * numChannels);
+ for (int c = 0; c < numChannels; c++) {
+#ifdef _WIN32
+ deepImage->channel_names[c] = _strdup(channels[c].name.c_str());
+#else
+ deepImage->channel_names[c] = strdup(channels[c].name.c_str());
+#endif
+ }
+ deepImage->num_channels = numChannels;
+
+ return 0; // OK
+}
+
+int SaveDeepEXR(const DeepImage *deepImage, const char *filename,
+ const char **err) {
+ if (deepImage == NULL || filename == NULL) {
+ if (err) {
+ (*err) = "Invalid argument.";
+ }
+ return -1;
+ }
+
+ FILE *fp = fopen(filename, "rb");
+ if (!fp) {
+ if (err) {
+ (*err) = "Cannot write file.";
+ }
+ return -1;
+ }
+
+ // Write header check.
+ {
+ const char header[] = {0x76, 0x2f, 0x31, 0x01};
+ size_t n = fwrite(header, 1, 4, fp);
+ if (n != 4) {
+ if (err) {
+ (*err) = "Header write failed.";
+ }
+ fclose(fp);
+ return -3;
+ }
+ }
+
+ // Version, scanline.
+ {
+ // ver 2.0, scanline, deep bit on(0x800)
+ const char data[] = {2, 8, 0, 0};
+ size_t n = fwrite(data, 1, 4, fp);
+ if (n != 4) {
+ if (err) {
+ (*err) = "Flag write failed.";
+ }
+ fclose(fp);
+ return -3;
+ }
+ }
+
+ // Write attributes.
+ {
+ int data = 2; // ZIPS
+ WriteAttribute(fp, "compression", "compression",
+ reinterpret_cast<const unsigned char *>(&data), sizeof(int));
+ }
+
+ {
+ int data[4] = {0, 0, deepImage->width - 1, deepImage->height - 1};
+ WriteAttribute(fp, "dataWindow", "box2i",
+ reinterpret_cast<const unsigned char *>(data),
+ sizeof(int) * 4);
+ WriteAttribute(fp, "displayWindow", "box2i",
+ reinterpret_cast<const unsigned char *>(data),
+ sizeof(int) * 4);
+ }
+
+ int numScanlineBlocks = 1;
+ // Write offset tables.
+ int numBlocks = deepImage->height / numScanlineBlocks;
+ if (numBlocks * numScanlineBlocks < deepImage->height) {
+ numBlocks++;
+ }
+
+#if 0 // @todo
+ std::vector<long long> offsets(numBlocks);
+
+ //std::vector<int> pixelOffsetTable(dataWidth);
+
+ // compress pixel offset table.
+ {
+ unsigned long dstLen = pixelOffsetTable.size() * sizeof(int);
+ Compresses(reinterpret_cast<unsigned char *>(&pixelOffsetTable.at(0)),
+ dstLen, dataPtr + 28, packedOffsetTableSize);
+
+ assert(dstLen == pixelOffsetTable.size() * sizeof(int));
+ // int ret =
+ // miniz::mz_uncompress(reinterpret_cast<unsigned char
+ // *>(&pixelOffsetTable.at(0)), &dstLen, dataPtr + 28,
+ // packedOffsetTableSize);
+ // printf("ret = %d, dstLen = %d\n", ret, (int)dstLen);
+ //
+ for (int i = 0; i < dataWidth; i++) {
+ // printf("offt[%d] = %d\n", i, pixelOffsetTable[i]);
+ deepImage->offset_table[y][i] = pixelOffsetTable[i];
+ }
+ }
+
+
+ for (int y = 0; y < numBlocks; y++) {
+ //long long offset = *(reinterpret_cast<const long long *>(marker));
+ // printf("offset[%d] = %lld\n", y, offset);
+ //marker += sizeof(long long); // = 8
+ offsets[y] = offset;
+ }
+
+ // Write offset table.
+ fwrite(&offsets.at(0), sizeof(long long), numBlocks, fp);
+
+ for (int y = 0; y < numBlocks; y++) {
+ const unsigned char *dataPtr =
+ reinterpret_cast<const unsigned char *>(head + offsets[y]);
+
+ // int: y coordinate
+ // int64: packed size of pixel offset table
+ // int64: packed size of sample data
+ // int64: unpacked size of sample data
+ // compressed pixel offset table
+ // compressed sample data
+ int lineNo = *reinterpret_cast<const int *>(dataPtr);
+ long long packedOffsetTableSize =
+ *reinterpret_cast<const long long *>(dataPtr + 4);
+ long long packedSampleDataSize =
+ *reinterpret_cast<const long long *>(dataPtr + 12);
+ long long unpackedSampleDataSize =
+ *reinterpret_cast<const long long *>(dataPtr + 20);
+ // printf("line: %d, %lld/%lld/%lld\n", lineNo, packedOffsetTableSize,
+ // packedSampleDataSize, unpackedSampleDataSize);
+
+ int endLineNo = (std::min)(lineNo + numScanlineBlocks, dataHeight);
+
+ int numLines = endLineNo - lineNo;
+ // printf("numLines: %d\n", numLines);
+
+ std::vector<int> pixelOffsetTable(dataWidth);
+
+ // decode pixel offset table.
+ {
+ unsigned long dstLen = pixelOffsetTable.size() * sizeof(int);
+ DecompressZip(reinterpret_cast<unsigned char *>(&pixelOffsetTable.at(0)),
+ dstLen, dataPtr + 28, packedOffsetTableSize);
+
+ assert(dstLen == pixelOffsetTable.size() * sizeof(int));
+ // int ret =
+ // miniz::mz_uncompress(reinterpret_cast<unsigned char
+ // *>(&pixelOffsetTable.at(0)), &dstLen, dataPtr + 28,
+ // packedOffsetTableSize);
+ // printf("ret = %d, dstLen = %d\n", ret, (int)dstLen);
+ //
+ for (int i = 0; i < dataWidth; i++) {
+ // printf("offt[%d] = %d\n", i, pixelOffsetTable[i]);
+ deepImage->offset_table[y][i] = pixelOffsetTable[i];
+ }
+ }
+
+ std::vector<unsigned char> sampleData(unpackedSampleDataSize);
+
+ // decode sample data.
+ {
+ unsigned long dstLen = unpackedSampleDataSize;
+ // printf("dstLen = %d\n", dstLen);
+ // printf("srcLen = %d\n", packedSampleDataSize);
+ DecompressZip(reinterpret_cast<unsigned char *>(&sampleData.at(0)),
+ dstLen, dataPtr + 28 + packedOffsetTableSize,
+ packedSampleDataSize);
+ assert(dstLen == unpackedSampleDataSize);
+ }
+
+ // decode sample
+ int sampleSize = -1;
+ std::vector<int> channelOffsetList(numChannels);
+ {
+ int channelOffset = 0;
+ for (int i = 0; i < numChannels; i++) {
+ // printf("offt[%d] = %d\n", i, channelOffset);
+ channelOffsetList[i] = channelOffset;
+ if (channels[i].pixelType == 0) { // UINT
+ channelOffset += 4;
+ } else if (channels[i].pixelType == 1) { // half
+ channelOffset += 2;
+ } else if (channels[i].pixelType == 2) { // float
+ channelOffset += 4;
+ } else {
+ assert(0);
+ }
+ }
+ sampleSize = channelOffset;
+ }
+ assert(sampleSize >= 2);
+
+ assert(pixelOffsetTable[dataWidth - 1] * sampleSize == sampleData.size());
+ int samplesPerLine = sampleData.size() / sampleSize;
+
+ //
+ // Alloc memory
+ //
+
+ //
+ // pixel data is stored as image[channels][pixel_samples]
+ //
+ {
+ unsigned long long dataOffset = 0;
+ for (int c = 0; c < numChannels; c++) {
+
+ deepImage->image[c][y] =
+ (float *)malloc(sizeof(float) * samplesPerLine);
+
+ // unsigned int channelOffset = channelOffsetList[c];
+ // unsigned int i = channelOffset;
+ // printf("channel = %d. name = %s. ty = %d\n", c,
+ // channels[c].name.c_str(), channels[c].pixelType);
+
+ // printf("dataOffset = %d\n", (int)dataOffset);
+
+ if (channels[c].pixelType == 0) { // UINT
+ for (int x = 0; x < samplesPerLine; x++) {
+ unsigned int ui = *reinterpret_cast<unsigned int *>(
+ &sampleData.at(dataOffset + x * sizeof(int)));
+ deepImage->image[c][y][x] = (float)ui; // @fixme
+ }
+ dataOffset += sizeof(unsigned int) * samplesPerLine;
+ } else if (channels[c].pixelType == 1) { // half
+ for (int x = 0; x < samplesPerLine; x++) {
+ FP16 f16;
+ f16.u = *reinterpret_cast<unsigned short *>(
+ &sampleData.at(dataOffset + x * sizeof(short)));
+ FP32 f32 = half_to_float(f16);
+ deepImage->image[c][y][x] = f32.f;
+ // printf("c[%d] f(half) = %f (0x%08x)\n", c, f32.f, f16.u);
+ }
+ dataOffset += sizeof(short) * samplesPerLine;
+ } else { // float
+ for (int x = 0; x < samplesPerLine; x++) {
+ float f = *reinterpret_cast<float *>(
+ &sampleData.at(dataOffset + x * sizeof(float)));
+ // printf(" f = %f(0x%08x)\n", f, *((unsigned int *)&f));
+ deepImage->image[c][y][x] = f;
+ }
+ dataOffset += sizeof(float) * samplesPerLine;
+ }
+ }
+ // printf("total: %d\n", dataOffset);
+ }
+
+ } // y
+#endif
+ fclose(fp);
+
+ return 0; // OK
+}
+
+void InitEXRImage(EXRImage *exrImage) {
+ if (exrImage == NULL) {
+ return;
+ }
+
+ exrImage->num_custom_attributes = 0;
+ exrImage->num_channels = 0;
+ exrImage->channel_names = NULL;
+ exrImage->images = NULL;
+ exrImage->pixel_types = NULL;
+ exrImage->requested_pixel_types = NULL;
+ exrImage->compression = TINYEXR_COMPRESSIONTYPE_ZIP;
+}
+
+int FreeEXRImage(EXRImage *exrImage) {
+
+ if (exrImage == NULL) {
+ return -1; // Err
+ }
+
+ for (int i = 0; i < exrImage->num_channels; i++) {
+
+ if (exrImage->channel_names && exrImage->channel_names[i]) {
+ free((char *)exrImage->channel_names[i]); // remove const
+ }
+
+ if (exrImage->images && exrImage->images[i]) {
+ free(exrImage->images[i]);
+ }
+ }
+
+ if (exrImage->channel_names) {
+ free(exrImage->channel_names);
+ }
+
+ if (exrImage->images) {
+ free(exrImage->images);
+ }
+
+ if (exrImage->pixel_types) {
+ free(exrImage->pixel_types);
+ }
+
+ if (exrImage->requested_pixel_types) {
+ free(exrImage->requested_pixel_types);
+ }
+
+ for (int i = 0; i < exrImage->num_custom_attributes; i++) {
+ if (exrImage->custom_attributes[i].name) {
+ free(exrImage->custom_attributes[i].name);
+ }
+ if (exrImage->custom_attributes[i].type) {
+ free(exrImage->custom_attributes[i].type);
+ }
+ if (exrImage->custom_attributes[i].value) {
+ free(exrImage->custom_attributes[i].value);
+ }
+ }
+
+ return 0;
+}
+
+int ParseMultiChannelEXRHeaderFromFile(EXRImage *exrImage, const char *filename,
+ const char **err) {
+ if (exrImage == NULL) {
+ if (err) {
+ (*err) = "Invalid argument.";
+ }
+ return -1;
+ }
+
+ FILE *fp = fopen(filename, "rb");
+ if (!fp) {
+ if (err) {
+ (*err) = "Cannot read file.";
+ }
+ return -1;
+ }
+
+ size_t filesize;
+ // Compute size
+ fseek(fp, 0, SEEK_END);
+ filesize = ftell(fp);
+ fseek(fp, 0, SEEK_SET);
+
+ std::vector<unsigned char> buf(filesize); // @todo { use mmap }
+ {
+ size_t ret;
+ ret = fread(&buf[0], 1, filesize, fp);
+ assert(ret == filesize);
+ fclose(fp);
+ (void)ret;
+ }
+
+ return ParseMultiChannelEXRHeaderFromMemory(exrImage, &buf.at(0), err);
+}
+
+int ParseMultiChannelEXRHeaderFromMemory(EXRImage *exrImage,
+ const unsigned char *memory,
+ const char **err) {
+ if (exrImage == NULL || memory == NULL) {
+ if (err) {
+ (*err) = "Invalid argument.";
+ }
+ return -1;
+ }
+
+ const char *buf = reinterpret_cast<const char *>(memory);
+
+ const char *marker = &buf[0];
+
+ // Header check.
+ {
+ const char header[] = {0x76, 0x2f, 0x31, 0x01};
+
+ if (memcmp(marker, header, 4) != 0) {
+ if (err) {
+ (*err) = "Header mismatch.";
+ }
+ return -3;
+ }
+ marker += 4;
+ }
+
+ // Version, scanline.
+ {
+ // must be [2, 0, 0, 0]
+ if (marker[0] != 2 || marker[1] != 0 || marker[2] != 0 || marker[3] != 0) {
+ if (err) {
+ (*err) = "Unsupported version or scanline.";
+ }
+ return -4;
+ }
+
+ marker += 4;
+ }
+
+ int dx = -1;
+ int dy = -1;
+ int dw = -1;
+ int dh = -1;
+ int numChannels = -1;
+ int displayWindow[4] = {-1, -1, -1, -1}; // @fixme.
+ float screenWindowCenter[2] = {0.0f, 0.0f}; // @fixme
+ float screenWindowWidth = 1.0f; // @fixme
+ float pixelAspectRatio = 1.0f;
+ unsigned char lineOrder = 0; // 0 -> increasing y; 1 -> decreasing
+ std::vector<ChannelInfo> channels;
+ int compressionType = 0; // @fixme
+
+ int numCustomAttributes = 0;
+ std::vector<EXRAttribute> customAttribs;
+
+ // Read attributes
+ for (;;) {
+ std::string attrName;
+ std::string attrType;
+ std::vector<unsigned char> data;
+ const char *marker_next = ReadAttribute(attrName, attrType, data, marker);
+ if (marker_next == NULL) {
+ marker++; // skip '\0'
+ break;
+ }
+
+ if (attrName.compare("compression") == 0) {
+ // must be 0:No compression, 1: RLE, 2: ZIPs, 3: ZIP or 4: PIZ
+ if (data[0] > TINYEXR_COMPRESSIONTYPE_PIZ) {
+ if (err) {
+ (*err) = "Unsupported compression type.";
+ }
+ return -5;
+ }
+
+ compressionType = data[0];
+
+ } else if (attrName.compare("channels") == 0) {
+
+ // name: zero-terminated string, from 1 to 255 bytes long
+ // pixel type: int, possible values are: UINT = 0 HALF = 1 FLOAT = 2
+ // pLinear: unsigned char, possible values are 0 and 1
+ // reserved: three chars, should be zero
+ // xSampling: int
+ // ySampling: int
+
+ ReadChannelInfo(channels, data);
+
+ numChannels = channels.size();
+
+ if (numChannels < 1) {
+ if (err) {
+ (*err) = "Invalid channels format.";
+ }
+ return -6;
+ }
+
+ } else if (attrName.compare("dataWindow") == 0) {
+ memcpy(&dx, &data.at(0), sizeof(int));
+ memcpy(&dy, &data.at(4), sizeof(int));
+ memcpy(&dw, &data.at(8), sizeof(int));
+ memcpy(&dh, &data.at(12), sizeof(int));
+ if (IsBigEndian()) {
+ swap4(reinterpret_cast<unsigned int *>(&dx));
+ swap4(reinterpret_cast<unsigned int *>(&dy));
+ swap4(reinterpret_cast<unsigned int *>(&dw));
+ swap4(reinterpret_cast<unsigned int *>(&dh));
+ }
+ } else if (attrName.compare("displayWindow") == 0) {
+ memcpy(&displayWindow[0], &data.at(0), sizeof(int));
+ memcpy(&displayWindow[1], &data.at(4), sizeof(int));
+ memcpy(&displayWindow[2], &data.at(8), sizeof(int));
+ memcpy(&displayWindow[3], &data.at(12), sizeof(int));
+ if (IsBigEndian()) {
+ swap4(reinterpret_cast<unsigned int *>(&displayWindow[0]));
+ swap4(reinterpret_cast<unsigned int *>(&displayWindow[1]));
+ swap4(reinterpret_cast<unsigned int *>(&displayWindow[2]));
+ swap4(reinterpret_cast<unsigned int *>(&displayWindow[3]));
+ }
+ } else if (attrName.compare("lineOrder") == 0) {
+ int order;
+ memcpy(&order, &data.at(0), sizeof(int));
+ if (IsBigEndian()) {
+ swap4(reinterpret_cast<unsigned int *>(&order));
+ }
+ lineOrder = (unsigned char)order;
+ } else if (attrName.compare("pixelAspectRatio") == 0) {
+ memcpy(&pixelAspectRatio, &data.at(0), sizeof(float));
+ if (IsBigEndian()) {
+ swap4(reinterpret_cast<unsigned int *>(&pixelAspectRatio));
+ }
+ } else if (attrName.compare("screenWindowCenter") == 0) {
+ memcpy(&screenWindowCenter[0], &data.at(0), sizeof(float));
+ memcpy(&screenWindowCenter[1], &data.at(4), sizeof(float));
+ if (IsBigEndian()) {
+ swap4(reinterpret_cast<unsigned int *>(&screenWindowCenter[0]));
+ swap4(reinterpret_cast<unsigned int *>(&screenWindowCenter[1]));
+ }
+ } else if (attrName.compare("screenWindowWidth") == 0) {
+ memcpy(&screenWindowWidth, &data.at(0), sizeof(float));
+ if (IsBigEndian()) {
+ swap4(reinterpret_cast<unsigned int *>(&screenWindowWidth));
+ }
+ } else {
+ // Custom attribute(up to TINYEXR_MAX_ATTRIBUTES)
+ if (numCustomAttributes < TINYEXR_MAX_ATTRIBUTES) {
+ EXRAttribute attrib;
+ attrib.name = strdup(attrName.c_str());
+ attrib.type = strdup(attrType.c_str());
+ attrib.size = data.size();
+ attrib.value = (unsigned char *)malloc(data.size());
+ memcpy((char *)attrib.value, &data.at(0), data.size());
+ customAttribs.push_back(attrib);
+ }
+ }
+
+ marker = marker_next;
+ }
+
+ assert(dx >= 0);
+ assert(dy >= 0);
+ assert(dw >= 0);
+ assert(dh >= 0);
+ assert(numChannels >= 1);
+
+ int dataWidth = dw - dx + 1;
+ int dataHeight = dh - dy + 1;
+
+ {
+ exrImage->channel_names =
+ (const char **)malloc(sizeof(const char *) * numChannels);
+ for (int c = 0; c < numChannels; c++) {
+#ifdef _WIN32
+ exrImage->channel_names[c] = _strdup(channels[c].name.c_str());
+#else
+ exrImage->channel_names[c] = strdup(channels[c].name.c_str());
+#endif
+ }
+ exrImage->num_channels = numChannels;
+
+ exrImage->width = dataWidth;
+ exrImage->height = dataHeight;
+ exrImage->pixel_aspect_ratio = pixelAspectRatio;
+ exrImage->screen_window_center[0] = screenWindowCenter[0];
+ exrImage->screen_window_center[1] = screenWindowCenter[1];
+ exrImage->screen_window_width = screenWindowWidth;
+ exrImage->display_window[0] = displayWindow[0];
+ exrImage->display_window[1] = displayWindow[1];
+ exrImage->display_window[2] = displayWindow[2];
+ exrImage->display_window[3] = displayWindow[3];
+ exrImage->data_window[0] = dx;
+ exrImage->data_window[1] = dy;
+ exrImage->data_window[2] = dw;
+ exrImage->data_window[3] = dh;
+ exrImage->line_order = lineOrder;
+ exrImage->compression = compressionType;
+
+ exrImage->pixel_types = (int *)malloc(sizeof(int) * numChannels);
+ for (int c = 0; c < numChannels; c++) {
+ exrImage->pixel_types[c] = channels[c].pixelType;
+ }
+
+ // Initially fill with values of `pixel-types`
+ exrImage->requested_pixel_types = (int *)malloc(sizeof(int) * numChannels);
+ for (int c = 0; c < numChannels; c++) {
+ exrImage->requested_pixel_types[c] = channels[c].pixelType;
+ }
+ }
+
+ if (numCustomAttributes > 0) {
+ assert(customAttribs.size() < TINYEXR_MAX_ATTRIBUTES);
+ exrImage->num_custom_attributes = numCustomAttributes;
+
+ for (int i = 0; i < (int)customAttribs.size(); i++) {
+ exrImage->custom_attributes[i] = customAttribs[i];
+ }
+ }
+
+ return 0; // OK
+}
+
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+
+#endif
+
+#endif // __TINYEXR_H__
diff --git a/3rdparty/bgfx/LICENSE b/3rdparty/bgfx/LICENSE
index ae4e2909086..68772805565 100644
--- a/3rdparty/bgfx/LICENSE
+++ b/3rdparty/bgfx/LICENSE
@@ -1,4 +1,4 @@
-Copyright 2010-2015 Branimir Karadzic. All rights reserved.
+Copyright 2010-2016 Branimir Karadzic. All rights reserved.
https://github.com/bkaradzic/bgfx
diff --git a/3rdparty/bgfx/README.md b/3rdparty/bgfx/README.md
index 27ad54916c0..0548f2d68ca 100644
--- a/3rdparty/bgfx/README.md
+++ b/3rdparty/bgfx/README.md
@@ -50,6 +50,7 @@ Languages:
* [D language API bindings](https://github.com/DerelictOrg/DerelictBgfx)
* [Go language API bindings](https://github.com/james4k/go-bgfx)
* [Java language API bindings](https://github.com/enleeten/twilight-bgfx)
+ * [Haskell language API bindings](https://github.com/haskell-game/bgfx)
Build status
------------
@@ -67,7 +68,8 @@ https://github.com/dariomanesku/cmftStudio cmftStudio - cubemap filtering tool.
https://github.com/taylor001/crown Crown is a general purpose data-driven game
engine, written from scratch with a minimalistic and data-oriented design
-philosophy in mind.
+philosophy in mind.
+![Crown screenshot](https://raw.githubusercontent.com/taylor001/crown/master/docs/shots/level-editor.png)
https://github.com/emoon/ProDBG - ProDBG is a new debugger under development
that will support a variety of targets and operating systems. Currently it's in
@@ -94,6 +96,17 @@ https://github.com/nem0/LumixEngine LumixEngine is a MIT licensed 3D engine.
The main goal is performance and Unity-like usability.
![LumixEngine screenshot](https://cloud.githubusercontent.com/assets/153526/10109455/450c51be-63c7-11e5-9c87-96d9d00efe02.png)
+https://github.com/podgorskiy/KeplerOrbits KeplerOrbits - Tool that calculates
+positions of celestial bodies using their orbital elements. [Web Demo](http://podgorskiy.com/KeplerOrbits/KeplerOrbits.html)
+
+https://github.com/cyberegoorg/cetech - CETech is Data-Driven game engine and
+toolbox inspired by Bitsquid/Stingray engine.
+![CETech screenshot](https://github.com/cyberegoorg/cetech/raw/master/docs/img/prototyp.png)
+
+https://github.com/jpcy/ioq3-renderer-bgfx - A renderer for ioquake3 written in
+C++ and using bgfx to support multiple rendering APIs.
+![ioq3-renderer-bgfx screenshot](https://camo.githubusercontent.com/052aa40c05120e56306294d3a1bb5f99f97de8c8/687474703a2f2f692e696d6775722e636f6d2f64364f6856594b2e6a7067)
+
[Building](https://bkaradzic.github.io/bgfx/build.html)
-------------------------------------------------------
@@ -113,7 +126,7 @@ The main goal is performance and Unity-like usability.
<img align="right" src="http://opensource.org/trademarks/opensource/OSI-Approved-License-100x137.png">
</a>
- Copyright 2010-2015 Branimir Karadzic. All rights reserved.
+ Copyright 2010-2016 Branimir Karadzic. All rights reserved.
https://github.com/bkaradzic/bgfx
diff --git a/3rdparty/bgfx/examples/00-helloworld/helloworld.cpp b/3rdparty/bgfx/examples/00-helloworld/helloworld.cpp
index b1f762ea76f..b23a878e2dc 100644
--- a/3rdparty/bgfx/examples/00-helloworld/helloworld.cpp
+++ b/3rdparty/bgfx/examples/00-helloworld/helloworld.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "common.h"
diff --git a/3rdparty/bgfx/examples/01-cubes/cubes.cpp b/3rdparty/bgfx/examples/01-cubes/cubes.cpp
index 4025975b0ee..de74b89e6d0 100644
--- a/3rdparty/bgfx/examples/01-cubes/cubes.cpp
+++ b/3rdparty/bgfx/examples/01-cubes/cubes.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "common.h"
diff --git a/3rdparty/bgfx/examples/01-cubes/fs_cubes.sc b/3rdparty/bgfx/examples/01-cubes/fs_cubes.sc
index 4fc0a0a82ba..43148e6a8dd 100644
--- a/3rdparty/bgfx/examples/01-cubes/fs_cubes.sc
+++ b/3rdparty/bgfx/examples/01-cubes/fs_cubes.sc
@@ -1,8 +1,8 @@
$input v_color0
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/01-cubes/vs_cubes.sc b/3rdparty/bgfx/examples/01-cubes/vs_cubes.sc
index 1c693736722..dba53d643d0 100644
--- a/3rdparty/bgfx/examples/01-cubes/vs_cubes.sc
+++ b/3rdparty/bgfx/examples/01-cubes/vs_cubes.sc
@@ -2,8 +2,8 @@ $input a_position, a_color0
$output v_color0
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/02-metaballs/fs_metaballs.bin.h b/3rdparty/bgfx/examples/02-metaballs/fs_metaballs.bin.h
index 694e76a6b0d..f26ec2830b7 100644
--- a/3rdparty/bgfx/examples/02-metaballs/fs_metaballs.bin.h
+++ b/3rdparty/bgfx/examples/02-metaballs/fs_metaballs.bin.h
@@ -26,36 +26,35 @@ static const uint8_t fs_metaballs_glsl[398] =
0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, // gl_FragColor =
0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // tmpvar_2;.}...
};
-static const uint8_t fs_metaballs_dx9[433] =
+static const uint8_t fs_metaballs_dx9[429] =
{
- 0x46, 0x53, 0x48, 0x04, 0x03, 0x2c, 0xf5, 0x3f, 0x00, 0x00, 0xa4, 0x01, 0x00, 0x03, 0xff, 0xff, // FSH..,.?........
- 0xfe, 0xff, 0x17, 0x00, 0x43, 0x54, 0x41, 0x42, 0x1c, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, // ....CTAB....#...
+ 0x46, 0x53, 0x48, 0x04, 0x03, 0x2c, 0xf5, 0x3f, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x03, 0xff, 0xff, // FSH..,.?........
+ 0xfe, 0xff, 0x16, 0x00, 0x43, 0x54, 0x41, 0x42, 0x1c, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, // ....CTAB....#...
0x00, 0x03, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x91, 0x00, 0x00, // ................
0x1c, 0x00, 0x00, 0x00, 0x70, 0x73, 0x5f, 0x33, 0x5f, 0x30, 0x00, 0x4d, 0x69, 0x63, 0x72, 0x6f, // ....ps_3_0.Micro
0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, 0x68, // soft (R) HLSL Sh
- 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x31, 0x30, // ader Compiler 10
- 0x2e, 0x30, 0x2e, 0x31, 0x30, 0x30, 0x31, 0x31, 0x2e, 0x31, 0x36, 0x33, 0x38, 0x34, 0x00, 0xab, // .0.10011.16384..
- 0x51, 0x00, 0x00, 0x05, 0x00, 0x00, 0x0f, 0xa0, 0x00, 0x00, 0xf0, 0x41, 0xcd, 0xcc, 0x0c, 0x40, // Q..........A...@
- 0x2f, 0xba, 0xe8, 0x3e, 0x00, 0x00, 0x80, 0x3f, 0x1f, 0x00, 0x00, 0x02, 0x0a, 0x00, 0x00, 0x80, // /..>...?........
- 0x00, 0x00, 0x07, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x05, 0x00, 0x01, 0x80, 0x01, 0x00, 0x07, 0x90, // ................
- 0x08, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x01, 0x00, 0xe4, 0x90, 0x01, 0x00, 0xe4, 0x90, // ................
- 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x80, 0x05, 0x00, 0x00, 0x03, // ................
- 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xaa, 0x90, 0x20, 0x00, 0x00, 0x03, // ............ ...
- 0x01, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0xa0, 0x0f, 0x00, 0x00, 0x02, // ................
- 0x02, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x90, 0x0f, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x80, // ................
- 0x00, 0x00, 0x55, 0x90, 0x0f, 0x00, 0x00, 0x02, 0x02, 0x00, 0x04, 0x80, 0x00, 0x00, 0xaa, 0x90, // ..U.............
- 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0e, 0x80, 0x02, 0x00, 0x90, 0x80, 0x00, 0x00, 0x55, 0xa0, // ..............U.
- 0x0e, 0x00, 0x00, 0x02, 0x02, 0x00, 0x01, 0x80, 0x00, 0x00, 0x55, 0x80, 0x0e, 0x00, 0x00, 0x02, // ..........U.....
- 0x02, 0x00, 0x02, 0x80, 0x00, 0x00, 0xaa, 0x80, 0x0e, 0x00, 0x00, 0x02, 0x02, 0x00, 0x04, 0x80, // ................
- 0x00, 0x00, 0xff, 0x80, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0x80, 0x02, 0x00, 0xe4, 0x80, // ................
- 0x00, 0x00, 0x00, 0x81, 0x01, 0x00, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x02, 0x01, 0x00, 0x01, 0x80, // ................
- 0x00, 0x00, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x02, 0x01, 0x00, 0x02, 0x80, 0x00, 0x00, 0x55, 0x80, // ..............U.
- 0x0f, 0x00, 0x00, 0x02, 0x01, 0x00, 0x04, 0x80, 0x00, 0x00, 0xaa, 0x80, 0x05, 0x00, 0x00, 0x03, // ................
- 0x00, 0x00, 0x07, 0x80, 0x01, 0x00, 0xe4, 0x80, 0x00, 0x00, 0xaa, 0xa0, 0x0e, 0x00, 0x00, 0x02, // ................
- 0x00, 0x08, 0x01, 0x80, 0x00, 0x00, 0x00, 0x80, 0x0e, 0x00, 0x00, 0x02, 0x00, 0x08, 0x02, 0x80, // ................
- 0x00, 0x00, 0x55, 0x80, 0x0e, 0x00, 0x00, 0x02, 0x00, 0x08, 0x04, 0x80, 0x00, 0x00, 0xaa, 0x80, // ..U.............
- 0x01, 0x00, 0x00, 0x02, 0x00, 0x08, 0x08, 0x80, 0x00, 0x00, 0xff, 0xa0, 0xff, 0xff, 0x00, 0x00, // ................
- 0x00, // .
+ 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x39, 0x2e, // ader Compiler 9.
+ 0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, 0x2e, 0x33, 0x31, 0x31, 0x31, 0x00, 0x51, 0x00, 0x00, 0x05, // 29.952.3111.Q...
+ 0x00, 0x00, 0x0f, 0xa0, 0x00, 0x00, 0xf0, 0x41, 0xcd, 0xcc, 0x0c, 0x40, 0x2f, 0xba, 0xe8, 0x3e, // .......A...@/..>
+ 0x00, 0x00, 0x80, 0x3f, 0x1f, 0x00, 0x00, 0x02, 0x0a, 0x00, 0x00, 0x80, 0x00, 0x00, 0x07, 0x90, // ...?............
+ 0x1f, 0x00, 0x00, 0x02, 0x05, 0x00, 0x01, 0x80, 0x01, 0x00, 0x07, 0x90, 0x08, 0x00, 0x00, 0x03, // ................
+ 0x00, 0x00, 0x01, 0x80, 0x01, 0x00, 0xe4, 0x90, 0x01, 0x00, 0xe4, 0x90, 0x07, 0x00, 0x00, 0x02, // ................
+ 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x80, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, // ................
+ 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xaa, 0x90, 0x20, 0x00, 0x00, 0x03, 0x01, 0x00, 0x01, 0x80, // ........ .......
+ 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0xa0, 0x0f, 0x00, 0x00, 0x02, 0x02, 0x00, 0x01, 0x80, // ................
+ 0x00, 0x00, 0x00, 0x90, 0x0f, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x80, 0x00, 0x00, 0x55, 0x90, // ..............U.
+ 0x0f, 0x00, 0x00, 0x02, 0x02, 0x00, 0x04, 0x80, 0x00, 0x00, 0xaa, 0x90, 0x05, 0x00, 0x00, 0x03, // ................
+ 0x00, 0x00, 0x0e, 0x80, 0x02, 0x00, 0x90, 0x80, 0x00, 0x00, 0x55, 0xa0, 0x0e, 0x00, 0x00, 0x02, // ..........U.....
+ 0x02, 0x00, 0x01, 0x80, 0x00, 0x00, 0x55, 0x80, 0x0e, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x80, // ......U.........
+ 0x00, 0x00, 0xaa, 0x80, 0x0e, 0x00, 0x00, 0x02, 0x02, 0x00, 0x04, 0x80, 0x00, 0x00, 0xff, 0x80, // ................
+ 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0x80, 0x02, 0x00, 0xe4, 0x80, 0x00, 0x00, 0x00, 0x81, // ................
+ 0x01, 0x00, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x02, 0x01, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x80, // ................
+ 0x0f, 0x00, 0x00, 0x02, 0x01, 0x00, 0x02, 0x80, 0x00, 0x00, 0x55, 0x80, 0x0f, 0x00, 0x00, 0x02, // ..........U.....
+ 0x01, 0x00, 0x04, 0x80, 0x00, 0x00, 0xaa, 0x80, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x07, 0x80, // ................
+ 0x01, 0x00, 0xe4, 0x80, 0x00, 0x00, 0xaa, 0xa0, 0x0e, 0x00, 0x00, 0x02, 0x00, 0x08, 0x01, 0x80, // ................
+ 0x00, 0x00, 0x00, 0x80, 0x0e, 0x00, 0x00, 0x02, 0x00, 0x08, 0x02, 0x80, 0x00, 0x00, 0x55, 0x80, // ..............U.
+ 0x0e, 0x00, 0x00, 0x02, 0x00, 0x08, 0x04, 0x80, 0x00, 0x00, 0xaa, 0x80, 0x01, 0x00, 0x00, 0x02, // ................
+ 0x00, 0x08, 0x08, 0x80, 0x00, 0x00, 0xff, 0xa0, 0xff, 0xff, 0x00, 0x00, 0x00, // .............
};
static const uint8_t fs_metaballs_dx11[660] =
{
diff --git a/3rdparty/bgfx/examples/02-metaballs/fs_metaballs.sc b/3rdparty/bgfx/examples/02-metaballs/fs_metaballs.sc
index e1880706d1f..8089dfefde7 100644
--- a/3rdparty/bgfx/examples/02-metaballs/fs_metaballs.sc
+++ b/3rdparty/bgfx/examples/02-metaballs/fs_metaballs.sc
@@ -1,8 +1,8 @@
$input v_normal, v_color0
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/02-metaballs/metaballs.cpp b/3rdparty/bgfx/examples/02-metaballs/metaballs.cpp
index 982d248907f..be919f56538 100644
--- a/3rdparty/bgfx/examples/02-metaballs/metaballs.cpp
+++ b/3rdparty/bgfx/examples/02-metaballs/metaballs.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "common.h"
diff --git a/3rdparty/bgfx/examples/02-metaballs/vs_metaballs.bin.h b/3rdparty/bgfx/examples/02-metaballs/vs_metaballs.bin.h
index 1e35cc2394e..70f3e56b654 100644
--- a/3rdparty/bgfx/examples/02-metaballs/vs_metaballs.bin.h
+++ b/3rdparty/bgfx/examples/02-metaballs/vs_metaballs.bin.h
@@ -35,12 +35,12 @@ static const uint8_t vs_metaballs_glsl[537] =
0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, // v_color0 = a_col
0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // or0;.}...
};
-static const uint8_t vs_metaballs_dx9[461] =
+static const uint8_t vs_metaballs_dx9[457] =
{
0x56, 0x53, 0x48, 0x04, 0x03, 0x2c, 0xf5, 0x3f, 0x02, 0x00, 0x07, 0x75, 0x5f, 0x6d, 0x6f, 0x64, // VSH..,.?...u_mod
0x65, 0x6c, 0x04, 0x20, 0x04, 0x00, 0x03, 0x00, 0x0f, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, // el. .....u_model
- 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, 0x00, 0x00, 0x04, 0x00, 0x9c, 0x01, // ViewProj........
- 0x00, 0x03, 0xfe, 0xff, 0xfe, 0xff, 0x2f, 0x00, 0x43, 0x54, 0x41, 0x42, 0x1c, 0x00, 0x00, 0x00, // ....../.CTAB....
+ 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, 0x00, 0x00, 0x04, 0x00, 0x98, 0x01, // ViewProj........
+ 0x00, 0x03, 0xfe, 0xff, 0xfe, 0xff, 0x2e, 0x00, 0x43, 0x54, 0x41, 0x42, 0x1c, 0x00, 0x00, 0x00, // ........CTAB....
0x83, 0x00, 0x00, 0x00, 0x00, 0x03, 0xfe, 0xff, 0x02, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, // ................
0x00, 0x91, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, // ....|...D.......
0x03, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, // ....L...........
@@ -51,21 +51,21 @@ static const uint8_t vs_metaballs_dx9[461] =
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x73, 0x5f, 0x33, 0x5f, 0x30, 0x00, 0x4d, // ........vs_3_0.M
0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, // icrosoft (R) HLS
0x4c, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, // L Shader Compile
- 0x72, 0x20, 0x31, 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x30, 0x30, 0x31, 0x31, 0x2e, 0x31, 0x36, 0x33, // r 10.0.10011.163
- 0x38, 0x34, 0x00, 0xab, 0x1f, 0x00, 0x00, 0x02, 0x0a, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f, 0x90, // 84..............
- 0x1f, 0x00, 0x00, 0x02, 0x03, 0x00, 0x00, 0x80, 0x01, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, // ................
- 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, // ................
- 0x00, 0x00, 0x0f, 0xe0, 0x1f, 0x00, 0x00, 0x02, 0x0a, 0x00, 0x00, 0x80, 0x01, 0x00, 0x0f, 0xe0, // ................
- 0x1f, 0x00, 0x00, 0x02, 0x05, 0x00, 0x01, 0x80, 0x02, 0x00, 0x07, 0xe0, 0x05, 0x00, 0x00, 0x03, // ................
- 0x00, 0x00, 0x0f, 0x80, 0x01, 0x00, 0xe4, 0xa0, 0x02, 0x00, 0x55, 0x90, 0x04, 0x00, 0x00, 0x04, // ..........U.....
- 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0xe4, 0xa0, 0x02, 0x00, 0x00, 0x90, 0x00, 0x00, 0xe4, 0x80, // ................
- 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0f, 0x80, 0x02, 0x00, 0xe4, 0xa0, 0x02, 0x00, 0xaa, 0x90, // ................
- 0x00, 0x00, 0xe4, 0x80, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, 0xe4, 0x80, // ................
- 0x03, 0x00, 0xe4, 0xa0, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x07, 0x80, 0x05, 0x00, 0xe4, 0xa0, // ................
- 0x01, 0x00, 0x55, 0x90, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0x80, 0x04, 0x00, 0xe4, 0xa0, // ..U.............
- 0x01, 0x00, 0x00, 0x90, 0x00, 0x00, 0xe4, 0x80, 0x04, 0x00, 0x00, 0x04, 0x02, 0x00, 0x07, 0xe0, // ................
- 0x06, 0x00, 0xe4, 0xa0, 0x01, 0x00, 0xaa, 0x90, 0x00, 0x00, 0xe4, 0x80, 0x01, 0x00, 0x00, 0x02, // ................
- 0x01, 0x00, 0x0f, 0xe0, 0x00, 0x00, 0xe4, 0x90, 0xff, 0xff, 0x00, 0x00, 0x00, // .............
+ 0x72, 0x20, 0x39, 0x2e, 0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, 0x2e, 0x33, 0x31, 0x31, 0x31, 0x00, // r 9.29.952.3111.
+ 0x1f, 0x00, 0x00, 0x02, 0x0a, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, // ................
+ 0x03, 0x00, 0x00, 0x80, 0x01, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, // ................
+ 0x02, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f, 0xe0, // ................
+ 0x1f, 0x00, 0x00, 0x02, 0x0a, 0x00, 0x00, 0x80, 0x01, 0x00, 0x0f, 0xe0, 0x1f, 0x00, 0x00, 0x02, // ................
+ 0x05, 0x00, 0x01, 0x80, 0x02, 0x00, 0x07, 0xe0, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0x80, // ................
+ 0x01, 0x00, 0xe4, 0xa0, 0x02, 0x00, 0x55, 0x90, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0f, 0x80, // ......U.........
+ 0x00, 0x00, 0xe4, 0xa0, 0x02, 0x00, 0x00, 0x90, 0x00, 0x00, 0xe4, 0x80, 0x04, 0x00, 0x00, 0x04, // ................
+ 0x00, 0x00, 0x0f, 0x80, 0x02, 0x00, 0xe4, 0xa0, 0x02, 0x00, 0xaa, 0x90, 0x00, 0x00, 0xe4, 0x80, // ................
+ 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, 0xe4, 0x80, 0x03, 0x00, 0xe4, 0xa0, // ................
+ 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x07, 0x80, 0x05, 0x00, 0xe4, 0xa0, 0x01, 0x00, 0x55, 0x90, // ..............U.
+ 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0x80, 0x04, 0x00, 0xe4, 0xa0, 0x01, 0x00, 0x00, 0x90, // ................
+ 0x00, 0x00, 0xe4, 0x80, 0x04, 0x00, 0x00, 0x04, 0x02, 0x00, 0x07, 0xe0, 0x06, 0x00, 0xe4, 0xa0, // ................
+ 0x01, 0x00, 0xaa, 0x90, 0x00, 0x00, 0xe4, 0x80, 0x01, 0x00, 0x00, 0x02, 0x01, 0x00, 0x0f, 0xe0, // ................
+ 0x00, 0x00, 0xe4, 0x90, 0xff, 0xff, 0x00, 0x00, 0x00, // .........
};
static const uint8_t vs_metaballs_dx11[726] =
{
diff --git a/3rdparty/bgfx/examples/02-metaballs/vs_metaballs.sc b/3rdparty/bgfx/examples/02-metaballs/vs_metaballs.sc
index 95a566421a5..d484d6f4498 100644
--- a/3rdparty/bgfx/examples/02-metaballs/vs_metaballs.sc
+++ b/3rdparty/bgfx/examples/02-metaballs/vs_metaballs.sc
@@ -2,8 +2,8 @@ $input a_position, a_normal, a_color0
$output v_normal, v_color0
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/03-raymarch/fs_raymarching.sc b/3rdparty/bgfx/examples/03-raymarch/fs_raymarching.sc
index d58ff1f7a2e..73b470920b4 100644
--- a/3rdparty/bgfx/examples/03-raymarch/fs_raymarching.sc
+++ b/3rdparty/bgfx/examples/03-raymarch/fs_raymarching.sc
@@ -1,8 +1,8 @@
$input v_color0, v_texcoord0
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
// References:
diff --git a/3rdparty/bgfx/examples/03-raymarch/raymarch.cpp b/3rdparty/bgfx/examples/03-raymarch/raymarch.cpp
index 1ba4d3ecea4..df07fc7ea42 100644
--- a/3rdparty/bgfx/examples/03-raymarch/raymarch.cpp
+++ b/3rdparty/bgfx/examples/03-raymarch/raymarch.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "common.h"
diff --git a/3rdparty/bgfx/examples/03-raymarch/vs_raymarching.sc b/3rdparty/bgfx/examples/03-raymarch/vs_raymarching.sc
index ab9f9d6be30..3b2eee0c297 100644
--- a/3rdparty/bgfx/examples/03-raymarch/vs_raymarching.sc
+++ b/3rdparty/bgfx/examples/03-raymarch/vs_raymarching.sc
@@ -2,8 +2,8 @@ $input a_position, a_color0, a_texcoord0
$output v_color0, v_texcoord0
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/04-mesh/fs_mesh.sc b/3rdparty/bgfx/examples/04-mesh/fs_mesh.sc
index 5ee47bf9182..1f8bc989526 100644
--- a/3rdparty/bgfx/examples/04-mesh/fs_mesh.sc
+++ b/3rdparty/bgfx/examples/04-mesh/fs_mesh.sc
@@ -1,8 +1,8 @@
$input v_pos, v_view, v_normal, v_color0
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/04-mesh/mesh.cpp b/3rdparty/bgfx/examples/04-mesh/mesh.cpp
index 8c10b2b36d3..854cf1a23a3 100644
--- a/3rdparty/bgfx/examples/04-mesh/mesh.cpp
+++ b/3rdparty/bgfx/examples/04-mesh/mesh.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "common.h"
diff --git a/3rdparty/bgfx/examples/04-mesh/vs_mesh.sc b/3rdparty/bgfx/examples/04-mesh/vs_mesh.sc
index ba9a3069515..a7a2bc4f6a0 100644
--- a/3rdparty/bgfx/examples/04-mesh/vs_mesh.sc
+++ b/3rdparty/bgfx/examples/04-mesh/vs_mesh.sc
@@ -2,8 +2,8 @@ $input a_position, a_normal
$output v_pos, v_view, v_normal, v_color0
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/05-instancing/fs_instancing.sc b/3rdparty/bgfx/examples/05-instancing/fs_instancing.sc
index 4fc0a0a82ba..43148e6a8dd 100644
--- a/3rdparty/bgfx/examples/05-instancing/fs_instancing.sc
+++ b/3rdparty/bgfx/examples/05-instancing/fs_instancing.sc
@@ -1,8 +1,8 @@
$input v_color0
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/05-instancing/instancing.cpp b/3rdparty/bgfx/examples/05-instancing/instancing.cpp
index 3d9f9505a6e..f0a62ea1039 100644
--- a/3rdparty/bgfx/examples/05-instancing/instancing.cpp
+++ b/3rdparty/bgfx/examples/05-instancing/instancing.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "common.h"
diff --git a/3rdparty/bgfx/examples/05-instancing/vs_instancing.sc b/3rdparty/bgfx/examples/05-instancing/vs_instancing.sc
index 230d093c8d5..ea05d874e70 100644
--- a/3rdparty/bgfx/examples/05-instancing/vs_instancing.sc
+++ b/3rdparty/bgfx/examples/05-instancing/vs_instancing.sc
@@ -2,8 +2,8 @@ $input a_position, a_color0, i_data0, i_data1, i_data2, i_data3, i_data4
$output v_color0
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/06-bump/bump.cpp b/3rdparty/bgfx/examples/06-bump/bump.cpp
index e373bf65253..2956caddf64 100644
--- a/3rdparty/bgfx/examples/06-bump/bump.cpp
+++ b/3rdparty/bgfx/examples/06-bump/bump.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "common.h"
diff --git a/3rdparty/bgfx/examples/06-bump/fs_bump.sc b/3rdparty/bgfx/examples/06-bump/fs_bump.sc
index f5806ebe30e..38e9044684c 100644
--- a/3rdparty/bgfx/examples/06-bump/fs_bump.sc
+++ b/3rdparty/bgfx/examples/06-bump/fs_bump.sc
@@ -1,8 +1,8 @@
$input v_wpos, v_view, v_normal, v_tangent, v_bitangent, v_texcoord0 // in...
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/06-bump/vs_bump.sc b/3rdparty/bgfx/examples/06-bump/vs_bump.sc
index c94b7e58d06..161120ce700 100644
--- a/3rdparty/bgfx/examples/06-bump/vs_bump.sc
+++ b/3rdparty/bgfx/examples/06-bump/vs_bump.sc
@@ -2,8 +2,8 @@ $input a_position, a_normal, a_tangent, a_texcoord0
$output v_wpos, v_view, v_normal, v_tangent, v_bitangent, v_texcoord0
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/06-bump/vs_bump_instanced.sc b/3rdparty/bgfx/examples/06-bump/vs_bump_instanced.sc
index 2f209b41238..766fe1646a2 100644
--- a/3rdparty/bgfx/examples/06-bump/vs_bump_instanced.sc
+++ b/3rdparty/bgfx/examples/06-bump/vs_bump_instanced.sc
@@ -2,8 +2,8 @@ $input a_position, a_normal, a_tangent, a_texcoord0, i_data0, i_data1, i_data2,
$output v_wpos, v_view, v_normal, v_tangent, v_bitangent, v_texcoord0
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/07-callback/callback.cpp b/3rdparty/bgfx/examples/07-callback/callback.cpp
index 0def881acdc..cdc1b6b5b5a 100644
--- a/3rdparty/bgfx/examples/07-callback/callback.cpp
+++ b/3rdparty/bgfx/examples/07-callback/callback.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "common.h"
@@ -291,7 +291,7 @@ struct BgfxCallback : public bgfx::CallbackI
AviWriter* m_writer;
};
-class BgfxAllocator : public bx::ReallocatorI
+class BgfxAllocator : public bx::AllocatorI
{
public:
BgfxAllocator()
@@ -304,39 +304,40 @@ public:
{
}
- virtual void* alloc(size_t _size, size_t _align, const char* _file, uint32_t _line) BX_OVERRIDE
+ virtual void* realloc(void* _ptr, size_t _size, size_t _align, const char* _file, uint32_t _line) BX_OVERRIDE
{
- if (BX_CONFIG_ALLOCATOR_NATURAL_ALIGNMENT >= _align)
+ if (0 == _size)
{
- void* ptr = ::malloc(_size);
- dbgPrintf("%s(%d): ALLOC %p of %d byte(s)\n", _file, _line, ptr, _size);
- ++m_numBlocks;
- m_maxBlocks = bx::uint32_max(m_maxBlocks, m_numBlocks);
- return ptr;
- }
-
- return bx::alignedAlloc(this, _size, _align, _file, _line);
- }
+ if (NULL != _ptr)
+ {
+ if (BX_CONFIG_ALLOCATOR_NATURAL_ALIGNMENT >= _align)
+ {
+ dbgPrintf("%s(%d): FREE %p\n", _file, _line, _ptr);
+ ::free(_ptr);
+ --m_numBlocks;
+ }
+ else
+ {
+ bx::alignedFree(this, _ptr, _align, _file, _line);
+ }
+ }
- virtual void free(void* _ptr, size_t _align, const char* _file, uint32_t _line) BX_OVERRIDE
- {
- if (NULL != _ptr)
+ return NULL;
+ }
+ else if (NULL == _ptr)
{
if (BX_CONFIG_ALLOCATOR_NATURAL_ALIGNMENT >= _align)
{
- dbgPrintf("%s(%d): FREE %p\n", _file, _line, _ptr);
- ::free(_ptr);
- --m_numBlocks;
- }
- else
- {
- bx::alignedFree(this, _ptr, _align, _file, _line);
+ void* ptr = ::malloc(_size);
+ dbgPrintf("%s(%d): ALLOC %p of %d byte(s)\n", _file, _line, ptr, _size);
+ ++m_numBlocks;
+ m_maxBlocks = bx::uint32_max(m_maxBlocks, m_numBlocks);
+ return ptr;
}
+
+ return bx::alignedAlloc(this, _size, _align, _file, _line);
}
- }
- virtual void* realloc(void* _ptr, size_t _size, size_t _align, const char* _file, uint32_t _line) BX_OVERRIDE
- {
if (BX_CONFIG_ALLOCATOR_NATURAL_ALIGNMENT >= _align)
{
void* ptr = ::realloc(_ptr, _size);
diff --git a/3rdparty/bgfx/examples/07-callback/fs_callback.sc b/3rdparty/bgfx/examples/07-callback/fs_callback.sc
index 07750d51853..1300f416033 100644
--- a/3rdparty/bgfx/examples/07-callback/fs_callback.sc
+++ b/3rdparty/bgfx/examples/07-callback/fs_callback.sc
@@ -1,8 +1,8 @@
$input v_world, v_color0
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/07-callback/vs_callback.sc b/3rdparty/bgfx/examples/07-callback/vs_callback.sc
index dc91527775d..0625c2299ec 100644
--- a/3rdparty/bgfx/examples/07-callback/vs_callback.sc
+++ b/3rdparty/bgfx/examples/07-callback/vs_callback.sc
@@ -2,8 +2,8 @@ $input a_position, a_color0
$output v_world, v_color0
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/08-update/fs_update.sc b/3rdparty/bgfx/examples/08-update/fs_update.sc
index 2e0313dca30..93aa8c3502a 100644
--- a/3rdparty/bgfx/examples/08-update/fs_update.sc
+++ b/3rdparty/bgfx/examples/08-update/fs_update.sc
@@ -1,8 +1,8 @@
$input v_texcoord0
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/08-update/fs_update_3d.sc b/3rdparty/bgfx/examples/08-update/fs_update_3d.sc
index f99f994f7a9..d5a0c6f3339 100644
--- a/3rdparty/bgfx/examples/08-update/fs_update_3d.sc
+++ b/3rdparty/bgfx/examples/08-update/fs_update_3d.sc
@@ -1,8 +1,8 @@
$input v_texcoord0
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/08-update/fs_update_cmp.sc b/3rdparty/bgfx/examples/08-update/fs_update_cmp.sc
index daf378ba08e..77a8a5e8eff 100644
--- a/3rdparty/bgfx/examples/08-update/fs_update_cmp.sc
+++ b/3rdparty/bgfx/examples/08-update/fs_update_cmp.sc
@@ -1,8 +1,8 @@
$input v_texcoord0
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/08-update/update.cpp b/3rdparty/bgfx/examples/08-update/update.cpp
index cc2fb3149ef..65045d383fd 100644
--- a/3rdparty/bgfx/examples/08-update/update.cpp
+++ b/3rdparty/bgfx/examples/08-update/update.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "common.h"
diff --git a/3rdparty/bgfx/examples/08-update/vs_update.sc b/3rdparty/bgfx/examples/08-update/vs_update.sc
index 0b585f0adcc..d82aff94b87 100644
--- a/3rdparty/bgfx/examples/08-update/vs_update.sc
+++ b/3rdparty/bgfx/examples/08-update/vs_update.sc
@@ -2,8 +2,8 @@ $input a_position, a_texcoord0
$output v_texcoord0
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/09-hdr/common.sh b/3rdparty/bgfx/examples/09-hdr/common.sh
index 8ed16af170d..fa6e6223aa9 100644
--- a/3rdparty/bgfx/examples/09-hdr/common.sh
+++ b/3rdparty/bgfx/examples/09-hdr/common.sh
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/09-hdr/fs_hdr_blur.sc b/3rdparty/bgfx/examples/09-hdr/fs_hdr_blur.sc
index 0b236460b96..3dd87c11803 100644
--- a/3rdparty/bgfx/examples/09-hdr/fs_hdr_blur.sc
+++ b/3rdparty/bgfx/examples/09-hdr/fs_hdr_blur.sc
@@ -1,8 +1,8 @@
$input v_texcoord0, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "common.sh"
diff --git a/3rdparty/bgfx/examples/09-hdr/fs_hdr_bright.sc b/3rdparty/bgfx/examples/09-hdr/fs_hdr_bright.sc
index 411970a9985..3a3d7457a79 100644
--- a/3rdparty/bgfx/examples/09-hdr/fs_hdr_bright.sc
+++ b/3rdparty/bgfx/examples/09-hdr/fs_hdr_bright.sc
@@ -1,8 +1,8 @@
$input v_texcoord0
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "common.sh"
diff --git a/3rdparty/bgfx/examples/09-hdr/fs_hdr_lum.sc b/3rdparty/bgfx/examples/09-hdr/fs_hdr_lum.sc
index 4a2c355d65c..d73664cb5de 100644
--- a/3rdparty/bgfx/examples/09-hdr/fs_hdr_lum.sc
+++ b/3rdparty/bgfx/examples/09-hdr/fs_hdr_lum.sc
@@ -1,8 +1,8 @@
$input v_texcoord0
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "common.sh"
diff --git a/3rdparty/bgfx/examples/09-hdr/fs_hdr_lumavg.sc b/3rdparty/bgfx/examples/09-hdr/fs_hdr_lumavg.sc
index f533d7100a7..6071742d0ae 100644
--- a/3rdparty/bgfx/examples/09-hdr/fs_hdr_lumavg.sc
+++ b/3rdparty/bgfx/examples/09-hdr/fs_hdr_lumavg.sc
@@ -1,8 +1,8 @@
$input v_texcoord0
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "common.sh"
diff --git a/3rdparty/bgfx/examples/09-hdr/fs_hdr_mesh.sc b/3rdparty/bgfx/examples/09-hdr/fs_hdr_mesh.sc
index 3e6b5be2986..c73a947f99f 100644
--- a/3rdparty/bgfx/examples/09-hdr/fs_hdr_mesh.sc
+++ b/3rdparty/bgfx/examples/09-hdr/fs_hdr_mesh.sc
@@ -1,8 +1,8 @@
$input v_pos, v_view, v_normal
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "common.sh"
diff --git a/3rdparty/bgfx/examples/09-hdr/fs_hdr_skybox.sc b/3rdparty/bgfx/examples/09-hdr/fs_hdr_skybox.sc
index 7439322791c..14cc57e3f30 100644
--- a/3rdparty/bgfx/examples/09-hdr/fs_hdr_skybox.sc
+++ b/3rdparty/bgfx/examples/09-hdr/fs_hdr_skybox.sc
@@ -1,8 +1,8 @@
$input v_texcoord0
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "common.sh"
diff --git a/3rdparty/bgfx/examples/09-hdr/fs_hdr_tonemap.sc b/3rdparty/bgfx/examples/09-hdr/fs_hdr_tonemap.sc
index 62a071c0e0a..e6301b64c38 100644
--- a/3rdparty/bgfx/examples/09-hdr/fs_hdr_tonemap.sc
+++ b/3rdparty/bgfx/examples/09-hdr/fs_hdr_tonemap.sc
@@ -1,8 +1,8 @@
$input v_texcoord0, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "common.sh"
diff --git a/3rdparty/bgfx/examples/09-hdr/hdr.cpp b/3rdparty/bgfx/examples/09-hdr/hdr.cpp
index a5985f45e75..14f6edca81b 100644
--- a/3rdparty/bgfx/examples/09-hdr/hdr.cpp
+++ b/3rdparty/bgfx/examples/09-hdr/hdr.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "common.h"
@@ -336,7 +336,7 @@ class HDR : public entry::AppI
{
union { uint32_t color; uint8_t bgra[4]; } cast = { m_lumBgra8 };
float exponent = cast.bgra[3]/255.0f * 255.0f - 128.0f;
- float lumAvg = cast.bgra[2]/255.0f * exp2(exponent);
+ float lumAvg = cast.bgra[2]/255.0f * bx::fexp2(exponent);
imguiSlider("Lum Avg", lumAvg, 0.0f, 1.0f, 0.01f, false);
}
diff --git a/3rdparty/bgfx/examples/09-hdr/vs_hdr_blur.sc b/3rdparty/bgfx/examples/09-hdr/vs_hdr_blur.sc
index d08cacc8474..d75d33a9ad6 100644
--- a/3rdparty/bgfx/examples/09-hdr/vs_hdr_blur.sc
+++ b/3rdparty/bgfx/examples/09-hdr/vs_hdr_blur.sc
@@ -2,8 +2,8 @@ $input a_position, a_texcoord0
$output v_texcoord0, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/09-hdr/vs_hdr_bright.sc b/3rdparty/bgfx/examples/09-hdr/vs_hdr_bright.sc
index 0b585f0adcc..d82aff94b87 100644
--- a/3rdparty/bgfx/examples/09-hdr/vs_hdr_bright.sc
+++ b/3rdparty/bgfx/examples/09-hdr/vs_hdr_bright.sc
@@ -2,8 +2,8 @@ $input a_position, a_texcoord0
$output v_texcoord0
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/09-hdr/vs_hdr_lum.sc b/3rdparty/bgfx/examples/09-hdr/vs_hdr_lum.sc
index 0b585f0adcc..d82aff94b87 100644
--- a/3rdparty/bgfx/examples/09-hdr/vs_hdr_lum.sc
+++ b/3rdparty/bgfx/examples/09-hdr/vs_hdr_lum.sc
@@ -2,8 +2,8 @@ $input a_position, a_texcoord0
$output v_texcoord0
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/09-hdr/vs_hdr_lumavg.sc b/3rdparty/bgfx/examples/09-hdr/vs_hdr_lumavg.sc
index 0b585f0adcc..d82aff94b87 100644
--- a/3rdparty/bgfx/examples/09-hdr/vs_hdr_lumavg.sc
+++ b/3rdparty/bgfx/examples/09-hdr/vs_hdr_lumavg.sc
@@ -2,8 +2,8 @@ $input a_position, a_texcoord0
$output v_texcoord0
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/09-hdr/vs_hdr_mesh.sc b/3rdparty/bgfx/examples/09-hdr/vs_hdr_mesh.sc
index a23df59bead..34fc1e14f21 100644
--- a/3rdparty/bgfx/examples/09-hdr/vs_hdr_mesh.sc
+++ b/3rdparty/bgfx/examples/09-hdr/vs_hdr_mesh.sc
@@ -2,8 +2,8 @@ $input a_position, a_normal
$output v_pos, v_view, v_normal
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/09-hdr/vs_hdr_skybox.sc b/3rdparty/bgfx/examples/09-hdr/vs_hdr_skybox.sc
index 0b585f0adcc..d82aff94b87 100644
--- a/3rdparty/bgfx/examples/09-hdr/vs_hdr_skybox.sc
+++ b/3rdparty/bgfx/examples/09-hdr/vs_hdr_skybox.sc
@@ -2,8 +2,8 @@ $input a_position, a_texcoord0
$output v_texcoord0
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/09-hdr/vs_hdr_tonemap.sc b/3rdparty/bgfx/examples/09-hdr/vs_hdr_tonemap.sc
index 61e5dbe35d2..a9ab382591f 100644
--- a/3rdparty/bgfx/examples/09-hdr/vs_hdr_tonemap.sc
+++ b/3rdparty/bgfx/examples/09-hdr/vs_hdr_tonemap.sc
@@ -2,8 +2,8 @@ $input a_position, a_texcoord0
$output v_texcoord0, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/10-font/font.cpp b/3rdparty/bgfx/examples/10-font/font.cpp
index 1701e566c41..97111e1b175 100644
--- a/3rdparty/bgfx/examples/10-font/font.cpp
+++ b/3rdparty/bgfx/examples/10-font/font.cpp
@@ -1,6 +1,6 @@
/*
* Copyright 2013 Jeremie Roy. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "common.h"
diff --git a/3rdparty/bgfx/examples/11-fontsdf/fontsdf.cpp b/3rdparty/bgfx/examples/11-fontsdf/fontsdf.cpp
index 72881bb908e..37a64abb72d 100644
--- a/3rdparty/bgfx/examples/11-fontsdf/fontsdf.cpp
+++ b/3rdparty/bgfx/examples/11-fontsdf/fontsdf.cpp
@@ -1,6 +1,6 @@
/*
* Copyright 2013 Jeremie Roy. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "common.h"
diff --git a/3rdparty/bgfx/examples/12-lod/fs_tree.sc b/3rdparty/bgfx/examples/12-lod/fs_tree.sc
index 7b8e0fbb1f6..72649c5f664 100644
--- a/3rdparty/bgfx/examples/12-lod/fs_tree.sc
+++ b/3rdparty/bgfx/examples/12-lod/fs_tree.sc
@@ -2,7 +2,7 @@ $input v_pos, v_view, v_normal, v_texcoord0
/*
* Copyright 2013 Milos Tosic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/12-lod/lod.cpp b/3rdparty/bgfx/examples/12-lod/lod.cpp
index d47cc3708c5..e133872494f 100644
--- a/3rdparty/bgfx/examples/12-lod/lod.cpp
+++ b/3rdparty/bgfx/examples/12-lod/lod.cpp
@@ -1,6 +1,6 @@
/*
* Copyright 2013 Milos Tosic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "common.h"
diff --git a/3rdparty/bgfx/examples/12-lod/vs_tree.sc b/3rdparty/bgfx/examples/12-lod/vs_tree.sc
index c4274e8d11f..3ec3f6680dd 100644
--- a/3rdparty/bgfx/examples/12-lod/vs_tree.sc
+++ b/3rdparty/bgfx/examples/12-lod/vs_tree.sc
@@ -3,7 +3,7 @@ $output v_pos, v_view, v_normal, v_texcoord0
/*
* Copyright 2013 Milos Tosic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/13-stencil/fs_stencil_color_black.sc b/3rdparty/bgfx/examples/13-stencil/fs_stencil_color_black.sc
index 7adb966b99c..975df704e73 100644
--- a/3rdparty/bgfx/examples/13-stencil/fs_stencil_color_black.sc
+++ b/3rdparty/bgfx/examples/13-stencil/fs_stencil_color_black.sc
@@ -1,6 +1,6 @@
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/13-stencil/fs_stencil_color_lightning.sc b/3rdparty/bgfx/examples/13-stencil/fs_stencil_color_lighting.sc
index a35e00ac094..ae11cd4ca6e 100644
--- a/3rdparty/bgfx/examples/13-stencil/fs_stencil_color_lightning.sc
+++ b/3rdparty/bgfx/examples/13-stencil/fs_stencil_color_lighting.sc
@@ -2,7 +2,7 @@ $input v_normal, v_view
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
@@ -17,12 +17,12 @@ uniform vec4 u_specular_shininess;
uniform vec4 u_lightPosRadius[MAX_NUM_LIGHTS];
uniform vec4 u_lightRgbInnerR[MAX_NUM_LIGHTS];
-#define u_ambientPass u_params.x
-#define u_lightningPass u_params.y
-#define u_lightCount u_params.z
-#define u_lightIndex u_params.w
-#define u_specular u_specular_shininess.xyz
-#define u_shininess u_specular_shininess.w
+#define u_ambientPass u_params.x
+#define u_lightingPass u_params.y
+#define u_lightCount u_params.z
+#define u_lightIndex u_params.w
+#define u_specular u_specular_shininess.xyz
+#define u_shininess u_specular_shininess.w
vec2 blinn(vec3 _lightDir, vec3 _normal, vec3 _viewDir)
{
@@ -76,7 +76,7 @@ void main()
}
lightColor += calcLight(ii, v_view, normal, viewDir) * condition;
}
- lightColor *= u_lightningPass;
+ lightColor *= u_lightingPass;
vec3 color = u_color.xyz;
diff --git a/3rdparty/bgfx/examples/13-stencil/fs_stencil_color_texture.sc b/3rdparty/bgfx/examples/13-stencil/fs_stencil_color_texture.sc
index fafbf3de211..1971de51ae0 100644
--- a/3rdparty/bgfx/examples/13-stencil/fs_stencil_color_texture.sc
+++ b/3rdparty/bgfx/examples/13-stencil/fs_stencil_color_texture.sc
@@ -2,7 +2,7 @@ $input v_texcoord0
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/13-stencil/fs_stencil_texture.sc b/3rdparty/bgfx/examples/13-stencil/fs_stencil_texture.sc
index 0f33138b7ff..098fa5b9df1 100644
--- a/3rdparty/bgfx/examples/13-stencil/fs_stencil_texture.sc
+++ b/3rdparty/bgfx/examples/13-stencil/fs_stencil_texture.sc
@@ -2,7 +2,7 @@ $input v_texcoord0
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/13-stencil/fs_stencil_texture_lightning.sc b/3rdparty/bgfx/examples/13-stencil/fs_stencil_texture_lighting.sc
index 43e4ff38190..e0dbcbd147d 100644
--- a/3rdparty/bgfx/examples/13-stencil/fs_stencil_texture_lightning.sc
+++ b/3rdparty/bgfx/examples/13-stencil/fs_stencil_texture_lighting.sc
@@ -2,7 +2,7 @@ $input v_normal, v_view, v_texcoord0
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/13-stencil/stencil.cpp b/3rdparty/bgfx/examples/13-stencil/stencil.cpp
index 168c19ba569..94302bb2163 100644
--- a/3rdparty/bgfx/examples/13-stencil/stencil.cpp
+++ b/3rdparty/bgfx/examples/13-stencil/stencil.cpp
@@ -1,6 +1,6 @@
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include <string>
@@ -9,11 +9,7 @@
#include "common.h"
#include "bgfx_utils.h"
-#include <bgfx/bgfx.h>
-#include <bx/timer.h>
#include <bx/readerwriter.h>
-#include <bx/fpumath.h>
-#include "entry/entry.h"
#include "camera.h"
#include "imgui/imgui.h"
@@ -277,7 +273,7 @@ struct Uniforms
void init()
{
m_params.m_ambientPass = 1.0f;
- m_params.m_lightningPass = 1.0f;
+ m_params.m_lightingPass = 1.0f;
m_params.m_lightCount = 4.0f;
m_params.m_lightIndex = 4.0f;
@@ -356,7 +352,7 @@ struct Uniforms
struct Params
{
float m_ambientPass;
- float m_lightningPass;
+ float m_lightingPass;
float m_lightCount;
float m_lightIndex;
};
@@ -382,7 +378,7 @@ struct Uniforms
/**
* u_params.x - u_ambientPass
- * u_params.y - u_lightningPass
+ * u_params.y - u_lightingPass
* u_params.z - u_lightCount
* u_params.w - u_lightIndex
*/
@@ -867,11 +863,11 @@ int _main_(int _argc, char** _argv)
s_texColor = bgfx::createUniform("s_texColor", bgfx::UniformType::Int1);
- bgfx::ProgramHandle programTextureLightning = loadProgram("vs_stencil_texture_lightning", "fs_stencil_texture_lightning");
- bgfx::ProgramHandle programColorLightning = loadProgram("vs_stencil_color_lightning", "fs_stencil_color_lightning" );
- bgfx::ProgramHandle programColorTexture = loadProgram("vs_stencil_color_texture", "fs_stencil_color_texture" );
- bgfx::ProgramHandle programColorBlack = loadProgram("vs_stencil_color", "fs_stencil_color_black" );
- bgfx::ProgramHandle programTexture = loadProgram("vs_stencil_texture", "fs_stencil_texture" );
+ bgfx::ProgramHandle programTextureLighting = loadProgram("vs_stencil_texture_lighting", "fs_stencil_texture_lighting");
+ bgfx::ProgramHandle programColorLighting = loadProgram("vs_stencil_color_lighting", "fs_stencil_color_lighting" );
+ bgfx::ProgramHandle programColorTexture = loadProgram("vs_stencil_color_texture", "fs_stencil_color_texture" );
+ bgfx::ProgramHandle programColorBlack = loadProgram("vs_stencil_color", "fs_stencil_color_black" );
+ bgfx::ProgramHandle programTexture = loadProgram("vs_stencil_texture", "fs_stencil_texture" );
Mesh bunnyMesh;
Mesh columnMesh;
@@ -990,7 +986,7 @@ int _main_(int _argc, char** _argv)
// Update settings.
uint8_t numLights = (uint8_t)settings_numLights;
s_uniforms.m_params.m_ambientPass = 1.0f;
- s_uniforms.m_params.m_lightningPass = 1.0f;
+ s_uniforms.m_params.m_lightingPass = 1.0f;
s_uniforms.m_params.m_lightCount = settings_numLights;
s_uniforms.m_params.m_lightIndex = 0.0f;
s_uniforms.m_color[3] = settings_reflectionValue;
@@ -1002,7 +998,7 @@ int _main_(int _argc, char** _argv)
last = now;
const double freq = double(bx::getHPFrequency() );
const double toMs = 1000.0/freq;
- float time = (float)( (now - timeOffset)/double(bx::getHPFrequency() ) );
+ const float time = (float)( (now - timeOffset)/double(bx::getHPFrequency() ) );
const float deltaTime = float(frameTime/freq);
s_uniforms.m_time = time;
@@ -1128,7 +1124,7 @@ int _main_(int _argc, char** _argv)
// Setup params for this scene.
s_uniforms.m_params.m_ambientPass = 1.0f;
- s_uniforms.m_params.m_lightningPass = 1.0f;
+ s_uniforms.m_params.m_lightingPass = 1.0f;
// Floor.
hplaneMesh.submit(RENDER_VIEWID_RANGE1_PASS_0
@@ -1162,7 +1158,7 @@ int _main_(int _argc, char** _argv)
bx::mtxMul(mtxReflectedBunny, bunnyMtx, reflectMtx);
bunnyMesh.submit(RENDER_VIEWID_RANGE1_PASS_1
, mtxReflectedBunny
- , programColorLightning
+ , programColorLighting
, s_renderStates[RenderState::StencilReflection_DrawReflected]
);
@@ -1173,7 +1169,7 @@ int _main_(int _argc, char** _argv)
bx::mtxMul(mtxReflectedColumn, columnMtx[ii], reflectMtx);
columnMesh.submit(RENDER_VIEWID_RANGE1_PASS_1
, mtxReflectedColumn
- , programColorLightning
+ , programColorLighting
, s_renderStates[RenderState::StencilReflection_DrawReflected]
);
}
@@ -1185,7 +1181,7 @@ int _main_(int _argc, char** _argv)
// Floor.
hplaneMesh.submit(RENDER_VIEWID_RANGE1_PASS_2
, floorMtx
- , programTextureLightning
+ , programTextureLighting
, s_renderStates[RenderState::StencilReflection_BlendPlane]
, fieldstoneTex
);
@@ -1195,7 +1191,7 @@ int _main_(int _argc, char** _argv)
// Bunny.
bunnyMesh.submit(RENDER_VIEWID_RANGE1_PASS_3
, bunnyMtx
- , programColorLightning
+ , programColorLighting
, s_renderStates[RenderState::StencilReflection_DrawScene]
);
@@ -1204,7 +1200,7 @@ int _main_(int _argc, char** _argv)
{
columnMesh.submit(RENDER_VIEWID_RANGE1_PASS_3
, columnMtx[ii]
- , programColorLightning
+ , programColorLighting
, s_renderStates[RenderState::StencilReflection_DrawScene]
);
}
@@ -1216,19 +1212,19 @@ int _main_(int _argc, char** _argv)
{
// First pass - Draw entire scene. (ambient only).
s_uniforms.m_params.m_ambientPass = 1.0f;
- s_uniforms.m_params.m_lightningPass = 0.0f;
+ s_uniforms.m_params.m_lightingPass = 0.0f;
// Bunny.
bunnyMesh.submit(RENDER_VIEWID_RANGE1_PASS_0
, bunnyMtx
- , programColorLightning
+ , programColorLighting
, s_renderStates[RenderState::ProjectionShadows_DrawAmbient]
);
// Floor.
hplaneMesh.submit(RENDER_VIEWID_RANGE1_PASS_0
, floorMtx
- , programTextureLightning
+ , programTextureLighting
, s_renderStates[RenderState::ProjectionShadows_DrawAmbient]
, fieldstoneTex
);
@@ -1238,7 +1234,7 @@ int _main_(int _argc, char** _argv)
{
cubeMesh.submit(RENDER_VIEWID_RANGE1_PASS_0
, cubeMtx[ii]
- , programTextureLightning
+ , programTextureLighting
, s_renderStates[RenderState::ProjectionShadows_DrawAmbient]
, figureTex
);
@@ -1289,23 +1285,23 @@ int _main_(int _argc, char** _argv)
);
}
- // Draw entire scene. (lightning pass only. blending is on)
+ // Draw entire scene. (lighting pass only. blending is on)
s_uniforms.m_params.m_ambientPass = 0.0f;
- s_uniforms.m_params.m_lightningPass = 1.0f;
+ s_uniforms.m_params.m_lightingPass = 1.0f;
s_uniforms.m_params.m_lightCount = 1.0f;
s_uniforms.m_params.m_lightIndex = float(ii);
// Bunny.
bunnyMesh.submit(viewId
, bunnyMtx
- , programColorLightning
+ , programColorLighting
, s_renderStates[RenderState::ProjectionShadows_DrawDiffuse]
);
// Floor.
hplaneMesh.submit(viewId
, floorMtx
- , programTextureLightning
+ , programTextureLighting
, s_renderStates[RenderState::ProjectionShadows_DrawDiffuse]
, fieldstoneTex
);
@@ -1315,7 +1311,7 @@ int _main_(int _argc, char** _argv)
{
cubeMesh.submit(viewId
, cubeMtx[jj]
- , programTextureLightning
+ , programTextureLighting
, s_renderStates[RenderState::ProjectionShadows_DrawDiffuse]
, figureTex
);
@@ -1324,7 +1320,7 @@ int _main_(int _argc, char** _argv)
// Reset these to default..
s_uniforms.m_params.m_ambientPass = 1.0f;
- s_uniforms.m_params.m_lightningPass = 1.0f;
+ s_uniforms.m_params.m_lightingPass = 1.0f;
}
break;
};
@@ -1393,8 +1389,8 @@ int _main_(int _argc, char** _argv)
bgfx::destroyTexture(fieldstoneTex);
bgfx::destroyTexture(flareTex);
- bgfx::destroyProgram(programTextureLightning);
- bgfx::destroyProgram(programColorLightning);
+ bgfx::destroyProgram(programTextureLighting);
+ bgfx::destroyProgram(programColorLighting);
bgfx::destroyProgram(programColorTexture);
bgfx::destroyProgram(programColorBlack);
bgfx::destroyProgram(programTexture);
diff --git a/3rdparty/bgfx/examples/13-stencil/vs_stencil_color.sc b/3rdparty/bgfx/examples/13-stencil/vs_stencil_color.sc
index c6750be32c7..f67ee538ad0 100644
--- a/3rdparty/bgfx/examples/13-stencil/vs_stencil_color.sc
+++ b/3rdparty/bgfx/examples/13-stencil/vs_stencil_color.sc
@@ -2,7 +2,7 @@ $input a_position
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/13-stencil/vs_stencil_color_lightning.sc b/3rdparty/bgfx/examples/13-stencil/vs_stencil_color_lighting.sc
index efa348a09c1..90fdb80724b 100644
--- a/3rdparty/bgfx/examples/13-stencil/vs_stencil_color_lightning.sc
+++ b/3rdparty/bgfx/examples/13-stencil/vs_stencil_color_lighting.sc
@@ -3,7 +3,7 @@ $output v_normal, v_view
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/13-stencil/vs_stencil_color_texture.sc b/3rdparty/bgfx/examples/13-stencil/vs_stencil_color_texture.sc
index 577fd62c218..a1a66624461 100644
--- a/3rdparty/bgfx/examples/13-stencil/vs_stencil_color_texture.sc
+++ b/3rdparty/bgfx/examples/13-stencil/vs_stencil_color_texture.sc
@@ -3,7 +3,7 @@ $output v_texcoord0
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/13-stencil/vs_stencil_texture.sc b/3rdparty/bgfx/examples/13-stencil/vs_stencil_texture.sc
index 577fd62c218..a1a66624461 100644
--- a/3rdparty/bgfx/examples/13-stencil/vs_stencil_texture.sc
+++ b/3rdparty/bgfx/examples/13-stencil/vs_stencil_texture.sc
@@ -3,7 +3,7 @@ $output v_texcoord0
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/13-stencil/vs_stencil_texture_lightning.sc b/3rdparty/bgfx/examples/13-stencil/vs_stencil_texture_lighting.sc
index 5b7392364fa..67c4aa19dee 100644
--- a/3rdparty/bgfx/examples/13-stencil/vs_stencil_texture_lightning.sc
+++ b/3rdparty/bgfx/examples/13-stencil/vs_stencil_texture_lighting.sc
@@ -3,7 +3,7 @@ $output v_normal, v_view, v_texcoord0
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_color_lightning.sc b/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_color_lighting.sc
index 9ed8d7a632b..f99fd3d1b9f 100644
--- a/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_color_lightning.sc
+++ b/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_color_lighting.sc
@@ -2,7 +2,7 @@ $input v_normal, v_view
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
@@ -18,7 +18,7 @@ uniform vec4 u_lightRgbInnerR;
SAMPLER2D(s_texStencil, 1);
#define u_ambientPass u_params.x
-#define u_lightningPass u_params.y
+#define u_lightingPass u_params.y
#define u_texelHalf u_params.z
#define u_specular u_specular_shininess.xyz
#define u_shininess u_specular_shininess.w
@@ -65,7 +65,7 @@ void main()
vec3 normal = normalize(v_normal);
vec3 viewDir = -normalize(v_view);
- vec3 lightColor = calcLight(v_view, normal, viewDir) * u_lightningPass;
+ vec3 lightColor = calcLight(v_view, normal, viewDir) * u_lightingPass;
vec2 ndc = gl_FragCoord.xy * u_viewTexel.xy + u_viewTexel.xy * u_texelHalf;
vec4 texcolor = texture2D(s_texStencil, ndc);
diff --git a/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_color_texture.sc b/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_color_texture.sc
index 2a2ab4107d8..59ac7d32f65 100644
--- a/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_color_texture.sc
+++ b/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_color_texture.sc
@@ -2,7 +2,7 @@ $input v_texcoord0
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svbackblank.sc b/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svbackblank.sc
index 6e7b52bccd8..900a815eddf 100644
--- a/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svbackblank.sc
+++ b/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svbackblank.sc
@@ -1,6 +1,6 @@
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svbackcolor.sc b/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svbackcolor.sc
index 99e7dfe4dbd..f63a607c42a 100644
--- a/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svbackcolor.sc
+++ b/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svbackcolor.sc
@@ -1,6 +1,6 @@
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svbacktex1.sc b/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svbacktex1.sc
index 652f83810b0..a9aa7df6204 100644
--- a/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svbacktex1.sc
+++ b/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svbacktex1.sc
@@ -1,6 +1,6 @@
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svbacktex2.sc b/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svbacktex2.sc
index efc14e5df81..26d51bf5196 100644
--- a/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svbacktex2.sc
+++ b/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svbacktex2.sc
@@ -1,6 +1,6 @@
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svfrontblank.sc b/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svfrontblank.sc
index 52bdc2b78fd..9e751e05939 100644
--- a/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svfrontblank.sc
+++ b/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svfrontblank.sc
@@ -1,6 +1,6 @@
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svfrontcolor.sc b/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svfrontcolor.sc
index 9711a71f908..2a953a219f3 100644
--- a/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svfrontcolor.sc
+++ b/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svfrontcolor.sc
@@ -1,6 +1,6 @@
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svfronttex1.sc b/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svfronttex1.sc
index 51c02371ffa..8440c401608 100644
--- a/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svfronttex1.sc
+++ b/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svfronttex1.sc
@@ -1,6 +1,6 @@
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svfronttex2.sc b/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svfronttex2.sc
index 71244ad687d..fff06ef1587 100644
--- a/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svfronttex2.sc
+++ b/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svfronttex2.sc
@@ -1,6 +1,6 @@
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svside.sc b/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svside.sc
index 400d1b3127f..fa82df3afe7 100644
--- a/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svside.sc
+++ b/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svside.sc
@@ -2,7 +2,7 @@ $input v_k
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svsideblank.sc b/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svsideblank.sc
index 879281dd408..6026aad53dd 100644
--- a/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svsideblank.sc
+++ b/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svsideblank.sc
@@ -2,7 +2,7 @@ $input v_k
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svsidecolor.sc b/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svsidecolor.sc
index 6a167b80c6f..1832106e4df 100644
--- a/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svsidecolor.sc
+++ b/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svsidecolor.sc
@@ -2,7 +2,7 @@ $input v_k
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svsidetex.sc b/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svsidetex.sc
index 0d3181167b3..ddc639dc3a1 100644
--- a/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svsidetex.sc
+++ b/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svsidetex.sc
@@ -2,7 +2,7 @@ $input v_k
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_texture.sc b/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_texture.sc
index 0f33138b7ff..098fa5b9df1 100644
--- a/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_texture.sc
+++ b/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_texture.sc
@@ -2,7 +2,7 @@ $input v_texcoord0
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_texture_lightning.sc b/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_texture_lighting.sc
index d22c0ddc2eb..839386e7151 100644
--- a/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_texture_lightning.sc
+++ b/3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_texture_lighting.sc
@@ -2,7 +2,7 @@ $input v_normal, v_view, v_texcoord0
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
@@ -18,7 +18,7 @@ SAMPLER2D(s_texColor, 0);
SAMPLER2D(s_texStencil, 1);
#define u_ambientPass u_params.x
-#define u_lightningPass u_params.y
+#define u_lightingPass u_params.y
#define u_texelHalf u_params.z
#define u_specular u_specular_shininess.xyz
#define u_shininess u_specular_shininess.w
@@ -65,7 +65,7 @@ void main()
vec3 normal = normalize(v_normal);
vec3 viewDir = -normalize(v_view);
- vec3 lightColor = calcLight(v_view, normal, viewDir) * u_lightningPass;
+ vec3 lightColor = calcLight(v_view, normal, viewDir) * u_lightingPass;
vec2 ndc = gl_FragCoord.xy * u_viewTexel.xy + u_viewTexel.xy * u_texelHalf;
vec4 texcolor = texture2D(s_texStencil, ndc);
diff --git a/3rdparty/bgfx/examples/14-shadowvolumes/shadowvolumes.cpp b/3rdparty/bgfx/examples/14-shadowvolumes/shadowvolumes.cpp
index f8d5061204f..d39773c214f 100644
--- a/3rdparty/bgfx/examples/14-shadowvolumes/shadowvolumes.cpp
+++ b/3rdparty/bgfx/examples/14-shadowvolumes/shadowvolumes.cpp
@@ -1,6 +1,6 @@
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include <stdio.h>
@@ -205,7 +205,7 @@ struct Uniforms
void init()
{
m_params.m_ambientPass = 1.0f;
- m_params.m_lightningPass = 1.0f;
+ m_params.m_lightingPass = 1.0f;
m_params.m_texelHalf = 0.0f;
m_ambient[0] = 0.05f;
@@ -299,7 +299,7 @@ struct Uniforms
struct Params
{
float m_ambientPass;
- float m_lightningPass;
+ float m_lightingPass;
float m_texelHalf;
float m_unused00;
};
@@ -326,7 +326,7 @@ struct Uniforms
/**
* u_params.x - u_ambientPass
- * u_params.y - u_lightningPass
+ * u_params.y - u_lightingPass
* u_params.z - u_texelHalf
* u_params.w - unused
@@ -1905,10 +1905,10 @@ int _main_(int _argc, char** _argv)
s_texColor = bgfx::createUniform("s_texColor", bgfx::UniformType::Int1);
s_texStencil = bgfx::createUniform("s_texStencil", bgfx::UniformType::Int1);
- bgfx::ProgramHandle programTextureLightning = loadProgram("vs_shadowvolume_texture_lightning", "fs_shadowvolume_texture_lightning");
- bgfx::ProgramHandle programColorLightning = loadProgram("vs_shadowvolume_color_lightning", "fs_shadowvolume_color_lightning" );
- bgfx::ProgramHandle programColorTexture = loadProgram("vs_shadowvolume_color_texture", "fs_shadowvolume_color_texture" );
- bgfx::ProgramHandle programTexture = loadProgram("vs_shadowvolume_texture", "fs_shadowvolume_texture" );
+ bgfx::ProgramHandle programTextureLighting = loadProgram("vs_shadowvolume_texture_lighting", "fs_shadowvolume_texture_lighting");
+ bgfx::ProgramHandle programColorLighting = loadProgram("vs_shadowvolume_color_lighting", "fs_shadowvolume_color_lighting" );
+ bgfx::ProgramHandle programColorTexture = loadProgram("vs_shadowvolume_color_texture", "fs_shadowvolume_color_texture" );
+ bgfx::ProgramHandle programTexture = loadProgram("vs_shadowvolume_texture", "fs_shadowvolume_texture" );
bgfx::ProgramHandle programBackBlank = loadProgram("vs_shadowvolume_svback", "fs_shadowvolume_svbackblank" );
bgfx::ProgramHandle programSideBlank = loadProgram("vs_shadowvolume_svside", "fs_shadowvolume_svsideblank" );
@@ -1967,28 +1967,28 @@ int _main_(int _argc, char** _argv)
Model vplaneModel;
bunnyHighPolyModel.load("meshes/bunny_patched.bin");
- bunnyHighPolyModel.m_program = programColorLightning;
+ bunnyHighPolyModel.m_program = programColorLighting;
bunnyLowPolyModel.load("meshes/bunny_decimated.bin");
- bunnyLowPolyModel.m_program = programColorLightning;
+ bunnyLowPolyModel.m_program = programColorLighting;
columnModel.load("meshes/column.bin");
- columnModel.m_program = programColorLightning;
+ columnModel.m_program = programColorLighting;
platformModel.load("meshes/platform.bin");
- platformModel.m_program = programTextureLightning;
+ platformModel.m_program = programTextureLighting;
platformModel.m_texture = figureTex;
cubeModel.load("meshes/cube.bin");
- cubeModel.m_program = programTextureLightning;
+ cubeModel.m_program = programTextureLighting;
cubeModel.m_texture = figureTex;
hplaneFieldModel.load(s_hplaneVertices, BX_COUNTOF(s_hplaneVertices), PosNormalTexcoordVertex::ms_decl, s_planeIndices, BX_COUNTOF(s_planeIndices) );
- hplaneFieldModel.m_program = programTextureLightning;
+ hplaneFieldModel.m_program = programTextureLighting;
hplaneFieldModel.m_texture = fieldstoneTex;
hplaneFigureModel.load(s_hplaneVertices, BX_COUNTOF(s_hplaneVertices), PosNormalTexcoordVertex::ms_decl, s_planeIndices, BX_COUNTOF(s_planeIndices) );
- hplaneFigureModel.m_program = programTextureLightning;
+ hplaneFigureModel.m_program = programTextureLighting;
hplaneFigureModel.m_texture = figureTex;
vplaneModel.load(s_vplaneVertices, BX_COUNTOF(s_vplaneVertices), PosNormalTexcoordVertex::ms_decl, s_planeIndices, BX_COUNTOF(s_planeIndices) );
@@ -2249,7 +2249,7 @@ int _main_(int _argc, char** _argv)
//update settings
s_uniforms.m_params.m_ambientPass = 1.0f;
- s_uniforms.m_params.m_lightningPass = 1.0f;
+ s_uniforms.m_params.m_lightingPass = 1.0f;
s_uniforms.m_params.m_texelHalf = s_texelHalf;
s_uniforms.m_svparams.m_useStencilTex = float(settings_useStencilTexture);
@@ -2539,7 +2539,7 @@ int _main_(int _argc, char** _argv)
// Draw ambient only.
s_uniforms.m_params.m_ambientPass = 1.0f;
- s_uniforms.m_params.m_lightningPass = 0.0f;
+ s_uniforms.m_params.m_lightingPass = 0.0f;
s_uniforms.m_color[0] = 1.0f;
s_uniforms.m_color[1] = 1.0f;
@@ -2773,7 +2773,7 @@ int _main_(int _argc, char** _argv)
// Draw diffuse only.
s_uniforms.m_params.m_ambientPass = 0.0f;
- s_uniforms.m_params.m_lightningPass = 1.0f;
+ s_uniforms.m_params.m_lightingPass = 1.0f;
RenderState& drawDiffuse = settings_useStencilTexture
? s_renderStates[RenderState::ShadowVolume_UsingStencilTexture_DrawDiffuse]
@@ -2851,8 +2851,8 @@ int _main_(int _argc, char** _argv)
bgfx::destroyTexture(fieldstoneTex);
bgfx::destroyTexture(flareTex);
- bgfx::destroyProgram(programTextureLightning);
- bgfx::destroyProgram(programColorLightning);
+ bgfx::destroyProgram(programTextureLighting);
+ bgfx::destroyProgram(programColorLighting);
bgfx::destroyProgram(programColorTexture);
bgfx::destroyProgram(programTexture);
diff --git a/3rdparty/bgfx/examples/14-shadowvolumes/vs_shadowvolume_color_lightning.sc b/3rdparty/bgfx/examples/14-shadowvolumes/vs_shadowvolume_color_lighting.sc
index a23c4e93d89..a3d9e13fb54 100644
--- a/3rdparty/bgfx/examples/14-shadowvolumes/vs_shadowvolume_color_lightning.sc
+++ b/3rdparty/bgfx/examples/14-shadowvolumes/vs_shadowvolume_color_lighting.sc
@@ -3,7 +3,7 @@ $output v_normal, v_view
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/14-shadowvolumes/vs_shadowvolume_color_texture.sc b/3rdparty/bgfx/examples/14-shadowvolumes/vs_shadowvolume_color_texture.sc
index 6c5f246b73b..8eff5b40da6 100644
--- a/3rdparty/bgfx/examples/14-shadowvolumes/vs_shadowvolume_color_texture.sc
+++ b/3rdparty/bgfx/examples/14-shadowvolumes/vs_shadowvolume_color_texture.sc
@@ -3,7 +3,7 @@ $output v_texcoord0
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/14-shadowvolumes/vs_shadowvolume_svback.sc b/3rdparty/bgfx/examples/14-shadowvolumes/vs_shadowvolume_svback.sc
index ba762fc297f..4c14bf02c48 100644
--- a/3rdparty/bgfx/examples/14-shadowvolumes/vs_shadowvolume_svback.sc
+++ b/3rdparty/bgfx/examples/14-shadowvolumes/vs_shadowvolume_svback.sc
@@ -2,7 +2,7 @@ $input a_position
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/14-shadowvolumes/vs_shadowvolume_svfront.sc b/3rdparty/bgfx/examples/14-shadowvolumes/vs_shadowvolume_svfront.sc
index 52a2e605243..b7e0d2a17c3 100644
--- a/3rdparty/bgfx/examples/14-shadowvolumes/vs_shadowvolume_svfront.sc
+++ b/3rdparty/bgfx/examples/14-shadowvolumes/vs_shadowvolume_svfront.sc
@@ -2,7 +2,7 @@ $input a_position
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/14-shadowvolumes/vs_shadowvolume_svside.sc b/3rdparty/bgfx/examples/14-shadowvolumes/vs_shadowvolume_svside.sc
index 1fcc7ebba12..8c20a9e71a3 100644
--- a/3rdparty/bgfx/examples/14-shadowvolumes/vs_shadowvolume_svside.sc
+++ b/3rdparty/bgfx/examples/14-shadowvolumes/vs_shadowvolume_svside.sc
@@ -3,7 +3,7 @@ $output v_k
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/14-shadowvolumes/vs_shadowvolume_texture.sc b/3rdparty/bgfx/examples/14-shadowvolumes/vs_shadowvolume_texture.sc
index 6e3ffa49c23..77034144062 100644
--- a/3rdparty/bgfx/examples/14-shadowvolumes/vs_shadowvolume_texture.sc
+++ b/3rdparty/bgfx/examples/14-shadowvolumes/vs_shadowvolume_texture.sc
@@ -3,7 +3,7 @@ $output v_texcoord0
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/14-shadowvolumes/vs_shadowvolume_texture_lightning.sc b/3rdparty/bgfx/examples/14-shadowvolumes/vs_shadowvolume_texture_lighting.sc
index c4e9c851fda..f7538d40e40 100644
--- a/3rdparty/bgfx/examples/14-shadowvolumes/vs_shadowvolume_texture_lightning.sc
+++ b/3rdparty/bgfx/examples/14-shadowvolumes/vs_shadowvolume_texture_lighting.sc
@@ -3,7 +3,7 @@ $output v_normal, v_view, v_texcoord0
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/15-shadowmaps-simple/fs_sms_mesh.sc b/3rdparty/bgfx/examples/15-shadowmaps-simple/fs_sms_mesh.sc
index 949af404925..9b95176bb1a 100644
--- a/3rdparty/bgfx/examples/15-shadowmaps-simple/fs_sms_mesh.sc
+++ b/3rdparty/bgfx/examples/15-shadowmaps-simple/fs_sms_mesh.sc
@@ -2,7 +2,7 @@ $input v_view, v_normal, v_shadowcoord
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/15-shadowmaps-simple/fs_sms_mesh_pd.sc b/3rdparty/bgfx/examples/15-shadowmaps-simple/fs_sms_mesh_pd.sc
index ca27f46ff56..67729e52514 100644
--- a/3rdparty/bgfx/examples/15-shadowmaps-simple/fs_sms_mesh_pd.sc
+++ b/3rdparty/bgfx/examples/15-shadowmaps-simple/fs_sms_mesh_pd.sc
@@ -2,7 +2,7 @@ $input v_view, v_normal, v_shadowcoord
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/15-shadowmaps-simple/fs_sms_shadow.sc b/3rdparty/bgfx/examples/15-shadowmaps-simple/fs_sms_shadow.sc
index 5a9356d88df..3cdf1973f2e 100644
--- a/3rdparty/bgfx/examples/15-shadowmaps-simple/fs_sms_shadow.sc
+++ b/3rdparty/bgfx/examples/15-shadowmaps-simple/fs_sms_shadow.sc
@@ -1,6 +1,6 @@
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/15-shadowmaps-simple/fs_sms_shadow.sh b/3rdparty/bgfx/examples/15-shadowmaps-simple/fs_sms_shadow.sh
index a38a90f2ffc..979ff7c1e74 100644
--- a/3rdparty/bgfx/examples/15-shadowmaps-simple/fs_sms_shadow.sh
+++ b/3rdparty/bgfx/examples/15-shadowmaps-simple/fs_sms_shadow.sh
@@ -1,6 +1,6 @@
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/15-shadowmaps-simple/fs_sms_shadow_pd.sc b/3rdparty/bgfx/examples/15-shadowmaps-simple/fs_sms_shadow_pd.sc
index 86dc0391667..04d5896c81d 100644
--- a/3rdparty/bgfx/examples/15-shadowmaps-simple/fs_sms_shadow_pd.sc
+++ b/3rdparty/bgfx/examples/15-shadowmaps-simple/fs_sms_shadow_pd.sc
@@ -2,7 +2,7 @@ $input v_position
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/15-shadowmaps-simple/shadowmaps_simple.cpp b/3rdparty/bgfx/examples/15-shadowmaps-simple/shadowmaps_simple.cpp
index badef17db12..07f692cff47 100644
--- a/3rdparty/bgfx/examples/15-shadowmaps-simple/shadowmaps_simple.cpp
+++ b/3rdparty/bgfx/examples/15-shadowmaps-simple/shadowmaps_simple.cpp
@@ -1,6 +1,6 @@
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include <string>
@@ -133,7 +133,7 @@ int _main_(int _argc, char** _argv)
progShadow = loadProgram("vs_sms_shadow", "fs_sms_shadow");
progMesh = loadProgram("vs_sms_mesh", "fs_sms_mesh");
- shadowMapTexture = bgfx::createTexture2D(shadowMapSize, shadowMapSize, 1, bgfx::TextureFormat::D16, BGFX_TEXTURE_COMPARE_LEQUAL);
+ shadowMapTexture = bgfx::createTexture2D(shadowMapSize, shadowMapSize, 1, bgfx::TextureFormat::D16, BGFX_TEXTURE_RT | BGFX_TEXTURE_COMPARE_LEQUAL);
bgfx::TextureHandle fbtextures[] = { shadowMapTexture };
shadowMapFB = bgfx::createFrameBuffer(BX_COUNTOF(fbtextures), fbtextures, true);
}
diff --git a/3rdparty/bgfx/examples/15-shadowmaps-simple/vs_sms_mesh.sc b/3rdparty/bgfx/examples/15-shadowmaps-simple/vs_sms_mesh.sc
index 2143c61c016..0f28baa3023 100644
--- a/3rdparty/bgfx/examples/15-shadowmaps-simple/vs_sms_mesh.sc
+++ b/3rdparty/bgfx/examples/15-shadowmaps-simple/vs_sms_mesh.sc
@@ -3,7 +3,7 @@ $output v_view, v_normal, v_shadowcoord
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/15-shadowmaps-simple/vs_sms_shadow.sc b/3rdparty/bgfx/examples/15-shadowmaps-simple/vs_sms_shadow.sc
index 681f3afbf3d..a606797f019 100644
--- a/3rdparty/bgfx/examples/15-shadowmaps-simple/vs_sms_shadow.sc
+++ b/3rdparty/bgfx/examples/15-shadowmaps-simple/vs_sms_shadow.sc
@@ -2,7 +2,7 @@ $input a_position
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/15-shadowmaps-simple/vs_sms_shadow_pd.sc b/3rdparty/bgfx/examples/15-shadowmaps-simple/vs_sms_shadow_pd.sc
index ca364dd29f3..8d55a99f223 100644
--- a/3rdparty/bgfx/examples/15-shadowmaps-simple/vs_sms_shadow_pd.sc
+++ b/3rdparty/bgfx/examples/15-shadowmaps-simple/vs_sms_shadow_pd.sc
@@ -3,7 +3,7 @@ $output v_position
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/common.sh b/3rdparty/bgfx/examples/16-shadowmaps/common.sh
index ef2ba859954..b10ae6b235d 100644
--- a/3rdparty/bgfx/examples/16-shadowmaps/common.sh
+++ b/3rdparty/bgfx/examples/16-shadowmaps/common.sh
@@ -1,6 +1,6 @@
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_black.sc b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_black.sc
index 7adb966b99c..975df704e73 100644
--- a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_black.sc
+++ b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_black.sc
@@ -1,6 +1,6 @@
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning.sh b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting.sh
index f2090508904..c3518048463 100644
--- a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning.sh
+++ b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting.sh
@@ -1,6 +1,6 @@
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "common.sh"
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_esm.sc b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_esm.sc
new file mode 100644
index 00000000000..ef77eb9e92a
--- /dev/null
+++ b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_esm.sc
@@ -0,0 +1,15 @@
+$input v_normal, v_view, v_shadowcoord
+
+/*
+ * Copyright 2013-2014 Dario Manesku. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
+ */
+
+#define SM_ESM 1
+
+#include "fs_shadowmaps_color_lighting.sh"
+
+void main()
+{
+#include "fs_shadowmaps_color_lighting_main.sh"
+}
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm_csm.sc b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_esm_csm.sc
index d30616700fd..8e76e954703 100644
--- a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm_csm.sc
+++ b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_esm_csm.sc
@@ -2,16 +2,16 @@ $input v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_te
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#define SM_ESM 1
#define SM_CSM 1
-#include "fs_shadowmaps_color_lightning.sh"
+#include "fs_shadowmaps_color_lighting.sh"
void main()
{
-#include "fs_shadowmaps_color_lightning_main.sh"
+#include "fs_shadowmaps_color_lighting_main.sh"
}
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm_linear.sc b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_esm_linear.sc
index 9fab4567437..fb2aa8a1bb4 100644
--- a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm_linear.sc
+++ b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_esm_linear.sc
@@ -2,15 +2,15 @@ $input v_normal, v_view, v_shadowcoord
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#define SM_ESM 1
#define SM_LINEAR 1
-#include "fs_shadowmaps_color_lightning.sh"
+#include "fs_shadowmaps_color_lighting.sh"
void main()
{
-#include "fs_shadowmaps_color_lightning_main.sh"
+#include "fs_shadowmaps_color_lighting_main.sh"
}
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm_linear_csm.sc b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_esm_linear_csm.sc
index d43dffb2295..151df7e9256 100644
--- a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm_linear_csm.sc
+++ b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_esm_linear_csm.sc
@@ -2,17 +2,17 @@ $input v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_te
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#define SM_ESM 1
#define SM_LINEAR 1
#define SM_CSM 1
-#include "fs_shadowmaps_color_lightning.sh"
+#include "fs_shadowmaps_color_lighting.sh"
void main()
{
-#include "fs_shadowmaps_color_lightning_main.sh"
+#include "fs_shadowmaps_color_lighting_main.sh"
}
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm_linear_omni.sc b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_esm_linear_omni.sc
index c92d19b18c5..5783899b250 100644
--- a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm_linear_omni.sc
+++ b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_esm_linear_omni.sc
@@ -2,16 +2,16 @@ $input v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_te
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#define SM_ESM 1
#define SM_LINEAR 1
#define SM_OMNI 1
-#include "fs_shadowmaps_color_lightning.sh"
+#include "fs_shadowmaps_color_lighting.sh"
void main()
{
-#include "fs_shadowmaps_color_lightning_main.sh"
+#include "fs_shadowmaps_color_lighting_main.sh"
}
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm_omni.sc b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_esm_omni.sc
index acc8aa25352..290073ca9af 100644
--- a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm_omni.sc
+++ b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_esm_omni.sc
@@ -2,15 +2,15 @@ $input v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_te
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#define SM_ESM 1
#define SM_OMNI 1
-#include "fs_shadowmaps_color_lightning.sh"
+#include "fs_shadowmaps_color_lighting.sh"
void main()
{
-#include "fs_shadowmaps_color_lightning_main.sh"
+#include "fs_shadowmaps_color_lighting_main.sh"
}
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_hard.sc b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_hard.sc
new file mode 100644
index 00000000000..24416afebf4
--- /dev/null
+++ b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_hard.sc
@@ -0,0 +1,15 @@
+$input v_normal, v_view, v_shadowcoord
+
+/*
+ * Copyright 2013-2014 Dario Manesku. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
+ */
+
+#define SM_HARD 1
+
+#include "fs_shadowmaps_color_lighting.sh"
+
+void main()
+{
+#include "fs_shadowmaps_color_lighting_main.sh"
+}
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard_csm.sc b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_hard_csm.sc
index aeab8c855b4..e0f9a42f012 100644
--- a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard_csm.sc
+++ b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_hard_csm.sc
@@ -2,15 +2,15 @@ $input v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_te
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#define SM_HARD 1
#define SM_CSM 1
-#include "fs_shadowmaps_color_lightning.sh"
+#include "fs_shadowmaps_color_lighting.sh"
void main()
{
-#include "fs_shadowmaps_color_lightning_main.sh"
+#include "fs_shadowmaps_color_lighting_main.sh"
}
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard_linear.sc b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_hard_linear.sc
index fe66c147d5f..a10a029e9b4 100644
--- a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard_linear.sc
+++ b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_hard_linear.sc
@@ -2,14 +2,14 @@ $input v_normal, v_view, v_shadowcoord
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#define SM_HARD 1
#define SM_LINEAR 1
-#include "fs_shadowmaps_color_lightning.sh"
+#include "fs_shadowmaps_color_lighting.sh"
void main()
{
-#include "fs_shadowmaps_color_lightning_main.sh"
+#include "fs_shadowmaps_color_lighting_main.sh"
}
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard_linear_csm.sc b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_hard_linear_csm.sc
index 4aa3bafc2ba..8953a846705 100644
--- a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard_linear_csm.sc
+++ b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_hard_linear_csm.sc
@@ -2,16 +2,16 @@ $input v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_te
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#define SM_HARD 1
#define SM_LINEAR 1
#define SM_CSM 1
-#include "fs_shadowmaps_color_lightning.sh"
+#include "fs_shadowmaps_color_lighting.sh"
void main()
{
-#include "fs_shadowmaps_color_lightning_main.sh"
+#include "fs_shadowmaps_color_lighting_main.sh"
}
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard_linear_omni.sc b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_hard_linear_omni.sc
index 34f5857c43e..bc0bf100be7 100644
--- a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard_linear_omni.sc
+++ b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_hard_linear_omni.sc
@@ -2,15 +2,15 @@ $input v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_te
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#define SM_HARD 1
#define SM_LINEAR 1
#define SM_OMNI 1
-#include "fs_shadowmaps_color_lightning.sh"
+#include "fs_shadowmaps_color_lighting.sh"
void main()
{
-#include "fs_shadowmaps_color_lightning_main.sh"
+#include "fs_shadowmaps_color_lighting_main.sh"
}
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard_omni.sc b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_hard_omni.sc
index 0587cfb2008..ecd61676072 100644
--- a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard_omni.sc
+++ b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_hard_omni.sc
@@ -2,15 +2,15 @@ $input v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_te
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#define SM_HARD 1
#define SM_OMNI 1
-#include "fs_shadowmaps_color_lightning.sh"
+#include "fs_shadowmaps_color_lighting.sh"
void main()
{
-#include "fs_shadowmaps_color_lightning_main.sh"
+#include "fs_shadowmaps_color_lighting_main.sh"
}
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_main.sh b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_main.sh
index f5393d06db5..acadba377b0 100644
--- a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_main.sh
+++ b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_main.sh
@@ -1,5 +1,5 @@
#define u_ambientPass u_params0.x
-#define u_lightningPass u_params0.y
+#define u_lightingPass u_params0.y
#define u_shadowMapBias u_params1.x
#define u_shadowMapParam0 u_params1.z
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_pcf.sc b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_pcf.sc
new file mode 100644
index 00000000000..0321b878e3a
--- /dev/null
+++ b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_pcf.sc
@@ -0,0 +1,15 @@
+$input v_normal, v_view, v_shadowcoord
+
+/*
+ * Copyright 2013-2014 Dario Manesku. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
+ */
+
+#define SM_PCF 1
+
+#include "fs_shadowmaps_color_lighting.sh"
+
+void main()
+{
+#include "fs_shadowmaps_color_lighting_main.sh"
+}
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf_csm.sc b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_pcf_csm.sc
index 6305ad3869d..4a55291719e 100644
--- a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf_csm.sc
+++ b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_pcf_csm.sc
@@ -2,16 +2,16 @@ $input v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_te
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#define SM_PCF 1
#define SM_CSM 1
-#include "fs_shadowmaps_color_lightning.sh"
+#include "fs_shadowmaps_color_lighting.sh"
void main()
{
-#include "fs_shadowmaps_color_lightning_main.sh"
+#include "fs_shadowmaps_color_lighting_main.sh"
}
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf_linear.sc b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_pcf_linear.sc
index 5cd7d0253bc..c56dc7c191b 100644
--- a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf_linear.sc
+++ b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_pcf_linear.sc
@@ -2,15 +2,15 @@ $input v_normal, v_view, v_shadowcoord
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#define SM_PCF 1
#define SM_LINEAR 1
-#include "fs_shadowmaps_color_lightning.sh"
+#include "fs_shadowmaps_color_lighting.sh"
void main()
{
-#include "fs_shadowmaps_color_lightning_main.sh"
+#include "fs_shadowmaps_color_lighting_main.sh"
}
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf_linear_csm.sc b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_pcf_linear_csm.sc
index 27053c07a10..55b52aca40c 100644
--- a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf_linear_csm.sc
+++ b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_pcf_linear_csm.sc
@@ -2,16 +2,16 @@ $input v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_te
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#define SM_PCF 1
#define SM_LINEAR 1
#define SM_CSM 1
-#include "fs_shadowmaps_color_lightning.sh"
+#include "fs_shadowmaps_color_lighting.sh"
void main()
{
-#include "fs_shadowmaps_color_lightning_main.sh"
+#include "fs_shadowmaps_color_lighting_main.sh"
}
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf_linear_omni.sc b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_pcf_linear_omni.sc
index 228ccd570d2..f3ac095fe26 100644
--- a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf_linear_omni.sc
+++ b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_pcf_linear_omni.sc
@@ -2,16 +2,16 @@ $input v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_te
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#define SM_PCF 1
#define SM_LINEAR 1
#define SM_OMNI 1
-#include "fs_shadowmaps_color_lightning.sh"
+#include "fs_shadowmaps_color_lighting.sh"
void main()
{
-#include "fs_shadowmaps_color_lightning_main.sh"
+#include "fs_shadowmaps_color_lighting_main.sh"
}
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf_omni.sc b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_pcf_omni.sc
index 3ee82afbce8..533b36c7e89 100644
--- a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf_omni.sc
+++ b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_pcf_omni.sc
@@ -2,15 +2,15 @@ $input v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_te
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#define SM_PCF 1
#define SM_OMNI 1
-#include "fs_shadowmaps_color_lightning.sh"
+#include "fs_shadowmaps_color_lighting.sh"
void main()
{
-#include "fs_shadowmaps_color_lightning_main.sh"
+#include "fs_shadowmaps_color_lighting_main.sh"
}
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_vsm.sc b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_vsm.sc
new file mode 100644
index 00000000000..5a6237bf85f
--- /dev/null
+++ b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_vsm.sc
@@ -0,0 +1,15 @@
+$input v_normal, v_view, v_shadowcoord
+
+/*
+ * Copyright 2013-2014 Dario Manesku. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
+ */
+
+#define SM_VSM 1
+
+#include "fs_shadowmaps_color_lighting.sh"
+
+void main()
+{
+#include "fs_shadowmaps_color_lighting_main.sh"
+}
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_csm.sc b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_vsm_csm.sc
index 825f49543f6..7b0ff7744c6 100644
--- a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_csm.sc
+++ b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_vsm_csm.sc
@@ -2,15 +2,15 @@ $input v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_te
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#define SM_VSM 1
#define SM_CSM 1
-#include "fs_shadowmaps_color_lightning.sh"
+#include "fs_shadowmaps_color_lighting.sh"
void main()
{
-#include "fs_shadowmaps_color_lightning_main.sh"
+#include "fs_shadowmaps_color_lighting_main.sh"
}
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_linear.sc b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_vsm_linear.sc
index 3dd86847ce6..a20ba6011a0 100644
--- a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_linear.sc
+++ b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_vsm_linear.sc
@@ -2,15 +2,15 @@ $input v_normal, v_view, v_shadowcoord
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#define SM_VSM 1
#define SM_LINEAR 1
-#include "fs_shadowmaps_color_lightning.sh"
+#include "fs_shadowmaps_color_lighting.sh"
void main()
{
-#include "fs_shadowmaps_color_lightning_main.sh"
+#include "fs_shadowmaps_color_lighting_main.sh"
}
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_linear_csm.sc b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_vsm_linear_csm.sc
index 66f05cf8ec7..3bfd00e7e64 100644
--- a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_linear_csm.sc
+++ b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_vsm_linear_csm.sc
@@ -2,16 +2,16 @@ $input v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_te
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#define SM_VSM 1
#define SM_LINEAR 1
#define SM_CSM 1
-#include "fs_shadowmaps_color_lightning.sh"
+#include "fs_shadowmaps_color_lighting.sh"
void main()
{
-#include "fs_shadowmaps_color_lightning_main.sh"
+#include "fs_shadowmaps_color_lighting_main.sh"
}
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_linear_omni.sc b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_vsm_linear_omni.sc
index 615a200ffb5..d416655b18e 100644
--- a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_linear_omni.sc
+++ b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_vsm_linear_omni.sc
@@ -2,16 +2,16 @@ $input v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_te
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#define SM_VSM 1
#define SM_LINEAR 1
#define SM_OMNI 1
-#include "fs_shadowmaps_color_lightning.sh"
+#include "fs_shadowmaps_color_lighting.sh"
void main()
{
-#include "fs_shadowmaps_color_lightning_main.sh"
+#include "fs_shadowmaps_color_lighting_main.sh"
}
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_omni.sc b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_vsm_omni.sc
index e8d2457829b..db60831e78d 100644
--- a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_omni.sc
+++ b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_vsm_omni.sc
@@ -2,15 +2,15 @@ $input v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_te
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#define SM_VSM 1
#define SM_OMNI 1
-#include "fs_shadowmaps_color_lightning.sh"
+#include "fs_shadowmaps_color_lighting.sh"
void main()
{
-#include "fs_shadowmaps_color_lightning_main.sh"
+#include "fs_shadowmaps_color_lighting_main.sh"
}
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm.sc b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm.sc
deleted file mode 100644
index 6827c44ca95..00000000000
--- a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm.sc
+++ /dev/null
@@ -1,15 +0,0 @@
-$input v_normal, v_view, v_shadowcoord
-
-/*
- * Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
- */
-
-#define SM_ESM 1
-
-#include "fs_shadowmaps_color_lightning.sh"
-
-void main()
-{
-#include "fs_shadowmaps_color_lightning_main.sh"
-}
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard.sc b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard.sc
deleted file mode 100644
index 1564c3b6199..00000000000
--- a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard.sc
+++ /dev/null
@@ -1,15 +0,0 @@
-$input v_normal, v_view, v_shadowcoord
-
-/*
- * Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
- */
-
-#define SM_HARD 1
-
-#include "fs_shadowmaps_color_lightning.sh"
-
-void main()
-{
-#include "fs_shadowmaps_color_lightning_main.sh"
-}
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf.sc b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf.sc
deleted file mode 100644
index 21dfe96c9f3..00000000000
--- a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf.sc
+++ /dev/null
@@ -1,15 +0,0 @@
-$input v_normal, v_view, v_shadowcoord
-
-/*
- * Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
- */
-
-#define SM_PCF 1
-
-#include "fs_shadowmaps_color_lightning.sh"
-
-void main()
-{
-#include "fs_shadowmaps_color_lightning_main.sh"
-}
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm.sc b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm.sc
deleted file mode 100644
index 158e29ab0f3..00000000000
--- a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm.sc
+++ /dev/null
@@ -1,15 +0,0 @@
-$input v_normal, v_view, v_shadowcoord
-
-/*
- * Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
- */
-
-#define SM_VSM 1
-
-#include "fs_shadowmaps_color_lightning.sh"
-
-void main()
-{
-#include "fs_shadowmaps_color_lightning_main.sh"
-}
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_texture.sc b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_texture.sc
index b81e40d192c..c53591a8fab 100644
--- a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_texture.sc
+++ b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_texture.sc
@@ -2,7 +2,7 @@ $input v_texcoord0
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_hblur.sc b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_hblur.sc
index 7f226049ee9..7b40dd2faf3 100644
--- a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_hblur.sc
+++ b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_hblur.sc
@@ -2,7 +2,7 @@ $input v_texcoord0, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "common.sh"
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_hblur_vsm.sc b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_hblur_vsm.sc
index 1173ef7b525..e06c17dd0ef 100644
--- a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_hblur_vsm.sc
+++ b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_hblur_vsm.sc
@@ -2,7 +2,7 @@ $input v_texcoord0, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "common.sh"
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_packdepth.sc b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_packdepth.sc
index 86dc0391667..04d5896c81d 100644
--- a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_packdepth.sc
+++ b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_packdepth.sc
@@ -2,7 +2,7 @@ $input v_position
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_packdepth_linear.sc b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_packdepth_linear.sc
index 9a9937c7f98..f049736d090 100644
--- a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_packdepth_linear.sc
+++ b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_packdepth_linear.sc
@@ -2,7 +2,7 @@ $input v_depth
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_packdepth_vsm.sc b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_packdepth_vsm.sc
index c67612443e0..c9ccbe9f972 100644
--- a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_packdepth_vsm.sc
+++ b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_packdepth_vsm.sc
@@ -2,7 +2,7 @@ $input v_position
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_packdepth_vsm_linear.sc b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_packdepth_vsm_linear.sc
index 3ed8d1b925d..87bfc5c1164 100644
--- a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_packdepth_vsm_linear.sc
+++ b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_packdepth_vsm_linear.sc
@@ -2,7 +2,7 @@ $input v_depth
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_texture.sc b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_texture.sc
index 0f33138b7ff..098fa5b9df1 100644
--- a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_texture.sc
+++ b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_texture.sc
@@ -2,7 +2,7 @@ $input v_texcoord0
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_unpackdepth.sc b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_unpackdepth.sc
index c3ed6e0ec7a..de62bdf3618 100644
--- a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_unpackdepth.sc
+++ b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_unpackdepth.sc
@@ -2,7 +2,7 @@ $input v_texcoord0
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_unpackdepth_vsm.sc b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_unpackdepth_vsm.sc
index 2e2792ce47e..8c2051012ea 100644
--- a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_unpackdepth_vsm.sc
+++ b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_unpackdepth_vsm.sc
@@ -2,7 +2,7 @@ $input v_texcoord0
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_vblur.sc b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_vblur.sc
index 7f226049ee9..7b40dd2faf3 100644
--- a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_vblur.sc
+++ b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_vblur.sc
@@ -2,7 +2,7 @@ $input v_texcoord0, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "common.sh"
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_vblur_vsm.sc b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_vblur_vsm.sc
index 1173ef7b525..e06c17dd0ef 100644
--- a/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_vblur_vsm.sc
+++ b/3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_vblur_vsm.sc
@@ -2,7 +2,7 @@ $input v_texcoord0, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "common.sh"
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/shadowmaps.cpp b/3rdparty/bgfx/examples/16-shadowmaps/shadowmaps.cpp
index 050e639ae06..7a840b45672 100644
--- a/3rdparty/bgfx/examples/16-shadowmaps/shadowmaps.cpp
+++ b/3rdparty/bgfx/examples/16-shadowmaps/shadowmaps.cpp
@@ -1,6 +1,6 @@
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include <string>
@@ -412,7 +412,7 @@ struct Uniforms
void init()
{
m_ambientPass = 1.0f;
- m_lightningPass = 1.0f;
+ m_lightingPass = 1.0f;
m_shadowMapBias = 0.003f;
m_shadowMapOffset = 0.0f;
@@ -571,7 +571,7 @@ struct Uniforms
struct
{
float m_ambientPass;
- float m_lightningPass;
+ float m_lightingPass;
float m_unused00;
float m_unused01;
};
@@ -1201,48 +1201,48 @@ struct Programs
m_packDepth[DepthImpl::Linear][PackDepth::RGBA] = loadProgram("vs_shadowmaps_packdepth_linear", "fs_shadowmaps_packdepth_linear");
m_packDepth[DepthImpl::Linear][PackDepth::VSM] = loadProgram("vs_shadowmaps_packdepth_linear", "fs_shadowmaps_packdepth_vsm_linear");
- // Color lightning.
- m_colorLightning[SmType::Single][DepthImpl::InvZ][SmImpl::Hard] = loadProgram("vs_shadowmaps_color_lightning", "fs_shadowmaps_color_lightning_hard");
- m_colorLightning[SmType::Single][DepthImpl::InvZ][SmImpl::PCF] = loadProgram("vs_shadowmaps_color_lightning", "fs_shadowmaps_color_lightning_pcf");
- m_colorLightning[SmType::Single][DepthImpl::InvZ][SmImpl::VSM] = loadProgram("vs_shadowmaps_color_lightning", "fs_shadowmaps_color_lightning_vsm");
- m_colorLightning[SmType::Single][DepthImpl::InvZ][SmImpl::ESM] = loadProgram("vs_shadowmaps_color_lightning", "fs_shadowmaps_color_lightning_esm");
-
- m_colorLightning[SmType::Single][DepthImpl::Linear][SmImpl::Hard] = loadProgram("vs_shadowmaps_color_lightning_linear", "fs_shadowmaps_color_lightning_hard_linear");
- m_colorLightning[SmType::Single][DepthImpl::Linear][SmImpl::PCF] = loadProgram("vs_shadowmaps_color_lightning_linear", "fs_shadowmaps_color_lightning_pcf_linear");
- m_colorLightning[SmType::Single][DepthImpl::Linear][SmImpl::VSM] = loadProgram("vs_shadowmaps_color_lightning_linear", "fs_shadowmaps_color_lightning_vsm_linear");
- m_colorLightning[SmType::Single][DepthImpl::Linear][SmImpl::ESM] = loadProgram("vs_shadowmaps_color_lightning_linear", "fs_shadowmaps_color_lightning_esm_linear");
-
- m_colorLightning[SmType::Omni][DepthImpl::InvZ][SmImpl::Hard] = loadProgram("vs_shadowmaps_color_lightning_omni", "fs_shadowmaps_color_lightning_hard_omni");
- m_colorLightning[SmType::Omni][DepthImpl::InvZ][SmImpl::PCF] = loadProgram("vs_shadowmaps_color_lightning_omni", "fs_shadowmaps_color_lightning_pcf_omni");
- m_colorLightning[SmType::Omni][DepthImpl::InvZ][SmImpl::VSM] = loadProgram("vs_shadowmaps_color_lightning_omni", "fs_shadowmaps_color_lightning_vsm_omni");
- m_colorLightning[SmType::Omni][DepthImpl::InvZ][SmImpl::ESM] = loadProgram("vs_shadowmaps_color_lightning_omni", "fs_shadowmaps_color_lightning_esm_omni");
-
- m_colorLightning[SmType::Omni][DepthImpl::Linear][SmImpl::Hard] = loadProgram("vs_shadowmaps_color_lightning_linear_omni", "fs_shadowmaps_color_lightning_hard_linear_omni");
- m_colorLightning[SmType::Omni][DepthImpl::Linear][SmImpl::PCF] = loadProgram("vs_shadowmaps_color_lightning_linear_omni", "fs_shadowmaps_color_lightning_pcf_linear_omni");
- m_colorLightning[SmType::Omni][DepthImpl::Linear][SmImpl::VSM] = loadProgram("vs_shadowmaps_color_lightning_linear_omni", "fs_shadowmaps_color_lightning_vsm_linear_omni");
- m_colorLightning[SmType::Omni][DepthImpl::Linear][SmImpl::ESM] = loadProgram("vs_shadowmaps_color_lightning_linear_omni", "fs_shadowmaps_color_lightning_esm_linear_omni");
-
- m_colorLightning[SmType::Cascade][DepthImpl::InvZ][SmImpl::Hard] = loadProgram("vs_shadowmaps_color_lightning_csm", "fs_shadowmaps_color_lightning_hard_csm");
- m_colorLightning[SmType::Cascade][DepthImpl::InvZ][SmImpl::PCF] = loadProgram("vs_shadowmaps_color_lightning_csm", "fs_shadowmaps_color_lightning_pcf_csm");
- m_colorLightning[SmType::Cascade][DepthImpl::InvZ][SmImpl::VSM] = loadProgram("vs_shadowmaps_color_lightning_csm", "fs_shadowmaps_color_lightning_vsm_csm");
- m_colorLightning[SmType::Cascade][DepthImpl::InvZ][SmImpl::ESM] = loadProgram("vs_shadowmaps_color_lightning_csm", "fs_shadowmaps_color_lightning_esm_csm");
-
- m_colorLightning[SmType::Cascade][DepthImpl::Linear][SmImpl::Hard] = loadProgram("vs_shadowmaps_color_lightning_linear_csm", "fs_shadowmaps_color_lightning_hard_linear_csm");
- m_colorLightning[SmType::Cascade][DepthImpl::Linear][SmImpl::PCF] = loadProgram("vs_shadowmaps_color_lightning_linear_csm", "fs_shadowmaps_color_lightning_pcf_linear_csm");
- m_colorLightning[SmType::Cascade][DepthImpl::Linear][SmImpl::VSM] = loadProgram("vs_shadowmaps_color_lightning_linear_csm", "fs_shadowmaps_color_lightning_vsm_linear_csm");
- m_colorLightning[SmType::Cascade][DepthImpl::Linear][SmImpl::ESM] = loadProgram("vs_shadowmaps_color_lightning_linear_csm", "fs_shadowmaps_color_lightning_esm_linear_csm");
+ // Color lighting.
+ m_colorLighting[SmType::Single][DepthImpl::InvZ][SmImpl::Hard] = loadProgram("vs_shadowmaps_color_lighting", "fs_shadowmaps_color_lighting_hard");
+ m_colorLighting[SmType::Single][DepthImpl::InvZ][SmImpl::PCF] = loadProgram("vs_shadowmaps_color_lighting", "fs_shadowmaps_color_lighting_pcf");
+ m_colorLighting[SmType::Single][DepthImpl::InvZ][SmImpl::VSM] = loadProgram("vs_shadowmaps_color_lighting", "fs_shadowmaps_color_lighting_vsm");
+ m_colorLighting[SmType::Single][DepthImpl::InvZ][SmImpl::ESM] = loadProgram("vs_shadowmaps_color_lighting", "fs_shadowmaps_color_lighting_esm");
+
+ m_colorLighting[SmType::Single][DepthImpl::Linear][SmImpl::Hard] = loadProgram("vs_shadowmaps_color_lighting_linear", "fs_shadowmaps_color_lighting_hard_linear");
+ m_colorLighting[SmType::Single][DepthImpl::Linear][SmImpl::PCF] = loadProgram("vs_shadowmaps_color_lighting_linear", "fs_shadowmaps_color_lighting_pcf_linear");
+ m_colorLighting[SmType::Single][DepthImpl::Linear][SmImpl::VSM] = loadProgram("vs_shadowmaps_color_lighting_linear", "fs_shadowmaps_color_lighting_vsm_linear");
+ m_colorLighting[SmType::Single][DepthImpl::Linear][SmImpl::ESM] = loadProgram("vs_shadowmaps_color_lighting_linear", "fs_shadowmaps_color_lighting_esm_linear");
+
+ m_colorLighting[SmType::Omni][DepthImpl::InvZ][SmImpl::Hard] = loadProgram("vs_shadowmaps_color_lighting_omni", "fs_shadowmaps_color_lighting_hard_omni");
+ m_colorLighting[SmType::Omni][DepthImpl::InvZ][SmImpl::PCF] = loadProgram("vs_shadowmaps_color_lighting_omni", "fs_shadowmaps_color_lighting_pcf_omni");
+ m_colorLighting[SmType::Omni][DepthImpl::InvZ][SmImpl::VSM] = loadProgram("vs_shadowmaps_color_lighting_omni", "fs_shadowmaps_color_lighting_vsm_omni");
+ m_colorLighting[SmType::Omni][DepthImpl::InvZ][SmImpl::ESM] = loadProgram("vs_shadowmaps_color_lighting_omni", "fs_shadowmaps_color_lighting_esm_omni");
+
+ m_colorLighting[SmType::Omni][DepthImpl::Linear][SmImpl::Hard] = loadProgram("vs_shadowmaps_color_lighting_linear_omni", "fs_shadowmaps_color_lighting_hard_linear_omni");
+ m_colorLighting[SmType::Omni][DepthImpl::Linear][SmImpl::PCF] = loadProgram("vs_shadowmaps_color_lighting_linear_omni", "fs_shadowmaps_color_lighting_pcf_linear_omni");
+ m_colorLighting[SmType::Omni][DepthImpl::Linear][SmImpl::VSM] = loadProgram("vs_shadowmaps_color_lighting_linear_omni", "fs_shadowmaps_color_lighting_vsm_linear_omni");
+ m_colorLighting[SmType::Omni][DepthImpl::Linear][SmImpl::ESM] = loadProgram("vs_shadowmaps_color_lighting_linear_omni", "fs_shadowmaps_color_lighting_esm_linear_omni");
+
+ m_colorLighting[SmType::Cascade][DepthImpl::InvZ][SmImpl::Hard] = loadProgram("vs_shadowmaps_color_lighting_csm", "fs_shadowmaps_color_lighting_hard_csm");
+ m_colorLighting[SmType::Cascade][DepthImpl::InvZ][SmImpl::PCF] = loadProgram("vs_shadowmaps_color_lighting_csm", "fs_shadowmaps_color_lighting_pcf_csm");
+ m_colorLighting[SmType::Cascade][DepthImpl::InvZ][SmImpl::VSM] = loadProgram("vs_shadowmaps_color_lighting_csm", "fs_shadowmaps_color_lighting_vsm_csm");
+ m_colorLighting[SmType::Cascade][DepthImpl::InvZ][SmImpl::ESM] = loadProgram("vs_shadowmaps_color_lighting_csm", "fs_shadowmaps_color_lighting_esm_csm");
+
+ m_colorLighting[SmType::Cascade][DepthImpl::Linear][SmImpl::Hard] = loadProgram("vs_shadowmaps_color_lighting_linear_csm", "fs_shadowmaps_color_lighting_hard_linear_csm");
+ m_colorLighting[SmType::Cascade][DepthImpl::Linear][SmImpl::PCF] = loadProgram("vs_shadowmaps_color_lighting_linear_csm", "fs_shadowmaps_color_lighting_pcf_linear_csm");
+ m_colorLighting[SmType::Cascade][DepthImpl::Linear][SmImpl::VSM] = loadProgram("vs_shadowmaps_color_lighting_linear_csm", "fs_shadowmaps_color_lighting_vsm_linear_csm");
+ m_colorLighting[SmType::Cascade][DepthImpl::Linear][SmImpl::ESM] = loadProgram("vs_shadowmaps_color_lighting_linear_csm", "fs_shadowmaps_color_lighting_esm_linear_csm");
}
void destroy()
{
- // Color lightning.
+ // Color lighting.
for (uint8_t ii = 0; ii < SmType::Count; ++ii)
{
for (uint8_t jj = 0; jj < DepthImpl::Count; ++jj)
{
for (uint8_t kk = 0; kk < SmImpl::Count; ++kk)
{
- bgfx::destroyProgram(m_colorLightning[ii][jj][kk]);
+ bgfx::destroyProgram(m_colorLighting[ii][jj][kk]);
}
}
}
@@ -1287,7 +1287,7 @@ struct Programs
bgfx::ProgramHandle m_hBlur[PackDepth::Count];
bgfx::ProgramHandle m_drawDepth[PackDepth::Count];
bgfx::ProgramHandle m_packDepth[DepthImpl::Count][PackDepth::Count];
- bgfx::ProgramHandle m_colorLightning[SmType::Count][DepthImpl::Count][SmImpl::Count];
+ bgfx::ProgramHandle m_colorLighting[SmType::Count][DepthImpl::Count][SmImpl::Count];
};
static Programs s_programs;
@@ -1464,7 +1464,7 @@ int _main_(int _argc, char** _argv)
, 1.0f, 0.0f, 3.0f, 0.01f // m_yOffset
, true // m_doBlur
, &s_programs.m_packDepth[DepthImpl::InvZ][PackDepth::RGBA] //m_progPack
- , &s_programs.m_colorLightning[SmType::Single][DepthImpl::InvZ][SmImpl::Hard] //m_progDraw
+ , &s_programs.m_colorLighting[SmType::Single][DepthImpl::InvZ][SmImpl::Hard] //m_progDraw
},
{ //SmImpl::PCF
10.0f, 7.0f, 12.0f, 1.0f // m_sizePwrTwo
@@ -1481,7 +1481,7 @@ int _main_(int _argc, char** _argv)
, 1.0f, 0.0f, 3.0f, 0.01f // m_yOffset
, true // m_doBlur
, &s_programs.m_packDepth[DepthImpl::InvZ][PackDepth::RGBA] //m_progPack
- , &s_programs.m_colorLightning[SmType::Single][DepthImpl::InvZ][SmImpl::PCF] //m_progDraw
+ , &s_programs.m_colorLighting[SmType::Single][DepthImpl::InvZ][SmImpl::PCF] //m_progDraw
},
{ //SmImpl::VSM
10.0f, 7.0f, 12.0f, 1.0f // m_sizePwrTwo
@@ -1498,7 +1498,7 @@ int _main_(int _argc, char** _argv)
, 1.0f, 0.0f, 3.0f, 0.01f // m_yOffset
, true // m_doBlur
, &s_programs.m_packDepth[DepthImpl::InvZ][PackDepth::VSM] //m_progPack
- , &s_programs.m_colorLightning[SmType::Single][DepthImpl::InvZ][SmImpl::VSM] //m_progDraw
+ , &s_programs.m_colorLighting[SmType::Single][DepthImpl::InvZ][SmImpl::VSM] //m_progDraw
},
{ //SmImpl::ESM
10.0f, 7.0f, 12.0f, 1.0f // m_sizePwrTwo
@@ -1515,7 +1515,7 @@ int _main_(int _argc, char** _argv)
, 1.0f, 0.0f, 3.0f, 0.01f // m_yOffset
, true // m_doBlur
, &s_programs.m_packDepth[DepthImpl::InvZ][PackDepth::RGBA] //m_progPack
- , &s_programs.m_colorLightning[SmType::Single][DepthImpl::InvZ][SmImpl::ESM] //m_progDraw
+ , &s_programs.m_colorLighting[SmType::Single][DepthImpl::InvZ][SmImpl::ESM] //m_progDraw
}
},
@@ -1536,7 +1536,7 @@ int _main_(int _argc, char** _argv)
, 1.0f, 0.0f, 3.0f, 0.01f // m_yOffset
, true // m_doBlur
, &s_programs.m_packDepth[DepthImpl::Linear][PackDepth::RGBA] //m_progPack
- , &s_programs.m_colorLightning[SmType::Single][DepthImpl::Linear][SmImpl::Hard] //m_progDraw
+ , &s_programs.m_colorLighting[SmType::Single][DepthImpl::Linear][SmImpl::Hard] //m_progDraw
},
{ //SmImpl::PCF
10.0f, 7.0f, 12.0f, 1.0f // m_sizePwrTwo
@@ -1553,7 +1553,7 @@ int _main_(int _argc, char** _argv)
, 1.0f, 0.0f, 3.0f, 0.01f // m_yOffset
, true // m_doBlur
, &s_programs.m_packDepth[DepthImpl::Linear][PackDepth::RGBA] //m_progPack
- , &s_programs.m_colorLightning[SmType::Single][DepthImpl::Linear][SmImpl::PCF] //m_progDraw
+ , &s_programs.m_colorLighting[SmType::Single][DepthImpl::Linear][SmImpl::PCF] //m_progDraw
},
{ //SmImpl::VSM
10.0f, 7.0f, 12.0f, 1.0f // m_sizePwrTwo
@@ -1570,7 +1570,7 @@ int _main_(int _argc, char** _argv)
, 1.0f, 0.0f, 3.0f, 0.01f // m_yOffset
, true // m_doBlur
, &s_programs.m_packDepth[DepthImpl::Linear][PackDepth::VSM] //m_progPack
- , &s_programs.m_colorLightning[SmType::Single][DepthImpl::Linear][SmImpl::VSM] //m_progDraw
+ , &s_programs.m_colorLighting[SmType::Single][DepthImpl::Linear][SmImpl::VSM] //m_progDraw
},
{ //SmImpl::ESM
10.0f, 7.0f, 12.0f, 1.0f // m_sizePwrTwo
@@ -1587,7 +1587,7 @@ int _main_(int _argc, char** _argv)
, 1.0f, 0.0f, 3.0f, 0.01f // m_yOffset
, true // m_doBlur
, &s_programs.m_packDepth[DepthImpl::Linear][PackDepth::RGBA] //m_progPack
- , &s_programs.m_colorLightning[SmType::Single][DepthImpl::Linear][SmImpl::ESM] //m_progDraw
+ , &s_programs.m_colorLighting[SmType::Single][DepthImpl::Linear][SmImpl::ESM] //m_progDraw
}
}
@@ -1612,7 +1612,7 @@ int _main_(int _argc, char** _argv)
, 0.25f, 0.0f, 2.0f, 0.001f // m_yOffset
, true // m_doBlur
, &s_programs.m_packDepth[DepthImpl::InvZ][PackDepth::RGBA] //m_progPack
- , &s_programs.m_colorLightning[SmType::Omni][DepthImpl::InvZ][SmImpl::Hard] //m_progDraw
+ , &s_programs.m_colorLighting[SmType::Omni][DepthImpl::InvZ][SmImpl::Hard] //m_progDraw
},
{ //SmImpl::PCF
12.0f, 9.0f, 12.0f, 1.0f // m_sizePwrTwo
@@ -1629,7 +1629,7 @@ int _main_(int _argc, char** _argv)
, 1.0f, 0.0f, 3.0f, 0.001f // m_yOffset
, true // m_doBlur
, &s_programs.m_packDepth[DepthImpl::InvZ][PackDepth::RGBA] //m_progPack
- , &s_programs.m_colorLightning[SmType::Omni][DepthImpl::InvZ][SmImpl::PCF] //m_progDraw
+ , &s_programs.m_colorLighting[SmType::Omni][DepthImpl::InvZ][SmImpl::PCF] //m_progDraw
},
{ //SmImpl::VSM
12.0f, 9.0f, 12.0f, 1.0f // m_sizePwrTwo
@@ -1646,7 +1646,7 @@ int _main_(int _argc, char** _argv)
, 0.25f, 0.0f, 2.0f, 0.001f // m_yOffset
, true // m_doBlur
, &s_programs.m_packDepth[DepthImpl::InvZ][PackDepth::VSM] //m_progPack
- , &s_programs.m_colorLightning[SmType::Omni][DepthImpl::InvZ][SmImpl::VSM] //m_progDraw
+ , &s_programs.m_colorLighting[SmType::Omni][DepthImpl::InvZ][SmImpl::VSM] //m_progDraw
},
{ //SmImpl::ESM
12.0f, 9.0f, 12.0f, 1.0f // m_sizePwrTwo
@@ -1663,7 +1663,7 @@ int _main_(int _argc, char** _argv)
, 0.25f, 0.0f, 2.0f, 0.001f // m_yOffset
, true // m_doBlur
, &s_programs.m_packDepth[DepthImpl::InvZ][PackDepth::RGBA] //m_progPack
- , &s_programs.m_colorLightning[SmType::Omni][DepthImpl::InvZ][SmImpl::ESM] //m_progDraw
+ , &s_programs.m_colorLighting[SmType::Omni][DepthImpl::InvZ][SmImpl::ESM] //m_progDraw
}
},
@@ -1684,7 +1684,7 @@ int _main_(int _argc, char** _argv)
, 0.25f, 0.0f, 2.0f, 0.001f // m_yOffset
, true // m_doBlur
, &s_programs.m_packDepth[DepthImpl::Linear][PackDepth::RGBA] //m_progPack
- , &s_programs.m_colorLightning[SmType::Omni][DepthImpl::Linear][SmImpl::Hard] //m_progDraw
+ , &s_programs.m_colorLighting[SmType::Omni][DepthImpl::Linear][SmImpl::Hard] //m_progDraw
},
{ //SmImpl::PCF
12.0f, 9.0f, 12.0f, 1.0f // m_sizePwrTwo
@@ -1701,7 +1701,7 @@ int _main_(int _argc, char** _argv)
, 1.0f, 0.0f, 3.0f, 0.001f // m_yOffset
, true // m_doBlur
, &s_programs.m_packDepth[DepthImpl::Linear][PackDepth::RGBA] //m_progPack
- , &s_programs.m_colorLightning[SmType::Omni][DepthImpl::Linear][SmImpl::PCF] //m_progDraw
+ , &s_programs.m_colorLighting[SmType::Omni][DepthImpl::Linear][SmImpl::PCF] //m_progDraw
},
{ //SmImpl::VSM
12.0f, 9.0f, 12.0f, 1.0f // m_sizePwrTwo
@@ -1718,7 +1718,7 @@ int _main_(int _argc, char** _argv)
, 0.25f, 0.0f, 2.0f, 0.001f // m_yOffset
, true // m_doBlur
, &s_programs.m_packDepth[DepthImpl::Linear][PackDepth::VSM] //m_progPack
- , &s_programs.m_colorLightning[SmType::Omni][DepthImpl::Linear][SmImpl::VSM] //m_progDraw
+ , &s_programs.m_colorLighting[SmType::Omni][DepthImpl::Linear][SmImpl::VSM] //m_progDraw
},
{ //SmImpl::ESM
12.0f, 9.0f, 12.0f, 1.0f // m_sizePwrTwo
@@ -1735,7 +1735,7 @@ int _main_(int _argc, char** _argv)
, 0.25f, 0.0f, 2.0f, 0.001f // m_yOffset
, true // m_doBlur
, &s_programs.m_packDepth[DepthImpl::Linear][PackDepth::RGBA] //m_progPack
- , &s_programs.m_colorLightning[SmType::Omni][DepthImpl::Linear][SmImpl::ESM] //m_progDraw
+ , &s_programs.m_colorLighting[SmType::Omni][DepthImpl::Linear][SmImpl::ESM] //m_progDraw
}
}
@@ -1760,7 +1760,7 @@ int _main_(int _argc, char** _argv)
, 0.2f, 0.0f, 1.0f, 0.01f // m_yOffset
, true // m_doBlur
, &s_programs.m_packDepth[DepthImpl::InvZ][PackDepth::RGBA] //m_progPack
- , &s_programs.m_colorLightning[SmType::Cascade][DepthImpl::InvZ][SmImpl::Hard] //m_progDraw
+ , &s_programs.m_colorLighting[SmType::Cascade][DepthImpl::InvZ][SmImpl::Hard] //m_progDraw
},
{ //SmImpl::PCF
11.0f, 7.0f, 12.0f, 1.0f // m_sizePwrTwo
@@ -1777,7 +1777,7 @@ int _main_(int _argc, char** _argv)
, 1.0f, 0.0f, 3.0f, 0.01f // m_yOffset
, true // m_doBlur
, &s_programs.m_packDepth[DepthImpl::InvZ][PackDepth::RGBA] //m_progPack
- , &s_programs.m_colorLightning[SmType::Cascade][DepthImpl::InvZ][SmImpl::PCF] //m_progDraw
+ , &s_programs.m_colorLighting[SmType::Cascade][DepthImpl::InvZ][SmImpl::PCF] //m_progDraw
},
{ //SmImpl::VSM
11.0f, 7.0f, 12.0f, 1.0f // m_sizePwrTwo
@@ -1794,7 +1794,7 @@ int _main_(int _argc, char** _argv)
, 0.2f, 0.0f, 1.0f, 0.01f // m_yOffset
, true // m_doBlur
, &s_programs.m_packDepth[DepthImpl::InvZ][PackDepth::VSM] //m_progPack
- , &s_programs.m_colorLightning[SmType::Cascade][DepthImpl::InvZ][SmImpl::VSM] //m_progDraw
+ , &s_programs.m_colorLighting[SmType::Cascade][DepthImpl::InvZ][SmImpl::VSM] //m_progDraw
},
{ //SmImpl::ESM
11.0f, 7.0f, 12.0f, 1.0f // m_sizePwrTwo
@@ -1811,7 +1811,7 @@ int _main_(int _argc, char** _argv)
, 0.2f, 0.0f, 1.0f, 0.01f // m_yOffset
, true // m_doBlur
, &s_programs.m_packDepth[DepthImpl::InvZ][PackDepth::RGBA] //m_progPack
- , &s_programs.m_colorLightning[SmType::Cascade][DepthImpl::InvZ][SmImpl::ESM] //m_progDraw
+ , &s_programs.m_colorLighting[SmType::Cascade][DepthImpl::InvZ][SmImpl::ESM] //m_progDraw
}
},
@@ -1832,7 +1832,7 @@ int _main_(int _argc, char** _argv)
, 0.2f, 0.0f, 1.0f, 0.01f // m_yOffset
, true // m_doBlur
, &s_programs.m_packDepth[DepthImpl::Linear][PackDepth::RGBA] //m_progPack
- , &s_programs.m_colorLightning[SmType::Cascade][DepthImpl::Linear][SmImpl::Hard] //m_progDraw
+ , &s_programs.m_colorLighting[SmType::Cascade][DepthImpl::Linear][SmImpl::Hard] //m_progDraw
},
{ //SmImpl::PCF
11.0f, 7.0f, 12.0f, 1.0f // m_sizePwrTwo
@@ -1849,7 +1849,7 @@ int _main_(int _argc, char** _argv)
, 1.0f, 0.0f, 3.0f, 0.01f // m_yOffset
, true // m_doBlur
, &s_programs.m_packDepth[DepthImpl::Linear][PackDepth::RGBA] //m_progPack
- , &s_programs.m_colorLightning[SmType::Cascade][DepthImpl::Linear][SmImpl::PCF] //m_progDraw
+ , &s_programs.m_colorLighting[SmType::Cascade][DepthImpl::Linear][SmImpl::PCF] //m_progDraw
},
{ //SmImpl::VSM
11.0f, 7.0f, 12.0f, 1.0f // m_sizePwrTwo
@@ -1866,7 +1866,7 @@ int _main_(int _argc, char** _argv)
, 0.2f, 0.0f, 1.0f, 0.01f // m_yOffset
, true // m_doBlur
, &s_programs.m_packDepth[DepthImpl::Linear][PackDepth::VSM] //m_progPack
- , &s_programs.m_colorLightning[SmType::Cascade][DepthImpl::Linear][SmImpl::VSM] //m_progDraw
+ , &s_programs.m_colorLighting[SmType::Cascade][DepthImpl::Linear][SmImpl::VSM] //m_progDraw
},
{ //SmImpl::ESM
11.0f, 7.0f, 12.0f, 1.0f // m_sizePwrTwo
@@ -1883,7 +1883,7 @@ int _main_(int _argc, char** _argv)
, 0.2f, 0.0f, 1.0f, 0.01f // m_yOffset
, true // m_doBlur
, &s_programs.m_packDepth[DepthImpl::Linear][PackDepth::RGBA] //m_progPack
- , &s_programs.m_colorLightning[SmType::Cascade][DepthImpl::Linear][SmImpl::ESM] //m_progDraw
+ , &s_programs.m_colorLighting[SmType::Cascade][DepthImpl::Linear][SmImpl::ESM] //m_progDraw
}
}
@@ -1942,7 +1942,7 @@ int _main_(int _argc, char** _argv)
bgfx::TextureHandle fbtextures[] =
{
bgfx::createTexture2D(currentShadowMapSize, currentShadowMapSize, 1, bgfx::TextureFormat::BGRA8, BGFX_TEXTURE_RT),
- bgfx::createTexture2D(currentShadowMapSize, currentShadowMapSize, 1, bgfx::TextureFormat::D24S8),
+ bgfx::createTexture2D(currentShadowMapSize, currentShadowMapSize, 1, bgfx::TextureFormat::D24S8, BGFX_TEXTURE_RT),
};
s_rtShadowMap[ii] = bgfx::createFrameBuffer(BX_COUNTOF(fbtextures), fbtextures, true);
}
@@ -1960,7 +1960,7 @@ int _main_(int _argc, char** _argv)
const float camNear = 0.1f;
const float camFar = 2000.0f;
const float projHeight = 1.0f/tanf(bx::toRad(camFovy)*0.5f);
- const float projWidth = projHeight * 1.0f/camAspect;
+ const float projWidth = projHeight * camAspect;
bx::mtxProj(viewState.m_proj, camFovy, camAspect, camNear, camFar);
cameraGetViewMtx(viewState.m_view);
@@ -3096,7 +3096,7 @@ int _main_(int _argc, char** _argv)
bgfx::TextureHandle fbtextures[] =
{
bgfx::createTexture2D(currentShadowMapSize, currentShadowMapSize, 1, bgfx::TextureFormat::BGRA8, BGFX_TEXTURE_RT),
- bgfx::createTexture2D(currentShadowMapSize, currentShadowMapSize, 1, bgfx::TextureFormat::D24S8),
+ bgfx::createTexture2D(currentShadowMapSize, currentShadowMapSize, 1, bgfx::TextureFormat::D24S8, BGFX_TEXTURE_RT),
};
s_rtShadowMap[0] = bgfx::createFrameBuffer(BX_COUNTOF(fbtextures), fbtextures, true);
}
@@ -3111,7 +3111,7 @@ int _main_(int _argc, char** _argv)
bgfx::TextureHandle fbtextures[] =
{
bgfx::createTexture2D(currentShadowMapSize, currentShadowMapSize, 1, bgfx::TextureFormat::BGRA8, BGFX_TEXTURE_RT),
- bgfx::createTexture2D(currentShadowMapSize, currentShadowMapSize, 1, bgfx::TextureFormat::D24S8),
+ bgfx::createTexture2D(currentShadowMapSize, currentShadowMapSize, 1, bgfx::TextureFormat::D24S8, BGFX_TEXTURE_RT),
};
s_rtShadowMap[ii] = bgfx::createFrameBuffer(BX_COUNTOF(fbtextures), fbtextures, true);
}
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_color.sc b/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_color.sc
index 681f3afbf3d..a606797f019 100644
--- a/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_color.sc
+++ b/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_color.sc
@@ -2,7 +2,7 @@ $input a_position
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_color_lightning.sc b/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_color_lighting.sc
index c0c727a13ec..b92e665a6b7 100644
--- a/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_color_lightning.sc
+++ b/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_color_lighting.sc
@@ -3,7 +3,7 @@ $output v_normal, v_view, v_shadowcoord
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_color_lightning_csm.sc b/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_color_lighting_csm.sc
index d6ba938243b..680447b33fa 100644
--- a/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_color_lightning_csm.sc
+++ b/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_color_lighting_csm.sc
@@ -3,7 +3,7 @@ $output v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_t
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_color_lightning_linear.sc b/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_color_lighting_linear.sc
index db0f4c328f9..9906dbf6da0 100644
--- a/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_color_lightning_linear.sc
+++ b/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_color_lighting_linear.sc
@@ -3,7 +3,7 @@ $output v_normal, v_view, v_shadowcoord
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_color_lightning_linear_csm.sc b/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_color_lighting_linear_csm.sc
index 5c707296643..2e228f6dcd6 100644
--- a/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_color_lightning_linear_csm.sc
+++ b/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_color_lighting_linear_csm.sc
@@ -3,7 +3,7 @@ $output v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_t
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_color_lightning_linear_omni.sc b/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_color_lighting_linear_omni.sc
index 9c8faeaca0c..5048181d765 100644
--- a/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_color_lightning_linear_omni.sc
+++ b/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_color_lighting_linear_omni.sc
@@ -3,7 +3,7 @@ $output v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_t
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_color_lightning_omni.sc b/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_color_lighting_omni.sc
index 3c27561f0ce..45800caf72d 100644
--- a/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_color_lightning_omni.sc
+++ b/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_color_lighting_omni.sc
@@ -3,7 +3,7 @@ $output v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_t
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_color_texture.sc b/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_color_texture.sc
index bb5be99d708..239f4185c08 100644
--- a/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_color_texture.sc
+++ b/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_color_texture.sc
@@ -3,7 +3,7 @@ $output v_texcoord0
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_depth.sc b/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_depth.sc
index 52a2e605243..b7e0d2a17c3 100644
--- a/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_depth.sc
+++ b/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_depth.sc
@@ -2,7 +2,7 @@ $input a_position
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_hblur.sc b/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_hblur.sc
index 4c9ba1bd584..fd670ac1bd0 100644
--- a/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_hblur.sc
+++ b/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_hblur.sc
@@ -2,8 +2,8 @@ $input a_position, a_texcoord0
$output v_texcoord0, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_packdepth.sc b/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_packdepth.sc
index ca364dd29f3..8d55a99f223 100644
--- a/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_packdepth.sc
+++ b/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_packdepth.sc
@@ -3,7 +3,7 @@ $output v_position
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_packdepth_linear.sc b/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_packdepth_linear.sc
index e842b44c23d..20e2359159e 100644
--- a/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_packdepth_linear.sc
+++ b/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_packdepth_linear.sc
@@ -3,7 +3,7 @@ $output v_depth
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_texture.sc b/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_texture.sc
index bb5be99d708..239f4185c08 100644
--- a/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_texture.sc
+++ b/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_texture.sc
@@ -3,7 +3,7 @@ $output v_texcoord0
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_texture_lightning.sc b/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_texture_lighting.sc
index 32a418cbb99..da82704225f 100644
--- a/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_texture_lightning.sc
+++ b/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_texture_lighting.sc
@@ -3,7 +3,7 @@ $output v_normal, v_view, v_texcoord0
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_unpackdepth.sc b/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_unpackdepth.sc
index bb5be99d708..239f4185c08 100644
--- a/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_unpackdepth.sc
+++ b/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_unpackdepth.sc
@@ -3,7 +3,7 @@ $output v_texcoord0
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_vblur.sc b/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_vblur.sc
index 1ee057eb5f1..e9cd5c62e99 100644
--- a/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_vblur.sc
+++ b/3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_vblur.sc
@@ -3,7 +3,7 @@ $output v_texcoord0, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4
/*
* Copyright 2013-2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/17-drawstress/drawstress.cpp b/3rdparty/bgfx/examples/17-drawstress/drawstress.cpp
index ff035625e9d..258c00b5197 100644
--- a/3rdparty/bgfx/examples/17-drawstress/drawstress.cpp
+++ b/3rdparty/bgfx/examples/17-drawstress/drawstress.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "common.h"
@@ -242,6 +242,11 @@ class DrawStress : public entry::AppI
imguiLabel("Draw calls: %d", m_dim*m_dim*m_dim);
imguiLabel("Avg Delta Time (1 second) [ms]: %0.4f", m_deltaTimeAvgNs/1000.0f);
+ imguiSeparatorLine();
+ const bgfx::Stats* stats = bgfx::getStats();
+ imguiLabel("GPU %0.6f [ms]", double(stats->gpuTimeEnd - stats->gpuTimeBegin)*1000.0/stats->gpuTimerFreq);
+ imguiLabel("CPU %0.6f [ms]", double(stats->cpuTimeEnd - stats->cpuTimeBegin)*1000.0/stats->cpuTimerFreq);
+
imguiEndScrollArea();
imguiEndFrame();
diff --git a/3rdparty/bgfx/examples/17-drawstress/fs_drawstress.bin.h b/3rdparty/bgfx/examples/17-drawstress/fs_drawstress.bin.h
index 684132a061e..cf32868ff42 100644
--- a/3rdparty/bgfx/examples/17-drawstress/fs_drawstress.bin.h
+++ b/3rdparty/bgfx/examples/17-drawstress/fs_drawstress.bin.h
@@ -7,17 +7,17 @@ static const uint8_t fs_drawstress_glsl[89] =
0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, // ragColor = v_col
0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // or0;.}...
};
-static const uint8_t fs_drawstress_dx9[141] =
+static const uint8_t fs_drawstress_dx9[137] =
{
- 0x46, 0x53, 0x48, 0x04, 0xa4, 0x8b, 0xef, 0x49, 0x00, 0x00, 0x80, 0x00, 0x00, 0x03, 0xff, 0xff, // FSH....I........
- 0xfe, 0xff, 0x17, 0x00, 0x43, 0x54, 0x41, 0x42, 0x1c, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, // ....CTAB....#...
+ 0x46, 0x53, 0x48, 0x04, 0xa4, 0x8b, 0xef, 0x49, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x03, 0xff, 0xff, // FSH....I..|.....
+ 0xfe, 0xff, 0x16, 0x00, 0x43, 0x54, 0x41, 0x42, 0x1c, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, // ....CTAB....#...
0x00, 0x03, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x91, 0x00, 0x00, // ................
0x1c, 0x00, 0x00, 0x00, 0x70, 0x73, 0x5f, 0x33, 0x5f, 0x30, 0x00, 0x4d, 0x69, 0x63, 0x72, 0x6f, // ....ps_3_0.Micro
0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, 0x68, // soft (R) HLSL Sh
- 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x31, 0x30, // ader Compiler 10
- 0x2e, 0x30, 0x2e, 0x31, 0x30, 0x30, 0x31, 0x31, 0x2e, 0x31, 0x36, 0x33, 0x38, 0x34, 0x00, 0xab, // .0.10011.16384..
- 0x1f, 0x00, 0x00, 0x02, 0x0a, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f, 0x90, 0x01, 0x00, 0x00, 0x02, // ................
- 0x00, 0x08, 0x0f, 0x80, 0x00, 0x00, 0xe4, 0x90, 0xff, 0xff, 0x00, 0x00, 0x00, // .............
+ 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x39, 0x2e, // ader Compiler 9.
+ 0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, 0x2e, 0x33, 0x31, 0x31, 0x31, 0x00, 0x1f, 0x00, 0x00, 0x02, // 29.952.3111.....
+ 0x0a, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f, 0x90, 0x01, 0x00, 0x00, 0x02, 0x00, 0x08, 0x0f, 0x80, // ................
+ 0x00, 0x00, 0xe4, 0x90, 0xff, 0xff, 0x00, 0x00, 0x00, // .........
};
static const uint8_t fs_drawstress_dx11[260] =
{
diff --git a/3rdparty/bgfx/examples/17-drawstress/fs_drawstress.sc b/3rdparty/bgfx/examples/17-drawstress/fs_drawstress.sc
index 4fc0a0a82ba..43148e6a8dd 100644
--- a/3rdparty/bgfx/examples/17-drawstress/fs_drawstress.sc
+++ b/3rdparty/bgfx/examples/17-drawstress/fs_drawstress.sc
@@ -1,8 +1,8 @@
$input v_color0
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/17-drawstress/vs_drawstress.bin.h b/3rdparty/bgfx/examples/17-drawstress/vs_drawstress.bin.h
index 2a2fcef2ada..27cb89d15c3 100644
--- a/3rdparty/bgfx/examples/17-drawstress/vs_drawstress.bin.h
+++ b/3rdparty/bgfx/examples/17-drawstress/vs_drawstress.bin.h
@@ -22,11 +22,11 @@ static const uint8_t vs_drawstress_glsl[325] =
0x6c, 0x6f, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, // lor0 = a_color0;
0x0a, 0x7d, 0x0a, 0x0a, 0x00, // .}...
};
-static const uint8_t vs_drawstress_dx9[323] =
+static const uint8_t vs_drawstress_dx9[319] =
{
0x56, 0x53, 0x48, 0x04, 0xa4, 0x8b, 0xef, 0x49, 0x01, 0x00, 0x0f, 0x75, 0x5f, 0x6d, 0x6f, 0x64, // VSH....I...u_mod
0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, 0x00, 0x00, 0x04, 0x00, // elViewProj......
- 0x20, 0x01, 0x00, 0x03, 0xfe, 0xff, 0xfe, 0xff, 0x24, 0x00, 0x43, 0x54, 0x41, 0x42, 0x1c, 0x00, // .......$.CTAB..
+ 0x1c, 0x01, 0x00, 0x03, 0xfe, 0xff, 0xfe, 0xff, 0x23, 0x00, 0x43, 0x54, 0x41, 0x42, 0x1c, 0x00, // ........#.CTAB..
0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x00, 0x03, 0xfe, 0xff, 0x01, 0x00, 0x00, 0x00, 0x1c, 0x00, // ..W.............
0x00, 0x00, 0x00, 0x91, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x02, 0x00, // ......P...0.....
0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x5f, // ......@.......u_
@@ -34,17 +34,16 @@ static const uint8_t vs_drawstress_dx9[323] =
0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x73, // ..............vs
0x5f, 0x33, 0x5f, 0x30, 0x00, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, // _3_0.Microsoft (
0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, // R) HLSL Shader C
- 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x31, 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x30, 0x30, // ompiler 10.0.100
- 0x31, 0x31, 0x2e, 0x31, 0x36, 0x33, 0x38, 0x34, 0x00, 0xab, 0x1f, 0x00, 0x00, 0x02, 0x0a, 0x00, // 11.16384........
- 0x00, 0x80, 0x00, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, // ................
- 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f, 0xe0, 0x1f, 0x00, // ................
- 0x00, 0x02, 0x0a, 0x00, 0x00, 0x80, 0x01, 0x00, 0x0f, 0xe0, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, // ................
- 0x0f, 0x80, 0x01, 0x00, 0xe4, 0xa0, 0x01, 0x00, 0x55, 0x90, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, // ........U.......
- 0x0f, 0x80, 0x00, 0x00, 0xe4, 0xa0, 0x01, 0x00, 0x00, 0x90, 0x00, 0x00, 0xe4, 0x80, 0x04, 0x00, // ................
- 0x00, 0x04, 0x00, 0x00, 0x0f, 0x80, 0x02, 0x00, 0xe4, 0xa0, 0x01, 0x00, 0xaa, 0x90, 0x00, 0x00, // ................
- 0xe4, 0x80, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, 0xe4, 0x80, 0x03, 0x00, // ................
- 0xe4, 0xa0, 0x01, 0x00, 0x00, 0x02, 0x01, 0x00, 0x0f, 0xe0, 0x00, 0x00, 0xe4, 0x90, 0xff, 0xff, // ................
- 0x00, 0x00, 0x00, // ...
+ 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x39, 0x2e, 0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, // ompiler 9.29.952
+ 0x2e, 0x33, 0x31, 0x31, 0x31, 0x00, 0x1f, 0x00, 0x00, 0x02, 0x0a, 0x00, 0x00, 0x80, 0x00, 0x00, // .3111...........
+ 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x0f, 0x90, 0x1f, 0x00, // ................
+ 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f, 0xe0, 0x1f, 0x00, 0x00, 0x02, 0x0a, 0x00, // ................
+ 0x00, 0x80, 0x01, 0x00, 0x0f, 0xe0, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0x80, 0x01, 0x00, // ................
+ 0xe4, 0xa0, 0x01, 0x00, 0x55, 0x90, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, // ....U...........
+ 0xe4, 0xa0, 0x01, 0x00, 0x00, 0x90, 0x00, 0x00, 0xe4, 0x80, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, // ................
+ 0x0f, 0x80, 0x02, 0x00, 0xe4, 0xa0, 0x01, 0x00, 0xaa, 0x90, 0x00, 0x00, 0xe4, 0x80, 0x02, 0x00, // ................
+ 0x00, 0x03, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, 0xe4, 0x80, 0x03, 0x00, 0xe4, 0xa0, 0x01, 0x00, // ................
+ 0x00, 0x02, 0x01, 0x00, 0x0f, 0xe0, 0x00, 0x00, 0xe4, 0x90, 0xff, 0xff, 0x00, 0x00, 0x00, // ...............
};
static const uint8_t vs_drawstress_dx11[510] =
{
diff --git a/3rdparty/bgfx/examples/17-drawstress/vs_drawstress.sc b/3rdparty/bgfx/examples/17-drawstress/vs_drawstress.sc
index 1c693736722..dba53d643d0 100644
--- a/3rdparty/bgfx/examples/17-drawstress/vs_drawstress.sc
+++ b/3rdparty/bgfx/examples/17-drawstress/vs_drawstress.sc
@@ -2,8 +2,8 @@ $input a_position, a_color0
$output v_color0
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/18-ibl/fs_ibl_mesh.sc b/3rdparty/bgfx/examples/18-ibl/fs_ibl_mesh.sc
index b5c2b38b0a4..3ac5278f44f 100644
--- a/3rdparty/bgfx/examples/18-ibl/fs_ibl_mesh.sc
+++ b/3rdparty/bgfx/examples/18-ibl/fs_ibl_mesh.sc
@@ -2,7 +2,7 @@ $input v_view, v_normal
/*
* Copyright 2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/18-ibl/fs_ibl_skybox.sc b/3rdparty/bgfx/examples/18-ibl/fs_ibl_skybox.sc
index 66835748202..790fc0144fc 100644
--- a/3rdparty/bgfx/examples/18-ibl/fs_ibl_skybox.sc
+++ b/3rdparty/bgfx/examples/18-ibl/fs_ibl_skybox.sc
@@ -2,7 +2,7 @@ $input v_dir
/*
* Copyright 2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/18-ibl/ibl.cpp b/3rdparty/bgfx/examples/18-ibl/ibl.cpp
index 8f9f13a3ce1..51a194730e4 100644
--- a/3rdparty/bgfx/examples/18-ibl/ibl.cpp
+++ b/3rdparty/bgfx/examples/18-ibl/ibl.cpp
@@ -1,6 +1,6 @@
/*
* Copyright 2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include <vector>
@@ -455,7 +455,7 @@ int _main_(int _argc, char** _argv)
// Use debug font to print information about this example.
bgfx::dbgTextClear();
bgfx::dbgTextPrintf(0, 1, 0x4f, "bgfx/examples/18-ibl");
- bgfx::dbgTextPrintf(0, 2, 0x6f, "Description: Image based lightning.");
+ bgfx::dbgTextPrintf(0, 2, 0x6f, "Description: Image-based lighting.");
bgfx::dbgTextPrintf(0, 3, 0x0f, "Frame: % 7.3f[ms]", double(frameTime)*toMs);
float at[3] = { 0.0f, 0.0f, 0.0f };
diff --git a/3rdparty/bgfx/examples/18-ibl/vs_ibl_mesh.sc b/3rdparty/bgfx/examples/18-ibl/vs_ibl_mesh.sc
index d38b44559e7..7671fb74dfa 100644
--- a/3rdparty/bgfx/examples/18-ibl/vs_ibl_mesh.sc
+++ b/3rdparty/bgfx/examples/18-ibl/vs_ibl_mesh.sc
@@ -3,7 +3,7 @@ $output v_view, v_normal
/*
* Copyright 2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/18-ibl/vs_ibl_skybox.sc b/3rdparty/bgfx/examples/18-ibl/vs_ibl_skybox.sc
index 2281d08624c..1c15b18e25e 100644
--- a/3rdparty/bgfx/examples/18-ibl/vs_ibl_skybox.sc
+++ b/3rdparty/bgfx/examples/18-ibl/vs_ibl_skybox.sc
@@ -3,7 +3,7 @@ $output v_dir
/*
* Copyright 2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/19-oit/fs_oit.sc b/3rdparty/bgfx/examples/19-oit/fs_oit.sc
index 578eb7f5751..9d641fcdddb 100644
--- a/3rdparty/bgfx/examples/19-oit/fs_oit.sc
+++ b/3rdparty/bgfx/examples/19-oit/fs_oit.sc
@@ -1,8 +1,8 @@
$input v_pos
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/19-oit/fs_oit_wb.sc b/3rdparty/bgfx/examples/19-oit/fs_oit_wb.sc
index cd67dff9d23..71a3e3c9602 100644
--- a/3rdparty/bgfx/examples/19-oit/fs_oit_wb.sc
+++ b/3rdparty/bgfx/examples/19-oit/fs_oit_wb.sc
@@ -1,8 +1,8 @@
$input v_pos
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/19-oit/fs_oit_wb_blit.sc b/3rdparty/bgfx/examples/19-oit/fs_oit_wb_blit.sc
index 6380967d150..8730ba62dab 100644
--- a/3rdparty/bgfx/examples/19-oit/fs_oit_wb_blit.sc
+++ b/3rdparty/bgfx/examples/19-oit/fs_oit_wb_blit.sc
@@ -1,8 +1,8 @@
$input v_texcoord0
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/19-oit/fs_oit_wb_separate.sc b/3rdparty/bgfx/examples/19-oit/fs_oit_wb_separate.sc
index 31a1aa27ca1..17c5d0b1a34 100644
--- a/3rdparty/bgfx/examples/19-oit/fs_oit_wb_separate.sc
+++ b/3rdparty/bgfx/examples/19-oit/fs_oit_wb_separate.sc
@@ -1,8 +1,8 @@
$input v_pos
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/19-oit/fs_oit_wb_separate_blit.sc b/3rdparty/bgfx/examples/19-oit/fs_oit_wb_separate_blit.sc
index 195c5ff7d27..125df51b2ac 100644
--- a/3rdparty/bgfx/examples/19-oit/fs_oit_wb_separate_blit.sc
+++ b/3rdparty/bgfx/examples/19-oit/fs_oit_wb_separate_blit.sc
@@ -1,8 +1,8 @@
$input v_texcoord0
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/19-oit/oit.cpp b/3rdparty/bgfx/examples/19-oit/oit.cpp
index c25f39621b2..66baed03cd1 100644
--- a/3rdparty/bgfx/examples/19-oit/oit.cpp
+++ b/3rdparty/bgfx/examples/19-oit/oit.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "common.h"
diff --git a/3rdparty/bgfx/examples/19-oit/vs_oit.sc b/3rdparty/bgfx/examples/19-oit/vs_oit.sc
index 90b5dd14e2b..0f720610f66 100644
--- a/3rdparty/bgfx/examples/19-oit/vs_oit.sc
+++ b/3rdparty/bgfx/examples/19-oit/vs_oit.sc
@@ -2,8 +2,8 @@ $input a_position
$output v_pos
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/19-oit/vs_oit_blit.sc b/3rdparty/bgfx/examples/19-oit/vs_oit_blit.sc
index 0b585f0adcc..d82aff94b87 100644
--- a/3rdparty/bgfx/examples/19-oit/vs_oit_blit.sc
+++ b/3rdparty/bgfx/examples/19-oit/vs_oit_blit.sc
@@ -2,8 +2,8 @@ $input a_position, a_texcoord0
$output v_texcoord0
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/20-nanovg/nanovg.cpp b/3rdparty/bgfx/examples/20-nanovg/nanovg.cpp
index 3f31e2c6cbe..f667ba180c2 100644
--- a/3rdparty/bgfx/examples/20-nanovg/nanovg.cpp
+++ b/3rdparty/bgfx/examples/20-nanovg/nanovg.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
//
@@ -946,7 +946,7 @@ int loadDemoData(struct NVGcontext* vg, struct DemoData* data)
char file[128];
bx::snprintf(file, 128, "images/image%d.jpg", ii+1);
data->images[ii] = nvgCreateImage(vg, file, 0);
- if (data->images[ii] == bgfx::invalidHandle)
+ if (data->images[ii] == 0)
{
printf("Could not load %s.\n", file);
return -1;
diff --git a/3rdparty/bgfx/examples/21-deferred/deferred.cpp b/3rdparty/bgfx/examples/21-deferred/deferred.cpp
index f1201363036..5a97b7f21b2 100644
--- a/3rdparty/bgfx/examples/21-deferred/deferred.cpp
+++ b/3rdparty/bgfx/examples/21-deferred/deferred.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "common.h"
diff --git a/3rdparty/bgfx/examples/21-deferred/fs_deferred_combine.sc b/3rdparty/bgfx/examples/21-deferred/fs_deferred_combine.sc
index 63ce613e412..6a16774da23 100644
--- a/3rdparty/bgfx/examples/21-deferred/fs_deferred_combine.sc
+++ b/3rdparty/bgfx/examples/21-deferred/fs_deferred_combine.sc
@@ -1,8 +1,8 @@
$input v_texcoord0
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/21-deferred/fs_deferred_debug.sc b/3rdparty/bgfx/examples/21-deferred/fs_deferred_debug.sc
index 03dcdf015d0..00114de8f0b 100644
--- a/3rdparty/bgfx/examples/21-deferred/fs_deferred_debug.sc
+++ b/3rdparty/bgfx/examples/21-deferred/fs_deferred_debug.sc
@@ -1,8 +1,8 @@
$input v_texcoord0
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/21-deferred/fs_deferred_debug_line.sc b/3rdparty/bgfx/examples/21-deferred/fs_deferred_debug_line.sc
index 4fc0a0a82ba..43148e6a8dd 100644
--- a/3rdparty/bgfx/examples/21-deferred/fs_deferred_debug_line.sc
+++ b/3rdparty/bgfx/examples/21-deferred/fs_deferred_debug_line.sc
@@ -1,8 +1,8 @@
$input v_color0
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/21-deferred/fs_deferred_geom.sc b/3rdparty/bgfx/examples/21-deferred/fs_deferred_geom.sc
index f64c4971e8a..21190bbf387 100644
--- a/3rdparty/bgfx/examples/21-deferred/fs_deferred_geom.sc
+++ b/3rdparty/bgfx/examples/21-deferred/fs_deferred_geom.sc
@@ -1,8 +1,8 @@
$input v_wpos, v_view, v_normal, v_tangent, v_bitangent, v_texcoord0
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/21-deferred/fs_deferred_light.sc b/3rdparty/bgfx/examples/21-deferred/fs_deferred_light.sc
index b8321a515ed..378f1eded71 100644
--- a/3rdparty/bgfx/examples/21-deferred/fs_deferred_light.sc
+++ b/3rdparty/bgfx/examples/21-deferred/fs_deferred_light.sc
@@ -1,8 +1,8 @@
$input v_texcoord0
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/21-deferred/vs_deferred_combine.sc b/3rdparty/bgfx/examples/21-deferred/vs_deferred_combine.sc
index 0b585f0adcc..d82aff94b87 100644
--- a/3rdparty/bgfx/examples/21-deferred/vs_deferred_combine.sc
+++ b/3rdparty/bgfx/examples/21-deferred/vs_deferred_combine.sc
@@ -2,8 +2,8 @@ $input a_position, a_texcoord0
$output v_texcoord0
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/21-deferred/vs_deferred_debug.sc b/3rdparty/bgfx/examples/21-deferred/vs_deferred_debug.sc
index 0b585f0adcc..d82aff94b87 100644
--- a/3rdparty/bgfx/examples/21-deferred/vs_deferred_debug.sc
+++ b/3rdparty/bgfx/examples/21-deferred/vs_deferred_debug.sc
@@ -2,8 +2,8 @@ $input a_position, a_texcoord0
$output v_texcoord0
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/21-deferred/vs_deferred_debug_line.sc b/3rdparty/bgfx/examples/21-deferred/vs_deferred_debug_line.sc
index 1c693736722..dba53d643d0 100644
--- a/3rdparty/bgfx/examples/21-deferred/vs_deferred_debug_line.sc
+++ b/3rdparty/bgfx/examples/21-deferred/vs_deferred_debug_line.sc
@@ -2,8 +2,8 @@ $input a_position, a_color0
$output v_color0
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/21-deferred/vs_deferred_geom.sc b/3rdparty/bgfx/examples/21-deferred/vs_deferred_geom.sc
index 6d3af770b18..bf199791c3e 100644
--- a/3rdparty/bgfx/examples/21-deferred/vs_deferred_geom.sc
+++ b/3rdparty/bgfx/examples/21-deferred/vs_deferred_geom.sc
@@ -2,8 +2,8 @@ $input a_position, a_normal, a_tangent, a_texcoord0
$output v_wpos, v_view, v_normal, v_tangent, v_bitangent, v_texcoord0
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/21-deferred/vs_deferred_light.sc b/3rdparty/bgfx/examples/21-deferred/vs_deferred_light.sc
index 0b585f0adcc..d82aff94b87 100644
--- a/3rdparty/bgfx/examples/21-deferred/vs_deferred_light.sc
+++ b/3rdparty/bgfx/examples/21-deferred/vs_deferred_light.sc
@@ -2,8 +2,8 @@ $input a_position, a_texcoord0
$output v_texcoord0
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/22-windows/windows.cpp b/3rdparty/bgfx/examples/22-windows/windows.cpp
index 24187e27fbf..d0d3b546911 100644
--- a/3rdparty/bgfx/examples/22-windows/windows.cpp
+++ b/3rdparty/bgfx/examples/22-windows/windows.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "common.h"
diff --git a/3rdparty/bgfx/examples/23-vectordisplay/main.cpp b/3rdparty/bgfx/examples/23-vectordisplay/main.cpp
index 2cd1574a4be..36472d53453 100644
--- a/3rdparty/bgfx/examples/23-vectordisplay/main.cpp
+++ b/3rdparty/bgfx/examples/23-vectordisplay/main.cpp
@@ -1,6 +1,6 @@
/*
* Copyright 2014 Kai Jourdan. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*
*/
diff --git a/3rdparty/bgfx/examples/23-vectordisplay/vectordisplay.cpp b/3rdparty/bgfx/examples/23-vectordisplay/vectordisplay.cpp
index 4285502394d..a49eace14aa 100644
--- a/3rdparty/bgfx/examples/23-vectordisplay/vectordisplay.cpp
+++ b/3rdparty/bgfx/examples/23-vectordisplay/vectordisplay.cpp
@@ -1,6 +1,6 @@
/*
* Copyright 2014 Kai Jourdan. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*
* Based on code from Brian Luczkiewicz
* https://github.com/blucz/Vector
diff --git a/3rdparty/bgfx/examples/23-vectordisplay/vectordisplay.h b/3rdparty/bgfx/examples/23-vectordisplay/vectordisplay.h
index 0b8c78a8efb..049fcd9a906 100644
--- a/3rdparty/bgfx/examples/23-vectordisplay/vectordisplay.h
+++ b/3rdparty/bgfx/examples/23-vectordisplay/vectordisplay.h
@@ -1,6 +1,6 @@
/*
* Copyright 2014 Kai Jourdan. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*
* Based on code from Brian Luczkiewicz
* https://github.com/blucz/Vector
diff --git a/3rdparty/bgfx/examples/24-nbody/cs_indirect.sc b/3rdparty/bgfx/examples/24-nbody/cs_indirect.sc
index 8dfc01935d4..87b6b1859cf 100644
--- a/3rdparty/bgfx/examples/24-nbody/cs_indirect.sc
+++ b/3rdparty/bgfx/examples/24-nbody/cs_indirect.sc
@@ -1,6 +1,6 @@
/*
* Copyright 2014 Stanlo Slasinski. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "bgfx_compute.sh"
diff --git a/3rdparty/bgfx/examples/24-nbody/cs_init_instances.sc b/3rdparty/bgfx/examples/24-nbody/cs_init_instances.sc
index 34909a9ea5f..cc824b19332 100644
--- a/3rdparty/bgfx/examples/24-nbody/cs_init_instances.sc
+++ b/3rdparty/bgfx/examples/24-nbody/cs_init_instances.sc
@@ -1,6 +1,6 @@
/*
* Copyright 2014 Stanlo Slasinski. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "bgfx_compute.sh"
diff --git a/3rdparty/bgfx/examples/24-nbody/cs_update_instances.sc b/3rdparty/bgfx/examples/24-nbody/cs_update_instances.sc
index b818f97c86f..612a7b95376 100644
--- a/3rdparty/bgfx/examples/24-nbody/cs_update_instances.sc
+++ b/3rdparty/bgfx/examples/24-nbody/cs_update_instances.sc
@@ -1,6 +1,6 @@
/*
* Copyright 2014 Stanlo Slasinski. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "bgfx_compute.sh"
diff --git a/3rdparty/bgfx/examples/24-nbody/fs_particle.sc b/3rdparty/bgfx/examples/24-nbody/fs_particle.sc
index ac78c23b514..6dfca6d3889 100644
--- a/3rdparty/bgfx/examples/24-nbody/fs_particle.sc
+++ b/3rdparty/bgfx/examples/24-nbody/fs_particle.sc
@@ -2,7 +2,7 @@ $input v_texCoord
/*
* Copyright 2014 Stanlo Slasinski. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/24-nbody/nbody.cpp b/3rdparty/bgfx/examples/24-nbody/nbody.cpp
index dbd978b4f01..79f722f962e 100644
--- a/3rdparty/bgfx/examples/24-nbody/nbody.cpp
+++ b/3rdparty/bgfx/examples/24-nbody/nbody.cpp
@@ -1,6 +1,6 @@
/*
* Copyright 2014 Stanlo Slasinski. All rights reserved.
-* License: http://www.opensource.org/licenses/BSD-2-Clause
+* License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "common.h"
diff --git a/3rdparty/bgfx/examples/24-nbody/uniforms.sh b/3rdparty/bgfx/examples/24-nbody/uniforms.sh
index 70540164dad..a27545fbae0 100644
--- a/3rdparty/bgfx/examples/24-nbody/uniforms.sh
+++ b/3rdparty/bgfx/examples/24-nbody/uniforms.sh
@@ -1,6 +1,6 @@
/*
* Copyright 2014 Stanlo Slasinski. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
uniform vec4 u_params[3];
diff --git a/3rdparty/bgfx/examples/24-nbody/vs_particle.sc b/3rdparty/bgfx/examples/24-nbody/vs_particle.sc
index 870c27ce1af..f6bf524a4c1 100644
--- a/3rdparty/bgfx/examples/24-nbody/vs_particle.sc
+++ b/3rdparty/bgfx/examples/24-nbody/vs_particle.sc
@@ -3,7 +3,7 @@ $output v_texCoord
/*
* Copyright 2014 Stanlo Slasinski. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common/common.sh"
diff --git a/3rdparty/bgfx/examples/26-occlusion/occlusion.cpp b/3rdparty/bgfx/examples/26-occlusion/occlusion.cpp
new file mode 100644
index 00000000000..a6971cdd5cd
--- /dev/null
+++ b/3rdparty/bgfx/examples/26-occlusion/occlusion.cpp
@@ -0,0 +1,285 @@
+/*
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
+ */
+
+#include "common.h"
+#include "bgfx_utils.h"
+#include "camera.h"
+
+#define CUBES_DIM 10
+
+struct PosColorVertex
+{
+ float m_x;
+ float m_y;
+ float m_z;
+ uint32_t m_abgr;
+
+ static void init()
+ {
+ ms_decl
+ .begin()
+ .add(bgfx::Attrib::Position, 3, bgfx::AttribType::Float)
+ .add(bgfx::Attrib::Color0, 4, bgfx::AttribType::Uint8, true)
+ .end();
+ };
+
+ static bgfx::VertexDecl ms_decl;
+};
+
+bgfx::VertexDecl PosColorVertex::ms_decl;
+
+static PosColorVertex s_cubeVertices[8] =
+{
+ {-1.0f, 1.0f, 1.0f, 0xff000000 },
+ { 1.0f, 1.0f, 1.0f, 0xff0000ff },
+ {-1.0f, -1.0f, 1.0f, 0xff00ff00 },
+ { 1.0f, -1.0f, 1.0f, 0xff00ffff },
+ {-1.0f, 1.0f, -1.0f, 0xffff0000 },
+ { 1.0f, 1.0f, -1.0f, 0xffff00ff },
+ {-1.0f, -1.0f, -1.0f, 0xffffff00 },
+ { 1.0f, -1.0f, -1.0f, 0xffffffff },
+};
+
+static const uint16_t s_cubeIndices[36] =
+{
+ 0, 1, 2, // 0
+ 1, 3, 2,
+ 4, 6, 5, // 2
+ 5, 6, 7,
+ 0, 2, 4, // 4
+ 4, 2, 6,
+ 1, 5, 3, // 6
+ 5, 7, 3,
+ 0, 4, 1, // 8
+ 4, 5, 1,
+ 2, 3, 6, // 10
+ 6, 3, 7,
+};
+
+class Occlusion : public entry::AppI
+{
+ void init(int _argc, char** _argv) BX_OVERRIDE
+ {
+ Args args(_argc, _argv);
+
+ uint32_t width = 1280;
+ uint32_t height = 720;
+ m_debug = BGFX_DEBUG_TEXT;
+ m_reset = BGFX_RESET_VSYNC;
+
+ bgfx::init(args.m_type, args.m_pciId);
+ bgfx::reset(width, height, m_reset);
+
+ // Enable debug text.
+ bgfx::setDebug(m_debug);
+
+ // Set view 0 clear state.
+ bgfx::setViewClear(0
+ , BGFX_CLEAR_COLOR|BGFX_CLEAR_DEPTH
+ , 0x303030ff
+ , 1.0f
+ , 0
+ );
+
+ bgfx::setViewClear(2
+ , BGFX_CLEAR_COLOR|BGFX_CLEAR_DEPTH
+ , 0x202020ff
+ , 1.0f
+ , 0
+ );
+
+ // Create vertex stream declaration.
+ PosColorVertex::init();
+
+ // Create static vertex buffer.
+ m_vbh = bgfx::createVertexBuffer(
+ // Static data can be passed with bgfx::makeRef
+ bgfx::makeRef(s_cubeVertices, sizeof(s_cubeVertices) )
+ , PosColorVertex::ms_decl
+ );
+
+ // Create static index buffer.
+ m_ibh = bgfx::createIndexBuffer(
+ // Static data can be passed with bgfx::makeRef
+ bgfx::makeRef(s_cubeIndices, sizeof(s_cubeIndices) )
+ );
+
+ // Create program from shaders.
+ m_program = loadProgram("vs_cubes", "fs_cubes");
+
+ for (uint32_t ii = 0; ii < BX_COUNTOF(m_occlusionQueries); ++ii)
+ {
+ m_occlusionQueries[ii] = bgfx::createOcclusionQuery();
+ }
+
+ cameraCreate();
+
+ const float initialPos[3] = { 15.5f, 0.0f, -15.5f };
+ cameraSetPosition(initialPos);
+ cameraSetHorizontalAngle(bx::toRad(-45.0f) );
+
+ m_timeOffset = bx::getHPCounter();
+ }
+
+ virtual int shutdown() BX_OVERRIDE
+ {
+ // Cleanup.
+ cameraDestroy();
+
+ for (uint32_t ii = 0; ii < BX_COUNTOF(m_occlusionQueries); ++ii)
+ {
+ bgfx::destroyOcclusionQuery(m_occlusionQueries[ii]);
+ }
+
+ bgfx::destroyIndexBuffer(m_ibh);
+ bgfx::destroyVertexBuffer(m_vbh);
+ bgfx::destroyProgram(m_program);
+
+ // Shutdown bgfx.
+ bgfx::shutdown();
+
+ return 0;
+ }
+
+ bool update() BX_OVERRIDE
+ {
+ if (!entry::processWindowEvents(m_state, m_debug, m_reset) )
+ {
+ int64_t now = bx::getHPCounter();
+ static int64_t last = now;
+ const int64_t frameTime = now - last;
+ last = now;
+ const double freq = double(bx::getHPFrequency() );
+ const double toMs = 1000.0/freq;
+ const float time = (float)( (now-m_timeOffset)/double(bx::getHPFrequency() ) );
+ const float deltaTime = float(frameTime/freq);
+
+ // Use debug font to print information about this example.
+ bgfx::dbgTextClear();
+ bgfx::dbgTextPrintf(0, 1, 0x4f, "bgfx/examples/26-occlusion");
+ bgfx::dbgTextPrintf(0, 2, 0x6f, "Description: Using occlusion query for conditional rendering.");
+ bgfx::dbgTextPrintf(0, 3, 0x0f, "Frame: % 7.3f[ms]", double(frameTime)*toMs);
+
+ uint32_t width = m_state.m_width;
+ uint32_t height = m_state.m_height;
+
+ // Update camera.
+ float view[16];
+ cameraUpdate(deltaTime, m_state.m_mouse);
+ cameraGetViewMtx(view);
+
+ // Set view and projection matrix for view 0.
+ const bgfx::HMD* hmd = bgfx::getHMD();
+ if (NULL != hmd && 0 != (hmd->flags & BGFX_HMD_RENDERING) )
+ {
+ float viewHead[16];
+ float eye[3] = {};
+ bx::mtxQuatTranslationHMD(viewHead, hmd->eye[0].rotation, eye);
+
+ float tmp[16];
+ bx::mtxMul(tmp, view, viewHead);
+
+ float proj[16];
+ bx::mtxProj(proj, hmd->eye[0].fov, 0.1f, 10000.0f);
+
+ bgfx::setViewTransform(0, tmp, proj);
+ bgfx::setViewRect(0, 0, 0, hmd->width, hmd->height);
+
+ bgfx::setViewTransform(1, tmp, proj);
+ bgfx::setViewRect(1, 0, 0, hmd->width, hmd->height);
+ }
+ else
+ {
+ float proj[16];
+ bx::mtxProj(proj, 90.0f, float(width)/float(height), 0.1f, 10000.0f);
+
+ bgfx::setViewTransform(0, view, proj);
+ bgfx::setViewRect(0, 0, 0, width, height);
+
+ bgfx::setViewTransform(1, view, proj);
+ bgfx::setViewRect(1, 0, 0, width, height);
+
+ float at[3] = { 0.0f, 0.0f, 0.0f };
+ float eye[3] = { 17.5f, 10.0f, -17.5f };
+ bx::mtxLookAt(view, eye, at);
+
+ bgfx::setViewTransform(2, view, proj);
+ bgfx::setViewRect(2, 10, height - height/4 - 10, width/4, height/4);
+ }
+
+ bgfx::touch(0);
+ bgfx::touch(2);
+
+ uint8_t img[CUBES_DIM*CUBES_DIM*2];
+
+ for (uint32_t yy = 0; yy < CUBES_DIM; ++yy)
+ {
+ for (uint32_t xx = 0; xx < CUBES_DIM; ++xx)
+ {
+ float mtx[16];
+ bx::mtxRotateXY(mtx, time + xx*0.21f, time + yy*0.37f);
+ mtx[12] = -(CUBES_DIM-1) * 3.0f / 2.0f + float(xx)*3.0f;
+ mtx[13] = 0.0f;
+ mtx[14] = -(CUBES_DIM-1) * 3.0f / 2.0f + float(yy)*3.0f;
+
+ bgfx::OcclusionQueryHandle occlusionQuery = m_occlusionQueries[yy*CUBES_DIM+xx];
+
+ bgfx::setTransform(mtx);
+ bgfx::setVertexBuffer(m_vbh);
+ bgfx::setIndexBuffer(m_ibh);
+ bgfx::setCondition(occlusionQuery, true);
+ bgfx::setState(BGFX_STATE_DEFAULT);
+ bgfx::submit(0, m_program);
+
+ bgfx::setTransform(mtx);
+ bgfx::setVertexBuffer(m_vbh);
+ bgfx::setIndexBuffer(m_ibh);
+ bgfx::setState(0
+ | BGFX_STATE_DEPTH_TEST_LEQUAL
+ | BGFX_STATE_CULL_CW
+ );
+ bgfx::submit(1, m_program, occlusionQuery);
+
+ bgfx::setTransform(mtx);
+ bgfx::setVertexBuffer(m_vbh);
+ bgfx::setIndexBuffer(m_ibh);
+ bgfx::setCondition(occlusionQuery, true);
+ bgfx::setState(BGFX_STATE_DEFAULT);
+ bgfx::submit(2, m_program);
+
+ img[(yy*CUBES_DIM+xx)*2+0] = " \xfex"[bgfx::getResult(occlusionQuery)];
+ img[(yy*CUBES_DIM+xx)*2+1] = 0xf;
+ }
+ }
+
+ for (uint32_t xx = 0; xx < CUBES_DIM; ++xx)
+ {
+ bgfx::dbgTextImage(5 + xx*2, 5, 1, CUBES_DIM, img + xx*2, CUBES_DIM*2);
+ }
+
+ // Advance to next frame. Rendering thread will be kicked to
+ // process submitted rendering primitives.
+ bgfx::frame();
+
+ return true;
+ }
+
+ return false;
+ }
+
+ uint32_t m_reset;
+ uint32_t m_debug;
+
+ bgfx::VertexBufferHandle m_vbh;
+ bgfx::IndexBufferHandle m_ibh;
+ bgfx::ProgramHandle m_program;
+ int64_t m_timeOffset;
+
+ bgfx::OcclusionQueryHandle m_occlusionQueries[CUBES_DIM*CUBES_DIM];
+
+ entry::WindowState m_state;
+};
+
+ENTRY_IMPLEMENT_MAIN(Occlusion);
diff --git a/3rdparty/bgfx/examples/26-occlusion/screenshot.png b/3rdparty/bgfx/examples/26-occlusion/screenshot.png
new file mode 100644
index 00000000000..e0e719b24e7
--- /dev/null
+++ b/3rdparty/bgfx/examples/26-occlusion/screenshot.png
Binary files differ
diff --git a/3rdparty/bgfx/examples/27-terrain/fs_terrain.sc b/3rdparty/bgfx/examples/27-terrain/fs_terrain.sc
new file mode 100644
index 00000000000..0b5aa82555d
--- /dev/null
+++ b/3rdparty/bgfx/examples/27-terrain/fs_terrain.sc
@@ -0,0 +1,13 @@
+$input v_position, v_texcoord0
+
+/*
+ * Copyright 2015 Andrew Mac. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
+ */
+
+#include "../common/common.sh"
+
+void main()
+{
+ gl_FragColor = vec4(v_texcoord0.x, v_texcoord0.y, v_position.y / 50.0, 1.0);
+}
diff --git a/3rdparty/bgfx/examples/27-terrain/makefile b/3rdparty/bgfx/examples/27-terrain/makefile
new file mode 100644
index 00000000000..011773e023f
--- /dev/null
+++ b/3rdparty/bgfx/examples/27-terrain/makefile
@@ -0,0 +1,17 @@
+#
+# Copyright 2011-2015 Branimir Karadzic. All rights reserved.
+# License: http://www.opensource.org/licenses/BSD-2-Clause
+#
+
+BGFX_DIR=../..
+RUNTIME_DIR=$(BGFX_DIR)/examples/runtime
+BUILD_DIR=../../.build
+
+include $(BGFX_DIR)/scripts/shader.mk
+
+rebuild:
+ @make -s --no-print-directory TARGET=0 clean all
+ @make -s --no-print-directory TARGET=1 clean all
+ @make -s --no-print-directory TARGET=2 clean all
+ @make -s --no-print-directory TARGET=3 clean all
+ @make -s --no-print-directory TARGET=4 clean all
diff --git a/3rdparty/bgfx/examples/27-terrain/screenshot.png b/3rdparty/bgfx/examples/27-terrain/screenshot.png
new file mode 100644
index 00000000000..580d1d0f5c2
--- /dev/null
+++ b/3rdparty/bgfx/examples/27-terrain/screenshot.png
Binary files differ
diff --git a/3rdparty/bgfx/examples/27-terrain/terrain.cpp b/3rdparty/bgfx/examples/27-terrain/terrain.cpp
new file mode 100644
index 00000000000..32686a7746e
--- /dev/null
+++ b/3rdparty/bgfx/examples/27-terrain/terrain.cpp
@@ -0,0 +1,527 @@
+/*
+ * Copyright 2015 Andrew Mac. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
+ */
+
+#include "common.h"
+#include "bgfx_utils.h"
+#include "imgui/imgui.h"
+#include "camera.h"
+#include "bounds.h"
+#include <bx/allocator.h>
+#include <bx/debug.h>
+#include <bx/fpumath.h>
+
+static float s_texelHalf = 0.0f;
+static bool s_originBottomLeft = false;
+static uint32_t s_terrainSize = 256;
+
+struct PosTexCoord0Vertex
+{
+ float m_x;
+ float m_y;
+ float m_z;
+ float m_u;
+ float m_v;
+
+ static void init()
+ {
+ ms_decl
+ .begin()
+ .add(bgfx::Attrib::Position, 3, bgfx::AttribType::Float)
+ .add(bgfx::Attrib::TexCoord0, 2, bgfx::AttribType::Float)
+ .end();
+ }
+
+ static bgfx::VertexDecl ms_decl;
+};
+
+bgfx::VertexDecl PosTexCoord0Vertex::ms_decl;
+
+struct TerrainData
+{
+ uint32_t m_mode;
+ bool m_dirty;
+ float m_transform[16];
+ uint8_t* m_heightMap;
+
+ PosTexCoord0Vertex* m_vertices;
+ uint32_t m_vertexCount;
+ uint16_t* m_indices;
+ uint32_t m_indexCount;
+};
+
+struct BrushData
+{
+ bool m_raise;
+ int32_t m_size;
+ float m_power;
+};
+
+class Terrain : public entry::AppI
+{
+ void init(int _argc, char** _argv) BX_OVERRIDE
+ {
+ Args args(_argc, _argv);
+
+ m_width = 1280;
+ m_height = 720;
+ m_debug = BGFX_DEBUG_TEXT;
+ m_reset = BGFX_RESET_VSYNC;
+
+ bgfx::init(bgfx::RendererType::Direct3D11, args.m_pciId);
+ bgfx::reset(m_width, m_height, m_reset);
+
+ // Enable m_debug text.
+ bgfx::setDebug(m_debug);
+
+ // Set view 0 clear state.
+ bgfx::setViewClear(0
+ , BGFX_CLEAR_COLOR | BGFX_CLEAR_DEPTH
+ , 0x303030ff
+ , 1.0f
+ , 0
+ );
+
+ // Create vertex stream declaration.
+ PosTexCoord0Vertex::init();
+
+ // Create program from shaders.
+ m_terrainProgram = loadProgram("vs_terrain", "fs_terrain");
+ m_terrainHeightTextureProgram = loadProgram("vs_terrain_height_texture", "fs_terrain");
+
+ // Imgui.
+ imguiCreate();
+
+ m_timeOffset = bx::getHPCounter();
+ const bgfx::RendererType::Enum renderer = bgfx::getRendererType();
+ s_texelHalf = bgfx::RendererType::Direct3D9 == renderer ? 0.5f : 0.0f;
+ s_originBottomLeft = bgfx::RendererType::OpenGL == renderer || bgfx::RendererType::OpenGLES == renderer;
+
+ m_vbh.idx = bgfx::invalidHandle;
+ m_ibh.idx = bgfx::invalidHandle;
+ m_dvbh.idx = bgfx::invalidHandle;
+ m_dibh.idx = bgfx::invalidHandle;
+ m_heightTexture.idx = bgfx::invalidHandle;
+ s_heightTexture = bgfx::createUniform("s_heightTexture", bgfx::UniformType::Int1);
+
+ m_oldWidth = 0;
+ m_oldHeight = 0;
+ m_oldReset = m_reset;
+
+ m_scrollArea = 0;
+
+ m_brush.m_power = 0.5f;
+ m_brush.m_size = 10;
+ m_brush.m_raise = true;
+
+ uint32_t num = s_terrainSize * s_terrainSize;
+
+ m_terrain.m_mode = 0;
+ m_terrain.m_dirty = true;
+ m_terrain.m_vertices = (PosTexCoord0Vertex*)BX_ALLOC(entry::getAllocator(), num * sizeof(PosTexCoord0Vertex) );
+ m_terrain.m_indices = (uint16_t*)BX_ALLOC(entry::getAllocator(), num * sizeof(uint16_t) * 6);
+ m_terrain.m_heightMap = (uint8_t*)BX_ALLOC(entry::getAllocator(), num);
+
+ bx::mtxSRT(m_terrain.m_transform, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+ memset(m_terrain.m_heightMap, 0, sizeof(uint8_t) * s_terrainSize * s_terrainSize);
+
+ cameraCreate();
+
+ const float initialPos[3] = { s_terrainSize/2.0f, 100.0f, 0.0f };
+ cameraSetPosition(initialPos);
+ cameraSetVerticalAngle(-bx::pi/4.0f);
+ }
+
+ virtual int shutdown() BX_OVERRIDE
+ {
+ // Cleanup.
+ cameraDestroy();
+ imguiDestroy();
+
+ if (bgfx::isValid(m_ibh) )
+ {
+ bgfx::destroyIndexBuffer(m_ibh);
+ }
+
+ if (bgfx::isValid(m_vbh) )
+ {
+ bgfx::destroyVertexBuffer(m_vbh);
+ }
+
+ if (bgfx::isValid(m_dibh) )
+ {
+ bgfx::destroyDynamicIndexBuffer(m_dibh);
+ }
+
+ if (bgfx::isValid(m_dvbh) )
+ {
+ bgfx::destroyDynamicVertexBuffer(m_dvbh);
+ }
+
+ bgfx::destroyUniform(s_heightTexture);
+
+ if (bgfx::isValid(m_heightTexture) )
+ {
+ bgfx::destroyTexture(m_heightTexture);
+ }
+
+ bgfx::destroyProgram(m_terrainProgram);
+ bgfx::destroyProgram(m_terrainHeightTextureProgram);
+
+ BX_FREE(entry::getAllocator(), m_terrain.m_vertices);
+ BX_FREE(entry::getAllocator(), m_terrain.m_indices);
+ BX_FREE(entry::getAllocator(), m_terrain.m_heightMap);
+
+ // Shutdown bgfx.
+ bgfx::shutdown();
+
+ return 0;
+ }
+
+ void updateTerrainMesh()
+ {
+ m_terrain.m_vertexCount = 0;
+ for (uint32_t y = 0; y < s_terrainSize; y++)
+ {
+ for (uint32_t x = 0; x < s_terrainSize; x++)
+ {
+ PosTexCoord0Vertex* vert = &m_terrain.m_vertices[m_terrain.m_vertexCount];
+ vert->m_x = (float)x;
+ vert->m_y = m_terrain.m_heightMap[(y * s_terrainSize) + x];
+ vert->m_z = (float)y;
+ vert->m_u = (float)x / (float)s_terrainSize;
+ vert->m_v = (float)y / (float)s_terrainSize;
+
+ m_terrain.m_vertexCount++;
+ }
+ }
+
+ m_terrain.m_indexCount = 0;
+ for (uint32_t y = 0; y < (s_terrainSize - 1); y++)
+ {
+ uint32_t y_offset = (y * s_terrainSize);
+ for (uint32_t x = 0; x < (s_terrainSize - 1); x++)
+ {
+ m_terrain.m_indices[m_terrain.m_indexCount + 0] = y_offset + x + 1;
+ m_terrain.m_indices[m_terrain.m_indexCount + 1] = y_offset + x + s_terrainSize;
+ m_terrain.m_indices[m_terrain.m_indexCount + 2] = y_offset + x;
+ m_terrain.m_indices[m_terrain.m_indexCount + 3] = y_offset + x + s_terrainSize + 1;
+ m_terrain.m_indices[m_terrain.m_indexCount + 4] = y_offset + x + s_terrainSize;
+ m_terrain.m_indices[m_terrain.m_indexCount + 5] = y_offset + x + 1;
+
+ m_terrain.m_indexCount += 6;
+ }
+ }
+ }
+
+ void updateTerrain()
+ {
+ const bgfx::Memory* mem;
+
+ switch (m_terrain.m_mode)
+ {
+ default: // Vertex Buffer : Destroy and recreate a regular vertex buffer to update terrain.
+ updateTerrainMesh();
+
+ if (bgfx::isValid(m_vbh) )
+ {
+ bgfx::destroyVertexBuffer(m_vbh);
+ }
+
+ mem = bgfx::makeRef(&m_terrain.m_vertices[0], sizeof(PosTexCoord0Vertex) * m_terrain.m_vertexCount);
+ m_vbh = bgfx::createVertexBuffer(mem, PosTexCoord0Vertex::ms_decl);
+ if (bgfx::isValid(m_ibh) )
+ {
+ bgfx::destroyIndexBuffer(m_ibh);
+ }
+
+ mem = bgfx::makeRef(&m_terrain.m_indices[0], sizeof(uint16_t) * m_terrain.m_indexCount);
+ m_ibh = bgfx::createIndexBuffer(mem);
+ break;
+
+ case 1: // Dynamic Vertex Buffer : Utilize dynamic vertex buffer to update terrain.
+ updateTerrainMesh();
+
+ if (!bgfx::isValid(m_dvbh) )
+ {
+ m_dvbh = bgfx::createDynamicVertexBuffer(m_terrain.m_vertexCount, PosTexCoord0Vertex::ms_decl);
+ }
+
+ mem = bgfx::makeRef(&m_terrain.m_vertices[0], sizeof(PosTexCoord0Vertex) * m_terrain.m_vertexCount);
+ bgfx::updateDynamicVertexBuffer(m_dvbh, 0, mem);
+
+ if (!bgfx::isValid(m_dibh) )
+ {
+ m_dibh = bgfx::createDynamicIndexBuffer(m_terrain.m_indexCount);
+ }
+
+ mem = bgfx::makeRef(&m_terrain.m_indices[0], sizeof(uint16_t) * m_terrain.m_indexCount);
+ bgfx::updateDynamicIndexBuffer(m_dibh, 0, mem);
+ break;
+
+ case 2: // Height Texture: Update a height texture that is sampled in the terrain vertex shader.
+ if (!bgfx::isValid(m_vbh) || !bgfx::isValid(m_ibh) )
+ {
+ updateTerrainMesh();
+
+ mem = bgfx::makeRef(&m_terrain.m_vertices[0], sizeof(PosTexCoord0Vertex) * m_terrain.m_vertexCount);
+ m_vbh = bgfx::createVertexBuffer(mem, PosTexCoord0Vertex::ms_decl);
+
+ mem = bgfx::makeRef(&m_terrain.m_indices[0], sizeof(uint16_t) * m_terrain.m_indexCount);
+ m_ibh = bgfx::createIndexBuffer(mem);
+ }
+
+ if (!bgfx::isValid(m_heightTexture) )
+ {
+ m_heightTexture = bgfx::createTexture2D(s_terrainSize, s_terrainSize, 1, bgfx::TextureFormat::R8);
+ }
+
+ mem = bgfx::makeRef(&m_terrain.m_heightMap[0], sizeof(uint8_t) * s_terrainSize * s_terrainSize);
+ bgfx::updateTexture2D(m_heightTexture, 0, 0, 0, s_terrainSize, s_terrainSize, mem);
+ break;
+ }
+ }
+
+ void paintTerrainHeight(uint32_t _x, uint32_t _y)
+ {
+ for (int32_t area_y = -m_brush.m_size; area_y < m_brush.m_size; ++area_y)
+ {
+ for (int32_t area_x = -m_brush.m_size; area_x < m_brush.m_size; ++area_x)
+ {
+ int32_t brush_x = _x + area_x;
+ if (brush_x < 0
+ || brush_x > (int32_t)s_terrainSize)
+ {
+ continue;
+ }
+
+ int32_t brush_y = _y + area_y;
+ if (brush_y < 0
+ || brush_y > (int32_t)s_terrainSize)
+ {
+ continue;
+ }
+
+ uint32_t heightMapPos = (brush_y * s_terrainSize) + brush_x;
+ float height = (float)m_terrain.m_heightMap[heightMapPos];
+
+ // Brush attenuation
+ float a2 = (float)(area_x * area_x);
+ float b2 = (float)(area_y * area_y);
+ float brushAttn = m_brush.m_size - bx::fsqrt(a2 + b2);
+
+ // Raise/Lower and scale by brush power.
+ height += (bx::fclamp(brushAttn * m_brush.m_power, 0.0, m_brush.m_power) * m_brush.m_raise)
+ ? 1.0
+ : -1.0
+ ;
+
+ m_terrain.m_heightMap[heightMapPos] = (uint8_t)bx::fclamp(height, 0.0, 255.0);
+ m_terrain.m_dirty = true;
+ }
+ }
+ }
+
+ void mousePickTerrain()
+ {
+ float ray_clip[4];
+ ray_clip[0] = ( (2.0f * m_mouseState.m_mx) / m_width - 1.0f) * -1.0f;
+ ray_clip[1] = ( (1.0f - (2.0f * m_mouseState.m_my) / m_height) ) * -1.0f;
+ ray_clip[2] = -1.0;
+ ray_clip[3] = 1.0;
+
+ float invProjMtx[16];
+ bx::mtxInverse(invProjMtx, m_projMtx);
+
+ float ray_eye[4];
+ bx::vec4MulMtx(ray_eye, ray_clip, invProjMtx);
+ ray_eye[2] = -1.0f;
+ ray_eye[3] = 0.0f;
+
+ float invViewMtx[16];
+ bx::mtxInverse(invViewMtx, m_viewMtx);
+
+ float ray_world[4];
+ bx::vec4MulMtx(ray_world, ray_eye, invViewMtx);
+
+ float ray_dir[3];
+ bx::vec3Norm(ray_dir, ray_world);
+ ray_dir[0] *= -1.0;
+ ray_dir[1] *= -1.0;
+ ray_dir[2] *= -1.0;
+
+ float pos[3];
+ cameraGetPosition(pos);
+ for (int i = 0; i < 1000; ++i)
+ {
+ bx::vec3Add(pos, pos, ray_dir);
+
+ if (pos[0] < 0
+ || pos[0] > s_terrainSize
+ || pos[2] < 0
+ || pos[2] > s_terrainSize)
+ {
+ continue;
+ }
+
+ uint32_t heightMapPos = ( (uint32_t)pos[2] * s_terrainSize) + (uint32_t)pos[0];
+ if ( pos[1] < m_terrain.m_heightMap[heightMapPos] )
+ {
+ paintTerrainHeight( (uint32_t)pos[0], (uint32_t)pos[2]);
+ return;
+ }
+ }
+ }
+
+ bool update() BX_OVERRIDE
+ {
+ if (!entry::processEvents(m_width, m_height, m_debug, m_reset, &m_mouseState) )
+ {
+ int64_t now = bx::getHPCounter();
+ static int64_t last = now;
+ const int64_t frameTime = now - last;
+ last = now;
+ const double freq = double(bx::getHPFrequency() );
+ const double toMs = 1000.0/freq;
+ const float deltaTime = float(frameTime/freq);
+
+ // Use m_debug font to print information about this example.
+ bgfx::dbgTextClear();
+ bgfx::dbgTextPrintf(0, 1, 0x4f, "bgfx/examples/27-terrain");
+ bgfx::dbgTextPrintf(0, 2, 0x6f, "Description: Terrain painting example.");
+ bgfx::dbgTextPrintf(0, 3, 0x0f, "Frame: % 7.3f[ms]", double(frameTime)*toMs);
+
+ imguiBeginFrame(m_mouseState.m_mx
+ , m_mouseState.m_my
+ , (m_mouseState.m_buttons[entry::MouseButton::Left ] ? IMGUI_MBUT_LEFT : 0)
+ | (m_mouseState.m_buttons[entry::MouseButton::Right ] ? IMGUI_MBUT_RIGHT : 0)
+ | (m_mouseState.m_buttons[entry::MouseButton::Middle] ? IMGUI_MBUT_MIDDLE : 0)
+ , m_mouseState.m_mz
+ , m_width
+ , m_height
+ );
+
+ imguiBeginScrollArea("Settings", m_width - m_width / 5 - 10, 10, m_width / 5, m_height / 3, &m_scrollArea);
+ imguiSeparatorLine();
+
+ if (imguiCheck("Vertex Buffer", (m_terrain.m_mode == 0) ) )
+ {
+ m_terrain.m_mode = 0;
+ m_terrain.m_dirty = true;
+ }
+
+ if (imguiCheck("Dynamic Vertex Buffer", (m_terrain.m_mode == 1) ) )
+ {
+ m_terrain.m_mode = 1;
+ m_terrain.m_dirty = true;
+ }
+
+ if (imguiCheck("Height Texture", (m_terrain.m_mode == 2) ) )
+ {
+ m_terrain.m_mode = 2;
+ m_terrain.m_dirty = true;
+ }
+
+ imguiSeparatorLine();
+
+ if (imguiCheck("Raise Terrain", m_brush.m_raise) )
+ {
+ m_brush.m_raise = !m_brush.m_raise;
+ }
+
+ imguiSlider("Brush Size", m_brush.m_size, 1, 50);
+ imguiSlider("Brush Power", m_brush.m_power, 0.0f, 1.0f, 0.01f);
+
+ imguiEndScrollArea();
+ imguiEndFrame();
+
+ // Update camera.
+ cameraUpdate(deltaTime, m_mouseState);
+
+ bool leftMouseButtonDown = !!m_mouseState.m_buttons[entry::MouseButton::Left];
+ if (leftMouseButtonDown)
+ {
+ mousePickTerrain();
+ }
+
+ // Update terrain.
+ if (m_terrain.m_dirty)
+ {
+ updateTerrain();
+ m_terrain.m_dirty = false;
+ }
+
+ // Set view 0 default viewport.
+ bgfx::setViewRect(0, 0, 0, m_width, m_height);
+
+ cameraGetViewMtx(m_viewMtx);
+ bx::mtxProj(m_projMtx, 60.0f, float(m_width) / float(m_height), 0.1f, 2000.0f, s_originBottomLeft);
+
+ bgfx::setViewTransform(0, m_viewMtx, m_projMtx);
+ bgfx::setTransform(m_terrain.m_transform);
+
+ switch (m_terrain.m_mode)
+ {
+ default:
+ bgfx::setVertexBuffer(m_vbh);
+ bgfx::setIndexBuffer(m_ibh);
+ bgfx::submit(0, m_terrainProgram);
+ break;
+
+ case 1:
+ bgfx::setVertexBuffer(m_dvbh);
+ bgfx::setIndexBuffer(m_dibh);
+ bgfx::submit(0, m_terrainProgram);
+ break;
+
+ case 2:
+ bgfx::setVertexBuffer(m_vbh);
+ bgfx::setIndexBuffer(m_ibh);
+ bgfx::setTexture(0, s_heightTexture, m_heightTexture);
+ bgfx::submit(0, m_terrainHeightTextureProgram);
+ break;
+ }
+
+ // Advance to next frame. Rendering thread will be kicked to
+ // process submitted rendering primitives.
+ bgfx::frame();
+
+ return true;
+ }
+
+ return false;
+ }
+
+ bgfx::VertexBufferHandle m_vbh;
+ bgfx::IndexBufferHandle m_ibh;
+ bgfx::DynamicVertexBufferHandle m_dvbh;
+ bgfx::DynamicIndexBufferHandle m_dibh;
+ bgfx::ProgramHandle m_terrainProgram;
+ bgfx::ProgramHandle m_terrainHeightTextureProgram;
+ bgfx::UniformHandle s_heightTexture;
+ bgfx::TextureHandle m_heightTexture;
+
+ float m_viewMtx[16];
+ float m_projMtx[16];
+
+ uint32_t m_width;
+ uint32_t m_height;
+ uint32_t m_debug;
+ uint32_t m_reset;
+
+ uint32_t m_oldWidth;
+ uint32_t m_oldHeight;
+ uint32_t m_oldReset;
+
+ int32_t m_scrollArea;
+
+ TerrainData m_terrain;
+ BrushData m_brush;
+
+ entry::MouseState m_mouseState;
+
+ int64_t m_timeOffset;
+};
+
+ENTRY_IMPLEMENT_MAIN(Terrain);
diff --git a/3rdparty/bgfx/examples/27-terrain/varying.def.sc b/3rdparty/bgfx/examples/27-terrain/varying.def.sc
new file mode 100644
index 00000000000..741df32452c
--- /dev/null
+++ b/3rdparty/bgfx/examples/27-terrain/varying.def.sc
@@ -0,0 +1,13 @@
+vec2 v_texcoord0 : TEXCOORD0 = vec2(0.0, 0.0);
+vec3 v_position : TEXCOORD1 = vec3(0.0, 0.0, 0.0);
+vec3 v_view : TEXCOORD2 = vec3(0.0, 0.0, 0.0);
+vec3 v_normal : NORMAL = vec3(0.0, 0.0, 1.0);
+vec3 v_tangent : TANGENT = vec3(1.0, 0.0, 0.0);
+vec3 v_bitangent : BINORMAL = vec3(0.0, 1.0, 0.0);
+vec4 v_color0 : COLOR = vec4(1.0, 0.0, 0.0, 1.0);
+
+vec3 a_position : POSITION;
+vec4 a_normal : NORMAL;
+vec4 a_tangent : TANGENT;
+vec2 a_texcoord0 : TEXCOORD0;
+vec4 a_color0 : COLOR0;
diff --git a/3rdparty/bgfx/examples/27-terrain/vs_terrain.sc b/3rdparty/bgfx/examples/27-terrain/vs_terrain.sc
new file mode 100644
index 00000000000..4cea23e2d30
--- /dev/null
+++ b/3rdparty/bgfx/examples/27-terrain/vs_terrain.sc
@@ -0,0 +1,17 @@
+$input a_position, a_texcoord0
+$output v_position, v_texcoord0
+
+/*
+ * Copyright 2015 Andrew Mac. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
+ */
+
+#include "../common/common.sh"
+
+void main()
+{
+ v_position = a_position.xyz;
+ v_texcoord0 = a_texcoord0;
+
+ gl_Position = mul(u_modelViewProj, vec4(v_position.xyz, 1.0));
+}
diff --git a/3rdparty/bgfx/examples/27-terrain/vs_terrain_height_texture.sc b/3rdparty/bgfx/examples/27-terrain/vs_terrain_height_texture.sc
new file mode 100644
index 00000000000..f3451aa0328
--- /dev/null
+++ b/3rdparty/bgfx/examples/27-terrain/vs_terrain_height_texture.sc
@@ -0,0 +1,20 @@
+$input a_position, a_texcoord0
+$output v_position, v_texcoord0
+
+/*
+ * Copyright 2015 Andrew Mac. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
+ */
+
+#include "../common/common.sh"
+
+SAMPLER2D(s_heightTexture, 0);
+
+void main()
+{
+ v_texcoord0 = a_texcoord0;
+ v_position = a_position.xyz;
+ v_position.y = texture2DLod(s_heightTexture, a_texcoord0, 0).x * 255.0;
+
+ gl_Position = mul(u_modelViewProj, vec4(v_position.xyz, 1.0));
+}
diff --git a/3rdparty/bgfx/examples/assets/meshes/makefile b/3rdparty/bgfx/examples/assets/meshes/makefile
index b2ede3a4387..f8b0ee890af 100644
--- a/3rdparty/bgfx/examples/assets/meshes/makefile
+++ b/3rdparty/bgfx/examples/assets/meshes/makefile
@@ -16,6 +16,7 @@ GEOMETRY_SRC= \
column \
cube \
hollowcube \
+ orb \
platform \
tree \
tree1b_lod0_1 \
@@ -36,4 +37,4 @@ clean:
rebuild: clean all
$(RUNTIME_DIR)/meshes/%.bin : %.obj
- $(SILENT) $(GEOMETRYC) -f $(<) -o $(@) --packnormal 1
+ $(SILENT) $(GEOMETRYC) -f $(<) -o $(@) --packnormal 1 \ No newline at end of file
diff --git a/3rdparty/bgfx/examples/assets/meshes/orb.obj b/3rdparty/bgfx/examples/assets/meshes/orb.obj
new file mode 100644
index 00000000000..1cc0535e427
--- /dev/null
+++ b/3rdparty/bgfx/examples/assets/meshes/orb.obj
@@ -0,0 +1,161081 @@
+# Blender v2.72 (sub 0) OBJ File: 'TestObjPoly.blend'
+# www.blender.org
+mtllib TestObjPoly.mtl
+o mesh_lighttransportequation-orb
+v -0.125063 0.095391 0.764386
+v -0.094006 0.095391 0.769167
+v -0.124991 0.097928 0.763980
+v -0.155882 0.095391 0.758257
+v -0.125086 0.090035 0.764521
+v -0.094024 0.090035 0.769303
+v -0.093952 0.097928 0.768758
+v -0.155792 0.097928 0.757854
+v -0.155911 0.090035 0.758391
+v -0.246325 0.095391 0.731894
+v -0.216571 0.095391 0.741995
+v -0.246184 0.097928 0.731506
+v -0.275612 0.095391 0.720506
+v -0.246372 0.090035 0.732023
+v -0.216612 0.090035 0.742126
+v -0.216447 0.097928 0.741602
+v -0.275454 0.097928 0.720125
+v -0.275665 0.090035 0.720633
+v -0.360104 0.095391 0.678838
+v -0.332555 0.095391 0.693953
+v -0.359897 0.097928 0.678481
+v -0.386968 0.095391 0.662538
+v -0.360173 0.090035 0.678957
+v -0.332619 0.090035 0.694075
+v -0.332365 0.097928 0.693587
+v -0.386746 0.097928 0.662190
+v -0.387042 0.090035 0.662654
+v -0.462941 0.095391 0.606831
+v -0.438435 0.095391 0.626500
+v -0.462675 0.097928 0.606515
+v -0.486566 0.095391 0.586114
+v -0.463029 0.090035 0.606937
+v -0.438519 0.090035 0.626609
+v -0.438184 0.097928 0.626173
+v -0.486287 0.097928 0.585809
+v -0.486659 0.090035 0.586215
+v -0.551711 0.095391 0.518061
+v -0.530994 0.095391 0.541686
+v -0.551395 0.097928 0.517795
+v -0.571380 0.095391 0.493555
+v -0.551817 0.090035 0.518149
+v -0.531095 0.090035 0.541779
+v -0.530689 0.097928 0.541407
+v -0.571053 0.097928 0.493304
+v -0.571489 0.090035 0.493639
+v -0.623718 0.095391 0.415224
+v -0.607418 0.095391 0.442088
+v -0.623361 0.097928 0.415017
+v -0.638833 0.095391 0.387675
+v -0.623837 0.090035 0.415293
+v -0.607534 0.090035 0.442162
+v -0.607070 0.097928 0.441866
+v -0.638467 0.097928 0.387485
+v -0.638955 0.090035 0.387739
+v -0.676774 0.095390 0.301445
+v -0.665386 0.095390 0.330732
+v -0.676386 0.097928 0.301304
+v -0.686876 0.095390 0.271691
+v -0.676903 0.090035 0.301492
+v -0.665513 0.090035 0.330785
+v -0.665005 0.097928 0.330574
+v -0.686482 0.097928 0.271567
+v -0.687007 0.090035 0.271732
+v -0.709267 0.095390 0.180183
+v -0.703137 0.095390 0.211002
+v -0.708860 0.097928 0.180111
+v -0.714048 0.095390 0.149126
+v -0.709402 0.090035 0.180206
+v -0.703272 0.090035 0.211031
+v -0.702734 0.097928 0.210912
+v -0.713639 0.097928 0.149072
+v -0.714184 0.090035 0.149144
+v -0.720208 0.095390 0.055120
+v -0.719524 0.095390 0.086535
+v -0.719796 0.097928 0.055120
+v -0.719524 0.095390 0.023705
+v -0.720346 0.090035 0.055120
+v -0.719661 0.090035 0.086541
+v -0.719112 0.097928 0.086517
+v -0.719112 0.097928 0.023723
+v -0.719661 0.090035 0.023699
+v -0.709267 0.095390 -0.069943
+v -0.714048 0.095390 -0.038886
+v -0.708860 0.097928 -0.069871
+v -0.703137 0.095390 -0.100762
+v -0.709402 0.090035 -0.069967
+v -0.714184 0.090035 -0.038904
+v -0.713639 0.097928 -0.038832
+v -0.702735 0.097928 -0.100673
+v -0.703272 0.090035 -0.100792
+v -0.676774 0.095390 -0.191206
+v -0.686876 0.095390 -0.161451
+v -0.676387 0.097928 -0.191065
+v -0.665387 0.095390 -0.220493
+v -0.676904 0.090035 -0.191253
+v -0.687007 0.090035 -0.161493
+v -0.686482 0.097928 -0.161327
+v -0.665005 0.097928 -0.220335
+v -0.665514 0.090035 -0.220545
+v -0.623751 0.095390 -0.304946
+v -0.638834 0.095390 -0.277436
+v -0.623394 0.097928 -0.304739
+v -0.607549 0.095390 -0.331693
+v -0.623871 0.090035 -0.305014
+v -0.638956 0.090035 -0.277499
+v -0.638468 0.097928 -0.277245
+v -0.607201 0.097928 -0.331472
+v -0.607665 0.090035 -0.331767
+v -0.513882 0.095381 -0.453762
+v -0.518068 0.095390 -0.448982
+v -0.513605 0.097892 -0.453467
+v -0.511981 0.095354 -0.455403
+v -0.513974 0.090035 -0.453860
+v -0.518167 0.090035 -0.449078
+v -0.517771 0.097928 -0.448693
+v -0.511757 0.097782 -0.455098
+v -0.512055 0.090035 -0.455505
+v -0.123773 0.099716 0.757073
+v -0.093037 0.099716 0.761804
+v -0.121839 0.099810 0.746104
+v -0.154274 0.099716 0.751006
+v -0.124609 0.099434 0.761812
+v -0.093665 0.099434 0.766576
+v -0.091583 0.099810 0.750762
+v -0.151864 0.099810 0.740132
+v -0.155316 0.099434 0.755705
+v -0.243785 0.099716 0.724915
+v -0.214337 0.099716 0.734913
+v -0.239976 0.099810 0.714449
+v -0.272770 0.099716 0.713645
+v -0.245432 0.099434 0.729438
+v -0.215785 0.099434 0.739503
+v -0.210988 0.099810 0.724290
+v -0.268508 0.099810 0.703355
+v -0.274612 0.099434 0.718092
+v -0.356391 0.099716 0.672407
+v -0.329126 0.099716 0.687366
+v -0.350822 0.099810 0.662761
+v -0.382978 0.099716 0.656274
+v -0.358797 0.099434 0.676575
+v -0.331348 0.099434 0.691635
+v -0.323983 0.099810 0.677486
+v -0.376993 0.099810 0.646881
+v -0.385564 0.099434 0.660334
+v -0.458167 0.099716 0.601142
+v -0.433914 0.099716 0.620608
+v -0.451008 0.099810 0.592610
+v -0.481549 0.099716 0.580638
+v -0.461261 0.099434 0.604829
+v -0.436844 0.099434 0.624427
+v -0.427134 0.099810 0.611772
+v -0.474024 0.099810 0.572426
+v -0.484801 0.099434 0.584187
+v -0.546022 0.099716 0.513287
+v -0.525518 0.099716 0.536669
+v -0.537490 0.099810 0.506128
+v -0.565488 0.099716 0.489034
+v -0.549709 0.099434 0.516381
+v -0.529067 0.099434 0.539921
+v -0.517306 0.099810 0.529144
+v -0.556652 0.099810 0.482254
+v -0.569307 0.099434 0.491964
+v -0.617287 0.099716 0.411511
+v -0.601155 0.099716 0.438098
+v -0.607641 0.099810 0.405942
+v -0.632246 0.099716 0.384246
+v -0.621455 0.099434 0.413917
+v -0.605214 0.099434 0.440684
+v -0.591761 0.099810 0.432113
+v -0.622366 0.099810 0.379103
+v -0.636515 0.099434 0.386468
+v -0.669796 0.099716 0.298905
+v -0.658525 0.099716 0.327890
+v -0.659329 0.099810 0.295096
+v -0.679793 0.099716 0.269458
+v -0.674319 0.099434 0.300552
+v -0.662972 0.099434 0.329732
+v -0.648235 0.099810 0.323628
+v -0.669171 0.099810 0.266108
+v -0.684383 0.099434 0.270905
+v -0.701953 0.099716 0.178893
+v -0.695887 0.099716 0.209394
+v -0.690984 0.099810 0.176959
+v -0.706685 0.099716 0.148156
+v -0.706693 0.099434 0.179729
+v -0.700586 0.099434 0.210436
+v -0.685013 0.099810 0.206984
+v -0.695642 0.099810 0.146703
+v -0.711457 0.099434 0.148785
+v -0.712782 0.099716 0.055120
+v -0.712105 0.099716 0.086211
+v -0.701644 0.099810 0.055120
+v -0.712105 0.099716 0.024028
+v -0.717595 0.099434 0.055120
+v -0.716913 0.099434 0.086421
+v -0.700977 0.099810 0.085725
+v -0.700977 0.099810 0.024514
+v -0.716913 0.099434 0.023819
+v -0.701953 0.099716 -0.068654
+v -0.706685 0.099716 -0.037917
+v -0.690984 0.099810 -0.066719
+v -0.695887 0.099716 -0.099155
+v -0.706693 0.099434 -0.069489
+v -0.711457 0.099434 -0.038545
+v -0.695642 0.099810 -0.036463
+v -0.685013 0.099810 -0.096744
+v -0.700586 0.099434 -0.100197
+v -0.669796 0.099716 -0.188666
+v -0.679793 0.099716 -0.159218
+v -0.659330 0.099810 -0.184857
+v -0.658526 0.099716 -0.217651
+v -0.674319 0.099434 -0.190312
+v -0.684384 0.099434 -0.160665
+v -0.669171 0.099810 -0.155869
+v -0.648235 0.099810 -0.213388
+v -0.662972 0.099434 -0.219493
+v -0.617320 0.099716 -0.301233
+v -0.632246 0.099716 -0.274007
+v -0.607673 0.099810 -0.295664
+v -0.601284 0.099716 -0.327705
+v -0.621488 0.099434 -0.303639
+v -0.636516 0.099434 -0.276229
+v -0.622367 0.099810 -0.268864
+v -0.591888 0.099810 -0.321723
+v -0.605344 0.099434 -0.330290
+v -0.508667 0.099624 -0.448599
+v -0.512726 0.099716 -0.443784
+v -0.500725 0.099716 -0.440741
+v -0.507039 0.099350 -0.450477
+v -0.512083 0.099350 -0.451961
+v -0.516188 0.099434 -0.447152
+v -0.504714 0.099810 -0.435988
+v -0.499141 0.099434 -0.442629
+v -0.510387 0.099099 -0.453732
+v -0.506474 0.095381 -0.451214
+v -0.506539 0.097892 -0.451073
+v -0.498538 0.095390 -0.443348
+v -0.506452 0.090035 -0.451261
+v -0.509960 0.095354 -0.454491
+v -0.509933 0.097782 -0.454274
+v -0.498633 0.097928 -0.443235
+v -0.498506 0.090035 -0.443386
+v -0.509969 0.090035 -0.454564
+v -0.433558 0.095469 -0.378380
+v -0.433349 0.098244 -0.377997
+v -0.405881 0.095706 -0.350714
+v -0.433628 0.090035 -0.378508
+v -0.461021 0.095390 -0.405837
+v -0.461109 0.097928 -0.405732
+v -0.404790 0.099193 -0.349482
+v -0.406244 0.090035 -0.351125
+v -0.460992 0.090035 -0.405872
+v -0.435556 0.100613 -0.376206
+v -0.439137 0.100745 -0.372179
+v -0.408042 0.103304 -0.348964
+v -0.433845 0.100217 -0.377523
+v -0.463044 0.099716 -0.403426
+v -0.466733 0.099810 -0.399030
+v -0.411739 0.103550 -0.345520
+v -0.405421 0.102568 -0.349203
+v -0.461579 0.099434 -0.405172
+v -0.528719 0.100745 -0.250088
+v -0.541504 0.100745 -0.226769
+v -0.495733 0.103550 -0.231046
+v -0.514985 0.100745 -0.272760
+v -0.561944 0.099810 -0.269267
+v -0.575532 0.099810 -0.244483
+v -0.507719 0.103550 -0.209182
+v -0.482856 0.103550 -0.252304
+v -0.547347 0.099810 -0.293364
+v -0.573664 0.100745 -0.153677
+v -0.582226 0.100745 -0.128455
+v -0.537873 0.103550 -0.140650
+v -0.564011 0.100745 -0.178502
+v -0.609713 0.099810 -0.166798
+v -0.618814 0.099810 -0.139991
+v -0.545901 0.103550 -0.117002
+v -0.528823 0.103550 -0.163926
+v -0.599454 0.099810 -0.193182
+v -0.601206 0.100745 -0.050889
+v -0.605258 0.100745 -0.024564
+v -0.563697 0.103550 -0.044275
+v -0.596010 0.100745 -0.077013
+v -0.638986 0.099810 -0.057551
+v -0.643293 0.099810 -0.029571
+v -0.567497 0.103550 -0.019593
+v -0.558825 0.103550 -0.068769
+v -0.633464 0.099810 -0.085316
+v -0.610480 0.100745 0.055120
+v -0.609900 0.100745 0.081749
+v -0.572393 0.103550 0.055120
+v -0.609900 0.100745 0.028491
+v -0.648843 0.099810 0.055120
+v -0.648226 0.099810 0.083422
+v -0.571849 0.103550 0.080087
+v -0.571849 0.103550 0.030152
+v -0.648226 0.099810 0.026817
+v -0.601206 0.100745 0.161129
+v -0.596010 0.100745 0.187252
+v -0.563697 0.103550 0.154515
+v -0.605258 0.100745 0.134803
+v -0.638986 0.099810 0.167790
+v -0.633464 0.099810 0.195555
+v -0.558825 0.103550 0.179008
+v -0.567497 0.103550 0.129832
+v -0.643293 0.099810 0.139811
+v -0.573664 0.100745 0.263916
+v -0.564011 0.100745 0.288741
+v -0.537873 0.103550 0.250889
+v -0.582226 0.100745 0.238695
+v -0.609713 0.099810 0.277037
+v -0.599454 0.099810 0.303422
+v -0.528822 0.103550 0.274165
+v -0.545901 0.103550 0.227242
+v -0.618814 0.099810 0.250231
+v -0.528691 0.100745 0.360360
+v -0.514874 0.100745 0.383131
+v -0.495706 0.103550 0.341316
+v -0.541503 0.100745 0.337008
+v -0.561914 0.099810 0.379541
+v -0.547229 0.099810 0.403743
+v -0.482752 0.103550 0.362667
+v -0.507719 0.103550 0.319421
+v -0.575531 0.099810 0.354722
+v -0.467655 0.100745 0.447529
+v -0.450094 0.100745 0.467555
+v -0.438478 0.103550 0.423047
+v -0.484327 0.100745 0.426757
+v -0.497042 0.099810 0.472188
+v -0.478378 0.099810 0.493472
+v -0.422012 0.103550 0.441823
+v -0.454110 0.103550 0.403571
+v -0.514762 0.099810 0.450111
+v -0.392409 0.100745 0.522775
+v -0.371637 0.100745 0.539447
+v -0.367927 0.103550 0.493598
+v -0.412435 0.100745 0.505213
+v -0.417068 0.099810 0.552162
+v -0.394991 0.099810 0.569882
+v -0.348451 0.103550 0.509230
+v -0.386703 0.103550 0.477132
+v -0.438352 0.099810 0.533498
+v -0.305240 0.100745 0.583811
+v -0.281888 0.100745 0.596623
+v -0.286196 0.103550 0.550826
+v -0.328011 0.100745 0.569994
+v -0.324421 0.099810 0.617034
+v -0.299602 0.099810 0.630651
+v -0.264301 0.103550 0.562839
+v -0.307547 0.103550 0.537871
+v -0.348623 0.099810 0.602349
+v -0.208796 0.100745 0.628783
+v -0.183575 0.100745 0.637346
+v -0.195769 0.103550 0.592993
+v -0.233621 0.100745 0.619130
+v -0.221917 0.099810 0.664832
+v -0.195111 0.099810 0.673933
+v -0.172122 0.103550 0.601021
+v -0.219045 0.103550 0.583942
+v -0.248302 0.099810 0.654573
+v -0.106009 0.100745 0.656325
+v -0.079684 0.100745 0.660378
+v -0.099395 0.103550 0.618816
+v -0.132132 0.100745 0.651130
+v -0.112670 0.099810 0.694105
+v -0.084691 0.099810 0.698412
+v -0.074712 0.103550 0.622616
+v -0.123888 0.103550 0.613945
+v -0.140435 0.099810 0.688583
+v -0.359000 0.096288 -0.303876
+v -0.368194 0.096174 -0.313057
+v -0.358717 0.101517 -0.303581
+v -0.351225 0.096325 -0.296106
+v -0.359095 0.090035 -0.303975
+v -0.368571 0.090035 -0.313451
+v -0.367062 0.101063 -0.311874
+v -0.351225 0.101668 -0.296106
+v -0.351225 0.090035 -0.296106
+v -0.359807 0.287080 -0.302455
+v -0.360408 0.286839 -0.301584
+v -0.352452 0.283636 -0.295171
+v -0.359424 0.286976 -0.302963
+v -0.368730 0.292795 -0.310050
+v -0.368786 0.291761 -0.307782
+v -0.354252 0.283898 -0.294607
+v -0.351673 0.283364 -0.295572
+v -0.368527 0.292960 -0.311027
+v -0.436753 0.269442 -0.196999
+v -0.447314 0.269442 -0.177737
+v -0.435178 0.269865 -0.196090
+v -0.425408 0.269442 -0.215728
+v -0.438328 0.269865 -0.197909
+v -0.448927 0.269865 -0.178577
+v -0.445700 0.269865 -0.176897
+v -0.423874 0.269865 -0.214751
+v -0.426942 0.269865 -0.216705
+v -0.473880 0.269442 -0.117359
+v -0.480953 0.269442 -0.096524
+v -0.472171 0.269865 -0.116737
+v -0.465906 0.269442 -0.137865
+v -0.475589 0.269865 -0.117981
+v -0.482688 0.269865 -0.097071
+v -0.479218 0.269865 -0.095977
+v -0.464226 0.269865 -0.137169
+v -0.467587 0.269865 -0.138561
+v -0.496631 0.269442 -0.032450
+v -0.499979 0.269442 -0.010704
+v -0.494840 0.269865 -0.032134
+v -0.492339 0.269442 -0.054029
+v -0.498422 0.269865 -0.032766
+v -0.501782 0.269865 -0.010941
+v -0.498176 0.269865 -0.010466
+v -0.490564 0.269865 -0.053636
+v -0.494115 0.269865 -0.054423
+v -0.504292 0.269442 0.055120
+v -0.503813 0.269442 0.077117
+v -0.502474 0.269865 0.055120
+v -0.503813 0.269442 0.033123
+v -0.506111 0.269865 0.055120
+v -0.505630 0.269865 0.077196
+v -0.501996 0.269865 0.077037
+v -0.501996 0.269865 0.033202
+v -0.505630 0.269865 0.033043
+v -0.496631 0.269442 0.142689
+v -0.492339 0.269442 0.164269
+v -0.494840 0.269865 0.142373
+v -0.499979 0.269442 0.120943
+v -0.498422 0.269865 0.143005
+v -0.494115 0.269865 0.164662
+v -0.490564 0.269865 0.163875
+v -0.498176 0.269865 0.120706
+v -0.501782 0.269865 0.121180
+v -0.473880 0.269442 0.227598
+v -0.465906 0.269442 0.248104
+v -0.472171 0.269865 0.226976
+v -0.480953 0.269442 0.206763
+v -0.475589 0.269865 0.228220
+v -0.467586 0.269865 0.248800
+v -0.464226 0.269865 0.247408
+v -0.479218 0.269865 0.206217
+v -0.482687 0.269865 0.207310
+v -0.436730 0.269442 0.307266
+v -0.425316 0.269442 0.326076
+v -0.435155 0.269865 0.306356
+v -0.447313 0.269442 0.287976
+v -0.438305 0.269865 0.308175
+v -0.426850 0.269865 0.327053
+v -0.423782 0.269865 0.325099
+v -0.445700 0.269865 0.287136
+v -0.448927 0.269865 0.288816
+v -0.386310 0.269442 0.379273
+v -0.371804 0.269442 0.395815
+v -0.384917 0.269865 0.378103
+v -0.400083 0.269442 0.362114
+v -0.387704 0.269865 0.380442
+v -0.373145 0.269865 0.397044
+v -0.370463 0.269865 0.394586
+v -0.398640 0.269865 0.361007
+v -0.401526 0.269865 0.363221
+v -0.324153 0.269442 0.441430
+v -0.306994 0.269442 0.455202
+v -0.322984 0.269865 0.440037
+v -0.340695 0.269442 0.426923
+v -0.325322 0.269865 0.442823
+v -0.308101 0.269865 0.456645
+v -0.305887 0.269865 0.453759
+v -0.339467 0.269865 0.425582
+v -0.341924 0.269865 0.428264
+v -0.252146 0.269442 0.491850
+v -0.232856 0.269442 0.502433
+v -0.251237 0.269865 0.490274
+v -0.270956 0.269442 0.480436
+v -0.253055 0.269865 0.493425
+v -0.233696 0.269865 0.504046
+v -0.232017 0.269865 0.500820
+v -0.269979 0.269865 0.478902
+v -0.271934 0.269865 0.481970
+v -0.172478 0.269442 0.528999
+v -0.151643 0.269442 0.536072
+v -0.171856 0.269865 0.527290
+v -0.192984 0.269442 0.521026
+v -0.173100 0.269865 0.530708
+v -0.152190 0.269865 0.537807
+v -0.151097 0.269865 0.534338
+v -0.192288 0.269865 0.519345
+v -0.193680 0.269865 0.522706
+v -0.087569 0.269442 0.551750
+v -0.065823 0.269442 0.555098
+v -0.087253 0.269865 0.549959
+v -0.109149 0.269442 0.547459
+v -0.087885 0.269865 0.553542
+v -0.066061 0.269865 0.556901
+v -0.065586 0.269865 0.553295
+v -0.108755 0.269865 0.545683
+v -0.109542 0.269865 0.549234
+v -0.062568 0.095391 0.409963
+v -0.047031 0.095391 0.412355
+v -0.062543 0.090035 0.409820
+v -0.077987 0.095391 0.406896
+v -0.062644 0.097928 0.410390
+v -0.047087 0.097928 0.412785
+v -0.047012 0.090035 0.412211
+v -0.077956 0.090035 0.406755
+v -0.078081 0.097928 0.407320
+v -0.123236 0.095391 0.393707
+v -0.108349 0.095391 0.398761
+v -0.123186 0.090035 0.393571
+v -0.137888 0.095391 0.388010
+v -0.123384 0.097928 0.394114
+v -0.108480 0.097928 0.399174
+v -0.108306 0.090035 0.398623
+v -0.137832 0.090035 0.387876
+v -0.138053 0.097928 0.388410
+v -0.180159 0.095391 0.367163
+v -0.166376 0.095391 0.374725
+v -0.180086 0.090035 0.367038
+v -0.193599 0.095391 0.359008
+v -0.180375 0.097928 0.367539
+v -0.166576 0.097928 0.375110
+v -0.166309 0.090035 0.374597
+v -0.193521 0.090035 0.358887
+v -0.193831 0.097928 0.359374
+v -0.231607 0.095390 0.331139
+v -0.219347 0.095391 0.340979
+v -0.231514 0.090035 0.331028
+v -0.243427 0.095390 0.320774
+v -0.231886 0.097928 0.331471
+v -0.219611 0.097928 0.341323
+v -0.219259 0.090035 0.340864
+v -0.243329 0.090035 0.320667
+v -0.243720 0.097928 0.321093
+v -0.276019 0.095390 0.286727
+v -0.265654 0.095390 0.298547
+v -0.275908 0.090035 0.286634
+v -0.285859 0.095390 0.274467
+v -0.276351 0.097928 0.287006
+v -0.265974 0.097928 0.298840
+v -0.265547 0.090035 0.298449
+v -0.285745 0.090035 0.274379
+v -0.286203 0.097928 0.274731
+v -0.312044 0.095390 0.235278
+v -0.303889 0.095390 0.248718
+v -0.311919 0.090035 0.235206
+v -0.319606 0.095390 0.221496
+v -0.312419 0.097928 0.235495
+v -0.304255 0.097928 0.248951
+v -0.303767 0.090035 0.248641
+v -0.319478 0.090035 0.221429
+v -0.319990 0.097928 0.221696
+v -0.338588 0.095390 0.178355
+v -0.332890 0.095390 0.193007
+v -0.338452 0.090035 0.178306
+v -0.343641 0.095390 0.163469
+v -0.338995 0.097928 0.178504
+v -0.333291 0.097928 0.193173
+v -0.332757 0.090035 0.192952
+v -0.343503 0.090035 0.163426
+v -0.344055 0.097928 0.163600
+v -0.354843 0.095390 0.117688
+v -0.351777 0.095390 0.133107
+v -0.354701 0.090035 0.117663
+v -0.357235 0.095390 0.102150
+v -0.355270 0.097928 0.117763
+v -0.352200 0.097928 0.133201
+v -0.351636 0.090035 0.133075
+v -0.357092 0.090035 0.102132
+v -0.357665 0.097928 0.102207
+v -0.360317 0.095390 0.055120
+v -0.359975 0.095390 0.070837
+v -0.360173 0.090035 0.055120
+v -0.359975 0.095390 0.039403
+v -0.360751 0.097928 0.055120
+v -0.360408 0.097928 0.070855
+v -0.359831 0.090035 0.070830
+v -0.359831 0.090035 0.039409
+v -0.360408 0.097928 0.039384
+v -0.354843 0.095390 -0.007449
+v -0.357235 0.095390 0.008089
+v -0.354701 0.090035 -0.007424
+v -0.351777 0.095390 -0.022868
+v -0.355270 0.097928 -0.007524
+v -0.357665 0.097928 0.008032
+v -0.357092 0.090035 0.008108
+v -0.351636 0.090035 -0.022836
+v -0.352200 0.097928 -0.022961
+v -0.338588 0.095390 -0.068116
+v -0.343641 0.095390 -0.053230
+v -0.338452 0.090035 -0.068067
+v -0.332890 0.095390 -0.082768
+v -0.338995 0.097928 -0.068265
+v -0.344055 0.097928 -0.053360
+v -0.343504 0.090035 -0.053187
+v -0.332757 0.090035 -0.082713
+v -0.333291 0.097928 -0.082934
+v -0.312060 0.095390 -0.125020
+v -0.319606 0.095390 -0.111257
+v -0.311935 0.090035 -0.124947
+v -0.303954 0.095390 -0.138401
+v -0.312436 0.097928 -0.125236
+v -0.319991 0.097928 -0.111457
+v -0.319478 0.090035 -0.111190
+v -0.303832 0.090035 -0.138324
+v -0.304320 0.097928 -0.138634
+v -0.257240 0.095381 -0.199619
+v -0.259187 0.095390 -0.197080
+v -0.257138 0.090035 -0.199522
+v -0.256731 0.095354 -0.200882
+v -0.257546 0.097892 -0.199912
+v -0.259499 0.097928 -0.197384
+v -0.259083 0.090035 -0.196979
+v -0.256634 0.090035 -0.200799
+v -0.257025 0.097782 -0.201133
+v -0.125059 0.048802 0.764368
+v -0.094003 0.048802 0.769149
+v -0.125086 0.065989 0.764521
+v -0.155878 0.048802 0.758239
+v -0.124978 0.031802 0.763908
+v -0.093943 0.031802 0.768686
+v -0.094024 0.065989 0.769303
+v -0.155911 0.065989 0.758391
+v -0.155777 0.031802 0.757783
+v -0.246319 0.048802 0.731877
+v -0.216565 0.048802 0.741978
+v -0.246372 0.065989 0.732023
+v -0.275605 0.048802 0.720489
+v -0.246159 0.031802 0.731438
+v -0.216425 0.031802 0.741532
+v -0.216612 0.065989 0.742126
+v -0.275665 0.065989 0.720633
+v -0.275426 0.031802 0.720057
+v -0.360095 0.048802 0.678822
+v -0.332547 0.048802 0.693937
+v -0.360173 0.065989 0.678957
+v -0.386958 0.048802 0.662522
+v -0.359861 0.031802 0.678418
+v -0.332331 0.031802 0.693522
+v -0.332619 0.065989 0.694075
+v -0.387042 0.065989 0.662654
+v -0.386707 0.031802 0.662128
+v -0.462929 0.048802 0.606817
+v -0.438424 0.048802 0.626486
+v -0.463029 0.065989 0.606937
+v -0.486554 0.048802 0.586100
+v -0.462629 0.031802 0.606459
+v -0.438140 0.031802 0.626115
+v -0.438519 0.065989 0.626609
+v -0.486659 0.065989 0.586215
+v -0.486238 0.031802 0.585756
+v -0.551697 0.048802 0.518049
+v -0.530980 0.048802 0.541674
+v -0.551817 0.065989 0.518149
+v -0.571366 0.048802 0.493544
+v -0.551339 0.031802 0.517749
+v -0.530636 0.031802 0.541358
+v -0.531095 0.065989 0.541779
+v -0.571489 0.065989 0.493639
+v -0.570995 0.031802 0.493260
+v -0.623703 0.048802 0.415215
+v -0.607403 0.048802 0.442078
+v -0.623837 0.065989 0.415293
+v -0.638817 0.048802 0.387667
+v -0.623298 0.031802 0.414981
+v -0.607009 0.031802 0.441827
+v -0.607534 0.065989 0.442162
+v -0.638955 0.065989 0.387739
+v -0.638403 0.031802 0.387451
+v -0.676757 0.048802 0.301439
+v -0.665370 0.048802 0.330725
+v -0.676903 0.065989 0.301492
+v -0.686858 0.048802 0.271685
+v -0.676318 0.031802 0.301279
+v -0.664938 0.031802 0.330546
+v -0.665513 0.065989 0.330785
+v -0.687007 0.065989 0.271732
+v -0.686413 0.031802 0.271545
+v -0.709249 0.048802 0.180179
+v -0.703120 0.048802 0.210998
+v -0.709402 0.065989 0.180206
+v -0.714030 0.048802 0.149123
+v -0.708789 0.031802 0.180098
+v -0.702663 0.031802 0.210897
+v -0.703272 0.065989 0.211031
+v -0.714184 0.065989 0.149144
+v -0.713566 0.031802 0.149062
+v -0.720190 0.048802 0.055120
+v -0.719506 0.048802 0.086534
+v -0.720346 0.065989 0.055120
+v -0.719506 0.048802 0.023705
+v -0.719723 0.031802 0.055120
+v -0.719039 0.031802 0.086514
+v -0.719661 0.065989 0.086541
+v -0.719661 0.065989 0.023699
+v -0.719039 0.031802 0.023726
+v -0.709249 0.048802 -0.069940
+v -0.714030 0.048802 -0.038884
+v -0.709402 0.065989 -0.069967
+v -0.703120 0.048802 -0.100758
+v -0.708789 0.031802 -0.069859
+v -0.713567 0.031802 -0.038823
+v -0.714184 0.065989 -0.038904
+v -0.703272 0.065989 -0.100792
+v -0.702664 0.031802 -0.100657
+v -0.676757 0.048802 -0.191200
+v -0.686858 0.048802 -0.161446
+v -0.676904 0.065989 -0.191253
+v -0.665370 0.048801 -0.220486
+v -0.676318 0.031802 -0.191040
+v -0.686413 0.031802 -0.161305
+v -0.687007 0.065989 -0.161493
+v -0.665514 0.065989 -0.220545
+v -0.664938 0.031802 -0.220307
+v -0.623736 0.048801 -0.304936
+v -0.638817 0.048801 -0.277427
+v -0.623871 0.065989 -0.305014
+v -0.607534 0.048801 -0.331683
+v -0.623331 0.031802 -0.304703
+v -0.638403 0.031802 -0.277212
+v -0.638956 0.065989 -0.277499
+v -0.607665 0.065989 -0.331767
+v -0.607139 0.031802 -0.331432
+v -0.513875 0.048938 -0.453756
+v -0.518059 0.048801 -0.448973
+v -0.513974 0.065989 -0.453860
+v -0.511976 0.049349 -0.455399
+v -0.513578 0.032350 -0.453441
+v -0.517735 0.031802 -0.448658
+v -0.518167 0.065989 -0.449078
+v -0.512055 0.065989 -0.455505
+v -0.511739 0.033993 -0.455079
+v -0.506467 0.048938 -0.451207
+v -0.498530 0.048801 -0.443340
+v -0.506514 0.032350 -0.451048
+v -0.509955 0.049349 -0.454487
+v -0.506452 0.065989 -0.451261
+v -0.498506 0.065989 -0.443386
+v -0.498601 0.031802 -0.443203
+v -0.509914 0.033993 -0.454255
+v -0.509969 0.065989 -0.454564
+v -0.433650 0.048801 -0.378469
+v -0.406266 0.048801 -0.351090
+v -0.433714 0.031802 -0.378352
+v -0.461013 0.048801 -0.405829
+v -0.433628 0.065989 -0.378508
+v -0.406244 0.065989 -0.351125
+v -0.406331 0.031802 -0.350985
+v -0.461078 0.031802 -0.405701
+v -0.460992 0.065989 -0.405872
+v -0.359114 0.048801 -0.303944
+v -0.368591 0.048801 -0.313420
+v -0.359095 0.065989 -0.303975
+v -0.351243 0.048801 -0.296075
+v -0.359171 0.031802 -0.303851
+v -0.368653 0.031802 -0.313327
+v -0.368571 0.065989 -0.313451
+v -0.351225 0.065989 -0.296106
+v -0.351297 0.031802 -0.295981
+v -0.257244 0.048938 -0.199623
+v -0.259192 0.048801 -0.197085
+v -0.257560 0.032350 -0.199925
+v -0.256734 0.049349 -0.200885
+v -0.257138 0.065989 -0.199522
+v -0.259083 0.065989 -0.196979
+v -0.259518 0.031802 -0.197402
+v -0.257034 0.033993 -0.201143
+v -0.256634 0.065989 -0.200799
+v -0.312069 0.048802 -0.125024
+v -0.319614 0.048802 -0.111261
+v -0.312468 0.031802 -0.125255
+v -0.303962 0.048802 -0.138406
+v -0.311935 0.065989 -0.124947
+v -0.319478 0.065989 -0.111190
+v -0.320024 0.031802 -0.111474
+v -0.304352 0.031802 -0.138654
+v -0.303832 0.065989 -0.138324
+v -0.338596 0.048802 -0.068119
+v -0.343650 0.048802 -0.053233
+v -0.339030 0.031802 -0.068277
+v -0.332899 0.048802 -0.082772
+v -0.338452 0.065989 -0.068067
+v -0.343504 0.065989 -0.053187
+v -0.344091 0.031802 -0.053372
+v -0.333326 0.031802 -0.082948
+v -0.332757 0.065989 -0.082713
+v -0.354853 0.048802 -0.007450
+v -0.357245 0.048802 0.008088
+v -0.355307 0.031802 -0.007531
+v -0.351786 0.048802 -0.022870
+v -0.354701 0.065989 -0.007424
+v -0.357092 0.065989 0.008108
+v -0.357702 0.031802 0.008027
+v -0.352237 0.031802 -0.022969
+v -0.351636 0.065989 -0.022836
+v -0.360327 0.048802 0.055120
+v -0.359984 0.048802 0.070837
+v -0.360789 0.031802 0.055120
+v -0.359984 0.048802 0.039402
+v -0.360173 0.065989 0.055120
+v -0.359831 0.065989 0.070830
+v -0.360446 0.031802 0.070857
+v -0.360446 0.031802 0.039382
+v -0.359831 0.065989 0.039409
+v -0.354853 0.048802 0.117690
+v -0.351786 0.048802 0.133109
+v -0.355307 0.031802 0.117770
+v -0.357245 0.048802 0.102152
+v -0.354701 0.065989 0.117663
+v -0.351636 0.065989 0.133075
+v -0.352237 0.031802 0.133209
+v -0.357702 0.031802 0.102212
+v -0.357092 0.065989 0.102132
+v -0.338596 0.048802 0.178359
+v -0.332899 0.048802 0.193011
+v -0.339030 0.031802 0.178517
+v -0.343650 0.048802 0.163472
+v -0.338452 0.065989 0.178306
+v -0.332757 0.065989 0.192952
+v -0.333325 0.031802 0.193188
+v -0.344091 0.031802 0.163611
+v -0.343503 0.065989 0.163426
+v -0.312052 0.048802 0.235283
+v -0.303897 0.048802 0.248723
+v -0.312452 0.031802 0.235514
+v -0.319614 0.048802 0.221500
+v -0.311919 0.065989 0.235206
+v -0.303767 0.065989 0.248641
+v -0.304286 0.031802 0.248971
+v -0.320024 0.031802 0.221713
+v -0.319478 0.065989 0.221429
+v -0.276026 0.048802 0.286733
+v -0.265661 0.048802 0.298553
+v -0.276380 0.031802 0.287030
+v -0.285867 0.048802 0.274473
+v -0.275908 0.065989 0.286634
+v -0.265547 0.065989 0.298449
+v -0.266001 0.031802 0.298865
+v -0.286233 0.031802 0.274754
+v -0.285745 0.065989 0.274379
+v -0.231613 0.048802 0.331146
+v -0.219353 0.048802 0.340986
+v -0.231910 0.031802 0.331500
+v -0.243433 0.048802 0.320781
+v -0.231515 0.065989 0.331028
+v -0.219259 0.065989 0.340864
+v -0.219634 0.031802 0.341353
+v -0.243745 0.031802 0.321121
+v -0.243329 0.065989 0.320667
+v -0.180163 0.048802 0.367172
+v -0.166380 0.048802 0.374734
+v -0.180394 0.031802 0.367571
+v -0.193604 0.048802 0.359016
+v -0.180086 0.065989 0.367038
+v -0.166309 0.065989 0.374597
+v -0.166594 0.031802 0.375143
+v -0.193852 0.031802 0.359406
+v -0.193521 0.065989 0.358887
+v -0.123239 0.048802 0.393716
+v -0.108352 0.048802 0.398770
+v -0.123397 0.031802 0.394150
+v -0.137891 0.048802 0.388018
+v -0.123186 0.065989 0.393571
+v -0.108306 0.065989 0.398623
+v -0.108491 0.031802 0.399210
+v -0.138068 0.031802 0.388445
+v -0.137832 0.065989 0.387876
+v -0.062570 0.048802 0.409972
+v -0.047032 0.048802 0.412364
+v -0.062650 0.031802 0.410427
+v -0.077989 0.048802 0.406906
+v -0.062543 0.065989 0.409820
+v -0.047012 0.065989 0.412211
+v -0.047092 0.031802 0.412822
+v -0.078089 0.031802 0.407356
+v -0.077956 0.065989 0.406755
+v -0.260671 0.048938 -0.205481
+v -0.266209 0.048801 -0.211052
+v -0.260642 0.065989 -0.205487
+v -0.258072 0.049349 -0.202778
+v -0.260759 0.032350 -0.205462
+v -0.266271 0.031802 -0.211002
+v -0.266188 0.065989 -0.211068
+v -0.258015 0.065989 -0.202753
+v -0.258243 0.033993 -0.202852
+v -0.260607 0.095460 -0.205418
+v -0.260502 0.098208 -0.205212
+v -0.258070 0.095354 -0.202775
+v -0.260642 0.090035 -0.205487
+v -0.265960 0.095706 -0.210811
+v -0.265277 0.099193 -0.210038
+v -0.258234 0.097782 -0.202843
+v -0.258015 0.090035 -0.202753
+v -0.266188 0.090035 -0.211068
+v -0.260467 0.100522 -0.202817
+v -0.262410 0.100651 -0.200216
+v -0.259145 0.099350 -0.201494
+v -0.260036 0.100134 -0.204185
+v -0.262051 0.103304 -0.204397
+v -0.263658 0.103550 -0.201430
+v -0.261163 0.099434 -0.199002
+v -0.258464 0.099099 -0.202568
+v -0.262656 0.102568 -0.206835
+v -0.315941 0.100651 -0.127260
+v -0.323580 0.100651 -0.113325
+v -0.314439 0.099434 -0.126393
+v -0.307734 0.100651 -0.140808
+v -0.317443 0.103550 -0.128127
+v -0.325118 0.103550 -0.114126
+v -0.322042 0.099434 -0.112525
+v -0.306271 0.099434 -0.139876
+v -0.309197 0.103550 -0.141739
+v -0.342798 0.100651 -0.069649
+v -0.347914 0.100651 -0.054577
+v -0.341168 0.099434 -0.069055
+v -0.337030 0.100651 -0.084483
+v -0.344427 0.103550 -0.070242
+v -0.349568 0.103550 -0.055099
+v -0.346260 0.099434 -0.054056
+v -0.335427 0.099434 -0.083819
+v -0.338632 0.103550 -0.085146
+v -0.359256 0.100651 -0.008227
+v -0.361677 0.100651 0.007504
+v -0.357548 0.099434 -0.007926
+v -0.356151 0.100651 -0.023837
+v -0.360963 0.103550 -0.008528
+v -0.363397 0.103550 0.007278
+v -0.359958 0.099434 0.007730
+v -0.354458 0.099434 -0.023462
+v -0.357844 0.103550 -0.024213
+v -0.364798 0.100651 0.055120
+v -0.364451 0.100651 0.071032
+v -0.363063 0.099434 0.055120
+v -0.364451 0.100651 0.039207
+v -0.366532 0.103550 0.055120
+v -0.366184 0.103550 0.071108
+v -0.362718 0.099434 0.070956
+v -0.362718 0.099434 0.039283
+v -0.366184 0.103550 0.039132
+v -0.359256 0.100651 0.118466
+v -0.356151 0.100651 0.134076
+v -0.357548 0.099434 0.118165
+v -0.361677 0.100651 0.102735
+v -0.360963 0.103550 0.118767
+v -0.357844 0.103550 0.134452
+v -0.354458 0.099434 0.133701
+v -0.359958 0.099434 0.102509
+v -0.363397 0.103550 0.102962
+v -0.342798 0.100651 0.179888
+v -0.337029 0.100651 0.194722
+v -0.341168 0.099434 0.179295
+v -0.347914 0.100651 0.164816
+v -0.344427 0.103550 0.180481
+v -0.338632 0.103550 0.195386
+v -0.335427 0.099434 0.194058
+v -0.346260 0.099434 0.164295
+v -0.349568 0.103550 0.165338
+v -0.315924 0.100651 0.237518
+v -0.307667 0.100651 0.251126
+v -0.314422 0.099434 0.236651
+v -0.323580 0.100651 0.223565
+v -0.317426 0.103550 0.238386
+v -0.309130 0.103550 0.252057
+v -0.306205 0.099434 0.250194
+v -0.322041 0.099434 0.222764
+v -0.325118 0.103550 0.224365
+v -0.279451 0.100651 0.289607
+v -0.268957 0.100651 0.301574
+v -0.278123 0.099434 0.288492
+v -0.289414 0.100651 0.277194
+v -0.280780 0.103550 0.290722
+v -0.270236 0.103550 0.302745
+v -0.267679 0.099434 0.300402
+v -0.288038 0.099434 0.276139
+v -0.290790 0.103550 0.278250
+v -0.234487 0.100651 0.334571
+v -0.222075 0.100651 0.344533
+v -0.233372 0.099434 0.333242
+v -0.246454 0.100651 0.324077
+v -0.235602 0.103550 0.335899
+v -0.223131 0.103550 0.345909
+v -0.221019 0.099434 0.343157
+v -0.245282 0.099434 0.322798
+v -0.247626 0.103550 0.325356
+v -0.182399 0.100651 0.371043
+v -0.168445 0.100651 0.378699
+v -0.181531 0.099434 0.369542
+v -0.196006 0.100651 0.362787
+v -0.183266 0.103550 0.372545
+v -0.169246 0.103550 0.380238
+v -0.167644 0.099434 0.377161
+v -0.195074 0.099434 0.361324
+v -0.196938 0.103550 0.364250
+v -0.124768 0.100651 0.397917
+v -0.109697 0.100651 0.403034
+v -0.124175 0.099434 0.396287
+v -0.139602 0.100651 0.392149
+v -0.125361 0.103550 0.399547
+v -0.110218 0.103550 0.404688
+v -0.109175 0.099434 0.401380
+v -0.138938 0.099434 0.390547
+v -0.140266 0.103550 0.393751
+v -0.063346 0.100651 0.414375
+v -0.047616 0.100651 0.416797
+v -0.063045 0.099434 0.412667
+v -0.078957 0.100651 0.411270
+v -0.063647 0.103550 0.416083
+v -0.047842 0.103550 0.418516
+v -0.047389 0.099434 0.415077
+v -0.078581 0.099434 0.409577
+v -0.079332 0.103550 0.412963
+v -0.367432 0.132369 -0.308430
+v -0.370648 0.132350 -0.305226
+v -0.371369 0.151705 -0.311388
+v -0.365383 0.132426 -0.308982
+v -0.371878 0.118311 -0.313150
+v -0.375341 0.118510 -0.310103
+v -0.374766 0.151431 -0.308303
+v -0.368787 0.152529 -0.311564
+v -0.369209 0.117716 -0.313091
+v -0.357228 0.131652 -0.302035
+v -0.361104 0.132022 -0.305690
+v -0.357565 0.149167 -0.302294
+v -0.351225 0.131503 -0.296106
+v -0.357605 0.117982 -0.302444
+v -0.362614 0.117528 -0.307325
+v -0.362451 0.151100 -0.306727
+v -0.351225 0.148421 -0.296106
+v -0.351225 0.118133 -0.296106
+v -0.264916 0.130988 -0.207238
+v -0.268229 0.130868 -0.212383
+v -0.265080 0.146183 -0.207399
+v -0.265633 0.131028 -0.203352
+v -0.264423 0.118311 -0.206753
+v -0.267188 0.117716 -0.211362
+v -0.268576 0.146297 -0.212723
+v -0.265737 0.146145 -0.203453
+v -0.265321 0.118510 -0.203049
+v -0.446072 0.132350 -0.202375
+v -0.456855 0.132350 -0.182704
+v -0.450470 0.151431 -0.204901
+v -0.434492 0.132350 -0.221495
+v -0.451909 0.118510 -0.205749
+v -0.462836 0.118510 -0.185818
+v -0.461352 0.151431 -0.185045
+v -0.438800 0.151431 -0.224187
+v -0.440171 0.118510 -0.225127
+v -0.319821 0.131029 -0.129499
+v -0.311513 0.131029 -0.143214
+v -0.319946 0.146145 -0.129572
+v -0.327554 0.131029 -0.115394
+v -0.319445 0.118510 -0.129283
+v -0.311147 0.118510 -0.142981
+v -0.311635 0.146145 -0.143292
+v -0.327682 0.146145 -0.115461
+v -0.327169 0.118510 -0.115194
+v -0.483988 0.132350 -0.121038
+v -0.491212 0.132350 -0.099759
+v -0.488752 0.151431 -0.122771
+v -0.475844 0.132350 -0.141981
+v -0.490325 0.118510 -0.123344
+v -0.497643 0.118510 -0.101787
+v -0.496047 0.151431 -0.101283
+v -0.480528 0.151431 -0.143922
+v -0.482074 0.118510 -0.144562
+v -0.347008 0.131029 -0.071181
+v -0.341169 0.131029 -0.086197
+v -0.347143 0.146145 -0.071230
+v -0.352187 0.131029 -0.055925
+v -0.346600 0.118510 -0.071033
+v -0.340768 0.118510 -0.086031
+v -0.341302 0.146145 -0.086252
+v -0.352325 0.146145 -0.055968
+v -0.351774 0.118510 -0.055794
+v -0.507224 0.132350 -0.034318
+v -0.510643 0.132350 -0.012108
+v -0.512217 0.151431 -0.035198
+v -0.502841 0.132350 -0.056358
+v -0.513865 0.118510 -0.035489
+v -0.517329 0.118510 -0.012988
+v -0.515670 0.151431 -0.012769
+v -0.507790 0.151431 -0.057455
+v -0.509425 0.118510 -0.057817
+v -0.363668 0.131029 -0.009005
+v -0.360525 0.131029 -0.024807
+v -0.363810 0.146145 -0.009030
+v -0.366119 0.131029 0.006919
+v -0.363241 0.118510 -0.008930
+v -0.360102 0.118510 -0.024713
+v -0.360666 0.146145 -0.024838
+v -0.366262 0.146145 0.006900
+v -0.365689 0.118510 0.006976
+v -0.515049 0.132350 0.055120
+v -0.514560 0.132350 0.077586
+v -0.520119 0.151431 0.055120
+v -0.514560 0.132350 0.032653
+v -0.521793 0.118510 0.055120
+v -0.521297 0.118510 0.077880
+v -0.519624 0.151431 0.077807
+v -0.519624 0.151431 0.032432
+v -0.521297 0.118510 0.032359
+v -0.369278 0.131029 0.055120
+v -0.368927 0.131029 0.039012
+v -0.369422 0.146145 0.055120
+v -0.368927 0.131029 0.071227
+v -0.368844 0.118510 0.055120
+v -0.368494 0.118510 0.039031
+v -0.369071 0.146145 0.039006
+v -0.369071 0.146145 0.071234
+v -0.368494 0.118510 0.071208
+v -0.507224 0.132350 0.144557
+v -0.502841 0.132350 0.166597
+v -0.512217 0.151431 0.145437
+v -0.510643 0.132350 0.122347
+v -0.513865 0.118510 0.145728
+v -0.509425 0.118510 0.168056
+v -0.507790 0.151431 0.167694
+v -0.515670 0.151431 0.123009
+v -0.517329 0.118510 0.123227
+v -0.363668 0.131029 0.119244
+v -0.366119 0.131029 0.103320
+v -0.363810 0.146145 0.119269
+v -0.360525 0.131029 0.135046
+v -0.363241 0.118510 0.119169
+v -0.365689 0.118510 0.103263
+v -0.366262 0.146145 0.103339
+v -0.360666 0.146145 0.135077
+v -0.360102 0.118510 0.134952
+v -0.483988 0.132350 0.231277
+v -0.475844 0.132350 0.252221
+v -0.488752 0.151431 0.233011
+v -0.491212 0.132350 0.209998
+v -0.490324 0.118510 0.233583
+v -0.482074 0.118510 0.254801
+v -0.480527 0.151431 0.254161
+v -0.496047 0.151431 0.211522
+v -0.497643 0.118510 0.212026
+v -0.347008 0.131029 0.181420
+v -0.352187 0.131029 0.166164
+v -0.347143 0.146145 0.181469
+v -0.341169 0.131029 0.196436
+v -0.346600 0.118510 0.181272
+v -0.351773 0.118510 0.166033
+v -0.352325 0.146145 0.166207
+v -0.341302 0.146145 0.196492
+v -0.340768 0.118510 0.196270
+v -0.446045 0.132350 0.312644
+v -0.434388 0.132350 0.331856
+v -0.450436 0.151431 0.315179
+v -0.456855 0.132350 0.292943
+v -0.451885 0.118510 0.316016
+v -0.440076 0.118510 0.335479
+v -0.438664 0.151431 0.334580
+v -0.461351 0.151431 0.295284
+v -0.462836 0.118510 0.296057
+v -0.319804 0.131029 0.239758
+v -0.327554 0.131029 0.225633
+v -0.319929 0.146145 0.239831
+v -0.311446 0.131029 0.253533
+v -0.319428 0.118510 0.239542
+v -0.327169 0.118510 0.225433
+v -0.327682 0.146145 0.225700
+v -0.311568 0.146145 0.253610
+v -0.311080 0.118510 0.253300
+v -0.394550 0.132350 0.386187
+v -0.379734 0.132350 0.403082
+v -0.398434 0.151431 0.389445
+v -0.408616 0.132350 0.368662
+v -0.399716 0.118510 0.390521
+v -0.384706 0.118510 0.407638
+v -0.383472 0.151431 0.406507
+v -0.412638 0.151431 0.371748
+v -0.413966 0.118510 0.372767
+v -0.282883 0.131029 0.292487
+v -0.292968 0.131029 0.279922
+v -0.282994 0.146145 0.292580
+v -0.272260 0.131029 0.304600
+v -0.282551 0.118510 0.292208
+v -0.292624 0.118510 0.279658
+v -0.293083 0.146145 0.280010
+v -0.272367 0.146145 0.304698
+v -0.271941 0.118510 0.304308
+v -0.331067 0.132350 0.449670
+v -0.313542 0.132350 0.463736
+v -0.334326 0.151431 0.453553
+v -0.347962 0.132350 0.434854
+v -0.335402 0.118510 0.454836
+v -0.317647 0.118510 0.469086
+v -0.316628 0.151431 0.467758
+v -0.351387 0.151431 0.438592
+v -0.352518 0.118510 0.439826
+v -0.237367 0.131029 0.338003
+v -0.249481 0.131029 0.327380
+v -0.237460 0.146145 0.338113
+v -0.224802 0.131029 0.348088
+v -0.237088 0.118510 0.337671
+v -0.249188 0.118510 0.327060
+v -0.249578 0.146145 0.327487
+v -0.224890 0.146145 0.348202
+v -0.224538 0.118510 0.347744
+v -0.257524 0.132350 0.501165
+v -0.237823 0.132350 0.511974
+v -0.260059 0.151431 0.505556
+v -0.276736 0.132350 0.489508
+v -0.260896 0.118510 0.507005
+v -0.240937 0.118510 0.517956
+v -0.240164 0.151431 0.516471
+v -0.279460 0.151431 0.493784
+v -0.280359 0.118510 0.495196
+v -0.184639 0.131029 0.374923
+v -0.198413 0.131029 0.366566
+v -0.184711 0.146145 0.375049
+v -0.170514 0.131029 0.382673
+v -0.184422 0.118510 0.374548
+v -0.198180 0.118510 0.366200
+v -0.198491 0.146145 0.366688
+v -0.170580 0.146145 0.382802
+v -0.170313 0.118510 0.382289
+v -0.176157 0.132350 0.539107
+v -0.154878 0.132350 0.546331
+v -0.177891 0.151431 0.543871
+v -0.197101 0.132350 0.530963
+v -0.178463 0.118510 0.545444
+v -0.156906 0.118510 0.552763
+v -0.156403 0.151431 0.551166
+v -0.199041 0.151431 0.535647
+v -0.199681 0.118510 0.537194
+v -0.126300 0.131029 0.402127
+v -0.141317 0.131029 0.396288
+v -0.126350 0.146145 0.402263
+v -0.111044 0.131029 0.407306
+v -0.126152 0.118510 0.401720
+v -0.141151 0.118510 0.395888
+v -0.141372 0.146145 0.396422
+v -0.111087 0.146145 0.407444
+v -0.110914 0.118510 0.406893
+v -0.089437 0.132350 0.562344
+v -0.067227 0.132350 0.565763
+v -0.090317 0.151431 0.567336
+v -0.111477 0.132350 0.557960
+v -0.090608 0.118510 0.568985
+v -0.068107 0.118510 0.572449
+v -0.067889 0.151431 0.570789
+v -0.112574 0.151431 0.562910
+v -0.112937 0.118510 0.564544
+v -0.064124 0.131029 0.418787
+v -0.079926 0.131029 0.415644
+v -0.064149 0.146145 0.418929
+v -0.048200 0.131029 0.421238
+v -0.064049 0.118510 0.418360
+v -0.079833 0.118510 0.415221
+v -0.079958 0.146145 0.415785
+v -0.048219 0.146145 0.421382
+v -0.048144 0.118510 0.420809
+v -0.064149 0.200351 0.418929
+v -0.064149 0.217082 0.418929
+v -0.048219 0.200351 0.421382
+v -0.064149 0.181889 0.418929
+v -0.079958 0.200351 0.415785
+v -0.079958 0.217082 0.415785
+v -0.048219 0.217082 0.421382
+v -0.048219 0.181889 0.421382
+v -0.079958 0.181889 0.415785
+v -0.126350 0.200351 0.402263
+v -0.126350 0.217082 0.402263
+v -0.111087 0.200351 0.407444
+v -0.126350 0.181889 0.402263
+v -0.141372 0.200351 0.396422
+v -0.141372 0.217082 0.396422
+v -0.111087 0.217082 0.407444
+v -0.111087 0.181889 0.407444
+v -0.141372 0.181889 0.396422
+v -0.184711 0.200351 0.375049
+v -0.184711 0.217082 0.375049
+v -0.170580 0.200351 0.382802
+v -0.184711 0.181889 0.375049
+v -0.198491 0.200351 0.366687
+v -0.198491 0.217082 0.366687
+v -0.170580 0.217082 0.382802
+v -0.170580 0.181889 0.382802
+v -0.198491 0.181889 0.366688
+v -0.237460 0.200351 0.338113
+v -0.237460 0.217082 0.338113
+v -0.224890 0.200351 0.348202
+v -0.237460 0.181889 0.338113
+v -0.249578 0.200351 0.327487
+v -0.249578 0.217082 0.327487
+v -0.224890 0.217082 0.348202
+v -0.224890 0.181889 0.348202
+v -0.249578 0.181889 0.327487
+v -0.282994 0.200351 0.292580
+v -0.282994 0.217082 0.292580
+v -0.272367 0.200351 0.304698
+v -0.282994 0.181889 0.292580
+v -0.293083 0.200351 0.280010
+v -0.293083 0.217082 0.280010
+v -0.272367 0.217082 0.304698
+v -0.272367 0.181889 0.304698
+v -0.293083 0.181889 0.280010
+v -0.319929 0.200351 0.239831
+v -0.319929 0.217082 0.239831
+v -0.311568 0.200351 0.253610
+v -0.319929 0.181889 0.239831
+v -0.327682 0.200351 0.225700
+v -0.327682 0.217082 0.225700
+v -0.311568 0.217082 0.253610
+v -0.311568 0.181889 0.253610
+v -0.327682 0.181889 0.225700
+v -0.347143 0.200351 0.181469
+v -0.347143 0.217081 0.181469
+v -0.341302 0.200351 0.196492
+v -0.347143 0.181889 0.181469
+v -0.352325 0.200351 0.166207
+v -0.352325 0.217081 0.166207
+v -0.341302 0.217082 0.196492
+v -0.341302 0.181889 0.196492
+v -0.352325 0.181889 0.166207
+v -0.363810 0.200351 0.119269
+v -0.363810 0.217081 0.119269
+v -0.360666 0.200351 0.135077
+v -0.363810 0.181889 0.119269
+v -0.366262 0.200351 0.103339
+v -0.366262 0.217081 0.103339
+v -0.360666 0.217081 0.135077
+v -0.360666 0.181889 0.135077
+v -0.366262 0.181889 0.103339
+v -0.369422 0.200351 0.055120
+v -0.369422 0.217081 0.055120
+v -0.369071 0.200351 0.071234
+v -0.369422 0.181889 0.055120
+v -0.369071 0.200351 0.039006
+v -0.369071 0.217081 0.039006
+v -0.369071 0.217081 0.071234
+v -0.369071 0.181889 0.071234
+v -0.369071 0.181889 0.039006
+v -0.363810 0.200351 -0.009030
+v -0.363810 0.217081 -0.009030
+v -0.366262 0.200351 0.006900
+v -0.363810 0.181889 -0.009030
+v -0.360666 0.200351 -0.024838
+v -0.360666 0.217081 -0.024838
+v -0.366262 0.217081 0.006900
+v -0.366262 0.181889 0.006900
+v -0.360666 0.181889 -0.024838
+v -0.347143 0.200351 -0.071230
+v -0.347143 0.217081 -0.071230
+v -0.352325 0.200351 -0.055968
+v -0.347143 0.181889 -0.071230
+v -0.341302 0.200351 -0.086253
+v -0.341302 0.217081 -0.086253
+v -0.352325 0.217081 -0.055968
+v -0.352325 0.181889 -0.055968
+v -0.341302 0.181889 -0.086253
+v -0.319946 0.200351 -0.129572
+v -0.319946 0.217081 -0.129572
+v -0.327682 0.200351 -0.115461
+v -0.319946 0.181889 -0.129572
+v -0.311635 0.200351 -0.143292
+v -0.311635 0.217081 -0.143292
+v -0.327682 0.217081 -0.115461
+v -0.327682 0.181889 -0.115461
+v -0.311635 0.181889 -0.143292
+v -0.265080 0.200654 -0.207399
+v -0.265737 0.200351 -0.203453
+v -0.265080 0.182078 -0.207399
+v -0.268576 0.201564 -0.212723
+v -0.265080 0.217499 -0.207399
+v -0.265737 0.217081 -0.203453
+v -0.265737 0.181889 -0.203453
+v -0.268576 0.182647 -0.212723
+v -0.268576 0.218750 -0.212723
+v -0.358879 0.221531 -0.303430
+v -0.358968 0.245436 -0.303507
+v -0.351225 0.218558 -0.296106
+v -0.358613 0.195579 -0.303197
+v -0.367709 0.228021 -0.311270
+v -0.368064 0.252057 -0.311580
+v -0.351225 0.242116 -0.296106
+v -0.351225 0.193268 -0.296106
+v -0.366645 0.200993 -0.310340
+v -0.504741 0.381627 -0.422749
+v -0.504824 0.394820 -0.422824
+v -0.503159 0.381059 -0.424158
+v -0.504493 0.368101 -0.422526
+v -0.508184 0.381816 -0.418710
+v -0.508272 0.395116 -0.418783
+v -0.503227 0.393930 -0.424236
+v -0.502956 0.368535 -0.423924
+v -0.507919 0.367956 -0.418491
+v -0.599420 0.381816 -0.290628
+v -0.599519 0.395116 -0.290684
+v -0.584373 0.381816 -0.315806
+v -0.599125 0.367956 -0.290458
+v -0.613737 0.381816 -0.264372
+v -0.613838 0.395116 -0.264424
+v -0.584469 0.395116 -0.315866
+v -0.584085 0.367956 -0.315624
+v -0.613435 0.367956 -0.264214
+v -0.650188 0.381816 -0.181529
+v -0.650294 0.395116 -0.181568
+v -0.639247 0.381816 -0.209665
+v -0.649867 0.367956 -0.181413
+v -0.659892 0.381816 -0.152943
+v -0.660000 0.395116 -0.152977
+v -0.639352 0.395116 -0.209709
+v -0.638932 0.367956 -0.209535
+v -0.659567 0.367956 -0.152841
+v -0.681403 0.381816 -0.065030
+v -0.681515 0.395116 -0.065050
+v -0.675515 0.381816 -0.094638
+v -0.681068 0.367956 -0.064971
+v -0.685997 0.381816 -0.035193
+v -0.686109 0.395116 -0.035208
+v -0.675626 0.395116 -0.094663
+v -0.675182 0.367956 -0.094565
+v -0.685659 0.367956 -0.035149
+v -0.691915 0.381816 0.055120
+v -0.692029 0.395116 0.055120
+v -0.691257 0.381816 0.024939
+v -0.691574 0.367956 0.055120
+v -0.691257 0.381816 0.085301
+v -0.691371 0.395116 0.085306
+v -0.691371 0.395116 0.024934
+v -0.690917 0.367956 0.024953
+v -0.690917 0.367956 0.085286
+v -0.681403 0.381817 0.175269
+v -0.681515 0.395116 0.175289
+v -0.685997 0.381817 0.145433
+v -0.681068 0.367956 0.175210
+v -0.675515 0.381817 0.204878
+v -0.675626 0.395116 0.204902
+v -0.686109 0.395116 0.145447
+v -0.685659 0.367956 0.145388
+v -0.675182 0.367956 0.204804
+v -0.650187 0.381817 0.291769
+v -0.650294 0.395116 0.291807
+v -0.659892 0.381817 0.263183
+v -0.649867 0.367956 0.291652
+v -0.639247 0.381817 0.319905
+v -0.639352 0.395116 0.319948
+v -0.660000 0.395116 0.263217
+v -0.659567 0.367956 0.263080
+v -0.638932 0.367956 0.319774
+v -0.599216 0.381817 0.401077
+v -0.599314 0.395116 0.401134
+v -0.613737 0.381817 0.374611
+v -0.598921 0.367956 0.400907
+v -0.583556 0.381817 0.426886
+v -0.583652 0.395116 0.426947
+v -0.613838 0.395116 0.374663
+v -0.613435 0.367956 0.374453
+v -0.583268 0.367956 0.426703
+v -0.530037 0.381817 0.499874
+v -0.530124 0.395116 0.499947
+v -0.548934 0.381817 0.476331
+v -0.529776 0.367956 0.499655
+v -0.510134 0.381817 0.522571
+v -0.510217 0.395116 0.522648
+v -0.549024 0.395116 0.476400
+v -0.548663 0.367956 0.476124
+v -0.509882 0.367956 0.522341
+v -0.444754 0.381817 0.585157
+v -0.444827 0.395116 0.585244
+v -0.467451 0.381817 0.565253
+v -0.444535 0.367956 0.584896
+v -0.421211 0.381817 0.604053
+v -0.421281 0.395116 0.604144
+v -0.467528 0.395116 0.565337
+v -0.467221 0.367956 0.565002
+v -0.421004 0.367956 0.603783
+v -0.345957 0.381817 0.654335
+v -0.346014 0.395116 0.654434
+v -0.371766 0.381817 0.638676
+v -0.345787 0.367956 0.654040
+v -0.319491 0.381817 0.668856
+v -0.319543 0.395116 0.668957
+v -0.371827 0.395116 0.638771
+v -0.371583 0.367956 0.638388
+v -0.319333 0.367956 0.668554
+v -0.236648 0.381817 0.705307
+v -0.236687 0.395116 0.705414
+v -0.264784 0.381817 0.694366
+v -0.236532 0.367956 0.704987
+v -0.208063 0.381817 0.715011
+v -0.208097 0.395116 0.715120
+v -0.264828 0.395116 0.694471
+v -0.264654 0.367956 0.694052
+v -0.207960 0.367956 0.714687
+v -0.120149 0.381817 0.736523
+v -0.120169 0.395116 0.736634
+v -0.149758 0.381817 0.730634
+v -0.120090 0.367956 0.736187
+v -0.090313 0.381817 0.741116
+v -0.090328 0.395116 0.741228
+v -0.149782 0.395116 0.730745
+v -0.149684 0.367956 0.730302
+v -0.090268 0.367956 0.740778
+v -0.431299 0.244232 -0.361435
+v -0.434523 0.242884 -0.357753
+v -0.457156 0.277575 -0.383024
+v -0.429746 0.248276 -0.362669
+v -0.405408 0.209343 -0.339818
+v -0.408862 0.208316 -0.336518
+v -0.460359 0.276222 -0.379134
+v -0.455885 0.281635 -0.384569
+v -0.402942 0.212425 -0.340218
+v -0.429495 0.291759 -0.363408
+v -0.429295 0.272823 -0.363096
+v -0.455400 0.319576 -0.385157
+v -0.429562 0.310257 -0.363512
+v -0.403367 0.264001 -0.341442
+v -0.402340 0.240785 -0.340467
+v -0.455476 0.303287 -0.385064
+v -0.455374 0.335963 -0.385188
+v -0.403709 0.285145 -0.341767
+v -0.431167 0.343506 -0.361386
+v -0.430058 0.343427 -0.362911
+v -0.457156 0.365936 -0.383024
+v -0.433896 0.343306 -0.357532
+v -0.404878 0.321476 -0.339624
+v -0.404192 0.321635 -0.341186
+v -0.455885 0.365788 -0.384569
+v -0.460359 0.365986 -0.379134
+v -0.406356 0.320517 -0.335635
+v -0.517184 0.242885 -0.243297
+v -0.529604 0.242885 -0.220575
+v -0.546028 0.276222 -0.259899
+v -0.504001 0.242885 -0.265222
+v -0.488536 0.208316 -0.226809
+v -0.500295 0.208316 -0.205317
+v -0.559114 0.276222 -0.235936
+v -0.532192 0.276222 -0.282964
+v -0.476003 0.208316 -0.247601
+v -0.517184 0.343591 -0.243297
+v -0.504001 0.343591 -0.265222
+v -0.546028 0.365986 -0.259899
+v -0.529604 0.343591 -0.220575
+v -0.488536 0.321657 -0.226810
+v -0.476003 0.321657 -0.247601
+v -0.532192 0.365986 -0.282964
+v -0.559114 0.365986 -0.235936
+v -0.500295 0.321657 -0.205318
+v -0.561057 0.242885 -0.149089
+v -0.569432 0.242885 -0.124421
+v -0.592320 0.276222 -0.160467
+v -0.551617 0.242885 -0.173368
+v -0.530008 0.208316 -0.137788
+v -0.537919 0.208316 -0.114485
+v -0.601161 0.276222 -0.134426
+v -0.582353 0.276222 -0.186099
+v -0.521090 0.208316 -0.160723
+v -0.561057 0.343591 -0.149089
+v -0.551617 0.343591 -0.173368
+v -0.592320 0.365986 -0.160467
+v -0.569432 0.343591 -0.124421
+v -0.530008 0.321657 -0.137788
+v -0.521090 0.321657 -0.160723
+v -0.582353 0.365986 -0.186099
+v -0.601161 0.365986 -0.134426
+v -0.537919 0.321657 -0.114486
+v -0.587994 0.242885 -0.048560
+v -0.591958 0.242885 -0.022813
+v -0.620758 0.276222 -0.054337
+v -0.582913 0.242885 -0.074109
+v -0.555454 0.208316 -0.042822
+v -0.559198 0.208316 -0.018500
+v -0.624942 0.276222 -0.027155
+v -0.615393 0.276222 -0.081310
+v -0.550654 0.208316 -0.066958
+v -0.587994 0.343591 -0.048560
+v -0.582913 0.343591 -0.074109
+v -0.620758 0.365986 -0.054337
+v -0.591958 0.343591 -0.022813
+v -0.555454 0.321657 -0.042822
+v -0.550654 0.321657 -0.066958
+v -0.615393 0.365986 -0.081310
+v -0.624942 0.365986 -0.027155
+v -0.559198 0.321657 -0.018500
+v -0.597065 0.242885 0.055120
+v -0.596497 0.242885 0.081163
+v -0.630334 0.276222 0.055120
+v -0.596497 0.242885 0.029076
+v -0.564023 0.208316 0.055120
+v -0.563487 0.208316 0.079722
+v -0.629735 0.276222 0.082615
+v -0.629735 0.276222 0.027625
+v -0.563487 0.208316 0.030517
+v -0.597065 0.343591 0.055120
+v -0.596497 0.343591 0.029076
+v -0.630334 0.365986 0.055120
+v -0.596497 0.343591 0.081163
+v -0.564023 0.321657 0.055120
+v -0.563487 0.321657 0.030517
+v -0.629735 0.365986 0.027625
+v -0.629735 0.365986 0.082615
+v -0.563487 0.321657 0.079722
+v -0.587994 0.242885 0.158799
+v -0.582913 0.242885 0.184348
+v -0.620757 0.276222 0.164576
+v -0.591958 0.242885 0.133052
+v -0.555454 0.208316 0.153061
+v -0.550654 0.208316 0.177197
+v -0.615393 0.276222 0.191549
+v -0.624942 0.276222 0.137395
+v -0.559198 0.208316 0.128739
+v -0.587994 0.343591 0.158799
+v -0.591958 0.343591 0.133052
+v -0.620757 0.365986 0.164576
+v -0.582913 0.343591 0.184348
+v -0.555454 0.321657 0.153061
+v -0.559198 0.321657 0.128739
+v -0.624942 0.365986 0.137395
+v -0.615393 0.365986 0.191549
+v -0.550654 0.321657 0.177197
+v -0.561057 0.242885 0.259328
+v -0.551616 0.242885 0.283607
+v -0.592320 0.276222 0.270707
+v -0.569431 0.242885 0.234661
+v -0.530008 0.208316 0.248027
+v -0.521090 0.208316 0.270962
+v -0.582353 0.276222 0.296338
+v -0.601161 0.276222 0.244665
+v -0.537919 0.208316 0.224725
+v -0.561057 0.343591 0.259328
+v -0.569431 0.343591 0.234661
+v -0.592320 0.365986 0.270707
+v -0.551616 0.343591 0.283607
+v -0.530008 0.321657 0.248027
+v -0.537919 0.321657 0.224725
+v -0.601161 0.365986 0.244665
+v -0.582353 0.365986 0.296338
+v -0.521090 0.321657 0.270962
+v -0.517073 0.242885 0.353652
+v -0.503560 0.242885 0.375923
+v -0.545885 0.276222 0.370287
+v -0.529603 0.242885 0.330814
+v -0.488458 0.208316 0.337131
+v -0.475693 0.208316 0.358169
+v -0.531619 0.276222 0.393798
+v -0.559113 0.276222 0.346176
+v -0.500295 0.208316 0.315557
+v -0.517073 0.343591 0.353652
+v -0.529603 0.343591 0.330814
+v -0.545885 0.365986 0.370287
+v -0.503560 0.343591 0.375923
+v -0.488458 0.321657 0.337131
+v -0.500295 0.321657 0.315557
+v -0.559114 0.365986 0.346176
+v -0.531619 0.365986 0.393798
+v -0.475693 0.321657 0.358169
+v -0.457378 0.242885 0.438905
+v -0.440203 0.242885 0.458491
+v -0.482863 0.276222 0.460290
+v -0.473684 0.242885 0.418590
+v -0.432066 0.208316 0.417667
+v -0.415842 0.208316 0.436169
+v -0.464731 0.276222 0.480968
+v -0.500078 0.276222 0.438843
+v -0.447470 0.208316 0.398475
+v -0.457378 0.343591 0.438905
+v -0.473684 0.343591 0.418590
+v -0.482863 0.365986 0.460290
+v -0.440203 0.343591 0.458491
+v -0.432066 0.321657 0.417667
+v -0.447470 0.321657 0.398475
+v -0.500078 0.365986 0.438843
+v -0.464731 0.365986 0.480968
+v -0.415842 0.321657 0.436169
+v -0.383786 0.242885 0.512498
+v -0.363470 0.242885 0.528804
+v -0.405170 0.276222 0.537983
+v -0.403371 0.242885 0.495322
+v -0.362547 0.208316 0.487186
+v -0.343356 0.208316 0.502590
+v -0.383723 0.276222 0.555198
+v -0.425848 0.276222 0.519851
+v -0.381049 0.208316 0.470961
+v -0.383786 0.343591 0.512498
+v -0.403371 0.343591 0.495322
+v -0.405170 0.365986 0.537983
+v -0.363470 0.343591 0.528803
+v -0.362547 0.321657 0.487186
+v -0.381049 0.321657 0.470961
+v -0.425848 0.365986 0.519851
+v -0.383723 0.365986 0.555198
+v -0.343356 0.321657 0.502590
+v -0.298532 0.242885 0.572193
+v -0.275694 0.242885 0.584723
+v -0.315166 0.276222 0.601004
+v -0.320803 0.242885 0.558679
+v -0.282011 0.208316 0.543578
+v -0.260437 0.208316 0.555415
+v -0.291056 0.276222 0.614233
+v -0.338678 0.276222 0.586738
+v -0.303050 0.208316 0.530812
+v -0.298532 0.343591 0.572193
+v -0.320803 0.343591 0.558679
+v -0.315166 0.365986 0.601004
+v -0.275694 0.343591 0.584723
+v -0.282011 0.321657 0.543578
+v -0.303050 0.321657 0.530812
+v -0.338678 0.365986 0.586738
+v -0.291056 0.365986 0.614233
+v -0.260437 0.321657 0.555415
+v -0.204208 0.242885 0.616177
+v -0.179541 0.242885 0.624551
+v -0.215586 0.276222 0.647439
+v -0.228487 0.242885 0.606736
+v -0.192907 0.208316 0.585128
+v -0.169605 0.208316 0.593038
+v -0.189545 0.276222 0.656280
+v -0.241218 0.276222 0.637473
+v -0.215842 0.208316 0.576209
+v -0.204208 0.343591 0.616177
+v -0.228487 0.343591 0.606736
+v -0.215586 0.365986 0.647439
+v -0.179541 0.343591 0.624551
+v -0.192907 0.321657 0.585128
+v -0.215842 0.321657 0.576209
+v -0.241218 0.365986 0.637473
+v -0.189545 0.365986 0.656280
+v -0.169605 0.321657 0.593038
+v -0.103679 0.242885 0.643113
+v -0.077932 0.242885 0.647077
+v -0.109456 0.276222 0.675877
+v -0.129228 0.242885 0.638032
+v -0.097941 0.208316 0.610573
+v -0.073620 0.208316 0.614318
+v -0.082275 0.276222 0.680061
+v -0.136429 0.276222 0.670512
+v -0.122077 0.208316 0.605773
+v -0.103679 0.343591 0.643113
+v -0.129228 0.343591 0.638032
+v -0.109456 0.365986 0.675877
+v -0.077932 0.343591 0.647077
+v -0.097941 0.321657 0.610573
+v -0.122077 0.321657 0.605773
+v -0.136429 0.365986 0.670512
+v -0.082275 0.365986 0.680061
+v -0.073620 0.321657 0.614318
+v -0.119062 0.407946 0.730353
+v -0.148402 0.407946 0.724518
+v -0.119775 0.413040 0.734397
+v -0.089495 0.407946 0.734905
+v -0.117395 0.399193 0.720904
+v -0.146325 0.399193 0.715150
+v -0.149291 0.413040 0.728527
+v -0.090031 0.413040 0.738976
+v -0.088243 0.399193 0.725392
+v -0.234506 0.407946 0.699420
+v -0.262387 0.407946 0.688578
+v -0.235910 0.413040 0.703279
+v -0.206179 0.407946 0.709037
+v -0.231224 0.399193 0.690404
+v -0.258715 0.399193 0.679714
+v -0.263959 0.413040 0.692373
+v -0.207414 0.413040 0.712953
+v -0.203294 0.399193 0.699886
+v -0.342825 0.407946 0.648910
+v -0.368400 0.407946 0.633392
+v -0.344878 0.413040 0.652467
+v -0.316598 0.407946 0.663299
+v -0.338027 0.399193 0.640601
+v -0.363244 0.399193 0.625299
+v -0.370606 0.413040 0.636855
+v -0.318494 0.413040 0.666942
+v -0.312167 0.399193 0.654789
+v -0.440727 0.407946 0.580358
+v -0.463219 0.407946 0.560635
+v -0.443367 0.413040 0.583504
+v -0.417397 0.407946 0.599083
+v -0.434560 0.399193 0.573008
+v -0.456737 0.399193 0.553560
+v -0.465994 0.413040 0.563662
+v -0.419898 0.413040 0.602341
+v -0.411556 0.399193 0.591471
+v -0.525238 0.407946 0.495847
+v -0.543963 0.407946 0.472518
+v -0.528384 0.413040 0.498487
+v -0.505515 0.407946 0.518339
+v -0.517888 0.399193 0.489680
+v -0.536351 0.399193 0.466676
+v -0.547222 0.413040 0.475018
+v -0.508543 0.413040 0.521113
+v -0.498441 0.399193 0.511857
+v -0.593790 0.407946 0.397945
+v -0.608180 0.407946 0.371718
+v -0.597347 0.413040 0.399998
+v -0.578272 0.407946 0.423520
+v -0.585481 0.399193 0.393147
+v -0.599669 0.399193 0.367288
+v -0.611823 0.413040 0.373614
+v -0.581736 0.413040 0.425727
+v -0.570180 0.399193 0.418365
+v -0.644300 0.407946 0.289626
+v -0.653917 0.407946 0.261299
+v -0.648160 0.413040 0.291031
+v -0.633459 0.407946 0.317507
+v -0.635284 0.399193 0.286344
+v -0.644766 0.399193 0.258414
+v -0.657834 0.413040 0.262534
+v -0.637253 0.413040 0.319079
+v -0.624594 0.399193 0.313835
+v -0.675234 0.407946 0.174182
+v -0.679785 0.407946 0.144615
+v -0.679278 0.413040 0.174895
+v -0.669398 0.407946 0.203522
+v -0.665784 0.399193 0.172515
+v -0.670272 0.399193 0.143363
+v -0.683857 0.413040 0.145151
+v -0.673408 0.413040 0.204411
+v -0.660031 0.399193 0.201445
+v -0.685650 0.407946 0.055120
+v -0.684999 0.407946 0.025212
+v -0.689757 0.413040 0.055120
+v -0.684999 0.407946 0.085027
+v -0.676055 0.399193 0.055120
+v -0.675413 0.399193 0.025630
+v -0.689102 0.413040 0.025033
+v -0.689102 0.413040 0.085207
+v -0.675413 0.399193 0.084609
+v -0.675234 0.407946 -0.063942
+v -0.669399 0.407946 -0.093282
+v -0.679278 0.413040 -0.064655
+v -0.679785 0.407946 -0.034376
+v -0.665785 0.399193 -0.062276
+v -0.660031 0.399193 -0.091206
+v -0.673408 0.413040 -0.094171
+v -0.683857 0.413040 -0.034912
+v -0.670272 0.399193 -0.033123
+v -0.644301 0.407946 -0.179387
+v -0.633459 0.407946 -0.207268
+v -0.648160 0.413040 -0.180791
+v -0.653917 0.407946 -0.151060
+v -0.635284 0.399193 -0.176105
+v -0.624595 0.399193 -0.203596
+v -0.637254 0.413040 -0.208839
+v -0.657834 0.413040 -0.152294
+v -0.644766 0.399193 -0.148174
+v -0.593989 0.407946 -0.287502
+v -0.579065 0.407946 -0.312465
+v -0.597549 0.413040 -0.289551
+v -0.608180 0.407946 -0.261479
+v -0.585670 0.399193 -0.282714
+v -0.570934 0.399193 -0.307348
+v -0.582545 0.413040 -0.314655
+v -0.611823 0.413040 -0.263375
+v -0.599669 0.399193 -0.257048
+v -0.499969 0.407879 -0.418765
+v -0.498623 0.407679 -0.420358
+v -0.503130 0.412894 -0.421388
+v -0.503318 0.407946 -0.414684
+v -0.492548 0.399151 -0.412574
+v -0.491230 0.399026 -0.414184
+v -0.501727 0.412456 -0.422894
+v -0.506508 0.413040 -0.417323
+v -0.495867 0.399193 -0.408517
+v -0.498158 0.370299 -0.420980
+v -0.498210 0.357267 -0.420863
+v -0.501384 0.376373 -0.423525
+v -0.498141 0.383558 -0.421019
+v -0.490727 0.359933 -0.414798
+v -0.490807 0.346154 -0.414701
+v -0.501353 0.364229 -0.423352
+v -0.501394 0.389185 -0.423583
+v -0.490701 0.373795 -0.414831
+v -0.499969 0.337065 -0.418765
+v -0.503318 0.336024 -0.414684
+v -0.503130 0.346534 -0.421388
+v -0.498623 0.340187 -0.420358
+v -0.492548 0.324403 -0.412574
+v -0.495867 0.323258 -0.408517
+v -0.506508 0.345694 -0.417323
+v -0.501727 0.349056 -0.422894
+v -0.491230 0.327837 -0.414184
+v -0.593989 0.336024 -0.287502
+v -0.608180 0.336024 -0.261479
+v -0.597549 0.345694 -0.289551
+v -0.579065 0.336024 -0.312465
+v -0.585670 0.323258 -0.282714
+v -0.599669 0.323258 -0.257048
+v -0.611823 0.345694 -0.263375
+v -0.582545 0.345694 -0.314655
+v -0.570934 0.323258 -0.307348
+v -0.644301 0.336024 -0.179386
+v -0.653917 0.336024 -0.151059
+v -0.648160 0.345694 -0.180791
+v -0.633459 0.336024 -0.207268
+v -0.635284 0.323258 -0.176105
+v -0.644766 0.323258 -0.148174
+v -0.657834 0.345694 -0.152294
+v -0.637253 0.345694 -0.208839
+v -0.624595 0.323258 -0.203596
+v -0.675234 0.336024 -0.063942
+v -0.679785 0.336024 -0.034376
+v -0.679278 0.345694 -0.064655
+v -0.669399 0.336024 -0.093282
+v -0.665784 0.323258 -0.062276
+v -0.670272 0.323258 -0.033123
+v -0.683857 0.345694 -0.034912
+v -0.673408 0.345694 -0.094171
+v -0.660031 0.323258 -0.091206
+v -0.685650 0.336024 0.055120
+v -0.684999 0.336025 0.085027
+v -0.689757 0.345694 0.055120
+v -0.684999 0.336024 0.025212
+v -0.676055 0.323258 0.055120
+v -0.675413 0.323258 0.084609
+v -0.689102 0.345694 0.085207
+v -0.689102 0.345694 0.025033
+v -0.675413 0.323258 0.025630
+v -0.675234 0.336025 0.174182
+v -0.669398 0.336025 0.203522
+v -0.679278 0.345694 0.174895
+v -0.679785 0.336025 0.144615
+v -0.665784 0.323258 0.172515
+v -0.660031 0.323258 0.201445
+v -0.673408 0.345694 0.204411
+v -0.683857 0.345694 0.145151
+v -0.670272 0.323258 0.143363
+v -0.644300 0.336025 0.289626
+v -0.633459 0.336025 0.317507
+v -0.648160 0.345694 0.291031
+v -0.653917 0.336025 0.261299
+v -0.635284 0.323258 0.286344
+v -0.624594 0.323258 0.313835
+v -0.637253 0.345694 0.319079
+v -0.657834 0.345694 0.262534
+v -0.644766 0.323258 0.258414
+v -0.593790 0.336025 0.397945
+v -0.578272 0.336025 0.423520
+v -0.597347 0.345694 0.399998
+v -0.608180 0.336025 0.371718
+v -0.585481 0.323258 0.393147
+v -0.570180 0.323258 0.418364
+v -0.581736 0.345694 0.425726
+v -0.611823 0.345694 0.373614
+v -0.599669 0.323258 0.367288
+v -0.525238 0.336025 0.495847
+v -0.505515 0.336025 0.518339
+v -0.528384 0.345694 0.498487
+v -0.543963 0.336025 0.472518
+v -0.517888 0.323258 0.489680
+v -0.498441 0.323258 0.511857
+v -0.508543 0.345694 0.521113
+v -0.547222 0.345694 0.475018
+v -0.536351 0.323258 0.466676
+v -0.440727 0.336025 0.580358
+v -0.417397 0.336025 0.599083
+v -0.443367 0.345694 0.583504
+v -0.463219 0.336025 0.560635
+v -0.434560 0.323258 0.573008
+v -0.411556 0.323258 0.591471
+v -0.419898 0.345694 0.602341
+v -0.465994 0.345694 0.563662
+v -0.456737 0.323258 0.553560
+v -0.342825 0.336025 0.648910
+v -0.316598 0.336025 0.663300
+v -0.344878 0.345694 0.652467
+v -0.368400 0.336025 0.633392
+v -0.338027 0.323258 0.640601
+v -0.312168 0.323258 0.654789
+v -0.318494 0.345694 0.666942
+v -0.370606 0.345694 0.636855
+v -0.363244 0.323258 0.625299
+v -0.234506 0.336025 0.699420
+v -0.206179 0.336025 0.709037
+v -0.235910 0.345694 0.703279
+v -0.262387 0.336025 0.688578
+v -0.231224 0.323258 0.690404
+v -0.203293 0.323258 0.699886
+v -0.207414 0.345694 0.712953
+v -0.263959 0.345694 0.692373
+v -0.258715 0.323258 0.679714
+v -0.119062 0.336025 0.730353
+v -0.089495 0.336025 0.734905
+v -0.119775 0.345694 0.734397
+v -0.148402 0.336025 0.724518
+v -0.117395 0.323258 0.720904
+v -0.088243 0.323258 0.725392
+v -0.090031 0.345694 0.738976
+v -0.149291 0.345694 0.728527
+v -0.146325 0.323258 0.715150
+v -0.277288 0.048802 -0.175257
+v -0.286193 0.048802 -0.163845
+v -0.277643 0.031802 -0.175552
+v -0.269335 0.048801 -0.185000
+v -0.277169 0.065989 -0.175159
+v -0.286071 0.065989 -0.163751
+v -0.286560 0.031802 -0.164125
+v -0.269679 0.031802 -0.185307
+v -0.269220 0.065989 -0.184898
+v -0.277280 0.095390 -0.175251
+v -0.286186 0.095390 -0.163839
+v -0.277169 0.090035 -0.175159
+v -0.269328 0.095390 -0.184995
+v -0.277614 0.097928 -0.175529
+v -0.286530 0.097928 -0.164103
+v -0.286071 0.090035 -0.163751
+v -0.269220 0.090035 -0.184898
+v -0.269653 0.097928 -0.185284
+v -0.280728 0.100651 -0.178116
+v -0.289744 0.100651 -0.166562
+v -0.279394 0.099434 -0.177007
+v -0.272677 0.100651 -0.187980
+v -0.282063 0.103550 -0.179225
+v -0.291122 0.103550 -0.167616
+v -0.288367 0.099434 -0.165508
+v -0.271381 0.099434 -0.186825
+v -0.273974 0.103550 -0.189136
+v -0.284176 0.131029 -0.180980
+v -0.284287 0.146145 -0.181073
+v -0.293303 0.131029 -0.169284
+v -0.283842 0.118510 -0.180703
+v -0.276026 0.131028 -0.190966
+v -0.276134 0.146145 -0.191062
+v -0.293418 0.146145 -0.169372
+v -0.292958 0.118510 -0.169021
+v -0.275702 0.118510 -0.190677
+v -0.284287 0.200351 -0.181073
+v -0.284287 0.217081 -0.181073
+v -0.293418 0.200351 -0.169372
+v -0.284287 0.181889 -0.181073
+v -0.276134 0.200351 -0.191062
+v -0.276134 0.217081 -0.191062
+v -0.293418 0.217081 -0.169372
+v -0.293418 0.181889 -0.169372
+v -0.276134 0.181889 -0.191062
+v -0.388267 0.269642 -0.267075
+v -0.400540 0.269442 -0.251330
+v -0.387075 0.270053 -0.265757
+v -0.377710 0.270241 -0.280029
+v -0.389795 0.270053 -0.267993
+v -0.401984 0.269865 -0.252436
+v -0.399095 0.269865 -0.250225
+v -0.377181 0.270617 -0.278195
+v -0.379583 0.270617 -0.280261
+v -0.461989 0.343513 -0.323911
+v -0.488743 0.365986 -0.344215
+v -0.475889 0.343591 -0.306042
+v -0.435131 0.321344 -0.303661
+v -0.449388 0.343279 -0.338926
+v -0.476217 0.365986 -0.359875
+v -0.502943 0.365986 -0.325630
+v -0.449020 0.321657 -0.286589
+v -0.421593 0.320407 -0.317784
+v -0.532988 0.407946 -0.377906
+v -0.536273 0.413040 -0.380407
+v -0.547925 0.407946 -0.358198
+v -0.525313 0.399193 -0.372062
+v -0.519873 0.407946 -0.394429
+v -0.523114 0.413040 -0.396994
+v -0.551265 0.413040 -0.360616
+v -0.540123 0.399193 -0.352549
+v -0.512301 0.399193 -0.388435
+v -0.537999 0.381816 -0.381721
+v -0.538089 0.395116 -0.381790
+v -0.524817 0.381816 -0.398342
+v -0.537726 0.367956 -0.381514
+v -0.553020 0.381816 -0.361886
+v -0.553112 0.395116 -0.361953
+v -0.524907 0.395116 -0.398413
+v -0.524548 0.367956 -0.398129
+v -0.552743 0.367956 -0.361686
+v -0.532988 0.336024 -0.377906
+v -0.547925 0.336024 -0.358198
+v -0.536273 0.345694 -0.380407
+v -0.519873 0.336024 -0.394429
+v -0.525313 0.323258 -0.372062
+v -0.540123 0.323258 -0.352549
+v -0.551265 0.345694 -0.360616
+v -0.523114 0.345694 -0.396994
+v -0.512301 0.323258 -0.388435
+v -0.462133 0.242885 -0.323953
+v -0.475889 0.242884 -0.306042
+v -0.488743 0.276222 -0.344215
+v -0.449961 0.242884 -0.339093
+v -0.435704 0.208316 -0.303828
+v -0.449020 0.208316 -0.286589
+v -0.502943 0.276222 -0.325630
+v -0.476217 0.276222 -0.359875
+v -0.423884 0.208316 -0.318453
+v -0.396437 0.132350 -0.274097
+v -0.409135 0.132350 -0.257815
+v -0.400587 0.151431 -0.277088
+v -0.385101 0.132350 -0.287993
+v -0.401543 0.118510 -0.278491
+v -0.414439 0.118510 -0.261965
+v -0.413317 0.151431 -0.260740
+v -0.389234 0.151431 -0.291027
+v -0.390027 0.118510 -0.292601
+v -0.469792 0.100745 -0.335194
+v -0.484880 0.100745 -0.315859
+v -0.440482 0.103550 -0.310843
+v -0.456319 0.100745 -0.351702
+v -0.499314 0.099810 -0.359722
+v -0.515350 0.099810 -0.339171
+v -0.454629 0.103550 -0.292714
+v -0.427849 0.103550 -0.326321
+v -0.484994 0.099810 -0.377267
+v -0.548518 0.099716 -0.400601
+v -0.566135 0.099716 -0.378026
+v -0.539947 0.099810 -0.393480
+v -0.532787 0.099716 -0.419876
+v -0.552222 0.099434 -0.403679
+v -0.569957 0.099434 -0.380950
+v -0.557288 0.099810 -0.371257
+v -0.524462 0.099810 -0.412453
+v -0.536385 0.099434 -0.423083
+v -0.554233 0.095390 -0.405349
+v -0.572033 0.095390 -0.382538
+v -0.553915 0.097928 -0.405086
+v -0.538338 0.095390 -0.424824
+v -0.554339 0.090035 -0.405437
+v -0.572142 0.090035 -0.382622
+v -0.571705 0.097928 -0.382288
+v -0.538030 0.097928 -0.424549
+v -0.538441 0.090035 -0.424916
+v -0.554219 0.048801 -0.405338
+v -0.572019 0.048801 -0.382527
+v -0.554339 0.065989 -0.405437
+v -0.538325 0.048801 -0.424813
+v -0.553860 0.031802 -0.405040
+v -0.571647 0.031802 -0.382244
+v -0.572142 0.065989 -0.382622
+v -0.538441 0.065989 -0.424916
+v -0.537978 0.031802 -0.424504
+v -0.358991 0.283161 -0.303480
+v -0.359059 0.285873 -0.303398
+v -0.351248 0.279552 -0.296079
+v -0.358968 0.276682 -0.303507
+v -0.368087 0.289211 -0.311552
+v -0.368156 0.291878 -0.311469
+v -0.351315 0.282253 -0.295999
+v -0.351225 0.273115 -0.296106
+v -0.368064 0.282832 -0.311580
+v -0.429587 0.340387 -0.363482
+v -0.455400 0.363055 -0.385157
+v -0.429661 0.342549 -0.363392
+v -0.403733 0.318291 -0.341738
+v -0.429562 0.335214 -0.363512
+v -0.455374 0.358404 -0.385188
+v -0.455476 0.365000 -0.385064
+v -0.403806 0.320670 -0.341651
+v -0.403709 0.312600 -0.341767
+v -0.498158 0.405569 -0.420980
+v -0.501384 0.410726 -0.423525
+v -0.498210 0.407057 -0.420863
+v -0.490727 0.396714 -0.414798
+v -0.498141 0.401816 -0.421019
+v -0.501394 0.407132 -0.423583
+v -0.490807 0.398359 -0.414701
+v -0.490701 0.392779 -0.414831
+v -0.504741 0.416009 -0.422749
+v -0.504493 0.416708 -0.422526
+v -0.503159 0.415163 -0.424158
+v -0.504824 0.412604 -0.422824
+v -0.508184 0.416291 -0.418710
+v -0.507919 0.416977 -0.418491
+v -0.502956 0.415901 -0.423924
+v -0.503227 0.411740 -0.424236
+v -0.508272 0.412892 -0.418783
+v -0.537999 0.416292 -0.381721
+v -0.537726 0.416977 -0.381514
+v -0.524817 0.416291 -0.398342
+v -0.538089 0.412892 -0.381790
+v -0.553020 0.416292 -0.361886
+v -0.552743 0.416977 -0.361686
+v -0.524548 0.416977 -0.398129
+v -0.524907 0.412892 -0.398413
+v -0.553112 0.412892 -0.361953
+v -0.599420 0.416292 -0.290628
+v -0.599125 0.416977 -0.290458
+v -0.584373 0.416292 -0.315806
+v -0.599519 0.412892 -0.290684
+v -0.613737 0.416292 -0.264372
+v -0.613435 0.416977 -0.264214
+v -0.584085 0.416977 -0.315624
+v -0.584469 0.412892 -0.315866
+v -0.613838 0.412892 -0.264424
+v -0.650188 0.416292 -0.181529
+v -0.649867 0.416977 -0.181413
+v -0.639247 0.416292 -0.209665
+v -0.650294 0.412892 -0.181568
+v -0.659892 0.416292 -0.152943
+v -0.659567 0.416977 -0.152841
+v -0.638932 0.416977 -0.209535
+v -0.639352 0.412892 -0.209709
+v -0.660000 0.412892 -0.152978
+v -0.681403 0.416292 -0.065030
+v -0.681068 0.416977 -0.064971
+v -0.675515 0.416292 -0.094638
+v -0.681515 0.412892 -0.065050
+v -0.685997 0.416292 -0.035193
+v -0.685659 0.416977 -0.035149
+v -0.675182 0.416977 -0.094565
+v -0.675626 0.412892 -0.094663
+v -0.686109 0.412892 -0.035208
+v -0.691915 0.416292 0.055120
+v -0.691574 0.416977 0.055120
+v -0.691257 0.416292 0.024939
+v -0.692029 0.412892 0.055120
+v -0.691257 0.416292 0.085301
+v -0.690917 0.416977 0.085286
+v -0.690917 0.416977 0.024953
+v -0.691371 0.412892 0.024934
+v -0.691371 0.412892 0.085306
+v -0.681403 0.416292 0.175269
+v -0.681068 0.416977 0.175210
+v -0.685997 0.416292 0.145433
+v -0.681515 0.412892 0.175289
+v -0.675515 0.416292 0.204878
+v -0.675182 0.416977 0.204804
+v -0.685659 0.416977 0.145388
+v -0.686109 0.412892 0.145447
+v -0.675626 0.412892 0.204902
+v -0.650187 0.416292 0.291769
+v -0.649867 0.416977 0.291652
+v -0.659892 0.416292 0.263183
+v -0.650294 0.412892 0.291807
+v -0.639247 0.416292 0.319905
+v -0.638932 0.416977 0.319774
+v -0.659567 0.416977 0.263080
+v -0.660000 0.412892 0.263217
+v -0.639352 0.412892 0.319948
+v -0.599216 0.416292 0.401077
+v -0.598921 0.416977 0.400907
+v -0.613737 0.416292 0.374611
+v -0.599314 0.412892 0.401134
+v -0.583556 0.416292 0.426886
+v -0.583268 0.416977 0.426703
+v -0.613435 0.416977 0.374454
+v -0.613838 0.412892 0.374663
+v -0.583652 0.412892 0.426947
+v -0.530037 0.416292 0.499874
+v -0.529776 0.416977 0.499655
+v -0.548934 0.416292 0.476331
+v -0.530124 0.412892 0.499947
+v -0.510134 0.416292 0.522571
+v -0.509882 0.416977 0.522341
+v -0.548663 0.416977 0.476124
+v -0.549024 0.412892 0.476400
+v -0.510217 0.412892 0.522648
+v -0.444754 0.416292 0.585157
+v -0.444535 0.416977 0.584896
+v -0.467451 0.416292 0.565253
+v -0.444827 0.412892 0.585244
+v -0.421211 0.416292 0.604053
+v -0.421004 0.416977 0.603783
+v -0.467221 0.416977 0.565002
+v -0.467528 0.412892 0.565337
+v -0.421280 0.412892 0.604144
+v -0.345957 0.416292 0.654335
+v -0.345787 0.416977 0.654040
+v -0.371766 0.416292 0.638676
+v -0.346014 0.412892 0.654434
+v -0.319491 0.416292 0.668856
+v -0.319333 0.416977 0.668554
+v -0.371583 0.416977 0.638388
+v -0.371827 0.412892 0.638771
+v -0.319543 0.412892 0.668957
+v -0.236648 0.416292 0.705307
+v -0.236532 0.416977 0.704987
+v -0.264784 0.416292 0.694366
+v -0.236687 0.412892 0.705414
+v -0.208063 0.416292 0.715011
+v -0.207960 0.416977 0.714686
+v -0.264654 0.416977 0.694052
+v -0.264828 0.412892 0.694471
+v -0.208097 0.412892 0.715120
+v -0.120149 0.416292 0.736523
+v -0.120090 0.416977 0.736187
+v -0.149758 0.416292 0.730634
+v -0.120169 0.412892 0.736635
+v -0.090313 0.416292 0.741116
+v -0.090268 0.416977 0.740778
+v -0.149684 0.416977 0.730302
+v -0.149782 0.412892 0.730745
+v -0.090328 0.412892 0.741229
+v -0.064502 0.244313 0.420930
+v -0.065560 0.248266 0.426932
+v -0.048484 0.244313 0.423396
+v -0.064149 0.238976 0.418929
+v -0.080397 0.244313 0.417769
+v -0.081716 0.248266 0.423719
+v -0.049280 0.248266 0.429438
+v -0.048219 0.238976 0.421382
+v -0.079958 0.238976 0.415785
+v -0.127045 0.244313 0.404172
+v -0.129129 0.248266 0.409899
+v -0.111698 0.244313 0.409382
+v -0.126350 0.238976 0.402263
+v -0.142149 0.244313 0.398299
+v -0.144482 0.248266 0.403929
+v -0.113531 0.248266 0.415194
+v -0.111087 0.238976 0.407444
+v -0.141372 0.238976 0.396422
+v -0.185727 0.244313 0.376808
+v -0.188774 0.248266 0.382086
+v -0.171518 0.244313 0.384604
+v -0.184711 0.238976 0.375049
+v -0.199582 0.244313 0.368401
+v -0.202857 0.248266 0.373541
+v -0.174333 0.248266 0.390010
+v -0.170580 0.238976 0.382802
+v -0.198491 0.238976 0.366687
+v -0.238766 0.244313 0.339670
+v -0.242683 0.248266 0.344338
+v -0.226127 0.244313 0.349814
+v -0.237460 0.238976 0.338113
+v -0.250951 0.244313 0.328984
+v -0.255068 0.248266 0.333478
+v -0.229837 0.248266 0.354649
+v -0.224890 0.238976 0.348202
+v -0.249578 0.238976 0.327487
+v -0.284550 0.244313 0.293885
+v -0.289219 0.248266 0.297803
+v -0.273865 0.244313 0.306071
+v -0.282994 0.238976 0.292580
+v -0.294694 0.244313 0.281247
+v -0.299530 0.248266 0.284957
+v -0.278358 0.248266 0.310188
+v -0.272367 0.238976 0.304698
+v -0.293083 0.238976 0.280010
+v -0.321688 0.244313 0.240847
+v -0.326967 0.248266 0.243894
+v -0.313281 0.244313 0.254702
+v -0.319929 0.238976 0.239831
+v -0.329484 0.244313 0.226638
+v -0.334890 0.248266 0.229452
+v -0.318422 0.248266 0.257977
+v -0.311568 0.238976 0.253610
+v -0.327682 0.238976 0.225700
+v -0.349052 0.244313 0.182164
+v -0.354780 0.248266 0.184249
+v -0.343179 0.244313 0.197269
+v -0.347143 0.238976 0.181469
+v -0.354262 0.244313 0.166818
+v -0.360075 0.248266 0.168651
+v -0.348810 0.248266 0.199601
+v -0.341302 0.238976 0.196492
+v -0.352325 0.238976 0.166207
+v -0.365811 0.244313 0.119622
+v -0.371813 0.248266 0.120680
+v -0.362649 0.244313 0.135517
+v -0.363810 0.238976 0.119269
+v -0.368277 0.244313 0.103604
+v -0.374319 0.248266 0.104400
+v -0.368600 0.248266 0.136836
+v -0.360666 0.238976 0.135077
+v -0.366262 0.238976 0.103339
+v -0.371454 0.244313 0.055120
+v -0.377549 0.248266 0.055120
+v -0.371101 0.244313 0.071322
+v -0.369422 0.238976 0.055120
+v -0.371101 0.244313 0.038917
+v -0.377190 0.248266 0.038651
+v -0.377190 0.248266 0.071588
+v -0.369071 0.238976 0.071234
+v -0.369071 0.238976 0.039006
+v -0.365811 0.244313 -0.009383
+v -0.371813 0.248266 -0.010441
+v -0.368277 0.244313 0.006635
+v -0.363810 0.238976 -0.009030
+v -0.362650 0.244313 -0.025278
+v -0.368600 0.248266 -0.026597
+v -0.374319 0.248266 0.005840
+v -0.366262 0.238976 0.006900
+v -0.360666 0.238976 -0.024838
+v -0.349053 0.244313 -0.071925
+v -0.354780 0.248266 -0.074010
+v -0.354262 0.244313 -0.056579
+v -0.347143 0.238976 -0.071230
+v -0.343179 0.244313 -0.087030
+v -0.348810 0.248266 -0.089362
+v -0.360075 0.248266 -0.058412
+v -0.352325 0.238976 -0.055968
+v -0.341302 0.238976 -0.086253
+v -0.321705 0.244313 -0.130587
+v -0.326984 0.248266 -0.133634
+v -0.329484 0.244313 -0.116399
+v -0.319946 0.238976 -0.129572
+v -0.313349 0.244313 -0.144383
+v -0.318490 0.248266 -0.147656
+v -0.334890 0.248266 -0.119213
+v -0.327682 0.238976 -0.115461
+v -0.311635 0.238976 -0.143292
+v -0.285850 0.244313 -0.182372
+v -0.290541 0.248266 -0.186268
+v -0.295031 0.244313 -0.170607
+v -0.284287 0.238976 -0.181073
+v -0.277653 0.244313 -0.192416
+v -0.282208 0.248266 -0.196477
+v -0.299872 0.248266 -0.174310
+v -0.293418 0.238976 -0.169372
+v -0.276134 0.238976 -0.191062
+v -0.266491 0.244887 -0.208793
+v -0.270726 0.248778 -0.212974
+v -0.267198 0.244313 -0.204875
+v -0.265080 0.239545 -0.207399
+v -0.269868 0.246608 -0.213996
+v -0.273743 0.250316 -0.217814
+v -0.271582 0.248266 -0.209141
+v -0.265737 0.238976 -0.203453
+v -0.268576 0.241252 -0.212723
+v -0.308681 0.048801 -0.253518
+v -0.326426 0.048801 -0.271261
+v -0.308662 0.065989 -0.253542
+v -0.290945 0.048801 -0.235785
+v -0.308738 0.031802 -0.253446
+v -0.326480 0.031802 -0.271178
+v -0.326408 0.065989 -0.271289
+v -0.290925 0.065989 -0.235806
+v -0.291006 0.031802 -0.235724
+v -0.308603 0.096288 -0.253480
+v -0.308426 0.101517 -0.253294
+v -0.290689 0.096174 -0.235558
+v -0.308662 0.090035 -0.253542
+v -0.326408 0.096325 -0.271289
+v -0.326408 0.101668 -0.271289
+v -0.289981 0.101063 -0.234815
+v -0.290925 0.090035 -0.235806
+v -0.326408 0.090035 -0.271289
+v -0.308707 0.131200 -0.253553
+v -0.308781 0.147359 -0.253625
+v -0.291107 0.130973 -0.235848
+v -0.308485 0.117982 -0.253336
+v -0.326408 0.131352 -0.271289
+v -0.326408 0.147814 -0.271289
+v -0.291403 0.146904 -0.236137
+v -0.290220 0.117528 -0.234980
+v -0.326408 0.118133 -0.271289
+v -0.308781 0.210061 -0.253625
+v -0.308781 0.230433 -0.253625
+v -0.291403 0.206420 -0.236137
+v -0.308781 0.187958 -0.253625
+v -0.326408 0.213703 -0.271289
+v -0.326408 0.235441 -0.271289
+v -0.291403 0.225426 -0.236137
+v -0.291403 0.185682 -0.236137
+v -0.326408 0.190234 -0.271289
+v -0.308941 0.262876 -0.253742
+v -0.309420 0.265468 -0.254094
+v -0.291981 0.255863 -0.236678
+v -0.308781 0.257183 -0.253625
+v -0.326429 0.269993 -0.271264
+v -0.326491 0.272542 -0.271189
+v -0.293716 0.258812 -0.238301
+v -0.291403 0.250355 -0.236137
+v -0.326408 0.264011 -0.271289
+v -0.310305 0.266593 -0.252248
+v -0.312705 0.266670 -0.249476
+v -0.293201 0.259261 -0.235224
+v -0.309726 0.266544 -0.253729
+v -0.327957 0.273953 -0.269970
+v -0.330854 0.274297 -0.268098
+v -0.294964 0.259087 -0.231893
+v -0.293980 0.259784 -0.237987
+v -0.326824 0.273653 -0.270793
+v -0.334353 0.266553 -0.222754
+v -0.345053 0.266523 -0.208878
+v -0.315555 0.259087 -0.207051
+v -0.324878 0.266643 -0.234850
+v -0.353226 0.273830 -0.238690
+v -0.364416 0.273711 -0.223692
+v -0.325689 0.259087 -0.194063
+v -0.306505 0.259087 -0.218139
+v -0.343551 0.274188 -0.252494
+v -0.376249 0.266523 -0.162073
+v -0.385347 0.266523 -0.145479
+v -0.355136 0.259087 -0.149885
+v -0.366476 0.266523 -0.178207
+v -0.397363 0.273711 -0.174261
+v -0.406971 0.273711 -0.156736
+v -0.363723 0.259087 -0.134222
+v -0.345911 0.259087 -0.165114
+v -0.387041 0.273711 -0.191301
+v -0.408233 0.266523 -0.093465
+v -0.414326 0.266523 -0.075517
+v -0.385324 0.259087 -0.085127
+v -0.401364 0.266523 -0.111131
+v -0.431142 0.273711 -0.101803
+v -0.437577 0.273711 -0.082848
+v -0.391076 0.259087 -0.068186
+v -0.378841 0.259087 -0.101801
+v -0.423887 0.273711 -0.120460
+v -0.427832 0.266523 -0.020319
+v -0.430716 0.266523 -0.001585
+v -0.403824 0.259087 -0.016085
+v -0.424135 0.266523 -0.038909
+v -0.451841 0.273711 -0.024552
+v -0.454887 0.273711 -0.004767
+v -0.406546 0.259087 0.001597
+v -0.400334 0.259087 -0.033632
+v -0.447936 0.273711 -0.044186
+v -0.434432 0.266524 0.055120
+v -0.434020 0.266524 0.074069
+v -0.410054 0.259087 0.055120
+v -0.434020 0.266524 0.036170
+v -0.458811 0.273711 0.055120
+v -0.458375 0.273711 0.075133
+v -0.409664 0.259087 0.073006
+v -0.409664 0.259087 0.037233
+v -0.458375 0.273711 0.035106
+v -0.427832 0.266524 0.130558
+v -0.424135 0.266524 0.149148
+v -0.403824 0.259087 0.126325
+v -0.430716 0.266524 0.111824
+v -0.451841 0.273711 0.134791
+v -0.447936 0.273711 0.154425
+v -0.400334 0.259087 0.143872
+v -0.406546 0.259087 0.108642
+v -0.454887 0.273711 0.115006
+v -0.408233 0.266524 0.203704
+v -0.401364 0.266524 0.221370
+v -0.385324 0.259087 0.195366
+v -0.414326 0.266524 0.185756
+v -0.431141 0.273711 0.212042
+v -0.423887 0.273711 0.230699
+v -0.378841 0.259087 0.212041
+v -0.391076 0.259087 0.178425
+v -0.437577 0.273711 0.193087
+v -0.376229 0.266524 0.272336
+v -0.366397 0.266524 0.288540
+v -0.355117 0.259087 0.260146
+v -0.385347 0.266524 0.255718
+v -0.397342 0.273711 0.284525
+v -0.386958 0.273711 0.301639
+v -0.345836 0.259087 0.275442
+v -0.363722 0.259087 0.244461
+v -0.406971 0.273711 0.266975
+v -0.332794 0.266524 0.334367
+v -0.320297 0.266524 0.348618
+v -0.314119 0.259087 0.318697
+v -0.344659 0.266524 0.319586
+v -0.351470 0.273711 0.350038
+v -0.338271 0.273711 0.365088
+v -0.302323 0.259087 0.332148
+v -0.325318 0.259087 0.304745
+v -0.364000 0.273711 0.334426
+v -0.279248 0.266524 0.387914
+v -0.264466 0.266524 0.399778
+v -0.263577 0.259087 0.369239
+v -0.293499 0.266524 0.375417
+v -0.294918 0.273711 0.406589
+v -0.279307 0.273711 0.419119
+v -0.249625 0.259087 0.380437
+v -0.277028 0.259087 0.357443
+v -0.309969 0.273711 0.393391
+v -0.217216 0.266524 0.431349
+v -0.200599 0.266524 0.440466
+v -0.205027 0.259087 0.410236
+v -0.233421 0.266524 0.421516
+v -0.229405 0.273711 0.452462
+v -0.211855 0.273711 0.462091
+v -0.189342 0.259087 0.418842
+v -0.220322 0.259087 0.400956
+v -0.246519 0.273711 0.442077
+v -0.148584 0.266524 0.463352
+v -0.130636 0.266524 0.469446
+v -0.140246 0.259087 0.440444
+v -0.166250 0.266524 0.456483
+v -0.156922 0.273711 0.486261
+v -0.137967 0.273711 0.492696
+v -0.123305 0.259087 0.446195
+v -0.156921 0.259087 0.433960
+v -0.175579 0.273711 0.479006
+v -0.075438 0.266524 0.482952
+v -0.056705 0.266524 0.485836
+v -0.071205 0.259087 0.458943
+v -0.094028 0.266524 0.479255
+v -0.079672 0.273711 0.506960
+v -0.059887 0.273711 0.510006
+v -0.053523 0.259087 0.461665
+v -0.088752 0.259087 0.455454
+v -0.099305 0.273711 0.503055
+v -0.443333 0.285891 -0.200794
+v -0.454050 0.285891 -0.181244
+v -0.440954 0.282807 -0.199424
+v -0.431825 0.285891 -0.219796
+v -0.450470 0.292132 -0.204901
+v -0.461352 0.292132 -0.185045
+v -0.451616 0.282807 -0.179977
+v -0.429499 0.282807 -0.218333
+v -0.438800 0.292132 -0.224187
+v -0.430793 0.283494 -0.193559
+v -0.419603 0.283494 -0.212032
+v -0.432553 0.282807 -0.194575
+v -0.441210 0.283494 -0.174559
+v -0.425515 0.282543 -0.190512
+v -0.414462 0.282543 -0.208759
+v -0.421317 0.282807 -0.213123
+v -0.443012 0.282807 -0.175498
+v -0.435804 0.282543 -0.171745
+v -0.481016 0.285891 -0.119956
+v -0.488196 0.285891 -0.098808
+v -0.478438 0.282807 -0.119017
+v -0.472922 0.285891 -0.140771
+v -0.488752 0.292132 -0.122771
+v -0.496047 0.292132 -0.101283
+v -0.485579 0.282807 -0.097983
+v -0.470387 0.282807 -0.139721
+v -0.480528 0.292132 -0.143922
+v -0.467413 0.283494 -0.115005
+v -0.459548 0.283494 -0.135232
+v -0.469322 0.282807 -0.115700
+v -0.474390 0.283494 -0.094455
+v -0.461686 0.282543 -0.112920
+v -0.453918 0.282543 -0.132899
+v -0.461425 0.282807 -0.136009
+v -0.476327 0.282807 -0.095066
+v -0.468577 0.282543 -0.092622
+v -0.504110 0.285891 -0.033769
+v -0.507508 0.285891 -0.011695
+v -0.501408 0.282807 -0.033292
+v -0.499754 0.285891 -0.055673
+v -0.512217 0.292132 -0.035198
+v -0.515670 0.292132 -0.012769
+v -0.504787 0.282807 -0.011337
+v -0.497075 0.282807 -0.055079
+v -0.507790 0.292132 -0.057455
+v -0.489854 0.283494 -0.031255
+v -0.485621 0.283494 -0.052540
+v -0.491855 0.282807 -0.031608
+v -0.493156 0.283494 -0.009806
+v -0.483852 0.282543 -0.030197
+v -0.479671 0.282543 -0.051221
+v -0.487604 0.282807 -0.052980
+v -0.495170 0.282807 -0.010071
+v -0.487114 0.282543 -0.009010
+v -0.511886 0.285891 0.055120
+v -0.511400 0.285891 0.077448
+v -0.509143 0.282807 0.055120
+v -0.511400 0.285891 0.032791
+v -0.520119 0.292132 0.055120
+v -0.519624 0.292132 0.077807
+v -0.508659 0.282807 0.077328
+v -0.508659 0.282807 0.032911
+v -0.519624 0.292132 0.032432
+v -0.497411 0.283494 0.055120
+v -0.496938 0.283494 0.033423
+v -0.499442 0.282807 0.055120
+v -0.496938 0.283494 0.076816
+v -0.491316 0.282543 0.055120
+v -0.490849 0.282543 0.033689
+v -0.498968 0.282807 0.033334
+v -0.498968 0.282807 0.076905
+v -0.490849 0.282543 0.076551
+v -0.504110 0.285891 0.144008
+v -0.499753 0.285891 0.165912
+v -0.501407 0.282807 0.143531
+v -0.507508 0.285891 0.121934
+v -0.512217 0.292132 0.145437
+v -0.507790 0.292132 0.167694
+v -0.497074 0.282807 0.165318
+v -0.504787 0.282807 0.121576
+v -0.515670 0.292132 0.123009
+v -0.489854 0.283494 0.141494
+v -0.493156 0.283494 0.120045
+v -0.491855 0.282807 0.141847
+v -0.485621 0.283494 0.162779
+v -0.483852 0.282543 0.140436
+v -0.487114 0.282543 0.119249
+v -0.495170 0.282807 0.120310
+v -0.487604 0.282807 0.163219
+v -0.479671 0.282543 0.161460
+v -0.481016 0.285891 0.230195
+v -0.472922 0.285891 0.251010
+v -0.478437 0.282807 0.229257
+v -0.488195 0.285891 0.209047
+v -0.488752 0.292132 0.233011
+v -0.480527 0.292132 0.254161
+v -0.470387 0.282807 0.249960
+v -0.485578 0.282807 0.208222
+v -0.496047 0.292132 0.211522
+v -0.467413 0.283494 0.225244
+v -0.474390 0.283494 0.204694
+v -0.469322 0.282807 0.225939
+v -0.459548 0.283494 0.245471
+v -0.461686 0.282543 0.223160
+v -0.468577 0.282543 0.202861
+v -0.476327 0.282807 0.205305
+v -0.461425 0.282807 0.246248
+v -0.453917 0.282543 0.243139
+v -0.443307 0.285891 0.311063
+v -0.431721 0.285891 0.330157
+v -0.440930 0.282807 0.309691
+v -0.454049 0.285891 0.291483
+v -0.450436 0.292132 0.315179
+v -0.438664 0.292132 0.334580
+v -0.429407 0.282807 0.328682
+v -0.451615 0.282807 0.290216
+v -0.461351 0.292132 0.295284
+v -0.430770 0.283494 0.303825
+v -0.441209 0.283494 0.284799
+v -0.432530 0.282807 0.304841
+v -0.419512 0.283494 0.322379
+v -0.425492 0.282543 0.300778
+v -0.435803 0.282543 0.281984
+v -0.443011 0.282807 0.285737
+v -0.421226 0.282807 0.323470
+v -0.414372 0.282543 0.319104
+v -0.392128 0.285891 0.384154
+v -0.377403 0.285891 0.400946
+v -0.390026 0.282807 0.382390
+v -0.406107 0.285891 0.366737
+v -0.398434 0.292132 0.389445
+v -0.383472 0.292132 0.406507
+v -0.375380 0.282807 0.399092
+v -0.403930 0.282807 0.365066
+v -0.412638 0.292132 0.371748
+v -0.381039 0.283494 0.374849
+v -0.394623 0.283494 0.357924
+v -0.382595 0.282807 0.376155
+v -0.366730 0.283494 0.391166
+v -0.376370 0.282543 0.370932
+v -0.389788 0.282543 0.354214
+v -0.396235 0.282807 0.359161
+v -0.368228 0.282807 0.392538
+v -0.362237 0.282543 0.387048
+v -0.329034 0.285891 0.447247
+v -0.311617 0.285891 0.461227
+v -0.327270 0.282807 0.445145
+v -0.345826 0.285891 0.432522
+v -0.334326 0.292132 0.453553
+v -0.316628 0.292132 0.467758
+v -0.309946 0.282807 0.459050
+v -0.343972 0.282807 0.430499
+v -0.351387 0.292132 0.438592
+v -0.319729 0.283494 0.436158
+v -0.336046 0.283494 0.421850
+v -0.321035 0.282807 0.437715
+v -0.302805 0.283494 0.449743
+v -0.315812 0.282543 0.431490
+v -0.331929 0.282543 0.417356
+v -0.337419 0.282807 0.423348
+v -0.304041 0.282807 0.451354
+v -0.299094 0.282543 0.444907
+v -0.255943 0.285891 0.498426
+v -0.236363 0.285891 0.509169
+v -0.254571 0.282807 0.496050
+v -0.275037 0.285891 0.486841
+v -0.260059 0.292132 0.505555
+v -0.240164 0.292132 0.516471
+v -0.235096 0.282807 0.506735
+v -0.273562 0.282807 0.484526
+v -0.279460 0.292132 0.493784
+v -0.248705 0.283494 0.485890
+v -0.267259 0.283494 0.474632
+v -0.249721 0.282807 0.487649
+v -0.229679 0.283494 0.496329
+v -0.245658 0.282543 0.480612
+v -0.263984 0.282543 0.469492
+v -0.268350 0.282807 0.476345
+v -0.230617 0.282807 0.498131
+v -0.226865 0.282543 0.490923
+v -0.175075 0.285891 0.536135
+v -0.153927 0.285891 0.543315
+v -0.174137 0.282807 0.533557
+v -0.195891 0.285891 0.528042
+v -0.177891 0.292132 0.543871
+v -0.156403 0.292132 0.551166
+v -0.153102 0.282807 0.540698
+v -0.194840 0.282807 0.525506
+v -0.199041 0.292132 0.535647
+v -0.170124 0.283494 0.522533
+v -0.190351 0.283494 0.514668
+v -0.170819 0.282807 0.524442
+v -0.149574 0.283494 0.529509
+v -0.168040 0.282543 0.516806
+v -0.188019 0.282543 0.509037
+v -0.191128 0.282807 0.516545
+v -0.150185 0.282807 0.531447
+v -0.147741 0.282543 0.523697
+v -0.088888 0.285891 0.559229
+v -0.066814 0.285891 0.562627
+v -0.088411 0.282807 0.556527
+v -0.110793 0.285891 0.554873
+v -0.090317 0.292132 0.567336
+v -0.067889 0.292132 0.570789
+v -0.066456 0.282807 0.559907
+v -0.110199 0.282807 0.552194
+v -0.112574 0.292132 0.562910
+v -0.086374 0.283494 0.544973
+v -0.107659 0.283494 0.540740
+v -0.086727 0.282807 0.546974
+v -0.064925 0.283494 0.548275
+v -0.085316 0.282543 0.538971
+v -0.106340 0.282543 0.534790
+v -0.108099 0.282807 0.542724
+v -0.065190 0.282807 0.550290
+v -0.064129 0.282543 0.542233
+v -0.393785 0.285813 -0.271915
+v -0.406623 0.285891 -0.255893
+v -0.391723 0.282807 -0.270269
+v -0.381867 0.285578 -0.285247
+v -0.399972 0.291820 -0.276854
+v -0.413317 0.292132 -0.260740
+v -0.404392 0.282807 -0.254278
+v -0.380231 0.282807 -0.283632
+v -0.386773 0.290883 -0.290089
+v -0.361436 0.284200 -0.299515
+v -0.365069 0.284683 -0.299345
+v -0.361481 0.282807 -0.299370
+v -0.361214 0.283916 -0.295801
+v -0.361299 0.285369 -0.299950
+v -0.366654 0.287302 -0.301712
+v -0.364540 0.282807 -0.298556
+v -0.361879 0.282807 -0.296063
+v -0.359220 0.284233 -0.295012
+v -0.382932 0.283523 -0.263090
+v -0.372410 0.283613 -0.277100
+v -0.384474 0.282807 -0.264282
+v -0.395074 0.283494 -0.247148
+v -0.378306 0.282662 -0.259512
+v -0.368110 0.283020 -0.274315
+v -0.373844 0.282807 -0.278028
+v -0.396687 0.282807 -0.248383
+v -0.390233 0.282543 -0.243445
+v -0.384671 0.275862 -0.264276
+v -0.374279 0.275924 -0.277719
+v -0.385262 0.273331 -0.264260
+v -0.396808 0.275842 -0.248475
+v -0.384474 0.278545 -0.264282
+v -0.373844 0.278545 -0.278028
+v -0.375584 0.273578 -0.276793
+v -0.397169 0.273249 -0.248751
+v -0.396687 0.278545 -0.248383
+v -0.362297 0.275883 -0.298397
+v -0.365268 0.275924 -0.297597
+v -0.364746 0.273414 -0.295479
+v -0.362688 0.275924 -0.295191
+v -0.361481 0.278545 -0.299370
+v -0.364540 0.278545 -0.298556
+v -0.367451 0.273578 -0.294721
+v -0.365115 0.273578 -0.292575
+v -0.361879 0.278545 -0.296063
+v -0.391694 0.275862 -0.270074
+v -0.404271 0.275842 -0.254185
+v -0.391607 0.273331 -0.269490
+v -0.380469 0.275924 -0.283140
+v -0.391723 0.278545 -0.270269
+v -0.404392 0.278545 -0.254278
+v -0.403910 0.273249 -0.253909
+v -0.381180 0.273578 -0.281663
+v -0.380231 0.278545 -0.283632
+v -0.440822 0.275842 -0.199348
+v -0.451481 0.275842 -0.179907
+v -0.440428 0.273249 -0.199121
+v -0.429371 0.275842 -0.218252
+v -0.440954 0.278545 -0.199424
+v -0.451616 0.278545 -0.179977
+v -0.451078 0.273249 -0.179697
+v -0.428988 0.273249 -0.218007
+v -0.429499 0.278545 -0.218333
+v -0.478295 0.275842 -0.118966
+v -0.485434 0.275842 -0.097937
+v -0.477868 0.273249 -0.118810
+v -0.470247 0.275842 -0.139663
+v -0.478438 0.278545 -0.119017
+v -0.485579 0.278545 -0.097983
+v -0.485000 0.273249 -0.097800
+v -0.469827 0.273249 -0.139489
+v -0.470387 0.278545 -0.139721
+v -0.501258 0.275842 -0.033266
+v -0.504637 0.275842 -0.011317
+v -0.500811 0.273249 -0.033187
+v -0.496927 0.275842 -0.055046
+v -0.501408 0.278545 -0.033292
+v -0.504787 0.278545 -0.011337
+v -0.504186 0.273249 -0.011258
+v -0.496483 0.273249 -0.054948
+v -0.497074 0.278545 -0.055079
+v -0.508991 0.275842 0.055120
+v -0.508507 0.275842 0.077322
+v -0.508536 0.273249 0.055120
+v -0.508507 0.275842 0.032918
+v -0.509143 0.278545 0.055120
+v -0.508659 0.278545 0.077328
+v -0.508053 0.273249 0.077302
+v -0.508053 0.273249 0.032937
+v -0.508659 0.278545 0.032911
+v -0.501258 0.275842 0.143505
+v -0.496926 0.275842 0.165286
+v -0.500810 0.273249 0.143426
+v -0.504637 0.275842 0.121556
+v -0.501407 0.278545 0.143531
+v -0.497074 0.278545 0.165318
+v -0.496483 0.273249 0.165187
+v -0.504186 0.273249 0.121497
+v -0.504787 0.278545 0.121576
+v -0.478295 0.275842 0.229205
+v -0.470247 0.275842 0.249902
+v -0.477868 0.273249 0.229049
+v -0.485434 0.275842 0.208176
+v -0.478437 0.278545 0.229257
+v -0.470387 0.278545 0.249960
+v -0.469827 0.273249 0.249728
+v -0.485000 0.273249 0.208040
+v -0.485578 0.278545 0.208222
+v -0.440799 0.275842 0.309615
+v -0.429279 0.275842 0.328601
+v -0.440405 0.273249 0.309388
+v -0.451481 0.275842 0.290146
+v -0.440930 0.278545 0.309691
+v -0.429407 0.278545 0.328682
+v -0.428896 0.273249 0.328356
+v -0.451078 0.273249 0.289936
+v -0.451615 0.278545 0.290216
+v -0.389910 0.275842 0.382293
+v -0.375268 0.275842 0.398989
+v -0.389561 0.273249 0.382000
+v -0.403810 0.275842 0.364974
+v -0.390026 0.278545 0.382390
+v -0.375380 0.278545 0.399092
+v -0.374933 0.273249 0.398682
+v -0.403449 0.273249 0.364697
+v -0.403930 0.278545 0.365066
+v -0.327173 0.275842 0.445029
+v -0.309854 0.275842 0.458930
+v -0.326881 0.273249 0.444681
+v -0.343870 0.275842 0.430387
+v -0.327270 0.278545 0.445145
+v -0.309946 0.278545 0.459050
+v -0.309577 0.273249 0.458569
+v -0.343562 0.273249 0.430052
+v -0.343972 0.278545 0.430499
+v -0.254495 0.275842 0.495919
+v -0.235026 0.275842 0.506601
+v -0.254268 0.273249 0.495525
+v -0.273481 0.275842 0.484399
+v -0.254571 0.278545 0.496050
+v -0.235096 0.278545 0.506735
+v -0.234816 0.273249 0.506197
+v -0.273237 0.273249 0.484015
+v -0.273562 0.278545 0.484526
+v -0.174085 0.275842 0.533414
+v -0.153056 0.275842 0.540553
+v -0.173929 0.273249 0.532987
+v -0.194782 0.275842 0.525366
+v -0.174137 0.278545 0.533557
+v -0.153102 0.278545 0.540698
+v -0.152920 0.273249 0.540120
+v -0.194608 0.273249 0.524946
+v -0.194840 0.278545 0.525506
+v -0.088385 0.275842 0.556378
+v -0.066437 0.275842 0.559756
+v -0.088306 0.273249 0.555930
+v -0.110166 0.275842 0.552046
+v -0.088411 0.278545 0.556527
+v -0.066456 0.278545 0.559907
+v -0.066377 0.273249 0.559306
+v -0.110067 0.273249 0.551602
+v -0.110199 0.278545 0.552194
+v -0.086753 0.275842 0.547123
+v -0.108132 0.275842 0.542872
+v -0.086832 0.273249 0.547571
+v -0.065210 0.275842 0.550440
+v -0.086727 0.278545 0.546974
+v -0.108099 0.278545 0.542724
+v -0.108230 0.273249 0.543316
+v -0.065269 0.273249 0.550891
+v -0.065190 0.278545 0.550290
+v -0.170871 0.275842 0.524584
+v -0.191186 0.275842 0.516685
+v -0.171026 0.273249 0.525012
+v -0.150231 0.275842 0.531591
+v -0.170819 0.278545 0.524442
+v -0.191128 0.278545 0.516545
+v -0.191360 0.273249 0.517105
+v -0.150367 0.273249 0.532025
+v -0.150185 0.278545 0.531447
+v -0.249797 0.275842 0.487781
+v -0.268432 0.275842 0.476473
+v -0.250024 0.273249 0.488174
+v -0.230687 0.275842 0.498265
+v -0.249721 0.278545 0.487649
+v -0.268350 0.278545 0.476345
+v -0.268676 0.273249 0.476857
+v -0.230897 0.273249 0.498669
+v -0.230617 0.278545 0.498131
+v -0.321133 0.275842 0.437831
+v -0.337521 0.275842 0.423459
+v -0.321425 0.273249 0.438179
+v -0.304134 0.275842 0.451475
+v -0.321035 0.278545 0.437715
+v -0.337419 0.278545 0.423348
+v -0.337828 0.273249 0.423795
+v -0.304410 0.273249 0.451835
+v -0.304041 0.278545 0.451354
+v -0.382711 0.275842 0.376252
+v -0.396355 0.275842 0.359253
+v -0.383059 0.273249 0.376545
+v -0.368340 0.275842 0.392641
+v -0.382595 0.278545 0.376155
+v -0.396235 0.278545 0.359161
+v -0.396716 0.273249 0.359530
+v -0.368675 0.273249 0.392948
+v -0.368228 0.278545 0.392538
+v -0.432661 0.275842 0.304917
+v -0.443146 0.275842 0.285807
+v -0.433055 0.273249 0.305144
+v -0.421354 0.275842 0.323552
+v -0.432530 0.278545 0.304841
+v -0.443011 0.278545 0.285737
+v -0.443549 0.273249 0.286017
+v -0.421737 0.273249 0.323796
+v -0.421226 0.278545 0.323470
+v -0.469465 0.275842 0.225991
+v -0.476472 0.275842 0.205351
+v -0.469892 0.273249 0.226146
+v -0.461565 0.275842 0.246306
+v -0.469322 0.278545 0.225939
+v -0.476327 0.278545 0.205305
+v -0.476905 0.273249 0.205487
+v -0.461985 0.273249 0.246480
+v -0.461425 0.278545 0.246248
+v -0.492004 0.275842 0.141873
+v -0.495321 0.275842 0.120330
+v -0.492452 0.273249 0.141952
+v -0.487752 0.275842 0.163252
+v -0.491855 0.278545 0.141847
+v -0.495170 0.278545 0.120310
+v -0.495771 0.273249 0.120389
+v -0.488196 0.273249 0.163350
+v -0.487604 0.278545 0.163219
+v -0.499594 0.275842 0.055120
+v -0.499119 0.275842 0.033328
+v -0.500049 0.273249 0.055120
+v -0.499119 0.275842 0.076912
+v -0.499442 0.278545 0.055120
+v -0.498968 0.278545 0.033334
+v -0.499573 0.273249 0.033308
+v -0.499573 0.273249 0.076932
+v -0.498968 0.278545 0.076905
+v -0.492004 0.275842 -0.031634
+v -0.487752 0.275842 -0.053013
+v -0.492452 0.273249 -0.031713
+v -0.495321 0.275842 -0.010090
+v -0.491855 0.278545 -0.031608
+v -0.487604 0.278545 -0.052980
+v -0.488196 0.273249 -0.053111
+v -0.495771 0.273249 -0.010150
+v -0.495170 0.278545 -0.010071
+v -0.469465 0.275842 -0.115752
+v -0.461565 0.275842 -0.136067
+v -0.469892 0.273249 -0.115907
+v -0.476472 0.275842 -0.095111
+v -0.469323 0.278545 -0.115700
+v -0.461425 0.278545 -0.136009
+v -0.461985 0.273249 -0.136241
+v -0.476906 0.273249 -0.095248
+v -0.476327 0.278545 -0.095066
+v -0.432684 0.275842 -0.194651
+v -0.421445 0.275842 -0.213205
+v -0.433078 0.273249 -0.194878
+v -0.443146 0.275842 -0.175568
+v -0.432553 0.278545 -0.194575
+v -0.421317 0.278545 -0.213123
+v -0.421828 0.273249 -0.213449
+v -0.443549 0.273249 -0.175777
+v -0.443012 0.278545 -0.175498
+v -0.000000 0.095391 0.775328
+v -0.000000 0.090035 0.775465
+v 0.031415 0.095391 0.774643
+v -0.000000 0.097928 0.774915
+v -0.031415 0.095391 0.774643
+v -0.031421 0.090035 0.774780
+v 0.031421 0.090035 0.774780
+v 0.031397 0.097928 0.774231
+v -0.031397 0.097928 0.774231
+v 0.125063 0.095391 0.764386
+v 0.125087 0.090035 0.764521
+v 0.155882 0.095391 0.758257
+v 0.124991 0.097928 0.763979
+v 0.094006 0.095391 0.769167
+v 0.094024 0.090035 0.769303
+v 0.155911 0.090035 0.758391
+v 0.155792 0.097928 0.757854
+v 0.093952 0.097928 0.768758
+v 0.246326 0.095391 0.731894
+v 0.246373 0.090035 0.732023
+v 0.275612 0.095391 0.720506
+v 0.246184 0.097928 0.731506
+v 0.216571 0.095391 0.741995
+v 0.216612 0.090035 0.742126
+v 0.275665 0.090035 0.720633
+v 0.275454 0.097928 0.720125
+v 0.216447 0.097928 0.741602
+v 0.360104 0.095391 0.678838
+v 0.360173 0.090035 0.678957
+v 0.386968 0.095391 0.662538
+v 0.359898 0.097928 0.678481
+v 0.332555 0.095391 0.693953
+v 0.332619 0.090035 0.694075
+v 0.387042 0.090035 0.662654
+v 0.386746 0.097928 0.662190
+v 0.332365 0.097928 0.693587
+v 0.462941 0.095391 0.606831
+v 0.463029 0.090035 0.606936
+v 0.486566 0.095391 0.586113
+v 0.462676 0.097928 0.606515
+v 0.438435 0.095391 0.626500
+v 0.438519 0.090035 0.626609
+v 0.486659 0.090035 0.586215
+v 0.486287 0.097928 0.585809
+v 0.438184 0.097928 0.626173
+v 0.551711 0.095391 0.518060
+v 0.551817 0.090035 0.518149
+v 0.571380 0.095391 0.493555
+v 0.551395 0.097928 0.517795
+v 0.530994 0.095391 0.541686
+v 0.531095 0.090035 0.541779
+v 0.571489 0.090035 0.493639
+v 0.571053 0.097928 0.493304
+v 0.530689 0.097928 0.541407
+v 0.623718 0.095391 0.415224
+v 0.623838 0.090035 0.415292
+v 0.638833 0.095390 0.387675
+v 0.623361 0.097928 0.415017
+v 0.607418 0.095391 0.442088
+v 0.607534 0.090035 0.442162
+v 0.638955 0.090035 0.387738
+v 0.638467 0.097928 0.387484
+v 0.607070 0.097928 0.441866
+v 0.676774 0.095390 0.301445
+v 0.676903 0.090035 0.301492
+v 0.686876 0.095390 0.271690
+v 0.676386 0.097928 0.301304
+v 0.665386 0.095390 0.330732
+v 0.665513 0.090035 0.330784
+v 0.687007 0.090035 0.271732
+v 0.686482 0.097928 0.271566
+v 0.665005 0.097928 0.330574
+v 0.709267 0.095390 0.180182
+v 0.709402 0.090035 0.180206
+v 0.714048 0.095390 0.149126
+v 0.708860 0.097928 0.180111
+v 0.703137 0.095390 0.211001
+v 0.703272 0.090035 0.211031
+v 0.714184 0.090035 0.149144
+v 0.713639 0.097928 0.149072
+v 0.702735 0.097928 0.210912
+v 0.720208 0.095390 0.055120
+v 0.720346 0.090035 0.055120
+v 0.719524 0.095390 0.023704
+v 0.719796 0.097928 0.055120
+v 0.719524 0.095390 0.086535
+v 0.719661 0.090035 0.086541
+v 0.719661 0.090035 0.023698
+v 0.719112 0.097928 0.023722
+v 0.719112 0.097928 0.086517
+v 0.709267 0.095390 -0.069943
+v 0.709402 0.090035 -0.069967
+v 0.703137 0.095390 -0.100762
+v 0.708860 0.097928 -0.069872
+v 0.714048 0.095390 -0.038887
+v 0.714184 0.090035 -0.038904
+v 0.703272 0.090035 -0.100792
+v 0.702735 0.097928 -0.100673
+v 0.713639 0.097928 -0.038833
+v 0.676774 0.095390 -0.191206
+v 0.676904 0.090035 -0.191253
+v 0.665387 0.095390 -0.220493
+v 0.676387 0.097928 -0.191065
+v 0.686876 0.095390 -0.161451
+v 0.687007 0.090035 -0.161493
+v 0.665514 0.090035 -0.220545
+v 0.665005 0.097928 -0.220335
+v 0.686482 0.097928 -0.161327
+v 0.623751 0.095390 -0.304946
+v 0.623870 0.090035 -0.305015
+v 0.607549 0.095390 -0.331693
+v 0.623394 0.097928 -0.304740
+v 0.638834 0.095390 -0.277436
+v 0.638956 0.090035 -0.277500
+v 0.607665 0.090035 -0.331767
+v 0.607201 0.097928 -0.331472
+v 0.638468 0.097928 -0.277246
+v 0.513882 0.095381 -0.453762
+v 0.513974 0.090035 -0.453861
+v 0.511980 0.095354 -0.455403
+v 0.513605 0.097892 -0.453467
+v 0.518068 0.095390 -0.448982
+v 0.518167 0.090035 -0.449078
+v 0.512055 0.090035 -0.455505
+v 0.511757 0.097782 -0.455098
+v 0.517771 0.097928 -0.448693
+v -0.000000 0.099716 0.767901
+v -0.000000 0.099434 0.772714
+v 0.031091 0.099716 0.767224
+v -0.000000 0.099810 0.756763
+v -0.031091 0.099716 0.767224
+v -0.031301 0.099434 0.772032
+v 0.031301 0.099434 0.772032
+v 0.030605 0.099810 0.756096
+v -0.030605 0.099810 0.756096
+v 0.123773 0.099716 0.757072
+v 0.124609 0.099434 0.761812
+v 0.154274 0.099716 0.751006
+v 0.121839 0.099810 0.746104
+v 0.093037 0.099716 0.761804
+v 0.093665 0.099434 0.766576
+v 0.155316 0.099434 0.755705
+v 0.151864 0.099810 0.740132
+v 0.091583 0.099810 0.750762
+v 0.243786 0.099716 0.724915
+v 0.245432 0.099434 0.729438
+v 0.272770 0.099716 0.713645
+v 0.239976 0.099810 0.714449
+v 0.214338 0.099716 0.734912
+v 0.215785 0.099434 0.739503
+v 0.274612 0.099434 0.718092
+v 0.268508 0.099810 0.703355
+v 0.210988 0.099810 0.724290
+v 0.356391 0.099716 0.672407
+v 0.358797 0.099434 0.676575
+v 0.382978 0.099716 0.656274
+v 0.350822 0.099810 0.662761
+v 0.329126 0.099716 0.687366
+v 0.331349 0.099434 0.691635
+v 0.385564 0.099434 0.660334
+v 0.376993 0.099810 0.646881
+v 0.323983 0.099810 0.677486
+v 0.458167 0.099716 0.601142
+v 0.461261 0.099434 0.604829
+v 0.481549 0.099716 0.580638
+v 0.451008 0.099810 0.592610
+v 0.433914 0.099716 0.620608
+v 0.436844 0.099434 0.624427
+v 0.484801 0.099434 0.584187
+v 0.474024 0.099810 0.572426
+v 0.427134 0.099810 0.611772
+v 0.546023 0.099716 0.513287
+v 0.549709 0.099434 0.516381
+v 0.565489 0.099716 0.489034
+v 0.537490 0.099810 0.506127
+v 0.525518 0.099716 0.536669
+v 0.529067 0.099434 0.539920
+v 0.569307 0.099434 0.491964
+v 0.556652 0.099810 0.482254
+v 0.517307 0.099810 0.529144
+v 0.617287 0.099716 0.411510
+v 0.621455 0.099434 0.413917
+v 0.632246 0.099716 0.384246
+v 0.607641 0.099810 0.405941
+v 0.601155 0.099716 0.438098
+v 0.605214 0.099434 0.440684
+v 0.636515 0.099434 0.386468
+v 0.622367 0.099810 0.379103
+v 0.591761 0.099810 0.432113
+v 0.669796 0.099716 0.298905
+v 0.674319 0.099434 0.300551
+v 0.679793 0.099716 0.269457
+v 0.659330 0.099810 0.295096
+v 0.658525 0.099716 0.327890
+v 0.662972 0.099434 0.329732
+v 0.684383 0.099434 0.270905
+v 0.669171 0.099810 0.266108
+v 0.648235 0.099810 0.323627
+v 0.701953 0.099716 0.178893
+v 0.706693 0.099434 0.179729
+v 0.706685 0.099716 0.148156
+v 0.690984 0.099810 0.176959
+v 0.695887 0.099716 0.209394
+v 0.700586 0.099434 0.210436
+v 0.711457 0.099434 0.148784
+v 0.695642 0.099810 0.146702
+v 0.685013 0.099810 0.206983
+v 0.712782 0.099716 0.055120
+v 0.717595 0.099434 0.055120
+v 0.712105 0.099716 0.024028
+v 0.701644 0.099810 0.055120
+v 0.712105 0.099716 0.086211
+v 0.716913 0.099434 0.086421
+v 0.716913 0.099434 0.023818
+v 0.700977 0.099810 0.024514
+v 0.700977 0.099810 0.085725
+v 0.701953 0.099716 -0.068654
+v 0.706693 0.099434 -0.069490
+v 0.695887 0.099716 -0.099155
+v 0.690984 0.099810 -0.066720
+v 0.706685 0.099716 -0.037917
+v 0.711457 0.099434 -0.038545
+v 0.700586 0.099434 -0.100197
+v 0.685013 0.099810 -0.096744
+v 0.695642 0.099810 -0.036463
+v 0.669796 0.099716 -0.188666
+v 0.674319 0.099434 -0.190312
+v 0.658526 0.099716 -0.217651
+v 0.659330 0.099810 -0.184857
+v 0.679793 0.099716 -0.159218
+v 0.684384 0.099434 -0.160666
+v 0.662972 0.099434 -0.219493
+v 0.648235 0.099810 -0.213389
+v 0.669171 0.099810 -0.155869
+v 0.617320 0.099716 -0.301233
+v 0.621488 0.099434 -0.303639
+v 0.601284 0.099716 -0.327705
+v 0.607673 0.099810 -0.295665
+v 0.632246 0.099716 -0.274007
+v 0.636515 0.099434 -0.276229
+v 0.605344 0.099434 -0.330290
+v 0.591888 0.099810 -0.321723
+v 0.622367 0.099810 -0.268864
+v 0.508667 0.099624 -0.448600
+v 0.512083 0.099350 -0.451961
+v 0.507039 0.099350 -0.450477
+v 0.500725 0.099716 -0.440741
+v 0.512726 0.099716 -0.443784
+v 0.516188 0.099434 -0.447153
+v 0.510387 0.099099 -0.453732
+v 0.499141 0.099434 -0.442629
+v 0.504714 0.099810 -0.435988
+v 0.506474 0.095381 -0.451214
+v 0.509960 0.095354 -0.454491
+v 0.506452 0.090035 -0.451261
+v 0.498537 0.095390 -0.443348
+v 0.506539 0.097892 -0.451073
+v 0.509933 0.097782 -0.454274
+v 0.509969 0.090035 -0.454564
+v 0.498506 0.090035 -0.443386
+v 0.498633 0.097928 -0.443235
+v 0.433558 0.095469 -0.378381
+v 0.461021 0.095390 -0.405837
+v 0.433628 0.090035 -0.378508
+v 0.405881 0.095706 -0.350714
+v 0.433349 0.098244 -0.377997
+v 0.461109 0.097928 -0.405732
+v 0.460992 0.090035 -0.405872
+v 0.406244 0.090035 -0.351125
+v 0.404790 0.099193 -0.349482
+v 0.435556 0.100613 -0.376207
+v 0.463044 0.099716 -0.403426
+v 0.433845 0.100217 -0.377523
+v 0.408042 0.103304 -0.348964
+v 0.439137 0.100745 -0.372179
+v 0.466732 0.099810 -0.399031
+v 0.461579 0.099434 -0.405172
+v 0.405420 0.102568 -0.349203
+v 0.411739 0.103550 -0.345520
+v 0.528719 0.100745 -0.250088
+v 0.561944 0.099810 -0.269267
+v 0.514985 0.100745 -0.272760
+v 0.495733 0.103550 -0.231046
+v 0.541504 0.100745 -0.226769
+v 0.575532 0.099810 -0.244483
+v 0.547347 0.099810 -0.293364
+v 0.482855 0.103550 -0.252304
+v 0.507719 0.103550 -0.209182
+v 0.573664 0.100745 -0.153677
+v 0.609713 0.099810 -0.166798
+v 0.564011 0.100745 -0.178502
+v 0.537873 0.103550 -0.140650
+v 0.582226 0.100745 -0.128456
+v 0.618814 0.099810 -0.139992
+v 0.599454 0.099810 -0.193182
+v 0.528823 0.103550 -0.163926
+v 0.545901 0.103550 -0.117002
+v 0.601206 0.100745 -0.050889
+v 0.638986 0.099810 -0.057551
+v 0.596010 0.100745 -0.077013
+v 0.563697 0.103550 -0.044275
+v 0.605258 0.100745 -0.024564
+v 0.643293 0.099810 -0.029572
+v 0.633464 0.099810 -0.085316
+v 0.558825 0.103550 -0.068769
+v 0.567497 0.103550 -0.019593
+v 0.610480 0.100745 0.055120
+v 0.648843 0.099810 0.055120
+v 0.609900 0.100745 0.028491
+v 0.572393 0.103550 0.055120
+v 0.609900 0.100745 0.081748
+v 0.648226 0.099810 0.083422
+v 0.648226 0.099810 0.026817
+v 0.571849 0.103550 0.030152
+v 0.571849 0.103550 0.080087
+v 0.601206 0.100745 0.161128
+v 0.638986 0.099810 0.167790
+v 0.605258 0.100745 0.134803
+v 0.563697 0.103550 0.154514
+v 0.596010 0.100745 0.187252
+v 0.633464 0.099810 0.195555
+v 0.643293 0.099810 0.139811
+v 0.567497 0.103550 0.129832
+v 0.558825 0.103550 0.179008
+v 0.573664 0.100745 0.263916
+v 0.609713 0.099810 0.277037
+v 0.582226 0.100745 0.238695
+v 0.537873 0.103550 0.250889
+v 0.564011 0.100745 0.288741
+v 0.599454 0.099810 0.303421
+v 0.618814 0.099810 0.250231
+v 0.545901 0.103550 0.227241
+v 0.528823 0.103550 0.274165
+v 0.528691 0.100745 0.360360
+v 0.561915 0.099810 0.379541
+v 0.541503 0.100745 0.337008
+v 0.495707 0.103550 0.341316
+v 0.514875 0.100745 0.383131
+v 0.547229 0.099810 0.403743
+v 0.575532 0.099810 0.354722
+v 0.507719 0.103550 0.319421
+v 0.482752 0.103550 0.362666
+v 0.467655 0.100745 0.447529
+v 0.497043 0.099810 0.472188
+v 0.484327 0.100745 0.426757
+v 0.438478 0.103550 0.423046
+v 0.450094 0.100745 0.467555
+v 0.478378 0.099810 0.493472
+v 0.514763 0.099810 0.450111
+v 0.454110 0.103550 0.403570
+v 0.422013 0.103550 0.441823
+v 0.392409 0.100745 0.522775
+v 0.417068 0.099810 0.552162
+v 0.412435 0.100745 0.505213
+v 0.367927 0.103550 0.493598
+v 0.371637 0.100745 0.539447
+v 0.394991 0.099810 0.569882
+v 0.438353 0.099810 0.533497
+v 0.386703 0.103550 0.477132
+v 0.348451 0.103550 0.509230
+v 0.305240 0.100745 0.583811
+v 0.324421 0.099810 0.617034
+v 0.328011 0.100745 0.569994
+v 0.286196 0.103550 0.550826
+v 0.281889 0.100745 0.596623
+v 0.299603 0.099810 0.630651
+v 0.348624 0.099810 0.602349
+v 0.307547 0.103550 0.537871
+v 0.264302 0.103550 0.562839
+v 0.208796 0.100745 0.628783
+v 0.221917 0.099810 0.664832
+v 0.233621 0.100745 0.619130
+v 0.195770 0.103550 0.592993
+v 0.183575 0.100745 0.637346
+v 0.195111 0.099810 0.673933
+v 0.248302 0.099810 0.654573
+v 0.219045 0.103550 0.583942
+v 0.172122 0.103550 0.601021
+v 0.106009 0.100745 0.656325
+v 0.112670 0.099810 0.694105
+v 0.132132 0.100745 0.651130
+v 0.099395 0.103550 0.618816
+v 0.079684 0.100745 0.660378
+v 0.084691 0.099810 0.698412
+v 0.140435 0.099810 0.688583
+v 0.123889 0.103550 0.613945
+v 0.074712 0.103550 0.622616
+v -0.000000 0.100745 0.665600
+v -0.000000 0.099810 0.703962
+v 0.026629 0.100745 0.665019
+v -0.000000 0.103550 0.627512
+v -0.026629 0.100745 0.665019
+v -0.028302 0.099810 0.703346
+v 0.028302 0.099810 0.703346
+v 0.024967 0.103550 0.626968
+v -0.024968 0.103550 0.626968
+v 0.359000 0.096288 -0.303876
+v 0.359095 0.090035 -0.303975
+v 0.351225 0.096325 -0.296106
+v 0.358717 0.101517 -0.303581
+v 0.368194 0.096174 -0.313057
+v 0.368571 0.090035 -0.313451
+v 0.351225 0.090035 -0.296106
+v 0.351225 0.101668 -0.296106
+v 0.367062 0.101063 -0.311874
+v 0.359807 0.287080 -0.302455
+v 0.368730 0.292795 -0.310050
+v 0.359424 0.286976 -0.302963
+v 0.352452 0.283636 -0.295171
+v 0.360407 0.286839 -0.301584
+v 0.368786 0.291761 -0.307782
+v 0.368527 0.292960 -0.311027
+v 0.351673 0.283364 -0.295572
+v 0.354252 0.283898 -0.294607
+v 0.436753 0.269442 -0.197000
+v 0.438328 0.269865 -0.197909
+v 0.425408 0.269442 -0.215728
+v 0.435178 0.269865 -0.196090
+v 0.447314 0.269442 -0.177737
+v 0.448927 0.269865 -0.178577
+v 0.426942 0.269865 -0.216705
+v 0.423874 0.269865 -0.214751
+v 0.445700 0.269865 -0.176897
+v 0.473880 0.269442 -0.117359
+v 0.475589 0.269865 -0.117981
+v 0.465906 0.269442 -0.137865
+v 0.472171 0.269865 -0.116737
+v 0.480953 0.269442 -0.096524
+v 0.482688 0.269865 -0.097071
+v 0.467586 0.269865 -0.138561
+v 0.464226 0.269865 -0.137169
+v 0.479218 0.269865 -0.095977
+v 0.496631 0.269442 -0.032450
+v 0.498422 0.269865 -0.032766
+v 0.492339 0.269442 -0.054030
+v 0.494840 0.269865 -0.032134
+v 0.499979 0.269442 -0.010704
+v 0.501782 0.269865 -0.010941
+v 0.494115 0.269865 -0.054423
+v 0.490564 0.269865 -0.053636
+v 0.498176 0.269865 -0.010467
+v 0.504292 0.269442 0.055119
+v 0.506111 0.269865 0.055119
+v 0.503813 0.269442 0.033122
+v 0.502474 0.269865 0.055119
+v 0.503813 0.269442 0.077117
+v 0.505630 0.269865 0.077196
+v 0.505630 0.269865 0.033043
+v 0.501996 0.269865 0.033202
+v 0.501996 0.269865 0.077037
+v 0.496631 0.269442 0.142689
+v 0.498422 0.269865 0.143005
+v 0.499979 0.269442 0.120943
+v 0.494840 0.269865 0.142373
+v 0.492339 0.269442 0.164269
+v 0.494115 0.269865 0.164662
+v 0.501782 0.269865 0.121180
+v 0.498176 0.269865 0.120705
+v 0.490564 0.269865 0.163875
+v 0.473880 0.269442 0.227598
+v 0.475589 0.269865 0.228220
+v 0.480953 0.269442 0.206763
+v 0.472171 0.269865 0.226976
+v 0.465906 0.269442 0.248104
+v 0.467586 0.269865 0.248800
+v 0.482688 0.269865 0.207310
+v 0.479218 0.269865 0.206216
+v 0.464226 0.269865 0.247408
+v 0.436730 0.269442 0.307266
+v 0.438305 0.269865 0.308175
+v 0.447313 0.269442 0.287976
+v 0.435155 0.269865 0.306356
+v 0.425316 0.269442 0.326076
+v 0.426850 0.269865 0.327053
+v 0.448927 0.269865 0.288816
+v 0.445700 0.269865 0.287136
+v 0.423783 0.269865 0.325099
+v 0.386310 0.269442 0.379272
+v 0.387704 0.269865 0.380441
+v 0.400083 0.269442 0.362114
+v 0.384917 0.269865 0.378103
+v 0.371804 0.269442 0.395815
+v 0.373145 0.269865 0.397044
+v 0.401526 0.269865 0.363221
+v 0.398640 0.269865 0.361006
+v 0.370463 0.269865 0.394586
+v 0.324153 0.269442 0.441430
+v 0.325322 0.269865 0.442823
+v 0.340695 0.269442 0.426923
+v 0.322984 0.269865 0.440037
+v 0.306994 0.269442 0.455202
+v 0.308101 0.269865 0.456645
+v 0.341924 0.269865 0.428264
+v 0.339467 0.269865 0.425582
+v 0.305887 0.269865 0.453759
+v 0.252146 0.269442 0.491849
+v 0.253055 0.269865 0.493425
+v 0.270956 0.269442 0.480436
+v 0.251237 0.269865 0.490274
+v 0.232856 0.269442 0.502433
+v 0.233696 0.269865 0.504046
+v 0.271934 0.269865 0.481970
+v 0.269979 0.269865 0.478902
+v 0.232017 0.269865 0.500820
+v 0.172478 0.269442 0.528999
+v 0.173100 0.269865 0.530708
+v 0.192985 0.269442 0.521026
+v 0.171856 0.269865 0.527290
+v 0.151644 0.269442 0.536072
+v 0.152191 0.269865 0.537807
+v 0.193681 0.269865 0.522706
+v 0.192289 0.269865 0.519345
+v 0.151097 0.269865 0.534338
+v 0.087569 0.269442 0.551750
+v 0.087885 0.269865 0.553542
+v 0.109149 0.269442 0.547459
+v 0.087253 0.269865 0.549959
+v 0.065823 0.269442 0.555098
+v 0.066061 0.269865 0.556901
+v 0.109543 0.269865 0.549234
+v 0.108755 0.269865 0.545683
+v 0.065586 0.269865 0.553295
+v -0.000000 0.269442 0.559412
+v -0.000000 0.269865 0.561231
+v 0.021997 0.269442 0.558932
+v -0.000000 0.269865 0.557593
+v -0.021997 0.269442 0.558932
+v -0.022076 0.269865 0.560750
+v 0.022076 0.269865 0.560750
+v 0.021918 0.269865 0.557115
+v -0.021918 0.269865 0.557115
+v -0.000000 0.095391 0.415437
+v -0.000000 0.097928 0.415870
+v 0.015717 0.095391 0.415094
+v -0.000000 0.090035 0.415292
+v -0.015717 0.095391 0.415094
+v -0.015736 0.097928 0.415527
+v 0.015736 0.097928 0.415527
+v 0.015711 0.090035 0.414950
+v -0.015711 0.090035 0.414950
+v 0.062568 0.095391 0.409963
+v 0.062644 0.097928 0.410390
+v 0.077987 0.095391 0.406896
+v 0.062543 0.090035 0.409820
+v 0.047031 0.095391 0.412355
+v 0.047087 0.097928 0.412785
+v 0.078081 0.097928 0.407320
+v 0.077956 0.090035 0.406755
+v 0.047012 0.090035 0.412211
+v 0.123236 0.095391 0.393707
+v 0.123384 0.097928 0.394114
+v 0.137888 0.095391 0.388010
+v 0.123186 0.090035 0.393571
+v 0.108350 0.095391 0.398761
+v 0.108480 0.097928 0.399174
+v 0.138054 0.097928 0.388410
+v 0.137832 0.090035 0.387876
+v 0.108306 0.090035 0.398623
+v 0.180159 0.095391 0.367163
+v 0.180375 0.097928 0.367539
+v 0.193599 0.095391 0.359008
+v 0.180086 0.090035 0.367038
+v 0.166376 0.095391 0.374725
+v 0.166576 0.097928 0.375110
+v 0.193832 0.097928 0.359374
+v 0.193521 0.090035 0.358887
+v 0.166309 0.090035 0.374597
+v 0.231607 0.095391 0.331139
+v 0.231886 0.097928 0.331471
+v 0.243427 0.095391 0.320774
+v 0.231515 0.090035 0.331028
+v 0.219348 0.095391 0.340979
+v 0.219611 0.097928 0.341323
+v 0.243720 0.097928 0.321093
+v 0.243330 0.090035 0.320667
+v 0.219260 0.090035 0.340864
+v 0.276019 0.095390 0.286727
+v 0.276351 0.097928 0.287006
+v 0.285859 0.095390 0.274467
+v 0.275908 0.090035 0.286634
+v 0.265654 0.095390 0.298547
+v 0.265974 0.097928 0.298840
+v 0.286203 0.097928 0.274731
+v 0.285745 0.090035 0.274379
+v 0.265548 0.090035 0.298449
+v 0.312044 0.095390 0.235278
+v 0.312419 0.097928 0.235495
+v 0.319606 0.095390 0.221496
+v 0.311919 0.090035 0.235206
+v 0.303889 0.095390 0.248718
+v 0.304255 0.097928 0.248951
+v 0.319990 0.097928 0.221696
+v 0.319478 0.090035 0.221429
+v 0.303767 0.090035 0.248641
+v 0.338588 0.095390 0.178355
+v 0.338995 0.097928 0.178504
+v 0.343641 0.095390 0.163469
+v 0.338452 0.090035 0.178306
+v 0.332890 0.095390 0.193007
+v 0.333291 0.097928 0.193173
+v 0.344055 0.097928 0.163599
+v 0.343503 0.090035 0.163426
+v 0.332757 0.090035 0.192952
+v 0.354843 0.095390 0.117688
+v 0.355270 0.097928 0.117763
+v 0.357235 0.095390 0.102150
+v 0.354701 0.090035 0.117663
+v 0.351777 0.095390 0.133107
+v 0.352200 0.097928 0.133200
+v 0.357665 0.097928 0.102207
+v 0.357092 0.090035 0.102132
+v 0.351636 0.090035 0.133075
+v 0.360317 0.095390 0.055119
+v 0.360751 0.097928 0.055119
+v 0.359975 0.095390 0.039403
+v 0.360173 0.090035 0.055119
+v 0.359975 0.095390 0.070836
+v 0.360408 0.097928 0.070855
+v 0.360408 0.097928 0.039384
+v 0.359831 0.090035 0.039409
+v 0.359831 0.090035 0.070830
+v 0.354843 0.095390 -0.007449
+v 0.355270 0.097928 -0.007524
+v 0.351777 0.095390 -0.022868
+v 0.354701 0.090035 -0.007424
+v 0.357235 0.095390 0.008089
+v 0.357665 0.097928 0.008032
+v 0.352200 0.097928 -0.022961
+v 0.351636 0.090035 -0.022836
+v 0.357092 0.090035 0.008107
+v 0.338588 0.095390 -0.068116
+v 0.338995 0.097928 -0.068265
+v 0.332890 0.095390 -0.082768
+v 0.338452 0.090035 -0.068067
+v 0.343641 0.095390 -0.053230
+v 0.344055 0.097928 -0.053361
+v 0.333291 0.097928 -0.082934
+v 0.332757 0.090035 -0.082713
+v 0.343504 0.090035 -0.053187
+v 0.312060 0.095390 -0.125020
+v 0.312436 0.097928 -0.125237
+v 0.303954 0.095390 -0.138401
+v 0.311935 0.090035 -0.124948
+v 0.319606 0.095390 -0.111257
+v 0.319991 0.097928 -0.111457
+v 0.304320 0.097928 -0.138634
+v 0.303832 0.090035 -0.138324
+v 0.319478 0.090035 -0.111190
+v 0.257240 0.095381 -0.199619
+v 0.257546 0.097892 -0.199912
+v 0.256731 0.095354 -0.200883
+v 0.257138 0.090035 -0.199522
+v 0.259187 0.095390 -0.197080
+v 0.259499 0.097928 -0.197384
+v 0.257025 0.097782 -0.201133
+v 0.256633 0.090035 -0.200799
+v 0.259083 0.090035 -0.196979
+v -0.000000 0.048802 0.775309
+v -0.000000 0.031802 0.774842
+v 0.031414 0.048802 0.774625
+v -0.000000 0.065989 0.775465
+v -0.031414 0.048802 0.774625
+v -0.031394 0.031802 0.774158
+v 0.031394 0.031802 0.774158
+v 0.031421 0.065989 0.774780
+v -0.031421 0.065989 0.774780
+v 0.125059 0.048802 0.764368
+v 0.124978 0.031802 0.763908
+v 0.155878 0.048802 0.758239
+v 0.125087 0.065989 0.764521
+v 0.094003 0.048802 0.769149
+v 0.093942 0.031802 0.768686
+v 0.155777 0.031802 0.757783
+v 0.155911 0.065989 0.758391
+v 0.094024 0.065989 0.769303
+v 0.246319 0.048802 0.731877
+v 0.246160 0.031802 0.731438
+v 0.275605 0.048802 0.720489
+v 0.246373 0.065989 0.732023
+v 0.216565 0.048802 0.741978
+v 0.216425 0.031802 0.741532
+v 0.275426 0.031802 0.720057
+v 0.275665 0.065989 0.720633
+v 0.216612 0.065989 0.742126
+v 0.360095 0.048802 0.678822
+v 0.359861 0.031802 0.678418
+v 0.386958 0.048802 0.662522
+v 0.360173 0.065989 0.678957
+v 0.332547 0.048802 0.693937
+v 0.332331 0.031802 0.693522
+v 0.386707 0.031802 0.662128
+v 0.387042 0.065989 0.662654
+v 0.332619 0.065989 0.694075
+v 0.462929 0.048802 0.606817
+v 0.462629 0.031802 0.606459
+v 0.486554 0.048802 0.586100
+v 0.463029 0.065989 0.606936
+v 0.438424 0.048802 0.626486
+v 0.438140 0.031802 0.626115
+v 0.486238 0.031802 0.585756
+v 0.486659 0.065989 0.586215
+v 0.438519 0.065989 0.626609
+v 0.551697 0.048802 0.518049
+v 0.551340 0.031802 0.517748
+v 0.571366 0.048802 0.493544
+v 0.551817 0.065989 0.518149
+v 0.530980 0.048802 0.541674
+v 0.530636 0.031802 0.541358
+v 0.570995 0.031802 0.493260
+v 0.571489 0.065989 0.493639
+v 0.531095 0.065989 0.541779
+v 0.623703 0.048802 0.415215
+v 0.623298 0.031802 0.414981
+v 0.638817 0.048802 0.387667
+v 0.623838 0.065989 0.415292
+v 0.607403 0.048802 0.442078
+v 0.607009 0.031802 0.441827
+v 0.638403 0.031802 0.387451
+v 0.638955 0.065989 0.387738
+v 0.607534 0.065989 0.442162
+v 0.676757 0.048802 0.301439
+v 0.676318 0.031802 0.301279
+v 0.686858 0.048802 0.271685
+v 0.676903 0.065989 0.301492
+v 0.665370 0.048802 0.330725
+v 0.664938 0.031802 0.330546
+v 0.686413 0.031802 0.271545
+v 0.687007 0.065989 0.271732
+v 0.665513 0.065989 0.330784
+v 0.709249 0.048802 0.180179
+v 0.708789 0.031802 0.180098
+v 0.714030 0.048802 0.149123
+v 0.709402 0.065989 0.180206
+v 0.703120 0.048802 0.210998
+v 0.702663 0.031802 0.210896
+v 0.713566 0.031802 0.149062
+v 0.714184 0.065989 0.149144
+v 0.703272 0.065989 0.211031
+v 0.720190 0.048802 0.055120
+v 0.719723 0.031802 0.055120
+v 0.719506 0.048802 0.023705
+v 0.720346 0.065989 0.055120
+v 0.719506 0.048802 0.086534
+v 0.719039 0.031802 0.086514
+v 0.719039 0.031802 0.023726
+v 0.719661 0.065989 0.023698
+v 0.719661 0.065989 0.086541
+v 0.709249 0.048802 -0.069940
+v 0.708789 0.031802 -0.069859
+v 0.703120 0.048802 -0.100758
+v 0.709402 0.065989 -0.069967
+v 0.714030 0.048802 -0.038884
+v 0.713567 0.031802 -0.038823
+v 0.702664 0.031802 -0.100657
+v 0.703272 0.065989 -0.100792
+v 0.714184 0.065989 -0.038904
+v 0.676757 0.048802 -0.191200
+v 0.676318 0.031802 -0.191040
+v 0.665370 0.048801 -0.220486
+v 0.676904 0.065989 -0.191253
+v 0.686858 0.048802 -0.161446
+v 0.686413 0.031802 -0.161306
+v 0.664938 0.031802 -0.220307
+v 0.665514 0.065989 -0.220545
+v 0.687007 0.065989 -0.161493
+v 0.623736 0.048801 -0.304937
+v 0.623331 0.031802 -0.304703
+v 0.607533 0.048801 -0.331684
+v 0.623870 0.065989 -0.305015
+v 0.638817 0.048801 -0.277428
+v 0.638403 0.031802 -0.277212
+v 0.607139 0.031802 -0.331433
+v 0.607665 0.065989 -0.331767
+v 0.638956 0.065989 -0.277500
+v 0.513875 0.048938 -0.453756
+v 0.513578 0.032350 -0.453441
+v 0.511976 0.049349 -0.455399
+v 0.513974 0.065989 -0.453861
+v 0.518059 0.048801 -0.448973
+v 0.517735 0.031802 -0.448658
+v 0.511739 0.033993 -0.455079
+v 0.512055 0.065989 -0.455505
+v 0.518167 0.065989 -0.449078
+v 0.506467 0.048938 -0.451208
+v 0.506452 0.065989 -0.451261
+v 0.509955 0.049349 -0.454487
+v 0.506513 0.032350 -0.451048
+v 0.498529 0.048801 -0.443340
+v 0.498506 0.065989 -0.443386
+v 0.509969 0.065989 -0.454564
+v 0.509914 0.033993 -0.454256
+v 0.498601 0.031802 -0.443203
+v 0.433649 0.048801 -0.378469
+v 0.433628 0.065989 -0.378508
+v 0.461013 0.048801 -0.405829
+v 0.433714 0.031802 -0.378352
+v 0.406266 0.048801 -0.351090
+v 0.406244 0.065989 -0.351125
+v 0.460992 0.065989 -0.405872
+v 0.461077 0.031802 -0.405701
+v 0.406331 0.031802 -0.350985
+v 0.359114 0.048801 -0.303944
+v 0.359171 0.031802 -0.303851
+v 0.351243 0.048801 -0.296075
+v 0.359095 0.065989 -0.303975
+v 0.368591 0.048801 -0.313420
+v 0.368653 0.031802 -0.313327
+v 0.351297 0.031802 -0.295981
+v 0.351225 0.065989 -0.296106
+v 0.368571 0.065989 -0.313451
+v 0.257244 0.048938 -0.199623
+v 0.257138 0.065989 -0.199522
+v 0.256734 0.049349 -0.200885
+v 0.257560 0.032350 -0.199925
+v 0.259192 0.048801 -0.197085
+v 0.259083 0.065989 -0.196979
+v 0.256633 0.065989 -0.200799
+v 0.257034 0.033993 -0.201143
+v 0.259518 0.031802 -0.197402
+v 0.312069 0.048802 -0.125025
+v 0.311935 0.065989 -0.124948
+v 0.303962 0.048802 -0.138407
+v 0.312468 0.031802 -0.125255
+v 0.319614 0.048802 -0.111261
+v 0.319478 0.065989 -0.111190
+v 0.303832 0.065989 -0.138324
+v 0.304352 0.031802 -0.138654
+v 0.320024 0.031802 -0.111474
+v 0.338596 0.048802 -0.068120
+v 0.338452 0.065989 -0.068067
+v 0.332899 0.048802 -0.082772
+v 0.339030 0.031802 -0.068277
+v 0.343650 0.048802 -0.053233
+v 0.343504 0.065989 -0.053187
+v 0.332757 0.065989 -0.082713
+v 0.333326 0.031802 -0.082949
+v 0.344091 0.031802 -0.053372
+v 0.354853 0.048802 -0.007451
+v 0.354701 0.065989 -0.007424
+v 0.351786 0.048802 -0.022870
+v 0.355307 0.031802 -0.007531
+v 0.357245 0.048802 0.008087
+v 0.357092 0.065989 0.008107
+v 0.351636 0.065989 -0.022836
+v 0.352237 0.031802 -0.022970
+v 0.357702 0.031802 0.008027
+v 0.360327 0.048802 0.055119
+v 0.360173 0.065989 0.055119
+v 0.359984 0.048802 0.039402
+v 0.360789 0.031802 0.055120
+v 0.359984 0.048802 0.070837
+v 0.359831 0.065989 0.070830
+v 0.359831 0.065989 0.039409
+v 0.360446 0.031802 0.039382
+v 0.360446 0.031802 0.070857
+v 0.354853 0.048802 0.117690
+v 0.354701 0.065989 0.117663
+v 0.357245 0.048802 0.102152
+v 0.355307 0.031802 0.117770
+v 0.351786 0.048802 0.133109
+v 0.351636 0.065989 0.133075
+v 0.357092 0.065989 0.102132
+v 0.357702 0.031802 0.102212
+v 0.352237 0.031802 0.133209
+v 0.338596 0.048802 0.178358
+v 0.338452 0.065989 0.178306
+v 0.343650 0.048802 0.163472
+v 0.339030 0.031802 0.178516
+v 0.332899 0.048802 0.193011
+v 0.332757 0.065989 0.192952
+v 0.343503 0.065989 0.163426
+v 0.344091 0.031802 0.163611
+v 0.333326 0.031802 0.193187
+v 0.312052 0.048802 0.235283
+v 0.311919 0.065989 0.235206
+v 0.319614 0.048802 0.221500
+v 0.312452 0.031802 0.235514
+v 0.303897 0.048802 0.248723
+v 0.303767 0.065989 0.248641
+v 0.319478 0.065989 0.221429
+v 0.320024 0.031802 0.221713
+v 0.304286 0.031802 0.248971
+v 0.276026 0.048802 0.286733
+v 0.275908 0.065989 0.286634
+v 0.285867 0.048802 0.274473
+v 0.276380 0.031802 0.287030
+v 0.265661 0.048802 0.298553
+v 0.265548 0.065989 0.298449
+v 0.285745 0.065989 0.274379
+v 0.286233 0.031802 0.274754
+v 0.266001 0.031802 0.298865
+v 0.231614 0.048802 0.331146
+v 0.231515 0.065989 0.331028
+v 0.243434 0.048802 0.320781
+v 0.231910 0.031802 0.331500
+v 0.219353 0.048802 0.340986
+v 0.219260 0.065989 0.340864
+v 0.243330 0.065989 0.320667
+v 0.243745 0.031802 0.321121
+v 0.219634 0.031802 0.341353
+v 0.180163 0.048802 0.367172
+v 0.180086 0.065989 0.367038
+v 0.193604 0.048802 0.359016
+v 0.180394 0.031802 0.367571
+v 0.166380 0.048802 0.374734
+v 0.166309 0.065989 0.374597
+v 0.193521 0.065989 0.358887
+v 0.193852 0.031802 0.359406
+v 0.166594 0.031802 0.375143
+v 0.123239 0.048802 0.393716
+v 0.123186 0.065989 0.393571
+v 0.137891 0.048802 0.388018
+v 0.123397 0.031802 0.394150
+v 0.108352 0.048802 0.398770
+v 0.108306 0.065989 0.398623
+v 0.137832 0.065989 0.387876
+v 0.138068 0.031802 0.388445
+v 0.108491 0.031802 0.399210
+v 0.062570 0.048802 0.409972
+v 0.062543 0.065989 0.409820
+v 0.077989 0.048802 0.406905
+v 0.062650 0.031802 0.410427
+v 0.047032 0.048802 0.412364
+v 0.047012 0.065989 0.412211
+v 0.077956 0.065989 0.406755
+v 0.078089 0.031802 0.407356
+v 0.047092 0.031802 0.412822
+v -0.000000 0.048802 0.415446
+v -0.000000 0.065989 0.415292
+v 0.015717 0.048802 0.415104
+v -0.000000 0.031802 0.415908
+v -0.015717 0.048802 0.415104
+v -0.015711 0.065989 0.414950
+v 0.015711 0.065989 0.414950
+v 0.015737 0.031802 0.415565
+v -0.015737 0.031802 0.415565
+v 0.260671 0.048938 -0.205481
+v 0.260759 0.032350 -0.205462
+v 0.258072 0.049349 -0.202778
+v 0.260642 0.065989 -0.205487
+v 0.266209 0.048801 -0.211052
+v 0.266271 0.031802 -0.211002
+v 0.258243 0.033993 -0.202852
+v 0.258015 0.065989 -0.202753
+v 0.266188 0.065989 -0.211069
+v 0.260607 0.095460 -0.205418
+v 0.265960 0.095706 -0.210811
+v 0.260642 0.090035 -0.205487
+v 0.258070 0.095354 -0.202775
+v 0.260502 0.098208 -0.205212
+v 0.265277 0.099193 -0.210038
+v 0.266188 0.090035 -0.211069
+v 0.258015 0.090035 -0.202753
+v 0.258234 0.097782 -0.202843
+v 0.260467 0.100522 -0.202817
+v 0.262051 0.103304 -0.204397
+v 0.260036 0.100134 -0.204185
+v 0.259145 0.099350 -0.201495
+v 0.262410 0.100651 -0.200216
+v 0.263657 0.103550 -0.201430
+v 0.262656 0.102568 -0.206835
+v 0.258464 0.099099 -0.202568
+v 0.261162 0.099434 -0.199002
+v 0.315941 0.100651 -0.127260
+v 0.317443 0.103550 -0.128127
+v 0.307734 0.100651 -0.140808
+v 0.314439 0.099434 -0.126393
+v 0.323580 0.100651 -0.113326
+v 0.325118 0.103550 -0.114126
+v 0.309197 0.103550 -0.141739
+v 0.306271 0.099434 -0.139876
+v 0.322042 0.099434 -0.112525
+v 0.342798 0.100651 -0.069649
+v 0.344427 0.103550 -0.070242
+v 0.337030 0.100651 -0.084483
+v 0.341168 0.099434 -0.069056
+v 0.347914 0.100651 -0.054577
+v 0.349568 0.103550 -0.055099
+v 0.338632 0.103550 -0.085146
+v 0.335427 0.099434 -0.083819
+v 0.346260 0.099434 -0.054056
+v 0.359256 0.100651 -0.008227
+v 0.360963 0.103550 -0.008528
+v 0.356151 0.100651 -0.023837
+v 0.357548 0.099434 -0.007926
+v 0.361677 0.100651 0.007504
+v 0.363397 0.103550 0.007277
+v 0.357844 0.103550 -0.024213
+v 0.354458 0.099434 -0.023462
+v 0.359958 0.099434 0.007730
+v 0.364798 0.100651 0.055119
+v 0.366532 0.103550 0.055119
+v 0.364451 0.100651 0.039207
+v 0.363063 0.099434 0.055119
+v 0.364451 0.100651 0.071032
+v 0.366184 0.103550 0.071107
+v 0.366184 0.103550 0.039132
+v 0.362718 0.099434 0.039283
+v 0.362718 0.099434 0.070956
+v 0.359256 0.100651 0.118466
+v 0.360963 0.103550 0.118767
+v 0.361677 0.100651 0.102735
+v 0.357548 0.099434 0.118165
+v 0.356151 0.100651 0.134076
+v 0.357844 0.103550 0.134452
+v 0.363397 0.103550 0.102962
+v 0.359958 0.099434 0.102509
+v 0.354458 0.099434 0.133701
+v 0.342798 0.100651 0.179888
+v 0.344427 0.103550 0.180481
+v 0.347914 0.100651 0.164816
+v 0.341168 0.099434 0.179294
+v 0.337029 0.100651 0.194722
+v 0.338632 0.103550 0.195385
+v 0.349568 0.103550 0.165338
+v 0.346260 0.099434 0.164295
+v 0.335427 0.099434 0.194058
+v 0.315924 0.100651 0.237518
+v 0.317426 0.103550 0.238385
+v 0.323580 0.100651 0.223564
+v 0.314422 0.099434 0.236651
+v 0.307668 0.100651 0.251125
+v 0.309130 0.103550 0.252057
+v 0.325118 0.103550 0.224365
+v 0.322042 0.099434 0.222764
+v 0.306205 0.099434 0.250194
+v 0.279451 0.100651 0.289607
+v 0.280780 0.103550 0.290722
+v 0.289414 0.100651 0.277194
+v 0.278123 0.099434 0.288492
+v 0.268957 0.100651 0.301574
+v 0.270236 0.103550 0.302745
+v 0.290790 0.103550 0.278250
+v 0.288038 0.099434 0.276139
+v 0.267679 0.099434 0.300402
+v 0.234487 0.100651 0.334571
+v 0.235602 0.103550 0.335899
+v 0.246454 0.100651 0.324077
+v 0.233373 0.099434 0.333242
+v 0.222075 0.100651 0.344533
+v 0.223131 0.103550 0.345909
+v 0.247626 0.103550 0.325355
+v 0.245282 0.099434 0.322798
+v 0.221019 0.099434 0.343157
+v 0.182399 0.100651 0.371043
+v 0.183266 0.103550 0.372545
+v 0.196006 0.100651 0.362787
+v 0.181532 0.099434 0.369541
+v 0.168445 0.100651 0.378699
+v 0.169246 0.103550 0.380238
+v 0.196938 0.103550 0.364250
+v 0.195074 0.099434 0.361324
+v 0.167644 0.099434 0.377161
+v 0.124768 0.100651 0.397917
+v 0.125361 0.103550 0.399547
+v 0.139602 0.100651 0.392149
+v 0.124175 0.099434 0.396287
+v 0.109697 0.100651 0.403033
+v 0.110218 0.103550 0.404688
+v 0.140266 0.103550 0.393751
+v 0.138938 0.099434 0.390547
+v 0.109175 0.099434 0.401379
+v 0.063346 0.100651 0.414375
+v 0.063648 0.103550 0.416083
+v 0.078957 0.100651 0.411270
+v 0.063045 0.099434 0.412667
+v 0.047616 0.100651 0.416797
+v 0.047842 0.103550 0.418516
+v 0.079332 0.103550 0.412963
+v 0.078581 0.099434 0.409577
+v 0.047389 0.099434 0.415077
+v -0.000000 0.100651 0.419917
+v -0.000000 0.103550 0.421651
+v 0.015912 0.100651 0.419570
+v -0.000000 0.099434 0.418183
+v -0.015912 0.100651 0.419570
+v -0.015988 0.103550 0.421303
+v 0.015988 0.103550 0.421303
+v 0.015837 0.099434 0.417838
+v -0.015837 0.099434 0.417838
+v 0.367432 0.132369 -0.308430
+v 0.371878 0.118311 -0.313151
+v 0.365382 0.132426 -0.308982
+v 0.371369 0.151705 -0.311389
+v 0.370648 0.132350 -0.305226
+v 0.375341 0.118510 -0.310103
+v 0.369209 0.117716 -0.313092
+v 0.368786 0.152529 -0.311564
+v 0.374766 0.151431 -0.308303
+v 0.357228 0.131652 -0.302035
+v 0.357605 0.117982 -0.302444
+v 0.351225 0.131503 -0.296106
+v 0.357565 0.149167 -0.302294
+v 0.361104 0.132022 -0.305690
+v 0.362614 0.117528 -0.307325
+v 0.351225 0.118133 -0.296106
+v 0.351225 0.148421 -0.296106
+v 0.362451 0.151100 -0.306727
+v 0.264916 0.130988 -0.207238
+v 0.264423 0.118311 -0.206753
+v 0.265633 0.131028 -0.203352
+v 0.265080 0.146183 -0.207400
+v 0.268229 0.130868 -0.212383
+v 0.267188 0.117716 -0.211362
+v 0.265321 0.118510 -0.203049
+v 0.265737 0.146145 -0.203453
+v 0.268576 0.146297 -0.212723
+v 0.446072 0.132350 -0.202375
+v 0.451909 0.118510 -0.205749
+v 0.434492 0.132350 -0.221495
+v 0.450470 0.151431 -0.204901
+v 0.456855 0.132350 -0.182704
+v 0.462836 0.118510 -0.185818
+v 0.440171 0.118510 -0.225127
+v 0.438800 0.151431 -0.224187
+v 0.461352 0.151431 -0.185045
+v 0.319821 0.131029 -0.129500
+v 0.319445 0.118510 -0.129283
+v 0.327554 0.131029 -0.115394
+v 0.319946 0.146145 -0.129572
+v 0.311513 0.131029 -0.143214
+v 0.311147 0.118510 -0.142981
+v 0.327169 0.118510 -0.115194
+v 0.327682 0.146145 -0.115461
+v 0.311635 0.146145 -0.143292
+v 0.483988 0.132350 -0.121038
+v 0.490325 0.118510 -0.123344
+v 0.475844 0.132350 -0.141982
+v 0.488752 0.151431 -0.122772
+v 0.491212 0.132350 -0.099759
+v 0.497643 0.118510 -0.101787
+v 0.482074 0.118510 -0.144562
+v 0.480528 0.151431 -0.143922
+v 0.496047 0.151431 -0.101283
+v 0.347008 0.131029 -0.071181
+v 0.346600 0.118510 -0.071033
+v 0.352187 0.131029 -0.055925
+v 0.347143 0.146145 -0.071230
+v 0.341169 0.131029 -0.086197
+v 0.340768 0.118510 -0.086031
+v 0.351774 0.118510 -0.055794
+v 0.352325 0.146145 -0.055968
+v 0.341302 0.146145 -0.086253
+v 0.507224 0.132350 -0.034318
+v 0.513865 0.118510 -0.035489
+v 0.502841 0.132350 -0.056358
+v 0.512217 0.151431 -0.035198
+v 0.510643 0.132350 -0.012108
+v 0.517329 0.118510 -0.012988
+v 0.509425 0.118510 -0.057817
+v 0.507790 0.151431 -0.057455
+v 0.515670 0.151431 -0.012770
+v 0.363668 0.131029 -0.009005
+v 0.363241 0.118510 -0.008930
+v 0.366119 0.131029 0.006919
+v 0.363810 0.146145 -0.009030
+v 0.360525 0.131029 -0.024807
+v 0.360102 0.118510 -0.024713
+v 0.365689 0.118510 0.006976
+v 0.366262 0.146145 0.006900
+v 0.360666 0.146145 -0.024838
+v 0.515049 0.132350 0.055119
+v 0.521793 0.118510 0.055119
+v 0.514560 0.132350 0.032653
+v 0.520119 0.151431 0.055119
+v 0.514560 0.132350 0.077586
+v 0.521297 0.118510 0.077880
+v 0.521297 0.118510 0.032359
+v 0.519624 0.151431 0.032432
+v 0.519624 0.151431 0.077807
+v 0.369278 0.131029 0.055119
+v 0.368844 0.118510 0.055119
+v 0.368927 0.131029 0.071227
+v 0.369422 0.146145 0.055119
+v 0.368927 0.131029 0.039012
+v 0.368494 0.118510 0.039031
+v 0.368494 0.118510 0.071208
+v 0.369071 0.146145 0.071234
+v 0.369071 0.146145 0.039005
+v 0.507224 0.132350 0.144557
+v 0.513865 0.118510 0.145728
+v 0.510643 0.132350 0.122347
+v 0.512217 0.151431 0.145437
+v 0.502841 0.132350 0.166597
+v 0.509425 0.118510 0.168056
+v 0.517329 0.118510 0.123227
+v 0.515670 0.151431 0.123009
+v 0.507790 0.151431 0.167694
+v 0.363668 0.131029 0.119244
+v 0.363241 0.118510 0.119169
+v 0.360525 0.131029 0.135046
+v 0.363810 0.146145 0.119269
+v 0.366119 0.131029 0.103320
+v 0.365689 0.118510 0.103263
+v 0.360102 0.118510 0.134952
+v 0.360666 0.146145 0.135077
+v 0.366262 0.146145 0.103339
+v 0.483988 0.132350 0.231277
+v 0.490325 0.118510 0.233583
+v 0.491212 0.132350 0.209998
+v 0.488752 0.151431 0.233011
+v 0.475844 0.132350 0.252221
+v 0.482074 0.118510 0.254801
+v 0.497643 0.118510 0.212026
+v 0.496047 0.151431 0.211522
+v 0.480528 0.151431 0.254161
+v 0.347008 0.131029 0.181420
+v 0.346600 0.118510 0.181272
+v 0.341169 0.131029 0.196436
+v 0.347143 0.146145 0.181469
+v 0.352187 0.131029 0.166164
+v 0.351774 0.118510 0.166033
+v 0.340768 0.118510 0.196270
+v 0.341302 0.146145 0.196492
+v 0.352325 0.146145 0.166207
+v 0.446046 0.132350 0.312644
+v 0.451886 0.118510 0.316016
+v 0.456855 0.132350 0.292943
+v 0.450436 0.151431 0.315179
+v 0.434388 0.132350 0.331856
+v 0.440076 0.118510 0.335479
+v 0.462836 0.118510 0.296057
+v 0.461351 0.151431 0.295284
+v 0.438664 0.151431 0.334579
+v 0.319804 0.131029 0.239758
+v 0.319428 0.118510 0.239542
+v 0.311446 0.131029 0.253533
+v 0.319929 0.146145 0.239831
+v 0.327554 0.131029 0.225633
+v 0.327169 0.118510 0.225433
+v 0.311080 0.118510 0.253300
+v 0.311568 0.146145 0.253610
+v 0.327682 0.146145 0.225700
+v 0.394550 0.132350 0.386187
+v 0.399716 0.118510 0.390521
+v 0.408616 0.132350 0.368662
+v 0.398434 0.151431 0.389445
+v 0.379734 0.132350 0.403082
+v 0.384706 0.118510 0.407638
+v 0.413966 0.118510 0.372767
+v 0.412638 0.151431 0.371748
+v 0.383472 0.151431 0.406507
+v 0.282883 0.131029 0.292487
+v 0.282551 0.118510 0.292208
+v 0.272260 0.131029 0.304600
+v 0.282994 0.146145 0.292580
+v 0.292968 0.131029 0.279922
+v 0.292624 0.118510 0.279658
+v 0.271941 0.118510 0.304307
+v 0.272367 0.146145 0.304698
+v 0.293083 0.146145 0.280010
+v 0.331067 0.132350 0.449670
+v 0.335402 0.118510 0.454836
+v 0.347963 0.132350 0.434854
+v 0.334326 0.151431 0.453553
+v 0.313542 0.132350 0.463736
+v 0.317647 0.118510 0.469086
+v 0.352518 0.118510 0.439826
+v 0.351388 0.151431 0.438592
+v 0.316628 0.151431 0.467758
+v 0.237367 0.131029 0.338003
+v 0.237088 0.118510 0.337671
+v 0.224802 0.131029 0.348088
+v 0.237460 0.146145 0.338113
+v 0.249481 0.131029 0.327380
+v 0.249188 0.118510 0.327060
+v 0.224538 0.118510 0.347744
+v 0.224890 0.146145 0.348202
+v 0.249578 0.146145 0.327487
+v 0.257524 0.132350 0.501165
+v 0.260896 0.118510 0.507005
+v 0.276736 0.132350 0.489508
+v 0.260059 0.151431 0.505555
+v 0.237823 0.132350 0.511974
+v 0.240937 0.118510 0.517956
+v 0.280359 0.118510 0.495195
+v 0.279460 0.151431 0.493784
+v 0.240164 0.151431 0.516471
+v 0.184639 0.131029 0.374923
+v 0.184422 0.118510 0.374548
+v 0.170514 0.131029 0.382673
+v 0.184711 0.146145 0.375049
+v 0.198413 0.131029 0.366566
+v 0.198180 0.118510 0.366200
+v 0.170313 0.118510 0.382289
+v 0.170580 0.146145 0.382802
+v 0.198491 0.146145 0.366687
+v 0.176157 0.132350 0.539107
+v 0.178463 0.118510 0.545444
+v 0.197101 0.132350 0.530963
+v 0.177891 0.151431 0.543871
+v 0.154878 0.132350 0.546331
+v 0.156906 0.118510 0.552763
+v 0.199682 0.118510 0.537194
+v 0.199041 0.151431 0.535647
+v 0.156403 0.151431 0.551166
+v 0.126300 0.131029 0.402127
+v 0.126152 0.118510 0.401720
+v 0.111044 0.131029 0.407306
+v 0.126350 0.146145 0.402263
+v 0.141317 0.131029 0.396288
+v 0.141151 0.118510 0.395887
+v 0.110914 0.118510 0.406893
+v 0.111087 0.146145 0.407444
+v 0.141372 0.146145 0.396422
+v 0.089437 0.132350 0.562344
+v 0.090608 0.118510 0.568985
+v 0.111477 0.132350 0.557960
+v 0.090318 0.151431 0.567336
+v 0.067227 0.132350 0.565763
+v 0.068107 0.118510 0.572449
+v 0.112937 0.118510 0.564544
+v 0.112574 0.151431 0.562910
+v 0.067889 0.151431 0.570789
+v 0.064124 0.131029 0.418787
+v 0.064049 0.118510 0.418360
+v 0.048200 0.131029 0.421238
+v 0.064149 0.146145 0.418929
+v 0.079926 0.131029 0.415644
+v 0.079833 0.118510 0.415221
+v 0.048144 0.118510 0.420809
+v 0.048219 0.146145 0.421382
+v 0.079958 0.146145 0.415785
+v -0.000000 0.132350 0.570168
+v -0.000000 0.118510 0.576912
+v 0.022466 0.132350 0.569679
+v -0.000000 0.151431 0.575238
+v -0.022466 0.132350 0.569679
+v -0.022760 0.118510 0.576416
+v 0.022760 0.118510 0.576416
+v 0.022687 0.151431 0.574744
+v -0.022687 0.151431 0.574744
+v -0.000000 0.131029 0.424397
+v -0.000000 0.118510 0.423964
+v -0.016108 0.131029 0.424046
+v -0.000000 0.146145 0.424542
+v 0.016108 0.131029 0.424046
+v 0.016089 0.118510 0.423613
+v -0.016089 0.118510 0.423613
+v -0.016114 0.146145 0.424191
+v 0.016114 0.146145 0.424191
+v -0.000000 0.200351 0.424542
+v 0.016114 0.200351 0.424191
+v -0.000000 0.181889 0.424542
+v -0.016114 0.200351 0.424191
+v -0.000000 0.217082 0.424542
+v 0.016114 0.217082 0.424191
+v 0.016114 0.181889 0.424191
+v -0.016114 0.181889 0.424191
+v -0.016114 0.217082 0.424191
+v 0.064149 0.200351 0.418929
+v 0.079958 0.200351 0.415785
+v 0.064149 0.181889 0.418929
+v 0.048219 0.200351 0.421382
+v 0.064149 0.217082 0.418929
+v 0.079958 0.217082 0.415785
+v 0.079958 0.181889 0.415785
+v 0.048219 0.181889 0.421382
+v 0.048219 0.217082 0.421382
+v 0.126350 0.200351 0.402263
+v 0.141372 0.200351 0.396422
+v 0.126350 0.181889 0.402263
+v 0.111087 0.200351 0.407444
+v 0.126350 0.217082 0.402263
+v 0.141372 0.217082 0.396422
+v 0.141372 0.181889 0.396422
+v 0.111087 0.181889 0.407444
+v 0.111087 0.217082 0.407444
+v 0.184711 0.200351 0.375049
+v 0.198491 0.200351 0.366687
+v 0.184711 0.181889 0.375049
+v 0.170580 0.200351 0.382802
+v 0.184711 0.217082 0.375049
+v 0.198491 0.217082 0.366687
+v 0.198491 0.181889 0.366687
+v 0.170580 0.181889 0.382802
+v 0.170580 0.217082 0.382802
+v 0.237460 0.200351 0.338113
+v 0.249578 0.200351 0.327487
+v 0.237460 0.181889 0.338113
+v 0.224890 0.200351 0.348202
+v 0.237460 0.217082 0.338113
+v 0.249578 0.217082 0.327486
+v 0.249578 0.181889 0.327487
+v 0.224890 0.181889 0.348202
+v 0.224890 0.217082 0.348202
+v 0.282994 0.200351 0.292580
+v 0.293083 0.200351 0.280010
+v 0.282994 0.181889 0.292580
+v 0.272367 0.200351 0.304698
+v 0.282994 0.217082 0.292580
+v 0.293083 0.217082 0.280010
+v 0.293083 0.181889 0.280010
+v 0.272367 0.181889 0.304698
+v 0.272367 0.217082 0.304698
+v 0.319929 0.200351 0.239831
+v 0.327682 0.200351 0.225700
+v 0.319929 0.181889 0.239831
+v 0.311568 0.200351 0.253610
+v 0.319929 0.217082 0.239831
+v 0.327682 0.217082 0.225700
+v 0.327682 0.181889 0.225700
+v 0.311568 0.181889 0.253610
+v 0.311568 0.217082 0.253610
+v 0.347143 0.200351 0.181469
+v 0.352325 0.200351 0.166207
+v 0.347143 0.181889 0.181469
+v 0.341302 0.200351 0.196492
+v 0.347143 0.217082 0.181469
+v 0.352325 0.217082 0.166207
+v 0.352325 0.181889 0.166207
+v 0.341302 0.181889 0.196492
+v 0.341302 0.217082 0.196492
+v 0.363810 0.200351 0.119269
+v 0.366262 0.200351 0.103339
+v 0.363810 0.181889 0.119269
+v 0.360666 0.200351 0.135077
+v 0.363810 0.217081 0.119269
+v 0.366262 0.217081 0.103339
+v 0.366262 0.181889 0.103339
+v 0.360666 0.181889 0.135077
+v 0.360666 0.217081 0.135077
+v 0.369422 0.200351 0.055119
+v 0.369071 0.200351 0.039005
+v 0.369422 0.181889 0.055119
+v 0.369071 0.200351 0.071234
+v 0.369422 0.217081 0.055119
+v 0.369071 0.217081 0.039005
+v 0.369071 0.181889 0.039005
+v 0.369071 0.181889 0.071234
+v 0.369071 0.217081 0.071234
+v 0.363810 0.200351 -0.009030
+v 0.360666 0.200351 -0.024838
+v 0.363810 0.181889 -0.009030
+v 0.366262 0.200351 0.006900
+v 0.363810 0.217081 -0.009030
+v 0.360666 0.217081 -0.024838
+v 0.360666 0.181889 -0.024838
+v 0.366262 0.181889 0.006900
+v 0.366262 0.217081 0.006900
+v 0.347143 0.200351 -0.071230
+v 0.341302 0.200351 -0.086253
+v 0.347143 0.181889 -0.071230
+v 0.352325 0.200351 -0.055968
+v 0.347143 0.217081 -0.071230
+v 0.341302 0.217081 -0.086253
+v 0.341302 0.181889 -0.086253
+v 0.352325 0.181889 -0.055968
+v 0.352325 0.217081 -0.055968
+v 0.319946 0.200351 -0.129572
+v 0.311635 0.200351 -0.143292
+v 0.319946 0.181889 -0.129572
+v 0.327682 0.200351 -0.115461
+v 0.319946 0.217081 -0.129572
+v 0.311635 0.217081 -0.143292
+v 0.311635 0.181889 -0.143292
+v 0.327682 0.181889 -0.115461
+v 0.327682 0.217081 -0.115461
+v 0.265080 0.200654 -0.207400
+v 0.265080 0.217499 -0.207400
+v 0.268576 0.201564 -0.212723
+v 0.265080 0.182078 -0.207400
+v 0.265737 0.200351 -0.203453
+v 0.265737 0.217081 -0.203453
+v 0.268576 0.218750 -0.212723
+v 0.268576 0.182647 -0.212723
+v 0.265737 0.181889 -0.203453
+v 0.358879 0.221531 -0.303430
+v 0.367709 0.228021 -0.311270
+v 0.358613 0.195579 -0.303197
+v 0.351225 0.218558 -0.296106
+v 0.358968 0.245436 -0.303507
+v 0.368064 0.252057 -0.311580
+v 0.366645 0.200993 -0.310341
+v 0.351225 0.193268 -0.296106
+v 0.351225 0.242116 -0.296106
+v 0.504741 0.381627 -0.422749
+v 0.508183 0.381816 -0.418710
+v 0.504492 0.368101 -0.422526
+v 0.503159 0.381059 -0.424159
+v 0.504824 0.394820 -0.422824
+v 0.508272 0.395116 -0.418783
+v 0.507919 0.367956 -0.418491
+v 0.502956 0.368535 -0.423924
+v 0.503227 0.393930 -0.424237
+v 0.599420 0.381816 -0.290628
+v 0.613737 0.381816 -0.264372
+v 0.599125 0.367956 -0.290458
+v 0.584373 0.381816 -0.315806
+v 0.599519 0.395116 -0.290685
+v 0.613838 0.395116 -0.264424
+v 0.613435 0.367956 -0.264214
+v 0.584084 0.367956 -0.315624
+v 0.584469 0.395116 -0.315866
+v 0.650187 0.381816 -0.181529
+v 0.659892 0.381816 -0.152944
+v 0.649867 0.367956 -0.181413
+v 0.639247 0.381816 -0.209665
+v 0.650294 0.395116 -0.181568
+v 0.660000 0.395116 -0.152978
+v 0.659567 0.367956 -0.152841
+v 0.638932 0.367956 -0.209535
+v 0.639352 0.395116 -0.209709
+v 0.681403 0.381816 -0.065030
+v 0.685997 0.381816 -0.035194
+v 0.681068 0.367956 -0.064971
+v 0.675515 0.381816 -0.094639
+v 0.681515 0.395116 -0.065050
+v 0.686109 0.395116 -0.035208
+v 0.685659 0.367956 -0.035149
+v 0.675182 0.367956 -0.094565
+v 0.675626 0.395116 -0.094663
+v 0.691915 0.381816 0.055119
+v 0.691257 0.381816 0.085300
+v 0.691574 0.367956 0.055119
+v 0.691257 0.381816 0.024938
+v 0.692029 0.395116 0.055119
+v 0.691371 0.395116 0.085305
+v 0.690917 0.367956 0.085286
+v 0.690917 0.367956 0.024953
+v 0.691371 0.395116 0.024933
+v 0.681403 0.381816 0.175269
+v 0.675515 0.381817 0.204878
+v 0.681068 0.367956 0.175210
+v 0.685997 0.381816 0.145432
+v 0.681515 0.395116 0.175289
+v 0.675626 0.395116 0.204902
+v 0.675182 0.367956 0.204804
+v 0.685659 0.367956 0.145388
+v 0.686109 0.395116 0.145447
+v 0.650187 0.381817 0.291768
+v 0.639247 0.381817 0.319904
+v 0.649867 0.367956 0.291652
+v 0.659892 0.381817 0.263183
+v 0.650294 0.395116 0.291807
+v 0.639352 0.395116 0.319948
+v 0.638932 0.367956 0.319774
+v 0.659567 0.367956 0.263080
+v 0.660000 0.395116 0.263217
+v 0.599216 0.381817 0.401077
+v 0.583556 0.381817 0.426886
+v 0.598921 0.367956 0.400907
+v 0.613737 0.381817 0.374611
+v 0.599314 0.395116 0.401134
+v 0.583652 0.395116 0.426947
+v 0.583268 0.367956 0.426703
+v 0.613435 0.367956 0.374453
+v 0.613838 0.395116 0.374663
+v 0.530038 0.381817 0.499874
+v 0.510134 0.381817 0.522571
+v 0.529777 0.367956 0.499655
+v 0.548934 0.381817 0.476331
+v 0.530125 0.395116 0.499947
+v 0.510217 0.395116 0.522648
+v 0.509883 0.367956 0.522341
+v 0.548663 0.367956 0.476124
+v 0.549024 0.395116 0.476400
+v 0.444754 0.381817 0.585157
+v 0.421211 0.381817 0.604053
+v 0.444535 0.367956 0.584896
+v 0.467452 0.381817 0.565253
+v 0.444827 0.395116 0.585244
+v 0.421281 0.395116 0.604143
+v 0.421004 0.367956 0.603783
+v 0.467221 0.367956 0.565002
+v 0.467528 0.395116 0.565337
+v 0.345957 0.381817 0.654335
+v 0.319491 0.381817 0.668856
+v 0.345787 0.367956 0.654040
+v 0.371766 0.381817 0.638675
+v 0.346014 0.395116 0.654434
+v 0.319543 0.395116 0.668957
+v 0.319334 0.367956 0.668554
+v 0.371583 0.367956 0.638388
+v 0.371827 0.395116 0.638771
+v 0.236649 0.381817 0.705307
+v 0.208063 0.381817 0.715011
+v 0.236532 0.367956 0.704987
+v 0.264785 0.381817 0.694366
+v 0.236687 0.395116 0.705414
+v 0.208097 0.395116 0.715120
+v 0.207960 0.367956 0.714686
+v 0.264654 0.367956 0.694051
+v 0.264828 0.395116 0.694471
+v 0.120150 0.381817 0.736523
+v 0.090313 0.381817 0.741116
+v 0.120090 0.367956 0.736187
+v 0.149758 0.381817 0.730634
+v 0.120169 0.395116 0.736635
+v 0.090328 0.395116 0.741229
+v 0.090268 0.367956 0.740778
+v 0.149684 0.367956 0.730302
+v 0.149782 0.395116 0.730745
+v -0.000000 0.381817 0.747034
+v -0.030181 0.381817 0.746377
+v -0.000000 0.367956 0.746694
+v 0.030181 0.381817 0.746377
+v -0.000000 0.395116 0.747148
+v -0.030186 0.395116 0.746490
+v -0.030166 0.367956 0.746036
+v 0.030166 0.367956 0.746036
+v 0.030186 0.395116 0.746490
+v 0.431299 0.244232 -0.361435
+v 0.405408 0.209343 -0.339818
+v 0.429746 0.248276 -0.362669
+v 0.457156 0.277575 -0.383024
+v 0.434522 0.242884 -0.357753
+v 0.408862 0.208316 -0.336518
+v 0.402942 0.212425 -0.340218
+v 0.455885 0.281635 -0.384569
+v 0.460359 0.276222 -0.379134
+v 0.429495 0.291759 -0.363408
+v 0.403367 0.264001 -0.341442
+v 0.429562 0.310257 -0.363512
+v 0.455400 0.319576 -0.385158
+v 0.429294 0.272823 -0.363096
+v 0.402340 0.240785 -0.340468
+v 0.403709 0.285145 -0.341767
+v 0.455374 0.335963 -0.385189
+v 0.455476 0.303287 -0.385065
+v 0.431167 0.343506 -0.361387
+v 0.404878 0.321476 -0.339624
+v 0.433896 0.343306 -0.357532
+v 0.457156 0.365936 -0.383024
+v 0.430058 0.343427 -0.362911
+v 0.404192 0.321635 -0.341186
+v 0.406355 0.320517 -0.335635
+v 0.460359 0.365986 -0.379134
+v 0.517184 0.242885 -0.243298
+v 0.488536 0.208316 -0.226810
+v 0.504001 0.242884 -0.265222
+v 0.546028 0.276222 -0.259899
+v 0.529604 0.242884 -0.220575
+v 0.500295 0.208316 -0.205318
+v 0.476003 0.208316 -0.247601
+v 0.532192 0.276222 -0.282964
+v 0.559114 0.276222 -0.235937
+v 0.517184 0.343591 -0.243298
+v 0.488536 0.321657 -0.226810
+v 0.529604 0.343591 -0.220575
+v 0.546028 0.365986 -0.259899
+v 0.504001 0.343591 -0.265222
+v 0.476003 0.321657 -0.247601
+v 0.500295 0.321657 -0.205318
+v 0.559114 0.365986 -0.235937
+v 0.532192 0.365986 -0.282964
+v 0.561057 0.242885 -0.149089
+v 0.530008 0.208316 -0.137788
+v 0.551617 0.242885 -0.173368
+v 0.592320 0.276222 -0.160467
+v 0.569432 0.242885 -0.124422
+v 0.537919 0.208316 -0.114486
+v 0.521090 0.208316 -0.160723
+v 0.582353 0.276222 -0.186099
+v 0.601161 0.276222 -0.134426
+v 0.561057 0.343591 -0.149089
+v 0.530008 0.321657 -0.137788
+v 0.569432 0.343591 -0.124422
+v 0.592320 0.365986 -0.160467
+v 0.551617 0.343591 -0.173368
+v 0.521090 0.321657 -0.160723
+v 0.537919 0.321657 -0.114486
+v 0.601161 0.365986 -0.134426
+v 0.582353 0.365986 -0.186099
+v 0.587994 0.242885 -0.048560
+v 0.555454 0.208316 -0.042822
+v 0.582913 0.242885 -0.074109
+v 0.620758 0.276222 -0.054337
+v 0.591958 0.242885 -0.022813
+v 0.559198 0.208316 -0.018500
+v 0.550654 0.208316 -0.066958
+v 0.615393 0.276222 -0.081310
+v 0.624942 0.276222 -0.027156
+v 0.587994 0.343591 -0.048560
+v 0.555454 0.321657 -0.042822
+v 0.591958 0.343591 -0.022813
+v 0.620758 0.365986 -0.054337
+v 0.582913 0.343591 -0.074109
+v 0.550654 0.321657 -0.066958
+v 0.559198 0.321657 -0.018500
+v 0.624942 0.365986 -0.027156
+v 0.615393 0.365986 -0.081310
+v 0.597065 0.242885 0.055119
+v 0.564023 0.208316 0.055119
+v 0.596497 0.242885 0.029076
+v 0.630334 0.276222 0.055119
+v 0.596497 0.242885 0.081163
+v 0.563487 0.208316 0.079722
+v 0.563487 0.208316 0.030517
+v 0.629735 0.276222 0.027625
+v 0.629735 0.276222 0.082614
+v 0.597065 0.343591 0.055119
+v 0.564023 0.321657 0.055119
+v 0.596497 0.343591 0.081163
+v 0.630334 0.365986 0.055119
+v 0.596497 0.343591 0.029076
+v 0.563487 0.321657 0.030517
+v 0.563487 0.321657 0.079722
+v 0.629735 0.365986 0.082614
+v 0.629735 0.365986 0.027625
+v 0.587994 0.242885 0.158799
+v 0.555454 0.208316 0.153061
+v 0.591958 0.242885 0.133052
+v 0.620757 0.276222 0.164576
+v 0.582913 0.242885 0.184348
+v 0.550654 0.208316 0.177197
+v 0.559198 0.208316 0.128739
+v 0.624942 0.276222 0.137395
+v 0.615393 0.276222 0.191549
+v 0.587994 0.343591 0.158799
+v 0.555454 0.321657 0.153061
+v 0.582913 0.343591 0.184348
+v 0.620758 0.365986 0.164576
+v 0.591958 0.343591 0.133052
+v 0.559198 0.321657 0.128739
+v 0.550654 0.321657 0.177197
+v 0.615393 0.365986 0.191549
+v 0.624942 0.365986 0.137394
+v 0.561057 0.242885 0.259328
+v 0.530008 0.208316 0.248027
+v 0.569431 0.242885 0.234660
+v 0.592320 0.276222 0.270706
+v 0.551616 0.242885 0.283607
+v 0.521090 0.208316 0.270962
+v 0.537919 0.208316 0.224725
+v 0.601161 0.276222 0.244665
+v 0.582353 0.276222 0.296338
+v 0.561057 0.343591 0.259328
+v 0.530008 0.321657 0.248027
+v 0.551617 0.343591 0.283607
+v 0.592320 0.365986 0.270706
+v 0.569432 0.343591 0.234660
+v 0.537919 0.321657 0.224725
+v 0.521090 0.321657 0.270962
+v 0.582353 0.365986 0.296338
+v 0.601161 0.365986 0.244665
+v 0.517073 0.242885 0.353652
+v 0.488458 0.208316 0.337131
+v 0.529604 0.242885 0.330814
+v 0.545885 0.276222 0.370286
+v 0.503560 0.242885 0.375923
+v 0.475693 0.208316 0.358169
+v 0.500295 0.208316 0.315557
+v 0.559114 0.276222 0.346176
+v 0.531619 0.276222 0.393798
+v 0.517073 0.343591 0.353652
+v 0.488458 0.321657 0.337131
+v 0.503560 0.343591 0.375923
+v 0.545885 0.365986 0.370286
+v 0.529604 0.343591 0.330814
+v 0.500295 0.321657 0.315557
+v 0.475693 0.321657 0.358169
+v 0.531619 0.365986 0.393798
+v 0.559114 0.365986 0.346176
+v 0.457378 0.242885 0.438905
+v 0.432067 0.208316 0.417666
+v 0.473684 0.242885 0.418590
+v 0.482863 0.276222 0.460290
+v 0.440203 0.242885 0.458491
+v 0.415842 0.208316 0.436168
+v 0.447470 0.208316 0.398475
+v 0.500078 0.276222 0.438843
+v 0.464731 0.276222 0.480967
+v 0.457378 0.343591 0.438905
+v 0.432067 0.321657 0.417666
+v 0.440203 0.343591 0.458491
+v 0.482864 0.365986 0.460290
+v 0.473684 0.343591 0.418590
+v 0.447470 0.321657 0.398475
+v 0.415842 0.321657 0.436168
+v 0.464731 0.365986 0.480967
+v 0.500078 0.365986 0.438843
+v 0.383786 0.242885 0.512498
+v 0.362547 0.208316 0.487186
+v 0.403372 0.242885 0.495322
+v 0.405171 0.276222 0.537983
+v 0.363470 0.242885 0.528803
+v 0.343356 0.208316 0.502590
+v 0.381049 0.208316 0.470961
+v 0.425848 0.276222 0.519851
+v 0.383723 0.276222 0.555198
+v 0.383786 0.343591 0.512498
+v 0.362547 0.321657 0.487186
+v 0.363470 0.343591 0.528803
+v 0.405171 0.365986 0.537983
+v 0.403372 0.343591 0.495322
+v 0.381049 0.321657 0.470961
+v 0.343356 0.321657 0.502590
+v 0.383723 0.365986 0.555197
+v 0.425848 0.365986 0.519851
+v 0.298532 0.242885 0.572193
+v 0.282011 0.208316 0.543578
+v 0.320803 0.242885 0.558679
+v 0.315167 0.276222 0.601004
+v 0.275694 0.242885 0.584723
+v 0.260437 0.208316 0.555415
+v 0.303050 0.208316 0.530812
+v 0.338678 0.276222 0.586738
+v 0.291056 0.276222 0.614233
+v 0.298532 0.343591 0.572193
+v 0.282011 0.321657 0.543578
+v 0.275694 0.343591 0.584723
+v 0.315167 0.365986 0.601004
+v 0.320803 0.343591 0.558679
+v 0.303050 0.321657 0.530812
+v 0.260437 0.321657 0.555415
+v 0.291056 0.365986 0.614233
+v 0.338678 0.365986 0.586738
+v 0.204208 0.242885 0.616177
+v 0.192907 0.208316 0.585128
+v 0.228487 0.242885 0.606736
+v 0.215587 0.276222 0.647439
+v 0.179541 0.242885 0.624551
+v 0.169605 0.208316 0.593038
+v 0.215842 0.208316 0.576209
+v 0.241218 0.276222 0.637473
+v 0.189545 0.276222 0.656280
+v 0.204208 0.343591 0.616177
+v 0.192907 0.321657 0.585128
+v 0.179541 0.343591 0.624551
+v 0.215587 0.365986 0.647439
+v 0.228487 0.343591 0.606736
+v 0.215842 0.321657 0.576209
+v 0.169605 0.321657 0.593038
+v 0.189545 0.365986 0.656280
+v 0.241218 0.365986 0.637473
+v 0.103679 0.242885 0.643113
+v 0.097941 0.208316 0.610573
+v 0.129229 0.242885 0.638032
+v 0.109456 0.276222 0.675877
+v 0.077932 0.242885 0.647077
+v 0.073620 0.208316 0.614318
+v 0.122077 0.208316 0.605773
+v 0.136429 0.276222 0.670512
+v 0.082275 0.276222 0.680061
+v 0.103679 0.343591 0.643113
+v 0.097941 0.321657 0.610573
+v 0.077932 0.343591 0.647077
+v 0.109456 0.365986 0.675877
+v 0.129229 0.343591 0.638032
+v 0.122077 0.321657 0.605773
+v 0.073620 0.321657 0.614318
+v 0.082275 0.365986 0.680061
+v 0.136429 0.365986 0.670512
+v -0.000000 0.242885 0.652184
+v -0.000000 0.208316 0.619142
+v 0.026044 0.242885 0.651617
+v -0.000000 0.276222 0.685453
+v -0.026044 0.242885 0.651617
+v -0.024602 0.208316 0.618606
+v 0.024602 0.208316 0.618606
+v 0.027495 0.276222 0.684854
+v -0.027495 0.276222 0.684854
+v -0.000000 0.343591 0.652184
+v -0.000000 0.321657 0.619142
+v -0.026044 0.343591 0.651617
+v -0.000000 0.365986 0.685453
+v 0.026044 0.343591 0.651617
+v 0.024602 0.321657 0.618606
+v -0.024602 0.321657 0.618606
+v -0.027495 0.365986 0.684854
+v 0.027495 0.365986 0.684854
+v -0.000000 0.407946 0.740770
+v -0.000000 0.399193 0.731175
+v -0.029908 0.407946 0.740118
+v -0.000000 0.413040 0.744876
+v 0.029908 0.407946 0.740118
+v 0.029489 0.399193 0.730532
+v -0.029489 0.399193 0.730532
+v -0.030087 0.413040 0.744221
+v 0.030087 0.413040 0.744221
+v 0.119062 0.407946 0.730353
+v 0.117396 0.399193 0.720904
+v 0.089495 0.407946 0.734905
+v 0.119775 0.413040 0.734397
+v 0.148402 0.407946 0.724518
+v 0.146325 0.399193 0.715150
+v 0.088243 0.399193 0.725392
+v 0.090031 0.413040 0.738976
+v 0.149291 0.413040 0.728527
+v 0.234506 0.407946 0.699420
+v 0.231224 0.399193 0.690403
+v 0.206179 0.407946 0.709036
+v 0.235911 0.413040 0.703279
+v 0.262387 0.407946 0.688578
+v 0.258715 0.399193 0.679714
+v 0.203294 0.399193 0.699886
+v 0.207414 0.413040 0.712953
+v 0.263959 0.413040 0.692373
+v 0.342825 0.407946 0.648910
+v 0.338027 0.399193 0.640600
+v 0.316598 0.407946 0.663299
+v 0.344878 0.413040 0.652467
+v 0.368400 0.407946 0.633392
+v 0.363245 0.399193 0.625299
+v 0.312168 0.399193 0.654788
+v 0.318494 0.413040 0.666942
+v 0.370607 0.413040 0.636855
+v 0.440727 0.407946 0.580358
+v 0.434560 0.399193 0.573008
+v 0.417398 0.407946 0.599083
+v 0.443367 0.413040 0.583504
+v 0.463219 0.407946 0.560634
+v 0.456737 0.399193 0.553560
+v 0.411557 0.399193 0.591471
+v 0.419898 0.413040 0.602341
+v 0.465994 0.413040 0.563662
+v 0.525238 0.407946 0.495847
+v 0.517888 0.399193 0.489679
+v 0.505515 0.407946 0.518339
+v 0.528385 0.413040 0.498487
+v 0.543964 0.407946 0.472517
+v 0.536351 0.399193 0.466676
+v 0.498441 0.399193 0.511856
+v 0.508543 0.413040 0.521113
+v 0.547222 0.413040 0.475018
+v 0.593790 0.407946 0.397945
+v 0.585481 0.399193 0.393147
+v 0.578272 0.407946 0.423520
+v 0.597347 0.413040 0.399998
+v 0.608180 0.407946 0.371718
+v 0.599669 0.399193 0.367287
+v 0.570180 0.399193 0.418364
+v 0.581736 0.413040 0.425726
+v 0.611823 0.413040 0.373614
+v 0.644300 0.407946 0.289626
+v 0.635284 0.399193 0.286344
+v 0.633459 0.407946 0.317507
+v 0.648160 0.413040 0.291030
+v 0.653917 0.407946 0.261299
+v 0.644766 0.399193 0.258413
+v 0.624594 0.399193 0.313835
+v 0.637253 0.413040 0.319079
+v 0.657834 0.413040 0.262534
+v 0.675234 0.407946 0.174181
+v 0.665784 0.399193 0.172515
+v 0.669398 0.407946 0.203522
+v 0.679278 0.413040 0.174894
+v 0.679785 0.407946 0.144615
+v 0.670272 0.399193 0.143362
+v 0.660031 0.399193 0.201445
+v 0.673408 0.413040 0.204411
+v 0.683857 0.413040 0.145151
+v 0.685650 0.407946 0.055119
+v 0.676055 0.399193 0.055119
+v 0.684999 0.407946 0.085027
+v 0.689757 0.413040 0.055119
+v 0.684999 0.407946 0.025212
+v 0.675413 0.399193 0.025630
+v 0.675413 0.399193 0.084609
+v 0.689102 0.413040 0.085206
+v 0.689102 0.413040 0.025033
+v 0.675234 0.407946 -0.063942
+v 0.665784 0.399193 -0.062276
+v 0.679785 0.407946 -0.034376
+v 0.679278 0.413040 -0.064656
+v 0.669399 0.407946 -0.093283
+v 0.660031 0.399193 -0.091206
+v 0.670272 0.399193 -0.033123
+v 0.683857 0.413040 -0.034912
+v 0.673408 0.413040 -0.094172
+v 0.644301 0.407946 -0.179387
+v 0.635284 0.399193 -0.176105
+v 0.653917 0.407946 -0.151060
+v 0.648160 0.413040 -0.180791
+v 0.633459 0.407946 -0.207268
+v 0.624594 0.399193 -0.203596
+v 0.644766 0.399193 -0.148174
+v 0.657834 0.413040 -0.152295
+v 0.637253 0.413040 -0.208840
+v 0.593989 0.407946 -0.287502
+v 0.585670 0.399193 -0.282714
+v 0.608180 0.407946 -0.261479
+v 0.597549 0.413040 -0.289551
+v 0.579065 0.407946 -0.312465
+v 0.570934 0.399193 -0.307348
+v 0.599669 0.399193 -0.257048
+v 0.611823 0.413040 -0.263375
+v 0.582545 0.413040 -0.314655
+v 0.499969 0.407879 -0.418765
+v 0.492547 0.399151 -0.412574
+v 0.503318 0.407946 -0.414684
+v 0.503130 0.412894 -0.421388
+v 0.498623 0.407679 -0.420358
+v 0.491229 0.399026 -0.414185
+v 0.495867 0.399193 -0.408518
+v 0.506508 0.413040 -0.417323
+v 0.501727 0.412456 -0.422894
+v 0.498158 0.370299 -0.420980
+v 0.490727 0.359933 -0.414799
+v 0.498141 0.383558 -0.421019
+v 0.501384 0.376373 -0.423525
+v 0.498210 0.357267 -0.420863
+v 0.490806 0.346154 -0.414702
+v 0.490701 0.373795 -0.414831
+v 0.501394 0.389185 -0.423583
+v 0.501353 0.364229 -0.423352
+v 0.499969 0.337065 -0.418765
+v 0.492547 0.324403 -0.412574
+v 0.498623 0.340187 -0.420358
+v 0.503130 0.346534 -0.421388
+v 0.503318 0.336024 -0.414684
+v 0.495867 0.323258 -0.408518
+v 0.491229 0.327837 -0.414185
+v 0.501727 0.349056 -0.422894
+v 0.506508 0.345694 -0.417323
+v 0.593989 0.336024 -0.287502
+v 0.585670 0.323258 -0.282714
+v 0.579065 0.336024 -0.312465
+v 0.597549 0.345694 -0.289551
+v 0.608180 0.336024 -0.261479
+v 0.599669 0.323258 -0.257048
+v 0.570934 0.323258 -0.307348
+v 0.582545 0.345694 -0.314655
+v 0.611823 0.345694 -0.263375
+v 0.644301 0.336024 -0.179387
+v 0.635284 0.323258 -0.176105
+v 0.633459 0.336024 -0.207268
+v 0.648160 0.345694 -0.180791
+v 0.653917 0.336024 -0.151060
+v 0.644766 0.323258 -0.148174
+v 0.624594 0.323258 -0.203596
+v 0.637253 0.345694 -0.208840
+v 0.657834 0.345694 -0.152295
+v 0.675234 0.336024 -0.063942
+v 0.665784 0.323258 -0.062276
+v 0.669399 0.336024 -0.093283
+v 0.679278 0.345694 -0.064656
+v 0.679785 0.336024 -0.034376
+v 0.670272 0.323258 -0.033123
+v 0.660031 0.323258 -0.091206
+v 0.673408 0.345694 -0.094172
+v 0.683857 0.345694 -0.034912
+v 0.685650 0.336024 0.055119
+v 0.676055 0.323258 0.055119
+v 0.684999 0.336024 0.025212
+v 0.689757 0.345694 0.055119
+v 0.684999 0.336024 0.085027
+v 0.675413 0.323258 0.084609
+v 0.675413 0.323258 0.025630
+v 0.689102 0.345694 0.025033
+v 0.689102 0.345694 0.085206
+v 0.675234 0.336025 0.174181
+v 0.665784 0.323258 0.172515
+v 0.679785 0.336025 0.144615
+v 0.679278 0.345694 0.174894
+v 0.669398 0.336025 0.203522
+v 0.660031 0.323258 0.201445
+v 0.670272 0.323258 0.143362
+v 0.683857 0.345694 0.145151
+v 0.673408 0.345694 0.204411
+v 0.644300 0.336025 0.289626
+v 0.635284 0.323258 0.286344
+v 0.653917 0.336025 0.261299
+v 0.648160 0.345694 0.291030
+v 0.633459 0.336025 0.317507
+v 0.624594 0.323258 0.313835
+v 0.644766 0.323258 0.258413
+v 0.657834 0.345694 0.262534
+v 0.637253 0.345694 0.319079
+v 0.593790 0.336025 0.397945
+v 0.585481 0.323258 0.393147
+v 0.608180 0.336025 0.371718
+v 0.597347 0.345694 0.399998
+v 0.578272 0.336025 0.423520
+v 0.570180 0.323258 0.418364
+v 0.599669 0.323258 0.367287
+v 0.611823 0.345694 0.373614
+v 0.581736 0.345694 0.425726
+v 0.525238 0.336025 0.495847
+v 0.517888 0.323258 0.489679
+v 0.543964 0.336025 0.472517
+v 0.528384 0.345694 0.498487
+v 0.505515 0.336025 0.518339
+v 0.498441 0.323258 0.511856
+v 0.536351 0.323258 0.466676
+v 0.547222 0.345694 0.475017
+v 0.508543 0.345694 0.521113
+v 0.440727 0.336025 0.580358
+v 0.434560 0.323258 0.573008
+v 0.463219 0.336025 0.560634
+v 0.443367 0.345694 0.583504
+v 0.417398 0.336025 0.599083
+v 0.411557 0.323258 0.591471
+v 0.456737 0.323258 0.553560
+v 0.465994 0.345694 0.563662
+v 0.419898 0.345694 0.602341
+v 0.342825 0.336025 0.648910
+v 0.338027 0.323258 0.640600
+v 0.368400 0.336025 0.633392
+v 0.344878 0.345694 0.652467
+v 0.316598 0.336025 0.663299
+v 0.312168 0.323258 0.654789
+v 0.363245 0.323258 0.625299
+v 0.370607 0.345694 0.636855
+v 0.318494 0.345694 0.666942
+v 0.234506 0.336025 0.699420
+v 0.231224 0.323258 0.690404
+v 0.262387 0.336025 0.688578
+v 0.235911 0.345694 0.703279
+v 0.206179 0.336025 0.709037
+v 0.203294 0.323258 0.699886
+v 0.258715 0.323258 0.679714
+v 0.263959 0.345694 0.692373
+v 0.207414 0.345694 0.712953
+v 0.119062 0.336025 0.730353
+v 0.117396 0.323258 0.720904
+v 0.148402 0.336025 0.724518
+v 0.119775 0.345694 0.734397
+v 0.089495 0.336025 0.734905
+v 0.088243 0.323258 0.725392
+v 0.146325 0.323258 0.715150
+v 0.149291 0.345694 0.728527
+v 0.090031 0.345694 0.738976
+v -0.000000 0.336025 0.740770
+v -0.000000 0.323258 0.731175
+v 0.029908 0.336025 0.740118
+v -0.000000 0.345694 0.744876
+v -0.029908 0.336025 0.740118
+v -0.029489 0.323258 0.730532
+v 0.029489 0.323258 0.730532
+v 0.030087 0.345694 0.744221
+v -0.030087 0.345694 0.744221
+v 0.277287 0.048802 -0.175257
+v 0.277169 0.065989 -0.175159
+v 0.269335 0.048801 -0.185001
+v 0.277642 0.031802 -0.175552
+v 0.286193 0.048802 -0.163845
+v 0.286071 0.065989 -0.163751
+v 0.269220 0.065989 -0.184898
+v 0.269679 0.031802 -0.185307
+v 0.286560 0.031802 -0.164125
+v 0.277280 0.095390 -0.175251
+v 0.277614 0.097928 -0.175529
+v 0.269328 0.095390 -0.184995
+v 0.277169 0.090035 -0.175159
+v 0.286186 0.095390 -0.163839
+v 0.286530 0.097928 -0.164103
+v 0.269652 0.097928 -0.185284
+v 0.269220 0.090035 -0.184898
+v 0.286071 0.090035 -0.163751
+v 0.280728 0.100651 -0.178116
+v 0.282063 0.103550 -0.179225
+v 0.272677 0.100651 -0.187980
+v 0.279393 0.099434 -0.177007
+v 0.289744 0.100651 -0.166562
+v 0.291122 0.103550 -0.167616
+v 0.273974 0.103550 -0.189136
+v 0.271381 0.099434 -0.186825
+v 0.288367 0.099434 -0.165508
+v 0.284176 0.131029 -0.180980
+v 0.276026 0.131028 -0.190966
+v 0.283842 0.118510 -0.180703
+v 0.293303 0.131029 -0.169284
+v 0.284287 0.146145 -0.181073
+v 0.276134 0.146145 -0.191062
+v 0.275702 0.118510 -0.190677
+v 0.292958 0.118510 -0.169021
+v 0.293418 0.146145 -0.169372
+v 0.284287 0.200351 -0.181073
+v 0.276134 0.200351 -0.191062
+v 0.284287 0.181889 -0.181073
+v 0.293418 0.200351 -0.169372
+v 0.284287 0.217081 -0.181073
+v 0.276134 0.217081 -0.191062
+v 0.276134 0.181889 -0.191062
+v 0.293418 0.181889 -0.169372
+v 0.293418 0.217081 -0.169372
+v 0.388267 0.269642 -0.267075
+v 0.389795 0.270053 -0.267993
+v 0.377710 0.270241 -0.280029
+v 0.387075 0.270053 -0.265757
+v 0.400540 0.269442 -0.251330
+v 0.401984 0.269865 -0.252436
+v 0.379583 0.270617 -0.280262
+v 0.377181 0.270617 -0.278195
+v 0.399095 0.269865 -0.250225
+v 0.461989 0.343513 -0.323911
+v 0.449388 0.343279 -0.338926
+v 0.435131 0.321344 -0.303661
+v 0.475889 0.343591 -0.306043
+v 0.488743 0.365986 -0.344215
+v 0.476217 0.365986 -0.359875
+v 0.421593 0.320407 -0.317784
+v 0.449020 0.321657 -0.286589
+v 0.502943 0.365986 -0.325630
+v 0.532987 0.407946 -0.377906
+v 0.519873 0.407946 -0.394429
+v 0.525313 0.399193 -0.372062
+v 0.547925 0.407946 -0.358198
+v 0.536272 0.413040 -0.380407
+v 0.523114 0.413040 -0.396994
+v 0.512301 0.399193 -0.388435
+v 0.540123 0.399193 -0.352549
+v 0.551265 0.413040 -0.360616
+v 0.537998 0.381816 -0.381721
+v 0.553020 0.381816 -0.361887
+v 0.537726 0.367956 -0.381514
+v 0.524817 0.381816 -0.398342
+v 0.538089 0.395116 -0.381791
+v 0.553112 0.395116 -0.361953
+v 0.552742 0.367956 -0.361686
+v 0.524548 0.367956 -0.398129
+v 0.524907 0.395116 -0.398413
+v 0.532987 0.336024 -0.377906
+v 0.525313 0.323258 -0.372062
+v 0.519873 0.336024 -0.394429
+v 0.536272 0.345694 -0.380407
+v 0.547925 0.336024 -0.358198
+v 0.540123 0.323258 -0.352549
+v 0.512301 0.323258 -0.388435
+v 0.523114 0.345694 -0.396994
+v 0.551265 0.345694 -0.360616
+v 0.462133 0.242884 -0.323953
+v 0.435704 0.208316 -0.303829
+v 0.449961 0.242884 -0.339093
+v 0.488743 0.276222 -0.344215
+v 0.475889 0.242884 -0.306043
+v 0.449020 0.208316 -0.286589
+v 0.423884 0.208316 -0.318453
+v 0.476217 0.276222 -0.359875
+v 0.502943 0.276222 -0.325630
+v 0.396436 0.132350 -0.274097
+v 0.401543 0.118510 -0.278491
+v 0.385101 0.132350 -0.287993
+v 0.400587 0.151431 -0.277089
+v 0.409135 0.132350 -0.257815
+v 0.414439 0.118510 -0.261965
+v 0.390027 0.118510 -0.292601
+v 0.389234 0.151431 -0.291028
+v 0.413317 0.151431 -0.260740
+v 0.469792 0.100745 -0.335195
+v 0.499314 0.099810 -0.359722
+v 0.456319 0.100745 -0.351702
+v 0.440482 0.103550 -0.310843
+v 0.484880 0.100745 -0.315859
+v 0.515350 0.099810 -0.339171
+v 0.484994 0.099810 -0.377267
+v 0.427849 0.103550 -0.326321
+v 0.454629 0.103550 -0.292714
+v 0.548518 0.099716 -0.400602
+v 0.552221 0.099434 -0.403679
+v 0.532787 0.099716 -0.419876
+v 0.539946 0.099810 -0.393480
+v 0.566134 0.099716 -0.378026
+v 0.569957 0.099434 -0.380951
+v 0.536384 0.099434 -0.423083
+v 0.524461 0.099810 -0.412453
+v 0.557288 0.099810 -0.371257
+v 0.554232 0.095390 -0.405350
+v 0.554338 0.090035 -0.405438
+v 0.538338 0.095390 -0.424825
+v 0.553915 0.097928 -0.405086
+v 0.572033 0.095390 -0.382539
+v 0.572142 0.090035 -0.382622
+v 0.538441 0.090035 -0.424916
+v 0.538029 0.097928 -0.424550
+v 0.571705 0.097928 -0.382288
+v 0.554219 0.048801 -0.405338
+v 0.553860 0.031802 -0.405040
+v 0.538325 0.048801 -0.424813
+v 0.554338 0.065989 -0.405438
+v 0.572018 0.048801 -0.382528
+v 0.571647 0.031802 -0.382244
+v 0.537978 0.031802 -0.424504
+v 0.538441 0.065989 -0.424916
+v 0.572142 0.065989 -0.382622
+v 0.358991 0.283161 -0.303480
+v 0.368087 0.289211 -0.311552
+v 0.358968 0.276682 -0.303507
+v 0.351248 0.279552 -0.296079
+v 0.359059 0.285873 -0.303398
+v 0.368156 0.291878 -0.311469
+v 0.368064 0.282832 -0.311580
+v 0.351225 0.273115 -0.296106
+v 0.351315 0.282253 -0.295999
+v 0.429586 0.340387 -0.363482
+v 0.429562 0.335214 -0.363512
+v 0.403733 0.318291 -0.341738
+v 0.429661 0.342549 -0.363392
+v 0.455400 0.363055 -0.385158
+v 0.455374 0.358404 -0.385189
+v 0.403709 0.312600 -0.341767
+v 0.403806 0.320670 -0.341651
+v 0.455476 0.365000 -0.385065
+v 0.498158 0.405569 -0.420980
+v 0.498141 0.401816 -0.421019
+v 0.490727 0.396714 -0.414799
+v 0.498210 0.407057 -0.420863
+v 0.501384 0.410726 -0.423525
+v 0.501394 0.407132 -0.423583
+v 0.490701 0.392779 -0.414831
+v 0.490806 0.398359 -0.414702
+v 0.504741 0.416009 -0.422749
+v 0.508183 0.416291 -0.418710
+v 0.504824 0.412604 -0.422824
+v 0.503159 0.415163 -0.424159
+v 0.504492 0.416708 -0.422526
+v 0.507919 0.416977 -0.418491
+v 0.508272 0.412892 -0.418783
+v 0.503227 0.411740 -0.424237
+v 0.502956 0.415901 -0.423924
+v 0.537998 0.416291 -0.381721
+v 0.553020 0.416291 -0.361887
+v 0.538089 0.412892 -0.381791
+v 0.524817 0.416291 -0.398342
+v 0.537726 0.416977 -0.381514
+v 0.552742 0.416977 -0.361686
+v 0.553112 0.412892 -0.361953
+v 0.524907 0.412892 -0.398413
+v 0.524548 0.416977 -0.398129
+v 0.599420 0.416291 -0.290628
+v 0.613737 0.416291 -0.264372
+v 0.599519 0.412892 -0.290684
+v 0.584373 0.416291 -0.315806
+v 0.599125 0.416977 -0.290458
+v 0.613435 0.416977 -0.264214
+v 0.613838 0.412892 -0.264424
+v 0.584469 0.412892 -0.315866
+v 0.584084 0.416977 -0.315624
+v 0.650187 0.416292 -0.181529
+v 0.659892 0.416292 -0.152944
+v 0.650294 0.412892 -0.181568
+v 0.639247 0.416292 -0.209665
+v 0.649867 0.416977 -0.181413
+v 0.659567 0.416977 -0.152841
+v 0.660000 0.412892 -0.152978
+v 0.639352 0.412892 -0.209709
+v 0.638932 0.416977 -0.209535
+v 0.681403 0.416292 -0.065030
+v 0.685997 0.416292 -0.035194
+v 0.681515 0.412892 -0.065050
+v 0.675515 0.416292 -0.094639
+v 0.681068 0.416977 -0.064971
+v 0.685659 0.416977 -0.035149
+v 0.686109 0.412892 -0.035208
+v 0.675626 0.412892 -0.094663
+v 0.675182 0.416977 -0.094565
+v 0.691915 0.416292 0.055119
+v 0.691257 0.416292 0.085300
+v 0.692029 0.412892 0.055119
+v 0.691257 0.416292 0.024938
+v 0.691574 0.416977 0.055119
+v 0.690917 0.416977 0.085286
+v 0.691371 0.412892 0.085305
+v 0.691371 0.412892 0.024933
+v 0.690917 0.416977 0.024953
+v 0.681403 0.416292 0.175269
+v 0.675515 0.416292 0.204878
+v 0.681515 0.412892 0.175289
+v 0.685997 0.416292 0.145432
+v 0.681068 0.416977 0.175210
+v 0.675182 0.416977 0.204804
+v 0.675626 0.412892 0.204902
+v 0.686109 0.412892 0.145447
+v 0.685659 0.416977 0.145388
+v 0.650187 0.416292 0.291768
+v 0.639247 0.416292 0.319904
+v 0.650294 0.412892 0.291807
+v 0.659892 0.416292 0.263183
+v 0.649867 0.416977 0.291652
+v 0.638932 0.416977 0.319774
+v 0.639352 0.412892 0.319948
+v 0.660000 0.412892 0.263217
+v 0.659567 0.416977 0.263080
+v 0.599216 0.416292 0.401077
+v 0.583556 0.416292 0.426886
+v 0.599314 0.412892 0.401134
+v 0.613737 0.416292 0.374611
+v 0.598921 0.416977 0.400907
+v 0.583269 0.416977 0.426703
+v 0.583652 0.412892 0.426947
+v 0.613838 0.412892 0.374663
+v 0.613435 0.416977 0.374453
+v 0.530038 0.416292 0.499874
+v 0.510134 0.416292 0.522571
+v 0.530125 0.412892 0.499947
+v 0.548934 0.416292 0.476331
+v 0.529777 0.416977 0.499655
+v 0.509883 0.416977 0.522341
+v 0.510217 0.412892 0.522648
+v 0.549024 0.412892 0.476400
+v 0.548664 0.416977 0.476124
+v 0.444754 0.416292 0.585157
+v 0.421211 0.416292 0.604053
+v 0.444827 0.412892 0.585244
+v 0.467452 0.416292 0.565253
+v 0.444535 0.416977 0.584896
+v 0.421004 0.416977 0.603783
+v 0.421281 0.412892 0.604143
+v 0.467528 0.412892 0.565337
+v 0.467221 0.416977 0.565002
+v 0.345957 0.416292 0.654335
+v 0.319491 0.416292 0.668856
+v 0.346014 0.412892 0.654434
+v 0.371766 0.416292 0.638675
+v 0.345787 0.416977 0.654040
+v 0.319334 0.416977 0.668554
+v 0.319543 0.412892 0.668957
+v 0.371827 0.412892 0.638771
+v 0.371583 0.416977 0.638388
+v 0.236649 0.416292 0.705307
+v 0.208063 0.416292 0.715011
+v 0.236687 0.412892 0.705414
+v 0.264785 0.416292 0.694366
+v 0.236532 0.416977 0.704987
+v 0.207960 0.416977 0.714686
+v 0.208097 0.412892 0.715120
+v 0.264828 0.412892 0.694471
+v 0.264654 0.416977 0.694052
+v 0.120150 0.416292 0.736523
+v 0.090313 0.416292 0.741116
+v 0.120169 0.412892 0.736634
+v 0.149758 0.416292 0.730634
+v 0.120090 0.416977 0.736187
+v 0.090268 0.416977 0.740778
+v 0.090328 0.412892 0.741228
+v 0.149782 0.412892 0.730745
+v 0.149684 0.416977 0.730301
+v -0.000000 0.416292 0.747034
+v -0.030181 0.416292 0.746377
+v -0.000000 0.412892 0.747148
+v 0.030181 0.416292 0.746377
+v -0.000000 0.416977 0.746694
+v -0.030166 0.416977 0.746036
+v -0.030186 0.412892 0.746490
+v 0.030186 0.412892 0.746490
+v 0.030166 0.416977 0.746036
+v -0.000000 0.244313 0.426573
+v 0.016203 0.244313 0.426220
+v -0.000000 0.238976 0.424542
+v -0.016203 0.244313 0.426220
+v -0.000000 0.248266 0.432668
+v 0.016468 0.248266 0.432309
+v 0.016114 0.238976 0.424191
+v -0.016114 0.238976 0.424191
+v -0.016468 0.248266 0.432309
+v 0.064502 0.244313 0.420930
+v 0.080397 0.244313 0.417769
+v 0.064149 0.238976 0.418929
+v 0.048484 0.244313 0.423396
+v 0.065561 0.248266 0.426932
+v 0.081717 0.248266 0.423719
+v 0.079958 0.238976 0.415785
+v 0.048219 0.238976 0.421382
+v 0.049280 0.248266 0.429438
+v 0.127045 0.244313 0.404172
+v 0.142149 0.244313 0.398299
+v 0.126350 0.238976 0.402263
+v 0.111698 0.244313 0.409382
+v 0.129129 0.248266 0.409899
+v 0.144482 0.248266 0.403929
+v 0.141372 0.238976 0.396422
+v 0.111087 0.238976 0.407444
+v 0.113531 0.248266 0.415194
+v 0.185727 0.244313 0.376808
+v 0.199582 0.244313 0.368401
+v 0.184711 0.238976 0.375049
+v 0.171518 0.244313 0.384604
+v 0.188774 0.248266 0.382086
+v 0.202857 0.248266 0.373541
+v 0.198491 0.238976 0.366687
+v 0.170580 0.238976 0.382802
+v 0.174333 0.248266 0.390010
+v 0.238766 0.244313 0.339670
+v 0.250951 0.244313 0.328984
+v 0.237460 0.238976 0.338113
+v 0.226127 0.244313 0.349814
+v 0.242683 0.248266 0.344338
+v 0.255068 0.248266 0.333478
+v 0.249578 0.238976 0.327486
+v 0.224890 0.238976 0.348202
+v 0.229837 0.248266 0.354649
+v 0.284550 0.244313 0.293885
+v 0.294695 0.244313 0.281247
+v 0.282994 0.238976 0.292580
+v 0.273865 0.244313 0.306070
+v 0.289219 0.248266 0.297803
+v 0.299530 0.248266 0.284957
+v 0.293083 0.238976 0.280010
+v 0.272367 0.238976 0.304698
+v 0.278358 0.248266 0.310188
+v 0.321688 0.244313 0.240846
+v 0.329484 0.244313 0.226638
+v 0.319929 0.238976 0.239831
+v 0.313281 0.244313 0.254702
+v 0.326967 0.248266 0.243894
+v 0.334890 0.248266 0.229452
+v 0.327682 0.238976 0.225700
+v 0.311568 0.238976 0.253610
+v 0.318422 0.248266 0.257977
+v 0.349052 0.244313 0.182164
+v 0.354262 0.244313 0.166818
+v 0.347143 0.238976 0.181469
+v 0.343179 0.244313 0.197269
+v 0.354780 0.248266 0.184249
+v 0.360075 0.248266 0.168651
+v 0.352325 0.238976 0.166207
+v 0.341302 0.238976 0.196492
+v 0.348810 0.248266 0.199601
+v 0.365811 0.244313 0.119622
+v 0.368277 0.244313 0.103604
+v 0.363810 0.238976 0.119269
+v 0.362649 0.244313 0.135517
+v 0.371813 0.248266 0.120680
+v 0.374319 0.248266 0.104399
+v 0.366262 0.238976 0.103339
+v 0.360666 0.238976 0.135077
+v 0.368600 0.248266 0.136836
+v 0.371454 0.244313 0.055119
+v 0.371101 0.244313 0.038917
+v 0.369422 0.238976 0.055119
+v 0.371101 0.244313 0.071322
+v 0.377549 0.248266 0.055119
+v 0.377190 0.248266 0.038651
+v 0.369071 0.238976 0.039005
+v 0.369071 0.238976 0.071234
+v 0.377190 0.248266 0.071588
+v 0.365811 0.244313 -0.009383
+v 0.362650 0.244313 -0.025278
+v 0.363810 0.238976 -0.009030
+v 0.368277 0.244313 0.006635
+v 0.371813 0.248266 -0.010441
+v 0.368600 0.248266 -0.026597
+v 0.360666 0.238976 -0.024838
+v 0.366262 0.238976 0.006900
+v 0.374319 0.248266 0.005839
+v 0.349053 0.244313 -0.071925
+v 0.343179 0.244313 -0.087030
+v 0.347143 0.238976 -0.071230
+v 0.354262 0.244313 -0.056579
+v 0.354780 0.248266 -0.074010
+v 0.348810 0.248266 -0.089362
+v 0.341302 0.238976 -0.086253
+v 0.352325 0.238976 -0.055968
+v 0.360075 0.248266 -0.058412
+v 0.321705 0.244313 -0.130588
+v 0.313349 0.244313 -0.144383
+v 0.319946 0.238976 -0.129572
+v 0.329484 0.244313 -0.116399
+v 0.326984 0.248266 -0.133635
+v 0.318490 0.248266 -0.147656
+v 0.311635 0.238976 -0.143292
+v 0.327682 0.238976 -0.115461
+v 0.334890 0.248266 -0.119213
+v 0.285850 0.244313 -0.182372
+v 0.277653 0.244313 -0.192416
+v 0.284287 0.238976 -0.181073
+v 0.295031 0.244313 -0.170607
+v 0.290541 0.248266 -0.186268
+v 0.282208 0.248266 -0.196478
+v 0.276134 0.238976 -0.191062
+v 0.293418 0.238976 -0.169372
+v 0.299872 0.248266 -0.174310
+v 0.266491 0.244887 -0.208793
+v 0.269868 0.246608 -0.213996
+v 0.265080 0.239545 -0.207400
+v 0.267198 0.244313 -0.204875
+v 0.270726 0.248778 -0.212974
+v 0.273743 0.250316 -0.217814
+v 0.268576 0.241252 -0.212723
+v 0.265737 0.238976 -0.203453
+v 0.271582 0.248266 -0.209141
+v 0.308681 0.048801 -0.253518
+v 0.308738 0.031802 -0.253446
+v 0.290945 0.048801 -0.235785
+v 0.308662 0.065989 -0.253542
+v 0.326426 0.048801 -0.271261
+v 0.326479 0.031802 -0.271178
+v 0.291006 0.031802 -0.235724
+v 0.290925 0.065989 -0.235806
+v 0.326408 0.065989 -0.271289
+v 0.308603 0.096288 -0.253480
+v 0.326408 0.096325 -0.271289
+v 0.308662 0.090035 -0.253542
+v 0.290689 0.096174 -0.235558
+v 0.308426 0.101517 -0.253294
+v 0.326408 0.101668 -0.271289
+v 0.326408 0.090035 -0.271289
+v 0.290925 0.090035 -0.235806
+v 0.289981 0.101063 -0.234815
+v 0.308707 0.131200 -0.253553
+v 0.326408 0.131352 -0.271289
+v 0.308485 0.117982 -0.253336
+v 0.291107 0.130973 -0.235848
+v 0.308781 0.147359 -0.253625
+v 0.326408 0.147814 -0.271289
+v 0.326408 0.118133 -0.271289
+v 0.290220 0.117528 -0.234981
+v 0.291403 0.146904 -0.236137
+v 0.308781 0.210061 -0.253625
+v 0.326408 0.213703 -0.271289
+v 0.308781 0.187958 -0.253625
+v 0.291403 0.206420 -0.236137
+v 0.308781 0.230433 -0.253625
+v 0.326408 0.235440 -0.271289
+v 0.326408 0.190234 -0.271289
+v 0.291403 0.185682 -0.236137
+v 0.291403 0.225426 -0.236137
+v 0.308941 0.262876 -0.253742
+v 0.326429 0.269993 -0.271264
+v 0.308781 0.257183 -0.253625
+v 0.291981 0.255863 -0.236678
+v 0.309420 0.265468 -0.254094
+v 0.326491 0.272542 -0.271189
+v 0.326408 0.264011 -0.271289
+v 0.291403 0.250355 -0.236137
+v 0.293716 0.258812 -0.238301
+v 0.310305 0.266593 -0.252248
+v 0.327956 0.273953 -0.269970
+v 0.309726 0.266544 -0.253729
+v 0.293201 0.259261 -0.235224
+v 0.312705 0.266670 -0.249476
+v 0.330854 0.274297 -0.268098
+v 0.326824 0.273653 -0.270793
+v 0.293980 0.259784 -0.237987
+v 0.294964 0.259087 -0.231893
+v 0.334353 0.266553 -0.222754
+v 0.353226 0.273830 -0.238690
+v 0.324878 0.266643 -0.234851
+v 0.315555 0.259087 -0.207051
+v 0.345052 0.266523 -0.208878
+v 0.364416 0.273711 -0.223692
+v 0.343551 0.274188 -0.252494
+v 0.306505 0.259087 -0.218139
+v 0.325689 0.259087 -0.194063
+v 0.376249 0.266523 -0.162073
+v 0.397363 0.273711 -0.174261
+v 0.366476 0.266523 -0.178208
+v 0.355135 0.259087 -0.149885
+v 0.385347 0.266523 -0.145479
+v 0.406971 0.273711 -0.156736
+v 0.387041 0.273711 -0.191301
+v 0.345910 0.259087 -0.165114
+v 0.363723 0.259087 -0.134222
+v 0.408233 0.266523 -0.093465
+v 0.431141 0.273711 -0.101803
+v 0.401364 0.266523 -0.111131
+v 0.385324 0.259087 -0.085127
+v 0.414326 0.266523 -0.075517
+v 0.437577 0.273711 -0.082848
+v 0.423887 0.273711 -0.120460
+v 0.378841 0.259087 -0.101802
+v 0.391076 0.259087 -0.068186
+v 0.427832 0.266523 -0.020319
+v 0.451841 0.273711 -0.024552
+v 0.424135 0.266523 -0.038909
+v 0.403824 0.259087 -0.016086
+v 0.430716 0.266523 -0.001585
+v 0.454887 0.273711 -0.004767
+v 0.447936 0.273711 -0.044186
+v 0.400334 0.259087 -0.033633
+v 0.406546 0.259087 0.001597
+v 0.434432 0.266523 0.055119
+v 0.458811 0.273711 0.055119
+v 0.434020 0.266523 0.036170
+v 0.410054 0.259087 0.055119
+v 0.434020 0.266523 0.074069
+v 0.458375 0.273711 0.075133
+v 0.458375 0.273711 0.035106
+v 0.409664 0.259087 0.037233
+v 0.409664 0.259087 0.073006
+v 0.427832 0.266524 0.130558
+v 0.451841 0.273711 0.134791
+v 0.430716 0.266524 0.111824
+v 0.403824 0.259087 0.126325
+v 0.424135 0.266524 0.149148
+v 0.447936 0.273711 0.154425
+v 0.454887 0.273711 0.115006
+v 0.406546 0.259087 0.108642
+v 0.400334 0.259087 0.143872
+v 0.408233 0.266524 0.203704
+v 0.431141 0.273711 0.212042
+v 0.414326 0.266524 0.185756
+v 0.385324 0.259087 0.195366
+v 0.401364 0.266524 0.221370
+v 0.423887 0.273711 0.230699
+v 0.437577 0.273711 0.193087
+v 0.391076 0.259087 0.178425
+v 0.378841 0.259087 0.212040
+v 0.376229 0.266524 0.272336
+v 0.397342 0.273711 0.284525
+v 0.385347 0.266524 0.255718
+v 0.355117 0.259087 0.260146
+v 0.366397 0.266524 0.288540
+v 0.386958 0.273711 0.301639
+v 0.406971 0.273711 0.266975
+v 0.363722 0.259087 0.244461
+v 0.345836 0.259087 0.275441
+v 0.332794 0.266524 0.334367
+v 0.351470 0.273711 0.350038
+v 0.344659 0.266524 0.319585
+v 0.314119 0.259087 0.318697
+v 0.320297 0.266524 0.348618
+v 0.338271 0.273711 0.365088
+v 0.364000 0.273711 0.334426
+v 0.325318 0.259087 0.304745
+v 0.302324 0.259087 0.332148
+v 0.279248 0.266524 0.387914
+v 0.294918 0.273711 0.406589
+v 0.293499 0.266524 0.375417
+v 0.263577 0.259087 0.369239
+v 0.264466 0.266524 0.399778
+v 0.279307 0.273711 0.419119
+v 0.309969 0.273711 0.393391
+v 0.277029 0.259087 0.357443
+v 0.249625 0.259087 0.380437
+v 0.217216 0.266524 0.431349
+v 0.229405 0.273711 0.452462
+v 0.233421 0.266524 0.421516
+v 0.205027 0.259087 0.410236
+v 0.200599 0.266524 0.440466
+v 0.211855 0.273711 0.462090
+v 0.246519 0.273711 0.442077
+v 0.220322 0.259087 0.400955
+v 0.189342 0.259087 0.418842
+v 0.148585 0.266524 0.463352
+v 0.156923 0.273711 0.486261
+v 0.166250 0.266524 0.456483
+v 0.140246 0.259087 0.440444
+v 0.130636 0.266524 0.469445
+v 0.137967 0.273711 0.492696
+v 0.175580 0.273711 0.479006
+v 0.156921 0.259087 0.433960
+v 0.123306 0.259087 0.446195
+v 0.075438 0.266524 0.482952
+v 0.079672 0.273711 0.506960
+v 0.094028 0.266524 0.479255
+v 0.071205 0.259087 0.458943
+v 0.056705 0.266524 0.485836
+v 0.059887 0.273711 0.510006
+v 0.099305 0.273711 0.503055
+v 0.088752 0.259087 0.455454
+v 0.053523 0.259087 0.461665
+v -0.000000 0.266524 0.489552
+v -0.000000 0.273711 0.513930
+v 0.018950 0.266524 0.489139
+v -0.000000 0.259087 0.465173
+v -0.018950 0.266524 0.489139
+v -0.020013 0.273711 0.513494
+v 0.020013 0.273711 0.513494
+v 0.017886 0.259087 0.464783
+v -0.017886 0.259087 0.464783
+v 0.443333 0.285891 -0.200794
+v 0.450470 0.292132 -0.204901
+v 0.431824 0.285891 -0.219797
+v 0.440953 0.282807 -0.199424
+v 0.454050 0.285891 -0.181244
+v 0.461352 0.292132 -0.185045
+v 0.438800 0.292132 -0.224187
+v 0.429499 0.282807 -0.218333
+v 0.451616 0.282807 -0.179977
+v 0.430793 0.283494 -0.193559
+v 0.425515 0.282543 -0.190512
+v 0.441210 0.283494 -0.174560
+v 0.432552 0.282807 -0.194575
+v 0.419603 0.283494 -0.212032
+v 0.414461 0.282543 -0.208759
+v 0.435803 0.282543 -0.171745
+v 0.443012 0.282807 -0.175498
+v 0.421317 0.282807 -0.213123
+v 0.481016 0.285891 -0.119956
+v 0.488752 0.292132 -0.122772
+v 0.472922 0.285891 -0.140771
+v 0.478438 0.282807 -0.119018
+v 0.488196 0.285891 -0.098808
+v 0.496047 0.292132 -0.101283
+v 0.480528 0.292132 -0.143922
+v 0.470387 0.282807 -0.139721
+v 0.485579 0.282807 -0.097983
+v 0.467413 0.283494 -0.115005
+v 0.461686 0.282543 -0.112921
+v 0.474390 0.283494 -0.094455
+v 0.469322 0.282807 -0.115700
+v 0.459548 0.283494 -0.135232
+v 0.453918 0.282543 -0.132899
+v 0.468577 0.282543 -0.092622
+v 0.476327 0.282807 -0.095066
+v 0.461425 0.282807 -0.136009
+v 0.504110 0.285891 -0.033769
+v 0.512217 0.292132 -0.035198
+v 0.499753 0.285891 -0.055673
+v 0.501407 0.282807 -0.033292
+v 0.507508 0.285891 -0.011695
+v 0.515670 0.292132 -0.012770
+v 0.507790 0.292132 -0.057455
+v 0.497074 0.282807 -0.055079
+v 0.504787 0.282807 -0.011337
+v 0.489854 0.283494 -0.031255
+v 0.483852 0.282543 -0.030197
+v 0.493156 0.283494 -0.009806
+v 0.491855 0.282807 -0.031608
+v 0.485621 0.283494 -0.052540
+v 0.479671 0.282543 -0.051221
+v 0.487114 0.282543 -0.009010
+v 0.495170 0.282807 -0.010071
+v 0.487604 0.282807 -0.052980
+v 0.511886 0.285891 0.055119
+v 0.520119 0.292132 0.055119
+v 0.511400 0.285891 0.032791
+v 0.509143 0.282807 0.055119
+v 0.511400 0.285891 0.077448
+v 0.519624 0.292132 0.077807
+v 0.519624 0.292132 0.032432
+v 0.508659 0.282807 0.032911
+v 0.508659 0.282807 0.077328
+v 0.497411 0.283494 0.055119
+v 0.491316 0.282543 0.055119
+v 0.496938 0.283494 0.076816
+v 0.499442 0.282807 0.055119
+v 0.496938 0.283494 0.033423
+v 0.490849 0.282543 0.033688
+v 0.490849 0.282543 0.076550
+v 0.498968 0.282807 0.076905
+v 0.498968 0.282807 0.033334
+v 0.504110 0.285891 0.144008
+v 0.512217 0.292132 0.145437
+v 0.507508 0.285891 0.121934
+v 0.501408 0.282807 0.143531
+v 0.499753 0.285891 0.165912
+v 0.507790 0.292132 0.167694
+v 0.515670 0.292132 0.123009
+v 0.504787 0.282807 0.121576
+v 0.497074 0.282807 0.165318
+v 0.489854 0.283494 0.141494
+v 0.483852 0.282543 0.140436
+v 0.485621 0.283494 0.162779
+v 0.491855 0.282807 0.141847
+v 0.493156 0.283494 0.120045
+v 0.487114 0.282543 0.119249
+v 0.479671 0.282543 0.161460
+v 0.487604 0.282807 0.163219
+v 0.495170 0.282807 0.120310
+v 0.481016 0.285891 0.230195
+v 0.488752 0.292132 0.233011
+v 0.488196 0.285891 0.209047
+v 0.478437 0.282807 0.229256
+v 0.472922 0.285891 0.251010
+v 0.480528 0.292132 0.254161
+v 0.496047 0.292132 0.211522
+v 0.485579 0.282807 0.208222
+v 0.470387 0.282807 0.249960
+v 0.467413 0.283494 0.225244
+v 0.461686 0.282543 0.223160
+v 0.459548 0.283494 0.245471
+v 0.469322 0.282807 0.225939
+v 0.474390 0.283494 0.204694
+v 0.468577 0.282543 0.202861
+v 0.453918 0.282543 0.243138
+v 0.461425 0.282807 0.246248
+v 0.476327 0.282807 0.205305
+v 0.443307 0.285891 0.311063
+v 0.450436 0.292132 0.315179
+v 0.454050 0.285891 0.291483
+v 0.440930 0.282807 0.309691
+v 0.431721 0.285891 0.330156
+v 0.438664 0.292132 0.334579
+v 0.461351 0.292132 0.295284
+v 0.451616 0.282807 0.290216
+v 0.429407 0.282807 0.328682
+v 0.430770 0.283494 0.303825
+v 0.425492 0.282543 0.300778
+v 0.419513 0.283494 0.322379
+v 0.432530 0.282807 0.304841
+v 0.441209 0.283494 0.284799
+v 0.435803 0.282543 0.281984
+v 0.414372 0.282543 0.319104
+v 0.421226 0.282807 0.323470
+v 0.443011 0.282807 0.285737
+v 0.392128 0.285891 0.384154
+v 0.398434 0.292132 0.389445
+v 0.406107 0.285891 0.366737
+v 0.390026 0.282807 0.382390
+v 0.377403 0.285891 0.400946
+v 0.383472 0.292132 0.406507
+v 0.412638 0.292132 0.371748
+v 0.403930 0.282807 0.365066
+v 0.375380 0.282807 0.399092
+v 0.381039 0.283494 0.374849
+v 0.376370 0.282543 0.370931
+v 0.366730 0.283494 0.391166
+v 0.382595 0.282807 0.376155
+v 0.394623 0.283494 0.357924
+v 0.389788 0.282543 0.354214
+v 0.362237 0.282543 0.387048
+v 0.368228 0.282807 0.392538
+v 0.396235 0.282807 0.359161
+v 0.329034 0.285891 0.447247
+v 0.334326 0.292132 0.453553
+v 0.345826 0.285891 0.432522
+v 0.327270 0.282807 0.445145
+v 0.311617 0.285891 0.461227
+v 0.316628 0.292132 0.467758
+v 0.351388 0.292132 0.438592
+v 0.343972 0.282807 0.430499
+v 0.309947 0.282807 0.459050
+v 0.319729 0.283494 0.436158
+v 0.315812 0.282543 0.431489
+v 0.302805 0.283494 0.449743
+v 0.321035 0.282807 0.437715
+v 0.336046 0.283494 0.421850
+v 0.331929 0.282543 0.417356
+v 0.299095 0.282543 0.444907
+v 0.304042 0.282807 0.451354
+v 0.337419 0.282807 0.423347
+v 0.255943 0.285891 0.498426
+v 0.260059 0.292132 0.505555
+v 0.275037 0.285891 0.486841
+v 0.254571 0.282807 0.496050
+v 0.236363 0.285891 0.509169
+v 0.240164 0.292132 0.516471
+v 0.279460 0.292132 0.493784
+v 0.273562 0.282807 0.484526
+v 0.235096 0.282807 0.506735
+v 0.248705 0.283494 0.485890
+v 0.245658 0.282543 0.480612
+v 0.229679 0.283494 0.496329
+v 0.249721 0.282807 0.487649
+v 0.267259 0.283494 0.474632
+v 0.263984 0.282543 0.469492
+v 0.226865 0.282543 0.490923
+v 0.230617 0.282807 0.498131
+v 0.268351 0.282807 0.476345
+v 0.175075 0.285891 0.536135
+v 0.177891 0.292132 0.543871
+v 0.195891 0.285891 0.528042
+v 0.174137 0.282807 0.533557
+v 0.153927 0.285891 0.543315
+v 0.156403 0.292132 0.551166
+v 0.199041 0.292132 0.535647
+v 0.194841 0.282807 0.525506
+v 0.153102 0.282807 0.540698
+v 0.170124 0.283494 0.522533
+v 0.168040 0.282543 0.516806
+v 0.149574 0.283494 0.529509
+v 0.170819 0.282807 0.524442
+v 0.190351 0.283494 0.514668
+v 0.188019 0.282543 0.509037
+v 0.147742 0.282543 0.523697
+v 0.150185 0.282807 0.531447
+v 0.191129 0.282807 0.516545
+v 0.088888 0.285891 0.559229
+v 0.090318 0.292132 0.567336
+v 0.110793 0.285891 0.554873
+v 0.088412 0.282807 0.556527
+v 0.066814 0.285891 0.562627
+v 0.067889 0.292132 0.570789
+v 0.112574 0.292132 0.562910
+v 0.110199 0.282807 0.552194
+v 0.066456 0.282807 0.559907
+v 0.086374 0.283494 0.544973
+v 0.085316 0.282543 0.538971
+v 0.064925 0.283494 0.548275
+v 0.086727 0.282807 0.546974
+v 0.107659 0.283494 0.540740
+v 0.106340 0.282543 0.534790
+v 0.064130 0.282543 0.542233
+v 0.065190 0.282807 0.550290
+v 0.108099 0.282807 0.542724
+v -0.000000 0.285891 0.567006
+v -0.000000 0.292132 0.575238
+v 0.022328 0.285891 0.566519
+v -0.000000 0.282807 0.564262
+v -0.022328 0.285891 0.566519
+v -0.022687 0.292132 0.574744
+v 0.022687 0.292132 0.574744
+v 0.022209 0.282807 0.563778
+v -0.022209 0.282807 0.563778
+v -0.000000 0.283494 0.552530
+v -0.000000 0.282543 0.546435
+v -0.021697 0.283494 0.552057
+v -0.000000 0.282807 0.554562
+v 0.021697 0.283494 0.552057
+v 0.021431 0.282543 0.545968
+v -0.021431 0.282543 0.545968
+v -0.021785 0.282807 0.554087
+v 0.021785 0.282807 0.554087
+v 0.393785 0.285813 -0.271915
+v 0.399972 0.291820 -0.276854
+v 0.381867 0.285578 -0.285247
+v 0.391723 0.282807 -0.270269
+v 0.406623 0.285891 -0.255893
+v 0.413317 0.292132 -0.260740
+v 0.386773 0.290883 -0.290090
+v 0.380231 0.282807 -0.283633
+v 0.404392 0.282807 -0.254278
+v 0.361436 0.284200 -0.299515
+v 0.361299 0.285369 -0.299950
+v 0.361214 0.283916 -0.295801
+v 0.361481 0.282807 -0.299370
+v 0.365069 0.284683 -0.299345
+v 0.366654 0.287302 -0.301712
+v 0.359220 0.284233 -0.295013
+v 0.361879 0.282807 -0.296063
+v 0.364540 0.282807 -0.298556
+v 0.382932 0.283523 -0.263090
+v 0.378306 0.282662 -0.259512
+v 0.395074 0.283494 -0.247149
+v 0.384474 0.282807 -0.264282
+v 0.372410 0.283613 -0.277100
+v 0.368110 0.283020 -0.274315
+v 0.390233 0.282543 -0.243445
+v 0.396687 0.282807 -0.248383
+v 0.373844 0.282807 -0.278028
+v 0.384671 0.275862 -0.264277
+v 0.384474 0.278545 -0.264282
+v 0.396808 0.275842 -0.248475
+v 0.385262 0.273331 -0.264260
+v 0.374279 0.275924 -0.277719
+v 0.373844 0.278545 -0.278028
+v 0.396687 0.278545 -0.248383
+v 0.397169 0.273249 -0.248752
+v 0.375584 0.273578 -0.276794
+v 0.362297 0.275883 -0.298397
+v 0.361481 0.278545 -0.299370
+v 0.362688 0.275924 -0.295191
+v 0.364746 0.273414 -0.295479
+v 0.365268 0.275924 -0.297597
+v 0.364540 0.278545 -0.298556
+v 0.361879 0.278545 -0.296063
+v 0.365114 0.273578 -0.292575
+v 0.367451 0.273578 -0.294721
+v 0.391694 0.275862 -0.270074
+v 0.391723 0.278545 -0.270269
+v 0.380468 0.275924 -0.283140
+v 0.391607 0.273331 -0.269490
+v 0.404271 0.275842 -0.254186
+v 0.404392 0.278545 -0.254278
+v 0.380231 0.278545 -0.283633
+v 0.381180 0.273578 -0.281663
+v 0.403910 0.273249 -0.253909
+v 0.440822 0.275842 -0.199349
+v 0.440953 0.278545 -0.199424
+v 0.429371 0.275842 -0.218252
+v 0.440428 0.273249 -0.199121
+v 0.451481 0.275842 -0.179907
+v 0.451616 0.278545 -0.179977
+v 0.429499 0.278545 -0.218333
+v 0.428988 0.273249 -0.218008
+v 0.451078 0.273249 -0.179697
+v 0.478295 0.275842 -0.118966
+v 0.478437 0.278545 -0.119018
+v 0.470247 0.275842 -0.139663
+v 0.477868 0.273249 -0.118810
+v 0.485434 0.275842 -0.097937
+v 0.485579 0.278545 -0.097983
+v 0.470387 0.278545 -0.139721
+v 0.469827 0.273249 -0.139489
+v 0.485000 0.273249 -0.097800
+v 0.501258 0.275842 -0.033266
+v 0.501408 0.278545 -0.033292
+v 0.496927 0.275842 -0.055047
+v 0.500810 0.273249 -0.033187
+v 0.504637 0.275842 -0.011317
+v 0.504787 0.278545 -0.011337
+v 0.497074 0.278545 -0.055079
+v 0.496483 0.273249 -0.054948
+v 0.504186 0.273249 -0.011258
+v 0.508991 0.275842 0.055119
+v 0.509143 0.278545 0.055119
+v 0.508507 0.275842 0.032917
+v 0.508536 0.273249 0.055119
+v 0.508507 0.275842 0.077321
+v 0.508659 0.278545 0.077328
+v 0.508659 0.278545 0.032911
+v 0.508053 0.273249 0.032937
+v 0.508053 0.273249 0.077302
+v 0.501258 0.275842 0.143505
+v 0.501407 0.278545 0.143531
+v 0.504637 0.275842 0.121556
+v 0.500810 0.273249 0.143426
+v 0.496926 0.275842 0.165285
+v 0.497074 0.278545 0.165318
+v 0.504787 0.278545 0.121576
+v 0.504186 0.273249 0.121497
+v 0.496483 0.273249 0.165187
+v 0.478295 0.275842 0.229205
+v 0.478437 0.278545 0.229256
+v 0.485434 0.275842 0.208176
+v 0.477868 0.273249 0.229049
+v 0.470247 0.275842 0.249902
+v 0.470387 0.278545 0.249960
+v 0.485579 0.278545 0.208222
+v 0.485000 0.273249 0.208039
+v 0.469827 0.273249 0.249728
+v 0.440799 0.275842 0.309615
+v 0.440930 0.278545 0.309691
+v 0.451481 0.275842 0.290146
+v 0.440405 0.273249 0.309388
+v 0.429279 0.275842 0.328601
+v 0.429407 0.278545 0.328682
+v 0.451616 0.278545 0.290216
+v 0.451078 0.273249 0.289936
+v 0.428896 0.273249 0.328356
+v 0.389910 0.275842 0.382293
+v 0.390026 0.278545 0.382390
+v 0.403810 0.275842 0.364974
+v 0.389561 0.273249 0.382000
+v 0.375268 0.275842 0.398989
+v 0.375380 0.278545 0.399092
+v 0.403930 0.278545 0.365066
+v 0.403450 0.273249 0.364697
+v 0.374933 0.273249 0.398682
+v 0.327173 0.275842 0.445029
+v 0.327270 0.278545 0.445145
+v 0.343870 0.275842 0.430387
+v 0.326881 0.273249 0.444681
+v 0.309854 0.275842 0.458930
+v 0.309947 0.278545 0.459050
+v 0.343972 0.278545 0.430499
+v 0.343563 0.273249 0.430052
+v 0.309578 0.273249 0.458569
+v 0.254495 0.275842 0.495919
+v 0.254571 0.278545 0.496050
+v 0.273481 0.275842 0.484399
+v 0.254268 0.273249 0.495525
+v 0.235026 0.275842 0.506601
+v 0.235096 0.278545 0.506735
+v 0.273562 0.278545 0.484526
+v 0.273237 0.273249 0.484015
+v 0.234816 0.273249 0.506197
+v 0.174085 0.275842 0.533414
+v 0.174137 0.278545 0.533557
+v 0.194783 0.275842 0.525366
+v 0.173929 0.273249 0.532987
+v 0.153057 0.275842 0.540553
+v 0.153102 0.278545 0.540698
+v 0.194841 0.278545 0.525506
+v 0.194609 0.273249 0.524946
+v 0.152920 0.273249 0.540120
+v 0.088385 0.275842 0.556378
+v 0.088412 0.278545 0.556527
+v 0.110166 0.275842 0.552046
+v 0.088306 0.273249 0.555930
+v 0.066437 0.275842 0.559757
+v 0.066456 0.278545 0.559907
+v 0.110199 0.278545 0.552194
+v 0.110067 0.273249 0.551602
+v 0.066377 0.273249 0.559306
+v -0.000000 0.275842 0.564110
+v -0.000000 0.278545 0.564262
+v 0.022202 0.275842 0.563627
+v -0.000000 0.273249 0.563656
+v -0.022202 0.275842 0.563626
+v -0.022209 0.278545 0.563778
+v 0.022209 0.278545 0.563778
+v 0.022182 0.273249 0.563172
+v -0.022182 0.273249 0.563172
+v -0.000000 0.275842 0.554713
+v -0.000000 0.278545 0.554562
+v -0.021792 0.275842 0.554238
+v -0.000000 0.273249 0.555168
+v 0.021792 0.275842 0.554238
+v 0.021785 0.278545 0.554087
+v -0.021785 0.278545 0.554087
+v -0.021812 0.273249 0.554693
+v 0.021812 0.273249 0.554693
+v 0.086753 0.275842 0.547123
+v 0.086727 0.278545 0.546974
+v 0.065210 0.275842 0.550440
+v 0.086832 0.273249 0.547571
+v 0.108132 0.275842 0.542872
+v 0.108099 0.278545 0.542724
+v 0.065190 0.278545 0.550290
+v 0.065269 0.273249 0.550891
+v 0.108230 0.273249 0.543316
+v 0.170871 0.275842 0.524584
+v 0.170819 0.278545 0.524442
+v 0.150231 0.275842 0.531591
+v 0.171027 0.273249 0.525011
+v 0.191187 0.275842 0.516685
+v 0.191129 0.278545 0.516545
+v 0.150185 0.278545 0.531447
+v 0.150367 0.273249 0.532025
+v 0.191361 0.273249 0.517105
+v 0.249797 0.275842 0.487780
+v 0.249721 0.278545 0.487649
+v 0.230687 0.275842 0.498265
+v 0.250024 0.273249 0.488174
+v 0.268432 0.275842 0.476473
+v 0.268351 0.278545 0.476345
+v 0.230617 0.278545 0.498131
+v 0.230897 0.273249 0.498669
+v 0.268676 0.273249 0.476857
+v 0.321133 0.275842 0.437831
+v 0.321035 0.278545 0.437715
+v 0.304134 0.275842 0.451475
+v 0.321425 0.273249 0.438179
+v 0.337521 0.275842 0.423459
+v 0.337419 0.278545 0.423347
+v 0.304042 0.278545 0.451354
+v 0.304411 0.273249 0.451835
+v 0.337828 0.273249 0.423794
+v 0.382711 0.275842 0.376252
+v 0.382595 0.278545 0.376155
+v 0.368340 0.275842 0.392641
+v 0.383059 0.273249 0.376545
+v 0.396355 0.275842 0.359253
+v 0.396235 0.278545 0.359161
+v 0.368228 0.278545 0.392538
+v 0.368675 0.273249 0.392948
+v 0.396716 0.273249 0.359530
+v 0.432661 0.275842 0.304917
+v 0.432530 0.278545 0.304841
+v 0.421354 0.275842 0.323552
+v 0.433055 0.273249 0.305144
+v 0.443146 0.275842 0.285807
+v 0.443011 0.278545 0.285737
+v 0.421226 0.278545 0.323470
+v 0.421737 0.273249 0.323796
+v 0.443549 0.273249 0.286017
+v 0.469465 0.275842 0.225991
+v 0.469322 0.278545 0.225939
+v 0.461565 0.275842 0.246306
+v 0.469892 0.273249 0.226146
+v 0.476472 0.275842 0.205350
+v 0.476327 0.278545 0.205305
+v 0.461425 0.278545 0.246248
+v 0.461985 0.273249 0.246480
+v 0.476906 0.273249 0.205487
+v 0.492004 0.275842 0.141873
+v 0.491855 0.278545 0.141847
+v 0.487752 0.275842 0.163252
+v 0.492452 0.273249 0.141952
+v 0.495321 0.275842 0.120330
+v 0.495170 0.278545 0.120310
+v 0.487604 0.278545 0.163219
+v 0.488196 0.273249 0.163350
+v 0.495771 0.273249 0.120389
+v 0.499594 0.275842 0.055119
+v 0.499442 0.278545 0.055119
+v 0.499119 0.275842 0.076912
+v 0.500049 0.273249 0.055119
+v 0.499119 0.275842 0.033327
+v 0.498968 0.278545 0.033334
+v 0.498968 0.278545 0.076905
+v 0.499573 0.273249 0.076931
+v 0.499573 0.273249 0.033308
+v 0.492004 0.275842 -0.031634
+v 0.491855 0.278545 -0.031608
+v 0.495321 0.275842 -0.010091
+v 0.492452 0.273249 -0.031713
+v 0.487752 0.275842 -0.053013
+v 0.487604 0.278545 -0.052980
+v 0.495170 0.278545 -0.010071
+v 0.495771 0.273249 -0.010150
+v 0.488196 0.273249 -0.053111
+v 0.469465 0.275842 -0.115752
+v 0.469322 0.278545 -0.115700
+v 0.476472 0.275842 -0.095112
+v 0.469892 0.273249 -0.115907
+v 0.461565 0.275842 -0.136067
+v 0.461425 0.278545 -0.136009
+v 0.476327 0.278545 -0.095066
+v 0.476906 0.273249 -0.095248
+v 0.461985 0.273249 -0.136241
+v 0.432684 0.275842 -0.194651
+v 0.432552 0.278545 -0.194575
+v 0.443146 0.275842 -0.175568
+v 0.433078 0.273249 -0.194878
+v 0.421444 0.275842 -0.213205
+v 0.421317 0.278545 -0.213123
+v 0.443012 0.278545 -0.175498
+v 0.443549 0.273249 -0.175778
+v 0.421828 0.273249 -0.213449
+v 0.261898 0.006405 -0.204230
+v 0.267491 0.005035 -0.209772
+v 0.264010 0.005035 -0.201772
+v 0.259212 0.010514 -0.201561
+v 0.261067 0.010514 -0.205205
+v 0.266601 0.009262 -0.210737
+v 0.269667 0.003626 -0.207276
+v 0.261256 0.009262 -0.199092
+v 0.258507 0.014271 -0.202611
+v 0.317942 0.005035 -0.128415
+v 0.325630 0.005035 -0.114393
+v 0.314601 0.009262 -0.126486
+v 0.309683 0.005035 -0.142049
+v 0.324766 0.003626 -0.132354
+v 0.332619 0.003626 -0.118031
+v 0.322208 0.009262 -0.112611
+v 0.306429 0.009262 -0.139977
+v 0.316330 0.003626 -0.146281
+v 0.282503 0.005035 -0.179590
+v 0.291580 0.005035 -0.167966
+v 0.279536 0.009262 -0.177125
+v 0.274392 0.005035 -0.189508
+v 0.288566 0.003626 -0.184627
+v 0.297838 0.003626 -0.172754
+v 0.288516 0.009262 -0.165622
+v 0.271513 0.009262 -0.186941
+v 0.280280 0.003626 -0.194756
+v -0.508465 0.006405 -0.448401
+v -0.500465 0.005035 -0.440487
+v -0.512446 0.005035 -0.443515
+v -0.511952 0.010514 -0.451833
+v -0.506913 0.010514 -0.450352
+v -0.498980 0.009262 -0.442469
+v -0.504353 0.003626 -0.435641
+v -0.516007 0.009262 -0.446979
+v -0.510304 0.014271 -0.453649
+v 0.344969 0.005035 -0.070439
+v 0.352373 0.003626 -0.073134
+v 0.350118 0.005035 -0.055272
+v 0.341344 0.009262 -0.069120
+v 0.339165 0.005035 -0.085367
+v 0.346444 0.003626 -0.088382
+v 0.357633 0.003626 -0.057642
+v 0.346439 0.009262 -0.054112
+v 0.335601 0.009262 -0.083891
+v 0.361531 0.005035 -0.008628
+v 0.369291 0.003626 -0.009996
+v 0.363969 0.005035 0.007202
+v 0.357732 0.009262 -0.007958
+v 0.358407 0.005035 -0.024338
+v 0.366100 0.003626 -0.026043
+v 0.371780 0.003626 0.006174
+v 0.360144 0.009262 0.007706
+v 0.354641 0.009262 -0.023503
+v 0.367109 0.005035 0.055120
+v 0.374988 0.003626 0.055120
+v 0.366760 0.005035 0.071133
+v 0.363251 0.009262 0.055120
+v 0.366760 0.005035 0.039106
+v 0.374632 0.003626 0.038763
+v 0.374632 0.003626 0.071476
+v 0.362906 0.009262 0.070964
+v 0.362906 0.009262 0.039275
+v 0.361531 0.005035 0.118867
+v 0.369291 0.003626 0.120235
+v 0.358407 0.005035 0.134577
+v 0.357732 0.009262 0.118197
+v 0.363968 0.005035 0.103037
+v 0.371780 0.003626 0.104065
+v 0.366100 0.003626 0.136282
+v 0.354641 0.009262 0.133742
+v 0.360144 0.009262 0.102533
+v 0.344969 0.005035 0.180678
+v 0.352373 0.003626 0.183373
+v 0.339165 0.005035 0.195606
+v 0.341344 0.009262 0.179359
+v 0.350118 0.005035 0.165511
+v 0.357633 0.003626 0.167881
+v 0.346444 0.003626 0.198621
+v 0.335601 0.009262 0.194130
+v 0.346439 0.009262 0.164351
+v 0.317925 0.005035 0.238674
+v 0.324749 0.003627 0.242613
+v 0.309617 0.005035 0.252367
+v 0.314585 0.009262 0.236745
+v 0.325630 0.005035 0.224632
+v 0.332619 0.003626 0.228270
+v 0.316262 0.003627 0.256601
+v 0.306363 0.009262 0.250294
+v 0.322208 0.009262 0.222850
+v 0.281221 0.005035 0.291092
+v 0.287257 0.003627 0.296157
+v 0.270661 0.005035 0.303135
+v 0.278266 0.009262 0.288613
+v 0.291247 0.005035 0.278601
+v 0.297498 0.003627 0.283398
+v 0.276470 0.003627 0.308458
+v 0.267817 0.009262 0.300529
+v 0.288187 0.009262 0.276253
+v 0.235973 0.005035 0.336341
+v 0.241037 0.003627 0.342377
+v 0.223482 0.005035 0.346367
+v 0.233493 0.009262 0.333386
+v 0.248015 0.005035 0.325781
+v 0.253338 0.003627 0.331590
+v 0.228278 0.003627 0.352618
+v 0.221133 0.009262 0.343306
+v 0.245409 0.009262 0.322937
+v 0.183554 0.005035 0.373045
+v 0.187494 0.003627 0.379869
+v 0.169512 0.005035 0.380749
+v 0.181625 0.009262 0.369704
+v 0.197248 0.005035 0.364736
+v 0.201481 0.003627 0.371381
+v 0.173150 0.003627 0.387738
+v 0.167731 0.009262 0.377327
+v 0.195175 0.009262 0.361483
+v 0.125558 0.005035 0.400089
+v 0.128253 0.003627 0.407493
+v 0.110392 0.005035 0.405238
+v 0.124239 0.009262 0.396464
+v 0.140487 0.005035 0.394284
+v 0.143502 0.003627 0.401564
+v 0.112761 0.003627 0.412752
+v 0.109232 0.009262 0.401559
+v 0.139010 0.009262 0.390720
+v 0.063748 0.005035 0.416651
+v 0.065116 0.003627 0.424410
+v 0.047917 0.005035 0.419088
+v 0.063078 0.009262 0.412852
+v 0.079457 0.005035 0.413527
+v 0.081162 0.003627 0.421219
+v 0.048946 0.003627 0.426900
+v 0.047414 0.009262 0.415263
+v 0.078622 0.009262 0.409760
+v -0.000000 0.005035 0.422228
+v -0.000000 0.003627 0.430107
+v -0.016013 0.005035 0.421879
+v -0.000000 0.009262 0.418370
+v 0.016013 0.005035 0.421879
+v 0.016357 0.003627 0.429751
+v -0.016357 0.003627 0.429751
+v -0.015845 0.009262 0.418025
+v 0.015845 0.009262 0.418025
+v -0.063748 0.005035 0.416651
+v -0.065116 0.003627 0.424410
+v -0.079457 0.005035 0.413527
+v -0.063078 0.009262 0.412852
+v -0.047917 0.005035 0.419088
+v -0.048946 0.003627 0.426900
+v -0.081162 0.003627 0.421219
+v -0.078622 0.009262 0.409760
+v -0.047414 0.009262 0.415263
+v -0.125558 0.005035 0.400089
+v -0.128253 0.003627 0.407493
+v -0.140486 0.005035 0.394284
+v -0.124239 0.009262 0.396464
+v -0.110392 0.005035 0.405238
+v -0.112761 0.003627 0.412752
+v -0.143502 0.003627 0.401564
+v -0.139010 0.009262 0.390720
+v -0.109232 0.009262 0.401559
+v -0.183554 0.005035 0.373045
+v -0.187494 0.003627 0.379869
+v -0.197247 0.005035 0.364736
+v -0.181625 0.009262 0.369704
+v -0.169512 0.005035 0.380749
+v -0.173150 0.003627 0.387738
+v -0.201481 0.003627 0.371382
+v -0.195175 0.009262 0.361483
+v -0.167731 0.009262 0.377328
+v -0.235973 0.005035 0.336341
+v -0.241037 0.003627 0.342377
+v -0.248015 0.005035 0.325781
+v -0.233493 0.009262 0.333386
+v -0.223482 0.005035 0.346367
+v -0.228278 0.003627 0.352618
+v -0.253338 0.003627 0.331590
+v -0.245409 0.009262 0.322937
+v -0.221133 0.009262 0.343306
+v -0.281221 0.005035 0.291092
+v -0.287257 0.003627 0.296157
+v -0.291247 0.005035 0.278601
+v -0.278266 0.009262 0.288613
+v -0.270661 0.005035 0.303135
+v -0.276470 0.003627 0.308458
+v -0.297498 0.003627 0.283398
+v -0.288187 0.009262 0.276253
+v -0.267817 0.009262 0.300529
+v -0.317925 0.005035 0.238674
+v -0.324749 0.003627 0.242614
+v -0.325630 0.005035 0.224632
+v -0.314584 0.009262 0.236745
+v -0.309617 0.005035 0.252367
+v -0.316262 0.003627 0.256601
+v -0.332619 0.003626 0.228270
+v -0.322208 0.009262 0.222850
+v -0.306363 0.009262 0.250295
+v -0.344969 0.005035 0.180678
+v -0.352373 0.003626 0.183373
+v -0.350118 0.005035 0.165511
+v -0.341344 0.009262 0.179359
+v -0.339164 0.005035 0.195606
+v -0.346444 0.003626 0.198621
+v -0.357633 0.003626 0.167881
+v -0.346439 0.009262 0.164351
+v -0.335600 0.009262 0.194130
+v -0.361531 0.005035 0.118867
+v -0.369291 0.003626 0.120236
+v -0.363968 0.005035 0.103037
+v -0.357732 0.009262 0.118197
+v -0.358407 0.005035 0.134577
+v -0.366100 0.003626 0.136282
+v -0.371780 0.003626 0.104065
+v -0.360144 0.009262 0.102533
+v -0.354641 0.009262 0.133742
+v -0.367109 0.005035 0.055120
+v -0.374988 0.003626 0.055120
+v -0.366760 0.005035 0.039106
+v -0.363251 0.009262 0.055120
+v -0.366760 0.005035 0.071133
+v -0.374632 0.003626 0.071476
+v -0.374632 0.003626 0.038763
+v -0.362906 0.009262 0.039275
+v -0.362906 0.009262 0.070964
+v -0.361531 0.005035 -0.008628
+v -0.369291 0.003626 -0.009996
+v -0.358407 0.005035 -0.024337
+v -0.357732 0.009262 -0.007958
+v -0.363968 0.005035 0.007202
+v -0.371780 0.003626 0.006174
+v -0.366100 0.003626 -0.026043
+v -0.354641 0.009262 -0.023502
+v -0.360144 0.009262 0.007706
+v -0.344969 0.005035 -0.070439
+v -0.352373 0.003626 -0.073134
+v -0.339165 0.005035 -0.085367
+v -0.341344 0.009262 -0.069120
+v -0.350118 0.005035 -0.055272
+v -0.357633 0.003626 -0.057642
+v -0.346444 0.003626 -0.088382
+v -0.335601 0.009262 -0.083891
+v -0.346439 0.009262 -0.054112
+v -0.317942 0.005035 -0.128415
+v -0.324766 0.003626 -0.132354
+v -0.309683 0.005035 -0.142049
+v -0.314601 0.009262 -0.126486
+v -0.325630 0.005035 -0.114393
+v -0.332619 0.003626 -0.118031
+v -0.316330 0.003626 -0.146281
+v -0.306429 0.009262 -0.139977
+v -0.322208 0.009262 -0.112611
+v -0.282504 0.005035 -0.179590
+v -0.291580 0.005035 -0.167966
+v -0.288566 0.003626 -0.184627
+v -0.274392 0.005035 -0.189508
+v -0.279536 0.009262 -0.177125
+v -0.288516 0.009262 -0.165622
+v -0.297838 0.003626 -0.172754
+v -0.280280 0.003626 -0.194756
+v -0.271513 0.009262 -0.186941
+v 0.548090 0.005035 -0.400248
+v 0.565687 0.005035 -0.377684
+v 0.539397 0.003626 -0.393025
+v 0.532391 0.005035 -0.419525
+v 0.551945 0.009262 -0.403450
+v 0.569668 0.009262 -0.380729
+v 0.556712 0.003626 -0.370817
+v 0.523952 0.003626 -0.412003
+v 0.536129 0.009262 -0.422857
+v 0.616832 0.005035 -0.300951
+v 0.631747 0.005035 -0.273747
+v 0.607046 0.003626 -0.295302
+v 0.600809 0.005035 -0.327402
+v 0.621173 0.009262 -0.303457
+v 0.636193 0.009262 -0.276061
+v 0.621724 0.003626 -0.268529
+v 0.591277 0.003626 -0.321333
+v 0.605037 0.009262 -0.330094
+v 0.669267 0.005035 -0.188474
+v 0.673977 0.009262 -0.190188
+v 0.679256 0.005035 -0.159049
+v 0.658649 0.003626 -0.184609
+v 0.658005 0.005035 -0.217435
+v 0.662636 0.009262 -0.219353
+v 0.684036 0.009262 -0.160556
+v 0.668480 0.003626 -0.155651
+v 0.647566 0.003626 -0.213111
+v 0.701398 0.005035 -0.068556
+v 0.706335 0.009262 -0.069426
+v 0.706126 0.005035 -0.037844
+v 0.690271 0.003626 -0.066594
+v 0.695337 0.005035 -0.099033
+v 0.700231 0.009262 -0.100118
+v 0.711096 0.009262 -0.038498
+v 0.694924 0.003626 -0.036369
+v 0.684306 0.003626 -0.096587
+v 0.712219 0.005035 0.055120
+v 0.717231 0.009262 0.055120
+v 0.711542 0.005035 0.086186
+v 0.700919 0.003626 0.055120
+v 0.711542 0.005035 0.024053
+v 0.716549 0.009262 0.023834
+v 0.716549 0.009262 0.086405
+v 0.700253 0.003626 0.085693
+v 0.700253 0.003626 0.024546
+v 0.701398 0.005035 0.178795
+v 0.706335 0.009262 0.179665
+v 0.695337 0.005035 0.209272
+v 0.690271 0.003626 0.176833
+v 0.706126 0.005035 0.148083
+v 0.711096 0.009262 0.148737
+v 0.700231 0.009262 0.210357
+v 0.684305 0.003627 0.206827
+v 0.694924 0.003626 0.146608
+v 0.669267 0.005035 0.298713
+v 0.673977 0.009262 0.300427
+v 0.658005 0.005035 0.327674
+v 0.658648 0.003627 0.294848
+v 0.679256 0.005035 0.269288
+v 0.684036 0.009262 0.270795
+v 0.662636 0.009262 0.329592
+v 0.647566 0.003627 0.323350
+v 0.668479 0.003627 0.265890
+v 0.616799 0.005035 0.411229
+v 0.621140 0.009262 0.413735
+v 0.600680 0.005035 0.437795
+v 0.607014 0.003627 0.405579
+v 0.631746 0.005035 0.383986
+v 0.636192 0.009262 0.386300
+v 0.604907 0.009262 0.440488
+v 0.591150 0.003627 0.431724
+v 0.621724 0.003627 0.378768
+v 0.545591 0.005035 0.512925
+v 0.549431 0.009262 0.516147
+v 0.525103 0.005035 0.536288
+v 0.536935 0.003627 0.505662
+v 0.565042 0.005035 0.488691
+v 0.569018 0.009262 0.491743
+v 0.528799 0.009262 0.539674
+v 0.516772 0.003627 0.528654
+v 0.556077 0.003627 0.481813
+v 0.457805 0.005035 0.600711
+v 0.461027 0.009262 0.604550
+v 0.433572 0.005035 0.620161
+v 0.450542 0.003627 0.592055
+v 0.481168 0.005035 0.580223
+v 0.484555 0.009262 0.583918
+v 0.436623 0.009262 0.624138
+v 0.426693 0.003627 0.611197
+v 0.473535 0.003627 0.571892
+v 0.356109 0.005035 0.671919
+v 0.358615 0.009262 0.676260
+v 0.328866 0.005035 0.686866
+v 0.350459 0.003627 0.662133
+v 0.382675 0.005035 0.655799
+v 0.385368 0.009262 0.660027
+v 0.331181 0.009262 0.691312
+v 0.323649 0.003627 0.676843
+v 0.376604 0.003627 0.646269
+v 0.243593 0.005035 0.724386
+v 0.245307 0.009262 0.729096
+v 0.214168 0.005035 0.734375
+v 0.239728 0.003627 0.713768
+v 0.272555 0.005035 0.713124
+v 0.274473 0.009262 0.717755
+v 0.215676 0.009262 0.739156
+v 0.210770 0.003627 0.723599
+v 0.268230 0.003627 0.702685
+v 0.123675 0.005035 0.756518
+v 0.124546 0.009262 0.761454
+v 0.092963 0.005035 0.761246
+v 0.121713 0.003627 0.745390
+v 0.154152 0.005035 0.750457
+v 0.155237 0.009262 0.755350
+v 0.093617 0.009262 0.766215
+v 0.091488 0.003627 0.750043
+v 0.151707 0.003627 0.739425
+v -0.000000 0.005035 0.767338
+v -0.000000 0.009262 0.772350
+v -0.031067 0.005035 0.766661
+v -0.000000 0.003627 0.756038
+v 0.031067 0.005035 0.766661
+v 0.031285 0.009262 0.771669
+v -0.031285 0.009262 0.771669
+v -0.030574 0.003627 0.755372
+v 0.030574 0.003627 0.755372
+v -0.123675 0.005035 0.756518
+v -0.124546 0.009262 0.761454
+v -0.154152 0.005035 0.750457
+v -0.121713 0.003627 0.745390
+v -0.092963 0.005035 0.761246
+v -0.093617 0.009262 0.766215
+v -0.155237 0.009262 0.755350
+v -0.151707 0.003627 0.739425
+v -0.091488 0.003627 0.750043
+v -0.243593 0.005035 0.724386
+v -0.245307 0.009262 0.729096
+v -0.272554 0.005035 0.713125
+v -0.239728 0.003627 0.713768
+v -0.214168 0.005035 0.734375
+v -0.215675 0.009262 0.739156
+v -0.274473 0.009262 0.717755
+v -0.268230 0.003627 0.702685
+v -0.210770 0.003627 0.723599
+v -0.356109 0.005035 0.671919
+v -0.358615 0.009262 0.676260
+v -0.382675 0.005035 0.655799
+v -0.350459 0.003627 0.662133
+v -0.328866 0.005035 0.686866
+v -0.331180 0.009262 0.691312
+v -0.385368 0.009262 0.660027
+v -0.376604 0.003627 0.646270
+v -0.323648 0.003627 0.676843
+v -0.457805 0.005035 0.600711
+v -0.461027 0.009262 0.604550
+v -0.481168 0.005035 0.580223
+v -0.450542 0.003627 0.592055
+v -0.433571 0.005035 0.620161
+v -0.436623 0.009262 0.624138
+v -0.484555 0.009262 0.583918
+v -0.473535 0.003627 0.571892
+v -0.426693 0.003627 0.611197
+v -0.545591 0.005035 0.512925
+v -0.549431 0.009262 0.516147
+v -0.565042 0.005035 0.488691
+v -0.536935 0.003627 0.505662
+v -0.525103 0.005035 0.536288
+v -0.528799 0.009262 0.539675
+v -0.569018 0.009262 0.491743
+v -0.556077 0.003627 0.481813
+v -0.516772 0.003627 0.528655
+v -0.616799 0.005035 0.411229
+v -0.621140 0.009262 0.413735
+v -0.631746 0.005035 0.383986
+v -0.607014 0.003627 0.405579
+v -0.600680 0.005035 0.437795
+v -0.604907 0.009262 0.440488
+v -0.636192 0.009262 0.386301
+v -0.621724 0.003627 0.378768
+v -0.591150 0.003627 0.431724
+v -0.669266 0.005035 0.298713
+v -0.673977 0.009262 0.300427
+v -0.679256 0.005035 0.269288
+v -0.658648 0.003627 0.294848
+v -0.658005 0.005035 0.327674
+v -0.662636 0.009262 0.329593
+v -0.684036 0.009262 0.270795
+v -0.668479 0.003627 0.265890
+v -0.647566 0.003627 0.323350
+v -0.701398 0.005035 0.178795
+v -0.706335 0.009262 0.179666
+v -0.706126 0.005035 0.148083
+v -0.690271 0.003626 0.176833
+v -0.695337 0.005035 0.209272
+v -0.700231 0.009262 0.210357
+v -0.711096 0.009262 0.148737
+v -0.694924 0.003626 0.146608
+v -0.684305 0.003627 0.206827
+v -0.712219 0.005035 0.055120
+v -0.717231 0.009262 0.055120
+v -0.711542 0.005035 0.024053
+v -0.700919 0.003626 0.055120
+v -0.711542 0.005035 0.086186
+v -0.716549 0.009262 0.086405
+v -0.716549 0.009262 0.023834
+v -0.700253 0.003626 0.024546
+v -0.700253 0.003626 0.085694
+v -0.701398 0.005035 -0.068556
+v -0.706335 0.009262 -0.069426
+v -0.695337 0.005035 -0.099033
+v -0.690271 0.003626 -0.066594
+v -0.706126 0.005035 -0.037843
+v -0.711096 0.009262 -0.038498
+v -0.700231 0.009262 -0.100118
+v -0.684306 0.003626 -0.096587
+v -0.694924 0.003626 -0.036369
+v -0.669267 0.005035 -0.188473
+v -0.673977 0.009262 -0.190188
+v -0.658005 0.005035 -0.217435
+v -0.658649 0.003626 -0.184609
+v -0.679256 0.005035 -0.159049
+v -0.684036 0.009262 -0.160556
+v -0.662636 0.009262 -0.219353
+v -0.647566 0.003626 -0.213111
+v -0.668480 0.003626 -0.155651
+v -0.616832 0.005035 -0.300951
+v -0.621173 0.009262 -0.303457
+v -0.600809 0.005035 -0.327402
+v -0.607046 0.003626 -0.295302
+v -0.631747 0.005035 -0.273747
+v -0.636193 0.009262 -0.276061
+v -0.605037 0.009262 -0.330094
+v -0.591277 0.003626 -0.321333
+v -0.621724 0.003626 -0.268529
+v -0.548091 0.005035 -0.400248
+v -0.539397 0.003626 -0.393025
+v -0.565687 0.005035 -0.377683
+v -0.551946 0.009262 -0.403450
+v -0.532391 0.005035 -0.419525
+v -0.523952 0.003626 -0.412003
+v -0.556712 0.003626 -0.370817
+v -0.569668 0.009262 -0.380729
+v -0.536129 0.009262 -0.422857
+v 0.334274 0.003626 -0.222603
+v 0.345010 0.003626 -0.208845
+v 0.315222 0.003626 -0.206774
+v 0.324690 0.003626 -0.234351
+v 0.353342 0.003626 -0.238446
+v 0.364687 0.003626 -0.223900
+v 0.325348 0.003626 -0.193802
+v 0.306177 0.003626 -0.217845
+v 0.343218 0.003626 -0.250870
+v 0.376203 0.003626 -0.162046
+v 0.385299 0.003626 -0.145454
+v 0.354763 0.003626 -0.149670
+v 0.366430 0.003626 -0.178179
+v 0.397659 0.003626 -0.174432
+v 0.407275 0.003626 -0.156894
+v 0.363341 0.003626 -0.134024
+v 0.345548 0.003626 -0.164883
+v 0.387330 0.003626 -0.191485
+v 0.408182 0.003626 -0.093447
+v 0.431463 0.003626 -0.101920
+v 0.414275 0.003626 -0.075501
+v 0.384920 0.003626 -0.084980
+v 0.401314 0.003626 -0.111110
+v 0.424203 0.003626 -0.120591
+v 0.437903 0.003626 -0.082951
+v 0.390665 0.003626 -0.068057
+v 0.378443 0.003626 -0.101637
+v 0.427779 0.003626 -0.020310
+v 0.452178 0.003626 -0.024612
+v 0.430663 0.003626 -0.001578
+v 0.403400 0.003626 -0.016011
+v 0.424083 0.003626 -0.038897
+v 0.448270 0.003626 -0.044260
+v 0.455226 0.003626 -0.004812
+v 0.406119 0.003626 0.001653
+v 0.399914 0.003626 -0.033539
+v 0.434378 0.003626 0.055120
+v 0.459153 0.003626 0.055120
+v 0.433966 0.003626 0.074067
+v 0.409623 0.003626 0.055120
+v 0.433966 0.003626 0.036172
+v 0.458717 0.003626 0.035091
+v 0.458717 0.003626 0.075148
+v 0.409234 0.003626 0.072987
+v 0.409234 0.003626 0.037252
+v 0.427779 0.003626 0.130549
+v 0.452178 0.003626 0.134851
+v 0.424083 0.003626 0.149136
+v 0.403400 0.003626 0.126250
+v 0.430663 0.003626 0.111817
+v 0.455226 0.003626 0.115051
+v 0.448270 0.003626 0.154499
+v 0.399914 0.003626 0.143778
+v 0.406120 0.003626 0.108586
+v 0.408182 0.003626 0.203686
+v 0.431463 0.003626 0.212159
+v 0.401314 0.003627 0.221349
+v 0.384920 0.003626 0.195219
+v 0.414275 0.003626 0.185740
+v 0.437903 0.003626 0.193190
+v 0.424203 0.003627 0.230830
+v 0.378443 0.003626 0.211876
+v 0.390665 0.003626 0.178296
+v 0.376183 0.003627 0.272309
+v 0.397638 0.003627 0.284696
+v 0.366351 0.003627 0.288511
+v 0.354744 0.003627 0.259931
+v 0.385299 0.003627 0.255693
+v 0.407274 0.003627 0.267133
+v 0.387246 0.003627 0.301823
+v 0.345473 0.003627 0.275210
+v 0.363341 0.003627 0.244263
+v 0.332753 0.003627 0.334333
+v 0.351732 0.003627 0.350258
+v 0.320258 0.003627 0.348582
+v 0.313790 0.003627 0.318420
+v 0.344616 0.003627 0.319553
+v 0.364271 0.003627 0.334635
+v 0.338524 0.003627 0.365319
+v 0.302006 0.003627 0.331857
+v 0.324976 0.003627 0.304483
+v 0.279213 0.003627 0.387873
+v 0.295138 0.003627 0.406851
+v 0.264433 0.003627 0.399736
+v 0.263301 0.003627 0.368909
+v 0.293462 0.003627 0.375377
+v 0.310200 0.003627 0.393643
+v 0.279515 0.003627 0.419391
+v 0.249363 0.003627 0.380096
+v 0.276738 0.003627 0.357126
+v 0.217189 0.003627 0.431302
+v 0.229577 0.003627 0.452758
+v 0.200574 0.003627 0.440418
+v 0.204812 0.003627 0.409864
+v 0.233392 0.003627 0.421471
+v 0.246703 0.003627 0.442366
+v 0.212013 0.003627 0.462394
+v 0.189143 0.003627 0.418460
+v 0.220091 0.003627 0.400593
+v 0.148566 0.003627 0.463302
+v 0.157040 0.003627 0.486582
+v 0.130620 0.003627 0.469394
+v 0.140099 0.003627 0.440039
+v 0.166230 0.003627 0.456433
+v 0.175711 0.003627 0.479322
+v 0.138070 0.003627 0.493022
+v 0.123176 0.003627 0.445785
+v 0.156756 0.003627 0.433563
+v 0.075429 0.003627 0.482899
+v 0.079731 0.003627 0.507297
+v 0.056698 0.003627 0.485782
+v 0.071130 0.003627 0.458520
+v 0.094017 0.003627 0.479202
+v 0.099379 0.003627 0.503389
+v 0.059931 0.003627 0.510345
+v 0.053466 0.003627 0.461239
+v 0.088659 0.003627 0.455034
+v -0.000000 0.003627 0.489498
+v -0.000000 0.003627 0.514273
+v -0.018947 0.003627 0.489085
+v -0.000000 0.003627 0.464743
+v 0.018947 0.003627 0.489085
+v 0.020028 0.003627 0.513836
+v -0.020028 0.003627 0.513836
+v -0.017868 0.003627 0.464353
+v 0.017868 0.003627 0.464353
+v -0.075429 0.003627 0.482899
+v -0.079731 0.003627 0.507297
+v -0.094017 0.003627 0.479202
+v -0.071130 0.003627 0.458520
+v -0.056698 0.003627 0.485782
+v -0.059931 0.003627 0.510345
+v -0.099379 0.003627 0.503390
+v -0.088659 0.003627 0.455034
+v -0.053466 0.003627 0.461239
+v -0.148566 0.003627 0.463302
+v -0.157039 0.003627 0.486582
+v -0.166230 0.003627 0.456433
+v -0.140099 0.003627 0.440040
+v -0.130620 0.003627 0.469394
+v -0.138070 0.003627 0.493022
+v -0.175710 0.003627 0.479322
+v -0.156756 0.003627 0.433563
+v -0.123176 0.003627 0.445785
+v -0.217189 0.003627 0.431302
+v -0.229576 0.003627 0.452758
+v -0.233392 0.003627 0.421471
+v -0.204811 0.003627 0.409864
+v -0.200574 0.003627 0.440418
+v -0.212013 0.003627 0.462394
+v -0.246703 0.003627 0.442366
+v -0.220091 0.003627 0.400593
+v -0.189143 0.003627 0.418460
+v -0.279213 0.003627 0.387873
+v -0.295138 0.003627 0.406851
+v -0.293462 0.003627 0.375377
+v -0.263301 0.003627 0.368909
+v -0.264433 0.003627 0.399736
+v -0.279515 0.003627 0.419391
+v -0.310200 0.003627 0.393643
+v -0.276738 0.003627 0.357126
+v -0.249363 0.003627 0.380096
+v -0.332753 0.003627 0.334333
+v -0.351732 0.003627 0.350258
+v -0.344616 0.003627 0.319553
+v -0.313790 0.003627 0.318420
+v -0.320258 0.003627 0.348582
+v -0.338524 0.003627 0.365320
+v -0.364271 0.003627 0.334635
+v -0.324976 0.003627 0.304483
+v -0.302006 0.003627 0.331858
+v -0.376183 0.003627 0.272309
+v -0.397638 0.003627 0.284696
+v -0.385299 0.003627 0.255693
+v -0.354744 0.003627 0.259931
+v -0.366351 0.003627 0.288511
+v -0.387246 0.003627 0.301823
+v -0.407274 0.003627 0.267133
+v -0.363341 0.003627 0.244263
+v -0.345473 0.003627 0.275210
+v -0.408182 0.003626 0.203686
+v -0.431463 0.003626 0.212159
+v -0.414275 0.003626 0.185740
+v -0.384920 0.003626 0.195219
+v -0.401314 0.003627 0.221349
+v -0.424203 0.003627 0.230830
+v -0.437903 0.003626 0.193190
+v -0.390665 0.003626 0.178296
+v -0.378443 0.003626 0.211876
+v -0.427779 0.003626 0.130549
+v -0.452178 0.003626 0.134851
+v -0.430663 0.003626 0.111817
+v -0.403400 0.003626 0.126250
+v -0.424083 0.003626 0.149137
+v -0.448270 0.003626 0.154499
+v -0.455226 0.003626 0.115051
+v -0.406119 0.003626 0.108586
+v -0.399914 0.003626 0.143779
+v -0.434378 0.003626 0.055120
+v -0.459153 0.003626 0.055120
+v -0.433966 0.003626 0.036172
+v -0.409623 0.003626 0.055120
+v -0.433966 0.003626 0.074067
+v -0.458717 0.003626 0.075148
+v -0.458717 0.003626 0.035092
+v -0.409234 0.003626 0.037252
+v -0.409234 0.003626 0.072987
+v -0.427779 0.003626 -0.020309
+v -0.452178 0.003626 -0.024611
+v -0.424083 0.003626 -0.038897
+v -0.403400 0.003626 -0.016011
+v -0.430663 0.003626 -0.001578
+v -0.455226 0.003626 -0.004812
+v -0.448270 0.003626 -0.044260
+v -0.399914 0.003626 -0.033539
+v -0.406120 0.003626 0.001653
+v -0.408182 0.003626 -0.093447
+v -0.431463 0.003626 -0.101920
+v -0.401314 0.003626 -0.111110
+v -0.384920 0.003626 -0.084980
+v -0.414275 0.003626 -0.075501
+v -0.437903 0.003626 -0.082951
+v -0.424203 0.003626 -0.120591
+v -0.378443 0.003626 -0.101637
+v -0.390665 0.003626 -0.068057
+v -0.376203 0.003626 -0.162046
+v -0.397659 0.003626 -0.174432
+v -0.366430 0.003626 -0.178178
+v -0.354763 0.003626 -0.149670
+v -0.385299 0.003626 -0.145454
+v -0.407275 0.003626 -0.156894
+v -0.387330 0.003626 -0.191485
+v -0.345548 0.003626 -0.164883
+v -0.363341 0.003626 -0.134024
+v -0.334275 0.003626 -0.222603
+v -0.315222 0.003626 -0.206774
+v -0.345010 0.003626 -0.208845
+v -0.353342 0.003626 -0.238446
+v -0.324690 0.003626 -0.234351
+v -0.306177 0.003626 -0.217845
+v -0.325348 0.003626 -0.193801
+v -0.364687 0.003626 -0.223900
+v -0.343218 0.003626 -0.250870
+v 0.388690 0.003626 -0.267814
+v 0.401170 0.003626 -0.251813
+v 0.380118 0.003626 -0.260692
+v 0.377555 0.003626 -0.281483
+v 0.399006 0.003626 -0.276385
+v 0.411818 0.003626 -0.259959
+v 0.392322 0.003626 -0.245043
+v 0.369230 0.003626 -0.274062
+v 0.387572 0.003626 -0.290414
+v 0.437441 0.003626 -0.197396
+v 0.448018 0.003626 -0.178104
+v 0.427792 0.003626 -0.191827
+v 0.426078 0.003626 -0.216155
+v 0.449051 0.003626 -0.204099
+v 0.459909 0.003626 -0.184294
+v 0.438136 0.003626 -0.172960
+v 0.416680 0.003626 -0.210171
+v 0.437387 0.003626 -0.223355
+v 0.474626 0.003626 -0.117630
+v 0.487224 0.003626 -0.122215
+v 0.481710 0.003626 -0.096763
+v 0.464157 0.003626 -0.113820
+v 0.466640 0.003626 -0.138169
+v 0.479025 0.003626 -0.143299
+v 0.494496 0.003626 -0.100794
+v 0.471085 0.003626 -0.093413
+v 0.456347 0.003626 -0.133906
+v 0.497413 0.003626 -0.032588
+v 0.510615 0.003626 -0.034916
+v 0.500766 0.003626 -0.010807
+v 0.486442 0.003626 -0.030653
+v 0.493115 0.003626 -0.054201
+v 0.506203 0.003626 -0.057103
+v 0.514057 0.003626 -0.012557
+v 0.489721 0.003626 -0.009353
+v 0.482238 0.003626 -0.051790
+v 0.505086 0.003626 0.055120
+v 0.518492 0.003626 0.055120
+v 0.504606 0.003626 0.077151
+v 0.493946 0.003626 0.055120
+v 0.504606 0.003626 0.033088
+v 0.518000 0.003626 0.032503
+v 0.518000 0.003626 0.077736
+v 0.493476 0.003626 0.076665
+v 0.493476 0.003626 0.033574
+v 0.497413 0.003626 0.142827
+v 0.510615 0.003626 0.145155
+v 0.493115 0.003626 0.164440
+v 0.486442 0.003626 0.140892
+v 0.500766 0.003626 0.121047
+v 0.514057 0.003626 0.122796
+v 0.506203 0.003626 0.167342
+v 0.482238 0.003626 0.162029
+v 0.489721 0.003626 0.119592
+v 0.474626 0.003627 0.227869
+v 0.487224 0.003627 0.232454
+v 0.466640 0.003627 0.248408
+v 0.464157 0.003626 0.224059
+v 0.481710 0.003626 0.207002
+v 0.494496 0.003626 0.211033
+v 0.479025 0.003627 0.253538
+v 0.456347 0.003627 0.244145
+v 0.471085 0.003626 0.203652
+v 0.437418 0.003627 0.307663
+v 0.449028 0.003627 0.314366
+v 0.425986 0.003627 0.326503
+v 0.427770 0.003627 0.302092
+v 0.448018 0.003627 0.288343
+v 0.459909 0.003627 0.294533
+v 0.437293 0.003627 0.333706
+v 0.416590 0.003627 0.320517
+v 0.438136 0.003627 0.283198
+v 0.386919 0.003627 0.379783
+v 0.397188 0.003627 0.388400
+v 0.372389 0.003627 0.396351
+v 0.378384 0.003627 0.372622
+v 0.400712 0.003627 0.362597
+v 0.411348 0.003627 0.370758
+v 0.382273 0.003627 0.405408
+v 0.364175 0.003627 0.388825
+v 0.391874 0.003627 0.355815
+v 0.324663 0.003627 0.442038
+v 0.333280 0.003627 0.452308
+v 0.307477 0.003627 0.455832
+v 0.317502 0.003627 0.433504
+v 0.341232 0.003627 0.427509
+v 0.350289 0.003627 0.437393
+v 0.315638 0.003627 0.466468
+v 0.300695 0.003627 0.446994
+v 0.333705 0.003627 0.419295
+v 0.252543 0.003627 0.492537
+v 0.259246 0.003627 0.504147
+v 0.233223 0.003627 0.503137
+v 0.246973 0.003627 0.482889
+v 0.271383 0.003627 0.481105
+v 0.278586 0.003627 0.492412
+v 0.239413 0.003627 0.515028
+v 0.228079 0.003627 0.493255
+v 0.265397 0.003627 0.471710
+v 0.172750 0.003627 0.529745
+v 0.177335 0.003627 0.542343
+v 0.151882 0.003627 0.536830
+v 0.168939 0.003627 0.519277
+v 0.193288 0.003627 0.521759
+v 0.198419 0.003627 0.534145
+v 0.155914 0.003627 0.549615
+v 0.148532 0.003627 0.526205
+v 0.189025 0.003627 0.511466
+v 0.087707 0.003627 0.552532
+v 0.090035 0.003627 0.565735
+v 0.065927 0.003627 0.555885
+v 0.085773 0.003627 0.541561
+v 0.109321 0.003627 0.548234
+v 0.112222 0.003627 0.561322
+v 0.067677 0.003627 0.569177
+v 0.064473 0.003627 0.544840
+v 0.106910 0.003627 0.537357
+v -0.000000 0.003627 0.560206
+v -0.000000 0.003627 0.573612
+v -0.022032 0.003627 0.559726
+v -0.000000 0.003627 0.549065
+v 0.022032 0.003627 0.559726
+v 0.022616 0.003627 0.573119
+v -0.022616 0.003627 0.573119
+v -0.021546 0.003627 0.548596
+v 0.021546 0.003627 0.548596
+v -0.087707 0.003627 0.552532
+v -0.090035 0.003627 0.565735
+v -0.109321 0.003627 0.548234
+v -0.085773 0.003627 0.541561
+v -0.065927 0.003627 0.555885
+v -0.067677 0.003627 0.569177
+v -0.112222 0.003627 0.561322
+v -0.106909 0.003627 0.537357
+v -0.064473 0.003627 0.544840
+v -0.172749 0.003627 0.529745
+v -0.177335 0.003627 0.542343
+v -0.193288 0.003627 0.521759
+v -0.168939 0.003627 0.519277
+v -0.151882 0.003627 0.536830
+v -0.155914 0.003627 0.549615
+v -0.198419 0.003627 0.534145
+v -0.189025 0.003627 0.511466
+v -0.148532 0.003627 0.526205
+v -0.252543 0.003627 0.492537
+v -0.259246 0.003627 0.504147
+v -0.271383 0.003627 0.481106
+v -0.246973 0.003627 0.482889
+v -0.233223 0.003627 0.503137
+v -0.239413 0.003627 0.515029
+v -0.278586 0.003627 0.492412
+v -0.265397 0.003627 0.471710
+v -0.228079 0.003627 0.493255
+v -0.324663 0.003627 0.442038
+v -0.333280 0.003627 0.452308
+v -0.341232 0.003627 0.427509
+v -0.317502 0.003627 0.433504
+v -0.307477 0.003627 0.455832
+v -0.315638 0.003627 0.466468
+v -0.350289 0.003627 0.437393
+v -0.333705 0.003627 0.419295
+v -0.300695 0.003627 0.446994
+v -0.386918 0.003627 0.379783
+v -0.397188 0.003627 0.388400
+v -0.400712 0.003627 0.362597
+v -0.378384 0.003627 0.372622
+v -0.372389 0.003627 0.396352
+v -0.382273 0.003627 0.405409
+v -0.411348 0.003627 0.370758
+v -0.391874 0.003627 0.355815
+v -0.364175 0.003627 0.388825
+v -0.437417 0.003627 0.307663
+v -0.449027 0.003627 0.314366
+v -0.448018 0.003627 0.288343
+v -0.427769 0.003627 0.302092
+v -0.425986 0.003627 0.326503
+v -0.437292 0.003627 0.333706
+v -0.459909 0.003627 0.294533
+v -0.438136 0.003627 0.283199
+v -0.416590 0.003627 0.320517
+v -0.474626 0.003627 0.227869
+v -0.487223 0.003627 0.232454
+v -0.481710 0.003626 0.207002
+v -0.464157 0.003626 0.224059
+v -0.466639 0.003627 0.248408
+v -0.479025 0.003627 0.253538
+v -0.494496 0.003626 0.211033
+v -0.471085 0.003626 0.203652
+v -0.456347 0.003627 0.244145
+v -0.497413 0.003626 0.142827
+v -0.510615 0.003626 0.145155
+v -0.500766 0.003626 0.121047
+v -0.486442 0.003626 0.140892
+v -0.493114 0.003626 0.164441
+v -0.506203 0.003626 0.167342
+v -0.514057 0.003626 0.122797
+v -0.489721 0.003626 0.119593
+v -0.482238 0.003626 0.162029
+v -0.505086 0.003626 0.055120
+v -0.518492 0.003626 0.055120
+v -0.504606 0.003626 0.033088
+v -0.493946 0.003626 0.055120
+v -0.504606 0.003626 0.077151
+v -0.518000 0.003626 0.077736
+v -0.518000 0.003626 0.032503
+v -0.493476 0.003626 0.033574
+v -0.493476 0.003626 0.076665
+v -0.497413 0.003626 -0.032588
+v -0.510615 0.003626 -0.034916
+v -0.493115 0.003626 -0.054201
+v -0.486442 0.003626 -0.030653
+v -0.500766 0.003626 -0.010807
+v -0.514057 0.003626 -0.012557
+v -0.506203 0.003626 -0.057103
+v -0.482238 0.003626 -0.051790
+v -0.489721 0.003626 -0.009353
+v -0.474626 0.003626 -0.117630
+v -0.487224 0.003626 -0.122215
+v -0.466640 0.003626 -0.138169
+v -0.464157 0.003626 -0.113820
+v -0.481710 0.003626 -0.096763
+v -0.494496 0.003626 -0.100794
+v -0.479025 0.003626 -0.143299
+v -0.456347 0.003626 -0.133906
+v -0.471085 0.003626 -0.093413
+v -0.437441 0.003626 -0.197396
+v -0.449051 0.003626 -0.204099
+v -0.426078 0.003626 -0.216155
+v -0.427792 0.003626 -0.191827
+v -0.448018 0.003626 -0.178104
+v -0.459909 0.003626 -0.184294
+v -0.437387 0.003626 -0.223355
+v -0.416680 0.003626 -0.210171
+v -0.438136 0.003626 -0.172959
+v -0.388691 0.003626 -0.267814
+v -0.380118 0.003626 -0.260692
+v -0.401170 0.003626 -0.251813
+v -0.399006 0.003626 -0.276384
+v -0.377555 0.003626 -0.281483
+v -0.369230 0.003626 -0.274062
+v -0.392322 0.003626 -0.245043
+v -0.411818 0.003626 -0.259959
+v -0.387572 0.003626 -0.290414
+v 0.469257 0.003626 -0.334751
+v 0.484322 0.003626 -0.315432
+v 0.439729 0.003626 -0.310218
+v 0.455818 0.003626 -0.351259
+v 0.498774 0.003626 -0.359275
+v 0.514785 0.003626 -0.338739
+v 0.453847 0.003626 -0.292116
+v 0.427131 0.003626 -0.325682
+v 0.484494 0.003626 -0.376824
+v 0.528111 0.003626 -0.249736
+v 0.540880 0.003626 -0.226445
+v 0.494880 0.003626 -0.230554
+v 0.514392 0.003626 -0.272383
+v 0.561327 0.003626 -0.268911
+v 0.574900 0.003626 -0.244154
+v 0.506846 0.003626 -0.208728
+v 0.482025 0.003626 -0.251775
+v 0.546746 0.003626 -0.292982
+v 0.573004 0.003626 -0.153437
+v 0.609044 0.003626 -0.166554
+v 0.581556 0.003626 -0.128244
+v 0.536948 0.003626 -0.140314
+v 0.563362 0.003626 -0.178233
+v 0.598796 0.003626 -0.192910
+v 0.618134 0.003626 -0.139777
+v 0.544963 0.003626 -0.116706
+v 0.527913 0.003626 -0.163549
+v 0.600514 0.003626 -0.050767
+v 0.638284 0.003626 -0.057427
+v 0.604562 0.003626 -0.024472
+v 0.562727 0.003626 -0.044105
+v 0.595324 0.003626 -0.076861
+v 0.632769 0.003626 -0.085162
+v 0.642587 0.003626 -0.029479
+v 0.566521 0.003626 -0.019464
+v 0.557865 0.003626 -0.068556
+v 0.609778 0.003626 0.055120
+v 0.648131 0.003626 0.055120
+v 0.609198 0.003626 0.081718
+v 0.571408 0.003626 0.055120
+v 0.609198 0.003626 0.028521
+v 0.647515 0.003626 0.026848
+v 0.647515 0.003626 0.083391
+v 0.570865 0.003626 0.080044
+v 0.570865 0.003626 0.030195
+v 0.600514 0.003626 0.161006
+v 0.638284 0.003626 0.167666
+v 0.595324 0.003627 0.187100
+v 0.562727 0.003626 0.154344
+v 0.604562 0.003626 0.134712
+v 0.642587 0.003626 0.139718
+v 0.632768 0.003627 0.195401
+v 0.557864 0.003626 0.178795
+v 0.566521 0.003626 0.129703
+v 0.573003 0.003627 0.263676
+v 0.609044 0.003627 0.276793
+v 0.563362 0.003627 0.288472
+v 0.536948 0.003627 0.250553
+v 0.581556 0.003627 0.238483
+v 0.618134 0.003627 0.250016
+v 0.598796 0.003627 0.303149
+v 0.527913 0.003627 0.273788
+v 0.544963 0.003627 0.226946
+v 0.528083 0.003627 0.360008
+v 0.561298 0.003627 0.379185
+v 0.514282 0.003627 0.382753
+v 0.494854 0.003627 0.340824
+v 0.540880 0.003627 0.336684
+v 0.574900 0.003627 0.354393
+v 0.546629 0.003627 0.403361
+v 0.481921 0.003627 0.362137
+v 0.506846 0.003627 0.318967
+v 0.467117 0.003627 0.447077
+v 0.496497 0.003627 0.471730
+v 0.449576 0.003627 0.467080
+v 0.437724 0.003627 0.422414
+v 0.483770 0.003627 0.426329
+v 0.514197 0.003627 0.449677
+v 0.477853 0.003627 0.492991
+v 0.421287 0.003627 0.441158
+v 0.453329 0.003627 0.402971
+v 0.391957 0.003627 0.522236
+v 0.416610 0.003627 0.551617
+v 0.371209 0.003627 0.538889
+v 0.367294 0.003627 0.492844
+v 0.411960 0.003627 0.504695
+v 0.437871 0.003627 0.532972
+v 0.394557 0.003627 0.569317
+v 0.347852 0.003627 0.508449
+v 0.386038 0.003627 0.476406
+v 0.304889 0.003627 0.583202
+v 0.324065 0.003627 0.616417
+v 0.281564 0.003627 0.596000
+v 0.285704 0.003627 0.549974
+v 0.327634 0.003627 0.569401
+v 0.348241 0.003627 0.601748
+v 0.299274 0.003627 0.630019
+v 0.263847 0.003627 0.561966
+v 0.307018 0.003627 0.537041
+v 0.208556 0.003627 0.628123
+v 0.221674 0.003627 0.664163
+v 0.183364 0.003627 0.636676
+v 0.195433 0.003627 0.592068
+v 0.233352 0.003627 0.618481
+v 0.248029 0.003627 0.653915
+v 0.194897 0.003627 0.673254
+v 0.171826 0.003627 0.600082
+v 0.218669 0.003627 0.583033
+v 0.105887 0.003627 0.655633
+v 0.112547 0.003627 0.693404
+v 0.079592 0.003627 0.659681
+v 0.099224 0.003627 0.617847
+v 0.131980 0.003627 0.650444
+v 0.140281 0.003627 0.687888
+v 0.084598 0.003627 0.697706
+v 0.074584 0.003627 0.621640
+v 0.123676 0.003627 0.612984
+v -0.000000 0.003627 0.664897
+v -0.000000 0.003627 0.703250
+v -0.026598 0.003627 0.664317
+v -0.000000 0.003627 0.626528
+v 0.026598 0.003627 0.664317
+v 0.028271 0.003627 0.702634
+v -0.028271 0.003627 0.702634
+v -0.024925 0.003627 0.625985
+v 0.024925 0.003627 0.625985
+v -0.105887 0.003627 0.655633
+v -0.112547 0.003627 0.693404
+v -0.131980 0.003627 0.650444
+v -0.099224 0.003627 0.617847
+v -0.079592 0.003627 0.659681
+v -0.084598 0.003627 0.697706
+v -0.140281 0.003627 0.687888
+v -0.123675 0.003627 0.612984
+v -0.074584 0.003627 0.621640
+v -0.208556 0.003627 0.628123
+v -0.221673 0.003627 0.664163
+v -0.233352 0.003627 0.618481
+v -0.195433 0.003627 0.592068
+v -0.183363 0.003627 0.636676
+v -0.194897 0.003627 0.673254
+v -0.248029 0.003627 0.653915
+v -0.218669 0.003627 0.583033
+v -0.171826 0.003627 0.600082
+v -0.304889 0.003627 0.583202
+v -0.324065 0.003627 0.616417
+v -0.327634 0.003627 0.569401
+v -0.285704 0.003627 0.549974
+v -0.281564 0.003627 0.596000
+v -0.299274 0.003627 0.630019
+v -0.348241 0.003627 0.601748
+v -0.307018 0.003627 0.537041
+v -0.263847 0.003627 0.561966
+v -0.391957 0.003627 0.522236
+v -0.416610 0.003627 0.551617
+v -0.411960 0.003627 0.504695
+v -0.367294 0.003627 0.492844
+v -0.371209 0.003627 0.538889
+v -0.394557 0.003627 0.569317
+v -0.437871 0.003627 0.532972
+v -0.386038 0.003627 0.476407
+v -0.347852 0.003627 0.508449
+v -0.467117 0.003627 0.447077
+v -0.496497 0.003627 0.471730
+v -0.483770 0.003627 0.426329
+v -0.437724 0.003627 0.422414
+v -0.449576 0.003627 0.467080
+v -0.477853 0.003627 0.492991
+v -0.514197 0.003627 0.449677
+v -0.453329 0.003627 0.402971
+v -0.421287 0.003627 0.441158
+v -0.528083 0.003627 0.360008
+v -0.561298 0.003627 0.379185
+v -0.540880 0.003627 0.336684
+v -0.494854 0.003627 0.340824
+v -0.514282 0.003627 0.382753
+v -0.546629 0.003627 0.403361
+v -0.574900 0.003627 0.354394
+v -0.506846 0.003627 0.318967
+v -0.481921 0.003627 0.362138
+v -0.573003 0.003627 0.263676
+v -0.609044 0.003627 0.276794
+v -0.581556 0.003627 0.238484
+v -0.536948 0.003627 0.250553
+v -0.563362 0.003627 0.288472
+v -0.598795 0.003627 0.303149
+v -0.618134 0.003627 0.250017
+v -0.544963 0.003627 0.226946
+v -0.527913 0.003627 0.273789
+v -0.600514 0.003626 0.161006
+v -0.638284 0.003626 0.167666
+v -0.604562 0.003626 0.134712
+v -0.562727 0.003626 0.154344
+v -0.595324 0.003627 0.187100
+v -0.632768 0.003627 0.195401
+v -0.642587 0.003626 0.139718
+v -0.566521 0.003626 0.129703
+v -0.557864 0.003626 0.178795
+v -0.609778 0.003626 0.055120
+v -0.648131 0.003626 0.055120
+v -0.609198 0.003626 0.028521
+v -0.571408 0.003626 0.055120
+v -0.609198 0.003626 0.081718
+v -0.647515 0.003626 0.083391
+v -0.647515 0.003626 0.026849
+v -0.570865 0.003626 0.030195
+v -0.570865 0.003626 0.080044
+v -0.600514 0.003626 -0.050767
+v -0.638284 0.003626 -0.057427
+v -0.595324 0.003626 -0.076861
+v -0.562727 0.003626 -0.044104
+v -0.604562 0.003626 -0.024472
+v -0.642587 0.003626 -0.029478
+v -0.632769 0.003626 -0.085162
+v -0.557865 0.003626 -0.068556
+v -0.566521 0.003626 -0.019464
+v -0.573004 0.003626 -0.153437
+v -0.609044 0.003626 -0.166554
+v -0.563362 0.003626 -0.178233
+v -0.536948 0.003626 -0.140314
+v -0.581556 0.003626 -0.128244
+v -0.618134 0.003626 -0.139777
+v -0.598796 0.003626 -0.192910
+v -0.527913 0.003626 -0.163549
+v -0.544963 0.003626 -0.116706
+v -0.528111 0.003626 -0.249736
+v -0.561327 0.003626 -0.268911
+v -0.514393 0.003626 -0.272383
+v -0.494880 0.003626 -0.230554
+v -0.540880 0.003626 -0.226445
+v -0.574900 0.003626 -0.244154
+v -0.546746 0.003626 -0.292982
+v -0.482025 0.003626 -0.251775
+v -0.506846 0.003626 -0.208728
+v -0.469257 0.003626 -0.334751
+v -0.439729 0.003626 -0.310218
+v -0.484322 0.003626 -0.315432
+v -0.498774 0.003626 -0.359274
+v -0.455818 0.003626 -0.351258
+v -0.427131 0.003626 -0.325682
+v -0.453847 0.003626 -0.292115
+v -0.514785 0.003626 -0.338738
+v -0.484494 0.003626 -0.376824
+v -0.435361 0.005035 -0.376014
+v -0.407917 0.005035 -0.348836
+v -0.438754 0.003626 -0.371809
+v -0.462789 0.005035 -0.403176
+v -0.434058 0.009262 -0.377728
+v -0.406678 0.009262 -0.350424
+v -0.411115 0.003626 -0.344915
+v -0.466378 0.003626 -0.398690
+v -0.461421 0.009262 -0.405014
+v -0.360572 0.005035 -0.301951
+v -0.352645 0.005035 -0.294101
+v -0.363399 0.003626 -0.298485
+v -0.370115 0.005035 -0.311401
+v -0.359477 0.009262 -0.303355
+v -0.351584 0.009262 -0.295483
+v -0.355399 0.003626 -0.290701
+v -0.373027 0.003626 -0.307853
+v -0.368981 0.009262 -0.312832
+v -0.310014 0.005035 -0.251883
+v -0.292273 0.005035 -0.234314
+v -0.312475 0.003626 -0.248932
+v -0.327767 0.005035 -0.269464
+v -0.309042 0.009262 -0.253060
+v -0.291329 0.009262 -0.235396
+v -0.294622 0.003626 -0.231559
+v -0.330342 0.003626 -0.266318
+v -0.326765 0.009262 -0.270734
+v -0.261898 0.006405 -0.204230
+v -0.264010 0.005035 -0.201772
+v -0.267491 0.005035 -0.209772
+v -0.261067 0.010514 -0.205205
+v -0.259212 0.010514 -0.201561
+v -0.261256 0.009262 -0.199092
+v -0.269667 0.003626 -0.207276
+v -0.266601 0.009262 -0.210737
+v -0.258507 0.014271 -0.202611
+v 0.435361 0.005035 -0.376014
+v 0.462789 0.005035 -0.403176
+v 0.438754 0.003626 -0.371810
+v 0.407917 0.005035 -0.348837
+v 0.434058 0.009262 -0.377728
+v 0.461421 0.009262 -0.405014
+v 0.466378 0.003626 -0.398690
+v 0.411115 0.003626 -0.344915
+v 0.406678 0.009262 -0.350424
+v 0.360572 0.005035 -0.301951
+v 0.370115 0.005035 -0.311401
+v 0.363399 0.003626 -0.298485
+v 0.352645 0.005035 -0.294101
+v 0.359477 0.009262 -0.303355
+v 0.368981 0.009262 -0.312832
+v 0.373027 0.003626 -0.307853
+v 0.355399 0.003626 -0.290701
+v 0.351583 0.009262 -0.295483
+v 0.310014 0.005035 -0.251883
+v 0.327767 0.005035 -0.269464
+v 0.312475 0.003626 -0.248932
+v 0.292273 0.005035 -0.234314
+v 0.309042 0.009262 -0.253060
+v 0.326765 0.009262 -0.270734
+v 0.330342 0.003626 -0.266318
+v 0.294622 0.003626 -0.231559
+v 0.291329 0.009262 -0.235396
+v 0.508465 0.006405 -0.448402
+v 0.512445 0.005035 -0.443515
+v 0.500465 0.005035 -0.440487
+v 0.506913 0.010514 -0.450352
+v 0.511952 0.010514 -0.451833
+v 0.516007 0.009262 -0.446979
+v 0.504353 0.003626 -0.435642
+v 0.498980 0.009262 -0.442469
+v 0.510304 0.014271 -0.453649
+v -0.155574 0.017714 0.756871
+v -0.124816 0.017714 0.762988
+v -0.093821 0.017714 0.767759
+v -0.275069 0.017714 0.719194
+v -0.245840 0.017714 0.730560
+v -0.216144 0.017714 0.740641
+v -0.386205 0.017714 0.661340
+v -0.359394 0.017714 0.677608
+v -0.331900 0.017714 0.692693
+v -0.485607 0.017714 0.585067
+v -0.462028 0.017714 0.605743
+v -0.437571 0.017714 0.625374
+v -0.570254 0.017714 0.492691
+v -0.550624 0.017714 0.517148
+v -0.529947 0.017714 0.540727
+v -0.637574 0.017714 0.387020
+v -0.622489 0.017714 0.414514
+v -0.606220 0.017714 0.441325
+v -0.685521 0.017714 0.271264
+v -0.675440 0.017714 0.300960
+v -0.664075 0.017714 0.330189
+v -0.712640 0.017714 0.148940
+v -0.707868 0.017714 0.179936
+v -0.701751 0.017714 0.210694
+v -0.718105 0.017714 0.023766
+v -0.718788 0.017714 0.055120
+v -0.718105 0.017714 0.086473
+v -0.701751 0.017714 -0.100455
+v -0.707868 0.017714 -0.069697
+v -0.712640 0.017714 -0.038701
+v -0.664075 0.017714 -0.219949
+v -0.675440 0.017714 -0.190720
+v -0.685522 0.017714 -0.161024
+v -0.606351 0.017714 -0.330931
+v -0.622522 0.017714 -0.304236
+v -0.637574 0.017714 -0.276780
+v -0.537285 0.017714 -0.423886
+v -0.553142 0.017714 -0.404444
+v -0.570905 0.017714 -0.381676
+v -0.093844 0.098869 0.767940
+v -0.124848 0.098869 0.763167
+v -0.155614 0.098869 0.757048
+v -0.216198 0.098869 0.740815
+v -0.245902 0.098869 0.730731
+v -0.275138 0.098869 0.719362
+v -0.331984 0.098869 0.692855
+v -0.359485 0.098869 0.677766
+v -0.386303 0.098869 0.661494
+v -0.437682 0.098869 0.625518
+v -0.462145 0.098869 0.605883
+v -0.485730 0.098869 0.585201
+v -0.530081 0.098869 0.540850
+v -0.550763 0.098869 0.517265
+v -0.570398 0.098869 0.492802
+v -0.606374 0.098869 0.441423
+v -0.622646 0.098869 0.414605
+v -0.637735 0.098869 0.387104
+v -0.664243 0.098869 0.330258
+v -0.675611 0.098869 0.301022
+v -0.685695 0.098869 0.271318
+v -0.701929 0.098869 0.210734
+v -0.708048 0.098869 0.179968
+v -0.712820 0.098869 0.148964
+v -0.718287 0.098869 0.086481
+v -0.718970 0.098869 0.055120
+v -0.718287 0.098869 0.023759
+v -0.712821 0.098869 -0.038725
+v -0.708048 0.098869 -0.069728
+v -0.701929 0.098869 -0.100494
+v -0.685695 0.098869 -0.161079
+v -0.675611 0.098869 -0.190783
+v -0.664243 0.098869 -0.220019
+v -0.637736 0.098869 -0.276864
+v -0.622679 0.098869 -0.304327
+v -0.606505 0.098869 -0.331028
+v -0.537413 0.098869 -0.423999
+v -0.553280 0.098869 -0.404558
+v -0.571050 0.098869 -0.381786
+v -0.511142 0.065989 -0.455307
+v -0.511092 0.049623 -0.455207
+v -0.510942 0.035089 -0.454906
+v -0.062543 0.099434 0.769986
+v -0.062123 0.099716 0.765191
+v -0.061152 0.099810 0.754096
+v -0.181599 0.099810 0.732858
+v -0.184482 0.099716 0.743616
+v -0.185728 0.099434 0.748265
+v -0.296528 0.099810 0.691027
+v -0.301235 0.099716 0.701122
+v -0.303269 0.099434 0.705484
+v -0.402448 0.099810 0.629875
+v -0.408836 0.099716 0.638998
+v -0.411597 0.099434 0.642941
+v -0.496139 0.099810 0.551259
+v -0.504014 0.099716 0.559134
+v -0.507418 0.099434 0.562538
+v -0.574755 0.099810 0.457568
+v -0.583879 0.099716 0.463956
+v -0.587821 0.099434 0.466717
+v -0.635907 0.099810 0.351648
+v -0.646002 0.099716 0.356355
+v -0.650364 0.099434 0.358389
+v -0.677738 0.099810 0.236719
+v -0.688497 0.099716 0.239602
+v -0.693146 0.099434 0.240848
+v -0.698977 0.099810 0.116272
+v -0.710072 0.099716 0.117243
+v -0.714867 0.099434 0.117662
+v -0.698977 0.099810 -0.006033
+v -0.710072 0.099716 -0.007004
+v -0.714867 0.099434 -0.007423
+v -0.677738 0.099810 -0.126480
+v -0.688497 0.099716 -0.129363
+v -0.693146 0.099434 -0.130608
+v -0.635908 0.099810 -0.241409
+v -0.646002 0.099716 -0.246116
+v -0.650364 0.099434 -0.248150
+v -0.575073 0.099810 -0.346950
+v -0.584202 0.099716 -0.353332
+v -0.588147 0.099434 -0.356090
+v -0.498824 0.098869 -0.443007
+v -0.506708 0.098802 -0.450830
+v -0.510028 0.098602 -0.453994
+v -0.590401 0.065989 -0.357666
+v -0.590274 0.048801 -0.357577
+v -0.589891 0.031802 -0.357309
+v -0.652858 0.065989 -0.249313
+v -0.652716 0.048801 -0.249247
+v -0.652293 0.031802 -0.249049
+v -0.695803 0.065989 -0.131320
+v -0.695653 0.048802 -0.131280
+v -0.695201 0.031802 -0.131159
+v -0.717607 0.065989 -0.007663
+v -0.717452 0.048802 -0.007649
+v -0.716987 0.031802 -0.007608
+v -0.717607 0.065989 0.117902
+v -0.717452 0.048802 0.117889
+v -0.716987 0.031802 0.117848
+v -0.695803 0.065989 0.241560
+v -0.695653 0.048802 0.241519
+v -0.695201 0.031802 0.241398
+v -0.652857 0.065989 0.359552
+v -0.652716 0.048802 0.359486
+v -0.652292 0.031802 0.359289
+v -0.590075 0.065989 0.468295
+v -0.589947 0.048802 0.468205
+v -0.589564 0.031802 0.467937
+v -0.509363 0.065989 0.564483
+v -0.509253 0.048802 0.564373
+v -0.508922 0.031802 0.564042
+v -0.413174 0.065989 0.645194
+v -0.413085 0.048802 0.645067
+v -0.412817 0.031802 0.644684
+v -0.304432 0.065989 0.707977
+v -0.304366 0.048802 0.707836
+v -0.304169 0.031802 0.707412
+v -0.186440 0.065989 0.750923
+v -0.186399 0.048802 0.750772
+v -0.186278 0.031802 0.750321
+v -0.062728 0.031802 0.772106
+v -0.062769 0.048802 0.772571
+v -0.062782 0.065989 0.772727
+v -0.078268 0.098869 0.408166
+v -0.062794 0.098869 0.411244
+v -0.047201 0.098869 0.413644
+v -0.138385 0.098869 0.389211
+v -0.123680 0.098869 0.394929
+v -0.108741 0.098869 0.400001
+v -0.194297 0.098869 0.360105
+v -0.180809 0.098869 0.368290
+v -0.166977 0.098869 0.375879
+v -0.244306 0.098869 0.321733
+v -0.232444 0.098869 0.332135
+v -0.220139 0.098869 0.342011
+v -0.286891 0.098869 0.275259
+v -0.277015 0.098869 0.287563
+v -0.266613 0.098869 0.299426
+v -0.320759 0.098869 0.222096
+v -0.313170 0.098869 0.235929
+v -0.304986 0.098869 0.249417
+v -0.344882 0.098869 0.163860
+v -0.339810 0.098869 0.178800
+v -0.334092 0.098869 0.193505
+v -0.358525 0.098869 0.102320
+v -0.356124 0.098869 0.117914
+v -0.353047 0.098869 0.133388
+v -0.361274 0.098869 0.039346
+v -0.361618 0.098869 0.055120
+v -0.361274 0.098869 0.070893
+v -0.353047 0.098869 -0.023149
+v -0.356124 0.098869 -0.007675
+v -0.358525 0.098869 0.007919
+v -0.334092 0.098869 -0.083266
+v -0.339810 0.098869 -0.068561
+v -0.344882 0.098869 -0.053621
+v -0.305052 0.098869 -0.139100
+v -0.313187 0.098869 -0.125670
+v -0.320760 0.098869 -0.111857
+v -0.270301 0.098869 -0.185861
+v -0.278281 0.098869 -0.176083
+v -0.287219 0.098869 -0.164630
+v -0.257087 0.090035 -0.201609
+v -0.257171 0.095335 -0.201668
+v -0.257424 0.097709 -0.201845
+v -0.258423 0.021706 -0.202842
+v -0.260895 0.018712 -0.205386
+v -0.266395 0.017714 -0.210903
+v -0.498743 0.017714 -0.442927
+v -0.506644 0.018712 -0.450767
+v -0.509984 0.021706 -0.453950
+v -0.484047 0.065989 -0.428927
+v -0.484069 0.048801 -0.428882
+v -0.484135 0.031802 -0.428745
+v -0.461286 0.098869 -0.405522
+v -0.433334 0.099460 -0.377623
+v -0.404221 0.101233 -0.348590
+v -0.469138 0.103550 -0.272884
+v -0.500355 0.100745 -0.294709
+v -0.531797 0.099810 -0.316693
+v -0.490075 0.099810 -0.421744
+v -0.486202 0.099716 -0.426359
+v -0.484664 0.099434 -0.428192
+v -0.588054 0.099810 -0.219094
+v -0.553285 0.100745 -0.202881
+v -0.518766 0.103550 -0.186785
+v -0.604316 0.099810 -0.259467
+v -0.590048 0.099810 -0.285490
+v -0.574721 0.099810 -0.310793
+v -0.626737 0.099810 -0.112814
+v -0.589681 0.100745 -0.102885
+v -0.552891 0.103550 -0.093027
+v -0.649762 0.099810 -0.149749
+v -0.640206 0.099810 -0.177896
+v -0.629434 0.099810 -0.205601
+v -0.646376 0.099810 -0.001431
+v -0.608160 0.100745 0.001913
+v -0.570217 0.103550 0.005232
+v -0.675466 0.099810 -0.033807
+v -0.670943 0.099810 -0.063186
+v -0.665145 0.099810 -0.092339
+v -0.646376 0.099810 0.111670
+v -0.608159 0.100745 0.108327
+v -0.570217 0.103550 0.105007
+v -0.680646 0.099810 0.084837
+v -0.681293 0.099810 0.055120
+v -0.680646 0.099810 0.025402
+v -0.626737 0.099810 0.223053
+v -0.589681 0.100745 0.213124
+v -0.552891 0.103550 0.203266
+v -0.665145 0.099810 0.202579
+v -0.670943 0.099810 0.173425
+v -0.675466 0.099810 0.144046
+v -0.588054 0.099810 0.329334
+v -0.553285 0.100745 0.313121
+v -0.518766 0.103550 0.297024
+v -0.629434 0.099810 0.315840
+v -0.640206 0.099810 0.288136
+v -0.649762 0.099810 0.259989
+v -0.531503 0.099810 0.427282
+v -0.500078 0.100745 0.405278
+v -0.468878 0.103550 0.383432
+v -0.574598 0.099810 0.421179
+v -0.590017 0.099810 0.395766
+v -0.604315 0.099810 0.369706
+v -0.458803 0.099810 0.513923
+v -0.431676 0.100745 0.486796
+v -0.404744 0.103550 0.459864
+v -0.502303 0.099810 0.515396
+v -0.521901 0.099810 0.493047
+v -0.540507 0.099810 0.469865
+v -0.372162 0.099810 0.586623
+v -0.350158 0.100745 0.555198
+v -0.328312 0.103550 0.523998
+v -0.414745 0.099810 0.595627
+v -0.437927 0.099810 0.577021
+v -0.460276 0.099810 0.557422
+v -0.274214 0.099810 0.643173
+v -0.258001 0.100745 0.608405
+v -0.241904 0.103550 0.573885
+v -0.314586 0.099810 0.659435
+v -0.340646 0.099810 0.645137
+v -0.366059 0.099810 0.629717
+v -0.167933 0.099810 0.681856
+v -0.158004 0.100745 0.644800
+v -0.148146 0.103550 0.608010
+v -0.204869 0.099810 0.704881
+v -0.233016 0.099810 0.695326
+v -0.260720 0.099810 0.684553
+v -0.056550 0.099810 0.701496
+v -0.053207 0.100745 0.663279
+v -0.049887 0.103550 0.625336
+v -0.088926 0.099810 0.730585
+v -0.118305 0.099810 0.726062
+v -0.147459 0.099810 0.720264
+v -0.406461 0.017714 -0.350774
+v -0.433843 0.017714 -0.378118
+v -0.461206 0.017714 -0.405443
+v -0.365195 0.107311 -0.309948
+v -0.358251 0.107992 -0.303099
+v -0.351225 0.108219 -0.296106
+v -0.383129 0.065989 -0.328010
+v -0.383151 0.048801 -0.327978
+v -0.383215 0.031802 -0.327882
+v -0.388991 0.109160 -0.323384
+v -0.385238 0.108850 -0.326384
+v -0.381982 0.107922 -0.325847
+v -0.479668 0.109160 -0.194579
+v -0.468343 0.109160 -0.215235
+v -0.456177 0.109160 -0.235318
+v -0.515740 0.109160 -0.107492
+v -0.508155 0.109160 -0.129834
+v -0.499605 0.109160 -0.151824
+v -0.536142 0.109160 -0.015465
+v -0.532552 0.109160 -0.038784
+v -0.527950 0.109160 -0.061924
+v -0.540254 0.109160 0.078708
+v -0.540768 0.109160 0.055120
+v -0.540254 0.109160 0.031532
+v -0.527950 0.109160 0.172163
+v -0.532552 0.109160 0.149023
+v -0.536142 0.109160 0.125704
+v -0.499605 0.109160 0.262063
+v -0.508155 0.109160 0.240073
+v -0.515740 0.109160 0.217732
+v -0.456079 0.109160 0.345674
+v -0.468318 0.109160 0.325503
+v -0.479667 0.109160 0.304819
+v -0.398696 0.109160 0.420457
+v -0.414252 0.109160 0.402718
+v -0.429020 0.109160 0.384318
+v -0.329199 0.109160 0.484140
+v -0.347598 0.109160 0.469372
+v -0.365338 0.109160 0.453816
+v -0.249699 0.109160 0.534787
+v -0.270384 0.109160 0.523438
+v -0.290554 0.109160 0.511199
+v -0.162612 0.109160 0.570859
+v -0.184953 0.109160 0.563275
+v -0.206943 0.109160 0.554724
+v -0.070584 0.109160 0.591261
+v -0.093903 0.109160 0.587671
+v -0.117044 0.109160 0.583069
+v -0.031442 0.097928 0.414499
+v -0.031404 0.095391 0.414067
+v -0.031391 0.090035 0.413923
+v -0.093220 0.090035 0.403021
+v -0.093257 0.095391 0.403161
+v -0.093369 0.097928 0.403579
+v -0.047213 0.017714 0.413737
+v -0.062810 0.017714 0.411336
+v -0.078289 0.017714 0.408258
+v -0.152216 0.090035 0.381548
+v -0.152277 0.095391 0.381679
+v -0.152460 0.097928 0.382072
+v -0.108769 0.017714 0.400091
+v -0.123713 0.017714 0.395018
+v -0.138421 0.017714 0.389298
+v -0.206587 0.090035 0.350157
+v -0.206670 0.095391 0.350275
+v -0.206919 0.097928 0.350630
+v -0.167020 0.017714 0.375962
+v -0.180856 0.017714 0.368371
+v -0.194348 0.017714 0.360185
+v -0.254681 0.090035 0.309801
+v -0.254784 0.095390 0.309903
+v -0.255090 0.097928 0.310210
+v -0.220196 0.017714 0.342085
+v -0.232504 0.017714 0.332207
+v -0.244369 0.017714 0.321802
+v -0.295037 0.090035 0.261707
+v -0.295156 0.095390 0.261790
+v -0.295511 0.097928 0.262039
+v -0.266682 0.017714 0.299489
+v -0.277087 0.017714 0.287624
+v -0.286966 0.017714 0.275316
+v -0.326429 0.090035 0.207336
+v -0.326560 0.095390 0.207397
+v -0.326952 0.097928 0.207580
+v -0.305065 0.017714 0.249468
+v -0.313252 0.017714 0.235976
+v -0.320843 0.017714 0.222140
+v -0.347902 0.090035 0.148340
+v -0.348041 0.095390 0.148377
+v -0.348460 0.097928 0.148489
+v -0.334179 0.017714 0.193541
+v -0.339898 0.017714 0.178832
+v -0.344971 0.017714 0.163889
+v -0.358804 0.090035 0.086511
+v -0.358948 0.095390 0.086523
+v -0.359380 0.097928 0.086561
+v -0.353138 0.017714 0.133409
+v -0.356217 0.017714 0.117930
+v -0.358618 0.017714 0.102333
+v -0.358804 0.090035 0.023728
+v -0.358948 0.095390 0.023716
+v -0.359380 0.097928 0.023678
+v -0.361368 0.017714 0.070897
+v -0.361712 0.017714 0.055120
+v -0.361368 0.017714 0.039342
+v -0.347902 0.090035 -0.038100
+v -0.348041 0.095390 -0.038138
+v -0.348460 0.097928 -0.038250
+v -0.358618 0.017714 0.007907
+v -0.356217 0.017714 -0.007691
+v -0.353138 0.017714 -0.023169
+v -0.326429 0.090035 -0.097097
+v -0.326560 0.095390 -0.097158
+v -0.326953 0.097928 -0.097341
+v -0.344971 0.017714 -0.053649
+v -0.339898 0.017714 -0.068593
+v -0.334179 0.017714 -0.083302
+v -0.295201 0.090035 -0.151274
+v -0.295319 0.095390 -0.151356
+v -0.295674 0.097928 -0.151605
+v -0.320843 0.017714 -0.111901
+v -0.313268 0.017714 -0.125717
+v -0.305131 0.017714 -0.139150
+v -0.287294 0.017714 -0.164687
+v -0.278353 0.017714 -0.176142
+v -0.270367 0.017714 -0.185920
+v -0.062782 0.090035 0.772727
+v -0.062770 0.095391 0.772590
+v -0.062734 0.097928 0.772178
+v -0.186297 0.097928 0.750391
+v -0.186404 0.095391 0.750790
+v -0.186440 0.090035 0.750923
+v -0.155911 0.080642 0.758391
+v -0.125086 0.080642 0.764521
+v -0.094024 0.080642 0.769303
+v -0.304199 0.097928 0.707478
+v -0.304374 0.095391 0.707852
+v -0.304432 0.090035 0.707977
+v -0.275665 0.080642 0.720633
+v -0.246372 0.080642 0.732023
+v -0.216612 0.080642 0.742126
+v -0.412859 0.097928 0.644744
+v -0.413096 0.095391 0.645082
+v -0.413174 0.090035 0.645194
+v -0.387042 0.080642 0.662654
+v -0.360173 0.080642 0.678957
+v -0.332619 0.080642 0.694075
+v -0.508974 0.097928 0.564094
+v -0.509266 0.095391 0.564386
+v -0.509363 0.090035 0.564483
+v -0.486659 0.080642 0.586215
+v -0.463029 0.080642 0.606937
+v -0.438519 0.080642 0.626609
+v -0.589624 0.097928 0.467979
+v -0.589962 0.095391 0.468216
+v -0.590075 0.090035 0.468295
+v -0.571489 0.080642 0.493639
+v -0.551817 0.080642 0.518149
+v -0.531095 0.080642 0.541779
+v -0.652358 0.097928 0.359320
+v -0.652732 0.095390 0.359494
+v -0.652857 0.090035 0.359552
+v -0.638955 0.080642 0.387739
+v -0.623837 0.080642 0.415293
+v -0.607534 0.080642 0.442162
+v -0.695272 0.097928 0.241417
+v -0.695670 0.095390 0.241524
+v -0.695803 0.090035 0.241560
+v -0.687007 0.080642 0.271732
+v -0.676903 0.080642 0.301492
+v -0.665513 0.080642 0.330785
+v -0.717059 0.097928 0.117854
+v -0.717470 0.095390 0.117890
+v -0.717607 0.090035 0.117902
+v -0.714184 0.080642 0.149144
+v -0.709402 0.080642 0.180206
+v -0.703272 0.080642 0.211031
+v -0.717059 0.097928 -0.007615
+v -0.717470 0.095390 -0.007651
+v -0.717607 0.090035 -0.007663
+v -0.719661 0.080642 0.023699
+v -0.720346 0.080642 0.055120
+v -0.719661 0.080642 0.086541
+v -0.695272 0.097928 -0.131178
+v -0.695670 0.095390 -0.131285
+v -0.695803 0.090035 -0.131320
+v -0.703272 0.080641 -0.100792
+v -0.709402 0.080641 -0.069967
+v -0.714184 0.080642 -0.038904
+v -0.652359 0.097928 -0.249080
+v -0.652733 0.095390 -0.249255
+v -0.652858 0.090035 -0.249313
+v -0.665514 0.080641 -0.220545
+v -0.676904 0.080641 -0.191253
+v -0.687007 0.080641 -0.161493
+v -0.589950 0.097928 -0.357351
+v -0.590289 0.095390 -0.357588
+v -0.590401 0.090035 -0.357666
+v -0.607665 0.080641 -0.331767
+v -0.623871 0.080641 -0.305014
+v -0.638956 0.080641 -0.277499
+v -0.510957 0.097709 -0.454921
+v -0.511096 0.095335 -0.455211
+v -0.511142 0.090035 -0.455307
+v -0.538441 0.080641 -0.424916
+v -0.554338 0.080641 -0.405437
+v -0.572142 0.080641 -0.382622
+v -0.484171 0.097928 -0.428780
+v -0.484078 0.095390 -0.428891
+v -0.484047 0.090035 -0.428927
+v -0.498506 0.080641 -0.443386
+v -0.506452 0.080641 -0.451261
+v -0.509969 0.080641 -0.454564
+v -0.380879 0.100292 -0.325627
+v -0.382567 0.095981 -0.327414
+v -0.383129 0.090035 -0.328010
+v -0.406244 0.080641 -0.351125
+v -0.433628 0.080641 -0.378508
+v -0.460992 0.080641 -0.405872
+v -0.257432 0.035089 -0.201852
+v -0.257173 0.049623 -0.201670
+v -0.257087 0.065989 -0.201609
+v -0.351225 0.080641 -0.296106
+v -0.359095 0.080641 -0.303975
+v -0.368571 0.080641 -0.313451
+v -0.295705 0.031802 -0.151626
+v -0.295327 0.048802 -0.151362
+v -0.295201 0.065989 -0.151274
+v -0.259083 0.080641 -0.196979
+v -0.257138 0.080641 -0.199522
+v -0.256634 0.080641 -0.200799
+v -0.326429 0.065989 -0.097097
+v -0.326568 0.048802 -0.097162
+v -0.326987 0.031802 -0.097357
+v -0.319478 0.080642 -0.111190
+v -0.311935 0.080641 -0.124947
+v -0.303832 0.080641 -0.138324
+v -0.347902 0.065989 -0.038100
+v -0.348050 0.048802 -0.038140
+v -0.348496 0.031802 -0.038260
+v -0.343504 0.080642 -0.053187
+v -0.338452 0.080642 -0.068067
+v -0.332757 0.080642 -0.082713
+v -0.358804 0.065989 0.023728
+v -0.358957 0.048802 0.023715
+v -0.359417 0.031802 0.023675
+v -0.357092 0.080642 0.008108
+v -0.354701 0.080642 -0.007424
+v -0.351636 0.080642 -0.022836
+v -0.358804 0.065989 0.086511
+v -0.358957 0.048802 0.086524
+v -0.359417 0.031802 0.086565
+v -0.359831 0.080642 0.070830
+v -0.360173 0.080642 0.055120
+v -0.359831 0.080642 0.039409
+v -0.347902 0.065989 0.148340
+v -0.348050 0.048802 0.148379
+v -0.348496 0.031802 0.148499
+v -0.351636 0.080642 0.133075
+v -0.354701 0.080642 0.117663
+v -0.357092 0.080642 0.102132
+v -0.326429 0.065989 0.207336
+v -0.326568 0.048802 0.207401
+v -0.326986 0.031802 0.207596
+v -0.332757 0.080642 0.192952
+v -0.338452 0.080642 0.178306
+v -0.343503 0.080642 0.163426
+v -0.295037 0.065989 0.261707
+v -0.295163 0.048802 0.261795
+v -0.295542 0.031802 0.262060
+v -0.303767 0.080642 0.248641
+v -0.311919 0.080642 0.235206
+v -0.319478 0.080642 0.221429
+v -0.254681 0.065989 0.309801
+v -0.254790 0.048802 0.309910
+v -0.255117 0.031802 0.310237
+v -0.265547 0.080642 0.298449
+v -0.275908 0.080642 0.286634
+v -0.285745 0.080642 0.274379
+v -0.206587 0.065989 0.350157
+v -0.206676 0.048802 0.350283
+v -0.206940 0.031802 0.350661
+v -0.219259 0.080642 0.340864
+v -0.231514 0.080642 0.331028
+v -0.243329 0.080642 0.320667
+v -0.152216 0.065989 0.381548
+v -0.152281 0.048802 0.381688
+v -0.152476 0.031802 0.382106
+v -0.166309 0.080642 0.374597
+v -0.180086 0.080642 0.367038
+v -0.193521 0.080642 0.358887
+v -0.093220 0.065989 0.403021
+v -0.093260 0.048802 0.403170
+v -0.093379 0.031802 0.403616
+v -0.108306 0.080642 0.398623
+v -0.123186 0.080642 0.393571
+v -0.137832 0.080642 0.387876
+v -0.031391 0.065989 0.413923
+v -0.031405 0.048802 0.414076
+v -0.031445 0.031802 0.414536
+v -0.047012 0.080642 0.412211
+v -0.062543 0.080642 0.409820
+v -0.077956 0.080642 0.406755
+v -0.291127 0.017714 -0.235601
+v -0.308852 0.017714 -0.253301
+v -0.326587 0.017714 -0.271011
+v -0.266188 0.080641 -0.211068
+v -0.260642 0.080641 -0.205487
+v -0.258015 0.080641 -0.202753
+v -0.275959 0.031802 -0.220685
+v -0.275896 0.048801 -0.220738
+v -0.275875 0.065989 -0.220756
+v -0.264166 0.101233 -0.208723
+v -0.260316 0.099393 -0.204818
+v -0.258401 0.098602 -0.202819
+v -0.275875 0.090035 -0.220756
+v -0.275523 0.095981 -0.220382
+v -0.274468 0.100292 -0.219260
+v -0.297570 0.099434 -0.152930
+v -0.298991 0.100651 -0.153924
+v -0.300413 0.103550 -0.154918
+v -0.265361 0.107922 -0.209550
+v -0.263502 0.108850 -0.205841
+v -0.264697 0.109160 -0.202442
+v -0.332192 0.103550 -0.099784
+v -0.330620 0.100651 -0.099051
+v -0.329048 0.099434 -0.098318
+v -0.310416 0.109160 -0.142515
+v -0.318694 0.109160 -0.128849
+v -0.326400 0.109160 -0.114794
+v -0.354044 0.103550 -0.039746
+v -0.352369 0.100651 -0.039297
+v -0.350694 0.099434 -0.038848
+v -0.339967 0.109160 -0.085699
+v -0.345785 0.109160 -0.070736
+v -0.350947 0.109160 -0.055533
+v -0.365138 0.103550 0.023174
+v -0.363411 0.100651 0.023325
+v -0.361683 0.099434 0.023476
+v -0.359255 0.109160 -0.024525
+v -0.362387 0.109160 -0.008779
+v -0.364830 0.109160 0.007089
+v -0.365139 0.103550 0.087065
+v -0.363411 0.100651 0.086914
+v -0.361683 0.099434 0.086763
+v -0.367627 0.109160 0.039069
+v -0.367977 0.109160 0.055120
+v -0.367627 0.109160 0.071171
+v -0.354044 0.103550 0.149985
+v -0.352369 0.100651 0.149537
+v -0.350693 0.099434 0.149088
+v -0.364830 0.109160 0.103150
+v -0.362387 0.109160 0.119018
+v -0.359255 0.109160 0.134765
+v -0.332192 0.103550 0.210023
+v -0.330620 0.100651 0.209290
+v -0.329048 0.099434 0.208557
+v -0.350946 0.109160 0.165773
+v -0.345785 0.109160 0.180975
+v -0.339967 0.109160 0.195939
+v -0.300246 0.103550 0.265354
+v -0.298826 0.100651 0.264360
+v -0.297405 0.099434 0.263365
+v -0.326400 0.109160 0.225033
+v -0.318677 0.109160 0.239108
+v -0.310349 0.109160 0.252834
+v -0.259178 0.103550 0.314298
+v -0.257952 0.100651 0.313071
+v -0.256725 0.099434 0.311845
+v -0.291936 0.109160 0.279130
+v -0.281887 0.109160 0.291651
+v -0.271301 0.109160 0.303722
+v -0.210235 0.103550 0.355366
+v -0.209240 0.100651 0.353945
+v -0.208245 0.099434 0.352525
+v -0.248602 0.109160 0.326421
+v -0.236531 0.109160 0.337006
+v -0.224010 0.109160 0.347056
+v -0.154903 0.103550 0.387311
+v -0.154171 0.100651 0.385740
+v -0.153438 0.099434 0.384168
+v -0.197714 0.109160 0.365469
+v -0.183988 0.109160 0.373797
+v -0.169913 0.109160 0.381520
+v -0.094866 0.103550 0.409163
+v -0.094417 0.100651 0.407488
+v -0.093968 0.099434 0.405813
+v -0.140819 0.109160 0.395086
+v -0.125855 0.109160 0.400905
+v -0.110653 0.109160 0.406066
+v -0.031945 0.103550 0.420258
+v -0.031794 0.100651 0.418530
+v -0.031643 0.099434 0.416802
+v -0.079645 0.109160 0.414374
+v -0.063898 0.109160 0.417506
+v -0.048031 0.109160 0.419949
+v -0.366115 0.152720 -0.309714
+v -0.363580 0.132363 -0.307772
+v -0.366424 0.117272 -0.310844
+v -0.426397 0.151431 -0.242825
+v -0.422164 0.132350 -0.239998
+v -0.427665 0.118510 -0.243888
+v -0.382333 0.303713 -0.322767
+v -0.382622 0.303391 -0.321318
+v -0.382924 0.301906 -0.317649
+v -0.275244 0.117272 -0.219798
+v -0.276613 0.130814 -0.221137
+v -0.277069 0.146525 -0.221583
+v -0.351449 0.282947 -0.295839
+v -0.359196 0.286563 -0.303235
+v -0.368295 0.292554 -0.311303
+v -0.302308 0.118510 -0.156243
+v -0.302663 0.131029 -0.156491
+v -0.302782 0.146145 -0.156574
+v -0.281385 0.254124 -0.225403
+v -0.279167 0.252982 -0.221324
+v -0.280350 0.252601 -0.217673
+v -0.472907 0.118510 -0.165400
+v -0.466795 0.132350 -0.162550
+v -0.471389 0.151431 -0.164693
+v -0.475956 0.303424 -0.192647
+v -0.464745 0.303424 -0.213117
+v -0.452751 0.303424 -0.232967
+v -0.334812 0.146145 -0.101006
+v -0.334681 0.131029 -0.100945
+v -0.334288 0.118510 -0.100761
+v -0.328773 0.252601 -0.154203
+v -0.337541 0.252601 -0.139728
+v -0.345702 0.252601 -0.124842
+v -0.504015 0.118510 -0.079931
+v -0.497501 0.132350 -0.078185
+v -0.502398 0.151431 -0.079497
+v -0.511749 0.303424 -0.106234
+v -0.504223 0.303424 -0.128403
+v -0.495739 0.303424 -0.150222
+v -0.356836 0.146145 -0.040494
+v -0.356696 0.131029 -0.040457
+v -0.356278 0.118510 -0.040345
+v -0.360071 0.252601 -0.094027
+v -0.366234 0.252602 -0.078179
+v -0.371700 0.252601 -0.062077
+v -0.519809 0.118510 0.009642
+v -0.513091 0.132350 0.010230
+v -0.518141 0.151431 0.009788
+v -0.531993 0.303424 -0.014918
+v -0.528431 0.303424 -0.038057
+v -0.523864 0.303424 -0.061018
+v -0.368018 0.146145 0.022922
+v -0.367874 0.131029 0.022935
+v -0.367442 0.118510 0.022973
+v -0.380500 0.252601 -0.029235
+v -0.383817 0.252602 -0.012558
+v -0.386404 0.252602 0.004249
+v -0.519809 0.118510 0.100597
+v -0.513091 0.132350 0.100009
+v -0.518141 0.151431 0.100451
+v -0.536073 0.303424 0.078525
+v -0.536583 0.303424 0.055120
+v -0.536073 0.303424 0.031714
+v -0.368018 0.146145 0.087317
+v -0.367874 0.131029 0.087304
+v -0.367442 0.118510 0.087267
+v -0.389368 0.252602 0.038119
+v -0.389738 0.252602 0.055120
+v -0.389368 0.252602 0.072120
+v -0.504015 0.118510 0.190170
+v -0.497501 0.132350 0.188425
+v -0.502398 0.151431 0.189737
+v -0.523864 0.303424 0.171258
+v -0.528431 0.303424 0.148296
+v -0.531993 0.303424 0.125158
+v -0.356836 0.146145 0.150733
+v -0.356696 0.131029 0.150696
+v -0.356277 0.118510 0.150584
+v -0.386404 0.252602 0.105991
+v -0.383817 0.252602 0.122797
+v -0.380500 0.252602 0.139475
+v -0.472906 0.118510 0.275639
+v -0.466795 0.132350 0.272790
+v -0.471389 0.151431 0.274932
+v -0.495738 0.303424 0.260461
+v -0.504223 0.303424 0.238642
+v -0.511749 0.303424 0.216473
+v -0.334811 0.146145 0.211245
+v -0.334680 0.131029 0.211184
+v -0.334288 0.118510 0.211000
+v -0.371700 0.252602 0.172316
+v -0.366234 0.252602 0.188418
+v -0.360071 0.252602 0.204266
+v -0.427429 0.118510 0.354409
+v -0.421905 0.132350 0.350541
+v -0.426058 0.151431 0.353448
+v -0.452550 0.303424 0.343426
+v -0.464694 0.303424 0.323411
+v -0.475955 0.303424 0.302886
+v -0.302614 0.146145 0.267012
+v -0.302496 0.131029 0.266929
+v -0.302140 0.118510 0.266681
+v -0.345702 0.252602 0.235081
+v -0.337523 0.252602 0.249989
+v -0.328702 0.252602 0.264526
+v -0.368964 0.118510 0.424084
+v -0.364196 0.132350 0.419316
+v -0.367781 0.151431 0.422900
+v -0.395611 0.303424 0.417630
+v -0.411046 0.303424 0.400028
+v -0.425700 0.303424 0.381771
+v -0.261222 0.146145 0.316342
+v -0.261120 0.131029 0.316239
+v -0.260813 0.118510 0.315933
+v -0.309200 0.252602 0.292377
+v -0.298556 0.252602 0.305638
+v -0.287345 0.252602 0.318423
+v -0.299289 0.118510 0.482549
+v -0.295421 0.132350 0.477025
+v -0.298329 0.151431 0.481177
+v -0.326651 0.303424 0.480820
+v -0.344909 0.303424 0.466166
+v -0.362510 0.303424 0.450730
+v -0.211893 0.146145 0.357734
+v -0.211810 0.131029 0.357615
+v -0.211561 0.118510 0.357260
+v -0.263303 0.252602 0.342465
+v -0.250519 0.252602 0.353676
+v -0.237258 0.252602 0.364320
+v -0.220520 0.118510 0.528026
+v -0.217670 0.132350 0.521914
+v -0.219812 0.151431 0.526509
+v -0.247766 0.303424 0.531075
+v -0.268291 0.303424 0.519814
+v -0.288306 0.303424 0.507669
+v -0.156125 0.146145 0.389931
+v -0.156064 0.131029 0.389800
+v -0.155881 0.118510 0.389407
+v -0.209406 0.252602 0.383822
+v -0.194869 0.252602 0.392642
+v -0.179961 0.252602 0.400822
+v -0.135050 0.118510 0.559134
+v -0.133305 0.132350 0.552620
+v -0.134617 0.151431 0.557517
+v -0.161353 0.303424 0.566868
+v -0.183522 0.303424 0.559342
+v -0.205341 0.303424 0.550858
+v -0.095614 0.146145 0.411955
+v -0.095576 0.131029 0.411816
+v -0.095464 0.118510 0.411397
+v -0.149146 0.252602 0.415191
+v -0.133298 0.252602 0.421353
+v -0.117196 0.252602 0.426820
+v -0.045477 0.118510 0.574928
+v -0.044890 0.132350 0.568210
+v -0.045331 0.151431 0.573261
+v -0.070038 0.303424 0.587112
+v -0.093176 0.303424 0.583550
+v -0.116138 0.303424 0.578984
+v -0.032197 0.146145 0.423137
+v -0.032185 0.131029 0.422993
+v -0.032147 0.118510 0.422561
+v -0.084355 0.252602 0.435620
+v -0.067677 0.252602 0.438936
+v -0.050871 0.252602 0.441524
+v -0.032197 0.217082 0.423137
+v -0.032197 0.200351 0.423137
+v -0.032197 0.181889 0.423137
+v -0.095614 0.181889 0.411955
+v -0.095614 0.200351 0.411955
+v -0.095614 0.217082 0.411955
+v -0.079958 0.163289 0.415785
+v -0.064149 0.163289 0.418929
+v -0.048219 0.163289 0.421382
+v -0.156125 0.181889 0.389931
+v -0.156125 0.200351 0.389931
+v -0.156125 0.217082 0.389931
+v -0.141372 0.163289 0.396422
+v -0.126350 0.163289 0.402263
+v -0.111087 0.163289 0.407444
+v -0.211893 0.181889 0.357734
+v -0.211893 0.200351 0.357734
+v -0.211893 0.217082 0.357734
+v -0.198491 0.163289 0.366688
+v -0.184711 0.163289 0.375049
+v -0.170580 0.163289 0.382802
+v -0.261222 0.181889 0.316342
+v -0.261222 0.200351 0.316342
+v -0.261222 0.217082 0.316342
+v -0.249578 0.163289 0.327487
+v -0.237460 0.163289 0.338113
+v -0.224890 0.163289 0.348202
+v -0.302614 0.181889 0.267012
+v -0.302614 0.200351 0.267012
+v -0.302614 0.217082 0.267012
+v -0.293083 0.163289 0.280010
+v -0.282994 0.163289 0.292580
+v -0.272367 0.163289 0.304698
+v -0.334811 0.181889 0.211245
+v -0.334811 0.200351 0.211245
+v -0.334811 0.217082 0.211245
+v -0.327682 0.163289 0.225700
+v -0.319929 0.163289 0.239831
+v -0.311568 0.163289 0.253610
+v -0.356836 0.181889 0.150733
+v -0.356836 0.200351 0.150733
+v -0.356836 0.217081 0.150733
+v -0.352325 0.163289 0.166207
+v -0.347143 0.163289 0.181469
+v -0.341302 0.163289 0.196492
+v -0.368018 0.181889 0.087317
+v -0.368018 0.200351 0.087317
+v -0.368018 0.217081 0.087317
+v -0.366262 0.163289 0.103339
+v -0.363810 0.163289 0.119269
+v -0.360666 0.163289 0.135077
+v -0.368018 0.181889 0.022922
+v -0.368018 0.200351 0.022922
+v -0.368018 0.217081 0.022922
+v -0.369071 0.163289 0.039006
+v -0.369422 0.163289 0.055120
+v -0.369071 0.163289 0.071234
+v -0.356836 0.181889 -0.040494
+v -0.356836 0.200351 -0.040494
+v -0.356836 0.217081 -0.040494
+v -0.360666 0.163289 -0.024838
+v -0.363810 0.163289 -0.009030
+v -0.366262 0.163289 0.006900
+v -0.334812 0.181889 -0.101006
+v -0.334812 0.200351 -0.101006
+v -0.334812 0.217081 -0.101006
+v -0.341302 0.163289 -0.086253
+v -0.347143 0.163289 -0.071230
+v -0.352325 0.163289 -0.055968
+v -0.302782 0.181889 -0.156574
+v -0.302782 0.200351 -0.156574
+v -0.302782 0.217081 -0.156574
+v -0.311635 0.163289 -0.143292
+v -0.319946 0.163289 -0.129572
+v -0.327682 0.163289 -0.115461
+v -0.277069 0.183785 -0.221583
+v -0.277069 0.203385 -0.221583
+v -0.277069 0.221254 -0.221583
+v -0.276134 0.163289 -0.191062
+v -0.284287 0.163289 -0.181073
+v -0.293418 0.163289 -0.169372
+v -0.379746 0.214425 -0.321457
+v -0.381333 0.241141 -0.322862
+v -0.381862 0.264465 -0.323331
+v -0.326408 0.167461 -0.271289
+v -0.308781 0.166323 -0.253625
+v -0.291403 0.165186 -0.236137
+v -0.387552 0.176503 -0.318884
+v -0.383944 0.177103 -0.321895
+v -0.380835 0.178902 -0.321690
+v -0.475955 0.176503 -0.192647
+v -0.464745 0.176503 -0.213117
+v -0.452751 0.176503 -0.232967
+v -0.511749 0.176503 -0.106234
+v -0.504223 0.176503 -0.128402
+v -0.495739 0.176503 -0.150222
+v -0.531993 0.176503 -0.014918
+v -0.528431 0.176503 -0.038057
+v -0.523864 0.176503 -0.061018
+v -0.536073 0.176503 0.078525
+v -0.536583 0.176503 0.055120
+v -0.536073 0.176503 0.031714
+v -0.523864 0.176503 0.171258
+v -0.528431 0.176503 0.148296
+v -0.531993 0.176503 0.125158
+v -0.495738 0.176503 0.260461
+v -0.504223 0.176503 0.238642
+v -0.511749 0.176503 0.216473
+v -0.452550 0.176503 0.343426
+v -0.464694 0.176503 0.323411
+v -0.475955 0.176503 0.302886
+v -0.395611 0.176503 0.417630
+v -0.411046 0.176503 0.400028
+v -0.425700 0.176503 0.381771
+v -0.326651 0.176503 0.480820
+v -0.344909 0.176503 0.466166
+v -0.362510 0.176503 0.450730
+v -0.247766 0.176503 0.531075
+v -0.268291 0.176503 0.519814
+v -0.288306 0.176503 0.507669
+v -0.161353 0.176503 0.566868
+v -0.183522 0.176503 0.559342
+v -0.205341 0.176503 0.550858
+v -0.070038 0.176503 0.587112
+v -0.093176 0.176503 0.583550
+v -0.116138 0.176503 0.578984
+v -0.517773 0.276222 -0.304939
+v -0.490191 0.242884 -0.286190
+v -0.462797 0.208316 -0.267568
+v -0.462797 0.321657 -0.267568
+v -0.490191 0.343591 -0.286190
+v -0.517773 0.365986 -0.304939
+v -0.568923 0.395116 -0.339709
+v -0.568829 0.381816 -0.339645
+v -0.568546 0.367956 -0.339453
+v -0.455630 0.289755 -0.384878
+v -0.429274 0.257108 -0.362781
+v -0.401806 0.221569 -0.339755
+v -0.502514 0.357491 -0.423510
+v -0.503986 0.355862 -0.422092
+v -0.507390 0.355320 -0.418053
+v -0.403951 0.321273 -0.341477
+v -0.429810 0.343098 -0.363211
+v -0.502433 0.392151 -0.424123
+v -0.502389 0.379509 -0.424047
+v -0.502260 0.367749 -0.423821
+v -0.502514 0.414737 -0.423510
+v -0.503986 0.415427 -0.422092
+v -0.507390 0.415657 -0.418053
+v -0.511180 0.208316 -0.183248
+v -0.541127 0.242885 -0.197212
+v -0.571279 0.276222 -0.211272
+v -0.571279 0.365986 -0.211272
+v -0.541127 0.343591 -0.197212
+v -0.511180 0.321657 -0.183248
+v -0.626782 0.367956 -0.237153
+v -0.627090 0.381816 -0.237297
+v -0.627193 0.395116 -0.237345
+v -0.583507 0.355320 -0.315260
+v -0.598534 0.355320 -0.290118
+v -0.612830 0.355320 -0.263900
+v -0.583507 0.415657 -0.315260
+v -0.598534 0.415657 -0.290118
+v -0.612830 0.415657 -0.263900
+v -0.544806 0.208316 -0.090861
+v -0.576723 0.242885 -0.099413
+v -0.608858 0.276222 -0.108023
+v -0.608858 0.365986 -0.108023
+v -0.576722 0.343591 -0.099413
+v -0.544806 0.321657 -0.090861
+v -0.668012 0.367956 -0.123874
+v -0.668341 0.381816 -0.123962
+v -0.668451 0.395116 -0.123991
+v -0.638303 0.355320 -0.209274
+v -0.649227 0.355320 -0.181180
+v -0.658917 0.355320 -0.152636
+v -0.638303 0.415657 -0.209274
+v -0.649227 0.415657 -0.181180
+v -0.658917 0.415657 -0.152636
+v -0.561879 0.208316 0.005962
+v -0.594795 0.242885 0.003082
+v -0.627937 0.276222 0.000182
+v -0.627937 0.365986 0.000182
+v -0.594795 0.343591 0.003082
+v -0.561879 0.321657 0.005962
+v -0.688945 0.367956 -0.005155
+v -0.689285 0.381816 -0.005185
+v -0.689398 0.395116 -0.005195
+v -0.674517 0.355320 -0.094417
+v -0.680397 0.355320 -0.064853
+v -0.684983 0.355320 -0.035060
+v -0.674517 0.415657 -0.094417
+v -0.680397 0.415657 -0.064853
+v -0.684983 0.415657 -0.035060
+v -0.561879 0.208316 0.104278
+v -0.594795 0.242885 0.107157
+v -0.627937 0.276222 0.110057
+v -0.627937 0.365986 0.110057
+v -0.594795 0.343591 0.107157
+v -0.561879 0.321657 0.104278
+v -0.688945 0.367956 0.115395
+v -0.689285 0.381817 0.115424
+v -0.689398 0.395116 0.115434
+v -0.690236 0.355320 0.024983
+v -0.690893 0.355320 0.055120
+v -0.690236 0.355320 0.085256
+v -0.690236 0.415657 0.024983
+v -0.690893 0.415657 0.055120
+v -0.690236 0.415657 0.085256
+v -0.544806 0.208316 0.201100
+v -0.576722 0.242885 0.209652
+v -0.608858 0.276222 0.218263
+v -0.608858 0.365986 0.218263
+v -0.576722 0.343591 0.209652
+v -0.544806 0.321657 0.201100
+v -0.668012 0.367956 0.234113
+v -0.668341 0.381817 0.234201
+v -0.668451 0.395116 0.234230
+v -0.684983 0.355320 0.145299
+v -0.680397 0.355320 0.175092
+v -0.674517 0.355320 0.204657
+v -0.684983 0.415657 0.145299
+v -0.680397 0.415657 0.175092
+v -0.674517 0.415657 0.204657
+v -0.511180 0.208316 0.293487
+v -0.541126 0.242885 0.307451
+v -0.571278 0.276222 0.321511
+v -0.571278 0.365986 0.321511
+v -0.541126 0.343591 0.307451
+v -0.511180 0.321657 0.293487
+v -0.626781 0.367956 0.347393
+v -0.627090 0.381817 0.347537
+v -0.627193 0.395116 0.347585
+v -0.658917 0.355320 0.262875
+v -0.649227 0.355320 0.291419
+v -0.638302 0.355320 0.319513
+v -0.658917 0.415657 0.262875
+v -0.649227 0.415657 0.291419
+v -0.638303 0.415657 0.319513
+v -0.462022 0.208316 0.378631
+v -0.489088 0.242885 0.397583
+v -0.516341 0.276222 0.416666
+v -0.516341 0.365986 0.416666
+v -0.489088 0.343591 0.397583
+v -0.462022 0.321657 0.378631
+v -0.566506 0.367956 0.451792
+v -0.566785 0.381817 0.451987
+v -0.566878 0.395116 0.452052
+v -0.612830 0.355320 0.374139
+v -0.598330 0.355320 0.400566
+v -0.582694 0.355320 0.426337
+v -0.612830 0.415657 0.374139
+v -0.598331 0.415657 0.400566
+v -0.582694 0.415657 0.426337
+v -0.398826 0.208316 0.453946
+v -0.422190 0.242885 0.477310
+v -0.445715 0.276222 0.500835
+v -0.445715 0.365986 0.500834
+v -0.422190 0.343591 0.477310
+v -0.398826 0.321657 0.453946
+v -0.489018 0.367956 0.544138
+v -0.489259 0.381817 0.544379
+v -0.489340 0.395116 0.544459
+v -0.548123 0.355320 0.475709
+v -0.529254 0.355320 0.499217
+v -0.509380 0.355320 0.521881
+v -0.548123 0.415657 0.475709
+v -0.529254 0.415657 0.499217
+v -0.509380 0.415657 0.521881
+v -0.323511 0.208316 0.517142
+v -0.342463 0.242885 0.544208
+v -0.361546 0.276222 0.571461
+v -0.361546 0.365986 0.571461
+v -0.342463 0.343591 0.544208
+v -0.323511 0.321657 0.517142
+v -0.396672 0.367956 0.621626
+v -0.396867 0.381817 0.621905
+v -0.396932 0.395116 0.621998
+v -0.466761 0.355320 0.564500
+v -0.444097 0.355320 0.584374
+v -0.420589 0.355320 0.603243
+v -0.466761 0.415657 0.564500
+v -0.444097 0.415657 0.584374
+v -0.420589 0.415657 0.603243
+v -0.238367 0.208316 0.566300
+v -0.252331 0.242885 0.596246
+v -0.266391 0.276222 0.626398
+v -0.266391 0.365986 0.626398
+v -0.252331 0.343591 0.596246
+v -0.238367 0.321657 0.566300
+v -0.292273 0.367956 0.681901
+v -0.292417 0.381817 0.682210
+v -0.292465 0.395116 0.682313
+v -0.371217 0.355320 0.637813
+v -0.345446 0.355320 0.653450
+v -0.319019 0.355320 0.667950
+v -0.371217 0.415657 0.637813
+v -0.345446 0.415657 0.653450
+v -0.319019 0.415657 0.667950
+v -0.145980 0.208316 0.599926
+v -0.154532 0.242885 0.631842
+v -0.163143 0.276222 0.663977
+v -0.163143 0.365986 0.663977
+v -0.154532 0.343591 0.631842
+v -0.145980 0.321657 0.599926
+v -0.178993 0.367956 0.723131
+v -0.179081 0.381817 0.723460
+v -0.179110 0.395116 0.723570
+v -0.264393 0.355320 0.693422
+v -0.236299 0.355320 0.704346
+v -0.207755 0.355320 0.714037
+v -0.264393 0.415657 0.693422
+v -0.236299 0.415657 0.704346
+v -0.207755 0.415657 0.714037
+v -0.049158 0.208316 0.616998
+v -0.052038 0.242885 0.649914
+v -0.054937 0.276222 0.683057
+v -0.054937 0.365986 0.683057
+v -0.052038 0.343591 0.649914
+v -0.049158 0.321657 0.616998
+v -0.060275 0.367956 0.744065
+v -0.060304 0.381817 0.744404
+v -0.060314 0.395116 0.744517
+v -0.149537 0.355320 0.729636
+v -0.119972 0.355320 0.735516
+v -0.090179 0.355320 0.740102
+v -0.149537 0.415657 0.729636
+v -0.119972 0.415657 0.735516
+v -0.090179 0.415657 0.740102
+v -0.060116 0.413040 0.742254
+v -0.059758 0.407946 0.738163
+v -0.058922 0.399193 0.728604
+v -0.174976 0.399193 0.708141
+v -0.177460 0.407946 0.717409
+v -0.178523 0.413040 0.721376
+v -0.142516 0.385600 0.697968
+v -0.114339 0.385600 0.703571
+v -0.085945 0.385600 0.707942
+v -0.285714 0.399193 0.667836
+v -0.289769 0.407946 0.676532
+v -0.291505 0.413040 0.680254
+v -0.251980 0.385600 0.663454
+v -0.225205 0.385600 0.673865
+v -0.198001 0.385600 0.683100
+v -0.387770 0.399193 0.608914
+v -0.393274 0.407946 0.616773
+v -0.395629 0.413040 0.620138
+v -0.353788 0.385600 0.610456
+v -0.329227 0.385600 0.625359
+v -0.304041 0.385600 0.639177
+v -0.478045 0.399193 0.533165
+v -0.484829 0.407946 0.539949
+v -0.487733 0.413040 0.542853
+v -0.444846 0.385600 0.540584
+v -0.423247 0.385600 0.559526
+v -0.400842 0.385600 0.577508
+v -0.553794 0.399193 0.442890
+v -0.561654 0.407946 0.448394
+v -0.565018 0.413040 0.450750
+v -0.522388 0.385600 0.455962
+v -0.504406 0.385600 0.478367
+v -0.485465 0.385600 0.499966
+v -0.612716 0.399193 0.340834
+v -0.621412 0.407946 0.344889
+v -0.625134 0.413040 0.346625
+v -0.584058 0.385600 0.359161
+v -0.570239 0.385600 0.384347
+v -0.555336 0.385600 0.408908
+v -0.653021 0.399193 0.230096
+v -0.662290 0.407946 0.232580
+v -0.666257 0.413040 0.233643
+v -0.627981 0.385600 0.253121
+v -0.618745 0.385600 0.280325
+v -0.608334 0.385600 0.307100
+v -0.673485 0.399193 0.114042
+v -0.683044 0.407946 0.114878
+v -0.687135 0.413040 0.115236
+v -0.652823 0.385600 0.141065
+v -0.648452 0.385600 0.169459
+v -0.642848 0.385600 0.197636
+v -0.673485 0.399193 -0.003803
+v -0.683044 0.407946 -0.004639
+v -0.687135 0.413040 -0.004997
+v -0.657830 0.385600 0.026398
+v -0.658455 0.385600 0.055120
+v -0.657830 0.385600 0.083841
+v -0.653022 0.399193 -0.119857
+v -0.662290 0.407946 -0.122340
+v -0.666257 0.413040 -0.123403
+v -0.642848 0.385600 -0.087396
+v -0.648452 0.385600 -0.059220
+v -0.652823 0.385600 -0.030826
+v -0.612717 0.399193 -0.230595
+v -0.621413 0.407946 -0.234650
+v -0.625135 0.413040 -0.236385
+v -0.608334 0.385600 -0.196861
+v -0.618746 0.385600 -0.170085
+v -0.627981 0.385600 -0.142882
+v -0.555680 0.399193 -0.330707
+v -0.563635 0.407946 -0.336114
+v -0.567040 0.413040 -0.338429
+v -0.556021 0.385600 -0.297962
+v -0.570410 0.385600 -0.273931
+v -0.584058 0.385600 -0.248922
+v -0.501426 0.412026 -0.423122
+v -0.498411 0.385600 -0.377441
+v -0.511236 0.385600 -0.361343
+v -0.525811 0.385600 -0.342187
+v -0.490965 0.334706 -0.414508
+v -0.498348 0.346538 -0.420659
+v -0.501426 0.354531 -0.423122
+v -0.477102 0.378736 -0.403420
+v -0.477128 0.382947 -0.403389
+v -0.477207 0.384707 -0.403293
+v -0.567040 0.345694 -0.338429
+v -0.563635 0.336024 -0.336114
+v -0.555680 0.323258 -0.330707
+v -0.482199 0.304342 -0.397207
+v -0.478924 0.305567 -0.401199
+v -0.477624 0.309242 -0.402784
+v -0.612717 0.323258 -0.230595
+v -0.621413 0.336024 -0.234650
+v -0.625135 0.345694 -0.236385
+v -0.584058 0.304342 -0.248922
+v -0.570410 0.304342 -0.273931
+v -0.556021 0.304342 -0.297962
+v -0.653022 0.323258 -0.119857
+v -0.662290 0.336024 -0.122340
+v -0.666257 0.345694 -0.123403
+v -0.627981 0.304342 -0.142882
+v -0.618746 0.304342 -0.170085
+v -0.608334 0.304342 -0.196861
+v -0.673485 0.323258 -0.003803
+v -0.683044 0.336024 -0.004639
+v -0.687135 0.345694 -0.004997
+v -0.652823 0.304342 -0.030826
+v -0.648452 0.304342 -0.059220
+v -0.642848 0.304342 -0.087396
+v -0.673485 0.323258 0.114042
+v -0.683044 0.336025 0.114878
+v -0.687135 0.345694 0.115236
+v -0.657830 0.304342 0.083841
+v -0.658455 0.304342 0.055120
+v -0.657830 0.304342 0.026398
+v -0.653021 0.323258 0.230096
+v -0.662290 0.336025 0.232580
+v -0.666257 0.345694 0.233643
+v -0.642848 0.304342 0.197636
+v -0.648452 0.304342 0.169459
+v -0.652823 0.304342 0.141065
+v -0.612716 0.323258 0.340834
+v -0.621412 0.336025 0.344889
+v -0.625134 0.345694 0.346625
+v -0.608334 0.304342 0.307100
+v -0.618745 0.304342 0.280325
+v -0.627981 0.304342 0.253121
+v -0.553794 0.323258 0.442890
+v -0.561653 0.336025 0.448394
+v -0.565018 0.345694 0.450750
+v -0.555336 0.304342 0.408908
+v -0.570239 0.304342 0.384347
+v -0.584058 0.304342 0.359161
+v -0.478045 0.323258 0.533165
+v -0.484829 0.336025 0.539949
+v -0.487733 0.345694 0.542853
+v -0.485465 0.304342 0.499966
+v -0.504406 0.304342 0.478367
+v -0.522388 0.304342 0.455962
+v -0.387770 0.323258 0.608914
+v -0.393274 0.336025 0.616773
+v -0.395629 0.345694 0.620138
+v -0.400842 0.304342 0.577508
+v -0.423247 0.304342 0.559526
+v -0.444846 0.304342 0.540584
+v -0.285714 0.323258 0.667836
+v -0.289769 0.336025 0.676532
+v -0.291505 0.345694 0.680254
+v -0.304041 0.304342 0.639177
+v -0.329227 0.304342 0.625359
+v -0.353788 0.304342 0.610456
+v -0.174976 0.323258 0.708141
+v -0.177460 0.336025 0.717409
+v -0.178523 0.345694 0.721376
+v -0.198001 0.304342 0.683100
+v -0.225205 0.304342 0.673865
+v -0.251980 0.304342 0.663454
+v -0.058922 0.323258 0.728604
+v -0.059758 0.336025 0.738163
+v -0.060116 0.345694 0.742254
+v -0.085945 0.304342 0.707942
+v -0.114339 0.304342 0.703571
+v -0.142516 0.304342 0.697968
+v -0.260170 0.017714 -0.198036
+v -0.258184 0.018712 -0.200536
+v -0.257603 0.021706 -0.201682
+v -0.269220 0.080641 -0.184898
+v -0.277169 0.080641 -0.175159
+v -0.286071 0.080641 -0.163751
+v -0.262950 0.065989 -0.192371
+v -0.263061 0.048801 -0.192476
+v -0.263395 0.031802 -0.192790
+v -0.257580 0.098602 -0.201659
+v -0.258150 0.098802 -0.200502
+v -0.260123 0.098869 -0.197991
+v -0.263372 0.097928 -0.192768
+v -0.263056 0.095390 -0.192470
+v -0.262950 0.090035 -0.192371
+v -0.275054 0.109160 -0.190099
+v -0.283175 0.109160 -0.180149
+v -0.292270 0.109160 -0.168494
+v -0.267592 0.103550 -0.196741
+v -0.266326 0.100651 -0.195549
+v -0.265060 0.099434 -0.194357
+v -0.268576 0.163668 -0.212723
+v -0.265080 0.163384 -0.207399
+v -0.265737 0.163289 -0.203453
+v -0.269703 0.146145 -0.198727
+v -0.269597 0.131028 -0.198628
+v -0.269281 0.118510 -0.198330
+v -0.291320 0.252601 -0.204600
+v -0.299921 0.252601 -0.194062
+v -0.309554 0.252601 -0.181718
+v -0.269703 0.217081 -0.198727
+v -0.269703 0.200351 -0.198727
+v -0.269703 0.181889 -0.198727
+v -0.426706 0.303424 -0.270433
+v -0.412886 0.302955 -0.286848
+v -0.398749 0.301549 -0.300242
+v -0.335918 0.274453 -0.262998
+v -0.317403 0.266709 -0.244110
+v -0.299366 0.259087 -0.226646
+v -0.477624 0.385421 -0.402784
+v -0.478924 0.385555 -0.401199
+v -0.482199 0.385600 -0.397207
+v -0.466408 0.365986 -0.371788
+v -0.439539 0.343129 -0.350371
+v -0.411102 0.319810 -0.328571
+v -0.524011 0.415657 -0.397704
+v -0.537181 0.415657 -0.381099
+v -0.552189 0.415657 -0.361284
+v -0.512842 0.413040 -0.409569
+v -0.509633 0.407946 -0.406958
+v -0.502135 0.399193 -0.400857
+v -0.524011 0.355320 -0.397704
+v -0.537181 0.355320 -0.381099
+v -0.552189 0.355320 -0.361284
+v -0.514617 0.412892 -0.411013
+v -0.514528 0.416291 -0.410941
+v -0.514262 0.416977 -0.410724
+v -0.498411 0.304342 -0.377441
+v -0.511236 0.304342 -0.361343
+v -0.525811 0.304342 -0.342187
+v -0.502135 0.323258 -0.400857
+v -0.509633 0.336024 -0.406958
+v -0.512842 0.345694 -0.409569
+v -0.402228 0.176503 -0.301312
+v -0.413756 0.176503 -0.287116
+v -0.426706 0.176503 -0.270433
+v -0.414592 0.208316 -0.329627
+v -0.440411 0.242884 -0.350635
+v -0.466408 0.276222 -0.371788
+v -0.404211 0.109160 -0.305246
+v -0.416145 0.109160 -0.290623
+v -0.429510 0.109160 -0.273496
+v -0.380943 0.118510 -0.303427
+v -0.376161 0.132350 -0.298652
+v -0.380284 0.151431 -0.301713
+v -0.509250 0.099810 -0.398892
+v -0.524286 0.099810 -0.380469
+v -0.541124 0.099810 -0.358891
+v -0.473698 0.099810 -0.390729
+v -0.445691 0.100745 -0.364368
+v -0.417884 0.103550 -0.338197
+v -0.517177 0.098869 -0.448115
+v -0.513040 0.098802 -0.452894
+v -0.511266 0.098602 -0.454553
+v -0.523892 0.099434 -0.437971
+v -0.520378 0.099716 -0.434664
+v -0.512246 0.099810 -0.427011
+v -0.512055 0.080641 -0.455505
+v -0.513974 0.080641 -0.453860
+v -0.518167 0.080641 -0.449078
+v -0.525900 0.090035 -0.439862
+v -0.525800 0.095390 -0.439767
+v -0.525498 0.097928 -0.439484
+v -0.511222 0.021706 -0.454509
+v -0.512974 0.018712 -0.452829
+v -0.517087 0.017714 -0.448028
+v -0.525453 0.031802 -0.439442
+v -0.525788 0.048801 -0.439757
+v -0.525900 0.065989 -0.439862
+v -0.277069 0.244666 -0.221583
+v -0.278105 0.250070 -0.222589
+v -0.281213 0.253465 -0.225608
+v -0.381862 0.293995 -0.323331
+v -0.381885 0.300116 -0.323302
+v -0.381956 0.302675 -0.323218
+v -0.326408 0.253019 -0.271289
+v -0.308781 0.246874 -0.253625
+v -0.291403 0.240729 -0.236137
+v -0.477207 0.328843 -0.403293
+v -0.477128 0.343587 -0.403389
+v -0.477102 0.358422 -0.403420
+v -0.455374 0.349791 -0.385188
+v -0.429562 0.325636 -0.363512
+v -0.403709 0.302063 -0.341767
+v -0.502433 0.410012 -0.424123
+v -0.502389 0.413490 -0.424047
+v -0.502260 0.414363 -0.423821
+v -0.501394 0.400244 -0.423583
+v -0.498141 0.394809 -0.421018
+v -0.490701 0.385493 -0.414831
+v -0.514262 0.367956 -0.410724
+v -0.514528 0.381816 -0.410941
+v -0.514617 0.395116 -0.411013
+v -0.508272 0.406070 -0.418783
+v -0.504824 0.405779 -0.422824
+v -0.503227 0.404905 -0.424236
+v -0.568923 0.412892 -0.339709
+v -0.568829 0.416292 -0.339645
+v -0.568546 0.416977 -0.339453
+v -0.553112 0.406070 -0.361953
+v -0.538089 0.406070 -0.381790
+v -0.524907 0.406070 -0.398413
+v -0.627193 0.412892 -0.237345
+v -0.627090 0.416292 -0.237297
+v -0.626782 0.416977 -0.237153
+v -0.613838 0.406070 -0.264424
+v -0.599519 0.406070 -0.290684
+v -0.584469 0.406070 -0.315866
+v -0.668451 0.412892 -0.123991
+v -0.668341 0.416292 -0.123962
+v -0.668012 0.416977 -0.123874
+v -0.660000 0.406070 -0.152978
+v -0.650294 0.406070 -0.181568
+v -0.639352 0.406070 -0.209709
+v -0.689398 0.412892 -0.005195
+v -0.689285 0.416292 -0.005185
+v -0.688945 0.416977 -0.005155
+v -0.686109 0.406070 -0.035208
+v -0.681515 0.406070 -0.065050
+v -0.675626 0.406070 -0.094663
+v -0.689398 0.412892 0.115434
+v -0.689285 0.416292 0.115424
+v -0.688945 0.416977 0.115395
+v -0.691371 0.406070 0.085306
+v -0.692029 0.406070 0.055120
+v -0.691371 0.406070 0.024934
+v -0.668451 0.412892 0.234230
+v -0.668341 0.416292 0.234201
+v -0.668012 0.416977 0.234113
+v -0.675626 0.406070 0.204902
+v -0.681515 0.406070 0.175289
+v -0.686109 0.406070 0.145447
+v -0.627193 0.412892 0.347585
+v -0.627090 0.416292 0.347537
+v -0.626781 0.416977 0.347393
+v -0.639352 0.406070 0.319948
+v -0.650294 0.406070 0.291807
+v -0.660000 0.406070 0.263217
+v -0.566879 0.412892 0.452052
+v -0.566785 0.416292 0.451987
+v -0.566506 0.416977 0.451792
+v -0.583652 0.406070 0.426947
+v -0.599314 0.406070 0.401134
+v -0.613838 0.406070 0.374663
+v -0.489340 0.412892 0.544459
+v -0.489259 0.416292 0.544379
+v -0.489018 0.416977 0.544138
+v -0.510217 0.406070 0.522648
+v -0.530124 0.406070 0.499947
+v -0.549024 0.406070 0.476400
+v -0.396932 0.412892 0.621998
+v -0.396867 0.416292 0.621905
+v -0.396672 0.416977 0.621626
+v -0.421280 0.406070 0.604144
+v -0.444827 0.406070 0.585244
+v -0.467528 0.406070 0.565337
+v -0.292465 0.412892 0.682313
+v -0.292417 0.416292 0.682210
+v -0.292273 0.416977 0.681901
+v -0.319543 0.406070 0.668957
+v -0.346014 0.406070 0.654434
+v -0.371827 0.406070 0.638771
+v -0.179110 0.412892 0.723570
+v -0.179081 0.416292 0.723460
+v -0.178993 0.416977 0.723131
+v -0.208097 0.406070 0.715120
+v -0.236687 0.406070 0.705414
+v -0.264828 0.406070 0.694471
+v -0.060314 0.412892 0.744517
+v -0.060304 0.416292 0.744404
+v -0.060275 0.416977 0.744065
+v -0.090328 0.406070 0.741229
+v -0.120169 0.406070 0.736635
+v -0.149782 0.406070 0.730745
+v -0.032906 0.248266 0.431233
+v -0.032374 0.244313 0.425161
+v -0.032197 0.238976 0.423137
+v -0.095614 0.238976 0.411955
+v -0.096140 0.244313 0.413918
+v -0.097717 0.248266 0.419805
+v -0.079958 0.230488 0.415785
+v -0.064149 0.230488 0.418929
+v -0.048219 0.230488 0.421382
+v -0.156125 0.238976 0.389931
+v -0.156984 0.244313 0.391772
+v -0.159559 0.248266 0.397296
+v -0.141372 0.230488 0.396422
+v -0.126350 0.230488 0.402263
+v -0.111087 0.230488 0.407444
+v -0.211893 0.238976 0.357734
+v -0.213058 0.244313 0.359398
+v -0.216554 0.248266 0.364390
+v -0.198491 0.230488 0.366687
+v -0.184711 0.230488 0.375049
+v -0.170580 0.230488 0.382802
+v -0.261222 0.238976 0.316342
+v -0.262658 0.244313 0.317778
+v -0.266968 0.248266 0.322088
+v -0.249578 0.230488 0.327487
+v -0.237460 0.230488 0.338113
+v -0.224890 0.230488 0.348202
+v -0.302614 0.238976 0.267012
+v -0.304278 0.244313 0.268178
+v -0.309271 0.248266 0.271673
+v -0.293083 0.230488 0.280010
+v -0.282994 0.230488 0.292580
+v -0.272367 0.230488 0.304698
+v -0.334811 0.238976 0.211245
+v -0.336653 0.244313 0.212103
+v -0.342176 0.248266 0.214679
+v -0.327682 0.230488 0.225700
+v -0.319929 0.230488 0.239831
+v -0.311568 0.230488 0.253610
+v -0.356836 0.238976 0.150733
+v -0.358798 0.244313 0.151259
+v -0.364685 0.248266 0.152837
+v -0.352325 0.230488 0.166207
+v -0.347143 0.230488 0.181469
+v -0.341302 0.230488 0.196492
+v -0.368018 0.238976 0.087317
+v -0.370042 0.244313 0.087494
+v -0.376113 0.248266 0.088025
+v -0.366262 0.230488 0.103339
+v -0.363810 0.230488 0.119269
+v -0.360666 0.230488 0.135077
+v -0.368018 0.238976 0.022922
+v -0.370042 0.244313 0.022745
+v -0.376113 0.248266 0.022214
+v -0.369071 0.230488 0.039006
+v -0.369422 0.230488 0.055120
+v -0.369071 0.230488 0.071234
+v -0.356836 0.238976 -0.040494
+v -0.358798 0.244313 -0.041020
+v -0.364685 0.248266 -0.042598
+v -0.360666 0.230488 -0.024838
+v -0.363810 0.230488 -0.009030
+v -0.366262 0.230488 0.006900
+v -0.334812 0.238976 -0.101006
+v -0.336653 0.244313 -0.101864
+v -0.342177 0.248266 -0.104440
+v -0.341302 0.230488 -0.086253
+v -0.347143 0.230488 -0.071230
+v -0.352325 0.230488 -0.055968
+v -0.302782 0.238976 -0.156574
+v -0.304447 0.244313 -0.157738
+v -0.309442 0.248266 -0.161231
+v -0.311635 0.230488 -0.143292
+v -0.319946 0.230488 -0.129572
+v -0.327682 0.230488 -0.115461
+v -0.269703 0.238976 -0.198727
+v -0.271186 0.244313 -0.200123
+v -0.275635 0.248266 -0.204311
+v -0.276134 0.230488 -0.191062
+v -0.284287 0.230488 -0.181073
+v -0.293418 0.230488 -0.169372
+v -0.268576 0.232536 -0.212723
+v -0.265080 0.231000 -0.207399
+v -0.265737 0.230488 -0.203453
+v -0.351404 0.017714 -0.295794
+v -0.359286 0.017714 -0.303665
+v -0.368776 0.017714 -0.313142
+v -0.326408 0.080641 -0.271289
+v -0.308662 0.080641 -0.253542
+v -0.290925 0.080641 -0.235806
+v -0.341488 0.065989 -0.286368
+v -0.341505 0.048801 -0.286338
+v -0.341557 0.031802 -0.286247
+v -0.326408 0.108219 -0.271289
+v -0.308323 0.107992 -0.253181
+v -0.289569 0.107311 -0.234361
+v -0.341488 0.101668 -0.286368
+v -0.341488 0.096325 -0.286368
+v -0.341488 0.090035 -0.286368
+v -0.364887 0.174258 -0.308817
+v -0.358174 0.170488 -0.302817
+v -0.351225 0.168979 -0.296106
+v -0.341488 0.148194 -0.286368
+v -0.341488 0.131446 -0.286368
+v -0.341488 0.118133 -0.286368
+v -0.368064 0.271021 -0.311580
+v -0.358968 0.264689 -0.303507
+v -0.351225 0.261213 -0.296106
+v -0.341488 0.239613 -0.286368
+v -0.341488 0.216737 -0.286368
+v -0.341488 0.192130 -0.286368
+v -0.326616 0.273236 -0.271041
+v -0.309815 0.266258 -0.254238
+v -0.294939 0.259890 -0.239304
+v -0.341575 0.278611 -0.286265
+v -0.341510 0.275967 -0.286343
+v -0.341488 0.269701 -0.286368
+v -0.368244 0.289912 -0.304807
+v -0.360985 0.286265 -0.300649
+v -0.356649 0.284110 -0.294386
+v -0.345880 0.280522 -0.284296
+v -0.343043 0.280061 -0.285306
+v -0.341923 0.279722 -0.285850
+v -0.376045 0.273711 -0.207797
+v -0.356064 0.266523 -0.193827
+v -0.336083 0.259087 -0.179857
+v -0.359103 0.280166 -0.267004
+v -0.368952 0.279629 -0.251922
+v -0.380552 0.279451 -0.236038
+v -0.415826 0.273711 -0.138783
+v -0.393731 0.266523 -0.128480
+v -0.371636 0.259087 -0.118177
+v -0.404179 0.279451 -0.202212
+v -0.414958 0.279451 -0.184418
+v -0.424991 0.279451 -0.166117
+v -0.443179 0.273711 -0.063630
+v -0.419631 0.266523 -0.057320
+v -0.396083 0.259087 -0.051011
+v -0.442656 0.279451 -0.128235
+v -0.450232 0.279451 -0.108751
+v -0.456952 0.279451 -0.088957
+v -0.457067 0.273711 0.015131
+v -0.432781 0.266523 0.017256
+v -0.408495 0.259087 0.019381
+v -0.467770 0.279451 -0.048583
+v -0.471848 0.279451 -0.028080
+v -0.475028 0.279451 -0.007419
+v -0.457067 0.273711 0.095108
+v -0.432781 0.266523 0.092983
+v -0.408495 0.259087 0.090858
+v -0.478671 0.279451 0.034220
+v -0.479127 0.279451 0.055120
+v -0.478671 0.279451 0.076019
+v -0.443179 0.273711 0.173869
+v -0.419631 0.266524 0.167559
+v -0.396083 0.259087 0.161250
+v -0.475028 0.279451 0.117658
+v -0.471848 0.279451 0.138319
+v -0.467770 0.279451 0.158822
+v -0.415826 0.273711 0.249022
+v -0.393731 0.266524 0.238719
+v -0.371636 0.259087 0.228416
+v -0.456952 0.279451 0.199196
+v -0.450232 0.279451 0.218991
+v -0.442656 0.279451 0.238474
+v -0.375837 0.273711 0.318284
+v -0.355867 0.266524 0.304301
+v -0.335897 0.259087 0.290318
+v -0.424991 0.279451 0.276356
+v -0.414936 0.279451 0.294683
+v -0.404092 0.279451 0.312555
+v -0.324430 0.273711 0.379549
+v -0.307191 0.266524 0.362311
+v -0.289953 0.259087 0.345072
+v -0.380117 0.279451 0.346794
+v -0.367032 0.279451 0.363096
+v -0.353250 0.279451 0.378813
+v -0.263164 0.273711 0.430957
+v -0.249181 0.266524 0.410987
+v -0.235198 0.259087 0.391017
+v -0.323694 0.279451 0.408369
+v -0.307977 0.279451 0.422152
+v -0.291674 0.279451 0.435237
+v -0.193902 0.273711 0.470945
+v -0.183599 0.266524 0.448850
+v -0.173297 0.259087 0.426756
+v -0.257435 0.279451 0.459211
+v -0.239563 0.279451 0.470055
+v -0.221236 0.279451 0.480111
+v -0.118749 0.273711 0.498299
+v -0.112440 0.266524 0.474750
+v -0.106130 0.259087 0.451202
+v -0.183354 0.279451 0.497775
+v -0.163871 0.279451 0.505351
+v -0.144076 0.279451 0.512071
+v -0.039988 0.273711 0.512186
+v -0.037863 0.266524 0.487900
+v -0.035739 0.259087 0.463614
+v -0.103702 0.279451 0.522889
+v -0.083199 0.279451 0.526967
+v -0.062538 0.279451 0.530148
+v -0.417297 0.282807 -0.236639
+v -0.419572 0.285891 -0.238185
+v -0.426397 0.292132 -0.242825
+v -0.471389 0.292132 -0.164693
+v -0.463929 0.285891 -0.161214
+v -0.461442 0.282807 -0.160054
+v -0.428221 0.271134 -0.217519
+v -0.439641 0.271134 -0.198666
+v -0.450271 0.271134 -0.179277
+v -0.402687 0.282543 -0.226424
+v -0.407682 0.283494 -0.229916
+v -0.409347 0.282807 -0.231080
+v -0.411832 0.269865 -0.232817
+v -0.413322 0.269442 -0.233860
+v -0.414813 0.269865 -0.234902
+v -0.452650 0.282807 -0.155955
+v -0.450809 0.283494 -0.155096
+v -0.445285 0.282543 -0.152520
+v -0.444356 0.271134 -0.176197
+v -0.433865 0.271134 -0.195332
+v -0.422595 0.271134 -0.213937
+v -0.458694 0.269865 -0.158773
+v -0.457046 0.269442 -0.158004
+v -0.455398 0.269865 -0.157236
+v -0.502398 0.292132 -0.079498
+v -0.494446 0.285891 -0.077367
+v -0.491796 0.282807 -0.076657
+v -0.468987 0.271134 -0.139141
+v -0.477013 0.271134 -0.118499
+v -0.484133 0.271134 -0.097527
+v -0.482426 0.282807 -0.074146
+v -0.480464 0.283494 -0.073620
+v -0.474577 0.282543 -0.072043
+v -0.477773 0.271134 -0.095522
+v -0.470747 0.271134 -0.116218
+v -0.462826 0.271134 -0.136589
+v -0.488868 0.269865 -0.075872
+v -0.487111 0.269442 -0.075401
+v -0.485354 0.269865 -0.074931
+v -0.518141 0.292132 0.009788
+v -0.509941 0.285891 0.010506
+v -0.507207 0.282807 0.010745
+v -0.495595 0.271134 -0.054751
+v -0.499915 0.271134 -0.033029
+v -0.503285 0.271134 -0.011139
+v -0.497544 0.282807 0.011590
+v -0.495520 0.283494 0.011767
+v -0.489448 0.282543 0.012298
+v -0.496673 0.271134 -0.010269
+v -0.493347 0.271134 -0.031871
+v -0.489084 0.271134 -0.053308
+v -0.504187 0.269865 0.011009
+v -0.502375 0.269442 0.011167
+v -0.500563 0.269865 0.011326
+v -0.518141 0.292132 0.100451
+v -0.509940 0.285891 0.099734
+v -0.507207 0.282807 0.099494
+v -0.507144 0.271134 0.032977
+v -0.507627 0.271134 0.055120
+v -0.507144 0.271134 0.077262
+v -0.497544 0.282807 0.098649
+v -0.495520 0.283494 0.098472
+v -0.489448 0.282543 0.097941
+v -0.500482 0.271134 0.076971
+v -0.500958 0.271134 0.055120
+v -0.500482 0.271134 0.033268
+v -0.504187 0.269865 0.099230
+v -0.502375 0.269442 0.099072
+v -0.500563 0.269865 0.098913
+v -0.502398 0.292132 0.189737
+v -0.494446 0.285891 0.187606
+v -0.491796 0.282807 0.186896
+v -0.503285 0.271134 0.121378
+v -0.499915 0.271134 0.143268
+v -0.495595 0.271134 0.164990
+v -0.482426 0.282807 0.184385
+v -0.480464 0.283494 0.183859
+v -0.474577 0.282543 0.182282
+v -0.489084 0.271134 0.163547
+v -0.493347 0.271134 0.142110
+v -0.496673 0.271134 0.120508
+v -0.488868 0.269865 0.186111
+v -0.487111 0.269442 0.185641
+v -0.485354 0.269865 0.185170
+v -0.471389 0.292132 0.274932
+v -0.463928 0.285891 0.271453
+v -0.461441 0.282807 0.270293
+v -0.484133 0.271134 0.207766
+v -0.477013 0.271134 0.228738
+v -0.468987 0.271134 0.249380
+v -0.452650 0.282807 0.266194
+v -0.450809 0.283494 0.265335
+v -0.445285 0.282543 0.262760
+v -0.462825 0.271134 0.246828
+v -0.470746 0.271134 0.226457
+v -0.477773 0.271134 0.205761
+v -0.458694 0.269865 0.269012
+v -0.457046 0.269442 0.268244
+v -0.455397 0.269865 0.267475
+v -0.426058 0.292132 0.353449
+v -0.419314 0.285891 0.348727
+v -0.417067 0.282807 0.347153
+v -0.450271 0.271134 0.289516
+v -0.439618 0.271134 0.308933
+v -0.428129 0.271134 0.327868
+v -0.409121 0.282807 0.341589
+v -0.407456 0.283494 0.340424
+v -0.402464 0.282543 0.336928
+v -0.422504 0.271134 0.324285
+v -0.433842 0.271134 0.305599
+v -0.444356 0.271134 0.286437
+v -0.414583 0.269865 0.345414
+v -0.413094 0.269442 0.344371
+v -0.411604 0.269865 0.343328
+v -0.367781 0.292132 0.422900
+v -0.361960 0.285891 0.417079
+v -0.360019 0.282807 0.415139
+v -0.402728 0.271134 0.364144
+v -0.388865 0.271134 0.381416
+v -0.374262 0.271134 0.398068
+v -0.353160 0.282807 0.408280
+v -0.351724 0.283494 0.406843
+v -0.347414 0.282543 0.402534
+v -0.369345 0.271134 0.393562
+v -0.383756 0.271134 0.377129
+v -0.397437 0.271134 0.360084
+v -0.357876 0.269865 0.412996
+v -0.356590 0.269442 0.411709
+v -0.355304 0.269865 0.410423
+v -0.298329 0.292132 0.481177
+v -0.293607 0.285891 0.474434
+v -0.292033 0.282807 0.472186
+v -0.342948 0.271134 0.429382
+v -0.326296 0.271134 0.443984
+v -0.309024 0.271134 0.457848
+v -0.286469 0.282807 0.464240
+v -0.285304 0.283494 0.462576
+v -0.281808 0.282543 0.457584
+v -0.304964 0.271134 0.452557
+v -0.322009 0.271134 0.438876
+v -0.338443 0.271134 0.424465
+v -0.290294 0.269865 0.469703
+v -0.289251 0.269442 0.468213
+v -0.288208 0.269865 0.466723
+v -0.219812 0.292132 0.526509
+v -0.216333 0.285891 0.519048
+v -0.215173 0.282807 0.516561
+v -0.272748 0.271134 0.483248
+v -0.253813 0.271134 0.494737
+v -0.234396 0.271134 0.505391
+v -0.211074 0.282807 0.507770
+v -0.210215 0.283494 0.505928
+v -0.207640 0.282543 0.500405
+v -0.231317 0.271134 0.499475
+v -0.250479 0.271134 0.488962
+v -0.269165 0.271134 0.477624
+v -0.213892 0.269865 0.513814
+v -0.213124 0.269442 0.512165
+v -0.212355 0.269865 0.510517
+v -0.134617 0.292132 0.557517
+v -0.132486 0.285891 0.549566
+v -0.131776 0.282807 0.546915
+v -0.194260 0.271134 0.524106
+v -0.173618 0.271134 0.532133
+v -0.152646 0.271134 0.539252
+v -0.129265 0.282807 0.537546
+v -0.128740 0.283494 0.535583
+v -0.127162 0.282543 0.529696
+v -0.150641 0.271134 0.532892
+v -0.171337 0.271134 0.525866
+v -0.191708 0.271134 0.517945
+v -0.130991 0.269865 0.543987
+v -0.130521 0.269442 0.542230
+v -0.130050 0.269865 0.540473
+v -0.045331 0.292132 0.573261
+v -0.044614 0.285891 0.565060
+v -0.044375 0.282807 0.562326
+v -0.109871 0.271134 0.550714
+v -0.088148 0.271134 0.555034
+v -0.066258 0.271134 0.558404
+v -0.043529 0.282807 0.552663
+v -0.043352 0.283494 0.550639
+v -0.042821 0.282543 0.544568
+v -0.065388 0.271134 0.551792
+v -0.086990 0.271134 0.548467
+v -0.108427 0.271134 0.544203
+v -0.044111 0.269865 0.559307
+v -0.043952 0.269442 0.557495
+v -0.043794 0.269865 0.555683
+v -0.370857 0.282807 -0.293388
+v -0.371938 0.285198 -0.294764
+v -0.375180 0.289363 -0.298893
+v -0.381255 0.271733 -0.280327
+v -0.391096 0.271284 -0.268726
+v -0.403188 0.271134 -0.253357
+v -0.365933 0.282807 -0.288871
+v -0.364756 0.283748 -0.288297
+v -0.361222 0.283561 -0.286575
+v -0.369749 0.271733 -0.287235
+v -0.369620 0.271434 -0.289671
+v -0.371939 0.271733 -0.289188
+v -0.397891 0.271134 -0.249304
+v -0.386110 0.271284 -0.264623
+v -0.376853 0.271733 -0.276527
+v -0.409844 0.273249 -0.231428
+v -0.409471 0.275842 -0.231167
+v -0.409347 0.278545 -0.231080
+v -0.365933 0.278545 -0.288871
+v -0.366621 0.275965 -0.288219
+v -0.368684 0.273743 -0.286262
+v -0.373844 0.280989 -0.278028
+v -0.384474 0.280989 -0.264282
+v -0.396687 0.280989 -0.248383
+v -0.370857 0.278545 -0.293388
+v -0.371394 0.275965 -0.292582
+v -0.373003 0.273742 -0.290161
+v -0.364540 0.280989 -0.298556
+v -0.361481 0.280989 -0.299370
+v -0.361879 0.280989 -0.296063
+v -0.417297 0.278545 -0.236639
+v -0.417173 0.275842 -0.236552
+v -0.416800 0.273249 -0.236291
+v -0.404392 0.280989 -0.254278
+v -0.391723 0.280989 -0.270269
+v -0.380231 0.280989 -0.283632
+v -0.461442 0.278545 -0.160054
+v -0.461304 0.275842 -0.159990
+v -0.460892 0.273249 -0.159798
+v -0.451616 0.280989 -0.179977
+v -0.440954 0.280989 -0.199424
+v -0.429499 0.280989 -0.218333
+v -0.491796 0.278545 -0.076657
+v -0.491649 0.275842 -0.076617
+v -0.491210 0.273249 -0.076500
+v -0.485579 0.280989 -0.097983
+v -0.478438 0.280989 -0.119017
+v -0.470387 0.280989 -0.139721
+v -0.507207 0.278545 0.010745
+v -0.507056 0.275842 0.010758
+v -0.506603 0.273249 0.010798
+v -0.504787 0.280989 -0.011337
+v -0.501408 0.280989 -0.033292
+v -0.497074 0.280989 -0.055079
+v -0.507207 0.278545 0.099494
+v -0.507056 0.275842 0.099481
+v -0.506603 0.273249 0.099442
+v -0.508659 0.280989 0.077328
+v -0.509143 0.280989 0.055120
+v -0.508659 0.280989 0.032911
+v -0.491796 0.278545 0.186896
+v -0.491649 0.275842 0.186857
+v -0.491210 0.273249 0.186739
+v -0.497074 0.280989 0.165318
+v -0.501407 0.280989 0.143531
+v -0.504787 0.280989 0.121576
+v -0.461441 0.278545 0.270293
+v -0.461304 0.275842 0.270229
+v -0.460892 0.273249 0.270037
+v -0.470387 0.280989 0.249960
+v -0.478437 0.280989 0.229257
+v -0.485578 0.280989 0.208222
+v -0.417067 0.278545 0.347153
+v -0.416942 0.275842 0.347066
+v -0.416570 0.273249 0.346805
+v -0.429407 0.280989 0.328682
+v -0.440930 0.280989 0.309691
+v -0.451615 0.280989 0.290216
+v -0.360019 0.278545 0.415139
+v -0.359912 0.275842 0.415032
+v -0.359591 0.273249 0.414710
+v -0.375380 0.280989 0.399092
+v -0.390026 0.280989 0.382390
+v -0.403930 0.280989 0.365066
+v -0.292033 0.278545 0.472186
+v -0.291946 0.275842 0.472062
+v -0.291685 0.273249 0.471690
+v -0.309946 0.280989 0.459050
+v -0.327270 0.280989 0.445145
+v -0.343972 0.280989 0.430499
+v -0.215173 0.278545 0.516561
+v -0.215109 0.275842 0.516424
+v -0.214917 0.273249 0.516012
+v -0.235096 0.280989 0.506735
+v -0.254571 0.280989 0.496050
+v -0.273562 0.280989 0.484526
+v -0.131776 0.278545 0.546915
+v -0.131737 0.275842 0.546769
+v -0.131619 0.273249 0.546329
+v -0.153102 0.280989 0.540698
+v -0.174137 0.280989 0.533557
+v -0.194840 0.280989 0.525506
+v -0.044375 0.278545 0.562326
+v -0.044362 0.275842 0.562175
+v -0.044322 0.273249 0.561722
+v -0.066456 0.280989 0.559907
+v -0.088411 0.280989 0.556527
+v -0.110199 0.280989 0.552194
+v -0.043582 0.273249 0.553267
+v -0.043543 0.275842 0.552814
+v -0.043529 0.278545 0.552663
+v -0.129265 0.278545 0.537546
+v -0.129305 0.275842 0.537692
+v -0.129422 0.273249 0.538131
+v -0.108099 0.280989 0.542724
+v -0.086727 0.280989 0.546974
+v -0.065190 0.280989 0.550290
+v -0.211074 0.278545 0.507770
+v -0.211138 0.275842 0.507907
+v -0.211330 0.273249 0.508319
+v -0.191128 0.280989 0.516545
+v -0.170819 0.280989 0.524442
+v -0.150185 0.280989 0.531447
+v -0.286469 0.278545 0.464240
+v -0.286556 0.275842 0.464364
+v -0.286817 0.273249 0.464737
+v -0.268350 0.280989 0.476345
+v -0.249721 0.280989 0.487649
+v -0.230617 0.280989 0.498131
+v -0.353160 0.278545 0.408280
+v -0.353267 0.275842 0.408387
+v -0.353589 0.273249 0.408709
+v -0.337419 0.280989 0.423348
+v -0.321035 0.280989 0.437715
+v -0.304041 0.280989 0.451354
+v -0.409121 0.278545 0.341589
+v -0.409245 0.275842 0.341676
+v -0.409617 0.273249 0.341937
+v -0.396235 0.280989 0.359161
+v -0.382595 0.280989 0.376155
+v -0.368228 0.280989 0.392538
+v -0.452650 0.278545 0.266194
+v -0.452787 0.275842 0.266258
+v -0.453200 0.273249 0.266450
+v -0.443011 0.280989 0.285737
+v -0.432530 0.280989 0.304841
+v -0.421226 0.280989 0.323470
+v -0.482426 0.278545 0.184385
+v -0.482572 0.275842 0.184425
+v -0.483012 0.273249 0.184542
+v -0.476327 0.280989 0.205305
+v -0.469322 0.280989 0.225939
+v -0.461425 0.280989 0.246248
+v -0.497544 0.278545 0.098649
+v -0.497695 0.275842 0.098662
+v -0.498148 0.273249 0.098702
+v -0.495170 0.280989 0.120310
+v -0.491855 0.280989 0.141847
+v -0.487604 0.280989 0.163219
+v -0.497544 0.278545 0.011590
+v -0.497695 0.275842 0.011577
+v -0.498148 0.273249 0.011537
+v -0.498968 0.280989 0.033334
+v -0.499442 0.280989 0.055120
+v -0.498968 0.280989 0.076905
+v -0.482426 0.278545 -0.074146
+v -0.482573 0.275842 -0.074185
+v -0.483012 0.273249 -0.074303
+v -0.487604 0.280989 -0.052980
+v -0.491855 0.280989 -0.031608
+v -0.495170 0.280989 -0.010071
+v -0.452650 0.278545 -0.155955
+v -0.452788 0.275842 -0.156019
+v -0.453200 0.273249 -0.156211
+v -0.461425 0.280989 -0.136009
+v -0.469322 0.280989 -0.115700
+v -0.476327 0.280989 -0.095066
+v -0.421317 0.280989 -0.213123
+v -0.432553 0.280989 -0.194575
+v -0.443012 0.280989 -0.175498
+v -0.031353 0.017714 0.773225
+v -0.000000 0.017714 0.773908
+v 0.031353 0.017714 0.773225
+v 0.093821 0.017714 0.767759
+v 0.124816 0.017714 0.762988
+v 0.155574 0.017714 0.756870
+v 0.216144 0.017714 0.740641
+v 0.245840 0.017714 0.730559
+v 0.275069 0.017714 0.719194
+v 0.331900 0.017714 0.692693
+v 0.359394 0.017714 0.677608
+v 0.386205 0.017714 0.661340
+v 0.437571 0.017714 0.625373
+v 0.462028 0.017714 0.605743
+v 0.485607 0.017714 0.585067
+v 0.529947 0.017714 0.540727
+v 0.550624 0.017714 0.517148
+v 0.570254 0.017714 0.492691
+v 0.606221 0.017714 0.441325
+v 0.622489 0.017714 0.414514
+v 0.637574 0.017714 0.387019
+v 0.664075 0.017714 0.330188
+v 0.675440 0.017714 0.300960
+v 0.685522 0.017714 0.271264
+v 0.701751 0.017714 0.210694
+v 0.707868 0.017714 0.179936
+v 0.712640 0.017714 0.148940
+v 0.718105 0.017714 0.086473
+v 0.718788 0.017714 0.055120
+v 0.718105 0.017714 0.023766
+v 0.712640 0.017714 -0.038701
+v 0.707868 0.017714 -0.069697
+v 0.701751 0.017714 -0.100455
+v 0.685522 0.017714 -0.161025
+v 0.675440 0.017714 -0.190721
+v 0.664075 0.017714 -0.219949
+v 0.637574 0.017714 -0.276780
+v 0.622522 0.017714 -0.304236
+v 0.606351 0.017714 -0.330931
+v 0.570905 0.017714 -0.381676
+v 0.553142 0.017714 -0.404444
+v 0.537285 0.017714 -0.423886
+v 0.031361 0.098869 0.773406
+v -0.000000 0.098869 0.774090
+v -0.031361 0.098869 0.773406
+v 0.155614 0.098869 0.757048
+v 0.124848 0.098869 0.763167
+v 0.093844 0.098869 0.767940
+v 0.275138 0.098869 0.719362
+v 0.245902 0.098869 0.730730
+v 0.216199 0.098869 0.740815
+v 0.386303 0.098869 0.661494
+v 0.359485 0.098869 0.677766
+v 0.331984 0.098869 0.692855
+v 0.485730 0.098869 0.585201
+v 0.462145 0.098869 0.605883
+v 0.437682 0.098869 0.625518
+v 0.570398 0.098869 0.492801
+v 0.550763 0.098869 0.517265
+v 0.530081 0.098869 0.540850
+v 0.637735 0.098869 0.387103
+v 0.622646 0.098869 0.414605
+v 0.606374 0.098869 0.441423
+v 0.685695 0.098869 0.271318
+v 0.675611 0.098869 0.301022
+v 0.664243 0.098869 0.330258
+v 0.712820 0.098869 0.148964
+v 0.708048 0.098869 0.179967
+v 0.701929 0.098869 0.210734
+v 0.718287 0.098869 0.023758
+v 0.718970 0.098869 0.055120
+v 0.718287 0.098869 0.086481
+v 0.701929 0.098869 -0.100494
+v 0.708048 0.098869 -0.069728
+v 0.712821 0.098869 -0.038725
+v 0.664243 0.098869 -0.220019
+v 0.675611 0.098869 -0.190783
+v 0.685695 0.098869 -0.161079
+v 0.606505 0.098869 -0.331028
+v 0.622679 0.098869 -0.304327
+v 0.637735 0.098869 -0.276864
+v 0.571050 0.098869 -0.381786
+v 0.553280 0.098869 -0.404558
+v 0.537413 0.098869 -0.424000
+v 0.510942 0.035089 -0.454906
+v 0.511092 0.049623 -0.455207
+v 0.511142 0.065989 -0.455308
+v 0.062543 0.099434 0.769986
+v 0.062123 0.099716 0.765191
+v 0.061152 0.099810 0.754096
+v 0.185728 0.099434 0.748265
+v 0.184482 0.099716 0.743616
+v 0.181599 0.099810 0.732858
+v 0.303270 0.099434 0.705484
+v 0.301236 0.099716 0.701122
+v 0.296528 0.099810 0.691027
+v 0.411597 0.099434 0.642941
+v 0.408836 0.099716 0.638998
+v 0.402448 0.099810 0.629875
+v 0.507418 0.099434 0.562538
+v 0.504015 0.099716 0.559134
+v 0.496139 0.099810 0.551259
+v 0.587821 0.099434 0.466717
+v 0.583879 0.099716 0.463956
+v 0.574755 0.099810 0.457567
+v 0.650364 0.099434 0.358389
+v 0.646002 0.099716 0.356355
+v 0.635908 0.099810 0.351648
+v 0.693146 0.099434 0.240847
+v 0.688497 0.099716 0.239602
+v 0.677738 0.099810 0.236719
+v 0.714867 0.099434 0.117662
+v 0.710072 0.099716 0.117243
+v 0.698977 0.099810 0.116272
+v 0.714867 0.099434 -0.007423
+v 0.710072 0.099716 -0.007004
+v 0.698977 0.099810 -0.006033
+v 0.693146 0.099434 -0.130608
+v 0.688497 0.099716 -0.129363
+v 0.677738 0.099810 -0.126480
+v 0.650364 0.099434 -0.248150
+v 0.646002 0.099716 -0.246116
+v 0.635908 0.099810 -0.241409
+v 0.588147 0.099434 -0.356090
+v 0.584202 0.099716 -0.353332
+v 0.575073 0.099810 -0.346950
+v 0.510028 0.098602 -0.453994
+v 0.506708 0.098802 -0.450830
+v 0.498823 0.098869 -0.443008
+v 0.589891 0.031802 -0.357310
+v 0.590273 0.048801 -0.357577
+v 0.590401 0.065989 -0.357667
+v 0.652293 0.031802 -0.249050
+v 0.652716 0.048801 -0.249247
+v 0.652857 0.065989 -0.249313
+v 0.695201 0.031802 -0.131159
+v 0.695653 0.048802 -0.131280
+v 0.695803 0.065989 -0.131320
+v 0.716987 0.031802 -0.007609
+v 0.717452 0.048802 -0.007649
+v 0.717607 0.065989 -0.007663
+v 0.716987 0.031802 0.117848
+v 0.717452 0.048802 0.117888
+v 0.717607 0.065989 0.117902
+v 0.695201 0.031802 0.241398
+v 0.695653 0.048802 0.241519
+v 0.695803 0.065989 0.241559
+v 0.652293 0.031802 0.359289
+v 0.652716 0.048802 0.359486
+v 0.652857 0.065989 0.359552
+v 0.589564 0.031802 0.467937
+v 0.589947 0.048802 0.468205
+v 0.590075 0.065989 0.468294
+v 0.508923 0.031802 0.564042
+v 0.509253 0.048802 0.564373
+v 0.509363 0.065989 0.564483
+v 0.412817 0.031802 0.644684
+v 0.413085 0.048802 0.645067
+v 0.413175 0.065989 0.645194
+v 0.304169 0.031802 0.707412
+v 0.304366 0.048802 0.707836
+v 0.304432 0.065989 0.707977
+v 0.186278 0.031802 0.750321
+v 0.186399 0.048802 0.750772
+v 0.186440 0.065989 0.750922
+v 0.062728 0.031802 0.772106
+v 0.062769 0.048802 0.772571
+v 0.062782 0.065989 0.772727
+v -0.015774 0.098869 0.416394
+v -0.000000 0.098869 0.416737
+v 0.015774 0.098869 0.416394
+v 0.047201 0.098869 0.413644
+v 0.062794 0.098869 0.411244
+v 0.078269 0.098869 0.408166
+v 0.108741 0.098869 0.400001
+v 0.123681 0.098869 0.394929
+v 0.138385 0.098869 0.389211
+v 0.166977 0.098869 0.375879
+v 0.180809 0.098869 0.368290
+v 0.194298 0.098869 0.360105
+v 0.220139 0.098869 0.342011
+v 0.232444 0.098869 0.332135
+v 0.244306 0.098869 0.321733
+v 0.266613 0.098869 0.299426
+v 0.277016 0.098869 0.287563
+v 0.286891 0.098869 0.275259
+v 0.304986 0.098869 0.249417
+v 0.313170 0.098869 0.235929
+v 0.320760 0.098869 0.222096
+v 0.334092 0.098869 0.193505
+v 0.339810 0.098869 0.178800
+v 0.344882 0.098869 0.163860
+v 0.353047 0.098869 0.133388
+v 0.356124 0.098869 0.117914
+v 0.358525 0.098869 0.102320
+v 0.361274 0.098869 0.070893
+v 0.361618 0.098869 0.055119
+v 0.361274 0.098869 0.039346
+v 0.358525 0.098869 0.007919
+v 0.356124 0.098869 -0.007675
+v 0.353047 0.098869 -0.023149
+v 0.344882 0.098869 -0.053621
+v 0.339810 0.098869 -0.068561
+v 0.334092 0.098869 -0.083266
+v 0.320760 0.098869 -0.111857
+v 0.313187 0.098869 -0.125670
+v 0.305052 0.098869 -0.139100
+v 0.287219 0.098869 -0.164630
+v 0.278281 0.098869 -0.176083
+v 0.270301 0.098869 -0.185861
+v 0.257424 0.097709 -0.201845
+v 0.257171 0.095335 -0.201668
+v 0.257086 0.090035 -0.201610
+v 0.266394 0.017714 -0.210903
+v 0.260895 0.018712 -0.205386
+v 0.258423 0.021706 -0.202842
+v 0.509984 0.021706 -0.453950
+v 0.506644 0.018712 -0.450767
+v 0.498743 0.017714 -0.442928
+v 0.484135 0.031802 -0.428746
+v 0.484069 0.048801 -0.428882
+v 0.484047 0.065989 -0.428928
+v 0.404221 0.101233 -0.348590
+v 0.433334 0.099460 -0.377623
+v 0.461285 0.098869 -0.405522
+v 0.531797 0.099810 -0.316693
+v 0.500355 0.100745 -0.294710
+v 0.469138 0.103550 -0.272884
+v 0.484664 0.099434 -0.428192
+v 0.486202 0.099716 -0.426359
+v 0.490075 0.099810 -0.421744
+v 0.518766 0.103550 -0.186785
+v 0.553285 0.100745 -0.202882
+v 0.588054 0.099810 -0.219094
+v 0.574721 0.099810 -0.310793
+v 0.590048 0.099810 -0.285491
+v 0.604316 0.099810 -0.259467
+v 0.552891 0.103550 -0.093027
+v 0.589681 0.100745 -0.102885
+v 0.626737 0.099810 -0.112814
+v 0.629434 0.099810 -0.205601
+v 0.640206 0.099810 -0.177897
+v 0.649762 0.099810 -0.149750
+v 0.570217 0.103550 0.005232
+v 0.608159 0.100745 0.001912
+v 0.646376 0.099810 -0.001431
+v 0.665145 0.099810 -0.092340
+v 0.670943 0.099810 -0.063186
+v 0.675466 0.099810 -0.033807
+v 0.570217 0.103550 0.105007
+v 0.608159 0.100745 0.108327
+v 0.646376 0.099810 0.111670
+v 0.680646 0.099810 0.025402
+v 0.681293 0.099810 0.055120
+v 0.680646 0.099810 0.084837
+v 0.552891 0.103550 0.203266
+v 0.589681 0.100745 0.213124
+v 0.626737 0.099810 0.223053
+v 0.675466 0.099810 0.144046
+v 0.670943 0.099810 0.173425
+v 0.665145 0.099810 0.202579
+v 0.518766 0.103550 0.297024
+v 0.553285 0.100745 0.313121
+v 0.588054 0.099810 0.329333
+v 0.649762 0.099810 0.259989
+v 0.640206 0.099810 0.288136
+v 0.629434 0.099810 0.315840
+v 0.468878 0.103550 0.383432
+v 0.500078 0.100745 0.405278
+v 0.531503 0.099810 0.427282
+v 0.604315 0.099810 0.369706
+v 0.590017 0.099810 0.395766
+v 0.574598 0.099810 0.421179
+v 0.404744 0.103550 0.459864
+v 0.431676 0.100745 0.486796
+v 0.458803 0.099810 0.513923
+v 0.540507 0.099810 0.469865
+v 0.521901 0.099810 0.493046
+v 0.502303 0.099810 0.515395
+v 0.328312 0.103550 0.523998
+v 0.350158 0.100745 0.555197
+v 0.372162 0.099810 0.586623
+v 0.460276 0.099810 0.557422
+v 0.437927 0.099810 0.577021
+v 0.414746 0.099810 0.595627
+v 0.241904 0.103550 0.573885
+v 0.258001 0.100745 0.608405
+v 0.274214 0.099810 0.643173
+v 0.366059 0.099810 0.629717
+v 0.340647 0.099810 0.645137
+v 0.314586 0.099810 0.659435
+v 0.148146 0.103550 0.608010
+v 0.158004 0.100745 0.644800
+v 0.167933 0.099810 0.681856
+v 0.260720 0.099810 0.684553
+v 0.233016 0.099810 0.695326
+v 0.204869 0.099810 0.704881
+v 0.049887 0.103550 0.625336
+v 0.053207 0.100745 0.663279
+v 0.056550 0.099810 0.701496
+v 0.147459 0.099810 0.720264
+v 0.118305 0.099810 0.726062
+v 0.088926 0.099810 0.730585
+v 0.029718 0.099810 0.735765
+v -0.000000 0.099810 0.736413
+v -0.029718 0.099810 0.735765
+v 0.461206 0.017714 -0.405443
+v 0.433843 0.017714 -0.378118
+v 0.406461 0.017714 -0.350774
+v 0.351225 0.108219 -0.296106
+v 0.358251 0.107992 -0.303099
+v 0.365195 0.107311 -0.309948
+v 0.383215 0.031802 -0.327882
+v 0.383151 0.048801 -0.327978
+v 0.383129 0.065989 -0.328010
+v 0.381982 0.107922 -0.325847
+v 0.385238 0.108850 -0.326384
+v 0.388990 0.109160 -0.323384
+v 0.456177 0.109160 -0.235319
+v 0.468343 0.109160 -0.215235
+v 0.479667 0.109160 -0.194580
+v 0.499605 0.109160 -0.151824
+v 0.508155 0.109160 -0.129834
+v 0.515740 0.109160 -0.107493
+v 0.527950 0.109160 -0.061924
+v 0.532552 0.109160 -0.038784
+v 0.536142 0.109160 -0.015465
+v 0.540254 0.109160 0.031531
+v 0.540768 0.109160 0.055120
+v 0.540254 0.109160 0.078708
+v 0.536142 0.109160 0.125704
+v 0.532552 0.109160 0.149023
+v 0.527950 0.109160 0.172163
+v 0.515740 0.109160 0.217732
+v 0.508155 0.109160 0.240073
+v 0.499605 0.109160 0.262063
+v 0.479667 0.109160 0.304818
+v 0.468318 0.109160 0.325503
+v 0.456079 0.109160 0.345674
+v 0.429020 0.109160 0.384318
+v 0.414252 0.109160 0.402718
+v 0.398696 0.109160 0.420457
+v 0.365338 0.109160 0.453816
+v 0.347599 0.109160 0.469371
+v 0.329199 0.109160 0.484140
+v 0.290555 0.109160 0.511199
+v 0.270384 0.109160 0.523438
+v 0.249699 0.109160 0.534787
+v 0.206943 0.109160 0.554724
+v 0.184953 0.109160 0.563275
+v 0.162612 0.109160 0.570859
+v 0.117044 0.109160 0.583069
+v 0.093903 0.109160 0.587671
+v 0.070584 0.109160 0.591261
+v 0.023588 0.109160 0.595373
+v -0.000000 0.109160 0.595887
+v -0.023588 0.109160 0.595373
+v 0.031442 0.097928 0.414499
+v 0.031404 0.095391 0.414067
+v 0.031391 0.090035 0.413923
+v 0.015778 0.017714 0.416488
+v -0.000000 0.017714 0.416831
+v -0.015778 0.017714 0.416488
+v 0.093369 0.097928 0.403579
+v 0.093257 0.095391 0.403161
+v 0.093220 0.090035 0.403021
+v 0.078289 0.017714 0.408258
+v 0.062811 0.017714 0.411336
+v 0.047213 0.017714 0.413737
+v 0.152460 0.097928 0.382072
+v 0.152277 0.095391 0.381679
+v 0.152216 0.090035 0.381548
+v 0.138421 0.017714 0.389298
+v 0.123713 0.017714 0.395017
+v 0.108769 0.017714 0.400091
+v 0.206919 0.097928 0.350630
+v 0.206670 0.095391 0.350275
+v 0.206587 0.090035 0.350157
+v 0.194348 0.017714 0.360185
+v 0.180856 0.017714 0.368371
+v 0.167020 0.017714 0.375962
+v 0.255090 0.097928 0.310210
+v 0.254784 0.095390 0.309903
+v 0.254682 0.090035 0.309801
+v 0.244369 0.017714 0.321802
+v 0.232504 0.017714 0.332207
+v 0.220196 0.017714 0.342085
+v 0.295511 0.097928 0.262038
+v 0.295156 0.095390 0.261790
+v 0.295037 0.090035 0.261707
+v 0.286966 0.017714 0.275316
+v 0.277087 0.017714 0.287623
+v 0.266682 0.017714 0.299489
+v 0.326953 0.097928 0.207580
+v 0.326560 0.095390 0.207397
+v 0.326429 0.090035 0.207336
+v 0.320843 0.017714 0.222140
+v 0.313252 0.017714 0.235975
+v 0.305065 0.017714 0.249467
+v 0.348460 0.097928 0.148489
+v 0.348041 0.095390 0.148377
+v 0.347902 0.090035 0.148339
+v 0.344971 0.017714 0.163888
+v 0.339898 0.017714 0.178832
+v 0.334179 0.017714 0.193541
+v 0.359380 0.097928 0.086561
+v 0.358948 0.095390 0.086523
+v 0.358804 0.090035 0.086511
+v 0.358618 0.017714 0.102332
+v 0.356217 0.017714 0.117930
+v 0.353138 0.017714 0.133408
+v 0.359380 0.097928 0.023678
+v 0.358948 0.095390 0.023716
+v 0.358804 0.090035 0.023728
+v 0.361368 0.017714 0.039342
+v 0.361712 0.017714 0.055120
+v 0.361368 0.017714 0.070897
+v 0.348460 0.097928 -0.038250
+v 0.348041 0.095390 -0.038138
+v 0.347902 0.090035 -0.038100
+v 0.353138 0.017714 -0.023169
+v 0.356217 0.017714 -0.007691
+v 0.358618 0.017714 0.007907
+v 0.326953 0.097928 -0.097341
+v 0.326560 0.095390 -0.097158
+v 0.326429 0.090035 -0.097097
+v 0.334179 0.017714 -0.083302
+v 0.339898 0.017714 -0.068593
+v 0.344971 0.017714 -0.053649
+v 0.295674 0.097928 -0.151605
+v 0.295319 0.095390 -0.151356
+v 0.295201 0.090035 -0.151274
+v 0.305131 0.017714 -0.139150
+v 0.313268 0.017714 -0.125717
+v 0.320843 0.017714 -0.111901
+v 0.270367 0.017714 -0.185920
+v 0.278352 0.017714 -0.176142
+v 0.287293 0.017714 -0.164687
+v 0.062782 0.090035 0.772727
+v 0.062770 0.095391 0.772590
+v 0.062734 0.097928 0.772178
+v -0.031421 0.080642 0.774780
+v -0.000000 0.080642 0.775465
+v 0.031421 0.080642 0.774780
+v 0.186440 0.090035 0.750922
+v 0.186404 0.095391 0.750790
+v 0.186297 0.097928 0.750391
+v 0.094024 0.080642 0.769303
+v 0.125087 0.080642 0.764521
+v 0.155911 0.080642 0.758391
+v 0.304432 0.090035 0.707977
+v 0.304374 0.095391 0.707852
+v 0.304200 0.097928 0.707478
+v 0.216612 0.080642 0.742126
+v 0.246373 0.080642 0.732023
+v 0.275665 0.080642 0.720633
+v 0.413175 0.090035 0.645194
+v 0.413096 0.095391 0.645082
+v 0.412859 0.097928 0.644744
+v 0.332619 0.080642 0.694075
+v 0.360173 0.080642 0.678957
+v 0.387042 0.080642 0.662654
+v 0.509363 0.090035 0.564483
+v 0.509266 0.095391 0.564385
+v 0.508974 0.097928 0.564094
+v 0.438519 0.080642 0.626609
+v 0.463029 0.080642 0.606936
+v 0.486659 0.080642 0.586215
+v 0.590075 0.090035 0.468294
+v 0.589962 0.095391 0.468215
+v 0.589624 0.097928 0.467979
+v 0.531095 0.080642 0.541779
+v 0.551817 0.080642 0.518149
+v 0.571489 0.080642 0.493639
+v 0.652857 0.090035 0.359552
+v 0.652733 0.095390 0.359494
+v 0.652359 0.097928 0.359319
+v 0.607534 0.080642 0.442162
+v 0.623838 0.080642 0.415292
+v 0.638955 0.080642 0.387738
+v 0.695803 0.090035 0.241559
+v 0.695670 0.095390 0.241524
+v 0.695272 0.097928 0.241417
+v 0.665513 0.080642 0.330784
+v 0.676903 0.080642 0.301492
+v 0.687007 0.080642 0.271732
+v 0.717607 0.090035 0.117902
+v 0.717470 0.095390 0.117890
+v 0.717059 0.097928 0.117854
+v 0.703272 0.080642 0.211031
+v 0.709402 0.080642 0.180206
+v 0.714184 0.080642 0.149144
+v 0.717607 0.090035 -0.007663
+v 0.717470 0.095390 -0.007651
+v 0.717059 0.097928 -0.007615
+v 0.719661 0.080642 0.086541
+v 0.720346 0.080642 0.055120
+v 0.719661 0.080642 0.023698
+v 0.695803 0.090035 -0.131320
+v 0.695670 0.095390 -0.131285
+v 0.695272 0.097928 -0.131178
+v 0.714184 0.080642 -0.038904
+v 0.709402 0.080641 -0.069967
+v 0.703272 0.080641 -0.100792
+v 0.652857 0.090035 -0.249313
+v 0.652733 0.095390 -0.249255
+v 0.652359 0.097928 -0.249080
+v 0.687007 0.080641 -0.161493
+v 0.676904 0.080641 -0.191253
+v 0.665514 0.080641 -0.220545
+v 0.590401 0.090035 -0.357667
+v 0.590288 0.095390 -0.357588
+v 0.589950 0.097928 -0.357351
+v 0.638956 0.080641 -0.277500
+v 0.623870 0.080641 -0.305015
+v 0.607665 0.080641 -0.331767
+v 0.511142 0.090035 -0.455308
+v 0.511096 0.095335 -0.455211
+v 0.510957 0.097709 -0.454921
+v 0.572142 0.080641 -0.382622
+v 0.554338 0.080641 -0.405438
+v 0.538441 0.080641 -0.424916
+v 0.484047 0.090035 -0.428928
+v 0.484078 0.095390 -0.428891
+v 0.484170 0.097928 -0.428781
+v 0.509969 0.080641 -0.454564
+v 0.506452 0.080641 -0.451261
+v 0.498506 0.080641 -0.443386
+v 0.383129 0.090035 -0.328010
+v 0.382567 0.095981 -0.327414
+v 0.380879 0.100292 -0.325627
+v 0.460992 0.080641 -0.405872
+v 0.433628 0.080641 -0.378508
+v 0.406244 0.080641 -0.351125
+v 0.257086 0.065989 -0.201610
+v 0.257173 0.049623 -0.201670
+v 0.257432 0.035089 -0.201853
+v 0.368571 0.080641 -0.313451
+v 0.359095 0.080641 -0.303975
+v 0.351225 0.080641 -0.296106
+v 0.295201 0.065989 -0.151274
+v 0.295327 0.048802 -0.151362
+v 0.295705 0.031802 -0.151626
+v 0.256633 0.080641 -0.200799
+v 0.257138 0.080641 -0.199522
+v 0.259083 0.080641 -0.196979
+v 0.326987 0.031802 -0.097357
+v 0.326568 0.048802 -0.097162
+v 0.326429 0.065989 -0.097097
+v 0.303832 0.080641 -0.138324
+v 0.311935 0.080641 -0.124948
+v 0.319478 0.080642 -0.111190
+v 0.348496 0.031802 -0.038260
+v 0.348050 0.048802 -0.038140
+v 0.347902 0.065989 -0.038100
+v 0.332757 0.080642 -0.082713
+v 0.338452 0.080642 -0.068067
+v 0.343504 0.080642 -0.053187
+v 0.359417 0.031802 0.023675
+v 0.358957 0.048802 0.023715
+v 0.358804 0.065989 0.023728
+v 0.351636 0.080642 -0.022836
+v 0.354701 0.080642 -0.007424
+v 0.357092 0.080642 0.008107
+v 0.359417 0.031802 0.086564
+v 0.358957 0.048802 0.086524
+v 0.358804 0.065989 0.086511
+v 0.359831 0.080642 0.039409
+v 0.360173 0.080642 0.055119
+v 0.359831 0.080642 0.070830
+v 0.348496 0.031802 0.148499
+v 0.348050 0.048802 0.148379
+v 0.347902 0.065989 0.148339
+v 0.357092 0.080642 0.102132
+v 0.354701 0.080642 0.117663
+v 0.351636 0.080642 0.133075
+v 0.326987 0.031802 0.207596
+v 0.326568 0.048802 0.207401
+v 0.326429 0.065989 0.207336
+v 0.343503 0.080642 0.163426
+v 0.338452 0.080642 0.178306
+v 0.332757 0.080642 0.192952
+v 0.295542 0.031802 0.262060
+v 0.295163 0.048802 0.261795
+v 0.295037 0.065989 0.261707
+v 0.319478 0.080642 0.221429
+v 0.311919 0.080642 0.235206
+v 0.303767 0.080642 0.248641
+v 0.255117 0.031802 0.310236
+v 0.254790 0.048802 0.309910
+v 0.254682 0.065989 0.309801
+v 0.285745 0.080642 0.274379
+v 0.275908 0.080642 0.286634
+v 0.265548 0.080642 0.298449
+v 0.206940 0.031802 0.350661
+v 0.206676 0.048802 0.350283
+v 0.206587 0.065989 0.350157
+v 0.243330 0.080642 0.320667
+v 0.231515 0.080642 0.331028
+v 0.219260 0.080642 0.340864
+v 0.152476 0.031802 0.382106
+v 0.152281 0.048802 0.381688
+v 0.152216 0.065989 0.381548
+v 0.193521 0.080642 0.358887
+v 0.180086 0.080642 0.367038
+v 0.166309 0.080642 0.374597
+v 0.093379 0.031802 0.403616
+v 0.093260 0.048802 0.403170
+v 0.093220 0.065989 0.403021
+v 0.137832 0.080642 0.387876
+v 0.123186 0.080642 0.393571
+v 0.108306 0.080642 0.398623
+v 0.031445 0.031802 0.414536
+v 0.031405 0.048802 0.414076
+v 0.031391 0.065989 0.413923
+v 0.077956 0.080642 0.406755
+v 0.062543 0.080642 0.409820
+v 0.047012 0.080642 0.412211
+v 0.015711 0.080642 0.414950
+v -0.000000 0.080642 0.415292
+v -0.015711 0.080642 0.414950
+v 0.326587 0.017714 -0.271011
+v 0.308852 0.017714 -0.253301
+v 0.291127 0.017714 -0.235601
+v 0.258015 0.080641 -0.202753
+v 0.260642 0.080641 -0.205487
+v 0.266188 0.080641 -0.211069
+v 0.275875 0.065989 -0.220756
+v 0.275896 0.048801 -0.220738
+v 0.275959 0.031802 -0.220685
+v 0.258400 0.098602 -0.202819
+v 0.260315 0.099393 -0.204818
+v 0.264166 0.101233 -0.208723
+v 0.274468 0.100292 -0.219260
+v 0.275523 0.095981 -0.220382
+v 0.275875 0.090035 -0.220756
+v 0.300412 0.103550 -0.154918
+v 0.298991 0.100651 -0.153924
+v 0.297570 0.099434 -0.152930
+v 0.264697 0.109160 -0.202442
+v 0.263502 0.108850 -0.205841
+v 0.265360 0.107922 -0.209550
+v 0.329048 0.099434 -0.098318
+v 0.330620 0.100651 -0.099051
+v 0.332192 0.103550 -0.099784
+v 0.326400 0.109160 -0.114794
+v 0.318694 0.109160 -0.128849
+v 0.310416 0.109160 -0.142515
+v 0.350694 0.099434 -0.038849
+v 0.352369 0.100651 -0.039297
+v 0.354044 0.103550 -0.039746
+v 0.350947 0.109160 -0.055533
+v 0.345785 0.109160 -0.070736
+v 0.339967 0.109160 -0.085700
+v 0.361683 0.099434 0.023476
+v 0.363411 0.100651 0.023325
+v 0.365138 0.103550 0.023174
+v 0.364830 0.109160 0.007089
+v 0.362387 0.109160 -0.008779
+v 0.359255 0.109160 -0.024526
+v 0.361683 0.099434 0.086763
+v 0.363411 0.100651 0.086914
+v 0.365139 0.103550 0.087065
+v 0.367627 0.109160 0.071171
+v 0.367977 0.109160 0.055119
+v 0.367627 0.109160 0.039068
+v 0.350694 0.099434 0.149088
+v 0.352369 0.100651 0.149536
+v 0.354044 0.103550 0.149985
+v 0.359255 0.109160 0.134764
+v 0.362387 0.109160 0.119018
+v 0.364830 0.109160 0.103150
+v 0.329048 0.099434 0.208557
+v 0.330620 0.100651 0.209290
+v 0.332192 0.103550 0.210023
+v 0.339967 0.109160 0.195938
+v 0.345785 0.109160 0.180975
+v 0.350946 0.109160 0.165772
+v 0.297405 0.099434 0.263365
+v 0.298826 0.100651 0.264360
+v 0.300246 0.103550 0.265354
+v 0.310349 0.109160 0.252834
+v 0.318677 0.109160 0.239108
+v 0.326400 0.109160 0.225033
+v 0.256725 0.099434 0.311845
+v 0.257952 0.100651 0.313071
+v 0.259178 0.103550 0.314298
+v 0.271301 0.109160 0.303722
+v 0.281887 0.109160 0.291651
+v 0.291936 0.109160 0.279130
+v 0.208245 0.099434 0.352525
+v 0.209240 0.100651 0.353945
+v 0.210235 0.103550 0.355366
+v 0.224010 0.109160 0.347056
+v 0.236531 0.109160 0.337006
+v 0.248602 0.109160 0.326421
+v 0.153438 0.099434 0.384168
+v 0.154171 0.100651 0.385740
+v 0.154904 0.103550 0.387311
+v 0.169913 0.109160 0.381519
+v 0.183988 0.109160 0.373797
+v 0.197714 0.109160 0.365469
+v 0.093968 0.099434 0.405813
+v 0.094417 0.100651 0.407488
+v 0.094866 0.103550 0.409163
+v 0.110653 0.109160 0.406066
+v 0.125856 0.109160 0.400905
+v 0.140819 0.109160 0.395086
+v 0.031643 0.099434 0.416802
+v 0.031794 0.100651 0.418530
+v 0.031945 0.103550 0.420258
+v 0.048031 0.109160 0.419949
+v 0.063898 0.109160 0.417506
+v 0.079645 0.109160 0.414374
+v -0.016051 0.109160 0.422747
+v -0.000000 0.109160 0.423096
+v 0.016051 0.109160 0.422747
+v 0.366424 0.117272 -0.310844
+v 0.363580 0.132363 -0.307773
+v 0.366115 0.152720 -0.309714
+v 0.427665 0.118510 -0.243888
+v 0.422164 0.132350 -0.239998
+v 0.426397 0.151431 -0.242825
+v 0.382924 0.301906 -0.317649
+v 0.382622 0.303391 -0.321318
+v 0.382332 0.303713 -0.322767
+v 0.277069 0.146525 -0.221583
+v 0.276613 0.130814 -0.221137
+v 0.275244 0.117272 -0.219798
+v 0.368295 0.292554 -0.311303
+v 0.359196 0.286563 -0.303235
+v 0.351449 0.282947 -0.295839
+v 0.302781 0.146145 -0.156574
+v 0.302663 0.131029 -0.156491
+v 0.302308 0.118510 -0.156243
+v 0.280350 0.252601 -0.217673
+v 0.279167 0.252982 -0.221324
+v 0.281385 0.254124 -0.225403
+v 0.471389 0.151431 -0.164693
+v 0.466795 0.132350 -0.162550
+v 0.472906 0.118510 -0.165400
+v 0.452751 0.303424 -0.232967
+v 0.464745 0.303424 -0.213117
+v 0.475955 0.303424 -0.192647
+v 0.334288 0.118510 -0.100761
+v 0.334681 0.131029 -0.100945
+v 0.334812 0.146145 -0.101006
+v 0.345702 0.252601 -0.124842
+v 0.337541 0.252601 -0.139729
+v 0.328773 0.252601 -0.154203
+v 0.502398 0.151431 -0.079498
+v 0.497501 0.132350 -0.078186
+v 0.504015 0.118510 -0.079931
+v 0.495738 0.303424 -0.150222
+v 0.504223 0.303424 -0.128403
+v 0.511749 0.303424 -0.106234
+v 0.356278 0.118510 -0.040345
+v 0.356696 0.131029 -0.040457
+v 0.356836 0.146145 -0.040494
+v 0.371700 0.252601 -0.062077
+v 0.366234 0.252601 -0.078179
+v 0.360071 0.252601 -0.094027
+v 0.518141 0.151431 0.009788
+v 0.513091 0.132350 0.010230
+v 0.519809 0.118510 0.009642
+v 0.523864 0.303424 -0.061019
+v 0.528431 0.303424 -0.038057
+v 0.531993 0.303424 -0.014919
+v 0.367442 0.118510 0.022972
+v 0.367874 0.131029 0.022935
+v 0.368018 0.146145 0.022922
+v 0.386404 0.252601 0.004248
+v 0.383817 0.252602 -0.012558
+v 0.380500 0.252601 -0.029235
+v 0.518141 0.151431 0.100451
+v 0.513091 0.132350 0.100009
+v 0.519809 0.118510 0.100597
+v 0.536073 0.303424 0.031714
+v 0.536583 0.303424 0.055119
+v 0.536073 0.303424 0.078525
+v 0.367442 0.118510 0.087266
+v 0.367874 0.131029 0.087304
+v 0.368018 0.146145 0.087317
+v 0.389368 0.252601 0.072120
+v 0.389738 0.252602 0.055119
+v 0.389368 0.252601 0.038119
+v 0.502398 0.151431 0.189737
+v 0.497501 0.132350 0.188424
+v 0.504015 0.118510 0.190170
+v 0.531993 0.303424 0.125158
+v 0.528431 0.303424 0.148296
+v 0.523864 0.303424 0.171257
+v 0.356277 0.118510 0.150584
+v 0.356696 0.131029 0.150696
+v 0.356836 0.146145 0.150733
+v 0.380500 0.252602 0.139474
+v 0.383817 0.252602 0.122797
+v 0.386404 0.252602 0.105990
+v 0.471389 0.151431 0.274932
+v 0.466795 0.132350 0.272789
+v 0.472906 0.118510 0.275639
+v 0.511749 0.303424 0.216473
+v 0.504223 0.303424 0.238642
+v 0.495738 0.303424 0.260461
+v 0.334288 0.118510 0.211000
+v 0.334681 0.131029 0.211184
+v 0.334812 0.146145 0.211245
+v 0.360071 0.252602 0.204266
+v 0.366234 0.252602 0.188418
+v 0.371700 0.252602 0.172316
+v 0.426058 0.151431 0.353448
+v 0.421905 0.132350 0.350541
+v 0.427429 0.118510 0.354409
+v 0.475955 0.303424 0.302886
+v 0.464694 0.303424 0.323411
+v 0.452550 0.303424 0.343426
+v 0.302141 0.118510 0.266681
+v 0.302496 0.131029 0.266929
+v 0.302614 0.146145 0.267012
+v 0.328702 0.252602 0.264526
+v 0.337523 0.252602 0.249988
+v 0.345702 0.252602 0.235081
+v 0.367781 0.151431 0.422900
+v 0.364196 0.132350 0.419316
+v 0.368964 0.118510 0.424084
+v 0.425700 0.303424 0.381771
+v 0.411046 0.303424 0.400028
+v 0.395611 0.303424 0.417630
+v 0.260813 0.118510 0.315933
+v 0.261120 0.131029 0.316239
+v 0.261222 0.146145 0.316341
+v 0.287345 0.252602 0.318423
+v 0.298557 0.252602 0.305638
+v 0.309200 0.252602 0.292377
+v 0.298329 0.151431 0.481177
+v 0.295421 0.132350 0.477024
+v 0.299289 0.118510 0.482548
+v 0.362511 0.303424 0.450730
+v 0.344909 0.303424 0.466166
+v 0.326651 0.303424 0.480820
+v 0.211561 0.118510 0.357260
+v 0.211810 0.131029 0.357615
+v 0.211893 0.146145 0.357734
+v 0.237258 0.252602 0.364320
+v 0.250519 0.252602 0.353676
+v 0.263303 0.252602 0.342465
+v 0.219812 0.151431 0.526509
+v 0.217670 0.132350 0.521914
+v 0.220520 0.118510 0.528026
+v 0.288306 0.303424 0.507669
+v 0.268291 0.303424 0.519814
+v 0.247766 0.303424 0.531075
+v 0.155881 0.118510 0.389407
+v 0.156064 0.131029 0.389800
+v 0.156125 0.146145 0.389931
+v 0.179961 0.252602 0.400822
+v 0.194869 0.252602 0.392642
+v 0.209406 0.252602 0.383821
+v 0.134617 0.151431 0.557517
+v 0.133305 0.132350 0.552620
+v 0.135050 0.118510 0.559134
+v 0.205342 0.303424 0.550858
+v 0.183522 0.303424 0.559342
+v 0.161354 0.303424 0.566868
+v 0.095464 0.118510 0.411397
+v 0.095576 0.131029 0.411816
+v 0.095614 0.146145 0.411955
+v 0.117196 0.252602 0.426820
+v 0.133298 0.252602 0.421353
+v 0.149146 0.252602 0.415191
+v 0.045331 0.151431 0.573261
+v 0.044890 0.132350 0.568210
+v 0.045477 0.118510 0.574928
+v 0.116138 0.303424 0.578984
+v 0.093176 0.303424 0.583550
+v 0.070038 0.303424 0.587112
+v 0.032147 0.118510 0.422561
+v 0.032185 0.131029 0.422993
+v 0.032197 0.146145 0.423137
+v 0.050871 0.252602 0.441524
+v 0.067677 0.252602 0.438936
+v 0.084355 0.252602 0.435620
+v 0.023405 0.303424 0.591192
+v -0.000000 0.303424 0.591702
+v -0.023405 0.303424 0.591192
+v -0.017000 0.252602 0.444487
+v -0.000000 0.252602 0.444857
+v 0.017000 0.252602 0.444487
+v 0.032197 0.217082 0.423137
+v 0.032197 0.200351 0.423137
+v 0.032197 0.181889 0.423137
+v -0.016114 0.163289 0.424191
+v -0.000000 0.163289 0.424542
+v 0.016114 0.163289 0.424191
+v 0.095614 0.217082 0.411955
+v 0.095614 0.200351 0.411955
+v 0.095614 0.181889 0.411955
+v 0.048219 0.163289 0.421382
+v 0.064149 0.163289 0.418929
+v 0.079958 0.163289 0.415785
+v 0.156125 0.217082 0.389931
+v 0.156125 0.200351 0.389931
+v 0.156125 0.181889 0.389931
+v 0.111087 0.163289 0.407444
+v 0.126350 0.163289 0.402263
+v 0.141372 0.163289 0.396422
+v 0.211893 0.217082 0.357734
+v 0.211893 0.200351 0.357734
+v 0.211893 0.181889 0.357734
+v 0.170580 0.163289 0.382802
+v 0.184711 0.163289 0.375049
+v 0.198491 0.163289 0.366687
+v 0.261222 0.217082 0.316341
+v 0.261222 0.200351 0.316341
+v 0.261222 0.181889 0.316341
+v 0.224890 0.163289 0.348202
+v 0.237460 0.163289 0.338113
+v 0.249578 0.163289 0.327487
+v 0.302614 0.217082 0.267012
+v 0.302614 0.200351 0.267012
+v 0.302614 0.181889 0.267012
+v 0.272367 0.163289 0.304698
+v 0.282994 0.163289 0.292580
+v 0.293083 0.163289 0.280010
+v 0.334812 0.217082 0.211245
+v 0.334812 0.200351 0.211245
+v 0.334812 0.181889 0.211245
+v 0.311568 0.163289 0.253610
+v 0.319929 0.163289 0.239831
+v 0.327682 0.163289 0.225700
+v 0.356836 0.217081 0.150733
+v 0.356836 0.200351 0.150733
+v 0.356836 0.181889 0.150733
+v 0.341302 0.163289 0.196492
+v 0.347143 0.163289 0.181469
+v 0.352325 0.163289 0.166207
+v 0.368018 0.217081 0.087317
+v 0.368018 0.200351 0.087317
+v 0.368018 0.181889 0.087317
+v 0.360666 0.163289 0.135077
+v 0.363810 0.163289 0.119269
+v 0.366262 0.163289 0.103339
+v 0.368018 0.217081 0.022922
+v 0.368018 0.200351 0.022922
+v 0.368018 0.181889 0.022922
+v 0.369071 0.163289 0.071234
+v 0.369422 0.163289 0.055119
+v 0.369071 0.163289 0.039005
+v 0.356836 0.217081 -0.040494
+v 0.356836 0.200351 -0.040494
+v 0.356836 0.181889 -0.040494
+v 0.366262 0.163289 0.006900
+v 0.363810 0.163289 -0.009030
+v 0.360666 0.163289 -0.024838
+v 0.334812 0.217081 -0.101006
+v 0.334812 0.200351 -0.101006
+v 0.334812 0.181889 -0.101006
+v 0.352325 0.163289 -0.055968
+v 0.347143 0.163289 -0.071230
+v 0.341302 0.163289 -0.086253
+v 0.302781 0.217081 -0.156574
+v 0.302781 0.200351 -0.156574
+v 0.302781 0.181889 -0.156574
+v 0.327682 0.163289 -0.115461
+v 0.319946 0.163289 -0.129572
+v 0.311635 0.163289 -0.143292
+v 0.277069 0.221254 -0.221583
+v 0.277069 0.203385 -0.221583
+v 0.277069 0.183785 -0.221583
+v 0.293418 0.163289 -0.169372
+v 0.284287 0.163289 -0.181073
+v 0.276134 0.163289 -0.191062
+v 0.381862 0.264465 -0.323331
+v 0.381333 0.241141 -0.322862
+v 0.379746 0.214425 -0.321457
+v 0.291403 0.165185 -0.236137
+v 0.308781 0.166323 -0.253625
+v 0.326408 0.167461 -0.271289
+v 0.380835 0.178902 -0.321690
+v 0.383944 0.177103 -0.321895
+v 0.387552 0.176503 -0.318884
+v 0.452751 0.176503 -0.232967
+v 0.464745 0.176503 -0.213117
+v 0.475955 0.176503 -0.192647
+v 0.495739 0.176503 -0.150222
+v 0.504223 0.176503 -0.128403
+v 0.511749 0.176503 -0.106234
+v 0.523864 0.176503 -0.061019
+v 0.528431 0.176503 -0.038057
+v 0.531993 0.176503 -0.014919
+v 0.536073 0.176503 0.031714
+v 0.536583 0.176503 0.055119
+v 0.536073 0.176503 0.078525
+v 0.531993 0.176503 0.125158
+v 0.528431 0.176503 0.148296
+v 0.523864 0.176503 0.171257
+v 0.511749 0.176503 0.216473
+v 0.504223 0.176503 0.238642
+v 0.495738 0.176503 0.260461
+v 0.475955 0.176503 0.302886
+v 0.464694 0.176503 0.323411
+v 0.452550 0.176503 0.343426
+v 0.425700 0.176503 0.381771
+v 0.411046 0.176503 0.400028
+v 0.395611 0.176503 0.417630
+v 0.362510 0.176503 0.450730
+v 0.344909 0.176503 0.466166
+v 0.326651 0.176503 0.480820
+v 0.288306 0.176503 0.507669
+v 0.268291 0.176503 0.519814
+v 0.247766 0.176503 0.531075
+v 0.205342 0.176503 0.550858
+v 0.183522 0.176503 0.559342
+v 0.161354 0.176503 0.566868
+v 0.116138 0.176503 0.578984
+v 0.093176 0.176503 0.583550
+v 0.070038 0.176503 0.587112
+v 0.023405 0.176503 0.591192
+v -0.000000 0.176503 0.591702
+v -0.023405 0.176503 0.591192
+v 0.462797 0.208316 -0.267568
+v 0.490191 0.242884 -0.286190
+v 0.517773 0.276222 -0.304940
+v 0.517773 0.365986 -0.304940
+v 0.490191 0.343591 -0.286190
+v 0.462797 0.321657 -0.267568
+v 0.568546 0.367956 -0.339453
+v 0.568829 0.381816 -0.339645
+v 0.568923 0.395116 -0.339709
+v 0.401806 0.221569 -0.339755
+v 0.429274 0.257108 -0.362781
+v 0.455629 0.289755 -0.384879
+v 0.507390 0.355320 -0.418053
+v 0.503986 0.355862 -0.422092
+v 0.502513 0.357491 -0.423510
+v 0.455629 0.365493 -0.384879
+v 0.429810 0.343098 -0.363212
+v 0.403950 0.321273 -0.341477
+v 0.502259 0.367749 -0.423821
+v 0.502389 0.379509 -0.424047
+v 0.502432 0.392151 -0.424123
+v 0.507390 0.415657 -0.418053
+v 0.503986 0.415427 -0.422092
+v 0.502513 0.414737 -0.423510
+v 0.571278 0.276222 -0.211272
+v 0.541126 0.242885 -0.197212
+v 0.511180 0.208316 -0.183248
+v 0.511180 0.321657 -0.183248
+v 0.541126 0.343591 -0.197212
+v 0.571278 0.365986 -0.211272
+v 0.627193 0.395116 -0.237346
+v 0.627090 0.381816 -0.237298
+v 0.626781 0.367956 -0.237154
+v 0.612830 0.355320 -0.263900
+v 0.598534 0.355320 -0.290118
+v 0.583507 0.355320 -0.315261
+v 0.612830 0.415657 -0.263900
+v 0.598534 0.415657 -0.290118
+v 0.583507 0.415657 -0.315261
+v 0.608858 0.276222 -0.108023
+v 0.576722 0.242885 -0.099413
+v 0.544806 0.208316 -0.090861
+v 0.544806 0.321657 -0.090861
+v 0.576722 0.343591 -0.099413
+v 0.608858 0.365986 -0.108024
+v 0.668451 0.395116 -0.123991
+v 0.668341 0.381816 -0.123962
+v 0.668012 0.367956 -0.123874
+v 0.658917 0.355320 -0.152636
+v 0.649227 0.355320 -0.181180
+v 0.638303 0.355320 -0.209274
+v 0.658917 0.415657 -0.152636
+v 0.649227 0.415657 -0.181180
+v 0.638303 0.415657 -0.209274
+v 0.627937 0.276222 0.000182
+v 0.594795 0.242885 0.003082
+v 0.561879 0.208316 0.005961
+v 0.561879 0.321657 0.005961
+v 0.594795 0.343591 0.003082
+v 0.627937 0.365986 0.000182
+v 0.689398 0.395116 -0.005195
+v 0.689285 0.381816 -0.005185
+v 0.688945 0.367956 -0.005155
+v 0.684983 0.355320 -0.035060
+v 0.680397 0.355320 -0.064853
+v 0.674517 0.355320 -0.094417
+v 0.684983 0.415657 -0.035060
+v 0.680397 0.415657 -0.064853
+v 0.674517 0.415657 -0.094417
+v 0.627937 0.276222 0.110057
+v 0.594795 0.242885 0.107157
+v 0.561879 0.208316 0.104277
+v 0.561879 0.321657 0.104277
+v 0.594795 0.343591 0.107157
+v 0.627937 0.365986 0.110057
+v 0.689398 0.395116 0.115434
+v 0.689285 0.381817 0.115424
+v 0.688945 0.367956 0.115394
+v 0.690236 0.355320 0.085256
+v 0.690893 0.355320 0.055119
+v 0.690236 0.355320 0.024983
+v 0.690236 0.415657 0.085256
+v 0.690893 0.415657 0.055119
+v 0.690236 0.415657 0.024983
+v 0.608858 0.276222 0.218262
+v 0.576722 0.242885 0.209652
+v 0.544806 0.208316 0.201100
+v 0.544806 0.321657 0.201100
+v 0.576722 0.343591 0.209652
+v 0.608858 0.365986 0.218262
+v 0.668451 0.395116 0.234230
+v 0.668341 0.381817 0.234201
+v 0.668012 0.367956 0.234113
+v 0.674517 0.355320 0.204656
+v 0.680397 0.355320 0.175092
+v 0.684983 0.355320 0.145299
+v 0.674517 0.415657 0.204656
+v 0.680397 0.415657 0.175092
+v 0.684983 0.415657 0.145299
+v 0.571278 0.276222 0.321511
+v 0.541126 0.242885 0.307451
+v 0.511180 0.208316 0.293487
+v 0.511180 0.321657 0.293487
+v 0.541126 0.343591 0.307451
+v 0.571278 0.365986 0.321511
+v 0.627193 0.395116 0.347584
+v 0.627090 0.381817 0.347537
+v 0.626781 0.367956 0.347392
+v 0.638303 0.355320 0.319513
+v 0.649227 0.355320 0.291419
+v 0.658917 0.355320 0.262875
+v 0.638303 0.415657 0.319513
+v 0.649227 0.415657 0.291419
+v 0.658917 0.415657 0.262875
+v 0.516341 0.276222 0.416665
+v 0.489088 0.242885 0.397583
+v 0.462022 0.208316 0.378631
+v 0.462022 0.321657 0.378631
+v 0.489089 0.343591 0.397583
+v 0.516341 0.365986 0.416665
+v 0.566879 0.395116 0.452052
+v 0.566786 0.381817 0.451987
+v 0.566506 0.367956 0.451792
+v 0.582694 0.355320 0.426337
+v 0.598331 0.355320 0.400566
+v 0.612830 0.355320 0.374139
+v 0.582694 0.415657 0.426337
+v 0.598331 0.415657 0.400566
+v 0.612830 0.415657 0.374139
+v 0.445715 0.276222 0.500834
+v 0.422190 0.242885 0.477310
+v 0.398826 0.208316 0.453945
+v 0.398826 0.321657 0.453945
+v 0.422190 0.343591 0.477310
+v 0.445715 0.365986 0.500834
+v 0.489340 0.395116 0.544459
+v 0.489259 0.381817 0.544379
+v 0.489018 0.367956 0.544138
+v 0.509380 0.355320 0.521881
+v 0.529254 0.355320 0.499217
+v 0.548123 0.355320 0.475709
+v 0.509380 0.415657 0.521881
+v 0.529255 0.415657 0.499217
+v 0.548123 0.415657 0.475709
+v 0.361546 0.276222 0.571460
+v 0.342463 0.242885 0.544208
+v 0.323511 0.208316 0.517142
+v 0.323511 0.321657 0.517142
+v 0.342463 0.343591 0.544208
+v 0.361546 0.365986 0.571460
+v 0.396933 0.395116 0.621998
+v 0.396867 0.381817 0.621905
+v 0.396672 0.367956 0.621626
+v 0.420589 0.355320 0.603242
+v 0.444097 0.355320 0.584374
+v 0.466761 0.355320 0.564500
+v 0.420589 0.415657 0.603242
+v 0.444097 0.415657 0.584374
+v 0.466761 0.415657 0.564500
+v 0.266391 0.276222 0.626398
+v 0.252331 0.242885 0.596246
+v 0.238367 0.208316 0.566300
+v 0.238367 0.321657 0.566300
+v 0.252331 0.343591 0.596246
+v 0.266391 0.365986 0.626398
+v 0.292465 0.395116 0.682313
+v 0.292417 0.381817 0.682210
+v 0.292273 0.367956 0.681901
+v 0.319019 0.355320 0.667950
+v 0.345446 0.355320 0.653450
+v 0.371217 0.355320 0.637813
+v 0.319019 0.415657 0.667950
+v 0.345446 0.415657 0.653450
+v 0.371217 0.415657 0.637813
+v 0.163143 0.276222 0.663977
+v 0.154532 0.242885 0.631842
+v 0.145980 0.208316 0.599926
+v 0.145980 0.321657 0.599926
+v 0.154532 0.343591 0.631842
+v 0.163143 0.365986 0.663977
+v 0.179111 0.395116 0.723570
+v 0.179081 0.381817 0.723460
+v 0.178993 0.367956 0.723131
+v 0.207755 0.355320 0.714037
+v 0.236299 0.355320 0.704346
+v 0.264393 0.355320 0.693422
+v 0.207755 0.415657 0.714036
+v 0.236299 0.415657 0.704346
+v 0.264393 0.415657 0.693422
+v 0.054937 0.276222 0.683057
+v 0.052038 0.242885 0.649914
+v 0.049158 0.208316 0.616998
+v 0.049158 0.321657 0.616998
+v 0.052038 0.343591 0.649914
+v 0.054937 0.365986 0.683057
+v 0.060314 0.395116 0.744517
+v 0.060304 0.381817 0.744404
+v 0.060275 0.367956 0.744065
+v 0.090179 0.355320 0.740102
+v 0.119972 0.355320 0.735516
+v 0.149537 0.355320 0.729636
+v 0.090179 0.415657 0.740102
+v 0.119972 0.415657 0.735516
+v 0.149537 0.415657 0.729636
+v -0.030136 0.355320 0.745356
+v -0.000000 0.355320 0.746012
+v 0.030136 0.355320 0.745356
+v -0.030136 0.415657 0.745356
+v -0.000000 0.415657 0.746012
+v 0.030136 0.415657 0.745355
+v 0.060116 0.413040 0.742254
+v 0.059758 0.407946 0.738163
+v 0.058922 0.399193 0.728604
+v -0.028721 0.385600 0.712949
+v -0.000000 0.385600 0.713575
+v 0.028721 0.385600 0.712949
+v 0.178523 0.413040 0.721376
+v 0.177460 0.407946 0.717409
+v 0.174976 0.399193 0.708141
+v 0.085946 0.385600 0.707942
+v 0.114339 0.385600 0.703571
+v 0.142516 0.385600 0.697967
+v 0.291505 0.413040 0.680254
+v 0.289769 0.407946 0.676532
+v 0.285714 0.399193 0.667836
+v 0.198001 0.385600 0.683100
+v 0.225205 0.385600 0.673865
+v 0.251980 0.385600 0.663454
+v 0.395630 0.413040 0.620137
+v 0.393274 0.407946 0.616773
+v 0.387771 0.399193 0.608913
+v 0.304041 0.385600 0.639177
+v 0.329227 0.385600 0.625358
+v 0.353788 0.385600 0.610456
+v 0.487734 0.413040 0.542853
+v 0.484830 0.407946 0.539949
+v 0.478045 0.399193 0.533164
+v 0.400842 0.385600 0.577508
+v 0.423247 0.385600 0.559525
+v 0.444847 0.385600 0.540584
+v 0.565018 0.413040 0.450749
+v 0.561654 0.407946 0.448394
+v 0.553794 0.399193 0.442890
+v 0.485465 0.385600 0.499966
+v 0.504406 0.385600 0.478366
+v 0.522389 0.385600 0.455962
+v 0.625134 0.413040 0.346625
+v 0.621412 0.407946 0.344889
+v 0.612716 0.399193 0.340834
+v 0.555336 0.385600 0.408908
+v 0.570239 0.385600 0.384347
+v 0.584058 0.385600 0.359161
+v 0.666257 0.413040 0.233642
+v 0.662290 0.407946 0.232579
+v 0.653021 0.399193 0.230096
+v 0.608334 0.385600 0.307100
+v 0.618746 0.385600 0.280324
+v 0.627981 0.385600 0.253121
+v 0.687135 0.413040 0.115236
+v 0.683044 0.407946 0.114878
+v 0.673485 0.399193 0.114042
+v 0.642848 0.385600 0.197636
+v 0.648452 0.385600 0.169459
+v 0.652823 0.385600 0.141065
+v 0.687135 0.413040 -0.004997
+v 0.683044 0.407946 -0.004639
+v 0.673485 0.399193 -0.003803
+v 0.657830 0.385600 0.083841
+v 0.658455 0.385600 0.055119
+v 0.657830 0.385600 0.026398
+v 0.666257 0.413040 -0.123403
+v 0.662290 0.407946 -0.122341
+v 0.653022 0.399193 -0.119857
+v 0.652823 0.385600 -0.030826
+v 0.648452 0.385600 -0.059220
+v 0.642848 0.385600 -0.087397
+v 0.625135 0.413040 -0.236386
+v 0.621412 0.407946 -0.234650
+v 0.612716 0.399193 -0.230595
+v 0.627981 0.385600 -0.142882
+v 0.618746 0.385600 -0.170086
+v 0.608334 0.385600 -0.196861
+v 0.567039 0.413040 -0.338429
+v 0.563635 0.407946 -0.336115
+v 0.555680 0.399193 -0.330707
+v 0.584058 0.385600 -0.248922
+v 0.570410 0.385600 -0.273931
+v 0.556021 0.385600 -0.297962
+v 0.501426 0.412026 -0.423122
+v 0.525811 0.385600 -0.342187
+v 0.511236 0.385600 -0.361343
+v 0.498411 0.385600 -0.377441
+v 0.501426 0.354531 -0.423122
+v 0.498348 0.346538 -0.420659
+v 0.490965 0.334706 -0.414508
+v 0.477207 0.384707 -0.403293
+v 0.477128 0.382947 -0.403389
+v 0.477102 0.378736 -0.403420
+v 0.555680 0.323258 -0.330707
+v 0.563635 0.336024 -0.336115
+v 0.567039 0.345694 -0.338429
+v 0.477624 0.309242 -0.402784
+v 0.478924 0.305567 -0.401199
+v 0.482199 0.304342 -0.397207
+v 0.625135 0.345694 -0.236386
+v 0.621412 0.336024 -0.234650
+v 0.612716 0.323258 -0.230595
+v 0.556021 0.304342 -0.297962
+v 0.570410 0.304342 -0.273931
+v 0.584058 0.304342 -0.248922
+v 0.666257 0.345694 -0.123403
+v 0.662290 0.336024 -0.122340
+v 0.653022 0.323258 -0.119857
+v 0.608334 0.304342 -0.196861
+v 0.618746 0.304342 -0.170086
+v 0.627981 0.304342 -0.142882
+v 0.687135 0.345694 -0.004997
+v 0.683044 0.336024 -0.004639
+v 0.673485 0.323258 -0.003803
+v 0.642848 0.304342 -0.087397
+v 0.648452 0.304342 -0.059220
+v 0.652823 0.304342 -0.030826
+v 0.687135 0.345694 0.115236
+v 0.683044 0.336024 0.114878
+v 0.673485 0.323258 0.114042
+v 0.657830 0.304342 0.026398
+v 0.658455 0.304342 0.055119
+v 0.657830 0.304342 0.083841
+v 0.666257 0.345694 0.233642
+v 0.662290 0.336025 0.232579
+v 0.653021 0.323258 0.230096
+v 0.652823 0.304342 0.141065
+v 0.648452 0.304342 0.169459
+v 0.642848 0.304342 0.197636
+v 0.625134 0.345694 0.346625
+v 0.621412 0.336025 0.344889
+v 0.612716 0.323258 0.340834
+v 0.627981 0.304342 0.253121
+v 0.618746 0.304342 0.280325
+v 0.608334 0.304342 0.307100
+v 0.565018 0.345694 0.450749
+v 0.561654 0.336025 0.448394
+v 0.553794 0.323258 0.442890
+v 0.584058 0.304342 0.359161
+v 0.570239 0.304342 0.384347
+v 0.555336 0.304342 0.408908
+v 0.487734 0.345694 0.542853
+v 0.484830 0.336025 0.539949
+v 0.478045 0.323258 0.533164
+v 0.522388 0.304342 0.455962
+v 0.504406 0.304342 0.478366
+v 0.485465 0.304342 0.499966
+v 0.395630 0.345694 0.620137
+v 0.393274 0.336025 0.616773
+v 0.387771 0.323258 0.608913
+v 0.444847 0.304342 0.540584
+v 0.423247 0.304342 0.559525
+v 0.400842 0.304342 0.577508
+v 0.291505 0.345694 0.680254
+v 0.289769 0.336025 0.676532
+v 0.285714 0.323258 0.667836
+v 0.353788 0.304342 0.610456
+v 0.329227 0.304342 0.625358
+v 0.304041 0.304342 0.639177
+v 0.178523 0.345694 0.721376
+v 0.177460 0.336025 0.717409
+v 0.174976 0.323258 0.708141
+v 0.251980 0.304342 0.663454
+v 0.225205 0.304342 0.673865
+v 0.198001 0.304342 0.683100
+v 0.060116 0.345694 0.742254
+v 0.059758 0.336025 0.738163
+v 0.058922 0.323258 0.728604
+v 0.142516 0.304342 0.697968
+v 0.114339 0.304342 0.703571
+v 0.085946 0.304342 0.707942
+v 0.028721 0.304342 0.712949
+v -0.000000 0.304342 0.713575
+v -0.028721 0.304342 0.712949
+v 0.257603 0.021706 -0.201682
+v 0.258184 0.018712 -0.200536
+v 0.260170 0.017714 -0.198036
+v 0.286071 0.080641 -0.163751
+v 0.277169 0.080641 -0.175159
+v 0.269220 0.080641 -0.184898
+v 0.263395 0.031802 -0.192790
+v 0.263061 0.048801 -0.192476
+v 0.262950 0.065989 -0.192371
+v 0.260123 0.098869 -0.197991
+v 0.258149 0.098802 -0.200502
+v 0.257580 0.098602 -0.201659
+v 0.262950 0.090035 -0.192371
+v 0.263055 0.095390 -0.192470
+v 0.263372 0.097928 -0.192768
+v 0.292270 0.109160 -0.168494
+v 0.283175 0.109160 -0.180149
+v 0.275054 0.109160 -0.190099
+v 0.265060 0.099434 -0.194357
+v 0.266326 0.100651 -0.195549
+v 0.267592 0.103550 -0.196741
+v 0.265737 0.163289 -0.203453
+v 0.265080 0.163384 -0.207400
+v 0.268576 0.163668 -0.212723
+v 0.269281 0.118510 -0.198330
+v 0.269597 0.131028 -0.198628
+v 0.269703 0.146145 -0.198727
+v 0.309553 0.252601 -0.181718
+v 0.299921 0.252601 -0.194062
+v 0.291320 0.252601 -0.204600
+v 0.269703 0.181889 -0.198727
+v 0.269703 0.200351 -0.198727
+v 0.269703 0.217081 -0.198727
+v 0.398749 0.301549 -0.300242
+v 0.412886 0.302955 -0.286849
+v 0.426706 0.303424 -0.270433
+v 0.299366 0.259087 -0.226646
+v 0.317403 0.266709 -0.244110
+v 0.335918 0.274453 -0.262998
+v 0.482199 0.385600 -0.397207
+v 0.478924 0.385555 -0.401199
+v 0.411102 0.319810 -0.328571
+v 0.439539 0.343129 -0.350371
+v 0.466408 0.365986 -0.371788
+v 0.552188 0.415657 -0.361285
+v 0.537181 0.415657 -0.381099
+v 0.524011 0.415657 -0.397704
+v 0.502135 0.399193 -0.400858
+v 0.509633 0.407946 -0.406958
+v 0.512842 0.413040 -0.409569
+v 0.552188 0.355320 -0.361285
+v 0.537181 0.355320 -0.381099
+v 0.524011 0.355320 -0.397704
+v 0.514262 0.416977 -0.410724
+v 0.514528 0.416291 -0.410941
+v 0.514617 0.412892 -0.411013
+v 0.525811 0.304342 -0.342187
+v 0.511236 0.304342 -0.361343
+v 0.498411 0.304342 -0.377441
+v 0.512842 0.345694 -0.409569
+v 0.509633 0.336024 -0.406958
+v 0.502135 0.323258 -0.400858
+v 0.426706 0.176503 -0.270433
+v 0.413756 0.176503 -0.287116
+v 0.402228 0.176503 -0.301312
+v 0.466408 0.276222 -0.371788
+v 0.440411 0.242884 -0.350636
+v 0.414592 0.208316 -0.329628
+v 0.429510 0.109160 -0.273496
+v 0.416145 0.109160 -0.290623
+v 0.404210 0.109160 -0.305246
+v 0.380284 0.151431 -0.301713
+v 0.376161 0.132350 -0.298653
+v 0.380943 0.118510 -0.303427
+v 0.541124 0.099810 -0.358891
+v 0.524286 0.099810 -0.380469
+v 0.509250 0.099810 -0.398892
+v 0.417884 0.103550 -0.338197
+v 0.445691 0.100745 -0.364368
+v 0.473698 0.099810 -0.390729
+v 0.511266 0.098602 -0.454553
+v 0.513040 0.098802 -0.452894
+v 0.517177 0.098869 -0.448115
+v 0.512246 0.099810 -0.427011
+v 0.520378 0.099716 -0.434664
+v 0.523892 0.099434 -0.437972
+v 0.518167 0.080641 -0.449078
+v 0.513974 0.080641 -0.453861
+v 0.512055 0.080641 -0.455505
+v 0.525498 0.097928 -0.439484
+v 0.525799 0.095390 -0.439767
+v 0.525900 0.090035 -0.439862
+v 0.517087 0.017714 -0.448028
+v 0.512974 0.018712 -0.452830
+v 0.511222 0.021706 -0.454509
+v 0.525900 0.065989 -0.439862
+v 0.525788 0.048801 -0.439757
+v 0.525453 0.031802 -0.439442
+v 0.281213 0.253465 -0.225608
+v 0.278105 0.250070 -0.222589
+v 0.277069 0.244666 -0.221583
+v 0.381956 0.302675 -0.323218
+v 0.381885 0.300116 -0.323303
+v 0.381862 0.293995 -0.323331
+v 0.291403 0.240729 -0.236137
+v 0.308781 0.246874 -0.253625
+v 0.326408 0.253019 -0.271289
+v 0.477102 0.358422 -0.403420
+v 0.477128 0.343587 -0.403389
+v 0.477207 0.328843 -0.403293
+v 0.403709 0.302063 -0.341767
+v 0.429562 0.325636 -0.363512
+v 0.455374 0.349791 -0.385189
+v 0.502259 0.414363 -0.423821
+v 0.502389 0.413490 -0.424047
+v 0.502432 0.410012 -0.424123
+v 0.490701 0.385493 -0.414831
+v 0.498141 0.394809 -0.421019
+v 0.501394 0.400244 -0.423583
+v 0.514617 0.395116 -0.411013
+v 0.514528 0.381816 -0.410941
+v 0.514262 0.367956 -0.410724
+v 0.503227 0.404905 -0.424237
+v 0.504824 0.405779 -0.422824
+v 0.508272 0.406070 -0.418783
+v 0.568546 0.416977 -0.339453
+v 0.568829 0.416291 -0.339645
+v 0.568923 0.412892 -0.339709
+v 0.524907 0.406070 -0.398413
+v 0.538089 0.406070 -0.381791
+v 0.553112 0.406070 -0.361953
+v 0.626782 0.416977 -0.237154
+v 0.627090 0.416292 -0.237298
+v 0.627193 0.412892 -0.237346
+v 0.584469 0.406070 -0.315866
+v 0.599519 0.406070 -0.290684
+v 0.613838 0.406070 -0.264424
+v 0.668012 0.416977 -0.123874
+v 0.668341 0.416292 -0.123962
+v 0.668451 0.412892 -0.123991
+v 0.639352 0.406070 -0.209709
+v 0.650294 0.406070 -0.181568
+v 0.660000 0.406070 -0.152978
+v 0.688945 0.416977 -0.005155
+v 0.689285 0.416292 -0.005185
+v 0.689398 0.412892 -0.005195
+v 0.675626 0.406070 -0.094663
+v 0.681515 0.406070 -0.065050
+v 0.686109 0.406070 -0.035208
+v 0.688945 0.416977 0.115394
+v 0.689285 0.416292 0.115424
+v 0.689398 0.412892 0.115434
+v 0.691371 0.406070 0.024933
+v 0.692029 0.406070 0.055119
+v 0.691371 0.406070 0.085305
+v 0.668012 0.416977 0.234113
+v 0.668341 0.416292 0.234201
+v 0.668451 0.412892 0.234230
+v 0.686109 0.406070 0.145447
+v 0.681515 0.406070 0.175289
+v 0.675626 0.406070 0.204902
+v 0.626781 0.416977 0.347392
+v 0.627090 0.416292 0.347537
+v 0.627193 0.412892 0.347584
+v 0.660000 0.406070 0.263217
+v 0.650294 0.406070 0.291807
+v 0.639352 0.406070 0.319948
+v 0.566507 0.416977 0.451792
+v 0.566786 0.416292 0.451987
+v 0.566879 0.412892 0.452052
+v 0.613838 0.406070 0.374663
+v 0.599314 0.406070 0.401134
+v 0.583652 0.406070 0.426947
+v 0.489018 0.416977 0.544138
+v 0.489259 0.416292 0.544379
+v 0.489340 0.412892 0.544459
+v 0.549024 0.406070 0.476400
+v 0.530125 0.406070 0.499947
+v 0.510217 0.406070 0.522648
+v 0.396672 0.416977 0.621626
+v 0.396867 0.416292 0.621905
+v 0.396933 0.412892 0.621998
+v 0.467528 0.406070 0.565337
+v 0.444827 0.406070 0.585244
+v 0.421281 0.406070 0.604143
+v 0.292273 0.416977 0.681901
+v 0.292417 0.416292 0.682210
+v 0.292465 0.412892 0.682313
+v 0.371827 0.406070 0.638771
+v 0.346014 0.406070 0.654434
+v 0.319543 0.406070 0.668957
+v 0.178993 0.416977 0.723131
+v 0.179081 0.416292 0.723460
+v 0.179111 0.412892 0.723570
+v 0.264828 0.406070 0.694471
+v 0.236687 0.406070 0.705414
+v 0.208097 0.406070 0.715120
+v 0.060275 0.416977 0.744064
+v 0.060304 0.416292 0.744404
+v 0.060314 0.412892 0.744517
+v 0.149782 0.406070 0.730745
+v 0.120169 0.406070 0.736635
+v 0.090328 0.406070 0.741228
+v 0.030186 0.406070 0.746490
+v -0.000000 0.406070 0.747148
+v -0.030186 0.406070 0.746490
+v 0.032906 0.248266 0.431233
+v 0.032374 0.244313 0.425161
+v 0.032197 0.238976 0.423137
+v -0.016114 0.230488 0.424191
+v -0.000000 0.230488 0.424542
+v 0.016114 0.230488 0.424191
+v 0.097717 0.248266 0.419805
+v 0.096140 0.244313 0.413918
+v 0.095614 0.238976 0.411955
+v 0.048219 0.230488 0.421382
+v 0.064149 0.230488 0.418929
+v 0.079958 0.230488 0.415785
+v 0.159559 0.248266 0.397296
+v 0.156984 0.244313 0.391772
+v 0.156125 0.238976 0.389931
+v 0.111087 0.230488 0.407444
+v 0.126350 0.230488 0.402263
+v 0.141372 0.230488 0.396422
+v 0.216554 0.248266 0.364390
+v 0.213058 0.244313 0.359398
+v 0.211893 0.238976 0.357734
+v 0.170580 0.230488 0.382802
+v 0.184711 0.230488 0.375049
+v 0.198491 0.230488 0.366687
+v 0.266968 0.248266 0.322088
+v 0.262658 0.244313 0.317778
+v 0.261222 0.238976 0.316341
+v 0.224890 0.230488 0.348202
+v 0.237460 0.230488 0.338113
+v 0.249578 0.230488 0.327486
+v 0.309271 0.248266 0.271673
+v 0.304278 0.244313 0.268177
+v 0.302614 0.238976 0.267012
+v 0.272367 0.230488 0.304698
+v 0.282994 0.230488 0.292580
+v 0.293083 0.230488 0.280010
+v 0.342176 0.248266 0.214679
+v 0.336653 0.244313 0.212103
+v 0.334812 0.238976 0.211245
+v 0.311568 0.230488 0.253610
+v 0.319929 0.230488 0.239831
+v 0.327682 0.230488 0.225700
+v 0.364685 0.248266 0.152837
+v 0.358798 0.244313 0.151259
+v 0.356836 0.238976 0.150733
+v 0.341302 0.230488 0.196492
+v 0.347143 0.230488 0.181469
+v 0.352325 0.230488 0.166207
+v 0.376113 0.248266 0.088025
+v 0.370042 0.244313 0.087494
+v 0.368018 0.238976 0.087317
+v 0.360666 0.230488 0.135077
+v 0.363810 0.230488 0.119269
+v 0.366262 0.230488 0.103339
+v 0.376113 0.248266 0.022214
+v 0.370042 0.244313 0.022745
+v 0.368018 0.238976 0.022922
+v 0.369071 0.230488 0.071234
+v 0.369422 0.230488 0.055119
+v 0.369071 0.230488 0.039005
+v 0.364685 0.248266 -0.042598
+v 0.358798 0.244313 -0.041020
+v 0.356836 0.238976 -0.040494
+v 0.366262 0.230488 0.006900
+v 0.363810 0.230488 -0.009030
+v 0.360666 0.230488 -0.024838
+v 0.342176 0.248266 -0.104440
+v 0.336653 0.244313 -0.101864
+v 0.334812 0.238976 -0.101006
+v 0.352325 0.230488 -0.055968
+v 0.347143 0.230488 -0.071230
+v 0.341302 0.230488 -0.086253
+v 0.309442 0.248266 -0.161231
+v 0.304447 0.244313 -0.157738
+v 0.302781 0.238976 -0.156574
+v 0.327682 0.230488 -0.115461
+v 0.319946 0.230488 -0.129572
+v 0.311635 0.230488 -0.143292
+v 0.275635 0.248266 -0.204311
+v 0.271186 0.244313 -0.200123
+v 0.269703 0.238976 -0.198727
+v 0.293418 0.230488 -0.169372
+v 0.284287 0.230488 -0.181073
+v 0.276134 0.230488 -0.191062
+v 0.265737 0.230488 -0.203453
+v 0.265080 0.231000 -0.207400
+v 0.268576 0.232536 -0.212723
+v 0.368776 0.017714 -0.313142
+v 0.359286 0.017714 -0.303665
+v 0.351404 0.017714 -0.295795
+v 0.290925 0.080641 -0.235806
+v 0.308662 0.080641 -0.253542
+v 0.326408 0.080641 -0.271289
+v 0.341557 0.031802 -0.286247
+v 0.341505 0.048801 -0.286338
+v 0.341488 0.065989 -0.286369
+v 0.289569 0.107311 -0.234361
+v 0.308323 0.107992 -0.253181
+v 0.326408 0.108219 -0.271289
+v 0.341488 0.090035 -0.286369
+v 0.341488 0.096325 -0.286369
+v 0.341488 0.101668 -0.286369
+v 0.351225 0.168979 -0.296106
+v 0.358174 0.170488 -0.302817
+v 0.364887 0.174258 -0.308818
+v 0.341488 0.118133 -0.286369
+v 0.341488 0.131446 -0.286369
+v 0.341488 0.148194 -0.286369
+v 0.351225 0.261213 -0.296106
+v 0.358968 0.264689 -0.303507
+v 0.368064 0.271021 -0.311580
+v 0.341488 0.192130 -0.286369
+v 0.341488 0.216737 -0.286369
+v 0.341488 0.239613 -0.286369
+v 0.294939 0.259890 -0.239305
+v 0.309815 0.266258 -0.254238
+v 0.326616 0.273236 -0.271041
+v 0.341488 0.269701 -0.286369
+v 0.341510 0.275967 -0.286343
+v 0.341575 0.278611 -0.286265
+v 0.356649 0.284110 -0.294386
+v 0.360985 0.286265 -0.300649
+v 0.368244 0.289912 -0.304807
+v 0.341923 0.279722 -0.285850
+v 0.343043 0.280061 -0.285306
+v 0.345880 0.280522 -0.284296
+v 0.336083 0.259087 -0.179857
+v 0.356064 0.266523 -0.193827
+v 0.376045 0.273711 -0.207797
+v 0.380551 0.279451 -0.236038
+v 0.368951 0.279629 -0.251922
+v 0.359103 0.280166 -0.267004
+v 0.371636 0.259087 -0.118177
+v 0.393731 0.266523 -0.128480
+v 0.415826 0.273711 -0.138783
+v 0.424991 0.279451 -0.166117
+v 0.414958 0.279451 -0.184418
+v 0.404179 0.279451 -0.202212
+v 0.396083 0.259087 -0.051011
+v 0.419631 0.266523 -0.057320
+v 0.443179 0.273711 -0.063630
+v 0.456952 0.279451 -0.088957
+v 0.450232 0.279451 -0.108752
+v 0.442656 0.279451 -0.128235
+v 0.408495 0.259087 0.019381
+v 0.432781 0.266523 0.017256
+v 0.457067 0.273711 0.015131
+v 0.475028 0.279451 -0.007419
+v 0.471848 0.279451 -0.028080
+v 0.467770 0.279451 -0.048583
+v 0.408495 0.259087 0.090858
+v 0.432781 0.266524 0.092983
+v 0.457067 0.273711 0.095108
+v 0.478671 0.279451 0.076019
+v 0.479127 0.279451 0.055119
+v 0.478671 0.279451 0.034220
+v 0.396083 0.259087 0.161250
+v 0.419631 0.266524 0.167559
+v 0.443179 0.273711 0.173869
+v 0.467770 0.279451 0.158822
+v 0.471848 0.279451 0.138319
+v 0.475028 0.279451 0.117658
+v 0.371636 0.259087 0.228416
+v 0.393731 0.266524 0.238719
+v 0.415826 0.273711 0.249022
+v 0.442656 0.279451 0.238474
+v 0.450232 0.279451 0.218990
+v 0.456952 0.279451 0.199196
+v 0.335897 0.259087 0.290317
+v 0.355867 0.266524 0.304301
+v 0.375837 0.273711 0.318284
+v 0.404092 0.279451 0.312555
+v 0.414936 0.279451 0.294683
+v 0.424991 0.279451 0.276356
+v 0.289953 0.259087 0.345072
+v 0.307191 0.266524 0.362311
+v 0.324430 0.273711 0.379549
+v 0.353250 0.279451 0.378813
+v 0.367032 0.279451 0.363096
+v 0.380117 0.279451 0.346794
+v 0.235198 0.259087 0.391017
+v 0.249181 0.266524 0.410987
+v 0.263164 0.273711 0.430957
+v 0.291674 0.279451 0.435237
+v 0.307977 0.279451 0.422152
+v 0.323694 0.279451 0.408369
+v 0.173297 0.259087 0.426756
+v 0.183600 0.266524 0.448850
+v 0.193903 0.273711 0.470945
+v 0.221236 0.279451 0.480111
+v 0.239563 0.279451 0.470055
+v 0.257435 0.279451 0.459211
+v 0.106130 0.259087 0.451202
+v 0.112440 0.266524 0.474750
+v 0.118749 0.273711 0.498299
+v 0.144076 0.279451 0.512071
+v 0.163871 0.279451 0.505351
+v 0.183354 0.279451 0.497775
+v 0.035739 0.259087 0.463614
+v 0.037863 0.266524 0.487900
+v 0.039988 0.273711 0.512186
+v 0.062538 0.279451 0.530148
+v 0.083199 0.279451 0.526967
+v 0.103702 0.279451 0.522889
+v -0.020899 0.279451 0.533791
+v -0.000000 0.279451 0.534246
+v 0.020899 0.279451 0.533791
+v 0.426397 0.292132 -0.242825
+v 0.419572 0.285891 -0.238186
+v 0.417297 0.282807 -0.236639
+v 0.461442 0.282807 -0.160054
+v 0.463928 0.285891 -0.161214
+v 0.471389 0.292132 -0.164693
+v 0.450271 0.271134 -0.179277
+v 0.439641 0.271134 -0.198667
+v 0.428221 0.271134 -0.217519
+v 0.409347 0.282807 -0.231081
+v 0.407682 0.283494 -0.229916
+v 0.402687 0.282543 -0.226424
+v 0.414813 0.269865 -0.234902
+v 0.413322 0.269442 -0.233860
+v 0.411831 0.269865 -0.232818
+v 0.445285 0.282543 -0.152521
+v 0.450809 0.283494 -0.155096
+v 0.452650 0.282807 -0.155955
+v 0.422595 0.271134 -0.213937
+v 0.433865 0.271134 -0.195333
+v 0.444356 0.271134 -0.176198
+v 0.455398 0.269865 -0.157236
+v 0.457046 0.269442 -0.158005
+v 0.458694 0.269865 -0.158773
+v 0.491796 0.282807 -0.076657
+v 0.494446 0.285891 -0.077367
+v 0.502398 0.292132 -0.079498
+v 0.484133 0.271134 -0.097527
+v 0.477013 0.271134 -0.118499
+v 0.468987 0.271134 -0.139141
+v 0.474577 0.282543 -0.072043
+v 0.480464 0.283494 -0.073620
+v 0.482426 0.282807 -0.074146
+v 0.462826 0.271134 -0.136589
+v 0.470747 0.271134 -0.116218
+v 0.477773 0.271134 -0.095522
+v 0.485354 0.269865 -0.074931
+v 0.487111 0.269442 -0.075402
+v 0.488868 0.269865 -0.075872
+v 0.507207 0.282807 0.010745
+v 0.509941 0.285891 0.010505
+v 0.518141 0.292132 0.009788
+v 0.503285 0.271134 -0.011139
+v 0.499915 0.271134 -0.033029
+v 0.495595 0.271134 -0.054751
+v 0.489448 0.282543 0.012298
+v 0.495520 0.283494 0.011767
+v 0.497544 0.282807 0.011590
+v 0.489084 0.271134 -0.053308
+v 0.493347 0.271134 -0.031871
+v 0.496673 0.271134 -0.010269
+v 0.500563 0.269865 0.011326
+v 0.502375 0.269442 0.011167
+v 0.504187 0.269865 0.011009
+v 0.507207 0.282807 0.099494
+v 0.509941 0.285891 0.099733
+v 0.518141 0.292132 0.100451
+v 0.507144 0.271134 0.077262
+v 0.507627 0.271134 0.055119
+v 0.507144 0.271134 0.032977
+v 0.489448 0.282543 0.097941
+v 0.495520 0.283494 0.098472
+v 0.497544 0.282807 0.098649
+v 0.500482 0.271134 0.033268
+v 0.500958 0.271134 0.055119
+v 0.500482 0.271134 0.076971
+v 0.500563 0.269865 0.098913
+v 0.502375 0.269442 0.099072
+v 0.504187 0.269865 0.099230
+v 0.491796 0.282807 0.186896
+v 0.494446 0.285891 0.187606
+v 0.502398 0.292132 0.189737
+v 0.495595 0.271134 0.164990
+v 0.499915 0.271134 0.143268
+v 0.503285 0.271134 0.121378
+v 0.474577 0.282543 0.182282
+v 0.480464 0.283494 0.183859
+v 0.482426 0.282807 0.184385
+v 0.496673 0.271134 0.120508
+v 0.493347 0.271134 0.142110
+v 0.489084 0.271134 0.163547
+v 0.485354 0.269865 0.185170
+v 0.487111 0.269442 0.185640
+v 0.488868 0.269865 0.186111
+v 0.461441 0.282807 0.270293
+v 0.463928 0.285891 0.271453
+v 0.471389 0.292132 0.274932
+v 0.468987 0.271134 0.249380
+v 0.477013 0.271134 0.228738
+v 0.484133 0.271134 0.207766
+v 0.445285 0.282543 0.262759
+v 0.450809 0.283494 0.265335
+v 0.452650 0.282807 0.266194
+v 0.477773 0.271134 0.205761
+v 0.470747 0.271134 0.226457
+v 0.462825 0.271134 0.246828
+v 0.455397 0.269865 0.267475
+v 0.457046 0.269442 0.268243
+v 0.458694 0.269865 0.269012
+v 0.417067 0.282807 0.347153
+v 0.419314 0.285891 0.348727
+v 0.426058 0.292132 0.353448
+v 0.428129 0.271134 0.327868
+v 0.439618 0.271134 0.308933
+v 0.450271 0.271134 0.289516
+v 0.402464 0.282543 0.336928
+v 0.407457 0.283494 0.340424
+v 0.409121 0.282807 0.341589
+v 0.444356 0.271134 0.286436
+v 0.433842 0.271134 0.305599
+v 0.422504 0.271134 0.324284
+v 0.411604 0.269865 0.343328
+v 0.413094 0.269442 0.344371
+v 0.414584 0.269865 0.345414
+v 0.360019 0.282807 0.415139
+v 0.361960 0.285891 0.417079
+v 0.367781 0.292132 0.422900
+v 0.374262 0.271134 0.398068
+v 0.388865 0.271134 0.381416
+v 0.402728 0.271134 0.364143
+v 0.347414 0.282543 0.402534
+v 0.351724 0.283494 0.406843
+v 0.353160 0.282807 0.408280
+v 0.397437 0.271134 0.360084
+v 0.383756 0.271134 0.377129
+v 0.369345 0.271134 0.393562
+v 0.355304 0.269865 0.410423
+v 0.356590 0.269442 0.411709
+v 0.357876 0.269865 0.412995
+v 0.292033 0.282807 0.472186
+v 0.293607 0.285891 0.474434
+v 0.298329 0.292132 0.481177
+v 0.309024 0.271134 0.457848
+v 0.326296 0.271134 0.443984
+v 0.342948 0.271134 0.429382
+v 0.281808 0.282543 0.457583
+v 0.285304 0.283494 0.462576
+v 0.286469 0.282807 0.464240
+v 0.338443 0.271134 0.424465
+v 0.322010 0.271134 0.438876
+v 0.304964 0.271134 0.452557
+v 0.288208 0.269865 0.466723
+v 0.289251 0.269442 0.468213
+v 0.290294 0.269865 0.469703
+v 0.215174 0.282807 0.516561
+v 0.216333 0.285891 0.519048
+v 0.219812 0.292132 0.526509
+v 0.234396 0.271134 0.505391
+v 0.253813 0.271134 0.494737
+v 0.272748 0.271134 0.483248
+v 0.207640 0.282543 0.500405
+v 0.210216 0.283494 0.505928
+v 0.211074 0.282807 0.507770
+v 0.269165 0.271134 0.477624
+v 0.250479 0.271134 0.488962
+v 0.231317 0.271134 0.499475
+v 0.212355 0.269865 0.510517
+v 0.213124 0.269442 0.512165
+v 0.213892 0.269865 0.513814
+v 0.131776 0.282807 0.546915
+v 0.132486 0.285891 0.549566
+v 0.134617 0.292132 0.557517
+v 0.152646 0.271134 0.539252
+v 0.173618 0.271134 0.532133
+v 0.194261 0.271134 0.524106
+v 0.127162 0.282543 0.529696
+v 0.128740 0.283494 0.535583
+v 0.129266 0.282807 0.537545
+v 0.191709 0.271134 0.517945
+v 0.171338 0.271134 0.525866
+v 0.150641 0.271134 0.532892
+v 0.130050 0.269865 0.540473
+v 0.130521 0.269442 0.542230
+v 0.130992 0.269865 0.543987
+v 0.044375 0.282807 0.562326
+v 0.044614 0.285891 0.565060
+v 0.045331 0.292132 0.573261
+v 0.066258 0.271134 0.558404
+v 0.088148 0.271134 0.555034
+v 0.109871 0.271134 0.550714
+v 0.042821 0.282543 0.544568
+v 0.043352 0.283494 0.550639
+v 0.043529 0.282807 0.552663
+v 0.108427 0.271134 0.544203
+v 0.086990 0.271134 0.548467
+v 0.065388 0.271134 0.551792
+v 0.043794 0.269865 0.555683
+v 0.043952 0.269442 0.557495
+v 0.044111 0.269865 0.559307
+v -0.022142 0.271134 0.562264
+v -0.000000 0.271134 0.562746
+v 0.022142 0.271134 0.562264
+v 0.021852 0.271134 0.555601
+v -0.000000 0.271134 0.556077
+v -0.021852 0.271134 0.555601
+v 0.375180 0.289363 -0.298893
+v 0.371938 0.285198 -0.294765
+v 0.370857 0.282807 -0.293388
+v 0.403188 0.271134 -0.253357
+v 0.391096 0.271284 -0.268726
+v 0.381255 0.271733 -0.280327
+v 0.361222 0.283561 -0.286575
+v 0.364756 0.283748 -0.288297
+v 0.365933 0.282807 -0.288872
+v 0.371939 0.271733 -0.289188
+v 0.369619 0.271434 -0.289671
+v 0.369749 0.271733 -0.287235
+v 0.376853 0.271733 -0.276527
+v 0.386110 0.271284 -0.264623
+v 0.397891 0.271134 -0.249304
+v 0.409347 0.278545 -0.231081
+v 0.409471 0.275842 -0.231167
+v 0.409844 0.273249 -0.231428
+v 0.368684 0.273743 -0.286262
+v 0.366621 0.275965 -0.288219
+v 0.365933 0.278545 -0.288872
+v 0.396687 0.280989 -0.248383
+v 0.384474 0.280989 -0.264282
+v 0.373844 0.280989 -0.278028
+v 0.373003 0.273742 -0.290162
+v 0.371394 0.275965 -0.292582
+v 0.370857 0.278545 -0.293388
+v 0.361879 0.280989 -0.296063
+v 0.361481 0.280989 -0.299370
+v 0.364540 0.280989 -0.298556
+v 0.416800 0.273249 -0.236292
+v 0.417173 0.275842 -0.236552
+v 0.417297 0.278545 -0.236639
+v 0.380231 0.280989 -0.283633
+v 0.391723 0.280989 -0.270269
+v 0.404392 0.280989 -0.254278
+v 0.460892 0.273249 -0.159798
+v 0.461304 0.275842 -0.159990
+v 0.461442 0.278545 -0.160054
+v 0.429499 0.280989 -0.218333
+v 0.440953 0.280989 -0.199424
+v 0.451616 0.280989 -0.179977
+v 0.491210 0.273249 -0.076500
+v 0.491649 0.275842 -0.076618
+v 0.491796 0.278545 -0.076657
+v 0.470387 0.280989 -0.139721
+v 0.478437 0.280989 -0.119018
+v 0.485579 0.280989 -0.097983
+v 0.506603 0.273249 0.010797
+v 0.507056 0.275842 0.010758
+v 0.507207 0.278545 0.010745
+v 0.497074 0.280989 -0.055079
+v 0.501408 0.280989 -0.033292
+v 0.504787 0.280989 -0.011337
+v 0.506603 0.273249 0.099441
+v 0.507056 0.275842 0.099481
+v 0.507207 0.278545 0.099494
+v 0.508659 0.280989 0.032911
+v 0.509143 0.280989 0.055119
+v 0.508659 0.280989 0.077328
+v 0.491210 0.273249 0.186739
+v 0.491649 0.275842 0.186856
+v 0.491796 0.278545 0.186896
+v 0.504787 0.280989 0.121576
+v 0.501408 0.280989 0.143531
+v 0.497074 0.280989 0.165318
+v 0.460892 0.273249 0.270037
+v 0.461304 0.275842 0.270229
+v 0.461441 0.278545 0.270293
+v 0.485579 0.280989 0.208222
+v 0.478437 0.280989 0.229256
+v 0.470387 0.280989 0.249960
+v 0.416570 0.273249 0.346805
+v 0.416942 0.275842 0.347066
+v 0.417067 0.278545 0.347153
+v 0.451616 0.280989 0.290216
+v 0.440930 0.280989 0.309691
+v 0.429407 0.280989 0.328682
+v 0.359591 0.273249 0.414710
+v 0.359912 0.275842 0.415032
+v 0.360019 0.278545 0.415139
+v 0.403930 0.280989 0.365066
+v 0.390026 0.280989 0.382390
+v 0.375380 0.280989 0.399092
+v 0.291685 0.273249 0.471689
+v 0.291946 0.275842 0.472062
+v 0.292033 0.278545 0.472186
+v 0.343972 0.280989 0.430499
+v 0.327270 0.280989 0.445145
+v 0.309947 0.280989 0.459050
+v 0.214917 0.273249 0.516011
+v 0.215110 0.275842 0.516424
+v 0.215174 0.278545 0.516561
+v 0.273562 0.280989 0.484526
+v 0.254571 0.280989 0.496050
+v 0.235096 0.280989 0.506735
+v 0.131619 0.273249 0.546329
+v 0.131737 0.275842 0.546769
+v 0.131776 0.278545 0.546915
+v 0.194841 0.280989 0.525506
+v 0.174137 0.280989 0.533557
+v 0.153102 0.280989 0.540698
+v 0.044322 0.273249 0.561722
+v 0.044362 0.275842 0.562175
+v 0.044375 0.278545 0.562326
+v 0.110199 0.280989 0.552194
+v 0.088412 0.280989 0.556527
+v 0.066456 0.280989 0.559907
+v 0.022209 0.280989 0.563778
+v -0.000000 0.280989 0.564262
+v -0.022209 0.280989 0.563778
+v 0.043582 0.273249 0.553267
+v 0.043543 0.275842 0.552814
+v 0.043529 0.278545 0.552663
+v -0.021785 0.280989 0.554087
+v -0.000000 0.280989 0.554562
+v 0.021785 0.280989 0.554087
+v 0.129422 0.273249 0.538131
+v 0.129305 0.275842 0.537692
+v 0.129266 0.278545 0.537545
+v 0.065190 0.280989 0.550290
+v 0.086727 0.280989 0.546974
+v 0.108099 0.280989 0.542724
+v 0.211330 0.273249 0.508319
+v 0.211138 0.275842 0.507907
+v 0.211074 0.278545 0.507770
+v 0.150185 0.280989 0.531447
+v 0.170819 0.280989 0.524442
+v 0.191129 0.280989 0.516545
+v 0.286817 0.273249 0.464737
+v 0.286556 0.275842 0.464364
+v 0.286469 0.278545 0.464240
+v 0.230617 0.280989 0.498131
+v 0.249721 0.280989 0.487649
+v 0.268351 0.280989 0.476345
+v 0.353589 0.273249 0.408709
+v 0.353267 0.275842 0.408387
+v 0.353160 0.278545 0.408280
+v 0.304042 0.280989 0.451354
+v 0.321035 0.280989 0.437715
+v 0.337419 0.280989 0.423347
+v 0.409617 0.273249 0.341937
+v 0.409245 0.275842 0.341676
+v 0.409121 0.278545 0.341589
+v 0.368228 0.280989 0.392538
+v 0.382595 0.280989 0.376155
+v 0.396235 0.280989 0.359161
+v 0.453200 0.273249 0.266450
+v 0.452788 0.275842 0.266258
+v 0.452650 0.278545 0.266194
+v 0.421226 0.280989 0.323470
+v 0.432530 0.280989 0.304841
+v 0.443011 0.280989 0.285737
+v 0.483012 0.273249 0.184542
+v 0.482572 0.275842 0.184424
+v 0.482426 0.278545 0.184385
+v 0.461425 0.280989 0.246248
+v 0.469322 0.280989 0.225939
+v 0.476327 0.280989 0.205305
+v 0.498148 0.273249 0.098702
+v 0.497695 0.275842 0.098662
+v 0.497544 0.278545 0.098649
+v 0.487604 0.280989 0.163219
+v 0.491855 0.280989 0.141847
+v 0.495170 0.280989 0.120310
+v 0.498148 0.273249 0.011537
+v 0.497695 0.275842 0.011577
+v 0.497544 0.278545 0.011590
+v 0.498968 0.280989 0.076905
+v 0.499442 0.280989 0.055119
+v 0.498968 0.280989 0.033334
+v 0.483012 0.273249 -0.074303
+v 0.482573 0.275842 -0.074185
+v 0.482426 0.278545 -0.074146
+v 0.495170 0.280989 -0.010071
+v 0.491855 0.280989 -0.031608
+v 0.487604 0.280989 -0.052980
+v 0.453200 0.273249 -0.156211
+v 0.452788 0.275842 -0.156019
+v 0.452650 0.278545 -0.155955
+v 0.476327 0.280989 -0.095066
+v 0.469322 0.280989 -0.115700
+v 0.461425 0.280989 -0.136009
+v 0.443012 0.280989 -0.175498
+v 0.432553 0.280989 -0.194575
+v 0.421317 0.280989 -0.213123
+v 0.587848 0.009262 -0.355882
+v 0.583740 0.005035 -0.353009
+v 0.574479 0.003626 -0.346534
+v 0.511798 0.003626 -0.426593
+v 0.520029 0.005035 -0.434340
+v 0.523666 0.009262 -0.437762
+v 0.650035 0.009262 -0.247997
+v 0.645492 0.005035 -0.245878
+v 0.635251 0.003626 -0.241103
+v -0.307343 0.003626 -0.159763
+v -0.300885 0.005035 -0.155248
+v -0.297723 0.009262 -0.153037
+v 0.692794 0.009262 -0.130514
+v 0.687953 0.005035 -0.129217
+v 0.677038 0.003626 -0.126292
+v 0.714504 0.009262 -0.007391
+v 0.709511 0.005035 -0.006955
+v 0.698255 0.003626 -0.005970
+v 0.714504 0.009262 0.117631
+v 0.709511 0.005035 0.117194
+v 0.698254 0.003626 0.116209
+v 0.692794 0.009262 0.240753
+v 0.687953 0.005035 0.239456
+v 0.677038 0.003627 0.236531
+v 0.650034 0.009262 0.358236
+v 0.645491 0.005035 0.356117
+v 0.635251 0.003627 0.351342
+v 0.587523 0.009262 0.466508
+v 0.583417 0.005035 0.463633
+v 0.574161 0.003627 0.457152
+v 0.507161 0.009262 0.562280
+v 0.503616 0.005035 0.558736
+v 0.495626 0.003627 0.550746
+v 0.411388 0.009262 0.642643
+v 0.408513 0.005035 0.638537
+v 0.402032 0.003627 0.629281
+v 0.303116 0.009262 0.705154
+v 0.300997 0.005035 0.700611
+v 0.296222 0.003627 0.690370
+v 0.185634 0.009262 0.747914
+v 0.184336 0.005035 0.743072
+v 0.181412 0.003627 0.732158
+v 0.062511 0.009262 0.769624
+v 0.062074 0.005035 0.764630
+v 0.061089 0.003627 0.753374
+v -0.062511 0.009262 0.769624
+v -0.062074 0.005035 0.764630
+v -0.061089 0.003627 0.753374
+v -0.185633 0.009262 0.747914
+v -0.184336 0.005035 0.743072
+v -0.181412 0.003627 0.732158
+v -0.303116 0.009262 0.705154
+v -0.300997 0.005035 0.700611
+v -0.296222 0.003627 0.690370
+v -0.411388 0.009262 0.642643
+v -0.408513 0.005035 0.638537
+v -0.402032 0.003627 0.629281
+v -0.507160 0.009262 0.562280
+v -0.503616 0.005035 0.558736
+v -0.495626 0.003627 0.550746
+v -0.587523 0.009262 0.466508
+v -0.583417 0.005035 0.463633
+v -0.574161 0.003627 0.457152
+v -0.650034 0.009262 0.358236
+v -0.645491 0.005035 0.356117
+v -0.635251 0.003627 0.351342
+v -0.692794 0.009262 0.240753
+v -0.687953 0.005035 0.239456
+v -0.677038 0.003627 0.236532
+v -0.714504 0.009262 0.117631
+v -0.709511 0.005035 0.117194
+v -0.698255 0.003626 0.116209
+v -0.714504 0.009262 -0.007391
+v -0.709511 0.005035 -0.006954
+v -0.698254 0.003626 -0.005970
+v -0.692795 0.009262 -0.130514
+v -0.687953 0.005035 -0.129217
+v -0.677038 0.003626 -0.126292
+v -0.650035 0.009262 -0.247996
+v -0.645492 0.005035 -0.245878
+v -0.635251 0.003626 -0.241103
+v -0.273729 0.003626 -0.202515
+v -0.267983 0.005035 -0.197106
+v -0.265176 0.009262 -0.194465
+v 0.417208 0.003626 -0.337562
+v 0.445239 0.003626 -0.363947
+v 0.473257 0.003626 -0.390319
+v 0.531213 0.003626 -0.316285
+v 0.499779 0.003626 -0.294307
+v 0.468331 0.003626 -0.272320
+v 0.540495 0.003626 -0.358409
+v 0.523685 0.003626 -0.379971
+v 0.508693 0.003626 -0.398399
+v 0.587408 0.003626 -0.218794
+v 0.552648 0.003626 -0.202585
+v 0.517874 0.003626 -0.186369
+v 0.603612 0.003626 -0.259101
+v 0.589362 0.003626 -0.285094
+v 0.574052 0.003626 -0.310367
+v 0.626049 0.003626 -0.112630
+v 0.589002 0.003626 -0.102703
+v 0.551940 0.003626 -0.092772
+v 0.649006 0.003626 -0.149511
+v 0.639462 0.003626 -0.177625
+v 0.628702 0.003626 -0.205297
+v 0.645667 0.003626 -0.001369
+v 0.607459 0.003626 0.001974
+v 0.569236 0.003626 0.005318
+v 0.674680 0.003626 -0.033704
+v 0.670162 0.003626 -0.063048
+v 0.664371 0.003626 -0.092168
+v 0.645667 0.003626 0.111608
+v 0.607459 0.003626 0.108265
+v 0.569236 0.003626 0.104921
+v 0.679854 0.003626 0.084803
+v 0.680501 0.003626 0.055120
+v 0.679854 0.003626 0.025436
+v 0.626049 0.003627 0.222869
+v 0.589002 0.003627 0.212942
+v 0.551940 0.003627 0.203011
+v 0.664371 0.003627 0.202407
+v 0.670162 0.003626 0.173287
+v 0.674680 0.003626 0.143943
+v 0.587408 0.003627 0.329032
+v 0.552648 0.003627 0.312824
+v 0.517874 0.003627 0.296608
+v 0.628701 0.003627 0.315536
+v 0.639461 0.003627 0.287864
+v 0.649006 0.003627 0.259750
+v 0.530920 0.003627 0.426874
+v 0.499502 0.003627 0.404875
+v 0.468072 0.003627 0.382867
+v 0.573929 0.003627 0.420753
+v 0.589331 0.003627 0.395370
+v 0.603612 0.003627 0.369340
+v 0.458299 0.003627 0.513419
+v 0.431179 0.003627 0.486299
+v 0.404048 0.003627 0.459168
+v 0.501718 0.003627 0.514860
+v 0.521294 0.003627 0.492537
+v 0.539878 0.003627 0.469383
+v 0.371754 0.003627 0.586039
+v 0.349755 0.003627 0.554622
+v 0.327747 0.003627 0.523191
+v 0.414263 0.003627 0.594998
+v 0.437417 0.003627 0.576413
+v 0.459740 0.003627 0.556838
+v 0.273913 0.003627 0.642528
+v 0.257704 0.003627 0.607768
+v 0.241488 0.003627 0.572993
+v 0.314220 0.003627 0.658732
+v 0.340250 0.003627 0.644450
+v 0.365633 0.003627 0.629049
+v 0.167749 0.003627 0.681168
+v 0.157822 0.003627 0.644121
+v 0.147892 0.003627 0.607060
+v 0.204630 0.003627 0.704125
+v 0.232745 0.003627 0.694581
+v 0.260417 0.003627 0.683821
+v 0.056488 0.003627 0.700786
+v 0.053146 0.003627 0.662579
+v 0.049802 0.003627 0.624355
+v 0.088823 0.003627 0.729799
+v 0.118167 0.003627 0.725282
+v 0.147287 0.003627 0.719490
+v -0.056488 0.003627 0.700786
+v -0.053146 0.003627 0.662579
+v -0.049802 0.003627 0.624355
+v -0.029683 0.003627 0.734973
+v -0.000000 0.003627 0.735620
+v 0.029683 0.003627 0.734973
+v -0.167749 0.003627 0.681168
+v -0.157822 0.003627 0.644122
+v -0.147892 0.003627 0.607060
+v -0.147287 0.003627 0.719490
+v -0.118167 0.003627 0.725282
+v -0.088823 0.003627 0.729799
+v -0.273913 0.003627 0.642528
+v -0.257704 0.003627 0.607768
+v -0.241488 0.003627 0.572993
+v -0.260416 0.003627 0.683821
+v -0.232745 0.003627 0.694581
+v -0.204630 0.003627 0.704125
+v -0.371754 0.003627 0.586039
+v -0.349755 0.003627 0.554622
+v -0.327747 0.003627 0.523192
+v -0.365633 0.003627 0.629049
+v -0.340250 0.003627 0.644450
+v -0.314220 0.003627 0.658732
+v -0.458299 0.003627 0.513419
+v -0.431179 0.003627 0.486299
+v -0.404048 0.003627 0.459168
+v -0.459740 0.003627 0.556838
+v -0.437417 0.003627 0.576413
+v -0.414263 0.003627 0.594998
+v -0.530919 0.003627 0.426874
+v -0.499502 0.003627 0.404875
+v -0.468072 0.003627 0.382867
+v -0.539878 0.003627 0.469383
+v -0.521294 0.003627 0.492537
+v -0.501718 0.003627 0.514860
+v -0.587408 0.003627 0.329033
+v -0.552648 0.003627 0.312824
+v -0.517874 0.003627 0.296608
+v -0.603612 0.003627 0.369340
+v -0.589331 0.003627 0.395370
+v -0.573929 0.003627 0.420753
+v -0.626049 0.003627 0.222869
+v -0.589002 0.003627 0.212942
+v -0.551940 0.003627 0.203012
+v -0.649006 0.003627 0.259750
+v -0.639461 0.003627 0.287865
+v -0.628701 0.003627 0.315536
+v -0.645667 0.003626 0.111608
+v -0.607459 0.003626 0.108266
+v -0.569236 0.003626 0.104921
+v -0.674680 0.003626 0.143943
+v -0.670162 0.003626 0.173287
+v -0.664371 0.003627 0.202407
+v -0.645667 0.003626 -0.001369
+v -0.607459 0.003626 0.001974
+v -0.569236 0.003626 0.005318
+v -0.679854 0.003626 0.025437
+v -0.680501 0.003626 0.055120
+v -0.679854 0.003626 0.084803
+v -0.626049 0.003626 -0.112630
+v -0.589002 0.003626 -0.102703
+v -0.551940 0.003626 -0.092772
+v -0.664371 0.003626 -0.092168
+v -0.670162 0.003626 -0.063048
+v -0.674680 0.003626 -0.033703
+v -0.587408 0.003626 -0.218793
+v -0.552648 0.003626 -0.202584
+v -0.517874 0.003626 -0.186369
+v -0.628702 0.003626 -0.205297
+v -0.639462 0.003626 -0.177625
+v -0.649006 0.003626 -0.149511
+v -0.587848 0.009262 -0.355882
+v -0.583740 0.005035 -0.353009
+v -0.574479 0.003626 -0.346534
+v -0.574053 0.003626 -0.310367
+v -0.589362 0.003626 -0.285094
+v -0.603613 0.003626 -0.259101
+v -0.511798 0.003626 -0.426593
+v -0.520029 0.005035 -0.434340
+v -0.523666 0.009262 -0.437762
+v -0.508693 0.003626 -0.398399
+v -0.523685 0.003626 -0.379971
+v -0.540495 0.003626 -0.358409
+v 0.273729 0.003626 -0.202515
+v 0.267982 0.005035 -0.197106
+v 0.265176 0.009262 -0.194465
+v 0.297723 0.009262 -0.153037
+v 0.300885 0.005035 -0.155248
+v 0.307343 0.003626 -0.159763
+v 0.290450 0.003626 -0.203823
+v 0.299036 0.003626 -0.193326
+v 0.308643 0.003626 -0.181021
+v 0.339856 0.003626 -0.103358
+v 0.332715 0.005035 -0.100028
+v 0.329218 0.009262 -0.098398
+v 0.327806 0.003626 -0.153587
+v 0.336548 0.003626 -0.139155
+v 0.344686 0.003626 -0.124312
+v 0.362212 0.003626 -0.041935
+v 0.354601 0.005035 -0.039896
+v 0.350875 0.009262 -0.038897
+v 0.359013 0.003626 -0.093588
+v 0.365157 0.003626 -0.077787
+v 0.370607 0.003626 -0.061732
+v 0.373562 0.003626 0.022437
+v 0.365713 0.005035 0.023124
+v 0.361870 0.009262 0.023460
+v 0.379381 0.003626 -0.028987
+v 0.382688 0.003626 -0.012359
+v 0.385268 0.003626 0.004398
+v 0.373562 0.003626 0.087802
+v 0.365713 0.005035 0.087115
+v 0.361870 0.009262 0.086779
+v 0.388222 0.003626 0.038169
+v 0.388592 0.003626 0.055120
+v 0.388222 0.003626 0.072070
+v 0.362212 0.003626 0.152174
+v 0.354601 0.005035 0.150135
+v 0.350875 0.009262 0.149136
+v 0.385268 0.003626 0.105841
+v 0.382688 0.003626 0.122598
+v 0.379381 0.003626 0.139226
+v 0.339856 0.003626 0.213597
+v 0.332715 0.005035 0.210267
+v 0.329218 0.009262 0.208637
+v 0.370607 0.003626 0.171971
+v 0.365157 0.003626 0.188026
+v 0.359012 0.003626 0.203827
+v 0.307173 0.003627 0.270205
+v 0.300719 0.005035 0.265685
+v 0.297559 0.009262 0.263472
+v 0.344686 0.003627 0.234551
+v 0.336530 0.003627 0.249415
+v 0.327735 0.003627 0.263910
+v 0.265157 0.003627 0.320277
+v 0.259586 0.005035 0.314705
+v 0.256858 0.009262 0.311978
+v 0.308291 0.003627 0.291680
+v 0.297679 0.003627 0.304902
+v 0.286500 0.003627 0.317649
+v 0.215085 0.003627 0.362293
+v 0.210566 0.005035 0.355838
+v 0.208353 0.009262 0.352678
+v 0.262529 0.003627 0.341620
+v 0.249782 0.003627 0.352798
+v 0.236560 0.003627 0.363411
+v 0.158477 0.003627 0.394975
+v 0.155147 0.005035 0.387834
+v 0.153517 0.009262 0.384338
+v 0.208790 0.003627 0.382855
+v 0.194296 0.003627 0.391650
+v 0.179432 0.003627 0.399805
+v 0.097054 0.003627 0.417331
+v 0.095015 0.005035 0.409720
+v 0.094017 0.009262 0.405994
+v 0.148708 0.003627 0.414132
+v 0.132906 0.003627 0.420276
+v 0.116852 0.003627 0.425727
+v 0.032682 0.003627 0.428682
+v 0.031996 0.005035 0.420832
+v 0.031659 0.009262 0.416989
+v 0.084107 0.003627 0.434501
+v 0.067478 0.003627 0.437808
+v 0.050721 0.003627 0.440387
+v -0.032682 0.003627 0.428682
+v -0.031996 0.005035 0.420832
+v -0.031659 0.009262 0.416989
+v 0.016950 0.003627 0.443342
+v -0.000000 0.003627 0.443711
+v -0.016950 0.003627 0.443342
+v -0.097054 0.003627 0.417331
+v -0.095015 0.005035 0.409720
+v -0.094016 0.009262 0.405994
+v -0.050721 0.003627 0.440387
+v -0.067478 0.003627 0.437808
+v -0.084107 0.003627 0.434501
+v -0.158477 0.003627 0.394975
+v -0.155147 0.005035 0.387834
+v -0.153517 0.009262 0.384338
+v -0.116852 0.003627 0.425727
+v -0.132906 0.003627 0.420276
+v -0.148708 0.003627 0.414132
+v -0.215085 0.003627 0.362293
+v -0.210565 0.005035 0.355838
+v -0.208353 0.009262 0.352678
+v -0.179432 0.003627 0.399805
+v -0.194296 0.003627 0.391650
+v -0.208790 0.003627 0.382855
+v -0.265157 0.003627 0.320277
+v -0.259586 0.005035 0.314706
+v -0.256858 0.009262 0.311978
+v -0.236560 0.003627 0.363411
+v -0.249782 0.003627 0.352798
+v -0.262529 0.003627 0.341620
+v -0.307173 0.003627 0.270205
+v -0.300719 0.005035 0.265685
+v -0.297559 0.009262 0.263473
+v -0.286500 0.003627 0.317649
+v -0.297678 0.003627 0.304902
+v -0.308291 0.003627 0.291680
+v -0.339856 0.003626 0.213597
+v -0.332714 0.005035 0.210267
+v -0.329218 0.009262 0.208637
+v -0.327735 0.003627 0.263910
+v -0.336530 0.003627 0.249416
+v -0.344685 0.003627 0.234552
+v -0.362212 0.003626 0.152174
+v -0.354601 0.005035 0.150135
+v -0.350875 0.009262 0.149136
+v -0.359012 0.003626 0.203828
+v -0.365157 0.003626 0.188026
+v -0.370607 0.003626 0.171972
+v -0.373562 0.003626 0.087802
+v -0.365713 0.005035 0.087115
+v -0.361870 0.009262 0.086779
+v -0.379381 0.003626 0.139226
+v -0.382688 0.003626 0.122598
+v -0.385268 0.003626 0.105841
+v -0.373562 0.003626 0.022437
+v -0.365713 0.005035 0.023124
+v -0.361870 0.009262 0.023460
+v -0.388222 0.003626 0.072070
+v -0.388592 0.003626 0.055120
+v -0.388222 0.003626 0.038169
+v -0.362212 0.003626 -0.041935
+v -0.354601 0.005035 -0.039895
+v -0.350875 0.009262 -0.038897
+v -0.385268 0.003626 0.004398
+v -0.382688 0.003626 -0.012359
+v -0.379381 0.003626 -0.028987
+v -0.339856 0.003626 -0.103358
+v -0.332715 0.005035 -0.100028
+v -0.329218 0.009262 -0.098397
+v -0.370607 0.003626 -0.061732
+v -0.365157 0.003626 -0.077787
+v -0.359013 0.003626 -0.093588
+v -0.376326 0.003626 -0.207993
+v -0.356020 0.003626 -0.193796
+v -0.335731 0.003626 -0.179611
+v -0.344686 0.003626 -0.124312
+v -0.336548 0.003626 -0.139155
+v -0.327806 0.003626 -0.153587
+v -0.335242 0.003626 -0.260414
+v -0.317132 0.003626 -0.243368
+v -0.299036 0.003626 -0.226334
+v -0.308643 0.003626 -0.181021
+v -0.299036 0.003626 -0.193325
+v -0.290450 0.003626 -0.203823
+v 0.299036 0.003626 -0.226334
+v 0.317132 0.003626 -0.243368
+v 0.335241 0.003626 -0.260414
+v 0.376326 0.003626 -0.207993
+v 0.356020 0.003626 -0.193796
+v 0.335731 0.003626 -0.179611
+v 0.358988 0.003626 -0.264931
+v 0.369574 0.003626 -0.251931
+v 0.381439 0.003626 -0.236716
+v 0.416136 0.003626 -0.138928
+v 0.393682 0.003626 -0.128457
+v 0.371246 0.003626 -0.117995
+v 0.405121 0.003626 -0.202812
+v 0.415925 0.003626 -0.184977
+v 0.425982 0.003626 -0.166633
+v 0.443510 0.003626 -0.063719
+v 0.419579 0.003626 -0.057306
+v 0.395667 0.003626 -0.050899
+v 0.443688 0.003626 -0.128662
+v 0.451282 0.003626 -0.109134
+v 0.458017 0.003626 -0.089293
+v 0.457408 0.003626 0.015102
+v 0.432727 0.003626 0.017261
+v 0.408066 0.003626 0.019418
+v 0.468861 0.003626 -0.048824
+v 0.472948 0.003626 -0.028274
+v 0.476136 0.003626 -0.007565
+v 0.457408 0.003626 0.095138
+v 0.432727 0.003626 0.092978
+v 0.408066 0.003626 0.090821
+v 0.479787 0.003626 0.034171
+v 0.480244 0.003626 0.055120
+v 0.479787 0.003626 0.076068
+v 0.443510 0.003626 0.173958
+v 0.419579 0.003626 0.167545
+v 0.395667 0.003626 0.161138
+v 0.476136 0.003626 0.117804
+v 0.472948 0.003626 0.138513
+v 0.468861 0.003626 0.159064
+v 0.416136 0.003627 0.249167
+v 0.393682 0.003627 0.238696
+v 0.371246 0.003627 0.228234
+v 0.458017 0.003626 0.199532
+v 0.451281 0.003626 0.219373
+v 0.443688 0.003627 0.238901
+v 0.376118 0.003627 0.318480
+v 0.355823 0.003627 0.304270
+v 0.335545 0.003627 0.290071
+v 0.425982 0.003627 0.276872
+v 0.415903 0.003627 0.295241
+v 0.405034 0.003627 0.313155
+v 0.324672 0.003627 0.379791
+v 0.307153 0.003627 0.362273
+v 0.289648 0.003627 0.344768
+v 0.381003 0.003627 0.347474
+v 0.367888 0.003627 0.363814
+v 0.354073 0.003627 0.379568
+v 0.263360 0.003627 0.431237
+v 0.249150 0.003627 0.410943
+v 0.234951 0.003627 0.390664
+v 0.324448 0.003627 0.409193
+v 0.308695 0.003627 0.423007
+v 0.292354 0.003627 0.436123
+v 0.194047 0.003627 0.471255
+v 0.183577 0.003627 0.448801
+v 0.173115 0.003627 0.426366
+v 0.258035 0.003627 0.460153
+v 0.240122 0.003627 0.471023
+v 0.221752 0.003627 0.481101
+v 0.118838 0.003627 0.498629
+v 0.112426 0.003627 0.474698
+v 0.106019 0.003627 0.450787
+v 0.183782 0.003627 0.498807
+v 0.164253 0.003627 0.506401
+v 0.144412 0.003627 0.513137
+v 0.040018 0.003627 0.512527
+v 0.037859 0.003627 0.487846
+v 0.035701 0.003627 0.463185
+v 0.103944 0.003627 0.523980
+v 0.083393 0.003627 0.528067
+v 0.062684 0.003627 0.531255
+v -0.040018 0.003627 0.512527
+v -0.037859 0.003627 0.487846
+v -0.035701 0.003627 0.463185
+v 0.020948 0.003627 0.534907
+v -0.000000 0.003627 0.535363
+v -0.020948 0.003627 0.534907
+v -0.118838 0.003627 0.498629
+v -0.112426 0.003627 0.474698
+v -0.106018 0.003627 0.450787
+v -0.062684 0.003627 0.531255
+v -0.083393 0.003627 0.528067
+v -0.103944 0.003627 0.523980
+v -0.194047 0.003627 0.471255
+v -0.183577 0.003627 0.448801
+v -0.173115 0.003627 0.426366
+v -0.144412 0.003627 0.513137
+v -0.164253 0.003627 0.506401
+v -0.183781 0.003627 0.498807
+v -0.263360 0.003627 0.431237
+v -0.249150 0.003627 0.410943
+v -0.234951 0.003627 0.390665
+v -0.221752 0.003627 0.481101
+v -0.240122 0.003627 0.471023
+v -0.258035 0.003627 0.460153
+v -0.324671 0.003627 0.379791
+v -0.307153 0.003627 0.362273
+v -0.289648 0.003627 0.344768
+v -0.292354 0.003627 0.436123
+v -0.308695 0.003627 0.423008
+v -0.324448 0.003627 0.409193
+v -0.376118 0.003627 0.318480
+v -0.355823 0.003627 0.304270
+v -0.335545 0.003627 0.290071
+v -0.354073 0.003627 0.379568
+v -0.367888 0.003627 0.363814
+v -0.381003 0.003627 0.347474
+v -0.416136 0.003627 0.249167
+v -0.393682 0.003627 0.238697
+v -0.371246 0.003627 0.228235
+v -0.405034 0.003627 0.313155
+v -0.415903 0.003627 0.295241
+v -0.425982 0.003627 0.276872
+v -0.443510 0.003626 0.173958
+v -0.419579 0.003626 0.167545
+v -0.395667 0.003626 0.161138
+v -0.443688 0.003627 0.238901
+v -0.451281 0.003626 0.219373
+v -0.458017 0.003626 0.199532
+v -0.457408 0.003626 0.095138
+v -0.432727 0.003626 0.092978
+v -0.408066 0.003626 0.090821
+v -0.468861 0.003626 0.159064
+v -0.472948 0.003626 0.138513
+v -0.476136 0.003626 0.117804
+v -0.457408 0.003626 0.015102
+v -0.432727 0.003626 0.017261
+v -0.408066 0.003626 0.019418
+v -0.479787 0.003626 0.076068
+v -0.480244 0.003626 0.055120
+v -0.479787 0.003626 0.034172
+v -0.443510 0.003626 -0.063718
+v -0.419579 0.003626 -0.057306
+v -0.395667 0.003626 -0.050899
+v -0.476136 0.003626 -0.007565
+v -0.472948 0.003626 -0.028274
+v -0.468861 0.003626 -0.048824
+v -0.416136 0.003626 -0.138928
+v -0.393682 0.003626 -0.128457
+v -0.371246 0.003626 -0.117995
+v -0.458017 0.003626 -0.089293
+v -0.451282 0.003626 -0.109133
+v -0.443688 0.003626 -0.128662
+v -0.424961 0.003626 -0.241997
+v -0.413973 0.003626 -0.234315
+v -0.404842 0.003626 -0.227931
+v -0.425982 0.003626 -0.166633
+v -0.415925 0.003626 -0.184976
+v -0.405121 0.003626 -0.202812
+v -0.378564 0.003626 -0.301189
+v -0.368784 0.003626 -0.291985
+v -0.360658 0.003626 -0.284337
+v -0.381439 0.003626 -0.236716
+v -0.369574 0.003626 -0.251931
+v -0.358988 0.003626 -0.264931
+v 0.360658 0.003626 -0.284337
+v 0.368784 0.003626 -0.291985
+v 0.378563 0.003626 -0.301189
+v 0.424961 0.003626 -0.241997
+v 0.413973 0.003626 -0.234315
+v 0.404842 0.003626 -0.227931
+v 0.402894 0.003626 -0.304074
+v 0.414781 0.003626 -0.289490
+v 0.428099 0.003626 -0.272416
+v 0.469916 0.003626 -0.164006
+v 0.457765 0.003626 -0.158340
+v 0.447669 0.003626 -0.153632
+v 0.454679 0.003626 -0.234364
+v 0.466804 0.003626 -0.214347
+v 0.478091 0.003626 -0.193759
+v 0.500827 0.003626 -0.079077
+v 0.487878 0.003626 -0.075607
+v 0.477117 0.003626 -0.072724
+v 0.497963 0.003626 -0.151144
+v 0.506486 0.003626 -0.129226
+v 0.514045 0.003626 -0.106958
+v 0.516521 0.003626 0.009930
+v 0.503166 0.003626 0.011098
+v 0.492068 0.003626 0.012069
+v 0.526215 0.003626 -0.061540
+v 0.530802 0.003626 -0.038475
+v 0.534380 0.003626 -0.015233
+v 0.516521 0.003626 0.100309
+v 0.503166 0.003626 0.099141
+v 0.492068 0.003626 0.098170
+v 0.538479 0.003626 0.031609
+v 0.538991 0.003626 0.055120
+v 0.538479 0.003626 0.078630
+v 0.500827 0.003626 0.189316
+v 0.487878 0.003626 0.185846
+v 0.477117 0.003626 0.182963
+v 0.534380 0.003626 0.125472
+v 0.530802 0.003626 0.148714
+v 0.526215 0.003626 0.171779
+v 0.469915 0.003627 0.274245
+v 0.457765 0.003627 0.268579
+v 0.447668 0.003627 0.263871
+v 0.514045 0.003627 0.217197
+v 0.506486 0.003627 0.239465
+v 0.497963 0.003627 0.261383
+v 0.424726 0.003627 0.352516
+v 0.413744 0.003627 0.344826
+v 0.404618 0.003627 0.338436
+v 0.478091 0.003627 0.303998
+v 0.466780 0.003627 0.324615
+v 0.454581 0.003627 0.344720
+v 0.366631 0.003627 0.421750
+v 0.357151 0.003627 0.412271
+v 0.349274 0.003627 0.404393
+v 0.427611 0.003627 0.383237
+v 0.412891 0.003627 0.401576
+v 0.397386 0.003627 0.419257
+v 0.297396 0.003627 0.479845
+v 0.289707 0.003627 0.468863
+v 0.283317 0.003627 0.459738
+v 0.364137 0.003627 0.452506
+v 0.346456 0.003627 0.468010
+v 0.328117 0.003627 0.482730
+v 0.219125 0.003627 0.525035
+v 0.213459 0.003627 0.512885
+v 0.208751 0.003627 0.502788
+v 0.289600 0.003627 0.509700
+v 0.269495 0.003627 0.521899
+v 0.248878 0.003627 0.533211
+v 0.134196 0.003627 0.555947
+v 0.130726 0.003627 0.542997
+v 0.127843 0.003627 0.532236
+v 0.206263 0.003627 0.553083
+v 0.184346 0.003627 0.561605
+v 0.162078 0.003627 0.569165
+v 0.045190 0.003627 0.571641
+v 0.044021 0.003627 0.558286
+v 0.043050 0.003627 0.547187
+v 0.116659 0.003627 0.581335
+v 0.093595 0.003627 0.585922
+v 0.070352 0.003627 0.589500
+v -0.045190 0.003627 0.571641
+v -0.044021 0.003627 0.558286
+v -0.043050 0.003627 0.547187
+v 0.023510 0.003627 0.593598
+v -0.000000 0.003627 0.594110
+v -0.023511 0.003627 0.593598
+v -0.134196 0.003627 0.555947
+v -0.130726 0.003627 0.542997
+v -0.127843 0.003627 0.532236
+v -0.070352 0.003627 0.589500
+v -0.093595 0.003627 0.585922
+v -0.116659 0.003627 0.581335
+v -0.219125 0.003627 0.525035
+v -0.213459 0.003627 0.512885
+v -0.208751 0.003627 0.502788
+v -0.162078 0.003627 0.569165
+v -0.184345 0.003627 0.561605
+v -0.206263 0.003627 0.553083
+v -0.297396 0.003627 0.479845
+v -0.289706 0.003627 0.468864
+v -0.283316 0.003627 0.459738
+v -0.248878 0.003627 0.533211
+v -0.269495 0.003627 0.521899
+v -0.289600 0.003627 0.509700
+v -0.366631 0.003627 0.421750
+v -0.357151 0.003627 0.412271
+v -0.349274 0.003627 0.404393
+v -0.328117 0.003627 0.482730
+v -0.346456 0.003627 0.468010
+v -0.364137 0.003627 0.452506
+v -0.424726 0.003627 0.352516
+v -0.413744 0.003627 0.344826
+v -0.404618 0.003627 0.338436
+v -0.397386 0.003627 0.419257
+v -0.412891 0.003627 0.401576
+v -0.427611 0.003627 0.383237
+v -0.469915 0.003627 0.274245
+v -0.457765 0.003627 0.268579
+v -0.447668 0.003627 0.263871
+v -0.454581 0.003627 0.344720
+v -0.466780 0.003627 0.324615
+v -0.478091 0.003627 0.303998
+v -0.500827 0.003626 0.189316
+v -0.487878 0.003626 0.185846
+v -0.477117 0.003626 0.182963
+v -0.497963 0.003627 0.261383
+v -0.506486 0.003627 0.239465
+v -0.514045 0.003627 0.217197
+v -0.516521 0.003626 0.100309
+v -0.503166 0.003626 0.099141
+v -0.492068 0.003626 0.098170
+v -0.526215 0.003626 0.171779
+v -0.530802 0.003626 0.148714
+v -0.534380 0.003626 0.125472
+v -0.516521 0.003626 0.009930
+v -0.503166 0.003626 0.011098
+v -0.492068 0.003626 0.012069
+v -0.538479 0.003626 0.078630
+v -0.538991 0.003626 0.055120
+v -0.538479 0.003626 0.031609
+v -0.500827 0.003626 -0.079077
+v -0.487878 0.003626 -0.075607
+v -0.477117 0.003626 -0.072723
+v -0.534380 0.003626 -0.015233
+v -0.530802 0.003626 -0.038475
+v -0.526215 0.003626 -0.061540
+v -0.469916 0.003626 -0.164006
+v -0.457766 0.003626 -0.158340
+v -0.447669 0.003626 -0.153632
+v -0.514045 0.003626 -0.106958
+v -0.506486 0.003626 -0.129226
+v -0.497963 0.003626 -0.151144
+v -0.531213 0.003626 -0.316285
+v -0.499779 0.003626 -0.294307
+v -0.468331 0.003626 -0.272320
+v -0.478092 0.003626 -0.193759
+v -0.466804 0.003626 -0.214347
+v -0.454679 0.003626 -0.234364
+v -0.473257 0.003626 -0.390319
+v -0.445239 0.003626 -0.363947
+v -0.417208 0.003626 -0.337562
+v -0.428099 0.003626 -0.272416
+v -0.414781 0.003626 -0.289490
+v -0.402894 0.003626 -0.304073
+v -0.484488 0.009262 -0.428017
+v -0.485918 0.005035 -0.426081
+v -0.489681 0.003626 -0.421365
+v -0.383559 0.009262 -0.327370
+v -0.384741 0.005035 -0.325885
+v -0.387771 0.003626 -0.322199
+v -0.341835 0.009262 -0.285762
+v -0.342866 0.005035 -0.284417
+v -0.345542 0.003626 -0.281110
+v -0.276294 0.009262 -0.220403
+v -0.277211 0.005035 -0.219397
+v -0.279460 0.003626 -0.216804
+v 0.387770 0.003626 -0.322199
+v 0.384741 0.005035 -0.325885
+v 0.383559 0.009262 -0.327370
+v 0.345542 0.003626 -0.281110
+v 0.342865 0.005035 -0.284417
+v 0.341835 0.009262 -0.285762
+v 0.276294 0.009262 -0.220403
+v 0.277211 0.005035 -0.219397
+v 0.279459 0.003626 -0.216804
+v 0.484487 0.009262 -0.428017
+v 0.485918 0.005035 -0.426081
+v 0.489681 0.003626 -0.421365
+v -0.062647 0.017714 0.771175
+v -0.186036 0.017714 0.749418
+v -0.303774 0.017714 0.706565
+v -0.412281 0.017714 0.643919
+v -0.508262 0.017714 0.563382
+v -0.588799 0.017714 0.467401
+v -0.651446 0.017714 0.358894
+v -0.694299 0.017714 0.241157
+v -0.716056 0.017714 0.117767
+v -0.716056 0.017714 -0.007527
+v -0.694299 0.017714 -0.130917
+v -0.651446 0.017714 -0.248655
+v -0.589125 0.017714 -0.356774
+v -0.510737 0.025749 -0.454497
+v -0.062663 0.098869 0.771356
+v -0.186084 0.098869 0.749594
+v -0.303851 0.098869 0.706730
+v -0.412386 0.098869 0.644068
+v -0.508390 0.098869 0.563510
+v -0.588948 0.098869 0.467506
+v -0.651611 0.098869 0.358971
+v -0.694474 0.098869 0.241204
+v -0.716237 0.098869 0.117782
+v -0.716237 0.098869 -0.007543
+v -0.694475 0.098869 -0.130964
+v -0.651611 0.098869 -0.248731
+v -0.589274 0.098869 -0.356878
+v -0.510770 0.098332 -0.454530
+v -0.031517 0.098869 0.415363
+v -0.093594 0.098869 0.404417
+v -0.152827 0.098869 0.382858
+v -0.207416 0.098869 0.351341
+v -0.255703 0.098869 0.310823
+v -0.296221 0.098869 0.262536
+v -0.327738 0.098869 0.207947
+v -0.349298 0.098869 0.148714
+v -0.360243 0.098869 0.086637
+v -0.360243 0.098869 0.023602
+v -0.349298 0.098869 -0.038474
+v -0.327739 0.098869 -0.097707
+v -0.296385 0.098869 -0.152102
+v -0.257766 0.098332 -0.202083
+v -0.257783 0.025749 -0.202100
+v -0.484267 0.017714 -0.428472
+v -0.484356 0.098869 -0.428560
+v -0.558394 0.099810 -0.335288
+v -0.617464 0.099810 -0.232808
+v -0.658081 0.099810 -0.121213
+v -0.678703 0.099810 -0.004259
+v -0.678703 0.099810 0.114499
+v -0.658081 0.099810 0.231452
+v -0.617464 0.099810 0.343048
+v -0.558085 0.099810 0.445895
+v -0.481749 0.099810 0.536869
+v -0.390775 0.099810 0.613205
+v -0.287928 0.099810 0.672583
+v -0.176332 0.099810 0.713201
+v -0.059379 0.099810 0.733823
+v -0.383344 0.017714 -0.327690
+v -0.376554 0.105568 -0.321067
+v -0.443218 0.109160 -0.254761
+v -0.490104 0.109160 -0.173419
+v -0.522343 0.109160 -0.084842
+v -0.538712 0.109160 0.007989
+v -0.538712 0.109160 0.102251
+v -0.522343 0.109160 0.195081
+v -0.490104 0.109160 0.283659
+v -0.442972 0.109160 0.365292
+v -0.382382 0.109160 0.437501
+v -0.310172 0.109160 0.498092
+v -0.228539 0.109160 0.545223
+v -0.139961 0.109160 0.577463
+v -0.047131 0.109160 0.593831
+v -0.031525 0.017714 0.415456
+v -0.093618 0.017714 0.404508
+v -0.152866 0.017714 0.382943
+v -0.207470 0.017714 0.351418
+v -0.255770 0.017714 0.310889
+v -0.296298 0.017714 0.262590
+v -0.327823 0.017714 0.207986
+v -0.349388 0.017714 0.148738
+v -0.360337 0.017714 0.086645
+v -0.360337 0.017714 0.023594
+v -0.349388 0.017714 -0.038499
+v -0.327824 0.017714 -0.097747
+v -0.296462 0.017714 -0.152155
+v -0.062782 0.080642 0.772727
+v -0.186440 0.080642 0.750923
+v -0.304432 0.080642 0.707977
+v -0.413175 0.080642 0.645194
+v -0.509363 0.080642 0.564483
+v -0.590075 0.080642 0.468295
+v -0.652857 0.080642 0.359552
+v -0.695803 0.080642 0.241560
+v -0.717607 0.080642 0.117902
+v -0.717607 0.080642 -0.007663
+v -0.695803 0.080641 -0.131320
+v -0.652858 0.080641 -0.249313
+v -0.590401 0.080641 -0.357666
+v -0.511142 0.080641 -0.455307
+v -0.484047 0.080641 -0.428927
+v -0.383129 0.080641 -0.328010
+v -0.257087 0.080641 -0.201609
+v -0.295201 0.080641 -0.151274
+v -0.326429 0.080642 -0.097097
+v -0.347902 0.080642 -0.038100
+v -0.358804 0.080642 0.023728
+v -0.358804 0.080642 0.086511
+v -0.347902 0.080642 0.148340
+v -0.326429 0.080642 0.207336
+v -0.295037 0.080642 0.261707
+v -0.254681 0.080642 0.309801
+v -0.206587 0.080642 0.350157
+v -0.152216 0.080642 0.381548
+v -0.093220 0.080642 0.403021
+v -0.031391 0.080642 0.413923
+v -0.276084 0.017714 -0.220579
+v -0.275875 0.080641 -0.220756
+v -0.271764 0.105568 -0.216394
+v -0.301597 0.109160 -0.155746
+v -0.333502 0.109160 -0.100395
+v -0.355440 0.109160 -0.040120
+v -0.366578 0.109160 0.023048
+v -0.366578 0.109160 0.087191
+v -0.355440 0.109160 0.150359
+v -0.333502 0.109160 0.210634
+v -0.301430 0.109160 0.266183
+v -0.260200 0.109160 0.315320
+v -0.211064 0.109160 0.356550
+v -0.155514 0.109160 0.388621
+v -0.095240 0.109160 0.410559
+v -0.032071 0.109160 0.421697
+v -0.382097 0.303324 -0.323049
+v -0.440047 0.303424 -0.252104
+v -0.285412 0.255667 -0.229684
+v -0.319432 0.252601 -0.168215
+v -0.486311 0.303424 -0.171651
+v -0.353224 0.252601 -0.109591
+v -0.518301 0.303424 -0.083759
+v -0.376459 0.252602 -0.045752
+v -0.534543 0.303424 0.008353
+v -0.388256 0.252602 0.021152
+v -0.534543 0.303424 0.101886
+v -0.388256 0.252602 0.089088
+v -0.518301 0.303424 0.193998
+v -0.376459 0.252602 0.155992
+v -0.486311 0.303424 0.281890
+v -0.353224 0.252602 0.219831
+v -0.439544 0.303424 0.362892
+v -0.319256 0.252602 0.278665
+v -0.379422 0.303424 0.434542
+v -0.275587 0.252602 0.330707
+v -0.307772 0.303424 0.494664
+v -0.223545 0.252602 0.374375
+v -0.226770 0.303424 0.541430
+v -0.164711 0.252602 0.408343
+v -0.138878 0.303424 0.573420
+v -0.100872 0.252602 0.431579
+v -0.046766 0.303424 0.589662
+v -0.033968 0.252602 0.443376
+v -0.032197 0.163289 0.423137
+v -0.095614 0.163289 0.411955
+v -0.156125 0.163289 0.389931
+v -0.211893 0.163289 0.357734
+v -0.261222 0.163289 0.316342
+v -0.302614 0.163289 0.267012
+v -0.334811 0.163289 0.211245
+v -0.356836 0.163289 0.150733
+v -0.368018 0.163289 0.087317
+v -0.368018 0.163289 0.022922
+v -0.356836 0.163289 -0.040494
+v -0.334812 0.163289 -0.101006
+v -0.302782 0.163289 -0.156574
+v -0.277069 0.164237 -0.221583
+v -0.375680 0.183396 -0.317869
+v -0.440047 0.176503 -0.252104
+v -0.486311 0.176503 -0.171651
+v -0.518301 0.176503 -0.083759
+v -0.534543 0.176503 0.008353
+v -0.534543 0.176503 0.101886
+v -0.518301 0.176503 0.193998
+v -0.486311 0.176503 0.281890
+v -0.439544 0.176503 0.362892
+v -0.379422 0.176503 0.434542
+v -0.307772 0.176503 0.494664
+v -0.226770 0.176503 0.541430
+v -0.138878 0.176503 0.573420
+v -0.046766 0.176503 0.589662
+v -0.567981 0.355320 -0.339069
+v -0.567981 0.415657 -0.339069
+v -0.502084 0.359695 -0.423516
+v -0.502084 0.413805 -0.423516
+v -0.626164 0.355320 -0.236865
+v -0.626164 0.415657 -0.236865
+v -0.667354 0.355320 -0.123697
+v -0.667354 0.415657 -0.123697
+v -0.688266 0.355320 -0.005096
+v -0.688266 0.415657 -0.005096
+v -0.688266 0.355320 0.115335
+v -0.688266 0.415657 0.115335
+v -0.667354 0.355320 0.233937
+v -0.667354 0.415657 0.233937
+v -0.626164 0.355320 0.347105
+v -0.626164 0.415657 0.347105
+v -0.565948 0.355320 0.451401
+v -0.565948 0.415657 0.451401
+v -0.488537 0.355320 0.543656
+v -0.488537 0.415657 0.543656
+v -0.396281 0.355320 0.621068
+v -0.396281 0.415657 0.621068
+v -0.291985 0.355320 0.681283
+v -0.291985 0.415657 0.681283
+v -0.178816 0.355320 0.722473
+v -0.178816 0.415657 0.722473
+v -0.060215 0.355320 0.743386
+v -0.060215 0.415657 0.743386
+v -0.057388 0.385600 0.711071
+v -0.170421 0.385600 0.691141
+v -0.278276 0.385600 0.651885
+v -0.377676 0.385600 0.594497
+v -0.465600 0.385600 0.520720
+v -0.539377 0.385600 0.432796
+v -0.596765 0.385600 0.333396
+v -0.636021 0.385600 0.225541
+v -0.655952 0.385600 0.112508
+v -0.655952 0.385600 -0.002269
+v -0.636021 0.385600 -0.115302
+v -0.596766 0.385600 -0.223157
+v -0.541088 0.385600 -0.320788
+v -0.477363 0.316592 -0.403102
+v -0.541088 0.304342 -0.320788
+v -0.596766 0.304342 -0.223157
+v -0.636021 0.304342 -0.115302
+v -0.655952 0.304342 -0.002269
+v -0.655952 0.304342 0.112508
+v -0.636021 0.304342 0.225541
+v -0.596765 0.304342 0.333396
+v -0.539377 0.304342 0.432796
+v -0.465600 0.304342 0.520720
+v -0.377676 0.304342 0.594497
+v -0.278276 0.304342 0.651885
+v -0.170421 0.304342 0.691141
+v -0.057388 0.304342 0.711071
+v -0.264063 0.017714 -0.193418
+v -0.262950 0.080641 -0.192371
+v -0.264005 0.098869 -0.193364
+v -0.268648 0.109160 -0.197734
+v -0.269703 0.163289 -0.198727
+v -0.284534 0.252601 -0.212687
+v -0.382972 0.297953 -0.309141
+v -0.488383 0.385600 -0.389667
+v -0.513730 0.415657 -0.410291
+v -0.513730 0.355320 -0.410291
+v -0.488383 0.304342 -0.389667
+v -0.393150 0.176503 -0.312181
+v -0.394796 0.109160 -0.316466
+v -0.497389 0.099810 -0.413027
+v -0.524896 0.098869 -0.438917
+v -0.525900 0.080641 -0.439862
+v -0.524783 0.017714 -0.438812
+v -0.277069 0.235609 -0.221583
+v -0.381862 0.282662 -0.323331
+v -0.477102 0.370940 -0.403420
+v -0.502433 0.403157 -0.424122
+v -0.514617 0.406070 -0.411013
+v -0.568923 0.406070 -0.339709
+v -0.627193 0.406070 -0.237345
+v -0.668451 0.406070 -0.123991
+v -0.689398 0.406070 -0.005195
+v -0.689398 0.406070 0.115434
+v -0.668451 0.406070 0.234230
+v -0.627193 0.406070 0.347585
+v -0.566878 0.406070 0.452052
+v -0.489340 0.406070 0.544459
+v -0.396932 0.406070 0.621998
+v -0.292465 0.406070 0.682313
+v -0.179110 0.406070 0.723570
+v -0.060314 0.406070 0.744517
+v -0.032197 0.230488 0.423137
+v -0.095614 0.230488 0.411955
+v -0.156125 0.230488 0.389931
+v -0.211893 0.230488 0.357734
+v -0.261222 0.230488 0.316342
+v -0.302614 0.230488 0.267012
+v -0.334811 0.230488 0.211245
+v -0.356836 0.230488 0.150733
+v -0.368018 0.230488 0.087317
+v -0.368018 0.230488 0.022922
+v -0.356836 0.230488 -0.040494
+v -0.334812 0.230488 -0.101006
+v -0.302782 0.230488 -0.156574
+v -0.269703 0.230488 -0.198727
+v -0.341661 0.017714 -0.286065
+v -0.341488 0.080641 -0.286368
+v -0.341488 0.108219 -0.286368
+v -0.341488 0.168410 -0.286368
+v -0.341488 0.258140 -0.286368
+v -0.341706 0.279306 -0.286109
+v -0.352586 0.281537 -0.282371
+v -0.392696 0.279451 -0.219439
+v -0.434238 0.279451 -0.147369
+v -0.462803 0.279451 -0.068888
+v -0.477305 0.279451 0.013361
+v -0.477305 0.279451 0.096878
+v -0.462803 0.279451 0.179127
+v -0.434238 0.279451 0.257608
+v -0.392479 0.279451 0.329936
+v -0.338795 0.279451 0.393915
+v -0.274817 0.279451 0.447599
+v -0.202488 0.279451 0.489357
+v -0.124007 0.279451 0.517922
+v -0.041759 0.279451 0.532425
+v -0.416055 0.271134 -0.235770
+v -0.460068 0.271134 -0.159414
+v -0.410589 0.271134 -0.231949
+v -0.454024 0.271134 -0.156595
+v -0.490332 0.271134 -0.076264
+v -0.483890 0.271134 -0.074538
+v -0.505697 0.271134 0.010877
+v -0.499054 0.271134 0.011458
+v -0.505697 0.271134 0.099362
+v -0.499054 0.271134 0.098781
+v -0.490332 0.271134 0.186504
+v -0.483890 0.271134 0.184778
+v -0.460068 0.271134 0.269653
+v -0.454024 0.271134 0.266834
+v -0.415825 0.271134 0.346283
+v -0.410362 0.271134 0.342458
+v -0.358948 0.271134 0.414067
+v -0.354232 0.271134 0.409352
+v -0.291164 0.271134 0.470945
+v -0.287339 0.271134 0.465482
+v -0.214533 0.271134 0.515187
+v -0.211715 0.271134 0.509143
+v -0.131384 0.271134 0.545451
+v -0.129658 0.271134 0.539010
+v -0.044243 0.271134 0.560816
+v -0.043661 0.271134 0.554173
+v -0.375175 0.272340 -0.286896
+v -0.371474 0.272340 -0.283615
+v -0.409347 0.280989 -0.231080
+v -0.365933 0.280989 -0.288871
+v -0.370857 0.280989 -0.293388
+v -0.417297 0.280989 -0.236639
+v -0.461442 0.280989 -0.160054
+v -0.491796 0.280989 -0.076657
+v -0.507207 0.280989 0.010745
+v -0.507207 0.280989 0.099494
+v -0.491796 0.280989 0.186896
+v -0.461441 0.280989 0.270293
+v -0.417067 0.280989 0.347153
+v -0.360019 0.280989 0.415139
+v -0.292033 0.280989 0.472186
+v -0.215173 0.280989 0.516561
+v -0.131776 0.280989 0.546915
+v -0.044375 0.280989 0.562326
+v -0.043529 0.280989 0.552663
+v -0.129265 0.280989 0.537546
+v -0.211074 0.280989 0.507770
+v -0.286469 0.280989 0.464240
+v -0.353160 0.280989 0.408280
+v -0.409121 0.280989 0.341589
+v -0.452650 0.280989 0.266194
+v -0.482426 0.280989 0.184385
+v -0.497544 0.280989 0.098649
+v -0.497544 0.280989 0.011590
+v -0.482426 0.280989 -0.074146
+v -0.452650 0.280989 -0.155955
+v 0.062647 0.017714 0.771175
+v 0.186037 0.017714 0.749418
+v 0.303774 0.017714 0.706565
+v 0.412281 0.017714 0.643919
+v 0.508262 0.017714 0.563382
+v 0.588799 0.017714 0.467401
+v 0.651446 0.017714 0.358894
+v 0.694299 0.017714 0.241156
+v 0.716056 0.017714 0.117766
+v 0.716056 0.017714 -0.007527
+v 0.694299 0.017714 -0.130917
+v 0.651446 0.017714 -0.248655
+v 0.589125 0.017714 -0.356774
+v 0.510737 0.025749 -0.454497
+v 0.062662 0.098869 0.771356
+v 0.186084 0.098869 0.749594
+v 0.303851 0.098869 0.706730
+v 0.412386 0.098869 0.644068
+v 0.508391 0.098869 0.563510
+v 0.588948 0.098869 0.467505
+v 0.651611 0.098869 0.358971
+v 0.694475 0.098869 0.241203
+v 0.716237 0.098869 0.117782
+v 0.716237 0.098869 -0.007543
+v 0.694475 0.098869 -0.130964
+v 0.651611 0.098869 -0.248732
+v 0.589274 0.098869 -0.356879
+v 0.510770 0.098332 -0.454530
+v 0.031517 0.098869 0.415363
+v 0.093594 0.098869 0.404417
+v 0.152827 0.098869 0.382858
+v 0.207416 0.098869 0.351341
+v 0.255703 0.098869 0.310823
+v 0.296221 0.098869 0.262536
+v 0.327738 0.098869 0.207946
+v 0.349298 0.098869 0.148713
+v 0.360243 0.098869 0.086637
+v 0.360243 0.098869 0.023602
+v 0.349298 0.098869 -0.038475
+v 0.327739 0.098869 -0.097708
+v 0.296385 0.098869 -0.152102
+v 0.257766 0.098332 -0.202083
+v 0.257783 0.025749 -0.202100
+v 0.484267 0.017714 -0.428472
+v 0.484356 0.098869 -0.428560
+v 0.558394 0.099810 -0.335288
+v 0.617464 0.099810 -0.232809
+v 0.658081 0.099810 -0.121213
+v 0.678703 0.099810 -0.004259
+v 0.678703 0.099810 0.114498
+v 0.658081 0.099810 0.231452
+v 0.617464 0.099810 0.343048
+v 0.558085 0.099810 0.445895
+v 0.481749 0.099810 0.536868
+v 0.390775 0.099810 0.613204
+v 0.287928 0.099810 0.672583
+v 0.176332 0.099810 0.713201
+v 0.059379 0.099810 0.733823
+v 0.383344 0.017714 -0.327690
+v 0.376554 0.105568 -0.321067
+v 0.443217 0.109160 -0.254761
+v 0.490104 0.109160 -0.173420
+v 0.522343 0.109160 -0.084842
+v 0.538712 0.109160 0.007988
+v 0.538712 0.109160 0.102251
+v 0.522343 0.109160 0.195081
+v 0.490104 0.109160 0.283659
+v 0.442972 0.109160 0.365292
+v 0.382382 0.109160 0.437501
+v 0.310173 0.109160 0.498092
+v 0.228539 0.109160 0.545223
+v 0.139961 0.109160 0.577463
+v 0.047131 0.109160 0.593831
+v 0.031525 0.017714 0.415456
+v 0.093618 0.017714 0.404508
+v 0.152867 0.017714 0.382943
+v 0.207470 0.017714 0.351418
+v 0.255770 0.017714 0.310889
+v 0.296298 0.017714 0.262590
+v 0.327823 0.017714 0.207986
+v 0.349388 0.017714 0.148738
+v 0.360337 0.017714 0.086645
+v 0.360337 0.017714 0.023594
+v 0.349388 0.017714 -0.038499
+v 0.327824 0.017714 -0.097747
+v 0.296462 0.017714 -0.152156
+v 0.062782 0.080642 0.772727
+v 0.186440 0.080642 0.750922
+v 0.304432 0.080642 0.707977
+v 0.413175 0.080642 0.645194
+v 0.509363 0.080642 0.564483
+v 0.590075 0.080642 0.468294
+v 0.652857 0.080642 0.359552
+v 0.695803 0.080642 0.241559
+v 0.717607 0.080642 0.117902
+v 0.717607 0.080642 -0.007663
+v 0.695803 0.080641 -0.131320
+v 0.652857 0.080641 -0.249313
+v 0.590401 0.080641 -0.357667
+v 0.511142 0.080641 -0.455308
+v 0.484047 0.080641 -0.428928
+v 0.383129 0.080641 -0.328010
+v 0.257086 0.080641 -0.201610
+v 0.295201 0.080641 -0.151274
+v 0.326429 0.080642 -0.097097
+v 0.347902 0.080642 -0.038100
+v 0.358804 0.080642 0.023728
+v 0.358804 0.080642 0.086511
+v 0.347902 0.080642 0.148339
+v 0.326429 0.080642 0.207336
+v 0.295037 0.080642 0.261707
+v 0.254682 0.080642 0.309801
+v 0.206587 0.080642 0.350157
+v 0.152216 0.080642 0.381548
+v 0.093220 0.080642 0.403021
+v 0.031391 0.080642 0.413923
+v 0.276084 0.017714 -0.220579
+v 0.275875 0.080641 -0.220756
+v 0.271763 0.105568 -0.216394
+v 0.301597 0.109160 -0.155746
+v 0.333502 0.109160 -0.100395
+v 0.355440 0.109160 -0.040120
+v 0.366578 0.109160 0.023048
+v 0.366578 0.109160 0.087191
+v 0.355440 0.109160 0.150359
+v 0.333502 0.109160 0.210634
+v 0.301430 0.109160 0.266183
+v 0.260200 0.109160 0.315320
+v 0.211064 0.109160 0.356550
+v 0.155514 0.109160 0.388621
+v 0.095240 0.109160 0.410559
+v 0.032071 0.109160 0.421697
+v 0.382097 0.303324 -0.323049
+v 0.440047 0.303424 -0.252104
+v 0.285412 0.255667 -0.229685
+v 0.319432 0.252601 -0.168216
+v 0.486311 0.303424 -0.171651
+v 0.353224 0.252601 -0.109592
+v 0.518301 0.303424 -0.083759
+v 0.376459 0.252602 -0.045753
+v 0.534543 0.303424 0.008353
+v 0.388256 0.252602 0.021151
+v 0.534543 0.303424 0.101886
+v 0.388256 0.252602 0.089087
+v 0.518301 0.303424 0.193998
+v 0.376459 0.252602 0.155991
+v 0.486311 0.303424 0.281890
+v 0.353224 0.252602 0.219830
+v 0.439544 0.303424 0.362892
+v 0.319256 0.252602 0.278665
+v 0.379423 0.303424 0.434542
+v 0.275587 0.252602 0.330707
+v 0.307772 0.303424 0.494664
+v 0.223545 0.252602 0.374375
+v 0.226770 0.303424 0.541430
+v 0.164711 0.252602 0.408343
+v 0.138878 0.303424 0.573420
+v 0.100872 0.252602 0.431579
+v 0.046766 0.303424 0.589662
+v 0.033968 0.252602 0.443376
+v 0.032197 0.163289 0.423137
+v 0.095614 0.163289 0.411955
+v 0.156125 0.163289 0.389931
+v 0.211893 0.163289 0.357734
+v 0.261222 0.163289 0.316341
+v 0.302614 0.163289 0.267012
+v 0.334812 0.163289 0.211245
+v 0.356836 0.163289 0.150733
+v 0.368018 0.163289 0.087317
+v 0.368018 0.163289 0.022922
+v 0.356836 0.163289 -0.040494
+v 0.334812 0.163289 -0.101006
+v 0.302781 0.163289 -0.156574
+v 0.277069 0.164237 -0.221583
+v 0.375680 0.183396 -0.317869
+v 0.440047 0.176503 -0.252104
+v 0.486311 0.176503 -0.171651
+v 0.518301 0.176503 -0.083759
+v 0.534543 0.176503 0.008353
+v 0.534543 0.176503 0.101886
+v 0.518301 0.176503 0.193998
+v 0.486311 0.176503 0.281890
+v 0.439544 0.176503 0.362892
+v 0.379423 0.176503 0.434542
+v 0.307772 0.176503 0.494664
+v 0.226770 0.176503 0.541430
+v 0.138878 0.176503 0.573420
+v 0.046766 0.176503 0.589662
+v 0.567981 0.355320 -0.339069
+v 0.567981 0.415657 -0.339069
+v 0.502084 0.359695 -0.423516
+v 0.502084 0.413805 -0.423516
+v 0.626164 0.355320 -0.236866
+v 0.626164 0.415657 -0.236866
+v 0.667354 0.355320 -0.123697
+v 0.667354 0.415657 -0.123697
+v 0.688266 0.355320 -0.005096
+v 0.688266 0.415657 -0.005096
+v 0.688266 0.355320 0.115335
+v 0.688266 0.415657 0.115335
+v 0.667354 0.355320 0.233936
+v 0.667354 0.415657 0.233936
+v 0.626164 0.355320 0.347104
+v 0.626164 0.415657 0.347104
+v 0.565948 0.355320 0.451401
+v 0.565948 0.415657 0.451401
+v 0.488537 0.355320 0.543656
+v 0.488537 0.415657 0.543656
+v 0.396281 0.355320 0.621068
+v 0.396281 0.415657 0.621068
+v 0.291985 0.355320 0.681283
+v 0.291985 0.415657 0.681283
+v 0.178817 0.355320 0.722473
+v 0.178817 0.415657 0.722473
+v 0.060215 0.355320 0.743386
+v 0.060215 0.415657 0.743386
+v 0.057388 0.385600 0.711071
+v 0.170421 0.385600 0.691141
+v 0.278276 0.385600 0.651885
+v 0.377676 0.385600 0.594496
+v 0.465600 0.385600 0.520719
+v 0.539377 0.385600 0.432795
+v 0.596765 0.385600 0.333396
+v 0.636021 0.385600 0.225541
+v 0.655952 0.385600 0.112508
+v 0.655952 0.385600 -0.002269
+v 0.636021 0.385600 -0.115302
+v 0.596766 0.385600 -0.223157
+v 0.541088 0.385600 -0.320788
+v 0.477363 0.385154 -0.403102
+v 0.477363 0.316592 -0.403102
+v 0.541088 0.304342 -0.320788
+v 0.596766 0.304342 -0.223157
+v 0.636021 0.304342 -0.115302
+v 0.655952 0.304342 -0.002269
+v 0.655952 0.304342 0.112508
+v 0.636021 0.304342 0.225541
+v 0.596765 0.304342 0.333396
+v 0.539377 0.304342 0.432795
+v 0.465600 0.304342 0.520719
+v 0.377676 0.304342 0.594496
+v 0.278276 0.304342 0.651885
+v 0.170421 0.304342 0.691141
+v 0.057388 0.304342 0.711071
+v 0.264063 0.017714 -0.193418
+v 0.262950 0.080641 -0.192371
+v 0.264005 0.098869 -0.193364
+v 0.268648 0.109160 -0.197734
+v 0.269703 0.163289 -0.198727
+v 0.284534 0.252601 -0.212687
+v 0.382972 0.297953 -0.309141
+v 0.488383 0.385600 -0.389668
+v 0.513729 0.415657 -0.410291
+v 0.513729 0.355320 -0.410291
+v 0.488382 0.304342 -0.389668
+v 0.393150 0.176503 -0.312181
+v 0.394796 0.109160 -0.316466
+v 0.497389 0.099810 -0.413027
+v 0.524896 0.098869 -0.438917
+v 0.525900 0.080641 -0.439862
+v 0.524783 0.017714 -0.438812
+v 0.277069 0.235609 -0.221583
+v 0.381862 0.282662 -0.323331
+v 0.477102 0.370940 -0.403420
+v 0.502432 0.403157 -0.424123
+v 0.514617 0.406070 -0.411013
+v 0.568923 0.406070 -0.339709
+v 0.627193 0.406070 -0.237346
+v 0.668451 0.406070 -0.123991
+v 0.689398 0.406070 -0.005195
+v 0.689398 0.406070 0.115434
+v 0.668451 0.406070 0.234230
+v 0.627193 0.406070 0.347584
+v 0.566879 0.406070 0.452052
+v 0.489340 0.406070 0.544459
+v 0.396933 0.406070 0.621998
+v 0.292465 0.406070 0.682313
+v 0.179111 0.406070 0.723570
+v 0.060314 0.406070 0.744517
+v 0.032197 0.230488 0.423137
+v 0.095614 0.230488 0.411955
+v 0.156125 0.230488 0.389931
+v 0.211893 0.230488 0.357734
+v 0.261222 0.230488 0.316341
+v 0.302614 0.230488 0.267012
+v 0.334812 0.230488 0.211245
+v 0.356836 0.230488 0.150733
+v 0.368018 0.230488 0.087317
+v 0.368018 0.230488 0.022922
+v 0.356836 0.230488 -0.040494
+v 0.334812 0.230488 -0.101006
+v 0.302781 0.230488 -0.156574
+v 0.269703 0.230488 -0.198727
+v 0.341661 0.017714 -0.286065
+v 0.341488 0.080641 -0.286369
+v 0.341488 0.108219 -0.286369
+v 0.341488 0.168410 -0.286369
+v 0.341488 0.258140 -0.286369
+v 0.341706 0.279306 -0.286109
+v 0.352586 0.281537 -0.282371
+v 0.392696 0.279451 -0.219439
+v 0.434238 0.279451 -0.147369
+v 0.462803 0.279451 -0.068888
+v 0.477305 0.279451 0.013361
+v 0.477305 0.279451 0.096878
+v 0.462803 0.279451 0.179127
+v 0.434238 0.279451 0.257608
+v 0.392479 0.279451 0.329936
+v 0.338795 0.279451 0.393914
+v 0.274817 0.279451 0.447599
+v 0.202488 0.279451 0.489357
+v 0.124007 0.279451 0.517922
+v 0.041759 0.279451 0.532425
+v 0.416055 0.271134 -0.235771
+v 0.460068 0.271134 -0.159414
+v 0.410589 0.271134 -0.231949
+v 0.454024 0.271134 -0.156595
+v 0.490332 0.271134 -0.076265
+v 0.483890 0.271134 -0.074538
+v 0.505697 0.271134 0.010877
+v 0.499054 0.271134 0.011458
+v 0.505697 0.271134 0.099362
+v 0.499054 0.271134 0.098781
+v 0.490332 0.271134 0.186503
+v 0.483890 0.271134 0.184777
+v 0.460068 0.271134 0.269653
+v 0.454024 0.271134 0.266834
+v 0.415825 0.271134 0.346283
+v 0.410362 0.271134 0.342458
+v 0.358948 0.271134 0.414067
+v 0.354232 0.271134 0.409352
+v 0.291164 0.271134 0.470945
+v 0.287339 0.271134 0.465482
+v 0.214533 0.271134 0.515187
+v 0.211715 0.271134 0.509143
+v 0.131384 0.271134 0.545451
+v 0.129658 0.271134 0.539009
+v 0.044243 0.271134 0.560816
+v 0.043661 0.271134 0.554173
+v 0.375175 0.272340 -0.286896
+v 0.371474 0.272340 -0.283615
+v 0.409347 0.280989 -0.231081
+v 0.365933 0.280989 -0.288872
+v 0.370857 0.280989 -0.293388
+v 0.417297 0.280989 -0.236639
+v 0.461442 0.280989 -0.160054
+v 0.491796 0.280989 -0.076657
+v 0.507207 0.280989 0.010745
+v 0.507207 0.280989 0.099494
+v 0.491796 0.280989 0.186896
+v 0.461441 0.280989 0.270293
+v 0.417067 0.280989 0.347153
+v 0.360019 0.280989 0.415139
+v 0.292033 0.280989 0.472186
+v 0.215174 0.280989 0.516561
+v 0.131776 0.280989 0.546915
+v 0.044375 0.280989 0.562326
+v 0.043529 0.280989 0.552663
+v 0.129266 0.280989 0.537545
+v 0.211074 0.280989 0.507770
+v 0.286469 0.280989 0.464240
+v 0.353160 0.280989 0.408280
+v 0.409121 0.280989 0.341589
+v 0.452650 0.280989 0.266194
+v 0.482426 0.280989 0.184385
+v 0.497544 0.280989 0.098649
+v 0.497544 0.280989 0.011590
+v 0.482426 0.280989 -0.074146
+v 0.452650 0.280989 -0.155955
+v 0.496898 0.003626 -0.412571
+v 0.557744 0.003626 -0.334834
+v 0.616745 0.003626 -0.232474
+v 0.657316 0.003626 -0.121008
+v 0.677914 0.003626 -0.004190
+v 0.677914 0.003626 0.114429
+v 0.657315 0.003627 0.231247
+v 0.616745 0.003627 0.342713
+v 0.557435 0.003627 0.445440
+v 0.481188 0.003627 0.536308
+v 0.390320 0.003627 0.612555
+v 0.287593 0.003627 0.671865
+v 0.176127 0.003627 0.712435
+v 0.059310 0.003627 0.733033
+v -0.059310 0.003627 0.733033
+v -0.176127 0.003627 0.712435
+v -0.287593 0.003627 0.671865
+v -0.390320 0.003627 0.612555
+v -0.481188 0.003627 0.536308
+v -0.557435 0.003627 0.445440
+v -0.616745 0.003627 0.342713
+v -0.657315 0.003627 0.231247
+v -0.677914 0.003626 0.114429
+v -0.677914 0.003626 -0.004190
+v -0.657316 0.003626 -0.121007
+v -0.616745 0.003626 -0.232473
+v -0.557744 0.003626 -0.334834
+v -0.496898 0.003626 -0.412570
+v 0.283664 0.003626 -0.211866
+v 0.318493 0.003626 -0.167559
+v 0.352185 0.003626 -0.109107
+v 0.375352 0.003626 -0.045456
+v 0.387115 0.003626 0.021251
+v 0.387115 0.003626 0.088988
+v 0.375352 0.003626 0.155695
+v 0.352185 0.003627 0.219346
+v 0.318317 0.003627 0.278007
+v 0.274777 0.003627 0.329896
+v 0.222888 0.003627 0.373436
+v 0.164227 0.003627 0.407304
+v 0.100575 0.003627 0.430472
+v 0.033868 0.003627 0.442234
+v -0.033868 0.003627 0.442234
+v -0.100575 0.003627 0.430472
+v -0.164226 0.003627 0.407305
+v -0.222888 0.003627 0.373436
+v -0.274777 0.003627 0.329897
+v -0.318317 0.003627 0.278008
+v -0.352185 0.003627 0.219346
+v -0.375352 0.003626 0.155695
+v -0.387115 0.003626 0.088988
+v -0.387115 0.003626 0.021251
+v -0.375352 0.003626 -0.045456
+v -0.352185 0.003626 -0.109107
+v -0.318493 0.003626 -0.167559
+v -0.283664 0.003626 -0.211866
+v 0.350654 0.003626 -0.274921
+v 0.393612 0.003626 -0.220079
+v 0.435250 0.003626 -0.147841
+v 0.463882 0.003626 -0.069177
+v 0.478418 0.003626 0.013263
+v 0.478418 0.003626 0.096976
+v 0.463881 0.003626 0.179416
+v 0.435250 0.003627 0.258080
+v 0.393394 0.003627 0.330577
+v 0.339585 0.003627 0.394704
+v 0.275457 0.003627 0.448514
+v 0.202960 0.003627 0.490370
+v 0.124297 0.003627 0.519001
+v 0.041856 0.003627 0.533537
+v -0.041856 0.003627 0.533537
+v -0.124296 0.003627 0.519001
+v -0.202960 0.003627 0.490370
+v -0.275457 0.003627 0.448514
+v -0.339585 0.003627 0.394704
+v -0.393394 0.003627 0.330577
+v -0.435250 0.003627 0.258080
+v -0.463881 0.003626 0.179416
+v -0.478418 0.003626 0.096976
+v -0.478418 0.003626 0.013264
+v -0.463882 0.003626 -0.069177
+v -0.435250 0.003626 -0.147841
+v -0.393612 0.003626 -0.220079
+v -0.350654 0.003626 -0.274921
+v 0.393528 0.003626 -0.315274
+v 0.441761 0.003626 -0.253743
+v 0.488493 0.003626 -0.172669
+v 0.520627 0.003626 -0.084382
+v 0.536942 0.003626 0.008143
+v 0.536942 0.003626 0.102096
+v 0.520627 0.003627 0.194621
+v 0.488493 0.003627 0.282908
+v 0.441517 0.003627 0.364273
+v 0.381125 0.003627 0.436245
+v 0.309153 0.003627 0.496636
+v 0.227788 0.003627 0.543613
+v 0.139501 0.003627 0.575746
+v 0.046976 0.003627 0.592061
+v -0.046976 0.003627 0.592061
+v -0.139501 0.003627 0.575746
+v -0.227788 0.003627 0.543613
+v -0.309153 0.003627 0.496637
+v -0.381125 0.003627 0.436245
+v -0.441517 0.003627 0.364273
+v -0.488493 0.003627 0.282908
+v -0.520627 0.003627 0.194621
+v -0.536942 0.003626 0.102096
+v -0.536942 0.003626 0.008143
+v -0.520627 0.003626 -0.084382
+v -0.488494 0.003626 -0.172669
+v -0.441761 0.003626 -0.253743
+v -0.393528 0.003626 -0.315274
+v -0.089350 0.429260 0.428701
+v -0.091580 0.425032 0.424473
+v -0.103898 0.436002 0.430562
+v -0.086739 0.433375 0.432816
+v -0.074881 0.422921 0.426483
+v -0.076749 0.419377 0.422939
+v -0.106491 0.431086 0.425645
+v -0.100861 0.440788 0.435347
+v -0.072692 0.426370 0.429932
+v -0.076727 0.444868 0.444309
+v -0.080413 0.441196 0.440637
+v -0.089219 0.454152 0.448712
+v -0.072712 0.448361 0.447802
+v -0.064301 0.436002 0.439564
+v -0.067391 0.432924 0.436486
+v -0.093506 0.449882 0.444442
+v -0.084551 0.458214 0.452773
+v -0.060937 0.438929 0.442491
+v -0.058874 0.457613 0.457054
+v -0.063767 0.454747 0.454188
+v -0.068460 0.468972 0.463531
+v -0.053730 0.460245 0.459686
+v -0.049340 0.446682 0.450244
+v -0.053441 0.444281 0.447842
+v -0.074150 0.465639 0.460199
+v -0.062479 0.472032 0.466592
+v -0.045029 0.448888 0.452450
+v -0.037010 0.466624 0.466065
+v -0.042775 0.464760 0.464201
+v -0.043036 0.479451 0.474010
+v -0.031087 0.468216 0.467657
+v -0.031017 0.454235 0.457796
+v -0.035848 0.452672 0.456234
+v -0.049739 0.477283 0.471842
+v -0.036149 0.481302 0.475861
+v -0.026053 0.455569 0.459131
+v -0.012623 0.471289 0.470730
+v -0.018868 0.470554 0.469994
+v -0.014679 0.484875 0.479434
+v -0.006325 0.471732 0.471173
+v -0.010579 0.458144 0.461706
+v -0.015812 0.457527 0.461089
+v -0.021940 0.484020 0.478579
+v -0.007355 0.485390 0.479950
+v -0.005301 0.458515 0.462077
+v 0.012623 0.471289 0.470730
+v 0.006325 0.471732 0.471173
+v 0.014679 0.484875 0.479434
+v 0.018868 0.470554 0.469995
+v 0.010579 0.458144 0.461706
+v 0.005301 0.458515 0.462077
+v 0.007355 0.485390 0.479950
+v 0.021940 0.484020 0.478579
+v 0.015812 0.457527 0.461089
+v 0.037010 0.466624 0.466065
+v 0.031087 0.468216 0.467657
+v 0.043036 0.479451 0.474010
+v 0.042775 0.464760 0.464201
+v 0.031017 0.454235 0.457796
+v 0.026053 0.455569 0.459131
+v 0.036149 0.481302 0.475861
+v 0.049740 0.477283 0.471842
+v 0.035848 0.452672 0.456234
+v 0.058874 0.457613 0.457054
+v 0.053730 0.460245 0.459686
+v 0.068460 0.468972 0.463531
+v 0.063767 0.454747 0.454188
+v 0.049340 0.446682 0.450244
+v 0.045029 0.448888 0.452450
+v 0.062479 0.472032 0.466592
+v 0.074150 0.465639 0.460199
+v 0.053441 0.444281 0.447842
+v 0.076727 0.444869 0.444309
+v 0.072712 0.448361 0.447802
+v 0.089219 0.454152 0.448712
+v 0.080414 0.441196 0.440637
+v 0.064302 0.436002 0.439564
+v 0.060937 0.438929 0.442491
+v 0.084551 0.458214 0.452773
+v 0.093507 0.449882 0.444442
+v 0.067391 0.432924 0.436486
+v 0.089350 0.429260 0.428701
+v 0.086739 0.433375 0.432816
+v 0.103898 0.436002 0.430562
+v 0.091580 0.425032 0.424473
+v 0.074881 0.422921 0.426483
+v 0.072692 0.426370 0.429932
+v 0.100862 0.440788 0.435347
+v 0.106491 0.431086 0.425645
+v 0.076750 0.419377 0.422939
+v 0.095884 0.411851 0.411292
+v 0.094854 0.416309 0.415749
+v 0.111496 0.415759 0.410318
+v 0.096505 0.407355 0.406796
+v 0.080357 0.408331 0.411893
+v 0.079494 0.412067 0.415629
+v 0.110298 0.420942 0.415502
+v 0.112218 0.410531 0.405090
+v 0.080877 0.404563 0.408125
+v 0.095884 0.393828 0.393269
+v 0.096505 0.398324 0.397765
+v 0.111496 0.394801 0.389361
+v 0.094854 0.389370 0.388811
+v 0.080357 0.393227 0.396788
+v 0.080877 0.396995 0.400556
+v 0.112218 0.400029 0.394589
+v 0.110298 0.389618 0.384177
+v 0.079494 0.389491 0.393053
+v 0.089350 0.376419 0.375860
+v 0.091580 0.380647 0.380088
+v 0.103898 0.374558 0.369117
+v 0.086739 0.372303 0.371744
+v 0.074881 0.378637 0.382199
+v 0.076750 0.382180 0.385742
+v 0.106491 0.379474 0.374034
+v 0.100862 0.369772 0.364331
+v 0.072692 0.375188 0.378750
+v 0.076727 0.360810 0.360251
+v 0.080414 0.364482 0.363923
+v 0.089219 0.356408 0.350967
+v 0.072712 0.357317 0.356758
+v 0.064302 0.365556 0.369118
+v 0.067391 0.368633 0.372195
+v 0.093507 0.360678 0.355237
+v 0.084551 0.352346 0.346906
+v 0.060937 0.362629 0.366190
+v 0.058874 0.348066 0.347507
+v 0.063767 0.350932 0.350372
+v 0.068460 0.341588 0.336148
+v 0.053730 0.345434 0.344875
+v 0.049340 0.354875 0.358437
+v 0.053441 0.357277 0.360839
+v 0.074150 0.344921 0.339480
+v 0.062479 0.338528 0.333087
+v 0.045029 0.352669 0.356231
+v 0.037010 0.339054 0.338495
+v 0.042775 0.340918 0.340359
+v 0.043036 0.331109 0.325669
+v 0.031087 0.337462 0.336903
+v 0.031017 0.347323 0.350885
+v 0.035848 0.348885 0.352447
+v 0.049740 0.333277 0.327837
+v 0.036149 0.329258 0.323818
+v 0.026053 0.345989 0.349551
+v 0.012623 0.334389 0.333830
+v 0.018868 0.335125 0.334566
+v 0.014679 0.325685 0.320245
+v 0.006325 0.333946 0.333387
+v 0.010579 0.343414 0.346976
+v 0.015812 0.344030 0.347592
+v 0.021940 0.326540 0.321100
+v 0.007355 0.325170 0.319729
+v 0.005301 0.343042 0.346604
+v -0.012623 0.334389 0.333830
+v -0.006325 0.333946 0.333387
+v -0.014679 0.325685 0.320245
+v -0.018868 0.335125 0.334566
+v -0.010579 0.343414 0.346976
+v -0.005301 0.343042 0.346604
+v -0.007355 0.325170 0.319729
+v -0.021940 0.326540 0.321100
+v -0.015812 0.344030 0.347592
+v -0.037010 0.339054 0.338495
+v -0.031087 0.337462 0.336903
+v -0.043036 0.331109 0.325669
+v -0.042775 0.340918 0.340359
+v -0.031017 0.347323 0.350885
+v -0.026053 0.345989 0.349551
+v -0.036149 0.329258 0.323818
+v -0.049739 0.333277 0.327837
+v -0.035848 0.348885 0.352447
+v -0.058874 0.348066 0.347507
+v -0.053730 0.345434 0.344875
+v -0.068460 0.341588 0.336148
+v -0.063767 0.350932 0.350372
+v -0.049340 0.354875 0.358437
+v -0.045029 0.352669 0.356231
+v -0.062479 0.338528 0.333087
+v -0.074150 0.344921 0.339480
+v -0.053441 0.357277 0.360839
+v -0.076727 0.360810 0.360251
+v -0.072712 0.357317 0.356758
+v -0.089219 0.356408 0.350967
+v -0.080413 0.364482 0.363923
+v -0.064301 0.365556 0.369118
+v -0.060937 0.362629 0.366190
+v -0.084551 0.352346 0.346906
+v -0.093506 0.360678 0.355237
+v -0.067391 0.368633 0.372195
+v -0.089350 0.376419 0.375860
+v -0.086739 0.372303 0.371744
+v -0.103898 0.374558 0.369117
+v -0.091580 0.380647 0.380088
+v -0.074881 0.378637 0.382199
+v -0.072692 0.375188 0.378750
+v -0.100861 0.369772 0.364331
+v -0.106491 0.379474 0.374034
+v -0.076749 0.382180 0.385742
+v -0.095884 0.393828 0.393269
+v -0.094854 0.389370 0.388811
+v -0.111496 0.394801 0.389361
+v -0.096505 0.398324 0.397765
+v -0.080357 0.393227 0.396788
+v -0.079493 0.389491 0.393053
+v -0.110298 0.389618 0.384177
+v -0.112218 0.400029 0.394589
+v -0.080877 0.396995 0.400557
+v -0.095884 0.411851 0.411292
+v -0.096505 0.407355 0.406796
+v -0.111496 0.415759 0.410318
+v -0.094854 0.416309 0.415750
+v -0.080357 0.408331 0.411893
+v -0.080877 0.404563 0.408125
+v -0.112218 0.410531 0.405090
+v -0.110298 0.420942 0.415502
+v -0.079493 0.412067 0.415629
+v -0.147073 0.458308 0.433791
+v -0.150744 0.451348 0.426831
+v -0.161171 0.466378 0.434057
+v -0.142775 0.465082 0.440565
+v -0.132819 0.450549 0.433119
+v -0.136133 0.444264 0.426834
+v -0.165193 0.458752 0.426430
+v -0.156460 0.473802 0.441481
+v -0.128937 0.456667 0.439236
+v -0.126295 0.484000 0.459483
+v -0.132364 0.477956 0.453438
+v -0.138400 0.494533 0.462212
+v -0.119687 0.489749 0.465232
+v -0.114054 0.473751 0.456321
+v -0.119535 0.468293 0.450862
+v -0.145051 0.487909 0.455588
+v -0.131159 0.500834 0.468512
+v -0.108087 0.478943 0.461513
+v -0.096909 0.504978 0.480460
+v -0.104963 0.500260 0.475743
+v -0.106198 0.517522 0.485200
+v -0.088442 0.509310 0.484793
+v -0.087517 0.492696 0.475265
+v -0.094790 0.488436 0.471005
+v -0.115024 0.512352 0.480031
+v -0.096920 0.522269 0.489948
+v -0.079870 0.496608 0.479178
+v -0.060920 0.519811 0.495294
+v -0.070409 0.516743 0.492225
+v -0.066759 0.533777 0.501455
+v -0.051170 0.522431 0.497914
+v -0.055015 0.506092 0.488661
+v -0.063585 0.503320 0.485890
+v -0.077158 0.530414 0.498093
+v -0.056075 0.536649 0.504327
+v -0.046211 0.508458 0.491027
+v -0.020779 0.527489 0.502972
+v -0.031057 0.526279 0.501761
+v -0.022770 0.542191 0.509870
+v -0.010411 0.528219 0.503702
+v -0.018765 0.513026 0.495595
+v -0.028047 0.511932 0.494502
+v -0.034034 0.540865 0.508543
+v -0.011409 0.542991 0.510669
+v -0.009402 0.513685 0.496254
+v 0.020779 0.527489 0.502972
+v 0.010412 0.528219 0.503702
+v 0.022770 0.542191 0.509870
+v 0.031057 0.526279 0.501761
+v 0.018765 0.513026 0.495595
+v 0.009402 0.513685 0.496254
+v 0.011409 0.542991 0.510669
+v 0.034034 0.540865 0.508543
+v 0.028047 0.511932 0.494502
+v 0.060920 0.519811 0.495294
+v 0.051171 0.522431 0.497914
+v 0.066759 0.533777 0.501455
+v 0.070409 0.516743 0.492225
+v 0.055015 0.506092 0.488661
+v 0.046211 0.508458 0.491027
+v 0.056075 0.536649 0.504327
+v 0.077158 0.530414 0.498093
+v 0.063585 0.503320 0.485890
+v 0.096909 0.504978 0.480460
+v 0.088442 0.509310 0.484793
+v 0.106199 0.517522 0.485200
+v 0.104963 0.500261 0.475743
+v 0.087517 0.492696 0.475265
+v 0.079870 0.496608 0.479178
+v 0.096920 0.522269 0.489948
+v 0.115024 0.512352 0.480031
+v 0.094790 0.488436 0.471005
+v 0.126295 0.484000 0.459483
+v 0.119687 0.489749 0.465232
+v 0.138401 0.494533 0.462212
+v 0.132364 0.477956 0.453438
+v 0.114054 0.473751 0.456321
+v 0.108087 0.478943 0.461513
+v 0.131159 0.500834 0.468512
+v 0.145051 0.487910 0.455588
+v 0.119535 0.468293 0.450862
+v 0.147074 0.458308 0.433790
+v 0.142775 0.465082 0.440565
+v 0.161171 0.466378 0.434057
+v 0.150744 0.451348 0.426831
+v 0.132819 0.450549 0.433119
+v 0.128937 0.456667 0.439236
+v 0.156461 0.473802 0.441480
+v 0.165193 0.458752 0.426430
+v 0.136134 0.444264 0.426833
+v 0.157829 0.429652 0.405134
+v 0.156133 0.436989 0.412472
+v 0.172958 0.434976 0.402654
+v 0.158852 0.422251 0.397734
+v 0.142532 0.424671 0.407240
+v 0.141001 0.431297 0.413867
+v 0.171099 0.443017 0.410695
+v 0.174078 0.426865 0.394544
+v 0.143455 0.417987 0.400557
+v 0.157829 0.399985 0.375468
+v 0.158852 0.407386 0.382868
+v 0.172958 0.402465 0.370144
+v 0.156133 0.392647 0.368130
+v 0.142532 0.397879 0.380449
+v 0.143455 0.404563 0.387132
+v 0.174078 0.410576 0.378254
+v 0.171099 0.394424 0.362103
+v 0.141001 0.391253 0.373822
+v 0.147074 0.371329 0.346812
+v 0.150744 0.378289 0.353771
+v 0.161171 0.371063 0.338741
+v 0.142775 0.364555 0.340037
+v 0.132819 0.372001 0.354570
+v 0.136134 0.378286 0.360855
+v 0.165193 0.378689 0.346368
+v 0.156461 0.363639 0.331317
+v 0.128937 0.365883 0.348453
+v 0.126295 0.345637 0.321119
+v 0.132364 0.351681 0.327164
+v 0.138401 0.342908 0.310586
+v 0.119687 0.339888 0.315370
+v 0.114054 0.348799 0.331368
+v 0.119535 0.354257 0.336827
+v 0.145051 0.349532 0.317210
+v 0.131159 0.336607 0.304286
+v 0.108087 0.343607 0.326176
+v 0.096909 0.324659 0.300142
+v 0.104963 0.329376 0.304859
+v 0.106199 0.319919 0.287598
+v 0.088442 0.320327 0.295809
+v 0.087517 0.329854 0.312424
+v 0.094790 0.334114 0.316684
+v 0.115024 0.325089 0.292767
+v 0.096920 0.315172 0.282850
+v 0.079870 0.325942 0.308511
+v 0.060920 0.309826 0.285308
+v 0.070409 0.312894 0.288377
+v 0.066759 0.303664 0.271342
+v 0.051171 0.307205 0.282688
+v 0.055015 0.316458 0.299028
+v 0.063585 0.319229 0.301799
+v 0.077158 0.307027 0.274705
+v 0.056075 0.300792 0.268471
+v 0.046211 0.314092 0.296662
+v 0.020779 0.302147 0.277630
+v 0.031057 0.303358 0.278841
+v 0.022770 0.295250 0.262928
+v 0.010412 0.301418 0.276900
+v 0.018765 0.309524 0.292094
+v 0.028047 0.310618 0.293187
+v 0.034034 0.296576 0.264255
+v 0.011409 0.294450 0.262128
+v 0.009402 0.308865 0.291435
+v -0.020779 0.302147 0.277630
+v -0.010411 0.301418 0.276900
+v -0.022770 0.295250 0.262928
+v -0.031057 0.303358 0.278841
+v -0.018765 0.309524 0.292094
+v -0.009402 0.308865 0.291435
+v -0.011409 0.294450 0.262128
+v -0.034034 0.296576 0.264255
+v -0.028047 0.310618 0.293187
+v -0.060920 0.309826 0.285308
+v -0.051170 0.307205 0.282688
+v -0.066759 0.303664 0.271342
+v -0.070409 0.312894 0.288377
+v -0.055015 0.316458 0.299028
+v -0.046211 0.314092 0.296662
+v -0.056075 0.300792 0.268471
+v -0.077158 0.307027 0.274705
+v -0.063585 0.319229 0.301799
+v -0.096909 0.324659 0.300142
+v -0.088442 0.320327 0.295809
+v -0.106198 0.319919 0.287598
+v -0.104963 0.329376 0.304859
+v -0.087517 0.329854 0.312424
+v -0.079870 0.325942 0.308511
+v -0.096920 0.315171 0.282850
+v -0.115024 0.325089 0.292767
+v -0.094790 0.334114 0.316684
+v -0.126295 0.345637 0.321119
+v -0.119687 0.339887 0.315370
+v -0.138401 0.342908 0.310586
+v -0.132364 0.351681 0.327164
+v -0.114054 0.348799 0.331368
+v -0.108087 0.343607 0.326176
+v -0.131159 0.336607 0.304286
+v -0.145051 0.349531 0.317210
+v -0.119535 0.354257 0.336827
+v -0.147073 0.371329 0.346812
+v -0.142775 0.364555 0.340037
+v -0.161171 0.371062 0.338741
+v -0.150744 0.378289 0.353772
+v -0.132819 0.372001 0.354570
+v -0.128937 0.365883 0.348453
+v -0.156461 0.363639 0.331317
+v -0.165193 0.378689 0.346368
+v -0.136134 0.378286 0.360855
+v -0.157829 0.399985 0.375468
+v -0.156133 0.392647 0.368130
+v -0.172958 0.402465 0.370144
+v -0.158851 0.407386 0.382868
+v -0.142532 0.397879 0.380449
+v -0.141001 0.391253 0.373822
+v -0.171099 0.394424 0.362103
+v -0.174078 0.410576 0.378254
+v -0.143455 0.404563 0.387132
+v -0.157829 0.429652 0.405134
+v -0.158851 0.422251 0.397734
+v -0.172958 0.434976 0.402654
+v -0.156133 0.436989 0.412472
+v -0.142532 0.424671 0.407240
+v -0.143455 0.417987 0.400557
+v -0.174078 0.426865 0.394544
+v -0.171099 0.443017 0.410695
+v -0.141001 0.431297 0.413867
+v -0.202368 0.492377 0.432422
+v -0.207418 0.482800 0.422846
+v -0.215686 0.501607 0.431068
+v -0.196453 0.501698 0.441743
+v -0.188833 0.483422 0.433372
+v -0.193545 0.474486 0.424436
+v -0.221069 0.491401 0.420861
+v -0.209382 0.511542 0.441003
+v -0.183314 0.492120 0.442070
+v -0.173777 0.527728 0.467774
+v -0.182127 0.519412 0.459457
+v -0.185214 0.539285 0.468746
+v -0.164685 0.535639 0.475684
+v -0.162154 0.516409 0.466360
+v -0.169946 0.508649 0.458599
+v -0.194114 0.530421 0.459882
+v -0.175523 0.547717 0.477178
+v -0.153670 0.523791 0.473741
+v -0.133344 0.556593 0.496638
+v -0.144425 0.550102 0.490147
+v -0.142119 0.570050 0.499510
+v -0.121693 0.562554 0.502599
+v -0.124425 0.543343 0.493293
+v -0.134765 0.537287 0.487237
+v -0.153930 0.563132 0.492592
+v -0.129702 0.576403 0.505864
+v -0.113554 0.548906 0.498856
+v -0.083823 0.577003 0.517048
+v -0.096880 0.572781 0.512826
+v -0.089340 0.591803 0.521264
+v -0.070409 0.580609 0.520654
+v -0.078217 0.562388 0.512339
+v -0.090401 0.558449 0.508399
+v -0.103256 0.587303 0.516764
+v -0.075042 0.595646 0.525107
+v -0.065700 0.565753 0.515703
+v -0.028591 0.587568 0.527613
+v -0.042733 0.585902 0.525948
+v -0.030472 0.603063 0.532524
+v -0.014326 0.588572 0.528618
+v -0.026678 0.572247 0.522197
+v -0.039875 0.570692 0.520643
+v -0.045546 0.601288 0.530749
+v -0.015269 0.604134 0.533594
+v -0.013368 0.573184 0.523134
+v 0.028591 0.587568 0.527613
+v 0.014326 0.588572 0.528618
+v 0.030472 0.603063 0.532524
+v 0.042733 0.585902 0.525948
+v 0.026678 0.572247 0.522197
+v 0.013368 0.573184 0.523134
+v 0.015269 0.604134 0.533594
+v 0.045546 0.601288 0.530749
+v 0.039875 0.570692 0.520643
+v 0.083823 0.577003 0.517048
+v 0.070409 0.580609 0.520654
+v 0.089340 0.591803 0.521264
+v 0.096880 0.572781 0.512826
+v 0.078217 0.562388 0.512339
+v 0.065700 0.565753 0.515703
+v 0.075043 0.595646 0.525107
+v 0.103256 0.587303 0.516764
+v 0.090401 0.558449 0.508399
+v 0.133344 0.556593 0.496638
+v 0.121693 0.562554 0.502599
+v 0.142120 0.570050 0.499510
+v 0.144425 0.550102 0.490147
+v 0.124425 0.543343 0.493293
+v 0.113554 0.548906 0.498856
+v 0.129702 0.576403 0.505864
+v 0.153930 0.563132 0.492592
+v 0.134766 0.537287 0.487237
+v 0.173777 0.527728 0.467774
+v 0.164685 0.535639 0.475684
+v 0.185214 0.539285 0.468746
+v 0.182127 0.519412 0.459457
+v 0.162154 0.516409 0.466360
+v 0.153670 0.523791 0.473741
+v 0.175523 0.547717 0.477178
+v 0.194114 0.530421 0.459882
+v 0.169946 0.508649 0.458599
+v 0.202368 0.492377 0.432422
+v 0.196453 0.501698 0.441743
+v 0.215686 0.501607 0.431068
+v 0.207418 0.482800 0.422846
+v 0.188833 0.483422 0.433372
+v 0.183314 0.492120 0.442070
+v 0.209382 0.511542 0.441003
+v 0.221069 0.491401 0.420861
+v 0.193546 0.474486 0.424436
+v 0.217167 0.452947 0.392993
+v 0.214834 0.463044 0.403089
+v 0.231460 0.459583 0.389044
+v 0.218574 0.442764 0.382809
+v 0.202643 0.446630 0.396580
+v 0.200465 0.456051 0.406001
+v 0.228973 0.470344 0.399804
+v 0.232959 0.448729 0.378190
+v 0.203955 0.437128 0.387078
+v 0.217167 0.412127 0.352172
+v 0.218574 0.422310 0.362355
+v 0.231460 0.416076 0.345537
+v 0.214834 0.402031 0.342076
+v 0.202642 0.408539 0.358490
+v 0.203955 0.418042 0.367992
+v 0.232959 0.426929 0.356390
+v 0.228973 0.405315 0.334776
+v 0.200465 0.399119 0.349069
+v 0.202368 0.372697 0.312743
+v 0.207418 0.382274 0.322319
+v 0.215686 0.374051 0.303512
+v 0.196453 0.363376 0.303422
+v 0.188833 0.371747 0.321697
+v 0.193546 0.380683 0.330633
+v 0.221069 0.384258 0.313719
+v 0.209382 0.364117 0.293578
+v 0.183314 0.363049 0.313000
+v 0.173777 0.337346 0.277391
+v 0.182128 0.345663 0.285708
+v 0.185214 0.336373 0.265834
+v 0.164685 0.329435 0.269480
+v 0.162154 0.338760 0.288710
+v 0.169946 0.346521 0.296471
+v 0.194114 0.345237 0.274698
+v 0.175523 0.327942 0.257403
+v 0.153670 0.331378 0.281329
+v 0.133344 0.308481 0.248527
+v 0.144425 0.314972 0.255017
+v 0.142120 0.305609 0.235070
+v 0.121693 0.302520 0.242565
+v 0.124425 0.311826 0.261776
+v 0.134766 0.317883 0.267833
+v 0.153930 0.312527 0.241988
+v 0.129702 0.299255 0.228716
+v 0.113554 0.306263 0.256214
+v 0.083823 0.288071 0.228116
+v 0.096880 0.292293 0.232338
+v 0.089340 0.283855 0.213316
+v 0.070409 0.284465 0.224511
+v 0.078217 0.292781 0.242731
+v 0.090401 0.296721 0.246671
+v 0.103256 0.288355 0.217816
+v 0.075043 0.280013 0.209474
+v 0.065700 0.289416 0.239367
+v 0.028591 0.277506 0.217551
+v 0.042733 0.279172 0.219217
+v 0.030472 0.272595 0.202056
+v 0.014326 0.276502 0.216547
+v 0.026678 0.282922 0.232873
+v 0.039875 0.284477 0.234427
+v 0.045546 0.274370 0.203831
+v 0.015269 0.271525 0.200986
+v 0.013368 0.281985 0.231936
+v -0.028591 0.277506 0.217551
+v -0.014326 0.276502 0.216547
+v -0.030472 0.272595 0.202056
+v -0.042733 0.279172 0.219217
+v -0.026678 0.282922 0.232873
+v -0.013368 0.281985 0.231936
+v -0.015269 0.271525 0.200986
+v -0.045546 0.274370 0.203831
+v -0.039875 0.284477 0.234427
+v -0.083823 0.288071 0.228116
+v -0.070409 0.284466 0.224511
+v -0.089340 0.283855 0.213316
+v -0.096880 0.292293 0.232338
+v -0.078217 0.292781 0.242731
+v -0.065700 0.289416 0.239367
+v -0.075042 0.280013 0.209474
+v -0.103256 0.288355 0.217816
+v -0.090401 0.296721 0.246671
+v -0.133344 0.308481 0.248527
+v -0.121693 0.302520 0.242565
+v -0.142120 0.305609 0.235070
+v -0.144425 0.314972 0.255017
+v -0.124425 0.311826 0.261776
+v -0.113554 0.306263 0.256214
+v -0.129702 0.299255 0.228716
+v -0.153930 0.312527 0.241988
+v -0.134765 0.317883 0.267833
+v -0.173777 0.337346 0.277391
+v -0.164685 0.329435 0.269480
+v -0.185214 0.336373 0.265834
+v -0.182127 0.345663 0.285708
+v -0.162154 0.338760 0.288710
+v -0.153670 0.331378 0.281329
+v -0.175523 0.327942 0.257403
+v -0.194114 0.345237 0.274698
+v -0.169946 0.346521 0.296471
+v -0.202368 0.372697 0.312743
+v -0.196453 0.363376 0.303422
+v -0.215686 0.374051 0.303512
+v -0.207418 0.382274 0.322319
+v -0.188833 0.371747 0.321697
+v -0.183314 0.363049 0.313000
+v -0.209382 0.364117 0.293578
+v -0.221069 0.384258 0.313719
+v -0.193545 0.380683 0.330633
+v -0.217167 0.412127 0.352172
+v -0.214834 0.402031 0.342076
+v -0.231460 0.416076 0.345537
+v -0.218574 0.422310 0.362356
+v -0.202642 0.408539 0.358490
+v -0.200465 0.399118 0.349069
+v -0.228973 0.405315 0.334776
+v -0.232959 0.426929 0.356390
+v -0.203955 0.418042 0.367992
+v -0.217167 0.452947 0.392993
+v -0.218574 0.442764 0.382809
+v -0.231460 0.459583 0.389044
+v -0.214834 0.463044 0.403089
+v -0.202642 0.446630 0.396580
+v -0.203955 0.437127 0.387078
+v -0.232959 0.448729 0.378190
+v -0.228973 0.470343 0.399804
+v -0.200465 0.456051 0.406001
+v -0.254199 0.530854 0.424598
+v -0.260543 0.518825 0.412569
+v -0.266511 0.541086 0.421647
+v -0.246770 0.542562 0.436307
+v -0.241616 0.520856 0.427154
+v -0.247646 0.509422 0.415720
+v -0.273162 0.528474 0.409035
+v -0.258722 0.553362 0.433922
+v -0.234554 0.531985 0.438283
+v -0.218286 0.575260 0.469004
+v -0.228775 0.564813 0.458557
+v -0.228858 0.587643 0.468204
+v -0.206865 0.585197 0.478941
+v -0.207480 0.563064 0.469362
+v -0.217450 0.553134 0.459432
+v -0.239855 0.576690 0.457250
+v -0.216884 0.598061 0.478622
+v -0.196624 0.572509 0.478807
+v -0.167496 0.611517 0.505262
+v -0.181416 0.603364 0.497108
+v -0.175609 0.625656 0.506217
+v -0.152862 0.619005 0.512750
+v -0.159205 0.597526 0.503824
+v -0.172435 0.589777 0.496075
+v -0.190202 0.617108 0.497669
+v -0.160266 0.633507 0.514068
+v -0.145295 0.604644 0.510942
+v -0.105293 0.637155 0.530899
+v -0.121694 0.631852 0.525596
+v -0.110392 0.652536 0.533096
+v -0.088442 0.641684 0.535428
+v -0.100080 0.621895 0.528193
+v -0.115670 0.616854 0.523152
+v -0.127588 0.646975 0.527536
+v -0.092726 0.657284 0.537845
+v -0.084064 0.626200 0.532498
+v -0.035913 0.650426 0.544170
+v -0.053678 0.648334 0.542078
+v -0.037653 0.666450 0.547010
+v -0.017995 0.651687 0.545432
+v -0.034136 0.634509 0.540807
+v -0.051021 0.632520 0.538818
+v -0.056278 0.664256 0.544817
+v -0.018867 0.667772 0.548333
+v -0.017104 0.635708 0.542006
+v 0.035913 0.650426 0.544170
+v 0.017995 0.651687 0.545432
+v 0.037653 0.666450 0.547010
+v 0.053679 0.648334 0.542078
+v 0.034136 0.634509 0.540807
+v 0.017104 0.635708 0.542006
+v 0.018867 0.667772 0.548333
+v 0.056278 0.664256 0.544817
+v 0.051021 0.632520 0.538818
+v 0.105293 0.637155 0.530899
+v 0.088442 0.641684 0.535428
+v 0.110392 0.652536 0.533096
+v 0.121694 0.631852 0.525596
+v 0.100081 0.621895 0.528193
+v 0.084064 0.626200 0.532498
+v 0.092726 0.657284 0.537845
+v 0.127588 0.646976 0.527536
+v 0.115670 0.616854 0.523152
+v 0.167497 0.611517 0.505261
+v 0.152862 0.619005 0.512749
+v 0.175609 0.625656 0.506217
+v 0.181416 0.603364 0.497108
+v 0.159205 0.597526 0.503824
+v 0.145295 0.604644 0.510942
+v 0.160266 0.633507 0.514068
+v 0.190203 0.617108 0.497669
+v 0.172435 0.589777 0.496075
+v 0.218286 0.575260 0.469004
+v 0.206865 0.585197 0.478941
+v 0.228858 0.587643 0.468204
+v 0.228775 0.564813 0.458557
+v 0.207480 0.563064 0.469362
+v 0.196625 0.572509 0.478807
+v 0.216884 0.598061 0.478622
+v 0.239855 0.576690 0.457250
+v 0.217450 0.553134 0.459432
+v 0.254199 0.530854 0.424598
+v 0.246770 0.542562 0.436307
+v 0.266511 0.541086 0.421647
+v 0.260543 0.518825 0.412569
+v 0.241616 0.520856 0.427154
+v 0.234554 0.531985 0.438283
+v 0.258722 0.553362 0.433922
+v 0.273162 0.528474 0.409035
+v 0.247646 0.509422 0.415720
+v 0.272789 0.481325 0.375070
+v 0.269858 0.494008 0.387752
+v 0.286001 0.489159 0.369720
+v 0.274556 0.468534 0.362278
+v 0.259286 0.473779 0.380077
+v 0.256500 0.485834 0.392132
+v 0.282928 0.502455 0.383016
+v 0.287854 0.475748 0.356309
+v 0.260965 0.461621 0.367919
+v 0.272789 0.430050 0.323794
+v 0.274556 0.442841 0.336586
+v 0.286001 0.435400 0.315961
+v 0.269858 0.417368 0.311112
+v 0.259286 0.425042 0.331340
+v 0.260965 0.437200 0.343498
+v 0.287854 0.448811 0.329372
+v 0.282928 0.422104 0.302664
+v 0.256500 0.412988 0.319286
+v 0.254199 0.380521 0.274266
+v 0.260543 0.392551 0.286295
+v 0.266511 0.383473 0.264033
+v 0.246770 0.368813 0.262557
+v 0.241616 0.377965 0.284263
+v 0.247646 0.389399 0.295697
+v 0.273162 0.396084 0.276645
+v 0.258722 0.371197 0.251758
+v 0.234554 0.366837 0.273135
+v 0.218286 0.336115 0.229860
+v 0.228775 0.346563 0.240307
+v 0.228858 0.336916 0.217477
+v 0.206865 0.326178 0.219923
+v 0.207480 0.335758 0.242056
+v 0.217450 0.345688 0.251986
+v 0.239855 0.347869 0.228430
+v 0.216884 0.326498 0.207058
+v 0.196625 0.326313 0.232611
+v 0.167497 0.299858 0.193602
+v 0.181416 0.308011 0.201755
+v 0.175609 0.298902 0.179463
+v 0.152862 0.292370 0.186114
+v 0.159205 0.301295 0.207593
+v 0.172436 0.309045 0.215343
+v 0.190203 0.307450 0.188011
+v 0.160266 0.291052 0.171612
+v 0.145295 0.294178 0.200476
+v 0.105293 0.274220 0.167964
+v 0.121694 0.279523 0.173268
+v 0.110392 0.272023 0.152584
+v 0.088442 0.269691 0.163435
+v 0.100081 0.276926 0.183224
+v 0.115670 0.281967 0.188265
+v 0.127588 0.277583 0.158144
+v 0.092726 0.267274 0.147835
+v 0.084064 0.272621 0.178920
+v 0.035913 0.260949 0.154693
+v 0.053679 0.263041 0.156786
+v 0.037653 0.258109 0.138670
+v 0.017995 0.259688 0.153432
+v 0.034136 0.264312 0.170610
+v 0.051021 0.266301 0.172599
+v 0.056278 0.260303 0.140864
+v 0.018867 0.256787 0.137347
+v 0.017104 0.263113 0.169411
+v -0.035913 0.260949 0.154693
+v -0.017995 0.259688 0.153432
+v -0.037653 0.258109 0.138670
+v -0.053678 0.263041 0.156786
+v -0.034136 0.264312 0.170610
+v -0.017104 0.263113 0.169411
+v -0.018867 0.256787 0.137347
+v -0.056278 0.260303 0.140864
+v -0.051021 0.266301 0.172599
+v -0.105293 0.274220 0.167964
+v -0.088442 0.269691 0.163435
+v -0.110392 0.272023 0.152584
+v -0.121694 0.279524 0.173268
+v -0.100080 0.276926 0.183224
+v -0.084064 0.272622 0.178920
+v -0.092726 0.267274 0.147835
+v -0.127588 0.277583 0.158144
+v -0.115670 0.281967 0.188265
+v -0.167497 0.299858 0.193602
+v -0.152862 0.292370 0.186114
+v -0.175609 0.298902 0.179463
+v -0.181416 0.308011 0.201755
+v -0.159205 0.301295 0.207593
+v -0.145295 0.294178 0.200476
+v -0.160266 0.291052 0.171612
+v -0.190203 0.307450 0.188011
+v -0.172435 0.309045 0.215343
+v -0.218286 0.336115 0.229860
+v -0.206865 0.326178 0.219923
+v -0.228858 0.336916 0.217477
+v -0.228775 0.346563 0.240307
+v -0.207480 0.335758 0.242056
+v -0.196625 0.326313 0.232611
+v -0.216884 0.326498 0.207059
+v -0.239855 0.347869 0.228430
+v -0.217450 0.345688 0.251986
+v -0.254199 0.380521 0.274266
+v -0.246770 0.368813 0.262557
+v -0.266511 0.383473 0.264033
+v -0.260543 0.392551 0.286295
+v -0.241616 0.377965 0.284263
+v -0.234554 0.366837 0.273135
+v -0.258722 0.371197 0.251758
+v -0.273162 0.396084 0.276645
+v -0.247646 0.389399 0.295697
+v -0.272789 0.430050 0.323794
+v -0.269858 0.417368 0.311112
+v -0.286001 0.435400 0.315961
+v -0.274556 0.442841 0.336586
+v -0.259286 0.425042 0.331340
+v -0.256500 0.412988 0.319286
+v -0.282928 0.422103 0.302664
+v -0.287854 0.448811 0.329372
+v -0.260965 0.437200 0.343498
+v -0.272789 0.481325 0.375070
+v -0.274556 0.468534 0.362278
+v -0.286001 0.489159 0.369720
+v -0.269858 0.494007 0.387752
+v -0.259286 0.473779 0.380077
+v -0.260965 0.461621 0.367919
+v -0.287854 0.475748 0.356309
+v -0.282928 0.502455 0.383016
+v -0.256499 0.485834 0.392132
+v -0.301681 0.573080 0.410452
+v -0.309210 0.558804 0.396176
+v -0.312775 0.584140 0.405954
+v -0.292864 0.586976 0.424348
+v -0.290264 0.562211 0.414570
+v -0.297509 0.548475 0.400834
+v -0.320581 0.569338 0.391153
+v -0.303634 0.598546 0.420361
+v -0.281781 0.575580 0.427940
+v -0.259060 0.625781 0.463153
+v -0.271508 0.613383 0.450754
+v -0.268586 0.638778 0.460593
+v -0.245505 0.637574 0.474946
+v -0.249256 0.612917 0.465276
+v -0.261233 0.600988 0.453347
+v -0.281492 0.625924 0.447738
+v -0.254533 0.651005 0.472819
+v -0.236214 0.624264 0.476623
+v -0.198783 0.668811 0.506183
+v -0.215303 0.659135 0.496507
+v -0.206093 0.683391 0.505205
+v -0.181415 0.677698 0.515069
+v -0.191261 0.654318 0.506678
+v -0.207155 0.645009 0.497368
+v -0.223220 0.673359 0.495173
+v -0.188087 0.692604 0.514419
+v -0.174550 0.662869 0.515228
+v -0.124960 0.699238 0.536609
+v -0.144425 0.692944 0.530315
+v -0.129556 0.714936 0.536751
+v -0.104962 0.704613 0.541984
+v -0.120231 0.683594 0.535953
+v -0.138959 0.677538 0.529897
+v -0.149736 0.708411 0.530225
+v -0.108822 0.720509 0.542323
+v -0.100990 0.688765 0.541125
+v -0.042622 0.714988 0.552360
+v -0.063705 0.712505 0.549876
+v -0.044189 0.731266 0.553080
+v -0.021356 0.716485 0.553856
+v -0.041009 0.698748 0.551107
+v -0.061294 0.696359 0.548718
+v -0.066048 0.728691 0.550505
+v -0.022142 0.732817 0.554632
+v -0.020548 0.700188 0.552547
+v 0.042622 0.714988 0.552360
+v 0.021356 0.716485 0.553856
+v 0.044189 0.731266 0.553080
+v 0.063705 0.712505 0.549876
+v 0.041009 0.698748 0.551107
+v 0.020548 0.700188 0.552547
+v 0.022142 0.732817 0.554632
+v 0.066048 0.728691 0.550505
+v 0.061294 0.696359 0.548718
+v 0.124961 0.699238 0.536610
+v 0.104962 0.704613 0.541984
+v 0.129556 0.714936 0.536751
+v 0.144425 0.692944 0.530315
+v 0.120232 0.683594 0.535953
+v 0.100990 0.688765 0.541125
+v 0.108822 0.720509 0.542323
+v 0.149736 0.708411 0.530225
+v 0.138960 0.677538 0.529897
+v 0.198783 0.668811 0.506183
+v 0.181415 0.677698 0.515070
+v 0.206094 0.683391 0.505205
+v 0.215303 0.659135 0.496507
+v 0.191261 0.654319 0.506678
+v 0.174550 0.662869 0.515228
+v 0.188087 0.692604 0.514419
+v 0.223221 0.673359 0.495173
+v 0.207155 0.645009 0.497368
+v 0.259060 0.625781 0.463153
+v 0.245505 0.637574 0.474946
+v 0.268586 0.638778 0.460593
+v 0.271508 0.613383 0.450754
+v 0.249256 0.612917 0.465276
+v 0.236214 0.624264 0.476623
+v 0.254534 0.651005 0.472819
+v 0.281493 0.625924 0.447738
+v 0.261233 0.600988 0.453347
+v 0.301681 0.573081 0.410452
+v 0.292865 0.586976 0.424348
+v 0.312775 0.584140 0.405954
+v 0.309211 0.558804 0.396176
+v 0.290265 0.562211 0.414570
+v 0.281781 0.575580 0.427940
+v 0.303634 0.598546 0.420361
+v 0.320581 0.569338 0.391153
+v 0.297509 0.548475 0.400834
+v 0.323744 0.514301 0.351672
+v 0.320265 0.529352 0.366723
+v 0.335649 0.523198 0.345013
+v 0.325841 0.499120 0.336491
+v 0.311492 0.505655 0.358015
+v 0.308145 0.520137 0.372496
+v 0.332043 0.538803 0.360617
+v 0.337823 0.507459 0.329273
+v 0.313510 0.491049 0.343408
+v 0.323744 0.453447 0.290819
+v 0.325841 0.468628 0.306000
+v 0.335649 0.460107 0.281921
+v 0.320265 0.438396 0.275768
+v 0.311492 0.447105 0.299464
+v 0.313510 0.461711 0.314071
+v 0.337823 0.475846 0.297660
+v 0.332043 0.444502 0.266317
+v 0.308145 0.432623 0.284983
+v 0.301681 0.394667 0.232039
+v 0.309211 0.408943 0.246315
+v 0.312775 0.399165 0.220980
+v 0.292864 0.380772 0.218143
+v 0.290265 0.390549 0.242909
+v 0.297509 0.404285 0.256645
+v 0.320581 0.413966 0.235781
+v 0.303634 0.384759 0.206573
+v 0.281781 0.377180 0.229539
+v 0.259060 0.341966 0.179338
+v 0.271508 0.354365 0.191737
+v 0.268586 0.344526 0.166341
+v 0.245505 0.330174 0.167545
+v 0.249256 0.339843 0.192202
+v 0.261233 0.351772 0.204132
+v 0.281493 0.357381 0.179196
+v 0.254534 0.332300 0.154115
+v 0.236214 0.328496 0.180856
+v 0.198783 0.298937 0.136308
+v 0.215303 0.308613 0.145984
+v 0.206094 0.299914 0.121729
+v 0.181415 0.290050 0.127422
+v 0.191261 0.298441 0.150801
+v 0.207155 0.307751 0.160111
+v 0.223221 0.309946 0.131761
+v 0.188087 0.290701 0.112515
+v 0.174550 0.289891 0.142250
+v 0.124961 0.268510 0.105882
+v 0.144425 0.274804 0.112176
+v 0.129556 0.268369 0.090183
+v 0.104962 0.263135 0.100507
+v 0.120232 0.269166 0.121526
+v 0.138960 0.275222 0.127582
+v 0.149736 0.274894 0.096709
+v 0.108822 0.262796 0.084611
+v 0.100990 0.263995 0.116354
+v 0.042622 0.252760 0.090132
+v 0.063705 0.255243 0.092615
+v 0.044189 0.252039 0.073854
+v 0.021356 0.251263 0.088635
+v 0.041009 0.254012 0.106372
+v 0.061294 0.256401 0.108761
+v 0.066048 0.254614 0.076429
+v 0.022142 0.250487 0.072302
+v 0.020548 0.252572 0.104931
+v -0.042622 0.252760 0.090132
+v -0.021356 0.251263 0.088635
+v -0.044189 0.252039 0.073854
+v -0.063705 0.255243 0.092615
+v -0.041009 0.254012 0.106372
+v -0.020548 0.252572 0.104931
+v -0.022142 0.250487 0.072302
+v -0.066048 0.254614 0.076429
+v -0.061294 0.256401 0.108761
+v -0.124961 0.268510 0.105882
+v -0.104962 0.263135 0.100507
+v -0.129556 0.268369 0.090183
+v -0.144425 0.274804 0.112176
+v -0.120231 0.269166 0.121526
+v -0.100990 0.263995 0.116354
+v -0.108822 0.262796 0.084611
+v -0.149736 0.274894 0.096709
+v -0.138960 0.275222 0.127582
+v -0.198783 0.298936 0.136308
+v -0.181415 0.290050 0.127422
+v -0.206094 0.299914 0.121729
+v -0.215303 0.308613 0.145984
+v -0.191261 0.298441 0.150801
+v -0.174550 0.289891 0.142250
+v -0.188087 0.290701 0.112515
+v -0.223221 0.309946 0.131761
+v -0.207155 0.307751 0.160111
+v -0.259060 0.341966 0.179338
+v -0.245505 0.330173 0.167545
+v -0.268586 0.344526 0.166341
+v -0.271508 0.354365 0.191737
+v -0.249256 0.339843 0.192202
+v -0.236214 0.328496 0.180856
+v -0.254534 0.332300 0.154115
+v -0.281493 0.357381 0.179196
+v -0.261233 0.351772 0.204132
+v -0.301681 0.394667 0.232039
+v -0.292865 0.380772 0.218143
+v -0.312775 0.399165 0.220980
+v -0.309211 0.408943 0.246315
+v -0.290265 0.390549 0.242909
+v -0.281781 0.377180 0.229539
+v -0.303634 0.384759 0.206573
+v -0.320581 0.413966 0.235781
+v -0.297509 0.404285 0.256645
+v -0.323744 0.453447 0.290819
+v -0.320265 0.438396 0.275768
+v -0.335649 0.460107 0.281921
+v -0.325841 0.468628 0.306000
+v -0.311492 0.447105 0.299464
+v -0.308145 0.432623 0.284983
+v -0.332043 0.444502 0.266317
+v -0.337823 0.475846 0.297661
+v -0.313510 0.461711 0.314071
+v -0.323744 0.514301 0.351672
+v -0.325841 0.499120 0.336491
+v -0.335649 0.523198 0.345013
+v -0.320265 0.529352 0.366723
+v -0.311492 0.505655 0.358015
+v -0.313510 0.491049 0.343408
+v -0.337823 0.507459 0.329274
+v -0.332043 0.538803 0.360617
+v -0.308145 0.520137 0.372496
+v -0.344002 0.618334 0.390227
+v -0.352587 0.602055 0.373948
+v -0.353688 0.630031 0.384259
+v -0.333948 0.634179 0.406071
+v -0.333947 0.606779 0.395836
+v -0.342281 0.590976 0.380033
+v -0.362515 0.613294 0.367521
+v -0.343351 0.646322 0.400549
+v -0.324187 0.622160 0.411218
+v -0.295401 0.678428 0.450320
+v -0.309596 0.664290 0.436182
+v -0.303719 0.691817 0.446044
+v -0.279945 0.691875 0.463767
+v -0.286767 0.665116 0.454173
+v -0.300546 0.651391 0.440448
+v -0.318313 0.677281 0.431508
+v -0.287828 0.705643 0.459870
+v -0.271763 0.678170 0.467227
+v -0.226669 0.727494 0.499386
+v -0.245506 0.716461 0.488353
+v -0.233052 0.742265 0.496492
+v -0.206865 0.737628 0.509520
+v -0.220044 0.712748 0.501805
+v -0.238330 0.702037 0.491094
+v -0.252419 0.730920 0.485148
+v -0.212690 0.752683 0.506911
+v -0.200818 0.722585 0.511642
+v -0.142490 0.762189 0.534081
+v -0.164685 0.755012 0.526904
+v -0.146502 0.777937 0.532164
+v -0.119687 0.768318 0.540210
+v -0.138325 0.746429 0.535486
+v -0.159872 0.739461 0.528519
+v -0.169323 0.770557 0.524785
+v -0.123057 0.784238 0.538466
+v -0.116188 0.752379 0.541436
+v -0.048601 0.780149 0.552041
+v -0.072642 0.777317 0.549209
+v -0.049969 0.796402 0.550629
+v -0.024352 0.781856 0.553748
+v -0.047180 0.763863 0.552921
+v -0.070518 0.761114 0.550172
+v -0.074687 0.793490 0.547718
+v -0.025038 0.798157 0.552384
+v -0.023640 0.765520 0.554577
+v 0.048601 0.780149 0.552041
+v 0.024352 0.781856 0.553748
+v 0.049969 0.796402 0.550629
+v 0.072642 0.777317 0.549209
+v 0.047180 0.763863 0.552921
+v 0.023640 0.765520 0.554577
+v 0.025038 0.798157 0.552384
+v 0.074687 0.793490 0.547718
+v 0.070519 0.761114 0.550172
+v 0.142490 0.762189 0.534081
+v 0.119687 0.768318 0.540210
+v 0.146502 0.777937 0.532164
+v 0.164685 0.755012 0.526904
+v 0.138325 0.746429 0.535486
+v 0.116188 0.752379 0.541436
+v 0.123057 0.784238 0.538466
+v 0.169323 0.770557 0.524785
+v 0.159872 0.739461 0.528519
+v 0.226669 0.727494 0.499386
+v 0.206865 0.737628 0.509520
+v 0.233052 0.742265 0.496492
+v 0.245506 0.716461 0.488353
+v 0.220044 0.712748 0.501805
+v 0.200818 0.722585 0.511642
+v 0.212690 0.752683 0.506911
+v 0.252419 0.730920 0.485148
+v 0.238330 0.702037 0.491094
+v 0.295401 0.678428 0.450320
+v 0.279945 0.691875 0.463767
+v 0.303719 0.691817 0.446044
+v 0.309596 0.664290 0.436182
+v 0.286767 0.665116 0.454173
+v 0.271763 0.678170 0.467227
+v 0.287828 0.705643 0.459870
+v 0.318314 0.677281 0.431508
+v 0.300547 0.651391 0.440448
+v 0.344002 0.618334 0.390226
+v 0.333948 0.634179 0.406071
+v 0.353688 0.630031 0.384259
+v 0.352587 0.602055 0.373948
+v 0.333947 0.606779 0.395836
+v 0.324187 0.622160 0.411217
+v 0.343352 0.646322 0.400549
+v 0.362515 0.613294 0.367521
+v 0.342281 0.590976 0.380033
+v 0.369159 0.551309 0.323201
+v 0.365193 0.568471 0.340363
+v 0.379554 0.561118 0.315345
+v 0.371550 0.533998 0.305890
+v 0.358369 0.541712 0.330769
+v 0.354518 0.558373 0.347430
+v 0.375476 0.578764 0.332991
+v 0.382013 0.543320 0.297548
+v 0.360690 0.524907 0.313965
+v 0.369159 0.481919 0.253811
+v 0.371550 0.499229 0.271121
+v 0.379554 0.489774 0.244001
+v 0.365193 0.464756 0.236648
+v 0.358369 0.474350 0.263407
+v 0.360690 0.491155 0.280212
+v 0.382013 0.507572 0.261799
+v 0.375476 0.472128 0.226356
+v 0.354518 0.457689 0.246747
+v 0.344002 0.414893 0.186785
+v 0.352587 0.431172 0.203064
+v 0.353688 0.420861 0.175088
+v 0.333948 0.399048 0.170940
+v 0.333947 0.409284 0.198341
+v 0.342281 0.425087 0.214144
+v 0.362515 0.437598 0.191826
+v 0.343352 0.404570 0.158798
+v 0.324187 0.393902 0.182959
+v 0.295401 0.354799 0.126691
+v 0.309596 0.368937 0.140829
+v 0.303719 0.359075 0.113303
+v 0.279945 0.341352 0.113244
+v 0.286767 0.350946 0.140004
+v 0.300547 0.364671 0.153728
+v 0.318314 0.373611 0.127839
+v 0.287828 0.345249 0.099477
+v 0.271763 0.337892 0.126949
+v 0.226669 0.305733 0.077625
+v 0.245506 0.316767 0.088659
+v 0.233052 0.308627 0.062855
+v 0.206865 0.295600 0.067492
+v 0.220044 0.303314 0.092372
+v 0.238330 0.314025 0.103083
+v 0.252419 0.319971 0.074199
+v 0.212690 0.298208 0.052436
+v 0.200818 0.293477 0.082534
+v 0.142490 0.271038 0.042930
+v 0.164685 0.278215 0.050107
+v 0.146503 0.272955 0.027183
+v 0.119687 0.264909 0.036801
+v 0.138325 0.269633 0.058691
+v 0.159872 0.276601 0.065658
+v 0.169323 0.280334 0.034562
+v 0.123057 0.266654 0.020881
+v 0.116188 0.263684 0.052741
+v 0.048601 0.253078 0.024971
+v 0.072642 0.255910 0.027802
+v 0.049969 0.254490 0.008718
+v 0.024352 0.251372 0.023264
+v 0.047180 0.252199 0.041256
+v 0.070519 0.254948 0.044005
+v 0.074687 0.257401 0.011629
+v 0.025038 0.252735 0.006963
+v 0.023640 0.250542 0.039599
+v -0.048601 0.253078 0.024971
+v -0.024352 0.251372 0.023264
+v -0.049969 0.254490 0.008718
+v -0.072642 0.255910 0.027802
+v -0.047180 0.252199 0.041256
+v -0.023640 0.250542 0.039599
+v -0.025038 0.252735 0.006963
+v -0.074687 0.257401 0.011629
+v -0.070519 0.254948 0.044005
+v -0.142490 0.271038 0.042930
+v -0.119687 0.264909 0.036801
+v -0.146503 0.272955 0.027183
+v -0.164685 0.278215 0.050107
+v -0.138325 0.269633 0.058691
+v -0.116188 0.263684 0.052741
+v -0.123057 0.266654 0.020881
+v -0.169323 0.280334 0.034562
+v -0.159872 0.276601 0.065658
+v -0.226669 0.305733 0.077625
+v -0.206865 0.295600 0.067492
+v -0.233052 0.308627 0.062855
+v -0.245506 0.316767 0.088659
+v -0.220044 0.303314 0.092372
+v -0.200818 0.293477 0.082534
+v -0.212690 0.298208 0.052436
+v -0.252419 0.319971 0.074199
+v -0.238330 0.314025 0.103083
+v -0.295401 0.354799 0.126691
+v -0.279945 0.341352 0.113244
+v -0.303719 0.359075 0.113303
+v -0.309596 0.368937 0.140829
+v -0.286767 0.350946 0.140004
+v -0.271763 0.337892 0.126949
+v -0.287828 0.345249 0.099477
+v -0.318314 0.373611 0.127839
+v -0.300547 0.364671 0.153728
+v -0.344002 0.414893 0.186785
+v -0.333948 0.399048 0.170940
+v -0.353688 0.420861 0.175088
+v -0.352587 0.431172 0.203064
+v -0.333947 0.409284 0.198341
+v -0.324187 0.393902 0.182959
+v -0.343352 0.404570 0.158798
+v -0.362516 0.437598 0.191826
+v -0.342281 0.425087 0.214144
+v -0.369159 0.481919 0.253811
+v -0.365193 0.464756 0.236648
+v -0.379554 0.489774 0.244002
+v -0.371550 0.499229 0.271121
+v -0.358369 0.474350 0.263407
+v -0.354518 0.457689 0.246747
+v -0.375476 0.472128 0.226356
+v -0.382013 0.507572 0.261800
+v -0.360690 0.491155 0.280212
+v -0.369159 0.551309 0.323201
+v -0.371550 0.533998 0.305890
+v -0.379554 0.561118 0.315346
+v -0.365193 0.568471 0.340363
+v -0.358369 0.541712 0.330769
+v -0.360690 0.524907 0.313965
+v -0.382012 0.543320 0.297548
+v -0.375476 0.578764 0.332991
+v -0.354518 0.558373 0.347430
+v -0.380436 0.665841 0.364267
+v -0.389930 0.647838 0.346264
+v -0.388549 0.677975 0.356931
+v -0.369317 0.683364 0.381790
+v -0.371915 0.653797 0.371272
+v -0.381197 0.636197 0.353672
+v -0.398247 0.659588 0.338544
+v -0.377194 0.695872 0.374828
+v -0.361046 0.670927 0.388402
+v -0.326688 0.732299 0.430725
+v -0.342386 0.716664 0.415090
+v -0.333655 0.745851 0.424807
+v -0.309595 0.747171 0.445597
+v -0.319371 0.718767 0.436242
+v -0.334717 0.703482 0.420957
+v -0.349688 0.729882 0.408838
+v -0.316198 0.761039 0.439996
+v -0.302661 0.733305 0.450780
+v -0.250676 0.786562 0.484988
+v -0.271508 0.774360 0.472786
+v -0.256022 0.801271 0.480227
+v -0.228774 0.797769 0.496195
+v -0.245062 0.771814 0.489289
+v -0.265427 0.759886 0.477360
+v -0.277299 0.788809 0.467765
+v -0.233653 0.812717 0.491673
+v -0.223650 0.782770 0.500245
+v -0.157582 0.824932 0.523358
+v -0.182128 0.816995 0.515421
+v -0.160942 0.840459 0.519415
+v -0.132363 0.831710 0.530136
+v -0.154052 0.809325 0.526800
+v -0.178049 0.801565 0.519040
+v -0.186012 0.832353 0.511309
+v -0.135186 0.847382 0.526338
+v -0.129398 0.815951 0.533426
+v -0.053748 0.844794 0.543220
+v -0.080335 0.841662 0.540088
+v -0.054894 0.860744 0.539700
+v -0.026931 0.846681 0.545107
+v -0.052544 0.828742 0.546216
+v -0.078536 0.825680 0.543155
+v -0.082049 0.857546 0.536502
+v -0.027506 0.862672 0.541628
+v -0.026328 0.830587 0.548062
+v 0.053748 0.844794 0.543220
+v 0.026931 0.846681 0.545107
+v 0.054895 0.860744 0.539700
+v 0.080336 0.841662 0.540088
+v 0.052544 0.828742 0.546216
+v 0.026328 0.830587 0.548062
+v 0.027506 0.862672 0.541628
+v 0.082049 0.857546 0.536502
+v 0.078536 0.825680 0.543155
+v 0.157582 0.824932 0.523358
+v 0.132363 0.831710 0.530136
+v 0.160943 0.840459 0.519415
+v 0.182128 0.816995 0.515421
+v 0.154052 0.809325 0.526800
+v 0.129399 0.815951 0.533426
+v 0.135186 0.847382 0.526338
+v 0.186012 0.832353 0.511309
+v 0.178049 0.801565 0.519040
+v 0.250676 0.786562 0.484988
+v 0.228774 0.797769 0.496195
+v 0.256023 0.801271 0.480227
+v 0.271508 0.774360 0.472786
+v 0.245062 0.771815 0.489289
+v 0.223650 0.782770 0.500245
+v 0.233654 0.812717 0.491673
+v 0.277299 0.788809 0.467765
+v 0.265427 0.759886 0.477360
+v 0.326688 0.732299 0.430725
+v 0.309595 0.747171 0.445597
+v 0.333655 0.745851 0.424807
+v 0.342386 0.716664 0.415090
+v 0.319371 0.718767 0.436242
+v 0.302661 0.733305 0.450780
+v 0.316198 0.761039 0.439996
+v 0.349688 0.729882 0.408838
+v 0.334717 0.703482 0.420956
+v 0.380436 0.665841 0.364267
+v 0.369317 0.683364 0.381790
+v 0.388550 0.677975 0.356931
+v 0.389931 0.647838 0.346264
+v 0.371915 0.653797 0.371272
+v 0.361046 0.670927 0.388402
+v 0.377194 0.695872 0.374828
+v 0.398247 0.659588 0.338544
+v 0.381197 0.636197 0.353672
+v 0.408258 0.591716 0.290142
+v 0.403871 0.610697 0.309123
+v 0.416965 0.602270 0.281226
+v 0.410902 0.572573 0.270998
+v 0.399114 0.581333 0.298807
+v 0.394826 0.599888 0.317362
+v 0.412485 0.621655 0.300611
+v 0.419666 0.582717 0.261674
+v 0.401699 0.562617 0.280092
+v 0.408258 0.514977 0.213403
+v 0.410902 0.534121 0.232547
+v 0.416965 0.523894 0.202850
+v 0.403871 0.495997 0.194423
+v 0.399114 0.506312 0.223787
+v 0.401699 0.525027 0.242502
+v 0.419666 0.543446 0.222402
+v 0.412485 0.504509 0.183465
+v 0.394826 0.487757 0.205232
+v 0.380436 0.440852 0.139278
+v 0.389931 0.458855 0.157281
+v 0.388550 0.448188 0.127144
+v 0.369317 0.423330 0.121755
+v 0.371915 0.433848 0.151322
+v 0.381197 0.451447 0.168922
+v 0.398247 0.466575 0.145531
+v 0.377194 0.430291 0.109248
+v 0.361046 0.416717 0.134192
+v 0.326688 0.374394 0.072820
+v 0.342386 0.390029 0.088455
+v 0.333655 0.380312 0.059269
+v 0.309595 0.359523 0.057949
+v 0.319371 0.368878 0.086353
+v 0.334718 0.384163 0.101638
+v 0.349688 0.396281 0.075237
+v 0.316198 0.365124 0.044080
+v 0.302661 0.354339 0.071814
+v 0.250676 0.320131 0.018557
+v 0.271508 0.332333 0.030759
+v 0.256023 0.324892 0.003848
+v 0.228774 0.308924 0.007350
+v 0.245062 0.315830 0.033305
+v 0.265427 0.327759 0.045234
+v 0.277299 0.337354 0.016311
+v 0.233654 0.313446 -0.007597
+v 0.223650 0.304874 0.022349
+v 0.157582 0.281761 -0.019813
+v 0.182128 0.289699 -0.011875
+v 0.160943 0.285704 -0.035340
+v 0.132363 0.274983 -0.026591
+v 0.154052 0.278320 -0.004205
+v 0.178049 0.286079 0.003554
+v 0.186012 0.293811 -0.027233
+v 0.135186 0.278781 -0.042262
+v 0.129399 0.271693 -0.010832
+v 0.053748 0.261900 -0.039674
+v 0.080336 0.265031 -0.036543
+v 0.054894 0.265419 -0.055625
+v 0.026931 0.260012 -0.041562
+v 0.052544 0.258903 -0.023622
+v 0.078536 0.261964 -0.020561
+v 0.082049 0.268617 -0.052426
+v 0.027506 0.263491 -0.057553
+v 0.026328 0.257058 -0.025467
+v -0.053748 0.261900 -0.039674
+v -0.026931 0.260012 -0.041562
+v -0.054895 0.265419 -0.055625
+v -0.080336 0.265031 -0.036543
+v -0.052544 0.258903 -0.023622
+v -0.026328 0.257058 -0.025467
+v -0.027506 0.263491 -0.057553
+v -0.082049 0.268617 -0.052426
+v -0.078536 0.261964 -0.020561
+v -0.157582 0.281761 -0.019813
+v -0.132363 0.274983 -0.026591
+v -0.160943 0.285704 -0.035340
+v -0.182128 0.289699 -0.011875
+v -0.154052 0.278320 -0.004205
+v -0.129399 0.271693 -0.010832
+v -0.135186 0.278781 -0.042262
+v -0.186012 0.293811 -0.027233
+v -0.178049 0.286079 0.003554
+v -0.250676 0.320131 0.018557
+v -0.228774 0.308924 0.007350
+v -0.256023 0.324892 0.003848
+v -0.271508 0.332333 0.030759
+v -0.245062 0.315830 0.033305
+v -0.223651 0.304874 0.022349
+v -0.233654 0.313446 -0.007597
+v -0.277299 0.337354 0.016311
+v -0.265427 0.327759 0.045234
+v -0.326688 0.374394 0.072820
+v -0.309595 0.359523 0.057949
+v -0.333655 0.380312 0.059269
+v -0.342386 0.390029 0.088455
+v -0.319371 0.368878 0.086353
+v -0.302661 0.354339 0.071814
+v -0.316198 0.365124 0.044080
+v -0.349688 0.396281 0.075238
+v -0.334718 0.384163 0.101638
+v -0.380436 0.440852 0.139278
+v -0.369318 0.423329 0.121756
+v -0.388550 0.448188 0.127144
+v -0.389931 0.458855 0.157282
+v -0.371915 0.433847 0.151322
+v -0.361046 0.416717 0.134192
+v -0.377194 0.430291 0.109248
+v -0.398247 0.466575 0.145531
+v -0.381197 0.451447 0.168922
+v -0.408258 0.514977 0.213403
+v -0.403871 0.495997 0.194423
+v -0.416965 0.523894 0.202850
+v -0.410902 0.534121 0.232547
+v -0.399114 0.506312 0.223787
+v -0.394826 0.487757 0.205232
+v -0.412485 0.504509 0.183465
+v -0.419666 0.543446 0.222402
+v -0.401699 0.525027 0.242502
+v -0.408258 0.591716 0.290142
+v -0.410902 0.572573 0.270999
+v -0.416965 0.602270 0.281226
+v -0.403871 0.610697 0.309123
+v -0.399114 0.581333 0.298808
+v -0.401699 0.562617 0.280092
+v -0.419666 0.582717 0.261674
+v -0.412485 0.621655 0.300611
+v -0.394826 0.599888 0.317363
+v -0.410361 0.714788 0.333018
+v -0.420602 0.695369 0.313599
+v -0.416763 0.727152 0.324440
+v -0.398368 0.733689 0.351919
+v -0.403520 0.702461 0.341298
+v -0.413591 0.683366 0.322203
+v -0.427164 0.707429 0.304718
+v -0.404582 0.746348 0.343636
+v -0.391727 0.721048 0.359885
+v -0.352385 0.786474 0.404704
+v -0.369318 0.769608 0.387838
+v -0.357882 0.799956 0.397244
+v -0.333948 0.802515 0.420745
+v -0.346510 0.772952 0.411789
+v -0.363161 0.756368 0.395205
+v -0.375079 0.782827 0.380116
+v -0.339157 0.816247 0.413536
+v -0.328381 0.788726 0.427563
+v -0.270394 0.845005 0.463235
+v -0.292865 0.831843 0.450073
+v -0.274613 0.859400 0.456689
+v -0.246770 0.857093 0.475323
+v -0.265887 0.830508 0.469345
+v -0.287983 0.817565 0.456402
+v -0.297434 0.846033 0.443321
+v -0.250619 0.871677 0.468965
+v -0.242656 0.842395 0.481231
+v -0.169977 0.886393 0.504623
+v -0.196454 0.877831 0.496061
+v -0.172629 0.901434 0.498722
+v -0.142775 0.893704 0.511934
+v -0.167143 0.871206 0.510043
+v -0.193179 0.862787 0.501624
+v -0.199519 0.892739 0.490027
+v -0.145002 0.908859 0.506147
+v -0.140395 0.878395 0.517232
+v -0.057976 0.907817 0.526047
+v -0.086655 0.904439 0.522669
+v -0.058880 0.923192 0.520480
+v -0.029050 0.909853 0.528083
+v -0.057009 0.892273 0.531109
+v -0.085210 0.888951 0.527788
+v -0.088006 0.919761 0.517050
+v -0.029503 0.925260 0.522548
+v -0.028566 0.894275 0.533112
+v 0.057976 0.907817 0.526047
+v 0.029050 0.909853 0.528083
+v 0.058880 0.923192 0.520480
+v 0.086655 0.904439 0.522669
+v 0.057010 0.892272 0.531109
+v 0.028566 0.894275 0.533112
+v 0.029503 0.925260 0.522548
+v 0.088007 0.919761 0.517050
+v 0.085210 0.888951 0.527788
+v 0.169977 0.886393 0.504623
+v 0.142775 0.893704 0.511934
+v 0.172629 0.901434 0.498722
+v 0.196454 0.877831 0.496061
+v 0.167143 0.871206 0.510043
+v 0.140395 0.878395 0.517232
+v 0.145002 0.908859 0.506147
+v 0.199519 0.892739 0.490027
+v 0.193179 0.862787 0.501624
+v 0.270394 0.845005 0.463235
+v 0.246770 0.857093 0.475323
+v 0.274613 0.859400 0.456689
+v 0.292865 0.831843 0.450073
+v 0.265887 0.830508 0.469345
+v 0.242656 0.842395 0.481231
+v 0.250619 0.871677 0.468965
+v 0.297434 0.846033 0.443321
+v 0.287983 0.817565 0.456402
+v 0.352385 0.786474 0.404704
+v 0.333948 0.802515 0.420745
+v 0.357882 0.799956 0.397244
+v 0.369318 0.769608 0.387838
+v 0.346511 0.772952 0.411789
+v 0.328381 0.788726 0.427563
+v 0.339157 0.816247 0.413536
+v 0.375079 0.782827 0.380116
+v 0.363161 0.756368 0.395205
+v 0.410361 0.714788 0.333018
+v 0.398368 0.733689 0.351919
+v 0.416763 0.727152 0.324440
+v 0.420602 0.695369 0.313599
+v 0.403520 0.702462 0.341298
+v 0.391727 0.721048 0.359885
+v 0.404582 0.746348 0.343636
+v 0.427164 0.707429 0.304718
+v 0.413591 0.683366 0.322203
+v 0.440372 0.634832 0.253063
+v 0.435640 0.655306 0.273536
+v 0.447241 0.645949 0.243237
+v 0.443224 0.614183 0.232413
+v 0.433030 0.623839 0.262676
+v 0.428378 0.643971 0.282808
+v 0.442436 0.666741 0.264030
+v 0.450138 0.624977 0.222266
+v 0.435835 0.603534 0.242371
+v 0.440372 0.552057 0.170287
+v 0.443224 0.572706 0.190937
+v 0.447241 0.561882 0.159170
+v 0.435640 0.531584 0.149814
+v 0.433030 0.542443 0.181280
+v 0.435835 0.562749 0.201586
+v 0.450138 0.582854 0.180142
+v 0.442436 0.541089 0.138378
+v 0.428378 0.522311 0.161148
+v 0.410361 0.472102 0.090332
+v 0.420602 0.491521 0.109751
+v 0.416763 0.480679 0.077968
+v 0.398368 0.453200 0.071430
+v 0.403520 0.463821 0.102658
+v 0.413591 0.482916 0.121753
+v 0.427164 0.500401 0.097690
+v 0.404583 0.461483 0.058772
+v 0.391727 0.445235 0.084072
+v 0.352385 0.400416 0.018646
+v 0.369318 0.417281 0.035511
+v 0.357882 0.407875 0.005164
+v 0.333948 0.384374 0.002605
+v 0.346511 0.393330 0.032167
+v 0.363161 0.409914 0.048751
+v 0.375079 0.425003 0.022292
+v 0.339157 0.391584 -0.011128
+v 0.328381 0.377556 0.016393
+v 0.270394 0.341884 -0.039885
+v 0.292865 0.355046 -0.026724
+v 0.274613 0.348431 -0.054281
+v 0.246770 0.329796 -0.051974
+v 0.265887 0.335774 -0.025388
+v 0.287983 0.348717 -0.012446
+v 0.297434 0.361798 -0.040913
+v 0.250619 0.336154 -0.066557
+v 0.242656 0.323888 -0.037275
+v 0.169977 0.300496 -0.081273
+v 0.196454 0.309058 -0.072712
+v 0.172629 0.306397 -0.096314
+v 0.142775 0.293185 -0.088585
+v 0.167143 0.295077 -0.066086
+v 0.193179 0.303495 -0.057668
+v 0.199519 0.315092 -0.087619
+v 0.145002 0.298972 -0.103740
+v 0.140395 0.287887 -0.073276
+v 0.057976 0.279072 -0.102697
+v 0.086655 0.282450 -0.099319
+v 0.058880 0.284639 -0.118072
+v 0.029050 0.277036 -0.104733
+v 0.057010 0.274010 -0.087153
+v 0.085210 0.277331 -0.083832
+v 0.088007 0.288070 -0.114642
+v 0.029503 0.282571 -0.120140
+v 0.028566 0.272008 -0.089155
+v -0.057976 0.279072 -0.102697
+v -0.029050 0.277036 -0.104733
+v -0.058880 0.284639 -0.118072
+v -0.086655 0.282450 -0.099319
+v -0.057010 0.274010 -0.087153
+v -0.028566 0.272008 -0.089155
+v -0.029503 0.282571 -0.120140
+v -0.088007 0.288070 -0.114642
+v -0.085210 0.277331 -0.083832
+v -0.169977 0.300496 -0.081273
+v -0.142775 0.293185 -0.088584
+v -0.172629 0.306397 -0.096314
+v -0.196454 0.309058 -0.072712
+v -0.167144 0.295077 -0.066086
+v -0.140395 0.287887 -0.073276
+v -0.145002 0.298972 -0.103740
+v -0.199519 0.315092 -0.087619
+v -0.193179 0.303495 -0.057668
+v -0.270395 0.341884 -0.039885
+v -0.246770 0.329796 -0.051974
+v -0.274613 0.348431 -0.054281
+v -0.292865 0.355046 -0.026723
+v -0.265887 0.335774 -0.025388
+v -0.242656 0.323888 -0.037275
+v -0.250619 0.336154 -0.066557
+v -0.297434 0.361798 -0.040913
+v -0.287983 0.348717 -0.012446
+v -0.352385 0.400416 0.018646
+v -0.333948 0.384374 0.002605
+v -0.357882 0.407875 0.005164
+v -0.369318 0.417281 0.035511
+v -0.346511 0.393330 0.032167
+v -0.328381 0.377556 0.016393
+v -0.339158 0.391584 -0.011128
+v -0.375080 0.425003 0.022292
+v -0.363161 0.409914 0.048751
+v -0.410361 0.472101 0.090332
+v -0.398368 0.453200 0.071431
+v -0.416763 0.480679 0.077968
+v -0.420603 0.491521 0.109751
+v -0.403520 0.463821 0.102658
+v -0.391727 0.445235 0.084072
+v -0.404583 0.461483 0.058772
+v -0.427164 0.500401 0.097690
+v -0.413591 0.482916 0.121753
+v -0.440372 0.552057 0.170287
+v -0.435640 0.531584 0.149814
+v -0.447242 0.561882 0.159170
+v -0.443224 0.572706 0.190937
+v -0.433030 0.542443 0.181280
+v -0.428378 0.522311 0.161149
+v -0.442436 0.541089 0.138378
+v -0.450138 0.582854 0.180142
+v -0.435835 0.562749 0.201586
+v -0.440371 0.634832 0.253063
+v -0.443224 0.614183 0.232413
+v -0.447241 0.645949 0.243238
+v -0.435640 0.655306 0.273536
+v -0.433030 0.623839 0.262676
+v -0.435835 0.603534 0.242371
+v -0.450138 0.624977 0.222266
+v -0.442436 0.666741 0.264030
+v -0.428377 0.643971 0.282808
+v -0.433264 0.764337 0.297014
+v -0.444078 0.743834 0.276511
+v -0.437845 0.776719 0.287341
+v -0.420602 0.784293 0.316970
+v -0.428220 0.751939 0.306428
+v -0.438908 0.731675 0.286164
+v -0.448772 0.755999 0.266621
+v -0.425048 0.796886 0.307508
+v -0.415705 0.771663 0.326152
+v -0.372052 0.840024 0.372701
+v -0.389931 0.822217 0.354894
+v -0.375986 0.853206 0.363828
+v -0.352586 0.856960 0.389637
+v -0.367721 0.826745 0.381234
+v -0.385391 0.809146 0.363635
+v -0.394053 0.835211 0.345833
+v -0.356314 0.870322 0.380943
+v -0.348482 0.843485 0.397974
+v -0.285486 0.901822 0.434499
+v -0.309211 0.887925 0.420602
+v -0.288504 0.915657 0.426279
+v -0.260543 0.914585 0.447262
+v -0.282162 0.887824 0.442313
+v -0.305611 0.874089 0.428578
+v -0.312480 0.901614 0.412235
+v -0.263297 0.928555 0.439177
+v -0.257510 0.900438 0.454927
+v -0.179464 0.945520 0.478197
+v -0.207419 0.936480 0.469157
+v -0.181361 0.959817 0.470439
+v -0.150743 0.953239 0.485916
+v -0.177375 0.931013 0.485502
+v -0.205004 0.922079 0.476568
+v -0.209611 0.950682 0.461304
+v -0.152337 0.967618 0.478240
+v -0.148989 0.938642 0.493131
+v -0.061212 0.968139 0.500816
+v -0.091491 0.964573 0.497250
+v -0.061859 0.982676 0.493298
+v -0.030671 0.970289 0.502966
+v -0.060499 0.953369 0.507858
+v -0.090426 0.949844 0.504333
+v -0.092458 0.979072 0.489693
+v -0.030995 0.984848 0.495470
+v -0.030314 0.955494 0.509983
+v 0.061212 0.968139 0.500816
+v 0.030671 0.970289 0.502966
+v 0.061859 0.982676 0.493297
+v 0.091491 0.964573 0.497250
+v 0.060499 0.953369 0.507858
+v 0.030314 0.955494 0.509983
+v 0.030995 0.984848 0.495470
+v 0.092458 0.979072 0.489693
+v 0.090426 0.949844 0.504333
+v 0.179464 0.945520 0.478197
+v 0.150743 0.953239 0.485916
+v 0.181361 0.959817 0.470439
+v 0.207419 0.936480 0.469157
+v 0.177375 0.931013 0.485502
+v 0.148989 0.938642 0.493131
+v 0.152337 0.967618 0.478240
+v 0.209611 0.950682 0.461304
+v 0.205004 0.922079 0.476568
+v 0.285486 0.901822 0.434499
+v 0.260543 0.914585 0.447262
+v 0.288504 0.915657 0.426279
+v 0.309211 0.887925 0.420602
+v 0.282162 0.887824 0.442313
+v 0.257510 0.900438 0.454927
+v 0.263297 0.928555 0.439177
+v 0.312480 0.901614 0.412235
+v 0.305611 0.874089 0.428578
+v 0.372053 0.840024 0.372701
+v 0.352586 0.856960 0.389637
+v 0.375986 0.853206 0.363828
+v 0.389931 0.822217 0.354894
+v 0.367721 0.826745 0.381234
+v 0.348482 0.843485 0.397974
+v 0.356314 0.870322 0.380943
+v 0.394053 0.835211 0.345833
+v 0.385391 0.809146 0.363635
+v 0.433264 0.764337 0.297014
+v 0.420602 0.784293 0.316970
+v 0.437845 0.776719 0.287340
+v 0.444078 0.743834 0.276511
+v 0.428221 0.751939 0.306428
+v 0.415706 0.771663 0.326152
+v 0.425048 0.796886 0.307508
+v 0.448772 0.755999 0.266621
+v 0.438908 0.731675 0.286164
+v 0.464950 0.679919 0.212596
+v 0.459954 0.701535 0.234212
+v 0.469865 0.691409 0.202030
+v 0.467961 0.658117 0.190794
+v 0.459537 0.668504 0.222993
+v 0.454600 0.689868 0.244357
+v 0.464817 0.713253 0.223875
+v 0.472908 0.669376 0.179997
+v 0.462514 0.646956 0.201445
+v 0.464950 0.592523 0.125200
+v 0.467961 0.614326 0.147003
+v 0.469865 0.603089 0.113711
+v 0.459954 0.570908 0.103585
+v 0.459537 0.582126 0.136615
+v 0.462514 0.603674 0.158164
+v 0.472908 0.625122 0.135743
+v 0.464817 0.581245 0.091866
+v 0.454600 0.560762 0.115251
+v 0.433264 0.508105 0.040783
+v 0.444078 0.528609 0.061286
+v 0.437845 0.517779 0.028400
+v 0.420602 0.488149 0.020826
+v 0.428221 0.498691 0.053180
+v 0.438908 0.518955 0.073444
+v 0.448772 0.538499 0.049120
+v 0.425048 0.497612 0.008233
+v 0.415706 0.478967 0.033456
+v 0.372053 0.432419 -0.034904
+v 0.389931 0.450225 -0.017098
+v 0.375986 0.441292 -0.048087
+v 0.352587 0.415482 -0.051841
+v 0.367721 0.423885 -0.021626
+v 0.385391 0.441484 -0.004027
+v 0.394053 0.459287 -0.030092
+v 0.356314 0.424176 -0.065202
+v 0.348482 0.407146 -0.038365
+v 0.285486 0.370620 -0.096702
+v 0.309211 0.384517 -0.082806
+v 0.288504 0.378840 -0.110538
+v 0.260543 0.357858 -0.109465
+v 0.282163 0.362806 -0.082704
+v 0.305611 0.376541 -0.068970
+v 0.312480 0.392884 -0.096495
+v 0.263297 0.365942 -0.123436
+v 0.257510 0.350192 -0.095319
+v 0.179464 0.326923 -0.140400
+v 0.207419 0.335962 -0.131361
+v 0.181361 0.334680 -0.154698
+v 0.150743 0.319203 -0.148120
+v 0.177375 0.319617 -0.125894
+v 0.205004 0.328552 -0.116959
+v 0.209611 0.343815 -0.145563
+v 0.152337 0.326880 -0.162499
+v 0.148989 0.311988 -0.133523
+v 0.061212 0.304303 -0.163020
+v 0.091491 0.307869 -0.159454
+v 0.061859 0.311822 -0.177557
+v 0.030671 0.302153 -0.165170
+v 0.060499 0.297261 -0.148250
+v 0.090426 0.300786 -0.144725
+v 0.092458 0.315426 -0.173952
+v 0.030995 0.309649 -0.179729
+v 0.030314 0.295136 -0.150375
+v -0.061212 0.304303 -0.163020
+v -0.030671 0.302153 -0.165170
+v -0.061859 0.311822 -0.177557
+v -0.091491 0.307869 -0.159453
+v -0.060499 0.297261 -0.148250
+v -0.030314 0.295136 -0.150375
+v -0.030996 0.309649 -0.179729
+v -0.092458 0.315426 -0.173952
+v -0.090426 0.300786 -0.144725
+v -0.179464 0.326923 -0.140400
+v -0.150743 0.319203 -0.148120
+v -0.181361 0.334680 -0.154698
+v -0.207419 0.335962 -0.131361
+v -0.177375 0.319617 -0.125894
+v -0.148989 0.311988 -0.133523
+v -0.152337 0.326880 -0.162499
+v -0.209611 0.343815 -0.145563
+v -0.205004 0.328552 -0.116959
+v -0.285486 0.370620 -0.096702
+v -0.260543 0.357858 -0.109465
+v -0.288504 0.378840 -0.110538
+v -0.309211 0.384517 -0.082806
+v -0.282163 0.362806 -0.082704
+v -0.257510 0.350192 -0.095319
+v -0.263297 0.365942 -0.123436
+v -0.312480 0.392884 -0.096495
+v -0.305611 0.376541 -0.068970
+v -0.372053 0.432418 -0.034904
+v -0.352587 0.415482 -0.051841
+v -0.375986 0.441292 -0.048087
+v -0.389931 0.450225 -0.017098
+v -0.367721 0.423885 -0.021626
+v -0.348482 0.407146 -0.038365
+v -0.356314 0.424176 -0.065202
+v -0.394053 0.459286 -0.030092
+v -0.385391 0.441484 -0.004026
+v -0.433265 0.508105 0.040783
+v -0.420602 0.488149 0.020826
+v -0.437845 0.517779 0.028401
+v -0.444078 0.528609 0.061286
+v -0.428221 0.498691 0.053180
+v -0.415706 0.478967 0.033456
+v -0.425049 0.497612 0.008233
+v -0.448772 0.538499 0.049120
+v -0.438908 0.518955 0.073444
+v -0.464950 0.592523 0.125200
+v -0.459954 0.570907 0.103585
+v -0.469865 0.603089 0.113711
+v -0.467961 0.614326 0.147003
+v -0.459537 0.582126 0.136615
+v -0.454600 0.560762 0.115251
+v -0.464817 0.581245 0.091866
+v -0.472909 0.625122 0.135744
+v -0.462514 0.603674 0.158164
+v -0.464950 0.679919 0.212596
+v -0.467961 0.658117 0.190794
+v -0.469865 0.691409 0.202030
+v -0.459954 0.701535 0.234212
+v -0.459537 0.668504 0.222993
+v -0.462514 0.646956 0.201445
+v -0.472908 0.669376 0.179998
+v -0.464817 0.713253 0.223875
+v -0.454600 0.689868 0.244358
+v -0.448755 0.813640 0.256871
+v -0.459954 0.792404 0.235635
+v -0.451435 0.825829 0.246268
+v -0.435639 0.834310 0.277541
+v -0.445594 0.801384 0.267258
+v -0.456715 0.780297 0.246172
+v -0.462702 0.804466 0.224905
+v -0.438242 0.846622 0.267061
+v -0.432571 0.821908 0.287782
+v -0.385354 0.892033 0.335264
+v -0.403872 0.873590 0.316821
+v -0.387656 0.904690 0.325129
+v -0.365192 0.909576 0.352806
+v -0.382640 0.879225 0.345099
+v -0.401027 0.860911 0.326786
+v -0.406284 0.886137 0.306576
+v -0.367374 0.922337 0.342776
+v -0.362620 0.896643 0.362518
+v -0.295693 0.956041 0.399271
+v -0.320266 0.941648 0.384878
+v -0.297459 0.969080 0.389519
+v -0.269858 0.969260 0.412490
+v -0.293610 0.942782 0.408656
+v -0.318010 0.928490 0.394364
+v -0.322179 0.954601 0.375039
+v -0.271470 0.982378 0.402817
+v -0.267957 0.955908 0.421782
+v -0.185880 1.001301 0.444531
+v -0.214834 0.991939 0.435169
+v -0.186991 1.014611 0.435049
+v -0.156133 1.009296 0.452527
+v -0.184571 0.987723 0.453597
+v -0.213321 0.978426 0.444300
+v -0.216118 1.005192 0.425631
+v -0.157065 1.022654 0.443092
+v -0.155033 0.995662 0.461536
+v -0.063400 1.024729 0.467960
+v -0.094762 1.021036 0.464266
+v -0.063779 1.038179 0.458617
+v -0.031768 1.026956 0.470186
+v -0.062954 1.010986 0.476861
+v -0.094095 1.007318 0.473193
+v -0.095328 1.034463 0.454901
+v -0.031958 1.040419 0.460857
+v -0.031544 1.013197 0.479071
+v 0.063400 1.024730 0.467960
+v 0.031768 1.026956 0.470186
+v 0.063779 1.038179 0.458617
+v 0.094762 1.021036 0.464266
+v 0.062954 1.010986 0.476861
+v 0.031544 1.013197 0.479071
+v 0.031958 1.040419 0.460857
+v 0.095328 1.034463 0.454901
+v 0.094095 1.007318 0.473193
+v 0.185880 1.001301 0.444531
+v 0.156133 1.009297 0.452527
+v 0.186991 1.014611 0.435049
+v 0.214834 0.991939 0.435169
+v 0.184571 0.987723 0.453597
+v 0.155033 0.995662 0.461536
+v 0.157065 1.022654 0.443092
+v 0.216118 1.005192 0.425631
+v 0.213321 0.978426 0.444300
+v 0.295693 0.956041 0.399271
+v 0.269858 0.969260 0.412490
+v 0.297459 0.969080 0.389519
+v 0.320266 0.941648 0.384878
+v 0.293610 0.942782 0.408656
+v 0.267957 0.955908 0.421782
+v 0.271470 0.982378 0.402817
+v 0.322179 0.954601 0.375039
+v 0.318010 0.928490 0.394364
+v 0.385354 0.892034 0.335264
+v 0.365192 0.909576 0.352806
+v 0.387656 0.904690 0.325129
+v 0.403872 0.873590 0.316821
+v 0.382640 0.879225 0.345099
+v 0.362620 0.896643 0.362518
+v 0.367374 0.922337 0.342776
+v 0.406284 0.886137 0.306575
+v 0.401027 0.860912 0.326786
+v 0.448755 0.813641 0.256871
+v 0.435640 0.834310 0.277541
+v 0.451435 0.825829 0.246268
+v 0.459955 0.792405 0.235635
+v 0.445594 0.801384 0.267258
+v 0.432571 0.821908 0.287782
+v 0.438242 0.846622 0.267061
+v 0.462702 0.804466 0.224905
+v 0.456715 0.780297 0.246172
+v 0.481573 0.726205 0.169435
+v 0.476399 0.748593 0.191824
+v 0.484450 0.737871 0.158309
+v 0.484692 0.703623 0.146853
+v 0.478181 0.714564 0.180438
+v 0.473043 0.736795 0.202669
+v 0.479244 0.760393 0.180832
+v 0.487587 0.715154 0.135593
+v 0.481278 0.692141 0.158015
+v 0.481573 0.635684 0.078915
+v 0.484692 0.658266 0.101496
+v 0.484450 0.646810 0.067248
+v 0.476399 0.613296 0.056526
+v 0.478181 0.624681 0.090555
+v 0.481278 0.647104 0.112978
+v 0.487587 0.669527 0.089965
+v 0.479244 0.624287 0.044726
+v 0.473043 0.602450 0.068325
+v 0.448755 0.548248 -0.008521
+v 0.459955 0.569484 0.012715
+v 0.451435 0.558852 -0.020710
+v 0.435640 0.527579 -0.029191
+v 0.445594 0.537861 0.003735
+v 0.456715 0.558948 0.024822
+v 0.462702 0.580215 0.000653
+v 0.438242 0.538059 -0.041503
+v 0.432571 0.517337 -0.016789
+v 0.385354 0.469855 -0.086914
+v 0.403872 0.488299 -0.068471
+v 0.387656 0.479991 -0.099571
+v 0.365192 0.452313 -0.104456
+v 0.382640 0.460020 -0.074105
+v 0.401027 0.478334 -0.055792
+v 0.406284 0.498544 -0.081018
+v 0.367374 0.462344 -0.117218
+v 0.362620 0.442602 -0.091524
+v 0.295693 0.405848 -0.150922
+v 0.320266 0.420241 -0.136528
+v 0.297459 0.415601 -0.163961
+v 0.269858 0.392629 -0.164141
+v 0.293610 0.396463 -0.137662
+v 0.318010 0.410755 -0.123370
+v 0.322179 0.430080 -0.149481
+v 0.271470 0.402302 -0.177259
+v 0.267957 0.383337 -0.150788
+v 0.185880 0.360588 -0.196182
+v 0.214834 0.369950 -0.186819
+v 0.186991 0.370070 -0.209491
+v 0.156133 0.352592 -0.204177
+v 0.184571 0.351522 -0.182603
+v 0.213321 0.360819 -0.173307
+v 0.216118 0.379489 -0.200073
+v 0.157066 0.362027 -0.217534
+v 0.155033 0.343583 -0.190542
+v 0.063400 0.337159 -0.219610
+v 0.094762 0.340853 -0.215916
+v 0.063779 0.346502 -0.233060
+v 0.031768 0.334933 -0.221837
+v 0.062954 0.328259 -0.205867
+v 0.094095 0.331927 -0.202199
+v 0.095328 0.350218 -0.229344
+v 0.031958 0.344262 -0.235299
+v 0.031544 0.326048 -0.208078
+v -0.063400 0.337159 -0.219610
+v -0.031768 0.334933 -0.221837
+v -0.063779 0.346502 -0.233060
+v -0.094762 0.340853 -0.215916
+v -0.062954 0.328259 -0.205867
+v -0.031544 0.326048 -0.208078
+v -0.031958 0.344262 -0.235299
+v -0.095328 0.350218 -0.229344
+v -0.094095 0.331927 -0.202199
+v -0.185880 0.360588 -0.196182
+v -0.156133 0.352592 -0.204177
+v -0.186991 0.370070 -0.209491
+v -0.214834 0.369950 -0.186819
+v -0.184571 0.351522 -0.182603
+v -0.155033 0.343583 -0.190542
+v -0.157066 0.362027 -0.217534
+v -0.216118 0.379489 -0.200073
+v -0.213321 0.360819 -0.173307
+v -0.295693 0.405848 -0.150922
+v -0.269858 0.392629 -0.164141
+v -0.297459 0.415601 -0.163961
+v -0.320266 0.420241 -0.136528
+v -0.293610 0.396463 -0.137662
+v -0.267957 0.383337 -0.150788
+v -0.271470 0.402302 -0.177259
+v -0.322179 0.430080 -0.149481
+v -0.318010 0.410755 -0.123370
+v -0.385355 0.469855 -0.086914
+v -0.365192 0.452313 -0.104456
+v -0.387656 0.479990 -0.099571
+v -0.403872 0.488299 -0.068471
+v -0.382640 0.460020 -0.074105
+v -0.362620 0.442602 -0.091524
+v -0.367374 0.462343 -0.117218
+v -0.406284 0.498544 -0.081018
+v -0.401027 0.478333 -0.055792
+v -0.448755 0.548248 -0.008521
+v -0.435640 0.527579 -0.029191
+v -0.451435 0.558852 -0.020710
+v -0.459955 0.569484 0.012715
+v -0.445594 0.537861 0.003735
+v -0.432571 0.517337 -0.016789
+v -0.438242 0.538058 -0.041503
+v -0.462702 0.580215 0.000653
+v -0.456715 0.558947 0.024822
+v -0.481573 0.635684 0.078915
+v -0.476399 0.613296 0.056526
+v -0.484450 0.646810 0.067249
+v -0.484692 0.658266 0.101497
+v -0.478182 0.624681 0.090556
+v -0.473043 0.602450 0.068325
+v -0.479245 0.624288 0.044726
+v -0.487587 0.669527 0.089965
+v -0.481278 0.647104 0.112978
+v -0.481573 0.726205 0.169435
+v -0.484692 0.703623 0.146853
+v -0.484450 0.737871 0.158310
+v -0.476399 0.748593 0.191824
+v -0.478181 0.714564 0.180438
+v -0.481278 0.692141 0.158016
+v -0.487587 0.715154 0.135593
+v -0.479244 0.760393 0.180832
+v -0.473043 0.736795 0.202669
+v -0.456567 0.861856 0.213276
+v -0.467961 0.840250 0.191670
+v -0.457301 0.873642 0.201924
+v -0.443223 0.882885 0.234305
+v -0.455343 0.849950 0.224459
+v -0.466707 0.828402 0.202911
+v -0.468715 0.852001 0.180284
+v -0.443937 0.894705 0.222988
+v -0.442035 0.870923 0.245432
+v -0.392063 0.941613 0.293034
+v -0.410902 0.922849 0.274269
+v -0.392694 0.953528 0.281810
+v -0.371549 0.959461 0.310881
+v -0.391012 0.929493 0.304002
+v -0.409801 0.910779 0.285288
+v -0.411564 0.934733 0.263016
+v -0.372148 0.971404 0.299686
+v -0.370554 0.947293 0.321802
+v -0.300840 1.006735 0.358155
+v -0.325841 0.992091 0.343511
+v -0.301324 1.018754 0.347037
+v -0.274555 1.020184 0.371605
+v -0.300034 0.994441 0.368950
+v -0.324968 0.979836 0.354345
+v -0.326365 1.004087 0.332369
+v -0.274997 1.032226 0.360508
+v -0.273820 1.007854 0.382363
+v -0.189116 1.052783 0.404203
+v -0.218574 1.043257 0.394678
+v -0.189420 1.064877 0.393159
+v -0.158851 1.060917 0.412338
+v -0.188609 1.040365 0.414874
+v -0.217988 1.030865 0.405374
+v -0.218926 1.055336 0.383618
+v -0.159107 1.073024 0.401306
+v -0.158425 1.048478 0.422987
+v -0.064504 1.076619 0.428040
+v -0.096412 1.072861 0.424281
+v -0.064608 1.088751 0.417033
+v -0.032321 1.078885 0.430305
+v -0.064331 1.064138 0.438647
+v -0.096153 1.060390 0.434898
+v -0.096567 1.084987 0.413269
+v -0.032373 1.091020 0.419302
+v -0.032234 1.066397 0.440906
+v 0.064504 1.076619 0.428040
+v 0.032321 1.078885 0.430305
+v 0.064608 1.088751 0.417033
+v 0.096412 1.072861 0.424281
+v 0.064331 1.064138 0.438647
+v 0.032234 1.066397 0.440906
+v 0.032373 1.091020 0.419302
+v 0.096567 1.084987 0.413269
+v 0.096153 1.060390 0.434898
+v 0.189116 1.052783 0.404203
+v 0.158851 1.060917 0.412338
+v 0.189421 1.064877 0.393159
+v 0.218574 1.043257 0.394678
+v 0.188609 1.040365 0.414874
+v 0.158425 1.048478 0.422987
+v 0.159107 1.073024 0.401306
+v 0.218926 1.055336 0.383618
+v 0.217988 1.030865 0.405374
+v 0.300840 1.006735 0.358155
+v 0.274556 1.020184 0.371605
+v 0.301325 1.018755 0.347037
+v 0.325841 0.992091 0.343511
+v 0.300034 0.994441 0.368950
+v 0.273820 1.007854 0.382363
+v 0.274997 1.032225 0.360508
+v 0.326366 1.004087 0.332369
+v 0.324968 0.979836 0.354345
+v 0.392063 0.941613 0.293034
+v 0.371550 0.959461 0.310881
+v 0.392694 0.953528 0.281810
+v 0.410902 0.922849 0.274269
+v 0.391012 0.929493 0.304002
+v 0.370554 0.947293 0.321802
+v 0.372148 0.971404 0.299686
+v 0.411564 0.934734 0.263016
+v 0.409801 0.910779 0.285288
+v 0.456567 0.861856 0.213276
+v 0.443223 0.882885 0.234305
+v 0.457302 0.873642 0.201924
+v 0.467961 0.840250 0.191670
+v 0.455343 0.849949 0.224459
+v 0.442036 0.870923 0.245432
+v 0.443937 0.894705 0.222987
+v 0.468715 0.852001 0.180284
+v 0.466708 0.828402 0.202911
+v 0.489956 0.772898 0.124318
+v 0.484692 0.795676 0.147096
+v 0.490745 0.784541 0.112823
+v 0.493130 0.749923 0.101343
+v 0.488644 0.761230 0.135739
+v 0.483393 0.783947 0.158456
+v 0.485472 0.807356 0.135638
+v 0.493923 0.761529 0.089811
+v 0.491808 0.738316 0.112826
+v 0.489956 0.680801 0.032222
+v 0.493130 0.703776 0.055197
+v 0.490745 0.692296 0.020579
+v 0.484692 0.658023 0.009443
+v 0.488644 0.669380 0.043889
+v 0.491808 0.692294 0.066803
+v 0.493923 0.715308 0.043590
+v 0.485472 0.669481 -0.002236
+v 0.483393 0.646663 0.021172
+v 0.456567 0.591843 -0.056736
+v 0.467961 0.613449 -0.035130
+v 0.457302 0.603195 -0.068523
+v 0.443223 0.570814 -0.077766
+v 0.455343 0.580661 -0.044830
+v 0.466708 0.602209 -0.023282
+v 0.468715 0.624836 -0.046882
+v 0.443937 0.582132 -0.089586
+v 0.442036 0.559688 -0.065803
+v 0.392063 0.512086 -0.136494
+v 0.410902 0.530850 -0.117730
+v 0.392694 0.523309 -0.148409
+v 0.371550 0.494238 -0.154341
+v 0.391012 0.501117 -0.124374
+v 0.409801 0.519831 -0.105660
+v 0.411564 0.542104 -0.129614
+v 0.372148 0.505433 -0.166285
+v 0.370554 0.483317 -0.142174
+v 0.300840 0.446964 -0.201616
+v 0.325841 0.461608 -0.186972
+v 0.301325 0.458083 -0.213635
+v 0.274556 0.433515 -0.215065
+v 0.300034 0.436170 -0.189321
+v 0.324968 0.450774 -0.174717
+v 0.326366 0.472750 -0.198968
+v 0.274997 0.444612 -0.227106
+v 0.273820 0.422756 -0.202735
+v 0.189116 0.400916 -0.247664
+v 0.218574 0.410442 -0.238138
+v 0.189421 0.411960 -0.259757
+v 0.158851 0.392781 -0.255798
+v 0.188609 0.390245 -0.235246
+v 0.217989 0.399745 -0.225746
+v 0.218926 0.421501 -0.250216
+v 0.159107 0.403813 -0.267905
+v 0.158425 0.382132 -0.243359
+v 0.064504 0.377080 -0.271500
+v 0.096412 0.380838 -0.267742
+v 0.064608 0.388086 -0.283632
+v 0.032321 0.374814 -0.273765
+v 0.064331 0.366472 -0.259018
+v 0.096153 0.370221 -0.255270
+v 0.096567 0.391850 -0.279868
+v 0.032373 0.385817 -0.285901
+v 0.032234 0.364213 -0.261278
+v -0.064504 0.377080 -0.271500
+v -0.032321 0.374814 -0.273765
+v -0.064608 0.388086 -0.283632
+v -0.096412 0.380838 -0.267742
+v -0.064331 0.366472 -0.259018
+v -0.032234 0.364213 -0.261278
+v -0.032373 0.385817 -0.285901
+v -0.096567 0.391850 -0.279868
+v -0.096154 0.370221 -0.255270
+v -0.189116 0.400916 -0.247664
+v -0.158851 0.392781 -0.255798
+v -0.189421 0.411960 -0.259757
+v -0.218574 0.410441 -0.238138
+v -0.188609 0.390245 -0.235246
+v -0.158425 0.382132 -0.243359
+v -0.159107 0.403813 -0.267905
+v -0.218926 0.421501 -0.250216
+v -0.217989 0.399745 -0.225746
+v -0.300840 0.446964 -0.201616
+v -0.274556 0.433515 -0.215065
+v -0.301325 0.458082 -0.213635
+v -0.325841 0.461608 -0.186972
+v -0.300034 0.436170 -0.189321
+v -0.273820 0.422756 -0.202734
+v -0.274998 0.444612 -0.227106
+v -0.326366 0.472750 -0.198968
+v -0.324968 0.450774 -0.174717
+v -0.392063 0.512086 -0.136494
+v -0.371550 0.494238 -0.154341
+v -0.392694 0.523309 -0.148408
+v -0.410903 0.530850 -0.117730
+v -0.391012 0.501117 -0.124374
+v -0.370554 0.483317 -0.142174
+v -0.372148 0.505433 -0.166285
+v -0.411564 0.542103 -0.129614
+v -0.409802 0.519831 -0.105660
+v -0.456567 0.591843 -0.056736
+v -0.443223 0.570814 -0.077766
+v -0.457302 0.603195 -0.068523
+v -0.467962 0.613449 -0.035130
+v -0.455343 0.580661 -0.044830
+v -0.442036 0.559688 -0.065803
+v -0.443937 0.582132 -0.089586
+v -0.468715 0.624836 -0.046882
+v -0.466708 0.602209 -0.023282
+v -0.489957 0.680801 0.032222
+v -0.484692 0.658023 0.009444
+v -0.490745 0.692296 0.020579
+v -0.493130 0.703776 0.055197
+v -0.488644 0.669380 0.043890
+v -0.483393 0.646663 0.021172
+v -0.485472 0.669481 -0.002236
+v -0.493924 0.715308 0.043591
+v -0.491809 0.692294 0.066803
+v -0.489956 0.772898 0.124318
+v -0.493130 0.749923 0.101343
+v -0.490745 0.784541 0.112823
+v -0.484692 0.795676 0.147096
+v -0.488644 0.761230 0.135739
+v -0.491808 0.738316 0.112826
+v -0.493923 0.761529 0.089811
+v -0.485472 0.807356 0.135638
+v -0.483393 0.783947 0.158456
+v -0.456567 0.908157 0.166975
+v -0.467961 0.886551 0.145369
+v -0.455343 0.919339 0.155069
+v -0.443223 0.929186 0.188004
+v -0.457301 0.896805 0.178761
+v -0.468715 0.875164 0.157121
+v -0.466707 0.897791 0.133521
+v -0.442035 0.940312 0.176042
+v -0.443937 0.917868 0.199825
+v -0.392063 0.987914 0.246732
+v -0.410902 0.969150 0.227968
+v -0.391012 0.998883 0.234613
+v -0.371549 1.005762 0.264580
+v -0.392694 0.976691 0.258647
+v -0.411564 0.957896 0.239853
+v -0.409801 0.980169 0.215899
+v -0.370554 1.016683 0.252412
+v -0.372148 0.994567 0.276523
+v -0.300840 1.053036 0.311854
+v -0.325841 1.038392 0.297210
+v -0.300034 1.063830 0.299560
+v -0.274555 1.066485 0.325303
+v -0.301324 1.041918 0.323874
+v -0.326365 1.027250 0.309206
+v -0.324968 1.049226 0.284955
+v -0.273820 1.077244 0.312973
+v -0.274997 1.055388 0.337345
+v -0.189116 1.099084 0.357902
+v -0.218574 1.089559 0.348377
+v -0.188609 1.109755 0.345484
+v -0.158851 1.107219 0.366037
+v -0.189421 1.088040 0.369996
+v -0.218926 1.078499 0.360455
+v -0.217988 1.100255 0.335984
+v -0.158425 1.117868 0.353597
+v -0.159107 1.096187 0.378143
+v -0.064504 1.122921 0.381738
+v -0.096412 1.119162 0.377980
+v -0.064331 1.133528 0.369257
+v -0.032321 1.125186 0.384004
+v -0.064608 1.111914 0.393870
+v -0.096567 1.108150 0.390106
+v -0.096153 1.129779 0.365509
+v -0.032234 1.135787 0.371516
+v -0.032373 1.114183 0.396139
+v 0.064504 1.122921 0.381738
+v 0.032321 1.125186 0.384004
+v 0.064331 1.133528 0.369257
+v 0.096412 1.119162 0.377980
+v 0.064608 1.111914 0.393870
+v 0.032373 1.114183 0.396139
+v 0.032234 1.135787 0.371516
+v 0.096153 1.129779 0.365509
+v 0.096567 1.108150 0.390106
+v 0.189116 1.099084 0.357902
+v 0.158851 1.107219 0.366037
+v 0.188609 1.109755 0.345485
+v 0.218574 1.089559 0.348377
+v 0.189421 1.088040 0.369996
+v 0.159107 1.096187 0.378143
+v 0.158425 1.117868 0.353597
+v 0.217988 1.100255 0.335984
+v 0.218926 1.078499 0.360455
+v 0.300840 1.053036 0.311854
+v 0.274556 1.066485 0.325303
+v 0.300034 1.063830 0.299560
+v 0.325841 1.038392 0.297210
+v 0.301325 1.041918 0.323874
+v 0.274997 1.055389 0.337345
+v 0.273820 1.077244 0.312973
+v 0.324968 1.049226 0.284955
+v 0.326366 1.027250 0.309206
+v 0.392063 0.987914 0.246732
+v 0.371550 1.005762 0.264580
+v 0.391012 0.998883 0.234613
+v 0.410902 0.969150 0.227968
+v 0.392694 0.976691 0.258647
+v 0.372148 0.994567 0.276523
+v 0.370554 1.016683 0.252412
+v 0.409801 0.980169 0.215899
+v 0.411564 0.957897 0.239853
+v 0.456567 0.908157 0.166975
+v 0.443223 0.929186 0.188004
+v 0.455343 0.919339 0.155069
+v 0.467961 0.886551 0.145369
+v 0.457302 0.896805 0.178761
+v 0.443937 0.917868 0.199825
+v 0.442036 0.940312 0.176042
+v 0.466708 0.897791 0.133521
+v 0.468715 0.875164 0.157121
+v 0.489956 0.819199 0.078017
+v 0.484692 0.841977 0.100795
+v 0.488644 0.830619 0.066349
+v 0.493130 0.796224 0.055042
+v 0.490745 0.807704 0.089660
+v 0.485472 0.830519 0.112475
+v 0.483393 0.853337 0.089066
+v 0.491808 0.807706 0.043436
+v 0.493923 0.784692 0.066648
+v 0.489956 0.727103 -0.014079
+v 0.493130 0.750077 0.008896
+v 0.488644 0.738770 -0.025500
+v 0.484692 0.704324 -0.036858
+v 0.490745 0.715459 -0.002584
+v 0.493923 0.738471 0.020428
+v 0.491808 0.761684 -0.002587
+v 0.483393 0.716053 -0.048218
+v 0.485472 0.692644 -0.025399
+v 0.456567 0.638145 -0.103037
+v 0.467961 0.659750 -0.081432
+v 0.455343 0.650051 -0.114220
+v 0.443223 0.617115 -0.124067
+v 0.457302 0.626358 -0.091686
+v 0.468715 0.647999 -0.070045
+v 0.466708 0.671598 -0.092672
+v 0.442036 0.629077 -0.135193
+v 0.443937 0.605295 -0.112749
+v 0.392063 0.558387 -0.182795
+v 0.410902 0.577151 -0.164031
+v 0.391012 0.570507 -0.193764
+v 0.371550 0.540539 -0.200642
+v 0.392694 0.546472 -0.171571
+v 0.411564 0.565267 -0.152777
+v 0.409801 0.589221 -0.175050
+v 0.370554 0.552707 -0.211563
+v 0.372148 0.528596 -0.189448
+v 0.300840 0.493265 -0.247917
+v 0.325841 0.507909 -0.233273
+v 0.300034 0.505559 -0.258711
+v 0.274556 0.479816 -0.261366
+v 0.301325 0.481245 -0.236798
+v 0.326366 0.495913 -0.222131
+v 0.324968 0.520164 -0.244106
+v 0.273820 0.492146 -0.272124
+v 0.274997 0.467775 -0.250269
+v 0.189116 0.447217 -0.293965
+v 0.218574 0.456743 -0.284439
+v 0.188609 0.459635 -0.304636
+v 0.158851 0.439083 -0.302099
+v 0.189421 0.435123 -0.282920
+v 0.218926 0.444664 -0.273379
+v 0.217989 0.469135 -0.295136
+v 0.158425 0.451522 -0.312748
+v 0.159107 0.426976 -0.291068
+v 0.064504 0.423381 -0.317801
+v 0.096412 0.427139 -0.314043
+v 0.064331 0.435862 -0.328408
+v 0.032321 0.421115 -0.320066
+v 0.064608 0.411249 -0.306795
+v 0.096567 0.415013 -0.303031
+v 0.096153 0.439610 -0.324660
+v 0.032234 0.433603 -0.330667
+v 0.032373 0.408980 -0.309064
+v -0.064504 0.423381 -0.317801
+v -0.032321 0.421115 -0.320066
+v -0.064331 0.435862 -0.328408
+v -0.096412 0.427139 -0.314043
+v -0.064608 0.411249 -0.306795
+v -0.032373 0.408980 -0.309064
+v -0.032234 0.433603 -0.330667
+v -0.096154 0.439610 -0.324660
+v -0.096567 0.415013 -0.303031
+v -0.189116 0.447217 -0.293965
+v -0.158851 0.439082 -0.302099
+v -0.188609 0.459635 -0.304636
+v -0.218574 0.456743 -0.284439
+v -0.189421 0.435123 -0.282920
+v -0.159107 0.426976 -0.291068
+v -0.158425 0.451522 -0.312748
+v -0.217989 0.469135 -0.295136
+v -0.218926 0.444664 -0.273379
+v -0.300840 0.493265 -0.247917
+v -0.274556 0.479816 -0.261366
+v -0.300034 0.505559 -0.258711
+v -0.325841 0.507909 -0.233273
+v -0.301325 0.481245 -0.236798
+v -0.274998 0.467775 -0.250269
+v -0.273820 0.492146 -0.272124
+v -0.324968 0.520164 -0.244106
+v -0.326366 0.495913 -0.222131
+v -0.392063 0.558387 -0.182795
+v -0.371550 0.540539 -0.200642
+v -0.391012 0.570507 -0.193764
+v -0.410903 0.577151 -0.164031
+v -0.392694 0.546472 -0.171571
+v -0.372148 0.528596 -0.189448
+v -0.370554 0.552707 -0.211563
+v -0.409802 0.589221 -0.175050
+v -0.411564 0.565266 -0.152777
+v -0.456567 0.638144 -0.103037
+v -0.443223 0.617115 -0.124067
+v -0.455344 0.650051 -0.114220
+v -0.467962 0.659750 -0.081432
+v -0.457302 0.626358 -0.091685
+v -0.443937 0.605295 -0.112749
+v -0.442036 0.629077 -0.135193
+v -0.466708 0.671598 -0.092672
+v -0.468715 0.647999 -0.070045
+v -0.489957 0.727102 -0.014079
+v -0.484692 0.704324 -0.036858
+v -0.488644 0.738770 -0.025500
+v -0.493130 0.750077 0.008896
+v -0.490745 0.715459 -0.002584
+v -0.485472 0.692644 -0.025399
+v -0.483393 0.716053 -0.048217
+v -0.491809 0.761683 -0.002587
+v -0.493924 0.738471 0.020428
+v -0.489956 0.819199 0.078017
+v -0.493130 0.796224 0.055042
+v -0.488644 0.830619 0.066349
+v -0.484692 0.841977 0.100795
+v -0.490745 0.807704 0.089660
+v -0.493923 0.784692 0.066648
+v -0.491808 0.807706 0.043436
+v -0.483393 0.853337 0.089066
+v -0.485472 0.830519 0.112475
+v -0.448755 0.951752 0.118760
+v -0.459954 0.930516 0.097524
+v -0.445594 0.962139 0.106503
+v -0.435639 0.972421 0.139430
+v -0.451435 0.941148 0.130948
+v -0.462702 0.919785 0.109586
+v -0.456715 0.941052 0.085417
+v -0.432571 0.982663 0.127027
+v -0.438242 0.961941 0.151742
+v -0.385354 1.030144 0.197153
+v -0.403872 1.011701 0.178710
+v -0.382640 1.039980 0.184344
+v -0.365192 1.047687 0.214695
+v -0.387656 1.020009 0.209810
+v -0.406284 1.001456 0.191256
+v -0.401027 1.021667 0.166031
+v -0.362620 1.057398 0.201763
+v -0.367374 1.037656 0.227456
+v -0.295693 1.094152 0.261160
+v -0.320266 1.079759 0.246767
+v -0.293610 1.103536 0.247901
+v -0.269858 1.107371 0.274379
+v -0.297459 1.084399 0.274199
+v -0.322179 1.069920 0.259720
+v -0.318010 1.089244 0.233609
+v -0.267957 1.116663 0.261027
+v -0.271470 1.097697 0.287498
+v -0.185880 1.139412 0.306420
+v -0.214834 1.130049 0.297058
+v -0.184571 1.148478 0.292842
+v -0.156133 1.147408 0.314416
+v -0.186991 1.129930 0.319730
+v -0.216118 1.120511 0.310311
+v -0.213321 1.139181 0.283545
+v -0.155033 1.156417 0.300781
+v -0.157065 1.137973 0.327773
+v -0.063400 1.162841 0.329849
+v -0.094762 1.159147 0.326155
+v -0.062954 1.171741 0.316105
+v -0.031768 1.165067 0.332075
+v -0.063779 1.153498 0.343298
+v -0.095328 1.149782 0.339582
+v -0.094095 1.168073 0.312437
+v -0.031544 1.173952 0.318316
+v -0.031958 1.155738 0.345538
+v 0.063400 1.162841 0.329849
+v 0.031768 1.165067 0.332075
+v 0.062954 1.171741 0.316105
+v 0.094762 1.159147 0.326155
+v 0.063779 1.153498 0.343298
+v 0.031958 1.155738 0.345538
+v 0.031544 1.173952 0.318316
+v 0.094095 1.168073 0.312438
+v 0.095328 1.149782 0.339582
+v 0.185880 1.139412 0.306420
+v 0.156133 1.147408 0.314416
+v 0.184571 1.148478 0.292842
+v 0.214834 1.130050 0.297058
+v 0.186991 1.129930 0.319730
+v 0.157065 1.137973 0.327773
+v 0.155033 1.156417 0.300781
+v 0.213321 1.139181 0.283545
+v 0.216118 1.120512 0.310311
+v 0.295693 1.094152 0.261160
+v 0.269858 1.107371 0.274379
+v 0.293610 1.103537 0.247901
+v 0.320266 1.079759 0.246767
+v 0.297459 1.084399 0.274199
+v 0.271470 1.097698 0.287498
+v 0.267957 1.116663 0.261027
+v 0.318010 1.089245 0.233609
+v 0.322179 1.069920 0.259720
+v 0.385354 1.030145 0.197153
+v 0.365192 1.047687 0.214695
+v 0.382640 1.039980 0.184344
+v 0.403872 1.011701 0.178710
+v 0.387656 1.020010 0.209810
+v 0.367374 1.037657 0.227456
+v 0.362620 1.057398 0.201763
+v 0.401027 1.021667 0.166031
+v 0.406284 1.001456 0.191256
+v 0.448755 0.951752 0.118760
+v 0.435640 0.972421 0.139430
+v 0.445594 0.962139 0.106503
+v 0.459955 0.930516 0.097524
+v 0.451435 0.941148 0.130948
+v 0.438242 0.961941 0.151742
+v 0.432571 0.982663 0.127027
+v 0.456715 0.941052 0.085417
+v 0.462702 0.919785 0.109585
+v 0.481573 0.864316 0.031324
+v 0.476399 0.886704 0.053713
+v 0.478181 0.875319 0.019683
+v 0.484692 0.841734 0.008742
+v 0.484450 0.853190 0.042990
+v 0.479244 0.875713 0.065512
+v 0.473043 0.897550 0.041914
+v 0.481278 0.852896 -0.002740
+v 0.487587 0.830473 0.020273
+v 0.481573 0.773795 -0.059196
+v 0.484692 0.796377 -0.036615
+v 0.478181 0.785436 -0.070200
+v 0.476399 0.751407 -0.081585
+v 0.484450 0.762129 -0.048071
+v 0.487587 0.784846 -0.025354
+v 0.481278 0.807859 -0.047777
+v 0.473043 0.763205 -0.092431
+v 0.479244 0.739607 -0.070593
+v 0.448755 0.686359 -0.146632
+v 0.459955 0.707595 -0.125396
+v 0.445594 0.698616 -0.157020
+v 0.435640 0.665690 -0.167302
+v 0.451435 0.674171 -0.136029
+v 0.462702 0.695534 -0.114666
+v 0.456715 0.719703 -0.135933
+v 0.432571 0.678092 -0.177544
+v 0.438242 0.653378 -0.156822
+v 0.385354 0.607966 -0.225025
+v 0.403872 0.626410 -0.206582
+v 0.382640 0.620775 -0.234860
+v 0.365192 0.590424 -0.242567
+v 0.387656 0.595310 -0.214890
+v 0.406284 0.613863 -0.196337
+v 0.401027 0.639088 -0.216547
+v 0.362620 0.603357 -0.252279
+v 0.367374 0.577663 -0.232537
+v 0.295693 0.543959 -0.289033
+v 0.320266 0.558352 -0.274639
+v 0.293610 0.557219 -0.298417
+v 0.269858 0.530740 -0.302252
+v 0.297459 0.530920 -0.279280
+v 0.322179 0.545399 -0.264801
+v 0.318010 0.571510 -0.284125
+v 0.267957 0.544093 -0.311543
+v 0.271470 0.517622 -0.292578
+v 0.185880 0.498699 -0.334293
+v 0.214834 0.508061 -0.324930
+v 0.184571 0.512277 -0.343359
+v 0.156133 0.490703 -0.342288
+v 0.186991 0.485389 -0.324811
+v 0.216118 0.494808 -0.315392
+v 0.213321 0.521574 -0.334062
+v 0.155033 0.504338 -0.351298
+v 0.157066 0.477346 -0.332854
+v 0.063400 0.475270 -0.357721
+v 0.094762 0.478964 -0.354027
+v 0.062954 0.489014 -0.366622
+v 0.031768 0.473044 -0.359948
+v 0.063779 0.461821 -0.348379
+v 0.095328 0.465537 -0.344663
+v 0.094095 0.492682 -0.362954
+v 0.031544 0.486803 -0.368833
+v 0.031958 0.459581 -0.350619
+v -0.063400 0.475270 -0.357721
+v -0.031768 0.473044 -0.359948
+v -0.062954 0.489014 -0.366622
+v -0.094762 0.478964 -0.354027
+v -0.063779 0.461821 -0.348379
+v -0.031958 0.459581 -0.350619
+v -0.031544 0.486803 -0.368833
+v -0.094095 0.492682 -0.362954
+v -0.095328 0.465537 -0.344663
+v -0.185880 0.498699 -0.334293
+v -0.156133 0.490703 -0.342288
+v -0.184571 0.512277 -0.343359
+v -0.214834 0.508061 -0.324930
+v -0.186991 0.485389 -0.324811
+v -0.157066 0.477346 -0.332854
+v -0.155033 0.504338 -0.351297
+v -0.213321 0.521574 -0.334062
+v -0.216118 0.494808 -0.315392
+v -0.295693 0.543959 -0.289033
+v -0.269858 0.530740 -0.302252
+v -0.293610 0.557218 -0.298417
+v -0.320266 0.558352 -0.274639
+v -0.297459 0.530920 -0.279280
+v -0.271470 0.517622 -0.292578
+v -0.267957 0.544092 -0.311543
+v -0.318010 0.571510 -0.284125
+v -0.322179 0.545399 -0.264801
+v -0.385355 0.607966 -0.225025
+v -0.365192 0.590424 -0.242567
+v -0.382640 0.620775 -0.234860
+v -0.403872 0.626410 -0.206582
+v -0.387656 0.595310 -0.214890
+v -0.367374 0.577663 -0.232537
+v -0.362620 0.603357 -0.252279
+v -0.401027 0.639088 -0.216547
+v -0.406284 0.613863 -0.196337
+v -0.448755 0.686359 -0.146632
+v -0.435640 0.665690 -0.167302
+v -0.445594 0.698616 -0.157020
+v -0.459955 0.707595 -0.125396
+v -0.451435 0.674171 -0.136029
+v -0.438242 0.653378 -0.156822
+v -0.432571 0.678092 -0.177544
+v -0.456715 0.719703 -0.135933
+v -0.462702 0.695534 -0.114666
+v -0.481573 0.773795 -0.059196
+v -0.476399 0.751407 -0.081585
+v -0.478182 0.785436 -0.070200
+v -0.484692 0.796377 -0.036614
+v -0.484450 0.762129 -0.048071
+v -0.479245 0.739607 -0.070593
+v -0.473044 0.763205 -0.092430
+v -0.481278 0.807859 -0.047777
+v -0.487587 0.784846 -0.025354
+v -0.481573 0.864316 0.031324
+v -0.484692 0.841734 0.008742
+v -0.478181 0.875319 0.019683
+v -0.476399 0.886704 0.053713
+v -0.484450 0.853190 0.042990
+v -0.487587 0.830473 0.020274
+v -0.481278 0.852896 -0.002739
+v -0.473043 0.897550 0.041914
+v -0.479244 0.875712 0.065513
+v -0.433303 0.991845 0.069528
+v -0.444117 0.971340 0.049023
+v -0.428375 1.001112 0.057347
+v -0.420639 1.011803 0.089486
+v -0.437845 0.982221 0.081838
+v -0.448772 0.961501 0.061118
+v -0.439066 0.980841 0.037075
+v -0.415855 1.020843 0.077077
+v -0.425048 1.002388 0.102005
+v -0.372086 1.067539 0.145222
+v -0.389965 1.049731 0.127414
+v -0.367854 1.075945 0.132179
+v -0.352618 1.084477 0.162160
+v -0.375986 1.058708 0.158325
+v -0.394053 1.040713 0.140330
+v -0.385530 1.058340 0.114574
+v -0.348607 1.092690 0.148925
+v -0.356314 1.075824 0.175441
+v -0.285511 1.129343 0.207025
+v -0.309238 1.115445 0.193128
+v -0.282264 1.137046 0.193280
+v -0.260566 1.142107 0.219789
+v -0.288504 1.121160 0.220777
+v -0.312480 1.107116 0.206733
+v -0.305721 1.123306 0.179540
+v -0.257602 1.149665 0.205899
+v -0.263297 1.134057 0.233674
+v -0.179480 1.173044 0.250727
+v -0.207437 1.164004 0.241687
+v -0.177439 1.180251 0.236485
+v -0.150757 1.180764 0.258447
+v -0.181361 1.165319 0.264936
+v -0.209611 1.156184 0.255801
+v -0.205078 1.171313 0.227547
+v -0.149042 1.187883 0.244117
+v -0.152337 1.173120 0.272737
+v -0.061217 1.195666 0.273349
+v -0.091499 1.192099 0.269782
+v -0.060521 1.202615 0.258849
+v -0.030674 1.197816 0.275499
+v -0.061859 1.188178 0.287795
+v -0.092458 1.184574 0.284191
+v -0.090459 1.199089 0.255323
+v -0.030325 1.204740 0.260974
+v -0.030995 1.190351 0.289968
+v 0.061217 1.195666 0.273349
+v 0.030674 1.197816 0.275499
+v 0.060521 1.202615 0.258849
+v 0.091499 1.192099 0.269782
+v 0.061859 1.188178 0.287795
+v 0.030995 1.190351 0.289968
+v 0.030325 1.204740 0.260974
+v 0.090459 1.199089 0.255323
+v 0.092458 1.184574 0.284191
+v 0.179480 1.173044 0.250727
+v 0.150757 1.180764 0.258447
+v 0.177439 1.180251 0.236485
+v 0.207437 1.164004 0.241687
+v 0.181361 1.165320 0.264936
+v 0.152337 1.173120 0.272737
+v 0.149042 1.187883 0.244117
+v 0.205078 1.171313 0.227547
+v 0.209611 1.156185 0.255801
+v 0.285511 1.129343 0.207025
+v 0.260566 1.142107 0.219789
+v 0.282264 1.137046 0.193280
+v 0.309238 1.115445 0.193127
+v 0.288504 1.121160 0.220777
+v 0.263297 1.134058 0.233674
+v 0.257602 1.149665 0.205899
+v 0.305721 1.123306 0.179540
+v 0.312480 1.107116 0.206733
+v 0.372086 1.067539 0.145222
+v 0.352618 1.084477 0.162160
+v 0.367854 1.075945 0.132179
+v 0.389965 1.049731 0.127414
+v 0.375986 1.058708 0.158325
+v 0.356314 1.075824 0.175441
+v 0.348607 1.092691 0.148925
+v 0.385530 1.058340 0.114574
+v 0.394053 1.040713 0.140330
+v 0.433303 0.991845 0.069528
+v 0.420639 1.011803 0.089486
+v 0.428375 1.001112 0.057346
+v 0.444117 0.971341 0.049023
+v 0.437845 0.982221 0.081838
+v 0.425048 1.002388 0.102005
+v 0.415855 1.020843 0.077077
+v 0.439066 0.980841 0.037075
+v 0.448772 0.961501 0.061118
+v 0.464991 0.907420 -0.014897
+v 0.459995 0.929038 0.006720
+v 0.459703 0.917647 -0.026119
+v 0.468003 0.885616 -0.036702
+v 0.469865 0.896911 -0.003472
+v 0.464817 0.918755 0.018372
+v 0.454764 0.939019 -0.004747
+v 0.462680 0.896091 -0.047675
+v 0.472908 0.874878 -0.025505
+v 0.464991 0.820017 -0.102301
+v 0.468003 0.841821 -0.080497
+v 0.459703 0.831238 -0.112528
+v 0.459995 0.798399 -0.123919
+v 0.469865 0.808591 -0.091792
+v 0.472908 0.830624 -0.069759
+v 0.462680 0.852794 -0.090972
+v 0.454763 0.809866 -0.133900
+v 0.464817 0.786747 -0.113636
+v 0.433303 0.735591 -0.186726
+v 0.444117 0.756096 -0.166221
+v 0.428375 0.747773 -0.195993
+v 0.420639 0.715633 -0.206684
+v 0.437845 0.723281 -0.177102
+v 0.448772 0.744001 -0.156382
+v 0.439066 0.768044 -0.175722
+v 0.415855 0.728042 -0.215724
+v 0.425048 0.703114 -0.197269
+v 0.372086 0.659898 -0.262420
+v 0.389966 0.677706 -0.244612
+v 0.367854 0.672940 -0.270826
+v 0.352618 0.642960 -0.279358
+v 0.375986 0.646794 -0.253589
+v 0.394053 0.664789 -0.235594
+v 0.385530 0.690546 -0.253220
+v 0.348607 0.656195 -0.287571
+v 0.356314 0.629678 -0.270705
+v 0.285511 0.598094 -0.324223
+v 0.309238 0.611992 -0.310326
+v 0.282264 0.611839 -0.331927
+v 0.260566 0.585330 -0.336987
+v 0.288504 0.584343 -0.316040
+v 0.312480 0.598386 -0.301997
+v 0.305721 0.625579 -0.318187
+v 0.257602 0.599221 -0.344545
+v 0.263297 0.571445 -0.328938
+v 0.179480 0.554392 -0.367925
+v 0.207437 0.563432 -0.358885
+v 0.177439 0.568635 -0.375131
+v 0.150757 0.546672 -0.375645
+v 0.181361 0.540183 -0.360200
+v 0.209611 0.549318 -0.351065
+v 0.205078 0.577572 -0.366194
+v 0.149042 0.561002 -0.382763
+v 0.152337 0.532382 -0.368001
+v 0.061217 0.531770 -0.390547
+v 0.091499 0.535337 -0.386980
+v 0.060521 0.546270 -0.397496
+v 0.030674 0.529621 -0.392697
+v 0.061859 0.517324 -0.383059
+v 0.092458 0.520928 -0.379455
+v 0.090459 0.549796 -0.393969
+v 0.030325 0.544145 -0.399621
+v 0.030995 0.515152 -0.385231
+v -0.061217 0.531770 -0.390547
+v -0.030674 0.529621 -0.392697
+v -0.060521 0.546270 -0.397496
+v -0.091499 0.535337 -0.386980
+v -0.061859 0.517324 -0.383059
+v -0.030996 0.515152 -0.385231
+v -0.030325 0.544145 -0.399621
+v -0.090459 0.549796 -0.393970
+v -0.092458 0.520928 -0.379455
+v -0.179480 0.554392 -0.367925
+v -0.150757 0.546672 -0.375645
+v -0.177439 0.568635 -0.375131
+v -0.207437 0.563432 -0.358885
+v -0.181361 0.540183 -0.360200
+v -0.152337 0.532382 -0.368001
+v -0.149042 0.561002 -0.382763
+v -0.205078 0.577572 -0.366194
+v -0.209611 0.549318 -0.351065
+v -0.285512 0.598094 -0.324223
+v -0.260566 0.585330 -0.336987
+v -0.282264 0.611839 -0.331927
+v -0.309238 0.611992 -0.310326
+v -0.288504 0.584343 -0.316040
+v -0.263297 0.571445 -0.328938
+v -0.257603 0.599220 -0.344545
+v -0.305721 0.625579 -0.318187
+v -0.312480 0.598386 -0.301997
+v -0.372086 0.659897 -0.262420
+v -0.352618 0.642959 -0.279358
+v -0.367854 0.672940 -0.270826
+v -0.389966 0.677706 -0.244612
+v -0.375986 0.646794 -0.253589
+v -0.356314 0.629678 -0.270705
+v -0.348608 0.656194 -0.287571
+v -0.385530 0.690545 -0.253220
+v -0.394053 0.664789 -0.235594
+v -0.433303 0.735591 -0.186726
+v -0.420640 0.715633 -0.206684
+v -0.428375 0.747773 -0.195993
+v -0.444117 0.756096 -0.166221
+v -0.437845 0.723281 -0.177102
+v -0.425049 0.703114 -0.197269
+v -0.415856 0.728042 -0.215724
+v -0.439066 0.768044 -0.175721
+v -0.448772 0.744001 -0.156382
+v -0.464992 0.820017 -0.102301
+v -0.459995 0.798399 -0.123918
+v -0.459703 0.831238 -0.112528
+v -0.468003 0.841821 -0.080496
+v -0.469866 0.808591 -0.091792
+v -0.464817 0.786747 -0.113636
+v -0.454764 0.809866 -0.133900
+v -0.462680 0.852794 -0.090972
+v -0.472909 0.830624 -0.069759
+v -0.464992 0.907420 -0.014897
+v -0.468003 0.885616 -0.036701
+v -0.459703 0.917647 -0.026119
+v -0.459995 0.929038 0.006721
+v -0.469865 0.896911 -0.003472
+v -0.472909 0.874878 -0.025505
+v -0.462680 0.896091 -0.047675
+v -0.454763 0.939019 -0.004747
+v -0.464817 0.918755 0.018372
+v -0.412030 1.025968 0.022825
+v -0.422313 1.006469 0.003327
+v -0.406954 1.032584 0.013206
+v -0.399988 1.044946 0.041803
+v -0.417535 1.018338 0.033710
+v -0.427955 0.998579 0.013952
+v -0.417110 1.013326 -0.006051
+v -0.395060 1.051328 0.031951
+v -0.405332 1.037569 0.052942
+v -0.353818 1.097945 0.094802
+v -0.370820 1.081011 0.077868
+v -0.349459 1.103675 0.084297
+v -0.335306 1.114052 0.110909
+v -0.358545 1.091277 0.106649
+v -0.375774 1.074117 0.089489
+v -0.366252 1.086950 0.067572
+v -0.331175 1.119583 0.100205
+v -0.339786 1.107598 0.122971
+v -0.271494 1.156715 0.153572
+v -0.294056 1.143499 0.140356
+v -0.268150 1.161720 0.142343
+v -0.247773 1.168852 0.165709
+v -0.275121 1.150831 0.166204
+v -0.297985 1.137439 0.152812
+v -0.290434 1.148667 0.129290
+v -0.244721 1.173708 0.154330
+v -0.251084 1.163131 0.178503
+v -0.170668 1.198271 0.195128
+v -0.197253 1.189674 0.186531
+v -0.168566 1.202764 0.183387
+v -0.143355 1.205612 0.202469
+v -0.172949 1.192943 0.208315
+v -0.199888 1.184231 0.199604
+v -0.194823 1.194274 0.174896
+v -0.141589 1.210015 0.190637
+v -0.145271 1.200382 0.215754
+v -0.058212 1.219782 0.216639
+v -0.087007 1.216390 0.213247
+v -0.057495 1.224011 0.204633
+v -0.029168 1.221826 0.218683
+v -0.058990 1.214741 0.230114
+v -0.088170 1.211304 0.226677
+v -0.085935 1.220661 0.201283
+v -0.028809 1.226030 0.206652
+v -0.029558 1.216813 0.232185
+v 0.058212 1.219782 0.216639
+v 0.029168 1.221826 0.218683
+v 0.057495 1.224010 0.204633
+v 0.087007 1.216390 0.213247
+v 0.058989 1.214741 0.230114
+v 0.029558 1.216813 0.232185
+v 0.028809 1.226030 0.206652
+v 0.085935 1.220661 0.201283
+v 0.088170 1.211304 0.226677
+v 0.170668 1.198271 0.195128
+v 0.143355 1.205612 0.202469
+v 0.168566 1.202764 0.183387
+v 0.197253 1.189674 0.186531
+v 0.172949 1.192943 0.208315
+v 0.145271 1.200382 0.215754
+v 0.141589 1.210015 0.190637
+v 0.194823 1.194274 0.174896
+v 0.199888 1.184231 0.199604
+v 0.271494 1.156715 0.153572
+v 0.247773 1.168852 0.165709
+v 0.268150 1.161720 0.142343
+v 0.294056 1.143499 0.140356
+v 0.275121 1.150831 0.166204
+v 0.251084 1.163131 0.178503
+v 0.244721 1.173708 0.154330
+v 0.290434 1.148668 0.129290
+v 0.297985 1.137439 0.152812
+v 0.353818 1.097945 0.094802
+v 0.335306 1.114052 0.110909
+v 0.349459 1.103675 0.084297
+v 0.370820 1.081011 0.077868
+v 0.358545 1.091277 0.106649
+v 0.339786 1.107599 0.122971
+v 0.331175 1.119583 0.100205
+v 0.366252 1.086950 0.067572
+v 0.375774 1.074117 0.089489
+v 0.412030 1.025968 0.022825
+v 0.399988 1.044946 0.041803
+v 0.406954 1.032584 0.013206
+v 0.422313 1.006470 0.003327
+v 0.417535 1.018338 0.033710
+v 0.405332 1.037569 0.052942
+v 0.395060 1.051328 0.031951
+v 0.417110 1.013326 -0.006051
+v 0.427955 0.998579 0.013952
+v 0.442163 0.945687 -0.057456
+v 0.437412 0.966244 -0.036899
+v 0.436715 0.953293 -0.066085
+v 0.445026 0.924954 -0.078189
+v 0.448070 0.936985 -0.047643
+v 0.443255 0.957816 -0.026812
+v 0.432023 0.973596 -0.045782
+v 0.439544 0.932814 -0.086563
+v 0.450972 0.915974 -0.068654
+v 0.442163 0.862575 -0.140568
+v 0.445026 0.883309 -0.119834
+v 0.436715 0.871204 -0.148173
+v 0.437412 0.842018 -0.161124
+v 0.448070 0.852762 -0.131866
+v 0.450972 0.873773 -0.110855
+v 0.439544 0.891683 -0.127695
+v 0.432023 0.850901 -0.168477
+v 0.443255 0.831931 -0.152697
+v 0.412030 0.782294 -0.220849
+v 0.422313 0.801793 -0.201350
+v 0.406954 0.791913 -0.227465
+v 0.399988 0.763316 -0.239827
+v 0.417535 0.771409 -0.213218
+v 0.427955 0.791168 -0.193460
+v 0.417110 0.811171 -0.208207
+v 0.395060 0.773168 -0.246209
+v 0.405332 0.752177 -0.232450
+v 0.353818 0.710317 -0.292826
+v 0.370820 0.727251 -0.275892
+v 0.349459 0.720822 -0.298556
+v 0.335306 0.694210 -0.308933
+v 0.358545 0.698470 -0.286158
+v 0.375774 0.715630 -0.268998
+v 0.366252 0.737547 -0.281830
+v 0.331175 0.704914 -0.314464
+v 0.339786 0.682148 -0.302479
+v 0.271494 0.651548 -0.351595
+v 0.294056 0.664763 -0.338380
+v 0.268149 0.662777 -0.356601
+v 0.247773 0.639410 -0.363733
+v 0.275121 0.638915 -0.345712
+v 0.297985 0.652307 -0.332320
+v 0.290434 0.675829 -0.343548
+v 0.244721 0.650789 -0.368589
+v 0.251084 0.626616 -0.358012
+v 0.170668 0.609991 -0.393152
+v 0.197253 0.618588 -0.384555
+v 0.168566 0.621732 -0.397645
+v 0.143355 0.602650 -0.400492
+v 0.172949 0.596804 -0.387823
+v 0.199888 0.605515 -0.379112
+v 0.194823 0.630223 -0.389155
+v 0.141589 0.614482 -0.404896
+v 0.145271 0.589365 -0.395262
+v 0.058212 0.588480 -0.414663
+v 0.087007 0.591872 -0.411271
+v 0.057495 0.600486 -0.418891
+v 0.029168 0.586436 -0.416707
+v 0.058989 0.575005 -0.409622
+v 0.088170 0.578442 -0.406185
+v 0.085935 0.603836 -0.415541
+v 0.028809 0.598467 -0.420910
+v 0.029558 0.572934 -0.411693
+v -0.058212 0.588480 -0.414663
+v -0.029168 0.586436 -0.416707
+v -0.057495 0.600486 -0.418891
+v -0.087007 0.591872 -0.411271
+v -0.058990 0.575005 -0.409622
+v -0.029558 0.572934 -0.411694
+v -0.028809 0.598467 -0.420910
+v -0.085935 0.603836 -0.415541
+v -0.088170 0.578442 -0.406185
+v -0.170669 0.609991 -0.393151
+v -0.143356 0.602650 -0.400492
+v -0.168566 0.621732 -0.397645
+v -0.197253 0.618588 -0.384555
+v -0.172949 0.596804 -0.387823
+v -0.145271 0.589365 -0.395262
+v -0.141589 0.614482 -0.404896
+v -0.194823 0.630223 -0.389155
+v -0.199888 0.605515 -0.379112
+v -0.271494 0.651548 -0.351595
+v -0.247774 0.639410 -0.363733
+v -0.268150 0.662777 -0.356601
+v -0.294056 0.664763 -0.338380
+v -0.275122 0.638915 -0.345712
+v -0.251084 0.626616 -0.358012
+v -0.244721 0.650789 -0.368589
+v -0.290434 0.675829 -0.343548
+v -0.297985 0.652307 -0.332320
+v -0.353818 0.710317 -0.292826
+v -0.335306 0.694210 -0.308932
+v -0.349459 0.720822 -0.298556
+v -0.370820 0.727251 -0.275892
+v -0.358545 0.698470 -0.286157
+v -0.339786 0.682148 -0.302479
+v -0.331175 0.704914 -0.314464
+v -0.366252 0.737547 -0.281830
+v -0.375774 0.715630 -0.268997
+v -0.412030 0.782294 -0.220848
+v -0.399988 0.763316 -0.239827
+v -0.406954 0.791913 -0.227465
+v -0.422313 0.801793 -0.201350
+v -0.417535 0.771409 -0.213218
+v -0.405332 0.752177 -0.232450
+v -0.395061 0.773168 -0.246209
+v -0.417111 0.811171 -0.208207
+v -0.427955 0.791168 -0.193460
+v -0.442163 0.862575 -0.140568
+v -0.437412 0.842018 -0.161124
+v -0.436716 0.871204 -0.148173
+v -0.445027 0.883309 -0.119834
+v -0.448070 0.852762 -0.131865
+v -0.443256 0.831931 -0.152696
+v -0.432023 0.850901 -0.168476
+v -0.439544 0.891683 -0.127695
+v -0.450972 0.873773 -0.110855
+v -0.442163 0.945687 -0.057456
+v -0.445026 0.924954 -0.078189
+v -0.436715 0.953293 -0.066085
+v -0.437412 0.966244 -0.036899
+v -0.448070 0.936985 -0.047643
+v -0.450972 0.915974 -0.068653
+v -0.439544 0.932814 -0.086563
+v -0.432023 0.973596 -0.045782
+v -0.443255 0.957816 -0.026812
+v -0.378557 1.060922 -0.031926
+v -0.388004 1.043008 -0.049840
+v -0.370945 1.066989 -0.042493
+v -0.367493 1.078359 -0.014490
+v -0.385105 1.055399 -0.022530
+v -0.394717 1.037175 -0.040754
+v -0.380203 1.049435 -0.060047
+v -0.360104 1.084074 -0.025408
+v -0.373850 1.073137 -0.004792
+v -0.325074 1.127052 0.034204
+v -0.340695 1.111494 0.018646
+v -0.318538 1.131789 0.022307
+v -0.308066 1.141850 0.049002
+v -0.330698 1.122673 0.044744
+v -0.346588 1.106846 0.028917
+v -0.333845 1.116544 0.007062
+v -0.301872 1.146289 0.036808
+v -0.313395 1.137727 0.059798
+v -0.249438 1.181047 0.088199
+v -0.270167 1.168906 0.076057
+v -0.244423 1.184698 0.075216
+v -0.227644 1.192199 0.099350
+v -0.253753 1.177603 0.099673
+v -0.274841 1.165251 0.087321
+v -0.264735 1.172801 0.063319
+v -0.223067 1.195626 0.086143
+v -0.231582 1.188947 0.111017
+v -0.156803 1.219227 0.126379
+v -0.181228 1.211329 0.118481
+v -0.153651 1.222111 0.112629
+v -0.131709 1.225972 0.133124
+v -0.159516 1.216443 0.138514
+v -0.184363 1.208408 0.130479
+v -0.177584 1.214372 0.104890
+v -0.129061 1.228720 0.119238
+v -0.133988 1.223304 0.145375
+v -0.053483 1.238991 0.146143
+v -0.079939 1.235875 0.143027
+v -0.052407 1.241477 0.131995
+v -0.026798 1.240869 0.148021
+v -0.054408 1.236548 0.158619
+v -0.081322 1.233378 0.155449
+v -0.078331 1.238424 0.128942
+v -0.026260 1.243317 0.133835
+v -0.027262 1.238459 0.160530
+v 0.053483 1.238991 0.146143
+v 0.026798 1.240869 0.148021
+v 0.052407 1.241477 0.131995
+v 0.079939 1.235875 0.143027
+v 0.054408 1.236549 0.158619
+v 0.027262 1.238459 0.160530
+v 0.026260 1.243317 0.133835
+v 0.078331 1.238424 0.128942
+v 0.081322 1.233379 0.155449
+v 0.156803 1.219227 0.126379
+v 0.131709 1.225972 0.133124
+v 0.153651 1.222111 0.112629
+v 0.181228 1.211329 0.118481
+v 0.159516 1.216443 0.138514
+v 0.133988 1.223304 0.145375
+v 0.129061 1.228720 0.119238
+v 0.177584 1.214372 0.104890
+v 0.184363 1.208408 0.130479
+v 0.249438 1.181047 0.088199
+v 0.227644 1.192199 0.099350
+v 0.244423 1.184698 0.075216
+v 0.270167 1.168906 0.076057
+v 0.253753 1.177603 0.099673
+v 0.231582 1.188947 0.111017
+v 0.223067 1.195626 0.086143
+v 0.264735 1.172801 0.063319
+v 0.274841 1.165251 0.087321
+v 0.325074 1.127052 0.034204
+v 0.308066 1.141850 0.049002
+v 0.318538 1.131789 0.022307
+v 0.340695 1.111494 0.018646
+v 0.330698 1.122674 0.044744
+v 0.313395 1.137727 0.059798
+v 0.301872 1.146290 0.036808
+v 0.333845 1.116544 0.007062
+v 0.346588 1.106846 0.028917
+v 0.378557 1.060922 -0.031926
+v 0.367493 1.078359 -0.014490
+v 0.370945 1.066989 -0.042493
+v 0.388004 1.043008 -0.049840
+v 0.385105 1.055399 -0.022530
+v 0.373850 1.073137 -0.004792
+v 0.360104 1.084074 -0.025408
+v 0.380203 1.049435 -0.060047
+v 0.394717 1.037175 -0.040754
+v 0.406241 0.987164 -0.105684
+v 0.401876 1.006050 -0.086798
+v 0.398073 0.994713 -0.114769
+v 0.408872 0.968115 -0.124734
+v 0.413269 0.980365 -0.097564
+v 0.408829 0.999578 -0.078351
+v 0.393796 1.013220 -0.096262
+v 0.400652 0.976047 -0.133435
+v 0.415946 0.960986 -0.116943
+v 0.406241 0.910804 -0.182045
+v 0.408872 0.929853 -0.162995
+v 0.398073 0.919888 -0.189594
+v 0.401876 0.891917 -0.200931
+v 0.413269 0.902684 -0.175246
+v 0.415946 0.922062 -0.155867
+v 0.400652 0.938554 -0.170928
+v 0.393796 0.901381 -0.208101
+v 0.408829 0.883470 -0.194459
+v 0.378557 0.837045 -0.255803
+v 0.388004 0.854959 -0.237889
+v 0.370945 0.847613 -0.261869
+v 0.367493 0.819609 -0.273239
+v 0.385105 0.827649 -0.250280
+v 0.394717 0.845873 -0.232056
+v 0.380203 0.865166 -0.244315
+v 0.360104 0.830527 -0.278955
+v 0.373850 0.809911 -0.268018
+v 0.325074 0.770915 -0.321933
+v 0.340695 0.786473 -0.306375
+v 0.318538 0.782812 -0.326670
+v 0.308066 0.756117 -0.336731
+v 0.330698 0.760375 -0.317554
+v 0.346588 0.776202 -0.301727
+v 0.333845 0.798057 -0.311424
+v 0.301872 0.768312 -0.341170
+v 0.313395 0.745321 -0.332608
+v 0.249438 0.716920 -0.375928
+v 0.270167 0.729062 -0.363786
+v 0.244423 0.729903 -0.379579
+v 0.227644 0.705769 -0.387079
+v 0.253753 0.705446 -0.372483
+v 0.274841 0.717798 -0.360131
+v 0.264735 0.741801 -0.367681
+v 0.223067 0.718976 -0.390506
+v 0.231582 0.694102 -0.383827
+v 0.156803 0.678740 -0.414108
+v 0.181228 0.686638 -0.406210
+v 0.153651 0.692490 -0.416992
+v 0.131709 0.671995 -0.420853
+v 0.159516 0.666605 -0.411324
+v 0.184363 0.674640 -0.403289
+v 0.177584 0.700230 -0.409252
+v 0.129061 0.685881 -0.423600
+v 0.133988 0.659744 -0.418185
+v 0.053483 0.658976 -0.433872
+v 0.079939 0.662093 -0.430756
+v 0.052407 0.673124 -0.436358
+v 0.026798 0.657098 -0.435750
+v 0.054408 0.646500 -0.431429
+v 0.081322 0.649670 -0.428259
+v 0.078331 0.676178 -0.433304
+v 0.026260 0.671284 -0.438198
+v 0.027262 0.644589 -0.433340
+v -0.053483 0.658976 -0.433872
+v -0.026798 0.657098 -0.435750
+v -0.052407 0.673124 -0.436358
+v -0.079939 0.662093 -0.430756
+v -0.054408 0.646500 -0.431429
+v -0.027262 0.644589 -0.433340
+v -0.026260 0.671284 -0.438198
+v -0.078332 0.676178 -0.433304
+v -0.081322 0.649670 -0.428259
+v -0.156803 0.678740 -0.414108
+v -0.131709 0.671995 -0.420853
+v -0.153651 0.692490 -0.416992
+v -0.181228 0.686638 -0.406210
+v -0.159516 0.666605 -0.411324
+v -0.133988 0.659744 -0.418185
+v -0.129061 0.685881 -0.423600
+v -0.177584 0.700230 -0.409252
+v -0.184363 0.674640 -0.403289
+v -0.249438 0.716920 -0.375928
+v -0.227644 0.705769 -0.387079
+v -0.244423 0.729903 -0.379579
+v -0.270167 0.729062 -0.363786
+v -0.253753 0.705446 -0.372483
+v -0.231583 0.694102 -0.383827
+v -0.223067 0.718976 -0.390506
+v -0.264735 0.741801 -0.367681
+v -0.274841 0.717798 -0.360131
+v -0.325074 0.770915 -0.321933
+v -0.308066 0.756117 -0.336731
+v -0.318538 0.782812 -0.326670
+v -0.340695 0.786473 -0.306375
+v -0.330698 0.760375 -0.317554
+v -0.313395 0.745321 -0.332608
+v -0.301872 0.768312 -0.341170
+v -0.333845 0.798057 -0.311424
+v -0.346589 0.776202 -0.301727
+v -0.378557 0.837045 -0.255803
+v -0.367493 0.819609 -0.273239
+v -0.370946 0.847612 -0.261869
+v -0.388005 0.854959 -0.237889
+v -0.385106 0.827649 -0.250280
+v -0.373851 0.809911 -0.268018
+v -0.360104 0.830527 -0.278955
+v -0.380203 0.865166 -0.244315
+v -0.394717 0.845873 -0.232056
+v -0.406241 0.910804 -0.182045
+v -0.401876 0.891917 -0.200931
+v -0.398074 0.919888 -0.189594
+v -0.408873 0.929853 -0.162995
+v -0.413269 0.902683 -0.175246
+v -0.408829 0.883470 -0.194459
+v -0.393796 0.901381 -0.208100
+v -0.400652 0.938554 -0.170927
+v -0.415946 0.922062 -0.155867
+v -0.406241 0.987164 -0.105684
+v -0.408872 0.968115 -0.124734
+v -0.398074 0.994713 -0.114769
+v -0.401876 1.006050 -0.086798
+v -0.413269 0.980365 -0.097564
+v -0.415946 0.960986 -0.116943
+v -0.400652 0.976047 -0.133435
+v -0.393796 1.013220 -0.096262
+v -0.408829 0.999578 -0.078351
+v -0.343807 1.085149 -0.076703
+v -0.352388 1.068879 -0.092973
+v -0.333363 1.090716 -0.088447
+v -0.333759 1.100985 -0.060867
+v -0.353494 1.079306 -0.065132
+v -0.362317 1.062578 -0.081860
+v -0.341683 1.074941 -0.104222
+v -0.323620 1.106071 -0.073092
+v -0.343163 1.095588 -0.048850
+v -0.295234 1.145209 -0.016643
+v -0.309421 1.131078 -0.030773
+v -0.286265 1.148951 -0.030212
+v -0.279787 1.158648 -0.003204
+v -0.303552 1.141058 -0.003380
+v -0.318139 1.126530 -0.017908
+v -0.300021 1.135251 -0.043913
+v -0.271288 1.161983 -0.017180
+v -0.287670 1.154877 0.010439
+v -0.226541 1.194247 0.032395
+v -0.245367 1.183220 0.021368
+v -0.219659 1.196500 0.017337
+v -0.206748 1.204375 0.042523
+v -0.232924 1.191479 0.047040
+v -0.252281 1.180141 0.035702
+v -0.237914 1.185808 0.006645
+v -0.200467 1.206320 0.027157
+v -0.212573 1.201892 0.057453
+v -0.142410 1.228922 0.067070
+v -0.164592 1.221750 0.059897
+v -0.138084 1.230122 0.050959
+v -0.119619 1.235048 0.073196
+v -0.146422 1.227131 0.082693
+v -0.169230 1.219756 0.075318
+v -0.159592 1.223167 0.044004
+v -0.115985 1.236062 0.056898
+v -0.122989 1.233429 0.088991
+v -0.048573 1.246872 0.085020
+v -0.072601 1.244042 0.082190
+v -0.047098 1.247526 0.068363
+v -0.024338 1.248578 0.086726
+v -0.049942 1.245586 0.101148
+v -0.074646 1.242676 0.098238
+v -0.070395 1.244782 0.065619
+v -0.023599 1.249180 0.070017
+v -0.025024 1.247340 0.102902
+v 0.048573 1.246872 0.085020
+v 0.024338 1.248578 0.086726
+v 0.047098 1.247526 0.068363
+v 0.072601 1.244042 0.082190
+v 0.049942 1.245586 0.101148
+v 0.025024 1.247340 0.102902
+v 0.023599 1.249180 0.070017
+v 0.070395 1.244782 0.065619
+v 0.074646 1.242676 0.098238
+v 0.142410 1.228922 0.067070
+v 0.119619 1.235048 0.073196
+v 0.138084 1.230122 0.050959
+v 0.164592 1.221750 0.059897
+v 0.146422 1.227131 0.082693
+v 0.122989 1.233429 0.088991
+v 0.115985 1.236062 0.056898
+v 0.159592 1.223167 0.044004
+v 0.169230 1.219756 0.075318
+v 0.226541 1.194247 0.032395
+v 0.206748 1.204375 0.042523
+v 0.219659 1.196500 0.017337
+v 0.245367 1.183220 0.021368
+v 0.232924 1.191479 0.047040
+v 0.212573 1.201892 0.057453
+v 0.200467 1.206320 0.027157
+v 0.237913 1.185808 0.006645
+v 0.252281 1.180141 0.035702
+v 0.295234 1.145209 -0.016644
+v 0.279787 1.158648 -0.003204
+v 0.286265 1.148952 -0.030212
+v 0.309421 1.131079 -0.030773
+v 0.303552 1.141058 -0.003380
+v 0.287670 1.154877 0.010438
+v 0.271288 1.161983 -0.017180
+v 0.300021 1.135251 -0.043913
+v 0.318139 1.126530 -0.017908
+v 0.343807 1.085149 -0.076703
+v 0.333759 1.100985 -0.060867
+v 0.333363 1.090716 -0.088447
+v 0.352388 1.068879 -0.092973
+v 0.353494 1.079307 -0.065132
+v 0.343163 1.095588 -0.048850
+v 0.323620 1.106071 -0.073092
+v 0.341683 1.074941 -0.104222
+v 0.362317 1.062578 -0.081860
+v 0.368951 1.018161 -0.143691
+v 0.364986 1.035314 -0.126538
+v 0.357743 1.025763 -0.153400
+v 0.371340 1.000860 -0.160992
+v 0.379346 1.010431 -0.134007
+v 0.375270 1.028067 -0.116371
+v 0.353899 1.042395 -0.136768
+v 0.360060 1.008988 -0.170175
+v 0.381803 0.992643 -0.151795
+v 0.368951 0.948810 -0.213042
+v 0.371340 0.966111 -0.195741
+v 0.357743 0.958519 -0.220644
+v 0.364986 0.931657 -0.230194
+v 0.379346 0.939126 -0.205312
+v 0.381803 0.956914 -0.187524
+v 0.360060 0.975294 -0.203869
+v 0.353899 0.941887 -0.237276
+v 0.375270 0.921490 -0.222948
+v 0.343807 0.881822 -0.280030
+v 0.352388 0.898092 -0.263760
+v 0.333363 0.893566 -0.285597
+v 0.333759 0.865986 -0.295865
+v 0.353494 0.870251 -0.274187
+v 0.362317 0.886979 -0.257459
+v 0.341683 0.909342 -0.269821
+v 0.323620 0.878211 -0.300952
+v 0.343163 0.853969 -0.290469
+v 0.295234 0.821763 -0.340089
+v 0.309421 0.835893 -0.325959
+v 0.286265 0.835331 -0.343832
+v 0.279787 0.808323 -0.353529
+v 0.303552 0.808499 -0.335939
+v 0.318139 0.823027 -0.321411
+v 0.300021 0.849032 -0.330131
+v 0.271288 0.822300 -0.356863
+v 0.287670 0.794681 -0.349757
+v 0.226541 0.772724 -0.389128
+v 0.245367 0.783751 -0.378100
+v 0.219659 0.787782 -0.391381
+v 0.206748 0.762596 -0.399255
+v 0.232924 0.758079 -0.386359
+v 0.252281 0.769417 -0.375021
+v 0.237914 0.798474 -0.380689
+v 0.200467 0.777962 -0.401201
+v 0.212573 0.747666 -0.396772
+v 0.142410 0.738049 -0.423803
+v 0.164592 0.745222 -0.416630
+v 0.138084 0.754160 -0.425003
+v 0.119619 0.731923 -0.429929
+v 0.146422 0.722426 -0.422012
+v 0.169230 0.729802 -0.414636
+v 0.159592 0.761115 -0.418048
+v 0.115985 0.748221 -0.430942
+v 0.122989 0.716128 -0.428310
+v 0.048573 0.720099 -0.441752
+v 0.072601 0.722929 -0.438922
+v 0.047098 0.736756 -0.442407
+v 0.024338 0.718394 -0.443458
+v 0.049942 0.703971 -0.440467
+v 0.074646 0.706881 -0.437557
+v 0.070395 0.739500 -0.439663
+v 0.023599 0.735102 -0.444061
+v 0.025024 0.702217 -0.442221
+v -0.048573 0.720099 -0.441752
+v -0.024339 0.718394 -0.443458
+v -0.047098 0.736756 -0.442407
+v -0.072601 0.722929 -0.438922
+v -0.049942 0.703971 -0.440467
+v -0.025024 0.702217 -0.442221
+v -0.023599 0.735102 -0.444061
+v -0.070395 0.739500 -0.439663
+v -0.074646 0.706881 -0.437557
+v -0.142410 0.738049 -0.423803
+v -0.119619 0.731923 -0.429929
+v -0.138084 0.754160 -0.425003
+v -0.164592 0.745222 -0.416630
+v -0.146422 0.722426 -0.422012
+v -0.122990 0.716128 -0.428310
+v -0.115985 0.748221 -0.430942
+v -0.159592 0.761115 -0.418048
+v -0.169230 0.729801 -0.414636
+v -0.226541 0.772724 -0.389128
+v -0.206748 0.762596 -0.399255
+v -0.219659 0.787782 -0.391381
+v -0.245367 0.783751 -0.378100
+v -0.232924 0.758079 -0.386359
+v -0.212573 0.747666 -0.396772
+v -0.200467 0.777962 -0.401201
+v -0.237914 0.798474 -0.380689
+v -0.252281 0.769417 -0.375021
+v -0.295234 0.821763 -0.340089
+v -0.279787 0.808323 -0.353529
+v -0.286266 0.835331 -0.343832
+v -0.309421 0.835893 -0.325959
+v -0.303553 0.808499 -0.335939
+v -0.287670 0.794681 -0.349757
+v -0.271288 0.822300 -0.356863
+v -0.300021 0.849032 -0.330131
+v -0.318139 0.823027 -0.321411
+v -0.343807 0.881822 -0.280030
+v -0.333759 0.865986 -0.295865
+v -0.333363 0.893566 -0.285597
+v -0.352388 0.898092 -0.263760
+v -0.353495 0.870251 -0.274187
+v -0.343163 0.853969 -0.290469
+v -0.323620 0.878211 -0.300952
+v -0.341683 0.909342 -0.269821
+v -0.362317 0.886979 -0.257459
+v -0.368951 0.948810 -0.213042
+v -0.364986 0.931657 -0.230194
+v -0.357743 0.958519 -0.220644
+v -0.371340 0.966111 -0.195741
+v -0.379346 0.939126 -0.205312
+v -0.375270 0.921490 -0.222948
+v -0.353899 0.941887 -0.237276
+v -0.360060 0.975294 -0.203869
+v -0.381803 0.956914 -0.187524
+v -0.368951 1.018161 -0.143691
+v -0.371340 1.000860 -0.160992
+v -0.357743 1.025763 -0.153400
+v -0.364986 1.035314 -0.126538
+v -0.379346 1.010431 -0.134007
+v -0.381803 0.992643 -0.151795
+v -0.360060 1.008988 -0.170175
+v -0.353899 1.042395 -0.136768
+v -0.375270 1.028067 -0.116371
+v -0.297773 1.105149 -0.123952
+v -0.309857 1.100833 -0.112465
+v -0.305204 1.091060 -0.138041
+v -0.286886 1.108723 -0.134034
+v -0.289070 1.118863 -0.110238
+v -0.300801 1.115105 -0.098193
+v -0.317590 1.086170 -0.127128
+v -0.294046 1.095155 -0.147603
+v -0.278502 1.121930 -0.120828
+v -0.255703 1.157160 -0.071941
+v -0.266080 1.154962 -0.058336
+v -0.267990 1.144924 -0.084177
+v -0.246355 1.158811 -0.083946
+v -0.242324 1.168799 -0.060302
+v -0.252159 1.167075 -0.046224
+v -0.278866 1.142227 -0.071071
+v -0.258193 1.147027 -0.095730
+v -0.233465 1.170020 -0.072738
+v -0.196208 1.199627 -0.029474
+v -0.204171 1.199158 -0.014140
+v -0.212513 1.190077 -0.039024
+v -0.189035 1.199708 -0.043049
+v -0.179065 1.208397 -0.020704
+v -0.186332 1.208286 -0.005013
+v -0.221138 1.189220 -0.024079
+v -0.204744 1.190512 -0.052246
+v -0.172518 1.208154 -0.034603
+v -0.123341 1.229655 0.000554
+v -0.128347 1.230410 0.017111
+v -0.142554 1.223444 -0.005657
+v -0.118832 1.228627 -0.014131
+v -0.103602 1.234960 0.005859
+v -0.107807 1.235930 0.022632
+v -0.148339 1.223945 0.010646
+v -0.137342 1.222645 -0.020113
+v -0.099815 1.233735 -0.009022
+v -0.042070 1.245199 0.016098
+v -0.043777 1.246586 0.033288
+v -0.062880 1.242748 0.013648
+v -0.040531 1.243596 0.000838
+v -0.021080 1.246676 0.017576
+v -0.021935 1.248124 0.034825
+v -0.065432 1.244036 0.030737
+v -0.060581 1.241236 -0.001522
+v -0.020309 1.245018 0.002261
+v 0.042069 1.245199 0.016098
+v 0.043777 1.246586 0.033288
+v 0.021080 1.246676 0.017576
+v 0.040531 1.243596 0.000839
+v 0.062880 1.242748 0.013648
+v 0.065432 1.244036 0.030737
+v 0.021935 1.248124 0.034825
+v 0.020309 1.245018 0.002261
+v 0.060581 1.241236 -0.001522
+v 0.123341 1.229655 0.000554
+v 0.128347 1.230410 0.017111
+v 0.103602 1.234960 0.005859
+v 0.118832 1.228627 -0.014131
+v 0.142554 1.223444 -0.005657
+v 0.148339 1.223945 0.010646
+v 0.107807 1.235930 0.022632
+v 0.099815 1.233735 -0.009022
+v 0.137342 1.222645 -0.020113
+v 0.196208 1.199627 -0.029474
+v 0.204171 1.199158 -0.014140
+v 0.179065 1.208397 -0.020704
+v 0.189035 1.199708 -0.043049
+v 0.212513 1.190077 -0.039024
+v 0.221138 1.189220 -0.024079
+v 0.186332 1.208286 -0.005013
+v 0.172518 1.208154 -0.034603
+v 0.204744 1.190512 -0.052246
+v 0.255703 1.157160 -0.071941
+v 0.266080 1.154962 -0.058336
+v 0.242324 1.168799 -0.060302
+v 0.246355 1.158811 -0.083946
+v 0.267990 1.144924 -0.084177
+v 0.278866 1.142227 -0.071071
+v 0.252159 1.167075 -0.046224
+v 0.233465 1.170020 -0.072738
+v 0.258193 1.147027 -0.095730
+v 0.297773 1.105149 -0.123952
+v 0.309857 1.100833 -0.112465
+v 0.289070 1.118863 -0.110238
+v 0.286886 1.108723 -0.134034
+v 0.305204 1.091060 -0.138041
+v 0.317590 1.086170 -0.127128
+v 0.300801 1.115105 -0.098193
+v 0.278502 1.121930 -0.120828
+v 0.294046 1.095155 -0.147603
+v 0.319549 1.047139 -0.181962
+v 0.332518 1.040460 -0.172838
+v 0.316116 1.061993 -0.167108
+v 0.307867 1.052857 -0.189901
+v 0.321619 1.032156 -0.196944
+v 0.334671 1.024868 -0.188431
+v 0.328945 1.055919 -0.157379
+v 0.304559 1.067162 -0.175596
+v 0.309861 1.038428 -0.204329
+v 0.319549 0.987081 -0.242019
+v 0.332518 0.977957 -0.235341
+v 0.321619 1.002064 -0.227037
+v 0.307867 0.995020 -0.247738
+v 0.316116 0.972227 -0.256873
+v 0.328945 0.962498 -0.250800
+v 0.334671 0.993550 -0.219749
+v 0.309861 1.009448 -0.233309
+v 0.304559 0.980715 -0.262043
+v 0.297773 0.929071 -0.300030
+v 0.309857 0.917584 -0.295714
+v 0.305204 0.943160 -0.285941
+v 0.286886 0.939154 -0.303604
+v 0.289070 0.915357 -0.313744
+v 0.300801 0.903312 -0.309986
+v 0.317590 0.932248 -0.281051
+v 0.294046 0.952722 -0.290035
+v 0.278502 0.925947 -0.316810
+v 0.255703 0.877060 -0.352041
+v 0.266080 0.863456 -0.349843
+v 0.267990 0.889296 -0.339804
+v 0.246355 0.889065 -0.353692
+v 0.242324 0.865421 -0.363679
+v 0.252159 0.851343 -0.361955
+v 0.278866 0.876190 -0.337108
+v 0.258193 0.900849 -0.341908
+v 0.233465 0.877857 -0.364900
+v 0.196208 0.834593 -0.394508
+v 0.204171 0.819259 -0.394039
+v 0.212513 0.844143 -0.384958
+v 0.189035 0.848168 -0.394589
+v 0.179065 0.825823 -0.403278
+v 0.186332 0.810132 -0.403166
+v 0.221138 0.829198 -0.384100
+v 0.204744 0.857365 -0.385392
+v 0.172518 0.839722 -0.403035
+v 0.123341 0.804565 -0.424536
+v 0.128347 0.788008 -0.425290
+v 0.142554 0.810776 -0.418324
+v 0.118832 0.819250 -0.423507
+v 0.103602 0.799260 -0.429841
+v 0.107807 0.782488 -0.430811
+v 0.148339 0.794473 -0.418825
+v 0.137342 0.825232 -0.417525
+v 0.099815 0.814142 -0.428616
+v 0.042069 0.789021 -0.440080
+v 0.043777 0.771831 -0.441467
+v 0.062880 0.791472 -0.437629
+v 0.040531 0.804281 -0.438477
+v 0.021080 0.787544 -0.441557
+v 0.021935 0.770294 -0.443004
+v 0.065432 0.774382 -0.438916
+v 0.060581 0.806641 -0.436117
+v 0.020309 0.802858 -0.439899
+v -0.042070 0.789021 -0.440080
+v -0.043777 0.771831 -0.441467
+v -0.021080 0.787544 -0.441557
+v -0.040531 0.804281 -0.438477
+v -0.062880 0.791472 -0.437629
+v -0.065432 0.774382 -0.438916
+v -0.021935 0.770294 -0.443004
+v -0.020309 0.802858 -0.439899
+v -0.060581 0.806641 -0.436116
+v -0.123342 0.804565 -0.424536
+v -0.128347 0.788008 -0.425290
+v -0.103603 0.799260 -0.429841
+v -0.118832 0.819250 -0.423507
+v -0.142554 0.810776 -0.418324
+v -0.148339 0.794473 -0.418825
+v -0.107807 0.782487 -0.430811
+v -0.099815 0.814142 -0.428616
+v -0.137342 0.825232 -0.417525
+v -0.196208 0.834593 -0.394508
+v -0.204171 0.819259 -0.394039
+v -0.179065 0.825823 -0.403278
+v -0.189035 0.848168 -0.394589
+v -0.212513 0.844143 -0.384958
+v -0.221138 0.829198 -0.384100
+v -0.186332 0.810132 -0.403166
+v -0.172518 0.839722 -0.403035
+v -0.204744 0.857365 -0.385392
+v -0.255703 0.877060 -0.352041
+v -0.266080 0.863456 -0.349843
+v -0.242325 0.865421 -0.363679
+v -0.246355 0.889065 -0.353692
+v -0.267990 0.889296 -0.339804
+v -0.278866 0.876190 -0.337108
+v -0.252159 0.851343 -0.361955
+v -0.233465 0.877857 -0.364900
+v -0.258193 0.900849 -0.341908
+v -0.297773 0.929071 -0.300030
+v -0.309857 0.917584 -0.295714
+v -0.289070 0.915357 -0.313743
+v -0.286886 0.939154 -0.303604
+v -0.305204 0.943160 -0.285940
+v -0.317591 0.932248 -0.281051
+v -0.300801 0.903312 -0.309986
+v -0.278502 0.925947 -0.316810
+v -0.294046 0.952722 -0.290035
+v -0.319550 0.987081 -0.242019
+v -0.332518 0.977957 -0.235341
+v -0.316116 0.972227 -0.256873
+v -0.307867 0.995020 -0.247738
+v -0.321619 1.002064 -0.227037
+v -0.334671 0.993550 -0.219748
+v -0.328945 0.962498 -0.250800
+v -0.304559 0.980715 -0.262042
+v -0.309861 1.009448 -0.233309
+v -0.319549 1.047139 -0.181962
+v -0.332518 1.040460 -0.172838
+v -0.321619 1.032156 -0.196944
+v -0.307867 1.052857 -0.189901
+v -0.316116 1.061993 -0.167108
+v -0.328945 1.055919 -0.157379
+v -0.334671 1.024868 -0.188430
+v -0.309861 1.038428 -0.204329
+v -0.304559 1.067162 -0.175596
+v -0.007356 0.394313 0.408529
+v -0.010181 0.394340 0.408304
+v -0.006553 0.394950 0.409250
+v -0.006267 0.394197 0.408497
+v -0.009798 0.393320 0.407285
+v -0.012422 0.393418 0.407153
+v -0.009456 0.395004 0.409045
+v -0.005453 0.394891 0.409276
+v -0.008727 0.393069 0.407111
+v -0.425923 0.967303 -0.082124
+v -0.428681 0.947331 -0.102097
+v -0.422877 0.970649 -0.086042
+v -0.421346 0.987105 -0.062323
+v -0.428762 0.963853 -0.078140
+v -0.431539 0.943747 -0.098245
+v -0.425615 0.950819 -0.105871
+v -0.418333 0.990308 -0.066382
+v -0.424155 0.983786 -0.058207
+v -0.425923 0.887244 -0.162184
+v -0.421346 0.867442 -0.181986
+v -0.422877 0.891161 -0.165529
+v -0.428681 0.907216 -0.142212
+v -0.428762 0.883259 -0.158734
+v -0.424155 0.863326 -0.178667
+v -0.418333 0.871502 -0.185189
+v -0.425615 0.910991 -0.145700
+v -0.431539 0.903365 -0.138628
+v -0.396897 0.809912 -0.239516
+v -0.385297 0.791631 -0.257797
+v -0.394058 0.814382 -0.242308
+v -0.406802 0.828694 -0.220734
+v -0.399543 0.805412 -0.236581
+v -0.387866 0.787009 -0.254984
+v -0.382542 0.796232 -0.260458
+v -0.403893 0.833030 -0.223660
+v -0.409514 0.824319 -0.217674
+v -0.340823 0.740578 -0.308850
+v -0.322991 0.725063 -0.324365
+v -0.338386 0.745545 -0.311146
+v -0.357201 0.756890 -0.292538
+v -0.343095 0.735616 -0.306377
+v -0.325144 0.719997 -0.321995
+v -0.320681 0.730141 -0.326550
+v -0.354646 0.761740 -0.294951
+v -0.359582 0.752036 -0.289956
+v -0.261523 0.683967 -0.365461
+v -0.238673 0.672276 -0.377152
+v -0.259652 0.689339 -0.367352
+v -0.283256 0.696697 -0.352731
+v -0.263266 0.678628 -0.363365
+v -0.240264 0.666858 -0.375135
+v -0.236966 0.677731 -0.378960
+v -0.281230 0.701978 -0.354713
+v -0.285144 0.691442 -0.350550
+v -0.164400 0.643937 -0.405491
+v -0.138090 0.636866 -0.412562
+v -0.163224 0.649595 -0.407096
+v -0.190008 0.652218 -0.397210
+v -0.165496 0.638331 -0.403662
+v -0.139011 0.631212 -0.410780
+v -0.137103 0.642574 -0.414116
+v -0.188649 0.657816 -0.398874
+v -0.191275 0.646667 -0.395326
+v -0.056074 0.623216 -0.426212
+v -0.028097 0.621247 -0.428181
+v -0.055673 0.629022 -0.427668
+v -0.083812 0.626483 -0.422945
+v -0.056448 0.617472 -0.424521
+v -0.028284 0.615489 -0.426503
+v -0.027896 0.627067 -0.429624
+v -0.083212 0.632266 -0.424425
+v -0.084370 0.620760 -0.421232
+v 0.056074 0.623216 -0.426212
+v 0.083811 0.626483 -0.422945
+v 0.055673 0.629022 -0.427668
+v 0.028097 0.621247 -0.428181
+v 0.056448 0.617472 -0.424521
+v 0.084370 0.620761 -0.421232
+v 0.083212 0.632266 -0.424425
+v 0.027896 0.627067 -0.429624
+v 0.028284 0.615489 -0.426503
+v 0.164400 0.643937 -0.405491
+v 0.163224 0.649595 -0.407096
+v 0.138090 0.636866 -0.412562
+v 0.165496 0.638331 -0.403662
+v 0.190008 0.652218 -0.397210
+v 0.188649 0.657817 -0.398874
+v 0.137103 0.642574 -0.414116
+v 0.139011 0.631212 -0.410780
+v 0.191275 0.646667 -0.395326
+v 0.261523 0.683967 -0.365461
+v 0.283256 0.696697 -0.352731
+v 0.259652 0.689339 -0.367352
+v 0.238673 0.672276 -0.377152
+v 0.263266 0.678628 -0.363365
+v 0.285144 0.691442 -0.350550
+v 0.281230 0.701978 -0.354713
+v 0.236966 0.677731 -0.378960
+v 0.240264 0.666858 -0.375135
+v 0.340823 0.740578 -0.308850
+v 0.357200 0.756890 -0.292538
+v 0.338385 0.745545 -0.311146
+v 0.322991 0.725063 -0.324365
+v 0.343095 0.735616 -0.306377
+v 0.359582 0.752036 -0.289956
+v 0.354646 0.761740 -0.294951
+v 0.320681 0.730141 -0.326550
+v 0.325144 0.719997 -0.321995
+v 0.396897 0.809912 -0.239516
+v 0.406802 0.828694 -0.220734
+v 0.394058 0.814383 -0.242308
+v 0.385297 0.791631 -0.257797
+v 0.399543 0.805412 -0.236581
+v 0.409514 0.824319 -0.217674
+v 0.403893 0.833030 -0.223660
+v 0.382541 0.796232 -0.260459
+v 0.387866 0.787009 -0.254984
+v 0.425923 0.887244 -0.162184
+v 0.428681 0.907216 -0.142212
+v 0.422876 0.891161 -0.165529
+v 0.421346 0.867442 -0.181986
+v 0.428762 0.883259 -0.158734
+v 0.431539 0.903365 -0.138628
+v 0.425615 0.910991 -0.145700
+v 0.418333 0.871502 -0.185189
+v 0.424155 0.863326 -0.178667
+v 0.425923 0.967304 -0.082124
+v 0.421346 0.987105 -0.062323
+v 0.422876 0.970649 -0.086042
+v 0.428681 0.947331 -0.102097
+v 0.428762 0.963853 -0.078140
+v 0.424155 0.983786 -0.058207
+v 0.418333 0.990308 -0.066382
+v 0.425615 0.950819 -0.105872
+v 0.431539 0.943747 -0.098246
+v 0.396897 1.044635 -0.004793
+v 0.385297 1.062916 0.013488
+v 0.394058 1.047427 -0.009263
+v 0.406802 1.025853 -0.023575
+v 0.399543 1.041700 -0.000293
+v 0.387866 1.060103 0.018110
+v 0.382541 1.065578 0.008887
+v 0.403893 1.028780 -0.027911
+v 0.409514 1.022793 -0.019200
+v 0.340823 1.113969 0.064541
+v 0.322991 1.129484 0.080056
+v 0.338385 1.116265 0.059575
+v 0.357200 1.097657 0.048229
+v 0.343095 1.111496 0.069503
+v 0.325144 1.127115 0.085122
+v 0.320681 1.131669 0.074979
+v 0.354646 1.100070 0.043379
+v 0.359582 1.095076 0.053083
+v 0.261523 1.170580 0.121152
+v 0.238673 1.182271 0.132844
+v 0.259652 1.172471 0.115781
+v 0.283256 1.157850 0.108422
+v 0.263266 1.168485 0.126492
+v 0.240264 1.180254 0.138261
+v 0.236966 1.184079 0.127388
+v 0.281230 1.159832 0.103142
+v 0.285144 1.155670 0.113677
+v 0.164400 1.210610 0.161182
+v 0.138090 1.217681 0.168253
+v 0.163224 1.212215 0.155524
+v 0.190008 1.202329 0.152901
+v 0.165496 1.208781 0.166788
+v 0.139011 1.215900 0.173907
+v 0.137103 1.219236 0.162545
+v 0.188649 1.203993 0.147303
+v 0.191275 1.200445 0.158452
+v 0.056074 1.231331 0.181903
+v 0.028097 1.233300 0.183872
+v 0.055673 1.232788 0.176097
+v 0.083811 1.228064 0.178636
+v 0.056448 1.229640 0.187647
+v 0.028284 1.231623 0.189630
+v 0.027896 1.234743 0.178052
+v 0.083212 1.229544 0.172853
+v 0.084370 1.226352 0.184359
+v -0.056074 1.231331 0.181903
+v -0.083812 1.228064 0.178636
+v -0.055673 1.232788 0.176097
+v -0.028097 1.233300 0.183872
+v -0.056448 1.229640 0.187647
+v -0.084370 1.226351 0.184359
+v -0.083212 1.229544 0.172853
+v -0.027896 1.234743 0.178052
+v -0.028284 1.231623 0.189630
+v -0.164400 1.210610 0.161182
+v -0.190008 1.202329 0.152901
+v -0.163224 1.212215 0.155524
+v -0.138090 1.217681 0.168253
+v -0.165496 1.208781 0.166788
+v -0.191275 1.200445 0.158452
+v -0.188649 1.203993 0.147303
+v -0.137103 1.219236 0.162545
+v -0.139011 1.215900 0.173907
+v -0.261523 1.170580 0.121152
+v -0.283256 1.157850 0.108422
+v -0.259652 1.172471 0.115781
+v -0.238673 1.182271 0.132844
+v -0.263266 1.168484 0.126492
+v -0.285144 1.155670 0.113677
+v -0.281230 1.159832 0.103142
+v -0.236966 1.184079 0.127388
+v -0.240264 1.180254 0.138261
+v -0.340823 1.113969 0.064541
+v -0.357200 1.097657 0.048229
+v -0.338385 1.116265 0.059575
+v -0.322991 1.129484 0.080056
+v -0.343095 1.111496 0.069503
+v -0.359582 1.095076 0.053083
+v -0.354646 1.100070 0.043379
+v -0.320681 1.131669 0.074979
+v -0.325144 1.127115 0.085122
+v -0.396897 1.044635 -0.004793
+v -0.406802 1.025853 -0.023575
+v -0.394058 1.047427 -0.009263
+v -0.385297 1.062916 0.013488
+v -0.399543 1.041700 -0.000293
+v -0.409514 1.022793 -0.019200
+v -0.403893 1.028780 -0.027911
+v -0.382541 1.065578 0.008887
+v -0.387866 1.060103 0.018110
+v -0.108841 0.358988 0.509889
+v -0.091215 0.351316 0.507236
+v -0.105660 0.363954 0.514854
+v -0.126562 0.367152 0.512106
+v -0.111557 0.353887 0.504787
+v -0.093492 0.347040 0.502961
+v -0.088549 0.355477 0.511398
+v -0.122863 0.372926 0.517880
+v -0.129721 0.361220 0.506174
+v -0.093464 0.377821 0.528722
+v -0.078328 0.367099 0.523019
+v -0.088574 0.382036 0.532936
+v -0.108681 0.389051 0.534005
+v -0.097955 0.373391 0.524291
+v -0.082092 0.363386 0.519306
+v -0.074230 0.370631 0.526551
+v -0.102995 0.393952 0.538906
+v -0.113904 0.383899 0.528853
+v -0.071717 0.393198 0.544099
+v -0.060103 0.379986 0.535906
+v -0.065451 0.396374 0.547274
+v -0.083394 0.406932 0.551886
+v -0.077677 0.389741 0.540641
+v -0.065098 0.377088 0.533008
+v -0.054852 0.382648 0.538568
+v -0.076108 0.410625 0.555579
+v -0.090324 0.402911 0.547865
+v -0.045083 0.404072 0.554972
+v -0.037782 0.389098 0.545019
+v -0.037868 0.405992 0.556893
+v -0.052424 0.419576 0.564530
+v -0.052106 0.401822 0.552723
+v -0.043668 0.387213 0.543134
+v -0.031736 0.390708 0.546628
+v -0.044034 0.421809 0.566763
+v -0.060590 0.416960 0.561914
+v -0.015377 0.409700 0.560600
+v -0.012887 0.393815 0.549736
+v -0.007705 0.410235 0.561135
+v -0.017881 0.426121 0.571075
+v -0.022984 0.408813 0.559713
+v -0.019262 0.393072 0.548992
+v -0.006457 0.394264 0.550184
+v -0.008959 0.426743 0.571697
+v -0.026726 0.425089 0.570043
+v 0.015377 0.409700 0.560600
+v 0.012887 0.393815 0.549736
+v 0.022984 0.408813 0.559713
+v 0.017881 0.426121 0.571075
+v 0.007705 0.410235 0.561135
+v 0.006457 0.394264 0.550184
+v 0.019262 0.393072 0.548992
+v 0.026726 0.425089 0.570043
+v 0.008960 0.426743 0.571697
+v 0.045083 0.404072 0.554972
+v 0.037783 0.389099 0.545019
+v 0.052106 0.401822 0.552723
+v 0.052424 0.419576 0.564530
+v 0.037868 0.405992 0.556893
+v 0.031736 0.390708 0.546628
+v 0.043668 0.387213 0.543134
+v 0.060590 0.416960 0.561914
+v 0.044034 0.421809 0.566763
+v 0.071717 0.393198 0.544099
+v 0.060103 0.379986 0.535906
+v 0.077677 0.389741 0.540641
+v 0.083394 0.406932 0.551886
+v 0.065451 0.396374 0.547274
+v 0.054852 0.382648 0.538568
+v 0.065098 0.377088 0.533008
+v 0.090325 0.402911 0.547865
+v 0.076108 0.410625 0.555579
+v 0.093464 0.377821 0.528722
+v 0.078328 0.367099 0.523019
+v 0.097955 0.373391 0.524291
+v 0.108682 0.389051 0.534005
+v 0.088574 0.382036 0.532936
+v 0.074230 0.370631 0.526551
+v 0.082092 0.363386 0.519306
+v 0.113904 0.383899 0.528853
+v 0.102995 0.393952 0.538906
+v 0.108841 0.358988 0.509889
+v 0.091215 0.351316 0.507236
+v 0.111557 0.353887 0.504787
+v 0.126562 0.367152 0.512106
+v 0.105660 0.363954 0.514854
+v 0.088549 0.355477 0.511398
+v 0.093492 0.347040 0.502961
+v 0.129721 0.361220 0.506174
+v 0.122864 0.372926 0.517880
+v 0.116801 0.337983 0.488883
+v 0.097886 0.333712 0.489632
+v 0.117557 0.332558 0.483458
+v 0.135818 0.342726 0.487680
+v 0.115546 0.343361 0.494262
+v 0.096834 0.338220 0.494140
+v 0.098520 0.329166 0.485086
+v 0.136698 0.336418 0.481372
+v 0.134359 0.348981 0.493935
+v 0.116801 0.316236 0.467137
+v 0.097886 0.315487 0.471407
+v 0.115546 0.310858 0.461758
+v 0.135818 0.317439 0.462393
+v 0.117557 0.321661 0.472562
+v 0.098520 0.320034 0.475954
+v 0.096834 0.310980 0.466900
+v 0.134359 0.311185 0.456139
+v 0.136698 0.323747 0.468701
+v 0.108841 0.295231 0.446131
+v 0.091215 0.297883 0.453803
+v 0.105660 0.290265 0.441166
+v 0.126562 0.293013 0.437967
+v 0.111557 0.300333 0.451233
+v 0.093492 0.302159 0.458079
+v 0.088549 0.293722 0.449642
+v 0.122864 0.287239 0.432193
+v 0.129721 0.298946 0.443900
+v 0.093464 0.276398 0.427298
+v 0.078328 0.282100 0.438020
+v 0.088574 0.272184 0.423084
+v 0.108682 0.271114 0.416068
+v 0.097955 0.280829 0.431729
+v 0.082092 0.285813 0.441734
+v 0.074230 0.278568 0.434488
+v 0.102995 0.266214 0.411168
+v 0.113904 0.276266 0.421220
+v 0.071717 0.261021 0.411921
+v 0.060103 0.269213 0.425133
+v 0.065451 0.257845 0.408745
+v 0.083394 0.253233 0.398187
+v 0.077677 0.264479 0.415379
+v 0.065098 0.272111 0.428031
+v 0.054852 0.266552 0.422472
+v 0.076108 0.249540 0.394494
+v 0.090325 0.257254 0.402208
+v 0.045083 0.250147 0.401048
+v 0.037783 0.260101 0.416021
+v 0.037868 0.248227 0.399127
+v 0.052424 0.240590 0.385544
+v 0.052106 0.252397 0.403297
+v 0.043668 0.261986 0.417906
+v 0.031736 0.258491 0.414411
+v 0.044034 0.238356 0.383310
+v 0.060590 0.243205 0.388159
+v 0.015377 0.244519 0.395419
+v 0.012887 0.255384 0.411304
+v 0.007705 0.243984 0.394885
+v 0.017881 0.234045 0.378999
+v 0.022984 0.245407 0.396307
+v 0.019262 0.256128 0.412048
+v 0.006457 0.254936 0.410856
+v 0.008960 0.233423 0.378377
+v 0.026726 0.235077 0.380031
+v -0.015377 0.244519 0.395419
+v -0.012887 0.255384 0.411304
+v -0.022984 0.245407 0.396307
+v -0.017881 0.234045 0.378999
+v -0.007705 0.243984 0.394885
+v -0.006457 0.254936 0.410856
+v -0.019262 0.256128 0.412048
+v -0.026726 0.235077 0.380031
+v -0.008959 0.233423 0.378377
+v -0.045083 0.250147 0.401048
+v -0.037783 0.260101 0.416021
+v -0.052106 0.252397 0.403297
+v -0.052424 0.240590 0.385544
+v -0.037868 0.248227 0.399127
+v -0.031736 0.258491 0.414411
+v -0.043668 0.261986 0.417906
+v -0.060590 0.243205 0.388159
+v -0.044034 0.238356 0.383310
+v -0.071717 0.261021 0.411921
+v -0.060103 0.269213 0.425133
+v -0.077677 0.264479 0.415379
+v -0.083394 0.253233 0.398187
+v -0.065451 0.257845 0.408745
+v -0.054852 0.266552 0.422472
+v -0.065098 0.272111 0.428031
+v -0.090325 0.257254 0.402208
+v -0.076108 0.249540 0.394494
+v -0.093464 0.276398 0.427298
+v -0.078328 0.282100 0.438020
+v -0.097955 0.280829 0.431729
+v -0.108681 0.271114 0.416068
+v -0.088574 0.272184 0.423084
+v -0.074230 0.278568 0.434488
+v -0.082092 0.285813 0.441734
+v -0.113904 0.276266 0.421220
+v -0.102995 0.266214 0.411168
+v -0.108841 0.295231 0.446131
+v -0.091215 0.297883 0.453804
+v -0.111557 0.300333 0.451233
+v -0.126562 0.293013 0.437967
+v -0.105660 0.290265 0.441166
+v -0.088549 0.293722 0.449642
+v -0.093492 0.302159 0.458079
+v -0.129721 0.298946 0.443900
+v -0.122863 0.287239 0.432193
+v -0.116801 0.316236 0.467137
+v -0.097886 0.315487 0.471407
+v -0.117557 0.321661 0.472562
+v -0.135818 0.317439 0.462393
+v -0.115546 0.310858 0.461758
+v -0.096834 0.310980 0.466900
+v -0.098520 0.320034 0.475954
+v -0.136698 0.323747 0.468701
+v -0.134359 0.311185 0.456139
+v -0.116801 0.337983 0.488883
+v -0.097886 0.333712 0.489632
+v -0.115545 0.343361 0.494262
+v -0.135818 0.342726 0.487680
+v -0.117557 0.332558 0.483458
+v -0.098520 0.329166 0.485086
+v -0.096834 0.338220 0.494140
+v -0.134359 0.348981 0.493935
+v -0.136698 0.336418 0.481372
+v -0.179156 0.394175 0.515891
+v -0.161792 0.384773 0.515122
+v -0.173920 0.402349 0.524065
+v -0.196329 0.403958 0.516168
+v -0.183627 0.385778 0.507494
+v -0.165830 0.377190 0.507538
+v -0.157063 0.392155 0.522503
+v -0.190591 0.412916 0.525125
+v -0.201228 0.394756 0.506965
+v -0.153845 0.425175 0.546891
+v -0.138934 0.412768 0.543117
+v -0.145795 0.432112 0.553828
+v -0.168591 0.437930 0.550139
+v -0.161237 0.417882 0.539598
+v -0.145610 0.406182 0.536531
+v -0.131665 0.419033 0.549382
+v -0.159770 0.445532 0.557741
+v -0.176692 0.429937 0.542147
+v -0.118049 0.450487 0.572202
+v -0.106608 0.435627 0.565975
+v -0.107735 0.455714 0.577430
+v -0.129365 0.465667 0.577876
+v -0.127859 0.444795 0.566510
+v -0.115467 0.430487 0.560835
+v -0.097293 0.440347 0.570696
+v -0.118062 0.471396 0.583605
+v -0.140115 0.459430 0.571639
+v -0.074209 0.468384 0.590100
+v -0.067016 0.451790 0.582138
+v -0.062333 0.471546 0.593262
+v -0.081322 0.485280 0.597490
+v -0.085768 0.464682 0.586398
+v -0.077455 0.448446 0.578794
+v -0.056291 0.454645 0.584993
+v -0.068308 0.488745 0.600954
+v -0.093989 0.481223 0.593432
+v -0.025311 0.477649 0.599365
+v -0.022858 0.460156 0.590505
+v -0.012683 0.478529 0.600245
+v -0.027737 0.495433 0.607642
+v -0.037832 0.476188 0.597904
+v -0.034165 0.458837 0.589186
+v -0.011453 0.460951 0.591300
+v -0.013898 0.496398 0.608607
+v -0.041458 0.493832 0.606041
+v 0.025311 0.477649 0.599365
+v 0.022858 0.460156 0.590505
+v 0.037832 0.476188 0.597904
+v 0.027737 0.495433 0.607642
+v 0.012683 0.478529 0.600245
+v 0.011453 0.460951 0.591300
+v 0.034165 0.458837 0.589185
+v 0.041458 0.493832 0.606041
+v 0.013898 0.496398 0.608607
+v 0.074209 0.468384 0.590100
+v 0.067016 0.451790 0.582138
+v 0.085768 0.464682 0.586398
+v 0.081322 0.485280 0.597490
+v 0.062333 0.471546 0.593262
+v 0.056291 0.454645 0.584993
+v 0.077455 0.448446 0.578794
+v 0.093989 0.481223 0.593432
+v 0.068308 0.488745 0.600954
+v 0.118049 0.450487 0.572202
+v 0.106608 0.435627 0.565975
+v 0.127860 0.444795 0.566511
+v 0.129365 0.465667 0.577876
+v 0.107735 0.455714 0.577430
+v 0.097293 0.440347 0.570696
+v 0.115467 0.430487 0.560835
+v 0.140115 0.459430 0.571639
+v 0.118062 0.471396 0.583605
+v 0.153845 0.425175 0.546891
+v 0.138934 0.412768 0.543117
+v 0.161238 0.417882 0.539598
+v 0.168591 0.437930 0.550139
+v 0.145796 0.432112 0.553828
+v 0.131665 0.419033 0.549382
+v 0.145610 0.406182 0.536531
+v 0.176693 0.429938 0.542147
+v 0.159770 0.445532 0.557741
+v 0.179156 0.394175 0.515891
+v 0.161792 0.384773 0.515122
+v 0.183627 0.385778 0.507494
+v 0.196329 0.403958 0.516168
+v 0.173920 0.402349 0.524065
+v 0.157063 0.392155 0.522503
+v 0.165830 0.377190 0.507538
+v 0.201229 0.394756 0.506965
+v 0.190591 0.412916 0.525125
+v 0.192258 0.359600 0.481315
+v 0.173624 0.353549 0.483897
+v 0.193503 0.350670 0.472386
+v 0.210687 0.366068 0.478278
+v 0.190192 0.368453 0.490169
+v 0.171759 0.361544 0.491892
+v 0.174749 0.345484 0.475833
+v 0.212051 0.356283 0.468492
+v 0.208423 0.375770 0.487980
+v 0.192258 0.323804 0.445520
+v 0.173624 0.321222 0.451571
+v 0.190192 0.314951 0.436666
+v 0.210687 0.326842 0.439051
+v 0.193503 0.332734 0.454450
+v 0.174749 0.329287 0.459635
+v 0.171759 0.313227 0.443576
+v 0.208423 0.317140 0.429349
+v 0.212051 0.336628 0.448837
+v 0.179156 0.289228 0.410944
+v 0.161792 0.289998 0.420346
+v 0.173920 0.281055 0.402770
+v 0.196329 0.288952 0.401161
+v 0.183627 0.297626 0.419342
+v 0.165830 0.297581 0.427930
+v 0.157063 0.282616 0.412965
+v 0.190591 0.279995 0.392204
+v 0.201229 0.298154 0.410364
+v 0.153845 0.258228 0.379944
+v 0.138934 0.262002 0.392351
+v 0.145796 0.251292 0.373007
+v 0.168591 0.254981 0.367190
+v 0.161238 0.265522 0.387237
+v 0.145610 0.268589 0.398937
+v 0.131665 0.255738 0.386086
+v 0.159770 0.247379 0.359588
+v 0.176693 0.262973 0.375182
+v 0.118049 0.232917 0.354633
+v 0.106608 0.239144 0.369493
+v 0.107735 0.227690 0.349405
+v 0.129365 0.227243 0.339452
+v 0.127860 0.238609 0.360325
+v 0.115467 0.244284 0.374633
+v 0.097293 0.234424 0.364772
+v 0.118062 0.221515 0.333724
+v 0.140115 0.233480 0.345690
+v 0.074209 0.215019 0.336735
+v 0.067016 0.222981 0.353330
+v 0.062333 0.211858 0.333573
+v 0.081322 0.207630 0.319839
+v 0.085768 0.218722 0.340437
+v 0.077455 0.226325 0.356673
+v 0.056291 0.220126 0.350475
+v 0.068308 0.204165 0.316374
+v 0.093989 0.211687 0.323896
+v 0.025311 0.205755 0.327471
+v 0.022858 0.214615 0.344963
+v 0.012683 0.204874 0.326590
+v 0.027737 0.197477 0.309686
+v 0.037832 0.207216 0.328931
+v 0.034165 0.215934 0.346282
+v 0.011453 0.213820 0.344168
+v 0.013898 0.196512 0.308722
+v 0.041458 0.199078 0.311287
+v -0.025311 0.205755 0.327471
+v -0.022858 0.214615 0.344963
+v -0.037832 0.207216 0.328931
+v -0.027737 0.197477 0.309686
+v -0.012683 0.204874 0.326590
+v -0.011453 0.213820 0.344168
+v -0.034165 0.215934 0.346282
+v -0.041458 0.199078 0.311287
+v -0.013898 0.196512 0.308722
+v -0.074209 0.215019 0.336735
+v -0.067016 0.222981 0.353330
+v -0.085768 0.218722 0.340437
+v -0.081322 0.207630 0.319839
+v -0.062333 0.211858 0.333573
+v -0.056291 0.220126 0.350475
+v -0.077455 0.226325 0.356673
+v -0.093989 0.211687 0.323896
+v -0.068308 0.204165 0.316374
+v -0.118049 0.232917 0.354633
+v -0.106608 0.239144 0.369493
+v -0.127860 0.238609 0.360325
+v -0.129365 0.227243 0.339452
+v -0.107735 0.227690 0.349405
+v -0.097293 0.234424 0.364772
+v -0.115467 0.244284 0.374633
+v -0.140115 0.233480 0.345690
+v -0.118062 0.221515 0.333724
+v -0.153845 0.258228 0.379944
+v -0.138934 0.262002 0.392351
+v -0.161237 0.265522 0.387237
+v -0.168591 0.254981 0.367190
+v -0.145796 0.251292 0.373007
+v -0.131665 0.255738 0.386086
+v -0.145610 0.268589 0.398937
+v -0.176692 0.262973 0.375182
+v -0.159770 0.247379 0.359588
+v -0.179156 0.289228 0.410944
+v -0.161792 0.289998 0.420346
+v -0.183627 0.297626 0.419342
+v -0.196329 0.288952 0.401161
+v -0.173920 0.281055 0.402770
+v -0.157063 0.282616 0.412965
+v -0.165830 0.297581 0.427930
+v -0.201229 0.298154 0.410364
+v -0.190591 0.279995 0.392204
+v -0.192258 0.323804 0.445520
+v -0.173624 0.321222 0.451571
+v -0.193503 0.332734 0.454450
+v -0.210687 0.326842 0.439051
+v -0.190192 0.314951 0.436666
+v -0.171759 0.313227 0.443576
+v -0.174749 0.329287 0.459635
+v -0.212051 0.336628 0.448837
+v -0.208423 0.317140 0.429349
+v -0.192258 0.359600 0.481315
+v -0.173624 0.353549 0.483897
+v -0.190192 0.368453 0.490169
+v -0.210687 0.366068 0.478278
+v -0.193503 0.350670 0.472386
+v -0.174748 0.345484 0.475833
+v -0.171758 0.361544 0.491892
+v -0.208423 0.375770 0.487980
+v -0.212051 0.356283 0.468492
+v -0.246512 0.435487 0.514036
+v -0.230025 0.424625 0.515239
+v -0.239307 0.446734 0.525282
+v -0.262736 0.446686 0.512341
+v -0.252664 0.423933 0.502481
+v -0.235765 0.413843 0.504457
+v -0.223302 0.435120 0.525734
+v -0.255057 0.458673 0.524327
+v -0.269293 0.434370 0.500025
+v -0.211685 0.478142 0.556690
+v -0.197527 0.464427 0.555041
+v -0.200609 0.487687 0.566235
+v -0.225616 0.492148 0.557802
+v -0.221857 0.468107 0.546655
+v -0.207018 0.455063 0.545677
+v -0.187192 0.473334 0.563948
+v -0.213812 0.502321 0.567976
+v -0.236458 0.481452 0.547107
+v -0.162431 0.512969 0.591517
+v -0.151567 0.496925 0.587539
+v -0.148239 0.520162 0.598710
+v -0.173121 0.529267 0.594922
+v -0.175930 0.505138 0.583686
+v -0.164163 0.489617 0.580231
+v -0.138325 0.503637 0.594251
+v -0.157996 0.536933 0.602588
+v -0.187508 0.520920 0.586575
+v -0.102109 0.537596 0.616144
+v -0.095279 0.519905 0.610519
+v -0.085768 0.541946 0.620494
+v -0.108829 0.555515 0.621169
+v -0.118014 0.532502 0.611050
+v -0.110121 0.515151 0.605765
+v -0.080031 0.523964 0.614578
+v -0.091412 0.560151 0.625806
+v -0.125781 0.550085 0.615740
+v -0.034827 0.550344 0.628892
+v -0.032498 0.531800 0.622414
+v -0.017451 0.551555 0.630103
+v -0.037119 0.569101 0.634756
+v -0.052055 0.548334 0.626882
+v -0.048574 0.529924 0.620538
+v -0.016284 0.532930 0.623544
+v -0.018599 0.570392 0.636047
+v -0.055481 0.566959 0.632614
+v 0.034827 0.550344 0.628892
+v 0.032498 0.531800 0.622414
+v 0.052055 0.548334 0.626882
+v 0.037120 0.569101 0.634756
+v 0.017451 0.551555 0.630103
+v 0.016284 0.532930 0.623544
+v 0.048574 0.529924 0.620538
+v 0.055481 0.566959 0.632614
+v 0.018599 0.570392 0.636047
+v 0.102109 0.537596 0.616144
+v 0.095279 0.519905 0.610519
+v 0.118014 0.532502 0.611050
+v 0.108829 0.555515 0.621169
+v 0.085768 0.541946 0.620494
+v 0.080031 0.523964 0.614578
+v 0.110121 0.515151 0.605765
+v 0.125781 0.550085 0.615740
+v 0.091412 0.560151 0.625806
+v 0.162431 0.512969 0.591517
+v 0.151568 0.496925 0.587539
+v 0.175930 0.505138 0.583686
+v 0.173122 0.529267 0.594922
+v 0.148240 0.520162 0.598710
+v 0.138325 0.503637 0.594251
+v 0.164163 0.489618 0.580231
+v 0.187508 0.520920 0.586575
+v 0.157996 0.536933 0.602588
+v 0.211685 0.478142 0.556690
+v 0.197527 0.464427 0.555041
+v 0.221857 0.468107 0.546655
+v 0.225616 0.492148 0.557802
+v 0.200609 0.487687 0.566235
+v 0.187192 0.473334 0.563948
+v 0.207018 0.455063 0.545677
+v 0.236458 0.481452 0.547107
+v 0.213812 0.502321 0.567976
+v 0.246512 0.435487 0.514035
+v 0.230025 0.424626 0.515239
+v 0.252664 0.423933 0.502481
+v 0.262736 0.446686 0.512341
+v 0.239308 0.446734 0.525282
+v 0.223302 0.435120 0.525734
+v 0.235766 0.413843 0.504457
+v 0.269293 0.434371 0.500025
+v 0.255057 0.458673 0.524327
+v 0.264540 0.387912 0.466460
+v 0.246847 0.380232 0.470846
+v 0.266253 0.375625 0.454173
+v 0.281950 0.395980 0.461635
+v 0.261698 0.400094 0.478642
+v 0.244195 0.391600 0.482213
+v 0.248446 0.368767 0.459381
+v 0.283776 0.382884 0.448539
+v 0.278921 0.408963 0.474618
+v 0.264540 0.338659 0.417207
+v 0.246847 0.334273 0.424887
+v 0.261698 0.326477 0.405025
+v 0.281950 0.343485 0.409140
+v 0.266253 0.350946 0.429494
+v 0.248446 0.345739 0.436352
+v 0.244195 0.322906 0.413520
+v 0.278921 0.330501 0.396156
+v 0.283776 0.356581 0.422235
+v 0.246512 0.291084 0.369632
+v 0.230025 0.289880 0.380494
+v 0.239308 0.279837 0.358385
+v 0.262736 0.292779 0.358434
+v 0.252664 0.302639 0.381187
+v 0.235766 0.300662 0.391276
+v 0.223302 0.279386 0.370000
+v 0.255057 0.280792 0.346447
+v 0.269293 0.305094 0.370749
+v 0.211685 0.248429 0.326977
+v 0.197527 0.250078 0.340692
+v 0.200609 0.238884 0.317433
+v 0.225616 0.247317 0.312972
+v 0.221857 0.258464 0.337013
+v 0.207018 0.259442 0.350056
+v 0.187192 0.241172 0.331786
+v 0.213812 0.237144 0.302799
+v 0.236458 0.258013 0.323667
+v 0.162431 0.213602 0.292150
+v 0.151568 0.217580 0.308194
+v 0.148240 0.206409 0.284957
+v 0.173122 0.210197 0.275852
+v 0.175930 0.221434 0.299982
+v 0.164163 0.224888 0.315502
+v 0.138325 0.210869 0.301483
+v 0.157996 0.202531 0.268186
+v 0.187508 0.218544 0.284199
+v 0.102109 0.188975 0.267523
+v 0.095279 0.194601 0.285215
+v 0.085768 0.184625 0.263173
+v 0.108829 0.183950 0.249605
+v 0.118014 0.194070 0.272618
+v 0.110121 0.199354 0.289968
+v 0.080031 0.190541 0.281155
+v 0.091412 0.179313 0.244968
+v 0.125781 0.189380 0.255035
+v 0.034827 0.176228 0.254776
+v 0.032498 0.182706 0.273320
+v 0.017451 0.175016 0.253564
+v 0.037119 0.170363 0.236018
+v 0.052055 0.178237 0.256786
+v 0.048574 0.184581 0.275195
+v 0.016284 0.181575 0.272189
+v 0.018599 0.169072 0.234727
+v 0.055481 0.172506 0.238160
+v -0.034827 0.176228 0.254776
+v -0.032498 0.182706 0.273320
+v -0.052055 0.178237 0.256786
+v -0.037119 0.170363 0.236018
+v -0.017451 0.175016 0.253564
+v -0.016284 0.181575 0.272189
+v -0.048574 0.184581 0.275195
+v -0.055481 0.172506 0.238160
+v -0.018599 0.169072 0.234727
+v -0.102109 0.188975 0.267523
+v -0.095279 0.194601 0.285215
+v -0.118014 0.194070 0.272618
+v -0.108829 0.183950 0.249605
+v -0.085768 0.184625 0.263173
+v -0.080031 0.190541 0.281155
+v -0.110121 0.199354 0.289968
+v -0.125781 0.189380 0.255035
+v -0.091412 0.179313 0.244968
+v -0.162431 0.213602 0.292150
+v -0.151568 0.217580 0.308194
+v -0.175930 0.221434 0.299982
+v -0.173122 0.210197 0.275852
+v -0.148240 0.206409 0.284957
+v -0.138325 0.210869 0.301483
+v -0.164163 0.224888 0.315502
+v -0.187508 0.218544 0.284199
+v -0.157996 0.202531 0.268186
+v -0.211685 0.248429 0.326977
+v -0.197527 0.250078 0.340692
+v -0.221857 0.258464 0.337013
+v -0.225616 0.247317 0.312972
+v -0.200609 0.238884 0.317433
+v -0.187192 0.241172 0.331786
+v -0.207018 0.259442 0.350056
+v -0.236458 0.258013 0.323667
+v -0.213812 0.237144 0.302799
+v -0.246512 0.291084 0.369632
+v -0.230025 0.289880 0.380494
+v -0.252664 0.302639 0.381187
+v -0.262736 0.292779 0.358434
+v -0.239308 0.279837 0.358385
+v -0.223302 0.279386 0.370000
+v -0.235766 0.300662 0.391276
+v -0.269293 0.305094 0.370749
+v -0.255057 0.280792 0.346447
+v -0.264540 0.338659 0.417207
+v -0.246847 0.334273 0.424887
+v -0.266253 0.350946 0.429494
+v -0.281950 0.343485 0.409140
+v -0.261698 0.326477 0.405025
+v -0.244195 0.322906 0.413520
+v -0.248446 0.345739 0.436352
+v -0.283776 0.356581 0.422235
+v -0.278921 0.330501 0.396156
+v -0.264540 0.387912 0.466461
+v -0.246847 0.380232 0.470846
+v -0.261698 0.400094 0.478642
+v -0.281950 0.395980 0.461635
+v -0.266253 0.375625 0.454173
+v -0.248446 0.368767 0.459381
+v -0.244194 0.391600 0.482213
+v -0.278921 0.408963 0.474618
+v -0.283776 0.382884 0.448539
+v -0.309650 0.482181 0.504328
+v -0.294322 0.470045 0.507484
+v -0.300600 0.496308 0.518455
+v -0.324647 0.494603 0.500690
+v -0.317378 0.467666 0.489813
+v -0.301667 0.456249 0.493688
+v -0.285720 0.483473 0.520912
+v -0.315159 0.509414 0.515502
+v -0.332750 0.479386 0.485473
+v -0.265903 0.535760 0.557907
+v -0.252740 0.520972 0.558411
+v -0.251990 0.547750 0.569897
+v -0.278781 0.550777 0.556865
+v -0.278680 0.523155 0.545302
+v -0.264885 0.508991 0.546430
+v -0.239516 0.532368 0.569807
+v -0.264195 0.563348 0.569435
+v -0.292177 0.537562 0.543649
+v -0.204034 0.579508 0.601655
+v -0.193934 0.562554 0.599993
+v -0.186207 0.588543 0.610690
+v -0.213916 0.596644 0.602731
+v -0.220990 0.569670 0.591817
+v -0.210050 0.553204 0.590643
+v -0.176990 0.571142 0.608581
+v -0.195226 0.606116 0.612204
+v -0.231693 0.586330 0.592417
+v -0.128261 0.610442 0.632589
+v -0.121912 0.591957 0.629396
+v -0.107735 0.615906 0.638053
+v -0.134473 0.629076 0.635164
+v -0.148240 0.604043 0.626190
+v -0.140902 0.585875 0.623314
+v -0.102402 0.597151 0.634590
+v -0.112953 0.634805 0.640893
+v -0.155420 0.622367 0.628455
+v -0.043747 0.626455 0.648602
+v -0.041582 0.607177 0.644616
+v -0.021920 0.627977 0.650123
+v -0.045866 0.645864 0.651952
+v -0.065388 0.623930 0.646077
+v -0.062151 0.604777 0.642216
+v -0.020835 0.608624 0.646063
+v -0.022982 0.647460 0.653548
+v -0.068555 0.643218 0.649305
+v 0.043748 0.626455 0.648602
+v 0.041582 0.607177 0.644616
+v 0.065388 0.623930 0.646077
+v 0.045866 0.645865 0.651952
+v 0.021921 0.627977 0.650123
+v 0.020835 0.608624 0.646063
+v 0.062151 0.604777 0.642216
+v 0.068555 0.643218 0.649305
+v 0.022982 0.647460 0.653547
+v 0.128261 0.610442 0.632589
+v 0.121912 0.591957 0.629396
+v 0.148240 0.604043 0.626190
+v 0.134473 0.629076 0.635164
+v 0.107735 0.615907 0.638053
+v 0.102402 0.597151 0.634590
+v 0.140902 0.585875 0.623314
+v 0.155420 0.622367 0.628455
+v 0.112953 0.634806 0.640893
+v 0.204034 0.579508 0.601655
+v 0.193934 0.562554 0.599993
+v 0.220990 0.569670 0.591817
+v 0.213916 0.596644 0.602731
+v 0.186208 0.588543 0.610690
+v 0.176990 0.571142 0.608581
+v 0.210051 0.553204 0.590643
+v 0.231693 0.586330 0.592417
+v 0.195226 0.606116 0.612204
+v 0.265903 0.535760 0.557907
+v 0.252740 0.520972 0.558411
+v 0.278680 0.523155 0.545302
+v 0.278781 0.550778 0.556865
+v 0.251990 0.547750 0.569897
+v 0.239516 0.532368 0.569807
+v 0.264885 0.508991 0.546430
+v 0.292177 0.537562 0.543649
+v 0.264195 0.563348 0.569435
+v 0.309650 0.482181 0.504328
+v 0.294322 0.470045 0.507484
+v 0.317378 0.467666 0.489813
+v 0.324647 0.494603 0.500690
+v 0.300601 0.496308 0.518455
+v 0.285720 0.483473 0.520912
+v 0.301667 0.456249 0.493688
+v 0.332750 0.479386 0.485473
+v 0.315159 0.509414 0.515502
+v 0.332296 0.422420 0.444567
+v 0.315846 0.413243 0.450682
+v 0.334448 0.406986 0.429133
+v 0.348390 0.431948 0.438036
+v 0.328725 0.437723 0.459869
+v 0.312452 0.427788 0.465227
+v 0.317892 0.398573 0.436012
+v 0.350646 0.415767 0.421854
+v 0.344646 0.447992 0.454079
+v 0.332296 0.360552 0.382699
+v 0.315846 0.354437 0.391876
+v 0.328725 0.345250 0.367397
+v 0.348390 0.367084 0.373171
+v 0.334448 0.375986 0.398133
+v 0.317892 0.369107 0.406546
+v 0.312452 0.339893 0.377332
+v 0.344646 0.351040 0.357128
+v 0.350646 0.383265 0.389353
+v 0.309650 0.300792 0.322939
+v 0.294322 0.297635 0.335074
+v 0.300600 0.286665 0.308812
+v 0.324647 0.304429 0.310516
+v 0.317378 0.315306 0.337453
+v 0.301667 0.311431 0.348870
+v 0.285720 0.284207 0.321647
+v 0.315159 0.289618 0.295705
+v 0.332750 0.319646 0.325734
+v 0.265903 0.247212 0.269359
+v 0.252740 0.246708 0.284147
+v 0.251990 0.235223 0.257370
+v 0.278781 0.248254 0.254342
+v 0.278680 0.259818 0.281965
+v 0.264885 0.258689 0.296129
+v 0.239516 0.235312 0.272751
+v 0.264195 0.235684 0.241772
+v 0.292177 0.261470 0.267558
+v 0.204034 0.203465 0.225612
+v 0.193934 0.205126 0.242565
+v 0.186208 0.194430 0.216577
+v 0.213916 0.202388 0.208476
+v 0.220990 0.213302 0.235449
+v 0.210051 0.214477 0.251916
+v 0.176990 0.196538 0.233978
+v 0.195226 0.192915 0.199003
+v 0.231693 0.212702 0.218789
+v 0.128261 0.172530 0.194677
+v 0.121912 0.175723 0.213162
+v 0.107735 0.167066 0.189213
+v 0.134473 0.169956 0.176043
+v 0.148240 0.178930 0.201077
+v 0.140902 0.181806 0.219245
+v 0.102402 0.170529 0.207968
+v 0.112953 0.164226 0.170314
+v 0.155420 0.176665 0.182752
+v 0.043748 0.156518 0.178665
+v 0.041582 0.160503 0.197942
+v 0.021920 0.154996 0.177143
+v 0.045866 0.153167 0.159255
+v 0.065388 0.159042 0.181189
+v 0.062151 0.162903 0.200342
+v 0.020835 0.159057 0.196496
+v 0.022982 0.151572 0.157659
+v 0.068555 0.155814 0.161902
+v -0.043748 0.156518 0.178665
+v -0.041582 0.160503 0.197942
+v -0.065388 0.159042 0.181189
+v -0.045866 0.153167 0.159255
+v -0.021920 0.154996 0.177143
+v -0.020835 0.159057 0.196496
+v -0.062151 0.162903 0.200342
+v -0.068555 0.155814 0.161902
+v -0.022982 0.151572 0.157659
+v -0.128261 0.172530 0.194677
+v -0.121912 0.175723 0.213162
+v -0.148240 0.178930 0.201077
+v -0.134473 0.169956 0.176043
+v -0.107735 0.167066 0.189213
+v -0.102402 0.170529 0.207968
+v -0.140902 0.181806 0.219245
+v -0.155420 0.176665 0.182752
+v -0.112953 0.164226 0.170314
+v -0.204034 0.203465 0.225612
+v -0.193934 0.205126 0.242565
+v -0.220990 0.213302 0.235449
+v -0.213916 0.202388 0.208476
+v -0.186208 0.194430 0.216577
+v -0.176990 0.196538 0.233978
+v -0.210051 0.214477 0.251916
+v -0.231693 0.212702 0.218790
+v -0.195226 0.192915 0.199003
+v -0.265903 0.247212 0.269359
+v -0.252740 0.246708 0.284147
+v -0.278680 0.259818 0.281965
+v -0.278781 0.248254 0.254342
+v -0.251990 0.235223 0.257370
+v -0.239516 0.235312 0.272751
+v -0.264885 0.258689 0.296129
+v -0.292177 0.261470 0.267558
+v -0.264195 0.235684 0.241772
+v -0.309650 0.300792 0.322939
+v -0.294322 0.297635 0.335075
+v -0.317378 0.315306 0.337453
+v -0.324647 0.304429 0.310516
+v -0.300600 0.286665 0.308812
+v -0.285720 0.284207 0.321647
+v -0.301667 0.311431 0.348870
+v -0.332750 0.319646 0.325734
+v -0.315159 0.289617 0.295705
+v -0.332296 0.360552 0.382699
+v -0.315846 0.354437 0.391877
+v -0.334448 0.375986 0.398133
+v -0.348390 0.367084 0.373171
+v -0.328725 0.345250 0.367397
+v -0.312452 0.339893 0.377332
+v -0.317892 0.369107 0.406547
+v -0.350646 0.383265 0.389353
+v -0.344646 0.351040 0.357128
+v -0.332296 0.422420 0.444567
+v -0.315846 0.413243 0.450682
+v -0.328725 0.437722 0.459869
+v -0.348390 0.431948 0.438036
+v -0.334448 0.406986 0.429133
+v -0.317892 0.398573 0.436012
+v -0.312452 0.427787 0.465227
+v -0.344646 0.447991 0.454079
+v -0.350646 0.415767 0.421854
+v -0.367490 0.533456 0.486934
+v -0.353583 0.520254 0.491989
+v -0.356750 0.550222 0.503700
+v -0.381004 0.546890 0.481416
+v -0.376662 0.516231 0.469708
+v -0.362407 0.503681 0.475415
+v -0.343249 0.536386 0.508120
+v -0.369869 0.564273 0.498799
+v -0.390513 0.529031 0.463558
+v -0.315571 0.597044 0.550521
+v -0.303628 0.581436 0.553170
+v -0.299060 0.611273 0.564751
+v -0.327176 0.612816 0.547343
+v -0.330735 0.582084 0.535561
+v -0.318218 0.567042 0.538776
+v -0.287742 0.595127 0.566861
+v -0.310057 0.627568 0.562095
+v -0.342897 0.597306 0.531832
+v -0.242146 0.648963 0.602441
+v -0.232982 0.631390 0.603124
+v -0.220989 0.659686 0.613163
+v -0.251051 0.666645 0.601171
+v -0.262269 0.637288 0.590766
+v -0.252344 0.620157 0.591891
+v -0.212626 0.641707 0.613441
+v -0.229116 0.677761 0.612288
+v -0.271914 0.654540 0.589067
+v -0.152219 0.685676 0.639153
+v -0.146459 0.666713 0.638448
+v -0.127859 0.692161 0.645638
+v -0.157817 0.704707 0.639233
+v -0.175930 0.678081 0.631559
+v -0.169272 0.659406 0.631141
+v -0.123020 0.672953 0.644687
+v -0.132561 0.711431 0.645957
+v -0.182400 0.696833 0.631360
+v -0.051919 0.704679 0.658157
+v -0.049954 0.684998 0.656732
+v -0.026015 0.706486 0.659963
+v -0.053828 0.724410 0.658936
+v -0.077602 0.701683 0.655160
+v -0.074665 0.682115 0.653849
+v -0.025030 0.686736 0.658470
+v -0.026972 0.726282 0.660809
+v -0.080455 0.721303 0.655830
+v 0.051919 0.704680 0.658157
+v 0.049954 0.684998 0.656732
+v 0.077602 0.701683 0.655160
+v 0.053829 0.724410 0.658936
+v 0.026015 0.706486 0.659963
+v 0.025031 0.686736 0.658470
+v 0.074665 0.682115 0.653849
+v 0.080456 0.721303 0.655830
+v 0.026972 0.726282 0.660809
+v 0.152219 0.685676 0.639153
+v 0.146459 0.666713 0.638448
+v 0.175930 0.678081 0.631559
+v 0.157817 0.704707 0.639234
+v 0.127859 0.692161 0.645638
+v 0.123020 0.672953 0.644687
+v 0.169272 0.659406 0.631141
+v 0.182400 0.696833 0.631360
+v 0.132561 0.711431 0.645957
+v 0.242146 0.648963 0.602441
+v 0.232982 0.631390 0.603124
+v 0.262269 0.637288 0.590766
+v 0.251051 0.666645 0.601171
+v 0.220989 0.659686 0.613163
+v 0.212626 0.641707 0.613441
+v 0.252344 0.620157 0.591891
+v 0.271914 0.654540 0.589067
+v 0.229116 0.677762 0.612288
+v 0.315571 0.597044 0.550521
+v 0.303628 0.581436 0.553170
+v 0.330735 0.582084 0.535561
+v 0.327176 0.612816 0.547343
+v 0.299060 0.611273 0.564751
+v 0.287742 0.595127 0.566861
+v 0.318219 0.567042 0.538776
+v 0.342897 0.597306 0.531832
+v 0.310058 0.627569 0.562095
+v 0.367490 0.533456 0.486934
+v 0.353583 0.520255 0.491989
+v 0.376662 0.516231 0.469708
+v 0.381004 0.546890 0.481416
+v 0.356750 0.550223 0.503700
+v 0.343249 0.536386 0.508120
+v 0.362407 0.503681 0.475415
+v 0.390513 0.529031 0.463558
+v 0.369869 0.564273 0.498799
+v 0.394366 0.462534 0.416011
+v 0.379441 0.452016 0.423750
+v 0.396920 0.444216 0.397694
+v 0.408868 0.473359 0.407885
+v 0.390128 0.480694 0.434171
+v 0.375364 0.469489 0.441223
+v 0.381899 0.434392 0.406126
+v 0.411516 0.454368 0.388895
+v 0.404475 0.492187 0.426714
+v 0.394365 0.389109 0.342586
+v 0.379441 0.381370 0.353104
+v 0.390128 0.370948 0.324426
+v 0.408868 0.397234 0.331760
+v 0.396920 0.407426 0.360903
+v 0.381899 0.398993 0.370728
+v 0.375364 0.363896 0.335631
+v 0.404475 0.378406 0.312932
+v 0.411516 0.416225 0.350751
+v 0.367490 0.318186 0.271663
+v 0.353583 0.313131 0.284865
+v 0.356750 0.301420 0.254897
+v 0.381004 0.323703 0.258229
+v 0.376662 0.335411 0.288888
+v 0.362407 0.329704 0.301438
+v 0.343249 0.296999 0.268733
+v 0.369869 0.306320 0.240847
+v 0.390513 0.341562 0.276088
+v 0.315571 0.254598 0.208075
+v 0.303628 0.251949 0.223684
+v 0.299060 0.240369 0.193846
+v 0.327176 0.257777 0.192303
+v 0.330735 0.269558 0.223035
+v 0.318219 0.266343 0.238077
+v 0.287742 0.238259 0.209993
+v 0.310058 0.243024 0.177551
+v 0.342897 0.273287 0.207813
+v 0.242146 0.202679 0.156156
+v 0.232982 0.201995 0.173729
+v 0.220989 0.191956 0.145433
+v 0.251051 0.203948 0.138475
+v 0.262269 0.214354 0.167831
+v 0.252344 0.213228 0.184962
+v 0.212626 0.191678 0.163412
+v 0.229116 0.192831 0.127358
+v 0.271914 0.216053 0.150579
+v 0.152219 0.165966 0.119444
+v 0.146459 0.166672 0.138406
+v 0.127859 0.159481 0.112958
+v 0.157817 0.165886 0.100412
+v 0.175930 0.173561 0.127038
+v 0.169272 0.173979 0.145713
+v 0.123020 0.160432 0.132166
+v 0.132561 0.159162 0.093689
+v 0.182400 0.173759 0.108286
+v 0.051919 0.146962 0.100440
+v 0.049954 0.148387 0.120122
+v 0.026015 0.145156 0.098634
+v 0.053829 0.146183 0.080710
+v 0.077602 0.149959 0.103436
+v 0.074665 0.151270 0.123004
+v 0.025031 0.146649 0.118384
+v 0.026972 0.144311 0.078837
+v 0.080456 0.149290 0.083816
+v -0.051919 0.146962 0.100440
+v -0.049954 0.148387 0.120122
+v -0.077602 0.149959 0.103436
+v -0.053828 0.146183 0.080710
+v -0.026015 0.145156 0.098634
+v -0.025030 0.146649 0.118384
+v -0.074665 0.151270 0.123004
+v -0.080456 0.149290 0.083816
+v -0.026972 0.144311 0.078837
+v -0.152219 0.165966 0.119444
+v -0.146459 0.166672 0.138406
+v -0.175930 0.173561 0.127038
+v -0.157817 0.165886 0.100412
+v -0.127859 0.159481 0.112958
+v -0.123020 0.160432 0.132166
+v -0.169272 0.173979 0.145713
+v -0.182400 0.173759 0.108286
+v -0.132561 0.159162 0.093689
+v -0.242146 0.202679 0.156156
+v -0.232982 0.201995 0.173729
+v -0.262269 0.214354 0.167831
+v -0.251051 0.203948 0.138475
+v -0.220989 0.191956 0.145433
+v -0.212626 0.191678 0.163412
+v -0.252344 0.213228 0.184962
+v -0.271914 0.216053 0.150579
+v -0.229116 0.192831 0.127358
+v -0.315571 0.254598 0.208075
+v -0.303628 0.251949 0.223684
+v -0.330735 0.269558 0.223035
+v -0.327176 0.257777 0.192303
+v -0.299060 0.240369 0.193846
+v -0.287742 0.238258 0.209993
+v -0.318219 0.266343 0.238077
+v -0.342897 0.273287 0.207813
+v -0.310058 0.243024 0.177551
+v -0.367490 0.318186 0.271663
+v -0.353583 0.313130 0.284865
+v -0.376662 0.335411 0.288889
+v -0.381004 0.323703 0.258229
+v -0.356750 0.301420 0.254897
+v -0.343249 0.296999 0.268733
+v -0.362407 0.329704 0.301439
+v -0.390513 0.341562 0.276088
+v -0.369869 0.306320 0.240847
+v -0.394366 0.389109 0.342586
+v -0.379441 0.381370 0.353104
+v -0.396920 0.407426 0.360903
+v -0.408868 0.397234 0.331761
+v -0.390128 0.370948 0.324426
+v -0.375364 0.363896 0.335631
+v -0.381899 0.398993 0.370728
+v -0.411516 0.416225 0.350751
+v -0.404475 0.378406 0.312932
+v -0.394365 0.462533 0.416011
+v -0.379441 0.452016 0.423750
+v -0.390128 0.480694 0.434171
+v -0.408868 0.473359 0.407885
+v -0.396920 0.444216 0.397694
+v -0.381899 0.434392 0.406126
+v -0.375364 0.469489 0.441223
+v -0.404475 0.492187 0.426714
+v -0.411516 0.454368 0.388895
+v -0.419042 0.588437 0.462151
+v -0.406794 0.574395 0.469019
+v -0.406795 0.607555 0.481269
+v -0.430842 0.602652 0.454848
+v -0.429500 0.568795 0.442509
+v -0.416946 0.555327 0.449951
+v -0.394905 0.592954 0.487578
+v -0.418250 0.622309 0.474505
+v -0.441594 0.582457 0.434653
+v -0.359840 0.660945 0.534659
+v -0.349322 0.644784 0.539407
+v -0.341012 0.677170 0.550884
+v -0.369972 0.677202 0.529398
+v -0.377131 0.643887 0.517601
+v -0.366108 0.628224 0.522847
+v -0.331045 0.660535 0.555158
+v -0.350615 0.693884 0.546080
+v -0.387750 0.659663 0.511859
+v -0.276115 0.720148 0.593862
+v -0.268044 0.702256 0.596879
+v -0.251990 0.732374 0.606088
+v -0.283890 0.738072 0.590268
+v -0.299061 0.706835 0.580549
+v -0.290319 0.689332 0.583956
+v -0.244625 0.714125 0.608749
+v -0.259086 0.750643 0.602839
+v -0.307482 0.724384 0.576580
+v -0.173573 0.762010 0.635724
+v -0.168500 0.742895 0.637518
+v -0.145795 0.769405 0.643119
+v -0.178460 0.781113 0.633309
+v -0.200610 0.753350 0.627064
+v -0.194746 0.734488 0.629112
+v -0.141534 0.750074 0.644697
+v -0.149900 0.788716 0.640912
+v -0.206259 0.772209 0.624405
+v -0.059202 0.783680 0.657394
+v -0.057472 0.763931 0.658554
+v -0.029664 0.785739 0.659453
+v -0.060870 0.803393 0.655589
+v -0.088488 0.780263 0.653977
+v -0.085901 0.760614 0.655238
+v -0.028797 0.765930 0.660554
+v -0.030500 0.805510 0.657706
+v -0.090980 0.799880 0.652076
+v 0.059203 0.783680 0.657394
+v 0.057472 0.763931 0.658554
+v 0.088488 0.780263 0.653977
+v 0.060870 0.803393 0.655589
+v 0.029664 0.785739 0.659453
+v 0.028797 0.765930 0.660554
+v 0.085902 0.760614 0.655238
+v 0.090980 0.799880 0.652076
+v 0.030500 0.805510 0.657706
+v 0.173573 0.762010 0.635724
+v 0.168500 0.742895 0.637518
+v 0.200610 0.753351 0.627064
+v 0.178461 0.781113 0.633309
+v 0.145795 0.769405 0.643119
+v 0.141534 0.750074 0.644697
+v 0.194746 0.734488 0.629112
+v 0.206259 0.772209 0.624405
+v 0.149901 0.788716 0.640912
+v 0.276115 0.720148 0.593862
+v 0.268044 0.702256 0.596879
+v 0.299061 0.706835 0.580549
+v 0.283890 0.738072 0.590268
+v 0.251990 0.732375 0.606089
+v 0.244625 0.714125 0.608749
+v 0.290319 0.689332 0.583956
+v 0.307482 0.724384 0.576580
+v 0.259086 0.750643 0.602839
+v 0.359840 0.660945 0.534659
+v 0.349322 0.644784 0.539407
+v 0.377131 0.643887 0.517601
+v 0.369972 0.677202 0.529398
+v 0.341013 0.677171 0.550884
+v 0.331045 0.660535 0.555158
+v 0.366108 0.628224 0.522847
+v 0.387751 0.659663 0.511859
+v 0.350615 0.693884 0.546080
+v 0.419042 0.588437 0.462151
+v 0.406794 0.574395 0.469019
+v 0.429500 0.568796 0.442509
+v 0.430842 0.602652 0.454848
+v 0.406795 0.607555 0.481269
+v 0.394905 0.592954 0.487578
+v 0.416947 0.555327 0.449951
+v 0.441595 0.582457 0.434653
+v 0.418250 0.622309 0.474505
+v 0.449688 0.507565 0.381279
+v 0.436544 0.495887 0.390510
+v 0.452600 0.486679 0.360393
+v 0.462350 0.519503 0.371699
+v 0.444856 0.528273 0.401987
+v 0.431853 0.515990 0.410613
+v 0.439371 0.475611 0.370234
+v 0.465345 0.498028 0.350224
+v 0.457382 0.540794 0.392990
+v 0.449688 0.423840 0.297554
+v 0.436544 0.414609 0.309233
+v 0.444856 0.403132 0.276846
+v 0.462350 0.433420 0.285616
+v 0.452600 0.444727 0.318441
+v 0.439371 0.434885 0.329509
+v 0.431853 0.394506 0.289130
+v 0.457383 0.412129 0.264325
+v 0.465345 0.454895 0.307091
+v 0.419042 0.342968 0.216682
+v 0.406794 0.336101 0.230724
+v 0.406795 0.323850 0.197564
+v 0.430842 0.350271 0.202467
+v 0.429500 0.362610 0.236324
+v 0.416947 0.355169 0.249792
+v 0.394905 0.317542 0.212165
+v 0.418250 0.330615 0.182811
+v 0.441595 0.370466 0.222662
+v 0.359840 0.270460 0.144174
+v 0.349322 0.265712 0.160336
+v 0.341013 0.254235 0.127949
+v 0.369972 0.275721 0.127917
+v 0.377131 0.287519 0.161233
+v 0.366108 0.282272 0.176896
+v 0.331045 0.249961 0.144585
+v 0.350615 0.259039 0.111235
+v 0.387751 0.293260 0.145456
+v 0.276115 0.211258 0.084972
+v 0.268044 0.208240 0.102864
+v 0.251990 0.199031 0.072745
+v 0.283890 0.214852 0.067048
+v 0.299061 0.224570 0.098284
+v 0.290319 0.221164 0.115787
+v 0.244625 0.196371 0.090994
+v 0.259086 0.202281 0.054477
+v 0.307482 0.228539 0.080736
+v 0.173573 0.169395 0.043109
+v 0.168500 0.167601 0.062225
+v 0.145795 0.162000 0.035714
+v 0.178461 0.171810 0.024007
+v 0.200610 0.178055 0.051769
+v 0.194746 0.176008 0.070631
+v 0.141534 0.160422 0.055046
+v 0.149901 0.164207 0.016403
+v 0.206259 0.180714 0.032910
+v 0.059203 0.147725 0.021440
+v 0.057472 0.146565 0.041188
+v 0.029664 0.145666 0.019380
+v 0.060870 0.149531 0.001727
+v 0.088488 0.151142 0.024856
+v 0.085901 0.149882 0.044505
+v 0.028797 0.144566 0.039189
+v 0.030500 0.147413 -0.000391
+v 0.090980 0.153043 0.005240
+v -0.059203 0.147725 0.021440
+v -0.057472 0.146565 0.041188
+v -0.088488 0.151142 0.024856
+v -0.060870 0.149531 0.001727
+v -0.029664 0.145666 0.019380
+v -0.028797 0.144566 0.039189
+v -0.085901 0.149882 0.044505
+v -0.090980 0.153043 0.005240
+v -0.030500 0.147413 -0.000391
+v -0.173573 0.169395 0.043109
+v -0.168500 0.167601 0.062225
+v -0.200610 0.178055 0.051769
+v -0.178461 0.171810 0.024007
+v -0.145795 0.162000 0.035714
+v -0.141534 0.160422 0.055046
+v -0.194746 0.176008 0.070631
+v -0.206259 0.180714 0.032910
+v -0.149901 0.164207 0.016403
+v -0.276115 0.211258 0.084972
+v -0.268044 0.208240 0.102864
+v -0.299061 0.224570 0.098285
+v -0.283890 0.214852 0.067048
+v -0.251990 0.199031 0.072745
+v -0.244625 0.196371 0.090994
+v -0.290320 0.221164 0.115787
+v -0.307482 0.228539 0.080736
+v -0.259086 0.202281 0.054477
+v -0.359840 0.270460 0.144174
+v -0.349322 0.265712 0.160336
+v -0.377131 0.287519 0.161233
+v -0.369972 0.275721 0.127917
+v -0.341013 0.254235 0.127949
+v -0.331045 0.249961 0.144585
+v -0.366108 0.282272 0.176896
+v -0.387751 0.293260 0.145456
+v -0.350615 0.259039 0.111235
+v -0.419042 0.342968 0.216682
+v -0.406794 0.336101 0.230724
+v -0.429500 0.362610 0.236324
+v -0.430842 0.350271 0.202467
+v -0.406795 0.323850 0.197564
+v -0.394905 0.317541 0.212165
+v -0.416947 0.355169 0.249792
+v -0.441595 0.370466 0.222662
+v -0.418250 0.330615 0.182811
+v -0.449688 0.423840 0.297554
+v -0.436544 0.414609 0.309233
+v -0.452600 0.444727 0.318441
+v -0.462350 0.433420 0.285617
+v -0.444856 0.403132 0.276846
+v -0.431853 0.394506 0.289130
+v -0.439371 0.434885 0.329509
+v -0.465345 0.454895 0.307091
+v -0.457383 0.412129 0.264326
+v -0.449688 0.507565 0.381279
+v -0.436544 0.495887 0.390510
+v -0.444856 0.528273 0.401987
+v -0.462350 0.519503 0.371699
+v -0.452600 0.486679 0.360393
+v -0.439371 0.475611 0.370234
+v -0.431853 0.515989 0.410613
+v -0.457382 0.540794 0.392990
+v -0.465345 0.498028 0.350224
+v -0.463424 0.646183 0.430404
+v -0.453045 0.631540 0.438967
+v -0.449880 0.667325 0.451547
+v -0.473308 0.660936 0.421441
+v -0.474990 0.624460 0.408682
+v -0.464352 0.610305 0.417731
+v -0.439804 0.652210 0.459636
+v -0.459475 0.682530 0.443035
+v -0.485120 0.638750 0.399255
+v -0.397951 0.726370 0.510592
+v -0.389038 0.709932 0.517358
+v -0.377130 0.744314 0.528536
+v -0.406439 0.742833 0.503339
+v -0.417074 0.707505 0.491727
+v -0.407733 0.691489 0.498915
+v -0.368683 0.727474 0.534900
+v -0.385173 0.761160 0.521665
+v -0.425969 0.723566 0.484071
+v -0.305359 0.791843 0.576065
+v -0.298520 0.773938 0.581364
+v -0.278679 0.805365 0.589586
+v -0.311871 0.809703 0.570208
+v -0.330735 0.777120 0.561342
+v -0.323327 0.759545 0.566971
+v -0.272438 0.787157 0.594583
+v -0.284623 0.823513 0.584018
+v -0.337789 0.794666 0.555171
+v -0.191957 0.838139 0.622361
+v -0.187657 0.819198 0.626624
+v -0.161237 0.846317 0.630539
+v -0.196050 0.856986 0.617491
+v -0.221857 0.828562 0.612784
+v -0.216888 0.809835 0.617261
+v -0.157625 0.827193 0.634619
+v -0.164675 0.865339 0.625844
+v -0.226589 0.847205 0.607710
+v -0.065473 0.862104 0.646326
+v -0.064006 0.842626 0.650052
+v -0.032806 0.864381 0.648603
+v -0.066869 0.881462 0.641967
+v -0.097860 0.858325 0.642547
+v -0.095668 0.838932 0.646358
+v -0.032071 0.844852 0.652278
+v -0.033506 0.883788 0.644293
+v -0.099947 0.877603 0.638108
+v 0.065473 0.862104 0.646326
+v 0.064006 0.842626 0.650052
+v 0.097860 0.858325 0.642547
+v 0.066869 0.881462 0.641967
+v 0.032806 0.864381 0.648603
+v 0.032072 0.844852 0.652278
+v 0.095668 0.838932 0.646358
+v 0.099947 0.877603 0.638108
+v 0.033506 0.883788 0.644293
+v 0.191957 0.838139 0.622361
+v 0.187657 0.819198 0.626624
+v 0.221857 0.828562 0.612784
+v 0.196051 0.856986 0.617491
+v 0.161237 0.846317 0.630539
+v 0.157626 0.827193 0.634619
+v 0.216888 0.809835 0.617261
+v 0.226589 0.847205 0.607710
+v 0.164676 0.865339 0.625844
+v 0.305359 0.791843 0.576065
+v 0.298520 0.773938 0.581364
+v 0.330735 0.777120 0.561342
+v 0.311871 0.809703 0.570208
+v 0.278679 0.805365 0.589586
+v 0.272438 0.787157 0.594583
+v 0.323328 0.759545 0.566971
+v 0.337789 0.794666 0.555171
+v 0.284623 0.823513 0.584018
+v 0.397951 0.726370 0.510592
+v 0.389039 0.709932 0.517358
+v 0.417074 0.707505 0.491727
+v 0.406439 0.742834 0.503339
+v 0.377130 0.744314 0.528536
+v 0.368684 0.727474 0.534900
+v 0.407733 0.691489 0.498915
+v 0.425969 0.723566 0.484071
+v 0.385173 0.761160 0.521665
+v 0.463424 0.646183 0.430404
+v 0.453045 0.631540 0.438966
+v 0.474990 0.624460 0.408682
+v 0.473308 0.660936 0.421441
+v 0.449880 0.667326 0.451547
+v 0.439804 0.652210 0.459636
+v 0.464352 0.610305 0.417731
+v 0.485120 0.638750 0.399255
+v 0.459475 0.682530 0.443035
+v 0.497316 0.556745 0.340967
+v 0.486177 0.544106 0.351532
+v 0.500536 0.533646 0.317868
+v 0.507922 0.569591 0.330096
+v 0.491972 0.579646 0.363868
+v 0.480953 0.566494 0.373920
+v 0.489326 0.521525 0.328951
+v 0.511211 0.545999 0.306504
+v 0.502464 0.592980 0.353485
+v 0.497316 0.464153 0.248374
+v 0.486177 0.453587 0.261013
+v 0.491972 0.441251 0.225473
+v 0.507922 0.475024 0.235529
+v 0.500536 0.487251 0.271473
+v 0.489326 0.476169 0.283595
+v 0.480953 0.431199 0.238625
+v 0.502464 0.451634 0.212139
+v 0.511211 0.498615 0.259120
+v 0.463424 0.374715 0.158937
+v 0.453045 0.366153 0.173579
+v 0.449880 0.353572 0.137794
+v 0.473308 0.383679 0.144184
+v 0.474990 0.396437 0.180659
+v 0.464352 0.387389 0.194815
+v 0.439804 0.345484 0.152910
+v 0.459475 0.362085 0.122590
+v 0.485120 0.405864 0.166369
+v 0.397951 0.294527 0.078749
+v 0.389038 0.287761 0.095187
+v 0.377130 0.276584 0.060806
+v 0.406439 0.301781 0.062286
+v 0.417074 0.313393 0.097615
+v 0.407733 0.306204 0.113630
+v 0.368684 0.270220 0.077646
+v 0.385173 0.283454 0.043959
+v 0.425969 0.321049 0.081554
+v 0.305359 0.229055 0.013276
+v 0.298520 0.223755 0.031181
+v 0.278679 0.215533 -0.000245
+v 0.311871 0.234912 -0.004583
+v 0.330735 0.243777 0.027999
+v 0.323328 0.238148 0.045574
+v 0.272438 0.210536 0.017962
+v 0.284623 0.221101 -0.018393
+v 0.337789 0.249948 0.010454
+v 0.191957 0.182758 -0.033020
+v 0.187657 0.178495 -0.014078
+v 0.161237 0.174580 -0.041198
+v 0.196051 0.187628 -0.051867
+v 0.221857 0.192335 -0.023443
+v 0.216888 0.187858 -0.004716
+v 0.157626 0.170500 -0.022073
+v 0.164676 0.179275 -0.060220
+v 0.226589 0.197409 -0.042086
+v 0.065473 0.158794 -0.056984
+v 0.064006 0.155068 -0.037506
+v 0.032806 0.156516 -0.059262
+v 0.066869 0.163152 -0.076343
+v 0.097860 0.162572 -0.053206
+v 0.095668 0.158761 -0.033812
+v 0.032072 0.152841 -0.039733
+v 0.033506 0.160826 -0.078669
+v 0.099947 0.167011 -0.072484
+v -0.065473 0.158794 -0.056984
+v -0.064006 0.155068 -0.037506
+v -0.097860 0.162572 -0.053206
+v -0.066869 0.163152 -0.076343
+v -0.032806 0.156516 -0.059262
+v -0.032072 0.152841 -0.039733
+v -0.095668 0.158761 -0.033812
+v -0.099947 0.167011 -0.072484
+v -0.033506 0.160826 -0.078669
+v -0.191957 0.182758 -0.033020
+v -0.187657 0.178495 -0.014078
+v -0.221857 0.192335 -0.023443
+v -0.196051 0.187628 -0.051867
+v -0.161237 0.174580 -0.041198
+v -0.157626 0.170500 -0.022073
+v -0.216888 0.187858 -0.004716
+v -0.226589 0.197409 -0.042086
+v -0.164676 0.179275 -0.060220
+v -0.305359 0.229055 0.013277
+v -0.298520 0.223755 0.031181
+v -0.330735 0.243777 0.027999
+v -0.311871 0.234912 -0.004583
+v -0.278679 0.215533 -0.000245
+v -0.272438 0.210536 0.017962
+v -0.323328 0.238148 0.045574
+v -0.337789 0.249948 0.010454
+v -0.284623 0.221101 -0.018393
+v -0.397952 0.294527 0.078749
+v -0.389039 0.287761 0.095188
+v -0.417074 0.313393 0.097615
+v -0.406439 0.301781 0.062286
+v -0.377130 0.276584 0.060806
+v -0.368684 0.270219 0.077646
+v -0.407733 0.306204 0.113630
+v -0.425969 0.321048 0.081554
+v -0.385173 0.283454 0.043960
+v -0.463424 0.374715 0.158937
+v -0.453045 0.366153 0.173579
+v -0.474990 0.396437 0.180659
+v -0.473308 0.383678 0.144184
+v -0.449881 0.353572 0.137794
+v -0.439804 0.345483 0.152910
+v -0.464352 0.387389 0.194815
+v -0.485121 0.405864 0.166369
+v -0.459475 0.362085 0.122590
+v -0.497316 0.464152 0.248374
+v -0.486177 0.453587 0.261013
+v -0.500537 0.487251 0.271473
+v -0.507922 0.475024 0.235529
+v -0.491972 0.441251 0.225473
+v -0.480953 0.431199 0.238625
+v -0.489326 0.476169 0.283595
+v -0.511212 0.498615 0.259120
+v -0.502464 0.451634 0.212139
+v -0.497315 0.556745 0.340967
+v -0.486177 0.544106 0.351532
+v -0.491972 0.579646 0.363868
+v -0.507922 0.569591 0.330096
+v -0.500536 0.533646 0.317868
+v -0.489326 0.521525 0.328951
+v -0.480953 0.566494 0.373920
+v -0.502464 0.592980 0.353485
+v -0.511212 0.545999 0.306505
+v -0.499877 0.705704 0.392236
+v -0.491544 0.690712 0.402347
+v -0.485268 0.728510 0.415042
+v -0.507675 0.720743 0.381766
+v -0.512353 0.682273 0.368806
+v -0.503811 0.667672 0.379306
+v -0.477178 0.713138 0.424772
+v -0.492838 0.743905 0.404927
+v -0.520345 0.696947 0.357969
+v -0.429254 0.792199 0.478731
+v -0.422098 0.775766 0.487400
+v -0.406795 0.811554 0.498087
+v -0.435951 0.808588 0.469610
+v -0.449881 0.771850 0.458382
+v -0.442381 0.755756 0.467390
+v -0.400014 0.794798 0.506432
+v -0.413141 0.828245 0.489267
+v -0.456899 0.787921 0.448943
+v -0.329378 0.862822 0.549354
+v -0.323887 0.845211 0.556845
+v -0.300600 0.877407 0.563940
+v -0.334517 0.880312 0.541334
+v -0.356751 0.846941 0.533473
+v -0.350803 0.829595 0.541229
+v -0.295589 0.859554 0.571187
+v -0.305289 0.895125 0.556147
+v -0.362316 0.864183 0.525206
+v -0.207056 0.912760 0.599292
+v -0.203604 0.894317 0.605951
+v -0.173920 0.921582 0.608114
+v -0.210286 0.931029 0.592051
+v -0.239308 0.902430 0.588962
+v -0.235319 0.884159 0.595793
+v -0.171020 0.902991 0.614625
+v -0.176633 0.939988 0.601011
+v -0.243042 0.920538 0.581560
+v -0.070623 0.938610 0.625142
+v -0.069446 0.919736 0.631370
+v -0.035387 0.941066 0.627599
+v -0.071725 0.957282 0.618304
+v -0.105558 0.934534 0.621066
+v -0.103798 0.915728 0.627362
+v -0.034797 0.922151 0.633785
+v -0.035939 0.959777 0.620799
+v -0.107204 0.953143 0.614165
+v 0.070623 0.938610 0.625142
+v 0.069446 0.919736 0.631370
+v 0.105558 0.934534 0.621066
+v 0.071725 0.957282 0.618304
+v 0.035387 0.941066 0.627599
+v 0.034797 0.922151 0.633785
+v 0.103798 0.915728 0.627362
+v 0.107204 0.953143 0.614165
+v 0.035939 0.959777 0.620799
+v 0.207056 0.912760 0.599292
+v 0.203604 0.894317 0.605951
+v 0.239308 0.902430 0.588962
+v 0.210286 0.931029 0.592051
+v 0.173920 0.921582 0.608114
+v 0.171020 0.902991 0.614625
+v 0.235319 0.884159 0.595793
+v 0.243042 0.920538 0.581560
+v 0.176633 0.939988 0.601011
+v 0.329378 0.862822 0.549354
+v 0.323887 0.845211 0.556845
+v 0.356751 0.846941 0.533473
+v 0.334517 0.880312 0.541334
+v 0.300600 0.877407 0.563940
+v 0.295589 0.859554 0.571188
+v 0.350803 0.829595 0.541229
+v 0.362316 0.864184 0.525206
+v 0.305290 0.895125 0.556147
+v 0.429254 0.792199 0.478731
+v 0.422098 0.775766 0.487400
+v 0.449881 0.771850 0.458382
+v 0.435951 0.808588 0.469610
+v 0.406795 0.811554 0.498087
+v 0.400014 0.794798 0.506432
+v 0.442381 0.755756 0.467390
+v 0.456899 0.787921 0.448943
+v 0.413141 0.828245 0.489267
+v 0.499877 0.705704 0.392236
+v 0.491544 0.690713 0.402347
+v 0.512353 0.682273 0.368805
+v 0.507675 0.720743 0.381765
+v 0.485268 0.728510 0.415042
+v 0.477178 0.713138 0.424772
+v 0.503812 0.667672 0.379306
+v 0.520346 0.696947 0.357969
+v 0.492838 0.743905 0.404927
+v 0.536434 0.609232 0.295764
+v 0.527492 0.595848 0.307482
+v 0.539908 0.584316 0.270848
+v 0.544803 0.622766 0.283788
+v 0.530670 0.633934 0.320466
+v 0.521824 0.620139 0.331773
+v 0.530908 0.571348 0.282982
+v 0.548331 0.597461 0.258483
+v 0.538949 0.647853 0.308876
+v 0.536434 0.509356 0.195888
+v 0.527492 0.497637 0.209271
+v 0.530670 0.484653 0.171185
+v 0.544803 0.521332 0.182354
+v 0.539908 0.534271 0.220804
+v 0.530908 0.522138 0.233772
+v 0.521824 0.473346 0.184981
+v 0.538949 0.496244 0.157266
+v 0.548331 0.546636 0.207658
+v 0.499877 0.412883 0.099415
+v 0.491544 0.402773 0.114407
+v 0.485268 0.390077 0.076609
+v 0.507675 0.423354 0.084376
+v 0.512353 0.436314 0.122846
+v 0.503812 0.425813 0.137447
+v 0.477178 0.380347 0.091981
+v 0.492838 0.400192 0.061214
+v 0.520346 0.447150 0.108173
+v 0.429254 0.326388 0.012920
+v 0.422098 0.317720 0.029354
+v 0.406795 0.307033 -0.006435
+v 0.435951 0.335510 -0.003468
+v 0.449881 0.346737 0.033269
+v 0.442381 0.337730 0.049364
+v 0.400014 0.298687 0.010321
+v 0.413141 0.315852 -0.023125
+v 0.456899 0.356176 0.017199
+v 0.329378 0.255765 -0.057703
+v 0.323888 0.248274 -0.040092
+v 0.300600 0.241180 -0.072288
+v 0.334517 0.263785 -0.075193
+v 0.356751 0.271646 -0.041822
+v 0.350804 0.263890 -0.024476
+v 0.295589 0.233932 -0.054434
+v 0.305290 0.248972 -0.090006
+v 0.362316 0.279914 -0.059064
+v 0.207056 0.205827 -0.107641
+v 0.203604 0.199168 -0.089197
+v 0.173920 0.197005 -0.116462
+v 0.210286 0.213068 -0.125910
+v 0.239308 0.216157 -0.097310
+v 0.235319 0.209327 -0.079039
+v 0.171020 0.190494 -0.097872
+v 0.176633 0.204109 -0.134869
+v 0.243042 0.223559 -0.115418
+v 0.070623 0.179977 -0.133490
+v 0.069446 0.173750 -0.114616
+v 0.035387 0.177521 -0.135947
+v 0.071725 0.186815 -0.152163
+v 0.105558 0.184053 -0.129415
+v 0.103798 0.177757 -0.110608
+v 0.034797 0.171334 -0.117032
+v 0.035939 0.184320 -0.154658
+v 0.107204 0.190954 -0.148024
+v -0.070623 0.179977 -0.133490
+v -0.069446 0.173750 -0.114616
+v -0.105558 0.184053 -0.129415
+v -0.071725 0.186815 -0.152163
+v -0.035387 0.177521 -0.135947
+v -0.034797 0.171334 -0.117032
+v -0.103798 0.177757 -0.110608
+v -0.107204 0.190954 -0.148024
+v -0.035939 0.184320 -0.154658
+v -0.207056 0.205827 -0.107641
+v -0.203604 0.199168 -0.089197
+v -0.239308 0.216157 -0.097310
+v -0.210286 0.213068 -0.125910
+v -0.173920 0.197005 -0.116462
+v -0.171020 0.190494 -0.097872
+v -0.235319 0.209327 -0.079039
+v -0.243042 0.223559 -0.115418
+v -0.176633 0.204109 -0.134869
+v -0.329378 0.255765 -0.057703
+v -0.323888 0.248274 -0.040092
+v -0.356751 0.271646 -0.041822
+v -0.334517 0.263785 -0.075193
+v -0.300600 0.241180 -0.072288
+v -0.295589 0.233932 -0.054434
+v -0.350804 0.263890 -0.024476
+v -0.362316 0.279913 -0.059064
+v -0.305290 0.248972 -0.090006
+v -0.429254 0.326388 0.012920
+v -0.422098 0.317720 0.029354
+v -0.449881 0.346737 0.033270
+v -0.435951 0.335509 -0.003468
+v -0.406795 0.307033 -0.006435
+v -0.400014 0.298687 0.010321
+v -0.442382 0.337730 0.049364
+v -0.456899 0.356176 0.017199
+v -0.413141 0.315852 -0.023125
+v -0.499877 0.412883 0.099415
+v -0.491544 0.402773 0.114407
+v -0.512353 0.436314 0.122846
+v -0.507675 0.423354 0.084376
+v -0.485268 0.390077 0.076609
+v -0.477178 0.380347 0.091981
+v -0.503812 0.425813 0.137447
+v -0.520346 0.447150 0.108173
+v -0.492838 0.400192 0.061215
+v -0.536434 0.509356 0.195888
+v -0.527492 0.497637 0.209271
+v -0.539909 0.534271 0.220804
+v -0.544803 0.521331 0.182354
+v -0.530670 0.484653 0.171185
+v -0.521824 0.473346 0.184981
+v -0.530908 0.522138 0.233772
+v -0.548331 0.546636 0.207658
+v -0.538949 0.496244 0.157266
+v -0.536434 0.609231 0.295764
+v -0.527492 0.595848 0.307482
+v -0.530670 0.633934 0.320466
+v -0.544803 0.622765 0.283788
+v -0.539908 0.584316 0.270848
+v -0.530908 0.571348 0.282982
+v -0.521824 0.620139 0.331773
+v -0.538949 0.647853 0.308876
+v -0.548331 0.597461 0.258484
+v -0.527777 0.765984 0.348300
+v -0.521633 0.750899 0.359786
+v -0.512352 0.790062 0.372379
+v -0.533356 0.781051 0.336501
+v -0.540949 0.741245 0.323562
+v -0.534651 0.726448 0.335335
+v -0.506387 0.774697 0.383584
+v -0.517768 0.805384 0.360834
+v -0.546667 0.756051 0.311501
+v -0.453212 0.857306 0.439623
+v -0.447936 0.841159 0.450045
+v -0.429500 0.877742 0.460058
+v -0.458003 0.873339 0.428789
+v -0.474990 0.835821 0.418138
+v -0.469460 0.819924 0.428810
+v -0.424500 0.861356 0.470243
+v -0.434040 0.893991 0.449441
+v -0.480012 0.851627 0.407077
+v -0.347762 0.931871 0.514187
+v -0.343713 0.914855 0.523742
+v -0.317377 0.947270 0.529587
+v -0.351438 0.948692 0.504142
+v -0.376662 0.915104 0.497420
+v -0.372277 0.898283 0.507169
+v -0.313683 0.930075 0.538962
+v -0.320733 0.964254 0.519704
+v -0.380644 0.931747 0.487197
+v -0.218612 0.984596 0.566912
+v -0.216067 0.966966 0.575853
+v -0.183627 0.993910 0.576226
+v -0.220923 1.001975 0.557424
+v -0.252665 0.973689 0.556006
+v -0.249723 0.956186 0.565073
+v -0.181489 0.976172 0.585058
+v -0.185568 1.011387 0.566837
+v -0.255336 0.990952 0.546402
+v -0.074565 1.011889 0.594205
+v -0.073697 0.993941 0.602828
+v -0.037362 1.014482 0.596799
+v -0.075353 1.029556 0.585005
+v -0.111449 1.007585 0.589902
+v -0.110152 0.989688 0.598575
+v -0.036927 0.996505 0.605391
+v -0.037757 1.032177 0.587627
+v -0.112627 1.025207 0.580657
+v 0.074565 1.011889 0.594205
+v 0.073697 0.993941 0.602828
+v 0.111449 1.007585 0.589902
+v 0.075353 1.029556 0.585005
+v 0.037362 1.014482 0.596799
+v 0.036927 0.996505 0.605391
+v 0.110152 0.989688 0.598575
+v 0.112627 1.025207 0.580657
+v 0.037757 1.032177 0.587627
+v 0.218612 0.984596 0.566912
+v 0.216067 0.966966 0.575853
+v 0.252665 0.973689 0.556005
+v 0.220923 1.001974 0.557424
+v 0.183627 0.993910 0.576226
+v 0.181489 0.976172 0.585058
+v 0.249723 0.956186 0.565073
+v 0.255336 0.990952 0.546402
+v 0.185568 1.011387 0.566837
+v 0.347762 0.931871 0.514187
+v 0.343713 0.914855 0.523741
+v 0.376662 0.915104 0.497420
+v 0.351438 0.948692 0.504142
+v 0.317378 0.947270 0.529587
+v 0.313683 0.930075 0.538962
+v 0.372277 0.898283 0.507169
+v 0.380644 0.931748 0.487197
+v 0.320733 0.964254 0.519704
+v 0.453212 0.857306 0.439623
+v 0.447936 0.841159 0.450045
+v 0.474990 0.835821 0.418138
+v 0.458004 0.873339 0.428789
+v 0.429500 0.877742 0.460058
+v 0.424500 0.861356 0.470243
+v 0.469461 0.819924 0.428810
+v 0.480012 0.851627 0.407077
+v 0.434040 0.893991 0.449440
+v 0.527777 0.765984 0.348300
+v 0.521633 0.750899 0.359786
+v 0.540949 0.741245 0.323561
+v 0.533356 0.781051 0.336501
+v 0.512352 0.790063 0.372379
+v 0.506388 0.774698 0.383584
+v 0.534651 0.726449 0.335335
+v 0.546668 0.756051 0.311501
+v 0.517769 0.805385 0.360834
+v 0.566374 0.664127 0.246443
+v 0.559781 0.650228 0.259114
+v 0.570042 0.637820 0.220137
+v 0.572362 0.678117 0.233567
+v 0.560289 0.690208 0.272524
+v 0.553766 0.676005 0.284892
+v 0.563406 0.624228 0.233114
+v 0.576069 0.651533 0.206983
+v 0.566212 0.704474 0.259924
+v 0.566374 0.558676 0.140993
+v 0.559781 0.546005 0.154892
+v 0.560289 0.532595 0.114912
+v 0.572362 0.571552 0.127002
+v 0.570042 0.584983 0.167299
+v 0.563406 0.572005 0.180892
+v 0.553766 0.520227 0.129114
+v 0.566212 0.545195 0.100645
+v 0.576069 0.598137 0.153586
+v 0.527777 0.456819 0.039136
+v 0.521633 0.445334 0.054220
+v 0.512352 0.432740 0.015057
+v 0.533356 0.468618 0.024068
+v 0.540949 0.481558 0.063874
+v 0.534651 0.469784 0.078671
+v 0.506388 0.421535 0.030422
+v 0.517769 0.444285 -0.000265
+v 0.546668 0.493618 0.049068
+v 0.453212 0.365497 -0.052187
+v 0.447936 0.355074 -0.036039
+v 0.429500 0.345061 -0.072622
+v 0.458003 0.376330 -0.068220
+v 0.474990 0.386982 -0.030702
+v 0.469461 0.376309 -0.014804
+v 0.424500 0.334877 -0.056237
+v 0.434040 0.355679 -0.088871
+v 0.480012 0.398042 -0.046508
+v 0.347762 0.290932 -0.126751
+v 0.343713 0.281378 -0.109736
+v 0.317378 0.275532 -0.142151
+v 0.351438 0.300977 -0.143573
+v 0.376662 0.307699 -0.109984
+v 0.372277 0.297950 -0.093164
+v 0.313683 0.266158 -0.124956
+v 0.320733 0.285415 -0.159135
+v 0.380644 0.317922 -0.126628
+v 0.218612 0.238207 -0.179477
+v 0.216067 0.229266 -0.161847
+v 0.183627 0.228893 -0.188791
+v 0.220923 0.247695 -0.196855
+v 0.252665 0.249114 -0.168570
+v 0.249723 0.240046 -0.151067
+v 0.181489 0.220061 -0.171053
+v 0.185568 0.238282 -0.206268
+v 0.255336 0.258717 -0.185833
+v 0.074565 0.210914 -0.206769
+v 0.073697 0.202292 -0.188822
+v 0.037362 0.208320 -0.209363
+v 0.075353 0.220114 -0.224436
+v 0.111449 0.215217 -0.202466
+v 0.110152 0.206545 -0.184569
+v 0.036927 0.199728 -0.191385
+v 0.037757 0.217493 -0.227057
+v 0.112627 0.224462 -0.220088
+v -0.074565 0.210914 -0.206769
+v -0.073697 0.202292 -0.188822
+v -0.111449 0.215217 -0.202466
+v -0.075353 0.220114 -0.224436
+v -0.037362 0.208320 -0.209363
+v -0.036927 0.199728 -0.191385
+v -0.110152 0.206545 -0.184569
+v -0.112627 0.224462 -0.220088
+v -0.037757 0.217493 -0.227057
+v -0.218612 0.238207 -0.179477
+v -0.216067 0.229266 -0.161847
+v -0.252665 0.249114 -0.168570
+v -0.220923 0.247695 -0.196855
+v -0.183627 0.228893 -0.188791
+v -0.181489 0.220061 -0.171053
+v -0.249724 0.240046 -0.151067
+v -0.255336 0.258717 -0.185833
+v -0.185568 0.238282 -0.206268
+v -0.347762 0.290932 -0.126751
+v -0.343714 0.281378 -0.109736
+v -0.376662 0.307699 -0.109984
+v -0.351439 0.300977 -0.143573
+v -0.317378 0.275532 -0.142151
+v -0.313683 0.266157 -0.124956
+v -0.372277 0.297950 -0.093164
+v -0.380644 0.317922 -0.126628
+v -0.320733 0.285415 -0.159135
+v -0.453212 0.365496 -0.052187
+v -0.447936 0.355074 -0.036039
+v -0.474990 0.386982 -0.030702
+v -0.458004 0.376330 -0.068220
+v -0.429500 0.345061 -0.072622
+v -0.424500 0.334877 -0.056237
+v -0.469461 0.376309 -0.014804
+v -0.480012 0.398042 -0.046508
+v -0.434040 0.355679 -0.088871
+v -0.527777 0.456819 0.039136
+v -0.521633 0.445334 0.054220
+v -0.540949 0.481558 0.063874
+v -0.533357 0.468618 0.024068
+v -0.512352 0.432740 0.015057
+v -0.506388 0.421535 0.030422
+v -0.534651 0.469784 0.078671
+v -0.546668 0.493618 0.049068
+v -0.517769 0.444285 -0.000265
+v -0.566374 0.558676 0.140993
+v -0.559781 0.546005 0.154892
+v -0.570043 0.584983 0.167299
+v -0.572362 0.571552 0.127002
+v -0.560289 0.532595 0.114912
+v -0.553766 0.520227 0.129114
+v -0.563406 0.572005 0.180892
+v -0.576069 0.598137 0.153587
+v -0.566212 0.545195 0.100645
+v -0.566374 0.664127 0.246443
+v -0.559781 0.650228 0.259114
+v -0.560289 0.690208 0.272524
+v -0.572362 0.678117 0.233567
+v -0.570042 0.637820 0.220137
+v -0.563406 0.624228 0.233114
+v -0.553766 0.676005 0.284892
+v -0.566212 0.704474 0.259924
+v -0.576069 0.651533 0.206983
+v -0.546646 0.825990 0.299348
+v -0.542796 0.811070 0.312012
+v -0.530670 0.850929 0.324287
+v -0.549911 0.840828 0.286422
+v -0.560289 0.800367 0.273724
+v -0.556343 0.785627 0.286569
+v -0.526932 0.835834 0.336776
+v -0.533840 0.865916 0.311511
+v -0.563636 0.815052 0.260646
+v -0.469416 0.920577 0.393935
+v -0.466109 0.904992 0.405933
+v -0.444855 0.941743 0.415101
+v -0.472220 0.935980 0.381575
+v -0.491972 0.898324 0.371682
+v -0.488507 0.882895 0.383837
+v -0.441722 0.926009 0.426950
+v -0.447513 0.957273 0.402867
+v -0.494911 0.913594 0.359189
+v -0.360195 0.997808 0.471166
+v -0.357658 0.981678 0.482620
+v -0.328725 1.013758 0.487116
+v -0.362347 1.013672 0.459266
+v -0.390129 0.980441 0.453799
+v -0.387381 0.964434 0.465375
+v -0.326409 0.997516 0.498457
+v -0.330688 1.029718 0.475312
+v -0.392459 0.996202 0.441796
+v -0.226428 1.052418 0.525776
+v -0.224833 1.035904 0.536845
+v -0.190192 1.062065 0.535423
+v -0.227781 1.068609 0.514203
+v -0.261698 1.041121 0.514479
+v -0.259855 1.024686 0.525628
+v -0.188852 1.045483 0.546424
+v -0.191328 1.078313 0.523907
+v -0.263261 1.057244 0.502838
+v -0.077230 1.080686 0.554044
+v -0.076686 1.063973 0.564914
+v -0.038698 1.083373 0.556730
+v -0.077692 1.097046 0.542640
+v -0.115434 1.076229 0.549587
+v -0.114621 1.059547 0.560489
+v -0.038425 1.066640 0.567582
+v -0.038929 1.099748 0.545342
+v -0.116123 1.092562 0.538156
+v 0.077230 1.080686 0.554044
+v 0.076687 1.063973 0.564914
+v 0.115434 1.076229 0.549587
+v 0.077692 1.097046 0.542640
+v 0.038698 1.083373 0.556731
+v 0.038425 1.066640 0.567582
+v 0.114621 1.059547 0.560489
+v 0.116123 1.092562 0.538156
+v 0.038929 1.099748 0.545343
+v 0.226428 1.052418 0.525776
+v 0.224833 1.035904 0.536845
+v 0.261698 1.041121 0.514479
+v 0.227781 1.068609 0.514203
+v 0.190192 1.062065 0.535423
+v 0.188852 1.045483 0.546424
+v 0.259855 1.024686 0.525628
+v 0.263261 1.057244 0.502839
+v 0.191328 1.078313 0.523907
+v 0.360195 0.997808 0.471166
+v 0.357658 0.981678 0.482620
+v 0.390129 0.980441 0.453799
+v 0.362347 1.013672 0.459266
+v 0.328725 1.013758 0.487116
+v 0.326409 0.997516 0.498457
+v 0.387381 0.964434 0.465375
+v 0.392459 0.996202 0.441796
+v 0.330688 1.029718 0.475312
+v 0.469416 0.920577 0.393935
+v 0.466110 0.904992 0.405933
+v 0.491972 0.898324 0.371682
+v 0.472220 0.935981 0.381575
+v 0.444855 0.941744 0.415101
+v 0.441722 0.926009 0.426950
+v 0.488507 0.882895 0.383837
+v 0.494911 0.913594 0.359189
+v 0.447513 0.957273 0.402867
+v 0.546646 0.825990 0.299347
+v 0.542796 0.811070 0.312012
+v 0.560289 0.800367 0.273724
+v 0.549911 0.840828 0.286422
+v 0.530670 0.850929 0.324287
+v 0.526932 0.835834 0.336776
+v 0.556343 0.785628 0.286569
+v 0.563636 0.815052 0.260646
+v 0.533840 0.865917 0.311511
+v 0.586624 0.720491 0.193849
+v 0.582492 0.706315 0.207256
+v 0.590423 0.693244 0.166602
+v 0.590128 0.734699 0.180293
+v 0.580320 0.747505 0.220862
+v 0.576233 0.733138 0.234079
+v 0.586264 0.679260 0.180201
+v 0.593950 0.707289 0.152884
+v 0.583787 0.761874 0.207468
+v 0.586624 0.611271 0.084628
+v 0.582492 0.597863 0.098805
+v 0.580320 0.584257 0.057615
+v 0.590128 0.624826 0.070420
+v 0.590423 0.638517 0.111875
+v 0.586264 0.624918 0.125860
+v 0.576233 0.571040 0.071981
+v 0.583787 0.597651 0.043245
+v 0.593950 0.652236 0.097830
+v 0.546646 0.505772 -0.020870
+v 0.542796 0.493108 -0.005951
+v 0.530670 0.480832 -0.045810
+v 0.549911 0.518697 -0.035709
+v 0.560289 0.531395 0.004753
+v 0.556343 0.518550 0.019492
+v 0.526932 0.468344 -0.030715
+v 0.533840 0.493608 -0.060797
+v 0.563636 0.544473 -0.009932
+v 0.469416 0.411184 -0.115458
+v 0.466110 0.399186 -0.099872
+v 0.444855 0.390018 -0.136624
+v 0.472220 0.423544 -0.130861
+v 0.491972 0.433437 -0.093205
+v 0.488507 0.421283 -0.077776
+v 0.441722 0.378169 -0.120889
+v 0.447513 0.402252 -0.152154
+v 0.494911 0.445931 -0.108475
+v 0.360195 0.333954 -0.192688
+v 0.357658 0.322500 -0.176559
+v 0.328725 0.318004 -0.208638
+v 0.362347 0.345853 -0.208553
+v 0.390129 0.351320 -0.175322
+v 0.387381 0.339744 -0.159314
+v 0.326409 0.306662 -0.192396
+v 0.330688 0.329807 -0.224598
+v 0.392459 0.363323 -0.191082
+v 0.226428 0.279343 -0.247299
+v 0.224833 0.268274 -0.230784
+v 0.190192 0.269696 -0.256946
+v 0.227781 0.290916 -0.263489
+v 0.261698 0.290640 -0.236002
+v 0.259855 0.279491 -0.219567
+v 0.188852 0.258695 -0.240363
+v 0.191328 0.281212 -0.273194
+v 0.263262 0.302281 -0.252125
+v 0.077230 0.251075 -0.275567
+v 0.076686 0.240205 -0.258853
+v 0.038698 0.248389 -0.278253
+v 0.077692 0.262479 -0.291926
+v 0.115434 0.255532 -0.271110
+v 0.114621 0.244631 -0.254428
+v 0.038425 0.237537 -0.261521
+v 0.038929 0.259777 -0.294629
+v 0.116123 0.266963 -0.287443
+v -0.077231 0.251075 -0.275567
+v -0.076687 0.240205 -0.258853
+v -0.115434 0.255532 -0.271110
+v -0.077692 0.262479 -0.291926
+v -0.038698 0.248389 -0.278253
+v -0.038425 0.237537 -0.261521
+v -0.114621 0.244631 -0.254428
+v -0.116123 0.266963 -0.287443
+v -0.038929 0.259777 -0.294629
+v -0.226428 0.279343 -0.247299
+v -0.224834 0.268274 -0.230784
+v -0.261698 0.290640 -0.236002
+v -0.227781 0.290916 -0.263489
+v -0.190192 0.269696 -0.256945
+v -0.188852 0.258695 -0.240363
+v -0.259855 0.279491 -0.219567
+v -0.263262 0.302281 -0.252125
+v -0.191328 0.281212 -0.273194
+v -0.360195 0.333954 -0.192688
+v -0.357659 0.322500 -0.176559
+v -0.390129 0.351320 -0.175322
+v -0.362347 0.345853 -0.208553
+v -0.328725 0.318004 -0.208638
+v -0.326409 0.306662 -0.192396
+v -0.387381 0.339744 -0.159314
+v -0.392459 0.363323 -0.191082
+v -0.330688 0.329807 -0.224598
+v -0.469416 0.411184 -0.115458
+v -0.466110 0.399186 -0.099872
+v -0.491973 0.433437 -0.093205
+v -0.472220 0.423544 -0.130861
+v -0.444856 0.390018 -0.136624
+v -0.441722 0.378169 -0.120889
+v -0.488507 0.421283 -0.077776
+v -0.494911 0.445931 -0.108475
+v -0.447513 0.402252 -0.152154
+v -0.546646 0.505772 -0.020870
+v -0.542796 0.493108 -0.005951
+v -0.560289 0.531395 0.004753
+v -0.549912 0.518697 -0.035708
+v -0.530670 0.480832 -0.045810
+v -0.526933 0.468344 -0.030715
+v -0.556343 0.518550 0.019492
+v -0.563636 0.544473 -0.009932
+v -0.533840 0.493608 -0.060797
+v -0.586624 0.611271 0.084629
+v -0.582492 0.597863 0.098805
+v -0.590423 0.638517 0.111875
+v -0.590128 0.624826 0.070421
+v -0.580321 0.584257 0.057615
+v -0.576233 0.571040 0.071981
+v -0.586265 0.624918 0.125860
+v -0.593950 0.652236 0.097830
+v -0.583787 0.597651 0.043245
+v -0.586624 0.720491 0.193849
+v -0.582492 0.706315 0.207256
+v -0.580320 0.747505 0.220863
+v -0.590128 0.734699 0.180293
+v -0.590423 0.693244 0.166602
+v -0.586264 0.679260 0.180201
+v -0.576233 0.733138 0.234079
+v -0.583787 0.761874 0.207468
+v -0.593950 0.707289 0.152884
+v -0.556162 0.884696 0.246216
+v -0.554672 0.870196 0.259842
+v -0.539908 0.910069 0.271590
+v -0.557057 0.899050 0.232386
+v -0.570043 0.858626 0.220147
+v -0.568515 0.844197 0.233843
+v -0.538461 0.895502 0.285148
+v -0.540777 0.924465 0.257800
+v -0.570960 0.872939 0.206274
+v -0.477587 0.980930 0.342450
+v -0.476308 0.966173 0.355819
+v -0.452599 1.002464 0.363985
+v -0.478356 0.995440 0.328775
+v -0.500537 0.958289 0.319810
+v -0.499195 0.943593 0.333239
+v -0.451387 0.987650 0.377295
+v -0.453328 1.017009 0.350344
+v -0.501342 0.972763 0.306098
+v -0.366466 1.059505 0.421025
+v -0.365484 1.044537 0.434183
+v -0.334447 1.075732 0.437253
+v -0.367055 1.074141 0.407476
+v -0.396920 1.041836 0.403356
+v -0.395856 1.026915 0.416561
+v -0.333551 1.060721 0.450367
+v -0.334985 1.090395 0.423730
+v -0.397559 1.056443 0.389778
+v -0.230370 1.115066 0.476586
+v -0.229753 1.099949 0.489595
+v -0.193503 1.124880 0.486401
+v -0.230741 1.129791 0.463126
+v -0.266254 1.103572 0.465092
+v -0.265540 1.088487 0.478132
+v -0.192984 1.109738 0.499383
+v -0.193814 1.139622 0.472957
+v -0.266682 1.118279 0.451614
+v -0.078575 1.143826 0.505346
+v -0.078364 1.128633 0.518278
+v -0.039371 1.146559 0.508080
+v -0.078701 1.158598 0.491933
+v -0.117443 1.139291 0.500812
+v -0.117128 1.124110 0.513756
+v -0.039266 1.131358 0.521004
+v -0.039435 1.161336 0.494671
+v -0.117632 1.154056 0.487391
+v 0.078575 1.143826 0.505346
+v 0.078364 1.128633 0.518278
+v 0.117443 1.139291 0.500812
+v 0.078701 1.158598 0.491933
+v 0.039371 1.146559 0.508080
+v 0.039266 1.131358 0.521004
+v 0.117128 1.124110 0.513756
+v 0.117632 1.154056 0.487391
+v 0.039435 1.161336 0.494671
+v 0.230370 1.115066 0.476586
+v 0.229753 1.099949 0.489595
+v 0.266254 1.103572 0.465092
+v 0.230741 1.129791 0.463126
+v 0.193503 1.124880 0.486401
+v 0.192984 1.109738 0.499383
+v 0.265541 1.088486 0.478132
+v 0.266683 1.118279 0.451614
+v 0.193814 1.139622 0.472957
+v 0.366466 1.059505 0.421025
+v 0.365484 1.044537 0.434183
+v 0.396920 1.041836 0.403356
+v 0.367056 1.074141 0.407476
+v 0.334447 1.075732 0.437253
+v 0.333551 1.060721 0.450367
+v 0.395857 1.026916 0.416561
+v 0.397559 1.056444 0.389778
+v 0.334985 1.090395 0.423730
+v 0.477587 0.980930 0.342450
+v 0.476308 0.966173 0.355819
+v 0.500537 0.958289 0.319810
+v 0.478356 0.995440 0.328775
+v 0.452600 1.002464 0.363985
+v 0.451387 0.987650 0.377295
+v 0.499196 0.943593 0.333239
+v 0.501342 0.972763 0.306098
+v 0.453328 1.017009 0.350344
+v 0.556162 0.884696 0.246216
+v 0.554672 0.870197 0.259842
+v 0.570043 0.858626 0.220147
+v 0.557057 0.899051 0.232385
+v 0.539908 0.910069 0.271590
+v 0.538461 0.895502 0.285148
+v 0.568515 0.844197 0.233843
+v 0.570960 0.872939 0.206274
+v 0.540777 0.924465 0.257800
+v 0.596836 0.777360 0.138881
+v 0.595236 0.763149 0.152794
+v 0.600701 0.749639 0.111160
+v 0.597796 0.791542 0.124877
+v 0.590423 0.804844 0.166365
+v 0.588841 0.790559 0.180205
+v 0.599092 0.735502 0.125148
+v 0.601668 0.763777 0.097112
+v 0.591373 0.819071 0.152406
+v 0.596836 0.666239 0.027759
+v 0.595236 0.652325 0.041971
+v 0.590423 0.638754 0.000275
+v 0.597796 0.680242 0.013577
+v 0.600701 0.693960 0.055480
+v 0.599092 0.679972 0.069617
+v 0.588841 0.624914 0.014560
+v 0.591373 0.652714 -0.013951
+v 0.601668 0.708008 0.041343
+v 0.556162 0.558903 -0.079576
+v 0.554672 0.545277 -0.065077
+v 0.539908 0.533529 -0.104950
+v 0.557057 0.572734 -0.093931
+v 0.570043 0.584972 -0.053507
+v 0.568515 0.571276 -0.039078
+v 0.538461 0.519971 -0.090383
+v 0.540777 0.547319 -0.119346
+v 0.570960 0.598845 -0.067820
+v 0.477587 0.462669 -0.175810
+v 0.476308 0.449301 -0.161054
+v 0.452600 0.441134 -0.197345
+v 0.478356 0.476345 -0.190320
+v 0.500537 0.485310 -0.153170
+v 0.499196 0.471881 -0.138474
+v 0.451387 0.427824 -0.182530
+v 0.453328 0.454775 -0.211889
+v 0.501342 0.499022 -0.167643
+v 0.366466 0.384094 -0.254385
+v 0.365484 0.370936 -0.239418
+v 0.334447 0.367866 -0.270613
+v 0.367056 0.397643 -0.269022
+v 0.396920 0.401763 -0.236716
+v 0.395857 0.388558 -0.221796
+v 0.333551 0.354752 -0.255602
+v 0.334985 0.381389 -0.285275
+v 0.397559 0.415341 -0.251324
+v 0.230370 0.328533 -0.309946
+v 0.229753 0.315524 -0.294830
+v 0.193503 0.318718 -0.319761
+v 0.230741 0.341993 -0.324672
+v 0.266254 0.340027 -0.298453
+v 0.265541 0.326987 -0.283367
+v 0.192984 0.305736 -0.304618
+v 0.193814 0.332162 -0.334503
+v 0.266683 0.353505 -0.313160
+v 0.078575 0.299773 -0.338707
+v 0.078364 0.286841 -0.323513
+v 0.039371 0.297039 -0.341440
+v 0.078701 0.313186 -0.353479
+v 0.117443 0.304307 -0.334172
+v 0.117128 0.291363 -0.318991
+v 0.039266 0.284115 -0.326239
+v 0.039435 0.310449 -0.356216
+v 0.117632 0.317728 -0.348937
+v -0.078575 0.299773 -0.338707
+v -0.078364 0.286841 -0.323513
+v -0.117443 0.304307 -0.334172
+v -0.078701 0.313186 -0.353479
+v -0.039371 0.297039 -0.341440
+v -0.039266 0.284115 -0.326239
+v -0.117128 0.291363 -0.318991
+v -0.117632 0.317728 -0.348937
+v -0.039435 0.310449 -0.356216
+v -0.230370 0.328533 -0.309946
+v -0.229753 0.315524 -0.294830
+v -0.266254 0.340027 -0.298453
+v -0.230741 0.341993 -0.324672
+v -0.193503 0.318718 -0.319761
+v -0.192984 0.305736 -0.304618
+v -0.265541 0.326987 -0.283367
+v -0.266683 0.353505 -0.313160
+v -0.193814 0.332162 -0.334503
+v -0.366466 0.384094 -0.254385
+v -0.365484 0.370936 -0.239418
+v -0.396920 0.401763 -0.236716
+v -0.367056 0.397643 -0.269022
+v -0.334447 0.367866 -0.270613
+v -0.333551 0.354752 -0.255602
+v -0.395857 0.388558 -0.221796
+v -0.397559 0.415341 -0.251324
+v -0.334985 0.381389 -0.285275
+v -0.477588 0.462669 -0.175810
+v -0.476308 0.449301 -0.161053
+v -0.500537 0.485309 -0.153170
+v -0.478356 0.476345 -0.190320
+v -0.452600 0.441134 -0.197345
+v -0.451387 0.427824 -0.182530
+v -0.499196 0.471881 -0.138474
+v -0.501343 0.499022 -0.167643
+v -0.453328 0.454775 -0.211889
+v -0.556163 0.558903 -0.079576
+v -0.554672 0.545277 -0.065077
+v -0.570043 0.584972 -0.053507
+v -0.557058 0.572734 -0.093931
+v -0.539908 0.533529 -0.104950
+v -0.538462 0.519971 -0.090383
+v -0.568515 0.571276 -0.039078
+v -0.570960 0.598845 -0.067820
+v -0.540777 0.547319 -0.119346
+v -0.596836 0.666239 0.027759
+v -0.595237 0.652325 0.041971
+v -0.600701 0.693960 0.055480
+v -0.597796 0.680242 0.013577
+v -0.590423 0.638754 0.000275
+v -0.588841 0.624914 0.014560
+v -0.599092 0.679972 0.069618
+v -0.601668 0.708008 0.041343
+v -0.591373 0.652714 -0.013951
+v -0.596836 0.777360 0.138881
+v -0.595236 0.763149 0.152795
+v -0.590423 0.804844 0.166365
+v -0.597796 0.791542 0.124878
+v -0.600701 0.749639 0.111160
+v -0.599092 0.735502 0.125148
+v -0.588841 0.790559 0.180205
+v -0.591373 0.819071 0.152406
+v -0.601668 0.763777 0.097112
+v -0.556162 0.941097 0.189815
+v -0.557057 0.927266 0.204170
+v -0.539908 0.966471 0.215189
+v -0.554672 0.954723 0.175316
+v -0.570043 0.915028 0.163746
+v -0.570960 0.901155 0.178059
+v -0.540777 0.952681 0.229585
+v -0.538461 0.980029 0.200622
+v -0.568515 0.928724 0.149317
+v -0.477587 1.037331 0.286049
+v -0.478356 1.023655 0.300559
+v -0.452599 1.058866 0.307584
+v -0.476308 1.050699 0.271292
+v -0.500537 1.014691 0.263408
+v -0.501342 1.000978 0.277882
+v -0.453328 1.045225 0.322128
+v -0.451387 1.072176 0.292769
+v -0.499195 1.028119 0.248712
+v -0.366466 1.115906 0.364624
+v -0.367055 1.102357 0.379260
+v -0.334447 1.132133 0.380852
+v -0.365484 1.129064 0.349656
+v -0.396920 1.098237 0.346955
+v -0.397559 1.084659 0.361563
+v -0.334985 1.118611 0.395514
+v -0.333551 1.145248 0.365841
+v -0.395856 1.111442 0.332035
+v -0.230370 1.171467 0.420185
+v -0.230741 1.158007 0.434910
+v -0.193503 1.181282 0.430000
+v -0.229753 1.184476 0.405068
+v -0.266254 1.159973 0.408691
+v -0.266682 1.146495 0.423398
+v -0.193814 1.167838 0.444741
+v -0.192984 1.194264 0.414857
+v -0.265540 1.173013 0.393606
+v -0.078575 1.200227 0.448945
+v -0.078701 1.186814 0.463717
+v -0.039371 1.202960 0.451678
+v -0.078364 1.213159 0.433752
+v -0.117443 1.195693 0.444411
+v -0.117632 1.182272 0.459175
+v -0.039435 1.189551 0.466455
+v -0.039266 1.215885 0.436478
+v -0.117128 1.208637 0.429229
+v 0.078575 1.200227 0.448945
+v 0.078701 1.186814 0.463717
+v 0.117443 1.195693 0.444410
+v 0.078364 1.213159 0.433752
+v 0.039371 1.202960 0.451678
+v 0.039435 1.189551 0.466455
+v 0.117632 1.182272 0.459175
+v 0.117128 1.208637 0.429229
+v 0.039266 1.215885 0.436478
+v 0.230370 1.171467 0.420185
+v 0.230741 1.158007 0.434910
+v 0.266254 1.159973 0.408691
+v 0.229753 1.184476 0.405068
+v 0.193503 1.181282 0.430000
+v 0.193814 1.167838 0.444741
+v 0.266683 1.146495 0.423398
+v 0.265541 1.173013 0.393606
+v 0.192984 1.194264 0.414857
+v 0.366466 1.115906 0.364624
+v 0.367056 1.102357 0.379260
+v 0.396920 1.098237 0.346955
+v 0.365484 1.129064 0.349656
+v 0.334447 1.132134 0.380852
+v 0.334985 1.118611 0.395514
+v 0.397559 1.084659 0.361563
+v 0.395857 1.111442 0.332035
+v 0.333551 1.145248 0.365841
+v 0.477587 1.037331 0.286049
+v 0.478356 1.023655 0.300559
+v 0.500537 1.014691 0.263408
+v 0.476308 1.050699 0.271292
+v 0.452599 1.058866 0.307584
+v 0.453328 1.045225 0.322128
+v 0.501342 1.000978 0.277882
+v 0.499196 1.028119 0.248712
+v 0.451387 1.072176 0.292769
+v 0.556162 0.941097 0.189815
+v 0.557057 0.927266 0.204170
+v 0.570043 0.915028 0.163746
+v 0.554672 0.954723 0.175316
+v 0.539908 0.966471 0.215189
+v 0.540777 0.952681 0.229584
+v 0.570960 0.901155 0.178059
+v 0.568515 0.928724 0.149316
+v 0.538461 0.980029 0.200622
+v 0.596836 0.833761 0.082479
+v 0.597796 0.819758 0.096662
+v 0.600701 0.806040 0.054758
+v 0.595236 0.847675 0.068268
+v 0.590423 0.861245 0.109963
+v 0.591373 0.847286 0.124190
+v 0.601668 0.791992 0.068896
+v 0.599092 0.820028 0.040621
+v 0.588841 0.875085 0.095678
+v 0.596836 0.722640 -0.028642
+v 0.597796 0.708458 -0.014639
+v 0.590423 0.695156 -0.056126
+v 0.595236 0.736851 -0.042556
+v 0.600701 0.750361 -0.000921
+v 0.601668 0.736223 0.013127
+v 0.591373 0.680929 -0.042167
+v 0.588841 0.709441 -0.069966
+v 0.599092 0.764498 -0.014909
+v 0.556162 0.615304 -0.135977
+v 0.557057 0.600949 -0.122147
+v 0.539908 0.589931 -0.161351
+v 0.554672 0.629804 -0.149604
+v 0.570043 0.641374 -0.109908
+v 0.570960 0.627061 -0.096036
+v 0.540777 0.575535 -0.147562
+v 0.538461 0.604498 -0.174909
+v 0.568515 0.655803 -0.123604
+v 0.477587 0.519070 -0.232212
+v 0.478356 0.504560 -0.218536
+v 0.452600 0.497536 -0.253746
+v 0.476308 0.533827 -0.245580
+v 0.500537 0.541711 -0.209571
+v 0.501342 0.527237 -0.195859
+v 0.453328 0.482991 -0.240105
+v 0.451387 0.512350 -0.267057
+v 0.499196 0.556407 -0.223000
+v 0.366466 0.440495 -0.310787
+v 0.367056 0.425859 -0.297237
+v 0.334447 0.424268 -0.327014
+v 0.365484 0.455463 -0.323944
+v 0.396920 0.458164 -0.293118
+v 0.397559 0.443556 -0.279540
+v 0.334985 0.409605 -0.313491
+v 0.333551 0.439279 -0.340128
+v 0.395857 0.473084 -0.306323
+v 0.230370 0.384934 -0.366347
+v 0.230741 0.370209 -0.352888
+v 0.193503 0.375119 -0.376162
+v 0.229753 0.400051 -0.379356
+v 0.266254 0.396428 -0.354854
+v 0.266683 0.381721 -0.341376
+v 0.193814 0.360378 -0.362718
+v 0.192984 0.390262 -0.389145
+v 0.265541 0.411513 -0.367894
+v 0.078575 0.356174 -0.395108
+v 0.078701 0.341402 -0.381694
+v 0.039371 0.353441 -0.397841
+v 0.078364 0.371367 -0.408040
+v 0.117443 0.360709 -0.390573
+v 0.117632 0.345944 -0.377152
+v 0.039435 0.338664 -0.384432
+v 0.039266 0.368641 -0.410766
+v 0.117128 0.375890 -0.403517
+v -0.078575 0.356174 -0.395108
+v -0.078701 0.341402 -0.381694
+v -0.117443 0.360709 -0.390573
+v -0.078364 0.371367 -0.408040
+v -0.039371 0.353441 -0.397841
+v -0.039435 0.338664 -0.384432
+v -0.117632 0.345944 -0.377152
+v -0.117128 0.375890 -0.403517
+v -0.039266 0.368641 -0.410765
+v -0.230370 0.384934 -0.366347
+v -0.230741 0.370209 -0.352888
+v -0.266254 0.396428 -0.354854
+v -0.229753 0.400051 -0.379356
+v -0.193503 0.375119 -0.376162
+v -0.193814 0.360378 -0.362718
+v -0.266683 0.381721 -0.341376
+v -0.265541 0.411513 -0.367894
+v -0.192984 0.390262 -0.389145
+v -0.366466 0.440495 -0.310787
+v -0.367056 0.425859 -0.297237
+v -0.396920 0.458164 -0.293117
+v -0.365484 0.455463 -0.323944
+v -0.334447 0.424268 -0.327014
+v -0.334985 0.409605 -0.313491
+v -0.397559 0.443556 -0.279540
+v -0.395857 0.473084 -0.306323
+v -0.333551 0.439278 -0.340128
+v -0.477588 0.519070 -0.232212
+v -0.478356 0.504560 -0.218536
+v -0.500537 0.541711 -0.209571
+v -0.476308 0.533827 -0.245580
+v -0.452600 0.497536 -0.253746
+v -0.453328 0.482991 -0.240105
+v -0.501343 0.527237 -0.195859
+v -0.499196 0.556407 -0.223000
+v -0.451387 0.512350 -0.267057
+v -0.556162 0.615304 -0.135977
+v -0.557058 0.600949 -0.122147
+v -0.570043 0.641374 -0.109908
+v -0.554672 0.629804 -0.149604
+v -0.539908 0.589931 -0.161351
+v -0.540777 0.575535 -0.147561
+v -0.570960 0.627061 -0.096036
+v -0.568515 0.655803 -0.123604
+v -0.538462 0.604498 -0.174909
+v -0.596836 0.722640 -0.028642
+v -0.597796 0.708458 -0.014639
+v -0.600701 0.750361 -0.000921
+v -0.595237 0.736851 -0.042556
+v -0.590423 0.695156 -0.056126
+v -0.591373 0.680929 -0.042167
+v -0.601668 0.736223 0.013127
+v -0.599092 0.764498 -0.014909
+v -0.588841 0.709441 -0.069966
+v -0.596836 0.833761 0.082480
+v -0.597796 0.819758 0.096662
+v -0.590423 0.861245 0.109964
+v -0.595236 0.847675 0.068268
+v -0.600701 0.806040 0.054758
+v -0.601668 0.791992 0.068896
+v -0.591373 0.847286 0.124190
+v -0.588841 0.875085 0.095678
+v -0.599092 0.820028 0.040621
+v -0.546646 0.994228 0.131109
+v -0.549911 0.981303 0.145947
+v -0.530670 1.019168 0.156049
+v -0.542796 1.006892 0.116190
+v -0.560289 0.968605 0.105486
+v -0.563636 0.955527 0.120171
+v -0.533840 1.006391 0.171036
+v -0.526932 1.031656 0.140954
+v -0.556343 0.981450 0.090747
+v -0.469416 1.088816 0.225697
+v -0.472220 1.076455 0.241100
+v -0.444855 1.109982 0.246863
+v -0.466109 1.100814 0.210111
+v -0.491972 1.066563 0.203443
+v -0.494911 1.054069 0.218714
+v -0.447513 1.097748 0.262392
+v -0.441722 1.121831 0.231128
+v -0.488507 1.078717 0.188014
+v -0.360195 1.166046 0.302927
+v -0.362347 1.154147 0.318792
+v -0.328725 1.181996 0.318877
+v -0.357658 1.177500 0.286797
+v -0.390129 1.148679 0.285560
+v -0.392459 1.136677 0.301321
+v -0.330688 1.170192 0.334837
+v -0.326409 1.193338 0.302635
+v -0.387381 1.160256 0.269553
+v -0.226428 1.220657 0.357537
+v -0.227781 1.209084 0.373728
+v -0.190192 1.230304 0.367184
+v -0.224833 1.231726 0.341023
+v -0.261698 1.209360 0.346240
+v -0.263261 1.197719 0.362363
+v -0.191328 1.218788 0.383432
+v -0.188852 1.241305 0.350602
+v -0.259855 1.220509 0.329806
+v -0.077230 1.248925 0.385805
+v -0.077692 1.237521 0.402165
+v -0.038698 1.251611 0.388492
+v -0.076687 1.259795 0.369092
+v -0.115434 1.244468 0.381348
+v -0.116123 1.233037 0.397681
+v -0.038929 1.240223 0.404867
+v -0.038425 1.262463 0.371760
+v -0.114621 1.255369 0.364666
+v 0.077230 1.248925 0.385805
+v 0.077692 1.237521 0.402165
+v 0.115434 1.244468 0.381348
+v 0.076686 1.259795 0.369092
+v 0.038698 1.251611 0.388492
+v 0.038929 1.240223 0.404867
+v 0.116123 1.233037 0.397681
+v 0.114621 1.255369 0.364666
+v 0.038425 1.262463 0.371760
+v 0.226428 1.220657 0.357537
+v 0.227781 1.209084 0.373728
+v 0.261698 1.209360 0.346240
+v 0.224833 1.231726 0.341023
+v 0.190192 1.230304 0.367184
+v 0.191328 1.218788 0.383432
+v 0.263261 1.197719 0.362364
+v 0.259855 1.220509 0.329806
+v 0.188852 1.241305 0.350602
+v 0.360195 1.166046 0.302927
+v 0.362347 1.154147 0.318792
+v 0.390129 1.148679 0.285560
+v 0.357658 1.177500 0.286797
+v 0.328725 1.181996 0.318877
+v 0.330688 1.170192 0.334837
+v 0.392459 1.136677 0.301321
+v 0.387381 1.160256 0.269553
+v 0.326409 1.193338 0.302635
+v 0.469416 1.088816 0.225697
+v 0.472220 1.076455 0.241100
+v 0.491972 1.066563 0.203443
+v 0.466110 1.100814 0.210111
+v 0.444855 1.109982 0.246863
+v 0.447513 1.097748 0.262392
+v 0.494911 1.054069 0.218714
+v 0.488507 1.078717 0.188014
+v 0.441722 1.121831 0.231128
+v 0.546646 0.994228 0.131109
+v 0.549911 0.981303 0.145947
+v 0.560289 0.968605 0.105486
+v 0.542796 1.006892 0.116189
+v 0.530670 1.019168 0.156049
+v 0.533840 1.006392 0.171036
+v 0.563636 0.955527 0.120171
+v 0.556343 0.981450 0.090747
+v 0.526932 1.031656 0.140954
+v 0.586624 0.888729 0.025610
+v 0.590128 0.875174 0.039818
+v 0.590423 0.861483 -0.001637
+v 0.582492 0.902137 0.011434
+v 0.580320 0.915743 0.052624
+v 0.583787 0.902349 0.066993
+v 0.593950 0.847764 0.012409
+v 0.586264 0.875082 -0.015621
+v 0.576233 0.928960 0.038257
+v 0.586624 0.779509 -0.083610
+v 0.590128 0.765301 -0.070055
+v 0.580320 0.752495 -0.110624
+v 0.582492 0.793685 -0.097017
+v 0.590423 0.806756 -0.056363
+v 0.593950 0.792711 -0.042645
+v 0.583787 0.738126 -0.097230
+v 0.576233 0.766862 -0.123841
+v 0.586264 0.820740 -0.069962
+v 0.546646 0.674010 -0.189109
+v 0.549911 0.659172 -0.176184
+v 0.530670 0.649071 -0.214049
+v 0.542796 0.688930 -0.201773
+v 0.560289 0.699633 -0.163486
+v 0.563636 0.684948 -0.150407
+v 0.533840 0.634084 -0.201272
+v 0.526932 0.664166 -0.226537
+v 0.556343 0.714372 -0.176330
+v 0.469416 0.579423 -0.283697
+v 0.472220 0.564019 -0.271336
+v 0.444855 0.558257 -0.304863
+v 0.466110 0.595008 -0.295694
+v 0.491972 0.601676 -0.261443
+v 0.494911 0.586406 -0.248950
+v 0.447513 0.542727 -0.292629
+v 0.441722 0.573991 -0.316711
+v 0.488507 0.617105 -0.273598
+v 0.360195 0.502192 -0.360927
+v 0.362347 0.486328 -0.349028
+v 0.328725 0.486242 -0.376877
+v 0.357658 0.518322 -0.372381
+v 0.390129 0.519559 -0.343560
+v 0.392459 0.503798 -0.331557
+v 0.330688 0.470282 -0.365073
+v 0.326409 0.502484 -0.388219
+v 0.387381 0.535566 -0.355137
+v 0.226428 0.447582 -0.415537
+v 0.227781 0.431391 -0.403964
+v 0.190192 0.437935 -0.425184
+v 0.224833 0.464096 -0.426607
+v 0.261698 0.458879 -0.404240
+v 0.263262 0.442756 -0.392600
+v 0.191328 0.421687 -0.413669
+v 0.188852 0.454517 -0.436186
+v 0.259855 0.475314 -0.415389
+v 0.077230 0.419314 -0.443806
+v 0.077692 0.402954 -0.432401
+v 0.038698 0.416627 -0.446492
+v 0.076686 0.436027 -0.454676
+v 0.115434 0.423771 -0.439349
+v 0.116123 0.407438 -0.427918
+v 0.038929 0.400252 -0.435104
+v 0.038425 0.433359 -0.457343
+v 0.114621 0.440453 -0.450250
+v -0.077231 0.419314 -0.443805
+v -0.077692 0.402954 -0.432401
+v -0.115434 0.423771 -0.439348
+v -0.076687 0.436027 -0.454676
+v -0.038698 0.416627 -0.446492
+v -0.038929 0.400252 -0.435104
+v -0.116123 0.407438 -0.427918
+v -0.114621 0.440453 -0.450250
+v -0.038425 0.433359 -0.457343
+v -0.226428 0.447582 -0.415537
+v -0.227781 0.431391 -0.403964
+v -0.261698 0.458879 -0.404240
+v -0.224834 0.464096 -0.426606
+v -0.190192 0.437935 -0.425184
+v -0.191328 0.421687 -0.413669
+v -0.263262 0.442756 -0.392600
+v -0.259855 0.475313 -0.415389
+v -0.188852 0.454517 -0.436185
+v -0.360195 0.502192 -0.360927
+v -0.362347 0.486328 -0.349028
+v -0.390129 0.519559 -0.343560
+v -0.357659 0.518322 -0.372381
+v -0.328725 0.486242 -0.376877
+v -0.330688 0.470282 -0.365073
+v -0.392459 0.503798 -0.331557
+v -0.387381 0.535566 -0.355136
+v -0.326409 0.502484 -0.388219
+v -0.469416 0.579423 -0.283697
+v -0.472220 0.564019 -0.271336
+v -0.491973 0.601676 -0.261443
+v -0.466110 0.595008 -0.295694
+v -0.444856 0.558257 -0.304863
+v -0.447513 0.542727 -0.292629
+v -0.494911 0.586406 -0.248950
+v -0.488508 0.617105 -0.273598
+v -0.441722 0.573991 -0.316711
+v -0.546646 0.674010 -0.189109
+v -0.549912 0.659172 -0.176183
+v -0.560289 0.699633 -0.163486
+v -0.542796 0.688930 -0.201773
+v -0.530670 0.649071 -0.214049
+v -0.533840 0.634083 -0.201272
+v -0.563636 0.684948 -0.150407
+v -0.556343 0.714372 -0.176330
+v -0.526933 0.664166 -0.226537
+v -0.586624 0.779509 -0.083610
+v -0.590128 0.765301 -0.070054
+v -0.590423 0.806756 -0.056363
+v -0.582492 0.793685 -0.097017
+v -0.580321 0.752495 -0.110624
+v -0.583787 0.738126 -0.097230
+v -0.593950 0.792711 -0.042645
+v -0.586265 0.820740 -0.069962
+v -0.576233 0.766862 -0.123841
+v -0.586624 0.888729 0.025610
+v -0.590128 0.875174 0.039818
+v -0.580320 0.915743 0.052624
+v -0.582492 0.902137 0.011434
+v -0.590423 0.861483 -0.001637
+v -0.593950 0.847764 0.012409
+v -0.583787 0.902349 0.066993
+v -0.576233 0.928960 0.038257
+v -0.586264 0.875082 -0.015621
+v -0.527824 1.043121 0.071190
+v -0.533356 1.031382 0.086170
+v -0.512398 1.067202 0.095271
+v -0.521821 1.054426 0.056369
+v -0.540997 1.018380 0.046450
+v -0.546667 1.006382 0.061170
+v -0.517769 1.055715 0.110504
+v -0.506570 1.078233 0.080176
+v -0.534844 1.029967 0.031909
+v -0.453253 1.134452 0.162521
+v -0.458003 1.123670 0.178458
+v -0.429538 1.154889 0.182958
+v -0.448098 1.144718 0.146661
+v -0.475033 1.112965 0.141034
+v -0.480012 1.101957 0.156746
+v -0.434040 1.144321 0.199110
+v -0.424653 1.164923 0.166865
+v -0.469630 1.123476 0.125418
+v -0.347793 1.209023 0.237092
+v -0.351438 1.199023 0.253811
+v -0.317406 1.224424 0.252493
+v -0.343837 1.218441 0.220384
+v -0.376696 1.192254 0.220324
+v -0.380644 1.182078 0.236867
+v -0.320733 1.214585 0.269373
+v -0.313796 1.233667 0.235609
+v -0.372411 1.201863 0.203806
+v -0.218632 1.261753 0.289822
+v -0.220923 1.252305 0.307094
+v -0.183643 1.271067 0.299137
+v -0.216145 1.270571 0.272514
+v -0.252687 1.250845 0.278914
+v -0.255336 1.241283 0.296072
+v -0.185568 1.261718 0.316506
+v -0.181554 1.279780 0.281722
+v -0.249813 1.259788 0.261730
+v -0.074571 1.289048 0.317117
+v -0.075353 1.279886 0.334675
+v -0.037365 1.291642 0.319711
+v -0.073723 1.297556 0.299498
+v -0.111459 1.284744 0.312814
+v -0.112627 1.275537 0.330326
+v -0.037757 1.282507 0.337296
+v -0.036940 1.300120 0.302063
+v -0.110191 1.293301 0.295244
+v 0.074571 1.289048 0.317117
+v 0.075353 1.279886 0.334675
+v 0.111459 1.284744 0.312814
+v 0.073723 1.297556 0.299498
+v 0.037365 1.291642 0.319711
+v 0.037757 1.282507 0.337296
+v 0.112627 1.275537 0.330326
+v 0.110191 1.293301 0.295244
+v 0.036940 1.300120 0.302063
+v 0.218632 1.261753 0.289822
+v 0.220923 1.252305 0.307094
+v 0.252687 1.250845 0.278914
+v 0.216145 1.270571 0.272514
+v 0.183643 1.271067 0.299137
+v 0.185568 1.261718 0.316506
+v 0.255336 1.241283 0.296072
+v 0.249813 1.259788 0.261730
+v 0.181554 1.279780 0.281722
+v 0.347793 1.209023 0.237092
+v 0.351438 1.199023 0.253811
+v 0.376696 1.192254 0.220324
+v 0.343837 1.218442 0.220384
+v 0.317406 1.224424 0.252493
+v 0.320733 1.214585 0.269373
+v 0.380644 1.182078 0.236867
+v 0.372411 1.201863 0.203805
+v 0.313796 1.233667 0.235609
+v 0.453253 1.134452 0.162521
+v 0.458003 1.123670 0.178458
+v 0.475033 1.112965 0.141034
+v 0.448098 1.144718 0.146660
+v 0.429538 1.154889 0.182958
+v 0.434040 1.144321 0.199110
+v 0.480012 1.101958 0.156746
+v 0.469630 1.123476 0.125418
+v 0.424653 1.164923 0.166865
+v 0.527824 1.043121 0.071190
+v 0.533356 1.031382 0.086170
+v 0.540997 1.018380 0.046450
+v 0.521821 1.054426 0.056368
+v 0.512398 1.067202 0.095271
+v 0.517769 1.055715 0.110504
+v 0.546668 1.006382 0.061170
+v 0.534844 1.029967 0.031909
+v 0.506570 1.078233 0.080176
+v 0.566425 0.941255 -0.030676
+v 0.572362 0.928448 -0.016764
+v 0.570093 0.914946 -0.056984
+v 0.559983 0.953719 -0.044339
+v 0.560339 0.967338 -0.004592
+v 0.566212 0.954805 0.009593
+v 0.576069 0.901863 -0.043348
+v 0.563609 0.927709 -0.070349
+v 0.553966 0.979506 -0.018552
+v 0.566425 0.835795 -0.136135
+v 0.572362 0.821883 -0.123329
+v 0.560339 0.809711 -0.162219
+v 0.559983 0.849458 -0.148599
+v 0.570093 0.862104 -0.109827
+v 0.576069 0.848467 -0.096744
+v 0.566212 0.795526 -0.149686
+v 0.553966 0.823672 -0.174386
+v 0.563609 0.875468 -0.122590
+v 0.527824 0.733929 -0.238002
+v 0.533356 0.718949 -0.226262
+v 0.512398 0.709848 -0.262083
+v 0.521821 0.748751 -0.249307
+v 0.540997 0.758670 -0.213261
+v 0.546667 0.743949 -0.201262
+v 0.517769 0.694615 -0.250596
+v 0.506570 0.724944 -0.273114
+v 0.534844 0.773210 -0.224848
+v 0.453253 0.642598 -0.329332
+v 0.458003 0.626661 -0.318550
+v 0.429538 0.622161 -0.349770
+v 0.448098 0.658459 -0.339599
+v 0.475033 0.664085 -0.307845
+v 0.480012 0.648373 -0.296838
+v 0.434040 0.606009 -0.339202
+v 0.424653 0.638254 -0.359804
+v 0.469630 0.679701 -0.318356
+v 0.347793 0.568027 -0.403904
+v 0.351438 0.551308 -0.393903
+v 0.317406 0.552626 -0.419304
+v 0.343837 0.584736 -0.413322
+v 0.376696 0.584796 -0.387135
+v 0.380644 0.568252 -0.376959
+v 0.320733 0.535746 -0.409466
+v 0.313796 0.569510 -0.428548
+v 0.372411 0.601314 -0.396744
+v 0.218632 0.515297 -0.456633
+v 0.220923 0.498025 -0.447186
+v 0.183643 0.505982 -0.465948
+v 0.216145 0.532605 -0.465452
+v 0.252687 0.526205 -0.445726
+v 0.255336 0.509048 -0.436164
+v 0.185568 0.488613 -0.456598
+v 0.181554 0.523397 -0.474661
+v 0.249813 0.543389 -0.454668
+v 0.074571 0.488002 -0.483928
+v 0.075353 0.470444 -0.474767
+v 0.037365 0.485408 -0.486522
+v 0.073723 0.505621 -0.492437
+v 0.111459 0.492305 -0.479625
+v 0.112627 0.474793 -0.470418
+v 0.037757 0.467823 -0.477388
+v 0.036940 0.503056 -0.495001
+v 0.110191 0.509875 -0.488182
+v -0.074571 0.488002 -0.483928
+v -0.075353 0.470444 -0.474767
+v -0.111459 0.492305 -0.479625
+v -0.073723 0.505621 -0.492437
+v -0.037365 0.485408 -0.486522
+v -0.037757 0.467823 -0.477388
+v -0.112627 0.474793 -0.470418
+v -0.110191 0.509875 -0.488182
+v -0.036940 0.503056 -0.495001
+v -0.218632 0.515297 -0.456633
+v -0.220924 0.498025 -0.447186
+v -0.252688 0.526205 -0.445725
+v -0.216145 0.532605 -0.465452
+v -0.183643 0.505982 -0.465948
+v -0.185568 0.488613 -0.456598
+v -0.255336 0.509047 -0.436164
+v -0.249814 0.543389 -0.454668
+v -0.181554 0.523396 -0.474661
+v -0.347793 0.568027 -0.403903
+v -0.351439 0.551308 -0.393903
+v -0.376696 0.584795 -0.387135
+v -0.343838 0.584736 -0.413322
+v -0.317406 0.552626 -0.419304
+v -0.320733 0.535746 -0.409465
+v -0.380644 0.568252 -0.376959
+v -0.372411 0.601314 -0.396744
+v -0.313796 0.569510 -0.428548
+v -0.453253 0.642598 -0.329332
+v -0.458004 0.626661 -0.318550
+v -0.475033 0.664085 -0.307845
+v -0.448098 0.658459 -0.339599
+v -0.429538 0.622161 -0.349769
+v -0.434040 0.606009 -0.339202
+v -0.480012 0.648373 -0.296838
+v -0.469630 0.679701 -0.318356
+v -0.424653 0.638254 -0.359804
+v -0.527824 0.733929 -0.238001
+v -0.533357 0.718949 -0.226262
+v -0.540997 0.758669 -0.213261
+v -0.521821 0.748751 -0.249307
+v -0.512398 0.709848 -0.262082
+v -0.517769 0.694615 -0.250596
+v -0.546668 0.743949 -0.201262
+v -0.534844 0.773210 -0.224847
+v -0.506570 0.724944 -0.273114
+v -0.566425 0.835795 -0.136135
+v -0.572362 0.821883 -0.123328
+v -0.570093 0.862104 -0.109827
+v -0.559983 0.849458 -0.148599
+v -0.560339 0.809711 -0.162219
+v -0.566212 0.795526 -0.149685
+v -0.576069 0.848467 -0.096744
+v -0.563610 0.875468 -0.122590
+v -0.553966 0.823671 -0.174386
+v -0.566425 0.941255 -0.030676
+v -0.572362 0.928448 -0.016763
+v -0.560339 0.967338 -0.004592
+v -0.559983 0.953719 -0.044339
+v -0.570093 0.914946 -0.056984
+v -0.576069 0.901863 -0.043348
+v -0.566212 0.954805 0.009594
+v -0.553966 0.979505 -0.018552
+v -0.563610 0.927709 -0.070348
+v -0.501965 1.084647 0.014517
+v -0.508616 1.075446 0.027613
+v -0.487295 1.107548 0.037418
+v -0.495948 1.092386 0.003253
+v -0.514493 1.061118 -0.009012
+v -0.521309 1.051606 0.003773
+v -0.493751 1.098651 0.050818
+v -0.481453 1.115013 0.025879
+v -0.508325 1.069139 -0.019994
+v -0.431048 1.171503 0.101373
+v -0.436758 1.163453 0.115620
+v -0.408495 1.190939 0.120809
+v -0.425880 1.178201 0.089068
+v -0.451760 1.151069 0.080939
+v -0.457746 1.142748 0.094915
+v -0.413907 1.183147 0.135314
+v -0.403598 1.197404 0.108271
+v -0.446345 1.158012 0.068878
+v -0.330754 1.242421 0.172291
+v -0.335136 1.235311 0.187478
+v -0.301856 1.257067 0.186938
+v -0.326789 1.248269 0.159135
+v -0.358241 1.226474 0.156344
+v -0.362987 1.219152 0.171319
+v -0.305855 1.250151 0.202318
+v -0.298237 1.262740 0.173606
+v -0.353946 1.232513 0.143379
+v -0.207921 1.292568 0.222438
+v -0.210676 1.286122 0.238289
+v -0.174646 1.301426 0.231296
+v -0.205428 1.297814 0.208681
+v -0.240308 1.282194 0.212064
+v -0.243492 1.275611 0.227778
+v -0.176960 1.295097 0.247265
+v -0.172553 1.306567 0.217433
+v -0.237427 1.287565 0.198432
+v -0.070918 1.318526 0.248396
+v -0.071858 1.312423 0.264590
+v -0.035535 1.320993 0.250862
+v -0.070068 1.323461 0.234327
+v -0.105999 1.314433 0.244303
+v -0.107403 1.308276 0.260443
+v -0.036005 1.314923 0.267090
+v -0.035109 1.325898 0.236765
+v -0.104728 1.319417 0.230284
+v 0.070918 1.318526 0.248396
+v 0.071857 1.312423 0.264590
+v 0.105999 1.314433 0.244303
+v 0.070068 1.323461 0.234327
+v 0.035535 1.320992 0.250862
+v 0.036005 1.314923 0.267090
+v 0.107403 1.308276 0.260443
+v 0.104728 1.319417 0.230284
+v 0.035109 1.325898 0.236765
+v 0.207921 1.292568 0.222438
+v 0.210675 1.286122 0.238289
+v 0.240308 1.282194 0.212064
+v 0.205428 1.297814 0.208681
+v 0.174646 1.301426 0.231296
+v 0.176960 1.295097 0.247265
+v 0.243492 1.275611 0.227778
+v 0.237427 1.287565 0.198432
+v 0.172552 1.306567 0.217433
+v 0.330754 1.242421 0.172291
+v 0.335136 1.235311 0.187478
+v 0.358241 1.226474 0.156344
+v 0.326789 1.248269 0.159135
+v 0.301856 1.257068 0.186938
+v 0.305855 1.250151 0.202318
+v 0.362987 1.219152 0.171319
+v 0.353946 1.232513 0.143379
+v 0.298237 1.262740 0.173606
+v 0.431048 1.171503 0.101373
+v 0.436758 1.163453 0.115620
+v 0.451761 1.151069 0.080939
+v 0.425880 1.178201 0.089068
+v 0.408495 1.190939 0.120809
+v 0.413907 1.183147 0.135314
+v 0.457746 1.142748 0.094915
+v 0.446345 1.158012 0.068878
+v 0.403598 1.197404 0.108271
+v 0.501966 1.084647 0.014517
+v 0.508616 1.075446 0.027613
+v 0.514493 1.061118 -0.009012
+v 0.495948 1.092386 0.003253
+v 0.487295 1.107548 0.037418
+v 0.493751 1.098651 0.050818
+v 0.521309 1.051606 0.003773
+v 0.508325 1.069139 -0.019994
+v 0.481453 1.115013 0.025879
+v 0.538675 0.987771 -0.082359
+v 0.545812 0.977287 -0.070546
+v 0.542164 0.962751 -0.107379
+v 0.532218 0.996672 -0.092462
+v 0.532887 1.012577 -0.057553
+v 0.539947 1.002421 -0.045412
+v 0.549347 0.951936 -0.095897
+v 0.535664 0.971952 -0.117182
+v 0.526499 1.021180 -0.067953
+v 0.538675 0.887478 -0.182652
+v 0.545812 0.875665 -0.172168
+v 0.532887 0.862672 -0.207458
+v 0.532218 0.897581 -0.191553
+v 0.542164 0.912498 -0.157632
+v 0.549347 0.901016 -0.146817
+v 0.539947 0.850531 -0.197302
+v 0.526499 0.873073 -0.216061
+v 0.535664 0.922301 -0.166833
+v 0.501966 0.790602 -0.279528
+v 0.508616 0.777506 -0.270327
+v 0.487295 0.767701 -0.302429
+v 0.495948 0.801867 -0.287267
+v 0.514493 0.814131 -0.255999
+v 0.521309 0.801346 -0.246486
+v 0.493751 0.754301 -0.293532
+v 0.481453 0.779240 -0.309894
+v 0.508325 0.825113 -0.264020
+v 0.431048 0.703746 -0.366384
+v 0.436758 0.689499 -0.358334
+v 0.408495 0.684310 -0.385820
+v 0.425880 0.716051 -0.373082
+v 0.451761 0.724180 -0.345950
+v 0.457746 0.710204 -0.337629
+v 0.413907 0.669805 -0.378028
+v 0.403598 0.696848 -0.392285
+v 0.446345 0.736241 -0.352893
+v 0.330754 0.632828 -0.437302
+v 0.335136 0.617641 -0.430192
+v 0.301856 0.618182 -0.451948
+v 0.326789 0.645984 -0.443150
+v 0.358241 0.648775 -0.421355
+v 0.362987 0.633800 -0.414033
+v 0.305855 0.602801 -0.445032
+v 0.298237 0.631513 -0.457620
+v 0.353946 0.661740 -0.427394
+v 0.207921 0.582681 -0.487449
+v 0.210676 0.566830 -0.481002
+v 0.174646 0.573823 -0.496307
+v 0.205428 0.596438 -0.492695
+v 0.240308 0.593055 -0.477075
+v 0.243492 0.577341 -0.470492
+v 0.176960 0.557855 -0.489978
+v 0.172552 0.587686 -0.501447
+v 0.237427 0.606687 -0.482446
+v 0.070918 0.556723 -0.513406
+v 0.071857 0.540529 -0.507304
+v 0.035535 0.554256 -0.515873
+v 0.070068 0.570792 -0.518342
+v 0.105999 0.560816 -0.509313
+v 0.107403 0.544676 -0.503157
+v 0.036005 0.538029 -0.509804
+v 0.035109 0.568354 -0.520779
+v 0.104728 0.574835 -0.514298
+v -0.070918 0.556723 -0.513406
+v -0.071858 0.540529 -0.507304
+v -0.105999 0.560816 -0.509313
+v -0.070068 0.570792 -0.518342
+v -0.035535 0.554256 -0.515873
+v -0.036006 0.538029 -0.509804
+v -0.107403 0.544676 -0.503157
+v -0.104728 0.574835 -0.514298
+v -0.035109 0.568354 -0.520779
+v -0.207921 0.582681 -0.487449
+v -0.210676 0.566830 -0.481002
+v -0.240308 0.593055 -0.477075
+v -0.205428 0.596438 -0.492695
+v -0.174646 0.573823 -0.496307
+v -0.176960 0.557854 -0.489978
+v -0.243492 0.577341 -0.470492
+v -0.237427 0.606687 -0.482446
+v -0.172553 0.587686 -0.501447
+v -0.330755 0.632828 -0.437302
+v -0.335137 0.617641 -0.430192
+v -0.358241 0.648775 -0.421355
+v -0.326789 0.645984 -0.443150
+v -0.301856 0.618181 -0.451948
+v -0.305855 0.602801 -0.445032
+v -0.362987 0.633800 -0.414033
+v -0.353947 0.661740 -0.427394
+v -0.298237 0.631513 -0.457620
+v -0.431048 0.703746 -0.366384
+v -0.436759 0.689499 -0.358334
+v -0.451761 0.724180 -0.345950
+v -0.425880 0.716051 -0.373082
+v -0.408495 0.684310 -0.385820
+v -0.413907 0.669805 -0.378028
+v -0.457746 0.710204 -0.337629
+v -0.446345 0.736241 -0.352893
+v -0.403598 0.696848 -0.392285
+v -0.501966 0.790602 -0.279527
+v -0.508616 0.777506 -0.270327
+v -0.514493 0.814131 -0.255999
+v -0.495948 0.801867 -0.287267
+v -0.487295 0.767701 -0.302429
+v -0.493751 0.754301 -0.293531
+v -0.521310 0.801346 -0.246486
+v -0.508326 0.825113 -0.264020
+v -0.481454 0.779240 -0.309893
+v -0.538676 0.887478 -0.182652
+v -0.545812 0.875665 -0.172168
+v -0.542164 0.912498 -0.157632
+v -0.532218 0.897581 -0.191552
+v -0.532888 0.862672 -0.207458
+v -0.539948 0.850531 -0.197302
+v -0.549347 0.901016 -0.146816
+v -0.535665 0.922301 -0.166833
+v -0.526499 0.873073 -0.216061
+v -0.538675 0.987771 -0.082359
+v -0.545812 0.977287 -0.070546
+v -0.532887 1.012577 -0.057553
+v -0.532218 0.996672 -0.092462
+v -0.542164 0.962751 -0.107378
+v -0.549347 0.951936 -0.095897
+v -0.539947 1.002421 -0.045411
+v -0.526499 1.021180 -0.067953
+v -0.535665 0.971952 -0.117181
+v -0.461002 1.127546 -0.052378
+v -0.468580 1.121074 -0.041466
+v -0.447529 1.148578 -0.031346
+v -0.451863 1.134869 -0.065054
+v -0.472507 1.105937 -0.073987
+v -0.480275 1.099110 -0.063430
+v -0.454886 1.142452 -0.020088
+v -0.438657 1.155484 -0.044439
+v -0.463141 1.113689 -0.086234
+v -0.395871 1.207314 0.027390
+v -0.402379 1.202153 0.039613
+v -0.375159 1.225164 0.045240
+v -0.388024 1.213056 0.013133
+v -0.414894 1.188548 0.008624
+v -0.421715 1.183078 0.020538
+v -0.381326 1.220297 0.057757
+v -0.367722 1.230552 0.030629
+v -0.406670 1.194661 -0.005262
+v -0.303763 1.272445 0.092521
+v -0.308757 1.268355 0.105815
+v -0.277223 1.285896 0.105972
+v -0.297741 1.276895 0.076972
+v -0.329006 1.257799 0.077875
+v -0.334415 1.253468 0.090928
+v -0.281780 1.282027 0.119487
+v -0.271727 1.290080 0.090157
+v -0.322484 1.262540 0.062617
+v -0.190953 1.318499 0.138575
+v -0.194092 1.315166 0.152626
+v -0.160394 1.326635 0.146711
+v -0.187168 1.322037 0.122114
+v -0.220697 1.308972 0.129048
+v -0.224326 1.305483 0.142943
+v -0.163031 1.323435 0.160895
+v -0.157215 1.330011 0.130088
+v -0.216323 1.312699 0.112776
+v -0.065131 1.342339 0.162415
+v -0.066201 1.339397 0.176857
+v -0.032635 1.344604 0.164680
+v -0.063840 1.345404 0.145481
+v -0.097348 1.338580 0.158656
+v -0.098949 1.335577 0.173037
+v -0.033171 1.341700 0.179160
+v -0.031988 1.347625 0.147701
+v -0.095419 1.341720 0.141796
+v 0.065131 1.342339 0.162415
+v 0.066201 1.339398 0.176857
+v 0.097348 1.338580 0.158656
+v 0.063839 1.345404 0.145481
+v 0.032635 1.344604 0.164680
+v 0.033171 1.341700 0.179160
+v 0.098949 1.335577 0.173037
+v 0.095419 1.341720 0.141796
+v 0.031988 1.347625 0.147701
+v 0.190953 1.318499 0.138575
+v 0.194092 1.315166 0.152626
+v 0.220697 1.308973 0.129048
+v 0.187168 1.322037 0.122114
+v 0.160394 1.326635 0.146711
+v 0.163031 1.323435 0.160895
+v 0.224326 1.305483 0.142943
+v 0.216323 1.312699 0.112776
+v 0.157214 1.330011 0.130088
+v 0.303763 1.272445 0.092521
+v 0.308756 1.268355 0.105815
+v 0.329006 1.257799 0.077875
+v 0.297741 1.276896 0.076972
+v 0.277223 1.285896 0.105972
+v 0.281780 1.282027 0.119487
+v 0.334415 1.253468 0.090928
+v 0.322484 1.262540 0.062617
+v 0.271727 1.290080 0.090157
+v 0.395871 1.207314 0.027390
+v 0.402379 1.202153 0.039613
+v 0.414894 1.188548 0.008624
+v 0.388024 1.213056 0.013133
+v 0.375159 1.225164 0.045240
+v 0.381326 1.220297 0.057757
+v 0.421715 1.183078 0.020538
+v 0.406670 1.194661 -0.005262
+v 0.367722 1.230552 0.030629
+v 0.461002 1.127546 -0.052378
+v 0.468581 1.121074 -0.041466
+v 0.472507 1.105937 -0.073987
+v 0.451863 1.134869 -0.065054
+v 0.447529 1.148578 -0.031346
+v 0.454886 1.142452 -0.020088
+v 0.480275 1.099110 -0.063430
+v 0.463141 1.113689 -0.086235
+v 0.438657 1.155484 -0.044439
+v 0.494716 1.038576 -0.141348
+v 0.502849 1.030641 -0.131899
+v 0.497920 1.015598 -0.164326
+v 0.484909 1.047663 -0.152261
+v 0.489400 1.061357 -0.118567
+v 0.497446 1.053797 -0.108743
+v 0.506106 1.007285 -0.155255
+v 0.488050 1.025140 -0.174783
+v 0.479699 1.069992 -0.129931
+v 0.494716 0.946467 -0.233457
+v 0.502849 0.937018 -0.225522
+v 0.489400 0.923686 -0.256238
+v 0.484909 0.957380 -0.242543
+v 0.497920 0.969445 -0.210479
+v 0.506106 0.960374 -0.202166
+v 0.497446 0.913862 -0.248678
+v 0.479699 0.935050 -0.264873
+v 0.488050 0.979902 -0.220021
+v 0.461002 0.857497 -0.322427
+v 0.468581 0.846586 -0.315955
+v 0.447529 0.836465 -0.343459
+v 0.451863 0.870173 -0.329750
+v 0.472507 0.879106 -0.300818
+v 0.480275 0.868549 -0.293991
+v 0.454886 0.825207 -0.337333
+v 0.438657 0.849558 -0.350365
+v 0.463141 0.891354 -0.308569
+v 0.395871 0.777729 -0.402195
+v 0.402379 0.765506 -0.397034
+v 0.375159 0.759879 -0.420045
+v 0.388024 0.791986 -0.407937
+v 0.414894 0.796496 -0.383428
+v 0.421715 0.784581 -0.377959
+v 0.381326 0.747362 -0.415178
+v 0.367722 0.774490 -0.425433
+v 0.406670 0.810381 -0.389542
+v 0.303763 0.712598 -0.467326
+v 0.308756 0.699304 -0.463236
+v 0.277223 0.699147 -0.480777
+v 0.297741 0.728147 -0.471776
+v 0.329006 0.727244 -0.452680
+v 0.334415 0.714191 -0.448349
+v 0.281780 0.685632 -0.476908
+v 0.271727 0.714962 -0.484961
+v 0.322484 0.742502 -0.457421
+v 0.190953 0.666544 -0.513380
+v 0.194092 0.652493 -0.510047
+v 0.160394 0.658408 -0.521516
+v 0.187168 0.683005 -0.516918
+v 0.220697 0.676071 -0.503853
+v 0.224326 0.662177 -0.500363
+v 0.163031 0.644224 -0.518316
+v 0.157214 0.675031 -0.524892
+v 0.216323 0.692343 -0.507580
+v 0.065131 0.642704 -0.537219
+v 0.066201 0.628262 -0.534278
+v 0.032635 0.640439 -0.539485
+v 0.063839 0.659639 -0.540285
+v 0.097348 0.646463 -0.533461
+v 0.098949 0.632082 -0.530458
+v 0.033171 0.625959 -0.536581
+v 0.031988 0.657418 -0.542505
+v 0.095419 0.663323 -0.536600
+v -0.065131 0.642704 -0.537219
+v -0.066201 0.628262 -0.534278
+v -0.097349 0.646463 -0.533461
+v -0.063840 0.659638 -0.540285
+v -0.032635 0.640439 -0.539485
+v -0.033171 0.625959 -0.536581
+v -0.098949 0.632082 -0.530458
+v -0.095419 0.663323 -0.536600
+v -0.031988 0.657418 -0.542505
+v -0.190953 0.666544 -0.513380
+v -0.194093 0.652493 -0.510047
+v -0.220698 0.676071 -0.503853
+v -0.187168 0.683005 -0.516918
+v -0.160394 0.658408 -0.521516
+v -0.163031 0.644224 -0.518316
+v -0.224326 0.662176 -0.500363
+v -0.216323 0.692343 -0.507580
+v -0.157215 0.675031 -0.524892
+v -0.303763 0.712598 -0.467326
+v -0.308757 0.699304 -0.463235
+v -0.329007 0.727244 -0.452680
+v -0.297741 0.728147 -0.471776
+v -0.277223 0.699147 -0.480777
+v -0.281780 0.685632 -0.476908
+v -0.334415 0.714191 -0.448349
+v -0.322485 0.742502 -0.457421
+v -0.271727 0.714962 -0.484961
+v -0.395872 0.777729 -0.402195
+v -0.402379 0.765506 -0.397034
+v -0.414894 0.796496 -0.383428
+v -0.388024 0.791986 -0.407937
+v -0.375159 0.759879 -0.420045
+v -0.381327 0.747362 -0.415177
+v -0.421715 0.784581 -0.377959
+v -0.406670 0.810381 -0.389542
+v -0.367722 0.774490 -0.425433
+v -0.461002 0.857497 -0.322427
+v -0.468581 0.846585 -0.315954
+v -0.472508 0.879106 -0.300818
+v -0.451864 0.870173 -0.329750
+v -0.447529 0.836465 -0.343459
+v -0.454886 0.825207 -0.337332
+v -0.480275 0.868549 -0.293990
+v -0.463141 0.891354 -0.308569
+v -0.438658 0.849558 -0.350365
+v -0.494716 0.946467 -0.233457
+v -0.502849 0.937018 -0.225522
+v -0.497920 0.969445 -0.210479
+v -0.484909 0.957380 -0.242543
+v -0.489401 0.923686 -0.256238
+v -0.497446 0.913862 -0.248678
+v -0.506106 0.960374 -0.202166
+v -0.488050 0.979902 -0.220021
+v -0.479699 0.935050 -0.264873
+v -0.494716 1.038576 -0.141348
+v -0.502849 1.030641 -0.131899
+v -0.489400 1.061357 -0.118567
+v -0.484909 1.047662 -0.152260
+v -0.497920 1.015598 -0.164326
+v -0.506106 1.007285 -0.155255
+v -0.497446 1.053797 -0.108743
+v -0.479699 1.069992 -0.129931
+v -0.488050 1.025140 -0.174783
+v -0.418983 1.157083 -0.106529
+v -0.430606 1.149933 -0.092571
+v -0.406738 1.176198 -0.087414
+v -0.406794 1.163899 -0.120486
+v -0.429440 1.137444 -0.126168
+v -0.441352 1.129750 -0.112755
+v -0.418021 1.169579 -0.072926
+v -0.394905 1.182459 -0.101926
+v -0.416946 1.144832 -0.139553
+v -0.359789 1.229581 -0.034031
+v -0.369769 1.224442 -0.018062
+v -0.340964 1.245804 -0.017808
+v -0.349322 1.234288 -0.050097
+v -0.377078 1.212525 -0.051088
+v -0.387538 1.206913 -0.035592
+v -0.350423 1.241115 -0.001389
+v -0.331045 1.250039 -0.034346
+v -0.366108 1.217728 -0.066657
+v -0.276076 1.288775 0.025163
+v -0.283734 1.285278 0.042774
+v -0.251955 1.301000 0.037388
+v -0.268044 1.291760 0.007375
+v -0.299018 1.275464 0.011852
+v -0.307313 1.271598 0.029094
+v -0.258944 1.297843 0.055338
+v -0.244625 1.303629 0.019244
+v -0.290319 1.278836 -0.005549
+v -0.173548 1.330631 0.067019
+v -0.178363 1.328296 0.085791
+v -0.145775 1.338025 0.074413
+v -0.168500 1.332399 0.048014
+v -0.200582 1.321973 0.058361
+v -0.206146 1.319397 0.076893
+v -0.149818 1.335895 0.093391
+v -0.141534 1.339578 0.055193
+v -0.194746 1.323992 0.039607
+v -0.059194 1.352298 0.088686
+v -0.060836 1.350564 0.108059
+v -0.029660 1.354357 0.090745
+v -0.057472 1.353435 0.069050
+v -0.088475 1.348882 0.085270
+v -0.090930 1.347053 0.104548
+v -0.030483 1.352680 0.110175
+v -0.028797 1.355434 0.071049
+v -0.085902 1.350119 0.065733
+v 0.059194 1.352298 0.088686
+v 0.060836 1.350564 0.108059
+v 0.088475 1.348882 0.085270
+v 0.057472 1.353435 0.069050
+v 0.029660 1.354357 0.090745
+v 0.030483 1.352680 0.110175
+v 0.090930 1.347053 0.104548
+v 0.085901 1.350119 0.065733
+v 0.028797 1.355434 0.071049
+v 0.173548 1.330632 0.067019
+v 0.178363 1.328296 0.085791
+v 0.200582 1.321973 0.058361
+v 0.168500 1.332399 0.048014
+v 0.145775 1.338026 0.074413
+v 0.149818 1.335895 0.093391
+v 0.206146 1.319397 0.076893
+v 0.194746 1.323992 0.039607
+v 0.141534 1.339578 0.055193
+v 0.276076 1.288775 0.025163
+v 0.283734 1.285279 0.042774
+v 0.299018 1.275464 0.011852
+v 0.268044 1.291760 0.007375
+v 0.251955 1.301000 0.037388
+v 0.258944 1.297843 0.055338
+v 0.307313 1.271598 0.029094
+v 0.290319 1.278836 -0.005549
+v 0.244625 1.303630 0.019244
+v 0.359789 1.229581 -0.034031
+v 0.369769 1.224442 -0.018062
+v 0.377078 1.212525 -0.051088
+v 0.349322 1.234288 -0.050097
+v 0.340964 1.245804 -0.017809
+v 0.350423 1.241115 -0.001389
+v 0.387538 1.206913 -0.035592
+v 0.366108 1.217728 -0.066657
+v 0.331045 1.250039 -0.034346
+v 0.418983 1.157083 -0.106529
+v 0.430606 1.149933 -0.092571
+v 0.429440 1.137444 -0.126168
+v 0.406794 1.163899 -0.120486
+v 0.406738 1.176198 -0.087414
+v 0.418021 1.169579 -0.072926
+v 0.441352 1.129750 -0.112755
+v 0.416946 1.144832 -0.139553
+v 0.394905 1.182459 -0.101926
+v 0.449624 1.076222 -0.187390
+v 0.462097 1.066830 -0.175675
+v 0.452536 1.055339 -0.208274
+v 0.436544 1.085391 -0.198994
+v 0.444793 1.096927 -0.166685
+v 0.457132 1.088109 -0.154396
+v 0.465090 1.045367 -0.197138
+v 0.439371 1.065115 -0.219270
+v 0.431853 1.105494 -0.178891
+v 0.449624 0.992509 -0.271103
+v 0.462097 0.980794 -0.261710
+v 0.444793 0.971804 -0.291808
+v 0.436544 1.004113 -0.280272
+v 0.452536 1.013393 -0.250219
+v 0.465090 1.002257 -0.240247
+v 0.457132 0.959515 -0.282990
+v 0.431853 0.984010 -0.300374
+v 0.439371 1.024389 -0.259996
+v 0.418983 0.911648 -0.351964
+v 0.430606 0.897690 -0.344814
+v 0.406738 0.892533 -0.371079
+v 0.406794 0.925605 -0.358780
+v 0.429440 0.931287 -0.332325
+v 0.441352 0.917874 -0.324630
+v 0.418021 0.878045 -0.364460
+v 0.394905 0.907046 -0.377339
+v 0.416946 0.944673 -0.339712
+v 0.359789 0.839151 -0.424462
+v 0.369769 0.823182 -0.419323
+v 0.340964 0.822928 -0.440684
+v 0.349322 0.855216 -0.429169
+v 0.377078 0.856207 -0.407405
+v 0.387538 0.840711 -0.401794
+v 0.350423 0.806509 -0.435996
+v 0.331045 0.839465 -0.444920
+v 0.366108 0.871776 -0.412609
+v 0.276076 0.779956 -0.483656
+v 0.283734 0.762345 -0.480159
+v 0.251955 0.767731 -0.495881
+v 0.268044 0.797744 -0.486641
+v 0.299018 0.793267 -0.470345
+v 0.307313 0.776026 -0.466479
+v 0.258944 0.749781 -0.492723
+v 0.244625 0.785875 -0.498510
+v 0.290319 0.810668 -0.473717
+v 0.173548 0.738100 -0.525512
+v 0.178363 0.719328 -0.523177
+v 0.145775 0.730706 -0.532906
+v 0.168500 0.757105 -0.527280
+v 0.200582 0.746758 -0.516854
+v 0.206146 0.728226 -0.514278
+v 0.149818 0.711729 -0.530776
+v 0.141534 0.749926 -0.534459
+v 0.194746 0.765512 -0.518873
+v 0.059194 0.716433 -0.547179
+v 0.060836 0.697060 -0.545444
+v 0.029660 0.714374 -0.549238
+v 0.057472 0.736069 -0.548316
+v 0.088475 0.719849 -0.543763
+v 0.090930 0.700571 -0.541933
+v 0.030483 0.694944 -0.547561
+v 0.028797 0.734070 -0.550315
+v 0.085901 0.739386 -0.544999
+v -0.059194 0.716433 -0.547179
+v -0.060836 0.697060 -0.545444
+v -0.088475 0.719849 -0.543763
+v -0.057472 0.736069 -0.548316
+v -0.029660 0.714374 -0.549238
+v -0.030483 0.694944 -0.547561
+v -0.090930 0.700571 -0.541933
+v -0.085902 0.739386 -0.544999
+v -0.028797 0.734070 -0.550315
+v -0.173549 0.738100 -0.525512
+v -0.178363 0.719328 -0.523177
+v -0.200582 0.746758 -0.516854
+v -0.168500 0.757105 -0.527280
+v -0.145775 0.730706 -0.532906
+v -0.149818 0.711728 -0.530776
+v -0.206146 0.728226 -0.514278
+v -0.194746 0.765512 -0.518873
+v -0.141534 0.749926 -0.534459
+v -0.276076 0.779956 -0.483656
+v -0.283734 0.762345 -0.480159
+v -0.299019 0.793267 -0.470345
+v -0.268044 0.797744 -0.486641
+v -0.251955 0.767731 -0.495881
+v -0.258944 0.749781 -0.492723
+v -0.307313 0.776026 -0.466479
+v -0.290320 0.810668 -0.473717
+v -0.244625 0.785875 -0.498510
+v -0.359789 0.839151 -0.424461
+v -0.369770 0.823182 -0.419323
+v -0.377078 0.856207 -0.407405
+v -0.349322 0.855216 -0.429169
+v -0.340965 0.822928 -0.440684
+v -0.350423 0.806509 -0.435996
+v -0.387538 0.840711 -0.401794
+v -0.366108 0.871776 -0.412609
+v -0.331045 0.839465 -0.444920
+v -0.418983 0.911648 -0.351964
+v -0.430606 0.897690 -0.344814
+v -0.429440 0.931287 -0.332325
+v -0.406794 0.925605 -0.358780
+v -0.406738 0.892533 -0.371079
+v -0.418021 0.878045 -0.364460
+v -0.441353 0.917874 -0.324630
+v -0.416947 0.944673 -0.339712
+v -0.394905 0.907046 -0.377339
+v -0.449624 0.992509 -0.271103
+v -0.462097 0.980794 -0.261710
+v -0.452536 1.013393 -0.250219
+v -0.436544 1.004113 -0.280272
+v -0.444793 0.971804 -0.291808
+v -0.457132 0.959515 -0.282990
+v -0.465090 1.002257 -0.240247
+v -0.439371 1.024389 -0.259996
+v -0.431853 0.984011 -0.300374
+v -0.449624 1.076222 -0.187390
+v -0.462097 1.066830 -0.175675
+v -0.444793 1.096927 -0.166685
+v -0.436544 1.085391 -0.198994
+v -0.452536 1.055339 -0.208273
+v -0.465090 1.045367 -0.197138
+v -0.457132 1.088109 -0.154396
+v -0.431853 1.105494 -0.178891
+v -0.439371 1.065115 -0.219270
+v -0.368302 1.181439 -0.160574
+v -0.381004 1.176297 -0.147991
+v -0.357538 1.198242 -0.143771
+v -0.356830 1.185370 -0.171225
+v -0.377494 1.164176 -0.177837
+v -0.390513 1.158438 -0.165850
+v -0.369869 1.193680 -0.130608
+v -0.346401 1.201649 -0.154945
+v -0.365735 1.168644 -0.187950
+v -0.316268 1.245168 -0.096846
+v -0.327176 1.242223 -0.082065
+v -0.299720 1.259428 -0.082585
+v -0.306417 1.247113 -0.109481
+v -0.331465 1.230175 -0.111839
+v -0.342897 1.226713 -0.097575
+v -0.310058 1.256976 -0.067312
+v -0.290385 1.260929 -0.095665
+v -0.321141 1.232587 -0.124008
+v -0.242681 1.297202 -0.044812
+v -0.251051 1.296052 -0.028236
+v -0.221478 1.307948 -0.034066
+v -0.235122 1.297526 -0.059068
+v -0.262848 1.285501 -0.056513
+v -0.271914 1.283947 -0.040341
+v -0.229116 1.307169 -0.017119
+v -0.214579 1.307938 -0.048657
+v -0.254661 1.286190 -0.070405
+v -0.152556 1.333995 -0.008018
+v -0.157817 1.334114 0.009826
+v -0.128141 1.340495 -0.001519
+v -0.147804 1.333173 -0.023421
+v -0.176319 1.326384 -0.015630
+v -0.182400 1.326241 0.001953
+v -0.132561 1.340838 0.016550
+v -0.124150 1.339471 -0.017124
+v -0.170827 1.325799 -0.030795
+v -0.052034 1.353041 0.011027
+v -0.053829 1.353817 0.029529
+v -0.026073 1.354851 0.012837
+v -0.050413 1.351626 -0.004969
+v -0.077773 1.350038 0.008024
+v -0.080456 1.350710 0.026422
+v -0.026972 1.355689 0.031401
+v -0.025260 1.353380 -0.003215
+v -0.075351 1.348717 -0.007878
+v 0.052034 1.353041 0.011027
+v 0.053828 1.353817 0.029529
+v 0.077773 1.350038 0.008024
+v 0.050413 1.351626 -0.004969
+v 0.026072 1.354851 0.012837
+v 0.026972 1.355689 0.031401
+v 0.080455 1.350710 0.026422
+v 0.075351 1.348716 -0.007878
+v 0.025260 1.353379 -0.003215
+v 0.152556 1.333995 -0.008018
+v 0.157817 1.334114 0.009826
+v 0.176319 1.326384 -0.015630
+v 0.147804 1.333173 -0.023421
+v 0.128141 1.340495 -0.001519
+v 0.132561 1.340838 0.016550
+v 0.182400 1.326240 0.001953
+v 0.170827 1.325799 -0.030795
+v 0.124150 1.339471 -0.017124
+v 0.242681 1.297202 -0.044812
+v 0.251051 1.296052 -0.028236
+v 0.262848 1.285501 -0.056513
+v 0.235122 1.297526 -0.059068
+v 0.221478 1.307948 -0.034066
+v 0.229116 1.307169 -0.017119
+v 0.271914 1.283947 -0.040341
+v 0.254661 1.286190 -0.070405
+v 0.214579 1.307938 -0.048657
+v 0.316268 1.245168 -0.096846
+v 0.327176 1.242223 -0.082065
+v 0.331465 1.230175 -0.111839
+v 0.306416 1.247113 -0.109481
+v 0.299720 1.259428 -0.082585
+v 0.310057 1.256976 -0.067312
+v 0.342897 1.226713 -0.097575
+v 0.321141 1.232587 -0.124008
+v 0.290384 1.260929 -0.095665
+v 0.368302 1.181440 -0.160574
+v 0.381004 1.176297 -0.147991
+v 0.377494 1.164176 -0.177837
+v 0.356830 1.185370 -0.171225
+v 0.357538 1.198243 -0.143771
+v 0.369869 1.193680 -0.130608
+v 0.390513 1.158438 -0.165850
+v 0.365735 1.168644 -0.187950
+v 0.346401 1.201650 -0.154945
+v 0.395236 1.110360 -0.231654
+v 0.408868 1.102766 -0.221522
+v 0.397796 1.092002 -0.250011
+v 0.382925 1.116504 -0.240090
+v 0.390990 1.128560 -0.213453
+v 0.404475 1.121594 -0.202694
+v 0.411516 1.083775 -0.240512
+v 0.385405 1.098719 -0.257876
+v 0.378811 1.134138 -0.222457
+v 0.395236 1.036773 -0.305241
+v 0.408868 1.026641 -0.297647
+v 0.390990 1.018572 -0.323441
+v 0.382925 1.045209 -0.311385
+v 0.397796 1.055130 -0.286883
+v 0.411516 1.045632 -0.278656
+v 0.404475 1.007813 -0.316475
+v 0.378811 1.027576 -0.329019
+v 0.385405 1.062995 -0.293599
+v 0.368302 0.965693 -0.376320
+v 0.381004 0.953110 -0.371178
+v 0.357538 0.948890 -0.393123
+v 0.356830 0.976344 -0.380251
+v 0.377494 0.982957 -0.359057
+v 0.390513 0.970969 -0.353319
+v 0.369869 0.935727 -0.388560
+v 0.346401 0.960064 -0.396530
+v 0.365735 0.993070 -0.363525
+v 0.316268 0.901965 -0.440048
+v 0.327176 0.887184 -0.437104
+v 0.299720 0.887704 -0.454309
+v 0.306416 0.914601 -0.441994
+v 0.331465 0.916958 -0.425055
+v 0.342897 0.902694 -0.421594
+v 0.310058 0.872431 -0.451856
+v 0.290384 0.900784 -0.455810
+v 0.321141 0.929127 -0.427468
+v 0.242681 0.849931 -0.492082
+v 0.251051 0.833355 -0.490932
+v 0.221478 0.839185 -0.502828
+v 0.235122 0.864188 -0.492407
+v 0.262848 0.861632 -0.480381
+v 0.271914 0.845460 -0.478828
+v 0.229116 0.822238 -0.502049
+v 0.214579 0.853776 -0.502818
+v 0.254661 0.875524 -0.481070
+v 0.152556 0.813138 -0.528876
+v 0.157817 0.795293 -0.528995
+v 0.128141 0.806638 -0.535375
+v 0.147804 0.828540 -0.528054
+v 0.176319 0.820749 -0.521264
+v 0.182400 0.803167 -0.521121
+v 0.132561 0.788569 -0.535719
+v 0.124150 0.822243 -0.534351
+v 0.170827 0.835914 -0.520680
+v 0.052034 0.794092 -0.547921
+v 0.053828 0.775590 -0.548698
+v 0.026072 0.792282 -0.549731
+v 0.050413 0.810088 -0.546507
+v 0.077773 0.797095 -0.544919
+v 0.080455 0.778697 -0.545591
+v 0.026972 0.773718 -0.550570
+v 0.025260 0.808334 -0.548260
+v 0.075351 0.812997 -0.543597
+v -0.052034 0.794092 -0.547921
+v -0.053829 0.775590 -0.548698
+v -0.077773 0.797095 -0.544919
+v -0.050413 0.810088 -0.546507
+v -0.026073 0.792282 -0.549731
+v -0.026972 0.773718 -0.550570
+v -0.080456 0.778697 -0.545591
+v -0.075351 0.812997 -0.543597
+v -0.025260 0.808334 -0.548260
+v -0.152556 0.813137 -0.528876
+v -0.157817 0.795293 -0.528995
+v -0.176319 0.820749 -0.521265
+v -0.147804 0.828540 -0.528054
+v -0.128141 0.806638 -0.535375
+v -0.132561 0.788569 -0.535719
+v -0.182400 0.803167 -0.521121
+v -0.170827 0.835914 -0.520680
+v -0.124150 0.822243 -0.534351
+v -0.242681 0.849931 -0.492082
+v -0.251051 0.833355 -0.490932
+v -0.262849 0.861632 -0.480381
+v -0.235122 0.864188 -0.492407
+v -0.221478 0.839185 -0.502828
+v -0.229116 0.822238 -0.502049
+v -0.271914 0.845460 -0.478828
+v -0.254661 0.875524 -0.481070
+v -0.214579 0.853776 -0.502818
+v -0.316268 0.901965 -0.440048
+v -0.327176 0.887184 -0.437104
+v -0.331466 0.916958 -0.425055
+v -0.306417 0.914601 -0.441994
+v -0.299721 0.887704 -0.454309
+v -0.310058 0.872431 -0.451856
+v -0.342898 0.902694 -0.421594
+v -0.321141 0.929127 -0.427468
+v -0.290385 0.900784 -0.455810
+v -0.368302 0.965693 -0.376320
+v -0.381004 0.953110 -0.371178
+v -0.377494 0.982957 -0.359057
+v -0.356830 0.976344 -0.380251
+v -0.357538 0.948890 -0.393123
+v -0.369869 0.935727 -0.388560
+v -0.390513 0.970969 -0.353319
+v -0.365735 0.993070 -0.363525
+v -0.346401 0.960064 -0.396530
+v -0.395237 1.036773 -0.305241
+v -0.408868 1.026641 -0.297647
+v -0.397796 1.055130 -0.286883
+v -0.382926 1.045209 -0.311385
+v -0.390990 1.018572 -0.323441
+v -0.404475 1.007813 -0.316475
+v -0.411516 1.045632 -0.278656
+v -0.385405 1.062995 -0.293599
+v -0.378811 1.027576 -0.329018
+v -0.395237 1.110360 -0.231653
+v -0.408868 1.102766 -0.221522
+v -0.390990 1.128560 -0.213453
+v -0.382925 1.116504 -0.240090
+v -0.397796 1.092002 -0.250011
+v -0.411516 1.083775 -0.240512
+v -0.404475 1.121594 -0.202694
+v -0.378811 1.134138 -0.222457
+v -0.385405 1.098719 -0.257876
+v 0.008961 0.319484 0.488383
+v 0.007983 0.318614 0.487614
+v 0.012402 0.319757 0.488349
+v 0.011935 0.320987 0.489579
+v 0.010631 0.321197 0.489883
+v 0.006642 0.318582 0.487687
+v 0.011519 0.318863 0.487549
+v 0.015132 0.321148 0.489461
+v -0.335670 1.186047 -0.184297
+v -0.340881 1.188073 -0.183270
+v -0.325860 1.201362 -0.168983
+v -0.330218 1.181214 -0.182658
+v -0.344047 1.170313 -0.200031
+v -0.349389 1.172094 -0.199248
+v -0.330919 1.203625 -0.167718
+v -0.320567 1.196280 -0.167592
+v -0.338459 1.165736 -0.198136
+v -0.288246 1.244129 -0.126215
+v -0.292722 1.247056 -0.124286
+v -0.273165 1.257126 -0.113218
+v -0.283565 1.238353 -0.125519
+v -0.302097 1.230464 -0.139880
+v -0.306788 1.233180 -0.138163
+v -0.277406 1.260255 -0.111087
+v -0.268728 1.251139 -0.112733
+v -0.297191 1.224910 -0.138962
+v -0.221179 1.291553 -0.078792
+v -0.224613 1.295216 -0.076126
+v -0.201854 1.301347 -0.068998
+v -0.217587 1.285006 -0.078866
+v -0.239560 1.280888 -0.089456
+v -0.243279 1.284386 -0.086956
+v -0.204988 1.305162 -0.066180
+v -0.198576 1.294641 -0.069231
+v -0.235669 1.274515 -0.089357
+v -0.139039 1.325086 -0.045258
+v -0.141198 1.329270 -0.042072
+v -0.116788 1.331010 -0.039334
+v -0.136781 1.317995 -0.045877
+v -0.160697 1.318149 -0.052195
+v -0.163192 1.322226 -0.049117
+v -0.118601 1.335286 -0.036056
+v -0.114891 1.323822 -0.040049
+v -0.158087 1.311171 -0.052701
+v -0.047424 1.342445 -0.027900
+v -0.048160 1.346898 -0.024444
+v -0.023762 1.344094 -0.026250
+v -0.046653 1.335071 -0.028801
+v -0.070882 1.339708 -0.030637
+v -0.071983 1.344119 -0.027224
+v -0.024131 1.348573 -0.022769
+v -0.023377 1.336694 -0.027178
+v -0.069731 1.332379 -0.031493
+v 0.047424 1.342445 -0.027900
+v 0.048160 1.346898 -0.024444
+v 0.070882 1.339708 -0.030637
+v 0.046653 1.335071 -0.028801
+v 0.023762 1.344094 -0.026250
+v 0.024131 1.348573 -0.022769
+v 0.071983 1.344119 -0.027224
+v 0.069731 1.332379 -0.031493
+v 0.023376 1.336694 -0.027178
+v 0.139039 1.325086 -0.045258
+v 0.141198 1.329270 -0.042072
+v 0.160697 1.318149 -0.052195
+v 0.136781 1.317995 -0.045877
+v 0.116788 1.331010 -0.039334
+v 0.118601 1.335286 -0.036056
+v 0.163192 1.322226 -0.049117
+v 0.158087 1.311171 -0.052701
+v 0.114891 1.323822 -0.040049
+v 0.221179 1.291553 -0.078792
+v 0.224613 1.295216 -0.076126
+v 0.239560 1.280888 -0.089456
+v 0.217587 1.285006 -0.078866
+v 0.201854 1.301347 -0.068997
+v 0.204988 1.305162 -0.066180
+v 0.243279 1.284386 -0.086956
+v 0.235669 1.274515 -0.089357
+v 0.198576 1.294641 -0.069231
+v 0.288246 1.244129 -0.126215
+v 0.292721 1.247056 -0.124286
+v 0.302097 1.230464 -0.139880
+v 0.283565 1.238353 -0.125519
+v 0.273165 1.257126 -0.113218
+v 0.277406 1.260255 -0.111087
+v 0.306788 1.233180 -0.138163
+v 0.297191 1.224910 -0.138962
+v 0.268728 1.251139 -0.112733
+v 0.335670 1.186047 -0.184297
+v 0.340881 1.188073 -0.183270
+v 0.344047 1.170313 -0.200031
+v 0.330218 1.181214 -0.182658
+v 0.325860 1.201362 -0.168983
+v 0.330919 1.203625 -0.167718
+v 0.349389 1.172094 -0.199248
+v 0.338459 1.165736 -0.198136
+v 0.320567 1.196280 -0.167592
+v 0.360218 1.121265 -0.249079
+v 0.365811 1.122285 -0.249057
+v 0.362551 1.104534 -0.265810
+v 0.354368 1.117484 -0.246387
+v 0.356348 1.137853 -0.232491
+v 0.361880 1.139130 -0.232212
+v 0.368180 1.105294 -0.266048
+v 0.356663 1.101025 -0.262847
+v 0.350560 1.133803 -0.230069
+v 0.360218 1.054198 -0.316146
+v 0.365811 1.054177 -0.317166
+v 0.356348 1.037610 -0.332734
+v 0.354367 1.051507 -0.312365
+v 0.362551 1.070929 -0.299415
+v 0.368180 1.071167 -0.300175
+v 0.361880 1.037331 -0.334011
+v 0.350560 1.035188 -0.328684
+v 0.356663 1.067966 -0.295906
+v 0.335670 0.989416 -0.380928
+v 0.340881 0.988389 -0.382953
+v 0.325860 0.974102 -0.396242
+v 0.330218 0.987777 -0.376095
+v 0.344047 1.005150 -0.365194
+v 0.349389 1.004367 -0.366975
+v 0.330919 0.972837 -0.398506
+v 0.320567 0.972711 -0.391160
+v 0.338459 1.003255 -0.360617
+v 0.288246 0.931334 -0.439010
+v 0.292721 0.929405 -0.441937
+v 0.273165 0.918337 -0.452007
+v 0.283565 0.930638 -0.433233
+v 0.302097 0.944999 -0.425345
+v 0.306788 0.943282 -0.428060
+v 0.277406 0.916207 -0.455136
+v 0.268728 0.917852 -0.446019
+v 0.297191 0.944081 -0.419791
+v 0.221179 0.883911 -0.486434
+v 0.224613 0.881245 -0.490097
+v 0.201854 0.874117 -0.496228
+v 0.217587 0.883985 -0.479887
+v 0.239560 0.894575 -0.475769
+v 0.243279 0.892075 -0.479267
+v 0.204988 0.871299 -0.500043
+v 0.198576 0.874350 -0.489522
+v 0.235669 0.894476 -0.469396
+v 0.139039 0.850377 -0.519967
+v 0.141198 0.847191 -0.524151
+v 0.116788 0.844454 -0.525891
+v 0.136781 0.850996 -0.512876
+v 0.160697 0.857314 -0.513030
+v 0.163192 0.854236 -0.517107
+v 0.118601 0.841176 -0.530167
+v 0.114891 0.845169 -0.518703
+v 0.158087 0.857820 -0.506051
+v 0.047424 0.833019 -0.537325
+v 0.048160 0.829563 -0.541779
+v 0.023762 0.831369 -0.538975
+v 0.046653 0.833920 -0.529952
+v 0.070882 0.835756 -0.534588
+v 0.071983 0.832343 -0.539000
+v 0.024131 0.827888 -0.543454
+v 0.023376 0.832297 -0.531575
+v 0.069731 0.836612 -0.527260
+v -0.047424 0.833019 -0.537325
+v -0.048160 0.829563 -0.541779
+v -0.070883 0.835756 -0.534588
+v -0.046653 0.833920 -0.529952
+v -0.023763 0.831369 -0.538975
+v -0.024131 0.827888 -0.543454
+v -0.071983 0.832343 -0.538999
+v -0.069731 0.836612 -0.527260
+v -0.023377 0.832297 -0.531575
+v -0.139039 0.850377 -0.519967
+v -0.141198 0.847191 -0.524151
+v -0.160697 0.857314 -0.513030
+v -0.136781 0.850996 -0.512876
+v -0.116788 0.844453 -0.525891
+v -0.118601 0.841175 -0.530167
+v -0.163192 0.854236 -0.517107
+v -0.158087 0.857820 -0.506051
+v -0.114891 0.845169 -0.518703
+v -0.221179 0.883911 -0.486434
+v -0.224613 0.881245 -0.490097
+v -0.239560 0.894575 -0.475769
+v -0.217587 0.883985 -0.479887
+v -0.201855 0.874116 -0.496228
+v -0.204988 0.871299 -0.500043
+v -0.243279 0.892075 -0.479267
+v -0.235669 0.894476 -0.469396
+v -0.198576 0.874350 -0.489522
+v -0.288247 0.931334 -0.439010
+v -0.292722 0.929405 -0.441937
+v -0.302098 0.944999 -0.425345
+v -0.283565 0.930638 -0.433233
+v -0.273165 0.918337 -0.452007
+v -0.277406 0.916206 -0.455136
+v -0.306788 0.943282 -0.428060
+v -0.297191 0.944081 -0.419791
+v -0.268728 0.917852 -0.446019
+v -0.335670 0.989416 -0.380928
+v -0.340882 0.988389 -0.382953
+v -0.344048 1.005150 -0.365194
+v -0.330218 0.987777 -0.376095
+v -0.325860 0.974102 -0.396242
+v -0.330919 0.972837 -0.398505
+v -0.349389 1.004367 -0.366975
+v -0.338460 1.003255 -0.360616
+v -0.320567 0.972711 -0.391160
+v -0.360218 1.054198 -0.316146
+v -0.365811 1.054177 -0.317166
+v -0.362551 1.070929 -0.299415
+v -0.354368 1.051507 -0.312365
+v -0.356348 1.037610 -0.332734
+v -0.361880 1.037331 -0.334011
+v -0.368180 1.071167 -0.300175
+v -0.356663 1.067966 -0.295906
+v -0.350560 1.035188 -0.328684
+v -0.360218 1.121265 -0.249079
+v -0.365811 1.122285 -0.249057
+v -0.356348 1.137853 -0.232491
+v -0.354368 1.117484 -0.246387
+v -0.362551 1.104534 -0.265810
+v -0.368180 1.105294 -0.266048
+v -0.361880 1.139130 -0.232212
+v -0.350560 1.133803 -0.230069
+v -0.356663 1.101025 -0.262847
+v -0.197809 0.877857 -0.437355
+v -0.205810 0.880314 -0.454510
+v -0.214247 0.887395 -0.427817
+v -0.190014 0.875385 -0.420666
+v -0.180526 0.869096 -0.446116
+v -0.187828 0.871200 -0.463624
+v -0.222914 0.890237 -0.444587
+v -0.205805 0.884552 -0.411499
+v -0.173412 0.866967 -0.429085
+v -0.124348 0.847862 -0.467349
+v -0.129378 0.849110 -0.485714
+v -0.143717 0.854067 -0.461145
+v -0.119448 0.846561 -0.449490
+v -0.104448 0.842564 -0.472648
+v -0.108673 0.843598 -0.491226
+v -0.149530 0.855565 -0.479259
+v -0.138054 0.852523 -0.443528
+v -0.100332 0.841469 -0.454582
+v -0.042413 0.832336 -0.482876
+v -0.044128 0.832958 -0.501866
+v -0.063393 0.834784 -0.480428
+v -0.040742 0.831640 -0.464411
+v -0.021252 0.830861 -0.484351
+v -0.022111 0.831423 -0.503401
+v -0.065957 0.835505 -0.499319
+v -0.060895 0.833992 -0.462059
+v -0.020414 0.830222 -0.465829
+v 0.042413 0.832336 -0.482876
+v 0.044128 0.832958 -0.501866
+v 0.021251 0.830861 -0.484351
+v 0.040741 0.831640 -0.464411
+v 0.063393 0.834784 -0.480428
+v 0.065957 0.835505 -0.499319
+v 0.022111 0.831423 -0.503401
+v 0.020414 0.830222 -0.465829
+v 0.060895 0.833992 -0.462059
+v 0.124347 0.847862 -0.467350
+v 0.129377 0.849110 -0.485714
+v 0.104447 0.842564 -0.472648
+v 0.119448 0.846561 -0.449490
+v 0.143717 0.854067 -0.461145
+v 0.149530 0.855565 -0.479259
+v 0.108672 0.843598 -0.491226
+v 0.100332 0.841469 -0.454582
+v 0.138054 0.852523 -0.443528
+v 0.197808 0.877857 -0.437355
+v 0.205810 0.880314 -0.454510
+v 0.180526 0.869096 -0.446116
+v 0.190014 0.875385 -0.420666
+v 0.214247 0.887395 -0.427817
+v 0.222913 0.890237 -0.444587
+v 0.187828 0.871200 -0.463624
+v 0.173412 0.866967 -0.429085
+v 0.205805 0.884552 -0.411499
+v 0.257789 0.920275 -0.394937
+v 0.268217 0.924442 -0.410382
+v 0.244301 0.908650 -0.406562
+v 0.247631 0.916150 -0.379901
+v 0.270176 0.932498 -0.382714
+v 0.281105 0.937157 -0.397667
+v 0.254183 0.912348 -0.422476
+v 0.234675 0.904978 -0.391073
+v 0.259530 0.927895 -0.368156
+v 0.300202 0.972227 -0.342985
+v 0.312345 0.978488 -0.356336
+v 0.291428 0.958529 -0.356683
+v 0.288373 0.966076 -0.329976
+v 0.307694 0.986300 -0.328912
+v 0.320140 0.993129 -0.341696
+v 0.303216 0.964238 -0.370586
+v 0.279945 0.952912 -0.343140
+v 0.295570 0.979600 -0.316451
+v 0.322156 1.030171 -0.285041
+v 0.335187 1.038768 -0.296056
+v 0.318694 1.015334 -0.299878
+v 0.309462 1.021761 -0.274291
+v 0.324242 1.045137 -0.270076
+v 0.337358 1.054337 -0.280487
+v 0.331586 1.023333 -0.311491
+v 0.306137 1.007502 -0.288549
+v 0.311466 1.036142 -0.259909
+v 0.322156 1.090160 -0.225052
+v 0.335187 1.101175 -0.233649
+v 0.324242 1.075195 -0.240017
+v 0.309462 1.079410 -0.216641
+v 0.318694 1.104997 -0.210215
+v 0.331586 1.116610 -0.218214
+v 0.337358 1.085607 -0.249217
+v 0.311466 1.065028 -0.231023
+v 0.306137 1.093668 -0.202383
+v 0.300202 1.148105 -0.167108
+v 0.312345 1.161456 -0.173369
+v 0.307694 1.134031 -0.181181
+v 0.288373 1.135095 -0.160956
+v 0.291428 1.161803 -0.153410
+v 0.303216 1.175706 -0.159119
+v 0.320140 1.146815 -0.188009
+v 0.295570 1.121570 -0.174481
+v 0.279945 1.148259 -0.147792
+v 0.257789 1.200056 -0.115156
+v 0.268217 1.215501 -0.119323
+v 0.270176 1.187834 -0.127378
+v 0.247631 1.185021 -0.111030
+v 0.244301 1.211681 -0.103531
+v 0.254183 1.227595 -0.107229
+v 0.281105 1.202786 -0.132038
+v 0.259530 1.173275 -0.122776
+v 0.234675 1.196193 -0.099858
+v 0.197808 1.242474 -0.072738
+v 0.205810 1.259629 -0.075195
+v 0.214247 1.232936 -0.082276
+v 0.190014 1.225785 -0.070266
+v 0.180526 1.251235 -0.063977
+v 0.187828 1.268743 -0.066081
+v 0.222913 1.249706 -0.085118
+v 0.205805 1.216618 -0.079433
+v 0.173412 1.234204 -0.061847
+v 0.124348 1.272469 -0.042743
+v 0.129377 1.290833 -0.043991
+v 0.143717 1.266264 -0.048948
+v 0.119448 1.254610 -0.041441
+v 0.104448 1.277767 -0.037445
+v 0.108673 1.296345 -0.038479
+v 0.149530 1.284378 -0.050446
+v 0.138054 1.248647 -0.047404
+v 0.100332 1.259701 -0.036350
+v 0.042413 1.287995 -0.027217
+v 0.044128 1.306985 -0.027839
+v 0.063393 1.285547 -0.029665
+v 0.040741 1.269531 -0.026521
+v 0.021252 1.289471 -0.025742
+v 0.022111 1.308520 -0.026304
+v 0.065957 1.304438 -0.030386
+v 0.060895 1.267178 -0.028873
+v 0.020414 1.270949 -0.025103
+v -0.042413 1.287995 -0.027217
+v -0.044128 1.306985 -0.027839
+v -0.021252 1.289470 -0.025742
+v -0.040741 1.269531 -0.026521
+v -0.063393 1.285547 -0.029665
+v -0.065957 1.304439 -0.030386
+v -0.022111 1.308520 -0.026304
+v -0.020414 1.270949 -0.025103
+v -0.060895 1.267178 -0.028873
+v -0.124348 1.272469 -0.042743
+v -0.129378 1.290833 -0.043991
+v -0.104448 1.277767 -0.037445
+v -0.119448 1.254610 -0.041442
+v -0.143717 1.266264 -0.048948
+v -0.149530 1.284378 -0.050446
+v -0.108673 1.296345 -0.038479
+v -0.100332 1.259701 -0.036350
+v -0.138054 1.248647 -0.047404
+v -0.197808 1.242474 -0.072738
+v -0.205810 1.259629 -0.075195
+v -0.180526 1.251235 -0.063977
+v -0.190014 1.225785 -0.070266
+v -0.214247 1.232936 -0.082276
+v -0.222913 1.249707 -0.085118
+v -0.187828 1.268743 -0.066081
+v -0.173412 1.234204 -0.061847
+v -0.205805 1.216618 -0.079433
+v -0.257789 1.200056 -0.115156
+v -0.268217 1.215501 -0.119323
+v -0.244301 1.211681 -0.103531
+v -0.247631 1.185021 -0.111030
+v -0.270176 1.187834 -0.127378
+v -0.281105 1.202786 -0.132038
+v -0.254183 1.227595 -0.107229
+v -0.234675 1.196193 -0.099858
+v -0.259530 1.173275 -0.122776
+v -0.300202 1.148105 -0.167108
+v -0.312345 1.161456 -0.173369
+v -0.291428 1.161803 -0.153410
+v -0.288373 1.135095 -0.160956
+v -0.307694 1.134031 -0.181181
+v -0.320140 1.146815 -0.188009
+v -0.303216 1.175706 -0.159119
+v -0.279945 1.148259 -0.147792
+v -0.295570 1.121570 -0.174481
+v -0.322156 1.090160 -0.225052
+v -0.335188 1.101175 -0.233649
+v -0.318694 1.104997 -0.210215
+v -0.309462 1.079410 -0.216641
+v -0.324242 1.075195 -0.240017
+v -0.337358 1.085607 -0.249217
+v -0.331586 1.116610 -0.218214
+v -0.306137 1.093668 -0.202383
+v -0.311466 1.065028 -0.231023
+v -0.322156 1.030171 -0.285041
+v -0.335188 1.038768 -0.296056
+v -0.324243 1.045137 -0.270076
+v -0.309462 1.021761 -0.274291
+v -0.318695 1.015334 -0.299878
+v -0.331586 1.023333 -0.311491
+v -0.337358 1.054337 -0.280487
+v -0.311466 1.036142 -0.259909
+v -0.306137 1.007502 -0.288549
+v -0.300202 0.972227 -0.342985
+v -0.312345 0.978488 -0.356336
+v -0.307694 0.986300 -0.328912
+v -0.288373 0.966075 -0.329976
+v -0.291428 0.958529 -0.356683
+v -0.303217 0.964238 -0.370586
+v -0.320140 0.993129 -0.341696
+v -0.295570 0.979600 -0.316451
+v -0.279945 0.952912 -0.343139
+v -0.257789 0.920275 -0.394937
+v -0.268217 0.924442 -0.410382
+v -0.270177 0.932498 -0.382714
+v -0.247631 0.916150 -0.379901
+v -0.244301 0.908650 -0.406562
+v -0.254184 0.912348 -0.422476
+v -0.281105 0.937157 -0.397667
+v -0.259531 0.927895 -0.368156
+v -0.234675 0.904978 -0.391073
+v -0.521101 1.009729 -0.107589
+v -0.523477 1.007573 -0.104990
+v -0.515502 1.033726 -0.083592
+v -0.519218 1.010615 -0.108825
+v -0.524477 0.985526 -0.131792
+v -0.526868 0.983259 -0.129304
+v -0.517852 1.031679 -0.080884
+v -0.513639 1.034524 -0.084915
+v -0.522581 0.986499 -0.132941
+v -0.521102 0.912708 -0.204610
+v -0.523477 0.910109 -0.202453
+v -0.524477 0.936912 -0.180406
+v -0.519218 0.913944 -0.205495
+v -0.515503 0.888712 -0.228606
+v -0.517853 0.886003 -0.226559
+v -0.526868 0.934423 -0.178139
+v -0.522581 0.938060 -0.181379
+v -0.513639 0.890034 -0.229405
+v -0.485589 0.818993 -0.298325
+v -0.487803 0.815967 -0.296596
+v -0.497708 0.841754 -0.275564
+v -0.483834 0.820568 -0.298872
+v -0.471398 0.796839 -0.320479
+v -0.473547 0.793712 -0.318851
+v -0.499978 0.838832 -0.273731
+v -0.495910 0.843246 -0.276193
+v -0.469694 0.798494 -0.320946
+v -0.416985 0.734970 -0.382348
+v -0.418886 0.731561 -0.381002
+v -0.437022 0.754737 -0.362580
+v -0.415478 0.736848 -0.382591
+v -0.395168 0.716168 -0.401150
+v -0.396970 0.712673 -0.399889
+v -0.439015 0.751418 -0.361144
+v -0.435443 0.756545 -0.362895
+v -0.393740 0.718114 -0.401325
+v -0.319964 0.666366 -0.450952
+v -0.321423 0.662644 -0.449919
+v -0.346554 0.681793 -0.435525
+v -0.318808 0.668492 -0.450947
+v -0.292008 0.652197 -0.465121
+v -0.293340 0.648411 -0.464152
+v -0.348134 0.678141 -0.434421
+v -0.345301 0.683863 -0.435576
+v -0.290953 0.654375 -0.465065
+v -0.201138 0.617855 -0.499463
+v -0.202055 0.613912 -0.498650
+v -0.232468 0.627890 -0.489428
+v -0.200411 0.620157 -0.499282
+v -0.168949 0.609285 -0.508032
+v -0.169719 0.605303 -0.507259
+v -0.233528 0.623993 -0.488570
+v -0.231628 0.630156 -0.489284
+v -0.168338 0.611618 -0.507821
+v -0.068604 0.592744 -0.524574
+v -0.068917 0.588687 -0.523876
+v -0.102541 0.596703 -0.520614
+v -0.068356 0.595137 -0.524303
+v -0.034375 0.590358 -0.526960
+v -0.034532 0.586289 -0.526273
+v -0.103008 0.592664 -0.519899
+v -0.102170 0.599082 -0.520358
+v -0.034251 0.592759 -0.526680
+v 0.068604 0.592744 -0.524574
+v 0.068917 0.588687 -0.523876
+v 0.034375 0.590358 -0.526960
+v 0.068356 0.595137 -0.524303
+v 0.102540 0.596703 -0.520614
+v 0.103008 0.592664 -0.519899
+v 0.034532 0.586289 -0.526273
+v 0.034251 0.592759 -0.526680
+v 0.102170 0.599082 -0.520358
+v 0.201138 0.617855 -0.499463
+v 0.202055 0.613912 -0.498650
+v 0.168948 0.609286 -0.508032
+v 0.200411 0.620157 -0.499283
+v 0.232468 0.627890 -0.489428
+v 0.233528 0.623993 -0.488570
+v 0.169719 0.605303 -0.507259
+v 0.168338 0.611618 -0.507821
+v 0.231628 0.630156 -0.489284
+v 0.319964 0.666366 -0.450952
+v 0.321423 0.662644 -0.449919
+v 0.292008 0.652197 -0.465121
+v 0.318807 0.668492 -0.450947
+v 0.346554 0.681793 -0.435525
+v 0.348134 0.678141 -0.434421
+v 0.293339 0.648411 -0.464152
+v 0.290953 0.654375 -0.465065
+v 0.345301 0.683863 -0.435576
+v 0.416985 0.734970 -0.382348
+v 0.418886 0.731561 -0.381002
+v 0.395168 0.716168 -0.401150
+v 0.415478 0.736849 -0.382591
+v 0.437022 0.754738 -0.362580
+v 0.439015 0.751419 -0.361144
+v 0.396969 0.712673 -0.399889
+v 0.393740 0.718115 -0.401325
+v 0.435443 0.756545 -0.362895
+v 0.485589 0.818993 -0.298325
+v 0.487803 0.815967 -0.296596
+v 0.471398 0.796839 -0.320479
+v 0.483834 0.820568 -0.298872
+v 0.497708 0.841754 -0.275564
+v 0.499977 0.838832 -0.273731
+v 0.473547 0.793712 -0.318851
+v 0.469694 0.798494 -0.320946
+v 0.495909 0.843247 -0.276193
+v 0.521101 0.912708 -0.204610
+v 0.523477 0.910109 -0.202453
+v 0.515502 0.888712 -0.228606
+v 0.519218 0.913944 -0.205495
+v 0.524476 0.936912 -0.180406
+v 0.526867 0.934423 -0.178140
+v 0.517852 0.886003 -0.226559
+v 0.513639 0.890034 -0.229405
+v 0.522581 0.938060 -0.181379
+v 0.521101 1.009729 -0.107589
+v 0.523477 1.007573 -0.104990
+v 0.524476 0.985526 -0.131792
+v 0.519218 1.010615 -0.108825
+v 0.515502 1.033726 -0.083592
+v 0.517852 1.031679 -0.080884
+v 0.526867 0.983259 -0.129304
+v 0.522581 0.986499 -0.132941
+v 0.513639 1.034524 -0.084915
+v 0.485589 1.103444 -0.013874
+v 0.487803 1.101715 -0.010847
+v 0.497708 1.080683 -0.036635
+v 0.483834 1.103991 -0.015448
+v 0.471398 1.125599 0.008281
+v 0.473547 1.123970 0.011408
+v 0.499977 1.078850 -0.033712
+v 0.495909 1.081312 -0.038127
+v 0.469694 1.126065 0.006626
+v 0.416985 1.187467 0.070149
+v 0.418886 1.186121 0.073558
+v 0.437022 1.167700 0.050382
+v 0.415478 1.187710 0.068271
+v 0.395168 1.206269 0.088951
+v 0.396969 1.205009 0.092446
+v 0.439015 1.166263 0.053701
+v 0.435443 1.168014 0.048574
+v 0.393740 1.206444 0.087005
+v 0.319964 1.256071 0.138754
+v 0.321423 1.255038 0.142475
+v 0.346554 1.240645 0.123327
+v 0.318807 1.256067 0.136627
+v 0.292008 1.270240 0.152922
+v 0.293339 1.269271 0.156708
+v 0.348134 1.239541 0.126978
+v 0.345301 1.240695 0.121256
+v 0.290953 1.270184 0.150744
+v 0.201138 1.304582 0.187264
+v 0.202055 1.303770 0.191207
+v 0.232468 1.294547 0.177229
+v 0.200411 1.304402 0.184962
+v 0.168948 1.313151 0.195833
+v 0.169719 1.312378 0.199816
+v 0.233528 1.293689 0.181126
+v 0.231628 1.294403 0.174963
+v 0.168338 1.312940 0.193501
+v 0.068604 1.329693 0.212375
+v 0.068917 1.328995 0.216432
+v 0.102540 1.325734 0.208416
+v 0.068356 1.329422 0.209982
+v 0.034375 1.332079 0.214761
+v 0.034532 1.331393 0.218830
+v 0.103008 1.325018 0.212455
+v 0.102170 1.325477 0.206037
+v 0.034251 1.331800 0.212360
+v -0.068604 1.329693 0.212375
+v -0.068917 1.328995 0.216432
+v -0.034375 1.332079 0.214761
+v -0.068356 1.329422 0.209982
+v -0.102540 1.325734 0.208416
+v -0.103008 1.325018 0.212455
+v -0.034532 1.331393 0.218830
+v -0.034251 1.331800 0.212360
+v -0.102170 1.325477 0.206037
+v -0.201138 1.304582 0.187264
+v -0.202055 1.303770 0.191207
+v -0.168949 1.313151 0.195834
+v -0.200411 1.304402 0.184962
+v -0.232468 1.294547 0.177229
+v -0.233528 1.293689 0.181126
+v -0.169719 1.312378 0.199816
+v -0.168338 1.312940 0.193501
+v -0.231628 1.294403 0.174963
+v -0.319964 1.256071 0.138754
+v -0.321423 1.255038 0.142475
+v -0.292008 1.270240 0.152922
+v -0.318807 1.256067 0.136627
+v -0.346554 1.240644 0.123327
+v -0.348134 1.239541 0.126978
+v -0.293339 1.269271 0.156709
+v -0.290953 1.270184 0.150744
+v -0.345301 1.240695 0.121256
+v -0.416985 1.187467 0.070149
+v -0.418886 1.186121 0.073558
+v -0.395168 1.206269 0.088951
+v -0.415478 1.187710 0.068271
+v -0.437022 1.167700 0.050382
+v -0.439015 1.166263 0.053701
+v -0.396969 1.205009 0.092446
+v -0.393740 1.206444 0.087005
+v -0.435443 1.168014 0.048574
+v -0.485589 1.103444 -0.013873
+v -0.487803 1.101715 -0.010847
+v -0.471397 1.125599 0.008281
+v -0.483834 1.103991 -0.015448
+v -0.497708 1.080683 -0.036635
+v -0.499977 1.078850 -0.033712
+v -0.473547 1.123970 0.011408
+v -0.469694 1.126065 0.006626
+v -0.495909 1.081312 -0.038127
+v -0.407067 1.188836 0.058018
+v -0.406122 1.187438 0.058391
+v -0.385769 1.207191 0.076373
+v -0.408451 1.190373 0.057984
+v -0.426628 1.169538 0.038721
+v -0.425637 1.168185 0.039138
+v -0.384873 1.205750 0.076703
+v -0.387081 1.208790 0.076401
+v -0.428079 1.171009 0.038620
+v -0.312354 1.255808 0.124991
+v -0.311628 1.254255 0.125208
+v -0.285063 1.269640 0.138822
+v -0.313416 1.257573 0.125184
+v -0.338311 1.240748 0.109931
+v -0.337526 1.239230 0.110182
+v -0.284401 1.268054 0.139007
+v -0.286032 1.271451 0.139062
+v -0.339462 1.242462 0.110073
+v -0.196354 1.303165 0.172347
+v -0.195898 1.301502 0.172454
+v -0.164930 1.311531 0.180713
+v -0.197021 1.305091 0.172702
+v -0.226939 1.293369 0.162551
+v -0.226412 1.291728 0.162681
+v -0.164547 1.309848 0.180800
+v -0.165491 1.313485 0.181096
+v -0.227711 1.295261 0.162872
+v -0.066973 1.327679 0.196861
+v -0.066817 1.325958 0.196911
+v -0.033558 1.330009 0.199191
+v -0.067200 1.329688 0.197299
+v -0.100102 1.323814 0.192996
+v -0.099869 1.322102 0.193055
+v -0.033480 1.328283 0.199235
+v -0.033672 1.332026 0.199636
+v -0.100442 1.325810 0.193420
+v 0.066973 1.327679 0.196861
+v 0.066817 1.325958 0.196911
+v 0.100102 1.323814 0.192996
+v 0.067200 1.329688 0.197299
+v 0.033558 1.330009 0.199191
+v 0.033480 1.328283 0.199235
+v 0.099869 1.322102 0.193055
+v 0.100442 1.325810 0.193421
+v 0.033672 1.332026 0.199636
+v 0.196354 1.303165 0.172348
+v 0.195898 1.301502 0.172454
+v 0.226939 1.293369 0.162551
+v 0.197021 1.305091 0.172702
+v 0.164930 1.311531 0.180713
+v 0.164547 1.309848 0.180801
+v 0.226412 1.291728 0.162681
+v 0.227711 1.295261 0.162872
+v 0.165491 1.313485 0.181096
+v 0.312354 1.255808 0.124991
+v 0.311628 1.254255 0.125208
+v 0.338311 1.240748 0.109931
+v 0.313416 1.257573 0.125184
+v 0.285063 1.269640 0.138822
+v 0.284401 1.268054 0.139007
+v 0.337525 1.239230 0.110182
+v 0.339462 1.242462 0.110073
+v 0.286032 1.271452 0.139062
+v 0.407067 1.188836 0.058018
+v 0.406122 1.187438 0.058390
+v 0.426628 1.169538 0.038721
+v 0.408451 1.190373 0.057984
+v 0.385769 1.207191 0.076373
+v 0.384873 1.205750 0.076703
+v 0.425637 1.168185 0.039138
+v 0.428079 1.171009 0.038620
+v 0.387081 1.208790 0.076401
+v 0.474040 1.106811 -0.024006
+v 0.472939 1.105604 -0.023443
+v 0.485871 1.084592 -0.046226
+v 0.475652 1.108069 -0.024320
+v 0.460186 1.128439 -0.002379
+v 0.459117 1.127181 -0.001866
+v 0.484742 1.083436 -0.045612
+v 0.487523 1.085774 -0.046615
+v 0.461751 1.129770 -0.002619
+v 0.508707 1.015325 -0.115492
+v 0.507526 1.014330 -0.114717
+v 0.512002 0.991697 -0.139120
+v 0.510437 1.016272 -0.116117
+v 0.503241 1.038751 -0.092067
+v 0.502073 1.037701 -0.091346
+v 0.510813 0.990757 -0.138290
+v 0.513743 0.992564 -0.139825
+v 0.504953 1.039777 -0.092612
+v 0.508707 0.920612 -0.210206
+v 0.507526 0.919836 -0.209211
+v 0.503241 0.897186 -0.233632
+v 0.510437 0.921236 -0.211153
+v 0.512002 0.944239 -0.186578
+v 0.510813 0.943409 -0.185638
+v 0.502073 0.896465 -0.232582
+v 0.504953 0.897731 -0.234658
+v 0.513743 0.944945 -0.187445
+v 0.474040 0.829125 -0.301692
+v 0.472939 0.828562 -0.300485
+v 0.460186 0.807498 -0.323319
+v 0.475652 0.829439 -0.302950
+v 0.485871 0.851345 -0.279472
+v 0.484742 0.850731 -0.278316
+v 0.459117 0.806986 -0.322062
+v 0.461751 0.807738 -0.324651
+v 0.487523 0.851734 -0.280655
+v 0.407067 0.747101 -0.383717
+v 0.406122 0.746729 -0.382318
+v 0.385769 0.728746 -0.402071
+v 0.408451 0.747136 -0.385253
+v 0.426628 0.766398 -0.364419
+v 0.425637 0.765981 -0.363066
+v 0.384873 0.728416 -0.400631
+v 0.387081 0.728718 -0.403671
+v 0.428079 0.766499 -0.365890
+v 0.312354 0.680128 -0.450689
+v 0.311628 0.679911 -0.449136
+v 0.285063 0.666297 -0.464521
+v 0.313416 0.679935 -0.452454
+v 0.338311 0.695189 -0.435629
+v 0.337526 0.694937 -0.434110
+v 0.284401 0.666112 -0.462935
+v 0.286032 0.666057 -0.466332
+v 0.339462 0.695046 -0.437342
+v 0.196354 0.632772 -0.498046
+v 0.195898 0.632665 -0.496382
+v 0.164930 0.624406 -0.506411
+v 0.197021 0.632417 -0.499972
+v 0.226939 0.642568 -0.488250
+v 0.226412 0.642438 -0.486609
+v 0.164547 0.624319 -0.504728
+v 0.165491 0.624023 -0.508366
+v 0.227711 0.642247 -0.490142
+v 0.066973 0.608258 -0.522559
+v 0.066817 0.608208 -0.520839
+v 0.033558 0.605928 -0.524889
+v 0.067200 0.607820 -0.524569
+v 0.100101 0.612123 -0.518695
+v 0.099869 0.612064 -0.516983
+v 0.033480 0.605884 -0.523163
+v 0.033672 0.605483 -0.526906
+v 0.100442 0.611699 -0.520690
+v -0.066973 0.608258 -0.522560
+v -0.066817 0.608208 -0.520839
+v -0.100102 0.612123 -0.518695
+v -0.067200 0.607820 -0.524568
+v -0.033558 0.605928 -0.524889
+v -0.033480 0.605884 -0.523163
+v -0.099869 0.612064 -0.516983
+v -0.100442 0.611699 -0.520690
+v -0.033672 0.605483 -0.526906
+v -0.196354 0.632772 -0.498046
+v -0.195898 0.632665 -0.496382
+v -0.226939 0.642568 -0.488249
+v -0.197022 0.632417 -0.499972
+v -0.164930 0.624406 -0.506411
+v -0.164547 0.624319 -0.504728
+v -0.226412 0.642438 -0.486609
+v -0.227711 0.642247 -0.490142
+v -0.165491 0.624023 -0.508366
+v -0.312354 0.680128 -0.450689
+v -0.311628 0.679911 -0.449135
+v -0.338311 0.695188 -0.435629
+v -0.313416 0.679935 -0.452454
+v -0.285063 0.666297 -0.464521
+v -0.284401 0.666112 -0.462935
+v -0.337526 0.694937 -0.434110
+v -0.339462 0.695046 -0.437342
+v -0.286032 0.666057 -0.466332
+v -0.407067 0.747101 -0.383717
+v -0.406122 0.746728 -0.382318
+v -0.426628 0.766398 -0.364419
+v -0.408452 0.747135 -0.385253
+v -0.385769 0.728746 -0.402071
+v -0.384873 0.728416 -0.400631
+v -0.425637 0.765981 -0.363066
+v -0.428079 0.766499 -0.365890
+v -0.387081 0.728718 -0.403670
+v -0.474040 0.829125 -0.301692
+v -0.472939 0.828562 -0.300484
+v -0.485871 0.851345 -0.279472
+v -0.475652 0.829439 -0.302950
+v -0.460186 0.807498 -0.323319
+v -0.459117 0.806985 -0.322061
+v -0.484743 0.850731 -0.278316
+v -0.487523 0.851734 -0.280655
+v -0.461751 0.807738 -0.324651
+v -0.508708 0.920612 -0.210206
+v -0.507526 0.919836 -0.209211
+v -0.512002 0.944240 -0.186578
+v -0.510438 0.921236 -0.211153
+v -0.503242 0.897186 -0.233632
+v -0.502073 0.896465 -0.232582
+v -0.510813 0.943409 -0.185638
+v -0.513743 0.944945 -0.187444
+v -0.504953 0.897731 -0.234658
+v -0.508707 1.015325 -0.115492
+v -0.507526 1.014330 -0.114717
+v -0.503241 1.038751 -0.092067
+v -0.510437 1.016272 -0.116117
+v -0.512002 0.991697 -0.139120
+v -0.510813 0.990757 -0.138290
+v -0.502073 1.037701 -0.091346
+v -0.504953 1.039777 -0.092612
+v -0.513743 0.992564 -0.139825
+v -0.474040 1.106811 -0.024006
+v -0.472939 1.105604 -0.023443
+v -0.460186 1.128439 -0.002379
+v -0.475652 1.108069 -0.024320
+v -0.485870 1.084592 -0.046226
+v -0.484742 1.083436 -0.045611
+v -0.459117 1.127181 -0.001866
+v -0.461751 1.129770 -0.002619
+v -0.487523 1.085774 -0.046615
+v 0.314046 0.674882 -0.448562
+v 0.315859 0.672389 -0.449411
+v 0.286608 0.660976 -0.462469
+v 0.312494 0.677224 -0.448043
+v 0.340144 0.690024 -0.433421
+v 0.342108 0.687618 -0.434182
+v 0.288262 0.658403 -0.463397
+v 0.285191 0.663386 -0.461880
+v 0.338463 0.692291 -0.432976
+v 0.409273 0.742218 -0.381227
+v 0.411635 0.740114 -0.381687
+v 0.387859 0.723763 -0.399681
+v 0.407250 0.744226 -0.381040
+v 0.428940 0.761620 -0.361825
+v 0.431416 0.759628 -0.362172
+v 0.390098 0.721553 -0.400247
+v 0.385942 0.725863 -0.399403
+v 0.426819 0.763533 -0.361734
+v 0.476608 0.824687 -0.298758
+v 0.479360 0.823058 -0.298742
+v 0.462679 0.802942 -0.320502
+v 0.474252 0.826288 -0.298979
+v 0.488503 0.847027 -0.276418
+v 0.491323 0.845528 -0.276273
+v 0.465350 0.801189 -0.320612
+v 0.460392 0.804651 -0.320616
+v 0.486088 0.848517 -0.276749
+v 0.511464 0.916668 -0.206776
+v 0.514416 0.915572 -0.206229
+v 0.505968 0.893116 -0.230329
+v 0.508935 0.917815 -0.207452
+v 0.514776 0.940424 -0.183020
+v 0.517748 0.939465 -0.182336
+v 0.508889 0.891883 -0.229917
+v 0.503467 0.894379 -0.230888
+v 0.512232 0.941453 -0.183813
+v 0.511464 1.011895 -0.111549
+v 0.514416 1.011348 -0.110452
+v 0.514776 0.988139 -0.135305
+v 0.508935 1.012571 -0.112696
+v 0.505968 1.035448 -0.087997
+v 0.508889 1.035037 -0.086764
+v 0.517748 0.987455 -0.134345
+v 0.512232 0.988932 -0.136334
+v 0.503467 1.036007 -0.089259
+v 0.476608 1.103877 -0.019567
+v 0.479360 1.103861 -0.017939
+v 0.488503 1.081537 -0.041908
+v 0.474252 1.104098 -0.021168
+v 0.462679 1.125622 0.002177
+v 0.465350 1.125731 0.003931
+v 0.491323 1.081392 -0.040408
+v 0.486088 1.081869 -0.043398
+v 0.460392 1.125735 0.000468
+v 0.409273 1.186346 0.062901
+v 0.411635 1.186806 0.065006
+v 0.428940 1.166944 0.043499
+v 0.407250 1.186159 0.060893
+v 0.387859 1.204800 0.081356
+v 0.390098 1.205367 0.083566
+v 0.431416 1.167292 0.045492
+v 0.426819 1.166853 0.041587
+v 0.385942 1.204522 0.079256
+v 0.314046 1.253682 0.130237
+v 0.315859 1.254530 0.132730
+v 0.340144 1.238540 0.115095
+v 0.312494 1.253162 0.127895
+v 0.286607 1.267588 0.144143
+v 0.288262 1.268517 0.146716
+v 0.342108 1.239301 0.117501
+v 0.338463 1.238095 0.112828
+v 0.285191 1.267000 0.141733
+v 0.197418 1.301295 0.177850
+v 0.198557 1.302418 0.180618
+v 0.228169 1.291445 0.168001
+v 0.196442 1.300540 0.175273
+v 0.165824 1.309706 0.186261
+v 0.166781 1.310878 0.189077
+v 0.229486 1.292512 0.170712
+v 0.227041 1.290739 0.165473
+v 0.165004 1.308909 0.183643
+v 0.067335 1.325941 0.202497
+v 0.067724 1.327207 0.205407
+v 0.100644 1.322055 0.198611
+v 0.067003 1.325065 0.199798
+v 0.033740 1.328284 0.204839
+v 0.033934 1.329563 0.207762
+v 0.101225 1.323298 0.201498
+v 0.100146 1.321198 0.195931
+v 0.033573 1.327395 0.202129
+v -0.067336 1.325941 0.202497
+v -0.067724 1.327207 0.205407
+v -0.033740 1.328284 0.204839
+v -0.067003 1.325065 0.199798
+v -0.100644 1.322055 0.198611
+v -0.101225 1.323298 0.201498
+v -0.033934 1.329563 0.207762
+v -0.033573 1.327395 0.202129
+v -0.100146 1.321198 0.195931
+v -0.197418 1.301295 0.177850
+v -0.198557 1.302418 0.180618
+v -0.165824 1.309706 0.186261
+v -0.196442 1.300540 0.175273
+v -0.228169 1.291445 0.168001
+v -0.229486 1.292512 0.170712
+v -0.166781 1.310878 0.189077
+v -0.165004 1.308909 0.183643
+v -0.227041 1.290739 0.165473
+v -0.314046 1.253682 0.130237
+v -0.315859 1.254530 0.132730
+v -0.286608 1.267588 0.144143
+v -0.312494 1.253162 0.127895
+v -0.340144 1.238540 0.115095
+v -0.342108 1.239301 0.117501
+v -0.288262 1.268517 0.146716
+v -0.285191 1.267000 0.141733
+v -0.338463 1.238095 0.112829
+v -0.409273 1.186346 0.062902
+v -0.411635 1.186806 0.065006
+v -0.387859 1.204800 0.081356
+v -0.407250 1.186159 0.060893
+v -0.428940 1.166944 0.043499
+v -0.431416 1.167292 0.045492
+v -0.390098 1.205367 0.083566
+v -0.385942 1.204522 0.079256
+v -0.426819 1.166853 0.041587
+v -0.476608 1.103877 -0.019567
+v -0.479360 1.103861 -0.017939
+v -0.462679 1.125622 0.002177
+v -0.474252 1.104098 -0.021168
+v -0.488503 1.081537 -0.041907
+v -0.491323 1.081392 -0.040408
+v -0.465350 1.125731 0.003931
+v -0.460392 1.125735 0.000469
+v -0.486088 1.081868 -0.043398
+v -0.511464 1.011895 -0.111549
+v -0.514416 1.011348 -0.110452
+v -0.505968 1.035448 -0.087997
+v -0.508936 1.012571 -0.112696
+v -0.514777 0.988139 -0.135305
+v -0.517748 0.987455 -0.134345
+v -0.508889 1.035037 -0.086764
+v -0.503467 1.036007 -0.089259
+v -0.512232 0.988932 -0.136334
+v -0.511464 0.916668 -0.206776
+v -0.514417 0.915571 -0.206229
+v -0.514777 0.940424 -0.183020
+v -0.508936 0.917815 -0.207452
+v -0.505968 0.893116 -0.230329
+v -0.508889 0.891883 -0.229917
+v -0.517748 0.939465 -0.182336
+v -0.512232 0.941453 -0.183813
+v -0.503467 0.894379 -0.230888
+v -0.476609 0.824686 -0.298758
+v -0.479360 0.823058 -0.298742
+v -0.488504 0.847027 -0.276418
+v -0.474253 0.826288 -0.298979
+v -0.462679 0.802942 -0.320502
+v -0.465350 0.801188 -0.320611
+v -0.491323 0.845528 -0.276272
+v -0.486089 0.848517 -0.276749
+v -0.460392 0.804651 -0.320616
+v -0.409273 0.742218 -0.381227
+v -0.411636 0.740114 -0.381686
+v -0.428940 0.761620 -0.361825
+v -0.407250 0.744226 -0.381040
+v -0.387860 0.723763 -0.399681
+v -0.390098 0.721553 -0.400247
+v -0.431416 0.759628 -0.362172
+v -0.426819 0.763532 -0.361734
+v -0.385942 0.725863 -0.399403
+v -0.314046 0.674882 -0.448562
+v -0.315859 0.672389 -0.449411
+v -0.340145 0.690024 -0.433421
+v -0.312494 0.677224 -0.448043
+v -0.286608 0.660976 -0.462469
+v -0.288262 0.658403 -0.463397
+v -0.342108 0.687618 -0.434182
+v -0.338463 0.692291 -0.432976
+v -0.285191 0.663386 -0.461880
+v -0.197418 0.627269 -0.496176
+v -0.198557 0.624501 -0.497299
+v -0.228169 0.637118 -0.486326
+v -0.196442 0.629846 -0.495421
+v -0.165824 0.618858 -0.504587
+v -0.166781 0.616042 -0.505758
+v -0.229486 0.634407 -0.487393
+v -0.227041 0.639647 -0.485620
+v -0.165004 0.621476 -0.503790
+v -0.067336 0.602622 -0.520822
+v -0.067724 0.599712 -0.522088
+v -0.100644 0.606508 -0.516936
+v -0.067003 0.605321 -0.519945
+v -0.033740 0.600280 -0.523164
+v -0.033934 0.597356 -0.524443
+v -0.101225 0.603621 -0.518179
+v -0.100147 0.609188 -0.516079
+v -0.033573 0.602990 -0.522276
+v 0.067335 0.602622 -0.520822
+v 0.067724 0.599712 -0.522088
+v 0.033740 0.600280 -0.523164
+v 0.067003 0.605321 -0.519945
+v 0.100644 0.606508 -0.516936
+v 0.101225 0.603621 -0.518179
+v 0.033934 0.597356 -0.524443
+v 0.033573 0.602990 -0.522276
+v 0.100146 0.609188 -0.516078
+v 0.197418 0.627269 -0.496176
+v 0.198557 0.624501 -0.497299
+v 0.165824 0.618858 -0.504587
+v 0.196442 0.629846 -0.495421
+v 0.228169 0.637118 -0.486326
+v 0.229486 0.634407 -0.487393
+v 0.166781 0.616042 -0.505758
+v 0.165004 0.621476 -0.503790
+v 0.227041 0.639647 -0.485620
+v 0.315369 0.680196 -0.456315
+v 0.315246 0.679343 -0.455234
+v 0.287815 0.666231 -0.470280
+v 0.314541 0.683144 -0.457735
+v 0.341577 0.695402 -0.441109
+v 0.341444 0.694543 -0.440035
+v 0.287702 0.665384 -0.469194
+v 0.287059 0.669215 -0.471663
+v 0.340680 0.698309 -0.442569
+v 0.410997 0.747815 -0.388695
+v 0.410836 0.746936 -0.387642
+v 0.389493 0.729284 -0.407227
+v 0.409917 0.750585 -0.390294
+v 0.430746 0.767299 -0.369212
+v 0.430578 0.766412 -0.368165
+v 0.389341 0.728411 -0.406166
+v 0.388470 0.732102 -0.408777
+v 0.429615 0.770018 -0.370861
+v 0.478616 0.830632 -0.305879
+v 0.478429 0.829720 -0.304858
+v 0.464628 0.808796 -0.327715
+v 0.477359 0.833184 -0.307695
+v 0.490561 0.853066 -0.283445
+v 0.490369 0.852145 -0.282432
+v 0.464446 0.807892 -0.326685
+v 0.463407 0.811405 -0.329473
+v 0.489272 0.855559 -0.285320
+v 0.513618 0.923001 -0.213510
+v 0.513417 0.922053 -0.212524
+v 0.508099 0.899349 -0.237162
+v 0.512269 0.925311 -0.215568
+v 0.516945 0.946857 -0.189654
+v 0.516743 0.945900 -0.188678
+v 0.507901 0.898411 -0.236167
+v 0.506765 0.901721 -0.239158
+v 0.515587 0.949104 -0.191775
+v 0.513618 1.018629 -0.117882
+v 0.513417 1.017644 -0.116934
+v 0.516945 0.994773 -0.141738
+v 0.512269 1.020687 -0.120191
+v 0.508099 1.042281 -0.094230
+v 0.507901 1.041286 -0.093291
+v 0.516743 0.993797 -0.140781
+v 0.515587 0.996894 -0.143985
+v 0.506765 1.044277 -0.096602
+v 0.478616 1.110999 -0.025513
+v 0.478429 1.109977 -0.024601
+v 0.490561 1.088564 -0.047947
+v 0.477359 1.112814 -0.028065
+v 0.464628 1.132834 -0.003677
+v 0.464446 1.131804 -0.002773
+v 0.490369 1.087551 -0.047026
+v 0.489272 1.090439 -0.050440
+v 0.463407 1.134593 -0.006286
+v 0.410997 1.193815 0.057304
+v 0.410836 1.192761 0.058183
+v 0.430746 1.174331 0.037820
+v 0.409917 1.195413 0.054534
+v 0.389493 1.212347 0.075836
+v 0.389341 1.211285 0.076708
+v 0.430578 1.173285 0.038707
+v 0.429615 1.175980 0.035101
+v 0.388470 1.213896 0.073017
+v 0.315369 1.261434 0.124923
+v 0.315246 1.260353 0.125776
+v 0.341577 1.246228 0.109717
+v 0.314541 1.262854 0.121975
+v 0.287815 1.275399 0.138888
+v 0.287702 1.274313 0.139735
+v 0.341444 1.245154 0.110576
+v 0.340680 1.247689 0.106810
+v 0.287059 1.276783 0.135904
+v 0.198249 1.309248 0.172737
+v 0.198172 1.308149 0.173571
+v 0.229130 1.299357 0.162846
+v 0.197728 1.310543 0.169664
+v 0.166522 1.317694 0.181183
+v 0.166457 1.316592 0.182014
+v 0.229040 1.298262 0.163684
+v 0.228528 1.300678 0.159799
+v 0.166085 1.318967 0.178088
+v 0.067619 1.333998 0.197487
+v 0.067593 1.332890 0.198312
+v 0.101068 1.330096 0.193585
+v 0.067441 1.335228 0.194349
+v 0.033882 1.336350 0.199839
+v 0.033868 1.335241 0.200663
+v 0.101028 1.328989 0.194411
+v 0.100802 1.331336 0.190457
+v 0.033793 1.337574 0.196695
+v -0.067619 1.333998 0.197487
+v -0.067593 1.332890 0.198312
+v -0.033882 1.336350 0.199839
+v -0.067442 1.335228 0.194349
+v -0.101068 1.330096 0.193585
+v -0.101028 1.328989 0.194411
+v -0.033868 1.335241 0.200663
+v -0.033793 1.337574 0.196695
+v -0.100802 1.331336 0.190457
+v -0.198249 1.309248 0.172737
+v -0.198172 1.308149 0.173571
+v -0.166522 1.317694 0.181183
+v -0.197728 1.310543 0.169664
+v -0.229130 1.299357 0.162846
+v -0.229040 1.298262 0.163684
+v -0.166457 1.316592 0.182014
+v -0.166085 1.318967 0.178088
+v -0.228528 1.300677 0.159799
+v -0.315369 1.261434 0.124923
+v -0.315246 1.260353 0.125776
+v -0.287815 1.275399 0.138888
+v -0.314541 1.262854 0.121975
+v -0.341577 1.246228 0.109717
+v -0.341444 1.245154 0.110576
+v -0.287702 1.274313 0.139735
+v -0.287059 1.276783 0.135904
+v -0.340680 1.247689 0.106810
+v -0.410997 1.193815 0.057304
+v -0.410836 1.192761 0.058183
+v -0.389493 1.212347 0.075836
+v -0.409917 1.195413 0.054534
+v -0.430746 1.174331 0.037820
+v -0.430578 1.173285 0.038707
+v -0.389341 1.211285 0.076708
+v -0.388470 1.213896 0.073017
+v -0.429615 1.175980 0.035101
+v -0.478616 1.110999 -0.025513
+v -0.478429 1.109977 -0.024601
+v -0.464628 1.132834 -0.003677
+v -0.477359 1.112814 -0.028065
+v -0.490561 1.088564 -0.047947
+v -0.490369 1.087551 -0.047026
+v -0.464446 1.131804 -0.002773
+v -0.463407 1.134593 -0.006286
+v -0.489272 1.090439 -0.050440
+v -0.513618 1.018629 -0.117882
+v -0.513418 1.017644 -0.116934
+v -0.508099 1.042281 -0.094230
+v -0.512269 1.020687 -0.120191
+v -0.516945 0.994773 -0.141738
+v -0.516743 0.993797 -0.140780
+v -0.507901 1.041286 -0.093291
+v -0.506765 1.044277 -0.096602
+v -0.515587 0.996894 -0.143985
+v -0.513618 0.923001 -0.213510
+v -0.513418 0.922053 -0.212524
+v -0.516945 0.946857 -0.189654
+v -0.512269 0.925311 -0.215568
+v -0.508100 0.899349 -0.237162
+v -0.507901 0.898411 -0.236167
+v -0.516743 0.945900 -0.188678
+v -0.515587 0.949104 -0.191775
+v -0.506765 0.901721 -0.239158
+v -0.478616 0.830632 -0.305879
+v -0.478429 0.829720 -0.304858
+v -0.490561 0.853066 -0.283445
+v -0.477359 0.833184 -0.307695
+v -0.464628 0.808796 -0.327715
+v -0.464447 0.807892 -0.326685
+v -0.490369 0.852145 -0.282432
+v -0.489273 0.855559 -0.285319
+v -0.463408 0.811405 -0.329473
+v -0.410997 0.747815 -0.388695
+v -0.410836 0.746936 -0.387641
+v -0.430747 0.767299 -0.369212
+v -0.409917 0.750585 -0.390293
+v -0.389493 0.729284 -0.407227
+v -0.389341 0.728411 -0.406166
+v -0.430578 0.766412 -0.368165
+v -0.429615 0.770018 -0.370861
+v -0.388470 0.732102 -0.408777
+v -0.315369 0.680196 -0.456315
+v -0.315246 0.679343 -0.455234
+v -0.341577 0.695402 -0.441109
+v -0.314541 0.683144 -0.457735
+v -0.287815 0.666231 -0.470280
+v -0.287702 0.665384 -0.469194
+v -0.341444 0.694543 -0.440035
+v -0.340680 0.698309 -0.442569
+v -0.287059 0.669215 -0.471663
+v -0.198249 0.632382 -0.504128
+v -0.198172 0.631548 -0.503029
+v -0.229130 0.642273 -0.494237
+v -0.197729 0.635455 -0.505423
+v -0.166522 0.623936 -0.512575
+v -0.166457 0.623105 -0.511472
+v -0.229040 0.641435 -0.493142
+v -0.228528 0.645320 -0.495558
+v -0.166085 0.627031 -0.513847
+v -0.067619 0.607632 -0.528879
+v -0.067593 0.606807 -0.527770
+v -0.101068 0.611534 -0.524976
+v -0.067442 0.610770 -0.530109
+v -0.033882 0.605280 -0.531231
+v -0.033869 0.604456 -0.530121
+v -0.101028 0.610708 -0.523869
+v -0.100802 0.614662 -0.526216
+v -0.033793 0.608424 -0.532455
+v 0.067619 0.607632 -0.528879
+v 0.067593 0.606807 -0.527770
+v 0.033882 0.605280 -0.531231
+v 0.067441 0.610770 -0.530109
+v 0.101068 0.611534 -0.524976
+v 0.101028 0.610708 -0.523869
+v 0.033868 0.604456 -0.530121
+v 0.033793 0.608424 -0.532455
+v 0.100802 0.614662 -0.526216
+v 0.198249 0.632383 -0.504128
+v 0.198172 0.631548 -0.503029
+v 0.166522 0.623936 -0.512575
+v 0.197728 0.635455 -0.505423
+v 0.229130 0.642273 -0.494238
+v 0.229040 0.641435 -0.493142
+v 0.166457 0.623105 -0.511473
+v 0.166085 0.627031 -0.513847
+v 0.228528 0.645320 -0.495558
+v 0.178672 0.869440 -0.395201
+v 0.179861 0.865578 -0.394148
+v 0.193520 0.878096 -0.386545
+v 0.179895 0.871599 -0.399014
+v 0.163061 0.861490 -0.403150
+v 0.164146 0.857561 -0.402166
+v 0.194808 0.874307 -0.385419
+v 0.194845 0.880298 -0.390315
+v 0.164177 0.863609 -0.407004
+v 0.232850 0.907933 -0.356707
+v 0.234400 0.904398 -0.355328
+v 0.244039 0.919025 -0.345616
+v 0.234444 0.910285 -0.360329
+v 0.220667 0.897384 -0.367257
+v 0.222136 0.893759 -0.365967
+v 0.245663 0.915584 -0.344142
+v 0.245709 0.921432 -0.349182
+v 0.222177 0.899683 -0.370931
+v 0.271160 0.955078 -0.309563
+v 0.272964 0.951943 -0.307783
+v 0.277927 0.967849 -0.296791
+v 0.273015 0.957665 -0.312948
+v 0.263235 0.942647 -0.321993
+v 0.264987 0.939407 -0.320319
+v 0.279777 0.964823 -0.294904
+v 0.279829 0.970500 -0.300113
+v 0.265036 0.945173 -0.325441
+v 0.290990 1.007661 -0.256980
+v 0.292927 1.004973 -0.254754
+v 0.292875 1.021241 -0.243399
+v 0.292982 1.010511 -0.260102
+v 0.287864 0.994197 -0.270444
+v 0.289779 0.991394 -0.268332
+v 0.294824 1.018668 -0.241058
+v 0.294879 1.024160 -0.246454
+v 0.289834 0.996980 -0.273634
+v 0.290990 1.062099 -0.202542
+v 0.292927 1.059873 -0.199853
+v 0.287864 1.075563 -0.189078
+v 0.292982 1.065222 -0.205392
+v 0.292875 1.048519 -0.216122
+v 0.294824 1.046177 -0.213549
+v 0.289779 1.073452 -0.186275
+v 0.289834 1.078753 -0.191861
+v 0.294879 1.051573 -0.219040
+v 0.271160 1.114682 -0.149959
+v 0.272964 1.112902 -0.146824
+v 0.263235 1.127113 -0.137528
+v 0.273015 1.118068 -0.152546
+v 0.277927 1.101911 -0.162730
+v 0.279777 1.100023 -0.159704
+v 0.264987 1.125438 -0.134288
+v 0.265036 1.130560 -0.140054
+v 0.279829 1.105232 -0.165381
+v 0.232850 1.161827 -0.102814
+v 0.234400 1.160447 -0.099279
+v 0.220667 1.172376 -0.092265
+v 0.234444 1.165448 -0.105166
+v 0.244039 1.150735 -0.113906
+v 0.245663 1.149262 -0.110465
+v 0.222136 1.171086 -0.088640
+v 0.222177 1.176050 -0.094563
+v 0.245709 1.154301 -0.116313
+v 0.178672 1.200320 -0.064321
+v 0.179861 1.199268 -0.060459
+v 0.163061 1.208270 -0.056371
+v 0.179895 1.204134 -0.066480
+v 0.193521 1.191664 -0.072977
+v 0.194808 1.190538 -0.069188
+v 0.164147 1.207285 -0.052441
+v 0.164177 1.212123 -0.058490
+v 0.194845 1.195434 -0.075179
+v 0.112318 1.227539 -0.037102
+v 0.113066 1.226718 -0.033009
+v 0.094343 1.232347 -0.032294
+v 0.113087 1.231489 -0.039125
+v 0.129814 1.221908 -0.042732
+v 0.130677 1.221039 -0.038687
+v 0.094971 1.231567 -0.028160
+v 0.094989 1.236321 -0.034292
+v 0.130702 1.225830 -0.044784
+v 0.038310 1.241628 -0.023012
+v 0.038565 1.240927 -0.018799
+v 0.019196 1.242967 -0.021673
+v 0.038572 1.245649 -0.024965
+v 0.057260 1.239407 -0.025234
+v 0.057641 1.238686 -0.021040
+v 0.019323 1.242277 -0.017449
+v 0.019327 1.246995 -0.023619
+v 0.057652 1.243416 -0.027197
+v -0.038310 1.241628 -0.023012
+v -0.038565 1.240927 -0.018800
+v -0.057260 1.239407 -0.025234
+v -0.038572 1.245649 -0.024965
+v -0.019196 1.242967 -0.021673
+v -0.019323 1.242277 -0.017449
+v -0.057641 1.238686 -0.021040
+v -0.057652 1.243416 -0.027197
+v -0.019327 1.246995 -0.023619
+v -0.112318 1.227539 -0.037102
+v -0.113066 1.226718 -0.033009
+v -0.129814 1.221908 -0.042733
+v -0.113087 1.231489 -0.039125
+v -0.094343 1.232347 -0.032294
+v -0.094971 1.231567 -0.028160
+v -0.130677 1.221039 -0.038687
+v -0.130702 1.225830 -0.044784
+v -0.094989 1.236321 -0.034293
+v -0.178672 1.200320 -0.064321
+v -0.179861 1.199268 -0.060459
+v -0.193521 1.191664 -0.072977
+v -0.179895 1.204134 -0.066480
+v -0.163061 1.208270 -0.056371
+v -0.164147 1.207285 -0.052442
+v -0.194808 1.190538 -0.069188
+v -0.194845 1.195434 -0.075179
+v -0.164177 1.212123 -0.058490
+v -0.232850 1.161827 -0.102814
+v -0.234400 1.160447 -0.099279
+v -0.244039 1.150735 -0.113906
+v -0.234444 1.165448 -0.105166
+v -0.220667 1.172376 -0.092265
+v -0.222136 1.171087 -0.088640
+v -0.245663 1.149262 -0.110465
+v -0.245709 1.154301 -0.116313
+v -0.222177 1.176050 -0.094563
+v -0.271160 1.114682 -0.149959
+v -0.272964 1.112902 -0.146824
+v -0.277927 1.101911 -0.162730
+v -0.273015 1.118068 -0.152546
+v -0.263235 1.127113 -0.137528
+v -0.264987 1.125438 -0.134288
+v -0.279777 1.100023 -0.159704
+v -0.279829 1.105232 -0.165381
+v -0.265036 1.130560 -0.140053
+v -0.290991 1.062099 -0.202542
+v -0.292927 1.059873 -0.199853
+v -0.292875 1.048518 -0.216122
+v -0.292982 1.065222 -0.205392
+v -0.287864 1.075563 -0.189077
+v -0.289779 1.073452 -0.186275
+v -0.294824 1.046177 -0.213549
+v -0.294879 1.051573 -0.219040
+v -0.289834 1.078753 -0.191861
+v -0.290991 1.007661 -0.256980
+v -0.292927 1.004973 -0.254754
+v -0.287864 0.994197 -0.270444
+v -0.292982 1.010511 -0.260102
+v -0.292875 1.021241 -0.243399
+v -0.294824 1.018668 -0.241058
+v -0.289779 0.991394 -0.268332
+v -0.289834 0.996980 -0.273634
+v -0.294879 1.024160 -0.246454
+v -0.271160 0.955078 -0.309563
+v -0.272964 0.951943 -0.307783
+v -0.263235 0.942647 -0.321993
+v -0.273016 0.957665 -0.312948
+v -0.277928 0.967849 -0.296791
+v -0.279777 0.964823 -0.294903
+v -0.264987 0.939407 -0.320319
+v -0.265036 0.945173 -0.325441
+v -0.279829 0.970500 -0.300113
+v -0.232850 0.907933 -0.356707
+v -0.234400 0.904398 -0.355328
+v -0.220667 0.897384 -0.367257
+v -0.234444 0.910285 -0.360329
+v -0.244040 0.919025 -0.345616
+v -0.245663 0.915584 -0.344142
+v -0.222136 0.893759 -0.365967
+v -0.222177 0.899683 -0.370931
+v -0.245709 0.921432 -0.349182
+v -0.178672 0.869440 -0.395201
+v -0.179861 0.865578 -0.394148
+v -0.163062 0.861490 -0.403150
+v -0.179895 0.871599 -0.399014
+v -0.193521 0.878096 -0.386545
+v -0.194808 0.874308 -0.385419
+v -0.164147 0.857561 -0.402166
+v -0.164177 0.863610 -0.407004
+v -0.194845 0.880298 -0.390315
+v -0.112318 0.842221 -0.422420
+v -0.113066 0.838128 -0.421598
+v -0.094343 0.837413 -0.427228
+v -0.113087 0.844244 -0.426370
+v -0.129814 0.847852 -0.416789
+v -0.130677 0.843806 -0.415920
+v -0.094971 0.833279 -0.426447
+v -0.094989 0.839412 -0.431202
+v -0.130702 0.849903 -0.420711
+v -0.038310 0.828131 -0.436509
+v -0.038565 0.823919 -0.435808
+v -0.019196 0.826792 -0.437848
+v -0.038572 0.830084 -0.440530
+v -0.057260 0.830353 -0.434288
+v -0.057641 0.826159 -0.433567
+v -0.019323 0.822568 -0.437158
+v -0.019327 0.828738 -0.441875
+v -0.057652 0.832317 -0.438297
+v 0.038310 0.828131 -0.436509
+v 0.038564 0.823919 -0.435808
+v 0.057260 0.830353 -0.434288
+v 0.038572 0.830084 -0.440530
+v 0.019196 0.826792 -0.437848
+v 0.019323 0.822568 -0.437158
+v 0.057641 0.826159 -0.433567
+v 0.057652 0.832317 -0.438297
+v 0.019327 0.828738 -0.441875
+v 0.112318 0.842221 -0.422420
+v 0.113065 0.838128 -0.421598
+v 0.129814 0.847852 -0.416789
+v 0.113087 0.844244 -0.426370
+v 0.094343 0.837413 -0.427228
+v 0.094971 0.833279 -0.426448
+v 0.130677 0.843806 -0.415920
+v 0.130702 0.849903 -0.420711
+v 0.094989 0.839412 -0.431202
+v -0.044078 0.315740 0.481136
+v -0.060903 0.315333 0.478447
+v -0.043924 0.313675 0.479040
+v -0.029842 0.316225 0.483193
+v -0.044256 0.317800 0.483206
+v -0.061298 0.318162 0.481276
+v -0.060249 0.312529 0.475643
+v -0.030800 0.314708 0.481554
+v -0.029607 0.317661 0.484670
+v -0.041094 0.307866 0.473262
+v -0.056753 0.304380 0.467494
+v -0.039791 0.306018 0.471424
+v -0.027888 0.311069 0.478036
+v -0.042430 0.309732 0.475097
+v -0.058169 0.307041 0.470154
+v -0.055094 0.301791 0.464905
+v -0.026666 0.309902 0.476911
+v -0.029825 0.312134 0.478980
+v -0.035197 0.300809 0.466215
+v -0.048735 0.294560 0.457674
+v -0.033356 0.299226 0.464632
+v -0.023584 0.306457 0.473466
+v -0.036889 0.302473 0.467879
+v -0.051076 0.296871 0.459984
+v -0.046185 0.292363 0.455477
+v -0.022350 0.305410 0.472419
+v -0.024718 0.307558 0.474566
+v -0.027008 0.295033 0.460439
+v -0.037395 0.286542 0.449656
+v -0.024648 0.293840 0.459246
+v -0.018097 0.302637 0.469645
+v -0.029252 0.296332 0.461738
+v -0.040503 0.288345 0.451459
+v -0.034128 0.284886 0.448000
+v -0.016515 0.301848 0.468856
+v -0.019600 0.303496 0.470504
+v -0.016978 0.290949 0.456355
+v -0.023508 0.280873 0.443986
+v -0.014261 0.290227 0.455633
+v -0.011376 0.299935 0.466944
+v -0.019622 0.291794 0.457200
+v -0.027169 0.282045 0.445159
+v -0.019746 0.279871 0.442985
+v -0.009555 0.299458 0.466467
+v -0.013148 0.300494 0.467503
+v -0.005791 0.288835 0.454241
+v -0.008018 0.277938 0.441052
+v -0.002902 0.288634 0.454040
+v -0.003880 0.298537 0.465546
+v -0.008655 0.289168 0.454574
+v -0.011984 0.278401 0.441514
+v -0.004018 0.277659 0.440773
+v -0.001944 0.298404 0.465413
+v -0.005799 0.298758 0.465766
+v 0.005791 0.288835 0.454241
+v 0.008018 0.277938 0.441052
+v 0.008655 0.289168 0.454574
+v 0.003880 0.298537 0.465546
+v 0.002902 0.288634 0.454040
+v 0.004018 0.277659 0.440773
+v 0.011984 0.278401 0.441514
+v 0.005800 0.298758 0.465766
+v 0.001944 0.298404 0.465413
+v 0.016978 0.290949 0.456355
+v 0.023508 0.280873 0.443986
+v 0.019622 0.291794 0.457200
+v 0.011376 0.299935 0.466944
+v 0.014261 0.290227 0.455633
+v 0.019746 0.279871 0.442985
+v 0.027170 0.282045 0.445159
+v 0.013148 0.300494 0.467503
+v 0.009556 0.299458 0.466467
+v 0.027008 0.295033 0.460439
+v 0.037395 0.286542 0.449656
+v 0.029252 0.296332 0.461738
+v 0.018097 0.302637 0.469645
+v 0.024648 0.293840 0.459246
+v 0.034128 0.284886 0.448000
+v 0.040503 0.288345 0.451459
+v 0.019601 0.303496 0.470504
+v 0.016516 0.301848 0.468856
+v 0.035197 0.300809 0.466215
+v 0.048735 0.294560 0.457674
+v 0.036889 0.302473 0.467879
+v 0.023584 0.306457 0.473466
+v 0.033356 0.299226 0.464632
+v 0.046185 0.292363 0.455477
+v 0.051077 0.296871 0.459984
+v 0.024718 0.307558 0.474566
+v 0.022350 0.305410 0.472419
+v 0.041094 0.307866 0.473262
+v 0.056753 0.304380 0.467494
+v 0.042430 0.309732 0.475097
+v 0.027888 0.311069 0.478036
+v 0.039792 0.306018 0.471424
+v 0.055094 0.301791 0.464905
+v 0.058169 0.307041 0.470154
+v 0.029825 0.312134 0.478980
+v 0.026666 0.309902 0.476911
+v 0.044078 0.315740 0.481136
+v 0.060903 0.315333 0.478447
+v 0.044257 0.317800 0.483206
+v 0.029842 0.316225 0.483193
+v 0.043924 0.313675 0.479040
+v 0.060249 0.312529 0.475642
+v 0.061298 0.318162 0.481276
+v 0.029607 0.317661 0.484670
+v 0.030800 0.314708 0.481554
+v 0.044078 0.323983 0.489379
+v 0.060903 0.326672 0.489786
+v 0.043924 0.326079 0.491445
+v 0.029842 0.321926 0.488894
+v 0.044257 0.321913 0.487319
+v 0.061298 0.323844 0.486957
+v 0.060249 0.329477 0.492591
+v 0.030800 0.323566 0.490411
+v 0.029607 0.320450 0.487459
+v 0.041094 0.331858 0.497254
+v 0.056753 0.337625 0.500739
+v 0.039792 0.333696 0.499102
+v 0.027888 0.327083 0.494051
+v 0.042430 0.330023 0.495388
+v 0.058169 0.334965 0.498079
+v 0.055094 0.340215 0.503328
+v 0.026666 0.328209 0.495217
+v 0.029825 0.326140 0.492985
+v 0.035197 0.338905 0.504311
+v 0.048735 0.347445 0.510559
+v 0.033356 0.340488 0.505894
+v 0.023584 0.331654 0.498663
+v 0.036889 0.337241 0.502647
+v 0.051077 0.345135 0.508249
+v 0.046185 0.349643 0.512757
+v 0.022350 0.332701 0.499709
+v 0.024718 0.330553 0.497562
+v 0.027008 0.344681 0.510087
+v 0.037395 0.355463 0.518577
+v 0.024648 0.345873 0.511279
+v 0.018097 0.335474 0.502483
+v 0.029252 0.343382 0.508788
+v 0.040503 0.353660 0.516774
+v 0.034128 0.357119 0.520233
+v 0.016516 0.336263 0.503272
+v 0.019601 0.334615 0.501624
+v 0.016978 0.348765 0.514171
+v 0.023508 0.361133 0.524247
+v 0.014261 0.349486 0.514892
+v 0.011376 0.338175 0.505184
+v 0.019622 0.347920 0.513326
+v 0.027170 0.359960 0.523074
+v 0.019746 0.362135 0.525248
+v 0.009556 0.338653 0.505661
+v 0.013148 0.337617 0.504625
+v 0.005791 0.350879 0.516285
+v 0.008018 0.364068 0.527182
+v 0.002902 0.351080 0.516486
+v 0.003880 0.339574 0.506582
+v 0.008655 0.350545 0.515951
+v 0.011984 0.363605 0.526719
+v 0.004018 0.364347 0.527461
+v 0.001944 0.339707 0.506715
+v 0.005800 0.339353 0.506362
+v -0.005791 0.350879 0.516285
+v -0.008018 0.364068 0.527182
+v -0.008655 0.350545 0.515951
+v -0.003880 0.339574 0.506582
+v -0.002902 0.351080 0.516486
+v -0.004018 0.364347 0.527461
+v -0.011984 0.363605 0.526719
+v -0.005799 0.339353 0.506362
+v -0.001944 0.339707 0.506715
+v -0.016978 0.348765 0.514171
+v -0.023508 0.361133 0.524247
+v -0.019622 0.347920 0.513326
+v -0.011376 0.338175 0.505184
+v -0.014261 0.349486 0.514892
+v -0.019746 0.362135 0.525248
+v -0.027169 0.359960 0.523074
+v -0.013148 0.337617 0.504625
+v -0.009555 0.338652 0.505661
+v -0.027008 0.344681 0.510087
+v -0.037395 0.355463 0.518577
+v -0.029252 0.343382 0.508788
+v -0.018097 0.335474 0.502483
+v -0.024648 0.345873 0.511279
+v -0.034128 0.357119 0.520233
+v -0.040503 0.353660 0.516774
+v -0.019600 0.334615 0.501624
+v -0.016515 0.336263 0.503272
+v -0.035197 0.338905 0.504311
+v -0.048735 0.347445 0.510559
+v -0.036889 0.337241 0.502646
+v -0.023584 0.331654 0.498663
+v -0.033356 0.340488 0.505894
+v -0.046185 0.349643 0.512757
+v -0.051076 0.345135 0.508249
+v -0.024718 0.330553 0.497562
+v -0.022350 0.332701 0.499709
+v -0.041094 0.331858 0.497254
+v -0.056753 0.337625 0.500739
+v -0.042430 0.330023 0.495388
+v -0.027888 0.327083 0.494051
+v -0.039791 0.333696 0.499102
+v -0.055094 0.340215 0.503328
+v -0.058169 0.334965 0.498079
+v -0.029824 0.326140 0.492985
+v -0.026666 0.328209 0.495217
+v -0.044078 0.323983 0.489379
+v -0.060903 0.326672 0.489786
+v -0.044256 0.321913 0.487319
+v -0.029842 0.321926 0.488894
+v -0.043924 0.326079 0.491445
+v -0.060249 0.329477 0.492591
+v -0.061298 0.323844 0.486958
+v -0.029607 0.320450 0.487459
+v -0.030800 0.323566 0.490411
+v -0.001105 0.321340 0.490340
+v -0.001652 0.321305 0.490305
+v -0.000554 0.321361 0.490362
+v -0.001544 0.324897 0.493583
+v -0.002307 0.324825 0.493511
+v -0.001434 0.319282 0.488387
+v -0.000481 0.319304 0.488409
+v -0.000773 0.324940 0.493626
+v -0.003241 0.321117 0.490117
+v -0.003746 0.321027 0.490027
+v -0.002722 0.321193 0.490193
+v -0.004526 0.324442 0.493128
+v -0.005230 0.324260 0.492946
+v -0.003251 0.319173 0.488278
+v -0.002363 0.319238 0.488343
+v -0.003801 0.324597 0.493283
+v -0.005584 0.320547 0.489548
+v -0.004705 0.320811 0.489811
+v -0.007199 0.323562 0.492248
+v -0.007797 0.323283 0.491969
+v -0.004847 0.318984 0.488089
+v -0.004084 0.319088 0.488193
+v -0.006570 0.323819 0.492505
+v -0.007050 0.319898 0.488898
+v -0.006368 0.320241 0.489242
+v -0.009383 0.322319 0.491004
+v -0.009838 0.321960 0.490646
+v -0.006122 0.318729 0.487834
+v -0.005527 0.318864 0.487969
+v -0.008891 0.322660 0.491345
+v -0.008960 0.319484 0.488383
+v -0.007983 0.318614 0.487614
+v -0.007634 0.319523 0.488523
+v -0.011935 0.320987 0.489579
+v -0.012402 0.319757 0.488350
+v -0.011519 0.318863 0.487549
+v -0.006642 0.318582 0.487687
+v -0.010631 0.321197 0.489883
+v -0.015132 0.321148 0.489461
+v 0.001106 0.321340 0.490340
+v 0.000554 0.321361 0.490362
+v 0.001652 0.321305 0.490305
+v 0.001544 0.324897 0.493583
+v 0.000774 0.324940 0.493626
+v 0.000481 0.319304 0.488409
+v 0.001434 0.319282 0.488387
+v 0.002307 0.324825 0.493511
+v 0.003241 0.321117 0.490117
+v 0.002723 0.321193 0.490193
+v 0.003746 0.321027 0.490027
+v 0.004526 0.324442 0.493128
+v 0.003801 0.324597 0.493283
+v 0.002363 0.319238 0.488343
+v 0.003251 0.319173 0.488278
+v 0.005231 0.324260 0.492946
+v 0.005156 0.320685 0.489685
+v 0.007199 0.323562 0.492248
+v 0.006570 0.323819 0.492505
+v 0.004084 0.319088 0.488193
+v 0.004847 0.318984 0.488089
+v 0.007798 0.323283 0.491969
+v 0.006721 0.320074 0.489074
+v 0.009383 0.322319 0.491004
+v 0.008891 0.322660 0.491345
+v 0.005527 0.318864 0.487969
+v 0.006122 0.318729 0.487834
+v 0.009838 0.321960 0.490646
+v -0.008960 0.316737 0.485635
+v -0.011935 0.315540 0.484133
+v -0.007634 0.316596 0.485596
+v -0.007983 0.317505 0.486506
+v -0.012402 0.316770 0.485363
+v -0.015132 0.315659 0.483972
+v -0.010631 0.315237 0.483923
+v -0.006642 0.317432 0.486538
+v -0.011519 0.317571 0.486257
+v -0.007050 0.316221 0.485222
+v -0.009383 0.314115 0.482801
+v -0.006368 0.315878 0.484878
+v -0.005527 0.317150 0.486255
+v -0.006122 0.317285 0.486390
+v -0.009838 0.314473 0.483159
+v -0.008891 0.313774 0.482460
+v -0.005584 0.315572 0.484572
+v -0.007199 0.312871 0.481557
+v -0.004705 0.315308 0.484309
+v -0.004084 0.316927 0.486032
+v -0.004847 0.317030 0.486135
+v -0.007797 0.313151 0.481837
+v -0.006570 0.312614 0.481300
+v -0.003241 0.315003 0.484003
+v -0.003746 0.315092 0.484092
+v -0.004526 0.311992 0.480678
+v -0.002722 0.314926 0.483927
+v -0.002363 0.316777 0.485882
+v -0.003251 0.316842 0.485947
+v -0.005230 0.312174 0.480860
+v -0.003801 0.311836 0.480522
+v -0.001105 0.314779 0.483779
+v -0.001652 0.314814 0.483815
+v -0.001544 0.311537 0.480222
+v -0.000554 0.314758 0.483758
+v -0.000481 0.316711 0.485816
+v -0.001434 0.316733 0.485838
+v -0.002307 0.311608 0.480294
+v -0.000773 0.311493 0.480179
+v 0.001106 0.314779 0.483779
+v 0.000554 0.314758 0.483758
+v 0.001544 0.311537 0.480222
+v 0.001652 0.314814 0.483815
+v 0.001434 0.316733 0.485838
+v 0.000481 0.316711 0.485816
+v 0.000774 0.311493 0.480179
+v 0.002307 0.311608 0.480294
+v 0.003241 0.315003 0.484003
+v 0.002723 0.314926 0.483927
+v 0.004526 0.311992 0.480678
+v 0.003746 0.315092 0.484092
+v 0.003251 0.316842 0.485947
+v 0.002363 0.316777 0.485882
+v 0.003801 0.311836 0.480522
+v 0.005231 0.312174 0.480860
+v 0.005156 0.315435 0.484435
+v 0.007199 0.312871 0.481557
+v 0.004847 0.317030 0.486135
+v 0.004084 0.316927 0.486032
+v 0.006570 0.312614 0.481300
+v 0.007798 0.313151 0.481837
+v 0.006721 0.316045 0.485046
+v 0.009383 0.314115 0.482801
+v 0.006122 0.317285 0.486390
+v 0.005527 0.317150 0.486256
+v 0.008891 0.313774 0.482460
+v 0.009838 0.314473 0.483159
+v 0.008961 0.316737 0.485635
+v 0.007983 0.317505 0.486506
+v 0.011935 0.315540 0.484133
+v 0.012402 0.316770 0.485363
+v 0.011519 0.317571 0.486257
+v 0.006642 0.317432 0.486538
+v 0.010631 0.315237 0.483923
+v 0.015132 0.315659 0.483972
+v -0.036185 0.400305 0.411646
+v -0.036058 0.402042 0.413358
+v -0.024498 0.398607 0.411238
+v -0.036331 0.398590 0.409939
+v -0.049997 0.402525 0.411992
+v -0.049460 0.404849 0.414317
+v -0.025284 0.399965 0.412496
+v -0.024305 0.397383 0.410048
+v -0.050321 0.400181 0.409648
+v -0.033735 0.406832 0.418172
+v -0.032666 0.408355 0.419704
+v -0.022894 0.402880 0.415512
+v -0.034832 0.405310 0.416626
+v -0.046590 0.411603 0.421070
+v -0.045228 0.413749 0.423216
+v -0.021891 0.403814 0.416478
+v -0.024484 0.402098 0.414629
+v -0.047752 0.409398 0.418865
+v -0.028894 0.412672 0.424021
+v -0.027382 0.413984 0.425333
+v -0.019361 0.406669 0.419334
+v -0.030283 0.411293 0.422642
+v -0.040007 0.419741 0.429209
+v -0.037914 0.421563 0.431030
+v -0.018348 0.407537 0.420201
+v -0.020292 0.405757 0.418421
+v -0.041930 0.417827 0.427294
+v -0.022171 0.417459 0.428808
+v -0.020234 0.418448 0.429797
+v -0.014856 0.409835 0.422500
+v -0.024014 0.416382 0.427731
+v -0.030699 0.426387 0.435854
+v -0.028017 0.427759 0.437226
+v -0.013558 0.410489 0.423153
+v -0.016090 0.409123 0.421788
+v -0.033250 0.424892 0.434359
+v -0.013937 0.420844 0.432193
+v -0.011707 0.421442 0.432791
+v -0.009339 0.412074 0.424738
+v -0.016108 0.420144 0.431493
+v -0.019298 0.431085 0.440553
+v -0.016210 0.431916 0.441383
+v -0.007844 0.412469 0.425134
+v -0.010793 0.411611 0.424275
+v -0.022304 0.430113 0.439581
+v -0.004754 0.422596 0.433945
+v -0.002382 0.422762 0.434111
+v -0.003185 0.413233 0.425897
+v -0.007105 0.422320 0.433669
+v -0.006582 0.433518 0.442985
+v -0.003298 0.433749 0.443216
+v -0.001596 0.413343 0.426007
+v -0.004761 0.413050 0.425714
+v -0.009838 0.433134 0.442602
+v 0.004754 0.422596 0.433945
+v 0.007105 0.422320 0.433669
+v 0.003185 0.413233 0.425897
+v 0.002382 0.422762 0.434111
+v 0.006582 0.433518 0.442985
+v 0.009838 0.433134 0.442602
+v 0.004761 0.413050 0.425714
+v 0.001596 0.413343 0.426007
+v 0.003298 0.433749 0.443216
+v 0.013938 0.420844 0.432193
+v 0.016109 0.420144 0.431493
+v 0.009339 0.412074 0.424738
+v 0.011707 0.421442 0.432791
+v 0.019298 0.431085 0.440553
+v 0.022304 0.430113 0.439581
+v 0.010794 0.411611 0.424275
+v 0.007844 0.412469 0.425134
+v 0.016210 0.431916 0.441383
+v 0.022171 0.417459 0.428808
+v 0.024014 0.416382 0.427731
+v 0.014856 0.409835 0.422500
+v 0.020234 0.418448 0.429796
+v 0.030699 0.426387 0.435854
+v 0.033250 0.424892 0.434359
+v 0.016091 0.409123 0.421788
+v 0.013558 0.410489 0.423153
+v 0.028017 0.427759 0.437226
+v 0.028894 0.412672 0.424021
+v 0.030283 0.411293 0.422642
+v 0.019361 0.406669 0.419333
+v 0.027383 0.413984 0.425333
+v 0.040007 0.419741 0.429209
+v 0.041930 0.417827 0.427294
+v 0.020292 0.405757 0.418421
+v 0.018348 0.407537 0.420201
+v 0.037914 0.421563 0.431030
+v 0.033735 0.406832 0.418172
+v 0.034832 0.405310 0.416626
+v 0.022894 0.402880 0.415512
+v 0.032666 0.408355 0.419704
+v 0.046590 0.411603 0.421070
+v 0.047752 0.409398 0.418865
+v 0.024484 0.402098 0.414629
+v 0.021891 0.403814 0.416478
+v 0.045228 0.413749 0.423216
+v 0.036185 0.400305 0.411646
+v 0.036331 0.398590 0.409939
+v 0.024498 0.398607 0.411238
+v 0.036058 0.402042 0.413358
+v 0.049997 0.402525 0.411992
+v 0.050321 0.400181 0.409648
+v 0.024305 0.397383 0.410048
+v 0.025284 0.399965 0.412496
+v 0.049460 0.404849 0.414317
+v 0.036185 0.393474 0.404814
+v 0.036058 0.391762 0.403077
+v 0.024498 0.393882 0.406513
+v 0.036331 0.395181 0.406530
+v 0.049997 0.393127 0.402594
+v 0.049460 0.390803 0.400270
+v 0.025284 0.392624 0.405155
+v 0.024305 0.395072 0.407736
+v 0.050321 0.395472 0.404939
+v 0.033735 0.386947 0.398288
+v 0.032666 0.385416 0.396764
+v 0.022894 0.389608 0.402239
+v 0.034832 0.388494 0.399809
+v 0.046590 0.384050 0.393517
+v 0.045228 0.381904 0.391371
+v 0.021891 0.388641 0.401306
+v 0.024484 0.390491 0.403022
+v 0.047752 0.386254 0.395722
+v 0.028894 0.381099 0.392448
+v 0.027383 0.379787 0.391136
+v 0.019361 0.385786 0.398451
+v 0.030283 0.382478 0.393827
+v 0.040007 0.375911 0.385378
+v 0.037914 0.374090 0.383557
+v 0.018348 0.384918 0.397583
+v 0.020292 0.386698 0.399363
+v 0.041930 0.377826 0.387293
+v 0.022171 0.376312 0.387661
+v 0.020234 0.375323 0.386672
+v 0.014856 0.382620 0.395284
+v 0.024014 0.377388 0.388737
+v 0.030699 0.369266 0.378733
+v 0.028017 0.367893 0.377360
+v 0.013558 0.381966 0.394631
+v 0.016091 0.383332 0.395996
+v 0.033250 0.370760 0.380227
+v 0.013938 0.372927 0.384276
+v 0.011707 0.372329 0.383678
+v 0.009339 0.380381 0.393046
+v 0.016109 0.373627 0.384976
+v 0.019298 0.364567 0.374034
+v 0.016210 0.363737 0.373204
+v 0.007844 0.379986 0.392650
+v 0.010794 0.380844 0.393509
+v 0.022304 0.365539 0.375006
+v 0.004754 0.371175 0.382524
+v 0.002382 0.371008 0.382357
+v 0.003185 0.379222 0.391887
+v 0.007105 0.371451 0.382800
+v 0.006582 0.362134 0.371602
+v 0.003298 0.361903 0.371371
+v 0.001596 0.379112 0.391777
+v 0.004761 0.379405 0.392070
+v 0.009838 0.362518 0.371985
+v -0.004754 0.371175 0.382524
+v -0.007105 0.371451 0.382800
+v -0.003185 0.379222 0.391887
+v -0.002382 0.371008 0.382357
+v -0.006582 0.362134 0.371602
+v -0.009838 0.362518 0.371985
+v -0.004761 0.379405 0.392070
+v -0.001596 0.379112 0.391777
+v -0.003298 0.361903 0.371370
+v -0.013937 0.372927 0.384276
+v -0.016108 0.373627 0.384976
+v -0.009339 0.380381 0.393046
+v -0.011707 0.372329 0.383678
+v -0.019298 0.364567 0.374034
+v -0.022304 0.365539 0.375006
+v -0.010793 0.380844 0.393509
+v -0.007844 0.379986 0.392650
+v -0.016210 0.363737 0.373204
+v -0.022171 0.376312 0.387661
+v -0.024014 0.377388 0.388737
+v -0.014856 0.382620 0.395284
+v -0.020234 0.375323 0.386672
+v -0.030699 0.369266 0.378733
+v -0.033250 0.370760 0.380227
+v -0.016090 0.383332 0.395996
+v -0.013558 0.381966 0.394631
+v -0.028017 0.367893 0.377360
+v -0.028894 0.381099 0.392448
+v -0.030283 0.382478 0.393827
+v -0.019361 0.385786 0.398451
+v -0.027382 0.379787 0.391136
+v -0.040007 0.375911 0.385378
+v -0.041930 0.377826 0.387293
+v -0.020292 0.386698 0.399363
+v -0.018348 0.384918 0.397583
+v -0.037914 0.374090 0.383557
+v -0.033735 0.386947 0.398288
+v -0.034832 0.388494 0.399809
+v -0.022894 0.389608 0.402239
+v -0.032666 0.385415 0.396764
+v -0.046590 0.384050 0.393517
+v -0.047752 0.386254 0.395722
+v -0.024484 0.390491 0.403022
+v -0.021891 0.388641 0.401306
+v -0.045228 0.381904 0.391371
+v -0.036185 0.393474 0.404814
+v -0.036331 0.395181 0.406530
+v -0.024498 0.393882 0.406513
+v -0.036058 0.391762 0.403077
+v -0.049997 0.393127 0.402594
+v -0.050321 0.395472 0.404939
+v -0.024305 0.395072 0.407736
+v -0.025284 0.392624 0.405155
+v -0.049460 0.390803 0.400270
+v 0.000455 0.392673 0.406973
+v 0.000788 0.394299 0.408685
+v 0.001356 0.392720 0.407020
+v 0.001267 0.390002 0.404044
+v 0.000635 0.389967 0.404008
+v 0.001894 0.390062 0.404103
+v 0.002235 0.392813 0.407113
+v 0.002309 0.394372 0.408758
+v 0.003075 0.392950 0.407250
+v 0.003715 0.390380 0.404421
+v 0.003121 0.390251 0.404293
+v 0.004294 0.390531 0.404572
+v 0.003863 0.393130 0.407429
+v 0.003674 0.394512 0.408898
+v 0.004584 0.393348 0.407648
+v 0.005910 0.391109 0.405150
+v 0.005394 0.390896 0.404937
+v 0.006401 0.391340 0.405382
+v 0.005227 0.393602 0.407901
+v 0.004789 0.394711 0.409097
+v 0.005787 0.393886 0.408186
+v 0.007703 0.392139 0.406181
+v 0.007299 0.391857 0.405898
+v 0.008076 0.392437 0.406478
+v 0.007356 0.394313 0.408529
+v 0.006267 0.394197 0.408497
+v 0.006553 0.394951 0.409250
+v 0.010181 0.394340 0.408304
+v 0.009798 0.393320 0.407285
+v 0.008727 0.393069 0.407111
+v 0.005453 0.394891 0.409276
+v 0.009457 0.395004 0.409045
+v 0.012422 0.393418 0.407153
+v -0.001356 0.392720 0.407020
+v -0.000788 0.394299 0.408685
+v -0.000455 0.392673 0.406973
+v -0.001267 0.390002 0.404044
+v -0.001894 0.390062 0.404103
+v -0.000635 0.389967 0.404008
+v -0.003075 0.392950 0.407250
+v -0.002309 0.394372 0.408758
+v -0.002235 0.392813 0.407113
+v -0.003715 0.390380 0.404421
+v -0.004294 0.390531 0.404572
+v -0.003121 0.390251 0.404293
+v -0.004584 0.393348 0.407648
+v -0.003673 0.394512 0.408898
+v -0.003863 0.393130 0.407429
+v -0.005910 0.391109 0.405150
+v -0.006401 0.391340 0.405382
+v -0.005394 0.390896 0.404937
+v -0.005787 0.393886 0.408186
+v -0.004789 0.394711 0.409097
+v -0.005227 0.393602 0.407901
+v -0.007703 0.392139 0.406181
+v -0.008076 0.392436 0.406478
+v -0.007299 0.391857 0.405898
+v -0.007356 0.396590 0.410806
+v -0.006553 0.395869 0.410169
+v -0.010181 0.396815 0.410780
+v -0.009798 0.397834 0.411799
+v -0.006267 0.396623 0.410922
+v -0.005453 0.395843 0.410229
+v -0.009456 0.396074 0.410116
+v -0.012422 0.397966 0.411702
+v -0.008727 0.398009 0.412050
+v -0.004789 0.396022 0.410408
+v -0.005787 0.396933 0.411233
+v -0.007703 0.398939 0.412980
+v -0.005227 0.397218 0.411518
+v -0.008076 0.398641 0.412683
+v -0.007299 0.399221 0.413262
+v -0.003673 0.396221 0.410607
+v -0.004584 0.397472 0.411771
+v -0.005910 0.399969 0.414011
+v -0.003863 0.397690 0.411990
+v -0.006401 0.399738 0.413779
+v -0.005394 0.400182 0.414224
+v -0.002309 0.396362 0.410748
+v -0.003075 0.397869 0.412169
+v -0.003715 0.400698 0.414740
+v -0.002235 0.398007 0.412306
+v -0.004294 0.400547 0.414589
+v -0.003121 0.400827 0.414868
+v -0.000788 0.396435 0.410820
+v -0.001356 0.398099 0.412399
+v -0.001267 0.401076 0.415117
+v -0.000455 0.398146 0.412446
+v -0.001894 0.401016 0.415057
+v -0.000635 0.401111 0.415153
+v 0.000788 0.396435 0.410820
+v 0.000455 0.398146 0.412446
+v 0.001267 0.401076 0.415117
+v 0.001356 0.398099 0.412399
+v 0.000635 0.401111 0.415153
+v 0.001894 0.401016 0.415057
+v 0.002309 0.396362 0.410748
+v 0.002235 0.398007 0.412306
+v 0.003715 0.400698 0.414740
+v 0.003075 0.397869 0.412169
+v 0.003121 0.400827 0.414868
+v 0.004294 0.400547 0.414589
+v 0.003674 0.396221 0.410607
+v 0.003863 0.397690 0.411990
+v 0.005910 0.399969 0.414011
+v 0.004584 0.397472 0.411771
+v 0.005394 0.400182 0.414224
+v 0.006401 0.399738 0.413779
+v 0.004789 0.396022 0.410408
+v 0.005227 0.397218 0.411518
+v 0.007703 0.398939 0.412980
+v 0.005787 0.396933 0.411233
+v 0.007299 0.399221 0.413262
+v 0.008076 0.398641 0.412683
+v 0.007356 0.396590 0.410806
+v 0.006553 0.395869 0.410169
+v 0.006267 0.396623 0.410922
+v 0.009798 0.397834 0.411799
+v 0.010181 0.396815 0.410780
+v 0.009457 0.396074 0.410116
+v 0.005453 0.395843 0.410229
+v 0.008727 0.398009 0.412050
+v 0.012422 0.397966 0.411702
+v -0.058822 0.419814 0.426722
+v -0.060593 0.417023 0.423931
+v -0.062105 0.414155 0.421064
+v -0.049310 0.429976 0.436885
+v -0.052032 0.427608 0.434516
+v -0.054533 0.425117 0.432026
+v -0.036437 0.438035 0.444944
+v -0.039926 0.436250 0.443159
+v -0.043244 0.434307 0.441215
+v -0.021082 0.443441 0.450350
+v -0.025098 0.442362 0.449270
+v -0.029008 0.441097 0.448006
+v -0.004289 0.445826 0.452734
+v -0.008561 0.445525 0.452433
+v -0.012795 0.445026 0.451935
+v 0.012795 0.445026 0.451935
+v 0.008561 0.445525 0.452433
+v 0.004289 0.445826 0.452734
+v 0.029008 0.441097 0.448006
+v 0.025098 0.442362 0.449270
+v 0.021082 0.443441 0.450350
+v 0.043244 0.434307 0.441215
+v 0.039926 0.436250 0.443159
+v 0.036438 0.438035 0.444944
+v 0.054533 0.425117 0.432026
+v 0.052032 0.427608 0.434516
+v 0.049310 0.429976 0.436885
+v 0.062105 0.414155 0.421064
+v 0.060593 0.417023 0.423931
+v 0.058822 0.419814 0.426722
+v 0.065445 0.402168 0.409076
+v 0.065024 0.405217 0.412125
+v 0.064326 0.408240 0.415148
+v 0.064326 0.389971 0.396880
+v 0.065024 0.392994 0.399903
+v 0.065445 0.396043 0.402952
+v 0.058822 0.378397 0.385306
+v 0.060593 0.381188 0.388097
+v 0.062105 0.384056 0.390964
+v 0.049310 0.368235 0.375143
+v 0.052032 0.370603 0.377512
+v 0.054533 0.373094 0.380002
+v 0.036438 0.360176 0.367084
+v 0.039926 0.361961 0.368869
+v 0.043244 0.363904 0.370813
+v 0.021082 0.354770 0.361678
+v 0.025098 0.355849 0.362758
+v 0.029008 0.357114 0.364022
+v 0.004289 0.352385 0.359294
+v 0.008561 0.352686 0.359595
+v 0.012795 0.353185 0.360093
+v -0.012795 0.353185 0.360093
+v -0.008561 0.352686 0.359595
+v -0.004289 0.352385 0.359294
+v -0.029008 0.357114 0.364022
+v -0.025098 0.355849 0.362758
+v -0.021082 0.354770 0.361678
+v -0.043244 0.363904 0.370813
+v -0.039926 0.361961 0.368869
+v -0.036437 0.360176 0.367084
+v -0.054533 0.373093 0.380002
+v -0.052032 0.370603 0.377512
+v -0.049310 0.368235 0.375143
+v -0.062105 0.384056 0.390964
+v -0.060593 0.381188 0.388097
+v -0.058822 0.378397 0.385306
+v -0.065445 0.396043 0.402952
+v -0.065024 0.392994 0.399903
+v -0.064326 0.389971 0.396880
+v -0.064326 0.408240 0.415148
+v -0.065024 0.405217 0.412125
+v -0.065445 0.402168 0.409076
+v -0.121377 0.437507 0.426438
+v -0.118422 0.443111 0.432042
+v -0.114961 0.448566 0.437497
+v -0.106578 0.458932 0.447863
+v -0.101691 0.463798 0.452730
+v -0.096370 0.468428 0.457359
+v -0.084515 0.476891 0.465822
+v -0.078030 0.480689 0.469620
+v -0.071213 0.484178 0.473109
+v -0.056693 0.490162 0.479093
+v -0.049052 0.492633 0.481564
+v -0.041202 0.494743 0.483674
+v -0.025007 0.497841 0.486772
+v -0.016731 0.498816 0.487747
+v -0.008383 0.499403 0.488334
+v 0.008383 0.499403 0.488334
+v 0.016731 0.498816 0.487747
+v 0.025007 0.497841 0.486772
+v 0.041202 0.494743 0.483674
+v 0.049052 0.492633 0.481564
+v 0.056693 0.490162 0.479093
+v 0.071213 0.484178 0.473109
+v 0.078030 0.480689 0.469620
+v 0.084515 0.476891 0.465822
+v 0.096371 0.468428 0.457359
+v 0.101691 0.463798 0.452730
+v 0.106578 0.458932 0.447863
+v 0.114961 0.448566 0.437497
+v 0.118422 0.443111 0.432042
+v 0.121377 0.437507 0.426438
+v 0.125717 0.425946 0.414877
+v 0.127082 0.420038 0.408969
+v 0.127905 0.414079 0.403010
+v 0.127905 0.402110 0.391041
+v 0.127082 0.396150 0.385082
+v 0.125717 0.390242 0.379173
+v 0.121377 0.378681 0.367612
+v 0.118422 0.373077 0.362008
+v 0.114961 0.367623 0.356554
+v 0.106578 0.357257 0.346188
+v 0.101691 0.352390 0.341321
+v 0.096371 0.347761 0.336692
+v 0.084515 0.339297 0.328228
+v 0.078030 0.335499 0.324430
+v 0.071213 0.332011 0.320942
+v 0.056693 0.326026 0.314957
+v 0.049052 0.323555 0.312486
+v 0.041202 0.321445 0.310377
+v 0.025007 0.318348 0.307279
+v 0.016731 0.317373 0.306304
+v 0.008383 0.316785 0.305716
+v -0.008383 0.316785 0.305716
+v -0.016731 0.317373 0.306304
+v -0.025007 0.318348 0.307279
+v -0.041202 0.321445 0.310377
+v -0.049052 0.323555 0.312486
+v -0.056693 0.326026 0.314957
+v -0.071213 0.332011 0.320942
+v -0.078030 0.335499 0.324430
+v -0.084515 0.339297 0.328228
+v -0.096371 0.347761 0.336692
+v -0.101691 0.352390 0.341321
+v -0.106578 0.357257 0.346188
+v -0.114961 0.367622 0.356554
+v -0.118422 0.373077 0.362008
+v -0.121377 0.378681 0.367612
+v -0.125717 0.390242 0.379173
+v -0.127082 0.396150 0.385082
+v -0.127905 0.402110 0.391041
+v -0.127905 0.414079 0.403010
+v -0.127082 0.420038 0.408969
+v -0.125717 0.425946 0.414877
+v -0.179465 0.466467 0.425632
+v -0.175096 0.474753 0.433918
+v -0.169978 0.482818 0.441983
+v -0.157583 0.498144 0.457309
+v -0.150358 0.505340 0.464505
+v -0.142491 0.512185 0.471350
+v -0.124962 0.524699 0.483864
+v -0.115374 0.530315 0.489480
+v -0.105293 0.535473 0.494638
+v -0.083824 0.544321 0.503486
+v -0.072527 0.547974 0.507139
+v -0.060920 0.551094 0.510259
+v -0.036974 0.555674 0.514839
+v -0.024738 0.557116 0.516281
+v -0.012395 0.557984 0.517149
+v 0.012395 0.557984 0.517149
+v 0.024738 0.557116 0.516281
+v 0.036974 0.555674 0.514839
+v 0.060920 0.551094 0.510259
+v 0.072527 0.547974 0.507139
+v 0.083824 0.544321 0.503486
+v 0.105293 0.535473 0.494638
+v 0.115374 0.530315 0.489480
+v 0.124962 0.524699 0.483864
+v 0.142491 0.512185 0.471350
+v 0.150358 0.505340 0.464505
+v 0.157583 0.498144 0.457309
+v 0.169978 0.482818 0.441983
+v 0.175096 0.474753 0.433918
+v 0.179466 0.466467 0.425632
+v 0.185882 0.449372 0.408538
+v 0.187901 0.440637 0.399802
+v 0.189118 0.431826 0.390991
+v 0.189118 0.414129 0.373294
+v 0.187901 0.405318 0.364483
+v 0.185882 0.396582 0.355747
+v 0.179466 0.379488 0.338653
+v 0.175096 0.371202 0.330367
+v 0.169978 0.363137 0.322302
+v 0.157583 0.347810 0.306975
+v 0.150358 0.340614 0.299779
+v 0.142491 0.333770 0.292935
+v 0.124962 0.321256 0.280421
+v 0.115374 0.315640 0.274805
+v 0.105293 0.310482 0.269647
+v 0.083824 0.301633 0.260798
+v 0.072527 0.297980 0.257145
+v 0.060920 0.294860 0.254026
+v 0.036974 0.290280 0.249445
+v 0.024738 0.288839 0.248004
+v 0.012395 0.287970 0.247135
+v -0.012395 0.287970 0.247135
+v -0.024738 0.288839 0.248004
+v -0.036974 0.290280 0.249445
+v -0.060920 0.294860 0.254026
+v -0.072527 0.297980 0.257145
+v -0.083824 0.301633 0.260798
+v -0.105293 0.310482 0.269647
+v -0.115374 0.315640 0.274805
+v -0.124962 0.321256 0.280421
+v -0.142491 0.333770 0.292935
+v -0.150358 0.340614 0.299779
+v -0.157583 0.347810 0.306975
+v -0.169978 0.363137 0.322302
+v -0.175096 0.371202 0.330367
+v -0.179466 0.379488 0.338653
+v -0.185882 0.396582 0.355747
+v -0.187901 0.405318 0.364483
+v -0.189118 0.414129 0.373294
+v -0.189118 0.431826 0.390991
+v -0.187901 0.440637 0.399802
+v -0.185882 0.449372 0.408538
+v -0.234483 0.500278 0.418486
+v -0.228773 0.511104 0.429312
+v -0.222087 0.521641 0.439849
+v -0.205892 0.541666 0.459874
+v -0.196452 0.551068 0.469276
+v -0.186174 0.560011 0.478219
+v -0.163270 0.576361 0.494569
+v -0.150743 0.583699 0.501907
+v -0.137572 0.590438 0.508646
+v -0.109522 0.601999 0.520207
+v -0.094761 0.606772 0.524980
+v -0.079596 0.610848 0.529056
+v -0.048309 0.616833 0.535041
+v -0.032321 0.618716 0.536924
+v -0.016195 0.619851 0.538059
+v 0.016195 0.619851 0.538059
+v 0.032321 0.618716 0.536924
+v 0.048309 0.616833 0.535041
+v 0.079596 0.610848 0.529056
+v 0.094761 0.606772 0.524980
+v 0.109522 0.601999 0.520207
+v 0.137572 0.590438 0.508646
+v 0.150743 0.583699 0.501907
+v 0.163270 0.576361 0.494569
+v 0.186174 0.560011 0.478219
+v 0.196452 0.551068 0.469276
+v 0.205892 0.541666 0.459874
+v 0.222087 0.521641 0.439849
+v 0.228774 0.511104 0.429312
+v 0.234483 0.500278 0.418486
+v 0.242866 0.477943 0.396151
+v 0.245504 0.466529 0.384737
+v 0.247094 0.455017 0.373225
+v 0.247094 0.431894 0.350102
+v 0.245504 0.420382 0.338590
+v 0.242866 0.408969 0.327177
+v 0.234483 0.386634 0.304842
+v 0.228774 0.375808 0.294016
+v 0.222087 0.365270 0.283479
+v 0.205892 0.345246 0.263454
+v 0.196452 0.335843 0.254051
+v 0.186174 0.326900 0.245109
+v 0.163270 0.310550 0.228758
+v 0.150743 0.303212 0.221421
+v 0.137572 0.296473 0.214682
+v 0.109522 0.284912 0.203120
+v 0.094761 0.280139 0.198347
+v 0.079596 0.276063 0.194271
+v 0.048309 0.270078 0.188287
+v 0.032321 0.268195 0.186403
+v 0.016195 0.267060 0.185268
+v -0.016195 0.267060 0.185268
+v -0.032321 0.268195 0.186403
+v -0.048309 0.270078 0.188287
+v -0.079596 0.276063 0.194271
+v -0.094761 0.280139 0.198347
+v -0.109522 0.284912 0.203120
+v -0.137572 0.296473 0.214682
+v -0.150743 0.303212 0.221421
+v -0.163270 0.310550 0.228758
+v -0.186174 0.326900 0.245109
+v -0.196452 0.335843 0.254051
+v -0.205892 0.345246 0.263454
+v -0.222087 0.365270 0.283479
+v -0.228773 0.375808 0.294016
+v -0.234483 0.386634 0.304842
+v -0.242866 0.408969 0.327177
+v -0.245504 0.420382 0.338590
+v -0.247094 0.431894 0.350102
+v -0.247094 0.455017 0.373225
+v -0.245504 0.466529 0.384737
+v -0.242866 0.477943 0.396151
+v -0.285488 0.538361 0.405122
+v -0.278537 0.551542 0.418303
+v -0.270396 0.564371 0.431133
+v -0.250678 0.588752 0.455513
+v -0.239185 0.600200 0.466961
+v -0.226671 0.611088 0.477849
+v -0.198785 0.630995 0.497756
+v -0.183533 0.639928 0.506689
+v -0.167498 0.648133 0.514894
+v -0.133345 0.662210 0.528971
+v -0.115374 0.668021 0.534782
+v -0.096910 0.672983 0.539744
+v -0.058818 0.680270 0.547031
+v -0.039352 0.682563 0.549324
+v -0.019718 0.683945 0.550706
+v 0.019718 0.683945 0.550706
+v 0.039352 0.682563 0.549324
+v 0.058818 0.680270 0.547031
+v 0.096910 0.672983 0.539744
+v 0.115374 0.668021 0.534782
+v 0.133345 0.662210 0.528971
+v 0.167498 0.648133 0.514894
+v 0.183533 0.639928 0.506689
+v 0.198785 0.630995 0.497756
+v 0.226671 0.611088 0.477849
+v 0.239185 0.600200 0.466961
+v 0.250679 0.588752 0.455513
+v 0.270397 0.564371 0.431133
+v 0.278537 0.551542 0.418303
+v 0.285489 0.538361 0.405122
+v 0.295695 0.511168 0.377929
+v 0.298907 0.497272 0.364033
+v 0.300843 0.483255 0.350016
+v 0.300843 0.455103 0.321864
+v 0.298907 0.441087 0.307848
+v 0.295695 0.427190 0.293951
+v 0.285489 0.399997 0.266758
+v 0.278537 0.386816 0.253577
+v 0.270397 0.373987 0.240748
+v 0.250679 0.349606 0.216367
+v 0.239185 0.338159 0.204920
+v 0.226671 0.327270 0.194032
+v 0.198785 0.307364 0.174125
+v 0.183533 0.298430 0.165191
+v 0.167498 0.290225 0.156986
+v 0.133345 0.276149 0.142910
+v 0.115374 0.270337 0.137099
+v 0.096910 0.265375 0.132136
+v 0.058818 0.258088 0.124850
+v 0.039352 0.255796 0.122557
+v 0.019718 0.254414 0.121175
+v -0.019718 0.254414 0.121175
+v -0.039352 0.255796 0.122557
+v -0.058818 0.258088 0.124850
+v -0.096910 0.265375 0.132136
+v -0.115374 0.270337 0.137099
+v -0.133345 0.276149 0.142910
+v -0.167498 0.290225 0.156986
+v -0.183533 0.298430 0.165191
+v -0.198785 0.307364 0.174125
+v -0.226671 0.327270 0.194032
+v -0.239185 0.338159 0.204920
+v -0.250679 0.349606 0.216367
+v -0.270397 0.373987 0.240748
+v -0.278537 0.386816 0.253577
+v -0.285489 0.399997 0.266758
+v -0.295695 0.427190 0.293952
+v -0.298907 0.441087 0.307848
+v -0.300843 0.455103 0.321864
+v -0.300843 0.483255 0.350017
+v -0.298907 0.497272 0.364033
+v -0.295695 0.511168 0.377929
+v -0.331609 0.580066 0.385770
+v -0.323534 0.595376 0.401081
+v -0.314079 0.610278 0.415983
+v -0.291176 0.638598 0.444302
+v -0.277825 0.651894 0.457599
+v -0.263289 0.664542 0.470246
+v -0.230899 0.687664 0.493369
+v -0.213183 0.698041 0.503746
+v -0.194557 0.707572 0.513276
+v -0.154887 0.723922 0.529626
+v -0.134012 0.730672 0.536376
+v -0.112566 0.736436 0.542141
+v -0.068320 0.744900 0.550604
+v -0.045709 0.747563 0.553267
+v -0.022903 0.749168 0.554873
+v 0.022903 0.749168 0.554873
+v 0.045709 0.747563 0.553267
+v 0.068320 0.744900 0.550604
+v 0.112566 0.736436 0.542141
+v 0.134012 0.730672 0.536376
+v 0.154887 0.723922 0.529626
+v 0.194557 0.707572 0.513276
+v 0.213183 0.698041 0.503746
+v 0.230899 0.687664 0.493369
+v 0.263289 0.664542 0.470246
+v 0.277825 0.651895 0.457599
+v 0.291176 0.638598 0.444302
+v 0.314079 0.610278 0.415982
+v 0.323535 0.595376 0.401080
+v 0.331609 0.580066 0.385770
+v 0.343465 0.548480 0.354184
+v 0.347195 0.532338 0.338043
+v 0.349444 0.516058 0.321762
+v 0.349444 0.483357 0.289062
+v 0.347195 0.467077 0.272781
+v 0.343465 0.450935 0.256640
+v 0.331609 0.419349 0.225054
+v 0.323535 0.404039 0.209743
+v 0.314079 0.389137 0.194841
+v 0.291176 0.360817 0.166522
+v 0.277825 0.347521 0.153225
+v 0.263289 0.334873 0.140578
+v 0.230899 0.311751 0.117455
+v 0.213183 0.301374 0.107078
+v 0.194557 0.291843 0.097548
+v 0.154887 0.275493 0.081197
+v 0.134012 0.268743 0.074447
+v 0.112566 0.262979 0.068683
+v 0.068320 0.254515 0.060220
+v 0.045709 0.251852 0.057556
+v 0.022903 0.250247 0.055951
+v -0.022903 0.250247 0.055951
+v -0.045709 0.251852 0.057556
+v -0.068320 0.254515 0.060220
+v -0.112566 0.262979 0.068683
+v -0.134012 0.268743 0.074447
+v -0.154887 0.275493 0.081197
+v -0.194557 0.291843 0.097548
+v -0.213183 0.301374 0.107078
+v -0.230899 0.311751 0.117455
+v -0.263289 0.334873 0.140578
+v -0.277825 0.347521 0.153225
+v -0.291176 0.360817 0.166522
+v -0.314079 0.389137 0.194841
+v -0.323535 0.404039 0.209743
+v -0.331609 0.419349 0.225054
+v -0.343465 0.450935 0.256640
+v -0.347195 0.467077 0.272781
+v -0.349444 0.483357 0.289062
+v -0.349444 0.516058 0.321762
+v -0.347195 0.532338 0.338043
+v -0.343465 0.548480 0.354184
+v -0.372056 0.624678 0.360761
+v -0.362996 0.641856 0.377938
+v -0.352387 0.658576 0.394658
+v -0.326691 0.690349 0.426431
+v -0.311712 0.705268 0.441350
+v -0.295403 0.719458 0.455540
+v -0.259062 0.745401 0.481483
+v -0.239185 0.757043 0.493125
+v -0.218287 0.767736 0.503818
+v -0.173779 0.786081 0.522163
+v -0.150358 0.793654 0.529736
+v -0.126295 0.800121 0.536204
+v -0.076653 0.809617 0.545699
+v -0.051284 0.812605 0.548687
+v -0.025697 0.814406 0.550489
+v 0.025697 0.814406 0.550489
+v 0.051284 0.812605 0.548688
+v 0.076653 0.809617 0.545700
+v 0.126295 0.800121 0.536204
+v 0.150358 0.793654 0.529736
+v 0.173779 0.786081 0.522163
+v 0.218287 0.767736 0.503818
+v 0.239185 0.757043 0.493126
+v 0.259062 0.745401 0.481483
+v 0.295403 0.719458 0.455540
+v 0.311712 0.705268 0.441350
+v 0.326691 0.690349 0.426431
+v 0.352388 0.658576 0.394658
+v 0.362996 0.641856 0.377938
+v 0.372056 0.624678 0.360760
+v 0.385357 0.589239 0.325322
+v 0.389543 0.571129 0.307212
+v 0.392066 0.552863 0.288945
+v 0.392066 0.516174 0.252256
+v 0.389543 0.497908 0.233990
+v 0.385358 0.479798 0.215880
+v 0.372056 0.444359 0.180441
+v 0.362996 0.427181 0.163263
+v 0.352388 0.410461 0.146544
+v 0.326691 0.378688 0.114770
+v 0.311712 0.363769 0.099852
+v 0.295403 0.349580 0.085662
+v 0.259062 0.323637 0.059719
+v 0.239185 0.311994 0.048076
+v 0.218287 0.301301 0.037383
+v 0.173779 0.282956 0.019039
+v 0.150358 0.275383 0.011465
+v 0.126295 0.268916 0.004998
+v 0.076653 0.259420 -0.004498
+v 0.051284 0.256432 -0.007486
+v 0.025697 0.254631 -0.009287
+v -0.025697 0.254631 -0.009287
+v -0.051284 0.256432 -0.007486
+v -0.076653 0.259420 -0.004498
+v -0.126295 0.268916 0.004998
+v -0.150358 0.275383 0.011465
+v -0.173779 0.282956 0.019039
+v -0.218287 0.301301 0.037383
+v -0.239185 0.311994 0.048076
+v -0.259062 0.323636 0.059719
+v -0.295403 0.349579 0.085662
+v -0.311712 0.363769 0.099852
+v -0.326691 0.378688 0.114770
+v -0.352388 0.410461 0.146544
+v -0.362996 0.427181 0.163263
+v -0.372056 0.444359 0.180441
+v -0.385358 0.479798 0.215880
+v -0.389543 0.497908 0.233990
+v -0.392066 0.516174 0.252256
+v -0.392066 0.552863 0.288945
+v -0.389543 0.571129 0.307212
+v -0.385357 0.589239 0.325322
+v -0.406136 0.671435 0.330521
+v -0.396247 0.690186 0.349273
+v -0.384666 0.708437 0.367524
+v -0.356616 0.743121 0.402208
+v -0.340265 0.759407 0.418493
+v -0.322462 0.774896 0.433982
+v -0.282792 0.803216 0.462302
+v -0.261095 0.815925 0.475011
+v -0.238282 0.827597 0.486683
+v -0.189697 0.847622 0.506708
+v -0.164131 0.855889 0.514975
+v -0.137864 0.862949 0.522035
+v -0.083674 0.873315 0.532401
+v -0.055982 0.876576 0.535663
+v -0.028051 0.878542 0.537629
+v 0.028051 0.878542 0.537629
+v 0.055982 0.876576 0.535663
+v 0.083674 0.873315 0.532401
+v 0.137864 0.862949 0.522035
+v 0.164131 0.855889 0.514975
+v 0.189697 0.847622 0.506708
+v 0.238283 0.827597 0.486683
+v 0.261095 0.815925 0.475011
+v 0.282792 0.803216 0.462302
+v 0.322462 0.774896 0.433982
+v 0.340265 0.759407 0.418493
+v 0.356616 0.743122 0.402208
+v 0.384667 0.708438 0.367524
+v 0.396247 0.690186 0.349273
+v 0.406137 0.671435 0.330521
+v 0.420657 0.632750 0.291836
+v 0.425226 0.612981 0.272067
+v 0.427980 0.593041 0.252128
+v 0.427980 0.552992 0.212078
+v 0.425226 0.533052 0.192138
+v 0.420657 0.513283 0.172369
+v 0.406137 0.474598 0.133684
+v 0.396247 0.455847 0.114933
+v 0.384667 0.437596 0.096682
+v 0.356616 0.402912 0.061998
+v 0.340265 0.386626 0.045713
+v 0.322462 0.371137 0.030223
+v 0.282792 0.342817 0.001904
+v 0.261095 0.330108 -0.010805
+v 0.238283 0.318436 -0.022478
+v 0.189697 0.298411 -0.042503
+v 0.164131 0.290144 -0.050770
+v 0.137864 0.283084 -0.057830
+v 0.083674 0.272718 -0.068195
+v 0.055982 0.269457 -0.071457
+v 0.028051 0.267491 -0.073423
+v -0.028051 0.267491 -0.073423
+v -0.055982 0.269457 -0.071457
+v -0.083674 0.272718 -0.068195
+v -0.137864 0.283084 -0.057830
+v -0.164131 0.290144 -0.050770
+v -0.189697 0.298411 -0.042503
+v -0.238283 0.318436 -0.022478
+v -0.261095 0.330108 -0.010805
+v -0.282793 0.342817 0.001904
+v -0.322462 0.371137 0.030223
+v -0.340265 0.386626 0.045713
+v -0.356616 0.402911 0.061998
+v -0.384667 0.437596 0.096682
+v -0.396247 0.455847 0.114933
+v -0.406137 0.474598 0.133685
+v -0.420657 0.513283 0.172370
+v -0.425226 0.533052 0.192139
+v -0.427980 0.552992 0.212078
+v -0.427980 0.593041 0.252128
+v -0.425226 0.612981 0.272067
+v -0.420657 0.632750 0.291836
+v -0.433268 0.719536 0.295570
+v -0.422718 0.739540 0.315574
+v -0.410364 0.759010 0.335044
+v -0.380439 0.796011 0.372045
+v -0.362996 0.813384 0.389418
+v -0.344004 0.829909 0.405943
+v -0.301684 0.860120 0.436154
+v -0.278537 0.873678 0.449712
+v -0.254201 0.886130 0.462164
+v -0.202370 0.907493 0.483527
+v -0.175096 0.916313 0.492346
+v -0.147074 0.923844 0.499878
+v -0.089264 0.934902 0.510936
+v -0.059722 0.938382 0.514415
+v -0.029925 0.940479 0.516513
+v 0.029925 0.940479 0.516513
+v 0.059722 0.938382 0.514415
+v 0.089264 0.934902 0.510936
+v 0.147074 0.923844 0.499878
+v 0.175096 0.916313 0.492346
+v 0.202370 0.907493 0.483527
+v 0.254201 0.886131 0.462164
+v 0.278537 0.873678 0.449712
+v 0.301684 0.860120 0.436154
+v 0.344004 0.829909 0.405943
+v 0.362996 0.813384 0.389418
+v 0.380439 0.796011 0.372045
+v 0.410364 0.759010 0.335044
+v 0.422718 0.739540 0.315574
+v 0.433268 0.719536 0.295570
+v 0.448758 0.678267 0.254300
+v 0.453633 0.657177 0.233211
+v 0.456571 0.635905 0.211939
+v 0.456571 0.593180 0.169214
+v 0.453633 0.571908 0.147942
+v 0.448758 0.550819 0.126853
+v 0.433268 0.509549 0.085584
+v 0.422718 0.489546 0.065580
+v 0.410364 0.470075 0.046109
+v 0.380439 0.433074 0.009108
+v 0.362996 0.415701 -0.008265
+v 0.344004 0.399177 -0.024789
+v 0.301684 0.368965 -0.055001
+v 0.278537 0.355407 -0.068559
+v 0.254201 0.342955 -0.081011
+v 0.202370 0.321592 -0.102374
+v 0.175096 0.312773 -0.111193
+v 0.147074 0.305241 -0.118724
+v 0.089264 0.294183 -0.129783
+v 0.059722 0.290704 -0.133262
+v 0.029925 0.288606 -0.135359
+v -0.029925 0.288606 -0.135359
+v -0.059722 0.290704 -0.133262
+v -0.089264 0.294183 -0.129783
+v -0.147074 0.305241 -0.118724
+v -0.175096 0.312773 -0.111193
+v -0.202370 0.321592 -0.102374
+v -0.254201 0.342955 -0.081011
+v -0.278537 0.355407 -0.068559
+v -0.301684 0.368965 -0.055001
+v -0.344004 0.399177 -0.024789
+v -0.362996 0.415701 -0.008265
+v -0.380439 0.433074 0.009108
+v -0.410364 0.470075 0.046109
+v -0.422718 0.489545 0.065580
+v -0.433268 0.509549 0.085584
+v -0.448758 0.550819 0.126853
+v -0.453633 0.571908 0.147943
+v -0.456571 0.593180 0.169214
+v -0.456571 0.635905 0.211939
+v -0.453633 0.657177 0.233211
+v -0.448758 0.678266 0.254301
+v -0.452986 0.768158 0.256504
+v -0.441956 0.789072 0.277419
+v -0.429040 0.809429 0.297775
+v -0.397753 0.848114 0.336460
+v -0.379516 0.866278 0.354624
+v -0.359660 0.883554 0.371900
+v -0.315414 0.915140 0.403486
+v -0.291213 0.929316 0.417662
+v -0.265770 0.942335 0.430681
+v -0.211580 0.964669 0.453015
+v -0.183064 0.973890 0.462236
+v -0.153768 0.981764 0.470110
+v -0.093327 0.993326 0.481672
+v -0.062440 0.996964 0.485310
+v -0.031287 0.999156 0.487502
+v 0.031287 0.999156 0.487502
+v 0.062440 0.996964 0.485310
+v 0.093327 0.993326 0.481672
+v 0.153768 0.981764 0.470110
+v 0.183064 0.973890 0.462236
+v 0.211580 0.964669 0.453015
+v 0.265770 0.942335 0.430681
+v 0.291213 0.929316 0.417662
+v 0.315414 0.915140 0.403486
+v 0.359660 0.883554 0.371900
+v 0.379517 0.866278 0.354624
+v 0.397753 0.848114 0.336460
+v 0.429040 0.809429 0.297775
+v 0.441956 0.789072 0.277419
+v 0.452986 0.768158 0.256504
+v 0.469182 0.725011 0.213357
+v 0.474278 0.702961 0.191307
+v 0.477349 0.680721 0.169068
+v 0.477349 0.636052 0.124398
+v 0.474278 0.613812 0.102158
+v 0.469182 0.591763 0.080109
+v 0.452987 0.548615 0.036961
+v 0.441956 0.527701 0.016047
+v 0.429040 0.507344 -0.004310
+v 0.397753 0.468659 -0.042995
+v 0.379517 0.450495 -0.061158
+v 0.359660 0.433219 -0.078435
+v 0.315414 0.401633 -0.110021
+v 0.291213 0.387457 -0.124196
+v 0.265770 0.374439 -0.137215
+v 0.211580 0.352104 -0.159550
+v 0.183064 0.342883 -0.168771
+v 0.153768 0.335009 -0.176645
+v 0.093327 0.323447 -0.188206
+v 0.062440 0.319809 -0.191844
+v 0.031287 0.317617 -0.194037
+v -0.031287 0.317617 -0.194037
+v -0.062440 0.319809 -0.191844
+v -0.093327 0.323447 -0.188206
+v -0.153768 0.335009 -0.176645
+v -0.183064 0.342883 -0.168771
+v -0.211580 0.352104 -0.159550
+v -0.265770 0.374439 -0.137215
+v -0.291213 0.387457 -0.124196
+v -0.315414 0.401633 -0.110021
+v -0.359660 0.433219 -0.078435
+v -0.379517 0.450495 -0.061158
+v -0.397753 0.468659 -0.042995
+v -0.429040 0.507344 -0.004310
+v -0.441957 0.527701 0.016047
+v -0.452987 0.548615 0.036961
+v -0.469182 0.591763 0.080109
+v -0.474278 0.613812 0.102158
+v -0.477349 0.636052 0.124398
+v -0.477349 0.680721 0.169068
+v -0.474278 0.702961 0.191307
+v -0.469182 0.725011 0.213357
+v -0.464954 0.816469 0.213993
+v -0.453632 0.837936 0.235460
+v -0.440375 0.858831 0.256354
+v -0.408262 0.898538 0.296061
+v -0.389543 0.917181 0.314705
+v -0.369162 0.934914 0.332438
+v -0.323747 0.967335 0.364858
+v -0.298907 0.981885 0.379408
+v -0.272791 0.995247 0.392771
+v -0.217169 1.018173 0.415696
+v -0.187901 1.027637 0.425160
+v -0.157830 1.035719 0.433242
+v -0.095792 1.047586 0.445109
+v -0.064089 1.051320 0.448843
+v -0.032113 1.053571 0.451094
+v 0.032113 1.053571 0.451094
+v 0.064089 1.051320 0.448843
+v 0.095792 1.047586 0.445109
+v 0.157830 1.035719 0.433242
+v 0.187901 1.027637 0.425160
+v 0.217169 1.018173 0.415696
+v 0.272791 0.995247 0.392771
+v 0.298907 0.981885 0.379408
+v 0.323747 0.967335 0.364858
+v 0.369162 0.934914 0.332438
+v 0.389543 0.917181 0.314705
+v 0.408262 0.898538 0.296061
+v 0.440375 0.858831 0.256354
+v 0.453633 0.837936 0.235460
+v 0.464954 0.816470 0.213993
+v 0.481577 0.772182 0.169705
+v 0.486808 0.749550 0.147073
+v 0.489961 0.726723 0.124246
+v 0.489961 0.680873 0.078396
+v 0.486808 0.658046 0.055569
+v 0.481577 0.635414 0.032937
+v 0.464954 0.591126 -0.011350
+v 0.453633 0.569660 -0.032817
+v 0.440375 0.548765 -0.053711
+v 0.408262 0.509058 -0.093418
+v 0.389543 0.490415 -0.112062
+v 0.369162 0.472682 -0.129795
+v 0.323747 0.440261 -0.162216
+v 0.298907 0.425711 -0.176765
+v 0.272791 0.412348 -0.190128
+v 0.217169 0.389424 -0.213053
+v 0.187901 0.379959 -0.222517
+v 0.157830 0.371877 -0.230600
+v 0.095792 0.360010 -0.242466
+v 0.064089 0.356276 -0.246201
+v 0.032113 0.354025 -0.248451
+v -0.032113 0.354025 -0.248451
+v -0.064089 0.356276 -0.246201
+v -0.095792 0.360010 -0.242466
+v -0.157830 0.371877 -0.230600
+v -0.187901 0.379959 -0.222517
+v -0.217170 0.389423 -0.213053
+v -0.272791 0.412348 -0.190128
+v -0.298907 0.425711 -0.176765
+v -0.323747 0.440261 -0.162216
+v -0.369162 0.472682 -0.129795
+v -0.389543 0.490414 -0.112062
+v -0.408262 0.509058 -0.093418
+v -0.440375 0.548765 -0.053711
+v -0.453633 0.569659 -0.032817
+v -0.464954 0.591126 -0.011350
+v -0.481577 0.635414 0.032937
+v -0.486808 0.658046 0.055569
+v -0.489961 0.680873 0.078397
+v -0.489961 0.726723 0.124246
+v -0.486808 0.749550 0.147074
+v -0.481577 0.772182 0.169705
+v -0.468966 0.863644 0.168763
+v -0.457547 0.885296 0.190415
+v -0.444175 0.906370 0.211490
+v -0.411784 0.946420 0.251540
+v -0.392904 0.965225 0.270344
+v -0.372347 0.983111 0.288230
+v -0.326541 1.015811 0.320930
+v -0.301486 1.030486 0.335606
+v -0.275145 1.043965 0.349084
+v -0.219043 1.067087 0.372206
+v -0.189522 1.076633 0.381752
+v -0.159192 1.084785 0.389904
+v -0.096619 1.096755 0.401874
+v -0.064642 1.100521 0.405640
+v -0.032390 1.102791 0.407910
+v 0.032390 1.102791 0.407910
+v 0.064642 1.100521 0.405640
+v 0.096619 1.096755 0.401874
+v 0.159192 1.084785 0.389904
+v 0.189522 1.076633 0.381752
+v 0.219043 1.067087 0.372206
+v 0.275145 1.043965 0.349084
+v 0.301486 1.030486 0.335606
+v 0.326541 1.015811 0.320930
+v 0.372347 0.983111 0.288230
+v 0.392904 0.965225 0.270344
+v 0.411785 0.946420 0.251540
+v 0.444175 0.906371 0.211490
+v 0.457547 0.885296 0.190415
+v 0.468966 0.863644 0.168763
+v 0.485733 0.818974 0.124093
+v 0.491008 0.796147 0.101266
+v 0.494188 0.773123 0.078242
+v 0.494188 0.726877 0.031997
+v 0.491008 0.703853 0.008972
+v 0.485733 0.681026 -0.013855
+v 0.468966 0.636356 -0.058524
+v 0.457547 0.614704 -0.080177
+v 0.444175 0.593629 -0.101251
+v 0.411785 0.553580 -0.141301
+v 0.392904 0.534775 -0.160105
+v 0.372347 0.516889 -0.177991
+v 0.326541 0.484189 -0.210692
+v 0.301486 0.469514 -0.225367
+v 0.275145 0.456035 -0.238845
+v 0.219043 0.432913 -0.261968
+v 0.189522 0.423367 -0.271514
+v 0.159192 0.415215 -0.279666
+v 0.096619 0.403246 -0.291635
+v 0.064642 0.399479 -0.295401
+v 0.032390 0.397209 -0.297671
+v -0.032390 0.397209 -0.297671
+v -0.064643 0.399479 -0.295401
+v -0.096619 0.403246 -0.291635
+v -0.159192 0.415215 -0.279666
+v -0.189522 0.423367 -0.271514
+v -0.219043 0.432913 -0.261968
+v -0.275145 0.456035 -0.238845
+v -0.301486 0.469514 -0.225367
+v -0.326541 0.484189 -0.210692
+v -0.372347 0.516889 -0.177991
+v -0.392905 0.534775 -0.160105
+v -0.411785 0.553580 -0.141301
+v -0.444175 0.593629 -0.101251
+v -0.457547 0.614704 -0.080177
+v -0.468966 0.636356 -0.058524
+v -0.485733 0.681026 -0.013855
+v -0.491008 0.703853 0.008972
+v -0.494189 0.726877 0.031997
+v -0.494188 0.773123 0.078242
+v -0.491008 0.796147 0.101266
+v -0.485732 0.818974 0.124094
+v -0.464954 0.908874 0.121589
+v -0.453632 0.930340 0.143056
+v -0.440375 0.951235 0.163950
+v -0.408262 0.990942 0.203657
+v -0.389543 1.009585 0.222301
+v -0.369162 1.027318 0.240034
+v -0.323747 1.059739 0.272454
+v -0.298907 1.074289 0.287004
+v -0.272791 1.087651 0.300367
+v -0.217169 1.110577 0.323292
+v -0.187901 1.120041 0.332756
+v -0.157830 1.128123 0.340838
+v -0.095792 1.139990 0.352705
+v -0.064089 1.143724 0.356439
+v -0.032113 1.145975 0.358690
+v 0.032113 1.145975 0.358690
+v 0.064089 1.143724 0.356439
+v 0.095792 1.139990 0.352705
+v 0.157830 1.128123 0.340838
+v 0.187901 1.120041 0.332756
+v 0.217169 1.110577 0.323292
+v 0.272791 1.087652 0.300367
+v 0.298907 1.074289 0.287004
+v 0.323747 1.059739 0.272454
+v 0.369162 1.027318 0.240034
+v 0.389543 1.009586 0.222301
+v 0.408262 0.990942 0.203657
+v 0.440375 0.951235 0.163950
+v 0.453633 0.930341 0.143056
+v 0.464954 0.908874 0.121589
+v 0.481577 0.864586 0.077301
+v 0.486808 0.841954 0.054669
+v 0.489960 0.819127 0.031842
+v 0.489960 0.773277 -0.014008
+v 0.486808 0.750450 -0.036835
+v 0.481577 0.727818 -0.059467
+v 0.464954 0.683531 -0.103754
+v 0.453633 0.662064 -0.125221
+v 0.440375 0.641169 -0.146115
+v 0.408262 0.601462 -0.185823
+v 0.389543 0.582819 -0.204466
+v 0.369162 0.565086 -0.222199
+v 0.323747 0.532665 -0.254620
+v 0.298907 0.518115 -0.269170
+v 0.272791 0.504752 -0.282532
+v 0.217169 0.481828 -0.305457
+v 0.187901 0.472363 -0.314922
+v 0.157830 0.464281 -0.323004
+v 0.095792 0.452414 -0.334871
+v 0.064089 0.448680 -0.338605
+v 0.032113 0.446429 -0.340855
+v -0.032113 0.446429 -0.340855
+v -0.064089 0.448680 -0.338605
+v -0.095792 0.452414 -0.334870
+v -0.157830 0.464281 -0.323004
+v -0.187901 0.472363 -0.314921
+v -0.217170 0.481827 -0.305457
+v -0.272791 0.504752 -0.282532
+v -0.298907 0.518115 -0.269169
+v -0.323747 0.532665 -0.254620
+v -0.369162 0.565086 -0.222199
+v -0.389543 0.582819 -0.204466
+v -0.408262 0.601462 -0.185823
+v -0.440375 0.641169 -0.146115
+v -0.453633 0.662063 -0.125221
+v -0.464954 0.683530 -0.103754
+v -0.481577 0.727818 -0.059467
+v -0.486808 0.750450 -0.036835
+v -0.489961 0.773277 -0.014008
+v -0.489961 0.819127 0.031842
+v -0.486808 0.841954 0.054669
+v -0.481577 0.864586 0.077301
+v -0.452986 0.951385 0.073277
+v -0.441956 0.972299 0.094192
+v -0.429040 0.992656 0.114548
+v -0.397753 1.031341 0.153233
+v -0.379516 1.049505 0.171397
+v -0.359660 1.066781 0.188673
+v -0.315414 1.098367 0.220260
+v -0.291213 1.112542 0.234435
+v -0.265770 1.125561 0.247454
+v -0.211580 1.147896 0.269788
+v -0.183064 1.157117 0.279009
+v -0.153768 1.164991 0.286883
+v -0.093327 1.176553 0.298445
+v -0.062440 1.180190 0.302083
+v -0.031287 1.182383 0.304276
+v 0.031287 1.182383 0.304276
+v 0.062440 1.180190 0.302083
+v 0.093327 1.176553 0.298445
+v 0.153768 1.164991 0.286883
+v 0.183064 1.157117 0.279009
+v 0.211580 1.147896 0.269788
+v 0.265770 1.125561 0.247454
+v 0.291213 1.112543 0.234435
+v 0.315414 1.098367 0.220260
+v 0.359660 1.066781 0.188673
+v 0.379517 1.049505 0.171397
+v 0.397753 1.031341 0.153233
+v 0.429040 0.992656 0.114548
+v 0.441956 0.972299 0.094192
+v 0.452986 0.951385 0.073277
+v 0.469182 0.908237 0.030130
+v 0.474278 0.886188 0.008080
+v 0.477349 0.863948 -0.014159
+v 0.477349 0.819279 -0.058829
+v 0.474278 0.797039 -0.081069
+v 0.469182 0.774990 -0.103118
+v 0.452986 0.731842 -0.146266
+v 0.441956 0.710928 -0.167180
+v 0.429040 0.690571 -0.187537
+v 0.397753 0.651886 -0.226222
+v 0.379517 0.633722 -0.244385
+v 0.359660 0.616446 -0.261662
+v 0.315414 0.584860 -0.293248
+v 0.291213 0.570684 -0.307423
+v 0.265770 0.557666 -0.320442
+v 0.211580 0.535331 -0.342777
+v 0.183064 0.526110 -0.351998
+v 0.153768 0.518236 -0.359872
+v 0.093327 0.506674 -0.371433
+v 0.062440 0.503036 -0.375071
+v 0.031286 0.500844 -0.377264
+v -0.031287 0.500844 -0.377264
+v -0.062440 0.503036 -0.375071
+v -0.093327 0.506674 -0.371433
+v -0.153768 0.518236 -0.359872
+v -0.183064 0.526110 -0.351998
+v -0.211580 0.535331 -0.342777
+v -0.265770 0.557665 -0.320442
+v -0.291213 0.570684 -0.307423
+v -0.315414 0.584860 -0.293248
+v -0.359660 0.616446 -0.261662
+v -0.379517 0.633722 -0.244385
+v -0.397753 0.651886 -0.226221
+v -0.429040 0.690571 -0.187536
+v -0.441957 0.710928 -0.167180
+v -0.452987 0.731842 -0.146266
+v -0.469182 0.774989 -0.103118
+v -0.474278 0.797039 -0.081069
+v -0.477349 0.819279 -0.058829
+v -0.477349 0.863948 -0.014159
+v -0.474278 0.886188 0.008080
+v -0.469182 0.908237 0.030130
+v -0.433664 0.989941 0.025357
+v -0.423104 1.009963 0.045379
+v -0.410739 1.029451 0.064867
+v -0.380787 1.066486 0.101902
+v -0.363328 1.083875 0.119291
+v -0.344318 1.100414 0.135830
+v -0.301960 1.130653 0.166069
+v -0.278791 1.144224 0.179640
+v -0.254433 1.156687 0.192103
+v -0.202555 1.178069 0.213485
+v -0.175256 1.186897 0.222313
+v -0.147208 1.194435 0.229851
+v -0.089346 1.205503 0.240919
+v -0.059776 1.208986 0.244402
+v -0.029952 1.211086 0.246501
+v 0.029952 1.211086 0.246501
+v 0.059776 1.208986 0.244402
+v 0.089346 1.205503 0.240919
+v 0.147208 1.194435 0.229851
+v 0.175255 1.186897 0.222313
+v 0.202554 1.178070 0.213485
+v 0.254433 1.156687 0.192103
+v 0.278791 1.144224 0.179640
+v 0.301960 1.130653 0.166069
+v 0.344318 1.100415 0.135830
+v 0.363328 1.083875 0.119291
+v 0.380787 1.066486 0.101902
+v 0.410739 1.029451 0.064867
+v 0.423104 1.009963 0.045379
+v 0.433664 0.989941 0.025357
+v 0.449168 0.948634 -0.015950
+v 0.454047 0.927525 -0.037059
+v 0.456987 0.906234 -0.058350
+v 0.456987 0.863470 -0.101115
+v 0.454047 0.842179 -0.122406
+v 0.449168 0.821070 -0.143514
+v 0.433664 0.779763 -0.184822
+v 0.423104 0.759740 -0.204844
+v 0.410739 0.740252 -0.224332
+v 0.380787 0.703217 -0.261367
+v 0.363328 0.685828 -0.278756
+v 0.344318 0.669289 -0.295295
+v 0.301960 0.639050 -0.325534
+v 0.278791 0.625480 -0.339105
+v 0.254433 0.613016 -0.351568
+v 0.202554 0.591634 -0.372950
+v 0.175255 0.582806 -0.381778
+v 0.147208 0.575268 -0.389316
+v 0.089346 0.564200 -0.400384
+v 0.059776 0.560717 -0.403867
+v 0.029952 0.558618 -0.405966
+v -0.029952 0.558618 -0.405966
+v -0.059776 0.560717 -0.403867
+v -0.089346 0.564200 -0.400384
+v -0.147209 0.575268 -0.389316
+v -0.175256 0.582806 -0.381778
+v -0.202555 0.591634 -0.372950
+v -0.254433 0.613016 -0.351568
+v -0.278791 0.625479 -0.339105
+v -0.301960 0.639050 -0.325534
+v -0.344318 0.669289 -0.295295
+v -0.363328 0.685828 -0.278756
+v -0.380787 0.703217 -0.261367
+v -0.410739 0.740252 -0.224332
+v -0.423104 0.759740 -0.204844
+v -0.433664 0.779763 -0.184821
+v -0.449168 0.821070 -0.143514
+v -0.454047 0.842179 -0.122405
+v -0.456988 0.863470 -0.101114
+v -0.456988 0.906234 -0.058350
+v -0.454047 0.927525 -0.037059
+v -0.449168 0.948634 -0.015950
+v -0.371559 1.056082 -0.070884
+v -0.362511 1.073237 -0.053730
+v -0.351917 1.089934 -0.037032
+v -0.326254 1.121665 -0.005301
+v -0.311296 1.136564 0.009598
+v -0.295008 1.150735 0.023768
+v -0.258716 1.176643 0.049677
+v -0.238866 1.188270 0.061304
+v -0.217996 1.198949 0.071982
+v -0.173547 1.217269 0.090302
+v -0.150157 1.224832 0.097866
+v -0.126127 1.231291 0.104324
+v -0.076550 1.240774 0.113808
+v -0.051216 1.243758 0.116792
+v -0.025663 1.245557 0.118590
+v 0.025663 1.245557 0.118590
+v 0.051216 1.243758 0.116792
+v 0.076550 1.240774 0.113808
+v 0.126127 1.231291 0.104324
+v 0.150157 1.224832 0.097866
+v 0.173547 1.217269 0.090302
+v 0.217995 1.198949 0.071982
+v 0.238866 1.188270 0.061304
+v 0.258716 1.176643 0.049677
+v 0.295008 1.150735 0.023768
+v 0.311296 1.136564 0.009597
+v 0.326254 1.121666 -0.005301
+v 0.351917 1.089934 -0.037032
+v 0.362511 1.073237 -0.053730
+v 0.371559 1.056082 -0.070884
+v 0.384843 1.020691 -0.106276
+v 0.389023 1.002605 -0.124362
+v 0.391542 0.984363 -0.142604
+v 0.391542 0.947723 -0.179244
+v 0.389023 0.929481 -0.197486
+v 0.384843 0.911395 -0.215571
+v 0.371559 0.876004 -0.250963
+v 0.362511 0.858849 -0.268118
+v 0.351917 0.842151 -0.284815
+v 0.326254 0.810420 -0.316546
+v 0.311296 0.795522 -0.331445
+v 0.295008 0.781351 -0.345616
+v 0.258716 0.755443 -0.371524
+v 0.238866 0.743815 -0.383151
+v 0.217996 0.733137 -0.393830
+v 0.173547 0.714817 -0.412150
+v 0.150157 0.707253 -0.419713
+v 0.126127 0.700795 -0.426172
+v 0.076550 0.691312 -0.435655
+v 0.051216 0.688328 -0.438639
+v 0.025662 0.686529 -0.440437
+v -0.025663 0.686529 -0.440437
+v -0.051216 0.688328 -0.438639
+v -0.076551 0.691311 -0.435655
+v -0.126127 0.700795 -0.426172
+v -0.150157 0.707253 -0.419713
+v -0.173547 0.714817 -0.412150
+v -0.217996 0.733137 -0.393830
+v -0.238866 0.743815 -0.383151
+v -0.258716 0.755443 -0.371524
+v -0.295008 0.781351 -0.345616
+v -0.311296 0.795522 -0.331445
+v -0.326254 0.810420 -0.316546
+v -0.351917 0.842151 -0.284815
+v -0.362512 0.858849 -0.268118
+v -0.371559 0.876004 -0.250963
+v -0.384843 0.911395 -0.215571
+v -0.389023 0.929481 -0.197485
+v -0.391542 0.947723 -0.179244
+v -0.391542 0.984363 -0.142604
+v -0.389023 1.002605 -0.124362
+v -0.384843 1.020691 -0.106276
+v -0.330114 1.080719 -0.115608
+v -0.322075 1.095960 -0.100367
+v -0.312663 1.110795 -0.085532
+v -0.289862 1.138987 -0.057340
+v -0.276572 1.152224 -0.044103
+v -0.262102 1.164814 -0.031513
+v -0.229858 1.187832 -0.008495
+v -0.212221 1.198162 0.001835
+v -0.193679 1.207650 0.011323
+v -0.154189 1.223926 0.027599
+v -0.133408 1.230646 0.034319
+v -0.112058 1.236384 0.040057
+v -0.068012 1.244810 0.048483
+v -0.045503 1.247461 0.051134
+v -0.022800 1.249059 0.052732
+v 0.022800 1.249059 0.052732
+v 0.045503 1.247461 0.051134
+v 0.068012 1.244810 0.048483
+v 0.112058 1.236384 0.040057
+v 0.133408 1.230646 0.034319
+v 0.154189 1.223926 0.027599
+v 0.193679 1.207650 0.011323
+v 0.212221 1.198162 0.001835
+v 0.229858 1.187832 -0.008495
+v 0.262102 1.164814 -0.031513
+v 0.276572 1.152224 -0.044103
+v 0.289862 1.138987 -0.057340
+v 0.312662 1.110795 -0.085532
+v 0.322075 1.095960 -0.100367
+v 0.330114 1.080719 -0.115608
+v 0.341916 1.049275 -0.147052
+v 0.345630 1.033207 -0.163120
+v 0.347868 1.017000 -0.179327
+v 0.347868 0.984447 -0.211880
+v 0.345630 0.968239 -0.228087
+v 0.341916 0.952171 -0.244156
+v 0.330114 0.920727 -0.275600
+v 0.322075 0.905486 -0.290841
+v 0.312662 0.890651 -0.305676
+v 0.289862 0.862459 -0.333868
+v 0.276572 0.849222 -0.347104
+v 0.262102 0.836632 -0.359694
+v 0.229858 0.813614 -0.382713
+v 0.212221 0.803284 -0.393043
+v 0.193679 0.793796 -0.402531
+v 0.154189 0.777520 -0.418807
+v 0.133408 0.770800 -0.425527
+v 0.112058 0.765062 -0.431265
+v 0.068012 0.756636 -0.439690
+v 0.045503 0.753985 -0.442342
+v 0.022800 0.752387 -0.443940
+v -0.022800 0.752387 -0.443940
+v -0.045503 0.753985 -0.442342
+v -0.068012 0.756636 -0.439690
+v -0.112058 0.765062 -0.431265
+v -0.133408 0.770800 -0.425527
+v -0.154189 0.777520 -0.418807
+v -0.193680 0.793796 -0.402531
+v -0.212222 0.803284 -0.393043
+v -0.229858 0.813614 -0.382713
+v -0.262102 0.836632 -0.359694
+v -0.276573 0.849222 -0.347104
+v -0.289863 0.862459 -0.333867
+v -0.312663 0.890651 -0.305676
+v -0.322076 0.905486 -0.290841
+v -0.330114 0.920727 -0.275600
+v -0.341916 0.952171 -0.244156
+v -0.345630 0.968239 -0.228087
+v -0.347868 0.984447 -0.211880
+v -0.347868 1.016999 -0.179327
+v -0.345630 1.033207 -0.163120
+v -0.341916 1.049275 -0.147052
+v -0.078290 0.415754 0.419316
+v -0.093418 0.420709 0.420150
+v -0.108628 0.426059 0.420618
+v -0.097394 0.445422 0.439981
+v -0.083756 0.437360 0.436801
+v -0.070193 0.429709 0.433271
+v -0.079521 0.462049 0.456608
+v -0.068387 0.451659 0.451100
+v -0.057312 0.441693 0.445255
+v -0.056230 0.474807 0.469367
+v -0.048357 0.462631 0.462072
+v -0.040526 0.450888 0.454450
+v -0.029107 0.482828 0.477387
+v -0.025031 0.469528 0.468969
+v -0.020978 0.456668 0.460230
+v 0.000000 0.485563 0.480123
+v 0.000000 0.471881 0.471322
+v 0.000000 0.458640 0.462202
+v 0.029107 0.482828 0.477387
+v 0.025031 0.469528 0.468969
+v 0.020978 0.456668 0.460230
+v 0.056230 0.474807 0.469367
+v 0.048357 0.462631 0.462072
+v 0.040526 0.450888 0.454450
+v 0.079522 0.462049 0.456608
+v 0.068387 0.451659 0.451100
+v 0.057312 0.441693 0.445255
+v 0.097394 0.445422 0.439981
+v 0.083756 0.437360 0.436801
+v 0.070193 0.429709 0.433271
+v 0.108629 0.426059 0.420618
+v 0.093418 0.420709 0.420150
+v 0.078290 0.415754 0.419316
+v 0.112461 0.405280 0.399839
+v 0.096714 0.402839 0.402280
+v 0.081052 0.400779 0.404341
+v 0.108629 0.384501 0.379061
+v 0.093418 0.384970 0.384411
+v 0.078290 0.385803 0.389365
+v 0.097394 0.365138 0.359698
+v 0.083756 0.368318 0.367759
+v 0.070193 0.371848 0.375410
+v 0.079522 0.348511 0.343071
+v 0.068387 0.354019 0.353460
+v 0.057312 0.359865 0.363427
+v 0.056230 0.335753 0.330312
+v 0.048357 0.343047 0.342488
+v 0.040526 0.350669 0.354231
+v 0.029107 0.327732 0.322292
+v 0.025031 0.336150 0.335591
+v 0.020978 0.344889 0.348451
+v 0.000000 0.324997 0.319556
+v 0.000000 0.333797 0.333238
+v 0.000000 0.342918 0.346479
+v -0.029107 0.327732 0.322292
+v -0.025031 0.336150 0.335591
+v -0.020978 0.344889 0.348451
+v -0.056230 0.335753 0.330312
+v -0.048357 0.343047 0.342488
+v -0.040526 0.350669 0.354231
+v -0.079522 0.348511 0.343071
+v -0.068387 0.354019 0.353460
+v -0.057312 0.359865 0.363427
+v -0.097394 0.365138 0.359698
+v -0.083756 0.368318 0.367759
+v -0.070193 0.371848 0.375410
+v -0.108628 0.384501 0.379061
+v -0.093418 0.384970 0.384411
+v -0.078290 0.385803 0.389365
+v -0.112460 0.405280 0.399840
+v -0.096713 0.402839 0.402280
+v -0.081052 0.400779 0.404341
+v -0.138866 0.437838 0.420407
+v -0.153770 0.444232 0.419715
+v -0.168509 0.450953 0.418632
+v -0.151081 0.480990 0.448668
+v -0.137866 0.471641 0.447124
+v -0.124504 0.462590 0.445160
+v -0.123357 0.506783 0.474461
+v -0.112567 0.495178 0.470660
+v -0.101657 0.483846 0.466415
+v -0.087227 0.526574 0.494252
+v -0.079597 0.513238 0.488721
+v -0.071882 0.500156 0.482725
+v -0.045152 0.539015 0.506694
+v -0.041202 0.524591 0.500074
+v -0.037209 0.510409 0.492978
+v 0.000000 0.543259 0.510938
+v 0.000000 0.528464 0.503946
+v 0.000000 0.513906 0.496475
+v 0.045152 0.539015 0.506694
+v 0.041203 0.524591 0.500074
+v 0.037209 0.510409 0.492978
+v 0.087227 0.526574 0.494253
+v 0.079597 0.513238 0.488721
+v 0.071882 0.500156 0.482725
+v 0.123357 0.506783 0.474461
+v 0.112567 0.495178 0.470660
+v 0.101657 0.483846 0.466415
+v 0.151081 0.480990 0.448668
+v 0.137866 0.471641 0.447124
+v 0.124504 0.462590 0.445160
+v 0.168509 0.450953 0.418632
+v 0.153770 0.444232 0.419715
+v 0.138866 0.437838 0.420407
+v 0.174453 0.418721 0.386399
+v 0.159194 0.414818 0.390301
+v 0.143765 0.411275 0.393844
+v 0.168509 0.386488 0.354166
+v 0.153770 0.385405 0.360887
+v 0.138866 0.384712 0.367282
+v 0.151081 0.356451 0.324130
+v 0.137866 0.357996 0.333478
+v 0.124504 0.359960 0.342529
+v 0.123357 0.330658 0.298337
+v 0.112567 0.334459 0.309942
+v 0.101657 0.338704 0.321274
+v 0.087227 0.310867 0.278545
+v 0.079597 0.316399 0.291881
+v 0.071882 0.322394 0.304964
+v 0.045152 0.298425 0.266104
+v 0.041203 0.305045 0.280528
+v 0.037209 0.312141 0.294711
+v 0.000000 0.294182 0.261860
+v 0.000000 0.301173 0.276656
+v 0.000000 0.308644 0.291214
+v -0.045152 0.298425 0.266104
+v -0.041202 0.305045 0.280528
+v -0.037209 0.312141 0.294711
+v -0.087227 0.310867 0.278545
+v -0.079597 0.316399 0.291881
+v -0.071882 0.322394 0.304964
+v -0.123357 0.330658 0.298337
+v -0.112567 0.334459 0.309942
+v -0.101657 0.338704 0.321274
+v -0.151081 0.356451 0.324130
+v -0.137866 0.357996 0.333478
+v -0.124504 0.359960 0.342529
+v -0.168509 0.386487 0.354166
+v -0.153770 0.385405 0.360887
+v -0.138866 0.384712 0.367282
+v -0.174453 0.418720 0.386399
+v -0.159194 0.414818 0.390301
+v -0.143765 0.411275 0.393844
+v -0.197430 0.465350 0.415300
+v -0.211581 0.473009 0.413054
+v -0.225506 0.480965 0.410426
+v -0.202183 0.521161 0.450622
+v -0.189699 0.510723 0.450768
+v -0.177011 0.500541 0.450491
+v -0.165082 0.555678 0.485139
+v -0.154888 0.543109 0.483154
+v -0.144529 0.530761 0.480711
+v -0.116731 0.582164 0.511625
+v -0.109523 0.567959 0.508004
+v -0.102197 0.553949 0.503899
+v -0.060424 0.598813 0.528274
+v -0.056693 0.583581 0.523626
+v -0.052901 0.568526 0.518476
+v 0.000000 0.604492 0.533953
+v 0.000000 0.588909 0.528954
+v 0.000000 0.573498 0.523448
+v 0.060424 0.598814 0.528274
+v 0.056693 0.583581 0.523626
+v 0.052901 0.568526 0.518476
+v 0.116731 0.582164 0.511625
+v 0.109523 0.567959 0.508004
+v 0.102197 0.553949 0.503899
+v 0.165082 0.555678 0.485139
+v 0.154888 0.543109 0.483154
+v 0.144529 0.530761 0.480711
+v 0.202183 0.521161 0.450622
+v 0.189699 0.510723 0.450768
+v 0.177011 0.500541 0.450491
+v 0.225506 0.480965 0.410426
+v 0.211581 0.473009 0.413054
+v 0.197430 0.465350 0.415300
+v 0.233461 0.437829 0.367290
+v 0.219045 0.432537 0.372582
+v 0.204395 0.427585 0.377535
+v 0.225506 0.394694 0.324155
+v 0.211581 0.392065 0.332110
+v 0.197430 0.389819 0.339770
+v 0.202183 0.354498 0.283959
+v 0.189699 0.354351 0.294397
+v 0.177011 0.354628 0.304578
+v 0.165082 0.319981 0.249442
+v 0.154888 0.321966 0.262011
+v 0.144529 0.324408 0.274359
+v 0.116731 0.293495 0.222956
+v 0.109523 0.297115 0.237160
+v 0.102197 0.301220 0.251170
+v 0.060424 0.276845 0.206306
+v 0.056693 0.281493 0.221539
+v 0.052901 0.286643 0.236594
+v 0.000000 0.271166 0.200627
+v 0.000000 0.276165 0.216211
+v 0.000000 0.281671 0.231622
+v -0.060424 0.276845 0.206306
+v -0.056693 0.281493 0.221539
+v -0.052901 0.286643 0.236594
+v -0.116731 0.293495 0.222956
+v -0.109523 0.297115 0.237160
+v -0.102197 0.301220 0.251170
+v -0.165082 0.319981 0.249442
+v -0.154888 0.321965 0.262011
+v -0.144529 0.324408 0.274359
+v -0.202183 0.354498 0.283959
+v -0.189699 0.354351 0.294397
+v -0.177011 0.354628 0.304578
+v -0.225506 0.394694 0.324155
+v -0.211581 0.392065 0.332110
+v -0.197430 0.389819 0.339770
+v -0.233461 0.437829 0.367290
+v -0.219045 0.432537 0.372582
+v -0.204395 0.427585 0.377535
+v -0.252616 0.497732 0.404030
+v -0.265773 0.506526 0.400270
+v -0.278645 0.515580 0.396140
+v -0.249826 0.565247 0.445808
+v -0.238285 0.553899 0.447643
+v -0.226490 0.542760 0.449058
+v -0.203982 0.607898 0.488459
+v -0.194559 0.594579 0.488324
+v -0.184928 0.581427 0.487725
+v -0.144237 0.640625 0.521186
+v -0.137574 0.625795 0.519539
+v -0.130764 0.611097 0.517395
+v -0.074663 0.661198 0.541759
+v -0.071214 0.645417 0.539162
+v -0.067688 0.629748 0.536046
+v 0.000000 0.668215 0.548776
+v 0.000000 0.652110 0.545854
+v 0.000000 0.636110 0.542408
+v 0.074663 0.661198 0.541759
+v 0.071214 0.645417 0.539162
+v 0.067688 0.629748 0.536046
+v 0.144237 0.640625 0.521186
+v 0.137574 0.625795 0.519539
+v 0.130764 0.611097 0.517395
+v 0.203982 0.607898 0.488459
+v 0.194559 0.594579 0.488324
+v 0.184928 0.581427 0.487725
+v 0.249826 0.565247 0.445808
+v 0.238285 0.553899 0.447643
+v 0.226490 0.542760 0.449058
+v 0.278645 0.515580 0.396140
+v 0.265773 0.506526 0.400270
+v 0.252616 0.497732 0.404030
+v 0.288475 0.462279 0.342840
+v 0.275148 0.455688 0.349432
+v 0.261528 0.449411 0.355709
+v 0.278645 0.408979 0.289540
+v 0.265773 0.404850 0.298594
+v 0.252616 0.401089 0.307387
+v 0.249826 0.359311 0.239872
+v 0.238285 0.357476 0.251221
+v 0.226490 0.356061 0.262359
+v 0.203982 0.316661 0.197221
+v 0.194559 0.316796 0.210540
+v 0.184928 0.317394 0.223692
+v 0.144237 0.283934 0.164494
+v 0.137574 0.285580 0.179325
+v 0.130764 0.287724 0.194022
+v 0.074663 0.263360 0.143921
+v 0.071214 0.265958 0.159702
+v 0.067688 0.269073 0.175371
+v 0.000000 0.256343 0.136904
+v 0.000000 0.259265 0.153009
+v 0.000000 0.262711 0.169010
+v -0.074663 0.263360 0.143921
+v -0.071214 0.265958 0.159702
+v -0.067688 0.269073 0.175371
+v -0.144237 0.283934 0.164494
+v -0.137574 0.285581 0.179325
+v -0.130764 0.287724 0.194022
+v -0.203982 0.316661 0.197221
+v -0.194559 0.316796 0.210540
+v -0.184928 0.317394 0.223692
+v -0.249826 0.359311 0.239872
+v -0.238285 0.357476 0.251221
+v -0.226490 0.356061 0.262359
+v -0.278645 0.408979 0.289540
+v -0.265773 0.404850 0.298594
+v -0.252616 0.401089 0.307387
+v -0.288475 0.462279 0.342840
+v -0.275148 0.455688 0.349432
+v -0.261528 0.449411 0.355709
+v -0.303480 0.534431 0.386790
+v -0.315417 0.544208 0.381580
+v -0.327016 0.554205 0.376020
+v -0.293194 0.612495 0.434310
+v -0.282795 0.600430 0.437802
+v -0.272093 0.588525 0.440885
+v -0.239392 0.662550 0.484364
+v -0.230901 0.648709 0.486081
+v -0.222163 0.634978 0.487337
+v -0.169276 0.700958 0.522772
+v -0.163272 0.685755 0.523127
+v -0.157093 0.670622 0.522981
+v -0.087624 0.725102 0.546917
+v -0.084516 0.709043 0.546415
+v -0.081317 0.693028 0.545388
+v 0.000000 0.733338 0.555152
+v 0.000000 0.716987 0.554358
+v 0.000000 0.700671 0.553030
+v 0.087624 0.725102 0.546917
+v 0.084516 0.709043 0.546415
+v 0.081317 0.693028 0.545388
+v 0.169276 0.700958 0.522772
+v 0.163272 0.685755 0.523127
+v 0.157093 0.670622 0.522981
+v 0.239392 0.662550 0.484364
+v 0.230901 0.648710 0.486081
+v 0.222163 0.634978 0.487337
+v 0.293195 0.612495 0.434310
+v 0.282795 0.600430 0.437802
+v 0.272093 0.588525 0.440885
+v 0.327016 0.554205 0.376020
+v 0.315417 0.544208 0.381580
+v 0.303480 0.534431 0.386790
+v 0.338552 0.491652 0.313467
+v 0.326544 0.483874 0.321246
+v 0.314186 0.476380 0.328739
+v 0.327016 0.429100 0.250914
+v 0.315417 0.423540 0.260912
+v 0.303480 0.418329 0.270689
+v 0.293195 0.370810 0.192624
+v 0.282795 0.367317 0.204689
+v 0.272093 0.364235 0.216594
+v 0.239392 0.320755 0.142570
+v 0.230901 0.319038 0.156410
+v 0.222163 0.317782 0.170142
+v 0.169276 0.282347 0.104162
+v 0.163272 0.281992 0.119364
+v 0.157093 0.282138 0.134498
+v 0.087624 0.258202 0.080017
+v 0.084516 0.258704 0.096076
+v 0.081317 0.259732 0.112091
+v 0.000000 0.249967 0.071782
+v 0.000000 0.250761 0.088133
+v 0.000000 0.252089 0.104449
+v -0.087624 0.258202 0.080017
+v -0.084516 0.258704 0.096076
+v -0.081317 0.259732 0.112091
+v -0.169276 0.282347 0.104162
+v -0.163272 0.281992 0.119364
+v -0.157093 0.282139 0.134498
+v -0.239392 0.320755 0.142570
+v -0.230901 0.319038 0.156410
+v -0.222163 0.317782 0.170142
+v -0.293195 0.370810 0.192624
+v -0.282795 0.367317 0.204689
+v -0.272093 0.364235 0.216594
+v -0.327016 0.429100 0.250914
+v -0.315417 0.423540 0.260912
+v -0.303480 0.418329 0.270689
+v -0.338552 0.491652 0.313467
+v -0.326544 0.483874 0.321246
+v -0.314186 0.476380 0.328739
+v -0.349151 0.574818 0.363875
+v -0.359664 0.585411 0.357304
+v -0.369792 0.596181 0.350409
+v -0.331546 0.662095 0.416323
+v -0.322466 0.649521 0.421413
+v -0.313040 0.637053 0.426111
+v -0.270706 0.718698 0.472925
+v -0.263292 0.704572 0.476465
+v -0.255596 0.690496 0.479553
+v -0.191418 0.762130 0.516357
+v -0.186176 0.746815 0.518707
+v -0.180734 0.731504 0.520561
+v -0.099085 0.789433 0.543660
+v -0.096372 0.773370 0.545262
+v -0.093555 0.757283 0.546340
+v 0.000000 0.798745 0.552972
+v 0.000000 0.782428 0.554320
+v 0.000000 0.766076 0.555133
+v 0.099085 0.789433 0.543660
+v 0.096372 0.773370 0.545262
+v 0.093555 0.757283 0.546340
+v 0.191418 0.762130 0.516357
+v 0.186176 0.746815 0.518707
+v 0.180734 0.731504 0.520562
+v 0.270706 0.718698 0.472925
+v 0.263292 0.704573 0.476465
+v 0.255597 0.690496 0.479553
+v 0.331546 0.662095 0.416323
+v 0.322466 0.649521 0.421413
+v 0.313041 0.637053 0.426111
+v 0.369792 0.596181 0.350408
+v 0.359664 0.585411 0.357304
+v 0.349151 0.574818 0.363875
+v 0.382837 0.525446 0.279673
+v 0.372352 0.516614 0.288506
+v 0.361468 0.508031 0.297088
+v 0.369792 0.454711 0.208938
+v 0.359664 0.447816 0.219708
+v 0.349151 0.441244 0.230301
+v 0.331546 0.388796 0.143024
+v 0.322466 0.383707 0.155599
+v 0.313041 0.379009 0.168066
+v 0.270706 0.332194 0.086422
+v 0.263292 0.328655 0.100547
+v 0.255597 0.325566 0.114623
+v 0.191418 0.288762 0.042990
+v 0.186176 0.286412 0.058304
+v 0.180734 0.284558 0.073615
+v 0.099085 0.261459 0.015687
+v 0.096372 0.259857 0.031749
+v 0.093555 0.258779 0.047836
+v 0.000000 0.252147 0.006374
+v 0.000000 0.250799 0.022692
+v 0.000000 0.249986 0.039044
+v -0.099085 0.261459 0.015687
+v -0.096372 0.259857 0.031749
+v -0.093555 0.258779 0.047836
+v -0.191418 0.288762 0.042990
+v -0.186176 0.286412 0.058304
+v -0.180734 0.284558 0.073615
+v -0.270706 0.332194 0.086422
+v -0.263292 0.328655 0.100547
+v -0.255597 0.325566 0.114623
+v -0.331546 0.388796 0.143024
+v -0.322466 0.383707 0.155599
+v -0.313041 0.379009 0.168066
+v -0.369792 0.454711 0.208939
+v -0.359664 0.447816 0.219708
+v -0.349151 0.441244 0.230302
+v -0.382837 0.525446 0.279674
+v -0.372352 0.516614 0.288506
+v -0.361468 0.508031 0.297088
+v -0.388848 0.618203 0.335677
+v -0.397757 0.629431 0.327857
+v -0.406240 0.640789 0.319745
+v -0.364225 0.713200 0.392156
+v -0.356619 0.700330 0.398756
+v -0.348632 0.687514 0.404989
+v -0.297388 0.775381 0.454337
+v -0.291178 0.761213 0.459639
+v -0.284657 0.747033 0.464508
+v -0.210285 0.823094 0.502050
+v -0.205894 0.807930 0.506356
+v -0.201283 0.792704 0.510178
+v -0.108852 0.853088 0.532044
+v -0.106579 0.837297 0.535723
+v -0.104192 0.821413 0.538888
+v 0.000000 0.863318 0.542275
+v 0.000000 0.847314 0.545740
+v 0.000000 0.831205 0.548680
+v 0.108852 0.853088 0.532044
+v 0.106579 0.837297 0.535723
+v 0.104192 0.821413 0.538888
+v 0.210285 0.823094 0.502050
+v 0.205894 0.807930 0.506356
+v 0.201283 0.792704 0.510178
+v 0.297388 0.775381 0.454337
+v 0.291178 0.761213 0.459639
+v 0.284657 0.747033 0.464508
+v 0.364225 0.713200 0.392156
+v 0.356619 0.700330 0.398756
+v 0.348632 0.687514 0.404989
+v 0.406240 0.640789 0.319745
+v 0.397757 0.629431 0.327857
+v 0.388849 0.618203 0.335677
+v 0.420571 0.563082 0.242038
+v 0.411789 0.553347 0.251773
+v 0.402566 0.543822 0.261297
+v 0.406240 0.485375 0.164331
+v 0.397757 0.477262 0.175688
+v 0.388849 0.469442 0.186917
+v 0.364225 0.412963 0.091919
+v 0.356619 0.406363 0.104789
+v 0.348632 0.400131 0.117606
+v 0.297389 0.350782 0.029738
+v 0.291178 0.345480 0.043906
+v 0.284657 0.340612 0.058086
+v 0.210285 0.303069 -0.017975
+v 0.205894 0.298763 -0.002810
+v 0.201283 0.294941 0.012416
+v 0.108852 0.273075 -0.047969
+v 0.106579 0.269396 -0.032178
+v 0.104192 0.266231 -0.016294
+v -0.000000 0.262845 -0.058199
+v -0.000000 0.259379 -0.042195
+v -0.000000 0.256439 -0.026086
+v -0.108852 0.273075 -0.047969
+v -0.106579 0.269396 -0.032178
+v -0.104192 0.266231 -0.016294
+v -0.210285 0.303069 -0.017975
+v -0.205894 0.298763 -0.002810
+v -0.201283 0.294941 0.012416
+v -0.297389 0.350782 0.029738
+v -0.291179 0.345480 0.043906
+v -0.284657 0.340612 0.058087
+v -0.364225 0.412963 0.091920
+v -0.356619 0.406363 0.104789
+v -0.348632 0.400131 0.117606
+v -0.406240 0.485375 0.164331
+v -0.397757 0.477262 0.175688
+v -0.388849 0.469442 0.186917
+v -0.420571 0.563082 0.242038
+v -0.411789 0.553347 0.251773
+v -0.402566 0.543822 0.261297
+v -0.421892 0.663842 0.302679
+v -0.429045 0.675514 0.293744
+v -0.435738 0.687265 0.284553
+v -0.390672 0.764934 0.362223
+v -0.384671 0.751990 0.370220
+v -0.378258 0.739043 0.377881
+v -0.318982 0.831630 0.428919
+v -0.314082 0.817662 0.435892
+v -0.308847 0.803620 0.442457
+v -0.225554 0.882808 0.480096
+v -0.222090 0.868053 0.486283
+v -0.218387 0.853172 0.492009
+v -0.116756 0.914980 0.512268
+v -0.114962 0.899731 0.517961
+v -0.113046 0.884321 0.523158
+v 0.000000 0.925953 0.523241
+v 0.000000 0.910535 0.528765
+v 0.000000 0.894946 0.533783
+v 0.116756 0.914980 0.512268
+v 0.114962 0.899731 0.517961
+v 0.113046 0.884321 0.523158
+v 0.225555 0.882808 0.480096
+v 0.222090 0.868053 0.486283
+v 0.218388 0.853172 0.492009
+v 0.318982 0.831630 0.428919
+v 0.314082 0.817662 0.435892
+v 0.308847 0.803620 0.442457
+v 0.390672 0.764934 0.362223
+v 0.384671 0.751990 0.370220
+v 0.378258 0.739044 0.377880
+v 0.435738 0.687265 0.284553
+v 0.429045 0.675514 0.293744
+v 0.421892 0.663842 0.302679
+v 0.451109 0.603915 0.201204
+v 0.444180 0.593445 0.211675
+v 0.436775 0.583141 0.221978
+v 0.435738 0.520566 0.117855
+v 0.429045 0.511375 0.129606
+v 0.421892 0.502440 0.141277
+v 0.390672 0.442897 0.040185
+v 0.384671 0.434899 0.053129
+v 0.378258 0.427239 0.066076
+v 0.318982 0.376201 -0.026511
+v 0.314083 0.369228 -0.012542
+v 0.308847 0.362662 0.001499
+v 0.225555 0.325023 -0.077689
+v 0.222090 0.318836 -0.062934
+v 0.218388 0.313110 -0.048053
+v 0.116756 0.292851 -0.109860
+v 0.114962 0.287158 -0.094611
+v 0.113046 0.281961 -0.079202
+v -0.000000 0.281878 -0.120833
+v -0.000000 0.276354 -0.105416
+v -0.000000 0.271336 -0.089826
+v -0.116756 0.292851 -0.109860
+v -0.114962 0.287158 -0.094611
+v -0.113046 0.281961 -0.079202
+v -0.225555 0.325023 -0.077689
+v -0.222090 0.318836 -0.062934
+v -0.218388 0.313110 -0.048053
+v -0.318982 0.376201 -0.026511
+v -0.314083 0.369228 -0.012542
+v -0.308847 0.362662 0.001499
+v -0.390672 0.442897 0.040185
+v -0.384671 0.434899 0.053130
+v -0.378258 0.427239 0.066076
+v -0.435738 0.520566 0.117855
+v -0.429045 0.511375 0.129606
+v -0.421892 0.502440 0.141277
+v -0.451109 0.603915 0.201204
+v -0.444180 0.593445 0.211675
+v -0.436775 0.583141 0.221978
+v -0.447717 0.710956 0.265445
+v -0.452991 0.722871 0.255548
+v -0.457780 0.734814 0.245436
+v -0.410434 0.816413 0.327034
+v -0.406140 0.803615 0.336292
+v -0.401412 0.790761 0.345250
+v -0.335118 0.886483 0.397104
+v -0.331612 0.872952 0.405629
+v -0.327752 0.859290 0.413779
+v -0.236964 0.940249 0.450871
+v -0.234485 0.926157 0.458833
+v -0.231756 0.911875 0.466364
+v -0.122662 0.974048 0.484670
+v -0.121379 0.959602 0.492279
+v -0.119965 0.944931 0.499420
+v 0.000000 0.985577 0.496198
+v 0.000000 0.971010 0.503687
+v 0.000000 0.956206 0.510695
+v 0.122662 0.974048 0.484670
+v 0.121379 0.959602 0.492279
+v 0.119966 0.944931 0.499420
+v 0.236964 0.940249 0.450871
+v 0.234485 0.926157 0.458834
+v 0.231756 0.911875 0.466364
+v 0.335118 0.886483 0.397104
+v 0.331612 0.872952 0.405629
+v 0.327752 0.859291 0.413779
+v 0.410434 0.816413 0.327034
+v 0.406141 0.803615 0.336292
+v 0.401412 0.790761 0.345250
+v 0.457780 0.734814 0.245436
+v 0.452991 0.722871 0.255548
+v 0.447717 0.710956 0.265445
+v 0.473929 0.647249 0.157870
+v 0.468971 0.636221 0.168898
+v 0.463511 0.625315 0.179804
+v 0.457780 0.559683 0.070305
+v 0.452991 0.549571 0.082249
+v 0.447717 0.539674 0.094163
+v 0.410434 0.478085 -0.011293
+v 0.406141 0.468827 0.001504
+v 0.401413 0.459870 0.014359
+v 0.335118 0.408015 -0.081363
+v 0.331612 0.399490 -0.067833
+v 0.327752 0.391340 -0.054171
+v 0.236964 0.354248 -0.135130
+v 0.234485 0.346286 -0.121037
+v 0.231756 0.338755 -0.106756
+v 0.122662 0.320449 -0.168929
+v 0.121379 0.312840 -0.154483
+v 0.119966 0.305699 -0.139812
+v -0.000000 0.308921 -0.180457
+v -0.000000 0.301433 -0.165890
+v -0.000000 0.294424 -0.151087
+v -0.122662 0.320449 -0.168929
+v -0.121379 0.312840 -0.154483
+v -0.119966 0.305699 -0.139812
+v -0.236964 0.354248 -0.135130
+v -0.234485 0.346286 -0.121037
+v -0.231756 0.338755 -0.106756
+v -0.335118 0.408015 -0.081363
+v -0.331613 0.399490 -0.067833
+v -0.327752 0.391340 -0.054171
+v -0.410434 0.478085 -0.011293
+v -0.406141 0.468827 0.001504
+v -0.401413 0.459870 0.014359
+v -0.457780 0.559683 0.070305
+v -0.452991 0.549571 0.082249
+v -0.447718 0.539674 0.094163
+v -0.473929 0.647249 0.157871
+v -0.468971 0.636221 0.168898
+v -0.463511 0.625315 0.179804
+v -0.465882 0.758738 0.224612
+v -0.469186 0.770692 0.213922
+v -0.471989 0.782624 0.203063
+v -0.423174 0.866755 0.287194
+v -0.420661 0.854323 0.297554
+v -0.417698 0.841780 0.307655
+v -0.345520 0.939000 0.359438
+v -0.343468 0.926139 0.369370
+v -0.341049 0.913090 0.378965
+v -0.244319 0.994435 0.414874
+v -0.242869 0.981246 0.424476
+v -0.241158 0.967809 0.433683
+v -0.126469 1.029284 0.449722
+v -0.125718 1.015887 0.459117
+v -0.124833 1.002206 0.468080
+v 0.000000 1.041170 0.461608
+v 0.000000 1.027703 0.470933
+v 0.000000 1.013938 0.479813
+v 0.126469 1.029284 0.449722
+v 0.125718 1.015887 0.459117
+v 0.124833 1.002206 0.468080
+v 0.244320 0.994436 0.414874
+v 0.242869 0.981246 0.424476
+v 0.241158 0.967809 0.433683
+v 0.345520 0.939000 0.359438
+v 0.343468 0.926139 0.369370
+v 0.341049 0.913091 0.378965
+v 0.423174 0.866755 0.287194
+v 0.420661 0.854324 0.297554
+v 0.417698 0.841780 0.307655
+v 0.471989 0.782624 0.203063
+v 0.469187 0.770692 0.213922
+v 0.465882 0.758738 0.224612
+v 0.488639 0.692340 0.112779
+v 0.485738 0.680944 0.124175
+v 0.482317 0.669623 0.135497
+v 0.471989 0.602057 0.022495
+v 0.469187 0.591197 0.034427
+v 0.465882 0.580507 0.046381
+v 0.423174 0.517926 -0.061636
+v 0.420661 0.507565 -0.049204
+v 0.417698 0.497465 -0.036661
+v 0.345520 0.445681 -0.133881
+v 0.343468 0.435749 -0.121020
+v 0.341049 0.426154 -0.107971
+v 0.244320 0.390245 -0.189316
+v 0.242869 0.380643 -0.176126
+v 0.241158 0.371436 -0.162689
+v 0.126469 0.355397 -0.224164
+v 0.125718 0.346002 -0.210768
+v 0.124833 0.337039 -0.197087
+v -0.000000 0.343511 -0.236050
+v -0.000000 0.334186 -0.222583
+v -0.000000 0.325307 -0.208819
+v -0.126469 0.355397 -0.224164
+v -0.125718 0.346002 -0.210768
+v -0.124833 0.337039 -0.197087
+v -0.244320 0.390245 -0.189316
+v -0.242869 0.380643 -0.176126
+v -0.241158 0.371436 -0.162689
+v -0.345520 0.445681 -0.133881
+v -0.343468 0.435749 -0.121020
+v -0.341049 0.426154 -0.107971
+v -0.423174 0.517926 -0.061636
+v -0.420661 0.507565 -0.049204
+v -0.417698 0.497465 -0.036661
+v -0.471989 0.602057 0.022495
+v -0.469187 0.591197 0.034427
+v -0.465882 0.580507 0.046381
+v -0.488639 0.692340 0.112779
+v -0.485738 0.680944 0.124175
+v -0.482317 0.669622 0.135497
+v -0.476075 0.806370 0.180879
+v -0.477354 0.818159 0.169580
+v -0.478123 0.829875 0.158158
+v -0.428673 0.915100 0.243382
+v -0.427984 0.903247 0.254667
+v -0.426837 0.891230 0.265739
+v -0.350010 0.988283 0.316566
+v -0.349447 0.976313 0.327733
+v -0.348511 0.964100 0.338609
+v -0.247494 1.044439 0.372721
+v -0.247097 1.032379 0.383799
+v -0.246435 1.020015 0.394524
+v -0.128113 1.079740 0.408022
+v -0.127907 1.067623 0.419043
+v -0.127564 1.055165 0.429674
+v -0.000000 1.091781 0.420063
+v 0.000000 1.079644 0.431064
+v 0.000000 1.067154 0.441663
+v 0.128113 1.079740 0.408023
+v 0.127907 1.067623 0.419043
+v 0.127564 1.055165 0.429674
+v 0.247494 1.044439 0.372721
+v 0.247097 1.032379 0.383799
+v 0.246435 1.020015 0.394524
+v 0.350010 0.988284 0.316566
+v 0.349448 0.976313 0.327733
+v 0.348511 0.964100 0.338609
+v 0.428673 0.915100 0.243382
+v 0.427984 0.903247 0.254667
+v 0.426837 0.891230 0.265739
+v 0.478123 0.829875 0.158158
+v 0.477354 0.818159 0.169580
+v 0.476075 0.806370 0.180879
+v 0.494989 0.738419 0.066701
+v 0.494193 0.726849 0.078270
+v 0.492869 0.715305 0.089814
+v 0.478123 0.646962 -0.024756
+v 0.477354 0.635540 -0.013040
+v 0.476075 0.624240 -0.001251
+v 0.428673 0.561737 -0.109980
+v 0.427984 0.550452 -0.098127
+v 0.426837 0.539381 -0.086110
+v 0.350010 0.488554 -0.183164
+v 0.349448 0.477386 -0.171193
+v 0.348511 0.466510 -0.158981
+v 0.247494 0.432398 -0.239320
+v 0.247097 0.421320 -0.227259
+v 0.246435 0.410595 -0.214896
+v 0.128113 0.397097 -0.274621
+v 0.127907 0.386076 -0.262503
+v 0.127564 0.375445 -0.250046
+v -0.000000 0.385056 -0.286661
+v -0.000000 0.374055 -0.274525
+v -0.000000 0.363456 -0.262035
+v -0.128113 0.397097 -0.274621
+v -0.127907 0.386076 -0.262503
+v -0.127564 0.375445 -0.250046
+v -0.247495 0.432398 -0.239320
+v -0.247097 0.421320 -0.227259
+v -0.246435 0.410595 -0.214896
+v -0.350010 0.488554 -0.183164
+v -0.349448 0.477386 -0.171193
+v -0.348511 0.466510 -0.158981
+v -0.428673 0.561737 -0.109980
+v -0.427984 0.550452 -0.098127
+v -0.426837 0.539380 -0.086110
+v -0.478123 0.646962 -0.024756
+v -0.477354 0.635540 -0.013040
+v -0.476075 0.624240 -0.001251
+v -0.494989 0.738419 0.066701
+v -0.494194 0.726849 0.078270
+v -0.492869 0.715305 0.089814
+v -0.478123 0.853038 0.134995
+v -0.477354 0.864460 0.123279
+v -0.476075 0.875760 0.111490
+v -0.426837 0.960619 0.196349
+v -0.427984 0.949548 0.208366
+v -0.428673 0.938263 0.220219
+v -0.348511 1.033490 0.269219
+v -0.349447 1.022614 0.281432
+v -0.350010 1.011446 0.293403
+v -0.246435 1.089405 0.325135
+v -0.247097 1.078680 0.337498
+v -0.247494 1.067602 0.349559
+v -0.127564 1.124555 0.360285
+v -0.127907 1.113924 0.372742
+v -0.128113 1.102903 0.384859
+v -0.000000 1.136544 0.372273
+v -0.000000 1.125945 0.384763
+v -0.000000 1.114944 0.396900
+v 0.127564 1.124555 0.360285
+v 0.127907 1.113924 0.372742
+v 0.128113 1.102903 0.384860
+v 0.246435 1.089405 0.325135
+v 0.247097 1.078680 0.337498
+v 0.247494 1.067602 0.349559
+v 0.348511 1.033490 0.269219
+v 0.349448 1.022614 0.281432
+v 0.350010 1.011447 0.293403
+v 0.426837 0.960620 0.196349
+v 0.427984 0.949548 0.208366
+v 0.428673 0.938263 0.220219
+v 0.476075 0.875760 0.111490
+v 0.477354 0.864460 0.123279
+v 0.478123 0.853038 0.134995
+v 0.492869 0.784695 0.020424
+v 0.494193 0.773151 0.031969
+v 0.494989 0.761582 0.043538
+v 0.476075 0.693630 -0.070641
+v 0.477354 0.681841 -0.059341
+v 0.478123 0.670125 -0.047919
+v 0.426837 0.608770 -0.155500
+v 0.427984 0.596753 -0.144428
+v 0.428673 0.584900 -0.133143
+v 0.348511 0.535900 -0.228370
+v 0.349448 0.523687 -0.217495
+v 0.350010 0.511717 -0.206327
+v 0.246435 0.479985 -0.284286
+v 0.247097 0.467622 -0.273560
+v 0.247494 0.455561 -0.262483
+v 0.127564 0.444835 -0.319436
+v 0.127907 0.432377 -0.308805
+v 0.128113 0.420260 -0.297784
+v -0.000000 0.432846 -0.331425
+v -0.000000 0.420356 -0.320826
+v -0.000000 0.408219 -0.309824
+v -0.127564 0.444835 -0.319436
+v -0.127907 0.432377 -0.308805
+v -0.128113 0.420260 -0.297784
+v -0.246435 0.479984 -0.284286
+v -0.247097 0.467622 -0.273560
+v -0.247495 0.455561 -0.262483
+v -0.348511 0.535900 -0.228370
+v -0.349448 0.523687 -0.217495
+v -0.350010 0.511716 -0.206327
+v -0.426837 0.608770 -0.155500
+v -0.427984 0.596753 -0.144428
+v -0.428673 0.584900 -0.133143
+v -0.476075 0.693630 -0.070641
+v -0.477354 0.681841 -0.059341
+v -0.478123 0.670125 -0.047919
+v -0.492869 0.784695 0.020425
+v -0.494194 0.773151 0.031969
+v -0.494989 0.761582 0.043538
+v -0.471989 0.897943 0.087743
+v -0.469187 0.908803 0.075811
+v -0.465882 0.919493 0.063857
+v -0.417698 1.002535 0.146900
+v -0.420661 0.992435 0.159443
+v -0.423174 0.982074 0.171874
+v -0.341049 1.073846 0.218210
+v -0.343468 1.064250 0.231259
+v -0.345520 1.054319 0.244119
+v -0.241158 1.128564 0.272928
+v -0.242869 1.119357 0.286365
+v -0.244320 1.109755 0.299555
+v -0.124833 1.162961 0.307325
+v -0.125718 1.153998 0.321006
+v -0.126469 1.144603 0.334403
+v -0.000000 1.174693 0.319057
+v -0.000000 1.165813 0.332822
+v -0.000000 1.156489 0.346289
+v 0.124833 1.162961 0.307325
+v 0.125718 1.153998 0.321006
+v 0.126469 1.144603 0.334403
+v 0.241158 1.128564 0.272928
+v 0.242869 1.119357 0.286365
+v 0.244320 1.109755 0.299555
+v 0.341049 1.073846 0.218210
+v 0.343468 1.064250 0.231259
+v 0.345520 1.054319 0.244119
+v 0.417698 1.002535 0.146900
+v 0.420661 0.992435 0.159443
+v 0.423174 0.982074 0.171874
+v 0.465882 0.919493 0.063857
+v 0.469187 0.908803 0.075811
+v 0.471989 0.897943 0.087743
+v 0.482317 0.830377 -0.025258
+v 0.485738 0.819055 -0.013936
+v 0.488639 0.807660 -0.002540
+v 0.465882 0.741262 -0.114374
+v 0.469187 0.729308 -0.103684
+v 0.471989 0.717376 -0.092824
+v 0.417698 0.658220 -0.197416
+v 0.420661 0.645676 -0.187315
+v 0.423174 0.633245 -0.176955
+v 0.341049 0.586910 -0.268726
+v 0.343468 0.573861 -0.259131
+v 0.345520 0.561000 -0.249200
+v 0.241158 0.532191 -0.323444
+v 0.242869 0.518754 -0.314238
+v 0.244320 0.505565 -0.304635
+v 0.124833 0.497794 -0.357842
+v 0.125718 0.484113 -0.348879
+v 0.126469 0.470716 -0.339484
+v -0.000000 0.486062 -0.369574
+v -0.000000 0.472297 -0.360694
+v -0.000000 0.458830 -0.351370
+v -0.124833 0.497794 -0.357842
+v -0.125718 0.484113 -0.348879
+v -0.126469 0.470716 -0.339483
+v -0.241158 0.532191 -0.323444
+v -0.242869 0.518754 -0.314237
+v -0.244320 0.505564 -0.304635
+v -0.341049 0.586909 -0.268726
+v -0.343468 0.573860 -0.259131
+v -0.345520 0.561000 -0.249200
+v -0.417698 0.658220 -0.197416
+v -0.420661 0.645676 -0.187315
+v -0.423174 0.633245 -0.176955
+v -0.465882 0.741262 -0.114374
+v -0.469187 0.729308 -0.103684
+v -0.471989 0.717376 -0.092824
+v -0.482317 0.830377 -0.025258
+v -0.485738 0.819055 -0.013936
+v -0.488639 0.807660 -0.002540
+v -0.457780 0.940317 0.039934
+v -0.453031 0.950376 0.028058
+v -0.447879 0.960114 0.016349
+v -0.401557 1.039948 0.096182
+v -0.406177 1.031127 0.108810
+v -0.410434 1.021915 0.121532
+v -0.327870 1.108502 0.164736
+v -0.331642 1.100471 0.178153
+v -0.335118 1.091985 0.191602
+v -0.231839 1.161106 0.217340
+v -0.234506 1.153679 0.231362
+v -0.236964 1.145752 0.245369
+v -0.120009 1.194174 0.250408
+v -0.121389 1.187128 0.264811
+v -0.122662 1.179551 0.279168
+v -0.000000 1.205453 0.261687
+v -0.000000 1.198537 0.276219
+v -0.000000 1.191079 0.290696
+v 0.120009 1.194174 0.250408
+v 0.121389 1.187128 0.264811
+v 0.122662 1.179551 0.279168
+v 0.231839 1.161106 0.217340
+v 0.234506 1.153679 0.231362
+v 0.236964 1.145752 0.245369
+v 0.327870 1.108502 0.164736
+v 0.331642 1.100471 0.178153
+v 0.335118 1.091985 0.191602
+v 0.401557 1.039948 0.096182
+v 0.406177 1.031127 0.108810
+v 0.410434 1.021915 0.121532
+v 0.447879 0.960115 0.016348
+v 0.453031 0.950376 0.028058
+v 0.457780 0.940317 0.039934
+v 0.463678 0.874443 -0.069323
+v 0.469013 0.863718 -0.058599
+v 0.473929 0.852751 -0.047632
+v 0.447879 0.788771 -0.154995
+v 0.453031 0.777061 -0.145256
+v 0.457780 0.765185 -0.135198
+v 0.401557 0.708938 -0.234829
+v 0.406177 0.696309 -0.226008
+v 0.410434 0.683587 -0.216796
+v 0.327870 0.640383 -0.303383
+v 0.331642 0.626966 -0.295351
+v 0.335118 0.613517 -0.286866
+v 0.231839 0.587779 -0.355987
+v 0.234506 0.573757 -0.348560
+v 0.236964 0.559751 -0.340632
+v 0.120009 0.554711 -0.389055
+v 0.121389 0.540309 -0.382009
+v 0.122662 0.525952 -0.374431
+v -0.000000 0.543432 -0.400334
+v -0.000000 0.528900 -0.393417
+v -0.000000 0.514423 -0.385960
+v -0.120009 0.554711 -0.389055
+v -0.121389 0.540308 -0.382009
+v -0.122662 0.525952 -0.374431
+v -0.231839 0.587779 -0.355987
+v -0.234506 0.573757 -0.348560
+v -0.236964 0.559751 -0.340632
+v -0.327870 0.640383 -0.303383
+v -0.331642 0.626966 -0.295351
+v -0.335118 0.613517 -0.286866
+v -0.401557 0.708937 -0.234828
+v -0.406177 0.696309 -0.226008
+v -0.410434 0.683587 -0.216796
+v -0.447879 0.788771 -0.154995
+v -0.453032 0.777061 -0.145256
+v -0.457780 0.765185 -0.135197
+v -0.463678 0.874443 -0.069323
+v -0.469013 0.863718 -0.058599
+v -0.473929 0.852751 -0.047632
+v -0.436545 0.978377 -0.006250
+v -0.430790 0.986534 -0.016609
+v -0.425483 0.993636 -0.025741
+v -0.381477 1.069478 0.050100
+v -0.386235 1.063321 0.060178
+v -0.391396 1.056190 0.071563
+v -0.311475 1.134604 0.115226
+v -0.315360 1.129260 0.126117
+v -0.319573 1.123010 0.138383
+v -0.220246 1.184577 0.165199
+v -0.222993 1.179857 0.176714
+v -0.225972 1.174283 0.189655
+v -0.114008 1.215991 0.196614
+v -0.115430 1.211663 0.208520
+v -0.116972 1.206514 0.221886
+v -0.000000 1.226707 0.207329
+v -0.000000 1.222512 0.219368
+v -0.000000 1.217507 0.232880
+v 0.114008 1.215992 0.196614
+v 0.115430 1.211663 0.208520
+v 0.116972 1.206514 0.221886
+v 0.220246 1.184577 0.165199
+v 0.222993 1.179857 0.176714
+v 0.225972 1.174283 0.189655
+v 0.311475 1.134604 0.115226
+v 0.315360 1.129260 0.126117
+v 0.319573 1.123010 0.138382
+v 0.381477 1.069478 0.050100
+v 0.386235 1.063321 0.060178
+v 0.391396 1.056190 0.071563
+v 0.425483 0.993636 -0.025741
+v 0.430790 0.986534 -0.016609
+v 0.436545 0.978377 -0.006250
+v 0.440492 0.912248 -0.107129
+v 0.445986 0.904131 -0.099012
+v 0.451945 0.894873 -0.089754
+v 0.425483 0.830861 -0.188517
+v 0.430790 0.821728 -0.181415
+v 0.436545 0.811370 -0.173258
+v 0.381477 0.755019 -0.264358
+v 0.386236 0.744941 -0.258202
+v 0.391396 0.733556 -0.251071
+v 0.311475 0.689893 -0.329485
+v 0.315360 0.679002 -0.324141
+v 0.319573 0.666737 -0.317891
+v 0.220246 0.639920 -0.379458
+v 0.222993 0.628406 -0.374737
+v 0.225972 0.615464 -0.369163
+v 0.114008 0.608505 -0.410872
+v 0.115430 0.596599 -0.406544
+v 0.116972 0.583233 -0.401394
+v -0.000000 0.597790 -0.421587
+v -0.000000 0.585751 -0.417392
+v -0.000000 0.572239 -0.412388
+v -0.114008 0.608505 -0.410872
+v -0.115430 0.596599 -0.406544
+v -0.116972 0.583233 -0.401395
+v -0.220246 0.639920 -0.379458
+v -0.222993 0.628406 -0.374737
+v -0.225972 0.615464 -0.369163
+v -0.311475 0.689893 -0.329485
+v -0.315360 0.679002 -0.324141
+v -0.319573 0.666737 -0.317891
+v -0.381477 0.755019 -0.264358
+v -0.386236 0.744941 -0.258202
+v -0.391396 0.733556 -0.251071
+v -0.425483 0.830861 -0.188517
+v -0.430790 0.821728 -0.181415
+v -0.436545 0.811370 -0.173258
+v -0.440492 0.912248 -0.107129
+v -0.445987 0.904131 -0.099012
+v -0.451945 0.894873 -0.089754
+v -0.369589 1.045475 -0.098963
+v -0.359461 1.052244 -0.109607
+v -0.348541 1.058811 -0.120352
+v -0.312493 1.120938 -0.058225
+v -0.322284 1.116318 -0.045534
+v -0.331364 1.111353 -0.033085
+v -0.255150 1.174287 -0.004876
+v -0.263144 1.171338 0.009486
+v -0.270558 1.167924 0.023486
+v -0.180418 1.215224 0.036061
+v -0.186071 1.213557 0.051705
+v -0.191313 1.211333 0.066895
+v -0.093391 1.240957 0.061794
+v -0.096317 1.240097 0.078245
+v -0.099031 1.238621 0.094182
+v -0.000000 1.249735 0.070572
+v -0.000000 1.249149 0.087297
+v -0.000000 1.247928 0.103490
+v 0.093391 1.240958 0.061794
+v 0.096317 1.240097 0.078245
+v 0.099031 1.238621 0.094182
+v 0.180418 1.215224 0.036061
+v 0.186071 1.213557 0.051705
+v 0.191313 1.211333 0.066895
+v 0.255150 1.174288 -0.004876
+v 0.263143 1.171338 0.009486
+v 0.270558 1.167925 0.023486
+v 0.312493 1.120938 -0.058225
+v 0.322284 1.116318 -0.045534
+v 0.331364 1.111354 -0.033085
+v 0.348541 1.058811 -0.120352
+v 0.359461 1.052244 -0.109608
+v 0.369589 1.045475 -0.098963
+v 0.360836 0.992141 -0.187022
+v 0.372141 0.983486 -0.178366
+v 0.382627 0.974779 -0.169659
+v 0.348541 0.925471 -0.253692
+v 0.359461 0.914727 -0.247125
+v 0.369589 0.904082 -0.240356
+v 0.312493 0.863344 -0.315819
+v 0.322284 0.850654 -0.311198
+v 0.331364 0.838204 -0.306234
+v 0.255150 0.809995 -0.369168
+v 0.263144 0.795633 -0.366219
+v 0.270558 0.781633 -0.362805
+v 0.180418 0.769059 -0.410105
+v 0.186071 0.753414 -0.408438
+v 0.191313 0.738224 -0.406214
+v 0.093391 0.743325 -0.435838
+v 0.096317 0.726874 -0.434978
+v 0.099031 0.710937 -0.433501
+v -0.000000 0.734547 -0.444616
+v -0.000000 0.717822 -0.444030
+v -0.000000 0.701629 -0.442809
+v -0.093391 0.743325 -0.435838
+v -0.096317 0.726874 -0.434978
+v -0.099031 0.710937 -0.433501
+v -0.180418 0.769058 -0.410105
+v -0.186071 0.753414 -0.408438
+v -0.191313 0.738224 -0.406214
+v -0.255150 0.809995 -0.369168
+v -0.263144 0.795633 -0.366219
+v -0.270558 0.781633 -0.362805
+v -0.312494 0.863344 -0.315819
+v -0.322284 0.850654 -0.311198
+v -0.331365 0.838204 -0.306234
+v -0.348541 0.925471 -0.253692
+v -0.359461 0.914727 -0.247125
+v -0.369589 0.904082 -0.240356
+v -0.360837 0.992141 -0.187022
+v -0.372141 0.983486 -0.178366
+v -0.382627 0.974779 -0.169659
+v -0.285207 1.098220 -0.155071
+v -0.278262 1.111369 -0.141922
+v -0.270129 1.124168 -0.129124
+v -0.250431 1.148490 -0.104802
+v -0.238949 1.159909 -0.093382
+v -0.226447 1.170771 -0.082520
+v -0.198589 1.190630 -0.062662
+v -0.183352 1.199542 -0.053750
+v -0.167332 1.207727 -0.045565
+v -0.133214 1.221769 -0.031522
+v -0.115260 1.227566 -0.025725
+v -0.096814 1.232517 -0.020775
+v -0.058760 1.239786 -0.013506
+v -0.039313 1.242073 -0.011219
+v -0.019698 1.243452 -0.009840
+v 0.019698 1.243452 -0.009840
+v 0.039313 1.242073 -0.011218
+v 0.058760 1.239786 -0.013506
+v 0.096814 1.232517 -0.020774
+v 0.115260 1.227566 -0.025725
+v 0.133214 1.221769 -0.031522
+v 0.167332 1.207727 -0.045565
+v 0.183352 1.199542 -0.053750
+v 0.198589 1.190630 -0.062662
+v 0.226447 1.170771 -0.082521
+v 0.238949 1.159909 -0.093382
+v 0.250431 1.148490 -0.104802
+v 0.270129 1.124168 -0.129124
+v 0.278262 1.111369 -0.141922
+v 0.285207 1.098220 -0.155071
+v 0.295403 1.071093 -0.182199
+v 0.298612 1.057230 -0.196062
+v 0.300546 1.043248 -0.210044
+v 0.300546 1.015163 -0.238128
+v 0.298612 1.001181 -0.252111
+v 0.295403 0.987318 -0.265974
+v 0.285207 0.960191 -0.293101
+v 0.278262 0.947042 -0.306250
+v 0.270129 0.934243 -0.319048
+v 0.250431 0.909921 -0.343370
+v 0.238949 0.898502 -0.354790
+v 0.226447 0.887640 -0.365652
+v 0.198589 0.867781 -0.385510
+v 0.183352 0.858869 -0.394423
+v 0.167332 0.850684 -0.402608
+v 0.133213 0.836641 -0.416650
+v 0.115260 0.830844 -0.422447
+v 0.096814 0.825894 -0.427398
+v 0.058760 0.818625 -0.434667
+v 0.039313 0.816338 -0.436954
+v 0.019698 0.814959 -0.438332
+v -0.019699 0.814959 -0.438332
+v -0.039313 0.816338 -0.436954
+v -0.058760 0.818625 -0.434667
+v -0.096814 0.825894 -0.427398
+v -0.115260 0.830844 -0.422447
+v -0.133214 0.836641 -0.416650
+v -0.219577 0.867274 -0.375484
+v -0.227910 0.854432 -0.374669
+v -0.237159 0.839906 -0.373392
+v -0.167332 0.850684 -0.402608
+v -0.183352 0.858869 -0.394423
+v -0.198589 0.867781 -0.385510
+v -0.226447 0.887640 -0.365652
+v -0.238949 0.898502 -0.354790
+v -0.250431 0.909921 -0.343370
+v -0.270130 0.934243 -0.319048
+v -0.278262 0.947042 -0.306250
+v -0.285207 0.960191 -0.293101
+v -0.295403 0.987318 -0.265973
+v -0.298612 1.001181 -0.252111
+v -0.300546 1.015163 -0.238128
+v -0.300546 1.043248 -0.210044
+v -0.298612 1.057230 -0.196062
+v -0.295403 1.071093 -0.182199
+v -0.155265 0.832064 -0.410693
+v -0.161156 0.817871 -0.411230
+v -0.167697 0.801856 -0.411442
+v -0.080371 0.809931 -0.432827
+v -0.083421 0.794888 -0.434213
+v -0.086806 0.777937 -0.435361
+v -0.000000 0.802381 -0.440376
+v -0.000000 0.787048 -0.442052
+v -0.000000 0.769778 -0.443520
+v 0.080371 0.809931 -0.432827
+v 0.083421 0.794888 -0.434213
+v 0.086806 0.777937 -0.435361
+v 0.155264 0.832064 -0.410693
+v 0.161156 0.817871 -0.411230
+v 0.167697 0.801856 -0.411442
+v 0.219577 0.867274 -0.375484
+v 0.227910 0.854432 -0.374669
+v 0.237159 0.839906 -0.373392
+v 0.268926 0.913160 -0.329598
+v 0.279131 0.902079 -0.327022
+v 0.290459 0.889494 -0.323805
+v 0.299948 0.966595 -0.276162
+v 0.311330 0.957566 -0.271535
+v 0.323965 0.947240 -0.266059
+v 0.310529 1.023938 -0.218819
+v 0.322313 1.017110 -0.211991
+v 0.335393 1.009209 -0.204090
+v 0.299948 1.081282 -0.161476
+v 0.311330 1.076654 -0.152446
+v 0.323965 1.071178 -0.142120
+v 0.268926 1.134717 -0.108041
+v 0.279131 1.132141 -0.096960
+v 0.290459 1.128924 -0.084374
+v 0.219577 1.180603 -0.062155
+v 0.227910 1.179788 -0.049313
+v 0.237159 1.178512 -0.034787
+v 0.155265 1.215813 -0.026945
+v 0.161156 1.216349 -0.012752
+v 0.167697 1.216562 0.003263
+v 0.080371 1.237946 -0.004811
+v 0.083421 1.239332 0.010232
+v 0.086806 1.240481 0.027182
+v -0.000000 1.245495 0.002738
+v -0.000000 1.247172 0.018071
+v -0.000000 1.248639 0.035341
+v -0.080371 1.237946 -0.004811
+v -0.083421 1.239332 0.010232
+v -0.086806 1.240481 0.027182
+v -0.155265 1.215812 -0.026945
+v -0.161156 1.216349 -0.012752
+v -0.167697 1.216562 0.003263
+v -0.219577 1.180603 -0.062155
+v -0.227910 1.179788 -0.049313
+v -0.237159 1.178512 -0.034787
+v -0.268926 1.134717 -0.108041
+v -0.279131 1.132141 -0.096960
+v -0.290459 1.128924 -0.084374
+v -0.323965 1.071178 -0.142120
+v -0.311330 1.076654 -0.152446
+v -0.299948 1.081282 -0.161476
+v -0.310529 1.023938 -0.218819
+v -0.322313 1.017110 -0.211991
+v -0.335393 1.009209 -0.204089
+v -0.299948 0.966595 -0.276162
+v -0.311330 0.957566 -0.271535
+v -0.323965 0.947240 -0.266059
+v -0.268926 0.913160 -0.329598
+v -0.279131 0.902079 -0.327022
+v -0.290459 0.889494 -0.323805
+v -0.434917 0.939198 -0.093380
+v -0.432118 0.959461 -0.073117
+v -0.427475 0.979551 -0.053028
+v -0.427476 0.858147 -0.174431
+v -0.432119 0.878237 -0.154342
+v -0.434917 0.898499 -0.134079
+v -0.390902 0.781233 -0.251346
+v -0.402670 0.799780 -0.232799
+v -0.412720 0.818835 -0.213743
+v -0.327689 0.713697 -0.318882
+v -0.345781 0.729437 -0.303141
+v -0.362397 0.745987 -0.286592
+v -0.242145 0.660141 -0.372437
+v -0.265327 0.672003 -0.360575
+v -0.287377 0.684918 -0.347660
+v -0.140099 0.624217 -0.408362
+v -0.166792 0.631391 -0.401188
+v -0.192772 0.639792 -0.392786
+v -0.028506 0.608371 -0.424208
+v -0.056890 0.610368 -0.422210
+v -0.085031 0.613683 -0.418895
+v 0.085031 0.613683 -0.418895
+v 0.056889 0.610368 -0.422210
+v 0.028505 0.608371 -0.424208
+v 0.216235 0.656187 -0.385806
+v 0.214803 0.661675 -0.387753
+v 0.213267 0.667206 -0.389485
+v 0.192772 0.639792 -0.392786
+v 0.166791 0.631391 -0.401188
+v 0.140099 0.624217 -0.408362
+v 0.287376 0.684918 -0.347660
+v 0.265327 0.672003 -0.360575
+v 0.242145 0.660142 -0.372437
+v 0.362397 0.745987 -0.286592
+v 0.345781 0.729437 -0.303141
+v 0.327689 0.713697 -0.318882
+v 0.412720 0.818835 -0.213743
+v 0.402670 0.799780 -0.232799
+v 0.390902 0.781233 -0.251346
+v 0.434917 0.898499 -0.134079
+v 0.432118 0.878237 -0.154342
+v 0.427475 0.858147 -0.174431
+v 0.427475 0.979551 -0.053028
+v 0.432118 0.959461 -0.073117
+v 0.434917 0.939198 -0.093380
+v 0.390902 1.056465 0.023886
+v 0.402670 1.037918 0.005339
+v 0.412720 1.018863 -0.013716
+v 0.327689 1.124001 0.091422
+v 0.345781 1.108260 0.075682
+v 0.362396 1.091711 0.059133
+v 0.242145 1.177556 0.144978
+v 0.265327 1.165695 0.133116
+v 0.287376 1.152780 0.120201
+v 0.140099 1.213481 0.180902
+v 0.166791 1.206307 0.173728
+v 0.192772 1.197906 0.165327
+v 0.028505 1.229327 0.196749
+v 0.056889 1.227329 0.194751
+v 0.085031 1.224015 0.191436
+v -0.085031 1.224015 0.191436
+v -0.056889 1.227329 0.194751
+v -0.028505 1.229327 0.196748
+v -0.192772 1.197906 0.165327
+v -0.166791 1.206307 0.173728
+v -0.140099 1.213481 0.180902
+v -0.287376 1.152779 0.120201
+v -0.265327 1.165695 0.133116
+v -0.242145 1.177556 0.144978
+v -0.362396 1.091711 0.059133
+v -0.345781 1.108260 0.075682
+v -0.327689 1.124001 0.091422
+v -0.412720 1.018863 -0.013716
+v -0.402670 1.037918 0.005339
+v -0.390902 1.056465 0.023886
+v -0.347723 1.100618 -0.008864
+v -0.354858 1.095241 0.002393
+v -0.360997 1.090312 0.012383
+v -0.283915 1.159981 0.050499
+v -0.289740 1.155823 0.062975
+v -0.294752 1.151942 0.074013
+v -0.317665 1.134230 0.068642
+v -0.335203 1.118971 0.053382
+v -0.351311 1.102928 0.037340
+v -0.200758 1.205533 0.096051
+v -0.204877 1.202309 0.109461
+v -0.208421 1.199232 0.121303
+v -0.234738 1.186148 0.120559
+v -0.257211 1.174649 0.109060
+v -0.278586 1.162129 0.096540
+v -0.103920 1.234168 0.124686
+v -0.106052 1.231532 0.138683
+v -0.107887 1.228960 0.151031
+v -0.135813 1.220973 0.155384
+v -0.161689 1.214019 0.148430
+v -0.186875 1.205874 0.140286
+v -0.000000 1.243934 0.134452
+v -0.000000 1.241499 0.148651
+v -0.000000 1.239100 0.161170
+v -0.027633 1.236335 0.170746
+v -0.055149 1.234398 0.168809
+v -0.082430 1.231185 0.165596
+v 0.103920 1.234168 0.124686
+v 0.106052 1.231532 0.138683
+v 0.107887 1.228960 0.151031
+v 0.082430 1.231185 0.165596
+v 0.055149 1.234398 0.168809
+v 0.027633 1.236335 0.170746
+v 0.200758 1.205533 0.096051
+v 0.204877 1.202309 0.109461
+v 0.208421 1.199232 0.121303
+v 0.186875 1.205875 0.140286
+v 0.161689 1.214019 0.148430
+v 0.135813 1.220973 0.155384
+v 0.283915 1.159981 0.050499
+v 0.289740 1.155823 0.062975
+v 0.294752 1.151942 0.074013
+v 0.278586 1.162129 0.096540
+v 0.257211 1.174649 0.109060
+v 0.234738 1.186148 0.120559
+v 0.347723 1.100618 -0.008864
+v 0.354858 1.095241 0.002393
+v 0.360997 1.090312 0.012383
+v 0.351311 1.102928 0.037340
+v 0.335203 1.118971 0.053382
+v 0.317665 1.134230 0.068642
+v 0.387835 1.031487 -0.077995
+v 0.395792 1.024692 -0.068156
+v 0.402639 1.018543 -0.059387
+v 0.400095 1.032308 -0.033281
+v 0.390352 1.050781 -0.014808
+v 0.378944 1.068760 0.003171
+v 0.401516 0.957301 -0.152181
+v 0.409754 0.948984 -0.143865
+v 0.416843 0.941524 -0.136405
+v 0.421613 0.955081 -0.110508
+v 0.418900 0.974724 -0.090865
+v 0.414399 0.994199 -0.071390
+v 0.387835 0.883114 -0.226368
+v 0.395792 0.873275 -0.219573
+v 0.402639 0.864506 -0.213423
+v 0.414399 0.876509 -0.189080
+v 0.418900 0.895984 -0.169605
+v 0.421613 0.915627 -0.149962
+v 0.347723 0.813984 -0.295498
+v 0.354858 0.802726 -0.290122
+v 0.360997 0.792736 -0.285193
+v 0.378944 0.801948 -0.263641
+v 0.390352 0.819927 -0.245661
+v 0.400095 0.838400 -0.227189
+v 0.283915 0.754620 -0.354862
+v 0.289740 0.742144 -0.350704
+v 0.294752 0.731107 -0.346823
+v 0.317665 0.736478 -0.329111
+v 0.335203 0.751737 -0.313852
+v 0.351311 0.767780 -0.297809
+v 0.200758 0.709068 -0.400414
+v 0.204877 0.695658 -0.397190
+v 0.208421 0.683816 -0.394113
+v 0.234738 0.684561 -0.381028
+v 0.257211 0.696059 -0.369529
+v 0.278586 0.708579 -0.357009
+v 0.103920 0.680434 -0.429048
+v 0.106052 0.666436 -0.426412
+v 0.107887 0.654088 -0.423841
+v 0.135813 0.649735 -0.415854
+v 0.161689 0.656689 -0.408899
+v 0.186875 0.664834 -0.400755
+v -0.000000 0.670667 -0.438815
+v -0.000000 0.656469 -0.436380
+v -0.000000 0.643949 -0.433981
+v 0.027633 0.634373 -0.431215
+v 0.055149 0.636310 -0.429279
+v 0.082430 0.639523 -0.426065
+v -0.103920 0.680433 -0.429048
+v -0.106052 0.666436 -0.426412
+v -0.107887 0.654088 -0.423841
+v -0.082430 0.639523 -0.426065
+v -0.055149 0.636310 -0.429279
+v -0.027634 0.634373 -0.431215
+v -0.200758 0.709068 -0.400413
+v -0.204877 0.695658 -0.397190
+v -0.208422 0.683816 -0.394113
+v -0.186875 0.664834 -0.400755
+v -0.161689 0.656689 -0.408899
+v -0.135813 0.649735 -0.415854
+v -0.283915 0.754620 -0.354862
+v -0.289740 0.742144 -0.350704
+v -0.294753 0.731106 -0.346823
+v -0.278586 0.708579 -0.357009
+v -0.257211 0.696059 -0.369529
+v -0.234738 0.684560 -0.381028
+v -0.347723 0.813983 -0.295498
+v -0.354858 0.802726 -0.290122
+v -0.360997 0.792736 -0.285193
+v -0.351311 0.767779 -0.297809
+v -0.335203 0.751737 -0.313852
+v -0.317665 0.736477 -0.329111
+v -0.387835 0.883114 -0.226368
+v -0.395792 0.873275 -0.219573
+v -0.402640 0.864506 -0.213423
+v -0.400095 0.838400 -0.227189
+v -0.390353 0.819927 -0.245661
+v -0.378944 0.801948 -0.263641
+v -0.401516 0.957301 -0.152181
+v -0.409755 0.948984 -0.143864
+v -0.416843 0.941524 -0.136405
+v -0.421613 0.915627 -0.149962
+v -0.418900 0.895984 -0.169605
+v -0.414399 0.876509 -0.189079
+v -0.402639 1.018542 -0.059387
+v -0.395792 1.024692 -0.068156
+v -0.387835 1.031487 -0.077995
+v -0.414399 0.994199 -0.071390
+v -0.418900 0.974724 -0.090865
+v -0.421613 0.955081 -0.110508
+v -0.378944 1.068760 0.003171
+v -0.390352 1.050781 -0.014808
+v -0.400095 1.032308 -0.033280
+v 0.305802 0.705250 -0.336743
+v 0.303777 0.710413 -0.339015
+v 0.301605 0.715596 -0.341095
+v 0.374530 0.769190 -0.272802
+v 0.372050 0.773930 -0.275498
+v 0.369389 0.778658 -0.278032
+v 0.417734 0.843651 -0.198342
+v 0.414967 0.847897 -0.201531
+v 0.412000 0.852096 -0.204594
+v 0.432470 0.923556 -0.118437
+v 0.429606 0.927274 -0.122154
+v 0.426533 0.930905 -0.125786
+v 0.417734 1.003462 -0.038531
+v 0.414967 1.006650 -0.042778
+v 0.412000 1.009714 -0.046977
+v 0.374530 1.077922 0.035929
+v 0.372050 1.080617 0.031189
+v 0.369389 1.083152 0.026461
+v 0.305802 1.141862 0.099869
+v 0.303777 1.144134 0.094706
+v 0.301605 1.146214 0.089524
+v 0.216235 1.190925 0.148932
+v 0.214803 1.192872 0.143444
+v 0.213267 1.194604 0.137913
+v 0.111931 1.221768 0.179775
+v 0.111190 1.223510 0.174082
+v 0.110395 1.225023 0.168332
+v -0.000000 1.232287 0.190294
+v -0.000000 1.233960 0.184532
+v -0.000000 1.235398 0.178707
+v -0.111931 1.221768 0.179775
+v -0.111190 1.223510 0.174082
+v -0.110395 1.225023 0.168332
+v -0.216235 1.190925 0.148932
+v -0.214803 1.192872 0.143444
+v -0.213267 1.194604 0.137913
+v -0.305802 1.141862 0.099869
+v -0.303777 1.144134 0.094706
+v -0.301605 1.146214 0.089523
+v -0.374530 1.077922 0.035929
+v -0.372050 1.080617 0.031189
+v -0.369389 1.083152 0.026461
+v -0.412000 1.009714 -0.046977
+v -0.414967 1.006650 -0.042778
+v -0.417734 1.003462 -0.038531
+v -0.432470 0.923556 -0.118437
+v -0.429606 0.927274 -0.122154
+v -0.426534 0.930905 -0.125786
+v -0.417734 0.843651 -0.198342
+v -0.414968 0.847897 -0.201531
+v -0.412000 0.852096 -0.204594
+v -0.374530 0.769190 -0.272802
+v -0.372050 0.773930 -0.275498
+v -0.369389 0.778658 -0.278032
+v -0.305802 0.705250 -0.336743
+v -0.303777 0.710413 -0.339015
+v -0.301605 0.715596 -0.341095
+v -0.216235 0.656187 -0.385806
+v -0.214803 0.661675 -0.387753
+v -0.213267 0.667206 -0.389485
+v -0.111932 0.625345 -0.416648
+v -0.111190 0.631037 -0.418391
+v -0.110395 0.636787 -0.419904
+v -0.000000 0.614825 -0.427168
+v -0.000000 0.620587 -0.428841
+v -0.000000 0.626412 -0.430279
+v 0.111931 0.625345 -0.416648
+v 0.111190 0.631037 -0.418391
+v 0.110395 0.636787 -0.419904
+v -0.075653 0.340720 0.500717
+v -0.073811 0.344180 0.504177
+v -0.071653 0.347547 0.507544
+v -0.066428 0.353947 0.513944
+v -0.063383 0.356952 0.516948
+v -0.060066 0.359810 0.519806
+v -0.052677 0.365035 0.525032
+v -0.048635 0.367380 0.527376
+v -0.044386 0.369533 0.529530
+v -0.035336 0.373228 0.533225
+v -0.030573 0.374753 0.534750
+v -0.025681 0.376056 0.536053
+v -0.015586 0.377968 0.537965
+v -0.010428 0.378570 0.538567
+v -0.005225 0.378933 0.538930
+v 0.005225 0.378933 0.538930
+v 0.010428 0.378570 0.538567
+v 0.015586 0.377968 0.537965
+v 0.025681 0.376056 0.536053
+v 0.030573 0.374753 0.534750
+v 0.035336 0.373228 0.533225
+v 0.044386 0.369533 0.529530
+v 0.048635 0.367380 0.527376
+v 0.052677 0.365035 0.525032
+v 0.060067 0.359810 0.519806
+v 0.063383 0.356952 0.516948
+v 0.066428 0.353947 0.513944
+v 0.071654 0.347547 0.507544
+v 0.073811 0.344180 0.504177
+v 0.075653 0.340720 0.500717
+v 0.078358 0.333583 0.493579
+v 0.079209 0.329935 0.489932
+v 0.079722 0.326256 0.486253
+v 0.079722 0.318867 0.478863
+v 0.079209 0.315188 0.475184
+v 0.078358 0.311540 0.471537
+v 0.075653 0.304402 0.464399
+v 0.073811 0.300943 0.460940
+v 0.071654 0.297575 0.457572
+v 0.066428 0.291176 0.451173
+v 0.063383 0.288171 0.448168
+v 0.060067 0.285313 0.445310
+v 0.052677 0.280088 0.440085
+v 0.048635 0.277743 0.437740
+v 0.044386 0.275589 0.435586
+v 0.035336 0.271895 0.431892
+v 0.030573 0.270369 0.430366
+v 0.025681 0.269067 0.429064
+v 0.015586 0.267154 0.427151
+v 0.010428 0.266552 0.426549
+v 0.005225 0.266190 0.426187
+v -0.005225 0.266190 0.426187
+v -0.010428 0.266552 0.426549
+v -0.015586 0.267154 0.427151
+v -0.025681 0.269067 0.429064
+v -0.030573 0.270369 0.430366
+v -0.035336 0.271895 0.431892
+v -0.044386 0.275589 0.435586
+v -0.048635 0.277743 0.437740
+v -0.052677 0.280088 0.440085
+v -0.060066 0.285313 0.445310
+v -0.063383 0.288171 0.448168
+v -0.066428 0.291176 0.451173
+v -0.071654 0.297575 0.457572
+v -0.073811 0.300943 0.460940
+v -0.075653 0.304402 0.464399
+v -0.078358 0.311540 0.471537
+v -0.079209 0.315188 0.475185
+v -0.079722 0.318867 0.478864
+v -0.079722 0.326256 0.486253
+v -0.079209 0.329935 0.489932
+v -0.078357 0.333583 0.493579
+v -0.140038 0.382343 0.520441
+v -0.144254 0.375762 0.513860
+v -0.147855 0.369000 0.507098
+v -0.117393 0.406308 0.544406
+v -0.123874 0.400723 0.538821
+v -0.129826 0.394850 0.532948
+v -0.086747 0.425312 0.563410
+v -0.095052 0.421103 0.559201
+v -0.102951 0.416520 0.554618
+v -0.050190 0.438060 0.576158
+v -0.059752 0.435514 0.573612
+v -0.069059 0.432533 0.570631
+v -0.010212 0.443683 0.581781
+v -0.020380 0.442974 0.581072
+v -0.030462 0.441798 0.579895
+v 0.030462 0.441798 0.579895
+v 0.020380 0.442974 0.581072
+v 0.010212 0.443683 0.581781
+v 0.069060 0.432533 0.570631
+v 0.059752 0.435514 0.573612
+v 0.050190 0.438060 0.576158
+v 0.102951 0.416520 0.554618
+v 0.095052 0.421103 0.559201
+v 0.086747 0.425312 0.563410
+v 0.129827 0.394850 0.532948
+v 0.123874 0.400723 0.538821
+v 0.117393 0.406308 0.544406
+v 0.147855 0.369000 0.507098
+v 0.144254 0.375762 0.513860
+v 0.140039 0.382343 0.520441
+v 0.155807 0.340732 0.478830
+v 0.154804 0.347922 0.486020
+v 0.153141 0.355051 0.493148
+v 0.153141 0.311971 0.450069
+v 0.154804 0.319100 0.457198
+v 0.155807 0.326290 0.464388
+v 0.140039 0.284678 0.422776
+v 0.144254 0.291260 0.429357
+v 0.147855 0.298021 0.436119
+v 0.117393 0.260713 0.398811
+v 0.123874 0.266299 0.404397
+v 0.129827 0.272171 0.410269
+v 0.086747 0.241710 0.379807
+v 0.095052 0.245919 0.384016
+v 0.102951 0.250502 0.388599
+v 0.050190 0.228962 0.367060
+v 0.059752 0.231507 0.369605
+v 0.069060 0.234489 0.372586
+v 0.010212 0.223339 0.361437
+v 0.020380 0.224048 0.362146
+v 0.030462 0.225224 0.363322
+v -0.030462 0.225224 0.363322
+v -0.020380 0.224048 0.362146
+v -0.010212 0.223339 0.361437
+v -0.069060 0.234489 0.372586
+v -0.059752 0.231507 0.369605
+v -0.050190 0.228962 0.367060
+v -0.102951 0.250502 0.388599
+v -0.095052 0.245919 0.384016
+v -0.086747 0.241710 0.379807
+v -0.129827 0.272171 0.410269
+v -0.123874 0.266299 0.404397
+v -0.117393 0.260713 0.398811
+v -0.147855 0.298021 0.436119
+v -0.144254 0.291260 0.429358
+v -0.140038 0.284678 0.422776
+v -0.155807 0.326290 0.464388
+v -0.154804 0.319100 0.457198
+v -0.153141 0.311971 0.450069
+v -0.153141 0.355051 0.493148
+v -0.154804 0.347922 0.486020
+v -0.155807 0.340732 0.478830
+v -0.207057 0.423843 0.525682
+v -0.213291 0.414112 0.515951
+v -0.218614 0.404114 0.505953
+v -0.173574 0.459277 0.561115
+v -0.183157 0.451018 0.552857
+v -0.191958 0.442335 0.544174
+v -0.128262 0.487375 0.589214
+v -0.140541 0.481152 0.582991
+v -0.152221 0.474376 0.576214
+v -0.074209 0.506224 0.608063
+v -0.088348 0.502460 0.604299
+v -0.102110 0.498052 0.599891
+v -0.015099 0.514538 0.616376
+v -0.030134 0.513490 0.615328
+v -0.045040 0.511751 0.613589
+v 0.045040 0.511751 0.613589
+v 0.030134 0.513490 0.615328
+v 0.015099 0.514538 0.616376
+v 0.102110 0.498052 0.599891
+v 0.088348 0.502460 0.604299
+v 0.074209 0.506224 0.608063
+v 0.152221 0.474376 0.576214
+v 0.140541 0.481152 0.582991
+v 0.128262 0.487375 0.589214
+v 0.191958 0.442335 0.544174
+v 0.183157 0.451018 0.552857
+v 0.173574 0.459277 0.561115
+v 0.218614 0.404114 0.505953
+v 0.213291 0.414112 0.515951
+v 0.207058 0.423843 0.525681
+v 0.230372 0.362317 0.464156
+v 0.228890 0.372948 0.474787
+v 0.226430 0.383489 0.485327
+v 0.226430 0.319792 0.421631
+v 0.228890 0.330333 0.432171
+v 0.230372 0.340964 0.442802
+v 0.207058 0.279438 0.381277
+v 0.213291 0.289169 0.391008
+v 0.218614 0.299167 0.401005
+v 0.173574 0.244004 0.345843
+v 0.183157 0.252263 0.354101
+v 0.191958 0.260945 0.362784
+v 0.128262 0.215905 0.317744
+v 0.140541 0.222129 0.323967
+v 0.152221 0.228905 0.330744
+v 0.074209 0.197057 0.298895
+v 0.088348 0.200821 0.302660
+v 0.102110 0.205229 0.307067
+v 0.015099 0.188743 0.290582
+v 0.030134 0.189791 0.291630
+v 0.045040 0.191530 0.293369
+v -0.045040 0.191530 0.293369
+v -0.030134 0.189791 0.291630
+v -0.015099 0.188743 0.290582
+v -0.102110 0.205229 0.307067
+v -0.088348 0.200821 0.302660
+v -0.074209 0.197057 0.298895
+v -0.152221 0.228905 0.330744
+v -0.140541 0.222129 0.323967
+v -0.128262 0.215905 0.317744
+v -0.191958 0.260945 0.362784
+v -0.183157 0.252263 0.354101
+v -0.173574 0.244004 0.345843
+v -0.218614 0.299167 0.401005
+v -0.213291 0.289169 0.391008
+v -0.207057 0.279438 0.381277
+v -0.230372 0.340964 0.442802
+v -0.228889 0.330333 0.432171
+v -0.226430 0.319792 0.421631
+v -0.226430 0.383489 0.485327
+v -0.228889 0.372948 0.474787
+v -0.230372 0.362317 0.464156
+v -0.270533 0.470923 0.522871
+v -0.278678 0.458209 0.510156
+v -0.285633 0.445146 0.497094
+v -0.226785 0.517220 0.569167
+v -0.239306 0.506429 0.558377
+v -0.250806 0.495085 0.547032
+v -0.167582 0.553932 0.605880
+v -0.183626 0.545801 0.597749
+v -0.198886 0.536948 0.588895
+v -0.096959 0.578559 0.630507
+v -0.115432 0.573641 0.625589
+v -0.133413 0.567882 0.619829
+v -0.019728 0.589422 0.641369
+v -0.039372 0.588052 0.640000
+v -0.058848 0.585780 0.637727
+v 0.058848 0.585780 0.637727
+v 0.039372 0.588052 0.640000
+v 0.019728 0.589422 0.641369
+v 0.133413 0.567882 0.619829
+v 0.115432 0.573641 0.625589
+v 0.096959 0.578559 0.630507
+v 0.198886 0.536948 0.588895
+v 0.183626 0.545801 0.597749
+v 0.167583 0.553932 0.605880
+v 0.250806 0.495085 0.547032
+v 0.239306 0.506429 0.558377
+v 0.226786 0.517220 0.569167
+v 0.285633 0.445147 0.497094
+v 0.278678 0.458209 0.510156
+v 0.270534 0.470923 0.522870
+v 0.300995 0.390536 0.442483
+v 0.299059 0.404426 0.456374
+v 0.295845 0.418198 0.470145
+v 0.295845 0.334974 0.386922
+v 0.299059 0.348746 0.400693
+v 0.300995 0.362636 0.414584
+v 0.270534 0.282249 0.334196
+v 0.278678 0.294963 0.346910
+v 0.285633 0.308026 0.359973
+v 0.226786 0.235952 0.287900
+v 0.239306 0.246743 0.298690
+v 0.250806 0.258087 0.310035
+v 0.167583 0.199240 0.251187
+v 0.183626 0.207371 0.259318
+v 0.198886 0.216224 0.268172
+v 0.096959 0.174613 0.226560
+v 0.115432 0.179531 0.231478
+v 0.133413 0.185290 0.237237
+v 0.019728 0.163750 0.215698
+v 0.039372 0.165120 0.217067
+v 0.058848 0.167392 0.219339
+v -0.058848 0.167392 0.219339
+v -0.039372 0.165120 0.217067
+v -0.019728 0.163750 0.215698
+v -0.133413 0.185290 0.237237
+v -0.115432 0.179531 0.231478
+v -0.096959 0.174613 0.226560
+v -0.198886 0.216224 0.268172
+v -0.183626 0.207371 0.259318
+v -0.167583 0.199240 0.251187
+v -0.250806 0.258087 0.310035
+v -0.239306 0.246743 0.298690
+v -0.226786 0.235952 0.287900
+v -0.285633 0.308026 0.359973
+v -0.278678 0.294963 0.346911
+v -0.270534 0.282249 0.334196
+v -0.300995 0.362636 0.414584
+v -0.299059 0.348746 0.400693
+v -0.295845 0.334974 0.386922
+v -0.295845 0.418198 0.470145
+v -0.299058 0.404426 0.456374
+v -0.300995 0.390536 0.442483
+v -0.329381 0.522778 0.512056
+v -0.339297 0.507299 0.496576
+v -0.347765 0.491395 0.480672
+v -0.276117 0.579146 0.568423
+v -0.291361 0.566008 0.555286
+v -0.305361 0.552196 0.541473
+v -0.204035 0.623844 0.613122
+v -0.223569 0.613944 0.603222
+v -0.242148 0.603165 0.592442
+v -0.118050 0.653828 0.643105
+v -0.140541 0.647840 0.637118
+v -0.162433 0.640828 0.630106
+v -0.024019 0.667053 0.656331
+v -0.047936 0.665386 0.654663
+v -0.071648 0.662619 0.651897
+v 0.071648 0.662619 0.651897
+v 0.047936 0.665386 0.654663
+v 0.024019 0.667053 0.656331
+v 0.162433 0.640828 0.630106
+v 0.140541 0.647840 0.637118
+v 0.118050 0.653828 0.643105
+v 0.242148 0.603165 0.592442
+v 0.223569 0.613944 0.603222
+v 0.204036 0.623844 0.613122
+v 0.305362 0.552196 0.541473
+v 0.291361 0.566008 0.555286
+v 0.276117 0.579146 0.568423
+v 0.347765 0.491395 0.480672
+v 0.339297 0.507299 0.496576
+v 0.329381 0.522779 0.512056
+v 0.366469 0.424905 0.414183
+v 0.364111 0.441817 0.431094
+v 0.360198 0.458584 0.447862
+v 0.360198 0.357258 0.346536
+v 0.364111 0.374025 0.363303
+v 0.366469 0.390937 0.380214
+v 0.329381 0.293063 0.282341
+v 0.339297 0.308543 0.297821
+v 0.347765 0.324447 0.313725
+v 0.276117 0.236696 0.225974
+v 0.291361 0.249834 0.239111
+v 0.305362 0.263646 0.252924
+v 0.204036 0.191998 0.181275
+v 0.223569 0.201898 0.191175
+v 0.242148 0.212677 0.201955
+v 0.118050 0.162014 0.151292
+v 0.140541 0.168002 0.157279
+v 0.162433 0.175013 0.164291
+v 0.024019 0.148788 0.138066
+v 0.047936 0.150456 0.139734
+v 0.071648 0.153222 0.142500
+v -0.071648 0.153222 0.142500
+v -0.047936 0.150456 0.139734
+v -0.024019 0.148788 0.138066
+v -0.162433 0.175013 0.164291
+v -0.140541 0.168002 0.157279
+v -0.118050 0.162014 0.151292
+v -0.242148 0.212677 0.201955
+v -0.223569 0.201897 0.191175
+v -0.204036 0.191997 0.181275
+v -0.305362 0.263646 0.252924
+v -0.291361 0.249834 0.239111
+v -0.276117 0.236696 0.225974
+v -0.347765 0.324447 0.313725
+v -0.339297 0.308543 0.297821
+v -0.329381 0.293063 0.282341
+v -0.366469 0.390937 0.380215
+v -0.364111 0.374025 0.363303
+v -0.360198 0.357258 0.346536
+v -0.360198 0.458584 0.447862
+v -0.364110 0.441817 0.431095
+v -0.366469 0.424905 0.414183
+v -0.382592 0.578521 0.493423
+v -0.394110 0.560541 0.475443
+v -0.403946 0.542068 0.456970
+v -0.320723 0.643995 0.558897
+v -0.338430 0.628735 0.543637
+v -0.354693 0.612691 0.527593
+v -0.236997 0.695914 0.610816
+v -0.259687 0.684415 0.599317
+v -0.281267 0.671894 0.586796
+v -0.137121 0.730742 0.645644
+v -0.163246 0.723787 0.638689
+v -0.188674 0.715642 0.630544
+v -0.027899 0.746104 0.661006
+v -0.055680 0.744167 0.659069
+v -0.083223 0.740954 0.655856
+v 0.083223 0.740954 0.655856
+v 0.055680 0.744167 0.659069
+v 0.027900 0.746104 0.661006
+v 0.188674 0.715642 0.630544
+v 0.163246 0.723787 0.638689
+v 0.137121 0.730742 0.645644
+v 0.281267 0.671894 0.586796
+v 0.259687 0.684415 0.599317
+v 0.236998 0.695915 0.610816
+v 0.354693 0.612691 0.527593
+v 0.338430 0.628735 0.543637
+v 0.320723 0.643995 0.558897
+v 0.403946 0.542068 0.456970
+v 0.394110 0.560541 0.475443
+v 0.382592 0.578522 0.493423
+v 0.425672 0.464837 0.379739
+v 0.422933 0.484481 0.399382
+v 0.418388 0.503956 0.418858
+v 0.418388 0.386261 0.301163
+v 0.422933 0.405737 0.320639
+v 0.425672 0.425381 0.340283
+v 0.382592 0.311696 0.226598
+v 0.394110 0.329677 0.244578
+v 0.403946 0.348150 0.263052
+v 0.320723 0.246223 0.161125
+v 0.338430 0.261483 0.176384
+v 0.354693 0.277526 0.192428
+v 0.236998 0.194303 0.109205
+v 0.259687 0.205802 0.120704
+v 0.281267 0.218323 0.133225
+v 0.137121 0.159475 0.074377
+v 0.163246 0.166431 0.081333
+v 0.188674 0.174575 0.089477
+v 0.027899 0.144113 0.059015
+v 0.055680 0.146050 0.060952
+v 0.083223 0.149264 0.064166
+v -0.083223 0.149264 0.064166
+v -0.055680 0.146050 0.060952
+v -0.027899 0.144113 0.059015
+v -0.188674 0.174575 0.089477
+v -0.163246 0.166431 0.081333
+v -0.137121 0.159475 0.074377
+v -0.281267 0.218323 0.133225
+v -0.259687 0.205802 0.120704
+v -0.236998 0.194303 0.109205
+v -0.354693 0.277526 0.192428
+v -0.338430 0.261482 0.176385
+v -0.320723 0.246223 0.161125
+v -0.403946 0.348150 0.263052
+v -0.394111 0.329676 0.244578
+v -0.382592 0.311696 0.226598
+v -0.425672 0.425381 0.340283
+v -0.422933 0.405737 0.320639
+v -0.418388 0.386261 0.301163
+v -0.418388 0.503956 0.418858
+v -0.422933 0.484481 0.399383
+v -0.425672 0.464837 0.379739
+v -0.429257 0.637199 0.467291
+v -0.442180 0.617025 0.447118
+v -0.453216 0.596299 0.426391
+v -0.359842 0.710658 0.540750
+v -0.379709 0.693537 0.523629
+v -0.397955 0.675536 0.505629
+v -0.265904 0.768910 0.599003
+v -0.291361 0.756008 0.586101
+v -0.315574 0.741960 0.572053
+v -0.153845 0.807986 0.638078
+v -0.183157 0.800182 0.630275
+v -0.211687 0.791044 0.621137
+v -0.031302 0.825221 0.655314
+v -0.062471 0.823048 0.653141
+v -0.093374 0.819443 0.649536
+v 0.093374 0.819443 0.649536
+v 0.062472 0.823048 0.653141
+v 0.031302 0.825221 0.655314
+v 0.211687 0.791044 0.621137
+v 0.183157 0.800182 0.630275
+v 0.153846 0.807986 0.638078
+v 0.315574 0.741960 0.572053
+v 0.291361 0.756008 0.586101
+v 0.265904 0.768910 0.599003
+v 0.397955 0.675536 0.505629
+v 0.379709 0.693537 0.523629
+v 0.359842 0.710658 0.540750
+v 0.453216 0.596299 0.426391
+v 0.442181 0.617025 0.447118
+v 0.429257 0.637199 0.467291
+v 0.477591 0.509648 0.339740
+v 0.474518 0.531687 0.361780
+v 0.469419 0.553539 0.383631
+v 0.469420 0.421488 0.251581
+v 0.474518 0.443339 0.273432
+v 0.477591 0.465379 0.295472
+v 0.429257 0.337828 0.167921
+v 0.442181 0.358002 0.188094
+v 0.453216 0.378728 0.208821
+v 0.359842 0.264369 0.094462
+v 0.379709 0.281490 0.111583
+v 0.397955 0.299491 0.129583
+v 0.265904 0.206117 0.036209
+v 0.291361 0.219019 0.049111
+v 0.315574 0.233067 0.063159
+v 0.153846 0.167041 -0.002866
+v 0.183157 0.174845 0.004937
+v 0.211687 0.183983 0.014075
+v 0.031302 0.149805 -0.020102
+v 0.062471 0.151978 -0.017929
+v 0.093374 0.155584 -0.014324
+v -0.093374 0.155584 -0.014324
+v -0.062471 0.151978 -0.017929
+v -0.031302 0.149805 -0.020102
+v -0.211687 0.183983 0.014075
+v -0.183157 0.174845 0.004937
+v -0.153846 0.167041 -0.002866
+v -0.315574 0.233066 0.063159
+v -0.291361 0.219019 0.049111
+v -0.265904 0.206117 0.036209
+v -0.397955 0.299491 0.129583
+v -0.379709 0.281490 0.111583
+v -0.359842 0.264369 0.094462
+v -0.453216 0.378728 0.208821
+v -0.442181 0.358002 0.188094
+v -0.429258 0.337828 0.167921
+v -0.477591 0.465379 0.295472
+v -0.474518 0.443339 0.273432
+v -0.469420 0.421488 0.251581
+v -0.469419 0.553539 0.383631
+v -0.474518 0.531687 0.361780
+v -0.477591 0.509648 0.339740
+v -0.468578 0.697806 0.434107
+v -0.482685 0.675784 0.412085
+v -0.494731 0.653159 0.389460
+v -0.392804 0.777994 0.514295
+v -0.414491 0.759305 0.495605
+v -0.434408 0.739655 0.475956
+v -0.290261 0.841582 0.577883
+v -0.318050 0.827499 0.563799
+v -0.344481 0.812164 0.548464
+v -0.167938 0.884237 0.620538
+v -0.199934 0.875719 0.612020
+v -0.231078 0.865744 0.602045
+v -0.034170 0.903052 0.639352
+v -0.068194 0.900680 0.636980
+v -0.101927 0.896744 0.633045
+v 0.101927 0.896744 0.633045
+v 0.068194 0.900680 0.636980
+v 0.034170 0.903052 0.639352
+v 0.231078 0.865744 0.602045
+v 0.199935 0.875719 0.612020
+v 0.167938 0.884237 0.620538
+v 0.344481 0.812164 0.548464
+v 0.318050 0.827499 0.563799
+v 0.290261 0.841582 0.577883
+v 0.434408 0.739655 0.475956
+v 0.414491 0.759305 0.495605
+v 0.392804 0.777994 0.514295
+v 0.494731 0.653159 0.389460
+v 0.482685 0.675784 0.412085
+v 0.468578 0.697806 0.434107
+v 0.521339 0.558571 0.294872
+v 0.517985 0.582630 0.318930
+v 0.512419 0.606483 0.342783
+v 0.512419 0.462336 0.198637
+v 0.517985 0.486189 0.222490
+v 0.521339 0.510248 0.246548
+v 0.468578 0.371013 0.107313
+v 0.482685 0.393034 0.129335
+v 0.494731 0.415659 0.151960
+v 0.392804 0.290825 0.027125
+v 0.414491 0.309514 0.045815
+v 0.434408 0.329163 0.065464
+v 0.290262 0.227236 -0.036463
+v 0.318050 0.241320 -0.022379
+v 0.344481 0.256655 -0.007044
+v 0.167938 0.184581 -0.079118
+v 0.199935 0.193100 -0.070600
+v 0.231078 0.203075 -0.060625
+v 0.034170 0.165767 -0.097932
+v 0.068194 0.168139 -0.095560
+v 0.101927 0.172074 -0.091625
+v -0.101927 0.172074 -0.091625
+v -0.068194 0.168139 -0.095560
+v -0.034170 0.165767 -0.097932
+v -0.231078 0.203075 -0.060624
+v -0.199935 0.193100 -0.070600
+v -0.167938 0.184581 -0.079118
+v -0.344481 0.256655 -0.007044
+v -0.318050 0.241320 -0.022379
+v -0.290262 0.227236 -0.036463
+v -0.434408 0.329163 0.065464
+v -0.414491 0.309514 0.045815
+v -0.392804 0.290825 0.027125
+v -0.494731 0.415659 0.151960
+v -0.482685 0.393034 0.129335
+v -0.468578 0.371013 0.107314
+v -0.521339 0.510248 0.246549
+v -0.517985 0.486189 0.222490
+v -0.512419 0.462336 0.198637
+v -0.512419 0.606483 0.342783
+v -0.517985 0.582630 0.318931
+v -0.521339 0.558571 0.294872
+v -0.499881 0.759306 0.394438
+v -0.514930 0.735813 0.370945
+v -0.527781 0.711677 0.346808
+v -0.419045 0.844851 0.479983
+v -0.442180 0.824913 0.460045
+v -0.463428 0.803951 0.439083
+v -0.309652 0.912687 0.547819
+v -0.339297 0.897663 0.532794
+v -0.367494 0.881304 0.516435
+v -0.179157 0.958192 0.593323
+v -0.213291 0.949104 0.584236
+v -0.246515 0.938463 0.573594
+v -0.036452 0.978263 0.613395
+v -0.072750 0.975733 0.610864
+v -0.108736 0.971534 0.606665
+v 0.108736 0.971534 0.606665
+v 0.072750 0.975733 0.610864
+v 0.036452 0.978263 0.613395
+v 0.246515 0.938463 0.573594
+v 0.213291 0.949104 0.584236
+v 0.179157 0.958192 0.593323
+v 0.367494 0.881304 0.516435
+v 0.339297 0.897663 0.532794
+v 0.309652 0.912687 0.547819
+v 0.463428 0.803951 0.439082
+v 0.442180 0.824913 0.460045
+v 0.419045 0.844851 0.479982
+v 0.527781 0.711677 0.346808
+v 0.514930 0.735814 0.370945
+v 0.499881 0.759306 0.394438
+v 0.556167 0.610770 0.245901
+v 0.552588 0.636436 0.271567
+v 0.546651 0.661882 0.297013
+v 0.546651 0.508106 0.143237
+v 0.552588 0.533552 0.168684
+v 0.556167 0.559218 0.194350
+v 0.499881 0.410682 0.045813
+v 0.514930 0.434174 0.069306
+v 0.527781 0.458311 0.093442
+v 0.419045 0.325137 -0.039732
+v 0.442181 0.345075 -0.019794
+v 0.463428 0.366037 0.001168
+v 0.309652 0.257301 -0.107568
+v 0.339297 0.272325 -0.092543
+v 0.367494 0.288684 -0.076184
+v 0.179157 0.211796 -0.153072
+v 0.213291 0.220883 -0.143985
+v 0.246515 0.231525 -0.133344
+v 0.036452 0.191725 -0.173144
+v 0.072750 0.194255 -0.170613
+v 0.108736 0.198454 -0.166415
+v -0.108736 0.198454 -0.166415
+v -0.072750 0.194255 -0.170613
+v -0.036452 0.191725 -0.173144
+v -0.246515 0.231525 -0.133344
+v -0.213291 0.220883 -0.143985
+v -0.179157 0.211796 -0.153072
+v -0.367494 0.288684 -0.076184
+v -0.339297 0.272325 -0.092543
+v -0.309652 0.257300 -0.107568
+v -0.463429 0.366037 0.001168
+v -0.442181 0.345075 -0.019794
+v -0.419045 0.325137 -0.039732
+v -0.527782 0.458311 0.093442
+v -0.514930 0.434174 0.069306
+v -0.499881 0.410682 0.045813
+v -0.556167 0.559218 0.194350
+v -0.552588 0.533552 0.168684
+v -0.546651 0.508106 0.143237
+v -0.546650 0.661882 0.297014
+v -0.552588 0.636436 0.271567
+v -0.556167 0.610770 0.245901
+v -0.522631 0.820647 0.348963
+v -0.538365 0.796085 0.324401
+v -0.551801 0.770850 0.299166
+v -0.438116 0.910085 0.438401
+v -0.462304 0.889240 0.417555
+v -0.484519 0.867324 0.395639
+v -0.323745 0.981009 0.509324
+v -0.354739 0.965301 0.493616
+v -0.384218 0.948197 0.476512
+v -0.187310 1.028584 0.556899
+v -0.222998 1.019083 0.547399
+v -0.257734 1.007958 0.536273
+v -0.038111 1.049569 0.577884
+v -0.076060 1.046924 0.575239
+v -0.113685 1.042534 0.570849
+v 0.113685 1.042534 0.570849
+v 0.076060 1.046923 0.575239
+v 0.038111 1.049569 0.577884
+v 0.257734 1.007958 0.536273
+v 0.222998 1.019083 0.547399
+v 0.187310 1.028584 0.556899
+v 0.384218 0.948197 0.476512
+v 0.354739 0.965301 0.493616
+v 0.323745 0.981009 0.509324
+v 0.484519 0.867324 0.395639
+v 0.462304 0.889240 0.417555
+v 0.438116 0.910086 0.438401
+v 0.551801 0.770850 0.299166
+v 0.538365 0.796085 0.324401
+v 0.522631 0.820647 0.348963
+v 0.581478 0.665351 0.193666
+v 0.577737 0.692185 0.220500
+v 0.571529 0.718789 0.247105
+v 0.571529 0.558015 0.086330
+v 0.577737 0.584619 0.112934
+v 0.581478 0.611453 0.139768
+v 0.522631 0.456157 -0.015528
+v 0.538365 0.480719 0.009034
+v 0.551801 0.505953 0.034269
+v 0.438116 0.366718 -0.104966
+v 0.462304 0.387564 -0.084121
+v 0.484519 0.409480 -0.062205
+v 0.323745 0.295795 -0.175890
+v 0.354739 0.311503 -0.160181
+v 0.384218 0.328607 -0.143077
+v 0.187310 0.248220 -0.223465
+v 0.222998 0.257720 -0.213964
+v 0.257734 0.268846 -0.202838
+v 0.038111 0.227235 -0.244450
+v 0.076060 0.229880 -0.241804
+v 0.113685 0.234270 -0.237415
+v -0.113685 0.234270 -0.237415
+v -0.076061 0.229880 -0.241804
+v -0.038111 0.227235 -0.244450
+v -0.257734 0.268846 -0.202838
+v -0.222998 0.257720 -0.213964
+v -0.187311 0.248220 -0.223465
+v -0.384219 0.328607 -0.143077
+v -0.354739 0.311503 -0.160181
+v -0.323745 0.295795 -0.175889
+v -0.484519 0.409480 -0.062205
+v -0.462305 0.387564 -0.084121
+v -0.438116 0.366718 -0.104966
+v -0.551801 0.505953 0.034269
+v -0.538365 0.480718 0.009034
+v -0.522631 0.456157 -0.015528
+v -0.581479 0.611453 0.139769
+v -0.577737 0.584619 0.112935
+v -0.571529 0.558015 0.086330
+v -0.571529 0.718789 0.247105
+v -0.577737 0.692185 0.220500
+v -0.581478 0.665351 0.193666
+v -0.536438 0.880779 0.298460
+v -0.552588 0.855569 0.273249
+v -0.566379 0.829667 0.247348
+v -0.449691 0.972581 0.390261
+v -0.474518 0.951185 0.368865
+v -0.497320 0.928689 0.346370
+v -0.332298 1.045378 0.463058
+v -0.364110 1.029254 0.446935
+v -0.394369 1.011699 0.429379
+v -0.192259 1.094210 0.511890
+v -0.228889 1.084458 0.502138
+v -0.264543 1.073039 0.490719
+v -0.039118 1.115749 0.533430
+v -0.078070 1.113034 0.530714
+v -0.116688 1.108528 0.526209
+v 0.116688 1.108528 0.526209
+v 0.078070 1.113034 0.530714
+v 0.039118 1.115749 0.533430
+v 0.264543 1.073039 0.490719
+v 0.228889 1.084458 0.502138
+v 0.192259 1.094210 0.511890
+v 0.394369 1.011699 0.429379
+v 0.364111 1.029254 0.446935
+v 0.332298 1.045378 0.463058
+v 0.497320 0.928690 0.346370
+v 0.474518 0.951185 0.368865
+v 0.449691 0.972581 0.390261
+v 0.566379 0.829667 0.247347
+v 0.552588 0.855569 0.273249
+v 0.536438 0.880780 0.298460
+v 0.596841 0.721380 0.139061
+v 0.593000 0.748923 0.166604
+v 0.586628 0.776231 0.193911
+v 0.586628 0.611208 0.028889
+v 0.593000 0.638516 0.056196
+v 0.596841 0.666059 0.083739
+v 0.536438 0.506659 -0.075660
+v 0.552588 0.531870 -0.050449
+v 0.566379 0.557772 -0.024548
+v 0.449691 0.414858 -0.167461
+v 0.474518 0.436254 -0.146065
+v 0.497320 0.458749 -0.123570
+v 0.332298 0.342061 -0.240258
+v 0.364111 0.358184 -0.224135
+v 0.394369 0.375740 -0.206580
+v 0.192259 0.293229 -0.289091
+v 0.228889 0.302981 -0.279339
+v 0.264543 0.314400 -0.267919
+v 0.039118 0.271689 -0.310630
+v 0.078070 0.274405 -0.307914
+v 0.116688 0.278911 -0.303409
+v -0.116688 0.278911 -0.303409
+v -0.078070 0.274405 -0.307914
+v -0.039118 0.271689 -0.310630
+v -0.264543 0.314400 -0.267919
+v -0.228890 0.302981 -0.279339
+v -0.192259 0.293229 -0.289091
+v -0.394369 0.375740 -0.206579
+v -0.364111 0.358184 -0.224135
+v -0.332298 0.342061 -0.240258
+v -0.497320 0.458749 -0.123570
+v -0.474518 0.436254 -0.146065
+v -0.449691 0.414858 -0.167461
+v -0.566379 0.557772 -0.024548
+v -0.552588 0.531870 -0.050449
+v -0.536438 0.506659 -0.075660
+v -0.596841 0.666059 0.083739
+v -0.593000 0.638516 0.056196
+v -0.586628 0.611208 0.028889
+v -0.586628 0.776231 0.193911
+v -0.593000 0.748923 0.166604
+v -0.596841 0.721380 0.139061
+v -0.541067 0.938674 0.243794
+v -0.557356 0.913246 0.218365
+v -0.571266 0.887121 0.192240
+v -0.453571 1.031268 0.336387
+v -0.478613 1.009687 0.314806
+v -0.501611 0.986997 0.292117
+v -0.335165 1.104693 0.409812
+v -0.367252 1.088430 0.393550
+v -0.397772 1.070723 0.375842
+v -0.193918 1.153946 0.459066
+v -0.230864 1.144110 0.449230
+v -0.266826 1.132592 0.437711
+v -0.039456 1.175672 0.480791
+v -0.078744 1.172933 0.478052
+v -0.117695 1.168388 0.473507
+v 0.117695 1.168388 0.473507
+v 0.078744 1.172933 0.478052
+v 0.039456 1.175672 0.480791
+v 0.266826 1.132592 0.437711
+v 0.230865 1.144110 0.449230
+v 0.193918 1.153946 0.459066
+v 0.397772 1.070723 0.375842
+v 0.367252 1.088430 0.393550
+v 0.335165 1.104693 0.409812
+v 0.501611 0.986998 0.292117
+v 0.478613 1.009687 0.314806
+v 0.453571 1.031268 0.336387
+v 0.571266 0.887121 0.192240
+v 0.557356 0.913246 0.218365
+v 0.541067 0.938674 0.243793
+v 0.601991 0.777900 0.083019
+v 0.598117 0.805680 0.110799
+v 0.591690 0.833223 0.138342
+v 0.591690 0.666777 -0.028104
+v 0.598117 0.694320 -0.000561
+v 0.601991 0.722100 0.027220
+v 0.541067 0.561326 -0.133555
+v 0.557356 0.586754 -0.108127
+v 0.571266 0.612879 -0.082001
+v 0.453571 0.468733 -0.226148
+v 0.478613 0.490313 -0.204567
+v 0.501611 0.513002 -0.181878
+v 0.335165 0.395307 -0.299573
+v 0.367252 0.411570 -0.283311
+v 0.397772 0.429277 -0.265604
+v 0.193918 0.346054 -0.348827
+v 0.230865 0.355889 -0.338991
+v 0.266826 0.367408 -0.327473
+v 0.039456 0.324328 -0.370552
+v 0.078744 0.327067 -0.367813
+v 0.117695 0.331612 -0.363269
+v -0.117695 0.331612 -0.363269
+v -0.078744 0.327067 -0.367813
+v -0.039456 0.324328 -0.370552
+v -0.266826 0.367408 -0.327473
+v -0.230865 0.355889 -0.338991
+v -0.193918 0.346054 -0.348827
+v -0.397772 0.429277 -0.265604
+v -0.367253 0.411570 -0.283311
+v -0.335165 0.395307 -0.299573
+v -0.501611 0.513002 -0.181878
+v -0.478613 0.490313 -0.204567
+v -0.453571 0.468732 -0.226148
+v -0.571267 0.612879 -0.082001
+v -0.557356 0.586754 -0.108126
+v -0.541067 0.561326 -0.133555
+v -0.601991 0.722100 0.027220
+v -0.598117 0.694320 -0.000561
+v -0.591690 0.666777 -0.028104
+v -0.591690 0.833223 0.138342
+v -0.598117 0.805680 0.110800
+v -0.601991 0.777900 0.083019
+v -0.536438 0.993341 0.185899
+v -0.552588 0.968130 0.160688
+v -0.566379 0.942228 0.134786
+v -0.449691 1.085142 0.277700
+v -0.474518 1.063745 0.256304
+v -0.497320 1.041250 0.233809
+v -0.332298 1.157939 0.350497
+v -0.364110 1.141815 0.334374
+v -0.394369 1.124260 0.316818
+v -0.192259 1.206771 0.399329
+v -0.228889 1.197019 0.389577
+v -0.264543 1.185600 0.378158
+v -0.039118 1.228311 0.420869
+v -0.078070 1.225595 0.418153
+v -0.116688 1.221089 0.413647
+v 0.116688 1.221089 0.413647
+v 0.078070 1.225595 0.418153
+v 0.039118 1.228311 0.420869
+v 0.264543 1.185600 0.378158
+v 0.228889 1.197019 0.389577
+v 0.192259 1.206771 0.399329
+v 0.394369 1.124260 0.316818
+v 0.364111 1.141815 0.334374
+v 0.332298 1.157939 0.350497
+v 0.497320 1.041250 0.233809
+v 0.474518 1.063746 0.256304
+v 0.449691 1.085142 0.277700
+v 0.566379 0.942228 0.134786
+v 0.552588 0.968130 0.160688
+v 0.536438 0.993341 0.185899
+v 0.596841 0.833941 0.026500
+v 0.593000 0.861484 0.054043
+v 0.586628 0.888792 0.081350
+v 0.586628 0.723769 -0.083672
+v 0.593000 0.751077 -0.056365
+v 0.596841 0.778620 -0.028822
+v 0.536438 0.619220 -0.188221
+v 0.552588 0.644431 -0.163011
+v 0.566379 0.670333 -0.137109
+v 0.449691 0.527419 -0.280022
+v 0.474518 0.548815 -0.258626
+v 0.497320 0.571311 -0.236131
+v 0.332298 0.454622 -0.352820
+v 0.364111 0.470746 -0.336696
+v 0.394369 0.488301 -0.319141
+v 0.192259 0.405790 -0.401652
+v 0.228889 0.415542 -0.391900
+v 0.264543 0.426961 -0.380480
+v 0.039118 0.384250 -0.423191
+v 0.078070 0.386966 -0.420476
+v 0.116688 0.391472 -0.415970
+v -0.116688 0.391472 -0.415970
+v -0.078070 0.386966 -0.420475
+v -0.039118 0.384250 -0.423191
+v -0.264543 0.426961 -0.380480
+v -0.228890 0.415542 -0.391900
+v -0.192259 0.405790 -0.401652
+v -0.394369 0.488301 -0.319141
+v -0.364111 0.470745 -0.336696
+v -0.332298 0.454622 -0.352820
+v -0.497320 0.571310 -0.236131
+v -0.474518 0.548815 -0.258626
+v -0.449691 0.527419 -0.280022
+v -0.566379 0.670333 -0.137109
+v -0.552588 0.644431 -0.163010
+v -0.536438 0.619220 -0.188221
+v -0.596841 0.778620 -0.028822
+v -0.593000 0.751077 -0.056365
+v -0.586628 0.723769 -0.083672
+v -0.586628 0.888792 0.081350
+v -0.593000 0.861484 0.054043
+v -0.596841 0.833941 0.026500
+v -0.522631 1.043843 0.125767
+v -0.538365 1.019281 0.101205
+v -0.551801 0.994046 0.075970
+v -0.438116 1.133281 0.215205
+v -0.462304 1.112436 0.194359
+v -0.484519 1.090520 0.172443
+v -0.323745 1.204205 0.286128
+v -0.354739 1.188496 0.270420
+v -0.384218 1.171393 0.253316
+v -0.187310 1.251780 0.333703
+v -0.222998 1.242280 0.324203
+v -0.257734 1.231154 0.313077
+v -0.038111 1.272765 0.354688
+v -0.076060 1.270119 0.352043
+v -0.113685 1.265730 0.347653
+v 0.113685 1.265730 0.347653
+v 0.076060 1.270119 0.352043
+v 0.038111 1.272765 0.354688
+v 0.257734 1.231154 0.313077
+v 0.222998 1.242280 0.324203
+v 0.187310 1.251780 0.333703
+v 0.384218 1.171393 0.253316
+v 0.354739 1.188497 0.270420
+v 0.323745 1.204205 0.286128
+v 0.484519 1.090520 0.172443
+v 0.462304 1.112436 0.194359
+v 0.438116 1.133281 0.215205
+v 0.551801 0.994046 0.075970
+v 0.538365 1.019281 0.101205
+v 0.522631 1.043843 0.125767
+v 0.581478 0.888547 -0.029530
+v 0.577737 0.915381 -0.002696
+v 0.571529 0.941985 0.023909
+v 0.571529 0.781211 -0.136866
+v 0.577737 0.807815 -0.110262
+v 0.581478 0.834649 -0.083428
+v 0.522631 0.679353 -0.238724
+v 0.538365 0.703915 -0.214162
+v 0.551801 0.729150 -0.188927
+v 0.438116 0.589914 -0.328162
+v 0.462304 0.610760 -0.307317
+v 0.484519 0.632676 -0.285401
+v 0.323745 0.518991 -0.399086
+v 0.354739 0.534699 -0.383377
+v 0.384218 0.551803 -0.366274
+v 0.187310 0.471416 -0.446661
+v 0.222998 0.480917 -0.437160
+v 0.257734 0.492042 -0.426034
+v 0.038111 0.450431 -0.467646
+v 0.076060 0.453076 -0.465000
+v 0.113685 0.457466 -0.460611
+v -0.113685 0.457466 -0.460611
+v -0.076061 0.453076 -0.465000
+v -0.038111 0.450431 -0.467646
+v -0.257734 0.492042 -0.426034
+v -0.222998 0.480917 -0.437160
+v -0.187311 0.471416 -0.446661
+v -0.384219 0.551803 -0.366274
+v -0.354739 0.534699 -0.383377
+v -0.323745 0.518991 -0.399086
+v -0.484520 0.632676 -0.285401
+v -0.462305 0.610760 -0.307317
+v -0.438116 0.589914 -0.328162
+v -0.551801 0.729149 -0.188927
+v -0.538365 0.703914 -0.214162
+v -0.522631 0.679353 -0.238724
+v -0.581479 0.834649 -0.083427
+v -0.577737 0.807815 -0.110261
+v -0.571529 0.781211 -0.136866
+v -0.571529 0.941985 0.023909
+v -0.577737 0.915381 -0.002696
+v -0.581478 0.888547 -0.029530
+v -0.500337 1.088740 0.065322
+v -0.515400 1.065225 0.041808
+v -0.528263 1.041067 0.017650
+v -0.419428 1.174363 0.150945
+v -0.442584 1.154407 0.130989
+v -0.463852 1.133425 0.110008
+v -0.309935 1.242261 0.218844
+v -0.339607 1.227223 0.203805
+v -0.367829 1.210848 0.187431
+v -0.179320 1.287807 0.264389
+v -0.213486 1.278711 0.255294
+v -0.246740 1.268060 0.244643
+v -0.036486 1.307897 0.284479
+v -0.072816 1.305364 0.281946
+v -0.108836 1.301162 0.277744
+v 0.108835 1.301162 0.277744
+v 0.072816 1.305364 0.281946
+v 0.036486 1.307897 0.284479
+v 0.246740 1.268060 0.244643
+v 0.213486 1.278711 0.255294
+v 0.179320 1.287807 0.264389
+v 0.367829 1.210849 0.187431
+v 0.339607 1.227223 0.203805
+v 0.309935 1.242261 0.218844
+v 0.463852 1.133425 0.110008
+v 0.442584 1.154407 0.130989
+v 0.419428 1.174363 0.150945
+v 0.528263 1.041067 0.017650
+v 0.515400 1.065226 0.041808
+v 0.500337 1.088740 0.065322
+v 0.556675 0.940068 -0.083350
+v 0.553093 0.965757 -0.057660
+v 0.547150 0.991227 -0.032191
+v 0.547150 0.837310 -0.186107
+v 0.553093 0.862780 -0.160638
+v 0.556675 0.888469 -0.134948
+v 0.500337 0.739797 -0.283620
+v 0.515400 0.763311 -0.260106
+v 0.528263 0.787470 -0.235948
+v 0.419428 0.654174 -0.369244
+v 0.442584 0.674130 -0.349287
+v 0.463852 0.695111 -0.328306
+v 0.309935 0.586276 -0.437142
+v 0.339607 0.601314 -0.422103
+v 0.367829 0.617688 -0.405729
+v 0.179320 0.540730 -0.482688
+v 0.213486 0.549825 -0.473592
+v 0.246740 0.560476 -0.462941
+v 0.036486 0.520640 -0.502777
+v 0.072816 0.523173 -0.500244
+v 0.108835 0.527375 -0.496042
+v -0.108836 0.527375 -0.496042
+v -0.072816 0.523173 -0.500244
+v -0.036486 0.520640 -0.502777
+v -0.246740 0.560476 -0.462941
+v -0.213486 0.549825 -0.473592
+v -0.179321 0.540730 -0.482688
+v -0.367829 0.617688 -0.405729
+v -0.339607 0.601314 -0.422103
+v -0.309935 0.586276 -0.437142
+v -0.463852 0.695111 -0.328306
+v -0.442584 0.674130 -0.349287
+v -0.419428 0.654174 -0.369244
+v -0.528264 0.787469 -0.235948
+v -0.515401 0.763311 -0.260106
+v -0.500338 0.739797 -0.283620
+v -0.556675 0.888469 -0.134948
+v -0.553093 0.862779 -0.160638
+v -0.547150 0.837310 -0.186107
+v -0.547150 0.991227 -0.032191
+v -0.553093 0.965757 -0.057660
+v -0.556675 0.940067 -0.083350
+v -0.484646 1.082472 -0.044695
+v -0.472845 1.104636 -0.022531
+v -0.459025 1.126209 -0.000958
+v -0.425552 1.167205 0.040038
+v -0.406041 1.186454 0.059287
+v -0.384797 1.204762 0.077595
+v -0.337458 1.238235 0.111068
+v -0.311566 1.253258 0.126090
+v -0.284344 1.267054 0.139887
+v -0.226367 1.290723 0.163556
+v -0.195859 1.300495 0.173328
+v -0.164514 1.308839 0.181672
+v -0.099849 1.321091 0.193924
+v -0.066804 1.324947 0.197780
+v -0.033473 1.327271 0.200103
+v 0.033473 1.327271 0.200103
+v 0.066804 1.324947 0.197780
+v 0.099849 1.321091 0.193924
+v 0.164514 1.308839 0.181672
+v 0.195859 1.300495 0.173328
+v 0.226367 1.290723 0.163556
+v 0.284344 1.267054 0.139887
+v 0.311566 1.253258 0.126090
+v 0.337458 1.238235 0.111068
+v 0.384797 1.204762 0.077595
+v 0.406041 1.186454 0.059287
+v 0.425552 1.167205 0.040038
+v 0.459026 1.126209 -0.000958
+v 0.472845 1.104636 -0.022531
+v 0.484646 1.082472 -0.044695
+v 0.501973 1.036747 -0.090420
+v 0.507425 1.013381 -0.113787
+v 0.510711 0.989812 -0.137355
+v 0.510711 0.942474 -0.184693
+v 0.507425 0.918906 -0.208261
+v 0.501973 0.895539 -0.231628
+v 0.484646 0.849814 -0.277353
+v 0.472845 0.827650 -0.299517
+v 0.459025 0.806077 -0.321090
+v 0.425552 0.765081 -0.362086
+v 0.406041 0.745832 -0.381334
+v 0.384797 0.727524 -0.399643
+v 0.337458 0.694051 -0.433116
+v 0.311566 0.679029 -0.448138
+v 0.284344 0.665232 -0.461935
+v 0.226367 0.641563 -0.485604
+v 0.195859 0.631791 -0.495376
+v 0.164514 0.623447 -0.503720
+v 0.099849 0.611195 -0.515972
+v 0.066804 0.607339 -0.519827
+v 0.033473 0.605016 -0.522151
+v -0.033473 0.605016 -0.522151
+v -0.066804 0.607339 -0.519827
+v -0.099849 0.611195 -0.515972
+v -0.164515 0.623447 -0.503720
+v -0.195859 0.631791 -0.495376
+v -0.226367 0.641563 -0.485604
+v -0.284344 0.665232 -0.461935
+v -0.311566 0.679029 -0.448138
+v -0.337458 0.694051 -0.433116
+v -0.384797 0.727524 -0.399643
+v -0.406041 0.745832 -0.381334
+v -0.425553 0.765081 -0.362086
+v -0.459026 0.806077 -0.321090
+v -0.472845 0.827650 -0.299517
+v -0.484646 0.849814 -0.277353
+v -0.501973 0.895539 -0.231628
+v -0.507425 0.918906 -0.208261
+v -0.510712 0.942474 -0.184693
+v -0.510711 0.989812 -0.137355
+v -0.507425 1.013381 -0.113786
+v -0.501973 1.036747 -0.090420
+v -0.428684 1.162656 -0.058566
+v -0.441590 1.142509 -0.078713
+v -0.452611 1.121810 -0.099411
+v -0.359361 1.236017 0.014795
+v -0.379202 1.218919 -0.002303
+v -0.397423 1.200942 -0.020280
+v -0.265549 1.294191 0.072970
+v -0.290972 1.281307 0.060085
+v -0.315152 1.267277 0.046056
+v -0.153640 1.333215 0.111993
+v -0.182912 1.325422 0.104200
+v -0.211404 1.316296 0.095074
+v -0.031261 1.350428 0.129206
+v -0.062388 1.348257 0.127035
+v -0.093249 1.344657 0.123435
+v 0.093249 1.344657 0.123435
+v 0.062388 1.348257 0.127035
+v 0.031261 1.350428 0.129206
+v 0.211404 1.316296 0.095074
+v 0.182912 1.325422 0.104200
+v 0.153640 1.333215 0.111993
+v 0.315152 1.267278 0.046056
+v 0.290972 1.281307 0.060085
+v 0.265549 1.294191 0.072969
+v 0.397423 1.200942 -0.020280
+v 0.379202 1.218919 -0.002303
+v 0.359361 1.236017 0.014795
+v 0.452611 1.121810 -0.099411
+v 0.441590 1.142509 -0.078713
+v 0.428684 1.162656 -0.058566
+v 0.476953 1.035275 -0.185947
+v 0.473884 1.057286 -0.163936
+v 0.468792 1.079108 -0.142114
+v 0.468792 0.947233 -0.273988
+v 0.473884 0.969055 -0.252166
+v 0.476953 0.991066 -0.230156
+v 0.428684 0.863685 -0.357537
+v 0.441590 0.883832 -0.337390
+v 0.452611 0.904531 -0.316691
+v 0.359361 0.790324 -0.430898
+v 0.379202 0.807422 -0.413799
+v 0.397423 0.825399 -0.395823
+v 0.265549 0.732150 -0.489072
+v 0.290972 0.745034 -0.476187
+v 0.315152 0.759063 -0.462158
+v 0.153640 0.693126 -0.528095
+v 0.182912 0.700919 -0.520302
+v 0.211404 0.710045 -0.511177
+v 0.031261 0.675914 -0.545308
+v 0.062388 0.678084 -0.543138
+v 0.093249 0.681684 -0.539537
+v -0.093249 0.681684 -0.539537
+v -0.062388 0.678084 -0.543138
+v -0.031261 0.675913 -0.545308
+v -0.211404 0.710045 -0.511177
+v -0.182913 0.700919 -0.520302
+v -0.153640 0.693126 -0.528095
+v -0.315153 0.759063 -0.462158
+v -0.290972 0.745034 -0.476187
+v -0.265549 0.732150 -0.489072
+v -0.397424 0.825399 -0.395823
+v -0.379202 0.807422 -0.413799
+v -0.359362 0.790324 -0.430898
+v -0.452611 0.904531 -0.316691
+v -0.441590 0.883832 -0.337390
+v -0.428684 0.863685 -0.357536
+v -0.476954 0.991066 -0.230156
+v -0.473884 0.969055 -0.252166
+v -0.468793 0.947233 -0.273988
+v -0.468792 1.079108 -0.142114
+v -0.473884 1.057286 -0.163936
+v -0.476953 1.035275 -0.185947
+v -0.382592 1.188304 -0.116359
+v -0.394110 1.170324 -0.134340
+v -0.403946 1.151850 -0.152813
+v -0.320723 1.253777 -0.050886
+v -0.338430 1.238518 -0.066146
+v -0.354693 1.222474 -0.082190
+v -0.236997 1.305697 0.001034
+v -0.259687 1.294197 -0.010466
+v -0.281267 1.281677 -0.022987
+v -0.137121 1.340525 0.035861
+v -0.163246 1.333569 0.028906
+v -0.188674 1.325425 0.020761
+v -0.027900 1.355887 0.051223
+v -0.055680 1.353950 0.049286
+v -0.083223 1.350736 0.046073
+v 0.083223 1.350736 0.046073
+v 0.055680 1.353950 0.049286
+v 0.027899 1.355887 0.051223
+v 0.188674 1.325425 0.020761
+v 0.163246 1.333570 0.028906
+v 0.137121 1.340525 0.035861
+v 0.281267 1.281677 -0.022986
+v 0.259687 1.294198 -0.010466
+v 0.236997 1.305697 0.001034
+v 0.354693 1.222474 -0.082190
+v 0.338430 1.238518 -0.066146
+v 0.320723 1.253778 -0.050886
+v 0.403946 1.151850 -0.152813
+v 0.394110 1.170324 -0.134340
+v 0.382592 1.188304 -0.116359
+v 0.425672 1.074619 -0.230044
+v 0.422933 1.094263 -0.210400
+v 0.418388 1.113739 -0.190924
+v 0.418388 0.996044 -0.308620
+v 0.422933 1.015519 -0.289144
+v 0.425672 1.035163 -0.269500
+v 0.382592 0.921478 -0.383185
+v 0.394110 0.939459 -0.365204
+v 0.403946 0.957932 -0.346731
+v 0.320723 0.856005 -0.448658
+v 0.338430 0.871265 -0.433398
+v 0.354693 0.887309 -0.417355
+v 0.236997 0.804086 -0.500578
+v 0.259687 0.815585 -0.489078
+v 0.281267 0.828106 -0.476558
+v 0.137121 0.769258 -0.535405
+v 0.163246 0.776213 -0.528450
+v 0.188674 0.784358 -0.520306
+v 0.027899 0.753896 -0.550767
+v 0.055680 0.755833 -0.548831
+v 0.083223 0.759046 -0.545617
+v -0.083223 0.759046 -0.545617
+v -0.055680 0.755833 -0.548831
+v -0.027900 0.753896 -0.550767
+v -0.188674 0.784358 -0.520306
+v -0.163246 0.776213 -0.528450
+v -0.137121 0.769258 -0.535405
+v -0.281268 0.828106 -0.476558
+v -0.259687 0.815585 -0.489078
+v -0.236998 0.804085 -0.500578
+v -0.354693 0.887309 -0.417355
+v -0.338430 0.871265 -0.433398
+v -0.320723 0.856005 -0.448658
+v -0.403947 0.957932 -0.346731
+v -0.394111 0.939459 -0.365204
+v -0.382592 0.921478 -0.383185
+v -0.425672 1.035163 -0.269500
+v -0.422933 1.015519 -0.289144
+v -0.418388 0.996044 -0.308620
+v -0.418388 1.113739 -0.190924
+v -0.422933 1.094263 -0.210400
+v -0.425672 1.074619 -0.230044
+v -0.337261 1.203558 -0.163228
+v -0.347414 1.187708 -0.179078
+v -0.356085 1.171423 -0.195362
+v -0.282722 1.261274 -0.105512
+v -0.298331 1.247822 -0.118964
+v -0.312667 1.233679 -0.133107
+v -0.208917 1.307041 -0.059745
+v -0.228918 1.296905 -0.069881
+v -0.247941 1.285867 -0.080919
+v -0.120874 1.337742 -0.029044
+v -0.143904 1.331611 -0.035175
+v -0.166319 1.324432 -0.042354
+v -0.024594 1.351284 -0.015502
+v -0.049083 1.349577 -0.017209
+v -0.073362 1.346744 -0.020042
+v 0.073362 1.346744 -0.020042
+v 0.049083 1.349577 -0.017209
+v 0.024594 1.351284 -0.015502
+v 0.166319 1.324432 -0.042354
+v 0.143904 1.331611 -0.035175
+v 0.120874 1.337742 -0.029044
+v 0.247941 1.285867 -0.080919
+v 0.228918 1.296905 -0.069881
+v 0.208917 1.307041 -0.059745
+v 0.312667 1.233679 -0.133107
+v 0.298331 1.247822 -0.118964
+v 0.282722 1.261274 -0.105512
+v 0.356084 1.171423 -0.195363
+v 0.347414 1.187708 -0.179078
+v 0.337261 1.203558 -0.163228
+v 0.375236 1.103343 -0.263443
+v 0.372821 1.120659 -0.246127
+v 0.368815 1.137828 -0.228958
+v 0.368815 1.034078 -0.332708
+v 0.372821 1.051246 -0.315540
+v 0.375236 1.068562 -0.298224
+v 0.337261 0.968347 -0.398439
+v 0.347414 0.984197 -0.382589
+v 0.356084 1.000482 -0.366304
+v 0.282722 0.910632 -0.456154
+v 0.298331 0.924083 -0.442703
+v 0.312667 0.938226 -0.428560
+v 0.208917 0.864864 -0.501922
+v 0.228918 0.875000 -0.491785
+v 0.247941 0.886038 -0.480748
+v 0.120874 0.834163 -0.532623
+v 0.143904 0.840294 -0.526492
+v 0.166319 0.847473 -0.519313
+v 0.024594 0.820621 -0.546165
+v 0.049083 0.822328 -0.544458
+v 0.073362 0.825161 -0.541625
+v -0.073362 0.825161 -0.541625
+v -0.049083 0.822328 -0.544458
+v -0.024594 0.820621 -0.546165
+v -0.166319 0.847473 -0.519313
+v -0.143904 0.840294 -0.526492
+v -0.120874 0.834163 -0.532623
+v -0.247941 0.886038 -0.480748
+v -0.228918 0.875000 -0.491785
+v -0.208917 0.864864 -0.501922
+v -0.312667 0.938226 -0.428560
+v -0.298331 0.924083 -0.442702
+v -0.282722 0.910631 -0.456154
+v -0.356085 1.000482 -0.366304
+v -0.347414 0.984197 -0.382589
+v -0.337261 0.968347 -0.398439
+v -0.375236 1.068562 -0.298224
+v -0.372821 1.051246 -0.315540
+v -0.368815 1.034078 -0.332708
+v -0.368815 1.137828 -0.228958
+v -0.372821 1.120659 -0.246126
+v -0.375236 1.103343 -0.263443
+v -0.132325 0.355154 0.500108
+v -0.113796 0.348670 0.499571
+v -0.095368 0.342669 0.498589
+v -0.085505 0.359507 0.515427
+v -0.102027 0.368762 0.519662
+v -0.118639 0.378517 0.523471
+v -0.069814 0.373966 0.529886
+v -0.083305 0.386015 0.536915
+v -0.096868 0.398579 0.543533
+v -0.049366 0.385061 0.540981
+v -0.058905 0.399254 0.550154
+v -0.068496 0.413973 0.558927
+v -0.025554 0.392035 0.547955
+v -0.030492 0.407576 0.558476
+v -0.035456 0.423650 0.568604
+v 0.000000 0.394414 0.550334
+v 0.000000 0.410414 0.561315
+v 0.000000 0.426951 0.571905
+v 0.025554 0.392035 0.547955
+v 0.030492 0.407576 0.558476
+v 0.035456 0.423650 0.568604
+v 0.049366 0.385061 0.540981
+v 0.058905 0.399254 0.550154
+v 0.068496 0.413973 0.558927
+v 0.069814 0.373966 0.529886
+v 0.083305 0.386015 0.536915
+v 0.096868 0.398579 0.543533
+v 0.085505 0.359507 0.515427
+v 0.102027 0.368762 0.519662
+v 0.118639 0.378517 0.523471
+v 0.095368 0.342669 0.498589
+v 0.113796 0.348670 0.499571
+v 0.132325 0.355154 0.500108
+v 0.098732 0.324600 0.480520
+v 0.117811 0.327110 0.478010
+v 0.136993 0.330083 0.475037
+v 0.095368 0.306530 0.462451
+v 0.113796 0.305549 0.456449
+v 0.132325 0.305011 0.449965
+v 0.085505 0.289692 0.445613
+v 0.102027 0.285457 0.436357
+v 0.118639 0.281649 0.426602
+v 0.069814 0.275233 0.431154
+v 0.083305 0.268204 0.419105
+v 0.096868 0.261586 0.406540
+v 0.049366 0.264139 0.420059
+v 0.058905 0.254966 0.405866
+v 0.068496 0.246192 0.391146
+v 0.025554 0.257164 0.413084
+v 0.030492 0.246643 0.397544
+v 0.035456 0.236515 0.381469
+v 0.000000 0.254785 0.410705
+v 0.000000 0.243805 0.394705
+v 0.000000 0.233214 0.378168
+v -0.025554 0.257164 0.413084
+v -0.030492 0.246643 0.397544
+v -0.035456 0.236515 0.381469
+v -0.049366 0.264139 0.420059
+v -0.058905 0.254966 0.405866
+v -0.068496 0.246192 0.391146
+v -0.069814 0.275233 0.431154
+v -0.083305 0.268204 0.419105
+v -0.096868 0.261586 0.406540
+v -0.085505 0.289692 0.445613
+v -0.102027 0.285457 0.436358
+v -0.118639 0.281649 0.426603
+v -0.095368 0.306530 0.462451
+v -0.113796 0.305549 0.456449
+v -0.132325 0.305011 0.449965
+v -0.098732 0.324600 0.480520
+v -0.117811 0.327110 0.478010
+v -0.136993 0.330083 0.475037
+v -0.205267 0.385347 0.497556
+v -0.187313 0.377192 0.498908
+v -0.169158 0.369436 0.499784
+v -0.151663 0.399302 0.529650
+v -0.167940 0.410263 0.531979
+v -0.184038 0.421588 0.533797
+v -0.123832 0.424948 0.555297
+v -0.137123 0.438662 0.560378
+v -0.150266 0.452709 0.564919
+v -0.087563 0.444627 0.574976
+v -0.096960 0.460454 0.582169
+v -0.106254 0.476590 0.588799
+v -0.045326 0.456998 0.587347
+v -0.050190 0.474152 0.595868
+v -0.055001 0.491601 0.603810
+v 0.000000 0.461218 0.591566
+v 0.000000 0.478825 0.600540
+v 0.000000 0.496721 0.608930
+v 0.045326 0.456998 0.587347
+v 0.050190 0.474152 0.595868
+v 0.055001 0.491601 0.603810
+v 0.087563 0.444627 0.574976
+v 0.096960 0.460454 0.582169
+v 0.106254 0.476590 0.588799
+v 0.123832 0.424948 0.555297
+v 0.137123 0.438662 0.560378
+v 0.150266 0.452709 0.564919
+v 0.151663 0.399302 0.529650
+v 0.167940 0.410263 0.531979
+v 0.184038 0.421588 0.533797
+v 0.169158 0.369436 0.499784
+v 0.187313 0.377192 0.498908
+v 0.205268 0.385347 0.497556
+v 0.175126 0.337385 0.467734
+v 0.193921 0.341702 0.463418
+v 0.212509 0.346455 0.458664
+v 0.169158 0.305335 0.435684
+v 0.187313 0.306212 0.427928
+v 0.205268 0.307563 0.419773
+v 0.151663 0.275469 0.405818
+v 0.167940 0.273141 0.394856
+v 0.184038 0.271322 0.383531
+v 0.123832 0.249823 0.380171
+v 0.137123 0.244741 0.366457
+v 0.150266 0.240201 0.352410
+v 0.087563 0.230143 0.360492
+v 0.096960 0.222950 0.344666
+v 0.106254 0.216321 0.328530
+v 0.045326 0.217773 0.348121
+v 0.050190 0.209251 0.330967
+v 0.055001 0.201309 0.313518
+v 0.000000 0.213553 0.343902
+v 0.000000 0.204579 0.326295
+v 0.000000 0.196189 0.308398
+v -0.045326 0.217772 0.348121
+v -0.050190 0.209251 0.330967
+v -0.055001 0.201309 0.313518
+v -0.087563 0.230143 0.360492
+v -0.096960 0.222950 0.344666
+v -0.106254 0.216321 0.328530
+v -0.123832 0.249823 0.380171
+v -0.137123 0.244741 0.366457
+v -0.150266 0.240201 0.352410
+v -0.151663 0.275469 0.405818
+v -0.167940 0.273141 0.394856
+v -0.184038 0.271322 0.383531
+v -0.169158 0.305335 0.435684
+v -0.187313 0.306212 0.427928
+v -0.205268 0.307563 0.419773
+v -0.175125 0.337385 0.467734
+v -0.193921 0.341702 0.463418
+v -0.212509 0.346455 0.458664
+v -0.274698 0.421779 0.487434
+v -0.257736 0.412118 0.490667
+v -0.240498 0.402820 0.493433
+v -0.215624 0.445281 0.535895
+v -0.231079 0.457623 0.536172
+v -0.246287 0.470279 0.535934
+v -0.176056 0.481744 0.572357
+v -0.188676 0.496700 0.575248
+v -0.201093 0.511927 0.577581
+v -0.124491 0.509722 0.600336
+v -0.133414 0.526684 0.605232
+v -0.142194 0.543884 0.609539
+v -0.064441 0.527310 0.617924
+v -0.069060 0.545532 0.624080
+v -0.073605 0.563973 0.629628
+v 0.000000 0.533309 0.623923
+v 0.000000 0.551961 0.630509
+v 0.000000 0.570825 0.636480
+v 0.064441 0.527310 0.617924
+v 0.069060 0.545532 0.624080
+v 0.073605 0.563973 0.629628
+v 0.124491 0.509722 0.600336
+v 0.133414 0.526684 0.605232
+v 0.142194 0.543884 0.609539
+v 0.176057 0.481744 0.572357
+v 0.188676 0.496700 0.575248
+v 0.201093 0.511927 0.577581
+v 0.215624 0.445281 0.535895
+v 0.231080 0.457624 0.536172
+v 0.246288 0.470279 0.535934
+v 0.240498 0.402820 0.493433
+v 0.257736 0.412119 0.490667
+v 0.274698 0.421779 0.487434
+v 0.248982 0.357253 0.447867
+v 0.266828 0.363286 0.441834
+v 0.284389 0.369732 0.435387
+v 0.240498 0.311686 0.402300
+v 0.257736 0.314453 0.393001
+v 0.274698 0.317686 0.383340
+v 0.215624 0.269225 0.359838
+v 0.231080 0.268948 0.347496
+v 0.246288 0.269186 0.334841
+v 0.176057 0.232762 0.323376
+v 0.188676 0.229872 0.308420
+v 0.201093 0.227538 0.293193
+v 0.124491 0.204783 0.295397
+v 0.133414 0.199888 0.278436
+v 0.142194 0.195581 0.261236
+v 0.064441 0.187195 0.277809
+v 0.069060 0.181039 0.259587
+v 0.073605 0.175491 0.241146
+v 0.000000 0.181196 0.271810
+v 0.000000 0.174610 0.253158
+v 0.000000 0.168639 0.234294
+v -0.064441 0.187195 0.277809
+v -0.069060 0.181039 0.259587
+v -0.073605 0.175491 0.241146
+v -0.124491 0.204783 0.295397
+v -0.133414 0.199888 0.278436
+v -0.142194 0.195581 0.261236
+v -0.176057 0.232762 0.323376
+v -0.188676 0.229872 0.308420
+v -0.201093 0.227538 0.293193
+v -0.215624 0.269225 0.359838
+v -0.231080 0.268948 0.347496
+v -0.246288 0.269186 0.334841
+v -0.240498 0.311686 0.402300
+v -0.257736 0.314453 0.393001
+v -0.274698 0.317686 0.383341
+v -0.248982 0.357253 0.447867
+v -0.266828 0.363286 0.441834
+v -0.284388 0.369732 0.435387
+v -0.339428 0.463827 0.469915
+v -0.323748 0.452826 0.474973
+v -0.307722 0.442144 0.479583
+v -0.275896 0.496474 0.533913
+v -0.290265 0.509986 0.532133
+v -0.304323 0.523755 0.529843
+v -0.225268 0.543129 0.580568
+v -0.237000 0.559071 0.581218
+v -0.248479 0.575217 0.581305
+v -0.159289 0.578928 0.616367
+v -0.167584 0.596735 0.618881
+v -0.175701 0.614705 0.620793
+v -0.082454 0.601433 0.638872
+v -0.086748 0.620411 0.642558
+v -0.090950 0.639528 0.645616
+v 0.000000 0.609108 0.646547
+v 0.000000 0.628487 0.650634
+v 0.000000 0.647995 0.654082
+v 0.082454 0.601433 0.638872
+v 0.086748 0.620411 0.642558
+v 0.090950 0.639528 0.645616
+v 0.159289 0.578928 0.616367
+v 0.167585 0.596735 0.618881
+v 0.175701 0.614705 0.620793
+v 0.225268 0.543129 0.580568
+v 0.237000 0.559071 0.581218
+v 0.248479 0.575217 0.581305
+v 0.275896 0.496474 0.533913
+v 0.290265 0.509987 0.532133
+v 0.304323 0.523755 0.529843
+v 0.307722 0.442144 0.479583
+v 0.323749 0.452826 0.474973
+v 0.339429 0.463827 0.469915
+v 0.318578 0.383840 0.421279
+v 0.335169 0.391486 0.413633
+v 0.351402 0.399516 0.405604
+v 0.307722 0.325536 0.362976
+v 0.323749 0.330146 0.352293
+v 0.339429 0.335205 0.341292
+v 0.275896 0.271206 0.308645
+v 0.290265 0.272986 0.295133
+v 0.304323 0.275276 0.281364
+v 0.225268 0.224551 0.261991
+v 0.237000 0.223902 0.246049
+v 0.248479 0.223815 0.229902
+v 0.159289 0.188752 0.226191
+v 0.167585 0.186238 0.208385
+v 0.175701 0.184327 0.190414
+v 0.082454 0.166248 0.203687
+v 0.086748 0.162561 0.184708
+v 0.090950 0.159504 0.165591
+v 0.000000 0.158572 0.196011
+v 0.000000 0.154486 0.176633
+v 0.000000 0.151037 0.157125
+v -0.082454 0.166248 0.203687
+v -0.086748 0.162561 0.184708
+v -0.090950 0.159504 0.165591
+v -0.159289 0.188752 0.226191
+v -0.167585 0.186238 0.208385
+v -0.175701 0.184327 0.190414
+v -0.225268 0.224551 0.261991
+v -0.237000 0.223902 0.246049
+v -0.248479 0.223815 0.229902
+v -0.275896 0.271206 0.308645
+v -0.290265 0.272986 0.295133
+v -0.304323 0.275276 0.281364
+v -0.307722 0.325536 0.362976
+v -0.323749 0.330146 0.352293
+v -0.339429 0.335205 0.341292
+v -0.318577 0.383840 0.421279
+v -0.335169 0.391486 0.413633
+v -0.351402 0.399516 0.405604
+v -0.398351 0.510772 0.445298
+v -0.384222 0.498619 0.452096
+v -0.369681 0.486736 0.458470
+v -0.331447 0.552005 0.523740
+v -0.344484 0.566456 0.519933
+v -0.357152 0.581103 0.515630
+v -0.270625 0.608054 0.579788
+v -0.281270 0.624709 0.578186
+v -0.291613 0.641498 0.576025
+v -0.191361 0.651061 0.622795
+v -0.198888 0.669408 0.622885
+v -0.206202 0.687841 0.622368
+v -0.099056 0.678097 0.649831
+v -0.102952 0.697507 0.650984
+v -0.106738 0.716973 0.651500
+v 0.000000 0.687318 0.659052
+v 0.000000 0.707091 0.660568
+v 0.000000 0.726910 0.661436
+v 0.099056 0.678097 0.649831
+v 0.102952 0.697507 0.650984
+v 0.106738 0.716973 0.651500
+v 0.191361 0.651061 0.622795
+v 0.198888 0.669408 0.622885
+v 0.206202 0.687841 0.622368
+v 0.270626 0.608054 0.579788
+v 0.281270 0.624709 0.578186
+v 0.291613 0.641498 0.576025
+v 0.331447 0.552005 0.523740
+v 0.344484 0.566456 0.519933
+v 0.357152 0.581103 0.515630
+v 0.369681 0.486736 0.458470
+v 0.384222 0.498619 0.452096
+v 0.398351 0.510772 0.445298
+v 0.382722 0.416693 0.388427
+v 0.397776 0.425821 0.379298
+v 0.412404 0.435297 0.369823
+v 0.369681 0.346650 0.318384
+v 0.384222 0.353023 0.306500
+v 0.398351 0.359821 0.294348
+v 0.331447 0.281380 0.253114
+v 0.344484 0.285186 0.238663
+v 0.357152 0.289490 0.224016
+v 0.270626 0.225331 0.197066
+v 0.281270 0.226933 0.180410
+v 0.291613 0.229095 0.163621
+v 0.191361 0.182324 0.154058
+v 0.198888 0.182234 0.135711
+v 0.206202 0.182752 0.117278
+v 0.099056 0.155288 0.127023
+v 0.102952 0.154135 0.107612
+v 0.106738 0.153619 0.088146
+v 0.000000 0.146067 0.117801
+v 0.000000 0.144551 0.098028
+v 0.000000 0.143683 0.078210
+v -0.099056 0.155288 0.127023
+v -0.102952 0.154135 0.107612
+v -0.106738 0.153619 0.088146
+v -0.191361 0.182324 0.154058
+v -0.198888 0.182234 0.135711
+v -0.206202 0.182752 0.117278
+v -0.270626 0.225331 0.197066
+v -0.281270 0.226933 0.180410
+v -0.291613 0.229095 0.163621
+v -0.331447 0.281380 0.253114
+v -0.344484 0.285186 0.238663
+v -0.357152 0.289490 0.224016
+v -0.369682 0.346650 0.318384
+v -0.384222 0.353023 0.306500
+v -0.398351 0.359821 0.294348
+v -0.382722 0.416693 0.388427
+v -0.397776 0.425821 0.379298
+v -0.412404 0.435296 0.369823
+v -0.450458 0.561809 0.414005
+v -0.438121 0.548713 0.422427
+v -0.425315 0.535832 0.430455
+v -0.381327 0.610924 0.505548
+v -0.392809 0.626066 0.499780
+v -0.403870 0.641341 0.493537
+v -0.311352 0.675407 0.570031
+v -0.320727 0.692491 0.566205
+v -0.329758 0.709636 0.561832
+v -0.220159 0.724887 0.619510
+v -0.226788 0.743460 0.617174
+v -0.233174 0.762041 0.614237
+v -0.113963 0.755991 0.650615
+v -0.117394 0.775501 0.649215
+v -0.120700 0.794984 0.647180
+v 0.000000 0.766600 0.661224
+v 0.000000 0.786430 0.660144
+v 0.000000 0.806220 0.658416
+v 0.113963 0.755991 0.650615
+v 0.117394 0.775501 0.649215
+v 0.120700 0.794984 0.647180
+v 0.220159 0.724887 0.619511
+v 0.226788 0.743461 0.617174
+v 0.233174 0.762041 0.614237
+v 0.311352 0.675407 0.570031
+v 0.320727 0.692491 0.566205
+v 0.329758 0.709636 0.561832
+v 0.381327 0.610924 0.505548
+v 0.392809 0.626066 0.499780
+v 0.403870 0.641341 0.493537
+v 0.425315 0.535832 0.430455
+v 0.438121 0.548713 0.422427
+v 0.450458 0.561809 0.414005
+v 0.440319 0.455248 0.349871
+v 0.453576 0.465703 0.339417
+v 0.466349 0.476462 0.328658
+v 0.425315 0.374664 0.269287
+v 0.438121 0.382693 0.256406
+v 0.450458 0.391114 0.243310
+v 0.381327 0.299572 0.194195
+v 0.392809 0.305339 0.179053
+v 0.403870 0.311583 0.163779
+v 0.311352 0.235088 0.129712
+v 0.320727 0.238915 0.112629
+v 0.329758 0.243287 0.095483
+v 0.220159 0.185609 0.080232
+v 0.226788 0.187945 0.061659
+v 0.233174 0.190883 0.043079
+v 0.113963 0.154504 0.049128
+v 0.117394 0.155904 0.029618
+v 0.120700 0.157940 0.010136
+v 0.000000 0.143895 0.038519
+v 0.000000 0.144976 0.018690
+v 0.000000 0.146703 -0.001100
+v -0.113963 0.154504 0.049128
+v -0.117394 0.155904 0.029618
+v -0.120700 0.157940 0.010136
+v -0.220159 0.185609 0.080232
+v -0.226788 0.187945 0.061659
+v -0.233174 0.190883 0.043079
+v -0.311353 0.235088 0.129712
+v -0.320727 0.238914 0.112629
+v -0.329758 0.243287 0.095483
+v -0.381327 0.299572 0.194195
+v -0.392809 0.305339 0.179053
+v -0.403870 0.311582 0.163779
+v -0.425315 0.374664 0.269288
+v -0.438121 0.382693 0.256407
+v -0.450458 0.391114 0.243310
+v -0.440319 0.455248 0.349872
+v -0.453576 0.465703 0.339417
+v -0.466349 0.476462 0.328658
+v -0.494857 0.616067 0.376572
+v -0.484524 0.602251 0.386473
+v -0.473672 0.588593 0.396019
+v -0.424683 0.672223 0.479649
+v -0.434412 0.687797 0.472019
+v -0.443677 0.703438 0.463943
+v -0.346752 0.744037 0.551463
+v -0.354696 0.761257 0.545479
+v -0.362261 0.778464 0.538969
+v -0.245191 0.799143 0.606569
+v -0.250808 0.817625 0.601846
+v -0.256157 0.836034 0.596539
+v -0.126920 0.833783 0.641209
+v -0.129828 0.853059 0.637281
+v -0.132597 0.872224 0.632729
+v 0.000000 0.845599 0.653025
+v 0.000000 0.865145 0.649367
+v 0.000000 0.884568 0.645073
+v 0.126920 0.833783 0.641209
+v 0.129828 0.853059 0.637281
+v 0.132597 0.872224 0.632729
+v 0.245191 0.799143 0.606569
+v 0.250808 0.817625 0.601847
+v 0.256157 0.836034 0.596539
+v 0.346752 0.744037 0.551463
+v 0.354696 0.761257 0.545479
+v 0.362261 0.778464 0.538969
+v 0.424683 0.672223 0.479649
+v 0.434412 0.687797 0.472019
+v 0.443677 0.703438 0.463943
+v 0.473672 0.588593 0.396019
+v 0.484524 0.602251 0.386473
+v 0.494858 0.616067 0.376572
+v 0.490381 0.498847 0.306273
+v 0.501616 0.510449 0.294671
+v 0.512314 0.522307 0.282812
+v 0.473672 0.409101 0.216527
+v 0.484524 0.418647 0.202869
+v 0.494858 0.428547 0.189052
+v 0.424683 0.325471 0.132897
+v 0.434412 0.333101 0.117323
+v 0.443677 0.341177 0.101682
+v 0.346752 0.253656 0.061082
+v 0.354696 0.259641 0.043863
+v 0.362261 0.266150 0.026655
+v 0.245191 0.198551 0.005977
+v 0.250808 0.203273 -0.012505
+v 0.256157 0.208580 -0.030915
+v 0.126920 0.163910 -0.028664
+v 0.129828 0.167838 -0.047940
+v 0.132597 0.172390 -0.067105
+v -0.000000 0.152095 -0.040479
+v -0.000000 0.155752 -0.060025
+v -0.000000 0.160046 -0.079449
+v -0.126920 0.163910 -0.028664
+v -0.129828 0.167838 -0.047940
+v -0.132597 0.172390 -0.067105
+v -0.245191 0.198551 0.005977
+v -0.250808 0.203273 -0.012505
+v -0.256157 0.208580 -0.030915
+v -0.346752 0.253656 0.061082
+v -0.354696 0.259641 0.043863
+v -0.362261 0.266150 0.026655
+v -0.424683 0.325471 0.132897
+v -0.434412 0.333101 0.117323
+v -0.443677 0.341177 0.101682
+v -0.473672 0.409101 0.216527
+v -0.484524 0.418647 0.202869
+v -0.494858 0.428547 0.189052
+v -0.490381 0.498847 0.306273
+v -0.501616 0.510449 0.294671
+v -0.512314 0.522307 0.282812
+v -0.530790 0.672616 0.333639
+v -0.522636 0.658317 0.344849
+v -0.513924 0.644115 0.355749
+v -0.460771 0.734852 0.446486
+v -0.468583 0.750592 0.437124
+v -0.475893 0.766331 0.427353
+v -0.376218 0.812769 0.524403
+v -0.382596 0.829830 0.516362
+v -0.388565 0.846805 0.507828
+v -0.266027 0.872557 0.584191
+v -0.270536 0.890632 0.577164
+v -0.274757 0.908556 0.569578
+v -0.137705 0.910142 0.621776
+v -0.140040 0.928853 0.615385
+v -0.142225 0.947374 0.608396
+v 0.000000 0.922961 0.634595
+v 0.000000 0.941890 0.628422
+v 0.000000 0.960614 0.621636
+v 0.137706 0.910142 0.621776
+v 0.140040 0.928853 0.615385
+v 0.142225 0.947374 0.608396
+v 0.266027 0.872557 0.584191
+v 0.270537 0.890632 0.577164
+v 0.274757 0.908556 0.569578
+v 0.376218 0.812769 0.524403
+v 0.382596 0.829830 0.516362
+v 0.388565 0.846806 0.507828
+v 0.460772 0.734852 0.446486
+v 0.468583 0.750592 0.437124
+v 0.475893 0.766331 0.427353
+v 0.513924 0.644115 0.355749
+v 0.522637 0.658317 0.344849
+v 0.530790 0.672617 0.333639
+v 0.532053 0.546743 0.258377
+v 0.541073 0.559294 0.245826
+v 0.549514 0.572049 0.233071
+v 0.513924 0.449370 0.161004
+v 0.522636 0.460270 0.146803
+v 0.530790 0.471480 0.132503
+v 0.460772 0.358633 0.070268
+v 0.468583 0.367995 0.054528
+v 0.475893 0.377766 0.038788
+v 0.376219 0.280716 -0.007650
+v 0.382596 0.288757 -0.024711
+v 0.388565 0.297292 -0.041686
+v 0.266027 0.220928 -0.067438
+v 0.270537 0.227955 -0.085512
+v 0.274757 0.235541 -0.103436
+v 0.137706 0.183343 -0.105022
+v 0.140040 0.189734 -0.123734
+v 0.142225 0.196723 -0.142254
+v -0.000000 0.170524 -0.117842
+v -0.000000 0.176697 -0.136771
+v -0.000000 0.183483 -0.155494
+v -0.137706 0.183343 -0.105022
+v -0.140040 0.189734 -0.123734
+v -0.142225 0.196723 -0.142254
+v -0.266027 0.220928 -0.067438
+v -0.270537 0.227955 -0.085512
+v -0.274757 0.235541 -0.103436
+v -0.376219 0.280716 -0.007650
+v -0.382597 0.288757 -0.024711
+v -0.388565 0.297291 -0.041686
+v -0.460772 0.358633 0.070268
+v -0.468583 0.367995 0.054528
+v -0.475893 0.377766 0.038788
+v -0.513924 0.449370 0.161004
+v -0.522637 0.460270 0.146803
+v -0.530790 0.471480 0.132503
+v -0.532053 0.546743 0.258377
+v -0.541073 0.559294 0.245826
+v -0.549514 0.572049 0.233071
+v -0.557640 0.730490 0.285940
+v -0.551806 0.715951 0.298268
+v -0.545382 0.701449 0.310336
+v -0.488977 0.797740 0.406627
+v -0.494736 0.813377 0.395693
+v -0.499966 0.828945 0.384395
+v -0.399248 0.880427 0.489314
+v -0.403950 0.897037 0.479354
+v -0.408221 0.913490 0.468940
+v -0.282311 0.943875 0.552762
+v -0.285636 0.961233 0.543549
+v -0.288656 0.978364 0.533814
+v -0.146135 0.983760 0.592647
+v -0.147856 1.001588 0.583904
+v -0.149419 1.019146 0.574596
+v 0.000000 0.997364 0.606251
+v 0.000000 1.015352 0.597668
+v 0.000000 1.033056 0.588505
+v 0.146135 0.983760 0.592646
+v 0.147856 1.001588 0.583904
+v 0.149419 1.019146 0.574596
+v 0.282311 0.943875 0.552761
+v 0.285636 0.961233 0.543549
+v 0.288656 0.978364 0.533814
+v 0.399248 0.880427 0.489314
+v 0.403950 0.897038 0.479354
+v 0.408221 0.913491 0.468940
+v 0.488977 0.797740 0.406627
+v 0.494736 0.813377 0.395693
+v 0.499966 0.828945 0.384395
+v 0.545383 0.701449 0.310336
+v 0.551807 0.715952 0.298268
+v 0.557640 0.730490 0.285940
+v 0.564622 0.598116 0.207003
+v 0.571272 0.611401 0.193718
+v 0.577311 0.624835 0.180285
+v 0.545383 0.494783 0.103670
+v 0.551807 0.506851 0.089168
+v 0.557640 0.519179 0.074629
+v 0.488977 0.398493 0.007379
+v 0.494736 0.409426 -0.008257
+v 0.499966 0.420724 -0.023826
+v 0.399248 0.315806 -0.075308
+v 0.403950 0.325765 -0.091918
+v 0.408221 0.336179 -0.108371
+v 0.282311 0.252358 -0.138756
+v 0.285636 0.261570 -0.156113
+v 0.288656 0.271305 -0.173245
+v 0.146135 0.212473 -0.178641
+v 0.147856 0.221215 -0.196468
+v 0.149419 0.230524 -0.214026
+v -0.000000 0.198869 -0.192245
+v -0.000000 0.207451 -0.210232
+v -0.000000 0.216614 -0.227936
+v -0.146135 0.212473 -0.178641
+v -0.147856 0.221215 -0.196468
+v -0.149419 0.230524 -0.214026
+v -0.282311 0.252358 -0.138756
+v -0.285636 0.261570 -0.156113
+v -0.288656 0.271305 -0.173245
+v -0.399248 0.315805 -0.075308
+v -0.403951 0.325765 -0.091918
+v -0.408221 0.336179 -0.108371
+v -0.488977 0.398492 0.007379
+v -0.494736 0.409426 -0.008257
+v -0.499967 0.420724 -0.023826
+v -0.545383 0.494783 0.103670
+v -0.551807 0.506851 0.089168
+v -0.557640 0.519179 0.074629
+v -0.564622 0.598116 0.207003
+v -0.571272 0.611401 0.193718
+v -0.577312 0.624835 0.180285
+v -0.574949 0.788697 0.234292
+v -0.571535 0.774169 0.247527
+v -0.567509 0.759614 0.260556
+v -0.508815 0.859812 0.360753
+v -0.512424 0.875077 0.348435
+v -0.515485 0.890208 0.335803
+v -0.415446 0.945853 0.446795
+v -0.418393 0.961729 0.435087
+v -0.420892 0.977378 0.422972
+v -0.293764 1.011876 0.512817
+v -0.295848 1.028219 0.501577
+v -0.297615 1.044266 0.489860
+v -0.152064 1.053379 0.554320
+v -0.153142 1.070017 0.543375
+v -0.154057 1.086313 0.531907
+v 0.000000 1.067535 0.568476
+v 0.000000 1.084273 0.557631
+v 0.000000 1.100654 0.546248
+v 0.152064 1.053379 0.554320
+v 0.153142 1.070017 0.543375
+v 0.154057 1.086313 0.531907
+v 0.293765 1.011876 0.512817
+v 0.295848 1.028219 0.501577
+v 0.297615 1.044266 0.489860
+v 0.415446 0.945854 0.446795
+v 0.418393 0.961729 0.435087
+v 0.420892 0.977378 0.422972
+v 0.508815 0.859812 0.360753
+v 0.512424 0.875077 0.348435
+v 0.515485 0.890208 0.335803
+v 0.567510 0.759614 0.260556
+v 0.571535 0.774169 0.247527
+v 0.574949 0.788697 0.234292
+v 0.587529 0.652089 0.153030
+v 0.591697 0.665881 0.139239
+v 0.595231 0.679762 0.125357
+v 0.567510 0.544564 0.045505
+v 0.571535 0.557593 0.030951
+v 0.574949 0.570828 0.016422
+v 0.508815 0.444366 -0.054693
+v 0.512424 0.456684 -0.069958
+v 0.515485 0.469317 -0.085089
+v 0.415446 0.358324 -0.140734
+v 0.418393 0.370032 -0.156610
+v 0.420892 0.382147 -0.172259
+v 0.293765 0.292302 -0.206756
+v 0.295848 0.303542 -0.223100
+v 0.297615 0.315259 -0.239146
+v 0.152064 0.250799 -0.248259
+v 0.153142 0.261744 -0.264898
+v 0.154057 0.273212 -0.281193
+v -0.000000 0.236643 -0.262415
+v -0.000000 0.247488 -0.279154
+v -0.000000 0.258871 -0.295535
+v -0.152064 0.250799 -0.248259
+v -0.153142 0.261744 -0.264898
+v -0.154057 0.273212 -0.281193
+v -0.293765 0.292302 -0.206756
+v -0.295848 0.303542 -0.223100
+v -0.297616 0.315259 -0.239146
+v -0.415446 0.358324 -0.140734
+v -0.418393 0.370032 -0.156610
+v -0.420892 0.382147 -0.172259
+v -0.508815 0.444366 -0.054692
+v -0.512424 0.456684 -0.069958
+v -0.515485 0.469317 -0.085089
+v -0.567510 0.544564 0.045505
+v -0.571535 0.557593 0.030951
+v -0.574949 0.570828 0.016422
+v -0.587529 0.652089 0.153030
+v -0.591697 0.665881 0.139239
+v -0.595231 0.679762 0.125357
+v -0.582420 0.846243 0.179578
+v -0.581484 0.831972 0.193493
+v -0.579926 0.817615 0.207260
+v -0.519948 0.920004 0.309650
+v -0.521344 0.934637 0.296158
+v -0.522184 0.949073 0.282408
+v -0.424535 1.007929 0.397574
+v -0.425676 1.022798 0.384318
+v -0.426361 1.037375 0.370710
+v -0.300192 1.075395 0.465041
+v -0.300998 1.090446 0.451966
+v -0.301483 1.105132 0.438467
+v -0.155391 1.117807 0.507452
+v -0.155808 1.132971 0.494491
+v -0.156059 1.147726 0.481060
+v 0.000000 1.132272 0.521918
+v 0.000000 1.147475 0.508996
+v 0.000000 1.162253 0.495588
+v 0.155391 1.117807 0.507452
+v 0.155808 1.132971 0.494491
+v 0.156059 1.147725 0.481060
+v 0.300192 1.075395 0.465041
+v 0.300998 1.090446 0.451966
+v 0.301483 1.105132 0.438467
+v 0.424536 1.007929 0.397574
+v 0.425676 1.022798 0.384318
+v 0.426361 1.037375 0.370710
+v 0.519948 0.920005 0.309650
+v 0.521345 0.934637 0.296158
+v 0.522184 0.949073 0.282408
+v 0.579926 0.817615 0.207260
+v 0.581484 0.831972 0.193493
+v 0.582420 0.846243 0.179578
+v 0.600384 0.707737 0.097382
+v 0.601997 0.721799 0.083320
+v 0.602966 0.735892 0.069227
+v 0.579926 0.597859 -0.012495
+v 0.581484 0.611626 -0.026853
+v 0.582420 0.625542 -0.041123
+v 0.519948 0.495469 -0.114885
+v 0.521345 0.508961 -0.129518
+v 0.522184 0.522712 -0.143953
+v 0.424536 0.407545 -0.202809
+v 0.425676 0.420801 -0.217679
+v 0.426361 0.434409 -0.232256
+v 0.300192 0.340078 -0.270276
+v 0.300998 0.353153 -0.285326
+v 0.301483 0.366652 -0.300013
+v 0.155391 0.297667 -0.312687
+v 0.155808 0.310628 -0.327852
+v 0.156059 0.324059 -0.342606
+v -0.000000 0.283201 -0.327153
+v -0.000000 0.296123 -0.342356
+v -0.000000 0.309531 -0.357134
+v -0.155391 0.297667 -0.312687
+v -0.155808 0.310628 -0.327852
+v -0.156059 0.324059 -0.342606
+v -0.300192 0.340078 -0.270276
+v -0.300999 0.353153 -0.285326
+v -0.301483 0.366652 -0.300012
+v -0.424536 0.407545 -0.202809
+v -0.425676 0.420801 -0.217678
+v -0.426361 0.434409 -0.232256
+v -0.519948 0.495469 -0.114885
+v -0.521345 0.508961 -0.129518
+v -0.522184 0.522711 -0.143953
+v -0.579926 0.597859 -0.012495
+v -0.581485 0.611626 -0.026853
+v -0.582420 0.625542 -0.041123
+v -0.600384 0.707737 0.097383
+v -0.601997 0.721799 0.083320
+v -0.602966 0.735892 0.069227
+v -0.579926 0.902141 0.122734
+v -0.581484 0.888374 0.137092
+v -0.582420 0.874458 0.151362
+v -0.522184 0.977289 0.254192
+v -0.521344 0.991039 0.239757
+v -0.519948 1.004531 0.225124
+v -0.426361 1.065591 0.342494
+v -0.425676 1.079199 0.327917
+v -0.424535 1.092455 0.313048
+v -0.301483 1.133348 0.410251
+v -0.300998 1.146847 0.395565
+v -0.300192 1.159922 0.380515
+v -0.156059 1.175941 0.452845
+v -0.155808 1.189372 0.438090
+v -0.155391 1.202333 0.422926
+v -0.000000 1.190469 0.467373
+v -0.000000 1.203877 0.452595
+v -0.000000 1.216799 0.437391
+v 0.156059 1.175941 0.452845
+v 0.155808 1.189372 0.438090
+v 0.155391 1.202333 0.422926
+v 0.301483 1.133348 0.410251
+v 0.300998 1.146847 0.395565
+v 0.300192 1.159922 0.380515
+v 0.426361 1.065591 0.342494
+v 0.425676 1.079199 0.327917
+v 0.424536 1.092455 0.313048
+v 0.522184 0.977289 0.254192
+v 0.521345 0.991039 0.239757
+v 0.519948 1.004531 0.225124
+v 0.582420 0.874458 0.151362
+v 0.581484 0.888374 0.137092
+v 0.579926 0.902141 0.122734
+v 0.602966 0.764108 0.041011
+v 0.601997 0.778201 0.026919
+v 0.600384 0.792263 0.012856
+v 0.582420 0.653757 -0.069339
+v 0.581484 0.668028 -0.083254
+v 0.579926 0.682385 -0.097022
+v 0.522184 0.550927 -0.172169
+v 0.521345 0.565363 -0.185919
+v 0.519948 0.579995 -0.199412
+v 0.426361 0.462625 -0.260471
+v 0.425676 0.477202 -0.274080
+v 0.424536 0.492071 -0.287336
+v 0.301483 0.394868 -0.328228
+v 0.300998 0.409554 -0.341728
+v 0.300192 0.424605 -0.354802
+v 0.156059 0.352274 -0.370822
+v 0.155808 0.367029 -0.384253
+v 0.155391 0.382193 -0.397214
+v -0.000000 0.337746 -0.385350
+v -0.000000 0.352524 -0.398757
+v -0.000000 0.367728 -0.411679
+v -0.156059 0.352274 -0.370822
+v -0.155808 0.367029 -0.384253
+v -0.155391 0.382193 -0.397214
+v -0.301483 0.394868 -0.328228
+v -0.300999 0.409554 -0.341728
+v -0.300192 0.424605 -0.354802
+v -0.426361 0.462625 -0.260471
+v -0.425676 0.477202 -0.274080
+v -0.424536 0.492071 -0.287336
+v -0.522184 0.550927 -0.172169
+v -0.521345 0.565363 -0.185919
+v -0.519948 0.579995 -0.199412
+v -0.582420 0.653757 -0.069339
+v -0.581485 0.668028 -0.083254
+v -0.579926 0.682385 -0.097022
+v -0.602966 0.764108 0.041012
+v -0.601997 0.778201 0.026919
+v -0.600384 0.792263 0.012856
+v -0.567509 0.955436 0.064734
+v -0.571535 0.942407 0.079288
+v -0.574949 0.929172 0.093817
+v -0.515485 1.030683 0.195328
+v -0.512424 1.043316 0.180196
+v -0.508815 1.055634 0.164931
+v -0.420892 1.117853 0.282497
+v -0.418393 1.129967 0.266848
+v -0.415446 1.141676 0.250973
+v -0.297615 1.184740 0.349385
+v -0.295848 1.196458 0.333339
+v -0.293765 1.207698 0.316995
+v -0.154057 1.226788 0.391432
+v -0.153142 1.238256 0.375136
+v -0.152064 1.249201 0.358498
+v -0.000000 1.241129 0.405773
+v -0.000000 1.252512 0.389392
+v -0.000000 1.263357 0.372654
+v 0.154057 1.226788 0.391432
+v 0.153142 1.238256 0.375136
+v 0.152064 1.249201 0.358498
+v 0.297615 1.184741 0.349385
+v 0.295848 1.196458 0.333339
+v 0.293765 1.207698 0.316995
+v 0.420892 1.117853 0.282497
+v 0.418393 1.129968 0.266848
+v 0.415446 1.141676 0.250973
+v 0.515485 1.030683 0.195328
+v 0.512424 1.043316 0.180196
+v 0.508815 1.055634 0.164931
+v 0.574949 0.929172 0.093817
+v 0.571535 0.942407 0.079288
+v 0.567510 0.955436 0.064733
+v 0.595231 0.820237 -0.015118
+v 0.591697 0.834119 -0.029000
+v 0.587529 0.847911 -0.042792
+v 0.574949 0.711303 -0.124053
+v 0.571535 0.725831 -0.137288
+v 0.567510 0.740386 -0.150317
+v 0.515485 0.609792 -0.225564
+v 0.512424 0.624923 -0.238196
+v 0.508815 0.640188 -0.250515
+v 0.420892 0.522622 -0.312734
+v 0.418393 0.538271 -0.324848
+v 0.415446 0.554146 -0.336556
+v 0.297615 0.455734 -0.379621
+v 0.295848 0.471781 -0.391339
+v 0.293765 0.488124 -0.402578
+v 0.154057 0.413687 -0.421668
+v 0.153142 0.429983 -0.433136
+v 0.152064 0.446621 -0.444082
+v -0.000000 0.399346 -0.436010
+v -0.000000 0.415726 -0.447393
+v -0.000000 0.432465 -0.458238
+v -0.154057 0.413687 -0.421668
+v -0.153142 0.429983 -0.433136
+v -0.152064 0.446621 -0.444081
+v -0.297616 0.455734 -0.379621
+v -0.295848 0.471780 -0.391339
+v -0.293765 0.488124 -0.402578
+v -0.420892 0.522622 -0.312734
+v -0.418393 0.538271 -0.324848
+v -0.415446 0.554146 -0.336556
+v -0.515485 0.609792 -0.225564
+v -0.512424 0.624923 -0.238196
+v -0.508815 0.640188 -0.250515
+v -0.574949 0.711303 -0.124053
+v -0.571535 0.725831 -0.137288
+v -0.567510 0.740386 -0.150317
+v -0.595231 0.820237 -0.015118
+v -0.591697 0.834119 -0.029000
+v -0.587529 0.847911 -0.042792
+v -0.545579 1.004959 0.006901
+v -0.551856 0.993084 0.021154
+v -0.557640 0.980821 0.035609
+v -0.499966 1.079276 0.134064
+v -0.494780 1.090518 0.118588
+v -0.489153 1.101284 0.103227
+v -0.408221 1.163821 0.218610
+v -0.403986 1.174186 0.202256
+v -0.399392 1.184001 0.185943
+v -0.288656 1.228695 0.283484
+v -0.285661 1.238387 0.266457
+v -0.282413 1.247472 0.249414
+v -0.149419 1.269476 0.324265
+v -0.147869 1.278746 0.306815
+v -0.146188 1.287371 0.289313
+v -0.000000 1.283386 0.338175
+v -0.000000 1.292511 0.320581
+v -0.000000 1.300980 0.302922
+v 0.149419 1.269476 0.324265
+v 0.147869 1.278746 0.306815
+v 0.146187 1.287371 0.289313
+v 0.288656 1.228695 0.283484
+v 0.285661 1.238387 0.266457
+v 0.282413 1.247472 0.249414
+v 0.408221 1.163821 0.218610
+v 0.403986 1.174186 0.202256
+v 0.399392 1.184001 0.185943
+v 0.499966 1.079276 0.134064
+v 0.494780 1.090518 0.118588
+v 0.489153 1.101284 0.103227
+v 0.557640 0.980821 0.035609
+v 0.551856 0.993084 0.021154
+v 0.545579 1.004959 0.006901
+v 0.577311 0.875165 -0.070046
+v 0.571323 0.888525 -0.083406
+v 0.564825 0.901588 -0.096469
+v 0.557640 0.769510 -0.175701
+v 0.551856 0.783965 -0.187965
+v 0.545579 0.798218 -0.199839
+v 0.499966 0.671055 -0.274156
+v 0.494780 0.686532 -0.285399
+v 0.489153 0.701893 -0.296165
+v 0.408221 0.586509 -0.358702
+v 0.403986 0.602863 -0.369067
+v 0.399392 0.619176 -0.378882
+v 0.288656 0.521636 -0.423576
+v 0.285661 0.538662 -0.433268
+v 0.282413 0.555705 -0.442353
+v 0.149419 0.480854 -0.464357
+v 0.147869 0.498304 -0.473626
+v 0.146187 0.515806 -0.482252
+v -0.000000 0.466944 -0.478267
+v -0.000000 0.484538 -0.487392
+v -0.000000 0.502197 -0.495861
+v -0.149419 0.480854 -0.464357
+v -0.147869 0.498304 -0.473626
+v -0.146188 0.515806 -0.482252
+v -0.288656 0.521636 -0.423576
+v -0.285662 0.538662 -0.433268
+v -0.282413 0.555705 -0.442353
+v -0.408221 0.586509 -0.358702
+v -0.403987 0.602863 -0.369067
+v -0.399392 0.619176 -0.378882
+v -0.499967 0.671055 -0.274156
+v -0.494780 0.686532 -0.285399
+v -0.489153 0.701892 -0.296165
+v -0.557640 0.769510 -0.175701
+v -0.551856 0.783965 -0.187965
+v -0.545579 0.798218 -0.199839
+v -0.577312 0.875165 -0.070046
+v -0.571323 0.888525 -0.083405
+v -0.564825 0.901588 -0.096469
+v -0.518528 1.045371 -0.043762
+v -0.524820 1.037061 -0.033068
+v -0.531773 1.027230 -0.020602
+v -0.476775 1.121119 0.073286
+v -0.470541 1.129722 0.059592
+v -0.464900 1.136921 0.047787
+v -0.389285 1.201742 0.153909
+v -0.384195 1.209291 0.139162
+v -0.379589 1.215536 0.126403
+v -0.275266 1.263607 0.215774
+v -0.271667 1.270347 0.200217
+v -0.268410 1.275860 0.186727
+v -0.142488 1.302496 0.254663
+v -0.140625 1.308728 0.238598
+v -0.138939 1.313781 0.224648
+v -0.000000 1.315761 0.267928
+v -0.000000 1.321819 0.251689
+v -0.000000 1.326715 0.237582
+v 0.142488 1.302496 0.254663
+v 0.140625 1.308728 0.238598
+v 0.138939 1.313781 0.224648
+v 0.275266 1.263607 0.215774
+v 0.271667 1.270347 0.200217
+v 0.268410 1.275860 0.186727
+v 0.389285 1.201742 0.153909
+v 0.384195 1.209291 0.139162
+v 0.379589 1.215536 0.126403
+v 0.476775 1.121119 0.073286
+v 0.470541 1.129722 0.059592
+v 0.464900 1.136921 0.047787
+v 0.531773 1.027231 -0.020603
+v 0.524820 1.037062 -0.033068
+v 0.518528 1.045371 -0.043762
+v 0.550532 0.926476 -0.121357
+v 0.543334 0.937625 -0.132505
+v 0.536820 0.947126 -0.142007
+v 0.531773 0.825722 -0.222111
+v 0.524820 0.838188 -0.231942
+v 0.518528 0.848882 -0.240252
+v 0.476775 0.731834 -0.315999
+v 0.470541 0.745527 -0.324603
+v 0.464900 0.757332 -0.331802
+v 0.389285 0.651210 -0.396623
+v 0.384195 0.665958 -0.404172
+v 0.379589 0.678716 -0.410417
+v 0.275266 0.589345 -0.458487
+v 0.271667 0.604902 -0.465228
+v 0.268410 0.618393 -0.470741
+v 0.142488 0.550456 -0.497377
+v 0.140625 0.566521 -0.503609
+v 0.138939 0.580471 -0.508662
+v -0.000000 0.537191 -0.510642
+v -0.000000 0.553429 -0.516700
+v -0.000000 0.567537 -0.521596
+v -0.142488 0.550456 -0.497377
+v -0.140625 0.566521 -0.503609
+v -0.138939 0.580471 -0.508662
+v -0.275266 0.589345 -0.458487
+v -0.271667 0.604902 -0.465228
+v -0.268410 0.618392 -0.470741
+v -0.389285 0.651210 -0.396623
+v -0.384195 0.665958 -0.404172
+v -0.379589 0.678716 -0.410417
+v -0.476775 0.731834 -0.315999
+v -0.470541 0.745527 -0.324603
+v -0.464900 0.757332 -0.331802
+v -0.531773 0.825722 -0.222111
+v -0.524820 0.838187 -0.231942
+v -0.518529 0.848881 -0.240252
+v -0.550532 0.926476 -0.121357
+v -0.543334 0.937625 -0.132505
+v -0.536820 0.947126 -0.142007
+v -0.494472 1.060770 -0.068277
+v -0.495623 1.061873 -0.068944
+v -0.497308 1.062978 -0.069410
+v -0.445874 1.150782 0.018393
+v -0.444363 1.149379 0.018561
+v -0.443331 1.148072 0.019025
+v -0.361979 1.223041 0.093993
+v -0.362821 1.224522 0.093704
+v -0.364055 1.226180 0.093791
+v -0.255957 1.280566 0.151519
+v -0.256553 1.282181 0.151363
+v -0.257426 1.284035 0.151646
+v -0.132493 1.316728 0.187680
+v -0.132802 1.318427 0.187609
+v -0.133253 1.320404 0.188015
+v -0.000000 1.329062 0.200014
+v -0.000000 1.330790 0.199972
+v -0.000000 1.332809 0.200420
+v 0.132493 1.316728 0.187680
+v 0.132802 1.318427 0.187609
+v 0.133253 1.320404 0.188015
+v 0.255957 1.280566 0.151519
+v 0.256553 1.282181 0.151363
+v 0.257426 1.284035 0.151646
+v 0.361979 1.223041 0.093993
+v 0.362821 1.224522 0.093704
+v 0.364055 1.226180 0.093791
+v 0.443331 1.148072 0.019025
+v 0.444363 1.149379 0.018561
+v 0.445874 1.150782 0.018393
+v 0.494472 1.060770 -0.068277
+v 0.495623 1.061873 -0.068944
+v 0.497308 1.062979 -0.069411
+v 0.511915 0.967083 -0.161964
+v 0.513106 0.967968 -0.162849
+v 0.514851 0.968754 -0.163635
+v 0.494472 0.873396 -0.255651
+v 0.495623 0.874063 -0.256754
+v 0.497308 0.874530 -0.257859
+v 0.443331 0.786094 -0.342953
+v 0.444363 0.786558 -0.344260
+v 0.445874 0.786727 -0.345662
+v 0.361979 0.711126 -0.417921
+v 0.362821 0.711415 -0.419402
+v 0.364055 0.711328 -0.421061
+v 0.255957 0.653600 -0.475447
+v 0.256553 0.653756 -0.477061
+v 0.257426 0.653473 -0.478916
+v 0.132493 0.617439 -0.511608
+v 0.132802 0.617510 -0.513307
+v 0.133253 0.617104 -0.515285
+v -0.000000 0.605105 -0.523942
+v -0.000000 0.605147 -0.525670
+v -0.000000 0.604699 -0.527690
+v -0.132493 0.617439 -0.511608
+v -0.132802 0.617510 -0.513307
+v -0.133253 0.617104 -0.515285
+v -0.255958 0.653600 -0.475447
+v -0.256553 0.653756 -0.477061
+v -0.257426 0.653473 -0.478916
+v -0.361979 0.711126 -0.417921
+v -0.362821 0.711415 -0.419402
+v -0.364055 0.711328 -0.421061
+v -0.443332 0.786094 -0.342953
+v -0.444363 0.786558 -0.344260
+v -0.445875 0.786726 -0.345662
+v -0.494472 0.873396 -0.255651
+v -0.495623 0.874063 -0.256754
+v -0.497309 0.874530 -0.257859
+v -0.511915 0.967083 -0.161964
+v -0.513107 0.967968 -0.162849
+v -0.514852 0.968754 -0.163635
+v -0.425315 1.125336 -0.159049
+v -0.438059 1.117364 -0.146248
+v -0.450211 1.109113 -0.133392
+v -0.403648 1.188601 -0.053904
+v -0.392753 1.194707 -0.068906
+v -0.381327 1.200428 -0.083957
+v -0.329577 1.256858 0.014354
+v -0.320682 1.261122 -0.002490
+v -0.311352 1.264911 -0.019473
+v -0.233046 1.309234 0.066730
+v -0.226756 1.312084 0.048472
+v -0.220159 1.314391 0.030006
+v -0.120634 1.342159 0.099655
+v -0.117378 1.344121 0.080508
+v -0.113963 1.345496 0.061110
+v -0.000000 1.353390 0.110885
+v -0.000000 1.355047 0.091435
+v -0.000000 1.356105 0.071720
+v 0.120634 1.342160 0.099655
+v 0.117378 1.344121 0.080508
+v 0.113963 1.345496 0.061110
+v 0.233046 1.309234 0.066730
+v 0.226756 1.312084 0.048472
+v 0.220159 1.314391 0.030006
+v 0.329577 1.256858 0.014354
+v 0.320682 1.261122 -0.002490
+v 0.311352 1.264912 -0.019473
+v 0.403648 1.188601 -0.053904
+v 0.392753 1.194707 -0.068906
+v 0.381327 1.200428 -0.083957
+v 0.450211 1.109113 -0.133392
+v 0.438059 1.117364 -0.146248
+v 0.425315 1.125336 -0.159049
+v 0.466093 1.023812 -0.218693
+v 0.453512 1.034366 -0.229246
+v 0.440319 1.044752 -0.239633
+v 0.450211 0.938511 -0.303994
+v 0.438059 0.951367 -0.312245
+v 0.425315 0.964168 -0.320217
+v 0.403648 0.859023 -0.383481
+v 0.392753 0.874025 -0.389587
+v 0.381327 0.889076 -0.395309
+v 0.329577 0.790765 -0.451739
+v 0.320682 0.807609 -0.456003
+v 0.311352 0.824593 -0.459792
+v 0.233046 0.738389 -0.504115
+v 0.226756 0.756647 -0.506965
+v 0.220159 0.775113 -0.509272
+v 0.120634 0.705465 -0.537040
+v 0.117378 0.724611 -0.539001
+v 0.113963 0.744009 -0.540376
+v -0.000000 0.694234 -0.548270
+v -0.000000 0.713684 -0.549928
+v -0.000000 0.733400 -0.550985
+v -0.120634 0.705464 -0.537040
+v -0.117378 0.724611 -0.539001
+v -0.113963 0.744009 -0.540376
+v -0.233047 0.738389 -0.504115
+v -0.226756 0.756647 -0.506965
+v -0.220160 0.775113 -0.509272
+v -0.329578 0.790765 -0.451739
+v -0.320682 0.807609 -0.456003
+v -0.311353 0.824593 -0.459792
+v -0.403648 0.859023 -0.383481
+v -0.392754 0.874025 -0.389587
+v -0.381328 0.889076 -0.395309
+v -0.450211 0.938511 -0.303994
+v -0.438060 0.951367 -0.312245
+v -0.425315 0.964168 -0.320217
+v -0.466093 1.023812 -0.218693
+v -0.453513 1.034366 -0.229246
+v -0.440319 1.044752 -0.239633
+v -0.373076 1.151543 -0.205051
+v -0.385071 1.146525 -0.195488
+v -0.398351 1.140179 -0.184109
+v -0.357152 1.210510 -0.113778
+v -0.345245 1.214512 -0.127501
+v -0.334491 1.217412 -0.139182
+v -0.291613 1.270905 -0.053383
+v -0.281891 1.272893 -0.069120
+v -0.273111 1.273975 -0.082619
+v -0.206202 1.317248 -0.007040
+v -0.199327 1.317691 -0.024322
+v -0.193118 1.317378 -0.039217
+v -0.106738 1.346381 0.022093
+v -0.103179 1.345852 0.003839
+v -0.099965 1.344661 -0.011933
+v -0.000000 1.356317 0.032029
+v -0.000000 1.355458 0.013444
+v -0.000000 1.353967 -0.002627
+v 0.106738 1.346381 0.022093
+v 0.103179 1.345852 0.003839
+v 0.099965 1.344661 -0.011933
+v 0.206202 1.317248 -0.007040
+v 0.199327 1.317691 -0.024322
+v 0.193118 1.317378 -0.039217
+v 0.291613 1.270905 -0.053383
+v 0.281891 1.272894 -0.069120
+v 0.273111 1.273975 -0.082619
+v 0.357152 1.210510 -0.113778
+v 0.345245 1.214512 -0.127501
+v 0.334491 1.217412 -0.139182
+v 0.398351 1.140179 -0.184109
+v 0.385071 1.146525 -0.195488
+v 0.373076 1.151543 -0.205051
+v 0.412404 1.064703 -0.259584
+v 0.398654 1.073566 -0.268447
+v 0.386237 1.080857 -0.275738
+v 0.398351 0.989228 -0.335059
+v 0.385071 1.000607 -0.341406
+v 0.373076 1.010171 -0.346424
+v 0.357152 0.918897 -0.405391
+v 0.345245 0.932621 -0.409393
+v 0.334491 0.944301 -0.412293
+v 0.291613 0.858502 -0.465786
+v 0.281891 0.874239 -0.467774
+v 0.273111 0.887738 -0.468856
+v 0.206202 0.812159 -0.512129
+v 0.199327 0.829441 -0.512572
+v 0.193118 0.844336 -0.512258
+v 0.106738 0.783027 -0.541261
+v 0.103179 0.801280 -0.540733
+v 0.099965 0.817052 -0.539542
+v -0.000000 0.773090 -0.551198
+v -0.000000 0.791675 -0.550338
+v -0.000000 0.807746 -0.548848
+v -0.106738 0.783027 -0.541261
+v -0.103179 0.801280 -0.540733
+v -0.099966 0.817052 -0.539542
+v -0.206202 0.812159 -0.512129
+v -0.199327 0.829441 -0.512572
+v -0.193118 0.844336 -0.512258
+v -0.291614 0.858502 -0.465786
+v -0.281891 0.874239 -0.467774
+v -0.273111 0.887738 -0.468856
+v -0.357152 0.918897 -0.405391
+v -0.345245 0.932621 -0.409393
+v -0.334491 0.944301 -0.412293
+v -0.398351 0.989228 -0.335059
+v -0.385071 1.000607 -0.341406
+v -0.373076 1.010171 -0.346424
+v -0.412404 1.064703 -0.259584
+v -0.398655 1.073566 -0.268447
+v -0.386237 1.080857 -0.275738
+v -0.345253 1.149910 -0.213962
+v -0.350953 1.154226 -0.216118
+v -0.356402 1.155758 -0.215585
+v -0.319541 1.218683 -0.152659
+v -0.314656 1.216190 -0.154155
+v -0.309545 1.210867 -0.153005
+v -0.270552 1.137152 -0.143072
+v -0.278697 1.124419 -0.155806
+v -0.285653 1.111336 -0.168888
+v -0.260904 1.272718 -0.098625
+v -0.256915 1.269398 -0.100946
+v -0.252743 1.263211 -0.100660
+v -0.226801 1.183519 -0.096705
+v -0.239323 1.172712 -0.107512
+v -0.250823 1.161350 -0.118874
+v -0.184487 1.314180 -0.057162
+v -0.181667 1.310227 -0.060117
+v -0.178716 1.303377 -0.060495
+v -0.167594 1.220287 -0.059937
+v -0.183639 1.212144 -0.068080
+v -0.198900 1.203277 -0.076947
+v -0.095498 1.340245 -0.031098
+v -0.094038 1.335893 -0.034451
+v -0.092510 1.328626 -0.035246
+v -0.096966 1.244952 -0.035273
+v -0.115440 1.240026 -0.040198
+v -0.133422 1.234258 -0.045966
+v -0.000000 1.349135 -0.022207
+v -0.000000 1.344647 -0.025697
+v -0.000000 1.337238 -0.026634
+v -0.019729 1.255831 -0.024393
+v -0.039375 1.254459 -0.025765
+v -0.058852 1.252184 -0.028041
+v 0.095498 1.340245 -0.031098
+v 0.094038 1.335893 -0.034451
+v 0.092510 1.328626 -0.035246
+v 0.058852 1.252183 -0.028041
+v 0.039374 1.254459 -0.025765
+v 0.019729 1.255831 -0.024393
+v 0.184487 1.314180 -0.057162
+v 0.181667 1.310227 -0.060117
+v 0.178716 1.303377 -0.060495
+v 0.133422 1.234258 -0.045966
+v 0.115440 1.240026 -0.040198
+v 0.096966 1.244952 -0.035272
+v 0.260904 1.272718 -0.098624
+v 0.256915 1.269398 -0.100946
+v 0.252743 1.263211 -0.100660
+v 0.198900 1.203277 -0.076947
+v 0.183639 1.212144 -0.068080
+v 0.167594 1.220287 -0.059937
+v 0.319541 1.218683 -0.152660
+v 0.314656 1.216190 -0.154155
+v 0.309545 1.210867 -0.153005
+v 0.250823 1.161350 -0.118874
+v 0.239323 1.172712 -0.107512
+v 0.226801 1.183519 -0.096705
+v 0.356402 1.155758 -0.215585
+v 0.350953 1.154226 -0.216118
+v 0.345253 1.149910 -0.213962
+v 0.285653 1.111336 -0.168888
+v 0.278697 1.124419 -0.155806
+v 0.270552 1.137152 -0.143072
+v 0.368974 1.088231 -0.283112
+v 0.363333 1.087732 -0.282613
+v 0.357432 1.084496 -0.279376
+v 0.301016 1.056643 -0.223582
+v 0.299079 1.070554 -0.209670
+v 0.295866 1.084347 -0.195878
+v 0.356402 1.020704 -0.350639
+v 0.350953 1.021237 -0.349107
+v 0.345253 1.019081 -0.344791
+v 0.295866 1.000997 -0.279227
+v 0.299079 1.014789 -0.265435
+v 0.301016 1.028701 -0.251523
+v 0.319541 0.957779 -0.413564
+v 0.314656 0.959274 -0.411070
+v 0.309545 0.958124 -0.405748
+v 0.270552 0.948191 -0.332033
+v 0.278697 0.960925 -0.319299
+v 0.285653 0.974007 -0.306217
+v 0.260904 0.903744 -0.467599
+v 0.256915 0.906065 -0.464279
+v 0.252743 0.905779 -0.458092
+v 0.226801 0.901824 -0.378400
+v 0.239323 0.912631 -0.367593
+v 0.250823 0.923993 -0.356231
+v 0.184487 0.862281 -0.509061
+v 0.181667 0.865236 -0.505108
+v 0.178716 0.865614 -0.498258
+v 0.167594 0.865056 -0.415168
+v 0.183639 0.873199 -0.407025
+v 0.198900 0.882066 -0.398158
+v 0.095498 0.836217 -0.535126
+v 0.094038 0.839570 -0.530774
+v 0.092510 0.840365 -0.523507
+v 0.096966 0.840392 -0.439832
+v 0.115440 0.845317 -0.434907
+v 0.133422 0.851085 -0.429139
+v -0.000000 0.827327 -0.544016
+v -0.000000 0.830816 -0.539528
+v -0.000000 0.831753 -0.532119
+v 0.019729 0.829513 -0.450712
+v 0.039374 0.830884 -0.449340
+v 0.058852 0.833160 -0.447064
+v -0.095498 0.836217 -0.535126
+v -0.094038 0.839570 -0.530774
+v -0.092510 0.840365 -0.523507
+v -0.058852 0.833160 -0.447064
+v -0.039375 0.830884 -0.449340
+v -0.019729 0.829512 -0.450712
+v -0.184487 0.862281 -0.509061
+v -0.181667 0.865236 -0.505108
+v -0.178716 0.865614 -0.498258
+v -0.133422 0.851085 -0.429139
+v -0.115440 0.845317 -0.434907
+v -0.096966 0.840392 -0.439832
+v -0.260904 0.903744 -0.467599
+v -0.256916 0.906065 -0.464279
+v -0.252743 0.905779 -0.458092
+v -0.198900 0.882066 -0.398158
+v -0.183639 0.873200 -0.407025
+v -0.167594 0.865056 -0.415168
+v -0.319541 0.957779 -0.413564
+v -0.314656 0.959274 -0.411070
+v -0.309545 0.958124 -0.405748
+v -0.250823 0.923993 -0.356231
+v -0.239323 0.912631 -0.367593
+v -0.226801 0.901824 -0.378400
+v -0.356402 1.020704 -0.350638
+v -0.350953 1.021237 -0.349107
+v -0.345253 1.019081 -0.344791
+v -0.285653 0.974007 -0.306217
+v -0.278698 0.960925 -0.319299
+v -0.270552 0.948191 -0.332033
+v -0.368974 1.088231 -0.283112
+v -0.363333 1.087732 -0.282612
+v -0.357432 1.084496 -0.279376
+v -0.301016 1.028701 -0.251523
+v -0.299079 1.014789 -0.265435
+v -0.295866 1.000997 -0.279227
+v -0.295866 1.084347 -0.195878
+v -0.299079 1.070554 -0.209670
+v -0.301016 1.056643 -0.223582
+v -0.239063 0.900929 -0.433895
+v -0.229769 0.897673 -0.417539
+v -0.220715 0.894429 -0.401622
+v -0.156069 0.859333 -0.436718
+v -0.162471 0.861153 -0.454059
+v -0.169043 0.862937 -0.471887
+v -0.230492 0.892717 -0.459288
+v -0.212807 0.882456 -0.469548
+v -0.194214 0.873033 -0.478972
+v -0.080787 0.837271 -0.458780
+v -0.084101 0.838196 -0.477016
+v -0.087503 0.839055 -0.495770
+v -0.154614 0.856867 -0.495138
+v -0.133776 0.850192 -0.501813
+v -0.112367 0.844493 -0.507512
+v -0.000000 0.829747 -0.466305
+v -0.000000 0.830366 -0.484846
+v -0.000000 0.830909 -0.503915
+v -0.068199 0.836124 -0.515881
+v -0.045629 0.833491 -0.518514
+v -0.022863 0.831904 -0.520101
+v 0.080787 0.837271 -0.458780
+v 0.084101 0.838196 -0.477016
+v 0.087503 0.839055 -0.495770
+v 0.022863 0.831904 -0.520101
+v 0.045628 0.833491 -0.518514
+v 0.068199 0.836124 -0.515881
+v 0.156069 0.859333 -0.436718
+v 0.162471 0.861153 -0.454059
+v 0.169043 0.862937 -0.471887
+v 0.112367 0.844493 -0.507512
+v 0.133776 0.850192 -0.501813
+v 0.154614 0.856867 -0.495138
+v 0.220715 0.894429 -0.401622
+v 0.229769 0.897673 -0.417539
+v 0.239063 0.900928 -0.433895
+v 0.194213 0.873033 -0.478972
+v 0.212807 0.882456 -0.469548
+v 0.230492 0.892717 -0.459288
+v 0.270319 0.940166 -0.355885
+v 0.281408 0.945266 -0.369946
+v 0.292791 0.950440 -0.384384
+v 0.262825 0.915580 -0.436425
+v 0.277335 0.928085 -0.423920
+v 0.290662 0.941232 -0.410773
+v 0.301502 0.993428 -0.302623
+v 0.313870 1.000689 -0.314523
+v 0.326566 1.008098 -0.326727
+v 0.313525 0.969234 -0.382771
+v 0.322964 0.983968 -0.368037
+v 0.331024 0.999107 -0.352898
+v 0.312138 1.050585 -0.245466
+v 0.324942 1.060166 -0.255046
+v 0.338086 1.069972 -0.264852
+v 0.342859 1.030338 -0.321667
+v 0.346583 1.046298 -0.305707
+v 0.348827 1.062396 -0.289609
+v 0.301502 1.107743 -0.188309
+v 0.313870 1.119642 -0.195570
+v 0.326566 1.131846 -0.202978
+v 0.348827 1.094729 -0.257276
+v 0.346583 1.110826 -0.241179
+v 0.342859 1.126786 -0.225219
+v 0.270319 1.161005 -0.135047
+v 0.281408 1.175066 -0.140147
+v 0.292791 1.189503 -0.145321
+v 0.331024 1.158018 -0.193987
+v 0.322964 1.173156 -0.178849
+v 0.313525 1.187891 -0.164114
+v 0.220715 1.206742 -0.089309
+v 0.229769 1.222658 -0.092554
+v 0.239063 1.239015 -0.095809
+v 0.290662 1.215892 -0.136113
+v 0.277335 1.229039 -0.122966
+v 0.262825 1.241544 -0.110461
+v 0.156069 1.241837 -0.054214
+v 0.162471 1.259178 -0.056034
+v 0.169043 1.277006 -0.057818
+v 0.230492 1.264407 -0.087598
+v 0.212807 1.274667 -0.077337
+v 0.194213 1.284091 -0.067914
+v 0.080787 1.263899 -0.032152
+v 0.084101 1.282135 -0.033077
+v 0.087503 1.300889 -0.033935
+v 0.154614 1.300257 -0.051747
+v 0.133776 1.306932 -0.045073
+v 0.112367 1.312631 -0.039374
+v -0.000000 1.271424 -0.024627
+v -0.000000 1.289965 -0.025247
+v -0.000000 1.309035 -0.025790
+v 0.068199 1.321000 -0.031005
+v 0.045628 1.323633 -0.028372
+v 0.022863 1.325220 -0.026785
+v -0.080787 1.263899 -0.032152
+v -0.084101 1.282135 -0.033077
+v -0.087503 1.300889 -0.033935
+v -0.022863 1.325220 -0.026785
+v -0.045629 1.323633 -0.028372
+v -0.068199 1.321000 -0.031005
+v -0.156069 1.241837 -0.054214
+v -0.162471 1.259178 -0.056034
+v -0.169043 1.277006 -0.057818
+v -0.112367 1.312631 -0.039374
+v -0.133776 1.306932 -0.045073
+v -0.154614 1.300257 -0.051747
+v -0.220715 1.206742 -0.089310
+v -0.229769 1.222658 -0.092554
+v -0.239063 1.239015 -0.095810
+v -0.194214 1.284091 -0.067914
+v -0.212807 1.274668 -0.077337
+v -0.230492 1.264407 -0.087598
+v -0.270319 1.161005 -0.135047
+v -0.281408 1.175066 -0.140147
+v -0.292791 1.189503 -0.145321
+v -0.262825 1.241544 -0.110461
+v -0.277335 1.229039 -0.122966
+v -0.290662 1.215892 -0.136113
+v -0.301502 1.107743 -0.188309
+v -0.313870 1.119642 -0.195570
+v -0.326566 1.131846 -0.202978
+v -0.313525 1.187891 -0.164114
+v -0.322964 1.173156 -0.178849
+v -0.331024 1.158018 -0.193987
+v -0.312138 1.050585 -0.245466
+v -0.324942 1.060166 -0.255046
+v -0.338086 1.069972 -0.264852
+v -0.342859 1.126786 -0.225219
+v -0.346583 1.110826 -0.241179
+v -0.348827 1.094729 -0.257276
+v -0.301502 0.993428 -0.302623
+v -0.313870 1.000689 -0.314523
+v -0.326566 1.008098 -0.326726
+v -0.348827 1.062396 -0.289609
+v -0.346583 1.046298 -0.305707
+v -0.342859 1.030338 -0.321667
+v -0.270320 0.940166 -0.355885
+v -0.281408 0.945266 -0.369946
+v -0.292791 0.950440 -0.384384
+v -0.331024 0.999107 -0.352898
+v -0.322964 0.983968 -0.368037
+v -0.313525 0.969234 -0.382771
+v -0.290662 0.941232 -0.410773
+v -0.277335 0.928085 -0.423920
+v -0.262825 0.915580 -0.436425
+v -0.510013 1.055472 -0.057090
+v -0.507698 1.057412 -0.059906
+v -0.505863 1.058125 -0.061315
+v -0.523708 0.962279 -0.157160
+v -0.525608 0.961219 -0.156099
+v -0.528004 0.958841 -0.153722
+v -0.521311 1.027718 -0.075951
+v -0.526973 1.003451 -0.100218
+v -0.530386 0.978975 -0.124694
+v -0.505863 0.866434 -0.253005
+v -0.507698 0.865026 -0.252292
+v -0.510013 0.862209 -0.250353
+v -0.530386 0.929813 -0.173856
+v -0.526973 0.905337 -0.198332
+v -0.521311 0.881070 -0.222599
+v -0.453545 0.777121 -0.342319
+v -0.455190 0.775388 -0.341930
+v -0.457265 0.772163 -0.340399
+v -0.503317 0.833583 -0.270086
+v -0.491061 0.810566 -0.293103
+v -0.476710 0.788162 -0.315507
+v -0.370318 0.700425 -0.419014
+v -0.371661 0.698415 -0.418903
+v -0.373355 0.694839 -0.417724
+v -0.441947 0.745587 -0.358083
+v -0.421684 0.725596 -0.378073
+v -0.399621 0.706582 -0.397087
+v -0.261854 0.641575 -0.477864
+v -0.262804 0.639351 -0.477967
+v -0.264002 0.635506 -0.477057
+v -0.350459 0.671820 -0.431849
+v -0.323569 0.656219 -0.447450
+v -0.295299 0.641891 -0.461778
+v -0.135546 0.604580 -0.514859
+v -0.136037 0.602222 -0.515096
+v -0.136658 0.598207 -0.514355
+v -0.235088 0.617310 -0.486359
+v -0.203404 0.607162 -0.496507
+v -0.170852 0.598496 -0.505174
+v -0.000000 0.591962 -0.527478
+v -0.000000 0.589558 -0.527760
+v -0.000000 0.585486 -0.527077
+v -0.103696 0.585772 -0.517897
+v -0.069377 0.581768 -0.521901
+v -0.034763 0.579354 -0.524315
+v 0.135546 0.604580 -0.514859
+v 0.136037 0.602222 -0.515096
+v 0.136657 0.598207 -0.514355
+v 0.034763 0.579354 -0.524315
+v 0.069377 0.581768 -0.521901
+v 0.103696 0.585772 -0.517897
+v 0.261854 0.641575 -0.477865
+v 0.262804 0.639351 -0.477967
+v 0.264002 0.635506 -0.477057
+v 0.170852 0.598496 -0.505173
+v 0.203404 0.607162 -0.496507
+v 0.235088 0.617310 -0.486359
+v 0.370318 0.700425 -0.419014
+v 0.371661 0.698415 -0.418903
+v 0.373355 0.694839 -0.417724
+v 0.295298 0.641891 -0.461778
+v 0.323569 0.656219 -0.447450
+v 0.350459 0.671820 -0.431849
+v 0.453544 0.777121 -0.342319
+v 0.455190 0.775388 -0.341930
+v 0.457265 0.772163 -0.340399
+v 0.399621 0.706582 -0.397087
+v 0.421684 0.725596 -0.378073
+v 0.441947 0.745587 -0.358083
+v 0.505863 0.866434 -0.253005
+v 0.507698 0.865026 -0.252292
+v 0.510013 0.862209 -0.250353
+v 0.476709 0.788162 -0.315507
+v 0.491061 0.810566 -0.293103
+v 0.503316 0.833584 -0.270086
+v 0.523708 0.962279 -0.157160
+v 0.525608 0.961219 -0.156099
+v 0.528004 0.958841 -0.153722
+v 0.521311 0.881070 -0.222599
+v 0.526973 0.905337 -0.198332
+v 0.530386 0.929813 -0.173856
+v 0.505863 1.058125 -0.061315
+v 0.507698 1.057412 -0.059906
+v 0.510013 1.055472 -0.057090
+v 0.530386 0.978975 -0.124694
+v 0.526973 1.003451 -0.100218
+v 0.521311 1.027718 -0.075951
+v 0.453544 1.147438 0.027999
+v 0.455190 1.147049 0.029731
+v 0.457265 1.145519 0.032956
+v 0.503316 1.075205 -0.028464
+v 0.491061 1.098223 -0.005447
+v 0.476709 1.120626 0.016957
+v 0.370317 1.224133 0.104694
+v 0.371661 1.224023 0.106705
+v 0.373355 1.222843 0.110280
+v 0.441947 1.163202 0.059532
+v 0.421684 1.183192 0.079523
+v 0.399621 1.202206 0.098537
+v 0.261854 1.282984 0.163544
+v 0.262804 1.283086 0.165768
+v 0.264002 1.282176 0.169613
+v 0.350459 1.236969 0.133299
+v 0.323569 1.252570 0.148900
+v 0.295298 1.266898 0.163228
+v 0.135546 1.319978 0.200539
+v 0.136037 1.320215 0.202897
+v 0.136657 1.319474 0.206912
+v 0.235088 1.291479 0.187809
+v 0.203404 1.301627 0.197957
+v 0.170852 1.310293 0.206623
+v -0.000000 1.332597 0.213157
+v -0.000000 1.332879 0.215561
+v -0.000000 1.332196 0.219633
+v 0.103696 1.323017 0.219347
+v 0.069377 1.327021 0.223351
+v 0.034763 1.329434 0.225764
+v -0.135546 1.319979 0.200539
+v -0.136037 1.320215 0.202897
+v -0.136658 1.319474 0.206912
+v -0.034763 1.329434 0.225764
+v -0.069377 1.327021 0.223351
+v -0.103696 1.323017 0.219347
+v -0.261854 1.282984 0.163544
+v -0.262804 1.283086 0.165768
+v -0.264002 1.282176 0.169613
+v -0.170852 1.310293 0.206623
+v -0.203404 1.301627 0.197957
+v -0.235088 1.291479 0.187809
+v -0.370317 1.224133 0.104694
+v -0.371661 1.224022 0.106705
+v -0.373355 1.222843 0.110280
+v -0.295298 1.266898 0.163228
+v -0.323569 1.252570 0.148900
+v -0.350459 1.236969 0.133299
+v -0.453544 1.147438 0.027999
+v -0.455190 1.147049 0.029731
+v -0.457265 1.145519 0.032956
+v -0.399621 1.202206 0.098537
+v -0.421683 1.183192 0.079523
+v -0.441947 1.163202 0.059533
+v -0.476709 1.120626 0.016957
+v -0.491061 1.098223 -0.005447
+v -0.503316 1.075205 -0.028464
+v -0.439246 1.163151 0.000611
+v -0.432142 1.168943 -0.010981
+v -0.423575 1.175445 -0.024478
+v -0.358643 1.237428 0.074888
+v -0.352842 1.242019 0.062095
+v -0.345848 1.247072 0.047149
+v -0.426749 1.178730 0.029643
+v -0.407183 1.198033 0.048946
+v -0.385879 1.216393 0.067306
+v -0.253599 1.294423 0.131883
+v -0.249497 1.298092 0.118168
+v -0.244551 1.302034 0.102111
+v -0.338407 1.249960 0.100874
+v -0.312442 1.265025 0.115938
+v -0.285144 1.278860 0.129773
+v -0.131272 1.330252 0.167712
+v -0.129149 1.333341 0.153417
+v -0.126589 1.336584 0.136661
+v -0.227004 1.302595 0.153509
+v -0.196409 1.312395 0.163308
+v -0.164977 1.320763 0.171676
+v -0.000000 1.342472 0.179932
+v -0.000000 1.345364 0.165440
+v -0.000000 1.348369 0.148446
+v -0.100130 1.333049 0.183963
+v -0.066992 1.336915 0.187829
+v -0.033567 1.339246 0.190159
+v 0.131272 1.330252 0.167712
+v 0.129149 1.333341 0.153417
+v 0.126589 1.336584 0.136661
+v 0.033567 1.339246 0.190159
+v 0.066992 1.336915 0.187829
+v 0.100130 1.333049 0.183963
+v 0.253599 1.294423 0.131883
+v 0.249497 1.298092 0.118168
+v 0.244551 1.302034 0.102111
+v 0.164977 1.320763 0.171676
+v 0.196409 1.312395 0.163308
+v 0.227004 1.302596 0.153509
+v 0.358643 1.237428 0.074888
+v 0.352842 1.242019 0.062095
+v 0.345848 1.247072 0.047149
+v 0.285144 1.278860 0.129773
+v 0.312442 1.265025 0.115938
+v 0.338407 1.249960 0.100874
+v 0.439246 1.163151 0.000611
+v 0.432142 1.168943 -0.010981
+v 0.423575 1.175445 -0.024478
+v 0.385879 1.216393 0.067306
+v 0.407183 1.198033 0.048946
+v 0.426749 1.178730 0.029644
+v 0.489915 1.076653 -0.085887
+v 0.481991 1.083844 -0.096080
+v 0.472437 1.092033 -0.107890
+v 0.460316 1.137619 -0.011468
+v 0.474174 1.115985 -0.033101
+v 0.486008 1.093759 -0.055327
+v 0.507197 0.983830 -0.178710
+v 0.498994 0.992522 -0.187402
+v 0.489103 1.002521 -0.197402
+v 0.503384 1.047906 -0.101181
+v 0.508852 1.024473 -0.124613
+v 0.512147 1.000839 -0.148248
+v 0.489915 0.891006 -0.271534
+v 0.481991 0.901199 -0.278725
+v 0.472437 0.913009 -0.286914
+v 0.512147 0.953367 -0.195719
+v 0.508852 0.929733 -0.219354
+v 0.503384 0.906300 -0.242786
+v 0.439246 0.804508 -0.358032
+v 0.432142 0.816100 -0.363824
+v 0.423575 0.829597 -0.370326
+v 0.486009 0.860447 -0.288640
+v 0.474174 0.838220 -0.310866
+v 0.460316 0.816587 -0.332499
+v 0.358643 0.730231 -0.432309
+v 0.352842 0.743024 -0.436900
+v 0.345848 0.757970 -0.441953
+v 0.426749 0.775476 -0.373611
+v 0.407183 0.756173 -0.392914
+v 0.385879 0.737813 -0.411274
+v 0.253599 0.673236 -0.489304
+v 0.249497 0.686951 -0.492973
+v 0.244551 0.703008 -0.496915
+v 0.338407 0.704246 -0.444841
+v 0.312442 0.689181 -0.459905
+v 0.285144 0.675346 -0.473741
+v 0.131272 0.637407 -0.525133
+v 0.129149 0.651702 -0.528222
+v 0.126589 0.668458 -0.531465
+v 0.227004 0.651610 -0.497476
+v 0.196409 0.641811 -0.507276
+v 0.164977 0.633443 -0.515643
+v -0.000000 0.625187 -0.537353
+v -0.000000 0.639679 -0.540245
+v -0.000000 0.656673 -0.543250
+v 0.100130 0.621156 -0.527930
+v 0.066992 0.617290 -0.531796
+v 0.033567 0.614960 -0.534127
+v -0.131272 0.637407 -0.525133
+v -0.129149 0.651702 -0.528222
+v -0.126589 0.668458 -0.531465
+v -0.033567 0.614960 -0.534126
+v -0.066992 0.617290 -0.531796
+v -0.100130 0.621156 -0.527930
+v -0.253599 0.673236 -0.489304
+v -0.249497 0.686951 -0.492973
+v -0.244551 0.703008 -0.496915
+v -0.164977 0.633443 -0.515643
+v -0.196410 0.641811 -0.507275
+v -0.227004 0.651610 -0.497476
+v -0.358643 0.730231 -0.432309
+v -0.352842 0.743024 -0.436899
+v -0.345848 0.757970 -0.441953
+v -0.285144 0.675346 -0.473741
+v -0.312442 0.689181 -0.459905
+v -0.338407 0.704246 -0.444841
+v -0.439246 0.804508 -0.358032
+v -0.432142 0.816100 -0.363823
+v -0.423576 0.829597 -0.370326
+v -0.385879 0.737813 -0.411274
+v -0.407183 0.756173 -0.392914
+v -0.426749 0.775476 -0.373611
+v -0.489915 0.891006 -0.271534
+v -0.481992 0.901199 -0.278725
+v -0.472437 0.913009 -0.286914
+v -0.460317 0.816587 -0.332499
+v -0.474175 0.838220 -0.310866
+v -0.486009 0.860446 -0.288640
+v -0.507198 0.983830 -0.178710
+v -0.498994 0.992522 -0.187402
+v -0.489103 1.002521 -0.197402
+v -0.503384 0.906300 -0.242786
+v -0.508852 0.929733 -0.219354
+v -0.512148 0.953367 -0.195719
+v -0.472437 1.092033 -0.107890
+v -0.481991 1.083844 -0.096080
+v -0.489915 1.076653 -0.085887
+v -0.512148 1.000839 -0.148248
+v -0.508852 1.024473 -0.124613
+v -0.503384 1.047906 -0.101181
+v -0.486008 1.093759 -0.055327
+v -0.474174 1.115985 -0.033101
+v -0.460316 1.137619 -0.011468
+v 0.259432 0.645721 -0.476079
+v 0.257943 0.648367 -0.475078
+v 0.256668 0.650840 -0.474427
+v 0.362984 0.708525 -0.416742
+v 0.364787 0.706338 -0.417106
+v 0.366893 0.704027 -0.417773
+v 0.289821 0.656069 -0.464364
+v 0.317568 0.670131 -0.450301
+v 0.343958 0.685442 -0.434990
+v 0.444562 0.783701 -0.341566
+v 0.446771 0.781888 -0.341556
+v 0.449350 0.780013 -0.341787
+v 0.392208 0.719560 -0.400872
+v 0.413862 0.738222 -0.382211
+v 0.433749 0.757841 -0.362591
+v 0.495845 0.871246 -0.254021
+v 0.498308 0.869868 -0.253577
+v 0.501185 0.868501 -0.253299
+v 0.467867 0.799627 -0.320805
+v 0.481953 0.821615 -0.298817
+v 0.493981 0.844206 -0.276226
+v 0.513337 0.965193 -0.160074
+v 0.515887 0.964282 -0.159163
+v 0.518865 0.963460 -0.158340
+v 0.511642 0.890812 -0.229621
+v 0.517199 0.914629 -0.205804
+v 0.520549 0.938651 -0.181782
+v 0.495845 1.059140 -0.066127
+v 0.498308 1.058696 -0.064749
+v 0.501185 1.058419 -0.063382
+v 0.520549 0.986901 -0.133531
+v 0.517199 1.010923 -0.109509
+v 0.511642 1.034740 -0.085692
+v 0.444563 1.146685 0.021418
+v 0.446771 1.146675 0.023231
+v 0.449350 1.146906 0.025106
+v 0.493981 1.081346 -0.039086
+v 0.481953 1.103936 -0.016496
+v 0.467867 1.125925 0.005492
+v 0.362984 1.221861 0.096595
+v 0.364787 1.222225 0.098781
+v 0.366893 1.222892 0.101092
+v 0.433749 1.167710 0.047278
+v 0.413862 1.187330 0.066898
+v 0.392208 1.205991 0.085559
+v 0.256668 1.279546 0.154279
+v 0.257943 1.280197 0.156752
+v 0.259432 1.281198 0.159398
+v 0.343958 1.240109 0.119677
+v 0.317568 1.255420 0.134988
+v 0.289821 1.269483 0.149051
+v 0.132861 1.315808 0.190542
+v 0.133521 1.316639 0.193194
+v 0.134292 1.317851 0.196051
+v 0.230727 1.293608 0.173176
+v 0.199631 1.303568 0.183135
+v 0.167683 1.312073 0.191641
+v -0.000000 1.328177 0.202910
+v -0.000000 1.329069 0.205624
+v -0.000000 1.330352 0.208552
+v 0.101772 1.324561 0.204129
+v 0.068090 1.328491 0.208058
+v 0.034118 1.330859 0.210427
+v -0.132861 1.315808 0.190542
+v -0.133521 1.316639 0.193194
+v -0.134292 1.317851 0.196051
+v -0.034118 1.330859 0.210427
+v -0.068091 1.328491 0.208058
+v -0.101773 1.324561 0.204129
+v -0.256668 1.279546 0.154279
+v -0.257943 1.280197 0.156752
+v -0.259432 1.281198 0.159398
+v -0.167683 1.312073 0.191641
+v -0.199631 1.303568 0.183135
+v -0.230727 1.293608 0.173176
+v -0.362984 1.221861 0.096595
+v -0.364787 1.222225 0.098781
+v -0.366893 1.222892 0.101092
+v -0.289821 1.269483 0.149051
+v -0.317568 1.255420 0.134988
+v -0.343958 1.240109 0.119677
+v -0.444562 1.146685 0.021418
+v -0.446771 1.146675 0.023231
+v -0.449350 1.146906 0.025106
+v -0.392208 1.205991 0.085559
+v -0.413862 1.187330 0.066898
+v -0.433749 1.167710 0.047278
+v -0.495845 1.059140 -0.066126
+v -0.498308 1.058696 -0.064749
+v -0.501185 1.058419 -0.063382
+v -0.467867 1.125925 0.005492
+v -0.481953 1.103936 -0.016496
+v -0.493981 1.081346 -0.039086
+v -0.513337 0.965193 -0.160074
+v -0.515887 0.964282 -0.159163
+v -0.518865 0.963460 -0.158340
+v -0.511642 1.034740 -0.085692
+v -0.517199 1.010923 -0.109509
+v -0.520549 0.986901 -0.133531
+v -0.495845 0.871246 -0.254021
+v -0.498309 0.869868 -0.253576
+v -0.501185 0.868501 -0.253299
+v -0.520549 0.938651 -0.181781
+v -0.517199 0.914629 -0.205804
+v -0.511642 0.890812 -0.229620
+v -0.444563 0.783701 -0.341565
+v -0.446771 0.781888 -0.341556
+v -0.449350 0.780013 -0.341787
+v -0.493981 0.844206 -0.276226
+v -0.481953 0.821615 -0.298817
+v -0.467868 0.799627 -0.320805
+v -0.362984 0.708525 -0.416742
+v -0.364787 0.706338 -0.417106
+v -0.366893 0.704027 -0.417773
+v -0.433750 0.757841 -0.362591
+v -0.413862 0.738221 -0.382211
+v -0.392209 0.719560 -0.400872
+v -0.256668 0.650840 -0.474427
+v -0.257944 0.648367 -0.475078
+v -0.259433 0.645721 -0.476079
+v -0.343959 0.685442 -0.434990
+v -0.317568 0.670131 -0.450301
+v -0.289821 0.656069 -0.464364
+v -0.132861 0.614577 -0.510689
+v -0.133521 0.611924 -0.511520
+v -0.134292 0.609068 -0.512732
+v -0.230727 0.631943 -0.488489
+v -0.199631 0.621984 -0.498448
+v -0.167683 0.613478 -0.506954
+v -0.000000 0.602209 -0.523057
+v -0.000000 0.599495 -0.523950
+v -0.000000 0.596567 -0.525233
+v -0.101773 0.600990 -0.519442
+v -0.068091 0.597061 -0.523371
+v -0.034118 0.594692 -0.525740
+v 0.132861 0.614577 -0.510689
+v 0.133521 0.611925 -0.511520
+v 0.134292 0.609068 -0.512732
+v 0.034118 0.594692 -0.525740
+v 0.068090 0.597061 -0.523371
+v 0.101772 0.600990 -0.519442
+v 0.167683 0.613478 -0.506954
+v 0.199631 0.621984 -0.498448
+v 0.230727 0.631943 -0.488489
+v 0.258929 0.652727 -0.481851
+v 0.259030 0.653570 -0.482941
+v 0.258349 0.656587 -0.484292
+v 0.365361 0.714649 -0.426229
+v 0.366324 0.711785 -0.424726
+v 0.366180 0.710920 -0.423658
+v 0.287011 0.665662 -0.468010
+v 0.314489 0.679588 -0.454084
+v 0.340624 0.694751 -0.438921
+v 0.447474 0.790318 -0.350560
+v 0.448653 0.787653 -0.348858
+v 0.448478 0.786758 -0.347819
+v 0.388406 0.728538 -0.405134
+v 0.409850 0.747019 -0.386654
+v 0.429544 0.766448 -0.367224
+v 0.499093 0.878437 -0.262442
+v 0.500407 0.876004 -0.260508
+v 0.500212 0.875074 -0.259504
+v 0.463331 0.807829 -0.325844
+v 0.477280 0.829604 -0.304069
+v 0.489192 0.851975 -0.281697
+v 0.516699 0.972999 -0.167880
+v 0.518060 0.970815 -0.165696
+v 0.517857 0.969849 -0.164729
+v 0.506681 0.898129 -0.235543
+v 0.512185 0.921715 -0.211957
+v 0.515502 0.945505 -0.188168
+v 0.499093 1.067562 -0.073317
+v 0.500407 1.065627 -0.070884
+v 0.500212 1.064623 -0.069955
+v 0.515502 0.993287 -0.140385
+v 0.512185 1.017076 -0.116596
+v 0.506681 1.040662 -0.093010
+v 0.447474 1.155680 0.014801
+v 0.448653 1.153977 0.017466
+v 0.448478 1.152938 0.018361
+v 0.489192 1.086816 -0.046856
+v 0.477280 1.109188 -0.024484
+v 0.463331 1.130963 -0.002709
+v 0.365361 1.231348 0.090470
+v 0.366324 1.229845 0.093334
+v 0.366180 1.228777 0.094200
+v 0.429544 1.172343 0.038671
+v 0.409850 1.191773 0.058101
+v 0.388406 1.210253 0.076581
+v 0.258349 1.289411 0.148532
+v 0.259030 1.288061 0.151550
+v 0.258929 1.286970 0.152392
+v 0.340624 1.244040 0.110368
+v 0.314489 1.259203 0.125531
+v 0.287011 1.273129 0.139457
+v 0.133731 1.325911 0.185032
+v 0.134084 1.324657 0.188145
+v 0.134031 1.323552 0.188974
+v 0.228490 1.297020 0.163348
+v 0.197696 1.306884 0.173211
+v 0.166057 1.315307 0.181634
+v -0.000000 1.338360 0.197481
+v -0.000000 1.337139 0.200628
+v -0.000000 1.336029 0.201451
+v 0.100786 1.327673 0.194001
+v 0.067430 1.331565 0.197893
+v 0.033787 1.333910 0.200238
+v -0.133732 1.325911 0.185032
+v -0.134084 1.324657 0.188145
+v -0.134031 1.323552 0.188974
+v -0.033787 1.333910 0.200238
+v -0.067430 1.331565 0.197893
+v -0.100786 1.327673 0.194001
+v -0.258349 1.289411 0.148532
+v -0.259030 1.288061 0.151550
+v -0.258929 1.286970 0.152392
+v -0.166058 1.315306 0.181634
+v -0.197696 1.306884 0.173211
+v -0.228490 1.297020 0.163348
+v -0.365361 1.231348 0.090470
+v -0.366324 1.229845 0.093334
+v -0.366180 1.228777 0.094200
+v -0.287011 1.273129 0.139457
+v -0.314489 1.259203 0.125531
+v -0.340624 1.244040 0.110368
+v -0.447474 1.155680 0.014801
+v -0.448653 1.153977 0.017466
+v -0.448478 1.152938 0.018361
+v -0.388406 1.210253 0.076581
+v -0.409850 1.191773 0.058101
+v -0.429544 1.172343 0.038671
+v -0.499093 1.067562 -0.073317
+v -0.500407 1.065627 -0.070884
+v -0.500212 1.064623 -0.069955
+v -0.463331 1.130963 -0.002709
+v -0.477280 1.109188 -0.024484
+v -0.489192 1.086816 -0.046856
+v -0.516699 0.972999 -0.167880
+v -0.518060 0.970815 -0.165696
+v -0.517857 0.969848 -0.164729
+v -0.506681 1.040662 -0.093010
+v -0.512185 1.017076 -0.116596
+v -0.515502 0.993287 -0.140385
+v -0.499093 0.878437 -0.262442
+v -0.500408 0.876004 -0.260507
+v -0.500212 0.875074 -0.259503
+v -0.515502 0.945505 -0.188167
+v -0.512185 0.921715 -0.211957
+v -0.506681 0.898129 -0.235543
+v -0.447475 0.790318 -0.350560
+v -0.448653 0.787653 -0.348858
+v -0.448478 0.786758 -0.347819
+v -0.489192 0.851975 -0.281697
+v -0.477280 0.829603 -0.304068
+v -0.463331 0.807828 -0.325843
+v -0.365361 0.714649 -0.426229
+v -0.366324 0.711785 -0.424726
+v -0.366181 0.710919 -0.423658
+v -0.429544 0.766448 -0.367224
+v -0.409850 0.747018 -0.386653
+v -0.388406 0.728538 -0.405134
+v -0.258350 0.656587 -0.484292
+v -0.259030 0.653569 -0.482941
+v -0.258929 0.652727 -0.481851
+v -0.340624 0.694751 -0.438921
+v -0.314489 0.679588 -0.454084
+v -0.287012 0.665662 -0.468010
+v -0.133732 0.620087 -0.520792
+v -0.134084 0.616974 -0.519537
+v -0.134031 0.616145 -0.518432
+v -0.228490 0.641771 -0.491901
+v -0.197696 0.631908 -0.501764
+v -0.166058 0.623485 -0.510187
+v -0.000000 0.607638 -0.533241
+v -0.000000 0.604491 -0.532019
+v -0.000000 0.603668 -0.530909
+v -0.100786 0.611118 -0.522554
+v -0.067430 0.607226 -0.526446
+v -0.033787 0.604881 -0.528791
+v 0.133731 0.620087 -0.520792
+v 0.134084 0.616974 -0.519537
+v 0.134031 0.616145 -0.518432
+v 0.033787 0.604881 -0.528791
+v 0.067430 0.607226 -0.526446
+v 0.100786 0.611118 -0.522554
+v 0.166057 0.623485 -0.510187
+v 0.197696 0.631908 -0.501764
+v 0.228490 0.641771 -0.491901
+v 0.208922 0.883713 -0.376013
+v 0.207541 0.887423 -0.377218
+v 0.208961 0.889671 -0.380942
+v 0.147758 0.856365 -0.414248
+v 0.146753 0.854282 -0.410358
+v 0.147730 0.850291 -0.409435
+v 0.255876 0.927269 -0.332457
+v 0.254184 0.930612 -0.334029
+v 0.255924 0.933077 -0.337537
+v 0.285392 0.977991 -0.281735
+v 0.283506 0.980907 -0.283734
+v 0.285446 0.983623 -0.286990
+v 0.295460 1.032423 -0.227304
+v 0.293507 1.034880 -0.229761
+v 0.295515 1.037866 -0.232747
+v 0.285392 1.086854 -0.172872
+v 0.283506 1.088853 -0.175788
+v 0.285446 1.092110 -0.178504
+v 0.255876 1.137576 -0.122150
+v 0.254184 1.139148 -0.125493
+v 0.255924 1.142656 -0.127958
+v 0.208922 1.181132 -0.078594
+v 0.207541 1.182337 -0.082303
+v 0.208961 1.186061 -0.084552
+v 0.147730 1.214554 -0.045172
+v 0.146753 1.215478 -0.049163
+v 0.147758 1.219367 -0.051246
+v 0.076471 1.235564 -0.024162
+v 0.075965 1.236311 -0.028330
+v 0.076485 1.240304 -0.030309
+v -0.000000 1.242730 -0.016996
+v -0.000000 1.243416 -0.021224
+v -0.000000 1.247446 -0.023168
+v -0.076471 1.235564 -0.024162
+v -0.075965 1.236311 -0.028330
+v -0.076485 1.240304 -0.030309
+v -0.147730 1.214554 -0.045172
+v -0.146753 1.215478 -0.049163
+v -0.147758 1.219367 -0.051246
+v -0.208922 1.181132 -0.078594
+v -0.207541 1.182337 -0.082303
+v -0.208961 1.186061 -0.084552
+v -0.255876 1.137576 -0.122150
+v -0.254184 1.139148 -0.125493
+v -0.255924 1.142656 -0.127958
+v -0.285392 1.086854 -0.172872
+v -0.283506 1.088853 -0.175788
+v -0.285446 1.092110 -0.178504
+v -0.295460 1.032423 -0.227303
+v -0.293507 1.034880 -0.229761
+v -0.295515 1.037866 -0.232747
+v -0.285393 0.977991 -0.281735
+v -0.283506 0.980907 -0.283734
+v -0.285446 0.983623 -0.286990
+v -0.255876 0.927269 -0.332457
+v -0.254185 0.930612 -0.334029
+v -0.255924 0.933077 -0.337537
+v -0.208922 0.883713 -0.376013
+v -0.207541 0.887423 -0.377218
+v -0.208961 0.889672 -0.380942
+v -0.147730 0.850291 -0.409435
+v -0.146754 0.854282 -0.410358
+v -0.147758 0.856365 -0.414248
+v -0.076471 0.829282 -0.430445
+v -0.075965 0.833449 -0.431191
+v -0.076485 0.835428 -0.435185
+v -0.000000 0.822116 -0.437611
+v -0.000000 0.826344 -0.438297
+v -0.000000 0.828287 -0.442326
+v 0.076471 0.829282 -0.430445
+v 0.075965 0.833449 -0.431191
+v 0.076485 0.835428 -0.435185
+v -0.059337 0.332245 0.495359
+v -0.043479 0.328120 0.493465
+v -0.031215 0.325070 0.491834
+v -0.053200 0.342722 0.505835
+v -0.038423 0.335502 0.500908
+v -0.025747 0.329403 0.496412
+v -0.043437 0.351718 0.514832
+v -0.031371 0.341982 0.507388
+v -0.021020 0.333690 0.500698
+v -0.030715 0.358621 0.521735
+v -0.022183 0.346955 0.512361
+v -0.014864 0.336978 0.503987
+v -0.015899 0.362960 0.526074
+v -0.011483 0.350081 0.515487
+v -0.007694 0.339046 0.506055
+v 0.000000 0.364440 0.527554
+v 0.000000 0.351147 0.516553
+v 0.000000 0.339751 0.506760
+v 0.015899 0.362960 0.526074
+v 0.011483 0.350081 0.515487
+v 0.007694 0.339046 0.506055
+v 0.030715 0.358621 0.521735
+v 0.022183 0.346955 0.512361
+v 0.014864 0.336978 0.503987
+v 0.043437 0.351718 0.514832
+v 0.031372 0.341982 0.507388
+v 0.021021 0.333689 0.500698
+v 0.053200 0.342722 0.505835
+v 0.038423 0.335502 0.500908
+v 0.025747 0.329403 0.496412
+v 0.059337 0.332245 0.495359
+v 0.043480 0.328120 0.493465
+v 0.031215 0.325070 0.491834
+v 0.061430 0.321003 0.484117
+v 0.044352 0.319857 0.485263
+v 0.029670 0.319055 0.486064
+v 0.059337 0.309760 0.472874
+v 0.043480 0.311655 0.477000
+v 0.031215 0.313286 0.480050
+v 0.053200 0.299284 0.462398
+v 0.038423 0.304212 0.469618
+v 0.025747 0.308708 0.475716
+v 0.043438 0.290288 0.453402
+v 0.031372 0.297731 0.463137
+v 0.021021 0.304421 0.471430
+v 0.030715 0.283385 0.446499
+v 0.022183 0.292759 0.458165
+v 0.014864 0.301132 0.468141
+v 0.015899 0.279045 0.442159
+v 0.011483 0.289633 0.455039
+v 0.007694 0.299065 0.466074
+v 0.000000 0.277565 0.440679
+v 0.000000 0.288566 0.453972
+v 0.000000 0.298360 0.465368
+v -0.015899 0.279045 0.442159
+v -0.011483 0.289633 0.455039
+v -0.007694 0.299065 0.466074
+v -0.030715 0.283385 0.446499
+v -0.022183 0.292759 0.458165
+v -0.014864 0.301132 0.468141
+v -0.043437 0.290288 0.453402
+v -0.031371 0.297731 0.463137
+v -0.021020 0.304421 0.471430
+v -0.053200 0.299284 0.462398
+v -0.038423 0.304212 0.469618
+v -0.025747 0.308708 0.475716
+v -0.059337 0.309760 0.472874
+v -0.043479 0.311655 0.477000
+v -0.031215 0.313286 0.480050
+v -0.029670 0.319055 0.486064
+v -0.044352 0.319857 0.485263
+v -0.061430 0.321003 0.484117
+v -0.021121 0.315434 0.483194
+v -0.019012 0.316623 0.484606
+v -0.018358 0.317624 0.485681
+v -0.016639 0.313092 0.481149
+v -0.017910 0.313717 0.481700
+v -0.020632 0.314145 0.481905
+v -0.013938 0.310423 0.478480
+v -0.014708 0.311045 0.479102
+v -0.015417 0.311700 0.479756
+v -0.010300 0.308307 0.476364
+v -0.011286 0.308776 0.476833
+v -0.012224 0.309286 0.477343
+v -0.005959 0.306887 0.474944
+v -0.007094 0.307171 0.475227
+v -0.008200 0.307503 0.475559
+v -0.001212 0.306261 0.474318
+v -0.002420 0.306340 0.474397
+v -0.003617 0.306471 0.474528
+v 0.003617 0.306471 0.474528
+v 0.002420 0.306340 0.474397
+v 0.001213 0.306261 0.474318
+v 0.008200 0.307503 0.475559
+v 0.007095 0.307171 0.475227
+v 0.005959 0.306887 0.474944
+v 0.012224 0.309286 0.477343
+v 0.011286 0.308776 0.476833
+v 0.010300 0.308307 0.476364
+v 0.015417 0.311700 0.479756
+v 0.014709 0.311045 0.479102
+v 0.013938 0.310423 0.478480
+v 0.020632 0.314145 0.481905
+v 0.017910 0.313717 0.481700
+v 0.016639 0.313093 0.481149
+v 0.018359 0.317624 0.485681
+v 0.019012 0.316623 0.484606
+v 0.021121 0.315434 0.483194
+v 0.018359 0.319438 0.487495
+v 0.019012 0.320513 0.488496
+v 0.021121 0.321926 0.489685
+v 0.020632 0.323215 0.490975
+v 0.017910 0.323420 0.491402
+v 0.016639 0.323970 0.492027
+v 0.013938 0.326639 0.494696
+v 0.014709 0.326017 0.494074
+v 0.015417 0.325363 0.493420
+v 0.010300 0.328756 0.496813
+v 0.011286 0.328287 0.496344
+v 0.012224 0.327777 0.495833
+v 0.005959 0.330176 0.498232
+v 0.007095 0.329892 0.497949
+v 0.008200 0.329560 0.497617
+v 0.001213 0.330802 0.498859
+v 0.002420 0.330723 0.498780
+v 0.003617 0.330592 0.498649
+v -0.003617 0.330592 0.498649
+v -0.002420 0.330723 0.498780
+v -0.001212 0.330802 0.498859
+v -0.008200 0.329560 0.497617
+v -0.007094 0.329892 0.497949
+v -0.005959 0.330176 0.498232
+v -0.012224 0.327777 0.495833
+v -0.011286 0.328287 0.496344
+v -0.010300 0.328756 0.496813
+v -0.015417 0.325363 0.493420
+v -0.014708 0.326017 0.494074
+v -0.013938 0.326639 0.494696
+v -0.020632 0.323215 0.490975
+v -0.017910 0.323420 0.491402
+v -0.016639 0.323970 0.492027
+v -0.018358 0.319438 0.487495
+v -0.019012 0.320513 0.488496
+v -0.021121 0.321926 0.489685
+v 0.000000 0.321368 0.490369
+v 0.000000 0.324955 0.493641
+v -0.003061 0.324725 0.493411
+v -0.002192 0.321256 0.490256
+v -0.005913 0.324052 0.492738
+v -0.008362 0.322981 0.491667
+v -0.010254 0.321586 0.490272
+v 0.002192 0.321256 0.490256
+v 0.003061 0.324725 0.493411
+v 0.004235 0.320925 0.489925
+v 0.005913 0.324052 0.492738
+v 0.005989 0.320399 0.489400
+v 0.008362 0.322981 0.491667
+v 0.010254 0.321586 0.490272
+v 0.007354 0.319714 0.488714
+v -0.010254 0.314848 0.483534
+v -0.011540 0.318217 0.486903
+v -0.007993 0.318060 0.487060
+v -0.006647 0.318007 0.487112
+v -0.008362 0.313452 0.482138
+v -0.006123 0.318007 0.487112
+v -0.005527 0.318007 0.487112
+v -0.005913 0.312382 0.481067
+v -0.004847 0.318007 0.487112
+v -0.004084 0.318007 0.487112
+v -0.003061 0.311708 0.480394
+v -0.002192 0.314864 0.483864
+v -0.003251 0.318007 0.487112
+v -0.002363 0.318007 0.487112
+v 0.000000 0.311479 0.480165
+v 0.000000 0.314751 0.483751
+v -0.001434 0.318007 0.487112
+v -0.000481 0.318007 0.487112
+v 0.003061 0.311708 0.480394
+v 0.002192 0.314864 0.483864
+v 0.000481 0.318007 0.487112
+v 0.001434 0.318007 0.487112
+v 0.005913 0.312382 0.481067
+v 0.004235 0.315194 0.484194
+v 0.002363 0.318007 0.487112
+v 0.003251 0.318007 0.487112
+v 0.008362 0.313452 0.482138
+v 0.005989 0.315720 0.484720
+v 0.004084 0.318007 0.487112
+v 0.004847 0.318007 0.487112
+v 0.010254 0.314848 0.483534
+v 0.007354 0.316405 0.485405
+v 0.005527 0.318007 0.487112
+v 0.006123 0.318007 0.487112
+v 0.006647 0.318007 0.487112
+v 0.007993 0.318060 0.487060
+v 0.011540 0.318217 0.486903
+v -0.048711 0.407144 0.416611
+v -0.035693 0.403733 0.415032
+v -0.025625 0.401211 0.413675
+v -0.043673 0.415826 0.425294
+v -0.031542 0.409852 0.421201
+v -0.021136 0.404804 0.417468
+v -0.035659 0.423282 0.432749
+v -0.025754 0.415223 0.426572
+v -0.017256 0.408356 0.421021
+v -0.025215 0.429003 0.438471
+v -0.018211 0.419344 0.430693
+v -0.012202 0.411082 0.423746
+v -0.013052 0.432600 0.442067
+v -0.009426 0.421935 0.433284
+v -0.006316 0.412795 0.425460
+v 0.000000 0.433826 0.443294
+v 0.000000 0.422818 0.434167
+v 0.000000 0.413380 0.426044
+v 0.013052 0.432600 0.442067
+v 0.009427 0.421935 0.433284
+v 0.006316 0.412795 0.425460
+v 0.025215 0.429003 0.438471
+v 0.018211 0.419344 0.430693
+v 0.012202 0.411082 0.423746
+v 0.035659 0.423282 0.432749
+v 0.025754 0.415223 0.426572
+v 0.017256 0.408356 0.421021
+v 0.043673 0.415826 0.425294
+v 0.031542 0.409852 0.421201
+v 0.021137 0.404804 0.417468
+v 0.048711 0.407144 0.416611
+v 0.035693 0.403733 0.415032
+v 0.025625 0.401211 0.413675
+v 0.050429 0.397826 0.407293
+v 0.036409 0.396885 0.408234
+v 0.024357 0.396227 0.408892
+v 0.048711 0.388509 0.397976
+v 0.035693 0.390087 0.401386
+v 0.025625 0.391445 0.403908
+v 0.043673 0.379826 0.389293
+v 0.031542 0.383919 0.395268
+v 0.021137 0.387651 0.400316
+v 0.035659 0.372370 0.381837
+v 0.025754 0.378548 0.389897
+v 0.017256 0.384099 0.396764
+v 0.025215 0.366649 0.376116
+v 0.018211 0.374427 0.385776
+v 0.012202 0.381373 0.394038
+v 0.013052 0.363052 0.372520
+v 0.009427 0.371836 0.383185
+v 0.006316 0.379660 0.392324
+v 0.000000 0.361826 0.371293
+v 0.000000 0.370952 0.382301
+v 0.000000 0.379075 0.391740
+v -0.013052 0.363052 0.372520
+v -0.009426 0.371836 0.383185
+v -0.006316 0.379660 0.392324
+v -0.025215 0.366649 0.376116
+v -0.018211 0.374427 0.385776
+v -0.012202 0.381373 0.394038
+v -0.035659 0.372370 0.381837
+v -0.025754 0.378548 0.389897
+v -0.017256 0.384099 0.396764
+v -0.043673 0.379826 0.389293
+v -0.031542 0.383919 0.395268
+v -0.021136 0.387651 0.400316
+v -0.048711 0.388509 0.397976
+v -0.035693 0.390087 0.401386
+v -0.025625 0.391445 0.403908
+v -0.024357 0.396227 0.408892
+v -0.036409 0.396885 0.408234
+v -0.050429 0.397826 0.407293
+v -0.017339 0.398609 0.411890
+v -0.015607 0.397440 0.410904
+v -0.015071 0.396549 0.410074
+v -0.013660 0.400305 0.413830
+v -0.014703 0.399848 0.413313
+v -0.016938 0.399678 0.412959
+v -0.011442 0.402517 0.416042
+v -0.012074 0.402001 0.415526
+v -0.012656 0.401459 0.414984
+v -0.008455 0.404271 0.417796
+v -0.009265 0.403883 0.417408
+v -0.010035 0.403460 0.416985
+v -0.004892 0.405448 0.418973
+v -0.005824 0.405213 0.418738
+v -0.006731 0.404938 0.418463
+v -0.000995 0.405967 0.419492
+v -0.001986 0.405901 0.419427
+v -0.002969 0.405793 0.419318
+v 0.002969 0.405793 0.419318
+v 0.001987 0.405901 0.419427
+v 0.000995 0.405967 0.419492
+v 0.006731 0.404938 0.418463
+v 0.005824 0.405213 0.418738
+v 0.004892 0.405448 0.418973
+v 0.010035 0.403460 0.416985
+v 0.009265 0.403883 0.417408
+v 0.008455 0.404271 0.417796
+v 0.012656 0.401459 0.414984
+v 0.012075 0.402001 0.415526
+v 0.011442 0.402517 0.416042
+v 0.016938 0.399678 0.412959
+v 0.014703 0.399848 0.413313
+v 0.013660 0.400305 0.413830
+v 0.015071 0.396549 0.410074
+v 0.015607 0.397440 0.410904
+v 0.017339 0.398609 0.411890
+v 0.017339 0.393229 0.406510
+v 0.015607 0.394216 0.407680
+v 0.015071 0.395046 0.408571
+v 0.013660 0.391290 0.404815
+v 0.014703 0.391807 0.405271
+v 0.016938 0.392160 0.405442
+v 0.011442 0.389077 0.402603
+v 0.012075 0.389593 0.403118
+v 0.012656 0.390135 0.403660
+v 0.008455 0.387323 0.400848
+v 0.009265 0.387712 0.401237
+v 0.010035 0.388135 0.401660
+v 0.004892 0.386147 0.399672
+v 0.005824 0.386382 0.399907
+v 0.006731 0.386657 0.400182
+v 0.000995 0.385627 0.399153
+v 0.001987 0.385693 0.399218
+v 0.002969 0.385801 0.399327
+v -0.002969 0.385802 0.399327
+v -0.001986 0.385693 0.399218
+v -0.000995 0.385627 0.399153
+v -0.006731 0.386657 0.400182
+v -0.005824 0.386382 0.399907
+v -0.004892 0.386147 0.399672
+v -0.010035 0.388135 0.401660
+v -0.009265 0.387712 0.401237
+v -0.008455 0.387323 0.400848
+v -0.012656 0.390135 0.403660
+v -0.012074 0.389593 0.403118
+v -0.011442 0.389077 0.402603
+v -0.013660 0.391290 0.404815
+v -0.014703 0.391807 0.405271
+v -0.016938 0.392160 0.405442
+v -0.017339 0.393229 0.406510
+v -0.015607 0.394216 0.407680
+v -0.015071 0.395046 0.408571
+v 0.000000 0.401123 0.415165
+v 0.000000 0.396444 0.410829
+v 0.002513 0.400933 0.414975
+v 0.001562 0.396407 0.410793
+v 0.004854 0.400375 0.414417
+v 0.003017 0.396300 0.410685
+v 0.006865 0.399488 0.413529
+v 0.004267 0.396128 0.410514
+v 0.008418 0.398331 0.412373
+v -0.002513 0.400933 0.414975
+v -0.001562 0.396407 0.410793
+v -0.004854 0.400375 0.414417
+v -0.003017 0.396300 0.410685
+v -0.006865 0.399488 0.413529
+v -0.004267 0.396128 0.410514
+v -0.008418 0.398331 0.412373
+v -0.008418 0.392747 0.406788
+v -0.009473 0.395539 0.409580
+v -0.006562 0.395410 0.409710
+v -0.005457 0.395367 0.409753
+v -0.006865 0.391590 0.405632
+v -0.004267 0.394605 0.408991
+v -0.004790 0.395367 0.409753
+v -0.004854 0.390703 0.404744
+v -0.003017 0.394434 0.408820
+v -0.003673 0.395367 0.409753
+v -0.002513 0.390145 0.404186
+v -0.001562 0.394327 0.408712
+v -0.002309 0.395367 0.409753
+v 0.000000 0.389955 0.403996
+v 0.000000 0.394290 0.408676
+v -0.000788 0.395367 0.409753
+v 0.001562 0.394327 0.408712
+v 0.002513 0.390145 0.404186
+v 0.000788 0.395367 0.409753
+v 0.003017 0.394434 0.408820
+v 0.004854 0.390703 0.404744
+v 0.002309 0.395367 0.409753
+v 0.004267 0.394605 0.408991
+v 0.006865 0.391590 0.405632
+v 0.003674 0.395367 0.409753
+v 0.008418 0.392747 0.406788
+v 0.004790 0.395367 0.409753
+v 0.005457 0.395367 0.409753
+v 0.006562 0.395410 0.409710
+v 0.009473 0.395539 0.409580
+v -0.063352 0.411224 0.418132
+v -0.056800 0.422516 0.429424
+v -0.046377 0.432213 0.439121
+v -0.032793 0.439654 0.446562
+v -0.016975 0.444331 0.451239
+v 0.000000 0.445926 0.452835
+v 0.016975 0.444331 0.451239
+v 0.032793 0.439654 0.446562
+v 0.046377 0.432213 0.439121
+v 0.056800 0.422516 0.429424
+v 0.063352 0.411224 0.418132
+v 0.065587 0.399105 0.406014
+v 0.063352 0.386987 0.393896
+v 0.056800 0.375695 0.382604
+v 0.046377 0.365998 0.372907
+v 0.032793 0.358557 0.365466
+v 0.016975 0.353880 0.360788
+v 0.000000 0.352285 0.359193
+v -0.016975 0.353880 0.360788
+v -0.032793 0.358557 0.365466
+v -0.046377 0.365998 0.372907
+v -0.056800 0.375695 0.382604
+v -0.063352 0.386987 0.393896
+v -0.065587 0.399105 0.406014
+v -0.123814 0.431778 0.420709
+v -0.111008 0.453847 0.442778
+v -0.090638 0.472799 0.461730
+v -0.064091 0.487341 0.476272
+v -0.033176 0.496482 0.485413
+v 0.000000 0.499600 0.488531
+v 0.033176 0.496482 0.485413
+v 0.064091 0.487341 0.476272
+v 0.090638 0.472799 0.461730
+v 0.111008 0.453847 0.442778
+v 0.123814 0.431778 0.420709
+v 0.128181 0.408094 0.397025
+v 0.123814 0.384411 0.373342
+v 0.111008 0.362341 0.351272
+v 0.090638 0.343390 0.332321
+v 0.064091 0.328848 0.317779
+v 0.033176 0.319706 0.308637
+v 0.000000 0.316588 0.305519
+v -0.033176 0.319706 0.308637
+v -0.064091 0.328848 0.317779
+v -0.090638 0.343390 0.332321
+v -0.111008 0.362341 0.351272
+v -0.123814 0.384411 0.373342
+v -0.128181 0.408094 0.397025
+v -0.183068 0.457995 0.417160
+v -0.164134 0.490626 0.449791
+v -0.134015 0.518648 0.477813
+v -0.094763 0.540149 0.499314
+v -0.049053 0.553665 0.512830
+v 0.000000 0.558276 0.517441
+v 0.049053 0.553665 0.512830
+v 0.094763 0.540149 0.499314
+v 0.134015 0.518648 0.477813
+v 0.164134 0.490626 0.449791
+v 0.183068 0.457995 0.417160
+v 0.189526 0.422977 0.382142
+v 0.183068 0.387959 0.347124
+v 0.164134 0.355328 0.314493
+v 0.134015 0.327307 0.286472
+v 0.094763 0.305805 0.264970
+v 0.049053 0.292289 0.251454
+v 0.000000 0.287679 0.246844
+v -0.049053 0.292289 0.251454
+v -0.094763 0.305805 0.264970
+v -0.134015 0.327307 0.286472
+v -0.164134 0.355328 0.314493
+v -0.183068 0.387959 0.347124
+v -0.189526 0.422977 0.382142
+v -0.239189 0.489209 0.407417
+v -0.214451 0.531844 0.450052
+v -0.175099 0.568455 0.486663
+v -0.123814 0.596548 0.514756
+v -0.064091 0.614208 0.532416
+v 0.000000 0.620232 0.538440
+v 0.064091 0.614208 0.532416
+v 0.123814 0.596548 0.514756
+v 0.175099 0.568455 0.486663
+v 0.214452 0.531844 0.450052
+v 0.239190 0.489209 0.407417
+v 0.247627 0.443456 0.361664
+v 0.239190 0.397703 0.315911
+v 0.214452 0.355068 0.273276
+v 0.175099 0.318456 0.236664
+v 0.123814 0.290363 0.208571
+v 0.064091 0.272703 0.190911
+v 0.000000 0.266680 0.184888
+v -0.064091 0.272703 0.190911
+v -0.123814 0.290363 0.208571
+v -0.175099 0.318456 0.236664
+v -0.214451 0.355068 0.273276
+v -0.239190 0.397703 0.315911
+v -0.247627 0.443456 0.361664
+v -0.291219 0.524884 0.391646
+v -0.261099 0.576793 0.443555
+v -0.213187 0.621369 0.488130
+v -0.150746 0.655573 0.522334
+v -0.078032 0.677074 0.543835
+v 0.000000 0.684408 0.551169
+v 0.078032 0.677074 0.543835
+v 0.150746 0.655573 0.522334
+v 0.213187 0.621369 0.488130
+v 0.261100 0.576793 0.443555
+v 0.291219 0.524884 0.391646
+v 0.301492 0.469179 0.335940
+v 0.291219 0.413474 0.280235
+v 0.261100 0.361565 0.228326
+v 0.213187 0.316989 0.183751
+v 0.150746 0.282786 0.149547
+v 0.078032 0.261284 0.128045
+v 0.000000 0.253950 0.120712
+v -0.078032 0.261284 0.128045
+v -0.150746 0.282786 0.149547
+v -0.213187 0.316989 0.183751
+v -0.261100 0.361565 0.228326
+v -0.291219 0.413474 0.280235
+v -0.301492 0.469179 0.335940
+v -0.338265 0.564412 0.370116
+v -0.303280 0.624707 0.430411
+v -0.247627 0.676483 0.482188
+v -0.175099 0.716213 0.521917
+v -0.090638 0.741188 0.546892
+v 0.000000 0.749707 0.555411
+v 0.090638 0.741188 0.546892
+v 0.175099 0.716213 0.521917
+v 0.247627 0.676484 0.482188
+v 0.303280 0.624707 0.430411
+v 0.338265 0.564412 0.370116
+v 0.350198 0.499708 0.305412
+v 0.338265 0.435003 0.240707
+v 0.303280 0.374708 0.180412
+v 0.247627 0.322932 0.128636
+v 0.175099 0.283202 0.088906
+v 0.090638 0.258227 0.063931
+v 0.000000 0.249709 0.055413
+v -0.090638 0.258227 0.063931
+v -0.175099 0.283202 0.088906
+v -0.247627 0.322932 0.128636
+v -0.303280 0.374708 0.180412
+v -0.338265 0.435003 0.240707
+v -0.350198 0.499708 0.305412
+v -0.379524 0.607115 0.343197
+v -0.340271 0.674764 0.410847
+v -0.277830 0.732856 0.468938
+v -0.196456 0.777431 0.513514
+v -0.101693 0.805453 0.541535
+v 0.000000 0.815010 0.551092
+v 0.101693 0.805453 0.541535
+v 0.196456 0.777431 0.513514
+v 0.277831 0.732856 0.468938
+v 0.340272 0.674764 0.410847
+v 0.379524 0.607115 0.343197
+v 0.392912 0.534519 0.270601
+v 0.379524 0.461922 0.198004
+v 0.340272 0.394273 0.130355
+v 0.277831 0.336181 0.072263
+v 0.196456 0.291606 0.027688
+v 0.101693 0.263585 -0.000333
+v 0.000000 0.254027 -0.009891
+v -0.101693 0.263584 -0.000333
+v -0.196456 0.291606 0.027688
+v -0.277831 0.336181 0.072263
+v -0.340272 0.394273 0.130355
+v -0.379524 0.461922 0.198004
+v -0.392912 0.534519 0.270601
+v -0.414288 0.652263 0.311349
+v -0.371441 0.726109 0.385195
+v -0.303280 0.789522 0.448608
+v -0.214451 0.838180 0.497267
+v -0.111008 0.868768 0.527855
+v 0.000000 0.879201 0.538288
+v 0.111008 0.868768 0.527855
+v 0.214451 0.838180 0.497267
+v 0.303280 0.789522 0.448608
+v 0.371441 0.726109 0.385195
+v 0.414288 0.652263 0.311349
+v 0.428903 0.573017 0.232103
+v 0.414288 0.493770 0.152856
+v 0.371441 0.419924 0.079010
+v 0.303280 0.356511 0.015597
+v 0.214451 0.307853 -0.033061
+v 0.111008 0.277265 -0.063649
+v -0.000000 0.266832 -0.074082
+v -0.111008 0.277265 -0.063649
+v -0.214452 0.307853 -0.033061
+v -0.303280 0.356511 0.015598
+v -0.371441 0.419924 0.079011
+v -0.414289 0.493770 0.152856
+v -0.428903 0.573017 0.232103
+v -0.441965 0.699083 0.275117
+v -0.396254 0.777862 0.353896
+v -0.323540 0.845512 0.421546
+v -0.228778 0.897421 0.473455
+v -0.118424 0.930052 0.506086
+v 0.000000 0.941182 0.517216
+v 0.118424 0.930052 0.506086
+v 0.228778 0.897421 0.473455
+v 0.323541 0.845512 0.421546
+v 0.396255 0.777862 0.353896
+v 0.441965 0.699083 0.275117
+v 0.457555 0.614543 0.190577
+v 0.441965 0.530002 0.106036
+v 0.396255 0.451223 0.027257
+v 0.323541 0.383574 -0.040392
+v 0.228778 0.331665 -0.092301
+v 0.118424 0.299033 -0.124933
+v -0.000000 0.287903 -0.136063
+v -0.118424 0.299033 -0.124933
+v -0.228778 0.331665 -0.092301
+v -0.323541 0.383574 -0.040392
+v -0.396255 0.451223 0.027257
+v -0.441965 0.530002 0.106036
+v -0.457556 0.614543 0.190577
+v -0.462079 0.746774 0.235121
+v -0.414288 0.829139 0.317485
+v -0.338265 0.899867 0.388213
+v -0.239189 0.954139 0.442485
+v -0.123814 0.988255 0.476601
+v 0.000000 0.999891 0.488238
+v 0.123814 0.988255 0.476601
+v 0.239189 0.954139 0.442485
+v 0.338265 0.899867 0.388213
+v 0.414288 0.829139 0.317485
+v 0.462079 0.746775 0.235121
+v 0.478379 0.658387 0.146733
+v 0.462079 0.569999 0.058345
+v 0.414288 0.487634 -0.024020
+v 0.338265 0.416906 -0.094748
+v 0.239190 0.362635 -0.149019
+v 0.123814 0.328518 -0.183136
+v -0.000000 0.316882 -0.194772
+v -0.123814 0.328518 -0.183136
+v -0.239190 0.362635 -0.149019
+v -0.338265 0.416906 -0.094748
+v -0.414289 0.487634 -0.024020
+v -0.462079 0.569999 0.058345
+v -0.478379 0.658386 0.146733
+v -0.474286 0.794521 0.192044
+v -0.425233 0.879062 0.276585
+v -0.347202 0.951658 0.349181
+v -0.245509 1.007364 0.404887
+v -0.127085 1.042381 0.439904
+v 0.000000 1.054325 0.451848
+v 0.127085 1.042381 0.439905
+v 0.245509 1.007364 0.404887
+v 0.347202 0.951658 0.349181
+v 0.425234 0.879062 0.276585
+v 0.474286 0.794521 0.192044
+v 0.491017 0.703798 0.101321
+v 0.474286 0.613075 0.010598
+v 0.425234 0.528534 -0.073942
+v 0.347202 0.455938 -0.146539
+v 0.245509 0.400233 -0.202244
+v 0.127085 0.365215 -0.237262
+v -0.000000 0.353271 -0.249206
+v -0.127085 0.365215 -0.237262
+v -0.245509 0.400232 -0.202244
+v -0.347202 0.455938 -0.146539
+v -0.425234 0.528534 -0.073942
+v -0.474287 0.613075 0.010598
+v -0.491018 0.703798 0.101321
+v -0.478379 0.841506 0.146625
+v -0.428903 0.926776 0.231895
+v -0.350198 0.999999 0.305118
+v -0.247627 1.056185 0.361304
+v -0.128181 1.091505 0.396624
+v -0.000000 1.103552 0.408671
+v 0.128181 1.091505 0.396624
+v 0.247627 1.056185 0.361304
+v 0.350198 0.999999 0.305118
+v 0.428903 0.926776 0.231895
+v 0.478379 0.841506 0.146625
+v 0.495254 0.750000 0.055119
+v 0.478379 0.658494 -0.036387
+v 0.428903 0.573224 -0.121657
+v 0.350198 0.500001 -0.194880
+v 0.247627 0.443815 -0.251066
+v 0.128181 0.408495 -0.286386
+v -0.000000 0.396448 -0.298432
+v -0.128181 0.408495 -0.286385
+v -0.247627 0.443815 -0.251065
+v -0.350198 0.500001 -0.194880
+v -0.428903 0.573224 -0.121657
+v -0.478379 0.658494 -0.036387
+v -0.495255 0.750000 0.055119
+v -0.474286 0.886925 0.099640
+v -0.425233 0.971465 0.184181
+v -0.347202 1.044062 0.256777
+v -0.245509 1.099768 0.312483
+v -0.127085 1.134785 0.347500
+v -0.000000 1.146729 0.359444
+v 0.127085 1.134785 0.347500
+v 0.245509 1.099768 0.312483
+v 0.347202 1.044062 0.256777
+v 0.425234 0.971466 0.184181
+v 0.474286 0.886925 0.099640
+v 0.491017 0.796202 0.008917
+v 0.474286 0.705479 -0.081806
+v 0.425234 0.620938 -0.166346
+v 0.347202 0.548342 -0.238943
+v 0.245509 0.492637 -0.294648
+v 0.127085 0.457619 -0.329666
+v -0.000000 0.445675 -0.341610
+v -0.127085 0.457619 -0.329666
+v -0.245509 0.492637 -0.294648
+v -0.347202 0.548342 -0.238943
+v -0.425234 0.620938 -0.166346
+v -0.474287 0.705479 -0.081806
+v -0.491018 0.796202 0.008917
+v -0.462079 0.930001 0.051894
+v -0.414288 1.012366 0.134258
+v -0.338265 1.083094 0.204986
+v -0.239189 1.137365 0.259258
+v -0.123814 1.171482 0.293374
+v -0.000000 1.183118 0.305011
+v 0.123814 1.171482 0.293374
+v 0.239189 1.137365 0.259258
+v 0.338265 1.083094 0.204986
+v 0.414288 1.012366 0.134258
+v 0.462079 0.930001 0.051894
+v 0.478379 0.841613 -0.036494
+v 0.462079 0.753226 -0.124882
+v 0.414288 0.670861 -0.207247
+v 0.338265 0.600133 -0.277975
+v 0.239189 0.545862 -0.332246
+v 0.123814 0.511745 -0.366363
+v -0.000000 0.500109 -0.377999
+v -0.123814 0.511745 -0.366362
+v -0.239190 0.545861 -0.332246
+v -0.338265 0.600133 -0.277974
+v -0.414289 0.670861 -0.207247
+v -0.462079 0.753226 -0.124882
+v -0.478379 0.841613 -0.036494
+v -0.442368 0.969469 0.004885
+v -0.396616 1.048320 0.083736
+v -0.323836 1.116031 0.151447
+v -0.228987 1.167988 0.203404
+v -0.118532 1.200649 0.236065
+v -0.000000 1.211789 0.247205
+v 0.118532 1.200649 0.236065
+v 0.228987 1.167988 0.203404
+v 0.323836 1.116032 0.151447
+v 0.396616 1.048320 0.083736
+v 0.442368 0.969470 0.004885
+v 0.457973 0.884852 -0.079732
+v 0.442368 0.800234 -0.164350
+v 0.396616 0.721383 -0.243201
+v 0.323836 0.653672 -0.310912
+v 0.228987 0.601715 -0.362869
+v 0.118532 0.569054 -0.395530
+v -0.000000 0.557914 -0.406670
+v -0.118532 0.569054 -0.395530
+v -0.228987 0.601715 -0.362869
+v -0.323836 0.653672 -0.310912
+v -0.396617 0.721383 -0.243201
+v -0.442368 0.800234 -0.164350
+v -0.457973 0.884852 -0.079732
+v -0.379017 1.038543 -0.088424
+v -0.339817 1.106101 -0.020865
+v -0.277459 1.164115 0.037149
+v -0.196193 1.208631 0.081665
+v -0.101557 1.236615 0.109648
+v -0.000000 1.246160 0.119193
+v 0.101557 1.236615 0.109648
+v 0.196193 1.208631 0.081665
+v 0.277459 1.164116 0.037149
+v 0.339817 1.106101 -0.020865
+v 0.379017 1.038543 -0.088424
+v 0.392387 0.966043 -0.160924
+v 0.379017 0.893543 -0.233423
+v 0.339817 0.825984 -0.300982
+v 0.277459 0.767970 -0.358996
+v 0.196193 0.723454 -0.403512
+v 0.101557 0.695471 -0.431496
+v -0.000000 0.685926 -0.441040
+v -0.101557 0.695471 -0.431496
+v -0.196194 0.723454 -0.403512
+v -0.277460 0.767970 -0.358996
+v -0.339817 0.825984 -0.300982
+v -0.379017 0.893543 -0.233423
+v -0.392387 0.966043 -0.160924
+v -0.336740 1.065136 -0.131191
+v -0.301912 1.125159 -0.071168
+v -0.246510 1.176702 -0.019625
+v -0.174309 1.216252 0.019925
+v -0.090229 1.241114 0.044787
+v -0.000000 1.249594 0.053268
+v 0.090229 1.241114 0.044788
+v 0.174309 1.216252 0.019925
+v 0.246510 1.176702 -0.019625
+v 0.301912 1.125159 -0.071168
+v 0.336739 1.065136 -0.131191
+v 0.348618 1.000723 -0.195604
+v 0.336740 0.936310 -0.260017
+v 0.301912 0.876287 -0.320040
+v 0.246510 0.824744 -0.371583
+v 0.174309 0.785194 -0.411133
+v 0.090229 0.760332 -0.435995
+v -0.000000 0.751851 -0.444475
+v -0.090229 0.760332 -0.435995
+v -0.174309 0.785194 -0.411133
+v -0.246511 0.824744 -0.371583
+v -0.301913 0.876287 -0.320039
+v -0.336740 0.936310 -0.260016
+v -0.348619 1.000723 -0.195604
+v -0.290931 1.084776 -0.168515
+v -0.260842 1.136560 -0.116732
+v -0.212976 1.181027 -0.072264
+v -0.150597 1.215148 -0.038143
+v -0.077955 1.236598 -0.016694
+v -0.000000 1.243914 -0.009378
+v 0.077955 1.236598 -0.016694
+v 0.150597 1.215148 -0.038143
+v 0.212976 1.181027 -0.072264
+v 0.260842 1.136560 -0.116732
+v 0.290931 1.084776 -0.168516
+v 0.301194 1.029205 -0.224086
+v 0.290931 0.973635 -0.279657
+v 0.260842 0.921851 -0.331440
+v 0.212976 0.877384 -0.375908
+v 0.150597 0.843262 -0.410029
+v 0.077955 0.821813 -0.431479
+v -0.000000 0.814497 -0.438795
+v -0.077955 0.821813 -0.431479
+v -0.150597 0.843262 -0.410029
+v -0.212977 0.877384 -0.375908
+v -0.260842 0.921851 -0.331440
+v -0.290931 0.973635 -0.279657
+v -0.301194 1.029205 -0.224086
+v -0.421004 0.999380 -0.033199
+v -0.435855 0.918849 -0.113730
+v -0.421004 0.838318 -0.194261
+v -0.377462 0.763275 -0.269304
+v -0.308196 0.698834 -0.333744
+v -0.217928 0.649387 -0.383192
+v -0.112808 0.618303 -0.414275
+v -0.000000 0.607701 -0.424878
+v 0.112808 0.618303 -0.414276
+v 0.217928 0.649387 -0.383192
+v 0.308196 0.698834 -0.333745
+v 0.377462 0.763275 -0.269304
+v 0.421004 0.838318 -0.194261
+v 0.435855 0.918849 -0.113730
+v 0.421004 0.999380 -0.033199
+v 0.377462 1.074423 0.041844
+v 0.308196 1.138864 0.106285
+v 0.217928 1.188311 0.155732
+v 0.112808 1.219395 0.186816
+v -0.000000 1.229997 0.197418
+v -0.112808 1.219395 0.186816
+v -0.217928 1.188311 0.155732
+v -0.308196 1.138864 0.106285
+v -0.377462 1.074423 0.041844
+v -0.365915 1.086169 0.020580
+v -0.298768 1.148639 0.083050
+v -0.211261 1.196573 0.130984
+v -0.109357 1.226706 0.161117
+v -0.000000 1.236984 0.171395
+v 0.109357 1.226706 0.161117
+v 0.211261 1.196573 0.130984
+v 0.298768 1.148639 0.083050
+v 0.365915 1.086169 0.020580
+v 0.408125 1.013422 -0.052167
+v 0.422522 0.935354 -0.130235
+v 0.408125 0.857286 -0.208302
+v 0.365915 0.784539 -0.281050
+v 0.298768 0.722069 -0.343519
+v 0.211261 0.674135 -0.391454
+v 0.109357 0.644002 -0.421587
+v -0.000000 0.633724 -0.431865
+v -0.109357 0.644002 -0.421587
+v -0.211261 0.674135 -0.391454
+v -0.298769 0.722069 -0.343519
+v -0.365915 0.784539 -0.281050
+v -0.408125 0.857286 -0.208302
+v -0.422523 0.935354 -0.130235
+v -0.408125 1.013422 -0.052167
+v -0.077171 0.337183 0.497180
+v -0.069190 0.350808 0.510805
+v -0.056493 0.362508 0.522505
+v -0.039947 0.371486 0.531483
+v -0.020678 0.377130 0.537126
+v 0.000000 0.379055 0.539051
+v 0.020678 0.377130 0.537126
+v 0.039947 0.371486 0.531483
+v 0.056493 0.362508 0.522505
+v 0.069190 0.350808 0.510805
+v 0.077171 0.337183 0.497180
+v 0.079894 0.322561 0.482558
+v 0.077171 0.307940 0.467937
+v 0.069190 0.294315 0.454311
+v 0.056493 0.282614 0.442611
+v 0.039947 0.273637 0.433634
+v 0.020678 0.267993 0.427990
+v 0.000000 0.266068 0.426065
+v -0.020678 0.267993 0.427990
+v -0.039947 0.273637 0.433634
+v -0.056493 0.282614 0.442611
+v -0.069190 0.294315 0.454311
+v -0.077171 0.307940 0.467937
+v -0.079894 0.322561 0.482558
+v -0.150822 0.362087 0.500185
+v -0.135224 0.388716 0.526814
+v -0.110410 0.411582 0.549680
+v -0.078071 0.429128 0.567226
+v -0.040413 0.440158 0.578256
+v 0.000000 0.443920 0.582018
+v 0.040413 0.440158 0.578256
+v 0.078071 0.429128 0.567226
+v 0.110410 0.411582 0.549680
+v 0.135224 0.388716 0.526813
+v 0.150822 0.362087 0.500185
+v 0.156143 0.333511 0.471609
+v 0.150822 0.304935 0.443033
+v 0.135224 0.278306 0.416404
+v 0.110410 0.255439 0.393537
+v 0.078071 0.237893 0.375991
+v 0.040413 0.226863 0.364961
+v 0.000000 0.223101 0.361199
+v -0.040413 0.226863 0.364961
+v -0.078071 0.237893 0.375991
+v -0.110410 0.255439 0.393537
+v -0.135224 0.278306 0.416404
+v -0.150822 0.304935 0.443033
+v -0.156143 0.333511 0.471609
+v -0.223002 0.393892 0.495731
+v -0.199938 0.433265 0.535104
+v -0.163249 0.467075 0.568913
+v -0.115434 0.493018 0.594857
+v -0.059753 0.509327 0.611165
+v 0.000000 0.514889 0.616728
+v 0.059753 0.509327 0.611165
+v 0.115434 0.493018 0.594857
+v 0.163249 0.467075 0.568913
+v 0.199938 0.433265 0.535103
+v 0.223002 0.393892 0.495731
+v 0.230869 0.351640 0.453479
+v 0.223002 0.309388 0.411227
+v 0.199938 0.270016 0.371855
+v 0.163249 0.236206 0.338045
+v 0.115434 0.210263 0.312101
+v 0.059753 0.193954 0.295793
+v 0.000000 0.188391 0.290230
+v -0.059753 0.193954 0.295793
+v -0.115434 0.210263 0.312101
+v -0.163249 0.236206 0.338045
+v -0.199938 0.270016 0.371855
+v -0.223002 0.309388 0.411227
+v -0.230869 0.351640 0.453479
+v -0.291366 0.431791 0.483738
+v -0.261232 0.483233 0.535181
+v -0.213295 0.527408 0.579356
+v -0.150822 0.561305 0.613252
+v -0.078071 0.582613 0.634560
+v 0.000000 0.589881 0.641828
+v 0.078071 0.582613 0.634560
+v 0.150822 0.561305 0.613252
+v 0.213295 0.527408 0.579356
+v 0.261232 0.483234 0.535181
+v 0.291366 0.431791 0.483738
+v 0.301645 0.376586 0.428533
+v 0.291366 0.321381 0.373329
+v 0.261232 0.269939 0.321886
+v 0.213295 0.225764 0.277711
+v 0.150822 0.191867 0.243815
+v 0.078071 0.170559 0.222506
+v 0.000000 0.163291 0.215238
+v -0.078071 0.170559 0.222506
+v -0.150822 0.191867 0.243815
+v -0.213295 0.225764 0.277711
+v -0.261232 0.269939 0.321886
+v -0.291366 0.321381 0.373329
+v -0.301645 0.376586 0.428533
+v -0.354745 0.475134 0.464412
+v -0.318056 0.537767 0.527044
+v -0.259691 0.591550 0.580828
+v -0.183630 0.632820 0.622098
+v -0.095054 0.658764 0.648041
+v 0.000000 0.667612 0.656890
+v 0.095054 0.658764 0.648041
+v 0.183630 0.632820 0.622098
+v 0.259692 0.591550 0.580828
+v 0.318056 0.537767 0.527044
+v 0.354745 0.475134 0.464412
+v 0.367259 0.407921 0.397199
+v 0.354745 0.340708 0.329985
+v 0.318056 0.278075 0.267353
+v 0.259692 0.224291 0.213569
+v 0.183630 0.183021 0.172299
+v 0.095054 0.157078 0.146356
+v 0.000000 0.148229 0.137507
+v -0.095054 0.157078 0.146356
+v -0.183630 0.183021 0.172299
+v -0.259692 0.224291 0.213569
+v -0.318056 0.278075 0.267353
+v -0.354745 0.340708 0.329986
+v -0.367259 0.407921 0.397199
+v -0.412054 0.523180 0.438082
+v -0.369438 0.595931 0.510833
+v -0.301645 0.658404 0.573306
+v -0.213295 0.706341 0.621243
+v -0.110410 0.736475 0.651377
+v 0.000000 0.746753 0.661655
+v 0.110410 0.736475 0.651377
+v 0.213295 0.706341 0.621243
+v 0.301645 0.658404 0.573306
+v 0.369438 0.595931 0.510833
+v 0.412054 0.523180 0.438082
+v 0.426590 0.445109 0.360011
+v 0.412054 0.367037 0.281939
+v 0.369438 0.294286 0.209188
+v 0.301645 0.231814 0.146716
+v 0.213295 0.183877 0.098779
+v 0.110410 0.153742 0.068644
+v 0.000000 0.143464 0.058366
+v -0.110410 0.153742 0.068644
+v -0.213295 0.183877 0.098779
+v -0.301645 0.231814 0.146716
+v -0.369438 0.294286 0.209188
+v -0.412054 0.367037 0.281939
+v -0.426590 0.445109 0.360011
+v -0.462313 0.575107 0.405200
+v -0.414498 0.656732 0.486824
+v -0.338436 0.726824 0.556917
+v -0.239311 0.780608 0.610701
+v -0.123876 0.814418 0.644510
+v 0.000000 0.825950 0.656042
+v 0.123876 0.814418 0.644511
+v 0.239311 0.780608 0.610701
+v 0.338437 0.726824 0.556917
+v 0.414498 0.656732 0.486824
+v 0.462313 0.575107 0.405200
+v 0.478622 0.487514 0.317606
+v 0.462313 0.399920 0.230012
+v 0.414499 0.318295 0.148388
+v 0.338437 0.248203 0.078295
+v 0.239311 0.194419 0.024511
+v 0.123876 0.160609 -0.009299
+v 0.000000 0.149077 -0.020831
+v -0.123876 0.160609 -0.009299
+v -0.239311 0.194419 0.024511
+v -0.338437 0.248203 0.078295
+v -0.414499 0.318295 0.148388
+v -0.462313 0.399920 0.230012
+v -0.478622 0.487513 0.317606
+v -0.504661 0.630027 0.366328
+v -0.452467 0.719128 0.455429
+v -0.369438 0.795641 0.531942
+v -0.261232 0.854352 0.590652
+v -0.135224 0.891259 0.627559
+v 0.000000 0.903847 0.640148
+v 0.135224 0.891259 0.627559
+v 0.261232 0.854352 0.590652
+v 0.369438 0.795641 0.531942
+v 0.452467 0.719128 0.455429
+v 0.504661 0.630027 0.366328
+v 0.522464 0.534409 0.270710
+v 0.504661 0.438792 0.175093
+v 0.452467 0.349690 0.085991
+v 0.369438 0.273177 0.009478
+v 0.261232 0.214467 -0.049232
+v 0.135224 0.177560 -0.086139
+v -0.000000 0.164972 -0.098728
+v -0.135224 0.177560 -0.086139
+v -0.261232 0.214467 -0.049232
+v -0.369438 0.273177 0.009478
+v -0.452467 0.349690 0.085991
+v -0.504661 0.438792 0.175093
+v -0.522464 0.534409 0.270710
+v -0.538375 0.686999 0.322131
+v -0.482693 0.782053 0.417184
+v -0.394118 0.863677 0.498809
+v -0.278683 0.926310 0.561441
+v -0.144257 0.965683 0.600814
+v 0.000000 0.979112 0.614243
+v 0.144257 0.965683 0.600814
+v 0.278683 0.926310 0.561441
+v 0.394118 0.863677 0.498809
+v 0.482694 0.782053 0.417184
+v 0.538375 0.686999 0.322130
+v 0.557367 0.584994 0.220125
+v 0.538375 0.482989 0.118120
+v 0.482694 0.387935 0.023066
+v 0.394118 0.306311 -0.058558
+v 0.278683 0.243678 -0.121191
+v 0.144257 0.204305 -0.160563
+v -0.000000 0.190876 -0.173992
+v -0.144257 0.204305 -0.160563
+v -0.278683 0.243678 -0.121191
+v -0.394118 0.306311 -0.058558
+v -0.482694 0.387935 0.023067
+v -0.538375 0.482989 0.118120
+v -0.557367 0.584994 0.220125
+v -0.562876 0.745049 0.273365
+v -0.504661 0.844429 0.372744
+v -0.412054 0.929768 0.458084
+v -0.291366 0.995251 0.523567
+v -0.150822 1.036416 0.564731
+v 0.000000 1.050456 0.578771
+v 0.150822 1.036416 0.564731
+v 0.291366 0.995251 0.523567
+v 0.412054 0.929768 0.458084
+v 0.504661 0.844429 0.372744
+v 0.562877 0.745049 0.273365
+v 0.582733 0.638402 0.166717
+v 0.562877 0.531754 0.060070
+v 0.504661 0.432375 -0.039310
+v 0.412054 0.347036 -0.124649
+v 0.291366 0.281552 -0.190132
+v 0.150822 0.240388 -0.231296
+v -0.000000 0.226348 -0.245337
+v -0.150822 0.240388 -0.231296
+v -0.291366 0.281552 -0.190132
+v -0.412054 0.347036 -0.124649
+v -0.504662 0.432375 -0.039310
+v -0.562877 0.531754 0.060070
+v -0.582733 0.638402 0.166717
+v -0.577747 0.803185 0.220865
+v -0.517994 0.905190 0.322870
+v -0.422940 0.992783 0.410464
+v -0.299064 1.059997 0.477677
+v -0.154807 1.102248 0.519929
+v 0.000000 1.116660 0.534340
+v 0.154807 1.102249 0.519929
+v 0.299064 1.059997 0.477677
+v 0.422940 0.992784 0.410464
+v 0.517994 0.905190 0.322870
+v 0.577747 0.803185 0.220865
+v 0.598128 0.693719 0.111400
+v 0.577747 0.584254 0.001935
+v 0.517994 0.482249 -0.100070
+v 0.422940 0.394655 -0.187664
+v 0.299064 0.327442 -0.254877
+v 0.154807 0.285190 -0.297129
+v -0.000000 0.270779 -0.311540
+v -0.154807 0.285190 -0.297129
+v -0.299064 0.327442 -0.254877
+v -0.422941 0.394655 -0.187664
+v -0.517994 0.482249 -0.100070
+v -0.577748 0.584254 0.001935
+v -0.598128 0.693719 0.111400
+v -0.582733 0.860410 0.165529
+v -0.522464 0.963295 0.268414
+v -0.426590 1.051645 0.356764
+v -0.301645 1.119438 0.424557
+v -0.156143 1.162054 0.467173
+v -0.000000 1.176590 0.481709
+v 0.156143 1.162054 0.467173
+v 0.301645 1.119438 0.424557
+v 0.426590 1.051645 0.356764
+v 0.522464 0.963295 0.268414
+v 0.582733 0.860410 0.165529
+v 0.603289 0.750000 0.055119
+v 0.582733 0.639590 -0.055290
+v 0.522464 0.536705 -0.158176
+v 0.426590 0.448355 -0.246525
+v 0.301645 0.380562 -0.314318
+v 0.156143 0.337946 -0.356935
+v -0.000000 0.323410 -0.371471
+v -0.156143 0.337946 -0.356935
+v -0.301645 0.380562 -0.314318
+v -0.426590 0.448355 -0.246525
+v -0.522464 0.536705 -0.158176
+v -0.582733 0.639590 -0.055290
+v -0.603289 0.750000 0.055119
+v -0.577747 0.915745 0.108304
+v -0.517994 1.017751 0.210309
+v -0.422940 1.105345 0.297903
+v -0.299064 1.172558 0.365116
+v -0.154807 1.214810 0.407368
+v -0.000000 1.229221 0.421779
+v 0.154807 1.214810 0.407368
+v 0.299064 1.172558 0.365116
+v 0.422940 1.105345 0.297903
+v 0.517994 1.017751 0.210309
+v 0.577747 0.915745 0.108304
+v 0.598128 0.806280 -0.001161
+v 0.577747 0.696816 -0.110626
+v 0.517994 0.594810 -0.212631
+v 0.422940 0.507216 -0.300225
+v 0.299064 0.440003 -0.367438
+v 0.154807 0.397751 -0.409690
+v -0.000000 0.383340 -0.424102
+v -0.154807 0.397751 -0.409690
+v -0.299064 0.440003 -0.367438
+v -0.422941 0.507216 -0.300225
+v -0.517994 0.594810 -0.212631
+v -0.577748 0.696815 -0.110626
+v -0.598128 0.806280 -0.001161
+v -0.562877 0.968245 0.050169
+v -0.504661 1.067625 0.149548
+v -0.412054 1.152964 0.234888
+v -0.291366 1.218448 0.300371
+v -0.150822 1.259612 0.341535
+v -0.000000 1.273652 0.355575
+v 0.150822 1.259612 0.341535
+v 0.291366 1.218448 0.300371
+v 0.412054 1.152964 0.234888
+v 0.504661 1.067625 0.149548
+v 0.562877 0.968245 0.050169
+v 0.582733 0.861598 -0.056479
+v 0.562877 0.754951 -0.163126
+v 0.504661 0.655571 -0.262506
+v 0.412054 0.570232 -0.347845
+v 0.291366 0.504749 -0.413328
+v 0.150822 0.463584 -0.454493
+v -0.000000 0.449544 -0.468533
+v -0.150822 0.463584 -0.454493
+v -0.291366 0.504748 -0.413328
+v -0.412054 0.570232 -0.347845
+v -0.504662 0.655571 -0.262506
+v -0.562877 0.754950 -0.163126
+v -0.582733 0.861598 -0.056479
+v -0.538866 1.016367 -0.007051
+v -0.483134 1.111507 0.088090
+v -0.394478 1.193206 0.169789
+v -0.278938 1.255896 0.232479
+v -0.144389 1.295304 0.271887
+v -0.000000 1.308746 0.285328
+v 0.144389 1.295304 0.271887
+v 0.278938 1.255896 0.232479
+v 0.394478 1.193206 0.169789
+v 0.483134 1.111507 0.088090
+v 0.538866 1.016367 -0.007051
+v 0.557876 0.914268 -0.109149
+v 0.538866 0.812170 -0.211247
+v 0.483134 0.717029 -0.306388
+v 0.394478 0.635330 -0.388087
+v 0.278938 0.572641 -0.450777
+v 0.144389 0.533232 -0.490185
+v -0.000000 0.519791 -0.503627
+v -0.144389 0.533232 -0.490185
+v -0.278938 0.572641 -0.450777
+v -0.394478 0.635330 -0.388087
+v -0.483135 0.717029 -0.306388
+v -0.538867 0.812170 -0.211247
+v -0.557876 0.914268 -0.109149
+v -0.494373 1.059811 -0.067356
+v -0.443243 1.147096 0.019929
+v -0.361906 1.222050 0.094883
+v -0.255906 1.279563 0.152396
+v -0.132467 1.315718 0.188551
+v -0.000000 1.328050 0.200882
+v 0.132467 1.315718 0.188551
+v 0.255906 1.279563 0.152396
+v 0.361906 1.222050 0.094883
+v 0.443243 1.147096 0.019929
+v 0.494373 1.059811 -0.067356
+v 0.511813 0.966143 -0.161024
+v 0.494373 0.872475 -0.254692
+v 0.443243 0.785190 -0.341977
+v 0.361906 0.710237 -0.416930
+v 0.255906 0.652723 -0.474444
+v 0.132467 0.616568 -0.510599
+v -0.000000 0.604237 -0.522930
+v -0.132467 0.616568 -0.510599
+v -0.255907 0.652723 -0.474444
+v -0.361907 0.710237 -0.416930
+v -0.443243 0.785190 -0.341977
+v -0.494374 0.872475 -0.254692
+v -0.511813 0.966143 -0.161024
+v -0.461695 1.100647 -0.120574
+v -0.413945 1.182163 -0.039059
+v -0.337984 1.252162 0.030940
+v -0.238991 1.305874 0.084652
+v -0.123711 1.339638 0.118417
+v -0.000000 1.351155 0.129933
+v 0.123711 1.339638 0.118417
+v 0.238991 1.305874 0.084652
+v 0.337984 1.252162 0.030940
+v 0.413945 1.182163 -0.039059
+v 0.461695 1.100647 -0.120574
+v 0.477982 1.013170 -0.208051
+v 0.461695 0.925694 -0.295528
+v 0.413945 0.844178 -0.377043
+v 0.337984 0.774179 -0.447042
+v 0.238991 0.720467 -0.500754
+v 0.123711 0.686702 -0.534519
+v -0.000000 0.675186 -0.546036
+v -0.123711 0.686702 -0.534519
+v -0.238991 0.720467 -0.500754
+v -0.337985 0.774179 -0.447042
+v -0.413945 0.844178 -0.377043
+v -0.461696 0.925694 -0.295528
+v -0.477982 1.013170 -0.208051
+v -0.412054 1.132963 -0.171701
+v -0.369438 1.205714 -0.098950
+v -0.301645 1.268186 -0.036477
+v -0.213295 1.316123 0.011460
+v -0.110410 1.346258 0.041594
+v -0.000000 1.356536 0.051873
+v 0.110410 1.346258 0.041594
+v 0.213295 1.316123 0.011460
+v 0.301645 1.268186 -0.036477
+v 0.369438 1.205714 -0.098950
+v 0.412054 1.132963 -0.171701
+v 0.426590 1.054891 -0.249772
+v 0.412054 0.976820 -0.327843
+v 0.369438 0.904069 -0.400594
+v 0.301645 0.841596 -0.463067
+v 0.213295 0.793659 -0.511004
+v 0.110410 0.763525 -0.541138
+v -0.000000 0.753247 -0.551417
+v -0.110410 0.763525 -0.541138
+v -0.213295 0.793659 -0.511004
+v -0.301645 0.841596 -0.463067
+v -0.369438 0.904069 -0.400594
+v -0.412054 0.976820 -0.327843
+v -0.426590 1.054891 -0.249772
+v -0.363232 1.154773 -0.212012
+v -0.325665 1.218905 -0.147881
+v -0.265904 1.273975 -0.092811
+v -0.188023 1.316232 -0.050554
+v -0.097328 1.342796 -0.023990
+v -0.000000 1.351857 -0.014929
+v 0.097328 1.342796 -0.023990
+v 0.188023 1.316232 -0.050554
+v 0.265904 1.273975 -0.092811
+v 0.325665 1.218905 -0.147881
+v 0.363232 1.154774 -0.212012
+v 0.376045 1.085953 -0.280833
+v 0.363232 1.017132 -0.349654
+v 0.325665 0.953000 -0.413785
+v 0.265904 0.897930 -0.468856
+v 0.188023 0.855673 -0.511113
+v 0.097328 0.829109 -0.537677
+v -0.000000 0.820048 -0.546737
+v -0.097328 0.829109 -0.537677
+v -0.188023 0.855673 -0.511113
+v -0.265904 0.897930 -0.468856
+v -0.325665 0.953000 -0.413785
+v -0.363232 1.017132 -0.349654
+v -0.376045 1.085953 -0.280833
+v -0.291387 1.097960 -0.182264
+v -0.261250 1.149481 -0.130743
+v -0.213310 1.193723 -0.086501
+v -0.150833 1.227671 -0.052553
+v -0.078077 1.249012 -0.031212
+v -0.000000 1.256291 -0.023934
+v 0.078077 1.249012 -0.031212
+v 0.150833 1.227671 -0.052553
+v 0.213310 1.193723 -0.086501
+v 0.261250 1.149481 -0.130743
+v 0.291386 1.097960 -0.182264
+v 0.301666 1.042672 -0.237552
+v 0.291387 0.987383 -0.292841
+v 0.261250 0.935862 -0.344362
+v 0.213310 0.891620 -0.388604
+v 0.150833 0.857672 -0.422552
+v 0.078077 0.836332 -0.443892
+v -0.000000 0.829053 -0.451171
+v -0.078077 0.836332 -0.443892
+v -0.150833 0.857672 -0.422552
+v -0.213310 0.891620 -0.388604
+v -0.261250 0.935862 -0.344362
+v -0.291387 0.987383 -0.292841
+v -0.301666 1.042672 -0.237552
+v -0.247190 0.903772 -0.448233
+v -0.174790 0.864489 -0.487516
+v -0.090478 0.839795 -0.512210
+v -0.000000 0.831372 -0.520633
+v 0.090478 0.839795 -0.512210
+v 0.174790 0.864489 -0.487516
+v 0.247190 0.903772 -0.448233
+v 0.302745 0.954967 -0.397038
+v 0.337668 1.014585 -0.337420
+v 0.349580 1.078562 -0.273443
+v 0.337668 1.142540 -0.209465
+v 0.302745 1.202157 -0.149848
+v 0.247190 1.253352 -0.098653
+v 0.174790 1.292635 -0.059370
+v 0.090478 1.317330 -0.034675
+v -0.000000 1.325752 -0.026253
+v -0.090478 1.317330 -0.034676
+v -0.174790 1.292635 -0.059370
+v -0.247190 1.253352 -0.098653
+v -0.302745 1.202157 -0.149848
+v -0.337668 1.142540 -0.209465
+v -0.349580 1.078562 -0.273443
+v -0.337668 1.014585 -0.337420
+v -0.302745 0.954967 -0.397038
+v -0.513419 1.051671 -0.051998
+v -0.531530 0.954394 -0.149275
+v -0.513419 0.857117 -0.246552
+v -0.460319 0.766470 -0.337199
+v -0.375849 0.688629 -0.415040
+v -0.265765 0.628900 -0.474770
+v -0.137570 0.591352 -0.512317
+v -0.000000 0.578545 -0.525124
+v 0.137570 0.591352 -0.512317
+v 0.265765 0.628900 -0.474770
+v 0.375849 0.688629 -0.415040
+v 0.460319 0.766470 -0.337199
+v 0.513419 0.857117 -0.246552
+v 0.531530 0.954394 -0.149275
+v 0.513419 1.051671 -0.051998
+v 0.460319 1.142319 0.038649
+v 0.375849 1.220160 0.116490
+v 0.265765 1.279889 0.176219
+v 0.137570 1.317436 0.213767
+v -0.000000 1.330243 0.226574
+v -0.137570 1.317436 0.213767
+v -0.265765 1.279889 0.176219
+v -0.375849 1.220159 0.116490
+v -0.460319 1.142319 0.038649
+v -0.444489 1.158565 0.009478
+v -0.362924 1.233729 0.084642
+v -0.256626 1.291404 0.142318
+v -0.132839 1.327661 0.178574
+v -0.000000 1.340027 0.190940
+v 0.132839 1.327661 0.178574
+v 0.256626 1.291404 0.142318
+v 0.362924 1.233729 0.084642
+v 0.444489 1.158565 0.009478
+v 0.495763 1.071035 -0.078052
+v 0.513252 0.977103 -0.171984
+v 0.495764 0.883171 -0.265915
+v 0.444489 0.795641 -0.353446
+v 0.362924 0.720477 -0.428610
+v 0.256626 0.662801 -0.486285
+v 0.132839 0.626545 -0.522541
+v -0.000000 0.614179 -0.534908
+v -0.132840 0.626545 -0.522541
+v -0.256626 0.662801 -0.486285
+v -0.362924 0.720477 -0.428610
+v -0.444490 0.795641 -0.353446
+v -0.495764 0.883171 -0.265915
+v -0.513252 0.977103 -0.171983
+v -0.495763 1.071035 -0.078052
+v 0.260836 0.643318 -0.477114
+v 0.368877 0.701940 -0.418492
+v 0.451781 0.778337 -0.342095
+v 0.503896 0.867303 -0.253129
+v 0.521671 0.962776 -0.157656
+v 0.503896 1.058248 -0.062184
+v 0.451781 1.147214 0.026782
+v 0.368877 1.223612 0.103179
+v 0.260836 1.282233 0.161801
+v 0.135018 1.319084 0.198652
+v -0.000000 1.331653 0.211221
+v -0.135019 1.319084 0.198652
+v -0.260836 1.282233 0.161801
+v -0.368877 1.223612 0.103179
+v -0.451781 1.147214 0.026782
+v -0.503896 1.058248 -0.062184
+v -0.521672 0.962776 -0.157656
+v -0.503896 0.867303 -0.253129
+v -0.451781 0.778337 -0.342095
+v -0.368878 0.701940 -0.418492
+v -0.260836 0.643318 -0.477114
+v -0.135019 0.606467 -0.513965
+v -0.000000 0.593898 -0.526534
+v 0.135018 0.606467 -0.513965
+v 0.258307 0.653036 -0.480636
+v 0.365301 0.711089 -0.422583
+v 0.447401 0.786745 -0.346927
+v 0.499011 0.874849 -0.258823
+v 0.516614 0.969396 -0.164276
+v 0.499011 1.063943 -0.069730
+v 0.447401 1.152046 0.018374
+v 0.365301 1.227702 0.094030
+v 0.258307 1.285756 0.152084
+v 0.133709 1.322249 0.188577
+v -0.000000 1.334697 0.201025
+v -0.133709 1.322249 0.188577
+v -0.258307 1.285756 0.152084
+v -0.365301 1.227702 0.094030
+v -0.447401 1.152046 0.018374
+v -0.499011 1.063942 -0.069729
+v -0.516614 0.969396 -0.164276
+v -0.499011 0.874849 -0.258823
+v -0.447401 0.786745 -0.346927
+v -0.365301 0.711089 -0.422583
+v -0.258307 0.653036 -0.480636
+v -0.133710 0.616542 -0.517130
+v -0.000000 0.604094 -0.529577
+v 0.133709 0.616542 -0.517130
+v -0.024013 0.323332 0.490791
+v -0.016061 0.324680 0.492737
+v -0.013109 0.327227 0.495283
+v -0.009270 0.329181 0.497238
+v -0.004798 0.330409 0.498466
+v 0.000000 0.330828 0.498885
+v 0.004798 0.330409 0.498466
+v 0.009270 0.329181 0.497238
+v 0.013109 0.327227 0.495283
+v 0.016062 0.324680 0.492737
+v 0.024013 0.323332 0.490791
+v 0.018396 0.318531 0.486588
+v 0.024013 0.314329 0.481788
+v 0.016062 0.312383 0.480440
+v 0.013109 0.309836 0.477893
+v 0.009270 0.307882 0.475939
+v 0.004798 0.306653 0.474710
+v 0.000000 0.306234 0.474291
+v -0.004798 0.306653 0.474710
+v -0.009270 0.307882 0.475939
+v -0.013109 0.309836 0.477893
+v -0.016061 0.312383 0.480440
+v -0.024013 0.314329 0.481788
+v -0.018396 0.318531 0.486588
+v -0.019713 0.399774 0.412808
+v -0.013185 0.400893 0.414418
+v -0.010762 0.403004 0.416529
+v -0.007610 0.404623 0.418148
+v -0.003939 0.405641 0.419167
+v 0.000000 0.405989 0.419514
+v 0.003939 0.405641 0.419167
+v 0.007610 0.404623 0.418148
+v 0.010762 0.403004 0.416529
+v 0.013185 0.400893 0.414418
+v 0.019713 0.399774 0.412808
+v 0.015102 0.395797 0.409322
+v 0.019713 0.392312 0.405346
+v 0.013185 0.390701 0.404226
+v 0.010762 0.388591 0.402116
+v 0.007610 0.386971 0.400496
+v 0.003939 0.385953 0.399478
+v 0.000000 0.385606 0.399131
+v -0.003939 0.385953 0.399478
+v -0.007610 0.386971 0.400496
+v -0.010762 0.388591 0.402116
+v -0.013185 0.390701 0.404226
+v -0.019713 0.392312 0.405346
+v -0.015102 0.395797 0.409322
+v -0.004267 0.395367 0.409753
+v -0.003017 0.395367 0.409753
+v -0.001562 0.395367 0.409753
+v 0.000000 0.395367 0.409753
+v 0.001562 0.395367 0.409753
+v 0.003017 0.395367 0.409753
+v 0.004267 0.395367 0.409753
+v -0.089192 0.379058 -0.264576
+v -0.075333 0.381092 -0.270659
+v -0.086550 0.375003 -0.260525
+v -0.103499 0.377289 -0.257963
+v -0.091376 0.383242 -0.268764
+v -0.077045 0.384639 -0.274222
+v -0.072988 0.377715 -0.267298
+v -0.100474 0.372567 -0.253241
+v -0.106082 0.382140 -0.262815
+v -0.076591 0.363624 -0.249143
+v -0.064690 0.368057 -0.257624
+v -0.072555 0.360192 -0.245714
+v -0.088877 0.359380 -0.240055
+v -0.080233 0.367267 -0.252789
+v -0.067644 0.371170 -0.260753
+v -0.061192 0.365224 -0.254807
+v -0.084227 0.355373 -0.236047
+v -0.093148 0.363594 -0.244268
+v -0.058770 0.351023 -0.236541
+v -0.049639 0.357414 -0.246981
+v -0.053616 0.348446 -0.233968
+v -0.068198 0.344758 -0.225432
+v -0.063622 0.353875 -0.239397
+v -0.053634 0.359880 -0.249463
+v -0.045225 0.355317 -0.244900
+v -0.062239 0.341738 -0.222412
+v -0.073865 0.348046 -0.228720
+v -0.036945 0.342113 -0.227631
+v -0.031204 0.349888 -0.239455
+v -0.031024 0.340567 -0.226089
+v -0.042871 0.334418 -0.215092
+v -0.042675 0.343980 -0.229502
+v -0.035969 0.351539 -0.241121
+v -0.026177 0.348670 -0.238253
+v -0.036010 0.332592 -0.213266
+v -0.049549 0.336557 -0.217231
+v -0.012601 0.337501 -0.223019
+v -0.010643 0.345993 -0.235560
+v -0.006317 0.337091 -0.222613
+v -0.014622 0.329066 -0.209740
+v -0.018821 0.338255 -0.223777
+v -0.015853 0.346714 -0.236297
+v -0.005344 0.345736 -0.235319
+v -0.007327 0.328557 -0.209232
+v -0.021856 0.329910 -0.210584
+v 0.012601 0.337501 -0.223019
+v 0.010643 0.345993 -0.235560
+v 0.018821 0.338255 -0.223777
+v 0.014622 0.329066 -0.209740
+v 0.006317 0.337091 -0.222613
+v 0.005344 0.345736 -0.235319
+v 0.015853 0.346714 -0.236297
+v 0.021856 0.329910 -0.210584
+v 0.007327 0.328557 -0.209232
+v 0.036944 0.342113 -0.227631
+v 0.031204 0.349888 -0.239455
+v 0.042675 0.343980 -0.229502
+v 0.042871 0.334418 -0.215092
+v 0.031024 0.340567 -0.226089
+v 0.026176 0.348670 -0.238253
+v 0.035969 0.351539 -0.241121
+v 0.049549 0.336557 -0.217231
+v 0.036010 0.332592 -0.213266
+v 0.058770 0.351023 -0.236541
+v 0.049638 0.357414 -0.246981
+v 0.063622 0.353875 -0.239397
+v 0.068197 0.344758 -0.225432
+v 0.053616 0.348446 -0.233968
+v 0.045225 0.355317 -0.244900
+v 0.053634 0.359880 -0.249463
+v 0.073865 0.348046 -0.228720
+v 0.062239 0.341738 -0.222412
+v 0.076591 0.363624 -0.249143
+v 0.064690 0.368057 -0.257624
+v 0.080233 0.367267 -0.252789
+v 0.088877 0.359380 -0.240055
+v 0.072555 0.360192 -0.245714
+v 0.061192 0.365224 -0.254807
+v 0.067644 0.371170 -0.260753
+v 0.093147 0.363594 -0.244268
+v 0.084227 0.355373 -0.236047
+v 0.089192 0.379058 -0.264576
+v 0.075333 0.381092 -0.270659
+v 0.091376 0.383242 -0.268764
+v 0.103499 0.377289 -0.257963
+v 0.086549 0.375003 -0.260525
+v 0.072988 0.377715 -0.267298
+v 0.077045 0.384639 -0.274222
+v 0.106082 0.382140 -0.262815
+v 0.100474 0.372567 -0.253241
+v 0.095715 0.396271 -0.281789
+v 0.080842 0.395631 -0.285198
+v 0.096292 0.400713 -0.286235
+v 0.111068 0.397264 -0.277938
+v 0.094646 0.391871 -0.277393
+v 0.079811 0.391939 -0.281522
+v 0.081194 0.399370 -0.288953
+v 0.111788 0.402422 -0.283097
+v 0.109875 0.392149 -0.272823
+v 0.095715 0.414092 -0.299610
+v 0.080842 0.410683 -0.300250
+v 0.094646 0.418487 -0.304010
+v 0.111068 0.417943 -0.298617
+v 0.096292 0.409646 -0.295168
+v 0.081194 0.406928 -0.296510
+v 0.079811 0.414359 -0.303941
+v 0.109875 0.423057 -0.303732
+v 0.111788 0.412784 -0.293458
+v 0.089192 0.431305 -0.316823
+v 0.075333 0.425221 -0.314788
+v 0.086549 0.435355 -0.320877
+v 0.103499 0.437917 -0.318592
+v 0.091376 0.427116 -0.312638
+v 0.077045 0.421659 -0.311241
+v 0.072988 0.428583 -0.318166
+v 0.100474 0.442639 -0.323314
+v 0.106082 0.433066 -0.313740
+v 0.076591 0.446738 -0.332256
+v 0.064690 0.438257 -0.327824
+v 0.072555 0.450167 -0.335689
+v 0.088877 0.455826 -0.336500
+v 0.080233 0.443092 -0.328614
+v 0.067644 0.435128 -0.324711
+v 0.061192 0.441074 -0.330657
+v 0.084227 0.459834 -0.340508
+v 0.093147 0.451613 -0.332287
+v 0.058770 0.459339 -0.344857
+v 0.049638 0.448900 -0.338467
+v 0.053616 0.461912 -0.347434
+v 0.068197 0.470449 -0.351123
+v 0.063622 0.456484 -0.342006
+v 0.053634 0.446418 -0.336001
+v 0.045225 0.450981 -0.340563
+v 0.062239 0.473468 -0.354143
+v 0.073865 0.467160 -0.347835
+v 0.036944 0.468249 -0.353768
+v 0.031204 0.456425 -0.345992
+v 0.031024 0.469792 -0.355314
+v 0.042871 0.480788 -0.361462
+v 0.042675 0.466379 -0.351901
+v 0.035969 0.454759 -0.344342
+v 0.026176 0.457628 -0.347210
+v 0.036010 0.482615 -0.363289
+v 0.049549 0.478649 -0.359324
+v 0.012601 0.472862 -0.358380
+v 0.010643 0.460321 -0.349888
+v 0.006317 0.473268 -0.358790
+v 0.014622 0.486140 -0.366815
+v 0.018821 0.472104 -0.357626
+v 0.015853 0.459584 -0.349166
+v 0.005344 0.460562 -0.350145
+v 0.007327 0.486649 -0.367323
+v 0.021856 0.485296 -0.365971
+v -0.012601 0.472862 -0.358380
+v -0.010643 0.460321 -0.349888
+v -0.018821 0.472104 -0.357626
+v -0.014622 0.486140 -0.366815
+v -0.006317 0.473268 -0.358790
+v -0.005344 0.460562 -0.350145
+v -0.015853 0.459584 -0.349167
+v -0.021856 0.485296 -0.365971
+v -0.007327 0.486649 -0.367323
+v -0.036945 0.468249 -0.353768
+v -0.031204 0.456425 -0.345993
+v -0.042675 0.466379 -0.351901
+v -0.042871 0.480788 -0.361462
+v -0.031024 0.469792 -0.355314
+v -0.026177 0.457628 -0.347211
+v -0.035969 0.454759 -0.344342
+v -0.049549 0.478649 -0.359324
+v -0.036010 0.482615 -0.363289
+v -0.058770 0.459339 -0.344857
+v -0.049639 0.448900 -0.338467
+v -0.063622 0.456484 -0.342006
+v -0.068198 0.470449 -0.351123
+v -0.053616 0.461912 -0.347435
+v -0.045225 0.450981 -0.340564
+v -0.053634 0.446418 -0.336001
+v -0.073865 0.467160 -0.347835
+v -0.062239 0.473468 -0.354143
+v -0.076591 0.446738 -0.332256
+v -0.064690 0.438257 -0.327824
+v -0.080233 0.443092 -0.328614
+v -0.088877 0.455826 -0.336500
+v -0.072555 0.450167 -0.335689
+v -0.061192 0.441074 -0.330657
+v -0.067644 0.435128 -0.324711
+v -0.093148 0.451613 -0.332287
+v -0.084227 0.459834 -0.340508
+v -0.089192 0.431305 -0.316823
+v -0.075333 0.425221 -0.314788
+v -0.091376 0.427116 -0.312638
+v -0.103499 0.437917 -0.318592
+v -0.086550 0.435355 -0.320877
+v -0.072988 0.428583 -0.318166
+v -0.077045 0.421659 -0.311241
+v -0.106082 0.433066 -0.313740
+v -0.100474 0.442639 -0.323314
+v -0.095715 0.414092 -0.299610
+v -0.080843 0.410683 -0.300250
+v -0.096292 0.409646 -0.295168
+v -0.111068 0.417943 -0.298617
+v -0.094646 0.418487 -0.304010
+v -0.079811 0.414359 -0.303941
+v -0.081194 0.406928 -0.296510
+v -0.111788 0.412784 -0.293458
+v -0.109875 0.423057 -0.303732
+v -0.095715 0.396271 -0.281789
+v -0.080843 0.395631 -0.285198
+v -0.094646 0.391871 -0.277393
+v -0.111068 0.397264 -0.277938
+v -0.096292 0.400713 -0.286235
+v -0.081194 0.399370 -0.288953
+v -0.079811 0.391939 -0.281522
+v -0.109875 0.392149 -0.272823
+v -0.111788 0.402422 -0.283097
+v -0.146509 0.374194 -0.235864
+v -0.132309 0.374823 -0.243553
+v -0.142227 0.367509 -0.229180
+v -0.160552 0.373968 -0.227864
+v -0.150165 0.381061 -0.242731
+v -0.135611 0.381025 -0.249755
+v -0.128442 0.368787 -0.237517
+v -0.155860 0.366643 -0.220539
+v -0.164559 0.381493 -0.235389
+v -0.125810 0.348843 -0.210513
+v -0.113616 0.351929 -0.220659
+v -0.119228 0.343170 -0.204841
+v -0.137869 0.346187 -0.200083
+v -0.131856 0.354807 -0.216477
+v -0.119076 0.357315 -0.226045
+v -0.107672 0.346806 -0.215536
+v -0.130656 0.339970 -0.193867
+v -0.144494 0.352723 -0.206619
+v -0.096537 0.328144 -0.189814
+v -0.087181 0.333236 -0.201967
+v -0.088103 0.323869 -0.185540
+v -0.105791 0.323504 -0.177400
+v -0.104560 0.332799 -0.194469
+v -0.094426 0.337440 -0.206170
+v -0.079564 0.329376 -0.198106
+v -0.096548 0.318819 -0.172716
+v -0.114582 0.328605 -0.182501
+v -0.060686 0.313508 -0.175178
+v -0.054804 0.320019 -0.188749
+v -0.050974 0.310922 -0.172593
+v -0.066503 0.307465 -0.161361
+v -0.070139 0.316535 -0.178206
+v -0.063341 0.322753 -0.191483
+v -0.046034 0.317684 -0.186414
+v -0.055860 0.304631 -0.158528
+v -0.076862 0.310783 -0.164679
+v -0.020699 0.305931 -0.167602
+v -0.018693 0.313177 -0.181907
+v -0.010372 0.305211 -0.166882
+v -0.022683 0.299162 -0.153059
+v -0.030938 0.307126 -0.168796
+v -0.027939 0.314256 -0.182986
+v -0.009366 0.312527 -0.181257
+v -0.011366 0.298373 -0.152269
+v -0.033903 0.300471 -0.154368
+v 0.020699 0.305931 -0.167602
+v 0.018693 0.313177 -0.181907
+v 0.030938 0.307126 -0.168796
+v 0.022683 0.299162 -0.153059
+v 0.010371 0.305211 -0.166882
+v 0.009366 0.312527 -0.181257
+v 0.027939 0.314256 -0.182986
+v 0.033903 0.300471 -0.154368
+v 0.011366 0.298373 -0.152269
+v 0.060686 0.313508 -0.175178
+v 0.054804 0.320019 -0.188749
+v 0.070139 0.316535 -0.178206
+v 0.066503 0.307465 -0.161361
+v 0.050974 0.310922 -0.172593
+v 0.046033 0.317684 -0.186414
+v 0.063341 0.322753 -0.191483
+v 0.076862 0.310783 -0.164679
+v 0.055860 0.304631 -0.158528
+v 0.096537 0.328144 -0.189814
+v 0.087181 0.333236 -0.201967
+v 0.104560 0.332799 -0.194469
+v 0.105791 0.323504 -0.177400
+v 0.088103 0.323869 -0.185540
+v 0.079564 0.329376 -0.198106
+v 0.094426 0.337440 -0.206170
+v 0.114582 0.328605 -0.182501
+v 0.096548 0.318819 -0.172716
+v 0.125810 0.348843 -0.210513
+v 0.113616 0.351929 -0.220659
+v 0.131855 0.354807 -0.216478
+v 0.137869 0.346187 -0.200083
+v 0.119227 0.343170 -0.204841
+v 0.107672 0.346806 -0.215536
+v 0.119076 0.357315 -0.226045
+v 0.144494 0.352723 -0.206619
+v 0.130656 0.339970 -0.193867
+v 0.146509 0.374194 -0.235864
+v 0.132309 0.374823 -0.243553
+v 0.150165 0.381061 -0.242732
+v 0.160552 0.373968 -0.227864
+v 0.142227 0.367509 -0.229180
+v 0.128442 0.368787 -0.237517
+v 0.135611 0.381025 -0.249755
+v 0.164559 0.381493 -0.235390
+v 0.155860 0.366643 -0.220539
+v 0.157223 0.402469 -0.264139
+v 0.141985 0.400358 -0.269088
+v 0.158242 0.409771 -0.271442
+v 0.172294 0.404953 -0.258849
+v 0.155534 0.395229 -0.256899
+v 0.140459 0.393819 -0.262549
+v 0.142904 0.406952 -0.275683
+v 0.173409 0.412955 -0.266852
+v 0.170442 0.397019 -0.250915
+v 0.157223 0.431741 -0.293412
+v 0.141985 0.426793 -0.295523
+v 0.155534 0.438981 -0.300652
+v 0.172294 0.437031 -0.290928
+v 0.158242 0.424439 -0.286109
+v 0.142904 0.420198 -0.288928
+v 0.140459 0.433331 -0.302061
+v 0.170442 0.444965 -0.298862
+v 0.173409 0.429029 -0.282925
+v 0.146509 0.460016 -0.321687
+v 0.132309 0.452328 -0.321058
+v 0.142227 0.466701 -0.328371
+v 0.160552 0.468017 -0.321913
+v 0.150165 0.453149 -0.314820
+v 0.135611 0.446126 -0.314856
+v 0.128442 0.458364 -0.327094
+v 0.155860 0.475342 -0.329238
+v 0.164559 0.460491 -0.314388
+v 0.125810 0.485367 -0.347038
+v 0.113616 0.475221 -0.343952
+v 0.119227 0.491040 -0.352711
+v 0.137869 0.495797 -0.349694
+v 0.131855 0.479403 -0.341074
+v 0.119076 0.469835 -0.338565
+v 0.107672 0.480344 -0.349075
+v 0.130656 0.502014 -0.355910
+v 0.144494 0.489262 -0.343158
+v 0.096537 0.506066 -0.367737
+v 0.087181 0.493914 -0.362644
+v 0.088103 0.510341 -0.372012
+v 0.105791 0.518480 -0.372377
+v 0.104560 0.501412 -0.363082
+v 0.094426 0.489711 -0.358441
+v 0.079564 0.497775 -0.366505
+v 0.096548 0.523165 -0.377061
+v 0.114582 0.513380 -0.367276
+v 0.060686 0.520702 -0.382373
+v 0.054804 0.507132 -0.375862
+v 0.050974 0.523288 -0.384959
+v 0.066503 0.534520 -0.388416
+v 0.070139 0.517675 -0.379345
+v 0.063341 0.504398 -0.373128
+v 0.046033 0.509467 -0.378197
+v 0.055860 0.537353 -0.391249
+v 0.076862 0.531202 -0.385098
+v 0.020699 0.528279 -0.389949
+v 0.018693 0.513974 -0.382704
+v 0.010371 0.528999 -0.390669
+v 0.022683 0.542822 -0.396719
+v 0.030938 0.527084 -0.388755
+v 0.027939 0.512895 -0.381625
+v 0.009366 0.514624 -0.383354
+v 0.011366 0.543611 -0.397508
+v 0.033903 0.541513 -0.395410
+v -0.020699 0.528279 -0.389949
+v -0.018693 0.513974 -0.382704
+v -0.030938 0.527084 -0.388755
+v -0.022683 0.542822 -0.396719
+v -0.010372 0.528999 -0.390669
+v -0.009366 0.514624 -0.383354
+v -0.027939 0.512895 -0.381625
+v -0.033903 0.541513 -0.395410
+v -0.011366 0.543611 -0.397508
+v -0.060686 0.520702 -0.382373
+v -0.054804 0.507132 -0.375862
+v -0.070139 0.517675 -0.379345
+v -0.066503 0.534520 -0.388416
+v -0.050974 0.523288 -0.384959
+v -0.046034 0.509467 -0.378197
+v -0.063341 0.504398 -0.373128
+v -0.076862 0.531202 -0.385098
+v -0.055860 0.537353 -0.391249
+v -0.096538 0.506066 -0.367737
+v -0.087181 0.493914 -0.362644
+v -0.104560 0.501412 -0.363082
+v -0.105791 0.518480 -0.372377
+v -0.088103 0.510341 -0.372012
+v -0.079564 0.497775 -0.366505
+v -0.094426 0.489711 -0.358441
+v -0.114582 0.513380 -0.367276
+v -0.096548 0.523165 -0.377061
+v -0.125810 0.485367 -0.347038
+v -0.113616 0.475221 -0.343952
+v -0.131856 0.479403 -0.341074
+v -0.137869 0.495797 -0.349694
+v -0.119228 0.491040 -0.352711
+v -0.107672 0.480344 -0.349075
+v -0.119076 0.469835 -0.338565
+v -0.144494 0.489262 -0.343158
+v -0.130656 0.502014 -0.355910
+v -0.146509 0.460017 -0.321687
+v -0.132309 0.452328 -0.321058
+v -0.150165 0.453149 -0.314820
+v -0.160552 0.468017 -0.321913
+v -0.142227 0.466701 -0.328371
+v -0.128442 0.458364 -0.327094
+v -0.135611 0.446126 -0.314856
+v -0.164559 0.460491 -0.314388
+v -0.155860 0.475342 -0.329238
+v -0.157224 0.431741 -0.293412
+v -0.141985 0.426793 -0.295523
+v -0.158242 0.424439 -0.286109
+v -0.172294 0.437031 -0.290928
+v -0.155534 0.438981 -0.300652
+v -0.140459 0.433331 -0.302061
+v -0.142905 0.420198 -0.288928
+v -0.173410 0.429029 -0.282925
+v -0.170442 0.444965 -0.298862
+v -0.157223 0.402469 -0.264139
+v -0.141985 0.400358 -0.269088
+v -0.155534 0.395229 -0.256899
+v -0.172294 0.404953 -0.258849
+v -0.158242 0.409771 -0.271442
+v -0.142905 0.406952 -0.275683
+v -0.140459 0.393819 -0.262549
+v -0.170442 0.397019 -0.250915
+v -0.173410 0.412955 -0.266852
+v -0.201591 0.375711 -0.202080
+v -0.188108 0.374727 -0.210963
+v -0.195699 0.366514 -0.192883
+v -0.214858 0.377097 -0.192923
+v -0.206622 0.385160 -0.211530
+v -0.192802 0.383544 -0.219780
+v -0.182610 0.366145 -0.202381
+v -0.208579 0.367295 -0.183120
+v -0.220220 0.387168 -0.202994
+v -0.173110 0.340829 -0.167199
+v -0.161532 0.342178 -0.178414
+v -0.164053 0.333024 -0.159393
+v -0.184503 0.339920 -0.155745
+v -0.181428 0.349036 -0.175405
+v -0.169294 0.349836 -0.186072
+v -0.153080 0.334894 -0.171131
+v -0.174849 0.331600 -0.147426
+v -0.193369 0.348666 -0.164492
+v -0.132832 0.312349 -0.138718
+v -0.123948 0.315602 -0.151838
+v -0.121226 0.306467 -0.132836
+v -0.141574 0.309564 -0.125390
+v -0.143871 0.318753 -0.145122
+v -0.134248 0.321578 -0.157814
+v -0.113118 0.310113 -0.146350
+v -0.129204 0.303295 -0.119121
+v -0.153339 0.316390 -0.132216
+v -0.083502 0.292210 -0.118579
+v -0.077917 0.296810 -0.133046
+v -0.070138 0.288652 -0.115021
+v -0.088997 0.288100 -0.103926
+v -0.096508 0.296376 -0.122745
+v -0.090054 0.300697 -0.136934
+v -0.065447 0.293490 -0.129727
+v -0.074754 0.284308 -0.100134
+v -0.102860 0.292540 -0.108366
+v -0.028481 0.281785 -0.108154
+v -0.026576 0.287082 -0.123319
+v -0.014271 0.280794 -0.107163
+v -0.030355 0.276989 -0.092815
+v -0.042569 0.283428 -0.109798
+v -0.039722 0.288616 -0.124852
+v -0.013316 0.286158 -0.122394
+v -0.015210 0.275933 -0.091759
+v -0.045371 0.278741 -0.094567
+v 0.028481 0.281785 -0.108154
+v 0.026576 0.287082 -0.123319
+v 0.042569 0.283428 -0.109798
+v 0.030355 0.276989 -0.092815
+v 0.014271 0.280794 -0.107163
+v 0.013316 0.286158 -0.122394
+v 0.039722 0.288616 -0.124852
+v 0.045371 0.278741 -0.094567
+v 0.015210 0.275933 -0.091759
+v 0.083502 0.292210 -0.118579
+v 0.077917 0.296810 -0.133046
+v 0.096508 0.296376 -0.122745
+v 0.088997 0.288100 -0.103926
+v 0.070138 0.288652 -0.115021
+v 0.065447 0.293490 -0.129727
+v 0.090054 0.300697 -0.136934
+v 0.102860 0.292540 -0.108366
+v 0.074754 0.284308 -0.100134
+v 0.132832 0.312349 -0.138718
+v 0.123948 0.315602 -0.151838
+v 0.143871 0.318753 -0.145122
+v 0.141574 0.309564 -0.125390
+v 0.121226 0.306467 -0.132836
+v 0.113118 0.310113 -0.146350
+v 0.134248 0.321578 -0.157814
+v 0.153339 0.316390 -0.132216
+v 0.129204 0.303295 -0.119121
+v 0.173110 0.340829 -0.167199
+v 0.161532 0.342178 -0.178414
+v 0.181428 0.349036 -0.175405
+v 0.184503 0.339920 -0.155745
+v 0.164053 0.333024 -0.159393
+v 0.153080 0.334894 -0.171131
+v 0.169294 0.349835 -0.186072
+v 0.193369 0.348666 -0.164492
+v 0.174849 0.331600 -0.147426
+v 0.201591 0.375711 -0.202080
+v 0.188108 0.374727 -0.210963
+v 0.206622 0.385160 -0.211530
+v 0.214858 0.377097 -0.192923
+v 0.195699 0.366514 -0.192883
+v 0.182610 0.366145 -0.202381
+v 0.192802 0.383544 -0.219780
+v 0.220220 0.387168 -0.202994
+v 0.208579 0.367295 -0.183120
+v 0.216333 0.414617 -0.240986
+v 0.201865 0.411030 -0.247266
+v 0.217735 0.424665 -0.251034
+v 0.230571 0.418563 -0.234389
+v 0.214009 0.404655 -0.231024
+v 0.199695 0.401734 -0.237971
+v 0.203172 0.420406 -0.256642
+v 0.232064 0.429272 -0.245098
+v 0.228094 0.407946 -0.223771
+v 0.216333 0.454895 -0.281264
+v 0.201865 0.448614 -0.284851
+v 0.214009 0.464857 -0.291226
+v 0.230571 0.461492 -0.277318
+v 0.217735 0.444847 -0.271216
+v 0.203172 0.439238 -0.275475
+v 0.199695 0.457910 -0.294146
+v 0.228094 0.472110 -0.287935
+v 0.232064 0.450783 -0.266608
+v 0.201591 0.493800 -0.320170
+v 0.188108 0.484918 -0.321154
+v 0.195699 0.502997 -0.329367
+v 0.214858 0.502958 -0.318784
+v 0.206622 0.484351 -0.310720
+v 0.192802 0.476100 -0.312337
+v 0.182610 0.493500 -0.329736
+v 0.208579 0.512761 -0.328586
+v 0.220220 0.492887 -0.308713
+v 0.173110 0.528682 -0.355051
+v 0.161532 0.517466 -0.353703
+v 0.164053 0.536488 -0.362857
+v 0.184503 0.540135 -0.355961
+v 0.181428 0.520476 -0.346845
+v 0.169294 0.509809 -0.346045
+v 0.153080 0.524750 -0.360986
+v 0.174849 0.548455 -0.364280
+v 0.193369 0.531389 -0.347215
+v 0.132832 0.557163 -0.383532
+v 0.123948 0.544042 -0.380279
+v 0.121226 0.563045 -0.389414
+v 0.141574 0.570491 -0.386316
+v 0.143871 0.550758 -0.377128
+v 0.134248 0.538066 -0.374303
+v 0.113118 0.549531 -0.385767
+v 0.129204 0.576760 -0.392585
+v 0.153339 0.563665 -0.379490
+v 0.083502 0.577302 -0.403671
+v 0.077917 0.562834 -0.399071
+v 0.070138 0.580859 -0.407229
+v 0.088997 0.591955 -0.407781
+v 0.096508 0.573136 -0.399505
+v 0.090054 0.558947 -0.395184
+v 0.065447 0.566154 -0.402390
+v 0.074754 0.595747 -0.411572
+v 0.102860 0.587515 -0.403341
+v 0.028481 0.587727 -0.414096
+v 0.026576 0.572562 -0.408798
+v 0.014271 0.588717 -0.415087
+v 0.030355 0.603066 -0.418891
+v 0.042569 0.586083 -0.412452
+v 0.039722 0.571028 -0.407265
+v 0.013316 0.573486 -0.409723
+v 0.015210 0.604122 -0.419947
+v 0.045371 0.601314 -0.417140
+v -0.028481 0.587727 -0.414096
+v -0.026576 0.572562 -0.408798
+v -0.042569 0.586083 -0.412452
+v -0.030355 0.603066 -0.418891
+v -0.014271 0.588717 -0.415087
+v -0.013316 0.573486 -0.409723
+v -0.039722 0.571028 -0.407265
+v -0.045371 0.601314 -0.417140
+v -0.015210 0.604122 -0.419947
+v -0.083502 0.577302 -0.403671
+v -0.077917 0.562834 -0.399071
+v -0.096508 0.573136 -0.399505
+v -0.088997 0.591955 -0.407781
+v -0.070138 0.580859 -0.407229
+v -0.065447 0.566154 -0.402390
+v -0.090054 0.558947 -0.395183
+v -0.102860 0.587515 -0.403341
+v -0.074755 0.595747 -0.411572
+v -0.132832 0.557163 -0.383532
+v -0.123948 0.544042 -0.380279
+v -0.143871 0.550758 -0.377128
+v -0.141574 0.570491 -0.386316
+v -0.121226 0.563045 -0.389414
+v -0.113118 0.549531 -0.385767
+v -0.134248 0.538066 -0.374303
+v -0.153339 0.563665 -0.379490
+v -0.129205 0.576760 -0.392585
+v -0.173110 0.528682 -0.355051
+v -0.161532 0.517466 -0.353703
+v -0.181428 0.520476 -0.346845
+v -0.184503 0.540135 -0.355961
+v -0.164053 0.536488 -0.362857
+v -0.153080 0.524750 -0.360986
+v -0.169294 0.509809 -0.346045
+v -0.193369 0.531389 -0.347214
+v -0.174849 0.548455 -0.364280
+v -0.201591 0.493800 -0.320170
+v -0.188108 0.484918 -0.321154
+v -0.206622 0.484351 -0.310720
+v -0.214858 0.502958 -0.318784
+v -0.195699 0.502997 -0.329367
+v -0.182610 0.493500 -0.329736
+v -0.192803 0.476100 -0.312337
+v -0.220220 0.492887 -0.308712
+v -0.208579 0.512761 -0.328586
+v -0.216334 0.454895 -0.281264
+v -0.201865 0.448614 -0.284851
+v -0.217735 0.444847 -0.271216
+v -0.230571 0.461492 -0.277318
+v -0.214009 0.464857 -0.291226
+v -0.199696 0.457910 -0.294146
+v -0.203172 0.439238 -0.275475
+v -0.232064 0.450783 -0.266608
+v -0.228094 0.472110 -0.287935
+v -0.216334 0.414617 -0.240986
+v -0.201865 0.411030 -0.247266
+v -0.214009 0.404655 -0.231024
+v -0.230571 0.418563 -0.234389
+v -0.217735 0.424665 -0.251034
+v -0.203172 0.420406 -0.256642
+v -0.199696 0.401734 -0.237971
+v -0.228094 0.407946 -0.223771
+v -0.232064 0.429273 -0.245098
+v -0.253223 0.383650 -0.163896
+v -0.240688 0.381069 -0.173820
+v -0.245823 0.372097 -0.152343
+v -0.265488 0.386624 -0.153737
+v -0.259543 0.395519 -0.175765
+v -0.246695 0.392351 -0.185102
+v -0.233654 0.370088 -0.162839
+v -0.257729 0.374512 -0.141625
+v -0.272114 0.399069 -0.166182
+v -0.217448 0.339834 -0.120080
+v -0.206684 0.339422 -0.132173
+v -0.206071 0.330029 -0.110275
+v -0.227979 0.340686 -0.107799
+v -0.227897 0.350142 -0.130388
+v -0.216615 0.349220 -0.141971
+v -0.195870 0.330102 -0.122854
+v -0.216051 0.330407 -0.097520
+v -0.238934 0.351494 -0.118607
+v -0.166854 0.304059 -0.084305
+v -0.158594 0.305417 -0.098169
+v -0.152275 0.296670 -0.076916
+v -0.174935 0.303178 -0.070291
+v -0.180720 0.312103 -0.092349
+v -0.171774 0.313064 -0.105815
+v -0.144737 0.298395 -0.091146
+v -0.159650 0.295432 -0.062545
+v -0.189472 0.311613 -0.078726
+v -0.104889 0.278761 -0.059007
+v -0.099696 0.281372 -0.074124
+v -0.088103 0.274293 -0.054539
+v -0.109969 0.276656 -0.043769
+v -0.121227 0.283995 -0.064240
+v -0.115226 0.286346 -0.079098
+v -0.083741 0.277125 -0.069876
+v -0.092370 0.271971 -0.039084
+v -0.127098 0.282142 -0.049255
+v -0.035776 0.265667 -0.045913
+v -0.034005 0.268926 -0.061677
+v -0.017926 0.264422 -0.044668
+v -0.037508 0.262927 -0.030040
+v -0.053472 0.267731 -0.047977
+v -0.050825 0.270888 -0.063640
+v -0.017039 0.267743 -0.060495
+v -0.018794 0.261622 -0.028735
+v -0.056062 0.265091 -0.032204
+v 0.035775 0.265667 -0.045913
+v 0.034004 0.268926 -0.061677
+v 0.053472 0.267731 -0.047977
+v 0.037508 0.262927 -0.030040
+v 0.017926 0.264422 -0.044668
+v 0.017039 0.267743 -0.060495
+v 0.050825 0.270888 -0.063640
+v 0.056062 0.265091 -0.032204
+v 0.018794 0.261622 -0.028735
+v 0.104888 0.278761 -0.059007
+v 0.099696 0.281372 -0.074124
+v 0.121227 0.283994 -0.064240
+v 0.109969 0.276656 -0.043769
+v 0.088103 0.274293 -0.054539
+v 0.083741 0.277125 -0.069876
+v 0.115226 0.286346 -0.079098
+v 0.127098 0.282142 -0.049255
+v 0.092370 0.271971 -0.039084
+v 0.166854 0.304059 -0.084305
+v 0.158594 0.305417 -0.098169
+v 0.180720 0.312103 -0.092349
+v 0.174935 0.303178 -0.070291
+v 0.152275 0.296670 -0.076916
+v 0.144737 0.298394 -0.091146
+v 0.171773 0.313064 -0.105815
+v 0.189472 0.311613 -0.078726
+v 0.159650 0.295432 -0.062545
+v 0.217448 0.339834 -0.120080
+v 0.206684 0.339422 -0.132173
+v 0.227897 0.350142 -0.130388
+v 0.227979 0.340686 -0.107799
+v 0.206071 0.330029 -0.110275
+v 0.195870 0.330102 -0.122854
+v 0.216615 0.349220 -0.141971
+v 0.238934 0.351494 -0.118607
+v 0.216051 0.330407 -0.097520
+v 0.253223 0.383650 -0.163896
+v 0.240688 0.381069 -0.173820
+v 0.259543 0.395519 -0.175765
+v 0.265488 0.386624 -0.153737
+v 0.245823 0.372097 -0.152343
+v 0.233654 0.370088 -0.162839
+v 0.246695 0.392350 -0.185102
+v 0.272113 0.399069 -0.166182
+v 0.257729 0.374512 -0.141625
+v 0.271742 0.432520 -0.212766
+v 0.258290 0.427520 -0.220271
+v 0.273502 0.445142 -0.225388
+v 0.284903 0.437862 -0.204975
+v 0.268822 0.420007 -0.200253
+v 0.255515 0.415626 -0.208377
+v 0.259963 0.439517 -0.232268
+v 0.286748 0.451094 -0.218207
+v 0.281842 0.424742 -0.191855
+v 0.271742 0.483114 -0.263361
+v 0.258290 0.475609 -0.268361
+v 0.268822 0.495628 -0.275874
+v 0.284903 0.490906 -0.258019
+v 0.273502 0.470493 -0.250739
+v 0.259963 0.463613 -0.256364
+v 0.255515 0.487504 -0.280255
+v 0.281842 0.504026 -0.271139
+v 0.286748 0.477673 -0.244786
+v 0.253223 0.531985 -0.312231
+v 0.240688 0.522060 -0.314812
+v 0.245823 0.543538 -0.323784
+v 0.265488 0.542143 -0.309256
+v 0.259543 0.520115 -0.300361
+v 0.246695 0.510779 -0.303530
+v 0.233654 0.533041 -0.325793
+v 0.257729 0.554256 -0.321369
+v 0.272113 0.529699 -0.296812
+v 0.217448 0.575801 -0.356047
+v 0.206684 0.563707 -0.356459
+v 0.206071 0.585605 -0.365852
+v 0.227979 0.588081 -0.355195
+v 0.227897 0.565492 -0.345738
+v 0.216615 0.553909 -0.346661
+v 0.195870 0.573027 -0.365778
+v 0.216051 0.598361 -0.365474
+v 0.238934 0.577274 -0.344387
+v 0.166854 0.611576 -0.391822
+v 0.158594 0.597712 -0.390464
+v 0.152275 0.618965 -0.399211
+v 0.174935 0.625590 -0.392703
+v 0.180720 0.603531 -0.383777
+v 0.171773 0.590065 -0.382817
+v 0.144737 0.604735 -0.397486
+v 0.159650 0.633336 -0.400449
+v 0.189472 0.617155 -0.384268
+v 0.104888 0.636873 -0.417119
+v 0.099696 0.621757 -0.414508
+v 0.088103 0.641342 -0.421588
+v 0.109969 0.652112 -0.419225
+v 0.121227 0.631640 -0.411886
+v 0.115226 0.616783 -0.409534
+v 0.083741 0.626004 -0.418756
+v 0.092370 0.656797 -0.423910
+v 0.127098 0.646625 -0.413739
+v 0.035775 0.649968 -0.430214
+v 0.034004 0.634203 -0.426955
+v 0.017926 0.651212 -0.431459
+v 0.037508 0.665841 -0.432954
+v 0.053472 0.647903 -0.428149
+v 0.050825 0.632241 -0.424993
+v 0.017038 0.635386 -0.428138
+v 0.018794 0.667146 -0.434259
+v 0.056062 0.663676 -0.430789
+v -0.035776 0.649968 -0.430214
+v -0.034005 0.634203 -0.426955
+v -0.053472 0.647903 -0.428149
+v -0.037508 0.665841 -0.432954
+v -0.017926 0.651212 -0.431459
+v -0.017039 0.635386 -0.428138
+v -0.050825 0.632241 -0.424992
+v -0.056062 0.663676 -0.430789
+v -0.018794 0.667146 -0.434259
+v -0.104889 0.636873 -0.417119
+v -0.099696 0.621757 -0.414508
+v -0.121227 0.631640 -0.411886
+v -0.109969 0.652112 -0.419225
+v -0.088103 0.641342 -0.421588
+v -0.083741 0.626004 -0.418756
+v -0.115226 0.616783 -0.409534
+v -0.127098 0.646625 -0.413739
+v -0.092370 0.656797 -0.423910
+v -0.166854 0.611576 -0.391822
+v -0.158594 0.597712 -0.390464
+v -0.180720 0.603531 -0.383777
+v -0.174935 0.625590 -0.392703
+v -0.152275 0.618965 -0.399211
+v -0.144737 0.604735 -0.397486
+v -0.171774 0.590065 -0.382817
+v -0.189472 0.617155 -0.384268
+v -0.159651 0.633336 -0.400449
+v -0.217448 0.575801 -0.356047
+v -0.206684 0.563707 -0.356459
+v -0.227897 0.565492 -0.345738
+v -0.227980 0.588081 -0.355195
+v -0.206071 0.585605 -0.365851
+v -0.195870 0.573027 -0.365778
+v -0.216615 0.553909 -0.346661
+v -0.238935 0.577274 -0.344387
+v -0.216051 0.598361 -0.365474
+v -0.253223 0.531985 -0.312231
+v -0.240688 0.522060 -0.314812
+v -0.259543 0.520115 -0.300361
+v -0.265488 0.542143 -0.309256
+v -0.245823 0.543538 -0.323784
+v -0.233654 0.533041 -0.325793
+v -0.246695 0.510779 -0.303530
+v -0.272114 0.529699 -0.296812
+v -0.257729 0.554256 -0.321369
+v -0.271742 0.483114 -0.263361
+v -0.258290 0.475609 -0.268361
+v -0.273502 0.470493 -0.250739
+v -0.284903 0.490906 -0.258019
+v -0.268822 0.495628 -0.275874
+v -0.255515 0.487504 -0.280255
+v -0.259963 0.463613 -0.256364
+v -0.286749 0.477673 -0.244786
+v -0.281842 0.504026 -0.271139
+v -0.271742 0.432520 -0.212766
+v -0.258290 0.427520 -0.220271
+v -0.268822 0.420007 -0.200253
+v -0.284903 0.437862 -0.204975
+v -0.273502 0.445142 -0.225388
+v -0.259963 0.439517 -0.232268
+v -0.255515 0.415626 -0.208377
+v -0.281842 0.424742 -0.191855
+v -0.286749 0.451094 -0.218207
+v -0.300523 0.397874 -0.121964
+v -0.289150 0.393740 -0.132760
+v -0.291740 0.384163 -0.108253
+v -0.311575 0.402386 -0.110978
+v -0.308023 0.411961 -0.136051
+v -0.296367 0.407294 -0.146314
+v -0.280700 0.380548 -0.119568
+v -0.302469 0.388171 -0.096763
+v -0.319351 0.416991 -0.125583
+v -0.258065 0.345874 -0.069964
+v -0.248299 0.343708 -0.082728
+v -0.244563 0.334238 -0.058328
+v -0.267555 0.348474 -0.057066
+v -0.270466 0.358108 -0.082198
+v -0.260230 0.355479 -0.094499
+v -0.235308 0.332512 -0.071532
+v -0.253556 0.336409 -0.045002
+v -0.280412 0.361157 -0.069750
+v -0.198020 0.303416 -0.027506
+v -0.190526 0.302857 -0.041876
+v -0.180719 0.294647 -0.018737
+v -0.205302 0.304454 -0.013046
+v -0.214476 0.312963 -0.037053
+v -0.206360 0.312043 -0.051063
+v -0.173880 0.294420 -0.033440
+v -0.187365 0.295363 -0.003955
+v -0.222364 0.314353 -0.022945
+v -0.124481 0.273394 0.002517
+v -0.119770 0.273970 -0.012990
+v -0.104559 0.268090 0.007820
+v -0.129058 0.273328 0.018080
+v -0.143871 0.279604 -0.003694
+v -0.138426 0.279946 -0.018966
+v -0.100603 0.268868 -0.007887
+v -0.108405 0.267829 0.023578
+v -0.149162 0.279767 0.011641
+v -0.042458 0.257853 0.018057
+v -0.040851 0.259018 0.001962
+v -0.021274 0.256376 0.019534
+v -0.044019 0.257215 0.034192
+v -0.063461 0.260303 0.015607
+v -0.061059 0.261375 -0.000395
+v -0.020469 0.257597 0.003383
+v -0.022057 0.255684 0.035723
+v -0.065794 0.259756 0.031652
+v 0.042458 0.257853 0.018057
+v 0.040851 0.259018 0.001962
+v 0.063461 0.260303 0.015607
+v 0.044019 0.257215 0.034192
+v 0.021274 0.256376 0.019534
+v 0.020469 0.257597 0.003383
+v 0.061059 0.261375 -0.000395
+v 0.065794 0.259756 0.031652
+v 0.022057 0.255684 0.035723
+v 0.124481 0.273394 0.002517
+v 0.119770 0.273970 -0.012990
+v 0.143871 0.279604 -0.003694
+v 0.129058 0.273328 0.018080
+v 0.104559 0.268090 0.007820
+v 0.100602 0.268868 -0.007887
+v 0.138426 0.279946 -0.018966
+v 0.149161 0.279767 0.011641
+v 0.108404 0.267829 0.023579
+v 0.198020 0.303416 -0.027506
+v 0.190526 0.302857 -0.041876
+v 0.214476 0.312963 -0.037053
+v 0.205302 0.304454 -0.013046
+v 0.180719 0.294647 -0.018737
+v 0.173880 0.294420 -0.033440
+v 0.206360 0.312043 -0.051063
+v 0.222364 0.314353 -0.022945
+v 0.187365 0.295363 -0.003955
+v 0.258065 0.345874 -0.069964
+v 0.248299 0.343708 -0.082728
+v 0.270466 0.358108 -0.082198
+v 0.267555 0.348473 -0.057066
+v 0.244563 0.334238 -0.058328
+v 0.235308 0.332512 -0.071532
+v 0.260230 0.355479 -0.094499
+v 0.280412 0.361157 -0.069750
+v 0.253556 0.336409 -0.045002
+v 0.300523 0.397874 -0.121964
+v 0.289150 0.393740 -0.132760
+v 0.308023 0.411961 -0.136051
+v 0.311575 0.402386 -0.110978
+v 0.291740 0.384163 -0.108253
+v 0.280700 0.380548 -0.119568
+v 0.296367 0.407294 -0.146314
+v 0.319351 0.416991 -0.125583
+v 0.302469 0.388171 -0.096763
+v 0.322501 0.455873 -0.179963
+v 0.310296 0.449544 -0.188564
+v 0.324590 0.470852 -0.194942
+v 0.334361 0.462518 -0.171110
+v 0.319036 0.441022 -0.165112
+v 0.306962 0.435255 -0.174275
+v 0.312306 0.463956 -0.202976
+v 0.336526 0.478048 -0.186640
+v 0.330768 0.447121 -0.155713
+v 0.322501 0.515918 -0.240008
+v 0.310296 0.507317 -0.246337
+v 0.319036 0.530769 -0.254859
+v 0.334361 0.524771 -0.233363
+v 0.324590 0.500939 -0.225029
+v 0.312306 0.492904 -0.231924
+v 0.306962 0.521606 -0.260626
+v 0.330768 0.540168 -0.248760
+v 0.336526 0.509241 -0.217833
+v 0.300523 0.573917 -0.298007
+v 0.289150 0.563120 -0.302141
+v 0.291740 0.587627 -0.311717
+v 0.311575 0.584902 -0.293495
+v 0.308023 0.559830 -0.283920
+v 0.296367 0.549567 -0.288587
+v 0.280700 0.576312 -0.315332
+v 0.302469 0.599117 -0.307710
+v 0.319351 0.570298 -0.278890
+v 0.258065 0.625917 -0.350007
+v 0.248299 0.613153 -0.352173
+v 0.244563 0.637553 -0.361643
+v 0.267555 0.638815 -0.347407
+v 0.270466 0.613683 -0.337773
+v 0.260230 0.601382 -0.340402
+v 0.235308 0.624349 -0.363369
+v 0.253556 0.650879 -0.359471
+v 0.280412 0.626131 -0.334724
+v 0.198020 0.668375 -0.392465
+v 0.190526 0.654004 -0.393024
+v 0.180719 0.677144 -0.401234
+v 0.205302 0.682834 -0.391427
+v 0.214476 0.658827 -0.382917
+v 0.206360 0.644818 -0.383838
+v 0.173880 0.662441 -0.401461
+v 0.187365 0.691925 -0.400518
+v 0.222364 0.672936 -0.381528
+v 0.124481 0.698397 -0.422487
+v 0.119770 0.682890 -0.421910
+v 0.104559 0.703701 -0.427791
+v 0.129058 0.713961 -0.422553
+v 0.143871 0.692187 -0.416277
+v 0.138426 0.676915 -0.415935
+v 0.100602 0.687993 -0.427013
+v 0.108405 0.719459 -0.428052
+v 0.149161 0.707522 -0.416114
+v 0.042458 0.713938 -0.438028
+v 0.040851 0.697843 -0.436863
+v 0.021274 0.715415 -0.439505
+v 0.044019 0.730073 -0.438665
+v 0.063461 0.711488 -0.435578
+v 0.061059 0.695485 -0.434506
+v 0.020469 0.699264 -0.438284
+v 0.022057 0.731604 -0.440197
+v 0.065794 0.727533 -0.436125
+v -0.042458 0.713938 -0.438028
+v -0.040851 0.697843 -0.436863
+v -0.063461 0.711488 -0.435578
+v -0.044020 0.730073 -0.438665
+v -0.021274 0.715415 -0.439505
+v -0.020469 0.699264 -0.438284
+v -0.061059 0.695485 -0.434505
+v -0.065794 0.727533 -0.436125
+v -0.022057 0.731604 -0.440197
+v -0.124481 0.698397 -0.422487
+v -0.119770 0.682890 -0.421910
+v -0.143871 0.692187 -0.416277
+v -0.129059 0.713961 -0.422553
+v -0.104560 0.703701 -0.427791
+v -0.100603 0.687993 -0.427013
+v -0.138426 0.676915 -0.415935
+v -0.149162 0.707522 -0.416114
+v -0.108405 0.719459 -0.428052
+v -0.198020 0.668375 -0.392465
+v -0.190527 0.654004 -0.393024
+v -0.214477 0.658828 -0.382917
+v -0.205302 0.682834 -0.391427
+v -0.180719 0.677144 -0.401234
+v -0.173880 0.662441 -0.401461
+v -0.206360 0.644818 -0.383838
+v -0.222364 0.672936 -0.381528
+v -0.187365 0.691925 -0.400518
+v -0.258065 0.625917 -0.350007
+v -0.248299 0.613153 -0.352173
+v -0.270466 0.613683 -0.337773
+v -0.267555 0.638815 -0.347407
+v -0.244563 0.637553 -0.361643
+v -0.235308 0.624349 -0.363369
+v -0.260230 0.601382 -0.340402
+v -0.280412 0.626131 -0.334723
+v -0.253557 0.650879 -0.359471
+v -0.300523 0.573917 -0.298007
+v -0.289150 0.563120 -0.302140
+v -0.308024 0.559830 -0.283920
+v -0.311575 0.584902 -0.293495
+v -0.291740 0.587627 -0.311717
+v -0.280700 0.576312 -0.315332
+v -0.296367 0.549567 -0.288587
+v -0.319351 0.570298 -0.278890
+v -0.302469 0.599117 -0.307710
+v -0.322501 0.515918 -0.240008
+v -0.310297 0.507317 -0.246337
+v -0.324590 0.500939 -0.225028
+v -0.334361 0.524771 -0.233363
+v -0.319036 0.530769 -0.254859
+v -0.306962 0.521606 -0.260626
+v -0.312306 0.492904 -0.231924
+v -0.336526 0.509241 -0.217833
+v -0.330768 0.540168 -0.248760
+v -0.322501 0.455873 -0.179963
+v -0.310296 0.449544 -0.188564
+v -0.319036 0.441022 -0.165112
+v -0.334361 0.462518 -0.171110
+v -0.324590 0.470852 -0.194942
+v -0.312306 0.463956 -0.202976
+v -0.306962 0.435255 -0.174275
+v -0.330768 0.447121 -0.155713
+v -0.336526 0.478048 -0.186640
+v -0.342681 0.418141 -0.077002
+v -0.332665 0.412525 -0.088486
+v -0.332666 0.402506 -0.061368
+v -0.352331 0.424113 -0.065378
+v -0.351233 0.434203 -0.093065
+v -0.340967 0.428118 -0.104079
+v -0.322942 0.397348 -0.073308
+v -0.342033 0.408038 -0.049303
+v -0.361124 0.440628 -0.081892
+v -0.294267 0.358846 -0.017707
+v -0.285666 0.354963 -0.030924
+v -0.278871 0.345577 -0.004439
+v -0.302553 0.363148 -0.004413
+v -0.308407 0.372796 -0.031657
+v -0.299393 0.368505 -0.044466
+v -0.270719 0.342082 -0.018043
+v -0.286723 0.349506 0.009229
+v -0.317092 0.377491 -0.018756
+v -0.225799 0.310432 0.030707
+v -0.219199 0.307964 0.016075
+v -0.206071 0.300433 0.040706
+v -0.232157 0.313371 0.045365
+v -0.244563 0.321318 0.019820
+v -0.237415 0.318532 0.005507
+v -0.200047 0.298257 0.025782
+v -0.211873 0.303090 0.055645
+v -0.251450 0.324564 0.034171
+v -0.141943 0.276198 0.064941
+v -0.137794 0.274730 0.049309
+v -0.119227 0.270150 0.070988
+v -0.145940 0.278173 0.080562
+v -0.164053 0.283279 0.057859
+v -0.159258 0.281605 0.042434
+v -0.115742 0.268860 0.055179
+v -0.122585 0.271955 0.086780
+v -0.168673 0.285454 0.073281
+v -0.048414 0.258477 0.082662
+v -0.046999 0.257528 0.066512
+v -0.024259 0.256793 0.084346
+v -0.049777 0.259953 0.098782
+v -0.072363 0.261271 0.079868
+v -0.070248 0.260240 0.063799
+v -0.023550 0.255893 0.068146
+v -0.024942 0.258221 0.100514
+v -0.074401 0.262826 0.095910
+v 0.048414 0.258477 0.082662
+v 0.046999 0.257528 0.066512
+v 0.072363 0.261271 0.079868
+v 0.049777 0.259953 0.098782
+v 0.024259 0.256793 0.084346
+v 0.023550 0.255893 0.068146
+v 0.070248 0.260240 0.063799
+v 0.074401 0.262826 0.095910
+v 0.024942 0.258221 0.100514
+v 0.141943 0.276197 0.064941
+v 0.137794 0.274730 0.049309
+v 0.164053 0.283279 0.057859
+v 0.145940 0.278173 0.080562
+v 0.119227 0.270150 0.070988
+v 0.115742 0.268860 0.055179
+v 0.159258 0.281605 0.042434
+v 0.168673 0.285454 0.073281
+v 0.122584 0.271955 0.086780
+v 0.225799 0.310431 0.030707
+v 0.219199 0.307964 0.016075
+v 0.244563 0.321318 0.019820
+v 0.232157 0.313371 0.045365
+v 0.206071 0.300433 0.040706
+v 0.200047 0.298257 0.025782
+v 0.237415 0.318532 0.005507
+v 0.251450 0.324564 0.034171
+v 0.211873 0.303090 0.055645
+v 0.294267 0.358846 -0.017707
+v 0.285666 0.354963 -0.030924
+v 0.308407 0.372796 -0.031657
+v 0.302553 0.363148 -0.004413
+v 0.278870 0.345577 -0.004439
+v 0.270719 0.342082 -0.018043
+v 0.299393 0.368505 -0.044466
+v 0.317092 0.377491 -0.018756
+v 0.286723 0.349506 0.009229
+v 0.342681 0.418141 -0.077002
+v 0.332665 0.412525 -0.088486
+v 0.351233 0.434203 -0.093065
+v 0.352331 0.424113 -0.065378
+v 0.332666 0.402506 -0.061368
+v 0.322942 0.397347 -0.073308
+v 0.340967 0.428118 -0.104079
+v 0.361124 0.440628 -0.081893
+v 0.342033 0.408038 -0.049303
+v 0.367742 0.484276 -0.143137
+v 0.356993 0.476727 -0.152687
+v 0.370124 0.501356 -0.160218
+v 0.378097 0.492110 -0.133375
+v 0.363791 0.467341 -0.126203
+v 0.353157 0.460287 -0.136248
+v 0.359305 0.493308 -0.169269
+v 0.380546 0.509671 -0.150936
+v 0.374035 0.474699 -0.115964
+v 0.367742 0.552744 -0.211605
+v 0.356993 0.543193 -0.219154
+v 0.363791 0.569678 -0.228540
+v 0.378097 0.562506 -0.203771
+v 0.370124 0.535663 -0.194525
+v 0.359305 0.526612 -0.202573
+v 0.353158 0.559633 -0.235594
+v 0.374035 0.579917 -0.221182
+v 0.380546 0.544944 -0.186209
+v 0.342681 0.618878 -0.277740
+v 0.332665 0.607395 -0.283356
+v 0.332666 0.634513 -0.293374
+v 0.352331 0.630503 -0.271768
+v 0.351233 0.602816 -0.261678
+v 0.340967 0.591802 -0.267763
+v 0.322942 0.622572 -0.298533
+v 0.342033 0.646577 -0.287843
+v 0.361124 0.613988 -0.255253
+v 0.294267 0.678173 -0.337035
+v 0.285666 0.664957 -0.340918
+v 0.278871 0.691442 -0.350304
+v 0.302553 0.691468 -0.332733
+v 0.308407 0.664223 -0.323085
+v 0.299393 0.651415 -0.327376
+v 0.270719 0.677838 -0.353799
+v 0.286723 0.705110 -0.346375
+v 0.317092 0.677125 -0.318390
+v 0.225799 0.726588 -0.385449
+v 0.219199 0.711956 -0.387917
+v 0.206071 0.736586 -0.395448
+v 0.232157 0.741245 -0.382510
+v 0.244563 0.715701 -0.374563
+v 0.237415 0.701387 -0.377348
+v 0.200047 0.721663 -0.397624
+v 0.211873 0.751525 -0.392791
+v 0.251450 0.730052 -0.371317
+v 0.141943 0.760822 -0.419683
+v 0.137794 0.745189 -0.421150
+v 0.119227 0.766869 -0.425731
+v 0.145940 0.776443 -0.417708
+v 0.164053 0.753740 -0.412602
+v 0.159258 0.738315 -0.414276
+v 0.115742 0.751060 -0.427021
+v 0.122584 0.782661 -0.423926
+v 0.168673 0.769162 -0.410427
+v 0.048414 0.778542 -0.437404
+v 0.046999 0.762392 -0.438353
+v 0.024259 0.780227 -0.439088
+v 0.049777 0.794663 -0.435928
+v 0.072363 0.775748 -0.434610
+v 0.070248 0.759680 -0.435641
+v 0.023550 0.764027 -0.439988
+v 0.024942 0.796395 -0.437660
+v 0.074401 0.791790 -0.433055
+v -0.048414 0.778542 -0.437404
+v -0.046999 0.762392 -0.438353
+v -0.072363 0.775748 -0.434610
+v -0.049778 0.794663 -0.435928
+v -0.024259 0.780227 -0.439088
+v -0.023550 0.764027 -0.439988
+v -0.070248 0.759680 -0.435641
+v -0.074401 0.791790 -0.433055
+v -0.024942 0.796395 -0.437660
+v -0.141943 0.760822 -0.419683
+v -0.137794 0.745189 -0.421150
+v -0.164053 0.753740 -0.412602
+v -0.145940 0.776443 -0.417708
+v -0.119227 0.766869 -0.425731
+v -0.115742 0.751060 -0.427021
+v -0.159258 0.738315 -0.414276
+v -0.168673 0.769162 -0.410427
+v -0.122585 0.782661 -0.423926
+v -0.225799 0.726588 -0.385449
+v -0.219199 0.711956 -0.387917
+v -0.244564 0.715701 -0.374563
+v -0.232157 0.741245 -0.382510
+v -0.206071 0.736586 -0.395448
+v -0.200047 0.721663 -0.397624
+v -0.237415 0.701388 -0.377348
+v -0.251450 0.730052 -0.371317
+v -0.211873 0.751526 -0.392790
+v -0.294267 0.678173 -0.337035
+v -0.285666 0.664957 -0.340918
+v -0.308407 0.664223 -0.323085
+v -0.302553 0.691468 -0.332733
+v -0.278871 0.691442 -0.350304
+v -0.270720 0.677838 -0.353799
+v -0.299393 0.651415 -0.327376
+v -0.317092 0.677125 -0.318390
+v -0.286723 0.705110 -0.346375
+v -0.342681 0.618879 -0.277740
+v -0.332665 0.607395 -0.283356
+v -0.351234 0.602816 -0.261678
+v -0.352331 0.630503 -0.271768
+v -0.332666 0.634513 -0.293374
+v -0.322943 0.622572 -0.298533
+v -0.340967 0.591802 -0.267763
+v -0.361124 0.613988 -0.255253
+v -0.342034 0.646578 -0.287843
+v -0.367742 0.552744 -0.211605
+v -0.356994 0.543193 -0.219154
+v -0.370124 0.535663 -0.194525
+v -0.378097 0.562506 -0.203771
+v -0.363791 0.569678 -0.228539
+v -0.353158 0.559633 -0.235594
+v -0.359306 0.526612 -0.202573
+v -0.380546 0.544944 -0.186209
+v -0.374035 0.579917 -0.221182
+v -0.367742 0.484276 -0.143137
+v -0.356993 0.476727 -0.152687
+v -0.363791 0.467341 -0.126203
+v -0.378097 0.492110 -0.133375
+v -0.370124 0.501356 -0.160218
+v -0.359306 0.493308 -0.169269
+v -0.353158 0.460287 -0.136248
+v -0.374035 0.474699 -0.115964
+v -0.380546 0.509671 -0.150936
+v -0.378975 0.444102 -0.029780
+v -0.370488 0.437101 -0.041754
+v -0.367900 0.426812 -0.012490
+v -0.387058 0.451432 -0.017715
+v -0.388434 0.461866 -0.047544
+v -0.379734 0.454466 -0.059120
+v -0.359660 0.420198 -0.024851
+v -0.375746 0.433774 -0.000056
+v -0.396718 0.469575 -0.035858
+v -0.325434 0.378527 0.035795
+v -0.318145 0.372994 0.022353
+v -0.308407 0.363853 0.050469
+v -0.332374 0.384459 0.049259
+v -0.341072 0.393955 0.020368
+v -0.333433 0.388076 0.007271
+v -0.301499 0.358649 0.036698
+v -0.314984 0.369472 0.064245
+v -0.348346 0.400215 0.033502
+v -0.249714 0.324985 0.089337
+v -0.244121 0.320651 0.074695
+v -0.227896 0.313928 0.100395
+v -0.255040 0.329775 0.103942
+v -0.270466 0.337025 0.077297
+v -0.264408 0.332422 0.062925
+v -0.222792 0.309841 0.085505
+v -0.232757 0.318482 0.115236
+v -0.276234 0.342072 0.091646
+v -0.156977 0.287126 0.127197
+v -0.153461 0.283640 0.111707
+v -0.131855 0.280438 0.133885
+v -0.160325 0.291108 0.142610
+v -0.181429 0.294957 0.119365
+v -0.177365 0.291296 0.104051
+v -0.128902 0.277101 0.118245
+v -0.134667 0.284277 0.149440
+v -0.185298 0.299107 0.134611
+v -0.053542 0.267528 0.146795
+v -0.052343 0.264481 0.130866
+v -0.026828 0.265665 0.148657
+v -0.054684 0.271092 0.162625
+v -0.080027 0.270618 0.143705
+v -0.078235 0.267502 0.127845
+v -0.026227 0.262660 0.132687
+v -0.027400 0.269190 0.164528
+v -0.081734 0.274248 0.159469
+v 0.053542 0.267528 0.146795
+v 0.052343 0.264481 0.130866
+v 0.080027 0.270618 0.143705
+v 0.054684 0.271092 0.162625
+v 0.026828 0.265665 0.148657
+v 0.026227 0.262660 0.132687
+v 0.078235 0.267502 0.127845
+v 0.081734 0.274248 0.159469
+v 0.027400 0.269190 0.164528
+v 0.156977 0.287125 0.127197
+v 0.153461 0.283640 0.111707
+v 0.181429 0.294957 0.119365
+v 0.160325 0.291108 0.142610
+v 0.131855 0.280438 0.133885
+v 0.128902 0.277101 0.118245
+v 0.177365 0.291296 0.104051
+v 0.185298 0.299107 0.134611
+v 0.134667 0.284277 0.149440
+v 0.249714 0.324985 0.089337
+v 0.244121 0.320651 0.074695
+v 0.270466 0.337025 0.077297
+v 0.255040 0.329775 0.103942
+v 0.227896 0.313928 0.100395
+v 0.222792 0.309841 0.085505
+v 0.264408 0.332422 0.062925
+v 0.276234 0.342072 0.091646
+v 0.232757 0.318481 0.115236
+v 0.325434 0.378527 0.035795
+v 0.318145 0.372994 0.022353
+v 0.341072 0.393955 0.020368
+v 0.332374 0.384459 0.049259
+v 0.308407 0.363853 0.050469
+v 0.301499 0.358649 0.036698
+v 0.333433 0.388076 0.007271
+v 0.348346 0.400215 0.033502
+v 0.314984 0.369472 0.064245
+v 0.378976 0.444102 -0.029780
+v 0.370488 0.437100 -0.041754
+v 0.388434 0.461866 -0.047544
+v 0.387058 0.451432 -0.017715
+v 0.367900 0.426812 -0.012490
+v 0.359660 0.420198 -0.024851
+v 0.379734 0.454466 -0.059120
+v 0.396718 0.469575 -0.035858
+v 0.375746 0.433774 -0.000056
+v 0.406691 0.517242 -0.102919
+v 0.397582 0.508602 -0.113255
+v 0.409325 0.536131 -0.121809
+v 0.415364 0.526132 -0.092414
+v 0.402321 0.498514 -0.084191
+v 0.393310 0.490293 -0.094947
+v 0.400157 0.527068 -0.131722
+v 0.418055 0.545424 -0.111707
+v 0.410901 0.507004 -0.073287
+v 0.406691 0.592961 -0.178639
+v 0.397582 0.582626 -0.187279
+v 0.402321 0.611689 -0.197367
+v 0.415364 0.603466 -0.169749
+v 0.409325 0.574072 -0.159750
+v 0.400157 0.564159 -0.168812
+v 0.393310 0.600934 -0.205587
+v 0.410901 0.622594 -0.188876
+v 0.418055 0.584174 -0.150457
+v 0.378976 0.666101 -0.251779
+v 0.370488 0.654127 -0.258780
+v 0.367900 0.683391 -0.269069
+v 0.387058 0.678166 -0.244448
+v 0.388434 0.648337 -0.234015
+v 0.379734 0.636761 -0.241414
+v 0.359660 0.671030 -0.275683
+v 0.375746 0.695825 -0.262107
+v 0.396718 0.660023 -0.226306
+v 0.325434 0.731676 -0.317354
+v 0.318145 0.718233 -0.322887
+v 0.308407 0.746350 -0.332028
+v 0.332374 0.745139 -0.311422
+v 0.341072 0.716248 -0.301926
+v 0.333433 0.703151 -0.307805
+v 0.301499 0.732579 -0.337232
+v 0.314984 0.760126 -0.326409
+v 0.348346 0.729383 -0.295666
+v 0.249714 0.785218 -0.370896
+v 0.244121 0.770576 -0.375229
+v 0.227896 0.796276 -0.381953
+v 0.255040 0.799823 -0.366106
+v 0.270466 0.773178 -0.358856
+v 0.264408 0.758806 -0.363459
+v 0.222792 0.781386 -0.386039
+v 0.232757 0.811117 -0.377399
+v 0.276234 0.787526 -0.353809
+v 0.156977 0.823078 -0.408755
+v 0.153461 0.807588 -0.412241
+v 0.131855 0.829766 -0.415443
+v 0.160325 0.838490 -0.404773
+v 0.181429 0.815246 -0.400924
+v 0.177365 0.799932 -0.404585
+v 0.128902 0.814126 -0.418780
+v 0.134667 0.845321 -0.411604
+v 0.185298 0.830492 -0.396774
+v 0.053542 0.842675 -0.428353
+v 0.052343 0.826747 -0.431400
+v 0.026828 0.844538 -0.430215
+v 0.054684 0.858506 -0.424789
+v 0.080027 0.839585 -0.425263
+v 0.078235 0.823726 -0.428379
+v 0.026227 0.828567 -0.433221
+v 0.027400 0.860408 -0.426691
+v 0.081734 0.855350 -0.421633
+v -0.053542 0.842675 -0.428353
+v -0.052343 0.826747 -0.431400
+v -0.080027 0.839586 -0.425263
+v -0.054684 0.858506 -0.424789
+v -0.026828 0.844538 -0.430215
+v -0.026227 0.828567 -0.433221
+v -0.078235 0.823726 -0.428379
+v -0.081734 0.855350 -0.421633
+v -0.027400 0.860408 -0.426691
+v -0.156977 0.823078 -0.408755
+v -0.153461 0.807588 -0.412241
+v -0.181429 0.815246 -0.400924
+v -0.160325 0.838490 -0.404773
+v -0.131855 0.829766 -0.415443
+v -0.128902 0.814126 -0.418780
+v -0.177365 0.799932 -0.404585
+v -0.185298 0.830492 -0.396774
+v -0.134667 0.845321 -0.411604
+v -0.249714 0.785218 -0.370896
+v -0.244121 0.770576 -0.375229
+v -0.270466 0.773178 -0.358856
+v -0.255040 0.799823 -0.366106
+v -0.227896 0.796276 -0.381953
+v -0.222792 0.781386 -0.386039
+v -0.264408 0.758806 -0.363459
+v -0.276234 0.787526 -0.353809
+v -0.232757 0.811117 -0.377399
+v -0.325434 0.731676 -0.317354
+v -0.318145 0.718233 -0.322887
+v -0.341072 0.716249 -0.301926
+v -0.332374 0.745139 -0.311422
+v -0.308407 0.746350 -0.332027
+v -0.301499 0.732579 -0.337232
+v -0.333433 0.703151 -0.307805
+v -0.348346 0.729383 -0.295665
+v -0.314984 0.760126 -0.326409
+v -0.378976 0.666101 -0.251778
+v -0.370488 0.654127 -0.258780
+v -0.388434 0.648337 -0.234015
+v -0.387058 0.678166 -0.244448
+v -0.367900 0.683391 -0.269069
+v -0.359660 0.671030 -0.275683
+v -0.379734 0.636761 -0.241414
+v -0.396718 0.660023 -0.226306
+v -0.375746 0.695825 -0.262107
+v -0.406691 0.592961 -0.178639
+v -0.397582 0.582626 -0.187279
+v -0.409325 0.574072 -0.159749
+v -0.415365 0.603466 -0.169749
+v -0.402321 0.611689 -0.197367
+v -0.393310 0.600934 -0.205587
+v -0.400157 0.564159 -0.168812
+v -0.418055 0.584174 -0.150456
+v -0.410902 0.622594 -0.188876
+v -0.406691 0.517242 -0.102919
+v -0.397582 0.508602 -0.113255
+v -0.402321 0.498514 -0.084191
+v -0.415364 0.526132 -0.092414
+v -0.409325 0.536131 -0.121809
+v -0.400157 0.527068 -0.131722
+v -0.393310 0.490293 -0.094947
+v -0.410901 0.507005 -0.073287
+v -0.418055 0.545424 -0.111707
+v -0.408786 0.475315 0.018895
+v -0.401971 0.467047 0.006636
+v -0.396838 0.456665 0.037545
+v -0.415163 0.483878 0.031194
+v -0.418988 0.494476 -0.000266
+v -0.412003 0.485889 -0.012206
+v -0.390223 0.448708 0.024975
+v -0.403029 0.464937 0.050135
+v -0.425524 0.503338 0.011734
+v -0.351032 0.404582 0.089629
+v -0.345180 0.397493 0.076190
+v -0.332666 0.388754 0.105457
+v -0.356508 0.412041 0.103031
+v -0.367900 0.421223 0.072988
+v -0.361767 0.413857 0.059826
+v -0.327120 0.381929 0.091754
+v -0.337855 0.395966 0.119106
+v -0.373639 0.428942 0.086130
+v -0.269356 0.346828 0.147382
+v -0.264866 0.340703 0.132980
+v -0.245822 0.334901 0.159310
+v -0.273558 0.353387 0.161685
+v -0.291741 0.359815 0.134395
+v -0.286877 0.353473 0.120210
+v -0.241724 0.328974 0.144709
+v -0.249657 0.341273 0.173799
+v -0.296292 0.366576 0.148495
+v -0.169325 0.305991 0.188220
+v -0.166502 0.300545 0.173137
+v -0.142227 0.298777 0.195434
+v -0.171966 0.311912 0.203160
+v -0.195700 0.314438 0.179772
+v -0.192437 0.308852 0.164830
+v -0.139856 0.293452 0.180231
+v -0.144445 0.304585 0.210486
+v -0.198753 0.320492 0.194580
+v -0.057753 0.284851 0.209359
+v -0.056791 0.279759 0.193924
+v -0.028938 0.282842 0.211368
+v -0.058654 0.290443 0.224629
+v -0.086322 0.288184 0.206026
+v -0.084883 0.283036 0.190647
+v -0.028456 0.277783 0.195900
+v -0.029390 0.288403 0.226669
+v -0.087669 0.293828 0.221244
+v 0.057753 0.284851 0.209359
+v 0.056791 0.279759 0.193924
+v 0.086322 0.288184 0.206026
+v 0.058654 0.290443 0.224629
+v 0.028938 0.282842 0.211368
+v 0.028456 0.277783 0.195900
+v 0.084883 0.283036 0.190647
+v 0.087669 0.293828 0.221244
+v 0.029390 0.288403 0.226669
+v 0.169325 0.305991 0.188220
+v 0.166502 0.300545 0.173137
+v 0.195700 0.314438 0.179772
+v 0.171966 0.311912 0.203160
+v 0.142227 0.298776 0.195434
+v 0.139856 0.293452 0.180231
+v 0.192437 0.308852 0.164830
+v 0.198753 0.320491 0.194580
+v 0.144445 0.304585 0.210486
+v 0.269356 0.346828 0.147382
+v 0.264866 0.340702 0.132980
+v 0.291741 0.359815 0.134395
+v 0.273558 0.353387 0.161685
+v 0.245822 0.334901 0.159310
+v 0.241724 0.328974 0.144709
+v 0.286877 0.353473 0.120210
+v 0.296292 0.366576 0.148495
+v 0.249657 0.341273 0.173799
+v 0.351032 0.404582 0.089629
+v 0.345180 0.397493 0.076190
+v 0.367900 0.421223 0.072987
+v 0.356508 0.412041 0.103031
+v 0.332666 0.388754 0.105457
+v 0.327120 0.381929 0.091754
+v 0.361767 0.413857 0.059826
+v 0.373640 0.428942 0.086130
+v 0.337855 0.395966 0.119106
+v 0.408786 0.475315 0.018895
+v 0.401971 0.467047 0.006636
+v 0.418988 0.494476 -0.000266
+v 0.415163 0.483878 0.031194
+v 0.396839 0.456665 0.037545
+v 0.390223 0.448708 0.024975
+v 0.412003 0.485889 -0.012206
+v 0.425524 0.503338 0.011734
+v 0.403029 0.464937 0.050135
+v 0.438681 0.554208 -0.059997
+v 0.431368 0.544625 -0.070942
+v 0.441522 0.574583 -0.080373
+v 0.445525 0.564001 -0.048930
+v 0.433967 0.534007 -0.039796
+v 0.426733 0.524760 -0.051078
+v 0.434162 0.564660 -0.090978
+v 0.448410 0.584695 -0.069623
+v 0.440737 0.543485 -0.028413
+v 0.438681 0.635883 -0.141673
+v 0.431368 0.624939 -0.151256
+v 0.433967 0.656084 -0.161874
+v 0.445525 0.646951 -0.131880
+v 0.441522 0.615508 -0.121298
+v 0.434162 0.604903 -0.131220
+v 0.426733 0.644803 -0.171120
+v 0.440737 0.667467 -0.152396
+v 0.448410 0.626258 -0.111186
+v 0.408786 0.714776 -0.220566
+v 0.401971 0.702516 -0.228834
+v 0.396839 0.733426 -0.239216
+v 0.415163 0.727075 -0.212003
+v 0.418988 0.695615 -0.201405
+v 0.412003 0.683675 -0.209992
+v 0.390223 0.720855 -0.247173
+v 0.403029 0.746016 -0.230944
+v 0.425524 0.707614 -0.192543
+v 0.351032 0.785509 -0.291299
+v 0.345180 0.772070 -0.298388
+v 0.332666 0.801337 -0.307127
+v 0.356508 0.798911 -0.283840
+v 0.367900 0.768868 -0.274658
+v 0.361767 0.755707 -0.282024
+v 0.327120 0.787635 -0.313952
+v 0.337855 0.814986 -0.299915
+v 0.373640 0.782011 -0.266939
+v 0.269356 0.843263 -0.349053
+v 0.264866 0.828861 -0.355178
+v 0.245822 0.855190 -0.360980
+v 0.273558 0.857566 -0.342494
+v 0.291741 0.830276 -0.336066
+v 0.286877 0.816091 -0.342408
+v 0.241724 0.840590 -0.366907
+v 0.249657 0.869679 -0.354608
+v 0.296292 0.844376 -0.329305
+v 0.169325 0.884101 -0.389890
+v 0.166502 0.869018 -0.395336
+v 0.142227 0.891315 -0.397104
+v 0.171966 0.899041 -0.383969
+v 0.195700 0.875653 -0.381442
+v 0.192437 0.860711 -0.387029
+v 0.139856 0.876112 -0.402429
+v 0.144445 0.906367 -0.391296
+v 0.198753 0.890461 -0.375389
+v 0.057753 0.905240 -0.411030
+v 0.056791 0.889805 -0.416122
+v 0.028938 0.907249 -0.413039
+v 0.058654 0.920510 -0.405438
+v 0.086322 0.901907 -0.407697
+v 0.084883 0.886528 -0.412845
+v 0.028456 0.891781 -0.418098
+v 0.029390 0.922550 -0.407478
+v 0.087669 0.917125 -0.402053
+v -0.057754 0.905240 -0.411030
+v -0.056791 0.889805 -0.416122
+v -0.086322 0.901907 -0.407697
+v -0.058654 0.920510 -0.405438
+v -0.028938 0.907249 -0.413039
+v -0.028456 0.891781 -0.418098
+v -0.084883 0.886528 -0.412845
+v -0.087669 0.917125 -0.402053
+v -0.029390 0.922550 -0.407478
+v -0.169325 0.884101 -0.389890
+v -0.166502 0.869018 -0.395335
+v -0.195700 0.875653 -0.381442
+v -0.171966 0.899041 -0.383969
+v -0.142227 0.891315 -0.397104
+v -0.139856 0.876112 -0.402429
+v -0.192437 0.860711 -0.387028
+v -0.198753 0.890461 -0.375389
+v -0.144445 0.906367 -0.391296
+v -0.269357 0.843263 -0.349052
+v -0.264866 0.828861 -0.355178
+v -0.291741 0.830276 -0.336065
+v -0.273559 0.857566 -0.342494
+v -0.245823 0.855190 -0.360980
+v -0.241725 0.840590 -0.366907
+v -0.286877 0.816091 -0.342408
+v -0.296292 0.844376 -0.329304
+v -0.249657 0.869679 -0.354608
+v -0.351032 0.785509 -0.291299
+v -0.345181 0.772071 -0.298388
+v -0.367900 0.768868 -0.274658
+v -0.356508 0.798911 -0.283840
+v -0.332666 0.801337 -0.307127
+v -0.327120 0.787635 -0.313952
+v -0.361767 0.755707 -0.282024
+v -0.373640 0.782011 -0.266939
+v -0.337856 0.814986 -0.299915
+v -0.408786 0.714776 -0.220566
+v -0.401971 0.702516 -0.228834
+v -0.418988 0.695615 -0.201405
+v -0.415163 0.727075 -0.212003
+v -0.396839 0.733426 -0.239216
+v -0.390223 0.720856 -0.247173
+v -0.412003 0.683675 -0.209992
+v -0.425524 0.707615 -0.192543
+v -0.403030 0.746016 -0.230944
+v -0.438681 0.635883 -0.141673
+v -0.431368 0.624939 -0.151256
+v -0.441522 0.615508 -0.121298
+v -0.445525 0.646951 -0.131879
+v -0.433968 0.656084 -0.161874
+v -0.426733 0.644803 -0.171120
+v -0.434162 0.604903 -0.131220
+v -0.448410 0.626258 -0.111186
+v -0.440738 0.667467 -0.152396
+v -0.438681 0.554208 -0.059997
+v -0.431368 0.544625 -0.070942
+v -0.433967 0.534007 -0.039796
+v -0.445525 0.564001 -0.048930
+v -0.441522 0.574583 -0.080373
+v -0.434162 0.564660 -0.090978
+v -0.426733 0.524760 -0.051078
+v -0.440737 0.543485 -0.028413
+v -0.448410 0.584695 -0.069623
+v -0.431601 0.511245 0.068190
+v -0.426577 0.501852 0.055854
+v -0.418987 0.491554 0.087881
+v -0.436164 0.520894 0.080512
+v -0.442373 0.531475 0.047960
+v -0.437223 0.521847 0.035859
+v -0.414110 0.482391 0.075316
+v -0.423417 0.500995 0.100411
+v -0.447049 0.541338 0.060068
+v -0.370624 0.436564 0.142871
+v -0.366310 0.428041 0.129666
+v -0.351233 0.419852 0.159583
+v -0.374542 0.445423 0.155983
+v -0.388434 0.454134 0.125301
+v -0.383912 0.445406 0.112301
+v -0.347144 0.411524 0.146183
+v -0.354946 0.428535 0.172871
+v -0.392540 0.463179 0.138227
+v -0.284390 0.375587 0.203848
+v -0.281079 0.367774 0.189933
+v -0.259542 0.362994 0.216441
+v -0.287397 0.383802 0.217604
+v -0.308024 0.389299 0.190136
+v -0.304438 0.381326 0.176381
+v -0.256521 0.355327 0.202380
+v -0.262286 0.371076 0.230330
+v -0.311280 0.397659 0.203747
+v -0.178775 0.332470 0.246965
+v -0.176694 0.325159 0.232548
+v -0.150165 0.324853 0.254582
+v -0.180665 0.340229 0.261177
+v -0.206622 0.341389 0.238046
+v -0.204217 0.333974 0.223733
+v -0.148417 0.317631 0.240076
+v -0.151752 0.332532 0.268874
+v -0.208807 0.349243 0.252163
+v -0.060977 0.310151 0.269284
+v -0.060267 0.303099 0.254608
+v -0.030554 0.308030 0.271405
+v -0.061621 0.317674 0.283732
+v -0.091140 0.313670 0.265765
+v -0.090079 0.306578 0.251129
+v -0.030198 0.301003 0.256704
+v -0.030877 0.315530 0.285876
+v -0.092103 0.321230 0.280176
+v 0.060977 0.310151 0.269284
+v 0.060267 0.303099 0.254608
+v 0.091140 0.313670 0.265765
+v 0.061621 0.317674 0.283732
+v 0.030553 0.308030 0.271405
+v 0.030198 0.301003 0.256704
+v 0.090079 0.306577 0.251130
+v 0.092103 0.321230 0.280176
+v 0.030876 0.315530 0.285876
+v 0.178775 0.332470 0.246965
+v 0.176694 0.325159 0.232548
+v 0.206622 0.341389 0.238046
+v 0.180665 0.340229 0.261177
+v 0.150165 0.324853 0.254582
+v 0.148417 0.317631 0.240076
+v 0.204217 0.333974 0.223733
+v 0.208807 0.349243 0.252163
+v 0.151752 0.332532 0.268874
+v 0.284390 0.375587 0.203848
+v 0.281079 0.367774 0.189933
+v 0.308024 0.389299 0.190136
+v 0.287397 0.383802 0.217604
+v 0.259542 0.362994 0.216441
+v 0.256521 0.355327 0.202380
+v 0.304438 0.381326 0.176381
+v 0.311280 0.397659 0.203747
+v 0.262286 0.371076 0.230330
+v 0.370624 0.436564 0.142871
+v 0.366310 0.428041 0.129666
+v 0.388434 0.454134 0.125301
+v 0.374542 0.445423 0.155983
+v 0.351233 0.419852 0.159583
+v 0.347144 0.411524 0.146183
+v 0.383912 0.445406 0.112301
+v 0.392540 0.463179 0.138227
+v 0.354946 0.428535 0.172871
+v 0.431601 0.511245 0.068190
+v 0.426577 0.501852 0.055854
+v 0.442373 0.531475 0.047960
+v 0.436164 0.520894 0.080512
+v 0.418987 0.491554 0.087881
+v 0.414110 0.482391 0.075316
+v 0.437223 0.521847 0.035859
+v 0.447049 0.541338 0.060068
+v 0.423417 0.500995 0.100411
+v 0.463165 0.594541 -0.015106
+v 0.457773 0.584179 -0.026472
+v 0.466165 0.616053 -0.036618
+v 0.468062 0.605070 -0.003665
+v 0.458189 0.573212 0.006223
+v 0.452854 0.563098 -0.005392
+v 0.460738 0.605441 -0.047734
+v 0.471093 0.626810 -0.025405
+v 0.463032 0.583516 0.017889
+v 0.463165 0.680775 -0.101340
+v 0.457773 0.669409 -0.111702
+v 0.458189 0.702104 -0.122669
+v 0.468062 0.692216 -0.090810
+v 0.466165 0.659262 -0.079827
+v 0.460738 0.648147 -0.090440
+v 0.452854 0.690489 -0.132782
+v 0.463032 0.713770 -0.112364
+v 0.471093 0.670476 -0.069071
+v 0.431601 0.764071 -0.184636
+v 0.426577 0.751735 -0.194028
+v 0.418987 0.783762 -0.204327
+v 0.436164 0.776393 -0.174987
+v 0.442373 0.743840 -0.164405
+v 0.437223 0.731740 -0.174033
+v 0.414110 0.771197 -0.213490
+v 0.423417 0.796292 -0.194886
+v 0.447049 0.755948 -0.154543
+v 0.370624 0.838752 -0.259317
+v 0.366310 0.825547 -0.267840
+v 0.351233 0.855464 -0.276029
+v 0.374543 0.851863 -0.250458
+v 0.388434 0.821182 -0.241747
+v 0.383912 0.808181 -0.250475
+v 0.347144 0.842064 -0.284357
+v 0.354946 0.868751 -0.267346
+v 0.392540 0.834108 -0.232702
+v 0.284390 0.899729 -0.320294
+v 0.281079 0.885814 -0.328107
+v 0.259543 0.912322 -0.332887
+v 0.287397 0.913485 -0.312079
+v 0.308024 0.886017 -0.306582
+v 0.304438 0.872262 -0.314555
+v 0.256521 0.898260 -0.340554
+v 0.262286 0.926211 -0.324805
+v 0.311280 0.899628 -0.298222
+v 0.178775 0.942846 -0.363411
+v 0.176694 0.928429 -0.370722
+v 0.150165 0.950463 -0.371028
+v 0.180665 0.957058 -0.355652
+v 0.206622 0.933927 -0.354492
+v 0.204217 0.919614 -0.361907
+v 0.148417 0.935957 -0.378250
+v 0.151752 0.964755 -0.363349
+v 0.208807 0.948044 -0.346638
+v 0.060977 0.965165 -0.385730
+v 0.060267 0.950488 -0.392782
+v 0.030553 0.967286 -0.387851
+v 0.061621 0.979613 -0.378207
+v 0.091140 0.961646 -0.382211
+v 0.090079 0.947010 -0.389304
+v 0.030198 0.952585 -0.394878
+v 0.030876 0.981756 -0.380351
+v 0.092103 0.976057 -0.374651
+v -0.060977 0.965165 -0.385730
+v -0.060267 0.950488 -0.392782
+v -0.091140 0.961646 -0.382211
+v -0.061622 0.979613 -0.378207
+v -0.030554 0.967286 -0.387851
+v -0.030198 0.952585 -0.394878
+v -0.090079 0.947010 -0.389304
+v -0.092104 0.976057 -0.374651
+v -0.030877 0.981756 -0.380351
+v -0.178775 0.942846 -0.363411
+v -0.176694 0.928429 -0.370722
+v -0.206622 0.933927 -0.354492
+v -0.180665 0.957058 -0.355652
+v -0.150165 0.950463 -0.371028
+v -0.148417 0.935957 -0.378250
+v -0.204217 0.919614 -0.361907
+v -0.208807 0.948044 -0.346638
+v -0.151752 0.964755 -0.363349
+v -0.284390 0.899729 -0.320294
+v -0.281079 0.885814 -0.328107
+v -0.308024 0.886017 -0.306582
+v -0.287397 0.913485 -0.312079
+v -0.259543 0.912322 -0.332887
+v -0.256521 0.898260 -0.340554
+v -0.304438 0.872262 -0.314555
+v -0.311280 0.899628 -0.298222
+v -0.262286 0.926211 -0.324805
+v -0.370625 0.838752 -0.259317
+v -0.366310 0.825547 -0.267840
+v -0.388434 0.821182 -0.241747
+v -0.374543 0.851863 -0.250458
+v -0.351233 0.855464 -0.276029
+v -0.347144 0.842064 -0.284357
+v -0.383912 0.808182 -0.250475
+v -0.392540 0.834108 -0.232702
+v -0.354946 0.868752 -0.267346
+v -0.431601 0.764071 -0.184636
+v -0.426577 0.751735 -0.194028
+v -0.442373 0.743840 -0.164405
+v -0.436164 0.776393 -0.174987
+v -0.418988 0.783762 -0.204327
+v -0.414110 0.771197 -0.213490
+v -0.437223 0.731740 -0.174033
+v -0.447050 0.755948 -0.154542
+v -0.423417 0.796292 -0.194886
+v -0.463165 0.680775 -0.101340
+v -0.457773 0.669409 -0.111702
+v -0.466165 0.659263 -0.079827
+v -0.468062 0.692216 -0.090810
+v -0.458189 0.702104 -0.122668
+v -0.452855 0.690489 -0.132782
+v -0.460738 0.648147 -0.090440
+v -0.471093 0.670476 -0.069070
+v -0.463032 0.713770 -0.112364
+v -0.463165 0.594541 -0.015106
+v -0.457773 0.584179 -0.026472
+v -0.458189 0.573212 0.006223
+v -0.468062 0.605070 -0.003664
+v -0.466165 0.616053 -0.036618
+v -0.460738 0.605441 -0.047734
+v -0.452854 0.563098 -0.005392
+v -0.463032 0.583516 0.017890
+v -0.471093 0.626810 -0.025404
+v -0.447032 0.551277 0.117262
+v -0.443883 0.540921 0.105061
+v -0.433967 0.530882 0.137657
+v -0.449702 0.561847 0.129396
+v -0.458189 0.572231 0.096308
+v -0.454962 0.561727 0.084255
+v -0.430911 0.520669 0.125312
+v -0.436559 0.541330 0.149913
+v -0.460926 0.582926 0.108317
+v -0.383875 0.473926 0.194613
+v -0.381171 0.464114 0.181867
+v -0.363790 0.456617 0.211922
+v -0.386168 0.484034 0.207209
+v -0.402321 0.492124 0.176415
+v -0.399488 0.482184 0.163797
+v -0.361228 0.446927 0.199054
+v -0.365963 0.466622 0.224621
+v -0.404724 0.502341 0.188902
+v -0.294558 0.410769 0.257770
+v -0.292483 0.401402 0.244579
+v -0.268822 0.397726 0.270813
+v -0.296317 0.420500 0.270743
+v -0.319036 0.424971 0.243567
+v -0.316789 0.415504 0.230477
+v -0.266928 0.388451 0.257531
+v -0.270428 0.407378 0.283864
+v -0.320942 0.434787 0.256456
+v -0.185167 0.366110 0.302428
+v -0.183863 0.357058 0.288923
+v -0.155534 0.358221 0.310317
+v -0.186273 0.375574 0.315669
+v -0.214010 0.375349 0.293190
+v -0.212502 0.366231 0.279750
+v -0.154438 0.349225 0.296757
+v -0.156463 0.367638 0.323605
+v -0.215288 0.384868 0.306375
+v -0.063157 0.342993 0.325545
+v -0.062712 0.334104 0.311878
+v -0.031646 0.340796 0.327742
+v -0.063534 0.352319 0.338924
+v -0.094398 0.346638 0.321900
+v -0.093734 0.337723 0.308258
+v -0.031423 0.331922 0.314059
+v -0.031835 0.350109 0.341134
+v -0.094962 0.355986 0.335257
+v 0.063157 0.342993 0.325545
+v 0.062712 0.334104 0.311878
+v 0.094398 0.346638 0.321900
+v 0.063534 0.352319 0.338924
+v 0.031646 0.340796 0.327742
+v 0.031423 0.331922 0.314059
+v 0.093734 0.337723 0.308258
+v 0.094962 0.355986 0.335257
+v 0.031835 0.350109 0.341134
+v 0.185167 0.366110 0.302428
+v 0.183863 0.357058 0.288923
+v 0.214010 0.375348 0.293190
+v 0.186273 0.375574 0.315669
+v 0.155533 0.358221 0.310317
+v 0.154438 0.349225 0.296757
+v 0.212502 0.366231 0.279750
+v 0.215288 0.384868 0.306375
+v 0.156463 0.367638 0.323605
+v 0.294558 0.410769 0.257770
+v 0.292483 0.401402 0.244579
+v 0.319036 0.424971 0.243567
+v 0.296317 0.420500 0.270743
+v 0.268822 0.397725 0.270813
+v 0.266928 0.388451 0.257531
+v 0.316789 0.415504 0.230477
+v 0.320942 0.434787 0.256456
+v 0.270428 0.407378 0.283864
+v 0.383875 0.473926 0.194613
+v 0.381171 0.464114 0.181867
+v 0.402321 0.492124 0.176415
+v 0.386168 0.484034 0.207209
+v 0.363790 0.456617 0.211922
+v 0.361228 0.446927 0.199054
+v 0.399488 0.482184 0.163797
+v 0.404725 0.502341 0.188902
+v 0.365963 0.466621 0.224621
+v 0.447032 0.551277 0.117261
+v 0.443884 0.540921 0.105061
+v 0.458189 0.572231 0.096308
+v 0.449702 0.561847 0.129396
+v 0.433967 0.530882 0.137656
+v 0.430911 0.520669 0.125312
+v 0.454962 0.561727 0.084254
+v 0.460926 0.582926 0.108317
+v 0.436559 0.541330 0.149913
+v 0.479725 0.637551 0.030987
+v 0.476346 0.626587 0.019394
+v 0.482832 0.659833 0.008706
+v 0.482590 0.648636 0.042606
+v 0.474570 0.615460 0.053079
+v 0.471227 0.604651 0.041330
+v 0.479431 0.648712 -0.002730
+v 0.485716 0.671051 0.020192
+v 0.477405 0.626413 0.064829
+v 0.479725 0.726868 -0.058330
+v 0.476346 0.715275 -0.069294
+v 0.474570 0.748959 -0.080421
+v 0.482590 0.738487 -0.047245
+v 0.482831 0.704587 -0.036048
+v 0.479431 0.693150 -0.047169
+v 0.471227 0.737211 -0.091229
+v 0.477405 0.760710 -0.069468
+v 0.485716 0.716072 -0.024830
+v 0.447032 0.813142 -0.144604
+v 0.443884 0.800942 -0.154960
+v 0.433967 0.833537 -0.164999
+v 0.449702 0.825276 -0.134034
+v 0.458189 0.792188 -0.123650
+v 0.454962 0.780135 -0.134154
+v 0.430911 0.821193 -0.175212
+v 0.436559 0.845793 -0.154551
+v 0.460926 0.804197 -0.112955
+v 0.383875 0.890493 -0.221955
+v 0.381171 0.877748 -0.231767
+v 0.363790 0.907802 -0.239264
+v 0.386168 0.903090 -0.211847
+v 0.402321 0.872295 -0.203757
+v 0.399488 0.859678 -0.213697
+v 0.361228 0.894935 -0.248954
+v 0.365963 0.920502 -0.229259
+v 0.404725 0.884783 -0.193540
+v 0.294558 0.953650 -0.285112
+v 0.292483 0.940460 -0.294479
+v 0.268822 0.966694 -0.298155
+v 0.296317 0.966624 -0.275381
+v 0.319036 0.939448 -0.270910
+v 0.316789 0.926358 -0.280377
+v 0.266928 0.953412 -0.307430
+v 0.270428 0.979745 -0.288503
+v 0.320942 0.952337 -0.261094
+v 0.185167 0.998309 -0.329771
+v 0.183863 0.984804 -0.338823
+v 0.155534 1.006198 -0.337660
+v 0.186273 1.011549 -0.320307
+v 0.214010 0.989071 -0.320533
+v 0.212502 0.975631 -0.329650
+v 0.154438 0.992638 -0.346656
+v 0.156463 1.019485 -0.328243
+v 0.215288 1.002256 -0.311013
+v 0.063157 1.021426 -0.352888
+v 0.062712 1.007758 -0.361777
+v 0.031646 1.023623 -0.355085
+v 0.063534 1.034804 -0.343562
+v 0.094398 1.017781 -0.349243
+v 0.093734 1.004139 -0.358158
+v 0.031423 1.009940 -0.363959
+v 0.031835 1.037014 -0.345772
+v 0.094962 1.031138 -0.339895
+v -0.063157 1.021426 -0.352888
+v -0.062712 1.007758 -0.361777
+v -0.094398 1.017781 -0.349243
+v -0.063534 1.034804 -0.343562
+v -0.031646 1.023623 -0.355085
+v -0.031423 1.009940 -0.363959
+v -0.093734 1.004139 -0.358158
+v -0.094962 1.031138 -0.339895
+v -0.031835 1.037014 -0.345772
+v -0.185167 0.998309 -0.329771
+v -0.183863 0.984804 -0.338823
+v -0.214010 0.989071 -0.320532
+v -0.186273 1.011549 -0.320307
+v -0.155534 1.006198 -0.337660
+v -0.154438 0.992638 -0.346656
+v -0.212502 0.975631 -0.329650
+v -0.215288 1.002256 -0.311013
+v -0.156463 1.019485 -0.328243
+v -0.294558 0.953650 -0.285112
+v -0.292483 0.940460 -0.294479
+v -0.319037 0.939448 -0.270910
+v -0.296317 0.966624 -0.275381
+v -0.268822 0.966694 -0.298155
+v -0.266929 0.953412 -0.307430
+v -0.316789 0.926358 -0.280377
+v -0.320942 0.952337 -0.261094
+v -0.270428 0.979745 -0.288503
+v -0.383875 0.890493 -0.221955
+v -0.381172 0.877748 -0.231767
+v -0.402322 0.872295 -0.203757
+v -0.386168 0.903090 -0.211847
+v -0.363791 0.907802 -0.239264
+v -0.361228 0.894935 -0.248954
+v -0.399488 0.859678 -0.213697
+v -0.404725 0.884783 -0.193540
+v -0.365964 0.920502 -0.229259
+v -0.447032 0.813142 -0.144604
+v -0.443884 0.800942 -0.154960
+v -0.458189 0.792188 -0.123650
+v -0.449702 0.825276 -0.134034
+v -0.433967 0.833537 -0.164999
+v -0.430911 0.821193 -0.175212
+v -0.454962 0.780135 -0.134154
+v -0.460926 0.804197 -0.112955
+v -0.436560 0.845793 -0.154551
+v -0.479725 0.726868 -0.058330
+v -0.476346 0.715275 -0.069294
+v -0.482832 0.704587 -0.036048
+v -0.482590 0.738487 -0.047244
+v -0.474570 0.748959 -0.080421
+v -0.471228 0.737211 -0.091229
+v -0.479431 0.693150 -0.047169
+v -0.485716 0.716072 -0.024830
+v -0.477405 0.760710 -0.069467
+v -0.479725 0.637551 0.030988
+v -0.476346 0.626587 0.019394
+v -0.474570 0.615460 0.053079
+v -0.482590 0.648636 0.042606
+v -0.482832 0.659833 0.008706
+v -0.479431 0.648712 -0.002730
+v -0.471227 0.604651 0.041330
+v -0.477405 0.626413 0.064829
+v -0.485716 0.671051 0.020192
+v -0.454814 0.594727 0.165270
+v -0.453595 0.583583 0.153413
+v -0.441522 0.573976 0.186020
+v -0.455546 0.606037 0.177009
+v -0.466165 0.616045 0.143951
+v -0.464916 0.604845 0.132151
+v -0.440339 0.562889 0.174107
+v -0.442232 0.585253 0.197792
+v -0.466915 0.627390 0.155656
+v -0.390558 0.516029 0.243967
+v -0.389511 0.505097 0.231899
+v -0.370123 0.498419 0.261577
+v -0.391186 0.527212 0.255833
+v -0.409325 0.534544 0.225452
+v -0.408228 0.523562 0.213434
+v -0.369132 0.487534 0.249463
+v -0.370719 0.509574 0.273472
+v -0.409984 0.545757 0.237288
+v -0.299685 0.451772 0.308224
+v -0.298882 0.441012 0.295984
+v -0.273501 0.438502 0.321494
+v -0.300168 0.462853 0.320193
+v -0.324590 0.466222 0.293774
+v -0.323720 0.455423 0.281573
+v -0.272769 0.427778 0.309219
+v -0.273942 0.449561 0.333485
+v -0.325113 0.477325 0.305720
+v -0.188390 0.406336 0.353660
+v -0.187885 0.395698 0.341298
+v -0.158241 0.398310 0.361686
+v -0.188693 0.417343 0.365702
+v -0.217735 0.415735 0.344261
+v -0.217152 0.405072 0.331924
+v -0.157817 0.387693 0.349303
+v -0.158496 0.409304 0.373741
+v -0.218086 0.426758 0.356288
+v -0.064256 0.382817 0.377179
+v -0.064084 0.372242 0.364754
+v -0.032197 0.380582 0.379414
+v -0.064360 0.393786 0.389259
+v -0.096042 0.386525 0.373471
+v -0.095784 0.375940 0.361056
+v -0.032110 0.370012 0.366984
+v -0.032249 0.391547 0.391498
+v -0.096196 0.397500 0.385545
+v 0.064256 0.382817 0.377179
+v 0.064084 0.372242 0.364754
+v 0.096042 0.386525 0.373471
+v 0.064360 0.393786 0.389259
+v 0.032197 0.380582 0.379414
+v 0.032110 0.370012 0.366984
+v 0.095784 0.375940 0.361056
+v 0.096196 0.397500 0.385545
+v 0.032249 0.391547 0.391498
+v 0.188390 0.406336 0.353660
+v 0.187885 0.395698 0.341298
+v 0.217735 0.415735 0.344261
+v 0.188693 0.417343 0.365702
+v 0.158241 0.398310 0.361686
+v 0.157817 0.387693 0.349303
+v 0.217152 0.405072 0.331924
+v 0.218086 0.426758 0.356288
+v 0.158496 0.409304 0.373741
+v 0.299685 0.451772 0.308224
+v 0.298882 0.441012 0.295984
+v 0.324590 0.466222 0.293774
+v 0.300168 0.462853 0.320193
+v 0.273502 0.438502 0.321494
+v 0.272769 0.427777 0.309219
+v 0.323721 0.455423 0.281573
+v 0.325113 0.477325 0.305720
+v 0.273942 0.449561 0.333485
+v 0.390558 0.516029 0.243967
+v 0.389511 0.505097 0.231899
+v 0.409325 0.534544 0.225452
+v 0.391186 0.527212 0.255833
+v 0.370123 0.498418 0.261577
+v 0.369132 0.487533 0.249463
+v 0.408228 0.523562 0.213434
+v 0.409984 0.545757 0.237288
+v 0.370719 0.509574 0.273472
+v 0.454814 0.594726 0.165269
+v 0.453595 0.583583 0.153413
+v 0.466165 0.616045 0.143951
+v 0.455546 0.606037 0.177009
+v 0.441522 0.573976 0.186020
+v 0.440339 0.562889 0.174107
+v 0.464916 0.604845 0.132151
+v 0.466915 0.627390 0.155656
+v 0.442232 0.585253 0.197792
+v 0.488076 0.682502 0.077494
+v 0.486768 0.671124 0.065872
+v 0.491237 0.705172 0.054824
+v 0.488861 0.693954 0.089091
+v 0.482831 0.660027 0.099969
+v 0.481538 0.648709 0.088287
+v 0.489920 0.693733 0.043263
+v 0.492027 0.716660 0.066385
+v 0.483608 0.671442 0.111603
+v 0.488076 0.773374 -0.013379
+v 0.486768 0.761753 -0.024757
+v 0.482831 0.795850 -0.035854
+v 0.488861 0.784972 -0.001927
+v 0.491237 0.750705 0.009291
+v 0.489920 0.739144 -0.002148
+v 0.481538 0.784168 -0.047172
+v 0.483609 0.807484 -0.024439
+v 0.492027 0.762266 0.020779
+v 0.454814 0.861150 -0.101154
+v 0.453595 0.849293 -0.112298
+v 0.441522 0.881900 -0.121905
+v 0.455546 0.872889 -0.089844
+v 0.466165 0.839832 -0.079836
+v 0.464916 0.828032 -0.091036
+v 0.440339 0.869988 -0.132992
+v 0.442232 0.893673 -0.110628
+v 0.466915 0.851536 -0.068491
+v 0.390558 0.939848 -0.179852
+v 0.389511 0.927780 -0.190784
+v 0.370123 0.957458 -0.197463
+v 0.391186 0.951714 -0.168669
+v 0.409325 0.921333 -0.161337
+v 0.408228 0.909315 -0.172319
+v 0.369132 0.945343 -0.208348
+v 0.370719 0.969352 -0.186307
+v 0.409984 0.933169 -0.150124
+v 0.299685 1.004104 -0.244109
+v 0.298882 0.991864 -0.254869
+v 0.273502 1.017375 -0.257379
+v 0.300168 1.016073 -0.233028
+v 0.324590 0.989655 -0.229659
+v 0.323721 0.977454 -0.240458
+v 0.272769 1.005099 -0.268104
+v 0.273942 1.029365 -0.246320
+v 0.325113 1.001601 -0.218556
+v 0.188390 1.049541 -0.289545
+v 0.187885 1.037179 -0.300183
+v 0.158241 1.057567 -0.297571
+v 0.188693 1.061583 -0.278538
+v 0.217735 1.040141 -0.280146
+v 0.217152 1.027805 -0.290809
+v 0.157817 1.045184 -0.308188
+v 0.158496 1.069622 -0.286577
+v 0.218086 1.052168 -0.269123
+v 0.064256 1.073060 -0.313064
+v 0.064084 1.060635 -0.323639
+v 0.032197 1.075295 -0.315299
+v 0.064360 1.085140 -0.302095
+v 0.096042 1.069352 -0.309356
+v 0.095784 1.056937 -0.319941
+v 0.032110 1.062864 -0.325869
+v 0.032249 1.087379 -0.304334
+v 0.096196 1.081426 -0.298381
+v -0.064256 1.073060 -0.313064
+v -0.064084 1.060635 -0.323639
+v -0.096042 1.069352 -0.309356
+v -0.064360 1.085140 -0.302095
+v -0.032197 1.075295 -0.315299
+v -0.032111 1.062864 -0.325869
+v -0.095784 1.056937 -0.319941
+v -0.096196 1.081426 -0.298381
+v -0.032249 1.087379 -0.304334
+v -0.188390 1.049540 -0.289545
+v -0.187885 1.037179 -0.300183
+v -0.217735 1.040141 -0.280146
+v -0.188693 1.061583 -0.278538
+v -0.158241 1.057567 -0.297571
+v -0.157817 1.045184 -0.308188
+v -0.217152 1.027805 -0.290809
+v -0.218086 1.052168 -0.269123
+v -0.158496 1.069622 -0.286577
+v -0.299686 1.004104 -0.244109
+v -0.298883 0.991864 -0.254869
+v -0.324590 0.989655 -0.229659
+v -0.300168 1.016073 -0.233028
+v -0.273502 1.017375 -0.257379
+v -0.272769 1.005099 -0.268104
+v -0.323721 0.977454 -0.240458
+v -0.325113 1.001601 -0.218556
+v -0.273942 1.029365 -0.246320
+v -0.390558 0.939848 -0.179852
+v -0.389511 0.927780 -0.190784
+v -0.409325 0.921333 -0.161337
+v -0.391186 0.951714 -0.168669
+v -0.370123 0.957458 -0.197462
+v -0.369132 0.945343 -0.208347
+v -0.408228 0.909315 -0.172319
+v -0.409984 0.933169 -0.150124
+v -0.370719 0.969352 -0.186307
+v -0.454814 0.861150 -0.101154
+v -0.453596 0.849293 -0.112297
+v -0.466165 0.839832 -0.079836
+v -0.455546 0.872889 -0.089844
+v -0.441522 0.881900 -0.121904
+v -0.440339 0.869988 -0.132992
+v -0.464916 0.828032 -0.091036
+v -0.466916 0.851536 -0.068491
+v -0.442233 0.893673 -0.110628
+v -0.488076 0.773374 -0.013379
+v -0.486768 0.761753 -0.024757
+v -0.491237 0.750705 0.009291
+v -0.488861 0.784972 -0.001927
+v -0.482831 0.795850 -0.035854
+v -0.481538 0.784168 -0.047172
+v -0.489921 0.739144 -0.002148
+v -0.492028 0.762266 0.020779
+v -0.483609 0.807484 -0.024439
+v -0.488076 0.682502 0.077494
+v -0.486768 0.671124 0.065872
+v -0.482831 0.660027 0.099969
+v -0.488861 0.693954 0.089092
+v -0.491237 0.705172 0.054824
+v -0.489920 0.693733 0.043263
+v -0.481538 0.648709 0.088287
+v -0.483608 0.671442 0.111603
+v -0.492027 0.716660 0.066385
+v -0.454814 0.640850 0.211393
+v -0.455546 0.629111 0.200083
+v -0.441522 0.620100 0.232143
+v -0.453595 0.652707 0.222536
+v -0.466165 0.662168 0.190074
+v -0.466915 0.650464 0.178730
+v -0.442232 0.608327 0.220866
+v -0.440339 0.632012 0.243230
+v -0.464916 0.673968 0.201274
+v -0.390558 0.562152 0.290091
+v -0.391186 0.550286 0.278907
+v -0.370123 0.544542 0.307701
+v -0.389511 0.574220 0.301023
+v -0.409325 0.580667 0.271576
+v -0.409984 0.568831 0.260362
+v -0.370719 0.532648 0.296546
+v -0.369132 0.556657 0.318586
+v -0.408228 0.592685 0.282558
+v -0.299685 0.497896 0.354347
+v -0.300168 0.485927 0.343267
+v -0.273502 0.484625 0.367617
+v -0.298882 0.510136 0.365107
+v -0.324590 0.512345 0.339898
+v -0.325113 0.500399 0.328794
+v -0.273942 0.472635 0.356559
+v -0.272769 0.496901 0.378342
+v -0.323720 0.524546 0.350696
+v -0.188390 0.452460 0.399783
+v -0.188693 0.440417 0.388776
+v -0.158241 0.444433 0.407809
+v -0.187885 0.464821 0.410421
+v -0.217735 0.461859 0.390384
+v -0.218086 0.449832 0.379362
+v -0.158496 0.432378 0.396815
+v -0.157817 0.456817 0.418426
+v -0.217152 0.474195 0.401047
+v -0.064256 0.428940 0.423302
+v -0.064360 0.416860 0.412333
+v -0.032197 0.426705 0.425538
+v -0.064084 0.441365 0.433878
+v -0.096042 0.432649 0.419594
+v -0.096196 0.420574 0.408619
+v -0.032249 0.414621 0.414572
+v -0.032110 0.439136 0.436107
+v -0.095784 0.445063 0.430179
+v 0.064256 0.428940 0.423302
+v 0.064360 0.416860 0.412333
+v 0.096042 0.432649 0.419594
+v 0.064084 0.441365 0.433878
+v 0.032197 0.426705 0.425538
+v 0.032249 0.414621 0.414572
+v 0.096196 0.420574 0.408619
+v 0.095784 0.445063 0.430179
+v 0.032110 0.439136 0.436107
+v 0.188390 0.452460 0.399783
+v 0.188693 0.440417 0.388776
+v 0.217735 0.461859 0.390384
+v 0.187885 0.464821 0.410421
+v 0.158241 0.444433 0.407809
+v 0.158496 0.432378 0.396815
+v 0.218086 0.449832 0.379362
+v 0.217152 0.474195 0.401047
+v 0.157817 0.456817 0.418426
+v 0.299685 0.497896 0.354347
+v 0.300168 0.485927 0.343267
+v 0.324590 0.512345 0.339898
+v 0.298882 0.510136 0.365107
+v 0.273502 0.484625 0.367617
+v 0.273942 0.472635 0.356559
+v 0.325113 0.500399 0.328794
+v 0.323721 0.524546 0.350696
+v 0.272769 0.496901 0.378342
+v 0.390558 0.562152 0.290091
+v 0.391186 0.550286 0.278907
+v 0.409325 0.580667 0.271576
+v 0.389511 0.574220 0.301023
+v 0.370123 0.544542 0.307701
+v 0.370719 0.532648 0.296546
+v 0.409984 0.568831 0.260362
+v 0.408228 0.592685 0.282557
+v 0.369132 0.556657 0.318586
+v 0.454814 0.640850 0.211393
+v 0.455546 0.629111 0.200083
+v 0.466165 0.662168 0.190074
+v 0.453595 0.652707 0.222536
+v 0.441522 0.620100 0.232143
+v 0.442232 0.608327 0.220866
+v 0.466915 0.650464 0.178730
+v 0.464916 0.673968 0.201274
+v 0.440339 0.632012 0.243230
+v 0.488076 0.728626 0.123617
+v 0.488861 0.717028 0.112165
+v 0.491237 0.751295 0.100947
+v 0.486768 0.740247 0.134995
+v 0.482831 0.706150 0.146093
+v 0.483608 0.694516 0.134677
+v 0.492027 0.739734 0.089459
+v 0.489920 0.762856 0.112386
+v 0.481538 0.717832 0.157411
+v 0.488076 0.819498 0.032745
+v 0.488861 0.808046 0.021147
+v 0.482831 0.841973 0.010269
+v 0.486768 0.830876 0.044366
+v 0.491237 0.796828 0.055414
+v 0.492027 0.785340 0.043853
+v 0.483609 0.830558 -0.001365
+v 0.481538 0.853291 0.021951
+v 0.489920 0.808267 0.066975
+v 0.454814 0.907274 -0.055031
+v 0.455546 0.895963 -0.066770
+v 0.441522 0.928024 -0.075781
+v 0.453595 0.918417 -0.043174
+v 0.466165 0.885955 -0.033713
+v 0.466915 0.874610 -0.045417
+v 0.442232 0.916747 -0.087554
+v 0.440339 0.939111 -0.063869
+v 0.464916 0.897155 -0.021913
+v 0.390558 0.985971 -0.133729
+v 0.391186 0.974788 -0.145595
+v 0.370123 1.003582 -0.151339
+v 0.389511 0.996903 -0.121661
+v 0.409325 0.967456 -0.115214
+v 0.409984 0.956243 -0.127050
+v 0.370719 0.992426 -0.163233
+v 0.369132 1.014467 -0.139224
+v 0.408228 0.978438 -0.103196
+v 0.299685 1.050228 -0.197985
+v 0.300168 1.039147 -0.209954
+v 0.273502 1.063498 -0.211256
+v 0.298882 1.060988 -0.185745
+v 0.324590 1.035778 -0.183536
+v 0.325113 1.024675 -0.195482
+v 0.273942 1.052439 -0.223246
+v 0.272769 1.074223 -0.198980
+v 0.323721 1.046577 -0.171335
+v 0.188390 1.095664 -0.243421
+v 0.188693 1.084657 -0.255464
+v 0.158241 1.103690 -0.251448
+v 0.187885 1.106302 -0.231060
+v 0.217735 1.086265 -0.234022
+v 0.218086 1.075243 -0.246049
+v 0.158496 1.092696 -0.263503
+v 0.157817 1.114307 -0.239064
+v 0.217152 1.096928 -0.221686
+v 0.064256 1.119183 -0.266941
+v 0.064360 1.108214 -0.279021
+v 0.032197 1.121418 -0.269176
+v 0.064084 1.129758 -0.254516
+v 0.096042 1.115475 -0.263232
+v 0.096196 1.104500 -0.275307
+v 0.032249 1.110453 -0.281260
+v 0.032110 1.131988 -0.256745
+v 0.095784 1.126060 -0.250818
+v -0.064256 1.119183 -0.266941
+v -0.064360 1.108214 -0.279021
+v -0.096042 1.115475 -0.263232
+v -0.064084 1.129758 -0.254516
+v -0.032197 1.121418 -0.269176
+v -0.032249 1.110453 -0.281260
+v -0.096196 1.104500 -0.275307
+v -0.095784 1.126060 -0.250818
+v -0.032111 1.131988 -0.256745
+v -0.188390 1.095664 -0.243421
+v -0.188693 1.084657 -0.255464
+v -0.217735 1.086265 -0.234022
+v -0.187885 1.106302 -0.231060
+v -0.158241 1.103690 -0.251448
+v -0.158496 1.092696 -0.263503
+v -0.218086 1.075243 -0.246049
+v -0.217152 1.096928 -0.221686
+v -0.157817 1.114307 -0.239064
+v -0.299686 1.050228 -0.197985
+v -0.300168 1.039147 -0.209954
+v -0.324590 1.035778 -0.183536
+v -0.298883 1.060988 -0.185745
+v -0.273502 1.063498 -0.211256
+v -0.273942 1.052439 -0.223246
+v -0.325113 1.024675 -0.195482
+v -0.323721 1.046577 -0.171335
+v -0.272769 1.074223 -0.198980
+v -0.390558 0.985971 -0.133729
+v -0.391186 0.974788 -0.145595
+v -0.409325 0.967457 -0.115214
+v -0.389511 0.996904 -0.121661
+v -0.370123 1.003582 -0.151339
+v -0.370719 0.992427 -0.163233
+v -0.409984 0.956243 -0.127050
+v -0.408228 0.978438 -0.103196
+v -0.369132 1.014467 -0.139224
+v -0.454814 0.907274 -0.055031
+v -0.455546 0.895963 -0.066770
+v -0.466165 0.885955 -0.033712
+v -0.453596 0.918417 -0.043174
+v -0.441522 0.928024 -0.075781
+v -0.442233 0.916747 -0.087554
+v -0.466916 0.874611 -0.045417
+v -0.464916 0.897155 -0.021913
+v -0.440339 0.939111 -0.063869
+v -0.488076 0.819498 0.032745
+v -0.488861 0.808046 0.021147
+v -0.491237 0.796828 0.055414
+v -0.486768 0.830876 0.044367
+v -0.482831 0.841973 0.010269
+v -0.483609 0.830558 -0.001365
+v -0.492027 0.785340 0.043853
+v -0.489921 0.808267 0.066975
+v -0.481538 0.853292 0.021951
+v -0.488076 0.728626 0.123617
+v -0.488861 0.717028 0.112166
+v -0.482831 0.706150 0.146093
+v -0.486768 0.740247 0.134995
+v -0.491237 0.751295 0.100948
+v -0.492027 0.739734 0.089459
+v -0.483608 0.694516 0.134677
+v -0.481538 0.717832 0.157411
+v -0.489920 0.762856 0.112386
+v -0.447032 0.688858 0.254842
+v -0.449702 0.676724 0.244272
+v -0.433967 0.668463 0.275237
+v -0.443883 0.701059 0.265199
+v -0.458189 0.709812 0.233888
+v -0.460926 0.697803 0.223193
+v -0.436559 0.656207 0.264789
+v -0.430911 0.680807 0.285450
+v -0.454962 0.721865 0.244392
+v -0.383875 0.611507 0.332193
+v -0.386168 0.598911 0.322085
+v -0.363790 0.594198 0.349503
+v -0.381171 0.624252 0.342005
+v -0.402321 0.629705 0.313995
+v -0.404724 0.617217 0.303779
+v -0.365963 0.581498 0.339498
+v -0.361228 0.607065 0.359192
+v -0.399488 0.642322 0.323935
+v -0.294558 0.548350 0.395350
+v -0.296317 0.535376 0.385620
+v -0.268822 0.535306 0.408394
+v -0.292483 0.561540 0.404717
+v -0.319036 0.562552 0.381148
+v -0.320942 0.549663 0.371333
+v -0.270428 0.522255 0.398741
+v -0.266928 0.548589 0.417669
+v -0.316789 0.575642 0.390615
+v -0.185167 0.503691 0.440009
+v -0.186273 0.490451 0.430545
+v -0.155533 0.495802 0.447898
+v -0.183863 0.517196 0.449061
+v -0.214010 0.512929 0.430771
+v -0.215288 0.499744 0.421252
+v -0.156463 0.482515 0.438481
+v -0.154438 0.509363 0.456895
+v -0.212502 0.526369 0.439888
+v -0.063157 0.480574 0.463126
+v -0.063534 0.467196 0.453800
+v -0.031646 0.478377 0.465323
+v -0.062712 0.494242 0.472015
+v -0.094398 0.484219 0.459481
+v -0.094962 0.470862 0.450134
+v -0.031835 0.464986 0.456010
+v -0.031423 0.492060 0.474197
+v -0.093734 0.497861 0.468396
+v 0.063157 0.480574 0.463126
+v 0.063534 0.467196 0.453800
+v 0.094398 0.484219 0.459481
+v 0.062712 0.494242 0.472015
+v 0.031646 0.478377 0.465323
+v 0.031835 0.464986 0.456010
+v 0.094962 0.470862 0.450134
+v 0.093734 0.497861 0.468396
+v 0.031423 0.492060 0.474197
+v 0.185167 0.503691 0.440009
+v 0.186273 0.490451 0.430545
+v 0.214010 0.512929 0.430771
+v 0.183863 0.517196 0.449061
+v 0.155534 0.495802 0.447898
+v 0.156463 0.482515 0.438481
+v 0.215288 0.499744 0.421252
+v 0.212502 0.526369 0.439888
+v 0.154438 0.509363 0.456895
+v 0.294558 0.548350 0.395350
+v 0.296317 0.535376 0.385620
+v 0.319036 0.562552 0.381148
+v 0.292483 0.561540 0.404717
+v 0.268822 0.535306 0.408394
+v 0.270428 0.522255 0.398741
+v 0.320942 0.549663 0.371333
+v 0.316789 0.575642 0.390615
+v 0.266928 0.548589 0.417669
+v 0.383875 0.611507 0.332193
+v 0.386168 0.598910 0.322085
+v 0.402321 0.629705 0.313995
+v 0.381171 0.624252 0.342005
+v 0.363790 0.594198 0.349502
+v 0.365963 0.581498 0.339498
+v 0.404725 0.617217 0.303779
+v 0.399488 0.642322 0.323935
+v 0.361228 0.607065 0.359192
+v 0.447032 0.688858 0.254842
+v 0.449702 0.676724 0.244272
+v 0.458189 0.709812 0.233888
+v 0.443884 0.701059 0.265199
+v 0.433967 0.668463 0.275237
+v 0.436559 0.656207 0.264789
+v 0.460926 0.697803 0.223193
+v 0.454962 0.721865 0.244392
+v 0.430911 0.680807 0.285450
+v 0.479725 0.775132 0.168568
+v 0.482590 0.763513 0.157483
+v 0.482831 0.797413 0.146287
+v 0.476346 0.786725 0.179532
+v 0.474570 0.753041 0.190659
+v 0.477405 0.741290 0.179706
+v 0.485716 0.785928 0.135068
+v 0.479431 0.808849 0.157408
+v 0.471227 0.764789 0.201468
+v 0.479725 0.864449 0.079251
+v 0.482590 0.853364 0.067632
+v 0.474570 0.886540 0.057160
+v 0.476346 0.875413 0.090844
+v 0.482832 0.842167 0.101533
+v 0.485716 0.830949 0.090047
+v 0.477405 0.875587 0.045409
+v 0.471227 0.897349 0.068908
+v 0.479431 0.853288 0.112969
+v 0.447032 0.950723 -0.007023
+v 0.449702 0.940153 -0.019157
+v 0.433967 0.971118 -0.027418
+v 0.443884 0.961079 0.005178
+v 0.458189 0.929769 0.013931
+v 0.460926 0.919074 0.001922
+v 0.436559 0.960670 -0.039674
+v 0.430911 0.981331 -0.015074
+v 0.454962 0.940273 0.025984
+v 0.383875 1.028074 -0.084374
+v 0.386168 1.017966 -0.096971
+v 0.363790 1.045383 -0.101683
+v 0.381171 1.037886 -0.071629
+v 0.402321 1.009876 -0.066176
+v 0.404725 0.999659 -0.078664
+v 0.365963 1.035379 -0.114383
+v 0.361228 1.055073 -0.088816
+v 0.399488 1.019816 -0.053559
+v 0.294558 1.091231 -0.147531
+v 0.296317 1.081501 -0.160505
+v 0.268822 1.104275 -0.160575
+v 0.292483 1.100598 -0.134341
+v 0.319036 1.077029 -0.133329
+v 0.320942 1.067214 -0.146218
+v 0.270428 1.094622 -0.173626
+v 0.266928 1.113549 -0.147292
+v 0.316789 1.086496 -0.120239
+v 0.185167 1.135890 -0.192190
+v 0.186273 1.126426 -0.205430
+v 0.155534 1.143779 -0.200079
+v 0.183863 1.144942 -0.178685
+v 0.214010 1.126652 -0.182952
+v 0.215288 1.117132 -0.196137
+v 0.156463 1.134362 -0.213366
+v 0.154438 1.152775 -0.186518
+v 0.212502 1.135769 -0.169512
+v 0.063157 1.159007 -0.215307
+v 0.063534 1.149681 -0.228685
+v 0.031646 1.161204 -0.217504
+v 0.062712 1.167896 -0.201639
+v 0.094398 1.155362 -0.211662
+v 0.094962 1.146014 -0.225019
+v 0.031835 1.151891 -0.230895
+v 0.031423 1.170078 -0.203821
+v 0.093734 1.164277 -0.198020
+v -0.063157 1.159007 -0.215307
+v -0.063534 1.149681 -0.228685
+v -0.094398 1.155362 -0.211662
+v -0.062712 1.167896 -0.201639
+v -0.031646 1.161204 -0.217504
+v -0.031835 1.151891 -0.230895
+v -0.094962 1.146014 -0.225019
+v -0.093734 1.164277 -0.198020
+v -0.031423 1.170078 -0.203821
+v -0.185167 1.135890 -0.192190
+v -0.186273 1.126426 -0.205430
+v -0.214010 1.126652 -0.182952
+v -0.183863 1.144942 -0.178685
+v -0.155534 1.143779 -0.200079
+v -0.156463 1.134362 -0.213366
+v -0.215288 1.117132 -0.196137
+v -0.212502 1.135769 -0.169512
+v -0.154438 1.152775 -0.186518
+v -0.294558 1.091231 -0.147531
+v -0.296317 1.081500 -0.160505
+v -0.319037 1.077029 -0.133329
+v -0.292483 1.100598 -0.134341
+v -0.268822 1.104275 -0.160575
+v -0.270428 1.094622 -0.173626
+v -0.320942 1.067214 -0.146218
+v -0.316789 1.086496 -0.120239
+v -0.266929 1.113549 -0.147292
+v -0.383875 1.028074 -0.084374
+v -0.386168 1.017966 -0.096970
+v -0.402322 1.009876 -0.066176
+v -0.381172 1.037886 -0.071629
+v -0.363791 1.045383 -0.101683
+v -0.365964 1.035379 -0.114383
+v -0.404725 0.999660 -0.078664
+v -0.399488 1.019816 -0.053559
+v -0.361228 1.055073 -0.088816
+v -0.447032 0.950723 -0.007023
+v -0.449702 0.940153 -0.019157
+v -0.458189 0.929769 0.013931
+v -0.443884 0.961080 0.005178
+v -0.433967 0.971118 -0.027418
+v -0.436560 0.960670 -0.039674
+v -0.460926 0.919074 0.001922
+v -0.454962 0.940273 0.025984
+v -0.430911 0.981331 -0.015074
+v -0.479725 0.864449 0.079251
+v -0.482590 0.853364 0.067632
+v -0.482832 0.842167 0.101533
+v -0.476346 0.875413 0.090844
+v -0.474570 0.886540 0.057160
+v -0.477405 0.875587 0.045409
+v -0.485716 0.830949 0.090047
+v -0.479431 0.853288 0.112969
+v -0.471228 0.897349 0.068909
+v -0.479725 0.775132 0.168568
+v -0.482590 0.763513 0.157483
+v -0.474570 0.753041 0.190659
+v -0.476346 0.786725 0.179532
+v -0.482832 0.797414 0.146287
+v -0.485716 0.785928 0.135068
+v -0.477405 0.741290 0.179706
+v -0.471227 0.764789 0.201468
+v -0.479431 0.808850 0.157408
+v -0.431601 0.737929 0.294874
+v -0.436164 0.725607 0.285225
+v -0.418987 0.718238 0.314565
+v -0.426577 0.750265 0.304267
+v -0.442373 0.758160 0.274644
+v -0.447049 0.746052 0.264781
+v -0.423417 0.705708 0.305125
+v -0.414110 0.730803 0.323729
+v -0.437223 0.770260 0.284272
+v -0.370624 0.663248 0.369555
+v -0.374542 0.650137 0.360696
+v -0.351233 0.646537 0.386267
+v -0.366310 0.676453 0.378079
+v -0.388434 0.680818 0.351986
+v -0.392540 0.667892 0.342940
+v -0.354946 0.633249 0.377584
+v -0.347144 0.659936 0.394596
+v -0.383912 0.693819 0.360713
+v -0.284390 0.602271 0.430532
+v -0.287396 0.588515 0.422318
+v -0.259542 0.589678 0.443126
+v -0.281079 0.616186 0.438345
+v -0.308024 0.615983 0.416821
+v -0.311280 0.602372 0.408461
+v -0.262286 0.575789 0.435044
+v -0.256521 0.603740 0.450792
+v -0.304438 0.629739 0.424793
+v -0.178775 0.559154 0.473649
+v -0.180665 0.544942 0.465890
+v -0.150165 0.551537 0.481266
+v -0.176694 0.573571 0.480961
+v -0.206622 0.568073 0.464730
+v -0.208807 0.553956 0.456877
+v -0.151752 0.537245 0.473588
+v -0.148417 0.566043 0.488489
+v -0.204217 0.582387 0.472145
+v -0.060977 0.536835 0.495969
+v -0.061621 0.522387 0.488445
+v -0.030553 0.534714 0.498090
+v -0.060267 0.551512 0.503020
+v -0.091140 0.540354 0.492449
+v -0.092103 0.525944 0.484889
+v -0.030876 0.520244 0.490589
+v -0.030198 0.549415 0.505116
+v -0.090079 0.554990 0.499542
+v 0.060977 0.536835 0.495969
+v 0.061621 0.522387 0.488445
+v 0.091140 0.540354 0.492450
+v 0.060267 0.551512 0.503020
+v 0.030554 0.534714 0.498090
+v 0.030877 0.520244 0.490589
+v 0.092103 0.525944 0.484889
+v 0.090079 0.554990 0.499542
+v 0.030198 0.549415 0.505116
+v 0.178775 0.559154 0.473649
+v 0.180665 0.544942 0.465890
+v 0.206622 0.568073 0.464730
+v 0.176694 0.573571 0.480961
+v 0.150165 0.551537 0.481266
+v 0.151752 0.537245 0.473588
+v 0.208807 0.553956 0.456877
+v 0.204217 0.582386 0.472145
+v 0.148417 0.566043 0.488489
+v 0.284390 0.602271 0.430532
+v 0.287397 0.588515 0.422318
+v 0.308024 0.615983 0.416821
+v 0.281079 0.616186 0.438345
+v 0.259543 0.589678 0.443126
+v 0.262286 0.575789 0.435044
+v 0.311280 0.602372 0.408461
+v 0.304438 0.629738 0.424793
+v 0.256521 0.603740 0.450792
+v 0.370624 0.663248 0.369555
+v 0.374543 0.650137 0.360696
+v 0.388434 0.680818 0.351986
+v 0.366310 0.676453 0.378078
+v 0.351233 0.646536 0.386267
+v 0.354946 0.633249 0.377584
+v 0.392540 0.667892 0.342940
+v 0.383912 0.693819 0.360713
+v 0.347144 0.659936 0.394596
+v 0.431601 0.737929 0.294874
+v 0.436164 0.725607 0.285225
+v 0.442373 0.758160 0.274644
+v 0.426577 0.750265 0.304267
+v 0.418987 0.718238 0.314565
+v 0.423417 0.705708 0.305125
+v 0.447049 0.746052 0.264781
+v 0.437223 0.770260 0.284272
+v 0.414110 0.730803 0.323729
+v 0.463165 0.821225 0.211578
+v 0.468062 0.809784 0.201049
+v 0.466165 0.842737 0.190066
+v 0.457773 0.832591 0.221941
+v 0.458189 0.799896 0.232907
+v 0.463032 0.788230 0.222603
+v 0.471093 0.831524 0.179309
+v 0.460738 0.853853 0.200678
+v 0.452854 0.811511 0.243021
+v 0.463165 0.907459 0.125344
+v 0.468062 0.896930 0.113903
+v 0.458189 0.928788 0.104016
+v 0.457773 0.917821 0.136710
+v 0.466165 0.885947 0.146857
+v 0.471093 0.875190 0.135643
+v 0.463032 0.918484 0.092349
+v 0.452854 0.938902 0.115630
+v 0.460738 0.896559 0.157972
+v 0.431601 0.990755 0.042048
+v 0.436164 0.981106 0.029726
+v 0.418987 1.010446 0.022357
+v 0.426577 1.000148 0.054384
+v 0.442373 0.970525 0.062279
+v 0.447049 0.960662 0.050171
+v 0.423417 1.001005 0.009827
+v 0.414110 1.019609 0.034922
+v 0.437223 0.980153 0.074379
+v 0.370624 1.065436 -0.032633
+v 0.374543 1.056577 -0.045744
+v 0.351233 1.082148 -0.049344
+v 0.366310 1.073959 -0.019428
+v 0.388434 1.047866 -0.015063
+v 0.392540 1.038821 -0.027989
+v 0.354946 1.073465 -0.062632
+v 0.347144 1.090476 -0.035945
+v 0.383912 1.056594 -0.002062
+v 0.284390 1.126413 -0.093610
+v 0.287397 1.118198 -0.107366
+v 0.259543 1.139006 -0.106203
+v 0.281079 1.134226 -0.079695
+v 0.308024 1.112701 -0.079898
+v 0.311280 1.104342 -0.093509
+v 0.262286 1.130925 -0.120092
+v 0.256521 1.146673 -0.092141
+v 0.304438 1.120674 -0.066143
+v 0.178775 1.169530 -0.136727
+v 0.180665 1.161771 -0.150939
+v 0.150165 1.177147 -0.144344
+v 0.176694 1.176841 -0.122310
+v 0.206622 1.160611 -0.127808
+v 0.208807 1.152758 -0.141925
+v 0.151752 1.169468 -0.158636
+v 0.148417 1.184370 -0.129838
+v 0.204217 1.168026 -0.113494
+v 0.060977 1.191849 -0.159046
+v 0.061621 1.184326 -0.173494
+v 0.030553 1.193970 -0.161167
+v 0.060267 1.198901 -0.144369
+v 0.091140 1.188330 -0.155527
+v 0.092103 1.180770 -0.169937
+v 0.030876 1.186470 -0.175637
+v 0.030198 1.200997 -0.146466
+v 0.090079 1.195423 -0.140891
+v -0.060977 1.191849 -0.159046
+v -0.061622 1.184326 -0.173494
+v -0.091140 1.188330 -0.155527
+v -0.060267 1.198901 -0.144369
+v -0.030554 1.193970 -0.161167
+v -0.030877 1.186470 -0.175637
+v -0.092103 1.180770 -0.169937
+v -0.090079 1.195423 -0.140891
+v -0.030198 1.200997 -0.146466
+v -0.178775 1.169530 -0.136727
+v -0.180665 1.161771 -0.150939
+v -0.206622 1.160611 -0.127808
+v -0.176694 1.176841 -0.122310
+v -0.150165 1.177147 -0.144344
+v -0.151752 1.169468 -0.158636
+v -0.208807 1.152758 -0.141925
+v -0.204217 1.168026 -0.113494
+v -0.148417 1.184369 -0.129838
+v -0.284390 1.126413 -0.093610
+v -0.287397 1.118198 -0.107366
+v -0.308024 1.112701 -0.079898
+v -0.281079 1.134226 -0.079695
+v -0.259543 1.139006 -0.106203
+v -0.262286 1.130925 -0.120092
+v -0.311280 1.104342 -0.093509
+v -0.304438 1.120674 -0.066143
+v -0.256521 1.146673 -0.092141
+v -0.370625 1.065436 -0.032633
+v -0.374543 1.056577 -0.045744
+v -0.388434 1.047866 -0.015063
+v -0.366310 1.073959 -0.019428
+v -0.351233 1.082148 -0.049344
+v -0.354946 1.073465 -0.062632
+v -0.392540 1.038821 -0.027989
+v -0.383912 1.056594 -0.002062
+v -0.347144 1.090476 -0.035945
+v -0.431601 0.990755 0.042048
+v -0.436164 0.981106 0.029726
+v -0.442373 0.970525 0.062279
+v -0.426577 1.000148 0.054384
+v -0.418988 1.010446 0.022357
+v -0.423417 1.001005 0.009827
+v -0.447050 0.960662 0.050171
+v -0.437223 0.980153 0.074379
+v -0.414110 1.019609 0.034922
+v -0.463165 0.907459 0.125344
+v -0.468062 0.896930 0.113903
+v -0.466165 0.885947 0.146857
+v -0.457773 0.917821 0.136710
+v -0.458189 0.928788 0.104016
+v -0.463032 0.918484 0.092349
+v -0.471093 0.875190 0.135643
+v -0.460738 0.896559 0.157972
+v -0.452855 0.938902 0.115630
+v -0.463165 0.821225 0.211578
+v -0.468062 0.809784 0.201049
+v -0.458189 0.799896 0.232907
+v -0.457773 0.832591 0.221941
+v -0.466165 0.842738 0.190066
+v -0.471093 0.831524 0.179309
+v -0.463032 0.788230 0.222603
+v -0.452854 0.811511 0.243021
+v -0.460738 0.853853 0.200679
+v -0.408785 0.787224 0.330804
+v -0.415163 0.774926 0.322241
+v -0.396838 0.768574 0.349454
+v -0.401971 0.799484 0.339072
+v -0.418988 0.806385 0.311643
+v -0.425524 0.794386 0.302781
+v -0.403029 0.755985 0.341182
+v -0.390223 0.781145 0.357411
+v -0.412003 0.818326 0.320230
+v -0.351032 0.716491 0.401537
+v -0.356508 0.703089 0.394078
+v -0.332666 0.700663 0.417366
+v -0.345180 0.729930 0.408626
+v -0.367900 0.733132 0.384896
+v -0.373639 0.719990 0.377177
+v -0.337855 0.687014 0.410153
+v -0.327120 0.714365 0.424190
+v -0.361767 0.746293 0.392262
+v -0.269356 0.658737 0.459291
+v -0.273558 0.644434 0.452732
+v -0.245822 0.646810 0.471218
+v -0.264866 0.673139 0.465417
+v -0.291741 0.671724 0.446304
+v -0.296292 0.657624 0.439543
+v -0.249657 0.632321 0.464846
+v -0.241724 0.661410 0.477145
+v -0.286877 0.685910 0.452646
+v -0.169324 0.617900 0.500129
+v -0.171966 0.602960 0.494207
+v -0.142227 0.610686 0.507343
+v -0.166502 0.632982 0.505574
+v -0.195700 0.626347 0.491681
+v -0.198753 0.611539 0.485628
+v -0.144445 0.595633 0.501534
+v -0.139856 0.625888 0.512668
+v -0.192437 0.641289 0.497267
+v -0.057753 0.596760 0.521268
+v -0.058654 0.581491 0.515676
+v -0.028938 0.594751 0.523277
+v -0.056791 0.612195 0.526361
+v -0.086322 0.600093 0.517935
+v -0.087669 0.584876 0.512291
+v -0.029390 0.579450 0.517717
+v -0.028456 0.610220 0.528336
+v -0.084883 0.615473 0.523083
+v 0.057753 0.596760 0.521268
+v 0.058654 0.581490 0.515676
+v 0.086322 0.600093 0.517935
+v 0.056791 0.612195 0.526361
+v 0.028938 0.594751 0.523277
+v 0.029390 0.579450 0.517717
+v 0.087669 0.584875 0.512291
+v 0.084883 0.615473 0.523083
+v 0.028456 0.610220 0.528336
+v 0.169325 0.617900 0.500129
+v 0.171966 0.602959 0.494207
+v 0.195700 0.626347 0.491681
+v 0.166502 0.632982 0.505574
+v 0.142227 0.610685 0.507343
+v 0.144445 0.595633 0.501534
+v 0.198753 0.611539 0.485628
+v 0.192437 0.641289 0.497267
+v 0.139856 0.625888 0.512668
+v 0.269356 0.658737 0.459291
+v 0.273558 0.644434 0.452732
+v 0.291741 0.671724 0.446304
+v 0.264866 0.673139 0.465417
+v 0.245822 0.646810 0.471218
+v 0.249657 0.632321 0.464846
+v 0.296292 0.657624 0.439543
+v 0.286877 0.685909 0.452646
+v 0.241724 0.661410 0.477145
+v 0.351032 0.716491 0.401537
+v 0.356508 0.703089 0.394078
+v 0.367900 0.733132 0.384896
+v 0.345180 0.729930 0.408626
+v 0.332666 0.700663 0.417366
+v 0.337855 0.687014 0.410153
+v 0.373640 0.719990 0.377177
+v 0.361767 0.746293 0.392262
+v 0.327120 0.714365 0.424190
+v 0.408786 0.787224 0.330804
+v 0.415163 0.774925 0.322241
+v 0.418988 0.806385 0.311643
+v 0.401971 0.799484 0.339072
+v 0.396839 0.768574 0.349454
+v 0.403029 0.755984 0.341182
+v 0.425524 0.794386 0.302781
+v 0.412003 0.818325 0.320230
+v 0.390223 0.781145 0.357411
+v 0.438681 0.866117 0.251911
+v 0.445525 0.855049 0.242118
+v 0.441522 0.886492 0.231536
+v 0.431368 0.877061 0.261494
+v 0.433967 0.845916 0.272113
+v 0.440737 0.834533 0.262634
+v 0.448410 0.875742 0.221425
+v 0.434162 0.897097 0.241459
+v 0.426733 0.857197 0.281359
+v 0.438681 0.947792 0.170236
+v 0.445525 0.937999 0.159168
+v 0.433967 0.967993 0.150035
+v 0.431368 0.957375 0.181180
+v 0.441522 0.927417 0.190611
+v 0.448410 0.917305 0.179861
+v 0.440737 0.958515 0.138652
+v 0.426733 0.977240 0.161316
+v 0.434162 0.937340 0.201216
+v 0.408786 1.026685 0.091343
+v 0.415163 1.018122 0.079045
+v 0.396839 1.045335 0.072693
+v 0.401971 1.034953 0.103603
+v 0.418988 1.007524 0.110504
+v 0.425524 0.998662 0.098505
+v 0.403029 1.037063 0.060104
+v 0.390223 1.053292 0.085264
+v 0.412003 1.016111 0.122444
+v 0.351032 1.097418 0.020610
+v 0.356508 1.089959 0.007208
+v 0.332666 1.113246 0.004782
+v 0.345180 1.104507 0.034049
+v 0.367900 1.080777 0.037251
+v 0.373640 1.073058 0.024109
+v 0.337856 1.106034 -0.008867
+v 0.327120 1.120071 0.018484
+v 0.361767 1.088143 0.050412
+v 0.269356 1.155172 -0.037144
+v 0.273558 1.148613 -0.051447
+v 0.245822 1.167099 -0.049071
+v 0.264866 1.161298 -0.022742
+v 0.291741 1.142185 -0.024157
+v 0.296292 1.135424 -0.038257
+v 0.249657 1.160727 -0.063560
+v 0.241725 1.173026 -0.034471
+v 0.286877 1.148527 -0.009972
+v 0.169325 1.196010 -0.077982
+v 0.171966 1.190088 -0.092922
+v 0.142227 1.203224 -0.085196
+v 0.166502 1.201455 -0.062899
+v 0.195700 1.187562 -0.069534
+v 0.198753 1.181509 -0.084342
+v 0.144445 1.197415 -0.100248
+v 0.139856 1.208549 -0.069993
+v 0.192437 1.193148 -0.054592
+v 0.057753 1.217149 -0.099121
+v 0.058654 1.211557 -0.114391
+v 0.028938 1.219158 -0.101130
+v 0.056791 1.222242 -0.083686
+v 0.086322 1.213816 -0.095788
+v 0.087669 1.208172 -0.111006
+v 0.029390 1.213598 -0.116431
+v 0.028456 1.224217 -0.085661
+v 0.084883 1.218964 -0.080408
+v -0.057753 1.217149 -0.099121
+v -0.058654 1.211557 -0.114391
+v -0.086322 1.213816 -0.095788
+v -0.056791 1.222242 -0.083686
+v -0.028938 1.219158 -0.101130
+v -0.029390 1.213598 -0.116431
+v -0.087669 1.208172 -0.111006
+v -0.084883 1.218964 -0.080408
+v -0.028456 1.224217 -0.085661
+v -0.169325 1.196010 -0.077982
+v -0.171966 1.190088 -0.092922
+v -0.195700 1.187562 -0.069534
+v -0.166502 1.201455 -0.062899
+v -0.142227 1.203224 -0.085196
+v -0.144445 1.197415 -0.100248
+v -0.198753 1.181509 -0.084342
+v -0.192437 1.193148 -0.054592
+v -0.139856 1.208549 -0.069993
+v -0.269357 1.155172 -0.037144
+v -0.273559 1.148613 -0.051447
+v -0.291741 1.142185 -0.024157
+v -0.264866 1.161298 -0.022742
+v -0.245822 1.167099 -0.049071
+v -0.249657 1.160727 -0.063560
+v -0.296292 1.135424 -0.038257
+v -0.286877 1.148527 -0.009971
+v -0.241725 1.173026 -0.034471
+v -0.351032 1.097418 0.020610
+v -0.356508 1.089959 0.007208
+v -0.367900 1.080777 0.037251
+v -0.345180 1.104507 0.034049
+v -0.332666 1.113246 0.004782
+v -0.337856 1.106034 -0.008867
+v -0.373640 1.073058 0.024109
+v -0.361767 1.088143 0.050412
+v -0.327120 1.120071 0.018484
+v -0.408786 1.026685 0.091343
+v -0.415163 1.018122 0.079045
+v -0.418988 1.007524 0.110504
+v -0.401971 1.034953 0.103603
+v -0.396839 1.045335 0.072693
+v -0.403029 1.037063 0.060104
+v -0.425524 0.998662 0.098505
+v -0.412003 1.016111 0.122445
+v -0.390223 1.053292 0.085264
+v -0.438681 0.947792 0.170236
+v -0.445525 0.937999 0.159168
+v -0.441522 0.927417 0.190611
+v -0.431368 0.957375 0.181180
+v -0.433968 0.967993 0.150035
+v -0.440738 0.958515 0.138652
+v -0.448410 0.917306 0.179861
+v -0.434162 0.937340 0.201216
+v -0.426733 0.977240 0.161316
+v -0.438681 0.866117 0.251912
+v -0.445525 0.855049 0.242118
+v -0.433967 0.845916 0.272113
+v -0.431368 0.877061 0.261495
+v -0.441522 0.886492 0.231536
+v -0.448410 0.875742 0.221425
+v -0.440737 0.834533 0.262634
+v -0.426733 0.857197 0.281359
+v -0.434162 0.897097 0.241459
+v -0.378975 0.835899 0.362017
+v -0.387058 0.823834 0.354687
+v -0.367900 0.818609 0.379307
+v -0.370487 0.847873 0.369019
+v -0.388434 0.853663 0.344253
+v -0.396718 0.841977 0.336544
+v -0.375746 0.806176 0.372346
+v -0.359660 0.830970 0.385922
+v -0.379734 0.865239 0.351653
+v -0.325434 0.770324 0.427592
+v -0.332374 0.756861 0.421660
+v -0.308407 0.755650 0.442266
+v -0.318145 0.783767 0.433125
+v -0.341072 0.785752 0.412165
+v -0.348346 0.772617 0.405904
+v -0.314984 0.741874 0.436647
+v -0.301499 0.769422 0.447470
+v -0.333432 0.798849 0.418043
+v -0.249714 0.716782 0.481134
+v -0.255040 0.702177 0.476344
+v -0.227896 0.705725 0.492192
+v -0.244121 0.731424 0.485468
+v -0.270466 0.728822 0.469094
+v -0.276234 0.714474 0.464047
+v -0.232756 0.690883 0.487638
+v -0.222792 0.720614 0.496278
+v -0.264408 0.743194 0.473698
+v -0.156977 0.678922 0.518994
+v -0.160325 0.663510 0.515011
+v -0.131855 0.672234 0.525682
+v -0.153461 0.694412 0.522480
+v -0.181429 0.686754 0.511162
+v -0.185298 0.671509 0.507013
+v -0.134667 0.656679 0.521842
+v -0.128902 0.687874 0.529018
+v -0.177365 0.702069 0.514823
+v -0.053542 0.659325 0.538591
+v -0.054684 0.643494 0.535027
+v -0.026828 0.657462 0.540454
+v -0.052343 0.675254 0.541638
+v -0.080027 0.662415 0.535501
+v -0.081734 0.646650 0.531871
+v -0.027400 0.641592 0.536929
+v -0.026227 0.673433 0.543459
+v -0.078235 0.678274 0.538618
+v 0.053542 0.659325 0.538591
+v 0.054684 0.643494 0.535027
+v 0.080027 0.662415 0.535501
+v 0.052343 0.675253 0.541638
+v 0.026828 0.657462 0.540454
+v 0.027400 0.641592 0.536929
+v 0.081734 0.646650 0.531871
+v 0.078235 0.678274 0.538618
+v 0.026227 0.673433 0.543459
+v 0.156977 0.678922 0.518994
+v 0.160325 0.663510 0.515011
+v 0.181429 0.686754 0.511162
+v 0.153461 0.694412 0.522480
+v 0.131855 0.672234 0.525682
+v 0.134667 0.656679 0.521842
+v 0.185298 0.671509 0.507013
+v 0.177365 0.702069 0.514823
+v 0.128902 0.687874 0.529018
+v 0.249714 0.716782 0.481134
+v 0.255040 0.702177 0.476344
+v 0.270466 0.728822 0.469094
+v 0.244121 0.731424 0.485468
+v 0.227896 0.705724 0.492192
+v 0.232757 0.690883 0.487638
+v 0.276234 0.714474 0.464047
+v 0.264408 0.743194 0.473698
+v 0.222792 0.720614 0.496278
+v 0.325434 0.770324 0.427592
+v 0.332374 0.756861 0.421660
+v 0.341072 0.785752 0.412165
+v 0.318145 0.783767 0.433125
+v 0.308407 0.755650 0.442266
+v 0.314984 0.741874 0.436647
+v 0.348346 0.772617 0.405904
+v 0.333433 0.798849 0.418043
+v 0.301499 0.769421 0.447470
+v 0.378976 0.835899 0.362017
+v 0.387058 0.823834 0.354687
+v 0.388434 0.853663 0.344253
+v 0.370488 0.847873 0.369019
+v 0.367900 0.818609 0.379307
+v 0.375746 0.806176 0.372346
+v 0.396718 0.841977 0.336544
+v 0.379734 0.865239 0.351653
+v 0.359660 0.830970 0.385922
+v 0.406691 0.909039 0.288877
+v 0.415364 0.898534 0.279987
+v 0.409325 0.927928 0.269988
+v 0.397582 0.919375 0.297517
+v 0.402321 0.890311 0.307605
+v 0.410901 0.879406 0.299115
+v 0.418055 0.917826 0.260695
+v 0.400157 0.937841 0.279051
+v 0.393310 0.901066 0.315826
+v 0.406691 0.984758 0.213158
+v 0.415364 0.975868 0.202653
+v 0.402321 1.003486 0.194430
+v 0.397582 0.993398 0.223494
+v 0.409325 0.965869 0.232047
+v 0.418055 0.956576 0.221945
+v 0.410901 0.994995 0.183525
+v 0.393310 1.011707 0.205185
+v 0.400157 0.974932 0.241960
+v 0.378976 1.057898 0.140018
+v 0.387058 1.050568 0.127953
+v 0.367900 1.075188 0.122728
+v 0.370488 1.064900 0.151992
+v 0.388434 1.040134 0.157782
+v 0.396718 1.032425 0.146096
+v 0.375746 1.068226 0.110295
+v 0.359660 1.081802 0.135089
+v 0.379734 1.047534 0.169358
+v 0.325434 1.123473 0.074443
+v 0.332374 1.117541 0.060980
+v 0.308407 1.138147 0.059769
+v 0.318145 1.129006 0.087886
+v 0.341072 1.108045 0.089871
+v 0.348346 1.101785 0.076736
+v 0.314984 1.132528 0.045993
+v 0.301499 1.143351 0.073540
+v 0.333433 1.113924 0.102968
+v 0.249714 1.177015 0.020901
+v 0.255040 1.172225 0.006296
+v 0.227896 1.188073 0.009843
+v 0.244121 1.181349 0.035543
+v 0.270466 1.164975 0.032941
+v 0.276234 1.159928 0.018593
+v 0.232757 1.183519 -0.004998
+v 0.222792 1.192159 0.024733
+v 0.264408 1.169578 0.047313
+v 0.156977 1.214875 -0.016959
+v 0.160325 1.210892 -0.032371
+v 0.131855 1.221563 -0.023647
+v 0.153461 1.218361 -0.001469
+v 0.181429 1.207043 -0.009127
+v 0.185298 1.202893 -0.024372
+v 0.134667 1.217723 -0.039202
+v 0.128902 1.224899 -0.008007
+v 0.177365 1.210704 0.006188
+v 0.053542 1.234472 -0.036556
+v 0.054684 1.230908 -0.052387
+v 0.026828 1.236335 -0.038419
+v 0.052343 1.237519 -0.020628
+v 0.080027 1.231382 -0.033466
+v 0.081734 1.227752 -0.049231
+v 0.027400 1.232810 -0.054289
+v 0.026227 1.239340 -0.022448
+v 0.078235 1.234499 -0.017607
+v -0.053542 1.234472 -0.036556
+v -0.054684 1.230908 -0.052387
+v -0.080027 1.231382 -0.033466
+v -0.052343 1.237519 -0.020628
+v -0.026828 1.236335 -0.038419
+v -0.027400 1.232810 -0.054289
+v -0.081734 1.227752 -0.049231
+v -0.078235 1.234499 -0.017607
+v -0.026227 1.239340 -0.022448
+v -0.156977 1.214875 -0.016959
+v -0.160325 1.210892 -0.032371
+v -0.181429 1.207043 -0.009127
+v -0.153461 1.218361 -0.001469
+v -0.131855 1.221563 -0.023647
+v -0.134667 1.217723 -0.039202
+v -0.185298 1.202893 -0.024372
+v -0.177365 1.210704 0.006188
+v -0.128902 1.224899 -0.008007
+v -0.249714 1.177015 0.020901
+v -0.255040 1.172225 0.006296
+v -0.270466 1.164975 0.032941
+v -0.244121 1.181349 0.035543
+v -0.227896 1.188072 0.009843
+v -0.232757 1.183519 -0.004998
+v -0.276234 1.159928 0.018593
+v -0.264408 1.169578 0.047313
+v -0.222792 1.192159 0.024733
+v -0.325434 1.123473 0.074443
+v -0.332374 1.117541 0.060980
+v -0.341072 1.108045 0.089871
+v -0.318145 1.129006 0.087886
+v -0.308407 1.138147 0.059769
+v -0.314984 1.132528 0.045993
+v -0.348346 1.101785 0.076736
+v -0.333433 1.113924 0.102968
+v -0.301499 1.143351 0.073541
+v -0.378976 1.057898 0.140018
+v -0.387058 1.050568 0.127953
+v -0.388434 1.040134 0.157782
+v -0.370488 1.064900 0.151992
+v -0.367900 1.075188 0.122728
+v -0.375746 1.068226 0.110295
+v -0.396718 1.032425 0.146096
+v -0.379734 1.047534 0.169358
+v -0.359660 1.081802 0.135089
+v -0.406691 0.984758 0.213158
+v -0.415365 0.975868 0.202653
+v -0.409325 0.965869 0.232047
+v -0.397582 0.993398 0.223494
+v -0.402321 1.003486 0.194430
+v -0.410901 0.994996 0.183526
+v -0.418055 0.956576 0.221945
+v -0.400157 0.974932 0.241960
+v -0.393310 1.011707 0.205185
+v -0.406691 0.909039 0.288877
+v -0.415364 0.898534 0.279987
+v -0.402321 0.890311 0.307605
+v -0.397582 0.919375 0.297517
+v -0.409325 0.927928 0.269988
+v -0.418055 0.917826 0.260695
+v -0.410901 0.879406 0.299115
+v -0.393310 0.901066 0.315826
+v -0.400157 0.937841 0.279051
+v -0.342681 0.883122 0.387979
+v -0.352330 0.871497 0.382007
+v -0.332666 0.867487 0.403613
+v -0.332665 0.894605 0.393595
+v -0.351233 0.899184 0.371916
+v -0.361124 0.888012 0.365492
+v -0.342033 0.855423 0.398081
+v -0.322942 0.879428 0.408772
+v -0.340967 0.910198 0.378001
+v -0.294267 0.823827 0.447274
+v -0.302553 0.810532 0.442971
+v -0.278870 0.810558 0.460542
+v -0.285666 0.837043 0.451156
+v -0.308407 0.837777 0.433324
+v -0.317092 0.824875 0.428628
+v -0.286723 0.796890 0.456613
+v -0.270719 0.824162 0.464037
+v -0.299393 0.850585 0.437614
+v -0.225799 0.775413 0.495688
+v -0.232157 0.760755 0.492749
+v -0.206070 0.765414 0.505686
+v -0.219199 0.790044 0.498155
+v -0.244563 0.786299 0.484801
+v -0.251450 0.771948 0.481555
+v -0.211873 0.750475 0.503029
+v -0.200047 0.780338 0.507862
+v -0.237415 0.800613 0.487587
+v -0.141943 0.741179 0.529922
+v -0.145940 0.725557 0.527947
+v -0.119227 0.735131 0.535969
+v -0.137794 0.756811 0.531389
+v -0.164053 0.748260 0.522840
+v -0.168673 0.732838 0.520665
+v -0.122584 0.719339 0.534164
+v -0.115742 0.750940 0.537260
+v -0.159258 0.763685 0.524514
+v -0.048414 0.723458 0.547643
+v -0.049777 0.707337 0.546166
+v -0.024259 0.721774 0.549327
+v -0.046999 0.739608 0.548592
+v -0.072363 0.726252 0.544849
+v -0.074401 0.710210 0.543294
+v -0.024942 0.705606 0.547898
+v -0.023550 0.737973 0.550227
+v -0.070248 0.742320 0.545879
+v 0.048414 0.723458 0.547643
+v 0.049777 0.707337 0.546166
+v 0.072363 0.726252 0.544849
+v 0.046999 0.739608 0.548592
+v 0.024259 0.721774 0.549327
+v 0.024942 0.705606 0.547898
+v 0.074401 0.710210 0.543294
+v 0.070248 0.742320 0.545879
+v 0.023550 0.737973 0.550227
+v 0.141943 0.741179 0.529922
+v 0.145940 0.725557 0.527947
+v 0.164053 0.748260 0.522840
+v 0.137794 0.756811 0.531389
+v 0.119227 0.735131 0.535969
+v 0.122585 0.719339 0.534164
+v 0.168673 0.732838 0.520665
+v 0.159258 0.763685 0.524514
+v 0.115742 0.750940 0.537260
+v 0.225799 0.775412 0.495688
+v 0.232157 0.760755 0.492749
+v 0.244564 0.786299 0.484801
+v 0.219199 0.790044 0.498155
+v 0.206071 0.765414 0.505686
+v 0.211873 0.750475 0.503029
+v 0.251450 0.771948 0.481555
+v 0.237415 0.800613 0.487587
+v 0.200047 0.780338 0.507862
+v 0.294267 0.823827 0.447274
+v 0.302553 0.810532 0.442971
+v 0.308407 0.837777 0.433324
+v 0.285666 0.837043 0.451156
+v 0.278871 0.810558 0.460542
+v 0.286723 0.796890 0.456613
+v 0.317092 0.824875 0.428628
+v 0.299393 0.850585 0.437614
+v 0.270719 0.824162 0.464037
+v 0.342681 0.883122 0.387979
+v 0.352331 0.871497 0.382006
+v 0.351233 0.899184 0.371916
+v 0.332665 0.894605 0.393595
+v 0.332666 0.867487 0.403613
+v 0.342034 0.855423 0.398081
+v 0.361124 0.888012 0.365492
+v 0.340967 0.910198 0.378001
+v 0.322942 0.879428 0.408772
+v 0.367742 0.949257 0.321844
+v 0.378097 0.939494 0.314009
+v 0.370124 0.966337 0.304763
+v 0.356993 0.958807 0.329393
+v 0.363791 0.932322 0.338778
+v 0.374035 0.922083 0.331420
+v 0.380546 0.957056 0.296448
+v 0.359306 0.975388 0.312811
+v 0.353158 0.942367 0.345832
+v 0.367742 1.017724 0.253376
+v 0.378097 1.009890 0.243613
+v 0.363791 1.034659 0.236441
+v 0.356993 1.025274 0.262926
+v 0.370124 1.000644 0.270456
+v 0.380546 0.992329 0.261175
+v 0.374035 1.027301 0.226202
+v 0.353158 1.041713 0.246486
+v 0.359305 1.008692 0.279507
+v 0.342681 1.083859 0.187241
+v 0.352331 1.077887 0.175616
+v 0.332666 1.099494 0.171606
+v 0.332665 1.089475 0.198724
+v 0.351234 1.067797 0.203303
+v 0.361124 1.061373 0.192131
+v 0.342034 1.093962 0.159542
+v 0.322943 1.104653 0.183547
+v 0.340967 1.073882 0.214317
+v 0.294267 1.143154 0.127946
+v 0.302553 1.138852 0.114651
+v 0.278871 1.156423 0.114677
+v 0.285666 1.147037 0.141162
+v 0.308407 1.129204 0.141896
+v 0.317092 1.124509 0.128994
+v 0.286723 1.152494 0.101009
+v 0.270719 1.159918 0.128281
+v 0.299393 1.133495 0.154704
+v 0.225799 1.191569 0.079531
+v 0.232157 1.188630 0.064874
+v 0.206071 1.201567 0.069533
+v 0.219199 1.194036 0.094163
+v 0.244564 1.180682 0.090418
+v 0.251450 1.177436 0.076067
+v 0.211873 1.198910 0.054594
+v 0.200047 1.203743 0.084457
+v 0.237415 1.183468 0.104732
+v 0.141943 1.225803 0.045297
+v 0.145940 1.223827 0.029676
+v 0.119227 1.231850 0.039250
+v 0.137794 1.227270 0.060930
+v 0.164053 1.218721 0.052379
+v 0.168673 1.216546 0.036957
+v 0.122585 1.230045 0.023458
+v 0.115742 1.233140 0.055059
+v 0.159258 1.220395 0.067804
+v 0.048414 1.243523 0.027577
+v 0.049777 1.242047 0.011456
+v 0.024259 1.245208 0.025893
+v 0.046999 1.244473 0.043727
+v 0.072363 1.240729 0.030371
+v 0.074401 1.239175 0.014329
+v 0.024942 1.243779 0.009725
+v 0.023550 1.246108 0.042092
+v 0.070248 1.241760 0.046439
+v -0.048414 1.243523 0.027577
+v -0.049777 1.242047 0.011456
+v -0.072363 1.240729 0.030371
+v -0.046999 1.244473 0.043727
+v -0.024259 1.245208 0.025893
+v -0.024942 1.243779 0.009725
+v -0.074401 1.239175 0.014329
+v -0.070248 1.241760 0.046439
+v -0.023550 1.246108 0.042092
+v -0.141943 1.225803 0.045298
+v -0.145940 1.223827 0.029676
+v -0.164053 1.218721 0.052379
+v -0.137794 1.227270 0.060930
+v -0.119227 1.231850 0.039250
+v -0.122585 1.230045 0.023458
+v -0.168673 1.216546 0.036957
+v -0.159258 1.220395 0.067804
+v -0.115742 1.233140 0.055059
+v -0.225799 1.191569 0.079531
+v -0.232157 1.188630 0.064874
+v -0.244564 1.180682 0.090418
+v -0.219199 1.194036 0.094163
+v -0.206071 1.201567 0.069533
+v -0.211873 1.198910 0.054594
+v -0.251450 1.177436 0.076067
+v -0.237415 1.183468 0.104732
+v -0.200047 1.203743 0.084457
+v -0.294267 1.143155 0.127946
+v -0.302553 1.138852 0.114651
+v -0.308407 1.129205 0.141896
+v -0.285666 1.147037 0.141162
+v -0.278871 1.156423 0.114677
+v -0.286723 1.152494 0.101009
+v -0.317092 1.124509 0.128994
+v -0.299393 1.133495 0.154704
+v -0.270719 1.159918 0.128281
+v -0.342681 1.083860 0.187241
+v -0.352331 1.077887 0.175616
+v -0.351234 1.067797 0.203303
+v -0.332665 1.089475 0.198724
+v -0.332666 1.099494 0.171607
+v -0.342034 1.093962 0.159542
+v -0.361124 1.061373 0.192131
+v -0.340967 1.073882 0.214317
+v -0.322943 1.104653 0.183547
+v -0.367742 1.017725 0.253376
+v -0.378097 1.009890 0.243613
+v -0.370124 1.000644 0.270456
+v -0.356993 1.025274 0.262926
+v -0.363791 1.034659 0.236441
+v -0.374035 1.027301 0.226202
+v -0.380546 0.992329 0.261175
+v -0.359306 1.008692 0.279507
+v -0.353158 1.041713 0.246487
+v -0.367742 0.949257 0.321844
+v -0.378097 0.939494 0.314009
+v -0.363791 0.932322 0.338778
+v -0.356993 0.958807 0.329393
+v -0.370124 0.966337 0.304763
+v -0.380546 0.957056 0.296448
+v -0.374035 0.922083 0.331420
+v -0.353157 0.942368 0.345832
+v -0.359305 0.975388 0.312811
+v -0.300523 0.928084 0.408245
+v -0.311575 0.917098 0.403733
+v -0.291740 0.914373 0.421956
+v -0.289150 0.938880 0.412379
+v -0.308023 0.942170 0.394158
+v -0.319351 0.931702 0.389129
+v -0.302469 0.902883 0.417948
+v -0.280699 0.925688 0.425571
+v -0.296367 0.952433 0.398826
+v -0.258065 0.876083 0.460245
+v -0.267555 0.863185 0.457646
+v -0.244563 0.864447 0.471882
+v -0.248299 0.888847 0.462411
+v -0.270466 0.888317 0.448011
+v -0.280412 0.875869 0.444962
+v -0.253556 0.851121 0.469710
+v -0.235308 0.877651 0.473607
+v -0.260230 0.900618 0.450640
+v -0.198020 0.833625 0.502703
+v -0.205302 0.819166 0.501665
+v -0.180719 0.824856 0.511472
+v -0.190526 0.847996 0.503263
+v -0.214476 0.843173 0.493156
+v -0.222364 0.829064 0.491767
+v -0.187365 0.810075 0.510756
+v -0.173880 0.839559 0.511699
+v -0.206360 0.857182 0.494076
+v -0.124481 0.803603 0.532726
+v -0.129058 0.788040 0.532792
+v -0.104559 0.798299 0.538029
+v -0.119770 0.819110 0.532149
+v -0.143871 0.809813 0.526515
+v -0.149161 0.794478 0.526353
+v -0.108404 0.782541 0.538290
+v -0.100602 0.814007 0.537252
+v -0.138426 0.825085 0.526173
+v -0.042458 0.788062 0.548266
+v -0.044019 0.771927 0.548904
+v -0.021274 0.786585 0.549743
+v -0.040851 0.804157 0.547101
+v -0.063461 0.790512 0.545816
+v -0.065794 0.774468 0.546363
+v -0.022057 0.770396 0.550435
+v -0.020469 0.802736 0.548522
+v -0.061059 0.806515 0.544744
+v 0.042458 0.788062 0.548266
+v 0.044019 0.771927 0.548904
+v 0.063461 0.790512 0.545816
+v 0.040851 0.804157 0.547101
+v 0.021274 0.786585 0.549743
+v 0.022057 0.770396 0.550435
+v 0.065794 0.774468 0.546363
+v 0.061059 0.806515 0.544744
+v 0.020469 0.802736 0.548522
+v 0.124481 0.803603 0.532726
+v 0.129058 0.788039 0.532792
+v 0.143871 0.809813 0.526515
+v 0.119770 0.819110 0.532149
+v 0.104560 0.798299 0.538029
+v 0.108405 0.782541 0.538290
+v 0.149162 0.794478 0.526353
+v 0.138426 0.825085 0.526173
+v 0.100603 0.814007 0.537252
+v 0.198020 0.833625 0.502703
+v 0.205302 0.819166 0.501665
+v 0.214476 0.843173 0.493156
+v 0.190527 0.847996 0.503263
+v 0.180719 0.824856 0.511472
+v 0.187365 0.810075 0.510756
+v 0.222364 0.829064 0.491767
+v 0.206360 0.857182 0.494076
+v 0.173880 0.839559 0.511699
+v 0.258065 0.876083 0.460245
+v 0.267555 0.863185 0.457646
+v 0.270466 0.888317 0.448011
+v 0.248299 0.888847 0.462411
+v 0.244563 0.864447 0.471881
+v 0.253557 0.851121 0.469710
+v 0.280412 0.875869 0.444962
+v 0.260230 0.900618 0.450640
+v 0.235308 0.877651 0.473607
+v 0.300523 0.928083 0.408245
+v 0.311575 0.917098 0.403733
+v 0.308024 0.942170 0.394158
+v 0.289150 0.938880 0.412379
+v 0.291740 0.914373 0.421956
+v 0.302469 0.902883 0.417948
+v 0.319351 0.931702 0.389129
+v 0.296367 0.952433 0.398826
+v 0.280700 0.925688 0.425571
+v 0.322501 0.986082 0.350246
+v 0.334361 0.977229 0.343601
+v 0.324590 1.001061 0.335267
+v 0.310296 0.994684 0.356575
+v 0.319036 0.971231 0.365097
+v 0.330768 0.961832 0.358999
+v 0.336526 0.992759 0.328071
+v 0.312306 1.009096 0.342163
+v 0.306962 0.980394 0.370864
+v 0.322501 1.046127 0.290201
+v 0.334361 1.039482 0.281349
+v 0.319036 1.060978 0.275350
+v 0.310296 1.052456 0.298802
+v 0.324590 1.031148 0.305180
+v 0.336526 1.023952 0.296879
+v 0.330768 1.054880 0.265951
+v 0.306962 1.066745 0.284514
+v 0.312306 1.038044 0.313215
+v 0.300523 1.104126 0.232202
+v 0.311575 1.099614 0.221217
+v 0.291740 1.117837 0.218492
+v 0.289150 1.108260 0.242999
+v 0.308024 1.090039 0.246289
+v 0.319351 1.085009 0.235821
+v 0.302469 1.113829 0.207002
+v 0.280700 1.121452 0.229807
+v 0.296367 1.094706 0.256552
+v 0.258065 1.156126 0.180202
+v 0.267555 1.153527 0.167304
+v 0.244563 1.167762 0.168566
+v 0.248299 1.158292 0.192966
+v 0.270466 1.143892 0.192436
+v 0.280412 1.140843 0.179988
+v 0.253557 1.165591 0.155240
+v 0.235308 1.169488 0.181770
+v 0.260230 1.146521 0.204737
+v 0.198020 1.198584 0.137744
+v 0.205302 1.197546 0.123285
+v 0.180719 1.207353 0.128975
+v 0.190527 1.199143 0.152115
+v 0.214476 1.189037 0.147292
+v 0.222364 1.187647 0.133183
+v 0.187365 1.206637 0.114194
+v 0.173880 1.207580 0.143678
+v 0.206360 1.189957 0.161301
+v 0.124481 1.228607 0.107722
+v 0.129058 1.228672 0.092158
+v 0.104560 1.233910 0.102418
+v 0.119770 1.228030 0.123229
+v 0.143871 1.222396 0.113932
+v 0.149162 1.222234 0.098597
+v 0.108405 1.234171 0.086660
+v 0.100603 1.233133 0.118126
+v 0.138426 1.222054 0.129204
+v 0.042458 1.244147 0.092181
+v 0.044019 1.244785 0.076046
+v 0.021274 1.245624 0.090704
+v 0.040851 1.242982 0.108276
+v 0.063461 1.241697 0.094631
+v 0.065794 1.242244 0.078587
+v 0.022057 1.246316 0.074515
+v 0.020469 1.244403 0.106855
+v 0.061059 1.240625 0.110634
+v -0.042458 1.244147 0.092181
+v -0.044019 1.244785 0.076046
+v -0.063461 1.241697 0.094631
+v -0.040851 1.242982 0.108276
+v -0.021274 1.245624 0.090704
+v -0.022057 1.246316 0.074515
+v -0.065794 1.242244 0.078587
+v -0.061059 1.240625 0.110634
+v -0.020469 1.244403 0.106855
+v -0.124481 1.228607 0.107722
+v -0.129058 1.228673 0.092158
+v -0.143871 1.222396 0.113932
+v -0.119770 1.228030 0.123229
+v -0.104559 1.233910 0.102418
+v -0.108405 1.234171 0.086660
+v -0.149162 1.222234 0.098597
+v -0.138426 1.222054 0.129204
+v -0.100603 1.233133 0.118126
+v -0.198020 1.198584 0.137744
+v -0.205302 1.197546 0.123285
+v -0.214476 1.189037 0.147292
+v -0.190526 1.199144 0.152115
+v -0.180719 1.207353 0.128975
+v -0.187365 1.206637 0.114194
+v -0.222364 1.187647 0.133183
+v -0.206360 1.189957 0.161301
+v -0.173880 1.207580 0.143678
+v -0.258065 1.156126 0.180202
+v -0.267555 1.153527 0.167304
+v -0.270466 1.143892 0.192436
+v -0.248299 1.158292 0.192966
+v -0.244563 1.167762 0.168566
+v -0.253556 1.165591 0.155240
+v -0.280412 1.140843 0.179988
+v -0.260230 1.146521 0.204737
+v -0.235308 1.169488 0.181770
+v -0.300523 1.104126 0.232203
+v -0.311575 1.099614 0.221217
+v -0.308024 1.090039 0.246289
+v -0.289150 1.108260 0.242999
+v -0.291740 1.117837 0.218492
+v -0.302469 1.113829 0.207002
+v -0.319351 1.085009 0.235821
+v -0.296367 1.094706 0.256552
+v -0.280700 1.121452 0.229807
+v -0.322501 1.046127 0.290201
+v -0.334361 1.039482 0.281349
+v -0.324590 1.031148 0.305181
+v -0.310296 1.052456 0.298803
+v -0.319036 1.060978 0.275350
+v -0.330768 1.054880 0.265951
+v -0.336526 1.023952 0.296879
+v -0.312306 1.038044 0.313215
+v -0.306962 1.066745 0.284514
+v -0.322501 0.986082 0.350246
+v -0.334361 0.977229 0.343602
+v -0.319036 0.971231 0.365097
+v -0.310296 0.994684 0.356575
+v -0.324590 1.001061 0.335267
+v -0.336526 0.992760 0.328071
+v -0.330768 0.961832 0.358999
+v -0.306962 0.980394 0.370864
+v -0.312306 1.009096 0.342163
+v -0.253223 0.970015 0.422469
+v -0.265488 0.959857 0.419495
+v -0.245823 0.958462 0.434022
+v -0.240688 0.979940 0.425050
+v -0.259543 0.981885 0.410600
+v -0.272113 0.972301 0.407051
+v -0.257728 0.947744 0.431607
+v -0.233654 0.968959 0.436031
+v -0.246695 0.991221 0.413769
+v -0.217448 0.926200 0.466285
+v -0.227979 0.913919 0.465433
+v -0.206071 0.916395 0.476090
+v -0.206683 0.938293 0.466697
+v -0.227897 0.936508 0.455977
+v -0.238934 0.924726 0.454625
+v -0.216051 0.903639 0.475713
+v -0.195870 0.928973 0.476017
+v -0.216615 0.948091 0.456899
+v -0.166853 0.890424 0.502061
+v -0.174935 0.876411 0.502941
+v -0.152275 0.883035 0.509449
+v -0.158594 0.904288 0.500702
+v -0.180720 0.898469 0.494016
+v -0.189472 0.884845 0.494507
+v -0.159650 0.868664 0.510687
+v -0.144737 0.897265 0.507725
+v -0.171773 0.911935 0.493055
+v -0.104888 0.865127 0.527358
+v -0.109968 0.849888 0.529463
+v -0.088103 0.860658 0.531826
+v -0.099696 0.880243 0.524747
+v -0.121227 0.870360 0.522125
+v -0.127098 0.855375 0.523977
+v -0.092370 0.845203 0.534149
+v -0.083741 0.875996 0.528994
+v -0.115226 0.885217 0.519773
+v -0.035775 0.852032 0.540452
+v -0.037508 0.836159 0.543192
+v -0.017926 0.850788 0.541697
+v -0.034004 0.867797 0.537193
+v -0.053472 0.854097 0.538388
+v -0.056062 0.838324 0.541028
+v -0.018794 0.834855 0.544497
+v -0.017039 0.866614 0.538376
+v -0.050825 0.869759 0.535231
+v 0.035776 0.852032 0.540452
+v 0.037508 0.836159 0.543192
+v 0.053472 0.854097 0.538388
+v 0.034005 0.867797 0.537193
+v 0.017926 0.850788 0.541697
+v 0.018794 0.834855 0.544497
+v 0.056062 0.838324 0.541028
+v 0.050825 0.869759 0.535231
+v 0.017039 0.866614 0.538376
+v 0.104889 0.865127 0.527358
+v 0.109969 0.849888 0.529463
+v 0.121227 0.870360 0.522125
+v 0.099696 0.880243 0.524747
+v 0.088103 0.860658 0.531826
+v 0.092370 0.845203 0.534149
+v 0.127098 0.855375 0.523977
+v 0.115226 0.885217 0.519773
+v 0.083741 0.875996 0.528994
+v 0.166854 0.890424 0.502061
+v 0.174935 0.876410 0.502941
+v 0.180720 0.898469 0.494016
+v 0.158594 0.904288 0.500702
+v 0.152275 0.883035 0.509449
+v 0.159651 0.868664 0.510687
+v 0.189472 0.884845 0.494507
+v 0.171774 0.911935 0.493055
+v 0.144737 0.897265 0.507725
+v 0.217448 0.926199 0.466285
+v 0.227979 0.913919 0.465433
+v 0.227897 0.936508 0.455977
+v 0.206684 0.938293 0.466697
+v 0.206071 0.916395 0.476090
+v 0.216051 0.903639 0.475713
+v 0.238934 0.924726 0.454625
+v 0.216615 0.948091 0.456899
+v 0.195870 0.928973 0.476017
+v 0.253223 0.970015 0.422469
+v 0.265488 0.959857 0.419495
+v 0.259543 0.981885 0.410600
+v 0.240688 0.979940 0.425050
+v 0.245823 0.958462 0.434022
+v 0.257729 0.947744 0.431607
+v 0.272114 0.972301 0.407051
+v 0.246695 0.991221 0.413769
+v 0.233654 0.968959 0.436031
+v 0.271742 1.018886 0.373599
+v 0.284903 1.011094 0.368258
+v 0.273502 1.031507 0.360977
+v 0.258290 1.026391 0.378599
+v 0.268822 1.006372 0.386113
+v 0.281842 0.997974 0.381377
+v 0.286749 1.024327 0.355025
+v 0.259963 1.038387 0.366603
+v 0.255515 1.014497 0.390494
+v 0.271742 1.069480 0.323005
+v 0.284903 1.064139 0.315213
+v 0.268822 1.081993 0.310491
+v 0.258290 1.074480 0.330510
+v 0.273502 1.056858 0.335626
+v 0.286749 1.050906 0.328446
+v 0.281842 1.077258 0.302093
+v 0.255515 1.086374 0.318616
+v 0.259963 1.062484 0.342506
+v 0.253223 1.118350 0.274134
+v 0.265488 1.115376 0.263976
+v 0.245823 1.129903 0.262582
+v 0.240688 1.120931 0.284059
+v 0.259543 1.106481 0.286004
+v 0.272114 1.102931 0.276420
+v 0.257729 1.127488 0.251863
+v 0.233654 1.131912 0.273078
+v 0.246695 1.109650 0.295340
+v 0.217448 1.162166 0.230318
+v 0.227979 1.161314 0.218038
+v 0.206071 1.171971 0.220514
+v 0.206684 1.162578 0.242412
+v 0.227897 1.151857 0.240627
+v 0.238934 1.150506 0.228845
+v 0.216051 1.171593 0.207758
+v 0.195870 1.171898 0.233092
+v 0.216615 1.152780 0.252210
+v 0.166854 1.197942 0.194543
+v 0.174935 1.198822 0.180530
+v 0.152275 1.205330 0.187154
+v 0.158594 1.196583 0.208407
+v 0.180720 1.189897 0.202588
+v 0.189472 1.190387 0.188964
+v 0.159651 1.206568 0.172783
+v 0.144737 1.203606 0.201384
+v 0.171774 1.188936 0.216054
+v 0.104889 1.223239 0.169246
+v 0.109969 1.225344 0.154007
+v 0.088103 1.227707 0.164777
+v 0.099696 1.220628 0.184362
+v 0.121227 1.218006 0.174479
+v 0.127098 1.219858 0.159494
+v 0.092370 1.230029 0.149322
+v 0.083741 1.224875 0.180115
+v 0.115226 1.215654 0.189336
+v 0.035776 1.236333 0.156151
+v 0.037508 1.239073 0.140278
+v 0.017926 1.237578 0.154907
+v 0.034005 1.233074 0.171916
+v 0.053472 1.234269 0.158216
+v 0.056062 1.236909 0.142443
+v 0.018794 1.240378 0.138973
+v 0.017039 1.234257 0.170733
+v 0.050825 1.231112 0.173878
+v -0.035776 1.236333 0.156151
+v -0.037508 1.239073 0.140278
+v -0.053472 1.234269 0.158216
+v -0.034005 1.233074 0.171916
+v -0.017926 1.237578 0.154907
+v -0.018794 1.240378 0.138973
+v -0.056062 1.236909 0.142443
+v -0.050825 1.231112 0.173878
+v -0.017039 1.234257 0.170733
+v -0.104889 1.223239 0.169246
+v -0.109969 1.225344 0.154007
+v -0.121227 1.218006 0.174479
+v -0.099696 1.220628 0.184362
+v -0.088103 1.227707 0.164777
+v -0.092370 1.230029 0.149322
+v -0.127098 1.219858 0.159494
+v -0.115226 1.215654 0.189336
+v -0.083741 1.224875 0.180115
+v -0.166854 1.197942 0.194543
+v -0.174935 1.198822 0.180530
+v -0.180720 1.189897 0.202588
+v -0.158594 1.196583 0.208407
+v -0.152275 1.205330 0.187154
+v -0.159650 1.206568 0.172783
+v -0.189472 1.190388 0.188964
+v -0.171774 1.188936 0.216054
+v -0.144737 1.203606 0.201384
+v -0.217448 1.162166 0.230319
+v -0.227979 1.161314 0.218038
+v -0.227897 1.151858 0.240627
+v -0.206684 1.162578 0.242412
+v -0.206071 1.171971 0.220514
+v -0.216051 1.171593 0.207758
+v -0.238934 1.150506 0.228845
+v -0.216615 1.152780 0.252210
+v -0.195870 1.171898 0.233092
+v -0.253223 1.118350 0.274134
+v -0.265488 1.115376 0.263976
+v -0.259543 1.106481 0.286004
+v -0.240688 1.120931 0.284059
+v -0.245823 1.129903 0.262582
+v -0.257729 1.127488 0.251863
+v -0.272114 1.102931 0.276420
+v -0.246695 1.109650 0.295341
+v -0.233654 1.131912 0.273078
+v -0.271742 1.069480 0.323005
+v -0.284903 1.064139 0.315213
+v -0.273502 1.056858 0.335626
+v -0.258290 1.074480 0.330510
+v -0.268822 1.081993 0.310491
+v -0.281842 1.077258 0.302093
+v -0.286749 1.050906 0.328446
+v -0.259963 1.062484 0.342507
+v -0.255515 1.086374 0.318616
+v -0.271742 1.018886 0.373599
+v -0.284903 1.011094 0.368258
+v -0.268822 1.006372 0.386113
+v -0.258290 1.026391 0.378599
+v -0.273502 1.031507 0.360977
+v -0.286748 1.024327 0.355025
+v -0.281842 0.997974 0.381377
+v -0.255515 1.014497 0.390494
+v -0.259963 1.038387 0.366603
+v -0.201591 1.008200 0.430408
+v -0.214858 0.999042 0.429022
+v -0.195699 0.999003 0.439605
+v -0.188108 1.017082 0.431392
+v -0.206622 1.017649 0.420959
+v -0.220220 1.009113 0.418951
+v -0.208579 0.989240 0.438825
+v -0.182610 1.008500 0.439975
+v -0.192802 1.025900 0.422575
+v -0.173110 0.973318 0.465290
+v -0.184503 0.961865 0.466200
+v -0.164053 0.965512 0.473095
+v -0.161532 0.984534 0.463941
+v -0.181428 0.981525 0.457083
+v -0.193369 0.970611 0.457453
+v -0.174849 0.953545 0.474519
+v -0.153080 0.977250 0.471225
+v -0.169294 0.992191 0.456284
+v -0.132832 0.944837 0.493771
+v -0.141574 0.931509 0.496555
+v -0.121226 0.938955 0.499653
+v -0.123948 0.957958 0.490517
+v -0.143871 0.951242 0.487366
+v -0.153339 0.938335 0.489729
+v -0.129204 0.925240 0.502824
+v -0.113118 0.952469 0.496006
+v -0.134248 0.963934 0.484541
+v -0.083502 0.924698 0.513910
+v -0.088997 0.910045 0.518019
+v -0.070138 0.921141 0.517467
+v -0.077917 0.939166 0.509309
+v -0.096508 0.928864 0.509744
+v -0.102860 0.914485 0.513579
+v -0.074754 0.906253 0.521811
+v -0.065447 0.935846 0.512629
+v -0.090054 0.943053 0.505422
+v -0.028481 0.914274 0.524334
+v -0.030355 0.898934 0.529130
+v -0.014271 0.913283 0.525325
+v -0.026576 0.929438 0.519037
+v -0.042569 0.915917 0.522691
+v -0.045371 0.900686 0.527378
+v -0.015210 0.897878 0.530186
+v -0.013316 0.928514 0.519961
+v -0.039722 0.930972 0.517503
+v 0.028481 0.914274 0.524334
+v 0.030355 0.898934 0.529130
+v 0.042569 0.915917 0.522691
+v 0.026576 0.929438 0.519037
+v 0.014271 0.913283 0.525325
+v 0.015210 0.897878 0.530186
+v 0.045371 0.900686 0.527378
+v 0.039722 0.930972 0.517503
+v 0.013316 0.928514 0.519961
+v 0.083502 0.924698 0.513910
+v 0.088997 0.910045 0.518019
+v 0.096508 0.928864 0.509744
+v 0.077917 0.939166 0.509309
+v 0.070138 0.921141 0.517467
+v 0.074754 0.906253 0.521811
+v 0.102860 0.914485 0.513579
+v 0.090054 0.943053 0.505422
+v 0.065447 0.935846 0.512629
+v 0.132832 0.944837 0.493771
+v 0.141574 0.931509 0.496555
+v 0.143871 0.951242 0.487366
+v 0.123948 0.957958 0.490517
+v 0.121226 0.938955 0.499653
+v 0.129204 0.925240 0.502824
+v 0.153339 0.938335 0.489729
+v 0.134248 0.963934 0.484541
+v 0.113118 0.952469 0.496006
+v 0.173110 0.973318 0.465290
+v 0.184503 0.961865 0.466199
+v 0.181428 0.981525 0.457083
+v 0.161532 0.984534 0.463941
+v 0.164053 0.965512 0.473095
+v 0.174849 0.953545 0.474519
+v 0.193369 0.970611 0.457453
+v 0.169294 0.992191 0.456284
+v 0.153080 0.977250 0.471225
+v 0.201591 1.008200 0.430408
+v 0.214858 0.999042 0.429022
+v 0.206622 1.017649 0.420959
+v 0.188108 1.017082 0.431392
+v 0.195699 0.999003 0.439605
+v 0.208579 0.989240 0.438825
+v 0.220220 1.009113 0.418951
+v 0.192803 1.025900 0.422575
+v 0.182610 1.008500 0.439974
+v 0.216334 1.047105 0.391502
+v 0.230571 1.040508 0.387556
+v 0.217735 1.057153 0.381454
+v 0.201865 1.053386 0.395089
+v 0.214009 1.037143 0.401465
+v 0.228094 1.029891 0.398174
+v 0.232064 1.051217 0.376847
+v 0.203172 1.062762 0.385713
+v 0.199696 1.044090 0.404385
+v 0.216334 1.087383 0.351224
+v 0.230571 1.083437 0.344627
+v 0.214009 1.097345 0.341262
+v 0.201865 1.090970 0.357505
+v 0.217735 1.077335 0.361272
+v 0.232064 1.072728 0.355336
+v 0.228094 1.094055 0.334009
+v 0.199696 1.100266 0.348209
+v 0.203172 1.081594 0.366881
+v 0.201591 1.126289 0.312319
+v 0.214858 1.124903 0.303161
+v 0.195699 1.135486 0.303122
+v 0.188108 1.127273 0.321201
+v 0.206622 1.116840 0.321768
+v 0.220220 1.114832 0.313232
+v 0.208579 1.134705 0.293359
+v 0.182610 1.135855 0.312619
+v 0.192803 1.118456 0.330019
+v 0.173110 1.161171 0.277437
+v 0.184503 1.162080 0.265984
+v 0.164053 1.168976 0.269632
+v 0.161532 1.159822 0.288653
+v 0.181428 1.152964 0.285644
+v 0.193369 1.153334 0.274730
+v 0.174849 1.170400 0.257664
+v 0.153080 1.167106 0.281369
+v 0.169294 1.152164 0.296310
+v 0.132832 1.189651 0.248956
+v 0.141574 1.192436 0.235628
+v 0.121226 1.195534 0.243074
+v 0.123948 1.186398 0.262077
+v 0.143871 1.183247 0.255361
+v 0.153339 1.185610 0.242454
+v 0.129204 1.198705 0.229359
+v 0.113118 1.191887 0.256588
+v 0.134248 1.180422 0.268053
+v 0.083502 1.209790 0.228817
+v 0.088997 1.213900 0.214164
+v 0.070138 1.213348 0.225260
+v 0.077917 1.205190 0.243285
+v 0.096508 1.205624 0.232983
+v 0.102860 1.209460 0.218604
+v 0.074754 1.217692 0.210372
+v 0.065447 1.208510 0.239965
+v 0.090054 1.201303 0.247172
+v 0.028481 1.220215 0.218393
+v 0.030355 1.225011 0.203053
+v 0.014271 1.221206 0.217402
+v 0.026576 1.214918 0.233557
+v 0.042569 1.218572 0.220036
+v 0.045371 1.223259 0.204805
+v 0.015210 1.226067 0.201997
+v 0.013316 1.215842 0.232633
+v 0.039722 1.213384 0.235091
+v -0.028481 1.220215 0.218393
+v -0.030355 1.225011 0.203053
+v -0.042569 1.218572 0.220036
+v -0.026576 1.214918 0.233557
+v -0.014271 1.221206 0.217402
+v -0.015210 1.226067 0.201997
+v -0.045371 1.223259 0.204805
+v -0.039722 1.213384 0.235091
+v -0.013316 1.215842 0.232633
+v -0.083502 1.209790 0.228817
+v -0.088997 1.213900 0.214164
+v -0.096508 1.205624 0.232983
+v -0.077917 1.205190 0.243285
+v -0.070138 1.213348 0.225260
+v -0.074754 1.217692 0.210372
+v -0.102860 1.209460 0.218604
+v -0.090054 1.201303 0.247172
+v -0.065447 1.208510 0.239965
+v -0.132832 1.189652 0.248956
+v -0.141574 1.192436 0.235628
+v -0.143871 1.183247 0.255361
+v -0.123948 1.186398 0.262077
+v -0.121226 1.195534 0.243074
+v -0.129204 1.198705 0.229359
+v -0.153339 1.185610 0.242454
+v -0.134248 1.180422 0.268053
+v -0.113118 1.191887 0.256588
+v -0.173110 1.161171 0.277437
+v -0.184503 1.162080 0.265984
+v -0.181428 1.152964 0.285644
+v -0.161532 1.159822 0.288653
+v -0.164053 1.168976 0.269632
+v -0.174849 1.170400 0.257664
+v -0.193369 1.153334 0.274730
+v -0.169294 1.152164 0.296310
+v -0.153080 1.167106 0.281369
+v -0.201591 1.126289 0.312319
+v -0.214858 1.124903 0.303161
+v -0.206622 1.116840 0.321768
+v -0.188108 1.127273 0.321201
+v -0.195699 1.135486 0.303122
+v -0.208579 1.134705 0.293359
+v -0.220220 1.114832 0.313232
+v -0.192802 1.118456 0.330019
+v -0.182610 1.135855 0.312619
+v -0.216334 1.087383 0.351224
+v -0.230571 1.083437 0.344627
+v -0.217735 1.077335 0.361272
+v -0.201865 1.090970 0.357505
+v -0.214009 1.097345 0.341262
+v -0.228094 1.094055 0.334010
+v -0.232064 1.072728 0.355336
+v -0.203172 1.081594 0.366881
+v -0.199696 1.100266 0.348209
+v -0.216333 1.047105 0.391502
+v -0.230571 1.040508 0.387556
+v -0.214009 1.037143 0.401465
+v -0.201865 1.053386 0.395089
+v -0.217735 1.057153 0.381454
+v -0.232064 1.051217 0.376847
+v -0.228094 1.029891 0.398174
+v -0.199695 1.044090 0.404385
+v -0.203172 1.062762 0.385713
+v -0.146509 1.041983 0.431926
+v -0.160552 1.033983 0.432152
+v -0.142227 1.035299 0.438610
+v -0.132309 1.049672 0.431296
+v -0.150165 1.048851 0.425058
+v -0.164559 1.041509 0.424626
+v -0.155860 1.026658 0.439477
+v -0.128442 1.043636 0.437333
+v -0.135611 1.055874 0.425095
+v -0.125810 1.016633 0.457276
+v -0.137869 1.006202 0.459932
+v -0.119227 1.010960 0.462949
+v -0.113616 1.026779 0.454190
+v -0.131855 1.022597 0.451312
+v -0.144494 1.012738 0.453397
+v -0.130656 0.999986 0.466149
+v -0.107672 1.021656 0.459313
+v -0.119076 1.032165 0.448804
+v -0.096537 0.995934 0.477975
+v -0.105791 0.983520 0.482615
+v -0.088103 0.991659 0.482250
+v -0.087181 1.008086 0.472883
+v -0.104560 1.000588 0.473321
+v -0.114582 0.988620 0.477515
+v -0.096548 0.978835 0.487300
+v -0.079564 1.004226 0.476743
+v -0.094426 1.012289 0.468679
+v -0.060686 0.981298 0.492612
+v -0.066503 0.967480 0.498654
+v -0.050974 0.978712 0.495197
+v -0.054804 0.994868 0.486100
+v -0.070139 0.984325 0.489584
+v -0.076862 0.970798 0.495337
+v -0.055860 0.964647 0.501488
+v -0.046033 0.992533 0.488435
+v -0.063341 0.997603 0.483366
+v -0.020699 0.973721 0.500188
+v -0.022683 0.959178 0.506957
+v -0.010371 0.973001 0.500908
+v -0.018693 0.988026 0.492942
+v -0.030938 0.974916 0.498993
+v -0.033903 0.960487 0.505648
+v -0.011366 0.958389 0.507746
+v -0.009366 0.987376 0.493593
+v -0.027939 0.989105 0.491864
+v 0.020699 0.973721 0.500188
+v 0.022683 0.959178 0.506957
+v 0.030938 0.974916 0.498993
+v 0.018693 0.988026 0.492942
+v 0.010372 0.973001 0.500908
+v 0.011366 0.958389 0.507746
+v 0.033903 0.960487 0.505648
+v 0.027939 0.989105 0.491864
+v 0.009366 0.987376 0.493593
+v 0.060686 0.981298 0.492612
+v 0.066503 0.967480 0.498654
+v 0.070139 0.984325 0.489584
+v 0.054804 0.994868 0.486100
+v 0.050974 0.978712 0.495197
+v 0.055860 0.964647 0.501488
+v 0.076862 0.970798 0.495337
+v 0.063341 0.997603 0.483366
+v 0.046034 0.992533 0.488435
+v 0.096537 0.995934 0.477975
+v 0.105791 0.983520 0.482615
+v 0.104560 1.000588 0.473321
+v 0.087181 1.008086 0.472883
+v 0.088103 0.991659 0.482250
+v 0.096548 0.978835 0.487300
+v 0.114582 0.988620 0.477515
+v 0.094426 1.012289 0.468679
+v 0.079564 1.004225 0.476743
+v 0.125810 1.016633 0.457276
+v 0.137869 1.006202 0.459932
+v 0.131856 1.022597 0.451312
+v 0.113616 1.026779 0.454190
+v 0.119228 1.010960 0.462949
+v 0.130656 0.999986 0.466149
+v 0.144494 1.012738 0.453396
+v 0.119076 1.032165 0.448804
+v 0.107672 1.021656 0.459313
+v 0.146509 1.041983 0.431926
+v 0.160552 1.033983 0.432152
+v 0.150165 1.048851 0.425058
+v 0.132309 1.049672 0.431296
+v 0.142227 1.035299 0.438610
+v 0.155860 1.026658 0.439476
+v 0.164559 1.041509 0.424626
+v 0.135611 1.055874 0.425094
+v 0.128442 1.043636 0.437333
+v 0.157223 1.070259 0.403650
+v 0.172294 1.064969 0.401166
+v 0.158242 1.077561 0.396348
+v 0.141985 1.075207 0.405762
+v 0.155534 1.063019 0.410890
+v 0.170442 1.057035 0.409100
+v 0.173410 1.072971 0.393164
+v 0.142905 1.081802 0.399167
+v 0.140459 1.068669 0.412300
+v 0.157223 1.099531 0.374378
+v 0.172294 1.097047 0.369088
+v 0.155534 1.106771 0.367138
+v 0.141985 1.101643 0.379326
+v 0.158242 1.092229 0.381680
+v 0.173410 1.089045 0.377090
+v 0.170442 1.104981 0.361154
+v 0.140459 1.108181 0.372788
+v 0.142905 1.095048 0.385921
+v 0.146509 1.127806 0.346103
+v 0.160552 1.128033 0.338102
+v 0.142227 1.134491 0.339418
+v 0.132309 1.127177 0.353792
+v 0.150165 1.120939 0.352970
+v 0.164559 1.120507 0.345628
+v 0.155860 1.135357 0.330777
+v 0.128442 1.133214 0.347755
+v 0.135611 1.120975 0.359993
+v 0.125810 1.153157 0.320752
+v 0.137869 1.155813 0.310322
+v 0.119228 1.158830 0.315079
+v 0.113616 1.150071 0.330898
+v 0.131856 1.147193 0.326716
+v 0.144494 1.149277 0.316857
+v 0.130656 1.162030 0.304105
+v 0.107672 1.155194 0.325775
+v 0.119076 1.144685 0.336284
+v 0.096538 1.173856 0.300053
+v 0.105791 1.178496 0.287639
+v 0.088103 1.178131 0.295778
+v 0.087181 1.168764 0.312205
+v 0.104560 1.169202 0.304707
+v 0.114582 1.173396 0.292739
+v 0.096548 1.183181 0.282954
+v 0.079564 1.172624 0.308345
+v 0.094426 1.164560 0.316409
+v 0.060686 1.188493 0.285417
+v 0.066503 1.194535 0.271599
+v 0.050974 1.191078 0.282831
+v 0.054804 1.181981 0.298987
+v 0.070139 1.185465 0.288444
+v 0.076862 1.191217 0.274917
+v 0.055860 1.197369 0.268766
+v 0.046034 1.184316 0.296652
+v 0.063341 1.179247 0.301722
+v 0.020699 1.196069 0.277840
+v 0.022683 1.202838 0.263297
+v 0.010372 1.196789 0.277120
+v 0.018693 1.188823 0.292145
+v 0.030938 1.194874 0.279035
+v 0.033903 1.201529 0.264606
+v 0.011366 1.203627 0.262508
+v 0.009366 1.189474 0.291495
+v 0.027939 1.187745 0.293224
+v -0.020699 1.196069 0.277840
+v -0.022683 1.202838 0.263297
+v -0.030938 1.194874 0.279035
+v -0.018693 1.188823 0.292145
+v -0.010371 1.196789 0.277120
+v -0.011366 1.203627 0.262508
+v -0.033903 1.201529 0.264606
+v -0.027939 1.187745 0.293224
+v -0.009366 1.189474 0.291495
+v -0.060686 1.188493 0.285417
+v -0.066503 1.194535 0.271599
+v -0.070139 1.185465 0.288444
+v -0.054804 1.181981 0.298987
+v -0.050974 1.191078 0.282831
+v -0.055860 1.197369 0.268766
+v -0.076862 1.191218 0.274917
+v -0.063341 1.179247 0.301722
+v -0.046034 1.184316 0.296652
+v -0.096537 1.173856 0.300053
+v -0.105791 1.178496 0.287639
+v -0.104560 1.169202 0.304707
+v -0.087181 1.168764 0.312205
+v -0.088103 1.178131 0.295778
+v -0.096548 1.183181 0.282954
+v -0.114582 1.173396 0.292739
+v -0.094426 1.164560 0.316409
+v -0.079564 1.172624 0.308345
+v -0.125810 1.153157 0.320752
+v -0.137869 1.155813 0.310322
+v -0.131856 1.147193 0.326716
+v -0.113616 1.150071 0.330898
+v -0.119228 1.158830 0.315079
+v -0.130656 1.162030 0.304105
+v -0.144494 1.149277 0.316857
+v -0.119076 1.144685 0.336284
+v -0.107672 1.155194 0.325775
+v -0.146509 1.127806 0.346103
+v -0.160552 1.128033 0.338102
+v -0.150165 1.120939 0.352970
+v -0.132309 1.127177 0.353792
+v -0.142227 1.134491 0.339418
+v -0.155860 1.135357 0.330777
+v -0.164559 1.120507 0.345628
+v -0.135611 1.120975 0.359993
+v -0.128442 1.133214 0.347755
+v -0.157223 1.099531 0.374378
+v -0.172294 1.097047 0.369088
+v -0.158242 1.092229 0.381680
+v -0.141985 1.101643 0.379326
+v -0.155534 1.106771 0.367138
+v -0.170442 1.104981 0.361154
+v -0.173410 1.089045 0.377090
+v -0.142904 1.095048 0.385921
+v -0.140459 1.108181 0.372788
+v -0.157223 1.070259 0.403650
+v -0.172294 1.064969 0.401166
+v -0.155534 1.063019 0.410890
+v -0.141985 1.075207 0.405762
+v -0.158242 1.077561 0.396348
+v -0.173410 1.072971 0.393164
+v -0.170442 1.057035 0.409100
+v -0.140459 1.068669 0.412300
+v -0.142904 1.081802 0.399167
+v -0.089192 1.070695 0.427062
+v -0.103499 1.064083 0.428830
+v -0.086549 1.066645 0.431116
+v -0.075333 1.076779 0.425027
+v -0.091376 1.074884 0.422877
+v -0.106082 1.068934 0.423979
+v -0.100474 1.059361 0.433552
+v -0.072988 1.073417 0.428404
+v -0.077045 1.080341 0.421480
+v -0.076591 1.055262 0.442495
+v -0.088877 1.046174 0.446739
+v -0.072555 1.051833 0.445927
+v -0.064690 1.063744 0.438062
+v -0.080233 1.058908 0.438852
+v -0.093147 1.050387 0.442526
+v -0.084227 1.042166 0.450746
+v -0.061192 1.060926 0.440895
+v -0.067644 1.066872 0.434949
+v -0.058770 1.042661 0.455096
+v -0.068197 1.031551 0.461361
+v -0.053616 1.040088 0.457673
+v -0.049638 1.053100 0.448705
+v -0.063622 1.045516 0.452244
+v -0.073865 1.034840 0.458073
+v -0.062239 1.028532 0.464381
+v -0.045225 1.051019 0.450802
+v -0.053634 1.055582 0.446239
+v -0.036944 1.033751 0.464006
+v -0.042871 1.021212 0.471701
+v -0.031024 1.032208 0.465552
+v -0.031204 1.045575 0.456231
+v -0.042675 1.035621 0.462140
+v -0.049549 1.023351 0.469562
+v -0.036010 1.019385 0.473527
+v -0.026176 1.044372 0.457449
+v -0.035969 1.047240 0.454581
+v -0.012601 1.029138 0.468618
+v -0.014622 1.015860 0.477053
+v -0.006317 1.028732 0.469028
+v -0.010643 1.041679 0.460127
+v -0.018821 1.029896 0.467864
+v -0.021856 1.016704 0.476209
+v -0.007327 1.015351 0.477562
+v -0.005344 1.041438 0.460383
+v -0.015853 1.042416 0.459405
+v 0.012601 1.029138 0.468618
+v 0.014622 1.015860 0.477053
+v 0.018821 1.029896 0.467864
+v 0.010643 1.041679 0.460127
+v 0.006317 1.028732 0.469028
+v 0.007327 1.015351 0.477562
+v 0.021856 1.016704 0.476209
+v 0.015853 1.042416 0.459405
+v 0.005344 1.041438 0.460383
+v 0.036945 1.033751 0.464006
+v 0.042871 1.021212 0.471701
+v 0.042675 1.035621 0.462140
+v 0.031204 1.045575 0.456231
+v 0.031024 1.032208 0.465552
+v 0.036010 1.019385 0.473527
+v 0.049549 1.023351 0.469562
+v 0.035969 1.047240 0.454581
+v 0.026177 1.044372 0.457449
+v 0.058770 1.042661 0.455096
+v 0.068198 1.031551 0.461361
+v 0.063622 1.045516 0.452244
+v 0.049639 1.053100 0.448705
+v 0.053616 1.040088 0.457673
+v 0.062239 1.028532 0.464381
+v 0.073865 1.034840 0.458073
+v 0.053634 1.055582 0.446239
+v 0.045225 1.051019 0.450802
+v 0.076591 1.055262 0.442495
+v 0.088877 1.046174 0.446739
+v 0.080233 1.058908 0.438852
+v 0.064690 1.063744 0.438062
+v 0.072555 1.051833 0.445927
+v 0.084227 1.042166 0.450746
+v 0.093148 1.050387 0.442526
+v 0.067644 1.066872 0.434949
+v 0.061192 1.060926 0.440895
+v 0.089192 1.070695 0.427062
+v 0.103499 1.064083 0.428830
+v 0.091376 1.074884 0.422877
+v 0.075333 1.076779 0.425027
+v 0.086550 1.066645 0.431116
+v 0.100474 1.059361 0.433552
+v 0.106082 1.068934 0.423979
+v 0.077045 1.080341 0.421480
+v 0.072988 1.073417 0.428404
+v 0.095715 1.087909 0.409848
+v 0.111068 1.084057 0.408855
+v 0.096292 1.092354 0.405406
+v 0.080843 1.091317 0.410488
+v 0.094646 1.083513 0.414248
+v 0.109875 1.078943 0.413970
+v 0.111788 1.089216 0.403697
+v 0.081194 1.095072 0.406749
+v 0.079811 1.087641 0.414180
+v 0.095715 1.105729 0.392028
+v 0.111068 1.104736 0.388176
+v 0.094646 1.110129 0.387632
+v 0.080843 1.106369 0.395436
+v 0.096292 1.101287 0.396473
+v 0.111788 1.099578 0.393335
+v 0.109875 1.109851 0.383062
+v 0.079811 1.110061 0.391761
+v 0.081194 1.102630 0.399191
+v 0.089192 1.122942 0.374814
+v 0.103499 1.124711 0.368202
+v 0.086550 1.126997 0.370764
+v 0.075333 1.120908 0.380898
+v 0.091376 1.118758 0.379003
+v 0.106082 1.119860 0.373053
+v 0.100474 1.129433 0.363480
+v 0.072988 1.124285 0.377536
+v 0.077045 1.117361 0.384461
+v 0.076591 1.138376 0.359381
+v 0.088877 1.142620 0.350293
+v 0.072555 1.141808 0.355952
+v 0.064690 1.133943 0.367863
+v 0.080233 1.134733 0.363027
+v 0.093148 1.138407 0.354506
+v 0.084227 1.146627 0.346285
+v 0.061192 1.136776 0.365045
+v 0.067644 1.130830 0.370991
+v 0.058770 1.150977 0.346780
+v 0.068198 1.157242 0.335671
+v 0.053616 1.153554 0.344207
+v 0.049639 1.144586 0.357219
+v 0.063622 1.148125 0.349636
+v 0.073865 1.153954 0.338959
+v 0.062239 1.160262 0.332651
+v 0.045225 1.146683 0.355138
+v 0.053634 1.142120 0.359701
+v 0.036945 1.159887 0.337870
+v 0.042871 1.167582 0.325331
+v 0.031024 1.161433 0.336327
+v 0.031204 1.152112 0.349694
+v 0.042675 1.158020 0.339740
+v 0.049549 1.165443 0.327470
+v 0.036010 1.169408 0.323504
+v 0.026177 1.153330 0.348491
+v 0.035969 1.150462 0.351360
+v 0.012601 1.164499 0.333257
+v 0.014622 1.172934 0.319979
+v 0.006317 1.164909 0.332851
+v 0.010643 1.156008 0.345798
+v 0.018821 1.163745 0.334015
+v 0.021856 1.172090 0.320823
+v 0.007327 1.173443 0.319470
+v 0.005344 1.156264 0.345557
+v 0.015853 1.155286 0.346535
+v -0.012601 1.164499 0.333257
+v -0.014622 1.172934 0.319979
+v -0.018821 1.163745 0.334015
+v -0.010643 1.156008 0.345798
+v -0.006317 1.164909 0.332851
+v -0.007327 1.173443 0.319470
+v -0.021856 1.172090 0.320823
+v -0.015853 1.155286 0.346535
+v -0.005344 1.156264 0.345557
+v -0.036944 1.159887 0.337870
+v -0.042871 1.167582 0.325331
+v -0.042675 1.158020 0.339740
+v -0.031204 1.152112 0.349694
+v -0.031024 1.161433 0.336327
+v -0.036010 1.169408 0.323504
+v -0.049549 1.165443 0.327470
+v -0.035969 1.150462 0.351360
+v -0.026176 1.153330 0.348491
+v -0.058770 1.150977 0.346780
+v -0.068197 1.157242 0.335671
+v -0.063622 1.148125 0.349636
+v -0.049638 1.144586 0.357219
+v -0.053616 1.153554 0.344207
+v -0.062239 1.160262 0.332651
+v -0.073865 1.153954 0.338959
+v -0.053634 1.142120 0.359701
+v -0.045225 1.146683 0.355138
+v -0.076591 1.138376 0.359381
+v -0.088877 1.142620 0.350293
+v -0.080233 1.134733 0.363027
+v -0.064690 1.133943 0.367863
+v -0.072555 1.141808 0.355952
+v -0.084227 1.146627 0.346286
+v -0.093147 1.138406 0.354506
+v -0.067644 1.130830 0.370991
+v -0.061192 1.136776 0.365045
+v -0.089192 1.122942 0.374814
+v -0.103499 1.124711 0.368202
+v -0.091376 1.118758 0.379003
+v -0.075333 1.120908 0.380898
+v -0.086549 1.126997 0.370764
+v -0.100474 1.129433 0.363480
+v -0.106082 1.119860 0.373053
+v -0.077045 1.117361 0.384461
+v -0.072988 1.124285 0.377536
+v -0.095715 1.105729 0.392028
+v -0.111068 1.104736 0.388176
+v -0.096292 1.101287 0.396473
+v -0.080842 1.106369 0.395436
+v -0.094646 1.110129 0.387632
+v -0.109875 1.109851 0.383062
+v -0.111788 1.099578 0.393335
+v -0.081194 1.102630 0.399191
+v -0.079811 1.110061 0.391761
+v -0.095715 1.087909 0.409848
+v -0.111068 1.084057 0.408855
+v -0.094646 1.083513 0.414248
+v -0.080842 1.091317 0.410488
+v -0.096292 1.092354 0.405406
+v -0.111788 1.089216 0.403697
+v -0.109875 1.078943 0.413970
+v -0.079811 1.087641 0.414180
+v -0.081194 1.095072 0.406749
+v -0.041827 0.387493 -0.283886
+v -0.050111 0.385689 -0.280838
+v -0.038504 0.389782 -0.286720
+v -0.036915 0.387071 -0.284009
+v -0.047930 0.383700 -0.278929
+v -0.050517 0.388118 -0.283346
+v -0.027229 0.390910 -0.289020
+v -0.035918 0.380256 -0.276649
+v -0.043031 0.377018 -0.272167
+v -0.033645 0.383066 -0.280004
+v -0.031118 0.380737 -0.277675
+v -0.040211 0.375495 -0.270723
+v -0.044327 0.379288 -0.274516
+v -0.023382 0.386199 -0.284309
+v -0.027561 0.374347 -0.270739
+v -0.033019 0.369938 -0.265088
+v -0.026494 0.377467 -0.274405
+v -0.023201 0.375681 -0.272619
+v -0.029752 0.368982 -0.264210
+v -0.035117 0.371893 -0.267121
+v -0.017942 0.382352 -0.280462
+v -0.017325 0.370168 -0.266561
+v -0.020757 0.364932 -0.260081
+v -0.017537 0.373369 -0.270306
+v -0.013702 0.372245 -0.269183
+v -0.017266 0.364605 -0.259833
+v -0.023513 0.366435 -0.261663
+v -0.011279 0.379632 -0.277741
+v -0.005909 0.368005 -0.264398
+v -0.007080 0.362341 -0.257490
+v -0.007385 0.371048 -0.267986
+v -0.003270 0.370665 -0.267603
+v -0.003603 0.362662 -0.257891
+v -0.010306 0.363286 -0.258515
+v -0.003847 0.378223 -0.276333
+v 0.005909 0.368005 -0.264398
+v 0.007080 0.362341 -0.257490
+v 0.003270 0.370665 -0.267603
+v 0.007385 0.371048 -0.267986
+v 0.010306 0.363286 -0.258515
+v 0.003602 0.362662 -0.257891
+v 0.003847 0.378223 -0.276333
+v 0.017325 0.370168 -0.266561
+v 0.020756 0.364932 -0.260081
+v 0.013702 0.372245 -0.269183
+v 0.017537 0.373369 -0.270306
+v 0.023512 0.366435 -0.261663
+v 0.017266 0.364605 -0.259833
+v 0.011279 0.379632 -0.277741
+v 0.027560 0.374347 -0.270739
+v 0.033019 0.369938 -0.265088
+v 0.023201 0.375681 -0.272619
+v 0.026494 0.377467 -0.274405
+v 0.035116 0.371893 -0.267121
+v 0.029752 0.368982 -0.264210
+v 0.017942 0.382352 -0.280462
+v 0.035917 0.380256 -0.276649
+v 0.043031 0.377018 -0.272167
+v 0.031118 0.380737 -0.277675
+v 0.033645 0.383066 -0.280004
+v 0.044327 0.379288 -0.274516
+v 0.040211 0.375495 -0.270723
+v 0.023382 0.386199 -0.284309
+v 0.041827 0.387493 -0.283886
+v 0.050111 0.385689 -0.280838
+v 0.036915 0.387071 -0.284009
+v 0.038504 0.389782 -0.286720
+v 0.050517 0.388118 -0.283346
+v 0.047930 0.383700 -0.278929
+v 0.027229 0.390910 -0.289020
+v 0.044886 0.395566 -0.291958
+v 0.053775 0.395360 -0.290509
+v 0.040196 0.394249 -0.291187
+v 0.040738 0.397159 -0.294097
+v 0.053265 0.397779 -0.293007
+v 0.052382 0.393039 -0.288267
+v 0.029220 0.396165 -0.294275
+v 0.044886 0.403923 -0.300315
+v 0.053775 0.405372 -0.300521
+v 0.040738 0.401784 -0.298721
+v 0.040196 0.404694 -0.301631
+v 0.052382 0.407614 -0.302842
+v 0.053265 0.402874 -0.298102
+v 0.029220 0.401606 -0.299716
+v 0.041827 0.411995 -0.308387
+v 0.050111 0.415043 -0.310192
+v 0.038504 0.409160 -0.306098
+v 0.036915 0.411872 -0.308810
+v 0.047930 0.416952 -0.312180
+v 0.050517 0.412535 -0.307763
+v 0.027229 0.406861 -0.304971
+v 0.035917 0.419232 -0.315625
+v 0.043031 0.423714 -0.318863
+v 0.033645 0.415877 -0.312815
+v 0.031118 0.418205 -0.315143
+v 0.040211 0.425157 -0.320386
+v 0.044327 0.421364 -0.316592
+v 0.023382 0.411572 -0.309682
+v 0.027560 0.425142 -0.321534
+v 0.033019 0.430793 -0.325943
+v 0.026494 0.421475 -0.318413
+v 0.023201 0.423262 -0.320200
+v 0.029752 0.431670 -0.326899
+v 0.035116 0.428760 -0.323988
+v 0.017942 0.415419 -0.313529
+v 0.017325 0.429320 -0.325713
+v 0.020756 0.435799 -0.330949
+v 0.017537 0.425574 -0.322512
+v 0.013702 0.426698 -0.323635
+v 0.017266 0.436047 -0.331276
+v 0.023512 0.434218 -0.329446
+v 0.011279 0.418139 -0.316249
+v 0.005909 0.431483 -0.327876
+v 0.007080 0.438391 -0.333540
+v 0.007385 0.427894 -0.324832
+v 0.003270 0.428278 -0.325215
+v 0.003602 0.437990 -0.333218
+v 0.010306 0.437366 -0.332594
+v 0.003847 0.419547 -0.317657
+v -0.005909 0.431483 -0.327876
+v -0.007080 0.438391 -0.333540
+v -0.003270 0.428278 -0.325215
+v -0.007385 0.427894 -0.324832
+v -0.010306 0.437366 -0.332594
+v -0.003603 0.437990 -0.333218
+v -0.003847 0.419547 -0.317657
+v -0.017325 0.429320 -0.325713
+v -0.020757 0.435799 -0.330949
+v -0.013702 0.426698 -0.323635
+v -0.017537 0.425574 -0.322512
+v -0.023513 0.434218 -0.329446
+v -0.017266 0.436047 -0.331276
+v -0.011279 0.418139 -0.316249
+v -0.027561 0.425142 -0.321534
+v -0.033019 0.430793 -0.325943
+v -0.023201 0.423262 -0.320200
+v -0.026494 0.421475 -0.318413
+v -0.035117 0.428760 -0.323988
+v -0.029752 0.431671 -0.326899
+v -0.017942 0.415419 -0.313529
+v -0.035918 0.419232 -0.315625
+v -0.043031 0.423714 -0.318863
+v -0.031118 0.418205 -0.315143
+v -0.033645 0.415877 -0.312815
+v -0.044327 0.421364 -0.316592
+v -0.040211 0.425157 -0.320386
+v -0.023382 0.411572 -0.309682
+v -0.041827 0.411995 -0.308387
+v -0.050111 0.415043 -0.310192
+v -0.036915 0.411872 -0.308810
+v -0.038504 0.409160 -0.306098
+v -0.050518 0.412535 -0.307763
+v -0.047930 0.416952 -0.312180
+v -0.027229 0.406861 -0.304971
+v -0.044886 0.403923 -0.300315
+v -0.053775 0.405372 -0.300521
+v -0.040196 0.404694 -0.301631
+v -0.040738 0.401784 -0.298721
+v -0.053265 0.402874 -0.298102
+v -0.052382 0.407614 -0.302842
+v -0.029221 0.401606 -0.299715
+v -0.044886 0.395566 -0.291958
+v -0.053775 0.395360 -0.290509
+v -0.040738 0.397159 -0.294097
+v -0.040196 0.394249 -0.291187
+v -0.052382 0.393039 -0.288267
+v -0.053265 0.397779 -0.293007
+v -0.029221 0.396165 -0.294275
+v -0.041827 1.090005 0.418626
+v -0.050111 1.086957 0.420431
+v -0.036915 1.090128 0.419048
+v -0.038504 1.092840 0.416337
+v -0.050517 1.089465 0.418002
+v -0.047930 1.085048 0.422419
+v -0.027229 1.095140 0.415209
+v -0.035917 1.082768 0.425863
+v -0.043031 1.078287 0.429101
+v -0.031118 1.083795 0.425382
+v -0.033645 1.086123 0.423053
+v -0.044327 1.080636 0.426831
+v -0.040211 1.076843 0.430624
+v -0.023382 1.090428 0.419921
+v -0.027560 1.076859 0.431773
+v -0.033019 1.071207 0.436181
+v -0.023201 1.078738 0.430438
+v -0.026494 1.080525 0.428652
+v -0.035116 1.073240 0.434227
+v -0.029752 1.070330 0.437137
+v -0.017942 1.086581 0.423767
+v -0.017325 1.072680 0.435951
+v -0.020756 1.066201 0.441187
+v -0.013702 1.075302 0.433874
+v -0.017537 1.076426 0.432751
+v -0.023512 1.067782 0.439684
+v -0.017266 1.065953 0.441514
+v -0.011279 1.083861 0.426488
+v -0.005909 1.070517 0.438114
+v -0.007080 1.063610 0.443778
+v -0.003270 1.073722 0.435454
+v -0.007385 1.074106 0.435071
+v -0.010306 1.064634 0.442833
+v -0.003602 1.064010 0.443457
+v -0.003847 1.082453 0.427896
+v 0.005909 1.070517 0.438114
+v 0.007080 1.063609 0.443778
+v 0.007385 1.074106 0.435071
+v 0.003270 1.073723 0.435454
+v 0.003603 1.064010 0.443457
+v 0.010306 1.064634 0.442833
+v 0.003847 1.082453 0.427896
+v 0.017325 1.072680 0.435951
+v 0.020757 1.066201 0.441187
+v 0.017537 1.076426 0.432751
+v 0.013702 1.075302 0.433874
+v 0.017266 1.065953 0.441514
+v 0.023513 1.067782 0.439684
+v 0.011279 1.083861 0.426488
+v 0.027561 1.076859 0.431773
+v 0.033019 1.071207 0.436181
+v 0.026494 1.080525 0.428652
+v 0.023201 1.078738 0.430438
+v 0.029752 1.070330 0.437137
+v 0.035117 1.073240 0.434227
+v 0.017942 1.086581 0.423767
+v 0.035918 1.082768 0.425863
+v 0.043031 1.078287 0.429101
+v 0.033645 1.086123 0.423053
+v 0.031118 1.083795 0.425382
+v 0.040211 1.076843 0.430624
+v 0.044327 1.080636 0.426831
+v 0.023382 1.090428 0.419921
+v 0.041827 1.090005 0.418626
+v 0.050111 1.086957 0.420431
+v 0.038504 1.092840 0.416337
+v 0.036915 1.090128 0.419048
+v 0.047930 1.085048 0.422419
+v 0.050517 1.089465 0.418002
+v 0.027229 1.095139 0.415209
+v 0.044886 1.098078 0.410554
+v 0.053775 1.096628 0.410760
+v 0.040738 1.100217 0.408960
+v 0.040196 1.097307 0.411870
+v 0.052382 1.094386 0.413080
+v 0.053265 1.099126 0.408340
+v 0.029221 1.100395 0.409954
+v 0.044886 1.106435 0.402197
+v 0.053775 1.106641 0.400747
+v 0.040196 1.107751 0.401426
+v 0.040738 1.104841 0.404335
+v 0.053265 1.104221 0.403246
+v 0.052382 1.108961 0.398505
+v 0.029221 1.105835 0.404514
+v 0.041827 1.114507 0.394124
+v 0.050111 1.116312 0.391076
+v 0.036915 1.114929 0.394247
+v 0.038504 1.112218 0.396959
+v 0.050517 1.113883 0.393584
+v 0.047930 1.118300 0.389167
+v 0.027229 1.111090 0.399259
+v 0.035918 1.121744 0.386887
+v 0.043031 1.124982 0.382406
+v 0.031118 1.121263 0.387914
+v 0.033645 1.118934 0.390242
+v 0.044327 1.122712 0.384755
+v 0.040211 1.126505 0.380962
+v 0.023382 1.115801 0.394547
+v 0.027561 1.127654 0.380978
+v 0.033019 1.132062 0.375326
+v 0.023201 1.126319 0.382857
+v 0.026494 1.124533 0.384644
+v 0.035117 1.130108 0.377359
+v 0.029752 1.133018 0.374449
+v 0.017942 1.119648 0.390700
+v 0.017325 1.131832 0.376799
+v 0.020757 1.137068 0.370320
+v 0.013702 1.129755 0.379422
+v 0.017537 1.128632 0.380545
+v 0.023513 1.135565 0.371901
+v 0.017266 1.137395 0.370072
+v 0.011279 1.122369 0.387980
+v 0.005909 1.133995 0.374636
+v 0.007080 1.139659 0.367729
+v 0.003270 1.131335 0.377842
+v 0.007385 1.130952 0.378225
+v 0.010306 1.138714 0.368753
+v 0.003603 1.139338 0.368129
+v 0.003847 1.123777 0.386572
+v -0.005909 1.133995 0.374636
+v -0.007080 1.139659 0.367729
+v -0.007385 1.130952 0.378225
+v -0.003270 1.131335 0.377842
+v -0.003602 1.139338 0.368129
+v -0.010306 1.138714 0.368753
+v -0.003847 1.123777 0.386572
+v -0.017325 1.131832 0.376799
+v -0.020756 1.137068 0.370320
+v -0.017537 1.128632 0.380545
+v -0.013702 1.129755 0.379422
+v -0.017266 1.137395 0.370072
+v -0.023513 1.135565 0.371901
+v -0.011279 1.122368 0.387980
+v -0.027560 1.127654 0.380978
+v -0.033019 1.132062 0.375326
+v -0.026494 1.124533 0.384644
+v -0.023201 1.126319 0.382857
+v -0.029752 1.133018 0.374449
+v -0.035117 1.130108 0.377359
+v -0.017942 1.119648 0.390700
+v -0.035917 1.121744 0.386887
+v -0.043031 1.124982 0.382406
+v -0.033645 1.118934 0.390242
+v -0.031118 1.121263 0.387914
+v -0.040211 1.126505 0.380962
+v -0.044327 1.122712 0.384755
+v -0.023382 1.115801 0.394547
+v -0.041827 1.114507 0.394124
+v -0.050111 1.116311 0.391076
+v -0.038504 1.112218 0.396959
+v -0.036915 1.114929 0.394247
+v -0.047930 1.118300 0.389167
+v -0.050517 1.113883 0.393584
+v -0.027229 1.111090 0.399258
+v -0.044886 1.106435 0.402197
+v -0.053775 1.106640 0.400747
+v -0.040738 1.104841 0.404335
+v -0.040196 1.107751 0.401426
+v -0.052382 1.108961 0.398505
+v -0.053265 1.104221 0.403246
+v -0.029220 1.105835 0.404514
+v -0.044886 1.098078 0.410554
+v -0.053775 1.096628 0.410760
+v -0.040196 1.097306 0.411870
+v -0.040738 1.100217 0.408960
+v -0.053265 1.099126 0.408340
+v -0.052382 1.094386 0.413080
+v -0.029220 1.100395 0.409954
+v -0.063341 0.386281 -0.279109
+v -0.062210 0.383325 -0.276113
+v -0.060034 0.380636 -0.273464
+v -0.055603 0.375209 -0.268036
+v -0.053421 0.372561 -0.265349
+v -0.050342 0.370361 -0.263188
+v -0.044075 0.365929 -0.258757
+v -0.040992 0.363772 -0.256560
+v -0.037219 0.362210 -0.255037
+v -0.029544 0.359076 -0.251904
+v -0.025768 0.357557 -0.250345
+v -0.021560 0.356738 -0.249565
+v -0.012999 0.355116 -0.247943
+v -0.008789 0.354340 -0.247128
+v -0.004432 0.354318 -0.247146
+v 0.004431 0.354318 -0.247146
+v 0.008789 0.354340 -0.247128
+v 0.012999 0.355116 -0.247943
+v 0.021560 0.356738 -0.249565
+v 0.025768 0.357557 -0.250345
+v 0.029544 0.359076 -0.251904
+v 0.037219 0.362210 -0.255037
+v 0.040991 0.363772 -0.256560
+v 0.044075 0.365929 -0.258757
+v 0.050342 0.370361 -0.263188
+v 0.053421 0.372561 -0.265349
+v 0.055602 0.375209 -0.268036
+v 0.060034 0.380636 -0.273464
+v 0.062210 0.383325 -0.276114
+v 0.063341 0.386281 -0.279109
+v 0.065635 0.392335 -0.285162
+v 0.066760 0.395331 -0.288120
+v 0.066763 0.398393 -0.291221
+v 0.066763 0.404660 -0.297488
+v 0.066760 0.407761 -0.300549
+v 0.065635 0.410718 -0.303546
+v 0.063341 0.416772 -0.309599
+v 0.062210 0.419767 -0.312555
+v 0.060034 0.422417 -0.315245
+v 0.055603 0.427844 -0.320672
+v 0.053421 0.430532 -0.323320
+v 0.050342 0.432692 -0.325520
+v 0.044075 0.437124 -0.329951
+v 0.040991 0.439321 -0.332109
+v 0.037219 0.440843 -0.333671
+v 0.029544 0.443977 -0.336805
+v 0.025768 0.445536 -0.338324
+v 0.021560 0.446315 -0.339143
+v 0.012999 0.447937 -0.340765
+v 0.008789 0.448753 -0.341541
+v 0.004431 0.448735 -0.341563
+v -0.004432 0.448735 -0.341563
+v -0.008789 0.448753 -0.341541
+v -0.012999 0.447937 -0.340765
+v -0.021560 0.446315 -0.339143
+v -0.025768 0.445536 -0.338324
+v -0.029544 0.443977 -0.336805
+v -0.037219 0.440844 -0.333671
+v -0.040992 0.439321 -0.332109
+v -0.044075 0.437124 -0.329951
+v -0.050342 0.432692 -0.325520
+v -0.053421 0.430532 -0.323320
+v -0.055603 0.427845 -0.320672
+v -0.060034 0.422417 -0.315245
+v -0.062210 0.419767 -0.312555
+v -0.063341 0.416772 -0.309599
+v -0.065635 0.410718 -0.303546
+v -0.066760 0.407761 -0.300549
+v -0.066763 0.404660 -0.297488
+v -0.066763 0.398393 -0.291221
+v -0.066760 0.395331 -0.288120
+v -0.065635 0.392335 -0.285162
+v -0.114520 0.370473 -0.245540
+v -0.117967 0.375855 -0.250922
+v -0.120911 0.381384 -0.256452
+v -0.096001 0.350875 -0.225942
+v -0.101301 0.355443 -0.230510
+v -0.106169 0.360245 -0.235312
+v -0.070939 0.335334 -0.210402
+v -0.077731 0.338776 -0.213844
+v -0.084191 0.342524 -0.217591
+v -0.041044 0.324909 -0.199977
+v -0.048864 0.326991 -0.202059
+v -0.056475 0.329429 -0.204496
+v -0.008351 0.320311 -0.195378
+v -0.016667 0.320891 -0.195958
+v -0.024911 0.321853 -0.196920
+v 0.024911 0.321853 -0.196920
+v 0.016666 0.320891 -0.195958
+v 0.008351 0.320311 -0.195378
+v 0.056475 0.329429 -0.204496
+v 0.048864 0.326991 -0.202059
+v 0.041044 0.324909 -0.199977
+v 0.084190 0.342524 -0.217591
+v 0.077731 0.338776 -0.213844
+v 0.070939 0.335334 -0.210402
+v 0.106169 0.360245 -0.235312
+v 0.101301 0.355443 -0.230510
+v 0.096001 0.350875 -0.225942
+v 0.120911 0.381384 -0.256452
+v 0.117967 0.375855 -0.250922
+v 0.114520 0.370473 -0.245540
+v 0.127414 0.404502 -0.279569
+v 0.126594 0.398622 -0.273689
+v 0.125234 0.392792 -0.267859
+v 0.125234 0.428021 -0.303089
+v 0.126594 0.422192 -0.297259
+v 0.127414 0.416312 -0.291379
+v 0.114520 0.450340 -0.325408
+v 0.117967 0.444958 -0.320026
+v 0.120911 0.439429 -0.314496
+v 0.096001 0.469938 -0.345006
+v 0.101301 0.465371 -0.340438
+v 0.106169 0.460568 -0.335636
+v 0.070939 0.485479 -0.360547
+v 0.077731 0.482037 -0.357105
+v 0.084190 0.478289 -0.353357
+v 0.041044 0.495904 -0.370971
+v 0.048864 0.493822 -0.368890
+v 0.056475 0.491384 -0.366452
+v 0.008351 0.500502 -0.375570
+v 0.016666 0.499922 -0.374990
+v 0.024911 0.498961 -0.374028
+v -0.024911 0.498961 -0.374028
+v -0.016667 0.499922 -0.374990
+v -0.008351 0.500502 -0.375570
+v -0.056475 0.491384 -0.366452
+v -0.048864 0.493822 -0.368890
+v -0.041044 0.495904 -0.370971
+v -0.084191 0.478289 -0.353357
+v -0.077731 0.482037 -0.357105
+v -0.070939 0.485479 -0.360547
+v -0.106169 0.460568 -0.335636
+v -0.101301 0.465371 -0.340438
+v -0.096001 0.469938 -0.345006
+v -0.120912 0.439429 -0.314496
+v -0.117967 0.444958 -0.320026
+v -0.114520 0.450341 -0.325408
+v -0.127414 0.416312 -0.291379
+v -0.126595 0.422192 -0.297259
+v -0.125234 0.428021 -0.303089
+v -0.125234 0.392792 -0.267859
+v -0.126595 0.398622 -0.273689
+v -0.127414 0.404502 -0.279569
+v -0.169326 0.366187 -0.211603
+v -0.174423 0.374145 -0.219561
+v -0.178777 0.382321 -0.227737
+v -0.141944 0.337211 -0.182626
+v -0.149781 0.343964 -0.189380
+v -0.156978 0.351065 -0.196480
+v -0.104889 0.314232 -0.159648
+v -0.114931 0.319322 -0.164737
+v -0.124482 0.324863 -0.170279
+v -0.060686 0.298818 -0.144234
+v -0.072249 0.301897 -0.147312
+v -0.083503 0.305501 -0.150917
+v -0.012348 0.292019 -0.137435
+v -0.024643 0.292877 -0.138292
+v -0.036833 0.294299 -0.139714
+v 0.036832 0.294299 -0.139714
+v 0.024643 0.292877 -0.138292
+v 0.012348 0.292019 -0.137435
+v 0.083502 0.305501 -0.150917
+v 0.072249 0.301896 -0.147312
+v 0.060686 0.298818 -0.144234
+v 0.124482 0.324863 -0.170279
+v 0.114931 0.319321 -0.164737
+v 0.104889 0.314232 -0.159648
+v 0.156978 0.351065 -0.196480
+v 0.149781 0.343964 -0.189380
+v 0.141944 0.337210 -0.182626
+v 0.178777 0.382321 -0.227737
+v 0.174423 0.374145 -0.219561
+v 0.169326 0.366187 -0.211603
+v 0.188392 0.416501 -0.261917
+v 0.187179 0.407808 -0.253223
+v 0.185168 0.399188 -0.244604
+v 0.185168 0.451277 -0.296693
+v 0.187179 0.442657 -0.288073
+v 0.188392 0.433964 -0.279379
+v 0.169326 0.484278 -0.329693
+v 0.174423 0.476320 -0.321736
+v 0.178777 0.468144 -0.313560
+v 0.141944 0.513255 -0.358670
+v 0.149781 0.506501 -0.351917
+v 0.156978 0.499400 -0.344816
+v 0.104889 0.536233 -0.381649
+v 0.114931 0.531144 -0.376559
+v 0.124482 0.525602 -0.371018
+v 0.060686 0.551647 -0.397062
+v 0.072249 0.548568 -0.393984
+v 0.083502 0.544964 -0.390380
+v 0.012348 0.558446 -0.403861
+v 0.024643 0.557588 -0.403004
+v 0.036832 0.556166 -0.401582
+v -0.036833 0.556166 -0.401582
+v -0.024643 0.557588 -0.403004
+v -0.012348 0.558446 -0.403861
+v -0.083503 0.544964 -0.390380
+v -0.072249 0.548568 -0.393984
+v -0.060686 0.551647 -0.397062
+v -0.124482 0.525602 -0.371018
+v -0.114931 0.531144 -0.376559
+v -0.104889 0.536233 -0.381649
+v -0.156978 0.499400 -0.344816
+v -0.149781 0.506501 -0.351917
+v -0.141944 0.513255 -0.358670
+v -0.178777 0.468144 -0.313560
+v -0.174424 0.476320 -0.321736
+v -0.169326 0.484278 -0.329693
+v -0.188392 0.433964 -0.279379
+v -0.187180 0.442658 -0.288073
+v -0.185168 0.451277 -0.296693
+v -0.185168 0.399188 -0.244604
+v -0.187180 0.407808 -0.253223
+v -0.188392 0.416501 -0.261917
+v -0.221235 0.368486 -0.173102
+v -0.227895 0.378883 -0.183499
+v -0.233583 0.389566 -0.194182
+v -0.185459 0.330626 -0.135242
+v -0.195698 0.339450 -0.144066
+v -0.205102 0.348727 -0.153343
+v -0.137044 0.300603 -0.105219
+v -0.150164 0.307253 -0.111869
+v -0.162644 0.314493 -0.119109
+v -0.079290 0.280464 -0.085080
+v -0.094397 0.284486 -0.089102
+v -0.109101 0.289196 -0.093812
+v -0.016133 0.271581 -0.076197
+v -0.032197 0.272701 -0.077317
+v -0.048124 0.274559 -0.079175
+v 0.048124 0.274559 -0.079175
+v 0.032197 0.272701 -0.077317
+v 0.016133 0.271581 -0.076197
+v 0.109101 0.289196 -0.093812
+v 0.094397 0.284486 -0.089102
+v 0.079290 0.280464 -0.085080
+v 0.162643 0.314493 -0.119109
+v 0.150164 0.307253 -0.111869
+v 0.137044 0.300603 -0.105219
+v 0.205102 0.348727 -0.153343
+v 0.195698 0.339450 -0.144066
+v 0.185459 0.330626 -0.135242
+v 0.233583 0.389566 -0.194182
+v 0.227895 0.378883 -0.183499
+v 0.221235 0.368486 -0.173102
+v 0.246146 0.434225 -0.238841
+v 0.244562 0.422866 -0.227482
+v 0.241934 0.411604 -0.216220
+v 0.241934 0.479661 -0.284277
+v 0.244562 0.468399 -0.273015
+v 0.246146 0.457040 -0.261656
+v 0.221235 0.522779 -0.327395
+v 0.227895 0.512381 -0.316997
+v 0.233583 0.501699 -0.306315
+v 0.185459 0.560639 -0.365255
+v 0.195698 0.551815 -0.356431
+v 0.205102 0.542537 -0.347153
+v 0.137044 0.590661 -0.395277
+v 0.150164 0.584012 -0.388628
+v 0.162643 0.576772 -0.381388
+v 0.079290 0.610800 -0.415416
+v 0.094397 0.606779 -0.411395
+v 0.109101 0.602069 -0.406685
+v 0.016133 0.619684 -0.424300
+v 0.032197 0.618564 -0.423180
+v 0.048124 0.616705 -0.421322
+v -0.048124 0.616705 -0.421322
+v -0.032197 0.618564 -0.423180
+v -0.016133 0.619684 -0.424300
+v -0.109101 0.602069 -0.406685
+v -0.094397 0.606779 -0.411395
+v -0.079290 0.610800 -0.415416
+v -0.162644 0.576772 -0.381388
+v -0.150165 0.584012 -0.388628
+v -0.137044 0.590661 -0.395277
+v -0.205102 0.542537 -0.347153
+v -0.195698 0.551815 -0.356431
+v -0.185459 0.560639 -0.365255
+v -0.233583 0.501699 -0.306315
+v -0.227895 0.512381 -0.316997
+v -0.221235 0.522779 -0.327395
+v -0.246146 0.457040 -0.261656
+v -0.244562 0.468399 -0.273015
+v -0.241934 0.479661 -0.284277
+v -0.241934 0.411604 -0.216220
+v -0.244562 0.422866 -0.227481
+v -0.246146 0.434225 -0.238841
+v -0.269358 0.377330 -0.130696
+v -0.277468 0.389989 -0.143355
+v -0.284393 0.402995 -0.156361
+v -0.225801 0.331234 -0.084601
+v -0.238267 0.341978 -0.095344
+v -0.249716 0.353273 -0.106640
+v -0.166855 0.294681 -0.048048
+v -0.182829 0.302777 -0.056143
+v -0.198022 0.311592 -0.064959
+v -0.096538 0.270161 -0.023528
+v -0.114931 0.275058 -0.028424
+v -0.132833 0.280792 -0.034158
+v -0.019642 0.259346 -0.012712
+v -0.039201 0.260709 -0.014076
+v -0.058592 0.262972 -0.016338
+v 0.058592 0.262972 -0.016338
+v 0.039201 0.260709 -0.014076
+v 0.019642 0.259346 -0.012712
+v 0.132833 0.280792 -0.034158
+v 0.114931 0.275058 -0.028424
+v 0.096538 0.270161 -0.023528
+v 0.198022 0.311592 -0.064959
+v 0.182829 0.302777 -0.056143
+v 0.166855 0.294681 -0.048048
+v 0.249716 0.353273 -0.106640
+v 0.238267 0.341978 -0.095344
+v 0.225800 0.331234 -0.084601
+v 0.284393 0.402995 -0.156361
+v 0.277468 0.389989 -0.143355
+v 0.269358 0.377330 -0.130696
+v 0.299688 0.457368 -0.210734
+v 0.297759 0.443538 -0.196904
+v 0.294560 0.429826 -0.183193
+v 0.294560 0.512688 -0.266054
+v 0.297759 0.498976 -0.252343
+v 0.299688 0.485146 -0.238513
+v 0.269358 0.565184 -0.318551
+v 0.277468 0.552525 -0.305892
+v 0.284393 0.539520 -0.292886
+v 0.225800 0.611280 -0.364646
+v 0.238267 0.600536 -0.353903
+v 0.249716 0.589241 -0.342608
+v 0.166855 0.647833 -0.401200
+v 0.182829 0.639737 -0.393104
+v 0.198022 0.630922 -0.384289
+v 0.096538 0.672353 -0.425720
+v 0.114931 0.667456 -0.420823
+v 0.132833 0.661722 -0.415089
+v 0.019642 0.683168 -0.436535
+v 0.039201 0.681805 -0.435171
+v 0.058592 0.679543 -0.432909
+v -0.058592 0.679543 -0.432909
+v -0.039201 0.681805 -0.435171
+v -0.019642 0.683168 -0.436535
+v -0.132833 0.661722 -0.415089
+v -0.114931 0.667456 -0.420823
+v -0.096538 0.672353 -0.425720
+v -0.198022 0.630922 -0.384289
+v -0.182829 0.639737 -0.393104
+v -0.166855 0.647833 -0.401200
+v -0.249716 0.589241 -0.342608
+v -0.238267 0.600537 -0.353903
+v -0.225801 0.611280 -0.364646
+v -0.284393 0.539520 -0.292886
+v -0.277468 0.552526 -0.305892
+v -0.269359 0.565184 -0.318551
+v -0.299688 0.485146 -0.238513
+v -0.297760 0.498976 -0.252343
+v -0.294560 0.512688 -0.266054
+v -0.294560 0.429826 -0.183193
+v -0.297760 0.443538 -0.196904
+v -0.299688 0.457368 -0.210734
+v -0.312873 0.392567 -0.085111
+v -0.322293 0.407271 -0.099815
+v -0.330336 0.422378 -0.114922
+v -0.262279 0.339025 -0.031569
+v -0.276759 0.351504 -0.044048
+v -0.290058 0.364624 -0.057168
+v -0.193810 0.296567 0.010890
+v -0.212365 0.305970 0.001486
+v -0.230013 0.316209 -0.008753
+v -0.112134 0.268086 0.039371
+v -0.133498 0.273773 0.033683
+v -0.154293 0.280434 0.027022
+v -0.022815 0.255523 0.051933
+v -0.045534 0.257107 0.050349
+v -0.068058 0.259734 0.047722
+v 0.068058 0.259734 0.047722
+v 0.045534 0.257107 0.050349
+v 0.022815 0.255523 0.051933
+v 0.154292 0.280434 0.027022
+v 0.133498 0.273773 0.033683
+v 0.112134 0.268085 0.039371
+v 0.230013 0.316209 -0.008753
+v 0.212365 0.305970 0.001486
+v 0.193810 0.296566 0.010890
+v 0.290058 0.364624 -0.057168
+v 0.276759 0.351504 -0.044048
+v 0.262279 0.339025 -0.031569
+v 0.330336 0.422378 -0.114922
+v 0.322293 0.407271 -0.099815
+v 0.312873 0.392567 -0.085111
+v 0.348102 0.485535 -0.178079
+v 0.345863 0.469471 -0.162015
+v 0.342146 0.453544 -0.146088
+v 0.342146 0.549792 -0.242336
+v 0.345863 0.533866 -0.226410
+v 0.348102 0.517801 -0.210345
+v 0.312873 0.610770 -0.303314
+v 0.322293 0.596066 -0.288610
+v 0.330336 0.580959 -0.273503
+v 0.262279 0.664312 -0.356856
+v 0.276759 0.651833 -0.344377
+v 0.290058 0.638713 -0.331257
+v 0.193810 0.706770 -0.399314
+v 0.212365 0.697366 -0.389911
+v 0.230013 0.687127 -0.379671
+v 0.112134 0.735251 -0.427795
+v 0.133498 0.729564 -0.422108
+v 0.154292 0.722903 -0.415447
+v 0.022815 0.747814 -0.440358
+v 0.045534 0.746230 -0.438774
+v 0.068058 0.743602 -0.436146
+v -0.068058 0.743602 -0.436146
+v -0.045534 0.746230 -0.438774
+v -0.022815 0.747814 -0.440358
+v -0.154293 0.722903 -0.415447
+v -0.133498 0.729564 -0.422108
+v -0.112134 0.735251 -0.427795
+v -0.230013 0.687127 -0.379671
+v -0.212365 0.697367 -0.389911
+v -0.193810 0.706770 -0.399314
+v -0.290058 0.638713 -0.331257
+v -0.276759 0.651833 -0.344377
+v -0.262279 0.664312 -0.356856
+v -0.330336 0.580959 -0.273503
+v -0.322293 0.596066 -0.288610
+v -0.312873 0.610770 -0.303314
+v -0.348103 0.517801 -0.210345
+v -0.345863 0.533866 -0.226409
+v -0.342146 0.549792 -0.242336
+v -0.342146 0.453544 -0.146088
+v -0.345863 0.469471 -0.162015
+v -0.348103 0.485535 -0.178079
+v -0.351035 0.413937 -0.037127
+v -0.361603 0.430435 -0.053624
+v -0.370628 0.447384 -0.070573
+v -0.294269 0.353864 0.022946
+v -0.310515 0.367866 0.008945
+v -0.325437 0.382586 -0.005775
+v -0.217449 0.306227 0.070583
+v -0.238267 0.316778 0.060033
+v -0.258068 0.328266 0.048545
+v -0.125811 0.274273 0.102538
+v -0.149781 0.280654 0.096157
+v -0.173112 0.288127 0.088684
+v -0.025598 0.260178 0.116633
+v -0.051087 0.261955 0.114856
+v -0.076359 0.264903 0.111908
+v 0.076359 0.264903 0.111908
+v 0.051087 0.261955 0.114856
+v 0.025598 0.260178 0.116633
+v 0.173112 0.288127 0.088684
+v 0.149781 0.280654 0.096157
+v 0.125811 0.274273 0.102538
+v 0.258068 0.328266 0.048545
+v 0.238267 0.316778 0.060033
+v 0.217449 0.306227 0.070583
+v 0.325437 0.382586 -0.005775
+v 0.310515 0.367866 0.008945
+v 0.294269 0.353864 0.022946
+v 0.370628 0.447384 -0.070574
+v 0.361603 0.430435 -0.053624
+v 0.351035 0.413937 -0.037127
+v 0.390561 0.518245 -0.141434
+v 0.388048 0.500221 -0.123411
+v 0.383878 0.482352 -0.105541
+v 0.383878 0.590339 -0.213529
+v 0.388048 0.572470 -0.195659
+v 0.390561 0.554446 -0.177636
+v 0.351035 0.658754 -0.281944
+v 0.361603 0.642257 -0.265446
+v 0.370628 0.625307 -0.248497
+v 0.294269 0.718827 -0.342016
+v 0.310515 0.704826 -0.328015
+v 0.325437 0.690105 -0.313295
+v 0.217449 0.766464 -0.389654
+v 0.238267 0.755913 -0.379103
+v 0.258068 0.744425 -0.367615
+v 0.125811 0.798419 -0.421608
+v 0.149781 0.792038 -0.415227
+v 0.173112 0.784565 -0.407754
+v 0.025598 0.812514 -0.435703
+v 0.051087 0.810737 -0.433926
+v 0.076359 0.807788 -0.430978
+v -0.076359 0.807788 -0.430978
+v -0.051088 0.810737 -0.433926
+v -0.025598 0.812514 -0.435703
+v -0.173112 0.784565 -0.407754
+v -0.149781 0.792038 -0.415227
+v -0.125811 0.798419 -0.421608
+v -0.258068 0.744425 -0.367615
+v -0.238267 0.755913 -0.379103
+v -0.217449 0.766464 -0.389653
+v -0.325437 0.690106 -0.313295
+v -0.310516 0.704826 -0.328015
+v -0.294269 0.718827 -0.342016
+v -0.370628 0.625307 -0.248497
+v -0.361603 0.642257 -0.265446
+v -0.351035 0.658754 -0.281944
+v -0.390561 0.554446 -0.177636
+v -0.388048 0.572470 -0.195659
+v -0.383878 0.590339 -0.213529
+v -0.383878 0.482352 -0.105541
+v -0.388048 0.500221 -0.123411
+v -0.390561 0.518245 -0.141434
+v -0.383190 0.441075 0.012436
+v -0.394726 0.459083 -0.005572
+v -0.404577 0.477585 -0.024074
+v -0.321224 0.375499 0.078012
+v -0.338959 0.390783 0.062728
+v -0.355247 0.406852 0.046660
+v -0.237368 0.323498 0.130013
+v -0.260092 0.335016 0.118495
+v -0.281707 0.347556 0.105955
+v -0.137335 0.288617 0.164895
+v -0.163501 0.295582 0.157929
+v -0.188969 0.303740 0.149771
+v -0.027943 0.273230 0.180281
+v -0.055767 0.275170 0.178341
+v -0.083353 0.278389 0.175122
+v 0.083353 0.278389 0.175122
+v 0.055767 0.275170 0.178341
+v 0.027943 0.273230 0.180281
+v 0.188969 0.303740 0.149771
+v 0.163501 0.295582 0.157929
+v 0.137335 0.288616 0.164895
+v 0.281707 0.347556 0.105955
+v 0.260092 0.335016 0.118495
+v 0.237368 0.323498 0.130013
+v 0.355247 0.406852 0.046660
+v 0.338959 0.390783 0.062728
+v 0.321224 0.375499 0.078012
+v 0.404577 0.477585 -0.024074
+v 0.394726 0.459083 -0.005572
+v 0.383190 0.441075 0.012436
+v 0.426337 0.554937 -0.101426
+v 0.423593 0.535263 -0.081752
+v 0.419042 0.515756 -0.062245
+v 0.419042 0.633635 -0.180124
+v 0.423593 0.614129 -0.160618
+v 0.426337 0.594455 -0.140944
+v 0.383190 0.708317 -0.254806
+v 0.394726 0.690308 -0.236798
+v 0.404577 0.671806 -0.218295
+v 0.321224 0.773893 -0.320382
+v 0.338959 0.758609 -0.305098
+v 0.355247 0.742540 -0.289029
+v 0.237368 0.825893 -0.372382
+v 0.260092 0.814376 -0.360865
+v 0.281707 0.801836 -0.348325
+v 0.137335 0.860775 -0.407264
+v 0.163501 0.853809 -0.400298
+v 0.188969 0.845652 -0.392141
+v 0.027943 0.876162 -0.422651
+v 0.055767 0.874222 -0.420711
+v 0.083353 0.871003 -0.417492
+v -0.083353 0.871003 -0.417492
+v -0.055767 0.874222 -0.420711
+v -0.027943 0.876162 -0.422651
+v -0.188969 0.845652 -0.392141
+v -0.163501 0.853809 -0.400298
+v -0.137335 0.860775 -0.407264
+v -0.281707 0.801836 -0.348325
+v -0.260093 0.814376 -0.360865
+v -0.237368 0.825893 -0.372382
+v -0.355247 0.742540 -0.289029
+v -0.338959 0.758609 -0.305098
+v -0.321224 0.773893 -0.320382
+v -0.404578 0.671806 -0.218295
+v -0.394726 0.690309 -0.236797
+v -0.383190 0.708317 -0.254806
+v -0.426337 0.594455 -0.140944
+v -0.423593 0.614129 -0.160618
+v -0.419042 0.633635 -0.180124
+v -0.419042 0.515756 -0.062245
+v -0.423593 0.535263 -0.081751
+v -0.426337 0.554937 -0.101426
+v -0.408789 0.473515 0.062730
+v -0.421095 0.492727 0.043518
+v -0.431605 0.512465 0.023780
+v -0.342683 0.403559 0.132686
+v -0.361603 0.419863 0.116381
+v -0.378979 0.437006 0.099239
+v -0.253225 0.348084 0.188160
+v -0.277468 0.360371 0.175874
+v -0.300526 0.373749 0.162496
+v -0.146510 0.310872 0.225373
+v -0.174423 0.318303 0.217941
+v -0.201593 0.327006 0.209239
+v -0.029810 0.294458 0.241787
+v -0.059493 0.296528 0.239717
+v -0.088921 0.299961 0.236284
+v 0.088921 0.299961 0.236284
+v 0.059493 0.296527 0.239717
+v 0.029810 0.294458 0.241787
+v 0.201593 0.327006 0.209239
+v 0.174423 0.318303 0.217941
+v 0.146509 0.310872 0.225373
+v 0.300526 0.373749 0.162496
+v 0.277468 0.360371 0.175874
+v 0.253225 0.348084 0.188160
+v 0.378979 0.437006 0.099239
+v 0.361603 0.419863 0.116381
+v 0.342683 0.403559 0.132686
+v 0.431605 0.512465 0.023780
+v 0.421095 0.492727 0.043518
+v 0.408789 0.473515 0.062730
+v 0.454818 0.594984 -0.058739
+v 0.451891 0.573995 -0.037751
+v 0.447036 0.553186 -0.016941
+v 0.447036 0.678940 -0.142695
+v 0.451891 0.658130 -0.121886
+v 0.454818 0.637141 -0.100897
+v 0.408789 0.758610 -0.222366
+v 0.421095 0.739399 -0.203154
+v 0.431605 0.719661 -0.183416
+v 0.342683 0.828567 -0.292322
+v 0.361603 0.812262 -0.276017
+v 0.378979 0.795120 -0.258875
+v 0.253225 0.884041 -0.347797
+v 0.277468 0.871755 -0.335510
+v 0.300526 0.858377 -0.322132
+v 0.146509 0.921253 -0.385009
+v 0.174423 0.913822 -0.377578
+v 0.201593 0.905120 -0.368875
+v 0.029810 0.937667 -0.401423
+v 0.059493 0.935598 -0.399354
+v 0.088921 0.932165 -0.395920
+v -0.088922 0.932165 -0.395920
+v -0.059493 0.935598 -0.399353
+v -0.029810 0.937667 -0.401423
+v -0.201593 0.905120 -0.368875
+v -0.174424 0.913822 -0.377578
+v -0.146510 0.921254 -0.385009
+v -0.300526 0.858377 -0.322132
+v -0.277468 0.871755 -0.335510
+v -0.253225 0.884041 -0.347797
+v -0.378979 0.795120 -0.258875
+v -0.361603 0.812262 -0.276017
+v -0.342684 0.828567 -0.292322
+v -0.431605 0.719661 -0.183416
+v -0.421096 0.739399 -0.203154
+v -0.408789 0.758610 -0.222366
+v -0.454818 0.637141 -0.100897
+v -0.451891 0.658130 -0.121886
+v -0.447036 0.678940 -0.142695
+v -0.447036 0.553186 -0.016941
+v -0.451891 0.573995 -0.037750
+v -0.454818 0.594984 -0.058739
+v -0.427393 0.510703 0.112893
+v -0.440260 0.530789 0.092807
+v -0.451247 0.551426 0.072170
+v -0.358279 0.437563 0.186033
+v -0.378060 0.454610 0.168986
+v -0.396226 0.472532 0.151064
+v -0.264749 0.379564 0.244032
+v -0.290095 0.392410 0.231186
+v -0.314203 0.406397 0.217199
+v -0.153177 0.340658 0.282938
+v -0.182362 0.348428 0.275168
+v -0.210767 0.357526 0.266070
+v -0.031166 0.323497 0.300099
+v -0.062200 0.325661 0.297935
+v -0.092968 0.329251 0.294345
+v 0.092968 0.329250 0.294345
+v 0.062200 0.325661 0.297935
+v 0.031166 0.323497 0.300099
+v 0.210767 0.357526 0.266070
+v 0.182362 0.348428 0.275168
+v 0.153177 0.340658 0.282938
+v 0.314203 0.406397 0.217199
+v 0.290095 0.392410 0.231186
+v 0.264749 0.379564 0.244032
+v 0.396226 0.472532 0.151064
+v 0.378060 0.454610 0.168986
+v 0.358279 0.437563 0.186033
+v 0.451248 0.551426 0.072170
+v 0.440260 0.530789 0.092807
+v 0.427393 0.510703 0.112893
+v 0.475517 0.637700 -0.014105
+v 0.472457 0.615756 0.007840
+v 0.467380 0.594000 0.029596
+v 0.467380 0.725477 -0.101881
+v 0.472457 0.703720 -0.080125
+v 0.475517 0.681776 -0.058181
+v 0.427393 0.808773 -0.185178
+v 0.440260 0.788687 -0.165092
+v 0.451248 0.768051 -0.144455
+v 0.358279 0.881913 -0.258318
+v 0.378060 0.864866 -0.241271
+v 0.396226 0.846944 -0.223349
+v 0.264749 0.939913 -0.316317
+v 0.290095 0.927067 -0.303471
+v 0.314203 0.913080 -0.289484
+v 0.153177 0.978818 -0.355223
+v 0.182362 0.971049 -0.347453
+v 0.210767 0.961951 -0.338355
+v 0.031166 0.995979 -0.372384
+v 0.062200 0.993816 -0.370220
+v 0.092968 0.990226 -0.366631
+v -0.092968 0.990226 -0.366630
+v -0.062200 0.993816 -0.370220
+v -0.031167 0.995979 -0.372384
+v -0.210768 0.961951 -0.338355
+v -0.182362 0.971049 -0.347453
+v -0.153177 0.978818 -0.355223
+v -0.314203 0.913080 -0.289484
+v -0.290096 0.927067 -0.303471
+v -0.264749 0.939913 -0.316317
+v -0.396227 0.846944 -0.223349
+v -0.378060 0.864867 -0.241271
+v -0.358279 0.881913 -0.258318
+v -0.451248 0.768051 -0.144455
+v -0.440260 0.788687 -0.165092
+v -0.427393 0.808773 -0.185178
+v -0.475517 0.681776 -0.058180
+v -0.472457 0.703720 -0.080125
+v -0.467381 0.725477 -0.101881
+v -0.467381 0.594000 0.029596
+v -0.472457 0.615756 0.007840
+v -0.475517 0.637700 -0.014104
+v -0.438684 0.552003 0.162067
+v -0.451891 0.572620 0.141450
+v -0.463169 0.593801 0.120269
+v -0.367745 0.476931 0.237139
+v -0.388048 0.494428 0.219642
+v -0.406694 0.512824 0.201247
+v -0.271744 0.417399 0.296671
+v -0.297759 0.430584 0.283486
+v -0.322504 0.444941 0.269129
+v -0.157224 0.377465 0.336605
+v -0.187179 0.385440 0.328630
+v -0.216336 0.394779 0.319291
+v -0.031990 0.359851 0.354219
+v -0.063843 0.362072 0.351998
+v -0.095424 0.365756 0.348314
+v 0.095424 0.365756 0.348314
+v 0.063843 0.362072 0.351998
+v 0.031990 0.359851 0.354219
+v 0.216336 0.394779 0.319291
+v 0.187179 0.385440 0.328630
+v 0.157224 0.377465 0.336605
+v 0.322504 0.444941 0.269129
+v 0.297759 0.430584 0.283486
+v 0.271744 0.417399 0.296671
+v 0.406694 0.512823 0.201246
+v 0.388048 0.494428 0.219642
+v 0.367745 0.476930 0.237139
+v 0.463169 0.593801 0.120269
+v 0.451891 0.572620 0.141450
+v 0.438684 0.552003 0.162067
+v 0.488080 0.682355 0.031715
+v 0.484939 0.659831 0.054239
+v 0.479728 0.637500 0.076570
+v 0.479728 0.772451 -0.058381
+v 0.484939 0.750119 -0.036050
+v 0.488080 0.727596 -0.013526
+v 0.438684 0.857948 -0.143878
+v 0.451891 0.837331 -0.123261
+v 0.463169 0.816150 -0.102080
+v 0.367745 0.933020 -0.218950
+v 0.388048 0.915523 -0.201453
+v 0.406694 0.897127 -0.183057
+v 0.271744 0.992552 -0.278482
+v 0.297760 0.979367 -0.265297
+v 0.322504 0.965010 -0.250940
+v 0.157224 1.032485 -0.318416
+v 0.187179 1.024511 -0.310441
+v 0.216336 1.015172 -0.301102
+v 0.031990 1.050100 -0.336030
+v 0.063843 1.047879 -0.333809
+v 0.095424 1.044194 -0.330125
+v -0.095425 1.044194 -0.330125
+v -0.063843 1.047879 -0.333809
+v -0.031990 1.050100 -0.336030
+v -0.216336 1.015172 -0.301102
+v -0.187180 1.024511 -0.310441
+v -0.157224 1.032485 -0.318416
+v -0.322504 0.965010 -0.250940
+v -0.297760 0.979367 -0.265297
+v -0.271744 0.992552 -0.278482
+v -0.406695 0.897127 -0.183057
+v -0.388048 0.915523 -0.201453
+v -0.367745 0.933020 -0.218950
+v -0.463169 0.816150 -0.102080
+v -0.451891 0.837331 -0.123261
+v -0.438684 0.857948 -0.143878
+v -0.488080 0.727596 -0.013526
+v -0.484939 0.750119 -0.036049
+v -0.479728 0.772451 -0.058381
+v -0.479728 0.637500 0.076570
+v -0.484939 0.659831 0.054239
+v -0.488080 0.682355 0.031715
+v -0.442470 0.596708 0.209412
+v -0.455790 0.617502 0.188617
+v -0.467166 0.638866 0.167253
+v -0.370918 0.520987 0.285132
+v -0.391396 0.538636 0.267484
+v -0.410204 0.557190 0.248929
+v -0.274089 0.460942 0.345177
+v -0.300329 0.474241 0.331878
+v -0.325287 0.488722 0.317398
+v -0.158581 0.420664 0.385455
+v -0.188795 0.428708 0.377412
+v -0.218203 0.438127 0.367993
+v -0.032266 0.402898 0.403222
+v -0.064394 0.405138 0.400982
+v -0.096248 0.408854 0.397265
+v 0.096248 0.408854 0.397265
+v 0.064394 0.405138 0.400982
+v 0.032266 0.402898 0.403222
+v 0.218203 0.438127 0.367993
+v 0.188795 0.428708 0.377412
+v 0.158581 0.420664 0.385455
+v 0.325287 0.488721 0.317398
+v 0.300329 0.474241 0.331878
+v 0.274089 0.460942 0.345177
+v 0.410204 0.557190 0.248929
+v 0.391396 0.538635 0.267484
+v 0.370918 0.520987 0.285132
+v 0.467166 0.638866 0.167253
+v 0.455790 0.617502 0.188617
+v 0.442470 0.596708 0.209412
+v 0.492291 0.728185 0.077935
+v 0.489123 0.705466 0.100653
+v 0.483868 0.682942 0.123177
+v 0.483868 0.819058 -0.012938
+v 0.489123 0.796534 0.009585
+v 0.492291 0.773816 0.032304
+v 0.442470 0.905293 -0.099173
+v 0.455791 0.884498 -0.078379
+v 0.467166 0.863134 -0.057014
+v 0.370918 0.981013 -0.174894
+v 0.391396 0.963365 -0.157245
+v 0.410204 0.944810 -0.138691
+v 0.274089 1.041058 -0.234939
+v 0.300329 1.027759 -0.221640
+v 0.325287 1.013278 -0.207159
+v 0.158581 1.081336 -0.275217
+v 0.188795 1.073293 -0.267173
+v 0.218203 1.063873 -0.257754
+v 0.032266 1.099102 -0.292983
+v 0.064394 1.096862 -0.290743
+v 0.096248 1.093146 -0.287027
+v -0.096248 1.093146 -0.287027
+v -0.064394 1.096862 -0.290743
+v -0.032266 1.099102 -0.292983
+v -0.218203 1.063873 -0.257754
+v -0.188795 1.073292 -0.267173
+v -0.158581 1.081336 -0.275217
+v -0.325287 1.013279 -0.207159
+v -0.300329 1.027759 -0.221640
+v -0.274089 1.041058 -0.234939
+v -0.410204 0.944810 -0.138691
+v -0.391396 0.963365 -0.157245
+v -0.370918 0.981013 -0.174894
+v -0.467166 0.863134 -0.057014
+v -0.455791 0.884498 -0.078379
+v -0.442470 0.905293 -0.099173
+v -0.492291 0.773816 0.032304
+v -0.489124 0.796534 0.009586
+v -0.483868 0.819058 -0.012938
+v -0.483868 0.682943 0.123177
+v -0.489123 0.705466 0.100653
+v -0.492291 0.728185 0.077935
+v -0.438684 0.644052 0.254116
+v -0.451891 0.664669 0.233500
+v -0.463169 0.685851 0.212318
+v -0.367745 0.568980 0.329189
+v -0.388048 0.586477 0.311692
+v -0.406694 0.604873 0.293296
+v -0.271744 0.509448 0.388720
+v -0.297759 0.522634 0.375535
+v -0.322504 0.536990 0.361179
+v -0.157224 0.469515 0.428654
+v -0.187179 0.477490 0.420679
+v -0.216336 0.486828 0.411340
+v -0.031990 0.451900 0.446268
+v -0.063843 0.454121 0.444047
+v -0.095424 0.457806 0.440363
+v 0.095424 0.457806 0.440363
+v 0.063843 0.454121 0.444047
+v 0.031990 0.451900 0.446268
+v 0.216336 0.486828 0.411341
+v 0.187179 0.477489 0.420679
+v 0.157224 0.469515 0.428654
+v 0.322504 0.536990 0.361179
+v 0.297759 0.522634 0.375535
+v 0.271744 0.509448 0.388720
+v 0.406695 0.604873 0.293296
+v 0.388048 0.586477 0.311692
+v 0.367745 0.568980 0.329189
+v 0.463169 0.685850 0.212318
+v 0.451891 0.664669 0.233500
+v 0.438684 0.644052 0.254116
+v 0.488080 0.774404 0.123764
+v 0.484939 0.751881 0.146288
+v 0.479728 0.729549 0.168619
+v 0.479728 0.864500 0.033668
+v 0.484939 0.842169 0.056000
+v 0.488080 0.819645 0.078524
+v 0.438684 0.949997 -0.051829
+v 0.451891 0.929380 -0.031212
+v 0.463169 0.908199 -0.010030
+v 0.367745 1.025069 -0.126901
+v 0.388048 1.007572 -0.109404
+v 0.406694 0.989177 -0.091008
+v 0.271744 1.084601 -0.186433
+v 0.297760 1.071416 -0.173247
+v 0.322504 1.057060 -0.158891
+v 0.157224 1.124535 -0.226366
+v 0.187179 1.116560 -0.218392
+v 0.216336 1.107221 -0.209053
+v 0.031990 1.142149 -0.243981
+v 0.063843 1.139928 -0.241760
+v 0.095424 1.136244 -0.238075
+v -0.095425 1.136244 -0.238075
+v -0.063843 1.139928 -0.241760
+v -0.031990 1.142149 -0.243981
+v -0.216336 1.107221 -0.209053
+v -0.187180 1.116560 -0.218391
+v -0.157224 1.124535 -0.226366
+v -0.322504 1.057060 -0.158891
+v -0.297760 1.071416 -0.173247
+v -0.271744 1.084601 -0.186433
+v -0.406695 0.989177 -0.091008
+v -0.388048 1.007573 -0.109404
+v -0.367745 1.025070 -0.126901
+v -0.463169 0.908199 -0.010030
+v -0.451891 0.929381 -0.031212
+v -0.438684 0.949997 -0.051829
+v -0.488080 0.819645 0.078524
+v -0.484939 0.842169 0.056000
+v -0.479728 0.864500 0.033669
+v -0.479728 0.729549 0.168619
+v -0.484939 0.751881 0.146288
+v -0.488080 0.774405 0.123764
+v -0.427393 0.693227 0.295416
+v -0.440260 0.713313 0.275330
+v -0.451247 0.733949 0.254694
+v -0.358279 0.620087 0.368556
+v -0.378060 0.637134 0.351509
+v -0.396226 0.655056 0.333587
+v -0.264749 0.562088 0.426555
+v -0.290095 0.574933 0.413710
+v -0.314203 0.588920 0.399723
+v -0.153177 0.523182 0.465461
+v -0.182362 0.530951 0.457692
+v -0.210767 0.540050 0.448593
+v -0.031166 0.506021 0.482622
+v -0.062200 0.508184 0.480458
+v -0.092968 0.511774 0.476869
+v 0.092968 0.511774 0.476869
+v 0.062200 0.508184 0.480458
+v 0.031166 0.506021 0.482622
+v 0.210768 0.540049 0.448593
+v 0.182362 0.530951 0.457692
+v 0.153177 0.523182 0.465461
+v 0.314203 0.588920 0.399723
+v 0.290095 0.574933 0.413710
+v 0.264749 0.562087 0.426555
+v 0.396226 0.655056 0.333587
+v 0.378060 0.637133 0.351509
+v 0.358279 0.620087 0.368556
+v 0.451248 0.733949 0.254694
+v 0.440260 0.713313 0.275330
+v 0.427393 0.693227 0.295416
+v 0.475517 0.820224 0.168419
+v 0.472457 0.798280 0.190363
+v 0.467381 0.776523 0.212119
+v 0.467381 0.908000 0.080642
+v 0.472457 0.886244 0.102399
+v 0.475517 0.864300 0.124343
+v 0.427393 0.991297 -0.002654
+v 0.440260 0.971211 0.017432
+v 0.451248 0.950574 0.038068
+v 0.358279 1.064437 -0.075794
+v 0.378060 1.047390 -0.058748
+v 0.396226 1.029468 -0.040825
+v 0.264749 1.122436 -0.133794
+v 0.290095 1.109590 -0.120948
+v 0.314203 1.095603 -0.106961
+v 0.153177 1.161342 -0.172699
+v 0.182362 1.153573 -0.164930
+v 0.210768 1.144474 -0.155832
+v 0.031166 1.178503 -0.189860
+v 0.062200 1.176339 -0.187697
+v 0.092968 1.172750 -0.184107
+v -0.092968 1.172750 -0.184107
+v -0.062200 1.176339 -0.187697
+v -0.031166 1.178503 -0.189860
+v -0.210768 1.144474 -0.155832
+v -0.182362 1.153573 -0.164930
+v -0.153177 1.161342 -0.172699
+v -0.314203 1.095603 -0.106961
+v -0.290095 1.109590 -0.120948
+v -0.264749 1.122436 -0.133794
+v -0.396227 1.029468 -0.040825
+v -0.378060 1.047390 -0.058747
+v -0.358279 1.064437 -0.075794
+v -0.451248 0.950575 0.038068
+v -0.440260 0.971211 0.017432
+v -0.427393 0.991297 -0.002654
+v -0.475517 0.864300 0.124343
+v -0.472457 0.886244 0.102399
+v -0.467381 0.908000 0.080642
+v -0.467380 0.776523 0.212120
+v -0.472457 0.798280 0.190363
+v -0.475517 0.820224 0.168419
+v -0.408789 0.743390 0.332604
+v -0.421095 0.762601 0.313393
+v -0.431605 0.782340 0.293654
+v -0.342683 0.673433 0.402561
+v -0.361603 0.689738 0.386256
+v -0.378979 0.706880 0.369114
+v -0.253225 0.617959 0.458035
+v -0.277468 0.630246 0.445748
+v -0.300526 0.643624 0.432370
+v -0.146509 0.580747 0.495247
+v -0.174423 0.588178 0.487816
+v -0.201593 0.596880 0.479114
+v -0.029810 0.564333 0.511661
+v -0.059493 0.566402 0.509592
+v -0.088921 0.569836 0.506158
+v 0.088921 0.569836 0.506158
+v 0.059493 0.566402 0.509592
+v 0.029810 0.564333 0.511661
+v 0.201593 0.596880 0.479114
+v 0.174423 0.588178 0.487816
+v 0.146510 0.580747 0.495247
+v 0.300526 0.643624 0.432370
+v 0.277468 0.630246 0.445748
+v 0.253225 0.617959 0.458035
+v 0.378979 0.706880 0.369114
+v 0.361603 0.689738 0.386256
+v 0.342683 0.673433 0.402561
+v 0.431605 0.782340 0.293654
+v 0.421096 0.762601 0.313393
+v 0.408789 0.743390 0.332604
+v 0.454818 0.864859 0.211135
+v 0.451891 0.843870 0.232124
+v 0.447036 0.823060 0.252933
+v 0.447036 0.948814 0.127180
+v 0.451891 0.928005 0.147989
+v 0.454818 0.907016 0.168978
+v 0.408789 1.028485 0.047509
+v 0.421096 1.009273 0.066720
+v 0.431605 0.989535 0.086459
+v 0.342683 1.098441 -0.022448
+v 0.361603 1.082137 -0.006143
+v 0.378979 1.064994 0.010999
+v 0.253225 1.153916 -0.077922
+v 0.277468 1.141629 -0.065635
+v 0.300526 1.128251 -0.052257
+v 0.146510 1.191128 -0.115134
+v 0.174423 1.183697 -0.107703
+v 0.201593 1.174995 -0.099001
+v 0.029810 1.207542 -0.131548
+v 0.059493 1.205473 -0.129479
+v 0.088921 1.202039 -0.126045
+v -0.088922 1.202039 -0.126045
+v -0.059493 1.205473 -0.129479
+v -0.029810 1.207542 -0.131548
+v -0.201593 1.174995 -0.099001
+v -0.174424 1.183697 -0.107703
+v -0.146510 1.191128 -0.115134
+v -0.300526 1.128251 -0.052257
+v -0.277468 1.141629 -0.065635
+v -0.253225 1.153916 -0.077922
+v -0.378979 1.064994 0.010999
+v -0.361603 1.082137 -0.006143
+v -0.342684 1.098441 -0.022448
+v -0.431605 0.989535 0.086459
+v -0.421096 1.009273 0.066721
+v -0.408789 1.028485 0.047509
+v -0.454818 0.907016 0.168978
+v -0.451891 0.928005 0.147989
+v -0.447036 0.948814 0.127180
+v -0.447036 0.823060 0.252934
+v -0.451891 0.843870 0.232124
+v -0.454818 0.864859 0.211135
+v -0.383190 0.793683 0.365045
+v -0.394726 0.811692 0.347036
+v -0.404577 0.830194 0.328534
+v -0.321224 0.728107 0.430620
+v -0.338959 0.743391 0.415336
+v -0.355247 0.759460 0.399268
+v -0.237368 0.676107 0.482621
+v -0.260092 0.687624 0.471103
+v -0.281707 0.700164 0.458563
+v -0.137335 0.641225 0.517503
+v -0.163501 0.648191 0.510537
+v -0.188969 0.656348 0.502380
+v -0.027943 0.625839 0.532889
+v -0.055767 0.627779 0.530949
+v -0.083353 0.630997 0.527731
+v 0.083353 0.630997 0.527731
+v 0.055767 0.627779 0.530949
+v 0.027943 0.625839 0.532889
+v 0.188969 0.656348 0.502380
+v 0.163501 0.648191 0.510537
+v 0.137335 0.641225 0.517503
+v 0.281707 0.700164 0.458563
+v 0.260092 0.687624 0.471104
+v 0.237368 0.676107 0.482621
+v 0.355247 0.759460 0.399268
+v 0.338959 0.743391 0.415336
+v 0.321224 0.728107 0.430620
+v 0.404577 0.830194 0.328534
+v 0.394726 0.811692 0.347036
+v 0.383190 0.793683 0.365044
+v 0.426337 0.907545 0.251182
+v 0.423593 0.887871 0.270857
+v 0.419042 0.868365 0.290363
+v 0.419042 0.986244 0.172484
+v 0.423593 0.966737 0.191990
+v 0.426337 0.947063 0.211665
+v 0.383190 1.060925 0.097802
+v 0.394726 1.042917 0.115811
+v 0.404577 1.024415 0.134313
+v 0.321224 1.126501 0.032226
+v 0.338959 1.111217 0.047510
+v 0.355247 1.095148 0.063579
+v 0.237368 1.178502 -0.019774
+v 0.260092 1.166984 -0.008257
+v 0.281707 1.154444 0.004283
+v 0.137335 1.213384 -0.054656
+v 0.163501 1.206418 -0.047690
+v 0.188969 1.198260 -0.039533
+v 0.027943 1.228770 -0.070042
+v 0.055767 1.226830 -0.068103
+v 0.083353 1.223612 -0.064884
+v -0.083353 1.223612 -0.064884
+v -0.055767 1.226830 -0.068102
+v -0.027943 1.228770 -0.070042
+v -0.188969 1.198261 -0.039533
+v -0.163501 1.206418 -0.047690
+v -0.137335 1.213384 -0.054656
+v -0.281707 1.154444 0.004283
+v -0.260092 1.166984 -0.008257
+v -0.237368 1.178502 -0.019774
+v -0.355247 1.095148 0.063579
+v -0.338959 1.111217 0.047510
+v -0.321224 1.126501 0.032226
+v -0.404578 1.024415 0.134313
+v -0.394726 1.042917 0.115811
+v -0.383190 1.060925 0.097802
+v -0.426337 0.947063 0.211665
+v -0.423593 0.966737 0.191990
+v -0.419042 0.986244 0.172484
+v -0.419042 0.868365 0.290363
+v -0.423593 0.887871 0.270857
+v -0.426337 0.907546 0.251182
+v -0.351035 0.843246 0.392182
+v -0.361603 0.859743 0.375684
+v -0.370627 0.876693 0.358735
+v -0.294269 0.783173 0.452255
+v -0.310515 0.797174 0.438254
+v -0.325436 0.811895 0.423533
+v -0.217449 0.735536 0.499892
+v -0.238267 0.746087 0.489341
+v -0.258068 0.757575 0.477853
+v -0.125811 0.703581 0.531847
+v -0.149781 0.709963 0.525465
+v -0.173112 0.717435 0.517993
+v -0.025598 0.689486 0.545942
+v -0.051087 0.691263 0.544165
+v -0.076359 0.694212 0.541216
+v 0.076359 0.694212 0.541216
+v 0.051087 0.691263 0.544165
+v 0.025598 0.689486 0.545942
+v 0.173112 0.717435 0.517993
+v 0.149781 0.709963 0.525465
+v 0.125811 0.703581 0.531847
+v 0.258068 0.757575 0.477853
+v 0.238267 0.746087 0.489341
+v 0.217449 0.735536 0.499892
+v 0.325437 0.811895 0.423533
+v 0.310515 0.797174 0.438254
+v 0.294269 0.783173 0.452255
+v 0.370628 0.876693 0.358735
+v 0.361603 0.859743 0.375684
+v 0.351035 0.843246 0.392182
+v 0.390561 0.947554 0.287874
+v 0.388048 0.929530 0.305898
+v 0.383878 0.911661 0.323767
+v 0.383878 1.019648 0.215780
+v 0.388048 1.001779 0.233649
+v 0.390561 0.983755 0.251673
+v 0.351035 1.088063 0.147365
+v 0.361603 1.071565 0.163862
+v 0.370628 1.054616 0.180812
+v 0.294269 1.148136 0.087292
+v 0.310515 1.134134 0.101293
+v 0.325437 1.119414 0.116014
+v 0.217449 1.195773 0.039655
+v 0.238267 1.185222 0.050206
+v 0.258068 1.173734 0.061694
+v 0.125811 1.227728 0.007700
+v 0.149781 1.221346 0.014082
+v 0.173112 1.213873 0.021554
+v 0.025598 1.241823 -0.006395
+v 0.051087 1.240045 -0.004618
+v 0.076359 1.237097 -0.001669
+v -0.076359 1.237097 -0.001669
+v -0.051087 1.240045 -0.004618
+v -0.025598 1.241823 -0.006395
+v -0.173112 1.213873 0.021554
+v -0.149781 1.221346 0.014082
+v -0.125811 1.227728 0.007700
+v -0.258068 1.173734 0.061694
+v -0.238267 1.185222 0.050206
+v -0.217449 1.195773 0.039655
+v -0.325437 1.119414 0.116014
+v -0.310516 1.134135 0.101293
+v -0.294269 1.148136 0.087292
+v -0.370628 1.054616 0.180812
+v -0.361603 1.071565 0.163862
+v -0.351035 1.088063 0.147365
+v -0.390561 0.983755 0.251673
+v -0.388048 1.001779 0.233649
+v -0.383878 1.019648 0.215780
+v -0.383878 0.911661 0.323767
+v -0.388048 0.929530 0.305898
+v -0.390561 0.947554 0.287874
+v -0.312873 0.891230 0.413552
+v -0.322292 0.905935 0.398848
+v -0.330336 0.921041 0.383741
+v -0.262278 0.837688 0.467094
+v -0.276759 0.850167 0.454615
+v -0.290058 0.863287 0.441495
+v -0.193810 0.795230 0.509553
+v -0.212364 0.804634 0.500149
+v -0.230013 0.814873 0.489910
+v -0.112134 0.766749 0.538034
+v -0.133498 0.772437 0.532346
+v -0.154292 0.779097 0.525686
+v -0.022815 0.754186 0.550596
+v -0.045534 0.755770 0.549013
+v -0.068058 0.758398 0.546385
+v 0.068058 0.758398 0.546385
+v 0.045534 0.755770 0.549013
+v 0.022815 0.754186 0.550596
+v 0.154293 0.779097 0.525686
+v 0.133498 0.772437 0.532346
+v 0.112134 0.766749 0.538034
+v 0.230013 0.814873 0.489910
+v 0.212365 0.804634 0.500149
+v 0.193810 0.795230 0.509553
+v 0.290058 0.863287 0.441495
+v 0.276759 0.850167 0.454615
+v 0.262279 0.837688 0.467094
+v 0.330336 0.921041 0.383741
+v 0.322293 0.905934 0.398848
+v 0.312873 0.891230 0.413552
+v 0.348103 0.984199 0.320584
+v 0.345863 0.968135 0.336648
+v 0.342146 0.952208 0.352575
+v 0.342146 1.048456 0.256327
+v 0.345863 1.032529 0.272254
+v 0.348103 1.016465 0.288318
+v 0.312873 1.109433 0.195349
+v 0.322293 1.094729 0.210053
+v 0.330336 1.079622 0.225160
+v 0.262279 1.162975 0.141807
+v 0.276759 1.150496 0.154286
+v 0.290058 1.137376 0.167406
+v 0.193810 1.205433 0.099349
+v 0.212365 1.196030 0.108753
+v 0.230013 1.185791 0.118992
+v 0.112134 1.233914 0.070868
+v 0.133498 1.228227 0.076555
+v 0.154293 1.221566 0.083216
+v 0.022815 1.246477 0.058305
+v 0.045534 1.244893 0.059889
+v 0.068058 1.242266 0.062517
+v -0.068058 1.242266 0.062517
+v -0.045534 1.244893 0.059889
+v -0.022815 1.246477 0.058305
+v -0.154293 1.221566 0.083216
+v -0.133498 1.228227 0.076556
+v -0.112134 1.233915 0.070868
+v -0.230013 1.185791 0.118992
+v -0.212365 1.196030 0.108753
+v -0.193810 1.205433 0.099349
+v -0.290058 1.137376 0.167406
+v -0.276759 1.150496 0.154286
+v -0.262279 1.162975 0.141807
+v -0.330336 1.079622 0.225160
+v -0.322293 1.094729 0.210054
+v -0.312873 1.109433 0.195350
+v -0.348103 1.016465 0.288318
+v -0.345863 1.032529 0.272254
+v -0.342146 1.048456 0.256327
+v -0.342146 0.952208 0.352575
+v -0.345863 0.968135 0.336648
+v -0.348103 0.984199 0.320584
+v -0.269358 0.936816 0.428789
+v -0.277468 0.949475 0.416130
+v -0.284392 0.962480 0.403125
+v -0.225800 0.890720 0.474885
+v -0.238267 0.901464 0.464141
+v -0.249716 0.912759 0.452846
+v -0.166855 0.854167 0.511438
+v -0.182829 0.862263 0.503342
+v -0.198022 0.871078 0.494527
+v -0.096538 0.829647 0.535958
+v -0.114931 0.834544 0.531061
+v -0.132833 0.840278 0.525327
+v -0.019642 0.818832 0.546773
+v -0.039201 0.820195 0.545410
+v -0.058592 0.822458 0.543147
+v 0.058592 0.822458 0.543147
+v 0.039201 0.820195 0.545410
+v 0.019642 0.818832 0.546773
+v 0.132833 0.840278 0.525327
+v 0.114931 0.834544 0.531061
+v 0.096538 0.829647 0.535958
+v 0.198022 0.871078 0.494527
+v 0.182829 0.862263 0.503342
+v 0.166855 0.854167 0.511438
+v 0.249716 0.912759 0.452846
+v 0.238267 0.901464 0.464141
+v 0.225801 0.890720 0.474885
+v 0.284393 0.962480 0.403125
+v 0.277468 0.949475 0.416130
+v 0.269359 0.936816 0.428789
+v 0.299688 1.016854 0.348751
+v 0.297760 1.003024 0.362581
+v 0.294560 0.989312 0.376293
+v 0.294560 1.072174 0.293431
+v 0.297760 1.058462 0.307143
+v 0.299688 1.044632 0.320973
+v 0.269359 1.124670 0.240935
+v 0.277468 1.112011 0.253594
+v 0.284393 1.099005 0.266599
+v 0.225801 1.170766 0.194839
+v 0.238267 1.160022 0.205583
+v 0.249716 1.148727 0.216878
+v 0.166855 1.207319 0.158286
+v 0.182829 1.199223 0.166382
+v 0.198022 1.190408 0.175197
+v 0.096538 1.231839 0.133766
+v 0.114931 1.226942 0.138663
+v 0.132833 1.221208 0.144397
+v 0.019642 1.242654 0.122951
+v 0.039201 1.241291 0.124314
+v 0.058592 1.239028 0.126577
+v -0.058592 1.239028 0.126577
+v -0.039201 1.241291 0.124314
+v -0.019642 1.242654 0.122951
+v -0.132833 1.221208 0.144397
+v -0.114931 1.226942 0.138663
+v -0.096538 1.231839 0.133766
+v -0.198022 1.190408 0.175197
+v -0.182829 1.199223 0.166382
+v -0.166855 1.207319 0.158286
+v -0.249716 1.148727 0.216878
+v -0.238267 1.160022 0.205583
+v -0.225801 1.170766 0.194839
+v -0.284393 1.099005 0.266599
+v -0.277468 1.112011 0.253594
+v -0.269359 1.124670 0.240935
+v -0.299688 1.044632 0.320973
+v -0.297760 1.058462 0.307143
+v -0.294560 1.072174 0.293431
+v -0.294560 0.989312 0.376293
+v -0.297759 1.003024 0.362581
+v -0.299688 1.016854 0.348751
+v -0.221235 0.979221 0.437633
+v -0.227895 0.989619 0.427236
+v -0.233583 1.000301 0.416554
+v -0.185459 0.941361 0.475493
+v -0.195698 0.950186 0.466669
+v -0.205102 0.959463 0.457392
+v -0.137044 0.911339 0.505516
+v -0.150164 0.917988 0.498866
+v -0.162643 0.925229 0.491626
+v -0.079290 0.891200 0.525655
+v -0.094397 0.895221 0.521633
+v -0.109101 0.899931 0.516923
+v -0.016133 0.882317 0.534538
+v -0.032197 0.883437 0.533418
+v -0.048124 0.885295 0.531560
+v 0.048124 0.885295 0.531560
+v 0.032197 0.883437 0.533418
+v 0.016133 0.882317 0.534538
+v 0.109101 0.899931 0.516923
+v 0.094397 0.895221 0.521633
+v 0.079290 0.891200 0.525655
+v 0.162644 0.925229 0.491626
+v 0.150164 0.917988 0.498866
+v 0.137044 0.911339 0.505516
+v 0.205102 0.959463 0.457392
+v 0.195698 0.950186 0.466669
+v 0.185459 0.941361 0.475493
+v 0.233583 1.000301 0.416554
+v 0.227895 0.989619 0.427236
+v 0.221235 0.979221 0.437633
+v 0.246146 1.044960 0.371894
+v 0.244562 1.033601 0.383254
+v 0.241934 1.022339 0.394516
+v 0.241934 1.090397 0.326458
+v 0.244562 1.079134 0.337720
+v 0.246146 1.067775 0.349079
+v 0.221235 1.133514 0.283340
+v 0.227895 1.123117 0.293738
+v 0.233583 1.112435 0.304420
+v 0.185459 1.171374 0.245480
+v 0.195698 1.162550 0.254304
+v 0.205102 1.153273 0.263582
+v 0.137044 1.201397 0.215458
+v 0.150164 1.194747 0.222107
+v 0.162644 1.187507 0.229347
+v 0.079290 1.221536 0.195319
+v 0.094397 1.217514 0.199340
+v 0.109101 1.212804 0.204050
+v 0.016133 1.230419 0.186436
+v 0.032197 1.229299 0.187555
+v 0.048124 1.227441 0.189414
+v -0.048124 1.227441 0.189414
+v -0.032197 1.229299 0.187555
+v -0.016133 1.230419 0.186436
+v -0.109101 1.212804 0.204050
+v -0.094397 1.217514 0.199340
+v -0.079290 1.221536 0.195319
+v -0.162644 1.187507 0.229347
+v -0.150164 1.194747 0.222107
+v -0.137044 1.201397 0.215458
+v -0.205102 1.153273 0.263582
+v -0.195698 1.162550 0.254305
+v -0.185459 1.171374 0.245480
+v -0.233583 1.112435 0.304420
+v -0.227895 1.123117 0.293738
+v -0.221235 1.133514 0.283341
+v -0.246146 1.067775 0.349079
+v -0.244562 1.079135 0.337720
+v -0.241934 1.090397 0.326458
+v -0.241934 1.022339 0.394516
+v -0.244562 1.033601 0.383254
+v -0.246146 1.044960 0.371895
+v -0.169326 1.017722 0.439932
+v -0.174423 1.025680 0.431974
+v -0.178777 1.033856 0.423798
+v -0.141944 0.988745 0.468909
+v -0.149781 0.995499 0.462155
+v -0.156978 1.002600 0.455055
+v -0.104889 0.965767 0.491887
+v -0.114931 0.970857 0.486798
+v -0.124482 0.976398 0.481256
+v -0.060686 0.950353 0.507301
+v -0.072249 0.953432 0.504223
+v -0.083502 0.957036 0.500618
+v -0.012348 0.943555 0.514100
+v -0.024643 0.944412 0.513242
+v -0.036832 0.945834 0.511820
+v 0.036833 0.945834 0.511820
+v 0.024643 0.944412 0.513242
+v 0.012348 0.943555 0.514100
+v 0.083503 0.957036 0.500618
+v 0.072249 0.953432 0.504223
+v 0.060686 0.950353 0.507301
+v 0.124482 0.976398 0.481256
+v 0.114931 0.970857 0.486798
+v 0.104889 0.965767 0.491887
+v 0.156978 1.002600 0.455054
+v 0.149781 0.995499 0.462155
+v 0.141944 0.988745 0.468909
+v 0.178777 1.033856 0.423798
+v 0.174424 1.025680 0.431974
+v 0.169326 1.017722 0.439932
+v 0.188392 1.068036 0.389618
+v 0.187180 1.059343 0.398312
+v 0.185168 1.050723 0.406931
+v 0.185168 1.102812 0.354842
+v 0.187180 1.094193 0.363462
+v 0.188392 1.085499 0.372156
+v 0.169326 1.135813 0.321841
+v 0.174424 1.127855 0.329799
+v 0.178777 1.119679 0.337975
+v 0.141944 1.164790 0.292865
+v 0.149781 1.158036 0.299618
+v 0.156978 1.150935 0.306719
+v 0.104889 1.187768 0.269886
+v 0.114931 1.182678 0.274976
+v 0.124482 1.177137 0.280517
+v 0.060686 1.203182 0.254472
+v 0.072249 1.200104 0.257551
+v 0.083503 1.196499 0.261155
+v 0.012348 1.209981 0.247674
+v 0.024643 1.209123 0.248531
+v 0.036833 1.207701 0.249953
+v -0.036832 1.207701 0.249953
+v -0.024643 1.209123 0.248531
+v -0.012348 1.209981 0.247674
+v -0.083502 1.196499 0.261155
+v -0.072249 1.200104 0.257551
+v -0.060686 1.203182 0.254472
+v -0.124482 1.177137 0.280517
+v -0.114931 1.182678 0.274976
+v -0.104889 1.187768 0.269886
+v -0.156978 1.150935 0.306719
+v -0.149781 1.158036 0.299618
+v -0.141944 1.164790 0.292865
+v -0.178777 1.119679 0.337975
+v -0.174423 1.127855 0.329799
+v -0.169326 1.135813 0.321841
+v -0.188392 1.085499 0.372156
+v -0.187179 1.094193 0.363462
+v -0.185168 1.102812 0.354842
+v -0.185168 1.050723 0.406931
+v -0.187179 1.059343 0.398312
+v -0.188392 1.068036 0.389618
+v -0.114520 1.051660 0.435646
+v -0.117967 1.057042 0.430264
+v -0.120911 1.062571 0.424735
+v -0.096001 1.032062 0.455244
+v -0.101301 1.036630 0.450677
+v -0.106168 1.041432 0.445874
+v -0.070939 1.016521 0.470785
+v -0.077731 1.019963 0.467343
+v -0.084190 1.023711 0.463595
+v -0.041044 1.006096 0.481210
+v -0.048864 1.008178 0.479128
+v -0.056475 1.010616 0.476690
+v -0.008351 1.001498 0.485808
+v -0.016666 1.002078 0.485228
+v -0.024911 1.003039 0.484266
+v 0.024911 1.003039 0.484266
+v 0.016667 1.002078 0.485228
+v 0.008351 1.001498 0.485808
+v 0.056475 1.010616 0.476690
+v 0.048864 1.008178 0.479128
+v 0.041044 1.006096 0.481210
+v 0.084191 1.023711 0.463595
+v 0.077731 1.019963 0.467343
+v 0.070939 1.016521 0.470785
+v 0.106169 1.041432 0.445874
+v 0.101301 1.036630 0.450677
+v 0.096001 1.032062 0.455244
+v 0.120911 1.062571 0.424735
+v 0.117967 1.057042 0.430264
+v 0.114520 1.051660 0.435646
+v 0.127414 1.085688 0.401618
+v 0.126595 1.079808 0.407497
+v 0.125234 1.073979 0.413327
+v 0.125234 1.109208 0.378098
+v 0.126595 1.103378 0.383928
+v 0.127414 1.097499 0.389807
+v 0.114520 1.131527 0.355779
+v 0.117967 1.126145 0.361161
+v 0.120911 1.120616 0.366690
+v 0.096001 1.151125 0.336181
+v 0.101301 1.146557 0.340748
+v 0.106169 1.141755 0.345551
+v 0.070939 1.166666 0.320640
+v 0.077731 1.163224 0.324082
+v 0.084191 1.159476 0.327830
+v 0.041044 1.177091 0.310215
+v 0.048864 1.175009 0.312297
+v 0.056475 1.172571 0.314735
+v 0.008351 1.181689 0.305617
+v 0.016667 1.181109 0.306197
+v 0.024911 1.180147 0.307159
+v -0.024911 1.180147 0.307159
+v -0.016666 1.181109 0.306197
+v -0.008351 1.181689 0.305617
+v -0.056475 1.172571 0.314735
+v -0.048864 1.175009 0.312297
+v -0.041044 1.177091 0.310215
+v -0.084190 1.159476 0.327830
+v -0.077731 1.163224 0.324082
+v -0.070939 1.166666 0.320640
+v -0.106169 1.141755 0.345551
+v -0.101301 1.146557 0.340748
+v -0.096001 1.151125 0.336181
+v -0.120911 1.120616 0.366690
+v -0.117967 1.126145 0.361161
+v -0.114520 1.131527 0.355779
+v -0.127414 1.097499 0.389807
+v -0.126594 1.103378 0.383928
+v -0.125234 1.109208 0.378098
+v -0.125234 1.073979 0.413327
+v -0.126594 1.079808 0.407497
+v -0.127414 1.085688 0.401618
+v -0.060034 1.079583 0.425483
+v -0.062210 1.082233 0.422794
+v -0.063341 1.085228 0.419838
+v -0.050342 1.069308 0.435758
+v -0.053421 1.071468 0.433558
+v -0.055602 1.074156 0.430911
+v -0.037219 1.061157 0.443909
+v -0.040991 1.062679 0.442347
+v -0.044075 1.064876 0.440190
+v -0.021560 1.055685 0.449381
+v -0.025768 1.056465 0.448562
+v -0.029544 1.058023 0.447043
+v -0.004431 1.053265 0.451801
+v -0.008789 1.053247 0.451779
+v -0.012999 1.054063 0.451003
+v 0.012999 1.054063 0.451003
+v 0.008789 1.053247 0.451779
+v 0.004432 1.053265 0.451801
+v 0.029544 1.058023 0.447043
+v 0.025768 1.056464 0.448562
+v 0.021560 1.055685 0.449381
+v 0.044075 1.064876 0.440190
+v 0.040992 1.062679 0.442347
+v 0.037219 1.061157 0.443909
+v 0.055603 1.074156 0.430910
+v 0.053421 1.071468 0.433558
+v 0.050342 1.069308 0.435758
+v 0.063341 1.085228 0.419838
+v 0.062210 1.082233 0.422794
+v 0.060034 1.079583 0.425483
+v 0.066763 1.097340 0.407726
+v 0.066760 1.094239 0.410788
+v 0.065635 1.091282 0.413784
+v 0.065635 1.109665 0.395401
+v 0.066760 1.106669 0.398358
+v 0.066763 1.103607 0.401459
+v 0.060034 1.121364 0.383702
+v 0.062210 1.118675 0.386352
+v 0.063341 1.115719 0.389347
+v 0.050342 1.131639 0.373427
+v 0.053421 1.129439 0.375587
+v 0.055603 1.126791 0.378275
+v 0.037219 1.139790 0.365276
+v 0.040992 1.138228 0.366798
+v 0.044075 1.136071 0.368995
+v 0.021560 1.145262 0.359804
+v 0.025768 1.144443 0.360584
+v 0.029544 1.142924 0.362142
+v 0.004432 1.147682 0.357384
+v 0.008789 1.147660 0.357367
+v 0.012999 1.146884 0.358182
+v -0.012999 1.146884 0.358182
+v -0.008789 1.147660 0.357367
+v -0.004431 1.147682 0.357384
+v -0.029544 1.142924 0.362142
+v -0.025768 1.144443 0.360584
+v -0.021560 1.145262 0.359804
+v -0.044075 1.136071 0.368995
+v -0.040991 1.138228 0.366798
+v -0.037219 1.139790 0.365276
+v -0.055603 1.126791 0.378275
+v -0.053421 1.129439 0.375587
+v -0.050342 1.131639 0.373427
+v -0.063341 1.115719 0.389347
+v -0.062210 1.118675 0.386352
+v -0.060034 1.121364 0.383702
+v -0.066763 1.103607 0.401459
+v -0.066760 1.106669 0.398358
+v -0.065635 1.109665 0.395401
+v -0.065635 1.091282 0.413784
+v -0.066760 1.094239 0.410788
+v -0.066763 1.097340 0.407726
+v -0.108212 0.387101 -0.267775
+v -0.093171 0.387524 -0.273050
+v -0.078433 0.388280 -0.277879
+v -0.070322 0.374433 -0.264031
+v -0.083534 0.371075 -0.256601
+v -0.097020 0.367995 -0.248669
+v -0.057417 0.362541 -0.252139
+v -0.068206 0.356949 -0.242475
+v -0.079216 0.351589 -0.232263
+v -0.040600 0.353416 -0.243015
+v -0.048229 0.346110 -0.231636
+v -0.056014 0.339000 -0.219674
+v -0.021016 0.347680 -0.237279
+v -0.024965 0.339296 -0.224822
+v -0.028995 0.331086 -0.211760
+v -0.000000 0.345724 -0.235322
+v -0.000000 0.336972 -0.222498
+v -0.000000 0.328387 -0.209061
+v 0.021016 0.347680 -0.237279
+v 0.024965 0.339296 -0.224822
+v 0.028995 0.331086 -0.211760
+v 0.040600 0.353416 -0.243015
+v 0.048229 0.346110 -0.231636
+v 0.056014 0.339000 -0.219674
+v 0.057417 0.362541 -0.252140
+v 0.068205 0.356949 -0.242475
+v 0.079216 0.351589 -0.232263
+v 0.070321 0.374433 -0.264031
+v 0.083534 0.371075 -0.256601
+v 0.097020 0.367995 -0.248669
+v 0.078433 0.388280 -0.277879
+v 0.093170 0.387524 -0.273051
+v 0.108211 0.387101 -0.267775
+v 0.081200 0.403141 -0.292740
+v 0.096457 0.405177 -0.290703
+v 0.112029 0.407603 -0.288277
+v 0.078433 0.418002 -0.307600
+v 0.093170 0.422830 -0.308356
+v 0.108211 0.428106 -0.308780
+v 0.070321 0.431850 -0.321448
+v 0.083534 0.439280 -0.324806
+v 0.097020 0.447211 -0.327886
+v 0.057417 0.443741 -0.333340
+v 0.068205 0.453406 -0.338932
+v 0.079216 0.463618 -0.344292
+v 0.040600 0.452866 -0.342464
+v 0.048229 0.464245 -0.349771
+v 0.056014 0.476207 -0.356881
+v 0.021016 0.458602 -0.348200
+v 0.024965 0.471059 -0.356585
+v 0.028995 0.484120 -0.364794
+v -0.000000 0.460558 -0.350157
+v -0.000000 0.473383 -0.358909
+v -0.000000 0.486820 -0.367494
+v -0.021016 0.458602 -0.348200
+v -0.024965 0.471059 -0.356585
+v -0.028995 0.484120 -0.364795
+v -0.040600 0.452866 -0.342464
+v -0.048229 0.464245 -0.349771
+v -0.056014 0.476207 -0.356881
+v -0.057417 0.443741 -0.333340
+v -0.068206 0.453406 -0.338932
+v -0.079216 0.463618 -0.344292
+v -0.070322 0.431850 -0.321448
+v -0.083534 0.439280 -0.324806
+v -0.097020 0.447211 -0.327886
+v -0.078433 0.418002 -0.307600
+v -0.093171 0.422830 -0.308356
+v -0.108212 0.428106 -0.308780
+v -0.081200 0.403141 -0.292740
+v -0.096457 0.405177 -0.290703
+v -0.112029 0.407603 -0.288277
+v -0.167862 0.389188 -0.243084
+v -0.153179 0.388082 -0.249753
+v -0.138333 0.387366 -0.256096
+v -0.124026 0.362942 -0.231672
+v -0.137337 0.361038 -0.222708
+v -0.150501 0.359550 -0.213447
+v -0.101267 0.341969 -0.210699
+v -0.112135 0.337814 -0.199484
+v -0.122884 0.334100 -0.187997
+v -0.071606 0.325876 -0.194606
+v -0.079292 0.319993 -0.181664
+v -0.086892 0.314572 -0.168468
+v -0.037066 0.315759 -0.184489
+v -0.041044 0.308791 -0.170461
+v -0.044979 0.302296 -0.156192
+v -0.000000 0.312309 -0.181039
+v -0.000000 0.304970 -0.166640
+v -0.000000 0.298109 -0.152005
+v 0.037066 0.315759 -0.184489
+v 0.041044 0.308791 -0.170461
+v 0.044978 0.302296 -0.156192
+v 0.071606 0.325876 -0.194606
+v 0.079291 0.319993 -0.181664
+v 0.086892 0.314572 -0.168468
+v 0.101267 0.341969 -0.210699
+v 0.112135 0.337814 -0.199484
+v 0.122884 0.334100 -0.187997
+v 0.124026 0.362942 -0.231672
+v 0.137337 0.361038 -0.222708
+v 0.150501 0.359550 -0.213447
+v 0.138333 0.387365 -0.256096
+v 0.153179 0.388082 -0.249753
+v 0.167862 0.389188 -0.243084
+v 0.143213 0.413575 -0.282305
+v 0.158583 0.417105 -0.278776
+v 0.173784 0.420992 -0.274889
+v 0.138333 0.439785 -0.308515
+v 0.153179 0.446128 -0.307798
+v 0.167862 0.452797 -0.306693
+v 0.124026 0.464209 -0.332939
+v 0.137337 0.473173 -0.334843
+v 0.150501 0.482434 -0.336330
+v 0.101267 0.485182 -0.353912
+v 0.112135 0.496397 -0.358067
+v 0.122884 0.507884 -0.361780
+v 0.071606 0.501275 -0.370005
+v 0.079291 0.514217 -0.375888
+v 0.086892 0.527412 -0.381309
+v 0.037066 0.511391 -0.380122
+v 0.041044 0.525419 -0.387090
+v 0.044978 0.539689 -0.393585
+v -0.000000 0.514842 -0.383572
+v -0.000000 0.529240 -0.390911
+v -0.000000 0.543876 -0.397772
+v -0.037066 0.511391 -0.380122
+v -0.041044 0.525419 -0.387090
+v -0.044979 0.539689 -0.393585
+v -0.071606 0.501275 -0.370005
+v -0.079292 0.514217 -0.375888
+v -0.086892 0.527412 -0.381309
+v -0.101267 0.485182 -0.353912
+v -0.112135 0.496397 -0.358067
+v -0.122884 0.507884 -0.361780
+v -0.124026 0.464209 -0.332939
+v -0.137337 0.473173 -0.334843
+v -0.150501 0.482434 -0.336330
+v -0.138333 0.439785 -0.308515
+v -0.153180 0.446128 -0.307798
+v -0.167862 0.452797 -0.306693
+v -0.143213 0.413575 -0.282305
+v -0.158583 0.417105 -0.278776
+v -0.173784 0.420992 -0.274889
+v -0.224641 0.397465 -0.213291
+v -0.210769 0.394822 -0.221191
+v -0.196672 0.392559 -0.228795
+v -0.176332 0.357835 -0.194071
+v -0.188970 0.357609 -0.183978
+v -0.201407 0.357803 -0.173629
+v -0.143974 0.328017 -0.164253
+v -0.154294 0.325654 -0.152023
+v -0.164448 0.323745 -0.139571
+v -0.101805 0.305137 -0.141373
+v -0.109102 0.301133 -0.127503
+v -0.116282 0.297611 -0.113437
+v -0.052698 0.290754 -0.126990
+v -0.056475 0.285719 -0.112089
+v -0.060192 0.281183 -0.097008
+v -0.000000 0.285848 -0.122084
+v -0.000000 0.280462 -0.106831
+v -0.000000 0.275579 -0.091405
+v 0.052698 0.290754 -0.126990
+v 0.056475 0.285719 -0.112089
+v 0.060192 0.281183 -0.097008
+v 0.101805 0.305137 -0.141373
+v 0.109102 0.301133 -0.127503
+v 0.116282 0.297611 -0.113437
+v 0.143974 0.328017 -0.164253
+v 0.154294 0.325654 -0.152023
+v 0.164448 0.323745 -0.139571
+v 0.176332 0.357835 -0.194071
+v 0.188970 0.357609 -0.183978
+v 0.201407 0.357803 -0.173629
+v 0.196672 0.392559 -0.228795
+v 0.210769 0.394822 -0.221191
+v 0.224640 0.397465 -0.213291
+v 0.203610 0.429822 -0.266059
+v 0.218204 0.434756 -0.261125
+v 0.232565 0.440028 -0.255853
+v 0.196672 0.467085 -0.303322
+v 0.210769 0.474690 -0.301059
+v 0.224640 0.482590 -0.298415
+v 0.176332 0.501809 -0.338046
+v 0.188970 0.511903 -0.338272
+v 0.201407 0.522252 -0.338077
+v 0.143974 0.531627 -0.367864
+v 0.154294 0.543858 -0.370227
+v 0.164448 0.556310 -0.372136
+v 0.101805 0.554507 -0.390744
+v 0.109102 0.568378 -0.394747
+v 0.116282 0.582444 -0.398270
+v 0.052698 0.568891 -0.405127
+v 0.056475 0.583792 -0.410161
+v 0.060192 0.598872 -0.414698
+v -0.000000 0.573796 -0.410033
+v -0.000000 0.589049 -0.415419
+v -0.000000 0.604476 -0.420301
+v -0.052698 0.568891 -0.405127
+v -0.056476 0.583792 -0.410161
+v -0.060192 0.598872 -0.414698
+v -0.101805 0.554507 -0.390744
+v -0.109102 0.568378 -0.394747
+v -0.116283 0.582444 -0.398270
+v -0.143974 0.531627 -0.367864
+v -0.154294 0.543858 -0.370227
+v -0.164448 0.556310 -0.372136
+v -0.176332 0.501809 -0.338046
+v -0.188971 0.511903 -0.338272
+v -0.201407 0.522252 -0.338077
+v -0.196672 0.467085 -0.303322
+v -0.210769 0.474690 -0.301059
+v -0.224641 0.482590 -0.298415
+v -0.203610 0.429822 -0.266059
+v -0.218204 0.434756 -0.261125
+v -0.232565 0.440028 -0.255853
+v -0.277575 0.411792 -0.178905
+v -0.264753 0.407655 -0.187901
+v -0.251647 0.403885 -0.196637
+v -0.225620 0.359456 -0.152207
+v -0.237371 0.360911 -0.141157
+v -0.248867 0.362784 -0.129897
+v -0.184218 0.321303 -0.114054
+v -0.193812 0.320771 -0.101017
+v -0.203199 0.320700 -0.087813
+v -0.130262 0.292027 -0.084779
+v -0.137046 0.289971 -0.070217
+v -0.143684 0.288408 -0.055521
+v -0.067429 0.273624 -0.066375
+v -0.070940 0.270609 -0.050855
+v -0.074376 0.268109 -0.035222
+v -0.000000 0.267346 -0.060098
+v -0.000000 0.264005 -0.044251
+v -0.000000 0.261185 -0.028298
+v 0.067428 0.273624 -0.066375
+v 0.070940 0.270609 -0.050855
+v 0.074376 0.268109 -0.035222
+v 0.130262 0.292027 -0.084779
+v 0.137046 0.289971 -0.070217
+v 0.143683 0.288408 -0.055521
+v 0.184218 0.321303 -0.114054
+v 0.193812 0.320771 -0.101017
+v 0.203199 0.320700 -0.087813
+v 0.225620 0.359455 -0.152207
+v 0.237371 0.360911 -0.141157
+v 0.248867 0.362784 -0.129897
+v 0.251647 0.403885 -0.196637
+v 0.264753 0.407655 -0.187901
+v 0.277575 0.411792 -0.178905
+v 0.260524 0.451565 -0.244316
+v 0.274092 0.457817 -0.238063
+v 0.287367 0.464384 -0.231497
+v 0.251647 0.499244 -0.291995
+v 0.264753 0.507980 -0.288226
+v 0.277575 0.516976 -0.284089
+v 0.225620 0.543674 -0.336425
+v 0.237371 0.554724 -0.334970
+v 0.248867 0.565983 -0.333097
+v 0.184218 0.581827 -0.374578
+v 0.193812 0.594863 -0.375109
+v 0.203199 0.608067 -0.375181
+v 0.130262 0.611102 -0.403854
+v 0.137046 0.625664 -0.405910
+v 0.143683 0.640360 -0.407473
+v 0.067428 0.629506 -0.422257
+v 0.070940 0.645026 -0.425272
+v 0.074376 0.660659 -0.427772
+v -0.000000 0.635783 -0.428534
+v -0.000000 0.651630 -0.431876
+v -0.000000 0.667583 -0.434696
+v -0.067429 0.629506 -0.422257
+v -0.070940 0.645026 -0.425272
+v -0.074376 0.660659 -0.427772
+v -0.130262 0.611102 -0.403854
+v -0.137046 0.625664 -0.405910
+v -0.143684 0.640360 -0.407473
+v -0.184218 0.581827 -0.374578
+v -0.193812 0.594863 -0.375109
+v -0.203199 0.608067 -0.375180
+v -0.225620 0.543674 -0.336425
+v -0.237371 0.554724 -0.334970
+v -0.248867 0.565983 -0.333097
+v -0.251647 0.499244 -0.291995
+v -0.264753 0.507980 -0.288226
+v -0.277575 0.516976 -0.284089
+v -0.260524 0.451565 -0.244316
+v -0.274092 0.457817 -0.238063
+v -0.287367 0.464384 -0.231497
+v -0.325761 0.431923 -0.140515
+v -0.314206 0.426363 -0.150453
+v -0.302315 0.421151 -0.160171
+v -0.271048 0.367775 -0.106795
+v -0.281709 0.370888 -0.094978
+v -0.292069 0.374408 -0.083000
+v -0.221310 0.321941 -0.060960
+v -0.230015 0.323251 -0.047340
+v -0.238473 0.325018 -0.033610
+v -0.156490 0.286770 -0.025790
+v -0.162645 0.286697 -0.010787
+v -0.168626 0.287120 0.004287
+v -0.081005 0.264661 -0.003681
+v -0.084191 0.263718 0.012192
+v -0.087287 0.263297 0.028111
+v -0.000000 0.257120 0.003860
+v -0.000000 0.255881 0.020029
+v -0.000000 0.255171 0.036237
+v 0.081005 0.264661 -0.003681
+v 0.084191 0.263718 0.012192
+v 0.087287 0.263297 0.028111
+v 0.156490 0.286770 -0.025790
+v 0.162645 0.286697 -0.010787
+v 0.168626 0.287120 0.004287
+v 0.221310 0.321940 -0.060960
+v 0.230015 0.323250 -0.047340
+v 0.238473 0.325018 -0.033610
+v 0.271048 0.367775 -0.106795
+v 0.281709 0.370888 -0.094978
+v 0.292069 0.374407 -0.083000
+v 0.302315 0.421151 -0.160171
+v 0.314206 0.426363 -0.150453
+v 0.325761 0.431923 -0.140515
+v 0.312980 0.478430 -0.217450
+v 0.325290 0.485895 -0.209985
+v 0.337252 0.493644 -0.202237
+v 0.302315 0.535710 -0.274730
+v 0.314206 0.545428 -0.269518
+v 0.325761 0.555366 -0.263958
+v 0.271048 0.589085 -0.328105
+v 0.281709 0.600903 -0.324993
+v 0.292069 0.612881 -0.321473
+v 0.221310 0.634920 -0.373940
+v 0.230015 0.648540 -0.372630
+v 0.238473 0.662270 -0.370863
+v 0.156490 0.670090 -0.409111
+v 0.162645 0.685094 -0.409184
+v 0.168626 0.700168 -0.408761
+v 0.081005 0.692199 -0.431220
+v 0.084191 0.708073 -0.432163
+v 0.087287 0.723992 -0.432584
+v -0.000000 0.699741 -0.438761
+v -0.000000 0.715910 -0.440000
+v -0.000000 0.732118 -0.440710
+v -0.081005 0.692200 -0.431220
+v -0.084191 0.708073 -0.432163
+v -0.087287 0.723992 -0.432584
+v -0.156490 0.670091 -0.409111
+v -0.162645 0.685094 -0.409184
+v -0.168626 0.700168 -0.408761
+v -0.221310 0.634920 -0.373940
+v -0.230015 0.648540 -0.372630
+v -0.238473 0.662270 -0.370863
+v -0.271049 0.589085 -0.328105
+v -0.281710 0.600903 -0.324993
+v -0.292069 0.612881 -0.321473
+v -0.302315 0.535710 -0.274730
+v -0.314206 0.545428 -0.269517
+v -0.325761 0.555366 -0.263958
+v -0.312980 0.478430 -0.217450
+v -0.325290 0.485895 -0.209985
+v -0.337252 0.493644 -0.202237
+v -0.368372 0.457513 -0.098778
+v -0.358283 0.450626 -0.109488
+v -0.347811 0.444061 -0.120021
+v -0.311839 0.382652 -0.058613
+v -0.321228 0.387369 -0.046230
+v -0.330273 0.392474 -0.033739
+v -0.254615 0.329920 -0.005881
+v -0.262282 0.333049 0.008090
+v -0.269667 0.336625 0.022111
+v -0.180040 0.289457 0.034583
+v -0.185461 0.291367 0.049771
+v -0.190683 0.293769 0.064966
+v -0.093196 0.264020 0.060019
+v -0.096002 0.265165 0.075973
+v -0.098705 0.266830 0.091906
+v -0.000000 0.255345 0.068695
+v -0.000000 0.256228 0.084910
+v -0.000000 0.257641 0.101094
+v 0.093196 0.264020 0.060019
+v 0.096002 0.265165 0.075973
+v 0.098705 0.266829 0.091906
+v 0.180040 0.289457 0.034583
+v 0.185461 0.291367 0.049771
+v 0.190683 0.293769 0.064966
+v 0.254615 0.329920 -0.005881
+v 0.262282 0.333048 0.008090
+v 0.269667 0.336624 0.022111
+v 0.311839 0.382652 -0.058613
+v 0.321228 0.387369 -0.046230
+v 0.330273 0.392474 -0.033739
+v 0.347811 0.444061 -0.120022
+v 0.358283 0.450626 -0.109488
+v 0.368372 0.457513 -0.098778
+v 0.360080 0.509960 -0.185921
+v 0.370922 0.518510 -0.177371
+v 0.381367 0.527308 -0.168573
+v 0.347811 0.575859 -0.251820
+v 0.358283 0.586393 -0.245255
+v 0.368372 0.597103 -0.238368
+v 0.311839 0.637268 -0.313229
+v 0.321228 0.649650 -0.308512
+v 0.330273 0.662141 -0.303406
+v 0.254615 0.690000 -0.365961
+v 0.262282 0.703971 -0.362832
+v 0.269667 0.717991 -0.359256
+v 0.180040 0.730463 -0.406424
+v 0.185461 0.745652 -0.404514
+v 0.190683 0.760846 -0.402111
+v 0.093196 0.755899 -0.431860
+v 0.096002 0.771854 -0.430716
+v 0.098705 0.787786 -0.429051
+v -0.000000 0.764575 -0.440536
+v -0.000000 0.780791 -0.439653
+v -0.000000 0.796975 -0.438240
+v -0.093196 0.755899 -0.431860
+v -0.096002 0.771854 -0.430716
+v -0.098705 0.787786 -0.429051
+v -0.180040 0.730463 -0.406424
+v -0.185461 0.745652 -0.404514
+v -0.190684 0.760846 -0.402111
+v -0.254616 0.690000 -0.365961
+v -0.262282 0.703971 -0.362832
+v -0.269667 0.717991 -0.359256
+v -0.311839 0.637268 -0.313229
+v -0.321228 0.649650 -0.308512
+v -0.330274 0.662141 -0.303406
+v -0.347811 0.575859 -0.251820
+v -0.358283 0.586393 -0.245255
+v -0.368372 0.597103 -0.238368
+v -0.360081 0.509960 -0.185921
+v -0.370922 0.518510 -0.177371
+v -0.381367 0.527308 -0.168573
+v -0.404681 0.488125 -0.054407
+v -0.396230 0.480028 -0.065706
+v -0.387356 0.472222 -0.076875
+v -0.347294 0.403832 -0.008485
+v -0.355250 0.410071 0.004251
+v -0.362827 0.416676 0.017042
+v -0.283564 0.345104 0.050243
+v -0.290061 0.349998 0.064325
+v -0.296247 0.355321 0.078397
+v -0.200510 0.300040 0.095307
+v -0.205104 0.303902 0.110421
+v -0.209478 0.308242 0.125476
+v -0.103792 0.271712 0.123635
+v -0.106170 0.274925 0.139398
+v -0.108434 0.278647 0.155071
+v -0.000000 0.262050 0.133297
+v -0.000000 0.265041 0.149282
+v -0.000000 0.268552 0.165165
+v 0.103792 0.271712 0.123635
+v 0.106170 0.274925 0.139398
+v 0.108434 0.278647 0.155071
+v 0.200510 0.300040 0.095307
+v 0.205104 0.303902 0.110421
+v 0.209478 0.308242 0.125476
+v 0.283564 0.345104 0.050243
+v 0.290061 0.349998 0.064325
+v 0.296247 0.355321 0.078397
+v 0.347294 0.403832 -0.008485
+v 0.355250 0.410071 0.004251
+v 0.362827 0.416676 0.017042
+v 0.387356 0.472222 -0.076875
+v 0.396230 0.480028 -0.065706
+v 0.404681 0.488125 -0.054407
+v 0.401020 0.545614 -0.150267
+v 0.410208 0.555102 -0.140779
+v 0.418956 0.564799 -0.131082
+v 0.387356 0.619006 -0.223659
+v 0.396230 0.630175 -0.215852
+v 0.404681 0.641473 -0.207756
+v 0.347294 0.687396 -0.292049
+v 0.355250 0.700132 -0.285810
+v 0.362827 0.712923 -0.279205
+v 0.283564 0.746124 -0.350777
+v 0.290061 0.760205 -0.345883
+v 0.296247 0.774277 -0.340560
+v 0.200510 0.791187 -0.395841
+v 0.205104 0.806302 -0.391979
+v 0.209478 0.821356 -0.387639
+v 0.103792 0.819516 -0.424169
+v 0.106170 0.835279 -0.420956
+v 0.108434 0.850952 -0.417234
+v -0.000000 0.829178 -0.433831
+v -0.000000 0.845162 -0.430840
+v -0.000000 0.861046 -0.427329
+v -0.103792 0.819516 -0.424169
+v -0.106170 0.835279 -0.420956
+v -0.108434 0.850952 -0.417234
+v -0.200510 0.791187 -0.395841
+v -0.205104 0.806302 -0.391979
+v -0.209478 0.821356 -0.387639
+v -0.283564 0.746124 -0.350777
+v -0.290061 0.760205 -0.345883
+v -0.296247 0.774277 -0.340560
+v -0.347294 0.687396 -0.292049
+v -0.355251 0.700132 -0.285810
+v -0.362827 0.712923 -0.279205
+v -0.387356 0.619006 -0.223659
+v -0.396230 0.630175 -0.215852
+v -0.404681 0.641473 -0.207756
+v -0.401020 0.545614 -0.150267
+v -0.410208 0.555102 -0.140779
+v -0.418956 0.564799 -0.131082
+v -0.434065 0.523234 -0.008163
+v -0.427398 0.514067 -0.019857
+v -0.420273 0.505153 -0.031470
+v -0.376806 0.430951 0.042732
+v -0.383194 0.438607 0.055603
+v -0.389172 0.446597 0.068474
+v -0.307661 0.367233 0.106450
+v -0.312877 0.373808 0.120402
+v -0.317758 0.380788 0.134284
+v -0.217549 0.318340 0.155343
+v -0.221237 0.324086 0.170124
+v -0.224689 0.330290 0.184782
+v -0.112612 0.287604 0.186079
+v -0.114521 0.292830 0.201381
+v -0.116307 0.298546 0.216526
+v -0.000000 0.277121 0.196562
+v -0.000000 0.282169 0.212042
+v -0.000000 0.287719 0.227353
+v 0.112612 0.287604 0.186079
+v 0.114521 0.292830 0.201381
+v 0.116307 0.298546 0.216526
+v 0.217549 0.318340 0.155343
+v 0.221237 0.324086 0.170124
+v 0.224689 0.330290 0.184782
+v 0.307661 0.367233 0.106450
+v 0.312877 0.373808 0.120402
+v 0.317758 0.380788 0.134284
+v 0.376806 0.430951 0.042731
+v 0.383194 0.438607 0.055603
+v 0.389172 0.446597 0.068474
+v 0.420273 0.505153 -0.031470
+v 0.427398 0.514067 -0.019857
+v 0.434065 0.523234 -0.008163
+v 0.435098 0.584782 -0.111099
+v 0.442475 0.595046 -0.100835
+v 0.449377 0.605476 -0.090405
+v 0.420273 0.664410 -0.190728
+v 0.427398 0.676024 -0.181814
+v 0.434065 0.687718 -0.172646
+v 0.376806 0.738612 -0.264930
+v 0.383194 0.751484 -0.257274
+v 0.389172 0.764355 -0.249283
+v 0.307661 0.802331 -0.328648
+v 0.312877 0.816283 -0.322073
+v 0.317758 0.830165 -0.315093
+v 0.217549 0.851224 -0.377541
+v 0.221237 0.866005 -0.371795
+v 0.224689 0.880662 -0.365591
+v 0.112612 0.881959 -0.408277
+v 0.114521 0.897261 -0.403051
+v 0.116307 0.912407 -0.397335
+v -0.000000 0.892443 -0.418760
+v -0.000000 0.907922 -0.413712
+v -0.000000 0.923234 -0.408162
+v -0.112612 0.881959 -0.408277
+v -0.114521 0.897261 -0.403051
+v -0.116307 0.912407 -0.397335
+v -0.217549 0.851224 -0.377541
+v -0.221237 0.866005 -0.371794
+v -0.224689 0.880663 -0.365591
+v -0.307661 0.802331 -0.328648
+v -0.312877 0.816283 -0.322073
+v -0.317758 0.830165 -0.315093
+v -0.376806 0.738612 -0.264930
+v -0.383194 0.751484 -0.257274
+v -0.389172 0.764355 -0.249283
+v -0.420273 0.664410 -0.190727
+v -0.427398 0.676024 -0.181814
+v -0.434065 0.687718 -0.172646
+v -0.435099 0.584782 -0.111099
+v -0.442475 0.595046 -0.100835
+v -0.449377 0.605476 -0.090404
+v -0.456022 0.562241 0.039165
+v -0.451252 0.552160 0.027275
+v -0.445999 0.542291 0.015416
+v -0.399871 0.463547 0.094160
+v -0.404581 0.472488 0.106947
+v -0.408859 0.481728 0.119678
+v -0.326494 0.395928 0.161779
+v -0.330339 0.404073 0.175362
+v -0.333832 0.412589 0.188817
+v -0.230866 0.344042 0.213665
+v -0.233585 0.351576 0.227859
+v -0.236055 0.359537 0.241869
+v -0.119505 0.311425 0.246282
+v -0.120913 0.318575 0.260861
+v -0.122191 0.326187 0.275219
+v -0.000000 0.300300 0.257407
+v -0.000000 0.307319 0.272117
+v -0.000000 0.314812 0.286594
+v 0.119505 0.311425 0.246282
+v 0.120913 0.318575 0.260861
+v 0.122191 0.326187 0.275219
+v 0.230866 0.344042 0.213665
+v 0.233585 0.351576 0.227859
+v 0.236055 0.359537 0.241869
+v 0.326494 0.395928 0.161779
+v 0.330339 0.404073 0.175362
+v 0.333832 0.412589 0.188817
+v 0.399871 0.463547 0.094160
+v 0.404581 0.472488 0.106947
+v 0.408859 0.481727 0.119678
+v 0.445999 0.542291 0.015416
+v 0.451252 0.552160 0.027275
+v 0.456023 0.562241 0.039164
+v 0.461732 0.626794 -0.069087
+v 0.467170 0.637658 -0.058223
+v 0.472109 0.648643 -0.047238
+v 0.445999 0.711296 -0.153590
+v 0.451252 0.723156 -0.143721
+v 0.456023 0.735045 -0.133640
+v 0.399872 0.790041 -0.232334
+v 0.404581 0.802828 -0.223393
+v 0.408859 0.815559 -0.214153
+v 0.326494 0.857660 -0.299953
+v 0.330339 0.871243 -0.291808
+v 0.333832 0.884698 -0.283292
+v 0.230866 0.909546 -0.351839
+v 0.233585 0.923740 -0.344305
+v 0.236055 0.937750 -0.336344
+v 0.119505 0.942163 -0.384456
+v 0.120913 0.956741 -0.377306
+v 0.122191 0.971100 -0.369694
+v -0.000000 0.953288 -0.395581
+v -0.000000 0.967997 -0.388562
+v -0.000000 0.982475 -0.381069
+v -0.119505 0.942163 -0.384456
+v -0.120913 0.956741 -0.377306
+v -0.122191 0.971100 -0.369694
+v -0.230866 0.909546 -0.351839
+v -0.233585 0.923740 -0.344305
+v -0.236055 0.937750 -0.336344
+v -0.326494 0.857660 -0.299953
+v -0.330340 0.871243 -0.291808
+v -0.333832 0.884698 -0.283292
+v -0.399872 0.790041 -0.232334
+v -0.404582 0.802828 -0.223393
+v -0.408859 0.815559 -0.214153
+v -0.445999 0.711297 -0.153590
+v -0.451252 0.723156 -0.143721
+v -0.456023 0.735045 -0.133639
+v -0.461732 0.626794 -0.069087
+v -0.467171 0.637658 -0.058223
+v -0.472109 0.648643 -0.047237
+v -0.470177 0.604478 0.086765
+v -0.467385 0.593655 0.074884
+v -0.464094 0.583000 0.062982
+v -0.416095 0.501061 0.144920
+v -0.419046 0.511135 0.157404
+v -0.421549 0.521465 0.169778
+v -0.339740 0.430699 0.215283
+v -0.342150 0.440273 0.228265
+v -0.344194 0.450180 0.241063
+v -0.240232 0.376708 0.269274
+v -0.241936 0.385899 0.282639
+v -0.243382 0.395481 0.295761
+v -0.124353 0.342768 0.303214
+v -0.125236 0.351718 0.316820
+v -0.125984 0.361096 0.330146
+v -0.000000 0.331191 0.314790
+v -0.000000 0.340060 0.328479
+v -0.000000 0.349368 0.341875
+v 0.124353 0.342767 0.303214
+v 0.125236 0.351718 0.316820
+v 0.125984 0.361096 0.330146
+v 0.240232 0.376708 0.269274
+v 0.241936 0.385899 0.282639
+v 0.243382 0.395481 0.295761
+v 0.339740 0.430699 0.215283
+v 0.342150 0.440273 0.228265
+v 0.344194 0.450180 0.241063
+v 0.416095 0.501061 0.144920
+v 0.419046 0.511135 0.157404
+v 0.421549 0.521465 0.169778
+v 0.464094 0.583000 0.062981
+v 0.467385 0.593655 0.074884
+v 0.470177 0.604478 0.086765
+v 0.480465 0.670931 -0.024950
+v 0.483873 0.682210 -0.013671
+v 0.486763 0.693562 -0.002319
+v 0.464094 0.758862 -0.112881
+v 0.467385 0.770764 -0.102226
+v 0.470177 0.782646 -0.091403
+v 0.416095 0.840801 -0.194820
+v 0.419046 0.853284 -0.184746
+v 0.421549 0.865659 -0.174416
+v 0.339740 0.911163 -0.265182
+v 0.342150 0.924146 -0.255608
+v 0.344194 0.936943 -0.245701
+v 0.240232 0.965155 -0.319173
+v 0.241937 0.978520 -0.309982
+v 0.243382 0.991642 -0.300400
+v 0.124353 0.999095 -0.353114
+v 0.125236 1.012701 -0.344163
+v 0.125984 1.026027 -0.334785
+v -0.000000 1.010671 -0.364690
+v -0.000000 1.024359 -0.355821
+v -0.000000 1.037755 -0.346513
+v -0.124354 0.999095 -0.353114
+v -0.125236 1.012701 -0.344163
+v -0.125984 1.026027 -0.334785
+v -0.240233 0.965155 -0.319173
+v -0.241937 0.978520 -0.309982
+v -0.243382 0.991642 -0.300400
+v -0.339740 0.911164 -0.265182
+v -0.342150 0.924146 -0.255608
+v -0.344194 0.936943 -0.245701
+v -0.416095 0.840801 -0.194820
+v -0.419047 0.853285 -0.184746
+v -0.421550 0.865659 -0.174416
+v -0.464094 0.758862 -0.112881
+v -0.467386 0.770764 -0.102226
+v -0.470177 0.782646 -0.091403
+v -0.480465 0.670931 -0.024950
+v -0.483873 0.682210 -0.013671
+v -0.486763 0.693562 -0.002319
+v -0.476287 0.649222 0.133824
+v -0.475522 0.637842 0.122154
+v -0.474248 0.626583 0.110413
+v -0.425199 0.542852 0.194144
+v -0.426341 0.553885 0.206111
+v -0.427027 0.565130 0.217915
+v -0.347173 0.470950 0.266046
+v -0.348106 0.481790 0.278206
+v -0.348666 0.492919 0.290127
+v -0.245489 0.415778 0.321218
+v -0.246148 0.426470 0.333526
+v -0.246544 0.437509 0.345536
+v -0.127074 0.381095 0.355901
+v -0.127416 0.391694 0.368302
+v -0.127621 0.402677 0.380368
+v -0.000000 0.369265 0.367731
+v -0.000000 0.379832 0.380164
+v -0.000000 0.390797 0.392249
+v 0.127074 0.381095 0.355901
+v 0.127416 0.391694 0.368302
+v 0.127621 0.402677 0.380368
+v 0.245489 0.415778 0.321218
+v 0.246148 0.426470 0.333526
+v 0.246544 0.437509 0.345536
+v 0.347173 0.470950 0.266046
+v 0.348106 0.481790 0.278206
+v 0.348666 0.492919 0.290127
+v 0.425199 0.542852 0.194144
+v 0.426341 0.553885 0.206111
+v 0.427027 0.565130 0.217915
+v 0.474248 0.626583 0.110413
+v 0.475522 0.637842 0.122154
+v 0.476287 0.649221 0.133824
+v 0.490977 0.716438 0.020558
+v 0.492296 0.727938 0.032057
+v 0.493089 0.739463 0.043582
+v 0.474248 0.806293 -0.069298
+v 0.475522 0.818035 -0.058039
+v 0.476287 0.829704 -0.046659
+v 0.425199 0.890025 -0.153029
+v 0.426341 0.901991 -0.141996
+v 0.427027 0.913796 -0.130751
+v 0.347173 0.961927 -0.224931
+v 0.348106 0.974087 -0.214091
+v 0.348666 0.986007 -0.202962
+v 0.245489 1.017099 -0.280103
+v 0.246148 1.029407 -0.269411
+v 0.246544 1.041417 -0.258372
+v 0.127074 1.051782 -0.314786
+v 0.127416 1.064183 -0.304187
+v 0.127621 1.076249 -0.293204
+v -0.000000 1.063612 -0.326616
+v -0.000000 1.076044 -0.316049
+v -0.000000 1.088129 -0.305084
+v -0.127074 1.051782 -0.314786
+v -0.127416 1.064183 -0.304187
+v -0.127621 1.076249 -0.293204
+v -0.245489 1.017099 -0.280103
+v -0.246148 1.029407 -0.269411
+v -0.246544 1.041417 -0.258372
+v -0.347173 0.961927 -0.224931
+v -0.348106 0.974087 -0.214091
+v -0.348666 0.986007 -0.202962
+v -0.425199 0.890025 -0.153029
+v -0.426341 0.901991 -0.141996
+v -0.427028 0.913796 -0.130751
+v -0.474248 0.806293 -0.069297
+v -0.475522 0.818035 -0.058039
+v -0.476287 0.829705 -0.046659
+v -0.490977 0.716438 0.020558
+v -0.492296 0.727938 0.032058
+v -0.493089 0.739463 0.043582
+v -0.474248 0.695707 0.179536
+v -0.475522 0.683965 0.168277
+v -0.476287 0.672296 0.156898
+v -0.427027 0.588204 0.240989
+v -0.426341 0.600009 0.252234
+v -0.425199 0.611975 0.263268
+v -0.348666 0.515993 0.313201
+v -0.348106 0.527914 0.324329
+v -0.347173 0.540073 0.335169
+v -0.246544 0.460583 0.368610
+v -0.246148 0.472593 0.379650
+v -0.245489 0.484901 0.390342
+v -0.127621 0.425751 0.403442
+v -0.127416 0.437817 0.414426
+v -0.127074 0.450218 0.425025
+v -0.000000 0.413871 0.415323
+v -0.000000 0.425956 0.426287
+v 0.000000 0.438389 0.436854
+v 0.127621 0.425751 0.403442
+v 0.127416 0.437817 0.414426
+v 0.127074 0.450218 0.425025
+v 0.246544 0.460583 0.368610
+v 0.246148 0.472593 0.379650
+v 0.245489 0.484901 0.390342
+v 0.348666 0.515993 0.313201
+v 0.348106 0.527914 0.324329
+v 0.347173 0.540073 0.335169
+v 0.427027 0.588204 0.240989
+v 0.426341 0.600009 0.252234
+v 0.425199 0.611975 0.263268
+v 0.476287 0.672295 0.156898
+v 0.475522 0.683965 0.168277
+v 0.474248 0.695707 0.179536
+v 0.493089 0.762537 0.066656
+v 0.492296 0.774062 0.078181
+v 0.490977 0.785562 0.089681
+v 0.476287 0.852779 -0.023585
+v 0.475522 0.864158 -0.011916
+v 0.474248 0.875417 -0.000174
+v 0.427027 0.936870 -0.107677
+v 0.426341 0.948115 -0.095872
+v 0.425199 0.959148 -0.083906
+v 0.348666 1.009081 -0.179888
+v 0.348106 1.020210 -0.167967
+v 0.347173 1.031050 -0.155808
+v 0.246544 1.064491 -0.235298
+v 0.246148 1.075531 -0.223288
+v 0.245489 1.086223 -0.210980
+v 0.127621 1.099323 -0.270130
+v 0.127416 1.110306 -0.258064
+v 0.127074 1.120905 -0.245663
+v -0.000000 1.111203 -0.282010
+v -0.000000 1.122168 -0.269925
+v -0.000000 1.132735 -0.257493
+v -0.127621 1.099323 -0.270130
+v -0.127416 1.110306 -0.258064
+v -0.127074 1.120905 -0.245663
+v -0.246544 1.064491 -0.235298
+v -0.246148 1.075531 -0.223288
+v -0.245489 1.086223 -0.210980
+v -0.348667 1.009081 -0.179888
+v -0.348106 1.020210 -0.167967
+v -0.347174 1.031050 -0.155808
+v -0.427028 0.936870 -0.107677
+v -0.426341 0.948115 -0.095872
+v -0.425199 0.959148 -0.083906
+v -0.476287 0.852779 -0.023585
+v -0.475522 0.864158 -0.011916
+v -0.474248 0.875417 -0.000174
+v -0.493089 0.762537 0.066656
+v -0.492296 0.774062 0.078181
+v -0.490977 0.785562 0.089681
+v -0.464093 0.743138 0.223119
+v -0.467385 0.731236 0.212465
+v -0.470177 0.719354 0.201641
+v -0.421549 0.636342 0.284654
+v -0.419046 0.648716 0.294985
+v -0.416095 0.661199 0.305058
+v -0.344194 0.565057 0.355939
+v -0.342150 0.577854 0.365846
+v -0.339740 0.590837 0.375421
+v -0.243382 0.510358 0.410638
+v -0.241936 0.523480 0.420220
+v -0.240232 0.536846 0.429412
+v -0.125984 0.475973 0.445023
+v -0.125236 0.489299 0.454401
+v -0.124353 0.502905 0.463352
+v 0.000000 0.464245 0.456751
+v 0.000000 0.477641 0.466060
+v 0.000000 0.491329 0.474928
+v 0.125984 0.475973 0.445023
+v 0.125236 0.489299 0.454401
+v 0.124353 0.502905 0.463352
+v 0.243382 0.510358 0.410638
+v 0.241936 0.523480 0.420220
+v 0.240232 0.536846 0.429412
+v 0.344194 0.565057 0.355939
+v 0.342150 0.577854 0.365846
+v 0.339740 0.590837 0.375421
+v 0.421549 0.636342 0.284654
+v 0.419046 0.648715 0.294985
+v 0.416095 0.661199 0.305058
+v 0.470177 0.719354 0.201641
+v 0.467386 0.731236 0.212465
+v 0.464094 0.743138 0.223119
+v 0.486763 0.808438 0.112557
+v 0.483873 0.819790 0.123910
+v 0.480465 0.831069 0.135188
+v 0.470177 0.897522 0.023474
+v 0.467385 0.908345 0.035355
+v 0.464094 0.919000 0.047257
+v 0.421549 0.980535 -0.059539
+v 0.419046 0.990865 -0.047165
+v 0.416095 1.000939 -0.034682
+v 0.344194 1.051820 -0.130824
+v 0.342150 1.061727 -0.118027
+v 0.339740 1.071301 -0.105044
+v 0.243382 1.106519 -0.185523
+v 0.241936 1.116101 -0.172401
+v 0.240232 1.125293 -0.159035
+v 0.125984 1.140904 -0.219908
+v 0.125236 1.150282 -0.206582
+v 0.124353 1.159233 -0.192976
+v -0.000000 1.152632 -0.231636
+v -0.000000 1.161940 -0.218240
+v -0.000000 1.170809 -0.204552
+v -0.125984 1.140904 -0.219908
+v -0.125236 1.150282 -0.206582
+v -0.124354 1.159233 -0.192976
+v -0.243382 1.106519 -0.185523
+v -0.241937 1.116101 -0.172401
+v -0.240233 1.125293 -0.159035
+v -0.344194 1.051820 -0.130824
+v -0.342150 1.061727 -0.118027
+v -0.339740 1.071302 -0.105044
+v -0.421550 0.980535 -0.059539
+v -0.419047 0.990865 -0.047165
+v -0.416095 1.000939 -0.034682
+v -0.470177 0.897522 0.023474
+v -0.467386 0.908345 0.035355
+v -0.464094 0.919000 0.047257
+v -0.486763 0.808438 0.112558
+v -0.483873 0.819790 0.123910
+v -0.480465 0.831069 0.135188
+v -0.445999 0.790703 0.263828
+v -0.451252 0.778844 0.253959
+v -0.456022 0.766955 0.243878
+v -0.408859 0.686441 0.324392
+v -0.404581 0.699172 0.333631
+v -0.399871 0.711959 0.342572
+v -0.333832 0.617302 0.393531
+v -0.330339 0.630757 0.402047
+v -0.326494 0.644340 0.410191
+v -0.236055 0.564250 0.446583
+v -0.233585 0.578260 0.454544
+v -0.230866 0.592455 0.462077
+v -0.122191 0.530900 0.479933
+v -0.120913 0.545259 0.487545
+v -0.119505 0.559838 0.494694
+v 0.000000 0.519525 0.491308
+v 0.000000 0.534003 0.498801
+v 0.000000 0.548713 0.505819
+v 0.122191 0.530900 0.479932
+v 0.120913 0.545259 0.487545
+v 0.119505 0.559838 0.494694
+v 0.236055 0.564250 0.446583
+v 0.233585 0.578260 0.454544
+v 0.230866 0.592454 0.462077
+v 0.333832 0.617302 0.393531
+v 0.330339 0.630757 0.402047
+v 0.326494 0.644340 0.410191
+v 0.408859 0.686441 0.324392
+v 0.404582 0.699172 0.333631
+v 0.399872 0.711959 0.342572
+v 0.456023 0.766955 0.243878
+v 0.451252 0.778844 0.253959
+v 0.445999 0.790703 0.263828
+v 0.472109 0.853357 0.157476
+v 0.467171 0.864342 0.168461
+v 0.461732 0.875206 0.179325
+v 0.456023 0.939759 0.071074
+v 0.451252 0.949840 0.082963
+v 0.445999 0.959709 0.094823
+v 0.408859 1.020272 -0.009440
+v 0.404582 1.029512 0.003292
+v 0.399872 1.038453 0.016078
+v 0.333832 1.089411 -0.078579
+v 0.330339 1.097927 -0.065124
+v 0.326494 1.106072 -0.051541
+v 0.236055 1.142463 -0.131631
+v 0.233585 1.150424 -0.117621
+v 0.230866 1.157958 -0.103427
+v 0.122191 1.175813 -0.164981
+v 0.120913 1.183425 -0.150622
+v 0.119505 1.190575 -0.136043
+v -0.000000 1.187188 -0.176356
+v -0.000000 1.194682 -0.161878
+v -0.000000 1.201700 -0.147168
+v -0.122191 1.175813 -0.164981
+v -0.120913 1.183425 -0.150622
+v -0.119505 1.190575 -0.136043
+v -0.236055 1.142464 -0.131631
+v -0.233585 1.150424 -0.117621
+v -0.230866 1.157958 -0.103427
+v -0.333832 1.089411 -0.078579
+v -0.330340 1.097927 -0.065124
+v -0.326494 1.106072 -0.051541
+v -0.408859 1.020273 -0.009440
+v -0.404582 1.029512 0.003292
+v -0.399872 1.038453 0.016079
+v -0.456023 0.939759 0.071074
+v -0.451252 0.949840 0.082963
+v -0.445999 0.959709 0.094823
+v -0.472109 0.853357 0.157476
+v -0.467171 0.864342 0.168461
+v -0.461732 0.875206 0.179325
+v -0.420273 0.837590 0.300966
+v -0.427398 0.825976 0.292052
+v -0.434065 0.814282 0.282885
+v -0.389172 0.737645 0.359522
+v -0.383194 0.750516 0.367512
+v -0.376806 0.763388 0.375168
+v -0.317758 0.671835 0.425332
+v -0.312877 0.685717 0.432311
+v -0.307661 0.699669 0.438887
+v -0.224689 0.621338 0.475829
+v -0.221237 0.635995 0.482033
+v -0.217549 0.650776 0.487780
+v -0.116307 0.589594 0.507573
+v -0.114521 0.604739 0.513289
+v -0.112612 0.620041 0.518515
+v 0.000000 0.578766 0.518401
+v 0.000000 0.594078 0.523950
+v 0.000000 0.609557 0.528998
+v 0.116307 0.589594 0.507573
+v 0.114521 0.604739 0.513289
+v 0.112612 0.620041 0.518515
+v 0.224689 0.621338 0.475829
+v 0.221237 0.635995 0.482033
+v 0.217549 0.650776 0.487780
+v 0.317758 0.671835 0.425332
+v 0.312877 0.685717 0.432311
+v 0.307661 0.699669 0.438887
+v 0.389172 0.737645 0.359522
+v 0.383194 0.750516 0.367512
+v 0.376806 0.763388 0.375168
+v 0.434065 0.814282 0.282885
+v 0.427398 0.825976 0.292052
+v 0.420273 0.837590 0.300966
+v 0.449377 0.896524 0.200643
+v 0.442475 0.906954 0.211074
+v 0.435098 0.917218 0.221337
+v 0.434065 0.978766 0.118401
+v 0.427398 0.987933 0.130095
+v 0.420273 0.996847 0.141709
+v 0.389172 1.055403 0.041764
+v 0.383194 1.063393 0.054635
+v 0.376806 1.071049 0.067507
+v 0.317758 1.121212 -0.024046
+v 0.312877 1.128192 -0.010164
+v 0.307661 1.134768 0.003788
+v 0.224689 1.171710 -0.074543
+v 0.221237 1.177914 -0.059886
+v 0.217549 1.183661 -0.045105
+v 0.116307 1.203454 -0.106288
+v 0.114521 1.209170 -0.091142
+v 0.112612 1.214396 -0.075840
+v -0.000000 1.214282 -0.117115
+v -0.000000 1.219831 -0.101803
+v -0.000000 1.224879 -0.086324
+v -0.116307 1.203454 -0.106287
+v -0.114521 1.209170 -0.091142
+v -0.112612 1.214396 -0.075840
+v -0.224689 1.171710 -0.074543
+v -0.221237 1.177914 -0.059886
+v -0.217549 1.183661 -0.045105
+v -0.317758 1.121212 -0.024046
+v -0.312877 1.128192 -0.010164
+v -0.307661 1.134768 0.003788
+v -0.389172 1.055403 0.041764
+v -0.383194 1.063393 0.054635
+v -0.376806 1.071049 0.067507
+v -0.434065 0.978765 0.118401
+v -0.427398 0.987933 0.130095
+v -0.420273 0.996847 0.141709
+v -0.449377 0.896524 0.200643
+v -0.442475 0.906955 0.211074
+v -0.435098 0.917218 0.221338
+v -0.387356 0.882995 0.333897
+v -0.396230 0.871825 0.326091
+v -0.404681 0.860527 0.317994
+v -0.362827 0.789078 0.389444
+v -0.355250 0.801868 0.396048
+v -0.347294 0.814604 0.402288
+v -0.296247 0.727723 0.450798
+v -0.290061 0.741795 0.456122
+v -0.283564 0.755876 0.461016
+v -0.209478 0.680644 0.497877
+v -0.205104 0.695699 0.502218
+v -0.200510 0.710813 0.506079
+v -0.108434 0.651049 0.527473
+v -0.106170 0.666722 0.531195
+v -0.103792 0.682485 0.534407
+v 0.000000 0.640954 0.537567
+v 0.000000 0.656838 0.541078
+v 0.000000 0.672822 0.544070
+v 0.108434 0.651048 0.527473
+v 0.106170 0.666721 0.531195
+v 0.103792 0.682485 0.534407
+v 0.209478 0.680644 0.497877
+v 0.205104 0.695699 0.502218
+v 0.200510 0.710813 0.506079
+v 0.296247 0.727723 0.450798
+v 0.290061 0.741795 0.456122
+v 0.283564 0.755876 0.461016
+v 0.362827 0.789078 0.389444
+v 0.355250 0.801868 0.396048
+v 0.347294 0.814604 0.402288
+v 0.404681 0.860527 0.317994
+v 0.396230 0.871825 0.326091
+v 0.387356 0.882995 0.333897
+v 0.418956 0.937201 0.241320
+v 0.410208 0.946898 0.251018
+v 0.401020 0.956386 0.260505
+v 0.404681 1.013875 0.164646
+v 0.396230 1.021972 0.175944
+v 0.387356 1.029778 0.187114
+v 0.362827 1.085324 0.093197
+v 0.355250 1.091929 0.105987
+v 0.347294 1.098168 0.118723
+v 0.296247 1.146679 0.031842
+v 0.290061 1.152002 0.045914
+v 0.283564 1.156896 0.059995
+v 0.209478 1.193758 -0.015237
+v 0.205104 1.198098 -0.000182
+v 0.200510 1.201960 0.014932
+v 0.108434 1.223353 -0.044832
+v 0.106170 1.227076 -0.029160
+v 0.103792 1.230288 -0.013397
+v -0.000000 1.233448 -0.054927
+v -0.000000 1.236959 -0.039043
+v -0.000000 1.239950 -0.023059
+v -0.108434 1.223353 -0.044832
+v -0.106170 1.227076 -0.029160
+v -0.103792 1.230288 -0.013397
+v -0.209478 1.193758 -0.015237
+v -0.205104 1.198098 -0.000182
+v -0.200510 1.201960 0.014932
+v -0.296247 1.146679 0.031842
+v -0.290061 1.152002 0.045914
+v -0.283564 1.156896 0.059995
+v -0.362827 1.085324 0.093197
+v -0.355250 1.091929 0.105987
+v -0.347294 1.098168 0.118723
+v -0.404681 1.013875 0.164646
+v -0.396230 1.021972 0.175944
+v -0.387356 1.029778 0.187114
+v -0.418956 0.937201 0.241320
+v -0.410208 0.946898 0.251018
+v -0.401020 0.956386 0.260505
+v -0.347811 0.926141 0.362059
+v -0.358283 0.915607 0.355493
+v -0.368372 0.904897 0.348606
+v -0.330273 0.839859 0.413645
+v -0.321228 0.852350 0.418750
+v -0.311839 0.864733 0.423467
+v -0.269667 0.784009 0.469495
+v -0.262282 0.798030 0.473071
+v -0.254615 0.812000 0.476200
+v -0.190683 0.741154 0.512350
+v -0.185461 0.756348 0.514752
+v -0.180040 0.771537 0.516663
+v -0.098705 0.714214 0.539290
+v -0.096002 0.730146 0.540954
+v -0.093196 0.746101 0.542099
+v 0.000000 0.705025 0.548478
+v 0.000000 0.721209 0.549891
+v 0.000000 0.737425 0.550775
+v 0.098705 0.714214 0.539290
+v 0.096002 0.730146 0.540954
+v 0.093196 0.746101 0.542099
+v 0.190684 0.741154 0.512350
+v 0.185461 0.756348 0.514752
+v 0.180040 0.771537 0.516663
+v 0.269667 0.784009 0.469495
+v 0.262282 0.798029 0.473071
+v 0.254615 0.812000 0.476200
+v 0.330274 0.839859 0.413645
+v 0.321228 0.852350 0.418750
+v 0.311839 0.864733 0.423467
+v 0.368372 0.904897 0.348606
+v 0.358283 0.915607 0.355493
+v 0.347811 0.926141 0.362059
+v 0.381367 0.974692 0.278811
+v 0.370922 0.983491 0.287610
+v 0.360081 0.992040 0.296159
+v 0.368372 1.044487 0.209016
+v 0.358283 1.051374 0.219726
+v 0.347811 1.057939 0.230260
+v 0.330274 1.109526 0.143978
+v 0.321228 1.114631 0.156469
+v 0.311839 1.119348 0.168851
+v 0.269667 1.165376 0.088128
+v 0.262282 1.168952 0.102148
+v 0.254615 1.172080 0.116119
+v 0.190684 1.208231 0.045273
+v 0.185461 1.210633 0.060467
+v 0.180040 1.212543 0.075656
+v 0.098705 1.235171 0.018333
+v 0.096002 1.236835 0.034265
+v 0.093196 1.237980 0.050220
+v 0.000000 1.244359 0.009144
+v 0.000000 1.245772 0.025328
+v 0.000000 1.246656 0.041544
+v -0.098705 1.235171 0.018333
+v -0.096002 1.236835 0.034265
+v -0.093196 1.237980 0.050220
+v -0.190684 1.208231 0.045273
+v -0.185461 1.210633 0.060467
+v -0.180040 1.212543 0.075656
+v -0.269667 1.165376 0.088128
+v -0.262282 1.168952 0.102149
+v -0.254615 1.172080 0.116119
+v -0.330274 1.109526 0.143978
+v -0.321228 1.114631 0.156469
+v -0.311839 1.119348 0.168852
+v -0.368372 1.044487 0.209016
+v -0.358283 1.051374 0.219726
+v -0.347811 1.057939 0.230260
+v -0.381367 0.974692 0.278811
+v -0.370922 0.983490 0.287610
+v -0.360081 0.992040 0.296159
+v -0.302315 0.966290 0.384968
+v -0.314206 0.956572 0.379756
+v -0.325761 0.946635 0.374196
+v -0.292069 0.889119 0.431712
+v -0.281709 0.901097 0.435231
+v -0.271048 0.912915 0.438344
+v -0.238473 0.839730 0.481101
+v -0.230015 0.853460 0.482869
+v -0.221310 0.867080 0.484179
+v -0.168626 0.801832 0.518999
+v -0.162645 0.816906 0.519422
+v -0.156490 0.831910 0.519349
+v -0.087287 0.778008 0.542823
+v -0.084191 0.793928 0.542401
+v -0.081005 0.809801 0.541458
+v 0.000000 0.769883 0.550948
+v 0.000000 0.786090 0.550238
+v 0.000000 0.802260 0.548999
+v 0.087287 0.778008 0.542823
+v 0.084191 0.793927 0.542401
+v 0.081005 0.809801 0.541458
+v 0.168626 0.801832 0.518999
+v 0.162645 0.816906 0.519422
+v 0.156490 0.831910 0.519349
+v 0.238473 0.839730 0.481101
+v 0.230015 0.853460 0.482869
+v 0.221310 0.867080 0.484179
+v 0.292069 0.889119 0.431712
+v 0.281709 0.901097 0.435231
+v 0.271048 0.912915 0.438344
+v 0.325761 0.946634 0.374196
+v 0.314206 0.956572 0.379756
+v 0.302315 0.966290 0.384968
+v 0.337252 1.008356 0.312475
+v 0.325290 1.016105 0.320224
+v 0.312980 1.023570 0.327689
+v 0.325761 1.070077 0.250754
+v 0.314206 1.075637 0.260691
+v 0.302315 1.080849 0.270409
+v 0.292069 1.127593 0.193238
+v 0.281709 1.131112 0.205216
+v 0.271048 1.134225 0.217034
+v 0.238473 1.176982 0.143849
+v 0.230015 1.178750 0.157579
+v 0.221310 1.180059 0.171199
+v 0.168626 1.214880 0.105951
+v 0.162645 1.215303 0.121025
+v 0.156490 1.215230 0.136029
+v 0.087287 1.238703 0.082127
+v 0.084191 1.238282 0.098046
+v 0.081005 1.237339 0.113920
+v 0.000000 1.246829 0.074002
+v 0.000000 1.246119 0.090209
+v 0.000000 1.244880 0.106379
+v -0.087287 1.238703 0.082127
+v -0.084191 1.238282 0.098046
+v -0.081005 1.237339 0.113920
+v -0.168626 1.214880 0.105951
+v -0.162645 1.215303 0.121025
+v -0.156490 1.215230 0.136029
+v -0.238473 1.176982 0.143849
+v -0.230015 1.178750 0.157579
+v -0.221310 1.180060 0.171199
+v -0.292069 1.127593 0.193238
+v -0.281709 1.131112 0.205216
+v -0.271048 1.134225 0.217034
+v -0.325761 1.070077 0.250754
+v -0.314206 1.075637 0.260692
+v -0.302315 1.080849 0.270410
+v -0.337252 1.008356 0.312475
+v -0.325290 1.016105 0.320224
+v -0.312980 1.023570 0.327689
+v -0.251647 1.002756 0.402234
+v -0.264753 0.994020 0.398464
+v -0.277575 0.985024 0.394327
+v -0.248867 0.936017 0.443335
+v -0.237371 0.947277 0.445208
+v -0.225620 0.958326 0.446664
+v -0.203199 0.893933 0.485419
+v -0.193812 0.907137 0.485348
+v -0.184218 0.920174 0.484816
+v -0.143683 0.861641 0.517711
+v -0.137046 0.876336 0.516148
+v -0.130262 0.890898 0.514092
+v -0.074376 0.841341 0.538011
+v -0.070940 0.856974 0.535510
+v -0.067428 0.872495 0.532496
+v 0.000000 0.834417 0.544935
+v 0.000000 0.850371 0.542114
+v 0.000000 0.866217 0.538773
+v 0.074376 0.841341 0.538011
+v 0.070940 0.856974 0.535510
+v 0.067429 0.872495 0.532496
+v 0.143684 0.861641 0.517711
+v 0.137046 0.876336 0.516148
+v 0.130262 0.890898 0.514092
+v 0.203199 0.893933 0.485419
+v 0.193812 0.907137 0.485348
+v 0.184218 0.920174 0.484816
+v 0.248867 0.936017 0.443335
+v 0.237371 0.947276 0.445208
+v 0.225620 0.958326 0.446664
+v 0.277575 0.985024 0.394327
+v 0.264753 0.994020 0.398464
+v 0.251647 1.002756 0.402234
+v 0.287367 1.037616 0.341735
+v 0.274092 1.044183 0.348302
+v 0.260524 1.050435 0.354555
+v 0.277575 1.090208 0.289143
+v 0.264753 1.094345 0.298139
+v 0.251647 1.098114 0.306875
+v 0.248867 1.139216 0.240136
+v 0.237371 1.141089 0.251396
+v 0.225620 1.142545 0.262445
+v 0.203199 1.181300 0.198052
+v 0.193812 1.181229 0.211256
+v 0.184218 1.180697 0.224293
+v 0.143684 1.213592 0.165760
+v 0.137046 1.212029 0.180455
+v 0.130262 1.209973 0.195017
+v 0.074376 1.233891 0.145460
+v 0.070940 1.231391 0.161093
+v 0.067429 1.228377 0.176613
+v 0.000000 1.240815 0.138536
+v 0.000000 1.237995 0.154489
+v 0.000000 1.234653 0.170336
+v -0.074376 1.233891 0.145460
+v -0.070940 1.231391 0.161093
+v -0.067429 1.228377 0.176613
+v -0.143684 1.213592 0.165760
+v -0.137046 1.212029 0.180455
+v -0.130262 1.209973 0.195017
+v -0.203199 1.181300 0.198052
+v -0.193812 1.181229 0.211256
+v -0.184218 1.180697 0.224293
+v -0.248867 1.139216 0.240136
+v -0.237371 1.141089 0.251396
+v -0.225620 1.142545 0.262446
+v -0.277575 1.090208 0.289144
+v -0.264753 1.094345 0.298140
+v -0.251647 1.098115 0.306875
+v -0.287367 1.037616 0.341735
+v -0.274092 1.044183 0.348302
+v -0.260524 1.050435 0.354555
+v -0.196672 1.034915 0.413560
+v -0.210769 1.027310 0.411298
+v -0.224640 1.019410 0.408654
+v -0.201407 0.979748 0.448316
+v -0.188970 0.990097 0.448510
+v -0.176332 1.000191 0.448284
+v -0.164448 0.945690 0.482374
+v -0.154294 0.958142 0.480466
+v -0.143974 0.970373 0.478102
+v -0.116282 0.919556 0.508508
+v -0.109102 0.933622 0.504986
+v -0.101805 0.947493 0.500982
+v -0.060192 0.903128 0.524936
+v -0.056475 0.918208 0.520400
+v -0.052698 0.933110 0.515365
+v 0.000000 0.897524 0.530540
+v 0.000000 0.912951 0.525657
+v 0.000000 0.928204 0.520271
+v 0.060192 0.903128 0.524936
+v 0.056475 0.918208 0.520400
+v 0.052698 0.933110 0.515365
+v 0.116283 0.919556 0.508508
+v 0.109102 0.933622 0.504986
+v 0.101805 0.947493 0.500982
+v 0.164448 0.945690 0.482374
+v 0.154294 0.958142 0.480466
+v 0.143974 0.970373 0.478102
+v 0.201407 0.979748 0.448316
+v 0.188971 0.990097 0.448510
+v 0.176332 1.000191 0.448284
+v 0.224641 1.019410 0.408654
+v 0.210769 1.027310 0.411298
+v 0.196672 1.034915 0.413560
+v 0.232565 1.061972 0.366092
+v 0.218204 1.067244 0.371363
+v 0.203610 1.072178 0.376297
+v 0.224641 1.104535 0.323529
+v 0.210769 1.107178 0.331429
+v 0.196672 1.109441 0.339034
+v 0.201407 1.144197 0.283867
+v 0.188971 1.144391 0.294217
+v 0.176332 1.144165 0.304310
+v 0.164448 1.178255 0.249809
+v 0.154294 1.176346 0.262261
+v 0.143974 1.173983 0.274492
+v 0.116283 1.204389 0.223675
+v 0.109102 1.200867 0.237741
+v 0.101805 1.196863 0.251612
+v 0.060192 1.220817 0.207247
+v 0.056475 1.216281 0.222327
+v 0.052698 1.211246 0.237229
+v 0.000000 1.226421 0.201643
+v 0.000000 1.221538 0.217070
+v 0.000000 1.216152 0.232323
+v -0.060192 1.220817 0.207247
+v -0.056475 1.216281 0.222327
+v -0.052698 1.211246 0.237229
+v -0.116282 1.204389 0.223675
+v -0.109102 1.200867 0.237741
+v -0.101805 1.196863 0.251612
+v -0.164448 1.178255 0.249809
+v -0.154294 1.176346 0.262261
+v -0.143974 1.173983 0.274492
+v -0.201407 1.144197 0.283867
+v -0.188970 1.144391 0.294217
+v -0.176332 1.144165 0.304310
+v -0.224641 1.104535 0.323529
+v -0.210769 1.107179 0.331429
+v -0.196672 1.109441 0.339034
+v -0.232565 1.061972 0.366092
+v -0.218204 1.067244 0.371363
+v -0.203610 1.072178 0.376297
+v -0.138333 1.062215 0.418754
+v -0.153179 1.055872 0.418037
+v -0.167862 1.049203 0.416932
+v -0.150501 1.019566 0.446569
+v -0.137337 1.028828 0.445082
+v -0.124026 1.037791 0.443177
+v -0.122883 0.994116 0.472019
+v -0.112135 1.005604 0.468306
+v -0.101267 1.016818 0.464150
+v -0.086892 0.974588 0.491547
+v -0.079291 0.987783 0.486126
+v -0.071606 1.000725 0.480243
+v -0.044978 0.962312 0.503823
+v -0.041044 0.976581 0.497328
+v -0.037066 0.990609 0.490360
+v 0.000000 0.958124 0.508011
+v 0.000000 0.972760 0.501149
+v 0.000000 0.987158 0.493811
+v 0.044979 0.962312 0.503823
+v 0.041044 0.976581 0.497328
+v 0.037066 0.990609 0.490360
+v 0.086892 0.974588 0.491547
+v 0.079292 0.987783 0.486126
+v 0.071606 1.000725 0.480243
+v 0.122884 0.994116 0.472019
+v 0.112135 1.005604 0.468306
+v 0.101267 1.016818 0.464150
+v 0.150501 1.019566 0.446569
+v 0.137337 1.028827 0.445082
+v 0.124026 1.037791 0.443177
+v 0.167862 1.049203 0.416932
+v 0.153179 1.055872 0.418037
+v 0.138333 1.062215 0.418754
+v 0.173784 1.081008 0.385127
+v 0.158583 1.084895 0.389014
+v 0.143213 1.088425 0.392544
+v 0.167862 1.112813 0.353322
+v 0.153179 1.113918 0.359991
+v 0.138333 1.114635 0.366334
+v 0.150501 1.142450 0.323685
+v 0.137337 1.140963 0.332946
+v 0.124026 1.139058 0.341911
+v 0.122884 1.167900 0.298235
+v 0.112135 1.164186 0.309723
+v 0.101267 1.160031 0.320938
+v 0.086892 1.187428 0.278707
+v 0.079292 1.182007 0.291902
+v 0.071606 1.176124 0.304844
+v 0.044979 1.199704 0.266431
+v 0.041044 1.193209 0.280700
+v 0.037066 1.186241 0.294728
+v 0.000000 1.203892 0.262243
+v 0.000000 1.197030 0.276879
+v 0.000000 1.189692 0.291277
+v -0.044978 1.199704 0.266431
+v -0.041044 1.193209 0.280700
+v -0.037066 1.186241 0.294728
+v -0.086892 1.187428 0.278707
+v -0.079292 1.182007 0.291902
+v -0.071606 1.176124 0.304844
+v -0.122884 1.167900 0.298235
+v -0.112135 1.164186 0.309723
+v -0.101267 1.160031 0.320938
+v -0.150501 1.142450 0.323685
+v -0.137337 1.140963 0.332947
+v -0.124026 1.139058 0.341911
+v -0.167862 1.112813 0.353322
+v -0.153179 1.113918 0.359991
+v -0.138333 1.114635 0.366334
+v -0.173784 1.081008 0.385127
+v -0.158583 1.084895 0.389014
+v -0.143213 1.088425 0.392544
+v -0.078433 1.083998 0.417839
+v -0.093170 1.079170 0.418595
+v -0.108211 1.073894 0.419019
+v -0.097020 1.054789 0.438124
+v -0.083534 1.062720 0.435045
+v -0.070321 1.070150 0.431687
+v -0.079216 1.038383 0.454530
+v -0.068205 1.048594 0.449170
+v -0.057417 1.058259 0.443578
+v -0.056014 1.025793 0.467119
+v -0.048229 1.037755 0.460010
+v -0.040600 1.049134 0.452703
+v -0.028995 1.017880 0.475033
+v -0.024965 1.030941 0.466823
+v -0.021016 1.043398 0.458439
+v 0.000000 1.015181 0.477732
+v 0.000000 1.028617 0.469147
+v 0.000000 1.041442 0.460395
+v 0.028995 1.017880 0.475033
+v 0.024965 1.030941 0.466823
+v 0.021016 1.043398 0.458439
+v 0.056014 1.025793 0.467119
+v 0.048229 1.037755 0.460010
+v 0.040600 1.049134 0.452703
+v 0.079216 1.038382 0.454530
+v 0.068206 1.048594 0.449170
+v 0.057417 1.058259 0.443578
+v 0.097020 1.054789 0.438124
+v 0.083534 1.062720 0.435045
+v 0.070322 1.070150 0.431687
+v 0.108212 1.073894 0.419019
+v 0.093171 1.079170 0.418595
+v 0.078433 1.083998 0.417839
+v 0.112029 1.094397 0.398516
+v 0.096457 1.096823 0.400942
+v 0.081200 1.098859 0.402978
+v 0.108212 1.114900 0.378013
+v 0.093171 1.114476 0.383289
+v 0.078433 1.113720 0.388117
+v 0.097020 1.134005 0.358908
+v 0.083534 1.130926 0.366839
+v 0.070322 1.127568 0.374269
+v 0.079216 1.150411 0.342501
+v 0.068206 1.145051 0.352713
+v 0.057417 1.139459 0.362378
+v 0.056014 1.163000 0.329913
+v 0.048229 1.155890 0.341874
+v 0.040600 1.148584 0.353253
+v 0.028995 1.170914 0.321999
+v 0.024965 1.162704 0.335060
+v 0.021016 1.154320 0.347517
+v 0.000000 1.173613 0.319300
+v 0.000000 1.165028 0.332736
+v 0.000000 1.156276 0.345561
+v -0.028995 1.170914 0.321999
+v -0.024965 1.162704 0.335060
+v -0.021016 1.154320 0.347517
+v -0.056014 1.163000 0.329913
+v -0.048229 1.155890 0.341874
+v -0.040600 1.148584 0.353253
+v -0.079216 1.150411 0.342502
+v -0.068205 1.145051 0.352713
+v -0.057417 1.139459 0.362378
+v -0.097020 1.134005 0.358908
+v -0.083534 1.130926 0.366839
+v -0.070321 1.127567 0.374269
+v -0.108211 1.114900 0.378013
+v -0.093170 1.114476 0.383289
+v -0.078433 1.113720 0.388117
+v -0.112029 1.094397 0.398516
+v -0.096457 1.096823 0.400942
+v -0.081200 1.098859 0.402978
+v -0.050744 0.390673 -0.285980
+v -0.037309 0.392305 -0.289438
+v -0.023216 0.394261 -0.292822
+v -0.020815 0.390162 -0.288723
+v -0.033451 0.385717 -0.282851
+v -0.045495 0.381713 -0.277020
+v -0.016995 0.386642 -0.285204
+v -0.027312 0.380061 -0.277194
+v -0.037147 0.374020 -0.269327
+v -0.012018 0.383941 -0.282503
+v -0.019313 0.375721 -0.272854
+v -0.026267 0.368117 -0.263424
+v -0.006221 0.382243 -0.280805
+v -0.009997 0.372992 -0.270125
+v -0.013597 0.364406 -0.259713
+v -0.000000 0.381664 -0.280226
+v -0.000000 0.372061 -0.269195
+v -0.000000 0.363140 -0.258447
+v 0.006221 0.382243 -0.280805
+v 0.009997 0.372992 -0.270125
+v 0.013597 0.364406 -0.259713
+v 0.012018 0.383941 -0.282503
+v 0.019313 0.375721 -0.272854
+v 0.026267 0.368117 -0.263424
+v 0.016995 0.386642 -0.285204
+v 0.027312 0.380061 -0.277194
+v 0.037147 0.374020 -0.269327
+v 0.020815 0.390162 -0.288723
+v 0.033451 0.385717 -0.282851
+v 0.045495 0.381713 -0.277020
+v 0.023216 0.394261 -0.292822
+v 0.037309 0.392305 -0.289438
+v 0.050743 0.390673 -0.285980
+v 0.024035 0.398660 -0.297221
+v 0.038625 0.399374 -0.296507
+v 0.052534 0.400287 -0.295594
+v 0.023216 0.403058 -0.301620
+v 0.037309 0.406443 -0.303576
+v 0.050743 0.409901 -0.305208
+v 0.020815 0.407157 -0.305719
+v 0.033451 0.413030 -0.310163
+v 0.045495 0.418860 -0.314167
+v 0.016995 0.410677 -0.309239
+v 0.027312 0.418686 -0.315820
+v 0.037147 0.426554 -0.321861
+v 0.012018 0.413378 -0.311940
+v 0.019313 0.423027 -0.320160
+v 0.026267 0.432457 -0.327764
+v 0.006221 0.415076 -0.313637
+v 0.009997 0.425755 -0.322889
+v 0.013597 0.436168 -0.331475
+v -0.000000 0.415655 -0.314216
+v -0.000000 0.426686 -0.323819
+v -0.000000 0.437434 -0.332741
+v -0.006221 0.415076 -0.313637
+v -0.009997 0.425755 -0.322889
+v -0.013597 0.436168 -0.331475
+v -0.012018 0.413378 -0.311940
+v -0.019313 0.423027 -0.320160
+v -0.026267 0.432457 -0.327764
+v -0.016995 0.410677 -0.309239
+v -0.027312 0.418686 -0.315820
+v -0.037147 0.426554 -0.321861
+v -0.020815 0.407157 -0.305719
+v -0.033451 0.413030 -0.310163
+v -0.045495 0.418860 -0.314167
+v -0.023216 0.403058 -0.301620
+v -0.037309 0.406443 -0.303576
+v -0.050744 0.409901 -0.305208
+v -0.024035 0.398660 -0.297221
+v -0.038625 0.399374 -0.296507
+v -0.052534 0.400287 -0.295594
+v -0.023216 1.098942 0.411858
+v -0.037309 1.095558 0.413814
+v -0.050743 1.092099 0.415447
+v -0.045495 1.083140 0.424406
+v -0.033451 1.088970 0.420402
+v -0.020815 1.094843 0.415957
+v -0.037147 1.075446 0.432099
+v -0.027312 1.083314 0.426058
+v -0.016995 1.091323 0.419477
+v -0.026267 1.069543 0.438002
+v -0.019313 1.078973 0.430399
+v -0.012017 1.088622 0.422178
+v -0.013597 1.065832 0.441713
+v -0.009997 1.076245 0.433127
+v -0.006221 1.086924 0.423876
+v 0.000000 1.064566 0.442979
+v 0.000000 1.075314 0.434058
+v 0.000000 1.086345 0.424455
+v 0.013597 1.065832 0.441713
+v 0.009997 1.076245 0.433127
+v 0.006221 1.086924 0.423876
+v 0.026267 1.069543 0.438002
+v 0.019313 1.078973 0.430399
+v 0.012018 1.088622 0.422178
+v 0.037147 1.075446 0.432099
+v 0.027312 1.083314 0.426058
+v 0.016995 1.091323 0.419477
+v 0.045495 1.083140 0.424406
+v 0.033451 1.088970 0.420402
+v 0.020815 1.094843 0.415957
+v 0.050744 1.092099 0.415447
+v 0.037309 1.095558 0.413814
+v 0.023216 1.098942 0.411858
+v 0.052534 1.101713 0.405832
+v 0.038625 1.102626 0.406746
+v 0.024035 1.103341 0.407460
+v 0.050744 1.111328 0.396218
+v 0.037309 1.109695 0.399677
+v 0.023216 1.107739 0.403061
+v 0.045495 1.120287 0.387259
+v 0.033451 1.116282 0.393089
+v 0.020815 1.111838 0.398962
+v 0.037147 1.127980 0.379565
+v 0.027312 1.121939 0.387433
+v 0.016995 1.115358 0.395442
+v 0.026267 1.133883 0.373662
+v 0.019313 1.126280 0.383092
+v 0.012018 1.118059 0.392741
+v 0.013597 1.137594 0.369951
+v 0.009997 1.129008 0.380364
+v 0.006221 1.119757 0.391043
+v 0.000000 1.138860 0.368685
+v 0.000000 1.129939 0.379433
+v 0.000000 1.120336 0.390464
+v -0.013597 1.137594 0.369951
+v -0.009997 1.129008 0.380364
+v -0.006221 1.119757 0.391043
+v -0.026267 1.133883 0.373662
+v -0.019313 1.126280 0.383092
+v -0.012018 1.118059 0.392741
+v -0.037147 1.127980 0.379565
+v -0.027312 1.121939 0.387433
+v -0.016995 1.115358 0.395442
+v -0.045495 1.120286 0.387259
+v -0.033451 1.116282 0.393089
+v -0.020815 1.111838 0.398962
+v -0.050743 1.111328 0.396218
+v -0.037309 1.109695 0.399677
+v -0.023216 1.107739 0.403061
+v -0.052534 1.101713 0.405832
+v -0.038625 1.102626 0.406746
+v -0.024035 1.103341 0.407460
+v -0.064218 0.389340 -0.282206
+v -0.057577 0.378001 -0.270868
+v -0.047011 0.368265 -0.261132
+v -0.033242 0.360794 -0.253661
+v -0.017207 0.356098 -0.248965
+v -0.000000 0.354496 -0.247363
+v 0.017207 0.356098 -0.248965
+v 0.033242 0.360794 -0.253661
+v 0.047011 0.368265 -0.261132
+v 0.057577 0.378001 -0.270868
+v 0.064218 0.389340 -0.282206
+v 0.066484 0.401507 -0.294374
+v 0.064218 0.413674 -0.306541
+v 0.057577 0.425012 -0.317879
+v 0.047011 0.434749 -0.327616
+v 0.033242 0.442220 -0.335087
+v 0.017207 0.446916 -0.339783
+v -0.000000 0.448518 -0.341385
+v -0.017207 0.446916 -0.339783
+v -0.033242 0.442220 -0.335087
+v -0.047011 0.434749 -0.327616
+v -0.057577 0.425012 -0.317879
+v -0.064218 0.413674 -0.306541
+v -0.066484 0.401507 -0.294374
+v -0.123338 0.387038 -0.262105
+v -0.110582 0.365262 -0.240329
+v -0.090290 0.346562 -0.221629
+v -0.063845 0.332213 -0.207281
+v -0.033048 0.323193 -0.198261
+v -0.000000 0.320117 -0.195184
+v 0.033048 0.323193 -0.198261
+v 0.063845 0.332213 -0.207281
+v 0.090290 0.346562 -0.221629
+v 0.110582 0.365262 -0.240329
+v 0.123338 0.387038 -0.262105
+v 0.127689 0.410407 -0.285474
+v 0.123338 0.433775 -0.308843
+v 0.110582 0.455552 -0.330619
+v 0.090290 0.474251 -0.349319
+v 0.063845 0.488600 -0.363667
+v 0.033048 0.497620 -0.372687
+v -0.000000 0.500697 -0.375764
+v -0.033048 0.497620 -0.372687
+v -0.063845 0.488600 -0.363667
+v -0.090290 0.474251 -0.349319
+v -0.110582 0.455552 -0.330619
+v -0.123338 0.433775 -0.308843
+v -0.127689 0.410407 -0.285474
+v -0.182365 0.390680 -0.236096
+v -0.163504 0.358482 -0.203898
+v -0.133500 0.330833 -0.176249
+v -0.094399 0.309618 -0.155033
+v -0.048865 0.296281 -0.141697
+v -0.000000 0.291732 -0.137148
+v 0.048864 0.296281 -0.141697
+v 0.094399 0.309618 -0.155033
+v 0.133500 0.330833 -0.176249
+v 0.163504 0.358482 -0.203898
+v 0.182365 0.390680 -0.236096
+v 0.188798 0.425232 -0.270648
+v 0.182365 0.459785 -0.305201
+v 0.163504 0.491983 -0.337398
+v 0.133500 0.519632 -0.365047
+v 0.094399 0.540847 -0.386263
+v 0.048864 0.554184 -0.399600
+v -0.000000 0.558733 -0.404149
+v -0.048865 0.554184 -0.399600
+v -0.094399 0.540847 -0.386263
+v -0.133501 0.519632 -0.365047
+v -0.163504 0.491983 -0.337398
+v -0.182365 0.459785 -0.305201
+v -0.188798 0.425233 -0.270648
+v -0.238271 0.400487 -0.205103
+v -0.213628 0.358419 -0.163035
+v -0.174427 0.322294 -0.126910
+v -0.123338 0.294574 -0.099190
+v -0.063845 0.277149 -0.081765
+v -0.000000 0.271206 -0.075822
+v 0.063845 0.277149 -0.081765
+v 0.123338 0.294574 -0.099190
+v 0.174427 0.322294 -0.126910
+v 0.213628 0.358419 -0.163035
+v 0.238271 0.400487 -0.205103
+v 0.246677 0.445632 -0.250248
+v 0.238271 0.490777 -0.295393
+v 0.213628 0.532846 -0.337462
+v 0.174427 0.568971 -0.373587
+v 0.123338 0.596690 -0.401306
+v 0.063845 0.614116 -0.418732
+v -0.000000 0.620059 -0.424675
+v -0.063845 0.614116 -0.418732
+v -0.123338 0.596690 -0.401306
+v -0.174427 0.568971 -0.373587
+v -0.213628 0.532846 -0.337462
+v -0.238271 0.490777 -0.295393
+v -0.246677 0.445632 -0.250248
+v -0.290101 0.416292 -0.169659
+v -0.260097 0.365073 -0.118439
+v -0.212369 0.321090 -0.074456
+v -0.150167 0.287341 -0.040707
+v -0.077732 0.266125 -0.019491
+v -0.000000 0.258889 -0.012255
+v 0.077732 0.266125 -0.019491
+v 0.150167 0.287341 -0.040707
+v 0.212368 0.321090 -0.074456
+v 0.260097 0.365073 -0.118439
+v 0.290101 0.416292 -0.169659
+v 0.300334 0.471257 -0.224624
+v 0.290101 0.526222 -0.279589
+v 0.260097 0.577441 -0.330808
+v 0.212368 0.621424 -0.374791
+v 0.150167 0.655174 -0.408540
+v 0.077732 0.676389 -0.429756
+v -0.000000 0.683626 -0.436992
+v -0.077732 0.676389 -0.429756
+v -0.150167 0.655174 -0.408540
+v -0.212369 0.621424 -0.374791
+v -0.260097 0.577441 -0.330808
+v -0.290101 0.526222 -0.279589
+v -0.300335 0.471257 -0.224624
+v -0.336967 0.437824 -0.130368
+v -0.302116 0.378330 -0.070874
+v -0.246677 0.327242 -0.019786
+v -0.174427 0.288040 0.019416
+v -0.090290 0.263397 0.044059
+v -0.000000 0.254992 0.052464
+v 0.090290 0.263397 0.044059
+v 0.174427 0.288040 0.019416
+v 0.246677 0.327242 -0.019786
+v 0.302116 0.378330 -0.070874
+v 0.336967 0.437824 -0.130368
+v 0.348853 0.501668 -0.194212
+v 0.336967 0.565513 -0.258057
+v 0.302116 0.625007 -0.317551
+v 0.246677 0.676095 -0.368639
+v 0.174427 0.715297 -0.407841
+v 0.090290 0.739940 -0.432484
+v -0.000000 0.748345 -0.440889
+v -0.090290 0.739940 -0.432484
+v -0.174427 0.715297 -0.407841
+v -0.246677 0.676095 -0.368639
+v -0.302116 0.625007 -0.317551
+v -0.336967 0.565513 -0.258057
+v -0.348854 0.501668 -0.194212
+v -0.378067 0.464714 -0.087903
+v -0.338965 0.397964 -0.021153
+v -0.276764 0.340644 0.036167
+v -0.195702 0.296661 0.080150
+v -0.101303 0.269012 0.107798
+v -0.000000 0.259582 0.117229
+v 0.101303 0.269012 0.107798
+v 0.195702 0.296661 0.080150
+v 0.276764 0.340644 0.036167
+v 0.338965 0.397964 -0.021153
+v 0.378067 0.464714 -0.087903
+v 0.391403 0.536346 -0.159535
+v 0.378067 0.607978 -0.231167
+v 0.338965 0.674728 -0.297917
+v 0.276764 0.732047 -0.355237
+v 0.195702 0.776030 -0.399220
+v 0.101303 0.803679 -0.426869
+v -0.000000 0.813110 -0.436299
+v -0.101303 0.803679 -0.426869
+v -0.195702 0.776030 -0.399220
+v -0.276764 0.732047 -0.355237
+v -0.338965 0.674728 -0.297917
+v -0.378067 0.607978 -0.231167
+v -0.391404 0.536346 -0.159535
+v -0.412698 0.496503 -0.042991
+v -0.370015 0.423638 0.029873
+v -0.302116 0.361068 0.092443
+v -0.213628 0.313056 0.140455
+v -0.110582 0.282874 0.170637
+v -0.000000 0.272580 0.180931
+v 0.110582 0.282874 0.170637
+v 0.213628 0.313056 0.140455
+v 0.302116 0.361068 0.092443
+v 0.370015 0.423638 0.029873
+v 0.412698 0.496503 -0.042992
+v 0.427256 0.574696 -0.121185
+v 0.412698 0.652889 -0.199378
+v 0.370015 0.725754 -0.272243
+v 0.302116 0.788324 -0.334813
+v 0.213628 0.836336 -0.382825
+v 0.110582 0.866517 -0.413007
+v -0.000000 0.876812 -0.423301
+v -0.110582 0.866517 -0.413007
+v -0.213628 0.836336 -0.382825
+v -0.302116 0.788324 -0.334813
+v -0.370015 0.725754 -0.272243
+v -0.412698 0.652889 -0.199378
+v -0.427257 0.574696 -0.121185
+v -0.440268 0.532646 0.003599
+v -0.394733 0.454914 0.081331
+v -0.322298 0.388163 0.148081
+v -0.227899 0.336944 0.199301
+v -0.117969 0.304746 0.231498
+v -0.000000 0.293764 0.242480
+v 0.117969 0.304746 0.231498
+v 0.227899 0.336944 0.199301
+v 0.322298 0.388163 0.148081
+v 0.394733 0.454913 0.081331
+v 0.440268 0.532646 0.003599
+v 0.455799 0.616063 -0.079818
+v 0.440268 0.699480 -0.163235
+v 0.394733 0.777212 -0.240967
+v 0.322299 0.843962 -0.307718
+v 0.227899 0.895181 -0.358937
+v 0.117969 0.927379 -0.391135
+v -0.000000 0.938361 -0.402117
+v -0.117970 0.927379 -0.391135
+v -0.227900 0.895181 -0.358937
+v -0.322299 0.843962 -0.307718
+v -0.394734 0.777212 -0.240967
+v -0.440268 0.699480 -0.163235
+v -0.455799 0.616063 -0.079818
+v -0.460305 0.572525 0.051071
+v -0.412698 0.491255 0.132341
+v -0.336966 0.421467 0.202129
+v -0.238271 0.367917 0.255679
+v -0.123338 0.334254 0.289342
+v -0.000000 0.322772 0.300824
+v 0.123338 0.334254 0.289342
+v 0.238271 0.367917 0.255679
+v 0.336967 0.421467 0.202129
+v 0.412698 0.491255 0.132341
+v 0.460305 0.572525 0.051071
+v 0.476543 0.659738 -0.036143
+v 0.460305 0.746952 -0.123356
+v 0.412698 0.828221 -0.204626
+v 0.336967 0.898010 -0.274414
+v 0.238271 0.951560 -0.327964
+v 0.123338 0.985223 -0.361627
+v -0.000000 0.996705 -0.373109
+v -0.123338 0.985223 -0.361627
+v -0.238271 0.951560 -0.327964
+v -0.336967 0.898010 -0.274414
+v -0.412698 0.828221 -0.204626
+v -0.460305 0.746952 -0.123356
+v -0.476543 0.659738 -0.036142
+v -0.472466 0.615458 0.098612
+v -0.423601 0.532041 0.182029
+v -0.345869 0.460409 0.253661
+v -0.244566 0.405444 0.308626
+v -0.126597 0.370892 0.343178
+v -0.000000 0.359107 0.354963
+v 0.126597 0.370892 0.343178
+v 0.244566 0.405444 0.308626
+v 0.345869 0.460409 0.253661
+v 0.423601 0.532041 0.182029
+v 0.472466 0.615458 0.098612
+v 0.489133 0.704975 0.009095
+v 0.472466 0.794493 -0.080423
+v 0.423601 0.877910 -0.163840
+v 0.345869 0.949542 -0.235472
+v 0.244566 1.004507 -0.290437
+v 0.126597 1.039059 -0.324989
+v -0.000000 1.050844 -0.336774
+v -0.126597 1.039059 -0.324989
+v -0.244566 1.004507 -0.290437
+v -0.345869 0.949542 -0.235472
+v -0.423601 0.877910 -0.163840
+v -0.472466 0.794493 -0.080423
+v -0.489133 0.704975 0.009095
+v -0.476543 0.660710 0.145409
+v -0.427256 0.576573 0.229546
+v -0.348853 0.504324 0.301796
+v -0.246677 0.448884 0.357235
+v -0.127689 0.414034 0.392086
+v -0.000000 0.402147 0.403973
+v 0.127689 0.414034 0.392086
+v 0.246677 0.448884 0.357235
+v 0.348853 0.504323 0.301796
+v 0.427256 0.576573 0.229546
+v 0.476543 0.660710 0.145409
+v 0.493353 0.751000 0.055119
+v 0.476543 0.841290 -0.035171
+v 0.427256 0.925427 -0.119308
+v 0.348853 0.997677 -0.191557
+v 0.246677 1.053116 -0.246997
+v 0.127689 1.087966 -0.281847
+v -0.000000 1.099853 -0.293734
+v -0.127689 1.087966 -0.281847
+v -0.246677 1.053116 -0.246997
+v -0.348854 0.997677 -0.191557
+v -0.427257 0.925427 -0.119308
+v -0.476543 0.841290 -0.035171
+v -0.493353 0.751000 0.055119
+v -0.472466 0.707507 0.190661
+v -0.423601 0.624090 0.274078
+v -0.345869 0.552459 0.345710
+v -0.244566 0.497494 0.400675
+v -0.126597 0.462941 0.435228
+v 0.000000 0.451156 0.447013
+v 0.126597 0.462941 0.435228
+v 0.244566 0.497493 0.400675
+v 0.345869 0.552458 0.345710
+v 0.423601 0.624090 0.274078
+v 0.472466 0.707507 0.190661
+v 0.489133 0.797025 0.101144
+v 0.472466 0.886542 0.011626
+v 0.423601 0.969959 -0.071791
+v 0.345869 1.041591 -0.143423
+v 0.244566 1.096556 -0.198388
+v 0.126597 1.131108 -0.232940
+v -0.000000 1.142894 -0.244725
+v -0.126597 1.131108 -0.232940
+v -0.244566 1.096556 -0.198388
+v -0.345869 1.041591 -0.143422
+v -0.423601 0.969959 -0.071791
+v -0.472466 0.886542 0.011626
+v -0.489133 0.797025 0.101144
+v -0.460305 0.755049 0.233594
+v -0.412698 0.673779 0.314864
+v -0.336966 0.603991 0.384652
+v -0.238271 0.550440 0.438203
+v -0.123338 0.516777 0.471866
+v 0.000000 0.505295 0.483347
+v 0.123338 0.516777 0.471866
+v 0.238271 0.550440 0.438203
+v 0.336967 0.603991 0.384652
+v 0.412698 0.673779 0.314864
+v 0.460305 0.755048 0.233594
+v 0.476543 0.842262 0.146381
+v 0.460305 0.929475 0.059168
+v 0.412698 1.010745 -0.022102
+v 0.336967 1.080533 -0.091890
+v 0.238271 1.134083 -0.145441
+v 0.123338 1.167746 -0.179104
+v -0.000000 1.179228 -0.190586
+v -0.123338 1.167746 -0.179104
+v -0.238271 1.134083 -0.145441
+v -0.336967 1.080533 -0.091890
+v -0.412698 1.010745 -0.022102
+v -0.460305 0.929475 0.059168
+v -0.476543 0.842262 0.146381
+v -0.440268 0.802520 0.273474
+v -0.394733 0.724788 0.351206
+v -0.322298 0.658038 0.417956
+v -0.227899 0.606819 0.469175
+v -0.117969 0.574621 0.501373
+v 0.000000 0.563639 0.512355
+v 0.117969 0.574621 0.501373
+v 0.227899 0.606819 0.469175
+v 0.322299 0.658038 0.417956
+v 0.394734 0.724788 0.351206
+v 0.440268 0.802520 0.273474
+v 0.455799 0.885937 0.190056
+v 0.440268 0.969354 0.106639
+v 0.394734 1.047087 0.028907
+v 0.322299 1.113837 -0.037843
+v 0.227899 1.165056 -0.089062
+v 0.117969 1.197254 -0.121260
+v -0.000000 1.208236 -0.132242
+v -0.117969 1.197254 -0.121260
+v -0.227900 1.165056 -0.089062
+v -0.322299 1.113837 -0.037843
+v -0.394734 1.047087 0.028907
+v -0.440268 0.969354 0.106640
+v -0.455799 0.885937 0.190057
+v -0.412698 0.849111 0.309617
+v -0.370015 0.776246 0.382481
+v -0.302116 0.713676 0.445051
+v -0.213628 0.665664 0.493063
+v -0.110582 0.635483 0.523245
+v 0.000000 0.625188 0.533539
+v 0.110582 0.635483 0.523245
+v 0.213628 0.665664 0.493063
+v 0.302116 0.713676 0.445052
+v 0.370015 0.776246 0.382481
+v 0.412698 0.849111 0.309617
+v 0.427256 0.927304 0.231423
+v 0.412698 1.005497 0.153230
+v 0.370015 1.078362 0.080365
+v 0.302116 1.140932 0.017795
+v 0.213628 1.188944 -0.030217
+v 0.110582 1.219126 -0.060398
+v -0.000000 1.229420 -0.070693
+v -0.110582 1.219126 -0.060398
+v -0.213628 1.188944 -0.030217
+v -0.302116 1.140932 0.017795
+v -0.370015 1.078362 0.080365
+v -0.412698 1.005497 0.153230
+v -0.427257 0.927304 0.231423
+v -0.378067 0.894023 0.341405
+v -0.338965 0.827272 0.408156
+v -0.276764 0.769953 0.465475
+v -0.195702 0.725970 0.509458
+v -0.101303 0.698321 0.537107
+v 0.000000 0.688890 0.546537
+v 0.101303 0.698321 0.537107
+v 0.195702 0.725970 0.509458
+v 0.276764 0.769953 0.465475
+v 0.338965 0.827272 0.408155
+v 0.378067 0.894023 0.341405
+v 0.391403 0.965654 0.269773
+v 0.378067 1.037286 0.198142
+v 0.338965 1.104036 0.131391
+v 0.276764 1.161356 0.074072
+v 0.195702 1.205339 0.030089
+v 0.101303 1.232988 0.002440
+v 0.000000 1.242418 -0.006991
+v -0.101303 1.232988 0.002440
+v -0.195702 1.205339 0.030089
+v -0.276764 1.161356 0.074072
+v -0.338965 1.104036 0.131391
+v -0.378067 1.037286 0.198142
+v -0.391403 0.965654 0.269774
+v -0.336966 0.936487 0.368295
+v -0.302116 0.876993 0.427789
+v -0.246677 0.825905 0.478878
+v -0.174427 0.786704 0.518079
+v -0.090290 0.762061 0.542722
+v 0.000000 0.753655 0.551127
+v 0.090290 0.762060 0.542722
+v 0.174427 0.786704 0.518079
+v 0.246677 0.825905 0.478878
+v 0.302116 0.876993 0.427789
+v 0.336967 0.936487 0.368295
+v 0.348853 1.000332 0.304451
+v 0.336967 1.064176 0.240606
+v 0.302116 1.123670 0.181112
+v 0.246677 1.174758 0.130024
+v 0.174427 1.213960 0.090823
+v 0.090290 1.238603 0.066179
+v 0.000000 1.247008 0.057774
+v -0.090290 1.238603 0.066179
+v -0.174427 1.213960 0.090823
+v -0.246677 1.174758 0.130024
+v -0.302116 1.123670 0.181113
+v -0.336967 1.064176 0.240606
+v -0.348853 1.000332 0.304451
+v -0.290101 0.975778 0.389827
+v -0.260097 0.924559 0.441046
+v -0.212368 0.880576 0.485029
+v -0.150167 0.846826 0.518779
+v -0.077732 0.825611 0.539994
+v 0.000000 0.818375 0.547231
+v 0.077732 0.825611 0.539994
+v 0.150167 0.846826 0.518779
+v 0.212369 0.880576 0.485029
+v 0.260097 0.924559 0.441046
+v 0.290101 0.975778 0.389827
+v 0.300334 1.030743 0.334862
+v 0.290101 1.085708 0.279897
+v 0.260097 1.136927 0.228678
+v 0.212369 1.180910 0.184695
+v 0.150167 1.214659 0.150945
+v 0.077732 1.235875 0.129730
+v 0.000000 1.243111 0.122493
+v -0.077732 1.235875 0.129730
+v -0.150167 1.214659 0.150945
+v -0.212369 1.180910 0.184695
+v -0.260097 1.136927 0.228678
+v -0.290101 1.085708 0.279897
+v -0.300334 1.030743 0.334862
+v -0.238271 1.011223 0.405632
+v -0.213628 0.969154 0.447700
+v -0.174427 0.933029 0.483825
+v -0.123338 0.905310 0.511545
+v -0.063845 0.887884 0.528970
+v 0.000000 0.881941 0.534913
+v 0.063845 0.887884 0.528970
+v 0.123338 0.905310 0.511545
+v 0.174427 0.933030 0.483825
+v 0.213628 0.969154 0.447700
+v 0.238271 1.011223 0.405632
+v 0.246677 1.056368 0.360487
+v 0.238271 1.101513 0.315342
+v 0.213628 1.143581 0.273273
+v 0.174427 1.179706 0.237148
+v 0.123338 1.207426 0.209429
+v 0.063845 1.224851 0.192003
+v 0.000000 1.230794 0.186060
+v -0.063845 1.224851 0.192003
+v -0.123338 1.207426 0.209429
+v -0.174427 1.179706 0.237148
+v -0.213628 1.143581 0.273273
+v -0.238271 1.101513 0.315342
+v -0.246677 1.056368 0.360487
+v -0.182365 1.042215 0.415439
+v -0.163504 1.010017 0.447637
+v -0.133500 0.982368 0.475286
+v -0.094399 0.961153 0.496501
+v -0.048864 0.947816 0.509838
+v 0.000000 0.943267 0.514387
+v 0.048865 0.947816 0.509838
+v 0.094399 0.961153 0.496501
+v 0.133500 0.982368 0.475286
+v 0.163504 1.010017 0.447637
+v 0.182365 1.042215 0.415439
+v 0.188798 1.076768 0.380887
+v 0.182365 1.111320 0.346334
+v 0.163504 1.143518 0.314136
+v 0.133500 1.171167 0.286488
+v 0.094399 1.192382 0.265272
+v 0.048865 1.205719 0.251935
+v 0.000000 1.210268 0.247386
+v -0.048865 1.205719 0.251935
+v -0.094399 1.192382 0.265272
+v -0.133500 1.171167 0.286488
+v -0.163504 1.143518 0.314136
+v -0.182365 1.111320 0.346334
+v -0.188798 1.076768 0.380887
+v -0.123338 1.068225 0.419081
+v -0.110582 1.046449 0.440857
+v -0.090290 1.027749 0.459557
+v -0.063845 1.013400 0.473906
+v -0.033048 1.004380 0.482926
+v 0.000000 1.001304 0.486002
+v 0.033048 1.004380 0.482926
+v 0.063845 1.013400 0.473906
+v 0.090290 1.027749 0.459557
+v 0.110582 1.046449 0.440857
+v 0.123338 1.068225 0.419081
+v 0.127689 1.091593 0.395712
+v 0.123338 1.114962 0.372344
+v 0.110582 1.136738 0.350568
+v 0.090290 1.155438 0.331868
+v 0.063845 1.169787 0.317519
+v 0.033048 1.178807 0.308499
+v 0.000000 1.181883 0.305423
+v -0.033048 1.178807 0.308499
+v -0.063845 1.169787 0.317519
+v -0.090290 1.155438 0.331868
+v -0.110582 1.136738 0.350568
+v -0.123338 1.114962 0.372344
+v -0.127689 1.091593 0.395712
+v -0.064218 1.088326 0.416780
+v -0.057577 1.076988 0.428118
+v -0.047011 1.067251 0.437854
+v -0.033242 1.059780 0.445325
+v -0.017207 1.055084 0.450022
+v 0.000000 1.053482 0.451623
+v 0.017207 1.055084 0.450022
+v 0.033242 1.059780 0.445325
+v 0.047011 1.067251 0.437854
+v 0.057577 1.076988 0.428118
+v 0.064218 1.088326 0.416780
+v 0.066484 1.100493 0.404612
+v 0.064218 1.112660 0.392445
+v 0.057577 1.123999 0.381107
+v 0.047011 1.133735 0.371370
+v 0.033242 1.141206 0.363899
+v 0.017207 1.145902 0.359203
+v 0.000000 1.147504 0.357601
+v -0.017207 1.145902 0.359203
+v -0.033242 1.141206 0.363899
+v -0.047011 1.133735 0.371370
+v -0.057577 1.123999 0.381107
+v -0.064218 1.112660 0.392445
+v -0.066484 1.100493 0.404612
+v -0.000000 0.397773 -0.298108
+v 0.000000 1.104228 0.408347
+vt 0.471064 0.073765
+vt 0.471065 0.072664
+vt 0.478308 0.072664
+vt 0.478307 0.073765
+vt 0.485560 0.072664
+vt 0.485560 0.073765
+vt 0.471065 0.071000
+vt 0.478308 0.071000
+vt 0.485560 0.071000
+vt 0.478305 0.074484
+vt 0.471061 0.074484
+vt 0.478301 0.075005
+vt 0.471055 0.075005
+vt 0.485558 0.074484
+vt 0.485555 0.075005
+vt 0.463829 0.074484
+vt 0.463832 0.073765
+vt 0.456612 0.074484
+vt 0.456616 0.073765
+vt 0.463822 0.075005
+vt 0.456604 0.075005
+vt 0.463834 0.072664
+vt 0.463834 0.071000
+vt 0.456618 0.072664
+vt 0.456618 0.071000
+vt 0.442240 0.073765
+vt 0.442242 0.072664
+vt 0.449419 0.072664
+vt 0.449418 0.073765
+vt 0.442242 0.071000
+vt 0.449419 0.071000
+vt 0.449413 0.074484
+vt 0.442234 0.074484
+vt 0.449403 0.075005
+vt 0.442224 0.075005
+vt 0.435079 0.074484
+vt 0.435085 0.073765
+vt 0.427949 0.074484
+vt 0.427955 0.073765
+vt 0.435067 0.075005
+vt 0.427936 0.075005
+vt 0.435087 0.072664
+vt 0.435087 0.071000
+vt 0.427958 0.072664
+vt 0.427958 0.071000
+vt 0.413782 0.073765
+vt 0.413785 0.072664
+vt 0.420856 0.072664
+vt 0.420854 0.073765
+vt 0.413785 0.071000
+vt 0.420856 0.071000
+vt 0.420847 0.074484
+vt 0.413774 0.074484
+vt 0.420832 0.075005
+vt 0.413759 0.075005
+vt 0.406734 0.074484
+vt 0.406742 0.073765
+vt 0.399728 0.074484
+vt 0.399736 0.073765
+vt 0.406718 0.075005
+vt 0.399710 0.075005
+vt 0.406745 0.072664
+vt 0.406745 0.071000
+vt 0.399739 0.072664
+vt 0.399739 0.071000
+vt 0.385832 0.073765
+vt 0.385835 0.072664
+vt 0.392769 0.072664
+vt 0.392766 0.073765
+vt 0.385835 0.071000
+vt 0.392769 0.071000
+vt 0.392757 0.074484
+vt 0.385822 0.074484
+vt 0.392738 0.075005
+vt 0.385803 0.075005
+vt 0.378926 0.074484
+vt 0.378936 0.073765
+vt 0.372070 0.074484
+vt 0.372080 0.073765
+vt 0.378907 0.075005
+vt 0.372049 0.075005
+vt 0.378940 0.072664
+vt 0.378940 0.071000
+vt 0.372083 0.072664
+vt 0.372083 0.071000
+vt 0.358489 0.073765
+vt 0.358493 0.072664
+vt 0.365268 0.072664
+vt 0.365264 0.073765
+vt 0.358493 0.071000
+vt 0.365268 0.071000
+vt 0.365254 0.074484
+vt 0.358479 0.074484
+vt 0.365232 0.075005
+vt 0.358457 0.075005
+vt 0.351745 0.074484
+vt 0.351756 0.073765
+vt 0.345054 0.074484
+vt 0.345066 0.073765
+vt 0.351723 0.075005
+vt 0.345032 0.075005
+vt 0.351760 0.072664
+vt 0.351760 0.071000
+vt 0.345069 0.072664
+vt 0.345069 0.071000
+vt 0.331813 0.073765
+vt 0.331817 0.072664
+vt 0.338422 0.072664
+vt 0.338418 0.073765
+vt 0.331817 0.071000
+vt 0.338422 0.071000
+vt 0.338406 0.074484
+vt 0.331801 0.074484
+vt 0.338383 0.075005
+vt 0.331778 0.075005
+vt 0.325239 0.074484
+vt 0.325251 0.073765
+vt 0.318720 0.074484
+vt 0.318731 0.073765
+vt 0.325215 0.075005
+vt 0.318696 0.075005
+vt 0.325255 0.072664
+vt 0.325255 0.071000
+vt 0.318735 0.072664
+vt 0.318735 0.071000
+vt 0.305822 0.073765
+vt 0.305826 0.072664
+vt 0.312259 0.072664
+vt 0.312255 0.073765
+vt 0.305826 0.071000
+vt 0.312259 0.071000
+vt 0.312243 0.074484
+vt 0.305809 0.074484
+vt 0.312219 0.075005
+vt 0.305785 0.075005
+vt 0.299418 0.074484
+vt 0.299430 0.073765
+vt 0.293068 0.074484
+vt 0.293080 0.073765
+vt 0.299394 0.075005
+vt 0.293044 0.075005
+vt 0.299434 0.072664
+vt 0.299434 0.071000
+vt 0.293084 0.072664
+vt 0.293084 0.071000
+vt 0.280504 0.073765
+vt 0.280508 0.072664
+vt 0.286776 0.072664
+vt 0.286772 0.073765
+vt 0.280508 0.071000
+vt 0.286776 0.071000
+vt 0.286760 0.074484
+vt 0.280492 0.074484
+vt 0.286736 0.075005
+vt 0.280468 0.075005
+vt 0.274264 0.074484
+vt 0.274276 0.073765
+vt 0.268076 0.074484
+vt 0.268088 0.073765
+vt 0.274240 0.075005
+vt 0.268052 0.075005
+vt 0.274280 0.072664
+vt 0.274280 0.071000
+vt 0.268092 0.072664
+vt 0.268092 0.071000
+vt 0.255825 0.073765
+vt 0.255829 0.072664
+vt 0.261942 0.072664
+vt 0.261938 0.073765
+vt 0.255829 0.071000
+vt 0.261942 0.071000
+vt 0.261926 0.074484
+vt 0.255814 0.074484
+vt 0.261902 0.075005
+vt 0.255790 0.075005
+vt 0.249738 0.074484
+vt 0.249750 0.073765
+vt 0.243698 0.074484
+vt 0.243710 0.073765
+vt 0.249715 0.075005
+vt 0.243676 0.075005
+vt 0.249753 0.072664
+vt 0.249753 0.071000
+vt 0.243713 0.072664
+vt 0.243713 0.071000
+vt 0.231734 0.073765
+vt 0.231737 0.072664
+vt 0.237708 0.072664
+vt 0.237705 0.073765
+vt 0.231737 0.071000
+vt 0.237708 0.071000
+vt 0.237694 0.074484
+vt 0.231723 0.074484
+vt 0.237671 0.075005
+vt 0.231701 0.075005
+vt 0.225785 0.074484
+vt 0.225796 0.073765
+vt 0.219879 0.074484
+vt 0.219889 0.073765
+vt 0.225763 0.075005
+vt 0.219858 0.075005
+vt 0.225799 0.072664
+vt 0.225799 0.071000
+vt 0.219893 0.072664
+vt 0.219893 0.071000
+vt 0.208169 0.073765
+vt 0.208172 0.072664
+vt 0.214017 0.072664
+vt 0.214014 0.073765
+vt 0.208172 0.071000
+vt 0.214017 0.071000
+vt 0.214004 0.074484
+vt 0.208159 0.074484
+vt 0.213983 0.075005
+vt 0.208139 0.075005
+vt 0.202342 0.074484
+vt 0.202352 0.073765
+vt 0.196553 0.074484
+vt 0.196563 0.073765
+vt 0.202323 0.075005
+vt 0.196534 0.075005
+vt 0.202355 0.072664
+vt 0.202355 0.071000
+vt 0.196566 0.072664
+vt 0.196566 0.071000
+vt 0.185072 0.073765
+vt 0.185075 0.072664
+vt 0.190803 0.072664
+vt 0.190800 0.073765
+vt 0.185075 0.071000
+vt 0.190803 0.071000
+vt 0.190791 0.074484
+vt 0.185064 0.074484
+vt 0.190773 0.075005
+vt 0.185046 0.075005
+vt 0.179378 0.074484
+vt 0.179387 0.073765
+vt 0.173743 0.074484
+vt 0.173751 0.073765
+vt 0.179361 0.075005
+vt 0.173726 0.075005
+vt 0.179390 0.072664
+vt 0.179390 0.071000
+vt 0.173754 0.072664
+vt 0.173754 0.071000
+vt 0.151693 0.073749
+vt 0.151695 0.072664
+vt 0.152840 0.072664
+vt 0.152838 0.073755
+vt 0.154988 0.072664
+vt 0.154986 0.073760
+vt 0.151695 0.071000
+vt 0.152840 0.071000
+vt 0.154988 0.071000
+vt 0.152831 0.074446
+vt 0.151686 0.074422
+vt 0.152817 0.074911
+vt 0.151672 0.074849
+vt 0.154979 0.074465
+vt 0.154965 0.074958
+vt 0.151209 0.074393
+vt 0.151216 0.073742
+vt 0.151067 0.074363
+vt 0.151074 0.073734
+vt 0.151196 0.074779
+vt 0.151053 0.074703
+vt 0.151219 0.072664
+vt 0.151219 0.071000
+vt 0.151076 0.072664
+vt 0.151076 0.071000
+vt 0.471002 0.076270
+vt 0.471046 0.075511
+vt 0.478294 0.075511
+vt 0.478261 0.076270
+vt 0.485551 0.075511
+vt 0.485529 0.076270
+vt 0.478179 0.077549
+vt 0.470894 0.077549
+vt 0.478025 0.079617
+vt 0.470690 0.079617
+vt 0.485474 0.077549
+vt 0.485371 0.079617
+vt 0.463621 0.077549
+vt 0.463756 0.076270
+vt 0.456365 0.077549
+vt 0.456525 0.076270
+vt 0.463368 0.079617
+vt 0.456064 0.079617
+vt 0.463811 0.075511
+vt 0.456590 0.075511
+vt 0.442121 0.076270
+vt 0.442206 0.075511
+vt 0.449388 0.075511
+vt 0.449313 0.076270
+vt 0.449128 0.077549
+vt 0.441912 0.077549
+vt 0.448780 0.079617
+vt 0.441519 0.079617
+vt 0.434721 0.077549
+vt 0.434953 0.076270
+vt 0.427557 0.077549
+vt 0.427811 0.076270
+vt 0.434284 0.079617
+vt 0.427078 0.079617
+vt 0.435047 0.075511
+vt 0.427914 0.075511
+vt 0.413614 0.076270
+vt 0.413733 0.075511
+vt 0.420808 0.075511
+vt 0.420697 0.076270
+vt 0.420422 0.077549
+vt 0.413319 0.077549
+vt 0.419904 0.079617
+vt 0.412764 0.079617
+vt 0.406249 0.077549
+vt 0.406564 0.076270
+vt 0.399216 0.077549
+vt 0.399547 0.076270
+vt 0.405659 0.079617
+vt 0.398592 0.079617
+vt 0.406690 0.075511
+vt 0.399681 0.075511
+vt 0.385625 0.076270
+vt 0.385772 0.075511
+vt 0.392708 0.075511
+vt 0.392567 0.076270
+vt 0.392219 0.077549
+vt 0.385262 0.077549
+vt 0.391566 0.079617
+vt 0.384580 0.079617
+vt 0.378344 0.077549
+vt 0.378721 0.076270
+vt 0.371468 0.077549
+vt 0.371858 0.076270
+vt 0.377637 0.079617
+vt 0.370737 0.079617
+vt 0.378873 0.075511
+vt 0.372015 0.075511
+vt 0.358255 0.076270
+vt 0.358420 0.075511
+vt 0.365197 0.075511
+vt 0.365035 0.076270
+vt 0.364635 0.077549
+vt 0.357844 0.077549
+vt 0.363883 0.079617
+vt 0.357074 0.079617
+vt 0.351097 0.077549
+vt 0.351516 0.076270
+vt 0.344395 0.077549
+vt 0.344821 0.076270
+vt 0.350311 0.079617
+vt 0.343595 0.079617
+vt 0.351686 0.075511
+vt 0.344994 0.075511
+vt 0.331561 0.076270
+vt 0.331738 0.075511
+vt 0.338345 0.075511
+vt 0.338169 0.076270
+vt 0.337737 0.077549
+vt 0.331123 0.077549
+vt 0.336925 0.079617
+vt 0.330302 0.079617
+vt 0.324555 0.077549
+vt 0.324997 0.076270
+vt 0.318031 0.077549
+vt 0.318475 0.076270
+vt 0.323727 0.079617
+vt 0.317198 0.079617
+vt 0.325175 0.075511
+vt 0.318656 0.075511
+vt 0.305563 0.076270
+vt 0.305745 0.075511
+vt 0.312179 0.075511
+vt 0.311998 0.076270
+vt 0.311551 0.077549
+vt 0.305116 0.077549
+vt 0.310715 0.079617
+vt 0.304279 0.079617
+vt 0.298725 0.077549
+vt 0.299172 0.076270
+vt 0.292377 0.077549
+vt 0.292822 0.076270
+vt 0.297888 0.079617
+vt 0.291542 0.079617
+vt 0.299353 0.075511
+vt 0.293003 0.075511
+vt 0.280249 0.076270
+vt 0.280428 0.075511
+vt 0.286695 0.075511
+vt 0.286515 0.076270
+vt 0.286071 0.077549
+vt 0.279808 0.077549
+vt 0.285240 0.079617
+vt 0.278982 0.079617
+vt 0.273585 0.077549
+vt 0.274023 0.076270
+vt 0.267403 0.077549
+vt 0.267836 0.076270
+vt 0.272766 0.079617
+vt 0.266593 0.079617
+vt 0.274200 0.075511
+vt 0.268012 0.075511
+vt 0.255580 0.076270
+vt 0.255751 0.075511
+vt 0.261863 0.075511
+vt 0.261689 0.076270
+vt 0.261261 0.077549
+vt 0.255157 0.077549
+vt 0.260460 0.079617
+vt 0.254367 0.079617
+vt 0.249092 0.077549
+vt 0.249507 0.076270
+vt 0.243063 0.077549
+vt 0.243471 0.076270
+vt 0.248314 0.079617
+vt 0.242298 0.079617
+vt 0.249677 0.075511
+vt 0.243638 0.075511
+vt 0.231504 0.076270
+vt 0.231664 0.075511
+vt 0.237634 0.075511
+vt 0.237471 0.076270
+vt 0.237069 0.077549
+vt 0.231111 0.077549
+vt 0.236319 0.079617
+vt 0.230375 0.079617
+vt 0.225186 0.077549
+vt 0.225571 0.076270
+vt 0.219294 0.077549
+vt 0.219670 0.076270
+vt 0.224467 0.079617
+vt 0.218592 0.079617
+vt 0.225728 0.075511
+vt 0.219823 0.075511
+vt 0.207960 0.076270
+vt 0.208105 0.075511
+vt 0.213949 0.075511
+vt 0.213800 0.076270
+vt 0.213433 0.077549
+vt 0.207603 0.077549
+vt 0.212749 0.079617
+vt 0.206937 0.079617
+vt 0.201803 0.077549
+vt 0.202149 0.076270
+vt 0.196030 0.077549
+vt 0.196366 0.076270
+vt 0.201155 0.079617
+vt 0.195402 0.079617
+vt 0.202290 0.075511
+vt 0.196503 0.075511
+vt 0.184888 0.076270
+vt 0.185016 0.075511
+vt 0.190742 0.075511
+vt 0.190610 0.076270
+vt 0.190285 0.077549
+vt 0.184574 0.077549
+vt 0.189677 0.079617
+vt 0.183988 0.079617
+vt 0.178907 0.077549
+vt 0.179209 0.076270
+vt 0.173289 0.077549
+vt 0.173580 0.076270
+vt 0.178341 0.079617
+vt 0.172745 0.079617
+vt 0.179333 0.075511
+vt 0.173699 0.075511
+vt 0.151549 0.075787
+vt 0.151649 0.075200
+vt 0.152794 0.075322
+vt 0.152693 0.075977
+vt 0.154941 0.075417
+vt 0.154838 0.076123
+vt 0.152446 0.077172
+vt 0.151305 0.076926
+vt 0.151986 0.079202
+vt 0.150850 0.078932
+vt 0.154587 0.077360
+vt 0.154118 0.079409
+vt 0.150831 0.076643
+vt 0.151073 0.075568
+vt 0.150689 0.076341
+vt 0.150931 0.075334
+vt 0.150377 0.078621
+vt 0.150236 0.078289
+vt 0.151173 0.075058
+vt 0.151031 0.074907
+vt 0.038037 0.275943
+vt 0.036550 0.274126
+vt 0.036550 0.273466
+vt 0.038037 0.275283
+vt 0.036550 0.273092
+vt 0.038037 0.274909
+vt 0.035923 0.272049
+vt 0.035923 0.271390
+vt 0.035923 0.271016
+vt 0.041246 0.276581
+vt 0.041246 0.277240
+vt 0.047037 0.277100
+vt 0.047037 0.277759
+vt 0.041246 0.276207
+vt 0.047037 0.276726
+vt 0.041246 0.278469
+vt 0.038037 0.277171
+vt 0.041246 0.280552
+vt 0.038037 0.279255
+vt 0.047037 0.278988
+vt 0.047037 0.281071
+vt 0.036550 0.275355
+vt 0.035923 0.273278
+vt 0.036550 0.277438
+vt 0.035923 0.275361
+vt 0.067227 0.276040
+vt 0.056272 0.277240
+vt 0.056272 0.276581
+vt 0.067211 0.275284
+vt 0.056272 0.276207
+vt 0.067189 0.274780
+vt 0.078114 0.273468
+vt 0.078179 0.274515
+vt 0.087330 0.271794
+vt 0.087427 0.273124
+vt 0.078028 0.272577
+vt 0.087028 0.269727
+vt 0.078201 0.275874
+vt 0.067232 0.277301
+vt 0.078201 0.277957
+vt 0.067232 0.279384
+vt 0.087459 0.274576
+vt 0.087459 0.276659
+vt 0.056272 0.278469
+vt 0.056272 0.280552
+vt 0.149244 0.086021
+vt 0.150115 0.082119
+vt 0.151244 0.082365
+vt 0.150363 0.086211
+vt 0.153362 0.082553
+vt 0.152464 0.086357
+vt 0.149487 0.090292
+vt 0.148376 0.090169
+vt 0.148759 0.094159
+vt 0.147656 0.094098
+vt 0.151572 0.090386
+vt 0.150830 0.094207
+vt 0.147914 0.090028
+vt 0.148778 0.085801
+vt 0.147777 0.089877
+vt 0.148639 0.085567
+vt 0.147197 0.094027
+vt 0.147060 0.093952
+vt 0.149646 0.081836
+vt 0.149506 0.081534
+vt 0.181919 0.086503
+vt 0.183042 0.082742
+vt 0.188698 0.082742
+vt 0.187535 0.086503
+vt 0.194390 0.082742
+vt 0.193188 0.086503
+vt 0.186378 0.090481
+vt 0.180802 0.090481
+vt 0.185417 0.094254
+vt 0.179874 0.094254
+vt 0.191993 0.090481
+vt 0.190999 0.094254
+vt 0.175271 0.090481
+vt 0.176347 0.086503
+vt 0.169792 0.090481
+vt 0.170828 0.086503
+vt 0.174376 0.094254
+vt 0.168932 0.094254
+vt 0.177429 0.082742
+vt 0.171868 0.082742
+vt 0.204585 0.086503
+vt 0.205862 0.082742
+vt 0.211644 0.082742
+vt 0.210332 0.086503
+vt 0.217458 0.082742
+vt 0.216112 0.086503
+vt 0.209027 0.090481
+vt 0.203316 0.090481
+vt 0.207943 0.094254
+vt 0.202261 0.094254
+vt 0.214774 0.090481
+vt 0.213661 0.094254
+vt 0.197638 0.090481
+vt 0.198871 0.086503
+vt 0.196613 0.094254
+vt 0.200111 0.082742
+vt 0.227780 0.086503
+vt 0.229189 0.082742
+vt 0.235107 0.082742
+vt 0.233669 0.086503
+vt 0.241063 0.082742
+vt 0.239598 0.086503
+vt 0.232239 0.090481
+vt 0.226378 0.090481
+vt 0.231050 0.094254
+vt 0.225213 0.094254
+vt 0.238140 0.090481
+vt 0.236929 0.094254
+vt 0.220557 0.090481
+vt 0.221928 0.086503
+vt 0.219418 0.094254
+vt 0.223306 0.082742
+vt 0.251578 0.086503
+vt 0.253092 0.082742
+vt 0.259167 0.082742
+vt 0.257632 0.086503
+vt 0.265284 0.082742
+vt 0.263731 0.086503
+vt 0.256105 0.090481
+vt 0.250072 0.090481
+vt 0.254836 0.094254
+vt 0.248820 0.094254
+vt 0.262185 0.090481
+vt 0.260900 0.094254
+vt 0.244084 0.090481
+vt 0.245567 0.086503
+vt 0.242852 0.094254
+vt 0.247058 0.082742
+vt 0.276065 0.086503
+vt 0.277648 0.082742
+vt 0.283898 0.082742
+vt 0.282304 0.086503
+vt 0.290193 0.082742
+vt 0.288591 0.086503
+vt 0.280718 0.090481
+vt 0.274490 0.090481
+vt 0.279400 0.094254
+vt 0.273181 0.094254
+vt 0.286998 0.090481
+vt 0.285674 0.094254
+vt 0.268313 0.090481
+vt 0.269874 0.086503
+vt 0.267015 0.094254
+vt 0.271444 0.082742
+vt 0.301318 0.086503
+vt 0.302925 0.082742
+vt 0.309364 0.082742
+vt 0.307759 0.086503
+vt 0.315851 0.082742
+vt 0.314252 0.086503
+vt 0.306162 0.090481
+vt 0.299719 0.090481
+vt 0.304835 0.094254
+vt 0.298390 0.094254
+vt 0.312662 0.090481
+vt 0.311339 0.094254
+vt 0.293332 0.090481
+vt 0.294929 0.086503
+vt 0.292004 0.094254
+vt 0.296535 0.082742
+vt 0.327401 0.086503
+vt 0.328976 0.082742
+vt 0.335614 0.082742
+vt 0.334056 0.086503
+vt 0.342302 0.082742
+vt 0.340766 0.086503
+vt 0.332506 0.090481
+vt 0.325833 0.090481
+vt 0.331218 0.094254
+vt 0.324530 0.094254
+vt 0.339238 0.090481
+vt 0.337968 0.094254
+vt 0.319219 0.090481
+vt 0.320800 0.086503
+vt 0.317904 0.094254
+vt 0.322389 0.082742
+vt 0.354351 0.086503
+vt 0.355829 0.082742
+vt 0.362668 0.082742
+vt 0.361225 0.086503
+vt 0.369556 0.082742
+vt 0.368153 0.086503
+vt 0.359789 0.090481
+vt 0.352880 0.090481
+vt 0.358595 0.094254
+vt 0.351657 0.094254
+vt 0.366756 0.090481
+vt 0.365595 0.094254
+vt 0.346029 0.090481
+vt 0.347531 0.086503
+vt 0.344781 0.094254
+vt 0.349040 0.082742
+vt 0.382168 0.086503
+vt 0.383478 0.082742
+vt 0.390508 0.082742
+vt 0.389253 0.086503
+vt 0.397584 0.082742
+vt 0.396387 0.086503
+vt 0.388003 0.090481
+vt 0.380865 0.090481
+vt 0.386964 0.094254
+vt 0.379781 0.094254
+vt 0.395196 0.090481
+vt 0.394205 0.094254
+vt 0.373782 0.090481
+vt 0.375134 0.086503
+vt 0.372658 0.094254
+vt 0.376493 0.082742
+vt 0.410799 0.086503
+vt 0.411866 0.082742
+vt 0.419066 0.082742
+vt 0.418071 0.086503
+vt 0.426304 0.082742
+vt 0.425385 0.086503
+vt 0.417081 0.090481
+vt 0.409737 0.090481
+vt 0.416258 0.094254
+vt 0.408855 0.094254
+vt 0.424470 0.090481
+vt 0.423710 0.094254
+vt 0.402441 0.090481
+vt 0.403570 0.086503
+vt 0.401503 0.094254
+vt 0.404704 0.082742
+vt 0.440126 0.086503
+vt 0.440882 0.082742
+vt 0.448216 0.082742
+vt 0.447547 0.086503
+vt 0.455576 0.082742
+vt 0.454996 0.086503
+vt 0.446881 0.090481
+vt 0.439374 0.090481
+vt 0.446327 0.094254
+vt 0.438748 0.094254
+vt 0.454419 0.090481
+vt 0.453940 0.094254
+vt 0.431903 0.090481
+vt 0.432738 0.086503
+vt 0.431208 0.094254
+vt 0.433577 0.082742
+vt 0.469967 0.086503
+vt 0.470359 0.082742
+vt 0.477776 0.082742
+vt 0.477480 0.086503
+vt 0.485204 0.082742
+vt 0.485006 0.086503
+vt 0.477185 0.090481
+vt 0.469576 0.090481
+vt 0.476940 0.094254
+vt 0.469251 0.094254
+vt 0.484809 0.090481
+vt 0.484645 0.094254
+vt 0.461986 0.090481
+vt 0.462471 0.086503
+vt 0.461583 0.094254
+vt 0.462958 0.082742
+vt 0.097100 0.271940
+vt 0.097098 0.273407
+vt 0.093291 0.273797
+vt 0.093269 0.272321
+vt 0.097092 0.275491
+vt 0.093291 0.275880
+vt 0.093204 0.270921
+vt 0.097092 0.270566
+vt 0.093590 0.269047
+vt 0.097194 0.268758
+vt 0.100346 0.270444
+vt 0.100316 0.271810
+vt 0.104407 0.270437
+vt 0.104334 0.271805
+vt 0.100370 0.268658
+vt 0.104468 0.268649
+vt 0.100287 0.273276
+vt 0.100263 0.275360
+vt 0.104260 0.273272
+vt 0.104199 0.275358
+vt 0.146550 0.201600
+vt 0.147066 0.197954
+vt 0.147531 0.198640
+vt 0.146931 0.201644
+vt 0.148106 0.199556
+vt 0.147392 0.201702
+vt 0.147859 0.193533
+vt 0.148602 0.194563
+vt 0.150125 0.197767
+vt 0.146995 0.204529
+vt 0.146206 0.205042
+vt 0.146950 0.208015
+vt 0.145686 0.208789
+vt 0.147990 0.203849
+vt 0.149909 0.205637
+vt 0.145827 0.205217
+vt 0.146327 0.201587
+vt 0.145653 0.205224
+vt 0.146182 0.201588
+vt 0.145110 0.209059
+vt 0.144879 0.209076
+vt 0.146821 0.197725
+vt 0.147522 0.193190
+vt 0.146687 0.197725
+vt 0.147388 0.193190
+vt 0.178749 0.315136
+vt 0.178823 0.314473
+vt 0.184329 0.314473
+vt 0.184252 0.315136
+vt 0.189874 0.314473
+vt 0.189795 0.315136
+vt 0.178884 0.313872
+vt 0.184392 0.313872
+vt 0.189940 0.313872
+vt 0.184176 0.315794
+vt 0.178676 0.315794
+vt 0.184113 0.316375
+vt 0.178614 0.316375
+vt 0.189716 0.315794
+vt 0.189651 0.316375
+vt 0.173222 0.315794
+vt 0.173293 0.315136
+vt 0.167822 0.315794
+vt 0.167890 0.315136
+vt 0.173163 0.316375
+vt 0.167766 0.316375
+vt 0.173364 0.314473
+vt 0.173422 0.313872
+vt 0.167958 0.314473
+vt 0.168015 0.313872
+vt 0.200981 0.315136
+vt 0.201065 0.314473
+vt 0.206714 0.314473
+vt 0.206628 0.315136
+vt 0.212400 0.314473
+vt 0.212312 0.315136
+vt 0.201135 0.313872
+vt 0.206786 0.313872
+vt 0.212475 0.313872
+vt 0.206541 0.315794
+vt 0.200897 0.315794
+vt 0.206469 0.316375
+vt 0.200827 0.316375
+vt 0.212223 0.315794
+vt 0.212148 0.316375
+vt 0.195290 0.315794
+vt 0.195371 0.315136
+vt 0.195222 0.316375
+vt 0.195453 0.314473
+vt 0.195521 0.313872
+vt 0.223799 0.315136
+vt 0.223892 0.314473
+vt 0.229701 0.314473
+vt 0.229605 0.315136
+vt 0.235554 0.314473
+vt 0.235456 0.315136
+vt 0.223970 0.313872
+vt 0.229781 0.313872
+vt 0.235636 0.313872
+vt 0.229510 0.315794
+vt 0.223705 0.315794
+vt 0.229430 0.316375
+vt 0.223627 0.316375
+vt 0.235359 0.315794
+vt 0.235277 0.316375
+vt 0.217943 0.315794
+vt 0.218035 0.315136
+vt 0.217867 0.316375
+vt 0.218126 0.314473
+vt 0.218202 0.313872
+vt 0.247298 0.315136
+vt 0.247399 0.314473
+vt 0.253395 0.314473
+vt 0.253291 0.315136
+vt 0.259441 0.314473
+vt 0.259336 0.315136
+vt 0.247484 0.313872
+vt 0.253481 0.313872
+vt 0.259528 0.313872
+vt 0.253188 0.315794
+vt 0.247196 0.315794
+vt 0.253102 0.316375
+vt 0.247112 0.316375
+vt 0.259232 0.315794
+vt 0.259144 0.316375
+vt 0.241254 0.315794
+vt 0.241353 0.315136
+vt 0.241170 0.316375
+vt 0.241453 0.314473
+vt 0.241536 0.313872
+vt 0.271586 0.315136
+vt 0.271693 0.314473
+vt 0.277902 0.314473
+vt 0.277793 0.315136
+vt 0.284168 0.314473
+vt 0.284059 0.315136
+vt 0.271782 0.313872
+vt 0.277992 0.313872
+vt 0.284259 0.313872
+vt 0.277685 0.315794
+vt 0.271478 0.315794
+vt 0.277595 0.316375
+vt 0.271389 0.316375
+vt 0.283950 0.315794
+vt 0.283859 0.316375
+vt 0.265328 0.315794
+vt 0.265434 0.315136
+vt 0.265239 0.316375
+vt 0.265540 0.314473
+vt 0.265628 0.313872
+vt 0.296768 0.315136
+vt 0.296878 0.314473
+vt 0.303324 0.314473
+vt 0.303214 0.315136
+vt 0.309834 0.314473
+vt 0.309723 0.315136
+vt 0.296969 0.313872
+vt 0.303416 0.313872
+vt 0.309925 0.313872
+vt 0.303104 0.315794
+vt 0.296658 0.315794
+vt 0.303012 0.316375
+vt 0.296566 0.316375
+vt 0.309613 0.315794
+vt 0.309521 0.316375
+vt 0.290273 0.315794
+vt 0.290383 0.315136
+vt 0.290182 0.316375
+vt 0.290493 0.314473
+vt 0.290584 0.313872
+vt 0.322936 0.315136
+vt 0.323045 0.314473
+vt 0.329749 0.314473
+vt 0.329641 0.315136
+vt 0.336519 0.314473
+vt 0.336412 0.315136
+vt 0.323136 0.313872
+vt 0.329839 0.313872
+vt 0.336608 0.313872
+vt 0.329532 0.315794
+vt 0.322827 0.315794
+vt 0.329442 0.316375
+vt 0.322736 0.316375
+vt 0.336305 0.315794
+vt 0.336216 0.316375
+vt 0.316187 0.315794
+vt 0.316297 0.315136
+vt 0.316096 0.316375
+vt 0.316407 0.314473
+vt 0.316499 0.313872
+vt 0.350157 0.315136
+vt 0.350261 0.314473
+vt 0.357232 0.314473
+vt 0.357130 0.315136
+vt 0.364269 0.314473
+vt 0.364170 0.315136
+vt 0.350347 0.313872
+vt 0.357316 0.313872
+vt 0.364352 0.313872
+vt 0.357028 0.315794
+vt 0.350053 0.315794
+vt 0.356944 0.316375
+vt 0.349967 0.316375
+vt 0.364071 0.315794
+vt 0.363988 0.316375
+vt 0.343145 0.315794
+vt 0.343251 0.315136
+vt 0.343057 0.316375
+vt 0.343356 0.314473
+vt 0.343444 0.313872
+vt 0.378450 0.315136
+vt 0.378543 0.314473
+vt 0.385776 0.314473
+vt 0.385687 0.315136
+vt 0.393072 0.314473
+vt 0.392986 0.315136
+vt 0.378620 0.313872
+vt 0.385851 0.313872
+vt 0.393143 0.313872
+vt 0.385597 0.315794
+vt 0.378357 0.315794
+vt 0.385523 0.316375
+vt 0.378279 0.316375
+vt 0.392901 0.315794
+vt 0.392830 0.316375
+vt 0.371181 0.315794
+vt 0.371277 0.315136
+vt 0.371101 0.316375
+vt 0.371373 0.314473
+vt 0.371454 0.313872
+vt 0.407768 0.315136
+vt 0.407844 0.314473
+vt 0.415315 0.314473
+vt 0.415244 0.315136
+vt 0.422839 0.314473
+vt 0.422772 0.315136
+vt 0.407908 0.313872
+vt 0.415375 0.313872
+vt 0.422894 0.313872
+vt 0.415172 0.315794
+vt 0.407691 0.315794
+vt 0.415112 0.316375
+vt 0.407627 0.316375
+vt 0.422706 0.315794
+vt 0.422651 0.316375
+vt 0.400266 0.315794
+vt 0.400348 0.315136
+vt 0.400199 0.316375
+vt 0.400429 0.314473
+vt 0.400497 0.313872
+vt 0.437977 0.315136
+vt 0.438032 0.314473
+vt 0.445692 0.314473
+vt 0.445644 0.315136
+vt 0.453390 0.314473
+vt 0.453348 0.315136
+vt 0.438077 0.313872
+vt 0.445733 0.313872
+vt 0.453425 0.313872
+vt 0.445595 0.315794
+vt 0.437922 0.315794
+vt 0.445555 0.316375
+vt 0.437876 0.316375
+vt 0.453306 0.315794
+vt 0.453271 0.316375
+vt 0.430291 0.315794
+vt 0.430352 0.315136
+vt 0.430240 0.316375
+vt 0.430412 0.314473
+vt 0.430463 0.313872
+vt 0.468850 0.315136
+vt 0.468879 0.314473
+vt 0.476659 0.314473
+vt 0.476638 0.315136
+vt 0.484457 0.314473
+vt 0.484442 0.315136
+vt 0.468903 0.313872
+vt 0.476677 0.313872
+vt 0.484469 0.313872
+vt 0.476616 0.315794
+vt 0.468822 0.315794
+vt 0.476598 0.316375
+vt 0.468798 0.316375
+vt 0.484428 0.315794
+vt 0.484416 0.316375
+vt 0.461050 0.315794
+vt 0.461085 0.315136
+vt 0.461020 0.316375
+vt 0.461121 0.314473
+vt 0.461150 0.313872
+vt 0.465340 0.271909
+vt 0.465356 0.271290
+vt 0.473996 0.271290
+vt 0.473984 0.271909
+vt 0.482671 0.271290
+vt 0.482663 0.271909
+vt 0.465387 0.271032
+vt 0.474020 0.271032
+vt 0.482687 0.271032
+vt 0.473980 0.273148
+vt 0.465334 0.273148
+vt 0.473980 0.275262
+vt 0.465334 0.275262
+vt 0.482660 0.273148
+vt 0.482660 0.275262
+vt 0.456734 0.273148
+vt 0.456740 0.271909
+vt 0.448189 0.273148
+vt 0.448197 0.271909
+vt 0.456734 0.275262
+vt 0.448189 0.275262
+vt 0.456760 0.271290
+vt 0.456799 0.271032
+vt 0.448220 0.271290
+vt 0.448266 0.271032
+vt 0.431316 0.271909
+vt 0.431346 0.271290
+vt 0.439746 0.271290
+vt 0.439719 0.271909
+vt 0.431405 0.271032
+vt 0.439799 0.271032
+vt 0.439711 0.273148
+vt 0.431306 0.273148
+vt 0.439711 0.275262
+vt 0.431306 0.275262
+vt 0.422982 0.273148
+vt 0.422993 0.271909
+vt 0.414746 0.273148
+vt 0.414758 0.271909
+vt 0.422982 0.275262
+vt 0.414746 0.275262
+vt 0.423026 0.271290
+vt 0.423091 0.271032
+vt 0.414794 0.271290
+vt 0.414865 0.271032
+vt 0.398580 0.271909
+vt 0.398620 0.271290
+vt 0.406658 0.271290
+vt 0.406619 0.271909
+vt 0.398701 0.271032
+vt 0.406734 0.271032
+vt 0.406607 0.273148
+vt 0.398566 0.273148
+vt 0.406607 0.275262
+vt 0.398566 0.275262
+vt 0.390628 0.273148
+vt 0.390642 0.271909
+vt 0.382796 0.273148
+vt 0.382811 0.271909
+vt 0.390628 0.275262
+vt 0.382796 0.275262
+vt 0.390685 0.271290
+vt 0.390770 0.271032
+vt 0.382856 0.271290
+vt 0.382945 0.271032
+vt 0.367479 0.271909
+vt 0.367526 0.271290
+vt 0.375136 0.271290
+vt 0.375090 0.271909
+vt 0.367622 0.271032
+vt 0.375229 0.271032
+vt 0.375075 0.273148
+vt 0.367463 0.273148
+vt 0.375075 0.275262
+vt 0.367463 0.275262
+vt 0.359961 0.273148
+vt 0.359977 0.271909
+vt 0.352570 0.273148
+vt 0.352587 0.271909
+vt 0.359961 0.275262
+vt 0.352570 0.275262
+vt 0.360026 0.271290
+vt 0.360124 0.271032
+vt 0.352637 0.271290
+vt 0.352737 0.271032
+vt 0.338137 0.271909
+vt 0.338188 0.271290
+vt 0.345358 0.271290
+vt 0.345307 0.271909
+vt 0.338291 0.271032
+vt 0.345460 0.271032
+vt 0.345290 0.273148
+vt 0.338120 0.273148
+vt 0.345290 0.275262
+vt 0.338120 0.275262
+vt 0.331056 0.273148
+vt 0.331074 0.271909
+vt 0.324099 0.273148
+vt 0.324116 0.271909
+vt 0.331056 0.275262
+vt 0.324099 0.275262
+vt 0.331126 0.271290
+vt 0.331229 0.271032
+vt 0.324168 0.271290
+vt 0.324273 0.271032
+vt 0.310509 0.271909
+vt 0.310562 0.271290
+vt 0.317315 0.271290
+vt 0.317262 0.271909
+vt 0.310666 0.271032
+vt 0.317419 0.271032
+vt 0.317245 0.273148
+vt 0.310492 0.273148
+vt 0.317245 0.275262
+vt 0.310492 0.275262
+vt 0.303837 0.273148
+vt 0.303854 0.271909
+vt 0.297277 0.273148
+vt 0.297295 0.271909
+vt 0.303837 0.275262
+vt 0.297277 0.275262
+vt 0.303907 0.271290
+vt 0.304011 0.271032
+vt 0.297347 0.271290
+vt 0.297450 0.271032
+vt 0.284449 0.271909
+vt 0.284500 0.271290
+vt 0.290879 0.271290
+vt 0.290827 0.271909
+vt 0.284602 0.271032
+vt 0.290982 0.271032
+vt 0.290810 0.273148
+vt 0.284432 0.273148
+vt 0.290810 0.275262
+vt 0.284432 0.275262
+vt 0.278140 0.273148
+vt 0.278157 0.271909
+vt 0.271931 0.273148
+vt 0.271948 0.271909
+vt 0.278140 0.275262
+vt 0.271931 0.275262
+vt 0.278208 0.271290
+vt 0.278309 0.271032
+vt 0.271998 0.271290
+vt 0.272097 0.271032
+vt 0.259765 0.271909
+vt 0.259813 0.271290
+vt 0.265867 0.271290
+vt 0.265818 0.271909
+vt 0.259910 0.271032
+vt 0.265965 0.271032
+vt 0.265802 0.273148
+vt 0.259749 0.273148
+vt 0.265802 0.275262
+vt 0.259749 0.275262
+vt 0.253769 0.273148
+vt 0.253785 0.271909
+vt 0.247860 0.273148
+vt 0.247876 0.271909
+vt 0.253769 0.275262
+vt 0.247860 0.275262
+vt 0.253833 0.271290
+vt 0.253928 0.271032
+vt 0.247922 0.271290
+vt 0.248015 0.271032
+vt 0.236255 0.271909
+vt 0.236300 0.271290
+vt 0.242079 0.271290
+vt 0.242033 0.271909
+vt 0.236389 0.271032
+vt 0.242170 0.271032
+vt 0.242018 0.273148
+vt 0.236240 0.273148
+vt 0.242018 0.275262
+vt 0.236241 0.275262
+vt 0.230524 0.273148
+vt 0.230539 0.271909
+vt 0.224867 0.273148
+vt 0.224881 0.271909
+vt 0.230524 0.275262
+vt 0.224867 0.275262
+vt 0.230582 0.271290
+vt 0.230670 0.271032
+vt 0.224923 0.271290
+vt 0.225009 0.271032
+vt 0.213730 0.271909
+vt 0.213770 0.271290
+vt 0.219320 0.271290
+vt 0.219279 0.271909
+vt 0.213851 0.271032
+vt 0.219403 0.271032
+vt 0.219265 0.273148
+vt 0.213717 0.273148
+vt 0.219265 0.275262
+vt 0.213717 0.275262
+vt 0.208219 0.273148
+vt 0.208232 0.271909
+vt 0.202770 0.273148
+vt 0.202782 0.271909
+vt 0.208219 0.275262
+vt 0.202770 0.275262
+vt 0.208271 0.271290
+vt 0.208350 0.271032
+vt 0.202820 0.271290
+vt 0.202896 0.271032
+vt 0.192018 0.271909
+vt 0.192054 0.271290
+vt 0.197415 0.271290
+vt 0.197378 0.271909
+vt 0.192125 0.271032
+vt 0.197489 0.271032
+vt 0.197366 0.273148
+vt 0.192006 0.273148
+vt 0.197366 0.275262
+vt 0.192006 0.275262
+vt 0.186688 0.273148
+vt 0.186699 0.271909
+vt 0.181408 0.273148
+vt 0.181419 0.271909
+vt 0.186688 0.275262
+vt 0.181408 0.275262
+vt 0.186733 0.271290
+vt 0.186802 0.271032
+vt 0.181452 0.271290
+vt 0.181519 0.271032
+vt 0.170977 0.271909
+vt 0.171008 0.271290
+vt 0.176208 0.271290
+vt 0.176177 0.271909
+vt 0.171069 0.271032
+vt 0.176272 0.271032
+vt 0.176166 0.273148
+vt 0.170967 0.273148
+vt 0.176166 0.275262
+vt 0.170967 0.275262
+vt 0.165817 0.273148
+vt 0.165826 0.271909
+vt 0.160722 0.273148
+vt 0.160731 0.271909
+vt 0.165817 0.275262
+vt 0.160722 0.275262
+vt 0.165856 0.271290
+vt 0.165915 0.271032
+vt 0.160759 0.271290
+vt 0.160815 0.271032
+vt 0.140350 0.271953
+vt 0.140351 0.271348
+vt 0.141586 0.271320
+vt 0.141585 0.271935
+vt 0.143681 0.271305
+vt 0.143668 0.271922
+vt 0.140335 0.271103
+vt 0.141587 0.271066
+vt 0.143706 0.271049
+vt 0.141585 0.273168
+vt 0.140344 0.273181
+vt 0.141585 0.275278
+vt 0.140338 0.275288
+vt 0.143664 0.273158
+vt 0.143664 0.275270
+vt 0.139634 0.273194
+vt 0.139664 0.271976
+vt 0.139148 0.273207
+vt 0.139229 0.271995
+vt 0.139610 0.275298
+vt 0.139087 0.275309
+vt 0.139696 0.271393
+vt 0.139685 0.271173
+vt 0.139328 0.271427
+vt 0.139412 0.271256
+vt 0.471064 0.065777
+vt 0.471060 0.062915
+vt 0.478305 0.062915
+vt 0.478307 0.065777
+vt 0.485558 0.062915
+vt 0.485560 0.065777
+vt 0.471054 0.060348
+vt 0.478300 0.060348
+vt 0.485555 0.060348
+vt 0.478308 0.068588
+vt 0.471065 0.068588
+vt 0.485560 0.068588
+vt 0.463834 0.068588
+vt 0.463832 0.065777
+vt 0.456618 0.068588
+vt 0.456616 0.065777
+vt 0.463828 0.062915
+vt 0.463821 0.060348
+vt 0.456611 0.062915
+vt 0.456602 0.060348
+vt 0.442240 0.065777
+vt 0.442234 0.062915
+vt 0.449412 0.062915
+vt 0.449418 0.065777
+vt 0.442221 0.060348
+vt 0.449401 0.060348
+vt 0.449419 0.068588
+vt 0.442242 0.068588
+vt 0.435087 0.068588
+vt 0.435085 0.065777
+vt 0.427958 0.068588
+vt 0.427955 0.065777
+vt 0.435078 0.062915
+vt 0.435064 0.060348
+vt 0.427948 0.062915
+vt 0.427933 0.060348
+vt 0.413782 0.065777
+vt 0.413773 0.062915
+vt 0.420845 0.062915
+vt 0.420854 0.065777
+vt 0.413756 0.060348
+vt 0.420829 0.060348
+vt 0.420856 0.068588
+vt 0.413785 0.068588
+vt 0.406745 0.068588
+vt 0.406742 0.065777
+vt 0.399739 0.068588
+vt 0.399736 0.065777
+vt 0.406733 0.062915
+vt 0.406714 0.060348
+vt 0.399726 0.062915
+vt 0.399706 0.060348
+vt 0.385832 0.065777
+vt 0.385821 0.062915
+vt 0.392755 0.062915
+vt 0.392765 0.065777
+vt 0.385799 0.060348
+vt 0.392734 0.060348
+vt 0.392769 0.068588
+vt 0.385835 0.068588
+vt 0.378940 0.068588
+vt 0.378936 0.065777
+vt 0.372083 0.068588
+vt 0.372079 0.065777
+vt 0.378925 0.062915
+vt 0.378902 0.060348
+vt 0.372068 0.062915
+vt 0.372045 0.060348
+vt 0.358489 0.065777
+vt 0.358477 0.062915
+vt 0.365252 0.062915
+vt 0.365264 0.065777
+vt 0.358452 0.060348
+vt 0.365228 0.060348
+vt 0.365268 0.068588
+vt 0.358493 0.068588
+vt 0.351760 0.068588
+vt 0.351756 0.065777
+vt 0.345069 0.068588
+vt 0.345065 0.065777
+vt 0.351743 0.062915
+vt 0.351718 0.060348
+vt 0.345052 0.062915
+vt 0.345026 0.060348
+vt 0.331812 0.065777
+vt 0.331799 0.062915
+vt 0.338404 0.062915
+vt 0.338417 0.065777
+vt 0.331772 0.060348
+vt 0.338378 0.060348
+vt 0.338422 0.068588
+vt 0.331817 0.068588
+vt 0.325255 0.068588
+vt 0.325250 0.065777
+vt 0.318735 0.068588
+vt 0.318731 0.065777
+vt 0.325237 0.062915
+vt 0.325210 0.060348
+vt 0.318717 0.062915
+vt 0.318690 0.060348
+vt 0.305821 0.065777
+vt 0.305807 0.062915
+vt 0.312241 0.062915
+vt 0.312255 0.065777
+vt 0.305780 0.060348
+vt 0.312214 0.060348
+vt 0.312259 0.068588
+vt 0.305826 0.068588
+vt 0.299434 0.068588
+vt 0.299430 0.065777
+vt 0.293084 0.068588
+vt 0.293080 0.065777
+vt 0.299416 0.062915
+vt 0.299388 0.060348
+vt 0.293066 0.062915
+vt 0.293038 0.060348
+vt 0.280504 0.065777
+vt 0.280490 0.062915
+vt 0.286758 0.062915
+vt 0.286771 0.065777
+vt 0.280463 0.060348
+vt 0.286730 0.060348
+vt 0.286776 0.068588
+vt 0.280508 0.068588
+vt 0.274280 0.068588
+vt 0.274276 0.065777
+vt 0.268092 0.068588
+vt 0.268087 0.065777
+vt 0.274262 0.062915
+vt 0.274235 0.060348
+vt 0.268074 0.062915
+vt 0.268047 0.060348
+vt 0.255825 0.065777
+vt 0.255811 0.062915
+vt 0.261924 0.062915
+vt 0.261937 0.065777
+vt 0.255785 0.060348
+vt 0.261897 0.060348
+vt 0.261942 0.068588
+vt 0.255829 0.068588
+vt 0.249753 0.068588
+vt 0.249749 0.065777
+vt 0.243713 0.068588
+vt 0.243709 0.065777
+vt 0.249736 0.062915
+vt 0.249710 0.060348
+vt 0.243696 0.062915
+vt 0.243671 0.060348
+vt 0.231733 0.065777
+vt 0.231721 0.062915
+vt 0.237692 0.062915
+vt 0.237704 0.065777
+vt 0.231696 0.060348
+vt 0.237666 0.060348
+vt 0.237708 0.068588
+vt 0.231737 0.068588
+vt 0.225799 0.068588
+vt 0.225795 0.065777
+vt 0.219893 0.068588
+vt 0.219889 0.065777
+vt 0.225783 0.062915
+vt 0.225759 0.060348
+vt 0.219877 0.062915
+vt 0.219853 0.060348
+vt 0.208168 0.065777
+vt 0.208157 0.062915
+vt 0.214002 0.062915
+vt 0.214014 0.065777
+vt 0.208134 0.060348
+vt 0.213979 0.060348
+vt 0.214017 0.068588
+vt 0.208172 0.068588
+vt 0.202355 0.068588
+vt 0.202351 0.065777
+vt 0.196566 0.068588
+vt 0.196562 0.065777
+vt 0.202340 0.062915
+vt 0.202318 0.060348
+vt 0.196552 0.062915
+vt 0.196530 0.060348
+vt 0.185072 0.065777
+vt 0.185062 0.062915
+vt 0.190790 0.062915
+vt 0.190800 0.065777
+vt 0.185042 0.060348
+vt 0.190769 0.060348
+vt 0.190803 0.068588
+vt 0.185075 0.068588
+vt 0.179390 0.068588
+vt 0.179386 0.065777
+vt 0.173754 0.068588
+vt 0.173751 0.065777
+vt 0.179377 0.062915
+vt 0.179357 0.060348
+vt 0.173741 0.062915
+vt 0.173723 0.060348
+vt 0.151693 0.065777
+vt 0.151685 0.062915
+vt 0.152830 0.062915
+vt 0.152838 0.065777
+vt 0.154978 0.062915
+vt 0.154986 0.065777
+vt 0.151671 0.060348
+vt 0.152815 0.060348
+vt 0.154962 0.060348
+vt 0.152840 0.068588
+vt 0.151695 0.068588
+vt 0.154988 0.068588
+vt 0.151219 0.068588
+vt 0.151216 0.065777
+vt 0.151076 0.068588
+vt 0.151074 0.065777
+vt 0.151209 0.062915
+vt 0.151195 0.060348
+vt 0.151067 0.062915
+vt 0.151053 0.060348
+vt 0.038037 0.286554
+vt 0.038037 0.282477
+vt 0.041246 0.283775
+vt 0.041246 0.287851
+vt 0.047037 0.284294
+vt 0.047037 0.288370
+vt 0.041246 0.292498
+vt 0.038037 0.291200
+vt 0.041246 0.297429
+vt 0.038037 0.296131
+vt 0.047037 0.293017
+vt 0.047037 0.297948
+vt 0.036550 0.289383
+vt 0.036550 0.284737
+vt 0.035923 0.287307
+vt 0.035923 0.282660
+vt 0.036550 0.294314
+vt 0.035923 0.292238
+vt 0.036550 0.280660
+vt 0.035923 0.278584
+vt 0.067232 0.286683
+vt 0.067232 0.282607
+vt 0.078201 0.281179
+vt 0.078201 0.285256
+vt 0.087459 0.279881
+vt 0.087459 0.283958
+vt 0.078201 0.289902
+vt 0.067232 0.291330
+vt 0.078201 0.294833
+vt 0.067232 0.296261
+vt 0.087459 0.288604
+vt 0.087459 0.293536
+vt 0.056272 0.292498
+vt 0.056272 0.287851
+vt 0.056272 0.297429
+vt 0.056272 0.283775
+vt 0.097087 0.282790
+vt 0.097086 0.287436
+vt 0.093291 0.287826
+vt 0.093291 0.283179
+vt 0.097086 0.292368
+vt 0.093291 0.292757
+vt 0.093291 0.279103
+vt 0.097089 0.278713
+vt 0.100248 0.278583
+vt 0.100241 0.282660
+vt 0.104163 0.278582
+vt 0.104145 0.282660
+vt 0.100238 0.287307
+vt 0.100238 0.292238
+vt 0.104138 0.287307
+vt 0.104138 0.292238
+vt 0.140333 0.282624
+vt 0.140335 0.278530
+vt 0.141585 0.278523
+vt 0.141585 0.282619
+vt 0.143664 0.278517
+vt 0.143664 0.282615
+vt 0.141585 0.287283
+vt 0.140332 0.287286
+vt 0.141585 0.292231
+vt 0.140332 0.292232
+vt 0.143664 0.287281
+vt 0.143664 0.292230
+vt 0.139586 0.287289
+vt 0.139588 0.282630
+vt 0.139026 0.287293
+vt 0.139032 0.282636
+vt 0.139586 0.292233
+vt 0.139026 0.292234
+vt 0.139595 0.278538
+vt 0.139050 0.278546
+vt 0.170967 0.282612
+vt 0.170967 0.278512
+vt 0.176166 0.278512
+vt 0.176166 0.282612
+vt 0.181408 0.278512
+vt 0.181408 0.282612
+vt 0.176166 0.287279
+vt 0.170967 0.287279
+vt 0.176166 0.292230
+vt 0.170967 0.292230
+vt 0.181408 0.287279
+vt 0.181408 0.292230
+vt 0.165817 0.287279
+vt 0.165817 0.282612
+vt 0.160722 0.287279
+vt 0.160722 0.282612
+vt 0.165817 0.292230
+vt 0.160722 0.292230
+vt 0.165817 0.278512
+vt 0.160722 0.278512
+vt 0.192006 0.282612
+vt 0.192006 0.278512
+vt 0.197366 0.278512
+vt 0.197366 0.282612
+vt 0.202770 0.278512
+vt 0.202770 0.282612
+vt 0.197366 0.287279
+vt 0.192006 0.287279
+vt 0.197366 0.292230
+vt 0.192006 0.292230
+vt 0.202770 0.287279
+vt 0.202770 0.292230
+vt 0.186688 0.287279
+vt 0.186688 0.282612
+vt 0.186688 0.292230
+vt 0.186688 0.278512
+vt 0.213717 0.282612
+vt 0.213717 0.278512
+vt 0.219265 0.278512
+vt 0.219265 0.282612
+vt 0.224867 0.278512
+vt 0.224867 0.282612
+vt 0.219265 0.287279
+vt 0.213717 0.287279
+vt 0.219265 0.292230
+vt 0.213717 0.292230
+vt 0.224867 0.287279
+vt 0.224867 0.292230
+vt 0.208219 0.287279
+vt 0.208219 0.282612
+vt 0.208219 0.292230
+vt 0.208219 0.278512
+vt 0.236241 0.282612
+vt 0.236241 0.278512
+vt 0.242018 0.278512
+vt 0.242018 0.282612
+vt 0.247860 0.278512
+vt 0.247860 0.282612
+vt 0.242018 0.287279
+vt 0.236240 0.287279
+vt 0.242018 0.292230
+vt 0.236241 0.292230
+vt 0.247860 0.287279
+vt 0.247860 0.292230
+vt 0.230524 0.287279
+vt 0.230524 0.282612
+vt 0.230524 0.292230
+vt 0.230524 0.278512
+vt 0.259749 0.282612
+vt 0.259749 0.278512
+vt 0.265802 0.278512
+vt 0.265802 0.282612
+vt 0.271931 0.278512
+vt 0.271931 0.282612
+vt 0.265802 0.287279
+vt 0.259749 0.287279
+vt 0.265802 0.292230
+vt 0.259749 0.292230
+vt 0.271931 0.287279
+vt 0.271931 0.292230
+vt 0.253769 0.287279
+vt 0.253769 0.282612
+vt 0.253769 0.292230
+vt 0.253769 0.278512
+vt 0.284432 0.282612
+vt 0.284432 0.278512
+vt 0.290810 0.278512
+vt 0.290810 0.282612
+vt 0.297277 0.278512
+vt 0.297277 0.282612
+vt 0.290810 0.287279
+vt 0.284432 0.287279
+vt 0.290810 0.292230
+vt 0.284432 0.292230
+vt 0.297277 0.287279
+vt 0.297277 0.292230
+vt 0.278140 0.287279
+vt 0.278140 0.282612
+vt 0.278140 0.292230
+vt 0.278140 0.278512
+vt 0.310492 0.282612
+vt 0.310492 0.278512
+vt 0.317245 0.278512
+vt 0.317245 0.282612
+vt 0.324099 0.278512
+vt 0.324099 0.282612
+vt 0.317245 0.287279
+vt 0.310492 0.287279
+vt 0.317245 0.292230
+vt 0.310492 0.292230
+vt 0.324099 0.287279
+vt 0.324099 0.292230
+vt 0.303837 0.287279
+vt 0.303837 0.282612
+vt 0.303837 0.292230
+vt 0.303837 0.278512
+vt 0.338120 0.282612
+vt 0.338120 0.278512
+vt 0.345290 0.278512
+vt 0.345290 0.282612
+vt 0.352570 0.278512
+vt 0.352570 0.282612
+vt 0.345290 0.287279
+vt 0.338120 0.287279
+vt 0.345290 0.292230
+vt 0.338120 0.292230
+vt 0.352570 0.287279
+vt 0.352570 0.292230
+vt 0.331056 0.287279
+vt 0.331056 0.282612
+vt 0.331056 0.292230
+vt 0.331056 0.278512
+vt 0.367463 0.282612
+vt 0.367463 0.278512
+vt 0.375075 0.278512
+vt 0.375075 0.282612
+vt 0.382796 0.278512
+vt 0.382796 0.282612
+vt 0.375075 0.287279
+vt 0.367463 0.287279
+vt 0.375075 0.292230
+vt 0.367463 0.292230
+vt 0.382796 0.287279
+vt 0.382796 0.292230
+vt 0.359961 0.287279
+vt 0.359961 0.282612
+vt 0.359961 0.292230
+vt 0.359961 0.278512
+vt 0.398566 0.282612
+vt 0.398566 0.278512
+vt 0.406607 0.278512
+vt 0.406607 0.282612
+vt 0.414746 0.278512
+vt 0.414746 0.282612
+vt 0.406607 0.287279
+vt 0.398566 0.287279
+vt 0.406607 0.292230
+vt 0.398566 0.292230
+vt 0.414746 0.287279
+vt 0.414746 0.292230
+vt 0.390628 0.287279
+vt 0.390628 0.282612
+vt 0.390628 0.292230
+vt 0.390628 0.278512
+vt 0.431306 0.282612
+vt 0.431306 0.278512
+vt 0.439711 0.278512
+vt 0.439711 0.282612
+vt 0.448189 0.278512
+vt 0.448189 0.282612
+vt 0.439711 0.287279
+vt 0.431306 0.287279
+vt 0.439711 0.292230
+vt 0.431306 0.292230
+vt 0.448189 0.287279
+vt 0.448189 0.292230
+vt 0.422982 0.287279
+vt 0.422982 0.282612
+vt 0.422982 0.292230
+vt 0.422982 0.278512
+vt 0.465334 0.282612
+vt 0.465334 0.278512
+vt 0.473980 0.278512
+vt 0.473980 0.282612
+vt 0.482660 0.278512
+vt 0.482660 0.282612
+vt 0.473980 0.287279
+vt 0.465334 0.287279
+vt 0.473980 0.292230
+vt 0.465334 0.292230
+vt 0.482660 0.287279
+vt 0.482660 0.292230
+vt 0.456734 0.287279
+vt 0.456734 0.282612
+vt 0.456734 0.292230
+vt 0.456734 0.278512
+vt 0.137037 0.282647
+vt 0.137018 0.287300
+vt 0.134592 0.287302
+vt 0.134616 0.282652
+vt 0.130566 0.287304
+vt 0.130593 0.282655
+vt 0.137018 0.292236
+vt 0.134592 0.292237
+vt 0.130566 0.292237
+vt 0.134690 0.278568
+vt 0.137094 0.278561
+vt 0.134836 0.275334
+vt 0.137207 0.275327
+vt 0.130673 0.278573
+vt 0.130834 0.275341
+vt 0.138382 0.278554
+vt 0.138345 0.282642
+vt 0.138455 0.275318
+vt 0.138333 0.287296
+vt 0.138333 0.292235
+vt 0.137682 0.271980
+vt 0.135517 0.271921
+vt 0.136244 0.271046
+vt 0.138085 0.271309
+vt 0.137244 0.270482
+vt 0.138604 0.270981
+vt 0.131620 0.271854
+vt 0.132528 0.270754
+vt 0.134287 0.269301
+vt 0.138951 0.271417
+vt 0.138744 0.272001
+vt 0.139224 0.271190
+vt 0.138577 0.273217
+vt 0.137396 0.273226
+vt 0.135080 0.273234
+vt 0.131102 0.273242
+vt 0.140175 0.270637
+vt 0.139963 0.269874
+vt 0.141593 0.269784
+vt 0.141591 0.270580
+vt 0.143847 0.269766
+vt 0.143797 0.270562
+vt 0.139740 0.268350
+vt 0.141595 0.268243
+vt 0.143888 0.268225
+vt 0.141589 0.270913
+vt 0.140288 0.270957
+vt 0.143747 0.270895
+vt 0.139584 0.271043
+vt 0.139241 0.270764
+vt 0.138499 0.270099
+vt 0.137693 0.268629
+vt 0.171293 0.270543
+vt 0.171416 0.269748
+vt 0.176633 0.269748
+vt 0.176506 0.270543
+vt 0.181894 0.269748
+vt 0.181761 0.270543
+vt 0.171518 0.268208
+vt 0.176740 0.268208
+vt 0.182004 0.268208
+vt 0.176378 0.270877
+vt 0.171171 0.270877
+vt 0.181629 0.270877
+vt 0.166012 0.270877
+vt 0.166130 0.270543
+vt 0.160909 0.270877
+vt 0.161022 0.270543
+vt 0.166247 0.269748
+vt 0.166345 0.268208
+vt 0.161134 0.269748
+vt 0.161228 0.268208
+vt 0.192385 0.270543
+vt 0.192528 0.269748
+vt 0.197905 0.269748
+vt 0.197758 0.270543
+vt 0.203326 0.269748
+vt 0.203175 0.270543
+vt 0.192646 0.268208
+vt 0.198028 0.268208
+vt 0.203453 0.268208
+vt 0.197611 0.270877
+vt 0.192243 0.270877
+vt 0.203023 0.270877
+vt 0.186917 0.270877
+vt 0.187054 0.270543
+vt 0.187191 0.269748
+vt 0.187306 0.268208
+vt 0.214146 0.270543
+vt 0.214307 0.269748
+vt 0.219872 0.269748
+vt 0.219707 0.270543
+vt 0.225490 0.269748
+vt 0.225320 0.270543
+vt 0.214442 0.268208
+vt 0.220010 0.268208
+vt 0.225632 0.268208
+vt 0.219541 0.270877
+vt 0.213985 0.270877
+vt 0.225150 0.270877
+vt 0.208480 0.270877
+vt 0.208636 0.270543
+vt 0.208793 0.269748
+vt 0.208923 0.268208
+vt 0.236716 0.270543
+vt 0.236895 0.269748
+vt 0.242687 0.269748
+vt 0.242505 0.270543
+vt 0.248543 0.269748
+vt 0.248357 0.270543
+vt 0.237044 0.268208
+vt 0.242839 0.268208
+vt 0.248698 0.268208
+vt 0.242322 0.270877
+vt 0.236538 0.270877
+vt 0.248171 0.270877
+vt 0.230815 0.270877
+vt 0.230989 0.270543
+vt 0.231164 0.269748
+vt 0.231309 0.268208
+vt 0.260264 0.270543
+vt 0.260458 0.269748
+vt 0.266522 0.269748
+vt 0.266326 0.270543
+vt 0.272662 0.269748
+vt 0.272463 0.270543
+vt 0.260619 0.268208
+vt 0.266686 0.268208
+vt 0.272828 0.268208
+vt 0.266129 0.270877
+vt 0.260071 0.270877
+vt 0.272263 0.270877
+vt 0.254086 0.270877
+vt 0.254276 0.270543
+vt 0.254466 0.269748
+vt 0.254624 0.268208
+vt 0.284977 0.270543
+vt 0.285181 0.269748
+vt 0.291566 0.269748
+vt 0.291360 0.270543
+vt 0.298038 0.269748
+vt 0.297831 0.270543
+vt 0.285351 0.268208
+vt 0.291738 0.268208
+vt 0.298211 0.268208
+vt 0.291154 0.270877
+vt 0.284773 0.270877
+vt 0.297623 0.270877
+vt 0.278477 0.270877
+vt 0.278679 0.270543
+vt 0.278881 0.269748
+vt 0.279049 0.268208
+vt 0.311049 0.270543
+vt 0.311259 0.269748
+vt 0.318012 0.269748
+vt 0.317803 0.270543
+vt 0.324864 0.269748
+vt 0.324655 0.270543
+vt 0.311433 0.268208
+vt 0.318186 0.268208
+vt 0.325037 0.268208
+vt 0.317593 0.270877
+vt 0.310840 0.270877
+vt 0.324446 0.270877
+vt 0.304185 0.270877
+vt 0.304393 0.270543
+vt 0.304602 0.269748
+vt 0.304776 0.268208
+vt 0.338668 0.270543
+vt 0.338874 0.269748
+vt 0.346035 0.269748
+vt 0.345832 0.270543
+vt 0.353303 0.269748
+vt 0.353103 0.270543
+vt 0.339045 0.268208
+vt 0.346204 0.268208
+vt 0.353469 0.268208
+vt 0.345629 0.270877
+vt 0.338462 0.270877
+vt 0.352903 0.270877
+vt 0.331402 0.270877
+vt 0.331610 0.270543
+vt 0.331817 0.269748
+vt 0.331990 0.268208
+vt 0.367972 0.270543
+vt 0.368162 0.269748
+vt 0.375753 0.269748
+vt 0.375568 0.270543
+vt 0.383451 0.269748
+vt 0.383272 0.270543
+vt 0.368321 0.268208
+vt 0.375907 0.268208
+vt 0.383599 0.268208
+vt 0.375383 0.270877
+vt 0.367781 0.270877
+vt 0.383094 0.270877
+vt 0.360287 0.270877
+vt 0.360483 0.270543
+vt 0.360679 0.269748
+vt 0.360842 0.268208
+vt 0.398999 0.270543
+vt 0.399161 0.269748
+vt 0.407167 0.269748
+vt 0.407014 0.270543
+vt 0.415269 0.269748
+vt 0.415127 0.270543
+vt 0.399297 0.268208
+vt 0.407295 0.268208
+vt 0.415388 0.268208
+vt 0.406862 0.270877
+vt 0.398837 0.270877
+vt 0.414984 0.270877
+vt 0.390913 0.270877
+vt 0.391084 0.270543
+vt 0.391255 0.269748
+vt 0.391397 0.268208
+vt 0.431624 0.270543
+vt 0.431743 0.269748
+vt 0.440101 0.269748
+vt 0.439994 0.270543
+vt 0.448529 0.269748
+vt 0.448436 0.270543
+vt 0.431843 0.268208
+vt 0.440189 0.268208
+vt 0.448606 0.268208
+vt 0.439888 0.270877
+vt 0.431505 0.270877
+vt 0.448344 0.270877
+vt 0.423201 0.270877
+vt 0.423332 0.270543
+vt 0.423464 0.269748
+vt 0.423573 0.268208
+vt 0.465504 0.270543
+vt 0.465567 0.269748
+vt 0.474156 0.269748
+vt 0.474108 0.270543
+vt 0.482778 0.269748
+vt 0.482746 0.270543
+vt 0.465620 0.268208
+vt 0.474196 0.268208
+vt 0.482805 0.268208
+vt 0.474060 0.270877
+vt 0.465440 0.270877
+vt 0.482714 0.270877
+vt 0.456865 0.270877
+vt 0.456943 0.270543
+vt 0.457021 0.269748
+vt 0.457087 0.268208
+vt 0.147115 0.100211
+vt 0.147223 0.097340
+vt 0.148322 0.097365
+vt 0.148211 0.100217
+vt 0.150385 0.097384
+vt 0.150266 0.100221
+vt 0.148458 0.103023
+vt 0.147368 0.103023
+vt 0.149098 0.106093
+vt 0.148018 0.106093
+vt 0.150502 0.103023
+vt 0.151124 0.106093
+vt 0.146915 0.103023
+vt 0.146660 0.100203
+vt 0.146780 0.103023
+vt 0.146525 0.100196
+vt 0.147569 0.106093
+vt 0.147435 0.106093
+vt 0.146766 0.097312
+vt 0.146630 0.097282
+vt 0.097763 0.262237
+vt 0.097530 0.265988
+vt 0.094918 0.266149
+vt 0.095843 0.262210
+vt 0.092428 0.266362
+vt 0.094279 0.262174
+vt 0.095020 0.257209
+vt 0.097558 0.257485
+vt 0.093767 0.251051
+vt 0.097244 0.251690
+vt 0.092631 0.256854
+vt 0.087536 0.250094
+vt 0.100394 0.257599
+vt 0.100392 0.262250
+vt 0.104529 0.257651
+vt 0.104523 0.262256
+vt 0.100394 0.251965
+vt 0.104529 0.252105
+vt 0.100385 0.265931
+vt 0.104504 0.265922
+vt 0.139511 0.262261
+vt 0.139593 0.265749
+vt 0.137158 0.265935
+vt 0.136858 0.262314
+vt 0.133164 0.266081
+vt 0.132730 0.262351
+vt 0.136758 0.258062
+vt 0.139484 0.258078
+vt 0.136758 0.253270
+vt 0.139484 0.253338
+vt 0.132585 0.258020
+vt 0.132585 0.253132
+vt 0.141597 0.258076
+vt 0.141597 0.262233
+vt 0.143930 0.258068
+vt 0.143926 0.262220
+vt 0.141597 0.253359
+vt 0.143930 0.253357
+vt 0.141596 0.265674
+vt 0.143913 0.265658
+vt 0.179122 0.100226
+vt 0.179316 0.097403
+vt 0.184840 0.097403
+vt 0.184638 0.100226
+vt 0.190403 0.097403
+vt 0.190194 0.100226
+vt 0.184801 0.103023
+vt 0.179282 0.103023
+vt 0.185320 0.106093
+vt 0.179786 0.106093
+vt 0.190363 0.103023
+vt 0.190899 0.106093
+vt 0.173814 0.103023
+vt 0.173654 0.100226
+vt 0.168408 0.103023
+vt 0.168242 0.100226
+vt 0.174313 0.106093
+vt 0.168913 0.106093
+vt 0.173839 0.097403
+vt 0.168416 0.097403
+vt 0.171610 0.262207
+vt 0.171579 0.265642
+vt 0.166404 0.265642
+vt 0.166433 0.262207
+vt 0.161284 0.265642
+vt 0.161312 0.262207
+vt 0.166443 0.258059
+vt 0.171620 0.258059
+vt 0.166443 0.253354
+vt 0.171620 0.253354
+vt 0.161322 0.258059
+vt 0.161322 0.253354
+vt 0.176846 0.258059
+vt 0.176835 0.262207
+vt 0.182115 0.258059
+vt 0.182104 0.262207
+vt 0.176846 0.253354
+vt 0.182115 0.253354
+vt 0.176803 0.265642
+vt 0.182070 0.265642
+vt 0.201406 0.100226
+vt 0.201628 0.097403
+vt 0.207292 0.097403
+vt 0.207064 0.100226
+vt 0.212994 0.097403
+vt 0.212760 0.100226
+vt 0.207249 0.103023
+vt 0.201585 0.103023
+vt 0.207834 0.106093
+vt 0.202154 0.106093
+vt 0.212949 0.103023
+vt 0.213550 0.106093
+vt 0.195957 0.103023
+vt 0.195783 0.100226
+vt 0.196510 0.106093
+vt 0.195998 0.097403
+vt 0.192753 0.262207
+vt 0.192717 0.265642
+vt 0.187374 0.265642
+vt 0.187409 0.262207
+vt 0.187420 0.258059
+vt 0.192765 0.258059
+vt 0.187420 0.253354
+vt 0.192765 0.253354
+vt 0.198150 0.258059
+vt 0.198138 0.262207
+vt 0.203579 0.258059
+vt 0.203567 0.262207
+vt 0.198150 0.253354
+vt 0.203579 0.253354
+vt 0.198101 0.265642
+vt 0.203529 0.265642
+vt 0.224270 0.100226
+vt 0.224514 0.097403
+vt 0.230336 0.097403
+vt 0.230087 0.100226
+vt 0.236202 0.097403
+vt 0.235947 0.100226
+vt 0.230289 0.103023
+vt 0.224468 0.103023
+vt 0.230931 0.106093
+vt 0.225097 0.106093
+vt 0.236153 0.103023
+vt 0.236808 0.106093
+vt 0.218688 0.103023
+vt 0.218495 0.100226
+vt 0.219303 0.106093
+vt 0.218734 0.097403
+vt 0.214563 0.262207
+vt 0.214522 0.265642
+vt 0.209002 0.265642
+vt 0.209041 0.262207
+vt 0.209054 0.258059
+vt 0.214576 0.258059
+vt 0.209054 0.253354
+vt 0.214576 0.253354
+vt 0.220148 0.258059
+vt 0.220135 0.262207
+vt 0.225774 0.258059
+vt 0.225760 0.262207
+vt 0.220148 0.253354
+vt 0.225774 0.253354
+vt 0.220093 0.265642
+vt 0.225717 0.265642
+vt 0.247806 0.100226
+vt 0.248069 0.097403
+vt 0.254074 0.097403
+vt 0.253808 0.100226
+vt 0.260129 0.097403
+vt 0.259860 0.100226
+vt 0.254024 0.103023
+vt 0.248019 0.103023
+vt 0.254710 0.106093
+vt 0.248696 0.106093
+vt 0.260079 0.103023
+vt 0.260773 0.106093
+vt 0.242063 0.103023
+vt 0.241853 0.100226
+vt 0.242729 0.106093
+vt 0.242112 0.097403
+vt 0.237178 0.262207
+vt 0.237133 0.265642
+vt 0.231396 0.265642
+vt 0.231440 0.262207
+vt 0.231454 0.258059
+vt 0.237192 0.258059
+vt 0.231454 0.253354
+vt 0.237192 0.253354
+vt 0.242991 0.258059
+vt 0.242976 0.262207
+vt 0.248854 0.258059
+vt 0.248838 0.262207
+vt 0.242991 0.253354
+vt 0.248854 0.253354
+vt 0.242931 0.265642
+vt 0.248792 0.265642
+vt 0.272121 0.100226
+vt 0.272395 0.097403
+vt 0.278609 0.097403
+vt 0.278333 0.100226
+vt 0.284879 0.097403
+vt 0.284601 0.100226
+vt 0.278558 0.103023
+vt 0.272344 0.103023
+vt 0.279271 0.106093
+vt 0.273052 0.106093
+vt 0.284827 0.103023
+vt 0.285544 0.106093
+vt 0.266185 0.103023
+vt 0.265963 0.100226
+vt 0.266887 0.106093
+vt 0.266236 0.097403
+vt 0.260764 0.262207
+vt 0.260715 0.265642
+vt 0.254719 0.265642
+vt 0.254766 0.262207
+vt 0.254782 0.258059
+vt 0.260780 0.258059
+vt 0.254782 0.253354
+vt 0.260780 0.253354
+vt 0.266850 0.258059
+vt 0.266833 0.262207
+vt 0.272994 0.258059
+vt 0.272978 0.262207
+vt 0.266850 0.253354
+vt 0.272994 0.253354
+vt 0.266784 0.265642
+vt 0.272928 0.265642
+vt 0.297314 0.100226
+vt 0.297593 0.097403
+vt 0.304039 0.097403
+vt 0.303761 0.100226
+vt 0.310546 0.097403
+vt 0.310269 0.100226
+vt 0.303987 0.103023
+vt 0.297541 0.103023
+vt 0.304706 0.106093
+vt 0.298261 0.106093
+vt 0.310495 0.103023
+vt 0.311211 0.106093
+vt 0.291155 0.103023
+vt 0.290928 0.100226
+vt 0.291874 0.106093
+vt 0.291207 0.097403
+vt 0.285504 0.262207
+vt 0.285453 0.265642
+vt 0.279150 0.265642
+vt 0.279200 0.262207
+vt 0.279217 0.258059
+vt 0.285521 0.258059
+vt 0.279217 0.253354
+vt 0.285521 0.253354
+vt 0.291909 0.258059
+vt 0.291892 0.262207
+vt 0.298384 0.258059
+vt 0.298367 0.262207
+vt 0.291909 0.253354
+vt 0.298384 0.253354
+vt 0.291841 0.265642
+vt 0.298315 0.265642
+vt 0.323475 0.100226
+vt 0.323748 0.097403
+vt 0.330445 0.097403
+vt 0.330175 0.100226
+vt 0.337206 0.097403
+vt 0.336940 0.100226
+vt 0.330395 0.103023
+vt 0.323698 0.103023
+vt 0.331094 0.106093
+vt 0.324405 0.106093
+vt 0.337157 0.103023
+vt 0.337846 0.106093
+vt 0.317065 0.103023
+vt 0.316840 0.100226
+vt 0.317777 0.106093
+vt 0.317116 0.097403
+vt 0.311590 0.262207
+vt 0.311537 0.265642
+vt 0.304880 0.265642
+vt 0.304932 0.262207
+vt 0.304949 0.258059
+vt 0.311607 0.258059
+vt 0.304949 0.253354
+vt 0.311607 0.253354
+vt 0.318360 0.258059
+vt 0.318343 0.262207
+vt 0.325211 0.258059
+vt 0.325194 0.262207
+vt 0.318360 0.253354
+vt 0.325211 0.253354
+vt 0.318291 0.265642
+vt 0.325142 0.265642
+vt 0.350667 0.100226
+vt 0.350923 0.097403
+vt 0.357879 0.097403
+vt 0.357628 0.100226
+vt 0.364899 0.097403
+vt 0.364656 0.100226
+vt 0.357833 0.103023
+vt 0.350876 0.103023
+vt 0.358481 0.106093
+vt 0.351540 0.106093
+vt 0.364855 0.103023
+vt 0.365485 0.106093
+vt 0.343984 0.103023
+vt 0.343770 0.100226
+vt 0.344661 0.106093
+vt 0.344032 0.097403
+vt 0.339199 0.262207
+vt 0.339148 0.265642
+vt 0.332094 0.265642
+vt 0.332145 0.262207
+vt 0.332163 0.258059
+vt 0.339216 0.258059
+vt 0.332163 0.253354
+vt 0.339216 0.253354
+vt 0.346374 0.258059
+vt 0.346357 0.262207
+vt 0.353636 0.258059
+vt 0.353619 0.262207
+vt 0.346374 0.253354
+vt 0.353636 0.253354
+vt 0.346306 0.265642
+vt 0.353569 0.265642
+vt 0.378904 0.100226
+vt 0.379131 0.097403
+vt 0.386341 0.097403
+vt 0.386123 0.100226
+vt 0.393611 0.097403
+vt 0.393403 0.100226
+vt 0.386302 0.103023
+vt 0.379090 0.103023
+vt 0.386866 0.106093
+vt 0.379679 0.106093
+vt 0.393573 0.103023
+vt 0.394112 0.106093
+vt 0.371941 0.103023
+vt 0.371748 0.100226
+vt 0.372551 0.106093
+vt 0.371983 0.097403
+vt 0.368465 0.262207
+vt 0.368417 0.265642
+vt 0.360940 0.265642
+vt 0.360989 0.262207
+vt 0.361005 0.258059
+vt 0.368481 0.258059
+vt 0.361005 0.253354
+vt 0.368481 0.253354
+vt 0.376062 0.258059
+vt 0.376046 0.262207
+vt 0.383748 0.258059
+vt 0.383733 0.262207
+vt 0.376062 0.253354
+vt 0.383748 0.253354
+vt 0.376000 0.265642
+vt 0.383689 0.265642
+vt 0.408140 0.100226
+vt 0.408325 0.097403
+vt 0.415764 0.097403
+vt 0.415591 0.100226
+vt 0.423254 0.097403
+vt 0.423094 0.100226
+vt 0.415733 0.103023
+vt 0.408292 0.103023
+vt 0.416181 0.106093
+vt 0.408772 0.106093
+vt 0.423225 0.103023
+vt 0.423639 0.106093
+vt 0.400904 0.103023
+vt 0.400743 0.100226
+vt 0.401415 0.106093
+vt 0.400940 0.097403
+vt 0.399418 0.262207
+vt 0.399378 0.265642
+vt 0.391482 0.265642
+vt 0.391525 0.262207
+vt 0.391539 0.258059
+vt 0.399432 0.258059
+vt 0.391539 0.253354
+vt 0.399432 0.253354
+vt 0.407422 0.258059
+vt 0.407410 0.262207
+vt 0.415507 0.258059
+vt 0.415495 0.262207
+vt 0.407422 0.253354
+vt 0.415507 0.253354
+vt 0.407371 0.265642
+vt 0.415460 0.265642
+vt 0.438242 0.100226
+vt 0.438373 0.097403
+vt 0.445995 0.097403
+vt 0.445879 0.100226
+vt 0.453652 0.097403
+vt 0.453552 0.100226
+vt 0.445974 0.103023
+vt 0.438350 0.103023
+vt 0.446275 0.106093
+vt 0.438690 0.106093
+vt 0.453634 0.103023
+vt 0.453895 0.106093
+vt 0.430765 0.103023
+vt 0.430646 0.100226
+vt 0.431143 0.106093
+vt 0.430791 0.097403
+vt 0.431932 0.262207
+vt 0.431902 0.265642
+vt 0.423639 0.265642
+vt 0.423672 0.262207
+vt 0.423683 0.258059
+vt 0.431942 0.258059
+vt 0.423683 0.253354
+vt 0.431942 0.253354
+vt 0.440278 0.258059
+vt 0.440269 0.262207
+vt 0.448684 0.258059
+vt 0.448676 0.262207
+vt 0.440278 0.253354
+vt 0.448684 0.253354
+vt 0.440242 0.265642
+vt 0.448653 0.265642
+vt 0.468988 0.100226
+vt 0.469056 0.097403
+vt 0.476793 0.097403
+vt 0.476742 0.100226
+vt 0.484546 0.097403
+vt 0.484512 0.100226
+vt 0.476784 0.103023
+vt 0.469044 0.103023
+vt 0.476918 0.106093
+vt 0.469221 0.106093
+vt 0.484540 0.103023
+vt 0.484629 0.106093
+vt 0.461326 0.103023
+vt 0.461257 0.100226
+vt 0.461545 0.106093
+vt 0.461341 0.097403
+vt 0.465667 0.262207
+vt 0.465652 0.265642
+vt 0.457126 0.265642
+vt 0.457145 0.262207
+vt 0.457152 0.258059
+vt 0.465673 0.258059
+vt 0.457152 0.253354
+vt 0.465673 0.253354
+vt 0.474236 0.258059
+vt 0.474232 0.262207
+vt 0.482832 0.258059
+vt 0.482829 0.262207
+vt 0.474236 0.253354
+vt 0.482832 0.253354
+vt 0.474220 0.265642
+vt 0.482821 0.265642
+vt 0.465673 0.243164
+vt 0.457152 0.243164
+vt 0.457152 0.238510
+vt 0.465673 0.238510
+vt 0.457152 0.234706
+vt 0.465673 0.234706
+vt 0.448684 0.243164
+vt 0.448684 0.238510
+vt 0.448684 0.234706
+vt 0.474236 0.238510
+vt 0.474236 0.243164
+vt 0.482832 0.238510
+vt 0.482832 0.243164
+vt 0.474236 0.234706
+vt 0.482832 0.234706
+vt 0.474236 0.248251
+vt 0.465673 0.248251
+vt 0.482832 0.248251
+vt 0.457152 0.248251
+vt 0.448684 0.248251
+vt 0.431942 0.243164
+vt 0.423683 0.243164
+vt 0.423683 0.238510
+vt 0.431942 0.238510
+vt 0.423683 0.234706
+vt 0.431942 0.234706
+vt 0.415507 0.243164
+vt 0.415507 0.238510
+vt 0.415507 0.234706
+vt 0.440278 0.238510
+vt 0.440278 0.243164
+vt 0.440278 0.234706
+vt 0.440278 0.248251
+vt 0.431942 0.248251
+vt 0.423683 0.248251
+vt 0.415507 0.248251
+vt 0.399432 0.243164
+vt 0.391539 0.243164
+vt 0.391539 0.238510
+vt 0.399432 0.238510
+vt 0.391539 0.234706
+vt 0.399432 0.234706
+vt 0.383748 0.243164
+vt 0.383748 0.238510
+vt 0.383748 0.234706
+vt 0.407422 0.238510
+vt 0.407422 0.243164
+vt 0.407422 0.234706
+vt 0.407422 0.248251
+vt 0.399432 0.248251
+vt 0.391539 0.248251
+vt 0.383748 0.248251
+vt 0.368481 0.243164
+vt 0.361005 0.243164
+vt 0.361005 0.238510
+vt 0.368481 0.238510
+vt 0.361005 0.234706
+vt 0.368481 0.234706
+vt 0.353636 0.243164
+vt 0.353636 0.238510
+vt 0.353636 0.234706
+vt 0.376062 0.238510
+vt 0.376062 0.243164
+vt 0.376062 0.234706
+vt 0.376062 0.248251
+vt 0.368481 0.248251
+vt 0.361005 0.248251
+vt 0.353636 0.248251
+vt 0.339216 0.243164
+vt 0.332163 0.243164
+vt 0.332163 0.238510
+vt 0.339216 0.238510
+vt 0.332163 0.234706
+vt 0.339216 0.234706
+vt 0.325211 0.243164
+vt 0.325211 0.238510
+vt 0.325211 0.234706
+vt 0.346374 0.238510
+vt 0.346374 0.243164
+vt 0.346374 0.234706
+vt 0.346374 0.248251
+vt 0.339216 0.248251
+vt 0.332163 0.248251
+vt 0.325211 0.248251
+vt 0.311607 0.243164
+vt 0.304949 0.243164
+vt 0.304949 0.238510
+vt 0.311607 0.238510
+vt 0.304949 0.234706
+vt 0.311607 0.234706
+vt 0.298384 0.243164
+vt 0.298384 0.238510
+vt 0.298384 0.234706
+vt 0.318360 0.238510
+vt 0.318360 0.243164
+vt 0.318360 0.234706
+vt 0.318360 0.248251
+vt 0.311607 0.248251
+vt 0.304949 0.248251
+vt 0.298384 0.248251
+vt 0.285521 0.243164
+vt 0.279217 0.243164
+vt 0.279217 0.238510
+vt 0.285521 0.238510
+vt 0.279217 0.234706
+vt 0.285521 0.234706
+vt 0.272994 0.243164
+vt 0.272994 0.238510
+vt 0.272994 0.234706
+vt 0.291909 0.238510
+vt 0.291909 0.243164
+vt 0.291909 0.234706
+vt 0.291909 0.248251
+vt 0.285521 0.248251
+vt 0.279217 0.248251
+vt 0.272994 0.248251
+vt 0.260780 0.243164
+vt 0.254782 0.243164
+vt 0.254782 0.238510
+vt 0.260780 0.238510
+vt 0.254782 0.234706
+vt 0.260780 0.234706
+vt 0.248854 0.243164
+vt 0.248854 0.238510
+vt 0.248854 0.234706
+vt 0.266850 0.238510
+vt 0.266850 0.243164
+vt 0.266850 0.234706
+vt 0.266850 0.248251
+vt 0.260780 0.248251
+vt 0.254782 0.248251
+vt 0.248854 0.248251
+vt 0.237192 0.243164
+vt 0.231454 0.243164
+vt 0.231454 0.238510
+vt 0.237192 0.238510
+vt 0.231454 0.234706
+vt 0.237192 0.234706
+vt 0.225774 0.243164
+vt 0.225774 0.238510
+vt 0.225774 0.234706
+vt 0.242991 0.238510
+vt 0.242991 0.243164
+vt 0.242991 0.234706
+vt 0.242991 0.248251
+vt 0.237192 0.248251
+vt 0.231454 0.248251
+vt 0.225774 0.248251
+vt 0.214576 0.243164
+vt 0.209054 0.243164
+vt 0.209054 0.238510
+vt 0.214576 0.238510
+vt 0.209054 0.234706
+vt 0.214576 0.234706
+vt 0.203579 0.243164
+vt 0.203579 0.238510
+vt 0.203579 0.234706
+vt 0.220148 0.238510
+vt 0.220148 0.243164
+vt 0.220148 0.234706
+vt 0.220148 0.248251
+vt 0.214576 0.248251
+vt 0.209054 0.248251
+vt 0.203579 0.248251
+vt 0.192765 0.243164
+vt 0.187420 0.243164
+vt 0.187420 0.238510
+vt 0.192765 0.238510
+vt 0.187420 0.234706
+vt 0.192765 0.234706
+vt 0.182115 0.243164
+vt 0.182115 0.238510
+vt 0.182115 0.234706
+vt 0.198150 0.238510
+vt 0.198150 0.243164
+vt 0.198150 0.234706
+vt 0.198150 0.248251
+vt 0.192765 0.248251
+vt 0.187420 0.248251
+vt 0.182115 0.248251
+vt 0.171620 0.243164
+vt 0.166443 0.243164
+vt 0.166443 0.238510
+vt 0.171620 0.238510
+vt 0.166443 0.234706
+vt 0.171620 0.234706
+vt 0.161322 0.243164
+vt 0.161322 0.238510
+vt 0.161322 0.234706
+vt 0.176846 0.238510
+vt 0.176846 0.243164
+vt 0.176846 0.234706
+vt 0.176846 0.248251
+vt 0.171620 0.248251
+vt 0.166443 0.248251
+vt 0.161322 0.248251
+vt 0.139484 0.243037
+vt 0.139484 0.238340
+vt 0.141597 0.238470
+vt 0.141597 0.243133
+vt 0.143930 0.238490
+vt 0.143930 0.243148
+vt 0.139484 0.234521
+vt 0.141597 0.234671
+vt 0.143930 0.234689
+vt 0.141597 0.248237
+vt 0.139484 0.248180
+vt 0.143930 0.248244
+vt 0.136758 0.248028
+vt 0.136758 0.242787
+vt 0.132585 0.247734
+vt 0.132585 0.242310
+vt 0.136758 0.237998
+vt 0.136758 0.234112
+vt 0.132585 0.237344
+vt 0.132585 0.233320
+vt 0.097171 0.237698
+vt 0.093472 0.236082
+vt 0.093494 0.229498
+vt 0.097176 0.231188
+vt 0.093494 0.224370
+vt 0.097176 0.225968
+vt 0.087935 0.232778
+vt 0.087967 0.226329
+vt 0.087967 0.221434
+vt 0.100394 0.232033
+vt 0.100394 0.238443
+vt 0.104529 0.232668
+vt 0.104529 0.238905
+vt 0.100394 0.226845
+vt 0.104529 0.227620
+vt 0.100394 0.245333
+vt 0.097154 0.244814
+vt 0.104529 0.245620
+vt 0.093407 0.243638
+vt 0.087838 0.240476
+vt 0.154081 0.146091
+vt 0.155071 0.146091
+vt 0.155074 0.149124
+vt 0.154084 0.149123
+vt 0.155074 0.151874
+vt 0.154084 0.151874
+vt 0.156928 0.146091
+vt 0.156931 0.149124
+vt 0.156931 0.151874
+vt 0.153672 0.149123
+vt 0.153668 0.146091
+vt 0.153549 0.149123
+vt 0.153545 0.146091
+vt 0.153672 0.151874
+vt 0.153549 0.151874
+vt 0.153658 0.142776
+vt 0.154070 0.142776
+vt 0.153637 0.139178
+vt 0.154050 0.139178
+vt 0.153535 0.142776
+vt 0.153514 0.139178
+vt 0.155061 0.142776
+vt 0.156918 0.142776
+vt 0.155041 0.139178
+vt 0.156899 0.139178
+vt 0.184495 0.146091
+vt 0.190157 0.146091
+vt 0.190159 0.149123
+vt 0.184498 0.149123
+vt 0.190159 0.151874
+vt 0.184498 0.151874
+vt 0.195899 0.146091
+vt 0.195901 0.149123
+vt 0.195901 0.151874
+vt 0.178969 0.149123
+vt 0.178966 0.146091
+vt 0.173626 0.149123
+vt 0.173623 0.146091
+vt 0.178969 0.151874
+vt 0.173626 0.151874
+vt 0.178958 0.142776
+vt 0.184487 0.142776
+vt 0.178943 0.139178
+vt 0.184471 0.139178
+vt 0.173615 0.142776
+vt 0.173599 0.139178
+vt 0.190149 0.142776
+vt 0.195890 0.142776
+vt 0.190132 0.139178
+vt 0.195873 0.139178
+vt 0.207465 0.146091
+vt 0.213293 0.146091
+vt 0.213296 0.149123
+vt 0.207468 0.149123
+vt 0.213296 0.151874
+vt 0.207468 0.151874
+vt 0.219151 0.146091
+vt 0.219154 0.149123
+vt 0.219154 0.151874
+vt 0.201671 0.149123
+vt 0.201668 0.146091
+vt 0.201671 0.151874
+vt 0.201659 0.142776
+vt 0.207457 0.142776
+vt 0.201642 0.139178
+vt 0.207439 0.139178
+vt 0.213284 0.142776
+vt 0.219141 0.142776
+vt 0.213265 0.139178
+vt 0.219123 0.139178
+vt 0.230963 0.146091
+vt 0.236920 0.146091
+vt 0.236923 0.149123
+vt 0.230966 0.149123
+vt 0.236923 0.151874
+vt 0.230966 0.151874
+vt 0.242911 0.146091
+vt 0.242915 0.149123
+vt 0.242915 0.151874
+vt 0.225044 0.149123
+vt 0.225040 0.146091
+vt 0.225044 0.151874
+vt 0.225031 0.142776
+vt 0.230953 0.142776
+vt 0.225012 0.139178
+vt 0.230934 0.139178
+vt 0.236910 0.142776
+vt 0.242901 0.142776
+vt 0.236890 0.139178
+vt 0.242881 0.139178
+vt 0.255004 0.146091
+vt 0.261107 0.146091
+vt 0.261110 0.149123
+vt 0.255007 0.149123
+vt 0.261110 0.151874
+vt 0.255007 0.151874
+vt 0.267249 0.146091
+vt 0.267252 0.149123
+vt 0.267252 0.151874
+vt 0.248942 0.149123
+vt 0.248939 0.146091
+vt 0.248942 0.151874
+vt 0.248929 0.142776
+vt 0.254993 0.142776
+vt 0.248908 0.139178
+vt 0.254973 0.139178
+vt 0.261096 0.142776
+vt 0.267238 0.142776
+vt 0.261075 0.139178
+vt 0.267217 0.139178
+vt 0.279653 0.146091
+vt 0.285917 0.146091
+vt 0.285921 0.149123
+vt 0.279657 0.149123
+vt 0.285921 0.151874
+vt 0.279657 0.151874
+vt 0.292224 0.146091
+vt 0.292227 0.149123
+vt 0.292227 0.151874
+vt 0.273434 0.149123
+vt 0.273430 0.146091
+vt 0.273434 0.151874
+vt 0.273420 0.142776
+vt 0.279642 0.142776
+vt 0.273398 0.139178
+vt 0.279621 0.139178
+vt 0.285906 0.142776
+vt 0.292213 0.142776
+vt 0.285885 0.139178
+vt 0.292191 0.139178
+vt 0.304966 0.146091
+vt 0.311404 0.146091
+vt 0.311407 0.149123
+vt 0.304970 0.149123
+vt 0.311407 0.151874
+vt 0.304970 0.151874
+vt 0.317885 0.146091
+vt 0.317889 0.149123
+vt 0.317889 0.151874
+vt 0.298577 0.149123
+vt 0.298573 0.146091
+vt 0.298577 0.151874
+vt 0.298562 0.142776
+vt 0.304956 0.142776
+vt 0.298541 0.139178
+vt 0.304934 0.139178
+vt 0.311393 0.142776
+vt 0.317874 0.142776
+vt 0.311371 0.139178
+vt 0.317853 0.139178
+vt 0.330983 0.146091
+vt 0.337600 0.146091
+vt 0.337604 0.149123
+vt 0.330987 0.149123
+vt 0.337603 0.151874
+vt 0.330987 0.151874
+vt 0.344262 0.146091
+vt 0.344265 0.149123
+vt 0.344265 0.151874
+vt 0.324415 0.149123
+vt 0.324412 0.146091
+vt 0.324415 0.151874
+vt 0.324401 0.142776
+vt 0.330973 0.142776
+vt 0.324380 0.139178
+vt 0.330952 0.139178
+vt 0.337590 0.142776
+vt 0.344251 0.142776
+vt 0.337569 0.139178
+vt 0.344231 0.139178
+vt 0.357719 0.146091
+vt 0.364515 0.146091
+vt 0.364518 0.149123
+vt 0.357723 0.149123
+vt 0.364518 0.151874
+vt 0.357723 0.151874
+vt 0.371353 0.146091
+vt 0.371356 0.149123
+vt 0.371356 0.151874
+vt 0.350972 0.149123
+vt 0.350968 0.146091
+vt 0.350972 0.151874
+vt 0.350958 0.142776
+vt 0.357710 0.142776
+vt 0.350938 0.139178
+vt 0.357690 0.139178
+vt 0.364505 0.142776
+vt 0.371344 0.142776
+vt 0.364486 0.139178
+vt 0.371325 0.139178
+vt 0.385157 0.146091
+vt 0.392120 0.146091
+vt 0.392123 0.149123
+vt 0.385160 0.149123
+vt 0.392123 0.151874
+vt 0.385160 0.151874
+vt 0.399122 0.146091
+vt 0.399125 0.149123
+vt 0.399125 0.151874
+vt 0.378237 0.149123
+vt 0.378234 0.146091
+vt 0.378237 0.151874
+vt 0.378225 0.142776
+vt 0.385148 0.142776
+vt 0.378207 0.139178
+vt 0.385131 0.139178
+vt 0.392112 0.142776
+vt 0.399114 0.142776
+vt 0.392095 0.139178
+vt 0.399099 0.139178
+vt 0.413237 0.146091
+vt 0.420347 0.146091
+vt 0.420349 0.149123
+vt 0.413240 0.149123
+vt 0.420349 0.151874
+vt 0.413240 0.151874
+vt 0.427488 0.146091
+vt 0.427490 0.149123
+vt 0.427490 0.151874
+vt 0.406164 0.149123
+vt 0.406162 0.146091
+vt 0.406164 0.151874
+vt 0.406154 0.142776
+vt 0.413230 0.142776
+vt 0.406140 0.139178
+vt 0.413217 0.139178
+vt 0.420340 0.142776
+vt 0.427482 0.142776
+vt 0.420327 0.139178
+vt 0.427470 0.139178
+vt 0.441857 0.146091
+vt 0.449079 0.146091
+vt 0.449080 0.149123
+vt 0.441858 0.149123
+vt 0.449080 0.151874
+vt 0.441858 0.151874
+vt 0.456323 0.146091
+vt 0.456324 0.149123
+vt 0.456324 0.151874
+vt 0.434660 0.149123
+vt 0.434659 0.146091
+vt 0.434660 0.151874
+vt 0.434653 0.142776
+vt 0.441852 0.142776
+vt 0.434642 0.139178
+vt 0.441842 0.139178
+vt 0.449075 0.142776
+vt 0.456319 0.142776
+vt 0.449066 0.139178
+vt 0.456312 0.139178
+vt 0.470866 0.146091
+vt 0.478158 0.146091
+vt 0.478159 0.149123
+vt 0.470867 0.149123
+vt 0.478159 0.151874
+vt 0.470867 0.151874
+vt 0.485460 0.146091
+vt 0.485460 0.149123
+vt 0.485460 0.151874
+vt 0.463588 0.149123
+vt 0.463586 0.146091
+vt 0.463588 0.151874
+vt 0.463583 0.142776
+vt 0.470863 0.142776
+vt 0.463577 0.139178
+vt 0.470858 0.139178
+vt 0.478156 0.142776
+vt 0.485458 0.142776
+vt 0.478152 0.139178
+vt 0.485456 0.139178
+vt 0.150403 0.113793
+vt 0.149101 0.109735
+vt 0.150165 0.109735
+vt 0.151448 0.113793
+vt 0.152161 0.109735
+vt 0.153408 0.113793
+vt 0.152738 0.118113
+vt 0.151713 0.118113
+vt 0.153825 0.122540
+vt 0.152816 0.122540
+vt 0.154662 0.118113
+vt 0.155718 0.122540
+vt 0.151286 0.118113
+vt 0.149969 0.113793
+vt 0.151159 0.118113
+vt 0.149839 0.113793
+vt 0.152396 0.122540
+vt 0.152271 0.122540
+vt 0.148658 0.109735
+vt 0.148526 0.109735
+vt 0.068856 0.219862
+vt 0.079195 0.226968
+vt 0.079130 0.233999
+vt 0.068839 0.225916
+vt 0.079044 0.241587
+vt 0.068818 0.232385
+vt 0.058522 0.217937
+vt 0.058522 0.212670
+vt 0.049819 0.211124
+vt 0.049819 0.206439
+vt 0.058522 0.223541
+vt 0.049819 0.216109
+vt 0.058522 0.208079
+vt 0.068861 0.214637
+vt 0.058522 0.204502
+vt 0.068861 0.210593
+vt 0.049819 0.202356
+vt 0.049819 0.199173
+vt 0.079216 0.221048
+vt 0.079216 0.216539
+vt 0.150387 0.181475
+vt 0.149034 0.187768
+vt 0.148639 0.187539
+vt 0.149964 0.181417
+vt 0.148507 0.187539
+vt 0.149834 0.181417
+vt 0.151286 0.175468
+vt 0.151713 0.175468
+vt 0.152396 0.170336
+vt 0.152816 0.170336
+vt 0.152738 0.175468
+vt 0.151395 0.181646
+vt 0.154662 0.175468
+vt 0.153320 0.181796
+vt 0.153825 0.170336
+vt 0.155718 0.170336
+vt 0.149954 0.188455
+vt 0.151810 0.189052
+vt 0.181640 0.113793
+vt 0.180627 0.109735
+vt 0.186184 0.109735
+vt 0.187224 0.113793
+vt 0.191792 0.109735
+vt 0.192867 0.113793
+vt 0.188269 0.118113
+vt 0.182657 0.118113
+vt 0.189149 0.122540
+vt 0.183514 0.122540
+vt 0.193947 0.118113
+vt 0.194857 0.122540
+vt 0.177149 0.118113
+vt 0.176144 0.113793
+vt 0.171784 0.118113
+vt 0.170766 0.113793
+vt 0.177996 0.122540
+vt 0.172641 0.122540
+vt 0.175144 0.109735
+vt 0.169754 0.109735
+vt 0.181555 0.181696
+vt 0.180291 0.188655
+vt 0.174811 0.188655
+vt 0.176061 0.181696
+vt 0.169418 0.188655
+vt 0.170682 0.181696
+vt 0.178945 0.195979
+vt 0.173481 0.195979
+vt 0.168071 0.195979
+vt 0.177149 0.175468
+vt 0.182657 0.175468
+vt 0.177996 0.170336
+vt 0.183514 0.170336
+vt 0.171784 0.175468
+vt 0.172641 0.170336
+vt 0.188269 0.175468
+vt 0.187137 0.181696
+vt 0.193947 0.175468
+vt 0.192778 0.181696
+vt 0.189149 0.170336
+vt 0.194857 0.170336
+vt 0.185838 0.188655
+vt 0.184456 0.195979
+vt 0.191435 0.188655
+vt 0.190006 0.195979
+vt 0.204245 0.113793
+vt 0.203103 0.109735
+vt 0.208809 0.109735
+vt 0.209983 0.113793
+vt 0.214551 0.109735
+vt 0.215755 0.113793
+vt 0.211163 0.118113
+vt 0.205393 0.118113
+vt 0.212156 0.122540
+vt 0.206360 0.122540
+vt 0.216965 0.118113
+vt 0.217985 0.122540
+vt 0.199655 0.118113
+vt 0.198540 0.113793
+vt 0.200594 0.122540
+vt 0.197432 0.109735
+vt 0.204150 0.181696
+vt 0.202724 0.188655
+vt 0.197063 0.188655
+vt 0.198448 0.181696
+vt 0.201206 0.195979
+vt 0.195588 0.195979
+vt 0.199655 0.175468
+vt 0.205393 0.175468
+vt 0.200594 0.170336
+vt 0.206360 0.170336
+vt 0.211163 0.175468
+vt 0.209885 0.181696
+vt 0.216965 0.175468
+vt 0.215655 0.181696
+vt 0.212156 0.170336
+vt 0.217985 0.170336
+vt 0.208419 0.188655
+vt 0.206858 0.195979
+vt 0.214150 0.188655
+vt 0.212549 0.195979
+vt 0.227407 0.113793
+vt 0.226145 0.109735
+vt 0.232001 0.109735
+vt 0.233289 0.113793
+vt 0.237899 0.109735
+vt 0.239212 0.113793
+vt 0.234584 0.118113
+vt 0.228675 0.118113
+vt 0.235674 0.122540
+vt 0.229742 0.122540
+vt 0.240531 0.118113
+vt 0.241642 0.122540
+vt 0.222802 0.118113
+vt 0.221562 0.113793
+vt 0.223847 0.122540
+vt 0.220329 0.109735
+vt 0.227302 0.181696
+vt 0.225726 0.188655
+vt 0.219919 0.188655
+vt 0.221460 0.181696
+vt 0.224048 0.195979
+vt 0.218278 0.195979
+vt 0.222802 0.175468
+vt 0.228675 0.175468
+vt 0.223847 0.170336
+vt 0.229742 0.170336
+vt 0.234584 0.175468
+vt 0.233182 0.181696
+vt 0.240531 0.175468
+vt 0.239102 0.181696
+vt 0.235674 0.170336
+vt 0.241642 0.170336
+vt 0.231573 0.188655
+vt 0.229861 0.195979
+vt 0.237463 0.188655
+vt 0.235717 0.195979
+vt 0.251180 0.113793
+vt 0.249824 0.109735
+vt 0.255854 0.109735
+vt 0.257230 0.113793
+vt 0.261931 0.109735
+vt 0.263324 0.113793
+vt 0.258613 0.118113
+vt 0.252544 0.118113
+vt 0.259777 0.122540
+vt 0.253693 0.122540
+vt 0.264724 0.118113
+vt 0.265903 0.122540
+vt 0.246517 0.118113
+vt 0.245175 0.113793
+vt 0.247648 0.122540
+vt 0.243839 0.109735
+vt 0.251068 0.181696
+vt 0.249373 0.188655
+vt 0.243395 0.188655
+vt 0.245064 0.181696
+vt 0.247568 0.195979
+vt 0.241619 0.195979
+vt 0.246517 0.175468
+vt 0.252544 0.175468
+vt 0.247648 0.170336
+vt 0.253693 0.170336
+vt 0.258613 0.175468
+vt 0.257115 0.181696
+vt 0.264724 0.175468
+vt 0.263208 0.181696
+vt 0.259777 0.170336
+vt 0.265903 0.170336
+vt 0.255396 0.188655
+vt 0.253567 0.195979
+vt 0.261468 0.188655
+vt 0.259615 0.195979
+vt 0.275653 0.113793
+vt 0.274233 0.109735
+vt 0.280459 0.109735
+vt 0.281890 0.113793
+vt 0.286739 0.109735
+vt 0.288176 0.113793
+vt 0.283327 0.118113
+vt 0.277080 0.118113
+vt 0.284537 0.122540
+vt 0.278282 0.122540
+vt 0.289621 0.118113
+vt 0.290837 0.122540
+vt 0.270880 0.118113
+vt 0.269465 0.113793
+vt 0.272071 0.122540
+vt 0.268057 0.109735
+vt 0.275535 0.181696
+vt 0.273760 0.188655
+vt 0.267589 0.188655
+vt 0.269348 0.181696
+vt 0.271872 0.195979
+vt 0.265717 0.195979
+vt 0.270880 0.175468
+vt 0.277080 0.175468
+vt 0.272071 0.170336
+vt 0.278282 0.170336
+vt 0.283327 0.175468
+vt 0.281771 0.181696
+vt 0.289621 0.175468
+vt 0.288057 0.181696
+vt 0.284537 0.170336
+vt 0.290837 0.170336
+vt 0.279984 0.188655
+vt 0.278082 0.195979
+vt 0.286261 0.188655
+vt 0.284349 0.195979
+vt 0.300904 0.113793
+vt 0.299460 0.109735
+vt 0.305904 0.109735
+vt 0.307346 0.113793
+vt 0.312405 0.109735
+vt 0.313842 0.113793
+vt 0.308795 0.118113
+vt 0.302354 0.118113
+vt 0.310014 0.122540
+vt 0.303575 0.122540
+vt 0.315286 0.118113
+vt 0.316501 0.122540
+vt 0.295963 0.118113
+vt 0.294514 0.113793
+vt 0.297183 0.122540
+vt 0.293072 0.109735
+vt 0.300784 0.181696
+vt 0.298981 0.188655
+vt 0.292593 0.188655
+vt 0.294394 0.181696
+vt 0.297061 0.195979
+vt 0.290675 0.195979
+vt 0.295963 0.175468
+vt 0.302354 0.175468
+vt 0.297183 0.170336
+vt 0.303575 0.170336
+vt 0.308795 0.175468
+vt 0.307226 0.181696
+vt 0.315286 0.175468
+vt 0.313723 0.181696
+vt 0.310014 0.170336
+vt 0.316501 0.170336
+vt 0.305425 0.188655
+vt 0.303508 0.195979
+vt 0.311928 0.188655
+vt 0.310017 0.195979
+vt 0.326998 0.113793
+vt 0.325582 0.109735
+vt 0.332258 0.109735
+vt 0.333659 0.113793
+vt 0.338994 0.109735
+vt 0.340376 0.113793
+vt 0.335067 0.118113
+vt 0.328422 0.118113
+vt 0.336252 0.122540
+vt 0.329620 0.122540
+vt 0.341764 0.118113
+vt 0.342933 0.122540
+vt 0.321828 0.118113
+vt 0.320393 0.113793
+vt 0.323036 0.122540
+vt 0.318964 0.109735
+vt 0.326881 0.181696
+vt 0.325111 0.188655
+vt 0.318490 0.188655
+vt 0.320274 0.181696
+vt 0.323227 0.195979
+vt 0.316590 0.195979
+vt 0.321828 0.175468
+vt 0.328422 0.175468
+vt 0.323036 0.170336
+vt 0.329620 0.170336
+vt 0.335067 0.175468
+vt 0.333543 0.181696
+vt 0.341764 0.175468
+vt 0.340261 0.181696
+vt 0.336252 0.170336
+vt 0.342933 0.170336
+vt 0.331793 0.188655
+vt 0.329930 0.195979
+vt 0.338535 0.188655
+vt 0.336698 0.195979
+vt 0.353977 0.113793
+vt 0.352646 0.109735
+vt 0.359561 0.109735
+vt 0.360861 0.113793
+vt 0.366536 0.109735
+vt 0.367800 0.113793
+vt 0.362167 0.118113
+vt 0.355314 0.118113
+vt 0.363266 0.122540
+vt 0.356440 0.122540
+vt 0.369070 0.118113
+vt 0.370139 0.122540
+vt 0.348513 0.118113
+vt 0.347148 0.113793
+vt 0.349662 0.122540
+vt 0.345790 0.109735
+vt 0.353866 0.181696
+vt 0.352204 0.188655
+vt 0.345339 0.188655
+vt 0.347036 0.181696
+vt 0.350434 0.195979
+vt 0.343532 0.195979
+vt 0.348513 0.175468
+vt 0.355314 0.175468
+vt 0.349662 0.170336
+vt 0.356440 0.170336
+vt 0.362167 0.175468
+vt 0.360753 0.181696
+vt 0.369070 0.175468
+vt 0.367695 0.181696
+vt 0.363266 0.170336
+vt 0.370139 0.170336
+vt 0.359129 0.188655
+vt 0.357401 0.195979
+vt 0.366115 0.188655
+vt 0.364434 0.195979
+vt 0.381840 0.113793
+vt 0.380660 0.109735
+vt 0.387807 0.109735
+vt 0.388939 0.113793
+vt 0.395009 0.109735
+vt 0.396089 0.113793
+vt 0.390076 0.118113
+vt 0.383026 0.118113
+vt 0.391034 0.122540
+vt 0.384024 0.122540
+vt 0.397173 0.118113
+vt 0.398086 0.122540
+vt 0.376023 0.118113
+vt 0.374793 0.113793
+vt 0.377059 0.122540
+vt 0.373569 0.109735
+vt 0.381742 0.181696
+vt 0.380268 0.188655
+vt 0.373162 0.188655
+vt 0.374691 0.181696
+vt 0.378698 0.195979
+vt 0.371534 0.195979
+vt 0.376023 0.175468
+vt 0.383026 0.175468
+vt 0.377059 0.170336
+vt 0.384024 0.170336
+vt 0.390076 0.175468
+vt 0.388845 0.181696
+vt 0.397173 0.175468
+vt 0.395999 0.181696
+vt 0.391034 0.170336
+vt 0.398086 0.170336
+vt 0.387431 0.188655
+vt 0.385925 0.195979
+vt 0.394650 0.188655
+vt 0.393215 0.195979
+vt 0.410534 0.113793
+vt 0.409572 0.109735
+vt 0.416927 0.109735
+vt 0.417825 0.113793
+vt 0.424328 0.109735
+vt 0.425158 0.113793
+vt 0.418727 0.118113
+vt 0.411501 0.118113
+vt 0.419486 0.122540
+vt 0.412315 0.122540
+vt 0.425991 0.118113
+vt 0.426693 0.122540
+vt 0.404316 0.118113
+vt 0.403288 0.113793
+vt 0.405181 0.122540
+vt 0.402265 0.109735
+vt 0.410454 0.181696
+vt 0.409252 0.188655
+vt 0.401925 0.188655
+vt 0.403203 0.181696
+vt 0.407972 0.195979
+vt 0.400564 0.195979
+vt 0.404316 0.175468
+vt 0.411501 0.175468
+vt 0.405181 0.170336
+vt 0.412315 0.170336
+vt 0.418727 0.175468
+vt 0.417750 0.181696
+vt 0.425991 0.175468
+vt 0.425089 0.181696
+vt 0.419486 0.170336
+vt 0.426693 0.170336
+vt 0.416629 0.188655
+vt 0.415435 0.195979
+vt 0.424053 0.188655
+vt 0.422949 0.195979
+vt 0.439940 0.113793
+vt 0.439258 0.109735
+vt 0.446778 0.109735
+vt 0.447382 0.113793
+vt 0.454330 0.109735
+vt 0.454854 0.113793
+vt 0.447989 0.118113
+vt 0.440626 0.118113
+vt 0.448500 0.122540
+vt 0.441203 0.122540
+vt 0.455379 0.118113
+vt 0.455822 0.122540
+vt 0.433292 0.118113
+vt 0.432531 0.113793
+vt 0.433933 0.122540
+vt 0.431773 0.109735
+vt 0.439883 0.181696
+vt 0.439031 0.188655
+vt 0.431521 0.188655
+vt 0.432468 0.181696
+vt 0.438123 0.195979
+vt 0.430513 0.195979
+vt 0.433292 0.175468
+vt 0.440626 0.175468
+vt 0.433933 0.170336
+vt 0.441203 0.170336
+vt 0.447989 0.175468
+vt 0.447332 0.181696
+vt 0.455379 0.175468
+vt 0.454810 0.181696
+vt 0.448500 0.170336
+vt 0.455822 0.170336
+vt 0.446577 0.188655
+vt 0.445773 0.195979
+vt 0.454156 0.188655
+vt 0.453460 0.195979
+vt 0.469870 0.113793
+vt 0.469516 0.109735
+vt 0.477140 0.109735
+vt 0.477407 0.113793
+vt 0.484778 0.109735
+vt 0.484957 0.113793
+vt 0.477676 0.118113
+vt 0.470227 0.118113
+vt 0.477902 0.122540
+vt 0.470526 0.122540
+vt 0.485137 0.118113
+vt 0.485288 0.122540
+vt 0.462793 0.118113
+vt 0.462351 0.113793
+vt 0.463165 0.122540
+vt 0.461911 0.109735
+vt 0.469841 0.181696
+vt 0.469398 0.188655
+vt 0.461765 0.188655
+vt 0.462315 0.181696
+vt 0.468927 0.195979
+vt 0.461180 0.195979
+vt 0.462793 0.175468
+vt 0.470227 0.175468
+vt 0.463165 0.170336
+vt 0.470526 0.170336
+vt 0.477676 0.175468
+vt 0.477385 0.181696
+vt 0.485137 0.175468
+vt 0.484942 0.181696
+vt 0.477902 0.170336
+vt 0.485288 0.170336
+vt 0.477051 0.188655
+vt 0.476695 0.195979
+vt 0.484719 0.188655
+vt 0.484481 0.195979
+vt 0.470810 0.164055
+vt 0.470712 0.166665
+vt 0.463395 0.166665
+vt 0.463517 0.164055
+vt 0.456096 0.166665
+vt 0.456241 0.164055
+vt 0.463567 0.162104
+vt 0.470850 0.162104
+vt 0.463577 0.160411
+vt 0.470858 0.160411
+vt 0.456299 0.162104
+vt 0.456312 0.160411
+vt 0.478146 0.162104
+vt 0.478116 0.164055
+vt 0.485452 0.162104
+vt 0.485432 0.164055
+vt 0.478152 0.160411
+vt 0.485456 0.160411
+vt 0.478042 0.166665
+vt 0.485382 0.166665
+vt 0.441749 0.164055
+vt 0.441560 0.166665
+vt 0.434329 0.166665
+vt 0.434539 0.164055
+vt 0.427126 0.166665
+vt 0.427357 0.164055
+vt 0.434624 0.162104
+vt 0.441826 0.162104
+vt 0.434642 0.160411
+vt 0.441842 0.160411
+vt 0.427450 0.162104
+vt 0.427470 0.160411
+vt 0.449052 0.162104
+vt 0.448984 0.164055
+vt 0.449066 0.160411
+vt 0.448816 0.166665
+vt 0.413086 0.164055
+vt 0.412818 0.166665
+vt 0.405716 0.166665
+vt 0.406000 0.164055
+vt 0.398651 0.166665
+vt 0.398951 0.164055
+vt 0.406115 0.162104
+vt 0.413193 0.162104
+vt 0.406140 0.160411
+vt 0.413217 0.160411
+vt 0.399072 0.162104
+vt 0.399099 0.160411
+vt 0.420306 0.162104
+vt 0.420205 0.164055
+vt 0.420327 0.160411
+vt 0.419955 0.166665
+vt 0.384970 0.164055
+vt 0.384641 0.166665
+vt 0.377699 0.166665
+vt 0.378040 0.164055
+vt 0.370800 0.166665
+vt 0.371152 0.164055
+vt 0.378178 0.162104
+vt 0.385103 0.162104
+vt 0.378207 0.160411
+vt 0.385131 0.160411
+vt 0.371294 0.162104
+vt 0.371325 0.160411
+vt 0.392068 0.162104
+vt 0.391941 0.164055
+vt 0.392095 0.160411
+vt 0.391626 0.166665
+vt 0.357508 0.164055
+vt 0.357137 0.166665
+vt 0.350373 0.166665
+vt 0.350752 0.164055
+vt 0.343656 0.166665
+vt 0.344041 0.164055
+vt 0.350905 0.162104
+vt 0.357657 0.162104
+vt 0.350938 0.160411
+vt 0.357690 0.160411
+vt 0.344197 0.162104
+vt 0.344231 0.160411
+vt 0.364454 0.162104
+vt 0.364308 0.164055
+vt 0.364486 0.160411
+vt 0.363946 0.166665
+vt 0.330757 0.164055
+vt 0.330361 0.166665
+vt 0.323784 0.166665
+vt 0.324183 0.164055
+vt 0.317254 0.166665
+vt 0.317655 0.164055
+vt 0.324344 0.162104
+vt 0.330917 0.162104
+vt 0.324380 0.160411
+vt 0.330952 0.160411
+vt 0.317817 0.162104
+vt 0.317853 0.160411
+vt 0.337534 0.162104
+vt 0.337376 0.164055
+vt 0.337569 0.160411
+vt 0.336985 0.166665
+vt 0.304734 0.164055
+vt 0.304331 0.166665
+vt 0.297938 0.166665
+vt 0.298341 0.164055
+vt 0.291590 0.166665
+vt 0.291992 0.164055
+vt 0.298505 0.162104
+vt 0.304898 0.162104
+vt 0.298541 0.160411
+vt 0.304934 0.160411
+vt 0.292155 0.162104
+vt 0.292191 0.160411
+vt 0.311335 0.162104
+vt 0.311172 0.164055
+vt 0.311371 0.160411
+vt 0.310769 0.166665
+vt 0.279424 0.164055
+vt 0.279026 0.166665
+vt 0.272809 0.166665
+vt 0.273203 0.164055
+vt 0.266633 0.166665
+vt 0.267023 0.164055
+vt 0.273363 0.162104
+vt 0.279585 0.162104
+vt 0.273398 0.160411
+vt 0.279621 0.160411
+vt 0.267181 0.162104
+vt 0.267217 0.160411
+vt 0.285849 0.162104
+vt 0.285687 0.164055
+vt 0.285885 0.160411
+vt 0.285287 0.166665
+vt 0.254784 0.164055
+vt 0.254404 0.166665
+vt 0.248348 0.166665
+vt 0.248722 0.164055
+vt 0.242330 0.166665
+vt 0.242698 0.164055
+vt 0.248874 0.162104
+vt 0.254938 0.162104
+vt 0.248908 0.160411
+vt 0.254973 0.160411
+vt 0.242847 0.162104
+vt 0.242881 0.160411
+vt 0.261040 0.162104
+vt 0.260884 0.164055
+vt 0.261075 0.160411
+vt 0.260499 0.166665
+vt 0.230758 0.164055
+vt 0.230404 0.166665
+vt 0.224494 0.166665
+vt 0.224839 0.164055
+vt 0.218616 0.166665
+vt 0.218954 0.164055
+vt 0.224980 0.162104
+vt 0.230901 0.162104
+vt 0.225012 0.160411
+vt 0.230934 0.160411
+vt 0.219092 0.162104
+vt 0.219123 0.160411
+vt 0.236857 0.162104
+vt 0.236710 0.164055
+vt 0.236890 0.160411
+vt 0.236349 0.166665
+vt 0.207279 0.164055
+vt 0.206959 0.166665
+vt 0.201175 0.166665
+vt 0.201486 0.164055
+vt 0.195421 0.166665
+vt 0.195723 0.164055
+vt 0.201613 0.162104
+vt 0.207409 0.162104
+vt 0.201642 0.160411
+vt 0.207439 0.160411
+vt 0.195845 0.162104
+vt 0.195873 0.160411
+vt 0.213235 0.162104
+vt 0.213101 0.164055
+vt 0.213265 0.160411
+vt 0.212772 0.166665
+vt 0.184329 0.164055
+vt 0.184045 0.166665
+vt 0.178521 0.166665
+vt 0.178802 0.164055
+vt 0.173173 0.166665
+vt 0.173457 0.164055
+vt 0.178917 0.162104
+vt 0.184445 0.162104
+vt 0.178943 0.160411
+vt 0.184471 0.160411
+vt 0.173573 0.162104
+vt 0.173599 0.160411
+vt 0.190105 0.162104
+vt 0.189986 0.164055
+vt 0.190132 0.160411
+vt 0.189695 0.166665
+vt 0.153866 0.164055
+vt 0.153500 0.166665
+vt 0.153084 0.166665
+vt 0.153453 0.164055
+vt 0.153603 0.162104
+vt 0.154016 0.162104
+vt 0.153637 0.160411
+vt 0.154050 0.160411
+vt 0.153480 0.162104
+vt 0.153514 0.160411
+vt 0.155007 0.162104
+vt 0.154860 0.164055
+vt 0.156866 0.162104
+vt 0.156723 0.164055
+vt 0.155041 0.160411
+vt 0.156899 0.160411
+vt 0.154499 0.166665
+vt 0.156373 0.166665
+vt 0.041367 0.199504
+vt 0.044372 0.202218
+vt 0.044372 0.206541
+vt 0.041367 0.203630
+vt 0.044372 0.211141
+vt 0.041367 0.208021
+vt 0.039991 0.201834
+vt 0.039991 0.197794
+vt 0.039428 0.200596
+vt 0.039428 0.196586
+vt 0.039991 0.206134
+vt 0.039428 0.204862
+vt 0.039991 0.194271
+vt 0.041367 0.195906
+vt 0.039991 0.191525
+vt 0.041367 0.193102
+vt 0.039428 0.193091
+vt 0.039428 0.190366
+vt 0.044372 0.198449
+vt 0.044372 0.195512
+vt 0.153866 0.131191
+vt 0.153500 0.126919
+vt 0.154499 0.126919
+vt 0.154860 0.131191
+vt 0.156373 0.126919
+vt 0.156723 0.131191
+vt 0.155007 0.135297
+vt 0.154016 0.135297
+vt 0.156866 0.135297
+vt 0.153603 0.135297
+vt 0.153453 0.131191
+vt 0.153480 0.135297
+vt 0.153329 0.131191
+vt 0.153084 0.126919
+vt 0.152960 0.126919
+vt 0.184329 0.131191
+vt 0.184045 0.126919
+vt 0.189695 0.126919
+vt 0.189986 0.131191
+vt 0.195421 0.126919
+vt 0.195723 0.131191
+vt 0.190105 0.135297
+vt 0.184445 0.135297
+vt 0.195845 0.135297
+vt 0.178917 0.135297
+vt 0.178802 0.131191
+vt 0.173573 0.135297
+vt 0.173457 0.131191
+vt 0.178521 0.126919
+vt 0.173173 0.126919
+vt 0.207279 0.131191
+vt 0.206959 0.126919
+vt 0.212772 0.126919
+vt 0.213101 0.131191
+vt 0.218616 0.126919
+vt 0.218954 0.131191
+vt 0.213235 0.135297
+vt 0.207409 0.135297
+vt 0.219092 0.135297
+vt 0.201613 0.135297
+vt 0.201486 0.131191
+vt 0.201175 0.126919
+vt 0.230758 0.131191
+vt 0.230404 0.126919
+vt 0.236349 0.126919
+vt 0.236710 0.131191
+vt 0.242330 0.126919
+vt 0.242698 0.131191
+vt 0.236857 0.135297
+vt 0.230901 0.135297
+vt 0.242847 0.135297
+vt 0.224980 0.135297
+vt 0.224839 0.131191
+vt 0.224494 0.126919
+vt 0.254784 0.131191
+vt 0.254404 0.126919
+vt 0.260499 0.126919
+vt 0.260884 0.131191
+vt 0.266633 0.126919
+vt 0.267023 0.131191
+vt 0.261040 0.135297
+vt 0.254938 0.135297
+vt 0.267181 0.135297
+vt 0.248874 0.135297
+vt 0.248722 0.131191
+vt 0.248348 0.126919
+vt 0.279424 0.131191
+vt 0.279026 0.126919
+vt 0.285287 0.126919
+vt 0.285687 0.131191
+vt 0.291590 0.126919
+vt 0.291992 0.131191
+vt 0.285849 0.135297
+vt 0.279585 0.135297
+vt 0.292155 0.135297
+vt 0.273363 0.135297
+vt 0.273203 0.131191
+vt 0.272809 0.126919
+vt 0.304734 0.131191
+vt 0.304331 0.126919
+vt 0.310769 0.126919
+vt 0.311172 0.131191
+vt 0.317254 0.126919
+vt 0.317655 0.131191
+vt 0.311335 0.135297
+vt 0.304898 0.135297
+vt 0.317817 0.135297
+vt 0.298505 0.135297
+vt 0.298341 0.131191
+vt 0.297938 0.126919
+vt 0.330757 0.131191
+vt 0.330362 0.126919
+vt 0.336985 0.126919
+vt 0.337376 0.131191
+vt 0.343656 0.126919
+vt 0.344041 0.131191
+vt 0.337534 0.135297
+vt 0.330917 0.135297
+vt 0.344197 0.135297
+vt 0.324344 0.135297
+vt 0.324183 0.131191
+vt 0.323784 0.126919
+vt 0.357508 0.131191
+vt 0.357137 0.126919
+vt 0.363946 0.126919
+vt 0.364308 0.131191
+vt 0.370800 0.126919
+vt 0.371152 0.131191
+vt 0.364454 0.135297
+vt 0.357657 0.135297
+vt 0.371294 0.135297
+vt 0.350905 0.135297
+vt 0.350752 0.131191
+vt 0.350373 0.126919
+vt 0.384970 0.131191
+vt 0.384641 0.126919
+vt 0.391626 0.126919
+vt 0.391941 0.131191
+vt 0.398651 0.126919
+vt 0.398951 0.131191
+vt 0.392068 0.135297
+vt 0.385103 0.135297
+vt 0.399072 0.135297
+vt 0.378178 0.135297
+vt 0.378040 0.131191
+vt 0.377699 0.126919
+vt 0.413086 0.131191
+vt 0.412818 0.126919
+vt 0.419955 0.126919
+vt 0.420205 0.131191
+vt 0.427126 0.126919
+vt 0.427357 0.131191
+vt 0.420306 0.135297
+vt 0.413193 0.135297
+vt 0.427450 0.135297
+vt 0.406115 0.135297
+vt 0.406000 0.131191
+vt 0.405716 0.126919
+vt 0.441749 0.131191
+vt 0.441560 0.126919
+vt 0.448816 0.126919
+vt 0.448984 0.131191
+vt 0.456096 0.126919
+vt 0.456241 0.131191
+vt 0.449052 0.135297
+vt 0.441826 0.135297
+vt 0.456299 0.135297
+vt 0.434624 0.135297
+vt 0.434539 0.131191
+vt 0.434329 0.126919
+vt 0.470810 0.131191
+vt 0.470712 0.126919
+vt 0.478042 0.126919
+vt 0.478116 0.131191
+vt 0.485382 0.126919
+vt 0.485432 0.131191
+vt 0.478146 0.135297
+vt 0.470850 0.135297
+vt 0.485452 0.135297
+vt 0.463567 0.135297
+vt 0.463517 0.131191
+vt 0.463395 0.126919
+vt 0.150986 0.282612
+vt 0.150986 0.278512
+vt 0.155688 0.278512
+vt 0.155688 0.282612
+vt 0.150986 0.275263
+vt 0.155688 0.275262
+vt 0.155688 0.287279
+vt 0.150986 0.287279
+vt 0.155688 0.292230
+vt 0.150986 0.292230
+vt 0.146888 0.287280
+vt 0.146888 0.282613
+vt 0.146888 0.292230
+vt 0.146888 0.278514
+vt 0.146888 0.275265
+vt 0.150994 0.271911
+vt 0.151019 0.271292
+vt 0.155724 0.271290
+vt 0.155697 0.271909
+vt 0.151068 0.271034
+vt 0.155777 0.271032
+vt 0.155688 0.273148
+vt 0.150986 0.273149
+vt 0.146888 0.273152
+vt 0.146895 0.271915
+vt 0.146915 0.271296
+vt 0.146955 0.271039
+vt 0.151248 0.270545
+vt 0.151347 0.269749
+vt 0.156082 0.269748
+vt 0.155975 0.270543
+vt 0.151429 0.268210
+vt 0.156172 0.268208
+vt 0.155867 0.270877
+vt 0.151150 0.270879
+vt 0.147022 0.270884
+vt 0.147103 0.270551
+vt 0.147183 0.269755
+vt 0.147250 0.268215
+vt 0.151502 0.262208
+vt 0.147311 0.262212
+vt 0.147317 0.258062
+vt 0.151510 0.258060
+vt 0.147317 0.253355
+vt 0.151510 0.253355
+vt 0.156261 0.258059
+vt 0.156252 0.262207
+vt 0.156261 0.253354
+vt 0.156226 0.265642
+vt 0.151478 0.265644
+vt 0.147290 0.265649
+vt 0.151510 0.243162
+vt 0.147317 0.243157
+vt 0.147317 0.238502
+vt 0.151510 0.238508
+vt 0.147317 0.234699
+vt 0.151510 0.234705
+vt 0.156261 0.238510
+vt 0.156261 0.243164
+vt 0.156261 0.234706
+vt 0.156261 0.248251
+vt 0.151510 0.248250
+vt 0.147317 0.248248
+vt 0.157078 0.315138
+vt 0.157060 0.314449
+vt 0.162613 0.314473
+vt 0.162548 0.315136
+vt 0.157042 0.313836
+vt 0.162668 0.313872
+vt 0.162483 0.315794
+vt 0.156932 0.315820
+vt 0.162429 0.316375
+vt 0.156808 0.316414
+vt 0.150894 0.315900
+vt 0.151289 0.315142
+vt 0.144760 0.315978
+vt 0.145321 0.315150
+vt 0.150559 0.316531
+vt 0.142391 0.316894
+vt 0.151028 0.314377
+vt 0.150799 0.313726
+vt 0.144897 0.314317
+vt 0.142672 0.313381
+vt 0.160627 0.181719
+vt 0.156491 0.181786
+vt 0.157782 0.175468
+vt 0.161846 0.175468
+vt 0.158789 0.170336
+vt 0.162795 0.170336
+vt 0.166598 0.175468
+vt 0.165448 0.181696
+vt 0.167493 0.170336
+vt 0.164127 0.188655
+vt 0.159230 0.188744
+vt 0.162722 0.195979
+vt 0.157742 0.196157
+vt 0.155013 0.189012
+vt 0.153440 0.196694
+vt 0.163697 0.164055
+vt 0.159746 0.164055
+vt 0.159882 0.162104
+vt 0.163825 0.162104
+vt 0.159913 0.160411
+vt 0.163855 0.160411
+vt 0.168466 0.162104
+vt 0.168344 0.164055
+vt 0.168493 0.160411
+vt 0.168048 0.166665
+vt 0.163382 0.166665
+vt 0.159412 0.166665
+vt 0.163881 0.146091
+vt 0.168518 0.146091
+vt 0.168521 0.149124
+vt 0.163884 0.149124
+vt 0.168521 0.151874
+vt 0.163884 0.151874
+vt 0.159945 0.149124
+vt 0.159941 0.146091
+vt 0.159945 0.151874
+vt 0.159932 0.142776
+vt 0.163872 0.142776
+vt 0.159913 0.139178
+vt 0.163855 0.139178
+vt 0.168510 0.142776
+vt 0.168493 0.139178
+vt 0.163697 0.131191
+vt 0.163382 0.126919
+vt 0.168048 0.126919
+vt 0.168344 0.131191
+vt 0.162795 0.122540
+vt 0.167493 0.122540
+vt 0.168466 0.135297
+vt 0.163825 0.135297
+vt 0.159882 0.135297
+vt 0.159746 0.131191
+vt 0.159412 0.126919
+vt 0.158789 0.122540
+vt 0.160720 0.113793
+vt 0.159600 0.109735
+vt 0.164479 0.109735
+vt 0.165536 0.113793
+vt 0.158669 0.106093
+vt 0.163600 0.106093
+vt 0.166598 0.118113
+vt 0.161846 0.118113
+vt 0.157782 0.118113
+vt 0.156588 0.113793
+vt 0.155400 0.109735
+vt 0.154413 0.106093
+vt 0.157911 0.100226
+vt 0.158055 0.097401
+vt 0.163052 0.097403
+vt 0.162892 0.100226
+vt 0.158531 0.094249
+vt 0.163548 0.094254
+vt 0.163073 0.103023
+vt 0.158111 0.103023
+vt 0.153820 0.103023
+vt 0.153600 0.100224
+vt 0.153731 0.097395
+vt 0.154190 0.094235
+vt 0.160279 0.086489
+vt 0.161238 0.082723
+vt 0.166366 0.082742
+vt 0.165367 0.086503
+vt 0.162046 0.079596
+vt 0.167208 0.079617
+vt 0.164374 0.090481
+vt 0.159324 0.090471
+vt 0.154954 0.090443
+vt 0.155874 0.086445
+vt 0.156798 0.082666
+vt 0.157577 0.079534
+vt 0.162816 0.076255
+vt 0.162925 0.075501
+vt 0.168123 0.075511
+vt 0.168009 0.076270
+vt 0.162951 0.075000
+vt 0.168150 0.075005
+vt 0.167730 0.077549
+vt 0.162547 0.077530
+vt 0.158060 0.077473
+vt 0.158319 0.076211
+vt 0.158425 0.075473
+vt 0.158449 0.074986
+vt 0.162974 0.073764
+vt 0.162976 0.072664
+vt 0.168176 0.072664
+vt 0.168173 0.073765
+vt 0.162976 0.071000
+vt 0.168176 0.071000
+vt 0.168166 0.074484
+vt 0.162966 0.074482
+vt 0.158464 0.074476
+vt 0.158471 0.073763
+vt 0.158474 0.072664
+vt 0.158474 0.071000
+vt 0.162973 0.065777
+vt 0.162965 0.062915
+vt 0.168164 0.062915
+vt 0.168173 0.065777
+vt 0.162947 0.060348
+vt 0.168146 0.060348
+vt 0.168176 0.068588
+vt 0.162976 0.068588
+vt 0.158474 0.068588
+vt 0.158471 0.065777
+vt 0.158463 0.062915
+vt 0.158446 0.060348
+vt 0.097176 0.220965
+vt 0.093494 0.219460
+vt 0.093494 0.218705
+vt 0.097176 0.220193
+vt 0.093494 0.218436
+vt 0.097176 0.219916
+vt 0.087967 0.216744
+vt 0.087967 0.216022
+vt 0.087967 0.215764
+vt 0.100394 0.221081
+vt 0.100394 0.221859
+vt 0.104529 0.221962
+vt 0.104529 0.222741
+vt 0.100394 0.220793
+vt 0.104529 0.221657
+vt 0.100394 0.223617
+vt 0.097176 0.222725
+vt 0.104529 0.224469
+vt 0.093494 0.221186
+vt 0.087967 0.218393
+vt 0.068861 0.206713
+vt 0.068861 0.208079
+vt 0.058522 0.202278
+vt 0.058522 0.201068
+vt 0.049819 0.197193
+vt 0.049819 0.196114
+vt 0.058522 0.200533
+vt 0.068861 0.206113
+vt 0.049819 0.195636
+vt 0.079216 0.211550
+vt 0.079216 0.212217
+vt 0.068861 0.205894
+vt 0.079216 0.211310
+vt 0.079216 0.213738
+vt 0.041367 0.190402
+vt 0.041367 0.191355
+vt 0.039991 0.189815
+vt 0.039991 0.188882
+vt 0.039428 0.188669
+vt 0.039428 0.187743
+vt 0.041367 0.189978
+vt 0.044372 0.192243
+vt 0.044372 0.192686
+vt 0.044372 0.193683
+vt 0.154081 0.156566
+vt 0.155071 0.156566
+vt 0.155061 0.158577
+vt 0.154070 0.158577
+vt 0.156928 0.156566
+vt 0.156918 0.158577
+vt 0.153658 0.158577
+vt 0.153668 0.156566
+vt 0.153535 0.158577
+vt 0.153545 0.156566
+vt 0.153672 0.154343
+vt 0.154084 0.154343
+vt 0.153549 0.154343
+vt 0.155074 0.154343
+vt 0.156931 0.154343
+vt 0.163881 0.156566
+vt 0.168518 0.156566
+vt 0.168510 0.158577
+vt 0.163872 0.158577
+vt 0.173623 0.156566
+vt 0.173615 0.158577
+vt 0.159932 0.158577
+vt 0.159941 0.156566
+vt 0.159945 0.154343
+vt 0.163884 0.154343
+vt 0.168521 0.154343
+vt 0.173626 0.154343
+vt 0.184495 0.156566
+vt 0.190157 0.156566
+vt 0.190149 0.158577
+vt 0.184487 0.158577
+vt 0.195899 0.156566
+vt 0.195890 0.158577
+vt 0.178958 0.158577
+vt 0.178966 0.156566
+vt 0.178969 0.154343
+vt 0.184498 0.154343
+vt 0.190159 0.154343
+vt 0.195901 0.154343
+vt 0.207465 0.156566
+vt 0.213293 0.156566
+vt 0.213284 0.158577
+vt 0.207457 0.158577
+vt 0.219151 0.156566
+vt 0.219141 0.158577
+vt 0.201659 0.158577
+vt 0.201668 0.156566
+vt 0.201671 0.154343
+vt 0.207468 0.154343
+vt 0.213296 0.154343
+vt 0.219154 0.154343
+vt 0.230963 0.156566
+vt 0.236920 0.156566
+vt 0.236910 0.158577
+vt 0.230953 0.158577
+vt 0.242911 0.156566
+vt 0.242901 0.158577
+vt 0.225031 0.158577
+vt 0.225040 0.156566
+vt 0.225044 0.154343
+vt 0.230966 0.154343
+vt 0.236923 0.154343
+vt 0.242915 0.154343
+vt 0.255004 0.156566
+vt 0.261107 0.156566
+vt 0.261096 0.158577
+vt 0.254993 0.158577
+vt 0.267249 0.156566
+vt 0.267238 0.158577
+vt 0.248929 0.158577
+vt 0.248939 0.156566
+vt 0.248942 0.154343
+vt 0.255007 0.154343
+vt 0.261110 0.154343
+vt 0.267252 0.154343
+vt 0.279653 0.156566
+vt 0.285917 0.156566
+vt 0.285906 0.158577
+vt 0.279642 0.158577
+vt 0.292224 0.156566
+vt 0.292213 0.158577
+vt 0.273420 0.158577
+vt 0.273431 0.156566
+vt 0.273434 0.154343
+vt 0.279657 0.154343
+vt 0.285921 0.154343
+vt 0.292227 0.154343
+vt 0.304966 0.156566
+vt 0.311404 0.156566
+vt 0.311393 0.158577
+vt 0.304956 0.158577
+vt 0.317885 0.156566
+vt 0.317874 0.158577
+vt 0.298562 0.158577
+vt 0.298573 0.156566
+vt 0.298577 0.154343
+vt 0.304970 0.154343
+vt 0.311407 0.154343
+vt 0.317889 0.154343
+vt 0.330983 0.156566
+vt 0.337600 0.156566
+vt 0.337590 0.158577
+vt 0.330973 0.158577
+vt 0.344262 0.156566
+vt 0.344251 0.158577
+vt 0.324401 0.158577
+vt 0.324412 0.156566
+vt 0.324415 0.154343
+vt 0.330987 0.154343
+vt 0.337603 0.154343
+vt 0.344265 0.154343
+vt 0.357719 0.156566
+vt 0.364515 0.156566
+vt 0.364505 0.158577
+vt 0.357710 0.158577
+vt 0.371353 0.156566
+vt 0.371344 0.158577
+vt 0.350958 0.158577
+vt 0.350968 0.156566
+vt 0.350972 0.154343
+vt 0.357723 0.154343
+vt 0.364518 0.154343
+vt 0.371356 0.154343
+vt 0.385157 0.156566
+vt 0.392120 0.156566
+vt 0.392112 0.158577
+vt 0.385148 0.158577
+vt 0.399122 0.156566
+vt 0.399114 0.158577
+vt 0.378225 0.158577
+vt 0.378234 0.156566
+vt 0.378237 0.154343
+vt 0.385160 0.154343
+vt 0.392123 0.154343
+vt 0.399125 0.154343
+vt 0.413237 0.156566
+vt 0.420347 0.156566
+vt 0.420340 0.158577
+vt 0.413230 0.158577
+vt 0.427488 0.156566
+vt 0.427482 0.158577
+vt 0.406154 0.158577
+vt 0.406162 0.156566
+vt 0.406164 0.154343
+vt 0.413240 0.154343
+vt 0.420349 0.154343
+vt 0.427490 0.154343
+vt 0.441857 0.156566
+vt 0.449079 0.156566
+vt 0.449075 0.158577
+vt 0.441852 0.158577
+vt 0.456323 0.156566
+vt 0.456319 0.158577
+vt 0.434653 0.158577
+vt 0.434659 0.156566
+vt 0.434660 0.154343
+vt 0.441858 0.154343
+vt 0.449080 0.154343
+vt 0.456324 0.154343
+vt 0.470866 0.156566
+vt 0.478158 0.156566
+vt 0.478156 0.158577
+vt 0.470863 0.158577
+vt 0.485460 0.156566
+vt 0.485458 0.158577
+vt 0.463583 0.158577
+vt 0.463586 0.156566
+vt 0.463588 0.154343
+vt 0.470867 0.154343
+vt 0.478159 0.154343
+vt 0.485460 0.154343
+vt 0.465721 0.230285
+vt 0.457212 0.230285
+vt 0.457392 0.228439
+vt 0.465867 0.228439
+vt 0.457752 0.226019
+vt 0.466157 0.226019
+vt 0.448755 0.230285
+vt 0.448968 0.228439
+vt 0.449395 0.226019
+vt 0.474383 0.228439
+vt 0.474273 0.230285
+vt 0.482930 0.228439
+vt 0.482857 0.230285
+vt 0.474602 0.226019
+vt 0.483078 0.226019
+vt 0.474236 0.232169
+vt 0.465673 0.232169
+vt 0.482832 0.232169
+vt 0.457152 0.232169
+vt 0.448684 0.232169
+vt 0.432034 0.230285
+vt 0.423784 0.230285
+vt 0.424089 0.228439
+vt 0.432310 0.228439
+vt 0.424699 0.226019
+vt 0.432862 0.226019
+vt 0.415618 0.230285
+vt 0.415950 0.228439
+vt 0.416615 0.226019
+vt 0.440605 0.228439
+vt 0.440360 0.230285
+vt 0.441096 0.226019
+vt 0.440278 0.232169
+vt 0.431942 0.232169
+vt 0.423683 0.232169
+vt 0.415507 0.232169
+vt 0.399559 0.230285
+vt 0.391674 0.230285
+vt 0.392076 0.228439
+vt 0.399940 0.228439
+vt 0.392882 0.226019
+vt 0.400703 0.226019
+vt 0.383889 0.230285
+vt 0.384311 0.228439
+vt 0.385156 0.226019
+vt 0.407899 0.228439
+vt 0.407542 0.230285
+vt 0.408615 0.226019
+vt 0.407422 0.232169
+vt 0.399432 0.232169
+vt 0.391539 0.232169
+vt 0.383748 0.232169
+vt 0.368632 0.230285
+vt 0.361162 0.230285
+vt 0.361631 0.228439
+vt 0.369088 0.228439
+vt 0.362570 0.226019
+vt 0.369999 0.226019
+vt 0.353796 0.230285
+vt 0.354278 0.228439
+vt 0.355241 0.226019
+vt 0.376648 0.228439
+vt 0.376208 0.230285
+vt 0.377528 0.226019
+vt 0.376062 0.232169
+vt 0.368481 0.232169
+vt 0.361005 0.232169
+vt 0.353636 0.232169
+vt 0.339383 0.230285
+vt 0.332332 0.230285
+vt 0.332838 0.228439
+vt 0.339883 0.228439
+vt 0.333851 0.226019
+vt 0.340883 0.226019
+vt 0.325382 0.230285
+vt 0.325893 0.228439
+vt 0.326917 0.226019
+vt 0.347029 0.228439
+vt 0.346537 0.230285
+vt 0.348012 0.226019
+vt 0.346374 0.232169
+vt 0.339216 0.232169
+vt 0.332163 0.232169
+vt 0.325211 0.232169
+vt 0.311780 0.230285
+vt 0.305122 0.230285
+vt 0.305640 0.228439
+vt 0.312297 0.228439
+vt 0.306677 0.226019
+vt 0.313332 0.226019
+vt 0.298557 0.230285
+vt 0.299075 0.228439
+vt 0.300110 0.226019
+vt 0.319047 0.228439
+vt 0.318532 0.230285
+vt 0.320078 0.226019
+vt 0.318360 0.232169
+vt 0.311607 0.232169
+vt 0.304949 0.232169
+vt 0.298384 0.232169
+vt 0.285692 0.230285
+vt 0.279387 0.230285
+vt 0.279897 0.228439
+vt 0.286206 0.228439
+vt 0.280916 0.226019
+vt 0.287233 0.226019
+vt 0.273163 0.230285
+vt 0.273668 0.228439
+vt 0.274678 0.226019
+vt 0.292597 0.228439
+vt 0.292081 0.230285
+vt 0.293630 0.226019
+vt 0.291909 0.232169
+vt 0.285521 0.232169
+vt 0.279217 0.232169
+vt 0.272994 0.232169
+vt 0.260944 0.230285
+vt 0.254944 0.230285
+vt 0.255430 0.228439
+vt 0.261437 0.228439
+vt 0.256402 0.226019
+vt 0.262424 0.226019
+vt 0.249013 0.230285
+vt 0.249491 0.228439
+vt 0.250448 0.226019
+vt 0.267516 0.228439
+vt 0.267016 0.230285
+vt 0.268514 0.226019
+vt 0.266850 0.232169
+vt 0.260780 0.232169
+vt 0.254782 0.232169
+vt 0.248854 0.232169
+vt 0.237346 0.230285
+vt 0.231605 0.230285
+vt 0.232056 0.228439
+vt 0.237807 0.228439
+vt 0.232959 0.226019
+vt 0.238729 0.226019
+vt 0.225921 0.230285
+vt 0.226363 0.228439
+vt 0.227246 0.226019
+vt 0.243618 0.228439
+vt 0.243148 0.230285
+vt 0.244558 0.226019
+vt 0.242991 0.232169
+vt 0.237192 0.232169
+vt 0.231454 0.232169
+vt 0.225774 0.232169
+vt 0.214716 0.230285
+vt 0.209190 0.230285
+vt 0.209600 0.228439
+vt 0.215137 0.228439
+vt 0.210419 0.226019
+vt 0.215978 0.226019
+vt 0.203712 0.230285
+vt 0.204110 0.228439
+vt 0.204907 0.226019
+vt 0.220724 0.228439
+vt 0.220292 0.230285
+vt 0.221586 0.226019
+vt 0.220148 0.232169
+vt 0.214576 0.232169
+vt 0.209054 0.232169
+vt 0.203579 0.232169
+vt 0.192890 0.230285
+vt 0.187541 0.230285
+vt 0.187904 0.228439
+vt 0.193264 0.228439
+vt 0.188629 0.226019
+vt 0.194014 0.226019
+vt 0.182231 0.230285
+vt 0.182581 0.228439
+vt 0.183282 0.226019
+vt 0.198666 0.228439
+vt 0.198279 0.230285
+vt 0.199439 0.226019
+vt 0.198150 0.232169
+vt 0.192765 0.232169
+vt 0.187420 0.232169
+vt 0.182115 0.232169
+vt 0.171728 0.230285
+vt 0.166547 0.230285
+vt 0.166860 0.228439
+vt 0.172053 0.228439
+vt 0.167484 0.226019
+vt 0.172703 0.226019
+vt 0.161421 0.230285
+vt 0.161721 0.228439
+vt 0.162320 0.226019
+vt 0.177296 0.228439
+vt 0.176958 0.230285
+vt 0.177971 0.226019
+vt 0.176846 0.232169
+vt 0.171620 0.232169
+vt 0.166443 0.232169
+vt 0.161322 0.232169
+vt 0.151603 0.230286
+vt 0.147408 0.230290
+vt 0.147679 0.228451
+vt 0.151879 0.228442
+vt 0.148222 0.226035
+vt 0.152432 0.226023
+vt 0.144021 0.230297
+vt 0.144295 0.228469
+vt 0.144844 0.226060
+vt 0.156643 0.228439
+vt 0.156357 0.230285
+vt 0.157217 0.226019
+vt 0.156261 0.232169
+vt 0.151510 0.232169
+vt 0.147317 0.232167
+vt 0.143930 0.232164
+vt 0.139581 0.230176
+vt 0.136846 0.229741
+vt 0.137111 0.227935
+vt 0.139872 0.228376
+vt 0.138018 0.225623
+vt 0.140548 0.226006
+vt 0.132654 0.228905
+vt 0.132859 0.227218
+vt 0.133327 0.224556
+vt 0.141980 0.228499
+vt 0.141693 0.230310
+vt 0.142555 0.226101
+vt 0.141597 0.232159
+vt 0.139484 0.232012
+vt 0.136758 0.231580
+vt 0.132585 0.230723
+vt 0.117320 0.282659
+vt 0.117302 0.287306
+vt 0.110179 0.287307
+vt 0.110191 0.282660
+vt 0.117302 0.292238
+vt 0.110179 0.292238
+vt 0.110227 0.278581
+vt 0.117377 0.278579
+vt 0.110301 0.275355
+vt 0.117491 0.275351
+vt 0.124547 0.278577
+vt 0.124474 0.282658
+vt 0.124694 0.275346
+vt 0.124450 0.287306
+vt 0.124450 0.292238
+vt 0.117938 0.271794
+vt 0.110569 0.271795
+vt 0.110715 0.270424
+vt 0.118261 0.270450
+vt 0.110837 0.268635
+vt 0.118517 0.268679
+vt 0.126033 0.270558
+vt 0.125358 0.271813
+vt 0.126546 0.268845
+vt 0.124938 0.273250
+vt 0.117680 0.273259
+vt 0.110423 0.273266
+vt 0.118551 0.262289
+vt 0.110947 0.262267
+vt 0.110959 0.257736
+vt 0.118542 0.257839
+vt 0.110959 0.252339
+vt 0.118542 0.252620
+vt 0.126132 0.257939
+vt 0.126220 0.262330
+vt 0.126132 0.252900
+vt 0.126483 0.266034
+vt 0.118578 0.265931
+vt 0.110910 0.265908
+vt 0.118542 0.240601
+vt 0.110959 0.239675
+vt 0.110959 0.233726
+vt 0.118542 0.234998
+vt 0.110959 0.228911
+vt 0.118542 0.230463
+vt 0.126132 0.236273
+vt 0.126132 0.241530
+vt 0.126132 0.232018
+vt 0.126132 0.247251
+vt 0.118542 0.246674
+vt 0.110959 0.246099
+vt 0.118551 0.225932
+vt 0.110959 0.224211
+vt 0.110959 0.223430
+vt 0.118579 0.225020
+vt 0.110959 0.223098
+vt 0.118616 0.224482
+vt 0.126280 0.226264
+vt 0.126169 0.227566
+vt 0.126429 0.225179
+vt 0.126132 0.229300
+vt 0.118542 0.227594
+vt 0.110959 0.225889
+vt 0.143284 0.218114
+vt 0.144645 0.213352
+vt 0.146026 0.212817
+vt 0.144715 0.217966
+vt 0.148306 0.212378
+vt 0.146943 0.217829
+vt 0.143512 0.222492
+vt 0.141802 0.222459
+vt 0.145757 0.222451
+vt 0.140036 0.222261
+vt 0.142305 0.218141
+vt 0.138242 0.221981
+vt 0.141553 0.218107
+vt 0.143967 0.213553
+vt 0.143639 0.213588
+vt 0.154552 0.217892
+vt 0.155938 0.212729
+vt 0.160846 0.212817
+vt 0.159414 0.217911
+vt 0.166112 0.212817
+vt 0.164615 0.217911
+vt 0.157418 0.207247
+vt 0.162375 0.207426
+vt 0.167709 0.207426
+vt 0.158172 0.222411
+vt 0.153353 0.222415
+vt 0.163318 0.222411
+vt 0.149126 0.222427
+vt 0.150308 0.217834
+vt 0.151684 0.212466
+vt 0.153157 0.206710
+vt 0.175195 0.217911
+vt 0.176820 0.212817
+vt 0.182248 0.212817
+vt 0.180560 0.217911
+vt 0.187717 0.212817
+vt 0.185966 0.217911
+vt 0.178553 0.207426
+vt 0.184049 0.207426
+vt 0.189585 0.207426
+vt 0.179097 0.222411
+vt 0.173787 0.222411
+vt 0.184449 0.222411
+vt 0.168525 0.222411
+vt 0.169878 0.217911
+vt 0.171439 0.212817
+vt 0.173104 0.207426
+vt 0.196886 0.217911
+vt 0.198759 0.212817
+vt 0.204335 0.212817
+vt 0.202402 0.217911
+vt 0.209951 0.212817
+vt 0.207960 0.217911
+vt 0.200757 0.207426
+vt 0.206397 0.207426
+vt 0.212074 0.207426
+vt 0.200727 0.222411
+vt 0.195262 0.222411
+vt 0.206234 0.222411
+vt 0.189837 0.222411
+vt 0.191408 0.217911
+vt 0.193220 0.212817
+vt 0.195154 0.207426
+vt 0.219203 0.217911
+vt 0.221306 0.212817
+vt 0.227050 0.212817
+vt 0.224893 0.217911
+vt 0.232840 0.212817
+vt 0.230632 0.217911
+vt 0.223549 0.207426
+vt 0.229350 0.207426
+vt 0.235196 0.207426
+vt 0.223024 0.222411
+vt 0.217380 0.222411
+vt 0.228718 0.222411
+vt 0.211784 0.222411
+vt 0.213559 0.217911
+vt 0.215607 0.212817
+vt 0.217791 0.207426
+vt 0.242263 0.217911
+vt 0.244568 0.212817
+vt 0.250510 0.212817
+vt 0.248161 0.217911
+vt 0.256506 0.212817
+vt 0.254115 0.217911
+vt 0.247027 0.207426
+vt 0.253016 0.207426
+vt 0.259057 0.207426
+vt 0.246124 0.222411
+vt 0.240266 0.222411
+vt 0.252042 0.222411
+vt 0.234464 0.222411
+vt 0.236421 0.217911
+vt 0.238679 0.212817
+vt 0.241087 0.207426
+vt 0.266204 0.217911
+vt 0.268670 0.212817
+vt 0.274841 0.212817
+vt 0.272344 0.217911
+vt 0.281074 0.212817
+vt 0.278549 0.217911
+vt 0.271300 0.207426
+vt 0.277505 0.207426
+vt 0.283768 0.207426
+vt 0.270179 0.222411
+vt 0.264067 0.222411
+vt 0.276361 0.222411
+vt 0.258023 0.222411
+vt 0.260129 0.217911
+vt 0.262559 0.212817
+vt 0.265151 0.207426
+vt 0.291169 0.217911
+vt 0.293736 0.212817
+vt 0.300167 0.212817
+vt 0.297587 0.217911
+vt 0.306668 0.212817
+vt 0.304080 0.217911
+vt 0.296474 0.207426
+vt 0.302920 0.207426
+vt 0.309430 0.207426
+vt 0.295350 0.222411
+vt 0.288944 0.222411
+vt 0.301836 0.222411
+vt 0.282615 0.222411
+vt 0.284824 0.217911
+vt 0.287372 0.212817
+vt 0.290090 0.207426
+vt 0.317298 0.217911
+vt 0.319885 0.212817
+vt 0.326604 0.212817
+vt 0.324028 0.217911
+vt 0.333398 0.212817
+vt 0.330839 0.217911
+vt 0.322645 0.207426
+vt 0.329352 0.207426
+vt 0.336126 0.207426
+vt 0.321795 0.222411
+vt 0.315056 0.222411
+vt 0.328622 0.222411
+vt 0.308404 0.222411
+vt 0.310650 0.217911
+vt 0.313241 0.212817
+vt 0.316004 0.207426
+vt 0.344715 0.217911
+vt 0.347214 0.212817
+vt 0.354238 0.212817
+vt 0.351780 0.217911
+vt 0.361338 0.212817
+vt 0.358931 0.217911
+vt 0.349880 0.207426
+vt 0.356859 0.207426
+vt 0.363906 0.207426
+vt 0.349650 0.222411
+vt 0.342549 0.222411
+vt 0.356845 0.222411
+vt 0.335540 0.222411
+vt 0.337735 0.217911
+vt 0.340268 0.212817
+vt 0.342969 0.207426
+vt 0.373493 0.217911
+vt 0.375771 0.212817
+vt 0.383102 0.212817
+vt 0.380902 0.217911
+vt 0.390506 0.212817
+vt 0.388394 0.217911
+vt 0.378202 0.207426
+vt 0.385448 0.207426
+vt 0.392758 0.207426
+vt 0.378995 0.222411
+vt 0.371518 0.222411
+vt 0.386564 0.222411
+vt 0.364135 0.222411
+vt 0.366169 0.217911
+vt 0.368517 0.212817
+vt 0.371021 0.207426
+vt 0.403625 0.217911
+vt 0.405531 0.212817
+vt 0.413145 0.212817
+vt 0.411357 0.217911
+vt 0.420823 0.212817
+vt 0.419162 0.217911
+vt 0.407563 0.207426
+vt 0.415053 0.207426
+vt 0.422596 0.207426
+vt 0.409807 0.222411
+vt 0.401973 0.222411
+vt 0.417722 0.222411
+vt 0.394224 0.222411
+vt 0.395970 0.217911
+vt 0.397983 0.212817
+vt 0.400131 0.207426
+vt 0.434978 0.217911
+vt 0.436359 0.212817
+vt 0.444205 0.212817
+vt 0.442978 0.217911
+vt 0.452098 0.212817
+vt 0.451031 0.217911
+vt 0.437831 0.207426
+vt 0.445514 0.207426
+vt 0.453236 0.207426
+vt 0.441914 0.222411
+vt 0.433782 0.222411
+vt 0.450106 0.222411
+vt 0.425716 0.222411
+vt 0.427038 0.217911
+vt 0.428563 0.212817
+vt 0.430190 0.207426
+vt 0.467272 0.217911
+vt 0.467999 0.212817
+vt 0.475994 0.212817
+vt 0.475445 0.217911
+vt 0.484011 0.212817
+vt 0.483642 0.217911
+vt 0.468774 0.207426
+vt 0.476580 0.207426
+vt 0.484404 0.207426
+vt 0.474969 0.222411
+vt 0.466642 0.222411
+vt 0.483323 0.222411
+vt 0.458351 0.222411
+vt 0.459131 0.217911
+vt 0.460031 0.212817
+vt 0.460991 0.207426
+vt 0.178945 0.311012
+vt 0.178945 0.310325
+vt 0.184456 0.310325
+vt 0.184456 0.311012
+vt 0.190006 0.310325
+vt 0.190006 0.311012
+vt 0.178945 0.309611
+vt 0.184456 0.309611
+vt 0.190006 0.309611
+vt 0.184456 0.311643
+vt 0.178945 0.311643
+vt 0.184456 0.312190
+vt 0.178945 0.312190
+vt 0.190006 0.311643
+vt 0.190006 0.312190
+vt 0.173481 0.311643
+vt 0.173481 0.311012
+vt 0.168071 0.311643
+vt 0.168071 0.311012
+vt 0.173481 0.312190
+vt 0.168071 0.312190
+vt 0.173481 0.310325
+vt 0.173481 0.309611
+vt 0.168071 0.310325
+vt 0.168071 0.309611
+vt 0.178553 0.316229
+vt 0.178553 0.315623
+vt 0.173104 0.315623
+vt 0.173104 0.316229
+vt 0.167709 0.315623
+vt 0.167709 0.316229
+vt 0.178553 0.314961
+vt 0.173104 0.314961
+vt 0.167709 0.314961
+vt 0.173104 0.316726
+vt 0.178553 0.316726
+vt 0.173104 0.317058
+vt 0.178553 0.317058
+vt 0.167709 0.316726
+vt 0.167709 0.317058
+vt 0.184049 0.316726
+vt 0.184049 0.316229
+vt 0.189585 0.316726
+vt 0.189585 0.316229
+vt 0.184049 0.317058
+vt 0.189585 0.317058
+vt 0.184049 0.315623
+vt 0.184049 0.314961
+vt 0.189585 0.315623
+vt 0.189585 0.314961
+vt 0.201206 0.311012
+vt 0.201206 0.310325
+vt 0.206858 0.310325
+vt 0.206858 0.311012
+vt 0.212549 0.310325
+vt 0.212549 0.311012
+vt 0.201206 0.309611
+vt 0.206858 0.309611
+vt 0.212549 0.309611
+vt 0.206858 0.311643
+vt 0.201205 0.311643
+vt 0.206858 0.312190
+vt 0.201206 0.312190
+vt 0.212549 0.311643
+vt 0.212549 0.312190
+vt 0.195588 0.311643
+vt 0.195588 0.311012
+vt 0.195588 0.312190
+vt 0.195588 0.310325
+vt 0.195588 0.309611
+vt 0.200757 0.316229
+vt 0.200757 0.315623
+vt 0.195154 0.315623
+vt 0.195154 0.316229
+vt 0.200757 0.314961
+vt 0.195154 0.314961
+vt 0.195154 0.316726
+vt 0.200757 0.316726
+vt 0.195154 0.317058
+vt 0.200757 0.317058
+vt 0.206397 0.316726
+vt 0.206397 0.316229
+vt 0.212074 0.316726
+vt 0.212074 0.316229
+vt 0.206397 0.317058
+vt 0.212074 0.317058
+vt 0.206397 0.315623
+vt 0.206397 0.314961
+vt 0.212074 0.315623
+vt 0.212074 0.314961
+vt 0.224048 0.311012
+vt 0.224048 0.310325
+vt 0.229861 0.310325
+vt 0.229861 0.311012
+vt 0.235717 0.310325
+vt 0.235717 0.311012
+vt 0.224048 0.309611
+vt 0.229861 0.309611
+vt 0.235717 0.309611
+vt 0.229861 0.311643
+vt 0.224048 0.311643
+vt 0.229861 0.312190
+vt 0.224048 0.312190
+vt 0.235717 0.311643
+vt 0.235717 0.312190
+vt 0.218278 0.311643
+vt 0.218278 0.311012
+vt 0.218278 0.312190
+vt 0.218278 0.310325
+vt 0.218278 0.309611
+vt 0.223549 0.316229
+vt 0.223549 0.315623
+vt 0.217791 0.315623
+vt 0.217791 0.316229
+vt 0.223549 0.314961
+vt 0.217791 0.314961
+vt 0.217791 0.316726
+vt 0.223549 0.316726
+vt 0.217791 0.317058
+vt 0.223549 0.317058
+vt 0.229350 0.316726
+vt 0.229350 0.316229
+vt 0.235196 0.316726
+vt 0.235196 0.316229
+vt 0.229350 0.317058
+vt 0.235196 0.317058
+vt 0.229350 0.315623
+vt 0.229350 0.314961
+vt 0.235196 0.315623
+vt 0.235196 0.314961
+vt 0.247568 0.311012
+vt 0.247568 0.310325
+vt 0.253567 0.310325
+vt 0.253567 0.311012
+vt 0.259615 0.310325
+vt 0.259615 0.311012
+vt 0.247568 0.309611
+vt 0.253567 0.309611
+vt 0.259615 0.309611
+vt 0.253567 0.311643
+vt 0.247568 0.311643
+vt 0.253567 0.312190
+vt 0.247568 0.312190
+vt 0.259615 0.311643
+vt 0.259615 0.312190
+vt 0.241619 0.311643
+vt 0.241619 0.311012
+vt 0.241619 0.312190
+vt 0.241619 0.310325
+vt 0.241619 0.309611
+vt 0.247027 0.316229
+vt 0.247027 0.315623
+vt 0.241087 0.315623
+vt 0.241087 0.316229
+vt 0.247027 0.314961
+vt 0.241087 0.314961
+vt 0.241087 0.316726
+vt 0.247027 0.316726
+vt 0.241087 0.317058
+vt 0.247027 0.317058
+vt 0.253016 0.316726
+vt 0.253016 0.316229
+vt 0.259057 0.316726
+vt 0.259057 0.316229
+vt 0.253016 0.317058
+vt 0.259057 0.317058
+vt 0.253016 0.315623
+vt 0.253016 0.314961
+vt 0.259057 0.315623
+vt 0.259057 0.314961
+vt 0.271872 0.311012
+vt 0.271872 0.310325
+vt 0.278082 0.310325
+vt 0.278082 0.311012
+vt 0.284349 0.310325
+vt 0.284349 0.311012
+vt 0.271872 0.309611
+vt 0.278082 0.309611
+vt 0.284349 0.309611
+vt 0.278082 0.311643
+vt 0.271872 0.311643
+vt 0.278082 0.312190
+vt 0.271872 0.312190
+vt 0.284349 0.311643
+vt 0.284349 0.312190
+vt 0.265717 0.311643
+vt 0.265717 0.311012
+vt 0.265717 0.312190
+vt 0.265717 0.310325
+vt 0.265717 0.309611
+vt 0.271300 0.316229
+vt 0.271300 0.315623
+vt 0.265151 0.315623
+vt 0.265151 0.316229
+vt 0.271300 0.314961
+vt 0.265151 0.314961
+vt 0.265151 0.316726
+vt 0.271300 0.316726
+vt 0.265151 0.317058
+vt 0.271300 0.317058
+vt 0.277505 0.316726
+vt 0.277505 0.316229
+vt 0.283768 0.316726
+vt 0.283768 0.316229
+vt 0.277505 0.317058
+vt 0.283768 0.317058
+vt 0.277505 0.315623
+vt 0.277505 0.314961
+vt 0.283768 0.315623
+vt 0.283768 0.314961
+vt 0.297061 0.311012
+vt 0.297061 0.310325
+vt 0.303508 0.310325
+vt 0.303508 0.311012
+vt 0.310017 0.310325
+vt 0.310017 0.311012
+vt 0.297061 0.309611
+vt 0.303508 0.309611
+vt 0.310017 0.309611
+vt 0.303508 0.311643
+vt 0.297061 0.311643
+vt 0.303508 0.312190
+vt 0.297061 0.312190
+vt 0.310017 0.311643
+vt 0.310017 0.312190
+vt 0.290675 0.311643
+vt 0.290675 0.311012
+vt 0.290675 0.312190
+vt 0.290675 0.310325
+vt 0.290675 0.309611
+vt 0.296474 0.316229
+vt 0.296474 0.315623
+vt 0.290090 0.315623
+vt 0.290090 0.316229
+vt 0.296474 0.314961
+vt 0.290090 0.314961
+vt 0.290090 0.316726
+vt 0.296474 0.316726
+vt 0.290090 0.317058
+vt 0.296474 0.317058
+vt 0.302920 0.316726
+vt 0.302920 0.316229
+vt 0.309430 0.316726
+vt 0.309430 0.316229
+vt 0.302920 0.317058
+vt 0.309430 0.317058
+vt 0.302920 0.315623
+vt 0.302920 0.314961
+vt 0.309430 0.315623
+vt 0.309430 0.314961
+vt 0.323227 0.311012
+vt 0.323227 0.310325
+vt 0.329930 0.310325
+vt 0.329930 0.311012
+vt 0.336698 0.310325
+vt 0.336698 0.311012
+vt 0.323227 0.309611
+vt 0.329930 0.309611
+vt 0.336698 0.309611
+vt 0.329930 0.311643
+vt 0.323227 0.311643
+vt 0.329930 0.312190
+vt 0.323227 0.312190
+vt 0.336698 0.311643
+vt 0.336698 0.312190
+vt 0.316590 0.311643
+vt 0.316590 0.311012
+vt 0.316590 0.312190
+vt 0.316590 0.310325
+vt 0.316590 0.309611
+vt 0.322645 0.316229
+vt 0.322645 0.315623
+vt 0.316004 0.315623
+vt 0.316004 0.316229
+vt 0.322645 0.314961
+vt 0.316004 0.314961
+vt 0.316004 0.316726
+vt 0.322645 0.316726
+vt 0.316004 0.317058
+vt 0.322645 0.317058
+vt 0.329352 0.316726
+vt 0.329352 0.316229
+vt 0.336126 0.316726
+vt 0.336126 0.316229
+vt 0.329352 0.317058
+vt 0.336126 0.317058
+vt 0.329352 0.315623
+vt 0.329352 0.314961
+vt 0.336126 0.315623
+vt 0.336126 0.314961
+vt 0.350434 0.311012
+vt 0.350434 0.310325
+vt 0.357401 0.310325
+vt 0.357401 0.311012
+vt 0.364434 0.310325
+vt 0.364434 0.311012
+vt 0.350434 0.309611
+vt 0.357401 0.309611
+vt 0.364434 0.309611
+vt 0.357401 0.311643
+vt 0.350434 0.311643
+vt 0.357401 0.312190
+vt 0.350434 0.312190
+vt 0.364434 0.311643
+vt 0.364434 0.312190
+vt 0.343532 0.311643
+vt 0.343532 0.311012
+vt 0.343532 0.312190
+vt 0.343532 0.310325
+vt 0.343532 0.309611
+vt 0.349880 0.316229
+vt 0.349880 0.315623
+vt 0.342969 0.315623
+vt 0.342969 0.316229
+vt 0.349880 0.314961
+vt 0.342969 0.314961
+vt 0.342969 0.316726
+vt 0.349880 0.316726
+vt 0.342969 0.317058
+vt 0.349880 0.317058
+vt 0.356859 0.316726
+vt 0.356859 0.316229
+vt 0.363906 0.316726
+vt 0.363906 0.316229
+vt 0.356859 0.317058
+vt 0.363906 0.317058
+vt 0.356859 0.315623
+vt 0.356859 0.314961
+vt 0.363906 0.315623
+vt 0.363906 0.314961
+vt 0.378698 0.311012
+vt 0.378698 0.310325
+vt 0.385925 0.310325
+vt 0.385925 0.311012
+vt 0.393215 0.310325
+vt 0.393215 0.311012
+vt 0.378698 0.309611
+vt 0.385925 0.309611
+vt 0.393215 0.309611
+vt 0.385925 0.311643
+vt 0.378698 0.311643
+vt 0.385925 0.312190
+vt 0.378698 0.312190
+vt 0.393215 0.311643
+vt 0.393215 0.312190
+vt 0.371534 0.311643
+vt 0.371534 0.311012
+vt 0.371534 0.312190
+vt 0.371534 0.310325
+vt 0.371534 0.309611
+vt 0.378202 0.316229
+vt 0.378202 0.315623
+vt 0.371021 0.315623
+vt 0.371021 0.316229
+vt 0.378202 0.314961
+vt 0.371021 0.314961
+vt 0.371021 0.316726
+vt 0.378202 0.316726
+vt 0.371021 0.317058
+vt 0.378202 0.317058
+vt 0.385448 0.316726
+vt 0.385448 0.316229
+vt 0.392758 0.316726
+vt 0.392758 0.316229
+vt 0.385448 0.317058
+vt 0.392758 0.317058
+vt 0.385448 0.315623
+vt 0.385448 0.314961
+vt 0.392758 0.315623
+vt 0.392758 0.314961
+vt 0.407972 0.311012
+vt 0.407972 0.310325
+vt 0.415435 0.310325
+vt 0.415435 0.311012
+vt 0.422949 0.310325
+vt 0.422949 0.311012
+vt 0.407972 0.309611
+vt 0.415435 0.309611
+vt 0.422949 0.309611
+vt 0.415434 0.311643
+vt 0.407972 0.311643
+vt 0.415435 0.312190
+vt 0.407972 0.312190
+vt 0.422949 0.311643
+vt 0.422949 0.312190
+vt 0.400564 0.311643
+vt 0.400564 0.311012
+vt 0.400564 0.312190
+vt 0.400564 0.310325
+vt 0.400564 0.309611
+vt 0.407563 0.316229
+vt 0.407563 0.315623
+vt 0.400131 0.315623
+vt 0.400131 0.316229
+vt 0.407563 0.314961
+vt 0.400131 0.314961
+vt 0.400131 0.316726
+vt 0.407563 0.316726
+vt 0.400131 0.317058
+vt 0.407563 0.317058
+vt 0.415053 0.316726
+vt 0.415053 0.316229
+vt 0.422596 0.316726
+vt 0.422596 0.316229
+vt 0.415053 0.317058
+vt 0.422596 0.317058
+vt 0.415053 0.315623
+vt 0.415053 0.314961
+vt 0.422596 0.315623
+vt 0.422596 0.314961
+vt 0.438123 0.311012
+vt 0.438123 0.310325
+vt 0.445773 0.310325
+vt 0.445773 0.311012
+vt 0.453460 0.310325
+vt 0.453460 0.311012
+vt 0.438123 0.309611
+vt 0.445773 0.309611
+vt 0.453460 0.309611
+vt 0.445773 0.311643
+vt 0.438123 0.311643
+vt 0.445773 0.312190
+vt 0.438123 0.312190
+vt 0.453460 0.311643
+vt 0.453460 0.312190
+vt 0.430513 0.311643
+vt 0.430513 0.311012
+vt 0.430513 0.312190
+vt 0.430513 0.310325
+vt 0.430513 0.309611
+vt 0.437831 0.316229
+vt 0.437831 0.315623
+vt 0.430190 0.315623
+vt 0.430190 0.316229
+vt 0.437831 0.314961
+vt 0.430190 0.314961
+vt 0.430190 0.316726
+vt 0.437831 0.316726
+vt 0.430190 0.317058
+vt 0.437831 0.317058
+vt 0.445514 0.316726
+vt 0.445514 0.316229
+vt 0.453236 0.316726
+vt 0.453236 0.316229
+vt 0.445514 0.317058
+vt 0.453236 0.317058
+vt 0.445514 0.315623
+vt 0.445514 0.314961
+vt 0.453236 0.315623
+vt 0.453236 0.314961
+vt 0.468926 0.311012
+vt 0.468926 0.310325
+vt 0.476695 0.310325
+vt 0.476695 0.311012
+vt 0.484481 0.310325
+vt 0.484481 0.311012
+vt 0.468927 0.309611
+vt 0.476695 0.309611
+vt 0.484481 0.309611
+vt 0.476695 0.311643
+vt 0.468926 0.311643
+vt 0.476695 0.312190
+vt 0.468926 0.312190
+vt 0.484481 0.311643
+vt 0.484481 0.312190
+vt 0.461180 0.311643
+vt 0.461180 0.311012
+vt 0.461180 0.312190
+vt 0.461180 0.310325
+vt 0.461180 0.309611
+vt 0.468774 0.316229
+vt 0.468774 0.315623
+vt 0.460991 0.315623
+vt 0.460991 0.316229
+vt 0.468774 0.314961
+vt 0.460991 0.314961
+vt 0.460991 0.316726
+vt 0.468774 0.316726
+vt 0.460991 0.317058
+vt 0.468774 0.317058
+vt 0.476580 0.316726
+vt 0.476580 0.316229
+vt 0.484404 0.316726
+vt 0.484404 0.316229
+vt 0.476580 0.317058
+vt 0.484404 0.317058
+vt 0.476580 0.315623
+vt 0.476580 0.314961
+vt 0.484404 0.315623
+vt 0.484404 0.314961
+vt 0.157418 0.311012
+vt 0.157418 0.310325
+vt 0.162722 0.310325
+vt 0.162722 0.311012
+vt 0.157418 0.309611
+vt 0.162722 0.309611
+vt 0.162722 0.311643
+vt 0.157418 0.311643
+vt 0.162722 0.312190
+vt 0.157418 0.312190
+vt 0.152144 0.311643
+vt 0.152144 0.311012
+vt 0.146886 0.311643
+vt 0.146886 0.311012
+vt 0.152144 0.312190
+vt 0.146886 0.312190
+vt 0.152144 0.310325
+vt 0.152144 0.309611
+vt 0.146886 0.310325
+vt 0.146886 0.309611
+vt 0.114756 0.315180
+vt 0.111839 0.315160
+vt 0.111830 0.314303
+vt 0.114764 0.314336
+vt 0.111821 0.313445
+vt 0.114771 0.313492
+vt 0.109175 0.315138
+vt 0.109149 0.314267
+vt 0.109124 0.313395
+vt 0.118204 0.314362
+vt 0.118182 0.315194
+vt 0.122405 0.314378
+vt 0.122369 0.315199
+vt 0.118227 0.313530
+vt 0.122442 0.313556
+vt 0.118159 0.316026
+vt 0.114749 0.316024
+vt 0.118136 0.316858
+vt 0.114741 0.316868
+vt 0.122332 0.316021
+vt 0.122296 0.316843
+vt 0.111848 0.316018
+vt 0.109201 0.316010
+vt 0.111856 0.316876
+vt 0.109227 0.316882
+vt 0.157086 0.316229
+vt 0.157086 0.315623
+vt 0.151828 0.315623
+vt 0.151828 0.316229
+vt 0.146584 0.315623
+vt 0.146584 0.316229
+vt 0.157086 0.314961
+vt 0.151828 0.314961
+vt 0.146584 0.314961
+vt 0.151828 0.316726
+vt 0.157086 0.316726
+vt 0.151828 0.317058
+vt 0.157086 0.317058
+vt 0.146584 0.316726
+vt 0.146584 0.317058
+vt 0.162375 0.316726
+vt 0.162375 0.316229
+vt 0.162375 0.317058
+vt 0.162375 0.315623
+vt 0.162375 0.314961
+vt 0.157038 0.317088
+vt 0.157086 0.317170
+vt 0.151828 0.317170
+vt 0.151621 0.317108
+vt 0.146584 0.317170
+vt 0.146165 0.317134
+vt 0.150999 0.316914
+vt 0.156895 0.316837
+vt 0.144907 0.317018
+vt 0.162397 0.316811
+vt 0.167732 0.316811
+vt 0.162375 0.317170
+vt 0.167709 0.317170
+vt 0.133362 0.315181
+vt 0.127572 0.315194
+vt 0.127620 0.314380
+vt 0.133337 0.314365
+vt 0.127668 0.313566
+vt 0.133231 0.313548
+vt 0.139048 0.314329
+vt 0.139312 0.315165
+vt 0.138457 0.313490
+vt 0.138919 0.315999
+vt 0.133222 0.315997
+vt 0.138197 0.316831
+vt 0.133001 0.316813
+vt 0.127524 0.316008
+vt 0.127476 0.316822
+vt 0.157361 0.313004
+vt 0.157418 0.312625
+vt 0.162722 0.312625
+vt 0.162717 0.313010
+vt 0.168071 0.312625
+vt 0.168066 0.313010
+vt 0.162700 0.313405
+vt 0.157189 0.313380
+vt 0.168049 0.313405
+vt 0.151291 0.313307
+vt 0.151931 0.312985
+vt 0.145200 0.313209
+vt 0.146465 0.312961
+vt 0.152144 0.312625
+vt 0.146886 0.312625
+vt 0.178939 0.313010
+vt 0.178945 0.312625
+vt 0.184456 0.312625
+vt 0.184449 0.313010
+vt 0.190006 0.312625
+vt 0.189999 0.313010
+vt 0.184430 0.313405
+vt 0.178921 0.313405
+vt 0.189979 0.313405
+vt 0.173458 0.313405
+vt 0.173476 0.313010
+vt 0.173481 0.312625
+vt 0.201199 0.313010
+vt 0.201206 0.312625
+vt 0.206858 0.312625
+vt 0.206851 0.313010
+vt 0.212549 0.312625
+vt 0.212541 0.313010
+vt 0.206830 0.313405
+vt 0.201177 0.313405
+vt 0.212519 0.313405
+vt 0.195561 0.313405
+vt 0.195582 0.313010
+vt 0.195588 0.312625
+vt 0.224040 0.313010
+vt 0.224048 0.312625
+vt 0.229861 0.312625
+vt 0.229853 0.313010
+vt 0.235717 0.312625
+vt 0.235709 0.313010
+vt 0.229829 0.313405
+vt 0.224017 0.313405
+vt 0.235684 0.313405
+vt 0.218248 0.313405
+vt 0.218271 0.313010
+vt 0.218278 0.312625
+vt 0.247560 0.313010
+vt 0.247568 0.312625
+vt 0.253567 0.312625
+vt 0.253558 0.313010
+vt 0.259615 0.312625
+vt 0.259607 0.313010
+vt 0.253532 0.313405
+vt 0.247534 0.313405
+vt 0.259581 0.313405
+vt 0.241586 0.313405
+vt 0.241611 0.313010
+vt 0.241619 0.312625
+vt 0.271863 0.313010
+vt 0.271872 0.312625
+vt 0.278082 0.312625
+vt 0.278073 0.313010
+vt 0.284349 0.312625
+vt 0.284340 0.313010
+vt 0.278046 0.313405
+vt 0.271836 0.313405
+vt 0.284313 0.313405
+vt 0.265681 0.313405
+vt 0.265708 0.313010
+vt 0.265717 0.312625
+vt 0.297052 0.313010
+vt 0.297061 0.312625
+vt 0.303508 0.312625
+vt 0.303499 0.313010
+vt 0.310017 0.312625
+vt 0.310008 0.313010
+vt 0.303471 0.313405
+vt 0.297024 0.313405
+vt 0.309981 0.313405
+vt 0.290639 0.313405
+vt 0.290666 0.313010
+vt 0.290675 0.312625
+vt 0.323218 0.313010
+vt 0.323227 0.312625
+vt 0.329930 0.312625
+vt 0.329921 0.313010
+vt 0.336698 0.312625
+vt 0.336689 0.313010
+vt 0.329894 0.313405
+vt 0.323191 0.313405
+vt 0.336662 0.313405
+vt 0.316553 0.313405
+vt 0.316581 0.313010
+vt 0.316590 0.312625
+vt 0.350425 0.313010
+vt 0.350434 0.312625
+vt 0.357401 0.312625
+vt 0.357392 0.313010
+vt 0.364434 0.312625
+vt 0.364426 0.313010
+vt 0.357367 0.313405
+vt 0.350399 0.313405
+vt 0.364401 0.313405
+vt 0.343497 0.313405
+vt 0.343524 0.313010
+vt 0.343532 0.312625
+vt 0.378690 0.313010
+vt 0.378698 0.312625
+vt 0.385925 0.312625
+vt 0.385918 0.313010
+vt 0.393215 0.312625
+vt 0.393207 0.313010
+vt 0.385895 0.313405
+vt 0.378667 0.313405
+vt 0.393186 0.313405
+vt 0.371502 0.313405
+vt 0.371526 0.313010
+vt 0.371534 0.312625
+vt 0.407966 0.313010
+vt 0.407972 0.312625
+vt 0.415435 0.312625
+vt 0.415429 0.313010
+vt 0.422949 0.312625
+vt 0.422944 0.313010
+vt 0.415411 0.313405
+vt 0.407946 0.313405
+vt 0.422927 0.313405
+vt 0.400537 0.313405
+vt 0.400558 0.313010
+vt 0.400564 0.312625
+vt 0.438118 0.313010
+vt 0.438123 0.312625
+vt 0.445773 0.312625
+vt 0.445769 0.313010
+vt 0.453460 0.312625
+vt 0.453457 0.313010
+vt 0.445757 0.313405
+vt 0.438105 0.313405
+vt 0.453446 0.313405
+vt 0.430493 0.313405
+vt 0.430508 0.313010
+vt 0.430513 0.312625
+vt 0.468924 0.313010
+vt 0.468926 0.312625
+vt 0.476695 0.312625
+vt 0.476693 0.313010
+vt 0.484481 0.312625
+vt 0.484479 0.313010
+vt 0.476688 0.313405
+vt 0.468917 0.313405
+vt 0.484476 0.313405
+vt 0.461168 0.313405
+vt 0.461177 0.313010
+vt 0.461180 0.312625
+vt 0.468774 0.317170
+vt 0.460991 0.317170
+vt 0.453236 0.317170
+vt 0.461002 0.316811
+vt 0.468784 0.316811
+vt 0.453250 0.316811
+vt 0.476587 0.316811
+vt 0.484408 0.316811
+vt 0.476580 0.317170
+vt 0.484404 0.317170
+vt 0.437831 0.317170
+vt 0.430190 0.317170
+vt 0.422596 0.317170
+vt 0.430210 0.316811
+vt 0.437849 0.316811
+vt 0.422618 0.316811
+vt 0.445530 0.316811
+vt 0.445514 0.317170
+vt 0.407563 0.317170
+vt 0.400131 0.317170
+vt 0.392758 0.317170
+vt 0.400158 0.316811
+vt 0.407589 0.316811
+vt 0.392787 0.316811
+vt 0.415076 0.316811
+vt 0.415053 0.317170
+vt 0.378202 0.317170
+vt 0.371021 0.317170
+vt 0.363906 0.317170
+vt 0.371053 0.316811
+vt 0.378233 0.316811
+vt 0.363939 0.316811
+vt 0.385478 0.316811
+vt 0.385456 0.317082
+vt 0.385448 0.317170
+vt 0.349880 0.317170
+vt 0.342969 0.317170
+vt 0.336126 0.317170
+vt 0.343004 0.316811
+vt 0.349915 0.316811
+vt 0.336162 0.316811
+vt 0.356893 0.316811
+vt 0.356859 0.317170
+vt 0.322654 0.317082
+vt 0.322645 0.317170
+vt 0.316004 0.317170
+vt 0.309430 0.317170
+vt 0.316041 0.316811
+vt 0.322681 0.316811
+vt 0.309466 0.316811
+vt 0.329388 0.316811
+vt 0.329352 0.317170
+vt 0.296474 0.317170
+vt 0.290090 0.317170
+vt 0.283768 0.317170
+vt 0.290127 0.316811
+vt 0.296511 0.316811
+vt 0.283804 0.316811
+vt 0.302957 0.316811
+vt 0.302920 0.317170
+vt 0.271300 0.317170
+vt 0.265151 0.317170
+vt 0.259057 0.317170
+vt 0.265186 0.316811
+vt 0.271336 0.316811
+vt 0.259092 0.316811
+vt 0.277541 0.316811
+vt 0.277505 0.317170
+vt 0.247027 0.317170
+vt 0.241087 0.317170
+vt 0.235196 0.317170
+vt 0.241121 0.316811
+vt 0.247061 0.316811
+vt 0.235228 0.316811
+vt 0.253051 0.316811
+vt 0.253016 0.317170
+vt 0.223557 0.317082
+vt 0.223549 0.317170
+vt 0.217791 0.317170
+vt 0.212074 0.317170
+vt 0.217822 0.316811
+vt 0.223580 0.316811
+vt 0.212104 0.316811
+vt 0.229382 0.316811
+vt 0.229350 0.317170
+vt 0.200757 0.317170
+vt 0.195154 0.317170
+vt 0.189585 0.317170
+vt 0.195181 0.316811
+vt 0.200785 0.316811
+vt 0.189611 0.316811
+vt 0.206426 0.316811
+vt 0.206397 0.317170
+vt 0.178553 0.317170
+vt 0.173104 0.317170
+vt 0.173128 0.316811
+vt 0.178578 0.316811
+vt 0.184075 0.316811
+vt 0.184055 0.317082
+vt 0.184049 0.317170
+vt 0.500080 0.073765
+vt 0.492818 0.073765
+vt 0.492818 0.072664
+vt 0.500080 0.072664
+vt 0.492818 0.071000
+vt 0.500080 0.071000
+vt 0.507341 0.072664
+vt 0.507342 0.073765
+vt 0.514600 0.072664
+vt 0.514600 0.073765
+vt 0.507341 0.071000
+vt 0.514600 0.071000
+vt 0.507342 0.074484
+vt 0.500080 0.074484
+vt 0.507344 0.075005
+vt 0.500080 0.075005
+vt 0.514602 0.074484
+vt 0.514605 0.075005
+vt 0.492818 0.074484
+vt 0.492816 0.075005
+vt 0.529096 0.073765
+vt 0.521853 0.073765
+vt 0.521852 0.072664
+vt 0.529095 0.072664
+vt 0.521852 0.071000
+vt 0.529095 0.071000
+vt 0.536326 0.072664
+vt 0.536327 0.073765
+vt 0.543542 0.072664
+vt 0.543544 0.073765
+vt 0.536326 0.071000
+vt 0.543542 0.071000
+vt 0.536331 0.074484
+vt 0.529099 0.074484
+vt 0.536338 0.075005
+vt 0.529105 0.075005
+vt 0.543548 0.074484
+vt 0.543556 0.075005
+vt 0.521855 0.074484
+vt 0.521859 0.075005
+vt 0.557920 0.073765
+vt 0.550742 0.073765
+vt 0.550741 0.072664
+vt 0.557918 0.072664
+vt 0.550741 0.071000
+vt 0.557918 0.071000
+vt 0.565073 0.072664
+vt 0.565075 0.073765
+vt 0.572202 0.072664
+vt 0.572205 0.073765
+vt 0.565073 0.071000
+vt 0.572202 0.071000
+vt 0.565081 0.074484
+vt 0.557925 0.074484
+vt 0.565093 0.075005
+vt 0.557936 0.075005
+vt 0.572211 0.074484
+vt 0.572224 0.075005
+vt 0.550747 0.074484
+vt 0.550756 0.075005
+vt 0.586378 0.073765
+vt 0.579306 0.073765
+vt 0.579304 0.072664
+vt 0.586375 0.072664
+vt 0.579304 0.071000
+vt 0.586375 0.071000
+vt 0.593415 0.072664
+vt 0.593418 0.073765
+vt 0.600421 0.072664
+vt 0.600424 0.073765
+vt 0.593415 0.071000
+vt 0.600421 0.071000
+vt 0.593426 0.074484
+vt 0.586385 0.074484
+vt 0.593442 0.075005
+vt 0.586401 0.075005
+vt 0.600432 0.074484
+vt 0.600450 0.075005
+vt 0.579313 0.074484
+vt 0.579328 0.075005
+vt 0.614328 0.073765
+vt 0.607394 0.073765
+vt 0.607391 0.072664
+vt 0.614325 0.072664
+vt 0.607391 0.071000
+vt 0.614325 0.071000
+vt 0.621220 0.072664
+vt 0.621224 0.073765
+vt 0.628076 0.072664
+vt 0.628080 0.073765
+vt 0.621220 0.071000
+vt 0.628076 0.071000
+vt 0.621234 0.074484
+vt 0.614338 0.074484
+vt 0.621253 0.075005
+vt 0.614357 0.075005
+vt 0.628090 0.074484
+vt 0.628111 0.075005
+vt 0.607403 0.074484
+vt 0.607422 0.075005
+vt 0.641670 0.073765
+vt 0.634896 0.073765
+vt 0.634892 0.072664
+vt 0.641667 0.072664
+vt 0.634892 0.071000
+vt 0.641667 0.071000
+vt 0.648400 0.072664
+vt 0.648403 0.073765
+vt 0.655090 0.072664
+vt 0.655094 0.073765
+vt 0.648400 0.071000
+vt 0.655090 0.071000
+vt 0.648415 0.074484
+vt 0.641681 0.074484
+vt 0.648437 0.075005
+vt 0.641703 0.075005
+vt 0.655106 0.074484
+vt 0.655128 0.075005
+vt 0.634906 0.074484
+vt 0.634928 0.075005
+vt 0.668347 0.073765
+vt 0.661742 0.073765
+vt 0.661738 0.072664
+vt 0.668343 0.072664
+vt 0.661738 0.071000
+vt 0.668343 0.071000
+vt 0.674905 0.072664
+vt 0.674909 0.073765
+vt 0.681425 0.072664
+vt 0.681428 0.073765
+vt 0.674905 0.071000
+vt 0.681424 0.071000
+vt 0.674921 0.074484
+vt 0.668359 0.074484
+vt 0.674945 0.075005
+vt 0.668382 0.075005
+vt 0.681440 0.074484
+vt 0.681464 0.075005
+vt 0.661754 0.074484
+vt 0.661777 0.075005
+vt 0.694338 0.073765
+vt 0.687905 0.073765
+vt 0.687901 0.072664
+vt 0.694334 0.072664
+vt 0.687901 0.071000
+vt 0.694334 0.071000
+vt 0.700726 0.072664
+vt 0.700730 0.073765
+vt 0.707076 0.072664
+vt 0.707080 0.073765
+vt 0.700726 0.071000
+vt 0.707076 0.071000
+vt 0.700742 0.074484
+vt 0.694350 0.074484
+vt 0.700766 0.075005
+vt 0.694375 0.075005
+vt 0.707092 0.074484
+vt 0.707116 0.075005
+vt 0.687917 0.074484
+vt 0.687941 0.075005
+vt 0.719656 0.073765
+vt 0.713388 0.073765
+vt 0.713384 0.072664
+vt 0.719652 0.072664
+vt 0.713384 0.071000
+vt 0.719652 0.071000
+vt 0.725880 0.072664
+vt 0.725884 0.073765
+vt 0.732068 0.072664
+vt 0.732072 0.073765
+vt 0.725880 0.071000
+vt 0.732068 0.071000
+vt 0.725896 0.074484
+vt 0.719668 0.074484
+vt 0.725920 0.075005
+vt 0.719692 0.075005
+vt 0.732084 0.074484
+vt 0.732108 0.075005
+vt 0.713400 0.074484
+vt 0.713424 0.075005
+vt 0.744335 0.073765
+vt 0.738222 0.073765
+vt 0.738218 0.072664
+vt 0.744331 0.072664
+vt 0.738218 0.071000
+vt 0.744331 0.071000
+vt 0.750407 0.072664
+vt 0.750410 0.073765
+vt 0.756447 0.072664
+vt 0.756450 0.073765
+vt 0.750407 0.071000
+vt 0.756447 0.071000
+vt 0.750422 0.074484
+vt 0.744346 0.074484
+vt 0.750445 0.075005
+vt 0.744370 0.075005
+vt 0.756462 0.074484
+vt 0.756484 0.075005
+vt 0.738234 0.074484
+vt 0.738258 0.075005
+vt 0.768426 0.073765
+vt 0.762455 0.073765
+vt 0.762452 0.072664
+vt 0.768423 0.072664
+vt 0.762452 0.071000
+vt 0.768423 0.071000
+vt 0.774361 0.072664
+vt 0.774364 0.073765
+vt 0.780267 0.072664
+vt 0.780271 0.073765
+vt 0.774361 0.071000
+vt 0.780267 0.071000
+vt 0.774375 0.074484
+vt 0.768437 0.074484
+vt 0.774397 0.075005
+vt 0.768459 0.075005
+vt 0.780281 0.074484
+vt 0.780302 0.075005
+vt 0.762466 0.074484
+vt 0.762489 0.075005
+vt 0.791991 0.073765
+vt 0.786146 0.073765
+vt 0.786142 0.072664
+vt 0.791988 0.072664
+vt 0.786142 0.071000
+vt 0.791988 0.071000
+vt 0.797805 0.072664
+vt 0.797808 0.073765
+vt 0.803594 0.072664
+vt 0.803597 0.073765
+vt 0.797805 0.071000
+vt 0.803594 0.071000
+vt 0.797818 0.074484
+vt 0.792001 0.074484
+vt 0.797837 0.075005
+vt 0.792021 0.075005
+vt 0.803607 0.074484
+vt 0.803625 0.075005
+vt 0.786156 0.074484
+vt 0.786177 0.075005
+vt 0.815087 0.073765
+vt 0.809360 0.073765
+vt 0.809357 0.072664
+vt 0.815085 0.072664
+vt 0.809357 0.071000
+vt 0.815085 0.071000
+vt 0.820770 0.072664
+vt 0.820773 0.073765
+vt 0.826406 0.072664
+vt 0.826409 0.073765
+vt 0.820770 0.071000
+vt 0.826406 0.071000
+vt 0.820782 0.074484
+vt 0.815096 0.074484
+vt 0.820799 0.075005
+vt 0.815114 0.075005
+vt 0.826417 0.074484
+vt 0.826433 0.075005
+vt 0.809369 0.074484
+vt 0.809387 0.075005
+vt 0.848467 0.073749
+vt 0.847322 0.073755
+vt 0.847320 0.072664
+vt 0.848465 0.072664
+vt 0.847320 0.071000
+vt 0.848465 0.071000
+vt 0.845174 0.073760
+vt 0.845172 0.072664
+vt 0.845172 0.071000
+vt 0.848941 0.072664
+vt 0.848943 0.073742
+vt 0.849083 0.072664
+vt 0.849086 0.073734
+vt 0.848941 0.071000
+vt 0.849083 0.071000
+vt 0.848950 0.074393
+vt 0.848474 0.074422
+vt 0.848964 0.074779
+vt 0.848488 0.074849
+vt 0.849093 0.074363
+vt 0.849106 0.074703
+vt 0.847329 0.074446
+vt 0.845181 0.074465
+vt 0.847343 0.074911
+vt 0.845195 0.074958
+vt 0.500080 0.076270
+vt 0.492803 0.076270
+vt 0.492814 0.075511
+vt 0.500080 0.075511
+vt 0.507346 0.075511
+vt 0.507357 0.076270
+vt 0.514609 0.075511
+vt 0.514631 0.076270
+vt 0.507385 0.077549
+vt 0.500080 0.077549
+vt 0.507436 0.079617
+vt 0.500080 0.079617
+vt 0.514686 0.077549
+vt 0.514789 0.079617
+vt 0.492775 0.077549
+vt 0.492724 0.079617
+vt 0.529158 0.076270
+vt 0.521899 0.076270
+vt 0.521866 0.075511
+vt 0.529114 0.075511
+vt 0.536349 0.075511
+vt 0.536404 0.076270
+vt 0.543570 0.075511
+vt 0.543634 0.076270
+vt 0.536538 0.077549
+vt 0.529266 0.077549
+vt 0.536792 0.079617
+vt 0.529470 0.079617
+vt 0.543795 0.077549
+vt 0.544096 0.079617
+vt 0.521981 0.077549
+vt 0.522135 0.079617
+vt 0.558039 0.076270
+vt 0.550847 0.076270
+vt 0.550772 0.075511
+vt 0.557954 0.075511
+vt 0.565113 0.075511
+vt 0.565207 0.076270
+vt 0.572246 0.075511
+vt 0.572349 0.076270
+vt 0.565439 0.077549
+vt 0.558248 0.077549
+vt 0.565876 0.079617
+vt 0.558641 0.079617
+vt 0.572603 0.077549
+vt 0.573082 0.079617
+vt 0.551032 0.077549
+vt 0.551380 0.079617
+vt 0.586546 0.076270
+vt 0.579462 0.076270
+vt 0.579351 0.075511
+vt 0.586426 0.075511
+vt 0.593470 0.075511
+vt 0.593596 0.076270
+vt 0.600479 0.075511
+vt 0.600613 0.076270
+vt 0.593911 0.077549
+vt 0.586841 0.077549
+vt 0.594501 0.079617
+vt 0.587396 0.079617
+vt 0.600944 0.077549
+vt 0.601568 0.079617
+vt 0.579738 0.077549
+vt 0.580256 0.079617
+vt 0.614535 0.076270
+vt 0.607593 0.076270
+vt 0.607452 0.075511
+vt 0.614388 0.075511
+vt 0.621287 0.075511
+vt 0.621439 0.076270
+vt 0.628145 0.075511
+vt 0.628302 0.076270
+vt 0.621816 0.077549
+vt 0.614898 0.077549
+vt 0.622523 0.079617
+vt 0.615580 0.079617
+vt 0.628692 0.077549
+vt 0.629422 0.079617
+vt 0.607941 0.077549
+vt 0.608594 0.079617
+vt 0.641905 0.076270
+vt 0.635125 0.076270
+vt 0.634963 0.075511
+vt 0.641739 0.075511
+vt 0.648474 0.075511
+vt 0.648644 0.076270
+vt 0.655166 0.075511
+vt 0.655339 0.076270
+vt 0.649063 0.077549
+vt 0.642316 0.077549
+vt 0.649849 0.079617
+vt 0.643086 0.079617
+vt 0.655765 0.077549
+vt 0.656565 0.079617
+vt 0.635525 0.077549
+vt 0.636277 0.079617
+vt 0.668599 0.076270
+vt 0.661991 0.076270
+vt 0.661815 0.075511
+vt 0.668422 0.075511
+vt 0.674985 0.075511
+vt 0.675163 0.076270
+vt 0.681504 0.075511
+vt 0.681684 0.076270
+vt 0.675605 0.077549
+vt 0.669037 0.077549
+vt 0.676433 0.079617
+vt 0.669858 0.079617
+vt 0.682129 0.077549
+vt 0.682962 0.079617
+vt 0.662423 0.077549
+vt 0.663235 0.079617
+vt 0.694596 0.076270
+vt 0.688162 0.076270
+vt 0.687981 0.075511
+vt 0.694415 0.075511
+vt 0.700807 0.075511
+vt 0.700988 0.076270
+vt 0.707157 0.075511
+vt 0.707337 0.076270
+vt 0.701435 0.077549
+vt 0.695044 0.077549
+vt 0.702272 0.079617
+vt 0.695881 0.079617
+vt 0.707783 0.077549
+vt 0.708618 0.079617
+vt 0.688608 0.077549
+vt 0.689445 0.079617
+vt 0.719911 0.076270
+vt 0.713645 0.076270
+vt 0.713465 0.075511
+vt 0.719732 0.075511
+vt 0.725960 0.075511
+vt 0.726137 0.076270
+vt 0.732148 0.075511
+vt 0.732324 0.076270
+vt 0.726575 0.077549
+vt 0.720352 0.077549
+vt 0.727394 0.079617
+vt 0.721178 0.079617
+vt 0.732757 0.077549
+vt 0.733567 0.079617
+vt 0.714089 0.077549
+vt 0.714920 0.079617
+vt 0.744580 0.076270
+vt 0.738471 0.076270
+vt 0.738297 0.075511
+vt 0.744409 0.075511
+vt 0.750483 0.075511
+vt 0.750653 0.076270
+vt 0.756522 0.075511
+vt 0.756689 0.076270
+vt 0.751068 0.077549
+vt 0.745003 0.077549
+vt 0.751846 0.079617
+vt 0.745793 0.079617
+vt 0.757097 0.077549
+vt 0.757862 0.079617
+vt 0.738899 0.077549
+vt 0.739700 0.079617
+vt 0.768656 0.076270
+vt 0.762689 0.076270
+vt 0.762526 0.075511
+vt 0.768496 0.075511
+vt 0.774432 0.075511
+vt 0.774589 0.076270
+vt 0.780337 0.075511
+vt 0.780490 0.076270
+vt 0.774974 0.077549
+vt 0.769049 0.077549
+vt 0.775693 0.079617
+vt 0.769785 0.079617
+vt 0.780866 0.077549
+vt 0.781568 0.079617
+vt 0.763091 0.077549
+vt 0.763841 0.079617
+vt 0.792200 0.076270
+vt 0.786360 0.076270
+vt 0.786211 0.075511
+vt 0.792055 0.075511
+vt 0.797870 0.075511
+vt 0.798011 0.076270
+vt 0.803657 0.075511
+vt 0.803794 0.076270
+vt 0.798357 0.077549
+vt 0.792557 0.077549
+vt 0.799005 0.079617
+vt 0.793223 0.079617
+vt 0.804130 0.077549
+vt 0.804757 0.079617
+vt 0.786727 0.077549
+vt 0.787411 0.079617
+vt 0.815272 0.076270
+vt 0.809550 0.076270
+vt 0.809417 0.075511
+vt 0.815144 0.075511
+vt 0.820827 0.075511
+vt 0.820951 0.076270
+vt 0.826461 0.075511
+vt 0.826580 0.076270
+vt 0.821253 0.077549
+vt 0.815586 0.077549
+vt 0.821819 0.079617
+vt 0.816172 0.079617
+vt 0.826871 0.077549
+vt 0.827415 0.079617
+vt 0.809875 0.077549
+vt 0.810483 0.079617
+vt 0.848611 0.075787
+vt 0.847467 0.075977
+vt 0.847366 0.075322
+vt 0.848511 0.075200
+vt 0.845322 0.076123
+vt 0.845219 0.075417
+vt 0.848987 0.075058
+vt 0.849087 0.075568
+vt 0.849129 0.074907
+vt 0.849229 0.075334
+vt 0.849329 0.076643
+vt 0.848855 0.076926
+vt 0.849783 0.078621
+vt 0.849310 0.078932
+vt 0.849471 0.076341
+vt 0.849924 0.078289
+vt 0.847713 0.077172
+vt 0.845573 0.077360
+vt 0.848174 0.079202
+vt 0.846042 0.079409
+vt 0.963222 0.275943
+vt 0.963222 0.275283
+vt 0.964709 0.273466
+vt 0.964709 0.274126
+vt 0.965335 0.271390
+vt 0.965335 0.272049
+vt 0.963222 0.274909
+vt 0.964709 0.273092
+vt 0.965335 0.271016
+vt 0.964709 0.275355
+vt 0.963222 0.277171
+vt 0.964709 0.277438
+vt 0.963222 0.279255
+vt 0.965335 0.273278
+vt 0.965335 0.275361
+vt 0.960013 0.278469
+vt 0.960013 0.277240
+vt 0.954221 0.278988
+vt 0.954221 0.277759
+vt 0.960013 0.280552
+vt 0.954222 0.281071
+vt 0.960013 0.276581
+vt 0.960013 0.276207
+vt 0.954221 0.277100
+vt 0.954221 0.276726
+vt 0.934032 0.276040
+vt 0.934048 0.275284
+vt 0.944987 0.276581
+vt 0.944987 0.277240
+vt 0.934069 0.274780
+vt 0.944987 0.276207
+vt 0.944987 0.278469
+vt 0.934026 0.277301
+vt 0.944987 0.280552
+vt 0.934026 0.279384
+vt 0.923058 0.275874
+vt 0.923079 0.274515
+vt 0.913799 0.274576
+vt 0.913832 0.273124
+vt 0.923058 0.277957
+vt 0.913799 0.276659
+vt 0.923144 0.273468
+vt 0.923230 0.272577
+vt 0.913929 0.271794
+vt 0.914231 0.269727
+vt 0.850916 0.086021
+vt 0.849796 0.086211
+vt 0.848916 0.082365
+vt 0.850045 0.082119
+vt 0.847695 0.086357
+vt 0.846798 0.082553
+vt 0.850514 0.081836
+vt 0.851382 0.085801
+vt 0.850654 0.081534
+vt 0.851521 0.085567
+vt 0.852246 0.090028
+vt 0.851783 0.090169
+vt 0.852963 0.094027
+vt 0.852504 0.094098
+vt 0.852383 0.089877
+vt 0.853100 0.093952
+vt 0.850672 0.090292
+vt 0.848588 0.090386
+vt 0.851401 0.094159
+vt 0.849330 0.094207
+vt 0.818241 0.086503
+vt 0.812625 0.086503
+vt 0.811462 0.082742
+vt 0.817118 0.082742
+vt 0.806972 0.086503
+vt 0.805770 0.082742
+vt 0.822731 0.082742
+vt 0.823813 0.086503
+vt 0.828292 0.082742
+vt 0.829332 0.086503
+vt 0.824889 0.090481
+vt 0.819358 0.090481
+vt 0.825784 0.094254
+vt 0.820287 0.094254
+vt 0.830368 0.090481
+vt 0.831228 0.094254
+vt 0.813782 0.090481
+vt 0.808167 0.090481
+vt 0.814743 0.094254
+vt 0.809161 0.094254
+vt 0.795574 0.086503
+vt 0.789828 0.086503
+vt 0.788516 0.082742
+vt 0.794298 0.082742
+vt 0.784048 0.086503
+vt 0.782702 0.082742
+vt 0.800049 0.082742
+vt 0.801289 0.086503
+vt 0.802522 0.090481
+vt 0.796844 0.090481
+vt 0.803547 0.094254
+vt 0.797899 0.094254
+vt 0.791133 0.090481
+vt 0.785386 0.090481
+vt 0.792217 0.094254
+vt 0.786499 0.094254
+vt 0.772380 0.086503
+vt 0.766491 0.086503
+vt 0.765053 0.082742
+vt 0.770971 0.082742
+vt 0.760562 0.086503
+vt 0.759097 0.082742
+vt 0.776854 0.082742
+vt 0.778232 0.086503
+vt 0.779603 0.090481
+vt 0.773782 0.090481
+vt 0.780742 0.094254
+vt 0.774947 0.094254
+vt 0.767921 0.090481
+vt 0.762020 0.090481
+vt 0.769110 0.094254
+vt 0.763231 0.094254
+vt 0.748582 0.086503
+vt 0.742528 0.086503
+vt 0.740993 0.082742
+vt 0.747068 0.082742
+vt 0.736429 0.086503
+vt 0.734876 0.082742
+vt 0.753102 0.082742
+vt 0.754593 0.086503
+vt 0.756076 0.090481
+vt 0.750088 0.090481
+vt 0.757308 0.094254
+vt 0.751340 0.094254
+vt 0.744055 0.090481
+vt 0.737975 0.090481
+vt 0.745324 0.094254
+vt 0.739260 0.094254
+vt 0.724095 0.086503
+vt 0.717856 0.086503
+vt 0.716262 0.082742
+vt 0.722512 0.082742
+vt 0.711568 0.086503
+vt 0.709967 0.082742
+vt 0.728716 0.082742
+vt 0.730285 0.086503
+vt 0.731847 0.090481
+vt 0.725670 0.090481
+vt 0.733145 0.094254
+vt 0.726979 0.094254
+vt 0.719442 0.090481
+vt 0.713162 0.090481
+vt 0.720760 0.094254
+vt 0.714486 0.094254
+vt 0.698842 0.086503
+vt 0.692401 0.086503
+vt 0.690796 0.082742
+vt 0.697235 0.082742
+vt 0.685907 0.086503
+vt 0.684309 0.082742
+vt 0.703625 0.082742
+vt 0.705231 0.086503
+vt 0.706828 0.090481
+vt 0.700441 0.090481
+vt 0.708156 0.094254
+vt 0.701770 0.094254
+vt 0.693998 0.090481
+vt 0.687498 0.090481
+vt 0.695325 0.094254
+vt 0.688820 0.094254
+vt 0.672759 0.086503
+vt 0.666104 0.086503
+vt 0.664546 0.082742
+vt 0.671184 0.082742
+vt 0.659394 0.086503
+vt 0.657858 0.082742
+vt 0.677771 0.082742
+vt 0.679360 0.086503
+vt 0.680941 0.090481
+vt 0.674327 0.090481
+vt 0.682256 0.094254
+vt 0.675630 0.094254
+vt 0.667654 0.090481
+vt 0.660922 0.090481
+vt 0.668942 0.094254
+vt 0.662192 0.094254
+vt 0.645809 0.086503
+vt 0.638935 0.086503
+vt 0.637492 0.082742
+vt 0.644331 0.082742
+vt 0.632007 0.086503
+vt 0.630604 0.082742
+vt 0.651120 0.082742
+vt 0.652629 0.086503
+vt 0.654131 0.090481
+vt 0.647280 0.090481
+vt 0.655379 0.094254
+vt 0.648503 0.094254
+vt 0.640371 0.090481
+vt 0.633404 0.090481
+vt 0.641565 0.094254
+vt 0.634565 0.094254
+vt 0.617992 0.086503
+vt 0.610907 0.086503
+vt 0.609651 0.082742
+vt 0.616682 0.082742
+vt 0.603773 0.086503
+vt 0.602575 0.082742
+vt 0.623667 0.082742
+vt 0.625026 0.086503
+vt 0.626378 0.090481
+vt 0.619295 0.090481
+vt 0.627502 0.094254
+vt 0.620379 0.094254
+vt 0.612157 0.090481
+vt 0.604964 0.090481
+vt 0.613196 0.094254
+vt 0.605955 0.094254
+vt 0.589361 0.086503
+vt 0.582089 0.086503
+vt 0.581093 0.082742
+vt 0.588294 0.082742
+vt 0.574775 0.086503
+vt 0.573856 0.082742
+vt 0.595456 0.082742
+vt 0.596590 0.086503
+vt 0.597719 0.090481
+vt 0.590423 0.090481
+vt 0.598657 0.094254
+vt 0.591305 0.094254
+vt 0.583079 0.090481
+vt 0.575690 0.090481
+vt 0.583902 0.094254
+vt 0.576450 0.094254
+vt 0.560034 0.086503
+vt 0.552613 0.086503
+vt 0.551944 0.082742
+vt 0.559278 0.082742
+vt 0.545164 0.086503
+vt 0.544584 0.082742
+vt 0.566583 0.082742
+vt 0.567422 0.086503
+vt 0.568257 0.090481
+vt 0.560786 0.090481
+vt 0.568952 0.094254
+vt 0.561412 0.094254
+vt 0.553279 0.090481
+vt 0.545741 0.090481
+vt 0.553833 0.094254
+vt 0.546220 0.094254
+vt 0.530193 0.086503
+vt 0.522680 0.086503
+vt 0.522384 0.082742
+vt 0.529801 0.082742
+vt 0.515154 0.086503
+vt 0.514956 0.082742
+vt 0.537202 0.082742
+vt 0.537689 0.086503
+vt 0.538174 0.090481
+vt 0.530584 0.090481
+vt 0.538577 0.094254
+vt 0.530909 0.094254
+vt 0.522975 0.090481
+vt 0.515351 0.090481
+vt 0.523220 0.094254
+vt 0.515515 0.094254
+vt 0.500080 0.086503
+vt 0.492541 0.086503
+vt 0.492640 0.082742
+vt 0.500080 0.082742
+vt 0.507520 0.082742
+vt 0.507619 0.086503
+vt 0.507718 0.090481
+vt 0.500080 0.090481
+vt 0.507800 0.094254
+vt 0.500080 0.094254
+vt 0.492442 0.090481
+vt 0.492360 0.094254
+vt 0.904154 0.271940
+vt 0.907989 0.272321
+vt 0.907968 0.273797
+vt 0.904157 0.273407
+vt 0.907968 0.275880
+vt 0.904165 0.275491
+vt 0.900961 0.273276
+vt 0.900925 0.271810
+vt 0.896971 0.273272
+vt 0.896882 0.271805
+vt 0.900990 0.275360
+vt 0.897046 0.275358
+vt 0.900889 0.270444
+vt 0.904161 0.270566
+vt 0.900860 0.268658
+vt 0.904057 0.268758
+vt 0.896793 0.270437
+vt 0.896718 0.268649
+vt 0.908054 0.270921
+vt 0.907669 0.269047
+vt 0.853614 0.201600
+vt 0.853231 0.201644
+vt 0.852629 0.198640
+vt 0.853094 0.197954
+vt 0.851557 0.194563
+vt 0.852301 0.193533
+vt 0.852768 0.201702
+vt 0.852054 0.199556
+vt 0.850035 0.197767
+vt 0.853339 0.197725
+vt 0.853840 0.201587
+vt 0.853473 0.197725
+vt 0.853987 0.201588
+vt 0.852638 0.193190
+vt 0.852772 0.193190
+vt 0.854359 0.205217
+vt 0.853972 0.205042
+vt 0.855114 0.209059
+vt 0.854517 0.208789
+vt 0.854542 0.205224
+vt 0.855367 0.209076
+vt 0.853174 0.204529
+vt 0.852170 0.203849
+vt 0.853233 0.208015
+vt 0.850251 0.205637
+vt 0.821411 0.315136
+vt 0.815908 0.315136
+vt 0.815831 0.314473
+vt 0.821337 0.314473
+vt 0.815768 0.313872
+vt 0.821276 0.313872
+vt 0.810365 0.315136
+vt 0.810286 0.314473
+vt 0.810220 0.313872
+vt 0.826796 0.314473
+vt 0.826867 0.315136
+vt 0.832202 0.314473
+vt 0.832270 0.315136
+vt 0.826738 0.313872
+vt 0.832145 0.313872
+vt 0.826938 0.315794
+vt 0.821484 0.315794
+vt 0.826997 0.316375
+vt 0.821545 0.316375
+vt 0.832338 0.315794
+vt 0.832394 0.316375
+vt 0.815984 0.315794
+vt 0.810444 0.315794
+vt 0.816047 0.316375
+vt 0.810509 0.316375
+vt 0.799179 0.315136
+vt 0.793532 0.315136
+vt 0.793446 0.314473
+vt 0.799095 0.314473
+vt 0.793374 0.313872
+vt 0.799025 0.313872
+vt 0.787848 0.315136
+vt 0.787759 0.314473
+vt 0.787685 0.313872
+vt 0.804707 0.314473
+vt 0.804789 0.315136
+vt 0.804639 0.313872
+vt 0.804870 0.315794
+vt 0.799263 0.315794
+vt 0.804938 0.316375
+vt 0.799333 0.316375
+vt 0.793619 0.315794
+vt 0.787937 0.315794
+vt 0.793691 0.316375
+vt 0.788012 0.316375
+vt 0.776361 0.315136
+vt 0.770555 0.315136
+vt 0.770459 0.314473
+vt 0.776268 0.314473
+vt 0.770379 0.313872
+vt 0.776190 0.313872
+vt 0.764704 0.315136
+vt 0.764606 0.314473
+vt 0.764524 0.313872
+vt 0.782034 0.314473
+vt 0.782125 0.315136
+vt 0.781958 0.313872
+vt 0.782217 0.315794
+vt 0.776455 0.315794
+vt 0.782293 0.316375
+vt 0.776533 0.316375
+vt 0.770650 0.315794
+vt 0.764801 0.315794
+vt 0.770730 0.316375
+vt 0.764883 0.316375
+vt 0.752862 0.315136
+vt 0.746868 0.315136
+vt 0.746765 0.314473
+vt 0.752761 0.314473
+vt 0.746679 0.313872
+vt 0.752676 0.313872
+vt 0.740824 0.315136
+vt 0.740719 0.314473
+vt 0.740632 0.313872
+vt 0.758707 0.314473
+vt 0.758807 0.315136
+vt 0.758624 0.313872
+vt 0.758906 0.315794
+vt 0.752964 0.315794
+vt 0.758989 0.316375
+vt 0.753048 0.316375
+vt 0.746972 0.315794
+vt 0.740928 0.315794
+vt 0.747058 0.316375
+vt 0.741015 0.316375
+vt 0.728574 0.315136
+vt 0.722367 0.315136
+vt 0.722258 0.314473
+vt 0.728467 0.314473
+vt 0.722168 0.313872
+vt 0.728378 0.313872
+vt 0.716101 0.315136
+vt 0.715992 0.314473
+vt 0.715901 0.313872
+vt 0.734620 0.314473
+vt 0.734726 0.315136
+vt 0.734532 0.313872
+vt 0.734832 0.315794
+vt 0.728682 0.315794
+vt 0.734921 0.316375
+vt 0.728771 0.316375
+vt 0.722475 0.315794
+vt 0.716210 0.315794
+vt 0.722565 0.316375
+vt 0.716301 0.316375
+vt 0.703392 0.315136
+vt 0.696946 0.315136
+vt 0.696836 0.314473
+vt 0.703282 0.314473
+vt 0.696744 0.313872
+vt 0.703190 0.313872
+vt 0.690436 0.315136
+vt 0.690326 0.314473
+vt 0.690234 0.313872
+vt 0.709667 0.314473
+vt 0.709777 0.315136
+vt 0.709576 0.313872
+vt 0.709887 0.315794
+vt 0.703502 0.315794
+vt 0.709978 0.316375
+vt 0.703594 0.316375
+vt 0.697056 0.315794
+vt 0.690547 0.315794
+vt 0.697148 0.316375
+vt 0.690638 0.316375
+vt 0.677224 0.315136
+vt 0.670519 0.315136
+vt 0.670411 0.314473
+vt 0.677115 0.314473
+vt 0.670321 0.313872
+vt 0.677024 0.313872
+vt 0.663748 0.315136
+vt 0.663641 0.314473
+vt 0.663551 0.313872
+vt 0.683753 0.314473
+vt 0.683863 0.315136
+vt 0.683661 0.313872
+vt 0.683973 0.315794
+vt 0.677333 0.315794
+vt 0.684064 0.316375
+vt 0.677424 0.316375
+vt 0.670627 0.315794
+vt 0.663855 0.315794
+vt 0.670718 0.316375
+vt 0.663944 0.316375
+vt 0.650003 0.315136
+vt 0.643030 0.315136
+vt 0.642928 0.314473
+vt 0.649899 0.314473
+vt 0.642844 0.313872
+vt 0.649813 0.313872
+vt 0.635990 0.315136
+vt 0.635891 0.314473
+vt 0.635808 0.313872
+vt 0.656803 0.314473
+vt 0.656909 0.315136
+vt 0.656716 0.313872
+vt 0.657015 0.315794
+vt 0.650107 0.315794
+vt 0.657103 0.316375
+vt 0.650193 0.316375
+vt 0.643132 0.315794
+vt 0.636089 0.315794
+vt 0.643216 0.316375
+vt 0.636171 0.316375
+vt 0.621710 0.315136
+vt 0.614473 0.315136
+vt 0.614384 0.314473
+vt 0.621617 0.314473
+vt 0.614309 0.313872
+vt 0.621540 0.313872
+vt 0.607173 0.315136
+vt 0.607088 0.314473
+vt 0.607017 0.313872
+vt 0.628787 0.314473
+vt 0.628883 0.315136
+vt 0.628706 0.313872
+vt 0.628979 0.315794
+vt 0.621803 0.315794
+vt 0.629059 0.316375
+vt 0.621881 0.316375
+vt 0.614563 0.315794
+vt 0.607259 0.315794
+vt 0.614637 0.316375
+vt 0.607330 0.316375
+vt 0.592392 0.315136
+vt 0.584916 0.315136
+vt 0.584845 0.314473
+vt 0.592316 0.314473
+vt 0.584785 0.313872
+vt 0.592252 0.313872
+vt 0.577388 0.315136
+vt 0.577321 0.314473
+vt 0.577266 0.313872
+vt 0.599731 0.314473
+vt 0.599812 0.315136
+vt 0.599663 0.313872
+vt 0.599893 0.315794
+vt 0.592469 0.315794
+vt 0.599961 0.316375
+vt 0.592533 0.316375
+vt 0.584988 0.315794
+vt 0.577454 0.315794
+vt 0.585048 0.316375
+vt 0.577509 0.316375
+vt 0.562183 0.315136
+vt 0.554516 0.315136
+vt 0.554468 0.314473
+vt 0.562128 0.314473
+vt 0.554427 0.313872
+vt 0.562083 0.313872
+vt 0.546812 0.315136
+vt 0.546770 0.314473
+vt 0.546735 0.313872
+vt 0.569748 0.314473
+vt 0.569808 0.315136
+vt 0.569697 0.313872
+vt 0.569869 0.315794
+vt 0.562238 0.315794
+vt 0.569920 0.316375
+vt 0.562284 0.316375
+vt 0.554565 0.315794
+vt 0.546854 0.315794
+vt 0.554605 0.316375
+vt 0.546889 0.316375
+vt 0.531310 0.315136
+vt 0.523522 0.315136
+vt 0.523501 0.314473
+vt 0.531281 0.314473
+vt 0.523483 0.313872
+vt 0.531257 0.313872
+vt 0.515718 0.315136
+vt 0.515703 0.314473
+vt 0.515691 0.313872
+vt 0.539039 0.314473
+vt 0.539075 0.315136
+vt 0.539010 0.313872
+vt 0.539110 0.315794
+vt 0.531338 0.315794
+vt 0.539140 0.316375
+vt 0.531362 0.316375
+vt 0.523544 0.315794
+vt 0.515732 0.315794
+vt 0.523562 0.316375
+vt 0.515744 0.316375
+vt 0.500080 0.315136
+vt 0.492258 0.315136
+vt 0.492265 0.314473
+vt 0.500080 0.314473
+vt 0.492271 0.313872
+vt 0.500080 0.313872
+vt 0.507895 0.314473
+vt 0.507902 0.315136
+vt 0.507888 0.313872
+vt 0.507909 0.315794
+vt 0.500080 0.315794
+vt 0.507915 0.316375
+vt 0.500080 0.316375
+vt 0.492251 0.315794
+vt 0.492245 0.316375
+vt 0.500080 0.271909
+vt 0.491365 0.271909
+vt 0.491369 0.271290
+vt 0.500080 0.271290
+vt 0.491378 0.271032
+vt 0.500080 0.271032
+vt 0.508790 0.271290
+vt 0.508794 0.271909
+vt 0.517489 0.271290
+vt 0.517497 0.271909
+vt 0.508782 0.271032
+vt 0.517473 0.271032
+vt 0.508796 0.273148
+vt 0.500080 0.273148
+vt 0.508796 0.275262
+vt 0.500080 0.275262
+vt 0.517500 0.273148
+vt 0.517500 0.275262
+vt 0.491364 0.273148
+vt 0.491364 0.275262
+vt 0.534820 0.271909
+vt 0.526176 0.271909
+vt 0.526164 0.271290
+vt 0.534804 0.271290
+vt 0.526140 0.271032
+vt 0.534773 0.271032
+vt 0.543400 0.271290
+vt 0.543419 0.271909
+vt 0.551940 0.271290
+vt 0.551963 0.271909
+vt 0.543361 0.271032
+vt 0.551894 0.271032
+vt 0.543426 0.273148
+vt 0.534825 0.273148
+vt 0.543426 0.275262
+vt 0.534825 0.275262
+vt 0.551971 0.273148
+vt 0.551971 0.275262
+vt 0.526180 0.273148
+vt 0.526180 0.275262
+vt 0.568844 0.271909
+vt 0.560440 0.271909
+vt 0.560414 0.271290
+vt 0.568814 0.271290
+vt 0.560361 0.271032
+vt 0.568755 0.271032
+vt 0.577134 0.271290
+vt 0.577167 0.271909
+vt 0.585366 0.271290
+vt 0.585402 0.271909
+vt 0.577069 0.271032
+vt 0.585295 0.271032
+vt 0.577178 0.273148
+vt 0.568854 0.273148
+vt 0.577178 0.275262
+vt 0.568854 0.275262
+vt 0.585414 0.273148
+vt 0.585414 0.275262
+vt 0.560449 0.273148
+vt 0.560449 0.275262
+vt 0.601580 0.271909
+vt 0.593541 0.271909
+vt 0.593502 0.271290
+vt 0.601540 0.271290
+vt 0.593426 0.271032
+vt 0.601459 0.271032
+vt 0.609475 0.271290
+vt 0.609518 0.271909
+vt 0.617304 0.271290
+vt 0.617349 0.271909
+vt 0.609389 0.271032
+vt 0.617215 0.271032
+vt 0.609532 0.273148
+vt 0.601594 0.273148
+vt 0.609532 0.275262
+vt 0.601594 0.275262
+vt 0.617364 0.273148
+vt 0.617364 0.275262
+vt 0.593553 0.273148
+vt 0.593553 0.275262
+vt 0.632681 0.271909
+vt 0.625070 0.271909
+vt 0.625024 0.271290
+vt 0.632634 0.271290
+vt 0.624931 0.271032
+vt 0.632538 0.271032
+vt 0.640134 0.271290
+vt 0.640182 0.271909
+vt 0.647523 0.271290
+vt 0.647573 0.271909
+vt 0.640036 0.271032
+vt 0.647423 0.271032
+vt 0.640199 0.273148
+vt 0.632697 0.273148
+vt 0.640199 0.275262
+vt 0.632697 0.275262
+vt 0.647590 0.273148
+vt 0.647590 0.275262
+vt 0.625085 0.273148
+vt 0.625085 0.275262
+vt 0.662023 0.271909
+vt 0.654853 0.271909
+vt 0.654802 0.271290
+vt 0.661972 0.271290
+vt 0.654700 0.271032
+vt 0.661869 0.271032
+vt 0.669034 0.271290
+vt 0.669086 0.271909
+vt 0.675992 0.271290
+vt 0.676044 0.271909
+vt 0.668931 0.271032
+vt 0.675887 0.271032
+vt 0.669104 0.273148
+vt 0.662040 0.273148
+vt 0.669104 0.275262
+vt 0.662040 0.275262
+vt 0.676061 0.273148
+vt 0.676061 0.275262
+vt 0.654869 0.273148
+vt 0.654869 0.275262
+vt 0.689651 0.271909
+vt 0.682898 0.271909
+vt 0.682845 0.271290
+vt 0.689598 0.271290
+vt 0.682741 0.271032
+vt 0.689494 0.271032
+vt 0.696253 0.271290
+vt 0.696306 0.271909
+vt 0.702813 0.271290
+vt 0.702865 0.271909
+vt 0.696149 0.271032
+vt 0.702710 0.271032
+vt 0.696323 0.273148
+vt 0.689668 0.273148
+vt 0.696323 0.275262
+vt 0.689668 0.275262
+vt 0.702883 0.273148
+vt 0.702883 0.275262
+vt 0.682915 0.273148
+vt 0.682915 0.275262
+vt 0.715711 0.271909
+vt 0.709333 0.271909
+vt 0.709281 0.271290
+vt 0.715660 0.271290
+vt 0.709178 0.271032
+vt 0.715558 0.271032
+vt 0.721952 0.271290
+vt 0.722003 0.271909
+vt 0.728162 0.271290
+vt 0.728212 0.271909
+vt 0.721851 0.271032
+vt 0.728063 0.271032
+vt 0.722020 0.273148
+vt 0.715728 0.273148
+vt 0.722020 0.275262
+vt 0.715728 0.275262
+vt 0.728229 0.273148
+vt 0.728229 0.275262
+vt 0.709350 0.273148
+vt 0.709350 0.275262
+vt 0.740395 0.271909
+vt 0.734342 0.271909
+vt 0.734293 0.271290
+vt 0.740347 0.271290
+vt 0.734194 0.271032
+vt 0.740250 0.271032
+vt 0.746327 0.271290
+vt 0.746375 0.271909
+vt 0.752238 0.271290
+vt 0.752284 0.271909
+vt 0.746232 0.271032
+vt 0.752145 0.271032
+vt 0.746391 0.273148
+vt 0.740411 0.273148
+vt 0.746391 0.275262
+vt 0.740411 0.275262
+vt 0.752300 0.273148
+vt 0.752300 0.275262
+vt 0.734358 0.273148
+vt 0.734358 0.275262
+vt 0.763904 0.271909
+vt 0.758127 0.271909
+vt 0.758081 0.271290
+vt 0.763860 0.271290
+vt 0.757990 0.271032
+vt 0.763771 0.271032
+vt 0.769577 0.271290
+vt 0.769621 0.271909
+vt 0.775236 0.271290
+vt 0.775279 0.271909
+vt 0.769490 0.271032
+vt 0.775151 0.271032
+vt 0.769636 0.273148
+vt 0.763919 0.273148
+vt 0.769636 0.275262
+vt 0.763919 0.275262
+vt 0.775293 0.273148
+vt 0.775293 0.275262
+vt 0.758142 0.273148
+vt 0.758142 0.275262
+vt 0.786430 0.271909
+vt 0.780881 0.271909
+vt 0.780840 0.271290
+vt 0.786390 0.271290
+vt 0.780757 0.271032
+vt 0.786309 0.271032
+vt 0.791889 0.271290
+vt 0.791928 0.271909
+vt 0.797340 0.271290
+vt 0.797378 0.271909
+vt 0.791810 0.271032
+vt 0.797264 0.271032
+vt 0.791941 0.273148
+vt 0.786443 0.273148
+vt 0.791941 0.275262
+vt 0.786443 0.275262
+vt 0.797390 0.273148
+vt 0.797390 0.275262
+vt 0.780895 0.273148
+vt 0.780895 0.275262
+vt 0.808142 0.271909
+vt 0.802782 0.271909
+vt 0.802745 0.271290
+vt 0.808106 0.271290
+vt 0.802671 0.271032
+vt 0.808035 0.271032
+vt 0.813427 0.271290
+vt 0.813461 0.271909
+vt 0.818708 0.271290
+vt 0.818741 0.271909
+vt 0.813358 0.271032
+vt 0.818641 0.271032
+vt 0.813472 0.273148
+vt 0.808154 0.273148
+vt 0.813472 0.275262
+vt 0.808154 0.275262
+vt 0.818752 0.273148
+vt 0.818752 0.275262
+vt 0.802794 0.273148
+vt 0.802794 0.275262
+vt 0.829183 0.271909
+vt 0.823983 0.271909
+vt 0.823952 0.271290
+vt 0.829152 0.271290
+vt 0.823888 0.271032
+vt 0.829091 0.271032
+vt 0.834304 0.271290
+vt 0.834333 0.271909
+vt 0.839401 0.271290
+vt 0.839429 0.271909
+vt 0.834245 0.271032
+vt 0.839345 0.271032
+vt 0.834343 0.273148
+vt 0.829193 0.273148
+vt 0.834343 0.275262
+vt 0.829193 0.275262
+vt 0.839438 0.273148
+vt 0.839438 0.275262
+vt 0.823994 0.273148
+vt 0.823994 0.275262
+vt 0.860088 0.271953
+vt 0.858746 0.271935
+vt 0.858746 0.271320
+vt 0.860083 0.271348
+vt 0.858745 0.271066
+vt 0.860097 0.271103
+vt 0.856578 0.271922
+vt 0.856565 0.271305
+vt 0.856540 0.271049
+vt 0.860840 0.271393
+vt 0.860887 0.271976
+vt 0.861301 0.271427
+vt 0.861432 0.271995
+vt 0.860843 0.271173
+vt 0.861184 0.271256
+vt 0.860927 0.273194
+vt 0.860096 0.273181
+vt 0.860956 0.275298
+vt 0.860103 0.275288
+vt 0.861535 0.273207
+vt 0.861609 0.275309
+vt 0.858746 0.273168
+vt 0.856582 0.273158
+vt 0.858746 0.275278
+vt 0.856582 0.275270
+vt 0.500080 0.065777
+vt 0.492818 0.065777
+vt 0.492817 0.062915
+vt 0.500080 0.062915
+vt 0.492816 0.060348
+vt 0.500080 0.060348
+vt 0.507342 0.062915
+vt 0.507342 0.065777
+vt 0.514602 0.062915
+vt 0.514600 0.065777
+vt 0.507344 0.060348
+vt 0.514605 0.060348
+vt 0.507341 0.068588
+vt 0.500080 0.068588
+vt 0.514600 0.068588
+vt 0.492818 0.068588
+vt 0.529096 0.065777
+vt 0.521853 0.065777
+vt 0.521855 0.062915
+vt 0.529099 0.062915
+vt 0.521860 0.060348
+vt 0.529106 0.060348
+vt 0.536332 0.062915
+vt 0.536328 0.065777
+vt 0.543549 0.062915
+vt 0.543544 0.065777
+vt 0.536339 0.060348
+vt 0.543558 0.060348
+vt 0.536326 0.068588
+vt 0.529095 0.068588
+vt 0.543542 0.068588
+vt 0.521852 0.068588
+vt 0.557920 0.065777
+vt 0.550742 0.065777
+vt 0.550748 0.062915
+vt 0.557926 0.062915
+vt 0.550759 0.060348
+vt 0.557939 0.060348
+vt 0.565082 0.062915
+vt 0.565075 0.065777
+vt 0.572212 0.062915
+vt 0.572205 0.065777
+vt 0.565096 0.060348
+vt 0.572227 0.060348
+vt 0.565073 0.068588
+vt 0.557918 0.068588
+vt 0.572202 0.068588
+vt 0.550741 0.068588
+vt 0.586378 0.065777
+vt 0.579306 0.065777
+vt 0.579315 0.062915
+vt 0.586387 0.062915
+vt 0.579331 0.060348
+vt 0.586404 0.060348
+vt 0.593427 0.062915
+vt 0.593418 0.065777
+vt 0.600434 0.062915
+vt 0.600424 0.065777
+vt 0.593446 0.060348
+vt 0.600454 0.060348
+vt 0.593415 0.068588
+vt 0.586375 0.068588
+vt 0.600421 0.068588
+vt 0.579304 0.068588
+vt 0.614328 0.065777
+vt 0.607395 0.065777
+vt 0.607405 0.062915
+vt 0.614339 0.062915
+vt 0.607426 0.060348
+vt 0.614361 0.060348
+vt 0.621235 0.062915
+vt 0.621224 0.065777
+vt 0.628092 0.062915
+vt 0.628080 0.065777
+vt 0.621258 0.060348
+vt 0.628115 0.060348
+vt 0.621220 0.068588
+vt 0.614325 0.068588
+vt 0.628076 0.068588
+vt 0.607391 0.068588
+vt 0.641671 0.065777
+vt 0.634896 0.065777
+vt 0.634908 0.062915
+vt 0.641683 0.062915
+vt 0.634932 0.060348
+vt 0.641708 0.060348
+vt 0.648417 0.062915
+vt 0.648404 0.065777
+vt 0.655108 0.062915
+vt 0.655095 0.065777
+vt 0.648442 0.060348
+vt 0.655133 0.060348
+vt 0.648400 0.068588
+vt 0.641667 0.068588
+vt 0.655090 0.068588
+vt 0.634892 0.068588
+vt 0.668348 0.065777
+vt 0.661743 0.065777
+vt 0.661756 0.062915
+vt 0.668361 0.062915
+vt 0.661782 0.060348
+vt 0.668388 0.060348
+vt 0.674923 0.062915
+vt 0.674910 0.065777
+vt 0.681443 0.062915
+vt 0.681429 0.065777
+vt 0.674950 0.060348
+vt 0.681470 0.060348
+vt 0.674905 0.068588
+vt 0.668343 0.068588
+vt 0.681425 0.068588
+vt 0.661738 0.068588
+vt 0.694339 0.065777
+vt 0.687905 0.065777
+vt 0.687919 0.062915
+vt 0.694353 0.062915
+vt 0.687946 0.060348
+vt 0.694380 0.060348
+vt 0.700744 0.062915
+vt 0.700730 0.065777
+vt 0.707094 0.062915
+vt 0.707080 0.065777
+vt 0.700772 0.060348
+vt 0.707121 0.060348
+vt 0.700726 0.068588
+vt 0.694334 0.068588
+vt 0.707076 0.068588
+vt 0.687901 0.068588
+vt 0.719656 0.065777
+vt 0.713389 0.065777
+vt 0.713402 0.062915
+vt 0.719670 0.062915
+vt 0.713430 0.060348
+vt 0.719697 0.060348
+vt 0.725898 0.062915
+vt 0.725884 0.065777
+vt 0.732086 0.062915
+vt 0.732073 0.065777
+vt 0.725925 0.060348
+vt 0.732113 0.060348
+vt 0.725880 0.068588
+vt 0.719652 0.068588
+vt 0.732068 0.068588
+vt 0.713384 0.068588
+vt 0.744335 0.065777
+vt 0.738223 0.065777
+vt 0.738236 0.062915
+vt 0.744348 0.062915
+vt 0.738263 0.060348
+vt 0.744375 0.060348
+vt 0.750424 0.062915
+vt 0.750411 0.065777
+vt 0.756464 0.062915
+vt 0.756451 0.065777
+vt 0.750450 0.060348
+vt 0.756489 0.060348
+vt 0.750407 0.068588
+vt 0.744331 0.068588
+vt 0.756447 0.068588
+vt 0.738218 0.068588
+vt 0.768427 0.065777
+vt 0.762456 0.065777
+vt 0.762468 0.062915
+vt 0.768439 0.062915
+vt 0.762494 0.060348
+vt 0.768464 0.060348
+vt 0.774377 0.062915
+vt 0.774365 0.065777
+vt 0.780283 0.062915
+vt 0.780271 0.065777
+vt 0.774401 0.060348
+vt 0.780307 0.060348
+vt 0.774361 0.068588
+vt 0.768423 0.068588
+vt 0.780267 0.068588
+vt 0.762452 0.068588
+vt 0.791992 0.065777
+vt 0.786146 0.065777
+vt 0.786158 0.062915
+vt 0.792003 0.062915
+vt 0.786181 0.060348
+vt 0.792026 0.060348
+vt 0.797820 0.062915
+vt 0.797809 0.065777
+vt 0.803608 0.062915
+vt 0.803598 0.065777
+vt 0.797842 0.060348
+vt 0.803630 0.060348
+vt 0.797805 0.068588
+vt 0.791988 0.068588
+vt 0.803594 0.068588
+vt 0.786142 0.068588
+vt 0.815088 0.065777
+vt 0.809360 0.065777
+vt 0.809370 0.062915
+vt 0.815098 0.062915
+vt 0.809391 0.060348
+vt 0.815118 0.060348
+vt 0.820783 0.062915
+vt 0.820774 0.065777
+vt 0.826418 0.062915
+vt 0.826409 0.065777
+vt 0.820803 0.060348
+vt 0.826437 0.060348
+vt 0.820770 0.068588
+vt 0.815085 0.068588
+vt 0.826406 0.068588
+vt 0.809357 0.068588
+vt 0.848467 0.065777
+vt 0.847322 0.065777
+vt 0.847330 0.062915
+vt 0.848475 0.062915
+vt 0.847345 0.060348
+vt 0.848489 0.060348
+vt 0.845174 0.065777
+vt 0.845182 0.062915
+vt 0.845198 0.060348
+vt 0.848951 0.062915
+vt 0.848944 0.065777
+vt 0.849093 0.062915
+vt 0.849086 0.065777
+vt 0.848965 0.060348
+vt 0.849106 0.060348
+vt 0.848941 0.068588
+vt 0.848465 0.068588
+vt 0.849083 0.068588
+vt 0.847320 0.068588
+vt 0.845172 0.068588
+vt 0.963222 0.286554
+vt 0.960013 0.287851
+vt 0.960013 0.283775
+vt 0.963222 0.282477
+vt 0.954221 0.288370
+vt 0.954222 0.284294
+vt 0.964709 0.280660
+vt 0.964709 0.284737
+vt 0.965335 0.278584
+vt 0.965335 0.282660
+vt 0.964709 0.289383
+vt 0.963222 0.291200
+vt 0.964709 0.294314
+vt 0.963222 0.296131
+vt 0.965335 0.287307
+vt 0.965335 0.292238
+vt 0.960013 0.292498
+vt 0.954221 0.293017
+vt 0.960013 0.297429
+vt 0.954221 0.297948
+vt 0.934026 0.286683
+vt 0.923058 0.285256
+vt 0.923058 0.281179
+vt 0.934026 0.282607
+vt 0.913799 0.283958
+vt 0.913799 0.279881
+vt 0.944987 0.283775
+vt 0.944987 0.287851
+vt 0.944987 0.292498
+vt 0.934026 0.291330
+vt 0.944987 0.297429
+vt 0.934026 0.296261
+vt 0.923058 0.289902
+vt 0.913799 0.288604
+vt 0.923058 0.294833
+vt 0.913799 0.293536
+vt 0.904171 0.282790
+vt 0.907968 0.283179
+vt 0.907968 0.287826
+vt 0.904172 0.287436
+vt 0.907968 0.292757
+vt 0.904172 0.292368
+vt 0.901020 0.287307
+vt 0.901017 0.282660
+vt 0.897120 0.287307
+vt 0.897113 0.282660
+vt 0.901020 0.292238
+vt 0.897120 0.292238
+vt 0.901008 0.278583
+vt 0.904169 0.278713
+vt 0.897090 0.278582
+vt 0.907968 0.279103
+vt 0.860110 0.282624
+vt 0.858746 0.282619
+vt 0.858746 0.278523
+vt 0.860108 0.278530
+vt 0.856582 0.282615
+vt 0.856582 0.278517
+vt 0.860974 0.278538
+vt 0.860983 0.282630
+vt 0.861654 0.278546
+vt 0.861676 0.282636
+vt 0.860986 0.287289
+vt 0.860111 0.287286
+vt 0.860986 0.292233
+vt 0.860111 0.292232
+vt 0.861683 0.287293
+vt 0.861684 0.292234
+vt 0.858746 0.287283
+vt 0.856582 0.287281
+vt 0.858746 0.292231
+vt 0.856582 0.292230
+vt 0.829193 0.282612
+vt 0.823994 0.282612
+vt 0.823994 0.278512
+vt 0.829193 0.278512
+vt 0.818752 0.282612
+vt 0.818752 0.278512
+vt 0.834343 0.278512
+vt 0.834343 0.282612
+vt 0.839438 0.278512
+vt 0.839438 0.282612
+vt 0.834343 0.287279
+vt 0.829193 0.287279
+vt 0.834343 0.292230
+vt 0.829193 0.292230
+vt 0.839438 0.287279
+vt 0.839438 0.292230
+vt 0.823994 0.287279
+vt 0.818752 0.287279
+vt 0.823994 0.292230
+vt 0.818752 0.292230
+vt 0.808154 0.282612
+vt 0.802794 0.282612
+vt 0.802794 0.278512
+vt 0.808154 0.278512
+vt 0.797390 0.282612
+vt 0.797390 0.278512
+vt 0.813472 0.278512
+vt 0.813472 0.282612
+vt 0.813472 0.287279
+vt 0.808154 0.287279
+vt 0.813472 0.292230
+vt 0.808154 0.292230
+vt 0.802794 0.287279
+vt 0.797390 0.287279
+vt 0.802794 0.292230
+vt 0.797390 0.292230
+vt 0.786443 0.282612
+vt 0.780895 0.282612
+vt 0.780895 0.278512
+vt 0.786443 0.278512
+vt 0.775293 0.282612
+vt 0.775293 0.278512
+vt 0.791941 0.278512
+vt 0.791941 0.282612
+vt 0.791941 0.287279
+vt 0.786443 0.287279
+vt 0.791941 0.292230
+vt 0.786443 0.292230
+vt 0.780895 0.287279
+vt 0.775293 0.287279
+vt 0.780895 0.292230
+vt 0.775293 0.292230
+vt 0.763919 0.282612
+vt 0.758142 0.282612
+vt 0.758142 0.278512
+vt 0.763919 0.278512
+vt 0.752300 0.282612
+vt 0.752300 0.278512
+vt 0.769636 0.278512
+vt 0.769636 0.282612
+vt 0.769636 0.287279
+vt 0.763919 0.287279
+vt 0.769636 0.292230
+vt 0.763919 0.292230
+vt 0.758142 0.287279
+vt 0.752300 0.287279
+vt 0.758142 0.292230
+vt 0.752300 0.292230
+vt 0.740411 0.282612
+vt 0.734358 0.282612
+vt 0.734358 0.278512
+vt 0.740411 0.278512
+vt 0.728229 0.282612
+vt 0.728229 0.278512
+vt 0.746391 0.278512
+vt 0.746391 0.282612
+vt 0.746391 0.287279
+vt 0.740411 0.287279
+vt 0.746391 0.292230
+vt 0.740411 0.292230
+vt 0.734358 0.287279
+vt 0.728229 0.287279
+vt 0.734358 0.292230
+vt 0.728229 0.292230
+vt 0.715728 0.282612
+vt 0.709350 0.282612
+vt 0.709350 0.278512
+vt 0.715728 0.278512
+vt 0.702883 0.282612
+vt 0.702883 0.278512
+vt 0.722020 0.278512
+vt 0.722020 0.282612
+vt 0.722020 0.287279
+vt 0.715728 0.287279
+vt 0.722020 0.292230
+vt 0.715728 0.292230
+vt 0.709350 0.287279
+vt 0.702883 0.287279
+vt 0.709350 0.292230
+vt 0.702883 0.292230
+vt 0.689668 0.282612
+vt 0.682915 0.282612
+vt 0.682915 0.278512
+vt 0.689668 0.278512
+vt 0.676061 0.282612
+vt 0.676061 0.278512
+vt 0.696323 0.278512
+vt 0.696323 0.282612
+vt 0.696323 0.287279
+vt 0.689668 0.287279
+vt 0.696323 0.292230
+vt 0.689668 0.292230
+vt 0.682915 0.287279
+vt 0.676061 0.287279
+vt 0.682915 0.292230
+vt 0.676061 0.292230
+vt 0.662040 0.282612
+vt 0.654869 0.282612
+vt 0.654869 0.278512
+vt 0.662040 0.278512
+vt 0.647590 0.282612
+vt 0.647590 0.278512
+vt 0.669104 0.278512
+vt 0.669104 0.282612
+vt 0.669104 0.287279
+vt 0.662040 0.287279
+vt 0.669104 0.292230
+vt 0.662040 0.292230
+vt 0.654869 0.287279
+vt 0.647590 0.287279
+vt 0.654869 0.292230
+vt 0.647590 0.292230
+vt 0.632697 0.282612
+vt 0.625085 0.282612
+vt 0.625085 0.278512
+vt 0.632697 0.278512
+vt 0.617364 0.282612
+vt 0.617364 0.278512
+vt 0.640199 0.278512
+vt 0.640199 0.282612
+vt 0.640199 0.287279
+vt 0.632697 0.287279
+vt 0.640199 0.292230
+vt 0.632697 0.292230
+vt 0.625085 0.287279
+vt 0.617364 0.287279
+vt 0.625085 0.292230
+vt 0.617364 0.292230
+vt 0.601594 0.282612
+vt 0.593553 0.282612
+vt 0.593553 0.278512
+vt 0.601594 0.278512
+vt 0.585414 0.282612
+vt 0.585414 0.278512
+vt 0.609532 0.278512
+vt 0.609532 0.282612
+vt 0.609532 0.287279
+vt 0.601594 0.287279
+vt 0.609532 0.292230
+vt 0.601594 0.292230
+vt 0.593553 0.287279
+vt 0.585414 0.287279
+vt 0.593553 0.292230
+vt 0.585414 0.292230
+vt 0.568854 0.282612
+vt 0.560449 0.282612
+vt 0.560449 0.278512
+vt 0.568854 0.278512
+vt 0.551971 0.282612
+vt 0.551971 0.278512
+vt 0.577178 0.278512
+vt 0.577178 0.282612
+vt 0.577178 0.287279
+vt 0.568854 0.287279
+vt 0.577178 0.292230
+vt 0.568854 0.292230
+vt 0.560449 0.287279
+vt 0.551971 0.287279
+vt 0.560449 0.292230
+vt 0.551971 0.292230
+vt 0.534825 0.282612
+vt 0.526180 0.282612
+vt 0.526180 0.278512
+vt 0.534825 0.278512
+vt 0.517500 0.282612
+vt 0.517500 0.278512
+vt 0.543426 0.278512
+vt 0.543426 0.282612
+vt 0.543426 0.287279
+vt 0.534825 0.287279
+vt 0.543426 0.292230
+vt 0.534825 0.292230
+vt 0.526180 0.287279
+vt 0.517500 0.287279
+vt 0.526180 0.292230
+vt 0.517500 0.292230
+vt 0.500080 0.282612
+vt 0.491364 0.282612
+vt 0.491364 0.278512
+vt 0.500080 0.278512
+vt 0.508796 0.278512
+vt 0.508796 0.282612
+vt 0.508796 0.287279
+vt 0.500080 0.287279
+vt 0.508796 0.292230
+vt 0.500080 0.292230
+vt 0.491364 0.287279
+vt 0.491364 0.292230
+vt 0.863934 0.282647
+vt 0.866465 0.282652
+vt 0.866495 0.287302
+vt 0.863957 0.287300
+vt 0.866495 0.292237
+vt 0.863957 0.292236
+vt 0.870574 0.282655
+vt 0.870607 0.287305
+vt 0.870607 0.292237
+vt 0.862514 0.287296
+vt 0.862499 0.282642
+vt 0.862514 0.292235
+vt 0.862454 0.278554
+vt 0.863865 0.278561
+vt 0.862365 0.275318
+vt 0.863727 0.275327
+vt 0.866376 0.278568
+vt 0.870476 0.278573
+vt 0.866197 0.275334
+vt 0.870280 0.275341
+vt 0.863152 0.271980
+vt 0.862674 0.271309
+vt 0.864567 0.271046
+vt 0.865388 0.271921
+vt 0.868348 0.270754
+vt 0.869355 0.271854
+vt 0.862061 0.270981
+vt 0.863456 0.270482
+vt 0.866463 0.269301
+vt 0.865900 0.273234
+vt 0.863496 0.273226
+vt 0.869952 0.273242
+vt 0.862216 0.273217
+vt 0.862010 0.272001
+vt 0.861748 0.271417
+vt 0.861405 0.271190
+vt 0.860263 0.270637
+vt 0.858740 0.270580
+vt 0.858738 0.269784
+vt 0.860480 0.269874
+vt 0.858736 0.268243
+vt 0.860706 0.268350
+vt 0.856449 0.270562
+vt 0.856399 0.269766
+vt 0.856357 0.268225
+vt 0.862073 0.270099
+vt 0.861314 0.270764
+vt 0.862889 0.268629
+vt 0.860952 0.271043
+vt 0.860146 0.270957
+vt 0.858743 0.270913
+vt 0.856499 0.270895
+vt 0.828867 0.270543
+vt 0.823654 0.270543
+vt 0.823527 0.269748
+vt 0.828744 0.269748
+vt 0.823420 0.268208
+vt 0.828642 0.268208
+vt 0.818399 0.270543
+vt 0.818266 0.269748
+vt 0.818156 0.268208
+vt 0.833913 0.269748
+vt 0.834030 0.270543
+vt 0.839026 0.269748
+vt 0.839138 0.270543
+vt 0.833815 0.268208
+vt 0.838932 0.268208
+vt 0.834148 0.270877
+vt 0.828989 0.270877
+vt 0.839251 0.270877
+vt 0.823782 0.270877
+vt 0.818531 0.270877
+vt 0.807774 0.270543
+vt 0.802402 0.270543
+vt 0.802254 0.269748
+vt 0.807632 0.269748
+vt 0.802132 0.268208
+vt 0.807514 0.268208
+vt 0.796985 0.270543
+vt 0.796834 0.269748
+vt 0.796707 0.268208
+vt 0.812969 0.269748
+vt 0.813106 0.270543
+vt 0.812854 0.268208
+vt 0.813243 0.270877
+vt 0.807917 0.270877
+vt 0.802549 0.270877
+vt 0.797137 0.270877
+vt 0.786014 0.270543
+vt 0.780453 0.270543
+vt 0.780288 0.269748
+vt 0.785852 0.269748
+vt 0.780150 0.268208
+vt 0.785718 0.268208
+vt 0.774840 0.270543
+vt 0.774670 0.269748
+vt 0.774528 0.268208
+vt 0.791367 0.269748
+vt 0.791523 0.270543
+vt 0.791237 0.268208
+vt 0.791680 0.270877
+vt 0.786175 0.270877
+vt 0.780619 0.270877
+vt 0.775010 0.270877
+vt 0.763443 0.270543
+vt 0.757655 0.270543
+vt 0.757473 0.269748
+vt 0.763265 0.269748
+vt 0.757321 0.268208
+vt 0.763116 0.268208
+vt 0.751803 0.270543
+vt 0.751617 0.269748
+vt 0.751461 0.268208
+vt 0.768996 0.269748
+vt 0.769171 0.270543
+vt 0.768851 0.268208
+vt 0.769345 0.270877
+vt 0.763622 0.270877
+vt 0.757838 0.270877
+vt 0.751989 0.270877
+vt 0.739896 0.270543
+vt 0.733834 0.270543
+vt 0.733638 0.269748
+vt 0.739702 0.269748
+vt 0.733474 0.268208
+vt 0.739541 0.268208
+vt 0.727697 0.270543
+vt 0.727498 0.269748
+vt 0.727332 0.268208
+vt 0.745694 0.269748
+vt 0.745884 0.270543
+vt 0.745536 0.268208
+vt 0.746074 0.270877
+vt 0.740089 0.270877
+vt 0.734031 0.270877
+vt 0.727896 0.270877
+vt 0.715183 0.270543
+vt 0.708800 0.270543
+vt 0.708594 0.269748
+vt 0.714979 0.269748
+vt 0.708422 0.268208
+vt 0.714809 0.268208
+vt 0.702329 0.270543
+vt 0.702122 0.269748
+vt 0.701949 0.268208
+vt 0.721279 0.269748
+vt 0.721481 0.270543
+vt 0.721111 0.268208
+vt 0.721683 0.270877
+vt 0.715387 0.270877
+vt 0.709006 0.270877
+vt 0.702537 0.270877
+vt 0.689111 0.270543
+vt 0.682357 0.270543
+vt 0.682148 0.269748
+vt 0.688901 0.269748
+vt 0.681974 0.268208
+vt 0.688727 0.268208
+vt 0.675505 0.270543
+vt 0.675296 0.269748
+vt 0.675123 0.268208
+vt 0.695558 0.269748
+vt 0.695767 0.270543
+vt 0.695384 0.268208
+vt 0.695975 0.270877
+vt 0.689320 0.270877
+vt 0.682567 0.270877
+vt 0.675714 0.270877
+vt 0.661492 0.270543
+vt 0.654328 0.270543
+vt 0.654125 0.269748
+vt 0.661286 0.269748
+vt 0.653956 0.268208
+vt 0.661115 0.268208
+vt 0.647057 0.270543
+vt 0.646857 0.269748
+vt 0.646690 0.268208
+vt 0.668343 0.269748
+vt 0.668550 0.270543
+vt 0.668170 0.268208
+vt 0.668758 0.270877
+vt 0.661698 0.270877
+vt 0.654531 0.270877
+vt 0.647257 0.270877
+vt 0.632188 0.270543
+vt 0.624592 0.270543
+vt 0.624407 0.269748
+vt 0.631998 0.269748
+vt 0.624253 0.268208
+vt 0.631839 0.268208
+vt 0.616888 0.270543
+vt 0.616709 0.269748
+vt 0.616561 0.268208
+vt 0.639481 0.269748
+vt 0.639677 0.270543
+vt 0.639318 0.268208
+vt 0.639873 0.270877
+vt 0.632379 0.270877
+vt 0.624777 0.270877
+vt 0.617066 0.270877
+vt 0.601161 0.270543
+vt 0.593145 0.270543
+vt 0.592992 0.269748
+vt 0.600999 0.269748
+vt 0.592865 0.268208
+vt 0.600863 0.268208
+vt 0.585033 0.270543
+vt 0.584891 0.269748
+vt 0.584772 0.268208
+vt 0.608905 0.269748
+vt 0.609076 0.270543
+vt 0.608763 0.268208
+vt 0.609247 0.270877
+vt 0.601323 0.270877
+vt 0.593298 0.270877
+vt 0.585176 0.270877
+vt 0.568536 0.270543
+vt 0.560166 0.270543
+vt 0.560059 0.269748
+vt 0.568417 0.269748
+vt 0.559971 0.268208
+vt 0.568317 0.268208
+vt 0.551724 0.270543
+vt 0.551631 0.269748
+vt 0.551554 0.268208
+vt 0.576696 0.269748
+vt 0.576828 0.270543
+vt 0.576587 0.268208
+vt 0.576959 0.270877
+vt 0.568655 0.270877
+vt 0.560272 0.270877
+vt 0.551816 0.270877
+vt 0.534656 0.270543
+vt 0.526052 0.270543
+vt 0.526004 0.269748
+vt 0.534593 0.269748
+vt 0.525964 0.268208
+vt 0.534540 0.268208
+vt 0.517414 0.270543
+vt 0.517382 0.269748
+vt 0.517355 0.268208
+vt 0.543139 0.269748
+vt 0.543217 0.270543
+vt 0.543073 0.268208
+vt 0.543295 0.270877
+vt 0.534720 0.270877
+vt 0.526100 0.270877
+vt 0.517446 0.270877
+vt 0.500080 0.270543
+vt 0.491407 0.270543
+vt 0.491423 0.269748
+vt 0.500080 0.269748
+vt 0.491437 0.268208
+vt 0.500080 0.268208
+vt 0.508736 0.269748
+vt 0.508753 0.270543
+vt 0.508723 0.268208
+vt 0.508769 0.270877
+vt 0.500080 0.270877
+vt 0.491391 0.270877
+vt 0.853045 0.100211
+vt 0.851949 0.100217
+vt 0.851838 0.097365
+vt 0.852937 0.097340
+vt 0.849894 0.100221
+vt 0.849775 0.097384
+vt 0.853394 0.097312
+vt 0.853500 0.100203
+vt 0.853530 0.097282
+vt 0.853635 0.100196
+vt 0.853245 0.103023
+vt 0.852792 0.103023
+vt 0.852591 0.106093
+vt 0.852142 0.106093
+vt 0.853380 0.103023
+vt 0.852725 0.106093
+vt 0.851702 0.103023
+vt 0.849658 0.103023
+vt 0.851062 0.106093
+vt 0.849036 0.106093
+vt 0.903487 0.262237
+vt 0.905415 0.262210
+vt 0.906340 0.266149
+vt 0.903721 0.265988
+vt 0.906980 0.262174
+vt 0.908831 0.266362
+vt 0.900842 0.265931
+vt 0.900833 0.262250
+vt 0.896674 0.265922
+vt 0.896651 0.262256
+vt 0.900830 0.257599
+vt 0.903692 0.257485
+vt 0.900830 0.251965
+vt 0.904005 0.251690
+vt 0.896644 0.257651
+vt 0.896644 0.252105
+vt 0.906239 0.257209
+vt 0.908628 0.256854
+vt 0.907491 0.251051
+vt 0.913723 0.250094
+vt 0.860932 0.262261
+vt 0.863716 0.262314
+vt 0.863422 0.265935
+vt 0.860852 0.265749
+vt 0.867983 0.262351
+vt 0.867560 0.266081
+vt 0.858735 0.265674
+vt 0.858735 0.262233
+vt 0.856332 0.265658
+vt 0.856320 0.262220
+vt 0.858735 0.258076
+vt 0.860959 0.258078
+vt 0.858735 0.253359
+vt 0.860959 0.253338
+vt 0.856316 0.258068
+vt 0.856316 0.253357
+vt 0.863814 0.258062
+vt 0.868124 0.258020
+vt 0.863814 0.253270
+vt 0.868124 0.253132
+vt 0.821038 0.100226
+vt 0.815522 0.100226
+vt 0.815320 0.097403
+vt 0.820843 0.097403
+vt 0.809966 0.100226
+vt 0.809757 0.097403
+vt 0.826321 0.097403
+vt 0.826506 0.100226
+vt 0.831744 0.097403
+vt 0.831918 0.100226
+vt 0.826346 0.103023
+vt 0.820878 0.103023
+vt 0.825847 0.106093
+vt 0.820374 0.106093
+vt 0.831752 0.103023
+vt 0.831247 0.106093
+vt 0.815359 0.103023
+vt 0.809797 0.103023
+vt 0.814840 0.106093
+vt 0.809261 0.106093
+vt 0.828550 0.262207
+vt 0.833727 0.262207
+vt 0.833756 0.265642
+vt 0.828581 0.265642
+vt 0.838848 0.262207
+vt 0.838876 0.265642
+vt 0.823357 0.265642
+vt 0.823325 0.262207
+vt 0.818089 0.265642
+vt 0.818056 0.262207
+vt 0.823314 0.258059
+vt 0.828540 0.258059
+vt 0.823314 0.253354
+vt 0.828540 0.253354
+vt 0.818045 0.258059
+vt 0.818045 0.253354
+vt 0.833717 0.258059
+vt 0.838838 0.258059
+vt 0.833717 0.253354
+vt 0.838838 0.253354
+vt 0.798754 0.100226
+vt 0.793096 0.100226
+vt 0.792868 0.097403
+vt 0.798532 0.097403
+vt 0.787400 0.100226
+vt 0.787166 0.097403
+vt 0.804162 0.097403
+vt 0.804377 0.100226
+vt 0.804203 0.103023
+vt 0.798575 0.103023
+vt 0.803650 0.106093
+vt 0.798005 0.106093
+vt 0.792911 0.103023
+vt 0.787211 0.103023
+vt 0.792326 0.106093
+vt 0.786610 0.106093
+vt 0.807407 0.262207
+vt 0.812751 0.262207
+vt 0.812786 0.265642
+vt 0.807443 0.265642
+vt 0.802058 0.265642
+vt 0.802022 0.262207
+vt 0.796631 0.265642
+vt 0.796593 0.262207
+vt 0.802009 0.258059
+vt 0.807395 0.258059
+vt 0.802009 0.253354
+vt 0.807395 0.253354
+vt 0.796580 0.258059
+vt 0.796580 0.253354
+vt 0.812740 0.258059
+vt 0.812740 0.253354
+vt 0.775890 0.100226
+vt 0.770073 0.100226
+vt 0.769824 0.097403
+vt 0.775646 0.097403
+vt 0.764213 0.100226
+vt 0.763958 0.097403
+vt 0.781426 0.097403
+vt 0.781665 0.100226
+vt 0.781472 0.103023
+vt 0.775692 0.103023
+vt 0.780856 0.106093
+vt 0.775063 0.106093
+vt 0.769871 0.103023
+vt 0.764007 0.103023
+vt 0.769229 0.106093
+vt 0.763352 0.106093
+vt 0.785597 0.262207
+vt 0.791119 0.262207
+vt 0.791158 0.265642
+vt 0.785638 0.265642
+vt 0.780067 0.265642
+vt 0.780025 0.262207
+vt 0.774443 0.265642
+vt 0.774400 0.262207
+vt 0.780011 0.258059
+vt 0.785584 0.258059
+vt 0.780011 0.253354
+vt 0.785584 0.253354
+vt 0.774386 0.258059
+vt 0.774386 0.253354
+vt 0.791106 0.258059
+vt 0.791106 0.253354
+vt 0.752354 0.100226
+vt 0.746352 0.100226
+vt 0.746086 0.097403
+vt 0.752091 0.097403
+vt 0.740300 0.100226
+vt 0.740031 0.097403
+vt 0.758048 0.097403
+vt 0.758307 0.100226
+vt 0.758097 0.103023
+vt 0.752141 0.103023
+vt 0.757431 0.106093
+vt 0.751464 0.106093
+vt 0.746136 0.103023
+vt 0.740081 0.103023
+vt 0.745450 0.106093
+vt 0.739387 0.106093
+vt 0.762982 0.262207
+vt 0.768720 0.262207
+vt 0.768764 0.265642
+vt 0.763027 0.265642
+vt 0.757229 0.265642
+vt 0.757184 0.262207
+vt 0.751368 0.265642
+vt 0.751322 0.262207
+vt 0.757169 0.258059
+vt 0.762968 0.258059
+vt 0.757169 0.253354
+vt 0.762968 0.253354
+vt 0.751306 0.258059
+vt 0.751306 0.253354
+vt 0.768706 0.258059
+vt 0.768706 0.253354
+vt 0.728039 0.100226
+vt 0.721827 0.100226
+vt 0.721551 0.097403
+vt 0.727765 0.097403
+vt 0.715559 0.100226
+vt 0.715281 0.097403
+vt 0.733924 0.097403
+vt 0.734197 0.100226
+vt 0.733975 0.103023
+vt 0.727816 0.103023
+vt 0.733273 0.106093
+vt 0.727108 0.106093
+vt 0.721602 0.103023
+vt 0.715333 0.103023
+vt 0.720889 0.106093
+vt 0.714616 0.106093
+vt 0.739396 0.262207
+vt 0.745394 0.262207
+vt 0.745441 0.265642
+vt 0.739444 0.265642
+vt 0.733376 0.265642
+vt 0.733327 0.262207
+vt 0.727232 0.265642
+vt 0.727182 0.262207
+vt 0.733310 0.258059
+vt 0.739380 0.258059
+vt 0.733310 0.253354
+vt 0.739380 0.253354
+vt 0.727165 0.258059
+vt 0.727166 0.253354
+vt 0.745378 0.258059
+vt 0.745378 0.253354
+vt 0.702846 0.100226
+vt 0.696399 0.100226
+vt 0.696121 0.097403
+vt 0.702567 0.097403
+vt 0.689891 0.100226
+vt 0.689614 0.097403
+vt 0.708953 0.097403
+vt 0.709232 0.100226
+vt 0.709005 0.103023
+vt 0.702619 0.103023
+vt 0.708286 0.106093
+vt 0.701899 0.106093
+vt 0.696173 0.103023
+vt 0.689665 0.103023
+vt 0.695454 0.106093
+vt 0.688949 0.106093
+vt 0.714656 0.262207
+vt 0.720959 0.262207
+vt 0.721010 0.265642
+vt 0.714707 0.265642
+vt 0.708319 0.265642
+vt 0.708268 0.262207
+vt 0.701845 0.265642
+vt 0.701793 0.262207
+vt 0.708251 0.258059
+vt 0.714639 0.258059
+vt 0.708251 0.253354
+vt 0.714639 0.253354
+vt 0.701776 0.258059
+vt 0.701776 0.253354
+vt 0.720943 0.258059
+vt 0.720943 0.253354
+vt 0.676685 0.100226
+vt 0.669985 0.100226
+vt 0.669715 0.097403
+vt 0.676412 0.097403
+vt 0.663220 0.100226
+vt 0.662954 0.097403
+vt 0.683044 0.097403
+vt 0.683320 0.100226
+vt 0.683095 0.103023
+vt 0.676462 0.103023
+vt 0.682383 0.106093
+vt 0.675755 0.106093
+vt 0.669765 0.103023
+vt 0.663003 0.103023
+vt 0.669066 0.106093
+vt 0.662314 0.106093
+vt 0.688570 0.262207
+vt 0.695228 0.262207
+vt 0.695280 0.265642
+vt 0.688622 0.265642
+vt 0.681869 0.265642
+vt 0.681817 0.262207
+vt 0.675018 0.265642
+vt 0.674966 0.262207
+vt 0.681800 0.258059
+vt 0.688553 0.258059
+vt 0.681800 0.253354
+vt 0.688553 0.253354
+vt 0.674949 0.258059
+vt 0.674949 0.253354
+vt 0.695211 0.258059
+vt 0.695211 0.253354
+vt 0.649493 0.100226
+vt 0.642532 0.100226
+vt 0.642282 0.097403
+vt 0.649237 0.097403
+vt 0.635504 0.100226
+vt 0.635261 0.097403
+vt 0.656128 0.097403
+vt 0.656390 0.100226
+vt 0.656176 0.103023
+vt 0.649284 0.103023
+vt 0.655499 0.106093
+vt 0.648620 0.106093
+vt 0.642327 0.103023
+vt 0.635305 0.103023
+vt 0.641679 0.106093
+vt 0.634675 0.106093
+vt 0.660961 0.262207
+vt 0.668015 0.262207
+vt 0.668066 0.265642
+vt 0.661012 0.265642
+vt 0.653854 0.265642
+vt 0.653803 0.262207
+vt 0.646591 0.265642
+vt 0.646541 0.262207
+vt 0.653786 0.258059
+vt 0.660944 0.258059
+vt 0.653786 0.253354
+vt 0.660944 0.253354
+vt 0.646524 0.258059
+vt 0.646524 0.253354
+vt 0.667997 0.258059
+vt 0.667997 0.253354
+vt 0.621256 0.100226
+vt 0.614037 0.100226
+vt 0.613819 0.097403
+vt 0.621029 0.097403
+vt 0.606757 0.100226
+vt 0.606549 0.097403
+vt 0.628176 0.097403
+vt 0.628412 0.100226
+vt 0.628219 0.103023
+vt 0.621070 0.103023
+vt 0.627608 0.106093
+vt 0.620481 0.106093
+vt 0.613858 0.103023
+vt 0.606586 0.103023
+vt 0.613294 0.106093
+vt 0.606048 0.106093
+vt 0.631695 0.262207
+vt 0.639171 0.262207
+vt 0.639220 0.265642
+vt 0.631743 0.265642
+vt 0.624160 0.265642
+vt 0.624114 0.262207
+vt 0.616471 0.265642
+vt 0.616427 0.262207
+vt 0.624098 0.258059
+vt 0.631679 0.258059
+vt 0.624098 0.253354
+vt 0.631679 0.253354
+vt 0.616412 0.258059
+vt 0.616412 0.253354
+vt 0.639155 0.258059
+vt 0.639155 0.253354
+vt 0.592020 0.100226
+vt 0.584568 0.100226
+vt 0.584396 0.097403
+vt 0.591835 0.097403
+vt 0.577066 0.100226
+vt 0.576906 0.097403
+vt 0.599220 0.097403
+vt 0.599417 0.100226
+vt 0.599255 0.103023
+vt 0.591868 0.103023
+vt 0.598745 0.106093
+vt 0.591388 0.106093
+vt 0.584427 0.103023
+vt 0.576935 0.103023
+vt 0.583979 0.106093
+vt 0.576521 0.106093
+vt 0.600742 0.262207
+vt 0.608635 0.262207
+vt 0.608678 0.265642
+vt 0.600782 0.265642
+vt 0.592789 0.265642
+vt 0.592750 0.262207
+vt 0.584700 0.265642
+vt 0.584665 0.262207
+vt 0.592738 0.258059
+vt 0.600728 0.258059
+vt 0.592738 0.253354
+vt 0.600728 0.253354
+vt 0.584653 0.258059
+vt 0.584653 0.253354
+vt 0.608621 0.258059
+vt 0.608621 0.253354
+vt 0.561918 0.100226
+vt 0.554281 0.100226
+vt 0.554165 0.097403
+vt 0.561787 0.097403
+vt 0.546608 0.100226
+vt 0.546508 0.097403
+vt 0.569369 0.097403
+vt 0.569514 0.100226
+vt 0.569395 0.103023
+vt 0.561810 0.103023
+vt 0.569017 0.106093
+vt 0.561470 0.106093
+vt 0.554186 0.103023
+vt 0.546526 0.103023
+vt 0.553884 0.106093
+vt 0.546265 0.106093
+vt 0.568228 0.262207
+vt 0.576488 0.262207
+vt 0.576521 0.265642
+vt 0.568258 0.265642
+vt 0.559917 0.265642
+vt 0.559891 0.262207
+vt 0.551507 0.265642
+vt 0.551484 0.262207
+vt 0.559882 0.258059
+vt 0.568218 0.258059
+vt 0.559882 0.253354
+vt 0.568218 0.253354
+vt 0.551476 0.258059
+vt 0.551476 0.253354
+vt 0.576477 0.258059
+vt 0.576477 0.253354
+vt 0.531171 0.100226
+vt 0.523418 0.100226
+vt 0.523367 0.097403
+vt 0.531103 0.097403
+vt 0.515648 0.100226
+vt 0.515614 0.097403
+vt 0.538819 0.097403
+vt 0.538903 0.100226
+vt 0.538834 0.103023
+vt 0.531116 0.103023
+vt 0.538614 0.106093
+vt 0.530939 0.106093
+vt 0.523376 0.103023
+vt 0.515620 0.103023
+vt 0.523242 0.106093
+vt 0.515530 0.106093
+vt 0.534492 0.262207
+vt 0.543015 0.262207
+vt 0.543034 0.265642
+vt 0.534508 0.265642
+vt 0.525940 0.265642
+vt 0.525928 0.262207
+vt 0.517339 0.265642
+vt 0.517331 0.262207
+vt 0.525924 0.258059
+vt 0.534487 0.258059
+vt 0.525924 0.253354
+vt 0.534487 0.253354
+vt 0.517328 0.258059
+vt 0.517328 0.253354
+vt 0.543008 0.258059
+vt 0.543008 0.253354
+vt 0.500080 0.100226
+vt 0.492293 0.100226
+vt 0.492310 0.097403
+vt 0.500080 0.097403
+vt 0.507850 0.097403
+vt 0.507867 0.100226
+vt 0.507853 0.103023
+vt 0.500080 0.103023
+vt 0.507808 0.106093
+vt 0.500080 0.106093
+vt 0.492307 0.103023
+vt 0.492352 0.106093
+vt 0.500080 0.262207
+vt 0.508711 0.262207
+vt 0.508715 0.265642
+vt 0.500080 0.265642
+vt 0.491445 0.265642
+vt 0.491449 0.262207
+vt 0.491450 0.258059
+vt 0.500080 0.258059
+vt 0.491450 0.253354
+vt 0.500080 0.253354
+vt 0.508710 0.258059
+vt 0.508710 0.253354
+vt 0.500080 0.243164
+vt 0.500080 0.238510
+vt 0.508710 0.238510
+vt 0.508710 0.243164
+vt 0.517328 0.238510
+vt 0.517328 0.243164
+vt 0.500080 0.234706
+vt 0.508710 0.234706
+vt 0.517328 0.234706
+vt 0.508710 0.248251
+vt 0.500080 0.248251
+vt 0.517328 0.248251
+vt 0.491450 0.248251
+vt 0.491450 0.243164
+vt 0.491450 0.238510
+vt 0.491450 0.234706
+vt 0.534487 0.243164
+vt 0.534487 0.238510
+vt 0.543008 0.238510
+vt 0.543008 0.243164
+vt 0.551476 0.238510
+vt 0.551476 0.243164
+vt 0.534487 0.234706
+vt 0.543008 0.234706
+vt 0.551476 0.234706
+vt 0.543008 0.248251
+vt 0.534487 0.248251
+vt 0.551476 0.248251
+vt 0.525924 0.248251
+vt 0.525924 0.243164
+vt 0.525924 0.238510
+vt 0.525924 0.234706
+vt 0.568218 0.243164
+vt 0.568218 0.238510
+vt 0.576477 0.238510
+vt 0.576477 0.243164
+vt 0.584653 0.238510
+vt 0.584653 0.243164
+vt 0.568218 0.234706
+vt 0.576477 0.234706
+vt 0.584653 0.234706
+vt 0.576477 0.248251
+vt 0.568218 0.248251
+vt 0.584653 0.248251
+vt 0.559882 0.248251
+vt 0.559882 0.243164
+vt 0.559882 0.238510
+vt 0.559882 0.234706
+vt 0.600728 0.243164
+vt 0.600728 0.238510
+vt 0.608621 0.238510
+vt 0.608621 0.243164
+vt 0.616412 0.238510
+vt 0.616412 0.243164
+vt 0.600728 0.234706
+vt 0.608621 0.234706
+vt 0.616412 0.234706
+vt 0.608621 0.248251
+vt 0.600728 0.248251
+vt 0.616412 0.248251
+vt 0.592738 0.248251
+vt 0.592738 0.243164
+vt 0.592738 0.238510
+vt 0.592738 0.234706
+vt 0.631679 0.243164
+vt 0.631679 0.238510
+vt 0.639155 0.238510
+vt 0.639155 0.243164
+vt 0.646524 0.238510
+vt 0.646524 0.243164
+vt 0.631679 0.234706
+vt 0.639155 0.234706
+vt 0.646524 0.234706
+vt 0.639155 0.248251
+vt 0.631679 0.248251
+vt 0.646524 0.248251
+vt 0.624098 0.248251
+vt 0.624098 0.243164
+vt 0.624098 0.238510
+vt 0.624098 0.234706
+vt 0.660944 0.243164
+vt 0.660944 0.238510
+vt 0.667997 0.238510
+vt 0.667997 0.243164
+vt 0.674949 0.238510
+vt 0.674949 0.243164
+vt 0.660944 0.234706
+vt 0.667997 0.234706
+vt 0.674949 0.234706
+vt 0.667997 0.248251
+vt 0.660944 0.248251
+vt 0.674949 0.248251
+vt 0.653786 0.248251
+vt 0.653786 0.243164
+vt 0.653786 0.238510
+vt 0.653786 0.234706
+vt 0.688553 0.243164
+vt 0.688553 0.238510
+vt 0.695211 0.238510
+vt 0.695211 0.243164
+vt 0.701776 0.238510
+vt 0.701776 0.243164
+vt 0.688553 0.234706
+vt 0.695211 0.234706
+vt 0.701776 0.234706
+vt 0.695211 0.248251
+vt 0.688553 0.248251
+vt 0.701776 0.248251
+vt 0.681800 0.248251
+vt 0.681800 0.243164
+vt 0.681800 0.238510
+vt 0.681800 0.234706
+vt 0.714639 0.243164
+vt 0.714639 0.238510
+vt 0.720943 0.238510
+vt 0.720943 0.243164
+vt 0.727165 0.238510
+vt 0.727166 0.243164
+vt 0.714639 0.234706
+vt 0.720943 0.234706
+vt 0.727166 0.234706
+vt 0.720943 0.248251
+vt 0.714639 0.248251
+vt 0.727166 0.248251
+vt 0.708251 0.248251
+vt 0.708251 0.243164
+vt 0.708251 0.238510
+vt 0.708251 0.234706
+vt 0.739380 0.243164
+vt 0.739380 0.238510
+vt 0.745378 0.238510
+vt 0.745378 0.243164
+vt 0.751306 0.238510
+vt 0.751306 0.243164
+vt 0.739380 0.234706
+vt 0.745378 0.234706
+vt 0.751306 0.234706
+vt 0.745378 0.248251
+vt 0.739380 0.248251
+vt 0.751306 0.248251
+vt 0.733310 0.248251
+vt 0.733310 0.243164
+vt 0.733310 0.238510
+vt 0.733310 0.234706
+vt 0.762968 0.243164
+vt 0.762968 0.238510
+vt 0.768706 0.238510
+vt 0.768706 0.243164
+vt 0.774386 0.238510
+vt 0.774386 0.243164
+vt 0.762968 0.234706
+vt 0.768706 0.234706
+vt 0.774386 0.234706
+vt 0.768706 0.248251
+vt 0.762968 0.248251
+vt 0.774386 0.248251
+vt 0.757169 0.248251
+vt 0.757169 0.243164
+vt 0.757169 0.238510
+vt 0.757169 0.234706
+vt 0.785584 0.243164
+vt 0.785584 0.238510
+vt 0.791106 0.238510
+vt 0.791106 0.243164
+vt 0.796580 0.238510
+vt 0.796580 0.243164
+vt 0.785584 0.234706
+vt 0.791106 0.234706
+vt 0.796580 0.234706
+vt 0.791106 0.248251
+vt 0.785584 0.248251
+vt 0.796580 0.248251
+vt 0.780011 0.248251
+vt 0.780011 0.243164
+vt 0.780011 0.238510
+vt 0.780011 0.234706
+vt 0.807395 0.243164
+vt 0.807395 0.238510
+vt 0.812740 0.238510
+vt 0.812740 0.243164
+vt 0.818045 0.238510
+vt 0.818045 0.243164
+vt 0.807395 0.234706
+vt 0.812740 0.234706
+vt 0.818045 0.234706
+vt 0.812740 0.248251
+vt 0.807395 0.248251
+vt 0.818045 0.248251
+vt 0.802009 0.248251
+vt 0.802009 0.243164
+vt 0.802009 0.238510
+vt 0.802009 0.234706
+vt 0.828540 0.243164
+vt 0.828540 0.238510
+vt 0.833717 0.238510
+vt 0.833717 0.243164
+vt 0.838838 0.238510
+vt 0.838838 0.243164
+vt 0.828540 0.234706
+vt 0.833717 0.234706
+vt 0.838838 0.234706
+vt 0.833717 0.248251
+vt 0.828540 0.248251
+vt 0.838838 0.248251
+vt 0.823314 0.248251
+vt 0.823314 0.243164
+vt 0.823314 0.238510
+vt 0.823314 0.234706
+vt 0.860959 0.243037
+vt 0.858735 0.243133
+vt 0.858735 0.238470
+vt 0.860959 0.238340
+vt 0.858735 0.234671
+vt 0.860959 0.234521
+vt 0.856316 0.243148
+vt 0.856316 0.238490
+vt 0.856316 0.234689
+vt 0.863814 0.237998
+vt 0.863814 0.242787
+vt 0.868124 0.237344
+vt 0.868124 0.242310
+vt 0.863814 0.234112
+vt 0.868124 0.233320
+vt 0.863814 0.248028
+vt 0.860959 0.248180
+vt 0.868124 0.247734
+vt 0.858735 0.248237
+vt 0.856316 0.248244
+vt 0.904079 0.237698
+vt 0.904074 0.231188
+vt 0.907765 0.229498
+vt 0.907786 0.236082
+vt 0.913291 0.226329
+vt 0.913324 0.232778
+vt 0.904074 0.225968
+vt 0.907765 0.224370
+vt 0.913291 0.221434
+vt 0.907851 0.243638
+vt 0.904095 0.244814
+vt 0.913421 0.240476
+vt 0.900830 0.245333
+vt 0.900830 0.238443
+vt 0.896644 0.245620
+vt 0.896644 0.238905
+vt 0.900830 0.232033
+vt 0.900830 0.226845
+vt 0.896644 0.232668
+vt 0.896644 0.227620
+vt 0.846079 0.146091
+vt 0.846076 0.149123
+vt 0.845086 0.149124
+vt 0.845089 0.146091
+vt 0.843229 0.149124
+vt 0.843232 0.146091
+vt 0.846076 0.151874
+vt 0.845086 0.151874
+vt 0.843229 0.151874
+vt 0.845099 0.142776
+vt 0.846090 0.142776
+vt 0.845119 0.139178
+vt 0.846110 0.139178
+vt 0.843242 0.142776
+vt 0.843261 0.139178
+vt 0.846502 0.142776
+vt 0.846492 0.146091
+vt 0.846625 0.142776
+vt 0.846615 0.146091
+vt 0.846523 0.139178
+vt 0.846646 0.139178
+vt 0.846488 0.149123
+vt 0.846488 0.151874
+vt 0.846611 0.149123
+vt 0.846611 0.151874
+vt 0.815665 0.146091
+vt 0.815662 0.149123
+vt 0.810001 0.149123
+vt 0.810003 0.146091
+vt 0.804259 0.149123
+vt 0.804261 0.146091
+vt 0.815662 0.151874
+vt 0.810001 0.151874
+vt 0.804259 0.151874
+vt 0.810011 0.142776
+vt 0.815673 0.142776
+vt 0.810028 0.139178
+vt 0.815689 0.139178
+vt 0.804270 0.142776
+vt 0.804286 0.139178
+vt 0.821202 0.142776
+vt 0.821194 0.146091
+vt 0.826545 0.142776
+vt 0.826537 0.146091
+vt 0.821217 0.139178
+vt 0.826561 0.139178
+vt 0.821191 0.149123
+vt 0.821191 0.151874
+vt 0.826534 0.149123
+vt 0.826534 0.151874
+vt 0.792695 0.146091
+vt 0.792692 0.149123
+vt 0.786864 0.149123
+vt 0.786867 0.146091
+vt 0.781006 0.149123
+vt 0.781009 0.146091
+vt 0.792692 0.151874
+vt 0.786864 0.151874
+vt 0.781006 0.151874
+vt 0.786876 0.142776
+vt 0.792703 0.142776
+vt 0.786895 0.139178
+vt 0.792721 0.139178
+vt 0.781019 0.142776
+vt 0.781037 0.139178
+vt 0.798501 0.142776
+vt 0.798492 0.146091
+vt 0.798518 0.139178
+vt 0.798489 0.149123
+vt 0.798489 0.151874
+vt 0.769197 0.146091
+vt 0.769194 0.149123
+vt 0.763237 0.149123
+vt 0.763240 0.146091
+vt 0.757245 0.149123
+vt 0.757249 0.146091
+vt 0.769194 0.151874
+vt 0.763237 0.151874
+vt 0.757245 0.151874
+vt 0.763250 0.142776
+vt 0.769207 0.142776
+vt 0.763270 0.139178
+vt 0.769226 0.139178
+vt 0.757259 0.142776
+vt 0.757279 0.139178
+vt 0.775129 0.142776
+vt 0.775120 0.146091
+vt 0.775148 0.139178
+vt 0.775116 0.149123
+vt 0.775116 0.151874
+vt 0.745156 0.146091
+vt 0.745153 0.149123
+vt 0.739050 0.149123
+vt 0.739053 0.146091
+vt 0.732908 0.149123
+vt 0.732911 0.146091
+vt 0.745153 0.151874
+vt 0.739050 0.151874
+vt 0.732908 0.151874
+vt 0.739064 0.142776
+vt 0.745166 0.142776
+vt 0.739085 0.139178
+vt 0.745187 0.139178
+vt 0.732922 0.142776
+vt 0.732943 0.139178
+vt 0.751231 0.142776
+vt 0.751221 0.146091
+vt 0.751252 0.139178
+vt 0.751217 0.149123
+vt 0.751217 0.151874
+vt 0.720507 0.146091
+vt 0.720503 0.149123
+vt 0.714239 0.149123
+vt 0.714243 0.146091
+vt 0.707932 0.149123
+vt 0.707936 0.146091
+vt 0.720503 0.151874
+vt 0.714239 0.151874
+vt 0.707933 0.151874
+vt 0.714253 0.142776
+vt 0.720518 0.142776
+vt 0.714275 0.139178
+vt 0.720539 0.139178
+vt 0.707947 0.142776
+vt 0.707969 0.139178
+vt 0.726740 0.142776
+vt 0.726729 0.146091
+vt 0.726762 0.139178
+vt 0.726726 0.149123
+vt 0.726726 0.151874
+vt 0.695194 0.146091
+vt 0.695190 0.149123
+vt 0.688753 0.149123
+vt 0.688756 0.146091
+vt 0.682271 0.149123
+vt 0.682275 0.146091
+vt 0.695190 0.151874
+vt 0.688753 0.151874
+vt 0.682271 0.151874
+vt 0.688767 0.142776
+vt 0.695204 0.142776
+vt 0.688789 0.139178
+vt 0.695226 0.139178
+vt 0.682285 0.142776
+vt 0.682307 0.139178
+vt 0.701597 0.142776
+vt 0.701587 0.146091
+vt 0.701619 0.139178
+vt 0.701583 0.149123
+vt 0.701583 0.151874
+vt 0.669177 0.146091
+vt 0.669173 0.149123
+vt 0.662557 0.149123
+vt 0.662560 0.146091
+vt 0.655895 0.149123
+vt 0.655898 0.146091
+vt 0.669173 0.151874
+vt 0.662557 0.151874
+vt 0.655895 0.151874
+vt 0.662570 0.142776
+vt 0.669187 0.142776
+vt 0.662591 0.139178
+vt 0.669208 0.139178
+vt 0.655909 0.142776
+vt 0.655929 0.139178
+vt 0.675759 0.142776
+vt 0.675748 0.146091
+vt 0.675780 0.139178
+vt 0.675745 0.149123
+vt 0.675745 0.151874
+vt 0.642441 0.146091
+vt 0.642437 0.149123
+vt 0.635642 0.149123
+vt 0.635645 0.146091
+vt 0.628804 0.149123
+vt 0.628807 0.146091
+vt 0.642437 0.151874
+vt 0.635642 0.151874
+vt 0.628804 0.151874
+vt 0.635655 0.142776
+vt 0.642450 0.142776
+vt 0.635674 0.139178
+vt 0.642470 0.139178
+vt 0.628816 0.142776
+vt 0.628835 0.139178
+vt 0.649202 0.142776
+vt 0.649192 0.146091
+vt 0.649222 0.139178
+vt 0.649188 0.149123
+vt 0.649188 0.151874
+vt 0.615003 0.146091
+vt 0.615000 0.149123
+vt 0.608037 0.149123
+vt 0.608040 0.146091
+vt 0.601035 0.149123
+vt 0.601038 0.146091
+vt 0.615000 0.151874
+vt 0.608037 0.151874
+vt 0.601035 0.151874
+vt 0.608048 0.142776
+vt 0.615012 0.142776
+vt 0.608065 0.139178
+vt 0.615029 0.139178
+vt 0.601046 0.142776
+vt 0.601061 0.139178
+vt 0.621935 0.142776
+vt 0.621926 0.146091
+vt 0.621953 0.139178
+vt 0.621923 0.149123
+vt 0.621923 0.151874
+vt 0.586923 0.146091
+vt 0.586920 0.149123
+vt 0.579811 0.149123
+vt 0.579813 0.146091
+vt 0.572670 0.149123
+vt 0.572672 0.146091
+vt 0.586920 0.151874
+vt 0.579811 0.151874
+vt 0.572670 0.151874
+vt 0.579820 0.142776
+vt 0.586930 0.142776
+vt 0.579833 0.139178
+vt 0.586943 0.139178
+vt 0.572678 0.142776
+vt 0.572690 0.139178
+vt 0.594006 0.142776
+vt 0.593998 0.146091
+vt 0.594020 0.139178
+vt 0.593996 0.149123
+vt 0.593996 0.151874
+vt 0.558303 0.146091
+vt 0.558302 0.149123
+vt 0.551080 0.149123
+vt 0.551081 0.146091
+vt 0.543836 0.149123
+vt 0.543837 0.146091
+vt 0.558302 0.151874
+vt 0.551080 0.151874
+vt 0.543836 0.151874
+vt 0.551085 0.142776
+vt 0.558308 0.142776
+vt 0.551094 0.139178
+vt 0.558318 0.139178
+vt 0.543841 0.142776
+vt 0.543848 0.139178
+vt 0.565507 0.142776
+vt 0.565501 0.146091
+vt 0.565518 0.139178
+vt 0.565499 0.149123
+vt 0.565499 0.151874
+vt 0.529294 0.146091
+vt 0.529293 0.149123
+vt 0.522001 0.149123
+vt 0.522002 0.146091
+vt 0.514700 0.149123
+vt 0.514700 0.146091
+vt 0.529293 0.151874
+vt 0.522001 0.151874
+vt 0.514700 0.151874
+vt 0.522004 0.142776
+vt 0.529297 0.142776
+vt 0.522008 0.139178
+vt 0.529302 0.139178
+vt 0.514701 0.142776
+vt 0.514704 0.139178
+vt 0.536577 0.142776
+vt 0.536573 0.146091
+vt 0.536583 0.139178
+vt 0.536572 0.149123
+vt 0.536572 0.151874
+vt 0.500080 0.146091
+vt 0.500080 0.149123
+vt 0.492768 0.149123
+vt 0.492768 0.146091
+vt 0.500080 0.151874
+vt 0.492768 0.151874
+vt 0.492768 0.142776
+vt 0.500080 0.142776
+vt 0.492766 0.139178
+vt 0.500080 0.139178
+vt 0.507392 0.142776
+vt 0.507392 0.146091
+vt 0.507394 0.139178
+vt 0.507391 0.149123
+vt 0.507391 0.151874
+vt 0.849757 0.113793
+vt 0.848712 0.113793
+vt 0.849995 0.109735
+vt 0.851059 0.109735
+vt 0.846752 0.113793
+vt 0.847999 0.109735
+vt 0.851502 0.109735
+vt 0.850191 0.113793
+vt 0.851634 0.109735
+vt 0.850321 0.113793
+vt 0.848874 0.118113
+vt 0.848447 0.118113
+vt 0.847764 0.122540
+vt 0.847344 0.122540
+vt 0.849001 0.118113
+vt 0.847889 0.122540
+vt 0.847422 0.118113
+vt 0.845498 0.118113
+vt 0.846335 0.122540
+vt 0.844442 0.122540
+vt 0.932403 0.219862
+vt 0.932419 0.225916
+vt 0.922129 0.233999
+vt 0.922064 0.226968
+vt 0.932441 0.232385
+vt 0.922215 0.241587
+vt 0.922042 0.221048
+vt 0.932398 0.214637
+vt 0.922042 0.216539
+vt 0.932398 0.210593
+vt 0.942737 0.208079
+vt 0.942737 0.212670
+vt 0.951440 0.202356
+vt 0.951440 0.206439
+vt 0.942737 0.204502
+vt 0.951440 0.199173
+vt 0.942737 0.217936
+vt 0.942737 0.223541
+vt 0.951440 0.211124
+vt 0.951440 0.216109
+vt 0.849773 0.181475
+vt 0.850196 0.181417
+vt 0.851521 0.187539
+vt 0.851126 0.187768
+vt 0.850326 0.181417
+vt 0.851653 0.187539
+vt 0.850206 0.188455
+vt 0.848765 0.181646
+vt 0.848350 0.189052
+vt 0.846840 0.181796
+vt 0.847422 0.175468
+vt 0.848447 0.175468
+vt 0.846335 0.170336
+vt 0.847344 0.170336
+vt 0.845498 0.175468
+vt 0.844442 0.170336
+vt 0.818520 0.113793
+vt 0.812936 0.113793
+vt 0.813976 0.109735
+vt 0.819533 0.109735
+vt 0.807293 0.113793
+vt 0.808368 0.109735
+vt 0.825016 0.109735
+vt 0.824016 0.113793
+vt 0.830406 0.109735
+vt 0.829394 0.113793
+vt 0.823011 0.118113
+vt 0.817503 0.118113
+vt 0.822164 0.122540
+vt 0.816646 0.122540
+vt 0.828376 0.118113
+vt 0.827519 0.122540
+vt 0.811891 0.118113
+vt 0.806213 0.118113
+vt 0.811011 0.122540
+vt 0.805303 0.122540
+vt 0.818605 0.181696
+vt 0.824099 0.181696
+vt 0.825349 0.188655
+vt 0.819869 0.188655
+vt 0.826679 0.195979
+vt 0.821215 0.195979
+vt 0.829478 0.181696
+vt 0.830742 0.188655
+vt 0.832089 0.195979
+vt 0.814322 0.188655
+vt 0.813023 0.181696
+vt 0.808725 0.188655
+vt 0.807382 0.181696
+vt 0.815704 0.195979
+vt 0.810154 0.195979
+vt 0.811891 0.175468
+vt 0.817503 0.175468
+vt 0.811011 0.170336
+vt 0.816646 0.170336
+vt 0.806213 0.175468
+vt 0.805303 0.170336
+vt 0.823010 0.175468
+vt 0.828376 0.175468
+vt 0.822164 0.170336
+vt 0.827519 0.170336
+vt 0.795915 0.113793
+vt 0.790177 0.113793
+vt 0.791351 0.109735
+vt 0.797056 0.109735
+vt 0.784405 0.113793
+vt 0.785609 0.109735
+vt 0.802728 0.109735
+vt 0.801620 0.113793
+vt 0.800505 0.118113
+vt 0.794767 0.118113
+vt 0.799566 0.122540
+vt 0.793800 0.122540
+vt 0.788997 0.118113
+vt 0.783195 0.118113
+vt 0.788004 0.122540
+vt 0.782175 0.122540
+vt 0.796010 0.181696
+vt 0.801712 0.181696
+vt 0.803097 0.188655
+vt 0.797436 0.188655
+vt 0.804572 0.195979
+vt 0.798954 0.195979
+vt 0.791741 0.188655
+vt 0.790275 0.181696
+vt 0.786010 0.188655
+vt 0.784505 0.181696
+vt 0.793302 0.195979
+vt 0.787611 0.195979
+vt 0.788997 0.175468
+vt 0.794767 0.175468
+vt 0.788004 0.170336
+vt 0.793800 0.170336
+vt 0.783195 0.175468
+vt 0.782175 0.170336
+vt 0.800505 0.175468
+vt 0.799566 0.170336
+vt 0.772753 0.113793
+vt 0.766871 0.113793
+vt 0.768158 0.109735
+vt 0.774015 0.109735
+vt 0.760948 0.113793
+vt 0.762261 0.109735
+vt 0.779831 0.109735
+vt 0.778598 0.113793
+vt 0.777358 0.118113
+vt 0.771485 0.118113
+vt 0.776313 0.122540
+vt 0.770417 0.122540
+vt 0.765576 0.118113
+vt 0.759629 0.118113
+vt 0.764486 0.122540
+vt 0.758518 0.122540
+vt 0.772858 0.181696
+vt 0.778700 0.181696
+vt 0.780241 0.188655
+vt 0.774434 0.188655
+vt 0.781882 0.195979
+vt 0.776112 0.195979
+vt 0.768587 0.188655
+vt 0.766978 0.181696
+vt 0.762697 0.188655
+vt 0.761058 0.181696
+vt 0.770299 0.195979
+vt 0.764443 0.195979
+vt 0.765576 0.175468
+vt 0.771485 0.175468
+vt 0.764486 0.170336
+vt 0.770417 0.170336
+vt 0.759629 0.175468
+vt 0.758518 0.170336
+vt 0.777358 0.175468
+vt 0.776313 0.170336
+vt 0.748980 0.113793
+vt 0.742930 0.113793
+vt 0.744306 0.109735
+vt 0.750336 0.109735
+vt 0.736836 0.113793
+vt 0.738229 0.109735
+vt 0.756321 0.109735
+vt 0.754985 0.113793
+vt 0.753643 0.118113
+vt 0.747616 0.118113
+vt 0.752512 0.122540
+vt 0.746467 0.122540
+vt 0.741547 0.118113
+vt 0.735436 0.118113
+vt 0.740383 0.122540
+vt 0.734257 0.122540
+vt 0.749092 0.181696
+vt 0.755096 0.181696
+vt 0.756765 0.188655
+vt 0.750787 0.188655
+vt 0.758541 0.195979
+vt 0.752592 0.195979
+vt 0.744764 0.188655
+vt 0.743045 0.181696
+vt 0.738692 0.188655
+vt 0.736952 0.181696
+vt 0.746593 0.195979
+vt 0.740545 0.195979
+vt 0.741547 0.175468
+vt 0.747616 0.175468
+vt 0.740383 0.170336
+vt 0.746467 0.170336
+vt 0.735436 0.175468
+vt 0.734257 0.170336
+vt 0.753643 0.175468
+vt 0.752512 0.170336
+vt 0.724507 0.113793
+vt 0.718270 0.113793
+vt 0.719700 0.109735
+vt 0.725927 0.109735
+vt 0.711984 0.113793
+vt 0.713421 0.109735
+vt 0.732103 0.109735
+vt 0.730695 0.113793
+vt 0.729280 0.118113
+vt 0.723080 0.118113
+vt 0.728089 0.122540
+vt 0.721878 0.122540
+vt 0.716833 0.118113
+vt 0.710539 0.118113
+vt 0.715623 0.122540
+vt 0.709323 0.122540
+vt 0.724625 0.181696
+vt 0.730812 0.181696
+vt 0.732571 0.188655
+vt 0.726400 0.188655
+vt 0.734443 0.195979
+vt 0.728288 0.195979
+vt 0.720176 0.188655
+vt 0.718389 0.181696
+vt 0.713899 0.188655
+vt 0.712103 0.181696
+vt 0.722078 0.195979
+vt 0.715810 0.195979
+vt 0.716833 0.175468
+vt 0.723080 0.175468
+vt 0.715623 0.170336
+vt 0.721878 0.170336
+vt 0.710539 0.175468
+vt 0.709323 0.170336
+vt 0.729280 0.175468
+vt 0.728089 0.170336
+vt 0.699256 0.113793
+vt 0.692814 0.113793
+vt 0.694255 0.109735
+vt 0.700700 0.109735
+vt 0.686318 0.113793
+vt 0.687754 0.109735
+vt 0.707088 0.109735
+vt 0.705646 0.113793
+vt 0.704197 0.118113
+vt 0.697806 0.118113
+vt 0.702977 0.122540
+vt 0.696585 0.122540
+vt 0.691365 0.118113
+vt 0.684874 0.118113
+vt 0.690145 0.122540
+vt 0.683659 0.122540
+vt 0.699376 0.181696
+vt 0.705766 0.181696
+vt 0.707567 0.188655
+vt 0.701179 0.188655
+vt 0.709485 0.195979
+vt 0.703099 0.195979
+vt 0.694735 0.188655
+vt 0.692934 0.181696
+vt 0.688232 0.188655
+vt 0.686437 0.181696
+vt 0.696652 0.195979
+vt 0.690143 0.195979
+vt 0.691365 0.175468
+vt 0.697806 0.175468
+vt 0.690145 0.170336
+vt 0.696585 0.170336
+vt 0.684874 0.175468
+vt 0.683659 0.170336
+vt 0.704197 0.175468
+vt 0.702977 0.170336
+vt 0.673162 0.113793
+vt 0.666501 0.113793
+vt 0.667902 0.109735
+vt 0.674578 0.109735
+vt 0.659784 0.113793
+vt 0.661166 0.109735
+vt 0.681195 0.109735
+vt 0.679767 0.113793
+vt 0.678332 0.118113
+vt 0.671738 0.118113
+vt 0.677123 0.122540
+vt 0.670540 0.122540
+vt 0.665093 0.118113
+vt 0.658396 0.118113
+vt 0.663908 0.122540
+vt 0.657227 0.122540
+vt 0.673279 0.181696
+vt 0.679886 0.181696
+vt 0.681670 0.188655
+vt 0.675049 0.188655
+vt 0.683570 0.195979
+vt 0.676933 0.195979
+vt 0.668367 0.188655
+vt 0.666617 0.181696
+vt 0.661625 0.188655
+vt 0.659899 0.181696
+vt 0.670230 0.195979
+vt 0.663462 0.195979
+vt 0.665093 0.175468
+vt 0.671738 0.175468
+vt 0.663908 0.170336
+vt 0.670540 0.170336
+vt 0.658396 0.175468
+vt 0.657227 0.170336
+vt 0.678332 0.175468
+vt 0.677123 0.170336
+vt 0.646183 0.113793
+vt 0.639299 0.113793
+vt 0.640599 0.109735
+vt 0.647514 0.109735
+vt 0.632360 0.113793
+vt 0.633624 0.109735
+vt 0.654370 0.109735
+vt 0.653012 0.113793
+vt 0.651647 0.118113
+vt 0.644846 0.118113
+vt 0.650498 0.122540
+vt 0.643720 0.122540
+vt 0.637993 0.118113
+vt 0.631090 0.118113
+vt 0.636894 0.122540
+vt 0.630021 0.122540
+vt 0.646294 0.181696
+vt 0.653124 0.181696
+vt 0.654821 0.188655
+vt 0.647956 0.188655
+vt 0.656628 0.195979
+vt 0.649726 0.195979
+vt 0.641031 0.188655
+vt 0.639407 0.181696
+vt 0.634045 0.188655
+vt 0.632465 0.181696
+vt 0.642759 0.195979
+vt 0.635725 0.195979
+vt 0.637993 0.175468
+vt 0.644846 0.175468
+vt 0.636894 0.170336
+vt 0.643720 0.170336
+vt 0.631090 0.175468
+vt 0.630021 0.170336
+vt 0.651647 0.175468
+vt 0.650498 0.170336
+vt 0.618320 0.113793
+vt 0.611221 0.113793
+vt 0.612353 0.109735
+vt 0.619500 0.109735
+vt 0.604071 0.113793
+vt 0.605151 0.109735
+vt 0.626591 0.109735
+vt 0.625367 0.113793
+vt 0.624137 0.118113
+vt 0.617134 0.118113
+vt 0.623101 0.122540
+vt 0.616136 0.122540
+vt 0.610084 0.118113
+vt 0.602987 0.118113
+vt 0.609126 0.122540
+vt 0.602074 0.122540
+vt 0.618418 0.181696
+vt 0.625469 0.181696
+vt 0.626998 0.188655
+vt 0.619892 0.188655
+vt 0.628626 0.195979
+vt 0.621462 0.195979
+vt 0.612729 0.188655
+vt 0.611315 0.181696
+vt 0.605510 0.188655
+vt 0.604161 0.181696
+vt 0.614235 0.195979
+vt 0.606945 0.195979
+vt 0.610084 0.175468
+vt 0.617134 0.175468
+vt 0.609126 0.170336
+vt 0.616136 0.170336
+vt 0.602987 0.175468
+vt 0.602074 0.170336
+vt 0.624137 0.175468
+vt 0.623101 0.170336
+vt 0.589626 0.113793
+vt 0.582335 0.113793
+vt 0.583233 0.109735
+vt 0.590588 0.109735
+vt 0.575002 0.113793
+vt 0.575832 0.109735
+vt 0.597895 0.109735
+vt 0.596872 0.113793
+vt 0.595844 0.118113
+vt 0.588659 0.118113
+vt 0.594979 0.122540
+vt 0.587845 0.122540
+vt 0.581433 0.118113
+vt 0.574169 0.118113
+vt 0.580674 0.122540
+vt 0.573467 0.122540
+vt 0.589706 0.181696
+vt 0.596957 0.181696
+vt 0.598235 0.188655
+vt 0.590908 0.188655
+vt 0.599596 0.195979
+vt 0.592188 0.195979
+vt 0.583531 0.188655
+vt 0.582410 0.181696
+vt 0.576107 0.188655
+vt 0.575071 0.181696
+vt 0.584725 0.195979
+vt 0.577211 0.195979
+vt 0.581433 0.175468
+vt 0.588659 0.175468
+vt 0.580674 0.170336
+vt 0.587845 0.170336
+vt 0.574169 0.175468
+vt 0.573467 0.170336
+vt 0.595844 0.175468
+vt 0.594979 0.170336
+vt 0.560220 0.113793
+vt 0.552778 0.113793
+vt 0.553382 0.109735
+vt 0.560902 0.109735
+vt 0.545306 0.113793
+vt 0.545830 0.109735
+vt 0.568387 0.109735
+vt 0.567629 0.113793
+vt 0.566868 0.118113
+vt 0.559534 0.118113
+vt 0.566227 0.122540
+vt 0.558957 0.122540
+vt 0.552171 0.118113
+vt 0.544781 0.118113
+vt 0.551660 0.122540
+vt 0.544338 0.122540
+vt 0.560277 0.181696
+vt 0.567692 0.181696
+vt 0.568639 0.188655
+vt 0.561129 0.188655
+vt 0.569646 0.195979
+vt 0.562037 0.195979
+vt 0.553583 0.188655
+vt 0.552828 0.181696
+vt 0.546004 0.188655
+vt 0.545350 0.181696
+vt 0.554387 0.195979
+vt 0.546700 0.195979
+vt 0.552171 0.175468
+vt 0.559534 0.175468
+vt 0.551660 0.170336
+vt 0.558957 0.170336
+vt 0.544780 0.175468
+vt 0.544338 0.170336
+vt 0.566868 0.175468
+vt 0.566227 0.170336
+vt 0.530290 0.113793
+vt 0.522753 0.113793
+vt 0.523020 0.109735
+vt 0.530644 0.109735
+vt 0.515203 0.113793
+vt 0.515382 0.109735
+vt 0.538249 0.109735
+vt 0.537809 0.113793
+vt 0.537367 0.118113
+vt 0.529933 0.118113
+vt 0.536995 0.122540
+vt 0.529634 0.122540
+vt 0.522484 0.118113
+vt 0.515023 0.118113
+vt 0.522258 0.122540
+vt 0.514871 0.122540
+vt 0.530319 0.181696
+vt 0.537845 0.181696
+vt 0.538395 0.188655
+vt 0.530762 0.188655
+vt 0.538980 0.195979
+vt 0.531233 0.195979
+vt 0.523109 0.188655
+vt 0.522775 0.181696
+vt 0.515441 0.188655
+vt 0.515218 0.181696
+vt 0.523465 0.195979
+vt 0.515679 0.195979
+vt 0.522484 0.175468
+vt 0.529933 0.175468
+vt 0.522258 0.170336
+vt 0.529634 0.170336
+vt 0.515023 0.175468
+vt 0.514871 0.170336
+vt 0.537367 0.175468
+vt 0.536995 0.170336
+vt 0.500080 0.113793
+vt 0.492516 0.113793
+vt 0.492427 0.109735
+vt 0.500080 0.109735
+vt 0.507733 0.109735
+vt 0.507644 0.113793
+vt 0.507553 0.118113
+vt 0.500080 0.118113
+vt 0.507478 0.122540
+vt 0.500080 0.122540
+vt 0.492606 0.118113
+vt 0.492682 0.122540
+vt 0.500080 0.181696
+vt 0.507651 0.181696
+vt 0.507763 0.188655
+vt 0.500080 0.188655
+vt 0.507882 0.195979
+vt 0.500080 0.195979
+vt 0.492397 0.188655
+vt 0.492509 0.181696
+vt 0.492278 0.195979
+vt 0.492606 0.175468
+vt 0.500080 0.175468
+vt 0.492682 0.170336
+vt 0.500080 0.170336
+vt 0.507553 0.175468
+vt 0.507478 0.170336
+vt 0.500080 0.164055
+vt 0.507406 0.164055
+vt 0.507431 0.166665
+vt 0.500080 0.166665
+vt 0.514728 0.164055
+vt 0.514778 0.166665
+vt 0.492729 0.166665
+vt 0.492754 0.164055
+vt 0.492764 0.162104
+vt 0.500080 0.162104
+vt 0.492766 0.160411
+vt 0.500080 0.160411
+vt 0.507396 0.162104
+vt 0.514708 0.162104
+vt 0.507394 0.160411
+vt 0.514704 0.160411
+vt 0.529350 0.164055
+vt 0.536643 0.164055
+vt 0.536765 0.166665
+vt 0.529448 0.166665
+vt 0.543919 0.164055
+vt 0.544064 0.166665
+vt 0.522118 0.166665
+vt 0.522044 0.164055
+vt 0.522014 0.162104
+vt 0.529310 0.162104
+vt 0.522008 0.160411
+vt 0.529302 0.160411
+vt 0.536593 0.162104
+vt 0.543860 0.162104
+vt 0.536583 0.160411
+vt 0.543848 0.160411
+vt 0.558411 0.164055
+vt 0.565620 0.164055
+vt 0.565831 0.166665
+vt 0.558600 0.166665
+vt 0.572803 0.164055
+vt 0.573033 0.166665
+vt 0.551344 0.166665
+vt 0.551176 0.164055
+vt 0.551108 0.162104
+vt 0.558334 0.162104
+vt 0.551094 0.160411
+vt 0.558318 0.160411
+vt 0.565536 0.162104
+vt 0.572710 0.162104
+vt 0.565518 0.160411
+vt 0.572690 0.160411
+vt 0.587074 0.164055
+vt 0.594160 0.164055
+vt 0.594444 0.166665
+vt 0.587342 0.166665
+vt 0.601209 0.164055
+vt 0.601509 0.166665
+vt 0.580204 0.166665
+vt 0.579955 0.164055
+vt 0.579854 0.162104
+vt 0.586967 0.162104
+vt 0.579833 0.160411
+vt 0.586943 0.160411
+vt 0.594045 0.162104
+vt 0.601088 0.162104
+vt 0.594020 0.160411
+vt 0.601061 0.160411
+vt 0.615190 0.164055
+vt 0.622120 0.164055
+vt 0.622461 0.166665
+vt 0.615519 0.166665
+vt 0.629008 0.164055
+vt 0.629360 0.166665
+vt 0.608534 0.166665
+vt 0.608219 0.164055
+vt 0.608092 0.162104
+vt 0.615058 0.162104
+vt 0.608065 0.160411
+vt 0.615029 0.160411
+vt 0.621982 0.162104
+vt 0.628866 0.162104
+vt 0.621953 0.160411
+vt 0.628835 0.160411
+vt 0.642652 0.164055
+vt 0.649408 0.164055
+vt 0.649787 0.166665
+vt 0.643023 0.166665
+vt 0.656119 0.164055
+vt 0.656504 0.166665
+vt 0.636214 0.166665
+vt 0.635852 0.164055
+vt 0.635706 0.162104
+vt 0.642503 0.162104
+vt 0.635674 0.160411
+vt 0.642470 0.160411
+vt 0.649255 0.162104
+vt 0.655963 0.162104
+vt 0.649222 0.160411
+vt 0.655929 0.160411
+vt 0.669403 0.164055
+vt 0.675977 0.164055
+vt 0.676376 0.166665
+vt 0.669798 0.166665
+vt 0.682505 0.164055
+vt 0.682906 0.166665
+vt 0.663175 0.166665
+vt 0.662784 0.164055
+vt 0.662626 0.162104
+vt 0.669243 0.162104
+vt 0.662591 0.160411
+vt 0.669208 0.160411
+vt 0.675816 0.162104
+vt 0.682343 0.162104
+vt 0.675780 0.160411
+vt 0.682307 0.160411
+vt 0.695426 0.164055
+vt 0.701819 0.164055
+vt 0.702222 0.166665
+vt 0.695829 0.166665
+vt 0.708168 0.164055
+vt 0.708570 0.166665
+vt 0.689391 0.166665
+vt 0.688988 0.164055
+vt 0.688825 0.162104
+vt 0.695262 0.162104
+vt 0.688789 0.160411
+vt 0.695226 0.160411
+vt 0.701655 0.162104
+vt 0.708005 0.162104
+vt 0.701619 0.160411
+vt 0.707969 0.160411
+vt 0.720736 0.164055
+vt 0.726957 0.164055
+vt 0.727351 0.166665
+vt 0.721133 0.166665
+vt 0.733137 0.164055
+vt 0.733527 0.166665
+vt 0.714873 0.166665
+vt 0.714473 0.164055
+vt 0.714311 0.162104
+vt 0.720575 0.162104
+vt 0.714275 0.160411
+vt 0.720539 0.160411
+vt 0.726797 0.162104
+vt 0.732979 0.162104
+vt 0.726762 0.160411
+vt 0.732943 0.160411
+vt 0.745376 0.164055
+vt 0.751438 0.164055
+vt 0.751812 0.166665
+vt 0.745756 0.166665
+vt 0.757462 0.164055
+vt 0.757830 0.166665
+vt 0.739661 0.166665
+vt 0.739276 0.164055
+vt 0.739120 0.162104
+vt 0.745222 0.162104
+vt 0.739085 0.160411
+vt 0.745187 0.160411
+vt 0.751286 0.162104
+vt 0.757313 0.162104
+vt 0.751252 0.160411
+vt 0.757279 0.160411
+vt 0.769402 0.164055
+vt 0.775321 0.164055
+vt 0.775666 0.166665
+vt 0.769756 0.166665
+vt 0.781206 0.164055
+vt 0.781543 0.166665
+vt 0.763811 0.166665
+vt 0.763450 0.164055
+vt 0.763303 0.162104
+vt 0.769259 0.162104
+vt 0.763270 0.160411
+vt 0.769226 0.160411
+vt 0.775180 0.162104
+vt 0.781069 0.162104
+vt 0.775148 0.160411
+vt 0.781037 0.160411
+vt 0.792881 0.164055
+vt 0.798674 0.164055
+vt 0.798985 0.166665
+vt 0.793201 0.166665
+vt 0.804437 0.164055
+vt 0.804739 0.166665
+vt 0.787388 0.166665
+vt 0.787059 0.164055
+vt 0.786925 0.162104
+vt 0.792751 0.162104
+vt 0.786895 0.160411
+vt 0.792721 0.160411
+vt 0.798547 0.162104
+vt 0.804314 0.162104
+vt 0.798518 0.160411
+vt 0.804287 0.160411
+vt 0.815831 0.164055
+vt 0.821358 0.164055
+vt 0.821639 0.166665
+vt 0.816115 0.166665
+vt 0.826703 0.164055
+vt 0.826988 0.166665
+vt 0.810465 0.166665
+vt 0.810174 0.164055
+vt 0.810055 0.162104
+vt 0.815715 0.162104
+vt 0.810028 0.160411
+vt 0.815689 0.160411
+vt 0.821243 0.162104
+vt 0.826587 0.162104
+vt 0.821217 0.160411
+vt 0.826561 0.160411
+vt 0.846294 0.164055
+vt 0.846707 0.164055
+vt 0.847076 0.166665
+vt 0.846660 0.166665
+vt 0.845661 0.166665
+vt 0.845300 0.164055
+vt 0.843787 0.166665
+vt 0.843437 0.164055
+vt 0.845153 0.162104
+vt 0.846144 0.162104
+vt 0.845119 0.160411
+vt 0.846110 0.160411
+vt 0.843294 0.162104
+vt 0.843261 0.160411
+vt 0.846557 0.162104
+vt 0.846523 0.160411
+vt 0.846646 0.160411
+vt 0.846680 0.162104
+vt 0.959891 0.199504
+vt 0.959891 0.203630
+vt 0.956887 0.206541
+vt 0.956887 0.202218
+vt 0.959891 0.208021
+vt 0.956887 0.211141
+vt 0.956887 0.198449
+vt 0.959891 0.195906
+vt 0.956887 0.195512
+vt 0.959891 0.193102
+vt 0.961268 0.194271
+vt 0.961268 0.197794
+vt 0.961830 0.193091
+vt 0.961830 0.196586
+vt 0.961268 0.191525
+vt 0.961830 0.190366
+vt 0.961268 0.201834
+vt 0.961268 0.206134
+vt 0.961830 0.200596
+vt 0.961830 0.204862
+vt 0.846294 0.131191
+vt 0.845300 0.131191
+vt 0.845661 0.126919
+vt 0.846660 0.126919
+vt 0.843437 0.131191
+vt 0.843787 0.126919
+vt 0.847075 0.126919
+vt 0.846707 0.131191
+vt 0.847200 0.126919
+vt 0.846831 0.131191
+vt 0.846557 0.135297
+vt 0.846144 0.135297
+vt 0.846680 0.135297
+vt 0.845153 0.135297
+vt 0.843294 0.135297
+vt 0.815831 0.131191
+vt 0.810174 0.131191
+vt 0.810465 0.126919
+vt 0.816115 0.126919
+vt 0.804437 0.131191
+vt 0.804739 0.126919
+vt 0.821639 0.126919
+vt 0.821358 0.131191
+vt 0.826987 0.126919
+vt 0.826703 0.131191
+vt 0.821243 0.135297
+vt 0.815715 0.135297
+vt 0.826587 0.135297
+vt 0.810055 0.135297
+vt 0.804314 0.135297
+vt 0.792881 0.131191
+vt 0.787059 0.131191
+vt 0.787388 0.126919
+vt 0.793201 0.126919
+vt 0.781206 0.131191
+vt 0.781543 0.126919
+vt 0.798985 0.126919
+vt 0.798674 0.131191
+vt 0.798547 0.135297
+vt 0.792751 0.135297
+vt 0.786925 0.135297
+vt 0.781069 0.135297
+vt 0.769402 0.131191
+vt 0.763450 0.131191
+vt 0.763811 0.126919
+vt 0.769756 0.126919
+vt 0.757462 0.131191
+vt 0.757830 0.126919
+vt 0.775666 0.126919
+vt 0.775321 0.131191
+vt 0.775180 0.135297
+vt 0.769259 0.135297
+vt 0.763303 0.135297
+vt 0.757313 0.135297
+vt 0.745376 0.131191
+vt 0.739276 0.131191
+vt 0.739661 0.126919
+vt 0.745756 0.126919
+vt 0.733137 0.131191
+vt 0.733527 0.126919
+vt 0.751812 0.126919
+vt 0.751438 0.131191
+vt 0.751286 0.135297
+vt 0.745222 0.135297
+vt 0.739120 0.135297
+vt 0.732979 0.135297
+vt 0.720736 0.131191
+vt 0.714473 0.131191
+vt 0.714873 0.126919
+vt 0.721133 0.126919
+vt 0.708168 0.131191
+vt 0.708570 0.126919
+vt 0.727351 0.126919
+vt 0.726957 0.131191
+vt 0.726797 0.135297
+vt 0.720575 0.135297
+vt 0.714311 0.135297
+vt 0.708005 0.135297
+vt 0.695426 0.131191
+vt 0.688988 0.131191
+vt 0.689391 0.126919
+vt 0.695829 0.126919
+vt 0.682505 0.131191
+vt 0.682906 0.126919
+vt 0.702222 0.126919
+vt 0.701819 0.131191
+vt 0.701655 0.135297
+vt 0.695262 0.135297
+vt 0.688825 0.135297
+vt 0.682343 0.135297
+vt 0.669403 0.131191
+vt 0.662784 0.131191
+vt 0.663175 0.126919
+vt 0.669798 0.126919
+vt 0.656119 0.131191
+vt 0.656504 0.126919
+vt 0.676376 0.126919
+vt 0.675977 0.131191
+vt 0.675816 0.135297
+vt 0.669243 0.135297
+vt 0.662626 0.135297
+vt 0.655963 0.135297
+vt 0.642652 0.131191
+vt 0.635852 0.131191
+vt 0.636214 0.126919
+vt 0.643023 0.126919
+vt 0.629008 0.131191
+vt 0.629360 0.126919
+vt 0.649787 0.126919
+vt 0.649408 0.131191
+vt 0.649255 0.135297
+vt 0.642503 0.135297
+vt 0.635706 0.135297
+vt 0.628866 0.135297
+vt 0.615190 0.131191
+vt 0.608219 0.131191
+vt 0.608534 0.126919
+vt 0.615519 0.126919
+vt 0.601209 0.131191
+vt 0.601509 0.126919
+vt 0.622461 0.126919
+vt 0.622120 0.131191
+vt 0.621982 0.135297
+vt 0.615057 0.135297
+vt 0.608092 0.135297
+vt 0.601088 0.135297
+vt 0.587074 0.131191
+vt 0.579955 0.131191
+vt 0.580204 0.126919
+vt 0.587342 0.126919
+vt 0.572803 0.131191
+vt 0.573033 0.126919
+vt 0.594444 0.126919
+vt 0.594160 0.131191
+vt 0.594045 0.135297
+vt 0.586967 0.135297
+vt 0.579854 0.135297
+vt 0.572710 0.135297
+vt 0.558411 0.131191
+vt 0.551176 0.131191
+vt 0.551344 0.126919
+vt 0.558600 0.126919
+vt 0.543919 0.131191
+vt 0.544064 0.126919
+vt 0.565831 0.126919
+vt 0.565620 0.131191
+vt 0.565536 0.135297
+vt 0.558334 0.135297
+vt 0.551108 0.135297
+vt 0.543860 0.135297
+vt 0.529350 0.131191
+vt 0.522044 0.131191
+vt 0.522118 0.126919
+vt 0.529448 0.126919
+vt 0.514728 0.131191
+vt 0.514778 0.126919
+vt 0.536765 0.126919
+vt 0.536643 0.131191
+vt 0.536593 0.135297
+vt 0.529310 0.135297
+vt 0.522014 0.135297
+vt 0.514708 0.135297
+vt 0.500080 0.131191
+vt 0.492754 0.131191
+vt 0.492729 0.126919
+vt 0.500080 0.126919
+vt 0.507431 0.126919
+vt 0.507406 0.131191
+vt 0.507396 0.135297
+vt 0.500080 0.135297
+vt 0.492764 0.135297
+vt 0.849182 0.282612
+vt 0.844472 0.282612
+vt 0.844472 0.278512
+vt 0.849182 0.278512
+vt 0.844472 0.275262
+vt 0.849182 0.275263
+vt 0.853306 0.278514
+vt 0.853306 0.282613
+vt 0.853306 0.275265
+vt 0.853306 0.287280
+vt 0.849182 0.287279
+vt 0.853306 0.292230
+vt 0.849182 0.292230
+vt 0.844472 0.287279
+vt 0.844472 0.292230
+vt 0.849174 0.271911
+vt 0.844463 0.271909
+vt 0.844436 0.271290
+vt 0.849149 0.271292
+vt 0.844382 0.271032
+vt 0.849100 0.271034
+vt 0.853279 0.271296
+vt 0.853300 0.271915
+vt 0.853239 0.271039
+vt 0.853306 0.273152
+vt 0.849182 0.273149
+vt 0.844472 0.273148
+vt 0.848920 0.270545
+vt 0.844185 0.270543
+vt 0.844078 0.269748
+vt 0.848822 0.269749
+vt 0.843988 0.268208
+vt 0.848740 0.268210
+vt 0.853011 0.269755
+vt 0.853092 0.270551
+vt 0.852944 0.268215
+vt 0.853172 0.270884
+vt 0.849018 0.270879
+vt 0.844293 0.270877
+vt 0.848666 0.262208
+vt 0.848658 0.258060
+vt 0.852877 0.258062
+vt 0.852884 0.262212
+vt 0.848658 0.253355
+vt 0.852877 0.253355
+vt 0.852904 0.265649
+vt 0.848691 0.265644
+vt 0.843935 0.265642
+vt 0.843908 0.262207
+vt 0.843899 0.258059
+vt 0.843899 0.253354
+vt 0.848658 0.243162
+vt 0.848658 0.238508
+vt 0.852877 0.238502
+vt 0.852877 0.243157
+vt 0.848658 0.234705
+vt 0.852877 0.234699
+vt 0.852877 0.248248
+vt 0.848658 0.248250
+vt 0.843899 0.248251
+vt 0.843899 0.243164
+vt 0.843899 0.238510
+vt 0.843899 0.234706
+vt 0.843131 0.315135
+vt 0.837612 0.315136
+vt 0.837546 0.314473
+vt 0.843148 0.314448
+vt 0.837492 0.313872
+vt 0.843160 0.313837
+vt 0.849325 0.314376
+vt 0.849065 0.315130
+vt 0.855744 0.314314
+vt 0.855325 0.315120
+vt 0.849528 0.313731
+vt 0.857964 0.313405
+vt 0.849462 0.315877
+vt 0.843277 0.315815
+vt 0.849774 0.316504
+vt 0.843395 0.316407
+vt 0.855891 0.315920
+vt 0.858265 0.316808
+vt 0.837677 0.315794
+vt 0.837731 0.316375
+vt 0.839532 0.181719
+vt 0.838314 0.175468
+vt 0.842378 0.175468
+vt 0.843669 0.181786
+vt 0.837365 0.170336
+vt 0.841371 0.170336
+vt 0.845147 0.189012
+vt 0.840930 0.188744
+vt 0.846720 0.196694
+vt 0.842418 0.196157
+vt 0.836033 0.188655
+vt 0.834712 0.181696
+vt 0.837438 0.195979
+vt 0.833562 0.175468
+vt 0.832667 0.170336
+vt 0.836463 0.164055
+vt 0.836335 0.162104
+vt 0.840278 0.162104
+vt 0.840414 0.164055
+vt 0.836305 0.160411
+vt 0.840247 0.160411
+vt 0.840748 0.166665
+vt 0.836778 0.166665
+vt 0.832112 0.166665
+vt 0.831815 0.164055
+vt 0.831694 0.162104
+vt 0.831667 0.160411
+vt 0.836279 0.146091
+vt 0.836276 0.149124
+vt 0.831639 0.149124
+vt 0.831642 0.146091
+vt 0.836276 0.151874
+vt 0.831639 0.151874
+vt 0.831650 0.142776
+vt 0.836288 0.142776
+vt 0.831667 0.139178
+vt 0.836305 0.139178
+vt 0.840228 0.142776
+vt 0.840219 0.146091
+vt 0.840247 0.139178
+vt 0.840216 0.149124
+vt 0.840216 0.151874
+vt 0.836463 0.131191
+vt 0.831815 0.131191
+vt 0.832112 0.126919
+vt 0.836778 0.126919
+vt 0.832667 0.122540
+vt 0.837365 0.122540
+vt 0.840748 0.126919
+vt 0.840414 0.131191
+vt 0.841371 0.122540
+vt 0.840278 0.135297
+vt 0.836335 0.135297
+vt 0.831694 0.135297
+vt 0.839440 0.113793
+vt 0.834624 0.113793
+vt 0.835681 0.109735
+vt 0.840560 0.109735
+vt 0.836560 0.106093
+vt 0.841491 0.106093
+vt 0.844760 0.109735
+vt 0.843572 0.113793
+vt 0.845747 0.106093
+vt 0.842378 0.118113
+vt 0.838314 0.118113
+vt 0.833562 0.118113
+vt 0.842249 0.100226
+vt 0.837268 0.100226
+vt 0.837108 0.097403
+vt 0.842104 0.097401
+vt 0.836612 0.094254
+vt 0.841629 0.094249
+vt 0.846429 0.097395
+vt 0.846560 0.100224
+vt 0.845970 0.094235
+vt 0.846340 0.103023
+vt 0.842049 0.103023
+vt 0.837087 0.103023
+vt 0.839881 0.086489
+vt 0.834793 0.086503
+vt 0.833794 0.082742
+vt 0.838922 0.082723
+vt 0.832952 0.079617
+vt 0.838114 0.079596
+vt 0.843362 0.082666
+vt 0.844286 0.086445
+vt 0.842583 0.079534
+vt 0.845206 0.090443
+vt 0.840836 0.090471
+vt 0.835786 0.090481
+vt 0.837344 0.076255
+vt 0.832151 0.076270
+vt 0.832037 0.075511
+vt 0.837235 0.075501
+vt 0.832010 0.075005
+vt 0.837209 0.075000
+vt 0.841735 0.075473
+vt 0.841841 0.076211
+vt 0.841711 0.074986
+vt 0.842100 0.077473
+vt 0.837613 0.077530
+vt 0.832430 0.077549
+vt 0.837186 0.073764
+vt 0.831986 0.073765
+vt 0.831984 0.072664
+vt 0.837184 0.072664
+vt 0.831984 0.071000
+vt 0.837184 0.071000
+vt 0.841686 0.072664
+vt 0.841689 0.073763
+vt 0.841686 0.071000
+vt 0.841696 0.074476
+vt 0.837194 0.074482
+vt 0.831994 0.074484
+vt 0.837187 0.065777
+vt 0.831987 0.065777
+vt 0.831996 0.062915
+vt 0.837195 0.062915
+vt 0.832014 0.060348
+vt 0.837213 0.060348
+vt 0.841697 0.062915
+vt 0.841689 0.065777
+vt 0.841714 0.060348
+vt 0.841686 0.068588
+vt 0.837184 0.068588
+vt 0.831984 0.068588
+vt 0.904074 0.220965
+vt 0.904074 0.220193
+vt 0.907765 0.218705
+vt 0.907765 0.219460
+vt 0.913292 0.216022
+vt 0.913291 0.216744
+vt 0.904074 0.219916
+vt 0.907765 0.218436
+vt 0.913292 0.215764
+vt 0.907765 0.221186
+vt 0.904074 0.222725
+vt 0.913291 0.218393
+vt 0.900830 0.223617
+vt 0.900830 0.221859
+vt 0.896644 0.224469
+vt 0.896644 0.222741
+vt 0.900830 0.221081
+vt 0.900830 0.220793
+vt 0.896644 0.221962
+vt 0.896644 0.221657
+vt 0.932398 0.206713
+vt 0.942737 0.201068
+vt 0.942737 0.202278
+vt 0.932398 0.208079
+vt 0.951440 0.196114
+vt 0.951440 0.197193
+vt 0.922042 0.213738
+vt 0.922042 0.212217
+vt 0.922042 0.211550
+vt 0.932398 0.206113
+vt 0.922042 0.211310
+vt 0.932398 0.205894
+vt 0.942737 0.200534
+vt 0.951440 0.195636
+vt 0.942737 0.200337
+vt 0.951440 0.195458
+vt 0.959891 0.190402
+vt 0.961268 0.188882
+vt 0.961268 0.189815
+vt 0.959891 0.191355
+vt 0.961830 0.187743
+vt 0.961830 0.188669
+vt 0.956887 0.193683
+vt 0.956887 0.192686
+vt 0.956887 0.192243
+vt 0.959891 0.189978
+vt 0.846079 0.156566
+vt 0.846090 0.158577
+vt 0.845099 0.158577
+vt 0.845089 0.156566
+vt 0.843242 0.158577
+vt 0.843232 0.156566
+vt 0.845086 0.154343
+vt 0.846076 0.154343
+vt 0.843229 0.154343
+vt 0.846488 0.154343
+vt 0.846492 0.156566
+vt 0.846611 0.154343
+vt 0.846615 0.156566
+vt 0.846502 0.158577
+vt 0.846625 0.158577
+vt 0.836279 0.156566
+vt 0.836288 0.158577
+vt 0.831650 0.158577
+vt 0.831642 0.156566
+vt 0.826545 0.158577
+vt 0.826537 0.156566
+vt 0.831639 0.154343
+vt 0.836276 0.154343
+vt 0.826534 0.154343
+vt 0.840216 0.154343
+vt 0.840219 0.156566
+vt 0.840228 0.158577
+vt 0.815665 0.156566
+vt 0.815673 0.158577
+vt 0.810011 0.158577
+vt 0.810003 0.156566
+vt 0.804270 0.158577
+vt 0.804261 0.156566
+vt 0.810001 0.154343
+vt 0.815662 0.154343
+vt 0.804259 0.154343
+vt 0.821191 0.154343
+vt 0.821194 0.156566
+vt 0.821202 0.158577
+vt 0.792695 0.156566
+vt 0.792704 0.158577
+vt 0.786876 0.158577
+vt 0.786867 0.156566
+vt 0.781019 0.158577
+vt 0.781009 0.156566
+vt 0.786864 0.154343
+vt 0.792692 0.154343
+vt 0.781006 0.154343
+vt 0.798489 0.154343
+vt 0.798492 0.156566
+vt 0.798501 0.158577
+vt 0.769197 0.156566
+vt 0.769207 0.158577
+vt 0.763250 0.158577
+vt 0.763240 0.156566
+vt 0.757259 0.158577
+vt 0.757249 0.156566
+vt 0.763237 0.154343
+vt 0.769194 0.154343
+vt 0.757245 0.154343
+vt 0.775116 0.154343
+vt 0.775120 0.156566
+vt 0.775129 0.158577
+vt 0.745156 0.156566
+vt 0.745166 0.158577
+vt 0.739064 0.158577
+vt 0.739053 0.156566
+vt 0.732922 0.158577
+vt 0.732911 0.156566
+vt 0.739050 0.154343
+vt 0.745153 0.154343
+vt 0.732908 0.154343
+vt 0.751217 0.154343
+vt 0.751221 0.156566
+vt 0.751231 0.158577
+vt 0.720507 0.156566
+vt 0.720518 0.158577
+vt 0.714253 0.158577
+vt 0.714243 0.156566
+vt 0.707947 0.158577
+vt 0.707936 0.156566
+vt 0.714239 0.154343
+vt 0.720503 0.154343
+vt 0.707932 0.154343
+vt 0.726726 0.154343
+vt 0.726729 0.156566
+vt 0.726740 0.158577
+vt 0.695194 0.156566
+vt 0.695204 0.158577
+vt 0.688767 0.158577
+vt 0.688756 0.156566
+vt 0.682285 0.158577
+vt 0.682275 0.156566
+vt 0.688753 0.154343
+vt 0.695190 0.154343
+vt 0.682271 0.154343
+vt 0.701583 0.154343
+vt 0.701587 0.156566
+vt 0.701597 0.158577
+vt 0.669177 0.156566
+vt 0.669187 0.158577
+vt 0.662570 0.158577
+vt 0.662560 0.156566
+vt 0.655909 0.158577
+vt 0.655898 0.156566
+vt 0.662556 0.154343
+vt 0.669173 0.154343
+vt 0.655895 0.154343
+vt 0.675745 0.154343
+vt 0.675748 0.156566
+vt 0.675759 0.158577
+vt 0.642441 0.156566
+vt 0.642450 0.158577
+vt 0.635655 0.158577
+vt 0.635645 0.156566
+vt 0.628816 0.158577
+vt 0.628807 0.156566
+vt 0.635642 0.154343
+vt 0.642437 0.154343
+vt 0.628804 0.154343
+vt 0.649188 0.154343
+vt 0.649192 0.156566
+vt 0.649202 0.158577
+vt 0.615003 0.156566
+vt 0.615012 0.158577
+vt 0.608048 0.158577
+vt 0.608040 0.156566
+vt 0.601046 0.158577
+vt 0.601038 0.156566
+vt 0.608037 0.154343
+vt 0.615000 0.154343
+vt 0.601035 0.154343
+vt 0.621923 0.154343
+vt 0.621926 0.156566
+vt 0.621935 0.158577
+vt 0.586923 0.156566
+vt 0.586930 0.158577
+vt 0.579820 0.158577
+vt 0.579813 0.156566
+vt 0.572678 0.158577
+vt 0.572672 0.156566
+vt 0.579811 0.154343
+vt 0.586920 0.154343
+vt 0.572670 0.154343
+vt 0.593996 0.154343
+vt 0.593998 0.156566
+vt 0.594006 0.158577
+vt 0.558303 0.156566
+vt 0.558308 0.158577
+vt 0.551085 0.158577
+vt 0.551081 0.156566
+vt 0.543841 0.158577
+vt 0.543837 0.156566
+vt 0.551080 0.154343
+vt 0.558302 0.154343
+vt 0.543836 0.154343
+vt 0.565499 0.154343
+vt 0.565501 0.156566
+vt 0.565507 0.158577
+vt 0.529294 0.156566
+vt 0.529297 0.158577
+vt 0.522004 0.158577
+vt 0.522002 0.156566
+vt 0.514701 0.158577
+vt 0.514700 0.156566
+vt 0.522001 0.154343
+vt 0.529293 0.154343
+vt 0.514700 0.154343
+vt 0.536572 0.154343
+vt 0.536573 0.156566
+vt 0.536577 0.158577
+vt 0.500080 0.156566
+vt 0.500080 0.158577
+vt 0.492768 0.158577
+vt 0.492768 0.156566
+vt 0.492768 0.154343
+vt 0.500080 0.154343
+vt 0.507391 0.154343
+vt 0.507392 0.156566
+vt 0.507392 0.158577
+vt 0.500080 0.230285
+vt 0.500080 0.228439
+vt 0.508660 0.228439
+vt 0.508697 0.230285
+vt 0.517230 0.228439
+vt 0.517303 0.230285
+vt 0.500080 0.226019
+vt 0.508586 0.226019
+vt 0.517082 0.226019
+vt 0.508710 0.232169
+vt 0.500080 0.232169
+vt 0.517328 0.232169
+vt 0.491450 0.232169
+vt 0.491463 0.230285
+vt 0.491500 0.228439
+vt 0.491574 0.226019
+vt 0.534439 0.230285
+vt 0.534293 0.228439
+vt 0.542768 0.228439
+vt 0.542948 0.230285
+vt 0.551192 0.228439
+vt 0.551405 0.230285
+vt 0.534003 0.226019
+vt 0.542408 0.226019
+vt 0.550765 0.226019
+vt 0.543008 0.232169
+vt 0.534487 0.232169
+vt 0.551476 0.232169
+vt 0.525924 0.232169
+vt 0.525887 0.230285
+vt 0.525777 0.228439
+vt 0.525558 0.226019
+vt 0.568126 0.230285
+vt 0.567850 0.228439
+vt 0.576071 0.228439
+vt 0.576376 0.230285
+vt 0.584210 0.228439
+vt 0.584542 0.230285
+vt 0.567298 0.226019
+vt 0.575461 0.226019
+vt 0.583545 0.226019
+vt 0.576477 0.232169
+vt 0.568218 0.232169
+vt 0.584653 0.232169
+vt 0.559882 0.232169
+vt 0.559800 0.230285
+vt 0.559555 0.228439
+vt 0.559064 0.226019
+vt 0.600601 0.230285
+vt 0.600220 0.228439
+vt 0.608084 0.228439
+vt 0.608486 0.230285
+vt 0.615849 0.228439
+vt 0.616271 0.230285
+vt 0.599457 0.226019
+vt 0.607278 0.226019
+vt 0.615004 0.226019
+vt 0.608621 0.232169
+vt 0.600728 0.232169
+vt 0.616412 0.232169
+vt 0.592738 0.232169
+vt 0.592618 0.230285
+vt 0.592261 0.228439
+vt 0.591545 0.226019
+vt 0.631528 0.230285
+vt 0.631072 0.228439
+vt 0.638529 0.228439
+vt 0.638998 0.230285
+vt 0.645882 0.228439
+vt 0.646363 0.230285
+vt 0.630160 0.226019
+vt 0.637590 0.226019
+vt 0.644919 0.226019
+vt 0.639155 0.232169
+vt 0.631679 0.232169
+vt 0.646524 0.232169
+vt 0.624098 0.232169
+vt 0.623952 0.230285
+vt 0.623512 0.228439
+vt 0.622632 0.226019
+vt 0.660777 0.230285
+vt 0.660277 0.228439
+vt 0.667322 0.228439
+vt 0.667828 0.230285
+vt 0.674267 0.228439
+vt 0.674778 0.230285
+vt 0.659277 0.226019
+vt 0.666309 0.226019
+vt 0.673243 0.226019
+vt 0.667997 0.232169
+vt 0.660944 0.232169
+vt 0.674949 0.232169
+vt 0.653786 0.232169
+vt 0.653623 0.230285
+vt 0.653131 0.228439
+vt 0.652148 0.226019
+vt 0.688380 0.230285
+vt 0.687863 0.228439
+vt 0.694520 0.228439
+vt 0.695038 0.230285
+vt 0.701085 0.228439
+vt 0.701603 0.230285
+vt 0.686828 0.226019
+vt 0.693483 0.226019
+vt 0.700050 0.226019
+vt 0.695211 0.232169
+vt 0.688553 0.232169
+vt 0.701776 0.232169
+vt 0.681800 0.232169
+vt 0.681628 0.230285
+vt 0.681113 0.228439
+vt 0.680082 0.226019
+vt 0.714468 0.230285
+vt 0.713954 0.228439
+vt 0.720263 0.228439
+vt 0.720773 0.230285
+vt 0.726492 0.228439
+vt 0.726997 0.230285
+vt 0.712927 0.226019
+vt 0.719244 0.226019
+vt 0.725482 0.226019
+vt 0.720943 0.232169
+vt 0.714639 0.232169
+vt 0.727166 0.232169
+vt 0.708251 0.232169
+vt 0.708079 0.230285
+vt 0.707563 0.228439
+vt 0.706530 0.226019
+vt 0.739216 0.230285
+vt 0.738723 0.228439
+vt 0.744730 0.228439
+vt 0.745216 0.230285
+vt 0.750669 0.228439
+vt 0.751147 0.230285
+vt 0.737736 0.226019
+vt 0.743758 0.226019
+vt 0.749712 0.226019
+vt 0.745378 0.232169
+vt 0.739380 0.232169
+vt 0.751306 0.232169
+vt 0.733310 0.232169
+vt 0.733144 0.230285
+vt 0.732644 0.228439
+vt 0.731645 0.226019
+vt 0.762814 0.230285
+vt 0.762353 0.228439
+vt 0.768104 0.228439
+vt 0.768555 0.230285
+vt 0.773797 0.228439
+vt 0.774239 0.230285
+vt 0.761431 0.226019
+vt 0.767201 0.226019
+vt 0.772914 0.226019
+vt 0.768706 0.232169
+vt 0.762968 0.232169
+vt 0.774386 0.232169
+vt 0.757169 0.232169
+vt 0.757012 0.230285
+vt 0.756542 0.228439
+vt 0.755602 0.226019
+vt 0.785444 0.230285
+vt 0.785023 0.228439
+vt 0.790560 0.228439
+vt 0.790970 0.230285
+vt 0.796050 0.228439
+vt 0.796448 0.230285
+vt 0.784182 0.226019
+vt 0.789741 0.226019
+vt 0.795253 0.226019
+vt 0.791106 0.232169
+vt 0.785584 0.232169
+vt 0.796580 0.232169
+vt 0.780011 0.232169
+vt 0.779868 0.230285
+vt 0.779436 0.228439
+vt 0.778574 0.226019
+vt 0.807270 0.230285
+vt 0.806896 0.228439
+vt 0.812256 0.228439
+vt 0.812619 0.230285
+vt 0.817579 0.228439
+vt 0.817929 0.230285
+vt 0.806146 0.226019
+vt 0.811531 0.226019
+vt 0.816878 0.226019
+vt 0.812740 0.232169
+vt 0.807395 0.232169
+vt 0.818045 0.232169
+vt 0.802009 0.232169
+vt 0.801881 0.230285
+vt 0.801494 0.228439
+vt 0.800721 0.226019
+vt 0.828432 0.230285
+vt 0.828107 0.228439
+vt 0.833300 0.228439
+vt 0.833613 0.230285
+vt 0.838439 0.228439
+vt 0.838739 0.230285
+vt 0.827457 0.226019
+vt 0.832676 0.226019
+vt 0.837840 0.226019
+vt 0.833717 0.232169
+vt 0.828540 0.232169
+vt 0.838838 0.232169
+vt 0.823314 0.232169
+vt 0.823202 0.230285
+vt 0.822864 0.228439
+vt 0.822189 0.226019
+vt 0.848566 0.230286
+vt 0.848289 0.228442
+vt 0.852513 0.228451
+vt 0.852786 0.230290
+vt 0.855945 0.228469
+vt 0.856223 0.230297
+vt 0.847736 0.226023
+vt 0.851967 0.226035
+vt 0.855389 0.226060
+vt 0.852877 0.232167
+vt 0.848658 0.232169
+vt 0.856316 0.232164
+vt 0.843899 0.232169
+vt 0.843803 0.230285
+vt 0.843517 0.228439
+vt 0.842943 0.226019
+vt 0.860859 0.230176
+vt 0.860558 0.228376
+vt 0.863453 0.227935
+vt 0.863723 0.229741
+vt 0.867848 0.227218
+vt 0.868055 0.228905
+vt 0.859857 0.226006
+vt 0.862515 0.225623
+vt 0.867382 0.224556
+vt 0.863814 0.231580
+vt 0.860959 0.232012
+vt 0.868124 0.230723
+vt 0.858735 0.232159
+vt 0.858636 0.230310
+vt 0.858341 0.228499
+vt 0.857750 0.226101
+vt 0.883925 0.282659
+vt 0.891065 0.282660
+vt 0.891080 0.287307
+vt 0.883948 0.287306
+vt 0.891080 0.292238
+vt 0.883948 0.292238
+vt 0.876774 0.287306
+vt 0.876745 0.282658
+vt 0.876774 0.292238
+vt 0.876655 0.278577
+vt 0.883856 0.278579
+vt 0.876477 0.275346
+vt 0.883718 0.275351
+vt 0.891020 0.278581
+vt 0.890931 0.275355
+vt 0.883177 0.271794
+vt 0.882801 0.270450
+vt 0.890425 0.270424
+vt 0.890604 0.271795
+vt 0.882499 0.268679
+vt 0.890276 0.268635
+vt 0.890782 0.273266
+vt 0.883487 0.273259
+vt 0.876179 0.273250
+vt 0.875689 0.271813
+vt 0.874934 0.270558
+vt 0.874351 0.268845
+vt 0.882428 0.262289
+vt 0.882434 0.257839
+vt 0.890128 0.257736
+vt 0.890143 0.262267
+vt 0.882434 0.252620
+vt 0.890128 0.252339
+vt 0.890187 0.265908
+vt 0.882412 0.265931
+vt 0.874380 0.266034
+vt 0.874631 0.262330
+vt 0.874715 0.257939
+vt 0.874715 0.252900
+vt 0.882434 0.240601
+vt 0.882434 0.234998
+vt 0.890128 0.233726
+vt 0.890128 0.239675
+vt 0.882434 0.230463
+vt 0.890128 0.228911
+vt 0.890128 0.246099
+vt 0.882434 0.246674
+vt 0.874715 0.247251
+vt 0.874715 0.241530
+vt 0.874715 0.236273
+vt 0.874715 0.232018
+vt 0.882424 0.225932
+vt 0.882397 0.225020
+vt 0.890128 0.223430
+vt 0.890128 0.224211
+vt 0.882359 0.224482
+vt 0.890128 0.223098
+vt 0.890128 0.225889
+vt 0.882434 0.227594
+vt 0.874715 0.229300
+vt 0.874678 0.227566
+vt 0.874566 0.226264
+vt 0.874418 0.225179
+vt 0.857019 0.218114
+vt 0.855530 0.217966
+vt 0.854186 0.212817
+vt 0.855603 0.213352
+vt 0.853260 0.217829
+vt 0.851877 0.212378
+vt 0.856322 0.213553
+vt 0.858065 0.218141
+vt 0.856693 0.213588
+vt 0.858890 0.218107
+vt 0.860424 0.222261
+vt 0.858557 0.222459
+vt 0.862329 0.221981
+vt 0.856766 0.222492
+vt 0.854462 0.222451
+vt 0.845612 0.217892
+vt 0.840746 0.217911
+vt 0.839314 0.212817
+vt 0.844224 0.212729
+vt 0.837785 0.207426
+vt 0.842741 0.207247
+vt 0.835545 0.217911
+vt 0.834048 0.212817
+vt 0.832451 0.207426
+vt 0.848484 0.212466
+vt 0.849869 0.217834
+vt 0.847003 0.206710
+vt 0.851058 0.222427
+vt 0.846813 0.222415
+vt 0.841988 0.222411
+vt 0.836842 0.222411
+vt 0.824965 0.217911
+vt 0.819600 0.217911
+vt 0.817912 0.212817
+vt 0.823340 0.212817
+vt 0.816111 0.207426
+vt 0.821607 0.207426
+vt 0.814193 0.217911
+vt 0.812443 0.212817
+vt 0.810575 0.207426
+vt 0.828721 0.212817
+vt 0.830282 0.217911
+vt 0.827056 0.207426
+vt 0.831635 0.222411
+vt 0.826373 0.222411
+vt 0.821063 0.222411
+vt 0.815711 0.222411
+vt 0.803274 0.217911
+vt 0.797758 0.217911
+vt 0.795825 0.212817
+vt 0.801401 0.212817
+vt 0.793763 0.207426
+vt 0.799403 0.207426
+vt 0.792200 0.217911
+vt 0.790209 0.212817
+vt 0.788086 0.207426
+vt 0.806940 0.212817
+vt 0.808752 0.217911
+vt 0.805006 0.207426
+vt 0.810323 0.222411
+vt 0.804898 0.222411
+vt 0.799433 0.222411
+vt 0.793926 0.222411
+vt 0.780957 0.217911
+vt 0.775267 0.217911
+vt 0.773110 0.212817
+vt 0.778854 0.212817
+vt 0.770810 0.207426
+vt 0.776611 0.207426
+vt 0.769528 0.217911
+vt 0.767320 0.212817
+vt 0.764964 0.207426
+vt 0.784553 0.212817
+vt 0.786601 0.217911
+vt 0.782369 0.207426
+vt 0.788376 0.222411
+vt 0.782780 0.222411
+vt 0.777136 0.222411
+vt 0.771442 0.222411
+vt 0.757897 0.217911
+vt 0.751999 0.217911
+vt 0.749650 0.212817
+vt 0.755592 0.212817
+vt 0.747144 0.207426
+vt 0.753133 0.207426
+vt 0.746045 0.217911
+vt 0.743654 0.212817
+vt 0.741103 0.207426
+vt 0.761481 0.212817
+vt 0.763739 0.217911
+vt 0.759073 0.207426
+vt 0.765695 0.222411
+vt 0.759894 0.222411
+vt 0.754036 0.222411
+vt 0.748118 0.222411
+vt 0.733956 0.217911
+vt 0.727816 0.217911
+vt 0.725319 0.212817
+vt 0.731490 0.212817
+vt 0.722655 0.207426
+vt 0.728860 0.207426
+vt 0.721611 0.217911
+vt 0.719086 0.212817
+vt 0.716392 0.207426
+vt 0.737601 0.212817
+vt 0.740031 0.217911
+vt 0.735009 0.207426
+vt 0.742137 0.222411
+vt 0.736093 0.222411
+vt 0.729981 0.222411
+vt 0.723799 0.222411
+vt 0.708991 0.217911
+vt 0.702573 0.217911
+vt 0.699993 0.212817
+vt 0.706424 0.212817
+vt 0.697240 0.207426
+vt 0.703686 0.207426
+vt 0.696080 0.217911
+vt 0.693492 0.212817
+vt 0.690730 0.207426
+vt 0.712788 0.212817
+vt 0.715336 0.217911
+vt 0.710069 0.207426
+vt 0.717545 0.222411
+vt 0.711216 0.222411
+vt 0.704810 0.222411
+vt 0.698324 0.222411
+vt 0.682861 0.217911
+vt 0.676132 0.217911
+vt 0.673556 0.212817
+vt 0.680274 0.212817
+vt 0.670808 0.207426
+vt 0.677515 0.207426
+vt 0.669321 0.217911
+vt 0.666762 0.212817
+vt 0.664034 0.207426
+vt 0.686919 0.212817
+vt 0.689510 0.217911
+vt 0.684156 0.207426
+vt 0.691756 0.222411
+vt 0.685104 0.222411
+vt 0.678365 0.222411
+vt 0.671538 0.222411
+vt 0.655445 0.217911
+vt 0.648380 0.217911
+vt 0.645922 0.212817
+vt 0.652946 0.212817
+vt 0.643301 0.207426
+vt 0.650280 0.207426
+vt 0.641229 0.217911
+vt 0.638822 0.212817
+vt 0.636254 0.207426
+vt 0.659892 0.212817
+vt 0.662425 0.217911
+vt 0.657191 0.207426
+vt 0.664620 0.222411
+vt 0.657611 0.222411
+vt 0.650510 0.222411
+vt 0.643315 0.222411
+vt 0.626667 0.217911
+vt 0.619258 0.217911
+vt 0.617058 0.212817
+vt 0.624388 0.212817
+vt 0.614712 0.207426
+vt 0.621958 0.207426
+vt 0.611766 0.217911
+vt 0.609654 0.212817
+vt 0.607402 0.207426
+vt 0.631643 0.212817
+vt 0.633991 0.217911
+vt 0.629139 0.207426
+vt 0.636025 0.222411
+vt 0.628642 0.222411
+vt 0.621165 0.222411
+vt 0.613596 0.222411
+vt 0.596535 0.217911
+vt 0.588803 0.217911
+vt 0.587015 0.212817
+vt 0.594629 0.212817
+vt 0.585107 0.207426
+vt 0.592597 0.207426
+vt 0.580998 0.217911
+vt 0.579337 0.212817
+vt 0.577564 0.207426
+vt 0.602177 0.212817
+vt 0.604190 0.217911
+vt 0.600029 0.207426
+vt 0.605936 0.222411
+vt 0.598187 0.222411
+vt 0.590353 0.222411
+vt 0.582438 0.222411
+vt 0.565182 0.217911
+vt 0.557182 0.217911
+vt 0.555955 0.212817
+vt 0.563801 0.212817
+vt 0.554646 0.207426
+vt 0.562329 0.207426
+vt 0.549129 0.217911
+vt 0.548062 0.212817
+vt 0.546924 0.207426
+vt 0.571597 0.212817
+vt 0.573122 0.217911
+vt 0.569970 0.207426
+vt 0.574444 0.222411
+vt 0.566378 0.222411
+vt 0.558246 0.222411
+vt 0.550054 0.222411
+vt 0.532888 0.217911
+vt 0.524715 0.217911
+vt 0.524166 0.212817
+vt 0.532161 0.212817
+vt 0.523580 0.207426
+vt 0.531386 0.207426
+vt 0.516518 0.217911
+vt 0.516149 0.212817
+vt 0.515756 0.207426
+vt 0.540129 0.212817
+vt 0.541029 0.217911
+vt 0.539169 0.207426
+vt 0.541808 0.222411
+vt 0.533518 0.222411
+vt 0.525191 0.222411
+vt 0.516837 0.222411
+vt 0.500080 0.217911
+vt 0.491857 0.217911
+vt 0.492042 0.212817
+vt 0.500080 0.212817
+vt 0.492239 0.207426
+vt 0.500080 0.207426
+vt 0.508118 0.212817
+vt 0.508303 0.217911
+vt 0.507921 0.207426
+vt 0.508463 0.222411
+vt 0.500080 0.222411
+vt 0.491697 0.222411
+vt 0.821215 0.311012
+vt 0.815704 0.311012
+vt 0.815704 0.310325
+vt 0.821215 0.310325
+vt 0.815704 0.309611
+vt 0.821215 0.309611
+vt 0.810154 0.311012
+vt 0.810154 0.310325
+vt 0.810154 0.309611
+vt 0.826679 0.310325
+vt 0.826679 0.311012
+vt 0.832089 0.310325
+vt 0.832089 0.311012
+vt 0.826679 0.309611
+vt 0.832089 0.309611
+vt 0.826679 0.311643
+vt 0.821215 0.311643
+vt 0.826679 0.312190
+vt 0.821215 0.312190
+vt 0.832089 0.311643
+vt 0.832089 0.312190
+vt 0.815704 0.311643
+vt 0.810154 0.311643
+vt 0.815704 0.312190
+vt 0.810154 0.312190
+vt 0.821607 0.316229
+vt 0.827056 0.316229
+vt 0.827056 0.315623
+vt 0.821607 0.315623
+vt 0.827056 0.314961
+vt 0.821607 0.314961
+vt 0.832451 0.316229
+vt 0.832451 0.315623
+vt 0.832451 0.314961
+vt 0.816111 0.315623
+vt 0.816111 0.316229
+vt 0.810575 0.315623
+vt 0.810575 0.316229
+vt 0.816111 0.314961
+vt 0.810575 0.314961
+vt 0.816111 0.316726
+vt 0.821607 0.316726
+vt 0.816111 0.317058
+vt 0.821607 0.317058
+vt 0.810575 0.316726
+vt 0.810575 0.317058
+vt 0.827056 0.316726
+vt 0.832451 0.316726
+vt 0.827056 0.317058
+vt 0.832451 0.317058
+vt 0.798954 0.311012
+vt 0.793302 0.311012
+vt 0.793301 0.310325
+vt 0.798954 0.310325
+vt 0.793302 0.309611
+vt 0.798954 0.309611
+vt 0.787611 0.311012
+vt 0.787611 0.310325
+vt 0.787611 0.309611
+vt 0.804572 0.310325
+vt 0.804572 0.311012
+vt 0.804572 0.309611
+vt 0.804572 0.311643
+vt 0.798954 0.311643
+vt 0.804572 0.312190
+vt 0.798954 0.312190
+vt 0.793302 0.311643
+vt 0.787611 0.311643
+vt 0.793301 0.312190
+vt 0.787611 0.312190
+vt 0.799403 0.316229
+vt 0.805006 0.316229
+vt 0.805006 0.315623
+vt 0.799403 0.315623
+vt 0.805006 0.314961
+vt 0.799403 0.314961
+vt 0.793763 0.315623
+vt 0.793763 0.316229
+vt 0.788086 0.315623
+vt 0.788086 0.316229
+vt 0.793763 0.314961
+vt 0.788086 0.314961
+vt 0.793763 0.316726
+vt 0.799403 0.316726
+vt 0.793763 0.317058
+vt 0.799403 0.317058
+vt 0.788086 0.316726
+vt 0.788086 0.317058
+vt 0.805006 0.316726
+vt 0.805006 0.317058
+vt 0.776112 0.311012
+vt 0.770299 0.311012
+vt 0.770299 0.310325
+vt 0.776112 0.310325
+vt 0.770299 0.309611
+vt 0.776112 0.309611
+vt 0.764443 0.311012
+vt 0.764443 0.310325
+vt 0.764443 0.309611
+vt 0.781882 0.310325
+vt 0.781882 0.311012
+vt 0.781882 0.309611
+vt 0.781882 0.311643
+vt 0.776112 0.311643
+vt 0.781882 0.312190
+vt 0.776112 0.312190
+vt 0.770299 0.311643
+vt 0.764443 0.311643
+vt 0.770299 0.312190
+vt 0.764443 0.312190
+vt 0.776611 0.316229
+vt 0.782369 0.316229
+vt 0.782369 0.315623
+vt 0.776611 0.315623
+vt 0.782369 0.314961
+vt 0.776611 0.314961
+vt 0.770810 0.315623
+vt 0.770810 0.316229
+vt 0.764964 0.315623
+vt 0.764964 0.316229
+vt 0.770810 0.314961
+vt 0.764964 0.314961
+vt 0.770810 0.316726
+vt 0.776611 0.316726
+vt 0.770810 0.317058
+vt 0.776611 0.317058
+vt 0.764964 0.316726
+vt 0.764964 0.317058
+vt 0.782369 0.316726
+vt 0.782369 0.317058
+vt 0.752592 0.311012
+vt 0.746593 0.311012
+vt 0.746593 0.310325
+vt 0.752592 0.310325
+vt 0.746593 0.309611
+vt 0.752592 0.309611
+vt 0.740544 0.311012
+vt 0.740544 0.310325
+vt 0.740545 0.309611
+vt 0.758541 0.310325
+vt 0.758541 0.311012
+vt 0.758541 0.309611
+vt 0.758541 0.311643
+vt 0.752592 0.311643
+vt 0.758541 0.312190
+vt 0.752592 0.312190
+vt 0.746593 0.311643
+vt 0.740545 0.311643
+vt 0.746593 0.312190
+vt 0.740544 0.312190
+vt 0.753133 0.316229
+vt 0.759073 0.316229
+vt 0.759073 0.315623
+vt 0.753133 0.315623
+vt 0.759073 0.314961
+vt 0.753133 0.314961
+vt 0.747144 0.315623
+vt 0.747144 0.316229
+vt 0.741103 0.315623
+vt 0.741103 0.316229
+vt 0.747144 0.314961
+vt 0.741103 0.314961
+vt 0.747144 0.316726
+vt 0.753133 0.316726
+vt 0.747144 0.317058
+vt 0.753133 0.317058
+vt 0.741103 0.316726
+vt 0.741103 0.317058
+vt 0.759073 0.316726
+vt 0.759073 0.317058
+vt 0.728288 0.311012
+vt 0.722078 0.311012
+vt 0.722078 0.310325
+vt 0.728288 0.310325
+vt 0.722078 0.309611
+vt 0.728288 0.309611
+vt 0.715810 0.311012
+vt 0.715811 0.310325
+vt 0.715810 0.309611
+vt 0.734443 0.310325
+vt 0.734443 0.311012
+vt 0.734443 0.309611
+vt 0.734443 0.311643
+vt 0.728288 0.311643
+vt 0.734443 0.312190
+vt 0.728288 0.312190
+vt 0.722078 0.311643
+vt 0.715810 0.311643
+vt 0.722078 0.312190
+vt 0.715811 0.312190
+vt 0.728860 0.316229
+vt 0.735009 0.316229
+vt 0.735009 0.315623
+vt 0.728860 0.315623
+vt 0.735009 0.314961
+vt 0.728860 0.314961
+vt 0.722655 0.315623
+vt 0.722655 0.316229
+vt 0.716392 0.315623
+vt 0.716392 0.316229
+vt 0.722655 0.314961
+vt 0.716392 0.314961
+vt 0.722655 0.316726
+vt 0.728860 0.316726
+vt 0.722655 0.317058
+vt 0.728860 0.317058
+vt 0.716392 0.316726
+vt 0.716392 0.317058
+vt 0.735009 0.316726
+vt 0.735009 0.317058
+vt 0.703099 0.311012
+vt 0.696652 0.311012
+vt 0.696652 0.310325
+vt 0.703099 0.310325
+vt 0.696652 0.309611
+vt 0.703099 0.309611
+vt 0.690143 0.311012
+vt 0.690143 0.310325
+vt 0.690143 0.309611
+vt 0.709485 0.310325
+vt 0.709485 0.311012
+vt 0.709485 0.309611
+vt 0.709485 0.311643
+vt 0.703099 0.311643
+vt 0.709485 0.312190
+vt 0.703099 0.312190
+vt 0.696652 0.311643
+vt 0.690143 0.311643
+vt 0.696652 0.312190
+vt 0.690143 0.312190
+vt 0.703686 0.316229
+vt 0.710069 0.316229
+vt 0.710070 0.315623
+vt 0.703686 0.315623
+vt 0.710069 0.314961
+vt 0.703686 0.314961
+vt 0.697240 0.315623
+vt 0.697240 0.316229
+vt 0.690730 0.315623
+vt 0.690730 0.316229
+vt 0.697240 0.314961
+vt 0.690730 0.314961
+vt 0.697240 0.316726
+vt 0.703686 0.316726
+vt 0.697240 0.317058
+vt 0.703686 0.317058
+vt 0.690730 0.316726
+vt 0.690730 0.317058
+vt 0.710069 0.316726
+vt 0.710070 0.317058
+vt 0.676933 0.311012
+vt 0.670230 0.311012
+vt 0.670230 0.310325
+vt 0.676933 0.310325
+vt 0.670230 0.309611
+vt 0.676933 0.309611
+vt 0.663462 0.311012
+vt 0.663462 0.310325
+vt 0.663462 0.309611
+vt 0.683570 0.310325
+vt 0.683570 0.311012
+vt 0.683570 0.309611
+vt 0.683570 0.311643
+vt 0.676933 0.311643
+vt 0.683570 0.312190
+vt 0.676933 0.312190
+vt 0.670230 0.311643
+vt 0.663462 0.311643
+vt 0.670230 0.312190
+vt 0.663462 0.312190
+vt 0.677515 0.316229
+vt 0.684156 0.316229
+vt 0.684156 0.315623
+vt 0.677515 0.315623
+vt 0.684156 0.314961
+vt 0.677515 0.314961
+vt 0.670808 0.315623
+vt 0.670808 0.316229
+vt 0.664034 0.315623
+vt 0.664034 0.316229
+vt 0.670808 0.314961
+vt 0.664034 0.314961
+vt 0.670808 0.316726
+vt 0.677515 0.316726
+vt 0.670808 0.317058
+vt 0.677515 0.317058
+vt 0.664034 0.316726
+vt 0.664034 0.317058
+vt 0.684156 0.316726
+vt 0.684156 0.317058
+vt 0.649726 0.311012
+vt 0.642759 0.311012
+vt 0.642759 0.310325
+vt 0.649726 0.310325
+vt 0.642759 0.309611
+vt 0.649726 0.309611
+vt 0.635726 0.311012
+vt 0.635726 0.310325
+vt 0.635725 0.309611
+vt 0.656628 0.310325
+vt 0.656628 0.311012
+vt 0.656628 0.309611
+vt 0.656628 0.311643
+vt 0.649726 0.311643
+vt 0.656628 0.312190
+vt 0.649726 0.312190
+vt 0.642759 0.311643
+vt 0.635726 0.311643
+vt 0.642759 0.312190
+vt 0.635726 0.312190
+vt 0.650280 0.316229
+vt 0.657191 0.316229
+vt 0.657191 0.315623
+vt 0.650280 0.315623
+vt 0.657191 0.314961
+vt 0.650280 0.314961
+vt 0.643301 0.315623
+vt 0.643301 0.316229
+vt 0.636254 0.315623
+vt 0.636254 0.316229
+vt 0.643301 0.314961
+vt 0.636254 0.314961
+vt 0.643301 0.316726
+vt 0.650280 0.316726
+vt 0.643301 0.317058
+vt 0.650280 0.317058
+vt 0.636254 0.316726
+vt 0.636254 0.317058
+vt 0.657191 0.316726
+vt 0.657191 0.317058
+vt 0.621462 0.311012
+vt 0.614235 0.311012
+vt 0.614235 0.310325
+vt 0.621462 0.310325
+vt 0.614235 0.309611
+vt 0.621462 0.309611
+vt 0.606945 0.311012
+vt 0.606945 0.310325
+vt 0.606945 0.309611
+vt 0.628626 0.310325
+vt 0.628626 0.311012
+vt 0.628626 0.309611
+vt 0.628626 0.311643
+vt 0.621462 0.311643
+vt 0.628626 0.312190
+vt 0.621462 0.312190
+vt 0.614235 0.311643
+vt 0.606945 0.311643
+vt 0.614235 0.312190
+vt 0.606945 0.312190
+vt 0.621958 0.316229
+vt 0.629139 0.316229
+vt 0.629139 0.315623
+vt 0.621958 0.315623
+vt 0.629139 0.314961
+vt 0.621958 0.314961
+vt 0.614712 0.315623
+vt 0.614712 0.316229
+vt 0.607402 0.315623
+vt 0.607402 0.316229
+vt 0.614712 0.314961
+vt 0.607402 0.314961
+vt 0.614712 0.316726
+vt 0.621958 0.316726
+vt 0.614712 0.317058
+vt 0.621958 0.317058
+vt 0.607402 0.316726
+vt 0.607402 0.317058
+vt 0.629139 0.316726
+vt 0.629139 0.317058
+vt 0.592188 0.311012
+vt 0.584725 0.311012
+vt 0.584725 0.310325
+vt 0.592188 0.310325
+vt 0.584725 0.309611
+vt 0.592188 0.309611
+vt 0.577211 0.311012
+vt 0.577211 0.310325
+vt 0.577211 0.309611
+vt 0.599596 0.310325
+vt 0.599596 0.311012
+vt 0.599596 0.309611
+vt 0.599596 0.311643
+vt 0.592188 0.311643
+vt 0.599596 0.312190
+vt 0.592188 0.312190
+vt 0.584725 0.311643
+vt 0.577211 0.311643
+vt 0.584725 0.312190
+vt 0.577211 0.312190
+vt 0.592597 0.316229
+vt 0.600029 0.316229
+vt 0.600029 0.315623
+vt 0.592597 0.315623
+vt 0.600029 0.314961
+vt 0.592597 0.314961
+vt 0.585107 0.315623
+vt 0.585107 0.316229
+vt 0.577564 0.315623
+vt 0.577564 0.316229
+vt 0.585107 0.314961
+vt 0.577564 0.314961
+vt 0.585107 0.316726
+vt 0.592597 0.316726
+vt 0.585107 0.317058
+vt 0.592597 0.317058
+vt 0.577564 0.316726
+vt 0.577564 0.317058
+vt 0.600029 0.316726
+vt 0.600029 0.317058
+vt 0.562037 0.311012
+vt 0.554387 0.311012
+vt 0.554387 0.310325
+vt 0.562037 0.310325
+vt 0.554387 0.309611
+vt 0.562037 0.309611
+vt 0.546700 0.311012
+vt 0.546700 0.310325
+vt 0.546700 0.309611
+vt 0.569646 0.310325
+vt 0.569646 0.311012
+vt 0.569646 0.309611
+vt 0.569646 0.311643
+vt 0.562037 0.311643
+vt 0.569646 0.312190
+vt 0.562037 0.312190
+vt 0.554387 0.311643
+vt 0.546700 0.311643
+vt 0.554387 0.312190
+vt 0.546700 0.312190
+vt 0.562329 0.316229
+vt 0.569970 0.316229
+vt 0.569970 0.315623
+vt 0.562329 0.315623
+vt 0.569970 0.314961
+vt 0.562329 0.314961
+vt 0.554646 0.315623
+vt 0.554646 0.316229
+vt 0.546924 0.315623
+vt 0.546924 0.316229
+vt 0.554646 0.314961
+vt 0.546924 0.314961
+vt 0.554646 0.316726
+vt 0.562329 0.316726
+vt 0.554646 0.317058
+vt 0.562329 0.317058
+vt 0.546924 0.316726
+vt 0.546924 0.317058
+vt 0.569970 0.316726
+vt 0.569970 0.317058
+vt 0.531233 0.311012
+vt 0.523465 0.311012
+vt 0.523465 0.310325
+vt 0.531233 0.310325
+vt 0.523465 0.309611
+vt 0.531233 0.309611
+vt 0.515679 0.311012
+vt 0.515679 0.310325
+vt 0.515679 0.309611
+vt 0.538980 0.310325
+vt 0.538980 0.311012
+vt 0.538980 0.309611
+vt 0.538980 0.311643
+vt 0.531233 0.311643
+vt 0.538980 0.312190
+vt 0.531233 0.312190
+vt 0.523465 0.311643
+vt 0.515679 0.311643
+vt 0.523465 0.312190
+vt 0.515679 0.312190
+vt 0.531386 0.316229
+vt 0.539169 0.316229
+vt 0.539169 0.315623
+vt 0.531386 0.315623
+vt 0.539169 0.314961
+vt 0.531386 0.314961
+vt 0.523580 0.315623
+vt 0.523580 0.316229
+vt 0.515756 0.315623
+vt 0.515756 0.316229
+vt 0.523580 0.314961
+vt 0.515756 0.314961
+vt 0.523580 0.316726
+vt 0.531386 0.316726
+vt 0.523580 0.317058
+vt 0.531386 0.317058
+vt 0.515756 0.316726
+vt 0.515756 0.317058
+vt 0.539169 0.316726
+vt 0.539169 0.317058
+vt 0.500080 0.311012
+vt 0.492278 0.311012
+vt 0.492278 0.310325
+vt 0.500080 0.310325
+vt 0.492278 0.309611
+vt 0.500080 0.309611
+vt 0.507882 0.310325
+vt 0.507882 0.311012
+vt 0.507882 0.309611
+vt 0.507882 0.311643
+vt 0.500080 0.311643
+vt 0.507882 0.312190
+vt 0.500080 0.312190
+vt 0.492278 0.311643
+vt 0.492278 0.312190
+vt 0.500080 0.316229
+vt 0.507921 0.316229
+vt 0.507921 0.315623
+vt 0.500080 0.315623
+vt 0.507921 0.314961
+vt 0.500080 0.314961
+vt 0.492239 0.315623
+vt 0.492239 0.316229
+vt 0.492239 0.314961
+vt 0.492239 0.316726
+vt 0.500080 0.316726
+vt 0.492239 0.317058
+vt 0.500080 0.317058
+vt 0.507921 0.316726
+vt 0.507921 0.317058
+vt 0.842742 0.311012
+vt 0.837438 0.311012
+vt 0.837438 0.310325
+vt 0.842742 0.310325
+vt 0.837438 0.309611
+vt 0.842742 0.309611
+vt 0.848016 0.310325
+vt 0.848015 0.311012
+vt 0.853274 0.310325
+vt 0.853274 0.311012
+vt 0.848015 0.309611
+vt 0.853274 0.309611
+vt 0.848015 0.311643
+vt 0.842742 0.311643
+vt 0.848015 0.312190
+vt 0.842742 0.312190
+vt 0.853274 0.311643
+vt 0.853274 0.312190
+vt 0.837438 0.311643
+vt 0.837438 0.312190
+vt 0.888684 0.315023
+vt 0.888700 0.314308
+vt 0.891807 0.314272
+vt 0.891749 0.315018
+vt 0.894621 0.314232
+vt 0.894518 0.315014
+vt 0.888717 0.313592
+vt 0.891866 0.313525
+vt 0.894725 0.313450
+vt 0.891690 0.315765
+vt 0.888667 0.315739
+vt 0.891632 0.316511
+vt 0.888650 0.316455
+vt 0.894415 0.315796
+vt 0.894312 0.316578
+vt 0.885046 0.315726
+vt 0.885026 0.315031
+vt 0.880529 0.315731
+vt 0.880482 0.315044
+vt 0.885066 0.316420
+vt 0.880577 0.316419
+vt 0.885007 0.314337
+vt 0.884987 0.313643
+vt 0.880434 0.314357
+vt 0.880387 0.313670
+vt 0.843074 0.316229
+vt 0.848332 0.316229
+vt 0.848332 0.315623
+vt 0.843074 0.315623
+vt 0.848332 0.314961
+vt 0.843074 0.314961
+vt 0.853575 0.316229
+vt 0.853575 0.315623
+vt 0.853575 0.314961
+vt 0.837785 0.315623
+vt 0.837785 0.316229
+vt 0.837785 0.314961
+vt 0.837785 0.316726
+vt 0.843074 0.316726
+vt 0.837785 0.317058
+vt 0.843074 0.317058
+vt 0.848332 0.316726
+vt 0.853575 0.316726
+vt 0.848332 0.317058
+vt 0.853575 0.317058
+vt 0.848564 0.317104
+vt 0.848332 0.317170
+vt 0.843074 0.317170
+vt 0.854044 0.317125
+vt 0.853575 0.317170
+vt 0.837785 0.317170
+vt 0.832451 0.317170
+vt 0.832445 0.317082
+vt 0.837763 0.316811
+vt 0.843290 0.316832
+vt 0.832428 0.316811
+vt 0.849260 0.316897
+vt 0.855451 0.316984
+vt 0.868360 0.315084
+vt 0.868369 0.314354
+vt 0.874689 0.314364
+vt 0.874753 0.315063
+vt 0.868461 0.313623
+vt 0.874625 0.313665
+vt 0.874817 0.315762
+vt 0.868514 0.315813
+vt 0.874882 0.316461
+vt 0.868751 0.316542
+vt 0.862224 0.315882
+vt 0.861820 0.315104
+vt 0.862956 0.316659
+vt 0.862073 0.314322
+vt 0.862654 0.313538
+vt 0.842805 0.313004
+vt 0.837443 0.313010
+vt 0.837438 0.312625
+vt 0.842742 0.312625
+vt 0.832094 0.313010
+vt 0.832089 0.312625
+vt 0.848016 0.312625
+vt 0.848253 0.312986
+vt 0.853274 0.312625
+vt 0.853743 0.312963
+vt 0.848964 0.313312
+vt 0.842995 0.313382
+vt 0.855150 0.313218
+vt 0.837460 0.313405
+vt 0.832111 0.313405
+vt 0.821221 0.313010
+vt 0.815711 0.313010
+vt 0.815704 0.312625
+vt 0.821215 0.312625
+vt 0.810161 0.313010
+vt 0.810154 0.312625
+vt 0.826679 0.312625
+vt 0.826684 0.313010
+vt 0.826702 0.313405
+vt 0.821239 0.313405
+vt 0.815730 0.313405
+vt 0.810181 0.313405
+vt 0.798961 0.313010
+vt 0.793309 0.313010
+vt 0.793301 0.312625
+vt 0.798954 0.312625
+vt 0.787619 0.313010
+vt 0.787611 0.312625
+vt 0.804572 0.312625
+vt 0.804578 0.313010
+vt 0.804599 0.313405
+vt 0.798983 0.313405
+vt 0.793330 0.313405
+vt 0.787641 0.313405
+vt 0.776119 0.313010
+vt 0.770307 0.313010
+vt 0.770299 0.312625
+vt 0.776112 0.312625
+vt 0.764451 0.313010
+vt 0.764443 0.312625
+vt 0.781882 0.312625
+vt 0.781889 0.313010
+vt 0.781912 0.313405
+vt 0.776143 0.313405
+vt 0.770331 0.313405
+vt 0.764476 0.313405
+vt 0.752600 0.313010
+vt 0.746602 0.313010
+vt 0.746593 0.312625
+vt 0.752592 0.312625
+vt 0.740553 0.313010
+vt 0.740544 0.312625
+vt 0.758541 0.312625
+vt 0.758549 0.313010
+vt 0.758574 0.313405
+vt 0.752626 0.313405
+vt 0.746628 0.313405
+vt 0.740579 0.313405
+vt 0.728297 0.313010
+vt 0.722087 0.313010
+vt 0.722078 0.312625
+vt 0.728288 0.312625
+vt 0.715820 0.313010
+vt 0.715811 0.312625
+vt 0.734443 0.312625
+vt 0.734452 0.313010
+vt 0.734479 0.313405
+vt 0.728324 0.313405
+vt 0.722114 0.313405
+vt 0.715847 0.313405
+vt 0.703108 0.313010
+vt 0.696661 0.313010
+vt 0.696652 0.312625
+vt 0.703099 0.312625
+vt 0.690152 0.313010
+vt 0.690143 0.312625
+vt 0.709485 0.312625
+vt 0.709494 0.313010
+vt 0.709521 0.313405
+vt 0.703135 0.313405
+vt 0.696689 0.313405
+vt 0.690179 0.313405
+vt 0.676942 0.313010
+vt 0.670239 0.313010
+vt 0.670230 0.312625
+vt 0.676933 0.312625
+vt 0.663471 0.313010
+vt 0.663462 0.312625
+vt 0.683570 0.312625
+vt 0.683579 0.313010
+vt 0.683606 0.313405
+vt 0.676969 0.313405
+vt 0.670266 0.313405
+vt 0.663498 0.313405
+vt 0.649735 0.313010
+vt 0.642767 0.313010
+vt 0.642759 0.312625
+vt 0.649726 0.312625
+vt 0.635734 0.313010
+vt 0.635726 0.312625
+vt 0.656628 0.312625
+vt 0.656636 0.313010
+vt 0.656663 0.313405
+vt 0.649761 0.313405
+vt 0.642793 0.313405
+vt 0.635759 0.313405
+vt 0.621470 0.313010
+vt 0.614242 0.313010
+vt 0.614235 0.312625
+vt 0.621462 0.312625
+vt 0.606953 0.313010
+vt 0.606945 0.312625
+vt 0.628626 0.312625
+vt 0.628634 0.313010
+vt 0.628658 0.313405
+vt 0.621493 0.313405
+vt 0.614264 0.313405
+vt 0.606974 0.313405
+vt 0.592194 0.313010
+vt 0.584731 0.313010
+vt 0.584725 0.312625
+vt 0.592188 0.312625
+vt 0.577216 0.313010
+vt 0.577211 0.312625
+vt 0.599596 0.312625
+vt 0.599602 0.313010
+vt 0.599623 0.313405
+vt 0.592214 0.313405
+vt 0.584749 0.313405
+vt 0.577233 0.313405
+vt 0.562042 0.313010
+vt 0.554391 0.313010
+vt 0.554387 0.312625
+vt 0.562037 0.312625
+vt 0.546703 0.313010
+vt 0.546700 0.312625
+vt 0.569646 0.312625
+vt 0.569652 0.313010
+vt 0.569667 0.313405
+vt 0.562055 0.313405
+vt 0.554403 0.313405
+vt 0.546714 0.313405
+vt 0.531236 0.313010
+vt 0.523466 0.313010
+vt 0.523465 0.312625
+vt 0.531233 0.312625
+vt 0.515680 0.313010
+vt 0.515679 0.312625
+vt 0.538980 0.312625
+vt 0.538983 0.313010
+vt 0.538992 0.313405
+vt 0.531243 0.313405
+vt 0.523472 0.313405
+vt 0.515684 0.313405
+vt 0.500080 0.313010
+vt 0.492277 0.313010
+vt 0.492278 0.312625
+vt 0.500080 0.312625
+vt 0.507882 0.312625
+vt 0.507883 0.313010
+vt 0.507885 0.313405
+vt 0.500080 0.313405
+vt 0.492275 0.313405
+vt 0.507921 0.317170
+vt 0.500080 0.317170
+vt 0.515756 0.317170
+vt 0.492239 0.317170
+vt 0.492241 0.316811
+vt 0.500080 0.316811
+vt 0.507919 0.316811
+vt 0.515751 0.316811
+vt 0.539169 0.317170
+vt 0.531386 0.317170
+vt 0.546924 0.317170
+vt 0.523580 0.317170
+vt 0.523573 0.316811
+vt 0.531376 0.316811
+vt 0.539157 0.316811
+vt 0.546910 0.316811
+vt 0.569970 0.317170
+vt 0.562329 0.317170
+vt 0.577564 0.317170
+vt 0.554646 0.317170
+vt 0.554630 0.316811
+vt 0.562311 0.316811
+vt 0.569950 0.316811
+vt 0.577542 0.316811
+vt 0.600029 0.317170
+vt 0.592597 0.317170
+vt 0.607402 0.317170
+vt 0.585107 0.317170
+vt 0.585084 0.316811
+vt 0.592571 0.316811
+vt 0.600002 0.316811
+vt 0.607373 0.316811
+vt 0.629139 0.317170
+vt 0.621958 0.317170
+vt 0.636246 0.317082
+vt 0.636254 0.317170
+vt 0.614712 0.317170
+vt 0.614682 0.316811
+vt 0.621927 0.316811
+vt 0.629107 0.316811
+vt 0.636221 0.316811
+vt 0.657191 0.317170
+vt 0.650280 0.317170
+vt 0.664034 0.317170
+vt 0.643301 0.317170
+vt 0.643267 0.316811
+vt 0.650245 0.316811
+vt 0.657156 0.316811
+vt 0.663998 0.316811
+vt 0.684146 0.317082
+vt 0.684156 0.317170
+vt 0.677515 0.317170
+vt 0.690730 0.317170
+vt 0.670808 0.317170
+vt 0.670772 0.316811
+vt 0.677479 0.316811
+vt 0.684119 0.316811
+vt 0.690694 0.316811
+vt 0.710070 0.317170
+vt 0.703686 0.317170
+vt 0.716392 0.317170
+vt 0.697240 0.317170
+vt 0.697203 0.316811
+vt 0.703649 0.316811
+vt 0.710033 0.316811
+vt 0.716356 0.316811
+vt 0.735009 0.317170
+vt 0.728860 0.317170
+vt 0.741103 0.317170
+vt 0.722655 0.317170
+vt 0.722646 0.317082
+vt 0.722619 0.316811
+vt 0.728824 0.316811
+vt 0.734974 0.316811
+vt 0.741068 0.316811
+vt 0.759073 0.317170
+vt 0.753133 0.317170
+vt 0.764964 0.317170
+vt 0.747144 0.317170
+vt 0.747109 0.316811
+vt 0.753099 0.316811
+vt 0.759039 0.316811
+vt 0.764932 0.316811
+vt 0.782369 0.317170
+vt 0.776611 0.317170
+vt 0.788086 0.317170
+vt 0.770810 0.317170
+vt 0.770778 0.316811
+vt 0.776580 0.316811
+vt 0.782338 0.316811
+vt 0.788056 0.316811
+vt 0.805006 0.317170
+vt 0.799403 0.317170
+vt 0.810575 0.317170
+vt 0.793763 0.317170
+vt 0.793734 0.316811
+vt 0.799375 0.316811
+vt 0.804979 0.316811
+vt 0.810549 0.316811
+vt 0.827050 0.317082
+vt 0.827056 0.317170
+vt 0.821607 0.317170
+vt 0.816111 0.317170
+vt 0.816086 0.316811
+vt 0.821582 0.316811
+vt 0.827032 0.316811
+vt 0.858983 0.012284
+vt 0.859416 0.012284
+vt 0.859068 0.013747
+vt 0.858633 0.013747
+vt 0.858497 0.016080
+vt 0.858059 0.016080
+vt 0.859546 0.012284
+vt 0.859200 0.013747
+vt 0.858630 0.016080
+vt 0.857592 0.013747
+vt 0.857947 0.012284
+vt 0.855642 0.013747
+vt 0.856005 0.012284
+vt 0.857012 0.016080
+vt 0.855051 0.016080
+vt 0.858152 0.011401
+vt 0.859185 0.011401
+vt 0.858282 0.010808
+vt 0.859312 0.010808
+vt 0.856215 0.011401
+vt 0.856350 0.010808
+vt 0.859615 0.011401
+vt 0.859744 0.011401
+vt 0.859740 0.010808
+vt 0.859866 0.010808
+vt 0.828749 0.012284
+vt 0.828287 0.013747
+vt 0.823051 0.013747
+vt 0.823532 0.012284
+vt 0.817773 0.013747
+vt 0.818272 0.012284
+vt 0.827535 0.016080
+vt 0.822270 0.016080
+vt 0.816963 0.016080
+vt 0.823813 0.011401
+vt 0.829020 0.011401
+vt 0.823994 0.010808
+vt 0.829193 0.010808
+vt 0.818564 0.011401
+vt 0.818752 0.010808
+vt 0.834177 0.011401
+vt 0.833918 0.012284
+vt 0.839279 0.011401
+vt 0.839030 0.012284
+vt 0.834343 0.010808
+vt 0.839438 0.010808
+vt 0.833473 0.013747
+vt 0.832751 0.016080
+vt 0.838604 0.013747
+vt 0.837912 0.016080
+vt 0.848786 0.012284
+vt 0.848396 0.013747
+vt 0.843675 0.013747
+vt 0.844082 0.012284
+vt 0.847762 0.016080
+vt 0.843012 0.016080
+vt 0.844320 0.011401
+vt 0.849013 0.011401
+vt 0.844472 0.010808
+vt 0.849159 0.010808
+vt 0.853074 0.011401
+vt 0.852856 0.012284
+vt 0.853213 0.010808
+vt 0.852481 0.013747
+vt 0.851871 0.016080
+vt 0.151545 0.056748
+vt 0.151071 0.056748
+vt 0.150827 0.054920
+vt 0.151299 0.054920
+vt 0.150374 0.052543
+vt 0.150843 0.052543
+vt 0.150931 0.056748
+vt 0.150689 0.054920
+vt 0.150236 0.052543
+vt 0.152438 0.054920
+vt 0.152686 0.056748
+vt 0.154576 0.054920
+vt 0.154830 0.056748
+vt 0.151977 0.052543
+vt 0.154106 0.052543
+vt 0.152789 0.058425
+vt 0.151646 0.058425
+vt 0.154935 0.058425
+vt 0.151171 0.058425
+vt 0.151031 0.058425
+vt 0.807639 0.012284
+vt 0.812975 0.012284
+vt 0.812458 0.013747
+vt 0.807105 0.013747
+vt 0.811619 0.016080
+vt 0.806237 0.016080
+vt 0.801710 0.013747
+vt 0.802262 0.012284
+vt 0.796273 0.013747
+vt 0.796842 0.012284
+vt 0.800815 0.016080
+vt 0.795350 0.016080
+vt 0.802585 0.011401
+vt 0.807952 0.011401
+vt 0.802794 0.010808
+vt 0.808154 0.010808
+vt 0.797175 0.011401
+vt 0.797390 0.010808
+vt 0.813278 0.011401
+vt 0.813472 0.010808
+vt 0.785862 0.012284
+vt 0.791376 0.012284
+vt 0.790790 0.013747
+vt 0.785260 0.013747
+vt 0.789841 0.016080
+vt 0.784285 0.016080
+vt 0.779680 0.013747
+vt 0.780298 0.012284
+vt 0.774047 0.013747
+vt 0.774680 0.012284
+vt 0.778679 0.016080
+vt 0.773023 0.016080
+vt 0.780660 0.011401
+vt 0.786215 0.011401
+vt 0.780895 0.010808
+vt 0.786443 0.010808
+vt 0.775052 0.011401
+vt 0.775293 0.010808
+vt 0.791719 0.011401
+vt 0.791941 0.010808
+vt 0.763277 0.012284
+vt 0.769008 0.012284
+vt 0.768360 0.013747
+vt 0.762615 0.013747
+vt 0.767312 0.016080
+vt 0.761545 0.016080
+vt 0.756810 0.013747
+vt 0.757486 0.012284
+vt 0.750942 0.013747
+vt 0.751630 0.012284
+vt 0.755718 0.016080
+vt 0.749831 0.016080
+vt 0.757883 0.011401
+vt 0.763666 0.011401
+vt 0.758142 0.010808
+vt 0.763919 0.010808
+vt 0.752036 0.011401
+vt 0.752300 0.010808
+vt 0.769388 0.011401
+vt 0.769636 0.010808
+vt 0.739717 0.012284
+vt 0.745709 0.012284
+vt 0.745009 0.013747
+vt 0.739007 0.013747
+vt 0.743879 0.016080
+vt 0.737859 0.016080
+vt 0.732933 0.013747
+vt 0.733654 0.012284
+vt 0.726785 0.013747
+vt 0.727515 0.012284
+vt 0.731771 0.016080
+vt 0.725609 0.016080
+vt 0.734080 0.011401
+vt 0.740137 0.011401
+vt 0.734358 0.010808
+vt 0.740411 0.010808
+vt 0.727946 0.011401
+vt 0.728229 0.010808
+vt 0.746121 0.011401
+vt 0.746391 0.010808
+vt 0.714998 0.012284
+vt 0.721297 0.012284
+vt 0.720560 0.013747
+vt 0.714254 0.013747
+vt 0.719372 0.016080
+vt 0.713057 0.016080
+vt 0.707866 0.013747
+vt 0.708614 0.012284
+vt 0.701390 0.013747
+vt 0.702142 0.012284
+vt 0.706661 0.016080
+vt 0.700182 0.016080
+vt 0.709058 0.011401
+vt 0.715438 0.011401
+vt 0.709350 0.010808
+vt 0.715728 0.010808
+vt 0.702588 0.011401
+vt 0.702883 0.010808
+vt 0.721733 0.011401
+vt 0.722020 0.010808
+vt 0.688923 0.012284
+vt 0.695579 0.012284
+vt 0.694826 0.013747
+vt 0.688170 0.013747
+vt 0.693616 0.016080
+vt 0.686961 0.016080
+vt 0.681420 0.013747
+vt 0.682171 0.012284
+vt 0.674573 0.013747
+vt 0.675320 0.012284
+vt 0.680215 0.016080
+vt 0.673376 0.016080
+vt 0.682619 0.011401
+vt 0.689372 0.011401
+vt 0.682915 0.010808
+vt 0.689668 0.010808
+vt 0.675766 0.011401
+vt 0.676061 0.010808
+vt 0.696027 0.011401
+vt 0.696323 0.010808
+vt 0.661311 0.012284
+vt 0.668367 0.012284
+vt 0.667627 0.013747
+vt 0.660579 0.013747
+vt 0.666440 0.016080
+vt 0.659408 0.016080
+vt 0.653430 0.013747
+vt 0.654150 0.012284
+vt 0.646176 0.013747
+vt 0.646882 0.012284
+vt 0.652277 0.016080
+vt 0.645046 0.016080
+vt 0.654582 0.011401
+vt 0.661749 0.011401
+vt 0.654869 0.010808
+vt 0.662040 0.010808
+vt 0.647306 0.011401
+vt 0.647590 0.010808
+vt 0.668810 0.011401
+vt 0.669104 0.010808
+vt 0.632023 0.012284
+vt 0.639506 0.012284
+vt 0.638816 0.013747
+vt 0.631352 0.013747
+vt 0.637714 0.016080
+vt 0.630281 0.016080
+vt 0.623784 0.013747
+vt 0.624432 0.012284
+vt 0.616111 0.013747
+vt 0.616734 0.012284
+vt 0.622749 0.016080
+vt 0.615117 0.016080
+vt 0.624823 0.011401
+vt 0.632427 0.011401
+vt 0.625085 0.010808
+vt 0.632697 0.010808
+vt 0.617111 0.011401
+vt 0.617364 0.010808
+vt 0.639921 0.011401
+vt 0.640199 0.010808
+vt 0.601022 0.012284
+vt 0.608930 0.012284
+vt 0.608335 0.013747
+vt 0.600458 0.013747
+vt 0.607386 0.016080
+vt 0.599560 0.016080
+vt 0.592486 0.013747
+vt 0.593016 0.012284
+vt 0.584419 0.013747
+vt 0.584912 0.012284
+vt 0.591642 0.016080
+vt 0.583636 0.016080
+vt 0.593337 0.011401
+vt 0.601364 0.011401
+vt 0.593553 0.010808
+vt 0.601594 0.010808
+vt 0.585212 0.011401
+vt 0.585414 0.010808
+vt 0.609290 0.011401
+vt 0.609532 0.010808
+vt 0.568436 0.012284
+vt 0.576717 0.012284
+vt 0.576264 0.013747
+vt 0.568025 0.013747
+vt 0.575544 0.016080
+vt 0.567373 0.016080
+vt 0.559711 0.013747
+vt 0.560076 0.012284
+vt 0.551328 0.013747
+vt 0.551646 0.012284
+vt 0.559131 0.016080
+vt 0.550824 0.016080
+vt 0.560299 0.011401
+vt 0.568685 0.011401
+vt 0.560449 0.010808
+vt 0.568854 0.010808
+vt 0.551839 0.011401
+vt 0.551971 0.010808
+vt 0.576992 0.011401
+vt 0.577178 0.010808
+vt 0.534603 0.012284
+vt 0.543151 0.012284
+vt 0.542883 0.013747
+vt 0.534387 0.013747
+vt 0.542458 0.016080
+vt 0.534043 0.016080
+vt 0.525848 0.013747
+vt 0.526012 0.012284
+vt 0.517277 0.013747
+vt 0.517387 0.012284
+vt 0.525588 0.016080
+vt 0.517103 0.016080
+vt 0.526112 0.011401
+vt 0.534736 0.011401
+vt 0.526180 0.010808
+vt 0.534825 0.010808
+vt 0.517454 0.011401
+vt 0.517500 0.010808
+vt 0.543315 0.011401
+vt 0.543426 0.010808
+vt 0.500080 0.012284
+vt 0.508739 0.012284
+vt 0.508684 0.013747
+vt 0.500080 0.013747
+vt 0.508597 0.016080
+vt 0.500080 0.016080
+vt 0.491476 0.013747
+vt 0.491421 0.012284
+vt 0.482883 0.013747
+vt 0.482773 0.012284
+vt 0.491563 0.016080
+vt 0.483057 0.016080
+vt 0.491387 0.011401
+vt 0.500080 0.011401
+vt 0.491364 0.010808
+vt 0.500080 0.010808
+vt 0.482706 0.011401
+vt 0.482660 0.010808
+vt 0.508773 0.011401
+vt 0.508796 0.010808
+vt 0.465557 0.012284
+vt 0.474148 0.012284
+vt 0.474312 0.013747
+vt 0.465773 0.013747
+vt 0.474572 0.016080
+vt 0.466117 0.016080
+vt 0.457277 0.013747
+vt 0.457008 0.012284
+vt 0.448832 0.013747
+vt 0.448514 0.012284
+vt 0.457702 0.016080
+vt 0.449336 0.016080
+vt 0.456845 0.011401
+vt 0.465424 0.011401
+vt 0.456734 0.010808
+vt 0.465334 0.010808
+vt 0.448320 0.011401
+vt 0.448189 0.010808
+vt 0.474048 0.011401
+vt 0.473980 0.010808
+vt 0.431724 0.012284
+vt 0.440084 0.012284
+vt 0.440449 0.013747
+vt 0.432135 0.013747
+vt 0.441029 0.016080
+vt 0.432787 0.016080
+vt 0.423896 0.013747
+vt 0.423443 0.012284
+vt 0.415741 0.013747
+vt 0.415248 0.012284
+vt 0.424616 0.016080
+vt 0.416524 0.016080
+vt 0.423168 0.011401
+vt 0.431475 0.011401
+vt 0.422982 0.010808
+vt 0.431306 0.010808
+vt 0.414948 0.011401
+vt 0.414746 0.010808
+vt 0.439861 0.011401
+vt 0.439711 0.010808
+vt 0.399137 0.012284
+vt 0.407144 0.012284
+vt 0.407674 0.013747
+vt 0.399702 0.013747
+vt 0.408518 0.016080
+vt 0.400600 0.016080
+vt 0.391825 0.013747
+vt 0.391230 0.012284
+vt 0.384049 0.013747
+vt 0.383426 0.012284
+vt 0.392774 0.016080
+vt 0.385043 0.016080
+vt 0.390870 0.011401
+vt 0.398796 0.011401
+vt 0.390628 0.010808
+vt 0.398566 0.010808
+vt 0.383049 0.011401
+vt 0.382796 0.010808
+vt 0.406823 0.011401
+vt 0.406607 0.010808
+vt 0.368137 0.012284
+vt 0.375728 0.012284
+vt 0.376376 0.013747
+vt 0.368808 0.013747
+vt 0.377411 0.016080
+vt 0.369878 0.016080
+vt 0.361343 0.013747
+vt 0.360654 0.012284
+vt 0.353984 0.013747
+vt 0.353278 0.012284
+vt 0.362446 0.016080
+vt 0.355114 0.016080
+vt 0.360239 0.011401
+vt 0.367733 0.011401
+vt 0.359961 0.010808
+vt 0.367463 0.010808
+vt 0.352853 0.011401
+vt 0.352570 0.010808
+vt 0.375337 0.011401
+vt 0.375075 0.010808
+vt 0.338849 0.012284
+vt 0.346010 0.012284
+vt 0.346730 0.013747
+vt 0.339581 0.013747
+vt 0.347883 0.016080
+vt 0.340752 0.016080
+vt 0.332533 0.013747
+vt 0.331793 0.012284
+vt 0.325587 0.013747
+vt 0.324840 0.012284
+vt 0.333720 0.016080
+vt 0.326784 0.016080
+vt 0.331350 0.011401
+vt 0.338411 0.011401
+vt 0.331056 0.010808
+vt 0.338120 0.010808
+vt 0.324394 0.011401
+vt 0.324099 0.010808
+vt 0.345578 0.011401
+vt 0.345290 0.010808
+vt 0.311237 0.012284
+vt 0.317989 0.012284
+vt 0.318740 0.013747
+vt 0.311990 0.013747
+vt 0.319945 0.016080
+vt 0.313199 0.016080
+vt 0.305334 0.013747
+vt 0.304581 0.012284
+vt 0.298770 0.013747
+vt 0.298018 0.012284
+vt 0.306544 0.016080
+vt 0.299978 0.016080
+vt 0.304133 0.011401
+vt 0.310788 0.011401
+vt 0.303837 0.010808
+vt 0.310492 0.010808
+vt 0.297572 0.011401
+vt 0.297277 0.010808
+vt 0.317541 0.011401
+vt 0.317245 0.010808
+vt 0.285162 0.012284
+vt 0.291546 0.012284
+vt 0.292295 0.013747
+vt 0.285906 0.013747
+vt 0.293499 0.016080
+vt 0.287103 0.016080
+vt 0.279600 0.013747
+vt 0.278863 0.012284
+vt 0.273375 0.013747
+vt 0.272645 0.012284
+vt 0.280788 0.016080
+vt 0.274551 0.016080
+vt 0.278427 0.011401
+vt 0.284722 0.011401
+vt 0.278140 0.010808
+vt 0.284432 0.010808
+vt 0.272214 0.011401
+vt 0.271931 0.010808
+vt 0.291102 0.011401
+vt 0.290810 0.010808
+vt 0.260442 0.012284
+vt 0.266506 0.012284
+vt 0.267227 0.013747
+vt 0.261153 0.013747
+vt 0.268389 0.016080
+vt 0.262300 0.016080
+vt 0.255151 0.013747
+vt 0.254451 0.012284
+vt 0.249218 0.013747
+vt 0.248530 0.012284
+vt 0.256281 0.016080
+vt 0.250329 0.016080
+vt 0.254039 0.011401
+vt 0.260023 0.011401
+vt 0.253769 0.010808
+vt 0.259749 0.010808
+vt 0.248124 0.011401
+vt 0.247860 0.010808
+vt 0.266080 0.011401
+vt 0.265802 0.010808
+vt 0.236883 0.012284
+vt 0.242674 0.012284
+vt 0.243350 0.013747
+vt 0.237545 0.013747
+vt 0.244441 0.016080
+vt 0.238615 0.016080
+vt 0.231800 0.013747
+vt 0.231152 0.012284
+vt 0.226113 0.013747
+vt 0.225480 0.012284
+vt 0.232848 0.016080
+vt 0.227137 0.016080
+vt 0.230771 0.011401
+vt 0.236494 0.011401
+vt 0.230524 0.010808
+vt 0.236241 0.010808
+vt 0.225108 0.011401
+vt 0.224867 0.010808
+vt 0.242277 0.011401
+vt 0.242018 0.010808
+vt 0.214298 0.012284
+vt 0.219862 0.012284
+vt 0.220480 0.013747
+vt 0.214900 0.013747
+vt 0.221481 0.016080
+vt 0.215875 0.016080
+vt 0.209370 0.013747
+vt 0.208784 0.012284
+vt 0.203887 0.013747
+vt 0.203318 0.012284
+vt 0.210319 0.016080
+vt 0.204810 0.016080
+vt 0.208441 0.011401
+vt 0.213945 0.011401
+vt 0.208219 0.010808
+vt 0.213717 0.010808
+vt 0.202985 0.011401
+vt 0.202770 0.010808
+vt 0.219500 0.011401
+vt 0.219265 0.010808
+vt 0.192521 0.012284
+vt 0.197898 0.012284
+vt 0.198450 0.013747
+vt 0.193055 0.013747
+vt 0.199345 0.016080
+vt 0.193923 0.016080
+vt 0.187702 0.013747
+vt 0.187185 0.012284
+vt 0.182387 0.013747
+vt 0.181888 0.012284
+vt 0.188541 0.016080
+vt 0.183197 0.016080
+vt 0.186882 0.011401
+vt 0.192208 0.011401
+vt 0.186688 0.010808
+vt 0.192006 0.010808
+vt 0.181596 0.011401
+vt 0.181408 0.010808
+vt 0.197575 0.011401
+vt 0.197366 0.010808
+vt 0.171411 0.012284
+vt 0.176628 0.012284
+vt 0.177109 0.013747
+vt 0.171873 0.013747
+vt 0.177890 0.016080
+vt 0.172625 0.016080
+vt 0.166687 0.013747
+vt 0.166242 0.012284
+vt 0.161555 0.013747
+vt 0.161130 0.012284
+vt 0.167409 0.016080
+vt 0.162248 0.016080
+vt 0.165983 0.011401
+vt 0.171140 0.011401
+vt 0.165817 0.010808
+vt 0.170967 0.010808
+vt 0.160881 0.011401
+vt 0.160722 0.010808
+vt 0.176347 0.011401
+vt 0.176166 0.010808
+vt 0.151374 0.012284
+vt 0.151147 0.011401
+vt 0.155840 0.011401
+vt 0.156078 0.012284
+vt 0.151001 0.010808
+vt 0.155688 0.010808
+vt 0.156485 0.013747
+vt 0.151764 0.013747
+vt 0.157148 0.016080
+vt 0.152398 0.016080
+vt 0.147679 0.013747
+vt 0.147304 0.012284
+vt 0.144518 0.013747
+vt 0.144155 0.012284
+vt 0.148289 0.016080
+vt 0.145109 0.016080
+vt 0.147086 0.011401
+vt 0.146946 0.010808
+vt 0.143945 0.011401
+vt 0.143810 0.010808
+vt 0.837355 0.056748
+vt 0.837241 0.058425
+vt 0.832044 0.058425
+vt 0.832162 0.056748
+vt 0.826468 0.058425
+vt 0.826591 0.056748
+vt 0.832444 0.054920
+vt 0.837626 0.054920
+vt 0.832967 0.052543
+vt 0.838128 0.052543
+vt 0.826885 0.054920
+vt 0.827430 0.052543
+vt 0.842112 0.054920
+vt 0.841851 0.056748
+vt 0.845584 0.054920
+vt 0.845330 0.056748
+vt 0.842596 0.052543
+vt 0.846054 0.052543
+vt 0.841742 0.058425
+vt 0.845225 0.058425
+vt 0.815284 0.056748
+vt 0.815151 0.058425
+vt 0.809426 0.058425
+vt 0.809563 0.056748
+vt 0.803665 0.058425
+vt 0.803807 0.056748
+vt 0.809891 0.054920
+vt 0.815601 0.054920
+vt 0.810500 0.052543
+vt 0.816189 0.052543
+vt 0.804147 0.054920
+vt 0.804776 0.052543
+vt 0.821269 0.054920
+vt 0.820963 0.056748
+vt 0.821835 0.052543
+vt 0.820835 0.058425
+vt 0.792214 0.056748
+vt 0.798024 0.056748
+vt 0.797878 0.058425
+vt 0.792064 0.058425
+vt 0.786220 0.058425
+vt 0.786374 0.056748
+vt 0.780346 0.058425
+vt 0.780505 0.056748
+vt 0.786745 0.054920
+vt 0.792574 0.054920
+vt 0.787431 0.052543
+vt 0.793242 0.052543
+vt 0.780885 0.054920
+vt 0.781589 0.052543
+vt 0.798375 0.054920
+vt 0.799023 0.052543
+vt 0.768671 0.056748
+vt 0.774604 0.056748
+vt 0.774442 0.058425
+vt 0.768505 0.058425
+vt 0.762536 0.058425
+vt 0.762705 0.056748
+vt 0.756532 0.058425
+vt 0.756704 0.056748
+vt 0.763110 0.054920
+vt 0.769068 0.054920
+vt 0.763863 0.052543
+vt 0.769806 0.052543
+vt 0.757118 0.054920
+vt 0.757884 0.052543
+vt 0.774993 0.054920
+vt 0.775714 0.052543
+vt 0.744596 0.056748
+vt 0.750668 0.056748
+vt 0.750494 0.058425
+vt 0.744419 0.058425
+vt 0.738308 0.058425
+vt 0.738487 0.056748
+vt 0.732158 0.058425
+vt 0.732340 0.056748
+vt 0.738920 0.054920
+vt 0.745023 0.054920
+vt 0.739723 0.052543
+vt 0.745815 0.052543
+vt 0.732778 0.054920
+vt 0.733590 0.052543
+vt 0.751089 0.054920
+vt 0.751868 0.052543
+vt 0.719928 0.056748
+vt 0.726154 0.056748
+vt 0.725970 0.058425
+vt 0.719743 0.058425
+vt 0.713476 0.058425
+vt 0.713662 0.056748
+vt 0.707167 0.058425
+vt 0.707354 0.056748
+vt 0.714110 0.054920
+vt 0.720374 0.054920
+vt 0.714943 0.052543
+vt 0.721202 0.052543
+vt 0.707805 0.054920
+vt 0.708642 0.052543
+vt 0.726596 0.054920
+vt 0.727417 0.052543
+vt 0.694613 0.056748
+vt 0.701005 0.056748
+vt 0.700818 0.058425
+vt 0.694426 0.058425
+vt 0.687992 0.058425
+vt 0.688179 0.056748
+vt 0.681515 0.058425
+vt 0.681701 0.056748
+vt 0.688630 0.054920
+vt 0.695065 0.054920
+vt 0.689468 0.052543
+vt 0.695905 0.052543
+vt 0.682150 0.054920
+vt 0.682986 0.052543
+vt 0.701457 0.054920
+vt 0.702296 0.052543
+vt 0.668615 0.056748
+vt 0.675180 0.056748
+vt 0.674995 0.058425
+vt 0.668432 0.058425
+vt 0.661826 0.058425
+vt 0.662007 0.056748
+vt 0.655177 0.058425
+vt 0.655355 0.056748
+vt 0.662444 0.054920
+vt 0.669057 0.054920
+vt 0.663257 0.052543
+vt 0.669880 0.052543
+vt 0.655786 0.054920
+vt 0.656587 0.052543
+vt 0.675626 0.054920
+vt 0.676456 0.052543
+vt 0.641920 0.056748
+vt 0.648659 0.056748
+vt 0.648484 0.058425
+vt 0.641749 0.058425
+vt 0.634972 0.058425
+vt 0.635139 0.056748
+vt 0.628154 0.058425
+vt 0.628316 0.056748
+vt 0.635544 0.054920
+vt 0.642335 0.054920
+vt 0.636297 0.052543
+vt 0.643107 0.052543
+vt 0.628710 0.054920
+vt 0.629442 0.052543
+vt 0.649082 0.054920
+vt 0.649870 0.052543
+vt 0.614548 0.056748
+vt 0.621452 0.056748
+vt 0.621295 0.058425
+vt 0.614397 0.058425
+vt 0.607460 0.058425
+vt 0.607605 0.056748
+vt 0.600487 0.058425
+vt 0.600625 0.056748
+vt 0.607957 0.054920
+vt 0.614915 0.054920
+vt 0.608612 0.052543
+vt 0.615598 0.052543
+vt 0.600960 0.054920
+vt 0.601584 0.052543
+vt 0.621833 0.054920
+vt 0.622542 0.052543
+vt 0.586556 0.056748
+vt 0.593608 0.056748
+vt 0.593477 0.058425
+vt 0.586433 0.058425
+vt 0.579358 0.058425
+vt 0.579472 0.056748
+vt 0.572252 0.058425
+vt 0.572358 0.056748
+vt 0.579751 0.054920
+vt 0.586855 0.054920
+vt 0.580270 0.052543
+vt 0.587411 0.052543
+vt 0.572615 0.054920
+vt 0.573094 0.052543
+vt 0.593925 0.054920
+vt 0.594517 0.052543
+vt 0.558046 0.056748
+vt 0.565215 0.056748
+vt 0.565119 0.058425
+vt 0.557959 0.058425
+vt 0.550777 0.058425
+vt 0.550854 0.056748
+vt 0.543574 0.058425
+vt 0.543640 0.056748
+vt 0.551041 0.054920
+vt 0.558257 0.054920
+vt 0.551390 0.052543
+vt 0.558652 0.052543
+vt 0.543802 0.054920
+vt 0.544104 0.052543
+vt 0.565450 0.054920
+vt 0.565888 0.052543
+vt 0.529161 0.056748
+vt 0.536408 0.056748
+vt 0.536353 0.058425
+vt 0.529116 0.058425
+vt 0.521868 0.058425
+vt 0.521902 0.056748
+vt 0.514611 0.058425
+vt 0.514633 0.056748
+vt 0.521985 0.054920
+vt 0.529271 0.054920
+vt 0.522139 0.052543
+vt 0.529476 0.052543
+vt 0.514689 0.054920
+vt 0.514792 0.052543
+vt 0.536545 0.054920
+vt 0.536799 0.052543
+vt 0.500080 0.056748
+vt 0.507358 0.056748
+vt 0.507347 0.058425
+vt 0.500080 0.058425
+vt 0.492813 0.058425
+vt 0.492802 0.056748
+vt 0.485549 0.058425
+vt 0.485527 0.056748
+vt 0.492774 0.054920
+vt 0.500080 0.054920
+vt 0.492722 0.052543
+vt 0.500080 0.052543
+vt 0.485471 0.054920
+vt 0.485368 0.052543
+vt 0.507386 0.054920
+vt 0.507438 0.052543
+vt 0.470999 0.056748
+vt 0.478258 0.056748
+vt 0.478292 0.058425
+vt 0.471044 0.058425
+vt 0.463807 0.058425
+vt 0.463751 0.056748
+vt 0.456586 0.058425
+vt 0.456520 0.056748
+vt 0.463615 0.054920
+vt 0.470889 0.054920
+vt 0.463361 0.052543
+vt 0.470684 0.052543
+vt 0.456358 0.054920
+vt 0.456056 0.052543
+vt 0.478175 0.054920
+vt 0.478021 0.052543
+vt 0.442114 0.056748
+vt 0.449306 0.056748
+vt 0.449383 0.058425
+vt 0.442201 0.058425
+vt 0.435041 0.058425
+vt 0.434945 0.056748
+vt 0.427908 0.058425
+vt 0.427802 0.056748
+vt 0.434710 0.054920
+vt 0.441902 0.054920
+vt 0.434272 0.052543
+vt 0.441508 0.052543
+vt 0.427545 0.054920
+vt 0.427065 0.052543
+vt 0.449119 0.054920
+vt 0.448770 0.052543
+vt 0.413604 0.056748
+vt 0.420688 0.056748
+vt 0.420802 0.058425
+vt 0.413727 0.058425
+vt 0.406683 0.058425
+vt 0.406552 0.056748
+vt 0.399673 0.058425
+vt 0.399535 0.056748
+vt 0.406235 0.054920
+vt 0.413305 0.054920
+vt 0.405643 0.052543
+vt 0.412749 0.052543
+vt 0.399200 0.054920
+vt 0.398576 0.052543
+vt 0.420409 0.054920
+vt 0.419890 0.052543
+vt 0.385612 0.056748
+vt 0.392555 0.056748
+vt 0.392700 0.058425
+vt 0.385763 0.058425
+vt 0.378865 0.058425
+vt 0.378708 0.056748
+vt 0.372006 0.058425
+vt 0.371843 0.056748
+vt 0.378327 0.054920
+vt 0.385245 0.054920
+vt 0.377618 0.052543
+vt 0.384562 0.052543
+vt 0.371450 0.054920
+vt 0.370718 0.052543
+vt 0.392203 0.054920
+vt 0.391548 0.052543
+vt 0.358240 0.056748
+vt 0.365021 0.056748
+vt 0.365187 0.058425
+vt 0.358411 0.058425
+vt 0.351676 0.058425
+vt 0.351501 0.056748
+vt 0.344983 0.058425
+vt 0.344805 0.056748
+vt 0.351077 0.054920
+vt 0.357825 0.054920
+vt 0.350290 0.052543
+vt 0.357053 0.052543
+vt 0.344374 0.054920
+vt 0.343573 0.052543
+vt 0.364616 0.054920
+vt 0.363863 0.052543
+vt 0.331545 0.056748
+vt 0.338153 0.056748
+vt 0.338334 0.058425
+vt 0.331728 0.058425
+vt 0.325165 0.058425
+vt 0.324980 0.056748
+vt 0.318645 0.058425
+vt 0.318459 0.056748
+vt 0.324534 0.054920
+vt 0.331102 0.054920
+vt 0.323704 0.052543
+vt 0.330280 0.052543
+vt 0.318010 0.054920
+vt 0.317174 0.052543
+vt 0.337716 0.054920
+vt 0.336903 0.052543
+vt 0.305547 0.056748
+vt 0.311981 0.056748
+vt 0.312168 0.058425
+vt 0.305734 0.058425
+vt 0.299342 0.058425
+vt 0.299155 0.056748
+vt 0.292993 0.058425
+vt 0.292806 0.056748
+vt 0.298703 0.054920
+vt 0.305095 0.054920
+vt 0.297864 0.052543
+vt 0.304255 0.052543
+vt 0.292355 0.054920
+vt 0.291518 0.052543
+vt 0.311530 0.054920
+vt 0.310692 0.052543
+vt 0.280232 0.056748
+vt 0.286498 0.056748
+vt 0.286684 0.058425
+vt 0.280417 0.058425
+vt 0.274190 0.058425
+vt 0.274006 0.056748
+vt 0.268002 0.058425
+vt 0.267820 0.056748
+vt 0.273564 0.054920
+vt 0.279786 0.054920
+vt 0.272743 0.052543
+vt 0.278958 0.052543
+vt 0.267382 0.054920
+vt 0.266570 0.052543
+vt 0.286050 0.054920
+vt 0.285216 0.052543
+vt 0.255563 0.056748
+vt 0.261673 0.056748
+vt 0.261852 0.058425
+vt 0.255741 0.058425
+vt 0.249666 0.058425
+vt 0.249492 0.056748
+vt 0.243628 0.058425
+vt 0.243456 0.056748
+vt 0.249071 0.054920
+vt 0.255137 0.054920
+vt 0.248291 0.052543
+vt 0.254345 0.052543
+vt 0.243043 0.054920
+vt 0.242276 0.052543
+vt 0.261240 0.054920
+vt 0.260437 0.052543
+vt 0.231489 0.056748
+vt 0.237455 0.056748
+vt 0.237624 0.058425
+vt 0.231655 0.058425
+vt 0.225718 0.058425
+vt 0.225556 0.056748
+vt 0.219814 0.058425
+vt 0.219655 0.056748
+vt 0.225167 0.054920
+vt 0.231092 0.054920
+vt 0.224446 0.052543
+vt 0.230354 0.052543
+vt 0.219275 0.054920
+vt 0.218571 0.052543
+vt 0.237050 0.054920
+vt 0.236297 0.052543
+vt 0.207946 0.056748
+vt 0.213786 0.056748
+vt 0.213940 0.058425
+vt 0.208096 0.058425
+vt 0.202282 0.058425
+vt 0.202135 0.056748
+vt 0.196495 0.058425
+vt 0.196353 0.056748
+vt 0.201785 0.054920
+vt 0.207586 0.054920
+vt 0.201136 0.052543
+vt 0.206918 0.052543
+vt 0.196013 0.054920
+vt 0.195384 0.052543
+vt 0.213415 0.054920
+vt 0.212729 0.052543
+vt 0.184876 0.056748
+vt 0.190597 0.056748
+vt 0.190734 0.058425
+vt 0.185009 0.058425
+vt 0.179325 0.058425
+vt 0.179197 0.056748
+vt 0.173692 0.058425
+vt 0.173569 0.056748
+vt 0.178891 0.054920
+vt 0.184559 0.054920
+vt 0.178325 0.052543
+vt 0.183971 0.052543
+vt 0.173275 0.054920
+vt 0.172730 0.052543
+vt 0.190269 0.054920
+vt 0.189660 0.052543
+vt 0.162805 0.056748
+vt 0.158309 0.056748
+vt 0.158048 0.054920
+vt 0.162534 0.054920
+vt 0.157564 0.052543
+vt 0.162032 0.052543
+vt 0.167716 0.054920
+vt 0.167998 0.056748
+vt 0.167193 0.052543
+vt 0.168116 0.058425
+vt 0.162919 0.058425
+vt 0.158418 0.058425
+vt 0.845681 0.023637
+vt 0.844569 0.027684
+vt 0.839679 0.027684
+vt 0.840841 0.023637
+vt 0.834430 0.027684
+vt 0.835643 0.023637
+vt 0.843629 0.031126
+vt 0.838698 0.031126
+vt 0.833405 0.031126
+vt 0.842009 0.019573
+vt 0.846801 0.019573
+vt 0.836864 0.019573
+vt 0.850947 0.019573
+vt 0.849870 0.023637
+vt 0.854155 0.019573
+vt 0.853111 0.023637
+vt 0.848799 0.027684
+vt 0.847896 0.031126
+vt 0.852073 0.027684
+vt 0.851196 0.031126
+vt 0.825072 0.023637
+vt 0.823754 0.027684
+vt 0.818342 0.027684
+vt 0.819711 0.023637
+vt 0.812889 0.027684
+vt 0.814309 0.023637
+vt 0.822643 0.031126
+vt 0.817187 0.031126
+vt 0.811691 0.031126
+vt 0.821088 0.019573
+vt 0.826398 0.019573
+vt 0.815737 0.019573
+vt 0.831658 0.019573
+vt 0.830385 0.023637
+vt 0.829119 0.027684
+vt 0.828051 0.031126
+vt 0.803397 0.023637
+vt 0.808871 0.023637
+vt 0.807402 0.027684
+vt 0.801879 0.027684
+vt 0.806162 0.031126
+vt 0.800597 0.031126
+vt 0.796318 0.027684
+vt 0.797884 0.023637
+vt 0.790717 0.027684
+vt 0.792331 0.023637
+vt 0.794996 0.031126
+vt 0.789356 0.031126
+vt 0.799461 0.019573
+vt 0.804926 0.019573
+vt 0.793956 0.019573
+vt 0.810350 0.019573
+vt 0.781095 0.023637
+vt 0.786735 0.023637
+vt 0.785075 0.027684
+vt 0.779390 0.027684
+vt 0.783675 0.031126
+vt 0.777952 0.031126
+vt 0.773660 0.027684
+vt 0.775408 0.023637
+vt 0.767883 0.027684
+vt 0.769673 0.023637
+vt 0.772186 0.031126
+vt 0.766373 0.031126
+vt 0.777168 0.019573
+vt 0.782811 0.019573
+vt 0.771475 0.019573
+vt 0.788406 0.019573
+vt 0.758047 0.023637
+vt 0.763887 0.023637
+vt 0.762057 0.027684
+vt 0.756179 0.027684
+vt 0.760513 0.031126
+vt 0.754604 0.031126
+vt 0.750249 0.027684
+vt 0.752153 0.023637
+vt 0.744263 0.027684
+vt 0.746202 0.023637
+vt 0.748643 0.031126
+vt 0.742629 0.031126
+vt 0.754071 0.019573
+vt 0.759929 0.019573
+vt 0.748154 0.019573
+vt 0.765730 0.019573
+vt 0.734117 0.023637
+vt 0.740190 0.023637
+vt 0.738221 0.027684
+vt 0.732119 0.027684
+vt 0.736560 0.031126
+vt 0.730434 0.031126
+vt 0.725956 0.027684
+vt 0.727979 0.023637
+vt 0.719729 0.027684
+vt 0.721775 0.023637
+vt 0.724249 0.031126
+vt 0.718004 0.031126
+vt 0.730019 0.019573
+vt 0.736130 0.019573
+vt 0.723837 0.019573
+vt 0.742174 0.019573
+vt 0.709159 0.023637
+vt 0.715503 0.023637
+vt 0.713437 0.027684
+vt 0.707078 0.027684
+vt 0.711697 0.031126
+vt 0.705325 0.031126
+vt 0.700650 0.027684
+vt 0.702742 0.023637
+vt 0.694151 0.027684
+vt 0.696249 0.023637
+vt 0.698888 0.031126
+vt 0.692384 0.031126
+vt 0.704849 0.019573
+vt 0.711255 0.019573
+vt 0.698364 0.019573
+vt 0.717584 0.019573
+vt 0.683030 0.023637
+vt 0.689679 0.023637
+vt 0.687580 0.027684
+vt 0.680934 0.027684
+vt 0.685811 0.031126
+vt 0.679168 0.031126
+vt 0.674212 0.027684
+vt 0.676300 0.023637
+vt 0.667414 0.027684
+vt 0.669487 0.023637
+vt 0.672454 0.031126
+vt 0.665668 0.031126
+vt 0.678404 0.019573
+vt 0.685143 0.019573
+vt 0.671577 0.019573
+vt 0.691796 0.019573
+vt 0.655607 0.023637
+vt 0.662590 0.023637
+vt 0.660538 0.027684
+vt 0.653582 0.027684
+vt 0.658810 0.031126
+vt 0.651878 0.031126
+vt 0.646548 0.027684
+vt 0.648539 0.023637
+vt 0.639435 0.027684
+vt 0.641385 0.023637
+vt 0.644872 0.031126
+vt 0.637793 0.031126
+vt 0.650548 0.019573
+vt 0.657650 0.019573
+vt 0.643352 0.019573
+vt 0.664659 0.019573
+vt 0.626814 0.023637
+vt 0.634143 0.023637
+vt 0.632241 0.027684
+vt 0.624969 0.027684
+vt 0.630641 0.031126
+vt 0.623415 0.031126
+vt 0.617619 0.027684
+vt 0.619401 0.023637
+vt 0.610192 0.027684
+vt 0.611902 0.023637
+vt 0.616119 0.031126
+vt 0.608753 0.031126
+vt 0.621199 0.019573
+vt 0.628677 0.019573
+vt 0.613629 0.019573
+vt 0.636062 0.019573
+vt 0.596658 0.023637
+vt 0.604321 0.023637
+vt 0.602690 0.027684
+vt 0.595115 0.027684
+vt 0.601317 0.031126
+vt 0.593816 0.031126
+vt 0.587470 0.027684
+vt 0.588919 0.023637
+vt 0.579759 0.027684
+vt 0.581105 0.023637
+vt 0.586252 0.031126
+vt 0.578628 0.031126
+vt 0.590381 0.019573
+vt 0.598217 0.019573
+vt 0.582464 0.019573
+vt 0.605967 0.019573
+vt 0.565271 0.023637
+vt 0.573220 0.023637
+vt 0.571985 0.027684
+vt 0.564153 0.027684
+vt 0.570946 0.031126
+vt 0.563213 0.031126
+vt 0.556267 0.027684
+vt 0.557261 0.023637
+vt 0.548334 0.027684
+vt 0.549198 0.023637
+vt 0.555432 0.031126
+vt 0.547607 0.031126
+vt 0.558265 0.019573
+vt 0.566400 0.019573
+vt 0.550071 0.019573
+vt 0.574468 0.019573
+vt 0.532935 0.023637
+vt 0.541087 0.023637
+vt 0.540358 0.027684
+vt 0.532346 0.027684
+vt 0.539745 0.031126
+vt 0.531851 0.031126
+vt 0.524305 0.027684
+vt 0.524750 0.023637
+vt 0.516243 0.027684
+vt 0.516541 0.023637
+vt 0.523932 0.031126
+vt 0.515992 0.031126
+vt 0.525200 0.019573
+vt 0.533530 0.019573
+vt 0.516843 0.019573
+vt 0.541823 0.019573
+vt 0.500080 0.023637
+vt 0.508315 0.023637
+vt 0.508165 0.027684
+vt 0.500080 0.027684
+vt 0.508039 0.031126
+vt 0.500080 0.031126
+vt 0.491995 0.027684
+vt 0.491845 0.023637
+vt 0.483917 0.027684
+vt 0.483619 0.023637
+vt 0.492120 0.031126
+vt 0.484168 0.031126
+vt 0.491694 0.019573
+vt 0.500080 0.019573
+vt 0.483317 0.019573
+vt 0.508466 0.019573
+vt 0.467225 0.023637
+vt 0.475409 0.023637
+vt 0.475854 0.027684
+vt 0.467814 0.027684
+vt 0.476228 0.031126
+vt 0.468309 0.031126
+vt 0.459802 0.027684
+vt 0.459073 0.023637
+vt 0.451826 0.027684
+vt 0.450962 0.023637
+vt 0.460415 0.031126
+vt 0.452552 0.031126
+vt 0.458337 0.019573
+vt 0.466630 0.019573
+vt 0.450089 0.019573
+vt 0.474960 0.019573
+vt 0.434889 0.023637
+vt 0.442899 0.023637
+vt 0.443893 0.027684
+vt 0.436007 0.027684
+vt 0.444728 0.031126
+vt 0.436947 0.031126
+vt 0.428175 0.027684
+vt 0.426940 0.023637
+vt 0.420401 0.027684
+vt 0.419055 0.023637
+vt 0.429214 0.031126
+vt 0.421532 0.031126
+vt 0.425692 0.019573
+vt 0.433760 0.019573
+vt 0.417696 0.019573
+vt 0.441895 0.019573
+vt 0.403502 0.023637
+vt 0.411241 0.023637
+vt 0.412690 0.027684
+vt 0.405045 0.027684
+vt 0.413908 0.031126
+vt 0.406344 0.031126
+vt 0.397470 0.027684
+vt 0.395839 0.023637
+vt 0.389968 0.027684
+vt 0.388257 0.023637
+vt 0.398843 0.031126
+vt 0.391407 0.031126
+vt 0.394193 0.019573
+vt 0.401943 0.019573
+vt 0.386531 0.019573
+vt 0.409779 0.019573
+vt 0.373346 0.023637
+vt 0.380759 0.023637
+vt 0.382541 0.027684
+vt 0.375191 0.027684
+vt 0.384041 0.031126
+vt 0.376745 0.031126
+vt 0.367919 0.027684
+vt 0.366017 0.023637
+vt 0.360725 0.027684
+vt 0.358775 0.023637
+vt 0.369519 0.031126
+vt 0.362367 0.031126
+vt 0.364098 0.019573
+vt 0.371483 0.019573
+vt 0.356808 0.019573
+vt 0.378961 0.019573
+vt 0.344553 0.023637
+vt 0.351621 0.023637
+vt 0.353612 0.027684
+vt 0.346577 0.027684
+vt 0.355288 0.031126
+vt 0.348282 0.031126
+vt 0.339622 0.027684
+vt 0.337570 0.023637
+vt 0.332746 0.027684
+vt 0.330673 0.023637
+vt 0.341350 0.031126
+vt 0.334491 0.031126
+vt 0.335501 0.019573
+vt 0.342510 0.019573
+vt 0.328583 0.019573
+vt 0.349612 0.019573
+vt 0.317130 0.023637
+vt 0.323860 0.023637
+vt 0.325948 0.027684
+vt 0.319226 0.027684
+vt 0.327706 0.031126
+vt 0.320992 0.031126
+vt 0.312580 0.027684
+vt 0.310481 0.023637
+vt 0.306009 0.027684
+vt 0.303911 0.023637
+vt 0.314349 0.031126
+vt 0.307776 0.031126
+vt 0.308364 0.019573
+vt 0.315017 0.019573
+vt 0.301796 0.019573
+vt 0.321755 0.019573
+vt 0.291001 0.023637
+vt 0.297418 0.023637
+vt 0.299510 0.027684
+vt 0.293082 0.027684
+vt 0.301272 0.031126
+vt 0.294835 0.031126
+vt 0.286723 0.027684
+vt 0.284658 0.023637
+vt 0.280431 0.027684
+vt 0.278385 0.023637
+vt 0.288463 0.031126
+vt 0.282156 0.031126
+vt 0.282576 0.019573
+vt 0.288905 0.019573
+vt 0.276323 0.019573
+vt 0.295311 0.019573
+vt 0.266043 0.023637
+vt 0.272181 0.023637
+vt 0.274204 0.027684
+vt 0.268041 0.027684
+vt 0.275911 0.031126
+vt 0.269726 0.031126
+vt 0.261939 0.027684
+vt 0.259970 0.023637
+vt 0.255897 0.027684
+vt 0.253958 0.023637
+vt 0.263600 0.031126
+vt 0.257531 0.031126
+vt 0.257986 0.019573
+vt 0.264030 0.019573
+vt 0.252006 0.019573
+vt 0.270141 0.019573
+vt 0.242113 0.023637
+vt 0.248007 0.023637
+vt 0.249911 0.027684
+vt 0.243981 0.027684
+vt 0.251517 0.031126
+vt 0.245556 0.031126
+vt 0.238103 0.027684
+vt 0.236273 0.023637
+vt 0.232277 0.027684
+vt 0.230487 0.023637
+vt 0.239647 0.031126
+vt 0.233787 0.031126
+vt 0.234430 0.019573
+vt 0.240231 0.019573
+vt 0.228685 0.019573
+vt 0.246089 0.019573
+vt 0.219065 0.023637
+vt 0.224752 0.023637
+vt 0.226500 0.027684
+vt 0.220770 0.027684
+vt 0.227974 0.031126
+vt 0.222208 0.031126
+vt 0.215085 0.027684
+vt 0.213425 0.023637
+vt 0.209443 0.027684
+vt 0.207829 0.023637
+vt 0.216485 0.031126
+vt 0.210804 0.031126
+vt 0.211753 0.019573
+vt 0.217349 0.019573
+vt 0.206204 0.019573
+vt 0.222992 0.019573
+vt 0.196763 0.023637
+vt 0.202276 0.023637
+vt 0.203842 0.027684
+vt 0.198281 0.027684
+vt 0.205164 0.031126
+vt 0.199563 0.031126
+vt 0.192758 0.027684
+vt 0.191289 0.023637
+vt 0.187271 0.027684
+vt 0.185851 0.023637
+vt 0.193998 0.031126
+vt 0.188469 0.031126
+vt 0.189810 0.019573
+vt 0.195234 0.019573
+vt 0.184423 0.019573
+vt 0.200698 0.019573
+vt 0.175088 0.023637
+vt 0.180449 0.023637
+vt 0.181818 0.027684
+vt 0.176405 0.027684
+vt 0.182973 0.031126
+vt 0.177517 0.031126
+vt 0.171041 0.027684
+vt 0.169775 0.023637
+vt 0.165730 0.027684
+vt 0.164517 0.023637
+vt 0.172109 0.031126
+vt 0.166755 0.031126
+vt 0.168502 0.019573
+vt 0.173762 0.019573
+vt 0.163295 0.019573
+vt 0.179072 0.019573
+vt 0.154479 0.023637
+vt 0.150290 0.023637
+vt 0.149213 0.019573
+vt 0.153359 0.019573
+vt 0.147049 0.023637
+vt 0.146005 0.019573
+vt 0.158150 0.019573
+vt 0.159319 0.023637
+vt 0.160481 0.027684
+vt 0.155591 0.027684
+vt 0.161462 0.031126
+vt 0.156531 0.031126
+vt 0.151360 0.027684
+vt 0.148087 0.027684
+vt 0.152264 0.031126
+vt 0.148964 0.031126
+vt 0.842612 0.034995
+vt 0.842217 0.036554
+vt 0.837225 0.036554
+vt 0.837636 0.034995
+vt 0.831867 0.036554
+vt 0.832296 0.034995
+vt 0.841687 0.038619
+vt 0.836673 0.038619
+vt 0.831291 0.038619
+vt 0.838073 0.033374
+vt 0.843030 0.033374
+vt 0.832751 0.033374
+vt 0.847319 0.033374
+vt 0.846917 0.034995
+vt 0.850637 0.033374
+vt 0.850248 0.034995
+vt 0.846537 0.036554
+vt 0.846026 0.038619
+vt 0.849879 0.036554
+vt 0.849384 0.038619
+vt 0.821440 0.034995
+vt 0.820976 0.036554
+vt 0.815457 0.036554
+vt 0.815938 0.034995
+vt 0.809899 0.036554
+vt 0.810396 0.034995
+vt 0.820355 0.038619
+vt 0.814814 0.038619
+vt 0.809234 0.038619
+vt 0.816450 0.033374
+vt 0.821933 0.033374
+vt 0.810927 0.033374
+vt 0.827369 0.033374
+vt 0.826895 0.034995
+vt 0.826448 0.036554
+vt 0.825850 0.038619
+vt 0.799213 0.034995
+vt 0.804822 0.034995
+vt 0.804308 0.036554
+vt 0.798684 0.036554
+vt 0.803623 0.038619
+vt 0.797978 0.038619
+vt 0.793023 0.036554
+vt 0.793568 0.034995
+vt 0.787326 0.036554
+vt 0.787886 0.034995
+vt 0.792298 0.038619
+vt 0.786581 0.038619
+vt 0.794153 0.033374
+vt 0.799780 0.033374
+vt 0.788487 0.033374
+vt 0.805371 0.033374
+vt 0.776402 0.034995
+vt 0.782164 0.034995
+vt 0.781590 0.036554
+vt 0.775814 0.036554
+vt 0.780827 0.038619
+vt 0.775034 0.038619
+vt 0.769996 0.036554
+vt 0.770597 0.034995
+vt 0.764134 0.036554
+vt 0.764747 0.034995
+vt 0.769199 0.038619
+vt 0.763322 0.038619
+vt 0.771245 0.033374
+vt 0.777035 0.033374
+vt 0.765411 0.033374
+vt 0.782782 0.033374
+vt 0.752909 0.034995
+vt 0.758852 0.034995
+vt 0.758227 0.036554
+vt 0.752273 0.036554
+vt 0.757401 0.038619
+vt 0.751434 0.038619
+vt 0.746271 0.036554
+vt 0.746917 0.034995
+vt 0.740219 0.036554
+vt 0.740873 0.034995
+vt 0.745420 0.038619
+vt 0.739357 0.038619
+vt 0.747620 0.033374
+vt 0.753600 0.033374
+vt 0.741588 0.033374
+vt 0.759529 0.033374
+vt 0.728627 0.034995
+vt 0.734777 0.034995
+vt 0.734115 0.036554
+vt 0.727957 0.036554
+vt 0.733244 0.038619
+vt 0.727079 0.038619
+vt 0.721745 0.036554
+vt 0.722421 0.034995
+vt 0.715477 0.036554
+vt 0.716157 0.034995
+vt 0.720860 0.038619
+vt 0.714587 0.038619
+vt 0.723163 0.033374
+vt 0.729361 0.033374
+vt 0.716906 0.033374
+vt 0.735502 0.033374
+vt 0.703450 0.034995
+vt 0.709834 0.034995
+vt 0.709150 0.036554
+vt 0.702765 0.036554
+vt 0.708258 0.038619
+vt 0.701872 0.038619
+vt 0.696319 0.036554
+vt 0.697005 0.034995
+vt 0.689812 0.036554
+vt 0.690497 0.034995
+vt 0.695427 0.038619
+vt 0.688923 0.038619
+vt 0.697767 0.033374
+vt 0.704210 0.033374
+vt 0.691260 0.033374
+vt 0.710589 0.033374
+vt 0.677286 0.034995
+vt 0.683924 0.034995
+vt 0.683242 0.036554
+vt 0.676608 0.036554
+vt 0.682358 0.038619
+vt 0.675731 0.038619
+vt 0.669910 0.036554
+vt 0.670582 0.034995
+vt 0.663147 0.036554
+vt 0.663811 0.034995
+vt 0.669042 0.038619
+vt 0.662291 0.038619
+vt 0.671337 0.033374
+vt 0.678046 0.033374
+vt 0.664559 0.033374
+vt 0.684686 0.033374
+vt 0.650066 0.034995
+vt 0.656972 0.034995
+vt 0.656318 0.036554
+vt 0.649424 0.036554
+vt 0.655477 0.038619
+vt 0.648599 0.038619
+vt 0.642464 0.036554
+vt 0.643093 0.034995
+vt 0.635439 0.036554
+vt 0.636052 0.034995
+vt 0.641659 0.038619
+vt 0.634656 0.038619
+vt 0.643808 0.033374
+vt 0.650795 0.033374
+vt 0.636751 0.033374
+vt 0.657712 0.033374
+vt 0.621770 0.034995
+vt 0.628944 0.034995
+vt 0.628349 0.036554
+vt 0.621196 0.036554
+vt 0.627591 0.038619
+vt 0.620465 0.038619
+vt 0.613980 0.036554
+vt 0.614532 0.034995
+vt 0.606703 0.036554
+vt 0.607231 0.034995
+vt 0.613279 0.038619
+vt 0.606034 0.038619
+vt 0.615168 0.033374
+vt 0.622430 0.033374
+vt 0.607840 0.033374
+vt 0.629625 0.033374
+vt 0.592445 0.034995
+vt 0.599867 0.034995
+vt 0.599366 0.036554
+vt 0.591973 0.036554
+vt 0.598732 0.038619
+vt 0.591376 0.038619
+vt 0.584525 0.036554
+vt 0.584966 0.034995
+vt 0.577026 0.036554
+vt 0.577434 0.034995
+vt 0.583968 0.038619
+vt 0.576511 0.038619
+vt 0.585479 0.033374
+vt 0.592993 0.033374
+vt 0.577910 0.033374
+vt 0.600447 0.033374
+vt 0.562222 0.034995
+vt 0.569852 0.034995
+vt 0.569478 0.036554
+vt 0.561885 0.036554
+vt 0.569008 0.038619
+vt 0.561462 0.038619
+vt 0.554253 0.036554
+vt 0.554552 0.034995
+vt 0.546584 0.036554
+vt 0.546843 0.034995
+vt 0.553878 0.038619
+vt 0.546259 0.038619
+vt 0.554902 0.033374
+vt 0.562617 0.033374
+vt 0.547147 0.033374
+vt 0.570288 0.033374
+vt 0.531331 0.034995
+vt 0.539101 0.034995
+vt 0.538883 0.036554
+vt 0.531155 0.036554
+vt 0.538610 0.038619
+vt 0.530935 0.038619
+vt 0.523405 0.036554
+vt 0.523538 0.034995
+vt 0.515640 0.036554
+vt 0.515728 0.034995
+vt 0.523240 0.038619
+vt 0.515529 0.038619
+vt 0.523695 0.033374
+vt 0.531538 0.033374
+vt 0.515833 0.033374
+vt 0.539357 0.033374
+vt 0.500080 0.034995
+vt 0.507907 0.034995
+vt 0.507863 0.036554
+vt 0.500080 0.036554
+vt 0.507807 0.038619
+vt 0.500080 0.038619
+vt 0.492297 0.036554
+vt 0.492253 0.034995
+vt 0.484520 0.036554
+vt 0.484431 0.034995
+vt 0.492353 0.038619
+vt 0.484631 0.038619
+vt 0.492200 0.033374
+vt 0.500080 0.033374
+vt 0.484327 0.033374
+vt 0.507960 0.033374
+vt 0.468829 0.034995
+vt 0.476622 0.034995
+vt 0.476754 0.036554
+vt 0.469005 0.036554
+vt 0.476920 0.038619
+vt 0.469225 0.038619
+vt 0.461277 0.036554
+vt 0.461059 0.034995
+vt 0.453576 0.036554
+vt 0.453317 0.034995
+vt 0.461550 0.038619
+vt 0.453901 0.038619
+vt 0.460803 0.033374
+vt 0.468622 0.033374
+vt 0.453013 0.033374
+vt 0.476465 0.033374
+vt 0.437937 0.034995
+vt 0.445608 0.034995
+vt 0.445907 0.036554
+vt 0.438275 0.036554
+vt 0.446282 0.038619
+vt 0.438698 0.038619
+vt 0.430682 0.036554
+vt 0.430309 0.034995
+vt 0.423134 0.036554
+vt 0.422726 0.034995
+vt 0.431152 0.038619
+vt 0.423649 0.038619
+vt 0.429872 0.033374
+vt 0.437543 0.033374
+vt 0.422250 0.033374
+vt 0.445258 0.033374
+vt 0.407715 0.034995
+vt 0.415194 0.034995
+vt 0.415635 0.036554
+vt 0.408187 0.036554
+vt 0.416192 0.038619
+vt 0.408784 0.038619
+vt 0.400794 0.036554
+vt 0.400293 0.034995
+vt 0.393457 0.036554
+vt 0.392929 0.034995
+vt 0.401428 0.038619
+vt 0.394126 0.038619
+vt 0.399713 0.033374
+vt 0.407167 0.033374
+vt 0.392320 0.033374
+vt 0.414680 0.033374
+vt 0.378390 0.034995
+vt 0.385628 0.034995
+vt 0.386180 0.036554
+vt 0.378964 0.036554
+vt 0.386881 0.038619
+vt 0.379695 0.038619
+vt 0.371811 0.036554
+vt 0.371216 0.034995
+vt 0.364721 0.036554
+vt 0.364108 0.034995
+vt 0.372569 0.038619
+vt 0.365504 0.038619
+vt 0.370535 0.033374
+vt 0.377730 0.033374
+vt 0.363409 0.033374
+vt 0.384992 0.033374
+vt 0.350094 0.034995
+vt 0.357067 0.034995
+vt 0.357696 0.036554
+vt 0.350736 0.036554
+vt 0.358501 0.038619
+vt 0.351560 0.038619
+vt 0.343842 0.036554
+vt 0.343188 0.034995
+vt 0.337013 0.036554
+vt 0.336349 0.034995
+vt 0.344683 0.038619
+vt 0.337869 0.038619
+vt 0.342448 0.033374
+vt 0.349365 0.033374
+vt 0.335601 0.033374
+vt 0.356352 0.033374
+vt 0.322874 0.034995
+vt 0.329578 0.034995
+vt 0.330250 0.036554
+vt 0.323552 0.036554
+vt 0.331118 0.038619
+vt 0.324429 0.038619
+vt 0.316918 0.036554
+vt 0.316236 0.034995
+vt 0.310348 0.036554
+vt 0.309663 0.034995
+vt 0.317802 0.038619
+vt 0.311237 0.038619
+vt 0.315474 0.033374
+vt 0.322114 0.033374
+vt 0.308900 0.033374
+vt 0.328823 0.033374
+vt 0.296710 0.034995
+vt 0.303155 0.034995
+vt 0.303841 0.036554
+vt 0.297395 0.036554
+vt 0.304733 0.038619
+vt 0.298288 0.038619
+vt 0.291010 0.036554
+vt 0.290326 0.034995
+vt 0.284683 0.036554
+vt 0.284003 0.034995
+vt 0.291902 0.038619
+vt 0.285573 0.038619
+vt 0.289571 0.033374
+vt 0.295950 0.033374
+vt 0.283254 0.033374
+vt 0.302393 0.033374
+vt 0.271533 0.034995
+vt 0.277739 0.034995
+vt 0.278415 0.036554
+vt 0.272203 0.036554
+vt 0.279300 0.038619
+vt 0.273081 0.038619
+vt 0.266045 0.036554
+vt 0.265383 0.034995
+vt 0.259941 0.036554
+vt 0.259287 0.034995
+vt 0.266916 0.038619
+vt 0.260803 0.038619
+vt 0.264658 0.033374
+vt 0.270799 0.033374
+vt 0.258572 0.033374
+vt 0.276997 0.033374
+vt 0.247251 0.034995
+vt 0.253243 0.034995
+vt 0.253889 0.036554
+vt 0.247887 0.036554
+vt 0.254740 0.038619
+vt 0.248726 0.038619
+vt 0.241933 0.036554
+vt 0.241308 0.034995
+vt 0.236026 0.036554
+vt 0.235413 0.034995
+vt 0.242759 0.038619
+vt 0.236838 0.038619
+vt 0.240631 0.033374
+vt 0.246560 0.033374
+vt 0.234749 0.033374
+vt 0.252540 0.033374
+vt 0.223758 0.034995
+vt 0.229563 0.034995
+vt 0.230164 0.036554
+vt 0.224346 0.036554
+vt 0.230961 0.038619
+vt 0.225126 0.038619
+vt 0.218570 0.036554
+vt 0.217996 0.034995
+vt 0.212834 0.036554
+vt 0.212274 0.034995
+vt 0.219333 0.038619
+vt 0.213578 0.038619
+vt 0.217378 0.033374
+vt 0.223125 0.033374
+vt 0.211673 0.033374
+vt 0.228914 0.033374
+vt 0.200947 0.034995
+vt 0.206592 0.034995
+vt 0.207137 0.036554
+vt 0.201476 0.036554
+vt 0.207862 0.038619
+vt 0.202182 0.038619
+vt 0.195852 0.036554
+vt 0.195338 0.034995
+vt 0.190261 0.036554
+vt 0.189764 0.034995
+vt 0.196537 0.038619
+vt 0.190926 0.038619
+vt 0.194789 0.033374
+vt 0.200380 0.033374
+vt 0.189233 0.033374
+vt 0.206007 0.033374
+vt 0.178720 0.034995
+vt 0.184222 0.034995
+vt 0.184703 0.036554
+vt 0.179184 0.036554
+vt 0.185346 0.038619
+vt 0.179805 0.038619
+vt 0.173712 0.036554
+vt 0.173265 0.034995
+vt 0.168293 0.036554
+vt 0.167864 0.034995
+vt 0.174310 0.038619
+vt 0.168869 0.038619
+vt 0.172791 0.033374
+vt 0.178227 0.033374
+vt 0.167409 0.033374
+vt 0.183710 0.033374
+vt 0.157548 0.034995
+vt 0.153243 0.034995
+vt 0.152841 0.033374
+vt 0.157130 0.033374
+vt 0.149912 0.034995
+vt 0.149523 0.033374
+vt 0.162087 0.033374
+vt 0.162524 0.034995
+vt 0.162935 0.036554
+vt 0.157943 0.036554
+vt 0.163487 0.038619
+vt 0.158473 0.038619
+vt 0.153623 0.036554
+vt 0.150281 0.036554
+vt 0.154134 0.038619
+vt 0.150776 0.038619
+vt 0.839897 0.045456
+vt 0.838935 0.049221
+vt 0.833807 0.049221
+vt 0.834809 0.045456
+vt 0.828306 0.049221
+vt 0.829349 0.045456
+vt 0.835816 0.041754
+vt 0.840864 0.041754
+vt 0.830398 0.041754
+vt 0.845233 0.041754
+vt 0.844301 0.045456
+vt 0.848614 0.041754
+vt 0.847708 0.045456
+vt 0.843374 0.049221
+vt 0.846808 0.049221
+vt 0.818259 0.045456
+vt 0.817133 0.049221
+vt 0.811478 0.049221
+vt 0.812643 0.045456
+vt 0.805786 0.049221
+vt 0.806991 0.045456
+vt 0.813816 0.041754
+vt 0.819391 0.041754
+vt 0.808203 0.041754
+vt 0.824921 0.041754
+vt 0.823830 0.045456
+vt 0.822745 0.049221
+vt 0.795595 0.045456
+vt 0.801308 0.045456
+vt 0.800066 0.049221
+vt 0.794315 0.049221
+vt 0.788534 0.049221
+vt 0.789849 0.045456
+vt 0.782720 0.049221
+vt 0.784069 0.045456
+vt 0.791171 0.041754
+vt 0.796882 0.041754
+vt 0.785426 0.041754
+vt 0.802558 0.041754
+vt 0.772403 0.045456
+vt 0.778254 0.045456
+vt 0.776872 0.049221
+vt 0.770990 0.049221
+vt 0.765072 0.049221
+vt 0.766513 0.045456
+vt 0.759116 0.049221
+vt 0.760585 0.045456
+vt 0.767964 0.041754
+vt 0.773824 0.041754
+vt 0.762063 0.041754
+vt 0.779644 0.041754
+vt 0.748606 0.045456
+vt 0.754616 0.045456
+vt 0.753122 0.049221
+vt 0.747088 0.049221
+vt 0.741013 0.049221
+vt 0.742552 0.045456
+vt 0.734896 0.049221
+vt 0.736454 0.045456
+vt 0.744101 0.041754
+vt 0.750133 0.041754
+vt 0.738022 0.041754
+vt 0.756120 0.041754
+vt 0.724120 0.045456
+vt 0.730310 0.045456
+vt 0.728736 0.049221
+vt 0.722532 0.049221
+vt 0.716283 0.049221
+vt 0.717881 0.045456
+vt 0.709988 0.049221
+vt 0.711594 0.045456
+vt 0.719490 0.041754
+vt 0.725717 0.041754
+vt 0.713210 0.041754
+vt 0.731894 0.041754
+vt 0.698867 0.045456
+vt 0.705256 0.045456
+vt 0.703646 0.049221
+vt 0.697255 0.049221
+vt 0.690817 0.049221
+vt 0.692426 0.045456
+vt 0.684329 0.049221
+vt 0.685933 0.045456
+vt 0.694046 0.041754
+vt 0.700489 0.041754
+vt 0.687547 0.041754
+vt 0.706877 0.041754
+vt 0.672784 0.045456
+vt 0.679385 0.045456
+vt 0.677792 0.049221
+vt 0.671204 0.049221
+vt 0.664566 0.049221
+vt 0.666128 0.045456
+vt 0.657878 0.049221
+vt 0.659418 0.045456
+vt 0.667701 0.041754
+vt 0.674375 0.041754
+vt 0.660969 0.041754
+vt 0.680990 0.041754
+vt 0.645832 0.045456
+vt 0.652652 0.045456
+vt 0.651139 0.049221
+vt 0.644349 0.049221
+vt 0.637510 0.049221
+vt 0.638958 0.045456
+vt 0.630621 0.049221
+vt 0.632029 0.045456
+vt 0.640416 0.041754
+vt 0.647326 0.041754
+vt 0.633447 0.041754
+vt 0.654177 0.041754
+vt 0.618012 0.045456
+vt 0.625047 0.045456
+vt 0.623684 0.049221
+vt 0.616699 0.049221
+vt 0.609667 0.049221
+vt 0.610927 0.045456
+vt 0.602590 0.049221
+vt 0.603791 0.045456
+vt 0.612196 0.041754
+vt 0.619336 0.041754
+vt 0.605001 0.041754
+vt 0.626420 0.041754
+vt 0.589378 0.045456
+vt 0.596608 0.045456
+vt 0.595470 0.049221
+vt 0.588307 0.049221
+vt 0.581106 0.049221
+vt 0.582104 0.045456
+vt 0.573867 0.049221
+vt 0.574789 0.045456
+vt 0.583110 0.041754
+vt 0.590456 0.041754
+vt 0.575718 0.041754
+vt 0.597754 0.041754
+vt 0.560045 0.045456
+vt 0.567435 0.045456
+vt 0.566593 0.049221
+vt 0.559287 0.049221
+vt 0.551952 0.049221
+vt 0.552624 0.045456
+vt 0.544591 0.049221
+vt 0.545173 0.045456
+vt 0.553300 0.041754
+vt 0.560810 0.041754
+vt 0.545759 0.041754
+vt 0.568284 0.041754
+vt 0.530199 0.045456
+vt 0.537697 0.045456
+vt 0.537208 0.049221
+vt 0.529805 0.049221
+vt 0.522388 0.049221
+vt 0.522685 0.045456
+vt 0.514958 0.049221
+vt 0.515157 0.045456
+vt 0.522984 0.041754
+vt 0.530596 0.041754
+vt 0.515357 0.041754
+vt 0.538189 0.041754
+vt 0.500080 0.045456
+vt 0.507621 0.045456
+vt 0.507521 0.049221
+vt 0.500080 0.049221
+vt 0.492639 0.049221
+vt 0.492539 0.045456
+vt 0.485202 0.049221
+vt 0.485003 0.045456
+vt 0.492439 0.041754
+vt 0.500080 0.041754
+vt 0.484802 0.041754
+vt 0.507721 0.041754
+vt 0.469961 0.045456
+vt 0.477475 0.045456
+vt 0.477772 0.049221
+vt 0.470354 0.049221
+vt 0.462952 0.049221
+vt 0.462463 0.045456
+vt 0.455569 0.049221
+vt 0.454987 0.045456
+vt 0.461971 0.041754
+vt 0.469564 0.041754
+vt 0.454401 0.041754
+vt 0.477176 0.041754
+vt 0.440115 0.045456
+vt 0.447536 0.045456
+vt 0.448208 0.049221
+vt 0.440873 0.049221
+vt 0.433567 0.049221
+vt 0.432725 0.045456
+vt 0.426293 0.049221
+vt 0.425371 0.045456
+vt 0.431876 0.041754
+vt 0.439350 0.041754
+vt 0.424442 0.041754
+vt 0.446860 0.041754
+vt 0.410782 0.045456
+vt 0.418056 0.045456
+vt 0.419054 0.049221
+vt 0.411852 0.049221
+vt 0.404690 0.049221
+vt 0.403552 0.045456
+vt 0.397570 0.049221
+vt 0.396369 0.045456
+vt 0.402406 0.041754
+vt 0.409704 0.041754
+vt 0.395159 0.041754
+vt 0.417050 0.041754
+vt 0.382148 0.045456
+vt 0.389233 0.045456
+vt 0.390493 0.049221
+vt 0.383461 0.049221
+vt 0.376476 0.049221
+vt 0.375113 0.045456
+vt 0.369538 0.049221
+vt 0.368131 0.045456
+vt 0.373740 0.041754
+vt 0.380824 0.041754
+vt 0.366713 0.041754
+vt 0.387964 0.041754
+vt 0.354328 0.045456
+vt 0.361202 0.045456
+vt 0.362650 0.049221
+vt 0.355811 0.049221
+vt 0.349021 0.049221
+vt 0.347508 0.045456
+vt 0.342282 0.049221
+vt 0.340742 0.045456
+vt 0.345983 0.041754
+vt 0.352834 0.041754
+vt 0.339191 0.041754
+vt 0.359744 0.041754
+vt 0.327376 0.045456
+vt 0.334032 0.045456
+vt 0.335594 0.049221
+vt 0.328956 0.049221
+vt 0.322368 0.049221
+vt 0.320775 0.045456
+vt 0.315831 0.049221
+vt 0.314227 0.045456
+vt 0.319170 0.041754
+vt 0.325785 0.041754
+vt 0.312613 0.041754
+vt 0.332459 0.041754
+vt 0.301293 0.045456
+vt 0.307734 0.045456
+vt 0.309343 0.049221
+vt 0.302904 0.049221
+vt 0.296514 0.049221
+vt 0.294904 0.045456
+vt 0.290172 0.049221
+vt 0.288566 0.045456
+vt 0.293283 0.041754
+vt 0.299671 0.041754
+vt 0.286950 0.041754
+vt 0.306114 0.041754
+vt 0.276040 0.045456
+vt 0.282279 0.045456
+vt 0.283877 0.049221
+vt 0.277628 0.049221
+vt 0.271424 0.049221
+vt 0.269850 0.045456
+vt 0.265264 0.049221
+vt 0.263706 0.045456
+vt 0.268266 0.041754
+vt 0.274443 0.041754
+vt 0.262139 0.041754
+vt 0.280670 0.041754
+vt 0.251554 0.045456
+vt 0.257608 0.045456
+vt 0.259147 0.049221
+vt 0.253072 0.049221
+vt 0.247038 0.049221
+vt 0.245544 0.045456
+vt 0.241044 0.049221
+vt 0.239575 0.045456
+vt 0.244040 0.041754
+vt 0.250027 0.041754
+vt 0.238097 0.041754
+vt 0.256059 0.041754
+vt 0.227757 0.045456
+vt 0.233647 0.045456
+vt 0.235088 0.049221
+vt 0.229170 0.049221
+vt 0.223288 0.049221
+vt 0.221906 0.045456
+vt 0.217440 0.049221
+vt 0.216091 0.045456
+vt 0.220516 0.041754
+vt 0.226336 0.041754
+vt 0.214734 0.041754
+vt 0.232196 0.041754
+vt 0.204565 0.045456
+vt 0.210311 0.045456
+vt 0.211626 0.049221
+vt 0.205845 0.049221
+vt 0.200094 0.049221
+vt 0.198852 0.045456
+vt 0.194374 0.049221
+vt 0.193169 0.045456
+vt 0.197602 0.041754
+vt 0.203278 0.041754
+vt 0.191957 0.041754
+vt 0.208989 0.041754
+vt 0.181901 0.045456
+vt 0.187516 0.045456
+vt 0.188682 0.049221
+vt 0.183027 0.049221
+vt 0.177415 0.049221
+vt 0.176330 0.045456
+vt 0.171854 0.049221
+vt 0.170811 0.045456
+vt 0.175239 0.041754
+vt 0.180769 0.041754
+vt 0.169762 0.041754
+vt 0.186344 0.041754
+vt 0.160263 0.045456
+vt 0.155859 0.045456
+vt 0.154927 0.041754
+vt 0.159296 0.041754
+vt 0.152452 0.045456
+vt 0.151547 0.041754
+vt 0.164344 0.041754
+vt 0.165351 0.045456
+vt 0.166353 0.049221
+vt 0.161225 0.049221
+vt 0.156786 0.049221
+vt 0.153352 0.049221
+vt 0.149234 0.045456
+vt 0.148771 0.045456
+vt 0.147894 0.041754
+vt 0.148354 0.041754
+vt 0.147149 0.038619
+vt 0.147606 0.038619
+vt 0.148634 0.045456
+vt 0.147758 0.041754
+vt 0.147013 0.038619
+vt 0.149464 0.041754
+vt 0.150352 0.045456
+vt 0.148708 0.038619
+vt 0.151236 0.049221
+vt 0.150110 0.049221
+vt 0.149643 0.049221
+vt 0.149506 0.049221
+vt 0.146769 0.034995
+vt 0.146316 0.034995
+vt 0.145941 0.033374
+vt 0.146391 0.033374
+vt 0.145400 0.031126
+vt 0.145849 0.031126
+vt 0.146183 0.034995
+vt 0.145809 0.033374
+vt 0.145269 0.031126
+vt 0.147479 0.033374
+vt 0.147861 0.034995
+vt 0.146931 0.031126
+vt 0.148222 0.036554
+vt 0.147125 0.036554
+vt 0.146671 0.036554
+vt 0.146537 0.036554
+vt 0.143987 0.023637
+vt 0.143544 0.023637
+vt 0.142530 0.019573
+vt 0.142971 0.019573
+vt 0.141663 0.016080
+vt 0.142101 0.016080
+vt 0.143411 0.023637
+vt 0.142397 0.019573
+vt 0.141530 0.016080
+vt 0.144026 0.019573
+vt 0.145052 0.023637
+vt 0.143148 0.016080
+vt 0.146071 0.027684
+vt 0.144997 0.027684
+vt 0.144551 0.027684
+vt 0.144419 0.027684
+vt 0.141177 0.012284
+vt 0.140975 0.011401
+vt 0.142008 0.011401
+vt 0.142213 0.012284
+vt 0.140848 0.010808
+vt 0.141878 0.010808
+vt 0.142568 0.013747
+vt 0.141527 0.013747
+vt 0.141092 0.013747
+vt 0.140744 0.012284
+vt 0.140960 0.013747
+vt 0.140614 0.012284
+vt 0.140545 0.011401
+vt 0.140420 0.010808
+vt 0.140416 0.011401
+vt 0.140294 0.010808
+vt 0.850926 0.045456
+vt 0.851389 0.045456
+vt 0.850517 0.049221
+vt 0.850050 0.049221
+vt 0.849786 0.052543
+vt 0.849317 0.052543
+vt 0.851526 0.045456
+vt 0.850654 0.049221
+vt 0.849924 0.052543
+vt 0.848924 0.049221
+vt 0.849808 0.045456
+vt 0.848183 0.052543
+vt 0.850696 0.041754
+vt 0.851806 0.041754
+vt 0.851452 0.038619
+vt 0.852554 0.038619
+vt 0.852266 0.041754
+vt 0.852402 0.041754
+vt 0.853011 0.038619
+vt 0.853147 0.038619
+vt 0.853391 0.034995
+vt 0.853844 0.034995
+vt 0.853489 0.036554
+vt 0.853035 0.036554
+vt 0.853977 0.034995
+vt 0.853623 0.036554
+vt 0.851938 0.036554
+vt 0.852299 0.034995
+vt 0.852681 0.033374
+vt 0.853769 0.033374
+vt 0.853229 0.031126
+vt 0.854311 0.031126
+vt 0.854219 0.033374
+vt 0.854351 0.033374
+vt 0.854760 0.031126
+vt 0.854891 0.031126
+vt 0.856173 0.023637
+vt 0.856616 0.023637
+vt 0.855609 0.027684
+vt 0.855163 0.027684
+vt 0.856749 0.023637
+vt 0.855741 0.027684
+vt 0.854089 0.027684
+vt 0.855108 0.023637
+vt 0.856134 0.019573
+vt 0.857189 0.019573
+vt 0.857630 0.019573
+vt 0.857762 0.019573
+vt 0.848615 0.056748
+vt 0.848514 0.058425
+vt 0.847371 0.058425
+vt 0.847474 0.056748
+vt 0.847722 0.054920
+vt 0.848861 0.054920
+vt 0.849333 0.054920
+vt 0.849089 0.056748
+vt 0.849471 0.054920
+vt 0.849229 0.056748
+vt 0.848989 0.058425
+vt 0.849129 0.058425
+vt 0.354981 0.972497
+vt 0.354996 0.976560
+vt 0.346662 0.976568
+vt 0.346649 0.972507
+vt 0.338321 0.976575
+vt 0.338311 0.972515
+vt 0.355023 0.980551
+vt 0.346685 0.980558
+vt 0.338340 0.980563
+vt 0.346643 0.968397
+vt 0.354974 0.968386
+vt 0.346641 0.964264
+vt 0.354972 0.964251
+vt 0.338306 0.968407
+vt 0.338304 0.964275
+vt 0.363298 0.968373
+vt 0.363306 0.972486
+vt 0.371614 0.968359
+vt 0.371623 0.972474
+vt 0.363295 0.964237
+vt 0.371611 0.964221
+vt 0.363323 0.976550
+vt 0.363354 0.980543
+vt 0.371642 0.976540
+vt 0.371677 0.980535
+vt 0.388229 0.972446
+vt 0.388253 0.976517
+vt 0.379952 0.976529
+vt 0.379931 0.972460
+vt 0.388295 0.980516
+vt 0.379991 0.980526
+vt 0.379921 0.968344
+vt 0.388219 0.968328
+vt 0.379917 0.964204
+vt 0.388215 0.964186
+vt 0.396507 0.968311
+vt 0.396518 0.972432
+vt 0.404785 0.968294
+vt 0.404797 0.972417
+vt 0.396502 0.964167
+vt 0.404780 0.964148
+vt 0.396544 0.976505
+vt 0.396589 0.980506
+vt 0.404824 0.976492
+vt 0.404873 0.980496
+vt 0.421325 0.972388
+vt 0.421355 0.976468
+vt 0.413095 0.976480
+vt 0.413066 0.972403
+vt 0.421409 0.980475
+vt 0.413146 0.980485
+vt 0.413053 0.968278
+vt 0.421311 0.968261
+vt 0.413048 0.964129
+vt 0.421306 0.964110
+vt 0.429560 0.968245
+vt 0.429574 0.972374
+vt 0.437799 0.968229
+vt 0.437814 0.972361
+vt 0.429554 0.964092
+vt 0.437794 0.964075
+vt 0.429606 0.976456
+vt 0.429662 0.980466
+vt 0.437847 0.976444
+vt 0.437906 0.980456
+vt 0.454269 0.972337
+vt 0.454303 0.976424
+vt 0.446079 0.976434
+vt 0.446045 0.972348
+vt 0.454366 0.980440
+vt 0.446140 0.980448
+vt 0.446030 0.968215
+vt 0.454253 0.968202
+vt 0.446024 0.964059
+vt 0.454247 0.964044
+vt 0.462468 0.968191
+vt 0.462485 0.972327
+vt 0.470678 0.968181
+vt 0.470695 0.972319
+vt 0.462462 0.964031
+vt 0.470672 0.964020
+vt 0.462520 0.976416
+vt 0.462584 0.980433
+vt 0.470731 0.976409
+vt 0.470796 0.980427
+vt 0.487100 0.972306
+vt 0.487137 0.976398
+vt 0.478936 0.976403
+vt 0.478900 0.972312
+vt 0.487204 0.980418
+vt 0.479002 0.980422
+vt 0.478883 0.968173
+vt 0.487083 0.968167
+vt 0.478876 0.964012
+vt 0.487077 0.964005
+vt 0.495281 0.968164
+vt 0.495298 0.972303
+vt 0.503478 0.968162
+vt 0.503495 0.972302
+vt 0.495275 0.964001
+vt 0.503471 0.963999
+vt 0.495336 0.976395
+vt 0.495402 0.980416
+vt 0.503532 0.976394
+vt 0.503599 0.980414
+vt 0.519889 0.972304
+vt 0.519926 0.976396
+vt 0.511729 0.976394
+vt 0.511691 0.972302
+vt 0.519992 0.980416
+vt 0.511795 0.980415
+vt 0.511674 0.968162
+vt 0.519872 0.968165
+vt 0.511668 0.964000
+vt 0.519866 0.964003
+vt 0.528072 0.968170
+vt 0.528088 0.972308
+vt 0.536275 0.968177
+vt 0.536291 0.972314
+vt 0.528065 0.964008
+vt 0.536269 0.964016
+vt 0.528125 0.976399
+vt 0.528190 0.980418
+vt 0.536327 0.976404
+vt 0.536391 0.980422
+vt 0.552713 0.972330
+vt 0.552747 0.976418
+vt 0.544534 0.976410
+vt 0.544499 0.972321
+vt 0.552808 0.980433
+vt 0.544597 0.980427
+vt 0.544483 0.968185
+vt 0.552697 0.968196
+vt 0.544477 0.964026
+vt 0.552691 0.964038
+vt 0.560917 0.968207
+vt 0.560933 0.972341
+vt 0.569146 0.968221
+vt 0.569160 0.972352
+vt 0.560912 0.964051
+vt 0.569140 0.964066
+vt 0.560966 0.976426
+vt 0.561025 0.980440
+vt 0.569192 0.976436
+vt 0.569250 0.980448
+vt 0.585641 0.972377
+vt 0.585670 0.976457
+vt 0.577427 0.976446
+vt 0.577396 0.972364
+vt 0.585723 0.980465
+vt 0.577482 0.980456
+vt 0.577382 0.968235
+vt 0.585628 0.968250
+vt 0.577377 0.964082
+vt 0.585623 0.964100
+vt 0.593882 0.968266
+vt 0.593895 0.972391
+vt 0.602147 0.968282
+vt 0.602159 0.972405
+vt 0.593877 0.964118
+vt 0.602142 0.964136
+vt 0.593923 0.976468
+vt 0.593972 0.980474
+vt 0.602185 0.976480
+vt 0.602231 0.980483
+vt 0.618715 0.972432
+vt 0.618737 0.976503
+vt 0.610456 0.976492
+vt 0.610432 0.972419
+vt 0.618777 0.980502
+vt 0.610500 0.980493
+vt 0.610421 0.968298
+vt 0.618705 0.968314
+vt 0.610417 0.964154
+vt 0.618701 0.964172
+vt 0.626998 0.968329
+vt 0.627007 0.972446
+vt 0.635300 0.968344
+vt 0.635309 0.972458
+vt 0.626994 0.964189
+vt 0.635297 0.964206
+vt 0.627028 0.976514
+vt 0.627064 0.980511
+vt 0.635327 0.976525
+vt 0.635359 0.980519
+vt 0.651936 0.972481
+vt 0.651950 0.976543
+vt 0.643634 0.976535
+vt 0.643618 0.972470
+vt 0.651975 0.980535
+vt 0.643663 0.980527
+vt 0.643611 0.968358
+vt 0.651930 0.968370
+vt 0.643608 0.964221
+vt 0.651927 0.964235
+vt 0.660255 0.968381
+vt 0.660261 0.972490
+vt 0.668587 0.968390
+vt 0.668591 0.972498
+vt 0.660253 0.964247
+vt 0.668585 0.964258
+vt 0.660272 0.976551
+vt 0.660293 0.980541
+vt 0.668600 0.976558
+vt 0.668617 0.980546
+vt 0.685266 0.972508
+vt 0.685270 0.976567
+vt 0.676934 0.976563
+vt 0.676927 0.972504
+vt 0.685278 0.980554
+vt 0.676946 0.980550
+vt 0.676924 0.968397
+vt 0.685264 0.968402
+vt 0.676923 0.964266
+vt 0.685263 0.964272
+vt 0.693607 0.968405
+vt 0.693608 0.972511
+vt 0.701952 0.968406
+vt 0.701951 0.972512
+vt 0.693607 0.964275
+vt 0.701952 0.964277
+vt 0.693610 0.976569
+vt 0.693613 0.980555
+vt 0.701951 0.976570
+vt 0.701949 0.980556
+vt 0.718636 0.972508
+vt 0.718631 0.976567
+vt 0.710291 0.976569
+vt 0.710294 0.972511
+vt 0.718621 0.980554
+vt 0.710286 0.980555
+vt 0.710296 0.968405
+vt 0.718639 0.968402
+vt 0.710296 0.964275
+vt 0.718640 0.964272
+vt 0.726979 0.968397
+vt 0.726976 0.972504
+vt 0.735316 0.968390
+vt 0.735311 0.972498
+vt 0.726981 0.964266
+vt 0.735318 0.964258
+vt 0.726968 0.976563
+vt 0.726953 0.980550
+vt 0.735301 0.976558
+vt 0.735282 0.980546
+vt 0.751966 0.972481
+vt 0.751951 0.976544
+vt 0.743629 0.976551
+vt 0.743642 0.972490
+vt 0.751925 0.980535
+vt 0.743606 0.980541
+vt 0.743648 0.968381
+vt 0.751973 0.968370
+vt 0.743650 0.964247
+vt 0.751976 0.964235
+vt 0.760292 0.968358
+vt 0.760284 0.972470
+vt 0.768603 0.968344
+vt 0.768594 0.972458
+vt 0.760295 0.964221
+vt 0.768606 0.964206
+vt 0.760267 0.976535
+vt 0.760236 0.980528
+vt 0.768575 0.976525
+vt 0.768540 0.980520
+vt 0.785188 0.972433
+vt 0.785165 0.976503
+vt 0.776874 0.976514
+vt 0.776895 0.972446
+vt 0.785123 0.980502
+vt 0.776836 0.980511
+vt 0.776905 0.968330
+vt 0.785199 0.968314
+vt 0.776909 0.964190
+vt 0.785203 0.964172
+vt 0.793482 0.968298
+vt 0.793471 0.972419
+vt 0.801757 0.968282
+vt 0.801744 0.972405
+vt 0.793487 0.964154
+vt 0.801761 0.964136
+vt 0.793446 0.976492
+vt 0.793401 0.980493
+vt 0.801718 0.976480
+vt 0.801669 0.980483
+vt 0.818262 0.972377
+vt 0.818232 0.976457
+vt 0.809979 0.976468
+vt 0.810008 0.972391
+vt 0.818178 0.980465
+vt 0.809928 0.980474
+vt 0.810021 0.968266
+vt 0.818276 0.968250
+vt 0.810026 0.964118
+vt 0.818281 0.964100
+vt 0.826521 0.968235
+vt 0.826507 0.972364
+vt 0.834758 0.968221
+vt 0.834743 0.972352
+vt 0.826527 0.964082
+vt 0.834764 0.964066
+vt 0.826476 0.976446
+vt 0.826419 0.980456
+vt 0.834710 0.976436
+vt 0.834652 0.980448
+vt 0.851191 0.972331
+vt 0.851156 0.976418
+vt 0.842937 0.976426
+vt 0.842971 0.972341
+vt 0.851094 0.980433
+vt 0.842877 0.980440
+vt 0.842986 0.968208
+vt 0.851207 0.968196
+vt 0.842992 0.964051
+vt 0.851213 0.964038
+vt 0.859421 0.968185
+vt 0.859404 0.972322
+vt 0.867629 0.968177
+vt 0.867612 0.972314
+vt 0.859427 0.964026
+vt 0.867635 0.964016
+vt 0.859369 0.976410
+vt 0.859305 0.980427
+vt 0.867576 0.976404
+vt 0.867511 0.980422
+vt 0.884015 0.972304
+vt 0.883978 0.976396
+vt 0.875779 0.976399
+vt 0.875816 0.972309
+vt 0.883912 0.980416
+vt 0.875713 0.980419
+vt 0.875832 0.968170
+vt 0.884032 0.968165
+vt 0.875839 0.964009
+vt 0.884039 0.964002
+vt 0.892230 0.968161
+vt 0.892212 0.972300
+vt 0.900426 0.968157
+vt 0.900409 0.972297
+vt 0.892236 0.963998
+vt 0.900432 0.963993
+vt 0.892175 0.976393
+vt 0.892108 0.980413
+vt 0.900371 0.976390
+vt 0.900304 0.980411
+vt 0.122737 0.972306
+vt 0.122700 0.976398
+vt 0.114501 0.976394
+vt 0.114538 0.972301
+vt 0.106304 0.976390
+vt 0.106341 0.972297
+vt 0.122634 0.980418
+vt 0.114434 0.980415
+vt 0.106236 0.980411
+vt 0.114556 0.968162
+vt 0.122754 0.968167
+vt 0.114562 0.963999
+vt 0.122760 0.964005
+vt 0.106359 0.968157
+vt 0.106365 0.963993
+vt 0.130955 0.968174
+vt 0.130938 0.972312
+vt 0.139159 0.968181
+vt 0.139143 0.972319
+vt 0.130961 0.964012
+vt 0.139165 0.964021
+vt 0.130901 0.976403
+vt 0.130836 0.980422
+vt 0.139107 0.976409
+vt 0.139042 0.980427
+vt 0.155569 0.972337
+vt 0.155535 0.976425
+vt 0.147318 0.976416
+vt 0.147353 0.972327
+vt 0.155473 0.980440
+vt 0.147255 0.980433
+vt 0.147369 0.968191
+vt 0.155585 0.968203
+vt 0.147375 0.964032
+vt 0.155591 0.964044
+vt 0.163808 0.968215
+vt 0.163792 0.972349
+vt 0.172038 0.968230
+vt 0.172024 0.972361
+vt 0.163813 0.964059
+vt 0.172044 0.964075
+vt 0.163759 0.976434
+vt 0.163699 0.980448
+vt 0.171991 0.976445
+vt 0.171934 0.980456
+vt 0.188513 0.972388
+vt 0.188484 0.976468
+vt 0.180233 0.976456
+vt 0.180264 0.972374
+vt 0.188431 0.980476
+vt 0.180177 0.980466
+vt 0.180278 0.968245
+vt 0.188527 0.968261
+vt 0.180283 0.964092
+vt 0.188532 0.964110
+vt 0.196785 0.968278
+vt 0.196772 0.972403
+vt 0.205053 0.968295
+vt 0.205041 0.972417
+vt 0.196790 0.964129
+vt 0.205058 0.964148
+vt 0.196744 0.976480
+vt 0.196694 0.980486
+vt 0.205015 0.976493
+vt 0.204968 0.980496
+vt 0.221609 0.972447
+vt 0.221587 0.976517
+vt 0.213296 0.976505
+vt 0.213320 0.972432
+vt 0.221546 0.980516
+vt 0.213252 0.980506
+vt 0.213331 0.968312
+vt 0.221620 0.968328
+vt 0.213336 0.964167
+vt 0.221623 0.964186
+vt 0.229917 0.968344
+vt 0.229908 0.972461
+vt 0.238224 0.968359
+vt 0.238216 0.972474
+vt 0.229921 0.964204
+vt 0.238228 0.964221
+vt 0.229887 0.976529
+vt 0.229851 0.980526
+vt 0.238197 0.976540
+vt 0.238164 0.980535
+vt 0.254858 0.972497
+vt 0.254844 0.976560
+vt 0.246517 0.976551
+vt 0.246533 0.972486
+vt 0.254819 0.980551
+vt 0.246487 0.980543
+vt 0.246540 0.968373
+vt 0.254864 0.968386
+vt 0.246543 0.964237
+vt 0.254867 0.964252
+vt 0.263195 0.968397
+vt 0.263190 0.972507
+vt 0.271532 0.968407
+vt 0.271528 0.972515
+vt 0.263197 0.964264
+vt 0.271534 0.964275
+vt 0.263178 0.976568
+vt 0.263157 0.980558
+vt 0.271519 0.976575
+vt 0.271502 0.980563
+vt 0.288219 0.972526
+vt 0.288214 0.976585
+vt 0.279865 0.976581
+vt 0.279871 0.972521
+vt 0.288206 0.980571
+vt 0.279852 0.980568
+vt 0.279875 0.968414
+vt 0.288221 0.968420
+vt 0.279876 0.964283
+vt 0.288221 0.964289
+vt 0.296569 0.968423
+vt 0.296568 0.972529
+vt 0.304919 0.968424
+vt 0.304920 0.972530
+vt 0.296570 0.964293
+vt 0.304919 0.964294
+vt 0.296567 0.976587
+vt 0.296563 0.980573
+vt 0.304920 0.976588
+vt 0.304921 0.980574
+vt 0.321620 0.972526
+vt 0.321626 0.976585
+vt 0.313274 0.976587
+vt 0.313271 0.972529
+vt 0.321636 0.980571
+vt 0.313279 0.980573
+vt 0.313269 0.968423
+vt 0.321618 0.968420
+vt 0.313269 0.964293
+vt 0.321617 0.964289
+vt 0.329964 0.968414
+vt 0.329968 0.972521
+vt 0.329963 0.964283
+vt 0.329976 0.976581
+vt 0.329990 0.980568
+vt 0.354968 0.955983
+vt 0.354970 0.960117
+vt 0.346639 0.960131
+vt 0.346638 0.955998
+vt 0.338303 0.960143
+vt 0.338302 0.956011
+vt 0.346637 0.951865
+vt 0.354967 0.951849
+vt 0.346636 0.947733
+vt 0.354966 0.947715
+vt 0.338301 0.951879
+vt 0.338300 0.947748
+vt 0.363290 0.951830
+vt 0.363291 0.955965
+vt 0.371604 0.951809
+vt 0.371606 0.955946
+vt 0.363288 0.947695
+vt 0.371603 0.947673
+vt 0.363293 0.960101
+vt 0.371608 0.960083
+vt 0.388209 0.955903
+vt 0.388211 0.960044
+vt 0.379914 0.960064
+vt 0.379912 0.955925
+vt 0.379910 0.951787
+vt 0.388207 0.951763
+vt 0.379909 0.947649
+vt 0.388206 0.947623
+vt 0.396494 0.951738
+vt 0.396496 0.955881
+vt 0.404772 0.951713
+vt 0.404774 0.955857
+vt 0.396493 0.947597
+vt 0.404770 0.947570
+vt 0.396499 0.960024
+vt 0.404777 0.960002
+vt 0.421299 0.955812
+vt 0.421302 0.959960
+vt 0.413044 0.959981
+vt 0.413041 0.955834
+vt 0.413039 0.951688
+vt 0.421296 0.951664
+vt 0.413037 0.947543
+vt 0.421295 0.947517
+vt 0.429544 0.951640
+vt 0.429547 0.955789
+vt 0.437783 0.951617
+vt 0.437786 0.955769
+vt 0.429542 0.947491
+vt 0.437781 0.947467
+vt 0.429550 0.959940
+vt 0.437789 0.959921
+vt 0.454238 0.955732
+vt 0.454242 0.959887
+vt 0.446020 0.959903
+vt 0.446016 0.955749
+vt 0.446013 0.951596
+vt 0.454236 0.951577
+vt 0.446011 0.947445
+vt 0.454233 0.947424
+vt 0.462451 0.951561
+vt 0.462454 0.955716
+vt 0.470660 0.951546
+vt 0.470663 0.955703
+vt 0.462449 0.947407
+vt 0.470658 0.947391
+vt 0.462458 0.959873
+vt 0.470667 0.959861
+vt 0.487068 0.955685
+vt 0.487072 0.959844
+vt 0.478871 0.959851
+vt 0.478868 0.955692
+vt 0.478865 0.951535
+vt 0.487065 0.951527
+vt 0.478862 0.947379
+vt 0.487063 0.947370
+vt 0.495263 0.951521
+vt 0.495266 0.955680
+vt 0.503460 0.951519
+vt 0.503463 0.955678
+vt 0.495261 0.947364
+vt 0.503457 0.947362
+vt 0.495270 0.959840
+vt 0.503467 0.959838
+vt 0.519857 0.955682
+vt 0.519861 0.959842
+vt 0.511663 0.959838
+vt 0.511659 0.955678
+vt 0.511656 0.951520
+vt 0.519854 0.951524
+vt 0.511654 0.947363
+vt 0.519852 0.947368
+vt 0.528054 0.951532
+vt 0.528057 0.955689
+vt 0.536257 0.951542
+vt 0.536260 0.955698
+vt 0.528052 0.947376
+vt 0.536255 0.947387
+vt 0.528061 0.959848
+vt 0.536264 0.959857
+vt 0.552683 0.955725
+vt 0.552687 0.959881
+vt 0.544472 0.959868
+vt 0.544469 0.955711
+vt 0.544466 0.951555
+vt 0.552680 0.951571
+vt 0.544464 0.947401
+vt 0.552678 0.947418
+vt 0.560901 0.951589
+vt 0.560904 0.955742
+vt 0.569130 0.951609
+vt 0.569132 0.955760
+vt 0.560899 0.947437
+vt 0.569128 0.947458
+vt 0.560907 0.959896
+vt 0.569136 0.959913
+vt 0.585616 0.955801
+vt 0.585619 0.959950
+vt 0.577373 0.959931
+vt 0.577370 0.955780
+vt 0.577367 0.951630
+vt 0.585613 0.951653
+vt 0.577365 0.947482
+vt 0.585611 0.947506
+vt 0.593869 0.951677
+vt 0.593871 0.955823
+vt 0.602134 0.951701
+vt 0.602136 0.955845
+vt 0.593867 0.947532
+vt 0.602132 0.947557
+vt 0.593874 0.959970
+vt 0.602139 0.959990
+vt 0.618695 0.955889
+vt 0.618698 0.960030
+vt 0.610413 0.960010
+vt 0.610411 0.955867
+vt 0.610409 0.951725
+vt 0.618694 0.951749
+vt 0.610407 0.947583
+vt 0.618692 0.947609
+vt 0.626988 0.951772
+vt 0.626989 0.955911
+vt 0.635291 0.951794
+vt 0.635293 0.955931
+vt 0.626987 0.947634
+vt 0.635290 0.947657
+vt 0.626992 0.960050
+vt 0.635294 0.960068
+vt 0.651924 0.955966
+vt 0.651925 0.960101
+vt 0.643606 0.960085
+vt 0.643604 0.955949
+vt 0.643603 0.951814
+vt 0.651923 0.951832
+vt 0.643602 0.947679
+vt 0.651922 0.947699
+vt 0.660250 0.951849
+vt 0.660251 0.955981
+vt 0.668582 0.951862
+vt 0.668583 0.955994
+vt 0.660249 0.947716
+vt 0.668582 0.947731
+vt 0.660252 0.960114
+vt 0.668584 0.960126
+vt 0.685262 0.956011
+vt 0.685263 0.960141
+vt 0.676922 0.960135
+vt 0.676921 0.956004
+vt 0.676920 0.951873
+vt 0.685262 0.951881
+vt 0.676920 0.947742
+vt 0.685262 0.947751
+vt 0.693606 0.951886
+vt 0.693606 0.956016
+vt 0.701952 0.951887
+vt 0.701952 0.956017
+vt 0.693606 0.947756
+vt 0.701952 0.947758
+vt 0.693607 0.960145
+vt 0.701952 0.960147
+vt 0.718641 0.956011
+vt 0.718641 0.960141
+vt 0.710297 0.960145
+vt 0.710297 0.956016
+vt 0.710297 0.951886
+vt 0.718642 0.951881
+vt 0.710297 0.947756
+vt 0.718642 0.947751
+vt 0.726983 0.951873
+vt 0.726983 0.956004
+vt 0.735321 0.951862
+vt 0.735320 0.955994
+vt 0.726984 0.947742
+vt 0.735322 0.947731
+vt 0.726982 0.960135
+vt 0.735319 0.960126
+vt 0.751979 0.955966
+vt 0.751978 0.960101
+vt 0.743652 0.960114
+vt 0.743653 0.955981
+vt 0.743654 0.951849
+vt 0.751981 0.951833
+vt 0.743655 0.947716
+vt 0.751981 0.947699
+vt 0.760300 0.951814
+vt 0.760299 0.955950
+vt 0.768613 0.951794
+vt 0.768611 0.955931
+vt 0.760302 0.947679
+vt 0.768614 0.947657
+vt 0.760297 0.960085
+vt 0.768609 0.960068
+vt 0.785208 0.955890
+vt 0.785206 0.960031
+vt 0.776912 0.960050
+vt 0.776914 0.955911
+vt 0.776916 0.951772
+vt 0.785210 0.951749
+vt 0.776917 0.947634
+vt 0.785212 0.947609
+vt 0.793495 0.951725
+vt 0.793493 0.955868
+vt 0.801770 0.951701
+vt 0.801768 0.955845
+vt 0.793496 0.947584
+vt 0.801772 0.947558
+vt 0.793490 0.960011
+vt 0.801765 0.959990
+vt 0.818288 0.955801
+vt 0.818285 0.959950
+vt 0.810030 0.959970
+vt 0.810033 0.955823
+vt 0.810035 0.951677
+vt 0.818291 0.951653
+vt 0.810037 0.947532
+vt 0.818292 0.947506
+vt 0.826537 0.951630
+vt 0.826534 0.955780
+vt 0.834774 0.951609
+vt 0.834771 0.955760
+vt 0.826539 0.947482
+vt 0.834776 0.947459
+vt 0.826531 0.959931
+vt 0.834768 0.959913
+vt 0.851221 0.955725
+vt 0.851217 0.959881
+vt 0.842996 0.959896
+vt 0.843000 0.955742
+vt 0.843003 0.951589
+vt 0.851224 0.951571
+vt 0.843005 0.947437
+vt 0.851226 0.947418
+vt 0.859438 0.951555
+vt 0.859435 0.955711
+vt 0.867647 0.951542
+vt 0.867644 0.955699
+vt 0.859440 0.947401
+vt 0.867649 0.947387
+vt 0.859432 0.959868
+vt 0.867640 0.959857
+vt 0.884047 0.955682
+vt 0.884043 0.959841
+vt 0.875844 0.959848
+vt 0.875847 0.955689
+vt 0.875850 0.951532
+vt 0.884050 0.951524
+vt 0.875853 0.947376
+vt 0.884053 0.947367
+vt 0.892248 0.951517
+vt 0.892245 0.955676
+vt 0.900444 0.951511
+vt 0.900441 0.955670
+vt 0.892250 0.947360
+vt 0.900447 0.947353
+vt 0.892241 0.959836
+vt 0.900437 0.959831
+vt 0.122769 0.955684
+vt 0.122765 0.959844
+vt 0.114567 0.959837
+vt 0.114571 0.955677
+vt 0.106370 0.959831
+vt 0.106374 0.955670
+vt 0.114574 0.951518
+vt 0.122772 0.951526
+vt 0.114576 0.947361
+vt 0.122774 0.947369
+vt 0.106377 0.951511
+vt 0.106379 0.947353
+vt 0.130972 0.951535
+vt 0.130970 0.955693
+vt 0.139177 0.951547
+vt 0.139174 0.955703
+vt 0.130975 0.947379
+vt 0.139179 0.947392
+vt 0.130966 0.959852
+vt 0.139170 0.959861
+vt 0.155599 0.955732
+vt 0.155595 0.959888
+vt 0.147380 0.959873
+vt 0.147383 0.955716
+vt 0.147386 0.951561
+vt 0.155602 0.951578
+vt 0.147388 0.947407
+vt 0.155604 0.947425
+vt 0.163824 0.951596
+vt 0.163821 0.955749
+vt 0.172054 0.951617
+vt 0.172052 0.955769
+vt 0.163826 0.947445
+vt 0.172056 0.947467
+vt 0.163818 0.959904
+vt 0.172048 0.959921
+vt 0.188539 0.955812
+vt 0.188536 0.959961
+vt 0.180287 0.959940
+vt 0.180291 0.955790
+vt 0.180293 0.951640
+vt 0.188541 0.951664
+vt 0.180295 0.947491
+vt 0.188543 0.947517
+vt 0.196799 0.951688
+vt 0.196796 0.955834
+vt 0.205066 0.951713
+vt 0.205064 0.955858
+vt 0.196800 0.947543
+vt 0.205068 0.947570
+vt 0.196793 0.959981
+vt 0.205061 0.960003
+vt 0.221629 0.955904
+vt 0.221626 0.960045
+vt 0.213339 0.960024
+vt 0.213341 0.955881
+vt 0.213343 0.951738
+vt 0.221631 0.951763
+vt 0.213345 0.947597
+vt 0.221632 0.947623
+vt 0.229927 0.951787
+vt 0.229926 0.955925
+vt 0.238233 0.951809
+vt 0.238232 0.955946
+vt 0.229929 0.947649
+vt 0.238235 0.947673
+vt 0.229924 0.960065
+vt 0.238230 0.960084
+vt 0.254870 0.955983
+vt 0.254868 0.960117
+vt 0.246545 0.960101
+vt 0.246547 0.955965
+vt 0.246548 0.951830
+vt 0.254871 0.951849
+vt 0.246549 0.947695
+vt 0.254872 0.947715
+vt 0.263201 0.951865
+vt 0.263200 0.955998
+vt 0.271537 0.951879
+vt 0.271536 0.956011
+vt 0.263202 0.947733
+vt 0.271537 0.947748
+vt 0.263199 0.960131
+vt 0.271535 0.960143
+vt 0.288222 0.956029
+vt 0.288222 0.960159
+vt 0.279877 0.960152
+vt 0.279877 0.956021
+vt 0.279878 0.951890
+vt 0.288223 0.951898
+vt 0.279878 0.947760
+vt 0.288223 0.947768
+vt 0.296570 0.951903
+vt 0.296570 0.956033
+vt 0.304919 0.951905
+vt 0.304919 0.956035
+vt 0.296570 0.947774
+vt 0.304919 0.947775
+vt 0.296570 0.960163
+vt 0.304919 0.960164
+vt 0.321616 0.956029
+vt 0.321616 0.960159
+vt 0.313268 0.960163
+vt 0.313268 0.956033
+vt 0.313268 0.951903
+vt 0.321615 0.951898
+vt 0.313267 0.947774
+vt 0.321615 0.947768
+vt 0.329960 0.951890
+vt 0.329961 0.956021
+vt 0.329960 0.947760
+vt 0.329962 0.960152
+vt 0.354964 0.939449
+vt 0.354965 0.943582
+vt 0.346635 0.943601
+vt 0.346635 0.939469
+vt 0.338300 0.943616
+vt 0.338299 0.939485
+vt 0.346634 0.935337
+vt 0.354964 0.935316
+vt 0.346634 0.931205
+vt 0.354963 0.931183
+vt 0.338299 0.935354
+vt 0.338299 0.931223
+vt 0.363286 0.935292
+vt 0.363287 0.939426
+vt 0.371600 0.935266
+vt 0.371601 0.939401
+vt 0.363285 0.931159
+vt 0.371600 0.931132
+vt 0.363287 0.943560
+vt 0.371602 0.943537
+vt 0.388203 0.939346
+vt 0.388204 0.943484
+vt 0.379908 0.943511
+vt 0.379907 0.939374
+vt 0.379906 0.935238
+vt 0.388202 0.935208
+vt 0.379905 0.931102
+vt 0.388202 0.931071
+vt 0.396489 0.935177
+vt 0.396490 0.939316
+vt 0.404766 0.935146
+vt 0.404767 0.939286
+vt 0.396488 0.931039
+vt 0.404765 0.931006
+vt 0.396491 0.943456
+vt 0.404769 0.943428
+vt 0.421291 0.939227
+vt 0.421293 0.943371
+vt 0.413036 0.943399
+vt 0.413034 0.939256
+vt 0.413033 0.935114
+vt 0.421290 0.935083
+vt 0.413032 0.930974
+vt 0.421289 0.930941
+vt 0.429538 0.935053
+vt 0.429539 0.939198
+vt 0.437777 0.935025
+vt 0.437778 0.939171
+vt 0.429537 0.930910
+vt 0.437775 0.930881
+vt 0.429541 0.943344
+vt 0.437779 0.943318
+vt 0.454230 0.939123
+vt 0.454232 0.943273
+vt 0.446009 0.943295
+vt 0.446008 0.939146
+vt 0.446007 0.934999
+vt 0.454229 0.934975
+vt 0.446005 0.930854
+vt 0.454227 0.930829
+vt 0.462444 0.934954
+vt 0.462445 0.939103
+vt 0.470653 0.934936
+vt 0.470654 0.939086
+vt 0.462443 0.930807
+vt 0.470652 0.930789
+vt 0.462447 0.943254
+vt 0.470656 0.943238
+vt 0.487059 0.939063
+vt 0.487061 0.943215
+vt 0.478860 0.943225
+vt 0.478859 0.939073
+vt 0.478857 0.934922
+vt 0.487058 0.934912
+vt 0.478856 0.930774
+vt 0.487056 0.930763
+vt 0.495256 0.934905
+vt 0.495257 0.939056
+vt 0.503452 0.934902
+vt 0.503454 0.939054
+vt 0.495254 0.930756
+vt 0.503451 0.930753
+vt 0.495259 0.943209
+vt 0.503455 0.943207
+vt 0.519848 0.939060
+vt 0.519850 0.943213
+vt 0.511652 0.943208
+vt 0.511650 0.939055
+vt 0.511649 0.934904
+vt 0.519846 0.934909
+vt 0.511647 0.930755
+vt 0.519845 0.930761
+vt 0.528046 0.934919
+vt 0.528048 0.939069
+vt 0.536250 0.934932
+vt 0.536252 0.939082
+vt 0.528045 0.930770
+vt 0.536249 0.930784
+vt 0.528050 0.943221
+vt 0.536253 0.943233
+vt 0.552675 0.939116
+vt 0.552676 0.943266
+vt 0.544462 0.943248
+vt 0.544460 0.939097
+vt 0.544459 0.934948
+vt 0.552673 0.934968
+vt 0.544458 0.930801
+vt 0.552672 0.930822
+vt 0.560894 0.934991
+vt 0.560896 0.939138
+vt 0.569123 0.935016
+vt 0.569125 0.939162
+vt 0.560893 0.930846
+vt 0.569122 0.930872
+vt 0.560897 0.943287
+vt 0.569126 0.943310
+vt 0.585608 0.939216
+vt 0.585610 0.943360
+vt 0.577363 0.943334
+vt 0.577362 0.939188
+vt 0.577361 0.935044
+vt 0.585607 0.935072
+vt 0.577360 0.930900
+vt 0.585606 0.930931
+vt 0.593863 0.935102
+vt 0.593864 0.939244
+vt 0.602128 0.935133
+vt 0.602129 0.939274
+vt 0.593862 0.930962
+vt 0.602127 0.930994
+vt 0.593865 0.943387
+vt 0.602131 0.943415
+vt 0.618690 0.939332
+vt 0.618691 0.943470
+vt 0.610406 0.943443
+vt 0.610405 0.939303
+vt 0.610404 0.935164
+vt 0.618689 0.935194
+vt 0.610403 0.931026
+vt 0.618688 0.931057
+vt 0.626984 0.935223
+vt 0.626984 0.939359
+vt 0.635287 0.935251
+vt 0.635288 0.939386
+vt 0.626983 0.931087
+vt 0.635287 0.931116
+vt 0.626985 0.943496
+vt 0.635289 0.943521
+vt 0.651921 0.939432
+vt 0.651921 0.943565
+vt 0.643601 0.943544
+vt 0.643600 0.939410
+vt 0.643600 0.935276
+vt 0.651920 0.935300
+vt 0.643599 0.931143
+vt 0.651920 0.931167
+vt 0.660247 0.935320
+vt 0.660248 0.939452
+vt 0.668581 0.935337
+vt 0.668581 0.939468
+vt 0.660247 0.931188
+vt 0.668580 0.931206
+vt 0.660248 0.943584
+vt 0.668581 0.943599
+vt 0.685261 0.939491
+vt 0.685261 0.943621
+vt 0.676919 0.943612
+vt 0.676919 0.939481
+vt 0.676919 0.935351
+vt 0.685261 0.935361
+vt 0.676919 0.931221
+vt 0.685261 0.931231
+vt 0.693606 0.935367
+vt 0.693606 0.939497
+vt 0.701952 0.935369
+vt 0.701952 0.939498
+vt 0.693606 0.931237
+vt 0.701952 0.931239
+vt 0.693606 0.943626
+vt 0.701952 0.943628
+vt 0.718642 0.939491
+vt 0.718642 0.943621
+vt 0.710298 0.943626
+vt 0.710298 0.939497
+vt 0.710298 0.935367
+vt 0.718643 0.935361
+vt 0.710298 0.931237
+vt 0.718643 0.931231
+vt 0.726985 0.935351
+vt 0.726984 0.939481
+vt 0.735323 0.935337
+vt 0.735323 0.939468
+vt 0.726985 0.931221
+vt 0.735324 0.931206
+vt 0.726984 0.943612
+vt 0.735322 0.943599
+vt 0.751983 0.939432
+vt 0.751982 0.943565
+vt 0.743655 0.943584
+vt 0.743656 0.939452
+vt 0.743656 0.935320
+vt 0.751984 0.935300
+vt 0.743657 0.931188
+vt 0.751984 0.931167
+vt 0.760304 0.935276
+vt 0.760303 0.939410
+vt 0.768616 0.935251
+vt 0.768616 0.939386
+vt 0.760305 0.931143
+vt 0.768617 0.931116
+vt 0.760303 0.943545
+vt 0.768615 0.943521
+vt 0.785214 0.939332
+vt 0.785213 0.943470
+vt 0.776918 0.943496
+vt 0.776919 0.939359
+vt 0.776920 0.935223
+vt 0.785215 0.935194
+vt 0.776921 0.931088
+vt 0.785216 0.931057
+vt 0.793500 0.935164
+vt 0.793499 0.939303
+vt 0.801775 0.935133
+vt 0.801774 0.939274
+vt 0.793501 0.931026
+vt 0.801776 0.930994
+vt 0.793498 0.943443
+vt 0.801773 0.943415
+vt 0.818295 0.939216
+vt 0.818294 0.943360
+vt 0.810038 0.943388
+vt 0.810040 0.939245
+vt 0.810041 0.935103
+vt 0.818297 0.935073
+vt 0.810042 0.930962
+vt 0.818298 0.930931
+vt 0.826543 0.935044
+vt 0.826542 0.939188
+vt 0.834781 0.935017
+vt 0.834779 0.939162
+vt 0.826544 0.930901
+vt 0.834782 0.930872
+vt 0.826540 0.943334
+vt 0.834778 0.943310
+vt 0.851229 0.939117
+vt 0.851228 0.943266
+vt 0.843007 0.943287
+vt 0.843008 0.939138
+vt 0.843010 0.934991
+vt 0.851231 0.934969
+vt 0.843011 0.930846
+vt 0.851232 0.930822
+vt 0.859445 0.934949
+vt 0.859444 0.939098
+vt 0.867654 0.934932
+vt 0.867653 0.939082
+vt 0.859447 0.930802
+vt 0.867655 0.930784
+vt 0.859442 0.943249
+vt 0.867651 0.943233
+vt 0.884056 0.939059
+vt 0.884055 0.943212
+vt 0.875855 0.943222
+vt 0.875856 0.939069
+vt 0.875858 0.934919
+vt 0.884058 0.934909
+vt 0.875859 0.930771
+vt 0.884059 0.930760
+vt 0.892256 0.934900
+vt 0.892254 0.939051
+vt 0.900452 0.934892
+vt 0.900450 0.939044
+vt 0.892257 0.930751
+vt 0.900453 0.930743
+vt 0.892252 0.943205
+vt 0.900449 0.943198
+vt 0.122778 0.939062
+vt 0.122776 0.943215
+vt 0.114578 0.943206
+vt 0.114580 0.939053
+vt 0.106381 0.943198
+vt 0.106383 0.939044
+vt 0.114581 0.934901
+vt 0.122779 0.934911
+vt 0.114583 0.930752
+vt 0.122781 0.930762
+vt 0.106385 0.934892
+vt 0.106386 0.930743
+vt 0.130980 0.934922
+vt 0.130978 0.939073
+vt 0.139184 0.934937
+vt 0.139183 0.939086
+vt 0.130981 0.930774
+vt 0.139185 0.930789
+vt 0.130977 0.943225
+vt 0.139181 0.943238
+vt 0.155607 0.939123
+vt 0.155606 0.943273
+vt 0.147390 0.943254
+vt 0.147392 0.939103
+vt 0.147393 0.934954
+vt 0.155609 0.934975
+vt 0.147395 0.930807
+vt 0.155610 0.930829
+vt 0.163831 0.934999
+vt 0.163829 0.939146
+vt 0.172061 0.935025
+vt 0.172059 0.939171
+vt 0.163832 0.930854
+vt 0.172062 0.930881
+vt 0.163828 0.943295
+vt 0.172058 0.943319
+vt 0.188546 0.939227
+vt 0.188545 0.943371
+vt 0.180297 0.943344
+vt 0.180298 0.939198
+vt 0.180299 0.935054
+vt 0.188547 0.935084
+vt 0.180300 0.930911
+vt 0.188548 0.930942
+vt 0.196804 0.935114
+vt 0.196803 0.939256
+vt 0.205071 0.935146
+vt 0.205070 0.939286
+vt 0.196805 0.930974
+vt 0.205072 0.931006
+vt 0.196802 0.943399
+vt 0.205069 0.943428
+vt 0.221634 0.939346
+vt 0.221633 0.943484
+vt 0.213346 0.943456
+vt 0.213347 0.939316
+vt 0.213348 0.935177
+vt 0.221635 0.935208
+vt 0.213349 0.931039
+vt 0.221636 0.931071
+vt 0.229932 0.935238
+vt 0.229931 0.939374
+vt 0.238237 0.935266
+vt 0.238236 0.939401
+vt 0.229932 0.931102
+vt 0.238238 0.931132
+vt 0.229930 0.943511
+vt 0.238236 0.943537
+vt 0.254873 0.939449
+vt 0.254873 0.943582
+vt 0.246550 0.943560
+vt 0.246551 0.939426
+vt 0.246552 0.935292
+vt 0.254874 0.935316
+vt 0.246552 0.931159
+vt 0.254874 0.931184
+vt 0.263203 0.935337
+vt 0.263203 0.939469
+vt 0.271539 0.935354
+vt 0.271538 0.939485
+vt 0.263204 0.931205
+vt 0.271539 0.931224
+vt 0.263202 0.943601
+vt 0.271538 0.943616
+vt 0.288223 0.939508
+vt 0.288223 0.943638
+vt 0.279879 0.943629
+vt 0.279879 0.939499
+vt 0.279879 0.935368
+vt 0.288224 0.935378
+vt 0.279879 0.931238
+vt 0.288224 0.931249
+vt 0.296571 0.935385
+vt 0.296570 0.939514
+vt 0.304919 0.935387
+vt 0.304919 0.939516
+vt 0.296571 0.931255
+vt 0.304919 0.931257
+vt 0.296570 0.943644
+vt 0.304919 0.943646
+vt 0.321614 0.939508
+vt 0.321615 0.943638
+vt 0.313267 0.943644
+vt 0.313267 0.939514
+vt 0.313267 0.935385
+vt 0.321614 0.935378
+vt 0.313267 0.931255
+vt 0.321614 0.931248
+vt 0.329958 0.935368
+vt 0.329959 0.939499
+vt 0.329958 0.931238
+vt 0.329959 0.943629
+vt 0.354962 0.922920
+vt 0.354963 0.927051
+vt 0.346633 0.927074
+vt 0.346633 0.922943
+vt 0.338298 0.927093
+vt 0.338298 0.922962
+vt 0.346633 0.918812
+vt 0.354962 0.918788
+vt 0.346633 0.914682
+vt 0.354962 0.914658
+vt 0.338298 0.918832
+vt 0.338298 0.914702
+vt 0.363284 0.918761
+vt 0.363284 0.922893
+vt 0.371598 0.918732
+vt 0.371599 0.922864
+vt 0.363284 0.914630
+vt 0.371598 0.914600
+vt 0.363285 0.927026
+vt 0.371599 0.926998
+vt 0.388200 0.922800
+vt 0.388201 0.926935
+vt 0.379905 0.926967
+vt 0.379904 0.922833
+vt 0.379903 0.918700
+vt 0.388200 0.918666
+vt 0.379903 0.914567
+vt 0.388199 0.914532
+vt 0.396486 0.918631
+vt 0.396487 0.922766
+vt 0.404763 0.918595
+vt 0.404764 0.922731
+vt 0.396486 0.914497
+vt 0.404762 0.914460
+vt 0.396488 0.926902
+vt 0.404764 0.926868
+vt 0.421287 0.922662
+vt 0.421288 0.926801
+vt 0.413031 0.926834
+vt 0.413031 0.922696
+vt 0.413030 0.918559
+vt 0.421287 0.918524
+vt 0.413029 0.914424
+vt 0.421286 0.914388
+vt 0.429534 0.918490
+vt 0.429535 0.922629
+vt 0.437773 0.918458
+vt 0.437774 0.922597
+vt 0.429534 0.914354
+vt 0.437772 0.914321
+vt 0.429536 0.926769
+vt 0.437774 0.926738
+vt 0.454225 0.922542
+vt 0.454226 0.926684
+vt 0.446004 0.926710
+vt 0.446003 0.922568
+vt 0.446003 0.918429
+vt 0.454224 0.918401
+vt 0.446002 0.914291
+vt 0.454224 0.914263
+vt 0.462440 0.918378
+vt 0.462440 0.922519
+vt 0.470649 0.918358
+vt 0.470650 0.922499
+vt 0.462439 0.914239
+vt 0.470648 0.914218
+vt 0.462441 0.926662
+vt 0.470651 0.926643
+vt 0.487054 0.922472
+vt 0.487055 0.926616
+vt 0.478855 0.926628
+vt 0.478854 0.922484
+vt 0.478853 0.918342
+vt 0.487053 0.918330
+vt 0.478852 0.914202
+vt 0.487053 0.914190
+vt 0.495251 0.918322
+vt 0.495252 0.922465
+vt 0.503448 0.918319
+vt 0.503449 0.922462
+vt 0.495250 0.914182
+vt 0.503447 0.914179
+vt 0.495253 0.926609
+vt 0.503450 0.926606
+vt 0.519843 0.922470
+vt 0.519844 0.926614
+vt 0.511646 0.926608
+vt 0.511645 0.922463
+vt 0.511644 0.918321
+vt 0.519842 0.918327
+vt 0.511643 0.914181
+vt 0.519841 0.914188
+vt 0.528042 0.918338
+vt 0.528043 0.922480
+vt 0.536246 0.918353
+vt 0.536247 0.922495
+vt 0.528041 0.914199
+vt 0.536245 0.914214
+vt 0.528044 0.926624
+vt 0.536248 0.926638
+vt 0.552670 0.922535
+vt 0.552671 0.926678
+vt 0.544457 0.926656
+vt 0.544456 0.922513
+vt 0.544455 0.918372
+vt 0.552669 0.918395
+vt 0.544454 0.914233
+vt 0.552669 0.914256
+vt 0.560891 0.918421
+vt 0.560891 0.922560
+vt 0.569120 0.918449
+vt 0.569120 0.922588
+vt 0.560890 0.914283
+vt 0.569119 0.914312
+vt 0.560892 0.926702
+vt 0.569121 0.926729
+vt 0.585604 0.922651
+vt 0.585605 0.926790
+vt 0.577359 0.926759
+vt 0.577358 0.922619
+vt 0.577357 0.918481
+vt 0.585604 0.918513
+vt 0.577357 0.914344
+vt 0.585603 0.914377
+vt 0.593860 0.918548
+vt 0.593860 0.922684
+vt 0.602125 0.918582
+vt 0.602126 0.922718
+vt 0.593859 0.914412
+vt 0.602125 0.914448
+vt 0.593861 0.926822
+vt 0.602127 0.926855
+vt 0.618687 0.922786
+vt 0.618688 0.926921
+vt 0.610402 0.926888
+vt 0.610402 0.922752
+vt 0.610401 0.918617
+vt 0.618686 0.918652
+vt 0.610400 0.914483
+vt 0.618686 0.914518
+vt 0.626981 0.918685
+vt 0.626982 0.922818
+vt 0.635285 0.918717
+vt 0.635286 0.922849
+vt 0.626981 0.914552
+vt 0.635285 0.914585
+vt 0.626982 0.926952
+vt 0.635286 0.926982
+vt 0.651919 0.922903
+vt 0.651919 0.927035
+vt 0.643599 0.927010
+vt 0.643598 0.922878
+vt 0.643598 0.918746
+vt 0.651918 0.918772
+vt 0.643597 0.914614
+vt 0.651918 0.914641
+vt 0.660246 0.918795
+vt 0.660246 0.922926
+vt 0.668579 0.918815
+vt 0.668580 0.922945
+vt 0.660246 0.914665
+vt 0.668579 0.914685
+vt 0.660247 0.927057
+vt 0.668580 0.927076
+vt 0.685261 0.922971
+vt 0.685261 0.927101
+vt 0.676919 0.927090
+vt 0.676918 0.922960
+vt 0.676918 0.918831
+vt 0.685261 0.918842
+vt 0.676918 0.914701
+vt 0.685261 0.914712
+vt 0.693606 0.918849
+vt 0.693606 0.922978
+vt 0.701952 0.918851
+vt 0.701952 0.922981
+vt 0.693606 0.914720
+vt 0.701952 0.914722
+vt 0.693606 0.927108
+vt 0.701952 0.927110
+vt 0.718643 0.922972
+vt 0.718643 0.927101
+vt 0.710298 0.927108
+vt 0.710298 0.922978
+vt 0.710298 0.918849
+vt 0.718643 0.918842
+vt 0.710298 0.914720
+vt 0.718643 0.914712
+vt 0.726986 0.918831
+vt 0.726986 0.922961
+vt 0.735324 0.918815
+vt 0.735324 0.922945
+vt 0.726986 0.914701
+vt 0.735325 0.914685
+vt 0.726985 0.927091
+vt 0.735324 0.927076
+vt 0.751985 0.922904
+vt 0.751985 0.927035
+vt 0.743657 0.927057
+vt 0.743658 0.922926
+vt 0.743658 0.918796
+vt 0.751986 0.918772
+vt 0.743658 0.914665
+vt 0.751986 0.914641
+vt 0.760306 0.918746
+vt 0.760306 0.922878
+vt 0.768619 0.918717
+vt 0.768618 0.922849
+vt 0.760306 0.914614
+vt 0.768619 0.914585
+vt 0.760305 0.927010
+vt 0.768618 0.926983
+vt 0.785217 0.922786
+vt 0.785216 0.926921
+vt 0.776922 0.926953
+vt 0.776922 0.922819
+vt 0.776923 0.918685
+vt 0.785218 0.918652
+vt 0.776923 0.914553
+vt 0.785218 0.914519
+vt 0.793503 0.918618
+vt 0.793502 0.922753
+vt 0.801779 0.918583
+vt 0.801778 0.922719
+vt 0.793503 0.914484
+vt 0.801779 0.914448
+vt 0.793502 0.926889
+vt 0.801777 0.926856
+vt 0.818299 0.922651
+vt 0.818299 0.926790
+vt 0.810043 0.926823
+vt 0.810044 0.922685
+vt 0.810044 0.918548
+vt 0.818300 0.918514
+vt 0.810045 0.914412
+vt 0.818301 0.914378
+vt 0.826547 0.918481
+vt 0.826546 0.922619
+vt 0.834784 0.918450
+vt 0.834784 0.922589
+vt 0.826548 0.914344
+vt 0.834785 0.914312
+vt 0.826545 0.926759
+vt 0.834783 0.926730
+vt 0.851234 0.922535
+vt 0.851233 0.926678
+vt 0.843012 0.926702
+vt 0.843013 0.922561
+vt 0.843014 0.918421
+vt 0.851235 0.918395
+vt 0.843014 0.914283
+vt 0.851236 0.914257
+vt 0.859450 0.918372
+vt 0.859449 0.922513
+vt 0.867658 0.918353
+vt 0.867657 0.922495
+vt 0.859450 0.914233
+vt 0.867659 0.914214
+vt 0.859448 0.926657
+vt 0.867656 0.926638
+vt 0.884061 0.922469
+vt 0.884060 0.926613
+vt 0.875860 0.926624
+vt 0.875861 0.922480
+vt 0.875862 0.918338
+vt 0.884062 0.918326
+vt 0.875863 0.914199
+vt 0.884063 0.914187
+vt 0.892260 0.918317
+vt 0.892259 0.922459
+vt 0.900456 0.918308
+vt 0.900455 0.922451
+vt 0.892261 0.914177
+vt 0.900457 0.914168
+vt 0.892258 0.926604
+vt 0.900454 0.926596
+vt 0.122783 0.922471
+vt 0.122782 0.926615
+vt 0.114584 0.926605
+vt 0.114585 0.922460
+vt 0.106387 0.926596
+vt 0.106388 0.922451
+vt 0.114586 0.918318
+vt 0.122784 0.918329
+vt 0.114587 0.914178
+vt 0.122785 0.914189
+vt 0.106389 0.918308
+vt 0.106390 0.914168
+vt 0.130984 0.918342
+vt 0.130983 0.922484
+vt 0.139188 0.918358
+vt 0.139187 0.922499
+vt 0.130985 0.914202
+vt 0.139189 0.914219
+vt 0.130982 0.926628
+vt 0.139186 0.926643
+vt 0.155612 0.922542
+vt 0.155611 0.926685
+vt 0.147396 0.926662
+vt 0.147397 0.922519
+vt 0.147398 0.918378
+vt 0.155613 0.918402
+vt 0.147398 0.914239
+vt 0.155613 0.914263
+vt 0.163835 0.918429
+vt 0.163834 0.922569
+vt 0.172065 0.918458
+vt 0.172064 0.922598
+vt 0.163835 0.914291
+vt 0.172065 0.914321
+vt 0.163833 0.926710
+vt 0.172063 0.926739
+vt 0.188550 0.922662
+vt 0.188549 0.926801
+vt 0.180301 0.926769
+vt 0.180302 0.922629
+vt 0.180303 0.918491
+vt 0.188551 0.918524
+vt 0.180304 0.914354
+vt 0.188551 0.914388
+vt 0.196808 0.918560
+vt 0.196807 0.922696
+vt 0.205074 0.918595
+vt 0.205074 0.922731
+vt 0.196808 0.914424
+vt 0.205075 0.914460
+vt 0.196806 0.926834
+vt 0.205073 0.926868
+vt 0.221637 0.922800
+vt 0.221637 0.926935
+vt 0.213350 0.926902
+vt 0.213351 0.922766
+vt 0.213351 0.918631
+vt 0.221638 0.918666
+vt 0.213352 0.914497
+vt 0.221638 0.914533
+vt 0.229934 0.918700
+vt 0.229933 0.922833
+vt 0.238239 0.918732
+vt 0.238239 0.922865
+vt 0.229934 0.914567
+vt 0.238240 0.914600
+vt 0.229933 0.926967
+vt 0.238238 0.926998
+vt 0.254875 0.922920
+vt 0.254875 0.927052
+vt 0.246553 0.927026
+vt 0.246553 0.922894
+vt 0.246553 0.918762
+vt 0.254875 0.918789
+vt 0.246554 0.914630
+vt 0.254876 0.914658
+vt 0.263205 0.918812
+vt 0.263204 0.922943
+vt 0.271540 0.918832
+vt 0.271539 0.922962
+vt 0.263205 0.914682
+vt 0.271540 0.914702
+vt 0.263204 0.927074
+vt 0.271539 0.927093
+vt 0.288224 0.922989
+vt 0.288224 0.927119
+vt 0.279880 0.927108
+vt 0.279880 0.922978
+vt 0.279880 0.918848
+vt 0.288224 0.918860
+vt 0.279880 0.914718
+vt 0.288224 0.914730
+vt 0.296571 0.918867
+vt 0.296571 0.922996
+vt 0.304919 0.918869
+vt 0.304919 0.922998
+vt 0.296571 0.914737
+vt 0.304919 0.914740
+vt 0.296571 0.927125
+vt 0.304919 0.927128
+vt 0.321614 0.922989
+vt 0.321614 0.927119
+vt 0.313267 0.927125
+vt 0.313267 0.922996
+vt 0.313267 0.918867
+vt 0.321613 0.918859
+vt 0.313267 0.914737
+vt 0.321613 0.914730
+vt 0.329957 0.918848
+vt 0.329958 0.922978
+vt 0.329957 0.914718
+vt 0.329958 0.927108
+vt 0.354961 0.906397
+vt 0.354961 0.910527
+vt 0.346632 0.910552
+vt 0.346632 0.906422
+vt 0.338297 0.910572
+vt 0.338297 0.906443
+vt 0.346632 0.902292
+vt 0.354961 0.902267
+vt 0.346632 0.898163
+vt 0.354960 0.898138
+vt 0.338297 0.902313
+vt 0.338297 0.898184
+vt 0.363283 0.902239
+vt 0.363283 0.906369
+vt 0.371597 0.902208
+vt 0.371597 0.906338
+vt 0.363282 0.898110
+vt 0.371596 0.898078
+vt 0.363283 0.910499
+vt 0.371597 0.910468
+vt 0.388198 0.906269
+vt 0.388199 0.910400
+vt 0.379902 0.910435
+vt 0.379902 0.906304
+vt 0.379902 0.902174
+vt 0.388198 0.902138
+vt 0.379901 0.898044
+vt 0.388197 0.898009
+vt 0.396484 0.902101
+vt 0.396485 0.906232
+vt 0.404761 0.902064
+vt 0.404761 0.906195
+vt 0.396484 0.897972
+vt 0.404760 0.897934
+vt 0.396485 0.910364
+vt 0.404762 0.910327
+vt 0.421285 0.906121
+vt 0.421285 0.910254
+vt 0.413028 0.910290
+vt 0.413028 0.906157
+vt 0.413027 0.902026
+vt 0.421284 0.901989
+vt 0.413027 0.897897
+vt 0.421284 0.897860
+vt 0.429532 0.901954
+vt 0.429532 0.906085
+vt 0.437770 0.901920
+vt 0.437771 0.906052
+vt 0.429531 0.897824
+vt 0.437770 0.897790
+vt 0.429533 0.910219
+vt 0.437771 0.910185
+vt 0.454222 0.905992
+vt 0.454223 0.910127
+vt 0.446001 0.910155
+vt 0.446000 0.906021
+vt 0.446000 0.901889
+vt 0.454222 0.901860
+vt 0.445999 0.897759
+vt 0.454221 0.897730
+vt 0.462437 0.901835
+vt 0.462437 0.905968
+vt 0.470646 0.901814
+vt 0.470647 0.905947
+vt 0.462436 0.897705
+vt 0.470645 0.897684
+vt 0.462438 0.910102
+vt 0.470647 0.910081
+vt 0.487051 0.905918
+vt 0.487052 0.910053
+vt 0.478851 0.910065
+vt 0.478851 0.905930
+vt 0.478850 0.901797
+vt 0.487050 0.901785
+vt 0.478849 0.897667
+vt 0.487050 0.897655
+vt 0.495248 0.901777
+vt 0.495249 0.905910
+vt 0.503445 0.901774
+vt 0.503445 0.905907
+vt 0.495248 0.897647
+vt 0.503444 0.897644
+vt 0.495250 0.910045
+vt 0.503446 0.910042
+vt 0.519840 0.905915
+vt 0.519840 0.910050
+vt 0.511643 0.910044
+vt 0.511642 0.905909
+vt 0.511641 0.901776
+vt 0.519839 0.901783
+vt 0.511641 0.897646
+vt 0.519838 0.897653
+vt 0.528039 0.901794
+vt 0.528040 0.905926
+vt 0.536243 0.901810
+vt 0.536244 0.905942
+vt 0.528039 0.897664
+vt 0.536242 0.897679
+vt 0.528041 0.910061
+vt 0.536244 0.910077
+vt 0.552667 0.905986
+vt 0.552668 0.910120
+vt 0.544453 0.910096
+vt 0.544452 0.905962
+vt 0.544452 0.901830
+vt 0.552667 0.901853
+vt 0.544451 0.897700
+vt 0.552666 0.897723
+vt 0.560888 0.901881
+vt 0.560889 0.906013
+vt 0.569117 0.901911
+vt 0.569118 0.906043
+vt 0.560887 0.897751
+vt 0.569117 0.897781
+vt 0.560889 0.910147
+vt 0.569118 0.910177
+vt 0.585602 0.906110
+vt 0.585603 0.910243
+vt 0.577356 0.910209
+vt 0.577355 0.906075
+vt 0.577355 0.901944
+vt 0.585601 0.901978
+vt 0.577354 0.897814
+vt 0.585601 0.897849
+vt 0.593858 0.902014
+vt 0.593858 0.906146
+vt 0.602123 0.902051
+vt 0.602124 0.906182
+vt 0.593857 0.897885
+vt 0.602123 0.897922
+vt 0.593859 0.910278
+vt 0.602124 0.910314
+vt 0.618685 0.906255
+vt 0.618685 0.910386
+vt 0.610400 0.910351
+vt 0.610399 0.906219
+vt 0.610399 0.902088
+vt 0.618685 0.902124
+vt 0.610399 0.897958
+vt 0.618684 0.897995
+vt 0.626980 0.902159
+vt 0.626980 0.906289
+vt 0.635284 0.902192
+vt 0.635284 0.906322
+vt 0.626979 0.898030
+vt 0.635283 0.898063
+vt 0.626980 0.910421
+vt 0.635284 0.910453
+vt 0.651918 0.906381
+vt 0.651918 0.910511
+vt 0.643597 0.910483
+vt 0.643597 0.906353
+vt 0.643597 0.902223
+vt 0.651917 0.902251
+vt 0.643596 0.898094
+vt 0.651917 0.898122
+vt 0.660245 0.902276
+vt 0.660245 0.906405
+vt 0.668579 0.902296
+vt 0.668579 0.906426
+vt 0.660245 0.898146
+vt 0.668579 0.898167
+vt 0.660245 0.910535
+vt 0.668579 0.910555
+vt 0.685260 0.906454
+vt 0.685260 0.910583
+vt 0.676918 0.910571
+vt 0.676918 0.906442
+vt 0.676918 0.902313
+vt 0.685260 0.902324
+vt 0.676917 0.898183
+vt 0.685260 0.898195
+vt 0.693605 0.902332
+vt 0.693605 0.906461
+vt 0.701952 0.902334
+vt 0.701952 0.906463
+vt 0.693605 0.898203
+vt 0.701952 0.898205
+vt 0.693606 0.910590
+vt 0.701952 0.910593
+vt 0.718644 0.906454
+vt 0.718644 0.910583
+vt 0.710298 0.910590
+vt 0.710298 0.906461
+vt 0.710298 0.902332
+vt 0.718644 0.902325
+vt 0.710299 0.898203
+vt 0.718644 0.898196
+vt 0.726986 0.902313
+vt 0.726986 0.906442
+vt 0.735325 0.902296
+vt 0.735325 0.906426
+vt 0.726987 0.898183
+vt 0.735325 0.898167
+vt 0.726986 0.910571
+vt 0.735325 0.910555
+vt 0.751986 0.906381
+vt 0.751986 0.910511
+vt 0.743659 0.910535
+vt 0.743659 0.906405
+vt 0.743659 0.902276
+vt 0.751987 0.902251
+vt 0.743659 0.898146
+vt 0.751987 0.898122
+vt 0.760307 0.902223
+vt 0.760307 0.906353
+vt 0.768620 0.902192
+vt 0.768620 0.906323
+vt 0.760308 0.898094
+vt 0.768621 0.898063
+vt 0.760307 0.910483
+vt 0.768620 0.910453
+vt 0.785219 0.906255
+vt 0.785219 0.910386
+vt 0.776924 0.910421
+vt 0.776924 0.906290
+vt 0.776924 0.902159
+vt 0.785219 0.902124
+vt 0.776925 0.898030
+vt 0.785220 0.897995
+vt 0.793505 0.902088
+vt 0.793505 0.906219
+vt 0.801781 0.902051
+vt 0.801780 0.906182
+vt 0.793505 0.897959
+vt 0.801781 0.897922
+vt 0.793504 0.910351
+vt 0.801780 0.910315
+vt 0.818302 0.906110
+vt 0.818302 0.910243
+vt 0.810045 0.910278
+vt 0.810046 0.906146
+vt 0.810047 0.902015
+vt 0.818303 0.901979
+vt 0.810047 0.897885
+vt 0.818303 0.897849
+vt 0.826549 0.901944
+vt 0.826549 0.906076
+vt 0.834787 0.901911
+vt 0.834787 0.906043
+vt 0.826550 0.897814
+vt 0.834788 0.897781
+vt 0.826548 0.910209
+vt 0.834786 0.910177
+vt 0.851237 0.905986
+vt 0.851236 0.910120
+vt 0.843015 0.910147
+vt 0.843016 0.906013
+vt 0.843016 0.901881
+vt 0.851238 0.901854
+vt 0.843017 0.897751
+vt 0.851238 0.897724
+vt 0.859452 0.901830
+vt 0.859452 0.905962
+vt 0.867661 0.901810
+vt 0.867660 0.905942
+vt 0.859453 0.897700
+vt 0.867662 0.897680
+vt 0.859451 0.910097
+vt 0.867660 0.910077
+vt 0.884064 0.905914
+vt 0.884064 0.910049
+vt 0.875864 0.910062
+vt 0.875864 0.905927
+vt 0.875865 0.901794
+vt 0.884065 0.901782
+vt 0.875866 0.897664
+vt 0.884066 0.897652
+vt 0.892263 0.901771
+vt 0.892262 0.905904
+vt 0.900459 0.901762
+vt 0.900459 0.905895
+vt 0.892263 0.897641
+vt 0.900460 0.897632
+vt 0.892262 0.910039
+vt 0.900458 0.910030
+vt 0.122786 0.905917
+vt 0.122785 0.910052
+vt 0.114587 0.910040
+vt 0.114588 0.905905
+vt 0.106391 0.910030
+vt 0.106391 0.905895
+vt 0.114589 0.901773
+vt 0.122787 0.901784
+vt 0.114589 0.897642
+vt 0.122787 0.897654
+vt 0.106392 0.901762
+vt 0.106393 0.897632
+vt 0.130987 0.901798
+vt 0.130986 0.905930
+vt 0.139191 0.901814
+vt 0.139191 0.905947
+vt 0.130988 0.897668
+vt 0.139192 0.897684
+vt 0.130986 0.910065
+vt 0.139190 0.910082
+vt 0.155615 0.905993
+vt 0.155614 0.910127
+vt 0.147399 0.910102
+vt 0.147400 0.905968
+vt 0.147400 0.901836
+vt 0.155615 0.901860
+vt 0.147401 0.897705
+vt 0.155616 0.897730
+vt 0.163837 0.901889
+vt 0.163837 0.906021
+vt 0.172067 0.901920
+vt 0.172066 0.906052
+vt 0.163838 0.897759
+vt 0.172068 0.897790
+vt 0.163836 0.910155
+vt 0.172066 0.910186
+vt 0.188552 0.906121
+vt 0.188552 0.910254
+vt 0.180304 0.910219
+vt 0.180305 0.906085
+vt 0.180305 0.901954
+vt 0.188553 0.901990
+vt 0.180306 0.897824
+vt 0.188553 0.897860
+vt 0.196810 0.902026
+vt 0.196809 0.906157
+vt 0.205076 0.902064
+vt 0.205076 0.906195
+vt 0.196810 0.897897
+vt 0.205077 0.897934
+vt 0.196809 0.910290
+vt 0.205075 0.910327
+vt 0.221639 0.906269
+vt 0.221639 0.910400
+vt 0.213352 0.910364
+vt 0.213353 0.906232
+vt 0.213353 0.902101
+vt 0.221640 0.902138
+vt 0.213353 0.897972
+vt 0.221640 0.898009
+vt 0.229936 0.902174
+vt 0.229935 0.906304
+vt 0.238241 0.902208
+vt 0.238240 0.906338
+vt 0.229936 0.898045
+vt 0.238241 0.898078
+vt 0.229935 0.910435
+vt 0.238240 0.910469
+vt 0.254876 0.906397
+vt 0.254876 0.910527
+vt 0.246554 0.910499
+vt 0.246554 0.906369
+vt 0.246555 0.902239
+vt 0.254877 0.902267
+vt 0.246555 0.898110
+vt 0.254877 0.898138
+vt 0.263205 0.902292
+vt 0.263205 0.906422
+vt 0.271540 0.902313
+vt 0.271540 0.906443
+vt 0.263206 0.898163
+vt 0.271541 0.898184
+vt 0.263205 0.910552
+vt 0.271540 0.910572
+vt 0.288224 0.906471
+vt 0.288224 0.910601
+vt 0.279880 0.910589
+vt 0.279880 0.906459
+vt 0.279881 0.902330
+vt 0.288224 0.902342
+vt 0.279881 0.898201
+vt 0.288225 0.898213
+vt 0.296571 0.902350
+vt 0.296571 0.906479
+vt 0.304919 0.902352
+vt 0.304919 0.906481
+vt 0.296571 0.898221
+vt 0.304919 0.898223
+vt 0.296571 0.910608
+vt 0.304919 0.910610
+vt 0.321613 0.906471
+vt 0.321613 0.910601
+vt 0.313267 0.910608
+vt 0.313267 0.906479
+vt 0.313266 0.902350
+vt 0.321613 0.902342
+vt 0.313266 0.898220
+vt 0.321613 0.898213
+vt 0.329957 0.902330
+vt 0.329957 0.906459
+vt 0.329957 0.898201
+vt 0.329957 0.910589
+vt 0.354960 0.889881
+vt 0.354960 0.894009
+vt 0.346631 0.894034
+vt 0.346631 0.889906
+vt 0.338297 0.894055
+vt 0.338296 0.889926
+vt 0.346631 0.885777
+vt 0.354960 0.885753
+vt 0.346631 0.881649
+vt 0.354960 0.881625
+vt 0.338296 0.885798
+vt 0.338296 0.881670
+vt 0.363282 0.885725
+vt 0.363282 0.889853
+vt 0.371595 0.885694
+vt 0.371596 0.889822
+vt 0.363281 0.881598
+vt 0.371595 0.881567
+vt 0.363282 0.893981
+vt 0.371596 0.893950
+vt 0.388197 0.889753
+vt 0.388197 0.893880
+vt 0.379901 0.893916
+vt 0.379901 0.889788
+vt 0.379900 0.885661
+vt 0.388196 0.885626
+vt 0.379900 0.881535
+vt 0.388196 0.881500
+vt 0.396483 0.885590
+vt 0.396483 0.889716
+vt 0.404759 0.885553
+vt 0.404760 0.889679
+vt 0.396482 0.881464
+vt 0.404759 0.881428
+vt 0.396483 0.893843
+vt 0.404760 0.893806
+vt 0.421283 0.889605
+vt 0.421283 0.893731
+vt 0.413027 0.893768
+vt 0.413026 0.889641
+vt 0.413026 0.885516
+vt 0.421283 0.885480
+vt 0.413025 0.881392
+vt 0.421282 0.881356
+vt 0.429530 0.885445
+vt 0.429530 0.889569
+vt 0.437768 0.885412
+vt 0.437769 0.889536
+vt 0.429529 0.881322
+vt 0.437768 0.881289
+vt 0.429531 0.893696
+vt 0.437769 0.893662
+vt 0.454220 0.889477
+vt 0.454221 0.893602
+vt 0.445999 0.893631
+vt 0.445998 0.889505
+vt 0.445998 0.885381
+vt 0.454220 0.885353
+vt 0.445997 0.881259
+vt 0.454219 0.881231
+vt 0.462435 0.885329
+vt 0.462435 0.889452
+vt 0.470644 0.885308
+vt 0.470644 0.889431
+vt 0.462434 0.881207
+vt 0.470643 0.881187
+vt 0.462436 0.893577
+vt 0.470645 0.893556
+vt 0.487049 0.889402
+vt 0.487049 0.893527
+vt 0.478849 0.893539
+vt 0.478848 0.889414
+vt 0.478848 0.885291
+vt 0.487048 0.885279
+vt 0.478847 0.881171
+vt 0.487048 0.881159
+vt 0.495246 0.885271
+vt 0.495247 0.889394
+vt 0.503443 0.885269
+vt 0.503443 0.889391
+vt 0.495246 0.881151
+vt 0.503442 0.881148
+vt 0.495247 0.893519
+vt 0.503444 0.893516
+vt 0.519837 0.889400
+vt 0.519838 0.893525
+vt 0.511640 0.893518
+vt 0.511640 0.889393
+vt 0.511639 0.885270
+vt 0.519837 0.885277
+vt 0.511639 0.881150
+vt 0.519836 0.881156
+vt 0.528037 0.885288
+vt 0.528038 0.889411
+vt 0.536241 0.885303
+vt 0.536241 0.889426
+vt 0.528037 0.881167
+vt 0.536240 0.881182
+vt 0.528038 0.893536
+vt 0.536242 0.893552
+vt 0.552665 0.889470
+vt 0.552665 0.893596
+vt 0.544451 0.893572
+vt 0.544450 0.889446
+vt 0.544450 0.885323
+vt 0.552664 0.885346
+vt 0.544449 0.881202
+vt 0.552664 0.881225
+vt 0.560886 0.885373
+vt 0.560886 0.889497
+vt 0.569115 0.885403
+vt 0.569116 0.889527
+vt 0.560886 0.881251
+vt 0.569115 0.881280
+vt 0.560887 0.893623
+vt 0.569116 0.893653
+vt 0.585600 0.889594
+vt 0.585601 0.893721
+vt 0.577354 0.893686
+vt 0.577353 0.889560
+vt 0.577353 0.885435
+vt 0.585600 0.885469
+vt 0.577353 0.881312
+vt 0.585599 0.881345
+vt 0.593856 0.885504
+vt 0.593856 0.889630
+vt 0.602122 0.885540
+vt 0.602122 0.889666
+vt 0.593856 0.881380
+vt 0.602121 0.881416
+vt 0.593857 0.893757
+vt 0.602122 0.893793
+vt 0.618684 0.889738
+vt 0.618684 0.893866
+vt 0.610398 0.893830
+vt 0.610398 0.889702
+vt 0.610398 0.885576
+vt 0.618683 0.885612
+vt 0.610397 0.881451
+vt 0.618683 0.881486
+vt 0.626978 0.885646
+vt 0.626979 0.889773
+vt 0.635283 0.885679
+vt 0.635283 0.889806
+vt 0.626978 0.881520
+vt 0.635282 0.881552
+vt 0.626979 0.893901
+vt 0.635283 0.893934
+vt 0.651917 0.889864
+vt 0.651917 0.893993
+vt 0.643596 0.893965
+vt 0.643596 0.889837
+vt 0.643596 0.885709
+vt 0.651917 0.885736
+vt 0.643595 0.881582
+vt 0.651916 0.881609
+vt 0.660244 0.885760
+vt 0.660244 0.889889
+vt 0.668578 0.885781
+vt 0.668578 0.889909
+vt 0.660244 0.881633
+vt 0.668578 0.881653
+vt 0.660245 0.894017
+vt 0.668578 0.894038
+vt 0.685260 0.889938
+vt 0.685260 0.894066
+vt 0.676917 0.894054
+vt 0.676917 0.889926
+vt 0.676917 0.885797
+vt 0.685260 0.885809
+vt 0.676917 0.881668
+vt 0.685260 0.881680
+vt 0.693605 0.885816
+vt 0.693605 0.889945
+vt 0.701952 0.885818
+vt 0.701952 0.889947
+vt 0.693605 0.881687
+vt 0.701952 0.881689
+vt 0.693605 0.894074
+vt 0.701952 0.894076
+vt 0.718644 0.889938
+vt 0.718644 0.894066
+vt 0.710299 0.894074
+vt 0.710299 0.889945
+vt 0.710299 0.885816
+vt 0.718644 0.885809
+vt 0.710299 0.881687
+vt 0.718644 0.881680
+vt 0.726987 0.885797
+vt 0.726987 0.889926
+vt 0.735326 0.885781
+vt 0.735326 0.889909
+vt 0.726987 0.881669
+vt 0.735326 0.881653
+vt 0.726987 0.894055
+vt 0.735326 0.894038
+vt 0.751987 0.889865
+vt 0.751987 0.893993
+vt 0.743659 0.894017
+vt 0.743659 0.889889
+vt 0.743660 0.885761
+vt 0.751988 0.885737
+vt 0.743660 0.881633
+vt 0.751988 0.881609
+vt 0.760309 0.885709
+vt 0.760308 0.889837
+vt 0.768621 0.885679
+vt 0.768621 0.889806
+vt 0.760309 0.881582
+vt 0.768622 0.881552
+vt 0.760308 0.893965
+vt 0.768621 0.893934
+vt 0.785221 0.889739
+vt 0.785220 0.893866
+vt 0.776925 0.893901
+vt 0.776925 0.889773
+vt 0.776926 0.885646
+vt 0.785221 0.885612
+vt 0.776926 0.881520
+vt 0.785221 0.881486
+vt 0.793506 0.885576
+vt 0.793506 0.889703
+vt 0.801782 0.885540
+vt 0.801782 0.889666
+vt 0.793507 0.881451
+vt 0.801783 0.881416
+vt 0.793506 0.893830
+vt 0.801782 0.893793
+vt 0.818304 0.889594
+vt 0.818304 0.893721
+vt 0.810048 0.893757
+vt 0.810048 0.889630
+vt 0.810048 0.885504
+vt 0.818304 0.885469
+vt 0.810049 0.881380
+vt 0.818305 0.881346
+vt 0.826551 0.885435
+vt 0.826551 0.889560
+vt 0.834789 0.885403
+vt 0.834789 0.889527
+vt 0.826552 0.881312
+vt 0.834789 0.881280
+vt 0.826550 0.893686
+vt 0.834788 0.893653
+vt 0.851239 0.889470
+vt 0.851239 0.893596
+vt 0.843017 0.893623
+vt 0.843018 0.889497
+vt 0.843018 0.885373
+vt 0.851240 0.885347
+vt 0.843019 0.881251
+vt 0.851240 0.881225
+vt 0.859454 0.885323
+vt 0.859454 0.889446
+vt 0.867663 0.885304
+vt 0.867663 0.889427
+vt 0.859455 0.881202
+vt 0.867664 0.881183
+vt 0.859453 0.893572
+vt 0.867662 0.893552
+vt 0.884067 0.889399
+vt 0.884066 0.893524
+vt 0.875866 0.893536
+vt 0.875867 0.889411
+vt 0.875867 0.885288
+vt 0.884067 0.885276
+vt 0.875868 0.881168
+vt 0.884068 0.881156
+vt 0.892265 0.885266
+vt 0.892265 0.889389
+vt 0.900462 0.885257
+vt 0.900461 0.889379
+vt 0.892266 0.881146
+vt 0.900462 0.881137
+vt 0.892264 0.893514
+vt 0.900461 0.893504
+vt 0.122788 0.889401
+vt 0.122788 0.893526
+vt 0.114590 0.893515
+vt 0.114590 0.889390
+vt 0.106393 0.893504
+vt 0.106394 0.889379
+vt 0.114591 0.885267
+vt 0.122789 0.885278
+vt 0.114591 0.881147
+vt 0.122789 0.881158
+vt 0.106394 0.885257
+vt 0.106395 0.881137
+vt 0.130989 0.885291
+vt 0.130989 0.889414
+vt 0.139193 0.885308
+vt 0.139193 0.889431
+vt 0.130990 0.881171
+vt 0.139194 0.881187
+vt 0.130988 0.893540
+vt 0.139192 0.893557
+vt 0.155617 0.889477
+vt 0.155617 0.893603
+vt 0.147401 0.893578
+vt 0.147402 0.889452
+vt 0.147402 0.885329
+vt 0.155617 0.885353
+vt 0.147403 0.881208
+vt 0.155618 0.881232
+vt 0.163839 0.885381
+vt 0.163839 0.889505
+vt 0.172069 0.885412
+vt 0.172069 0.889536
+vt 0.163840 0.881259
+vt 0.172069 0.881289
+vt 0.163838 0.893631
+vt 0.172068 0.893662
+vt 0.188554 0.889605
+vt 0.188554 0.893731
+vt 0.180306 0.893696
+vt 0.180307 0.889570
+vt 0.180307 0.885445
+vt 0.188555 0.885480
+vt 0.180308 0.881322
+vt 0.188555 0.881356
+vt 0.196811 0.885516
+vt 0.196811 0.889641
+vt 0.205078 0.885553
+vt 0.205078 0.889679
+vt 0.196812 0.881392
+vt 0.205078 0.881428
+vt 0.196811 0.893768
+vt 0.205077 0.893806
+vt 0.221641 0.889753
+vt 0.221640 0.893880
+vt 0.213354 0.893843
+vt 0.213354 0.889716
+vt 0.213355 0.885590
+vt 0.221641 0.885626
+vt 0.213355 0.881464
+vt 0.221641 0.881500
+vt 0.229937 0.885661
+vt 0.229937 0.889788
+vt 0.238242 0.885694
+vt 0.238242 0.889822
+vt 0.229937 0.881535
+vt 0.238242 0.881567
+vt 0.229936 0.893916
+vt 0.238241 0.893950
+vt 0.254877 0.889881
+vt 0.254877 0.894009
+vt 0.246555 0.893981
+vt 0.246555 0.889853
+vt 0.246556 0.885725
+vt 0.254877 0.885753
+vt 0.246556 0.881598
+vt 0.254878 0.881625
+vt 0.263206 0.885777
+vt 0.263206 0.889906
+vt 0.271541 0.885798
+vt 0.271541 0.889927
+vt 0.263206 0.881649
+vt 0.271541 0.881670
+vt 0.263206 0.894034
+vt 0.271541 0.894055
+vt 0.288225 0.889955
+vt 0.288225 0.894084
+vt 0.279881 0.894072
+vt 0.279881 0.889943
+vt 0.279881 0.885814
+vt 0.288225 0.885826
+vt 0.279881 0.881686
+vt 0.288225 0.881698
+vt 0.296571 0.885834
+vt 0.296571 0.889962
+vt 0.304919 0.885836
+vt 0.304919 0.889965
+vt 0.296571 0.881705
+vt 0.304919 0.881707
+vt 0.296571 0.894091
+vt 0.304919 0.894094
+vt 0.321613 0.889955
+vt 0.321613 0.894084
+vt 0.313266 0.894091
+vt 0.313266 0.889962
+vt 0.313266 0.885834
+vt 0.321613 0.885826
+vt 0.313266 0.881705
+vt 0.321613 0.881697
+vt 0.329956 0.885814
+vt 0.329956 0.889943
+vt 0.329956 0.881686
+vt 0.329957 0.894072
+vt 0.354959 0.873371
+vt 0.354959 0.877498
+vt 0.346631 0.877522
+vt 0.346631 0.873394
+vt 0.338296 0.877541
+vt 0.338296 0.873414
+vt 0.346630 0.869267
+vt 0.354959 0.869245
+vt 0.346630 0.865140
+vt 0.354959 0.865119
+vt 0.338296 0.869286
+vt 0.338296 0.865158
+vt 0.363281 0.869219
+vt 0.363281 0.873345
+vt 0.371594 0.869191
+vt 0.371595 0.873316
+vt 0.363281 0.865094
+vt 0.371594 0.865067
+vt 0.363281 0.877471
+vt 0.371595 0.877441
+vt 0.388195 0.873252
+vt 0.388196 0.877375
+vt 0.379900 0.877409
+vt 0.379900 0.873285
+vt 0.379899 0.869161
+vt 0.388195 0.869129
+vt 0.379899 0.865037
+vt 0.388195 0.865006
+vt 0.396482 0.869095
+vt 0.396482 0.873217
+vt 0.404758 0.869062
+vt 0.404758 0.873183
+vt 0.396481 0.864974
+vt 0.404758 0.864942
+vt 0.396482 0.877340
+vt 0.404759 0.877305
+vt 0.421281 0.873114
+vt 0.421282 0.877234
+vt 0.413025 0.877269
+vt 0.413025 0.873148
+vt 0.413024 0.869028
+vt 0.421281 0.868995
+vt 0.413024 0.864909
+vt 0.421281 0.864877
+vt 0.429528 0.868963
+vt 0.429529 0.873081
+vt 0.437767 0.868933
+vt 0.437767 0.873050
+vt 0.429528 0.864846
+vt 0.437766 0.864817
+vt 0.429529 0.877201
+vt 0.437767 0.877169
+vt 0.454218 0.872995
+vt 0.454219 0.877112
+vt 0.445997 0.877139
+vt 0.445997 0.873021
+vt 0.445996 0.868904
+vt 0.454218 0.868879
+vt 0.445996 0.864790
+vt 0.454218 0.864765
+vt 0.462433 0.868857
+vt 0.462433 0.872971
+vt 0.470642 0.868838
+vt 0.470642 0.872952
+vt 0.462433 0.864744
+vt 0.470642 0.864725
+vt 0.462434 0.877088
+vt 0.470643 0.877068
+vt 0.487047 0.872925
+vt 0.487047 0.877041
+vt 0.478847 0.877052
+vt 0.478847 0.872936
+vt 0.478846 0.868823
+vt 0.487046 0.868811
+vt 0.478846 0.864711
+vt 0.487046 0.864700
+vt 0.495244 0.868804
+vt 0.495245 0.872918
+vt 0.503441 0.868802
+vt 0.503441 0.872915
+vt 0.495244 0.864693
+vt 0.503440 0.864691
+vt 0.495245 0.877033
+vt 0.503442 0.877030
+vt 0.519836 0.872923
+vt 0.519836 0.877038
+vt 0.511638 0.877032
+vt 0.511638 0.872917
+vt 0.511637 0.868803
+vt 0.519835 0.868809
+vt 0.511637 0.864692
+vt 0.519835 0.864698
+vt 0.528035 0.868819
+vt 0.528036 0.872933
+vt 0.536239 0.868833
+vt 0.536240 0.872948
+vt 0.528035 0.864708
+vt 0.536239 0.864721
+vt 0.528036 0.877049
+vt 0.536240 0.877064
+vt 0.552663 0.872988
+vt 0.552664 0.877105
+vt 0.544449 0.877083
+vt 0.544448 0.872966
+vt 0.544448 0.868851
+vt 0.552663 0.868872
+vt 0.544448 0.864738
+vt 0.552662 0.864759
+vt 0.560884 0.868897
+vt 0.560885 0.873013
+vt 0.569114 0.868924
+vt 0.569114 0.873041
+vt 0.560884 0.864782
+vt 0.569113 0.864808
+vt 0.560885 0.877131
+vt 0.569114 0.877160
+vt 0.585599 0.873103
+vt 0.585599 0.877223
+vt 0.577352 0.877191
+vt 0.577352 0.873071
+vt 0.577351 0.868953
+vt 0.585598 0.868984
+vt 0.577351 0.864837
+vt 0.585598 0.864866
+vt 0.593855 0.869016
+vt 0.593855 0.873136
+vt 0.602121 0.869049
+vt 0.602121 0.873170
+vt 0.593854 0.864898
+vt 0.602120 0.864929
+vt 0.593855 0.877258
+vt 0.602121 0.877292
+vt 0.618682 0.873237
+vt 0.618683 0.877361
+vt 0.610397 0.877327
+vt 0.610397 0.873204
+vt 0.610397 0.869082
+vt 0.618682 0.869115
+vt 0.610396 0.864961
+vt 0.618682 0.864992
+vt 0.626977 0.869146
+vt 0.626978 0.873270
+vt 0.635282 0.869176
+vt 0.635282 0.873301
+vt 0.626977 0.865023
+vt 0.635282 0.865052
+vt 0.626978 0.877394
+vt 0.635282 0.877426
+vt 0.651916 0.873355
+vt 0.651916 0.877482
+vt 0.643595 0.877455
+vt 0.643595 0.873329
+vt 0.643595 0.869203
+vt 0.651916 0.869228
+vt 0.643595 0.865078
+vt 0.651916 0.865102
+vt 0.660244 0.869250
+vt 0.660244 0.873377
+vt 0.668578 0.869269
+vt 0.668578 0.873397
+vt 0.660244 0.865124
+vt 0.668578 0.865141
+vt 0.660244 0.877505
+vt 0.668578 0.877524
+vt 0.685260 0.873423
+vt 0.685260 0.877551
+vt 0.676917 0.877540
+vt 0.676917 0.873412
+vt 0.676917 0.869284
+vt 0.685260 0.869294
+vt 0.676917 0.865156
+vt 0.685260 0.865166
+vt 0.693605 0.869301
+vt 0.693605 0.873430
+vt 0.701952 0.869303
+vt 0.701952 0.873432
+vt 0.693605 0.865172
+vt 0.701952 0.865174
+vt 0.693605 0.877558
+vt 0.701952 0.877561
+vt 0.718644 0.873423
+vt 0.718644 0.877551
+vt 0.710299 0.877558
+vt 0.710299 0.873430
+vt 0.710299 0.869301
+vt 0.718644 0.869294
+vt 0.710299 0.865172
+vt 0.718644 0.865166
+vt 0.726987 0.869284
+vt 0.726987 0.873412
+vt 0.735326 0.869269
+vt 0.735326 0.873397
+vt 0.726987 0.865156
+vt 0.735326 0.865141
+vt 0.726987 0.877540
+vt 0.735326 0.877524
+vt 0.751988 0.873355
+vt 0.751988 0.877482
+vt 0.743660 0.877505
+vt 0.743660 0.873378
+vt 0.743660 0.869250
+vt 0.751988 0.869228
+vt 0.743661 0.865124
+vt 0.751988 0.865102
+vt 0.760309 0.869203
+vt 0.760309 0.873329
+vt 0.768622 0.869176
+vt 0.768622 0.873301
+vt 0.760309 0.865078
+vt 0.768623 0.865052
+vt 0.760309 0.877455
+vt 0.768622 0.877426
+vt 0.785222 0.873238
+vt 0.785221 0.877362
+vt 0.776926 0.877395
+vt 0.776926 0.873270
+vt 0.776927 0.869146
+vt 0.785222 0.869115
+vt 0.776927 0.865023
+vt 0.785222 0.864993
+vt 0.793508 0.869082
+vt 0.793507 0.873204
+vt 0.801784 0.869049
+vt 0.801783 0.873170
+vt 0.793508 0.864961
+vt 0.801784 0.864930
+vt 0.793507 0.877327
+vt 0.801783 0.877292
+vt 0.818305 0.873103
+vt 0.818305 0.877224
+vt 0.810049 0.877258
+vt 0.810049 0.873137
+vt 0.810050 0.869017
+vt 0.818306 0.868984
+vt 0.810050 0.864898
+vt 0.818306 0.864867
+vt 0.826553 0.868953
+vt 0.826552 0.873071
+vt 0.834791 0.868924
+vt 0.834790 0.873041
+vt 0.826553 0.864837
+vt 0.834791 0.864809
+vt 0.826552 0.877191
+vt 0.834790 0.877160
+vt 0.851241 0.872988
+vt 0.851241 0.877106
+vt 0.843019 0.877131
+vt 0.843019 0.873013
+vt 0.843020 0.868897
+vt 0.851241 0.868873
+vt 0.843020 0.864783
+vt 0.851242 0.864759
+vt 0.859456 0.868851
+vt 0.859456 0.872966
+vt 0.867665 0.868834
+vt 0.867664 0.872948
+vt 0.859456 0.864739
+vt 0.867665 0.864721
+vt 0.859455 0.877083
+vt 0.867664 0.877064
+vt 0.884069 0.872922
+vt 0.884068 0.877038
+vt 0.875868 0.877049
+vt 0.875868 0.872933
+vt 0.875869 0.868820
+vt 0.884069 0.868808
+vt 0.875869 0.864708
+vt 0.884070 0.864697
+vt 0.892267 0.868799
+vt 0.892266 0.872912
+vt 0.900463 0.868791
+vt 0.900463 0.872904
+vt 0.892267 0.864688
+vt 0.900464 0.864680
+vt 0.892266 0.877028
+vt 0.900463 0.877019
+vt 0.122790 0.872924
+vt 0.122790 0.877040
+vt 0.114592 0.877029
+vt 0.114592 0.872913
+vt 0.106395 0.877019
+vt 0.106396 0.872904
+vt 0.114593 0.868800
+vt 0.122791 0.868811
+vt 0.114593 0.864689
+vt 0.122791 0.864699
+vt 0.106396 0.868791
+vt 0.106397 0.864680
+vt 0.130991 0.868823
+vt 0.130991 0.872937
+vt 0.139195 0.868838
+vt 0.139195 0.872952
+vt 0.130991 0.864711
+vt 0.139195 0.864726
+vt 0.130990 0.877053
+vt 0.139194 0.877069
+vt 0.155619 0.872995
+vt 0.155618 0.877112
+vt 0.147403 0.877089
+vt 0.147404 0.872972
+vt 0.147404 0.868857
+vt 0.155619 0.868879
+vt 0.147404 0.864744
+vt 0.155619 0.864766
+vt 0.163841 0.868905
+vt 0.163841 0.873021
+vt 0.172070 0.868933
+vt 0.172070 0.873050
+vt 0.163841 0.864790
+vt 0.172071 0.864817
+vt 0.163840 0.877139
+vt 0.172070 0.877169
+vt 0.188556 0.873114
+vt 0.188555 0.877234
+vt 0.180308 0.877201
+vt 0.180308 0.873081
+vt 0.180309 0.868963
+vt 0.188556 0.868995
+vt 0.180309 0.864847
+vt 0.188556 0.864877
+vt 0.196813 0.869028
+vt 0.196812 0.873148
+vt 0.205079 0.869062
+vt 0.205079 0.873183
+vt 0.196813 0.864909
+vt 0.205079 0.864942
+vt 0.196812 0.877269
+vt 0.205079 0.877305
+vt 0.221642 0.873252
+vt 0.221641 0.877375
+vt 0.213355 0.877340
+vt 0.213355 0.873217
+vt 0.213356 0.869096
+vt 0.221642 0.869129
+vt 0.213356 0.864974
+vt 0.221642 0.865007
+vt 0.229938 0.869161
+vt 0.229938 0.873285
+vt 0.238243 0.869191
+vt 0.238243 0.873316
+vt 0.229938 0.865038
+vt 0.238243 0.865067
+vt 0.229937 0.877409
+vt 0.238242 0.877441
+vt 0.254878 0.873371
+vt 0.254878 0.877498
+vt 0.246556 0.877471
+vt 0.246556 0.873345
+vt 0.246556 0.869219
+vt 0.254878 0.869245
+vt 0.246557 0.865094
+vt 0.254878 0.865119
+vt 0.263207 0.869267
+vt 0.263207 0.873394
+vt 0.271541 0.869286
+vt 0.271541 0.873414
+vt 0.263207 0.865140
+vt 0.271542 0.865158
+vt 0.263206 0.877522
+vt 0.271541 0.877542
+vt 0.288225 0.873440
+vt 0.288225 0.877569
+vt 0.279881 0.877557
+vt 0.279881 0.873429
+vt 0.279881 0.869301
+vt 0.288225 0.869312
+vt 0.279881 0.865173
+vt 0.288225 0.865183
+vt 0.296571 0.869318
+vt 0.296571 0.873447
+vt 0.304919 0.869321
+vt 0.304919 0.873450
+vt 0.296571 0.865190
+vt 0.304919 0.865192
+vt 0.296571 0.877576
+vt 0.304919 0.877578
+vt 0.321612 0.873440
+vt 0.321612 0.877569
+vt 0.313266 0.877576
+vt 0.313266 0.873447
+vt 0.313266 0.869318
+vt 0.321612 0.869312
+vt 0.313266 0.865190
+vt 0.321612 0.865183
+vt 0.329956 0.869301
+vt 0.329956 0.873429
+vt 0.329956 0.865173
+vt 0.329956 0.877557
+vt 0.354959 0.856867
+vt 0.354959 0.860993
+vt 0.346630 0.861014
+vt 0.346630 0.856887
+vt 0.338296 0.861031
+vt 0.338295 0.856904
+vt 0.346630 0.852761
+vt 0.354959 0.852742
+vt 0.346630 0.848635
+vt 0.354958 0.848618
+vt 0.338295 0.852777
+vt 0.338295 0.848650
+vt 0.363280 0.852721
+vt 0.363280 0.856845
+vt 0.371594 0.852697
+vt 0.371594 0.856820
+vt 0.363280 0.848597
+vt 0.371594 0.848575
+vt 0.363280 0.860969
+vt 0.371594 0.860943
+vt 0.388195 0.856765
+vt 0.388195 0.860885
+vt 0.379899 0.860915
+vt 0.379899 0.856793
+vt 0.379899 0.852672
+vt 0.388194 0.852645
+vt 0.379898 0.848551
+vt 0.388194 0.848526
+vt 0.396481 0.852617
+vt 0.396481 0.856735
+vt 0.404757 0.852589
+vt 0.404757 0.856705
+vt 0.396480 0.848500
+vt 0.404757 0.848473
+vt 0.396481 0.860854
+vt 0.404757 0.860823
+vt 0.421280 0.856646
+vt 0.421281 0.860761
+vt 0.413024 0.860792
+vt 0.413024 0.856676
+vt 0.413023 0.852560
+vt 0.421280 0.852533
+vt 0.413023 0.848446
+vt 0.421280 0.848420
+vt 0.429527 0.852506
+vt 0.429527 0.856618
+vt 0.437765 0.852480
+vt 0.437766 0.856591
+vt 0.429527 0.848395
+vt 0.437765 0.848371
+vt 0.429528 0.860731
+vt 0.437766 0.860703
+vt 0.454217 0.856544
+vt 0.454217 0.860654
+vt 0.445996 0.860677
+vt 0.445995 0.856566
+vt 0.445995 0.852457
+vt 0.454217 0.852435
+vt 0.445995 0.848349
+vt 0.454216 0.848329
+vt 0.462432 0.852417
+vt 0.462432 0.856524
+vt 0.470641 0.852401
+vt 0.470641 0.856507
+vt 0.462431 0.848311
+vt 0.470640 0.848296
+vt 0.462432 0.860633
+vt 0.470641 0.860615
+vt 0.487045 0.856484
+vt 0.487046 0.860591
+vt 0.478845 0.860601
+vt 0.478845 0.856494
+vt 0.478845 0.852388
+vt 0.487045 0.852378
+vt 0.478844 0.848284
+vt 0.487045 0.848275
+vt 0.495243 0.852372
+vt 0.495243 0.856477
+vt 0.503439 0.852370
+vt 0.503440 0.856475
+vt 0.495242 0.848269
+vt 0.503439 0.848267
+vt 0.495243 0.860584
+vt 0.503440 0.860582
+vt 0.519834 0.856481
+vt 0.519834 0.860589
+vt 0.511637 0.860583
+vt 0.511636 0.856476
+vt 0.511636 0.852371
+vt 0.519834 0.852376
+vt 0.511636 0.848268
+vt 0.519833 0.848273
+vt 0.528034 0.852384
+vt 0.528034 0.856490
+vt 0.536238 0.852396
+vt 0.536238 0.856503
+vt 0.528033 0.848281
+vt 0.536237 0.848291
+vt 0.528035 0.860598
+vt 0.536239 0.860611
+vt 0.552662 0.856537
+vt 0.552662 0.860647
+vt 0.544447 0.860627
+vt 0.544447 0.856518
+vt 0.544447 0.852411
+vt 0.552661 0.852429
+vt 0.544446 0.848305
+vt 0.552661 0.848322
+vt 0.560883 0.852449
+vt 0.560883 0.856559
+vt 0.569112 0.852472
+vt 0.569113 0.856582
+vt 0.560883 0.848341
+vt 0.569112 0.848362
+vt 0.560884 0.860670
+vt 0.569113 0.860695
+vt 0.585597 0.856635
+vt 0.585598 0.860750
+vt 0.577351 0.860722
+vt 0.577350 0.856608
+vt 0.577350 0.852496
+vt 0.585597 0.852522
+vt 0.577350 0.848385
+vt 0.585597 0.848410
+vt 0.593853 0.852549
+vt 0.593854 0.856664
+vt 0.602119 0.852576
+vt 0.602120 0.856693
+vt 0.593853 0.848435
+vt 0.602119 0.848461
+vt 0.593854 0.860780
+vt 0.602120 0.860811
+vt 0.618682 0.856751
+vt 0.618682 0.860871
+vt 0.610396 0.860841
+vt 0.610396 0.856722
+vt 0.610396 0.852604
+vt 0.618681 0.852631
+vt 0.610395 0.848486
+vt 0.618681 0.848512
+vt 0.626977 0.852657
+vt 0.626977 0.856778
+vt 0.635281 0.852682
+vt 0.635281 0.856805
+vt 0.626976 0.848537
+vt 0.635281 0.848560
+vt 0.626977 0.860900
+vt 0.635281 0.860928
+vt 0.651915 0.856851
+vt 0.651916 0.860977
+vt 0.643595 0.860953
+vt 0.643594 0.856829
+vt 0.643594 0.852705
+vt 0.651915 0.852726
+vt 0.643594 0.848582
+vt 0.651915 0.848601
+vt 0.660243 0.852744
+vt 0.660243 0.856871
+vt 0.668577 0.852760
+vt 0.668577 0.856887
+vt 0.660243 0.848619
+vt 0.668577 0.848633
+vt 0.660244 0.860997
+vt 0.668578 0.861014
+vt 0.685260 0.856909
+vt 0.685260 0.861038
+vt 0.676917 0.861028
+vt 0.676917 0.856900
+vt 0.676917 0.852772
+vt 0.685260 0.852781
+vt 0.676916 0.848645
+vt 0.685260 0.848653
+vt 0.693605 0.852787
+vt 0.693605 0.856915
+vt 0.701952 0.852789
+vt 0.701952 0.856917
+vt 0.693605 0.848658
+vt 0.701952 0.848660
+vt 0.693605 0.861044
+vt 0.701952 0.861046
+vt 0.718644 0.856909
+vt 0.718644 0.861038
+vt 0.710299 0.861044
+vt 0.710299 0.856915
+vt 0.710299 0.852787
+vt 0.718644 0.852781
+vt 0.710299 0.848658
+vt 0.718644 0.848653
+vt 0.726988 0.852772
+vt 0.726987 0.856900
+vt 0.735327 0.852760
+vt 0.735327 0.856887
+vt 0.726988 0.848645
+vt 0.735327 0.848633
+vt 0.726987 0.861028
+vt 0.735327 0.861014
+vt 0.751989 0.856851
+vt 0.751989 0.860977
+vt 0.743661 0.860997
+vt 0.743661 0.856871
+vt 0.743661 0.852745
+vt 0.751989 0.852726
+vt 0.743661 0.848619
+vt 0.751989 0.848601
+vt 0.760310 0.852705
+vt 0.760310 0.856829
+vt 0.768623 0.852682
+vt 0.768623 0.856805
+vt 0.760310 0.848582
+vt 0.768623 0.848560
+vt 0.760310 0.860954
+vt 0.768623 0.860928
+vt 0.785223 0.856751
+vt 0.785222 0.860871
+vt 0.776927 0.860900
+vt 0.776927 0.856779
+vt 0.776927 0.852657
+vt 0.785223 0.852631
+vt 0.776928 0.848537
+vt 0.785223 0.848512
+vt 0.793509 0.852604
+vt 0.793508 0.856722
+vt 0.801785 0.852576
+vt 0.801784 0.856693
+vt 0.793509 0.848487
+vt 0.801785 0.848461
+vt 0.793508 0.860841
+vt 0.801784 0.860811
+vt 0.818307 0.856636
+vt 0.818306 0.860751
+vt 0.810050 0.860780
+vt 0.810050 0.856664
+vt 0.810051 0.852549
+vt 0.818307 0.852522
+vt 0.810051 0.848435
+vt 0.818307 0.848410
+vt 0.826554 0.852496
+vt 0.826554 0.856608
+vt 0.834792 0.852472
+vt 0.834792 0.856583
+vt 0.826554 0.848385
+vt 0.834792 0.848363
+vt 0.826553 0.860722
+vt 0.834791 0.860695
+vt 0.851242 0.856537
+vt 0.851242 0.860647
+vt 0.843021 0.860670
+vt 0.843021 0.856559
+vt 0.843021 0.852449
+vt 0.851243 0.852429
+vt 0.843022 0.848341
+vt 0.851243 0.848322
+vt 0.859457 0.852411
+vt 0.859457 0.856519
+vt 0.867666 0.852396
+vt 0.867666 0.856503
+vt 0.859458 0.848306
+vt 0.867667 0.848292
+vt 0.859457 0.860628
+vt 0.867666 0.860611
+vt 0.884070 0.856481
+vt 0.884070 0.860588
+vt 0.875870 0.860598
+vt 0.875870 0.856490
+vt 0.875870 0.852385
+vt 0.884071 0.852376
+vt 0.875871 0.848281
+vt 0.884071 0.848272
+vt 0.892268 0.852368
+vt 0.892268 0.856473
+vt 0.900465 0.852361
+vt 0.900465 0.856466
+vt 0.892269 0.848265
+vt 0.900465 0.848259
+vt 0.892268 0.860579
+vt 0.900464 0.860572
+vt 0.122792 0.856483
+vt 0.122791 0.860590
+vt 0.114594 0.860581
+vt 0.114594 0.856474
+vt 0.106397 0.860572
+vt 0.106397 0.856466
+vt 0.114594 0.852369
+vt 0.122792 0.852378
+vt 0.114595 0.848266
+vt 0.122792 0.848274
+vt 0.106398 0.852361
+vt 0.106398 0.848259
+vt 0.130992 0.852388
+vt 0.130992 0.856494
+vt 0.139196 0.852401
+vt 0.139196 0.856507
+vt 0.130993 0.848284
+vt 0.139197 0.848296
+vt 0.130992 0.860602
+vt 0.139196 0.860616
+vt 0.155620 0.856544
+vt 0.155620 0.860654
+vt 0.147405 0.860633
+vt 0.147405 0.856524
+vt 0.147406 0.852417
+vt 0.155620 0.852436
+vt 0.147406 0.848311
+vt 0.155621 0.848329
+vt 0.163842 0.852457
+vt 0.163842 0.856566
+vt 0.172072 0.852481
+vt 0.172071 0.856591
+vt 0.163843 0.848349
+vt 0.172072 0.848371
+vt 0.163842 0.860678
+vt 0.172071 0.860704
+vt 0.188557 0.856646
+vt 0.188557 0.860761
+vt 0.180309 0.860732
+vt 0.180310 0.856618
+vt 0.180310 0.852506
+vt 0.188557 0.852533
+vt 0.180310 0.848395
+vt 0.188557 0.848421
+vt 0.196814 0.852561
+vt 0.196814 0.856676
+vt 0.205080 0.852589
+vt 0.205080 0.856706
+vt 0.196814 0.848447
+vt 0.205080 0.848473
+vt 0.196813 0.860792
+vt 0.205080 0.860823
+vt 0.221643 0.856765
+vt 0.221642 0.860885
+vt 0.213356 0.860855
+vt 0.213356 0.856735
+vt 0.213357 0.852617
+vt 0.221643 0.852645
+vt 0.213357 0.848500
+vt 0.221643 0.848526
+vt 0.229939 0.852672
+vt 0.229938 0.856793
+vt 0.238243 0.852697
+vt 0.238243 0.856820
+vt 0.229939 0.848551
+vt 0.238244 0.848575
+vt 0.229938 0.860915
+vt 0.238243 0.860943
+vt 0.254879 0.856867
+vt 0.254878 0.860993
+vt 0.246557 0.860969
+vt 0.246557 0.856845
+vt 0.246557 0.852721
+vt 0.254879 0.852742
+vt 0.246557 0.848597
+vt 0.254879 0.848618
+vt 0.263207 0.852761
+vt 0.263207 0.856887
+vt 0.271542 0.852777
+vt 0.271542 0.856904
+vt 0.263207 0.848635
+vt 0.271542 0.848650
+vt 0.263207 0.861014
+vt 0.271542 0.861031
+vt 0.288225 0.856927
+vt 0.288225 0.861055
+vt 0.279881 0.861045
+vt 0.279881 0.856917
+vt 0.279882 0.852790
+vt 0.288225 0.852799
+vt 0.279882 0.848662
+vt 0.288225 0.848671
+vt 0.296571 0.852804
+vt 0.296571 0.856933
+vt 0.304919 0.852806
+vt 0.304919 0.856935
+vt 0.296571 0.848676
+vt 0.304919 0.848678
+vt 0.296571 0.861061
+vt 0.304919 0.861063
+vt 0.321612 0.856927
+vt 0.321612 0.861055
+vt 0.313266 0.861061
+vt 0.313266 0.856933
+vt 0.313266 0.852804
+vt 0.321612 0.852799
+vt 0.313266 0.848676
+vt 0.321612 0.848671
+vt 0.329956 0.852790
+vt 0.329956 0.856917
+vt 0.329956 0.848662
+vt 0.329956 0.861045
+vt 0.354958 0.840369
+vt 0.354958 0.844493
+vt 0.346630 0.844510
+vt 0.346630 0.840384
+vt 0.338295 0.844524
+vt 0.338295 0.840397
+vt 0.346630 0.836259
+vt 0.354958 0.836245
+vt 0.346629 0.832134
+vt 0.354958 0.832121
+vt 0.338295 0.836271
+vt 0.338295 0.832145
+vt 0.363279 0.836229
+vt 0.363280 0.840352
+vt 0.371593 0.836212
+vt 0.371593 0.840332
+vt 0.363279 0.832107
+vt 0.371593 0.832091
+vt 0.363280 0.844474
+vt 0.371593 0.844454
+vt 0.388194 0.840290
+vt 0.388194 0.844408
+vt 0.379898 0.844431
+vt 0.379898 0.840312
+vt 0.379898 0.836193
+vt 0.388193 0.836173
+vt 0.379898 0.832074
+vt 0.388193 0.832056
+vt 0.396480 0.836152
+vt 0.396480 0.840267
+vt 0.404756 0.836131
+vt 0.404756 0.840244
+vt 0.396479 0.832038
+vt 0.404756 0.832019
+vt 0.396480 0.844383
+vt 0.404756 0.844358
+vt 0.421279 0.840199
+vt 0.421279 0.844309
+vt 0.413023 0.844333
+vt 0.413023 0.840221
+vt 0.413022 0.836110
+vt 0.421279 0.836089
+vt 0.413022 0.832000
+vt 0.421279 0.831981
+vt 0.429526 0.836070
+vt 0.429526 0.840177
+vt 0.437764 0.836051
+vt 0.437764 0.840156
+vt 0.429526 0.831963
+vt 0.437764 0.831946
+vt 0.429527 0.844285
+vt 0.437765 0.844263
+vt 0.454216 0.840120
+vt 0.454216 0.844223
+vt 0.445994 0.844242
+vt 0.445994 0.840137
+vt 0.445994 0.836033
+vt 0.454215 0.836017
+vt 0.445993 0.831930
+vt 0.454215 0.831916
+vt 0.462430 0.836003
+vt 0.462431 0.840104
+vt 0.470639 0.835991
+vt 0.470640 0.840091
+vt 0.462430 0.831903
+vt 0.470639 0.831892
+vt 0.462431 0.844207
+vt 0.470640 0.844193
+vt 0.487044 0.840073
+vt 0.487044 0.844173
+vt 0.478844 0.844182
+vt 0.478844 0.840081
+vt 0.478843 0.835982
+vt 0.487044 0.835975
+vt 0.478843 0.831884
+vt 0.487043 0.831877
+vt 0.495241 0.835970
+vt 0.495242 0.840068
+vt 0.503438 0.835968
+vt 0.503438 0.840066
+vt 0.495241 0.831873
+vt 0.503438 0.831871
+vt 0.495242 0.844168
+vt 0.503439 0.844166
+vt 0.519833 0.840071
+vt 0.519833 0.844171
+vt 0.511635 0.844167
+vt 0.511635 0.840067
+vt 0.511635 0.835969
+vt 0.519832 0.835972
+vt 0.511634 0.831872
+vt 0.519832 0.831875
+vt 0.528033 0.835978
+vt 0.528033 0.840078
+vt 0.536237 0.835987
+vt 0.536237 0.840087
+vt 0.528032 0.831880
+vt 0.536236 0.831888
+vt 0.528033 0.844178
+vt 0.536237 0.844188
+vt 0.552661 0.840113
+vt 0.552661 0.844217
+vt 0.544446 0.844201
+vt 0.544446 0.840099
+vt 0.544445 0.835998
+vt 0.552660 0.836011
+vt 0.544445 0.831898
+vt 0.552660 0.831909
+vt 0.560882 0.836025
+vt 0.560882 0.840129
+vt 0.569111 0.836042
+vt 0.569111 0.840147
+vt 0.560882 0.831922
+vt 0.569111 0.831937
+vt 0.560882 0.844234
+vt 0.569112 0.844254
+vt 0.585596 0.840188
+vt 0.585597 0.844298
+vt 0.577350 0.844276
+vt 0.577349 0.840167
+vt 0.577349 0.836060
+vt 0.585596 0.836079
+vt 0.577349 0.831953
+vt 0.585596 0.831970
+vt 0.593852 0.836099
+vt 0.593853 0.840210
+vt 0.602119 0.836119
+vt 0.602119 0.840232
+vt 0.593852 0.831988
+vt 0.602118 0.832006
+vt 0.593853 0.844322
+vt 0.602119 0.844346
+vt 0.618681 0.840276
+vt 0.618681 0.844394
+vt 0.610395 0.844370
+vt 0.610395 0.840254
+vt 0.610395 0.836139
+vt 0.618681 0.836159
+vt 0.610394 0.832024
+vt 0.618680 0.832042
+vt 0.626976 0.836178
+vt 0.626976 0.840297
+vt 0.635280 0.836196
+vt 0.635280 0.840317
+vt 0.626976 0.832060
+vt 0.635280 0.832076
+vt 0.626976 0.844417
+vt 0.635281 0.844438
+vt 0.651915 0.840353
+vt 0.651915 0.844477
+vt 0.643594 0.844459
+vt 0.643594 0.840336
+vt 0.643594 0.836213
+vt 0.651915 0.836229
+vt 0.643593 0.832091
+vt 0.651915 0.832105
+vt 0.660243 0.836242
+vt 0.660243 0.840368
+vt 0.668577 0.836254
+vt 0.668577 0.840380
+vt 0.660243 0.832117
+vt 0.668577 0.832128
+vt 0.660243 0.844493
+vt 0.668577 0.844507
+vt 0.685259 0.840397
+vt 0.685260 0.844525
+vt 0.676916 0.844517
+vt 0.676916 0.840390
+vt 0.676916 0.836263
+vt 0.685259 0.836269
+vt 0.676916 0.832136
+vt 0.685259 0.832142
+vt 0.693605 0.836273
+vt 0.693605 0.840402
+vt 0.701952 0.836275
+vt 0.701952 0.840403
+vt 0.693605 0.832145
+vt 0.701952 0.832147
+vt 0.693605 0.844530
+vt 0.701952 0.844532
+vt 0.718645 0.840397
+vt 0.718645 0.844525
+vt 0.710299 0.844530
+vt 0.710299 0.840402
+vt 0.710299 0.836273
+vt 0.718645 0.836269
+vt 0.710299 0.832145
+vt 0.718645 0.832142
+vt 0.726988 0.836263
+vt 0.726988 0.840390
+vt 0.735327 0.836254
+vt 0.735327 0.840380
+vt 0.726988 0.832136
+vt 0.735327 0.832128
+vt 0.726988 0.844517
+vt 0.735327 0.844507
+vt 0.751989 0.840353
+vt 0.751989 0.844477
+vt 0.743661 0.844493
+vt 0.743661 0.840368
+vt 0.743661 0.836242
+vt 0.751989 0.836229
+vt 0.743661 0.832117
+vt 0.751989 0.832105
+vt 0.760310 0.836213
+vt 0.760310 0.840336
+vt 0.768624 0.836197
+vt 0.768624 0.840317
+vt 0.760311 0.832091
+vt 0.768624 0.832076
+vt 0.760310 0.844459
+vt 0.768623 0.844438
+vt 0.785223 0.840276
+vt 0.785223 0.844394
+vt 0.776928 0.844417
+vt 0.776928 0.840297
+vt 0.776928 0.836178
+vt 0.785224 0.836159
+vt 0.776928 0.832060
+vt 0.785224 0.832042
+vt 0.793510 0.836139
+vt 0.793509 0.840254
+vt 0.801786 0.836119
+vt 0.801785 0.840232
+vt 0.793510 0.832024
+vt 0.801786 0.832006
+vt 0.793509 0.844370
+vt 0.801785 0.844346
+vt 0.818308 0.840188
+vt 0.818308 0.844298
+vt 0.810051 0.844322
+vt 0.810052 0.840210
+vt 0.810052 0.836099
+vt 0.818308 0.836079
+vt 0.810052 0.831988
+vt 0.818308 0.831971
+vt 0.826555 0.836060
+vt 0.826555 0.840167
+vt 0.834793 0.836042
+vt 0.834793 0.840148
+vt 0.826555 0.831954
+vt 0.834793 0.831937
+vt 0.826555 0.844276
+vt 0.834792 0.844254
+vt 0.851244 0.840113
+vt 0.851243 0.844217
+vt 0.843022 0.844235
+vt 0.843022 0.840129
+vt 0.843022 0.836026
+vt 0.851244 0.836011
+vt 0.843023 0.831923
+vt 0.851244 0.831909
+vt 0.859459 0.835998
+vt 0.859458 0.840099
+vt 0.867668 0.835987
+vt 0.867667 0.840087
+vt 0.859459 0.831898
+vt 0.867668 0.831888
+vt 0.859458 0.844201
+vt 0.867667 0.844189
+vt 0.884072 0.840070
+vt 0.884071 0.844170
+vt 0.875871 0.844178
+vt 0.875871 0.840078
+vt 0.875872 0.835978
+vt 0.884072 0.835972
+vt 0.875872 0.831880
+vt 0.884072 0.831875
+vt 0.892270 0.835966
+vt 0.892269 0.840064
+vt 0.900466 0.835961
+vt 0.900466 0.840059
+vt 0.892270 0.831870
+vt 0.900467 0.831865
+vt 0.892269 0.844164
+vt 0.900466 0.844158
+vt 0.122793 0.840073
+vt 0.122793 0.844173
+vt 0.114595 0.844165
+vt 0.114595 0.840065
+vt 0.106398 0.844158
+vt 0.106399 0.840059
+vt 0.114596 0.835967
+vt 0.122793 0.835974
+vt 0.114596 0.831871
+vt 0.122794 0.831877
+vt 0.106399 0.835961
+vt 0.106399 0.831865
+vt 0.130994 0.835982
+vt 0.130993 0.840081
+vt 0.139198 0.835991
+vt 0.139197 0.840092
+vt 0.130994 0.831884
+vt 0.139198 0.831893
+vt 0.130993 0.844182
+vt 0.139197 0.844193
+vt 0.155621 0.840120
+vt 0.155621 0.844224
+vt 0.147406 0.844207
+vt 0.147406 0.840105
+vt 0.147407 0.836003
+vt 0.155622 0.836017
+vt 0.147407 0.831903
+vt 0.155622 0.831916
+vt 0.163843 0.836033
+vt 0.163843 0.840137
+vt 0.172073 0.836051
+vt 0.172073 0.840156
+vt 0.163844 0.831930
+vt 0.172073 0.831946
+vt 0.163843 0.844243
+vt 0.172072 0.844263
+vt 0.188558 0.840199
+vt 0.188558 0.844309
+vt 0.180311 0.844286
+vt 0.180311 0.840177
+vt 0.180311 0.836070
+vt 0.188558 0.836090
+vt 0.180311 0.831963
+vt 0.188559 0.831981
+vt 0.196815 0.836110
+vt 0.196815 0.840222
+vt 0.205081 0.836131
+vt 0.205081 0.840244
+vt 0.196815 0.832000
+vt 0.205081 0.832019
+vt 0.196814 0.844334
+vt 0.205081 0.844358
+vt 0.221644 0.840290
+vt 0.221643 0.844408
+vt 0.213357 0.844383
+vt 0.213357 0.840267
+vt 0.213358 0.836152
+vt 0.221644 0.836173
+vt 0.213358 0.832038
+vt 0.221644 0.832056
+vt 0.229939 0.836193
+vt 0.229939 0.840312
+vt 0.238244 0.836212
+vt 0.238244 0.840333
+vt 0.229939 0.832074
+vt 0.238244 0.832091
+vt 0.229939 0.844431
+vt 0.238244 0.844454
+vt 0.254879 0.840369
+vt 0.254879 0.844493
+vt 0.246557 0.844474
+vt 0.246558 0.840352
+vt 0.246558 0.836229
+vt 0.254879 0.836245
+vt 0.246558 0.832107
+vt 0.254879 0.832121
+vt 0.263208 0.836259
+vt 0.263208 0.840384
+vt 0.271542 0.836271
+vt 0.271542 0.840397
+vt 0.263208 0.832134
+vt 0.271542 0.832145
+vt 0.263207 0.844510
+vt 0.271542 0.844524
+vt 0.288225 0.840415
+vt 0.288225 0.844543
+vt 0.279882 0.844535
+vt 0.279882 0.840407
+vt 0.279882 0.836280
+vt 0.288225 0.836287
+vt 0.279882 0.832153
+vt 0.288225 0.832159
+vt 0.296571 0.836291
+vt 0.296571 0.840419
+vt 0.304919 0.836292
+vt 0.304919 0.840421
+vt 0.296571 0.832163
+vt 0.304919 0.832164
+vt 0.296571 0.844548
+vt 0.304919 0.844549
+vt 0.321612 0.840415
+vt 0.321612 0.844543
+vt 0.313266 0.844548
+vt 0.313266 0.840419
+vt 0.313266 0.836291
+vt 0.321612 0.836287
+vt 0.313266 0.832163
+vt 0.321612 0.832159
+vt 0.329955 0.836280
+vt 0.329955 0.840407
+vt 0.329955 0.832153
+vt 0.329956 0.844535
+vt 0.354958 0.823875
+vt 0.354958 0.827998
+vt 0.346629 0.828009
+vt 0.346629 0.823884
+vt 0.338295 0.828019
+vt 0.338295 0.823892
+vt 0.346629 0.819760
+vt 0.354958 0.819751
+vt 0.346629 0.815635
+vt 0.354957 0.815628
+vt 0.338295 0.819767
+vt 0.338295 0.815641
+vt 0.363279 0.819742
+vt 0.363279 0.823864
+vt 0.371592 0.819732
+vt 0.371593 0.823851
+vt 0.363279 0.815621
+vt 0.371592 0.815613
+vt 0.363279 0.827985
+vt 0.371593 0.827971
+vt 0.388193 0.823824
+vt 0.388193 0.827940
+vt 0.379897 0.827956
+vt 0.379897 0.823838
+vt 0.379897 0.819721
+vt 0.388193 0.819709
+vt 0.379897 0.815604
+vt 0.388192 0.815594
+vt 0.396479 0.819697
+vt 0.396479 0.823810
+vt 0.404755 0.819685
+vt 0.404755 0.823796
+vt 0.396479 0.815584
+vt 0.404755 0.815574
+vt 0.396479 0.827924
+vt 0.404756 0.827907
+vt 0.421278 0.823767
+vt 0.421278 0.827874
+vt 0.413022 0.827890
+vt 0.413022 0.823781
+vt 0.413021 0.819672
+vt 0.421278 0.819660
+vt 0.413021 0.815564
+vt 0.421278 0.815554
+vt 0.429525 0.819649
+vt 0.429525 0.823753
+vt 0.437763 0.819637
+vt 0.437763 0.823740
+vt 0.429525 0.815545
+vt 0.437763 0.815536
+vt 0.429525 0.827857
+vt 0.437764 0.827842
+vt 0.454215 0.823716
+vt 0.454215 0.827816
+vt 0.445993 0.827828
+vt 0.445993 0.823727
+vt 0.445993 0.819627
+vt 0.454214 0.819618
+vt 0.445992 0.815527
+vt 0.454214 0.815520
+vt 0.462429 0.819609
+vt 0.462429 0.823706
+vt 0.470638 0.819602
+vt 0.470638 0.823698
+vt 0.462429 0.815513
+vt 0.470638 0.815507
+vt 0.462430 0.827804
+vt 0.470639 0.827795
+vt 0.487043 0.823686
+vt 0.487043 0.827781
+vt 0.478843 0.827787
+vt 0.478842 0.823691
+vt 0.478842 0.819596
+vt 0.487042 0.819592
+vt 0.478842 0.815502
+vt 0.487042 0.815499
+vt 0.495240 0.819589
+vt 0.495241 0.823683
+vt 0.503437 0.819588
+vt 0.503437 0.823681
+vt 0.495240 0.815496
+vt 0.503436 0.815495
+vt 0.495241 0.827777
+vt 0.503437 0.827776
+vt 0.519831 0.823684
+vt 0.519832 0.827779
+vt 0.511634 0.827776
+vt 0.511634 0.823682
+vt 0.511633 0.819588
+vt 0.519831 0.819590
+vt 0.511633 0.815495
+vt 0.519831 0.815497
+vt 0.528031 0.819593
+vt 0.528032 0.823688
+vt 0.536235 0.819598
+vt 0.536236 0.823694
+vt 0.528031 0.815499
+vt 0.536235 0.815503
+vt 0.528032 0.827784
+vt 0.536236 0.827790
+vt 0.552659 0.823709
+vt 0.552660 0.827809
+vt 0.544445 0.827799
+vt 0.544445 0.823701
+vt 0.544444 0.819604
+vt 0.552659 0.819611
+vt 0.544444 0.815507
+vt 0.552659 0.815513
+vt 0.560881 0.819619
+vt 0.560881 0.823720
+vt 0.569110 0.819629
+vt 0.569110 0.823731
+vt 0.560880 0.815520
+vt 0.569110 0.815527
+vt 0.560881 0.827821
+vt 0.569111 0.827834
+vt 0.585595 0.823756
+vt 0.585596 0.827863
+vt 0.577349 0.827848
+vt 0.577348 0.823743
+vt 0.577348 0.819639
+vt 0.585595 0.819650
+vt 0.577348 0.815535
+vt 0.585595 0.815544
+vt 0.593852 0.819661
+vt 0.593852 0.823769
+vt 0.602118 0.819672
+vt 0.602118 0.823783
+vt 0.593851 0.815553
+vt 0.602117 0.815562
+vt 0.593852 0.827878
+vt 0.602118 0.827894
+vt 0.618680 0.823810
+vt 0.618680 0.827926
+vt 0.610394 0.827910
+vt 0.610394 0.823797
+vt 0.610394 0.819684
+vt 0.618680 0.819695
+vt 0.610394 0.815571
+vt 0.618680 0.815580
+vt 0.626975 0.819706
+vt 0.626975 0.823824
+vt 0.635280 0.819717
+vt 0.635280 0.823836
+vt 0.626975 0.815589
+vt 0.635280 0.815597
+vt 0.626976 0.827941
+vt 0.635280 0.827956
+vt 0.651914 0.823858
+vt 0.651914 0.827982
+vt 0.643593 0.827969
+vt 0.643593 0.823848
+vt 0.643593 0.819726
+vt 0.651914 0.819735
+vt 0.643593 0.815605
+vt 0.651914 0.815612
+vt 0.660242 0.819743
+vt 0.660243 0.823868
+vt 0.668577 0.819749
+vt 0.668577 0.823875
+vt 0.660242 0.815618
+vt 0.668577 0.815624
+vt 0.660243 0.827992
+vt 0.668577 0.828001
+vt 0.685259 0.823886
+vt 0.685259 0.828014
+vt 0.676916 0.828009
+vt 0.676916 0.823882
+vt 0.676916 0.819755
+vt 0.685259 0.819758
+vt 0.676916 0.815628
+vt 0.685259 0.815631
+vt 0.693605 0.819761
+vt 0.693605 0.823889
+vt 0.701952 0.819762
+vt 0.701952 0.823890
+vt 0.693605 0.815633
+vt 0.701952 0.815633
+vt 0.693605 0.828017
+vt 0.701952 0.828018
+vt 0.718645 0.823886
+vt 0.718645 0.828014
+vt 0.710299 0.828017
+vt 0.710299 0.823889
+vt 0.710299 0.819761
+vt 0.718645 0.819759
+vt 0.710299 0.815633
+vt 0.718645 0.815631
+vt 0.726988 0.819755
+vt 0.726988 0.823882
+vt 0.735327 0.819750
+vt 0.735327 0.823875
+vt 0.726988 0.815628
+vt 0.735327 0.815624
+vt 0.726988 0.828009
+vt 0.735327 0.828001
+vt 0.751990 0.823858
+vt 0.751990 0.827982
+vt 0.743661 0.827992
+vt 0.743662 0.823868
+vt 0.743662 0.819743
+vt 0.751990 0.819735
+vt 0.743662 0.815618
+vt 0.751990 0.815612
+vt 0.760311 0.819726
+vt 0.760311 0.823848
+vt 0.768624 0.819717
+vt 0.768624 0.823836
+vt 0.760311 0.815605
+vt 0.768625 0.815597
+vt 0.760311 0.827969
+vt 0.768624 0.827956
+vt 0.785224 0.823811
+vt 0.785224 0.827926
+vt 0.776929 0.827942
+vt 0.776929 0.823824
+vt 0.776929 0.819706
+vt 0.785224 0.819695
+vt 0.776929 0.815589
+vt 0.785225 0.815580
+vt 0.793510 0.819684
+vt 0.793510 0.823797
+vt 0.801787 0.819672
+vt 0.801786 0.823783
+vt 0.793511 0.815571
+vt 0.801787 0.815562
+vt 0.793510 0.827910
+vt 0.801786 0.827894
+vt 0.818309 0.823756
+vt 0.818309 0.827863
+vt 0.810052 0.827879
+vt 0.810053 0.823769
+vt 0.810053 0.819661
+vt 0.818309 0.819650
+vt 0.810053 0.815553
+vt 0.818309 0.815544
+vt 0.826556 0.819639
+vt 0.826556 0.823743
+vt 0.834794 0.819629
+vt 0.834794 0.823731
+vt 0.826556 0.815535
+vt 0.834794 0.815527
+vt 0.826556 0.827848
+vt 0.834794 0.827834
+vt 0.851245 0.823710
+vt 0.851245 0.827809
+vt 0.843023 0.827821
+vt 0.843023 0.823720
+vt 0.843023 0.819620
+vt 0.851245 0.819611
+vt 0.843024 0.815520
+vt 0.851245 0.815513
+vt 0.859460 0.819604
+vt 0.859460 0.823701
+vt 0.867669 0.819598
+vt 0.867669 0.823694
+vt 0.859460 0.815508
+vt 0.867669 0.815503
+vt 0.859459 0.827799
+vt 0.867668 0.827790
+vt 0.884073 0.823684
+vt 0.884073 0.827779
+vt 0.875872 0.827784
+vt 0.875873 0.823688
+vt 0.875873 0.819593
+vt 0.884073 0.819590
+vt 0.875873 0.815499
+vt 0.884073 0.815496
+vt 0.892271 0.819587
+vt 0.892271 0.823680
+vt 0.900467 0.819584
+vt 0.900467 0.823677
+vt 0.892271 0.815494
+vt 0.900468 0.815492
+vt 0.892270 0.827774
+vt 0.900467 0.827771
+vt 0.122794 0.823686
+vt 0.122794 0.827781
+vt 0.114596 0.827775
+vt 0.114597 0.823681
+vt 0.106400 0.827771
+vt 0.106400 0.823677
+vt 0.114597 0.819588
+vt 0.122795 0.819592
+vt 0.114597 0.815495
+vt 0.122795 0.815499
+vt 0.106400 0.819584
+vt 0.106401 0.815492
+vt 0.130995 0.819597
+vt 0.130995 0.823691
+vt 0.139199 0.819602
+vt 0.139199 0.823698
+vt 0.130995 0.815502
+vt 0.139199 0.815507
+vt 0.130994 0.827787
+vt 0.139198 0.827795
+vt 0.155623 0.823716
+vt 0.155622 0.827816
+vt 0.147407 0.827804
+vt 0.147408 0.823706
+vt 0.147408 0.819609
+vt 0.155623 0.819618
+vt 0.147408 0.815513
+vt 0.155623 0.815520
+vt 0.163845 0.819627
+vt 0.163844 0.823727
+vt 0.172074 0.819638
+vt 0.172074 0.823740
+vt 0.163845 0.815528
+vt 0.172074 0.815536
+vt 0.163844 0.827828
+vt 0.172073 0.827843
+vt 0.188559 0.823767
+vt 0.188559 0.827874
+vt 0.180312 0.827858
+vt 0.180312 0.823753
+vt 0.180312 0.819649
+vt 0.188559 0.819660
+vt 0.180312 0.815545
+vt 0.188559 0.815555
+vt 0.196816 0.819672
+vt 0.196816 0.823781
+vt 0.205082 0.819685
+vt 0.205082 0.823796
+vt 0.196816 0.815564
+vt 0.205082 0.815574
+vt 0.196815 0.827890
+vt 0.205082 0.827907
+vt 0.221644 0.823825
+vt 0.221644 0.827940
+vt 0.213358 0.827924
+vt 0.213358 0.823810
+vt 0.213358 0.819697
+vt 0.221644 0.819709
+vt 0.213359 0.815584
+vt 0.221645 0.815594
+vt 0.229940 0.819721
+vt 0.229940 0.823838
+vt 0.238245 0.819732
+vt 0.238245 0.823852
+vt 0.229940 0.815604
+vt 0.238245 0.815613
+vt 0.229940 0.827956
+vt 0.238244 0.827971
+vt 0.254880 0.823875
+vt 0.254879 0.827998
+vt 0.246558 0.827985
+vt 0.246558 0.823864
+vt 0.246558 0.819742
+vt 0.254880 0.819752
+vt 0.246558 0.815621
+vt 0.254880 0.815629
+vt 0.263208 0.819760
+vt 0.263208 0.823884
+vt 0.271542 0.819767
+vt 0.271542 0.823892
+vt 0.263208 0.815635
+vt 0.271543 0.815641
+vt 0.263208 0.828009
+vt 0.271542 0.828019
+vt 0.288225 0.823904
+vt 0.288225 0.828031
+vt 0.279882 0.828026
+vt 0.279882 0.823899
+vt 0.279882 0.819772
+vt 0.288225 0.819776
+vt 0.279882 0.815645
+vt 0.288225 0.815648
+vt 0.296571 0.819778
+vt 0.296571 0.823906
+vt 0.304919 0.819779
+vt 0.304919 0.823907
+vt 0.296571 0.815650
+vt 0.304919 0.815651
+vt 0.296571 0.828035
+vt 0.304919 0.828036
+vt 0.321612 0.823904
+vt 0.321612 0.828031
+vt 0.313266 0.828035
+vt 0.313266 0.823906
+vt 0.313266 0.819778
+vt 0.321612 0.819776
+vt 0.313266 0.815650
+vt 0.321612 0.815648
+vt 0.329955 0.819772
+vt 0.329955 0.823899
+vt 0.329955 0.815645
+vt 0.329955 0.828026
+vt 0.354957 0.807383
+vt 0.354957 0.811505
+vt 0.346629 0.811511
+vt 0.346629 0.807386
+vt 0.338295 0.811515
+vt 0.338294 0.807389
+vt 0.346629 0.803262
+vt 0.354957 0.803260
+vt 0.346629 0.799137
+vt 0.354957 0.799137
+vt 0.338294 0.803263
+vt 0.338294 0.799137
+vt 0.363278 0.803258
+vt 0.363279 0.807379
+vt 0.371592 0.803256
+vt 0.371592 0.807374
+vt 0.363278 0.799137
+vt 0.371592 0.799137
+vt 0.363279 0.811500
+vt 0.371592 0.811493
+vt 0.388192 0.807365
+vt 0.388192 0.811479
+vt 0.379897 0.811487
+vt 0.379897 0.807370
+vt 0.379896 0.803253
+vt 0.388192 0.803250
+vt 0.379896 0.799136
+vt 0.388192 0.799136
+vt 0.396478 0.803248
+vt 0.396478 0.807360
+vt 0.404754 0.803245
+vt 0.404754 0.807354
+vt 0.396478 0.799136
+vt 0.404754 0.799135
+vt 0.396478 0.811472
+vt 0.404755 0.811464
+vt 0.421277 0.807344
+vt 0.421277 0.811449
+vt 0.413021 0.811457
+vt 0.413021 0.807349
+vt 0.413020 0.803242
+vt 0.421277 0.803239
+vt 0.413020 0.799135
+vt 0.421277 0.799134
+vt 0.429524 0.803236
+vt 0.429524 0.807339
+vt 0.437762 0.803234
+vt 0.437762 0.807334
+vt 0.429524 0.799134
+vt 0.437762 0.799133
+vt 0.429524 0.811442
+vt 0.437763 0.811435
+vt 0.454213 0.807325
+vt 0.454214 0.811422
+vt 0.445992 0.811428
+vt 0.445992 0.807330
+vt 0.445991 0.803231
+vt 0.454213 0.803229
+vt 0.445991 0.799133
+vt 0.454213 0.799132
+vt 0.462428 0.803227
+vt 0.462428 0.807322
+vt 0.470637 0.803225
+vt 0.470637 0.807319
+vt 0.462428 0.799132
+vt 0.470637 0.799131
+vt 0.462429 0.811417
+vt 0.470638 0.811413
+vt 0.487042 0.807314
+vt 0.487042 0.811406
+vt 0.478842 0.811409
+vt 0.478841 0.807316
+vt 0.478841 0.803223
+vt 0.487041 0.803222
+vt 0.478841 0.799131
+vt 0.487041 0.799130
+vt 0.495239 0.803221
+vt 0.495239 0.807312
+vt 0.503436 0.803220
+vt 0.503436 0.807311
+vt 0.495239 0.799129
+vt 0.503435 0.799129
+vt 0.495240 0.811404
+vt 0.503436 0.811403
+vt 0.519830 0.807311
+vt 0.519830 0.811404
+vt 0.511633 0.811403
+vt 0.511632 0.807311
+vt 0.511632 0.803220
+vt 0.519830 0.803219
+vt 0.511632 0.799128
+vt 0.519830 0.799128
+vt 0.528030 0.803220
+vt 0.528031 0.807312
+vt 0.536234 0.803220
+vt 0.536234 0.807314
+vt 0.528030 0.799127
+vt 0.536234 0.799127
+vt 0.528031 0.811405
+vt 0.536235 0.811408
+vt 0.552658 0.807319
+vt 0.552659 0.811416
+vt 0.544444 0.811412
+vt 0.544443 0.807316
+vt 0.544443 0.803221
+vt 0.552658 0.803222
+vt 0.544443 0.799126
+vt 0.552658 0.799126
+vt 0.560880 0.803223
+vt 0.560880 0.807322
+vt 0.569109 0.803225
+vt 0.569109 0.807325
+vt 0.560879 0.799125
+vt 0.569109 0.799124
+vt 0.560880 0.811421
+vt 0.569110 0.811426
+vt 0.585594 0.807333
+vt 0.585595 0.811438
+vt 0.577348 0.811432
+vt 0.577347 0.807329
+vt 0.577347 0.803226
+vt 0.585594 0.803228
+vt 0.577347 0.799124
+vt 0.585594 0.799124
+vt 0.593851 0.803230
+vt 0.593851 0.807338
+vt 0.602117 0.803232
+vt 0.602117 0.807342
+vt 0.593850 0.799123
+vt 0.602117 0.799123
+vt 0.593851 0.811445
+vt 0.602117 0.811452
+vt 0.618679 0.807351
+vt 0.618679 0.811465
+vt 0.610393 0.811459
+vt 0.610393 0.807346
+vt 0.610393 0.803234
+vt 0.618679 0.803236
+vt 0.610393 0.799122
+vt 0.618679 0.799122
+vt 0.626975 0.803238
+vt 0.626975 0.807355
+vt 0.635279 0.803240
+vt 0.635279 0.807359
+vt 0.626974 0.799122
+vt 0.635279 0.799121
+vt 0.626975 0.811472
+vt 0.635279 0.811478
+vt 0.651914 0.807366
+vt 0.651914 0.811489
+vt 0.643593 0.811484
+vt 0.643593 0.807363
+vt 0.643593 0.803242
+vt 0.651914 0.803244
+vt 0.643592 0.799121
+vt 0.651914 0.799121
+vt 0.660242 0.803245
+vt 0.660242 0.807369
+vt 0.668576 0.803246
+vt 0.668577 0.807372
+vt 0.660242 0.799121
+vt 0.668576 0.799120
+vt 0.660242 0.811494
+vt 0.668577 0.811498
+vt 0.685259 0.807375
+vt 0.685259 0.811503
+vt 0.676916 0.811501
+vt 0.676916 0.807374
+vt 0.676916 0.803247
+vt 0.685259 0.803248
+vt 0.676916 0.799120
+vt 0.685259 0.799120
+vt 0.693605 0.803248
+vt 0.693605 0.807376
+vt 0.701952 0.803249
+vt 0.701952 0.807377
+vt 0.693605 0.799120
+vt 0.701952 0.799120
+vt 0.693605 0.811505
+vt 0.701952 0.811505
+vt 0.718645 0.807375
+vt 0.718645 0.811503
+vt 0.710299 0.811505
+vt 0.710299 0.807376
+vt 0.710299 0.803248
+vt 0.718645 0.803248
+vt 0.710299 0.799120
+vt 0.718645 0.799120
+vt 0.726988 0.803247
+vt 0.726988 0.807374
+vt 0.735328 0.803246
+vt 0.735328 0.807372
+vt 0.726988 0.799120
+vt 0.735328 0.799121
+vt 0.726988 0.811501
+vt 0.735328 0.811498
+vt 0.751990 0.807367
+vt 0.751990 0.811489
+vt 0.743662 0.811494
+vt 0.743662 0.807370
+vt 0.743662 0.803245
+vt 0.751990 0.803244
+vt 0.743662 0.799121
+vt 0.751990 0.799121
+vt 0.760312 0.803242
+vt 0.760311 0.807363
+vt 0.768625 0.803240
+vt 0.768625 0.807359
+vt 0.760312 0.799121
+vt 0.768625 0.799121
+vt 0.760311 0.811484
+vt 0.768625 0.811478
+vt 0.785225 0.807351
+vt 0.785225 0.811466
+vt 0.776929 0.811472
+vt 0.776929 0.807355
+vt 0.776930 0.803238
+vt 0.785225 0.803236
+vt 0.776930 0.799122
+vt 0.785225 0.799122
+vt 0.793511 0.803234
+vt 0.793511 0.807347
+vt 0.801787 0.803232
+vt 0.801787 0.807342
+vt 0.793511 0.799122
+vt 0.801788 0.799123
+vt 0.793511 0.811459
+vt 0.801787 0.811452
+vt 0.818310 0.807333
+vt 0.818310 0.811439
+vt 0.810053 0.811445
+vt 0.810053 0.807338
+vt 0.810054 0.803230
+vt 0.818310 0.803229
+vt 0.810054 0.799123
+vt 0.818310 0.799124
+vt 0.826557 0.803227
+vt 0.826557 0.807329
+vt 0.834795 0.803225
+vt 0.834795 0.807326
+vt 0.826557 0.799124
+vt 0.834795 0.799125
+vt 0.826557 0.811432
+vt 0.834795 0.811426
+vt 0.851246 0.807319
+vt 0.851246 0.811416
+vt 0.843024 0.811421
+vt 0.843024 0.807322
+vt 0.843024 0.803224
+vt 0.851246 0.803222
+vt 0.843025 0.799125
+vt 0.851246 0.799126
+vt 0.859461 0.803221
+vt 0.859461 0.807316
+vt 0.867670 0.803220
+vt 0.867670 0.807314
+vt 0.859461 0.799126
+vt 0.867670 0.799127
+vt 0.859460 0.811412
+vt 0.867669 0.811408
+vt 0.884074 0.807311
+vt 0.884074 0.811404
+vt 0.875873 0.811406
+vt 0.875874 0.807313
+vt 0.875874 0.803220
+vt 0.884074 0.803220
+vt 0.875874 0.799127
+vt 0.884075 0.799128
+vt 0.892272 0.803219
+vt 0.892272 0.807311
+vt 0.900469 0.803219
+vt 0.900468 0.807310
+vt 0.892272 0.799128
+vt 0.900469 0.799129
+vt 0.892272 0.811402
+vt 0.900468 0.811401
+vt 0.122795 0.807314
+vt 0.122795 0.811406
+vt 0.114597 0.811403
+vt 0.114598 0.807312
+vt 0.106401 0.811401
+vt 0.106401 0.807310
+vt 0.114598 0.803221
+vt 0.122796 0.803222
+vt 0.114598 0.799130
+vt 0.122796 0.799130
+vt 0.106401 0.803219
+vt 0.106402 0.799129
+vt 0.130996 0.803223
+vt 0.130996 0.807316
+vt 0.139200 0.803225
+vt 0.139200 0.807319
+vt 0.130996 0.799131
+vt 0.139200 0.799131
+vt 0.130995 0.811409
+vt 0.139200 0.811413
+vt 0.155624 0.807326
+vt 0.155623 0.811423
+vt 0.147408 0.811417
+vt 0.147409 0.807322
+vt 0.147409 0.803227
+vt 0.155624 0.803229
+vt 0.147409 0.799132
+vt 0.155624 0.799132
+vt 0.163846 0.803231
+vt 0.163845 0.807330
+vt 0.172075 0.803234
+vt 0.172075 0.807334
+vt 0.163846 0.799133
+vt 0.172075 0.799134
+vt 0.163845 0.811428
+vt 0.172074 0.811435
+vt 0.188560 0.807344
+vt 0.188560 0.811449
+vt 0.180313 0.811442
+vt 0.180313 0.807339
+vt 0.180313 0.803236
+vt 0.188560 0.803239
+vt 0.180313 0.799134
+vt 0.188560 0.799134
+vt 0.196817 0.803242
+vt 0.196816 0.807349
+vt 0.205083 0.803245
+vt 0.205083 0.807355
+vt 0.196817 0.799135
+vt 0.205083 0.799135
+vt 0.196816 0.811457
+vt 0.205082 0.811464
+vt 0.221645 0.807365
+vt 0.221645 0.811479
+vt 0.213359 0.811472
+vt 0.213359 0.807360
+vt 0.213359 0.803248
+vt 0.221645 0.803250
+vt 0.213359 0.799136
+vt 0.221645 0.799136
+vt 0.229941 0.803253
+vt 0.229941 0.807370
+vt 0.238245 0.803256
+vt 0.238245 0.807374
+vt 0.229941 0.799136
+vt 0.238245 0.799137
+vt 0.229940 0.811487
+vt 0.238245 0.811493
+vt 0.254880 0.807383
+vt 0.254880 0.811506
+vt 0.246558 0.811500
+vt 0.246559 0.807379
+vt 0.246559 0.803258
+vt 0.254880 0.803260
+vt 0.246559 0.799137
+vt 0.254880 0.799137
+vt 0.263208 0.803262
+vt 0.263208 0.807386
+vt 0.271543 0.803263
+vt 0.271543 0.807389
+vt 0.263209 0.799137
+vt 0.271543 0.799138
+vt 0.263208 0.811511
+vt 0.271543 0.811515
+vt 0.288225 0.807393
+vt 0.288225 0.811521
+vt 0.279882 0.811518
+vt 0.279882 0.807391
+vt 0.279882 0.803264
+vt 0.288226 0.803265
+vt 0.279882 0.799138
+vt 0.288226 0.799138
+vt 0.296571 0.803266
+vt 0.296571 0.807394
+vt 0.304919 0.803266
+vt 0.304919 0.807394
+vt 0.296571 0.799138
+vt 0.304919 0.799138
+vt 0.296571 0.811522
+vt 0.304919 0.811523
+vt 0.321612 0.807393
+vt 0.321612 0.811521
+vt 0.313266 0.811522
+vt 0.313266 0.807394
+vt 0.313266 0.803266
+vt 0.321612 0.803265
+vt 0.313266 0.799138
+vt 0.321612 0.799138
+vt 0.329955 0.803264
+vt 0.329955 0.807391
+vt 0.329955 0.799138
+vt 0.329955 0.811518
+vt 0.354957 0.790892
+vt 0.354957 0.795014
+vt 0.346629 0.795013
+vt 0.346628 0.790889
+vt 0.338294 0.795012
+vt 0.338294 0.790886
+vt 0.346628 0.786764
+vt 0.354957 0.786769
+vt 0.346628 0.782640
+vt 0.354956 0.782646
+vt 0.338294 0.786760
+vt 0.338294 0.782634
+vt 0.363278 0.786774
+vt 0.363278 0.790895
+vt 0.371591 0.786780
+vt 0.371591 0.790899
+vt 0.363278 0.782653
+vt 0.371591 0.782661
+vt 0.363278 0.795016
+vt 0.371592 0.795018
+vt 0.388191 0.790907
+vt 0.388192 0.795022
+vt 0.379896 0.795020
+vt 0.379896 0.790903
+vt 0.379896 0.786786
+vt 0.388191 0.786793
+vt 0.379896 0.782669
+vt 0.388191 0.782678
+vt 0.396477 0.786799
+vt 0.396477 0.790911
+vt 0.404753 0.786806
+vt 0.404754 0.790916
+vt 0.396477 0.782687
+vt 0.404753 0.782696
+vt 0.396478 0.795024
+vt 0.404754 0.795026
+vt 0.421276 0.790924
+vt 0.421276 0.795029
+vt 0.413020 0.795027
+vt 0.413020 0.790920
+vt 0.413020 0.786813
+vt 0.421276 0.786819
+vt 0.413019 0.782705
+vt 0.421276 0.782714
+vt 0.429523 0.786826
+vt 0.429523 0.790929
+vt 0.437761 0.786832
+vt 0.437761 0.790932
+vt 0.429523 0.782723
+vt 0.437761 0.782731
+vt 0.429524 0.795031
+vt 0.437762 0.795033
+vt 0.454212 0.790939
+vt 0.454213 0.795036
+vt 0.445991 0.795034
+vt 0.445991 0.790936
+vt 0.445990 0.786837
+vt 0.454212 0.786842
+vt 0.445990 0.782738
+vt 0.454212 0.782745
+vt 0.462427 0.786846
+vt 0.462427 0.790942
+vt 0.470636 0.786850
+vt 0.470636 0.790944
+vt 0.462427 0.782751
+vt 0.470636 0.782755
+vt 0.462427 0.795037
+vt 0.470636 0.795038
+vt 0.487040 0.790946
+vt 0.487041 0.795038
+vt 0.478840 0.795038
+vt 0.478840 0.790945
+vt 0.478840 0.786852
+vt 0.487040 0.786854
+vt 0.478840 0.782759
+vt 0.487040 0.782761
+vt 0.495238 0.786855
+vt 0.495238 0.790947
+vt 0.503434 0.786855
+vt 0.503435 0.790946
+vt 0.495238 0.782763
+vt 0.503434 0.782763
+vt 0.495239 0.795038
+vt 0.503435 0.795038
+vt 0.519829 0.790944
+vt 0.519829 0.795036
+vt 0.511632 0.795037
+vt 0.511631 0.790945
+vt 0.511631 0.786854
+vt 0.519829 0.786852
+vt 0.511631 0.782761
+vt 0.519829 0.782759
+vt 0.528029 0.786849
+vt 0.528029 0.790942
+vt 0.536233 0.786845
+vt 0.536233 0.790939
+vt 0.528029 0.782755
+vt 0.536233 0.782751
+vt 0.528030 0.795035
+vt 0.536234 0.795033
+vt 0.552657 0.790932
+vt 0.552657 0.795029
+vt 0.544443 0.795031
+vt 0.544442 0.790936
+vt 0.544442 0.786841
+vt 0.552657 0.786835
+vt 0.544442 0.782745
+vt 0.552657 0.782738
+vt 0.560879 0.786829
+vt 0.560879 0.790928
+vt 0.569108 0.786823
+vt 0.569108 0.790924
+vt 0.560878 0.782730
+vt 0.569108 0.782722
+vt 0.560879 0.795027
+vt 0.569109 0.795024
+vt 0.585594 0.790914
+vt 0.585594 0.795019
+vt 0.577347 0.795021
+vt 0.577346 0.790919
+vt 0.577346 0.786816
+vt 0.585593 0.786809
+vt 0.577346 0.782713
+vt 0.585593 0.782703
+vt 0.593850 0.786801
+vt 0.593850 0.790909
+vt 0.602116 0.786794
+vt 0.602116 0.790903
+vt 0.593850 0.782694
+vt 0.602116 0.782684
+vt 0.593850 0.795016
+vt 0.602116 0.795013
+vt 0.618679 0.790893
+vt 0.618679 0.795007
+vt 0.610393 0.795010
+vt 0.610393 0.790898
+vt 0.610392 0.786786
+vt 0.618678 0.786778
+vt 0.610392 0.782674
+vt 0.618678 0.782664
+vt 0.626974 0.786771
+vt 0.626974 0.790888
+vt 0.635279 0.786764
+vt 0.635279 0.790883
+vt 0.626974 0.782654
+vt 0.635278 0.782645
+vt 0.626974 0.795005
+vt 0.635279 0.795002
+vt 0.651914 0.790875
+vt 0.651914 0.794998
+vt 0.643592 0.795000
+vt 0.643592 0.790879
+vt 0.643592 0.786758
+vt 0.651913 0.786752
+vt 0.643592 0.782637
+vt 0.651913 0.782630
+vt 0.660242 0.786747
+vt 0.660242 0.790872
+vt 0.668576 0.786743
+vt 0.668576 0.790869
+vt 0.660242 0.782623
+vt 0.668576 0.782617
+vt 0.660242 0.794996
+vt 0.668576 0.794995
+vt 0.685259 0.790865
+vt 0.685259 0.794993
+vt 0.676916 0.794994
+vt 0.676916 0.790867
+vt 0.676916 0.786740
+vt 0.685259 0.786737
+vt 0.676916 0.782613
+vt 0.685259 0.782610
+vt 0.693605 0.786736
+vt 0.693605 0.790864
+vt 0.701952 0.786735
+vt 0.701952 0.790864
+vt 0.693605 0.782608
+vt 0.701952 0.782607
+vt 0.693605 0.794992
+vt 0.701952 0.794992
+vt 0.718645 0.790865
+vt 0.718645 0.794993
+vt 0.710299 0.794992
+vt 0.710299 0.790864
+vt 0.710299 0.786736
+vt 0.718645 0.786737
+vt 0.710299 0.782608
+vt 0.718645 0.782610
+vt 0.726989 0.786740
+vt 0.726988 0.790867
+vt 0.735328 0.786743
+vt 0.735328 0.790869
+vt 0.726989 0.782613
+vt 0.735328 0.782617
+vt 0.726988 0.794994
+vt 0.735328 0.794995
+vt 0.751991 0.790875
+vt 0.751990 0.794998
+vt 0.743662 0.794996
+vt 0.743662 0.790872
+vt 0.743662 0.786747
+vt 0.751991 0.786753
+vt 0.743663 0.782623
+vt 0.751991 0.782630
+vt 0.760312 0.786758
+vt 0.760312 0.790879
+vt 0.768626 0.786765
+vt 0.768625 0.790884
+vt 0.760312 0.782637
+vt 0.768626 0.782645
+vt 0.760312 0.795000
+vt 0.768625 0.795003
+vt 0.785226 0.790893
+vt 0.785226 0.795008
+vt 0.776930 0.795005
+vt 0.776930 0.790888
+vt 0.776930 0.786771
+vt 0.785226 0.786779
+vt 0.776931 0.782654
+vt 0.785226 0.782664
+vt 0.793512 0.786786
+vt 0.793512 0.790898
+vt 0.801788 0.786794
+vt 0.801788 0.790904
+vt 0.793512 0.782674
+vt 0.801788 0.782684
+vt 0.793512 0.795010
+vt 0.801788 0.795013
+vt 0.818311 0.790914
+vt 0.818310 0.795019
+vt 0.810054 0.795016
+vt 0.810054 0.790909
+vt 0.810054 0.786801
+vt 0.818311 0.786809
+vt 0.810055 0.782694
+vt 0.818311 0.782704
+vt 0.826558 0.786816
+vt 0.826558 0.790919
+vt 0.834796 0.786823
+vt 0.834796 0.790924
+vt 0.826558 0.782713
+vt 0.834796 0.782722
+vt 0.826558 0.795022
+vt 0.834796 0.795024
+vt 0.851247 0.790933
+vt 0.851247 0.795029
+vt 0.843025 0.795027
+vt 0.843025 0.790928
+vt 0.843026 0.786830
+vt 0.851247 0.786836
+vt 0.843026 0.782731
+vt 0.851247 0.782738
+vt 0.859462 0.786841
+vt 0.859462 0.790936
+vt 0.867671 0.786845
+vt 0.867671 0.790939
+vt 0.859462 0.782745
+vt 0.867671 0.782751
+vt 0.859462 0.795031
+vt 0.867671 0.795033
+vt 0.884075 0.790944
+vt 0.884075 0.795036
+vt 0.875875 0.795035
+vt 0.875875 0.790942
+vt 0.875875 0.786849
+vt 0.884075 0.786852
+vt 0.875875 0.782756
+vt 0.884076 0.782759
+vt 0.892273 0.786855
+vt 0.892273 0.790946
+vt 0.900470 0.786857
+vt 0.900470 0.790948
+vt 0.892274 0.782763
+vt 0.900470 0.782766
+vt 0.892273 0.795038
+vt 0.900469 0.795039
+vt 0.122797 0.790947
+vt 0.122796 0.795039
+vt 0.114599 0.795039
+vt 0.114599 0.790948
+vt 0.106402 0.795039
+vt 0.106402 0.790948
+vt 0.114599 0.786856
+vt 0.122797 0.786855
+vt 0.114599 0.782764
+vt 0.122797 0.782762
+vt 0.106403 0.786857
+vt 0.106403 0.782766
+vt 0.130997 0.786853
+vt 0.130997 0.790946
+vt 0.139201 0.786850
+vt 0.139201 0.790944
+vt 0.130997 0.782759
+vt 0.139201 0.782755
+vt 0.130997 0.795038
+vt 0.139201 0.795038
+vt 0.155625 0.790939
+vt 0.155624 0.795036
+vt 0.147410 0.795037
+vt 0.147410 0.790942
+vt 0.147410 0.786847
+vt 0.155625 0.786842
+vt 0.147410 0.782751
+vt 0.155625 0.782745
+vt 0.163847 0.786837
+vt 0.163846 0.790936
+vt 0.172076 0.786832
+vt 0.172076 0.790933
+vt 0.163847 0.782738
+vt 0.172076 0.782731
+vt 0.163846 0.795035
+vt 0.172075 0.795033
+vt 0.188561 0.790925
+vt 0.188561 0.795030
+vt 0.180313 0.795032
+vt 0.180314 0.790929
+vt 0.180314 0.786826
+vt 0.188561 0.786820
+vt 0.180314 0.782723
+vt 0.188561 0.782714
+vt 0.196817 0.786813
+vt 0.196817 0.790920
+vt 0.205084 0.786806
+vt 0.205083 0.790916
+vt 0.196818 0.782705
+vt 0.205084 0.782696
+vt 0.196817 0.795028
+vt 0.205083 0.795026
+vt 0.221646 0.790907
+vt 0.221646 0.795022
+vt 0.213359 0.795024
+vt 0.213360 0.790912
+vt 0.213360 0.786799
+vt 0.221646 0.786793
+vt 0.213360 0.782687
+vt 0.221646 0.782678
+vt 0.229941 0.786786
+vt 0.229941 0.790903
+vt 0.238246 0.786780
+vt 0.238246 0.790899
+vt 0.229941 0.782669
+vt 0.238246 0.782661
+vt 0.229941 0.795020
+vt 0.238246 0.795018
+vt 0.254880 0.790892
+vt 0.254880 0.795014
+vt 0.246559 0.795016
+vt 0.246559 0.790895
+vt 0.246559 0.786774
+vt 0.254881 0.786769
+vt 0.246559 0.782653
+vt 0.254881 0.782646
+vt 0.263209 0.786764
+vt 0.263209 0.790889
+vt 0.271543 0.786760
+vt 0.271543 0.790886
+vt 0.263209 0.782640
+vt 0.271543 0.782634
+vt 0.263209 0.795013
+vt 0.271543 0.795012
+vt 0.288226 0.790883
+vt 0.288226 0.795010
+vt 0.279882 0.795011
+vt 0.279882 0.790884
+vt 0.279882 0.786757
+vt 0.288226 0.786755
+vt 0.279882 0.782630
+vt 0.288226 0.782627
+vt 0.296571 0.786754
+vt 0.296571 0.790882
+vt 0.304919 0.786753
+vt 0.304919 0.790881
+vt 0.296571 0.782625
+vt 0.304919 0.782625
+vt 0.296571 0.795010
+vt 0.304919 0.795009
+vt 0.321611 0.790882
+vt 0.321611 0.795010
+vt 0.313266 0.795010
+vt 0.313266 0.790882
+vt 0.313266 0.786753
+vt 0.321611 0.786755
+vt 0.313266 0.782625
+vt 0.321611 0.782627
+vt 0.329955 0.786757
+vt 0.329955 0.790884
+vt 0.329955 0.782630
+vt 0.329955 0.795011
+vt 0.354956 0.774400
+vt 0.354956 0.778523
+vt 0.346628 0.778515
+vt 0.346628 0.774390
+vt 0.338294 0.778509
+vt 0.338294 0.774383
+vt 0.346628 0.770266
+vt 0.354956 0.770276
+vt 0.346628 0.766141
+vt 0.354956 0.766153
+vt 0.338294 0.770257
+vt 0.338294 0.766130
+vt 0.363277 0.770289
+vt 0.363277 0.774410
+vt 0.371591 0.770302
+vt 0.371591 0.774422
+vt 0.363277 0.766167
+vt 0.371590 0.766182
+vt 0.363278 0.778532
+vt 0.371591 0.778541
+vt 0.388191 0.774447
+vt 0.388191 0.778563
+vt 0.379895 0.778552
+vt 0.379895 0.774434
+vt 0.379895 0.770316
+vt 0.388190 0.770332
+vt 0.379895 0.766198
+vt 0.388190 0.766216
+vt 0.396476 0.770348
+vt 0.396477 0.774461
+vt 0.404753 0.770364
+vt 0.404753 0.774475
+vt 0.396476 0.766234
+vt 0.404752 0.766252
+vt 0.396477 0.778574
+vt 0.404753 0.778586
+vt 0.421275 0.774502
+vt 0.421276 0.778608
+vt 0.413019 0.778597
+vt 0.413019 0.774489
+vt 0.413019 0.770379
+vt 0.421275 0.770395
+vt 0.413018 0.766270
+vt 0.421275 0.766287
+vt 0.429522 0.770410
+vt 0.429522 0.774515
+vt 0.437760 0.770424
+vt 0.437760 0.774527
+vt 0.429522 0.766304
+vt 0.437760 0.766321
+vt 0.429523 0.778619
+vt 0.437761 0.778629
+vt 0.454211 0.774548
+vt 0.454212 0.778647
+vt 0.445990 0.778639
+vt 0.445990 0.774538
+vt 0.445989 0.770437
+vt 0.454211 0.770449
+vt 0.445989 0.766335
+vt 0.454211 0.766349
+vt 0.462426 0.770459
+vt 0.462426 0.774557
+vt 0.470635 0.770468
+vt 0.470635 0.774565
+vt 0.462426 0.766360
+vt 0.470634 0.766370
+vt 0.462426 0.778654
+vt 0.470635 0.778660
+vt 0.487039 0.774574
+vt 0.487040 0.778668
+vt 0.478839 0.778665
+vt 0.478839 0.774570
+vt 0.478839 0.770474
+vt 0.487039 0.770479
+vt 0.478838 0.766378
+vt 0.487039 0.766383
+vt 0.495237 0.770482
+vt 0.495237 0.774576
+vt 0.503433 0.770482
+vt 0.503434 0.774577
+vt 0.495236 0.766386
+vt 0.503433 0.766387
+vt 0.495237 0.778670
+vt 0.503434 0.778670
+vt 0.519828 0.774572
+vt 0.519828 0.778666
+vt 0.511630 0.778669
+vt 0.511630 0.774575
+vt 0.511630 0.770480
+vt 0.519828 0.770477
+vt 0.511630 0.766385
+vt 0.519827 0.766381
+vt 0.528028 0.770471
+vt 0.528028 0.774567
+vt 0.536232 0.770463
+vt 0.536232 0.774560
+vt 0.528028 0.766374
+vt 0.536232 0.766365
+vt 0.528029 0.778661
+vt 0.536233 0.778656
+vt 0.552656 0.774542
+vt 0.552656 0.778640
+vt 0.544442 0.778648
+vt 0.544441 0.774551
+vt 0.544441 0.770453
+vt 0.552656 0.770442
+vt 0.544441 0.766355
+vt 0.552656 0.766342
+vt 0.560878 0.770429
+vt 0.560878 0.774531
+vt 0.569107 0.770415
+vt 0.569107 0.774518
+vt 0.560877 0.766328
+vt 0.569107 0.766312
+vt 0.560878 0.778631
+vt 0.569108 0.778620
+vt 0.585593 0.774491
+vt 0.585593 0.778598
+vt 0.577346 0.778609
+vt 0.577345 0.774505
+vt 0.577345 0.770400
+vt 0.585592 0.770384
+vt 0.577345 0.766295
+vt 0.585592 0.766277
+vt 0.593849 0.770368
+vt 0.593849 0.774477
+vt 0.602115 0.770351
+vt 0.602115 0.774462
+vt 0.593849 0.766258
+vt 0.602115 0.766239
+vt 0.593849 0.778585
+vt 0.602116 0.778573
+vt 0.618678 0.774433
+vt 0.618678 0.778549
+vt 0.610392 0.778561
+vt 0.610392 0.774448
+vt 0.610391 0.770334
+vt 0.618678 0.770318
+vt 0.610391 0.766220
+vt 0.618677 0.766202
+vt 0.626973 0.770302
+vt 0.626973 0.774420
+vt 0.635278 0.770287
+vt 0.635278 0.774406
+vt 0.626973 0.766184
+vt 0.635278 0.766167
+vt 0.626974 0.778537
+vt 0.635278 0.778526
+vt 0.651913 0.774383
+vt 0.651913 0.778507
+vt 0.643592 0.778516
+vt 0.643592 0.774394
+vt 0.643592 0.770273
+vt 0.651913 0.770260
+vt 0.643591 0.766151
+vt 0.651913 0.766137
+vt 0.660241 0.770249
+vt 0.660241 0.774374
+vt 0.668576 0.770239
+vt 0.668576 0.774366
+vt 0.660241 0.766124
+vt 0.668576 0.766113
+vt 0.660242 0.778498
+vt 0.668576 0.778491
+vt 0.685259 0.774354
+vt 0.685259 0.778482
+vt 0.676916 0.778486
+vt 0.676916 0.774359
+vt 0.676915 0.770232
+vt 0.685259 0.770227
+vt 0.676915 0.766105
+vt 0.685259 0.766099
+vt 0.693605 0.770223
+vt 0.693605 0.774352
+vt 0.701952 0.770222
+vt 0.701952 0.774351
+vt 0.693605 0.766095
+vt 0.701952 0.766094
+vt 0.693605 0.778480
+vt 0.701952 0.778479
+vt 0.718645 0.774354
+vt 0.718645 0.778482
+vt 0.710299 0.778480
+vt 0.710299 0.774351
+vt 0.710299 0.770223
+vt 0.718645 0.770227
+vt 0.710299 0.766095
+vt 0.718645 0.766099
+vt 0.726989 0.770232
+vt 0.726989 0.774359
+vt 0.735328 0.770239
+vt 0.735328 0.774366
+vt 0.726989 0.766105
+vt 0.735328 0.766113
+vt 0.726989 0.778486
+vt 0.735328 0.778491
+vt 0.751991 0.774383
+vt 0.751991 0.778507
+vt 0.743663 0.778498
+vt 0.743663 0.774374
+vt 0.743663 0.770249
+vt 0.751991 0.770260
+vt 0.743663 0.766124
+vt 0.751991 0.766137
+vt 0.760313 0.770273
+vt 0.760313 0.774395
+vt 0.768626 0.770287
+vt 0.768626 0.774407
+vt 0.760313 0.766151
+vt 0.768626 0.766167
+vt 0.760312 0.778516
+vt 0.768626 0.778526
+vt 0.785226 0.774434
+vt 0.785226 0.778549
+vt 0.776931 0.778537
+vt 0.776931 0.774420
+vt 0.776931 0.770302
+vt 0.785227 0.770318
+vt 0.776931 0.766184
+vt 0.785227 0.766202
+vt 0.793513 0.770334
+vt 0.793512 0.774448
+vt 0.801789 0.770351
+vt 0.801789 0.774463
+vt 0.793513 0.766220
+vt 0.801789 0.766239
+vt 0.793512 0.778561
+vt 0.801789 0.778573
+vt 0.818312 0.774491
+vt 0.818311 0.778598
+vt 0.810055 0.778586
+vt 0.810055 0.774477
+vt 0.810055 0.770368
+vt 0.818312 0.770385
+vt 0.810056 0.766258
+vt 0.818312 0.766277
+vt 0.826559 0.770400
+vt 0.826559 0.774505
+vt 0.834797 0.770416
+vt 0.834797 0.774518
+vt 0.826559 0.766295
+vt 0.834797 0.766312
+vt 0.826558 0.778610
+vt 0.834797 0.778621
+vt 0.851248 0.774542
+vt 0.851248 0.778640
+vt 0.843026 0.778631
+vt 0.843026 0.774531
+vt 0.843027 0.770430
+vt 0.851248 0.770442
+vt 0.843027 0.766328
+vt 0.851249 0.766342
+vt 0.859463 0.770454
+vt 0.859463 0.774552
+vt 0.867672 0.770463
+vt 0.867672 0.774560
+vt 0.859464 0.766355
+vt 0.867673 0.766366
+vt 0.859463 0.778649
+vt 0.867672 0.778656
+vt 0.884076 0.774572
+vt 0.884076 0.778666
+vt 0.875876 0.778662
+vt 0.875876 0.774567
+vt 0.875876 0.770471
+vt 0.884077 0.770477
+vt 0.875877 0.766374
+vt 0.884077 0.766381
+vt 0.892274 0.770483
+vt 0.892274 0.774577
+vt 0.900471 0.770488
+vt 0.900471 0.774581
+vt 0.892275 0.766387
+vt 0.900471 0.766393
+vt 0.892274 0.778670
+vt 0.900470 0.778674
+vt 0.122798 0.774575
+vt 0.122797 0.778669
+vt 0.114600 0.778672
+vt 0.114600 0.774578
+vt 0.106403 0.778674
+vt 0.106403 0.774581
+vt 0.114600 0.770484
+vt 0.122798 0.770480
+vt 0.114601 0.766389
+vt 0.122798 0.766384
+vt 0.106404 0.770488
+vt 0.106404 0.766393
+vt 0.130998 0.770474
+vt 0.130998 0.774570
+vt 0.139202 0.770468
+vt 0.139202 0.774565
+vt 0.130999 0.766378
+vt 0.139203 0.766370
+vt 0.130998 0.778665
+vt 0.139202 0.778660
+vt 0.155626 0.774549
+vt 0.155625 0.778647
+vt 0.147411 0.778654
+vt 0.147411 0.774557
+vt 0.147411 0.770459
+vt 0.155626 0.770449
+vt 0.147412 0.766360
+vt 0.155626 0.766349
+vt 0.163848 0.770437
+vt 0.163847 0.774538
+vt 0.172077 0.770424
+vt 0.172077 0.774527
+vt 0.163848 0.766335
+vt 0.172077 0.766321
+vt 0.163847 0.778639
+vt 0.172076 0.778629
+vt 0.188562 0.774502
+vt 0.188561 0.778608
+vt 0.180314 0.778619
+vt 0.180315 0.774515
+vt 0.180315 0.770410
+vt 0.188562 0.770395
+vt 0.180315 0.766305
+vt 0.188562 0.766288
+vt 0.196818 0.770380
+vt 0.196818 0.774489
+vt 0.205084 0.770364
+vt 0.205084 0.774475
+vt 0.196819 0.766270
+vt 0.205085 0.766252
+vt 0.196818 0.778597
+vt 0.205084 0.778586
+vt 0.221646 0.774448
+vt 0.221646 0.778563
+vt 0.213360 0.778574
+vt 0.213360 0.774461
+vt 0.213361 0.770348
+vt 0.221647 0.770332
+vt 0.213361 0.766234
+vt 0.221647 0.766216
+vt 0.229942 0.770317
+vt 0.229942 0.774434
+vt 0.238246 0.770302
+vt 0.238246 0.774422
+vt 0.229942 0.766198
+vt 0.238247 0.766182
+vt 0.229942 0.778552
+vt 0.238246 0.778541
+vt 0.254881 0.774400
+vt 0.254881 0.778523
+vt 0.246560 0.778532
+vt 0.246560 0.774410
+vt 0.246560 0.770289
+vt 0.254881 0.770276
+vt 0.246560 0.766167
+vt 0.254881 0.766153
+vt 0.263209 0.770266
+vt 0.263209 0.774390
+vt 0.271543 0.770257
+vt 0.271543 0.774383
+vt 0.263209 0.766141
+vt 0.271543 0.766130
+vt 0.263209 0.778515
+vt 0.271543 0.778509
+vt 0.288226 0.774372
+vt 0.288226 0.778500
+vt 0.279883 0.778503
+vt 0.279883 0.774376
+vt 0.279883 0.770249
+vt 0.288226 0.770244
+vt 0.279883 0.766122
+vt 0.288226 0.766116
+vt 0.296572 0.770241
+vt 0.296571 0.774369
+vt 0.304919 0.770240
+vt 0.304919 0.774368
+vt 0.296572 0.766113
+vt 0.304919 0.766111
+vt 0.296571 0.778497
+vt 0.304919 0.778497
+vt 0.321611 0.774372
+vt 0.321611 0.778500
+vt 0.313266 0.778497
+vt 0.313266 0.774369
+vt 0.313266 0.770241
+vt 0.321611 0.770244
+vt 0.313266 0.766113
+vt 0.321611 0.766116
+vt 0.329954 0.770249
+vt 0.329954 0.774376
+vt 0.329954 0.766122
+vt 0.329955 0.778503
+vt 0.354956 0.757929
+vt 0.354956 0.762029
+vt 0.346628 0.762016
+vt 0.346628 0.757914
+vt 0.338294 0.762004
+vt 0.338293 0.757902
+vt 0.346627 0.753861
+vt 0.354956 0.753877
+vt 0.346627 0.749879
+vt 0.354955 0.749896
+vt 0.338293 0.753847
+vt 0.338293 0.749864
+vt 0.363277 0.753895
+vt 0.363277 0.757946
+vt 0.371590 0.753915
+vt 0.371590 0.757965
+vt 0.363277 0.749916
+vt 0.371590 0.749937
+vt 0.363277 0.762045
+vt 0.371590 0.762061
+vt 0.388190 0.758006
+vt 0.388190 0.762099
+vt 0.379895 0.762080
+vt 0.379895 0.757985
+vt 0.379894 0.753937
+vt 0.388190 0.753960
+vt 0.379894 0.749961
+vt 0.388189 0.749985
+vt 0.396476 0.753984
+vt 0.396476 0.758028
+vt 0.404752 0.754008
+vt 0.404752 0.758050
+vt 0.396475 0.750011
+vt 0.404751 0.750036
+vt 0.396476 0.762119
+vt 0.404752 0.762139
+vt 0.421274 0.758094
+vt 0.421275 0.762179
+vt 0.413018 0.762159
+vt 0.413018 0.758072
+vt 0.413018 0.754032
+vt 0.421274 0.754055
+vt 0.413017 0.750062
+vt 0.421274 0.750087
+vt 0.429521 0.754078
+vt 0.429521 0.758115
+vt 0.437759 0.754099
+vt 0.437759 0.758134
+vt 0.429521 0.750112
+vt 0.437759 0.750134
+vt 0.429522 0.762198
+vt 0.437759 0.762216
+vt 0.454210 0.758169
+vt 0.454210 0.762247
+vt 0.445989 0.762233
+vt 0.445989 0.758152
+vt 0.445988 0.754119
+vt 0.454210 0.754137
+vt 0.445988 0.750156
+vt 0.454210 0.750175
+vt 0.462425 0.754152
+vt 0.462425 0.758183
+vt 0.470634 0.754165
+vt 0.470634 0.758195
+vt 0.462424 0.750191
+vt 0.470633 0.750205
+vt 0.462425 0.762260
+vt 0.470634 0.762271
+vt 0.487038 0.758211
+vt 0.487038 0.762286
+vt 0.478838 0.762280
+vt 0.478838 0.758204
+vt 0.478837 0.754175
+vt 0.487038 0.754182
+vt 0.478837 0.750216
+vt 0.487037 0.750224
+vt 0.495236 0.754187
+vt 0.495236 0.758215
+vt 0.503432 0.754187
+vt 0.503432 0.758216
+vt 0.495235 0.750228
+vt 0.503432 0.750229
+vt 0.495236 0.762289
+vt 0.503433 0.762290
+vt 0.519827 0.758209
+vt 0.519827 0.762283
+vt 0.511629 0.762288
+vt 0.511629 0.758213
+vt 0.511629 0.754185
+vt 0.519826 0.754180
+vt 0.511628 0.750227
+vt 0.519826 0.750221
+vt 0.528027 0.754172
+vt 0.528027 0.758201
+vt 0.536231 0.754160
+vt 0.536231 0.758190
+vt 0.528026 0.750213
+vt 0.536230 0.750201
+vt 0.528027 0.762276
+vt 0.536231 0.762267
+vt 0.552655 0.758162
+vt 0.552655 0.762241
+vt 0.544440 0.762255
+vt 0.544440 0.758177
+vt 0.544440 0.754146
+vt 0.552655 0.754130
+vt 0.544439 0.750186
+vt 0.552654 0.750168
+vt 0.560876 0.754111
+vt 0.560877 0.758145
+vt 0.569106 0.754090
+vt 0.569106 0.758125
+vt 0.560876 0.750148
+vt 0.569106 0.750126
+vt 0.560877 0.762225
+vt 0.569107 0.762207
+vt 0.585592 0.758083
+vt 0.585592 0.762168
+vt 0.577345 0.762188
+vt 0.577344 0.758105
+vt 0.577344 0.754068
+vt 0.585591 0.754044
+vt 0.577344 0.750102
+vt 0.585591 0.750077
+vt 0.593848 0.754020
+vt 0.593848 0.758060
+vt 0.602114 0.753995
+vt 0.602115 0.758037
+vt 0.593848 0.750050
+vt 0.602114 0.750024
+vt 0.593848 0.762148
+vt 0.602115 0.762127
+vt 0.618677 0.757992
+vt 0.618677 0.762085
+vt 0.610391 0.762106
+vt 0.610391 0.758015
+vt 0.610391 0.753970
+vt 0.618677 0.753946
+vt 0.610391 0.749997
+vt 0.618677 0.749971
+vt 0.626973 0.753922
+vt 0.626973 0.757970
+vt 0.635277 0.753900
+vt 0.635278 0.757949
+vt 0.626972 0.749946
+vt 0.635277 0.749922
+vt 0.626973 0.762065
+vt 0.635278 0.762046
+vt 0.651913 0.757913
+vt 0.651913 0.762013
+vt 0.643591 0.762029
+vt 0.643591 0.757930
+vt 0.643591 0.753879
+vt 0.651912 0.753861
+vt 0.643591 0.749900
+vt 0.651912 0.749880
+vt 0.660241 0.753844
+vt 0.660241 0.757898
+vt 0.668575 0.753830
+vt 0.668576 0.757885
+vt 0.660241 0.749862
+vt 0.668575 0.749847
+vt 0.660241 0.761999
+vt 0.668576 0.761987
+vt 0.685259 0.757867
+vt 0.685259 0.761971
+vt 0.676915 0.761978
+vt 0.676915 0.757875
+vt 0.676915 0.753819
+vt 0.685259 0.753811
+vt 0.676915 0.749836
+vt 0.685259 0.749827
+vt 0.693605 0.753806
+vt 0.693605 0.757863
+vt 0.701952 0.753805
+vt 0.701952 0.757861
+vt 0.693605 0.749822
+vt 0.701952 0.749820
+vt 0.693605 0.761967
+vt 0.701952 0.761966
+vt 0.718645 0.757867
+vt 0.718645 0.761971
+vt 0.710299 0.761967
+vt 0.710299 0.757863
+vt 0.710299 0.753806
+vt 0.718646 0.753811
+vt 0.710299 0.749822
+vt 0.718646 0.749827
+vt 0.726989 0.753819
+vt 0.726989 0.757875
+vt 0.735329 0.753830
+vt 0.735329 0.757885
+vt 0.726989 0.749836
+vt 0.735329 0.749847
+vt 0.726989 0.761978
+vt 0.735328 0.761987
+vt 0.751992 0.757913
+vt 0.751992 0.762013
+vt 0.743663 0.761999
+vt 0.743663 0.757898
+vt 0.743663 0.753844
+vt 0.751992 0.753861
+vt 0.743663 0.749862
+vt 0.751992 0.749880
+vt 0.760313 0.753879
+vt 0.760313 0.757930
+vt 0.768627 0.753900
+vt 0.768627 0.757950
+vt 0.760313 0.749900
+vt 0.768627 0.749922
+vt 0.760313 0.762029
+vt 0.768627 0.762046
+vt 0.785227 0.757992
+vt 0.785227 0.762085
+vt 0.776931 0.762065
+vt 0.776931 0.757970
+vt 0.776932 0.753923
+vt 0.785227 0.753946
+vt 0.776932 0.749946
+vt 0.785227 0.749971
+vt 0.793514 0.753971
+vt 0.793513 0.758015
+vt 0.801790 0.753995
+vt 0.801790 0.758038
+vt 0.793514 0.749997
+vt 0.801790 0.750024
+vt 0.793513 0.762106
+vt 0.801790 0.762127
+vt 0.818313 0.758083
+vt 0.818312 0.762168
+vt 0.810056 0.762148
+vt 0.810056 0.758061
+vt 0.810056 0.754020
+vt 0.818313 0.754045
+vt 0.810057 0.750051
+vt 0.818313 0.750077
+vt 0.826560 0.754068
+vt 0.826560 0.758105
+vt 0.834798 0.754091
+vt 0.834798 0.758126
+vt 0.826560 0.750102
+vt 0.834799 0.750126
+vt 0.826560 0.762188
+vt 0.834798 0.762207
+vt 0.851249 0.758162
+vt 0.851249 0.762241
+vt 0.843027 0.762225
+vt 0.843027 0.758145
+vt 0.843028 0.754111
+vt 0.851250 0.754130
+vt 0.843028 0.750148
+vt 0.851250 0.750168
+vt 0.859464 0.754147
+vt 0.859464 0.758178
+vt 0.867674 0.754161
+vt 0.867673 0.758191
+vt 0.859465 0.750186
+vt 0.867674 0.750201
+vt 0.859464 0.762255
+vt 0.867673 0.762267
+vt 0.884078 0.758209
+vt 0.884077 0.762284
+vt 0.875877 0.762276
+vt 0.875877 0.758201
+vt 0.875878 0.754172
+vt 0.884078 0.754181
+vt 0.875878 0.750213
+vt 0.884078 0.750222
+vt 0.892276 0.754189
+vt 0.892275 0.758217
+vt 0.900472 0.754196
+vt 0.900472 0.758223
+vt 0.892276 0.750231
+vt 0.900473 0.750238
+vt 0.892275 0.762291
+vt 0.900472 0.762297
+vt 0.122799 0.758212
+vt 0.122799 0.762286
+vt 0.114601 0.762292
+vt 0.114601 0.758218
+vt 0.106404 0.762297
+vt 0.106405 0.758223
+vt 0.114602 0.754190
+vt 0.122799 0.754183
+vt 0.114602 0.750232
+vt 0.122800 0.750225
+vt 0.106405 0.754196
+vt 0.106405 0.750238
+vt 0.131000 0.754175
+vt 0.130999 0.758204
+vt 0.139204 0.754165
+vt 0.139203 0.758195
+vt 0.131000 0.750216
+vt 0.139204 0.750205
+vt 0.130999 0.762280
+vt 0.139203 0.762271
+vt 0.155627 0.758169
+vt 0.155627 0.762247
+vt 0.147412 0.762260
+vt 0.147412 0.758183
+vt 0.147412 0.754152
+vt 0.155627 0.754137
+vt 0.147413 0.750191
+vt 0.155627 0.750175
+vt 0.163849 0.754119
+vt 0.163848 0.758152
+vt 0.172078 0.754099
+vt 0.172078 0.758134
+vt 0.163849 0.750156
+vt 0.172078 0.750135
+vt 0.163848 0.762233
+vt 0.172078 0.762216
+vt 0.188563 0.758094
+vt 0.188562 0.762179
+vt 0.180316 0.762198
+vt 0.180316 0.758115
+vt 0.180316 0.754078
+vt 0.188563 0.754055
+vt 0.180316 0.750112
+vt 0.188563 0.750087
+vt 0.196819 0.754032
+vt 0.196819 0.758072
+vt 0.205085 0.754008
+vt 0.205085 0.758050
+vt 0.196820 0.750062
+vt 0.205086 0.750037
+vt 0.196819 0.762159
+vt 0.205085 0.762139
+vt 0.221647 0.758006
+vt 0.221647 0.762099
+vt 0.213361 0.762119
+vt 0.213361 0.758028
+vt 0.213361 0.753984
+vt 0.221647 0.753960
+vt 0.213362 0.750011
+vt 0.221648 0.749985
+vt 0.229943 0.753937
+vt 0.229942 0.757985
+vt 0.238247 0.753915
+vt 0.238247 0.757965
+vt 0.229943 0.749961
+vt 0.238247 0.749938
+vt 0.229942 0.762080
+vt 0.238247 0.762062
+vt 0.254881 0.757929
+vt 0.254881 0.762029
+vt 0.246560 0.762045
+vt 0.246560 0.757946
+vt 0.246560 0.753895
+vt 0.254881 0.753877
+vt 0.246560 0.749916
+vt 0.254882 0.749896
+vt 0.263210 0.753861
+vt 0.263209 0.757914
+vt 0.271544 0.753847
+vt 0.271544 0.757902
+vt 0.263210 0.749879
+vt 0.271544 0.749864
+vt 0.263209 0.762016
+vt 0.271544 0.762004
+vt 0.288226 0.757885
+vt 0.288226 0.761989
+vt 0.279883 0.761995
+vt 0.279883 0.757892
+vt 0.279883 0.753837
+vt 0.288226 0.753829
+vt 0.279883 0.749853
+vt 0.288226 0.749845
+vt 0.296572 0.753824
+vt 0.296572 0.757880
+vt 0.304919 0.753822
+vt 0.304919 0.757879
+vt 0.296572 0.749839
+vt 0.304919 0.749838
+vt 0.296572 0.761985
+vt 0.304919 0.761983
+vt 0.321611 0.757885
+vt 0.321611 0.761988
+vt 0.313265 0.761984
+vt 0.313265 0.757880
+vt 0.313265 0.753824
+vt 0.321611 0.753829
+vt 0.313265 0.749839
+vt 0.321611 0.749844
+vt 0.329954 0.753836
+vt 0.329954 0.757892
+vt 0.329954 0.749853
+vt 0.329954 0.761995
+vt 0.354955 0.742383
+vt 0.354955 0.746011
+vt 0.346627 0.745993
+vt 0.346627 0.742364
+vt 0.338293 0.745977
+vt 0.338293 0.742348
+vt 0.346627 0.739155
+vt 0.354955 0.739175
+vt 0.346627 0.736529
+vt 0.354955 0.736549
+vt 0.338293 0.739138
+vt 0.338293 0.736511
+vt 0.363276 0.739198
+vt 0.363276 0.742405
+vt 0.371589 0.739223
+vt 0.371589 0.742429
+vt 0.363276 0.736573
+vt 0.371589 0.736599
+vt 0.363276 0.746032
+vt 0.371590 0.746055
+vt 0.388189 0.742483
+vt 0.388189 0.746106
+vt 0.379894 0.746079
+vt 0.379894 0.742455
+vt 0.379894 0.739250
+vt 0.388189 0.739279
+vt 0.379894 0.736627
+vt 0.388189 0.736656
+vt 0.396475 0.739308
+vt 0.396475 0.742511
+vt 0.404751 0.739339
+vt 0.404751 0.742540
+vt 0.396475 0.736686
+vt 0.404751 0.736717
+vt 0.396475 0.746132
+vt 0.404751 0.746160
+vt 0.421273 0.742597
+vt 0.421273 0.746214
+vt 0.413017 0.746187
+vt 0.413017 0.742569
+vt 0.413017 0.739368
+vt 0.421273 0.739398
+vt 0.413017 0.736748
+vt 0.421273 0.736778
+vt 0.429520 0.739426
+vt 0.429520 0.742624
+vt 0.437758 0.739453
+vt 0.437758 0.742649
+vt 0.429520 0.736808
+vt 0.437758 0.736835
+vt 0.429520 0.746240
+vt 0.437758 0.746264
+vt 0.454209 0.742694
+vt 0.454209 0.746307
+vt 0.445988 0.746286
+vt 0.445987 0.742673
+vt 0.445987 0.739477
+vt 0.454209 0.739499
+vt 0.445987 0.736861
+vt 0.454208 0.736883
+vt 0.462423 0.739519
+vt 0.462424 0.742713
+vt 0.470632 0.739535
+vt 0.470633 0.742728
+vt 0.462423 0.736903
+vt 0.470632 0.736920
+vt 0.462424 0.746324
+vt 0.470633 0.746339
+vt 0.487037 0.742749
+vt 0.487037 0.746359
+vt 0.478837 0.746351
+vt 0.478837 0.742741
+vt 0.478836 0.739548
+vt 0.487036 0.739557
+vt 0.478836 0.736933
+vt 0.487036 0.736943
+vt 0.495234 0.739562
+vt 0.495235 0.742754
+vt 0.503431 0.739564
+vt 0.503431 0.742756
+vt 0.495234 0.736948
+vt 0.503431 0.736950
+vt 0.495235 0.746364
+vt 0.503431 0.746365
+vt 0.519825 0.742747
+vt 0.519826 0.746357
+vt 0.511628 0.746363
+vt 0.511628 0.742753
+vt 0.511627 0.739561
+vt 0.519825 0.739555
+vt 0.511627 0.736947
+vt 0.519825 0.736941
+vt 0.528026 0.739544
+vt 0.528026 0.742737
+vt 0.536230 0.739531
+vt 0.536230 0.742724
+vt 0.528025 0.736930
+vt 0.536229 0.736916
+vt 0.528026 0.746347
+vt 0.536230 0.746335
+vt 0.552654 0.742688
+vt 0.552654 0.746300
+vt 0.544439 0.746319
+vt 0.544439 0.742707
+vt 0.544439 0.739513
+vt 0.552654 0.739493
+vt 0.544438 0.736898
+vt 0.552653 0.736877
+vt 0.560875 0.739469
+vt 0.560876 0.742665
+vt 0.569105 0.739444
+vt 0.569105 0.742641
+vt 0.560875 0.736853
+vt 0.569105 0.736826
+vt 0.560876 0.746279
+vt 0.569105 0.746255
+vt 0.585591 0.742586
+vt 0.585591 0.746203
+vt 0.577344 0.746230
+vt 0.577343 0.742614
+vt 0.577343 0.739416
+vt 0.585590 0.739387
+vt 0.577343 0.736798
+vt 0.585590 0.736768
+vt 0.593847 0.739357
+vt 0.593847 0.742557
+vt 0.602113 0.739326
+vt 0.602114 0.742527
+vt 0.593847 0.736737
+vt 0.602113 0.736705
+vt 0.593847 0.746175
+vt 0.602114 0.746147
+vt 0.618676 0.742469
+vt 0.618677 0.746092
+vt 0.610390 0.746119
+vt 0.610390 0.742498
+vt 0.610390 0.739295
+vt 0.618676 0.739265
+vt 0.610390 0.736673
+vt 0.618676 0.736642
+vt 0.626972 0.739236
+vt 0.626972 0.742441
+vt 0.635277 0.739208
+vt 0.635277 0.742414
+vt 0.626972 0.736612
+vt 0.635277 0.736583
+vt 0.626972 0.746065
+vt 0.635277 0.746040
+vt 0.651912 0.742367
+vt 0.651912 0.745995
+vt 0.643591 0.746016
+vt 0.643591 0.742389
+vt 0.643590 0.739182
+vt 0.651912 0.739159
+vt 0.643590 0.736557
+vt 0.651912 0.736533
+vt 0.660241 0.739139
+vt 0.660241 0.742347
+vt 0.668575 0.739121
+vt 0.668575 0.742331
+vt 0.660241 0.736512
+vt 0.668575 0.736494
+vt 0.660241 0.745976
+vt 0.668575 0.745960
+vt 0.685259 0.742308
+vt 0.685259 0.745939
+vt 0.676915 0.745948
+vt 0.676915 0.742318
+vt 0.676915 0.739108
+vt 0.685259 0.739098
+vt 0.676915 0.736480
+vt 0.685259 0.736470
+vt 0.693605 0.739092
+vt 0.693605 0.742302
+vt 0.701952 0.739090
+vt 0.701952 0.742300
+vt 0.693605 0.736463
+vt 0.701952 0.736461
+vt 0.693605 0.745933
+vt 0.701952 0.745931
+vt 0.718646 0.742308
+vt 0.718646 0.745939
+vt 0.710299 0.745933
+vt 0.710299 0.742302
+vt 0.710299 0.739092
+vt 0.718646 0.739098
+vt 0.710299 0.736463
+vt 0.718646 0.736470
+vt 0.726989 0.739108
+vt 0.726989 0.742318
+vt 0.735329 0.739121
+vt 0.735329 0.742331
+vt 0.726989 0.736480
+vt 0.735329 0.736494
+vt 0.726989 0.745948
+vt 0.735329 0.745960
+vt 0.751992 0.742367
+vt 0.751992 0.745995
+vt 0.743663 0.745976
+vt 0.743664 0.742347
+vt 0.743664 0.739139
+vt 0.751992 0.739159
+vt 0.743664 0.736512
+vt 0.751992 0.736533
+vt 0.760314 0.739182
+vt 0.760314 0.742390
+vt 0.768628 0.739208
+vt 0.768627 0.742414
+vt 0.760314 0.736557
+vt 0.768628 0.736584
+vt 0.760314 0.746016
+vt 0.768627 0.746040
+vt 0.785228 0.742469
+vt 0.785228 0.746092
+vt 0.776932 0.746065
+vt 0.776932 0.742441
+vt 0.776932 0.739236
+vt 0.785228 0.739265
+vt 0.776933 0.736612
+vt 0.785228 0.736642
+vt 0.793514 0.739295
+vt 0.793514 0.742498
+vt 0.801791 0.739326
+vt 0.801791 0.742528
+vt 0.793515 0.736674
+vt 0.801791 0.736705
+vt 0.793514 0.746119
+vt 0.801790 0.746148
+vt 0.818314 0.742586
+vt 0.818313 0.746203
+vt 0.810057 0.746176
+vt 0.810057 0.742557
+vt 0.810057 0.739357
+vt 0.818314 0.739387
+vt 0.810058 0.736737
+vt 0.818314 0.736768
+vt 0.826561 0.739416
+vt 0.826561 0.742614
+vt 0.834799 0.739444
+vt 0.834799 0.742641
+vt 0.826561 0.736798
+vt 0.834800 0.736827
+vt 0.826561 0.746230
+vt 0.834799 0.746255
+vt 0.851250 0.742688
+vt 0.851250 0.746300
+vt 0.843028 0.746279
+vt 0.843029 0.742665
+vt 0.843029 0.739470
+vt 0.851251 0.739493
+vt 0.843029 0.736853
+vt 0.851251 0.736877
+vt 0.859466 0.739513
+vt 0.859465 0.742707
+vt 0.867675 0.739531
+vt 0.867674 0.742724
+vt 0.859466 0.736898
+vt 0.867675 0.736916
+vt 0.859465 0.746319
+vt 0.867674 0.746335
+vt 0.884079 0.742748
+vt 0.884079 0.746358
+vt 0.875878 0.746347
+vt 0.875878 0.742737
+vt 0.875879 0.739544
+vt 0.884079 0.739556
+vt 0.875879 0.736930
+vt 0.884079 0.736942
+vt 0.892277 0.739565
+vt 0.892277 0.742757
+vt 0.900473 0.739574
+vt 0.900473 0.742765
+vt 0.892277 0.736951
+vt 0.900474 0.736960
+vt 0.892276 0.746366
+vt 0.900473 0.746374
+vt 0.122800 0.742750
+vt 0.122800 0.746360
+vt 0.114602 0.746367
+vt 0.114603 0.742758
+vt 0.106406 0.746374
+vt 0.106406 0.742765
+vt 0.114603 0.739566
+vt 0.122801 0.739558
+vt 0.114603 0.736952
+vt 0.122801 0.736944
+vt 0.106406 0.739574
+vt 0.106406 0.736960
+vt 0.131001 0.739548
+vt 0.131000 0.742741
+vt 0.139205 0.739535
+vt 0.139204 0.742729
+vt 0.131001 0.736933
+vt 0.139205 0.736920
+vt 0.131000 0.746351
+vt 0.139204 0.746339
+vt 0.155628 0.742694
+vt 0.155628 0.746307
+vt 0.147413 0.746324
+vt 0.147413 0.742713
+vt 0.147414 0.739519
+vt 0.155628 0.739500
+vt 0.147414 0.736904
+vt 0.155629 0.736884
+vt 0.163850 0.739477
+vt 0.163850 0.742673
+vt 0.172079 0.739453
+vt 0.172079 0.742650
+vt 0.163850 0.736861
+vt 0.172079 0.736835
+vt 0.163849 0.746287
+vt 0.172079 0.746264
+vt 0.188564 0.742597
+vt 0.188563 0.746214
+vt 0.180317 0.746240
+vt 0.180317 0.742624
+vt 0.180317 0.739426
+vt 0.188564 0.739398
+vt 0.180317 0.736808
+vt 0.188564 0.736779
+vt 0.196820 0.739368
+vt 0.196820 0.742569
+vt 0.205086 0.739339
+vt 0.205086 0.742540
+vt 0.196820 0.736748
+vt 0.205086 0.736718
+vt 0.196820 0.746187
+vt 0.205086 0.746160
+vt 0.221648 0.742483
+vt 0.221648 0.746106
+vt 0.213362 0.746133
+vt 0.213362 0.742511
+vt 0.213362 0.739309
+vt 0.221648 0.739279
+vt 0.213362 0.736687
+vt 0.221648 0.736656
+vt 0.229943 0.739251
+vt 0.229943 0.742455
+vt 0.238248 0.739223
+vt 0.238248 0.742429
+vt 0.229943 0.736627
+vt 0.238248 0.736599
+vt 0.229943 0.746080
+vt 0.238247 0.746055
+vt 0.254882 0.742383
+vt 0.254882 0.746011
+vt 0.246561 0.746032
+vt 0.246561 0.742405
+vt 0.246561 0.739198
+vt 0.254882 0.739175
+vt 0.246561 0.736573
+vt 0.254882 0.736549
+vt 0.263210 0.739155
+vt 0.263210 0.742364
+vt 0.271544 0.739138
+vt 0.271544 0.742348
+vt 0.263210 0.736529
+vt 0.271544 0.736511
+vt 0.263210 0.745993
+vt 0.271544 0.745977
+vt 0.288226 0.742326
+vt 0.288226 0.745956
+vt 0.279883 0.745965
+vt 0.279883 0.742335
+vt 0.279883 0.739125
+vt 0.288226 0.739115
+vt 0.279883 0.736497
+vt 0.288226 0.736487
+vt 0.296572 0.739109
+vt 0.296572 0.742320
+vt 0.304919 0.739107
+vt 0.304919 0.742318
+vt 0.296572 0.736481
+vt 0.304919 0.736479
+vt 0.296572 0.745951
+vt 0.304919 0.745949
+vt 0.321611 0.742326
+vt 0.321611 0.745956
+vt 0.313265 0.745951
+vt 0.313265 0.742320
+vt 0.313265 0.739109
+vt 0.321611 0.739115
+vt 0.313265 0.736481
+vt 0.321611 0.736487
+vt 0.329954 0.739125
+vt 0.329954 0.742335
+vt 0.329954 0.736497
+vt 0.329954 0.745965
+vt 0.354955 0.723927
+vt 0.354955 0.727136
+vt 0.346627 0.727114
+vt 0.346627 0.723904
+vt 0.338293 0.727095
+vt 0.338293 0.723885
+vt 0.354955 0.729763
+vt 0.346627 0.729741
+vt 0.338293 0.729723
+vt 0.346626 0.720274
+vt 0.354954 0.720297
+vt 0.346626 0.716386
+vt 0.354954 0.716410
+vt 0.338293 0.720254
+vt 0.338292 0.716366
+vt 0.363275 0.720324
+vt 0.363275 0.723953
+vt 0.371588 0.720353
+vt 0.371589 0.723981
+vt 0.363275 0.716437
+vt 0.371588 0.716466
+vt 0.363276 0.727162
+vt 0.363276 0.729788
+vt 0.371589 0.727190
+vt 0.371589 0.729816
+vt 0.388188 0.724045
+vt 0.388188 0.727252
+vt 0.379893 0.727220
+vt 0.379893 0.724012
+vt 0.388188 0.729877
+vt 0.379893 0.729845
+vt 0.379893 0.720385
+vt 0.388188 0.720418
+vt 0.379892 0.716498
+vt 0.388188 0.716532
+vt 0.396474 0.720452
+vt 0.396474 0.724079
+vt 0.404750 0.720487
+vt 0.404750 0.724113
+vt 0.396473 0.716567
+vt 0.404749 0.716603
+vt 0.396474 0.727285
+vt 0.396474 0.729909
+vt 0.404750 0.727318
+vt 0.404750 0.729942
+vt 0.421272 0.724181
+vt 0.421272 0.727385
+vt 0.413016 0.727352
+vt 0.413016 0.724147
+vt 0.421272 0.730007
+vt 0.413016 0.729975
+vt 0.413015 0.720522
+vt 0.421272 0.720556
+vt 0.413015 0.716638
+vt 0.421271 0.716673
+vt 0.429518 0.720589
+vt 0.429519 0.724213
+vt 0.437756 0.720620
+vt 0.437757 0.724243
+vt 0.429518 0.716707
+vt 0.437756 0.716739
+vt 0.429519 0.727416
+vt 0.429519 0.730038
+vt 0.437757 0.727446
+vt 0.437757 0.730068
+vt 0.454207 0.724297
+vt 0.454208 0.727499
+vt 0.445986 0.727474
+vt 0.445986 0.724272
+vt 0.454208 0.730119
+vt 0.445986 0.730095
+vt 0.445985 0.720649
+vt 0.454207 0.720675
+vt 0.445985 0.716768
+vt 0.454207 0.716794
+vt 0.462422 0.720698
+vt 0.462422 0.724319
+vt 0.470631 0.720717
+vt 0.470631 0.724338
+vt 0.462421 0.716817
+vt 0.470630 0.716837
+vt 0.462422 0.727520
+vt 0.462423 0.730140
+vt 0.470631 0.727539
+vt 0.470631 0.730158
+vt 0.487035 0.724363
+vt 0.487035 0.727563
+vt 0.478835 0.727553
+vt 0.478835 0.724352
+vt 0.487036 0.730182
+vt 0.478835 0.730172
+vt 0.478834 0.720732
+vt 0.487035 0.720742
+vt 0.478834 0.716852
+vt 0.487034 0.716863
+vt 0.495232 0.720749
+vt 0.495233 0.724369
+vt 0.503429 0.720750
+vt 0.503429 0.724371
+vt 0.495232 0.716869
+vt 0.503429 0.716871
+vt 0.495233 0.727569
+vt 0.495233 0.730188
+vt 0.503430 0.727571
+vt 0.503430 0.730190
+vt 0.519824 0.724360
+vt 0.519824 0.727561
+vt 0.511626 0.727568
+vt 0.511626 0.724368
+vt 0.519824 0.730180
+vt 0.511626 0.730187
+vt 0.511626 0.720747
+vt 0.519823 0.720740
+vt 0.511625 0.716868
+vt 0.519823 0.716861
+vt 0.528024 0.720728
+vt 0.528024 0.724349
+vt 0.536228 0.720712
+vt 0.536228 0.724333
+vt 0.528023 0.716848
+vt 0.536227 0.716832
+vt 0.528024 0.727550
+vt 0.528025 0.730169
+vt 0.536228 0.727534
+vt 0.536229 0.730154
+vt 0.552652 0.724290
+vt 0.552653 0.727492
+vt 0.544438 0.727515
+vt 0.544437 0.724313
+vt 0.552653 0.730112
+vt 0.544438 0.730135
+vt 0.544437 0.720692
+vt 0.552652 0.720668
+vt 0.544437 0.716812
+vt 0.552652 0.716788
+vt 0.560874 0.720641
+vt 0.560874 0.724264
+vt 0.569103 0.720612
+vt 0.569104 0.724235
+vt 0.560873 0.716760
+vt 0.569103 0.716730
+vt 0.560874 0.727466
+vt 0.560875 0.730087
+vt 0.569104 0.727437
+vt 0.569104 0.730059
+vt 0.585589 0.724170
+vt 0.585590 0.727374
+vt 0.577342 0.727407
+vt 0.577342 0.724203
+vt 0.585590 0.729997
+vt 0.577343 0.730029
+vt 0.577342 0.720580
+vt 0.585589 0.720546
+vt 0.577341 0.716697
+vt 0.585589 0.716663
+vt 0.593846 0.720511
+vt 0.593846 0.724136
+vt 0.602112 0.720475
+vt 0.602112 0.724101
+vt 0.593845 0.716627
+vt 0.602112 0.716591
+vt 0.593846 0.727340
+vt 0.593846 0.729964
+vt 0.602113 0.727306
+vt 0.602113 0.729930
+vt 0.618675 0.724031
+vt 0.618675 0.727238
+vt 0.610389 0.727272
+vt 0.610389 0.724066
+vt 0.618676 0.729863
+vt 0.610389 0.729896
+vt 0.610389 0.720439
+vt 0.618675 0.720404
+vt 0.610388 0.716554
+vt 0.618675 0.716519
+vt 0.626971 0.720370
+vt 0.626971 0.723998
+vt 0.635276 0.720338
+vt 0.635276 0.723966
+vt 0.626971 0.716484
+vt 0.635276 0.716451
+vt 0.626971 0.727205
+vt 0.626971 0.729831
+vt 0.635276 0.727174
+vt 0.635276 0.729800
+vt 0.651911 0.723911
+vt 0.651912 0.727120
+vt 0.643590 0.727146
+vt 0.643590 0.723937
+vt 0.651912 0.729747
+vt 0.643590 0.729772
+vt 0.643590 0.720308
+vt 0.651911 0.720281
+vt 0.643589 0.716421
+vt 0.651911 0.716393
+vt 0.660240 0.720257
+vt 0.660240 0.723887
+vt 0.668575 0.720237
+vt 0.668575 0.723868
+vt 0.660240 0.716369
+vt 0.668575 0.716349
+vt 0.660240 0.727097
+vt 0.660240 0.729724
+vt 0.668575 0.727078
+vt 0.668575 0.729706
+vt 0.685258 0.723841
+vt 0.685258 0.727051
+vt 0.676915 0.727063
+vt 0.676915 0.723852
+vt 0.685258 0.729680
+vt 0.676915 0.729691
+vt 0.676915 0.720222
+vt 0.685258 0.720210
+vt 0.676915 0.716333
+vt 0.685258 0.716321
+vt 0.693605 0.720203
+vt 0.693605 0.723834
+vt 0.701952 0.720201
+vt 0.701952 0.723832
+vt 0.693605 0.716314
+vt 0.701952 0.716311
+vt 0.693605 0.727045
+vt 0.693605 0.729673
+vt 0.701952 0.727042
+vt 0.701952 0.729671
+vt 0.718646 0.723841
+vt 0.718646 0.727051
+vt 0.710300 0.727045
+vt 0.710300 0.723834
+vt 0.718646 0.729680
+vt 0.710300 0.729673
+vt 0.710300 0.720203
+vt 0.718646 0.720210
+vt 0.710300 0.716314
+vt 0.718646 0.716321
+vt 0.726990 0.720222
+vt 0.726990 0.723852
+vt 0.735330 0.720237
+vt 0.735329 0.723868
+vt 0.726990 0.716333
+vt 0.735330 0.716349
+vt 0.726990 0.727063
+vt 0.726989 0.729691
+vt 0.735329 0.727078
+vt 0.735329 0.729706
+vt 0.751993 0.723911
+vt 0.751993 0.727120
+vt 0.743664 0.727097
+vt 0.743664 0.723887
+vt 0.751993 0.729747
+vt 0.743664 0.729725
+vt 0.743664 0.720257
+vt 0.751993 0.720281
+vt 0.743665 0.716369
+vt 0.751993 0.716394
+vt 0.760315 0.720308
+vt 0.760315 0.723937
+vt 0.768628 0.720338
+vt 0.768628 0.723966
+vt 0.760315 0.716421
+vt 0.768629 0.716451
+vt 0.760314 0.727146
+vt 0.760314 0.729773
+vt 0.768628 0.727175
+vt 0.768628 0.729801
+vt 0.785229 0.724031
+vt 0.785229 0.727238
+vt 0.776933 0.727206
+vt 0.776933 0.723998
+vt 0.785229 0.729863
+vt 0.776933 0.729831
+vt 0.776933 0.720370
+vt 0.785229 0.720404
+vt 0.776934 0.716484
+vt 0.785230 0.716519
+vt 0.793516 0.720439
+vt 0.793515 0.724066
+vt 0.801792 0.720475
+vt 0.801792 0.724101
+vt 0.793516 0.716554
+vt 0.801793 0.716591
+vt 0.793515 0.727272
+vt 0.793515 0.729896
+vt 0.801792 0.727306
+vt 0.801792 0.729930
+vt 0.818315 0.724170
+vt 0.818315 0.727374
+vt 0.810058 0.727341
+vt 0.810058 0.724136
+vt 0.818315 0.729997
+vt 0.810058 0.729964
+vt 0.810059 0.720511
+vt 0.818315 0.720546
+vt 0.810059 0.716627
+vt 0.818316 0.716663
+vt 0.826563 0.720580
+vt 0.826562 0.724203
+vt 0.834801 0.720612
+vt 0.834801 0.724235
+vt 0.826563 0.716697
+vt 0.834801 0.716730
+vt 0.826562 0.727407
+vt 0.826562 0.730029
+vt 0.834800 0.727438
+vt 0.834800 0.730059
+vt 0.851252 0.724290
+vt 0.851252 0.727492
+vt 0.843030 0.727466
+vt 0.843030 0.724264
+vt 0.851252 0.730113
+vt 0.843030 0.730087
+vt 0.843031 0.720642
+vt 0.851252 0.720669
+vt 0.843031 0.716760
+vt 0.851253 0.716788
+vt 0.859467 0.720692
+vt 0.859467 0.724314
+vt 0.867676 0.720712
+vt 0.867676 0.724333
+vt 0.859468 0.716812
+vt 0.867677 0.716833
+vt 0.859467 0.727515
+vt 0.859466 0.730135
+vt 0.867676 0.727534
+vt 0.867676 0.730154
+vt 0.884081 0.724362
+vt 0.884080 0.727562
+vt 0.875880 0.727550
+vt 0.875880 0.724349
+vt 0.884080 0.730181
+vt 0.875880 0.730169
+vt 0.875881 0.720728
+vt 0.884081 0.720741
+vt 0.875881 0.716849
+vt 0.884081 0.716862
+vt 0.892279 0.720752
+vt 0.892278 0.724373
+vt 0.900475 0.720762
+vt 0.900475 0.724382
+vt 0.892279 0.716873
+vt 0.900476 0.716883
+vt 0.892278 0.727573
+vt 0.892278 0.730192
+vt 0.900475 0.727582
+vt 0.900474 0.730201
+vt 0.122802 0.724364
+vt 0.122802 0.727564
+vt 0.114604 0.727574
+vt 0.114604 0.724374
+vt 0.106407 0.727582
+vt 0.106408 0.724382
+vt 0.122801 0.730184
+vt 0.114604 0.730193
+vt 0.106407 0.730201
+vt 0.114605 0.720753
+vt 0.122802 0.720744
+vt 0.114605 0.716874
+vt 0.122803 0.716864
+vt 0.106408 0.720762
+vt 0.106409 0.716883
+vt 0.131003 0.720732
+vt 0.131002 0.724352
+vt 0.139206 0.720717
+vt 0.139206 0.724338
+vt 0.131003 0.716852
+vt 0.139207 0.716837
+vt 0.131002 0.727553
+vt 0.131002 0.730173
+vt 0.139206 0.727539
+vt 0.139206 0.730159
+vt 0.155630 0.724297
+vt 0.155629 0.727499
+vt 0.147415 0.727521
+vt 0.147415 0.724319
+vt 0.155629 0.730119
+vt 0.147414 0.730141
+vt 0.147415 0.720698
+vt 0.155630 0.720675
+vt 0.147416 0.716818
+vt 0.155630 0.716794
+vt 0.163852 0.720649
+vt 0.163851 0.724272
+vt 0.172081 0.720621
+vt 0.172080 0.724244
+vt 0.163852 0.716768
+vt 0.172081 0.716739
+vt 0.163851 0.727474
+vt 0.163851 0.730095
+vt 0.172080 0.727446
+vt 0.172080 0.730068
+vt 0.188565 0.724181
+vt 0.188565 0.727385
+vt 0.180318 0.727417
+vt 0.180318 0.724213
+vt 0.188565 0.730008
+vt 0.180318 0.730039
+vt 0.180319 0.720589
+vt 0.188565 0.720556
+vt 0.180319 0.716707
+vt 0.188566 0.716673
+vt 0.196822 0.720522
+vt 0.196821 0.724147
+vt 0.205087 0.720487
+vt 0.205087 0.724113
+vt 0.196822 0.716639
+vt 0.205088 0.716603
+vt 0.196821 0.727352
+vt 0.196821 0.729975
+vt 0.205087 0.727319
+vt 0.205087 0.729942
+vt 0.221649 0.724045
+vt 0.221649 0.727252
+vt 0.213363 0.727285
+vt 0.213363 0.724079
+vt 0.221649 0.729877
+vt 0.213363 0.729909
+vt 0.213363 0.720453
+vt 0.221649 0.720418
+vt 0.213364 0.716568
+vt 0.221649 0.716533
+vt 0.229944 0.720385
+vt 0.229944 0.724013
+vt 0.238249 0.720353
+vt 0.238248 0.723982
+vt 0.229945 0.716499
+vt 0.238249 0.716467
+vt 0.229944 0.727220
+vt 0.229944 0.729846
+vt 0.238248 0.727190
+vt 0.238248 0.729816
+vt 0.254882 0.723927
+vt 0.254882 0.727136
+vt 0.246561 0.727162
+vt 0.246561 0.723953
+vt 0.254882 0.729763
+vt 0.246561 0.729788
+vt 0.246562 0.720324
+vt 0.254883 0.720298
+vt 0.246562 0.716437
+vt 0.254883 0.716410
+vt 0.263210 0.720274
+vt 0.263210 0.723904
+vt 0.271544 0.720254
+vt 0.271544 0.723885
+vt 0.263211 0.716386
+vt 0.271545 0.716366
+vt 0.263210 0.727114
+vt 0.263210 0.729741
+vt 0.271544 0.727095
+vt 0.271544 0.729723
+vt 0.288226 0.723858
+vt 0.288226 0.727069
+vt 0.279883 0.727080
+vt 0.279883 0.723870
+vt 0.288226 0.729697
+vt 0.279883 0.729708
+vt 0.279883 0.720239
+vt 0.288226 0.720228
+vt 0.279884 0.716350
+vt 0.288226 0.716339
+vt 0.296572 0.720221
+vt 0.296572 0.723852
+vt 0.304918 0.720218
+vt 0.304918 0.723849
+vt 0.296572 0.716331
+vt 0.304918 0.716329
+vt 0.296572 0.727062
+vt 0.296572 0.729691
+vt 0.304918 0.727060
+vt 0.304919 0.729688
+vt 0.321611 0.723858
+vt 0.321611 0.727069
+vt 0.313265 0.727062
+vt 0.313265 0.723852
+vt 0.321611 0.729697
+vt 0.313265 0.729691
+vt 0.313265 0.720221
+vt 0.321611 0.720227
+vt 0.313265 0.716331
+vt 0.321611 0.716338
+vt 0.329953 0.720239
+vt 0.329954 0.723869
+vt 0.329953 0.716350
+vt 0.329954 0.727080
+vt 0.329954 0.729708
+vt 0.354954 0.708328
+vt 0.354954 0.712426
+vt 0.346626 0.712402
+vt 0.346626 0.708304
+vt 0.338292 0.712381
+vt 0.338292 0.708283
+vt 0.346626 0.704075
+vt 0.354954 0.704099
+vt 0.346626 0.699697
+vt 0.354953 0.699722
+vt 0.338292 0.704054
+vt 0.338292 0.699677
+vt 0.363274 0.704127
+vt 0.363275 0.708356
+vt 0.371587 0.704158
+vt 0.371588 0.708386
+vt 0.363274 0.699750
+vt 0.371587 0.699781
+vt 0.363275 0.712453
+vt 0.371588 0.712483
+vt 0.388187 0.708454
+vt 0.388187 0.712550
+vt 0.379892 0.712516
+vt 0.379892 0.708419
+vt 0.379892 0.704191
+vt 0.388187 0.704226
+vt 0.379891 0.699814
+vt 0.388186 0.699849
+vt 0.396472 0.704262
+vt 0.396473 0.708490
+vt 0.404748 0.704299
+vt 0.404748 0.708526
+vt 0.396472 0.699885
+vt 0.404748 0.699922
+vt 0.396473 0.712586
+vt 0.404749 0.712622
+vt 0.421270 0.708598
+vt 0.421271 0.712693
+vt 0.413015 0.712658
+vt 0.413014 0.708563
+vt 0.413014 0.704335
+vt 0.421270 0.704371
+vt 0.413013 0.699958
+vt 0.421270 0.699994
+vt 0.429517 0.704406
+vt 0.429517 0.708633
+vt 0.437755 0.704439
+vt 0.437755 0.708665
+vt 0.429516 0.700029
+vt 0.437754 0.700062
+vt 0.429518 0.712727
+vt 0.437755 0.712760
+vt 0.454206 0.708723
+vt 0.454206 0.712816
+vt 0.445985 0.712789
+vt 0.445984 0.708695
+vt 0.445984 0.704469
+vt 0.454205 0.704496
+vt 0.445983 0.700092
+vt 0.454205 0.700119
+vt 0.462420 0.704520
+vt 0.462420 0.708746
+vt 0.470629 0.704540
+vt 0.470629 0.708766
+vt 0.462419 0.700143
+vt 0.470628 0.700163
+vt 0.462421 0.712839
+vt 0.470630 0.712859
+vt 0.487033 0.708793
+vt 0.487034 0.712886
+vt 0.478834 0.712875
+vt 0.478833 0.708782
+vt 0.478833 0.704556
+vt 0.487033 0.704567
+vt 0.478832 0.700179
+vt 0.487032 0.700190
+vt 0.495230 0.704574
+vt 0.495231 0.708799
+vt 0.503427 0.704575
+vt 0.503428 0.708801
+vt 0.495230 0.700197
+vt 0.503426 0.700199
+vt 0.495232 0.712892
+vt 0.503428 0.712894
+vt 0.519822 0.708791
+vt 0.519822 0.712883
+vt 0.511625 0.712891
+vt 0.511624 0.708798
+vt 0.511624 0.704572
+vt 0.519821 0.704565
+vt 0.511623 0.700196
+vt 0.519821 0.700188
+vt 0.528022 0.704552
+vt 0.528022 0.708778
+vt 0.536226 0.704535
+vt 0.536226 0.708762
+vt 0.528021 0.700176
+vt 0.536225 0.700159
+vt 0.528023 0.712871
+vt 0.536227 0.712855
+vt 0.552651 0.708716
+vt 0.552651 0.712809
+vt 0.544436 0.712834
+vt 0.544436 0.708741
+vt 0.544435 0.704515
+vt 0.552650 0.704490
+vt 0.544434 0.700138
+vt 0.552650 0.700113
+vt 0.560872 0.704461
+vt 0.560873 0.708688
+vt 0.569102 0.704430
+vt 0.569102 0.708657
+vt 0.560871 0.700084
+vt 0.569101 0.700053
+vt 0.560873 0.712782
+vt 0.569103 0.712751
+vt 0.585588 0.708588
+vt 0.585588 0.712683
+vt 0.577341 0.712718
+vt 0.577340 0.708623
+vt 0.577340 0.704396
+vt 0.585587 0.704361
+vt 0.577340 0.700019
+vt 0.585587 0.699984
+vt 0.593844 0.704324
+vt 0.593845 0.708551
+vt 0.602111 0.704286
+vt 0.602111 0.708514
+vt 0.593844 0.699947
+vt 0.602110 0.699909
+vt 0.593845 0.712646
+vt 0.602112 0.712610
+vt 0.618674 0.708440
+vt 0.618675 0.712536
+vt 0.610388 0.712573
+vt 0.610388 0.708477
+vt 0.610387 0.704249
+vt 0.618674 0.704212
+vt 0.610387 0.699872
+vt 0.618674 0.699835
+vt 0.626970 0.704177
+vt 0.626970 0.708405
+vt 0.635275 0.704143
+vt 0.635275 0.708371
+vt 0.626969 0.699799
+vt 0.635275 0.699765
+vt 0.626970 0.712501
+vt 0.635275 0.712468
+vt 0.651911 0.708312
+vt 0.651911 0.712409
+vt 0.643589 0.712437
+vt 0.643589 0.708340
+vt 0.643589 0.704111
+vt 0.651911 0.704083
+vt 0.643589 0.699734
+vt 0.651910 0.699706
+vt 0.660239 0.704058
+vt 0.660240 0.708287
+vt 0.668574 0.704037
+vt 0.668574 0.708266
+vt 0.660239 0.699681
+vt 0.668574 0.699660
+vt 0.660240 0.712385
+vt 0.668575 0.712364
+vt 0.685258 0.708238
+vt 0.685258 0.712336
+vt 0.676914 0.712348
+vt 0.676914 0.708250
+vt 0.676914 0.704021
+vt 0.685258 0.704009
+vt 0.676914 0.699643
+vt 0.685258 0.699631
+vt 0.693604 0.704001
+vt 0.693604 0.708230
+vt 0.701952 0.703999
+vt 0.701952 0.708228
+vt 0.693604 0.699624
+vt 0.701952 0.699621
+vt 0.693605 0.712329
+vt 0.701952 0.712326
+vt 0.718646 0.708238
+vt 0.718646 0.712336
+vt 0.710300 0.712329
+vt 0.710300 0.708230
+vt 0.710300 0.704001
+vt 0.718646 0.704009
+vt 0.710300 0.699624
+vt 0.718646 0.699631
+vt 0.726990 0.704021
+vt 0.726990 0.708250
+vt 0.735330 0.704037
+vt 0.735330 0.708266
+vt 0.726990 0.699643
+vt 0.735330 0.699660
+vt 0.726990 0.712348
+vt 0.735330 0.712364
+vt 0.751994 0.708312
+vt 0.751993 0.712410
+vt 0.743665 0.712385
+vt 0.743665 0.708287
+vt 0.743665 0.704058
+vt 0.751994 0.704083
+vt 0.743665 0.699681
+vt 0.751994 0.699706
+vt 0.760316 0.704112
+vt 0.760315 0.708340
+vt 0.768630 0.704143
+vt 0.768629 0.708371
+vt 0.760316 0.699734
+vt 0.768630 0.699766
+vt 0.760315 0.712438
+vt 0.768629 0.712468
+vt 0.785230 0.708440
+vt 0.785230 0.712537
+vt 0.776934 0.712502
+vt 0.776934 0.708405
+vt 0.776935 0.704177
+vt 0.785231 0.704212
+vt 0.776935 0.699799
+vt 0.785231 0.699835
+vt 0.793517 0.704249
+vt 0.793517 0.708477
+vt 0.801794 0.704287
+vt 0.801793 0.708514
+vt 0.793517 0.699872
+vt 0.801794 0.699909
+vt 0.793516 0.712573
+vt 0.801793 0.712610
+vt 0.818316 0.708588
+vt 0.818316 0.712683
+vt 0.810059 0.712647
+vt 0.810060 0.708551
+vt 0.810060 0.704324
+vt 0.818317 0.704361
+vt 0.810061 0.699947
+vt 0.818317 0.699984
+vt 0.826564 0.704396
+vt 0.826564 0.708623
+vt 0.834803 0.704430
+vt 0.834802 0.708657
+vt 0.826565 0.700019
+vt 0.834803 0.700053
+vt 0.826563 0.712718
+vt 0.834802 0.712751
+vt 0.851254 0.708716
+vt 0.851253 0.712810
+vt 0.843031 0.712782
+vt 0.843032 0.708688
+vt 0.843032 0.704461
+vt 0.851254 0.704490
+vt 0.843033 0.700085
+vt 0.851255 0.700113
+vt 0.859469 0.704515
+vt 0.859469 0.708741
+vt 0.867678 0.704536
+vt 0.867678 0.708762
+vt 0.859470 0.700138
+vt 0.867679 0.700159
+vt 0.859468 0.712834
+vt 0.867677 0.712855
+vt 0.884082 0.708792
+vt 0.884082 0.712885
+vt 0.875881 0.712871
+vt 0.875882 0.708779
+vt 0.875883 0.704553
+vt 0.884083 0.704566
+vt 0.875883 0.700176
+vt 0.884084 0.700189
+vt 0.892281 0.704578
+vt 0.892280 0.708803
+vt 0.900477 0.704588
+vt 0.900477 0.708814
+vt 0.892281 0.700201
+vt 0.900478 0.700211
+vt 0.892280 0.712896
+vt 0.900476 0.712906
+vt 0.122804 0.708794
+vt 0.122803 0.712887
+vt 0.114605 0.712897
+vt 0.114606 0.708805
+vt 0.106409 0.712906
+vt 0.106409 0.708814
+vt 0.114607 0.704579
+vt 0.122804 0.704568
+vt 0.114607 0.700202
+vt 0.122805 0.700192
+vt 0.106410 0.704588
+vt 0.106411 0.700211
+vt 0.131004 0.704556
+vt 0.131004 0.708782
+vt 0.139208 0.704540
+vt 0.139208 0.708766
+vt 0.131005 0.700179
+vt 0.139209 0.700163
+vt 0.131003 0.712875
+vt 0.139207 0.712859
+vt 0.155631 0.708723
+vt 0.155631 0.712816
+vt 0.147416 0.712840
+vt 0.147417 0.708746
+vt 0.147417 0.704520
+vt 0.155632 0.704496
+vt 0.147418 0.700143
+vt 0.155632 0.700119
+vt 0.163853 0.704469
+vt 0.163853 0.708696
+vt 0.172082 0.704439
+vt 0.172082 0.708666
+vt 0.163854 0.700092
+vt 0.172083 0.700062
+vt 0.163852 0.712789
+vt 0.172081 0.712760
+vt 0.188567 0.708599
+vt 0.188566 0.712694
+vt 0.180319 0.712728
+vt 0.180320 0.708633
+vt 0.180320 0.704406
+vt 0.188567 0.704372
+vt 0.180321 0.700029
+vt 0.188567 0.699995
+vt 0.196823 0.704336
+vt 0.196823 0.708563
+vt 0.205089 0.704299
+vt 0.205088 0.708527
+vt 0.196824 0.699959
+vt 0.205089 0.699922
+vt 0.196822 0.712658
+vt 0.205088 0.712622
+vt 0.221650 0.708454
+vt 0.221650 0.712550
+vt 0.213364 0.712586
+vt 0.213364 0.708490
+vt 0.213365 0.704262
+vt 0.221650 0.704226
+vt 0.213365 0.699885
+vt 0.221651 0.699849
+vt 0.229945 0.704191
+vt 0.229945 0.708419
+vt 0.238250 0.704158
+vt 0.238249 0.708386
+vt 0.229946 0.699814
+vt 0.238250 0.699781
+vt 0.229945 0.712516
+vt 0.238249 0.712484
+vt 0.254883 0.708328
+vt 0.254883 0.712426
+vt 0.246562 0.712453
+vt 0.246562 0.708356
+vt 0.246563 0.704127
+vt 0.254883 0.704099
+vt 0.246563 0.699750
+vt 0.254884 0.699722
+vt 0.263211 0.704075
+vt 0.263211 0.708304
+vt 0.271545 0.704054
+vt 0.271545 0.708283
+vt 0.263211 0.699697
+vt 0.271545 0.699677
+vt 0.263211 0.712402
+vt 0.271545 0.712381
+vt 0.288227 0.708255
+vt 0.288226 0.712354
+vt 0.279884 0.712365
+vt 0.279884 0.708267
+vt 0.279884 0.704038
+vt 0.288227 0.704026
+vt 0.279884 0.699660
+vt 0.288227 0.699649
+vt 0.296572 0.704019
+vt 0.296572 0.708248
+vt 0.304918 0.704016
+vt 0.304918 0.708245
+vt 0.296572 0.699641
+vt 0.304918 0.699639
+vt 0.296572 0.712346
+vt 0.304918 0.712344
+vt 0.321610 0.708255
+vt 0.321610 0.712353
+vt 0.313265 0.712346
+vt 0.313265 0.708248
+vt 0.313265 0.704019
+vt 0.321610 0.704026
+vt 0.313265 0.699641
+vt 0.321610 0.699648
+vt 0.329953 0.704038
+vt 0.329953 0.708267
+vt 0.329953 0.699660
+vt 0.329953 0.712365
+vt 0.354946 0.690793
+vt 0.363266 0.690820
+vt 0.363274 0.695206
+vt 0.354953 0.695178
+vt 0.371579 0.690850
+vt 0.371587 0.695237
+vt 0.346625 0.695154
+vt 0.346620 0.690769
+vt 0.338292 0.695133
+vt 0.338287 0.690749
+vt 0.346603 0.686867
+vt 0.354927 0.686890
+vt 0.346570 0.683773
+vt 0.354888 0.683793
+vt 0.338273 0.686848
+vt 0.338246 0.683756
+vt 0.363245 0.686915
+vt 0.371555 0.686944
+vt 0.363201 0.683816
+vt 0.371508 0.683841
+vt 0.388177 0.690917
+vt 0.396462 0.690952
+vt 0.396471 0.695341
+vt 0.388186 0.695305
+vt 0.404738 0.690988
+vt 0.404747 0.695377
+vt 0.379891 0.695270
+vt 0.379882 0.690882
+vt 0.379857 0.686974
+vt 0.388150 0.687007
+vt 0.379806 0.683868
+vt 0.388097 0.683897
+vt 0.396435 0.687040
+vt 0.404710 0.687074
+vt 0.396381 0.683927
+vt 0.404656 0.683957
+vt 0.421260 0.691058
+vt 0.429507 0.691092
+vt 0.429516 0.695484
+vt 0.421269 0.695450
+vt 0.437745 0.691124
+vt 0.437753 0.695517
+vt 0.413013 0.695414
+vt 0.413003 0.691023
+vt 0.412976 0.687107
+vt 0.421233 0.687141
+vt 0.412922 0.683987
+vt 0.421181 0.684017
+vt 0.429481 0.687173
+vt 0.437721 0.687203
+vt 0.429431 0.684045
+vt 0.437674 0.684072
+vt 0.454197 0.691180
+vt 0.462412 0.691203
+vt 0.462419 0.695598
+vt 0.454204 0.695574
+vt 0.470622 0.691223
+vt 0.470627 0.695618
+vt 0.445983 0.695547
+vt 0.445975 0.691154
+vt 0.445953 0.687231
+vt 0.454177 0.687256
+vt 0.445910 0.684097
+vt 0.454139 0.684120
+vt 0.462395 0.687278
+vt 0.470608 0.687296
+vt 0.462362 0.684140
+vt 0.470581 0.684156
+vt 0.487028 0.691249
+vt 0.495227 0.691256
+vt 0.495229 0.695652
+vt 0.487031 0.695645
+vt 0.503425 0.691258
+vt 0.503426 0.695653
+vt 0.478831 0.695634
+vt 0.478827 0.691238
+vt 0.478816 0.687311
+vt 0.487021 0.687321
+vt 0.478795 0.684169
+vt 0.487006 0.684178
+vt 0.495223 0.687327
+vt 0.503424 0.687329
+vt 0.495216 0.684184
+vt 0.503424 0.684185
+vt 0.519822 0.691247
+vt 0.528023 0.691235
+vt 0.528021 0.695630
+vt 0.519820 0.695643
+vt 0.536229 0.691218
+vt 0.536225 0.695614
+vt 0.511622 0.695650
+vt 0.511623 0.691255
+vt 0.511626 0.687326
+vt 0.519828 0.687319
+vt 0.511632 0.684183
+vt 0.519842 0.684176
+vt 0.528033 0.687307
+vt 0.536241 0.687292
+vt 0.528053 0.684166
+vt 0.536268 0.684152
+vt 0.552655 0.691174
+vt 0.560877 0.691146
+vt 0.560871 0.695539
+vt 0.552649 0.695568
+vt 0.569108 0.691116
+vt 0.569101 0.695508
+vt 0.544434 0.695593
+vt 0.544439 0.691198
+vt 0.544454 0.687272
+vt 0.552673 0.687250
+vt 0.544487 0.684135
+vt 0.552711 0.684114
+vt 0.560898 0.687223
+vt 0.569131 0.687195
+vt 0.560941 0.684091
+vt 0.569177 0.684065
+vt 0.585595 0.691048
+vt 0.593852 0.691012
+vt 0.593843 0.695402
+vt 0.585586 0.695439
+vt 0.602118 0.690975
+vt 0.602110 0.695365
+vt 0.577339 0.695475
+vt 0.577347 0.691083
+vt 0.577371 0.687163
+vt 0.585620 0.687131
+vt 0.577421 0.684037
+vt 0.585672 0.684008
+vt 0.593878 0.687097
+vt 0.602145 0.687062
+vt 0.593931 0.683978
+vt 0.602199 0.683947
+vt 0.618681 0.690903
+vt 0.626977 0.690868
+vt 0.626969 0.695255
+vt 0.618673 0.695291
+vt 0.635282 0.690835
+vt 0.635274 0.695222
+vt 0.610387 0.695328
+vt 0.610395 0.690939
+vt 0.610422 0.687027
+vt 0.618707 0.686993
+vt 0.610475 0.683916
+vt 0.618759 0.683885
+vt 0.627002 0.686961
+vt 0.635305 0.686929
+vt 0.627052 0.683856
+vt 0.635352 0.683828
+vt 0.651916 0.690777
+vt 0.660244 0.690753
+vt 0.660239 0.695137
+vt 0.651910 0.695162
+vt 0.668578 0.690732
+vt 0.668574 0.695116
+vt 0.643588 0.695190
+vt 0.643595 0.690805
+vt 0.643616 0.686901
+vt 0.651935 0.686875
+vt 0.643659 0.683802
+vt 0.651973 0.683779
+vt 0.660261 0.686852
+vt 0.668592 0.686832
+vt 0.660293 0.683758
+vt 0.668619 0.683741
+vt 0.685260 0.690704
+vt 0.693606 0.690697
+vt 0.693604 0.695080
+vt 0.685258 0.695088
+vt 0.701952 0.690695
+vt 0.701952 0.695078
+vt 0.676914 0.695100
+vt 0.676917 0.690716
+vt 0.676928 0.686817
+vt 0.685267 0.686806
+vt 0.676948 0.683728
+vt 0.685281 0.683718
+vt 0.693609 0.686799
+vt 0.701952 0.686797
+vt 0.693616 0.683712
+vt 0.701952 0.683709
+vt 0.718644 0.690704
+vt 0.726987 0.690716
+vt 0.726990 0.695100
+vt 0.718647 0.695088
+vt 0.735326 0.690732
+vt 0.735330 0.695117
+vt 0.710300 0.695080
+vt 0.710299 0.690697
+vt 0.710295 0.686799
+vt 0.718637 0.686806
+vt 0.710288 0.683711
+vt 0.718623 0.683718
+vt 0.726977 0.686817
+vt 0.735313 0.686832
+vt 0.726956 0.683728
+vt 0.735286 0.683741
+vt 0.751988 0.690777
+vt 0.760309 0.690805
+vt 0.760316 0.695191
+vt 0.751994 0.695162
+vt 0.768623 0.690835
+vt 0.768630 0.695222
+vt 0.743665 0.695137
+vt 0.743660 0.690753
+vt 0.743644 0.686852
+vt 0.751969 0.686875
+vt 0.743611 0.683759
+vt 0.751931 0.683779
+vt 0.760288 0.686901
+vt 0.768600 0.686930
+vt 0.760245 0.683802
+vt 0.768553 0.683828
+vt 0.785223 0.690903
+vt 0.793509 0.690939
+vt 0.793518 0.695328
+vt 0.785231 0.695291
+vt 0.801786 0.690975
+vt 0.801795 0.695365
+vt 0.776935 0.695255
+vt 0.776927 0.690868
+vt 0.776903 0.686961
+vt 0.785197 0.686994
+vt 0.776853 0.683856
+vt 0.785145 0.683886
+vt 0.793483 0.687028
+vt 0.801759 0.687062
+vt 0.793430 0.683916
+vt 0.801706 0.683947
+vt 0.818310 0.691048
+vt 0.826558 0.691083
+vt 0.826565 0.695475
+vt 0.818318 0.695439
+vt 0.834797 0.691116
+vt 0.834804 0.695508
+vt 0.810061 0.695403
+vt 0.810053 0.691012
+vt 0.810026 0.687097
+vt 0.818284 0.687131
+vt 0.809973 0.683978
+vt 0.818232 0.684008
+vt 0.826533 0.687164
+vt 0.834774 0.687195
+vt 0.826484 0.684037
+vt 0.834728 0.684065
+vt 0.851250 0.691174
+vt 0.859466 0.691198
+vt 0.859470 0.695593
+vt 0.851255 0.695568
+vt 0.867676 0.691219
+vt 0.867680 0.695614
+vt 0.843034 0.695540
+vt 0.843027 0.691146
+vt 0.843006 0.687223
+vt 0.851231 0.687250
+vt 0.842964 0.684091
+vt 0.851194 0.684114
+vt 0.859450 0.687273
+vt 0.867663 0.687292
+vt 0.859418 0.684135
+vt 0.867637 0.684152
+vt 0.884083 0.691248
+vt 0.892282 0.691260
+vt 0.892282 0.695656
+vt 0.884084 0.695644
+vt 0.900479 0.691270
+vt 0.900479 0.695666
+vt 0.875884 0.695631
+vt 0.875881 0.691235
+vt 0.875871 0.687308
+vt 0.884076 0.687320
+vt 0.875851 0.684166
+vt 0.884063 0.684178
+vt 0.892279 0.687331
+vt 0.900480 0.687340
+vt 0.892272 0.684187
+vt 0.900481 0.684196
+vt 0.122809 0.691251
+vt 0.131010 0.691238
+vt 0.131006 0.695634
+vt 0.122806 0.695646
+vt 0.139215 0.691223
+vt 0.139210 0.695618
+vt 0.114608 0.695657
+vt 0.114610 0.691261
+vt 0.106411 0.695666
+vt 0.106412 0.691270
+vt 0.114614 0.687332
+vt 0.122816 0.687322
+vt 0.114621 0.684188
+vt 0.122831 0.684179
+vt 0.106413 0.687340
+vt 0.106413 0.684196
+vt 0.131021 0.687311
+vt 0.139229 0.687296
+vt 0.131042 0.684169
+vt 0.139256 0.684156
+vt 0.155640 0.691180
+vt 0.163862 0.691154
+vt 0.163854 0.695547
+vt 0.155633 0.695575
+vt 0.172092 0.691124
+vt 0.172083 0.695517
+vt 0.147418 0.695598
+vt 0.147424 0.691204
+vt 0.147442 0.687278
+vt 0.155660 0.687256
+vt 0.147475 0.684140
+vt 0.155698 0.684120
+vt 0.163884 0.687231
+vt 0.172116 0.687203
+vt 0.163927 0.684098
+vt 0.172163 0.684073
+vt 0.188577 0.691059
+vt 0.196833 0.691023
+vt 0.196824 0.695414
+vt 0.188568 0.695450
+vt 0.205099 0.690988
+vt 0.205090 0.695378
+vt 0.180321 0.695485
+vt 0.180330 0.691092
+vt 0.180356 0.687173
+vt 0.188604 0.687141
+vt 0.180406 0.684046
+vt 0.188656 0.684017
+vt 0.196861 0.687108
+vt 0.205127 0.687074
+vt 0.196915 0.683987
+vt 0.205181 0.683957
+vt 0.221660 0.690917
+vt 0.229955 0.690883
+vt 0.229946 0.695270
+vt 0.221651 0.695305
+vt 0.238258 0.690850
+vt 0.238250 0.695237
+vt 0.213366 0.695341
+vt 0.213375 0.690952
+vt 0.213402 0.687040
+vt 0.221687 0.687007
+vt 0.213456 0.683927
+vt 0.221739 0.683897
+vt 0.229980 0.686974
+vt 0.238282 0.686944
+vt 0.230031 0.683868
+vt 0.238329 0.683841
+vt 0.254890 0.690793
+vt 0.263217 0.690769
+vt 0.263211 0.695154
+vt 0.254884 0.695179
+vt 0.271550 0.690749
+vt 0.271545 0.695133
+vt 0.246563 0.695206
+vt 0.246571 0.690820
+vt 0.246592 0.686915
+vt 0.254910 0.686890
+vt 0.246636 0.683816
+vt 0.254948 0.683793
+vt 0.263234 0.686867
+vt 0.271564 0.686848
+vt 0.263267 0.683773
+vt 0.271591 0.683756
+vt 0.288229 0.690721
+vt 0.296573 0.690714
+vt 0.296572 0.695098
+vt 0.288227 0.695105
+vt 0.304918 0.690712
+vt 0.304918 0.695096
+vt 0.279884 0.695117
+vt 0.279888 0.690733
+vt 0.279898 0.686833
+vt 0.288236 0.686822
+vt 0.279919 0.683742
+vt 0.288250 0.683732
+vt 0.296577 0.686815
+vt 0.304918 0.686813
+vt 0.296584 0.683726
+vt 0.304918 0.683724
+vt 0.321608 0.690721
+vt 0.329949 0.690733
+vt 0.329953 0.695117
+vt 0.321610 0.695105
+vt 0.313265 0.695098
+vt 0.313264 0.690714
+vt 0.313260 0.686815
+vt 0.321601 0.686822
+vt 0.313253 0.683726
+vt 0.321586 0.683732
+vt 0.329939 0.686833
+vt 0.329918 0.683742
+vt 0.280313 0.995387
+vt 0.270017 0.994684
+vt 0.274772 0.994048
+vt 0.283629 0.994684
+vt 0.278167 0.992802
+vt 0.286117 0.993306
+vt 0.262174 0.993303
+vt 0.268223 0.992800
+vt 0.272730 0.992126
+vt 0.293921 0.994901
+vt 0.292219 0.995630
+vt 0.304930 0.994906
+vt 0.304930 0.995637
+vt 0.295232 0.993477
+vt 0.304929 0.993479
+vt 0.290259 0.995895
+vt 0.276509 0.995638
+vt 0.304930 0.995905
+vt 0.264601 0.994907
+vt 0.255458 0.993474
+vt 0.258859 0.994923
+vt 0.248414 0.993481
+vt 0.321611 0.733092
+vt 0.321611 0.734604
+vt 0.313265 0.734597
+vt 0.313265 0.733086
+vt 0.304919 0.734595
+vt 0.304919 0.733084
+vt 0.313265 0.731574
+vt 0.321611 0.731581
+vt 0.304919 0.731572
+vt 0.329954 0.731591
+vt 0.329954 0.733103
+vt 0.338293 0.731606
+vt 0.338293 0.733117
+vt 0.329954 0.734614
+vt 0.338293 0.734628
+vt 0.288226 0.733092
+vt 0.288226 0.734604
+vt 0.279883 0.734614
+vt 0.279883 0.733103
+vt 0.271544 0.734628
+vt 0.271544 0.733117
+vt 0.279883 0.731591
+vt 0.288226 0.731581
+vt 0.271544 0.731606
+vt 0.296572 0.731574
+vt 0.296572 0.733086
+vt 0.296572 0.734597
+vt 0.254882 0.733157
+vt 0.254882 0.734667
+vt 0.246561 0.734691
+vt 0.246561 0.733181
+vt 0.238248 0.734718
+vt 0.238248 0.733208
+vt 0.246561 0.731671
+vt 0.254882 0.731646
+vt 0.238248 0.731698
+vt 0.263210 0.731624
+vt 0.263210 0.733135
+vt 0.263210 0.734646
+vt 0.221648 0.733267
+vt 0.221648 0.734776
+vt 0.213363 0.734807
+vt 0.213363 0.733299
+vt 0.205086 0.734839
+vt 0.205087 0.733331
+vt 0.213363 0.731790
+vt 0.221648 0.731758
+vt 0.205087 0.731823
+vt 0.229944 0.731727
+vt 0.229944 0.733237
+vt 0.229944 0.734746
+vt 0.188564 0.733395
+vt 0.188564 0.734901
+vt 0.180317 0.734931
+vt 0.180317 0.733425
+vt 0.172079 0.734959
+vt 0.172080 0.733453
+vt 0.180318 0.731918
+vt 0.188565 0.731887
+vt 0.172080 0.731947
+vt 0.196821 0.731855
+vt 0.196821 0.733363
+vt 0.196821 0.734870
+vt 0.155629 0.733503
+vt 0.155629 0.735008
+vt 0.147414 0.735029
+vt 0.147414 0.733524
+vt 0.139205 0.735046
+vt 0.139205 0.733541
+vt 0.147414 0.732018
+vt 0.155629 0.731997
+vt 0.139205 0.732036
+vt 0.163850 0.731973
+vt 0.163850 0.733480
+vt 0.163850 0.734985
+vt 0.122801 0.733566
+vt 0.122801 0.735070
+vt 0.114603 0.735079
+vt 0.114603 0.733575
+vt 0.106407 0.735087
+vt 0.106407 0.733583
+vt 0.114603 0.732070
+vt 0.122801 0.732061
+vt 0.106407 0.732078
+vt 0.131001 0.732050
+vt 0.131001 0.733555
+vt 0.131001 0.735059
+vt 0.884080 0.733564
+vt 0.884079 0.735068
+vt 0.875879 0.735056
+vt 0.875879 0.733552
+vt 0.867675 0.735042
+vt 0.867675 0.733537
+vt 0.875879 0.732046
+vt 0.884080 0.732058
+vt 0.867675 0.732031
+vt 0.892278 0.732069
+vt 0.892277 0.733574
+vt 0.900474 0.732078
+vt 0.900474 0.733583
+vt 0.892277 0.735078
+vt 0.900474 0.735087
+vt 0.851251 0.733497
+vt 0.843029 0.733472
+vt 0.843029 0.731965
+vt 0.851251 0.731991
+vt 0.834800 0.733445
+vt 0.834800 0.731938
+vt 0.859466 0.732013
+vt 0.859466 0.733518
+vt 0.859466 0.735023
+vt 0.851251 0.735002
+vt 0.843029 0.734977
+vt 0.834800 0.734951
+vt 0.818314 0.733384
+vt 0.818314 0.734891
+vt 0.810058 0.734859
+vt 0.810058 0.733352
+vt 0.801791 0.734827
+vt 0.801791 0.733319
+vt 0.810058 0.731844
+vt 0.818314 0.731876
+vt 0.801791 0.731810
+vt 0.826562 0.731908
+vt 0.826562 0.733415
+vt 0.826561 0.734921
+vt 0.785228 0.733254
+vt 0.785228 0.734762
+vt 0.776933 0.734732
+vt 0.776933 0.733222
+vt 0.768628 0.734702
+vt 0.768628 0.733193
+vt 0.776933 0.731713
+vt 0.785229 0.731744
+vt 0.768628 0.731683
+vt 0.793515 0.731777
+vt 0.793515 0.733286
+vt 0.793515 0.734794
+vt 0.751992 0.733140
+vt 0.751992 0.734651
+vt 0.743664 0.734629
+vt 0.743664 0.733118
+vt 0.735329 0.734611
+vt 0.735329 0.733100
+vt 0.743664 0.731608
+vt 0.751993 0.731630
+vt 0.735329 0.731589
+vt 0.760314 0.731655
+vt 0.760314 0.733165
+vt 0.760314 0.734675
+vt 0.718646 0.733075
+vt 0.718646 0.734586
+vt 0.710300 0.734580
+vt 0.710300 0.733068
+vt 0.701952 0.734578
+vt 0.701952 0.733066
+vt 0.710300 0.731557
+vt 0.718646 0.731563
+vt 0.701952 0.731555
+vt 0.726989 0.731574
+vt 0.726989 0.733085
+vt 0.726989 0.734597
+vt 0.685259 0.733075
+vt 0.685259 0.734586
+vt 0.676915 0.734597
+vt 0.676915 0.733085
+vt 0.668575 0.734611
+vt 0.668575 0.733100
+vt 0.676915 0.731574
+vt 0.685259 0.731563
+vt 0.668575 0.731589
+vt 0.693605 0.731557
+vt 0.693605 0.733068
+vt 0.693605 0.734580
+vt 0.651912 0.733140
+vt 0.651912 0.734651
+vt 0.643590 0.734675
+vt 0.643590 0.733165
+vt 0.635277 0.734702
+vt 0.635277 0.733193
+vt 0.643590 0.731655
+vt 0.651912 0.731630
+vt 0.635276 0.731683
+vt 0.660240 0.731608
+vt 0.660240 0.733118
+vt 0.660241 0.734629
+vt 0.618676 0.733253
+vt 0.618676 0.734762
+vt 0.610390 0.734794
+vt 0.610390 0.733286
+vt 0.602113 0.734826
+vt 0.602113 0.733319
+vt 0.610389 0.731777
+vt 0.618676 0.731744
+vt 0.602113 0.731810
+vt 0.626972 0.731713
+vt 0.626972 0.733222
+vt 0.626972 0.734731
+vt 0.585590 0.733384
+vt 0.585590 0.734890
+vt 0.577343 0.734921
+vt 0.577343 0.733415
+vt 0.569105 0.734950
+vt 0.569104 0.733444
+vt 0.577343 0.731908
+vt 0.585590 0.731876
+vt 0.569104 0.731938
+vt 0.593847 0.731843
+vt 0.593847 0.733351
+vt 0.593847 0.734859
+vt 0.552653 0.733496
+vt 0.552653 0.735002
+vt 0.544438 0.735023
+vt 0.544438 0.733518
+vt 0.536229 0.735041
+vt 0.536229 0.733537
+vt 0.544438 0.732012
+vt 0.552653 0.731990
+vt 0.536229 0.732031
+vt 0.560875 0.731965
+vt 0.560875 0.733472
+vt 0.560875 0.734977
+vt 0.519825 0.733562
+vt 0.519825 0.735067
+vt 0.511627 0.735073
+vt 0.511627 0.733569
+vt 0.503430 0.735076
+vt 0.503430 0.733572
+vt 0.511627 0.732064
+vt 0.519825 0.732057
+vt 0.503430 0.732067
+vt 0.528025 0.732046
+vt 0.528025 0.733552
+vt 0.528025 0.735056
+vt 0.487036 0.733565
+vt 0.487036 0.735069
+vt 0.478836 0.735059
+vt 0.478836 0.733555
+vt 0.470632 0.735046
+vt 0.470632 0.733541
+vt 0.478836 0.732049
+vt 0.487036 0.732059
+vt 0.470632 0.732036
+vt 0.495234 0.732065
+vt 0.495234 0.733570
+vt 0.495234 0.735075
+vt 0.454208 0.733503
+vt 0.454208 0.735008
+vt 0.445987 0.734985
+vt 0.445987 0.733479
+vt 0.437758 0.734959
+vt 0.437757 0.733453
+vt 0.445987 0.731973
+vt 0.454208 0.731997
+vt 0.437757 0.731946
+vt 0.462423 0.732018
+vt 0.462423 0.733524
+vt 0.462423 0.735029
+vt 0.421273 0.733394
+vt 0.421273 0.734901
+vt 0.413016 0.734870
+vt 0.413016 0.733363
+vt 0.404750 0.734839
+vt 0.404750 0.733331
+vt 0.413016 0.731855
+vt 0.421273 0.731887
+vt 0.404750 0.731823
+vt 0.429519 0.731917
+vt 0.429520 0.733425
+vt 0.429520 0.734931
+vt 0.388189 0.733267
+vt 0.388189 0.734776
+vt 0.379893 0.734746
+vt 0.379893 0.733237
+vt 0.371589 0.734717
+vt 0.371589 0.733208
+vt 0.379893 0.731727
+vt 0.388189 0.731758
+vt 0.371589 0.731698
+vt 0.396474 0.731790
+vt 0.396474 0.733299
+vt 0.396474 0.734807
+vt 0.354955 0.733157
+vt 0.354955 0.734667
+vt 0.346627 0.734646
+vt 0.346627 0.733135
+vt 0.346627 0.731624
+vt 0.354955 0.731646
+vt 0.363276 0.731671
+vt 0.363276 0.733181
+vt 0.363276 0.734691
+vt 0.354572 0.354280
+vt 0.346297 0.354280
+vt 0.346309 0.350223
+vt 0.354587 0.350223
+vt 0.346332 0.346237
+vt 0.354614 0.346238
+vt 0.338021 0.354280
+vt 0.338032 0.350222
+vt 0.338050 0.346237
+vt 0.362864 0.350223
+vt 0.362847 0.354280
+vt 0.371141 0.350223
+vt 0.371122 0.354281
+vt 0.362895 0.346238
+vt 0.371176 0.346238
+vt 0.362839 0.358385
+vt 0.354565 0.358385
+vt 0.362836 0.362514
+vt 0.354562 0.362514
+vt 0.371113 0.358386
+vt 0.371110 0.362515
+vt 0.346291 0.358385
+vt 0.338016 0.358385
+vt 0.346289 0.362514
+vt 0.338015 0.362514
+vt 0.387671 0.354281
+vt 0.379397 0.354281
+vt 0.379418 0.350224
+vt 0.387695 0.350224
+vt 0.379457 0.346238
+vt 0.387737 0.346239
+vt 0.395971 0.350224
+vt 0.395946 0.354282
+vt 0.404247 0.350225
+vt 0.404220 0.354282
+vt 0.396017 0.346239
+vt 0.404296 0.346240
+vt 0.395934 0.358387
+vt 0.387661 0.358386
+vt 0.395930 0.362516
+vt 0.387657 0.362515
+vt 0.404208 0.358387
+vt 0.404203 0.362516
+vt 0.379387 0.358386
+vt 0.379383 0.362515
+vt 0.420768 0.354283
+vt 0.412494 0.354282
+vt 0.412523 0.350225
+vt 0.420799 0.350226
+vt 0.412575 0.346240
+vt 0.420853 0.346241
+vt 0.429074 0.350226
+vt 0.429042 0.354283
+vt 0.437349 0.350227
+vt 0.437316 0.354284
+vt 0.429131 0.346241
+vt 0.437408 0.346242
+vt 0.429028 0.358388
+vt 0.420755 0.358388
+vt 0.429022 0.362517
+vt 0.420749 0.362517
+vt 0.437301 0.358389
+vt 0.437295 0.362518
+vt 0.412481 0.358388
+vt 0.412476 0.362517
+vt 0.453862 0.354285
+vt 0.445589 0.354284
+vt 0.445623 0.350227
+vt 0.453897 0.350228
+vt 0.445684 0.346242
+vt 0.453960 0.346243
+vt 0.462171 0.350228
+vt 0.462135 0.354285
+vt 0.470444 0.350229
+vt 0.470408 0.354286
+vt 0.462235 0.346243
+vt 0.470510 0.346244
+vt 0.462119 0.358391
+vt 0.453846 0.358390
+vt 0.462112 0.362520
+vt 0.453840 0.362519
+vt 0.470391 0.358391
+vt 0.470385 0.362520
+vt 0.445573 0.358389
+vt 0.445568 0.362519
+vt 0.486952 0.354287
+vt 0.478680 0.354287
+vt 0.478717 0.350229
+vt 0.486990 0.350230
+vt 0.478783 0.346244
+vt 0.487056 0.346245
+vt 0.495262 0.350231
+vt 0.495224 0.354288
+vt 0.503533 0.350231
+vt 0.503496 0.354288
+vt 0.495329 0.346245
+vt 0.503601 0.346246
+vt 0.495207 0.358393
+vt 0.486935 0.358392
+vt 0.495200 0.362522
+vt 0.486929 0.362521
+vt 0.503478 0.358393
+vt 0.503472 0.362522
+vt 0.478663 0.358392
+vt 0.478657 0.362521
+vt 0.520038 0.354289
+vt 0.511767 0.354289
+vt 0.511804 0.350232
+vt 0.520075 0.350232
+vt 0.511872 0.346246
+vt 0.520142 0.346247
+vt 0.528346 0.350233
+vt 0.528309 0.354290
+vt 0.536616 0.350233
+vt 0.536579 0.354291
+vt 0.528411 0.346248
+vt 0.536680 0.346248
+vt 0.528292 0.358395
+vt 0.520021 0.358395
+vt 0.528286 0.362524
+vt 0.520015 0.362524
+vt 0.536563 0.358396
+vt 0.536557 0.362525
+vt 0.511750 0.358394
+vt 0.511743 0.362523
+vt 0.553120 0.354292
+vt 0.544850 0.354291
+vt 0.544885 0.350234
+vt 0.553154 0.350235
+vt 0.544948 0.346249
+vt 0.553216 0.346249
+vt 0.561423 0.350235
+vt 0.561390 0.354292
+vt 0.569691 0.350236
+vt 0.569659 0.354293
+vt 0.561483 0.346250
+vt 0.569749 0.346250
+vt 0.561374 0.358397
+vt 0.553104 0.358397
+vt 0.561369 0.362526
+vt 0.553098 0.362526
+vt 0.569645 0.358398
+vt 0.569639 0.362527
+vt 0.544834 0.358396
+vt 0.544827 0.362525
+vt 0.586198 0.354294
+vt 0.577929 0.354293
+vt 0.577960 0.350236
+vt 0.586227 0.350236
+vt 0.578015 0.346251
+vt 0.586280 0.346251
+vt 0.594495 0.350237
+vt 0.594467 0.354294
+vt 0.602762 0.350237
+vt 0.602736 0.354294
+vt 0.594544 0.346252
+vt 0.602808 0.346252
+vt 0.594454 0.358399
+vt 0.586184 0.358399
+vt 0.594449 0.362528
+vt 0.586179 0.362528
+vt 0.602724 0.358400
+vt 0.602719 0.362529
+vt 0.577915 0.358398
+vt 0.577909 0.362527
+vt 0.619273 0.354295
+vt 0.611004 0.354295
+vt 0.611028 0.350238
+vt 0.619295 0.350238
+vt 0.611072 0.346253
+vt 0.619335 0.346253
+vt 0.627561 0.350238
+vt 0.627541 0.354296
+vt 0.635827 0.350239
+vt 0.635809 0.354296
+vt 0.627598 0.346253
+vt 0.635860 0.346254
+vt 0.627532 0.358401
+vt 0.619262 0.358400
+vt 0.627528 0.362530
+vt 0.619259 0.362529
+vt 0.635801 0.358401
+vt 0.635798 0.362530
+vt 0.610993 0.358400
+vt 0.610989 0.362529
+vt 0.652345 0.354296
+vt 0.644077 0.354296
+vt 0.644093 0.350239
+vt 0.652359 0.350239
+vt 0.644122 0.346254
+vt 0.652384 0.346254
+vt 0.660624 0.350239
+vt 0.660613 0.354297
+vt 0.668890 0.350240
+vt 0.668881 0.354297
+vt 0.660645 0.346254
+vt 0.668906 0.346254
+vt 0.660608 0.358402
+vt 0.652339 0.358401
+vt 0.660606 0.362531
+vt 0.652336 0.362530
+vt 0.668877 0.358402
+vt 0.668875 0.362531
+vt 0.644070 0.358401
+vt 0.644067 0.362530
+vt 0.685416 0.354297
+vt 0.677148 0.354297
+vt 0.677155 0.350240
+vt 0.685420 0.350240
+vt 0.677167 0.346255
+vt 0.685428 0.346255
+vt 0.693686 0.350240
+vt 0.693684 0.354297
+vt 0.701951 0.350240
+vt 0.701951 0.354297
+vt 0.693689 0.346255
+vt 0.701950 0.346255
+vt 0.693683 0.358402
+vt 0.685414 0.358402
+vt 0.693682 0.362531
+vt 0.685413 0.362531
+vt 0.701952 0.358402
+vt 0.701952 0.362531
+vt 0.677145 0.358402
+vt 0.677144 0.362531
+vt 0.718486 0.354297
+vt 0.710219 0.354297
+vt 0.710216 0.350240
+vt 0.718481 0.350240
+vt 0.710210 0.346255
+vt 0.718471 0.346255
+vt 0.726746 0.350240
+vt 0.726754 0.354297
+vt 0.735012 0.350240
+vt 0.735022 0.354297
+vt 0.726732 0.346254
+vt 0.734993 0.346254
+vt 0.726758 0.358402
+vt 0.718489 0.358402
+vt 0.726759 0.362531
+vt 0.718490 0.362531
+vt 0.735027 0.358402
+vt 0.735028 0.362531
+vt 0.710220 0.358402
+vt 0.710221 0.362531
+vt 0.751557 0.354296
+vt 0.743290 0.354297
+vt 0.743277 0.350239
+vt 0.751543 0.350239
+vt 0.743254 0.346254
+vt 0.751516 0.346254
+vt 0.759808 0.350239
+vt 0.759825 0.354296
+vt 0.768074 0.350239
+vt 0.768093 0.354296
+vt 0.759778 0.346254
+vt 0.768040 0.346253
+vt 0.759833 0.358401
+vt 0.751564 0.358401
+vt 0.759836 0.362530
+vt 0.751567 0.362530
+vt 0.768102 0.358401
+vt 0.768106 0.362530
+vt 0.743295 0.358402
+vt 0.743298 0.362531
+vt 0.784630 0.354295
+vt 0.776362 0.354295
+vt 0.776340 0.350238
+vt 0.784607 0.350238
+vt 0.776302 0.346253
+vt 0.784565 0.346253
+vt 0.792873 0.350237
+vt 0.792899 0.354295
+vt 0.801140 0.350237
+vt 0.801167 0.354294
+vt 0.792828 0.346252
+vt 0.801092 0.346252
+vt 0.792910 0.358400
+vt 0.784641 0.358400
+vt 0.792915 0.362529
+vt 0.784645 0.362529
+vt 0.801180 0.358399
+vt 0.801184 0.362528
+vt 0.776371 0.358400
+vt 0.776375 0.362530
+vt 0.817705 0.354293
+vt 0.809436 0.354294
+vt 0.809408 0.350237
+vt 0.817675 0.350236
+vt 0.809356 0.346251
+vt 0.817621 0.346251
+vt 0.825943 0.350236
+vt 0.825974 0.354293
+vt 0.834211 0.350235
+vt 0.834244 0.354292
+vt 0.825887 0.346251
+vt 0.834153 0.346250
+vt 0.825989 0.358398
+vt 0.817719 0.358398
+vt 0.825994 0.362527
+vt 0.817724 0.362528
+vt 0.834259 0.358398
+vt 0.834265 0.362527
+vt 0.809449 0.358399
+vt 0.809454 0.362528
+vt 0.850784 0.354292
+vt 0.842514 0.354292
+vt 0.842480 0.350235
+vt 0.850749 0.350235
+vt 0.842419 0.346250
+vt 0.850686 0.346252
+vt 0.859018 0.350238
+vt 0.859054 0.354292
+vt 0.867288 0.350244
+vt 0.867324 0.354293
+vt 0.858954 0.346259
+vt 0.867223 0.346274
+vt 0.859070 0.358396
+vt 0.850800 0.358396
+vt 0.859076 0.362525
+vt 0.850806 0.362526
+vt 0.867341 0.358395
+vt 0.867347 0.362524
+vt 0.842529 0.358397
+vt 0.842535 0.362526
+vt 0.883866 0.354298
+vt 0.875595 0.354295
+vt 0.875558 0.350254
+vt 0.883829 0.350267
+vt 0.875492 0.346300
+vt 0.883762 0.346333
+vt 0.892099 0.350282
+vt 0.892137 0.354301
+vt 0.900370 0.350298
+vt 0.900408 0.354305
+vt 0.892032 0.346372
+vt 0.900302 0.346413
+vt 0.892154 0.358394
+vt 0.883883 0.358394
+vt 0.892161 0.362523
+vt 0.883889 0.362523
+vt 0.900425 0.358393
+vt 0.900432 0.362522
+vt 0.875612 0.358395
+vt 0.875618 0.362524
+vt 0.122885 0.354303
+vt 0.114613 0.354304
+vt 0.114575 0.350297
+vt 0.122848 0.350296
+vt 0.114508 0.346413
+vt 0.122781 0.346410
+vt 0.106341 0.354305
+vt 0.106303 0.350298
+vt 0.106235 0.346413
+vt 0.131121 0.350292
+vt 0.131157 0.354302
+vt 0.139394 0.350285
+vt 0.139430 0.354300
+vt 0.131055 0.346401
+vt 0.139329 0.346385
+vt 0.131174 0.358391
+vt 0.122902 0.358392
+vt 0.131181 0.362520
+vt 0.122909 0.362521
+vt 0.139446 0.358391
+vt 0.139453 0.362520
+vt 0.114630 0.358392
+vt 0.106358 0.358393
+vt 0.114637 0.362522
+vt 0.106365 0.362522
+vt 0.155976 0.354293
+vt 0.147703 0.354297
+vt 0.147667 0.350274
+vt 0.155941 0.350261
+vt 0.147604 0.346358
+vt 0.155879 0.346326
+vt 0.164215 0.350248
+vt 0.164249 0.354289
+vt 0.172490 0.350237
+vt 0.172522 0.354286
+vt 0.164155 0.346294
+vt 0.172432 0.346267
+vt 0.164264 0.358389
+vt 0.155991 0.358390
+vt 0.164270 0.362518
+vt 0.155997 0.362519
+vt 0.172537 0.358389
+vt 0.172543 0.362518
+vt 0.147719 0.358390
+vt 0.147725 0.362519
+vt 0.189070 0.354283
+vt 0.180796 0.354284
+vt 0.180765 0.350230
+vt 0.189040 0.350227
+vt 0.180709 0.346251
+vt 0.188987 0.346243
+vt 0.197316 0.350225
+vt 0.197344 0.354282
+vt 0.205592 0.350225
+vt 0.205618 0.354282
+vt 0.197266 0.346240
+vt 0.205545 0.346239
+vt 0.197357 0.358387
+vt 0.189083 0.358388
+vt 0.197361 0.362516
+vt 0.189088 0.362517
+vt 0.205630 0.358387
+vt 0.205635 0.362516
+vt 0.180810 0.358388
+vt 0.180815 0.362517
+vt 0.222167 0.354281
+vt 0.213893 0.354281
+vt 0.213868 0.350224
+vt 0.222145 0.350224
+vt 0.213824 0.346239
+vt 0.222104 0.346239
+vt 0.230421 0.350224
+vt 0.230442 0.354281
+vt 0.238698 0.350223
+vt 0.238717 0.354280
+vt 0.230385 0.346238
+vt 0.238666 0.346238
+vt 0.230451 0.358386
+vt 0.222178 0.358386
+vt 0.230455 0.362515
+vt 0.222181 0.362515
+vt 0.238725 0.358386
+vt 0.238728 0.362515
+vt 0.213904 0.358387
+vt 0.213908 0.362516
+vt 0.255267 0.354280
+vt 0.246992 0.354280
+vt 0.246976 0.350223
+vt 0.255253 0.350223
+vt 0.246947 0.346238
+vt 0.255228 0.346238
+vt 0.263531 0.350223
+vt 0.263542 0.354280
+vt 0.271809 0.350222
+vt 0.271818 0.354280
+vt 0.263510 0.346237
+vt 0.271792 0.346237
+vt 0.263548 0.358385
+vt 0.255273 0.358385
+vt 0.263550 0.362514
+vt 0.255276 0.362514
+vt 0.271822 0.358385
+vt 0.271823 0.362514
+vt 0.246999 0.358385
+vt 0.247002 0.362514
+vt 0.288368 0.354279
+vt 0.280093 0.354279
+vt 0.280086 0.350222
+vt 0.288364 0.350222
+vt 0.280074 0.346237
+vt 0.288356 0.346237
+vt 0.296642 0.350222
+vt 0.296644 0.354279
+vt 0.304920 0.350222
+vt 0.304919 0.354279
+vt 0.296639 0.346237
+vt 0.304921 0.346237
+vt 0.296645 0.358384
+vt 0.288370 0.358384
+vt 0.296645 0.362513
+vt 0.288371 0.362514
+vt 0.304919 0.358384
+vt 0.304919 0.362513
+vt 0.280096 0.358385
+vt 0.280097 0.362514
+vt 0.321470 0.354279
+vt 0.313195 0.354279
+vt 0.313198 0.350222
+vt 0.321476 0.350222
+vt 0.313203 0.346237
+vt 0.321486 0.346237
+vt 0.329754 0.350222
+vt 0.329746 0.354279
+vt 0.329768 0.346237
+vt 0.329742 0.358385
+vt 0.321468 0.358384
+vt 0.329741 0.362514
+vt 0.321467 0.362514
+vt 0.313194 0.358384
+vt 0.313193 0.362513
+vt 0.354559 0.370772
+vt 0.346285 0.370772
+vt 0.346287 0.366643
+vt 0.354560 0.366643
+vt 0.338012 0.370772
+vt 0.338013 0.366643
+vt 0.362834 0.366644
+vt 0.362832 0.370773
+vt 0.371107 0.366644
+vt 0.371105 0.370773
+vt 0.362830 0.374902
+vt 0.354558 0.374901
+vt 0.362829 0.379031
+vt 0.354557 0.379031
+vt 0.371103 0.374902
+vt 0.371102 0.379031
+vt 0.346285 0.374901
+vt 0.338011 0.374901
+vt 0.346284 0.379030
+vt 0.338011 0.379030
+vt 0.387651 0.370774
+vt 0.379378 0.370773
+vt 0.379380 0.366644
+vt 0.387653 0.366644
+vt 0.395927 0.366645
+vt 0.395924 0.370774
+vt 0.404200 0.366645
+vt 0.404197 0.370774
+vt 0.395922 0.374903
+vt 0.387649 0.374903
+vt 0.395920 0.379032
+vt 0.387648 0.379032
+vt 0.404195 0.374903
+vt 0.404193 0.379032
+vt 0.379376 0.374902
+vt 0.379375 0.379031
+vt 0.420742 0.370775
+vt 0.412470 0.370775
+vt 0.412472 0.366646
+vt 0.420745 0.366646
+vt 0.429018 0.366647
+vt 0.429015 0.370776
+vt 0.437291 0.366647
+vt 0.437287 0.370776
+vt 0.429012 0.374905
+vt 0.420740 0.374904
+vt 0.429010 0.379034
+vt 0.420738 0.379033
+vt 0.437285 0.374905
+vt 0.437282 0.379034
+vt 0.412467 0.374904
+vt 0.412465 0.379033
+vt 0.453832 0.370777
+vt 0.445560 0.370777
+vt 0.445563 0.366648
+vt 0.453835 0.366648
+vt 0.462108 0.366649
+vt 0.462104 0.370778
+vt 0.470380 0.366649
+vt 0.470376 0.370778
+vt 0.462101 0.374907
+vt 0.453829 0.374906
+vt 0.462099 0.379036
+vt 0.453827 0.379035
+vt 0.470373 0.374907
+vt 0.470371 0.379036
+vt 0.445557 0.374906
+vt 0.445555 0.379035
+vt 0.486920 0.370779
+vt 0.478648 0.370779
+vt 0.478652 0.366650
+vt 0.486924 0.366650
+vt 0.495195 0.366651
+vt 0.495191 0.370780
+vt 0.503467 0.366652
+vt 0.503463 0.370781
+vt 0.495188 0.374909
+vt 0.486917 0.374909
+vt 0.495186 0.379038
+vt 0.486914 0.379038
+vt 0.503460 0.374910
+vt 0.503458 0.379039
+vt 0.478645 0.374908
+vt 0.478643 0.379037
+vt 0.520006 0.370782
+vt 0.511734 0.370781
+vt 0.511738 0.366652
+vt 0.520010 0.366653
+vt 0.528281 0.366653
+vt 0.528277 0.370782
+vt 0.536552 0.366654
+vt 0.536548 0.370783
+vt 0.528274 0.374911
+vt 0.520003 0.374911
+vt 0.528272 0.379040
+vt 0.520000 0.379040
+vt 0.536545 0.374912
+vt 0.536543 0.379041
+vt 0.511731 0.374910
+vt 0.511729 0.379039
+vt 0.553090 0.370784
+vt 0.544819 0.370783
+vt 0.544823 0.366654
+vt 0.553093 0.366655
+vt 0.561364 0.366655
+vt 0.561361 0.370784
+vt 0.569635 0.366656
+vt 0.569631 0.370785
+vt 0.561358 0.374914
+vt 0.553087 0.374913
+vt 0.561356 0.379043
+vt 0.553085 0.379042
+vt 0.569629 0.374914
+vt 0.569627 0.379043
+vt 0.544816 0.374913
+vt 0.544814 0.379042
+vt 0.586172 0.370786
+vt 0.577902 0.370785
+vt 0.577905 0.366656
+vt 0.586175 0.366657
+vt 0.594446 0.366657
+vt 0.594443 0.370786
+vt 0.602716 0.366658
+vt 0.602713 0.370787
+vt 0.594441 0.374915
+vt 0.586170 0.374915
+vt 0.594439 0.379045
+vt 0.586168 0.379044
+vt 0.602711 0.374916
+vt 0.602709 0.379045
+vt 0.577899 0.374914
+vt 0.577897 0.379044
+vt 0.619253 0.370788
+vt 0.610983 0.370787
+vt 0.610986 0.366658
+vt 0.619256 0.366658
+vt 0.627525 0.366659
+vt 0.627523 0.370788
+vt 0.635795 0.366659
+vt 0.635793 0.370788
+vt 0.627522 0.374917
+vt 0.619252 0.374917
+vt 0.627520 0.379046
+vt 0.619250 0.379046
+vt 0.635792 0.374917
+vt 0.635791 0.379046
+vt 0.610981 0.374916
+vt 0.610980 0.379045
+vt 0.652333 0.370789
+vt 0.644063 0.370788
+vt 0.644065 0.366659
+vt 0.652335 0.366660
+vt 0.660604 0.366660
+vt 0.660603 0.370789
+vt 0.668874 0.366660
+vt 0.668873 0.370789
+vt 0.660602 0.374918
+vt 0.652332 0.374918
+vt 0.660601 0.379047
+vt 0.652331 0.379047
+vt 0.668872 0.374918
+vt 0.668871 0.379047
+vt 0.644062 0.374917
+vt 0.644061 0.379047
+vt 0.685412 0.370789
+vt 0.677143 0.370789
+vt 0.677143 0.366660
+vt 0.685413 0.366660
+vt 0.693682 0.366660
+vt 0.693682 0.370789
+vt 0.701952 0.366660
+vt 0.701952 0.370789
+vt 0.693682 0.374918
+vt 0.685412 0.374918
+vt 0.693682 0.379047
+vt 0.685412 0.379047
+vt 0.701952 0.374918
+vt 0.701952 0.379047
+vt 0.677142 0.374918
+vt 0.677142 0.379047
+vt 0.718491 0.370789
+vt 0.710222 0.370789
+vt 0.710221 0.366660
+vt 0.718491 0.366660
+vt 0.726760 0.366660
+vt 0.726761 0.370789
+vt 0.735030 0.366660
+vt 0.735031 0.370789
+vt 0.726762 0.374918
+vt 0.718492 0.374918
+vt 0.726762 0.379047
+vt 0.718492 0.379047
+vt 0.735031 0.374918
+vt 0.735032 0.379047
+vt 0.710222 0.374918
+vt 0.710222 0.379047
+vt 0.751570 0.370789
+vt 0.743301 0.370789
+vt 0.743299 0.366660
+vt 0.751569 0.366659
+vt 0.759839 0.366659
+vt 0.759840 0.370788
+vt 0.768108 0.366659
+vt 0.768110 0.370788
+vt 0.759842 0.374917
+vt 0.751572 0.374918
+vt 0.759843 0.379046
+vt 0.751572 0.379047
+vt 0.768112 0.374917
+vt 0.768113 0.379046
+vt 0.743302 0.374918
+vt 0.743302 0.379047
+vt 0.784650 0.370787
+vt 0.776380 0.370788
+vt 0.776378 0.366659
+vt 0.784648 0.366658
+vt 0.792918 0.366658
+vt 0.792920 0.370787
+vt 0.801188 0.366658
+vt 0.801191 0.370787
+vt 0.792922 0.374916
+vt 0.784652 0.374916
+vt 0.792924 0.379045
+vt 0.784654 0.379045
+vt 0.801193 0.374916
+vt 0.801195 0.379045
+vt 0.776382 0.374917
+vt 0.776383 0.379046
+vt 0.817731 0.370786
+vt 0.809461 0.370786
+vt 0.809458 0.366657
+vt 0.817728 0.366657
+vt 0.825999 0.366656
+vt 0.826002 0.370785
+vt 0.834269 0.366656
+vt 0.834273 0.370785
+vt 0.826004 0.374914
+vt 0.817734 0.374915
+vt 0.826006 0.379043
+vt 0.817736 0.379044
+vt 0.834275 0.374914
+vt 0.834277 0.379043
+vt 0.809463 0.374915
+vt 0.809465 0.379044
+vt 0.850814 0.370784
+vt 0.842543 0.370784
+vt 0.842540 0.366655
+vt 0.850810 0.366655
+vt 0.859081 0.366654
+vt 0.859085 0.370783
+vt 0.867352 0.366654
+vt 0.867356 0.370783
+vt 0.859088 0.374912
+vt 0.850817 0.374913
+vt 0.859090 0.379041
+vt 0.850819 0.379042
+vt 0.867359 0.374912
+vt 0.867361 0.379041
+vt 0.842546 0.374913
+vt 0.842548 0.379042
+vt 0.883898 0.370781
+vt 0.875627 0.370782
+vt 0.875623 0.366653
+vt 0.883894 0.366652
+vt 0.892166 0.366652
+vt 0.892170 0.370781
+vt 0.900437 0.366651
+vt 0.900441 0.370780
+vt 0.892173 0.374910
+vt 0.883901 0.374911
+vt 0.892175 0.379039
+vt 0.883904 0.379040
+vt 0.900444 0.374909
+vt 0.900446 0.379038
+vt 0.875630 0.374911
+vt 0.875632 0.379040
+vt 0.122917 0.370779
+vt 0.114646 0.370780
+vt 0.114642 0.366651
+vt 0.122914 0.366650
+vt 0.106374 0.370780
+vt 0.106370 0.366651
+vt 0.131185 0.366650
+vt 0.131189 0.370779
+vt 0.139457 0.366649
+vt 0.139461 0.370778
+vt 0.131192 0.374908
+vt 0.122920 0.374908
+vt 0.131195 0.379037
+vt 0.122923 0.379037
+vt 0.139464 0.374907
+vt 0.139466 0.379036
+vt 0.114649 0.374909
+vt 0.106377 0.374909
+vt 0.114651 0.379038
+vt 0.106379 0.379038
+vt 0.156006 0.370777
+vt 0.147733 0.370777
+vt 0.147730 0.366648
+vt 0.156002 0.366648
+vt 0.164274 0.366647
+vt 0.164278 0.370776
+vt 0.172547 0.366647
+vt 0.172550 0.370776
+vt 0.164281 0.374905
+vt 0.156008 0.374906
+vt 0.164283 0.379035
+vt 0.156010 0.379035
+vt 0.172553 0.374905
+vt 0.172555 0.379034
+vt 0.147736 0.374906
+vt 0.147738 0.379036
+vt 0.189095 0.370775
+vt 0.180823 0.370775
+vt 0.180820 0.366646
+vt 0.189092 0.366646
+vt 0.197365 0.366645
+vt 0.197368 0.370775
+vt 0.205638 0.366645
+vt 0.205641 0.370774
+vt 0.197370 0.374904
+vt 0.189098 0.374904
+vt 0.197372 0.379033
+vt 0.189100 0.379033
+vt 0.205643 0.374903
+vt 0.205645 0.379032
+vt 0.180825 0.374905
+vt 0.180827 0.379034
+vt 0.222187 0.370773
+vt 0.213914 0.370774
+vt 0.213911 0.366645
+vt 0.222184 0.366644
+vt 0.230458 0.366644
+vt 0.230460 0.370773
+vt 0.238731 0.366644
+vt 0.238733 0.370773
+vt 0.230461 0.374902
+vt 0.222188 0.374902
+vt 0.230463 0.379031
+vt 0.222190 0.379032
+vt 0.238734 0.374902
+vt 0.238735 0.379031
+vt 0.213916 0.374903
+vt 0.213917 0.379032
+vt 0.255279 0.370772
+vt 0.247006 0.370772
+vt 0.247004 0.366643
+vt 0.255278 0.366643
+vt 0.263551 0.366643
+vt 0.263552 0.370772
+vt 0.271825 0.366643
+vt 0.271826 0.370772
+vt 0.263553 0.374901
+vt 0.255280 0.374901
+vt 0.263554 0.379030
+vt 0.255281 0.379030
+vt 0.271826 0.374901
+vt 0.271827 0.379030
+vt 0.247007 0.374902
+vt 0.247008 0.379031
+vt 0.288372 0.370772
+vt 0.280099 0.370772
+vt 0.280098 0.366643
+vt 0.288372 0.366643
+vt 0.296645 0.366643
+vt 0.296646 0.370772
+vt 0.304919 0.366643
+vt 0.304919 0.370772
+vt 0.296646 0.374901
+vt 0.288373 0.374901
+vt 0.296646 0.379030
+vt 0.288373 0.379030
+vt 0.304919 0.374901
+vt 0.304919 0.379030
+vt 0.280099 0.374901
+vt 0.280100 0.379030
+vt 0.321466 0.370772
+vt 0.313192 0.370772
+vt 0.313193 0.366643
+vt 0.321466 0.366643
+vt 0.329740 0.366643
+vt 0.329739 0.370772
+vt 0.329738 0.374901
+vt 0.321465 0.374901
+vt 0.329738 0.379030
+vt 0.321465 0.379030
+vt 0.313192 0.374901
+vt 0.313192 0.379030
+vt 0.354555 0.387289
+vt 0.346282 0.387288
+vt 0.346283 0.383159
+vt 0.354556 0.383160
+vt 0.338010 0.387288
+vt 0.338010 0.383159
+vt 0.362828 0.383160
+vt 0.362828 0.387289
+vt 0.371101 0.383160
+vt 0.371100 0.387289
+vt 0.362827 0.391418
+vt 0.354554 0.391418
+vt 0.362826 0.395547
+vt 0.354554 0.395547
+vt 0.371100 0.391418
+vt 0.371099 0.395547
+vt 0.346282 0.391417
+vt 0.338009 0.391417
+vt 0.346281 0.395546
+vt 0.338009 0.395546
+vt 0.387645 0.387290
+vt 0.379373 0.387289
+vt 0.379374 0.383160
+vt 0.387646 0.383161
+vt 0.395919 0.383161
+vt 0.395918 0.387290
+vt 0.404191 0.383161
+vt 0.404190 0.387291
+vt 0.395917 0.391419
+vt 0.387644 0.391419
+vt 0.395916 0.395548
+vt 0.387644 0.395548
+vt 0.404189 0.391420
+vt 0.404188 0.395549
+vt 0.379372 0.391418
+vt 0.379371 0.395548
+vt 0.420735 0.387291
+vt 0.412463 0.387291
+vt 0.412464 0.383162
+vt 0.420736 0.383162
+vt 0.429008 0.383163
+vt 0.429007 0.387292
+vt 0.437281 0.383163
+vt 0.437279 0.387292
+vt 0.429006 0.391421
+vt 0.420734 0.391420
+vt 0.429005 0.395550
+vt 0.420733 0.395550
+vt 0.437278 0.391421
+vt 0.437277 0.395551
+vt 0.412461 0.391420
+vt 0.412460 0.395549
+vt 0.453823 0.387293
+vt 0.445551 0.387293
+vt 0.445553 0.383164
+vt 0.453825 0.383164
+vt 0.462097 0.383165
+vt 0.462095 0.387294
+vt 0.470369 0.383166
+vt 0.470367 0.387295
+vt 0.462094 0.391423
+vt 0.453822 0.391423
+vt 0.462093 0.395552
+vt 0.453821 0.395552
+vt 0.470366 0.391424
+vt 0.470364 0.395553
+vt 0.445550 0.391422
+vt 0.445549 0.395551
+vt 0.486911 0.387296
+vt 0.478639 0.387295
+vt 0.478641 0.383166
+vt 0.486912 0.383167
+vt 0.495184 0.383167
+vt 0.495182 0.387296
+vt 0.503456 0.383168
+vt 0.503454 0.387297
+vt 0.495181 0.391425
+vt 0.486909 0.391425
+vt 0.495180 0.395554
+vt 0.486908 0.395554
+vt 0.503452 0.391426
+vt 0.503451 0.395555
+vt 0.478637 0.391424
+vt 0.478636 0.395553
+vt 0.519997 0.387298
+vt 0.511725 0.387297
+vt 0.511727 0.383168
+vt 0.519998 0.383169
+vt 0.528270 0.383170
+vt 0.528268 0.387299
+vt 0.536541 0.383170
+vt 0.536539 0.387299
+vt 0.528266 0.391428
+vt 0.519995 0.391427
+vt 0.528265 0.395557
+vt 0.519994 0.395556
+vt 0.536538 0.391428
+vt 0.536537 0.395557
+vt 0.511724 0.391426
+vt 0.511723 0.395556
+vt 0.553081 0.387300
+vt 0.544810 0.387300
+vt 0.544812 0.383171
+vt 0.553083 0.383171
+vt 0.561354 0.383172
+vt 0.561352 0.387301
+vt 0.569625 0.383172
+vt 0.569623 0.387301
+vt 0.561351 0.391430
+vt 0.553080 0.391429
+vt 0.561350 0.395559
+vt 0.553079 0.395558
+vt 0.569622 0.391430
+vt 0.569621 0.395559
+vt 0.544809 0.391429
+vt 0.544808 0.395558
+vt 0.586165 0.387302
+vt 0.577894 0.387302
+vt 0.577896 0.383173
+vt 0.586167 0.383173
+vt 0.594437 0.383174
+vt 0.594436 0.387303
+vt 0.602708 0.383174
+vt 0.602707 0.387303
+vt 0.594435 0.391432
+vt 0.586164 0.391431
+vt 0.594434 0.395561
+vt 0.586163 0.395560
+vt 0.602706 0.391432
+vt 0.602705 0.395561
+vt 0.577893 0.391431
+vt 0.577892 0.395560
+vt 0.619248 0.387304
+vt 0.610977 0.387303
+vt 0.610978 0.383174
+vt 0.619249 0.383175
+vt 0.627519 0.383175
+vt 0.627518 0.387304
+vt 0.635790 0.383175
+vt 0.635789 0.387304
+vt 0.627518 0.391433
+vt 0.619247 0.391433
+vt 0.627517 0.395562
+vt 0.619246 0.395562
+vt 0.635788 0.391434
+vt 0.635787 0.395563
+vt 0.610976 0.391432
+vt 0.610975 0.395562
+vt 0.652330 0.387305
+vt 0.644059 0.387305
+vt 0.644060 0.383176
+vt 0.652330 0.383176
+vt 0.660601 0.383176
+vt 0.660600 0.387305
+vt 0.668871 0.383176
+vt 0.668871 0.387305
+vt 0.660600 0.391434
+vt 0.652329 0.391434
+vt 0.660599 0.395563
+vt 0.652329 0.395563
+vt 0.668870 0.391434
+vt 0.668870 0.395563
+vt 0.644059 0.391434
+vt 0.644058 0.395563
+vt 0.685411 0.387305
+vt 0.677141 0.387305
+vt 0.677141 0.383176
+vt 0.685411 0.383176
+vt 0.693682 0.383176
+vt 0.693682 0.387305
+vt 0.701952 0.383176
+vt 0.701952 0.387306
+vt 0.693681 0.391435
+vt 0.685411 0.391435
+vt 0.693681 0.395564
+vt 0.685411 0.395564
+vt 0.701952 0.391435
+vt 0.701952 0.395564
+vt 0.677141 0.391434
+vt 0.677140 0.395563
+vt 0.718493 0.387305
+vt 0.710222 0.387306
+vt 0.710222 0.383176
+vt 0.718492 0.383176
+vt 0.726763 0.383176
+vt 0.726763 0.387305
+vt 0.735033 0.383176
+vt 0.735033 0.387305
+vt 0.726763 0.391434
+vt 0.718493 0.391435
+vt 0.726763 0.395563
+vt 0.718493 0.395564
+vt 0.735034 0.391434
+vt 0.735034 0.395563
+vt 0.710222 0.391435
+vt 0.710222 0.395564
+vt 0.751574 0.387305
+vt 0.743304 0.387305
+vt 0.743303 0.383176
+vt 0.751573 0.383176
+vt 0.759844 0.383175
+vt 0.759845 0.387305
+vt 0.768114 0.383175
+vt 0.768115 0.387304
+vt 0.759845 0.391434
+vt 0.751575 0.391434
+vt 0.759846 0.395563
+vt 0.751575 0.395563
+vt 0.768116 0.391433
+vt 0.768116 0.395562
+vt 0.743304 0.391434
+vt 0.743304 0.395563
+vt 0.784656 0.387304
+vt 0.776385 0.387304
+vt 0.776384 0.383175
+vt 0.784655 0.383175
+vt 0.792925 0.383174
+vt 0.792927 0.387303
+vt 0.801196 0.383174
+vt 0.801197 0.387303
+vt 0.792928 0.391432
+vt 0.784657 0.391433
+vt 0.792928 0.395561
+vt 0.784658 0.395562
+vt 0.801198 0.391432
+vt 0.801199 0.395561
+vt 0.776386 0.391433
+vt 0.776387 0.395562
+vt 0.817739 0.387302
+vt 0.809468 0.387302
+vt 0.809467 0.383173
+vt 0.817737 0.383173
+vt 0.826008 0.383172
+vt 0.826010 0.387302
+vt 0.834279 0.383172
+vt 0.834281 0.387301
+vt 0.826011 0.391431
+vt 0.817740 0.391431
+vt 0.826012 0.395560
+vt 0.817741 0.395560
+vt 0.834282 0.391430
+vt 0.834283 0.395559
+vt 0.809469 0.391431
+vt 0.809470 0.395561
+vt 0.850823 0.387300
+vt 0.842552 0.387300
+vt 0.842550 0.383171
+vt 0.850821 0.383171
+vt 0.859092 0.383170
+vt 0.859094 0.387299
+vt 0.867363 0.383170
+vt 0.867365 0.387299
+vt 0.859095 0.391428
+vt 0.850824 0.391429
+vt 0.859096 0.395558
+vt 0.850825 0.395558
+vt 0.867366 0.391428
+vt 0.867368 0.395557
+vt 0.842553 0.391430
+vt 0.842554 0.395559
+vt 0.883907 0.387298
+vt 0.875636 0.387298
+vt 0.875634 0.383169
+vt 0.883906 0.383169
+vt 0.892177 0.383168
+vt 0.892179 0.387297
+vt 0.900448 0.383168
+vt 0.900450 0.387297
+vt 0.892180 0.391426
+vt 0.883909 0.391427
+vt 0.892182 0.395555
+vt 0.883910 0.395556
+vt 0.900452 0.391426
+vt 0.900453 0.395555
+vt 0.875638 0.391427
+vt 0.875639 0.395556
+vt 0.122926 0.387295
+vt 0.114655 0.387296
+vt 0.114653 0.383167
+vt 0.122925 0.383166
+vt 0.106383 0.387297
+vt 0.106381 0.383168
+vt 0.131197 0.383166
+vt 0.131198 0.387295
+vt 0.139468 0.383165
+vt 0.139470 0.387294
+vt 0.131200 0.391424
+vt 0.122928 0.391424
+vt 0.131201 0.395553
+vt 0.122929 0.395554
+vt 0.139472 0.391423
+vt 0.139473 0.395552
+vt 0.114656 0.391425
+vt 0.106385 0.391426
+vt 0.114658 0.395554
+vt 0.106386 0.395555
+vt 0.156014 0.387293
+vt 0.147742 0.387294
+vt 0.147740 0.383165
+vt 0.156012 0.383164
+vt 0.164284 0.383164
+vt 0.164286 0.387293
+vt 0.172557 0.383163
+vt 0.172558 0.387292
+vt 0.164287 0.391422
+vt 0.156015 0.391422
+vt 0.164288 0.395551
+vt 0.156017 0.395551
+vt 0.172559 0.391421
+vt 0.172561 0.395550
+vt 0.147743 0.391423
+vt 0.147745 0.395552
+vt 0.189103 0.387291
+vt 0.180830 0.387292
+vt 0.180829 0.383163
+vt 0.189101 0.383162
+vt 0.197374 0.383162
+vt 0.197375 0.387291
+vt 0.205646 0.383161
+vt 0.205647 0.387290
+vt 0.197376 0.391420
+vt 0.189104 0.391420
+vt 0.197377 0.395549
+vt 0.189105 0.395549
+vt 0.205648 0.391419
+vt 0.205649 0.395548
+vt 0.180832 0.391421
+vt 0.180833 0.395550
+vt 0.222192 0.387290
+vt 0.213920 0.387290
+vt 0.213919 0.383161
+vt 0.222191 0.383161
+vt 0.230464 0.383160
+vt 0.230465 0.387289
+vt 0.238736 0.383160
+vt 0.238737 0.387289
+vt 0.230466 0.391418
+vt 0.222193 0.391419
+vt 0.230466 0.395547
+vt 0.222194 0.395548
+vt 0.238738 0.391418
+vt 0.238739 0.395547
+vt 0.213921 0.391419
+vt 0.213922 0.395548
+vt 0.255283 0.387288
+vt 0.247010 0.387289
+vt 0.247009 0.383160
+vt 0.255282 0.383159
+vt 0.263555 0.383159
+vt 0.263555 0.387288
+vt 0.271827 0.383159
+vt 0.271828 0.387288
+vt 0.263556 0.391417
+vt 0.255283 0.391418
+vt 0.263556 0.395546
+vt 0.255284 0.395547
+vt 0.271828 0.391417
+vt 0.271829 0.395546
+vt 0.247011 0.391418
+vt 0.247011 0.395547
+vt 0.288373 0.387288
+vt 0.280101 0.387288
+vt 0.280100 0.383159
+vt 0.288373 0.383159
+vt 0.296646 0.383159
+vt 0.296646 0.387288
+vt 0.304919 0.383159
+vt 0.304919 0.387288
+vt 0.296646 0.391417
+vt 0.288374 0.391417
+vt 0.296646 0.395546
+vt 0.288374 0.395546
+vt 0.304919 0.391417
+vt 0.304919 0.395546
+vt 0.280101 0.391417
+vt 0.280101 0.395546
+vt 0.321464 0.387288
+vt 0.313192 0.387288
+vt 0.313192 0.383159
+vt 0.321465 0.383159
+vt 0.329737 0.383159
+vt 0.329737 0.387288
+vt 0.329737 0.391417
+vt 0.321464 0.391417
+vt 0.329736 0.395546
+vt 0.321464 0.395546
+vt 0.313191 0.391417
+vt 0.313191 0.395546
+vt 0.354553 0.403805
+vt 0.346281 0.403805
+vt 0.346281 0.399676
+vt 0.354554 0.399676
+vt 0.338008 0.403804
+vt 0.338009 0.399675
+vt 0.362826 0.399676
+vt 0.362825 0.403805
+vt 0.371098 0.399676
+vt 0.371098 0.403805
+vt 0.362825 0.407934
+vt 0.354553 0.407934
+vt 0.362825 0.412063
+vt 0.354552 0.412063
+vt 0.371097 0.407934
+vt 0.371097 0.412063
+vt 0.346280 0.407934
+vt 0.338008 0.407934
+vt 0.346280 0.412063
+vt 0.338008 0.412063
+vt 0.387642 0.403806
+vt 0.379370 0.403806
+vt 0.379371 0.399677
+vt 0.387643 0.399677
+vt 0.395915 0.399677
+vt 0.395914 0.403806
+vt 0.404187 0.399678
+vt 0.404187 0.403807
+vt 0.395914 0.407935
+vt 0.387642 0.407935
+vt 0.395913 0.412065
+vt 0.387641 0.412064
+vt 0.404186 0.407936
+vt 0.404185 0.412065
+vt 0.379369 0.407935
+vt 0.379369 0.412064
+vt 0.420731 0.403808
+vt 0.412459 0.403807
+vt 0.412460 0.399678
+vt 0.420732 0.399679
+vt 0.429004 0.399679
+vt 0.429003 0.403808
+vt 0.437276 0.399680
+vt 0.437275 0.403809
+vt 0.429002 0.407937
+vt 0.420730 0.407937
+vt 0.429001 0.412066
+vt 0.420729 0.412066
+vt 0.437274 0.407938
+vt 0.437273 0.412067
+vt 0.412458 0.407936
+vt 0.412457 0.412065
+vt 0.453819 0.403810
+vt 0.445547 0.403809
+vt 0.445548 0.399680
+vt 0.453820 0.399681
+vt 0.462092 0.399681
+vt 0.462090 0.403810
+vt 0.470363 0.399682
+vt 0.470362 0.403811
+vt 0.462090 0.407939
+vt 0.453818 0.407939
+vt 0.462089 0.412068
+vt 0.453817 0.412068
+vt 0.470361 0.407940
+vt 0.470361 0.412069
+vt 0.445546 0.407938
+vt 0.445545 0.412067
+vt 0.486906 0.403812
+vt 0.478634 0.403811
+vt 0.478635 0.399682
+vt 0.486907 0.399683
+vt 0.495178 0.399683
+vt 0.495177 0.403813
+vt 0.503450 0.399684
+vt 0.503449 0.403813
+vt 0.495176 0.407942
+vt 0.486905 0.407941
+vt 0.495175 0.412071
+vt 0.486904 0.412070
+vt 0.503448 0.407942
+vt 0.503447 0.412071
+vt 0.478633 0.407940
+vt 0.478632 0.412069
+vt 0.519992 0.403814
+vt 0.511720 0.403814
+vt 0.511721 0.399685
+vt 0.519993 0.399685
+vt 0.528264 0.399686
+vt 0.528263 0.403815
+vt 0.536535 0.399686
+vt 0.536534 0.403815
+vt 0.528262 0.407944
+vt 0.519991 0.407943
+vt 0.528261 0.412073
+vt 0.519990 0.412072
+vt 0.536534 0.407944
+vt 0.536533 0.412073
+vt 0.511719 0.407943
+vt 0.511719 0.412072
+vt 0.553077 0.403816
+vt 0.544806 0.403816
+vt 0.544807 0.399687
+vt 0.553078 0.399687
+vt 0.561349 0.399688
+vt 0.561348 0.403817
+vt 0.569620 0.399688
+vt 0.569619 0.403817
+vt 0.561347 0.407946
+vt 0.553076 0.407945
+vt 0.561346 0.412075
+vt 0.553075 0.412075
+vt 0.569618 0.407946
+vt 0.569618 0.412076
+vt 0.544805 0.407945
+vt 0.544804 0.412074
+vt 0.586161 0.403818
+vt 0.577890 0.403818
+vt 0.577891 0.399689
+vt 0.586162 0.399689
+vt 0.594433 0.399690
+vt 0.594432 0.403819
+vt 0.602704 0.399690
+vt 0.602703 0.403819
+vt 0.594432 0.407948
+vt 0.586161 0.407947
+vt 0.594431 0.412077
+vt 0.586160 0.412077
+vt 0.602702 0.407948
+vt 0.602702 0.412077
+vt 0.577889 0.407947
+vt 0.577889 0.412076
+vt 0.619245 0.403820
+vt 0.610974 0.403820
+vt 0.610975 0.399691
+vt 0.619246 0.399691
+vt 0.627516 0.399691
+vt 0.627516 0.403820
+vt 0.635787 0.399692
+vt 0.635786 0.403821
+vt 0.627515 0.407949
+vt 0.619244 0.407949
+vt 0.627515 0.412078
+vt 0.619244 0.412078
+vt 0.635786 0.407950
+vt 0.635786 0.412079
+vt 0.610973 0.407949
+vt 0.610973 0.412078
+vt 0.652328 0.403821
+vt 0.644057 0.403821
+vt 0.644058 0.399692
+vt 0.652328 0.399692
+vt 0.660599 0.399692
+vt 0.660599 0.403821
+vt 0.668870 0.399692
+vt 0.668869 0.403821
+vt 0.660598 0.407950
+vt 0.652328 0.407950
+vt 0.660598 0.412079
+vt 0.652327 0.412079
+vt 0.668869 0.407951
+vt 0.668869 0.412080
+vt 0.644057 0.407950
+vt 0.644056 0.412079
+vt 0.685411 0.403822
+vt 0.677140 0.403822
+vt 0.677140 0.399693
+vt 0.685411 0.399693
+vt 0.693681 0.399693
+vt 0.693681 0.403822
+vt 0.701952 0.399693
+vt 0.701952 0.403822
+vt 0.693681 0.407951
+vt 0.685410 0.407951
+vt 0.693681 0.412080
+vt 0.685410 0.412080
+vt 0.701952 0.407951
+vt 0.701952 0.412080
+vt 0.677140 0.407951
+vt 0.677140 0.412080
+vt 0.718493 0.403822
+vt 0.710223 0.403822
+vt 0.710223 0.399693
+vt 0.718493 0.399693
+vt 0.726764 0.399693
+vt 0.726764 0.403822
+vt 0.735034 0.399692
+vt 0.735035 0.403821
+vt 0.726764 0.407951
+vt 0.718493 0.407951
+vt 0.726764 0.412080
+vt 0.718493 0.412080
+vt 0.735035 0.407951
+vt 0.735035 0.412080
+vt 0.710223 0.407951
+vt 0.710223 0.412080
+vt 0.751576 0.403821
+vt 0.743305 0.403821
+vt 0.743305 0.399692
+vt 0.751575 0.399692
+vt 0.759846 0.399692
+vt 0.759847 0.403821
+vt 0.768117 0.399691
+vt 0.768117 0.403821
+vt 0.759847 0.407950
+vt 0.751576 0.407950
+vt 0.759848 0.412079
+vt 0.751577 0.412079
+vt 0.768118 0.407950
+vt 0.768118 0.412079
+vt 0.743306 0.407950
+vt 0.743306 0.412079
+vt 0.784659 0.403820
+vt 0.776388 0.403820
+vt 0.776388 0.399691
+vt 0.784658 0.399691
+vt 0.792929 0.399690
+vt 0.792930 0.403819
+vt 0.801200 0.399690
+vt 0.801201 0.403819
+vt 0.792931 0.407949
+vt 0.784660 0.407949
+vt 0.792931 0.412078
+vt 0.784660 0.412078
+vt 0.801202 0.407948
+vt 0.801202 0.412077
+vt 0.776389 0.407949
+vt 0.776389 0.412078
+vt 0.817743 0.403818
+vt 0.809472 0.403819
+vt 0.809471 0.399690
+vt 0.817742 0.399689
+vt 0.826013 0.399689
+vt 0.826014 0.403818
+vt 0.834284 0.399688
+vt 0.834285 0.403817
+vt 0.826015 0.407947
+vt 0.817744 0.407947
+vt 0.826015 0.412076
+vt 0.817744 0.412076
+vt 0.834286 0.407946
+vt 0.834287 0.412075
+vt 0.809473 0.407948
+vt 0.809473 0.412077
+vt 0.850827 0.403816
+vt 0.842556 0.403817
+vt 0.842555 0.399688
+vt 0.850826 0.399687
+vt 0.859097 0.399687
+vt 0.859098 0.403816
+vt 0.867369 0.399686
+vt 0.867370 0.403815
+vt 0.859099 0.407945
+vt 0.850828 0.407945
+vt 0.859100 0.412074
+vt 0.850829 0.412074
+vt 0.867371 0.407944
+vt 0.867371 0.412073
+vt 0.842557 0.407946
+vt 0.842558 0.412075
+vt 0.883912 0.403814
+vt 0.875641 0.403815
+vt 0.875640 0.399685
+vt 0.883911 0.399685
+vt 0.892183 0.399684
+vt 0.892184 0.403813
+vt 0.900454 0.399684
+vt 0.900455 0.403813
+vt 0.892185 0.407943
+vt 0.883913 0.407943
+vt 0.892186 0.412072
+vt 0.883914 0.412072
+vt 0.900456 0.407942
+vt 0.900457 0.412071
+vt 0.875642 0.407944
+vt 0.875643 0.412073
+vt 0.122931 0.403812
+vt 0.114660 0.403812
+vt 0.114659 0.399683
+vt 0.122930 0.399683
+vt 0.106388 0.403813
+vt 0.106387 0.399684
+vt 0.131202 0.399682
+vt 0.131203 0.403811
+vt 0.139474 0.399681
+vt 0.139475 0.403811
+vt 0.131204 0.407940
+vt 0.122932 0.407941
+vt 0.131205 0.412069
+vt 0.122933 0.412070
+vt 0.139476 0.407940
+vt 0.139477 0.412069
+vt 0.114661 0.407941
+vt 0.106389 0.407942
+vt 0.114662 0.412070
+vt 0.106390 0.412071
+vt 0.156019 0.403809
+vt 0.147747 0.403810
+vt 0.147746 0.399681
+vt 0.156018 0.399680
+vt 0.164290 0.399680
+vt 0.164290 0.403809
+vt 0.172562 0.399679
+vt 0.172562 0.403808
+vt 0.164291 0.407938
+vt 0.156019 0.407939
+vt 0.164292 0.412067
+vt 0.156020 0.412068
+vt 0.172563 0.407937
+vt 0.172564 0.412067
+vt 0.147748 0.407939
+vt 0.147748 0.412068
+vt 0.189106 0.403807
+vt 0.180834 0.403808
+vt 0.180834 0.399679
+vt 0.189106 0.399678
+vt 0.197378 0.399678
+vt 0.197379 0.403807
+vt 0.205650 0.399678
+vt 0.205651 0.403807
+vt 0.197379 0.407936
+vt 0.189107 0.407937
+vt 0.197380 0.412065
+vt 0.189108 0.412066
+vt 0.205651 0.407936
+vt 0.205652 0.412065
+vt 0.180835 0.407937
+vt 0.180836 0.412066
+vt 0.222195 0.403806
+vt 0.213923 0.403806
+vt 0.213922 0.399677
+vt 0.222195 0.399677
+vt 0.230467 0.399676
+vt 0.230467 0.403805
+vt 0.238739 0.399676
+vt 0.238740 0.403805
+vt 0.230468 0.407935
+vt 0.222196 0.407935
+vt 0.230468 0.412064
+vt 0.222196 0.412064
+vt 0.238740 0.407934
+vt 0.238741 0.412063
+vt 0.213924 0.407935
+vt 0.213924 0.412064
+vt 0.255284 0.403805
+vt 0.247012 0.403805
+vt 0.247012 0.399676
+vt 0.255284 0.399676
+vt 0.263556 0.399675
+vt 0.263557 0.403804
+vt 0.271829 0.399675
+vt 0.271829 0.403804
+vt 0.263557 0.407934
+vt 0.255285 0.407934
+vt 0.263557 0.412063
+vt 0.255285 0.412063
+vt 0.271829 0.407933
+vt 0.271830 0.412062
+vt 0.247012 0.407934
+vt 0.247013 0.412063
+vt 0.288374 0.403804
+vt 0.280102 0.403804
+vt 0.280101 0.399675
+vt 0.288374 0.399675
+vt 0.296646 0.399675
+vt 0.296646 0.403804
+vt 0.304919 0.399675
+vt 0.304919 0.403804
+vt 0.296646 0.407933
+vt 0.288374 0.407933
+vt 0.296646 0.412062
+vt 0.288374 0.412062
+vt 0.304919 0.407933
+vt 0.304919 0.412062
+vt 0.280102 0.407933
+vt 0.280102 0.412062
+vt 0.321464 0.403804
+vt 0.313191 0.403804
+vt 0.313191 0.399675
+vt 0.321464 0.399675
+vt 0.329736 0.399675
+vt 0.329736 0.403804
+vt 0.329736 0.407933
+vt 0.321463 0.407933
+vt 0.329736 0.412062
+vt 0.321463 0.412062
+vt 0.313191 0.407933
+vt 0.313191 0.412062
+vt 0.354552 0.420321
+vt 0.346280 0.420321
+vt 0.346280 0.416192
+vt 0.354552 0.416192
+vt 0.338007 0.420321
+vt 0.338008 0.416192
+vt 0.362824 0.416192
+vt 0.362824 0.420321
+vt 0.371096 0.416193
+vt 0.371096 0.420322
+vt 0.362824 0.424450
+vt 0.354552 0.424450
+vt 0.362823 0.428579
+vt 0.354551 0.428579
+vt 0.371096 0.424451
+vt 0.371095 0.428580
+vt 0.346279 0.424450
+vt 0.338007 0.424450
+vt 0.346279 0.428579
+vt 0.338007 0.428579
+vt 0.387640 0.420322
+vt 0.379368 0.420322
+vt 0.379369 0.416193
+vt 0.387641 0.416193
+vt 0.395913 0.416194
+vt 0.395912 0.420323
+vt 0.404185 0.416194
+vt 0.404184 0.420323
+vt 0.395912 0.424452
+vt 0.387640 0.424451
+vt 0.395911 0.428581
+vt 0.387639 0.428580
+vt 0.404184 0.424452
+vt 0.404183 0.428581
+vt 0.379368 0.424451
+vt 0.379367 0.428580
+vt 0.420728 0.420324
+vt 0.412456 0.420323
+vt 0.412457 0.416194
+vt 0.420729 0.416195
+vt 0.429001 0.416195
+vt 0.429000 0.420324
+vt 0.437273 0.416196
+vt 0.437272 0.420325
+vt 0.429000 0.424453
+vt 0.420728 0.424453
+vt 0.428999 0.428583
+vt 0.420727 0.428582
+vt 0.437271 0.424454
+vt 0.437271 0.428583
+vt 0.412456 0.424453
+vt 0.412455 0.428582
+vt 0.453816 0.420326
+vt 0.445544 0.420325
+vt 0.445544 0.416196
+vt 0.453816 0.416197
+vt 0.462088 0.416197
+vt 0.462087 0.420327
+vt 0.470360 0.416198
+vt 0.470359 0.420327
+vt 0.462087 0.424456
+vt 0.453815 0.424455
+vt 0.462086 0.428585
+vt 0.453814 0.428584
+vt 0.470359 0.424456
+vt 0.470358 0.428585
+vt 0.445543 0.424455
+vt 0.445543 0.428584
+vt 0.486902 0.420328
+vt 0.478631 0.420328
+vt 0.478631 0.416199
+vt 0.486903 0.416199
+vt 0.495175 0.416200
+vt 0.495174 0.420329
+vt 0.503446 0.416200
+vt 0.503446 0.420329
+vt 0.495173 0.424458
+vt 0.486902 0.424457
+vt 0.495173 0.428587
+vt 0.486901 0.428586
+vt 0.503445 0.424458
+vt 0.503444 0.428587
+vt 0.478630 0.424457
+vt 0.478630 0.428586
+vt 0.519988 0.420330
+vt 0.511717 0.420330
+vt 0.511718 0.416201
+vt 0.519989 0.416201
+vt 0.528261 0.416202
+vt 0.528260 0.420331
+vt 0.536532 0.416203
+vt 0.536531 0.420332
+vt 0.528259 0.424460
+vt 0.519988 0.424460
+vt 0.528259 0.428589
+vt 0.519987 0.428589
+vt 0.536531 0.424461
+vt 0.536530 0.428590
+vt 0.511716 0.424459
+vt 0.511716 0.428588
+vt 0.553074 0.420333
+vt 0.544803 0.420332
+vt 0.544803 0.416203
+vt 0.553074 0.416204
+vt 0.561346 0.416204
+vt 0.561345 0.420333
+vt 0.569617 0.416205
+vt 0.569616 0.420334
+vt 0.561345 0.424462
+vt 0.553073 0.424462
+vt 0.561344 0.428591
+vt 0.553073 0.428591
+vt 0.569616 0.424463
+vt 0.569615 0.428592
+vt 0.544802 0.424461
+vt 0.544801 0.428590
+vt 0.586159 0.420335
+vt 0.577888 0.420334
+vt 0.577888 0.416205
+vt 0.586159 0.416206
+vt 0.594430 0.416206
+vt 0.594430 0.420335
+vt 0.602701 0.416207
+vt 0.602701 0.420336
+vt 0.594429 0.424464
+vt 0.586158 0.424464
+vt 0.594429 0.428593
+vt 0.586158 0.428593
+vt 0.602700 0.424465
+vt 0.602700 0.428594
+vt 0.577887 0.424463
+vt 0.577886 0.428592
+vt 0.619243 0.420336
+vt 0.610972 0.420336
+vt 0.610972 0.416207
+vt 0.619243 0.416207
+vt 0.627514 0.416208
+vt 0.627514 0.420337
+vt 0.635785 0.416208
+vt 0.635785 0.420337
+vt 0.627514 0.424466
+vt 0.619243 0.424465
+vt 0.627513 0.428595
+vt 0.619242 0.428594
+vt 0.635785 0.424466
+vt 0.635784 0.428595
+vt 0.610971 0.424465
+vt 0.610971 0.428594
+vt 0.652327 0.420337
+vt 0.644056 0.420337
+vt 0.644056 0.416208
+vt 0.652327 0.416208
+vt 0.660598 0.416209
+vt 0.660598 0.420338
+vt 0.668869 0.416209
+vt 0.668868 0.420338
+vt 0.660597 0.424467
+vt 0.652326 0.424467
+vt 0.660597 0.428596
+vt 0.652326 0.428596
+vt 0.668868 0.424467
+vt 0.668868 0.428596
+vt 0.644055 0.424466
+vt 0.644055 0.428595
+vt 0.685410 0.420338
+vt 0.677139 0.420338
+vt 0.677140 0.416209
+vt 0.685410 0.416209
+vt 0.693681 0.416209
+vt 0.693681 0.420338
+vt 0.701952 0.416209
+vt 0.701952 0.420338
+vt 0.693681 0.424467
+vt 0.685410 0.424467
+vt 0.693681 0.428596
+vt 0.685410 0.428596
+vt 0.701952 0.424467
+vt 0.701952 0.428596
+vt 0.677139 0.424467
+vt 0.677139 0.428596
+vt 0.718494 0.420338
+vt 0.710223 0.420338
+vt 0.710223 0.416209
+vt 0.718494 0.416209
+vt 0.726764 0.416209
+vt 0.726765 0.420338
+vt 0.735035 0.416209
+vt 0.735035 0.420338
+vt 0.726765 0.424467
+vt 0.718494 0.424467
+vt 0.726765 0.428596
+vt 0.718494 0.428596
+vt 0.735036 0.424467
+vt 0.735036 0.428596
+vt 0.710223 0.424467
+vt 0.710223 0.428596
+vt 0.751577 0.420337
+vt 0.743306 0.420338
+vt 0.743306 0.416208
+vt 0.751577 0.416208
+vt 0.759848 0.416208
+vt 0.759848 0.420337
+vt 0.768119 0.416208
+vt 0.768119 0.420337
+vt 0.759848 0.424466
+vt 0.751577 0.424466
+vt 0.759849 0.428595
+vt 0.751578 0.428595
+vt 0.768119 0.424466
+vt 0.768120 0.428595
+vt 0.743307 0.424467
+vt 0.743307 0.428596
+vt 0.784661 0.420336
+vt 0.776390 0.420336
+vt 0.776390 0.416207
+vt 0.784661 0.416207
+vt 0.792932 0.416207
+vt 0.792932 0.420336
+vt 0.801203 0.416206
+vt 0.801203 0.420335
+vt 0.792933 0.424465
+vt 0.784661 0.424465
+vt 0.792933 0.428594
+vt 0.784662 0.428594
+vt 0.801204 0.424464
+vt 0.801204 0.428593
+vt 0.776390 0.424466
+vt 0.776391 0.428595
+vt 0.817745 0.420334
+vt 0.809474 0.420335
+vt 0.809474 0.416206
+vt 0.817745 0.416205
+vt 0.826016 0.416205
+vt 0.826017 0.420334
+vt 0.834287 0.416204
+vt 0.834288 0.420334
+vt 0.826017 0.424463
+vt 0.817746 0.424464
+vt 0.826018 0.428592
+vt 0.817746 0.428593
+vt 0.834288 0.424463
+vt 0.834289 0.428592
+vt 0.809475 0.424464
+vt 0.809475 0.428593
+vt 0.850830 0.420332
+vt 0.842559 0.420333
+vt 0.842558 0.416204
+vt 0.850830 0.416203
+vt 0.859101 0.416203
+vt 0.859102 0.420332
+vt 0.867372 0.416202
+vt 0.867373 0.420331
+vt 0.859102 0.424461
+vt 0.850831 0.424462
+vt 0.859103 0.428590
+vt 0.850831 0.428591
+vt 0.867374 0.424460
+vt 0.867374 0.428590
+vt 0.842560 0.424462
+vt 0.842560 0.428591
+vt 0.883916 0.420330
+vt 0.875644 0.420331
+vt 0.875644 0.416202
+vt 0.883915 0.416201
+vt 0.892186 0.416201
+vt 0.892187 0.420330
+vt 0.900458 0.416200
+vt 0.900459 0.420329
+vt 0.892188 0.424459
+vt 0.883916 0.424459
+vt 0.892188 0.428588
+vt 0.883917 0.428588
+vt 0.900459 0.424458
+vt 0.900460 0.428587
+vt 0.875645 0.424460
+vt 0.875646 0.428589
+vt 0.122935 0.420328
+vt 0.114663 0.420329
+vt 0.114662 0.416200
+vt 0.122934 0.416199
+vt 0.106391 0.420329
+vt 0.106391 0.416200
+vt 0.131206 0.416198
+vt 0.131206 0.420327
+vt 0.139477 0.416198
+vt 0.139478 0.420327
+vt 0.131207 0.424456
+vt 0.122935 0.424457
+vt 0.131208 0.428585
+vt 0.122936 0.428586
+vt 0.139479 0.424456
+vt 0.139479 0.428585
+vt 0.114664 0.424458
+vt 0.106392 0.424458
+vt 0.114664 0.428587
+vt 0.106393 0.428587
+vt 0.156022 0.420326
+vt 0.147750 0.420326
+vt 0.147749 0.416197
+vt 0.156021 0.416197
+vt 0.164293 0.416196
+vt 0.164293 0.420325
+vt 0.172565 0.416196
+vt 0.172565 0.420325
+vt 0.164294 0.424454
+vt 0.156022 0.424455
+vt 0.164294 0.428583
+vt 0.156023 0.428584
+vt 0.172566 0.424454
+vt 0.172566 0.428583
+vt 0.147750 0.424455
+vt 0.147751 0.428584
+vt 0.189109 0.420324
+vt 0.180837 0.420324
+vt 0.180837 0.416195
+vt 0.189108 0.416195
+vt 0.197380 0.416194
+vt 0.197381 0.420323
+vt 0.205653 0.416194
+vt 0.205653 0.420323
+vt 0.197382 0.424452
+vt 0.189110 0.424453
+vt 0.197382 0.428581
+vt 0.189110 0.428582
+vt 0.205653 0.424452
+vt 0.205654 0.428581
+vt 0.180838 0.424453
+vt 0.180838 0.428582
+vt 0.222197 0.420322
+vt 0.213925 0.420323
+vt 0.213925 0.416193
+vt 0.222197 0.416193
+vt 0.230469 0.416193
+vt 0.230469 0.420322
+vt 0.238741 0.416192
+vt 0.238741 0.420322
+vt 0.230470 0.424451
+vt 0.222197 0.424451
+vt 0.230470 0.428580
+vt 0.222198 0.428580
+vt 0.238742 0.424451
+vt 0.238742 0.428580
+vt 0.213925 0.424452
+vt 0.213926 0.428581
+vt 0.255286 0.420321
+vt 0.247013 0.420321
+vt 0.247013 0.416192
+vt 0.255285 0.416192
+vt 0.263557 0.416192
+vt 0.263558 0.420321
+vt 0.271830 0.416192
+vt 0.271830 0.420321
+vt 0.263558 0.424450
+vt 0.255286 0.424450
+vt 0.263558 0.428579
+vt 0.255286 0.428579
+vt 0.271830 0.424450
+vt 0.271830 0.428579
+vt 0.247014 0.424450
+vt 0.247014 0.428579
+vt 0.288374 0.420320
+vt 0.280102 0.420321
+vt 0.280102 0.416191
+vt 0.288374 0.416191
+vt 0.296646 0.416191
+vt 0.296647 0.420320
+vt 0.304919 0.416191
+vt 0.304919 0.420320
+vt 0.296647 0.424449
+vt 0.288374 0.424450
+vt 0.296647 0.428578
+vt 0.288374 0.428579
+vt 0.304919 0.424449
+vt 0.304919 0.428578
+vt 0.280102 0.424450
+vt 0.280102 0.428579
+vt 0.321463 0.420320
+vt 0.313191 0.420320
+vt 0.313191 0.416191
+vt 0.321463 0.416191
+vt 0.329735 0.416192
+vt 0.329735 0.420321
+vt 0.329735 0.424450
+vt 0.321463 0.424450
+vt 0.329735 0.428579
+vt 0.321463 0.428579
+vt 0.313191 0.424449
+vt 0.313191 0.428578
+vt 0.354551 0.436837
+vt 0.346279 0.436837
+vt 0.346279 0.432708
+vt 0.354551 0.432708
+vt 0.338007 0.436837
+vt 0.338007 0.432708
+vt 0.362823 0.432709
+vt 0.362823 0.436838
+vt 0.371095 0.432709
+vt 0.371095 0.436838
+vt 0.362823 0.440967
+vt 0.354551 0.440966
+vt 0.362822 0.445096
+vt 0.354550 0.445095
+vt 0.371095 0.440967
+vt 0.371094 0.445096
+vt 0.346279 0.440966
+vt 0.338007 0.440966
+vt 0.346278 0.445095
+vt 0.338006 0.445095
+vt 0.387639 0.436839
+vt 0.379367 0.436838
+vt 0.379367 0.432709
+vt 0.387639 0.432709
+vt 0.395911 0.432710
+vt 0.395911 0.436839
+vt 0.404183 0.432710
+vt 0.404183 0.436839
+vt 0.395910 0.440968
+vt 0.387638 0.440968
+vt 0.395910 0.445097
+vt 0.387638 0.445097
+vt 0.404182 0.440968
+vt 0.404182 0.445097
+vt 0.379367 0.440967
+vt 0.379366 0.445096
+vt 0.420726 0.436840
+vt 0.412454 0.436840
+vt 0.412455 0.432711
+vt 0.420727 0.432711
+vt 0.428999 0.432712
+vt 0.428998 0.436841
+vt 0.437270 0.432712
+vt 0.437270 0.436841
+vt 0.428998 0.440970
+vt 0.420726 0.440969
+vt 0.428997 0.445099
+vt 0.420725 0.445098
+vt 0.437269 0.440970
+vt 0.437269 0.445099
+vt 0.412454 0.440969
+vt 0.412454 0.445098
+vt 0.453813 0.436842
+vt 0.445542 0.436842
+vt 0.445542 0.432713
+vt 0.453814 0.432713
+vt 0.462086 0.432714
+vt 0.462085 0.436843
+vt 0.470357 0.432714
+vt 0.470357 0.436843
+vt 0.462085 0.440972
+vt 0.453813 0.440971
+vt 0.462084 0.445101
+vt 0.453813 0.445100
+vt 0.470356 0.440972
+vt 0.470356 0.445101
+vt 0.445541 0.440971
+vt 0.445541 0.445100
+vt 0.486900 0.436844
+vt 0.478628 0.436844
+vt 0.478629 0.432715
+vt 0.486901 0.432715
+vt 0.495172 0.432716
+vt 0.495172 0.436845
+vt 0.503444 0.432717
+vt 0.503443 0.436846
+vt 0.495171 0.440974
+vt 0.486900 0.440974
+vt 0.495171 0.445103
+vt 0.486899 0.445103
+vt 0.503443 0.440975
+vt 0.503442 0.445104
+vt 0.478628 0.440973
+vt 0.478628 0.445102
+vt 0.519986 0.436847
+vt 0.511715 0.436846
+vt 0.511715 0.432717
+vt 0.519987 0.432718
+vt 0.528258 0.432718
+vt 0.528258 0.436847
+vt 0.536530 0.432719
+vt 0.536529 0.436848
+vt 0.528257 0.440976
+vt 0.519986 0.440976
+vt 0.528257 0.445105
+vt 0.519985 0.445105
+vt 0.536529 0.440977
+vt 0.536528 0.445106
+vt 0.511714 0.440975
+vt 0.511714 0.445104
+vt 0.553072 0.436849
+vt 0.544800 0.436848
+vt 0.544801 0.432719
+vt 0.553072 0.432720
+vt 0.561344 0.432720
+vt 0.561343 0.436850
+vt 0.569615 0.432721
+vt 0.569614 0.436850
+vt 0.561343 0.440979
+vt 0.553071 0.440978
+vt 0.561342 0.445108
+vt 0.553071 0.445107
+vt 0.569614 0.440979
+vt 0.569614 0.445108
+vt 0.544800 0.440977
+vt 0.544799 0.445107
+vt 0.586157 0.436851
+vt 0.577886 0.436851
+vt 0.577886 0.432721
+vt 0.586157 0.432722
+vt 0.594428 0.432722
+vt 0.594428 0.436851
+vt 0.602700 0.432723
+vt 0.602699 0.436852
+vt 0.594428 0.440980
+vt 0.586156 0.440980
+vt 0.594427 0.445110
+vt 0.586156 0.445109
+vt 0.602699 0.440981
+vt 0.602698 0.445110
+vt 0.577885 0.440980
+vt 0.577885 0.445109
+vt 0.619241 0.436853
+vt 0.610970 0.436852
+vt 0.610971 0.432723
+vt 0.619242 0.432724
+vt 0.627513 0.432724
+vt 0.627513 0.436853
+vt 0.635784 0.432724
+vt 0.635784 0.436853
+vt 0.627512 0.440982
+vt 0.619241 0.440982
+vt 0.627512 0.445111
+vt 0.619241 0.445111
+vt 0.635783 0.440982
+vt 0.635783 0.445111
+vt 0.610970 0.440981
+vt 0.610970 0.445110
+vt 0.652326 0.436854
+vt 0.644055 0.436853
+vt 0.644055 0.432724
+vt 0.652326 0.432725
+vt 0.660597 0.432725
+vt 0.660597 0.436854
+vt 0.668868 0.432725
+vt 0.668868 0.436854
+vt 0.660597 0.440983
+vt 0.652326 0.440983
+vt 0.660597 0.445112
+vt 0.652325 0.445112
+vt 0.668868 0.440983
+vt 0.668868 0.445112
+vt 0.644055 0.440983
+vt 0.644054 0.445112
+vt 0.685410 0.436854
+vt 0.677139 0.436854
+vt 0.677139 0.432725
+vt 0.685410 0.432725
+vt 0.693681 0.432725
+vt 0.693681 0.436854
+vt 0.701952 0.432725
+vt 0.701952 0.436854
+vt 0.693681 0.440983
+vt 0.685410 0.440983
+vt 0.693681 0.445112
+vt 0.685410 0.445112
+vt 0.701952 0.440983
+vt 0.701952 0.445112
+vt 0.677139 0.440983
+vt 0.677139 0.445112
+vt 0.718494 0.436854
+vt 0.710223 0.436854
+vt 0.710223 0.432725
+vt 0.718494 0.432725
+vt 0.726765 0.432725
+vt 0.726765 0.436854
+vt 0.735036 0.432725
+vt 0.735036 0.436854
+vt 0.726765 0.440983
+vt 0.718494 0.440983
+vt 0.726765 0.445112
+vt 0.718494 0.445112
+vt 0.735036 0.440983
+vt 0.735036 0.445112
+vt 0.710223 0.440983
+vt 0.710223 0.445112
+vt 0.751578 0.436854
+vt 0.743307 0.436854
+vt 0.743307 0.432725
+vt 0.751578 0.432725
+vt 0.759849 0.432724
+vt 0.759849 0.436853
+vt 0.768120 0.432724
+vt 0.768120 0.436853
+vt 0.759849 0.440982
+vt 0.751578 0.440983
+vt 0.759850 0.445111
+vt 0.751579 0.445112
+vt 0.768121 0.440982
+vt 0.768121 0.445111
+vt 0.743307 0.440983
+vt 0.743307 0.445112
+vt 0.784663 0.436852
+vt 0.776391 0.436853
+vt 0.776391 0.432724
+vt 0.784662 0.432723
+vt 0.792933 0.432723
+vt 0.792934 0.436852
+vt 0.801205 0.432723
+vt 0.801205 0.436852
+vt 0.792934 0.440981
+vt 0.784663 0.440982
+vt 0.792934 0.445110
+vt 0.784663 0.445111
+vt 0.801205 0.440981
+vt 0.801206 0.445110
+vt 0.776392 0.440982
+vt 0.776392 0.445111
+vt 0.817747 0.436851
+vt 0.809476 0.436851
+vt 0.809476 0.432722
+vt 0.817747 0.432722
+vt 0.826018 0.432721
+vt 0.826019 0.436850
+vt 0.834289 0.432721
+vt 0.834290 0.436850
+vt 0.826019 0.440979
+vt 0.817748 0.440980
+vt 0.826019 0.445108
+vt 0.817748 0.445109
+vt 0.834290 0.440979
+vt 0.834291 0.445108
+vt 0.809476 0.440980
+vt 0.809477 0.445109
+vt 0.850832 0.436849
+vt 0.842561 0.436849
+vt 0.842561 0.432720
+vt 0.850832 0.432720
+vt 0.859103 0.432719
+vt 0.859104 0.436848
+vt 0.867375 0.432719
+vt 0.867375 0.436848
+vt 0.859104 0.440977
+vt 0.850833 0.440978
+vt 0.859105 0.445106
+vt 0.850833 0.445107
+vt 0.867376 0.440977
+vt 0.867376 0.445106
+vt 0.842562 0.440978
+vt 0.842562 0.445107
+vt 0.883918 0.436847
+vt 0.875647 0.436847
+vt 0.875646 0.432718
+vt 0.883918 0.432717
+vt 0.892189 0.432717
+vt 0.892190 0.436846
+vt 0.900460 0.432716
+vt 0.900461 0.436845
+vt 0.892190 0.440975
+vt 0.883919 0.440976
+vt 0.892190 0.445104
+vt 0.883919 0.445105
+vt 0.900461 0.440974
+vt 0.900462 0.445104
+vt 0.875647 0.440976
+vt 0.875648 0.445105
+vt 0.122937 0.436844
+vt 0.114665 0.436845
+vt 0.114665 0.432716
+vt 0.122936 0.432715
+vt 0.106394 0.436845
+vt 0.106393 0.432716
+vt 0.131208 0.432715
+vt 0.131209 0.436844
+vt 0.139480 0.432714
+vt 0.139480 0.436843
+vt 0.131209 0.440973
+vt 0.122938 0.440973
+vt 0.131210 0.445102
+vt 0.122938 0.445102
+vt 0.139481 0.440972
+vt 0.139481 0.445101
+vt 0.114666 0.440974
+vt 0.106394 0.440974
+vt 0.114666 0.445103
+vt 0.106395 0.445104
+vt 0.156024 0.436842
+vt 0.147752 0.436843
+vt 0.147751 0.432713
+vt 0.156023 0.432713
+vt 0.164295 0.432712
+vt 0.164295 0.436841
+vt 0.172567 0.432712
+vt 0.172567 0.436841
+vt 0.164296 0.440971
+vt 0.156024 0.440971
+vt 0.164296 0.445100
+vt 0.156025 0.445100
+vt 0.172568 0.440970
+vt 0.172568 0.445099
+vt 0.147752 0.440972
+vt 0.147753 0.445101
+vt 0.189111 0.436840
+vt 0.180839 0.436841
+vt 0.180839 0.432711
+vt 0.189110 0.432711
+vt 0.197382 0.432711
+vt 0.197383 0.436840
+vt 0.205654 0.432710
+vt 0.205655 0.436839
+vt 0.197383 0.440969
+vt 0.189111 0.440969
+vt 0.197383 0.445098
+vt 0.189112 0.445098
+vt 0.205655 0.440968
+vt 0.205655 0.445097
+vt 0.180839 0.440970
+vt 0.180840 0.445099
+vt 0.222199 0.436838
+vt 0.213927 0.436839
+vt 0.213926 0.432710
+vt 0.222198 0.432709
+vt 0.230470 0.432709
+vt 0.230470 0.436838
+vt 0.238742 0.432709
+vt 0.238742 0.436838
+vt 0.230471 0.440967
+vt 0.222199 0.440968
+vt 0.230471 0.445096
+vt 0.222199 0.445097
+vt 0.238743 0.440967
+vt 0.238743 0.445096
+vt 0.213927 0.440968
+vt 0.213927 0.445097
+vt 0.255286 0.436837
+vt 0.247014 0.436838
+vt 0.247014 0.432708
+vt 0.255286 0.432708
+vt 0.263558 0.432708
+vt 0.263558 0.436837
+vt 0.271830 0.432708
+vt 0.271830 0.436837
+vt 0.263559 0.440966
+vt 0.255287 0.440966
+vt 0.263559 0.445095
+vt 0.255287 0.445095
+vt 0.271831 0.440966
+vt 0.271831 0.445095
+vt 0.247015 0.440967
+vt 0.247015 0.445096
+vt 0.288375 0.436837
+vt 0.280103 0.436837
+vt 0.280102 0.432708
+vt 0.288374 0.432708
+vt 0.296647 0.432708
+vt 0.296647 0.436837
+vt 0.304919 0.432708
+vt 0.304919 0.436837
+vt 0.296647 0.440966
+vt 0.288375 0.440966
+vt 0.296647 0.445095
+vt 0.288375 0.445095
+vt 0.304919 0.440966
+vt 0.304919 0.445095
+vt 0.280103 0.440966
+vt 0.280103 0.445095
+vt 0.321463 0.436837
+vt 0.313191 0.436837
+vt 0.313191 0.432708
+vt 0.321463 0.432708
+vt 0.329735 0.432708
+vt 0.329735 0.436837
+vt 0.329735 0.440966
+vt 0.321463 0.440966
+vt 0.329735 0.445095
+vt 0.321463 0.445095
+vt 0.313191 0.440966
+vt 0.313191 0.445095
+vt 0.354550 0.453354
+vt 0.346278 0.453353
+vt 0.346278 0.449224
+vt 0.354550 0.449225
+vt 0.338006 0.453353
+vt 0.338006 0.449224
+vt 0.362822 0.449225
+vt 0.362822 0.453354
+vt 0.371094 0.449225
+vt 0.371094 0.453354
+vt 0.362822 0.457483
+vt 0.354550 0.457483
+vt 0.362822 0.461612
+vt 0.354550 0.461612
+vt 0.371094 0.457483
+vt 0.371093 0.461612
+vt 0.346278 0.457482
+vt 0.338006 0.457482
+vt 0.346278 0.461612
+vt 0.338006 0.461611
+vt 0.387638 0.453355
+vt 0.379366 0.453354
+vt 0.379366 0.449225
+vt 0.387638 0.449226
+vt 0.395910 0.449226
+vt 0.395909 0.453355
+vt 0.404182 0.449227
+vt 0.404181 0.453356
+vt 0.395909 0.457484
+vt 0.387637 0.457484
+vt 0.395909 0.461613
+vt 0.387637 0.461613
+vt 0.404181 0.457485
+vt 0.404181 0.461614
+vt 0.379365 0.457484
+vt 0.379365 0.461613
+vt 0.420725 0.453356
+vt 0.412453 0.453356
+vt 0.412453 0.449227
+vt 0.420725 0.449227
+vt 0.428997 0.449228
+vt 0.428997 0.453357
+vt 0.437269 0.449228
+vt 0.437268 0.453357
+vt 0.428996 0.457486
+vt 0.420724 0.457485
+vt 0.428996 0.461615
+vt 0.420724 0.461615
+vt 0.437268 0.457486
+vt 0.437268 0.461616
+vt 0.412453 0.457485
+vt 0.412452 0.461614
+vt 0.453812 0.453358
+vt 0.445540 0.453358
+vt 0.445540 0.449229
+vt 0.453812 0.449229
+vt 0.462084 0.449230
+vt 0.462083 0.453359
+vt 0.470355 0.449231
+vt 0.470355 0.453360
+vt 0.462083 0.457488
+vt 0.453811 0.457488
+vt 0.462083 0.461617
+vt 0.453811 0.461617
+vt 0.470355 0.457489
+vt 0.470354 0.461618
+vt 0.445540 0.457487
+vt 0.445539 0.461616
+vt 0.486898 0.453361
+vt 0.478627 0.453360
+vt 0.478627 0.449231
+vt 0.486899 0.449232
+vt 0.495170 0.449232
+vt 0.495170 0.453361
+vt 0.503442 0.449233
+vt 0.503441 0.453362
+vt 0.495169 0.457490
+vt 0.486898 0.457490
+vt 0.495169 0.461619
+vt 0.486897 0.461619
+vt 0.503441 0.457491
+vt 0.503440 0.461620
+vt 0.478626 0.457489
+vt 0.478626 0.461618
+vt 0.519984 0.453363
+vt 0.511713 0.453363
+vt 0.511713 0.449233
+vt 0.519985 0.449234
+vt 0.528256 0.449235
+vt 0.528256 0.453364
+vt 0.536528 0.449235
+vt 0.536527 0.453364
+vt 0.528255 0.457493
+vt 0.519984 0.457492
+vt 0.528255 0.461622
+vt 0.519984 0.461621
+vt 0.536527 0.457493
+vt 0.536526 0.461622
+vt 0.511712 0.457492
+vt 0.511712 0.461621
+vt 0.553070 0.453365
+vt 0.544799 0.453365
+vt 0.544799 0.449236
+vt 0.553070 0.449236
+vt 0.561342 0.449237
+vt 0.561341 0.453366
+vt 0.569613 0.449237
+vt 0.569613 0.453366
+vt 0.561341 0.457495
+vt 0.553070 0.457494
+vt 0.561341 0.461624
+vt 0.553069 0.461623
+vt 0.569612 0.457495
+vt 0.569612 0.461624
+vt 0.544798 0.457494
+vt 0.544798 0.461623
+vt 0.586155 0.453367
+vt 0.577884 0.453367
+vt 0.577884 0.449238
+vt 0.586156 0.449238
+vt 0.594427 0.449239
+vt 0.594427 0.453368
+vt 0.602698 0.449239
+vt 0.602698 0.453368
+vt 0.594426 0.457497
+vt 0.586155 0.457496
+vt 0.594426 0.461626
+vt 0.586155 0.461625
+vt 0.602698 0.457497
+vt 0.602697 0.461626
+vt 0.577884 0.457496
+vt 0.577883 0.461625
+vt 0.619240 0.453369
+vt 0.610969 0.453368
+vt 0.610969 0.449239
+vt 0.619241 0.449240
+vt 0.627512 0.449240
+vt 0.627512 0.453369
+vt 0.635783 0.449240
+vt 0.635783 0.453369
+vt 0.627511 0.457498
+vt 0.619240 0.457498
+vt 0.627511 0.461627
+vt 0.619240 0.461627
+vt 0.635783 0.457499
+vt 0.635782 0.461628
+vt 0.610969 0.457498
+vt 0.610969 0.461627
+vt 0.652325 0.453370
+vt 0.644054 0.453370
+vt 0.644054 0.449241
+vt 0.652325 0.449241
+vt 0.660596 0.449241
+vt 0.660596 0.453370
+vt 0.668868 0.449241
+vt 0.668867 0.453370
+vt 0.660596 0.457499
+vt 0.652325 0.457499
+vt 0.660596 0.461628
+vt 0.652325 0.461628
+vt 0.668867 0.457499
+vt 0.668867 0.461628
+vt 0.644054 0.457499
+vt 0.644054 0.461628
+vt 0.685410 0.453371
+vt 0.677139 0.453370
+vt 0.677139 0.449241
+vt 0.685410 0.449241
+vt 0.693681 0.449242
+vt 0.693681 0.453371
+vt 0.701952 0.449242
+vt 0.701952 0.453371
+vt 0.693681 0.457500
+vt 0.685410 0.457500
+vt 0.693681 0.461629
+vt 0.685410 0.461629
+vt 0.701952 0.457500
+vt 0.701952 0.461629
+vt 0.677139 0.457500
+vt 0.677138 0.461629
+vt 0.718494 0.453371
+vt 0.710223 0.453371
+vt 0.710223 0.449242
+vt 0.718494 0.449241
+vt 0.726765 0.449241
+vt 0.726765 0.453370
+vt 0.735036 0.449241
+vt 0.735037 0.453370
+vt 0.726766 0.457500
+vt 0.718494 0.457500
+vt 0.726766 0.461629
+vt 0.718494 0.461629
+vt 0.735037 0.457499
+vt 0.735037 0.461628
+vt 0.710223 0.457500
+vt 0.710223 0.461629
+vt 0.751579 0.453370
+vt 0.743308 0.453370
+vt 0.743308 0.449241
+vt 0.751579 0.449241
+vt 0.759850 0.449241
+vt 0.759850 0.453370
+vt 0.768121 0.449240
+vt 0.768121 0.453369
+vt 0.759850 0.457499
+vt 0.751579 0.457499
+vt 0.759851 0.461628
+vt 0.751579 0.461628
+vt 0.768121 0.457498
+vt 0.768122 0.461627
+vt 0.743308 0.457499
+vt 0.743308 0.461628
+vt 0.784664 0.453369
+vt 0.776392 0.453369
+vt 0.776392 0.449240
+vt 0.784663 0.449240
+vt 0.792935 0.449239
+vt 0.792935 0.453368
+vt 0.801206 0.449239
+vt 0.801206 0.453368
+vt 0.792935 0.457497
+vt 0.784664 0.457498
+vt 0.792935 0.461626
+vt 0.784664 0.461627
+vt 0.801207 0.457497
+vt 0.801207 0.461626
+vt 0.776393 0.457498
+vt 0.776393 0.461627
+vt 0.817749 0.453367
+vt 0.809478 0.453368
+vt 0.809477 0.449238
+vt 0.817748 0.449238
+vt 0.826020 0.449238
+vt 0.826020 0.453367
+vt 0.834291 0.449237
+vt 0.834291 0.453366
+vt 0.826020 0.457496
+vt 0.817749 0.457496
+vt 0.826021 0.461625
+vt 0.817750 0.461625
+vt 0.834292 0.457495
+vt 0.834292 0.461624
+vt 0.809478 0.457497
+vt 0.809478 0.461626
+vt 0.850834 0.453365
+vt 0.842563 0.453366
+vt 0.842562 0.449237
+vt 0.850834 0.449236
+vt 0.859105 0.449235
+vt 0.859106 0.453364
+vt 0.867377 0.449235
+vt 0.867377 0.453364
+vt 0.859106 0.457494
+vt 0.850835 0.457494
+vt 0.859106 0.461623
+vt 0.850835 0.461623
+vt 0.867377 0.457493
+vt 0.867378 0.461622
+vt 0.842563 0.457495
+vt 0.842564 0.461624
+vt 0.883920 0.453363
+vt 0.875648 0.453363
+vt 0.875648 0.449234
+vt 0.883919 0.449234
+vt 0.892191 0.449233
+vt 0.892191 0.453362
+vt 0.900462 0.449233
+vt 0.900463 0.453362
+vt 0.892192 0.457491
+vt 0.883920 0.457492
+vt 0.892192 0.461620
+vt 0.883921 0.461621
+vt 0.900463 0.457491
+vt 0.900464 0.461620
+vt 0.875649 0.457492
+vt 0.875649 0.461621
+vt 0.122939 0.453360
+vt 0.114667 0.453361
+vt 0.114667 0.449232
+vt 0.122938 0.449231
+vt 0.106396 0.453362
+vt 0.106395 0.449233
+vt 0.131210 0.449231
+vt 0.131210 0.453360
+vt 0.139482 0.449230
+vt 0.139482 0.453359
+vt 0.131211 0.457489
+vt 0.122939 0.457490
+vt 0.131211 0.461618
+vt 0.122940 0.461619
+vt 0.139482 0.457488
+vt 0.139483 0.461617
+vt 0.114668 0.457490
+vt 0.106396 0.457491
+vt 0.114668 0.461619
+vt 0.106397 0.461620
+vt 0.156025 0.453358
+vt 0.147754 0.453359
+vt 0.147753 0.449230
+vt 0.156025 0.449229
+vt 0.164297 0.449229
+vt 0.164297 0.453358
+vt 0.172568 0.449228
+vt 0.172569 0.453357
+vt 0.164298 0.457487
+vt 0.156026 0.457487
+vt 0.164298 0.461616
+vt 0.156026 0.461616
+vt 0.172569 0.457486
+vt 0.172570 0.461615
+vt 0.147754 0.457488
+vt 0.147755 0.461617
+vt 0.189112 0.453356
+vt 0.180841 0.453357
+vt 0.180840 0.449228
+vt 0.189112 0.449227
+vt 0.197384 0.449227
+vt 0.197384 0.453356
+vt 0.205656 0.449226
+vt 0.205656 0.453355
+vt 0.197384 0.457485
+vt 0.189113 0.457485
+vt 0.197385 0.461614
+vt 0.189113 0.461614
+vt 0.205656 0.457485
+vt 0.205657 0.461614
+vt 0.180841 0.457486
+vt 0.180841 0.461615
+vt 0.222200 0.453355
+vt 0.213928 0.453355
+vt 0.213928 0.449226
+vt 0.222199 0.449226
+vt 0.230471 0.449225
+vt 0.230471 0.453354
+vt 0.238743 0.449225
+vt 0.238743 0.453354
+vt 0.230472 0.457483
+vt 0.222200 0.457484
+vt 0.230472 0.461613
+vt 0.222200 0.461613
+vt 0.238744 0.457483
+vt 0.238744 0.461612
+vt 0.213928 0.457484
+vt 0.213928 0.461613
+vt 0.255287 0.453354
+vt 0.247015 0.453354
+vt 0.247015 0.449225
+vt 0.255287 0.449225
+vt 0.263559 0.449224
+vt 0.263559 0.453353
+vt 0.271831 0.449224
+vt 0.271831 0.453353
+vt 0.263559 0.457482
+vt 0.255287 0.457483
+vt 0.263559 0.461612
+vt 0.255287 0.461612
+vt 0.271831 0.457482
+vt 0.271831 0.461611
+vt 0.247015 0.457483
+vt 0.247016 0.461612
+vt 0.288375 0.453353
+vt 0.280103 0.453353
+vt 0.280103 0.449224
+vt 0.288375 0.449224
+vt 0.296647 0.449224
+vt 0.296647 0.453353
+vt 0.304919 0.449224
+vt 0.304919 0.453353
+vt 0.296647 0.457482
+vt 0.288375 0.457482
+vt 0.296647 0.461611
+vt 0.288375 0.461611
+vt 0.304919 0.457482
+vt 0.304919 0.461611
+vt 0.280103 0.457482
+vt 0.280103 0.461611
+vt 0.321462 0.453353
+vt 0.313191 0.453353
+vt 0.313191 0.449224
+vt 0.321463 0.449224
+vt 0.329734 0.449224
+vt 0.329734 0.453353
+vt 0.329734 0.457482
+vt 0.321462 0.457482
+vt 0.329734 0.461611
+vt 0.321462 0.461611
+vt 0.313191 0.457482
+vt 0.313191 0.461611
+vt 0.354549 0.469870
+vt 0.346278 0.469870
+vt 0.346278 0.465741
+vt 0.354550 0.465741
+vt 0.338006 0.469869
+vt 0.338006 0.465740
+vt 0.362821 0.465741
+vt 0.362821 0.469870
+vt 0.371093 0.465741
+vt 0.371093 0.469870
+vt 0.362821 0.473999
+vt 0.354549 0.473999
+vt 0.362821 0.478128
+vt 0.354549 0.478128
+vt 0.371093 0.473999
+vt 0.371093 0.478129
+vt 0.346278 0.473999
+vt 0.338006 0.473999
+vt 0.346277 0.478128
+vt 0.338006 0.478128
+vt 0.387637 0.469871
+vt 0.379365 0.469871
+vt 0.379365 0.465742
+vt 0.387637 0.465742
+vt 0.395909 0.465742
+vt 0.395908 0.469871
+vt 0.404180 0.465743
+vt 0.404180 0.469872
+vt 0.395908 0.474000
+vt 0.387636 0.474000
+vt 0.395908 0.478130
+vt 0.387636 0.478129
+vt 0.404180 0.474001
+vt 0.404180 0.478130
+vt 0.379365 0.474000
+vt 0.379364 0.478129
+vt 0.420724 0.469873
+vt 0.412452 0.469872
+vt 0.412452 0.465743
+vt 0.420724 0.465744
+vt 0.428996 0.465744
+vt 0.428995 0.469873
+vt 0.437267 0.465745
+vt 0.437267 0.469874
+vt 0.428995 0.474002
+vt 0.420723 0.474002
+vt 0.428995 0.478131
+vt 0.420723 0.478131
+vt 0.437267 0.474003
+vt 0.437266 0.478132
+vt 0.412452 0.474001
+vt 0.412451 0.478130
+vt 0.453810 0.469875
+vt 0.445539 0.469874
+vt 0.445539 0.465745
+vt 0.453811 0.465746
+vt 0.462082 0.465746
+vt 0.462082 0.469875
+vt 0.470354 0.465747
+vt 0.470354 0.469876
+vt 0.462082 0.474004
+vt 0.453810 0.474004
+vt 0.462081 0.478133
+vt 0.453810 0.478133
+vt 0.470353 0.474005
+vt 0.470353 0.478134
+vt 0.445538 0.474003
+vt 0.445538 0.478132
+vt 0.486897 0.469877
+vt 0.478625 0.469876
+vt 0.478625 0.465747
+vt 0.486897 0.465748
+vt 0.495169 0.465749
+vt 0.495168 0.469878
+vt 0.503440 0.465749
+vt 0.503440 0.469878
+vt 0.495168 0.474007
+vt 0.486896 0.474006
+vt 0.495168 0.478136
+vt 0.486896 0.478135
+vt 0.503439 0.474007
+vt 0.503439 0.478136
+vt 0.478625 0.474005
+vt 0.478624 0.478135
+vt 0.519983 0.469879
+vt 0.511711 0.469879
+vt 0.511712 0.465750
+vt 0.519983 0.465750
+vt 0.528255 0.465751
+vt 0.528254 0.469880
+vt 0.536526 0.465751
+vt 0.536526 0.469880
+vt 0.528254 0.474009
+vt 0.519982 0.474008
+vt 0.528254 0.478138
+vt 0.519982 0.478137
+vt 0.536525 0.474010
+vt 0.536525 0.478139
+vt 0.511711 0.474008
+vt 0.511711 0.478137
+vt 0.553069 0.469882
+vt 0.544797 0.469881
+vt 0.544798 0.465752
+vt 0.553069 0.465752
+vt 0.561340 0.465753
+vt 0.561340 0.469882
+vt 0.569612 0.465753
+vt 0.569611 0.469882
+vt 0.561340 0.474011
+vt 0.553068 0.474011
+vt 0.561339 0.478140
+vt 0.553068 0.478140
+vt 0.569611 0.474012
+vt 0.569611 0.478141
+vt 0.544797 0.474010
+vt 0.544796 0.478139
+vt 0.586154 0.469883
+vt 0.577883 0.469883
+vt 0.577883 0.465754
+vt 0.586154 0.465754
+vt 0.594426 0.465755
+vt 0.594426 0.469884
+vt 0.602697 0.465755
+vt 0.602697 0.469884
+vt 0.594425 0.474013
+vt 0.586154 0.474013
+vt 0.594425 0.478142
+vt 0.586154 0.478142
+vt 0.602697 0.474013
+vt 0.602696 0.478142
+vt 0.577883 0.474012
+vt 0.577882 0.478141
+vt 0.619239 0.469885
+vt 0.610968 0.469885
+vt 0.610968 0.465756
+vt 0.619240 0.465756
+vt 0.627511 0.465756
+vt 0.627511 0.469885
+vt 0.635782 0.465757
+vt 0.635782 0.469886
+vt 0.627511 0.474015
+vt 0.619239 0.474014
+vt 0.627510 0.478144
+vt 0.619239 0.478143
+vt 0.635782 0.474015
+vt 0.635782 0.478144
+vt 0.610968 0.474014
+vt 0.610968 0.478143
+vt 0.652325 0.469886
+vt 0.644053 0.469886
+vt 0.644053 0.465757
+vt 0.652325 0.465757
+vt 0.660596 0.465757
+vt 0.660596 0.469886
+vt 0.668867 0.465758
+vt 0.668867 0.469887
+vt 0.660596 0.474016
+vt 0.652324 0.474015
+vt 0.660596 0.478145
+vt 0.652324 0.478144
+vt 0.668867 0.474016
+vt 0.668867 0.478145
+vt 0.644053 0.474015
+vt 0.644053 0.478144
+vt 0.685410 0.469887
+vt 0.677138 0.469887
+vt 0.677138 0.465758
+vt 0.685410 0.465758
+vt 0.693681 0.465758
+vt 0.693681 0.469887
+vt 0.701952 0.465758
+vt 0.701952 0.469887
+vt 0.693681 0.474016
+vt 0.685410 0.474016
+vt 0.693681 0.478145
+vt 0.685410 0.478145
+vt 0.701952 0.474016
+vt 0.701952 0.478145
+vt 0.677138 0.474016
+vt 0.677138 0.478145
+vt 0.718495 0.469887
+vt 0.710223 0.469887
+vt 0.710223 0.465758
+vt 0.718495 0.465758
+vt 0.726766 0.465758
+vt 0.726766 0.469887
+vt 0.735037 0.465758
+vt 0.735037 0.469887
+vt 0.726766 0.474016
+vt 0.718495 0.474016
+vt 0.726766 0.478145
+vt 0.718495 0.478145
+vt 0.735037 0.474016
+vt 0.735037 0.478145
+vt 0.710223 0.474016
+vt 0.710223 0.478145
+vt 0.751580 0.469886
+vt 0.743308 0.469886
+vt 0.743308 0.465757
+vt 0.751579 0.465757
+vt 0.759851 0.465757
+vt 0.759851 0.469886
+vt 0.768122 0.465757
+vt 0.768122 0.469886
+vt 0.759851 0.474015
+vt 0.751580 0.474015
+vt 0.759851 0.478144
+vt 0.751580 0.478144
+vt 0.768122 0.474015
+vt 0.768122 0.478144
+vt 0.743308 0.474015
+vt 0.743309 0.478145
+vt 0.784665 0.469885
+vt 0.776393 0.469885
+vt 0.776393 0.465756
+vt 0.784664 0.465756
+vt 0.792936 0.465756
+vt 0.792936 0.469885
+vt 0.801207 0.465755
+vt 0.801207 0.469884
+vt 0.792936 0.474014
+vt 0.784665 0.474014
+vt 0.792937 0.478143
+vt 0.784665 0.478143
+vt 0.801208 0.474013
+vt 0.801208 0.478142
+vt 0.776394 0.474014
+vt 0.776394 0.478143
+vt 0.817750 0.469883
+vt 0.809479 0.469884
+vt 0.809479 0.465755
+vt 0.817750 0.465754
+vt 0.826021 0.465754
+vt 0.826021 0.469883
+vt 0.834292 0.465753
+vt 0.834293 0.469882
+vt 0.826022 0.474012
+vt 0.817750 0.474012
+vt 0.826022 0.478141
+vt 0.817751 0.478141
+vt 0.834293 0.474011
+vt 0.834293 0.478140
+vt 0.809479 0.474013
+vt 0.809479 0.478142
+vt 0.850836 0.469881
+vt 0.842564 0.469882
+vt 0.842564 0.465753
+vt 0.850835 0.465752
+vt 0.859107 0.465752
+vt 0.859107 0.469881
+vt 0.867378 0.465751
+vt 0.867378 0.469880
+vt 0.859107 0.474010
+vt 0.850836 0.474010
+vt 0.859108 0.478139
+vt 0.850836 0.478139
+vt 0.867379 0.474009
+vt 0.867379 0.478138
+vt 0.842565 0.474011
+vt 0.842565 0.478140
+vt 0.883921 0.469879
+vt 0.875650 0.469880
+vt 0.875650 0.465751
+vt 0.883921 0.465750
+vt 0.892193 0.465749
+vt 0.892193 0.469878
+vt 0.900464 0.465749
+vt 0.900464 0.469878
+vt 0.892193 0.474008
+vt 0.883922 0.474008
+vt 0.892194 0.478137
+vt 0.883922 0.478137
+vt 0.900465 0.474007
+vt 0.900465 0.478136
+vt 0.875650 0.474009
+vt 0.875651 0.478138
+vt 0.122940 0.469877
+vt 0.114669 0.469877
+vt 0.114668 0.465748
+vt 0.122940 0.465748
+vt 0.106397 0.469878
+vt 0.106397 0.465749
+vt 0.131212 0.465747
+vt 0.131212 0.469876
+vt 0.139483 0.465747
+vt 0.139484 0.469876
+vt 0.131212 0.474005
+vt 0.122941 0.474006
+vt 0.131213 0.478134
+vt 0.122941 0.478135
+vt 0.139484 0.474005
+vt 0.139484 0.478134
+vt 0.114669 0.474006
+vt 0.106398 0.474007
+vt 0.114670 0.478135
+vt 0.106398 0.478136
+vt 0.156027 0.469875
+vt 0.147755 0.469875
+vt 0.147755 0.465746
+vt 0.156027 0.465745
+vt 0.164298 0.465745
+vt 0.164299 0.469874
+vt 0.172570 0.465744
+vt 0.172570 0.469874
+vt 0.164299 0.474003
+vt 0.156027 0.474004
+vt 0.164299 0.478132
+vt 0.156028 0.478133
+vt 0.172571 0.474003
+vt 0.172571 0.478132
+vt 0.147756 0.474004
+vt 0.147756 0.478133
+vt 0.189114 0.469873
+vt 0.180842 0.469873
+vt 0.180842 0.465744
+vt 0.189113 0.465743
+vt 0.197385 0.465743
+vt 0.197385 0.469872
+vt 0.205657 0.465743
+vt 0.205657 0.469872
+vt 0.197386 0.474001
+vt 0.189114 0.474002
+vt 0.197386 0.478130
+vt 0.189114 0.478131
+vt 0.205657 0.474001
+vt 0.205658 0.478130
+vt 0.180842 0.474002
+vt 0.180842 0.478131
+vt 0.222201 0.469871
+vt 0.213929 0.469871
+vt 0.213929 0.465742
+vt 0.222200 0.465742
+vt 0.230472 0.465742
+vt 0.230472 0.469871
+vt 0.238744 0.465741
+vt 0.238744 0.469870
+vt 0.230473 0.474000
+vt 0.222201 0.474000
+vt 0.230473 0.478129
+vt 0.222201 0.478129
+vt 0.238744 0.473999
+vt 0.238744 0.478128
+vt 0.213929 0.474000
+vt 0.213929 0.478130
+vt 0.255288 0.469870
+vt 0.247016 0.469870
+vt 0.247016 0.465741
+vt 0.255288 0.465741
+vt 0.263559 0.465741
+vt 0.263560 0.469870
+vt 0.271831 0.465740
+vt 0.271831 0.469869
+vt 0.263560 0.473999
+vt 0.255288 0.473999
+vt 0.263560 0.478128
+vt 0.255288 0.478128
+vt 0.271831 0.473999
+vt 0.271832 0.478128
+vt 0.247016 0.473999
+vt 0.247016 0.478128
+vt 0.288375 0.469869
+vt 0.280103 0.469869
+vt 0.280103 0.465740
+vt 0.288375 0.465740
+vt 0.296647 0.465740
+vt 0.296647 0.469869
+vt 0.304919 0.465740
+vt 0.304919 0.469869
+vt 0.296647 0.473998
+vt 0.288375 0.473998
+vt 0.296647 0.478127
+vt 0.288375 0.478127
+vt 0.304919 0.473998
+vt 0.304919 0.478127
+vt 0.280103 0.473998
+vt 0.280103 0.478127
+vt 0.321462 0.469869
+vt 0.313190 0.469869
+vt 0.313190 0.465740
+vt 0.321462 0.465740
+vt 0.329734 0.465740
+vt 0.329734 0.469869
+vt 0.329734 0.473998
+vt 0.321462 0.473998
+vt 0.329734 0.478128
+vt 0.321462 0.478127
+vt 0.313190 0.473998
+vt 0.313190 0.478127
+vt 0.354549 0.486386
+vt 0.346277 0.486386
+vt 0.346277 0.482257
+vt 0.354549 0.482257
+vt 0.338005 0.486386
+vt 0.338006 0.482257
+vt 0.362821 0.482257
+vt 0.362821 0.486386
+vt 0.371093 0.482258
+vt 0.371092 0.486387
+vt 0.362821 0.490515
+vt 0.354549 0.490515
+vt 0.362820 0.494645
+vt 0.354549 0.494644
+vt 0.371092 0.490516
+vt 0.371092 0.494645
+vt 0.346277 0.490515
+vt 0.338005 0.490515
+vt 0.346277 0.494644
+vt 0.338005 0.494644
+vt 0.387636 0.486387
+vt 0.379364 0.486387
+vt 0.379364 0.482258
+vt 0.387636 0.482258
+vt 0.395908 0.482259
+vt 0.395907 0.486388
+vt 0.404179 0.482259
+vt 0.404179 0.486388
+vt 0.395907 0.490517
+vt 0.387636 0.490516
+vt 0.395907 0.494646
+vt 0.387635 0.494645
+vt 0.404179 0.490517
+vt 0.404179 0.494646
+vt 0.379364 0.490516
+vt 0.379364 0.494645
+vt 0.420722 0.486389
+vt 0.412451 0.486389
+vt 0.412451 0.482259
+vt 0.420723 0.482260
+vt 0.428994 0.482260
+vt 0.428994 0.486389
+vt 0.437266 0.482261
+vt 0.437266 0.486390
+vt 0.428994 0.490519
+vt 0.420722 0.490518
+vt 0.428994 0.494648
+vt 0.420722 0.494647
+vt 0.437265 0.490519
+vt 0.437265 0.494648
+vt 0.412451 0.490518
+vt 0.412450 0.494647
+vt 0.453809 0.486391
+vt 0.445537 0.486391
+vt 0.445538 0.482261
+vt 0.453809 0.482262
+vt 0.462081 0.482262
+vt 0.462081 0.486392
+vt 0.470352 0.482263
+vt 0.470352 0.486392
+vt 0.462080 0.490521
+vt 0.453809 0.490520
+vt 0.462080 0.494650
+vt 0.453808 0.494649
+vt 0.470352 0.490521
+vt 0.470352 0.494650
+vt 0.445537 0.490520
+vt 0.445537 0.494649
+vt 0.486895 0.486393
+vt 0.478624 0.486393
+vt 0.478624 0.482264
+vt 0.486896 0.482264
+vt 0.495167 0.482265
+vt 0.495167 0.486394
+vt 0.503439 0.482265
+vt 0.503438 0.486394
+vt 0.495167 0.490523
+vt 0.486895 0.490522
+vt 0.495166 0.494652
+vt 0.486895 0.494651
+vt 0.503438 0.490523
+vt 0.503438 0.494652
+vt 0.478623 0.490522
+vt 0.478623 0.494651
+vt 0.519981 0.486396
+vt 0.511710 0.486395
+vt 0.511710 0.482266
+vt 0.519982 0.482266
+vt 0.528253 0.482267
+vt 0.528253 0.486396
+vt 0.536525 0.482268
+vt 0.536524 0.486397
+vt 0.528253 0.490525
+vt 0.519981 0.490525
+vt 0.528252 0.494654
+vt 0.519981 0.494654
+vt 0.536524 0.490526
+vt 0.536524 0.494655
+vt 0.511710 0.490524
+vt 0.511709 0.494653
+vt 0.553067 0.486398
+vt 0.544796 0.486397
+vt 0.544796 0.482268
+vt 0.553068 0.482269
+vt 0.561339 0.482269
+vt 0.561339 0.486398
+vt 0.569610 0.482270
+vt 0.569610 0.486399
+vt 0.561338 0.490527
+vt 0.553067 0.490527
+vt 0.561338 0.494656
+vt 0.553067 0.494656
+vt 0.569610 0.490528
+vt 0.569610 0.494657
+vt 0.544796 0.490526
+vt 0.544795 0.494655
+vt 0.586153 0.486400
+vt 0.577882 0.486399
+vt 0.577882 0.482270
+vt 0.586153 0.482271
+vt 0.594425 0.482271
+vt 0.594424 0.486400
+vt 0.602696 0.482272
+vt 0.602696 0.486401
+vt 0.594424 0.490529
+vt 0.586153 0.490529
+vt 0.594424 0.494658
+vt 0.586153 0.494658
+vt 0.602696 0.490530
+vt 0.602695 0.494659
+vt 0.577881 0.490528
+vt 0.577881 0.494657
+vt 0.619239 0.486401
+vt 0.610967 0.486401
+vt 0.610968 0.482272
+vt 0.619239 0.482272
+vt 0.627510 0.482273
+vt 0.627510 0.486402
+vt 0.635782 0.482273
+vt 0.635781 0.486402
+vt 0.627510 0.490531
+vt 0.619238 0.490530
+vt 0.627510 0.494660
+vt 0.619238 0.494659
+vt 0.635781 0.490531
+vt 0.635781 0.494660
+vt 0.610967 0.490530
+vt 0.610967 0.494659
+vt 0.652324 0.486403
+vt 0.644053 0.486402
+vt 0.644053 0.482273
+vt 0.652324 0.482273
+vt 0.660596 0.482274
+vt 0.660595 0.486403
+vt 0.668867 0.482274
+vt 0.668867 0.486403
+vt 0.660595 0.490532
+vt 0.652324 0.490532
+vt 0.660595 0.494661
+vt 0.652324 0.494661
+vt 0.668867 0.490532
+vt 0.668867 0.494661
+vt 0.644053 0.490531
+vt 0.644052 0.494660
+vt 0.685409 0.486403
+vt 0.677138 0.486403
+vt 0.677138 0.482274
+vt 0.685409 0.482274
+vt 0.693681 0.482274
+vt 0.693681 0.486403
+vt 0.701952 0.482274
+vt 0.701952 0.486403
+vt 0.693681 0.490532
+vt 0.685409 0.490532
+vt 0.693681 0.494661
+vt 0.685409 0.494661
+vt 0.701952 0.490532
+vt 0.701952 0.494661
+vt 0.677138 0.490532
+vt 0.677138 0.494661
+vt 0.718495 0.486403
+vt 0.710223 0.486403
+vt 0.710223 0.482274
+vt 0.718495 0.482274
+vt 0.726766 0.482274
+vt 0.726766 0.486403
+vt 0.735037 0.482274
+vt 0.735037 0.486403
+vt 0.726766 0.490532
+vt 0.718495 0.490532
+vt 0.726766 0.494661
+vt 0.718495 0.494661
+vt 0.735038 0.490532
+vt 0.735038 0.494661
+vt 0.710223 0.490532
+vt 0.710223 0.494661
+vt 0.751580 0.486402
+vt 0.743309 0.486403
+vt 0.743309 0.482274
+vt 0.751580 0.482273
+vt 0.759851 0.482273
+vt 0.759851 0.486402
+vt 0.768123 0.482273
+vt 0.768123 0.486402
+vt 0.759852 0.490531
+vt 0.751580 0.490531
+vt 0.759852 0.494660
+vt 0.751580 0.494661
+vt 0.768123 0.490531
+vt 0.768123 0.494660
+vt 0.743309 0.490532
+vt 0.743309 0.494661
+vt 0.784666 0.486401
+vt 0.776394 0.486402
+vt 0.776394 0.482273
+vt 0.784665 0.482272
+vt 0.792937 0.482272
+vt 0.792937 0.486401
+vt 0.801208 0.482271
+vt 0.801208 0.486400
+vt 0.792937 0.490530
+vt 0.784666 0.490530
+vt 0.792937 0.494659
+vt 0.784666 0.494659
+vt 0.801209 0.490530
+vt 0.801209 0.494659
+vt 0.776394 0.490531
+vt 0.776395 0.494660
+vt 0.817751 0.486400
+vt 0.809480 0.486400
+vt 0.809480 0.482271
+vt 0.817751 0.482271
+vt 0.826022 0.482270
+vt 0.826023 0.486399
+vt 0.834294 0.482270
+vt 0.834294 0.486399
+vt 0.826023 0.490528
+vt 0.817751 0.490529
+vt 0.826023 0.494657
+vt 0.817752 0.494658
+vt 0.834294 0.490528
+vt 0.834295 0.494657
+vt 0.809480 0.490529
+vt 0.809480 0.494658
+vt 0.850837 0.486398
+vt 0.842565 0.486398
+vt 0.842565 0.482269
+vt 0.850837 0.482269
+vt 0.859108 0.482268
+vt 0.859108 0.486397
+vt 0.867380 0.482267
+vt 0.867380 0.486396
+vt 0.859109 0.490526
+vt 0.850837 0.490527
+vt 0.859109 0.494655
+vt 0.850837 0.494656
+vt 0.867380 0.490526
+vt 0.867380 0.494655
+vt 0.842566 0.490527
+vt 0.842566 0.494656
+vt 0.883923 0.486395
+vt 0.875651 0.486396
+vt 0.875651 0.482267
+vt 0.883923 0.482266
+vt 0.892194 0.482266
+vt 0.892194 0.486395
+vt 0.900466 0.482265
+vt 0.900466 0.486394
+vt 0.892195 0.490524
+vt 0.883923 0.490524
+vt 0.892195 0.494653
+vt 0.883924 0.494653
+vt 0.900466 0.490523
+vt 0.900467 0.494652
+vt 0.875652 0.490525
+vt 0.875652 0.494654
+vt 0.122942 0.486393
+vt 0.114670 0.486394
+vt 0.114670 0.482265
+vt 0.122941 0.482264
+vt 0.106399 0.486394
+vt 0.106398 0.482265
+vt 0.131213 0.482263
+vt 0.131213 0.486392
+vt 0.139485 0.482263
+vt 0.139485 0.486392
+vt 0.131214 0.490522
+vt 0.122942 0.490522
+vt 0.131214 0.494651
+vt 0.122942 0.494651
+vt 0.139485 0.490521
+vt 0.139486 0.494650
+vt 0.114671 0.490523
+vt 0.106399 0.490523
+vt 0.114671 0.494652
+vt 0.106399 0.494652
+vt 0.156028 0.486391
+vt 0.147757 0.486391
+vt 0.147756 0.482262
+vt 0.156028 0.482262
+vt 0.164299 0.482261
+vt 0.164300 0.486390
+vt 0.172571 0.482261
+vt 0.172571 0.486390
+vt 0.164300 0.490519
+vt 0.156028 0.490520
+vt 0.164300 0.494648
+vt 0.156029 0.494649
+vt 0.172572 0.490519
+vt 0.172572 0.494648
+vt 0.147757 0.490520
+vt 0.147757 0.494650
+vt 0.189115 0.486389
+vt 0.180843 0.486389
+vt 0.180843 0.482260
+vt 0.189114 0.482260
+vt 0.197386 0.482259
+vt 0.197386 0.486388
+vt 0.205658 0.482259
+vt 0.205658 0.486388
+vt 0.197387 0.490517
+vt 0.189115 0.490518
+vt 0.197387 0.494647
+vt 0.189115 0.494647
+vt 0.205658 0.490517
+vt 0.205658 0.494646
+vt 0.180843 0.490518
+vt 0.180844 0.494647
+vt 0.222201 0.486387
+vt 0.213930 0.486388
+vt 0.213929 0.482259
+vt 0.222201 0.482258
+vt 0.230473 0.482258
+vt 0.230473 0.486387
+vt 0.238745 0.482258
+vt 0.238745 0.486387
+vt 0.230473 0.490516
+vt 0.222202 0.490516
+vt 0.230473 0.494645
+vt 0.222202 0.494645
+vt 0.238745 0.490516
+vt 0.238745 0.494645
+vt 0.213930 0.490517
+vt 0.213930 0.494646
+vt 0.255288 0.486386
+vt 0.247017 0.486386
+vt 0.247016 0.482257
+vt 0.255288 0.482257
+vt 0.263560 0.482257
+vt 0.263560 0.486386
+vt 0.271832 0.482257
+vt 0.271832 0.486386
+vt 0.263560 0.490515
+vt 0.255288 0.490515
+vt 0.263560 0.494644
+vt 0.255288 0.494644
+vt 0.271832 0.490515
+vt 0.271832 0.494644
+vt 0.247017 0.490515
+vt 0.247017 0.494644
+vt 0.288375 0.486385
+vt 0.280103 0.486386
+vt 0.280103 0.482257
+vt 0.288375 0.482256
+vt 0.296647 0.482256
+vt 0.296647 0.486385
+vt 0.304919 0.482256
+vt 0.304919 0.486385
+vt 0.296647 0.490515
+vt 0.288375 0.490515
+vt 0.296647 0.494644
+vt 0.288375 0.494644
+vt 0.304919 0.490515
+vt 0.304919 0.494644
+vt 0.280103 0.490515
+vt 0.280104 0.494644
+vt 0.321462 0.486386
+vt 0.313190 0.486385
+vt 0.313190 0.482256
+vt 0.321462 0.482256
+vt 0.329734 0.482257
+vt 0.329734 0.486386
+vt 0.329734 0.490515
+vt 0.321462 0.490515
+vt 0.329734 0.494644
+vt 0.321462 0.494644
+vt 0.313190 0.490515
+vt 0.313190 0.494644
+vt 0.354548 0.502902
+vt 0.346277 0.502902
+vt 0.346277 0.498773
+vt 0.354549 0.498773
+vt 0.338005 0.502902
+vt 0.338005 0.498773
+vt 0.362820 0.498774
+vt 0.362820 0.502903
+vt 0.371092 0.498774
+vt 0.371092 0.502903
+vt 0.362820 0.507032
+vt 0.354548 0.507031
+vt 0.362820 0.511161
+vt 0.354548 0.511161
+vt 0.371092 0.507032
+vt 0.371091 0.511161
+vt 0.346277 0.507031
+vt 0.338005 0.507031
+vt 0.346277 0.511160
+vt 0.338005 0.511160
+vt 0.387635 0.502904
+vt 0.379363 0.502903
+vt 0.379364 0.498774
+vt 0.387635 0.498774
+vt 0.395907 0.498775
+vt 0.395907 0.502904
+vt 0.404178 0.498775
+vt 0.404178 0.502904
+vt 0.395906 0.507033
+vt 0.387635 0.507033
+vt 0.395906 0.511162
+vt 0.387635 0.511162
+vt 0.404178 0.507033
+vt 0.404178 0.511163
+vt 0.379363 0.507032
+vt 0.379363 0.511161
+vt 0.420721 0.502905
+vt 0.412450 0.502905
+vt 0.412450 0.498776
+vt 0.420722 0.498776
+vt 0.428993 0.498777
+vt 0.428993 0.502906
+vt 0.437265 0.498777
+vt 0.437265 0.502906
+vt 0.428993 0.507035
+vt 0.420721 0.507034
+vt 0.428993 0.511164
+vt 0.420721 0.511163
+vt 0.437264 0.507035
+vt 0.437264 0.511164
+vt 0.412450 0.507034
+vt 0.412449 0.511163
+vt 0.453808 0.502907
+vt 0.445536 0.502907
+vt 0.445536 0.498778
+vt 0.453808 0.498778
+vt 0.462080 0.498779
+vt 0.462079 0.502908
+vt 0.470351 0.498779
+vt 0.470351 0.502908
+vt 0.462079 0.507037
+vt 0.453808 0.507036
+vt 0.462079 0.511166
+vt 0.453807 0.511165
+vt 0.470351 0.507038
+vt 0.470350 0.511167
+vt 0.445536 0.507036
+vt 0.445536 0.511165
+vt 0.486894 0.502910
+vt 0.478622 0.502909
+vt 0.478623 0.498780
+vt 0.486894 0.498780
+vt 0.495166 0.498781
+vt 0.495166 0.502910
+vt 0.503437 0.498782
+vt 0.503437 0.502911
+vt 0.495165 0.507039
+vt 0.486894 0.507039
+vt 0.495165 0.511168
+vt 0.486893 0.511168
+vt 0.503437 0.507040
+vt 0.503437 0.511169
+vt 0.478622 0.507038
+vt 0.478622 0.511167
+vt 0.519980 0.502912
+vt 0.511709 0.502911
+vt 0.511709 0.498782
+vt 0.519980 0.498783
+vt 0.528252 0.498783
+vt 0.528252 0.502912
+vt 0.536523 0.498784
+vt 0.536523 0.502913
+vt 0.528251 0.507041
+vt 0.519980 0.507041
+vt 0.528251 0.511170
+vt 0.519980 0.511170
+vt 0.536523 0.507042
+vt 0.536523 0.511171
+vt 0.511708 0.507040
+vt 0.511708 0.511169
+vt 0.553066 0.502914
+vt 0.544795 0.502913
+vt 0.544795 0.498784
+vt 0.553066 0.498785
+vt 0.561338 0.498785
+vt 0.561338 0.502914
+vt 0.569609 0.498786
+vt 0.569609 0.502915
+vt 0.561337 0.507044
+vt 0.553066 0.507043
+vt 0.561337 0.511173
+vt 0.553066 0.511172
+vt 0.569609 0.507044
+vt 0.569609 0.511173
+vt 0.544794 0.507042
+vt 0.544794 0.511172
+vt 0.586152 0.502916
+vt 0.577881 0.502916
+vt 0.577881 0.498786
+vt 0.586152 0.498787
+vt 0.594424 0.498787
+vt 0.594424 0.502916
+vt 0.602695 0.498788
+vt 0.602695 0.502917
+vt 0.594423 0.507046
+vt 0.586152 0.507045
+vt 0.594423 0.511175
+vt 0.586152 0.511174
+vt 0.602695 0.507046
+vt 0.602695 0.511175
+vt 0.577880 0.507045
+vt 0.577880 0.511174
+vt 0.619238 0.502918
+vt 0.610966 0.502917
+vt 0.610967 0.498788
+vt 0.619238 0.498789
+vt 0.627509 0.498789
+vt 0.627509 0.502918
+vt 0.635781 0.498789
+vt 0.635781 0.502918
+vt 0.627509 0.507047
+vt 0.619238 0.507047
+vt 0.627509 0.511176
+vt 0.619237 0.511176
+vt 0.635781 0.507047
+vt 0.635780 0.511176
+vt 0.610966 0.507046
+vt 0.610966 0.511175
+vt 0.652324 0.502919
+vt 0.644052 0.502919
+vt 0.644052 0.498789
+vt 0.652324 0.498790
+vt 0.660595 0.498790
+vt 0.660595 0.502919
+vt 0.668866 0.498790
+vt 0.668866 0.502919
+vt 0.660595 0.507048
+vt 0.652323 0.507048
+vt 0.660595 0.511177
+vt 0.652323 0.511177
+vt 0.668866 0.507048
+vt 0.668866 0.511177
+vt 0.644052 0.507048
+vt 0.644052 0.511177
+vt 0.685409 0.502919
+vt 0.677138 0.502919
+vt 0.677138 0.498790
+vt 0.685409 0.498790
+vt 0.693681 0.498790
+vt 0.693681 0.502919
+vt 0.701952 0.498790
+vt 0.701952 0.502919
+vt 0.693681 0.507048
+vt 0.685409 0.507048
+vt 0.693681 0.511178
+vt 0.685409 0.511177
+vt 0.701952 0.507048
+vt 0.701952 0.511178
+vt 0.677138 0.507048
+vt 0.677138 0.511177
+vt 0.718495 0.502919
+vt 0.710224 0.502919
+vt 0.710223 0.498790
+vt 0.718495 0.498790
+vt 0.726766 0.498790
+vt 0.726766 0.502919
+vt 0.735038 0.498790
+vt 0.735038 0.502919
+vt 0.726766 0.507048
+vt 0.718495 0.507048
+vt 0.726766 0.511177
+vt 0.718495 0.511177
+vt 0.735038 0.507048
+vt 0.735038 0.511177
+vt 0.710224 0.507048
+vt 0.710224 0.511177
+vt 0.751581 0.502919
+vt 0.743309 0.502919
+vt 0.743309 0.498790
+vt 0.751580 0.498790
+vt 0.759852 0.498789
+vt 0.759852 0.502918
+vt 0.768123 0.498789
+vt 0.768124 0.502918
+vt 0.759852 0.507047
+vt 0.751581 0.507048
+vt 0.759852 0.511176
+vt 0.751581 0.511177
+vt 0.768124 0.507047
+vt 0.768124 0.511176
+vt 0.743309 0.507048
+vt 0.743309 0.511177
+vt 0.784666 0.502917
+vt 0.776395 0.502918
+vt 0.776395 0.498789
+vt 0.784666 0.498788
+vt 0.792938 0.498788
+vt 0.792938 0.502917
+vt 0.801209 0.498788
+vt 0.801209 0.502917
+vt 0.792938 0.507046
+vt 0.784666 0.507047
+vt 0.792938 0.511175
+vt 0.784667 0.511176
+vt 0.801209 0.507046
+vt 0.801210 0.511175
+vt 0.776395 0.507047
+vt 0.776395 0.511176
+vt 0.817752 0.502916
+vt 0.809481 0.502916
+vt 0.809480 0.498787
+vt 0.817752 0.498787
+vt 0.826023 0.498786
+vt 0.826024 0.502915
+vt 0.834295 0.498786
+vt 0.834295 0.502915
+vt 0.826024 0.507044
+vt 0.817752 0.507045
+vt 0.826024 0.511173
+vt 0.817753 0.511174
+vt 0.834295 0.507044
+vt 0.834296 0.511173
+vt 0.809481 0.507045
+vt 0.809481 0.511174
+vt 0.850838 0.502914
+vt 0.842566 0.502914
+vt 0.842566 0.498785
+vt 0.850838 0.498785
+vt 0.859109 0.498784
+vt 0.859110 0.502913
+vt 0.867381 0.498784
+vt 0.867381 0.502913
+vt 0.859110 0.507042
+vt 0.850838 0.507043
+vt 0.859110 0.511171
+vt 0.850839 0.511172
+vt 0.867381 0.507042
+vt 0.867382 0.511171
+vt 0.842567 0.507043
+vt 0.842567 0.511172
+vt 0.883924 0.502912
+vt 0.875653 0.502912
+vt 0.875652 0.498783
+vt 0.883924 0.498783
+vt 0.892195 0.498782
+vt 0.892196 0.502911
+vt 0.900467 0.498781
+vt 0.900467 0.502910
+vt 0.892196 0.507040
+vt 0.883924 0.507041
+vt 0.892196 0.511169
+vt 0.883925 0.511170
+vt 0.900467 0.507040
+vt 0.900468 0.511169
+vt 0.875653 0.507041
+vt 0.875653 0.511170
+vt 0.122943 0.502909
+vt 0.114671 0.502910
+vt 0.114671 0.498781
+vt 0.122943 0.498780
+vt 0.106400 0.502910
+vt 0.106400 0.498781
+vt 0.131214 0.498780
+vt 0.131215 0.502909
+vt 0.139486 0.498779
+vt 0.139486 0.502908
+vt 0.131215 0.507038
+vt 0.122943 0.507038
+vt 0.131215 0.511167
+vt 0.122944 0.511168
+vt 0.139486 0.507037
+vt 0.139487 0.511166
+vt 0.114672 0.507039
+vt 0.106400 0.507040
+vt 0.114672 0.511168
+vt 0.106401 0.511169
+vt 0.156029 0.502907
+vt 0.147758 0.502908
+vt 0.147757 0.498779
+vt 0.156029 0.498778
+vt 0.164301 0.498778
+vt 0.164301 0.502907
+vt 0.172572 0.498777
+vt 0.172572 0.502906
+vt 0.164301 0.507036
+vt 0.156030 0.507036
+vt 0.164301 0.511165
+vt 0.156030 0.511165
+vt 0.172573 0.507035
+vt 0.172573 0.511164
+vt 0.147758 0.507037
+vt 0.147758 0.511166
+vt 0.189116 0.502905
+vt 0.180844 0.502906
+vt 0.180844 0.498776
+vt 0.189115 0.498776
+vt 0.197387 0.498776
+vt 0.197387 0.502905
+vt 0.205659 0.498775
+vt 0.205659 0.502904
+vt 0.197388 0.507034
+vt 0.189116 0.507034
+vt 0.197388 0.511163
+vt 0.189116 0.511163
+vt 0.205659 0.507033
+vt 0.205659 0.511162
+vt 0.180844 0.507035
+vt 0.180845 0.511164
+vt 0.222202 0.502903
+vt 0.213931 0.502904
+vt 0.213930 0.498775
+vt 0.222202 0.498774
+vt 0.230474 0.498774
+vt 0.230474 0.502903
+vt 0.238745 0.498774
+vt 0.238745 0.502903
+vt 0.230474 0.507032
+vt 0.222202 0.507033
+vt 0.230474 0.511161
+vt 0.222202 0.511162
+vt 0.238746 0.507032
+vt 0.238746 0.511161
+vt 0.213931 0.507033
+vt 0.213931 0.511162
+vt 0.255289 0.502902
+vt 0.247017 0.502903
+vt 0.247017 0.498774
+vt 0.255289 0.498773
+vt 0.263560 0.498773
+vt 0.263560 0.502902
+vt 0.271832 0.498773
+vt 0.271832 0.502902
+vt 0.263560 0.507031
+vt 0.255289 0.507032
+vt 0.263561 0.511160
+vt 0.255289 0.511161
+vt 0.271832 0.507031
+vt 0.271832 0.511160
+vt 0.247017 0.507032
+vt 0.247017 0.511161
+vt 0.288375 0.502902
+vt 0.280104 0.502902
+vt 0.280104 0.498773
+vt 0.288375 0.498773
+vt 0.296647 0.498773
+vt 0.296647 0.502902
+vt 0.304919 0.498773
+vt 0.304919 0.502902
+vt 0.296647 0.507031
+vt 0.288375 0.507031
+vt 0.296647 0.511160
+vt 0.288375 0.511160
+vt 0.304919 0.507031
+vt 0.304919 0.511160
+vt 0.280104 0.507031
+vt 0.280104 0.511160
+vt 0.321462 0.502902
+vt 0.313190 0.502902
+vt 0.313190 0.498773
+vt 0.321462 0.498773
+vt 0.329734 0.498773
+vt 0.329733 0.502902
+vt 0.329733 0.507031
+vt 0.321462 0.507031
+vt 0.329733 0.511160
+vt 0.321462 0.511160
+vt 0.313190 0.507031
+vt 0.313190 0.511160
+vt 0.354548 0.519419
+vt 0.346276 0.519419
+vt 0.346277 0.515289
+vt 0.354548 0.515290
+vt 0.338005 0.519418
+vt 0.338005 0.515289
+vt 0.362820 0.515290
+vt 0.362820 0.519419
+vt 0.371091 0.515290
+vt 0.371091 0.519419
+vt 0.362819 0.523548
+vt 0.354548 0.523548
+vt 0.362819 0.527677
+vt 0.354548 0.527677
+vt 0.371091 0.523548
+vt 0.371091 0.527677
+vt 0.346276 0.523548
+vt 0.338005 0.523547
+vt 0.346276 0.527677
+vt 0.338005 0.527676
+vt 0.387634 0.519420
+vt 0.379363 0.519420
+vt 0.379363 0.515290
+vt 0.387634 0.515291
+vt 0.395906 0.515291
+vt 0.395906 0.519420
+vt 0.404178 0.515292
+vt 0.404177 0.519421
+vt 0.395906 0.523549
+vt 0.387634 0.523549
+vt 0.395905 0.527678
+vt 0.387634 0.527678
+vt 0.404177 0.523550
+vt 0.404177 0.527679
+vt 0.379363 0.523549
+vt 0.379362 0.527678
+vt 0.420721 0.519422
+vt 0.412449 0.519421
+vt 0.412449 0.515292
+vt 0.420721 0.515293
+vt 0.428992 0.515293
+vt 0.428992 0.519422
+vt 0.437264 0.515293
+vt 0.437264 0.519423
+vt 0.428992 0.523551
+vt 0.420720 0.523551
+vt 0.428992 0.527680
+vt 0.420720 0.527680
+vt 0.437263 0.523552
+vt 0.437263 0.527681
+vt 0.412449 0.523550
+vt 0.412448 0.527679
+vt 0.453807 0.519424
+vt 0.445535 0.519423
+vt 0.445535 0.515294
+vt 0.453807 0.515295
+vt 0.462079 0.515295
+vt 0.462078 0.519424
+vt 0.470350 0.515296
+vt 0.470350 0.519425
+vt 0.462078 0.523553
+vt 0.453806 0.523553
+vt 0.462078 0.527682
+vt 0.453806 0.527682
+vt 0.470349 0.523554
+vt 0.470349 0.527683
+vt 0.445535 0.523552
+vt 0.445535 0.527681
+vt 0.486893 0.519426
+vt 0.478621 0.519425
+vt 0.478622 0.515296
+vt 0.486893 0.515297
+vt 0.495165 0.515297
+vt 0.495164 0.519426
+vt 0.503436 0.515298
+vt 0.503436 0.519427
+vt 0.495164 0.523555
+vt 0.486893 0.523555
+vt 0.495164 0.527684
+vt 0.486892 0.527684
+vt 0.503436 0.523556
+vt 0.503435 0.527685
+vt 0.478621 0.523554
+vt 0.478621 0.527683
+vt 0.519979 0.519428
+vt 0.511707 0.519427
+vt 0.511708 0.515298
+vt 0.519979 0.515299
+vt 0.528251 0.515300
+vt 0.528251 0.519429
+vt 0.536522 0.515300
+vt 0.536522 0.519429
+vt 0.528250 0.523558
+vt 0.519979 0.523557
+vt 0.528250 0.527687
+vt 0.519978 0.527686
+vt 0.536522 0.523558
+vt 0.536521 0.527687
+vt 0.511707 0.523557
+vt 0.511707 0.527686
+vt 0.553065 0.519430
+vt 0.544794 0.519430
+vt 0.544794 0.515301
+vt 0.553065 0.515301
+vt 0.561337 0.515302
+vt 0.561337 0.519431
+vt 0.569608 0.515302
+vt 0.569608 0.519431
+vt 0.561336 0.523560
+vt 0.553065 0.523559
+vt 0.561336 0.527689
+vt 0.553064 0.527688
+vt 0.569608 0.523560
+vt 0.569608 0.527689
+vt 0.544793 0.523559
+vt 0.544793 0.527688
+vt 0.586151 0.519432
+vt 0.577880 0.519432
+vt 0.577880 0.515303
+vt 0.586151 0.515303
+vt 0.594423 0.515304
+vt 0.594423 0.519433
+vt 0.602694 0.515304
+vt 0.602694 0.519433
+vt 0.594422 0.523562
+vt 0.586151 0.523561
+vt 0.594422 0.527691
+vt 0.586151 0.527690
+vt 0.602694 0.523562
+vt 0.602694 0.527691
+vt 0.577879 0.523561
+vt 0.577879 0.527690
+vt 0.619237 0.519434
+vt 0.610966 0.519434
+vt 0.610966 0.515305
+vt 0.619237 0.515305
+vt 0.627509 0.515305
+vt 0.627509 0.519434
+vt 0.635780 0.515306
+vt 0.635780 0.519435
+vt 0.627508 0.523563
+vt 0.619237 0.523563
+vt 0.627508 0.527692
+vt 0.619237 0.527692
+vt 0.635780 0.523564
+vt 0.635780 0.527693
+vt 0.610965 0.523563
+vt 0.610965 0.527692
+vt 0.652323 0.519435
+vt 0.644052 0.519435
+vt 0.644052 0.515306
+vt 0.652323 0.515306
+vt 0.660595 0.515306
+vt 0.660595 0.519435
+vt 0.668866 0.515306
+vt 0.668866 0.519435
+vt 0.660595 0.523564
+vt 0.652323 0.523564
+vt 0.660594 0.527693
+vt 0.652323 0.527693
+vt 0.668866 0.523564
+vt 0.668866 0.527694
+vt 0.644051 0.523564
+vt 0.644051 0.527693
+vt 0.685409 0.519436
+vt 0.677138 0.519436
+vt 0.677138 0.515306
+vt 0.685409 0.515306
+vt 0.693681 0.515307
+vt 0.693681 0.519436
+vt 0.701952 0.515307
+vt 0.701952 0.519436
+vt 0.693681 0.523565
+vt 0.685409 0.523565
+vt 0.693681 0.527694
+vt 0.685409 0.527694
+vt 0.701952 0.523565
+vt 0.701952 0.527694
+vt 0.677138 0.523565
+vt 0.677137 0.527694
+vt 0.718495 0.519436
+vt 0.710224 0.519436
+vt 0.710224 0.515307
+vt 0.718495 0.515306
+vt 0.726767 0.515306
+vt 0.726767 0.519435
+vt 0.735038 0.515306
+vt 0.735038 0.519435
+vt 0.726767 0.523565
+vt 0.718495 0.523565
+vt 0.726767 0.527694
+vt 0.718495 0.527694
+vt 0.735038 0.523564
+vt 0.735038 0.527694
+vt 0.710224 0.523565
+vt 0.710224 0.527694
+vt 0.751581 0.519435
+vt 0.743310 0.519435
+vt 0.743309 0.515306
+vt 0.751581 0.515306
+vt 0.759852 0.515306
+vt 0.759853 0.519435
+vt 0.768124 0.515305
+vt 0.768124 0.519434
+vt 0.759853 0.523564
+vt 0.751581 0.523564
+vt 0.759853 0.527693
+vt 0.751581 0.527693
+vt 0.768124 0.523564
+vt 0.768124 0.527693
+vt 0.743310 0.523564
+vt 0.743310 0.527693
+vt 0.784667 0.519434
+vt 0.776396 0.519434
+vt 0.776395 0.515305
+vt 0.784667 0.515305
+vt 0.792938 0.515304
+vt 0.792939 0.519433
+vt 0.801210 0.515304
+vt 0.801210 0.519433
+vt 0.792939 0.523562
+vt 0.784667 0.523563
+vt 0.792939 0.527692
+vt 0.784667 0.527692
+vt 0.801210 0.523562
+vt 0.801211 0.527691
+vt 0.776396 0.523563
+vt 0.776396 0.527692
+vt 0.817753 0.519432
+vt 0.809482 0.519433
+vt 0.809481 0.515303
+vt 0.817753 0.515303
+vt 0.826024 0.515303
+vt 0.826025 0.519432
+vt 0.834296 0.515302
+vt 0.834296 0.519431
+vt 0.826025 0.523561
+vt 0.817753 0.523561
+vt 0.826025 0.527690
+vt 0.817754 0.527690
+vt 0.834296 0.523560
+vt 0.834297 0.527689
+vt 0.809482 0.523562
+vt 0.809482 0.527691
+vt 0.850839 0.519430
+vt 0.842568 0.519431
+vt 0.842567 0.515302
+vt 0.850839 0.515301
+vt 0.859110 0.515300
+vt 0.859111 0.519430
+vt 0.867382 0.515300
+vt 0.867382 0.519429
+vt 0.859111 0.523559
+vt 0.850839 0.523559
+vt 0.859111 0.527688
+vt 0.850840 0.527688
+vt 0.867382 0.523558
+vt 0.867383 0.527687
+vt 0.842568 0.523560
+vt 0.842568 0.527689
+vt 0.883925 0.519428
+vt 0.875654 0.519428
+vt 0.875653 0.515299
+vt 0.883925 0.515299
+vt 0.892196 0.515298
+vt 0.892197 0.519427
+vt 0.900468 0.515298
+vt 0.900468 0.519427
+vt 0.892197 0.523556
+vt 0.883926 0.523557
+vt 0.892197 0.527685
+vt 0.883926 0.527686
+vt 0.900469 0.523556
+vt 0.900469 0.527685
+vt 0.875654 0.523558
+vt 0.875654 0.527687
+vt 0.122944 0.519426
+vt 0.114673 0.519426
+vt 0.114672 0.515297
+vt 0.122944 0.515297
+vt 0.106401 0.519427
+vt 0.106401 0.515298
+vt 0.131215 0.515296
+vt 0.131216 0.519425
+vt 0.139487 0.515295
+vt 0.139487 0.519424
+vt 0.131216 0.523554
+vt 0.122944 0.523555
+vt 0.131216 0.527683
+vt 0.122945 0.527684
+vt 0.139488 0.523553
+vt 0.139488 0.527683
+vt 0.114673 0.523555
+vt 0.106401 0.523556
+vt 0.114673 0.527684
+vt 0.106402 0.527685
+vt 0.156030 0.519423
+vt 0.147759 0.519424
+vt 0.147759 0.515295
+vt 0.156030 0.515294
+vt 0.164302 0.515294
+vt 0.164302 0.519423
+vt 0.172573 0.515293
+vt 0.172574 0.519422
+vt 0.164302 0.523552
+vt 0.156031 0.523552
+vt 0.164302 0.527681
+vt 0.156031 0.527681
+vt 0.172574 0.523551
+vt 0.172574 0.527680
+vt 0.147759 0.523553
+vt 0.147759 0.527682
+vt 0.189117 0.519421
+vt 0.180845 0.519422
+vt 0.180845 0.515293
+vt 0.189116 0.515292
+vt 0.197388 0.515292
+vt 0.197388 0.519421
+vt 0.205660 0.515291
+vt 0.205660 0.519421
+vt 0.197388 0.523550
+vt 0.189117 0.523550
+vt 0.197389 0.527679
+vt 0.189117 0.527679
+vt 0.205660 0.523550
+vt 0.205660 0.527679
+vt 0.180845 0.523551
+vt 0.180846 0.527680
+vt 0.222203 0.519420
+vt 0.213931 0.519420
+vt 0.213931 0.515291
+vt 0.222203 0.515291
+vt 0.230474 0.515290
+vt 0.230474 0.519419
+vt 0.238746 0.515290
+vt 0.238746 0.519419
+vt 0.230475 0.523549
+vt 0.222203 0.523549
+vt 0.230475 0.527678
+vt 0.222203 0.527678
+vt 0.238746 0.523548
+vt 0.238746 0.527677
+vt 0.213931 0.523549
+vt 0.213932 0.527678
+vt 0.255289 0.519419
+vt 0.247018 0.519419
+vt 0.247017 0.515290
+vt 0.255289 0.515290
+vt 0.263561 0.515289
+vt 0.263561 0.519419
+vt 0.271832 0.515289
+vt 0.271832 0.519418
+vt 0.263561 0.523548
+vt 0.255289 0.523548
+vt 0.263561 0.527677
+vt 0.255289 0.527677
+vt 0.271832 0.523547
+vt 0.271832 0.527677
+vt 0.247018 0.523548
+vt 0.247018 0.527677
+vt 0.288375 0.519418
+vt 0.280104 0.519418
+vt 0.280104 0.515289
+vt 0.288375 0.515289
+vt 0.296647 0.515289
+vt 0.296647 0.519418
+vt 0.304919 0.515289
+vt 0.304919 0.519418
+vt 0.296647 0.523547
+vt 0.288375 0.523547
+vt 0.296647 0.527676
+vt 0.288375 0.527676
+vt 0.304919 0.523547
+vt 0.304919 0.527676
+vt 0.280104 0.523547
+vt 0.280104 0.527676
+vt 0.321462 0.519418
+vt 0.313190 0.519418
+vt 0.313190 0.515289
+vt 0.321462 0.515289
+vt 0.329733 0.515289
+vt 0.329733 0.519418
+vt 0.329733 0.523547
+vt 0.321462 0.523547
+vt 0.329733 0.527676
+vt 0.321462 0.527676
+vt 0.313190 0.523547
+vt 0.313190 0.527676
+vt 0.354548 0.535935
+vt 0.346276 0.535935
+vt 0.346276 0.531806
+vt 0.354548 0.531806
+vt 0.338005 0.535935
+vt 0.338005 0.531806
+vt 0.362819 0.531806
+vt 0.362819 0.535935
+vt 0.371091 0.531806
+vt 0.371091 0.535936
+vt 0.362819 0.540064
+vt 0.354547 0.540064
+vt 0.362819 0.544193
+vt 0.354547 0.544193
+vt 0.371090 0.540065
+vt 0.371090 0.544194
+vt 0.346276 0.540064
+vt 0.338004 0.540064
+vt 0.346276 0.544193
+vt 0.338004 0.544193
+vt 0.387634 0.535936
+vt 0.379362 0.535936
+vt 0.379362 0.531807
+vt 0.387634 0.531807
+vt 0.395905 0.531808
+vt 0.395905 0.535937
+vt 0.404177 0.531808
+vt 0.404177 0.535937
+vt 0.395905 0.540066
+vt 0.387633 0.540065
+vt 0.395905 0.544195
+vt 0.387633 0.544194
+vt 0.404176 0.540066
+vt 0.404176 0.544195
+vt 0.379362 0.540065
+vt 0.379362 0.544194
+vt 0.420720 0.535938
+vt 0.412448 0.535937
+vt 0.412448 0.531808
+vt 0.420720 0.531809
+vt 0.428991 0.531809
+vt 0.428991 0.535938
+vt 0.437263 0.531810
+vt 0.437263 0.535939
+vt 0.428991 0.540067
+vt 0.420719 0.540067
+vt 0.428991 0.544196
+vt 0.420719 0.544196
+vt 0.437262 0.540068
+vt 0.437262 0.544197
+vt 0.412448 0.540066
+vt 0.412448 0.544196
+vt 0.453806 0.535940
+vt 0.445534 0.535939
+vt 0.445534 0.531810
+vt 0.453806 0.531811
+vt 0.462077 0.531811
+vt 0.462077 0.535940
+vt 0.470349 0.531812
+vt 0.470349 0.535941
+vt 0.462077 0.540070
+vt 0.453805 0.540069
+vt 0.462077 0.544199
+vt 0.453805 0.544198
+vt 0.470348 0.540070
+vt 0.470348 0.544199
+vt 0.445534 0.540068
+vt 0.445534 0.544198
+vt 0.486892 0.535942
+vt 0.478620 0.535942
+vt 0.478620 0.531812
+vt 0.486892 0.531813
+vt 0.495164 0.531814
+vt 0.495163 0.535943
+vt 0.503435 0.531814
+vt 0.503435 0.535943
+vt 0.495163 0.540072
+vt 0.486891 0.540071
+vt 0.495163 0.544201
+vt 0.486891 0.544200
+vt 0.503434 0.540072
+vt 0.503434 0.544201
+vt 0.478620 0.540071
+vt 0.478620 0.544200
+vt 0.519978 0.535944
+vt 0.511706 0.535944
+vt 0.511707 0.531815
+vt 0.519978 0.531815
+vt 0.528250 0.531816
+vt 0.528249 0.535945
+vt 0.536521 0.531816
+vt 0.536521 0.535946
+vt 0.528249 0.540074
+vt 0.519978 0.540073
+vt 0.528249 0.544203
+vt 0.519977 0.544203
+vt 0.536521 0.540075
+vt 0.536520 0.544204
+vt 0.511706 0.540073
+vt 0.511706 0.544202
+vt 0.553064 0.535947
+vt 0.544792 0.535946
+vt 0.544793 0.531817
+vt 0.553064 0.531818
+vt 0.561336 0.531818
+vt 0.561336 0.535947
+vt 0.569607 0.531819
+vt 0.569607 0.535948
+vt 0.561335 0.540076
+vt 0.553064 0.540076
+vt 0.561335 0.544205
+vt 0.553063 0.544205
+vt 0.569607 0.540077
+vt 0.569607 0.544206
+vt 0.544792 0.540075
+vt 0.544792 0.544204
+vt 0.586150 0.535949
+vt 0.577879 0.535948
+vt 0.577879 0.531819
+vt 0.586150 0.531820
+vt 0.594422 0.531820
+vt 0.594422 0.535949
+vt 0.602693 0.531820
+vt 0.602693 0.535949
+vt 0.594422 0.540078
+vt 0.586150 0.540078
+vt 0.594421 0.544207
+vt 0.586150 0.544207
+vt 0.602693 0.540078
+vt 0.602693 0.544208
+vt 0.577878 0.540077
+vt 0.577878 0.544206
+vt 0.619236 0.535950
+vt 0.610965 0.535950
+vt 0.610965 0.531821
+vt 0.619237 0.531821
+vt 0.627508 0.531821
+vt 0.627508 0.535951
+vt 0.635780 0.531822
+vt 0.635780 0.535951
+vt 0.627508 0.540080
+vt 0.619236 0.540079
+vt 0.627508 0.544209
+vt 0.619236 0.544208
+vt 0.635779 0.540080
+vt 0.635779 0.544209
+vt 0.610965 0.540079
+vt 0.610965 0.544208
+vt 0.652323 0.535951
+vt 0.644051 0.535951
+vt 0.644051 0.531822
+vt 0.652323 0.531822
+vt 0.660594 0.531823
+vt 0.660594 0.535952
+vt 0.668866 0.531823
+vt 0.668866 0.535952
+vt 0.660594 0.540081
+vt 0.652323 0.540080
+vt 0.660594 0.544210
+vt 0.652322 0.544209
+vt 0.668866 0.540081
+vt 0.668866 0.544210
+vt 0.644051 0.540080
+vt 0.644051 0.544209
+vt 0.685409 0.535952
+vt 0.677137 0.535952
+vt 0.677137 0.531823
+vt 0.685409 0.531823
+vt 0.693681 0.531823
+vt 0.693681 0.535952
+vt 0.701952 0.531823
+vt 0.701952 0.535952
+vt 0.693681 0.540081
+vt 0.685409 0.540081
+vt 0.693681 0.544210
+vt 0.685409 0.544210
+vt 0.701952 0.540081
+vt 0.701952 0.544210
+vt 0.677137 0.540081
+vt 0.677137 0.544210
+vt 0.718495 0.535952
+vt 0.710224 0.535952
+vt 0.710224 0.531823
+vt 0.718495 0.531823
+vt 0.726767 0.531823
+vt 0.726767 0.535952
+vt 0.735038 0.531823
+vt 0.735038 0.535952
+vt 0.726767 0.540081
+vt 0.718495 0.540081
+vt 0.726767 0.544210
+vt 0.718495 0.544210
+vt 0.735038 0.540081
+vt 0.735039 0.544210
+vt 0.710224 0.540081
+vt 0.710224 0.544210
+vt 0.751581 0.535951
+vt 0.743310 0.535951
+vt 0.743310 0.531822
+vt 0.751581 0.531822
+vt 0.759853 0.531822
+vt 0.759853 0.535951
+vt 0.768125 0.531822
+vt 0.768125 0.535951
+vt 0.759853 0.540080
+vt 0.751582 0.540080
+vt 0.759853 0.544209
+vt 0.751582 0.544209
+vt 0.768125 0.540080
+vt 0.768125 0.544209
+vt 0.743310 0.540081
+vt 0.743310 0.544210
+vt 0.784668 0.535950
+vt 0.776396 0.535950
+vt 0.776396 0.531821
+vt 0.784668 0.531821
+vt 0.792939 0.531821
+vt 0.792939 0.535950
+vt 0.801211 0.531820
+vt 0.801211 0.535949
+vt 0.792940 0.540079
+vt 0.784668 0.540079
+vt 0.792940 0.544208
+vt 0.784668 0.544208
+vt 0.801211 0.540078
+vt 0.801211 0.544207
+vt 0.776396 0.540079
+vt 0.776397 0.544209
+vt 0.817754 0.535948
+vt 0.809482 0.535949
+vt 0.809482 0.531820
+vt 0.817754 0.531819
+vt 0.826025 0.531819
+vt 0.826026 0.535948
+vt 0.834297 0.531818
+vt 0.834297 0.535947
+vt 0.826026 0.540077
+vt 0.817754 0.540077
+vt 0.826026 0.544206
+vt 0.817755 0.544207
+vt 0.834297 0.540076
+vt 0.834298 0.544206
+vt 0.809483 0.540078
+vt 0.809483 0.544207
+vt 0.850840 0.535946
+vt 0.842569 0.535947
+vt 0.842568 0.531818
+vt 0.850840 0.531817
+vt 0.859112 0.531817
+vt 0.859112 0.535946
+vt 0.867383 0.531816
+vt 0.867383 0.535945
+vt 0.859112 0.540075
+vt 0.850841 0.540075
+vt 0.859112 0.544204
+vt 0.850841 0.544205
+vt 0.867384 0.540074
+vt 0.867384 0.544203
+vt 0.842569 0.540076
+vt 0.842569 0.544205
+vt 0.883927 0.535944
+vt 0.875655 0.535945
+vt 0.875655 0.531816
+vt 0.883926 0.531815
+vt 0.892198 0.531815
+vt 0.892198 0.535944
+vt 0.900469 0.531814
+vt 0.900470 0.535943
+vt 0.892198 0.540073
+vt 0.883927 0.540073
+vt 0.892199 0.544202
+vt 0.883927 0.544202
+vt 0.900470 0.540072
+vt 0.900470 0.544201
+vt 0.875655 0.540074
+vt 0.875656 0.544203
+vt 0.122945 0.535942
+vt 0.114674 0.535942
+vt 0.114674 0.531813
+vt 0.122945 0.531813
+vt 0.106402 0.535943
+vt 0.106402 0.531814
+vt 0.131217 0.531812
+vt 0.131217 0.535941
+vt 0.139488 0.531812
+vt 0.139488 0.535941
+vt 0.131217 0.540070
+vt 0.122946 0.540071
+vt 0.131217 0.544199
+vt 0.122946 0.544200
+vt 0.139489 0.540070
+vt 0.139489 0.544199
+vt 0.114674 0.540071
+vt 0.106403 0.540072
+vt 0.114674 0.544201
+vt 0.106403 0.544201
+vt 0.156031 0.535940
+vt 0.147760 0.535940
+vt 0.147760 0.531811
+vt 0.156031 0.531811
+vt 0.164303 0.531810
+vt 0.164303 0.535939
+vt 0.172574 0.531810
+vt 0.172574 0.535939
+vt 0.164303 0.540068
+vt 0.156032 0.540069
+vt 0.164303 0.544197
+vt 0.156032 0.544198
+vt 0.172575 0.540068
+vt 0.172575 0.544197
+vt 0.147760 0.540069
+vt 0.147760 0.544198
+vt 0.189118 0.535938
+vt 0.180846 0.535938
+vt 0.180846 0.531809
+vt 0.189117 0.531809
+vt 0.197389 0.531808
+vt 0.197389 0.535937
+vt 0.205660 0.531808
+vt 0.205661 0.535937
+vt 0.197389 0.540066
+vt 0.189118 0.540067
+vt 0.197389 0.544195
+vt 0.189118 0.544196
+vt 0.205661 0.540066
+vt 0.205661 0.544195
+vt 0.180846 0.540067
+vt 0.180846 0.544196
+vt 0.222204 0.535936
+vt 0.213932 0.535936
+vt 0.213932 0.531807
+vt 0.222203 0.531807
+vt 0.230475 0.531807
+vt 0.230475 0.535936
+vt 0.238746 0.531806
+vt 0.238747 0.535935
+vt 0.230475 0.540065
+vt 0.222204 0.540065
+vt 0.230475 0.544194
+vt 0.222204 0.544194
+vt 0.238747 0.540064
+vt 0.238747 0.544194
+vt 0.213932 0.540065
+vt 0.213932 0.544195
+vt 0.255290 0.535935
+vt 0.247018 0.535935
+vt 0.247018 0.531806
+vt 0.255289 0.531806
+vt 0.263561 0.531806
+vt 0.263561 0.535935
+vt 0.271832 0.531806
+vt 0.271833 0.535935
+vt 0.263561 0.540064
+vt 0.255290 0.540064
+vt 0.263561 0.544193
+vt 0.255290 0.544193
+vt 0.271833 0.540064
+vt 0.271833 0.544193
+vt 0.247018 0.540064
+vt 0.247018 0.544193
+vt 0.288376 0.535934
+vt 0.280104 0.535935
+vt 0.280104 0.531805
+vt 0.288376 0.531805
+vt 0.296647 0.531805
+vt 0.296647 0.535934
+vt 0.304919 0.531805
+vt 0.304919 0.535934
+vt 0.296647 0.540063
+vt 0.288376 0.540063
+vt 0.296647 0.544192
+vt 0.288376 0.544193
+vt 0.304919 0.540063
+vt 0.304919 0.544192
+vt 0.280104 0.540064
+vt 0.280104 0.544193
+vt 0.321462 0.535934
+vt 0.313190 0.535934
+vt 0.313190 0.531805
+vt 0.321462 0.531805
+vt 0.329733 0.531805
+vt 0.329733 0.535934
+vt 0.329733 0.540064
+vt 0.321461 0.540063
+vt 0.329733 0.544193
+vt 0.321461 0.544192
+vt 0.313190 0.540063
+vt 0.313190 0.544192
+vt 0.354547 0.552451
+vt 0.346276 0.552451
+vt 0.346276 0.548322
+vt 0.354547 0.548322
+vt 0.338004 0.552451
+vt 0.338004 0.548322
+vt 0.362819 0.548322
+vt 0.362819 0.552452
+vt 0.371090 0.548323
+vt 0.371090 0.552452
+vt 0.362818 0.556581
+vt 0.354547 0.556580
+vt 0.362818 0.560710
+vt 0.354547 0.560709
+vt 0.371090 0.556581
+vt 0.371090 0.560710
+vt 0.346276 0.556580
+vt 0.338004 0.556580
+vt 0.346275 0.560709
+vt 0.338004 0.560709
+vt 0.387633 0.552452
+vt 0.379361 0.552452
+vt 0.379362 0.548323
+vt 0.387633 0.548323
+vt 0.395904 0.548324
+vt 0.395904 0.552453
+vt 0.404176 0.548324
+vt 0.404176 0.552453
+vt 0.395904 0.556582
+vt 0.387633 0.556581
+vt 0.395904 0.560711
+vt 0.387632 0.560711
+vt 0.404175 0.556582
+vt 0.404175 0.560711
+vt 0.379361 0.556581
+vt 0.379361 0.560710
+vt 0.420719 0.552454
+vt 0.412447 0.552454
+vt 0.412447 0.548325
+vt 0.420719 0.548325
+vt 0.428990 0.548326
+vt 0.428990 0.552455
+vt 0.437262 0.548326
+vt 0.437262 0.552455
+vt 0.428990 0.556584
+vt 0.420718 0.556583
+vt 0.428990 0.560713
+vt 0.420718 0.560712
+vt 0.437261 0.556584
+vt 0.437261 0.560713
+vt 0.412447 0.556583
+vt 0.412447 0.560712
+vt 0.453804 0.552456
+vt 0.445533 0.552456
+vt 0.445533 0.548327
+vt 0.453805 0.548327
+vt 0.462076 0.548328
+vt 0.462076 0.552457
+vt 0.470348 0.548328
+vt 0.470347 0.552457
+vt 0.462076 0.556586
+vt 0.453804 0.556585
+vt 0.462075 0.560715
+vt 0.453804 0.560714
+vt 0.470347 0.556586
+vt 0.470347 0.560715
+vt 0.445533 0.556585
+vt 0.445532 0.560714
+vt 0.486890 0.552458
+vt 0.478619 0.552458
+vt 0.478619 0.548329
+vt 0.486891 0.548329
+vt 0.495162 0.548330
+vt 0.495162 0.552459
+vt 0.503434 0.548330
+vt 0.503434 0.552459
+vt 0.495162 0.556588
+vt 0.486890 0.556587
+vt 0.495161 0.560717
+vt 0.486890 0.560717
+vt 0.503433 0.556589
+vt 0.503433 0.560718
+vt 0.478619 0.556587
+vt 0.478618 0.560716
+vt 0.519977 0.552461
+vt 0.511705 0.552460
+vt 0.511705 0.548331
+vt 0.519977 0.548332
+vt 0.528248 0.548332
+vt 0.528248 0.552461
+vt 0.536520 0.548333
+vt 0.536520 0.552462
+vt 0.528248 0.556590
+vt 0.519976 0.556590
+vt 0.528248 0.560719
+vt 0.519976 0.560719
+vt 0.536519 0.556591
+vt 0.536519 0.560720
+vt 0.511705 0.556589
+vt 0.511704 0.560718
+vt 0.553063 0.552463
+vt 0.544791 0.552462
+vt 0.544792 0.548333
+vt 0.553063 0.548334
+vt 0.561335 0.548334
+vt 0.561334 0.552463
+vt 0.569606 0.548335
+vt 0.569606 0.552464
+vt 0.561334 0.556592
+vt 0.553063 0.556592
+vt 0.561334 0.560722
+vt 0.553062 0.560721
+vt 0.569606 0.556593
+vt 0.569606 0.560722
+vt 0.544791 0.556591
+vt 0.544791 0.560720
+vt 0.586149 0.552465
+vt 0.577878 0.552464
+vt 0.577878 0.548335
+vt 0.586150 0.548336
+vt 0.594421 0.548336
+vt 0.594421 0.552465
+vt 0.602693 0.548337
+vt 0.602692 0.552466
+vt 0.594421 0.556594
+vt 0.586149 0.556594
+vt 0.594420 0.560723
+vt 0.586149 0.560723
+vt 0.602692 0.556595
+vt 0.602692 0.560724
+vt 0.577877 0.556593
+vt 0.577877 0.560722
+vt 0.619236 0.552466
+vt 0.610964 0.552466
+vt 0.610964 0.548337
+vt 0.619236 0.548337
+vt 0.627508 0.548338
+vt 0.627507 0.552467
+vt 0.635779 0.548338
+vt 0.635779 0.552467
+vt 0.627507 0.556596
+vt 0.619236 0.556595
+vt 0.627507 0.560725
+vt 0.619235 0.560724
+vt 0.635779 0.556596
+vt 0.635779 0.560725
+vt 0.610964 0.556595
+vt 0.610964 0.560724
+vt 0.652322 0.552468
+vt 0.644051 0.552467
+vt 0.644051 0.548338
+vt 0.652322 0.548339
+vt 0.660594 0.548339
+vt 0.660594 0.552468
+vt 0.668866 0.548339
+vt 0.668866 0.552468
+vt 0.660594 0.556597
+vt 0.652322 0.556597
+vt 0.660594 0.560726
+vt 0.652322 0.560726
+vt 0.668865 0.556597
+vt 0.668865 0.560726
+vt 0.644050 0.556596
+vt 0.644050 0.560725
+vt 0.685409 0.552468
+vt 0.677137 0.552468
+vt 0.677137 0.548339
+vt 0.685409 0.548339
+vt 0.693680 0.548339
+vt 0.693680 0.552468
+vt 0.701952 0.548339
+vt 0.701952 0.552468
+vt 0.693680 0.556597
+vt 0.685409 0.556597
+vt 0.693680 0.560726
+vt 0.685409 0.560726
+vt 0.701952 0.556597
+vt 0.701952 0.560726
+vt 0.677137 0.556597
+vt 0.677137 0.560726
+vt 0.718495 0.552468
+vt 0.710224 0.552468
+vt 0.710224 0.548339
+vt 0.718495 0.548339
+vt 0.726767 0.548339
+vt 0.726767 0.552468
+vt 0.735039 0.548339
+vt 0.735039 0.552468
+vt 0.726767 0.556597
+vt 0.718495 0.556597
+vt 0.726767 0.560726
+vt 0.718495 0.560726
+vt 0.735039 0.556597
+vt 0.735039 0.560726
+vt 0.710224 0.556597
+vt 0.710224 0.560726
+vt 0.751582 0.552468
+vt 0.743310 0.552468
+vt 0.743310 0.548339
+vt 0.751582 0.548338
+vt 0.759853 0.548338
+vt 0.759854 0.552467
+vt 0.768125 0.548338
+vt 0.768125 0.552467
+vt 0.759854 0.556596
+vt 0.751582 0.556597
+vt 0.759854 0.560725
+vt 0.751582 0.560726
+vt 0.768125 0.556596
+vt 0.768126 0.560725
+vt 0.743310 0.556597
+vt 0.743311 0.560726
+vt 0.784669 0.552466
+vt 0.776397 0.552467
+vt 0.776397 0.548338
+vt 0.784668 0.548337
+vt 0.792940 0.548337
+vt 0.792940 0.552466
+vt 0.801212 0.548337
+vt 0.801212 0.552466
+vt 0.792940 0.556595
+vt 0.784669 0.556595
+vt 0.792940 0.560724
+vt 0.784669 0.560724
+vt 0.801212 0.556595
+vt 0.801212 0.560724
+vt 0.776397 0.556596
+vt 0.776397 0.560725
+vt 0.817755 0.552465
+vt 0.809483 0.552465
+vt 0.809483 0.548336
+vt 0.817755 0.548336
+vt 0.826026 0.548335
+vt 0.826027 0.552464
+vt 0.834298 0.548335
+vt 0.834298 0.552464
+vt 0.826027 0.556593
+vt 0.817755 0.556594
+vt 0.826027 0.560722
+vt 0.817755 0.560723
+vt 0.834298 0.556593
+vt 0.834299 0.560722
+vt 0.809484 0.556594
+vt 0.809484 0.560723
+vt 0.850841 0.552463
+vt 0.842570 0.552463
+vt 0.842569 0.548334
+vt 0.850841 0.548334
+vt 0.859113 0.548333
+vt 0.859113 0.552462
+vt 0.867384 0.548333
+vt 0.867384 0.552462
+vt 0.859113 0.556591
+vt 0.850842 0.556592
+vt 0.859114 0.560720
+vt 0.850842 0.560721
+vt 0.867385 0.556591
+vt 0.867385 0.560720
+vt 0.842570 0.556592
+vt 0.842570 0.560721
+vt 0.883928 0.552460
+vt 0.875656 0.552461
+vt 0.875656 0.548332
+vt 0.883927 0.548331
+vt 0.892199 0.548331
+vt 0.892199 0.552460
+vt 0.900470 0.548330
+vt 0.900471 0.552459
+vt 0.892200 0.556589
+vt 0.883928 0.556589
+vt 0.892200 0.560718
+vt 0.883928 0.560719
+vt 0.900471 0.556588
+vt 0.900471 0.560717
+vt 0.875656 0.556590
+vt 0.875657 0.560719
+vt 0.122947 0.552458
+vt 0.114675 0.552459
+vt 0.114675 0.548330
+vt 0.122946 0.548329
+vt 0.106403 0.552459
+vt 0.106403 0.548330
+vt 0.131218 0.548329
+vt 0.131218 0.552458
+vt 0.139489 0.548328
+vt 0.139490 0.552457
+vt 0.131218 0.556587
+vt 0.122947 0.556587
+vt 0.131219 0.560716
+vt 0.122947 0.560716
+vt 0.139490 0.556586
+vt 0.139490 0.560715
+vt 0.114675 0.556588
+vt 0.106404 0.556588
+vt 0.114676 0.560717
+vt 0.106404 0.560717
+vt 0.156033 0.552456
+vt 0.147761 0.552456
+vt 0.147761 0.548327
+vt 0.156032 0.548327
+vt 0.164304 0.548326
+vt 0.164304 0.552455
+vt 0.172575 0.548326
+vt 0.172575 0.552455
+vt 0.164304 0.556584
+vt 0.156033 0.556585
+vt 0.164305 0.560714
+vt 0.156033 0.560714
+vt 0.172576 0.556584
+vt 0.172576 0.560713
+vt 0.147761 0.556585
+vt 0.147762 0.560715
+vt 0.189118 0.552454
+vt 0.180847 0.552454
+vt 0.180847 0.548325
+vt 0.189118 0.548325
+vt 0.197390 0.548324
+vt 0.197390 0.552454
+vt 0.205661 0.548324
+vt 0.205661 0.552453
+vt 0.197390 0.556583
+vt 0.189119 0.556583
+vt 0.197390 0.560712
+vt 0.189119 0.560712
+vt 0.205662 0.556582
+vt 0.205662 0.560711
+vt 0.180847 0.556583
+vt 0.180847 0.560713
+vt 0.222204 0.552452
+vt 0.213933 0.552453
+vt 0.213933 0.548324
+vt 0.222204 0.548323
+vt 0.230476 0.548323
+vt 0.230476 0.552452
+vt 0.238747 0.548323
+vt 0.238747 0.552452
+vt 0.230476 0.556581
+vt 0.222204 0.556581
+vt 0.230476 0.560710
+vt 0.222205 0.560710
+vt 0.238747 0.556581
+vt 0.238747 0.560710
+vt 0.213933 0.556582
+vt 0.213933 0.560711
+vt 0.255290 0.552451
+vt 0.247019 0.552451
+vt 0.247018 0.548322
+vt 0.255290 0.548322
+vt 0.263561 0.548322
+vt 0.263561 0.552451
+vt 0.271833 0.548322
+vt 0.271833 0.552451
+vt 0.263561 0.556580
+vt 0.255290 0.556580
+vt 0.263562 0.560709
+vt 0.255290 0.560709
+vt 0.271833 0.556580
+vt 0.271833 0.560709
+vt 0.247019 0.556581
+vt 0.247019 0.560710
+vt 0.288376 0.552451
+vt 0.280104 0.552451
+vt 0.280104 0.548322
+vt 0.288376 0.548322
+vt 0.296647 0.548322
+vt 0.296647 0.552451
+vt 0.304919 0.548321
+vt 0.304919 0.552451
+vt 0.296647 0.556580
+vt 0.288376 0.556580
+vt 0.296647 0.560709
+vt 0.288376 0.560709
+vt 0.304919 0.556580
+vt 0.304919 0.560709
+vt 0.280104 0.556580
+vt 0.280104 0.560709
+vt 0.321461 0.552451
+vt 0.313190 0.552451
+vt 0.313190 0.548321
+vt 0.321461 0.548321
+vt 0.329733 0.548322
+vt 0.329733 0.552451
+vt 0.329733 0.556580
+vt 0.321461 0.556580
+vt 0.329733 0.560709
+vt 0.321461 0.560709
+vt 0.313190 0.556580
+vt 0.313190 0.560709
+vt 0.354547 0.568944
+vt 0.346275 0.568943
+vt 0.346275 0.564838
+vt 0.354547 0.564838
+vt 0.338004 0.568943
+vt 0.338004 0.564838
+vt 0.362818 0.564839
+vt 0.362818 0.568944
+vt 0.371089 0.564839
+vt 0.371089 0.568944
+vt 0.362818 0.573001
+vt 0.354546 0.573001
+vt 0.362818 0.576986
+vt 0.354546 0.576986
+vt 0.371089 0.573001
+vt 0.371089 0.576986
+vt 0.346275 0.573001
+vt 0.338004 0.573000
+vt 0.346275 0.576986
+vt 0.338004 0.576986
+vt 0.387632 0.568945
+vt 0.379361 0.568944
+vt 0.379361 0.564839
+vt 0.387632 0.564840
+vt 0.395904 0.564840
+vt 0.395903 0.568945
+vt 0.404175 0.564840
+vt 0.404175 0.568946
+vt 0.395903 0.573002
+vt 0.387632 0.573002
+vt 0.395903 0.576988
+vt 0.387632 0.576987
+vt 0.404175 0.573003
+vt 0.404174 0.576988
+vt 0.379360 0.573002
+vt 0.379360 0.576987
+vt 0.420718 0.568946
+vt 0.412446 0.568946
+vt 0.412446 0.564841
+vt 0.420718 0.564841
+vt 0.428989 0.564842
+vt 0.428989 0.568947
+vt 0.437261 0.564842
+vt 0.437260 0.568947
+vt 0.428989 0.573004
+vt 0.420717 0.573004
+vt 0.428988 0.576989
+vt 0.420717 0.576989
+vt 0.437260 0.573004
+vt 0.437260 0.576990
+vt 0.412446 0.573003
+vt 0.412446 0.576988
+vt 0.453803 0.568948
+vt 0.445532 0.568948
+vt 0.445532 0.564843
+vt 0.453804 0.564843
+vt 0.462075 0.564844
+vt 0.462075 0.568949
+vt 0.470347 0.564844
+vt 0.470346 0.568950
+vt 0.462074 0.573006
+vt 0.453803 0.573006
+vt 0.462074 0.576991
+vt 0.453803 0.576991
+vt 0.470346 0.573007
+vt 0.470346 0.576992
+vt 0.445532 0.573005
+vt 0.445531 0.576990
+vt 0.486889 0.568951
+vt 0.478618 0.568950
+vt 0.478618 0.564845
+vt 0.486890 0.564846
+vt 0.495161 0.564846
+vt 0.495161 0.568951
+vt 0.503433 0.564847
+vt 0.503432 0.568952
+vt 0.495160 0.573008
+vt 0.486889 0.573008
+vt 0.495160 0.576994
+vt 0.486889 0.576993
+vt 0.503432 0.573009
+vt 0.503432 0.576994
+vt 0.478617 0.573007
+vt 0.478617 0.576993
+vt 0.519975 0.568953
+vt 0.511704 0.568952
+vt 0.511704 0.564847
+vt 0.519976 0.564848
+vt 0.528247 0.564848
+vt 0.528247 0.568954
+vt 0.536519 0.564849
+vt 0.536519 0.568954
+vt 0.528247 0.573011
+vt 0.519975 0.573010
+vt 0.528246 0.576996
+vt 0.519975 0.576995
+vt 0.536518 0.573011
+vt 0.536518 0.576996
+vt 0.511703 0.573009
+vt 0.511703 0.576995
+vt 0.553062 0.568955
+vt 0.544790 0.568955
+vt 0.544790 0.564849
+vt 0.553062 0.564850
+vt 0.561334 0.564851
+vt 0.561333 0.568956
+vt 0.569605 0.564851
+vt 0.569605 0.568956
+vt 0.561333 0.573013
+vt 0.553061 0.573012
+vt 0.561333 0.576998
+vt 0.553061 0.576998
+vt 0.569605 0.573013
+vt 0.569604 0.576999
+vt 0.544790 0.573012
+vt 0.544790 0.576997
+vt 0.586148 0.568957
+vt 0.577877 0.568957
+vt 0.577877 0.564852
+vt 0.586149 0.564852
+vt 0.594420 0.564852
+vt 0.594420 0.568958
+vt 0.602692 0.564853
+vt 0.602692 0.568958
+vt 0.594420 0.573015
+vt 0.586148 0.573014
+vt 0.594419 0.577000
+vt 0.586148 0.576999
+vt 0.602691 0.573015
+vt 0.602691 0.577000
+vt 0.577876 0.573014
+vt 0.577876 0.576999
+vt 0.619235 0.568959
+vt 0.610963 0.568958
+vt 0.610964 0.564853
+vt 0.619235 0.564854
+vt 0.627507 0.564854
+vt 0.627507 0.568959
+vt 0.635779 0.564854
+vt 0.635778 0.568959
+vt 0.627506 0.573016
+vt 0.619235 0.573016
+vt 0.627506 0.577001
+vt 0.619235 0.577001
+vt 0.635778 0.573017
+vt 0.635778 0.577002
+vt 0.610963 0.573015
+vt 0.610963 0.577001
+vt 0.652322 0.568960
+vt 0.644050 0.568960
+vt 0.644050 0.564855
+vt 0.652322 0.564855
+vt 0.660594 0.564855
+vt 0.660594 0.568960
+vt 0.668865 0.564855
+vt 0.668865 0.568960
+vt 0.660593 0.573017
+vt 0.652322 0.573017
+vt 0.660593 0.577002
+vt 0.652322 0.577002
+vt 0.668865 0.573017
+vt 0.668865 0.577003
+vt 0.644050 0.573017
+vt 0.644050 0.577002
+vt 0.685409 0.568960
+vt 0.677137 0.568960
+vt 0.677137 0.564855
+vt 0.685409 0.564855
+vt 0.693680 0.564855
+vt 0.693680 0.568960
+vt 0.701952 0.564855
+vt 0.701952 0.568960
+vt 0.693680 0.573018
+vt 0.685409 0.573018
+vt 0.693680 0.577003
+vt 0.685409 0.577003
+vt 0.701952 0.573018
+vt 0.701952 0.577003
+vt 0.677137 0.573017
+vt 0.677137 0.577003
+vt 0.718496 0.568960
+vt 0.710224 0.568960
+vt 0.710224 0.564855
+vt 0.718496 0.564855
+vt 0.726767 0.564855
+vt 0.726767 0.568960
+vt 0.735039 0.564855
+vt 0.735039 0.568960
+vt 0.726767 0.573017
+vt 0.718496 0.573018
+vt 0.726767 0.577003
+vt 0.718496 0.577003
+vt 0.735039 0.573017
+vt 0.735039 0.577003
+vt 0.710224 0.573018
+vt 0.710224 0.577003
+vt 0.751582 0.568960
+vt 0.743311 0.568960
+vt 0.743311 0.564855
+vt 0.751582 0.564855
+vt 0.759854 0.564854
+vt 0.759854 0.568960
+vt 0.768126 0.564854
+vt 0.768126 0.568959
+vt 0.759854 0.573017
+vt 0.751583 0.573017
+vt 0.759855 0.577002
+vt 0.751583 0.577002
+vt 0.768126 0.573016
+vt 0.768126 0.577002
+vt 0.743311 0.573017
+vt 0.743311 0.577002
+vt 0.784669 0.568959
+vt 0.776398 0.568959
+vt 0.776397 0.564854
+vt 0.784669 0.564854
+vt 0.792941 0.564853
+vt 0.792941 0.568958
+vt 0.801212 0.564853
+vt 0.801213 0.568958
+vt 0.792941 0.573015
+vt 0.784669 0.573016
+vt 0.792941 0.577001
+vt 0.784670 0.577001
+vt 0.801213 0.573015
+vt 0.801213 0.577000
+vt 0.776398 0.573016
+vt 0.776398 0.577001
+vt 0.817756 0.568957
+vt 0.809484 0.568957
+vt 0.809484 0.564852
+vt 0.817756 0.564852
+vt 0.826027 0.564851
+vt 0.826028 0.568956
+vt 0.834299 0.564851
+vt 0.834299 0.568956
+vt 0.826028 0.573014
+vt 0.817756 0.573014
+vt 0.826028 0.576999
+vt 0.817757 0.576999
+vt 0.834300 0.573013
+vt 0.834300 0.576998
+vt 0.809485 0.573015
+vt 0.809485 0.577000
+vt 0.850842 0.568955
+vt 0.842571 0.568955
+vt 0.842571 0.564850
+vt 0.850842 0.564850
+vt 0.859114 0.564849
+vt 0.859114 0.568954
+vt 0.867385 0.564849
+vt 0.867386 0.568954
+vt 0.859114 0.573012
+vt 0.850843 0.573012
+vt 0.859115 0.576997
+vt 0.850843 0.576997
+vt 0.867386 0.573011
+vt 0.867386 0.576996
+vt 0.842571 0.573013
+vt 0.842571 0.576998
+vt 0.883929 0.568953
+vt 0.875657 0.568953
+vt 0.875657 0.564848
+vt 0.883929 0.564848
+vt 0.892200 0.564847
+vt 0.892200 0.568952
+vt 0.900472 0.564847
+vt 0.900472 0.568952
+vt 0.892201 0.573009
+vt 0.883929 0.573010
+vt 0.892201 0.576995
+vt 0.883929 0.576995
+vt 0.900472 0.573009
+vt 0.900473 0.576994
+vt 0.875658 0.573010
+vt 0.875658 0.576996
+vt 0.122948 0.568950
+vt 0.114676 0.568951
+vt 0.114676 0.564846
+vt 0.122947 0.564845
+vt 0.106405 0.568952
+vt 0.106404 0.564847
+vt 0.131219 0.564845
+vt 0.131219 0.568950
+vt 0.139490 0.564844
+vt 0.139491 0.568949
+vt 0.131220 0.573007
+vt 0.122948 0.573008
+vt 0.131220 0.576992
+vt 0.122948 0.576993
+vt 0.139491 0.573006
+vt 0.139491 0.576992
+vt 0.114677 0.573008
+vt 0.106405 0.573009
+vt 0.114677 0.576993
+vt 0.106405 0.576994
+vt 0.156034 0.568948
+vt 0.147762 0.568949
+vt 0.147762 0.564844
+vt 0.156033 0.564843
+vt 0.164305 0.564843
+vt 0.164305 0.568948
+vt 0.172576 0.564842
+vt 0.172577 0.568947
+vt 0.164305 0.573005
+vt 0.156034 0.573005
+vt 0.164306 0.576990
+vt 0.156034 0.576991
+vt 0.172577 0.573004
+vt 0.172577 0.576990
+vt 0.147763 0.573006
+vt 0.147763 0.576991
+vt 0.189119 0.568946
+vt 0.180848 0.568947
+vt 0.180848 0.564842
+vt 0.189119 0.564841
+vt 0.197391 0.564841
+vt 0.197391 0.568946
+vt 0.205662 0.564840
+vt 0.205662 0.568945
+vt 0.197391 0.573003
+vt 0.189120 0.573003
+vt 0.197391 0.576988
+vt 0.189120 0.576989
+vt 0.205662 0.573003
+vt 0.205663 0.576988
+vt 0.180848 0.573004
+vt 0.180849 0.576989
+vt 0.222205 0.568945
+vt 0.213934 0.568945
+vt 0.213933 0.564840
+vt 0.222205 0.564840
+vt 0.230476 0.564839
+vt 0.230476 0.568944
+vt 0.238748 0.564839
+vt 0.238748 0.568944
+vt 0.230477 0.573002
+vt 0.222205 0.573002
+vt 0.230477 0.576987
+vt 0.222205 0.576987
+vt 0.238748 0.573001
+vt 0.238748 0.576986
+vt 0.213934 0.573002
+vt 0.213934 0.576988
+vt 0.255290 0.568944
+vt 0.247019 0.568944
+vt 0.247019 0.564839
+vt 0.255290 0.564838
+vt 0.263562 0.564838
+vt 0.263562 0.568943
+vt 0.271833 0.564838
+vt 0.271833 0.568943
+vt 0.263562 0.573000
+vt 0.255291 0.573001
+vt 0.263562 0.576986
+vt 0.255291 0.576986
+vt 0.271833 0.573000
+vt 0.271833 0.576986
+vt 0.247019 0.573001
+vt 0.247019 0.576986
+vt 0.288376 0.568943
+vt 0.280104 0.568943
+vt 0.280104 0.564838
+vt 0.288376 0.564838
+vt 0.296647 0.564838
+vt 0.296647 0.568943
+vt 0.304919 0.564838
+vt 0.304919 0.568943
+vt 0.296647 0.573000
+vt 0.288376 0.573000
+vt 0.296647 0.576985
+vt 0.288376 0.576985
+vt 0.304919 0.573000
+vt 0.304919 0.576985
+vt 0.280105 0.573000
+vt 0.280105 0.576985
+vt 0.321461 0.568943
+vt 0.313190 0.568943
+vt 0.313190 0.564838
+vt 0.321461 0.564838
+vt 0.329733 0.564838
+vt 0.329733 0.568943
+vt 0.329732 0.573000
+vt 0.321461 0.573000
+vt 0.329732 0.576985
+vt 0.321461 0.576985
+vt 0.313190 0.573000
+vt 0.313190 0.576985
+vt 0.354546 0.584468
+vt 0.346275 0.584468
+vt 0.346275 0.580875
+vt 0.354546 0.580875
+vt 0.338004 0.584467
+vt 0.338004 0.580875
+vt 0.362817 0.580876
+vt 0.362817 0.584468
+vt 0.371089 0.580876
+vt 0.371089 0.584468
+vt 0.362817 0.587562
+vt 0.354546 0.587562
+vt 0.362817 0.589958
+vt 0.354546 0.589958
+vt 0.371089 0.587563
+vt 0.371088 0.589958
+vt 0.346275 0.587562
+vt 0.338003 0.587562
+vt 0.346275 0.589958
+vt 0.338003 0.589957
+vt 0.387631 0.584469
+vt 0.379360 0.584469
+vt 0.379360 0.580876
+vt 0.387631 0.580876
+vt 0.395903 0.580877
+vt 0.395903 0.584469
+vt 0.404174 0.580877
+vt 0.404174 0.584470
+vt 0.395902 0.587564
+vt 0.387631 0.587563
+vt 0.395902 0.589959
+vt 0.387631 0.589959
+vt 0.404174 0.587564
+vt 0.404174 0.589960
+vt 0.379360 0.587563
+vt 0.379360 0.589959
+vt 0.420717 0.584471
+vt 0.412445 0.584470
+vt 0.412445 0.580878
+vt 0.420717 0.580878
+vt 0.428988 0.580879
+vt 0.428988 0.584471
+vt 0.437260 0.580879
+vt 0.437259 0.584472
+vt 0.428988 0.587565
+vt 0.420716 0.587565
+vt 0.428988 0.589961
+vt 0.420716 0.589960
+vt 0.437259 0.587566
+vt 0.437259 0.589961
+vt 0.412445 0.587565
+vt 0.412445 0.589960
+vt 0.453802 0.584473
+vt 0.445531 0.584472
+vt 0.445531 0.580880
+vt 0.453802 0.580880
+vt 0.462074 0.580881
+vt 0.462074 0.584473
+vt 0.470345 0.580881
+vt 0.470345 0.584474
+vt 0.462073 0.587568
+vt 0.453802 0.587567
+vt 0.462073 0.589963
+vt 0.453802 0.589962
+vt 0.470345 0.587568
+vt 0.470345 0.589964
+vt 0.445530 0.587566
+vt 0.445530 0.589962
+vt 0.486888 0.584475
+vt 0.478617 0.584474
+vt 0.478617 0.580882
+vt 0.486888 0.580882
+vt 0.495160 0.580883
+vt 0.495160 0.584475
+vt 0.503431 0.580884
+vt 0.503431 0.584476
+vt 0.495159 0.587570
+vt 0.486888 0.587569
+vt 0.495159 0.589965
+vt 0.486888 0.589965
+vt 0.503431 0.587570
+vt 0.503431 0.589966
+vt 0.478616 0.587569
+vt 0.478616 0.589964
+vt 0.519974 0.584477
+vt 0.511703 0.584477
+vt 0.511703 0.580884
+vt 0.519974 0.580885
+vt 0.528246 0.580885
+vt 0.528246 0.584478
+vt 0.536518 0.580886
+vt 0.536517 0.584478
+vt 0.528245 0.587572
+vt 0.519974 0.587572
+vt 0.528245 0.589968
+vt 0.519974 0.589967
+vt 0.536517 0.587573
+vt 0.536517 0.589968
+vt 0.511702 0.587571
+vt 0.511702 0.589966
+vt 0.553061 0.584479
+vt 0.544789 0.584479
+vt 0.544789 0.580886
+vt 0.553061 0.580887
+vt 0.561332 0.580887
+vt 0.561332 0.584480
+vt 0.569604 0.580888
+vt 0.569604 0.584480
+vt 0.561332 0.587574
+vt 0.553060 0.587574
+vt 0.561332 0.589970
+vt 0.553060 0.589969
+vt 0.569604 0.587575
+vt 0.569604 0.589970
+vt 0.544789 0.587573
+vt 0.544788 0.589969
+vt 0.586147 0.584481
+vt 0.577876 0.584481
+vt 0.577876 0.580888
+vt 0.586148 0.580889
+vt 0.594419 0.580889
+vt 0.594419 0.584482
+vt 0.602691 0.580890
+vt 0.602691 0.584482
+vt 0.594419 0.587576
+vt 0.586147 0.587576
+vt 0.594419 0.589972
+vt 0.586147 0.589971
+vt 0.602691 0.587577
+vt 0.602690 0.589972
+vt 0.577875 0.587575
+vt 0.577875 0.589971
+vt 0.619234 0.584483
+vt 0.610963 0.584483
+vt 0.610963 0.580890
+vt 0.619234 0.580890
+vt 0.627506 0.580891
+vt 0.627506 0.584483
+vt 0.635778 0.580891
+vt 0.635778 0.584484
+vt 0.627506 0.587578
+vt 0.619234 0.587577
+vt 0.627506 0.589973
+vt 0.619234 0.589973
+vt 0.635778 0.587578
+vt 0.635777 0.589973
+vt 0.610962 0.587577
+vt 0.610962 0.589972
+vt 0.652321 0.584484
+vt 0.644050 0.584484
+vt 0.644050 0.580891
+vt 0.652321 0.580892
+vt 0.660593 0.580892
+vt 0.660593 0.584484
+vt 0.668865 0.580892
+vt 0.668865 0.584484
+vt 0.660593 0.587579
+vt 0.652321 0.587578
+vt 0.660593 0.589974
+vt 0.652321 0.589974
+vt 0.668865 0.587579
+vt 0.668865 0.589974
+vt 0.644049 0.587578
+vt 0.644049 0.589974
+vt 0.685409 0.584485
+vt 0.677137 0.584485
+vt 0.677137 0.580892
+vt 0.685409 0.580892
+vt 0.693680 0.580892
+vt 0.693680 0.584485
+vt 0.701952 0.580892
+vt 0.701952 0.584485
+vt 0.693680 0.587579
+vt 0.685408 0.587579
+vt 0.693680 0.589975
+vt 0.685408 0.589975
+vt 0.701952 0.587579
+vt 0.701952 0.589975
+vt 0.677137 0.587579
+vt 0.677137 0.589974
+vt 0.718496 0.584485
+vt 0.710224 0.584485
+vt 0.710224 0.580892
+vt 0.718496 0.580892
+vt 0.726768 0.580892
+vt 0.726768 0.584484
+vt 0.735039 0.580892
+vt 0.735039 0.584484
+vt 0.726768 0.587579
+vt 0.718496 0.587579
+vt 0.726768 0.589974
+vt 0.718496 0.589975
+vt 0.735039 0.587579
+vt 0.735040 0.589974
+vt 0.710224 0.587579
+vt 0.710224 0.589975
+vt 0.751583 0.584484
+vt 0.743311 0.584484
+vt 0.743311 0.580892
+vt 0.751583 0.580891
+vt 0.759855 0.580891
+vt 0.759855 0.584484
+vt 0.768126 0.580891
+vt 0.768127 0.584483
+vt 0.759855 0.587578
+vt 0.751583 0.587578
+vt 0.759855 0.589974
+vt 0.751583 0.589974
+vt 0.768127 0.587578
+vt 0.768127 0.589973
+vt 0.743311 0.587579
+vt 0.743311 0.589974
+vt 0.784670 0.584483
+vt 0.776398 0.584483
+vt 0.776398 0.580891
+vt 0.784670 0.580890
+vt 0.792942 0.580890
+vt 0.792942 0.584482
+vt 0.801213 0.580890
+vt 0.801214 0.584482
+vt 0.792942 0.587577
+vt 0.784670 0.587577
+vt 0.792942 0.589972
+vt 0.784670 0.589973
+vt 0.801214 0.587577
+vt 0.801214 0.589972
+vt 0.776398 0.587578
+vt 0.776399 0.589973
+vt 0.817757 0.584481
+vt 0.809485 0.584482
+vt 0.809485 0.580889
+vt 0.817757 0.580889
+vt 0.826028 0.580888
+vt 0.826029 0.584481
+vt 0.834300 0.580888
+vt 0.834300 0.584480
+vt 0.826029 0.587575
+vt 0.817757 0.587576
+vt 0.826029 0.589971
+vt 0.817757 0.589971
+vt 0.834301 0.587575
+vt 0.834301 0.589970
+vt 0.809485 0.587576
+vt 0.809486 0.589972
+vt 0.850844 0.584479
+vt 0.842572 0.584480
+vt 0.842572 0.580887
+vt 0.850843 0.580887
+vt 0.859115 0.580886
+vt 0.859115 0.584479
+vt 0.867387 0.580886
+vt 0.867387 0.584478
+vt 0.859116 0.587573
+vt 0.850844 0.587574
+vt 0.859116 0.589968
+vt 0.850844 0.589969
+vt 0.867387 0.587572
+vt 0.867387 0.589968
+vt 0.842572 0.587574
+vt 0.842572 0.589970
+vt 0.883930 0.584477
+vt 0.875659 0.584477
+vt 0.875658 0.580885
+vt 0.883930 0.580884
+vt 0.892201 0.580884
+vt 0.892202 0.584476
+vt 0.900473 0.580883
+vt 0.900473 0.584476
+vt 0.892202 0.587571
+vt 0.883930 0.587571
+vt 0.892202 0.589966
+vt 0.883931 0.589967
+vt 0.900474 0.587570
+vt 0.900474 0.589966
+vt 0.875659 0.587572
+vt 0.875659 0.589967
+vt 0.122949 0.584475
+vt 0.114678 0.584475
+vt 0.114677 0.580883
+vt 0.122949 0.580882
+vt 0.106406 0.584476
+vt 0.106406 0.580883
+vt 0.131220 0.580882
+vt 0.131220 0.584474
+vt 0.139492 0.580881
+vt 0.139492 0.584473
+vt 0.131221 0.587569
+vt 0.122949 0.587569
+vt 0.131221 0.589964
+vt 0.122949 0.589965
+vt 0.139492 0.587568
+vt 0.139492 0.589963
+vt 0.114678 0.587570
+vt 0.106406 0.587570
+vt 0.114678 0.589965
+vt 0.106407 0.589966
+vt 0.156035 0.584472
+vt 0.147763 0.584473
+vt 0.147763 0.580881
+vt 0.156035 0.580880
+vt 0.164306 0.580879
+vt 0.164306 0.584472
+vt 0.172577 0.580879
+vt 0.172578 0.584471
+vt 0.164307 0.587566
+vt 0.156035 0.587567
+vt 0.164307 0.589962
+vt 0.156035 0.589962
+vt 0.172578 0.587566
+vt 0.172578 0.589961
+vt 0.147764 0.587567
+vt 0.147764 0.589963
+vt 0.189120 0.584470
+vt 0.180849 0.584471
+vt 0.180849 0.580878
+vt 0.189120 0.580878
+vt 0.197392 0.580878
+vt 0.197392 0.584470
+vt 0.205663 0.580877
+vt 0.205663 0.584470
+vt 0.197392 0.587564
+vt 0.189121 0.587565
+vt 0.197392 0.589960
+vt 0.189121 0.589960
+vt 0.205663 0.587564
+vt 0.205663 0.589960
+vt 0.180849 0.587565
+vt 0.180849 0.589961
+vt 0.222206 0.584469
+vt 0.213934 0.584469
+vt 0.213934 0.580877
+vt 0.222206 0.580876
+vt 0.230477 0.580876
+vt 0.230477 0.584469
+vt 0.238748 0.580876
+vt 0.238748 0.584468
+vt 0.230477 0.587563
+vt 0.222206 0.587563
+vt 0.230477 0.589958
+vt 0.222206 0.589959
+vt 0.238749 0.587563
+vt 0.238749 0.589958
+vt 0.213935 0.587564
+vt 0.213935 0.589959
+vt 0.255291 0.584468
+vt 0.247020 0.584468
+vt 0.247020 0.580876
+vt 0.255291 0.580875
+vt 0.263562 0.580875
+vt 0.263562 0.584467
+vt 0.271833 0.580875
+vt 0.271833 0.584467
+vt 0.263562 0.587562
+vt 0.255291 0.587562
+vt 0.263562 0.589957
+vt 0.255291 0.589958
+vt 0.271834 0.587562
+vt 0.271834 0.589957
+vt 0.247020 0.587562
+vt 0.247020 0.589958
+vt 0.288376 0.584467
+vt 0.280105 0.584467
+vt 0.280105 0.580875
+vt 0.288376 0.580875
+vt 0.296647 0.580875
+vt 0.296647 0.584467
+vt 0.304919 0.580875
+vt 0.304918 0.584467
+vt 0.296647 0.587562
+vt 0.288376 0.587562
+vt 0.296647 0.589957
+vt 0.288376 0.589957
+vt 0.304918 0.587562
+vt 0.304918 0.589957
+vt 0.280105 0.587562
+vt 0.280105 0.589957
+vt 0.321461 0.584467
+vt 0.313190 0.584467
+vt 0.313190 0.580875
+vt 0.321461 0.580875
+vt 0.329732 0.580875
+vt 0.329732 0.584467
+vt 0.329732 0.587562
+vt 0.321461 0.587562
+vt 0.329732 0.589957
+vt 0.321461 0.589957
+vt 0.313190 0.587562
+vt 0.313190 0.589957
+vt 0.354545 0.603026
+vt 0.346274 0.603025
+vt 0.346274 0.599960
+vt 0.354546 0.599960
+vt 0.346274 0.597621
+vt 0.354546 0.597622
+vt 0.338003 0.603025
+vt 0.338003 0.599959
+vt 0.338003 0.597621
+vt 0.362817 0.599960
+vt 0.362817 0.603026
+vt 0.371088 0.599960
+vt 0.371088 0.603026
+vt 0.362817 0.597622
+vt 0.371088 0.597622
+vt 0.362816 0.606609
+vt 0.354545 0.606609
+vt 0.362816 0.610498
+vt 0.354545 0.610498
+vt 0.371088 0.606609
+vt 0.371087 0.610498
+vt 0.346274 0.606608
+vt 0.338003 0.606608
+vt 0.346274 0.610498
+vt 0.338003 0.610497
+vt 0.387630 0.603027
+vt 0.379359 0.603026
+vt 0.379359 0.599961
+vt 0.387630 0.599961
+vt 0.379359 0.597622
+vt 0.387630 0.597623
+vt 0.395902 0.599961
+vt 0.395901 0.603027
+vt 0.404173 0.599962
+vt 0.404173 0.603028
+vt 0.395902 0.597623
+vt 0.404173 0.597623
+vt 0.395901 0.606610
+vt 0.387630 0.606610
+vt 0.395901 0.610500
+vt 0.387630 0.610499
+vt 0.404172 0.606611
+vt 0.404172 0.610500
+vt 0.379359 0.606609
+vt 0.379358 0.610499
+vt 0.420715 0.603028
+vt 0.412444 0.603028
+vt 0.412444 0.599962
+vt 0.420715 0.599963
+vt 0.412444 0.597624
+vt 0.420716 0.597624
+vt 0.428987 0.599963
+vt 0.428986 0.603029
+vt 0.437258 0.599964
+vt 0.437258 0.603029
+vt 0.428987 0.597625
+vt 0.437258 0.597625
+vt 0.428986 0.606612
+vt 0.420715 0.606611
+vt 0.428986 0.610501
+vt 0.420714 0.610501
+vt 0.437257 0.606612
+vt 0.437257 0.610502
+vt 0.412444 0.606611
+vt 0.412443 0.610500
+vt 0.453800 0.603031
+vt 0.445529 0.603030
+vt 0.445529 0.599964
+vt 0.453801 0.599965
+vt 0.445530 0.597626
+vt 0.453801 0.597626
+vt 0.462072 0.599965
+vt 0.462072 0.603031
+vt 0.470344 0.599966
+vt 0.470343 0.603032
+vt 0.462072 0.597627
+vt 0.470344 0.597627
+vt 0.462072 0.606614
+vt 0.453800 0.606613
+vt 0.462071 0.610503
+vt 0.453800 0.610503
+vt 0.470343 0.606615
+vt 0.470343 0.610504
+vt 0.445529 0.606613
+vt 0.445528 0.610502
+vt 0.486886 0.603033
+vt 0.478615 0.603032
+vt 0.478615 0.599966
+vt 0.486887 0.599967
+vt 0.478615 0.597628
+vt 0.486887 0.597629
+vt 0.495158 0.599967
+vt 0.495158 0.603033
+vt 0.503430 0.599968
+vt 0.503429 0.603034
+vt 0.495158 0.597629
+vt 0.503430 0.597630
+vt 0.495157 0.606616
+vt 0.486886 0.606616
+vt 0.495157 0.610506
+vt 0.486885 0.610505
+vt 0.503429 0.606617
+vt 0.503428 0.610506
+vt 0.478614 0.606615
+vt 0.478614 0.610505
+vt 0.519972 0.603035
+vt 0.511701 0.603034
+vt 0.511701 0.599969
+vt 0.519973 0.599969
+vt 0.511701 0.597630
+vt 0.519973 0.597631
+vt 0.528244 0.599970
+vt 0.528244 0.603036
+vt 0.536516 0.599970
+vt 0.536516 0.603036
+vt 0.528245 0.597631
+vt 0.536516 0.597632
+vt 0.528244 0.606619
+vt 0.519972 0.606618
+vt 0.528243 0.610508
+vt 0.519972 0.610507
+vt 0.536515 0.606619
+vt 0.536515 0.610508
+vt 0.511700 0.606617
+vt 0.511700 0.610507
+vt 0.553059 0.603037
+vt 0.544787 0.603037
+vt 0.544788 0.599971
+vt 0.553059 0.599971
+vt 0.544788 0.597632
+vt 0.553059 0.597633
+vt 0.561331 0.599972
+vt 0.561331 0.603038
+vt 0.569603 0.599972
+vt 0.569602 0.603038
+vt 0.561331 0.597634
+vt 0.569603 0.597634
+vt 0.561330 0.606621
+vt 0.553059 0.606620
+vt 0.561330 0.610510
+vt 0.553058 0.610510
+vt 0.569602 0.606621
+vt 0.569602 0.610511
+vt 0.544787 0.606620
+vt 0.544787 0.610509
+vt 0.586146 0.603039
+vt 0.577874 0.603039
+vt 0.577874 0.599973
+vt 0.586146 0.599973
+vt 0.577875 0.597635
+vt 0.586146 0.597635
+vt 0.594418 0.599974
+vt 0.594418 0.603040
+vt 0.602690 0.599974
+vt 0.602690 0.603040
+vt 0.594418 0.597636
+vt 0.602690 0.597636
+vt 0.594417 0.606623
+vt 0.586146 0.606622
+vt 0.594417 0.610512
+vt 0.586145 0.610512
+vt 0.602689 0.606623
+vt 0.602689 0.610512
+vt 0.577874 0.606622
+vt 0.577873 0.610511
+vt 0.619233 0.603041
+vt 0.610961 0.603041
+vt 0.610961 0.599975
+vt 0.619233 0.599975
+vt 0.610962 0.597636
+vt 0.619233 0.597637
+vt 0.627505 0.599975
+vt 0.627505 0.603041
+vt 0.635777 0.599976
+vt 0.635777 0.603041
+vt 0.627505 0.597637
+vt 0.635777 0.597637
+vt 0.627505 0.606624
+vt 0.619233 0.606624
+vt 0.627505 0.610513
+vt 0.619233 0.610513
+vt 0.635777 0.606624
+vt 0.635777 0.610514
+vt 0.610961 0.606623
+vt 0.610961 0.610513
+vt 0.652321 0.603042
+vt 0.644049 0.603042
+vt 0.644049 0.599976
+vt 0.652321 0.599976
+vt 0.644049 0.597638
+vt 0.652321 0.597638
+vt 0.660593 0.599976
+vt 0.660593 0.603042
+vt 0.668865 0.599976
+vt 0.668864 0.603042
+vt 0.660593 0.597638
+vt 0.668865 0.597638
+vt 0.660592 0.606625
+vt 0.652321 0.606625
+vt 0.660592 0.610514
+vt 0.652320 0.610514
+vt 0.668864 0.606625
+vt 0.668864 0.610515
+vt 0.644049 0.606625
+vt 0.644048 0.610514
+vt 0.685408 0.603043
+vt 0.677136 0.603042
+vt 0.677136 0.599977
+vt 0.685408 0.599977
+vt 0.677136 0.597638
+vt 0.685408 0.597638
+vt 0.693680 0.599977
+vt 0.693680 0.603043
+vt 0.701952 0.599977
+vt 0.701952 0.603043
+vt 0.693680 0.597638
+vt 0.701952 0.597638
+vt 0.693680 0.606625
+vt 0.685408 0.606625
+vt 0.693680 0.610515
+vt 0.685408 0.610515
+vt 0.701952 0.606625
+vt 0.701952 0.610515
+vt 0.677136 0.606625
+vt 0.677136 0.610515
+vt 0.718496 0.603042
+vt 0.710224 0.603042
+vt 0.710224 0.599977
+vt 0.718496 0.599977
+vt 0.710224 0.597638
+vt 0.718496 0.597638
+vt 0.726768 0.599976
+vt 0.726768 0.603042
+vt 0.735040 0.599976
+vt 0.735040 0.603042
+vt 0.726768 0.597638
+vt 0.735040 0.597638
+vt 0.726768 0.606625
+vt 0.718496 0.606625
+vt 0.726768 0.610515
+vt 0.718496 0.610515
+vt 0.735040 0.606625
+vt 0.735040 0.610514
+vt 0.710224 0.606625
+vt 0.710224 0.610515
+vt 0.751584 0.603042
+vt 0.743312 0.603042
+vt 0.743312 0.599976
+vt 0.751584 0.599976
+vt 0.743312 0.597638
+vt 0.751583 0.597638
+vt 0.759855 0.599976
+vt 0.759856 0.603042
+vt 0.768127 0.599975
+vt 0.768127 0.603041
+vt 0.759855 0.597637
+vt 0.768127 0.597637
+vt 0.759856 0.606624
+vt 0.751584 0.606625
+vt 0.759856 0.610514
+vt 0.751584 0.610514
+vt 0.768128 0.606624
+vt 0.768128 0.610514
+vt 0.743312 0.606625
+vt 0.743312 0.610514
+vt 0.784671 0.603041
+vt 0.776399 0.603041
+vt 0.776399 0.599975
+vt 0.784671 0.599975
+vt 0.776399 0.597637
+vt 0.784671 0.597636
+vt 0.792943 0.599974
+vt 0.792943 0.603040
+vt 0.801215 0.599974
+vt 0.801215 0.603040
+vt 0.792943 0.597636
+vt 0.801214 0.597636
+vt 0.792943 0.606623
+vt 0.784671 0.606624
+vt 0.792944 0.610512
+vt 0.784672 0.610513
+vt 0.801215 0.606623
+vt 0.801215 0.610512
+vt 0.776400 0.606624
+vt 0.776400 0.610513
+vt 0.817758 0.603039
+vt 0.809487 0.603040
+vt 0.809486 0.599974
+vt 0.817758 0.599973
+vt 0.809486 0.597635
+vt 0.817758 0.597635
+vt 0.826030 0.599973
+vt 0.826030 0.603039
+vt 0.834302 0.599972
+vt 0.834302 0.603038
+vt 0.826030 0.597634
+vt 0.834301 0.597634
+vt 0.826030 0.606621
+vt 0.817759 0.606622
+vt 0.826031 0.610511
+vt 0.817759 0.610511
+vt 0.834302 0.606621
+vt 0.834303 0.610510
+vt 0.809487 0.606622
+vt 0.809487 0.610512
+vt 0.850845 0.603037
+vt 0.842574 0.603038
+vt 0.842573 0.599972
+vt 0.850845 0.599971
+vt 0.842573 0.597633
+vt 0.850845 0.597633
+vt 0.859117 0.599971
+vt 0.859117 0.603036
+vt 0.867388 0.599970
+vt 0.867389 0.603036
+vt 0.859116 0.597632
+vt 0.867388 0.597632
+vt 0.859117 0.606619
+vt 0.850846 0.606620
+vt 0.859118 0.610509
+vt 0.850846 0.610509
+vt 0.867389 0.606619
+vt 0.867390 0.610508
+vt 0.842574 0.606620
+vt 0.842574 0.610510
+vt 0.883932 0.603035
+vt 0.875660 0.603035
+vt 0.875660 0.599970
+vt 0.883932 0.599969
+vt 0.875660 0.597631
+vt 0.883931 0.597631
+vt 0.892203 0.599968
+vt 0.892203 0.603034
+vt 0.900475 0.599968
+vt 0.900475 0.603034
+vt 0.892203 0.597630
+vt 0.900474 0.597629
+vt 0.892204 0.606617
+vt 0.883932 0.606618
+vt 0.892204 0.610506
+vt 0.883933 0.610507
+vt 0.900475 0.606617
+vt 0.900476 0.610506
+vt 0.875661 0.606618
+vt 0.875661 0.610508
+vt 0.122951 0.603033
+vt 0.114679 0.603033
+vt 0.114679 0.599967
+vt 0.122950 0.599967
+vt 0.114679 0.597629
+vt 0.122950 0.597628
+vt 0.106408 0.603034
+vt 0.106407 0.599968
+vt 0.106407 0.597629
+vt 0.131222 0.599966
+vt 0.131222 0.603032
+vt 0.139493 0.599965
+vt 0.139494 0.603031
+vt 0.131222 0.597628
+vt 0.139493 0.597627
+vt 0.131223 0.606615
+vt 0.122951 0.606615
+vt 0.131223 0.610504
+vt 0.122952 0.610505
+vt 0.139494 0.606614
+vt 0.139494 0.610504
+vt 0.114680 0.606616
+vt 0.106408 0.606617
+vt 0.114680 0.610505
+vt 0.106409 0.610506
+vt 0.156036 0.603030
+vt 0.147765 0.603031
+vt 0.147765 0.599965
+vt 0.156036 0.599964
+vt 0.147765 0.597627
+vt 0.156036 0.597626
+vt 0.164308 0.599964
+vt 0.164308 0.603030
+vt 0.172579 0.599963
+vt 0.172579 0.603029
+vt 0.164307 0.597626
+vt 0.172579 0.597625
+vt 0.164308 0.606613
+vt 0.156037 0.606613
+vt 0.164309 0.610502
+vt 0.156037 0.610503
+vt 0.172580 0.606612
+vt 0.172580 0.610502
+vt 0.147765 0.606614
+vt 0.147766 0.610503
+vt 0.189122 0.603028
+vt 0.180850 0.603029
+vt 0.180850 0.599963
+vt 0.189122 0.599962
+vt 0.180850 0.597625
+vt 0.189121 0.597624
+vt 0.197393 0.599962
+vt 0.197393 0.603028
+vt 0.205664 0.599962
+vt 0.205664 0.603027
+vt 0.197393 0.597624
+vt 0.205664 0.597623
+vt 0.197393 0.606611
+vt 0.189122 0.606611
+vt 0.197394 0.610500
+vt 0.189122 0.610501
+vt 0.205665 0.606610
+vt 0.205665 0.610500
+vt 0.180851 0.606612
+vt 0.180851 0.610501
+vt 0.222207 0.603027
+vt 0.213936 0.603027
+vt 0.213935 0.599961
+vt 0.222207 0.599961
+vt 0.213935 0.597623
+vt 0.222206 0.597623
+vt 0.230478 0.599960
+vt 0.230478 0.603026
+vt 0.238749 0.599960
+vt 0.238749 0.603026
+vt 0.230478 0.597622
+vt 0.238749 0.597622
+vt 0.230478 0.606609
+vt 0.222207 0.606610
+vt 0.230478 0.610499
+vt 0.222207 0.610499
+vt 0.238749 0.606609
+vt 0.238750 0.610498
+vt 0.213936 0.606610
+vt 0.213936 0.610499
+vt 0.255292 0.603026
+vt 0.247020 0.603026
+vt 0.247020 0.599960
+vt 0.255291 0.599960
+vt 0.247020 0.597622
+vt 0.255291 0.597621
+vt 0.263563 0.599959
+vt 0.263563 0.603025
+vt 0.271834 0.599959
+vt 0.271834 0.603025
+vt 0.263563 0.597621
+vt 0.271834 0.597621
+vt 0.263563 0.606608
+vt 0.255292 0.606609
+vt 0.263563 0.610498
+vt 0.255292 0.610498
+vt 0.271834 0.606608
+vt 0.271834 0.610497
+vt 0.247021 0.606609
+vt 0.247021 0.610498
+vt 0.288376 0.603025
+vt 0.280105 0.603025
+vt 0.280105 0.599959
+vt 0.288376 0.599959
+vt 0.280105 0.597621
+vt 0.288376 0.597621
+vt 0.296647 0.599959
+vt 0.296647 0.603025
+vt 0.304919 0.599959
+vt 0.304919 0.603025
+vt 0.296647 0.597621
+vt 0.304919 0.597621
+vt 0.296647 0.606608
+vt 0.288376 0.606608
+vt 0.296647 0.610497
+vt 0.288376 0.610497
+vt 0.304919 0.606608
+vt 0.304919 0.610497
+vt 0.280105 0.606608
+vt 0.280105 0.610497
+vt 0.321461 0.603025
+vt 0.313190 0.603025
+vt 0.313190 0.599959
+vt 0.321461 0.599959
+vt 0.313190 0.597621
+vt 0.321461 0.597621
+vt 0.329732 0.599959
+vt 0.329732 0.603025
+vt 0.329732 0.597621
+vt 0.329732 0.606608
+vt 0.321461 0.606608
+vt 0.329732 0.610497
+vt 0.321461 0.610497
+vt 0.313190 0.606608
+vt 0.313190 0.610497
+vt 0.354545 0.618683
+vt 0.346274 0.618683
+vt 0.346274 0.614483
+vt 0.354545 0.614483
+vt 0.338003 0.618682
+vt 0.338003 0.614483
+vt 0.362816 0.614483
+vt 0.362816 0.618683
+vt 0.371087 0.614484
+vt 0.371087 0.618683
+vt 0.362815 0.623215
+vt 0.354544 0.623215
+vt 0.362815 0.628199
+vt 0.354544 0.628199
+vt 0.371087 0.623216
+vt 0.371086 0.628199
+vt 0.346273 0.623215
+vt 0.338002 0.623215
+vt 0.346273 0.628198
+vt 0.338002 0.628198
+vt 0.387629 0.618684
+vt 0.379358 0.618684
+vt 0.379358 0.614484
+vt 0.387629 0.614484
+vt 0.395901 0.614485
+vt 0.395900 0.618684
+vt 0.404172 0.614485
+vt 0.404171 0.618685
+vt 0.395900 0.623217
+vt 0.387629 0.623216
+vt 0.395899 0.628200
+vt 0.387628 0.628200
+vt 0.404171 0.623217
+vt 0.404171 0.628201
+vt 0.379358 0.623216
+vt 0.379357 0.628200
+vt 0.420714 0.618686
+vt 0.412443 0.618685
+vt 0.412443 0.614486
+vt 0.420714 0.614486
+vt 0.428985 0.614486
+vt 0.428985 0.618686
+vt 0.437257 0.614487
+vt 0.437256 0.618687
+vt 0.428985 0.623218
+vt 0.420713 0.623218
+vt 0.428984 0.628202
+vt 0.420713 0.628202
+vt 0.437256 0.623219
+vt 0.437255 0.628203
+vt 0.412442 0.623218
+vt 0.412442 0.628201
+vt 0.453799 0.618688
+vt 0.445528 0.618687
+vt 0.445528 0.614487
+vt 0.453799 0.614488
+vt 0.462071 0.614489
+vt 0.462070 0.618688
+vt 0.470342 0.614489
+vt 0.470342 0.618689
+vt 0.462070 0.623221
+vt 0.453798 0.623220
+vt 0.462069 0.628204
+vt 0.453798 0.628204
+vt 0.470341 0.623221
+vt 0.470341 0.628205
+vt 0.445527 0.623219
+vt 0.445527 0.628203
+vt 0.486885 0.618690
+vt 0.478613 0.618689
+vt 0.478613 0.614490
+vt 0.486885 0.614490
+vt 0.495156 0.614491
+vt 0.495156 0.618690
+vt 0.503428 0.614491
+vt 0.503428 0.618691
+vt 0.495155 0.623223
+vt 0.486884 0.623222
+vt 0.495155 0.628206
+vt 0.486883 0.628206
+vt 0.503427 0.623223
+vt 0.503426 0.628207
+vt 0.478613 0.623222
+vt 0.478612 0.628205
+vt 0.519971 0.618692
+vt 0.511699 0.618692
+vt 0.511699 0.614492
+vt 0.519971 0.614493
+vt 0.528243 0.614493
+vt 0.528242 0.618693
+vt 0.536514 0.614494
+vt 0.536514 0.618693
+vt 0.528242 0.623225
+vt 0.519970 0.623224
+vt 0.528241 0.628209
+vt 0.519970 0.628208
+vt 0.536513 0.623226
+vt 0.536513 0.628209
+vt 0.511698 0.623224
+vt 0.511698 0.628208
+vt 0.553057 0.618694
+vt 0.544786 0.618694
+vt 0.544786 0.614494
+vt 0.553058 0.614495
+vt 0.561330 0.614495
+vt 0.561329 0.618695
+vt 0.569601 0.614496
+vt 0.569601 0.618695
+vt 0.561329 0.623227
+vt 0.553057 0.623227
+vt 0.561328 0.628211
+vt 0.553056 0.628210
+vt 0.569600 0.623228
+vt 0.569600 0.628211
+vt 0.544785 0.623226
+vt 0.544785 0.628210
+vt 0.586145 0.618696
+vt 0.577873 0.618696
+vt 0.577873 0.614496
+vt 0.586145 0.614497
+vt 0.594417 0.614497
+vt 0.594416 0.618697
+vt 0.602689 0.614498
+vt 0.602688 0.618697
+vt 0.594416 0.623229
+vt 0.586144 0.623229
+vt 0.594416 0.628213
+vt 0.586144 0.628212
+vt 0.602688 0.623230
+vt 0.602687 0.628213
+vt 0.577872 0.623228
+vt 0.577872 0.628212
+vt 0.619232 0.618698
+vt 0.610960 0.618698
+vt 0.610960 0.614498
+vt 0.619232 0.614498
+vt 0.627504 0.614499
+vt 0.627504 0.618698
+vt 0.635776 0.614499
+vt 0.635776 0.618699
+vt 0.627504 0.623231
+vt 0.619232 0.623230
+vt 0.627504 0.628214
+vt 0.619231 0.628214
+vt 0.635776 0.623231
+vt 0.635776 0.628214
+vt 0.610960 0.623230
+vt 0.610959 0.628214
+vt 0.652320 0.618699
+vt 0.644048 0.618699
+vt 0.644048 0.614499
+vt 0.652320 0.614499
+vt 0.660592 0.614500
+vt 0.660592 0.618699
+vt 0.668864 0.614500
+vt 0.668864 0.618699
+vt 0.660592 0.623232
+vt 0.652320 0.623231
+vt 0.660592 0.628215
+vt 0.652320 0.628215
+vt 0.668864 0.623232
+vt 0.668864 0.628215
+vt 0.644048 0.623231
+vt 0.644048 0.628215
+vt 0.685408 0.618700
+vt 0.677136 0.618700
+vt 0.677136 0.614500
+vt 0.685408 0.614500
+vt 0.693680 0.614500
+vt 0.693680 0.618700
+vt 0.701952 0.614500
+vt 0.701952 0.618700
+vt 0.693680 0.623232
+vt 0.685408 0.623232
+vt 0.693680 0.628216
+vt 0.685408 0.628216
+vt 0.701952 0.623232
+vt 0.701952 0.628216
+vt 0.677136 0.623232
+vt 0.677136 0.628215
+vt 0.718496 0.618700
+vt 0.710224 0.618700
+vt 0.710224 0.614500
+vt 0.718496 0.614500
+vt 0.726768 0.614500
+vt 0.726768 0.618699
+vt 0.735040 0.614500
+vt 0.735040 0.618699
+vt 0.726768 0.623232
+vt 0.718496 0.623232
+vt 0.726768 0.628215
+vt 0.718496 0.628216
+vt 0.735040 0.623232
+vt 0.735041 0.628215
+vt 0.710224 0.623232
+vt 0.710224 0.628216
+vt 0.751584 0.618699
+vt 0.743312 0.618699
+vt 0.743312 0.614500
+vt 0.751584 0.614499
+vt 0.759856 0.614499
+vt 0.759856 0.618699
+vt 0.768128 0.614499
+vt 0.768128 0.618698
+vt 0.759857 0.623231
+vt 0.751585 0.623231
+vt 0.759857 0.628215
+vt 0.751585 0.628215
+vt 0.768129 0.623231
+vt 0.768129 0.628214
+vt 0.743313 0.623232
+vt 0.743313 0.628215
+vt 0.784672 0.618698
+vt 0.776400 0.618698
+vt 0.776400 0.614498
+vt 0.784672 0.614498
+vt 0.792944 0.614498
+vt 0.792944 0.618697
+vt 0.801216 0.614497
+vt 0.801216 0.618697
+vt 0.792945 0.623230
+vt 0.784673 0.623230
+vt 0.792945 0.628213
+vt 0.784673 0.628214
+vt 0.801216 0.623229
+vt 0.801217 0.628213
+vt 0.776401 0.623230
+vt 0.776401 0.628214
+vt 0.817760 0.618696
+vt 0.809488 0.618697
+vt 0.809488 0.614497
+vt 0.817759 0.614496
+vt 0.826031 0.614496
+vt 0.826032 0.618696
+vt 0.834303 0.614496
+vt 0.834303 0.618695
+vt 0.826032 0.623228
+vt 0.817760 0.623228
+vt 0.826033 0.628212
+vt 0.817761 0.628212
+vt 0.834304 0.623227
+vt 0.834304 0.628211
+vt 0.809488 0.623229
+vt 0.809489 0.628213
+vt 0.850847 0.618694
+vt 0.842575 0.618695
+vt 0.842575 0.614495
+vt 0.850847 0.614495
+vt 0.859118 0.614494
+vt 0.859119 0.618694
+vt 0.867390 0.614493
+vt 0.867390 0.618693
+vt 0.859119 0.623226
+vt 0.850847 0.623226
+vt 0.859120 0.628210
+vt 0.850848 0.628210
+vt 0.867391 0.623225
+vt 0.867391 0.628209
+vt 0.842576 0.623227
+vt 0.842576 0.628211
+vt 0.883934 0.618692
+vt 0.875662 0.618693
+vt 0.875662 0.614493
+vt 0.883933 0.614492
+vt 0.892205 0.614492
+vt 0.892205 0.618691
+vt 0.900476 0.614491
+vt 0.900477 0.618691
+vt 0.892206 0.623224
+vt 0.883934 0.623224
+vt 0.892206 0.628207
+vt 0.883935 0.628208
+vt 0.900477 0.623223
+vt 0.900478 0.628207
+vt 0.875663 0.623225
+vt 0.875663 0.628208
+vt 0.122953 0.618690
+vt 0.114681 0.618690
+vt 0.114681 0.614491
+vt 0.122952 0.614490
+vt 0.106410 0.618691
+vt 0.106409 0.614491
+vt 0.131223 0.614489
+vt 0.131224 0.618689
+vt 0.139495 0.614489
+vt 0.139495 0.618688
+vt 0.131224 0.623221
+vt 0.122953 0.623222
+vt 0.131225 0.628205
+vt 0.122954 0.628206
+vt 0.139496 0.623221
+vt 0.139496 0.628204
+vt 0.114682 0.623222
+vt 0.106410 0.623223
+vt 0.114682 0.628206
+vt 0.106411 0.628207
+vt 0.156038 0.618687
+vt 0.147767 0.618688
+vt 0.147766 0.614488
+vt 0.156038 0.614488
+vt 0.164309 0.614487
+vt 0.164309 0.618687
+vt 0.172580 0.614487
+vt 0.172581 0.618686
+vt 0.164310 0.623219
+vt 0.156039 0.623220
+vt 0.164310 0.628203
+vt 0.156039 0.628203
+vt 0.172581 0.623219
+vt 0.172582 0.628202
+vt 0.147767 0.623220
+vt 0.147768 0.628204
+vt 0.189123 0.618685
+vt 0.180852 0.618686
+vt 0.180852 0.614486
+vt 0.189123 0.614486
+vt 0.197394 0.614485
+vt 0.197394 0.618685
+vt 0.205665 0.614485
+vt 0.205666 0.618685
+vt 0.197395 0.623217
+vt 0.189124 0.623218
+vt 0.197395 0.628201
+vt 0.189124 0.628201
+vt 0.205666 0.623217
+vt 0.205666 0.628201
+vt 0.180852 0.623218
+vt 0.180853 0.628202
+vt 0.222208 0.618684
+vt 0.213937 0.618684
+vt 0.213936 0.614485
+vt 0.222208 0.614484
+vt 0.230479 0.614484
+vt 0.230479 0.618683
+vt 0.238750 0.614484
+vt 0.238750 0.618683
+vt 0.230479 0.623216
+vt 0.222208 0.623216
+vt 0.230480 0.628200
+vt 0.222209 0.628200
+vt 0.238750 0.623216
+vt 0.238751 0.628199
+vt 0.213937 0.623217
+vt 0.213937 0.628200
+vt 0.255292 0.618683
+vt 0.247021 0.618683
+vt 0.247021 0.614483
+vt 0.255292 0.614483
+vt 0.263563 0.614483
+vt 0.263563 0.618682
+vt 0.271834 0.614483
+vt 0.271834 0.618682
+vt 0.263564 0.623215
+vt 0.255292 0.623215
+vt 0.263564 0.628198
+vt 0.255293 0.628199
+vt 0.271835 0.623215
+vt 0.271835 0.628198
+vt 0.247021 0.623215
+vt 0.247022 0.628199
+vt 0.288376 0.618682
+vt 0.280105 0.618682
+vt 0.280105 0.614483
+vt 0.288376 0.614482
+vt 0.296647 0.614482
+vt 0.296647 0.618682
+vt 0.304919 0.614482
+vt 0.304918 0.618682
+vt 0.296647 0.623214
+vt 0.288377 0.623214
+vt 0.296648 0.628198
+vt 0.288377 0.628198
+vt 0.304918 0.623214
+vt 0.304918 0.628198
+vt 0.280106 0.623214
+vt 0.280106 0.628198
+vt 0.321461 0.618682
+vt 0.313190 0.618682
+vt 0.313190 0.614482
+vt 0.321461 0.614482
+vt 0.329732 0.614483
+vt 0.329732 0.618682
+vt 0.329731 0.623214
+vt 0.321460 0.623214
+vt 0.329731 0.628198
+vt 0.321460 0.628198
+vt 0.313189 0.623214
+vt 0.313189 0.628198
+vt 0.354544 0.639412
+vt 0.346273 0.639412
+vt 0.346273 0.633752
+vt 0.354544 0.633752
+vt 0.338002 0.639411
+vt 0.338002 0.633752
+vt 0.362815 0.633752
+vt 0.362815 0.639412
+vt 0.371086 0.633752
+vt 0.371086 0.639412
+vt 0.362814 0.644716
+vt 0.354544 0.644715
+vt 0.362814 0.649200
+vt 0.354543 0.649199
+vt 0.371085 0.644716
+vt 0.371085 0.649200
+vt 0.346273 0.644715
+vt 0.338002 0.644715
+vt 0.346273 0.649199
+vt 0.338002 0.649199
+vt 0.387628 0.639413
+vt 0.379357 0.639413
+vt 0.379357 0.633753
+vt 0.387628 0.633753
+vt 0.395899 0.633754
+vt 0.395899 0.639413
+vt 0.404170 0.633754
+vt 0.404170 0.639414
+vt 0.395898 0.644717
+vt 0.387627 0.644717
+vt 0.395898 0.649201
+vt 0.387627 0.649201
+vt 0.404169 0.644717
+vt 0.404169 0.649201
+vt 0.379356 0.644716
+vt 0.379356 0.649200
+vt 0.420712 0.639415
+vt 0.412441 0.639414
+vt 0.412441 0.633754
+vt 0.420712 0.633755
+vt 0.428984 0.633755
+vt 0.428983 0.639415
+vt 0.437255 0.633756
+vt 0.437254 0.639416
+vt 0.428983 0.644719
+vt 0.420711 0.644718
+vt 0.428982 0.649203
+vt 0.420711 0.649202
+vt 0.437254 0.644719
+vt 0.437253 0.649203
+vt 0.412440 0.644718
+vt 0.412440 0.649202
+vt 0.453797 0.639417
+vt 0.445525 0.639416
+vt 0.445526 0.633756
+vt 0.453797 0.633757
+vt 0.462069 0.633757
+vt 0.462068 0.639417
+vt 0.470340 0.633758
+vt 0.470339 0.639418
+vt 0.462068 0.644721
+vt 0.453796 0.644720
+vt 0.462067 0.649205
+vt 0.453796 0.649204
+vt 0.470339 0.644721
+vt 0.470338 0.649205
+vt 0.445525 0.644720
+vt 0.445525 0.649204
+vt 0.486882 0.639419
+vt 0.478611 0.639418
+vt 0.478611 0.633758
+vt 0.486883 0.633759
+vt 0.495154 0.633760
+vt 0.495154 0.639419
+vt 0.503426 0.633760
+vt 0.503425 0.639420
+vt 0.495153 0.644723
+vt 0.486882 0.644722
+vt 0.495153 0.649207
+vt 0.486881 0.649206
+vt 0.503425 0.644723
+vt 0.503424 0.649207
+vt 0.478610 0.644722
+vt 0.478610 0.649206
+vt 0.519968 0.639421
+vt 0.511697 0.639421
+vt 0.511697 0.633761
+vt 0.519969 0.633761
+vt 0.528241 0.633762
+vt 0.528240 0.639422
+vt 0.536512 0.633762
+vt 0.536512 0.639422
+vt 0.528239 0.644725
+vt 0.519968 0.644725
+vt 0.528239 0.649209
+vt 0.519967 0.649209
+vt 0.536511 0.644726
+vt 0.536511 0.649210
+vt 0.511696 0.644724
+vt 0.511696 0.649208
+vt 0.553055 0.639423
+vt 0.544783 0.639423
+vt 0.544784 0.633763
+vt 0.553056 0.633764
+vt 0.561328 0.633764
+vt 0.561327 0.639424
+vt 0.569599 0.633765
+vt 0.569599 0.639425
+vt 0.561327 0.644727
+vt 0.553055 0.644727
+vt 0.561326 0.649211
+vt 0.553054 0.649211
+vt 0.569598 0.644728
+vt 0.569598 0.649212
+vt 0.544783 0.644726
+vt 0.544783 0.649210
+vt 0.586143 0.639425
+vt 0.577871 0.639425
+vt 0.577871 0.633765
+vt 0.586143 0.633766
+vt 0.594415 0.633766
+vt 0.594415 0.639426
+vt 0.602687 0.633766
+vt 0.602687 0.639426
+vt 0.594414 0.644729
+vt 0.586142 0.644729
+vt 0.594414 0.649213
+vt 0.586142 0.649213
+vt 0.602686 0.644730
+vt 0.602686 0.649214
+vt 0.577870 0.644728
+vt 0.577870 0.649212
+vt 0.619231 0.639427
+vt 0.610959 0.639427
+vt 0.610959 0.633767
+vt 0.619231 0.633767
+vt 0.627503 0.633767
+vt 0.627503 0.639427
+vt 0.635775 0.633768
+vt 0.635775 0.639428
+vt 0.627503 0.644731
+vt 0.619230 0.644730
+vt 0.627502 0.649215
+vt 0.619230 0.649214
+vt 0.635775 0.644731
+vt 0.635774 0.649215
+vt 0.610958 0.644730
+vt 0.610958 0.649214
+vt 0.652319 0.639428
+vt 0.644047 0.639428
+vt 0.644047 0.633768
+vt 0.652319 0.633768
+vt 0.660591 0.633768
+vt 0.660591 0.639428
+vt 0.668864 0.633769
+vt 0.668863 0.639428
+vt 0.660591 0.644732
+vt 0.652319 0.644732
+vt 0.660591 0.649216
+vt 0.652319 0.649216
+vt 0.668863 0.644732
+vt 0.668863 0.649216
+vt 0.644047 0.644731
+vt 0.644047 0.649215
+vt 0.685408 0.639429
+vt 0.677136 0.639429
+vt 0.677136 0.633769
+vt 0.685408 0.633769
+vt 0.693680 0.633769
+vt 0.693680 0.639429
+vt 0.701952 0.633769
+vt 0.701952 0.639429
+vt 0.693680 0.644732
+vt 0.685408 0.644732
+vt 0.693680 0.649216
+vt 0.685408 0.649216
+vt 0.701952 0.644732
+vt 0.701952 0.649216
+vt 0.677136 0.644732
+vt 0.677135 0.649216
+vt 0.718497 0.639429
+vt 0.710224 0.639429
+vt 0.710224 0.633769
+vt 0.718497 0.633769
+vt 0.726769 0.633769
+vt 0.726769 0.639429
+vt 0.735041 0.633769
+vt 0.735041 0.639428
+vt 0.726769 0.644732
+vt 0.718497 0.644732
+vt 0.726769 0.649216
+vt 0.718497 0.649216
+vt 0.735041 0.644732
+vt 0.735041 0.649216
+vt 0.710224 0.644732
+vt 0.710225 0.649216
+vt 0.751585 0.639428
+vt 0.743313 0.639428
+vt 0.743313 0.633768
+vt 0.751585 0.633768
+vt 0.759857 0.633768
+vt 0.759857 0.639428
+vt 0.768129 0.633768
+vt 0.768130 0.639428
+vt 0.759858 0.644731
+vt 0.751585 0.644732
+vt 0.759858 0.649215
+vt 0.751586 0.649216
+vt 0.768130 0.644731
+vt 0.768130 0.649215
+vt 0.743313 0.644732
+vt 0.743313 0.649216
+vt 0.784674 0.639427
+vt 0.776402 0.639427
+vt 0.776401 0.633767
+vt 0.784673 0.633767
+vt 0.792945 0.633767
+vt 0.792946 0.639427
+vt 0.801217 0.633766
+vt 0.801218 0.639426
+vt 0.792946 0.644730
+vt 0.784674 0.644730
+vt 0.792946 0.649214
+vt 0.784674 0.649214
+vt 0.801218 0.644730
+vt 0.801218 0.649214
+vt 0.776402 0.644731
+vt 0.776402 0.649215
+vt 0.817762 0.639425
+vt 0.809490 0.639426
+vt 0.809489 0.633766
+vt 0.817761 0.633765
+vt 0.826033 0.633765
+vt 0.826034 0.639425
+vt 0.834305 0.633764
+vt 0.834305 0.639424
+vt 0.826034 0.644728
+vt 0.817762 0.644729
+vt 0.826034 0.649212
+vt 0.817762 0.649213
+vt 0.834306 0.644728
+vt 0.834306 0.649212
+vt 0.809490 0.644729
+vt 0.809490 0.649213
+vt 0.850849 0.639423
+vt 0.842577 0.639424
+vt 0.842577 0.633764
+vt 0.850849 0.633763
+vt 0.859120 0.633763
+vt 0.859121 0.639423
+vt 0.867392 0.633762
+vt 0.867393 0.639422
+vt 0.859121 0.644726
+vt 0.850850 0.644727
+vt 0.859122 0.649210
+vt 0.850850 0.649211
+vt 0.867393 0.644726
+vt 0.867393 0.649210
+vt 0.842578 0.644727
+vt 0.842578 0.649211
+vt 0.883936 0.639421
+vt 0.875664 0.639422
+vt 0.875664 0.633762
+vt 0.883935 0.633761
+vt 0.892207 0.633761
+vt 0.892208 0.639421
+vt 0.900479 0.633760
+vt 0.900479 0.639420
+vt 0.892208 0.644724
+vt 0.883937 0.644724
+vt 0.892209 0.649208
+vt 0.883937 0.649208
+vt 0.900480 0.644723
+vt 0.900480 0.649207
+vt 0.875665 0.644725
+vt 0.875665 0.649209
+vt 0.122955 0.639419
+vt 0.114683 0.639419
+vt 0.114683 0.633759
+vt 0.122954 0.633759
+vt 0.106412 0.639420
+vt 0.106411 0.633760
+vt 0.131226 0.633758
+vt 0.131226 0.639418
+vt 0.139497 0.633758
+vt 0.139498 0.639418
+vt 0.131227 0.644722
+vt 0.122955 0.644722
+vt 0.131227 0.649206
+vt 0.122956 0.649206
+vt 0.139498 0.644721
+vt 0.139499 0.649205
+vt 0.114684 0.644723
+vt 0.106413 0.644723
+vt 0.114684 0.649207
+vt 0.106413 0.649207
+vt 0.156040 0.639416
+vt 0.147769 0.639417
+vt 0.147768 0.633757
+vt 0.156040 0.633757
+vt 0.164311 0.633756
+vt 0.164311 0.639416
+vt 0.172582 0.633756
+vt 0.172583 0.639416
+vt 0.164312 0.644719
+vt 0.156041 0.644720
+vt 0.164312 0.649203
+vt 0.156041 0.649204
+vt 0.172583 0.644719
+vt 0.172584 0.649203
+vt 0.147769 0.644720
+vt 0.147770 0.649204
+vt 0.189125 0.639415
+vt 0.180854 0.639415
+vt 0.180853 0.633755
+vt 0.189125 0.633755
+vt 0.197396 0.633754
+vt 0.197396 0.639414
+vt 0.205667 0.633754
+vt 0.205667 0.639414
+vt 0.197397 0.644718
+vt 0.189125 0.644718
+vt 0.197397 0.649202
+vt 0.189126 0.649202
+vt 0.205668 0.644717
+vt 0.205668 0.649201
+vt 0.180854 0.644718
+vt 0.180855 0.649202
+vt 0.222209 0.639413
+vt 0.213938 0.639413
+vt 0.213938 0.633753
+vt 0.222209 0.633753
+vt 0.230480 0.633753
+vt 0.230480 0.639413
+vt 0.238751 0.633752
+vt 0.238751 0.639412
+vt 0.230481 0.644716
+vt 0.222210 0.644716
+vt 0.230481 0.649200
+vt 0.222210 0.649200
+vt 0.238752 0.644716
+vt 0.238752 0.649200
+vt 0.213939 0.644717
+vt 0.213939 0.649201
+vt 0.255293 0.639412
+vt 0.247022 0.639412
+vt 0.247022 0.633752
+vt 0.255293 0.633752
+vt 0.263564 0.633752
+vt 0.263564 0.639412
+vt 0.271835 0.633752
+vt 0.271835 0.639411
+vt 0.263564 0.644715
+vt 0.255293 0.644715
+vt 0.263564 0.649199
+vt 0.255293 0.649199
+vt 0.271835 0.644715
+vt 0.271835 0.649199
+vt 0.247022 0.644716
+vt 0.247023 0.649200
+vt 0.288377 0.639411
+vt 0.280106 0.639411
+vt 0.280106 0.633751
+vt 0.288377 0.633751
+vt 0.296648 0.633751
+vt 0.296648 0.639411
+vt 0.304918 0.633751
+vt 0.304918 0.639411
+vt 0.296648 0.644715
+vt 0.288377 0.644715
+vt 0.296648 0.649199
+vt 0.288377 0.649199
+vt 0.304918 0.644715
+vt 0.304918 0.649199
+vt 0.280106 0.644715
+vt 0.280106 0.649199
+vt 0.321460 0.639411
+vt 0.313189 0.639411
+vt 0.313189 0.633751
+vt 0.321460 0.633751
+vt 0.329731 0.633751
+vt 0.329731 0.639411
+vt 0.329731 0.644715
+vt 0.321460 0.644715
+vt 0.329731 0.649199
+vt 0.321460 0.649199
+vt 0.313189 0.644715
+vt 0.313189 0.649199
+vt 0.667666 0.332144
+vt 0.659929 0.333522
+vt 0.653314 0.333349
+vt 0.662337 0.331920
+vt 0.646365 0.333340
+vt 0.656677 0.331903
+vt 0.689474 0.331200
+vt 0.687545 0.330935
+vt 0.701940 0.330925
+vt 0.701941 0.331194
+vt 0.677788 0.331443
+vt 0.691143 0.331929
+vt 0.681042 0.332146
+vt 0.692426 0.333354
+vt 0.683475 0.333524
+vt 0.701941 0.331925
+vt 0.701942 0.333352
+vt 0.672335 0.332781
+vt 0.665876 0.334026
+vt 0.675655 0.334026
+vt 0.670297 0.334701
+vt 0.354543 0.654910
+vt 0.346272 0.654910
+vt 0.346272 0.652401
+vt 0.354543 0.652401
+vt 0.338002 0.654910
+vt 0.338002 0.652400
+vt 0.362814 0.652401
+vt 0.362814 0.654910
+vt 0.371085 0.652401
+vt 0.371085 0.654911
+vt 0.362814 0.657317
+vt 0.354543 0.657317
+vt 0.362814 0.660213
+vt 0.354543 0.660213
+vt 0.371085 0.657318
+vt 0.371085 0.660213
+vt 0.346272 0.657317
+vt 0.338002 0.657317
+vt 0.346272 0.660213
+vt 0.338002 0.660212
+vt 0.387627 0.654911
+vt 0.379356 0.654911
+vt 0.379356 0.652402
+vt 0.387627 0.652402
+vt 0.395898 0.652402
+vt 0.395898 0.654912
+vt 0.404169 0.652403
+vt 0.404169 0.654912
+vt 0.395898 0.657319
+vt 0.387627 0.657318
+vt 0.395898 0.660214
+vt 0.387627 0.660214
+vt 0.404169 0.657319
+vt 0.404169 0.660214
+vt 0.379356 0.657318
+vt 0.379356 0.660213
+vt 0.420711 0.654913
+vt 0.412440 0.654912
+vt 0.412440 0.652403
+vt 0.420711 0.652404
+vt 0.428982 0.652404
+vt 0.428982 0.654913
+vt 0.437253 0.652405
+vt 0.437253 0.654914
+vt 0.428982 0.657320
+vt 0.420711 0.657320
+vt 0.428982 0.660216
+vt 0.420711 0.660215
+vt 0.437253 0.657321
+vt 0.437253 0.660216
+vt 0.412440 0.657319
+vt 0.412440 0.660215
+vt 0.453795 0.654915
+vt 0.445524 0.654914
+vt 0.445524 0.652405
+vt 0.453796 0.652406
+vt 0.462067 0.652406
+vt 0.462067 0.654915
+vt 0.470338 0.652407
+vt 0.470338 0.654916
+vt 0.462067 0.657322
+vt 0.453795 0.657322
+vt 0.462067 0.660217
+vt 0.453795 0.660217
+vt 0.470338 0.657323
+vt 0.470338 0.660218
+vt 0.445524 0.657321
+vt 0.445524 0.660216
+vt 0.486881 0.654917
+vt 0.478609 0.654916
+vt 0.478610 0.652407
+vt 0.486881 0.652408
+vt 0.495152 0.652408
+vt 0.495152 0.654917
+vt 0.503424 0.652409
+vt 0.503424 0.654918
+vt 0.495152 0.657324
+vt 0.486881 0.657324
+vt 0.495152 0.660219
+vt 0.486881 0.660219
+vt 0.503424 0.657325
+vt 0.503424 0.660220
+vt 0.478609 0.657323
+vt 0.478609 0.660218
+vt 0.519967 0.654919
+vt 0.511695 0.654919
+vt 0.511696 0.652409
+vt 0.519967 0.652410
+vt 0.528239 0.652411
+vt 0.528239 0.654920
+vt 0.536510 0.652411
+vt 0.536510 0.654920
+vt 0.528239 0.657326
+vt 0.519967 0.657326
+vt 0.528239 0.660221
+vt 0.519967 0.660221
+vt 0.536510 0.657327
+vt 0.536510 0.660221
+vt 0.511695 0.657325
+vt 0.511695 0.660220
+vt 0.553054 0.654921
+vt 0.544782 0.654921
+vt 0.544782 0.652412
+vt 0.553054 0.652412
+vt 0.561326 0.652413
+vt 0.561326 0.654922
+vt 0.569598 0.652413
+vt 0.569598 0.654922
+vt 0.561326 0.657328
+vt 0.553054 0.657328
+vt 0.561326 0.660223
+vt 0.553054 0.660222
+vt 0.569598 0.657329
+vt 0.569598 0.660223
+vt 0.544782 0.657327
+vt 0.544782 0.660222
+vt 0.586142 0.654923
+vt 0.577870 0.654923
+vt 0.577870 0.652414
+vt 0.586142 0.652414
+vt 0.594414 0.652415
+vt 0.594414 0.654924
+vt 0.602686 0.652415
+vt 0.602686 0.654924
+vt 0.594414 0.657330
+vt 0.586142 0.657330
+vt 0.594414 0.660224
+vt 0.586142 0.660224
+vt 0.602686 0.657331
+vt 0.602686 0.660225
+vt 0.577870 0.657329
+vt 0.577870 0.660224
+vt 0.619230 0.654925
+vt 0.610958 0.654925
+vt 0.610958 0.652416
+vt 0.619230 0.652416
+vt 0.627502 0.652416
+vt 0.627502 0.654925
+vt 0.635774 0.652417
+vt 0.635774 0.654926
+vt 0.627502 0.657332
+vt 0.619230 0.657331
+vt 0.627502 0.660226
+vt 0.619230 0.660225
+vt 0.635774 0.657332
+vt 0.635774 0.660226
+vt 0.610958 0.657331
+vt 0.610958 0.660225
+vt 0.652319 0.654926
+vt 0.644046 0.654926
+vt 0.644046 0.652417
+vt 0.652319 0.652417
+vt 0.660591 0.652417
+vt 0.660591 0.654926
+vt 0.668863 0.652417
+vt 0.668863 0.654926
+vt 0.660591 0.657333
+vt 0.652319 0.657332
+vt 0.660591 0.660227
+vt 0.652319 0.660226
+vt 0.668863 0.657333
+vt 0.668863 0.660227
+vt 0.644046 0.657332
+vt 0.644046 0.660226
+vt 0.685408 0.654927
+vt 0.677135 0.654926
+vt 0.677135 0.652417
+vt 0.685408 0.652418
+vt 0.693680 0.652418
+vt 0.693680 0.654927
+vt 0.701952 0.652418
+vt 0.701952 0.654927
+vt 0.693680 0.657333
+vt 0.685408 0.657333
+vt 0.693680 0.660227
+vt 0.685408 0.660227
+vt 0.701952 0.657333
+vt 0.701952 0.660227
+vt 0.677135 0.657333
+vt 0.677135 0.660227
+vt 0.718497 0.654926
+vt 0.710225 0.654927
+vt 0.710225 0.652418
+vt 0.718497 0.652418
+vt 0.726769 0.652417
+vt 0.726769 0.654926
+vt 0.735041 0.652417
+vt 0.735041 0.654926
+vt 0.726769 0.657333
+vt 0.718497 0.657333
+vt 0.726769 0.660227
+vt 0.718497 0.660227
+vt 0.735041 0.657333
+vt 0.735041 0.660227
+vt 0.710225 0.657333
+vt 0.710225 0.660227
+vt 0.751586 0.654926
+vt 0.743314 0.654926
+vt 0.743314 0.652417
+vt 0.751586 0.652417
+vt 0.759858 0.652417
+vt 0.759858 0.654926
+vt 0.768130 0.652416
+vt 0.768130 0.654925
+vt 0.759858 0.657332
+vt 0.751586 0.657332
+vt 0.759858 0.660226
+vt 0.751586 0.660226
+vt 0.768130 0.657332
+vt 0.768130 0.660226
+vt 0.743314 0.657333
+vt 0.743314 0.660226
+vt 0.784675 0.654925
+vt 0.776402 0.654925
+vt 0.776402 0.652416
+vt 0.784675 0.652416
+vt 0.792947 0.652415
+vt 0.792947 0.654924
+vt 0.801219 0.652415
+vt 0.801219 0.654924
+vt 0.792947 0.657331
+vt 0.784675 0.657331
+vt 0.792947 0.660225
+vt 0.784675 0.660225
+vt 0.801219 0.657331
+vt 0.801219 0.660225
+vt 0.776402 0.657332
+vt 0.776402 0.660226
+vt 0.817763 0.654923
+vt 0.809491 0.654924
+vt 0.809491 0.652415
+vt 0.817763 0.652414
+vt 0.826035 0.652414
+vt 0.826035 0.654923
+vt 0.834306 0.652413
+vt 0.834307 0.654922
+vt 0.826035 0.657329
+vt 0.817763 0.657330
+vt 0.826035 0.660224
+vt 0.817763 0.660224
+vt 0.834307 0.657329
+vt 0.834307 0.660223
+vt 0.809491 0.657330
+vt 0.809491 0.660224
+vt 0.850850 0.654921
+vt 0.842579 0.654922
+vt 0.842578 0.652413
+vt 0.850850 0.652412
+vt 0.859122 0.652412
+vt 0.859122 0.654921
+vt 0.867394 0.652411
+vt 0.867394 0.654920
+vt 0.859122 0.657327
+vt 0.850850 0.657328
+vt 0.859122 0.660222
+vt 0.850850 0.660222
+vt 0.867394 0.657327
+vt 0.867394 0.660221
+vt 0.842579 0.657328
+vt 0.842579 0.660223
+vt 0.883937 0.654919
+vt 0.875666 0.654920
+vt 0.875665 0.652411
+vt 0.883937 0.652410
+vt 0.892209 0.652409
+vt 0.892209 0.654918
+vt 0.900480 0.652409
+vt 0.900481 0.654918
+vt 0.892209 0.657325
+vt 0.883937 0.657326
+vt 0.892209 0.660220
+vt 0.883937 0.660220
+vt 0.900481 0.657325
+vt 0.900481 0.660219
+vt 0.875666 0.657326
+vt 0.875666 0.660221
+vt 0.122956 0.654917
+vt 0.114685 0.654917
+vt 0.114685 0.652408
+vt 0.122956 0.652408
+vt 0.106413 0.654918
+vt 0.106413 0.652409
+vt 0.131227 0.652407
+vt 0.131228 0.654916
+vt 0.139499 0.652406
+vt 0.139499 0.654916
+vt 0.131228 0.657323
+vt 0.122956 0.657324
+vt 0.131228 0.660218
+vt 0.122956 0.660218
+vt 0.139499 0.657323
+vt 0.139499 0.660217
+vt 0.114685 0.657324
+vt 0.106413 0.657325
+vt 0.114685 0.660219
+vt 0.106413 0.660219
+vt 0.156041 0.654914
+vt 0.147770 0.654915
+vt 0.147770 0.652406
+vt 0.156041 0.652405
+vt 0.164313 0.652405
+vt 0.164313 0.654914
+vt 0.172584 0.652404
+vt 0.172584 0.654914
+vt 0.164313 0.657321
+vt 0.156042 0.657321
+vt 0.164313 0.660216
+vt 0.156042 0.660217
+vt 0.172584 0.657320
+vt 0.172584 0.660216
+vt 0.147770 0.657322
+vt 0.147770 0.660217
+vt 0.189126 0.654913
+vt 0.180855 0.654913
+vt 0.180855 0.652404
+vt 0.189126 0.652403
+vt 0.197397 0.652403
+vt 0.197397 0.654912
+vt 0.205668 0.652403
+vt 0.205668 0.654912
+vt 0.197397 0.657319
+vt 0.189126 0.657320
+vt 0.197397 0.660215
+vt 0.189126 0.660215
+vt 0.205668 0.657319
+vt 0.205668 0.660214
+vt 0.180855 0.657320
+vt 0.180855 0.660215
+vt 0.222210 0.654911
+vt 0.213939 0.654911
+vt 0.213939 0.652402
+vt 0.222210 0.652402
+vt 0.230481 0.652402
+vt 0.230481 0.654911
+vt 0.238752 0.652401
+vt 0.238752 0.654910
+vt 0.230481 0.657318
+vt 0.222210 0.657318
+vt 0.230481 0.660213
+vt 0.222210 0.660214
+vt 0.238752 0.657318
+vt 0.238752 0.660213
+vt 0.213939 0.657319
+vt 0.213939 0.660214
+vt 0.255294 0.654910
+vt 0.247023 0.654910
+vt 0.247023 0.652401
+vt 0.255294 0.652401
+vt 0.263564 0.652401
+vt 0.263564 0.654910
+vt 0.271835 0.652400
+vt 0.271835 0.654910
+vt 0.263564 0.657317
+vt 0.255294 0.657317
+vt 0.263565 0.660213
+vt 0.255294 0.660213
+vt 0.271835 0.657317
+vt 0.271835 0.660212
+vt 0.247023 0.657317
+vt 0.247023 0.660213
+vt 0.288377 0.654909
+vt 0.280106 0.654909
+vt 0.280106 0.652400
+vt 0.288377 0.652400
+vt 0.296648 0.652400
+vt 0.296648 0.654909
+vt 0.304918 0.652400
+vt 0.304918 0.654909
+vt 0.296648 0.657317
+vt 0.288377 0.657317
+vt 0.296648 0.660212
+vt 0.288377 0.660212
+vt 0.304918 0.657316
+vt 0.304918 0.660212
+vt 0.280106 0.657317
+vt 0.280106 0.660212
+vt 0.321460 0.654909
+vt 0.313189 0.654909
+vt 0.313189 0.652400
+vt 0.321460 0.652400
+vt 0.329731 0.652400
+vt 0.329731 0.654909
+vt 0.329731 0.657317
+vt 0.321460 0.657317
+vt 0.329731 0.660212
+vt 0.321460 0.660212
+vt 0.313189 0.657317
+vt 0.313189 0.660212
+vt 0.189118 0.668643
+vt 0.180847 0.668643
+vt 0.180855 0.664189
+vt 0.189126 0.664189
+vt 0.172576 0.668644
+vt 0.172584 0.664189
+vt 0.197397 0.664188
+vt 0.197388 0.668642
+vt 0.205668 0.664188
+vt 0.205659 0.668641
+vt 0.197362 0.672977
+vt 0.189092 0.672979
+vt 0.197308 0.676594
+vt 0.189040 0.676600
+vt 0.205632 0.672974
+vt 0.205578 0.676589
+vt 0.180822 0.672981
+vt 0.172553 0.672983
+vt 0.180772 0.676605
+vt 0.172506 0.676610
+vt 0.156035 0.668646
+vt 0.147765 0.668646
+vt 0.147770 0.664190
+vt 0.156042 0.664190
+vt 0.139495 0.668647
+vt 0.139499 0.664191
+vt 0.164313 0.664190
+vt 0.164306 0.668645
+vt 0.164285 0.672985
+vt 0.156016 0.672987
+vt 0.164242 0.676615
+vt 0.155978 0.676619
+vt 0.147749 0.672989
+vt 0.139481 0.672990
+vt 0.147716 0.676623
+vt 0.139454 0.676626
+vt 0.122954 0.668648
+vt 0.114684 0.668648
+vt 0.114685 0.664192
+vt 0.122956 0.664191
+vt 0.106414 0.668648
+vt 0.106414 0.664192
+vt 0.131228 0.664191
+vt 0.131224 0.668647
+vt 0.131214 0.672991
+vt 0.122947 0.672992
+vt 0.131194 0.676628
+vt 0.122933 0.676630
+vt 0.114680 0.672993
+vt 0.106414 0.672994
+vt 0.114674 0.676632
+vt 0.106414 0.676633
+vt 0.883940 0.668649
+vt 0.875669 0.668649
+vt 0.875666 0.664193
+vt 0.883938 0.664193
+vt 0.867399 0.668649
+vt 0.867394 0.664194
+vt 0.892209 0.664193
+vt 0.892210 0.668649
+vt 0.900481 0.664192
+vt 0.900481 0.668648
+vt 0.892214 0.672993
+vt 0.883947 0.672993
+vt 0.892221 0.676632
+vt 0.883961 0.676630
+vt 0.900481 0.672994
+vt 0.900481 0.676633
+vt 0.875680 0.672992
+vt 0.867412 0.672991
+vt 0.875700 0.676628
+vt 0.867439 0.676626
+vt 0.850857 0.668649
+vt 0.842586 0.668649
+vt 0.842579 0.664195
+vt 0.850851 0.664195
+vt 0.834315 0.668648
+vt 0.834307 0.664195
+vt 0.859122 0.664194
+vt 0.859128 0.668649
+vt 0.859145 0.672990
+vt 0.850876 0.672989
+vt 0.859177 0.676623
+vt 0.850914 0.676619
+vt 0.842607 0.672987
+vt 0.834338 0.672986
+vt 0.842650 0.676615
+vt 0.834385 0.676610
+vt 0.817772 0.668648
+vt 0.809500 0.668647
+vt 0.809491 0.664196
+vt 0.817763 0.664196
+vt 0.801228 0.668647
+vt 0.801219 0.664197
+vt 0.826035 0.664196
+vt 0.826043 0.668648
+vt 0.826068 0.672984
+vt 0.817798 0.672982
+vt 0.826118 0.676605
+vt 0.817850 0.676600
+vt 0.809527 0.672980
+vt 0.801255 0.672978
+vt 0.809581 0.676594
+vt 0.801309 0.676589
+vt 0.784683 0.668646
+vt 0.776411 0.668646
+vt 0.776402 0.664197
+vt 0.784675 0.664197
+vt 0.768138 0.668646
+vt 0.768130 0.664197
+vt 0.792947 0.664197
+vt 0.792956 0.668647
+vt 0.792983 0.672975
+vt 0.784710 0.672973
+vt 0.793036 0.676583
+vt 0.784762 0.676577
+vt 0.776436 0.672971
+vt 0.768162 0.672969
+vt 0.776486 0.676572
+vt 0.768209 0.676567
+vt 0.751592 0.668645
+vt 0.743319 0.668645
+vt 0.743314 0.664198
+vt 0.751586 0.664198
+vt 0.735046 0.668644
+vt 0.735041 0.664198
+vt 0.759858 0.664198
+vt 0.759865 0.668645
+vt 0.759887 0.672967
+vt 0.751612 0.672966
+vt 0.759930 0.676562
+vt 0.751650 0.676558
+vt 0.743336 0.672964
+vt 0.735060 0.672963
+vt 0.743369 0.676554
+vt 0.735087 0.676551
+vt 0.718499 0.668644
+vt 0.710226 0.668644
+vt 0.710225 0.664198
+vt 0.718497 0.664198
+vt 0.701952 0.668644
+vt 0.701952 0.664198
+vt 0.726769 0.664198
+vt 0.726773 0.668644
+vt 0.726783 0.672962
+vt 0.718506 0.672961
+vt 0.726804 0.676549
+vt 0.718520 0.676547
+vt 0.710229 0.672961
+vt 0.701952 0.672961
+vt 0.710236 0.676546
+vt 0.701952 0.676546
+vt 0.685405 0.668644
+vt 0.677132 0.668644
+vt 0.677135 0.664198
+vt 0.685408 0.664198
+vt 0.668859 0.668645
+vt 0.668863 0.664198
+vt 0.693680 0.664198
+vt 0.693679 0.668644
+vt 0.693675 0.672961
+vt 0.685398 0.672961
+vt 0.693668 0.676546
+vt 0.685384 0.676547
+vt 0.677121 0.672962
+vt 0.668845 0.672963
+vt 0.677101 0.676549
+vt 0.668818 0.676551
+vt 0.652312 0.668645
+vt 0.644039 0.668645
+vt 0.644046 0.664198
+vt 0.652319 0.664198
+vt 0.635766 0.668646
+vt 0.635774 0.664198
+vt 0.660591 0.664198
+vt 0.660585 0.668645
+vt 0.660569 0.672964
+vt 0.652293 0.672966
+vt 0.660536 0.676554
+vt 0.652254 0.676558
+vt 0.644018 0.672967
+vt 0.635743 0.672969
+vt 0.643974 0.676562
+vt 0.635696 0.676567
+vt 0.619221 0.668647
+vt 0.610949 0.668647
+vt 0.610958 0.664197
+vt 0.619230 0.664197
+vt 0.602676 0.668647
+vt 0.602686 0.664197
+vt 0.627502 0.664197
+vt 0.627494 0.668646
+vt 0.627468 0.672971
+vt 0.619195 0.672973
+vt 0.627418 0.676572
+vt 0.619142 0.676578
+vt 0.610922 0.672975
+vt 0.602649 0.672978
+vt 0.610868 0.676583
+vt 0.602595 0.676589
+vt 0.586133 0.668648
+vt 0.577861 0.668648
+vt 0.577869 0.664196
+vt 0.586141 0.664196
+vt 0.569590 0.668648
+vt 0.569597 0.664195
+vt 0.594414 0.664196
+vt 0.594404 0.668648
+vt 0.594378 0.672980
+vt 0.586106 0.672982
+vt 0.594324 0.676594
+vt 0.586054 0.676600
+vt 0.577836 0.672984
+vt 0.569566 0.672986
+vt 0.577786 0.676605
+vt 0.569519 0.676610
+vt 0.553047 0.668649
+vt 0.544776 0.668649
+vt 0.544782 0.664194
+vt 0.553054 0.664195
+vt 0.536506 0.668649
+vt 0.536510 0.664194
+vt 0.561326 0.664195
+vt 0.561318 0.668649
+vt 0.561297 0.672987
+vt 0.553028 0.672989
+vt 0.561254 0.676615
+vt 0.552990 0.676619
+vt 0.544760 0.672990
+vt 0.536492 0.672991
+vt 0.544727 0.676623
+vt 0.536465 0.676626
+vt 0.519964 0.668649
+vt 0.511694 0.668649
+vt 0.511695 0.664193
+vt 0.519967 0.664193
+vt 0.503424 0.668648
+vt 0.503424 0.664192
+vt 0.528238 0.664194
+vt 0.528235 0.668649
+vt 0.528225 0.672992
+vt 0.519957 0.672993
+vt 0.528204 0.676628
+vt 0.519943 0.676630
+vt 0.511690 0.672993
+vt 0.503423 0.672993
+vt 0.511683 0.676631
+vt 0.503423 0.676632
+vt 0.486883 0.668648
+vt 0.478613 0.668647
+vt 0.478609 0.664191
+vt 0.486881 0.664192
+vt 0.470342 0.668647
+vt 0.470338 0.664191
+vt 0.495152 0.664192
+vt 0.495153 0.668648
+vt 0.495157 0.672993
+vt 0.486890 0.672992
+vt 0.495164 0.676631
+vt 0.486904 0.676630
+vt 0.478623 0.672991
+vt 0.470356 0.672990
+vt 0.478643 0.676628
+vt 0.470383 0.676626
+vt 0.453802 0.668646
+vt 0.445531 0.668645
+vt 0.445524 0.664190
+vt 0.453795 0.664190
+vt 0.437261 0.668644
+vt 0.437253 0.664189
+vt 0.462067 0.664190
+vt 0.462072 0.668646
+vt 0.462088 0.672989
+vt 0.453820 0.672987
+vt 0.462121 0.676623
+vt 0.453859 0.676619
+vt 0.445552 0.672985
+vt 0.437284 0.672983
+vt 0.445595 0.676615
+vt 0.437331 0.676610
+vt 0.420719 0.668643
+vt 0.412448 0.668642
+vt 0.412440 0.664188
+vt 0.420711 0.664189
+vt 0.404178 0.668641
+vt 0.404169 0.664188
+vt 0.428982 0.664189
+vt 0.428990 0.668644
+vt 0.429015 0.672981
+vt 0.420745 0.672979
+vt 0.429065 0.676605
+vt 0.420797 0.676600
+vt 0.412475 0.672977
+vt 0.404205 0.672974
+vt 0.412529 0.676594
+vt 0.404259 0.676589
+vt 0.387635 0.668640
+vt 0.379364 0.668639
+vt 0.379356 0.664187
+vt 0.387627 0.664188
+vt 0.371093 0.668638
+vt 0.371085 0.664187
+vt 0.395898 0.664188
+vt 0.395906 0.668640
+vt 0.395933 0.672972
+vt 0.387661 0.672970
+vt 0.395987 0.676583
+vt 0.387714 0.676577
+vt 0.379389 0.672967
+vt 0.371116 0.672965
+vt 0.379439 0.676572
+vt 0.371163 0.676567
+vt 0.354550 0.668637
+vt 0.346278 0.668637
+vt 0.346272 0.664187
+vt 0.354543 0.664187
+vt 0.338006 0.668636
+vt 0.338002 0.664186
+vt 0.362814 0.664187
+vt 0.362821 0.668638
+vt 0.362843 0.672964
+vt 0.354569 0.672962
+vt 0.362886 0.676562
+vt 0.354607 0.676558
+vt 0.346294 0.672960
+vt 0.338020 0.672959
+vt 0.346327 0.676554
+vt 0.338047 0.676551
+vt 0.321462 0.668636
+vt 0.313190 0.668636
+vt 0.313189 0.664186
+vt 0.321460 0.664186
+vt 0.304918 0.668636
+vt 0.304918 0.664186
+vt 0.329731 0.664186
+vt 0.329734 0.668636
+vt 0.329745 0.672958
+vt 0.321469 0.672957
+vt 0.329765 0.676549
+vt 0.321483 0.676547
+vt 0.313194 0.672957
+vt 0.304918 0.672957
+vt 0.313201 0.676546
+vt 0.304918 0.676546
+vt 0.288375 0.668636
+vt 0.280103 0.668636
+vt 0.280106 0.664186
+vt 0.288377 0.664186
+vt 0.271831 0.668636
+vt 0.271835 0.664186
+vt 0.296648 0.664186
+vt 0.296646 0.668636
+vt 0.296643 0.672957
+vt 0.288368 0.672957
+vt 0.296636 0.676546
+vt 0.288354 0.676547
+vt 0.280092 0.672958
+vt 0.271817 0.672959
+vt 0.280072 0.676549
+vt 0.271790 0.676551
+vt 0.255287 0.668637
+vt 0.247016 0.668638
+vt 0.247023 0.664187
+vt 0.255294 0.664187
+vt 0.238744 0.668638
+vt 0.238752 0.664187
+vt 0.263565 0.664187
+vt 0.263559 0.668637
+vt 0.263543 0.672960
+vt 0.255268 0.672962
+vt 0.263510 0.676554
+vt 0.255230 0.676558
+vt 0.246994 0.672964
+vt 0.238721 0.672965
+vt 0.246951 0.676562
+vt 0.238674 0.676567
+vt 0.222202 0.668640
+vt 0.213930 0.668640
+vt 0.213939 0.664188
+vt 0.222210 0.664187
+vt 0.230481 0.664187
+vt 0.230473 0.668639
+vt 0.230448 0.672967
+vt 0.222175 0.672970
+vt 0.230398 0.676572
+vt 0.222123 0.676577
+vt 0.213904 0.672972
+vt 0.213850 0.676583
+vt 0.321461 0.592305
+vt 0.313190 0.592305
+vt 0.313190 0.591452
+vt 0.321461 0.591452
+vt 0.304918 0.592305
+vt 0.304918 0.591452
+vt 0.329732 0.591453
+vt 0.329732 0.592306
+vt 0.338003 0.591453
+vt 0.338003 0.592306
+vt 0.329732 0.592774
+vt 0.321461 0.592774
+vt 0.329732 0.593115
+vt 0.321461 0.593115
+vt 0.338003 0.592774
+vt 0.338003 0.593116
+vt 0.313190 0.592774
+vt 0.304919 0.592774
+vt 0.313190 0.593115
+vt 0.304919 0.593115
+vt 0.288376 0.592305
+vt 0.280105 0.592305
+vt 0.280105 0.591452
+vt 0.288376 0.591452
+vt 0.271834 0.592306
+vt 0.271834 0.591453
+vt 0.296647 0.591452
+vt 0.296647 0.592305
+vt 0.296647 0.592774
+vt 0.288376 0.592774
+vt 0.296647 0.593115
+vt 0.288376 0.593115
+vt 0.280105 0.592774
+vt 0.271834 0.592774
+vt 0.280105 0.593115
+vt 0.271834 0.593115
+vt 0.255291 0.592306
+vt 0.247020 0.592306
+vt 0.247020 0.591453
+vt 0.255291 0.591453
+vt 0.238749 0.592306
+vt 0.238749 0.591453
+vt 0.263562 0.591453
+vt 0.263562 0.592306
+vt 0.263562 0.592774
+vt 0.255291 0.592774
+vt 0.263562 0.593116
+vt 0.255291 0.593116
+vt 0.247020 0.592775
+vt 0.238749 0.592775
+vt 0.247020 0.593116
+vt 0.238749 0.593116
+vt 0.222206 0.592307
+vt 0.213935 0.592308
+vt 0.213935 0.591455
+vt 0.222206 0.591454
+vt 0.205664 0.592308
+vt 0.205664 0.591455
+vt 0.230477 0.591454
+vt 0.230477 0.592307
+vt 0.230477 0.592775
+vt 0.222206 0.592776
+vt 0.230478 0.593117
+vt 0.222206 0.593117
+vt 0.213935 0.592776
+vt 0.205664 0.592776
+vt 0.213935 0.593117
+vt 0.205664 0.593118
+vt 0.189121 0.592309
+vt 0.180850 0.592309
+vt 0.180850 0.591456
+vt 0.189121 0.591456
+vt 0.172578 0.592310
+vt 0.172578 0.591457
+vt 0.197392 0.591455
+vt 0.197392 0.592308
+vt 0.197392 0.592777
+vt 0.189121 0.592777
+vt 0.197392 0.593118
+vt 0.189121 0.593119
+vt 0.180850 0.592778
+vt 0.172578 0.592778
+vt 0.180850 0.593119
+vt 0.172578 0.593120
+vt 0.156035 0.592311
+vt 0.147764 0.592311
+vt 0.147764 0.591458
+vt 0.156035 0.591458
+vt 0.139493 0.592312
+vt 0.139493 0.591459
+vt 0.164307 0.591457
+vt 0.164307 0.592310
+vt 0.164307 0.592779
+vt 0.156036 0.592779
+vt 0.164307 0.593120
+vt 0.156036 0.593121
+vt 0.147764 0.592780
+vt 0.139493 0.592780
+vt 0.147764 0.593121
+vt 0.139493 0.593122
+vt 0.122950 0.592313
+vt 0.114678 0.592314
+vt 0.114678 0.591461
+vt 0.122950 0.591460
+vt 0.106407 0.592314
+vt 0.106407 0.591461
+vt 0.131221 0.591459
+vt 0.131221 0.592312
+vt 0.131221 0.592781
+vt 0.122950 0.592781
+vt 0.131221 0.593122
+vt 0.122950 0.593123
+vt 0.114678 0.592782
+vt 0.106407 0.592783
+vt 0.114678 0.593123
+vt 0.106407 0.593124
+vt 0.883931 0.592315
+vt 0.875659 0.592316
+vt 0.875659 0.591463
+vt 0.883931 0.591462
+vt 0.867388 0.592316
+vt 0.867388 0.591463
+vt 0.892202 0.591462
+vt 0.892202 0.592315
+vt 0.900474 0.591461
+vt 0.900474 0.592314
+vt 0.892202 0.592783
+vt 0.883931 0.592784
+vt 0.892202 0.593125
+vt 0.883931 0.593125
+vt 0.900474 0.592783
+vt 0.900474 0.593124
+vt 0.875659 0.592784
+vt 0.867388 0.592785
+vt 0.875659 0.593126
+vt 0.867388 0.593126
+vt 0.850844 0.592318
+vt 0.842573 0.592318
+vt 0.842573 0.591465
+vt 0.850844 0.591464
+vt 0.834301 0.592319
+vt 0.834301 0.591465
+vt 0.859116 0.591464
+vt 0.859116 0.592317
+vt 0.859116 0.592785
+vt 0.850844 0.592786
+vt 0.859116 0.593127
+vt 0.850844 0.593127
+vt 0.842573 0.592786
+vt 0.834301 0.592787
+vt 0.842573 0.593128
+vt 0.834301 0.593128
+vt 0.817757 0.592319
+vt 0.809486 0.592320
+vt 0.809486 0.591467
+vt 0.817757 0.591466
+vt 0.801214 0.592320
+vt 0.801214 0.591467
+vt 0.826029 0.591466
+vt 0.826029 0.592319
+vt 0.826029 0.592787
+vt 0.817758 0.592788
+vt 0.826029 0.593129
+vt 0.817758 0.593129
+vt 0.809486 0.592788
+vt 0.801214 0.592789
+vt 0.809486 0.593130
+vt 0.801214 0.593130
+vt 0.784670 0.592321
+vt 0.776399 0.592321
+vt 0.776399 0.591468
+vt 0.784670 0.591468
+vt 0.768127 0.592322
+vt 0.768127 0.591469
+vt 0.792942 0.591468
+vt 0.792942 0.592321
+vt 0.792942 0.592789
+vt 0.784671 0.592790
+vt 0.792942 0.593131
+vt 0.784671 0.593131
+vt 0.776399 0.592790
+vt 0.768127 0.592790
+vt 0.776399 0.593131
+vt 0.768127 0.593132
+vt 0.751583 0.592322
+vt 0.743311 0.592323
+vt 0.743311 0.591469
+vt 0.751583 0.591469
+vt 0.735040 0.592323
+vt 0.735039 0.591470
+vt 0.759855 0.591469
+vt 0.759855 0.592322
+vt 0.759855 0.592790
+vt 0.751583 0.592791
+vt 0.759855 0.593132
+vt 0.751583 0.593132
+vt 0.743311 0.592791
+vt 0.735040 0.592791
+vt 0.743311 0.593132
+vt 0.735040 0.593133
+vt 0.718496 0.592323
+vt 0.710224 0.592323
+vt 0.710224 0.591470
+vt 0.718496 0.591470
+vt 0.701952 0.592323
+vt 0.701952 0.591470
+vt 0.726768 0.591470
+vt 0.726768 0.592323
+vt 0.726768 0.592791
+vt 0.718496 0.592791
+vt 0.726768 0.593133
+vt 0.718496 0.593133
+vt 0.710224 0.592791
+vt 0.701952 0.592791
+vt 0.710224 0.593133
+vt 0.701952 0.593133
+vt 0.685408 0.592323
+vt 0.677137 0.592323
+vt 0.677137 0.591470
+vt 0.685409 0.591470
+vt 0.668865 0.592323
+vt 0.668865 0.591470
+vt 0.693680 0.591470
+vt 0.693680 0.592323
+vt 0.693680 0.592791
+vt 0.685408 0.592791
+vt 0.693680 0.593133
+vt 0.685408 0.593133
+vt 0.677137 0.592791
+vt 0.668865 0.592791
+vt 0.677137 0.593133
+vt 0.668865 0.593133
+vt 0.652321 0.592322
+vt 0.644049 0.592322
+vt 0.644049 0.591469
+vt 0.652321 0.591469
+vt 0.635777 0.592322
+vt 0.635777 0.591469
+vt 0.660593 0.591470
+vt 0.660593 0.592323
+vt 0.660593 0.592791
+vt 0.652321 0.592791
+vt 0.660593 0.593132
+vt 0.652321 0.593132
+vt 0.644049 0.592791
+vt 0.635777 0.592790
+vt 0.644049 0.593132
+vt 0.635777 0.593132
+vt 0.619234 0.592321
+vt 0.610962 0.592321
+vt 0.610962 0.591468
+vt 0.619234 0.591468
+vt 0.602690 0.592320
+vt 0.602690 0.591467
+vt 0.627506 0.591469
+vt 0.627506 0.592322
+vt 0.627506 0.592790
+vt 0.619234 0.592790
+vt 0.627506 0.593131
+vt 0.619234 0.593131
+vt 0.610962 0.592789
+vt 0.602690 0.592789
+vt 0.610962 0.593131
+vt 0.602690 0.593130
+vt 0.586147 0.592320
+vt 0.577875 0.592319
+vt 0.577875 0.591466
+vt 0.586147 0.591467
+vt 0.569603 0.592319
+vt 0.569603 0.591466
+vt 0.594419 0.591467
+vt 0.594418 0.592320
+vt 0.594418 0.592788
+vt 0.586147 0.592788
+vt 0.594418 0.593130
+vt 0.586147 0.593129
+vt 0.577875 0.592788
+vt 0.569603 0.592787
+vt 0.577875 0.593129
+vt 0.569603 0.593129
+vt 0.553060 0.592318
+vt 0.544788 0.592317
+vt 0.544788 0.591464
+vt 0.553060 0.591465
+vt 0.536517 0.592317
+vt 0.536517 0.591464
+vt 0.561332 0.591465
+vt 0.561332 0.592318
+vt 0.561332 0.592787
+vt 0.553060 0.592786
+vt 0.561332 0.593128
+vt 0.553060 0.593127
+vt 0.544788 0.592786
+vt 0.536517 0.592785
+vt 0.544788 0.593127
+vt 0.536517 0.593126
+vt 0.519973 0.592315
+vt 0.511702 0.592315
+vt 0.511702 0.591462
+vt 0.519974 0.591462
+vt 0.503430 0.592314
+vt 0.503430 0.591461
+vt 0.528245 0.591463
+vt 0.528245 0.592316
+vt 0.528245 0.592784
+vt 0.519973 0.592784
+vt 0.528245 0.593126
+vt 0.519973 0.593125
+vt 0.511702 0.592783
+vt 0.503430 0.592783
+vt 0.511702 0.593125
+vt 0.503430 0.593124
+vt 0.486887 0.592313
+vt 0.478616 0.592313
+vt 0.478616 0.591460
+vt 0.486887 0.591460
+vt 0.470344 0.592312
+vt 0.470344 0.591459
+vt 0.495159 0.591461
+vt 0.495159 0.592314
+vt 0.495159 0.592782
+vt 0.486887 0.592782
+vt 0.495159 0.593124
+vt 0.486887 0.593123
+vt 0.478616 0.592781
+vt 0.470344 0.592780
+vt 0.478616 0.593122
+vt 0.470344 0.593122
+vt 0.453802 0.592311
+vt 0.445530 0.592310
+vt 0.445530 0.591457
+vt 0.453802 0.591458
+vt 0.437259 0.592310
+vt 0.437259 0.591457
+vt 0.462073 0.591458
+vt 0.462073 0.592312
+vt 0.462073 0.592780
+vt 0.453802 0.592779
+vt 0.462073 0.593121
+vt 0.453801 0.593121
+vt 0.445530 0.592779
+vt 0.437259 0.592778
+vt 0.445530 0.593120
+vt 0.437259 0.593120
+vt 0.420716 0.592309
+vt 0.412445 0.592309
+vt 0.412445 0.591455
+vt 0.420716 0.591456
+vt 0.404173 0.592308
+vt 0.404173 0.591455
+vt 0.428987 0.591456
+vt 0.428987 0.592309
+vt 0.428987 0.592778
+vt 0.420716 0.592777
+vt 0.428987 0.593119
+vt 0.420716 0.593119
+vt 0.412445 0.592777
+vt 0.404173 0.592777
+vt 0.412445 0.593118
+vt 0.404173 0.593118
+vt 0.387631 0.592307
+vt 0.379360 0.592307
+vt 0.379360 0.591454
+vt 0.387631 0.591454
+vt 0.371088 0.592307
+vt 0.371088 0.591454
+vt 0.395902 0.591455
+vt 0.395902 0.592308
+vt 0.395902 0.592776
+vt 0.387631 0.592776
+vt 0.395902 0.593117
+vt 0.387631 0.593117
+vt 0.379360 0.592775
+vt 0.371088 0.592775
+vt 0.379360 0.593117
+vt 0.371088 0.593116
+vt 0.354546 0.592306
+vt 0.346275 0.592306
+vt 0.346275 0.591453
+vt 0.354546 0.591453
+vt 0.362817 0.591453
+vt 0.362817 0.592306
+vt 0.362817 0.592775
+vt 0.354546 0.592775
+vt 0.362817 0.593116
+vt 0.354546 0.593116
+vt 0.346275 0.592774
+vt 0.346275 0.593116
+vt 0.387631 0.595342
+vt 0.379359 0.595342
+vt 0.379359 0.595247
+vt 0.387631 0.595247
+vt 0.379359 0.595021
+vt 0.387631 0.595021
+vt 0.371088 0.595342
+vt 0.371088 0.595246
+vt 0.371088 0.595020
+vt 0.395902 0.595247
+vt 0.395902 0.595343
+vt 0.404173 0.595248
+vt 0.404173 0.595343
+vt 0.395902 0.595021
+vt 0.404173 0.595022
+vt 0.395902 0.595353
+vt 0.387631 0.595353
+vt 0.404173 0.595354
+vt 0.379359 0.595353
+vt 0.371088 0.595352
+vt 0.420716 0.595344
+vt 0.412444 0.595343
+vt 0.412444 0.595248
+vt 0.420716 0.595249
+vt 0.412445 0.595022
+vt 0.420716 0.595023
+vt 0.428987 0.595249
+vt 0.428987 0.595344
+vt 0.437259 0.595250
+vt 0.437259 0.595345
+vt 0.428987 0.595023
+vt 0.437259 0.595024
+vt 0.428987 0.595355
+vt 0.420716 0.595355
+vt 0.437258 0.595356
+vt 0.412444 0.595354
+vt 0.453801 0.595346
+vt 0.445530 0.595345
+vt 0.445530 0.595024
+vt 0.453801 0.595025
+vt 0.462073 0.595251
+vt 0.470344 0.595252
+vt 0.462073 0.595025
+vt 0.470344 0.595026
+vt 0.462073 0.595357
+vt 0.453801 0.595357
+vt 0.470344 0.595358
+vt 0.445530 0.595356
+vt 0.486887 0.595348
+vt 0.478616 0.595348
+vt 0.478616 0.595026
+vt 0.486887 0.595027
+vt 0.495159 0.595253
+vt 0.503430 0.595254
+vt 0.495159 0.595028
+vt 0.503430 0.595028
+vt 0.495159 0.595360
+vt 0.486887 0.595359
+vt 0.503430 0.595360
+vt 0.478616 0.595358
+vt 0.519973 0.595350
+vt 0.511702 0.595350
+vt 0.519973 0.595255
+vt 0.511702 0.595029
+vt 0.519973 0.595029
+vt 0.528245 0.595256
+vt 0.528245 0.595351
+vt 0.536516 0.595256
+vt 0.536516 0.595352
+vt 0.528245 0.595030
+vt 0.536516 0.595030
+vt 0.511702 0.595361
+vt 0.553060 0.595353
+vt 0.544788 0.595352
+vt 0.544788 0.595257
+vt 0.553060 0.595257
+vt 0.544788 0.595031
+vt 0.553060 0.595031
+vt 0.561331 0.595258
+vt 0.561331 0.595353
+vt 0.569603 0.595258
+vt 0.569603 0.595354
+vt 0.561331 0.595032
+vt 0.569603 0.595033
+vt 0.586147 0.595355
+vt 0.577875 0.595354
+vt 0.577875 0.595259
+vt 0.586147 0.595259
+vt 0.577875 0.595033
+vt 0.586147 0.595033
+vt 0.594418 0.595260
+vt 0.594418 0.595355
+vt 0.602690 0.595260
+vt 0.602690 0.595356
+vt 0.594418 0.595034
+vt 0.602690 0.595034
+vt 0.619234 0.595356
+vt 0.610962 0.595356
+vt 0.610962 0.595261
+vt 0.619234 0.595261
+vt 0.610962 0.595035
+vt 0.619234 0.595035
+vt 0.627505 0.595261
+vt 0.627505 0.595357
+vt 0.635777 0.595262
+vt 0.635777 0.595357
+vt 0.627505 0.595035
+vt 0.635777 0.595036
+vt 0.652321 0.595357
+vt 0.644049 0.595357
+vt 0.644049 0.595262
+vt 0.652321 0.595262
+vt 0.644049 0.595036
+vt 0.652321 0.595036
+vt 0.660593 0.595262
+vt 0.660593 0.595358
+vt 0.668865 0.595262
+vt 0.668865 0.595358
+vt 0.660593 0.595036
+vt 0.668865 0.595037
+vt 0.685408 0.595358
+vt 0.677137 0.595358
+vt 0.677137 0.595263
+vt 0.685409 0.595263
+vt 0.677137 0.595037
+vt 0.685408 0.595037
+vt 0.693680 0.595263
+vt 0.693680 0.595358
+vt 0.701952 0.595263
+vt 0.701952 0.595358
+vt 0.693680 0.595037
+vt 0.701952 0.595037
+vt 0.718496 0.595358
+vt 0.710224 0.595358
+vt 0.710224 0.595263
+vt 0.718496 0.595263
+vt 0.710224 0.595037
+vt 0.718496 0.595037
+vt 0.726768 0.595263
+vt 0.726768 0.595358
+vt 0.735040 0.595262
+vt 0.735040 0.595358
+vt 0.726768 0.595037
+vt 0.735040 0.595037
+vt 0.751583 0.595357
+vt 0.743312 0.595358
+vt 0.743312 0.595262
+vt 0.751583 0.595262
+vt 0.743312 0.595036
+vt 0.751583 0.595036
+vt 0.759855 0.595262
+vt 0.759855 0.595357
+vt 0.768127 0.595262
+vt 0.768127 0.595357
+vt 0.759855 0.595036
+vt 0.768127 0.595036
+vt 0.784671 0.595356
+vt 0.776399 0.595356
+vt 0.776399 0.595261
+vt 0.784671 0.595261
+vt 0.776399 0.595035
+vt 0.784671 0.595035
+vt 0.792942 0.595261
+vt 0.792942 0.595356
+vt 0.801214 0.595260
+vt 0.801214 0.595355
+vt 0.792942 0.595035
+vt 0.801214 0.595034
+vt 0.817758 0.595355
+vt 0.809486 0.595355
+vt 0.809486 0.595260
+vt 0.817758 0.595259
+vt 0.809486 0.595034
+vt 0.817758 0.595033
+vt 0.826029 0.595259
+vt 0.826029 0.595354
+vt 0.834301 0.595258
+vt 0.834301 0.595353
+vt 0.826029 0.595033
+vt 0.834301 0.595032
+vt 0.850845 0.595352
+vt 0.842573 0.595353
+vt 0.842573 0.595258
+vt 0.850845 0.595257
+vt 0.842573 0.595032
+vt 0.850845 0.595031
+vt 0.859116 0.595257
+vt 0.859116 0.595352
+vt 0.867388 0.595256
+vt 0.867388 0.595351
+vt 0.859116 0.595031
+vt 0.867388 0.595030
+vt 0.883931 0.595350
+vt 0.875659 0.595351
+vt 0.875659 0.595255
+vt 0.883931 0.595255
+vt 0.875659 0.595030
+vt 0.883931 0.595029
+vt 0.892203 0.595254
+vt 0.900474 0.595254
+vt 0.892203 0.595029
+vt 0.900474 0.595028
+vt 0.892203 0.595361
+vt 0.900474 0.595360
+vt 0.122950 0.595348
+vt 0.114678 0.595348
+vt 0.114678 0.595027
+vt 0.122950 0.595027
+vt 0.106407 0.595349
+vt 0.106407 0.595028
+vt 0.131221 0.595252
+vt 0.139493 0.595252
+vt 0.131221 0.595026
+vt 0.139493 0.595026
+vt 0.131221 0.595358
+vt 0.122950 0.595359
+vt 0.139493 0.595358
+vt 0.114678 0.595359
+vt 0.106407 0.595360
+vt 0.156036 0.595346
+vt 0.147764 0.595346
+vt 0.147764 0.595025
+vt 0.156036 0.595024
+vt 0.164307 0.595250
+vt 0.164307 0.595345
+vt 0.172578 0.595249
+vt 0.172578 0.595345
+vt 0.164307 0.595024
+vt 0.172578 0.595023
+vt 0.164307 0.595356
+vt 0.156036 0.595357
+vt 0.172578 0.595356
+vt 0.147764 0.595357
+vt 0.189121 0.595344
+vt 0.180850 0.595344
+vt 0.180850 0.595249
+vt 0.189121 0.595248
+vt 0.180850 0.595023
+vt 0.189121 0.595022
+vt 0.197392 0.595248
+vt 0.197392 0.595343
+vt 0.205664 0.595248
+vt 0.205664 0.595343
+vt 0.197392 0.595022
+vt 0.205664 0.595022
+vt 0.197392 0.595354
+vt 0.189121 0.595355
+vt 0.205664 0.595354
+vt 0.180850 0.595355
+vt 0.222206 0.595342
+vt 0.213935 0.595343
+vt 0.213935 0.595247
+vt 0.222206 0.595247
+vt 0.213935 0.595021
+vt 0.222206 0.595021
+vt 0.230478 0.595247
+vt 0.230478 0.595342
+vt 0.238749 0.595246
+vt 0.238749 0.595342
+vt 0.230478 0.595021
+vt 0.238749 0.595020
+vt 0.230478 0.595353
+vt 0.222206 0.595353
+vt 0.238749 0.595352
+vt 0.213935 0.595353
+vt 0.255291 0.595341
+vt 0.247020 0.595341
+vt 0.247020 0.595246
+vt 0.255291 0.595246
+vt 0.247020 0.595020
+vt 0.255291 0.595020
+vt 0.263563 0.595246
+vt 0.263563 0.595341
+vt 0.271834 0.595245
+vt 0.271834 0.595341
+vt 0.263563 0.595020
+vt 0.271834 0.595020
+vt 0.263563 0.595352
+vt 0.255291 0.595352
+vt 0.271834 0.595352
+vt 0.247020 0.595352
+vt 0.288376 0.595340
+vt 0.280105 0.595341
+vt 0.280105 0.595245
+vt 0.288376 0.595245
+vt 0.280105 0.595019
+vt 0.288376 0.595019
+vt 0.296647 0.595245
+vt 0.296647 0.595340
+vt 0.304918 0.595245
+vt 0.304918 0.595340
+vt 0.296647 0.595019
+vt 0.304918 0.595019
+vt 0.296647 0.595351
+vt 0.288376 0.595351
+vt 0.304919 0.595351
+vt 0.280105 0.595351
+vt 0.321461 0.595340
+vt 0.313190 0.595340
+vt 0.313190 0.595245
+vt 0.321461 0.595245
+vt 0.313190 0.595019
+vt 0.321461 0.595019
+vt 0.329732 0.595245
+vt 0.329732 0.595341
+vt 0.338003 0.595245
+vt 0.338003 0.595341
+vt 0.329732 0.595019
+vt 0.338003 0.595020
+vt 0.329732 0.595351
+vt 0.321461 0.595351
+vt 0.338003 0.595352
+vt 0.313190 0.595351
+vt 0.354546 0.595341
+vt 0.346274 0.595341
+vt 0.346274 0.595246
+vt 0.354546 0.595246
+vt 0.346274 0.595020
+vt 0.354546 0.595020
+vt 0.362817 0.595246
+vt 0.362817 0.595341
+vt 0.362817 0.595020
+vt 0.362817 0.595352
+vt 0.354546 0.595352
+vt 0.346274 0.595352
+vt 0.817758 0.594128
+vt 0.809486 0.594128
+vt 0.809486 0.593602
+vt 0.817758 0.593602
+vt 0.801214 0.594128
+vt 0.801214 0.593602
+vt 0.826029 0.593601
+vt 0.826029 0.594127
+vt 0.834301 0.593601
+vt 0.834301 0.594127
+vt 0.826029 0.594630
+vt 0.817758 0.594630
+vt 0.834301 0.594629
+vt 0.809486 0.594631
+vt 0.801214 0.594631
+vt 0.784671 0.594129
+vt 0.776399 0.594130
+vt 0.776399 0.593603
+vt 0.784671 0.593603
+vt 0.768127 0.594130
+vt 0.768127 0.593604
+vt 0.792942 0.593603
+vt 0.792942 0.594129
+vt 0.792942 0.594632
+vt 0.784671 0.594632
+vt 0.776399 0.594632
+vt 0.768127 0.594633
+vt 0.751583 0.594130
+vt 0.743311 0.594131
+vt 0.743312 0.593605
+vt 0.751583 0.593604
+vt 0.735040 0.594131
+vt 0.735040 0.593605
+vt 0.759855 0.593604
+vt 0.759855 0.594130
+vt 0.759855 0.594633
+vt 0.751583 0.594633
+vt 0.743311 0.594634
+vt 0.735040 0.594634
+vt 0.718496 0.594131
+vt 0.710224 0.594131
+vt 0.710224 0.593605
+vt 0.718496 0.593605
+vt 0.701952 0.594131
+vt 0.701952 0.593605
+vt 0.726768 0.593605
+vt 0.726768 0.594131
+vt 0.726768 0.594634
+vt 0.718496 0.594634
+vt 0.710224 0.594634
+vt 0.701952 0.594634
+vt 0.685408 0.594131
+vt 0.677137 0.594131
+vt 0.677137 0.593605
+vt 0.685408 0.593605
+vt 0.668865 0.594131
+vt 0.668865 0.593605
+vt 0.693680 0.593605
+vt 0.693680 0.594131
+vt 0.693680 0.594634
+vt 0.685408 0.594634
+vt 0.677137 0.594634
+vt 0.668865 0.594634
+vt 0.652321 0.594130
+vt 0.644049 0.594130
+vt 0.644049 0.593604
+vt 0.652321 0.593604
+vt 0.635777 0.594130
+vt 0.635777 0.593604
+vt 0.660593 0.593605
+vt 0.660593 0.594131
+vt 0.660593 0.594634
+vt 0.652321 0.594633
+vt 0.644049 0.594633
+vt 0.635777 0.594633
+vt 0.619234 0.594129
+vt 0.610962 0.594129
+vt 0.610962 0.593603
+vt 0.619234 0.593603
+vt 0.602690 0.594128
+vt 0.602690 0.593602
+vt 0.627506 0.593604
+vt 0.627505 0.594130
+vt 0.627505 0.594633
+vt 0.619234 0.594632
+vt 0.610962 0.594632
+vt 0.602690 0.594631
+vt 0.586147 0.594128
+vt 0.577875 0.594127
+vt 0.577875 0.593601
+vt 0.586147 0.593602
+vt 0.569603 0.594127
+vt 0.569603 0.593601
+vt 0.594418 0.593602
+vt 0.594418 0.594128
+vt 0.594418 0.594631
+vt 0.586147 0.594631
+vt 0.577875 0.594630
+vt 0.569603 0.594630
+vt 0.553060 0.594126
+vt 0.544788 0.594125
+vt 0.544788 0.593599
+vt 0.553060 0.593600
+vt 0.536517 0.594125
+vt 0.536517 0.593599
+vt 0.561332 0.593600
+vt 0.561332 0.594126
+vt 0.561331 0.594629
+vt 0.553060 0.594629
+vt 0.544788 0.594628
+vt 0.536516 0.594627
+vt 0.519973 0.594123
+vt 0.511702 0.594123
+vt 0.511702 0.593597
+vt 0.519973 0.593597
+vt 0.503430 0.594122
+vt 0.503430 0.593596
+vt 0.528245 0.593598
+vt 0.528245 0.594124
+vt 0.528245 0.594627
+vt 0.519973 0.594626
+vt 0.511702 0.594626
+vt 0.503430 0.594625
+vt 0.486887 0.594121
+vt 0.478616 0.594121
+vt 0.478616 0.593595
+vt 0.486887 0.593595
+vt 0.470344 0.594120
+vt 0.470344 0.593594
+vt 0.495159 0.593596
+vt 0.495159 0.594122
+vt 0.495159 0.594625
+vt 0.486887 0.594624
+vt 0.478616 0.594624
+vt 0.470344 0.594623
+vt 0.453801 0.594119
+vt 0.445530 0.594118
+vt 0.445530 0.593592
+vt 0.453801 0.593593
+vt 0.437259 0.594118
+vt 0.437259 0.593592
+vt 0.462073 0.593593
+vt 0.462073 0.594119
+vt 0.462073 0.594622
+vt 0.453801 0.594622
+vt 0.445530 0.594621
+vt 0.437259 0.594621
+vt 0.420716 0.594117
+vt 0.412445 0.594117
+vt 0.412445 0.593591
+vt 0.420716 0.593591
+vt 0.404173 0.594116
+vt 0.404173 0.593590
+vt 0.428987 0.593591
+vt 0.428987 0.594117
+vt 0.428987 0.594620
+vt 0.420716 0.594620
+vt 0.412445 0.594619
+vt 0.404173 0.594619
+vt 0.387631 0.594115
+vt 0.379359 0.594115
+vt 0.379359 0.593589
+vt 0.387631 0.593589
+vt 0.371088 0.594115
+vt 0.371088 0.593589
+vt 0.395902 0.593590
+vt 0.395902 0.594116
+vt 0.395902 0.594619
+vt 0.387631 0.594618
+vt 0.379359 0.594618
+vt 0.371088 0.594617
+vt 0.354546 0.594114
+vt 0.346274 0.594114
+vt 0.346275 0.593588
+vt 0.354546 0.593588
+vt 0.338003 0.594114
+vt 0.338003 0.593588
+vt 0.362817 0.593588
+vt 0.362817 0.594114
+vt 0.362817 0.594617
+vt 0.354546 0.594617
+vt 0.346274 0.594617
+vt 0.338003 0.594617
+vt 0.321461 0.594113
+vt 0.313190 0.594113
+vt 0.313190 0.593587
+vt 0.321461 0.593587
+vt 0.304918 0.594113
+vt 0.304919 0.593587
+vt 0.329732 0.593588
+vt 0.329732 0.594114
+vt 0.329732 0.594617
+vt 0.321461 0.594616
+vt 0.313190 0.594616
+vt 0.304918 0.594616
+vt 0.288376 0.594113
+vt 0.280105 0.594114
+vt 0.280105 0.593588
+vt 0.288376 0.593587
+vt 0.271834 0.594114
+vt 0.271834 0.593588
+vt 0.296647 0.593587
+vt 0.296647 0.594113
+vt 0.296647 0.594616
+vt 0.288376 0.594616
+vt 0.280105 0.594616
+vt 0.271834 0.594617
+vt 0.255291 0.594114
+vt 0.247020 0.594114
+vt 0.247020 0.593588
+vt 0.255291 0.593588
+vt 0.238749 0.594115
+vt 0.238749 0.593588
+vt 0.263562 0.593588
+vt 0.263562 0.594114
+vt 0.263562 0.594617
+vt 0.255291 0.594617
+vt 0.247020 0.594617
+vt 0.238749 0.594617
+vt 0.222206 0.594115
+vt 0.213935 0.594115
+vt 0.213935 0.593590
+vt 0.222206 0.593589
+vt 0.205664 0.594116
+vt 0.205664 0.593590
+vt 0.230478 0.593589
+vt 0.230478 0.594115
+vt 0.230478 0.594618
+vt 0.222206 0.594618
+vt 0.213935 0.594618
+vt 0.205664 0.594619
+vt 0.189121 0.594117
+vt 0.180850 0.594117
+vt 0.180850 0.593591
+vt 0.189121 0.593591
+vt 0.172578 0.594118
+vt 0.172578 0.593592
+vt 0.197392 0.593590
+vt 0.197392 0.594116
+vt 0.197392 0.594619
+vt 0.189121 0.594620
+vt 0.180850 0.594620
+vt 0.172578 0.594621
+vt 0.156036 0.594119
+vt 0.147764 0.594119
+vt 0.147764 0.593593
+vt 0.156036 0.593593
+vt 0.139493 0.594120
+vt 0.139493 0.593594
+vt 0.164307 0.593592
+vt 0.164307 0.594118
+vt 0.164307 0.594621
+vt 0.156036 0.594622
+vt 0.147764 0.594622
+vt 0.139493 0.594623
+vt 0.122950 0.594121
+vt 0.114678 0.594122
+vt 0.114678 0.593596
+vt 0.122950 0.593595
+vt 0.106407 0.594122
+vt 0.106407 0.593596
+vt 0.131221 0.593594
+vt 0.131221 0.594120
+vt 0.131221 0.594623
+vt 0.122950 0.594624
+vt 0.114678 0.594624
+vt 0.106407 0.594625
+vt 0.883931 0.594123
+vt 0.875659 0.594124
+vt 0.875659 0.593598
+vt 0.883931 0.593597
+vt 0.867388 0.594124
+vt 0.867388 0.593598
+vt 0.892202 0.593597
+vt 0.892202 0.594123
+vt 0.900474 0.593596
+vt 0.900474 0.594122
+vt 0.892202 0.594626
+vt 0.883931 0.594626
+vt 0.900474 0.594625
+vt 0.875659 0.594627
+vt 0.867388 0.594627
+vt 0.850844 0.594126
+vt 0.842573 0.594126
+vt 0.842573 0.593600
+vt 0.850844 0.593600
+vt 0.859116 0.593599
+vt 0.859116 0.594125
+vt 0.859116 0.594628
+vt 0.850845 0.594628
+vt 0.842573 0.594629
+vt 0.817758 0.595540
+vt 0.809486 0.595541
+vt 0.801214 0.595541
+vt 0.826029 0.595540
+vt 0.834301 0.595539
+vt 0.826030 0.596234
+vt 0.817758 0.596235
+vt 0.834301 0.596234
+vt 0.809486 0.596235
+vt 0.801214 0.596236
+vt 0.784671 0.595542
+vt 0.776399 0.595542
+vt 0.768127 0.595542
+vt 0.792943 0.595541
+vt 0.792943 0.596236
+vt 0.784671 0.596236
+vt 0.776399 0.596237
+vt 0.768127 0.596237
+vt 0.751583 0.595543
+vt 0.743312 0.595543
+vt 0.735040 0.595543
+vt 0.759855 0.595543
+vt 0.759855 0.596237
+vt 0.751583 0.596238
+vt 0.743312 0.596238
+vt 0.735040 0.596238
+vt 0.718496 0.595544
+vt 0.710224 0.595544
+vt 0.701952 0.595544
+vt 0.726768 0.595544
+vt 0.726768 0.596238
+vt 0.718496 0.596238
+vt 0.710224 0.596238
+vt 0.701952 0.596238
+vt 0.685408 0.595544
+vt 0.677136 0.595544
+vt 0.668865 0.595543
+vt 0.693680 0.595544
+vt 0.693680 0.596238
+vt 0.685408 0.596238
+vt 0.677136 0.596238
+vt 0.668865 0.596238
+vt 0.652321 0.595543
+vt 0.644049 0.595543
+vt 0.635777 0.595543
+vt 0.660593 0.595543
+vt 0.660593 0.596238
+vt 0.652321 0.596238
+vt 0.644049 0.596237
+vt 0.635777 0.596237
+vt 0.619234 0.595542
+vt 0.610962 0.595542
+vt 0.602690 0.595541
+vt 0.627505 0.595542
+vt 0.627505 0.596237
+vt 0.619234 0.596236
+vt 0.610962 0.596236
+vt 0.602690 0.596236
+vt 0.586146 0.595540
+vt 0.577875 0.595540
+vt 0.569603 0.595539
+vt 0.594418 0.595541
+vt 0.594418 0.596235
+vt 0.586146 0.596235
+vt 0.577875 0.596234
+vt 0.569603 0.596234
+vt 0.553060 0.595538
+vt 0.544788 0.595538
+vt 0.536516 0.595537
+vt 0.561331 0.595539
+vt 0.561331 0.596233
+vt 0.553060 0.596233
+vt 0.544788 0.596232
+vt 0.536516 0.596232
+vt 0.519973 0.595536
+vt 0.511702 0.595536
+vt 0.503430 0.595535
+vt 0.528245 0.595537
+vt 0.528245 0.596231
+vt 0.519973 0.596231
+vt 0.511702 0.596230
+vt 0.503430 0.596230
+vt 0.486887 0.595534
+vt 0.478616 0.595533
+vt 0.470344 0.595533
+vt 0.495159 0.595534
+vt 0.495158 0.596229
+vt 0.486887 0.596228
+vt 0.478615 0.596228
+vt 0.470344 0.596227
+vt 0.453801 0.595532
+vt 0.445530 0.595531
+vt 0.437258 0.595531
+vt 0.462073 0.595532
+vt 0.462073 0.596227
+vt 0.453801 0.596226
+vt 0.445530 0.596226
+vt 0.437258 0.596225
+vt 0.420716 0.595530
+vt 0.412444 0.595529
+vt 0.404173 0.595529
+vt 0.428987 0.595530
+vt 0.428987 0.596225
+vt 0.420716 0.596224
+vt 0.412444 0.596224
+vt 0.404173 0.596223
+vt 0.387631 0.595528
+vt 0.379359 0.595528
+vt 0.371088 0.595527
+vt 0.395902 0.595528
+vt 0.395902 0.596223
+vt 0.387631 0.596222
+vt 0.379359 0.596222
+vt 0.371088 0.596222
+vt 0.354546 0.595527
+vt 0.346274 0.595527
+vt 0.338003 0.595526
+vt 0.362817 0.595527
+vt 0.362817 0.596222
+vt 0.354546 0.596221
+vt 0.346274 0.596221
+vt 0.338003 0.596221
+vt 0.321461 0.595526
+vt 0.313190 0.595526
+vt 0.304919 0.595526
+vt 0.329732 0.595526
+vt 0.329732 0.596221
+vt 0.321461 0.596221
+vt 0.313190 0.596221
+vt 0.304919 0.596221
+vt 0.288376 0.595526
+vt 0.280105 0.595526
+vt 0.271834 0.595526
+vt 0.296647 0.595526
+vt 0.296647 0.596221
+vt 0.288376 0.596221
+vt 0.280105 0.596221
+vt 0.271834 0.596221
+vt 0.255291 0.595527
+vt 0.247020 0.595527
+vt 0.238749 0.595527
+vt 0.263563 0.595527
+vt 0.263563 0.596221
+vt 0.255291 0.596221
+vt 0.247020 0.596222
+vt 0.238749 0.596222
+vt 0.222206 0.595528
+vt 0.213935 0.595528
+vt 0.205664 0.595529
+vt 0.230478 0.595528
+vt 0.230478 0.596222
+vt 0.222206 0.596222
+vt 0.213935 0.596223
+vt 0.205664 0.596223
+vt 0.189121 0.595529
+vt 0.180850 0.595530
+vt 0.172579 0.595530
+vt 0.197393 0.595529
+vt 0.197393 0.596224
+vt 0.189121 0.596224
+vt 0.180850 0.596224
+vt 0.172579 0.596225
+vt 0.156036 0.595531
+vt 0.147764 0.595532
+vt 0.139493 0.595532
+vt 0.164307 0.595531
+vt 0.164307 0.596225
+vt 0.156036 0.596226
+vt 0.147764 0.596226
+vt 0.139493 0.596227
+vt 0.122950 0.595534
+vt 0.114678 0.595534
+vt 0.106407 0.595535
+vt 0.131221 0.595533
+vt 0.131221 0.596228
+vt 0.122950 0.596228
+vt 0.114679 0.596229
+vt 0.106407 0.596229
+vt 0.883931 0.595536
+vt 0.875659 0.595537
+vt 0.867388 0.595537
+vt 0.892203 0.595535
+vt 0.900474 0.595535
+vt 0.892203 0.596230
+vt 0.883931 0.596231
+vt 0.900474 0.596229
+vt 0.875660 0.596231
+vt 0.867388 0.596232
+vt 0.850845 0.595538
+vt 0.842573 0.595539
+vt 0.859116 0.595538
+vt 0.859116 0.596232
+vt 0.850845 0.596233
+vt 0.842573 0.596233
+vt 0.818042 0.680502
+vt 0.826301 0.680519
+vt 0.826401 0.682025
+vt 0.818146 0.682001
+vt 0.834556 0.680536
+vt 0.834650 0.682047
+vt 0.809884 0.681976
+vt 0.809777 0.680484
+vt 0.801616 0.681951
+vt 0.801508 0.680466
+vt 0.809670 0.678893
+vt 0.817937 0.678904
+vt 0.801399 0.678882
+vt 0.826202 0.678915
+vt 0.834463 0.678925
+vt 0.784954 0.680430
+vt 0.793233 0.680448
+vt 0.793340 0.681926
+vt 0.785058 0.681902
+vt 0.776770 0.681878
+vt 0.776670 0.680413
+vt 0.768475 0.681855
+vt 0.768381 0.680396
+vt 0.776570 0.678848
+vt 0.784849 0.678859
+vt 0.768287 0.678838
+vt 0.793126 0.678870
+vt 0.751791 0.680367
+vt 0.760088 0.680381
+vt 0.760174 0.681834
+vt 0.751867 0.681815
+vt 0.743556 0.681799
+vt 0.743490 0.680355
+vt 0.735241 0.681785
+vt 0.735186 0.680345
+vt 0.743424 0.678813
+vt 0.751714 0.678820
+vt 0.735132 0.678806
+vt 0.760002 0.678829
+vt 0.718572 0.680331
+vt 0.726880 0.680337
+vt 0.726922 0.681773
+vt 0.718600 0.681765
+vt 0.710277 0.681760
+vt 0.710262 0.680328
+vt 0.701952 0.681759
+vt 0.701952 0.680326
+vt 0.710248 0.678795
+vt 0.718544 0.678798
+vt 0.701952 0.678795
+vt 0.726838 0.678801
+vt 0.685333 0.680331
+vt 0.693642 0.680328
+vt 0.693628 0.681760
+vt 0.685305 0.681765
+vt 0.676983 0.681773
+vt 0.677024 0.680337
+vt 0.668664 0.681785
+vt 0.668718 0.680345
+vt 0.677066 0.678801
+vt 0.685361 0.678798
+vt 0.668772 0.678806
+vt 0.693656 0.678795
+vt 0.652114 0.680367
+vt 0.660414 0.680355
+vt 0.660348 0.681799
+vt 0.652037 0.681815
+vt 0.643731 0.681834
+vt 0.643817 0.680381
+vt 0.635430 0.681855
+vt 0.635523 0.680396
+vt 0.643903 0.678829
+vt 0.652190 0.678820
+vt 0.635617 0.678838
+vt 0.660481 0.678813
+vt 0.618951 0.680430
+vt 0.627235 0.680413
+vt 0.627135 0.681878
+vt 0.618846 0.681902
+vt 0.610564 0.681926
+vt 0.610671 0.680448
+vt 0.602289 0.681951
+vt 0.602397 0.680466
+vt 0.610779 0.678870
+vt 0.619055 0.678859
+vt 0.602505 0.678882
+vt 0.627335 0.678848
+vt 0.585863 0.680502
+vt 0.594127 0.680484
+vt 0.594020 0.681976
+vt 0.585759 0.682001
+vt 0.577504 0.682025
+vt 0.577603 0.680519
+vt 0.569255 0.682047
+vt 0.569348 0.680536
+vt 0.577703 0.678915
+vt 0.585967 0.678904
+vt 0.569441 0.678925
+vt 0.594235 0.678893
+vt 0.552850 0.680565
+vt 0.561097 0.680551
+vt 0.561012 0.682068
+vt 0.552774 0.682087
+vt 0.544541 0.682104
+vt 0.544607 0.680577
+vt 0.536312 0.682118
+vt 0.536366 0.680587
+vt 0.544672 0.678951
+vt 0.552926 0.678943
+vt 0.536420 0.678957
+vt 0.561183 0.678935
+vt 0.519892 0.680601
+vt 0.528128 0.680595
+vt 0.528087 0.682129
+vt 0.519865 0.682137
+vt 0.511644 0.682143
+vt 0.511658 0.680605
+vt 0.503424 0.682145
+vt 0.503423 0.680606
+vt 0.511671 0.678968
+vt 0.519920 0.678966
+vt 0.503423 0.678969
+vt 0.528169 0.678962
+vt 0.486955 0.680602
+vt 0.495189 0.680605
+vt 0.495204 0.682144
+vt 0.486983 0.682139
+vt 0.478760 0.682132
+vt 0.478719 0.680597
+vt 0.470535 0.682121
+vt 0.470481 0.680589
+vt 0.478678 0.678963
+vt 0.486927 0.678966
+vt 0.470427 0.678958
+vt 0.495175 0.678968
+vt 0.453998 0.680568
+vt 0.462241 0.680579
+vt 0.462307 0.682108
+vt 0.454075 0.682092
+vt 0.445838 0.682074
+vt 0.445752 0.680555
+vt 0.437596 0.682053
+vt 0.437502 0.680540
+vt 0.445666 0.678936
+vt 0.453922 0.678945
+vt 0.437408 0.678927
+vt 0.462176 0.678952
+vt 0.420989 0.680507
+vt 0.429248 0.680524
+vt 0.429348 0.682031
+vt 0.421093 0.682008
+vt 0.412833 0.681984
+vt 0.412725 0.680490
+vt 0.404565 0.681960
+vt 0.404457 0.680472
+vt 0.412618 0.678896
+vt 0.420884 0.678907
+vt 0.404349 0.678885
+vt 0.429148 0.678917
+vt 0.387905 0.680437
+vt 0.396184 0.680454
+vt 0.396291 0.681935
+vt 0.388010 0.681911
+vt 0.379723 0.681888
+vt 0.379623 0.680420
+vt 0.371429 0.681866
+vt 0.371335 0.680404
+vt 0.379522 0.678852
+vt 0.387801 0.678863
+vt 0.371241 0.678842
+vt 0.396076 0.678874
+vt 0.354748 0.680375
+vt 0.363043 0.680389
+vt 0.363129 0.681845
+vt 0.354824 0.681826
+vt 0.346515 0.681810
+vt 0.346449 0.680363
+vt 0.338201 0.681796
+vt 0.338146 0.680353
+vt 0.346382 0.678817
+vt 0.354671 0.678824
+vt 0.338092 0.678811
+vt 0.362957 0.678833
+vt 0.321535 0.680340
+vt 0.329842 0.680346
+vt 0.329883 0.681785
+vt 0.321563 0.681777
+vt 0.313241 0.681773
+vt 0.313227 0.680336
+vt 0.304918 0.681771
+vt 0.304918 0.680335
+vt 0.313213 0.678800
+vt 0.321507 0.678802
+vt 0.304918 0.678799
+vt 0.329800 0.678806
+vt 0.288302 0.680340
+vt 0.296610 0.680336
+vt 0.296596 0.681773
+vt 0.288274 0.681777
+vt 0.279954 0.681785
+vt 0.279995 0.680345
+vt 0.271636 0.681796
+vt 0.271691 0.680353
+vt 0.280037 0.678806
+vt 0.288330 0.678802
+vt 0.271745 0.678811
+vt 0.296624 0.678800
+vt 0.255089 0.680375
+vt 0.263388 0.680363
+vt 0.263322 0.681810
+vt 0.255012 0.681826
+vt 0.246707 0.681845
+vt 0.246794 0.680389
+vt 0.238408 0.681865
+vt 0.238502 0.680404
+vt 0.246880 0.678833
+vt 0.255166 0.678824
+vt 0.238596 0.678842
+vt 0.263455 0.678817
+vt 0.221931 0.680437
+vt 0.230214 0.680420
+vt 0.230114 0.681888
+vt 0.221827 0.681911
+vt 0.213546 0.681935
+vt 0.213653 0.680454
+vt 0.205272 0.681960
+vt 0.205380 0.680472
+vt 0.213761 0.678874
+vt 0.222036 0.678863
+vt 0.205488 0.678885
+vt 0.230314 0.678852
+vt 0.188848 0.680507
+vt 0.197112 0.680490
+vt 0.197004 0.681984
+vt 0.188744 0.682008
+vt 0.180489 0.682032
+vt 0.180589 0.680524
+vt 0.172241 0.682053
+vt 0.172335 0.680540
+vt 0.180689 0.678917
+vt 0.188953 0.678907
+vt 0.172428 0.678927
+vt 0.197219 0.678896
+vt 0.155839 0.680568
+vt 0.164085 0.680555
+vt 0.163999 0.682074
+vt 0.155762 0.682092
+vt 0.147530 0.682108
+vt 0.147596 0.680579
+vt 0.139302 0.682121
+vt 0.139356 0.680589
+vt 0.147661 0.678952
+vt 0.155915 0.678945
+vt 0.139410 0.678958
+vt 0.164170 0.678936
+vt 0.122882 0.680603
+vt 0.131118 0.680597
+vt 0.131077 0.682132
+vt 0.122854 0.682140
+vt 0.114633 0.682147
+vt 0.114648 0.680608
+vt 0.106414 0.682153
+vt 0.106414 0.680612
+vt 0.114662 0.678970
+vt 0.122910 0.678967
+vt 0.106414 0.678973
+vt 0.131159 0.678963
+vt 0.884012 0.680602
+vt 0.892247 0.680607
+vt 0.892261 0.682146
+vt 0.884040 0.682139
+vt 0.900481 0.680612
+vt 0.900481 0.682153
+vt 0.875817 0.682129
+vt 0.875776 0.680595
+vt 0.867592 0.682118
+vt 0.867538 0.680587
+vt 0.875735 0.678962
+vt 0.883984 0.678966
+vt 0.867484 0.678957
+vt 0.892233 0.678970
+vt 0.900481 0.678973
+vt 0.851054 0.680565
+vt 0.859298 0.680577
+vt 0.859363 0.682104
+vt 0.851130 0.682087
+vt 0.842893 0.682068
+vt 0.842807 0.680551
+vt 0.842722 0.678934
+vt 0.850978 0.678943
+vt 0.859232 0.678951
+vt 0.288149 0.338786
+vt 0.296497 0.338762
+vt 0.296633 0.342348
+vt 0.288344 0.342348
+vt 0.304925 0.338762
+vt 0.304923 0.342348
+vt 0.280055 0.342348
+vt 0.279961 0.338854
+vt 0.271766 0.342348
+vt 0.271888 0.338900
+vt 0.279725 0.336057
+vt 0.287594 0.335782
+vt 0.278397 0.334009
+vt 0.286280 0.333506
+vt 0.272318 0.336240
+vt 0.273004 0.334684
+vt 0.296101 0.335689
+vt 0.304927 0.335688
+vt 0.295316 0.333336
+vt 0.304928 0.333334
+vt 0.255872 0.338786
+vt 0.263887 0.338855
+vt 0.263477 0.342348
+vt 0.255189 0.342348
+vt 0.246901 0.342348
+vt 0.247757 0.338763
+vt 0.238613 0.342349
+vt 0.239592 0.338762
+vt 0.250432 0.335688
+vt 0.258015 0.335782
+vt 0.255847 0.333333
+vt 0.262523 0.333506
+vt 0.242650 0.335685
+vt 0.248838 0.333324
+vt 0.265195 0.336057
+vt 0.268531 0.334009
+vt 0.223265 0.338761
+vt 0.231428 0.338762
+vt 0.230327 0.342349
+vt 0.222040 0.342349
+vt 0.213755 0.342350
+vt 0.215103 0.338760
+vt 0.205470 0.342350
+vt 0.206942 0.338760
+vt 0.219310 0.335675
+vt 0.227089 0.335678
+vt 0.227818 0.333297
+vt 0.234823 0.333306
+vt 0.211532 0.335671
+vt 0.220815 0.333286
+vt 0.234869 0.335682
+vt 0.241830 0.333315
+vt 0.190623 0.338766
+vt 0.198782 0.338759
+vt 0.197186 0.342351
+vt 0.188903 0.342356
+vt 0.180621 0.342372
+vt 0.182466 0.338790
+vt 0.172340 0.342404
+vt 0.174310 0.338838
+vt 0.188209 0.335700
+vt 0.195981 0.335673
+vt 0.199814 0.333298
+vt 0.206812 0.333275
+vt 0.180437 0.335758
+vt 0.192817 0.333354
+vt 0.203756 0.335667
+vt 0.213813 0.333275
+vt 0.159099 0.338994
+vt 0.166156 0.338918
+vt 0.164060 0.342457
+vt 0.155781 0.342521
+vt 0.147503 0.342584
+vt 0.154234 0.339026
+vt 0.139226 0.342637
+vt 0.147917 0.339042
+vt 0.174666 0.335759
+vt 0.169283 0.335893
+vt 0.202780 0.333195
+vt 0.186565 0.333453
+vt 0.174234 0.335598
+vt 0.252504 0.332096
+vt 0.172668 0.335858
+vt 0.185822 0.333456
+vt 0.123962 0.339085
+vt 0.136503 0.339065
+vt 0.130950 0.342669
+vt 0.122676 0.342685
+vt 0.114401 0.342691
+vt 0.114265 0.339092
+vt 0.106127 0.342692
+vt 0.105990 0.339092
+vt 0.114109 0.335574
+vt 0.128073 0.335569
+vt 0.113944 0.332097
+vt 0.133595 0.332097
+vt 0.105833 0.335575
+vt 0.105666 0.332098
+vt 0.153409 0.335556
+vt 0.175991 0.332096
+vt 0.879587 0.339027
+vt 0.884430 0.339162
+vt 0.891925 0.342608
+vt 0.883656 0.342530
+vt 0.888178 0.339310
+vt 0.900194 0.342692
+vt 0.875387 0.342463
+vt 0.872551 0.338918
+vt 0.867120 0.342411
+vt 0.864419 0.338839
+vt 0.864291 0.335840
+vt 0.867632 0.335990
+vt 0.847914 0.333405
+vt 0.847091 0.333569
+vt 0.856562 0.335742
+vt 0.840988 0.333305
+vt 0.862200 0.336202
+vt 0.852382 0.336444
+vt 0.830787 0.333817
+vt 0.780938 0.334270
+vt 0.848154 0.338770
+vt 0.856287 0.338792
+vt 0.858853 0.342380
+vt 0.850587 0.342365
+vt 0.842323 0.342360
+vt 0.840023 0.338764
+vt 0.834060 0.342361
+vt 0.831892 0.338765
+vt 0.833349 0.335656
+vt 0.841088 0.335661
+vt 0.820132 0.333235
+vt 0.827092 0.333232
+vt 0.825608 0.335662
+vt 0.813169 0.333249
+vt 0.848827 0.335686
+vt 0.834046 0.333251
+vt 0.815635 0.338769
+vt 0.823763 0.338767
+vt 0.825797 0.342361
+vt 0.817536 0.342362
+vt 0.809276 0.342362
+vt 0.807509 0.338771
+vt 0.801016 0.342363
+vt 0.799383 0.338772
+vt 0.802399 0.335679
+vt 0.810134 0.335673
+vt 0.792289 0.333288
+vt 0.799247 0.333276
+vt 0.794665 0.335684
+vt 0.785333 0.333300
+vt 0.817870 0.335668
+vt 0.806207 0.333263
+vt 0.783136 0.338775
+vt 0.791259 0.338774
+vt 0.792757 0.342363
+vt 0.784499 0.342363
+vt 0.776242 0.342364
+vt 0.775014 0.338776
+vt 0.767985 0.342364
+vt 0.766893 0.338777
+vt 0.771473 0.335697
+vt 0.779202 0.335692
+vt 0.764473 0.333331
+vt 0.771425 0.333321
+vt 0.763745 0.335700
+vt 0.757522 0.333340
+vt 0.786933 0.335688
+vt 0.778378 0.333311
+vt 0.750703 0.338802
+vt 0.758773 0.338779
+vt 0.759729 0.342364
+vt 0.751474 0.342365
+vt 0.743219 0.342365
+vt 0.742735 0.338871
+vt 0.734964 0.342365
+vt 0.734782 0.338917
+vt 0.741369 0.336074
+vt 0.748492 0.335798
+vt 0.738010 0.334026
+vt 0.743957 0.333522
+vt 0.734303 0.336257
+vt 0.733590 0.334701
+vt 0.756017 0.335704
+vt 0.750572 0.333349
+vt 0.718616 0.338803
+vt 0.726756 0.338872
+vt 0.726710 0.342365
+vt 0.718456 0.342365
+vt 0.710202 0.342365
+vt 0.710320 0.338780
+vt 0.701948 0.342365
+vt 0.701946 0.338780
+vt 0.710696 0.335707
+vt 0.719135 0.335799
+vt 0.711459 0.333354
+vt 0.720410 0.333524
+vt 0.701944 0.335706
+vt 0.726948 0.336074
+vt 0.728230 0.334026
+vt 0.685276 0.338803
+vt 0.693572 0.338780
+vt 0.693694 0.342365
+vt 0.685440 0.342365
+vt 0.677186 0.342365
+vt 0.677136 0.338872
+vt 0.668932 0.342365
+vt 0.669111 0.338917
+vt 0.676941 0.336074
+vt 0.684753 0.335799
+vt 0.669586 0.336257
+vt 0.693192 0.335707
+vt 0.653189 0.338803
+vt 0.661157 0.338872
+vt 0.660677 0.342365
+vt 0.652423 0.342365
+vt 0.644167 0.342364
+vt 0.645120 0.338779
+vt 0.635911 0.342364
+vt 0.637000 0.338778
+vt 0.647872 0.335704
+vt 0.655397 0.335799
+vt 0.640145 0.335701
+vt 0.662520 0.336074
+vt 0.620758 0.338775
+vt 0.628880 0.338776
+vt 0.627655 0.342364
+vt 0.619398 0.342364
+vt 0.611140 0.342363
+vt 0.612635 0.338774
+vt 0.602882 0.342363
+vt 0.604512 0.338772
+vt 0.616958 0.335688
+vt 0.624688 0.335693
+vt 0.625509 0.333311
+vt 0.632462 0.333321
+vt 0.609226 0.335684
+vt 0.618555 0.333300
+vt 0.632417 0.335697
+vt 0.639414 0.333331
+vt 0.588261 0.338769
+vt 0.596387 0.338771
+vt 0.594623 0.342362
+vt 0.586363 0.342362
+vt 0.578102 0.342362
+vt 0.580134 0.338767
+vt 0.569840 0.342361
+vt 0.572005 0.338766
+vt 0.586023 0.335668
+vt 0.593759 0.335674
+vt 0.597681 0.333263
+vt 0.604641 0.333276
+vt 0.578285 0.335662
+vt 0.590720 0.333249
+vt 0.601493 0.335679
+vt 0.611599 0.333288
+vt 0.555743 0.338762
+vt 0.563875 0.338764
+vt 0.561577 0.342361
+vt 0.553313 0.342360
+vt 0.545049 0.342359
+vt 0.547609 0.338760
+vt 0.536783 0.342359
+vt 0.539472 0.338758
+vt 0.555054 0.335644
+vt 0.562802 0.335650
+vt 0.569806 0.333206
+vt 0.576787 0.333221
+vt 0.547298 0.335638
+vt 0.562809 0.333190
+vt 0.570546 0.335656
+vt 0.583757 0.333235
+vt 0.523092 0.338754
+vt 0.531331 0.338756
+vt 0.528515 0.342358
+vt 0.520247 0.342358
+vt 0.511978 0.342357
+vt 0.514657 0.338752
+vt 0.503707 0.342357
+vt 0.505933 0.338751
+vt 0.522446 0.335621
+vt 0.531376 0.335625
+vt 0.537878 0.333150
+vt 0.547801 0.333161
+vt 0.512360 0.335618
+vt 0.525068 0.333146
+vt 0.539532 0.335631
+vt 0.555793 0.333175
+vt 0.487520 0.338751
+vt 0.496823 0.338751
+vt 0.495435 0.342356
+vt 0.487162 0.342355
+vt 0.478888 0.342355
+vt 0.478216 0.338752
+vt 0.470613 0.342354
+vt 0.469104 0.338753
+vt 0.475953 0.335627
+vt 0.488343 0.335622
+vt 0.471281 0.333170
+vt 0.489845 0.333157
+vt 0.464333 0.335632
+vt 0.454649 0.333184
+vt 0.500736 0.335619
+vt 0.508415 0.333149
+vt 0.451936 0.338755
+vt 0.460376 0.338754
+vt 0.462337 0.342354
+vt 0.454059 0.342353
+vt 0.445781 0.342353
+vt 0.443687 0.338756
+vt 0.437501 0.342352
+vt 0.435533 0.338757
+vt 0.437179 0.335648
+vt 0.445332 0.335643
+vt 0.424031 0.333226
+vt 0.431988 0.333212
+vt 0.429410 0.335653
+vt 0.417036 0.333239
+vt 0.454255 0.335638
+vt 0.441873 0.333198
+vt 0.419222 0.338758
+vt 0.427378 0.338758
+vt 0.429220 0.342352
+vt 0.420939 0.342351
+vt 0.412656 0.342351
+vt 0.411064 0.338759
+vt 0.404373 0.342350
+vt 0.402904 0.338760
+vt 0.406093 0.335667
+vt 0.413867 0.335662
+vt 0.396041 0.333276
+vt 0.403041 0.333264
+vt 0.398318 0.335671
+vt 0.389039 0.333287
+vt 0.421639 0.335658
+vt 0.410039 0.333252
+vt 0.386582 0.338761
+vt 0.394744 0.338760
+vt 0.396088 0.342350
+vt 0.387803 0.342350
+vt 0.379517 0.342349
+vt 0.378420 0.338762
+vt 0.371231 0.342349
+vt 0.370256 0.338762
+vt 0.374982 0.335682
+vt 0.382762 0.335678
+vt 0.368025 0.333316
+vt 0.375031 0.333306
+vt 0.367202 0.335685
+vt 0.361017 0.333324
+vt 0.390541 0.335675
+vt 0.382036 0.333297
+vt 0.353977 0.338786
+vt 0.362092 0.338763
+vt 0.362944 0.342349
+vt 0.354656 0.342348
+vt 0.346368 0.342348
+vt 0.345962 0.338855
+vt 0.338079 0.342348
+vt 0.337961 0.338900
+vt 0.344657 0.336057
+vt 0.351838 0.335782
+vt 0.341324 0.334009
+vt 0.347333 0.333506
+vt 0.337535 0.336240
+vt 0.336850 0.334684
+vt 0.359420 0.335688
+vt 0.354009 0.333333
+vt 0.321700 0.338786
+vt 0.329888 0.338854
+vt 0.329791 0.342348
+vt 0.321501 0.342348
+vt 0.313212 0.342348
+vt 0.313352 0.338762
+vt 0.313752 0.335689
+vt 0.322259 0.335782
+vt 0.314540 0.333336
+vt 0.323576 0.333506
+vt 0.330128 0.336057
+vt 0.331459 0.334009
+vt 0.495328 0.330633
+vt 0.492238 0.331546
+vt 0.463388 0.331571
+vt 0.453095 0.330672
+vt 0.438403 0.331600
+vt 0.417242 0.330715
+vt 0.537587 0.330604
+vt 0.521104 0.331528
+vt 0.573518 0.330592
+vt 0.546137 0.331522
+vt 0.380556 0.330799
+vt 0.409646 0.331658
+vt 0.402017 0.331686
+vt 0.373354 0.330839
+vt 0.396316 0.331713
+vt 0.394124 0.330758
+vt 0.421132 0.331629
+vt 0.384908 0.331764
+vt 0.379202 0.331787
+vt 0.373495 0.331810
+vt 0.390613 0.331739
+vt 0.362077 0.331850
+vt 0.356365 0.331869
+vt 0.350653 0.331887
+vt 0.367786 0.331831
+vt 0.329345 0.331426
+vt 0.326049 0.332129
+vt 0.315845 0.331912
+vt 0.317537 0.331183
+vt 0.304929 0.331908
+vt 0.304930 0.331176
+vt 0.319486 0.330918
+vt 0.333128 0.331174
+vt 0.304930 0.330908
+vt 0.344940 0.331903
+vt 0.339556 0.332127
+vt 0.334832 0.332764
+vt 0.610493 0.330630
+vt 0.575067 0.331550
+vt 0.563487 0.331531
+vt 0.596768 0.330603
+vt 0.617848 0.330669
+vt 0.582786 0.331578
+vt 0.621991 0.330714
+vt 0.588557 0.331608
+vt 0.630118 0.330803
+vt 0.599993 0.331668
+vt 0.594289 0.331638
+vt 0.626076 0.330758
+vt 0.634131 0.330847
+vt 0.605677 0.331696
+vt 0.638129 0.330889
+vt 0.611351 0.331724
+vt 0.622691 0.331776
+vt 0.617022 0.331751
+vt 0.628359 0.331801
+vt 0.634025 0.331824
+vt 0.645353 0.331865
+vt 0.639690 0.331845
+vt 0.651016 0.331884
+vt 0.280515 0.331426
+vt 0.283809 0.332129
+vt 0.275025 0.332764
+vt 0.270302 0.332127
+vt 0.264918 0.331903
+vt 0.276732 0.331174
+vt 0.259205 0.331886
+vt 0.290374 0.330918
+vt 0.292323 0.331183
+vt 0.294014 0.331912
+vt 0.247781 0.331850
+vt 0.253492 0.331869
+vt 0.242071 0.331830
+vt 0.236363 0.331809
+vt 0.224950 0.331774
+vt 0.230655 0.331787
+vt 0.219246 0.331780
+vt 0.213544 0.331817
+vt 0.241339 0.331029
+vt 0.236517 0.330996
+vt 0.207844 0.331895
+vt 0.211174 0.331908
+vt 0.232561 0.331750
+vt 0.263834 0.331019
+vt 0.286885 0.331567
+vt 0.314301 0.330990
+vt 0.510862 0.330971
+vt 0.403039 0.330969
+vt 0.389023 0.331501
+vt 0.514823 0.331598
+vt 0.374507 0.332096
+vt 0.518749 0.332314
+vt 0.640131 0.331901
+vt 0.618586 0.331012
+vt 0.741566 0.332153
+vt 0.707220 0.331033
+vt 0.661976 0.332966
+vt 0.780448 0.330888
+vt 0.757773 0.330975
+vt 0.795746 0.332095
+vt 0.817267 0.331912
+vt 0.820727 0.331787
+vt 0.785451 0.330826
+vt 0.815138 0.331713
+vt 0.781591 0.330792
+vt 0.773722 0.330811
+vt 0.777677 0.330790
+vt 0.809515 0.331680
+vt 0.803867 0.331678
+vt 0.798203 0.331696
+vt 0.769740 0.330847
+vt 0.792531 0.331724
+vt 0.765746 0.330889
+vt 0.781192 0.331776
+vt 0.786861 0.331751
+vt 0.775525 0.331801
+vt 0.769859 0.331824
+vt 0.758530 0.331865
+vt 0.764194 0.331845
+vt 0.752868 0.331884
+vt 0.747207 0.331902
+vt 0.726094 0.331443
+vt 0.722841 0.332146
+vt 0.712739 0.331929
+vt 0.714408 0.331200
+vt 0.716336 0.330935
+vt 0.736217 0.332144
+vt 0.741546 0.331920
+vt 0.731549 0.332781
+vt 0.321852 0.988025
+vt 0.321652 0.984462
+vt 0.330013 0.984459
+vt 0.330110 0.987954
+vt 0.338370 0.984456
+vt 0.338249 0.987906
+vt 0.330350 0.990753
+vt 0.322414 0.991030
+vt 0.331689 0.992802
+vt 0.323739 0.993306
+vt 0.337818 0.990569
+vt 0.337125 0.992126
+vt 0.313832 0.991123
+vt 0.313429 0.988049
+vt 0.304927 0.991124
+vt 0.304925 0.988050
+vt 0.314625 0.993477
+vt 0.313288 0.984463
+vt 0.304923 0.984464
+vt 0.354381 0.988014
+vt 0.355066 0.984446
+vt 0.363403 0.984440
+vt 0.362544 0.988033
+vt 0.371732 0.984433
+vt 0.370750 0.988029
+vt 0.359851 0.991114
+vt 0.352224 0.991022
+vt 0.354397 0.993474
+vt 0.347682 0.993302
+vt 0.367672 0.991114
+vt 0.361441 0.993481
+vt 0.344994 0.990749
+vt 0.346311 0.987949
+vt 0.341632 0.992800
+vt 0.346721 0.984451
+vt 0.387132 0.988020
+vt 0.388361 0.984419
+vt 0.396661 0.984411
+vt 0.395308 0.988015
+vt 0.404950 0.984403
+vt 0.403472 0.988010
+vt 0.391077 0.991114
+vt 0.383286 0.991114
+vt 0.382519 0.993502
+vt 0.375502 0.993495
+vt 0.398859 0.991114
+vt 0.389526 0.993510
+vt 0.375484 0.991114
+vt 0.378946 0.988024
+vt 0.368476 0.993487
+vt 0.380052 0.984426
+vt 0.419769 0.988001
+vt 0.421495 0.984387
+vt 0.429752 0.984379
+vt 0.427901 0.987996
+vt 0.437999 0.984372
+vt 0.436023 0.987992
+vt 0.422137 0.991116
+vt 0.414388 0.991115
+vt 0.410487 0.993538
+vt 0.403510 0.993528
+vt 0.429876 0.991118
+vt 0.417455 0.993549
+vt 0.406629 0.991114
+vt 0.411626 0.988005
+vt 0.396523 0.993519
+vt 0.413228 0.984395
+vt 0.452334 0.987985
+vt 0.454464 0.984359
+vt 0.462685 0.984354
+vt 0.460718 0.987983
+vt 0.470899 0.984349
+vt 0.469384 0.987981
+vt 0.454580 0.991125
+vt 0.445711 0.991122
+vt 0.442164 0.993585
+vt 0.432329 0.993573
+vt 0.464599 0.991129
+vt 0.454886 0.993598
+vt 0.437605 0.991120
+vt 0.444135 0.987989
+vt 0.424414 0.993561
+vt 0.446236 0.984365
+vt 0.487663 0.987978
+vt 0.487309 0.984342
+vt 0.495508 0.984340
+vt 0.496893 0.987977
+vt 0.503705 0.984339
+vt 0.505929 0.987977
+vt 0.500799 0.991138
+vt 0.488477 0.991136
+vt 0.508467 0.993632
+vt 0.489961 0.993623
+vt 0.512353 0.991139
+vt 0.525056 0.993634
+vt 0.476154 0.991132
+vt 0.478430 0.987979
+vt 0.471460 0.993612
+vt 0.479106 0.984345
+vt 0.522941 0.987976
+vt 0.520096 0.984340
+vt 0.528293 0.984341
+vt 0.531111 0.987976
+vt 0.536493 0.984344
+vt 0.539186 0.987976
+vt 0.539321 0.991128
+vt 0.531231 0.991133
+vt 0.555600 0.993607
+vt 0.547666 0.993620
+vt 0.547024 0.991123
+vt 0.562562 0.993592
+vt 0.522369 0.991137
+vt 0.514580 0.987976
+vt 0.537803 0.993630
+vt 0.511900 0.984339
+vt 0.555341 0.987979
+vt 0.552905 0.984352
+vt 0.561119 0.984358
+vt 0.563424 0.987981
+vt 0.569340 0.984363
+vt 0.571513 0.987984
+vt 0.570115 0.991112
+vt 0.562418 0.991115
+vt 0.583369 0.993552
+vt 0.576441 0.993565
+vt 0.577816 0.991109
+vt 0.590297 0.993539
+vt 0.554722 0.991119
+vt 0.547262 0.987977
+vt 0.569507 0.993578
+vt 0.544697 0.984348
+vt 0.587713 0.987990
+vt 0.585806 0.984376
+vt 0.594051 0.984383
+vt 0.595824 0.987994
+vt 0.602305 0.984390
+vt 0.603944 0.987998
+vt 0.600957 0.991103
+vt 0.593236 0.991104
+vt 0.611116 0.993506
+vt 0.604170 0.993517
+vt 0.608685 0.991101
+vt 0.618068 0.993497
+vt 0.585523 0.991106
+vt 0.579609 0.987987
+vt 0.597231 0.993528
+vt 0.577569 0.984370
+vt 0.620210 0.988006
+vt 0.618841 0.984405
+vt 0.627122 0.984412
+vt 0.628355 0.988010
+vt 0.635411 0.984418
+vt 0.636508 0.988014
+vt 0.631918 0.991099
+vt 0.624166 0.991099
+vt 0.638965 0.993472
+vt 0.631992 0.993480
+vt 0.639677 0.991098
+vt 0.645943 0.993465
+vt 0.616422 0.991100
+vt 0.612072 0.988002
+vt 0.625027 0.993488
+vt 0.610568 0.984398
+vt 0.652787 0.987997
+vt 0.652014 0.984430
+vt 0.660326 0.984435
+vt 0.660810 0.987932
+vt 0.668643 0.984439
+vt 0.668824 0.987889
+vt 0.662185 0.990733
+vt 0.655014 0.991006
+vt 0.665570 0.992783
+vt 0.659583 0.993286
+vt 0.669305 0.990551
+vt 0.670024 0.992109
+vt 0.647443 0.991098
+vt 0.644670 0.988017
+vt 0.652928 0.993458
+vt 0.643709 0.984424
+vt 0.685125 0.988008
+vt 0.685290 0.984444
+vt 0.693619 0.984446
+vt 0.693495 0.988032
+vt 0.701948 0.984446
+vt 0.701946 0.988032
+vt 0.693113 0.991106
+vt 0.684600 0.991012
+vt 0.692342 0.993459
+vt 0.683313 0.993288
+vt 0.701944 0.991107
+vt 0.701942 0.993461
+vt 0.676720 0.990736
+vt 0.676915 0.987937
+vt 0.675427 0.992785
+vt 0.676965 0.984442
+vt 0.718767 0.988008
+vt 0.718605 0.984444
+vt 0.726931 0.984442
+vt 0.726977 0.987937
+vt 0.735253 0.984439
+vt 0.735069 0.987889
+vt 0.727168 0.990736
+vt 0.719288 0.991012
+vt 0.728459 0.992785
+vt 0.720572 0.993288
+vt 0.734584 0.990551
+vt 0.733863 0.992109
+vt 0.710774 0.991106
+vt 0.710396 0.988032
+vt 0.711542 0.993459
+vt 0.710277 0.984446
+vt 0.751105 0.987997
+vt 0.751882 0.984430
+vt 0.760188 0.984424
+vt 0.759223 0.988017
+vt 0.768486 0.984418
+vt 0.767385 0.988014
+vt 0.756446 0.991098
+vt 0.748875 0.991006
+vt 0.750958 0.993458
+vt 0.744303 0.993286
+vt 0.764213 0.991098
+vt 0.757943 0.993465
+vt 0.741704 0.990733
+vt 0.743083 0.987932
+vt 0.738316 0.992783
+vt 0.743570 0.984434
+vt 0.783685 0.988006
+vt 0.785057 0.984405
+vt 0.793330 0.984398
+vt 0.791823 0.988002
+vt 0.801593 0.984391
+vt 0.799952 0.987998
+vt 0.787470 0.991100
+vt 0.779725 0.991100
+vt 0.778861 0.993488
+vt 0.771895 0.993480
+vt 0.795206 0.991101
+vt 0.785820 0.993497
+vt 0.771973 0.991099
+vt 0.775539 0.988010
+vt 0.764922 0.993472
+vt 0.776776 0.984412
+vt 0.816184 0.987990
+vt 0.818093 0.984377
+vt 0.826330 0.984370
+vt 0.824288 0.987987
+vt 0.834560 0.984363
+vt 0.832384 0.987984
+vt 0.818371 0.991106
+vt 0.810657 0.991104
+vt 0.806658 0.993528
+vt 0.799718 0.993517
+vt 0.826078 0.991109
+vt 0.813591 0.993539
+vt 0.802935 0.991103
+vt 0.808072 0.987994
+vt 0.792773 0.993507
+vt 0.809848 0.984383
+vt 0.848557 0.987979
+vt 0.850996 0.984353
+vt 0.859205 0.984348
+vt 0.856634 0.987977
+vt 0.867409 0.984344
+vt 0.864705 0.987976
+vt 0.849158 0.991119
+vt 0.841473 0.991115
+vt 0.834344 0.993578
+vt 0.827438 0.993565
+vt 0.856834 0.991124
+vt 0.841232 0.993592
+vt 0.833779 0.991112
+vt 0.840474 0.987981
+vt 0.820519 0.993552
+vt 0.842781 0.984358
+vt 0.881162 0.987981
+vt 0.883807 0.984340
+vt 0.892002 0.984338
+vt 0.890210 0.987998
+vt 0.900197 0.984336
+vt 0.899586 0.988020
+vt 0.885083 0.991226
+vt 0.873476 0.991156
+vt 0.869984 0.993796
+vt 0.857000 0.993662
+vt 0.898006 0.991318
+vt 0.894993 0.994084
+vt 0.864500 0.991129
+vt 0.872771 0.987976
+vt 0.848100 0.993607
+vt 0.875609 0.984342
+vt 0.122656 0.988196
+vt 0.122529 0.984342
+vt 0.130733 0.984345
+vt 0.131644 0.988205
+vt 0.138941 0.984349
+vt 0.140670 0.988185
+vt 0.134623 0.992035
+vt 0.123286 0.992006
+vt 0.138636 0.995850
+vt 0.124167 0.995795
+vt 0.146098 0.991944
+vt 0.159370 0.995959
+vt 0.114039 0.991996
+vt 0.114194 0.988191
+vt 0.105838 0.991994
+vt 0.105994 0.988189
+vt 0.113875 0.995776
+vt 0.105672 0.995775
+vt 0.114329 0.984339
+vt 0.106130 0.984336
+vt 0.157539 0.988015
+vt 0.155376 0.984359
+vt 0.163605 0.984366
+vt 0.165708 0.987989
+vt 0.171843 0.984372
+vt 0.173821 0.987993
+vt 0.172242 0.991120
+vt 0.164260 0.991241
+vt 0.185439 0.993561
+vt 0.178096 0.993750
+vt 0.179972 0.991118
+vt 0.192398 0.993550
+vt 0.155761 0.991598
+vt 0.149247 0.988101
+vt 0.169974 0.994294
+vt 0.147155 0.984354
+vt 0.190076 0.988001
+vt 0.188347 0.984387
+vt 0.196615 0.984395
+vt 0.198219 0.988006
+vt 0.204893 0.984403
+vt 0.206373 0.988011
+vt 0.203220 0.991115
+vt 0.195460 0.991116
+vt 0.213330 0.993519
+vt 0.206343 0.993529
+vt 0.210991 0.991114
+vt 0.220327 0.993510
+vt 0.187711 0.991117
+vt 0.181943 0.987997
+vt 0.199366 0.993539
+vt 0.180090 0.984380
+vt 0.222715 0.988020
+vt 0.221482 0.984419
+vt 0.229792 0.984426
+vt 0.230901 0.988025
+vt 0.238112 0.984434
+vt 0.239098 0.988029
+vt 0.234367 0.991114
+vt 0.226565 0.991114
+vt 0.241378 0.993488
+vt 0.234352 0.993495
+vt 0.242179 0.991114
+vt 0.218772 0.991114
+vt 0.214539 0.988015
+vt 0.227335 0.993502
+vt 0.213182 0.984411
+vt 0.255468 0.988014
+vt 0.254779 0.984446
+vt 0.263124 0.984451
+vt 0.263538 0.987949
+vt 0.271476 0.984456
+vt 0.271600 0.987906
+vt 0.264858 0.990750
+vt 0.257629 0.991023
+vt 0.272035 0.990569
+vt 0.250001 0.991114
+vt 0.247304 0.988033
+vt 0.246441 0.984440
+vt 0.287998 0.988025
+vt 0.288194 0.984462
+vt 0.296558 0.984463
+vt 0.296421 0.988049
+vt 0.296022 0.991123
+vt 0.287440 0.991030
+vt 0.279503 0.990753
+vt 0.279739 0.987954
+vt 0.279833 0.984459
+vt 0.827984 0.995300
+vt 0.838272 0.995484
+vt 0.847770 0.995974
+vt 0.820875 0.995219
+vt 0.815336 0.995189
+vt 0.804149 0.995130
+vt 0.809758 0.995159
+vt 0.798519 0.995103
+vt 0.792876 0.995076
+vt 0.781576 0.995026
+vt 0.787228 0.995050
+vt 0.775918 0.995003
+vt 0.770256 0.994981
+vt 0.758914 0.994942
+vt 0.764587 0.994961
+vt 0.753234 0.994924
+vt 0.747550 0.994907
+vt 0.726293 0.995370
+vt 0.736500 0.994667
+vt 0.741861 0.994890
+vt 0.730057 0.995621
+vt 0.716450 0.995878
+vt 0.714511 0.995613
+vt 0.701940 0.995888
+vt 0.701941 0.995620
+vt 0.712831 0.994884
+vt 0.723019 0.994666
+vt 0.701941 0.994888
+vt 0.731801 0.994030
+vt 0.854921 0.998172
+vt 0.883744 0.997755
+vt 0.876458 0.998998
+vt 0.857415 0.999260
+vt 0.868698 1.000073
+vt 0.859953 1.000294
+vt 0.852513 0.996973
+vt 0.890080 0.996173
+vt 0.201607 0.995259
+vt 0.207532 0.995114
+vt 0.213203 0.995088
+vt 0.195162 0.995640
+vt 0.188458 0.996140
+vt 0.224568 0.995039
+vt 0.230262 0.995016
+vt 0.235965 0.994995
+vt 0.218881 0.995063
+vt 0.247397 0.994957
+vt 0.253124 0.994939
+vt 0.241677 0.994975
+vt 0.329546 0.995387
+vt 0.333351 0.995638
+vt 0.319602 0.995895
+vt 0.317641 0.995630
+vt 0.315938 0.994901
+vt 0.326229 0.994684
+vt 0.335086 0.994048
+vt 0.339841 0.994684
+vt 0.345257 0.994907
+vt 0.350998 0.994923
+vt 0.362461 0.994957
+vt 0.356733 0.994939
+vt 0.368180 0.994975
+vt 0.373892 0.994995
+vt 0.385290 0.995039
+vt 0.379595 0.995016
+vt 0.390977 0.995062
+vt 0.396657 0.995087
+vt 0.409923 0.995140
+vt 0.402329 0.995113
+vt 0.421368 0.995168
+vt 0.438594 0.995196
+vt 0.492326 0.995250
+vt 0.463529 0.995225
+vt 0.521138 0.995267
+vt 0.546119 0.995274
+vt 0.574951 0.995245
+vt 0.563419 0.995265
+vt 0.582625 0.995219
+vt 0.588353 0.995188
+vt 0.599711 0.995130
+vt 0.594045 0.995159
+vt 0.605362 0.995103
+vt 0.611006 0.995076
+vt 0.622308 0.995026
+vt 0.616655 0.995050
+vt 0.627966 0.995003
+vt 0.633629 0.994981
+vt 0.644971 0.994941
+vt 0.639297 0.994961
+vt 0.650650 0.994924
+vt 0.656334 0.994906
+vt 0.677589 0.995369
+vt 0.680864 0.994666
+vt 0.691051 0.994884
+vt 0.689371 0.995613
+vt 0.687431 0.995878
+vt 0.673824 0.995621
+vt 0.662023 0.994890
+vt 0.667384 0.994667
+vt 0.672083 0.994030
+vt 0.153329 0.164055
+vt 0.058522 0.200337
+vt 0.049819 0.195458
+vt 0.039991 0.188466
+vt 0.039991 0.188310
+vt 0.041367 0.189819
+vt 0.039428 0.187330
+vt 0.039428 0.187175
+vt 0.044372 0.192077
+vt 0.848874 0.175468
+vt 0.849001 0.175468
+vt 0.847764 0.170336
+vt 0.846831 0.164055
+vt 0.847200 0.166665
+vt 0.961268 0.188466
+vt 0.961830 0.187330
+vt 0.961268 0.188310
+vt 0.961830 0.187175
+vt 0.272462 0.995664
+vt 0.674046 0.331191
+vt 0.670059 0.331164
+vt 0.685488 0.330900
+vt 0.498919 0.330261
+vt 0.392817 0.330363
+vt 0.441226 0.330310
+vt 0.366776 0.330376
+vt 0.428605 0.330327
+vt 0.556648 0.330223
+vt 0.605162 0.330203
+vt 0.502818 0.330276
+vt 0.577071 0.330231
+vt 0.369335 0.330879
+vt 0.346966 0.330455
+vt 0.338181 0.330543
+vt 0.340257 0.330499
+vt 0.304938 0.330510
+vt 0.362941 0.330410
+vt 0.311126 0.330446
+vt 0.329677 0.330414
+vt 0.361295 0.330956
+vt 0.357274 0.330993
+vt 0.353252 0.331028
+vt 0.329876 0.330728
+vt 0.331952 0.330683
+vt 0.304932 0.330699
+vt 0.304933 0.330650
+vt 0.334029 0.330636
+vt 0.336105 0.330589
+vt 0.365316 0.330918
+vt 0.345205 0.331091
+vt 0.341180 0.331120
+vt 0.337154 0.331148
+vt 0.321565 0.330884
+vt 0.323643 0.330848
+vt 0.304931 0.330831
+vt 0.325721 0.330810
+vt 0.327799 0.330771
+vt 0.349229 0.331060
+vt 0.651398 0.330236
+vt 0.635213 0.330210
+vt 0.639018 0.330200
+vt 0.676314 0.330193
+vt 0.658315 0.330278
+vt 0.660563 0.330328
+vt 0.695101 0.330204
+vt 0.701524 0.330232
+vt 0.664858 0.330436
+vt 0.662738 0.330381
+vt 0.701724 0.330272
+vt 0.701846 0.330322
+vt 0.666941 0.330492
+vt 0.669006 0.330547
+vt 0.701908 0.330379
+vt 0.646119 0.330970
+vt 0.642124 0.330931
+vt 0.673131 0.330650
+vt 0.671069 0.330600
+vt 0.701933 0.330499
+vt 0.701935 0.330557
+vt 0.675192 0.330699
+vt 0.650111 0.331007
+vt 0.677253 0.330744
+vt 0.654103 0.331043
+vt 0.701938 0.330665
+vt 0.662083 0.331107
+vt 0.658093 0.331076
+vt 0.681371 0.330827
+vt 0.679312 0.330787
+vt 0.701939 0.330762
+vt 0.683430 0.330865
+vt 0.666071 0.331136
+vt 0.264655 0.331091
+vt 0.260632 0.331060
+vt 0.282064 0.330770
+vt 0.284141 0.330810
+vt 0.268680 0.331120
+vt 0.286218 0.330848
+vt 0.288296 0.330884
+vt 0.272706 0.331148
+vt 0.248568 0.330964
+vt 0.244549 0.330949
+vt 0.273765 0.330606
+vt 0.275838 0.330640
+vt 0.252588 0.330993
+vt 0.277913 0.330683
+vt 0.279988 0.330728
+vt 0.256609 0.331027
+vt 0.296424 0.330595
+vt 0.275287 0.330589
+vt 0.269621 0.330583
+vt 0.271692 0.330585
+vt 0.240532 0.330957
+vt 0.597642 0.330475
+vt 0.506830 0.330521
+vt 0.416054 0.330562
+vt 0.340768 0.330589
+vt 0.744810 0.330361
+vt 0.738922 0.330370
+vt 0.717565 0.330394
+vt 0.673038 0.330430
+vt 0.736924 0.330492
+vt 0.738966 0.330440
+vt 0.740973 0.330398
+vt 0.742927 0.330370
+vt 0.753768 0.331007
+vt 0.728684 0.330699
+vt 0.730744 0.330650
+vt 0.749777 0.331043
+vt 0.732804 0.330600
+vt 0.761752 0.330930
+vt 0.734863 0.330547
+vt 0.737810 0.331136
+vt 0.720450 0.330864
+vt 0.722508 0.330827
+vt 0.733823 0.331164
+vt 0.741799 0.331107
+vt 0.724567 0.330787
+vt 0.745788 0.331076
+vt 0.726625 0.330744
+vt 0.729836 0.331191
+vt 0.718393 0.330900
+vt 0.789562 0.996251
+vt 0.794009 0.996484
+vt 0.800865 0.996925
+vt 0.741258 0.996992
+vt 0.744866 0.996693
+vt 0.687244 0.997089
+vt 0.697819 0.996778
+vt 0.744854 0.996552
+vt 0.785551 0.996141
+vt 0.742994 0.996492
+vt 0.701510 0.996630
+vt 0.701718 0.996564
+vt 0.781728 0.996094
+vt 0.773921 0.996003
+vt 0.777847 0.996048
+vt 0.741060 0.996432
+vt 0.739069 0.996374
+vt 0.701844 0.996498
+vt 0.701908 0.996434
+vt 0.737039 0.996318
+vt 0.769964 0.995960
+vt 0.734989 0.996263
+vt 0.701934 0.996312
+vt 0.765989 0.995917
+vt 0.758030 0.995838
+vt 0.762012 0.995877
+vt 0.732938 0.996211
+vt 0.730884 0.996160
+vt 0.701937 0.996199
+vt 0.728828 0.996112
+vt 0.754046 0.995801
+vt 0.726770 0.996067
+vt 0.701938 0.996146
+vt 0.750057 0.995767
+vt 0.742068 0.995704
+vt 0.746065 0.995734
+vt 0.724710 0.996025
+vt 0.722648 0.995985
+vt 0.701939 0.996050
+vt 0.720583 0.995948
+vt 0.738068 0.995675
+vt 0.734064 0.995647
+vt 0.718517 0.995912
+vt 0.825387 0.998560
+vt 0.838372 0.999523
+vt 0.851209 1.000515
+vt 0.819330 0.999785
+vt 0.794434 0.998888
+vt 0.800287 1.000047
+vt 0.762771 0.999188
+vt 0.766017 0.998102
+vt 0.812105 0.997655
+vt 0.744739 0.997458
+vt 0.717089 0.998430
+vt 0.659160 0.997825
+vt 0.232688 0.996048
+vt 0.236297 0.995972
+vt 0.240291 0.995931
+vt 0.269507 0.996332
+vt 0.269235 0.996400
+vt 0.304940 0.996387
+vt 0.308008 0.996466
+vt 0.272538 0.996493
+vt 0.229844 0.996189
+vt 0.277627 0.996598
+vt 0.317205 0.996583
+vt 0.340673 0.996814
+vt 0.227383 0.996363
+vt 0.248298 0.995852
+vt 0.252311 0.995816
+vt 0.256329 0.995782
+vt 0.277770 0.996128
+vt 0.275699 0.996175
+vt 0.304933 0.996162
+vt 0.273632 0.996225
+vt 0.244292 0.995891
+vt 0.271568 0.996278
+vt 0.304935 0.996269
+vt 0.264385 0.995719
+vt 0.268421 0.995691
+vt 0.286084 0.995964
+vt 0.284001 0.996002
+vt 0.304931 0.995982
+vt 0.281921 0.996041
+vt 0.260354 0.995750
+vt 0.279844 0.996083
+vt 0.304932 0.996066
+vt 0.345475 0.995719
+vt 0.349506 0.995749
+vt 0.325861 0.996002
+vt 0.353531 0.995781
+vt 0.330020 0.996083
+vt 0.327942 0.996041
+vt 0.323777 0.995964
+vt 0.341439 0.995691
+vt 0.321691 0.995929
+vt 0.337397 0.995664
+vt 0.361564 0.995852
+vt 0.365572 0.995890
+vt 0.334167 0.996175
+vt 0.369575 0.995931
+vt 0.338304 0.996277
+vt 0.336237 0.996225
+vt 0.332095 0.996128
+vt 0.357551 0.995816
+vt 0.380424 0.996018
+vt 0.392985 0.996071
+vt 0.345761 0.996400
+vt 0.415414 0.996127
+vt 0.385043 0.996596
+vt 0.357809 0.996493
+vt 0.340369 0.996332
+vt 0.373573 0.995972
+vt 0.495284 0.996236
+vt 0.538591 0.996291
+vt 0.498547 0.996805
+vt 0.574999 0.996313
+vt 0.611157 0.997008
+vt 0.560605 0.996949
+vt 0.584900 0.997424
+vt 0.435991 0.996693
+vt 0.451869 0.996182
+vt 0.501963 0.997164
+vt 0.418002 0.996982
+vt 0.610654 0.996196
+vt 0.617729 0.996141
+vt 0.652346 0.996660
+vt 0.621844 0.996094
+vt 0.660484 0.996492
+vt 0.658247 0.996552
+vt 0.639194 0.996862
+vt 0.597716 0.996267
+vt 0.629919 0.996003
+vt 0.633909 0.995960
+vt 0.664755 0.996374
+vt 0.637886 0.995917
+vt 0.668881 0.996263
+vt 0.666827 0.996318
+vt 0.662647 0.996432
+vt 0.625903 0.996048
+vt 0.645849 0.995838
+vt 0.649834 0.995801
+vt 0.672992 0.996160
+vt 0.653824 0.995767
+vt 0.677108 0.996067
+vt 0.675049 0.996112
+vt 0.670936 0.996210
+vt 0.641866 0.995877
+vt 0.661813 0.995703
+vt 0.665813 0.995675
+vt 0.681232 0.995985
+vt 0.679169 0.996025
+vt 0.657817 0.995734
+vt 0.685363 0.995912
+vt 0.669817 0.995647
+vt 0.020874 0.062500
+vt 0.010579 0.062609
+vt 0.011068 0.052517
+vt 0.020996 0.052083
+vt 0.012044 0.042752
+vt 0.021077 0.042318
+vt 0.000326 0.062500
+vt 0.001302 0.052083
+vt 0.003255 0.041667
+vt 0.031250 0.049913
+vt 0.031250 0.061957
+vt 0.041667 0.048394
+vt 0.041667 0.061578
+vt 0.030599 0.038845
+vt 0.041667 0.028646
+vt 0.031250 0.072917
+vt 0.020833 0.072917
+vt 0.031250 0.083333
+vt 0.020833 0.083333
+vt 0.041667 0.072917
+vt 0.041667 0.083333
+vt 0.010417 0.072917
+vt 0.000000 0.072917
+vt 0.010417 0.083333
+vt 0.000000 0.083333
+vt 0.062500 0.062337
+vt 0.052083 0.061957
+vt 0.052083 0.049913
+vt 0.062500 0.051432
+vt 0.052734 0.038845
+vt 0.062500 0.041341
+vt 0.072917 0.049913
+vt 0.072917 0.061957
+vt 0.083333 0.048394
+vt 0.083333 0.061578
+vt 0.072266 0.038845
+vt 0.083333 0.028646
+vt 0.072917 0.072917
+vt 0.062500 0.072917
+vt 0.072917 0.083333
+vt 0.062500 0.083333
+vt 0.083333 0.072917
+vt 0.083333 0.083333
+vt 0.052083 0.072917
+vt 0.052083 0.083333
+vt 0.104167 0.062337
+vt 0.093750 0.061957
+vt 0.093750 0.049913
+vt 0.104167 0.051432
+vt 0.094401 0.038845
+vt 0.104167 0.041341
+vt 0.114583 0.049913
+vt 0.114583 0.061957
+vt 0.125000 0.048394
+vt 0.125000 0.061578
+vt 0.113932 0.038845
+vt 0.125000 0.028646
+vt 0.114583 0.072917
+vt 0.104167 0.072917
+vt 0.114583 0.083333
+vt 0.104167 0.083333
+vt 0.125000 0.072917
+vt 0.125000 0.083333
+vt 0.093750 0.072917
+vt 0.093750 0.083333
+vt 0.145833 0.062337
+vt 0.135417 0.061957
+vt 0.135417 0.049913
+vt 0.145833 0.051432
+vt 0.136068 0.038845
+vt 0.145833 0.041341
+vt 0.156250 0.049913
+vt 0.156250 0.061957
+vt 0.166667 0.048394
+vt 0.166667 0.061578
+vt 0.155599 0.038845
+vt 0.166667 0.028646
+vt 0.156250 0.072917
+vt 0.145833 0.072917
+vt 0.156250 0.083333
+vt 0.145833 0.083333
+vt 0.166667 0.072917
+vt 0.166667 0.083333
+vt 0.135417 0.072917
+vt 0.135417 0.083333
+vt 0.187500 0.062337
+vt 0.177083 0.061957
+vt 0.177083 0.049913
+vt 0.187500 0.051432
+vt 0.177734 0.038845
+vt 0.187500 0.041341
+vt 0.197917 0.049913
+vt 0.197917 0.061957
+vt 0.208333 0.048394
+vt 0.208333 0.061578
+vt 0.197266 0.038845
+vt 0.208333 0.028646
+vt 0.197917 0.072917
+vt 0.187500 0.072917
+vt 0.197917 0.083333
+vt 0.187500 0.083333
+vt 0.208333 0.072917
+vt 0.208333 0.083333
+vt 0.177083 0.072917
+vt 0.177083 0.083333
+vt 0.229167 0.062337
+vt 0.218750 0.061957
+vt 0.218750 0.049913
+vt 0.229167 0.051432
+vt 0.219401 0.038845
+vt 0.229167 0.041341
+vt 0.239583 0.049913
+vt 0.239583 0.061957
+vt 0.250000 0.048394
+vt 0.250000 0.061578
+vt 0.238932 0.038845
+vt 0.250000 0.028646
+vt 0.239583 0.072917
+vt 0.229167 0.072917
+vt 0.239583 0.083333
+vt 0.229167 0.083333
+vt 0.250000 0.072917
+vt 0.250000 0.083333
+vt 0.218750 0.072917
+vt 0.218750 0.083333
+vt 0.270833 0.062337
+vt 0.260417 0.061957
+vt 0.260417 0.049913
+vt 0.270833 0.051432
+vt 0.261068 0.038845
+vt 0.270833 0.041341
+vt 0.281250 0.049913
+vt 0.281250 0.061957
+vt 0.291667 0.048394
+vt 0.291667 0.061578
+vt 0.280599 0.038845
+vt 0.291667 0.028646
+vt 0.281250 0.072917
+vt 0.270833 0.072917
+vt 0.281250 0.083333
+vt 0.270833 0.083333
+vt 0.291667 0.072917
+vt 0.291667 0.083333
+vt 0.260417 0.072917
+vt 0.260417 0.083333
+vt 0.312500 0.062337
+vt 0.302083 0.061957
+vt 0.302083 0.049913
+vt 0.312500 0.051432
+vt 0.302734 0.038845
+vt 0.312500 0.041341
+vt 0.322917 0.049913
+vt 0.322917 0.061957
+vt 0.333333 0.048394
+vt 0.333333 0.061578
+vt 0.322266 0.038845
+vt 0.333333 0.028646
+vt 0.322917 0.072917
+vt 0.312500 0.072917
+vt 0.322917 0.083333
+vt 0.312500 0.083333
+vt 0.333333 0.072917
+vt 0.333333 0.083333
+vt 0.302083 0.072917
+vt 0.302083 0.083333
+vt 0.354167 0.062337
+vt 0.343750 0.061957
+vt 0.343750 0.049913
+vt 0.354167 0.051432
+vt 0.344401 0.038845
+vt 0.354167 0.041341
+vt 0.364583 0.049913
+vt 0.364583 0.061957
+vt 0.375000 0.048394
+vt 0.375000 0.061578
+vt 0.363932 0.038845
+vt 0.375000 0.028646
+vt 0.364583 0.072917
+vt 0.354167 0.072917
+vt 0.364583 0.083333
+vt 0.354167 0.083333
+vt 0.375000 0.072917
+vt 0.375000 0.083333
+vt 0.343750 0.072917
+vt 0.343750 0.083333
+vt 0.395833 0.062337
+vt 0.385417 0.061957
+vt 0.385417 0.049913
+vt 0.395833 0.051432
+vt 0.386068 0.038845
+vt 0.395833 0.041341
+vt 0.406250 0.049913
+vt 0.406250 0.061957
+vt 0.416667 0.048394
+vt 0.416667 0.061578
+vt 0.405599 0.038845
+vt 0.416667 0.028646
+vt 0.406250 0.072917
+vt 0.395833 0.072917
+vt 0.406250 0.083333
+vt 0.395833 0.083333
+vt 0.416667 0.072917
+vt 0.416667 0.083333
+vt 0.385417 0.072917
+vt 0.385417 0.083333
+vt 0.437500 0.062337
+vt 0.427083 0.061957
+vt 0.427083 0.049913
+vt 0.437500 0.051432
+vt 0.427734 0.038845
+vt 0.437500 0.041341
+vt 0.447917 0.049913
+vt 0.447917 0.061957
+vt 0.458333 0.048394
+vt 0.458333 0.061578
+vt 0.447266 0.038845
+vt 0.458333 0.028646
+vt 0.447917 0.072917
+vt 0.437500 0.072917
+vt 0.447917 0.083333
+vt 0.437500 0.083333
+vt 0.458333 0.072917
+vt 0.458333 0.083333
+vt 0.427083 0.072917
+vt 0.427083 0.083333
+vt 0.479167 0.062337
+vt 0.468750 0.061957
+vt 0.468750 0.049913
+vt 0.479167 0.051432
+vt 0.469401 0.038845
+vt 0.479167 0.041341
+vt 0.489583 0.049913
+vt 0.489583 0.061957
+vt 0.500000 0.048394
+vt 0.500000 0.061578
+vt 0.488932 0.038845
+vt 0.500000 0.028646
+vt 0.489583 0.072917
+vt 0.479167 0.072917
+vt 0.489583 0.083333
+vt 0.479167 0.083333
+vt 0.500000 0.072917
+vt 0.500000 0.083333
+vt 0.468750 0.072917
+vt 0.468750 0.083333
+vt 0.520833 0.062337
+vt 0.510417 0.061957
+vt 0.510417 0.049913
+vt 0.520833 0.051432
+vt 0.511068 0.038845
+vt 0.520833 0.041341
+vt 0.531250 0.049913
+vt 0.531250 0.061957
+vt 0.541667 0.048394
+vt 0.541667 0.061578
+vt 0.530599 0.038845
+vt 0.541667 0.028646
+vt 0.531250 0.072917
+vt 0.520833 0.072917
+vt 0.531250 0.083333
+vt 0.520833 0.083333
+vt 0.541667 0.072917
+vt 0.541667 0.083333
+vt 0.510417 0.072917
+vt 0.510417 0.083333
+vt 0.562500 0.062337
+vt 0.552083 0.061957
+vt 0.552083 0.049913
+vt 0.562500 0.051432
+vt 0.552734 0.038845
+vt 0.562500 0.041341
+vt 0.572917 0.049913
+vt 0.572917 0.061957
+vt 0.583333 0.048394
+vt 0.583333 0.061578
+vt 0.572266 0.038845
+vt 0.583333 0.028646
+vt 0.572917 0.072917
+vt 0.562500 0.072917
+vt 0.572917 0.083333
+vt 0.562500 0.083333
+vt 0.583333 0.072917
+vt 0.583333 0.083333
+vt 0.552083 0.072917
+vt 0.552083 0.083333
+vt 0.604167 0.062337
+vt 0.593750 0.061957
+vt 0.593750 0.049913
+vt 0.604167 0.051432
+vt 0.594401 0.038845
+vt 0.604167 0.041341
+vt 0.614583 0.049913
+vt 0.614583 0.061957
+vt 0.625000 0.048394
+vt 0.625000 0.061578
+vt 0.613932 0.038845
+vt 0.625000 0.028646
+vt 0.614583 0.072917
+vt 0.604167 0.072917
+vt 0.614583 0.083333
+vt 0.604167 0.083333
+vt 0.625000 0.072917
+vt 0.625000 0.083333
+vt 0.593750 0.072917
+vt 0.593750 0.083333
+vt 0.645833 0.062337
+vt 0.635417 0.061957
+vt 0.635417 0.049913
+vt 0.645833 0.051432
+vt 0.636068 0.038845
+vt 0.645833 0.041341
+vt 0.656250 0.049913
+vt 0.656250 0.061957
+vt 0.666667 0.048394
+vt 0.666667 0.061578
+vt 0.655599 0.038845
+vt 0.666667 0.028646
+vt 0.656250 0.072917
+vt 0.645833 0.072917
+vt 0.656250 0.083333
+vt 0.645833 0.083333
+vt 0.666667 0.072917
+vt 0.666667 0.083333
+vt 0.635417 0.072917
+vt 0.635417 0.083333
+vt 0.687500 0.062337
+vt 0.677083 0.061957
+vt 0.677083 0.049913
+vt 0.687500 0.051432
+vt 0.677734 0.038845
+vt 0.687500 0.041341
+vt 0.697917 0.049913
+vt 0.697917 0.061957
+vt 0.708333 0.048394
+vt 0.708333 0.061578
+vt 0.697266 0.038845
+vt 0.708333 0.028646
+vt 0.697917 0.072917
+vt 0.687500 0.072917
+vt 0.697917 0.083333
+vt 0.687500 0.083333
+vt 0.708333 0.072917
+vt 0.708333 0.083333
+vt 0.677083 0.072917
+vt 0.677083 0.083333
+vt 0.729167 0.062337
+vt 0.718750 0.061957
+vt 0.718750 0.049913
+vt 0.729167 0.051432
+vt 0.719401 0.038845
+vt 0.729167 0.041341
+vt 0.739583 0.049913
+vt 0.739583 0.061957
+vt 0.750000 0.048394
+vt 0.750000 0.061578
+vt 0.738932 0.038845
+vt 0.750000 0.028646
+vt 0.739583 0.072917
+vt 0.729167 0.072917
+vt 0.739583 0.083333
+vt 0.729167 0.083333
+vt 0.750000 0.072917
+vt 0.750000 0.083333
+vt 0.718750 0.072917
+vt 0.718750 0.083333
+vt 0.770833 0.062337
+vt 0.760417 0.061957
+vt 0.760417 0.049913
+vt 0.770833 0.051432
+vt 0.761068 0.038845
+vt 0.770833 0.041341
+vt 0.781250 0.049913
+vt 0.781250 0.061957
+vt 0.791667 0.048394
+vt 0.791667 0.061578
+vt 0.780599 0.038845
+vt 0.791667 0.028646
+vt 0.781250 0.072917
+vt 0.770833 0.072917
+vt 0.781250 0.083333
+vt 0.770833 0.083333
+vt 0.791667 0.072917
+vt 0.791667 0.083333
+vt 0.760417 0.072917
+vt 0.760417 0.083333
+vt 0.812500 0.062337
+vt 0.802083 0.061957
+vt 0.802083 0.049913
+vt 0.812500 0.051432
+vt 0.802734 0.038845
+vt 0.812500 0.041341
+vt 0.822917 0.049913
+vt 0.822917 0.061957
+vt 0.833333 0.048394
+vt 0.833333 0.061578
+vt 0.822266 0.038845
+vt 0.833333 0.028646
+vt 0.822917 0.072917
+vt 0.812500 0.072917
+vt 0.822917 0.083333
+vt 0.812500 0.083333
+vt 0.833333 0.072917
+vt 0.833333 0.083333
+vt 0.802083 0.072917
+vt 0.802083 0.083333
+vt 0.854167 0.062337
+vt 0.843750 0.061957
+vt 0.843750 0.049913
+vt 0.854167 0.051432
+vt 0.844401 0.038845
+vt 0.854167 0.041341
+vt 0.864583 0.049913
+vt 0.864583 0.061957
+vt 0.875000 0.048394
+vt 0.875000 0.061578
+vt 0.863932 0.038845
+vt 0.875000 0.028646
+vt 0.864583 0.072917
+vt 0.854167 0.072917
+vt 0.864583 0.083333
+vt 0.854167 0.083333
+vt 0.875000 0.072917
+vt 0.875000 0.083333
+vt 0.843750 0.072917
+vt 0.843750 0.083333
+vt 0.895833 0.062337
+vt 0.885417 0.061957
+vt 0.885417 0.049913
+vt 0.895833 0.051432
+vt 0.886068 0.038845
+vt 0.895833 0.041341
+vt 0.906250 0.049913
+vt 0.906250 0.061957
+vt 0.916667 0.048394
+vt 0.916667 0.061578
+vt 0.905599 0.038845
+vt 0.916667 0.028646
+vt 0.906250 0.072917
+vt 0.895833 0.072917
+vt 0.906250 0.083333
+vt 0.895833 0.083333
+vt 0.916667 0.072917
+vt 0.916667 0.083333
+vt 0.885417 0.072917
+vt 0.885417 0.083333
+vt 0.937500 0.062337
+vt 0.927083 0.061957
+vt 0.927083 0.049913
+vt 0.937500 0.051432
+vt 0.927734 0.038845
+vt 0.937500 0.041341
+vt 0.947917 0.049913
+vt 0.947917 0.061957
+vt 0.958333 0.048394
+vt 0.958333 0.061578
+vt 0.947266 0.038845
+vt 0.958333 0.028646
+vt 0.947917 0.072917
+vt 0.937500 0.072917
+vt 0.947917 0.083333
+vt 0.937500 0.083333
+vt 0.958333 0.072917
+vt 0.958333 0.083333
+vt 0.927083 0.072917
+vt 0.927083 0.083333
+vt 0.979126 0.062500
+vt 0.968750 0.061957
+vt 0.968750 0.049913
+vt 0.979004 0.052083
+vt 0.969401 0.038845
+vt 0.978923 0.042318
+vt 0.988932 0.052517
+vt 0.989421 0.062609
+vt 0.998698 0.052083
+vt 0.999675 0.062500
+vt 0.987956 0.042752
+vt 0.996745 0.041667
+vt 0.989583 0.072917
+vt 0.979167 0.072917
+vt 0.989583 0.083333
+vt 0.979167 0.083333
+vt 1.000000 0.072917
+vt 1.000000 0.083333
+vt 0.968750 0.072917
+vt 0.968750 0.083333
+vt 0.020833 0.104167
+vt 0.010417 0.104167
+vt 0.010417 0.093750
+vt 0.020833 0.093750
+vt 0.000000 0.104167
+vt 0.000000 0.093750
+vt 0.031250 0.093750
+vt 0.031250 0.104167
+vt 0.041667 0.093750
+vt 0.041667 0.104167
+vt 0.031250 0.114583
+vt 0.020833 0.114583
+vt 0.031250 0.125000
+vt 0.020833 0.125000
+vt 0.041667 0.114583
+vt 0.041667 0.125000
+vt 0.010417 0.114583
+vt 0.000000 0.114583
+vt 0.010417 0.125000
+vt 0.000000 0.125000
+vt 0.062500 0.104167
+vt 0.052083 0.104167
+vt 0.052083 0.093750
+vt 0.062500 0.093750
+vt 0.072917 0.093750
+vt 0.072917 0.104167
+vt 0.083333 0.093750
+vt 0.083333 0.104167
+vt 0.072917 0.114583
+vt 0.062500 0.114583
+vt 0.072917 0.125000
+vt 0.062500 0.125000
+vt 0.083333 0.114583
+vt 0.083333 0.125000
+vt 0.052083 0.114583
+vt 0.052083 0.125000
+vt 0.104167 0.104167
+vt 0.093750 0.104167
+vt 0.093750 0.093750
+vt 0.104167 0.093750
+vt 0.114583 0.093750
+vt 0.114583 0.104167
+vt 0.125000 0.093750
+vt 0.125000 0.104167
+vt 0.114583 0.114583
+vt 0.104167 0.114583
+vt 0.114583 0.125000
+vt 0.104167 0.125000
+vt 0.125000 0.114583
+vt 0.125000 0.125000
+vt 0.093750 0.114583
+vt 0.093750 0.125000
+vt 0.145833 0.104167
+vt 0.135417 0.104167
+vt 0.135417 0.093750
+vt 0.145833 0.093750
+vt 0.156250 0.093750
+vt 0.156250 0.104167
+vt 0.166667 0.093750
+vt 0.166667 0.104167
+vt 0.156250 0.114583
+vt 0.145833 0.114583
+vt 0.156250 0.125000
+vt 0.145833 0.125000
+vt 0.166667 0.114583
+vt 0.166667 0.125000
+vt 0.135417 0.114583
+vt 0.135417 0.125000
+vt 0.187500 0.104167
+vt 0.177083 0.104167
+vt 0.177083 0.093750
+vt 0.187500 0.093750
+vt 0.197917 0.093750
+vt 0.197917 0.104167
+vt 0.208333 0.093750
+vt 0.208333 0.104167
+vt 0.197917 0.114583
+vt 0.187500 0.114583
+vt 0.197917 0.125000
+vt 0.187500 0.125000
+vt 0.208333 0.114583
+vt 0.208333 0.125000
+vt 0.177083 0.114583
+vt 0.177083 0.125000
+vt 0.229167 0.104167
+vt 0.218750 0.104167
+vt 0.218750 0.093750
+vt 0.229167 0.093750
+vt 0.239583 0.093750
+vt 0.239583 0.104167
+vt 0.250000 0.093750
+vt 0.250000 0.104167
+vt 0.239583 0.114583
+vt 0.229167 0.114583
+vt 0.239583 0.125000
+vt 0.229167 0.125000
+vt 0.250000 0.114583
+vt 0.250000 0.125000
+vt 0.218750 0.114583
+vt 0.218750 0.125000
+vt 0.270833 0.104167
+vt 0.260417 0.104167
+vt 0.260417 0.093750
+vt 0.270833 0.093750
+vt 0.281250 0.093750
+vt 0.281250 0.104167
+vt 0.291667 0.093750
+vt 0.291667 0.104167
+vt 0.281250 0.114583
+vt 0.270833 0.114583
+vt 0.281250 0.125000
+vt 0.270833 0.125000
+vt 0.291667 0.114583
+vt 0.291667 0.125000
+vt 0.260417 0.114583
+vt 0.260417 0.125000
+vt 0.312500 0.104167
+vt 0.302083 0.104167
+vt 0.302083 0.093750
+vt 0.312500 0.093750
+vt 0.322917 0.093750
+vt 0.322917 0.104167
+vt 0.333333 0.093750
+vt 0.333333 0.104167
+vt 0.322917 0.114583
+vt 0.312500 0.114583
+vt 0.322917 0.125000
+vt 0.312500 0.125000
+vt 0.333333 0.114583
+vt 0.333333 0.125000
+vt 0.302083 0.114583
+vt 0.302083 0.125000
+vt 0.354167 0.104167
+vt 0.343750 0.104167
+vt 0.343750 0.093750
+vt 0.354167 0.093750
+vt 0.364583 0.093750
+vt 0.364583 0.104167
+vt 0.375000 0.093750
+vt 0.375000 0.104167
+vt 0.364583 0.114583
+vt 0.354167 0.114583
+vt 0.364583 0.125000
+vt 0.354167 0.125000
+vt 0.375000 0.114583
+vt 0.375000 0.125000
+vt 0.343750 0.114583
+vt 0.343750 0.125000
+vt 0.395833 0.104167
+vt 0.385417 0.104167
+vt 0.385417 0.093750
+vt 0.395833 0.093750
+vt 0.406250 0.093750
+vt 0.406250 0.104167
+vt 0.416667 0.093750
+vt 0.416667 0.104167
+vt 0.406250 0.114583
+vt 0.395833 0.114583
+vt 0.406250 0.125000
+vt 0.395833 0.125000
+vt 0.416667 0.114583
+vt 0.416667 0.125000
+vt 0.385417 0.114583
+vt 0.385417 0.125000
+vt 0.437500 0.104167
+vt 0.427083 0.104167
+vt 0.427083 0.093750
+vt 0.437500 0.093750
+vt 0.447917 0.093750
+vt 0.447917 0.104167
+vt 0.458333 0.093750
+vt 0.458333 0.104167
+vt 0.447917 0.114583
+vt 0.437500 0.114583
+vt 0.447917 0.125000
+vt 0.437500 0.125000
+vt 0.458333 0.114583
+vt 0.458333 0.125000
+vt 0.427083 0.114583
+vt 0.427083 0.125000
+vt 0.479167 0.104167
+vt 0.468750 0.104167
+vt 0.468750 0.093750
+vt 0.479167 0.093750
+vt 0.489583 0.093750
+vt 0.489583 0.104167
+vt 0.500000 0.093750
+vt 0.500000 0.104167
+vt 0.489583 0.114583
+vt 0.479167 0.114583
+vt 0.489583 0.125000
+vt 0.479167 0.125000
+vt 0.500000 0.114583
+vt 0.500000 0.125000
+vt 0.468750 0.114583
+vt 0.468750 0.125000
+vt 0.520833 0.104167
+vt 0.510417 0.104167
+vt 0.510417 0.093750
+vt 0.520833 0.093750
+vt 0.531250 0.093750
+vt 0.531250 0.104167
+vt 0.541667 0.093750
+vt 0.541667 0.104167
+vt 0.531250 0.114583
+vt 0.520833 0.114583
+vt 0.531250 0.125000
+vt 0.520833 0.125000
+vt 0.541667 0.114583
+vt 0.541667 0.125000
+vt 0.510417 0.114583
+vt 0.510417 0.125000
+vt 0.562500 0.104167
+vt 0.552083 0.104167
+vt 0.552083 0.093750
+vt 0.562500 0.093750
+vt 0.572917 0.093750
+vt 0.572917 0.104167
+vt 0.583333 0.093750
+vt 0.583333 0.104167
+vt 0.572917 0.114583
+vt 0.562500 0.114583
+vt 0.572917 0.125000
+vt 0.562500 0.125000
+vt 0.583333 0.114583
+vt 0.583333 0.125000
+vt 0.552083 0.114583
+vt 0.552083 0.125000
+vt 0.604167 0.104167
+vt 0.593750 0.104167
+vt 0.593750 0.093750
+vt 0.604167 0.093750
+vt 0.614583 0.093750
+vt 0.614583 0.104167
+vt 0.625000 0.093750
+vt 0.625000 0.104167
+vt 0.614583 0.114583
+vt 0.604167 0.114583
+vt 0.614583 0.125000
+vt 0.604167 0.125000
+vt 0.625000 0.114583
+vt 0.625000 0.125000
+vt 0.593750 0.114583
+vt 0.593750 0.125000
+vt 0.645833 0.104167
+vt 0.635417 0.104167
+vt 0.635417 0.093750
+vt 0.645833 0.093750
+vt 0.656250 0.093750
+vt 0.656250 0.104167
+vt 0.666667 0.093750
+vt 0.666667 0.104167
+vt 0.656250 0.114583
+vt 0.645833 0.114583
+vt 0.656250 0.125000
+vt 0.645833 0.125000
+vt 0.666667 0.114583
+vt 0.666667 0.125000
+vt 0.635417 0.114583
+vt 0.635417 0.125000
+vt 0.687500 0.104167
+vt 0.677083 0.104167
+vt 0.677083 0.093750
+vt 0.687500 0.093750
+vt 0.697917 0.093750
+vt 0.697917 0.104167
+vt 0.708333 0.093750
+vt 0.708333 0.104167
+vt 0.697917 0.114583
+vt 0.687500 0.114583
+vt 0.697917 0.125000
+vt 0.687500 0.125000
+vt 0.708333 0.114583
+vt 0.708333 0.125000
+vt 0.677083 0.114583
+vt 0.677083 0.125000
+vt 0.729167 0.104167
+vt 0.718750 0.104167
+vt 0.718750 0.093750
+vt 0.729167 0.093750
+vt 0.739583 0.093750
+vt 0.739583 0.104167
+vt 0.750000 0.093750
+vt 0.750000 0.104167
+vt 0.739583 0.114583
+vt 0.729167 0.114583
+vt 0.739583 0.125000
+vt 0.729167 0.125000
+vt 0.750000 0.114583
+vt 0.750000 0.125000
+vt 0.718750 0.114583
+vt 0.718750 0.125000
+vt 0.770833 0.104167
+vt 0.760417 0.104167
+vt 0.760417 0.093750
+vt 0.770833 0.093750
+vt 0.781250 0.093750
+vt 0.781250 0.104167
+vt 0.791667 0.093750
+vt 0.791667 0.104167
+vt 0.781250 0.114583
+vt 0.770833 0.114583
+vt 0.781250 0.125000
+vt 0.770833 0.125000
+vt 0.791667 0.114583
+vt 0.791667 0.125000
+vt 0.760417 0.114583
+vt 0.760417 0.125000
+vt 0.812500 0.104167
+vt 0.802083 0.104167
+vt 0.802083 0.093750
+vt 0.812500 0.093750
+vt 0.822917 0.093750
+vt 0.822917 0.104167
+vt 0.833333 0.093750
+vt 0.833333 0.104167
+vt 0.822917 0.114583
+vt 0.812500 0.114583
+vt 0.822917 0.125000
+vt 0.812500 0.125000
+vt 0.833333 0.114583
+vt 0.833333 0.125000
+vt 0.802083 0.114583
+vt 0.802083 0.125000
+vt 0.854167 0.104167
+vt 0.843750 0.104167
+vt 0.843750 0.093750
+vt 0.854167 0.093750
+vt 0.864583 0.093750
+vt 0.864583 0.104167
+vt 0.875000 0.093750
+vt 0.875000 0.104167
+vt 0.864583 0.114583
+vt 0.854167 0.114583
+vt 0.864583 0.125000
+vt 0.854167 0.125000
+vt 0.875000 0.114583
+vt 0.875000 0.125000
+vt 0.843750 0.114583
+vt 0.843750 0.125000
+vt 0.895833 0.104167
+vt 0.885417 0.104167
+vt 0.885417 0.093750
+vt 0.895833 0.093750
+vt 0.906250 0.093750
+vt 0.906250 0.104167
+vt 0.916667 0.093750
+vt 0.916667 0.104167
+vt 0.906250 0.114583
+vt 0.895833 0.114583
+vt 0.906250 0.125000
+vt 0.895833 0.125000
+vt 0.916667 0.114583
+vt 0.916667 0.125000
+vt 0.885417 0.114583
+vt 0.885417 0.125000
+vt 0.937500 0.104167
+vt 0.927083 0.104167
+vt 0.927083 0.093750
+vt 0.937500 0.093750
+vt 0.947917 0.093750
+vt 0.947917 0.104167
+vt 0.958333 0.093750
+vt 0.958333 0.104167
+vt 0.947917 0.114583
+vt 0.937500 0.114583
+vt 0.947917 0.125000
+vt 0.937500 0.125000
+vt 0.958333 0.114583
+vt 0.958333 0.125000
+vt 0.927083 0.114583
+vt 0.927083 0.125000
+vt 0.979167 0.104167
+vt 0.968750 0.104167
+vt 0.968750 0.093750
+vt 0.979167 0.093750
+vt 0.989583 0.093750
+vt 0.989583 0.104167
+vt 1.000000 0.093750
+vt 1.000000 0.104167
+vt 0.989583 0.114583
+vt 0.979167 0.114583
+vt 0.989583 0.125000
+vt 0.979167 0.125000
+vt 1.000000 0.114583
+vt 1.000000 0.125000
+vt 0.968750 0.114583
+vt 0.968750 0.125000
+vt 0.020833 0.145833
+vt 0.010417 0.145833
+vt 0.010417 0.135417
+vt 0.020833 0.135417
+vt 0.000000 0.145833
+vt 0.000000 0.135417
+vt 0.031250 0.135417
+vt 0.031250 0.145833
+vt 0.041667 0.135417
+vt 0.041667 0.145833
+vt 0.031250 0.156250
+vt 0.020833 0.156250
+vt 0.031250 0.166667
+vt 0.020833 0.166667
+vt 0.041667 0.156250
+vt 0.041667 0.166667
+vt 0.010417 0.156250
+vt 0.000000 0.156250
+vt 0.010417 0.166667
+vt 0.000000 0.166667
+vt 0.062500 0.145833
+vt 0.052083 0.145833
+vt 0.052083 0.135417
+vt 0.062500 0.135417
+vt 0.072917 0.135417
+vt 0.072917 0.145833
+vt 0.083333 0.135417
+vt 0.083333 0.145833
+vt 0.072917 0.156250
+vt 0.062500 0.156250
+vt 0.072917 0.166667
+vt 0.062500 0.166667
+vt 0.083333 0.156250
+vt 0.083333 0.166667
+vt 0.052083 0.156250
+vt 0.052083 0.166667
+vt 0.104167 0.145833
+vt 0.093750 0.145833
+vt 0.093750 0.135417
+vt 0.104167 0.135417
+vt 0.114583 0.135417
+vt 0.114583 0.145833
+vt 0.125000 0.135417
+vt 0.125000 0.145833
+vt 0.114583 0.156250
+vt 0.104167 0.156250
+vt 0.114583 0.166667
+vt 0.104167 0.166667
+vt 0.125000 0.156250
+vt 0.125000 0.166667
+vt 0.093750 0.156250
+vt 0.093750 0.166667
+vt 0.145833 0.145833
+vt 0.135417 0.145833
+vt 0.135417 0.135417
+vt 0.145833 0.135417
+vt 0.156250 0.135417
+vt 0.156250 0.145833
+vt 0.166667 0.135417
+vt 0.166667 0.145833
+vt 0.156250 0.156250
+vt 0.145833 0.156250
+vt 0.156250 0.166667
+vt 0.145833 0.166667
+vt 0.166667 0.156250
+vt 0.166667 0.166667
+vt 0.135417 0.156250
+vt 0.135417 0.166667
+vt 0.187500 0.145833
+vt 0.177083 0.145833
+vt 0.177083 0.135417
+vt 0.187500 0.135417
+vt 0.197917 0.135417
+vt 0.197917 0.145833
+vt 0.208333 0.135417
+vt 0.208333 0.145833
+vt 0.197917 0.156250
+vt 0.187500 0.156250
+vt 0.197917 0.166667
+vt 0.187500 0.166667
+vt 0.208333 0.156250
+vt 0.208333 0.166667
+vt 0.177083 0.156250
+vt 0.177083 0.166667
+vt 0.229167 0.145833
+vt 0.218750 0.145833
+vt 0.218750 0.135417
+vt 0.229167 0.135417
+vt 0.239583 0.135417
+vt 0.239583 0.145833
+vt 0.250000 0.135417
+vt 0.250000 0.145833
+vt 0.239583 0.156250
+vt 0.229167 0.156250
+vt 0.239583 0.166667
+vt 0.229167 0.166667
+vt 0.250000 0.156250
+vt 0.250000 0.166667
+vt 0.218750 0.156250
+vt 0.218750 0.166667
+vt 0.270833 0.145833
+vt 0.260417 0.145833
+vt 0.260417 0.135417
+vt 0.270833 0.135417
+vt 0.281250 0.135417
+vt 0.281250 0.145833
+vt 0.291667 0.135417
+vt 0.291667 0.145833
+vt 0.281250 0.156250
+vt 0.270833 0.156250
+vt 0.281250 0.166667
+vt 0.270833 0.166667
+vt 0.291667 0.156250
+vt 0.291667 0.166667
+vt 0.260417 0.156250
+vt 0.260417 0.166667
+vt 0.312500 0.145833
+vt 0.302083 0.145833
+vt 0.302083 0.135417
+vt 0.312500 0.135417
+vt 0.322917 0.135417
+vt 0.322917 0.145833
+vt 0.333333 0.135417
+vt 0.333333 0.145833
+vt 0.322917 0.156250
+vt 0.312500 0.156250
+vt 0.322917 0.166667
+vt 0.312500 0.166667
+vt 0.333333 0.156250
+vt 0.333333 0.166667
+vt 0.302083 0.156250
+vt 0.302083 0.166667
+vt 0.354167 0.145833
+vt 0.343750 0.145833
+vt 0.343750 0.135417
+vt 0.354167 0.135417
+vt 0.364583 0.135417
+vt 0.364583 0.145833
+vt 0.375000 0.135417
+vt 0.375000 0.145833
+vt 0.364583 0.156250
+vt 0.354167 0.156250
+vt 0.364583 0.166667
+vt 0.354167 0.166667
+vt 0.375000 0.156250
+vt 0.375000 0.166667
+vt 0.343750 0.156250
+vt 0.395833 0.145833
+vt 0.385417 0.145833
+vt 0.385417 0.135417
+vt 0.395833 0.135417
+vt 0.406250 0.135417
+vt 0.406250 0.145833
+vt 0.416667 0.135417
+vt 0.416667 0.145833
+vt 0.406250 0.156250
+vt 0.395833 0.156250
+vt 0.406250 0.166667
+vt 0.395833 0.166667
+vt 0.416667 0.156250
+vt 0.416667 0.166667
+vt 0.385417 0.156250
+vt 0.385417 0.166667
+vt 0.437500 0.145833
+vt 0.427083 0.145833
+vt 0.427083 0.135417
+vt 0.437500 0.135417
+vt 0.447917 0.135417
+vt 0.447917 0.145833
+vt 0.458333 0.135417
+vt 0.458333 0.145833
+vt 0.447917 0.156250
+vt 0.437500 0.156250
+vt 0.447917 0.166667
+vt 0.437500 0.166667
+vt 0.458333 0.156250
+vt 0.458333 0.166667
+vt 0.427083 0.156250
+vt 0.479167 0.145833
+vt 0.468750 0.145833
+vt 0.468750 0.135417
+vt 0.479167 0.135417
+vt 0.489583 0.135417
+vt 0.489583 0.145833
+vt 0.500000 0.135417
+vt 0.500000 0.145833
+vt 0.489583 0.156250
+vt 0.479167 0.156250
+vt 0.489583 0.166667
+vt 0.479167 0.166667
+vt 0.500000 0.156250
+vt 0.500000 0.166667
+vt 0.468750 0.156250
+vt 0.468750 0.166667
+vt 0.520833 0.145833
+vt 0.510417 0.145833
+vt 0.510417 0.135417
+vt 0.520833 0.135417
+vt 0.531250 0.135417
+vt 0.531250 0.145833
+vt 0.541667 0.135417
+vt 0.541667 0.145833
+vt 0.531250 0.156250
+vt 0.520833 0.156250
+vt 0.531250 0.166667
+vt 0.520833 0.166667
+vt 0.541667 0.156250
+vt 0.541667 0.166667
+vt 0.510417 0.156250
+vt 0.510417 0.166667
+vt 0.562500 0.145833
+vt 0.552083 0.145833
+vt 0.552083 0.135417
+vt 0.562500 0.135417
+vt 0.572917 0.135417
+vt 0.572917 0.145833
+vt 0.583333 0.135417
+vt 0.583333 0.145833
+vt 0.572917 0.156250
+vt 0.562500 0.156250
+vt 0.572917 0.166667
+vt 0.562500 0.166667
+vt 0.583333 0.156250
+vt 0.583333 0.166667
+vt 0.552083 0.156250
+vt 0.552083 0.166667
+vt 0.604167 0.145833
+vt 0.593750 0.145833
+vt 0.593750 0.135417
+vt 0.604167 0.135417
+vt 0.614583 0.135417
+vt 0.614583 0.145833
+vt 0.625000 0.135417
+vt 0.625000 0.145833
+vt 0.614583 0.156250
+vt 0.604167 0.156250
+vt 0.614583 0.166667
+vt 0.604167 0.166667
+vt 0.625000 0.156250
+vt 0.625000 0.166667
+vt 0.593750 0.156250
+vt 0.593750 0.166667
+vt 0.645833 0.145833
+vt 0.635417 0.145833
+vt 0.635417 0.135417
+vt 0.645833 0.135417
+vt 0.656250 0.135417
+vt 0.656250 0.145833
+vt 0.666667 0.135417
+vt 0.666667 0.145833
+vt 0.656250 0.156250
+vt 0.645833 0.156250
+vt 0.656250 0.166667
+vt 0.645833 0.166667
+vt 0.666667 0.156250
+vt 0.666667 0.166667
+vt 0.635417 0.156250
+vt 0.635417 0.166667
+vt 0.687500 0.145833
+vt 0.677083 0.145833
+vt 0.677083 0.135417
+vt 0.687500 0.135417
+vt 0.697917 0.135417
+vt 0.697917 0.145833
+vt 0.708333 0.135417
+vt 0.708333 0.145833
+vt 0.697917 0.156250
+vt 0.687500 0.156250
+vt 0.697917 0.166667
+vt 0.687500 0.166667
+vt 0.708333 0.156250
+vt 0.708333 0.166667
+vt 0.677083 0.156250
+vt 0.677083 0.166667
+vt 0.729167 0.145833
+vt 0.718750 0.145833
+vt 0.718750 0.135417
+vt 0.729167 0.135417
+vt 0.739583 0.135417
+vt 0.739583 0.145833
+vt 0.750000 0.135417
+vt 0.750000 0.145833
+vt 0.739583 0.156250
+vt 0.729167 0.156250
+vt 0.739583 0.166667
+vt 0.729167 0.166667
+vt 0.750000 0.156250
+vt 0.750000 0.166667
+vt 0.718750 0.156250
+vt 0.718750 0.166667
+vt 0.770833 0.145833
+vt 0.760417 0.145833
+vt 0.760417 0.135417
+vt 0.770833 0.135417
+vt 0.781250 0.135417
+vt 0.781250 0.145833
+vt 0.791667 0.135417
+vt 0.791667 0.145833
+vt 0.781250 0.156250
+vt 0.770833 0.156250
+vt 0.781250 0.166667
+vt 0.770833 0.166667
+vt 0.791667 0.156250
+vt 0.791667 0.166667
+vt 0.760417 0.156250
+vt 0.760417 0.166667
+vt 0.812500 0.145833
+vt 0.802083 0.145833
+vt 0.802083 0.135417
+vt 0.812500 0.135417
+vt 0.822917 0.135417
+vt 0.822917 0.145833
+vt 0.833333 0.135417
+vt 0.833333 0.145833
+vt 0.822917 0.156250
+vt 0.812500 0.156250
+vt 0.822917 0.166667
+vt 0.812500 0.166667
+vt 0.833333 0.156250
+vt 0.833333 0.166667
+vt 0.802083 0.156250
+vt 0.802083 0.166667
+vt 0.854167 0.145833
+vt 0.843750 0.145833
+vt 0.843750 0.135417
+vt 0.854167 0.135417
+vt 0.864583 0.135417
+vt 0.864583 0.145833
+vt 0.875000 0.135417
+vt 0.875000 0.145833
+vt 0.864583 0.156250
+vt 0.854167 0.156250
+vt 0.864583 0.166667
+vt 0.854167 0.166667
+vt 0.875000 0.156250
+vt 0.875000 0.166667
+vt 0.843750 0.156250
+vt 0.895833 0.145833
+vt 0.885417 0.145833
+vt 0.885417 0.135417
+vt 0.895833 0.135417
+vt 0.906250 0.135417
+vt 0.906250 0.145833
+vt 0.916667 0.135417
+vt 0.916667 0.145833
+vt 0.906250 0.156250
+vt 0.895833 0.156250
+vt 0.906250 0.166667
+vt 0.895833 0.166667
+vt 0.916667 0.156250
+vt 0.916667 0.166667
+vt 0.885417 0.156250
+vt 0.885417 0.166667
+vt 0.937500 0.145833
+vt 0.927083 0.145833
+vt 0.927083 0.135417
+vt 0.937500 0.135417
+vt 0.947917 0.135417
+vt 0.947917 0.145833
+vt 0.958333 0.135417
+vt 0.958333 0.145833
+vt 0.947917 0.156250
+vt 0.937500 0.156250
+vt 0.947917 0.166667
+vt 0.937500 0.166667
+vt 0.958333 0.156250
+vt 0.958333 0.166667
+vt 0.927083 0.156250
+vt 0.927083 0.166667
+vt 0.979167 0.145833
+vt 0.968750 0.145833
+vt 0.968750 0.135417
+vt 0.979167 0.135417
+vt 0.989583 0.135417
+vt 0.989583 0.145833
+vt 1.000000 0.135417
+vt 1.000000 0.145833
+vt 0.989583 0.156250
+vt 0.979167 0.156250
+vt 0.989583 0.166667
+vt 0.979167 0.166667
+vt 1.000000 0.156250
+vt 1.000000 0.166667
+vt 0.968750 0.156250
+vt 0.968750 0.166667
+vt 0.020833 0.187500
+vt 0.010417 0.187500
+vt 0.010417 0.177083
+vt 0.020833 0.177083
+vt 0.000000 0.187500
+vt 0.000000 0.177083
+vt 0.031250 0.177083
+vt 0.031250 0.187500
+vt 0.041667 0.177083
+vt 0.041667 0.187500
+vt 0.031250 0.197917
+vt 0.020833 0.197917
+vt 0.031250 0.208333
+vt 0.020833 0.208333
+vt 0.041667 0.197917
+vt 0.041667 0.208333
+vt 0.010417 0.197917
+vt 0.000000 0.197917
+vt 0.010417 0.208333
+vt 0.000000 0.208333
+vt 0.062500 0.187500
+vt 0.052083 0.187500
+vt 0.052083 0.177083
+vt 0.062500 0.177083
+vt 0.072917 0.177083
+vt 0.072917 0.187500
+vt 0.083333 0.177083
+vt 0.083333 0.187500
+vt 0.072917 0.197917
+vt 0.062500 0.197917
+vt 0.072917 0.208333
+vt 0.062500 0.208333
+vt 0.083333 0.197917
+vt 0.083333 0.208333
+vt 0.052083 0.197917
+vt 0.052083 0.208333
+vt 0.104167 0.187500
+vt 0.093750 0.187500
+vt 0.093750 0.177083
+vt 0.104167 0.177083
+vt 0.114583 0.177083
+vt 0.114583 0.187500
+vt 0.125000 0.177083
+vt 0.125000 0.187500
+vt 0.114583 0.197917
+vt 0.104167 0.197917
+vt 0.114583 0.208333
+vt 0.104167 0.208333
+vt 0.125000 0.197917
+vt 0.125000 0.208333
+vt 0.093750 0.197917
+vt 0.093750 0.208333
+vt 0.145833 0.187500
+vt 0.135417 0.187500
+vt 0.135417 0.177083
+vt 0.145833 0.177083
+vt 0.156250 0.177083
+vt 0.156250 0.187500
+vt 0.166667 0.177083
+vt 0.166667 0.187500
+vt 0.156250 0.197917
+vt 0.145833 0.197917
+vt 0.156250 0.208333
+vt 0.145833 0.208333
+vt 0.166667 0.197917
+vt 0.166667 0.208333
+vt 0.135417 0.197917
+vt 0.135417 0.208333
+vt 0.187500 0.187500
+vt 0.177083 0.187500
+vt 0.177083 0.177083
+vt 0.187500 0.177083
+vt 0.197917 0.177083
+vt 0.197917 0.187500
+vt 0.208333 0.177083
+vt 0.208333 0.187500
+vt 0.197917 0.197917
+vt 0.187500 0.197917
+vt 0.197917 0.208333
+vt 0.187500 0.208333
+vt 0.208333 0.197917
+vt 0.208333 0.208333
+vt 0.177083 0.197917
+vt 0.177083 0.208333
+vt 0.229167 0.187500
+vt 0.218750 0.187500
+vt 0.218750 0.177083
+vt 0.229167 0.177083
+vt 0.239583 0.177083
+vt 0.239583 0.187500
+vt 0.250000 0.177083
+vt 0.250000 0.187500
+vt 0.239583 0.197917
+vt 0.229167 0.197917
+vt 0.239583 0.208333
+vt 0.229167 0.208333
+vt 0.250000 0.197917
+vt 0.250000 0.208333
+vt 0.218750 0.197917
+vt 0.218750 0.208333
+vt 0.270833 0.187500
+vt 0.260417 0.187500
+vt 0.260417 0.177083
+vt 0.270833 0.177083
+vt 0.281250 0.177083
+vt 0.281250 0.187500
+vt 0.291667 0.177083
+vt 0.291667 0.187500
+vt 0.281250 0.197917
+vt 0.270833 0.197917
+vt 0.281250 0.208333
+vt 0.270833 0.208333
+vt 0.291667 0.197917
+vt 0.291667 0.208333
+vt 0.260417 0.197917
+vt 0.260417 0.208333
+vt 0.312500 0.187500
+vt 0.302083 0.187500
+vt 0.302083 0.177083
+vt 0.312500 0.177083
+vt 0.322917 0.177083
+vt 0.322917 0.187500
+vt 0.333333 0.177083
+vt 0.333333 0.187500
+vt 0.322917 0.197917
+vt 0.312500 0.197917
+vt 0.322917 0.208333
+vt 0.312500 0.208333
+vt 0.333333 0.197917
+vt 0.333333 0.208333
+vt 0.302083 0.197917
+vt 0.302083 0.208333
+vt 0.354167 0.187500
+vt 0.343750 0.187500
+vt 0.343750 0.177083
+vt 0.354167 0.177083
+vt 0.364583 0.177083
+vt 0.364583 0.187500
+vt 0.375000 0.177083
+vt 0.375000 0.187500
+vt 0.364583 0.197917
+vt 0.354167 0.197917
+vt 0.364583 0.208333
+vt 0.354167 0.208333
+vt 0.375000 0.197917
+vt 0.375000 0.208333
+vt 0.343750 0.197917
+vt 0.343750 0.208333
+vt 0.395833 0.187500
+vt 0.385417 0.187500
+vt 0.385417 0.177083
+vt 0.395833 0.177083
+vt 0.406250 0.177083
+vt 0.406250 0.187500
+vt 0.416667 0.177083
+vt 0.416667 0.187500
+vt 0.406250 0.197917
+vt 0.395833 0.197917
+vt 0.406250 0.208333
+vt 0.395833 0.208333
+vt 0.416667 0.197917
+vt 0.416667 0.208333
+vt 0.385417 0.197917
+vt 0.385417 0.208333
+vt 0.437500 0.187500
+vt 0.427083 0.187500
+vt 0.427083 0.177083
+vt 0.437500 0.177083
+vt 0.447917 0.177083
+vt 0.447917 0.187500
+vt 0.458333 0.177083
+vt 0.458333 0.187500
+vt 0.447917 0.197917
+vt 0.437500 0.197917
+vt 0.447917 0.208333
+vt 0.437500 0.208333
+vt 0.458333 0.197917
+vt 0.458333 0.208333
+vt 0.427083 0.197917
+vt 0.427083 0.208333
+vt 0.479167 0.187500
+vt 0.468750 0.187500
+vt 0.468750 0.177083
+vt 0.479167 0.177083
+vt 0.489583 0.177083
+vt 0.489583 0.187500
+vt 0.500000 0.177083
+vt 0.500000 0.187500
+vt 0.489583 0.197917
+vt 0.479167 0.197917
+vt 0.489583 0.208333
+vt 0.479167 0.208333
+vt 0.500000 0.197917
+vt 0.500000 0.208333
+vt 0.468750 0.197917
+vt 0.468750 0.208333
+vt 0.520833 0.187500
+vt 0.510417 0.187500
+vt 0.510417 0.177083
+vt 0.520833 0.177083
+vt 0.531250 0.177083
+vt 0.531250 0.187500
+vt 0.541667 0.177083
+vt 0.541667 0.187500
+vt 0.531250 0.197917
+vt 0.520833 0.197917
+vt 0.531250 0.208333
+vt 0.520833 0.208333
+vt 0.541667 0.197917
+vt 0.541667 0.208333
+vt 0.510417 0.197917
+vt 0.510417 0.208333
+vt 0.562500 0.187500
+vt 0.552083 0.187500
+vt 0.552083 0.177083
+vt 0.562500 0.177083
+vt 0.572917 0.177083
+vt 0.572917 0.187500
+vt 0.583333 0.177083
+vt 0.583333 0.187500
+vt 0.572917 0.197917
+vt 0.562500 0.197917
+vt 0.572917 0.208333
+vt 0.562500 0.208333
+vt 0.583333 0.197917
+vt 0.583333 0.208333
+vt 0.552083 0.197917
+vt 0.552083 0.208333
+vt 0.604167 0.187500
+vt 0.593750 0.187500
+vt 0.593750 0.177083
+vt 0.604167 0.177083
+vt 0.614583 0.177083
+vt 0.614583 0.187500
+vt 0.625000 0.177083
+vt 0.625000 0.187500
+vt 0.614583 0.197917
+vt 0.604167 0.197917
+vt 0.614583 0.208333
+vt 0.604167 0.208333
+vt 0.625000 0.197917
+vt 0.625000 0.208333
+vt 0.593750 0.197917
+vt 0.593750 0.208333
+vt 0.645833 0.187500
+vt 0.635417 0.187500
+vt 0.635417 0.177083
+vt 0.645833 0.177083
+vt 0.656250 0.177083
+vt 0.656250 0.187500
+vt 0.666667 0.177083
+vt 0.666667 0.187500
+vt 0.656250 0.197917
+vt 0.645833 0.197917
+vt 0.656250 0.208333
+vt 0.645833 0.208333
+vt 0.666667 0.197917
+vt 0.666667 0.208333
+vt 0.635417 0.197917
+vt 0.635417 0.208333
+vt 0.687500 0.187500
+vt 0.677083 0.187500
+vt 0.677083 0.177083
+vt 0.687500 0.177083
+vt 0.697917 0.177083
+vt 0.697917 0.187500
+vt 0.708333 0.177083
+vt 0.708333 0.187500
+vt 0.697917 0.197917
+vt 0.687500 0.197917
+vt 0.697917 0.208333
+vt 0.687500 0.208333
+vt 0.708333 0.197917
+vt 0.708333 0.208333
+vt 0.677083 0.197917
+vt 0.677083 0.208333
+vt 0.729167 0.187500
+vt 0.718750 0.187500
+vt 0.718750 0.177083
+vt 0.729167 0.177083
+vt 0.739583 0.177083
+vt 0.739583 0.187500
+vt 0.750000 0.177083
+vt 0.750000 0.187500
+vt 0.739583 0.197917
+vt 0.729167 0.197917
+vt 0.739583 0.208333
+vt 0.729167 0.208333
+vt 0.750000 0.197917
+vt 0.750000 0.208333
+vt 0.718750 0.197917
+vt 0.718750 0.208333
+vt 0.770833 0.187500
+vt 0.760417 0.187500
+vt 0.760417 0.177083
+vt 0.770833 0.177083
+vt 0.781250 0.177083
+vt 0.781250 0.187500
+vt 0.791667 0.177083
+vt 0.791667 0.187500
+vt 0.781250 0.197917
+vt 0.770833 0.197917
+vt 0.781250 0.208333
+vt 0.770833 0.208333
+vt 0.791667 0.197917
+vt 0.791667 0.208333
+vt 0.760417 0.197917
+vt 0.760417 0.208333
+vt 0.812500 0.187500
+vt 0.802083 0.187500
+vt 0.802083 0.177083
+vt 0.812500 0.177083
+vt 0.822917 0.177083
+vt 0.822917 0.187500
+vt 0.833333 0.177083
+vt 0.833333 0.187500
+vt 0.822917 0.197917
+vt 0.812500 0.197917
+vt 0.822917 0.208333
+vt 0.812500 0.208333
+vt 0.833333 0.197917
+vt 0.833333 0.208333
+vt 0.802083 0.197917
+vt 0.802083 0.208333
+vt 0.854167 0.187500
+vt 0.843750 0.187500
+vt 0.843750 0.177083
+vt 0.854167 0.177083
+vt 0.864583 0.177083
+vt 0.864583 0.187500
+vt 0.875000 0.177083
+vt 0.875000 0.187500
+vt 0.864583 0.197917
+vt 0.854167 0.197917
+vt 0.864583 0.208333
+vt 0.854167 0.208333
+vt 0.875000 0.197917
+vt 0.875000 0.208333
+vt 0.843750 0.197917
+vt 0.843750 0.208333
+vt 0.895833 0.187500
+vt 0.885417 0.187500
+vt 0.885417 0.177083
+vt 0.895833 0.177083
+vt 0.906250 0.177083
+vt 0.906250 0.187500
+vt 0.916667 0.177083
+vt 0.916667 0.187500
+vt 0.906250 0.197917
+vt 0.895833 0.197917
+vt 0.906250 0.208333
+vt 0.895833 0.208333
+vt 0.916667 0.197917
+vt 0.916667 0.208333
+vt 0.885417 0.197917
+vt 0.885417 0.208333
+vt 0.937500 0.187500
+vt 0.927083 0.187500
+vt 0.927083 0.177083
+vt 0.937500 0.177083
+vt 0.947917 0.177083
+vt 0.947917 0.187500
+vt 0.958333 0.177083
+vt 0.958333 0.187500
+vt 0.947917 0.197917
+vt 0.937500 0.197917
+vt 0.947917 0.208333
+vt 0.937500 0.208333
+vt 0.958333 0.197917
+vt 0.958333 0.208333
+vt 0.927083 0.197917
+vt 0.927083 0.208333
+vt 0.979167 0.187500
+vt 0.968750 0.187500
+vt 0.968750 0.177083
+vt 0.979167 0.177083
+vt 0.989583 0.177083
+vt 0.989583 0.187500
+vt 1.000000 0.177083
+vt 1.000000 0.187500
+vt 0.989583 0.197917
+vt 0.979167 0.197917
+vt 0.989583 0.208333
+vt 0.979167 0.208333
+vt 1.000000 0.197917
+vt 1.000000 0.208333
+vt 0.968750 0.197917
+vt 0.968750 0.208333
+vt 0.020833 0.229167
+vt 0.010417 0.229167
+vt 0.010417 0.218750
+vt 0.020833 0.218750
+vt 0.000000 0.229167
+vt 0.000000 0.218750
+vt 0.031250 0.218750
+vt 0.031250 0.229167
+vt 0.041667 0.218750
+vt 0.041667 0.229167
+vt 0.031250 0.239583
+vt 0.020833 0.239583
+vt 0.031250 0.250000
+vt 0.020833 0.250000
+vt 0.041667 0.239583
+vt 0.041667 0.250000
+vt 0.010417 0.239583
+vt 0.000000 0.239583
+vt 0.010417 0.250000
+vt 0.000000 0.250000
+vt 0.062500 0.229167
+vt 0.052083 0.229167
+vt 0.052083 0.218750
+vt 0.062500 0.218750
+vt 0.072917 0.218750
+vt 0.072917 0.229167
+vt 0.083333 0.218750
+vt 0.083333 0.229167
+vt 0.072917 0.239583
+vt 0.062500 0.239583
+vt 0.072917 0.250000
+vt 0.062500 0.250000
+vt 0.083333 0.239583
+vt 0.083333 0.250000
+vt 0.052083 0.239583
+vt 0.052083 0.250000
+vt 0.104167 0.229167
+vt 0.093750 0.229167
+vt 0.093750 0.218750
+vt 0.104167 0.218750
+vt 0.114583 0.218750
+vt 0.114583 0.229167
+vt 0.125000 0.218750
+vt 0.125000 0.229167
+vt 0.114583 0.239583
+vt 0.104167 0.239583
+vt 0.114583 0.250000
+vt 0.104167 0.250000
+vt 0.125000 0.239583
+vt 0.125000 0.250000
+vt 0.093750 0.239583
+vt 0.093750 0.250000
+vt 0.145833 0.229167
+vt 0.135417 0.229167
+vt 0.135417 0.218750
+vt 0.145833 0.218750
+vt 0.156250 0.218750
+vt 0.156250 0.229167
+vt 0.166667 0.218750
+vt 0.166667 0.229167
+vt 0.156250 0.239583
+vt 0.145833 0.239583
+vt 0.156250 0.250000
+vt 0.145833 0.250000
+vt 0.166667 0.239583
+vt 0.166667 0.250000
+vt 0.135417 0.239583
+vt 0.135417 0.250000
+vt 0.187500 0.229167
+vt 0.177083 0.229167
+vt 0.177083 0.218750
+vt 0.187500 0.218750
+vt 0.197917 0.218750
+vt 0.197917 0.229167
+vt 0.208333 0.218750
+vt 0.208333 0.229167
+vt 0.197917 0.239583
+vt 0.187500 0.239583
+vt 0.197917 0.250000
+vt 0.187500 0.250000
+vt 0.208333 0.239583
+vt 0.208333 0.250000
+vt 0.177083 0.239583
+vt 0.177083 0.250000
+vt 0.229167 0.229167
+vt 0.218750 0.229167
+vt 0.218750 0.218750
+vt 0.229167 0.218750
+vt 0.239583 0.218750
+vt 0.239583 0.229167
+vt 0.250000 0.218750
+vt 0.250000 0.229167
+vt 0.239583 0.239583
+vt 0.229167 0.239583
+vt 0.239583 0.250000
+vt 0.229167 0.250000
+vt 0.250000 0.239583
+vt 0.250000 0.250000
+vt 0.218750 0.239583
+vt 0.218750 0.250000
+vt 0.270833 0.229167
+vt 0.260417 0.229167
+vt 0.260417 0.218750
+vt 0.270833 0.218750
+vt 0.281250 0.218750
+vt 0.281250 0.229167
+vt 0.291667 0.218750
+vt 0.291667 0.229167
+vt 0.281250 0.239583
+vt 0.270833 0.239583
+vt 0.281250 0.250000
+vt 0.270833 0.250000
+vt 0.291667 0.239583
+vt 0.291667 0.250000
+vt 0.260417 0.239583
+vt 0.260417 0.250000
+vt 0.312500 0.229167
+vt 0.302083 0.229167
+vt 0.302083 0.218750
+vt 0.312500 0.218750
+vt 0.322917 0.218750
+vt 0.322917 0.229167
+vt 0.333333 0.218750
+vt 0.333333 0.229167
+vt 0.322917 0.239583
+vt 0.312500 0.239583
+vt 0.322917 0.250000
+vt 0.312500 0.250000
+vt 0.333333 0.239583
+vt 0.333333 0.250000
+vt 0.302083 0.239583
+vt 0.302083 0.250000
+vt 0.354167 0.229167
+vt 0.343750 0.229167
+vt 0.343750 0.218750
+vt 0.354167 0.218750
+vt 0.364583 0.218750
+vt 0.364583 0.229167
+vt 0.375000 0.218750
+vt 0.375000 0.229167
+vt 0.364583 0.239583
+vt 0.354167 0.239583
+vt 0.364583 0.250000
+vt 0.354167 0.250000
+vt 0.375000 0.239583
+vt 0.375000 0.250000
+vt 0.343750 0.239583
+vt 0.343750 0.250000
+vt 0.395833 0.229167
+vt 0.385417 0.229167
+vt 0.385417 0.218750
+vt 0.395833 0.218750
+vt 0.406250 0.218750
+vt 0.406250 0.229167
+vt 0.416667 0.218750
+vt 0.416667 0.229167
+vt 0.406250 0.239583
+vt 0.395833 0.239583
+vt 0.406250 0.250000
+vt 0.395833 0.250000
+vt 0.416667 0.239583
+vt 0.416667 0.250000
+vt 0.385417 0.239583
+vt 0.385417 0.250000
+vt 0.437500 0.229167
+vt 0.427083 0.229167
+vt 0.427083 0.218750
+vt 0.437500 0.218750
+vt 0.447917 0.218750
+vt 0.447917 0.229167
+vt 0.458333 0.218750
+vt 0.458333 0.229167
+vt 0.447917 0.239583
+vt 0.437500 0.239583
+vt 0.447917 0.250000
+vt 0.437500 0.250000
+vt 0.458333 0.239583
+vt 0.458333 0.250000
+vt 0.427083 0.239583
+vt 0.427083 0.250000
+vt 0.479167 0.229167
+vt 0.468750 0.229167
+vt 0.468750 0.218750
+vt 0.479167 0.218750
+vt 0.489583 0.218750
+vt 0.489583 0.229167
+vt 0.500000 0.218750
+vt 0.500000 0.229167
+vt 0.489583 0.239583
+vt 0.479167 0.239583
+vt 0.489583 0.250000
+vt 0.479167 0.250000
+vt 0.500000 0.239583
+vt 0.500000 0.250000
+vt 0.468750 0.239583
+vt 0.468750 0.250000
+vt 0.520833 0.229167
+vt 0.510417 0.229167
+vt 0.510417 0.218750
+vt 0.520833 0.218750
+vt 0.531250 0.218750
+vt 0.531250 0.229167
+vt 0.541667 0.218750
+vt 0.541667 0.229167
+vt 0.531250 0.239583
+vt 0.520833 0.239583
+vt 0.531250 0.250000
+vt 0.520833 0.250000
+vt 0.541667 0.239583
+vt 0.541667 0.250000
+vt 0.510417 0.239583
+vt 0.510417 0.250000
+vt 0.562500 0.229167
+vt 0.552083 0.229167
+vt 0.552083 0.218750
+vt 0.562500 0.218750
+vt 0.572917 0.218750
+vt 0.572917 0.229167
+vt 0.583333 0.218750
+vt 0.583333 0.229167
+vt 0.572917 0.239583
+vt 0.562500 0.239583
+vt 0.572917 0.250000
+vt 0.562500 0.250000
+vt 0.583333 0.239583
+vt 0.583333 0.250000
+vt 0.552083 0.239583
+vt 0.552083 0.250000
+vt 0.604167 0.229167
+vt 0.593750 0.229167
+vt 0.593750 0.218750
+vt 0.604167 0.218750
+vt 0.614583 0.218750
+vt 0.614583 0.229167
+vt 0.625000 0.218750
+vt 0.625000 0.229167
+vt 0.614583 0.239583
+vt 0.604167 0.239583
+vt 0.614583 0.250000
+vt 0.604167 0.250000
+vt 0.625000 0.239583
+vt 0.625000 0.250000
+vt 0.593750 0.239583
+vt 0.593750 0.250000
+vt 0.645833 0.229167
+vt 0.635417 0.229167
+vt 0.635417 0.218750
+vt 0.645833 0.218750
+vt 0.656250 0.218750
+vt 0.656250 0.229167
+vt 0.666667 0.218750
+vt 0.666667 0.229167
+vt 0.656250 0.239583
+vt 0.645833 0.239583
+vt 0.656250 0.250000
+vt 0.645833 0.250000
+vt 0.666667 0.239583
+vt 0.666667 0.250000
+vt 0.635417 0.239583
+vt 0.635417 0.250000
+vt 0.687500 0.229167
+vt 0.677083 0.229167
+vt 0.677083 0.218750
+vt 0.687500 0.218750
+vt 0.697917 0.218750
+vt 0.697917 0.229167
+vt 0.708333 0.218750
+vt 0.708333 0.229167
+vt 0.697917 0.239583
+vt 0.687500 0.239583
+vt 0.697917 0.250000
+vt 0.687500 0.250000
+vt 0.708333 0.239583
+vt 0.708333 0.250000
+vt 0.677083 0.239583
+vt 0.677083 0.250000
+vt 0.729167 0.229167
+vt 0.718750 0.229167
+vt 0.718750 0.218750
+vt 0.729167 0.218750
+vt 0.739583 0.218750
+vt 0.739583 0.229167
+vt 0.750000 0.218750
+vt 0.750000 0.229167
+vt 0.739583 0.239583
+vt 0.729167 0.239583
+vt 0.739583 0.250000
+vt 0.729167 0.250000
+vt 0.750000 0.239583
+vt 0.750000 0.250000
+vt 0.718750 0.239583
+vt 0.718750 0.250000
+vt 0.770833 0.229167
+vt 0.760417 0.229167
+vt 0.760417 0.218750
+vt 0.770833 0.218750
+vt 0.781250 0.218750
+vt 0.781250 0.229167
+vt 0.791667 0.218750
+vt 0.791667 0.229167
+vt 0.781250 0.239583
+vt 0.770833 0.239583
+vt 0.781250 0.250000
+vt 0.770833 0.250000
+vt 0.791667 0.239583
+vt 0.791667 0.250000
+vt 0.760417 0.239583
+vt 0.760417 0.250000
+vt 0.812500 0.229167
+vt 0.802083 0.229167
+vt 0.802083 0.218750
+vt 0.812500 0.218750
+vt 0.822917 0.218750
+vt 0.822917 0.229167
+vt 0.833333 0.218750
+vt 0.833333 0.229167
+vt 0.822917 0.239583
+vt 0.812500 0.239583
+vt 0.822917 0.250000
+vt 0.812500 0.250000
+vt 0.833333 0.239583
+vt 0.833333 0.250000
+vt 0.802083 0.239583
+vt 0.802083 0.250000
+vt 0.854167 0.229167
+vt 0.843750 0.229167
+vt 0.843750 0.218750
+vt 0.854167 0.218750
+vt 0.864583 0.218750
+vt 0.864583 0.229167
+vt 0.875000 0.218750
+vt 0.875000 0.229167
+vt 0.864583 0.239583
+vt 0.854167 0.239583
+vt 0.864583 0.250000
+vt 0.854167 0.250000
+vt 0.875000 0.239583
+vt 0.875000 0.250000
+vt 0.843750 0.239583
+vt 0.843750 0.250000
+vt 0.895833 0.229167
+vt 0.885417 0.229167
+vt 0.885417 0.218750
+vt 0.895833 0.218750
+vt 0.906250 0.218750
+vt 0.906250 0.229167
+vt 0.916667 0.218750
+vt 0.916667 0.229167
+vt 0.906250 0.239583
+vt 0.895833 0.239583
+vt 0.906250 0.250000
+vt 0.895833 0.250000
+vt 0.916667 0.239583
+vt 0.916667 0.250000
+vt 0.885417 0.239583
+vt 0.885417 0.250000
+vt 0.937500 0.229167
+vt 0.927083 0.229167
+vt 0.927083 0.218750
+vt 0.937500 0.218750
+vt 0.947917 0.218750
+vt 0.947917 0.229167
+vt 0.958333 0.218750
+vt 0.958333 0.229167
+vt 0.947917 0.239583
+vt 0.937500 0.239583
+vt 0.947917 0.250000
+vt 0.937500 0.250000
+vt 0.958333 0.239583
+vt 0.958333 0.250000
+vt 0.927083 0.239583
+vt 0.927083 0.250000
+vt 0.979167 0.229167
+vt 0.968750 0.229167
+vt 0.968750 0.218750
+vt 0.979167 0.218750
+vt 0.989583 0.218750
+vt 0.989583 0.229167
+vt 1.000000 0.218750
+vt 1.000000 0.229167
+vt 0.989583 0.239583
+vt 0.979167 0.239583
+vt 0.989583 0.250000
+vt 0.979167 0.250000
+vt 1.000000 0.239583
+vt 1.000000 0.250000
+vt 0.968750 0.239583
+vt 0.968750 0.250000
+vt 0.020833 0.270833
+vt 0.010417 0.270833
+vt 0.010417 0.260417
+vt 0.020833 0.260417
+vt 0.000000 0.270833
+vt 0.000000 0.260417
+vt 0.031250 0.260417
+vt 0.031250 0.270833
+vt 0.041667 0.260417
+vt 0.041667 0.270833
+vt 0.031250 0.281250
+vt 0.020833 0.281250
+vt 0.031250 0.291667
+vt 0.020833 0.291667
+vt 0.041667 0.281250
+vt 0.041667 0.291667
+vt 0.010417 0.281250
+vt 0.000000 0.281250
+vt 0.010417 0.291667
+vt 0.000000 0.291667
+vt 0.062500 0.270833
+vt 0.052083 0.270833
+vt 0.052083 0.260417
+vt 0.062500 0.260417
+vt 0.072917 0.260417
+vt 0.072917 0.270833
+vt 0.083333 0.260417
+vt 0.083333 0.270833
+vt 0.072917 0.281250
+vt 0.062500 0.281250
+vt 0.072917 0.291667
+vt 0.062500 0.291667
+vt 0.083333 0.281250
+vt 0.083333 0.291667
+vt 0.052083 0.281250
+vt 0.052083 0.291667
+vt 0.104167 0.270833
+vt 0.093750 0.270833
+vt 0.093750 0.260417
+vt 0.104167 0.260417
+vt 0.114583 0.260417
+vt 0.114583 0.270833
+vt 0.125000 0.260417
+vt 0.125000 0.270833
+vt 0.114583 0.281250
+vt 0.104167 0.281250
+vt 0.114583 0.291667
+vt 0.104167 0.291667
+vt 0.125000 0.281250
+vt 0.125000 0.291667
+vt 0.093750 0.281250
+vt 0.093750 0.291667
+vt 0.145833 0.270833
+vt 0.135417 0.270833
+vt 0.135417 0.260417
+vt 0.145833 0.260417
+vt 0.156250 0.260417
+vt 0.156250 0.270833
+vt 0.166667 0.260417
+vt 0.166667 0.270833
+vt 0.156250 0.281250
+vt 0.145833 0.281250
+vt 0.156250 0.291667
+vt 0.145833 0.291667
+vt 0.166667 0.281250
+vt 0.166667 0.291667
+vt 0.135417 0.281250
+vt 0.135417 0.291667
+vt 0.187500 0.270833
+vt 0.177083 0.270833
+vt 0.177083 0.260417
+vt 0.187500 0.260417
+vt 0.197917 0.260417
+vt 0.197917 0.270833
+vt 0.208333 0.260417
+vt 0.208333 0.270833
+vt 0.197917 0.281250
+vt 0.187500 0.281250
+vt 0.197917 0.291667
+vt 0.187500 0.291667
+vt 0.208333 0.281250
+vt 0.208333 0.291667
+vt 0.177083 0.281250
+vt 0.177083 0.291667
+vt 0.229167 0.270833
+vt 0.218750 0.270833
+vt 0.218750 0.260417
+vt 0.229167 0.260417
+vt 0.239583 0.260417
+vt 0.239583 0.270833
+vt 0.250000 0.260417
+vt 0.250000 0.270833
+vt 0.239583 0.281250
+vt 0.229167 0.281250
+vt 0.239583 0.291667
+vt 0.229167 0.291667
+vt 0.250000 0.281250
+vt 0.250000 0.291667
+vt 0.218750 0.281250
+vt 0.218750 0.291667
+vt 0.270833 0.270833
+vt 0.260417 0.270833
+vt 0.260417 0.260417
+vt 0.270833 0.260417
+vt 0.281250 0.260417
+vt 0.281250 0.270833
+vt 0.291667 0.260417
+vt 0.291667 0.270833
+vt 0.281250 0.281250
+vt 0.270833 0.281250
+vt 0.281250 0.291667
+vt 0.270833 0.291667
+vt 0.291667 0.281250
+vt 0.291667 0.291667
+vt 0.260417 0.281250
+vt 0.260417 0.291667
+vt 0.312500 0.270833
+vt 0.302083 0.270833
+vt 0.302083 0.260417
+vt 0.312500 0.260417
+vt 0.322917 0.260417
+vt 0.322917 0.270833
+vt 0.333333 0.260417
+vt 0.333333 0.270833
+vt 0.322917 0.281250
+vt 0.312500 0.281250
+vt 0.322917 0.291667
+vt 0.312500 0.291667
+vt 0.333333 0.281250
+vt 0.333333 0.291667
+vt 0.302083 0.281250
+vt 0.302083 0.291667
+vt 0.354167 0.270833
+vt 0.343750 0.270833
+vt 0.343750 0.260417
+vt 0.354167 0.260417
+vt 0.364583 0.260417
+vt 0.364583 0.270833
+vt 0.375000 0.260417
+vt 0.375000 0.270833
+vt 0.364583 0.281250
+vt 0.354167 0.281250
+vt 0.364583 0.291667
+vt 0.354167 0.291667
+vt 0.375000 0.281250
+vt 0.375000 0.291667
+vt 0.343750 0.281250
+vt 0.343750 0.291667
+vt 0.395833 0.270833
+vt 0.385417 0.270833
+vt 0.385417 0.260417
+vt 0.395833 0.260417
+vt 0.406250 0.260417
+vt 0.406250 0.270833
+vt 0.416667 0.260417
+vt 0.416667 0.270833
+vt 0.406250 0.281250
+vt 0.395833 0.281250
+vt 0.406250 0.291667
+vt 0.395833 0.291667
+vt 0.416667 0.281250
+vt 0.416667 0.291667
+vt 0.385417 0.281250
+vt 0.385417 0.291667
+vt 0.437500 0.270833
+vt 0.427083 0.270833
+vt 0.427083 0.260417
+vt 0.437500 0.260417
+vt 0.447917 0.260417
+vt 0.447917 0.270833
+vt 0.458333 0.260417
+vt 0.458333 0.270833
+vt 0.447917 0.281250
+vt 0.437500 0.281250
+vt 0.447917 0.291667
+vt 0.437500 0.291667
+vt 0.458333 0.281250
+vt 0.458333 0.291667
+vt 0.427083 0.281250
+vt 0.427083 0.291667
+vt 0.479167 0.270833
+vt 0.468750 0.270833
+vt 0.468750 0.260417
+vt 0.479167 0.260417
+vt 0.489583 0.260417
+vt 0.489583 0.270833
+vt 0.500000 0.260417
+vt 0.500000 0.270833
+vt 0.489583 0.281250
+vt 0.479167 0.281250
+vt 0.489583 0.291667
+vt 0.479167 0.291667
+vt 0.500000 0.281250
+vt 0.500000 0.291667
+vt 0.468750 0.281250
+vt 0.468750 0.291667
+vt 0.520833 0.270833
+vt 0.510417 0.270833
+vt 0.510417 0.260417
+vt 0.520833 0.260417
+vt 0.531250 0.260417
+vt 0.531250 0.270833
+vt 0.541667 0.260417
+vt 0.541667 0.270833
+vt 0.531250 0.281250
+vt 0.520833 0.281250
+vt 0.531250 0.291667
+vt 0.520833 0.291667
+vt 0.541667 0.281250
+vt 0.541667 0.291667
+vt 0.510417 0.281250
+vt 0.510417 0.291667
+vt 0.562500 0.270833
+vt 0.552083 0.270833
+vt 0.552083 0.260417
+vt 0.562500 0.260417
+vt 0.572917 0.260417
+vt 0.572917 0.270833
+vt 0.583333 0.260417
+vt 0.583333 0.270833
+vt 0.572917 0.281250
+vt 0.562500 0.281250
+vt 0.572917 0.291667
+vt 0.562500 0.291667
+vt 0.583333 0.281250
+vt 0.583333 0.291667
+vt 0.552083 0.281250
+vt 0.552083 0.291667
+vt 0.604167 0.270833
+vt 0.593750 0.270833
+vt 0.593750 0.260417
+vt 0.604167 0.260417
+vt 0.614583 0.260417
+vt 0.614583 0.270833
+vt 0.625000 0.260417
+vt 0.625000 0.270833
+vt 0.614583 0.281250
+vt 0.604167 0.281250
+vt 0.614583 0.291667
+vt 0.604167 0.291667
+vt 0.625000 0.281250
+vt 0.625000 0.291667
+vt 0.593750 0.281250
+vt 0.593750 0.291667
+vt 0.645833 0.270833
+vt 0.635417 0.270833
+vt 0.635417 0.260417
+vt 0.645833 0.260417
+vt 0.656250 0.260417
+vt 0.656250 0.270833
+vt 0.666667 0.260417
+vt 0.666667 0.270833
+vt 0.656250 0.281250
+vt 0.645833 0.281250
+vt 0.656250 0.291667
+vt 0.645833 0.291667
+vt 0.666667 0.281250
+vt 0.666667 0.291667
+vt 0.635417 0.281250
+vt 0.635417 0.291667
+vt 0.687500 0.270833
+vt 0.677083 0.270833
+vt 0.677083 0.260417
+vt 0.687500 0.260417
+vt 0.697917 0.260417
+vt 0.697917 0.270833
+vt 0.708333 0.260417
+vt 0.708333 0.270833
+vt 0.697917 0.281250
+vt 0.687500 0.281250
+vt 0.697917 0.291667
+vt 0.687500 0.291667
+vt 0.708333 0.281250
+vt 0.708333 0.291667
+vt 0.677083 0.281250
+vt 0.677083 0.291667
+vt 0.729167 0.270833
+vt 0.718750 0.270833
+vt 0.718750 0.260417
+vt 0.729167 0.260417
+vt 0.739583 0.260417
+vt 0.739583 0.270833
+vt 0.750000 0.260417
+vt 0.750000 0.270833
+vt 0.739583 0.281250
+vt 0.729167 0.281250
+vt 0.739583 0.291667
+vt 0.729167 0.291667
+vt 0.750000 0.281250
+vt 0.750000 0.291667
+vt 0.718750 0.281250
+vt 0.718750 0.291667
+vt 0.770833 0.270833
+vt 0.760417 0.270833
+vt 0.760417 0.260417
+vt 0.770833 0.260417
+vt 0.781250 0.260417
+vt 0.781250 0.270833
+vt 0.791667 0.260417
+vt 0.791667 0.270833
+vt 0.781250 0.281250
+vt 0.770833 0.281250
+vt 0.781250 0.291667
+vt 0.770833 0.291667
+vt 0.791667 0.281250
+vt 0.791667 0.291667
+vt 0.760417 0.281250
+vt 0.760417 0.291667
+vt 0.812500 0.270833
+vt 0.802083 0.270833
+vt 0.802083 0.260417
+vt 0.812500 0.260417
+vt 0.822917 0.260417
+vt 0.822917 0.270833
+vt 0.833333 0.260417
+vt 0.833333 0.270833
+vt 0.822917 0.281250
+vt 0.812500 0.281250
+vt 0.822917 0.291667
+vt 0.812500 0.291667
+vt 0.833333 0.281250
+vt 0.833333 0.291667
+vt 0.802083 0.281250
+vt 0.802083 0.291667
+vt 0.854167 0.270833
+vt 0.843750 0.270833
+vt 0.843750 0.260417
+vt 0.854167 0.260417
+vt 0.864583 0.260417
+vt 0.864583 0.270833
+vt 0.875000 0.260417
+vt 0.875000 0.270833
+vt 0.864583 0.281250
+vt 0.854167 0.281250
+vt 0.864583 0.291667
+vt 0.854167 0.291667
+vt 0.875000 0.281250
+vt 0.875000 0.291667
+vt 0.843750 0.281250
+vt 0.843750 0.291667
+vt 0.895833 0.270833
+vt 0.885417 0.270833
+vt 0.885417 0.260417
+vt 0.895833 0.260417
+vt 0.906250 0.260417
+vt 0.906250 0.270833
+vt 0.916667 0.260417
+vt 0.916667 0.270833
+vt 0.906250 0.281250
+vt 0.895833 0.281250
+vt 0.906250 0.291667
+vt 0.895833 0.291667
+vt 0.916667 0.281250
+vt 0.916667 0.291667
+vt 0.885417 0.281250
+vt 0.885417 0.291667
+vt 0.937500 0.270833
+vt 0.927083 0.270833
+vt 0.927083 0.260417
+vt 0.937500 0.260417
+vt 0.947917 0.260417
+vt 0.947917 0.270833
+vt 0.958333 0.260417
+vt 0.958333 0.270833
+vt 0.947917 0.281250
+vt 0.937500 0.281250
+vt 0.947917 0.291667
+vt 0.937500 0.291667
+vt 0.958333 0.281250
+vt 0.958333 0.291667
+vt 0.927083 0.281250
+vt 0.927083 0.291667
+vt 0.979167 0.270833
+vt 0.968750 0.270833
+vt 0.968750 0.260417
+vt 0.979167 0.260417
+vt 0.989583 0.260417
+vt 0.989583 0.270833
+vt 1.000000 0.260417
+vt 1.000000 0.270833
+vt 0.989583 0.281250
+vt 0.979167 0.281250
+vt 0.989583 0.291667
+vt 0.979167 0.291667
+vt 1.000000 0.281250
+vt 1.000000 0.291667
+vt 0.968750 0.281250
+vt 0.968750 0.291667
+vt 0.020833 0.312500
+vt 0.010417 0.312500
+vt 0.010417 0.302083
+vt 0.020833 0.302083
+vt 0.000000 0.312500
+vt 0.000000 0.302083
+vt 0.031250 0.302083
+vt 0.031250 0.312500
+vt 0.041667 0.302083
+vt 0.041667 0.312500
+vt 0.031250 0.322917
+vt 0.020833 0.322917
+vt 0.031250 0.333333
+vt 0.020833 0.333333
+vt 0.041667 0.322917
+vt 0.041667 0.333333
+vt 0.010417 0.322917
+vt 0.000000 0.322917
+vt 0.010417 0.333333
+vt 0.000000 0.333333
+vt 0.062500 0.312500
+vt 0.052083 0.312500
+vt 0.052083 0.302083
+vt 0.062500 0.302083
+vt 0.072917 0.302083
+vt 0.072917 0.312500
+vt 0.083333 0.302083
+vt 0.083333 0.312500
+vt 0.072917 0.322917
+vt 0.062500 0.322917
+vt 0.072917 0.333333
+vt 0.062500 0.333333
+vt 0.083333 0.322917
+vt 0.083333 0.333333
+vt 0.052083 0.322917
+vt 0.052083 0.333333
+vt 0.104167 0.312500
+vt 0.093750 0.312500
+vt 0.093750 0.302083
+vt 0.104167 0.302083
+vt 0.114583 0.302083
+vt 0.114583 0.312500
+vt 0.125000 0.302083
+vt 0.125000 0.312500
+vt 0.114583 0.322917
+vt 0.104167 0.322917
+vt 0.114583 0.333333
+vt 0.104167 0.333333
+vt 0.125000 0.322917
+vt 0.125000 0.333333
+vt 0.093750 0.322917
+vt 0.093750 0.333333
+vt 0.145833 0.312500
+vt 0.135417 0.312500
+vt 0.135417 0.302083
+vt 0.145833 0.302083
+vt 0.156250 0.302083
+vt 0.156250 0.312500
+vt 0.166667 0.302083
+vt 0.166667 0.312500
+vt 0.156250 0.322917
+vt 0.145833 0.322917
+vt 0.156250 0.333333
+vt 0.145833 0.333333
+vt 0.166667 0.322917
+vt 0.166667 0.333333
+vt 0.135417 0.322917
+vt 0.135417 0.333333
+vt 0.187500 0.312500
+vt 0.177083 0.312500
+vt 0.177083 0.302083
+vt 0.187500 0.302083
+vt 0.197917 0.302083
+vt 0.197917 0.312500
+vt 0.208333 0.302083
+vt 0.208333 0.312500
+vt 0.197917 0.322917
+vt 0.187500 0.322917
+vt 0.197917 0.333333
+vt 0.187500 0.333333
+vt 0.208333 0.322917
+vt 0.208333 0.333333
+vt 0.177083 0.322917
+vt 0.177083 0.333333
+vt 0.229167 0.312500
+vt 0.218750 0.312500
+vt 0.218750 0.302083
+vt 0.229167 0.302083
+vt 0.239583 0.302083
+vt 0.239583 0.312500
+vt 0.250000 0.302083
+vt 0.250000 0.312500
+vt 0.239583 0.322917
+vt 0.229167 0.322917
+vt 0.239583 0.333333
+vt 0.229167 0.333333
+vt 0.250000 0.322917
+vt 0.250000 0.333333
+vt 0.218750 0.322917
+vt 0.218750 0.333333
+vt 0.270833 0.312500
+vt 0.260417 0.312500
+vt 0.260417 0.302083
+vt 0.270833 0.302083
+vt 0.281250 0.302083
+vt 0.281250 0.312500
+vt 0.291667 0.302083
+vt 0.291667 0.312500
+vt 0.281250 0.322917
+vt 0.270833 0.322917
+vt 0.281250 0.333333
+vt 0.270833 0.333333
+vt 0.291667 0.322917
+vt 0.291667 0.333333
+vt 0.260417 0.322917
+vt 0.260417 0.333333
+vt 0.312500 0.312500
+vt 0.302083 0.312500
+vt 0.302083 0.302083
+vt 0.312500 0.302083
+vt 0.322917 0.302083
+vt 0.322917 0.312500
+vt 0.333333 0.302083
+vt 0.333333 0.312500
+vt 0.322917 0.322917
+vt 0.312500 0.322917
+vt 0.322917 0.333333
+vt 0.312500 0.333333
+vt 0.333333 0.322917
+vt 0.333333 0.333333
+vt 0.302083 0.322917
+vt 0.302083 0.333333
+vt 0.354167 0.312500
+vt 0.343750 0.312500
+vt 0.343750 0.302083
+vt 0.354167 0.302083
+vt 0.364583 0.302083
+vt 0.364583 0.312500
+vt 0.375000 0.302083
+vt 0.375000 0.312500
+vt 0.364583 0.322917
+vt 0.354167 0.322917
+vt 0.364583 0.333333
+vt 0.354167 0.333333
+vt 0.375000 0.322917
+vt 0.343750 0.322917
+vt 0.343750 0.333333
+vt 0.395833 0.312500
+vt 0.385417 0.312500
+vt 0.385417 0.302083
+vt 0.395833 0.302083
+vt 0.406250 0.302083
+vt 0.406250 0.312500
+vt 0.416667 0.302083
+vt 0.416667 0.312500
+vt 0.406250 0.322917
+vt 0.395833 0.322917
+vt 0.406250 0.333333
+vt 0.395833 0.333333
+vt 0.416667 0.322917
+vt 0.416667 0.333333
+vt 0.385417 0.322917
+vt 0.385417 0.333333
+vt 0.437500 0.312500
+vt 0.427083 0.312500
+vt 0.427083 0.302083
+vt 0.437500 0.302083
+vt 0.447917 0.302083
+vt 0.447917 0.312500
+vt 0.458333 0.302083
+vt 0.458333 0.312500
+vt 0.447917 0.322917
+vt 0.437500 0.322917
+vt 0.447917 0.333333
+vt 0.437500 0.333333
+vt 0.458333 0.322917
+vt 0.458333 0.333333
+vt 0.427083 0.322917
+vt 0.427083 0.333333
+vt 0.479167 0.312500
+vt 0.468750 0.312500
+vt 0.468750 0.302083
+vt 0.479167 0.302083
+vt 0.489583 0.302083
+vt 0.489583 0.312500
+vt 0.500000 0.302083
+vt 0.500000 0.312500
+vt 0.489583 0.322917
+vt 0.479167 0.322917
+vt 0.489583 0.333333
+vt 0.479167 0.333333
+vt 0.500000 0.322917
+vt 0.500000 0.333333
+vt 0.468750 0.322917
+vt 0.468750 0.333333
+vt 0.520833 0.312500
+vt 0.510417 0.312500
+vt 0.510417 0.302083
+vt 0.520833 0.302083
+vt 0.531250 0.302083
+vt 0.531250 0.312500
+vt 0.541667 0.302083
+vt 0.541667 0.312500
+vt 0.531250 0.322917
+vt 0.520833 0.322917
+vt 0.531250 0.333333
+vt 0.520833 0.333333
+vt 0.541667 0.322917
+vt 0.541667 0.333333
+vt 0.510417 0.322917
+vt 0.510417 0.333333
+vt 0.562500 0.312500
+vt 0.552083 0.312500
+vt 0.552083 0.302083
+vt 0.562500 0.302083
+vt 0.572917 0.302083
+vt 0.572917 0.312500
+vt 0.583333 0.302083
+vt 0.583333 0.312500
+vt 0.572917 0.322917
+vt 0.562500 0.322917
+vt 0.572917 0.333333
+vt 0.562500 0.333333
+vt 0.583333 0.322917
+vt 0.583333 0.333333
+vt 0.552083 0.322917
+vt 0.552083 0.333333
+vt 0.604167 0.312500
+vt 0.593750 0.312500
+vt 0.593750 0.302083
+vt 0.604167 0.302083
+vt 0.614583 0.302083
+vt 0.614583 0.312500
+vt 0.625000 0.302083
+vt 0.625000 0.312500
+vt 0.614583 0.322917
+vt 0.604167 0.322917
+vt 0.614583 0.333333
+vt 0.604167 0.333333
+vt 0.625000 0.322917
+vt 0.625000 0.333333
+vt 0.593750 0.322917
+vt 0.593750 0.333333
+vt 0.645833 0.312500
+vt 0.635417 0.312500
+vt 0.635417 0.302083
+vt 0.645833 0.302083
+vt 0.656250 0.302083
+vt 0.656250 0.312500
+vt 0.666667 0.302083
+vt 0.666667 0.312500
+vt 0.656250 0.322917
+vt 0.645833 0.322917
+vt 0.656250 0.333333
+vt 0.645833 0.333333
+vt 0.666667 0.322917
+vt 0.666667 0.333333
+vt 0.635417 0.322917
+vt 0.635417 0.333333
+vt 0.687500 0.312500
+vt 0.677083 0.312500
+vt 0.677083 0.302083
+vt 0.687500 0.302083
+vt 0.697917 0.302083
+vt 0.697917 0.312500
+vt 0.708333 0.302083
+vt 0.708333 0.312500
+vt 0.697917 0.322917
+vt 0.687500 0.322917
+vt 0.697917 0.333333
+vt 0.687500 0.333333
+vt 0.708333 0.322917
+vt 0.708333 0.333333
+vt 0.677083 0.322917
+vt 0.677083 0.333333
+vt 0.729167 0.312500
+vt 0.718750 0.312500
+vt 0.718750 0.302083
+vt 0.729167 0.302083
+vt 0.739583 0.302083
+vt 0.739583 0.312500
+vt 0.750000 0.302083
+vt 0.750000 0.312500
+vt 0.739583 0.322917
+vt 0.729167 0.322917
+vt 0.739583 0.333333
+vt 0.729167 0.333333
+vt 0.750000 0.322917
+vt 0.750000 0.333333
+vt 0.718750 0.322917
+vt 0.718750 0.333333
+vt 0.770833 0.312500
+vt 0.760417 0.312500
+vt 0.760417 0.302083
+vt 0.770833 0.302083
+vt 0.781250 0.302083
+vt 0.781250 0.312500
+vt 0.791667 0.302083
+vt 0.791667 0.312500
+vt 0.781250 0.322917
+vt 0.770833 0.322917
+vt 0.781250 0.333333
+vt 0.770833 0.333333
+vt 0.791667 0.322917
+vt 0.791667 0.333333
+vt 0.760417 0.322917
+vt 0.760417 0.333333
+vt 0.812500 0.312500
+vt 0.802083 0.312500
+vt 0.802083 0.302083
+vt 0.812500 0.302083
+vt 0.822917 0.302083
+vt 0.822917 0.312500
+vt 0.833333 0.302083
+vt 0.833333 0.312500
+vt 0.822917 0.322917
+vt 0.812500 0.322917
+vt 0.822917 0.333333
+vt 0.812500 0.333333
+vt 0.833333 0.322917
+vt 0.833333 0.333333
+vt 0.802083 0.322917
+vt 0.802083 0.333333
+vt 0.854167 0.312500
+vt 0.843750 0.312500
+vt 0.843750 0.302083
+vt 0.854167 0.302083
+vt 0.864583 0.302083
+vt 0.864583 0.312500
+vt 0.875000 0.302083
+vt 0.875000 0.312500
+vt 0.864583 0.322917
+vt 0.854167 0.322917
+vt 0.864583 0.333333
+vt 0.854167 0.333333
+vt 0.875000 0.322917
+vt 0.875000 0.333333
+vt 0.843750 0.322917
+vt 0.843750 0.333333
+vt 0.895833 0.312500
+vt 0.885417 0.312500
+vt 0.885417 0.302083
+vt 0.895833 0.302083
+vt 0.906250 0.302083
+vt 0.906250 0.312500
+vt 0.916667 0.302083
+vt 0.916667 0.312500
+vt 0.906250 0.322917
+vt 0.895833 0.322917
+vt 0.906250 0.333333
+vt 0.895833 0.333333
+vt 0.916667 0.322917
+vt 0.916667 0.333333
+vt 0.885417 0.322917
+vt 0.885417 0.333333
+vt 0.937500 0.312500
+vt 0.927083 0.312500
+vt 0.927083 0.302083
+vt 0.937500 0.302083
+vt 0.947917 0.302083
+vt 0.947917 0.312500
+vt 0.958333 0.302083
+vt 0.958333 0.312500
+vt 0.947917 0.322917
+vt 0.937500 0.322917
+vt 0.947917 0.333333
+vt 0.937500 0.333333
+vt 0.958333 0.322917
+vt 0.958333 0.333333
+vt 0.927083 0.322917
+vt 0.927083 0.333333
+vt 0.979167 0.312500
+vt 0.968750 0.312500
+vt 0.968750 0.302083
+vt 0.979167 0.302083
+vt 0.989583 0.302083
+vt 0.989583 0.312500
+vt 1.000000 0.302083
+vt 1.000000 0.312500
+vt 0.989583 0.322917
+vt 0.979167 0.322917
+vt 0.989583 0.333333
+vt 0.979167 0.333333
+vt 1.000000 0.322917
+vt 1.000000 0.333333
+vt 0.968750 0.322917
+vt 0.968750 0.333333
+vt 0.020833 0.354167
+vt 0.010417 0.354167
+vt 0.010417 0.343750
+vt 0.020833 0.343750
+vt 0.000000 0.354167
+vt 0.000000 0.343750
+vt 0.031250 0.343750
+vt 0.031250 0.354167
+vt 0.041667 0.343750
+vt 0.041667 0.354167
+vt 0.031250 0.364583
+vt 0.020833 0.364583
+vt 0.031250 0.375000
+vt 0.020833 0.375000
+vt 0.041667 0.364583
+vt 0.041667 0.375000
+vt 0.010417 0.364583
+vt 0.000000 0.364583
+vt 0.010417 0.375000
+vt 0.000000 0.375000
+vt 0.062500 0.354167
+vt 0.052083 0.354167
+vt 0.052083 0.343750
+vt 0.062500 0.343750
+vt 0.072917 0.343750
+vt 0.072917 0.354167
+vt 0.083333 0.343750
+vt 0.083333 0.354167
+vt 0.072917 0.364583
+vt 0.062500 0.364583
+vt 0.072917 0.375000
+vt 0.062500 0.375000
+vt 0.083333 0.364583
+vt 0.083333 0.375000
+vt 0.052083 0.364583
+vt 0.052083 0.375000
+vt 0.104167 0.354167
+vt 0.093750 0.354167
+vt 0.093750 0.343750
+vt 0.104167 0.343750
+vt 0.114583 0.343750
+vt 0.114583 0.354167
+vt 0.125000 0.343750
+vt 0.125000 0.354167
+vt 0.114583 0.364583
+vt 0.104167 0.364583
+vt 0.114583 0.375000
+vt 0.104167 0.375000
+vt 0.125000 0.364583
+vt 0.125000 0.375000
+vt 0.093750 0.364583
+vt 0.093750 0.375000
+vt 0.145833 0.354167
+vt 0.135417 0.354167
+vt 0.135417 0.343750
+vt 0.145833 0.343750
+vt 0.156250 0.343750
+vt 0.156250 0.354167
+vt 0.166667 0.343750
+vt 0.166667 0.354167
+vt 0.156250 0.364583
+vt 0.145833 0.364583
+vt 0.156250 0.375000
+vt 0.145833 0.375000
+vt 0.166667 0.364583
+vt 0.166667 0.375000
+vt 0.135417 0.364583
+vt 0.135417 0.375000
+vt 0.187500 0.354167
+vt 0.177083 0.354167
+vt 0.177083 0.343750
+vt 0.187500 0.343750
+vt 0.197917 0.343750
+vt 0.197917 0.354167
+vt 0.208333 0.343750
+vt 0.208333 0.354167
+vt 0.197917 0.364583
+vt 0.187500 0.364583
+vt 0.197917 0.375000
+vt 0.187500 0.375000
+vt 0.208333 0.364583
+vt 0.208333 0.375000
+vt 0.177083 0.364583
+vt 0.177083 0.375000
+vt 0.229167 0.354167
+vt 0.218750 0.354167
+vt 0.218750 0.343750
+vt 0.229167 0.343750
+vt 0.239583 0.343750
+vt 0.239583 0.354167
+vt 0.250000 0.343750
+vt 0.250000 0.354167
+vt 0.239583 0.364583
+vt 0.229167 0.364583
+vt 0.239583 0.375000
+vt 0.229167 0.375000
+vt 0.250000 0.364583
+vt 0.250000 0.375000
+vt 0.218750 0.364583
+vt 0.218750 0.375000
+vt 0.270833 0.354167
+vt 0.260417 0.354167
+vt 0.260417 0.343750
+vt 0.270833 0.343750
+vt 0.281250 0.343750
+vt 0.281250 0.354167
+vt 0.291667 0.343750
+vt 0.291667 0.354167
+vt 0.281250 0.364583
+vt 0.270833 0.364583
+vt 0.281250 0.375000
+vt 0.270833 0.375000
+vt 0.291667 0.364583
+vt 0.291667 0.375000
+vt 0.260417 0.364583
+vt 0.260417 0.375000
+vt 0.312500 0.354167
+vt 0.302083 0.354167
+vt 0.302083 0.343750
+vt 0.312500 0.343750
+vt 0.322917 0.343750
+vt 0.322917 0.354167
+vt 0.333333 0.343750
+vt 0.333333 0.354167
+vt 0.322917 0.364583
+vt 0.312500 0.364583
+vt 0.322917 0.375000
+vt 0.312500 0.375000
+vt 0.333333 0.364583
+vt 0.333333 0.375000
+vt 0.302083 0.364583
+vt 0.302083 0.375000
+vt 0.354167 0.354167
+vt 0.343750 0.354167
+vt 0.343750 0.343750
+vt 0.354167 0.343750
+vt 0.364583 0.343750
+vt 0.364583 0.354167
+vt 0.375000 0.343750
+vt 0.375000 0.354167
+vt 0.364583 0.364583
+vt 0.354167 0.364583
+vt 0.364583 0.375000
+vt 0.354167 0.375000
+vt 0.375000 0.364583
+vt 0.375000 0.375000
+vt 0.343750 0.364583
+vt 0.343750 0.375000
+vt 0.395833 0.354167
+vt 0.385417 0.354167
+vt 0.385417 0.343750
+vt 0.395833 0.343750
+vt 0.406250 0.343750
+vt 0.406250 0.354167
+vt 0.416667 0.343750
+vt 0.416667 0.354167
+vt 0.406250 0.364583
+vt 0.395833 0.364583
+vt 0.406250 0.375000
+vt 0.395833 0.375000
+vt 0.416667 0.364583
+vt 0.416667 0.375000
+vt 0.385417 0.364583
+vt 0.385417 0.375000
+vt 0.437500 0.354167
+vt 0.427083 0.354167
+vt 0.427083 0.343750
+vt 0.437500 0.343750
+vt 0.447917 0.343750
+vt 0.447917 0.354167
+vt 0.458333 0.343750
+vt 0.458333 0.354167
+vt 0.447917 0.364583
+vt 0.437500 0.364583
+vt 0.447917 0.375000
+vt 0.437500 0.375000
+vt 0.458333 0.364583
+vt 0.458333 0.375000
+vt 0.427083 0.364583
+vt 0.427083 0.375000
+vt 0.479167 0.354167
+vt 0.468750 0.354167
+vt 0.468750 0.343750
+vt 0.479167 0.343750
+vt 0.489583 0.343750
+vt 0.489583 0.354167
+vt 0.500000 0.343750
+vt 0.500000 0.354167
+vt 0.489583 0.364583
+vt 0.479167 0.364583
+vt 0.489583 0.375000
+vt 0.479167 0.375000
+vt 0.500000 0.364583
+vt 0.500000 0.375000
+vt 0.468750 0.364583
+vt 0.468750 0.375000
+vt 0.520833 0.354167
+vt 0.510417 0.354167
+vt 0.510417 0.343750
+vt 0.520833 0.343750
+vt 0.531250 0.343750
+vt 0.531250 0.354167
+vt 0.541667 0.343750
+vt 0.541667 0.354167
+vt 0.531250 0.364583
+vt 0.520833 0.364583
+vt 0.531250 0.375000
+vt 0.520833 0.375000
+vt 0.541667 0.364583
+vt 0.541667 0.375000
+vt 0.510417 0.364583
+vt 0.510417 0.375000
+vt 0.562500 0.354167
+vt 0.552083 0.354167
+vt 0.552083 0.343750
+vt 0.562500 0.343750
+vt 0.572917 0.343750
+vt 0.572917 0.354167
+vt 0.583333 0.343750
+vt 0.583333 0.354167
+vt 0.572917 0.364583
+vt 0.562500 0.364583
+vt 0.572917 0.375000
+vt 0.562500 0.375000
+vt 0.583333 0.364583
+vt 0.583333 0.375000
+vt 0.552083 0.364583
+vt 0.552083 0.375000
+vt 0.604167 0.354167
+vt 0.593750 0.354167
+vt 0.593750 0.343750
+vt 0.604167 0.343750
+vt 0.614583 0.343750
+vt 0.614583 0.354167
+vt 0.625000 0.343750
+vt 0.625000 0.354167
+vt 0.614583 0.364583
+vt 0.604167 0.364583
+vt 0.614583 0.375000
+vt 0.604167 0.375000
+vt 0.625000 0.364583
+vt 0.625000 0.375000
+vt 0.593750 0.364583
+vt 0.593750 0.375000
+vt 0.645833 0.354167
+vt 0.635417 0.354167
+vt 0.635417 0.343750
+vt 0.645833 0.343750
+vt 0.656250 0.343750
+vt 0.656250 0.354167
+vt 0.666667 0.343750
+vt 0.666667 0.354167
+vt 0.656250 0.364583
+vt 0.645833 0.364583
+vt 0.656250 0.375000
+vt 0.645833 0.375000
+vt 0.666667 0.364583
+vt 0.666667 0.375000
+vt 0.635417 0.364583
+vt 0.635417 0.375000
+vt 0.687500 0.354167
+vt 0.677083 0.354167
+vt 0.677083 0.343750
+vt 0.687500 0.343750
+vt 0.697917 0.343750
+vt 0.697917 0.354167
+vt 0.708333 0.343750
+vt 0.708333 0.354167
+vt 0.697917 0.364583
+vt 0.687500 0.364583
+vt 0.697917 0.375000
+vt 0.687500 0.375000
+vt 0.708333 0.364583
+vt 0.708333 0.375000
+vt 0.677083 0.364583
+vt 0.677083 0.375000
+vt 0.729167 0.354167
+vt 0.718750 0.354167
+vt 0.718750 0.343750
+vt 0.729167 0.343750
+vt 0.739583 0.343750
+vt 0.739583 0.354167
+vt 0.750000 0.343750
+vt 0.750000 0.354167
+vt 0.739583 0.364583
+vt 0.729167 0.364583
+vt 0.739583 0.375000
+vt 0.729167 0.375000
+vt 0.750000 0.364583
+vt 0.750000 0.375000
+vt 0.718750 0.364583
+vt 0.718750 0.375000
+vt 0.770833 0.354167
+vt 0.760417 0.354167
+vt 0.760417 0.343750
+vt 0.770833 0.343750
+vt 0.781250 0.343750
+vt 0.781250 0.354167
+vt 0.791667 0.343750
+vt 0.791667 0.354167
+vt 0.781250 0.364583
+vt 0.770833 0.364583
+vt 0.781250 0.375000
+vt 0.770833 0.375000
+vt 0.791667 0.364583
+vt 0.791667 0.375000
+vt 0.760417 0.364583
+vt 0.760417 0.375000
+vt 0.812500 0.354167
+vt 0.802083 0.354167
+vt 0.802083 0.343750
+vt 0.812500 0.343750
+vt 0.822917 0.343750
+vt 0.822917 0.354167
+vt 0.833333 0.343750
+vt 0.833333 0.354167
+vt 0.822917 0.364583
+vt 0.812500 0.364583
+vt 0.822917 0.375000
+vt 0.812500 0.375000
+vt 0.833333 0.364583
+vt 0.833333 0.375000
+vt 0.802083 0.364583
+vt 0.802083 0.375000
+vt 0.854167 0.354167
+vt 0.843750 0.354167
+vt 0.843750 0.343750
+vt 0.854167 0.343750
+vt 0.864583 0.343750
+vt 0.864583 0.354167
+vt 0.875000 0.343750
+vt 0.875000 0.354167
+vt 0.864583 0.364583
+vt 0.854167 0.364583
+vt 0.864583 0.375000
+vt 0.854167 0.375000
+vt 0.875000 0.364583
+vt 0.875000 0.375000
+vt 0.843750 0.364583
+vt 0.843750 0.375000
+vt 0.895833 0.354167
+vt 0.885417 0.354167
+vt 0.885417 0.343750
+vt 0.895833 0.343750
+vt 0.906250 0.343750
+vt 0.906250 0.354167
+vt 0.916667 0.343750
+vt 0.916667 0.354167
+vt 0.906250 0.364583
+vt 0.895833 0.364583
+vt 0.906250 0.375000
+vt 0.895833 0.375000
+vt 0.916667 0.364583
+vt 0.916667 0.375000
+vt 0.885417 0.364583
+vt 0.885417 0.375000
+vt 0.937500 0.354167
+vt 0.927083 0.354167
+vt 0.927083 0.343750
+vt 0.937500 0.343750
+vt 0.947917 0.343750
+vt 0.947917 0.354167
+vt 0.958333 0.343750
+vt 0.958333 0.354167
+vt 0.947917 0.364583
+vt 0.937500 0.364583
+vt 0.947917 0.375000
+vt 0.937500 0.375000
+vt 0.958333 0.364583
+vt 0.958333 0.375000
+vt 0.927083 0.364583
+vt 0.927083 0.375000
+vt 0.979167 0.354167
+vt 0.968750 0.354167
+vt 0.968750 0.343750
+vt 0.979167 0.343750
+vt 0.989583 0.343750
+vt 0.989583 0.354167
+vt 1.000000 0.343750
+vt 1.000000 0.354167
+vt 0.989583 0.364583
+vt 0.979167 0.364583
+vt 0.989583 0.375000
+vt 0.979167 0.375000
+vt 1.000000 0.364583
+vt 1.000000 0.375000
+vt 0.968750 0.364583
+vt 0.968750 0.375000
+vt 0.020833 0.395833
+vt 0.010417 0.395833
+vt 0.010417 0.385417
+vt 0.020833 0.385417
+vt 0.000000 0.395833
+vt 0.000000 0.385417
+vt 0.031250 0.385417
+vt 0.031250 0.395833
+vt 0.041667 0.385417
+vt 0.041667 0.395833
+vt 0.031250 0.406250
+vt 0.020833 0.406250
+vt 0.031250 0.416667
+vt 0.020833 0.416667
+vt 0.041667 0.406250
+vt 0.041667 0.416667
+vt 0.010417 0.406250
+vt 0.000000 0.406250
+vt 0.010417 0.416667
+vt 0.000000 0.416667
+vt 0.062500 0.395833
+vt 0.052083 0.395833
+vt 0.052083 0.385417
+vt 0.062500 0.385417
+vt 0.072917 0.385417
+vt 0.072917 0.395833
+vt 0.083333 0.385417
+vt 0.083333 0.395833
+vt 0.072917 0.406250
+vt 0.062500 0.406250
+vt 0.072917 0.416667
+vt 0.062500 0.416667
+vt 0.083333 0.406250
+vt 0.083333 0.416667
+vt 0.052083 0.406250
+vt 0.052083 0.416667
+vt 0.104167 0.395833
+vt 0.093750 0.395833
+vt 0.093750 0.385417
+vt 0.104167 0.385417
+vt 0.114583 0.385417
+vt 0.114583 0.395833
+vt 0.125000 0.385417
+vt 0.125000 0.395833
+vt 0.114583 0.406250
+vt 0.104167 0.406250
+vt 0.114583 0.416667
+vt 0.104167 0.416667
+vt 0.125000 0.406250
+vt 0.125000 0.416667
+vt 0.093750 0.406250
+vt 0.093750 0.416667
+vt 0.145833 0.395833
+vt 0.135417 0.395833
+vt 0.135417 0.385417
+vt 0.145833 0.385417
+vt 0.156250 0.385417
+vt 0.156250 0.395833
+vt 0.166667 0.385417
+vt 0.166667 0.395833
+vt 0.156250 0.406250
+vt 0.145833 0.406250
+vt 0.156250 0.416667
+vt 0.145833 0.416667
+vt 0.166667 0.406250
+vt 0.166667 0.416667
+vt 0.135417 0.406250
+vt 0.135417 0.416667
+vt 0.187500 0.395833
+vt 0.177083 0.395833
+vt 0.177083 0.385417
+vt 0.187500 0.385417
+vt 0.197917 0.385417
+vt 0.197917 0.395833
+vt 0.208333 0.385417
+vt 0.208333 0.395833
+vt 0.197917 0.406250
+vt 0.187500 0.406250
+vt 0.197917 0.416667
+vt 0.187500 0.416667
+vt 0.208333 0.406250
+vt 0.208333 0.416667
+vt 0.177083 0.406250
+vt 0.177083 0.416667
+vt 0.229167 0.395833
+vt 0.218750 0.395833
+vt 0.218750 0.385417
+vt 0.229167 0.385417
+vt 0.239583 0.385417
+vt 0.239583 0.395833
+vt 0.250000 0.385417
+vt 0.250000 0.395833
+vt 0.239583 0.406250
+vt 0.229167 0.406250
+vt 0.239583 0.416667
+vt 0.229167 0.416667
+vt 0.250000 0.406250
+vt 0.250000 0.416667
+vt 0.218750 0.406250
+vt 0.218750 0.416667
+vt 0.270833 0.395833
+vt 0.260417 0.395833
+vt 0.260417 0.385417
+vt 0.270833 0.385417
+vt 0.281250 0.385417
+vt 0.281250 0.395833
+vt 0.291667 0.385417
+vt 0.291667 0.395833
+vt 0.281250 0.406250
+vt 0.270833 0.406250
+vt 0.281250 0.416667
+vt 0.270833 0.416667
+vt 0.291667 0.406250
+vt 0.291667 0.416667
+vt 0.260417 0.406250
+vt 0.260417 0.416667
+vt 0.312500 0.395833
+vt 0.302083 0.395833
+vt 0.302083 0.385417
+vt 0.312500 0.385417
+vt 0.322917 0.385417
+vt 0.322917 0.395833
+vt 0.333333 0.385417
+vt 0.333333 0.395833
+vt 0.322917 0.406250
+vt 0.312500 0.406250
+vt 0.322917 0.416667
+vt 0.312500 0.416667
+vt 0.333333 0.406250
+vt 0.333333 0.416667
+vt 0.302083 0.406250
+vt 0.302083 0.416667
+vt 0.354167 0.395833
+vt 0.343750 0.395833
+vt 0.343750 0.385417
+vt 0.354167 0.385417
+vt 0.364583 0.385417
+vt 0.364583 0.395833
+vt 0.375000 0.385417
+vt 0.375000 0.395833
+vt 0.364583 0.406250
+vt 0.354167 0.406250
+vt 0.364583 0.416667
+vt 0.354167 0.416667
+vt 0.375000 0.406250
+vt 0.375000 0.416667
+vt 0.343750 0.406250
+vt 0.343750 0.416667
+vt 0.395833 0.395833
+vt 0.385417 0.395833
+vt 0.385417 0.385417
+vt 0.395833 0.385417
+vt 0.406250 0.385417
+vt 0.406250 0.395833
+vt 0.416667 0.385417
+vt 0.416667 0.395833
+vt 0.406250 0.406250
+vt 0.395833 0.406250
+vt 0.406250 0.416667
+vt 0.395833 0.416667
+vt 0.416667 0.406250
+vt 0.416667 0.416667
+vt 0.385417 0.406250
+vt 0.385417 0.416667
+vt 0.437500 0.395833
+vt 0.427083 0.395833
+vt 0.427083 0.385417
+vt 0.437500 0.385417
+vt 0.447917 0.385417
+vt 0.447917 0.395833
+vt 0.458333 0.385417
+vt 0.458333 0.395833
+vt 0.447917 0.406250
+vt 0.437500 0.406250
+vt 0.447917 0.416667
+vt 0.437500 0.416667
+vt 0.458333 0.406250
+vt 0.458333 0.416667
+vt 0.427083 0.406250
+vt 0.427083 0.416667
+vt 0.479167 0.395833
+vt 0.468750 0.395833
+vt 0.468750 0.385417
+vt 0.479167 0.385417
+vt 0.489583 0.385417
+vt 0.489583 0.395833
+vt 0.500000 0.385417
+vt 0.500000 0.395833
+vt 0.489583 0.406250
+vt 0.479167 0.406250
+vt 0.489583 0.416667
+vt 0.479167 0.416667
+vt 0.500000 0.406250
+vt 0.500000 0.416667
+vt 0.468750 0.406250
+vt 0.468750 0.416667
+vt 0.520833 0.395833
+vt 0.510417 0.395833
+vt 0.510417 0.385417
+vt 0.520833 0.385417
+vt 0.531250 0.385417
+vt 0.531250 0.395833
+vt 0.541667 0.385417
+vt 0.541667 0.395833
+vt 0.531250 0.406250
+vt 0.520833 0.406250
+vt 0.531250 0.416667
+vt 0.520833 0.416667
+vt 0.541667 0.406250
+vt 0.541667 0.416667
+vt 0.510417 0.406250
+vt 0.510417 0.416667
+vt 0.562500 0.395833
+vt 0.552083 0.395833
+vt 0.552083 0.385417
+vt 0.562500 0.385417
+vt 0.572917 0.385417
+vt 0.572917 0.395833
+vt 0.583333 0.385417
+vt 0.583333 0.395833
+vt 0.572917 0.406250
+vt 0.562500 0.406250
+vt 0.572917 0.416667
+vt 0.562500 0.416667
+vt 0.583333 0.406250
+vt 0.583333 0.416667
+vt 0.552083 0.406250
+vt 0.552083 0.416667
+vt 0.604167 0.395833
+vt 0.593750 0.395833
+vt 0.593750 0.385417
+vt 0.604167 0.385417
+vt 0.614583 0.385417
+vt 0.614583 0.395833
+vt 0.625000 0.385417
+vt 0.625000 0.395833
+vt 0.614583 0.406250
+vt 0.604167 0.406250
+vt 0.614583 0.416667
+vt 0.604167 0.416667
+vt 0.625000 0.406250
+vt 0.625000 0.416667
+vt 0.593750 0.406250
+vt 0.593750 0.416667
+vt 0.645833 0.395833
+vt 0.635417 0.395833
+vt 0.635417 0.385417
+vt 0.645833 0.385417
+vt 0.656250 0.385417
+vt 0.656250 0.395833
+vt 0.666667 0.385417
+vt 0.666667 0.395833
+vt 0.656250 0.406250
+vt 0.645833 0.406250
+vt 0.656250 0.416667
+vt 0.645833 0.416667
+vt 0.666667 0.406250
+vt 0.666667 0.416667
+vt 0.635417 0.406250
+vt 0.635417 0.416667
+vt 0.687500 0.395833
+vt 0.677083 0.395833
+vt 0.677083 0.385417
+vt 0.687500 0.385417
+vt 0.697917 0.385417
+vt 0.697917 0.395833
+vt 0.708333 0.385417
+vt 0.708333 0.395833
+vt 0.697917 0.406250
+vt 0.687500 0.406250
+vt 0.697917 0.416667
+vt 0.687500 0.416667
+vt 0.708333 0.406250
+vt 0.708333 0.416667
+vt 0.677083 0.406250
+vt 0.677083 0.416667
+vt 0.729167 0.395833
+vt 0.718750 0.395833
+vt 0.718750 0.385417
+vt 0.729167 0.385417
+vt 0.739583 0.385417
+vt 0.739583 0.395833
+vt 0.750000 0.385417
+vt 0.750000 0.395833
+vt 0.739583 0.406250
+vt 0.729167 0.406250
+vt 0.739583 0.416667
+vt 0.729167 0.416667
+vt 0.750000 0.406250
+vt 0.750000 0.416667
+vt 0.718750 0.406250
+vt 0.718750 0.416667
+vt 0.770833 0.395833
+vt 0.760417 0.395833
+vt 0.760417 0.385417
+vt 0.770833 0.385417
+vt 0.781250 0.385417
+vt 0.781250 0.395833
+vt 0.791667 0.385417
+vt 0.791667 0.395833
+vt 0.781250 0.406250
+vt 0.770833 0.406250
+vt 0.781250 0.416667
+vt 0.770833 0.416667
+vt 0.791667 0.406250
+vt 0.791667 0.416667
+vt 0.760417 0.406250
+vt 0.760417 0.416667
+vt 0.812500 0.395833
+vt 0.802083 0.395833
+vt 0.802083 0.385417
+vt 0.812500 0.385417
+vt 0.822917 0.385417
+vt 0.822917 0.395833
+vt 0.833333 0.385417
+vt 0.833333 0.395833
+vt 0.822917 0.406250
+vt 0.812500 0.406250
+vt 0.822917 0.416667
+vt 0.812500 0.416667
+vt 0.833333 0.406250
+vt 0.833333 0.416667
+vt 0.802083 0.406250
+vt 0.802083 0.416667
+vt 0.854167 0.395833
+vt 0.843750 0.395833
+vt 0.843750 0.385417
+vt 0.854167 0.385417
+vt 0.864583 0.385417
+vt 0.864583 0.395833
+vt 0.875000 0.385417
+vt 0.875000 0.395833
+vt 0.864583 0.406250
+vt 0.854167 0.406250
+vt 0.864583 0.416667
+vt 0.854167 0.416667
+vt 0.875000 0.406250
+vt 0.875000 0.416667
+vt 0.843750 0.406250
+vt 0.843750 0.416667
+vt 0.895833 0.395833
+vt 0.885417 0.395833
+vt 0.885417 0.385417
+vt 0.895833 0.385417
+vt 0.906250 0.385417
+vt 0.906250 0.395833
+vt 0.916667 0.385417
+vt 0.916667 0.395833
+vt 0.906250 0.406250
+vt 0.895833 0.406250
+vt 0.906250 0.416667
+vt 0.895833 0.416667
+vt 0.916667 0.406250
+vt 0.916667 0.416667
+vt 0.885417 0.406250
+vt 0.885417 0.416667
+vt 0.937500 0.395833
+vt 0.927083 0.395833
+vt 0.927083 0.385417
+vt 0.937500 0.385417
+vt 0.947917 0.385417
+vt 0.947917 0.395833
+vt 0.958333 0.385417
+vt 0.958333 0.395833
+vt 0.947917 0.406250
+vt 0.937500 0.406250
+vt 0.947917 0.416667
+vt 0.937500 0.416667
+vt 0.958333 0.406250
+vt 0.958333 0.416667
+vt 0.927083 0.406250
+vt 0.927083 0.416667
+vt 0.979167 0.395833
+vt 0.968750 0.395833
+vt 0.968750 0.385417
+vt 0.979167 0.385417
+vt 0.989583 0.385417
+vt 0.989583 0.395833
+vt 1.000000 0.385417
+vt 1.000000 0.395833
+vt 0.989583 0.406250
+vt 0.979167 0.406250
+vt 0.989583 0.416667
+vt 0.979167 0.416667
+vt 1.000000 0.406250
+vt 1.000000 0.416667
+vt 0.968750 0.406250
+vt 0.968750 0.416667
+vt 0.020833 0.437500
+vt 0.010417 0.437500
+vt 0.010417 0.427083
+vt 0.020833 0.427083
+vt 0.000000 0.437500
+vt 0.000000 0.427083
+vt 0.031250 0.427083
+vt 0.031250 0.437500
+vt 0.041667 0.427083
+vt 0.041667 0.437500
+vt 0.031250 0.447917
+vt 0.020833 0.447917
+vt 0.031250 0.458333
+vt 0.020833 0.458333
+vt 0.041667 0.447917
+vt 0.041667 0.458333
+vt 0.010417 0.447917
+vt 0.000000 0.447917
+vt 0.010417 0.458333
+vt 0.000000 0.458333
+vt 0.062500 0.437500
+vt 0.052083 0.437500
+vt 0.052083 0.427083
+vt 0.062500 0.427083
+vt 0.072917 0.427083
+vt 0.072917 0.437500
+vt 0.083333 0.427083
+vt 0.083333 0.437500
+vt 0.072917 0.447917
+vt 0.062500 0.447917
+vt 0.072917 0.458333
+vt 0.062500 0.458333
+vt 0.083333 0.447917
+vt 0.083333 0.458333
+vt 0.052083 0.447917
+vt 0.052083 0.458333
+vt 0.104167 0.437500
+vt 0.093750 0.437500
+vt 0.093750 0.427083
+vt 0.104167 0.427083
+vt 0.114583 0.427083
+vt 0.114583 0.437500
+vt 0.125000 0.427083
+vt 0.125000 0.437500
+vt 0.114583 0.447917
+vt 0.104167 0.447917
+vt 0.114583 0.458333
+vt 0.104167 0.458333
+vt 0.125000 0.447917
+vt 0.125000 0.458333
+vt 0.093750 0.447917
+vt 0.093750 0.458333
+vt 0.145833 0.437500
+vt 0.135417 0.437500
+vt 0.135417 0.427083
+vt 0.145833 0.427083
+vt 0.156250 0.427083
+vt 0.156250 0.437500
+vt 0.166667 0.427083
+vt 0.166667 0.437500
+vt 0.156250 0.447917
+vt 0.145833 0.447917
+vt 0.156250 0.458333
+vt 0.145833 0.458333
+vt 0.166667 0.447917
+vt 0.166667 0.458333
+vt 0.135417 0.447917
+vt 0.135417 0.458333
+vt 0.187500 0.437500
+vt 0.177083 0.437500
+vt 0.177083 0.427083
+vt 0.187500 0.427083
+vt 0.197917 0.427083
+vt 0.197917 0.437500
+vt 0.208333 0.427083
+vt 0.208333 0.437500
+vt 0.197917 0.447917
+vt 0.187500 0.447917
+vt 0.197917 0.458333
+vt 0.187500 0.458333
+vt 0.208333 0.447917
+vt 0.208333 0.458333
+vt 0.177083 0.447917
+vt 0.177083 0.458333
+vt 0.229167 0.437500
+vt 0.218750 0.437500
+vt 0.218750 0.427083
+vt 0.229167 0.427083
+vt 0.239583 0.427083
+vt 0.239583 0.437500
+vt 0.250000 0.427083
+vt 0.250000 0.437500
+vt 0.239583 0.447917
+vt 0.229167 0.447917
+vt 0.239583 0.458333
+vt 0.229167 0.458333
+vt 0.250000 0.447917
+vt 0.250000 0.458333
+vt 0.218750 0.447917
+vt 0.218750 0.458333
+vt 0.270833 0.437500
+vt 0.260417 0.437500
+vt 0.260417 0.427083
+vt 0.270833 0.427083
+vt 0.281250 0.427083
+vt 0.281250 0.437500
+vt 0.291667 0.427083
+vt 0.291667 0.437500
+vt 0.281250 0.447917
+vt 0.270833 0.447917
+vt 0.281250 0.458333
+vt 0.270833 0.458333
+vt 0.291667 0.447917
+vt 0.291667 0.458333
+vt 0.260417 0.447917
+vt 0.260417 0.458333
+vt 0.312500 0.437500
+vt 0.302083 0.437500
+vt 0.302083 0.427083
+vt 0.312500 0.427083
+vt 0.322917 0.427083
+vt 0.322917 0.437500
+vt 0.333333 0.427083
+vt 0.333333 0.437500
+vt 0.322917 0.447917
+vt 0.312500 0.447917
+vt 0.322917 0.458333
+vt 0.312500 0.458333
+vt 0.333333 0.447917
+vt 0.333333 0.458333
+vt 0.302083 0.447917
+vt 0.302083 0.458333
+vt 0.354167 0.437500
+vt 0.343750 0.437500
+vt 0.343750 0.427083
+vt 0.354167 0.427083
+vt 0.364583 0.427083
+vt 0.364583 0.437500
+vt 0.375000 0.427083
+vt 0.375000 0.437500
+vt 0.364583 0.447917
+vt 0.354167 0.447917
+vt 0.364583 0.458333
+vt 0.354167 0.458333
+vt 0.375000 0.447917
+vt 0.375000 0.458333
+vt 0.343750 0.447917
+vt 0.343750 0.458333
+vt 0.395833 0.437500
+vt 0.385417 0.437500
+vt 0.385417 0.427083
+vt 0.395833 0.427083
+vt 0.406250 0.427083
+vt 0.406250 0.437500
+vt 0.416667 0.427083
+vt 0.416667 0.437500
+vt 0.406250 0.447917
+vt 0.395833 0.447917
+vt 0.406250 0.458333
+vt 0.395833 0.458333
+vt 0.416667 0.447917
+vt 0.416667 0.458333
+vt 0.385417 0.447917
+vt 0.385417 0.458333
+vt 0.437500 0.437500
+vt 0.427083 0.437500
+vt 0.427083 0.427083
+vt 0.437500 0.427083
+vt 0.447917 0.427083
+vt 0.447917 0.437500
+vt 0.458333 0.427083
+vt 0.458333 0.437500
+vt 0.447917 0.447917
+vt 0.437500 0.447917
+vt 0.447917 0.458333
+vt 0.437500 0.458333
+vt 0.458333 0.447917
+vt 0.458333 0.458333
+vt 0.427083 0.447917
+vt 0.427083 0.458333
+vt 0.479167 0.437500
+vt 0.468750 0.437500
+vt 0.468750 0.427083
+vt 0.479167 0.427083
+vt 0.489583 0.427083
+vt 0.489583 0.437500
+vt 0.500000 0.427083
+vt 0.500000 0.437500
+vt 0.489583 0.447917
+vt 0.479167 0.447917
+vt 0.489583 0.458333
+vt 0.479167 0.458333
+vt 0.500000 0.447917
+vt 0.500000 0.458333
+vt 0.468750 0.447917
+vt 0.468750 0.458333
+vt 0.520833 0.437500
+vt 0.510417 0.437500
+vt 0.510417 0.427083
+vt 0.520833 0.427083
+vt 0.531250 0.427083
+vt 0.531250 0.437500
+vt 0.541667 0.427083
+vt 0.541667 0.437500
+vt 0.531250 0.447917
+vt 0.520833 0.447917
+vt 0.531250 0.458333
+vt 0.520833 0.458333
+vt 0.541667 0.447917
+vt 0.541667 0.458333
+vt 0.510417 0.447917
+vt 0.510417 0.458333
+vt 0.562500 0.437500
+vt 0.552083 0.437500
+vt 0.552083 0.427083
+vt 0.562500 0.427083
+vt 0.572917 0.427083
+vt 0.572917 0.437500
+vt 0.583333 0.427083
+vt 0.583333 0.437500
+vt 0.572917 0.447917
+vt 0.562500 0.447917
+vt 0.572917 0.458333
+vt 0.562500 0.458333
+vt 0.583333 0.447917
+vt 0.583333 0.458333
+vt 0.552083 0.447917
+vt 0.552083 0.458333
+vt 0.604167 0.437500
+vt 0.593750 0.437500
+vt 0.593750 0.427083
+vt 0.604167 0.427083
+vt 0.614583 0.427083
+vt 0.614583 0.437500
+vt 0.625000 0.427083
+vt 0.625000 0.437500
+vt 0.614583 0.447917
+vt 0.604167 0.447917
+vt 0.614583 0.458333
+vt 0.604167 0.458333
+vt 0.625000 0.447917
+vt 0.625000 0.458333
+vt 0.593750 0.447917
+vt 0.593750 0.458333
+vt 0.645833 0.437500
+vt 0.635417 0.437500
+vt 0.635417 0.427083
+vt 0.645833 0.427083
+vt 0.656250 0.427083
+vt 0.656250 0.437500
+vt 0.666667 0.427083
+vt 0.666667 0.437500
+vt 0.656250 0.447917
+vt 0.645833 0.447917
+vt 0.656250 0.458333
+vt 0.645833 0.458333
+vt 0.666667 0.447917
+vt 0.666667 0.458333
+vt 0.635417 0.447917
+vt 0.635417 0.458333
+vt 0.687500 0.437500
+vt 0.677083 0.437500
+vt 0.677083 0.427083
+vt 0.687500 0.427083
+vt 0.697917 0.427083
+vt 0.697917 0.437500
+vt 0.708333 0.427083
+vt 0.708333 0.437500
+vt 0.697917 0.447917
+vt 0.687500 0.447917
+vt 0.697917 0.458333
+vt 0.687500 0.458333
+vt 0.708333 0.447917
+vt 0.708333 0.458333
+vt 0.677083 0.447917
+vt 0.677083 0.458333
+vt 0.729167 0.437500
+vt 0.718750 0.437500
+vt 0.718750 0.427083
+vt 0.729167 0.427083
+vt 0.739583 0.427083
+vt 0.739583 0.437500
+vt 0.750000 0.427083
+vt 0.750000 0.437500
+vt 0.739583 0.447917
+vt 0.729167 0.447917
+vt 0.739583 0.458333
+vt 0.729167 0.458333
+vt 0.750000 0.447917
+vt 0.750000 0.458333
+vt 0.718750 0.447917
+vt 0.718750 0.458333
+vt 0.770833 0.437500
+vt 0.760417 0.437500
+vt 0.760417 0.427083
+vt 0.770833 0.427083
+vt 0.781250 0.427083
+vt 0.781250 0.437500
+vt 0.791667 0.427083
+vt 0.791667 0.437500
+vt 0.781250 0.447917
+vt 0.770833 0.447917
+vt 0.781250 0.458333
+vt 0.770833 0.458333
+vt 0.791667 0.447917
+vt 0.791667 0.458333
+vt 0.760417 0.447917
+vt 0.760417 0.458333
+vt 0.812500 0.437500
+vt 0.802083 0.437500
+vt 0.802083 0.427083
+vt 0.812500 0.427083
+vt 0.822917 0.427083
+vt 0.822917 0.437500
+vt 0.833333 0.427083
+vt 0.833333 0.437500
+vt 0.822917 0.447917
+vt 0.812500 0.447917
+vt 0.822917 0.458333
+vt 0.812500 0.458333
+vt 0.833333 0.447917
+vt 0.833333 0.458333
+vt 0.802083 0.447917
+vt 0.802083 0.458333
+vt 0.854167 0.437500
+vt 0.843750 0.437500
+vt 0.843750 0.427083
+vt 0.854167 0.427083
+vt 0.864583 0.427083
+vt 0.864583 0.437500
+vt 0.875000 0.427083
+vt 0.875000 0.437500
+vt 0.864583 0.447917
+vt 0.854167 0.447917
+vt 0.864583 0.458333
+vt 0.854167 0.458333
+vt 0.875000 0.447917
+vt 0.875000 0.458333
+vt 0.843750 0.447917
+vt 0.843750 0.458333
+vt 0.895833 0.437500
+vt 0.885417 0.437500
+vt 0.885417 0.427083
+vt 0.895833 0.427083
+vt 0.906250 0.427083
+vt 0.906250 0.437500
+vt 0.916667 0.427083
+vt 0.916667 0.437500
+vt 0.906250 0.447917
+vt 0.895833 0.447917
+vt 0.906250 0.458333
+vt 0.895833 0.458333
+vt 0.916667 0.447917
+vt 0.916667 0.458333
+vt 0.885417 0.447917
+vt 0.885417 0.458333
+vt 0.937500 0.437500
+vt 0.927083 0.437500
+vt 0.927083 0.427083
+vt 0.937500 0.427083
+vt 0.947917 0.427083
+vt 0.947917 0.437500
+vt 0.958333 0.427083
+vt 0.958333 0.437500
+vt 0.947917 0.447917
+vt 0.937500 0.447917
+vt 0.947917 0.458333
+vt 0.937500 0.458333
+vt 0.958333 0.447917
+vt 0.958333 0.458333
+vt 0.927083 0.447917
+vt 0.927083 0.458333
+vt 0.979167 0.437500
+vt 0.968750 0.437500
+vt 0.968750 0.427083
+vt 0.979167 0.427083
+vt 0.989583 0.427083
+vt 0.989583 0.437500
+vt 1.000000 0.427083
+vt 1.000000 0.437500
+vt 0.989583 0.447917
+vt 0.979167 0.447917
+vt 0.989583 0.458333
+vt 0.979167 0.458333
+vt 1.000000 0.447917
+vt 1.000000 0.458333
+vt 0.968750 0.447917
+vt 0.968750 0.458333
+vt 0.020833 0.479167
+vt 0.010417 0.479167
+vt 0.010417 0.468750
+vt 0.020833 0.468750
+vt 0.000000 0.479167
+vt 0.000000 0.468750
+vt 0.031250 0.468750
+vt 0.031250 0.479167
+vt 0.041667 0.468750
+vt 0.041667 0.479167
+vt 0.031250 0.489583
+vt 0.020833 0.489583
+vt 0.031250 0.500000
+vt 0.020833 0.500000
+vt 0.041667 0.489583
+vt 0.041667 0.500000
+vt 0.010417 0.489583
+vt 0.000000 0.489583
+vt 0.010417 0.500000
+vt 0.000000 0.500000
+vt 0.062500 0.479167
+vt 0.052083 0.479167
+vt 0.052083 0.468750
+vt 0.062500 0.468750
+vt 0.072917 0.468750
+vt 0.072917 0.479167
+vt 0.083333 0.468750
+vt 0.083333 0.479167
+vt 0.072917 0.489583
+vt 0.062500 0.489583
+vt 0.072917 0.500000
+vt 0.062500 0.500000
+vt 0.083333 0.489583
+vt 0.083333 0.500000
+vt 0.052083 0.489583
+vt 0.052083 0.500000
+vt 0.104167 0.479167
+vt 0.093750 0.479167
+vt 0.093750 0.468750
+vt 0.104167 0.468750
+vt 0.114583 0.468750
+vt 0.114583 0.479167
+vt 0.125000 0.468750
+vt 0.125000 0.479167
+vt 0.114583 0.489583
+vt 0.104167 0.489583
+vt 0.114583 0.500000
+vt 0.104167 0.500000
+vt 0.125000 0.489583
+vt 0.125000 0.500000
+vt 0.093750 0.489583
+vt 0.093750 0.500000
+vt 0.145833 0.479167
+vt 0.135417 0.479167
+vt 0.135417 0.468750
+vt 0.145833 0.468750
+vt 0.156250 0.468750
+vt 0.156250 0.479167
+vt 0.166667 0.468750
+vt 0.166667 0.479167
+vt 0.156250 0.489583
+vt 0.145833 0.489583
+vt 0.156250 0.500000
+vt 0.145833 0.500000
+vt 0.166667 0.489583
+vt 0.166667 0.500000
+vt 0.135417 0.489583
+vt 0.135417 0.500000
+vt 0.187500 0.479167
+vt 0.177083 0.479167
+vt 0.177083 0.468750
+vt 0.187500 0.468750
+vt 0.197917 0.468750
+vt 0.197917 0.479167
+vt 0.208333 0.468750
+vt 0.208333 0.479167
+vt 0.197917 0.489583
+vt 0.187500 0.489583
+vt 0.197917 0.500000
+vt 0.187500 0.500000
+vt 0.208333 0.489583
+vt 0.208333 0.500000
+vt 0.177083 0.489583
+vt 0.177083 0.500000
+vt 0.229167 0.479167
+vt 0.218750 0.479167
+vt 0.218750 0.468750
+vt 0.229167 0.468750
+vt 0.239583 0.468750
+vt 0.239583 0.479167
+vt 0.250000 0.468750
+vt 0.250000 0.479167
+vt 0.239583 0.489583
+vt 0.229167 0.489583
+vt 0.239583 0.500000
+vt 0.229167 0.500000
+vt 0.250000 0.489583
+vt 0.250000 0.500000
+vt 0.218750 0.489583
+vt 0.218750 0.500000
+vt 0.270833 0.479167
+vt 0.260417 0.479167
+vt 0.260417 0.468750
+vt 0.270833 0.468750
+vt 0.281250 0.468750
+vt 0.281250 0.479167
+vt 0.291667 0.468750
+vt 0.291667 0.479167
+vt 0.281250 0.489583
+vt 0.270833 0.489583
+vt 0.281250 0.500000
+vt 0.270833 0.500000
+vt 0.291667 0.489583
+vt 0.291667 0.500000
+vt 0.260417 0.489583
+vt 0.260417 0.500000
+vt 0.312500 0.479167
+vt 0.302083 0.479167
+vt 0.302083 0.468750
+vt 0.312500 0.468750
+vt 0.322917 0.468750
+vt 0.322917 0.479167
+vt 0.333333 0.468750
+vt 0.333333 0.479167
+vt 0.322917 0.489583
+vt 0.312500 0.489583
+vt 0.322917 0.500000
+vt 0.312500 0.500000
+vt 0.333333 0.489583
+vt 0.333333 0.500000
+vt 0.302083 0.489583
+vt 0.302083 0.500000
+vt 0.354167 0.479167
+vt 0.343750 0.479167
+vt 0.343750 0.468750
+vt 0.354167 0.468750
+vt 0.364583 0.468750
+vt 0.364583 0.479167
+vt 0.375000 0.468750
+vt 0.375000 0.479167
+vt 0.364583 0.489583
+vt 0.354167 0.489583
+vt 0.364583 0.500000
+vt 0.354167 0.500000
+vt 0.375000 0.489583
+vt 0.375000 0.500000
+vt 0.343750 0.489583
+vt 0.343750 0.500000
+vt 0.395833 0.479167
+vt 0.385417 0.479167
+vt 0.385417 0.468750
+vt 0.395833 0.468750
+vt 0.406250 0.468750
+vt 0.406250 0.479167
+vt 0.416667 0.468750
+vt 0.416667 0.479167
+vt 0.406250 0.489583
+vt 0.395833 0.489583
+vt 0.406250 0.500000
+vt 0.395833 0.500000
+vt 0.416667 0.489583
+vt 0.416667 0.500000
+vt 0.385417 0.489583
+vt 0.385417 0.500000
+vt 0.437500 0.479167
+vt 0.427083 0.479167
+vt 0.427083 0.468750
+vt 0.437500 0.468750
+vt 0.447917 0.468750
+vt 0.447917 0.479167
+vt 0.458333 0.468750
+vt 0.458333 0.479167
+vt 0.447917 0.489583
+vt 0.437500 0.489583
+vt 0.447917 0.500000
+vt 0.437500 0.500000
+vt 0.458333 0.489583
+vt 0.458333 0.500000
+vt 0.427083 0.489583
+vt 0.427083 0.500000
+vt 0.479167 0.479167
+vt 0.468750 0.479167
+vt 0.468750 0.468750
+vt 0.479167 0.468750
+vt 0.489583 0.468750
+vt 0.489583 0.479167
+vt 0.500000 0.468750
+vt 0.500000 0.479167
+vt 0.489583 0.489583
+vt 0.479167 0.489583
+vt 0.489583 0.500000
+vt 0.479167 0.500000
+vt 0.500000 0.489583
+vt 0.500000 0.500000
+vt 0.468750 0.489583
+vt 0.468750 0.500000
+vt 0.520833 0.479167
+vt 0.510417 0.479167
+vt 0.510417 0.468750
+vt 0.520833 0.468750
+vt 0.531250 0.468750
+vt 0.531250 0.479167
+vt 0.541667 0.468750
+vt 0.541667 0.479167
+vt 0.531250 0.489583
+vt 0.520833 0.489583
+vt 0.531250 0.500000
+vt 0.520833 0.500000
+vt 0.541667 0.489583
+vt 0.541667 0.500000
+vt 0.510417 0.489583
+vt 0.510417 0.500000
+vt 0.562500 0.479167
+vt 0.552083 0.479167
+vt 0.552083 0.468750
+vt 0.562500 0.468750
+vt 0.572917 0.468750
+vt 0.572917 0.479167
+vt 0.583333 0.468750
+vt 0.583333 0.479167
+vt 0.572917 0.489583
+vt 0.562500 0.489583
+vt 0.572917 0.500000
+vt 0.562500 0.500000
+vt 0.583333 0.489583
+vt 0.583333 0.500000
+vt 0.552083 0.489583
+vt 0.552083 0.500000
+vt 0.604167 0.479167
+vt 0.593750 0.479167
+vt 0.593750 0.468750
+vt 0.604167 0.468750
+vt 0.614583 0.468750
+vt 0.614583 0.479167
+vt 0.625000 0.468750
+vt 0.625000 0.479167
+vt 0.614583 0.489583
+vt 0.604167 0.489583
+vt 0.614583 0.500000
+vt 0.604167 0.500000
+vt 0.625000 0.489583
+vt 0.625000 0.500000
+vt 0.593750 0.489583
+vt 0.593750 0.500000
+vt 0.645833 0.479167
+vt 0.635417 0.479167
+vt 0.635417 0.468750
+vt 0.645833 0.468750
+vt 0.656250 0.468750
+vt 0.656250 0.479167
+vt 0.666667 0.468750
+vt 0.666667 0.479167
+vt 0.656250 0.489583
+vt 0.645833 0.489583
+vt 0.656250 0.500000
+vt 0.645833 0.500000
+vt 0.666667 0.489583
+vt 0.666667 0.500000
+vt 0.635417 0.489583
+vt 0.635417 0.500000
+vt 0.687500 0.479167
+vt 0.677083 0.479167
+vt 0.677083 0.468750
+vt 0.687500 0.468750
+vt 0.697917 0.468750
+vt 0.697917 0.479167
+vt 0.708333 0.468750
+vt 0.708333 0.479167
+vt 0.697917 0.489583
+vt 0.687500 0.489583
+vt 0.697917 0.500000
+vt 0.687500 0.500000
+vt 0.708333 0.489583
+vt 0.708333 0.500000
+vt 0.677083 0.489583
+vt 0.677083 0.500000
+vt 0.729167 0.479167
+vt 0.718750 0.479167
+vt 0.718750 0.468750
+vt 0.729167 0.468750
+vt 0.739583 0.468750
+vt 0.739583 0.479167
+vt 0.750000 0.468750
+vt 0.750000 0.479167
+vt 0.739583 0.489583
+vt 0.729167 0.489583
+vt 0.739583 0.500000
+vt 0.729167 0.500000
+vt 0.750000 0.489583
+vt 0.750000 0.500000
+vt 0.718750 0.489583
+vt 0.718750 0.500000
+vt 0.770833 0.479167
+vt 0.760417 0.479167
+vt 0.760417 0.468750
+vt 0.770833 0.468750
+vt 0.781250 0.468750
+vt 0.781250 0.479167
+vt 0.791667 0.468750
+vt 0.791667 0.479167
+vt 0.781250 0.489583
+vt 0.770833 0.489583
+vt 0.781250 0.500000
+vt 0.770833 0.500000
+vt 0.791667 0.489583
+vt 0.791667 0.500000
+vt 0.760417 0.489583
+vt 0.760417 0.500000
+vt 0.812500 0.479167
+vt 0.802083 0.479167
+vt 0.802083 0.468750
+vt 0.812500 0.468750
+vt 0.822917 0.468750
+vt 0.822917 0.479167
+vt 0.833333 0.468750
+vt 0.833333 0.479167
+vt 0.822917 0.489583
+vt 0.812500 0.489583
+vt 0.822917 0.500000
+vt 0.812500 0.500000
+vt 0.833333 0.489583
+vt 0.833333 0.500000
+vt 0.802083 0.489583
+vt 0.802083 0.500000
+vt 0.854167 0.479167
+vt 0.843750 0.479167
+vt 0.843750 0.468750
+vt 0.854167 0.468750
+vt 0.864583 0.468750
+vt 0.864583 0.479167
+vt 0.875000 0.468750
+vt 0.875000 0.479167
+vt 0.864583 0.489583
+vt 0.854167 0.489583
+vt 0.864583 0.500000
+vt 0.854167 0.500000
+vt 0.875000 0.489583
+vt 0.875000 0.500000
+vt 0.843750 0.489583
+vt 0.843750 0.500000
+vt 0.895833 0.479167
+vt 0.885417 0.479167
+vt 0.885417 0.468750
+vt 0.895833 0.468750
+vt 0.906250 0.468750
+vt 0.906250 0.479167
+vt 0.916667 0.468750
+vt 0.916667 0.479167
+vt 0.906250 0.489583
+vt 0.895833 0.489583
+vt 0.906250 0.500000
+vt 0.895833 0.500000
+vt 0.916667 0.489583
+vt 0.916667 0.500000
+vt 0.885417 0.489583
+vt 0.885417 0.500000
+vt 0.937500 0.479167
+vt 0.927083 0.479167
+vt 0.927083 0.468750
+vt 0.937500 0.468750
+vt 0.947917 0.468750
+vt 0.947917 0.479167
+vt 0.958333 0.468750
+vt 0.958333 0.479167
+vt 0.947917 0.489583
+vt 0.937500 0.489583
+vt 0.947917 0.500000
+vt 0.937500 0.500000
+vt 0.958333 0.489583
+vt 0.958333 0.500000
+vt 0.927083 0.489583
+vt 0.927083 0.500000
+vt 0.979167 0.479167
+vt 0.968750 0.479167
+vt 0.968750 0.468750
+vt 0.979167 0.468750
+vt 0.989583 0.468750
+vt 0.989583 0.479167
+vt 1.000000 0.468750
+vt 1.000000 0.479167
+vt 0.989583 0.489583
+vt 0.979167 0.489583
+vt 0.989583 0.500000
+vt 0.979167 0.500000
+vt 1.000000 0.489583
+vt 1.000000 0.500000
+vt 0.968750 0.489583
+vt 0.968750 0.500000
+vt 0.020833 0.520833
+vt 0.010417 0.520833
+vt 0.010417 0.510417
+vt 0.020833 0.510417
+vt 0.000000 0.520833
+vt 0.000000 0.510417
+vt 0.031250 0.510417
+vt 0.031250 0.520833
+vt 0.041667 0.510417
+vt 0.041667 0.520833
+vt 0.031250 0.531250
+vt 0.020833 0.531250
+vt 0.031250 0.541667
+vt 0.020833 0.541667
+vt 0.041667 0.531250
+vt 0.041667 0.541667
+vt 0.010417 0.531250
+vt 0.000000 0.531250
+vt 0.010417 0.541667
+vt 0.000000 0.541667
+vt 0.062500 0.520833
+vt 0.052083 0.520833
+vt 0.052083 0.510417
+vt 0.062500 0.510417
+vt 0.072917 0.510417
+vt 0.072917 0.520833
+vt 0.083333 0.510417
+vt 0.083333 0.520833
+vt 0.072917 0.531250
+vt 0.062500 0.531250
+vt 0.072917 0.541667
+vt 0.062500 0.541667
+vt 0.083333 0.531250
+vt 0.083333 0.541667
+vt 0.052083 0.531250
+vt 0.052083 0.541667
+vt 0.104167 0.520833
+vt 0.093750 0.520833
+vt 0.093750 0.510417
+vt 0.104167 0.510417
+vt 0.114583 0.510417
+vt 0.114583 0.520833
+vt 0.125000 0.510417
+vt 0.125000 0.520833
+vt 0.114583 0.531250
+vt 0.104167 0.531250
+vt 0.114583 0.541667
+vt 0.104167 0.541667
+vt 0.125000 0.531250
+vt 0.125000 0.541667
+vt 0.093750 0.531250
+vt 0.093750 0.541667
+vt 0.145833 0.520833
+vt 0.135417 0.520833
+vt 0.135417 0.510417
+vt 0.145833 0.510417
+vt 0.156250 0.510417
+vt 0.156250 0.520833
+vt 0.166667 0.510417
+vt 0.166667 0.520833
+vt 0.156250 0.531250
+vt 0.145833 0.531250
+vt 0.156250 0.541667
+vt 0.145833 0.541667
+vt 0.166667 0.531250
+vt 0.166667 0.541667
+vt 0.135417 0.531250
+vt 0.135417 0.541667
+vt 0.187500 0.520833
+vt 0.177083 0.520833
+vt 0.177083 0.510417
+vt 0.187500 0.510417
+vt 0.197917 0.510417
+vt 0.197917 0.520833
+vt 0.208333 0.510417
+vt 0.208333 0.520833
+vt 0.197917 0.531250
+vt 0.187500 0.531250
+vt 0.197917 0.541667
+vt 0.187500 0.541667
+vt 0.208333 0.531250
+vt 0.208333 0.541667
+vt 0.177083 0.531250
+vt 0.177083 0.541667
+vt 0.229167 0.520833
+vt 0.218750 0.520833
+vt 0.218750 0.510417
+vt 0.229167 0.510417
+vt 0.239583 0.510417
+vt 0.239583 0.520833
+vt 0.250000 0.510417
+vt 0.250000 0.520833
+vt 0.239583 0.531250
+vt 0.229167 0.531250
+vt 0.239583 0.541667
+vt 0.229167 0.541667
+vt 0.250000 0.531250
+vt 0.250000 0.541667
+vt 0.218750 0.531250
+vt 0.218750 0.541667
+vt 0.270833 0.520833
+vt 0.260417 0.520833
+vt 0.260417 0.510417
+vt 0.270833 0.510417
+vt 0.281250 0.510417
+vt 0.281250 0.520833
+vt 0.291667 0.510417
+vt 0.291667 0.520833
+vt 0.281250 0.531250
+vt 0.270833 0.531250
+vt 0.281250 0.541667
+vt 0.270833 0.541667
+vt 0.291667 0.531250
+vt 0.291667 0.541667
+vt 0.260417 0.531250
+vt 0.260417 0.541667
+vt 0.312500 0.520833
+vt 0.302083 0.520833
+vt 0.302083 0.510417
+vt 0.312500 0.510417
+vt 0.322917 0.510417
+vt 0.322917 0.520833
+vt 0.333333 0.510417
+vt 0.333333 0.520833
+vt 0.322917 0.531250
+vt 0.312500 0.531250
+vt 0.322917 0.541667
+vt 0.312500 0.541667
+vt 0.333333 0.531250
+vt 0.333333 0.541667
+vt 0.302083 0.531250
+vt 0.302083 0.541667
+vt 0.354167 0.520833
+vt 0.343750 0.520833
+vt 0.343750 0.510417
+vt 0.354167 0.510417
+vt 0.364583 0.510417
+vt 0.364583 0.520833
+vt 0.375000 0.510417
+vt 0.375000 0.520833
+vt 0.364583 0.531250
+vt 0.354167 0.531250
+vt 0.364583 0.541667
+vt 0.354167 0.541667
+vt 0.375000 0.531250
+vt 0.375000 0.541667
+vt 0.343750 0.531250
+vt 0.343750 0.541667
+vt 0.395833 0.520833
+vt 0.385417 0.520833
+vt 0.385417 0.510417
+vt 0.395833 0.510417
+vt 0.406250 0.510417
+vt 0.406250 0.520833
+vt 0.416667 0.510417
+vt 0.416667 0.520833
+vt 0.406250 0.531250
+vt 0.395833 0.531250
+vt 0.406250 0.541667
+vt 0.395833 0.541667
+vt 0.416667 0.531250
+vt 0.416667 0.541667
+vt 0.385417 0.531250
+vt 0.385417 0.541667
+vt 0.437500 0.520833
+vt 0.427083 0.520833
+vt 0.427083 0.510417
+vt 0.437500 0.510417
+vt 0.447917 0.510417
+vt 0.447917 0.520833
+vt 0.458333 0.510417
+vt 0.458333 0.520833
+vt 0.447917 0.531250
+vt 0.437500 0.531250
+vt 0.447917 0.541667
+vt 0.437500 0.541667
+vt 0.458333 0.531250
+vt 0.458333 0.541667
+vt 0.427083 0.531250
+vt 0.427083 0.541667
+vt 0.479167 0.520833
+vt 0.468750 0.520833
+vt 0.468750 0.510417
+vt 0.479167 0.510417
+vt 0.489583 0.510417
+vt 0.489583 0.520833
+vt 0.500000 0.510417
+vt 0.500000 0.520833
+vt 0.489583 0.531250
+vt 0.479167 0.531250
+vt 0.489583 0.541667
+vt 0.479167 0.541667
+vt 0.500000 0.531250
+vt 0.500000 0.541667
+vt 0.468750 0.531250
+vt 0.468750 0.541667
+vt 0.520833 0.520833
+vt 0.510417 0.520833
+vt 0.510417 0.510417
+vt 0.520833 0.510417
+vt 0.531250 0.510417
+vt 0.531250 0.520833
+vt 0.541667 0.510417
+vt 0.541667 0.520833
+vt 0.531250 0.531250
+vt 0.520833 0.531250
+vt 0.531250 0.541667
+vt 0.520833 0.541667
+vt 0.541667 0.531250
+vt 0.541667 0.541667
+vt 0.510417 0.531250
+vt 0.510417 0.541667
+vt 0.562500 0.520833
+vt 0.552083 0.520833
+vt 0.552083 0.510417
+vt 0.562500 0.510417
+vt 0.572917 0.510417
+vt 0.572917 0.520833
+vt 0.583333 0.510417
+vt 0.583333 0.520833
+vt 0.572917 0.531250
+vt 0.562500 0.531250
+vt 0.572917 0.541667
+vt 0.562500 0.541667
+vt 0.583333 0.531250
+vt 0.583333 0.541667
+vt 0.552083 0.531250
+vt 0.552083 0.541667
+vt 0.604167 0.520833
+vt 0.593750 0.520833
+vt 0.593750 0.510417
+vt 0.604167 0.510417
+vt 0.614583 0.510417
+vt 0.614583 0.520833
+vt 0.625000 0.510417
+vt 0.625000 0.520833
+vt 0.614583 0.531250
+vt 0.604167 0.531250
+vt 0.614583 0.541667
+vt 0.604167 0.541667
+vt 0.625000 0.531250
+vt 0.625000 0.541667
+vt 0.593750 0.531250
+vt 0.593750 0.541667
+vt 0.645833 0.520833
+vt 0.635417 0.520833
+vt 0.635417 0.510417
+vt 0.645833 0.510417
+vt 0.656250 0.510417
+vt 0.656250 0.520833
+vt 0.666667 0.510417
+vt 0.666667 0.520833
+vt 0.656250 0.531250
+vt 0.645833 0.531250
+vt 0.656250 0.541667
+vt 0.645833 0.541667
+vt 0.666667 0.531250
+vt 0.666667 0.541667
+vt 0.635417 0.531250
+vt 0.635417 0.541667
+vt 0.687500 0.520833
+vt 0.677083 0.520833
+vt 0.677083 0.510417
+vt 0.687500 0.510417
+vt 0.697917 0.510417
+vt 0.697917 0.520833
+vt 0.708333 0.510417
+vt 0.708333 0.520833
+vt 0.697917 0.531250
+vt 0.687500 0.531250
+vt 0.697917 0.541667
+vt 0.687500 0.541667
+vt 0.708333 0.531250
+vt 0.708333 0.541667
+vt 0.677083 0.531250
+vt 0.677083 0.541667
+vt 0.729167 0.520833
+vt 0.718750 0.520833
+vt 0.718750 0.510417
+vt 0.729167 0.510417
+vt 0.739583 0.510417
+vt 0.739583 0.520833
+vt 0.750000 0.510417
+vt 0.750000 0.520833
+vt 0.739583 0.531250
+vt 0.729167 0.531250
+vt 0.739583 0.541667
+vt 0.729167 0.541667
+vt 0.750000 0.531250
+vt 0.750000 0.541667
+vt 0.718750 0.531250
+vt 0.718750 0.541667
+vt 0.770833 0.520833
+vt 0.760417 0.520833
+vt 0.760417 0.510417
+vt 0.770833 0.510417
+vt 0.781250 0.510417
+vt 0.781250 0.520833
+vt 0.791667 0.510417
+vt 0.791667 0.520833
+vt 0.781250 0.531250
+vt 0.770833 0.531250
+vt 0.781250 0.541667
+vt 0.770833 0.541667
+vt 0.791667 0.531250
+vt 0.791667 0.541667
+vt 0.760417 0.531250
+vt 0.760417 0.541667
+vt 0.812500 0.520833
+vt 0.802083 0.520833
+vt 0.802083 0.510417
+vt 0.812500 0.510417
+vt 0.822917 0.510417
+vt 0.822917 0.520833
+vt 0.833333 0.510417
+vt 0.833333 0.520833
+vt 0.822917 0.531250
+vt 0.812500 0.531250
+vt 0.822917 0.541667
+vt 0.812500 0.541667
+vt 0.833333 0.531250
+vt 0.833333 0.541667
+vt 0.802083 0.531250
+vt 0.802083 0.541667
+vt 0.854167 0.520833
+vt 0.843750 0.520833
+vt 0.843750 0.510417
+vt 0.854167 0.510417
+vt 0.864583 0.510417
+vt 0.864583 0.520833
+vt 0.875000 0.510417
+vt 0.875000 0.520833
+vt 0.864583 0.531250
+vt 0.854167 0.531250
+vt 0.864583 0.541667
+vt 0.854167 0.541667
+vt 0.875000 0.531250
+vt 0.875000 0.541667
+vt 0.843750 0.531250
+vt 0.843750 0.541667
+vt 0.895833 0.520833
+vt 0.885417 0.520833
+vt 0.885417 0.510417
+vt 0.895833 0.510417
+vt 0.906250 0.510417
+vt 0.906250 0.520833
+vt 0.916667 0.510417
+vt 0.916667 0.520833
+vt 0.906250 0.531250
+vt 0.895833 0.531250
+vt 0.906250 0.541667
+vt 0.895833 0.541667
+vt 0.916667 0.531250
+vt 0.916667 0.541667
+vt 0.885417 0.531250
+vt 0.885417 0.541667
+vt 0.937500 0.520833
+vt 0.927083 0.520833
+vt 0.927083 0.510417
+vt 0.937500 0.510417
+vt 0.947917 0.510417
+vt 0.947917 0.520833
+vt 0.958333 0.510417
+vt 0.958333 0.520833
+vt 0.947917 0.531250
+vt 0.937500 0.531250
+vt 0.947917 0.541667
+vt 0.937500 0.541667
+vt 0.958333 0.531250
+vt 0.958333 0.541667
+vt 0.927083 0.531250
+vt 0.927083 0.541667
+vt 0.979167 0.520833
+vt 0.968750 0.520833
+vt 0.968750 0.510417
+vt 0.979167 0.510417
+vt 0.989583 0.510417
+vt 0.989583 0.520833
+vt 1.000000 0.510417
+vt 1.000000 0.520833
+vt 0.989583 0.531250
+vt 0.979167 0.531250
+vt 0.989583 0.541667
+vt 0.979167 0.541667
+vt 1.000000 0.531250
+vt 1.000000 0.541667
+vt 0.968750 0.531250
+vt 0.968750 0.541667
+vt 0.020833 0.562500
+vt 0.010417 0.562500
+vt 0.010417 0.552083
+vt 0.020833 0.552083
+vt 0.000000 0.562500
+vt 0.000000 0.552083
+vt 0.031250 0.552083
+vt 0.031250 0.562500
+vt 0.041667 0.552083
+vt 0.041667 0.562500
+vt 0.031250 0.572917
+vt 0.020833 0.572917
+vt 0.031250 0.583333
+vt 0.020833 0.583333
+vt 0.041667 0.572917
+vt 0.041667 0.583333
+vt 0.010417 0.572917
+vt 0.000000 0.572917
+vt 0.010417 0.583333
+vt 0.000000 0.583333
+vt 0.062500 0.562500
+vt 0.052083 0.562500
+vt 0.052083 0.552083
+vt 0.062500 0.552083
+vt 0.072917 0.552083
+vt 0.072917 0.562500
+vt 0.083333 0.552083
+vt 0.083333 0.562500
+vt 0.072917 0.572917
+vt 0.062500 0.572917
+vt 0.072917 0.583333
+vt 0.062500 0.583333
+vt 0.083333 0.572917
+vt 0.083333 0.583333
+vt 0.052083 0.572917
+vt 0.052083 0.583333
+vt 0.104167 0.562500
+vt 0.093750 0.562500
+vt 0.093750 0.552083
+vt 0.104167 0.552083
+vt 0.114583 0.552083
+vt 0.114583 0.562500
+vt 0.125000 0.552083
+vt 0.125000 0.562500
+vt 0.114583 0.572917
+vt 0.104167 0.572917
+vt 0.114583 0.583333
+vt 0.104167 0.583333
+vt 0.125000 0.572917
+vt 0.125000 0.583333
+vt 0.093750 0.572917
+vt 0.093750 0.583333
+vt 0.145833 0.562500
+vt 0.135417 0.562500
+vt 0.135417 0.552083
+vt 0.145833 0.552083
+vt 0.156250 0.552083
+vt 0.156250 0.562500
+vt 0.166667 0.552083
+vt 0.166667 0.562500
+vt 0.156250 0.572917
+vt 0.145833 0.572917
+vt 0.156250 0.583333
+vt 0.145833 0.583333
+vt 0.166667 0.572917
+vt 0.166667 0.583333
+vt 0.135417 0.572917
+vt 0.135417 0.583333
+vt 0.187500 0.562500
+vt 0.177083 0.562500
+vt 0.177083 0.552083
+vt 0.187500 0.552083
+vt 0.197917 0.552083
+vt 0.197917 0.562500
+vt 0.208333 0.552083
+vt 0.208333 0.562500
+vt 0.197917 0.572917
+vt 0.187500 0.572917
+vt 0.197917 0.583333
+vt 0.187500 0.583333
+vt 0.208333 0.572917
+vt 0.208333 0.583333
+vt 0.177083 0.572917
+vt 0.177083 0.583333
+vt 0.229167 0.562500
+vt 0.218750 0.562500
+vt 0.218750 0.552083
+vt 0.229167 0.552083
+vt 0.239583 0.552083
+vt 0.239583 0.562500
+vt 0.250000 0.552083
+vt 0.250000 0.562500
+vt 0.239583 0.572917
+vt 0.229167 0.572917
+vt 0.239583 0.583333
+vt 0.229167 0.583333
+vt 0.250000 0.572917
+vt 0.250000 0.583333
+vt 0.218750 0.572917
+vt 0.218750 0.583333
+vt 0.270833 0.562500
+vt 0.260417 0.562500
+vt 0.260417 0.552083
+vt 0.270833 0.552083
+vt 0.281250 0.552083
+vt 0.281250 0.562500
+vt 0.291667 0.552083
+vt 0.291667 0.562500
+vt 0.281250 0.572917
+vt 0.270833 0.572917
+vt 0.281250 0.583333
+vt 0.270833 0.583333
+vt 0.291667 0.572917
+vt 0.291667 0.583333
+vt 0.260417 0.572917
+vt 0.260417 0.583333
+vt 0.312500 0.562500
+vt 0.302083 0.562500
+vt 0.302083 0.552083
+vt 0.312500 0.552083
+vt 0.322917 0.552083
+vt 0.322917 0.562500
+vt 0.333333 0.552083
+vt 0.333333 0.562500
+vt 0.322917 0.572917
+vt 0.312500 0.572917
+vt 0.322917 0.583333
+vt 0.312500 0.583333
+vt 0.333333 0.572917
+vt 0.333333 0.583333
+vt 0.302083 0.572917
+vt 0.302083 0.583333
+vt 0.354167 0.562500
+vt 0.343750 0.562500
+vt 0.343750 0.552083
+vt 0.354167 0.552083
+vt 0.364583 0.552083
+vt 0.364583 0.562500
+vt 0.375000 0.552083
+vt 0.375000 0.562500
+vt 0.364583 0.572917
+vt 0.354167 0.572917
+vt 0.364583 0.583333
+vt 0.354167 0.583333
+vt 0.375000 0.572917
+vt 0.375000 0.583333
+vt 0.343750 0.572917
+vt 0.343750 0.583333
+vt 0.395833 0.562500
+vt 0.385417 0.562500
+vt 0.385417 0.552083
+vt 0.395833 0.552083
+vt 0.406250 0.552083
+vt 0.406250 0.562500
+vt 0.416667 0.552083
+vt 0.416667 0.562500
+vt 0.406250 0.572917
+vt 0.395833 0.572917
+vt 0.406250 0.583333
+vt 0.395833 0.583333
+vt 0.416667 0.572917
+vt 0.416667 0.583333
+vt 0.385417 0.572917
+vt 0.385417 0.583333
+vt 0.437500 0.562500
+vt 0.427083 0.562500
+vt 0.427083 0.552083
+vt 0.437500 0.552083
+vt 0.447917 0.552083
+vt 0.447917 0.562500
+vt 0.458333 0.552083
+vt 0.458333 0.562500
+vt 0.447917 0.572917
+vt 0.437500 0.572917
+vt 0.447917 0.583333
+vt 0.437500 0.583333
+vt 0.458333 0.572917
+vt 0.458333 0.583333
+vt 0.427083 0.572917
+vt 0.427083 0.583333
+vt 0.479167 0.562500
+vt 0.468750 0.562500
+vt 0.468750 0.552083
+vt 0.479167 0.552083
+vt 0.489583 0.552083
+vt 0.489583 0.562500
+vt 0.500000 0.552083
+vt 0.500000 0.562500
+vt 0.489583 0.572917
+vt 0.479167 0.572917
+vt 0.489583 0.583333
+vt 0.479167 0.583333
+vt 0.500000 0.572917
+vt 0.500000 0.583333
+vt 0.468750 0.572917
+vt 0.468750 0.583333
+vt 0.520833 0.562500
+vt 0.510417 0.562500
+vt 0.510417 0.552083
+vt 0.520833 0.552083
+vt 0.531250 0.552083
+vt 0.531250 0.562500
+vt 0.541667 0.552083
+vt 0.541667 0.562500
+vt 0.531250 0.572917
+vt 0.520833 0.572917
+vt 0.531250 0.583333
+vt 0.520833 0.583333
+vt 0.541667 0.572917
+vt 0.541667 0.583333
+vt 0.510417 0.572917
+vt 0.510417 0.583333
+vt 0.562500 0.562500
+vt 0.552083 0.562500
+vt 0.552083 0.552083
+vt 0.562500 0.552083
+vt 0.572917 0.552083
+vt 0.572917 0.562500
+vt 0.583333 0.552083
+vt 0.583333 0.562500
+vt 0.572917 0.572917
+vt 0.562500 0.572917
+vt 0.572917 0.583333
+vt 0.562500 0.583333
+vt 0.583333 0.572917
+vt 0.583333 0.583333
+vt 0.552083 0.572917
+vt 0.552083 0.583333
+vt 0.604167 0.562500
+vt 0.593750 0.562500
+vt 0.593750 0.552083
+vt 0.604167 0.552083
+vt 0.614583 0.552083
+vt 0.614583 0.562500
+vt 0.625000 0.552083
+vt 0.625000 0.562500
+vt 0.614583 0.572917
+vt 0.604167 0.572917
+vt 0.614583 0.583333
+vt 0.604167 0.583333
+vt 0.625000 0.572917
+vt 0.625000 0.583333
+vt 0.593750 0.572917
+vt 0.593750 0.583333
+vt 0.645833 0.562500
+vt 0.635417 0.562500
+vt 0.635417 0.552083
+vt 0.645833 0.552083
+vt 0.656250 0.552083
+vt 0.656250 0.562500
+vt 0.666667 0.552083
+vt 0.666667 0.562500
+vt 0.656250 0.572917
+vt 0.645833 0.572917
+vt 0.656250 0.583333
+vt 0.645833 0.583333
+vt 0.666667 0.572917
+vt 0.666667 0.583333
+vt 0.635417 0.572917
+vt 0.635417 0.583333
+vt 0.687500 0.562500
+vt 0.677083 0.562500
+vt 0.677083 0.552083
+vt 0.687500 0.552083
+vt 0.697917 0.552083
+vt 0.697917 0.562500
+vt 0.708333 0.552083
+vt 0.708333 0.562500
+vt 0.697917 0.572917
+vt 0.687500 0.572917
+vt 0.697917 0.583333
+vt 0.687500 0.583333
+vt 0.708333 0.572917
+vt 0.708333 0.583333
+vt 0.677083 0.572917
+vt 0.677083 0.583333
+vt 0.729167 0.562500
+vt 0.718750 0.562500
+vt 0.718750 0.552083
+vt 0.729167 0.552083
+vt 0.739583 0.552083
+vt 0.739583 0.562500
+vt 0.750000 0.552083
+vt 0.750000 0.562500
+vt 0.739583 0.572917
+vt 0.729167 0.572917
+vt 0.739583 0.583333
+vt 0.729167 0.583333
+vt 0.750000 0.572917
+vt 0.750000 0.583333
+vt 0.718750 0.572917
+vt 0.718750 0.583333
+vt 0.770833 0.562500
+vt 0.760417 0.562500
+vt 0.760417 0.552083
+vt 0.770833 0.552083
+vt 0.781250 0.552083
+vt 0.781250 0.562500
+vt 0.791667 0.552083
+vt 0.791667 0.562500
+vt 0.781250 0.572917
+vt 0.770833 0.572917
+vt 0.781250 0.583333
+vt 0.770833 0.583333
+vt 0.791667 0.572917
+vt 0.791667 0.583333
+vt 0.760417 0.572917
+vt 0.760417 0.583333
+vt 0.812500 0.562500
+vt 0.802083 0.562500
+vt 0.802083 0.552083
+vt 0.812500 0.552083
+vt 0.822917 0.552083
+vt 0.822917 0.562500
+vt 0.833333 0.552083
+vt 0.833333 0.562500
+vt 0.822917 0.572917
+vt 0.812500 0.572917
+vt 0.822917 0.583333
+vt 0.812500 0.583333
+vt 0.833333 0.572917
+vt 0.833333 0.583333
+vt 0.802083 0.572917
+vt 0.802083 0.583333
+vt 0.854167 0.562500
+vt 0.843750 0.562500
+vt 0.843750 0.552083
+vt 0.854167 0.552083
+vt 0.864583 0.552083
+vt 0.864583 0.562500
+vt 0.875000 0.552083
+vt 0.875000 0.562500
+vt 0.864583 0.572917
+vt 0.854167 0.572917
+vt 0.864583 0.583333
+vt 0.854167 0.583333
+vt 0.875000 0.572917
+vt 0.875000 0.583333
+vt 0.843750 0.572917
+vt 0.843750 0.583333
+vt 0.895833 0.562500
+vt 0.885417 0.562500
+vt 0.885417 0.552083
+vt 0.895833 0.552083
+vt 0.906250 0.552083
+vt 0.906250 0.562500
+vt 0.916667 0.552083
+vt 0.916667 0.562500
+vt 0.906250 0.572917
+vt 0.895833 0.572917
+vt 0.906250 0.583333
+vt 0.895833 0.583333
+vt 0.916667 0.572917
+vt 0.916667 0.583333
+vt 0.885417 0.572917
+vt 0.885417 0.583333
+vt 0.937500 0.562500
+vt 0.927083 0.562500
+vt 0.927083 0.552083
+vt 0.937500 0.552083
+vt 0.947917 0.552083
+vt 0.947917 0.562500
+vt 0.958333 0.552083
+vt 0.958333 0.562500
+vt 0.947917 0.572917
+vt 0.937500 0.572917
+vt 0.947917 0.583333
+vt 0.937500 0.583333
+vt 0.958333 0.572917
+vt 0.958333 0.583333
+vt 0.927083 0.572917
+vt 0.927083 0.583333
+vt 0.979167 0.562500
+vt 0.968750 0.562500
+vt 0.968750 0.552083
+vt 0.979167 0.552083
+vt 0.989583 0.552083
+vt 0.989583 0.562500
+vt 1.000000 0.552083
+vt 1.000000 0.562500
+vt 0.989583 0.572917
+vt 0.979167 0.572917
+vt 0.989583 0.583333
+vt 0.979167 0.583333
+vt 1.000000 0.572917
+vt 1.000000 0.583333
+vt 0.968750 0.572917
+vt 0.968750 0.583333
+vt 0.020833 0.604167
+vt 0.010417 0.604167
+vt 0.010417 0.593750
+vt 0.020833 0.593750
+vt 0.000000 0.604167
+vt 0.000000 0.593750
+vt 0.031250 0.593750
+vt 0.031250 0.604167
+vt 0.041667 0.593750
+vt 0.041667 0.604167
+vt 0.031250 0.614583
+vt 0.020833 0.614583
+vt 0.031250 0.625000
+vt 0.020833 0.625000
+vt 0.041667 0.614583
+vt 0.041667 0.625000
+vt 0.010417 0.614583
+vt 0.000000 0.614583
+vt 0.010417 0.625000
+vt 0.000000 0.625000
+vt 0.062500 0.604167
+vt 0.052083 0.604167
+vt 0.052083 0.593750
+vt 0.062500 0.593750
+vt 0.072917 0.593750
+vt 0.072917 0.604167
+vt 0.083333 0.593750
+vt 0.083333 0.604167
+vt 0.072917 0.614583
+vt 0.062500 0.614583
+vt 0.072917 0.625000
+vt 0.062500 0.625000
+vt 0.083333 0.614583
+vt 0.083333 0.625000
+vt 0.052083 0.614583
+vt 0.052083 0.625000
+vt 0.104167 0.604167
+vt 0.093750 0.604167
+vt 0.093750 0.593750
+vt 0.104167 0.593750
+vt 0.114583 0.593750
+vt 0.114583 0.604167
+vt 0.125000 0.593750
+vt 0.125000 0.604167
+vt 0.114583 0.614583
+vt 0.104167 0.614583
+vt 0.114583 0.625000
+vt 0.104167 0.625000
+vt 0.125000 0.614583
+vt 0.125000 0.625000
+vt 0.093750 0.614583
+vt 0.093750 0.625000
+vt 0.145833 0.604167
+vt 0.135417 0.604167
+vt 0.135417 0.593750
+vt 0.145833 0.593750
+vt 0.156250 0.593750
+vt 0.156250 0.604167
+vt 0.166667 0.593750
+vt 0.166667 0.604167
+vt 0.156250 0.614583
+vt 0.145833 0.614583
+vt 0.156250 0.625000
+vt 0.145833 0.625000
+vt 0.166667 0.614583
+vt 0.166667 0.625000
+vt 0.135417 0.614583
+vt 0.135417 0.625000
+vt 0.187500 0.604167
+vt 0.177083 0.604167
+vt 0.177083 0.593750
+vt 0.187500 0.593750
+vt 0.197917 0.593750
+vt 0.197917 0.604167
+vt 0.208333 0.593750
+vt 0.208333 0.604167
+vt 0.197917 0.614583
+vt 0.187500 0.614583
+vt 0.197917 0.625000
+vt 0.187500 0.625000
+vt 0.208333 0.614583
+vt 0.208333 0.625000
+vt 0.177083 0.614583
+vt 0.177083 0.625000
+vt 0.229167 0.604167
+vt 0.218750 0.604167
+vt 0.218750 0.593750
+vt 0.229167 0.593750
+vt 0.239583 0.593750
+vt 0.239583 0.604167
+vt 0.250000 0.593750
+vt 0.250000 0.604167
+vt 0.239583 0.614583
+vt 0.229167 0.614583
+vt 0.239583 0.625000
+vt 0.229167 0.625000
+vt 0.250000 0.614583
+vt 0.250000 0.625000
+vt 0.218750 0.614583
+vt 0.218750 0.625000
+vt 0.270833 0.604167
+vt 0.260417 0.604167
+vt 0.260417 0.593750
+vt 0.270833 0.593750
+vt 0.281250 0.593750
+vt 0.281250 0.604167
+vt 0.291667 0.593750
+vt 0.291667 0.604167
+vt 0.281250 0.614583
+vt 0.270833 0.614583
+vt 0.281250 0.625000
+vt 0.270833 0.625000
+vt 0.291667 0.614583
+vt 0.291667 0.625000
+vt 0.260417 0.614583
+vt 0.260417 0.625000
+vt 0.312500 0.604167
+vt 0.302083 0.604167
+vt 0.302083 0.593750
+vt 0.312500 0.593750
+vt 0.322917 0.593750
+vt 0.322917 0.604167
+vt 0.333333 0.593750
+vt 0.333333 0.604167
+vt 0.322917 0.614583
+vt 0.312500 0.614583
+vt 0.322917 0.625000
+vt 0.312500 0.625000
+vt 0.333333 0.614583
+vt 0.333333 0.625000
+vt 0.302083 0.614583
+vt 0.302083 0.625000
+vt 0.354167 0.604167
+vt 0.343750 0.604167
+vt 0.343750 0.593750
+vt 0.354167 0.593750
+vt 0.364583 0.593750
+vt 0.364583 0.604167
+vt 0.375000 0.593750
+vt 0.375000 0.604167
+vt 0.364583 0.614583
+vt 0.354167 0.614583
+vt 0.364583 0.625000
+vt 0.354167 0.625000
+vt 0.375000 0.614583
+vt 0.375000 0.625000
+vt 0.343750 0.614583
+vt 0.343750 0.625000
+vt 0.395833 0.604167
+vt 0.385417 0.604167
+vt 0.385417 0.593750
+vt 0.395833 0.593750
+vt 0.406250 0.593750
+vt 0.406250 0.604167
+vt 0.416667 0.593750
+vt 0.416667 0.604167
+vt 0.406250 0.614583
+vt 0.395833 0.614583
+vt 0.406250 0.625000
+vt 0.395833 0.625000
+vt 0.416667 0.614583
+vt 0.416667 0.625000
+vt 0.385417 0.614583
+vt 0.385417 0.625000
+vt 0.437500 0.604167
+vt 0.427083 0.604167
+vt 0.427083 0.593750
+vt 0.437500 0.593750
+vt 0.447917 0.593750
+vt 0.447917 0.604167
+vt 0.458333 0.593750
+vt 0.458333 0.604167
+vt 0.447917 0.614583
+vt 0.437500 0.614583
+vt 0.447917 0.625000
+vt 0.437500 0.625000
+vt 0.458333 0.614583
+vt 0.458333 0.625000
+vt 0.427083 0.614583
+vt 0.427083 0.625000
+vt 0.479167 0.604167
+vt 0.468750 0.604167
+vt 0.468750 0.593750
+vt 0.479167 0.593750
+vt 0.489583 0.593750
+vt 0.489583 0.604167
+vt 0.500000 0.593750
+vt 0.500000 0.604167
+vt 0.489583 0.614583
+vt 0.479167 0.614583
+vt 0.489583 0.625000
+vt 0.479167 0.625000
+vt 0.500000 0.614583
+vt 0.500000 0.625000
+vt 0.468750 0.614583
+vt 0.468750 0.625000
+vt 0.520833 0.604167
+vt 0.510417 0.604167
+vt 0.510417 0.593750
+vt 0.520833 0.593750
+vt 0.531250 0.593750
+vt 0.531250 0.604167
+vt 0.541667 0.593750
+vt 0.541667 0.604167
+vt 0.531250 0.614583
+vt 0.520833 0.614583
+vt 0.531250 0.625000
+vt 0.520833 0.625000
+vt 0.541667 0.614583
+vt 0.541667 0.625000
+vt 0.510417 0.614583
+vt 0.510417 0.625000
+vt 0.562500 0.604167
+vt 0.552083 0.604167
+vt 0.552083 0.593750
+vt 0.562500 0.593750
+vt 0.572917 0.593750
+vt 0.572917 0.604167
+vt 0.583333 0.593750
+vt 0.583333 0.604167
+vt 0.572917 0.614583
+vt 0.562500 0.614583
+vt 0.572917 0.625000
+vt 0.562500 0.625000
+vt 0.583333 0.614583
+vt 0.583333 0.625000
+vt 0.552083 0.614583
+vt 0.552083 0.625000
+vt 0.604167 0.604167
+vt 0.593750 0.604167
+vt 0.593750 0.593750
+vt 0.604167 0.593750
+vt 0.614583 0.593750
+vt 0.614583 0.604167
+vt 0.625000 0.593750
+vt 0.625000 0.604167
+vt 0.614583 0.614583
+vt 0.604167 0.614583
+vt 0.614583 0.625000
+vt 0.604167 0.625000
+vt 0.625000 0.614583
+vt 0.625000 0.625000
+vt 0.593750 0.614583
+vt 0.593750 0.625000
+vt 0.645833 0.604167
+vt 0.635417 0.604167
+vt 0.635417 0.593750
+vt 0.645833 0.593750
+vt 0.656250 0.593750
+vt 0.656250 0.604167
+vt 0.666667 0.593750
+vt 0.666667 0.604167
+vt 0.656250 0.614583
+vt 0.645833 0.614583
+vt 0.656250 0.625000
+vt 0.645833 0.625000
+vt 0.666667 0.614583
+vt 0.666667 0.625000
+vt 0.635417 0.614583
+vt 0.635417 0.625000
+vt 0.687500 0.604167
+vt 0.677083 0.604167
+vt 0.677083 0.593750
+vt 0.687500 0.593750
+vt 0.697917 0.593750
+vt 0.697917 0.604167
+vt 0.708333 0.593750
+vt 0.708333 0.604167
+vt 0.697917 0.614583
+vt 0.687500 0.614583
+vt 0.697917 0.625000
+vt 0.687500 0.625000
+vt 0.708333 0.614583
+vt 0.708333 0.625000
+vt 0.677083 0.614583
+vt 0.677083 0.625000
+vt 0.729167 0.604167
+vt 0.718750 0.604167
+vt 0.718750 0.593750
+vt 0.729167 0.593750
+vt 0.739583 0.593750
+vt 0.739583 0.604167
+vt 0.750000 0.593750
+vt 0.750000 0.604167
+vt 0.739583 0.614583
+vt 0.729167 0.614583
+vt 0.739583 0.625000
+vt 0.729167 0.625000
+vt 0.750000 0.614583
+vt 0.750000 0.625000
+vt 0.718750 0.614583
+vt 0.718750 0.625000
+vt 0.770833 0.604167
+vt 0.760417 0.604167
+vt 0.760417 0.593750
+vt 0.770833 0.593750
+vt 0.781250 0.593750
+vt 0.781250 0.604167
+vt 0.791667 0.593750
+vt 0.791667 0.604167
+vt 0.781250 0.614583
+vt 0.770833 0.614583
+vt 0.781250 0.625000
+vt 0.770833 0.625000
+vt 0.791667 0.614583
+vt 0.791667 0.625000
+vt 0.760417 0.614583
+vt 0.760417 0.625000
+vt 0.812500 0.604167
+vt 0.802083 0.604167
+vt 0.802083 0.593750
+vt 0.812500 0.593750
+vt 0.822917 0.593750
+vt 0.822917 0.604167
+vt 0.833333 0.593750
+vt 0.833333 0.604167
+vt 0.822917 0.614583
+vt 0.812500 0.614583
+vt 0.822917 0.625000
+vt 0.812500 0.625000
+vt 0.833333 0.614583
+vt 0.833333 0.625000
+vt 0.802083 0.614583
+vt 0.802083 0.625000
+vt 0.854167 0.604167
+vt 0.843750 0.604167
+vt 0.843750 0.593750
+vt 0.854167 0.593750
+vt 0.864583 0.593750
+vt 0.864583 0.604167
+vt 0.875000 0.593750
+vt 0.875000 0.604167
+vt 0.864583 0.614583
+vt 0.854167 0.614583
+vt 0.864583 0.625000
+vt 0.854167 0.625000
+vt 0.875000 0.614583
+vt 0.875000 0.625000
+vt 0.843750 0.614583
+vt 0.843750 0.625000
+vt 0.895833 0.604167
+vt 0.885417 0.604167
+vt 0.885417 0.593750
+vt 0.895833 0.593750
+vt 0.906250 0.593750
+vt 0.906250 0.604167
+vt 0.916667 0.593750
+vt 0.916667 0.604167
+vt 0.906250 0.614583
+vt 0.895833 0.614583
+vt 0.906250 0.625000
+vt 0.895833 0.625000
+vt 0.916667 0.614583
+vt 0.916667 0.625000
+vt 0.885417 0.614583
+vt 0.885417 0.625000
+vt 0.937500 0.604167
+vt 0.927083 0.604167
+vt 0.927083 0.593750
+vt 0.937500 0.593750
+vt 0.947917 0.593750
+vt 0.947917 0.604167
+vt 0.958333 0.593750
+vt 0.958333 0.604167
+vt 0.947917 0.614583
+vt 0.937500 0.614583
+vt 0.947917 0.625000
+vt 0.937500 0.625000
+vt 0.958333 0.614583
+vt 0.958333 0.625000
+vt 0.927083 0.614583
+vt 0.927083 0.625000
+vt 0.979167 0.604167
+vt 0.968750 0.604167
+vt 0.968750 0.593750
+vt 0.979167 0.593750
+vt 0.989583 0.593750
+vt 0.989583 0.604167
+vt 1.000000 0.593750
+vt 1.000000 0.604167
+vt 0.989583 0.614583
+vt 0.979167 0.614583
+vt 0.989583 0.625000
+vt 0.979167 0.625000
+vt 1.000000 0.614583
+vt 1.000000 0.625000
+vt 0.968750 0.614583
+vt 0.968750 0.625000
+vt 0.020833 0.645833
+vt 0.010417 0.645833
+vt 0.010417 0.635417
+vt 0.020833 0.635417
+vt 0.000000 0.645833
+vt 0.000000 0.635417
+vt 0.031250 0.635417
+vt 0.031250 0.645833
+vt 0.041667 0.635417
+vt 0.041667 0.645833
+vt 0.031250 0.656250
+vt 0.020833 0.656250
+vt 0.031250 0.666667
+vt 0.020833 0.666667
+vt 0.041667 0.656250
+vt 0.041667 0.666667
+vt 0.010417 0.656250
+vt 0.000000 0.656250
+vt 0.010417 0.666667
+vt 0.000000 0.666667
+vt 0.062500 0.645833
+vt 0.052083 0.645833
+vt 0.052083 0.635417
+vt 0.062500 0.635417
+vt 0.072917 0.635417
+vt 0.072917 0.645833
+vt 0.083333 0.635417
+vt 0.083333 0.645833
+vt 0.072917 0.656250
+vt 0.062500 0.656250
+vt 0.072917 0.666667
+vt 0.062500 0.666667
+vt 0.083333 0.656250
+vt 0.083333 0.666667
+vt 0.052083 0.656250
+vt 0.052083 0.666667
+vt 0.104167 0.645833
+vt 0.093750 0.645833
+vt 0.093750 0.635417
+vt 0.104167 0.635417
+vt 0.114583 0.635417
+vt 0.114583 0.645833
+vt 0.125000 0.635417
+vt 0.125000 0.645833
+vt 0.114583 0.656250
+vt 0.104167 0.656250
+vt 0.114583 0.666667
+vt 0.104167 0.666667
+vt 0.125000 0.656250
+vt 0.125000 0.666667
+vt 0.093750 0.656250
+vt 0.093750 0.666667
+vt 0.145833 0.645833
+vt 0.135417 0.645833
+vt 0.135417 0.635417
+vt 0.145833 0.635417
+vt 0.156250 0.635417
+vt 0.156250 0.645833
+vt 0.166667 0.635417
+vt 0.166667 0.645833
+vt 0.156250 0.656250
+vt 0.145833 0.656250
+vt 0.156250 0.666667
+vt 0.145833 0.666667
+vt 0.166667 0.656250
+vt 0.166667 0.666667
+vt 0.135417 0.656250
+vt 0.135417 0.666667
+vt 0.187500 0.645833
+vt 0.177083 0.645833
+vt 0.177083 0.635417
+vt 0.187500 0.635417
+vt 0.197917 0.635417
+vt 0.197917 0.645833
+vt 0.208333 0.635417
+vt 0.208333 0.645833
+vt 0.197917 0.656250
+vt 0.187500 0.656250
+vt 0.197917 0.666667
+vt 0.187500 0.666667
+vt 0.208333 0.656250
+vt 0.208333 0.666667
+vt 0.177083 0.656250
+vt 0.177083 0.666667
+vt 0.229167 0.645833
+vt 0.218750 0.645833
+vt 0.218750 0.635417
+vt 0.229167 0.635417
+vt 0.239583 0.635417
+vt 0.239583 0.645833
+vt 0.250000 0.635417
+vt 0.250000 0.645833
+vt 0.239583 0.656250
+vt 0.229167 0.656250
+vt 0.239583 0.666667
+vt 0.229167 0.666667
+vt 0.250000 0.656250
+vt 0.250000 0.666667
+vt 0.218750 0.656250
+vt 0.218750 0.666667
+vt 0.270833 0.645833
+vt 0.260417 0.645833
+vt 0.260417 0.635417
+vt 0.270833 0.635417
+vt 0.281250 0.635417
+vt 0.281250 0.645833
+vt 0.291667 0.635417
+vt 0.291667 0.645833
+vt 0.281250 0.656250
+vt 0.270833 0.656250
+vt 0.281250 0.666667
+vt 0.270833 0.666667
+vt 0.291667 0.656250
+vt 0.291667 0.666667
+vt 0.260417 0.656250
+vt 0.260417 0.666667
+vt 0.312500 0.645833
+vt 0.302083 0.645833
+vt 0.302083 0.635417
+vt 0.312500 0.635417
+vt 0.322917 0.635417
+vt 0.322917 0.645833
+vt 0.333333 0.635417
+vt 0.333333 0.645833
+vt 0.322917 0.656250
+vt 0.312500 0.656250
+vt 0.322917 0.666667
+vt 0.312500 0.666667
+vt 0.333333 0.656250
+vt 0.333333 0.666667
+vt 0.302083 0.656250
+vt 0.302083 0.666667
+vt 0.354167 0.645833
+vt 0.343750 0.645833
+vt 0.343750 0.635417
+vt 0.354167 0.635417
+vt 0.364583 0.635417
+vt 0.364583 0.645833
+vt 0.375000 0.635417
+vt 0.375000 0.645833
+vt 0.364583 0.656250
+vt 0.354167 0.656250
+vt 0.364583 0.666667
+vt 0.354167 0.666667
+vt 0.375000 0.656250
+vt 0.375000 0.666667
+vt 0.343750 0.656250
+vt 0.343750 0.666667
+vt 0.395833 0.645833
+vt 0.385417 0.645833
+vt 0.385417 0.635417
+vt 0.395833 0.635417
+vt 0.406250 0.635417
+vt 0.406250 0.645833
+vt 0.416667 0.635417
+vt 0.416667 0.645833
+vt 0.406250 0.656250
+vt 0.395833 0.656250
+vt 0.406250 0.666667
+vt 0.395833 0.666667
+vt 0.416667 0.656250
+vt 0.416667 0.666667
+vt 0.385417 0.656250
+vt 0.385417 0.666667
+vt 0.437500 0.645833
+vt 0.427083 0.645833
+vt 0.427083 0.635417
+vt 0.437500 0.635417
+vt 0.447917 0.635417
+vt 0.447917 0.645833
+vt 0.458333 0.635417
+vt 0.458333 0.645833
+vt 0.447917 0.656250
+vt 0.437500 0.656250
+vt 0.447917 0.666667
+vt 0.437500 0.666667
+vt 0.458333 0.656250
+vt 0.458333 0.666667
+vt 0.427083 0.656250
+vt 0.427083 0.666667
+vt 0.479167 0.645833
+vt 0.468750 0.645833
+vt 0.468750 0.635417
+vt 0.479167 0.635417
+vt 0.489583 0.635417
+vt 0.489583 0.645833
+vt 0.500000 0.635417
+vt 0.500000 0.645833
+vt 0.489583 0.656250
+vt 0.479167 0.656250
+vt 0.489583 0.666667
+vt 0.479167 0.666667
+vt 0.500000 0.656250
+vt 0.500000 0.666667
+vt 0.468750 0.656250
+vt 0.468750 0.666667
+vt 0.520833 0.645833
+vt 0.510417 0.645833
+vt 0.510417 0.635417
+vt 0.520833 0.635417
+vt 0.531250 0.635417
+vt 0.531250 0.645833
+vt 0.541667 0.635417
+vt 0.541667 0.645833
+vt 0.531250 0.656250
+vt 0.520833 0.656250
+vt 0.531250 0.666667
+vt 0.520833 0.666667
+vt 0.541667 0.656250
+vt 0.541667 0.666667
+vt 0.510417 0.656250
+vt 0.510417 0.666667
+vt 0.562500 0.645833
+vt 0.552083 0.645833
+vt 0.552083 0.635417
+vt 0.562500 0.635417
+vt 0.572917 0.635417
+vt 0.572917 0.645833
+vt 0.583333 0.635417
+vt 0.583333 0.645833
+vt 0.572917 0.656250
+vt 0.562500 0.656250
+vt 0.572917 0.666667
+vt 0.562500 0.666667
+vt 0.583333 0.656250
+vt 0.583333 0.666667
+vt 0.552083 0.656250
+vt 0.552083 0.666667
+vt 0.604167 0.645833
+vt 0.593750 0.645833
+vt 0.593750 0.635417
+vt 0.604167 0.635417
+vt 0.614583 0.635417
+vt 0.614583 0.645833
+vt 0.625000 0.635417
+vt 0.625000 0.645833
+vt 0.614583 0.656250
+vt 0.604167 0.656250
+vt 0.614583 0.666667
+vt 0.604167 0.666667
+vt 0.625000 0.656250
+vt 0.625000 0.666667
+vt 0.593750 0.656250
+vt 0.593750 0.666667
+vt 0.645833 0.645833
+vt 0.635417 0.645833
+vt 0.635417 0.635417
+vt 0.645833 0.635417
+vt 0.656250 0.635417
+vt 0.656250 0.645833
+vt 0.666667 0.635417
+vt 0.666667 0.645833
+vt 0.656250 0.656250
+vt 0.645833 0.656250
+vt 0.656250 0.666667
+vt 0.645833 0.666667
+vt 0.666667 0.656250
+vt 0.666667 0.666667
+vt 0.635417 0.656250
+vt 0.635417 0.666667
+vt 0.687500 0.645833
+vt 0.677083 0.645833
+vt 0.677083 0.635417
+vt 0.687500 0.635417
+vt 0.697917 0.635417
+vt 0.697917 0.645833
+vt 0.708333 0.635417
+vt 0.708333 0.645833
+vt 0.697917 0.656250
+vt 0.687500 0.656250
+vt 0.697917 0.666667
+vt 0.687500 0.666667
+vt 0.708333 0.656250
+vt 0.708333 0.666667
+vt 0.677083 0.656250
+vt 0.677083 0.666667
+vt 0.729167 0.645833
+vt 0.718750 0.645833
+vt 0.718750 0.635417
+vt 0.729167 0.635417
+vt 0.739583 0.635417
+vt 0.739583 0.645833
+vt 0.750000 0.635417
+vt 0.750000 0.645833
+vt 0.739583 0.656250
+vt 0.729167 0.656250
+vt 0.739583 0.666667
+vt 0.729167 0.666667
+vt 0.750000 0.656250
+vt 0.750000 0.666667
+vt 0.718750 0.656250
+vt 0.718750 0.666667
+vt 0.770833 0.645833
+vt 0.760417 0.645833
+vt 0.760417 0.635417
+vt 0.770833 0.635417
+vt 0.781250 0.635417
+vt 0.781250 0.645833
+vt 0.791667 0.635417
+vt 0.791667 0.645833
+vt 0.781250 0.656250
+vt 0.770833 0.656250
+vt 0.781250 0.666667
+vt 0.770833 0.666667
+vt 0.791667 0.656250
+vt 0.791667 0.666667
+vt 0.760417 0.656250
+vt 0.760417 0.666667
+vt 0.812500 0.645833
+vt 0.802083 0.645833
+vt 0.802083 0.635417
+vt 0.812500 0.635417
+vt 0.822917 0.635417
+vt 0.822917 0.645833
+vt 0.833333 0.635417
+vt 0.833333 0.645833
+vt 0.822917 0.656250
+vt 0.812500 0.656250
+vt 0.822917 0.666667
+vt 0.812500 0.666667
+vt 0.833333 0.656250
+vt 0.833333 0.666667
+vt 0.802083 0.656250
+vt 0.802083 0.666667
+vt 0.854167 0.645833
+vt 0.843750 0.645833
+vt 0.843750 0.635417
+vt 0.854167 0.635417
+vt 0.864583 0.635417
+vt 0.864583 0.645833
+vt 0.875000 0.635417
+vt 0.875000 0.645833
+vt 0.864583 0.656250
+vt 0.854167 0.656250
+vt 0.864583 0.666667
+vt 0.854167 0.666667
+vt 0.875000 0.656250
+vt 0.875000 0.666667
+vt 0.843750 0.656250
+vt 0.843750 0.666667
+vt 0.895833 0.645833
+vt 0.885417 0.645833
+vt 0.885417 0.635417
+vt 0.895833 0.635417
+vt 0.906250 0.635417
+vt 0.906250 0.645833
+vt 0.916667 0.635417
+vt 0.916667 0.645833
+vt 0.906250 0.656250
+vt 0.895833 0.656250
+vt 0.906250 0.666667
+vt 0.895833 0.666667
+vt 0.916667 0.656250
+vt 0.916667 0.666667
+vt 0.885417 0.656250
+vt 0.885417 0.666667
+vt 0.937500 0.645833
+vt 0.927083 0.645833
+vt 0.927083 0.635417
+vt 0.937500 0.635417
+vt 0.947917 0.635417
+vt 0.947917 0.645833
+vt 0.958333 0.635417
+vt 0.958333 0.645833
+vt 0.947917 0.656250
+vt 0.937500 0.656250
+vt 0.947917 0.666667
+vt 0.937500 0.666667
+vt 0.958333 0.656250
+vt 0.958333 0.666667
+vt 0.927083 0.656250
+vt 0.927083 0.666667
+vt 0.979167 0.645833
+vt 0.968750 0.645833
+vt 0.968750 0.635417
+vt 0.979167 0.635417
+vt 0.989583 0.635417
+vt 0.989583 0.645833
+vt 1.000000 0.635417
+vt 1.000000 0.645833
+vt 0.989583 0.656250
+vt 0.979167 0.656250
+vt 0.989583 0.666667
+vt 0.979167 0.666667
+vt 1.000000 0.656250
+vt 1.000000 0.666667
+vt 0.968750 0.656250
+vt 0.968750 0.666667
+vt 0.020833 0.687500
+vt 0.010417 0.687500
+vt 0.010417 0.677083
+vt 0.020833 0.677083
+vt 0.000000 0.687500
+vt 0.000000 0.677083
+vt 0.031250 0.677083
+vt 0.031250 0.687500
+vt 0.041667 0.677083
+vt 0.041667 0.687500
+vt 0.031250 0.697917
+vt 0.020833 0.697917
+vt 0.031250 0.708333
+vt 0.020833 0.708333
+vt 0.041667 0.697917
+vt 0.041667 0.708333
+vt 0.010417 0.697917
+vt 0.000000 0.697917
+vt 0.010417 0.708333
+vt 0.000000 0.708333
+vt 0.062500 0.687500
+vt 0.052083 0.687500
+vt 0.052083 0.677083
+vt 0.062500 0.677083
+vt 0.072917 0.677083
+vt 0.072917 0.687500
+vt 0.083333 0.677083
+vt 0.083333 0.687500
+vt 0.072917 0.697917
+vt 0.062500 0.697917
+vt 0.072917 0.708333
+vt 0.062500 0.708333
+vt 0.083333 0.697917
+vt 0.083333 0.708333
+vt 0.052083 0.697917
+vt 0.052083 0.708333
+vt 0.104167 0.687500
+vt 0.093750 0.687500
+vt 0.093750 0.677083
+vt 0.104167 0.677083
+vt 0.114583 0.677083
+vt 0.114583 0.687500
+vt 0.125000 0.677083
+vt 0.125000 0.687500
+vt 0.114583 0.697917
+vt 0.104167 0.697917
+vt 0.114583 0.708333
+vt 0.104167 0.708333
+vt 0.125000 0.697917
+vt 0.125000 0.708333
+vt 0.093750 0.697917
+vt 0.093750 0.708333
+vt 0.145833 0.687500
+vt 0.135417 0.687500
+vt 0.135417 0.677083
+vt 0.145833 0.677083
+vt 0.156250 0.677083
+vt 0.156250 0.687500
+vt 0.166667 0.677083
+vt 0.166667 0.687500
+vt 0.156250 0.697917
+vt 0.145833 0.697917
+vt 0.156250 0.708333
+vt 0.145833 0.708333
+vt 0.166667 0.697917
+vt 0.166667 0.708333
+vt 0.135417 0.697917
+vt 0.135417 0.708333
+vt 0.187500 0.687500
+vt 0.177083 0.687500
+vt 0.177083 0.677083
+vt 0.187500 0.677083
+vt 0.197917 0.677083
+vt 0.197917 0.687500
+vt 0.208333 0.677083
+vt 0.208333 0.687500
+vt 0.197917 0.697917
+vt 0.187500 0.697917
+vt 0.197917 0.708333
+vt 0.187500 0.708333
+vt 0.208333 0.697917
+vt 0.208333 0.708333
+vt 0.177083 0.697917
+vt 0.177083 0.708333
+vt 0.229167 0.687500
+vt 0.218750 0.687500
+vt 0.218750 0.677083
+vt 0.229167 0.677083
+vt 0.239583 0.677083
+vt 0.239583 0.687500
+vt 0.250000 0.677083
+vt 0.250000 0.687500
+vt 0.239583 0.697917
+vt 0.229167 0.697917
+vt 0.239583 0.708333
+vt 0.229167 0.708333
+vt 0.250000 0.697917
+vt 0.250000 0.708333
+vt 0.218750 0.697917
+vt 0.218750 0.708333
+vt 0.270833 0.687500
+vt 0.260417 0.687500
+vt 0.260417 0.677083
+vt 0.270833 0.677083
+vt 0.281250 0.677083
+vt 0.281250 0.687500
+vt 0.291667 0.677083
+vt 0.291667 0.687500
+vt 0.281250 0.697917
+vt 0.270833 0.697917
+vt 0.281250 0.708333
+vt 0.270833 0.708333
+vt 0.291667 0.697917
+vt 0.291667 0.708333
+vt 0.260417 0.697917
+vt 0.260417 0.708333
+vt 0.312500 0.687500
+vt 0.302083 0.687500
+vt 0.302083 0.677083
+vt 0.312500 0.677083
+vt 0.322917 0.677083
+vt 0.322917 0.687500
+vt 0.333333 0.677083
+vt 0.333333 0.687500
+vt 0.322917 0.697917
+vt 0.312500 0.697917
+vt 0.322917 0.708333
+vt 0.312500 0.708333
+vt 0.333333 0.697917
+vt 0.333333 0.708333
+vt 0.302083 0.697917
+vt 0.302083 0.708333
+vt 0.354167 0.687500
+vt 0.343750 0.687500
+vt 0.343750 0.677083
+vt 0.354167 0.677083
+vt 0.364583 0.677083
+vt 0.364583 0.687500
+vt 0.375000 0.677083
+vt 0.375000 0.687500
+vt 0.364583 0.697917
+vt 0.354167 0.697917
+vt 0.364583 0.708333
+vt 0.354167 0.708333
+vt 0.375000 0.697917
+vt 0.375000 0.708333
+vt 0.343750 0.697917
+vt 0.343750 0.708333
+vt 0.395833 0.687500
+vt 0.385417 0.687500
+vt 0.385417 0.677083
+vt 0.395833 0.677083
+vt 0.406250 0.677083
+vt 0.406250 0.687500
+vt 0.416667 0.677083
+vt 0.416667 0.687500
+vt 0.406250 0.697917
+vt 0.395833 0.697917
+vt 0.406250 0.708333
+vt 0.395833 0.708333
+vt 0.416667 0.697917
+vt 0.416667 0.708333
+vt 0.385417 0.697917
+vt 0.385417 0.708333
+vt 0.437500 0.687500
+vt 0.427083 0.687500
+vt 0.427083 0.677083
+vt 0.437500 0.677083
+vt 0.447917 0.677083
+vt 0.447917 0.687500
+vt 0.458333 0.677083
+vt 0.458333 0.687500
+vt 0.447917 0.697917
+vt 0.437500 0.697917
+vt 0.447917 0.708333
+vt 0.437500 0.708333
+vt 0.458333 0.697917
+vt 0.458333 0.708333
+vt 0.427083 0.697917
+vt 0.427083 0.708333
+vt 0.479167 0.687500
+vt 0.468750 0.687500
+vt 0.468750 0.677083
+vt 0.479167 0.677083
+vt 0.489583 0.677083
+vt 0.489583 0.687500
+vt 0.500000 0.677083
+vt 0.500000 0.687500
+vt 0.489583 0.697917
+vt 0.479167 0.697917
+vt 0.489583 0.708333
+vt 0.479167 0.708333
+vt 0.500000 0.697917
+vt 0.500000 0.708333
+vt 0.468750 0.697917
+vt 0.468750 0.708333
+vt 0.520833 0.687500
+vt 0.510417 0.687500
+vt 0.510417 0.677083
+vt 0.520833 0.677083
+vt 0.531250 0.677083
+vt 0.531250 0.687500
+vt 0.541667 0.677083
+vt 0.541667 0.687500
+vt 0.531250 0.697917
+vt 0.520833 0.697917
+vt 0.531250 0.708333
+vt 0.520833 0.708333
+vt 0.541667 0.697917
+vt 0.541667 0.708333
+vt 0.510417 0.697917
+vt 0.510417 0.708333
+vt 0.562500 0.687500
+vt 0.552083 0.687500
+vt 0.552083 0.677083
+vt 0.562500 0.677083
+vt 0.572917 0.677083
+vt 0.572917 0.687500
+vt 0.583333 0.677083
+vt 0.583333 0.687500
+vt 0.572917 0.697917
+vt 0.562500 0.697917
+vt 0.572917 0.708333
+vt 0.562500 0.708333
+vt 0.583333 0.697917
+vt 0.583333 0.708333
+vt 0.552083 0.697917
+vt 0.552083 0.708333
+vt 0.604167 0.687500
+vt 0.593750 0.687500
+vt 0.593750 0.677083
+vt 0.604167 0.677083
+vt 0.614583 0.677083
+vt 0.614583 0.687500
+vt 0.625000 0.677083
+vt 0.625000 0.687500
+vt 0.614583 0.697917
+vt 0.604167 0.697917
+vt 0.614583 0.708333
+vt 0.604167 0.708333
+vt 0.625000 0.697917
+vt 0.625000 0.708333
+vt 0.593750 0.697917
+vt 0.593750 0.708333
+vt 0.645833 0.687500
+vt 0.635417 0.687500
+vt 0.635417 0.677083
+vt 0.645833 0.677083
+vt 0.656250 0.677083
+vt 0.656250 0.687500
+vt 0.666667 0.677083
+vt 0.666667 0.687500
+vt 0.656250 0.697917
+vt 0.645833 0.697917
+vt 0.656250 0.708333
+vt 0.645833 0.708333
+vt 0.666667 0.697917
+vt 0.666667 0.708333
+vt 0.635417 0.697917
+vt 0.635417 0.708333
+vt 0.687500 0.687500
+vt 0.677083 0.687500
+vt 0.677083 0.677083
+vt 0.687500 0.677083
+vt 0.697917 0.677083
+vt 0.697917 0.687500
+vt 0.708333 0.677083
+vt 0.708333 0.687500
+vt 0.697917 0.697917
+vt 0.687500 0.697917
+vt 0.697917 0.708333
+vt 0.687500 0.708333
+vt 0.708333 0.697917
+vt 0.708333 0.708333
+vt 0.677083 0.697917
+vt 0.677083 0.708333
+vt 0.729167 0.687500
+vt 0.718750 0.687500
+vt 0.718750 0.677083
+vt 0.729167 0.677083
+vt 0.739583 0.677083
+vt 0.739583 0.687500
+vt 0.750000 0.677083
+vt 0.750000 0.687500
+vt 0.739583 0.697917
+vt 0.729167 0.697917
+vt 0.739583 0.708333
+vt 0.729167 0.708333
+vt 0.750000 0.697917
+vt 0.750000 0.708333
+vt 0.718750 0.697917
+vt 0.718750 0.708333
+vt 0.770833 0.687500
+vt 0.760417 0.687500
+vt 0.760417 0.677083
+vt 0.770833 0.677083
+vt 0.781250 0.677083
+vt 0.781250 0.687500
+vt 0.791667 0.677083
+vt 0.791667 0.687500
+vt 0.781250 0.697917
+vt 0.770833 0.697917
+vt 0.781250 0.708333
+vt 0.770833 0.708333
+vt 0.791667 0.697917
+vt 0.791667 0.708333
+vt 0.760417 0.697917
+vt 0.760417 0.708333
+vt 0.812500 0.687500
+vt 0.802083 0.687500
+vt 0.802083 0.677083
+vt 0.812500 0.677083
+vt 0.822917 0.677083
+vt 0.822917 0.687500
+vt 0.833333 0.677083
+vt 0.833333 0.687500
+vt 0.822917 0.697917
+vt 0.812500 0.697917
+vt 0.822917 0.708333
+vt 0.812500 0.708333
+vt 0.833333 0.697917
+vt 0.833333 0.708333
+vt 0.802083 0.697917
+vt 0.802083 0.708333
+vt 0.854167 0.687500
+vt 0.843750 0.687500
+vt 0.843750 0.677083
+vt 0.854167 0.677083
+vt 0.864583 0.677083
+vt 0.864583 0.687500
+vt 0.875000 0.677083
+vt 0.875000 0.687500
+vt 0.864583 0.697917
+vt 0.854167 0.697917
+vt 0.864583 0.708333
+vt 0.854167 0.708333
+vt 0.875000 0.697917
+vt 0.875000 0.708333
+vt 0.843750 0.697917
+vt 0.843750 0.708333
+vt 0.895833 0.687500
+vt 0.885417 0.687500
+vt 0.885417 0.677083
+vt 0.895833 0.677083
+vt 0.906250 0.677083
+vt 0.906250 0.687500
+vt 0.916667 0.677083
+vt 0.916667 0.687500
+vt 0.906250 0.697917
+vt 0.895833 0.697917
+vt 0.906250 0.708333
+vt 0.895833 0.708333
+vt 0.916667 0.697917
+vt 0.916667 0.708333
+vt 0.885417 0.697917
+vt 0.885417 0.708333
+vt 0.937500 0.687500
+vt 0.927083 0.687500
+vt 0.927083 0.677083
+vt 0.937500 0.677083
+vt 0.947917 0.677083
+vt 0.947917 0.687500
+vt 0.958333 0.677083
+vt 0.958333 0.687500
+vt 0.947917 0.697917
+vt 0.937500 0.697917
+vt 0.947917 0.708333
+vt 0.937500 0.708333
+vt 0.958333 0.697917
+vt 0.958333 0.708333
+vt 0.927083 0.697917
+vt 0.927083 0.708333
+vt 0.979167 0.687500
+vt 0.968750 0.687500
+vt 0.968750 0.677083
+vt 0.979167 0.677083
+vt 0.989583 0.677083
+vt 0.989583 0.687500
+vt 1.000000 0.677083
+vt 1.000000 0.687500
+vt 0.989583 0.697917
+vt 0.979167 0.697917
+vt 0.989583 0.708333
+vt 0.979167 0.708333
+vt 1.000000 0.697917
+vt 1.000000 0.708333
+vt 0.968750 0.697917
+vt 0.968750 0.708333
+vt 0.020833 0.729167
+vt 0.010417 0.729167
+vt 0.010417 0.718750
+vt 0.020833 0.718750
+vt 0.000000 0.729167
+vt 0.000000 0.718750
+vt 0.031250 0.718750
+vt 0.031250 0.729167
+vt 0.041667 0.718750
+vt 0.041667 0.729167
+vt 0.031250 0.739583
+vt 0.020833 0.739583
+vt 0.031250 0.750000
+vt 0.020833 0.750000
+vt 0.041667 0.739583
+vt 0.041667 0.750000
+vt 0.010417 0.739583
+vt 0.000000 0.739583
+vt 0.010417 0.750000
+vt 0.000000 0.750000
+vt 0.062500 0.729167
+vt 0.052083 0.729167
+vt 0.052083 0.718750
+vt 0.062500 0.718750
+vt 0.072917 0.718750
+vt 0.072917 0.729167
+vt 0.083333 0.718750
+vt 0.083333 0.729167
+vt 0.072917 0.739583
+vt 0.062500 0.739583
+vt 0.072917 0.750000
+vt 0.062500 0.750000
+vt 0.083333 0.739583
+vt 0.083333 0.750000
+vt 0.052083 0.739583
+vt 0.052083 0.750000
+vt 0.104167 0.729167
+vt 0.093750 0.729167
+vt 0.093750 0.718750
+vt 0.104167 0.718750
+vt 0.114583 0.718750
+vt 0.114583 0.729167
+vt 0.125000 0.718750
+vt 0.125000 0.729167
+vt 0.104167 0.739583
+vt 0.114583 0.750000
+vt 0.104167 0.750000
+vt 0.125000 0.739583
+vt 0.125000 0.750000
+vt 0.093750 0.739583
+vt 0.093750 0.750000
+vt 0.145833 0.729167
+vt 0.135417 0.729167
+vt 0.135417 0.718750
+vt 0.145833 0.718750
+vt 0.156250 0.718750
+vt 0.156250 0.729167
+vt 0.166667 0.718750
+vt 0.166667 0.729167
+vt 0.156250 0.739583
+vt 0.145833 0.739583
+vt 0.156250 0.750000
+vt 0.145833 0.750000
+vt 0.166667 0.739583
+vt 0.166667 0.750000
+vt 0.135417 0.739583
+vt 0.135417 0.750000
+vt 0.187500 0.729167
+vt 0.177083 0.729167
+vt 0.177083 0.718750
+vt 0.187500 0.718750
+vt 0.197917 0.718750
+vt 0.197917 0.729167
+vt 0.208333 0.718750
+vt 0.208333 0.729167
+vt 0.197917 0.739583
+vt 0.187500 0.739583
+vt 0.197917 0.750000
+vt 0.187500 0.750000
+vt 0.208333 0.739583
+vt 0.208333 0.750000
+vt 0.177083 0.739583
+vt 0.177083 0.750000
+vt 0.229167 0.729167
+vt 0.218750 0.729167
+vt 0.218750 0.718750
+vt 0.229167 0.718750
+vt 0.239583 0.718750
+vt 0.239583 0.729167
+vt 0.250000 0.718750
+vt 0.250000 0.729167
+vt 0.239583 0.739583
+vt 0.229167 0.739583
+vt 0.239583 0.750000
+vt 0.229167 0.750000
+vt 0.250000 0.739583
+vt 0.250000 0.750000
+vt 0.218750 0.739583
+vt 0.218750 0.750000
+vt 0.270833 0.729167
+vt 0.260417 0.729167
+vt 0.260417 0.718750
+vt 0.270833 0.718750
+vt 0.281250 0.718750
+vt 0.281250 0.729167
+vt 0.291667 0.718750
+vt 0.291667 0.729167
+vt 0.281250 0.739583
+vt 0.270833 0.739583
+vt 0.281250 0.750000
+vt 0.270833 0.750000
+vt 0.291667 0.739583
+vt 0.291667 0.750000
+vt 0.260417 0.739583
+vt 0.260417 0.750000
+vt 0.312500 0.729167
+vt 0.302083 0.729167
+vt 0.302083 0.718750
+vt 0.312500 0.718750
+vt 0.322917 0.718750
+vt 0.322917 0.729167
+vt 0.333333 0.718750
+vt 0.333333 0.729167
+vt 0.322917 0.739583
+vt 0.312500 0.739583
+vt 0.322917 0.750000
+vt 0.312500 0.750000
+vt 0.333333 0.739583
+vt 0.333333 0.750000
+vt 0.302083 0.739583
+vt 0.302083 0.750000
+vt 0.354167 0.729167
+vt 0.343750 0.729167
+vt 0.343750 0.718750
+vt 0.354167 0.718750
+vt 0.364583 0.718750
+vt 0.364583 0.729167
+vt 0.375000 0.718750
+vt 0.375000 0.729167
+vt 0.364583 0.739583
+vt 0.354167 0.739583
+vt 0.364583 0.750000
+vt 0.354167 0.750000
+vt 0.375000 0.739583
+vt 0.375000 0.750000
+vt 0.343750 0.739583
+vt 0.343750 0.750000
+vt 0.395833 0.729167
+vt 0.385417 0.729167
+vt 0.385417 0.718750
+vt 0.395833 0.718750
+vt 0.406250 0.718750
+vt 0.406250 0.729167
+vt 0.416667 0.718750
+vt 0.416667 0.729167
+vt 0.406250 0.739583
+vt 0.395833 0.739583
+vt 0.406250 0.750000
+vt 0.395833 0.750000
+vt 0.416667 0.739583
+vt 0.416667 0.750000
+vt 0.385417 0.739583
+vt 0.385417 0.750000
+vt 0.437500 0.729167
+vt 0.427083 0.729167
+vt 0.427083 0.718750
+vt 0.437500 0.718750
+vt 0.447917 0.718750
+vt 0.447917 0.729167
+vt 0.458333 0.718750
+vt 0.458333 0.729167
+vt 0.447917 0.739583
+vt 0.437500 0.739583
+vt 0.447917 0.750000
+vt 0.437500 0.750000
+vt 0.458333 0.739583
+vt 0.458333 0.750000
+vt 0.427083 0.739583
+vt 0.427083 0.750000
+vt 0.479167 0.729167
+vt 0.468750 0.729167
+vt 0.468750 0.718750
+vt 0.479167 0.718750
+vt 0.489583 0.718750
+vt 0.489583 0.729167
+vt 0.500000 0.718750
+vt 0.500000 0.729167
+vt 0.489583 0.739583
+vt 0.479167 0.739583
+vt 0.489583 0.750000
+vt 0.479167 0.750000
+vt 0.500000 0.739583
+vt 0.500000 0.750000
+vt 0.468750 0.739583
+vt 0.468750 0.750000
+vt 0.520833 0.729167
+vt 0.510417 0.729167
+vt 0.510417 0.718750
+vt 0.520833 0.718750
+vt 0.531250 0.718750
+vt 0.531250 0.729167
+vt 0.541667 0.718750
+vt 0.541667 0.729167
+vt 0.531250 0.739583
+vt 0.520833 0.739583
+vt 0.531250 0.750000
+vt 0.520833 0.750000
+vt 0.541667 0.739583
+vt 0.541667 0.750000
+vt 0.510417 0.739583
+vt 0.510417 0.750000
+vt 0.562500 0.729167
+vt 0.552083 0.729167
+vt 0.552083 0.718750
+vt 0.562500 0.718750
+vt 0.572917 0.718750
+vt 0.572917 0.729167
+vt 0.583333 0.718750
+vt 0.583333 0.729167
+vt 0.572917 0.739583
+vt 0.562500 0.739583
+vt 0.572917 0.750000
+vt 0.562500 0.750000
+vt 0.583333 0.739583
+vt 0.583333 0.750000
+vt 0.552083 0.739583
+vt 0.552083 0.750000
+vt 0.604167 0.729167
+vt 0.593750 0.729167
+vt 0.593750 0.718750
+vt 0.604167 0.718750
+vt 0.614583 0.718750
+vt 0.614583 0.729167
+vt 0.625000 0.718750
+vt 0.625000 0.729167
+vt 0.614583 0.739583
+vt 0.604167 0.739583
+vt 0.614583 0.750000
+vt 0.604167 0.750000
+vt 0.625000 0.739583
+vt 0.625000 0.750000
+vt 0.593750 0.739583
+vt 0.593750 0.750000
+vt 0.645833 0.729167
+vt 0.635417 0.729167
+vt 0.635417 0.718750
+vt 0.645833 0.718750
+vt 0.656250 0.718750
+vt 0.656250 0.729167
+vt 0.666667 0.718750
+vt 0.666667 0.729167
+vt 0.656250 0.739583
+vt 0.645833 0.739583
+vt 0.656250 0.750000
+vt 0.645833 0.750000
+vt 0.666667 0.739583
+vt 0.666667 0.750000
+vt 0.635417 0.739583
+vt 0.635417 0.750000
+vt 0.687500 0.729167
+vt 0.677083 0.729167
+vt 0.677083 0.718750
+vt 0.687500 0.718750
+vt 0.697917 0.718750
+vt 0.697917 0.729167
+vt 0.708333 0.718750
+vt 0.708333 0.729167
+vt 0.697917 0.739583
+vt 0.687500 0.739583
+vt 0.697917 0.750000
+vt 0.687500 0.750000
+vt 0.708333 0.739583
+vt 0.708333 0.750000
+vt 0.677083 0.739583
+vt 0.677083 0.750000
+vt 0.729167 0.729167
+vt 0.718750 0.729167
+vt 0.718750 0.718750
+vt 0.729167 0.718750
+vt 0.739583 0.718750
+vt 0.739583 0.729167
+vt 0.750000 0.718750
+vt 0.750000 0.729167
+vt 0.739583 0.739583
+vt 0.729167 0.739583
+vt 0.739583 0.750000
+vt 0.729167 0.750000
+vt 0.750000 0.739583
+vt 0.750000 0.750000
+vt 0.718750 0.739583
+vt 0.718750 0.750000
+vt 0.770833 0.729167
+vt 0.760417 0.729167
+vt 0.760417 0.718750
+vt 0.770833 0.718750
+vt 0.781250 0.718750
+vt 0.781250 0.729167
+vt 0.791667 0.718750
+vt 0.791667 0.729167
+vt 0.781250 0.739583
+vt 0.770833 0.739583
+vt 0.781250 0.750000
+vt 0.770833 0.750000
+vt 0.791667 0.739583
+vt 0.791667 0.750000
+vt 0.760417 0.739583
+vt 0.760417 0.750000
+vt 0.812500 0.729167
+vt 0.802083 0.729167
+vt 0.802083 0.718750
+vt 0.812500 0.718750
+vt 0.822917 0.718750
+vt 0.822917 0.729167
+vt 0.833333 0.718750
+vt 0.833333 0.729167
+vt 0.822917 0.739583
+vt 0.812500 0.739583
+vt 0.822917 0.750000
+vt 0.812500 0.750000
+vt 0.833333 0.739583
+vt 0.833333 0.750000
+vt 0.802083 0.739583
+vt 0.802083 0.750000
+vt 0.854167 0.729167
+vt 0.843750 0.729167
+vt 0.843750 0.718750
+vt 0.854167 0.718750
+vt 0.864583 0.718750
+vt 0.864583 0.729167
+vt 0.875000 0.718750
+vt 0.875000 0.729167
+vt 0.864583 0.739583
+vt 0.854167 0.739583
+vt 0.864583 0.750000
+vt 0.854167 0.750000
+vt 0.875000 0.739583
+vt 0.875000 0.750000
+vt 0.843750 0.739583
+vt 0.843750 0.750000
+vt 0.895833 0.729167
+vt 0.885417 0.729167
+vt 0.885417 0.718750
+vt 0.895833 0.718750
+vt 0.906250 0.718750
+vt 0.906250 0.729167
+vt 0.916667 0.718750
+vt 0.916667 0.729167
+vt 0.906250 0.739583
+vt 0.895833 0.739583
+vt 0.906250 0.750000
+vt 0.895833 0.750000
+vt 0.916667 0.739583
+vt 0.916667 0.750000
+vt 0.885417 0.739583
+vt 0.885417 0.750000
+vt 0.937500 0.729167
+vt 0.927083 0.729167
+vt 0.927083 0.718750
+vt 0.937500 0.718750
+vt 0.947917 0.718750
+vt 0.947917 0.729167
+vt 0.958333 0.718750
+vt 0.958333 0.729167
+vt 0.947917 0.739583
+vt 0.937500 0.739583
+vt 0.947917 0.750000
+vt 0.937500 0.750000
+vt 0.958333 0.739583
+vt 0.958333 0.750000
+vt 0.927083 0.739583
+vt 0.927083 0.750000
+vt 0.979167 0.729167
+vt 0.968750 0.729167
+vt 0.968750 0.718750
+vt 0.979167 0.718750
+vt 0.989583 0.718750
+vt 0.989583 0.729167
+vt 1.000000 0.718750
+vt 1.000000 0.729167
+vt 0.989583 0.739583
+vt 0.979167 0.739583
+vt 0.989583 0.750000
+vt 0.979167 0.750000
+vt 1.000000 0.739583
+vt 1.000000 0.750000
+vt 0.968750 0.739583
+vt 0.968750 0.750000
+vt 0.020833 0.770833
+vt 0.010417 0.770833
+vt 0.010417 0.760417
+vt 0.020833 0.760417
+vt 0.000000 0.770833
+vt 0.000000 0.760417
+vt 0.031250 0.760417
+vt 0.031250 0.770833
+vt 0.041667 0.760417
+vt 0.041667 0.770833
+vt 0.031250 0.781250
+vt 0.020833 0.781250
+vt 0.031250 0.791667
+vt 0.020833 0.791667
+vt 0.041667 0.781250
+vt 0.041667 0.791667
+vt 0.010417 0.781250
+vt 0.000000 0.781250
+vt 0.010417 0.791667
+vt 0.000000 0.791667
+vt 0.062500 0.770833
+vt 0.052083 0.770833
+vt 0.052083 0.760417
+vt 0.062500 0.760417
+vt 0.072917 0.760417
+vt 0.072917 0.770833
+vt 0.083333 0.760417
+vt 0.083333 0.770833
+vt 0.072917 0.781250
+vt 0.062500 0.781250
+vt 0.072917 0.791667
+vt 0.062500 0.791667
+vt 0.083333 0.781250
+vt 0.083333 0.791667
+vt 0.052083 0.781250
+vt 0.052083 0.791667
+vt 0.104167 0.770833
+vt 0.093750 0.770833
+vt 0.093750 0.760417
+vt 0.104167 0.760417
+vt 0.114583 0.760417
+vt 0.114583 0.770833
+vt 0.125000 0.760417
+vt 0.125000 0.770833
+vt 0.114583 0.781250
+vt 0.104167 0.781250
+vt 0.114583 0.791667
+vt 0.104167 0.791667
+vt 0.125000 0.781250
+vt 0.125000 0.791667
+vt 0.093750 0.781250
+vt 0.093750 0.791667
+vt 0.145833 0.770833
+vt 0.135417 0.770833
+vt 0.135417 0.760417
+vt 0.145833 0.760417
+vt 0.156250 0.760417
+vt 0.156250 0.770833
+vt 0.166667 0.760417
+vt 0.166667 0.770833
+vt 0.156250 0.781250
+vt 0.145833 0.781250
+vt 0.156250 0.791667
+vt 0.145833 0.791667
+vt 0.166667 0.781250
+vt 0.166667 0.791667
+vt 0.135417 0.781250
+vt 0.135417 0.791667
+vt 0.187500 0.770833
+vt 0.177083 0.770833
+vt 0.177083 0.760417
+vt 0.187500 0.760417
+vt 0.197917 0.760417
+vt 0.197917 0.770833
+vt 0.208333 0.760417
+vt 0.208333 0.770833
+vt 0.197917 0.781250
+vt 0.187500 0.781250
+vt 0.197917 0.791667
+vt 0.187500 0.791667
+vt 0.208333 0.781250
+vt 0.208333 0.791667
+vt 0.177083 0.781250
+vt 0.177083 0.791667
+vt 0.229167 0.770833
+vt 0.218750 0.770833
+vt 0.218750 0.760417
+vt 0.229167 0.760417
+vt 0.239583 0.760417
+vt 0.239583 0.770833
+vt 0.250000 0.760417
+vt 0.250000 0.770833
+vt 0.239583 0.781250
+vt 0.229167 0.781250
+vt 0.239583 0.791667
+vt 0.229167 0.791667
+vt 0.250000 0.781250
+vt 0.250000 0.791667
+vt 0.218750 0.781250
+vt 0.218750 0.791667
+vt 0.270833 0.770833
+vt 0.260417 0.770833
+vt 0.260417 0.760417
+vt 0.270833 0.760417
+vt 0.281250 0.760417
+vt 0.281250 0.770833
+vt 0.291667 0.760417
+vt 0.291667 0.770833
+vt 0.281250 0.781250
+vt 0.270833 0.781250
+vt 0.281250 0.791667
+vt 0.270833 0.791667
+vt 0.291667 0.781250
+vt 0.291667 0.791667
+vt 0.260417 0.781250
+vt 0.260417 0.791667
+vt 0.312500 0.770833
+vt 0.302083 0.770833
+vt 0.302083 0.760417
+vt 0.312500 0.760417
+vt 0.322917 0.760417
+vt 0.322917 0.770833
+vt 0.333333 0.760417
+vt 0.333333 0.770833
+vt 0.322917 0.781250
+vt 0.312500 0.781250
+vt 0.322917 0.791667
+vt 0.312500 0.791667
+vt 0.333333 0.781250
+vt 0.333333 0.791667
+vt 0.302083 0.781250
+vt 0.302083 0.791667
+vt 0.354167 0.770833
+vt 0.343750 0.770833
+vt 0.343750 0.760417
+vt 0.354167 0.760417
+vt 0.364583 0.760417
+vt 0.364583 0.770833
+vt 0.375000 0.760417
+vt 0.375000 0.770833
+vt 0.364583 0.781250
+vt 0.354167 0.781250
+vt 0.364583 0.791667
+vt 0.354167 0.791667
+vt 0.375000 0.781250
+vt 0.375000 0.791667
+vt 0.343750 0.781250
+vt 0.343750 0.791667
+vt 0.395833 0.770833
+vt 0.385417 0.770833
+vt 0.385417 0.760417
+vt 0.395833 0.760417
+vt 0.406250 0.760417
+vt 0.406250 0.770833
+vt 0.416667 0.760417
+vt 0.416667 0.770833
+vt 0.406250 0.781250
+vt 0.395833 0.781250
+vt 0.406250 0.791667
+vt 0.395833 0.791667
+vt 0.416667 0.781250
+vt 0.416667 0.791667
+vt 0.385417 0.781250
+vt 0.385417 0.791667
+vt 0.437500 0.770833
+vt 0.427083 0.770833
+vt 0.427083 0.760417
+vt 0.437500 0.760417
+vt 0.447917 0.760417
+vt 0.447917 0.770833
+vt 0.458333 0.760417
+vt 0.458333 0.770833
+vt 0.447917 0.781250
+vt 0.437500 0.781250
+vt 0.447917 0.791667
+vt 0.437500 0.791667
+vt 0.458333 0.781250
+vt 0.458333 0.791667
+vt 0.427083 0.781250
+vt 0.427083 0.791667
+vt 0.479167 0.770833
+vt 0.468750 0.770833
+vt 0.468750 0.760417
+vt 0.479167 0.760417
+vt 0.489583 0.760417
+vt 0.489583 0.770833
+vt 0.500000 0.760417
+vt 0.500000 0.770833
+vt 0.489583 0.781250
+vt 0.479167 0.781250
+vt 0.489583 0.791667
+vt 0.479167 0.791667
+vt 0.500000 0.781250
+vt 0.500000 0.791667
+vt 0.468750 0.781250
+vt 0.468750 0.791667
+vt 0.520833 0.770833
+vt 0.510417 0.770833
+vt 0.510417 0.760417
+vt 0.520833 0.760417
+vt 0.531250 0.760417
+vt 0.531250 0.770833
+vt 0.541667 0.760417
+vt 0.541667 0.770833
+vt 0.531250 0.781250
+vt 0.520833 0.781250
+vt 0.531250 0.791667
+vt 0.520833 0.791667
+vt 0.541667 0.781250
+vt 0.541667 0.791667
+vt 0.510417 0.781250
+vt 0.510417 0.791667
+vt 0.562500 0.770833
+vt 0.552083 0.770833
+vt 0.552083 0.760417
+vt 0.562500 0.760417
+vt 0.572917 0.760417
+vt 0.572917 0.770833
+vt 0.583333 0.760417
+vt 0.583333 0.770833
+vt 0.572917 0.781250
+vt 0.562500 0.781250
+vt 0.572917 0.791667
+vt 0.562500 0.791667
+vt 0.583333 0.781250
+vt 0.583333 0.791667
+vt 0.552083 0.781250
+vt 0.552083 0.791667
+vt 0.604167 0.770833
+vt 0.593750 0.770833
+vt 0.593750 0.760417
+vt 0.604167 0.760417
+vt 0.614583 0.760417
+vt 0.614583 0.770833
+vt 0.625000 0.760417
+vt 0.625000 0.770833
+vt 0.614583 0.781250
+vt 0.604167 0.781250
+vt 0.614583 0.791667
+vt 0.604167 0.791667
+vt 0.625000 0.781250
+vt 0.625000 0.791667
+vt 0.593750 0.781250
+vt 0.593750 0.791667
+vt 0.645833 0.770833
+vt 0.635417 0.770833
+vt 0.635417 0.760417
+vt 0.645833 0.760417
+vt 0.656250 0.760417
+vt 0.656250 0.770833
+vt 0.666667 0.760417
+vt 0.666667 0.770833
+vt 0.656250 0.781250
+vt 0.645833 0.781250
+vt 0.656250 0.791667
+vt 0.645833 0.791667
+vt 0.666667 0.781250
+vt 0.666667 0.791667
+vt 0.635417 0.781250
+vt 0.635417 0.791667
+vt 0.687500 0.770833
+vt 0.677083 0.770833
+vt 0.677083 0.760417
+vt 0.687500 0.760417
+vt 0.697917 0.760417
+vt 0.697917 0.770833
+vt 0.708333 0.760417
+vt 0.708333 0.770833
+vt 0.697917 0.781250
+vt 0.687500 0.781250
+vt 0.697917 0.791667
+vt 0.687500 0.791667
+vt 0.708333 0.781250
+vt 0.708333 0.791667
+vt 0.677083 0.781250
+vt 0.677083 0.791667
+vt 0.729167 0.770833
+vt 0.718750 0.770833
+vt 0.718750 0.760417
+vt 0.729167 0.760417
+vt 0.739583 0.760417
+vt 0.739583 0.770833
+vt 0.750000 0.760417
+vt 0.750000 0.770833
+vt 0.739583 0.781250
+vt 0.729167 0.781250
+vt 0.739583 0.791667
+vt 0.729167 0.791667
+vt 0.750000 0.781250
+vt 0.750000 0.791667
+vt 0.718750 0.781250
+vt 0.718750 0.791667
+vt 0.770833 0.770833
+vt 0.760417 0.770833
+vt 0.760417 0.760417
+vt 0.770833 0.760417
+vt 0.781250 0.760417
+vt 0.781250 0.770833
+vt 0.791667 0.760417
+vt 0.791667 0.770833
+vt 0.781250 0.781250
+vt 0.770833 0.781250
+vt 0.781250 0.791667
+vt 0.770833 0.791667
+vt 0.791667 0.781250
+vt 0.791667 0.791667
+vt 0.760417 0.781250
+vt 0.760417 0.791667
+vt 0.812500 0.770833
+vt 0.802083 0.770833
+vt 0.802083 0.760417
+vt 0.812500 0.760417
+vt 0.822917 0.760417
+vt 0.822917 0.770833
+vt 0.833333 0.760417
+vt 0.833333 0.770833
+vt 0.822917 0.781250
+vt 0.812500 0.781250
+vt 0.822917 0.791667
+vt 0.812500 0.791667
+vt 0.833333 0.781250
+vt 0.833333 0.791667
+vt 0.802083 0.781250
+vt 0.802083 0.791667
+vt 0.854167 0.770833
+vt 0.843750 0.770833
+vt 0.843750 0.760417
+vt 0.854167 0.760417
+vt 0.864583 0.760417
+vt 0.864583 0.770833
+vt 0.875000 0.760417
+vt 0.875000 0.770833
+vt 0.864583 0.781250
+vt 0.854167 0.781250
+vt 0.864583 0.791667
+vt 0.854167 0.791667
+vt 0.875000 0.781250
+vt 0.875000 0.791667
+vt 0.843750 0.781250
+vt 0.843750 0.791667
+vt 0.895833 0.770833
+vt 0.885417 0.770833
+vt 0.885417 0.760417
+vt 0.895833 0.760417
+vt 0.906250 0.760417
+vt 0.906250 0.770833
+vt 0.916667 0.760417
+vt 0.916667 0.770833
+vt 0.906250 0.781250
+vt 0.895833 0.781250
+vt 0.906250 0.791667
+vt 0.895833 0.791667
+vt 0.916667 0.781250
+vt 0.916667 0.791667
+vt 0.885417 0.781250
+vt 0.885417 0.791667
+vt 0.937500 0.770833
+vt 0.927083 0.770833
+vt 0.927083 0.760417
+vt 0.937500 0.760417
+vt 0.947917 0.760417
+vt 0.947917 0.770833
+vt 0.958333 0.760417
+vt 0.958333 0.770833
+vt 0.947917 0.781250
+vt 0.937500 0.781250
+vt 0.947917 0.791667
+vt 0.937500 0.791667
+vt 0.958333 0.781250
+vt 0.958333 0.791667
+vt 0.927083 0.781250
+vt 0.927083 0.791667
+vt 0.979167 0.770833
+vt 0.968750 0.770833
+vt 0.968750 0.760417
+vt 0.979167 0.760417
+vt 0.989583 0.760417
+vt 0.989583 0.770833
+vt 1.000000 0.760417
+vt 1.000000 0.770833
+vt 0.989583 0.781250
+vt 0.979167 0.781250
+vt 0.989583 0.791667
+vt 0.979167 0.791667
+vt 1.000000 0.781250
+vt 1.000000 0.791667
+vt 0.968750 0.781250
+vt 0.968750 0.791667
+vt 0.020833 0.812500
+vt 0.010417 0.812500
+vt 0.010417 0.802083
+vt 0.020833 0.802083
+vt 0.000000 0.812500
+vt 0.000000 0.802083
+vt 0.031250 0.802083
+vt 0.031250 0.812500
+vt 0.041667 0.802083
+vt 0.041667 0.812500
+vt 0.031250 0.822917
+vt 0.020833 0.822917
+vt 0.031250 0.833333
+vt 0.020833 0.833333
+vt 0.041667 0.822917
+vt 0.041667 0.833333
+vt 0.010417 0.822917
+vt 0.000000 0.822917
+vt 0.010417 0.833333
+vt 0.000000 0.833333
+vt 0.062500 0.812500
+vt 0.052083 0.812500
+vt 0.052083 0.802083
+vt 0.062500 0.802083
+vt 0.072917 0.802083
+vt 0.072917 0.812500
+vt 0.083333 0.802083
+vt 0.083333 0.812500
+vt 0.072917 0.822917
+vt 0.062500 0.822917
+vt 0.072917 0.833333
+vt 0.062500 0.833333
+vt 0.083333 0.822917
+vt 0.083333 0.833333
+vt 0.052083 0.822917
+vt 0.052083 0.833333
+vt 0.104167 0.812500
+vt 0.093750 0.812500
+vt 0.093750 0.802083
+vt 0.104167 0.802083
+vt 0.114583 0.802083
+vt 0.114583 0.812500
+vt 0.125000 0.802083
+vt 0.125000 0.812500
+vt 0.114583 0.822917
+vt 0.104167 0.822917
+vt 0.114583 0.833333
+vt 0.104167 0.833333
+vt 0.125000 0.822917
+vt 0.125000 0.833333
+vt 0.093750 0.822917
+vt 0.093750 0.833333
+vt 0.145833 0.812500
+vt 0.135417 0.812500
+vt 0.135417 0.802083
+vt 0.145833 0.802083
+vt 0.156250 0.802083
+vt 0.156250 0.812500
+vt 0.166667 0.802083
+vt 0.166667 0.812500
+vt 0.156250 0.822917
+vt 0.145833 0.822917
+vt 0.156250 0.833333
+vt 0.145833 0.833333
+vt 0.166667 0.822917
+vt 0.166667 0.833333
+vt 0.135417 0.822917
+vt 0.135417 0.833333
+vt 0.187500 0.812500
+vt 0.177083 0.812500
+vt 0.177083 0.802083
+vt 0.187500 0.802083
+vt 0.197917 0.802083
+vt 0.197917 0.812500
+vt 0.208333 0.802083
+vt 0.208333 0.812500
+vt 0.197917 0.822917
+vt 0.187500 0.822917
+vt 0.197917 0.833333
+vt 0.187500 0.833333
+vt 0.208333 0.822917
+vt 0.208333 0.833333
+vt 0.177083 0.822917
+vt 0.177083 0.833333
+vt 0.229167 0.812500
+vt 0.218750 0.812500
+vt 0.218750 0.802083
+vt 0.229167 0.802083
+vt 0.239583 0.802083
+vt 0.239583 0.812500
+vt 0.250000 0.802083
+vt 0.250000 0.812500
+vt 0.239583 0.822917
+vt 0.229167 0.822917
+vt 0.239583 0.833333
+vt 0.229167 0.833333
+vt 0.250000 0.822917
+vt 0.250000 0.833333
+vt 0.218750 0.822917
+vt 0.218750 0.833333
+vt 0.270833 0.812500
+vt 0.260417 0.812500
+vt 0.260417 0.802083
+vt 0.270833 0.802083
+vt 0.281250 0.802083
+vt 0.281250 0.812500
+vt 0.291667 0.802083
+vt 0.291667 0.812500
+vt 0.281250 0.822917
+vt 0.270833 0.822917
+vt 0.281250 0.833333
+vt 0.270833 0.833333
+vt 0.291667 0.822917
+vt 0.291667 0.833333
+vt 0.260417 0.822917
+vt 0.260417 0.833333
+vt 0.312500 0.812500
+vt 0.302083 0.812500
+vt 0.302083 0.802083
+vt 0.312500 0.802083
+vt 0.322917 0.802083
+vt 0.322917 0.812500
+vt 0.333333 0.802083
+vt 0.333333 0.812500
+vt 0.322917 0.822917
+vt 0.312500 0.822917
+vt 0.322917 0.833333
+vt 0.312500 0.833333
+vt 0.333333 0.822917
+vt 0.333333 0.833333
+vt 0.302083 0.822917
+vt 0.302083 0.833333
+vt 0.354167 0.812500
+vt 0.343750 0.812500
+vt 0.343750 0.802083
+vt 0.354167 0.802083
+vt 0.364583 0.802083
+vt 0.364583 0.812500
+vt 0.375000 0.802083
+vt 0.375000 0.812500
+vt 0.364583 0.822917
+vt 0.354167 0.822917
+vt 0.364583 0.833333
+vt 0.354167 0.833333
+vt 0.375000 0.822917
+vt 0.375000 0.833333
+vt 0.343750 0.822917
+vt 0.343750 0.833333
+vt 0.395833 0.812500
+vt 0.385417 0.812500
+vt 0.385417 0.802083
+vt 0.395833 0.802083
+vt 0.406250 0.802083
+vt 0.406250 0.812500
+vt 0.416667 0.802083
+vt 0.416667 0.812500
+vt 0.406250 0.822917
+vt 0.395833 0.822917
+vt 0.406250 0.833333
+vt 0.395833 0.833333
+vt 0.416667 0.822917
+vt 0.416667 0.833333
+vt 0.385417 0.822917
+vt 0.385417 0.833333
+vt 0.437500 0.812500
+vt 0.427083 0.812500
+vt 0.427083 0.802083
+vt 0.437500 0.802083
+vt 0.447917 0.802083
+vt 0.447917 0.812500
+vt 0.458333 0.802083
+vt 0.458333 0.812500
+vt 0.447917 0.822917
+vt 0.437500 0.822917
+vt 0.447917 0.833333
+vt 0.437500 0.833333
+vt 0.458333 0.822917
+vt 0.458333 0.833333
+vt 0.427083 0.822917
+vt 0.427083 0.833333
+vt 0.479167 0.812500
+vt 0.468750 0.812500
+vt 0.468750 0.802083
+vt 0.479167 0.802083
+vt 0.489583 0.802083
+vt 0.489583 0.812500
+vt 0.500000 0.802083
+vt 0.500000 0.812500
+vt 0.489583 0.822917
+vt 0.479167 0.822917
+vt 0.489583 0.833333
+vt 0.479167 0.833333
+vt 0.500000 0.822917
+vt 0.500000 0.833333
+vt 0.468750 0.822917
+vt 0.468750 0.833333
+vt 0.520833 0.812500
+vt 0.510417 0.812500
+vt 0.510417 0.802083
+vt 0.520833 0.802083
+vt 0.531250 0.802083
+vt 0.531250 0.812500
+vt 0.541667 0.802083
+vt 0.541667 0.812500
+vt 0.531250 0.822917
+vt 0.520833 0.822917
+vt 0.531250 0.833333
+vt 0.520833 0.833333
+vt 0.541667 0.822917
+vt 0.541667 0.833333
+vt 0.510417 0.822917
+vt 0.510417 0.833333
+vt 0.562500 0.812500
+vt 0.552083 0.812500
+vt 0.552083 0.802083
+vt 0.562500 0.802083
+vt 0.572917 0.802083
+vt 0.572917 0.812500
+vt 0.583333 0.802083
+vt 0.583333 0.812500
+vt 0.572917 0.822917
+vt 0.562500 0.822917
+vt 0.572917 0.833333
+vt 0.562500 0.833333
+vt 0.583333 0.822917
+vt 0.583333 0.833333
+vt 0.552083 0.822917
+vt 0.552083 0.833333
+vt 0.604167 0.812500
+vt 0.593750 0.812500
+vt 0.593750 0.802083
+vt 0.604167 0.802083
+vt 0.614583 0.802083
+vt 0.614583 0.812500
+vt 0.625000 0.802083
+vt 0.625000 0.812500
+vt 0.614583 0.822917
+vt 0.604167 0.822917
+vt 0.614583 0.833333
+vt 0.604167 0.833333
+vt 0.625000 0.822917
+vt 0.625000 0.833333
+vt 0.593750 0.822917
+vt 0.593750 0.833333
+vt 0.645833 0.812500
+vt 0.635417 0.812500
+vt 0.635417 0.802083
+vt 0.645833 0.802083
+vt 0.656250 0.802083
+vt 0.656250 0.812500
+vt 0.666667 0.802083
+vt 0.666667 0.812500
+vt 0.656250 0.822917
+vt 0.645833 0.822917
+vt 0.656250 0.833333
+vt 0.645833 0.833333
+vt 0.666667 0.822917
+vt 0.666667 0.833333
+vt 0.635417 0.822917
+vt 0.635417 0.833333
+vt 0.687500 0.812500
+vt 0.677083 0.812500
+vt 0.677083 0.802083
+vt 0.687500 0.802083
+vt 0.697917 0.802083
+vt 0.697917 0.812500
+vt 0.708333 0.802083
+vt 0.708333 0.812500
+vt 0.697917 0.822917
+vt 0.687500 0.822917
+vt 0.697917 0.833333
+vt 0.687500 0.833333
+vt 0.708333 0.822917
+vt 0.708333 0.833333
+vt 0.677083 0.822917
+vt 0.677083 0.833333
+vt 0.729167 0.812500
+vt 0.718750 0.812500
+vt 0.718750 0.802083
+vt 0.729167 0.802083
+vt 0.739583 0.802083
+vt 0.739583 0.812500
+vt 0.750000 0.802083
+vt 0.750000 0.812500
+vt 0.739583 0.822917
+vt 0.729167 0.822917
+vt 0.739583 0.833333
+vt 0.729167 0.833333
+vt 0.750000 0.822917
+vt 0.750000 0.833333
+vt 0.718750 0.822917
+vt 0.718750 0.833333
+vt 0.770833 0.812500
+vt 0.760417 0.812500
+vt 0.760417 0.802083
+vt 0.770833 0.802083
+vt 0.781250 0.802083
+vt 0.781250 0.812500
+vt 0.791667 0.802083
+vt 0.791667 0.812500
+vt 0.781250 0.822917
+vt 0.770833 0.822917
+vt 0.781250 0.833333
+vt 0.770833 0.833333
+vt 0.791667 0.822917
+vt 0.791667 0.833333
+vt 0.760417 0.822917
+vt 0.760417 0.833333
+vt 0.812500 0.812500
+vt 0.802083 0.812500
+vt 0.802083 0.802083
+vt 0.812500 0.802083
+vt 0.822917 0.802083
+vt 0.822917 0.812500
+vt 0.833333 0.802083
+vt 0.833333 0.812500
+vt 0.822917 0.822917
+vt 0.812500 0.822917
+vt 0.822917 0.833333
+vt 0.812500 0.833333
+vt 0.833333 0.822917
+vt 0.833333 0.833333
+vt 0.802083 0.822917
+vt 0.802083 0.833333
+vt 0.854167 0.812500
+vt 0.843750 0.812500
+vt 0.843750 0.802083
+vt 0.854167 0.802083
+vt 0.864583 0.802083
+vt 0.864583 0.812500
+vt 0.875000 0.802083
+vt 0.875000 0.812500
+vt 0.864583 0.822917
+vt 0.854167 0.822917
+vt 0.864583 0.833333
+vt 0.854167 0.833333
+vt 0.875000 0.822917
+vt 0.875000 0.833333
+vt 0.843750 0.822917
+vt 0.843750 0.833333
+vt 0.895833 0.812500
+vt 0.885417 0.812500
+vt 0.885417 0.802083
+vt 0.895833 0.802083
+vt 0.906250 0.802083
+vt 0.906250 0.812500
+vt 0.916667 0.802083
+vt 0.916667 0.812500
+vt 0.906250 0.822917
+vt 0.895833 0.822917
+vt 0.906250 0.833333
+vt 0.895833 0.833333
+vt 0.916667 0.822917
+vt 0.916667 0.833333
+vt 0.885417 0.822917
+vt 0.885417 0.833333
+vt 0.937500 0.812500
+vt 0.927083 0.812500
+vt 0.927083 0.802083
+vt 0.937500 0.802083
+vt 0.947917 0.802083
+vt 0.947917 0.812500
+vt 0.958333 0.802083
+vt 0.958333 0.812500
+vt 0.947917 0.822917
+vt 0.937500 0.822917
+vt 0.947917 0.833333
+vt 0.937500 0.833333
+vt 0.958333 0.822917
+vt 0.958333 0.833333
+vt 0.927083 0.822917
+vt 0.927083 0.833333
+vt 0.979167 0.812500
+vt 0.968750 0.812500
+vt 0.968750 0.802083
+vt 0.979167 0.802083
+vt 0.989583 0.802083
+vt 0.989583 0.812500
+vt 1.000000 0.802083
+vt 1.000000 0.812500
+vt 0.989583 0.822917
+vt 0.979167 0.822917
+vt 0.989583 0.833333
+vt 0.979167 0.833333
+vt 1.000000 0.822917
+vt 1.000000 0.833333
+vt 0.968750 0.822917
+vt 0.968750 0.833333
+vt 0.020833 0.854167
+vt 0.010417 0.854167
+vt 0.010417 0.843750
+vt 0.020833 0.843750
+vt 0.000000 0.854167
+vt 0.000000 0.843750
+vt 0.031250 0.843750
+vt 0.031250 0.854167
+vt 0.041667 0.843750
+vt 0.041667 0.854167
+vt 0.031250 0.864583
+vt 0.020833 0.864583
+vt 0.031250 0.875000
+vt 0.020833 0.875000
+vt 0.041667 0.864583
+vt 0.041667 0.875000
+vt 0.010417 0.864583
+vt 0.000000 0.864583
+vt 0.010417 0.875000
+vt 0.000000 0.875000
+vt 0.062500 0.854167
+vt 0.052083 0.854167
+vt 0.052083 0.843750
+vt 0.062500 0.843750
+vt 0.072917 0.843750
+vt 0.072917 0.854167
+vt 0.083333 0.843750
+vt 0.083333 0.854167
+vt 0.072917 0.864583
+vt 0.062500 0.864583
+vt 0.072917 0.875000
+vt 0.062500 0.875000
+vt 0.083333 0.864583
+vt 0.083333 0.875000
+vt 0.052083 0.864583
+vt 0.052083 0.875000
+vt 0.104167 0.854167
+vt 0.093750 0.854167
+vt 0.093750 0.843750
+vt 0.104167 0.843750
+vt 0.114583 0.843750
+vt 0.114583 0.854167
+vt 0.125000 0.843750
+vt 0.125000 0.854167
+vt 0.114583 0.864583
+vt 0.104167 0.864583
+vt 0.114583 0.875000
+vt 0.104167 0.875000
+vt 0.125000 0.864583
+vt 0.125000 0.875000
+vt 0.093750 0.864583
+vt 0.093750 0.875000
+vt 0.145833 0.854167
+vt 0.135417 0.854167
+vt 0.135417 0.843750
+vt 0.145833 0.843750
+vt 0.156250 0.843750
+vt 0.156250 0.854167
+vt 0.166667 0.843750
+vt 0.166667 0.854167
+vt 0.156250 0.864583
+vt 0.145833 0.864583
+vt 0.156250 0.875000
+vt 0.145833 0.875000
+vt 0.166667 0.864583
+vt 0.166667 0.875000
+vt 0.135417 0.864583
+vt 0.135417 0.875000
+vt 0.187500 0.854167
+vt 0.177083 0.854167
+vt 0.177083 0.843750
+vt 0.187500 0.843750
+vt 0.197917 0.843750
+vt 0.197917 0.854167
+vt 0.208333 0.843750
+vt 0.208333 0.854167
+vt 0.197917 0.864583
+vt 0.187500 0.864583
+vt 0.197917 0.875000
+vt 0.187500 0.875000
+vt 0.208333 0.864583
+vt 0.208333 0.875000
+vt 0.177083 0.864583
+vt 0.177083 0.875000
+vt 0.229167 0.854167
+vt 0.218750 0.854167
+vt 0.218750 0.843750
+vt 0.229167 0.843750
+vt 0.239583 0.843750
+vt 0.239583 0.854167
+vt 0.250000 0.843750
+vt 0.250000 0.854167
+vt 0.239583 0.864583
+vt 0.229167 0.864583
+vt 0.239583 0.875000
+vt 0.229167 0.875000
+vt 0.250000 0.864583
+vt 0.250000 0.875000
+vt 0.218750 0.864583
+vt 0.218750 0.875000
+vt 0.270833 0.854167
+vt 0.260417 0.854167
+vt 0.260417 0.843750
+vt 0.270833 0.843750
+vt 0.281250 0.843750
+vt 0.281250 0.854167
+vt 0.291667 0.843750
+vt 0.291667 0.854167
+vt 0.281250 0.864583
+vt 0.270833 0.864583
+vt 0.281250 0.875000
+vt 0.270833 0.875000
+vt 0.291667 0.864583
+vt 0.291667 0.875000
+vt 0.260417 0.864583
+vt 0.260417 0.875000
+vt 0.312500 0.854167
+vt 0.302083 0.854167
+vt 0.302083 0.843750
+vt 0.312500 0.843750
+vt 0.322917 0.843750
+vt 0.322917 0.854167
+vt 0.333333 0.843750
+vt 0.333333 0.854167
+vt 0.322917 0.864583
+vt 0.312500 0.864583
+vt 0.322917 0.875000
+vt 0.312500 0.875000
+vt 0.333333 0.864583
+vt 0.333333 0.875000
+vt 0.302083 0.864583
+vt 0.302083 0.875000
+vt 0.354167 0.854167
+vt 0.343750 0.854167
+vt 0.343750 0.843750
+vt 0.354167 0.843750
+vt 0.364583 0.843750
+vt 0.364583 0.854167
+vt 0.375000 0.843750
+vt 0.375000 0.854167
+vt 0.364583 0.864583
+vt 0.354167 0.864583
+vt 0.364583 0.875000
+vt 0.354167 0.875000
+vt 0.375000 0.864583
+vt 0.375000 0.875000
+vt 0.343750 0.864583
+vt 0.343750 0.875000
+vt 0.395833 0.854167
+vt 0.385417 0.854167
+vt 0.385417 0.843750
+vt 0.395833 0.843750
+vt 0.406250 0.843750
+vt 0.406250 0.854167
+vt 0.416667 0.843750
+vt 0.416667 0.854167
+vt 0.406250 0.864583
+vt 0.395833 0.864583
+vt 0.406250 0.875000
+vt 0.395833 0.875000
+vt 0.416667 0.864583
+vt 0.416667 0.875000
+vt 0.385417 0.864583
+vt 0.385417 0.875000
+vt 0.437500 0.854167
+vt 0.427083 0.854167
+vt 0.427083 0.843750
+vt 0.437500 0.843750
+vt 0.447917 0.843750
+vt 0.447917 0.854167
+vt 0.458333 0.843750
+vt 0.458333 0.854167
+vt 0.447917 0.864583
+vt 0.437500 0.864583
+vt 0.447917 0.875000
+vt 0.437500 0.875000
+vt 0.458333 0.864583
+vt 0.458333 0.875000
+vt 0.427083 0.864583
+vt 0.427083 0.875000
+vt 0.479167 0.854167
+vt 0.468750 0.854167
+vt 0.468750 0.843750
+vt 0.479167 0.843750
+vt 0.489583 0.843750
+vt 0.489583 0.854167
+vt 0.500000 0.843750
+vt 0.500000 0.854167
+vt 0.489583 0.864583
+vt 0.479167 0.864583
+vt 0.489583 0.875000
+vt 0.479167 0.875000
+vt 0.500000 0.864583
+vt 0.500000 0.875000
+vt 0.468750 0.864583
+vt 0.468750 0.875000
+vt 0.520833 0.854167
+vt 0.510417 0.854167
+vt 0.510417 0.843750
+vt 0.520833 0.843750
+vt 0.531250 0.843750
+vt 0.531250 0.854167
+vt 0.541667 0.843750
+vt 0.541667 0.854167
+vt 0.531250 0.864583
+vt 0.520833 0.864583
+vt 0.531250 0.875000
+vt 0.520833 0.875000
+vt 0.541667 0.864583
+vt 0.541667 0.875000
+vt 0.510417 0.864583
+vt 0.510417 0.875000
+vt 0.562500 0.854167
+vt 0.552083 0.854167
+vt 0.552083 0.843750
+vt 0.562500 0.843750
+vt 0.572917 0.843750
+vt 0.572917 0.854167
+vt 0.583333 0.843750
+vt 0.583333 0.854167
+vt 0.572917 0.864583
+vt 0.562500 0.864583
+vt 0.572917 0.875000
+vt 0.562500 0.875000
+vt 0.583333 0.864583
+vt 0.583333 0.875000
+vt 0.552083 0.864583
+vt 0.552083 0.875000
+vt 0.604167 0.854167
+vt 0.593750 0.854167
+vt 0.593750 0.843750
+vt 0.604167 0.843750
+vt 0.614583 0.843750
+vt 0.614583 0.854167
+vt 0.625000 0.843750
+vt 0.625000 0.854167
+vt 0.614583 0.864583
+vt 0.604167 0.864583
+vt 0.614583 0.875000
+vt 0.604167 0.875000
+vt 0.625000 0.864583
+vt 0.625000 0.875000
+vt 0.593750 0.864583
+vt 0.593750 0.875000
+vt 0.645833 0.854167
+vt 0.635417 0.854167
+vt 0.635417 0.843750
+vt 0.645833 0.843750
+vt 0.656250 0.843750
+vt 0.656250 0.854167
+vt 0.666667 0.843750
+vt 0.666667 0.854167
+vt 0.656250 0.864583
+vt 0.645833 0.864583
+vt 0.656250 0.875000
+vt 0.645833 0.875000
+vt 0.666667 0.864583
+vt 0.666667 0.875000
+vt 0.635417 0.864583
+vt 0.635417 0.875000
+vt 0.687500 0.854167
+vt 0.677083 0.854167
+vt 0.677083 0.843750
+vt 0.687500 0.843750
+vt 0.697917 0.843750
+vt 0.697917 0.854167
+vt 0.708333 0.843750
+vt 0.708333 0.854167
+vt 0.697917 0.864583
+vt 0.687500 0.864583
+vt 0.697917 0.875000
+vt 0.687500 0.875000
+vt 0.708333 0.864583
+vt 0.708333 0.875000
+vt 0.677083 0.864583
+vt 0.677083 0.875000
+vt 0.729167 0.854167
+vt 0.718750 0.854167
+vt 0.718750 0.843750
+vt 0.729167 0.843750
+vt 0.739583 0.843750
+vt 0.739583 0.854167
+vt 0.750000 0.843750
+vt 0.750000 0.854167
+vt 0.739583 0.864583
+vt 0.729167 0.864583
+vt 0.739583 0.875000
+vt 0.729167 0.875000
+vt 0.750000 0.864583
+vt 0.750000 0.875000
+vt 0.718750 0.864583
+vt 0.718750 0.875000
+vt 0.770833 0.854167
+vt 0.760417 0.854167
+vt 0.760417 0.843750
+vt 0.770833 0.843750
+vt 0.781250 0.843750
+vt 0.781250 0.854167
+vt 0.791667 0.843750
+vt 0.791667 0.854167
+vt 0.781250 0.864583
+vt 0.770833 0.864583
+vt 0.781250 0.875000
+vt 0.770833 0.875000
+vt 0.791667 0.864583
+vt 0.791667 0.875000
+vt 0.760417 0.864583
+vt 0.760417 0.875000
+vt 0.812500 0.854167
+vt 0.802083 0.854167
+vt 0.802083 0.843750
+vt 0.812500 0.843750
+vt 0.822917 0.843750
+vt 0.822917 0.854167
+vt 0.833333 0.843750
+vt 0.833333 0.854167
+vt 0.822917 0.864583
+vt 0.812500 0.864583
+vt 0.822917 0.875000
+vt 0.812500 0.875000
+vt 0.833333 0.864583
+vt 0.833333 0.875000
+vt 0.802083 0.864583
+vt 0.802083 0.875000
+vt 0.854167 0.854167
+vt 0.843750 0.854167
+vt 0.843750 0.843750
+vt 0.854167 0.843750
+vt 0.864583 0.843750
+vt 0.864583 0.854167
+vt 0.875000 0.843750
+vt 0.875000 0.854167
+vt 0.864583 0.864583
+vt 0.854167 0.864583
+vt 0.864583 0.875000
+vt 0.854167 0.875000
+vt 0.875000 0.864583
+vt 0.875000 0.875000
+vt 0.843750 0.864583
+vt 0.843750 0.875000
+vt 0.895833 0.854167
+vt 0.885417 0.854167
+vt 0.885417 0.843750
+vt 0.895833 0.843750
+vt 0.906250 0.843750
+vt 0.906250 0.854167
+vt 0.916667 0.843750
+vt 0.916667 0.854167
+vt 0.906250 0.864583
+vt 0.895833 0.864583
+vt 0.906250 0.875000
+vt 0.895833 0.875000
+vt 0.916667 0.864583
+vt 0.916667 0.875000
+vt 0.885417 0.864583
+vt 0.885417 0.875000
+vt 0.937500 0.854167
+vt 0.927083 0.854167
+vt 0.927083 0.843750
+vt 0.937500 0.843750
+vt 0.947917 0.843750
+vt 0.947917 0.854167
+vt 0.958333 0.843750
+vt 0.958333 0.854167
+vt 0.947917 0.864583
+vt 0.937500 0.864583
+vt 0.947917 0.875000
+vt 0.937500 0.875000
+vt 0.958333 0.864583
+vt 0.958333 0.875000
+vt 0.927083 0.864583
+vt 0.927083 0.875000
+vt 0.979167 0.854167
+vt 0.968750 0.854167
+vt 0.968750 0.843750
+vt 0.979167 0.843750
+vt 0.989583 0.843750
+vt 0.989583 0.854167
+vt 1.000000 0.843750
+vt 1.000000 0.854167
+vt 0.989583 0.864583
+vt 0.979167 0.864583
+vt 0.989583 0.875000
+vt 0.979167 0.875000
+vt 1.000000 0.864583
+vt 1.000000 0.875000
+vt 0.968750 0.864583
+vt 0.968750 0.875000
+vt 0.020833 0.895833
+vt 0.010417 0.895833
+vt 0.010417 0.885417
+vt 0.020833 0.885417
+vt 0.000000 0.895833
+vt 0.000000 0.885417
+vt 0.031250 0.885417
+vt 0.031250 0.895833
+vt 0.041667 0.885417
+vt 0.041667 0.895833
+vt 0.031250 0.906250
+vt 0.020833 0.906250
+vt 0.031250 0.916667
+vt 0.020833 0.916667
+vt 0.041667 0.906250
+vt 0.041667 0.916667
+vt 0.010417 0.906250
+vt 0.000000 0.906250
+vt 0.010417 0.916667
+vt 0.000000 0.916667
+vt 0.062500 0.895833
+vt 0.052083 0.895833
+vt 0.052083 0.885417
+vt 0.062500 0.885417
+vt 0.072917 0.885417
+vt 0.072917 0.895833
+vt 0.083333 0.885417
+vt 0.083333 0.895833
+vt 0.072917 0.906250
+vt 0.062500 0.906250
+vt 0.072917 0.916667
+vt 0.062500 0.916667
+vt 0.083333 0.906250
+vt 0.083333 0.916667
+vt 0.052083 0.906250
+vt 0.052083 0.916667
+vt 0.104167 0.895833
+vt 0.093750 0.895833
+vt 0.093750 0.885417
+vt 0.104167 0.885417
+vt 0.114583 0.885417
+vt 0.114583 0.895833
+vt 0.125000 0.885417
+vt 0.125000 0.895833
+vt 0.114583 0.906250
+vt 0.104167 0.906250
+vt 0.114583 0.916667
+vt 0.104167 0.916667
+vt 0.125000 0.906250
+vt 0.125000 0.916667
+vt 0.093750 0.906250
+vt 0.093750 0.916667
+vt 0.145833 0.895833
+vt 0.135417 0.895833
+vt 0.135417 0.885417
+vt 0.145833 0.885417
+vt 0.156250 0.885417
+vt 0.156250 0.895833
+vt 0.166667 0.885417
+vt 0.166667 0.895833
+vt 0.156250 0.906250
+vt 0.145833 0.906250
+vt 0.156250 0.916667
+vt 0.145833 0.916667
+vt 0.166667 0.906250
+vt 0.166667 0.916667
+vt 0.135417 0.906250
+vt 0.135417 0.916667
+vt 0.187500 0.895833
+vt 0.177083 0.895833
+vt 0.177083 0.885417
+vt 0.187500 0.885417
+vt 0.197917 0.885417
+vt 0.197917 0.895833
+vt 0.208333 0.885417
+vt 0.208333 0.895833
+vt 0.197917 0.906250
+vt 0.187500 0.906250
+vt 0.197917 0.916667
+vt 0.187500 0.916667
+vt 0.208333 0.906250
+vt 0.208333 0.916667
+vt 0.177083 0.906250
+vt 0.177083 0.916667
+vt 0.229167 0.895833
+vt 0.218750 0.895833
+vt 0.218750 0.885417
+vt 0.229167 0.885417
+vt 0.239583 0.885417
+vt 0.239583 0.895833
+vt 0.250000 0.885417
+vt 0.250000 0.895833
+vt 0.239583 0.906250
+vt 0.229167 0.906250
+vt 0.239583 0.916667
+vt 0.229167 0.916667
+vt 0.250000 0.906250
+vt 0.250000 0.916667
+vt 0.218750 0.906250
+vt 0.218750 0.916667
+vt 0.270833 0.895833
+vt 0.260417 0.895833
+vt 0.260417 0.885417
+vt 0.270833 0.885417
+vt 0.281250 0.885417
+vt 0.281250 0.895833
+vt 0.291667 0.885417
+vt 0.291667 0.895833
+vt 0.281250 0.906250
+vt 0.270833 0.906250
+vt 0.281250 0.916667
+vt 0.270833 0.916667
+vt 0.291667 0.906250
+vt 0.291667 0.916667
+vt 0.260417 0.906250
+vt 0.260417 0.916667
+vt 0.312500 0.895833
+vt 0.302083 0.895833
+vt 0.302083 0.885417
+vt 0.312500 0.885417
+vt 0.322917 0.885417
+vt 0.322917 0.895833
+vt 0.333333 0.885417
+vt 0.333333 0.895833
+vt 0.322917 0.906250
+vt 0.312500 0.906250
+vt 0.322917 0.916667
+vt 0.312500 0.916667
+vt 0.333333 0.906250
+vt 0.333333 0.916667
+vt 0.302083 0.906250
+vt 0.302083 0.916667
+vt 0.354167 0.895833
+vt 0.343750 0.895833
+vt 0.343750 0.885417
+vt 0.354167 0.885417
+vt 0.364583 0.885417
+vt 0.364583 0.895833
+vt 0.375000 0.885417
+vt 0.375000 0.895833
+vt 0.364583 0.906250
+vt 0.354167 0.906250
+vt 0.364583 0.916667
+vt 0.354167 0.916667
+vt 0.375000 0.906250
+vt 0.375000 0.916667
+vt 0.343750 0.906250
+vt 0.343750 0.916667
+vt 0.395833 0.895833
+vt 0.385417 0.895833
+vt 0.385417 0.885417
+vt 0.395833 0.885417
+vt 0.406250 0.885417
+vt 0.406250 0.895833
+vt 0.416667 0.885417
+vt 0.416667 0.895833
+vt 0.406250 0.906250
+vt 0.395833 0.906250
+vt 0.406250 0.916667
+vt 0.395833 0.916667
+vt 0.416667 0.906250
+vt 0.416667 0.916667
+vt 0.385417 0.906250
+vt 0.385417 0.916667
+vt 0.437500 0.895833
+vt 0.427083 0.895833
+vt 0.427083 0.885417
+vt 0.437500 0.885417
+vt 0.447917 0.885417
+vt 0.447917 0.895833
+vt 0.458333 0.885417
+vt 0.458333 0.895833
+vt 0.447917 0.906250
+vt 0.437500 0.906250
+vt 0.447917 0.916667
+vt 0.437500 0.916667
+vt 0.458333 0.906250
+vt 0.458333 0.916667
+vt 0.427083 0.906250
+vt 0.427083 0.916667
+vt 0.479167 0.895833
+vt 0.468750 0.895833
+vt 0.468750 0.885417
+vt 0.479167 0.885417
+vt 0.489583 0.885417
+vt 0.489583 0.895833
+vt 0.500000 0.885417
+vt 0.500000 0.895833
+vt 0.489583 0.906250
+vt 0.479167 0.906250
+vt 0.489583 0.916667
+vt 0.479167 0.916667
+vt 0.500000 0.906250
+vt 0.500000 0.916667
+vt 0.468750 0.906250
+vt 0.468750 0.916667
+vt 0.520833 0.895833
+vt 0.510417 0.895833
+vt 0.510417 0.885417
+vt 0.520833 0.885417
+vt 0.531250 0.885417
+vt 0.531250 0.895833
+vt 0.541667 0.885417
+vt 0.541667 0.895833
+vt 0.531250 0.906250
+vt 0.520833 0.906250
+vt 0.531250 0.916667
+vt 0.520833 0.916667
+vt 0.541667 0.906250
+vt 0.541667 0.916667
+vt 0.510417 0.906250
+vt 0.510417 0.916667
+vt 0.562500 0.895833
+vt 0.552083 0.895833
+vt 0.552083 0.885417
+vt 0.562500 0.885417
+vt 0.572917 0.885417
+vt 0.572917 0.895833
+vt 0.583333 0.885417
+vt 0.583333 0.895833
+vt 0.572917 0.906250
+vt 0.562500 0.906250
+vt 0.572917 0.916667
+vt 0.562500 0.916667
+vt 0.583333 0.906250
+vt 0.583333 0.916667
+vt 0.552083 0.906250
+vt 0.552083 0.916667
+vt 0.604167 0.895833
+vt 0.593750 0.895833
+vt 0.593750 0.885417
+vt 0.604167 0.885417
+vt 0.614583 0.885417
+vt 0.614583 0.895833
+vt 0.625000 0.885417
+vt 0.625000 0.895833
+vt 0.614583 0.906250
+vt 0.604167 0.906250
+vt 0.614583 0.916667
+vt 0.604167 0.916667
+vt 0.625000 0.906250
+vt 0.625000 0.916667
+vt 0.593750 0.906250
+vt 0.593750 0.916667
+vt 0.645833 0.895833
+vt 0.635417 0.895833
+vt 0.635417 0.885417
+vt 0.645833 0.885417
+vt 0.656250 0.885417
+vt 0.656250 0.895833
+vt 0.666667 0.885417
+vt 0.666667 0.895833
+vt 0.656250 0.906250
+vt 0.645833 0.906250
+vt 0.656250 0.916667
+vt 0.645833 0.916667
+vt 0.666667 0.906250
+vt 0.666667 0.916667
+vt 0.635417 0.906250
+vt 0.635417 0.916667
+vt 0.687500 0.895833
+vt 0.677083 0.895833
+vt 0.677083 0.885417
+vt 0.687500 0.885417
+vt 0.697917 0.885417
+vt 0.697917 0.895833
+vt 0.708333 0.885417
+vt 0.708333 0.895833
+vt 0.697917 0.906250
+vt 0.687500 0.906250
+vt 0.697917 0.916667
+vt 0.687500 0.916667
+vt 0.708333 0.906250
+vt 0.708333 0.916667
+vt 0.677083 0.906250
+vt 0.677083 0.916667
+vt 0.729167 0.895833
+vt 0.718750 0.895833
+vt 0.718750 0.885417
+vt 0.729167 0.885417
+vt 0.739583 0.885417
+vt 0.739583 0.895833
+vt 0.750000 0.885417
+vt 0.750000 0.895833
+vt 0.739583 0.906250
+vt 0.729167 0.906250
+vt 0.739583 0.916667
+vt 0.729167 0.916667
+vt 0.750000 0.906250
+vt 0.750000 0.916667
+vt 0.718750 0.906250
+vt 0.718750 0.916667
+vt 0.770833 0.895833
+vt 0.760417 0.895833
+vt 0.760417 0.885417
+vt 0.770833 0.885417
+vt 0.781250 0.885417
+vt 0.781250 0.895833
+vt 0.791667 0.885417
+vt 0.791667 0.895833
+vt 0.781250 0.906250
+vt 0.770833 0.906250
+vt 0.781250 0.916667
+vt 0.770833 0.916667
+vt 0.791667 0.906250
+vt 0.791667 0.916667
+vt 0.760417 0.906250
+vt 0.760417 0.916667
+vt 0.812500 0.895833
+vt 0.802083 0.895833
+vt 0.802083 0.885417
+vt 0.812500 0.885417
+vt 0.822917 0.885417
+vt 0.822917 0.895833
+vt 0.833333 0.885417
+vt 0.833333 0.895833
+vt 0.822917 0.906250
+vt 0.812500 0.906250
+vt 0.822917 0.916667
+vt 0.812500 0.916667
+vt 0.833333 0.906250
+vt 0.833333 0.916667
+vt 0.802083 0.906250
+vt 0.802083 0.916667
+vt 0.854167 0.895833
+vt 0.843750 0.895833
+vt 0.843750 0.885417
+vt 0.854167 0.885417
+vt 0.864583 0.885417
+vt 0.864583 0.895833
+vt 0.875000 0.885417
+vt 0.875000 0.895833
+vt 0.864583 0.906250
+vt 0.854167 0.906250
+vt 0.864583 0.916667
+vt 0.854167 0.916667
+vt 0.875000 0.906250
+vt 0.875000 0.916667
+vt 0.843750 0.906250
+vt 0.843750 0.916667
+vt 0.895833 0.895833
+vt 0.885417 0.895833
+vt 0.885417 0.885417
+vt 0.895833 0.885417
+vt 0.906250 0.885417
+vt 0.906250 0.895833
+vt 0.916667 0.885417
+vt 0.916667 0.895833
+vt 0.906250 0.906250
+vt 0.895833 0.906250
+vt 0.906250 0.916667
+vt 0.895833 0.916667
+vt 0.916667 0.906250
+vt 0.916667 0.916667
+vt 0.885417 0.906250
+vt 0.885417 0.916667
+vt 0.937500 0.895833
+vt 0.927083 0.895833
+vt 0.927083 0.885417
+vt 0.937500 0.885417
+vt 0.947917 0.885417
+vt 0.947917 0.895833
+vt 0.958333 0.885417
+vt 0.958333 0.895833
+vt 0.947917 0.906250
+vt 0.937500 0.906250
+vt 0.947917 0.916667
+vt 0.937500 0.916667
+vt 0.958333 0.906250
+vt 0.958333 0.916667
+vt 0.927083 0.906250
+vt 0.927083 0.916667
+vt 0.979167 0.895833
+vt 0.968750 0.895833
+vt 0.968750 0.885417
+vt 0.979167 0.885417
+vt 0.989583 0.885417
+vt 0.989583 0.895833
+vt 1.000000 0.885417
+vt 1.000000 0.895833
+vt 0.989583 0.906250
+vt 0.979167 0.906250
+vt 0.989583 0.916667
+vt 0.979167 0.916667
+vt 1.000000 0.906250
+vt 1.000000 0.916667
+vt 0.968750 0.906250
+vt 0.968750 0.916667
+vt 0.020874 0.937500
+vt 0.010579 0.937392
+vt 0.010417 0.927083
+vt 0.020833 0.927083
+vt 0.000326 0.937500
+vt 0.000000 0.927083
+vt 0.031250 0.927083
+vt 0.031250 0.938043
+vt 0.041667 0.927083
+vt 0.041667 0.938422
+vt 0.031250 0.950087
+vt 0.020996 0.947917
+vt 0.030599 0.961155
+vt 0.021077 0.957682
+vt 0.041667 0.951606
+vt 0.041667 0.971354
+vt 0.011068 0.947483
+vt 0.001302 0.947917
+vt 0.012044 0.957248
+vt 0.003255 0.958333
+vt 0.062500 0.937663
+vt 0.052083 0.938043
+vt 0.052083 0.927083
+vt 0.062500 0.927083
+vt 0.072917 0.927083
+vt 0.072917 0.938043
+vt 0.083333 0.927083
+vt 0.083333 0.938422
+vt 0.072917 0.950087
+vt 0.062500 0.948568
+vt 0.072266 0.961155
+vt 0.062500 0.958659
+vt 0.083333 0.951606
+vt 0.083333 0.971354
+vt 0.052083 0.950087
+vt 0.052734 0.961155
+vt 0.104167 0.937663
+vt 0.093750 0.938043
+vt 0.093750 0.927083
+vt 0.104167 0.927083
+vt 0.114583 0.927083
+vt 0.114583 0.938043
+vt 0.125000 0.927083
+vt 0.125000 0.938422
+vt 0.114583 0.950087
+vt 0.104167 0.948568
+vt 0.113932 0.961155
+vt 0.104167 0.958659
+vt 0.125000 0.951606
+vt 0.125000 0.971354
+vt 0.093750 0.950087
+vt 0.094401 0.961155
+vt 0.145833 0.937663
+vt 0.135417 0.938043
+vt 0.135417 0.927083
+vt 0.145833 0.927083
+vt 0.156250 0.927083
+vt 0.156250 0.938043
+vt 0.166667 0.927083
+vt 0.166667 0.938422
+vt 0.156250 0.950087
+vt 0.145833 0.948568
+vt 0.155599 0.961155
+vt 0.145833 0.958659
+vt 0.166667 0.951606
+vt 0.166667 0.971354
+vt 0.135417 0.950087
+vt 0.136068 0.961155
+vt 0.187500 0.937663
+vt 0.177083 0.938043
+vt 0.177083 0.927083
+vt 0.187500 0.927083
+vt 0.197917 0.927083
+vt 0.197917 0.938043
+vt 0.208333 0.927083
+vt 0.208333 0.938422
+vt 0.197917 0.950087
+vt 0.187500 0.948568
+vt 0.197266 0.961155
+vt 0.187500 0.958659
+vt 0.208333 0.951606
+vt 0.208333 0.971354
+vt 0.177083 0.950087
+vt 0.177734 0.961155
+vt 0.229167 0.937663
+vt 0.218750 0.938043
+vt 0.218750 0.927083
+vt 0.229167 0.927083
+vt 0.239583 0.927083
+vt 0.239583 0.938043
+vt 0.250000 0.927083
+vt 0.250000 0.938422
+vt 0.239583 0.950087
+vt 0.229167 0.948568
+vt 0.238932 0.961155
+vt 0.229167 0.958659
+vt 0.250000 0.951606
+vt 0.250000 0.971354
+vt 0.218750 0.950087
+vt 0.219401 0.961155
+vt 0.270833 0.937663
+vt 0.260417 0.938043
+vt 0.260417 0.927083
+vt 0.270833 0.927083
+vt 0.281250 0.927083
+vt 0.281250 0.938043
+vt 0.291667 0.927083
+vt 0.291667 0.938422
+vt 0.281250 0.950087
+vt 0.270833 0.948568
+vt 0.280599 0.961155
+vt 0.270833 0.958659
+vt 0.291667 0.951606
+vt 0.291667 0.971354
+vt 0.260417 0.950087
+vt 0.261068 0.961155
+vt 0.312500 0.937663
+vt 0.302083 0.938043
+vt 0.302083 0.927083
+vt 0.312500 0.927083
+vt 0.322917 0.927083
+vt 0.322917 0.938043
+vt 0.333333 0.927083
+vt 0.333333 0.938422
+vt 0.322917 0.950087
+vt 0.312500 0.948568
+vt 0.322266 0.961155
+vt 0.312500 0.958659
+vt 0.333333 0.951606
+vt 0.333333 0.971354
+vt 0.302083 0.950087
+vt 0.302734 0.961155
+vt 0.354167 0.937663
+vt 0.343750 0.938043
+vt 0.343750 0.927083
+vt 0.354167 0.927083
+vt 0.364583 0.927083
+vt 0.364583 0.938043
+vt 0.375000 0.927083
+vt 0.375000 0.938422
+vt 0.364583 0.950087
+vt 0.354167 0.948568
+vt 0.363932 0.961155
+vt 0.354167 0.958659
+vt 0.375000 0.951606
+vt 0.375000 0.971354
+vt 0.343750 0.950087
+vt 0.344401 0.961155
+vt 0.395833 0.937663
+vt 0.385417 0.938043
+vt 0.385417 0.927083
+vt 0.395833 0.927083
+vt 0.406250 0.927083
+vt 0.406250 0.938043
+vt 0.416667 0.927083
+vt 0.416667 0.938422
+vt 0.406250 0.950087
+vt 0.395833 0.948568
+vt 0.405599 0.961155
+vt 0.395833 0.958659
+vt 0.416667 0.951606
+vt 0.416667 0.971354
+vt 0.385417 0.950087
+vt 0.386068 0.961155
+vt 0.437500 0.937663
+vt 0.427083 0.938043
+vt 0.427083 0.927083
+vt 0.437500 0.927083
+vt 0.447917 0.927083
+vt 0.447917 0.938043
+vt 0.458333 0.927083
+vt 0.458333 0.938422
+vt 0.447917 0.950087
+vt 0.437500 0.948568
+vt 0.447266 0.961155
+vt 0.437500 0.958659
+vt 0.458333 0.951606
+vt 0.458333 0.971354
+vt 0.427083 0.950087
+vt 0.427734 0.961155
+vt 0.479167 0.937663
+vt 0.468750 0.938043
+vt 0.468750 0.927083
+vt 0.479167 0.927083
+vt 0.489583 0.927083
+vt 0.489583 0.938043
+vt 0.500000 0.927083
+vt 0.500000 0.938422
+vt 0.489583 0.950087
+vt 0.479167 0.948568
+vt 0.488932 0.961155
+vt 0.479167 0.958659
+vt 0.500000 0.951606
+vt 0.500000 0.971354
+vt 0.468750 0.950087
+vt 0.469401 0.961155
+vt 0.520833 0.937663
+vt 0.510417 0.938043
+vt 0.510417 0.927083
+vt 0.520833 0.927083
+vt 0.531250 0.927083
+vt 0.531250 0.938043
+vt 0.541667 0.927083
+vt 0.541667 0.938422
+vt 0.531250 0.950087
+vt 0.520833 0.948568
+vt 0.530599 0.961155
+vt 0.520833 0.958659
+vt 0.541667 0.951606
+vt 0.541667 0.971354
+vt 0.510417 0.950087
+vt 0.511068 0.961155
+vt 0.562500 0.937663
+vt 0.552083 0.938043
+vt 0.552083 0.927083
+vt 0.562500 0.927083
+vt 0.572917 0.927083
+vt 0.572917 0.938043
+vt 0.583333 0.927083
+vt 0.583333 0.938422
+vt 0.572917 0.950087
+vt 0.562500 0.948568
+vt 0.572266 0.961155
+vt 0.562500 0.958659
+vt 0.583333 0.951606
+vt 0.583333 0.971354
+vt 0.552083 0.950087
+vt 0.552734 0.961155
+vt 0.604167 0.937663
+vt 0.593750 0.938043
+vt 0.593750 0.927083
+vt 0.604167 0.927083
+vt 0.614583 0.927083
+vt 0.614583 0.938043
+vt 0.625000 0.927083
+vt 0.625000 0.938422
+vt 0.614583 0.950087
+vt 0.604167 0.948568
+vt 0.613932 0.961155
+vt 0.604167 0.958659
+vt 0.625000 0.951606
+vt 0.625000 0.971354
+vt 0.593750 0.950087
+vt 0.594401 0.961155
+vt 0.645833 0.937663
+vt 0.635417 0.938043
+vt 0.635417 0.927083
+vt 0.645833 0.927083
+vt 0.656250 0.927083
+vt 0.656250 0.938043
+vt 0.666667 0.927083
+vt 0.666667 0.938422
+vt 0.656250 0.950087
+vt 0.645833 0.948568
+vt 0.655599 0.961155
+vt 0.645833 0.958659
+vt 0.666667 0.951606
+vt 0.666667 0.971354
+vt 0.635417 0.950087
+vt 0.636068 0.961155
+vt 0.687500 0.937663
+vt 0.677083 0.938043
+vt 0.677083 0.927083
+vt 0.687500 0.927083
+vt 0.697917 0.927083
+vt 0.697917 0.938043
+vt 0.708333 0.927083
+vt 0.708333 0.938422
+vt 0.697917 0.950087
+vt 0.687500 0.948568
+vt 0.697266 0.961155
+vt 0.687500 0.958659
+vt 0.708333 0.951606
+vt 0.708333 0.971354
+vt 0.677083 0.950087
+vt 0.677734 0.961155
+vt 0.729167 0.937663
+vt 0.718750 0.938043
+vt 0.718750 0.927083
+vt 0.729167 0.927083
+vt 0.739583 0.927083
+vt 0.739583 0.938043
+vt 0.750000 0.927083
+vt 0.750000 0.938422
+vt 0.739583 0.950087
+vt 0.729167 0.948568
+vt 0.738932 0.961155
+vt 0.729167 0.958659
+vt 0.750000 0.951606
+vt 0.750000 0.971354
+vt 0.718750 0.950087
+vt 0.719401 0.961155
+vt 0.770833 0.937663
+vt 0.760417 0.938043
+vt 0.760417 0.927083
+vt 0.770833 0.927083
+vt 0.781250 0.927083
+vt 0.781250 0.938043
+vt 0.791667 0.927083
+vt 0.791667 0.938422
+vt 0.781250 0.950087
+vt 0.770833 0.948568
+vt 0.780599 0.961155
+vt 0.770833 0.958659
+vt 0.791667 0.951606
+vt 0.791667 0.971354
+vt 0.760417 0.950087
+vt 0.761068 0.961155
+vt 0.812500 0.937663
+vt 0.802083 0.938043
+vt 0.802083 0.927083
+vt 0.812500 0.927083
+vt 0.822917 0.927083
+vt 0.822917 0.938043
+vt 0.833333 0.927083
+vt 0.833333 0.938422
+vt 0.822917 0.950087
+vt 0.812500 0.948568
+vt 0.822266 0.961155
+vt 0.812500 0.958659
+vt 0.833333 0.951606
+vt 0.833333 0.971354
+vt 0.802083 0.950087
+vt 0.802734 0.961155
+vt 0.854167 0.937663
+vt 0.843750 0.938043
+vt 0.843750 0.927083
+vt 0.854167 0.927083
+vt 0.864583 0.927083
+vt 0.864583 0.938043
+vt 0.875000 0.927083
+vt 0.875000 0.938422
+vt 0.864583 0.950087
+vt 0.854167 0.948568
+vt 0.863932 0.961155
+vt 0.854167 0.958659
+vt 0.875000 0.951606
+vt 0.875000 0.971354
+vt 0.843750 0.950087
+vt 0.844401 0.961155
+vt 0.895833 0.937663
+vt 0.885417 0.938043
+vt 0.885417 0.927083
+vt 0.895833 0.927083
+vt 0.906250 0.927083
+vt 0.906250 0.938043
+vt 0.916667 0.927083
+vt 0.916667 0.938422
+vt 0.906250 0.950087
+vt 0.895833 0.948568
+vt 0.905599 0.961155
+vt 0.895833 0.958659
+vt 0.916667 0.951606
+vt 0.916667 0.971354
+vt 0.885417 0.950087
+vt 0.886068 0.961155
+vt 0.937500 0.937663
+vt 0.927083 0.938043
+vt 0.927083 0.927083
+vt 0.937500 0.927083
+vt 0.947917 0.927083
+vt 0.947917 0.938043
+vt 0.958333 0.927083
+vt 0.958333 0.938422
+vt 0.947917 0.950087
+vt 0.937500 0.948568
+vt 0.947266 0.961155
+vt 0.937500 0.958659
+vt 0.958333 0.951606
+vt 0.958333 0.971354
+vt 0.927083 0.950087
+vt 0.927734 0.961155
+vt 0.979126 0.937500
+vt 0.968750 0.938043
+vt 0.968750 0.927083
+vt 0.979167 0.927083
+vt 0.989583 0.927083
+vt 0.989421 0.937392
+vt 1.000000 0.927083
+vt 0.999675 0.937500
+vt 0.988932 0.947483
+vt 0.979004 0.947917
+vt 0.987956 0.957248
+vt 0.978923 0.957682
+vt 0.998698 0.947917
+vt 0.996745 0.958333
+vt 0.968750 0.950087
+vt 0.969401 0.961155
+vt 0.020906 0.027778
+vt 0.025391 0.024197
+vt 0.028646 0.030816
+vt 0.020996 0.033854
+vt 0.031250 0.019531
+vt 0.036458 0.026042
+vt 0.013672 0.033420
+vt 0.016439 0.024848
+vt 0.006510 0.031250
+vt 0.010742 0.020833
+vt 0.020833 0.017361
+vt 0.026042 0.010417
+vt 0.015625 0.010417
+vt 0.020833 0.000000
+vt 0.062500 0.027488
+vt 0.067057 0.024197
+vt 0.070312 0.030816
+vt 0.062500 0.033203
+vt 0.072917 0.019531
+vt 0.078125 0.026042
+vt 0.054688 0.030816
+vt 0.057943 0.024197
+vt 0.046875 0.026042
+vt 0.052083 0.019531
+vt 0.062500 0.017361
+vt 0.067708 0.010417
+vt 0.057292 0.010417
+vt 0.062500 0.000000
+vt 0.104167 0.027488
+vt 0.108724 0.024197
+vt 0.111979 0.030816
+vt 0.104167 0.033203
+vt 0.114583 0.019531
+vt 0.119792 0.026042
+vt 0.096354 0.030816
+vt 0.099609 0.024197
+vt 0.088542 0.026042
+vt 0.093750 0.019531
+vt 0.104167 0.017361
+vt 0.109375 0.010417
+vt 0.098958 0.010417
+vt 0.104167 0.000000
+vt 0.145833 0.027488
+vt 0.150391 0.024197
+vt 0.153646 0.030816
+vt 0.145833 0.033203
+vt 0.156250 0.019531
+vt 0.161458 0.026042
+vt 0.138021 0.030816
+vt 0.141276 0.024197
+vt 0.130208 0.026042
+vt 0.135417 0.019531
+vt 0.145833 0.017361
+vt 0.151042 0.010417
+vt 0.140625 0.010417
+vt 0.145833 0.000000
+vt 0.187500 0.027488
+vt 0.192057 0.024197
+vt 0.195313 0.030816
+vt 0.187500 0.033203
+vt 0.197917 0.019531
+vt 0.203125 0.026042
+vt 0.179688 0.030816
+vt 0.182943 0.024197
+vt 0.171875 0.026042
+vt 0.177083 0.019531
+vt 0.187500 0.017361
+vt 0.192708 0.010417
+vt 0.182292 0.010417
+vt 0.187500 0.000000
+vt 0.229167 0.027488
+vt 0.233724 0.024197
+vt 0.236979 0.030816
+vt 0.229167 0.033203
+vt 0.239583 0.019531
+vt 0.244792 0.026042
+vt 0.221354 0.030816
+vt 0.224609 0.024197
+vt 0.213542 0.026042
+vt 0.218750 0.019531
+vt 0.229167 0.017361
+vt 0.234375 0.010417
+vt 0.223958 0.010417
+vt 0.229167 0.000000
+vt 0.270833 0.027488
+vt 0.275391 0.024197
+vt 0.278646 0.030816
+vt 0.270833 0.033203
+vt 0.281250 0.019531
+vt 0.286458 0.026042
+vt 0.263021 0.030816
+vt 0.266276 0.024197
+vt 0.255208 0.026042
+vt 0.260417 0.019531
+vt 0.270833 0.017361
+vt 0.276042 0.010417
+vt 0.265625 0.010417
+vt 0.270833 0.000000
+vt 0.312500 0.027488
+vt 0.317057 0.024197
+vt 0.320312 0.030816
+vt 0.312500 0.033203
+vt 0.322917 0.019531
+vt 0.328125 0.026042
+vt 0.304688 0.030816
+vt 0.307943 0.024197
+vt 0.296875 0.026042
+vt 0.302083 0.019531
+vt 0.312500 0.017361
+vt 0.317708 0.010417
+vt 0.307292 0.010417
+vt 0.312500 0.000000
+vt 0.354167 0.027488
+vt 0.358724 0.024197
+vt 0.361979 0.030816
+vt 0.354167 0.033203
+vt 0.364583 0.019531
+vt 0.369792 0.026042
+vt 0.346354 0.030816
+vt 0.349609 0.024197
+vt 0.338542 0.026042
+vt 0.343750 0.019531
+vt 0.354167 0.017361
+vt 0.359375 0.010417
+vt 0.348958 0.010417
+vt 0.354167 0.000000
+vt 0.395833 0.027488
+vt 0.400391 0.024197
+vt 0.403646 0.030816
+vt 0.395833 0.033203
+vt 0.406250 0.019531
+vt 0.411458 0.026042
+vt 0.388021 0.030816
+vt 0.391276 0.024197
+vt 0.380208 0.026042
+vt 0.385417 0.019531
+vt 0.395833 0.017361
+vt 0.401042 0.010417
+vt 0.390625 0.010417
+vt 0.395833 0.000000
+vt 0.437500 0.027488
+vt 0.442057 0.024197
+vt 0.445312 0.030816
+vt 0.437500 0.033203
+vt 0.447917 0.019531
+vt 0.453125 0.026042
+vt 0.429687 0.030816
+vt 0.432943 0.024197
+vt 0.421875 0.026042
+vt 0.427083 0.019531
+vt 0.437500 0.017361
+vt 0.442708 0.010417
+vt 0.432292 0.010417
+vt 0.437500 0.000000
+vt 0.479167 0.027488
+vt 0.483724 0.024197
+vt 0.486979 0.030816
+vt 0.479167 0.033203
+vt 0.489583 0.019531
+vt 0.494792 0.026042
+vt 0.471354 0.030816
+vt 0.474609 0.024197
+vt 0.463542 0.026042
+vt 0.468750 0.019531
+vt 0.479167 0.017361
+vt 0.484375 0.010417
+vt 0.473958 0.010417
+vt 0.479167 0.000000
+vt 0.520833 0.027488
+vt 0.525391 0.024197
+vt 0.528646 0.030816
+vt 0.520833 0.033203
+vt 0.531250 0.019531
+vt 0.536458 0.026042
+vt 0.513021 0.030816
+vt 0.516276 0.024197
+vt 0.505208 0.026042
+vt 0.510417 0.019531
+vt 0.520833 0.017361
+vt 0.526042 0.010417
+vt 0.515625 0.010417
+vt 0.520833 0.000000
+vt 0.562500 0.027488
+vt 0.567057 0.024197
+vt 0.570312 0.030816
+vt 0.562500 0.033203
+vt 0.572917 0.019531
+vt 0.578125 0.026042
+vt 0.554688 0.030816
+vt 0.557943 0.024197
+vt 0.546875 0.026042
+vt 0.552083 0.019531
+vt 0.562500 0.017361
+vt 0.567708 0.010417
+vt 0.557292 0.010417
+vt 0.562500 0.000000
+vt 0.604167 0.027488
+vt 0.608724 0.024197
+vt 0.611979 0.030816
+vt 0.604167 0.033203
+vt 0.614583 0.019531
+vt 0.619792 0.026042
+vt 0.596354 0.030816
+vt 0.599609 0.024197
+vt 0.588542 0.026042
+vt 0.593750 0.019531
+vt 0.604167 0.017361
+vt 0.609375 0.010417
+vt 0.598958 0.010417
+vt 0.604167 0.000000
+vt 0.645833 0.027488
+vt 0.650391 0.024197
+vt 0.653646 0.030816
+vt 0.645833 0.033203
+vt 0.656250 0.019531
+vt 0.661458 0.026042
+vt 0.638021 0.030816
+vt 0.641276 0.024197
+vt 0.630208 0.026042
+vt 0.635417 0.019531
+vt 0.645833 0.017361
+vt 0.651042 0.010417
+vt 0.640625 0.010417
+vt 0.645833 0.000000
+vt 0.687500 0.027488
+vt 0.692057 0.024197
+vt 0.695313 0.030816
+vt 0.687500 0.033203
+vt 0.697917 0.019531
+vt 0.703125 0.026042
+vt 0.679688 0.030816
+vt 0.682943 0.024197
+vt 0.671875 0.026042
+vt 0.677083 0.019531
+vt 0.687500 0.017361
+vt 0.692708 0.010417
+vt 0.682292 0.010417
+vt 0.687500 0.000000
+vt 0.729167 0.027488
+vt 0.733724 0.024197
+vt 0.736979 0.030816
+vt 0.729167 0.033203
+vt 0.739583 0.019531
+vt 0.744792 0.026042
+vt 0.721354 0.030816
+vt 0.724609 0.024197
+vt 0.713542 0.026042
+vt 0.718750 0.019531
+vt 0.729167 0.017361
+vt 0.734375 0.010417
+vt 0.723958 0.010417
+vt 0.729167 0.000000
+vt 0.770833 0.027488
+vt 0.775391 0.024197
+vt 0.778646 0.030816
+vt 0.770833 0.033203
+vt 0.781250 0.019531
+vt 0.786458 0.026042
+vt 0.763021 0.030816
+vt 0.766276 0.024197
+vt 0.755208 0.026042
+vt 0.760417 0.019531
+vt 0.770833 0.017361
+vt 0.776042 0.010417
+vt 0.765625 0.010417
+vt 0.770833 0.000000
+vt 0.812500 0.027488
+vt 0.817057 0.024197
+vt 0.820313 0.030816
+vt 0.812500 0.033203
+vt 0.822917 0.019531
+vt 0.828125 0.026042
+vt 0.804688 0.030816
+vt 0.807943 0.024197
+vt 0.796875 0.026042
+vt 0.802083 0.019531
+vt 0.812500 0.017361
+vt 0.817708 0.010417
+vt 0.807292 0.010417
+vt 0.812500 0.000000
+vt 0.854167 0.027488
+vt 0.858724 0.024197
+vt 0.861979 0.030816
+vt 0.854167 0.033203
+vt 0.864583 0.019531
+vt 0.869792 0.026042
+vt 0.846354 0.030816
+vt 0.849609 0.024197
+vt 0.838542 0.026042
+vt 0.843750 0.019531
+vt 0.854167 0.017361
+vt 0.859375 0.010417
+vt 0.848958 0.010417
+vt 0.854167 0.000000
+vt 0.895833 0.027488
+vt 0.900391 0.024197
+vt 0.903646 0.030816
+vt 0.895833 0.033203
+vt 0.906250 0.019531
+vt 0.911458 0.026042
+vt 0.888021 0.030816
+vt 0.891276 0.024197
+vt 0.880208 0.026042
+vt 0.885417 0.019531
+vt 0.895833 0.017361
+vt 0.901042 0.010417
+vt 0.890625 0.010417
+vt 0.895833 0.000000
+vt 0.937500 0.027488
+vt 0.942057 0.024197
+vt 0.945313 0.030816
+vt 0.937500 0.033203
+vt 0.947917 0.019531
+vt 0.953125 0.026042
+vt 0.929688 0.030816
+vt 0.932943 0.024197
+vt 0.921875 0.026042
+vt 0.927083 0.019531
+vt 0.937500 0.017361
+vt 0.942708 0.010417
+vt 0.932292 0.010417
+vt 0.937500 0.000000
+vt 0.979095 0.027778
+vt 0.983561 0.024848
+vt 0.986328 0.033420
+vt 0.979004 0.033854
+vt 0.989258 0.020833
+vt 0.993490 0.031250
+vt 0.971354 0.030816
+vt 0.974609 0.024197
+vt 0.963542 0.026042
+vt 0.968750 0.019531
+vt 0.979167 0.017361
+vt 0.984375 0.010417
+vt 0.973958 0.010417
+vt 0.979167 0.000000
+vt 0.020906 0.972222
+vt 0.016439 0.975152
+vt 0.013672 0.966580
+vt 0.020996 0.966146
+vt 0.010742 0.979167
+vt 0.006510 0.968750
+vt 0.028646 0.969184
+vt 0.025391 0.975803
+vt 0.036458 0.973958
+vt 0.031250 0.980469
+vt 0.020833 0.982639
+vt 0.015625 0.989583
+vt 0.026042 0.989583
+vt 0.020833 1.000000
+vt 0.062500 0.972512
+vt 0.057943 0.975803
+vt 0.054688 0.969184
+vt 0.062500 0.966797
+vt 0.052083 0.980469
+vt 0.046875 0.973958
+vt 0.070312 0.969184
+vt 0.067057 0.975803
+vt 0.078125 0.973958
+vt 0.072917 0.980469
+vt 0.062500 0.982639
+vt 0.057292 0.989583
+vt 0.067708 0.989583
+vt 0.062500 1.000000
+vt 0.104167 0.972512
+vt 0.099609 0.975803
+vt 0.096354 0.969184
+vt 0.104167 0.966797
+vt 0.093750 0.980469
+vt 0.088542 0.973958
+vt 0.111979 0.969184
+vt 0.108724 0.975803
+vt 0.119792 0.973958
+vt 0.114583 0.980469
+vt 0.104167 0.982639
+vt 0.098958 0.989583
+vt 0.109375 0.989583
+vt 0.104167 1.000000
+vt 0.145833 0.972512
+vt 0.141276 0.975803
+vt 0.138021 0.969184
+vt 0.145833 0.966797
+vt 0.135417 0.980469
+vt 0.130208 0.973958
+vt 0.153646 0.969184
+vt 0.150391 0.975803
+vt 0.161458 0.973958
+vt 0.156250 0.980469
+vt 0.145833 0.982639
+vt 0.140625 0.989583
+vt 0.151042 0.989583
+vt 0.145833 1.000000
+vt 0.187500 0.972512
+vt 0.182943 0.975803
+vt 0.179688 0.969184
+vt 0.187500 0.966797
+vt 0.177083 0.980469
+vt 0.171875 0.973958
+vt 0.195312 0.969184
+vt 0.192057 0.975803
+vt 0.203125 0.973958
+vt 0.197917 0.980469
+vt 0.187500 0.982639
+vt 0.182292 0.989583
+vt 0.192708 0.989583
+vt 0.187500 1.000000
+vt 0.229167 0.972512
+vt 0.224609 0.975803
+vt 0.221354 0.969184
+vt 0.229167 0.966797
+vt 0.218750 0.980469
+vt 0.213542 0.973958
+vt 0.236979 0.969184
+vt 0.233724 0.975803
+vt 0.244792 0.973958
+vt 0.239583 0.980469
+vt 0.229167 0.982639
+vt 0.223958 0.989583
+vt 0.234375 0.989583
+vt 0.229167 1.000000
+vt 0.270833 0.972512
+vt 0.266276 0.975803
+vt 0.263021 0.969184
+vt 0.270833 0.966797
+vt 0.260417 0.980469
+vt 0.255208 0.973958
+vt 0.278646 0.969184
+vt 0.275391 0.975803
+vt 0.286458 0.973958
+vt 0.281250 0.980469
+vt 0.270833 0.982639
+vt 0.265625 0.989583
+vt 0.276042 0.989583
+vt 0.270833 1.000000
+vt 0.312500 0.972512
+vt 0.307943 0.975803
+vt 0.304688 0.969184
+vt 0.312500 0.966797
+vt 0.302083 0.980469
+vt 0.296875 0.973958
+vt 0.320312 0.969184
+vt 0.317057 0.975803
+vt 0.328125 0.973958
+vt 0.322917 0.980469
+vt 0.312500 0.982639
+vt 0.307292 0.989583
+vt 0.317708 0.989583
+vt 0.312500 1.000000
+vt 0.354167 0.972512
+vt 0.349609 0.975803
+vt 0.346354 0.969184
+vt 0.354167 0.966797
+vt 0.343750 0.980469
+vt 0.338542 0.973958
+vt 0.361979 0.969184
+vt 0.358724 0.975803
+vt 0.369792 0.973958
+vt 0.364583 0.980469
+vt 0.354167 0.982639
+vt 0.348958 0.989583
+vt 0.359375 0.989583
+vt 0.354167 1.000000
+vt 0.395833 0.972512
+vt 0.391276 0.975803
+vt 0.388021 0.969184
+vt 0.395833 0.966797
+vt 0.385417 0.980469
+vt 0.380208 0.973958
+vt 0.403646 0.969184
+vt 0.400391 0.975803
+vt 0.411458 0.973958
+vt 0.406250 0.980469
+vt 0.395833 0.982639
+vt 0.390625 0.989583
+vt 0.401042 0.989583
+vt 0.395833 1.000000
+vt 0.437500 0.972512
+vt 0.432943 0.975803
+vt 0.429687 0.969184
+vt 0.437500 0.966797
+vt 0.427083 0.980469
+vt 0.421875 0.973958
+vt 0.445312 0.969184
+vt 0.442057 0.975803
+vt 0.453125 0.973958
+vt 0.447917 0.980469
+vt 0.437500 0.982639
+vt 0.432292 0.989583
+vt 0.442708 0.989583
+vt 0.437500 1.000000
+vt 0.479167 0.972512
+vt 0.474609 0.975803
+vt 0.471354 0.969184
+vt 0.479167 0.966797
+vt 0.468750 0.980469
+vt 0.463542 0.973958
+vt 0.486979 0.969184
+vt 0.483724 0.975803
+vt 0.494792 0.973958
+vt 0.489583 0.980469
+vt 0.479167 0.982639
+vt 0.473958 0.989583
+vt 0.484375 0.989583
+vt 0.479167 1.000000
+vt 0.520833 0.972512
+vt 0.516276 0.975803
+vt 0.513021 0.969184
+vt 0.520833 0.966797
+vt 0.510417 0.980469
+vt 0.505208 0.973958
+vt 0.528646 0.969184
+vt 0.525391 0.975803
+vt 0.536458 0.973958
+vt 0.531250 0.980469
+vt 0.520833 0.982639
+vt 0.515625 0.989583
+vt 0.526042 0.989583
+vt 0.520833 1.000000
+vt 0.562500 0.972512
+vt 0.557943 0.975803
+vt 0.554688 0.969184
+vt 0.562500 0.966797
+vt 0.552083 0.980469
+vt 0.546875 0.973958
+vt 0.570312 0.969184
+vt 0.567057 0.975803
+vt 0.578125 0.973958
+vt 0.572917 0.980469
+vt 0.562500 0.982639
+vt 0.557292 0.989583
+vt 0.567708 0.989583
+vt 0.562500 1.000000
+vt 0.604167 0.972512
+vt 0.599609 0.975803
+vt 0.596354 0.969184
+vt 0.604167 0.966797
+vt 0.593750 0.980469
+vt 0.588542 0.973958
+vt 0.611979 0.969184
+vt 0.608724 0.975803
+vt 0.619792 0.973958
+vt 0.614583 0.980469
+vt 0.604167 0.982639
+vt 0.598958 0.989583
+vt 0.609375 0.989583
+vt 0.604167 1.000000
+vt 0.645833 0.972512
+vt 0.641276 0.975803
+vt 0.638021 0.969184
+vt 0.645833 0.966797
+vt 0.630208 0.973958
+vt 0.653646 0.969184
+vt 0.650391 0.975803
+vt 0.661458 0.973958
+vt 0.656250 0.980469
+vt 0.645833 0.982639
+vt 0.640625 0.989583
+vt 0.651042 0.989583
+vt 0.645833 1.000000
+vt 0.687500 0.972512
+vt 0.682943 0.975803
+vt 0.679688 0.969184
+vt 0.687500 0.966797
+vt 0.677083 0.980469
+vt 0.671875 0.973958
+vt 0.695312 0.969184
+vt 0.692057 0.975803
+vt 0.703125 0.973958
+vt 0.697917 0.980469
+vt 0.687500 0.982639
+vt 0.682292 0.989583
+vt 0.692708 0.989583
+vt 0.687500 1.000000
+vt 0.729167 0.972512
+vt 0.724609 0.975803
+vt 0.721354 0.969184
+vt 0.729167 0.966797
+vt 0.718750 0.980469
+vt 0.713542 0.973958
+vt 0.736979 0.969184
+vt 0.733724 0.975803
+vt 0.744792 0.973958
+vt 0.739583 0.980469
+vt 0.729167 0.982639
+vt 0.723958 0.989583
+vt 0.734375 0.989583
+vt 0.729167 1.000000
+vt 0.770833 0.972512
+vt 0.766276 0.975803
+vt 0.763021 0.969184
+vt 0.770833 0.966797
+vt 0.760417 0.980469
+vt 0.755208 0.973958
+vt 0.778646 0.969184
+vt 0.775391 0.975803
+vt 0.786458 0.973958
+vt 0.781250 0.980469
+vt 0.770833 0.982639
+vt 0.765625 0.989583
+vt 0.776042 0.989583
+vt 0.770833 1.000000
+vt 0.812500 0.972512
+vt 0.807943 0.975803
+vt 0.804688 0.969184
+vt 0.812500 0.966797
+vt 0.802083 0.980469
+vt 0.796875 0.973958
+vt 0.820313 0.969184
+vt 0.817057 0.975803
+vt 0.828125 0.973958
+vt 0.822917 0.980469
+vt 0.812500 0.982639
+vt 0.807292 0.989583
+vt 0.817708 0.989583
+vt 0.812500 1.000000
+vt 0.854167 0.972512
+vt 0.849609 0.975803
+vt 0.846354 0.969184
+vt 0.854167 0.966797
+vt 0.843750 0.980469
+vt 0.838542 0.973958
+vt 0.861979 0.969184
+vt 0.858724 0.975803
+vt 0.869792 0.973958
+vt 0.864583 0.980469
+vt 0.854167 0.982639
+vt 0.848958 0.989583
+vt 0.859375 0.989583
+vt 0.854167 1.000000
+vt 0.895833 0.972512
+vt 0.891276 0.975803
+vt 0.888021 0.969184
+vt 0.895833 0.966797
+vt 0.885417 0.980469
+vt 0.880208 0.973958
+vt 0.903646 0.969184
+vt 0.900391 0.975803
+vt 0.911458 0.973958
+vt 0.906250 0.980469
+vt 0.895833 0.982639
+vt 0.890625 0.989583
+vt 0.901042 0.989583
+vt 0.895833 1.000000
+vt 0.937500 0.972512
+vt 0.932943 0.975803
+vt 0.929688 0.969184
+vt 0.937500 0.966797
+vt 0.927083 0.980469
+vt 0.921875 0.973958
+vt 0.945313 0.969184
+vt 0.942057 0.975803
+vt 0.953125 0.973958
+vt 0.947917 0.980469
+vt 0.937500 0.982639
+vt 0.932292 0.989583
+vt 0.942708 0.989583
+vt 0.937500 1.000000
+vt 0.979095 0.972222
+vt 0.974609 0.975803
+vt 0.971354 0.969184
+vt 0.979004 0.966146
+vt 0.968750 0.980469
+vt 0.963542 0.973958
+vt 0.986328 0.966580
+vt 0.983561 0.975152
+vt 0.993490 0.968750
+vt 0.989258 0.979167
+vt 0.979167 0.982639
+vt 0.973958 0.989583
+vt 0.984375 0.989583
+vt 0.979167 1.000000
+vn -0.172900 0.093200 0.980500
+vn -0.173600 0.012800 0.984700
+vn -0.130500 0.012800 0.991300
+vn -0.130000 0.093200 0.987100
+vn -0.087100 0.012800 0.996100
+vn -0.086800 0.093200 0.991900
+vn -0.173600 0.000000 0.984800
+vn -0.130600 0.000000 0.991400
+vn -0.087100 0.000000 0.996200
+vn -0.118200 0.425000 0.897400
+vn -0.157200 0.425000 0.891400
+vn -0.076100 0.812300 0.578200
+vn -0.101300 0.812300 0.574400
+vn -0.078900 0.425000 0.901700
+vn -0.050800 0.812300 0.581000
+vn -0.195900 0.425000 0.883700
+vn -0.215400 0.093200 0.972000
+vn -0.234300 0.425000 0.874300
+vn -0.257700 0.093200 0.961700
+vn -0.126200 0.812300 0.569400
+vn -0.150900 0.812300 0.563300
+vn -0.216400 0.012800 0.976200
+vn -0.216400 0.000000 0.976300
+vn -0.258800 0.012800 0.965800
+vn -0.258800 0.000000 0.965900
+vn -0.340500 0.093200 0.935600
+vn -0.342000 0.012800 0.939600
+vn -0.300700 0.012800 0.953600
+vn -0.299400 0.093200 0.949500
+vn -0.342000 0.000000 0.939700
+vn -0.300700 0.000000 0.953700
+vn -0.272200 0.425000 0.863300
+vn -0.309600 0.425000 0.850600
+vn -0.175400 0.812300 0.556200
+vn -0.199500 0.812300 0.548100
+vn -0.346400 0.425000 0.836300
+vn -0.381000 0.093200 0.919900
+vn -0.382500 0.425000 0.820400
+vn -0.420800 0.093200 0.902300
+vn -0.223200 0.812300 0.538800
+vn -0.246500 0.812300 0.528600
+vn -0.382600 0.012800 0.923800
+vn -0.382600 0.000000 0.923900
+vn -0.422600 0.012800 0.906200
+vn -0.422600 0.000000 0.906300
+vn -0.497800 0.093200 0.862200
+vn -0.500000 0.012800 0.865900
+vn -0.461700 0.012800 0.886900
+vn -0.459800 0.093200 0.883100
+vn -0.500000 0.000000 0.866000
+vn -0.461800 0.000000 0.887000
+vn -0.418000 0.425000 0.802900
+vn -0.452600 0.425000 0.783900
+vn -0.269300 0.812300 0.517300
+vn -0.291600 0.812300 0.505100
+vn -0.486300 0.425000 0.763400
+vn -0.534900 0.093200 0.839700
+vn -0.519200 0.425000 0.741500
+vn -0.571100 0.093200 0.815600
+vn -0.313300 0.812300 0.491900
+vn -0.334500 0.812300 0.477700
+vn -0.537200 0.012800 0.843300
+vn -0.537200 0.000000 0.843400
+vn -0.573500 0.012800 0.819100
+vn -0.573600 0.000000 0.819100
+vn -0.640000 0.093200 0.762700
+vn -0.642700 0.012800 0.766000
+vn -0.608700 0.012800 0.793200
+vn -0.606100 0.093200 0.789800
+vn -0.642800 0.000000 0.766000
+vn -0.608800 0.000000 0.793300
+vn -0.551000 0.425000 0.718100
+vn -0.581800 0.425000 0.693400
+vn -0.355100 0.812300 0.462700
+vn -0.374900 0.812300 0.446800
+vn -0.611500 0.425000 0.667400
+vn -0.672600 0.093200 0.734100
+vn -0.640000 0.425000 0.640000
+vn -0.704000 0.093200 0.704000
+vn -0.394000 0.812300 0.430000
+vn -0.412400 0.812300 0.412400
+vn -0.675500 0.012800 0.737200
+vn -0.675600 0.000000 0.737300
+vn -0.707000 0.012800 0.707000
+vn -0.707100 0.000000 0.707100
+vn -0.762700 0.093200 0.640000
+vn -0.766000 0.012800 0.642700
+vn -0.737200 0.012800 0.675500
+vn -0.734100 0.093200 0.672600
+vn -0.766000 0.000000 0.642800
+vn -0.737300 0.000000 0.675600
+vn -0.667400 0.425000 0.611500
+vn -0.693400 0.425000 0.581800
+vn -0.430000 0.812300 0.394000
+vn -0.446800 0.812300 0.374900
+vn -0.718100 0.425000 0.551000
+vn -0.789800 0.093200 0.606100
+vn -0.741500 0.425000 0.519200
+vn -0.815600 0.093200 0.571100
+vn -0.462700 0.812300 0.355100
+vn -0.477700 0.812300 0.334500
+vn -0.793200 0.012800 0.608700
+vn -0.793300 0.000000 0.608800
+vn -0.819100 0.012800 0.573500
+vn -0.819100 0.000000 0.573600
+vn -0.862200 0.093200 0.497800
+vn -0.865900 0.012800 0.500000
+vn -0.843300 0.012800 0.537200
+vn -0.839700 0.093200 0.534900
+vn -0.866000 0.000000 0.500000
+vn -0.843400 0.000000 0.537200
+vn -0.763400 0.425000 0.486300
+vn -0.783900 0.425000 0.452600
+vn -0.491900 0.812300 0.313300
+vn -0.505100 0.812300 0.291600
+vn -0.802900 0.425000 0.418000
+vn -0.883100 0.093200 0.459800
+vn -0.820400 0.425000 0.382500
+vn -0.902300 0.093200 0.420800
+vn -0.517300 0.812300 0.269300
+vn -0.528600 0.812300 0.246500
+vn -0.886900 0.012800 0.461700
+vn -0.887000 0.000000 0.461800
+vn -0.906200 0.012800 0.422600
+vn -0.906300 0.000000 0.422600
+vn -0.935600 0.093200 0.340500
+vn -0.939600 0.012800 0.342000
+vn -0.923800 0.012800 0.382600
+vn -0.919900 0.093200 0.381000
+vn -0.939700 0.000000 0.342000
+vn -0.923900 0.000000 0.382600
+vn -0.836300 0.425000 0.346400
+vn -0.850600 0.425000 0.309600
+vn -0.538800 0.812300 0.223200
+vn -0.548000 0.812300 0.199500
+vn -0.863300 0.425000 0.272200
+vn -0.949500 0.093200 0.299400
+vn -0.874300 0.425000 0.234300
+vn -0.961700 0.093200 0.257700
+vn -0.556200 0.812300 0.175400
+vn -0.563300 0.812300 0.150900
+vn -0.953600 0.012800 0.300700
+vn -0.953700 0.000000 0.300700
+vn -0.965800 0.012800 0.258800
+vn -0.965900 0.000000 0.258800
+vn -0.980500 0.093200 0.172900
+vn -0.984700 0.012800 0.173600
+vn -0.976200 0.012800 0.216400
+vn -0.972000 0.093200 0.215400
+vn -0.984800 0.000000 0.173600
+vn -0.976300 0.000000 0.216400
+vn -0.883700 0.425000 0.195900
+vn -0.891400 0.425000 0.157200
+vn -0.569400 0.812300 0.126200
+vn -0.574400 0.812300 0.101300
+vn -0.897400 0.425000 0.118200
+vn -0.987100 0.093200 0.130000
+vn -0.901700 0.425000 0.078900
+vn -0.991900 0.093200 0.086800
+vn -0.578200 0.812300 0.076100
+vn -0.581000 0.812300 0.050800
+vn -0.991300 0.012800 0.130500
+vn -0.991400 0.000000 0.130600
+vn -0.996100 0.012800 0.087100
+vn -0.996200 0.000000 0.087100
+vn -0.995600 0.093200 0.000000
+vn -0.999900 0.012800 0.000000
+vn -0.999000 0.012800 0.043500
+vn -0.994700 0.093200 0.043400
+vn -1.000000 0.000000 0.000000
+vn -0.999000 0.000000 0.043500
+vn -0.904300 0.425000 0.039400
+vn -0.905200 0.425000 0.000000
+vn -0.582700 0.812300 0.025400
+vn -0.583200 0.812300 0.000000
+vn -0.904300 0.425000 -0.039400
+vn -0.994700 0.093200 -0.043400
+vn -0.901700 0.425000 -0.078900
+vn -0.991900 0.093200 -0.086800
+vn -0.582700 0.812300 -0.025400
+vn -0.581000 0.812300 -0.050800
+vn -0.999000 0.012800 -0.043500
+vn -0.999000 0.000000 -0.043500
+vn -0.996100 0.012800 -0.087100
+vn -0.996200 0.000000 -0.087100
+vn -0.980500 0.093200 -0.172900
+vn -0.984700 0.012800 -0.173600
+vn -0.991300 0.012800 -0.130500
+vn -0.987100 0.093200 -0.130000
+vn -0.984800 0.000000 -0.173600
+vn -0.991400 0.000000 -0.130600
+vn -0.897400 0.425000 -0.118200
+vn -0.891400 0.425000 -0.157200
+vn -0.578200 0.812300 -0.076100
+vn -0.574300 0.812300 -0.101300
+vn -0.883700 0.425000 -0.195900
+vn -0.972000 0.093200 -0.215400
+vn -0.874300 0.425000 -0.234300
+vn -0.961700 0.093200 -0.257700
+vn -0.569400 0.812300 -0.126200
+vn -0.563300 0.812300 -0.150900
+vn -0.976200 0.012800 -0.216400
+vn -0.976300 0.000000 -0.216400
+vn -0.965800 0.012800 -0.258800
+vn -0.965900 0.000000 -0.258800
+vn -0.935600 0.093200 -0.340500
+vn -0.939600 0.012800 -0.342000
+vn -0.953600 0.012800 -0.300700
+vn -0.949600 0.093200 -0.299400
+vn -0.939700 0.000000 -0.342000
+vn -0.953700 0.000000 -0.300700
+vn -0.863300 0.425000 -0.272200
+vn -0.850600 0.425000 -0.309600
+vn -0.556200 0.812300 -0.175400
+vn -0.548100 0.812300 -0.199500
+vn -0.836300 0.425000 -0.346400
+vn -0.919900 0.093200 -0.381000
+vn -0.820400 0.425000 -0.382500
+vn -0.902300 0.093200 -0.420800
+vn -0.538800 0.812300 -0.223200
+vn -0.528600 0.812300 -0.246500
+vn -0.923800 0.012800 -0.382600
+vn -0.923900 0.000000 -0.382600
+vn -0.906200 0.012800 -0.422600
+vn -0.906300 0.000000 -0.422600
+vn -0.862500 0.093200 -0.497400
+vn -0.866200 0.012800 -0.499500
+vn -0.887000 0.012800 -0.461600
+vn -0.883200 0.093200 -0.459600
+vn -0.866300 0.000000 -0.499500
+vn -0.887100 0.000000 -0.461600
+vn -0.802900 0.425000 -0.417900
+vn -0.784100 0.425000 -0.452200
+vn -0.517300 0.812300 -0.269200
+vn -0.505200 0.812300 -0.291300
+vn -0.763800 0.425000 -0.485600
+vn -0.840200 0.093200 -0.534200
+vn -0.742000 0.425000 -0.518400
+vn -0.816200 0.093200 -0.570200
+vn -0.492100 0.812300 -0.312900
+vn -0.478100 0.812300 -0.334000
+vn -0.843800 0.012800 -0.536500
+vn -0.843900 0.000000 -0.536500
+vn -0.819700 0.012800 -0.572600
+vn -0.819800 0.000000 -0.572700
+vn -0.701400 0.091700 -0.706800
+vn -0.703400 0.012500 -0.710700
+vn -0.759000 0.012800 -0.650900
+vn -0.755900 0.093000 -0.648000
+vn -0.766000 0.012800 -0.642700
+vn -0.762700 0.093400 -0.640000
+vn -0.703100 0.000000 -0.711100
+vn -0.759000 0.000000 -0.651000
+vn -0.766000 0.000000 -0.642800
+vn -0.686200 0.426600 -0.589100
+vn -0.633000 0.426200 -0.646200
+vn -0.439200 0.814100 -0.380000
+vn -0.393700 0.812900 -0.429100
+vn -0.692800 0.426800 -0.581300
+vn -0.444900 0.814000 -0.373300
+vn -0.227500 0.375500 -0.898400
+vn -0.249700 0.083100 -0.964700
+vn 0.367000 0.241200 -0.898400
+vn 0.375900 0.050900 -0.925200
+vn -0.061100 0.727800 -0.683000
+vn 0.366800 0.464600 -0.806000
+vn -0.246500 0.011200 -0.969100
+vn -0.245100 0.000000 -0.969500
+vn 0.378800 0.006700 -0.925400
+vn 0.379400 0.000000 -0.925200
+vn -0.005900 0.999400 0.033300
+vn -0.038900 0.974500 0.220900
+vn -0.029300 0.974500 0.222400
+vn -0.004400 0.999400 0.033500
+vn -0.019500 0.974500 0.223500
+vn -0.002900 0.999400 0.033700
+vn -0.000500 1.000000 0.004200
+vn -0.000700 1.000000 0.004200
+vn 0.000000 1.000000 0.000000
+vn -0.000400 1.000000 0.004200
+vn -0.000900 1.000000 0.004200
+vn -0.007300 0.999400 0.033000
+vn -0.001100 1.000000 0.004100
+vn -0.008800 0.999400 0.032700
+vn -0.048500 0.974500 0.219000
+vn -0.058000 0.974500 0.216700
+vn -0.011600 0.999400 0.031800
+vn -0.076700 0.974500 0.210800
+vn -0.067400 0.974500 0.213900
+vn -0.010200 0.999400 0.032300
+vn -0.001300 1.000000 0.004100
+vn -0.001500 1.000000 0.004000
+vn -0.001600 1.000000 0.003900
+vn -0.012900 0.999400 0.031300
+vn -0.001800 1.000000 0.003900
+vn -0.014300 0.999400 0.030700
+vn -0.085800 0.974500 0.207200
+vn -0.094800 0.974500 0.203300
+vn -0.016900 0.999400 0.029300
+vn -0.112200 0.974500 0.194300
+vn -0.103600 0.974500 0.199000
+vn -0.015600 0.999400 0.030000
+vn -0.002000 1.000000 0.003800
+vn -0.002100 1.000000 0.003700
+vn -0.002300 1.000000 0.003600
+vn -0.018200 0.999400 0.028500
+vn -0.002400 1.000000 0.003500
+vn -0.019400 0.999400 0.027700
+vn -0.120500 0.974500 0.189200
+vn -0.128700 0.974500 0.183800
+vn -0.021800 0.999400 0.025900
+vn -0.144200 0.974500 0.171800
+vn -0.136500 0.974500 0.178000
+vn -0.020600 0.999400 0.026900
+vn -0.002600 1.000000 0.003400
+vn -0.002700 1.000000 0.003300
+vn -0.002900 1.000000 0.003100
+vn -0.022900 0.999400 0.024900
+vn -0.003000 1.000000 0.003000
+vn -0.023900 0.999400 0.023900
+vn -0.151500 0.974500 0.165400
+vn -0.158600 0.974500 0.158600
+vn -0.025900 0.999400 0.021800
+vn -0.171800 0.974500 0.144200
+vn -0.165400 0.974500 0.151500
+vn -0.024900 0.999400 0.022900
+vn -0.003100 1.000000 0.002900
+vn -0.003300 1.000000 0.002700
+vn -0.003400 1.000000 0.002600
+vn -0.026900 0.999400 0.020600
+vn -0.003500 1.000000 0.002400
+vn -0.027700 0.999400 0.019400
+vn -0.178000 0.974500 0.136500
+vn -0.183800 0.974500 0.128700
+vn -0.029300 0.999400 0.016900
+vn -0.194300 0.974500 0.112200
+vn -0.189200 0.974500 0.120500
+vn -0.028500 0.999400 0.018200
+vn -0.003600 1.000000 0.002300
+vn -0.003700 1.000000 0.002100
+vn -0.003800 1.000000 0.002000
+vn -0.030000 0.999400 0.015600
+vn -0.003900 1.000000 0.001800
+vn -0.030700 0.999400 0.014300
+vn -0.199000 0.974500 0.103600
+vn -0.203300 0.974500 0.094800
+vn -0.031800 0.999400 0.011600
+vn -0.210800 0.974500 0.076700
+vn -0.207300 0.974500 0.085800
+vn -0.031300 0.999400 0.012900
+vn -0.003900 1.000000 0.001600
+vn -0.004000 1.000000 0.001400
+vn -0.004100 1.000000 0.001300
+vn -0.032300 0.999400 0.010200
+vn -0.004100 1.000000 0.001100
+vn -0.032700 0.999400 0.008800
+vn -0.213900 0.974500 0.067400
+vn -0.216700 0.974500 0.058000
+vn -0.033300 0.999400 0.005900
+vn -0.220900 0.974500 0.038900
+vn -0.219000 0.974500 0.048500
+vn -0.033100 0.999400 0.007300
+vn -0.004200 1.000000 0.000900
+vn -0.004200 1.000000 0.000700
+vn -0.004200 1.000000 0.000500
+vn -0.033500 0.999400 0.004400
+vn -0.004200 1.000000 0.000400
+vn -0.033700 0.999400 0.002900
+vn -0.222400 0.974500 0.029300
+vn -0.223500 0.974500 0.019500
+vn -0.033800 0.999400 0.000000
+vn -0.224300 0.974500 0.000000
+vn -0.224100 0.974500 0.009800
+vn -0.033800 0.999400 0.001500
+vn -0.004300 1.000000 0.000200
+vn -0.004300 1.000000 0.000000
+vn -0.004300 1.000000 -0.000200
+vn -0.033800 0.999400 -0.001500
+vn -0.004200 1.000000 -0.000400
+vn -0.033700 0.999400 -0.002900
+vn -0.224100 0.974500 -0.009800
+vn -0.223500 0.974500 -0.019500
+vn -0.033300 0.999400 -0.005900
+vn -0.220900 0.974500 -0.038900
+vn -0.222400 0.974500 -0.029300
+vn -0.033500 0.999400 -0.004400
+vn -0.004200 1.000000 -0.000500
+vn -0.004200 1.000000 -0.000700
+vn -0.004200 1.000000 -0.000900
+vn -0.033100 0.999400 -0.007300
+vn -0.004100 1.000000 -0.001100
+vn -0.032700 0.999400 -0.008800
+vn -0.219000 0.974500 -0.048500
+vn -0.216700 0.974500 -0.058000
+vn -0.031800 0.999400 -0.011600
+vn -0.210800 0.974500 -0.076700
+vn -0.213900 0.974500 -0.067400
+vn -0.032300 0.999400 -0.010200
+vn -0.004100 1.000000 -0.001300
+vn -0.004000 1.000000 -0.001500
+vn -0.003900 1.000000 -0.001600
+vn -0.031300 0.999400 -0.012900
+vn -0.003900 1.000000 -0.001800
+vn -0.030700 0.999400 -0.014300
+vn -0.207300 0.974500 -0.085800
+vn -0.203300 0.974500 -0.094800
+vn -0.029300 0.999400 -0.016900
+vn -0.194300 0.974500 -0.112000
+vn -0.199000 0.974500 -0.103500
+vn -0.030000 0.999400 -0.015600
+vn -0.003800 1.000000 -0.002000
+vn -0.003700 1.000000 -0.002100
+vn -0.003600 1.000000 -0.002300
+vn -0.028600 0.999400 -0.018200
+vn -0.003500 1.000000 -0.002400
+vn -0.027700 0.999400 -0.019400
+vn -0.189300 0.974500 -0.120300
+vn -0.183900 0.974500 -0.128500
+vn 0.018900 0.997700 -0.065400
+vn -0.125600 0.973600 -0.190400
+vn -0.165000 0.975100 -0.148200
+vn -0.020400 0.999400 -0.026600
+vn -0.170000 0.975000 -0.142700
+vn -0.025600 0.999400 -0.021500
+vn 0.002100 0.999900 -0.008100
+vn 0.042500 0.997900 -0.048600
+vn 0.005500 0.999900 -0.005600
+vn 0.047200 0.997700 -0.047600
+vn -0.003200 1.000000 -0.002700
+vn 0.326100 0.884900 -0.332500
+vn 0.301900 0.887900 -0.347100
+vn 0.614700 0.488000 -0.619700
+vn 0.597300 0.494600 -0.631300
+vn 0.335100 0.880200 -0.336000
+vn 0.620800 0.477400 -0.621800
+vn 0.166800 0.870700 -0.462600
+vn 0.504000 0.494900 -0.707800
+vn 0.694000 0.033600 -0.719200
+vn 0.610400 0.037400 -0.791200
+vn 0.591000 0.199500 -0.781500
+vn 0.681100 0.184100 -0.708600
+vn 0.693700 0.179800 -0.697400
+vn 0.705100 0.033400 -0.708300
+vn 0.696000 0.174600 -0.696500
+vn 0.706700 0.032500 -0.706800
+vn 0.705500 0.004500 -0.708700
+vn 0.694300 0.004500 -0.719700
+vn 0.705500 0.000000 -0.708700
+vn 0.694300 0.000000 -0.719700
+vn 0.707100 0.004400 -0.707100
+vn 0.707100 0.000000 -0.707100
+vn 0.612500 0.004900 -0.790400
+vn 0.612800 0.000000 -0.790200
+vn 0.706600 0.025200 -0.707200
+vn 0.706600 0.030200 -0.706900
+vn 0.697400 0.157600 -0.699100
+vn 0.700000 0.120900 -0.703800
+vn 0.633300 0.437000 -0.638700
+vn 0.663200 0.316400 -0.678200
+vn 0.702600 0.072700 -0.707800
+vn 0.706500 0.018500 -0.707400
+vn 0.703800 0.034000 -0.709600
+vn 0.706500 0.011400 -0.707600
+vn 0.687500 0.157800 -0.708800
+vn 0.687200 0.058500 -0.724100
+vn 0.707000 0.002900 -0.707100
+vn 0.707100 0.003700 -0.707100
+vn 0.707000 0.002000 -0.707200
+vn 0.707100 0.004200 -0.707100
+vn 0.055100 0.991600 -0.117200
+vn 0.046500 0.996900 -0.062900
+vn -0.002700 0.999900 -0.014300
+vn -0.025800 0.998800 -0.042100
+vn -0.009300 0.999900 -0.007800
+vn -0.037400 0.998800 -0.031400
+vn -0.071200 0.992400 -0.100000
+vn 0.072800 0.972000 -0.223600
+vn -0.196600 0.952300 -0.233200
+vn 0.054000 0.899900 -0.432600
+vn -0.095100 0.992200 -0.079700
+vn -0.238300 0.950300 -0.200000
+vn 0.488600 0.638000 -0.595200
+vn 0.406400 0.794400 -0.451300
+vn 0.513700 0.431900 -0.741200
+vn 0.354300 0.860100 -0.366900
+vn -0.042100 0.998800 -0.024300
+vn -0.010400 0.999900 -0.006000
+vn -0.010700 0.999900 -0.005500
+vn -0.043100 0.998800 -0.022400
+vn -0.010900 0.999900 -0.005100
+vn -0.044000 0.998800 -0.020500
+vn -0.109600 0.992300 -0.057000
+vn -0.107000 0.992300 -0.061700
+vn -0.274700 0.950800 -0.142900
+vn -0.268300 0.950800 -0.154700
+vn -0.111900 0.992300 -0.052200
+vn -0.280600 0.950800 -0.130900
+vn -0.104200 0.992300 -0.066300
+vn -0.041000 0.998800 -0.026100
+vn -0.101200 0.992300 -0.070700
+vn -0.039800 0.998800 -0.027800
+vn -0.261300 0.950800 -0.166100
+vn -0.253800 0.950800 -0.177300
+vn -0.010100 0.999900 -0.006400
+vn -0.009800 0.999900 -0.006900
+vn -0.045600 0.998800 -0.016600
+vn -0.011300 0.999900 -0.004100
+vn -0.011400 0.999900 -0.003600
+vn -0.046300 0.998800 -0.014600
+vn -0.011600 0.999900 -0.003100
+vn -0.046900 0.998800 -0.012500
+vn -0.117800 0.992300 -0.037100
+vn -0.116100 0.992300 -0.042200
+vn -0.295300 0.950800 -0.093100
+vn -0.291000 0.950800 -0.105900
+vn -0.119300 0.992300 -0.032000
+vn -0.299100 0.950800 -0.080100
+vn -0.114100 0.992300 -0.047200
+vn -0.044900 0.998800 -0.018600
+vn -0.286100 0.950800 -0.118500
+vn -0.011100 0.999900 -0.004600
+vn -0.047800 0.998800 -0.008400
+vn -0.011800 0.999900 -0.002100
+vn -0.011900 0.999900 -0.001600
+vn -0.048200 0.998800 -0.006300
+vn -0.012000 0.999900 -0.001000
+vn -0.048400 0.998800 -0.004200
+vn -0.122400 0.992300 -0.016100
+vn -0.121600 0.992300 -0.021400
+vn -0.307000 0.950800 -0.040400
+vn -0.304900 0.950800 -0.053700
+vn -0.123000 0.992300 -0.010700
+vn -0.308500 0.950800 -0.027000
+vn -0.120600 0.992300 -0.026700
+vn -0.047400 0.998800 -0.010500
+vn -0.302300 0.950800 -0.067000
+vn -0.011700 0.999900 -0.002600
+vn -0.048600 0.998800 0.000000
+vn -0.012000 0.999900 0.000000
+vn -0.012000 0.999900 0.000500
+vn -0.048500 0.998800 0.002100
+vn -0.012000 0.999900 0.001000
+vn -0.048400 0.998800 0.004200
+vn -0.123400 0.992300 0.005400
+vn -0.123500 0.992300 0.000000
+vn -0.309400 0.950800 0.013500
+vn -0.309600 0.950800 0.000000
+vn -0.123000 0.992300 0.010700
+vn -0.308500 0.950800 0.027000
+vn -0.123400 0.992300 -0.005400
+vn -0.048500 0.998800 -0.002100
+vn -0.309400 0.950800 -0.013500
+vn -0.012000 0.999900 -0.000500
+vn -0.047800 0.998800 0.008400
+vn -0.011800 0.999900 0.002100
+vn -0.011700 0.999900 0.002600
+vn -0.047400 0.998800 0.010500
+vn -0.011600 0.999900 0.003100
+vn -0.046900 0.998800 0.012500
+vn -0.120600 0.992300 0.026700
+vn -0.121600 0.992300 0.021400
+vn -0.302300 0.950800 0.067000
+vn -0.304900 0.950800 0.053700
+vn -0.119300 0.992300 0.032000
+vn -0.299100 0.950800 0.080100
+vn -0.122400 0.992300 0.016100
+vn -0.048200 0.998800 0.006300
+vn -0.307000 0.950800 0.040400
+vn -0.011900 0.999900 0.001600
+vn -0.045600 0.998800 0.016600
+vn -0.011300 0.999900 0.004100
+vn -0.011100 0.999900 0.004600
+vn -0.044900 0.998800 0.018600
+vn -0.010900 0.999900 0.005100
+vn -0.044000 0.998800 0.020500
+vn -0.114100 0.992300 0.047200
+vn -0.116100 0.992300 0.042200
+vn -0.286100 0.950800 0.118500
+vn -0.291000 0.950800 0.105900
+vn -0.111900 0.992300 0.052200
+vn -0.280600 0.950800 0.130900
+vn -0.117800 0.992300 0.037100
+vn -0.046300 0.998800 0.014600
+vn -0.295300 0.950800 0.093100
+vn -0.011400 0.999900 0.003600
+vn -0.042100 0.998800 0.024300
+vn -0.010400 0.999900 0.006000
+vn -0.010100 0.999900 0.006400
+vn -0.041000 0.998800 0.026100
+vn -0.009800 0.999900 0.006900
+vn -0.039800 0.998800 0.027900
+vn -0.104200 0.992300 0.066300
+vn -0.107000 0.992300 0.061700
+vn -0.261100 0.950800 0.166400
+vn -0.268200 0.950800 0.154800
+vn -0.101200 0.992300 0.070800
+vn -0.253600 0.950800 0.177600
+vn -0.109500 0.992300 0.057000
+vn -0.043100 0.998800 0.022400
+vn -0.274700 0.950800 0.143000
+vn -0.010700 0.999900 0.005500
+vn -0.037200 0.998800 0.031200
+vn -0.009200 0.999900 0.007700
+vn -0.008900 0.999900 0.008100
+vn -0.035800 0.998800 0.032800
+vn -0.008500 0.999900 0.008500
+vn -0.034300 0.998800 0.034300
+vn -0.091100 0.992300 0.083400
+vn -0.094600 0.992300 0.079400
+vn -0.228300 0.950800 0.209200
+vn -0.237200 0.950800 0.199000
+vn -0.087300 0.992300 0.087300
+vn -0.218900 0.950800 0.218900
+vn -0.098000 0.992300 0.075200
+vn -0.038500 0.998800 0.029600
+vn -0.245600 0.950800 0.188500
+vn -0.009500 0.999900 0.007300
+vn -0.031200 0.998800 0.037200
+vn -0.007700 0.999900 0.009200
+vn -0.007300 0.999900 0.009500
+vn -0.029600 0.998800 0.038500
+vn -0.006900 0.999900 0.009800
+vn -0.027900 0.998800 0.039800
+vn -0.075200 0.992300 0.098000
+vn -0.079400 0.992300 0.094600
+vn -0.188500 0.950800 0.245600
+vn -0.199000 0.950800 0.237200
+vn -0.070800 0.992300 0.101200
+vn -0.177600 0.950800 0.253600
+vn -0.083400 0.992300 0.091100
+vn -0.032800 0.998800 0.035800
+vn -0.209200 0.950800 0.228300
+vn -0.008100 0.999900 0.008900
+vn -0.024300 0.998800 0.042100
+vn -0.006000 0.999900 0.010400
+vn -0.005500 0.999900 0.010700
+vn -0.022400 0.998800 0.043100
+vn -0.005100 0.999900 0.010900
+vn -0.020500 0.998800 0.044000
+vn -0.057000 0.992300 0.109500
+vn -0.061700 0.992300 0.107000
+vn -0.143000 0.950800 0.274700
+vn -0.154800 0.950800 0.268200
+vn -0.052200 0.992300 0.111900
+vn -0.130900 0.950800 0.280600
+vn -0.066300 0.992300 0.104200
+vn -0.026100 0.998800 0.041000
+vn -0.166400 0.950800 0.261100
+vn -0.006400 0.999900 0.010100
+vn -0.016600 0.998800 0.045600
+vn -0.004100 0.999900 0.011300
+vn -0.003600 0.999900 0.011400
+vn -0.014600 0.998800 0.046300
+vn -0.003100 0.999900 0.011600
+vn -0.012500 0.998800 0.046900
+vn -0.037100 0.992300 0.117800
+vn -0.042200 0.992300 0.116100
+vn -0.093100 0.950800 0.295300
+vn -0.105900 0.950800 0.291000
+vn -0.032000 0.992300 0.119300
+vn -0.080100 0.950800 0.299100
+vn -0.047200 0.992300 0.114100
+vn -0.018600 0.998800 0.044900
+vn -0.118500 0.950800 0.286100
+vn -0.004600 0.999900 0.011100
+vn -0.008400 0.998800 0.047800
+vn -0.002100 0.999900 0.011800
+vn -0.001600 0.999900 0.011900
+vn -0.006300 0.998800 0.048200
+vn -0.001000 0.999900 0.012000
+vn -0.004200 0.998800 0.048400
+vn -0.016100 0.992300 0.122400
+vn -0.021400 0.992300 0.121600
+vn -0.040400 0.950800 0.307000
+vn -0.053700 0.950800 0.304900
+vn -0.010700 0.992300 0.123000
+vn -0.027000 0.950800 0.308500
+vn -0.026700 0.992300 0.120600
+vn -0.010500 0.998800 0.047400
+vn -0.067000 0.950800 0.302300
+vn -0.002600 0.999900 0.011700
+vn 0.706500 0.001800 -0.707700
+vn 0.707000 0.000400 -0.707200
+vn 0.707000 0.001100 -0.707200
+vn 0.706300 0.005700 -0.707800
+vn 0.704000 0.012500 -0.710100
+vn 0.705400 0.003000 -0.708800
+vn 0.699100 0.013200 -0.714900
+vn 0.703600 0.002700 -0.710500
+vn 0.706700 0.000400 -0.707500
+vn 0.706900 0.000300 -0.707200
+vn 0.706300 0.000300 -0.707900
+vn 0.296600 0.924000 0.241400
+vn 0.368800 0.877700 0.306000
+vn 0.271000 0.865900 0.420400
+vn 0.138400 0.909800 0.391100
+vn 0.223100 0.835900 0.501500
+vn -0.002000 0.865000 0.501800
+vn 0.413800 0.852700 0.318800
+vn 0.366600 0.848900 0.380700
+vn 0.373300 0.838500 0.396900
+vn 0.153400 0.962600 0.223100
+vn 0.270800 0.954300 0.126200
+vn 0.199800 0.965500 0.166600
+vn 0.266100 0.958100 0.105700
+vn 0.058700 0.967100 0.247600
+vn 0.177300 0.970600 0.162600
+vn 0.532700 0.823400 -0.195300
+vn 0.575200 0.808200 -0.126600
+vn 0.711600 0.458900 -0.532000
+vn 0.726300 0.461100 -0.509800
+vn 0.520800 0.830600 -0.197200
+vn 0.711600 0.453700 -0.536400
+vn 0.612500 0.789500 -0.037500
+vn 0.622200 0.782800 0.010000
+vn 0.746000 0.470300 -0.471500
+vn 0.757600 0.487800 -0.433700
+vn 0.002700 1.000000 0.001500
+vn 0.388900 0.893500 0.224300
+vn 0.398300 0.893500 0.207300
+vn 0.002700 1.000000 0.001400
+vn 0.406900 0.893500 0.189800
+vn 0.002800 1.000000 0.001300
+vn 0.695900 0.595600 0.401300
+vn 0.712500 0.595600 0.370800
+vn 0.728000 0.595600 0.339500
+vn -0.393700 0.896100 -0.204900
+vn -0.384500 0.896100 -0.221700
+vn -0.710500 0.598700 -0.369800
+vn -0.693900 0.598700 -0.400100
+vn -0.402200 0.896100 -0.187600
+vn -0.725900 0.598700 -0.338500
+vn -0.374600 0.896100 -0.238100
+vn 0.002600 1.000000 0.001600
+vn -0.363800 0.896100 -0.254200
+vn 0.002600 1.000000 0.001800
+vn -0.676000 0.598700 -0.429700
+vn -0.656600 0.598700 -0.458700
+vn 0.378900 0.893500 0.240900
+vn 0.677900 0.595600 0.431000
+vn 0.368100 0.893500 0.257100
+vn 0.658500 0.595600 0.460000
+vn 0.002900 1.000000 0.001100
+vn 0.421900 0.893500 0.153600
+vn 0.428200 0.893500 0.135000
+vn 0.003000 1.000000 0.000900
+vn 0.433700 0.893500 0.116200
+vn 0.003000 1.000000 0.000800
+vn 0.754800 0.595600 0.274700
+vn 0.766100 0.595600 0.241600
+vn 0.775900 0.595600 0.207900
+vn -0.423300 0.896100 -0.133500
+vn -0.417100 0.896100 -0.151800
+vn -0.763900 0.598700 -0.240900
+vn -0.752700 0.598700 -0.273900
+vn -0.428700 0.896100 -0.114900
+vn -0.773700 0.598700 -0.207300
+vn -0.410000 0.896100 -0.169800
+vn 0.002900 1.000000 0.001200
+vn -0.740000 0.598700 -0.306500
+vn 0.414800 0.893500 0.171800
+vn 0.742100 0.595600 0.307400
+vn 0.003100 1.000000 0.000500
+vn 0.442200 0.893500 0.077900
+vn 0.445100 0.893500 0.058600
+vn 0.003100 1.000000 0.000400
+vn 0.447300 0.893500 0.039100
+vn 0.003100 1.000000 0.000200
+vn 0.791100 0.595600 0.139500
+vn 0.796400 0.595600 0.104900
+vn 0.800200 0.595600 0.070000
+vn -0.440000 0.896100 -0.057900
+vn -0.437100 0.896100 -0.077100
+vn -0.794100 0.598700 -0.104600
+vn -0.788800 0.598700 -0.139100
+vn -0.442200 0.896100 -0.038700
+vn -0.797900 0.598700 -0.069800
+vn -0.433300 0.896100 -0.096000
+vn 0.003100 1.000000 0.000700
+vn -0.782000 0.598700 -0.173300
+vn 0.438300 0.893500 0.097100
+vn 0.784200 0.595600 0.173800
+vn 0.003100 1.000000 0.000000
+vn 0.449000 0.893500 0.000000
+vn 0.448600 0.893500 -0.019600
+vn 0.003100 1.000000 -0.000100
+vn 0.447300 0.893500 -0.039100
+vn 0.003100 1.000000 -0.000200
+vn 0.803300 0.595600 0.000000
+vn 0.802500 0.595600 -0.035000
+vn 0.800200 0.595600 -0.070000
+vn -0.443400 0.896100 0.019300
+vn -0.443800 0.896100 0.000000
+vn -0.800200 0.598700 0.034900
+vn -0.801000 0.598700 0.000000
+vn -0.442200 0.896100 0.038700
+vn -0.797900 0.598700 0.069800
+vn -0.443400 0.896100 -0.019300
+vn 0.003100 1.000000 0.000100
+vn -0.800200 0.598700 -0.034900
+vn 0.448600 0.893500 0.019600
+vn 0.802500 0.595600 0.035000
+vn 0.003100 1.000000 -0.000500
+vn 0.442200 0.893500 -0.077900
+vn 0.438400 0.893500 -0.097100
+vn 0.003100 1.000000 -0.000700
+vn 0.433700 0.893500 -0.116200
+vn 0.003000 1.000000 -0.000800
+vn 0.791100 0.595600 -0.139500
+vn 0.784200 0.595600 -0.173800
+vn 0.775900 0.595600 -0.207900
+vn -0.433300 0.896100 0.096000
+vn -0.437100 0.896100 0.077100
+vn -0.782000 0.598700 0.173300
+vn -0.788800 0.598700 0.139100
+vn -0.428700 0.896100 0.114900
+vn -0.773700 0.598700 0.207300
+vn -0.440000 0.896100 0.057900
+vn 0.003100 1.000000 -0.000400
+vn -0.794100 0.598700 0.104600
+vn 0.445100 0.893500 -0.058600
+vn 0.796400 0.595600 -0.104900
+vn 0.002900 1.000000 -0.001100
+vn 0.421900 0.893500 -0.153600
+vn 0.414800 0.893500 -0.171800
+vn 0.002900 1.000000 -0.001200
+vn 0.406900 0.893500 -0.189700
+vn 0.002800 1.000000 -0.001300
+vn 0.754800 0.595600 -0.274700
+vn 0.742100 0.595600 -0.307400
+vn 0.728000 0.595600 -0.339500
+vn -0.410000 0.896100 0.169800
+vn -0.417100 0.896100 0.151800
+vn -0.740000 0.598700 0.306500
+vn -0.752700 0.598700 0.273900
+vn -0.402300 0.896100 0.187600
+vn -0.725900 0.598700 0.338500
+vn -0.423300 0.896100 0.133500
+vn 0.003000 1.000000 -0.000900
+vn -0.763900 0.598700 0.240900
+vn 0.428200 0.893500 -0.135000
+vn 0.766100 0.595600 -0.241600
+vn 0.002700 1.000000 -0.001600
+vn 0.388800 0.893500 -0.224500
+vn 0.378700 0.893500 -0.241200
+vn 0.002600 1.000000 -0.001700
+vn 0.367800 0.893500 -0.257500
+vn 0.002600 1.000000 -0.001800
+vn 0.695600 0.595600 -0.401600
+vn 0.677500 0.595600 -0.431600
+vn 0.658000 0.595600 -0.460700
+vn -0.374300 0.896100 0.238400
+vn -0.384400 0.896100 0.221900
+vn -0.675600 0.598700 0.430300
+vn -0.693700 0.598700 0.400500
+vn -0.363600 0.896100 0.254600
+vn -0.656100 0.598700 0.459400
+vn -0.393700 0.896100 0.205000
+vn 0.002800 1.000000 -0.001400
+vn -0.710500 0.598700 0.369900
+vn 0.398300 0.893500 -0.207300
+vn 0.712500 0.595600 -0.370900
+vn 0.002400 1.000000 -0.002000
+vn 0.343900 0.893500 -0.288600
+vn 0.331000 0.893500 -0.303300
+vn 0.002300 1.000000 -0.002100
+vn 0.317500 0.893500 -0.317500
+vn 0.002200 1.000000 -0.002200
+vn 0.615300 0.595600 -0.516300
+vn 0.592200 0.595600 -0.542600
+vn 0.568000 0.595600 -0.568000
+vn -0.327200 0.896100 0.299800
+vn -0.340000 0.896100 0.285300
+vn -0.590600 0.598700 0.541100
+vn -0.613600 0.598700 0.514800
+vn -0.313800 0.896100 0.313800
+vn -0.566400 0.598700 0.566400
+vn -0.352100 0.896100 0.270200
+vn 0.002500 1.000000 -0.001900
+vn -0.635400 0.598700 0.487600
+vn 0.356200 0.893500 -0.273300
+vn 0.637300 0.595600 -0.489000
+vn 0.002000 1.000000 -0.002400
+vn 0.288600 0.893500 -0.343900
+vn 0.273400 0.893500 -0.356200
+vn 0.001900 1.000000 -0.002500
+vn 0.257500 0.893500 -0.367800
+vn 0.001800 1.000000 -0.002600
+vn 0.516300 0.595600 -0.615300
+vn 0.489000 0.595600 -0.637300
+vn 0.460700 0.595600 -0.658000
+vn -0.270200 0.896100 0.352100
+vn -0.285300 0.896100 0.340000
+vn -0.487600 0.598700 0.635400
+vn -0.514800 0.598700 0.613600
+vn -0.254600 0.896100 0.363600
+vn -0.459400 0.598700 0.656100
+vn -0.299800 0.896100 0.327200
+vn 0.002100 1.000000 -0.002300
+vn -0.541100 0.598700 0.590600
+vn 0.303300 0.893500 -0.331000
+vn 0.542600 0.595600 -0.592200
+vn 0.001600 1.000000 -0.002700
+vn 0.224500 0.893500 -0.388800
+vn 0.207300 0.893500 -0.398200
+vn 0.001400 1.000000 -0.002800
+vn 0.189700 0.893500 -0.406900
+vn 0.001300 1.000000 -0.002800
+vn 0.401600 0.595600 -0.695600
+vn 0.370900 0.595600 -0.712500
+vn 0.339500 0.595600 -0.728000
+vn -0.204900 0.896100 0.393700
+vn -0.221900 0.896100 0.384400
+vn -0.369900 0.598700 0.710500
+vn -0.400500 0.598700 0.693700
+vn -0.187600 0.896100 0.402200
+vn -0.338500 0.598700 0.725900
+vn -0.238400 0.896100 0.374300
+vn 0.001700 1.000000 -0.002600
+vn -0.430300 0.598700 0.675600
+vn 0.241200 0.893500 -0.378700
+vn 0.431600 0.595600 -0.677500
+vn 0.001100 1.000000 -0.002900
+vn 0.153600 0.893500 -0.421900
+vn 0.135000 0.893500 -0.428200
+vn 0.000900 1.000000 -0.003000
+vn 0.116200 0.893500 -0.433700
+vn 0.000800 1.000000 -0.003000
+vn 0.274700 0.595600 -0.754800
+vn 0.241600 0.595600 -0.766100
+vn 0.207900 0.595600 -0.775900
+vn -0.133500 0.896100 0.423300
+vn -0.151800 0.896100 0.417100
+vn -0.240900 0.598700 0.763900
+vn -0.273900 0.598700 0.752700
+vn -0.114900 0.896100 0.428700
+vn -0.207300 0.598700 0.773700
+vn -0.169800 0.896100 0.410000
+vn 0.001200 1.000000 -0.002900
+vn -0.306500 0.598700 0.740000
+vn 0.171800 0.893500 -0.414800
+vn 0.307400 0.595600 -0.742100
+vn 0.000500 1.000000 -0.003100
+vn 0.077900 0.893500 -0.442200
+vn 0.058600 0.893500 -0.445100
+vn 0.000400 1.000000 -0.003100
+vn 0.039100 0.893500 -0.447300
+vn 0.000300 1.000000 -0.003100
+vn 0.139500 0.595600 -0.791100
+vn 0.104900 0.595600 -0.796400
+vn 0.070000 0.595600 -0.800200
+vn -0.057900 0.896100 0.440000
+vn -0.077100 0.896100 0.437100
+vn -0.104600 0.598700 0.794100
+vn -0.139100 0.598700 0.788800
+vn -0.038700 0.896100 0.442100
+vn -0.069800 0.598700 0.797900
+vn -0.096000 0.896100 0.433300
+vn 0.000700 1.000000 -0.003100
+vn -0.173300 0.598700 0.782000
+vn 0.097100 0.893500 -0.438400
+vn 0.173800 0.595600 -0.784200
+vn 0.172800 0.098000 -0.980000
+vn 0.155700 0.442700 -0.883000
+vn 0.117100 0.442700 -0.888900
+vn 0.129900 0.098000 -0.986700
+vn 0.078100 0.442800 -0.893200
+vn 0.086700 0.098000 -0.991400
+vn 0.097600 0.827200 -0.553400
+vn 0.073300 0.827200 -0.557100
+vn 0.049000 0.827200 -0.559700
+vn 0.130500 0.013500 -0.991300
+vn 0.173600 0.013500 -0.984700
+vn 0.130600 0.000000 -0.991400
+vn 0.173600 0.000000 -0.984800
+vn 0.087100 0.013500 -0.996100
+vn 0.087100 0.000000 -0.996200
+vn 0.216400 0.013500 -0.976200
+vn 0.215300 0.098000 -0.971600
+vn 0.258800 0.013500 -0.965800
+vn 0.257500 0.098000 -0.961300
+vn 0.216400 0.000000 -0.976300
+vn 0.258800 0.000000 -0.965900
+vn 0.194000 0.442700 -0.875400
+vn 0.121600 0.827200 -0.548600
+vn 0.232100 0.442700 -0.866100
+vn 0.145400 0.827200 -0.542700
+vn 0.340300 0.098000 -0.935100
+vn 0.306600 0.442700 -0.842600
+vn 0.269600 0.442700 -0.855100
+vn 0.299300 0.098000 -0.949100
+vn 0.192200 0.827200 -0.528000
+vn 0.169000 0.827200 -0.535900
+vn 0.300700 0.013500 -0.953600
+vn 0.342000 0.013500 -0.939600
+vn 0.300700 0.000000 -0.953700
+vn 0.342000 0.000000 -0.939700
+vn 0.382600 0.013500 -0.923800
+vn 0.380800 0.098000 -0.919400
+vn 0.422600 0.013500 -0.906200
+vn 0.420600 0.098000 -0.901900
+vn 0.382600 0.000000 -0.923900
+vn 0.422600 0.000000 -0.906300
+vn 0.343100 0.442700 -0.828400
+vn 0.215000 0.827200 -0.519100
+vn 0.378900 0.442800 -0.812600
+vn 0.237500 0.827200 -0.509200
+vn 0.497600 0.098000 -0.861800
+vn 0.448300 0.442700 -0.776500
+vn 0.414000 0.442700 -0.795300
+vn 0.459500 0.098000 -0.882700
+vn 0.281000 0.827200 -0.486600
+vn 0.259500 0.827200 -0.498400
+vn 0.461700 0.013500 -0.886900
+vn 0.499900 0.013500 -0.865900
+vn 0.461800 0.000000 -0.887000
+vn 0.500000 0.000000 -0.866000
+vn 0.537200 0.013500 -0.843300
+vn 0.534700 0.098000 -0.839400
+vn 0.573500 0.013500 -0.819100
+vn 0.570800 0.098000 -0.815200
+vn 0.537200 0.000000 -0.843400
+vn 0.573600 0.000000 -0.819100
+vn 0.481700 0.442700 -0.756200
+vn 0.301900 0.827200 -0.473900
+vn 0.514300 0.442800 -0.734500
+vn 0.322300 0.827200 -0.460300
+vn 0.639700 0.098000 -0.762400
+vn 0.576300 0.442700 -0.686800
+vn 0.545900 0.442700 -0.711300
+vn 0.605900 0.098000 -0.789500
+vn 0.361200 0.827200 -0.430400
+vn 0.342100 0.827200 -0.445800
+vn 0.608700 0.013500 -0.793200
+vn 0.642700 0.013500 -0.766000
+vn 0.608800 0.000000 -0.793300
+vn 0.642800 0.000000 -0.766000
+vn 0.675500 0.013500 -0.737200
+vn 0.672300 0.098000 -0.733700
+vn 0.707000 0.013500 -0.707000
+vn 0.703700 0.098000 -0.703700
+vn 0.675600 0.000000 -0.737300
+vn 0.605700 0.442700 -0.661100
+vn 0.379600 0.827200 -0.414300
+vn 0.634000 0.442700 -0.634000
+vn 0.397300 0.827200 -0.397300
+vn 0.762400 0.098000 -0.639700
+vn 0.686800 0.442700 -0.576300
+vn 0.661100 0.442700 -0.605700
+vn 0.733700 0.098000 -0.672300
+vn 0.430400 0.827200 -0.361200
+vn 0.414300 0.827200 -0.379600
+vn 0.737200 0.013500 -0.675500
+vn 0.766000 0.013500 -0.642700
+vn 0.737300 0.000000 -0.675600
+vn 0.766000 0.000000 -0.642800
+vn 0.793200 0.013500 -0.608700
+vn 0.789500 0.098000 -0.605900
+vn 0.819100 0.013500 -0.573500
+vn 0.815200 0.098000 -0.570800
+vn 0.793300 0.000000 -0.608800
+vn 0.819100 0.000000 -0.573600
+vn 0.711300 0.442700 -0.545900
+vn 0.445800 0.827200 -0.342100
+vn 0.734500 0.442700 -0.514300
+vn 0.460300 0.827200 -0.322300
+vn 0.861800 0.098000 -0.497600
+vn 0.776500 0.442700 -0.448300
+vn 0.756200 0.442700 -0.481700
+vn 0.839400 0.098000 -0.534700
+vn 0.486600 0.827200 -0.281000
+vn 0.473900 0.827200 -0.301900
+vn 0.843300 0.013500 -0.537200
+vn 0.865900 0.013500 -0.499900
+vn 0.843400 0.000000 -0.537200
+vn 0.866000 0.000000 -0.500000
+vn 0.886900 0.013500 -0.461700
+vn 0.882700 0.098000 -0.459500
+vn 0.906200 0.013500 -0.422600
+vn 0.901900 0.098000 -0.420600
+vn 0.887000 0.000000 -0.461800
+vn 0.906300 0.000000 -0.422600
+vn 0.795300 0.442700 -0.414000
+vn 0.498400 0.827200 -0.259500
+vn 0.812600 0.442700 -0.378900
+vn 0.509200 0.827200 -0.237500
+vn 0.935100 0.098000 -0.340400
+vn 0.842600 0.442700 -0.306600
+vn 0.828400 0.442700 -0.343100
+vn 0.919400 0.098000 -0.380800
+vn 0.528000 0.827200 -0.192200
+vn 0.519100 0.827200 -0.215000
+vn 0.923800 0.013500 -0.382600
+vn 0.939600 0.013500 -0.342000
+vn 0.923900 0.000000 -0.382600
+vn 0.939700 0.000000 -0.342000
+vn 0.953600 0.013500 -0.300700
+vn 0.949100 0.098000 -0.299300
+vn 0.965800 0.013500 -0.258800
+vn 0.961300 0.098000 -0.257500
+vn 0.953700 0.000000 -0.300700
+vn 0.965900 0.000000 -0.258800
+vn 0.855100 0.442700 -0.269700
+vn 0.535900 0.827200 -0.169000
+vn 0.866100 0.442800 -0.232100
+vn 0.542700 0.827200 -0.145400
+vn 0.980000 0.098000 -0.172800
+vn 0.883000 0.442700 -0.155700
+vn 0.875400 0.442700 -0.194000
+vn 0.971600 0.098000 -0.215300
+vn 0.553400 0.827200 -0.097600
+vn 0.548600 0.827200 -0.121600
+vn 0.976200 0.013500 -0.216400
+vn 0.984700 0.013500 -0.173600
+vn 0.976300 0.000000 -0.216400
+vn 0.984800 0.000000 -0.173600
+vn 0.991300 0.013500 -0.130500
+vn 0.986700 0.098000 -0.129900
+vn 0.996100 0.013500 -0.087100
+vn 0.991400 0.098000 -0.086700
+vn 0.991400 0.000000 -0.130600
+vn 0.996200 0.000000 -0.087100
+vn 0.888900 0.442700 -0.117100
+vn 0.557100 0.827200 -0.073300
+vn 0.893200 0.442800 -0.078100
+vn 0.559700 0.827200 -0.049000
+vn 0.995200 0.098000 0.000000
+vn 0.896600 0.442700 0.000000
+vn 0.895800 0.442800 -0.039100
+vn 0.994200 0.098000 -0.043400
+vn 0.561900 0.827200 0.000000
+vn 0.561400 0.827200 -0.024500
+vn 0.998900 0.013500 -0.043500
+vn 0.999900 0.013500 0.000000
+vn 0.999000 0.000000 -0.043500
+vn 1.000000 0.000000 0.000000
+vn 0.998900 0.013500 0.043500
+vn 0.994200 0.098000 0.043400
+vn 0.996100 0.013500 0.087100
+vn 0.991400 0.098000 0.086700
+vn 0.999000 0.000000 0.043500
+vn 0.996200 0.000000 0.087100
+vn 0.895800 0.442700 0.039100
+vn 0.561400 0.827200 0.024500
+vn 0.893200 0.442700 0.078100
+vn 0.559700 0.827200 0.049000
+vn 0.980000 0.098000 0.172800
+vn 0.883000 0.442700 0.155700
+vn 0.888900 0.442700 0.117100
+vn 0.986700 0.098000 0.129900
+vn 0.553400 0.827200 0.097600
+vn 0.557100 0.827200 0.073400
+vn 0.991300 0.013500 0.130500
+vn 0.984700 0.013500 0.173600
+vn 0.991400 0.000000 0.130600
+vn 0.984800 0.000000 0.173600
+vn 0.976200 0.013500 0.216400
+vn 0.971600 0.098000 0.215300
+vn 0.965800 0.013500 0.258800
+vn 0.961300 0.098000 0.257500
+vn 0.976300 0.000000 0.216400
+vn 0.965900 0.000000 0.258800
+vn 0.875400 0.442700 0.194000
+vn 0.548600 0.827200 0.121600
+vn 0.866100 0.442700 0.232100
+vn 0.542700 0.827200 0.145400
+vn 0.935100 0.098000 0.340300
+vn 0.842600 0.442700 0.306600
+vn 0.855100 0.442700 0.269600
+vn 0.949100 0.098000 0.299300
+vn 0.528000 0.827200 0.192200
+vn 0.535900 0.827200 0.169000
+vn 0.953600 0.013500 0.300700
+vn 0.939600 0.013500 0.342000
+vn 0.953700 0.000000 0.300700
+vn 0.939700 0.000000 0.342000
+vn 0.923800 0.013500 0.382600
+vn 0.919400 0.098000 0.380800
+vn 0.906200 0.013500 0.422600
+vn 0.901900 0.098000 0.420600
+vn 0.923900 0.000000 0.382600
+vn 0.906300 0.000000 0.422600
+vn 0.828400 0.442800 0.343100
+vn 0.519100 0.827200 0.215000
+vn 0.812600 0.442800 0.378900
+vn 0.509200 0.827200 0.237500
+vn 0.862100 0.098000 0.497100
+vn 0.776800 0.442700 0.447900
+vn 0.795400 0.442700 0.413900
+vn 0.882800 0.098000 0.459400
+vn 0.486800 0.827200 0.280700
+vn 0.498400 0.827200 0.259400
+vn 0.887000 0.013500 0.461600
+vn 0.866200 0.013500 0.499500
+vn 0.887100 0.000000 0.461600
+vn 0.866300 0.000000 0.499500
+vn 0.843800 0.013500 0.536400
+vn 0.839800 0.098000 0.533900
+vn 0.819700 0.013500 0.572600
+vn 0.815800 0.098000 0.569900
+vn 0.843900 0.000000 0.536500
+vn 0.819800 0.000000 0.572700
+vn 0.756600 0.442700 0.481000
+vn 0.474200 0.827200 0.301500
+vn 0.735000 0.442800 0.513500
+vn 0.460600 0.827200 0.321800
+vn 0.864200 0.093100 0.494400
+vn 0.788300 0.427400 0.442500
+vn 0.700900 0.440000 0.561200
+vn 0.776200 0.097400 0.622900
+vn 0.687300 0.441500 0.576700
+vn 0.762400 0.098000 0.639700
+vn 0.530100 0.809000 0.254000
+vn 0.444300 0.824700 0.350000
+vn 0.431800 0.826000 0.362300
+vn 0.780200 0.013400 0.625400
+vn 0.869700 0.012600 0.493300
+vn 0.780400 0.000000 0.625300
+vn 0.870400 0.000000 0.492300
+vn 0.766000 0.013500 0.642700
+vn 0.766000 0.000000 0.642800
+vn 0.997900 0.008900 -0.063500
+vn 0.996300 0.066900 -0.052800
+vn 0.827800 0.003400 -0.560900
+vn 0.828500 0.026400 -0.559400
+vn 0.997800 0.000000 -0.066500
+vn 0.827600 0.000000 -0.561300
+vn 0.944700 0.324500 -0.047100
+vn 0.757300 0.630200 -0.171200
+vn 0.821400 0.132100 -0.554800
+vn 0.786700 0.262600 -0.558700
+vn -0.173600 -0.018300 0.984600
+vn -0.173400 -0.046800 0.983700
+vn -0.130400 -0.046800 0.990300
+vn -0.130500 -0.018300 0.991300
+vn -0.087000 -0.046800 0.995100
+vn -0.087100 -0.018300 0.996000
+vn -0.172300 -0.123800 0.977200
+vn -0.129600 -0.123800 0.983800
+vn -0.086500 -0.123800 0.988500
+vn -0.130600 -0.004500 0.991400
+vn -0.173600 -0.004500 0.984800
+vn -0.087100 -0.004500 0.996200
+vn -0.216400 -0.004500 0.976300
+vn -0.216300 -0.018300 0.976100
+vn -0.258800 -0.004500 0.965900
+vn -0.258800 -0.018300 0.965800
+vn -0.216100 -0.046800 0.975200
+vn -0.214700 -0.123800 0.968800
+vn -0.258500 -0.046800 0.964800
+vn -0.256800 -0.123800 0.958500
+vn -0.342000 -0.018300 0.939500
+vn -0.341600 -0.046800 0.938700
+vn -0.300400 -0.046800 0.952600
+vn -0.300700 -0.018300 0.953500
+vn -0.339400 -0.123800 0.932500
+vn -0.298400 -0.123800 0.946300
+vn -0.300700 -0.004500 0.953700
+vn -0.342000 -0.004500 0.939700
+vn -0.382600 -0.004500 0.923900
+vn -0.382600 -0.018300 0.923700
+vn -0.422600 -0.004500 0.906300
+vn -0.422500 -0.018300 0.906200
+vn -0.382200 -0.046800 0.922900
+vn -0.379700 -0.123800 0.916800
+vn -0.422100 -0.046800 0.905300
+vn -0.419400 -0.123800 0.899300
+vn -0.499900 -0.018300 0.865900
+vn -0.499400 -0.046800 0.865000
+vn -0.461300 -0.046800 0.886000
+vn -0.461700 -0.018300 0.886800
+vn -0.496100 -0.123800 0.859300
+vn -0.458200 -0.123800 0.880200
+vn -0.461800 -0.004500 0.887000
+vn -0.500000 -0.004500 0.866000
+vn -0.537200 -0.004500 0.843400
+vn -0.537200 -0.018300 0.843300
+vn -0.573600 -0.004500 0.819100
+vn -0.573500 -0.018300 0.819000
+vn -0.536700 -0.046800 0.842500
+vn -0.533100 -0.123800 0.836900
+vn -0.572900 -0.046800 0.818200
+vn -0.569100 -0.123800 0.812800
+vn -0.642700 -0.018300 0.765900
+vn -0.642100 -0.046800 0.765200
+vn -0.608100 -0.046800 0.792400
+vn -0.608700 -0.018300 0.793200
+vn -0.637800 -0.123800 0.760100
+vn -0.604100 -0.123800 0.787200
+vn -0.608800 -0.004500 0.793300
+vn -0.642800 -0.004500 0.766000
+vn -0.675500 -0.004500 0.737300
+vn -0.675400 -0.018300 0.737200
+vn -0.707100 -0.004500 0.707100
+vn -0.707000 -0.018300 0.707000
+vn -0.674800 -0.046800 0.736500
+vn -0.670300 -0.123800 0.731600
+vn -0.706300 -0.046800 0.706300
+vn -0.701700 -0.123800 0.701700
+vn -0.765900 -0.018300 0.642700
+vn -0.765200 -0.046800 0.642100
+vn -0.736500 -0.046800 0.674800
+vn -0.737200 -0.018300 0.675400
+vn -0.760100 -0.123800 0.637800
+vn -0.731600 -0.123800 0.670300
+vn -0.737300 -0.004500 0.675500
+vn -0.766000 -0.004500 0.642800
+vn -0.793300 -0.004500 0.608800
+vn -0.793200 -0.018300 0.608700
+vn -0.819100 -0.004500 0.573600
+vn -0.819000 -0.018300 0.573500
+vn -0.792400 -0.046800 0.608100
+vn -0.787200 -0.123800 0.604100
+vn -0.818200 -0.046800 0.572900
+vn -0.812800 -0.123800 0.569100
+vn -0.865900 -0.018300 0.499900
+vn -0.865000 -0.046800 0.499400
+vn -0.842500 -0.046800 0.536700
+vn -0.843300 -0.018300 0.537200
+vn -0.859300 -0.123800 0.496100
+vn -0.836900 -0.123800 0.533100
+vn -0.843400 -0.004500 0.537200
+vn -0.866000 -0.004500 0.500000
+vn -0.887000 -0.004500 0.461800
+vn -0.886800 -0.018300 0.461700
+vn -0.906300 -0.004500 0.422600
+vn -0.906200 -0.018300 0.422500
+vn -0.886000 -0.046800 0.461300
+vn -0.880200 -0.123800 0.458200
+vn -0.905300 -0.046800 0.422100
+vn -0.899300 -0.123800 0.419400
+vn -0.939500 -0.018300 0.342000
+vn -0.938700 -0.046800 0.341600
+vn -0.922900 -0.046800 0.382200
+vn -0.923700 -0.018300 0.382600
+vn -0.932500 -0.123800 0.339400
+vn -0.916800 -0.123800 0.379700
+vn -0.923900 -0.004500 0.382600
+vn -0.939700 -0.004500 0.342000
+vn -0.953700 -0.004500 0.300700
+vn -0.953500 -0.018300 0.300700
+vn -0.965900 -0.004500 0.258800
+vn -0.965800 -0.018300 0.258800
+vn -0.952600 -0.046800 0.300400
+vn -0.946300 -0.123800 0.298400
+vn -0.964800 -0.046800 0.258500
+vn -0.958500 -0.123800 0.256800
+vn -0.984600 -0.018300 0.173600
+vn -0.983700 -0.046800 0.173400
+vn -0.975200 -0.046800 0.216200
+vn -0.976100 -0.018300 0.216300
+vn -0.977200 -0.123800 0.172300
+vn -0.968800 -0.123800 0.214700
+vn -0.976300 -0.004500 0.216400
+vn -0.984800 -0.004500 0.173600
+vn -0.991400 -0.004500 0.130600
+vn -0.991300 -0.018300 0.130500
+vn -0.996200 -0.004500 0.087100
+vn -0.996000 -0.018300 0.087100
+vn -0.990300 -0.046800 0.130400
+vn -0.983800 -0.123800 0.129600
+vn -0.995100 -0.046800 0.087000
+vn -0.988500 -0.123800 0.086500
+vn -0.999800 -0.018300 0.000000
+vn -0.998900 -0.046800 0.000000
+vn -0.997900 -0.046800 0.043500
+vn -0.998900 -0.018300 0.043500
+vn -0.992300 -0.123800 0.000000
+vn -0.991400 -0.123800 0.043200
+vn -0.999000 -0.004500 0.043500
+vn -1.000000 -0.004500 0.000000
+vn -0.999000 -0.004500 -0.043500
+vn -0.998900 -0.018300 -0.043500
+vn -0.996200 -0.004500 -0.087100
+vn -0.996000 -0.018300 -0.087100
+vn -0.997900 -0.046800 -0.043500
+vn -0.991400 -0.123800 -0.043200
+vn -0.995100 -0.046800 -0.087000
+vn -0.988500 -0.123800 -0.086500
+vn -0.984600 -0.018300 -0.173600
+vn -0.983700 -0.046800 -0.173400
+vn -0.990300 -0.046800 -0.130400
+vn -0.991300 -0.018300 -0.130500
+vn -0.977200 -0.123800 -0.172300
+vn -0.983800 -0.123800 -0.129600
+vn -0.991400 -0.004500 -0.130600
+vn -0.984800 -0.004500 -0.173600
+vn -0.976300 -0.004500 -0.216400
+vn -0.976100 -0.018300 -0.216300
+vn -0.965900 -0.004500 -0.258800
+vn -0.965800 -0.018300 -0.258800
+vn -0.975200 -0.046800 -0.216100
+vn -0.968800 -0.123800 -0.214700
+vn -0.964800 -0.046800 -0.258500
+vn -0.958500 -0.123800 -0.256800
+vn -0.939500 -0.018300 -0.342000
+vn -0.938700 -0.046800 -0.341600
+vn -0.952600 -0.046800 -0.300400
+vn -0.953500 -0.018300 -0.300700
+vn -0.932500 -0.123800 -0.339400
+vn -0.946300 -0.123800 -0.298400
+vn -0.953700 -0.004500 -0.300700
+vn -0.939700 -0.004500 -0.342000
+vn -0.923900 -0.004500 -0.382600
+vn -0.923700 -0.018300 -0.382600
+vn -0.906300 -0.004500 -0.422600
+vn -0.906200 -0.018300 -0.422500
+vn -0.922900 -0.046800 -0.382200
+vn -0.916800 -0.123800 -0.379700
+vn -0.905300 -0.046800 -0.422100
+vn -0.899300 -0.123800 -0.419400
+vn -0.866100 -0.018300 -0.499400
+vn -0.865300 -0.046800 -0.499000
+vn -0.886100 -0.046800 -0.461100
+vn -0.886900 -0.018300 -0.461600
+vn -0.859600 -0.123800 -0.495700
+vn -0.880200 -0.123800 -0.458100
+vn -0.887100 -0.004500 -0.461600
+vn -0.866300 -0.004500 -0.499500
+vn -0.843900 -0.004500 -0.536500
+vn -0.843700 -0.018300 -0.536400
+vn -0.819700 -0.004500 -0.572700
+vn -0.819600 -0.018300 -0.572600
+vn -0.843000 -0.046800 -0.535900
+vn -0.837400 -0.123800 -0.532400
+vn -0.818800 -0.046800 -0.572100
+vn -0.813400 -0.123800 -0.568300
+vn -0.703800 -0.017700 -0.710200
+vn -0.697300 -0.047500 -0.715200
+vn -0.758800 -0.045700 -0.649700
+vn -0.759300 -0.017600 -0.650500
+vn -0.765700 -0.045900 -0.641500
+vn -0.766100 -0.017900 -0.642500
+vn -0.653600 -0.128600 -0.745800
+vn -0.751700 -0.122300 -0.648000
+vn -0.761500 -0.121600 -0.636600
+vn -0.759100 -0.004300 -0.650900
+vn -0.703500 -0.004200 -0.710700
+vn -0.766000 -0.004400 -0.642700
+vn -0.245700 -0.003800 -0.969300
+vn -0.242500 -0.016000 -0.970000
+vn 0.379300 -0.002200 -0.925300
+vn 0.380300 -0.008800 -0.924800
+vn -0.217800 -0.038500 -0.975200
+vn -0.131900 -0.079700 -0.988000
+vn 0.383900 -0.018300 -0.923200
+vn 0.394600 -0.031200 -0.918300
+vn 0.694100 -0.005900 -0.719800
+vn 0.694300 -0.001400 -0.719700
+vn 0.705500 -0.001400 -0.708700
+vn 0.705400 -0.005700 -0.708700
+vn 0.707100 -0.001400 -0.707100
+vn 0.707000 -0.005600 -0.707100
+vn 0.705100 -0.014900 -0.708900
+vn 0.692600 -0.015800 -0.721200
+vn 0.703500 -0.039900 -0.709500
+vn 0.684300 -0.043100 -0.727800
+vn 0.706800 -0.014300 -0.707300
+vn 0.706000 -0.038200 -0.707100
+vn 0.601000 -0.017900 -0.799000
+vn 0.610900 -0.007000 -0.791700
+vn 0.553400 -0.042200 -0.831800
+vn 0.612600 -0.001600 -0.790300
+vn 0.707000 -0.005000 -0.707100
+vn 0.707100 -0.001200 -0.707100
+vn 0.707000 -0.004700 -0.707100
+vn 0.707100 -0.001100 -0.707100
+vn 0.707000 -0.004500 -0.707100
+vn 0.706800 -0.012100 -0.707300
+vn 0.706800 -0.012900 -0.707300
+vn 0.706200 -0.032300 -0.707300
+vn 0.706100 -0.034400 -0.707200
+vn 0.706800 -0.011400 -0.707300
+vn 0.706200 -0.030600 -0.707300
+vn 0.706800 -0.013600 -0.707300
+vn 0.707000 -0.005300 -0.707100
+vn 0.706100 -0.036500 -0.707200
+vn 0.707100 -0.001300 -0.707100
+vn 0.707000 -0.004200 -0.707100
+vn 0.706800 -0.010700 -0.707300
+vn 0.706800 -0.011000 -0.707300
+vn 0.707000 -0.004300 -0.707100
+vn 0.706300 -0.028500 -0.707400
+vn 0.706200 -0.029400 -0.707300
+vn 0.707100 -0.001000 -0.707100
+vn 0.707000 -0.004100 -0.707200
+vn 0.707000 -0.003900 -0.707200
+vn 0.706800 -0.010400 -0.707300
+vn 0.706300 -0.027800 -0.707400
+vn 0.706800 -0.010100 -0.707300
+vn 0.706300 -0.027000 -0.707400
+vn 0.869600 -0.017600 0.493400
+vn 0.869900 -0.004100 0.493100
+vn 0.780200 -0.004400 0.625400
+vn 0.779800 -0.017800 0.625800
+vn 0.766000 -0.004400 0.642800
+vn 0.765700 -0.017900 0.642900
+vn 0.779400 -0.046400 0.624800
+vn 0.877200 -0.047300 0.477800
+vn 0.779700 -0.125100 0.613400
+vn 0.910800 -0.121600 0.394500
+vn 0.764700 -0.045800 0.642700
+vn 0.759200 -0.121300 0.639400
+vn 0.996300 -0.026500 -0.081600
+vn 0.997700 -0.011600 -0.066300
+vn 0.825900 -0.009200 -0.563800
+vn 0.827200 -0.004400 -0.561800
+vn 0.988700 -0.054000 -0.139800
+vn 0.822000 -0.015700 -0.569300
+vn 0.997900 -0.002900 -0.065200
+vn 0.827700 -0.001100 -0.561200
+vn 0.866100 -0.018000 0.499400
+vn 0.866300 -0.004500 0.499500
+vn 0.887100 -0.004500 0.461600
+vn 0.886900 -0.018000 0.461600
+vn 0.906300 -0.004500 0.422600
+vn 0.906200 -0.018000 0.422500
+vn 0.886100 -0.046300 0.461100
+vn 0.865400 -0.046300 0.499000
+vn 0.880400 -0.122600 0.458100
+vn 0.859700 -0.122600 0.495800
+vn 0.905300 -0.046300 0.422200
+vn 0.899500 -0.122600 0.419400
+vn 0.843000 -0.046300 0.535900
+vn 0.843700 -0.018000 0.536400
+vn 0.818900 -0.046300 0.572100
+vn 0.819600 -0.018000 0.572600
+vn 0.837500 -0.122600 0.532400
+vn 0.813600 -0.122600 0.568400
+vn 0.843900 -0.004500 0.536500
+vn 0.819700 -0.004500 0.572700
+vn 0.939500 -0.018000 0.342000
+vn 0.939700 -0.004500 0.342000
+vn 0.953700 -0.004500 0.300700
+vn 0.953500 -0.018000 0.300700
+vn 0.965900 -0.004500 0.258800
+vn 0.965800 -0.018000 0.258800
+vn 0.952700 -0.046300 0.300400
+vn 0.938700 -0.046300 0.341600
+vn 0.946500 -0.122600 0.298500
+vn 0.932600 -0.122600 0.339400
+vn 0.964900 -0.046300 0.258500
+vn 0.958600 -0.122600 0.256800
+vn 0.922900 -0.046300 0.382200
+vn 0.923700 -0.018000 0.382600
+vn 0.916900 -0.122600 0.379700
+vn 0.923900 -0.004500 0.382600
+vn 0.984600 -0.018000 0.173600
+vn 0.984800 -0.004500 0.173600
+vn 0.991400 -0.004500 0.130600
+vn 0.991300 -0.018000 0.130500
+vn 0.996200 -0.004500 0.087100
+vn 0.996000 -0.018000 0.087100
+vn 0.990400 -0.046300 0.130400
+vn 0.983700 -0.046300 0.173400
+vn 0.983900 -0.122600 0.129600
+vn 0.977400 -0.122600 0.172300
+vn 0.995100 -0.046300 0.087000
+vn 0.988700 -0.122600 0.086500
+vn 0.975200 -0.046300 0.216200
+vn 0.976100 -0.018000 0.216300
+vn 0.968900 -0.122600 0.214800
+vn 0.976300 -0.004500 0.216400
+vn 0.999800 -0.018000 0.000000
+vn 1.000000 -0.004500 0.000000
+vn 0.999000 -0.004500 -0.043500
+vn 0.998900 -0.018000 -0.043500
+vn 0.996200 -0.004500 -0.087100
+vn 0.996000 -0.018000 -0.087100
+vn 0.998000 -0.046300 -0.043500
+vn 0.998900 -0.046300 0.000000
+vn 0.991500 -0.122600 -0.043200
+vn 0.992400 -0.122600 0.000000
+vn 0.995100 -0.046300 -0.087000
+vn 0.988700 -0.122600 -0.086500
+vn 0.998000 -0.046300 0.043500
+vn 0.998900 -0.018000 0.043500
+vn 0.991500 -0.122600 0.043200
+vn 0.999000 -0.004500 0.043500
+vn 0.984600 -0.018000 -0.173600
+vn 0.984800 -0.004500 -0.173600
+vn 0.976300 -0.004500 -0.216400
+vn 0.976100 -0.018000 -0.216300
+vn 0.965900 -0.004500 -0.258800
+vn 0.965800 -0.018000 -0.258800
+vn 0.975200 -0.046300 -0.216200
+vn 0.983700 -0.046300 -0.173400
+vn 0.968900 -0.122600 -0.214800
+vn 0.977400 -0.122600 -0.172300
+vn 0.964900 -0.046300 -0.258500
+vn 0.958600 -0.122600 -0.256800
+vn 0.990400 -0.046300 -0.130400
+vn 0.991300 -0.018000 -0.130500
+vn 0.983900 -0.122600 -0.129600
+vn 0.991400 -0.004500 -0.130600
+vn 0.939500 -0.018000 -0.342000
+vn 0.939700 -0.004500 -0.342000
+vn 0.923900 -0.004500 -0.382600
+vn 0.923700 -0.018000 -0.382600
+vn 0.906300 -0.004500 -0.422600
+vn 0.906200 -0.018000 -0.422500
+vn 0.922900 -0.046300 -0.382200
+vn 0.938700 -0.046300 -0.341700
+vn 0.916900 -0.122600 -0.379700
+vn 0.932600 -0.122600 -0.339400
+vn 0.905300 -0.046300 -0.422200
+vn 0.899500 -0.122600 -0.419400
+vn 0.952700 -0.046300 -0.300400
+vn 0.953500 -0.018000 -0.300700
+vn 0.946500 -0.122600 -0.298500
+vn 0.953700 -0.004500 -0.300700
+vn 0.865900 -0.018000 -0.499900
+vn 0.866000 -0.004500 -0.500000
+vn 0.843400 -0.004500 -0.537200
+vn 0.843300 -0.018000 -0.537200
+vn 0.819100 -0.004500 -0.573600
+vn 0.819000 -0.018000 -0.573500
+vn 0.842500 -0.046300 -0.536700
+vn 0.865100 -0.046300 -0.499400
+vn 0.837000 -0.122600 -0.533200
+vn 0.859500 -0.122600 -0.496200
+vn 0.818300 -0.046300 -0.573000
+vn 0.813000 -0.122600 -0.569200
+vn 0.886000 -0.046300 -0.461300
+vn 0.886800 -0.018000 -0.461700
+vn 0.880300 -0.122600 -0.458300
+vn 0.887000 -0.004500 -0.461800
+vn 0.765900 -0.018000 -0.642700
+vn 0.766000 -0.004500 -0.642800
+vn 0.737300 -0.004500 -0.675500
+vn 0.737200 -0.018000 -0.675400
+vn 0.707100 -0.004500 -0.707100
+vn 0.707000 -0.018000 -0.707000
+vn 0.736500 -0.046300 -0.674800
+vn 0.765200 -0.046300 -0.642100
+vn 0.731700 -0.122600 -0.670500
+vn 0.760200 -0.122600 -0.637900
+vn 0.706300 -0.046300 -0.706300
+vn 0.701800 -0.122600 -0.701800
+vn 0.792500 -0.046300 -0.608100
+vn 0.793200 -0.018000 -0.608700
+vn 0.787300 -0.122600 -0.604200
+vn 0.793300 -0.004500 -0.608800
+vn 0.642700 -0.018000 -0.765900
+vn 0.642800 -0.004500 -0.766000
+vn 0.608800 -0.004500 -0.793300
+vn 0.608700 -0.018000 -0.793200
+vn 0.573600 -0.004500 -0.819100
+vn 0.573500 -0.018000 -0.819000
+vn 0.608100 -0.046300 -0.792500
+vn 0.642100 -0.046300 -0.765200
+vn 0.604200 -0.122600 -0.787300
+vn 0.637900 -0.122600 -0.760200
+vn 0.573000 -0.046300 -0.818300
+vn 0.569200 -0.122600 -0.813000
+vn 0.674800 -0.046300 -0.736500
+vn 0.675400 -0.018000 -0.737200
+vn 0.670500 -0.122600 -0.731700
+vn 0.675500 -0.004500 -0.737300
+vn 0.499900 -0.018000 -0.865900
+vn 0.500000 -0.004500 -0.866000
+vn 0.461800 -0.004500 -0.887000
+vn 0.461700 -0.018000 -0.886800
+vn 0.422600 -0.004500 -0.906300
+vn 0.422500 -0.018000 -0.906200
+vn 0.461300 -0.046300 -0.886000
+vn 0.499400 -0.046300 -0.865100
+vn 0.458300 -0.122600 -0.880300
+vn 0.496200 -0.122600 -0.859500
+vn 0.422200 -0.046300 -0.905300
+vn 0.419400 -0.122600 -0.899500
+vn 0.536700 -0.046300 -0.842500
+vn 0.537200 -0.018000 -0.843300
+vn 0.533200 -0.122600 -0.837000
+vn 0.537200 -0.004500 -0.843400
+vn 0.342000 -0.018000 -0.939500
+vn 0.342000 -0.004500 -0.939700
+vn 0.300700 -0.004500 -0.953700
+vn 0.300700 -0.018000 -0.953500
+vn 0.258800 -0.004500 -0.965900
+vn 0.258800 -0.018000 -0.965800
+vn 0.300400 -0.046300 -0.952700
+vn 0.341600 -0.046300 -0.938700
+vn 0.298500 -0.122600 -0.946500
+vn 0.339400 -0.122600 -0.932600
+vn 0.258500 -0.046300 -0.964900
+vn 0.256800 -0.122600 -0.958600
+vn 0.382200 -0.046300 -0.922900
+vn 0.382600 -0.018000 -0.923700
+vn 0.379700 -0.122600 -0.916900
+vn 0.382600 -0.004500 -0.923900
+vn 0.173600 -0.018000 -0.984600
+vn 0.173600 -0.004500 -0.984800
+vn 0.130600 -0.004500 -0.991400
+vn 0.130500 -0.018000 -0.991300
+vn 0.087100 -0.004500 -0.996200
+vn 0.087100 -0.018000 -0.996000
+vn 0.130400 -0.046300 -0.990400
+vn 0.173400 -0.046300 -0.983700
+vn 0.129600 -0.122600 -0.983900
+vn 0.172300 -0.122600 -0.977400
+vn 0.087000 -0.046300 -0.995100
+vn 0.086500 -0.122600 -0.988700
+vn 0.216200 -0.046300 -0.975200
+vn 0.216300 -0.018000 -0.976100
+vn 0.214800 -0.122600 -0.968900
+vn 0.216400 -0.004500 -0.976300
+vn 0.715200 -0.003100 -0.698800
+vn 0.716000 -0.008200 -0.698000
+vn 0.708100 -0.008000 -0.706100
+vn 0.708200 -0.003100 -0.706000
+vn 0.706800 -0.008200 -0.707300
+vn 0.707000 -0.003200 -0.707200
+vn 0.720400 -0.022400 -0.693200
+vn 0.708200 -0.021600 -0.705700
+vn 0.706400 -0.022000 -0.707400
+vn 0.708200 -0.000800 -0.706000
+vn 0.715200 -0.000700 -0.698900
+vn 0.708200 0.000000 -0.706000
+vn 0.715300 0.000000 -0.698800
+vn 0.707100 -0.000800 -0.707100
+vn 0.749300 -0.000800 -0.662200
+vn 0.750000 -0.003500 -0.661400
+vn 0.749300 0.000000 -0.662300
+vn 0.753800 -0.008900 -0.657000
+vn 0.771700 -0.020600 -0.635600
+vn 0.716200 0.013700 -0.697700
+vn 0.709000 0.009900 -0.705100
+vn 0.713200 0.030400 -0.700300
+vn 0.722600 0.061400 -0.688500
+vn 0.727200 0.064000 -0.683400
+vn 0.742100 0.149000 -0.653400
+vn 0.707600 0.006200 -0.706500
+vn 0.709500 0.013800 -0.704600
+vn 0.717500 0.018700 -0.696300
+vn 0.753900 0.094000 -0.650200
+vn 0.750500 0.018000 -0.660600
+vn 0.758800 0.236000 -0.607100
+vn 0.749400 0.002400 -0.662100
+vn 0.715300 0.002000 -0.698800
+vn 0.708300 0.001700 -0.705900
+vn 0.707200 0.001300 -0.707000
+vn 0.676200 0.720000 0.156100
+vn 0.906100 0.421700 0.033800
+vn 0.764600 0.409300 0.497800
+vn 0.579000 0.696500 0.423700
+vn 0.706700 0.385700 0.593000
+vn 0.560800 0.681200 0.470600
+vn 0.981800 0.166400 -0.090800
+vn 0.855800 0.183600 0.483600
+vn 0.754700 0.171600 0.633200
+vn 0.371100 0.883500 0.285600
+vn 0.447200 0.879400 0.163000
+vn 0.361700 0.881500 0.303500
+vn 0.706700 0.646700 -0.286800
+vn 0.799000 0.457500 -0.390200
+vn 0.824600 0.197300 -0.530100
+vn 0.804500 0.066900 -0.590200
+vn 0.635600 0.679400 0.366500
+vn 0.799600 0.384700 0.461100
+vn 0.818800 0.384700 0.426100
+vn 0.650800 0.679400 0.338700
+vn 0.836500 0.384700 0.390100
+vn 0.665000 0.679400 0.310100
+vn 0.853500 0.171300 0.492100
+vn 0.873900 0.171300 0.454800
+vn 0.892900 0.171300 0.416400
+vn 0.420300 0.880600 0.218700
+vn 0.410400 0.880600 0.236700
+vn 0.429400 0.880600 0.200200
+vn 0.399900 0.880600 0.254200
+vn 0.619200 0.679500 0.393600
+vn 0.388400 0.880600 0.271300
+vn 0.601500 0.679400 0.420200
+vn 0.778900 0.384700 0.495200
+vn 0.831400 0.171300 0.528600
+vn 0.756700 0.384700 0.528600
+vn 0.807600 0.171300 0.564200
+vn 0.689500 0.679400 0.250900
+vn 0.867400 0.384700 0.315700
+vn 0.880300 0.384700 0.277600
+vn 0.699800 0.679400 0.220600
+vn 0.891600 0.384700 0.238900
+vn 0.708700 0.679400 0.189900
+vn 0.925800 0.171200 0.337000
+vn 0.939600 0.171200 0.296300
+vn 0.951600 0.171200 0.255000
+vn 0.451900 0.880600 0.142500
+vn 0.445200 0.880600 0.162100
+vn 0.457700 0.880600 0.122600
+vn 0.437800 0.880600 0.181300
+vn 0.677900 0.679400 0.280700
+vn 0.852800 0.384700 0.353200
+vn 0.910200 0.171300 0.377000
+vn 0.722600 0.679400 0.127400
+vn 0.909000 0.384700 0.160300
+vn 0.915100 0.384700 0.120500
+vn 0.727400 0.679400 0.095800
+vn 0.919500 0.384700 0.080400
+vn 0.730900 0.679400 0.063900
+vn 0.970200 0.171300 0.171100
+vn 0.976800 0.171300 0.128600
+vn 0.981400 0.171300 0.085800
+vn 0.469800 0.880600 0.061900
+vn 0.466600 0.880600 0.082300
+vn 0.472000 0.880600 0.041300
+vn 0.462600 0.880600 0.102500
+vn 0.716300 0.679400 0.158800
+vn 0.901200 0.384700 0.199700
+vn 0.961900 0.171300 0.213200
+vn 0.733700 0.679400 0.000000
+vn 0.923000 0.384700 0.000000
+vn 0.922100 0.384700 -0.040200
+vn 0.733000 0.679400 -0.032000
+vn 0.919500 0.384700 -0.080400
+vn 0.730900 0.679400 -0.063900
+vn 0.985200 0.171300 0.000000
+vn 0.984300 0.171200 -0.042900
+vn 0.981500 0.171200 -0.085800
+vn 0.473400 0.880600 -0.020600
+vn 0.473800 0.880600 0.000000
+vn 0.472000 0.880600 -0.041300
+vn 0.473400 0.880600 0.020600
+vn 0.733000 0.679400 0.032000
+vn 0.922100 0.384700 0.040200
+vn 0.984300 0.171300 0.042900
+vn 0.722600 0.679400 -0.127400
+vn 0.909000 0.384700 -0.160300
+vn 0.901200 0.384700 -0.199700
+vn 0.716300 0.679400 -0.158800
+vn 0.891600 0.384700 -0.238900
+vn 0.708700 0.679400 -0.189900
+vn 0.970200 0.171200 -0.171100
+vn 0.961900 0.171200 -0.213200
+vn 0.951600 0.171300 -0.255000
+vn 0.462600 0.880600 -0.102500
+vn 0.466600 0.880600 -0.082300
+vn 0.457700 0.880600 -0.122600
+vn 0.469800 0.880600 -0.061900
+vn 0.727400 0.679400 -0.095800
+vn 0.915100 0.384700 -0.120500
+vn 0.976800 0.171200 -0.128600
+vn 0.689500 0.679400 -0.250900
+vn 0.867400 0.384700 -0.315700
+vn 0.852800 0.384700 -0.353200
+vn 0.677900 0.679400 -0.280700
+vn 0.836500 0.384700 -0.390100
+vn 0.665000 0.679400 -0.310100
+vn 0.925800 0.171300 -0.337000
+vn 0.910200 0.171300 -0.377000
+vn 0.892900 0.171300 -0.416400
+vn 0.437800 0.880600 -0.181300
+vn 0.445200 0.880600 -0.162100
+vn 0.429400 0.880600 -0.200200
+vn 0.451900 0.880600 -0.142500
+vn 0.699800 0.679400 -0.220600
+vn 0.880300 0.384700 -0.277600
+vn 0.939600 0.171300 -0.296300
+vn 0.635400 0.679400 -0.366900
+vn 0.799400 0.384700 -0.461500
+vn 0.778500 0.384700 -0.495900
+vn 0.618800 0.679400 -0.394200
+vn 0.756100 0.384700 -0.529400
+vn 0.601000 0.679400 -0.420900
+vn 0.853200 0.171300 -0.492600
+vn 0.830900 0.171300 -0.529300
+vn 0.807000 0.171300 -0.565100
+vn 0.399600 0.880600 -0.254600
+vn 0.410400 0.880600 -0.236900
+vn 0.388100 0.880600 -0.271800
+vn 0.420300 0.880600 -0.218800
+vn 0.650800 0.679400 -0.338800
+vn 0.818700 0.384700 -0.426200
+vn 0.873900 0.171300 -0.454900
+vn 0.562100 0.679400 -0.471600
+vn 0.707100 0.384700 -0.593300
+vn 0.680600 0.384700 -0.623600
+vn 0.541000 0.679400 -0.495700
+vn 0.652700 0.384700 -0.652700
+vn 0.518800 0.679400 -0.518800
+vn 0.754700 0.171200 -0.633300
+vn 0.726400 0.171200 -0.665600
+vn 0.696600 0.171200 -0.696600
+vn 0.349300 0.880600 -0.320100
+vn 0.363000 0.880600 -0.304600
+vn 0.335000 0.880600 -0.335000
+vn 0.375900 0.880600 -0.288500
+vn 0.582100 0.679400 -0.446700
+vn 0.732300 0.384700 -0.561900
+vn 0.781600 0.171200 -0.599800
+vn 0.471600 0.679400 -0.562100
+vn 0.593300 0.384700 -0.707100
+vn 0.561900 0.384700 -0.732300
+vn 0.446700 0.679400 -0.582100
+vn 0.529400 0.384700 -0.756100
+vn 0.420900 0.679400 -0.601000
+vn 0.633300 0.171200 -0.754700
+vn 0.599800 0.171200 -0.781600
+vn 0.565100 0.171200 -0.807000
+vn 0.288500 0.880600 -0.375900
+vn 0.304600 0.880600 -0.363000
+vn 0.271800 0.880600 -0.388100
+vn 0.320100 0.880600 -0.349300
+vn 0.495700 0.679400 -0.541000
+vn 0.623600 0.384700 -0.680600
+vn 0.665500 0.171200 -0.726400
+vn 0.366900 0.679400 -0.635400
+vn 0.461500 0.384700 -0.799400
+vn 0.426200 0.384700 -0.818700
+vn 0.338800 0.679400 -0.650800
+vn 0.390100 0.384700 -0.836500
+vn 0.310100 0.679400 -0.665000
+vn 0.492600 0.171300 -0.853200
+vn 0.454900 0.171300 -0.873900
+vn 0.416400 0.171300 -0.892900
+vn 0.218800 0.880600 -0.420300
+vn 0.236900 0.880600 -0.410400
+vn 0.200200 0.880600 -0.429400
+vn 0.254600 0.880600 -0.399600
+vn 0.394200 0.679400 -0.618800
+vn 0.495900 0.384700 -0.778500
+vn 0.529300 0.171300 -0.830900
+vn 0.250900 0.679400 -0.689500
+vn 0.315700 0.384700 -0.867400
+vn 0.277600 0.384700 -0.880300
+vn 0.220600 0.679400 -0.699800
+vn 0.238900 0.384700 -0.891600
+vn 0.189900 0.679400 -0.708700
+vn 0.337000 0.171300 -0.925800
+vn 0.296300 0.171200 -0.939600
+vn 0.255000 0.171200 -0.951600
+vn 0.142500 0.880600 -0.451900
+vn 0.162100 0.880600 -0.445200
+vn 0.122600 0.880600 -0.457700
+vn 0.181300 0.880600 -0.437800
+vn 0.280700 0.679400 -0.677900
+vn 0.353200 0.384700 -0.852800
+vn 0.377000 0.171200 -0.910200
+vn 0.127400 0.679400 -0.722600
+vn 0.160300 0.384700 -0.909000
+vn 0.120500 0.384700 -0.915100
+vn 0.095800 0.679400 -0.727400
+vn 0.080400 0.384700 -0.919500
+vn 0.063900 0.679400 -0.730900
+vn 0.171100 0.171300 -0.970200
+vn 0.128600 0.171200 -0.976800
+vn 0.085800 0.171200 -0.981500
+vn 0.061900 0.880600 -0.469800
+vn 0.082300 0.880600 -0.466600
+vn 0.041300 0.880600 -0.472000
+vn 0.102500 0.880600 -0.462600
+vn 0.158800 0.679400 -0.716300
+vn 0.199700 0.384700 -0.901200
+vn 0.213200 0.171300 -0.961900
+vn -0.384800 0.096100 -0.918000
+vn -0.151100 0.640600 -0.752800
+vn -0.496300 0.709000 -0.501000
+vn -0.721100 0.096700 -0.686100
+vn -0.543000 0.705400 -0.455500
+vn -0.762800 0.095000 -0.639600
+vn -0.649000 -0.406200 -0.643200
+vn -0.297500 -0.334000 -0.894300
+vn -0.543400 -0.600700 -0.586400
+vn -0.136400 -0.489500 -0.861200
+vn -0.699000 -0.410800 -0.585300
+vn -0.611200 -0.605000 -0.510300
+vn 0.343600 -0.125600 -0.930700
+vn 0.313500 0.046200 -0.948500
+vn 0.611100 -0.009200 -0.791500
+vn 0.623000 0.016900 -0.782000
+vn 0.428300 -0.173900 -0.886700
+vn 0.625500 -0.016400 -0.780000
+vn 0.436800 0.242700 -0.866200
+vn 0.660500 0.038800 -0.749700
+vn 0.694400 0.003300 -0.719500
+vn 0.700400 0.002800 -0.713700
+vn 0.687500 0.012300 -0.726000
+vn 0.670500 0.009000 -0.741800
+vn 0.655800 0.002300 -0.754900
+vn 0.687000 0.002700 -0.726600
+vn 0.653100 -0.001300 -0.757200
+vn 0.681500 0.001300 -0.731700
+vn 0.702900 0.000600 -0.711200
+vn 0.704600 0.000600 -0.709500
+vn 0.701200 0.000500 -0.712900
+vn 0.705800 0.000300 -0.708400
+vn 0.981400 0.019400 -0.191000
+vn 0.986400 0.057000 -0.154300
+vn 0.792900 0.021800 -0.608900
+vn 0.784900 0.007300 -0.619500
+vn 0.717200 0.005500 -0.696900
+vn 0.717100 0.002000 -0.696900
+vn 0.782300 0.001500 -0.622900
+vn 0.978800 0.004100 -0.204800
+vn 0.782100 0.000000 -0.623100
+vn 0.978400 0.000000 -0.206600
+vn 0.717200 0.000400 -0.696900
+vn 0.717200 0.000000 -0.696900
+vn 0.907500 0.005100 0.420000
+vn 0.902800 0.023800 0.429400
+vn 0.766000 0.004800 0.642800
+vn 0.765800 0.022100 0.642600
+vn 0.908300 0.000000 0.418200
+vn 0.889600 0.067900 0.451600
+vn 0.764500 0.063500 0.641500
+vn -0.862200 0.097000 -0.497100
+vn -0.612000 0.707700 -0.352900
+vn -0.626600 0.707800 -0.326100
+vn -0.882900 0.097100 -0.459400
+vn -0.640200 0.707800 -0.298500
+vn -0.902000 0.097100 -0.420600
+vn -0.809500 -0.408900 -0.421200
+vn -0.790600 -0.409100 -0.455500
+vn -0.707900 -0.602800 -0.368200
+vn -0.691500 -0.602900 -0.397900
+vn -0.827100 -0.408900 -0.385700
+vn -0.723200 -0.602700 -0.337200
+vn -0.770300 -0.409400 -0.488900
+vn -0.840100 0.096800 -0.533800
+vn -0.748300 -0.409900 -0.521600
+vn -0.816100 0.096500 -0.569800
+vn -0.673700 -0.603200 -0.426800
+vn -0.654600 -0.603700 -0.455000
+vn -0.596200 0.707700 -0.379000
+vn -0.579200 0.707700 -0.404600
+vn 0.866100 0.022100 0.499400
+vn 0.864500 0.063500 0.498500
+vn 0.842200 0.063500 0.535400
+vn 0.843700 0.022100 0.536400
+vn 0.818100 0.063500 0.571500
+vn 0.819500 0.022100 0.572600
+vn 0.843900 0.004800 0.536500
+vn 0.866300 0.004800 0.499500
+vn 0.819700 0.004800 0.572700
+vn 0.887100 0.004800 0.461600
+vn 0.886800 0.022100 0.461500
+vn 0.906300 0.004800 0.422600
+vn 0.906100 0.022100 0.422500
+vn 0.885300 0.063500 0.460700
+vn 0.904500 0.063500 0.421700
+vn -0.935200 0.097100 -0.340400
+vn -0.663800 0.707800 -0.241600
+vn -0.673700 0.707800 -0.212400
+vn -0.949200 0.097100 -0.299300
+vn -0.682300 0.707800 -0.182800
+vn -0.961300 0.097100 -0.257600
+vn -0.870300 -0.408900 -0.274400
+vn -0.857500 -0.408900 -0.312100
+vn -0.761000 -0.602700 -0.240000
+vn -0.749800 -0.602700 -0.272900
+vn -0.881500 -0.408900 -0.236200
+vn -0.770700 -0.602700 -0.206500
+vn -0.843100 -0.408900 -0.349200
+vn -0.919500 0.097100 -0.380800
+vn -0.737200 -0.602700 -0.305300
+vn -0.652600 0.707800 -0.270300
+vn 0.939500 0.022100 0.341900
+vn 0.937800 0.063500 0.341300
+vn 0.922000 0.063500 0.381800
+vn 0.923600 0.022100 0.382500
+vn 0.923900 0.004800 0.382600
+vn 0.939700 0.004800 0.342000
+vn 0.953700 0.004800 0.300700
+vn 0.953500 0.022100 0.300700
+vn 0.965900 0.004800 0.258800
+vn 0.965700 0.022100 0.258700
+vn 0.951800 0.063500 0.300100
+vn 0.964000 0.063500 0.258300
+vn -0.980100 0.097100 -0.172800
+vn -0.695700 0.707800 -0.122700
+vn -0.700400 0.707800 -0.092200
+vn -0.986700 0.097100 -0.129900
+vn -0.703700 0.707800 -0.061600
+vn -0.991500 0.097100 -0.086700
+vn -0.904800 -0.408900 -0.119100
+vn -0.898700 -0.408900 -0.158500
+vn -0.791100 -0.602700 -0.104200
+vn -0.785800 -0.602700 -0.138600
+vn -0.909100 -0.408900 -0.079500
+vn -0.794900 -0.602700 -0.069500
+vn -0.890900 -0.408900 -0.197500
+vn -0.971700 0.097100 -0.215400
+vn -0.779000 -0.602700 -0.172600
+vn -0.689700 0.707800 -0.152900
+vn 0.984600 0.022100 0.173600
+vn 0.982800 0.063500 0.173300
+vn 0.974300 0.063500 0.215900
+vn 0.976000 0.022100 0.216300
+vn 0.976300 0.004800 0.216400
+vn 0.984800 0.004800 0.173600
+vn 0.991400 0.004800 0.130600
+vn 0.991200 0.022100 0.130500
+vn 0.996200 0.004800 0.087100
+vn 0.995900 0.022100 0.087100
+vn 0.989400 0.063500 0.130300
+vn 0.994200 0.063500 0.087000
+vn -0.995200 0.097100 0.000000
+vn -0.706400 0.707800 0.000000
+vn -0.705700 0.707800 0.030800
+vn -0.994300 0.097100 0.043400
+vn -0.703700 0.707800 0.061600
+vn -0.991500 0.097100 0.086700
+vn -0.911700 -0.408900 0.039800
+vn -0.912600 -0.408900 0.000000
+vn -0.797200 -0.602700 0.034800
+vn -0.797900 -0.602700 0.000000
+vn -0.909100 -0.408900 0.079500
+vn -0.794900 -0.602700 0.069500
+vn -0.911700 -0.408900 -0.039800
+vn -0.994300 0.097100 -0.043400
+vn -0.797200 -0.602700 -0.034800
+vn -0.705700 0.707800 -0.030800
+vn 0.999800 0.022100 0.000000
+vn 0.998000 0.063500 0.000000
+vn 0.997000 0.063500 0.043500
+vn 0.998800 0.022100 0.043500
+vn 0.999000 0.004800 0.043500
+vn 1.000000 0.004800 0.000000
+vn 0.999000 0.004800 -0.043500
+vn 0.998800 0.022100 -0.043500
+vn 0.996200 0.004800 -0.087100
+vn 0.995900 0.022100 -0.087100
+vn 0.997000 0.063500 -0.043500
+vn 0.994200 0.063500 -0.087000
+vn -0.980100 0.097100 0.172800
+vn -0.695700 0.707800 0.122700
+vn -0.689700 0.707800 0.152900
+vn -0.971700 0.097100 0.215400
+vn -0.682300 0.707800 0.182800
+vn -0.961300 0.097100 0.257600
+vn -0.890900 -0.408900 0.197500
+vn -0.898700 -0.408900 0.158500
+vn -0.779000 -0.602700 0.172600
+vn -0.785800 -0.602700 0.138600
+vn -0.881500 -0.408900 0.236200
+vn -0.770700 -0.602700 0.206500
+vn -0.904800 -0.408900 0.119100
+vn -0.986700 0.097100 0.129900
+vn -0.791100 -0.602700 0.104200
+vn -0.700400 0.707800 0.092200
+vn 0.984600 0.022100 -0.173600
+vn 0.982800 0.063500 -0.173300
+vn 0.989400 0.063500 -0.130300
+vn 0.991200 0.022100 -0.130500
+vn 0.991400 0.004800 -0.130600
+vn 0.984800 0.004800 -0.173600
+vn 0.976300 0.004800 -0.216400
+vn 0.976000 0.022100 -0.216300
+vn 0.965900 0.004800 -0.258800
+vn 0.965700 0.022100 -0.258700
+vn 0.974300 0.063500 -0.215900
+vn 0.964000 0.063500 -0.258300
+vn -0.935200 0.097100 0.340400
+vn -0.663800 0.707800 0.241600
+vn -0.652600 0.707800 0.270300
+vn -0.919500 0.097100 0.380800
+vn -0.640200 0.707800 0.298500
+vn -0.902000 0.097100 0.420600
+vn -0.843100 -0.408900 0.349200
+vn -0.857500 -0.408900 0.312100
+vn -0.737200 -0.602700 0.305300
+vn -0.749800 -0.602700 0.272900
+vn -0.827100 -0.408900 0.385700
+vn -0.723200 -0.602700 0.337200
+vn -0.870300 -0.408900 0.274400
+vn -0.949200 0.097100 0.299300
+vn -0.761000 -0.602700 0.240000
+vn -0.673700 0.707800 0.212400
+vn 0.939500 0.022100 -0.341900
+vn 0.937800 0.063500 -0.341300
+vn 0.951800 0.063500 -0.300100
+vn 0.953500 0.022100 -0.300700
+vn 0.953700 0.004800 -0.300700
+vn 0.939700 0.004800 -0.342000
+vn 0.923900 0.004800 -0.382600
+vn 0.923600 0.022100 -0.382500
+vn 0.906300 0.004800 -0.422600
+vn 0.906100 0.022100 -0.422500
+vn 0.922000 0.063500 -0.381800
+vn 0.904500 0.063500 -0.421800
+vn -0.861900 0.097100 0.497600
+vn -0.611800 0.707800 0.353200
+vn -0.595800 0.707800 0.379500
+vn -0.839400 0.097100 0.534700
+vn -0.578600 0.707800 0.405200
+vn -0.815300 0.097100 0.570800
+vn -0.769600 -0.408900 0.490300
+vn -0.790300 -0.408900 0.456300
+vn -0.673000 -0.602700 0.428700
+vn -0.691000 -0.602700 0.398900
+vn -0.747500 -0.408900 0.523400
+vn -0.653600 -0.602700 0.457700
+vn -0.809400 -0.408900 0.421400
+vn -0.882800 0.097100 0.459600
+vn -0.707800 -0.602700 0.368400
+vn -0.626600 0.707800 0.326200
+vn 0.865800 0.022100 -0.499900
+vn 0.864300 0.063500 -0.499000
+vn 0.885200 0.063500 -0.460800
+vn 0.886700 0.022100 -0.461700
+vn 0.887000 0.004800 -0.461800
+vn 0.866000 0.004800 -0.500000
+vn 0.843400 0.004800 -0.537200
+vn 0.843200 0.022100 -0.537100
+vn 0.819100 0.004800 -0.573600
+vn 0.818900 0.022100 -0.573400
+vn 0.841700 0.063500 -0.536200
+vn 0.817500 0.063500 -0.572400
+vn -0.762400 0.097100 0.639700
+vn -0.541100 0.707800 0.454100
+vn -0.520800 0.707800 0.477200
+vn -0.733800 0.097100 0.672400
+vn -0.499500 0.707800 0.499500
+vn -0.703800 0.097100 0.703800
+vn -0.672800 -0.408900 0.616500
+vn -0.699100 -0.408900 0.586600
+vn -0.588300 -0.602700 0.539000
+vn -0.611200 -0.602700 0.512900
+vn -0.645300 -0.408900 0.645300
+vn -0.564200 -0.602700 0.564200
+vn -0.724000 -0.408900 0.555600
+vn -0.789500 0.097100 0.605900
+vn -0.633000 -0.602700 0.485800
+vn -0.560400 0.707800 0.430000
+vn 0.765800 0.022100 -0.642600
+vn 0.764500 0.063500 -0.641500
+vn 0.791700 0.063500 -0.607600
+vn 0.793100 0.022100 -0.608600
+vn 0.793300 0.004800 -0.608800
+vn 0.766000 0.004800 -0.642800
+vn 0.737300 0.004800 -0.675500
+vn 0.737100 0.022100 -0.675400
+vn 0.707100 0.004800 -0.707100
+vn 0.706900 0.022100 -0.706900
+vn 0.735800 0.063500 -0.674200
+vn 0.705600 0.063500 -0.705700
+vn -0.639700 0.097100 0.762400
+vn -0.454100 0.707800 0.541100
+vn -0.430000 0.707800 0.560400
+vn -0.605900 0.097100 0.789500
+vn -0.405200 0.707800 0.578600
+vn -0.570800 0.097100 0.815300
+vn -0.555600 -0.408900 0.724000
+vn -0.586600 -0.408900 0.699100
+vn -0.485800 -0.602700 0.633000
+vn -0.512900 -0.602700 0.611200
+vn -0.523400 -0.408900 0.747500
+vn -0.457700 -0.602700 0.653600
+vn -0.616500 -0.408900 0.672800
+vn -0.672400 0.097100 0.733800
+vn -0.539000 -0.602700 0.588300
+vn -0.477200 0.707800 0.520800
+vn 0.642600 0.022100 -0.765800
+vn 0.641500 0.063500 -0.764500
+vn 0.674200 0.063500 -0.735800
+vn 0.675400 0.022100 -0.737100
+vn 0.675500 0.004800 -0.737300
+vn 0.642800 0.004800 -0.766000
+vn 0.608800 0.004800 -0.793300
+vn 0.608600 0.022100 -0.793100
+vn 0.573600 0.004800 -0.819100
+vn 0.573400 0.022100 -0.818900
+vn 0.607600 0.063500 -0.791700
+vn 0.572400 0.063500 -0.817500
+vn -0.497600 0.097100 0.861900
+vn -0.353200 0.707800 0.611800
+vn -0.326200 0.707800 0.626600
+vn -0.459600 0.097100 0.882800
+vn -0.298500 0.707800 0.640200
+vn -0.420600 0.097100 0.902000
+vn -0.421400 -0.408900 0.809400
+vn -0.456300 -0.408900 0.790300
+vn -0.368400 -0.602700 0.707800
+vn -0.398900 -0.602700 0.691000
+vn -0.385700 -0.408900 0.827100
+vn -0.337200 -0.602700 0.723200
+vn -0.490300 -0.408900 0.769600
+vn -0.534700 0.097100 0.839400
+vn -0.428700 -0.602700 0.673000
+vn -0.379500 0.707800 0.595800
+vn 0.499900 0.022100 -0.865800
+vn 0.499000 0.063500 -0.864300
+vn 0.536200 0.063500 -0.841700
+vn 0.537100 0.022100 -0.843200
+vn 0.537200 0.004800 -0.843400
+vn 0.500000 0.004800 -0.866000
+vn 0.461800 0.004800 -0.887000
+vn 0.461700 0.022100 -0.886700
+vn 0.422600 0.004800 -0.906300
+vn 0.422500 0.022100 -0.906100
+vn 0.460800 0.063500 -0.885200
+vn 0.421700 0.063500 -0.904500
+vn -0.340400 0.097100 0.935200
+vn -0.241600 0.707800 0.663800
+vn -0.212400 0.707800 0.673700
+vn -0.299300 0.097100 0.949200
+vn -0.182800 0.707800 0.682300
+vn -0.257600 0.097100 0.961300
+vn -0.274400 -0.408900 0.870300
+vn -0.312100 -0.408900 0.857500
+vn -0.240000 -0.602700 0.761000
+vn -0.272900 -0.602700 0.749800
+vn -0.236200 -0.408900 0.881500
+vn -0.206500 -0.602700 0.770700
+vn -0.349200 -0.408900 0.843100
+vn -0.380800 0.097100 0.919500
+vn -0.305300 -0.602700 0.737200
+vn -0.270300 0.707800 0.652600
+vn 0.341900 0.022100 -0.939500
+vn 0.341300 0.063500 -0.937800
+vn 0.381800 0.063500 -0.922000
+vn 0.382500 0.022100 -0.923600
+vn 0.382600 0.004800 -0.923900
+vn 0.342000 0.004800 -0.939700
+vn 0.300700 0.004800 -0.953700
+vn 0.300700 0.022100 -0.953500
+vn 0.258800 0.004800 -0.965900
+vn 0.258700 0.022100 -0.965700
+vn 0.300100 0.063500 -0.951800
+vn 0.258300 0.063500 -0.964000
+vn -0.172800 0.097100 0.980100
+vn -0.122700 0.707800 0.695700
+vn -0.092200 0.707800 0.700400
+vn -0.129900 0.097100 0.986700
+vn -0.061600 0.707800 0.703700
+vn -0.086700 0.097100 0.991500
+vn -0.119100 -0.408900 0.904800
+vn -0.158500 -0.408900 0.898700
+vn -0.104200 -0.602700 0.791100
+vn -0.138600 -0.602700 0.785800
+vn -0.079500 -0.408900 0.909100
+vn -0.069500 -0.602700 0.794900
+vn -0.197500 -0.408900 0.890900
+vn -0.215400 0.097100 0.971700
+vn -0.172600 -0.602700 0.779000
+vn -0.152900 0.707800 0.689700
+vn 0.173600 0.022100 -0.984600
+vn 0.173300 0.063500 -0.982800
+vn 0.215900 0.063500 -0.974300
+vn 0.216300 0.022100 -0.976000
+vn 0.216400 0.004800 -0.976300
+vn 0.173600 0.004800 -0.984800
+vn 0.130600 0.004800 -0.991400
+vn 0.130500 0.022100 -0.991200
+vn 0.087100 0.004800 -0.996200
+vn 0.087100 0.022100 -0.995900
+vn 0.130300 0.063500 -0.989400
+vn 0.087000 0.063500 -0.994200
+vn 0.677900 0.000200 -0.735100
+vn 0.655500 -0.000400 -0.755100
+vn 0.655900 -0.000100 -0.754800
+vn 0.677500 0.000000 -0.735400
+vn 0.656100 0.000000 -0.754700
+vn 0.677500 0.000000 -0.735500
+vn 0.645200 -0.001500 -0.764000
+vn 0.646300 -0.000400 -0.763100
+vn 0.646600 0.000000 -0.762800
+vn 0.699100 0.000000 -0.715000
+vn 0.699400 0.000100 -0.714700
+vn 0.700000 0.000200 -0.714100
+vn 0.679000 0.000500 -0.734100
+vn 0.654500 -0.001000 -0.756000
+vn 0.642000 -0.004200 -0.766700
+vn -0.716000 -0.016000 -0.697900
+vn -0.767900 -0.016500 -0.640300
+vn -0.767800 -0.004200 -0.640700
+vn -0.714100 -0.003700 -0.700000
+vn -0.767700 0.000000 -0.640800
+vn -0.713300 0.000000 -0.700800
+vn -0.774400 -0.016700 -0.632400
+vn -0.774500 -0.004300 -0.632500
+vn -0.774500 0.000000 -0.632500
+vn -0.289200 -0.003200 -0.957200
+vn -0.297300 -0.013700 -0.954700
+vn 0.300600 -0.002600 -0.953700
+vn 0.288200 -0.010200 -0.957500
+vn -0.286700 0.000000 -0.958000
+vn 0.306000 0.000000 -0.952000
+vn -0.302200 -0.032000 -0.952700
+vn -0.714900 -0.040400 -0.698000
+vn -0.253900 -0.067400 -0.964900
+vn -0.697900 -0.091200 -0.710400
+vn 0.276000 -0.021700 -0.960900
+vn 0.250000 -0.030800 -0.967700
+vn -0.767400 -0.039600 -0.639900
+vn -0.773900 -0.039500 -0.632000
+vn -0.763800 -0.087200 -0.639500
+vn -0.771600 -0.086200 -0.630200
+vn -0.868200 -0.016500 -0.495900
+vn -0.887400 -0.016500 -0.460600
+vn -0.887600 -0.004200 -0.460600
+vn -0.868300 -0.004200 -0.496000
+vn -0.887600 0.000000 -0.460600
+vn -0.868300 0.000000 -0.496000
+vn -0.906200 -0.016500 -0.422600
+vn -0.906300 -0.004200 -0.422600
+vn -0.848200 -0.004300 -0.529700
+vn -0.848000 -0.016600 -0.529600
+vn -0.826500 -0.004300 -0.562900
+vn -0.826400 -0.016600 -0.562800
+vn -0.848200 0.000000 -0.529700
+vn -0.826500 0.000000 -0.562900
+vn -0.847500 -0.039200 -0.529300
+vn -0.867700 -0.039200 -0.495600
+vn -0.845000 -0.085600 -0.527800
+vn -0.865100 -0.085500 -0.494200
+vn -0.825900 -0.039300 -0.562500
+vn -0.823500 -0.085700 -0.560800
+vn -0.886900 -0.039200 -0.460200
+vn -0.905600 -0.039200 -0.422300
+vn -0.884300 -0.085500 -0.458900
+vn -0.903000 -0.085500 -0.421100
+vn -0.939500 -0.016500 -0.342000
+vn -0.953600 -0.016500 -0.300700
+vn -0.953700 -0.004300 -0.300700
+vn -0.939700 -0.004200 -0.342000
+vn -0.965800 -0.016500 -0.258800
+vn -0.965900 -0.004200 -0.258800
+vn -0.923900 -0.004200 -0.382600
+vn -0.923800 -0.016500 -0.382600
+vn -0.923200 -0.039200 -0.382300
+vn -0.939000 -0.039200 -0.341700
+vn -0.920500 -0.085500 -0.381200
+vn -0.936200 -0.085500 -0.340700
+vn -0.953000 -0.039200 -0.300500
+vn -0.965200 -0.039200 -0.258600
+vn -0.950200 -0.085500 -0.299600
+vn -0.962400 -0.085500 -0.257900
+vn -0.984600 -0.016500 -0.173600
+vn -0.991300 -0.016500 -0.130500
+vn -0.991400 -0.004200 -0.130600
+vn -0.984800 -0.004200 -0.173600
+vn -0.996000 -0.016500 -0.087100
+vn -0.996200 -0.004200 -0.087100
+vn -0.976300 -0.004300 -0.216400
+vn -0.976200 -0.016500 -0.216300
+vn -0.975500 -0.039200 -0.216200
+vn -0.984000 -0.039200 -0.173500
+vn -0.972700 -0.085500 -0.215600
+vn -0.981200 -0.085500 -0.173000
+vn -0.990700 -0.039200 -0.130500
+vn -0.995400 -0.039200 -0.087100
+vn -0.987800 -0.085500 -0.130100
+vn -0.992500 -0.085500 -0.086800
+vn -0.999800 -0.016500 0.000000
+vn -0.998900 -0.016500 0.043500
+vn -0.999000 -0.004200 0.043500
+vn -1.000000 -0.004300 0.000000
+vn -0.996000 -0.016500 0.087100
+vn -0.996200 -0.004200 0.087100
+vn -0.999000 -0.004200 -0.043500
+vn -0.998900 -0.016500 -0.043500
+vn -0.998300 -0.039200 -0.043500
+vn -0.999200 -0.039200 0.000000
+vn -0.995400 -0.085500 -0.043400
+vn -0.996300 -0.085500 0.000000
+vn -0.998300 -0.039200 0.043500
+vn -0.995400 -0.039200 0.087100
+vn -0.995400 -0.085500 0.043400
+vn -0.992500 -0.085500 0.086800
+vn -0.984600 -0.016500 0.173600
+vn -0.976200 -0.016500 0.216300
+vn -0.976300 -0.004200 0.216400
+vn -0.984800 -0.004200 0.173600
+vn -0.965800 -0.016500 0.258800
+vn -0.965900 -0.004200 0.258800
+vn -0.991400 -0.004200 0.130600
+vn -0.991300 -0.016500 0.130500
+vn -0.990700 -0.039200 0.130500
+vn -0.984000 -0.039200 0.173500
+vn -0.987800 -0.085500 0.130100
+vn -0.981200 -0.085500 0.173000
+vn -0.975500 -0.039200 0.216200
+vn -0.965200 -0.039200 0.258600
+vn -0.972700 -0.085500 0.215600
+vn -0.962400 -0.085500 0.257900
+vn -0.939500 -0.016500 0.342000
+vn -0.923800 -0.016500 0.382600
+vn -0.923900 -0.004200 0.382600
+vn -0.939700 -0.004300 0.342000
+vn -0.906200 -0.016500 0.422600
+vn -0.906300 -0.004200 0.422600
+vn -0.953700 -0.004200 0.300700
+vn -0.953600 -0.016500 0.300700
+vn -0.952900 -0.039200 0.300500
+vn -0.939000 -0.039200 0.341700
+vn -0.950200 -0.085500 0.299600
+vn -0.936200 -0.085500 0.340700
+vn -0.923200 -0.039200 0.382300
+vn -0.905600 -0.039200 0.422300
+vn -0.920500 -0.085500 0.381200
+vn -0.903000 -0.085500 0.421100
+vn -0.865900 -0.016500 0.499900
+vn -0.843300 -0.016500 0.537200
+vn -0.843400 -0.004200 0.537200
+vn -0.866000 -0.004200 0.500000
+vn -0.819000 -0.016500 0.573500
+vn -0.819100 -0.004200 0.573600
+vn -0.887000 -0.004200 0.461800
+vn -0.886900 -0.016500 0.461700
+vn -0.886300 -0.039200 0.461400
+vn -0.865400 -0.039200 0.499600
+vn -0.883700 -0.085500 0.460100
+vn -0.862800 -0.085500 0.498200
+vn -0.842700 -0.039200 0.536800
+vn -0.818500 -0.039200 0.573100
+vn -0.840300 -0.085500 0.535300
+vn -0.816100 -0.085500 0.571500
+vn -0.765900 -0.016500 0.642700
+vn -0.737200 -0.016500 0.675500
+vn -0.737300 -0.004200 0.675500
+vn -0.766000 -0.004200 0.642800
+vn -0.707000 -0.016500 0.707000
+vn -0.707100 -0.004200 0.707100
+vn -0.793300 -0.004200 0.608800
+vn -0.793200 -0.016500 0.608700
+vn -0.792700 -0.039200 0.608300
+vn -0.765400 -0.039200 0.642300
+vn -0.790400 -0.085500 0.606600
+vn -0.763200 -0.085500 0.640400
+vn -0.736700 -0.039200 0.675000
+vn -0.706500 -0.039200 0.706500
+vn -0.734600 -0.085500 0.673100
+vn -0.704500 -0.085500 0.704500
+vn -0.642700 -0.016500 0.765900
+vn -0.608700 -0.016500 0.793200
+vn -0.608800 -0.004200 0.793300
+vn -0.642800 -0.004200 0.766000
+vn -0.573500 -0.016500 0.819000
+vn -0.573600 -0.004200 0.819100
+vn -0.675500 -0.004200 0.737300
+vn -0.675500 -0.016500 0.737200
+vn -0.675000 -0.039200 0.736700
+vn -0.642300 -0.039200 0.765400
+vn -0.673100 -0.085500 0.734600
+vn -0.640400 -0.085500 0.763200
+vn -0.608300 -0.039200 0.792700
+vn -0.573100 -0.039200 0.818500
+vn -0.606600 -0.085500 0.790400
+vn -0.571500 -0.085500 0.816100
+vn -0.499900 -0.016500 0.865900
+vn -0.461700 -0.016500 0.886900
+vn -0.461800 -0.004200 0.887000
+vn -0.500000 -0.004200 0.866000
+vn -0.422600 -0.016500 0.906200
+vn -0.422600 -0.004200 0.906300
+vn -0.537200 -0.004200 0.843400
+vn -0.537200 -0.016500 0.843300
+vn -0.536900 -0.039200 0.842700
+vn -0.499600 -0.039200 0.865400
+vn -0.535300 -0.085500 0.840300
+vn -0.498200 -0.085500 0.862800
+vn -0.461400 -0.039200 0.886300
+vn -0.422300 -0.039200 0.905600
+vn -0.460100 -0.085500 0.883700
+vn -0.421100 -0.085500 0.903000
+vn -0.342000 -0.016500 0.939500
+vn -0.300700 -0.016500 0.953600
+vn -0.300700 -0.004200 0.953700
+vn -0.342000 -0.004200 0.939700
+vn -0.258800 -0.016500 0.965800
+vn -0.258800 -0.004200 0.965900
+vn -0.382600 -0.004200 0.923900
+vn -0.382600 -0.016500 0.923800
+vn -0.382300 -0.039200 0.923200
+vn -0.341700 -0.039200 0.939000
+vn -0.381200 -0.085500 0.920500
+vn -0.340700 -0.085500 0.936200
+vn -0.300500 -0.039200 0.953000
+vn -0.258600 -0.039200 0.965200
+vn -0.299600 -0.085500 0.950200
+vn -0.257900 -0.085500 0.962400
+vn -0.173600 -0.016500 0.984600
+vn -0.130500 -0.016500 0.991300
+vn -0.130600 -0.004200 0.991400
+vn -0.173600 -0.004200 0.984800
+vn -0.087100 -0.016500 0.996000
+vn -0.087100 -0.004200 0.996200
+vn -0.216400 -0.004200 0.976300
+vn -0.216300 -0.016500 0.976200
+vn -0.216200 -0.039200 0.975500
+vn -0.173500 -0.039200 0.984000
+vn -0.215600 -0.085500 0.972700
+vn -0.173000 -0.085500 0.981200
+vn -0.130500 -0.039200 0.990700
+vn -0.087100 -0.039200 0.995400
+vn -0.130100 -0.085500 0.987800
+vn -0.086800 -0.085500 0.992500
+vn -0.076400 -0.574100 -0.815200
+vn -0.078400 -0.544400 -0.835100
+vn -0.493600 -0.670600 -0.553700
+vn -0.479000 -0.697700 -0.532700
+vn -0.567400 -0.674900 -0.471700
+vn -0.549200 -0.701300 -0.454400
+vn -0.480600 -0.706900 -0.518900
+vn -0.099800 -0.595100 -0.797400
+vn -0.498200 -0.696000 -0.517000
+vn -0.143900 -0.602300 -0.785200
+vn -0.544100 -0.709300 -0.448100
+vn -0.554400 -0.696900 -0.454900
+vn 0.424800 -0.239700 -0.873000
+vn 0.446200 -0.216000 -0.868400
+vn 0.617200 -0.033800 -0.786100
+vn 0.620700 -0.028700 -0.783500
+vn 0.390100 -0.260600 -0.883100
+vn 0.612300 -0.038300 -0.789700
+vn 0.454600 -0.193800 -0.869400
+vn 0.624000 -0.023000 -0.781100
+vn 0.640600 -0.003900 -0.767800
+vn 0.642200 -0.002700 -0.766500
+vn 0.638000 -0.007400 -0.770000
+vn 0.635700 -0.010200 -0.771800
+vn 0.633900 -0.012500 -0.773300
+vn 0.639600 -0.004900 -0.768600
+vn 0.632000 -0.014300 -0.774800
+vn 0.638800 -0.005600 -0.769300
+vn 0.642100 -0.001300 -0.766600
+vn 0.642700 -0.001000 -0.766100
+vn 0.642900 0.000000 -0.765900
+vn 0.643400 0.000000 -0.765500
+vn 0.641800 -0.001400 -0.766800
+vn 0.643800 -0.000700 -0.765200
+vn 0.644300 0.000000 -0.764800
+vn 0.444800 0.836000 0.321400
+vn 0.433200 0.842800 0.319400
+vn 0.618600 0.784500 0.042200
+vn 0.615300 0.785400 0.067400
+vn 0.761000 0.514300 -0.395400
+vn 0.754700 0.577500 -0.311100
+vn 0.663400 0.748200 0.000000
+vn 0.454800 0.827200 0.330100
+vn 0.664100 0.745300 0.059000
+vn 0.474400 0.807600 0.350100
+vn 0.435300 0.827700 0.354200
+vn 0.421900 0.836100 0.350500
+vn 0.433100 0.827400 0.357600
+vn 0.421000 0.835200 0.353900
+vn 0.457500 0.808200 0.370800
+vn 0.455400 0.808100 0.373600
+vn 0.402500 0.841900 0.359400
+vn 0.406600 0.839100 0.361400
+vn -0.620300 -0.698900 -0.355800
+vn -0.641600 -0.672600 -0.368700
+vn -0.656700 -0.672500 -0.341400
+vn -0.634700 -0.698800 -0.329800
+vn -0.670800 -0.672400 -0.312800
+vn -0.648300 -0.698800 -0.302300
+vn -0.627800 -0.706800 -0.326100
+vn -0.613800 -0.706900 -0.351500
+vn -0.638800 -0.694100 -0.331700
+vn -0.624700 -0.694300 -0.357300
+vn -0.641200 -0.706700 -0.299000
+vn -0.652400 -0.694100 -0.304200
+vn -0.598800 -0.707200 -0.375900
+vn -0.604900 -0.699200 -0.380900
+vn -0.582600 -0.707700 -0.399700
+vn -0.588300 -0.699700 -0.405400
+vn -0.609700 -0.694600 -0.381800
+vn -0.593400 -0.695100 -0.405800
+vn -0.625400 -0.672900 -0.395000
+vn -0.607800 -0.673400 -0.420800
+vn 0.481900 0.831400 0.276400
+vn 0.479500 0.833100 0.275500
+vn 0.467300 0.833300 0.295100
+vn 0.469900 0.831700 0.295800
+vn 0.454100 0.833600 0.314300
+vn 0.456800 0.832000 0.314800
+vn 0.484700 0.829000 0.278900
+vn 0.472200 0.829200 0.299100
+vn 0.458600 0.829500 0.318700
+vn 0.478400 0.825200 0.300300
+vn 0.490400 0.825000 0.280900
+vn 0.501300 0.806300 0.313900
+vn 0.513700 0.806000 0.293900
+vn 0.465300 0.825500 0.319300
+vn 0.487900 0.806600 0.333600
+vn 0.501700 0.824900 0.260500
+vn 0.493100 0.831400 0.256200
+vn 0.512300 0.824900 0.238900
+vn 0.503700 0.831300 0.234900
+vn 0.525400 0.805900 0.272800
+vn 0.536600 0.805900 0.250200
+vn 0.490800 0.833000 0.255200
+vn 0.496300 0.828900 0.258100
+vn 0.501400 0.833000 0.233800
+vn 0.507000 0.828900 0.236400
+vn -0.672200 -0.698800 -0.244600
+vn -0.695500 -0.672400 -0.253100
+vn -0.705900 -0.672400 -0.222600
+vn -0.682200 -0.698800 -0.215100
+vn -0.714900 -0.672400 -0.191500
+vn -0.690900 -0.698800 -0.185100
+vn -0.674700 -0.706700 -0.212700
+vn -0.664800 -0.706700 -0.242000
+vn -0.686500 -0.694100 -0.216500
+vn -0.676400 -0.694100 -0.246200
+vn -0.683300 -0.706700 -0.183100
+vn -0.695300 -0.694100 -0.186300
+vn -0.653600 -0.706700 -0.270700
+vn -0.660900 -0.698800 -0.273700
+vn -0.665100 -0.694100 -0.275400
+vn -0.683800 -0.672400 -0.283200
+vn 0.522200 0.831300 0.190100
+vn 0.519900 0.833000 0.189200
+vn 0.511100 0.833000 0.211700
+vn 0.513500 0.831300 0.212700
+vn 0.525700 0.828900 0.191300
+vn 0.516900 0.828900 0.214100
+vn 0.522300 0.824900 0.216300
+vn 0.531200 0.824900 0.193300
+vn 0.547000 0.805900 0.226500
+vn 0.556400 0.805900 0.202500
+vn 0.539100 0.824900 0.170000
+vn 0.530000 0.831300 0.167100
+vn 0.546100 0.824900 0.146300
+vn 0.536800 0.831300 0.143800
+vn 0.564600 0.805900 0.178000
+vn 0.571900 0.805900 0.153200
+vn 0.527600 0.833000 0.166400
+vn 0.533500 0.828900 0.168200
+vn 0.534400 0.833000 0.143200
+vn 0.540400 0.828900 0.144800
+vn -0.704500 -0.698800 -0.124200
+vn -0.728900 -0.672400 -0.128500
+vn -0.733800 -0.672400 -0.096600
+vn -0.709200 -0.698800 -0.093400
+vn -0.737300 -0.672400 -0.064500
+vn -0.712600 -0.698800 -0.062300
+vn -0.701400 -0.706700 -0.092300
+vn -0.696700 -0.706700 -0.122800
+vn -0.713700 -0.694100 -0.094000
+vn -0.708900 -0.694100 -0.125000
+vn -0.704700 -0.706700 -0.061600
+vn -0.717100 -0.694100 -0.062700
+vn -0.690700 -0.706700 -0.153100
+vn -0.698400 -0.698800 -0.154800
+vn -0.702800 -0.694100 -0.155800
+vn -0.722600 -0.672400 -0.160200
+vn 0.547300 0.831300 0.096500
+vn 0.544800 0.833000 0.096000
+vn 0.540100 0.833000 0.119700
+vn 0.542600 0.831300 0.120200
+vn 0.551000 0.828900 0.097100
+vn 0.546200 0.828900 0.121000
+vn 0.551900 0.824900 0.122300
+vn 0.556700 0.824900 0.098100
+vn 0.578000 0.805900 0.128100
+vn 0.583100 0.805900 0.102800
+vn 0.560500 0.824900 0.073800
+vn 0.551000 0.831300 0.072500
+vn 0.563200 0.824900 0.049300
+vn 0.553600 0.831300 0.048400
+vn 0.587000 0.805900 0.077300
+vn 0.589800 0.805900 0.051600
+vn 0.548500 0.833000 0.072200
+vn 0.554600 0.828900 0.073000
+vn 0.551100 0.833000 0.048200
+vn 0.557300 0.828900 0.048700
+vn -0.715300 -0.698800 0.000000
+vn -0.740100 -0.672400 0.000000
+vn -0.739400 -0.672400 0.032200
+vn -0.714600 -0.698800 0.031200
+vn -0.737300 -0.672400 0.064500
+vn -0.712600 -0.698800 0.062300
+vn -0.706800 -0.706700 0.030800
+vn -0.707400 -0.706700 0.000000
+vn -0.719100 -0.694100 0.031300
+vn -0.719800 -0.694100 0.000000
+vn -0.704700 -0.706700 0.061600
+vn -0.717100 -0.694100 0.062700
+vn -0.706800 -0.706700 -0.030800
+vn -0.714600 -0.698800 -0.031200
+vn -0.719100 -0.694100 -0.031300
+vn -0.739400 -0.672400 -0.032200
+vn 0.555700 0.831300 0.000000
+vn 0.553200 0.833000 0.000000
+vn 0.552700 0.833000 0.024100
+vn 0.555200 0.831300 0.024200
+vn 0.559400 0.828900 0.000000
+vn 0.558900 0.828900 0.024400
+vn 0.564800 0.824900 0.024600
+vn 0.565300 0.824900 0.000000
+vn 0.591500 0.805900 0.025800
+vn 0.592000 0.805900 0.000000
+vn 0.564800 0.824900 -0.024600
+vn 0.555200 0.831300 -0.024200
+vn 0.563200 0.824900 -0.049300
+vn 0.553600 0.831300 -0.048400
+vn 0.591500 0.805900 -0.025800
+vn 0.589800 0.805900 -0.051600
+vn 0.552700 0.833000 -0.024100
+vn 0.558900 0.828900 -0.024400
+vn 0.551100 0.833000 -0.048200
+vn 0.557300 0.828900 -0.048700
+vn -0.704500 -0.698800 0.124200
+vn -0.728900 -0.672400 0.128500
+vn -0.722600 -0.672400 0.160200
+vn -0.698400 -0.698800 0.154800
+vn -0.714900 -0.672400 0.191500
+vn -0.690900 -0.698800 0.185100
+vn -0.690700 -0.706700 0.153100
+vn -0.696700 -0.706700 0.122800
+vn -0.702800 -0.694100 0.155800
+vn -0.708900 -0.694100 0.125000
+vn -0.683300 -0.706700 0.183100
+vn -0.695300 -0.694100 0.186300
+vn -0.701400 -0.706700 0.092300
+vn -0.709200 -0.698800 0.093400
+vn -0.713700 -0.694100 0.094000
+vn -0.733800 -0.672400 0.096600
+vn 0.547300 0.831300 -0.096500
+vn 0.544800 0.833000 -0.096000
+vn 0.548500 0.833000 -0.072200
+vn 0.551000 0.831300 -0.072500
+vn 0.551000 0.828900 -0.097100
+vn 0.554600 0.828900 -0.073000
+vn 0.560500 0.824900 -0.073800
+vn 0.556700 0.824900 -0.098100
+vn 0.587000 0.805900 -0.077300
+vn 0.583100 0.805900 -0.102800
+vn 0.551900 0.824900 -0.122300
+vn 0.542600 0.831300 -0.120200
+vn 0.546100 0.824900 -0.146300
+vn 0.536800 0.831300 -0.143800
+vn 0.578000 0.805900 -0.128100
+vn 0.571900 0.805900 -0.153200
+vn 0.540100 0.833000 -0.119700
+vn 0.546200 0.828900 -0.121000
+vn 0.534400 0.833000 -0.143200
+vn 0.540400 0.828900 -0.144800
+vn -0.672200 -0.698800 0.244600
+vn -0.695500 -0.672400 0.253100
+vn -0.683800 -0.672400 0.283200
+vn -0.660900 -0.698800 0.273700
+vn -0.670800 -0.672400 0.312800
+vn -0.648300 -0.698800 0.302300
+vn -0.653600 -0.706700 0.270700
+vn -0.664800 -0.706700 0.242000
+vn -0.665000 -0.694100 0.275400
+vn -0.676400 -0.694100 0.246200
+vn -0.641200 -0.706700 0.299000
+vn -0.652400 -0.694100 0.304200
+vn -0.674700 -0.706700 0.212700
+vn -0.682200 -0.698800 0.215100
+vn -0.686500 -0.694100 0.216500
+vn -0.705900 -0.672400 0.222600
+vn 0.522200 0.831300 -0.190100
+vn 0.519900 0.833000 -0.189200
+vn 0.527600 0.833000 -0.166400
+vn 0.530000 0.831300 -0.167100
+vn 0.525700 0.828900 -0.191300
+vn 0.533500 0.828900 -0.168200
+vn 0.539100 0.824900 -0.170000
+vn 0.531200 0.824900 -0.193300
+vn 0.564600 0.805900 -0.178000
+vn 0.556400 0.805900 -0.202500
+vn 0.522300 0.824900 -0.216300
+vn 0.513500 0.831300 -0.212700
+vn 0.512300 0.824900 -0.238900
+vn 0.503700 0.831300 -0.234900
+vn 0.547000 0.805900 -0.226500
+vn 0.536600 0.805900 -0.250200
+vn 0.511100 0.833000 -0.211700
+vn 0.516900 0.828900 -0.214100
+vn 0.501400 0.833000 -0.233800
+vn 0.507000 0.828900 -0.236400
+vn -0.619500 -0.698800 0.357600
+vn -0.641000 -0.672400 0.370100
+vn -0.624200 -0.672400 0.397600
+vn -0.603300 -0.698800 0.384300
+vn -0.606300 -0.672400 0.424500
+vn -0.586000 -0.698800 0.410300
+vn -0.596700 -0.706700 0.380100
+vn -0.612700 -0.706700 0.353700
+vn -0.607100 -0.694100 0.386700
+vn -0.623400 -0.694100 0.359900
+vn -0.579500 -0.706700 0.405800
+vn -0.589600 -0.694100 0.412900
+vn -0.627500 -0.706700 0.326700
+vn -0.634500 -0.698800 0.330300
+vn -0.638500 -0.694100 0.332400
+vn -0.656500 -0.672400 0.341800
+vn 0.481300 0.831300 -0.277900
+vn 0.479100 0.833000 -0.276600
+vn 0.490700 0.833000 -0.255500
+vn 0.492900 0.831300 -0.256600
+vn 0.484500 0.828900 -0.279700
+vn 0.496200 0.828900 -0.258300
+vn 0.501400 0.824900 -0.261100
+vn 0.489600 0.824900 -0.282700
+vn 0.525100 0.805900 -0.273400
+vn 0.512700 0.805900 -0.296000
+vn 0.476800 0.824900 -0.303700
+vn 0.468700 0.831300 -0.298600
+vn 0.463100 0.824900 -0.324300
+vn 0.455200 0.831300 -0.318800
+vn 0.499300 0.805900 -0.318100
+vn 0.485000 0.805900 -0.339600
+vn 0.466600 0.833000 -0.297200
+vn 0.471800 0.828900 -0.300500
+vn 0.453200 0.833000 -0.317300
+vn 0.458300 0.828900 -0.320900
+vn -0.548000 -0.698800 0.459800
+vn -0.567000 -0.672400 0.475800
+vn -0.545700 -0.672400 0.500000
+vn -0.527400 -0.698800 0.483200
+vn -0.523300 -0.672400 0.523300
+vn -0.505800 -0.698800 0.505800
+vn -0.521600 -0.706700 0.477900
+vn -0.541900 -0.706700 0.454700
+vn -0.530700 -0.694100 0.486300
+vn -0.551400 -0.694100 0.462700
+vn -0.500200 -0.706700 0.500200
+vn -0.509000 -0.694100 0.509000
+vn -0.561200 -0.706700 0.430700
+vn -0.567500 -0.698800 0.435500
+vn -0.571100 -0.694100 0.438200
+vn -0.587100 -0.672400 0.450600
+vn 0.425700 0.831300 -0.357200
+vn 0.423800 0.833000 -0.355600
+vn 0.438900 0.833000 -0.336800
+vn 0.440900 0.831300 -0.338300
+vn 0.428500 0.828900 -0.359600
+vn 0.443800 0.828900 -0.340600
+vn 0.448500 0.824900 -0.344200
+vn 0.433100 0.824900 -0.363400
+vn 0.469700 0.805900 -0.360400
+vn 0.453500 0.805900 -0.380600
+vn 0.416800 0.824900 -0.381900
+vn 0.409800 0.831300 -0.375400
+vn 0.399700 0.824900 -0.399700
+vn 0.393000 0.831300 -0.393000
+vn 0.436500 0.805900 -0.399900
+vn 0.418600 0.805900 -0.418600
+vn 0.407900 0.833000 -0.373700
+vn 0.412500 0.828900 -0.377900
+vn 0.391200 0.833000 -0.391200
+vn 0.395600 0.828900 -0.395600
+vn -0.459800 -0.698800 0.548000
+vn -0.475800 -0.672400 0.567000
+vn -0.450600 -0.672400 0.587200
+vn -0.435500 -0.698800 0.567500
+vn -0.424500 -0.672400 0.606300
+vn -0.410300 -0.698800 0.586000
+vn -0.430700 -0.706700 0.561200
+vn -0.454700 -0.706700 0.541900
+vn -0.438200 -0.694100 0.571100
+vn -0.462700 -0.694100 0.551400
+vn -0.405800 -0.706700 0.579500
+vn -0.412900 -0.694100 0.589600
+vn -0.477900 -0.706700 0.521600
+vn -0.483200 -0.698800 0.527400
+vn -0.486300 -0.694100 0.530700
+vn -0.500000 -0.672400 0.545700
+vn 0.357200 0.831300 -0.425700
+vn 0.355600 0.833000 -0.423800
+vn 0.373700 0.833000 -0.407900
+vn 0.375400 0.831300 -0.409800
+vn 0.359600 0.828900 -0.428500
+vn 0.377900 0.828900 -0.412500
+vn 0.381900 0.824900 -0.416800
+vn 0.363400 0.824900 -0.433100
+vn 0.399900 0.805900 -0.436500
+vn 0.380600 0.805900 -0.453500
+vn 0.344200 0.824900 -0.448500
+vn 0.338300 0.831300 -0.440900
+vn 0.324300 0.824900 -0.463100
+vn 0.318800 0.831300 -0.455200
+vn 0.360400 0.805900 -0.469700
+vn 0.339600 0.805900 -0.485000
+vn 0.336800 0.833000 -0.438900
+vn 0.340600 0.828900 -0.443800
+vn 0.317300 0.833000 -0.453200
+vn 0.320900 0.828900 -0.458300
+vn -0.357600 -0.698800 0.619500
+vn -0.370100 -0.672400 0.641000
+vn -0.341800 -0.672400 0.656500
+vn -0.330300 -0.698800 0.634500
+vn -0.312800 -0.672400 0.670800
+vn -0.302300 -0.698800 0.648300
+vn -0.326700 -0.706700 0.627500
+vn -0.353700 -0.706700 0.612700
+vn -0.332400 -0.694100 0.638500
+vn -0.359900 -0.694100 0.623400
+vn -0.299000 -0.706700 0.641200
+vn -0.304200 -0.694100 0.652400
+vn -0.380100 -0.706700 0.596700
+vn -0.384300 -0.698800 0.603300
+vn -0.386700 -0.694100 0.607100
+vn -0.397600 -0.672400 0.624200
+vn 0.277900 0.831300 -0.481300
+vn 0.276600 0.833000 -0.479100
+vn 0.297200 0.833000 -0.466600
+vn 0.298600 0.831300 -0.468700
+vn 0.279700 0.828900 -0.484500
+vn 0.300500 0.828900 -0.471800
+vn 0.303700 0.824900 -0.476800
+vn 0.282700 0.824900 -0.489600
+vn 0.318100 0.805900 -0.499300
+vn 0.296000 0.805900 -0.512700
+vn 0.261100 0.824900 -0.501400
+vn 0.256600 0.831300 -0.492900
+vn 0.238900 0.824900 -0.512300
+vn 0.234900 0.831300 -0.503700
+vn 0.273400 0.805900 -0.525100
+vn 0.250200 0.805900 -0.536600
+vn 0.255500 0.833000 -0.490700
+vn 0.258300 0.828900 -0.496200
+vn 0.233800 0.833000 -0.501400
+vn 0.236400 0.828900 -0.507000
+vn -0.244600 -0.698800 0.672200
+vn -0.253100 -0.672400 0.695500
+vn -0.222600 -0.672400 0.705900
+vn -0.215100 -0.698800 0.682200
+vn -0.191500 -0.672400 0.714900
+vn -0.185100 -0.698800 0.690900
+vn -0.212700 -0.706700 0.674700
+vn -0.242000 -0.706700 0.664800
+vn -0.216500 -0.694100 0.686500
+vn -0.246200 -0.694100 0.676400
+vn -0.183100 -0.706700 0.683300
+vn -0.186300 -0.694100 0.695300
+vn -0.270700 -0.706700 0.653600
+vn -0.273700 -0.698800 0.660900
+vn -0.275400 -0.694100 0.665100
+vn -0.283200 -0.672400 0.683800
+vn 0.190100 0.831300 -0.522200
+vn 0.189200 0.833000 -0.519900
+vn 0.211700 0.833000 -0.511100
+vn 0.212700 0.831300 -0.513500
+vn 0.191300 0.828900 -0.525700
+vn 0.214100 0.828900 -0.516900
+vn 0.216300 0.824900 -0.522300
+vn 0.193300 0.824900 -0.531200
+vn 0.226500 0.805900 -0.547000
+vn 0.202500 0.805900 -0.556400
+vn 0.170000 0.824900 -0.539100
+vn 0.167100 0.831300 -0.530000
+vn 0.146300 0.824900 -0.546100
+vn 0.143800 0.831300 -0.536800
+vn 0.178000 0.805900 -0.564600
+vn 0.153200 0.805900 -0.571900
+vn 0.166400 0.833000 -0.527600
+vn 0.168200 0.828900 -0.533500
+vn 0.143200 0.833000 -0.534400
+vn 0.144800 0.828900 -0.540400
+vn -0.124200 -0.698800 0.704500
+vn -0.128500 -0.672400 0.728900
+vn -0.096600 -0.672400 0.733800
+vn -0.093400 -0.698800 0.709200
+vn -0.064500 -0.672400 0.737300
+vn -0.062300 -0.698800 0.712600
+vn -0.092300 -0.706700 0.701400
+vn -0.122800 -0.706700 0.696700
+vn -0.094000 -0.694100 0.713700
+vn -0.125000 -0.694100 0.708900
+vn -0.061600 -0.706700 0.704700
+vn -0.062700 -0.694100 0.717100
+vn -0.153100 -0.706700 0.690700
+vn -0.154800 -0.698800 0.698400
+vn -0.155800 -0.694100 0.702800
+vn -0.160200 -0.672400 0.722600
+vn 0.096500 0.831300 -0.547300
+vn 0.096000 0.833000 -0.544800
+vn 0.119700 0.833000 -0.540100
+vn 0.120200 0.831300 -0.542600
+vn 0.097100 0.828900 -0.551000
+vn 0.121000 0.828900 -0.546200
+vn 0.122300 0.824900 -0.551900
+vn 0.098100 0.824900 -0.556700
+vn 0.128100 0.805900 -0.578000
+vn 0.102800 0.805900 -0.583100
+vn 0.073800 0.824900 -0.560500
+vn 0.072500 0.831300 -0.551000
+vn 0.049300 0.824900 -0.563200
+vn 0.048400 0.831300 -0.553600
+vn 0.077300 0.805900 -0.587000
+vn 0.051600 0.805900 -0.589800
+vn 0.072200 0.833000 -0.548500
+vn 0.073000 0.828900 -0.554600
+vn 0.048200 0.833000 -0.551100
+vn 0.048700 0.828900 -0.557300
+vn 0.126600 0.684700 -0.717800
+vn 0.111700 0.765500 -0.633700
+vn 0.139200 0.765500 -0.628200
+vn 0.157700 0.684700 -0.711600
+vn 0.166500 0.765500 -0.621500
+vn 0.188600 0.684700 -0.704000
+vn 0.185200 0.516700 -0.835800
+vn 0.148700 0.516700 -0.843100
+vn 0.195500 0.428900 -0.882000
+vn 0.156900 0.428800 -0.889600
+vn 0.221600 0.516700 -0.827000
+vn 0.233800 0.428800 -0.872600
+vn 0.111800 0.516700 -0.848800
+vn 0.095200 0.684700 -0.722600
+vn 0.074600 0.516700 -0.852900
+vn 0.063500 0.684700 -0.726100
+vn 0.117900 0.428800 -0.895600
+vn 0.078700 0.428900 -0.899900
+vn 0.084000 0.765500 -0.638000
+vn 0.056100 0.765500 -0.641000
+vn 0.249300 0.684700 -0.684900
+vn 0.220100 0.765500 -0.604700
+vn 0.246200 0.765500 -0.594500
+vn 0.278900 0.684700 -0.673400
+vn 0.271900 0.765500 -0.583200
+vn 0.308000 0.684700 -0.660500
+vn 0.327600 0.516700 -0.790900
+vn 0.292800 0.516700 -0.804500
+vn 0.345700 0.428900 -0.834600
+vn 0.309000 0.428900 -0.848900
+vn 0.361800 0.516700 -0.775900
+vn 0.381800 0.428800 -0.818700
+vn 0.257500 0.516700 -0.816500
+vn 0.219200 0.684700 -0.695100
+vn 0.271700 0.428800 -0.861500
+vn 0.193500 0.765500 -0.613700
+vn 0.364400 0.684700 -0.631200
+vn 0.321700 0.765500 -0.557200
+vn 0.345700 0.765500 -0.542700
+vn 0.391600 0.684700 -0.614700
+vn 0.369100 0.765500 -0.527100
+vn 0.418000 0.684700 -0.597000
+vn 0.459900 0.516700 -0.722100
+vn 0.428100 0.516700 -0.741400
+vn 0.485300 0.428800 -0.761900
+vn 0.451700 0.428800 -0.782300
+vn 0.491000 0.516700 -0.701300
+vn 0.518100 0.428800 -0.740000
+vn 0.395300 0.516700 -0.759400
+vn 0.336600 0.684700 -0.646500
+vn 0.417200 0.428800 -0.801300
+vn 0.297100 0.765500 -0.570700
+vn 0.468500 0.684700 -0.558300
+vn 0.413600 0.765500 -0.492900
+vn 0.434700 0.765500 -0.474400
+vn 0.492400 0.684700 -0.537400
+vn 0.455000 0.765500 -0.455000
+vn 0.515400 0.684700 -0.515400
+vn 0.578400 0.516700 -0.631200
+vn 0.550300 0.516700 -0.655800
+vn 0.610200 0.428800 -0.666000
+vn 0.580600 0.428800 -0.692000
+vn 0.605400 0.516700 -0.605400
+vn 0.638800 0.428800 -0.638800
+vn 0.521200 0.516700 -0.679200
+vn 0.443700 0.684700 -0.578200
+vn 0.549900 0.428800 -0.716700
+vn 0.391700 0.765500 -0.510500
+vn 0.558300 0.684700 -0.468500
+vn 0.492900 0.765500 -0.413600
+vn 0.510500 0.765500 -0.391700
+vn 0.578200 0.684700 -0.443700
+vn 0.527100 0.765500 -0.369100
+vn 0.597000 0.684700 -0.418000
+vn 0.679200 0.516700 -0.521200
+vn 0.655800 0.516700 -0.550300
+vn 0.716600 0.428800 -0.549900
+vn 0.692000 0.428800 -0.580700
+vn 0.701300 0.516700 -0.491000
+vn 0.740000 0.428900 -0.518100
+vn 0.631200 0.516700 -0.578400
+vn 0.537400 0.684700 -0.492400
+vn 0.666000 0.428800 -0.610300
+vn 0.474400 0.765500 -0.434700
+vn 0.631200 0.684700 -0.364400
+vn 0.557200 0.765500 -0.321700
+vn 0.570700 0.765500 -0.297100
+vn 0.646500 0.684700 -0.336600
+vn 0.583200 0.765500 -0.271900
+vn 0.660500 0.684700 -0.308000
+vn 0.759400 0.516700 -0.395300
+vn 0.741400 0.516700 -0.428100
+vn 0.801300 0.428800 -0.417200
+vn 0.782300 0.428800 -0.451700
+vn 0.775900 0.516700 -0.361800
+vn 0.818700 0.428800 -0.381800
+vn 0.722100 0.516700 -0.459900
+vn 0.614700 0.684700 -0.391600
+vn 0.761900 0.428900 -0.485300
+vn 0.542700 0.765500 -0.345700
+vn 0.684900 0.684700 -0.249300
+vn 0.604700 0.765500 -0.220100
+vn 0.613700 0.765500 -0.193500
+vn 0.695100 0.684700 -0.219200
+vn 0.621500 0.765500 -0.166500
+vn 0.704000 0.684700 -0.188600
+vn 0.816500 0.516700 -0.257500
+vn 0.804500 0.516700 -0.292800
+vn 0.861500 0.428900 -0.271700
+vn 0.848900 0.428900 -0.308900
+vn 0.827000 0.516700 -0.221600
+vn 0.872600 0.428800 -0.233800
+vn 0.790900 0.516700 -0.327600
+vn 0.673400 0.684700 -0.278900
+vn 0.834600 0.428800 -0.345700
+vn 0.594500 0.765500 -0.246200
+vn 0.717800 0.684700 -0.126600
+vn 0.633700 0.765500 -0.111700
+vn 0.638000 0.765500 -0.084000
+vn 0.722600 0.684700 -0.095200
+vn 0.641000 0.765500 -0.056100
+vn 0.726100 0.684700 -0.063500
+vn 0.848800 0.516700 -0.111800
+vn 0.843100 0.516700 -0.148700
+vn 0.895600 0.428900 -0.117900
+vn 0.889600 0.428900 -0.156900
+vn 0.852900 0.516700 -0.074600
+vn 0.899900 0.428900 -0.078700
+vn 0.835800 0.516700 -0.185200
+vn 0.711600 0.684700 -0.157700
+vn 0.882000 0.428800 -0.195500
+vn 0.628200 0.765500 -0.139200
+vn 0.728800 0.684700 0.000000
+vn 0.643500 0.765500 0.000000
+vn 0.642800 0.765500 0.028000
+vn 0.728100 0.684700 0.031700
+vn 0.641000 0.765500 0.056100
+vn 0.726100 0.684700 0.063500
+vn 0.855300 0.516700 0.037300
+vn 0.856100 0.516700 0.000000
+vn 0.902500 0.428900 0.039300
+vn 0.903300 0.428900 0.000000
+vn 0.852900 0.516700 0.074600
+vn 0.899900 0.428800 0.078700
+vn 0.855300 0.516700 -0.037300
+vn 0.728100 0.684700 -0.031700
+vn 0.902500 0.428900 -0.039300
+vn 0.642800 0.765500 -0.028000
+vn 0.717800 0.684700 0.126600
+vn 0.633700 0.765500 0.111700
+vn 0.628200 0.765500 0.139200
+vn 0.711600 0.684700 0.157700
+vn 0.621500 0.765500 0.166500
+vn 0.704000 0.684700 0.188600
+vn 0.835800 0.516700 0.185200
+vn 0.843100 0.516700 0.148700
+vn 0.882000 0.428800 0.195500
+vn 0.889600 0.428800 0.156900
+vn 0.827000 0.516700 0.221600
+vn 0.872600 0.428800 0.233800
+vn 0.848800 0.516700 0.111800
+vn 0.722600 0.684700 0.095200
+vn 0.895600 0.428800 0.117900
+vn 0.638000 0.765500 0.084000
+vn 0.684900 0.684700 0.249300
+vn 0.604700 0.765500 0.220100
+vn 0.594500 0.765500 0.246200
+vn 0.673400 0.684700 0.278900
+vn 0.583200 0.765500 0.271900
+vn 0.660500 0.684700 0.308000
+vn 0.790900 0.516700 0.327600
+vn 0.804500 0.516700 0.292800
+vn 0.834600 0.428800 0.345700
+vn 0.848900 0.428800 0.308900
+vn 0.775900 0.516700 0.361800
+vn 0.818700 0.428800 0.381800
+vn 0.816500 0.516700 0.257500
+vn 0.695100 0.684700 0.219200
+vn 0.861500 0.428800 0.271700
+vn 0.613700 0.765500 0.193500
+vn 0.632600 0.684900 0.361400
+vn 0.558500 0.765600 0.319200
+vn 0.545100 0.765900 0.340900
+vn 0.617700 0.685200 0.385900
+vn 0.530700 0.766300 0.362100
+vn 0.601500 0.685600 0.410000
+vn 0.725800 0.517300 0.453400
+vn 0.743200 0.517000 0.424500
+vn 0.766000 0.429300 0.478400
+vn 0.784400 0.429000 0.448000
+vn 0.707100 0.517700 0.481600
+vn 0.746300 0.429700 0.508300
+vn 0.759800 0.516800 0.394300
+vn 0.646800 0.684700 0.335700
+vn 0.801800 0.428900 0.416100
+vn 0.571100 0.765500 0.296400
+vn 0.582100 0.689000 0.431700
+vn 0.513500 0.768000 0.382800
+vn 0.687300 0.716900 0.116700
+vn 0.734800 0.650300 0.192500
+vn 0.776900 0.494000 0.390300
+vn 0.679200 0.515800 0.522100
+vn 0.812500 0.423700 0.400400
+vn 0.711800 0.433900 0.552300
+vn 0.886400 0.357400 -0.294000
+vn 0.884600 0.386900 0.260200
+vn 0.663500 0.519800 0.538100
+vn 0.564200 0.688200 0.456100
+vn 0.661400 0.520200 0.540300
+vn 0.562000 0.687800 0.459400
+vn 0.700100 0.431900 0.568600
+vn 0.698800 0.431200 0.570700
+vn 0.497500 0.768200 0.402800
+vn 0.495600 0.768000 0.405600
+vn 0.622600 -0.006400 -0.782500
+vn 0.636200 -0.006100 -0.771400
+vn 0.627900 -0.015600 -0.778100
+vn 0.610200 -0.016600 -0.792100
+vn 0.602800 -0.041800 -0.796800
+vn 0.569900 -0.044300 -0.820500
+vn 0.493800 -0.018400 -0.869400
+vn 0.524700 -0.007800 -0.851300
+vn 0.408600 -0.039700 -0.911900
+vn 0.538300 -0.001900 -0.842700
+vn 0.627700 -0.001600 -0.778400
+vn 0.542500 0.000000 -0.840000
+vn 0.629300 0.000000 -0.777200
+vn 0.639900 -0.001500 -0.768400
+vn 0.641100 0.000000 -0.767400
+vn -0.361300 -0.480900 -0.798900
+vn -0.219900 -0.577700 -0.786000
+vn -0.543200 -0.646000 -0.536200
+vn -0.632800 -0.508200 -0.584200
+vn -0.591600 -0.644600 -0.484200
+vn -0.669500 -0.502200 -0.547300
+vn -0.729200 -0.265500 -0.630600
+vn -0.560700 -0.278600 -0.779700
+vn -0.748100 -0.258300 -0.611200
+vn -0.063000 -0.144800 -0.987400
+vn 0.171600 -0.251900 -0.952400
+vn 0.327000 -0.272000 -0.905000
+vn -0.752400 -0.499000 -0.429900
+vn -0.665800 -0.641700 -0.380600
+vn -0.680800 -0.641600 -0.353400
+vn -0.769200 -0.498900 -0.399200
+vn -0.695200 -0.641500 -0.324200
+vn -0.785500 -0.498800 -0.366300
+vn -0.857900 -0.256200 -0.445300
+vn -0.839300 -0.256300 -0.479400
+vn -0.876100 -0.256100 -0.408500
+vn -0.819700 -0.256500 -0.512000
+vn -0.734700 -0.499400 -0.459100
+vn -0.798700 -0.256800 -0.544100
+vn -0.715700 -0.499800 -0.487800
+vn -0.650000 -0.642000 -0.406500
+vn -0.633000 -0.642500 -0.431900
+vn -0.814400 -0.498800 -0.296400
+vn -0.720800 -0.641500 -0.262300
+vn -0.731600 -0.641500 -0.230700
+vn -0.826600 -0.498800 -0.260600
+vn -0.741000 -0.641500 -0.198500
+vn -0.837200 -0.498800 -0.224300
+vn -0.921900 -0.256100 -0.290700
+vn -0.908300 -0.256100 -0.330600
+vn -0.933700 -0.256100 -0.250200
+vn -0.893100 -0.256100 -0.369900
+vn -0.800700 -0.498800 -0.331600
+vn -0.708700 -0.641500 -0.293500
+vn -0.853500 -0.498800 -0.150500
+vn -0.755400 -0.641500 -0.133200
+vn -0.760500 -0.641500 -0.100100
+vn -0.859300 -0.498800 -0.113100
+vn -0.764200 -0.641500 -0.066800
+vn -0.863400 -0.498800 -0.075500
+vn -0.958300 -0.256100 -0.126200
+vn -0.951900 -0.256100 -0.167900
+vn -0.963000 -0.256100 -0.084200
+vn -0.943700 -0.256100 -0.209200
+vn -0.846200 -0.498800 -0.187500
+vn -0.748900 -0.641500 -0.166000
+vn -0.866700 -0.498800 0.000000
+vn -0.767100 -0.641500 0.000000
+vn -0.766400 -0.641500 0.033400
+vn -0.865900 -0.498800 0.037800
+vn -0.764200 -0.641500 0.066800
+vn -0.863400 -0.498800 0.075500
+vn -0.965700 -0.256100 0.042100
+vn -0.966600 -0.256100 0.000000
+vn -0.963000 -0.256100 0.084200
+vn -0.965700 -0.256100 -0.042100
+vn -0.865900 -0.498800 -0.037800
+vn -0.766400 -0.641500 -0.033400
+vn -0.853500 -0.498800 0.150500
+vn -0.755400 -0.641500 0.133200
+vn -0.748900 -0.641500 0.166000
+vn -0.846200 -0.498800 0.187500
+vn -0.741000 -0.641500 0.198500
+vn -0.837200 -0.498800 0.224300
+vn -0.943700 -0.256100 0.209200
+vn -0.951900 -0.256100 0.167900
+vn -0.933700 -0.256100 0.250200
+vn -0.958300 -0.256100 0.126200
+vn -0.859300 -0.498800 0.113200
+vn -0.760500 -0.641500 0.100100
+vn -0.814400 -0.498800 0.296400
+vn -0.720800 -0.641500 0.262300
+vn -0.708700 -0.641500 0.293500
+vn -0.800700 -0.498800 0.331600
+vn -0.695200 -0.641500 0.324200
+vn -0.785500 -0.498800 0.366300
+vn -0.893100 -0.256100 0.369900
+vn -0.908300 -0.256100 0.330600
+vn -0.876100 -0.256100 0.408500
+vn -0.921900 -0.256100 0.290700
+vn -0.826600 -0.498800 0.260600
+vn -0.731600 -0.641500 0.230700
+vn -0.750600 -0.498800 0.433300
+vn -0.664300 -0.641500 0.383500
+vn -0.647000 -0.641500 0.412100
+vn -0.731000 -0.498800 0.465600
+vn -0.628400 -0.641500 0.440000
+vn -0.710000 -0.498800 0.497100
+vn -0.815300 -0.256100 0.519300
+vn -0.837100 -0.256100 0.483300
+vn -0.791800 -0.256100 0.554400
+vn -0.857400 -0.256100 0.446400
+vn -0.768700 -0.498800 0.400200
+vn -0.680400 -0.641500 0.354200
+vn -0.663900 -0.498800 0.557100
+vn -0.587600 -0.641500 0.493100
+vn -0.565600 -0.641500 0.518200
+vn -0.639000 -0.498800 0.585500
+vn -0.542400 -0.641500 0.542400
+vn -0.612800 -0.498800 0.612800
+vn -0.712700 -0.256100 0.653000
+vn -0.740500 -0.256100 0.621300
+vn -0.683500 -0.256100 0.683500
+vn -0.766800 -0.256100 0.588500
+vn -0.687600 -0.498800 0.527600
+vn -0.608500 -0.641500 0.467000
+vn -0.557100 -0.498800 0.663900
+vn -0.493100 -0.641500 0.587600
+vn -0.467000 -0.641500 0.608600
+vn -0.527600 -0.498800 0.687600
+vn -0.440000 -0.641500 0.628400
+vn -0.497100 -0.498800 0.710000
+vn -0.588500 -0.256100 0.766800
+vn -0.621300 -0.256100 0.740500
+vn -0.554400 -0.256100 0.791800
+vn -0.653000 -0.256100 0.712700
+vn -0.585500 -0.498800 0.639000
+vn -0.518200 -0.641500 0.565600
+vn -0.433300 -0.498800 0.750600
+vn -0.383500 -0.641500 0.664300
+vn -0.354200 -0.641500 0.680400
+vn -0.400200 -0.498800 0.768700
+vn -0.324200 -0.641500 0.695200
+vn -0.366300 -0.498800 0.785500
+vn -0.446400 -0.256100 0.857400
+vn -0.483300 -0.256100 0.837100
+vn -0.408500 -0.256100 0.876100
+vn -0.519300 -0.256100 0.815300
+vn -0.465600 -0.498800 0.731000
+vn -0.412100 -0.641500 0.647000
+vn -0.296400 -0.498800 0.814400
+vn -0.262300 -0.641500 0.720800
+vn -0.230700 -0.641500 0.731600
+vn -0.260600 -0.498800 0.826600
+vn -0.198500 -0.641500 0.741000
+vn -0.224300 -0.498800 0.837200
+vn -0.290700 -0.256100 0.921900
+vn -0.330600 -0.256100 0.908300
+vn -0.250200 -0.256100 0.933700
+vn -0.369900 -0.256100 0.893100
+vn -0.331600 -0.498800 0.800700
+vn -0.293500 -0.641500 0.708700
+vn -0.150500 -0.498800 0.853500
+vn -0.133200 -0.641500 0.755400
+vn -0.100100 -0.641500 0.760500
+vn -0.113200 -0.498800 0.859300
+vn -0.066800 -0.641500 0.764200
+vn -0.075500 -0.498800 0.863400
+vn -0.126200 -0.256100 0.958300
+vn -0.167900 -0.256100 0.951900
+vn -0.084200 -0.256100 0.963000
+vn -0.209200 -0.256100 0.943700
+vn -0.187500 -0.498800 0.846200
+vn -0.166000 -0.641500 0.748900
+vn 0.781400 -0.018000 0.623700
+vn 0.781600 -0.004500 0.623800
+vn 0.797800 -0.004500 0.602900
+vn 0.797700 -0.018000 0.602800
+vn 0.781600 0.000000 0.623800
+vn 0.797800 0.000000 0.602900
+vn 0.796900 -0.046300 0.602300
+vn 0.780700 -0.046200 0.623200
+vn 0.791700 -0.122500 0.598400
+vn 0.775600 -0.122400 0.619300
+vn 0.769400 -0.046100 0.637100
+vn 0.770200 -0.018000 0.637500
+vn 0.764200 -0.122000 0.633300
+vn 0.770400 -0.004500 0.637600
+vn 0.770400 0.000000 0.637500
+vn 0.777800 0.098000 0.620700
+vn 0.701100 0.442100 0.559500
+vn 0.715500 0.442300 0.540700
+vn 0.793900 0.098000 0.600000
+vn 0.439900 0.826500 0.351100
+vn 0.448700 0.826800 0.339100
+vn 0.797700 0.013500 0.602800
+vn 0.781500 0.013500 0.623700
+vn 0.770300 0.013500 0.637500
+vn 0.766700 0.098000 0.634400
+vn 0.691100 0.441900 0.571900
+vn 0.433800 0.826300 0.359000
+vn 0.572900 0.680200 0.457200
+vn 0.721300 0.385100 0.575700
+vn 0.736300 0.384900 0.556400
+vn 0.585000 0.679900 0.442100
+vn 0.770000 0.171400 0.614600
+vn 0.786000 0.171300 0.594000
+vn 0.377700 0.880800 0.285400
+vn 0.369800 0.881000 0.295100
+vn 0.364100 0.881200 0.301300
+vn 0.564400 0.680700 0.467100
+vn 0.710900 0.385400 0.588300
+vn 0.759000 0.171500 0.628100
+vn 0.781400 0.022100 0.623600
+vn 0.770200 0.022100 0.637400
+vn 0.770400 0.004800 0.637500
+vn 0.781600 0.004800 0.623800
+vn 0.797800 0.004800 0.602900
+vn 0.797600 0.022100 0.602700
+vn 0.796200 0.063500 0.601700
+vn 0.780000 0.063500 0.622500
+vn 0.768800 0.063500 0.636200
+vn -0.015300 0.999700 0.019300
+vn 0.339700 0.891400 0.300100
+vn 0.354600 0.894000 0.273800
+vn -0.001600 1.000000 0.005100
+vn 0.616000 0.596000 0.515000
+vn 0.638100 0.596200 0.487200
+vn -0.358600 0.895200 -0.264500
+vn -0.369500 0.890600 -0.264900
+vn -0.642200 0.598300 -0.479100
+vn -0.640300 0.597500 -0.482600
+vn -0.411400 0.872900 -0.262200
+vn -0.049900 0.997000 0.058300
+vn -0.529600 0.802100 -0.275900
+vn -0.142200 0.977000 0.158600
+vn -0.650500 0.594400 -0.472800
+vn -0.669000 0.587200 -0.455700
+vn 0.332400 0.874100 0.354100
+vn 0.590300 0.594000 0.546600
+vn 0.359700 0.805400 0.471000
+vn 0.564000 0.589300 0.578500
+vn 0.433900 0.833100 0.343000
+vn 0.425600 0.834000 0.350900
+vn 0.436300 0.826800 0.354800
+vn 0.443400 0.826300 0.347100
+vn 0.458400 0.807800 0.370600
+vn 0.465400 0.807400 0.362500
+vn 0.453100 0.825900 0.335500
+vn 0.444400 0.832400 0.331100
+vn 0.475200 0.807000 0.350400
+vn 0.441100 0.834100 0.331200
+vn 0.429200 0.835000 0.344300
+vn 0.444900 0.830000 0.336500
+vn 0.431300 0.830700 0.351800
+vn 0.417700 0.836600 0.354400
+vn 0.415300 0.832600 0.366400
+vn 0.574300 0.686800 0.445500
+vn 0.565600 0.687300 0.455700
+vn 0.665500 0.519600 0.535800
+vn 0.675500 0.519000 0.523700
+vn 0.702900 0.431000 0.565800
+vn 0.713300 0.430600 0.552900
+vn 0.689300 0.518400 0.506000
+vn 0.586200 0.686200 0.430600
+vn 0.727800 0.430200 0.534100
+vn 0.517100 0.766800 0.380300
+vn 0.506500 0.767200 0.393400
+vn 0.498800 0.767600 0.402400
+vn -0.790300 -0.016600 -0.612500
+vn -0.806100 -0.016600 -0.591500
+vn -0.806200 -0.004300 -0.591600
+vn -0.790400 -0.004300 -0.612600
+vn -0.806200 0.000000 -0.591600
+vn -0.790400 0.000000 -0.612600
+vn -0.779000 -0.004300 -0.626900
+vn -0.778900 -0.016600 -0.626900
+vn -0.779000 0.000000 -0.626900
+vn -0.778400 -0.039500 -0.626500
+vn -0.789800 -0.039400 -0.612100
+vn -0.776100 -0.086100 -0.624700
+vn -0.787400 -0.086000 -0.610400
+vn -0.805600 -0.039300 -0.591100
+vn -0.803200 -0.085800 -0.589500
+vn -0.683700 -0.501100 -0.530400
+vn -0.604400 -0.643600 -0.469500
+vn -0.616900 -0.643100 -0.453700
+vn -0.697700 -0.500400 -0.512500
+vn -0.566400 -0.696000 -0.441200
+vn -0.578200 -0.695500 -0.426400
+vn -0.779000 -0.257200 -0.571800
+vn -0.763600 -0.257600 -0.592000
+vn -0.752600 -0.257900 -0.605900
+vn -0.673700 -0.501600 -0.542700
+vn -0.595400 -0.644100 -0.480200
+vn -0.557900 -0.696500 -0.451200
+vn -0.561000 -0.700600 -0.440900
+vn -0.579500 -0.674200 -0.457800
+vn -0.591700 -0.673800 -0.442500
+vn -0.572800 -0.700100 -0.426200
+vn -0.624000 -0.604400 -0.495300
+vn -0.637100 -0.604000 -0.478700
+vn -0.567500 -0.708100 -0.420100
+vn -0.555800 -0.708600 -0.434600
+vn -0.547500 -0.709000 -0.444400
+vn -0.552700 -0.700900 -0.450800
+vn -0.570900 -0.674600 -0.467900
+vn -0.614800 -0.604800 -0.506100
+vn -0.778300 0.095600 -0.620600
+vn -0.553200 0.706500 -0.441400
+vn -0.564300 0.706900 -0.426400
+vn -0.794300 0.096000 -0.599800
+vn -0.242600 0.950600 -0.193700
+vn -0.247400 0.950700 -0.187000
+vn -0.728200 -0.410100 -0.549000
+vn -0.713400 -0.410400 -0.567900
+vn -0.703100 -0.410700 -0.580500
+vn -0.767100 0.095300 -0.634300
+vn -0.545500 0.706100 -0.451400
+vn -0.239300 0.950500 -0.198100
+vn -0.038100 0.998800 -0.030400
+vn -0.009400 0.999900 -0.007500
+vn -0.009600 0.999900 -0.007300
+vn -0.038800 0.998800 -0.029300
+vn -0.098700 0.992300 -0.074600
+vn -0.096800 0.992300 -0.077200
+vn -0.095400 0.992300 -0.079000
+vn -0.037600 0.998800 -0.031100
+vn -0.009300 0.999900 -0.007700
+vn -0.026300 0.999400 -0.021000
+vn -0.174400 0.974800 -0.139200
+vn -0.178400 0.974600 -0.134800
+vn -0.026900 0.999400 -0.020300
+vn -0.454900 0.813100 -0.363100
+vn -0.464800 0.812700 -0.351200
+vn -0.003400 1.000000 -0.002600
+vn -0.003300 1.000000 -0.002600
+vn -0.003300 1.000000 -0.002700
+vn -0.025900 0.999400 -0.021400
+vn -0.171500 0.974900 -0.141900
+vn -0.448000 0.813500 -0.370700
+vn -0.778200 0.093300 -0.621100
+vn -0.781500 0.012800 -0.623700
+vn -0.797700 0.012800 -0.602900
+vn -0.794300 0.093200 -0.600300
+vn -0.781600 0.000000 -0.623800
+vn -0.797800 0.000000 -0.602900
+vn -0.722000 0.425400 -0.545600
+vn -0.707100 0.425800 -0.564400
+vn -0.696900 0.426200 -0.576700
+vn -0.767000 0.093300 -0.634800
+vn -0.770300 0.012800 -0.637500
+vn -0.770400 0.000000 -0.637500
+vn -0.781500 -0.018200 -0.623600
+vn -0.780800 -0.046700 -0.623000
+vn -0.796900 -0.046800 -0.602200
+vn -0.797700 -0.018300 -0.602800
+vn -0.775700 -0.123500 -0.618800
+vn -0.791700 -0.123800 -0.598200
+vn -0.797800 -0.004500 -0.602900
+vn -0.781600 -0.004500 -0.623800
+vn -0.770400 -0.004500 -0.637500
+vn -0.770300 -0.018100 -0.637400
+vn -0.769700 -0.046400 -0.636600
+vn -0.765000 -0.122900 -0.632200
+vn 0.683600 0.021600 -0.729500
+vn 0.665000 0.022600 -0.746500
+vn 0.711800 0.168900 -0.681800
+vn 0.714600 0.161200 -0.680700
+vn 0.657700 0.024300 -0.752800
+vn 0.715700 0.180500 -0.674600
+vn 0.722900 0.159900 -0.672100
+vn 0.703400 0.021600 -0.710500
+vn 0.728100 0.158800 -0.666800
+vn 0.711100 0.021900 -0.702800
+vn 0.699600 0.002600 -0.714500
+vn 0.678200 0.002600 -0.734800
+vn 0.707600 0.002700 -0.706600
+vn 0.657200 0.002700 -0.753700
+vn 0.648000 0.003000 -0.761600
+vn 0.658100 0.030200 -0.752300
+vn 0.645200 0.003700 -0.763900
+vn 0.645100 0.004200 -0.764100
+vn 0.660200 0.034300 -0.750200
+vn 0.645400 0.004600 -0.763800
+vn 0.663400 0.038300 -0.747300
+vn 0.758000 0.318000 -0.569400
+vn 0.736200 0.239400 -0.633000
+vn 0.774700 0.356200 -0.522400
+vn 0.722100 0.196500 -0.663300
+vn 0.657100 0.026800 -0.753300
+vn 0.645900 0.003200 -0.763400
+vn 0.667000 0.050700 -0.743300
+vn 0.633300 0.005100 -0.773900
+vn 0.548500 0.005100 -0.836100
+vn 0.628600 0.074600 -0.774100
+vn 0.320600 0.007000 -0.947200
+vn 0.502700 0.086300 -0.860100
+vn 0.825400 0.374400 -0.422500
+vn 0.794800 0.364500 -0.485200
+vn 0.666400 0.041500 -0.744400
+vn 0.644200 0.005000 -0.764800
+vn -0.652600 0.249400 -0.715400
+vn -0.740000 0.247200 -0.625600
+vn 0.004800 0.999500 -0.029300
+vn 0.099100 0.979400 -0.175700
+vn -0.750600 0.246400 -0.613000
+vn -0.005900 1.000000 -0.004800
+vn 0.433100 0.779800 -0.451900
+vn -0.135900 0.181700 -0.973900
+vn 0.857800 0.334200 -0.390400
+vn -0.269400 0.015600 -0.962900
+vn -0.710700 0.017800 -0.703300
+vn -0.767300 0.017000 -0.641000
+vn -0.774400 0.016800 -0.632400
+vn -0.766200 0.245600 -0.593800
+vn -0.781600 0.245200 -0.573500
+vn -0.013000 0.999800 -0.009600
+vn -0.011000 0.999900 -0.008500
+vn -0.801400 0.244800 -0.545800
+vn -0.015700 0.999800 -0.010700
+vn -0.009000 0.999900 -0.007300
+vn -0.755100 0.246000 -0.607700
+vn -0.778900 0.016800 -0.626900
+vn -0.790300 0.016800 -0.612500
+vn -0.806100 0.016800 -0.591500
+vn -0.826400 0.016700 -0.562800
+vn -0.842000 0.244400 -0.480900
+vn -0.860700 0.244200 -0.446700
+vn -0.017000 0.999800 -0.008800
+vn -0.016300 0.999800 -0.009200
+vn -0.878800 0.244200 -0.409800
+vn -0.018100 0.999800 -0.008400
+vn -0.015800 0.999800 -0.009800
+vn -0.822400 0.244500 -0.513600
+vn -0.848000 0.016700 -0.529600
+vn -0.868200 0.016700 -0.495900
+vn -0.887400 0.016700 -0.460600
+vn -0.906200 0.016700 -0.422500
+vn -0.911200 0.244200 -0.331600
+vn -0.924800 0.244100 -0.291600
+vn -0.019100 0.999800 -0.006000
+vn -0.018700 0.999800 -0.006800
+vn -0.936700 0.244100 -0.251000
+vn -0.019300 0.999800 -0.005200
+vn -0.018400 0.999800 -0.007600
+vn -0.895900 0.244200 -0.371000
+vn -0.923800 0.016700 -0.382600
+vn -0.939500 0.016700 -0.342000
+vn -0.953600 0.016700 -0.300700
+vn -0.965800 0.016700 -0.258800
+vn -0.955000 0.244100 -0.168400
+vn -0.961400 0.244100 -0.126600
+vn -0.019800 0.999800 -0.002600
+vn -0.019700 0.999800 -0.003400
+vn -0.966000 0.244200 -0.084500
+vn -0.019900 0.999800 -0.001700
+vn -0.019500 0.999800 -0.004300
+vn -0.946700 0.244100 -0.209800
+vn -0.976200 0.016700 -0.216300
+vn -0.984600 0.016700 -0.173600
+vn -0.991300 0.016700 -0.130500
+vn -0.996000 0.016700 -0.087100
+vn -0.969700 0.244200 0.000000
+vn -0.968800 0.244200 0.042200
+vn -0.019900 0.999800 0.000900
+vn -0.019900 0.999800 0.000000
+vn -0.966000 0.244200 0.084500
+vn -0.019900 0.999800 0.001700
+vn -0.019900 0.999800 -0.000900
+vn -0.968800 0.244200 -0.042200
+vn -0.998900 0.016700 -0.043500
+vn -0.999800 0.016700 0.000000
+vn -0.998900 0.016700 0.043500
+vn -0.996000 0.016700 0.087100
+vn -0.955000 0.244200 0.168400
+vn -0.946700 0.244200 0.209800
+vn -0.019500 0.999800 0.004300
+vn -0.019700 0.999800 0.003400
+vn -0.936700 0.244200 0.251000
+vn -0.019200 0.999800 0.005200
+vn -0.019800 0.999800 0.002600
+vn -0.961400 0.244200 0.126600
+vn -0.991300 0.016700 0.130500
+vn -0.984600 0.016700 0.173600
+vn -0.976200 0.016700 0.216300
+vn -0.965800 0.016700 0.258800
+vn -0.911200 0.244200 0.331600
+vn -0.895900 0.244200 0.371000
+vn -0.018400 0.999800 0.007600
+vn -0.018700 0.999800 0.006800
+vn -0.878900 0.244200 0.409800
+vn -0.018100 0.999800 0.008400
+vn -0.019000 0.999800 0.006000
+vn -0.924800 0.244200 0.291600
+vn -0.953600 0.016700 0.300700
+vn -0.939500 0.016700 0.342000
+vn -0.923800 0.016700 0.382600
+vn -0.906200 0.016700 0.422500
+vn -0.839800 0.244200 0.484800
+vn -0.817900 0.244200 0.521000
+vn -0.016800 0.999800 0.010700
+vn -0.017200 0.999800 0.009900
+vn -0.794300 0.244200 0.556200
+vn -0.016400 0.999800 0.011500
+vn -0.017700 0.999800 0.009200
+vn -0.860100 0.244200 0.447800
+vn -0.886900 0.016700 0.461700
+vn -0.865900 0.016700 0.499900
+vn -0.843300 0.016700 0.537200
+vn -0.819000 0.016700 0.573500
+vn -0.742900 0.244200 0.623300
+vn -0.715000 0.244200 0.655100
+vn -0.014700 0.999800 0.013500
+vn -0.015300 0.999800 0.012800
+vn -0.685700 0.244200 0.685700
+vn -0.014100 0.999800 0.014100
+vn -0.015800 0.999800 0.012100
+vn -0.769300 0.244200 0.590400
+vn -0.793200 0.016700 0.608700
+vn -0.765900 0.016700 0.642700
+vn -0.737200 0.016700 0.675400
+vn -0.707000 0.016700 0.707000
+vn -0.623300 0.244100 0.742900
+vn -0.590400 0.244100 0.769300
+vn -0.012100 0.999800 0.015800
+vn -0.012800 0.999800 0.015300
+vn -0.556200 0.244200 0.794300
+vn -0.011400 0.999800 0.016400
+vn -0.013500 0.999800 0.014700
+vn -0.655100 0.244200 0.715000
+vn -0.675400 0.016700 0.737200
+vn -0.642700 0.016700 0.765900
+vn -0.608700 0.016700 0.793200
+vn -0.573500 0.016700 0.819000
+vn -0.484800 0.244200 0.839800
+vn -0.447800 0.244200 0.860100
+vn -0.009200 0.999800 0.017700
+vn -0.010000 0.999800 0.017200
+vn -0.409800 0.244100 0.878900
+vn -0.008500 0.999800 0.018100
+vn -0.010700 0.999800 0.016800
+vn -0.521000 0.244200 0.817900
+vn -0.537200 0.016700 0.843300
+vn -0.499900 0.016700 0.865900
+vn -0.461700 0.016700 0.886900
+vn -0.422500 0.016700 0.906200
+vn -0.331600 0.244200 0.911200
+vn -0.291600 0.244200 0.924800
+vn -0.006000 0.999800 0.019000
+vn -0.006800 0.999800 0.018700
+vn -0.251000 0.244200 0.936700
+vn -0.005200 0.999800 0.019300
+vn -0.007600 0.999800 0.018400
+vn -0.371000 0.244100 0.895900
+vn -0.382600 0.016700 0.923800
+vn -0.342000 0.016700 0.939500
+vn -0.300700 0.016700 0.953600
+vn -0.258800 0.016700 0.965800
+vn -0.168400 0.244200 0.955000
+vn -0.126600 0.244200 0.961400
+vn -0.002600 0.999800 0.019800
+vn -0.003400 0.999800 0.019600
+vn -0.084500 0.244200 0.966000
+vn -0.001700 0.999800 0.019900
+vn -0.004300 0.999800 0.019500
+vn -0.209800 0.244200 0.946700
+vn -0.216300 0.016700 0.976200
+vn -0.173600 0.016700 0.984600
+vn -0.130500 0.016700 0.991300
+vn -0.087100 0.016700 0.996000
+vn 0.134800 0.630600 -0.764300
+vn 0.167900 0.630600 -0.757700
+vn 0.095500 0.897300 -0.430900
+vn 0.076600 0.897300 -0.434600
+vn 0.069100 0.947600 -0.311900
+vn 0.055500 0.947600 -0.314600
+vn 0.200900 0.630600 -0.749700
+vn 0.114200 0.897300 -0.426300
+vn 0.082700 0.947600 -0.308600
+vn 0.057600 0.897300 -0.437500
+vn 0.101300 0.630600 -0.769500
+vn 0.038500 0.897300 -0.439600
+vn 0.067600 0.630600 -0.773200
+vn 0.041700 0.947600 -0.316700
+vn 0.027800 0.947600 -0.318200
+vn 0.128400 0.181300 -0.975000
+vn 0.170800 0.181300 -0.968500
+vn 0.085700 0.181300 -0.979700
+vn 0.212800 0.181300 -0.960100
+vn 0.254500 0.181300 -0.949900
+vn 0.265500 0.630500 -0.729300
+vn 0.297000 0.630600 -0.717000
+vn 0.168900 0.897300 -0.407800
+vn 0.150900 0.897300 -0.414700
+vn 0.122200 0.947600 -0.295100
+vn 0.109300 0.947600 -0.300200
+vn 0.328000 0.630600 -0.703400
+vn 0.186500 0.897300 -0.400000
+vn 0.135000 0.947600 -0.289500
+vn 0.132700 0.897300 -0.420900
+vn 0.233400 0.630600 -0.740200
+vn 0.096100 0.947600 -0.304700
+vn 0.295800 0.181300 -0.937900
+vn 0.336300 0.181300 -0.924100
+vn 0.376300 0.181300 -0.908600
+vn 0.415600 0.181300 -0.891300
+vn 0.388000 0.630600 -0.672100
+vn 0.417000 0.630600 -0.654600
+vn 0.237100 0.897300 -0.372200
+vn 0.220600 0.897300 -0.382200
+vn 0.171600 0.947600 -0.269400
+vn 0.159700 0.947600 -0.276700
+vn 0.445100 0.630600 -0.635700
+vn 0.253100 0.897300 -0.361500
+vn 0.183200 0.947600 -0.261700
+vn 0.203800 0.897300 -0.391500
+vn 0.358400 0.630600 -0.688400
+vn 0.147500 0.947600 -0.283300
+vn 0.454100 0.181300 -0.872300
+vn 0.491700 0.181300 -0.851600
+vn 0.528300 0.181300 -0.829400
+vn 0.564000 0.181300 -0.805600
+vn 0.498900 0.630600 -0.594500
+vn 0.524300 0.630600 -0.572200
+vn 0.298100 0.897300 -0.325400
+vn 0.283700 0.897300 -0.338100
+vn 0.215800 0.947600 -0.235500
+vn 0.205300 0.947600 -0.244700
+vn 0.548800 0.630600 -0.548800
+vn 0.312100 0.897300 -0.312100
+vn 0.225900 0.947600 -0.225900
+vn 0.268700 0.897300 -0.350100
+vn 0.472500 0.630600 -0.615700
+vn 0.194500 0.947600 -0.253400
+vn 0.598700 0.181300 -0.780200
+vn 0.632100 0.181300 -0.753300
+vn 0.664400 0.181300 -0.725100
+vn 0.695400 0.181300 -0.695400
+vn 0.594500 0.630600 -0.498900
+vn 0.615700 0.630600 -0.472500
+vn 0.350100 0.897300 -0.268700
+vn 0.338100 0.897300 -0.283700
+vn 0.253400 0.947600 -0.194500
+vn 0.244700 0.947600 -0.205300
+vn 0.635700 0.630600 -0.445100
+vn 0.361500 0.897300 -0.253100
+vn 0.261700 0.947600 -0.183200
+vn 0.325400 0.897300 -0.298100
+vn 0.572200 0.630600 -0.524300
+vn 0.235500 0.947600 -0.215800
+vn 0.725100 0.181300 -0.664400
+vn 0.753300 0.181300 -0.632100
+vn 0.780200 0.181300 -0.598700
+vn 0.805600 0.181300 -0.564000
+vn 0.672100 0.630600 -0.388000
+vn 0.688400 0.630600 -0.358400
+vn 0.391500 0.897300 -0.203800
+vn 0.382200 0.897300 -0.220600
+vn 0.283300 0.947600 -0.147500
+vn 0.276700 0.947600 -0.159700
+vn 0.703400 0.630600 -0.328000
+vn 0.400000 0.897300 -0.186500
+vn 0.289500 0.947600 -0.135000
+vn 0.372200 0.897300 -0.237100
+vn 0.654600 0.630600 -0.417000
+vn 0.269400 0.947600 -0.171600
+vn 0.829400 0.181300 -0.528300
+vn 0.851600 0.181300 -0.491700
+vn 0.872300 0.181300 -0.454100
+vn 0.891300 0.181300 -0.415600
+vn 0.729300 0.630600 -0.265500
+vn 0.740200 0.630600 -0.233400
+vn 0.420900 0.897300 -0.132700
+vn 0.414700 0.897300 -0.150900
+vn 0.304700 0.947600 -0.096100
+vn 0.300200 0.947600 -0.109300
+vn 0.749700 0.630600 -0.200900
+vn 0.426300 0.897300 -0.114200
+vn 0.308600 0.947600 -0.082700
+vn 0.407800 0.897300 -0.168900
+vn 0.717000 0.630600 -0.297000
+vn 0.295100 0.947600 -0.122200
+vn 0.908600 0.181300 -0.376300
+vn 0.924100 0.181300 -0.336300
+vn 0.937900 0.181300 -0.295800
+vn 0.949900 0.181300 -0.254500
+vn 0.764300 0.630500 -0.134800
+vn 0.769500 0.630600 -0.101300
+vn 0.437500 0.897300 -0.057600
+vn 0.434600 0.897300 -0.076600
+vn 0.316700 0.947600 -0.041700
+vn 0.314600 0.947600 -0.055500
+vn 0.773200 0.630600 -0.067600
+vn 0.439600 0.897300 -0.038500
+vn 0.318200 0.947600 -0.027800
+vn 0.430900 0.897300 -0.095500
+vn 0.757700 0.630600 -0.167900
+vn 0.311900 0.947600 -0.069100
+vn 0.960100 0.181300 -0.212800
+vn 0.968500 0.181300 -0.170800
+vn 0.975000 0.181300 -0.128400
+vn 0.979700 0.181300 -0.085700
+vn 0.776100 0.630600 0.000000
+vn 0.775400 0.630600 0.033800
+vn 0.440900 0.897300 0.019200
+vn 0.441300 0.897300 0.000000
+vn 0.319200 0.947600 0.013900
+vn 0.319400 0.947600 0.000000
+vn 0.773200 0.630600 0.067600
+vn 0.439600 0.897300 0.038500
+vn 0.318200 0.947600 0.027800
+vn 0.440900 0.897300 -0.019200
+vn 0.775400 0.630600 -0.033800
+vn 0.319200 0.947600 -0.013900
+vn 0.982500 0.181300 -0.042800
+vn 0.983400 0.181300 0.000000
+vn 0.982500 0.181300 0.042800
+vn 0.979700 0.181300 0.085700
+vn 0.764300 0.630600 0.134800
+vn 0.757700 0.630600 0.167900
+vn 0.430900 0.897300 0.095500
+vn 0.434600 0.897300 0.076600
+vn 0.311900 0.947600 0.069100
+vn 0.314600 0.947600 0.055500
+vn 0.749700 0.630600 0.200900
+vn 0.426300 0.897300 0.114200
+vn 0.308600 0.947600 0.082700
+vn 0.437500 0.897300 0.057600
+vn 0.769500 0.630600 0.101300
+vn 0.316700 0.947600 0.041700
+vn 0.975000 0.181300 0.128400
+vn 0.968500 0.181300 0.170800
+vn 0.960100 0.181300 0.212800
+vn 0.949900 0.181300 0.254500
+vn 0.729300 0.630600 0.265500
+vn 0.717000 0.630600 0.297000
+vn 0.407800 0.897300 0.168900
+vn 0.414700 0.897300 0.150900
+vn 0.295100 0.947600 0.122200
+vn 0.300200 0.947600 0.109300
+vn 0.703400 0.630600 0.328000
+vn 0.400000 0.897300 0.186500
+vn 0.289500 0.947600 0.135000
+vn 0.420900 0.897300 0.132700
+vn 0.740200 0.630600 0.233400
+vn 0.304700 0.947600 0.096100
+vn 0.937900 0.181300 0.295800
+vn 0.924100 0.181300 0.336300
+vn 0.908600 0.181300 0.376300
+vn 0.891300 0.181300 0.415600
+vn 0.672400 0.630500 0.387700
+vn 0.655000 0.630500 0.416400
+vn 0.372400 0.897300 0.236800
+vn 0.382300 0.897300 0.220500
+vn 0.269600 0.947600 0.171400
+vn 0.276700 0.947600 0.159600
+vn 0.636200 0.630600 0.444500
+vn 0.361800 0.897300 0.252700
+vn 0.261800 0.947600 0.182900
+vn 0.391500 0.897300 0.203700
+vn 0.688500 0.630500 0.358300
+vn 0.283400 0.947600 0.147500
+vn 0.872300 0.181300 0.454000
+vn 0.851900 0.181300 0.491300
+vn 0.829900 0.181300 0.527600
+vn 0.806200 0.181300 0.563200
+vn 0.607200 0.629600 0.484600
+vn 0.598700 0.629300 0.495400
+vn 0.340500 0.897000 0.281800
+vn 0.345400 0.897100 0.275600
+vn 0.246000 0.947600 0.203600
+vn 0.249700 0.947600 0.199300
+vn 0.595700 0.628700 0.499800
+vn 0.338800 0.896800 0.284300
+vn 0.244700 0.947600 0.205300
+vn 0.352400 0.897200 0.266300
+vn 0.619600 0.630000 0.468200
+vn 0.254900 0.947600 0.192600
+vn 0.784600 0.181200 0.592900
+vn 0.768700 0.181100 0.613400
+vn 0.757700 0.181100 0.627000
+vn 0.753400 0.181000 0.632200
+vn 0.866300 0.487800 -0.107400
+vn 0.809000 0.243500 -0.534900
+vn 0.710700 0.584900 -0.390700
+vn 0.616700 0.784900 -0.060100
+vn 0.615300 0.739200 -0.273800
+vn 0.343900 0.933200 0.103900
+vn 0.725300 0.038400 -0.687300
+vn 0.742600 0.209400 -0.636100
+vn 0.733800 0.390500 -0.555900
+vn 0.394500 0.884800 0.248000
+vn 0.720600 0.584900 0.372200
+vn 0.256800 0.946500 0.195400
+vn 0.888500 0.161800 0.429300
+vn 0.980600 0.117100 -0.157000
+vn 0.793100 0.030200 -0.608200
+vn 0.718500 0.004500 -0.695500
+vn 0.707000 -0.003600 -0.707200
+vn 0.706800 -0.009200 -0.707300
+vn 0.706800 -0.009700 -0.707300
+vn 0.707000 -0.003800 -0.707200
+vn 0.706400 -0.024500 -0.707400
+vn 0.706300 -0.025800 -0.707400
+vn 0.707100 -0.000900 -0.707100
+vn 0.707000 -0.003400 -0.707200
+vn 0.706800 -0.008700 -0.707300
+vn 0.706400 -0.023200 -0.707400
+vn 0.707300 0.001100 -0.706900
+vn 0.707100 0.000200 -0.707100
+vn 0.707200 0.000300 -0.707000
+vn 0.707600 0.001700 -0.706600
+vn 0.707300 0.000200 -0.706900
+vn 0.707900 0.001300 -0.706200
+vn 0.708200 0.006100 -0.705900
+vn 0.707400 0.003200 -0.706700
+vn 0.709500 0.005200 -0.704700
+vn 0.707100 0.000700 -0.707100
+vn 0.708500 0.000300 -0.705700
+vn 0.707400 0.000000 -0.706700
+vn 0.708500 0.000100 -0.705600
+vn 0.708600 0.000000 -0.705600
+vn 0.710800 0.000200 -0.703300
+vn 0.710700 0.000900 -0.703500
+vn 0.710900 0.000000 -0.703300
+vn 0.710200 0.002300 -0.703900
+vn 0.708200 0.000700 -0.705900
+vn 0.707400 0.000100 -0.706800
+vn 0.712800 0.021600 -0.701000
+vn 0.711600 0.021600 -0.702300
+vn 0.729400 0.152700 -0.666800
+vn 0.730900 0.148000 -0.666200
+vn 0.718500 0.439200 -0.539400
+vn 0.723000 0.426000 -0.543900
+vn 0.734400 0.156400 -0.660400
+vn 0.715900 0.024400 -0.697700
+vn 0.727600 0.411700 -0.548700
+vn 0.711500 0.003000 -0.702600
+vn 0.709100 0.002700 -0.705100
+vn 0.708000 0.002700 -0.706200
+vn 0.272000 0.953200 0.131500
+vn 0.267300 0.955600 0.123700
+vn 0.215600 0.960600 0.175100
+vn 0.224900 0.957700 0.179400
+vn 0.210100 0.961100 0.179200
+vn 0.219300 0.958000 0.184700
+vn 0.234900 0.954300 0.184800
+vn 0.289600 0.948400 0.129100
+vn 0.227900 0.954700 0.191300
+vn 0.565400 0.795800 -0.216800
+vn 0.540600 0.818400 -0.194700
+vn 0.528000 0.827800 -0.189400
+vn 0.224500 0.957900 0.179000
+vn 0.216600 0.960800 0.172900
+vn 0.221200 0.960800 0.167200
+vn 0.229100 0.957900 0.173200
+vn 0.227300 0.960800 0.158800
+vn 0.235400 0.957900 0.164500
+vn 0.201100 0.966200 0.161200
+vn 0.206300 0.965900 0.156100
+vn 0.212100 0.965900 0.148200
+vn 0.237600 0.954600 0.179600
+vn 0.232800 0.954600 0.185700
+vn 0.244100 0.954600 0.170600
+vn 0.229300 0.954700 0.189700
+vn 0.221100 0.957900 0.182800
+vn 0.213100 0.960900 0.176400
+vn 0.194900 0.967100 0.163400
+vn 0.248800 0.957900 0.143500
+vn 0.240200 0.960800 0.138500
+vn 0.245900 0.960800 0.128000
+vn 0.254800 0.957900 0.132600
+vn 0.251300 0.960800 0.117200
+vn 0.260300 0.957900 0.121400
+vn 0.224100 0.965900 0.129200
+vn 0.229500 0.965900 0.119400
+vn 0.234500 0.965900 0.109300
+vn 0.264200 0.954600 0.137500
+vn 0.258000 0.954600 0.148800
+vn 0.269900 0.954600 0.125900
+vn 0.251400 0.954600 0.159800
+vn 0.242400 0.957900 0.154100
+vn 0.234000 0.960800 0.148700
+vn 0.218300 0.965900 0.138800
+vn 0.269900 0.957900 0.098200
+vn 0.260500 0.960800 0.094800
+vn 0.264400 0.960800 0.083400
+vn 0.273900 0.957900 0.086400
+vn 0.267800 0.960800 0.071700
+vn 0.277400 0.957900 0.074300
+vn 0.243100 0.965900 0.088500
+vn 0.246700 0.965900 0.077800
+vn 0.249900 0.965900 0.067000
+vn 0.284100 0.954600 0.089600
+vn 0.279900 0.954600 0.101900
+vn 0.287700 0.954600 0.077100
+vn 0.275200 0.954600 0.114000
+vn 0.265400 0.957900 0.109900
+vn 0.256100 0.960800 0.106100
+vn 0.239000 0.965900 0.099000
+vn 0.282800 0.957900 0.049900
+vn 0.273000 0.960800 0.048100
+vn 0.274900 0.960800 0.036200
+vn 0.284700 0.957900 0.037500
+vn 0.276200 0.960800 0.024100
+vn 0.286100 0.957900 0.025000
+vn 0.254800 0.965900 0.044900
+vn 0.256500 0.965900 0.033800
+vn 0.257700 0.965900 0.022500
+vn 0.295300 0.954600 0.038900
+vn 0.293300 0.954600 0.051700
+vn 0.296700 0.954600 0.025900
+vn 0.290800 0.954600 0.064500
+vn 0.280400 0.957900 0.062100
+vn 0.270700 0.960800 0.060000
+vn 0.252600 0.965900 0.056000
+vn 0.287200 0.957900 0.000000
+vn 0.277300 0.960800 0.000000
+vn 0.277000 0.960800 -0.012100
+vn 0.286900 0.957900 -0.012500
+vn 0.276200 0.960800 -0.024100
+vn 0.286100 0.957900 -0.025000
+vn 0.258700 0.965900 0.000000
+vn 0.258500 0.965900 -0.011300
+vn 0.257700 0.965900 -0.022500
+vn 0.297600 0.954600 -0.013000
+vn 0.297900 0.954600 0.000000
+vn 0.296700 0.954600 -0.025900
+vn 0.297600 0.954600 0.013000
+vn 0.286900 0.957900 0.012500
+vn 0.277000 0.960800 0.012100
+vn 0.258500 0.965900 0.011300
+vn 0.282800 0.957900 -0.049900
+vn 0.273000 0.960800 -0.048100
+vn 0.270700 0.960800 -0.060000
+vn 0.280400 0.957900 -0.062100
+vn 0.267800 0.960800 -0.071700
+vn 0.277400 0.957900 -0.074300
+vn 0.254800 0.965900 -0.044900
+vn 0.252600 0.965900 -0.056000
+vn 0.249900 0.965900 -0.067000
+vn 0.290800 0.954600 -0.064500
+vn 0.293300 0.954600 -0.051700
+vn 0.287700 0.954600 -0.077100
+vn 0.295300 0.954600 -0.038900
+vn 0.284700 0.957900 -0.037500
+vn 0.274900 0.960800 -0.036200
+vn 0.256500 0.965900 -0.033800
+vn 0.269900 0.957900 -0.098200
+vn 0.260500 0.960800 -0.094800
+vn 0.256100 0.960800 -0.106100
+vn 0.265400 0.957900 -0.109900
+vn 0.251300 0.960800 -0.117200
+vn 0.260300 0.957900 -0.121400
+vn 0.243100 0.965900 -0.088500
+vn 0.239000 0.965900 -0.099000
+vn 0.234500 0.965900 -0.109300
+vn 0.275200 0.954600 -0.114000
+vn 0.279900 0.954600 -0.101900
+vn 0.269900 0.954600 -0.125900
+vn 0.284100 0.954600 -0.089600
+vn 0.273900 0.957900 -0.086400
+vn 0.264400 0.960800 -0.083400
+vn 0.246700 0.965900 -0.077800
+vn 0.248700 0.957900 -0.143600
+vn 0.240100 0.960800 -0.138600
+vn 0.233800 0.960800 -0.149000
+vn 0.242200 0.957900 -0.154300
+vn 0.227100 0.960800 -0.159000
+vn 0.235300 0.957900 -0.164700
+vn 0.224100 0.965900 -0.129400
+vn 0.218200 0.965900 -0.139000
+vn 0.211900 0.965900 -0.148400
+vn 0.251200 0.954600 -0.160000
+vn 0.257900 0.954600 -0.148900
+vn 0.244000 0.954600 -0.170800
+vn 0.264200 0.954600 -0.137500
+vn 0.254700 0.957900 -0.132600
+vn 0.245900 0.960800 -0.128000
+vn 0.229500 0.965900 -0.119500
+vn 0.220000 0.957900 -0.184600
+vn 0.212400 0.960800 -0.178200
+vn 0.204400 0.960800 -0.187300
+vn 0.211800 0.957900 -0.194000
+vn 0.196100 0.960800 -0.196100
+vn 0.203100 0.957900 -0.203100
+vn 0.198200 0.965900 -0.166300
+vn 0.190800 0.965900 -0.174800
+vn 0.182900 0.965900 -0.183000
+vn 0.219600 0.954600 -0.201200
+vn 0.228200 0.954600 -0.191400
+vn 0.210600 0.954600 -0.210600
+vn 0.236300 0.954600 -0.181300
+vn 0.227900 0.957900 -0.174800
+vn 0.219900 0.960800 -0.168800
+vn 0.205300 0.965900 -0.157500
+vn 0.184600 0.957900 -0.220000
+vn 0.178200 0.960800 -0.212400
+vn 0.168800 0.960800 -0.219900
+vn 0.174800 0.957900 -0.227900
+vn 0.159000 0.960800 -0.227100
+vn 0.164700 0.957900 -0.235300
+vn 0.166300 0.965900 -0.198200
+vn 0.157500 0.965900 -0.205300
+vn 0.148400 0.965900 -0.211900
+vn 0.181300 0.954600 -0.236300
+vn 0.191400 0.954600 -0.228200
+vn 0.170800 0.954600 -0.244000
+vn 0.201200 0.954600 -0.219600
+vn 0.194000 0.957900 -0.211800
+vn 0.187300 0.960800 -0.204400
+vn 0.174800 0.965900 -0.190800
+vn 0.143600 0.957900 -0.248700
+vn 0.138600 0.960800 -0.240100
+vn 0.128000 0.960800 -0.245900
+vn 0.132600 0.957900 -0.254700
+vn 0.117200 0.960800 -0.251300
+vn 0.121400 0.957900 -0.260300
+vn 0.129400 0.965900 -0.224100
+vn 0.119500 0.965900 -0.229500
+vn 0.109300 0.965900 -0.234500
+vn 0.137500 0.954600 -0.264200
+vn 0.148900 0.954600 -0.257900
+vn 0.125900 0.954600 -0.269900
+vn 0.160000 0.954600 -0.251200
+vn 0.154300 0.957900 -0.242200
+vn 0.149000 0.960800 -0.233800
+vn 0.139000 0.965900 -0.218200
+vn 0.098200 0.957900 -0.269900
+vn 0.094800 0.960800 -0.260500
+vn 0.083400 0.960800 -0.264400
+vn 0.086400 0.957900 -0.273900
+vn 0.071700 0.960800 -0.267800
+vn 0.074300 0.957900 -0.277400
+vn 0.088500 0.965900 -0.243100
+vn 0.077800 0.965900 -0.246700
+vn 0.067000 0.965900 -0.249900
+vn 0.089600 0.954600 -0.284100
+vn 0.101900 0.954600 -0.279900
+vn 0.077100 0.954600 -0.287700
+vn 0.114000 0.954600 -0.275200
+vn 0.109900 0.957900 -0.265400
+vn 0.106100 0.960800 -0.256100
+vn 0.099000 0.965900 -0.239100
+vn 0.049900 0.957900 -0.282800
+vn 0.048100 0.960800 -0.273000
+vn 0.036200 0.960800 -0.274900
+vn 0.037500 0.957900 -0.284700
+vn 0.024100 0.960800 -0.276200
+vn 0.025000 0.957900 -0.286100
+vn 0.044900 0.965900 -0.254800
+vn 0.033800 0.965900 -0.256500
+vn 0.022500 0.965900 -0.257700
+vn 0.038900 0.954600 -0.295300
+vn 0.051700 0.954600 -0.293300
+vn 0.025900 0.954600 -0.296700
+vn 0.064500 0.954600 -0.290800
+vn 0.062100 0.957900 -0.280400
+vn 0.060000 0.960800 -0.270700
+vn 0.056000 0.965900 -0.252600
+vn 0.587300 0.735100 0.338600
+vn 0.506500 0.811300 0.291800
+vn 0.518800 0.811200 0.269900
+vn 0.601500 0.735000 0.313000
+vn 0.530000 0.811200 0.247100
+vn 0.614600 0.734900 0.286600
+vn 0.828500 0.357300 0.431200
+vn 0.809100 0.357400 0.466500
+vn 0.846500 0.357300 0.394700
+vn 0.788100 0.357600 0.501000
+vn 0.571900 0.735400 0.363400
+vn 0.765500 0.357900 0.534700
+vn 0.555300 0.735800 0.387600
+vn 0.493300 0.811500 0.313100
+vn 0.479000 0.811900 0.333800
+vn -0.076800 0.996000 -0.044300
+vn 0.172900 0.979900 0.099700
+vn 0.168400 0.979900 0.107100
+vn -0.074900 0.996000 -0.047600
+vn 0.163600 0.979900 0.114300
+vn -0.072800 0.996000 -0.050800
+vn -0.687900 0.579300 -0.437300
+vn -0.706100 0.579300 -0.407200
+vn -0.668200 0.579200 -0.466800
+vn -0.723100 0.579200 -0.376300
+vn -0.078700 0.996000 -0.041000
+vn -0.738800 0.579200 -0.344500
+vn -0.080400 0.996000 -0.037500
+vn 0.177000 0.979900 0.092100
+vn 0.180900 0.979900 0.084300
+vn 0.637200 0.734900 0.231900
+vn 0.549500 0.811200 0.200000
+vn 0.557700 0.811200 0.175900
+vn 0.646700 0.734900 0.203900
+vn 0.564900 0.811200 0.151300
+vn 0.655000 0.734900 0.175500
+vn 0.890700 0.357300 0.280900
+vn 0.877700 0.357200 0.319400
+vn 0.902200 0.357300 0.241700
+vn 0.862900 0.357200 0.357400
+vn 0.626500 0.734900 0.259500
+vn 0.540300 0.811200 0.223800
+vn -0.083400 0.996000 -0.030300
+vn 0.187500 0.979900 0.068200
+vn 0.184400 0.979900 0.076400
+vn -0.082000 0.996000 -0.033900
+vn -0.753100 0.579200 -0.311900
+vn -0.766000 0.579200 -0.278800
+vn -0.777400 0.579200 -0.245100
+vn -0.084600 0.996000 -0.026700
+vn -0.787400 0.579200 -0.211000
+vn -0.085700 0.996000 -0.022900
+vn 0.190300 0.979900 0.060000
+vn 0.192800 0.979900 0.051600
+vn 0.667800 0.734900 0.117700
+vn 0.575900 0.811200 0.101500
+vn 0.579800 0.811200 0.076400
+vn 0.672300 0.734900 0.088500
+vn 0.582600 0.811200 0.051000
+vn 0.675500 0.734900 0.059100
+vn 0.926000 0.357200 0.121900
+vn 0.919800 0.357200 0.162200
+vn 0.930400 0.357300 0.081400
+vn 0.911900 0.357300 0.202100
+vn 0.662000 0.734900 0.146700
+vn 0.570900 0.811200 0.126500
+vn -0.087400 0.996000 -0.015400
+vn 0.196500 0.979900 0.034600
+vn 0.194800 0.979900 0.043200
+vn -0.086600 0.996000 -0.019200
+vn -0.795800 0.579200 -0.176400
+vn -0.802800 0.579200 -0.141500
+vn -0.808200 0.579200 -0.106400
+vn -0.088000 0.996000 -0.011600
+vn -0.812000 0.579200 -0.071000
+vn -0.088400 0.996000 -0.007700
+vn 0.197900 0.979900 0.026000
+vn 0.198800 0.979900 0.017400
+vn 0.678100 0.734900 0.000000
+vn 0.584800 0.811200 0.000000
+vn 0.584200 0.811200 -0.025500
+vn 0.677400 0.734900 -0.029500
+vn 0.582600 0.811200 -0.051000
+vn 0.675500 0.734900 -0.059100
+vn 0.933100 0.357200 -0.040700
+vn 0.934000 0.357300 0.000000
+vn 0.930400 0.357200 -0.081400
+vn 0.933100 0.357300 0.040700
+vn 0.677400 0.734900 0.029500
+vn 0.584200 0.811200 0.025500
+vn -0.088700 0.996000 0.000000
+vn 0.199600 0.979900 0.000000
+vn 0.199400 0.979900 0.008700
+vn -0.088700 0.996000 -0.003800
+vn -0.814400 0.579200 -0.035500
+vn -0.815100 0.579200 0.000000
+vn -0.814400 0.579200 0.035500
+vn -0.088700 0.996000 0.003800
+vn -0.812000 0.579200 0.071000
+vn -0.088400 0.996000 0.007700
+vn 0.199400 0.979900 -0.008700
+vn 0.198800 0.979900 -0.017400
+vn 0.667800 0.734900 -0.117700
+vn 0.575900 0.811200 -0.101500
+vn 0.570900 0.811200 -0.126500
+vn 0.662000 0.734900 -0.146700
+vn 0.564900 0.811200 -0.151300
+vn 0.655000 0.734900 -0.175500
+vn 0.911900 0.357200 -0.202100
+vn 0.919800 0.357200 -0.162200
+vn 0.902200 0.357200 -0.241700
+vn 0.926000 0.357200 -0.121900
+vn 0.672300 0.734900 -0.088500
+vn 0.579800 0.811200 -0.076400
+vn -0.087400 0.996000 0.015400
+vn 0.196500 0.979900 -0.034600
+vn 0.197900 0.979900 -0.026000
+vn -0.088000 0.996000 0.011600
+vn -0.808200 0.579200 0.106400
+vn -0.802800 0.579200 0.141500
+vn -0.795800 0.579200 0.176400
+vn -0.086600 0.996000 0.019200
+vn -0.787400 0.579200 0.211000
+vn -0.085700 0.996000 0.022900
+vn 0.194800 0.979900 -0.043200
+vn 0.192800 0.979900 -0.051600
+vn 0.637200 0.734900 -0.231900
+vn 0.549500 0.811200 -0.200000
+vn 0.540300 0.811200 -0.223800
+vn 0.626500 0.734900 -0.259500
+vn 0.530000 0.811200 -0.247100
+vn 0.614600 0.734900 -0.286600
+vn 0.862900 0.357300 -0.357400
+vn 0.877700 0.357300 -0.319400
+vn 0.846500 0.357300 -0.394700
+vn 0.890700 0.357200 -0.280900
+vn 0.646700 0.734900 -0.203900
+vn 0.557700 0.811200 -0.175900
+vn -0.083400 0.996000 0.030300
+vn 0.187500 0.979900 -0.068200
+vn 0.190300 0.979900 -0.060000
+vn -0.084600 0.996000 0.026700
+vn -0.777400 0.579200 0.245100
+vn -0.766000 0.579200 0.278800
+vn -0.753100 0.579200 0.311900
+vn -0.082000 0.996000 0.033900
+vn -0.738800 0.579200 0.344500
+vn -0.080400 0.996000 0.037500
+vn 0.184400 0.979900 -0.076400
+vn 0.180900 0.979900 -0.084300
+vn 0.587200 0.734900 -0.339000
+vn 0.506500 0.811200 -0.292400
+vn 0.493200 0.811200 -0.314200
+vn 0.571900 0.734900 -0.364300
+vn 0.479000 0.811200 -0.335400
+vn 0.555400 0.734900 -0.388900
+vn 0.787700 0.357200 -0.501800
+vn 0.808900 0.357200 -0.467000
+vn 0.765100 0.357300 -0.535700
+vn 0.828400 0.357300 -0.431300
+vn 0.601500 0.734900 -0.313100
+vn 0.518700 0.811200 -0.270100
+vn -0.076800 0.996000 0.044400
+vn 0.172800 0.979900 -0.099800
+vn 0.177000 0.979900 -0.092100
+vn -0.078700 0.996000 0.041000
+vn -0.723000 0.579200 0.376400
+vn -0.705900 0.579200 0.407600
+vn -0.687500 0.579200 0.437900
+vn -0.074800 0.996000 0.047700
+vn -0.667700 0.579200 0.467500
+vn -0.072700 0.996000 0.050900
+vn 0.168300 0.979900 -0.107200
+vn 0.163500 0.979900 -0.114500
+vn 0.519500 0.734900 -0.435900
+vn 0.448000 0.811200 -0.375900
+vn 0.431200 0.811200 -0.395100
+vn 0.500000 0.734900 -0.458100
+vn 0.413500 0.811200 -0.413500
+vn 0.479500 0.734900 -0.479500
+vn 0.688600 0.357300 -0.631000
+vn 0.715500 0.357300 -0.600400
+vn 0.660400 0.357300 -0.660400
+vn 0.741000 0.357300 -0.568600
+vn 0.537900 0.734900 -0.412800
+vn 0.463900 0.811200 -0.356000
+vn -0.068000 0.996000 0.057000
+vn 0.152900 0.979900 -0.128300
+vn 0.158300 0.979900 -0.121500
+vn -0.070400 0.996000 0.054000
+vn -0.646700 0.579200 0.496300
+vn -0.624400 0.579200 0.523900
+vn -0.601000 0.579200 0.550700
+vn -0.065400 0.996000 0.059900
+vn -0.576400 0.579200 0.576400
+vn -0.062700 0.996000 0.062700
+vn 0.147100 0.979900 -0.134800
+vn 0.141100 0.979900 -0.141100
+vn 0.435900 0.734900 -0.519500
+vn 0.375900 0.811200 -0.448000
+vn 0.356000 0.811200 -0.463900
+vn 0.412800 0.734900 -0.537900
+vn 0.335400 0.811200 -0.479000
+vn 0.388900 0.734900 -0.555500
+vn 0.568600 0.357200 -0.741000
+vn 0.600400 0.357200 -0.715500
+vn 0.535700 0.357200 -0.765100
+vn 0.630900 0.357200 -0.688600
+vn 0.458100 0.734900 -0.500000
+vn 0.395100 0.811200 -0.431200
+vn -0.057000 0.996000 0.068000
+vn 0.128300 0.979900 -0.152900
+vn 0.134800 0.979900 -0.147100
+vn -0.059900 0.996000 0.065400
+vn -0.550700 0.579200 0.601000
+vn -0.524000 0.579200 0.624400
+vn -0.675500 0.000000 0.737300
+vn -0.496300 0.579200 0.646700
+vn -0.054000 0.996000 0.070400
+vn -0.467500 0.579200 0.667700
+vn -0.050900 0.996000 0.072700
+vn 0.121500 0.979900 -0.158300
+vn 0.114400 0.979900 -0.163500
+vn 0.339000 0.734900 -0.587200
+vn 0.292400 0.811200 -0.506500
+vn 0.270100 0.811200 -0.518700
+vn 0.313100 0.734900 -0.601500
+vn 0.247100 0.811200 -0.530000
+vn 0.286600 0.734900 -0.614600
+vn 0.431300 0.357200 -0.828400
+vn 0.467000 0.357200 -0.808900
+vn 0.394700 0.357200 -0.846500
+vn 0.501800 0.357200 -0.787700
+vn 0.364300 0.734900 -0.571900
+vn 0.314200 0.811200 -0.493200
+vn -0.044400 0.996000 0.076800
+vn 0.099800 0.979900 -0.172800
+vn 0.107200 0.979900 -0.168300
+vn -0.047700 0.996000 0.074800
+vn -0.437900 0.579200 0.687500
+vn -0.407600 0.579200 0.705900
+vn -0.376400 0.579200 0.723000
+vn -0.041000 0.996000 0.078700
+vn -0.344500 0.579200 0.738800
+vn -0.037500 0.996000 0.080400
+vn 0.092100 0.979900 -0.177000
+vn 0.084300 0.979900 -0.180900
+vn 0.231900 0.734900 -0.637200
+vn 0.200000 0.811200 -0.549500
+vn 0.175900 0.811200 -0.557700
+vn 0.203900 0.734900 -0.646700
+vn 0.151300 0.811200 -0.564900
+vn 0.175500 0.734900 -0.655000
+vn 0.280900 0.357200 -0.890700
+vn 0.319400 0.357200 -0.877700
+vn 0.241700 0.357300 -0.902200
+vn 0.357400 0.357200 -0.862900
+vn 0.259500 0.734900 -0.626500
+vn 0.223800 0.811200 -0.540300
+vn -0.030300 0.996000 0.083400
+vn 0.068200 0.979900 -0.187500
+vn 0.076400 0.979900 -0.184400
+vn -0.033900 0.996000 0.082000
+vn -0.311900 0.579200 0.753100
+vn -0.278800 0.579200 0.766000
+vn -0.245100 0.579200 0.777400
+vn -0.026700 0.996000 0.084600
+vn -0.211000 0.579200 0.787400
+vn -0.022900 0.996000 0.085700
+vn 0.060000 0.979900 -0.190300
+vn 0.051600 0.979900 -0.192800
+vn 0.117700 0.734900 -0.667800
+vn 0.101500 0.811200 -0.575900
+vn 0.076400 0.811200 -0.579800
+vn 0.088500 0.734900 -0.672300
+vn 0.051000 0.811200 -0.582600
+vn 0.059100 0.734900 -0.675500
+vn 0.121900 0.357200 -0.926000
+vn 0.162200 0.357200 -0.919800
+vn 0.081400 0.357300 -0.930400
+vn 0.202100 0.357300 -0.911900
+vn 0.146700 0.734900 -0.662000
+vn 0.126500 0.811200 -0.570900
+vn -0.015400 0.996000 0.087400
+vn 0.034600 0.979900 -0.196500
+vn 0.043200 0.979900 -0.194800
+vn -0.019200 0.996000 0.086600
+vn -0.176400 0.579200 0.795800
+vn -0.141500 0.579200 0.802800
+vn -0.106400 0.579200 0.808200
+vn -0.011600 0.996000 0.088000
+vn -0.071000 0.579200 0.812000
+vn -0.007700 0.996000 0.088400
+vn 0.026000 0.979900 -0.197900
+vn 0.017400 0.979900 -0.198800
+vn 0.525100 0.730800 0.436100
+vn 0.450000 0.811800 0.372100
+vn 0.464400 0.812100 0.353200
+vn 0.539000 0.735200 0.410800
+vn 0.743000 0.356900 0.566200
+vn 0.721200 0.351700 0.596900
+vn 0.795600 0.000000 0.605800
+vn 0.771200 0.000000 0.636600
+vn 0.694400 0.337900 0.635200
+vn 0.510800 0.718200 0.472400
+vn 0.639400 0.306400 0.705200
+vn 0.476200 0.688900 0.546400
+vn 0.739900 0.000000 0.672700
+vn 0.678300 0.000000 0.734700
+vn 0.431800 0.810400 0.395800
+vn 0.385600 0.806500 0.448000
+vn -0.421000 0.638400 0.644300
+vn -0.174900 0.794700 0.581300
+vn 0.192500 0.766700 0.612500
+vn 0.268700 0.590700 0.760800
+vn 0.408200 0.222500 0.885300
+vn -0.642300 0.239700 0.728000
+vn 0.455400 0.000000 0.890300
+vn -0.655800 0.000000 0.754900
+vn -0.930200 0.268700 -0.249800
+vn -0.609000 0.792900 0.019600
+vn -0.759300 0.448900 -0.471100
+vn -0.263900 0.956300 -0.125900
+vn -0.950300 0.000000 -0.311300
+vn -0.840900 0.000000 -0.541100
+vn -0.144600 0.962500 0.229500
+vn 0.086600 0.990700 0.104500
+vn -0.091200 0.993700 -0.064900
+vn 0.149800 0.981200 0.121800
+vn 0.131000 0.984600 0.115800
+vn -0.143700 0.985200 -0.093000
+vn -0.681400 0.529600 -0.505100
+vn -0.654200 0.565900 -0.501800
+vn -0.799500 0.000000 -0.600600
+vn -0.792000 0.000000 -0.610500
+vn -0.652900 0.578300 -0.489100
+vn -0.073500 0.995800 -0.054000
+vn -0.800100 0.000000 -0.599900
+vn 0.158500 0.980000 0.120200
+vn -0.786800 0.119800 -0.605500
+vn -0.791700 0.028600 -0.610200
+vn -0.799700 0.031100 -0.599600
+vn -0.793800 0.135700 -0.592800
+vn -0.843400 0.045100 -0.535400
+vn -0.828200 0.196600 -0.524700
+vn -0.761300 0.316900 -0.565700
+vn -0.759000 0.294500 -0.580600
+vn -0.764900 0.405800 -0.500200
+vn -0.766700 0.287500 -0.574000
+vn -0.794800 0.115400 -0.595700
+vn -0.785500 0.286200 -0.548700
+vn -0.814400 0.114600 -0.568900
+vn -0.799800 0.028100 -0.599600
+vn -0.819400 0.028000 -0.572500
+vn -0.525700 0.600400 0.602600
+vn -0.641400 0.201100 0.740400
+vn 0.432100 0.105200 0.895600
+vn 0.419000 0.387300 0.821200
+vn 0.672900 0.045800 0.738300
+vn 0.659500 0.199600 0.724700
+vn 0.403200 0.647100 0.647100
+vn -0.309200 0.885600 0.346600
+vn 0.624200 0.409300 0.665400
+vn -0.711500 0.638800 -0.292700
+vn -0.881700 0.375800 -0.285200
+vn -0.952100 0.100500 -0.288900
+vn 0.765700 0.114200 0.632900
+vn 0.770700 0.027300 0.636600
+vn 0.795300 0.027700 0.605600
+vn 0.790500 0.113600 0.601800
+vn 0.819400 0.028000 0.572500
+vn 0.814400 0.114500 0.568900
+vn 0.762700 0.284700 0.580600
+vn 0.737900 0.287500 0.610500
+vn 0.785700 0.285300 0.548900
+vn 0.700800 0.312500 0.641300
+vn 0.730600 0.133500 0.669600
+vn 0.738400 0.030400 0.673700
+vn 0.860600 0.114400 0.496200
+vn 0.865900 0.028000 0.499300
+vn 0.886700 0.028000 0.461400
+vn 0.881200 0.114400 0.458600
+vn 0.905900 0.028000 0.422400
+vn 0.900300 0.114400 0.419800
+vn 0.850200 0.285300 0.442400
+vn 0.830300 0.285300 0.478700
+vn 0.868600 0.285300 0.405000
+vn 0.808800 0.285300 0.514200
+vn 0.838300 0.114400 0.533000
+vn 0.843600 0.028000 0.536300
+vn 0.933500 0.114400 0.339800
+vn 0.939300 0.028000 0.341900
+vn 0.953300 0.028000 0.300600
+vn 0.947400 0.114400 0.298700
+vn 0.965500 0.028000 0.258700
+vn 0.959600 0.114400 0.257100
+vn 0.914000 0.285300 0.288200
+vn 0.900600 0.285300 0.327800
+vn 0.925700 0.285300 0.248100
+vn 0.885500 0.285300 0.366700
+vn 0.917800 0.114400 0.380100
+vn 0.923500 0.028000 0.382500
+vn 0.978300 0.114400 0.172500
+vn 0.984400 0.028000 0.173600
+vn 0.991000 0.028000 0.130500
+vn 0.984900 0.114400 0.129700
+vn 0.995800 0.028000 0.087100
+vn 0.989600 0.114400 0.086600
+vn 0.950200 0.285300 0.125100
+vn 0.943800 0.285300 0.166400
+vn 0.954800 0.285300 0.083500
+vn 0.935700 0.285300 0.207400
+vn 0.969900 0.114400 0.215000
+vn 0.975900 0.028000 0.216300
+vn 0.993400 0.114400 0.000000
+vn 0.999600 0.028000 0.000000
+vn 0.998700 0.028000 -0.043500
+vn 0.992500 0.114400 -0.043300
+vn 0.995800 0.028000 -0.087100
+vn 0.989600 0.114400 -0.086600
+vn 0.957500 0.285300 -0.041700
+vn 0.958400 0.285300 0.000000
+vn 0.954800 0.285300 -0.083500
+vn 0.957500 0.285300 0.041700
+vn 0.992500 0.114400 0.043300
+vn 0.998700 0.028000 0.043500
+vn 0.978300 0.114400 -0.172500
+vn 0.984400 0.028000 -0.173600
+vn 0.975900 0.028000 -0.216300
+vn 0.969900 0.114400 -0.215000
+vn 0.965500 0.028000 -0.258700
+vn 0.959600 0.114400 -0.257100
+vn 0.935700 0.285300 -0.207400
+vn 0.943800 0.285300 -0.166400
+vn 0.925700 0.285300 -0.248100
+vn 0.950200 0.285300 -0.125100
+vn 0.984900 0.114400 -0.129700
+vn 0.991000 0.028000 -0.130500
+vn 0.933500 0.114400 -0.339800
+vn 0.939300 0.028000 -0.341900
+vn 0.923500 0.028000 -0.382500
+vn 0.917800 0.114400 -0.380100
+vn 0.905900 0.028000 -0.422400
+vn 0.900300 0.114400 -0.419800
+vn 0.885500 0.285300 -0.366700
+vn 0.900600 0.285300 -0.327800
+vn 0.868600 0.285300 -0.405000
+vn 0.914000 0.285300 -0.288200
+vn 0.947400 0.114400 -0.298700
+vn 0.953300 0.028000 -0.300600
+vn 0.860300 0.114400 -0.496700
+vn 0.865700 0.028000 -0.499800
+vn 0.843100 0.028000 -0.537000
+vn 0.837900 0.114400 -0.533700
+vn 0.818800 0.028000 -0.573400
+vn 0.813700 0.114400 -0.569800
+vn 0.808300 0.285300 -0.514900
+vn 0.830000 0.285300 -0.479200
+vn 0.785100 0.285300 -0.549700
+vn 0.850100 0.285300 -0.442600
+vn 0.881200 0.114400 -0.458700
+vn 0.886600 0.028000 -0.461600
+vn 0.761000 0.114400 -0.638500
+vn 0.765700 0.028000 -0.642500
+vn 0.737000 0.028000 -0.675300
+vn 0.732400 0.114400 -0.671100
+vn 0.706800 0.028000 -0.706800
+vn 0.702400 0.114400 -0.702400
+vn 0.706600 0.285300 -0.647500
+vn 0.734200 0.285300 -0.616000
+vn 0.677700 0.285300 -0.677700
+vn 0.760300 0.285300 -0.583500
+vn 0.788100 0.114400 -0.604800
+vn 0.793000 0.028000 -0.608500
+vn 0.638500 0.114400 -0.761000
+vn 0.642500 0.028000 -0.765700
+vn 0.608500 0.028000 -0.793000
+vn 0.604800 0.114400 -0.788100
+vn 0.573300 0.028000 -0.818800
+vn 0.569800 0.114400 -0.813700
+vn 0.583500 0.285300 -0.760300
+vn 0.616000 0.285300 -0.734200
+vn 0.549700 0.285300 -0.785100
+vn 0.647500 0.285300 -0.706600
+vn 0.671100 0.114400 -0.732400
+vn 0.675300 0.028000 -0.737000
+vn 0.496700 0.114400 -0.860300
+vn 0.499800 0.028000 -0.865700
+vn 0.461600 0.028000 -0.886600
+vn 0.458700 0.114400 -0.881200
+vn 0.422400 0.028000 -0.905900
+vn 0.419800 0.114400 -0.900300
+vn 0.442600 0.285300 -0.850100
+vn 0.479200 0.285300 -0.830000
+vn 0.405000 0.285300 -0.868600
+vn 0.514900 0.285300 -0.808300
+vn 0.533700 0.114400 -0.837900
+vn 0.537000 0.028000 -0.843100
+vn 0.339800 0.114400 -0.933500
+vn 0.341900 0.028000 -0.939300
+vn 0.300600 0.028000 -0.953300
+vn 0.298700 0.114400 -0.947400
+vn 0.258700 0.028000 -0.965500
+vn 0.257100 0.114400 -0.959600
+vn 0.288200 0.285300 -0.914000
+vn 0.327800 0.285300 -0.900600
+vn 0.248100 0.285300 -0.925700
+vn 0.366700 0.285300 -0.885500
+vn 0.380100 0.114400 -0.917800
+vn 0.382500 0.028000 -0.923500
+vn 0.172500 0.114400 -0.978300
+vn 0.173600 0.028000 -0.984400
+vn 0.130500 0.028000 -0.991000
+vn 0.129700 0.114400 -0.984900
+vn 0.087100 0.028000 -0.995800
+vn 0.086600 0.114400 -0.989600
+vn 0.125100 0.285300 -0.950200
+vn 0.166400 0.285300 -0.943800
+vn 0.083500 0.285300 -0.954800
+vn 0.207400 0.285300 -0.935700
+vn 0.215000 0.114400 -0.969900
+vn 0.216300 0.028000 -0.975900
+vn -0.172500 0.114600 0.978300
+vn -0.173600 0.028000 0.984400
+vn -0.216300 0.028000 0.975900
+vn -0.214900 0.114600 0.969800
+vn -0.258700 0.028000 0.965500
+vn -0.257100 0.114600 0.959500
+vn -0.207300 0.286200 0.935500
+vn -0.166400 0.286200 0.943600
+vn -0.248000 0.286200 0.925500
+vn -0.125100 0.286200 0.949900
+vn -0.129700 0.114600 0.984900
+vn -0.083500 0.286200 0.954500
+vn -0.086600 0.114600 0.989600
+vn -0.130500 0.028000 0.991000
+vn -0.087100 0.028000 0.995800
+vn -0.339800 0.114600 0.933500
+vn -0.341900 0.028000 0.939300
+vn -0.382500 0.028000 0.923500
+vn -0.380100 0.114600 0.917800
+vn -0.422400 0.028000 0.905900
+vn -0.419800 0.114600 0.900300
+vn -0.366600 0.286200 0.885200
+vn -0.327700 0.286200 0.900400
+vn -0.404900 0.286200 0.868400
+vn -0.288200 0.286200 0.913800
+vn -0.298700 0.114600 0.947400
+vn -0.300600 0.028000 0.953300
+vn -0.496700 0.114600 0.860300
+vn -0.499800 0.028000 0.865700
+vn -0.537000 0.028000 0.843100
+vn -0.533700 0.114600 0.837800
+vn -0.573400 0.028000 0.818800
+vn -0.569800 0.114600 0.813700
+vn -0.514800 0.286200 0.808100
+vn -0.479100 0.286200 0.829800
+vn -0.549500 0.286200 0.784900
+vn -0.442500 0.286200 0.849900
+vn -0.458700 0.114600 0.881100
+vn -0.461600 0.028000 0.886600
+vn -0.638500 0.114600 0.761000
+vn -0.642500 0.028000 0.765700
+vn -0.675300 0.028000 0.737000
+vn -0.671100 0.114600 0.732400
+vn -0.706800 0.028000 0.706800
+vn -0.702400 0.114600 0.702400
+vn -0.647300 0.286200 0.706400
+vn -0.615900 0.286200 0.734000
+vn -0.677500 0.286200 0.677500
+vn -0.583300 0.286200 0.760100
+vn -0.604800 0.114600 0.788100
+vn -0.608500 0.028000 0.793000
+vn -0.761000 0.114600 0.638500
+vn -0.765700 0.028000 0.642500
+vn -0.793000 0.028000 0.608500
+vn -0.788100 0.114600 0.604800
+vn -0.818800 0.028000 0.573400
+vn -0.813700 0.114700 0.569800
+vn -0.760100 0.286200 0.583300
+vn -0.734000 0.286200 0.615900
+vn -0.784900 0.286200 0.549500
+vn -0.706400 0.286200 0.647300
+vn -0.732400 0.114600 0.671100
+vn -0.737000 0.028000 0.675300
+vn -0.860300 0.114600 0.496700
+vn -0.865700 0.028000 0.499800
+vn -0.886600 0.028000 0.461600
+vn -0.881100 0.114600 0.458700
+vn -0.905900 0.028000 0.422400
+vn -0.900300 0.114700 0.419800
+vn -0.849800 0.286200 0.442500
+vn -0.829800 0.286200 0.479000
+vn -0.868400 0.286200 0.404900
+vn -0.808100 0.286200 0.514800
+vn -0.837800 0.114600 0.533700
+vn -0.843100 0.028000 0.537000
+vn -0.933500 0.114600 0.339800
+vn -0.939300 0.028000 0.341900
+vn -0.953300 0.028000 0.300600
+vn -0.947400 0.114600 0.298700
+vn -0.965500 0.028000 0.258700
+vn -0.959500 0.114600 0.257100
+vn -0.913800 0.286200 0.288200
+vn -0.900400 0.286200 0.327700
+vn -0.925500 0.286200 0.248000
+vn -0.885200 0.286200 0.366600
+vn -0.917800 0.114600 0.380100
+vn -0.923500 0.028000 0.382500
+vn -0.978300 0.114600 0.172500
+vn -0.984400 0.028000 0.173600
+vn -0.991000 0.028000 0.130500
+vn -0.984900 0.114600 0.129700
+vn -0.995800 0.028000 0.087100
+vn -0.989600 0.114600 0.086600
+vn -0.949900 0.286200 0.125100
+vn -0.943600 0.286200 0.166400
+vn -0.954500 0.286200 0.083500
+vn -0.935500 0.286200 0.207300
+vn -0.969800 0.114600 0.215000
+vn -0.975900 0.028000 0.216300
+vn -0.993400 0.114600 0.000000
+vn -0.999600 0.028000 0.000000
+vn -0.998700 0.028000 -0.043500
+vn -0.992500 0.114600 -0.043300
+vn -0.995800 0.028000 -0.087100
+vn -0.989600 0.114600 -0.086600
+vn -0.957200 0.286200 -0.041700
+vn -0.958100 0.286200 0.000000
+vn -0.954500 0.286200 -0.083500
+vn -0.957200 0.286200 0.041700
+vn -0.992500 0.114600 0.043300
+vn -0.998700 0.028000 0.043500
+vn -0.978300 0.114600 -0.172500
+vn -0.984400 0.028000 -0.173600
+vn -0.975900 0.028000 -0.216300
+vn -0.969800 0.114700 -0.214900
+vn -0.965500 0.028000 -0.258700
+vn -0.959500 0.114600 -0.257100
+vn -0.935500 0.286200 -0.207300
+vn -0.943600 0.286200 -0.166400
+vn -0.925500 0.286200 -0.248000
+vn -0.949900 0.286200 -0.125100
+vn -0.984900 0.114600 -0.129700
+vn -0.991000 0.028000 -0.130500
+vn -0.933500 0.114600 -0.339800
+vn -0.939300 0.028000 -0.341900
+vn -0.923500 0.028000 -0.382500
+vn -0.917800 0.114600 -0.380100
+vn -0.905900 0.028000 -0.422400
+vn -0.900300 0.114600 -0.419800
+vn -0.885200 0.286200 -0.366600
+vn -0.900400 0.286200 -0.327700
+vn -0.868400 0.286200 -0.404900
+vn -0.913800 0.286200 -0.288200
+vn -0.947400 0.114600 -0.298700
+vn -0.953300 0.028000 -0.300600
+vn -0.860600 0.114600 -0.496200
+vn -0.865900 0.028000 -0.499300
+vn -0.843600 0.028000 -0.536300
+vn -0.838300 0.114600 -0.532900
+vn -0.808600 0.286200 -0.514100
+vn -0.830000 0.286200 -0.478600
+vn -0.849900 0.286200 -0.442300
+vn -0.881200 0.114600 -0.458600
+vn -0.886700 0.028000 -0.461400
+vn 0.000000 0.093200 0.995600
+vn -0.043400 0.093200 0.994700
+vn -0.043500 0.012800 0.999000
+vn 0.000000 0.012800 0.999900
+vn -0.043500 0.000000 0.999000
+vn 0.000000 0.000000 1.000000
+vn 0.043500 0.012800 0.999000
+vn 0.043400 0.093200 0.994700
+vn 0.087100 0.012800 0.996100
+vn 0.086800 0.093200 0.991900
+vn 0.043500 0.000000 0.999000
+vn 0.087100 0.000000 0.996200
+vn 0.039400 0.425000 0.904300
+vn 0.000000 0.425000 0.905200
+vn 0.025400 0.812300 0.582700
+vn 0.000000 0.812300 0.583200
+vn 0.078900 0.425000 0.901700
+vn 0.050800 0.812300 0.581000
+vn -0.039400 0.425000 0.904300
+vn -0.025400 0.812300 0.582700
+vn 0.172900 0.093200 0.980500
+vn 0.130000 0.093200 0.987100
+vn 0.130500 0.012800 0.991300
+vn 0.173600 0.012800 0.984700
+vn 0.130600 0.000000 0.991400
+vn 0.173600 0.000000 0.984800
+vn 0.216400 0.012800 0.976200
+vn 0.215400 0.093200 0.972000
+vn 0.258800 0.012800 0.965800
+vn 0.257700 0.093200 0.961700
+vn 0.216400 0.000000 0.976300
+vn 0.258800 0.000000 0.965900
+vn 0.195900 0.425000 0.883700
+vn 0.157200 0.425000 0.891400
+vn 0.126200 0.812300 0.569400
+vn 0.101300 0.812300 0.574400
+vn 0.234300 0.425000 0.874300
+vn 0.150900 0.812300 0.563300
+vn 0.118200 0.425000 0.897400
+vn 0.076100 0.812300 0.578200
+vn 0.340500 0.093200 0.935600
+vn 0.299400 0.093200 0.949500
+vn 0.300700 0.012800 0.953600
+vn 0.342000 0.012800 0.939600
+vn 0.300700 0.000000 0.953700
+vn 0.342000 0.000000 0.939700
+vn 0.382600 0.012800 0.923800
+vn 0.381000 0.093200 0.919900
+vn 0.422600 0.012800 0.906200
+vn 0.420800 0.093200 0.902300
+vn 0.382600 0.000000 0.923900
+vn 0.422600 0.000000 0.906300
+vn 0.346400 0.425000 0.836300
+vn 0.309600 0.425000 0.850600
+vn 0.223200 0.812300 0.538800
+vn 0.199500 0.812300 0.548000
+vn 0.382500 0.425000 0.820400
+vn 0.246500 0.812300 0.528600
+vn 0.272200 0.425000 0.863300
+vn 0.175400 0.812300 0.556200
+vn 0.497800 0.093200 0.862200
+vn 0.459800 0.093200 0.883100
+vn 0.461700 0.012800 0.886900
+vn 0.500000 0.012800 0.865900
+vn 0.461800 0.000000 0.887000
+vn 0.500000 0.000000 0.866000
+vn 0.537200 0.012800 0.843300
+vn 0.534900 0.093200 0.839700
+vn 0.573500 0.012800 0.819100
+vn 0.571100 0.093200 0.815600
+vn 0.537200 0.000000 0.843400
+vn 0.573600 0.000000 0.819100
+vn 0.486300 0.425000 0.763400
+vn 0.452600 0.425000 0.783900
+vn 0.313300 0.812300 0.491900
+vn 0.291600 0.812300 0.505100
+vn 0.519200 0.425000 0.741500
+vn 0.334500 0.812300 0.477700
+vn 0.418000 0.425000 0.802900
+vn 0.269300 0.812300 0.517300
+vn 0.640000 0.093200 0.762700
+vn 0.606100 0.093200 0.789800
+vn 0.608700 0.012800 0.793200
+vn 0.642700 0.012800 0.766000
+vn 0.608800 0.000000 0.793300
+vn 0.642800 0.000000 0.766000
+vn 0.675500 0.012800 0.737200
+vn 0.672600 0.093200 0.734100
+vn 0.707000 0.012800 0.707000
+vn 0.704000 0.093200 0.704000
+vn 0.675600 0.000000 0.737300
+vn 0.707100 0.000000 0.707100
+vn 0.611500 0.425000 0.667400
+vn 0.581800 0.425000 0.693400
+vn 0.394000 0.812300 0.430000
+vn 0.374900 0.812300 0.446800
+vn 0.640100 0.425000 0.640100
+vn 0.412400 0.812300 0.412400
+vn 0.551000 0.425000 0.718100
+vn 0.355100 0.812300 0.462700
+vn 0.762700 0.093200 0.640000
+vn 0.734100 0.093200 0.672600
+vn 0.737200 0.012800 0.675500
+vn 0.766000 0.012800 0.642700
+vn 0.737300 0.000000 0.675600
+vn 0.793200 0.012800 0.608700
+vn 0.789800 0.093200 0.606100
+vn 0.819100 0.012800 0.573500
+vn 0.815600 0.093200 0.571100
+vn 0.793300 0.000000 0.608800
+vn 0.819100 0.000000 0.573600
+vn 0.718100 0.425000 0.551000
+vn 0.693400 0.425000 0.581800
+vn 0.462700 0.812300 0.355100
+vn 0.446800 0.812300 0.374900
+vn 0.741500 0.425000 0.519200
+vn 0.477700 0.812300 0.334500
+vn 0.667400 0.425000 0.611500
+vn 0.430000 0.812300 0.394000
+vn 0.862200 0.093200 0.497800
+vn 0.839700 0.093200 0.534900
+vn 0.843300 0.012800 0.537200
+vn 0.865900 0.012800 0.500000
+vn 0.843400 0.000000 0.537200
+vn 0.866000 0.000000 0.500000
+vn 0.886900 0.012800 0.461700
+vn 0.883100 0.093200 0.459800
+vn 0.906200 0.012800 0.422600
+vn 0.902300 0.093200 0.420800
+vn 0.887000 0.000000 0.461800
+vn 0.802900 0.425000 0.418000
+vn 0.783900 0.425000 0.452600
+vn 0.517300 0.812300 0.269300
+vn 0.505100 0.812300 0.291600
+vn 0.820400 0.425000 0.382500
+vn 0.528600 0.812300 0.246500
+vn 0.763400 0.425000 0.486300
+vn 0.491900 0.812300 0.313300
+vn 0.935600 0.093200 0.340500
+vn 0.919900 0.093200 0.381000
+vn 0.923800 0.012800 0.382600
+vn 0.939600 0.012800 0.342000
+vn 0.953600 0.012800 0.300700
+vn 0.949600 0.093200 0.299400
+vn 0.965800 0.012800 0.258800
+vn 0.961700 0.093200 0.257700
+vn 0.863300 0.425000 0.272200
+vn 0.850600 0.425000 0.309600
+vn 0.556200 0.812300 0.175400
+vn 0.548100 0.812300 0.199500
+vn 0.874300 0.425000 0.234300
+vn 0.563300 0.812300 0.150900
+vn 0.836300 0.425000 0.346400
+vn 0.538800 0.812300 0.223200
+vn 0.980500 0.093200 0.172900
+vn 0.972000 0.093200 0.215400
+vn 0.976200 0.012800 0.216400
+vn 0.984700 0.012800 0.173600
+vn 0.991300 0.012800 0.130500
+vn 0.987100 0.093200 0.130000
+vn 0.996100 0.012800 0.087100
+vn 0.991900 0.093200 0.086800
+vn 0.897400 0.425000 0.118200
+vn 0.891400 0.425000 0.157200
+vn 0.578200 0.812300 0.076100
+vn 0.574400 0.812300 0.101300
+vn 0.901700 0.425000 0.078900
+vn 0.581000 0.812300 0.050800
+vn 0.883700 0.425000 0.195900
+vn 0.569400 0.812300 0.126200
+vn 0.995600 0.093200 0.000000
+vn 0.994700 0.093200 0.043400
+vn 0.999000 0.012800 0.043500
+vn 0.999900 0.012800 0.000000
+vn 0.999000 0.012800 -0.043500
+vn 0.994700 0.093200 -0.043400
+vn 0.996100 0.012800 -0.087100
+vn 0.991900 0.093200 -0.086800
+vn 0.904300 0.425000 -0.039400
+vn 0.905200 0.425000 0.000000
+vn 0.582700 0.812300 -0.025400
+vn 0.583200 0.812300 0.000000
+vn 0.901700 0.425000 -0.078900
+vn 0.581000 0.812300 -0.050800
+vn 0.904300 0.425000 0.039400
+vn 0.582600 0.812300 0.025400
+vn 0.980500 0.093200 -0.172900
+vn 0.987100 0.093200 -0.130000
+vn 0.991300 0.012800 -0.130500
+vn 0.984700 0.012800 -0.173600
+vn 0.976200 0.012800 -0.216400
+vn 0.972000 0.093200 -0.215400
+vn 0.965800 0.012800 -0.258800
+vn 0.961700 0.093200 -0.257700
+vn 0.883700 0.425000 -0.195900
+vn 0.891400 0.425000 -0.157200
+vn 0.569400 0.812300 -0.126200
+vn 0.574400 0.812300 -0.101300
+vn 0.874300 0.425000 -0.234300
+vn 0.563300 0.812300 -0.150900
+vn 0.897400 0.425000 -0.118200
+vn 0.578200 0.812300 -0.076100
+vn 0.935600 0.093200 -0.340500
+vn 0.949600 0.093200 -0.299400
+vn 0.953600 0.012800 -0.300700
+vn 0.939600 0.012800 -0.342000
+vn 0.923800 0.012800 -0.382600
+vn 0.919900 0.093200 -0.381000
+vn 0.906200 0.012800 -0.422600
+vn 0.902300 0.093200 -0.420800
+vn 0.836300 0.425000 -0.346400
+vn 0.850600 0.425000 -0.309600
+vn 0.538800 0.812300 -0.223200
+vn 0.548000 0.812300 -0.199500
+vn 0.820400 0.425000 -0.382500
+vn 0.528600 0.812300 -0.246500
+vn 0.863200 0.425000 -0.272200
+vn 0.556200 0.812300 -0.175400
+vn 0.862500 0.093200 -0.497400
+vn 0.883200 0.093200 -0.459600
+vn 0.887000 0.012800 -0.461600
+vn 0.866200 0.012800 -0.499500
+vn 0.887100 0.000000 -0.461600
+vn 0.866300 0.000000 -0.499500
+vn 0.843800 0.012800 -0.536500
+vn 0.840200 0.093200 -0.534200
+vn 0.819700 0.012800 -0.572600
+vn 0.816200 0.093200 -0.570200
+vn 0.843900 0.000000 -0.536500
+vn 0.819800 0.000000 -0.572700
+vn 0.763800 0.425000 -0.485600
+vn 0.784100 0.425000 -0.452200
+vn 0.492100 0.812300 -0.312900
+vn 0.505200 0.812300 -0.291300
+vn 0.742000 0.425000 -0.518400
+vn 0.478100 0.812300 -0.334000
+vn 0.802900 0.425000 -0.417900
+vn 0.517300 0.812300 -0.269200
+vn 0.701400 0.091700 -0.706800
+vn 0.755900 0.093000 -0.648000
+vn 0.759000 0.012800 -0.650900
+vn 0.703400 0.012500 -0.710700
+vn 0.759000 0.000000 -0.651000
+vn 0.703100 0.000000 -0.711100
+vn 0.762700 0.093400 -0.640000
+vn 0.766000 0.012800 -0.642700
+vn 0.246600 0.011200 -0.969100
+vn 0.249700 0.083100 -0.964700
+vn -0.378700 0.006700 -0.925500
+vn -0.375900 0.050900 -0.925200
+vn 0.245100 0.000000 -0.969500
+vn -0.379400 0.000000 -0.925200
+vn 0.227500 0.375500 -0.898500
+vn 0.633000 0.426200 -0.646200
+vn 0.061100 0.727800 -0.683000
+vn 0.393700 0.812900 -0.429100
+vn -0.367000 0.241200 -0.898400
+vn -0.366800 0.464600 -0.806000
+vn 0.686200 0.426600 -0.589100
+vn 0.692800 0.426700 -0.581300
+vn 0.439200 0.814100 -0.380000
+vn 0.444900 0.814000 -0.373300
+vn 0.000000 0.999400 0.033800
+vn -0.001500 0.999400 0.033800
+vn -0.009800 0.974500 0.224100
+vn 0.000000 0.974500 0.224300
+vn 0.009800 0.974500 0.224100
+vn 0.001500 0.999400 0.033800
+vn 0.019500 0.974500 0.223500
+vn 0.002900 0.999400 0.033700
+vn 0.000200 1.000000 0.004300
+vn 0.000000 1.000000 0.004300
+vn 0.000400 1.000000 0.004200
+vn -0.000200 1.000000 0.004300
+vn 0.005900 0.999400 0.033300
+vn 0.004400 0.999400 0.033500
+vn 0.029300 0.974500 0.222400
+vn 0.038900 0.974500 0.220900
+vn 0.048500 0.974500 0.219000
+vn 0.007300 0.999400 0.033000
+vn 0.058000 0.974500 0.216700
+vn 0.008800 0.999400 0.032700
+vn 0.000900 1.000000 0.004200
+vn 0.000700 1.000000 0.004200
+vn 0.001100 1.000000 0.004100
+vn 0.000500 1.000000 0.004200
+vn 0.011600 0.999400 0.031800
+vn 0.010200 0.999400 0.032300
+vn 0.067400 0.974500 0.213900
+vn 0.076700 0.974500 0.210800
+vn 0.085800 0.974500 0.207300
+vn 0.012900 0.999400 0.031300
+vn 0.094800 0.974500 0.203300
+vn 0.014300 0.999400 0.030700
+vn 0.001600 1.000000 0.003900
+vn 0.001500 1.000000 0.004000
+vn 0.001800 1.000000 0.003900
+vn 0.001300 1.000000 0.004100
+vn 0.016900 0.999400 0.029300
+vn 0.015600 0.999400 0.030000
+vn 0.103600 0.974500 0.199000
+vn 0.112200 0.974500 0.194300
+vn 0.120500 0.974500 0.189200
+vn 0.018200 0.999400 0.028500
+vn 0.128700 0.974500 0.183800
+vn 0.019400 0.999400 0.027700
+vn 0.002300 1.000000 0.003600
+vn 0.002100 1.000000 0.003700
+vn 0.002400 1.000000 0.003500
+vn 0.002000 1.000000 0.003800
+vn 0.021800 0.999400 0.025900
+vn 0.020600 0.999400 0.026900
+vn 0.136600 0.974500 0.178000
+vn 0.144200 0.974500 0.171800
+vn 0.151500 0.974500 0.165400
+vn 0.022900 0.999400 0.024900
+vn 0.158600 0.974500 0.158600
+vn 0.023900 0.999400 0.023900
+vn 0.002900 1.000000 0.003100
+vn 0.002700 1.000000 0.003300
+vn 0.003000 1.000000 0.003000
+vn 0.002600 1.000000 0.003400
+vn 0.025900 0.999400 0.021800
+vn 0.024900 0.999400 0.022900
+vn 0.165400 0.974500 0.151500
+vn 0.171800 0.974500 0.144200
+vn 0.178000 0.974500 0.136600
+vn 0.026900 0.999400 0.020600
+vn 0.183800 0.974500 0.128700
+vn 0.027700 0.999400 0.019400
+vn 0.003400 1.000000 0.002600
+vn 0.003300 1.000000 0.002700
+vn 0.003500 1.000000 0.002400
+vn 0.003100 1.000000 0.002900
+vn 0.029300 0.999400 0.016900
+vn 0.028500 0.999400 0.018200
+vn 0.189200 0.974500 0.120500
+vn 0.194300 0.974500 0.112200
+vn 0.199000 0.974500 0.103600
+vn 0.030000 0.999400 0.015600
+vn 0.203300 0.974500 0.094800
+vn 0.030700 0.999400 0.014300
+vn 0.003800 1.000000 0.002000
+vn 0.003700 1.000000 0.002100
+vn 0.003900 1.000000 0.001800
+vn 0.003600 1.000000 0.002300
+vn 0.031800 0.999400 0.011600
+vn 0.031300 0.999400 0.012900
+vn 0.207300 0.974500 0.085800
+vn 0.210800 0.974500 0.076700
+vn 0.213900 0.974500 0.067400
+vn 0.032300 0.999400 0.010200
+vn 0.216700 0.974500 0.058000
+vn 0.032700 0.999400 0.008800
+vn 0.004100 1.000000 0.001300
+vn 0.004000 1.000000 0.001400
+vn 0.004100 1.000000 0.001100
+vn 0.003900 1.000000 0.001600
+vn 0.033300 0.999400 0.005900
+vn 0.033100 0.999400 0.007300
+vn 0.219000 0.974500 0.048500
+vn 0.220900 0.974500 0.038900
+vn 0.222400 0.974500 0.029300
+vn 0.033500 0.999400 0.004400
+vn 0.223500 0.974500 0.019500
+vn 0.033700 0.999400 0.002900
+vn 0.004200 1.000000 0.000500
+vn 0.004200 1.000000 0.000700
+vn 0.004200 1.000000 0.000400
+vn 0.004200 1.000000 0.000900
+vn 0.033800 0.999400 0.000000
+vn 0.033800 0.999400 0.001500
+vn 0.224100 0.974500 0.009800
+vn 0.224300 0.974500 0.000000
+vn 0.224100 0.974500 -0.009800
+vn 0.033800 0.999400 -0.001500
+vn 0.223500 0.974500 -0.019500
+vn 0.033700 0.999400 -0.002900
+vn 0.004300 1.000000 -0.000200
+vn 0.004300 1.000000 0.000000
+vn 0.004200 1.000000 -0.000400
+vn 0.004300 1.000000 0.000200
+vn 0.033300 0.999400 -0.005900
+vn 0.033500 0.999400 -0.004400
+vn 0.222400 0.974500 -0.029300
+vn 0.220900 0.974500 -0.038900
+vn 0.219000 0.974500 -0.048500
+vn 0.033100 0.999400 -0.007300
+vn 0.216700 0.974500 -0.058000
+vn 0.032700 0.999400 -0.008800
+vn 0.004200 1.000000 -0.000900
+vn 0.004200 1.000000 -0.000700
+vn 0.004100 1.000000 -0.001100
+vn 0.004200 1.000000 -0.000500
+vn 0.031800 0.999400 -0.011600
+vn 0.032300 0.999400 -0.010200
+vn 0.213900 0.974500 -0.067400
+vn 0.210800 0.974500 -0.076700
+vn 0.207300 0.974500 -0.085800
+vn 0.031300 0.999400 -0.012900
+vn 0.203300 0.974500 -0.094800
+vn 0.030700 0.999400 -0.014300
+vn 0.003900 1.000000 -0.001600
+vn 0.004000 1.000000 -0.001500
+vn 0.003900 1.000000 -0.001800
+vn 0.004100 1.000000 -0.001300
+vn 0.029300 0.999400 -0.016900
+vn 0.030000 0.999400 -0.015600
+vn 0.199000 0.974500 -0.103500
+vn 0.194300 0.974500 -0.112000
+vn 0.189300 0.974500 -0.120300
+vn 0.028600 0.999400 -0.018200
+vn 0.183900 0.974500 -0.128500
+vn 0.027700 0.999400 -0.019400
+vn 0.003600 1.000000 -0.002300
+vn 0.003700 1.000000 -0.002100
+vn 0.003500 1.000000 -0.002400
+vn 0.003800 1.000000 -0.002000
+vn -0.018900 0.997700 -0.065400
+vn 0.020400 0.999400 -0.026600
+vn 0.165000 0.975100 -0.148200
+vn 0.125600 0.973600 -0.190400
+vn 0.025600 0.999400 -0.021500
+vn 0.170000 0.975000 -0.142700
+vn -0.166800 0.870700 -0.462600
+vn -0.301900 0.887900 -0.347100
+vn -0.504000 0.494900 -0.707800
+vn -0.597300 0.494600 -0.631300
+vn -0.326100 0.884900 -0.332500
+vn -0.042500 0.997900 -0.048600
+vn -0.335100 0.880200 -0.336000
+vn -0.047200 0.997700 -0.047600
+vn -0.614600 0.488000 -0.619700
+vn -0.620800 0.477400 -0.621800
+vn -0.002100 0.999900 -0.008100
+vn 0.003200 1.000000 -0.002700
+vn -0.005500 0.999900 -0.005600
+vn -0.694000 0.033600 -0.719200
+vn -0.681100 0.184000 -0.708600
+vn -0.591000 0.199500 -0.781500
+vn -0.610400 0.037400 -0.791200
+vn -0.612500 0.004900 -0.790400
+vn -0.694300 0.004500 -0.719700
+vn -0.612800 0.000000 -0.790200
+vn -0.694300 0.000000 -0.719700
+vn -0.705500 0.004500 -0.708700
+vn -0.705100 0.033400 -0.708300
+vn -0.707100 0.004400 -0.707100
+vn -0.706700 0.032500 -0.706800
+vn -0.705500 0.000000 -0.708700
+vn -0.707100 0.000000 -0.707100
+vn -0.693700 0.179800 -0.697400
+vn -0.696000 0.174600 -0.696500
+vn -0.706600 0.025200 -0.707200
+vn -0.700000 0.120900 -0.703800
+vn -0.697400 0.157600 -0.699100
+vn -0.706600 0.030200 -0.706900
+vn -0.663200 0.316400 -0.678200
+vn -0.633300 0.437100 -0.638700
+vn -0.707100 0.004200 -0.707100
+vn -0.707100 0.003700 -0.707100
+vn -0.707000 0.002900 -0.707100
+vn -0.706500 0.018500 -0.707400
+vn -0.707000 0.002000 -0.707200
+vn -0.706500 0.011400 -0.707600
+vn -0.702600 0.072700 -0.707800
+vn -0.687500 0.157800 -0.708800
+vn -0.703800 0.034000 -0.709600
+vn -0.687200 0.058500 -0.724100
+vn -0.055100 0.991600 -0.117200
+vn 0.025800 0.998800 -0.042100
+vn 0.002700 0.999900 -0.014300
+vn -0.046500 0.996900 -0.062900
+vn 0.037400 0.998800 -0.031400
+vn 0.009300 0.999900 -0.007800
+vn -0.354300 0.860100 -0.366900
+vn -0.406400 0.794400 -0.451300
+vn -0.488600 0.638000 -0.595200
+vn -0.072800 0.972000 -0.223600
+vn -0.513700 0.431900 -0.741200
+vn -0.054000 0.899900 -0.432600
+vn 0.071200 0.992400 -0.100000
+vn 0.095100 0.992200 -0.079700
+vn 0.196600 0.952300 -0.233200
+vn 0.238300 0.950300 -0.200000
+vn 0.042100 0.998800 -0.024300
+vn 0.043100 0.998800 -0.022400
+vn 0.010700 0.999900 -0.005500
+vn 0.010400 0.999900 -0.006000
+vn 0.044000 0.998800 -0.020500
+vn 0.010900 0.999900 -0.005100
+vn 0.010100 0.999900 -0.006400
+vn 0.041000 0.998800 -0.026100
+vn 0.009800 0.999900 -0.006900
+vn 0.039800 0.998800 -0.027800
+vn 0.104200 0.992300 -0.066300
+vn 0.107000 0.992300 -0.061700
+vn 0.261300 0.950800 -0.166100
+vn 0.268300 0.950800 -0.154700
+vn 0.101200 0.992300 -0.070700
+vn 0.253800 0.950800 -0.177300
+vn 0.109600 0.992300 -0.057000
+vn 0.111900 0.992300 -0.052200
+vn 0.274700 0.950800 -0.142900
+vn 0.280600 0.950800 -0.130900
+vn 0.045600 0.998800 -0.016600
+vn 0.046300 0.998800 -0.014600
+vn 0.011400 0.999900 -0.003600
+vn 0.011300 0.999900 -0.004100
+vn 0.046900 0.998800 -0.012500
+vn 0.011600 0.999900 -0.003100
+vn 0.011100 0.999900 -0.004600
+vn 0.044900 0.998800 -0.018600
+vn 0.114100 0.992300 -0.047200
+vn 0.116100 0.992300 -0.042200
+vn 0.286100 0.950800 -0.118500
+vn 0.291000 0.950800 -0.105900
+vn 0.117800 0.992300 -0.037100
+vn 0.119300 0.992300 -0.032000
+vn 0.295300 0.950800 -0.093100
+vn 0.299100 0.950800 -0.080100
+vn 0.047800 0.998800 -0.008400
+vn 0.048200 0.998800 -0.006300
+vn 0.011900 0.999900 -0.001600
+vn 0.011800 0.999900 -0.002100
+vn 0.048400 0.998800 -0.004200
+vn 0.012000 0.999900 -0.001000
+vn 0.011700 0.999900 -0.002600
+vn 0.047400 0.998800 -0.010500
+vn 0.120600 0.992300 -0.026700
+vn 0.121600 0.992300 -0.021400
+vn 0.302300 0.950800 -0.067000
+vn 0.304900 0.950800 -0.053700
+vn 0.122400 0.992300 -0.016100
+vn 0.123000 0.992300 -0.010700
+vn 0.307000 0.950800 -0.040400
+vn 0.308500 0.950800 -0.027000
+vn 0.048600 0.998800 0.000000
+vn 0.048500 0.998800 0.002100
+vn 0.012000 0.999900 0.000500
+vn 0.012000 0.999900 0.000000
+vn 0.048400 0.998800 0.004200
+vn 0.012000 0.999900 0.001000
+vn 0.012000 0.999900 -0.000500
+vn 0.048500 0.998800 -0.002100
+vn 0.123400 0.992300 -0.005400
+vn 0.123500 0.992300 0.000000
+vn 0.309400 0.950800 -0.013500
+vn 0.309600 0.950800 0.000000
+vn 0.123400 0.992300 0.005400
+vn 0.123000 0.992300 0.010700
+vn 0.309400 0.950800 0.013500
+vn 0.308500 0.950800 0.027000
+vn 0.047800 0.998800 0.008400
+vn 0.047400 0.998800 0.010500
+vn 0.011700 0.999900 0.002600
+vn 0.011800 0.999900 0.002100
+vn 0.046900 0.998800 0.012500
+vn 0.011600 0.999900 0.003100
+vn 0.011900 0.999900 0.001600
+vn 0.048200 0.998800 0.006300
+vn 0.122400 0.992300 0.016100
+vn 0.121600 0.992300 0.021400
+vn 0.307000 0.950800 0.040400
+vn 0.304900 0.950800 0.053700
+vn 0.120600 0.992300 0.026700
+vn 0.119300 0.992300 0.032000
+vn 0.302300 0.950800 0.067000
+vn 0.299100 0.950800 0.080100
+vn 0.045600 0.998800 0.016600
+vn 0.044900 0.998800 0.018600
+vn 0.011100 0.999900 0.004600
+vn 0.011300 0.999900 0.004100
+vn 0.044000 0.998800 0.020500
+vn 0.010900 0.999900 0.005100
+vn 0.011400 0.999900 0.003600
+vn 0.046300 0.998800 0.014600
+vn 0.117800 0.992300 0.037100
+vn 0.116100 0.992300 0.042200
+vn 0.295300 0.950800 0.093100
+vn 0.291000 0.950800 0.105900
+vn 0.114100 0.992300 0.047200
+vn 0.111900 0.992300 0.052200
+vn 0.286100 0.950800 0.118500
+vn 0.280600 0.950800 0.130900
+vn 0.042100 0.998800 0.024300
+vn 0.041000 0.998800 0.026100
+vn 0.010100 0.999900 0.006400
+vn 0.010400 0.999900 0.006000
+vn 0.039800 0.998800 0.027900
+vn 0.009800 0.999900 0.006900
+vn 0.010700 0.999900 0.005500
+vn 0.043100 0.998800 0.022400
+vn 0.109500 0.992300 0.057000
+vn 0.107000 0.992300 0.061700
+vn 0.274700 0.950800 0.143000
+vn 0.268200 0.950800 0.154800
+vn 0.104200 0.992300 0.066300
+vn 0.101200 0.992300 0.070800
+vn 0.261100 0.950800 0.166400
+vn 0.253600 0.950800 0.177600
+vn 0.037200 0.998800 0.031200
+vn 0.035800 0.998800 0.032800
+vn 0.008900 0.999900 0.008100
+vn 0.009200 0.999900 0.007700
+vn 0.034300 0.998800 0.034300
+vn 0.008500 0.999900 0.008500
+vn 0.009500 0.999900 0.007300
+vn 0.038500 0.998800 0.029600
+vn 0.098000 0.992300 0.075200
+vn 0.094600 0.992300 0.079400
+vn 0.245600 0.950800 0.188500
+vn 0.237200 0.950800 0.199000
+vn 0.091100 0.992300 0.083400
+vn 0.087300 0.992300 0.087300
+vn 0.228300 0.950800 0.209200
+vn 0.218900 0.950800 0.218900
+vn 0.031200 0.998800 0.037200
+vn 0.029600 0.998800 0.038500
+vn 0.007300 0.999900 0.009500
+vn 0.007700 0.999900 0.009200
+vn 0.027900 0.998800 0.039800
+vn 0.006900 0.999900 0.009800
+vn 0.008100 0.999900 0.008900
+vn 0.032800 0.998800 0.035800
+vn 0.083400 0.992300 0.091100
+vn 0.079400 0.992300 0.094600
+vn 0.209200 0.950800 0.228300
+vn 0.199000 0.950800 0.237200
+vn 0.075200 0.992300 0.098000
+vn 0.070800 0.992300 0.101200
+vn 0.188500 0.950800 0.245600
+vn 0.177600 0.950800 0.253600
+vn 0.024300 0.998800 0.042100
+vn 0.022400 0.998800 0.043100
+vn 0.005500 0.999900 0.010700
+vn 0.006000 0.999900 0.010400
+vn 0.020500 0.998800 0.044000
+vn 0.005100 0.999900 0.010900
+vn 0.006400 0.999900 0.010100
+vn 0.026100 0.998800 0.041000
+vn 0.066300 0.992300 0.104200
+vn 0.061700 0.992300 0.107000
+vn 0.166400 0.950800 0.261100
+vn 0.154800 0.950800 0.268200
+vn 0.057000 0.992300 0.109500
+vn 0.052200 0.992300 0.111900
+vn 0.143000 0.950800 0.274700
+vn 0.130900 0.950800 0.280600
+vn 0.016600 0.998800 0.045600
+vn 0.014600 0.998800 0.046300
+vn 0.003600 0.999900 0.011400
+vn 0.004100 0.999900 0.011300
+vn 0.012500 0.998800 0.046900
+vn 0.003100 0.999900 0.011600
+vn 0.004600 0.999900 0.011100
+vn 0.018600 0.998800 0.044900
+vn 0.047200 0.992300 0.114100
+vn 0.042200 0.992300 0.116100
+vn 0.118500 0.950800 0.286100
+vn 0.105900 0.950800 0.291000
+vn 0.037100 0.992300 0.117800
+vn 0.032000 0.992300 0.119300
+vn 0.093100 0.950800 0.295300
+vn 0.080100 0.950800 0.299100
+vn 0.008400 0.998800 0.047800
+vn 0.006300 0.998800 0.048200
+vn 0.001600 0.999900 0.011900
+vn 0.002100 0.999900 0.011800
+vn 0.004200 0.998800 0.048400
+vn 0.001000 0.999900 0.012000
+vn 0.002600 0.999900 0.011700
+vn 0.010500 0.998800 0.047400
+vn 0.026700 0.992300 0.120600
+vn 0.021400 0.992300 0.121600
+vn 0.067000 0.950800 0.302300
+vn 0.053700 0.950800 0.304900
+vn 0.016100 0.992300 0.122400
+vn 0.010700 0.992300 0.123000
+vn 0.040400 0.950800 0.307000
+vn 0.027000 0.950800 0.308500
+vn 0.000000 0.998800 0.048600
+vn -0.002100 0.998800 0.048500
+vn -0.000500 0.999900 0.012000
+vn 0.000000 0.999900 0.012000
+vn 0.000500 0.999900 0.012000
+vn 0.002100 0.998800 0.048500
+vn 0.005400 0.992300 0.123400
+vn 0.000000 0.992300 0.123500
+vn 0.013500 0.950800 0.309400
+vn 0.000000 0.950800 0.309600
+vn -0.005400 0.992300 0.123400
+vn -0.013500 0.950800 0.309400
+vn -0.706500 0.001800 -0.707700
+vn -0.706300 0.005700 -0.707800
+vn -0.707000 0.001100 -0.707200
+vn -0.707000 0.000400 -0.707200
+vn -0.706900 0.000300 -0.707200
+vn -0.706700 0.000400 -0.707500
+vn -0.705400 0.003000 -0.708800
+vn -0.706300 0.000300 -0.707900
+vn -0.703600 0.002700 -0.710500
+vn -0.704000 0.012500 -0.710100
+vn -0.699100 0.013200 -0.714900
+vn -0.296600 0.924000 0.241400
+vn -0.138400 0.909800 0.391100
+vn -0.270900 0.865900 0.420400
+vn -0.368800 0.877700 0.306000
+vn -0.366600 0.848900 0.380700
+vn -0.413800 0.852700 0.318800
+vn 0.002000 0.865000 0.501800
+vn -0.223100 0.835900 0.501500
+vn -0.373300 0.838500 0.396900
+vn -0.612500 0.789500 -0.037500
+vn -0.575200 0.808200 -0.126600
+vn -0.746000 0.470300 -0.471500
+vn -0.726300 0.461100 -0.509800
+vn -0.622200 0.782800 0.010000
+vn -0.757500 0.487800 -0.433700
+vn -0.532700 0.823500 -0.195300
+vn -0.270800 0.954300 0.126200
+vn -0.520800 0.830600 -0.197200
+vn -0.266100 0.958100 0.105700
+vn -0.711600 0.458900 -0.532000
+vn -0.711600 0.453700 -0.536400
+vn -0.153400 0.962600 0.223100
+vn -0.058700 0.967100 0.247600
+vn -0.199800 0.965500 0.166600
+vn -0.177300 0.970600 0.162600
+vn -0.002700 1.000000 0.001500
+vn -0.002700 1.000000 0.001400
+vn -0.398300 0.893500 0.207300
+vn -0.388900 0.893500 0.224300
+vn -0.712500 0.595600 0.370800
+vn -0.695900 0.595600 0.401300
+vn -0.002800 1.000000 0.001300
+vn -0.406900 0.893500 0.189700
+vn -0.728000 0.595600 0.339500
+vn -0.378900 0.893500 0.240900
+vn -0.002600 1.000000 0.001600
+vn -0.368100 0.893500 0.257100
+vn -0.002600 1.000000 0.001800
+vn -0.677900 0.595600 0.431000
+vn -0.658500 0.595600 0.460000
+vn 0.374600 0.896100 -0.238100
+vn 0.384500 0.896100 -0.221700
+vn 0.676000 0.598700 -0.429700
+vn 0.693900 0.598700 -0.400100
+vn 0.363800 0.896100 -0.254200
+vn 0.656600 0.598700 -0.458700
+vn 0.393700 0.896100 -0.204900
+vn 0.402200 0.896100 -0.187600
+vn 0.710500 0.598700 -0.369800
+vn 0.725900 0.598700 -0.338500
+vn -0.002900 1.000000 0.001100
+vn -0.003000 1.000000 0.000900
+vn -0.428200 0.893500 0.135000
+vn -0.421900 0.893500 0.153600
+vn -0.766100 0.595600 0.241600
+vn -0.754800 0.595600 0.274700
+vn -0.003000 1.000000 0.000800
+vn -0.433700 0.893500 0.116200
+vn -0.775900 0.595600 0.207900
+vn -0.414800 0.893500 0.171800
+vn -0.002900 1.000000 0.001200
+vn -0.742100 0.595600 0.307400
+vn 0.410000 0.896100 -0.169800
+vn 0.417100 0.896100 -0.151800
+vn 0.740000 0.598700 -0.306500
+vn 0.752700 0.598700 -0.273900
+vn 0.423300 0.896100 -0.133500
+vn 0.428700 0.896100 -0.114900
+vn 0.763900 0.598700 -0.240900
+vn 0.773700 0.598700 -0.207300
+vn -0.003100 1.000000 0.000500
+vn -0.003100 1.000000 0.000400
+vn -0.445100 0.893500 0.058600
+vn -0.442200 0.893500 0.077900
+vn -0.796400 0.595600 0.104900
+vn -0.791100 0.595600 0.139500
+vn -0.003100 1.000000 0.000200
+vn -0.447300 0.893500 0.039100
+vn -0.800200 0.595600 0.070000
+vn -0.438300 0.893500 0.097100
+vn -0.003100 1.000000 0.000700
+vn -0.784200 0.595600 0.173800
+vn 0.433300 0.896100 -0.096000
+vn 0.437100 0.896100 -0.077100
+vn 0.782000 0.598700 -0.173300
+vn 0.788800 0.598700 -0.139100
+vn 0.440000 0.896100 -0.057900
+vn 0.442200 0.896100 -0.038700
+vn 0.794100 0.598700 -0.104600
+vn 0.797900 0.598700 -0.069800
+vn -0.003100 1.000000 0.000000
+vn -0.003100 1.000000 -0.000100
+vn -0.448600 0.893500 -0.019600
+vn -0.449000 0.893500 0.000000
+vn -0.802500 0.595600 -0.035000
+vn -0.803300 0.595600 0.000000
+vn -0.003100 1.000000 -0.000300
+vn -0.447300 0.893500 -0.039100
+vn -0.800200 0.595600 -0.070000
+vn -0.448600 0.893500 0.019600
+vn -0.003100 1.000000 0.000100
+vn -0.802500 0.595600 0.035000
+vn 0.443400 0.896100 -0.019300
+vn 0.443800 0.896100 0.000000
+vn 0.800200 0.598700 -0.034900
+vn 0.801000 0.598700 0.000000
+vn 0.443400 0.896100 0.019300
+vn 0.442200 0.896100 0.038700
+vn 0.800200 0.598700 0.034900
+vn 0.797900 0.598700 0.069800
+vn -0.003100 1.000000 -0.000500
+vn -0.003100 1.000000 -0.000700
+vn -0.438300 0.893500 -0.097100
+vn -0.442200 0.893500 -0.077900
+vn -0.784200 0.595600 -0.173800
+vn -0.791100 0.595600 -0.139500
+vn -0.003000 1.000000 -0.000800
+vn -0.433700 0.893500 -0.116200
+vn -0.775900 0.595600 -0.207900
+vn -0.445100 0.893500 -0.058600
+vn -0.003100 1.000000 -0.000400
+vn -0.796400 0.595600 -0.104900
+vn 0.440000 0.896100 0.057900
+vn 0.437100 0.896100 0.077100
+vn 0.794100 0.598700 0.104600
+vn 0.788800 0.598700 0.139100
+vn 0.433300 0.896100 0.096000
+vn 0.428700 0.896100 0.114900
+vn 0.782000 0.598700 0.173300
+vn 0.773700 0.598700 0.207300
+vn -0.002900 1.000000 -0.001100
+vn -0.002900 1.000000 -0.001200
+vn -0.414800 0.893500 -0.171800
+vn -0.421900 0.893500 -0.153600
+vn -0.742100 0.595600 -0.307400
+vn -0.754800 0.595600 -0.274700
+vn -0.002800 1.000000 -0.001300
+vn -0.406900 0.893500 -0.189700
+vn -0.728000 0.595600 -0.339500
+vn -0.428200 0.893500 -0.135000
+vn -0.003000 1.000000 -0.000900
+vn -0.766100 0.595600 -0.241600
+vn 0.423300 0.896100 0.133500
+vn 0.417100 0.896100 0.151800
+vn 0.763900 0.598700 0.240900
+vn 0.752700 0.598700 0.273900
+vn 0.410000 0.896100 0.169800
+vn 0.402200 0.896100 0.187600
+vn 0.740000 0.598700 0.306500
+vn 0.725900 0.598700 0.338500
+vn -0.002700 1.000000 -0.001600
+vn -0.002600 1.000000 -0.001700
+vn -0.378700 0.893500 -0.241200
+vn -0.388800 0.893500 -0.224500
+vn -0.677500 0.595600 -0.431600
+vn -0.695600 0.595600 -0.401600
+vn -0.002600 1.000000 -0.001800
+vn -0.367800 0.893500 -0.257500
+vn -0.658000 0.595600 -0.460700
+vn -0.398200 0.893500 -0.207300
+vn -0.002800 1.000000 -0.001400
+vn -0.712500 0.595600 -0.370900
+vn 0.393700 0.896100 0.204900
+vn 0.384400 0.896100 0.221900
+vn 0.710500 0.598700 0.369900
+vn 0.693700 0.598700 0.400500
+vn 0.374300 0.896100 0.238400
+vn 0.363600 0.896100 0.254600
+vn 0.675600 0.598700 0.430300
+vn 0.656100 0.598700 0.459400
+vn -0.002400 1.000000 -0.002000
+vn -0.002300 1.000000 -0.002100
+vn -0.331000 0.893500 -0.303300
+vn -0.343900 0.893500 -0.288600
+vn -0.592200 0.595600 -0.542600
+vn -0.615300 0.595600 -0.516300
+vn -0.002200 1.000000 -0.002200
+vn -0.317500 0.893500 -0.317500
+vn -0.568000 0.595600 -0.568000
+vn -0.356200 0.893500 -0.273300
+vn -0.002500 1.000000 -0.001900
+vn -0.637300 0.595600 -0.489000
+vn 0.352100 0.896100 0.270200
+vn 0.340000 0.896100 0.285300
+vn 0.635400 0.598700 0.487600
+vn 0.613600 0.598700 0.514800
+vn 0.327200 0.896100 0.299800
+vn 0.313800 0.896100 0.313800
+vn 0.590600 0.598700 0.541100
+vn 0.566400 0.598700 0.566400
+vn -0.002000 1.000000 -0.002400
+vn -0.001900 1.000000 -0.002500
+vn -0.273300 0.893500 -0.356200
+vn -0.288600 0.893500 -0.343900
+vn -0.489000 0.595600 -0.637300
+vn -0.516300 0.595600 -0.615300
+vn -0.001800 1.000000 -0.002600
+vn -0.257500 0.893500 -0.367800
+vn -0.460700 0.595600 -0.658000
+vn -0.303300 0.893500 -0.331000
+vn -0.002100 1.000000 -0.002300
+vn -0.542600 0.595600 -0.592200
+vn 0.299800 0.896100 0.327200
+vn 0.285300 0.896100 0.340000
+vn 0.541100 0.598700 0.590600
+vn 0.514800 0.598700 0.613600
+vn 0.270200 0.896100 0.352100
+vn 0.254600 0.896100 0.363600
+vn 0.487600 0.598700 0.635400
+vn 0.459400 0.598700 0.656100
+vn -0.001600 1.000000 -0.002700
+vn -0.001400 1.000000 -0.002800
+vn -0.207300 0.893500 -0.398300
+vn -0.224500 0.893500 -0.388800
+vn -0.370900 0.595600 -0.712500
+vn -0.401600 0.595600 -0.695600
+vn -0.001300 1.000000 -0.002800
+vn -0.189700 0.893500 -0.406900
+vn -0.339500 0.595600 -0.728000
+vn -0.241200 0.893500 -0.378700
+vn -0.001700 1.000000 -0.002600
+vn -0.431600 0.595600 -0.677500
+vn 0.238400 0.896100 0.374300
+vn 0.221900 0.896100 0.384400
+vn 0.430300 0.598700 0.675600
+vn 0.400500 0.598700 0.693700
+vn 0.205000 0.896100 0.393700
+vn 0.187600 0.896100 0.402200
+vn 0.369900 0.598700 0.710500
+vn 0.338500 0.598700 0.725900
+vn -0.001100 1.000000 -0.002900
+vn -0.000900 1.000000 -0.003000
+vn -0.135000 0.893500 -0.428200
+vn -0.153500 0.893500 -0.421900
+vn -0.241600 0.595600 -0.766100
+vn -0.274700 0.595600 -0.754800
+vn -0.000800 1.000000 -0.003000
+vn -0.116200 0.893500 -0.433700
+vn -0.207900 0.595600 -0.775900
+vn -0.171800 0.893500 -0.414800
+vn -0.001200 1.000000 -0.002900
+vn -0.307400 0.595600 -0.742100
+vn 0.169800 0.896100 0.410000
+vn 0.151800 0.896100 0.417100
+vn 0.306500 0.598700 0.740000
+vn 0.273900 0.598700 0.752700
+vn 0.133500 0.896100 0.423300
+vn 0.114900 0.896100 0.428700
+vn 0.240900 0.598700 0.763900
+vn 0.207300 0.598700 0.773700
+vn -0.000500 1.000000 -0.003100
+vn -0.000400 1.000000 -0.003100
+vn -0.058600 0.893500 -0.445100
+vn -0.077900 0.893500 -0.442200
+vn -0.104900 0.595600 -0.796400
+vn -0.139500 0.595600 -0.791100
+vn -0.000300 1.000000 -0.003100
+vn -0.039100 0.893500 -0.447300
+vn -0.070000 0.595600 -0.800200
+vn -0.097100 0.893500 -0.438400
+vn -0.000700 1.000000 -0.003100
+vn -0.173800 0.595600 -0.784200
+vn 0.096000 0.896100 0.433300
+vn 0.077100 0.896100 0.437100
+vn 0.173300 0.598700 0.782000
+vn 0.139100 0.598700 0.788800
+vn 0.057900 0.896100 0.440000
+vn 0.038700 0.896100 0.442100
+vn 0.104600 0.598700 0.794100
+vn 0.069800 0.598700 0.797900
+vn 0.000000 1.000000 -0.003100
+vn 0.000100 1.000000 -0.003100
+vn 0.019600 0.893500 -0.448600
+vn 0.000000 0.893500 -0.449000
+vn 0.035000 0.595600 -0.802500
+vn 0.000000 0.595600 -0.803300
+vn -0.019600 0.893500 -0.448600
+vn -0.000100 1.000000 -0.003100
+vn -0.035000 0.595600 -0.802500
+vn 0.019300 0.896100 0.443400
+vn 0.000000 0.896100 0.443800
+vn 0.034900 0.598700 0.800200
+vn 0.000000 0.598700 0.801000
+vn -0.019300 0.896100 0.443400
+vn -0.034900 0.598700 0.800200
+vn 0.000000 0.098000 -0.995200
+vn 0.043400 0.098000 -0.994200
+vn 0.039100 0.442700 -0.895800
+vn 0.000000 0.442700 -0.896600
+vn 0.024500 0.827200 -0.561400
+vn 0.000000 0.827200 -0.561900
+vn -0.039100 0.442700 -0.895800
+vn -0.043400 0.098000 -0.994200
+vn -0.078100 0.442800 -0.893200
+vn -0.086700 0.098000 -0.991400
+vn -0.024500 0.827200 -0.561400
+vn -0.049000 0.827200 -0.559700
+vn -0.043500 0.013500 -0.998900
+vn 0.000000 0.013500 -0.999900
+vn -0.043500 0.000000 -0.999000
+vn 0.000000 0.000000 -1.000000
+vn -0.087100 0.013500 -0.996100
+vn -0.087100 0.000000 -0.996200
+vn 0.043500 0.013500 -0.998900
+vn 0.043500 0.000000 -0.999000
+vn -0.172800 0.098000 -0.980000
+vn -0.129900 0.098000 -0.986700
+vn -0.117100 0.442700 -0.888900
+vn -0.155700 0.442700 -0.883000
+vn -0.073300 0.827200 -0.557100
+vn -0.097600 0.827200 -0.553400
+vn -0.194000 0.442700 -0.875400
+vn -0.215300 0.098000 -0.971600
+vn -0.232100 0.442700 -0.866100
+vn -0.257500 0.098000 -0.961300
+vn -0.121600 0.827200 -0.548600
+vn -0.145400 0.827200 -0.542700
+vn -0.216400 0.013500 -0.976200
+vn -0.173600 0.013500 -0.984700
+vn -0.216400 0.000000 -0.976300
+vn -0.173600 0.000000 -0.984800
+vn -0.258800 0.013500 -0.965800
+vn -0.258800 0.000000 -0.965900
+vn -0.130500 0.013500 -0.991300
+vn -0.130600 0.000000 -0.991400
+vn -0.340400 0.098000 -0.935100
+vn -0.299300 0.098000 -0.949100
+vn -0.269600 0.442700 -0.855100
+vn -0.306600 0.442700 -0.842600
+vn -0.169000 0.827200 -0.535900
+vn -0.192200 0.827200 -0.528000
+vn -0.343100 0.442700 -0.828400
+vn -0.380800 0.098000 -0.919400
+vn -0.378900 0.442800 -0.812600
+vn -0.420600 0.098000 -0.901900
+vn -0.215000 0.827200 -0.519100
+vn -0.237500 0.827200 -0.509200
+vn -0.382600 0.013500 -0.923800
+vn -0.342000 0.013500 -0.939600
+vn -0.382600 0.000000 -0.923900
+vn -0.342000 0.000000 -0.939700
+vn -0.422600 0.013500 -0.906200
+vn -0.422600 0.000000 -0.906300
+vn -0.300700 0.013500 -0.953600
+vn -0.300700 0.000000 -0.953700
+vn -0.497600 0.098000 -0.861800
+vn -0.459500 0.098000 -0.882700
+vn -0.414000 0.442700 -0.795300
+vn -0.448300 0.442700 -0.776500
+vn -0.259500 0.827200 -0.498400
+vn -0.281000 0.827200 -0.486600
+vn -0.481700 0.442700 -0.756200
+vn -0.534700 0.098000 -0.839400
+vn -0.514300 0.442700 -0.734500
+vn -0.570800 0.098000 -0.815200
+vn -0.301900 0.827200 -0.473900
+vn -0.322300 0.827200 -0.460300
+vn -0.537200 0.013500 -0.843300
+vn -0.499900 0.013500 -0.865900
+vn -0.537200 0.000000 -0.843400
+vn -0.500000 0.000000 -0.866000
+vn -0.573500 0.013500 -0.819100
+vn -0.573600 0.000000 -0.819100
+vn -0.461700 0.013500 -0.886900
+vn -0.461800 0.000000 -0.887000
+vn -0.639700 0.098000 -0.762400
+vn -0.605900 0.098000 -0.789500
+vn -0.545900 0.442700 -0.711300
+vn -0.576300 0.442700 -0.686800
+vn -0.342100 0.827200 -0.445800
+vn -0.361200 0.827200 -0.430400
+vn -0.605700 0.442700 -0.661100
+vn -0.672300 0.098000 -0.733700
+vn -0.634000 0.442700 -0.634000
+vn -0.703700 0.098000 -0.703700
+vn -0.379600 0.827200 -0.414300
+vn -0.397300 0.827200 -0.397300
+vn -0.675500 0.013500 -0.737200
+vn -0.642700 0.013500 -0.766000
+vn -0.675600 0.000000 -0.737300
+vn -0.642800 0.000000 -0.766000
+vn -0.707000 0.013500 -0.707000
+vn -0.608700 0.013500 -0.793200
+vn -0.608800 0.000000 -0.793300
+vn -0.762400 0.098000 -0.639700
+vn -0.733700 0.098000 -0.672300
+vn -0.661100 0.442700 -0.605700
+vn -0.686800 0.442700 -0.576300
+vn -0.414300 0.827200 -0.379600
+vn -0.430400 0.827200 -0.361200
+vn -0.711300 0.442700 -0.545900
+vn -0.789500 0.098000 -0.605900
+vn -0.734500 0.442700 -0.514300
+vn -0.815200 0.098000 -0.570800
+vn -0.445800 0.827200 -0.342100
+vn -0.460300 0.827200 -0.322300
+vn -0.793200 0.013500 -0.608700
+vn -0.766000 0.013500 -0.642700
+vn -0.793300 0.000000 -0.608800
+vn -0.819100 0.013500 -0.573500
+vn -0.819100 0.000000 -0.573600
+vn -0.737200 0.013500 -0.675500
+vn -0.737300 0.000000 -0.675600
+vn -0.861800 0.098000 -0.497600
+vn -0.839400 0.098000 -0.534700
+vn -0.756200 0.442700 -0.481700
+vn -0.776500 0.442700 -0.448300
+vn -0.473900 0.827200 -0.301900
+vn -0.486600 0.827200 -0.280900
+vn -0.795300 0.442800 -0.414000
+vn -0.882700 0.098000 -0.459500
+vn -0.812600 0.442800 -0.378900
+vn -0.901900 0.098000 -0.420600
+vn -0.498400 0.827200 -0.259500
+vn -0.509200 0.827200 -0.237500
+vn -0.886900 0.013500 -0.461700
+vn -0.865900 0.013500 -0.499900
+vn -0.887000 0.000000 -0.461800
+vn -0.866000 0.000000 -0.500000
+vn -0.906200 0.013500 -0.422600
+vn -0.843300 0.013500 -0.537200
+vn -0.843400 0.000000 -0.537200
+vn -0.935100 0.098000 -0.340400
+vn -0.919400 0.098000 -0.380800
+vn -0.828400 0.442800 -0.343100
+vn -0.842600 0.442800 -0.306600
+vn -0.519100 0.827200 -0.215000
+vn -0.528000 0.827200 -0.192200
+vn -0.855100 0.442700 -0.269700
+vn -0.949100 0.098000 -0.299300
+vn -0.866100 0.442800 -0.232100
+vn -0.961300 0.098000 -0.257500
+vn -0.535900 0.827200 -0.169000
+vn -0.542700 0.827200 -0.145400
+vn -0.953600 0.013500 -0.300700
+vn -0.939600 0.013500 -0.342000
+vn -0.965800 0.013500 -0.258800
+vn -0.923800 0.013500 -0.382600
+vn -0.980000 0.098000 -0.172800
+vn -0.971600 0.098000 -0.215300
+vn -0.875400 0.442700 -0.194000
+vn -0.883000 0.442700 -0.155700
+vn -0.548600 0.827200 -0.121600
+vn -0.553400 0.827200 -0.097600
+vn -0.888900 0.442700 -0.117100
+vn -0.986700 0.098000 -0.129900
+vn -0.893200 0.442800 -0.078100
+vn -0.991400 0.098000 -0.086700
+vn -0.557100 0.827200 -0.073300
+vn -0.559700 0.827200 -0.049000
+vn -0.991300 0.013500 -0.130500
+vn -0.984700 0.013500 -0.173600
+vn -0.996100 0.013500 -0.087100
+vn -0.976200 0.013500 -0.216400
+vn -0.995200 0.098000 0.000000
+vn -0.994200 0.098000 -0.043400
+vn -0.895800 0.442700 -0.039100
+vn -0.896600 0.442700 0.000000
+vn -0.561400 0.827200 -0.024500
+vn -0.561900 0.827200 0.000000
+vn -0.895800 0.442700 0.039100
+vn -0.994200 0.098000 0.043400
+vn -0.893200 0.442800 0.078100
+vn -0.991400 0.098000 0.086700
+vn -0.561400 0.827200 0.024500
+vn -0.559700 0.827200 0.049000
+vn -0.998900 0.013500 0.043500
+vn -0.999900 0.013500 0.000000
+vn -0.996100 0.013500 0.087100
+vn -0.998900 0.013500 -0.043500
+vn -0.980000 0.098000 0.172800
+vn -0.986700 0.098000 0.129900
+vn -0.888900 0.442700 0.117100
+vn -0.883000 0.442700 0.155700
+vn -0.557100 0.827200 0.073300
+vn -0.553400 0.827200 0.097600
+vn -0.875400 0.442700 0.194000
+vn -0.971600 0.098000 0.215300
+vn -0.866100 0.442800 0.232100
+vn -0.961300 0.098000 0.257500
+vn -0.548600 0.827200 0.121600
+vn -0.542700 0.827200 0.145400
+vn -0.976200 0.013500 0.216400
+vn -0.984700 0.013500 0.173600
+vn -0.965800 0.013500 0.258800
+vn -0.991300 0.013500 0.130500
+vn -0.935100 0.098000 0.340300
+vn -0.949100 0.098000 0.299300
+vn -0.855100 0.442700 0.269700
+vn -0.842600 0.442700 0.306600
+vn -0.535900 0.827200 0.169000
+vn -0.528000 0.827200 0.192200
+vn -0.828400 0.442700 0.343100
+vn -0.919400 0.098000 0.380800
+vn -0.812600 0.442700 0.378900
+vn -0.901900 0.098000 0.420600
+vn -0.519100 0.827200 0.215000
+vn -0.509200 0.827200 0.237500
+vn -0.923800 0.013500 0.382600
+vn -0.939600 0.013500 0.342000
+vn -0.906200 0.013500 0.422600
+vn -0.953600 0.013500 0.300700
+vn -0.862100 0.098000 0.497100
+vn -0.882800 0.098000 0.459400
+vn -0.795400 0.442700 0.413900
+vn -0.776700 0.442700 0.447900
+vn -0.498500 0.827200 0.259400
+vn -0.486800 0.827200 0.280700
+vn -0.756600 0.442700 0.481000
+vn -0.839800 0.098000 0.533900
+vn -0.735000 0.442800 0.513500
+vn -0.815800 0.098000 0.569900
+vn -0.474200 0.827200 0.301500
+vn -0.460600 0.827200 0.321800
+vn -0.843800 0.013500 0.536400
+vn -0.866200 0.013500 0.499500
+vn -0.843900 0.000000 0.536500
+vn -0.866300 0.000000 0.499500
+vn -0.819700 0.013500 0.572600
+vn -0.819800 0.000000 0.572700
+vn -0.887000 0.013500 0.461600
+vn -0.887100 0.000000 0.461600
+vn -0.864200 0.093100 0.494400
+vn -0.776200 0.097400 0.622900
+vn -0.700900 0.440000 0.561200
+vn -0.788300 0.427400 0.442500
+vn -0.444300 0.824700 0.350000
+vn -0.530100 0.809000 0.254000
+vn -0.762400 0.098000 0.639700
+vn -0.687300 0.441500 0.576700
+vn -0.431800 0.826000 0.362300
+vn -0.944700 0.324500 -0.047100
+vn -0.996300 0.066900 -0.052800
+vn -0.821400 0.132100 -0.554900
+vn -0.828500 0.026400 -0.559400
+vn -0.757300 0.630200 -0.171200
+vn -0.786700 0.262500 -0.558700
+vn -0.997900 0.008900 -0.063500
+vn -0.869700 0.012600 0.493300
+vn -0.997800 0.000000 -0.066500
+vn -0.870400 0.000000 0.492300
+vn -0.827800 0.003400 -0.560900
+vn -0.827600 0.000000 -0.561300
+vn -0.780200 0.013400 0.625400
+vn -0.766000 0.013500 0.642700
+vn -0.780400 0.000000 0.625300
+vn 0.000000 -0.018300 0.999800
+vn -0.043500 -0.018300 0.998900
+vn -0.043500 -0.046800 0.997900
+vn 0.000000 -0.046800 0.998900
+vn -0.043200 -0.123800 0.991400
+vn 0.000000 -0.123800 0.992300
+vn 0.043500 -0.046800 0.997900
+vn 0.043500 -0.018300 0.998900
+vn 0.087000 -0.046800 0.995100
+vn 0.087100 -0.018300 0.996000
+vn 0.043200 -0.123800 0.991400
+vn 0.086500 -0.123800 0.988500
+vn 0.043500 -0.004500 0.999000
+vn 0.000000 -0.004500 1.000000
+vn 0.087100 -0.004500 0.996200
+vn -0.043500 -0.004500 0.999000
+vn 0.173600 -0.018300 0.984600
+vn 0.130500 -0.018300 0.991300
+vn 0.130400 -0.046800 0.990300
+vn 0.173400 -0.046800 0.983700
+vn 0.129600 -0.123800 0.983800
+vn 0.172300 -0.123800 0.977200
+vn 0.216100 -0.046800 0.975200
+vn 0.216300 -0.018300 0.976100
+vn 0.258500 -0.046800 0.964800
+vn 0.258800 -0.018300 0.965800
+vn 0.214700 -0.123800 0.968800
+vn 0.256800 -0.123800 0.958500
+vn 0.216400 -0.004500 0.976300
+vn 0.173600 -0.004500 0.984800
+vn 0.258800 -0.004500 0.965900
+vn 0.130600 -0.004500 0.991400
+vn 0.342000 -0.018300 0.939500
+vn 0.300700 -0.018300 0.953500
+vn 0.300400 -0.046800 0.952600
+vn 0.341600 -0.046800 0.938700
+vn 0.298400 -0.123800 0.946300
+vn 0.339400 -0.123800 0.932500
+vn 0.382200 -0.046800 0.922900
+vn 0.382600 -0.018300 0.923700
+vn 0.422100 -0.046800 0.905300
+vn 0.422500 -0.018300 0.906200
+vn 0.379700 -0.123800 0.916800
+vn 0.419400 -0.123800 0.899300
+vn 0.382600 -0.004500 0.923900
+vn 0.342000 -0.004500 0.939700
+vn 0.422600 -0.004500 0.906300
+vn 0.300700 -0.004500 0.953700
+vn 0.499900 -0.018300 0.865900
+vn 0.461700 -0.018300 0.886800
+vn 0.461300 -0.046800 0.886000
+vn 0.499400 -0.046800 0.865000
+vn 0.458200 -0.123800 0.880200
+vn 0.496100 -0.123800 0.859300
+vn 0.536700 -0.046800 0.842500
+vn 0.537200 -0.018300 0.843300
+vn 0.572900 -0.046800 0.818200
+vn 0.573500 -0.018300 0.819000
+vn 0.533100 -0.123800 0.836900
+vn 0.569100 -0.123800 0.812800
+vn 0.537200 -0.004500 0.843400
+vn 0.500000 -0.004500 0.866000
+vn 0.573600 -0.004500 0.819100
+vn 0.461800 -0.004500 0.887000
+vn 0.642700 -0.018300 0.765900
+vn 0.608700 -0.018300 0.793200
+vn 0.608100 -0.046800 0.792400
+vn 0.642100 -0.046800 0.765200
+vn 0.604100 -0.123800 0.787200
+vn 0.637800 -0.123800 0.760100
+vn 0.674800 -0.046800 0.736500
+vn 0.675400 -0.018300 0.737200
+vn 0.706300 -0.046800 0.706300
+vn 0.707000 -0.018300 0.707000
+vn 0.670300 -0.123800 0.731600
+vn 0.701700 -0.123800 0.701700
+vn 0.675500 -0.004500 0.737300
+vn 0.642800 -0.004500 0.766000
+vn 0.707100 -0.004500 0.707100
+vn 0.608800 -0.004500 0.793300
+vn 0.765900 -0.018300 0.642700
+vn 0.737200 -0.018300 0.675400
+vn 0.736500 -0.046800 0.674800
+vn 0.765200 -0.046800 0.642100
+vn 0.731600 -0.123800 0.670300
+vn 0.760100 -0.123800 0.637800
+vn 0.792400 -0.046800 0.608100
+vn 0.793200 -0.018300 0.608700
+vn 0.818200 -0.046800 0.572900
+vn 0.819000 -0.018300 0.573500
+vn 0.787200 -0.123800 0.604100
+vn 0.812800 -0.123800 0.569100
+vn 0.793300 -0.004500 0.608800
+vn 0.766000 -0.004500 0.642800
+vn 0.819100 -0.004500 0.573600
+vn 0.737300 -0.004500 0.675500
+vn 0.865900 -0.018300 0.499900
+vn 0.843300 -0.018300 0.537200
+vn 0.842500 -0.046800 0.536700
+vn 0.865000 -0.046800 0.499400
+vn 0.836900 -0.123800 0.533100
+vn 0.859300 -0.123800 0.496100
+vn 0.886000 -0.046800 0.461300
+vn 0.886800 -0.018300 0.461700
+vn 0.905300 -0.046800 0.422100
+vn 0.906200 -0.018300 0.422500
+vn 0.880200 -0.123800 0.458200
+vn 0.899300 -0.123800 0.419400
+vn 0.887000 -0.004500 0.461800
+vn 0.866000 -0.004500 0.500000
+vn 0.843400 -0.004500 0.537200
+vn 0.939500 -0.018300 0.342000
+vn 0.923700 -0.018300 0.382600
+vn 0.922900 -0.046800 0.382200
+vn 0.938700 -0.046800 0.341600
+vn 0.916800 -0.123800 0.379700
+vn 0.932500 -0.123800 0.339400
+vn 0.952600 -0.046800 0.300400
+vn 0.953500 -0.018300 0.300700
+vn 0.964800 -0.046800 0.258500
+vn 0.965800 -0.018300 0.258800
+vn 0.946300 -0.123800 0.298400
+vn 0.958500 -0.123800 0.256800
+vn 0.984600 -0.018300 0.173600
+vn 0.976100 -0.018300 0.216300
+vn 0.975200 -0.046800 0.216100
+vn 0.983700 -0.046800 0.173400
+vn 0.968800 -0.123800 0.214700
+vn 0.977200 -0.123800 0.172300
+vn 0.990300 -0.046800 0.130400
+vn 0.991300 -0.018300 0.130500
+vn 0.995100 -0.046800 0.087000
+vn 0.996000 -0.018300 0.087100
+vn 0.983800 -0.123800 0.129600
+vn 0.988500 -0.123800 0.086500
+vn 0.999800 -0.018300 0.000000
+vn 0.998900 -0.018300 0.043500
+vn 0.997900 -0.046800 0.043500
+vn 0.998900 -0.046800 0.000000
+vn 0.991400 -0.123800 0.043200
+vn 0.992300 -0.123800 0.000000
+vn 0.997900 -0.046800 -0.043500
+vn 0.998900 -0.018300 -0.043500
+vn 0.995100 -0.046800 -0.087000
+vn 0.996000 -0.018300 -0.087100
+vn 0.991400 -0.123800 -0.043200
+vn 0.988500 -0.123800 -0.086500
+vn 0.984600 -0.018300 -0.173600
+vn 0.991300 -0.018300 -0.130500
+vn 0.990300 -0.046800 -0.130400
+vn 0.983700 -0.046800 -0.173400
+vn 0.983800 -0.123800 -0.129600
+vn 0.977200 -0.123800 -0.172300
+vn 0.975200 -0.046800 -0.216100
+vn 0.976100 -0.018300 -0.216300
+vn 0.964800 -0.046800 -0.258500
+vn 0.965800 -0.018300 -0.258800
+vn 0.968800 -0.123800 -0.214700
+vn 0.958500 -0.123800 -0.256800
+vn 0.939500 -0.018300 -0.342000
+vn 0.953500 -0.018300 -0.300700
+vn 0.952600 -0.046800 -0.300400
+vn 0.938700 -0.046800 -0.341600
+vn 0.946300 -0.123800 -0.298400
+vn 0.932500 -0.123800 -0.339400
+vn 0.922900 -0.046800 -0.382200
+vn 0.923700 -0.018300 -0.382600
+vn 0.905300 -0.046800 -0.422100
+vn 0.906200 -0.018300 -0.422500
+vn 0.916800 -0.123800 -0.379700
+vn 0.899300 -0.123800 -0.419400
+vn 0.866100 -0.018300 -0.499400
+vn 0.886900 -0.018300 -0.461600
+vn 0.886100 -0.046800 -0.461100
+vn 0.865300 -0.046800 -0.499000
+vn 0.880200 -0.123800 -0.458100
+vn 0.859600 -0.123800 -0.495700
+vn 0.843000 -0.046800 -0.535900
+vn 0.843700 -0.018300 -0.536400
+vn 0.818800 -0.046800 -0.572100
+vn 0.819600 -0.018300 -0.572600
+vn 0.837400 -0.123800 -0.532400
+vn 0.813400 -0.123800 -0.568300
+vn 0.843900 -0.004500 -0.536500
+vn 0.866300 -0.004500 -0.499500
+vn 0.819700 -0.004500 -0.572700
+vn 0.887100 -0.004500 -0.461600
+vn 0.703800 -0.017700 -0.710200
+vn 0.759300 -0.017600 -0.650500
+vn 0.758800 -0.045700 -0.649700
+vn 0.697300 -0.047500 -0.715200
+vn 0.751700 -0.122300 -0.648000
+vn 0.653600 -0.128600 -0.745800
+vn 0.766100 -0.017900 -0.642500
+vn 0.765700 -0.045900 -0.641500
+vn 0.761500 -0.121600 -0.636600
+vn 0.217800 -0.038500 -0.975200
+vn 0.242400 -0.016000 -0.970000
+vn -0.383900 -0.018300 -0.923200
+vn -0.380300 -0.008800 -0.924800
+vn 0.131900 -0.079700 -0.988000
+vn -0.394600 -0.031200 -0.918300
+vn 0.245700 -0.003800 -0.969300
+vn 0.703500 -0.004200 -0.710700
+vn -0.379300 -0.002200 -0.925300
+vn 0.759100 -0.004300 -0.650900
+vn 0.766000 -0.004400 -0.642700
+vn -0.694100 -0.005900 -0.719800
+vn -0.705400 -0.005700 -0.708700
+vn -0.705500 -0.001400 -0.708700
+vn -0.694300 -0.001400 -0.719700
+vn -0.707000 -0.005600 -0.707100
+vn -0.707100 -0.001400 -0.707100
+vn -0.612600 -0.001600 -0.790300
+vn -0.610900 -0.007000 -0.791700
+vn -0.601000 -0.017900 -0.799000
+vn -0.692600 -0.015800 -0.721200
+vn -0.553400 -0.042200 -0.831800
+vn -0.684300 -0.043100 -0.727800
+vn -0.705100 -0.014900 -0.708900
+vn -0.706800 -0.014300 -0.707300
+vn -0.703500 -0.039900 -0.709500
+vn -0.706000 -0.038200 -0.707100
+vn -0.707000 -0.005000 -0.707100
+vn -0.707000 -0.004700 -0.707100
+vn -0.707100 -0.001200 -0.707100
+vn -0.707000 -0.004500 -0.707100
+vn -0.707100 -0.001100 -0.707100
+vn -0.707100 -0.001300 -0.707100
+vn -0.707000 -0.005300 -0.707100
+vn -0.706800 -0.013600 -0.707300
+vn -0.706800 -0.012900 -0.707300
+vn -0.706100 -0.036500 -0.707200
+vn -0.706100 -0.034400 -0.707200
+vn -0.706800 -0.012100 -0.707300
+vn -0.706800 -0.011400 -0.707300
+vn -0.706200 -0.032300 -0.707300
+vn -0.706200 -0.030600 -0.707300
+vn -0.707000 -0.004200 -0.707100
+vn -0.707000 -0.004300 -0.707100
+vn -0.706800 -0.011000 -0.707300
+vn -0.706800 -0.010700 -0.707300
+vn -0.706200 -0.029400 -0.707300
+vn -0.706300 -0.028500 -0.707400
+vn -0.706800 -0.010400 -0.707300
+vn -0.707000 -0.004100 -0.707100
+vn -0.706800 -0.010100 -0.707300
+vn -0.707000 -0.003900 -0.707200
+vn -0.706300 -0.027800 -0.707400
+vn -0.706300 -0.027000 -0.707400
+vn -0.707100 -0.001000 -0.707100
+vn -0.869600 -0.017600 0.493400
+vn -0.779800 -0.017800 0.625800
+vn -0.780200 -0.004400 0.625400
+vn -0.870000 -0.004100 0.493100
+vn -0.765700 -0.017900 0.642900
+vn -0.766000 -0.004400 0.642800
+vn -0.997900 -0.002900 -0.065200
+vn -0.997700 -0.011600 -0.066300
+vn -0.827600 -0.001100 -0.561200
+vn -0.827200 -0.004400 -0.561800
+vn -0.996300 -0.026500 -0.081600
+vn -0.877200 -0.047300 0.477800
+vn -0.988700 -0.054000 -0.139800
+vn -0.910800 -0.121600 0.394500
+vn -0.825900 -0.009200 -0.563700
+vn -0.822000 -0.015700 -0.569300
+vn -0.779400 -0.046400 0.624800
+vn -0.764700 -0.045800 0.642700
+vn -0.779700 -0.125100 0.613500
+vn -0.759200 -0.121300 0.639400
+vn -0.866100 -0.018000 0.499400
+vn -0.886900 -0.018000 0.461600
+vn -0.887100 -0.004500 0.461600
+vn -0.866300 -0.004500 0.499500
+vn -0.906200 -0.018000 0.422500
+vn -0.843900 -0.004500 0.536500
+vn -0.843700 -0.018000 0.536400
+vn -0.819700 -0.004500 0.572700
+vn -0.819600 -0.018000 0.572600
+vn -0.843000 -0.046300 0.535900
+vn -0.865400 -0.046300 0.499000
+vn -0.837500 -0.122600 0.532500
+vn -0.859700 -0.122600 0.495800
+vn -0.818900 -0.046300 0.572100
+vn -0.813600 -0.122600 0.568400
+vn -0.886100 -0.046300 0.461100
+vn -0.905300 -0.046300 0.422200
+vn -0.880400 -0.122600 0.458100
+vn -0.899500 -0.122600 0.419400
+vn -0.939500 -0.018000 0.342000
+vn -0.953500 -0.018000 0.300700
+vn -0.965800 -0.018000 0.258800
+vn -0.923700 -0.018000 0.382600
+vn -0.922900 -0.046300 0.382200
+vn -0.938700 -0.046300 0.341600
+vn -0.916900 -0.122600 0.379700
+vn -0.932600 -0.122600 0.339400
+vn -0.952700 -0.046300 0.300400
+vn -0.964900 -0.046300 0.258500
+vn -0.946500 -0.122600 0.298500
+vn -0.958600 -0.122600 0.256800
+vn -0.984600 -0.018000 0.173600
+vn -0.991300 -0.018000 0.130500
+vn -0.996000 -0.018000 0.087100
+vn -0.976100 -0.018000 0.216300
+vn -0.975200 -0.046300 0.216200
+vn -0.983700 -0.046300 0.173400
+vn -0.968900 -0.122600 0.214800
+vn -0.977400 -0.122600 0.172300
+vn -0.990400 -0.046300 0.130400
+vn -0.995100 -0.046300 0.087000
+vn -0.983900 -0.122600 0.129600
+vn -0.988700 -0.122600 0.086500
+vn -0.999800 -0.018000 0.000000
+vn -0.998900 -0.018000 -0.043500
+vn -0.996000 -0.018000 -0.087100
+vn -0.998900 -0.018000 0.043500
+vn -0.998000 -0.046300 0.043500
+vn -0.998900 -0.046300 0.000000
+vn -0.991500 -0.122600 0.043200
+vn -0.992400 -0.122600 0.000000
+vn -0.998000 -0.046300 -0.043500
+vn -0.995100 -0.046300 -0.087000
+vn -0.991500 -0.122600 -0.043200
+vn -0.988700 -0.122600 -0.086500
+vn -0.984600 -0.018000 -0.173600
+vn -0.976100 -0.018000 -0.216300
+vn -0.965800 -0.018000 -0.258800
+vn -0.991300 -0.018000 -0.130500
+vn -0.990400 -0.046300 -0.130400
+vn -0.983700 -0.046300 -0.173400
+vn -0.983900 -0.122600 -0.129600
+vn -0.977400 -0.122600 -0.172300
+vn -0.975200 -0.046300 -0.216200
+vn -0.964900 -0.046300 -0.258500
+vn -0.968900 -0.122600 -0.214800
+vn -0.958600 -0.122600 -0.256800
+vn -0.939500 -0.018000 -0.342000
+vn -0.923700 -0.018000 -0.382600
+vn -0.906200 -0.018000 -0.422500
+vn -0.953500 -0.018000 -0.300700
+vn -0.952700 -0.046300 -0.300400
+vn -0.938700 -0.046300 -0.341600
+vn -0.946500 -0.122600 -0.298500
+vn -0.932600 -0.122600 -0.339400
+vn -0.922900 -0.046300 -0.382200
+vn -0.905300 -0.046300 -0.422200
+vn -0.916900 -0.122600 -0.379700
+vn -0.899500 -0.122600 -0.419400
+vn -0.865900 -0.018000 -0.499900
+vn -0.843300 -0.018000 -0.537200
+vn -0.843400 -0.004500 -0.537200
+vn -0.866000 -0.004500 -0.500000
+vn -0.819000 -0.018000 -0.573500
+vn -0.819100 -0.004500 -0.573600
+vn -0.887000 -0.004500 -0.461800
+vn -0.886800 -0.018000 -0.461700
+vn -0.886000 -0.046300 -0.461300
+vn -0.865100 -0.046300 -0.499400
+vn -0.880300 -0.122600 -0.458300
+vn -0.859500 -0.122600 -0.496200
+vn -0.842500 -0.046300 -0.536700
+vn -0.818300 -0.046300 -0.573000
+vn -0.837000 -0.122600 -0.533200
+vn -0.813000 -0.122600 -0.569200
+vn -0.765900 -0.018000 -0.642700
+vn -0.737200 -0.018000 -0.675400
+vn -0.737300 -0.004500 -0.675500
+vn -0.766000 -0.004500 -0.642800
+vn -0.707000 -0.018000 -0.707000
+vn -0.707100 -0.004500 -0.707100
+vn -0.793300 -0.004500 -0.608800
+vn -0.793200 -0.018000 -0.608700
+vn -0.792500 -0.046300 -0.608100
+vn -0.765200 -0.046300 -0.642100
+vn -0.787300 -0.122600 -0.604200
+vn -0.760200 -0.122600 -0.637900
+vn -0.736500 -0.046300 -0.674800
+vn -0.706300 -0.046300 -0.706300
+vn -0.731700 -0.122600 -0.670500
+vn -0.701800 -0.122600 -0.701800
+vn -0.642700 -0.018000 -0.765900
+vn -0.608700 -0.018000 -0.793200
+vn -0.608800 -0.004500 -0.793300
+vn -0.642800 -0.004500 -0.766000
+vn -0.573500 -0.018000 -0.819000
+vn -0.573600 -0.004500 -0.819100
+vn -0.675500 -0.004500 -0.737300
+vn -0.675400 -0.018000 -0.737200
+vn -0.674800 -0.046300 -0.736500
+vn -0.642100 -0.046300 -0.765200
+vn -0.670500 -0.122600 -0.731700
+vn -0.637900 -0.122600 -0.760200
+vn -0.608100 -0.046300 -0.792500
+vn -0.573000 -0.046300 -0.818300
+vn -0.604200 -0.122600 -0.787300
+vn -0.569200 -0.122600 -0.813000
+vn -0.499900 -0.018000 -0.865900
+vn -0.461700 -0.018000 -0.886800
+vn -0.461800 -0.004500 -0.887000
+vn -0.500000 -0.004500 -0.866000
+vn -0.422500 -0.018000 -0.906200
+vn -0.422600 -0.004500 -0.906300
+vn -0.537200 -0.004500 -0.843400
+vn -0.537200 -0.018000 -0.843300
+vn -0.536700 -0.046300 -0.842500
+vn -0.499400 -0.046300 -0.865100
+vn -0.533200 -0.122600 -0.837000
+vn -0.496200 -0.122600 -0.859500
+vn -0.461300 -0.046300 -0.886000
+vn -0.422200 -0.046300 -0.905300
+vn -0.458300 -0.122600 -0.880300
+vn -0.419400 -0.122600 -0.899500
+vn -0.342000 -0.018000 -0.939500
+vn -0.300700 -0.018000 -0.953500
+vn -0.300700 -0.004500 -0.953700
+vn -0.342000 -0.004500 -0.939700
+vn -0.258800 -0.018000 -0.965800
+vn -0.258800 -0.004500 -0.965900
+vn -0.382600 -0.004500 -0.923900
+vn -0.382600 -0.018000 -0.923700
+vn -0.382200 -0.046300 -0.922900
+vn -0.341600 -0.046300 -0.938700
+vn -0.379700 -0.122600 -0.916900
+vn -0.339400 -0.122600 -0.932600
+vn -0.300400 -0.046300 -0.952700
+vn -0.258500 -0.046300 -0.964900
+vn -0.298500 -0.122600 -0.946500
+vn -0.256800 -0.122600 -0.958600
+vn -0.173600 -0.018000 -0.984600
+vn -0.130500 -0.018000 -0.991300
+vn -0.130600 -0.004500 -0.991400
+vn -0.173600 -0.004500 -0.984800
+vn -0.087100 -0.018000 -0.996000
+vn -0.087100 -0.004500 -0.996200
+vn -0.216400 -0.004500 -0.976300
+vn -0.216300 -0.018000 -0.976100
+vn -0.216200 -0.046300 -0.975200
+vn -0.173400 -0.046300 -0.983700
+vn -0.214800 -0.122600 -0.968900
+vn -0.172300 -0.122600 -0.977400
+vn -0.130400 -0.046300 -0.990400
+vn -0.087000 -0.046300 -0.995100
+vn -0.129600 -0.122600 -0.983900
+vn -0.086500 -0.122600 -0.988700
+vn 0.000000 -0.018000 -0.999800
+vn 0.043500 -0.018000 -0.998900
+vn 0.043500 -0.004500 -0.999000
+vn 0.000000 -0.004500 -1.000000
+vn -0.043500 -0.004500 -0.999000
+vn -0.043500 -0.018000 -0.998900
+vn -0.043500 -0.046300 -0.998000
+vn 0.000000 -0.046300 -0.998900
+vn -0.043200 -0.122600 -0.991500
+vn 0.000000 -0.122600 -0.992400
+vn 0.043500 -0.046300 -0.998000
+vn 0.043200 -0.122600 -0.991500
+vn -0.715200 -0.003100 -0.698800
+vn -0.708200 -0.003100 -0.706000
+vn -0.708100 -0.008000 -0.706100
+vn -0.716000 -0.008200 -0.698000
+vn -0.708200 -0.021600 -0.705700
+vn -0.720400 -0.022400 -0.693200
+vn -0.707000 -0.003200 -0.707200
+vn -0.706800 -0.008200 -0.707300
+vn -0.706400 -0.022000 -0.707400
+vn -0.753800 -0.008900 -0.657000
+vn -0.750000 -0.003400 -0.661400
+vn -0.771700 -0.020600 -0.635600
+vn -0.749300 -0.000800 -0.662200
+vn -0.715200 -0.000700 -0.698900
+vn -0.749300 0.000000 -0.662300
+vn -0.715300 0.000000 -0.698800
+vn -0.708200 -0.000800 -0.706000
+vn -0.707100 -0.000800 -0.707100
+vn -0.708200 0.000000 -0.706000
+vn -0.716200 0.013700 -0.697700
+vn -0.722600 0.061300 -0.688500
+vn -0.713200 0.030400 -0.700300
+vn -0.709000 0.009900 -0.705100
+vn -0.709500 0.013800 -0.704600
+vn -0.707600 0.006200 -0.706500
+vn -0.742100 0.149000 -0.653400
+vn -0.727200 0.064000 -0.683400
+vn -0.717500 0.018700 -0.696300
+vn -0.708300 0.001700 -0.705900
+vn -0.715300 0.002000 -0.698800
+vn -0.707200 0.001300 -0.707000
+vn -0.749400 0.002400 -0.662100
+vn -0.750500 0.018000 -0.660600
+vn -0.753900 0.094000 -0.650200
+vn -0.758800 0.236000 -0.607100
+vn -0.676200 0.720000 0.156100
+vn -0.579000 0.696500 0.423700
+vn -0.764600 0.409300 0.497800
+vn -0.906100 0.421700 0.033800
+vn -0.855800 0.183600 0.483600
+vn -0.981800 0.166400 -0.090800
+vn -0.560800 0.681200 0.470600
+vn -0.706700 0.385700 0.593000
+vn -0.754700 0.171600 0.633200
+vn -0.824600 0.197300 -0.530100
+vn -0.799000 0.457500 -0.390200
+vn -0.804500 0.066900 -0.590200
+vn -0.706700 0.646700 -0.286700
+vn -0.447200 0.879400 0.163000
+vn -0.371100 0.883500 0.285600
+vn -0.361700 0.881500 0.303500
+vn -0.635600 0.679400 0.366500
+vn -0.650800 0.679400 0.338700
+vn -0.818800 0.384700 0.426100
+vn -0.799600 0.384700 0.461100
+vn -0.873900 0.171300 0.454800
+vn -0.853500 0.171300 0.492100
+vn -0.665000 0.679400 0.310100
+vn -0.836500 0.384700 0.390100
+vn -0.892900 0.171200 0.416400
+vn -0.778900 0.384700 0.495200
+vn -0.619200 0.679500 0.393600
+vn -0.756700 0.384700 0.528600
+vn -0.601500 0.679400 0.420200
+vn -0.831400 0.171300 0.528600
+vn -0.807600 0.171300 0.564200
+vn -0.399800 0.880600 0.254200
+vn -0.410400 0.880600 0.236700
+vn -0.388400 0.880600 0.271300
+vn -0.420300 0.880600 0.218700
+vn -0.429400 0.880600 0.200200
+vn -0.689500 0.679400 0.250900
+vn -0.699800 0.679400 0.220600
+vn -0.880300 0.384700 0.277600
+vn -0.867400 0.384700 0.315700
+vn -0.939600 0.171300 0.296300
+vn -0.925800 0.171200 0.337000
+vn -0.708700 0.679400 0.189900
+vn -0.891600 0.384700 0.238900
+vn -0.951600 0.171300 0.255000
+vn -0.852800 0.384700 0.353200
+vn -0.677900 0.679400 0.280700
+vn -0.910200 0.171200 0.377000
+vn -0.437800 0.880600 0.181300
+vn -0.445200 0.880600 0.162100
+vn -0.451900 0.880600 0.142500
+vn -0.457700 0.880600 0.122600
+vn -0.722600 0.679400 0.127400
+vn -0.727400 0.679400 0.095800
+vn -0.915100 0.384700 0.120500
+vn -0.909000 0.384700 0.160300
+vn -0.976800 0.171300 0.128600
+vn -0.970200 0.171300 0.171100
+vn -0.730900 0.679400 0.063900
+vn -0.919500 0.384700 0.080400
+vn -0.981400 0.171200 0.085800
+vn -0.901200 0.384700 0.199700
+vn -0.716300 0.679400 0.158800
+vn -0.961900 0.171300 0.213200
+vn -0.462600 0.880600 0.102500
+vn -0.466600 0.880600 0.082300
+vn -0.469800 0.880600 0.061900
+vn -0.472000 0.880600 0.041300
+vn -0.733700 0.679400 0.000000
+vn -0.733000 0.679400 -0.032000
+vn -0.922100 0.384700 -0.040200
+vn -0.923000 0.384700 0.000000
+vn -0.984300 0.171300 -0.042900
+vn -0.985200 0.171300 0.000000
+vn -0.730900 0.679400 -0.063900
+vn -0.919500 0.384700 -0.080400
+vn -0.981400 0.171200 -0.085800
+vn -0.922100 0.384700 0.040200
+vn -0.733000 0.679400 0.032000
+vn -0.984300 0.171300 0.042900
+vn -0.473400 0.880600 0.020600
+vn -0.473800 0.880600 0.000000
+vn -0.473400 0.880600 -0.020600
+vn -0.472000 0.880600 -0.041300
+vn -0.722600 0.679400 -0.127400
+vn -0.716300 0.679400 -0.158800
+vn -0.901200 0.384700 -0.199700
+vn -0.909000 0.384700 -0.160300
+vn -0.961900 0.171200 -0.213200
+vn -0.970200 0.171200 -0.171100
+vn -0.708700 0.679400 -0.189900
+vn -0.891600 0.384700 -0.238900
+vn -0.951600 0.171300 -0.255000
+vn -0.915100 0.384700 -0.120500
+vn -0.727400 0.679400 -0.095800
+vn -0.976800 0.171200 -0.128600
+vn -0.469800 0.880600 -0.061900
+vn -0.466600 0.880600 -0.082300
+vn -0.462600 0.880600 -0.102500
+vn -0.457700 0.880600 -0.122600
+vn -0.689500 0.679400 -0.250900
+vn -0.677900 0.679400 -0.280700
+vn -0.852800 0.384700 -0.353200
+vn -0.867400 0.384700 -0.315700
+vn -0.910200 0.171300 -0.377000
+vn -0.925800 0.171300 -0.337000
+vn -0.665000 0.679400 -0.310100
+vn -0.836500 0.384700 -0.390100
+vn -0.892900 0.171300 -0.416400
+vn -0.880300 0.384700 -0.277600
+vn -0.699800 0.679400 -0.220600
+vn -0.939600 0.171300 -0.296300
+vn -0.451900 0.880600 -0.142500
+vn -0.445300 0.880600 -0.162100
+vn -0.437800 0.880600 -0.181300
+vn -0.429400 0.880600 -0.200200
+vn -0.635400 0.679400 -0.366900
+vn -0.618800 0.679400 -0.394200
+vn -0.778500 0.384700 -0.495900
+vn -0.799400 0.384700 -0.461500
+vn -0.830900 0.171200 -0.529300
+vn -0.853200 0.171300 -0.492600
+vn -0.601000 0.679400 -0.420900
+vn -0.756100 0.384700 -0.529400
+vn -0.807000 0.171200 -0.565100
+vn -0.818700 0.384700 -0.426200
+vn -0.650800 0.679400 -0.338800
+vn -0.873900 0.171300 -0.454900
+vn -0.420300 0.880600 -0.218800
+vn -0.410300 0.880600 -0.236900
+vn -0.399600 0.880600 -0.254600
+vn -0.388100 0.880600 -0.271800
+vn -0.562100 0.679400 -0.471600
+vn -0.541000 0.679400 -0.495700
+vn -0.680600 0.384700 -0.623600
+vn -0.707100 0.384700 -0.593300
+vn -0.726400 0.171300 -0.665500
+vn -0.754700 0.171300 -0.633300
+vn -0.518800 0.679400 -0.518800
+vn -0.652700 0.384700 -0.652700
+vn -0.696600 0.171200 -0.696600
+vn -0.732300 0.384700 -0.561900
+vn -0.582100 0.679400 -0.446700
+vn -0.781600 0.171300 -0.599800
+vn -0.375900 0.880600 -0.288500
+vn -0.363000 0.880600 -0.304600
+vn -0.349300 0.880600 -0.320100
+vn -0.335000 0.880600 -0.335000
+vn -0.471600 0.679400 -0.562100
+vn -0.446700 0.679400 -0.582100
+vn -0.561900 0.384700 -0.732300
+vn -0.593300 0.384700 -0.707100
+vn -0.599800 0.171300 -0.781600
+vn -0.633300 0.171300 -0.754700
+vn -0.420900 0.679400 -0.601000
+vn -0.529400 0.384700 -0.756100
+vn -0.565100 0.171300 -0.807000
+vn -0.623600 0.384700 -0.680600
+vn -0.495700 0.679400 -0.541000
+vn -0.665500 0.171200 -0.726400
+vn -0.320100 0.880600 -0.349300
+vn -0.304600 0.880600 -0.363000
+vn -0.288500 0.880600 -0.375900
+vn -0.271800 0.880600 -0.388100
+vn -0.366900 0.679400 -0.635400
+vn -0.338800 0.679400 -0.650800
+vn -0.426200 0.384700 -0.818700
+vn -0.461500 0.384700 -0.799400
+vn -0.454900 0.171200 -0.873900
+vn -0.492600 0.171200 -0.853200
+vn -0.310100 0.679400 -0.665000
+vn -0.390100 0.384700 -0.836500
+vn -0.416400 0.171300 -0.892900
+vn -0.495900 0.384700 -0.778500
+vn -0.394200 0.679400 -0.618800
+vn -0.529300 0.171300 -0.830900
+vn -0.254600 0.880600 -0.399600
+vn -0.236900 0.880600 -0.410400
+vn -0.218800 0.880600 -0.420300
+vn -0.200200 0.880600 -0.429400
+vn -0.250900 0.679400 -0.689500
+vn -0.220600 0.679400 -0.699800
+vn -0.277600 0.384700 -0.880300
+vn -0.315700 0.384700 -0.867400
+vn -0.296300 0.171300 -0.939600
+vn -0.337000 0.171300 -0.925800
+vn -0.189900 0.679400 -0.708700
+vn -0.238900 0.384700 -0.891600
+vn -0.255000 0.171300 -0.951600
+vn -0.353200 0.384700 -0.852800
+vn -0.280700 0.679400 -0.677900
+vn -0.377000 0.171300 -0.910200
+vn -0.181300 0.880600 -0.437800
+vn -0.162100 0.880600 -0.445200
+vn -0.142500 0.880600 -0.451900
+vn -0.122600 0.880600 -0.457700
+vn -0.127400 0.679400 -0.722600
+vn -0.095800 0.679400 -0.727400
+vn -0.120500 0.384700 -0.915100
+vn -0.160300 0.384700 -0.909000
+vn -0.128600 0.171200 -0.976800
+vn -0.171100 0.171200 -0.970200
+vn -0.063900 0.679400 -0.730900
+vn -0.080400 0.384700 -0.919500
+vn -0.085800 0.171200 -0.981500
+vn -0.199700 0.384700 -0.901200
+vn -0.158800 0.679400 -0.716300
+vn -0.213200 0.171200 -0.961900
+vn -0.102500 0.880600 -0.462600
+vn -0.082300 0.880600 -0.466600
+vn -0.061900 0.880600 -0.469800
+vn -0.041300 0.880600 -0.472000
+vn 0.000000 0.679400 -0.733700
+vn 0.032000 0.679400 -0.733000
+vn 0.040200 0.384700 -0.922100
+vn 0.000000 0.384700 -0.923000
+vn 0.042900 0.171200 -0.984300
+vn 0.000000 0.171200 -0.985200
+vn -0.040200 0.384700 -0.922100
+vn -0.032000 0.679400 -0.733000
+vn -0.042900 0.171200 -0.984300
+vn -0.020600 0.880600 -0.473400
+vn 0.000000 0.880600 -0.473800
+vn 0.020600 0.880600 -0.473400
+vn 0.384800 0.096100 -0.918000
+vn 0.721100 0.096700 -0.686100
+vn 0.496300 0.709000 -0.501000
+vn 0.151100 0.640600 -0.752800
+vn 0.762800 0.095000 -0.639600
+vn 0.543000 0.705400 -0.455500
+vn -0.436800 0.242700 -0.866200
+vn -0.313500 0.046200 -0.948500
+vn -0.660500 0.038800 -0.749700
+vn -0.623000 0.016900 -0.782000
+vn -0.343600 -0.125600 -0.930700
+vn 0.297500 -0.334000 -0.894300
+vn -0.428300 -0.173900 -0.886700
+vn 0.136400 -0.489500 -0.861200
+vn -0.611100 -0.009200 -0.791500
+vn -0.625500 -0.016400 -0.780000
+vn 0.649000 -0.406200 -0.643200
+vn 0.699000 -0.410800 -0.585300
+vn 0.543400 -0.600700 -0.586400
+vn 0.611200 -0.605000 -0.510300
+vn -0.694400 0.003300 -0.719500
+vn -0.670500 0.009000 -0.741800
+vn -0.687500 0.012300 -0.726000
+vn -0.700400 0.002800 -0.713700
+vn -0.705800 0.000300 -0.708400
+vn -0.704600 0.000600 -0.709500
+vn -0.702900 0.000600 -0.711200
+vn -0.687000 0.002700 -0.726600
+vn -0.701200 0.000500 -0.712900
+vn -0.681500 0.001300 -0.731700
+vn -0.655800 0.002300 -0.754900
+vn -0.653100 -0.001300 -0.757200
+vn -0.981400 0.019400 -0.191000
+vn -0.784900 0.007300 -0.619500
+vn -0.792900 0.021700 -0.608900
+vn -0.986400 0.057000 -0.154300
+vn -0.717100 0.002000 -0.696900
+vn -0.717200 0.005500 -0.696900
+vn -0.889600 0.067900 0.451600
+vn -0.902800 0.023800 0.429400
+vn -0.764500 0.063500 0.641500
+vn -0.765800 0.022100 0.642600
+vn -0.907500 0.005100 0.420000
+vn -0.978800 0.004100 -0.204800
+vn -0.908300 0.000000 0.418200
+vn -0.978400 0.000000 -0.206600
+vn -0.766000 0.004800 0.642800
+vn -0.782300 0.001500 -0.622900
+vn -0.717200 0.000400 -0.696900
+vn -0.782100 0.000000 -0.623100
+vn -0.717200 0.000000 -0.696900
+vn 0.862200 0.097000 -0.497100
+vn 0.882900 0.097100 -0.459400
+vn 0.626600 0.707800 -0.326100
+vn 0.612000 0.707700 -0.352900
+vn 0.902000 0.097100 -0.420600
+vn 0.640200 0.707800 -0.298500
+vn 0.596200 0.707700 -0.379000
+vn 0.840100 0.096800 -0.533800
+vn 0.579200 0.707700 -0.404600
+vn 0.816100 0.096500 -0.569800
+vn 0.770300 -0.409400 -0.488900
+vn 0.790600 -0.409100 -0.455500
+vn 0.673700 -0.603200 -0.426800
+vn 0.691500 -0.602900 -0.397900
+vn 0.748300 -0.409900 -0.521600
+vn 0.654600 -0.603700 -0.455000
+vn 0.809500 -0.408900 -0.421200
+vn 0.827100 -0.408900 -0.385700
+vn 0.707900 -0.602800 -0.368200
+vn 0.723200 -0.602700 -0.337200
+vn -0.866100 0.022100 0.499400
+vn -0.843700 0.022100 0.536400
+vn -0.842200 0.063500 0.535400
+vn -0.864500 0.063500 0.498500
+vn -0.819500 0.022100 0.572600
+vn -0.818100 0.063500 0.571500
+vn -0.885300 0.063500 0.460700
+vn -0.886800 0.022100 0.461500
+vn -0.904500 0.063500 0.421700
+vn -0.906100 0.022100 0.422500
+vn -0.887100 0.004800 0.461600
+vn -0.866300 0.004800 0.499500
+vn -0.906300 0.004800 0.422600
+vn -0.843900 0.004800 0.536500
+vn -0.819700 0.004800 0.572700
+vn 0.935200 0.097100 -0.340400
+vn 0.949200 0.097100 -0.299300
+vn 0.673700 0.707800 -0.212400
+vn 0.663800 0.707800 -0.241600
+vn 0.961300 0.097100 -0.257600
+vn 0.682300 0.707800 -0.182800
+vn 0.652600 0.707800 -0.270300
+vn 0.919500 0.097100 -0.380800
+vn 0.843100 -0.408900 -0.349200
+vn 0.857500 -0.408900 -0.312100
+vn 0.737200 -0.602700 -0.305300
+vn 0.749800 -0.602700 -0.272900
+vn 0.870300 -0.408900 -0.274400
+vn 0.881500 -0.408900 -0.236200
+vn 0.761000 -0.602700 -0.240000
+vn 0.770700 -0.602700 -0.206500
+vn -0.939500 0.022100 0.341900
+vn -0.923600 0.022100 0.382500
+vn -0.922000 0.063500 0.381800
+vn -0.937800 0.063500 0.341300
+vn -0.951800 0.063500 0.300100
+vn -0.953500 0.022100 0.300700
+vn -0.964000 0.063500 0.258300
+vn -0.965700 0.022100 0.258700
+vn -0.953700 0.004800 0.300700
+vn -0.939700 0.004800 0.342000
+vn -0.965900 0.004800 0.258800
+vn -0.923900 0.004800 0.382600
+vn 0.980100 0.097100 -0.172800
+vn 0.986700 0.097100 -0.129900
+vn 0.700400 0.707800 -0.092200
+vn 0.695700 0.707800 -0.122700
+vn 0.991500 0.097100 -0.086700
+vn 0.703700 0.707800 -0.061600
+vn 0.689700 0.707800 -0.152900
+vn 0.971700 0.097100 -0.215400
+vn 0.890900 -0.408900 -0.197500
+vn 0.898700 -0.408900 -0.158500
+vn 0.779000 -0.602700 -0.172600
+vn 0.785800 -0.602700 -0.138600
+vn 0.904800 -0.408900 -0.119100
+vn 0.909100 -0.408900 -0.079500
+vn 0.791100 -0.602700 -0.104200
+vn 0.794900 -0.602700 -0.069500
+vn -0.984600 0.022100 0.173600
+vn -0.976000 0.022100 0.216300
+vn -0.974300 0.063500 0.215900
+vn -0.982800 0.063500 0.173300
+vn -0.989400 0.063500 0.130300
+vn -0.991200 0.022100 0.130500
+vn -0.994200 0.063500 0.087000
+vn -0.995900 0.022100 0.087100
+vn -0.991400 0.004800 0.130600
+vn -0.984800 0.004800 0.173600
+vn -0.996200 0.004800 0.087100
+vn -0.976300 0.004800 0.216400
+vn 0.995200 0.097100 0.000000
+vn 0.994300 0.097100 0.043400
+vn 0.705700 0.707800 0.030800
+vn 0.706400 0.707800 0.000000
+vn 0.991500 0.097100 0.086700
+vn 0.703700 0.707800 0.061600
+vn 0.705700 0.707800 -0.030800
+vn 0.994300 0.097100 -0.043400
+vn 0.911700 -0.408900 -0.039800
+vn 0.912600 -0.408900 0.000000
+vn 0.797200 -0.602700 -0.034800
+vn 0.797900 -0.602700 0.000000
+vn 0.911700 -0.408900 0.039800
+vn 0.909100 -0.408900 0.079500
+vn 0.797200 -0.602700 0.034800
+vn 0.794900 -0.602700 0.069500
+vn -0.999800 0.022100 0.000000
+vn -0.998800 0.022100 0.043500
+vn -0.997000 0.063500 0.043500
+vn -0.998000 0.063500 0.000000
+vn -0.997000 0.063500 -0.043500
+vn -0.998800 0.022100 -0.043500
+vn -0.994200 0.063500 -0.087000
+vn -0.995900 0.022100 -0.087100
+vn -0.999000 0.004800 -0.043500
+vn -1.000000 0.004800 0.000000
+vn -0.996200 0.004800 -0.087100
+vn -0.999000 0.004800 0.043500
+vn 0.980100 0.097100 0.172800
+vn 0.971700 0.097100 0.215400
+vn 0.689700 0.707800 0.152900
+vn 0.695700 0.707800 0.122700
+vn 0.961300 0.097200 0.257600
+vn 0.682300 0.707800 0.182800
+vn 0.700400 0.707800 0.092200
+vn 0.986700 0.097100 0.129900
+vn 0.904800 -0.408900 0.119100
+vn 0.898700 -0.408900 0.158500
+vn 0.791100 -0.602700 0.104200
+vn 0.785800 -0.602700 0.138600
+vn 0.890900 -0.408900 0.197500
+vn 0.881500 -0.408900 0.236200
+vn 0.779000 -0.602700 0.172600
+vn 0.770700 -0.602700 0.206500
+vn -0.984600 0.022100 -0.173600
+vn -0.991200 0.022100 -0.130500
+vn -0.989400 0.063500 -0.130300
+vn -0.982800 0.063500 -0.173300
+vn -0.974300 0.063500 -0.215900
+vn -0.976000 0.022100 -0.216300
+vn -0.964000 0.063500 -0.258300
+vn -0.965700 0.022100 -0.258700
+vn -0.976300 0.004800 -0.216400
+vn -0.984800 0.004800 -0.173600
+vn -0.965900 0.004800 -0.258800
+vn -0.991400 0.004800 -0.130600
+vn 0.935200 0.097100 0.340400
+vn 0.919500 0.097100 0.380800
+vn 0.652600 0.707800 0.270300
+vn 0.663800 0.707800 0.241600
+vn 0.902000 0.097100 0.420600
+vn 0.640200 0.707800 0.298500
+vn 0.673700 0.707800 0.212400
+vn 0.949200 0.097100 0.299300
+vn 0.870300 -0.408900 0.274400
+vn 0.857500 -0.408900 0.312100
+vn 0.761000 -0.602700 0.240000
+vn 0.749800 -0.602700 0.272900
+vn 0.843100 -0.408900 0.349200
+vn 0.827100 -0.408900 0.385700
+vn 0.737200 -0.602700 0.305300
+vn 0.723200 -0.602700 0.337200
+vn -0.939500 0.022100 -0.341900
+vn -0.953500 0.022100 -0.300700
+vn -0.951800 0.063500 -0.300100
+vn -0.937800 0.063500 -0.341300
+vn -0.922000 0.063500 -0.381800
+vn -0.923600 0.022100 -0.382500
+vn -0.904500 0.063500 -0.421800
+vn -0.906100 0.022100 -0.422500
+vn -0.923900 0.004800 -0.382600
+vn -0.939700 0.004800 -0.342000
+vn -0.906300 0.004800 -0.422600
+vn -0.953700 0.004800 -0.300700
+vn 0.861900 0.097100 0.497600
+vn 0.839400 0.097100 0.534700
+vn 0.595800 0.707800 0.379500
+vn 0.611800 0.707800 0.353200
+vn 0.815300 0.097200 0.570800
+vn 0.578600 0.707800 0.405200
+vn 0.626600 0.707800 0.326200
+vn 0.882800 0.097100 0.459600
+vn 0.809400 -0.408900 0.421400
+vn 0.790300 -0.408900 0.456300
+vn 0.707800 -0.602700 0.368400
+vn 0.691000 -0.602700 0.398900
+vn 0.769600 -0.408900 0.490300
+vn 0.747500 -0.408900 0.523400
+vn 0.673000 -0.602700 0.428700
+vn 0.653600 -0.602700 0.457700
+vn -0.865800 0.022100 -0.499900
+vn -0.886700 0.022100 -0.461700
+vn -0.885200 0.063500 -0.460800
+vn -0.864300 0.063500 -0.499000
+vn -0.841700 0.063500 -0.536200
+vn -0.843200 0.022100 -0.537100
+vn -0.817500 0.063500 -0.572400
+vn -0.818900 0.022100 -0.573400
+vn -0.843400 0.004800 -0.537200
+vn -0.866000 0.004800 -0.500000
+vn -0.819100 0.004800 -0.573600
+vn -0.887000 0.004800 -0.461800
+vn 0.762400 0.097100 0.639700
+vn 0.733800 0.097100 0.672400
+vn 0.520800 0.707800 0.477200
+vn 0.541100 0.707800 0.454100
+vn 0.703800 0.097100 0.703800
+vn 0.499500 0.707800 0.499500
+vn 0.560400 0.707800 0.430000
+vn 0.789500 0.097100 0.605900
+vn 0.724000 -0.408900 0.555600
+vn 0.699100 -0.408900 0.586600
+vn 0.633000 -0.602700 0.485800
+vn 0.611200 -0.602700 0.512900
+vn 0.672800 -0.408900 0.616500
+vn 0.645300 -0.408900 0.645300
+vn 0.588300 -0.602700 0.539000
+vn 0.564200 -0.602700 0.564200
+vn -0.765800 0.022100 -0.642600
+vn -0.793100 0.022100 -0.608600
+vn -0.791700 0.063500 -0.607600
+vn -0.764500 0.063500 -0.641500
+vn -0.735800 0.063500 -0.674200
+vn -0.737100 0.022100 -0.675400
+vn -0.705700 0.063500 -0.705700
+vn -0.706900 0.022100 -0.706900
+vn -0.737300 0.004800 -0.675500
+vn -0.766000 0.004800 -0.642800
+vn -0.707100 0.004800 -0.707100
+vn -0.793300 0.004800 -0.608800
+vn 0.639700 0.097100 0.762400
+vn 0.605900 0.097100 0.789500
+vn 0.430000 0.707800 0.560400
+vn 0.454100 0.707800 0.541100
+vn 0.570800 0.097100 0.815300
+vn 0.405200 0.707800 0.578700
+vn 0.477200 0.707800 0.520800
+vn 0.672400 0.097100 0.733800
+vn 0.616500 -0.408900 0.672800
+vn 0.586600 -0.408900 0.699100
+vn 0.539000 -0.602700 0.588300
+vn 0.512900 -0.602700 0.611200
+vn 0.555600 -0.408900 0.724000
+vn 0.523400 -0.408900 0.747500
+vn 0.485800 -0.602700 0.633000
+vn 0.457700 -0.602700 0.653600
+vn -0.642600 0.022100 -0.765800
+vn -0.675400 0.022100 -0.737100
+vn -0.674200 0.063500 -0.735800
+vn -0.641500 0.063500 -0.764500
+vn -0.607600 0.063500 -0.791700
+vn -0.608600 0.022100 -0.793100
+vn -0.572400 0.063500 -0.817500
+vn -0.573400 0.022100 -0.818900
+vn -0.608800 0.004800 -0.793300
+vn -0.642800 0.004800 -0.766000
+vn -0.573600 0.004800 -0.819100
+vn -0.675500 0.004800 -0.737300
+vn 0.497600 0.097100 0.861900
+vn 0.459600 0.097100 0.882800
+vn 0.326200 0.707800 0.626600
+vn 0.353200 0.707800 0.611800
+vn 0.420600 0.097100 0.902000
+vn 0.298500 0.707800 0.640200
+vn 0.379500 0.707800 0.595800
+vn 0.534700 0.097100 0.839400
+vn 0.490300 -0.408900 0.769600
+vn 0.456300 -0.408900 0.790300
+vn 0.428700 -0.602700 0.673000
+vn 0.398900 -0.602700 0.691000
+vn 0.421400 -0.408900 0.809400
+vn 0.385700 -0.408900 0.827100
+vn 0.368400 -0.602700 0.707800
+vn 0.337200 -0.602700 0.723200
+vn -0.499900 0.022100 -0.865800
+vn -0.537100 0.022100 -0.843200
+vn -0.536200 0.063500 -0.841700
+vn -0.499000 0.063500 -0.864300
+vn -0.460800 0.063500 -0.885200
+vn -0.461700 0.022100 -0.886700
+vn -0.421800 0.063500 -0.904500
+vn -0.422500 0.022100 -0.906100
+vn -0.461800 0.004800 -0.887000
+vn -0.500000 0.004800 -0.866000
+vn -0.422600 0.004800 -0.906300
+vn -0.537200 0.004800 -0.843400
+vn 0.340400 0.097100 0.935200
+vn 0.299300 0.097100 0.949200
+vn 0.212400 0.707800 0.673700
+vn 0.241600 0.707800 0.663800
+vn 0.257600 0.097100 0.961300
+vn 0.182800 0.707800 0.682300
+vn 0.270300 0.707800 0.652600
+vn 0.380800 0.097100 0.919500
+vn 0.349200 -0.408900 0.843100
+vn 0.312100 -0.408900 0.857500
+vn 0.305300 -0.602700 0.737200
+vn 0.272900 -0.602700 0.749800
+vn 0.274400 -0.408900 0.870300
+vn 0.236200 -0.408900 0.881500
+vn 0.240000 -0.602700 0.761000
+vn 0.206500 -0.602700 0.770700
+vn -0.341900 0.022100 -0.939500
+vn -0.382500 0.022100 -0.923600
+vn -0.381800 0.063500 -0.922000
+vn -0.341300 0.063500 -0.937800
+vn -0.300100 0.063500 -0.951800
+vn -0.300700 0.022100 -0.953500
+vn -0.258300 0.063500 -0.964000
+vn -0.258700 0.022100 -0.965700
+vn -0.300700 0.004800 -0.953700
+vn -0.342000 0.004800 -0.939700
+vn -0.258800 0.004800 -0.965900
+vn -0.382600 0.004800 -0.923900
+vn 0.172800 0.097100 0.980100
+vn 0.129900 0.097100 0.986700
+vn 0.092200 0.707800 0.700400
+vn 0.122700 0.707800 0.695700
+vn 0.086700 0.097100 0.991500
+vn 0.061600 0.707800 0.703700
+vn 0.152900 0.707800 0.689700
+vn 0.215400 0.097100 0.971700
+vn 0.197500 -0.408900 0.890900
+vn 0.158500 -0.408900 0.898700
+vn 0.172600 -0.602700 0.779000
+vn 0.138600 -0.602700 0.785800
+vn 0.119100 -0.408900 0.904800
+vn 0.079500 -0.408900 0.909100
+vn 0.104200 -0.602700 0.791100
+vn 0.069500 -0.602700 0.794900
+vn -0.173600 0.022100 -0.984600
+vn -0.216300 0.022100 -0.976000
+vn -0.215900 0.063500 -0.974300
+vn -0.173300 0.063500 -0.982800
+vn -0.130300 0.063500 -0.989400
+vn -0.130500 0.022100 -0.991200
+vn -0.087000 0.063500 -0.994200
+vn -0.087100 0.022100 -0.995900
+vn -0.130600 0.004800 -0.991400
+vn -0.173600 0.004800 -0.984800
+vn -0.087100 0.004800 -0.996200
+vn -0.216400 0.004800 -0.976300
+vn 0.000000 0.097100 0.995200
+vn -0.043400 0.097100 0.994300
+vn -0.030800 0.707800 0.705700
+vn 0.000000 0.707800 0.706400
+vn 0.030800 0.707800 0.705700
+vn 0.043400 0.097100 0.994300
+vn 0.039800 -0.408900 0.911700
+vn 0.000000 -0.408900 0.912600
+vn 0.034800 -0.602700 0.797200
+vn 0.000000 -0.602700 0.797900
+vn -0.039800 -0.408900 0.911700
+vn -0.034800 -0.602700 0.797200
+vn 0.000000 0.022100 -0.999800
+vn -0.043500 0.022100 -0.998800
+vn -0.043500 0.063500 -0.997000
+vn 0.000000 0.063500 -0.998000
+vn 0.043500 0.063500 -0.997000
+vn 0.043500 0.022100 -0.998800
+vn 0.043500 0.004800 -0.999000
+vn 0.000000 0.004800 -1.000000
+vn -0.043500 0.004800 -0.999000
+vn -0.782200 0.000000 -0.623100
+vn -0.677900 0.000200 -0.735100
+vn -0.677500 0.000000 -0.735400
+vn -0.655900 -0.000100 -0.754800
+vn -0.655500 -0.000400 -0.755100
+vn -0.646300 -0.000400 -0.763100
+vn -0.645200 -0.001500 -0.764000
+vn -0.677500 0.000000 -0.735500
+vn -0.656100 0.000000 -0.754700
+vn -0.646600 0.000000 -0.762800
+vn -0.654500 -0.001000 -0.756000
+vn -0.679000 0.000500 -0.734100
+vn -0.642000 -0.004200 -0.766700
+vn -0.700000 0.000200 -0.714100
+vn -0.699400 0.000100 -0.714700
+vn -0.699100 0.000000 -0.715000
+vn 0.716000 -0.016000 -0.697900
+vn 0.714100 -0.003700 -0.700000
+vn 0.767800 -0.004200 -0.640700
+vn 0.767900 -0.016500 -0.640300
+vn 0.774500 -0.004300 -0.632500
+vn 0.774400 -0.016700 -0.632400
+vn 0.713300 0.000000 -0.700800
+vn 0.767700 0.000000 -0.640800
+vn 0.774500 0.000000 -0.632500
+vn 0.767400 -0.039600 -0.639900
+vn 0.714900 -0.040400 -0.698000
+vn 0.763800 -0.087200 -0.639500
+vn 0.697900 -0.091200 -0.710400
+vn 0.773900 -0.039500 -0.632000
+vn 0.771600 -0.086200 -0.630200
+vn 0.302200 -0.032000 -0.952700
+vn 0.297200 -0.013700 -0.954700
+vn -0.276000 -0.021700 -0.960900
+vn -0.288300 -0.010200 -0.957500
+vn 0.253900 -0.067400 -0.964900
+vn -0.250000 -0.030700 -0.967700
+vn 0.289200 -0.003200 -0.957200
+vn 0.286700 0.000000 -0.958000
+vn -0.300700 -0.002600 -0.953700
+vn -0.306000 0.000000 -0.952000
+vn 0.868200 -0.016500 -0.495900
+vn 0.868300 -0.004200 -0.496000
+vn 0.887600 -0.004200 -0.460600
+vn 0.887400 -0.016500 -0.460600
+vn 0.906300 -0.004200 -0.422600
+vn 0.906200 -0.016500 -0.422600
+vn 0.868300 0.000000 -0.496000
+vn 0.887600 0.000000 -0.460600
+vn 0.886900 -0.039200 -0.460200
+vn 0.867600 -0.039200 -0.495600
+vn 0.884300 -0.085500 -0.458900
+vn 0.865100 -0.085500 -0.494200
+vn 0.905600 -0.039200 -0.422300
+vn 0.903000 -0.085500 -0.421100
+vn 0.847500 -0.039200 -0.529300
+vn 0.848000 -0.016600 -0.529600
+vn 0.825900 -0.039300 -0.562500
+vn 0.826400 -0.016600 -0.562800
+vn 0.845000 -0.085600 -0.527800
+vn 0.823500 -0.085700 -0.560800
+vn 0.848200 -0.004300 -0.529700
+vn 0.848200 0.000000 -0.529700
+vn 0.826500 -0.004300 -0.562900
+vn 0.826500 0.000000 -0.562900
+vn 0.939500 -0.016500 -0.342000
+vn 0.939700 -0.004200 -0.342000
+vn 0.953700 -0.004200 -0.300700
+vn 0.953600 -0.016500 -0.300700
+vn 0.965900 -0.004200 -0.258800
+vn 0.965800 -0.016500 -0.258800
+vn 0.953000 -0.039200 -0.300500
+vn 0.939000 -0.039200 -0.341700
+vn 0.950200 -0.085500 -0.299600
+vn 0.936200 -0.085500 -0.340700
+vn 0.965200 -0.039200 -0.258600
+vn 0.962400 -0.085500 -0.257900
+vn 0.923200 -0.039200 -0.382300
+vn 0.923800 -0.016500 -0.382600
+vn 0.920500 -0.085500 -0.381200
+vn 0.923900 -0.004200 -0.382600
+vn 0.984600 -0.016500 -0.173600
+vn 0.984800 -0.004200 -0.173600
+vn 0.991400 -0.004200 -0.130600
+vn 0.991300 -0.016500 -0.130500
+vn 0.996200 -0.004200 -0.087100
+vn 0.996000 -0.016500 -0.087100
+vn 0.990700 -0.039200 -0.130500
+vn 0.984000 -0.039200 -0.173500
+vn 0.987800 -0.085500 -0.130100
+vn 0.981200 -0.085500 -0.173000
+vn 0.995400 -0.039200 -0.087100
+vn 0.992500 -0.085500 -0.086800
+vn 0.975500 -0.039200 -0.216200
+vn 0.976200 -0.016500 -0.216300
+vn 0.972700 -0.085500 -0.215600
+vn 0.976300 -0.004200 -0.216400
+vn 0.999800 -0.016500 0.000000
+vn 1.000000 -0.004300 0.000000
+vn 0.999000 -0.004200 0.043500
+vn 0.998900 -0.016500 0.043500
+vn 0.996200 -0.004200 0.087100
+vn 0.996000 -0.016500 0.087100
+vn 0.998300 -0.039200 0.043500
+vn 0.999200 -0.039200 0.000000
+vn 0.995400 -0.085500 0.043400
+vn 0.996300 -0.085500 0.000000
+vn 0.995400 -0.039200 0.087100
+vn 0.992500 -0.085500 0.086800
+vn 0.998300 -0.039200 -0.043500
+vn 0.998900 -0.016500 -0.043500
+vn 0.995400 -0.085500 -0.043400
+vn 0.999000 -0.004200 -0.043500
+vn 0.984600 -0.016500 0.173600
+vn 0.984800 -0.004200 0.173600
+vn 0.976300 -0.004200 0.216400
+vn 0.976200 -0.016500 0.216300
+vn 0.965900 -0.004200 0.258800
+vn 0.965800 -0.016500 0.258800
+vn 0.975500 -0.039200 0.216200
+vn 0.984000 -0.039200 0.173500
+vn 0.972700 -0.085500 0.215600
+vn 0.981200 -0.085500 0.173000
+vn 0.965200 -0.039200 0.258600
+vn 0.962400 -0.085500 0.257900
+vn 0.990700 -0.039200 0.130500
+vn 0.991300 -0.016500 0.130500
+vn 0.987800 -0.085500 0.130100
+vn 0.991400 -0.004200 0.130600
+vn 0.939500 -0.016500 0.342000
+vn 0.939700 -0.004200 0.342000
+vn 0.923900 -0.004200 0.382600
+vn 0.923800 -0.016500 0.382600
+vn 0.906300 -0.004200 0.422600
+vn 0.906200 -0.016500 0.422600
+vn 0.923200 -0.039200 0.382300
+vn 0.939000 -0.039200 0.341700
+vn 0.920500 -0.085500 0.381200
+vn 0.936200 -0.085500 0.340700
+vn 0.905600 -0.039200 0.422300
+vn 0.903000 -0.085500 0.421100
+vn 0.952900 -0.039200 0.300500
+vn 0.953600 -0.016500 0.300700
+vn 0.950200 -0.085500 0.299600
+vn 0.953700 -0.004200 0.300700
+vn 0.865900 -0.016500 0.499900
+vn 0.866000 -0.004200 0.500000
+vn 0.843400 -0.004300 0.537200
+vn 0.843300 -0.016500 0.537200
+vn 0.819100 -0.004200 0.573600
+vn 0.819000 -0.016500 0.573500
+vn 0.842700 -0.039200 0.536900
+vn 0.865400 -0.039200 0.499600
+vn 0.840300 -0.085500 0.535300
+vn 0.862800 -0.085500 0.498200
+vn 0.818500 -0.039200 0.573100
+vn 0.816100 -0.085500 0.571500
+vn 0.886300 -0.039200 0.461400
+vn 0.886900 -0.016500 0.461700
+vn 0.883700 -0.085500 0.460100
+vn 0.887000 -0.004200 0.461800
+vn 0.765900 -0.016500 0.642700
+vn 0.766000 -0.004200 0.642800
+vn 0.737300 -0.004200 0.675500
+vn 0.737200 -0.016500 0.675500
+vn 0.707100 -0.004200 0.707100
+vn 0.707000 -0.016500 0.707000
+vn 0.736700 -0.039200 0.675000
+vn 0.765400 -0.039200 0.642300
+vn 0.734600 -0.085500 0.673100
+vn 0.763200 -0.085500 0.640400
+vn 0.706500 -0.039200 0.706500
+vn 0.704500 -0.085500 0.704500
+vn 0.792700 -0.039200 0.608300
+vn 0.793200 -0.016500 0.608700
+vn 0.790400 -0.085500 0.606600
+vn 0.793300 -0.004200 0.608800
+vn 0.642700 -0.016500 0.765900
+vn 0.642800 -0.004200 0.766000
+vn 0.608800 -0.004200 0.793300
+vn 0.608700 -0.016500 0.793200
+vn 0.573600 -0.004200 0.819100
+vn 0.573500 -0.016500 0.819000
+vn 0.608300 -0.039200 0.792700
+vn 0.642300 -0.039200 0.765400
+vn 0.606600 -0.085500 0.790400
+vn 0.640400 -0.085500 0.763200
+vn 0.573100 -0.039200 0.818500
+vn 0.571500 -0.085500 0.816100
+vn 0.675000 -0.039200 0.736700
+vn 0.675500 -0.016500 0.737200
+vn 0.673100 -0.085500 0.734600
+vn 0.675500 -0.004200 0.737300
+vn 0.499900 -0.016500 0.865900
+vn 0.500000 -0.004200 0.866000
+vn 0.461800 -0.004200 0.887000
+vn 0.461700 -0.016500 0.886900
+vn 0.422600 -0.004200 0.906300
+vn 0.422500 -0.016500 0.906200
+vn 0.461400 -0.039200 0.886300
+vn 0.499600 -0.039200 0.865400
+vn 0.460100 -0.085500 0.883700
+vn 0.498200 -0.085500 0.862800
+vn 0.422300 -0.039200 0.905600
+vn 0.421100 -0.085500 0.903000
+vn 0.536800 -0.039200 0.842700
+vn 0.537200 -0.016500 0.843300
+vn 0.535300 -0.085500 0.840300
+vn 0.537200 -0.004200 0.843400
+vn 0.342000 -0.016500 0.939500
+vn 0.342000 -0.004200 0.939700
+vn 0.300700 -0.004200 0.953700
+vn 0.300700 -0.016500 0.953600
+vn 0.258800 -0.004200 0.965900
+vn 0.258800 -0.016500 0.965800
+vn 0.300500 -0.039200 0.952900
+vn 0.341700 -0.039200 0.939000
+vn 0.299600 -0.085500 0.950200
+vn 0.340700 -0.085500 0.936200
+vn 0.258600 -0.039200 0.965200
+vn 0.257900 -0.085500 0.962400
+vn 0.382300 -0.039200 0.923200
+vn 0.382600 -0.016500 0.923800
+vn 0.381200 -0.085500 0.920500
+vn 0.382600 -0.004200 0.923900
+vn 0.173600 -0.016500 0.984600
+vn 0.173600 -0.004200 0.984800
+vn 0.130600 -0.004200 0.991400
+vn 0.130500 -0.016500 0.991300
+vn 0.087100 -0.004200 0.996200
+vn 0.087100 -0.016500 0.996000
+vn 0.130500 -0.039200 0.990700
+vn 0.173500 -0.039200 0.984000
+vn 0.130100 -0.085500 0.987800
+vn 0.173000 -0.085500 0.981200
+vn 0.087100 -0.039200 0.995400
+vn 0.086800 -0.085500 0.992500
+vn 0.216200 -0.039200 0.975500
+vn 0.216300 -0.016500 0.976200
+vn 0.215600 -0.085500 0.972700
+vn 0.216400 -0.004200 0.976300
+vn 0.000000 -0.016500 0.999800
+vn 0.000000 -0.004200 1.000000
+vn -0.043500 -0.004200 0.999000
+vn -0.043500 -0.016500 0.998900
+vn -0.043500 -0.039200 0.998300
+vn 0.000000 -0.039200 0.999200
+vn -0.043400 -0.085500 0.995400
+vn 0.000000 -0.085500 0.996300
+vn 0.043500 -0.039200 0.998300
+vn 0.043500 -0.016500 0.998900
+vn 0.043400 -0.085500 0.995400
+vn 0.043500 -0.004200 0.999000
+vn 0.076400 -0.574100 -0.815200
+vn 0.479000 -0.697700 -0.532800
+vn 0.493600 -0.670600 -0.553700
+vn 0.078400 -0.544400 -0.835100
+vn 0.549200 -0.701300 -0.454400
+vn 0.567400 -0.674900 -0.471700
+vn -0.454600 -0.193800 -0.869400
+vn -0.446200 -0.216000 -0.868400
+vn -0.624000 -0.023000 -0.781100
+vn -0.620700 -0.028700 -0.783500
+vn -0.424800 -0.239700 -0.873000
+vn 0.099800 -0.595100 -0.797400
+vn -0.390100 -0.260600 -0.883100
+vn 0.143900 -0.602300 -0.785200
+vn -0.617200 -0.033800 -0.786100
+vn -0.612300 -0.038300 -0.789700
+vn 0.480600 -0.706900 -0.518900
+vn 0.544100 -0.709300 -0.448100
+vn 0.498200 -0.696000 -0.517000
+vn 0.554400 -0.696900 -0.454900
+vn -0.640600 -0.003900 -0.767800
+vn -0.635700 -0.010200 -0.771800
+vn -0.638000 -0.007400 -0.770000
+vn -0.642200 -0.002700 -0.766500
+vn -0.643800 -0.000700 -0.765200
+vn -0.642700 -0.001000 -0.766100
+vn -0.644300 0.000000 -0.764800
+vn -0.643400 0.000000 -0.765500
+vn -0.642100 -0.001300 -0.766600
+vn -0.639600 -0.004900 -0.768600
+vn -0.641800 -0.001400 -0.766800
+vn -0.638800 -0.005600 -0.769300
+vn -0.642900 0.000000 -0.765900
+vn -0.633900 -0.012500 -0.773300
+vn -0.632000 -0.014300 -0.774800
+vn -0.452200 0.835800 0.311300
+vn -0.620500 0.782100 0.056900
+vn -0.618700 0.784500 0.042200
+vn -0.433200 0.842800 0.319400
+vn -0.761600 0.543200 -0.353300
+vn -0.761000 0.514300 -0.395400
+vn -0.402500 0.841900 0.359400
+vn -0.421900 0.836100 0.350500
+vn -0.406600 0.839100 0.361400
+vn -0.421000 0.835200 0.353900
+vn -0.435300 0.827700 0.354200
+vn -0.475800 0.825700 0.302900
+vn -0.457500 0.808200 0.370800
+vn -0.494600 0.805400 0.326600
+vn -0.433100 0.827400 0.357600
+vn -0.455400 0.808100 0.373600
+vn 0.620300 -0.698900 -0.355800
+vn 0.634700 -0.698800 -0.329800
+vn 0.656700 -0.672500 -0.341400
+vn 0.641600 -0.672600 -0.368700
+vn 0.648300 -0.698800 -0.302300
+vn 0.670800 -0.672400 -0.312800
+vn 0.625400 -0.672900 -0.395000
+vn 0.604900 -0.699200 -0.380900
+vn 0.607800 -0.673400 -0.420800
+vn 0.588300 -0.699700 -0.405400
+vn 0.598800 -0.707200 -0.375900
+vn 0.613800 -0.706900 -0.351500
+vn 0.609700 -0.694600 -0.381800
+vn 0.624700 -0.694300 -0.357300
+vn 0.582600 -0.707700 -0.399700
+vn 0.593400 -0.695100 -0.405800
+vn 0.627800 -0.706800 -0.326100
+vn 0.641200 -0.706700 -0.299000
+vn 0.638800 -0.694100 -0.331700
+vn 0.652400 -0.694100 -0.304200
+vn -0.481900 0.831400 0.276400
+vn -0.469900 0.831700 0.295800
+vn -0.467300 0.833300 0.295100
+vn -0.479500 0.833100 0.275500
+vn -0.472200 0.829200 0.299100
+vn -0.484700 0.829000 0.278900
+vn -0.456800 0.832000 0.314800
+vn -0.454100 0.833600 0.314300
+vn -0.458600 0.829500 0.318700
+vn -0.490800 0.833000 0.255200
+vn -0.493100 0.831400 0.256200
+vn -0.501400 0.833000 0.233800
+vn -0.503700 0.831300 0.234900
+vn -0.496300 0.828900 0.258100
+vn -0.507000 0.828900 0.236400
+vn -0.501700 0.824900 0.260500
+vn -0.490400 0.825000 0.280900
+vn -0.525400 0.805900 0.272800
+vn -0.513700 0.806000 0.293900
+vn -0.512300 0.824900 0.238900
+vn -0.536600 0.805900 0.250200
+vn -0.478400 0.825200 0.300300
+vn -0.465300 0.825500 0.319300
+vn -0.501300 0.806300 0.313900
+vn -0.487900 0.806600 0.333600
+vn 0.672200 -0.698800 -0.244600
+vn 0.682200 -0.698800 -0.215100
+vn 0.705900 -0.672400 -0.222600
+vn 0.695500 -0.672400 -0.253100
+vn 0.690900 -0.698800 -0.185100
+vn 0.714900 -0.672400 -0.191500
+vn 0.683800 -0.672400 -0.283200
+vn 0.660900 -0.698800 -0.273700
+vn 0.653600 -0.706700 -0.270700
+vn 0.664800 -0.706700 -0.242000
+vn 0.665000 -0.694100 -0.275400
+vn 0.676400 -0.694100 -0.246200
+vn 0.674700 -0.706700 -0.212700
+vn 0.683300 -0.706700 -0.183100
+vn 0.686500 -0.694100 -0.216500
+vn 0.695300 -0.694100 -0.186300
+vn -0.522200 0.831300 0.190100
+vn -0.513500 0.831300 0.212700
+vn -0.511100 0.833000 0.211700
+vn -0.519900 0.833000 0.189200
+vn -0.516900 0.828900 0.214100
+vn -0.525700 0.828900 0.191300
+vn -0.527600 0.833000 0.166400
+vn -0.530000 0.831300 0.167100
+vn -0.534400 0.833000 0.143200
+vn -0.536800 0.831300 0.143800
+vn -0.533500 0.828900 0.168200
+vn -0.540400 0.828900 0.144800
+vn -0.539100 0.824900 0.170000
+vn -0.531200 0.824900 0.193300
+vn -0.564600 0.805900 0.178000
+vn -0.556400 0.805900 0.202500
+vn -0.546100 0.824900 0.146300
+vn -0.571900 0.805900 0.153200
+vn -0.522300 0.824900 0.216300
+vn -0.547000 0.805900 0.226500
+vn 0.704500 -0.698800 -0.124200
+vn 0.709200 -0.698800 -0.093400
+vn 0.733800 -0.672400 -0.096600
+vn 0.728900 -0.672400 -0.128500
+vn 0.712600 -0.698800 -0.062300
+vn 0.737300 -0.672400 -0.064500
+vn 0.722600 -0.672400 -0.160200
+vn 0.698400 -0.698800 -0.154800
+vn 0.690700 -0.706700 -0.153100
+vn 0.696700 -0.706700 -0.122800
+vn 0.702800 -0.694100 -0.155800
+vn 0.708900 -0.694100 -0.125000
+vn 0.701400 -0.706700 -0.092300
+vn 0.704700 -0.706700 -0.061600
+vn 0.713700 -0.694100 -0.094000
+vn 0.717100 -0.694100 -0.062700
+vn -0.547300 0.831300 0.096500
+vn -0.542600 0.831300 0.120200
+vn -0.540100 0.833000 0.119700
+vn -0.544800 0.833000 0.096000
+vn -0.546200 0.828900 0.121000
+vn -0.551000 0.828900 0.097100
+vn -0.548500 0.833000 0.072200
+vn -0.551000 0.831300 0.072500
+vn -0.551100 0.833000 0.048200
+vn -0.553600 0.831300 0.048400
+vn -0.554600 0.828900 0.073000
+vn -0.557300 0.828900 0.048700
+vn -0.560500 0.824900 0.073800
+vn -0.556700 0.824900 0.098100
+vn -0.587000 0.805900 0.077300
+vn -0.583100 0.805900 0.102800
+vn -0.563200 0.824900 0.049300
+vn -0.589800 0.805900 0.051600
+vn -0.551900 0.824900 0.122300
+vn -0.578000 0.805900 0.128100
+vn 0.715300 -0.698800 0.000000
+vn 0.714600 -0.698800 0.031200
+vn 0.739400 -0.672400 0.032200
+vn 0.740100 -0.672400 0.000000
+vn 0.712600 -0.698800 0.062300
+vn 0.737300 -0.672400 0.064500
+vn 0.739400 -0.672400 -0.032200
+vn 0.714600 -0.698800 -0.031200
+vn 0.706800 -0.706700 -0.030800
+vn 0.707400 -0.706700 0.000000
+vn 0.719100 -0.694100 -0.031300
+vn 0.719800 -0.694100 0.000000
+vn 0.706800 -0.706700 0.030800
+vn 0.704700 -0.706700 0.061600
+vn 0.719100 -0.694100 0.031300
+vn 0.717100 -0.694100 0.062700
+vn -0.555700 0.831300 0.000000
+vn -0.555200 0.831300 0.024200
+vn -0.552700 0.833000 0.024100
+vn -0.553200 0.833000 0.000000
+vn -0.558900 0.828900 0.024400
+vn -0.559400 0.828900 0.000000
+vn -0.552700 0.833000 -0.024100
+vn -0.555200 0.831300 -0.024200
+vn -0.551100 0.833000 -0.048200
+vn -0.553600 0.831300 -0.048400
+vn -0.558900 0.828900 -0.024400
+vn -0.557300 0.828900 -0.048700
+vn -0.564800 0.824900 -0.024600
+vn -0.565300 0.824900 0.000000
+vn -0.591500 0.805900 -0.025800
+vn -0.592000 0.805900 0.000000
+vn -0.563200 0.824900 -0.049300
+vn -0.589800 0.805900 -0.051600
+vn -0.564800 0.824900 0.024600
+vn -0.591500 0.805900 0.025800
+vn 0.704500 -0.698800 0.124200
+vn 0.698400 -0.698800 0.154800
+vn 0.722600 -0.672400 0.160200
+vn 0.728900 -0.672400 0.128500
+vn 0.690900 -0.698800 0.185100
+vn 0.714900 -0.672400 0.191500
+vn 0.733800 -0.672400 0.096600
+vn 0.709200 -0.698800 0.093400
+vn 0.701400 -0.706700 0.092300
+vn 0.696700 -0.706700 0.122800
+vn 0.713700 -0.694100 0.094000
+vn 0.708900 -0.694100 0.125000
+vn 0.690700 -0.706700 0.153100
+vn 0.683300 -0.706700 0.183100
+vn 0.702800 -0.694100 0.155800
+vn 0.695300 -0.694100 0.186300
+vn -0.547300 0.831300 -0.096500
+vn -0.551000 0.831300 -0.072500
+vn -0.548500 0.833000 -0.072200
+vn -0.544800 0.833000 -0.096000
+vn -0.554600 0.828900 -0.073000
+vn -0.551000 0.828900 -0.097100
+vn -0.540100 0.833000 -0.119700
+vn -0.542600 0.831300 -0.120200
+vn -0.534400 0.833000 -0.143200
+vn -0.536800 0.831300 -0.143800
+vn -0.546200 0.828900 -0.121000
+vn -0.540400 0.828900 -0.144800
+vn -0.551900 0.824900 -0.122300
+vn -0.556700 0.824900 -0.098100
+vn -0.578000 0.805900 -0.128100
+vn -0.583100 0.805900 -0.102800
+vn -0.546100 0.824900 -0.146300
+vn -0.571900 0.805900 -0.153200
+vn -0.560500 0.824900 -0.073800
+vn -0.587000 0.805900 -0.077300
+vn 0.672200 -0.698800 0.244600
+vn 0.660900 -0.698800 0.273700
+vn 0.683800 -0.672400 0.283200
+vn 0.695500 -0.672400 0.253100
+vn 0.648300 -0.698800 0.302300
+vn 0.670800 -0.672400 0.312800
+vn 0.705900 -0.672400 0.222600
+vn 0.682200 -0.698800 0.215100
+vn 0.674700 -0.706700 0.212700
+vn 0.664800 -0.706700 0.242000
+vn 0.686500 -0.694100 0.216500
+vn 0.676400 -0.694100 0.246200
+vn 0.653600 -0.706700 0.270700
+vn 0.641200 -0.706700 0.299000
+vn 0.665000 -0.694100 0.275400
+vn 0.652400 -0.694100 0.304200
+vn -0.522200 0.831300 -0.190100
+vn -0.530000 0.831300 -0.167100
+vn -0.527600 0.833000 -0.166400
+vn -0.519900 0.833000 -0.189200
+vn -0.533500 0.828900 -0.168200
+vn -0.525700 0.828900 -0.191300
+vn -0.511100 0.833000 -0.211700
+vn -0.513500 0.831300 -0.212700
+vn -0.501400 0.833000 -0.233800
+vn -0.503700 0.831300 -0.234900
+vn -0.516900 0.828900 -0.214100
+vn -0.507000 0.828900 -0.236400
+vn -0.522300 0.824900 -0.216300
+vn -0.531200 0.824900 -0.193300
+vn -0.547000 0.805900 -0.226500
+vn -0.556400 0.805900 -0.202500
+vn -0.512300 0.824900 -0.238900
+vn -0.536600 0.805900 -0.250200
+vn -0.539100 0.824900 -0.170000
+vn -0.564600 0.805900 -0.178000
+vn 0.619500 -0.698800 0.357600
+vn 0.603300 -0.698800 0.384300
+vn 0.624200 -0.672400 0.397600
+vn 0.641000 -0.672400 0.370100
+vn 0.586000 -0.698800 0.410300
+vn 0.606300 -0.672400 0.424500
+vn 0.656500 -0.672400 0.341800
+vn 0.634500 -0.698800 0.330300
+vn 0.627500 -0.706700 0.326700
+vn 0.612700 -0.706700 0.353700
+vn 0.638500 -0.694100 0.332400
+vn 0.623400 -0.694100 0.359900
+vn 0.596700 -0.706700 0.380100
+vn 0.579500 -0.706700 0.405800
+vn 0.607100 -0.694100 0.386700
+vn 0.589600 -0.694100 0.412900
+vn -0.481300 0.831300 -0.277900
+vn -0.492900 0.831300 -0.256600
+vn -0.490700 0.833000 -0.255500
+vn -0.479100 0.833000 -0.276600
+vn -0.496200 0.828900 -0.258300
+vn -0.484500 0.828900 -0.279700
+vn -0.466600 0.833000 -0.297200
+vn -0.468700 0.831300 -0.298600
+vn -0.453200 0.833000 -0.317300
+vn -0.455200 0.831300 -0.318800
+vn -0.471800 0.828900 -0.300500
+vn -0.458300 0.828900 -0.320900
+vn -0.476800 0.824900 -0.303700
+vn -0.489600 0.824900 -0.282700
+vn -0.499300 0.805900 -0.318100
+vn -0.512700 0.805900 -0.296000
+vn -0.463100 0.824900 -0.324300
+vn -0.485000 0.805900 -0.339600
+vn -0.501400 0.824900 -0.261100
+vn -0.525100 0.805900 -0.273400
+vn 0.548000 -0.698800 0.459800
+vn 0.527400 -0.698800 0.483200
+vn 0.545700 -0.672400 0.500000
+vn 0.567000 -0.672400 0.475800
+vn 0.505800 -0.698800 0.505800
+vn 0.523300 -0.672400 0.523300
+vn 0.587100 -0.672400 0.450600
+vn 0.567500 -0.698800 0.435500
+vn 0.561200 -0.706700 0.430700
+vn 0.541900 -0.706700 0.454700
+vn 0.571100 -0.694100 0.438200
+vn 0.551400 -0.694100 0.462700
+vn 0.521600 -0.706700 0.477900
+vn 0.500200 -0.706700 0.500200
+vn 0.530700 -0.694100 0.486300
+vn 0.509000 -0.694100 0.509000
+vn -0.425700 0.831300 -0.357200
+vn -0.440900 0.831300 -0.338300
+vn -0.438900 0.833000 -0.336800
+vn -0.423800 0.833000 -0.355600
+vn -0.443800 0.828900 -0.340600
+vn -0.428500 0.828900 -0.359600
+vn -0.407900 0.833000 -0.373700
+vn -0.409800 0.831300 -0.375400
+vn -0.391200 0.833000 -0.391200
+vn -0.393000 0.831300 -0.393000
+vn -0.412500 0.828900 -0.377900
+vn -0.395600 0.828900 -0.395600
+vn -0.416800 0.824900 -0.381900
+vn -0.433100 0.824900 -0.363400
+vn -0.436500 0.805900 -0.399900
+vn -0.453500 0.805900 -0.380600
+vn -0.399700 0.824900 -0.399700
+vn -0.418600 0.805900 -0.418600
+vn -0.448500 0.824900 -0.344200
+vn -0.469700 0.805900 -0.360400
+vn 0.459800 -0.698800 0.548000
+vn 0.435500 -0.698800 0.567500
+vn 0.450600 -0.672400 0.587200
+vn 0.475800 -0.672400 0.567000
+vn 0.410300 -0.698800 0.586000
+vn 0.424500 -0.672400 0.606300
+vn 0.500000 -0.672400 0.545700
+vn 0.483200 -0.698800 0.527400
+vn 0.477900 -0.706700 0.521600
+vn 0.454700 -0.706700 0.541900
+vn 0.486300 -0.694100 0.530700
+vn 0.462700 -0.694100 0.551400
+vn 0.430700 -0.706700 0.561200
+vn 0.405800 -0.706700 0.579500
+vn 0.438200 -0.694100 0.571100
+vn 0.412900 -0.694100 0.589600
+vn -0.357200 0.831300 -0.425700
+vn -0.375400 0.831300 -0.409800
+vn -0.373700 0.833000 -0.407900
+vn -0.355600 0.833000 -0.423800
+vn -0.377900 0.828900 -0.412500
+vn -0.359600 0.828900 -0.428500
+vn -0.336800 0.833000 -0.438900
+vn -0.338300 0.831300 -0.440900
+vn -0.317300 0.833000 -0.453200
+vn -0.318800 0.831300 -0.455200
+vn -0.340600 0.828900 -0.443800
+vn -0.320900 0.828900 -0.458300
+vn -0.344200 0.824900 -0.448500
+vn -0.363400 0.824900 -0.433100
+vn -0.360400 0.805900 -0.469700
+vn -0.380600 0.805900 -0.453500
+vn -0.324300 0.824900 -0.463100
+vn -0.339600 0.805900 -0.485000
+vn -0.381900 0.824900 -0.416800
+vn -0.399900 0.805900 -0.436500
+vn 0.357600 -0.698800 0.619500
+vn 0.330300 -0.698800 0.634500
+vn 0.341800 -0.672400 0.656500
+vn 0.370100 -0.672400 0.641000
+vn 0.302300 -0.698800 0.648300
+vn 0.312800 -0.672400 0.670800
+vn 0.397600 -0.672400 0.624200
+vn 0.384300 -0.698800 0.603300
+vn 0.380100 -0.706700 0.596700
+vn 0.353700 -0.706700 0.612700
+vn 0.386700 -0.694100 0.607100
+vn 0.359900 -0.694100 0.623400
+vn 0.326700 -0.706700 0.627500
+vn 0.299000 -0.706700 0.641200
+vn 0.332400 -0.694100 0.638500
+vn 0.304200 -0.694100 0.652400
+vn -0.277900 0.831300 -0.481300
+vn -0.298600 0.831300 -0.468700
+vn -0.297200 0.833000 -0.466600
+vn -0.276600 0.833000 -0.479100
+vn -0.300500 0.828900 -0.471800
+vn -0.279700 0.828900 -0.484500
+vn -0.255500 0.833000 -0.490700
+vn -0.256600 0.831300 -0.493000
+vn -0.233800 0.833000 -0.501400
+vn -0.234900 0.831300 -0.503700
+vn -0.258300 0.828900 -0.496200
+vn -0.236400 0.828900 -0.507000
+vn -0.261100 0.824900 -0.501400
+vn -0.282700 0.824900 -0.489600
+vn -0.273400 0.805900 -0.525100
+vn -0.296000 0.805900 -0.512700
+vn -0.238900 0.824900 -0.512300
+vn -0.250200 0.805900 -0.536600
+vn -0.303700 0.824900 -0.476800
+vn -0.318100 0.805900 -0.499300
+vn 0.244600 -0.698800 0.672200
+vn 0.215100 -0.698800 0.682200
+vn 0.222600 -0.672400 0.705900
+vn 0.253100 -0.672400 0.695500
+vn 0.185100 -0.698800 0.690900
+vn 0.191500 -0.672400 0.714900
+vn 0.283200 -0.672400 0.683800
+vn 0.273700 -0.698800 0.660900
+vn 0.270700 -0.706700 0.653600
+vn 0.242000 -0.706700 0.664800
+vn 0.275400 -0.694100 0.665100
+vn 0.246200 -0.694100 0.676400
+vn 0.212700 -0.706700 0.674700
+vn 0.183100 -0.706700 0.683300
+vn 0.216500 -0.694100 0.686500
+vn 0.186300 -0.694100 0.695300
+vn -0.190100 0.831300 -0.522200
+vn -0.212700 0.831300 -0.513500
+vn -0.211700 0.833000 -0.511100
+vn -0.189200 0.833000 -0.519900
+vn -0.214100 0.828900 -0.516900
+vn -0.191300 0.828900 -0.525700
+vn -0.166400 0.833000 -0.527600
+vn -0.167100 0.831300 -0.530000
+vn -0.143200 0.833000 -0.534400
+vn -0.143800 0.831300 -0.536800
+vn -0.168200 0.828900 -0.533500
+vn -0.144800 0.828900 -0.540400
+vn -0.170000 0.824900 -0.539100
+vn -0.193300 0.824900 -0.531200
+vn -0.178000 0.805900 -0.564600
+vn -0.202500 0.805900 -0.556400
+vn -0.146300 0.824900 -0.546100
+vn -0.153200 0.805900 -0.571900
+vn -0.216300 0.824900 -0.522300
+vn -0.226500 0.805900 -0.547000
+vn 0.124200 -0.698800 0.704500
+vn 0.093400 -0.698800 0.709200
+vn 0.096600 -0.672400 0.733800
+vn 0.128500 -0.672400 0.728900
+vn 0.062300 -0.698800 0.712600
+vn 0.064500 -0.672400 0.737300
+vn 0.160200 -0.672400 0.722600
+vn 0.154800 -0.698800 0.698400
+vn 0.153100 -0.706700 0.690700
+vn 0.122800 -0.706700 0.696700
+vn 0.155800 -0.694100 0.702800
+vn 0.125000 -0.694100 0.708900
+vn 0.092300 -0.706700 0.701400
+vn 0.061600 -0.706700 0.704700
+vn 0.094000 -0.694100 0.713700
+vn 0.062700 -0.694100 0.717100
+vn -0.096500 0.831300 -0.547300
+vn -0.120200 0.831300 -0.542600
+vn -0.119700 0.833000 -0.540100
+vn -0.096000 0.833000 -0.544800
+vn -0.121000 0.828900 -0.546200
+vn -0.097100 0.828900 -0.551000
+vn -0.072200 0.833000 -0.548500
+vn -0.072500 0.831300 -0.551000
+vn -0.048200 0.833000 -0.551100
+vn -0.048400 0.831300 -0.553600
+vn -0.073000 0.828900 -0.554600
+vn -0.048700 0.828900 -0.557300
+vn -0.073800 0.824900 -0.560500
+vn -0.098100 0.824900 -0.556700
+vn -0.077300 0.805900 -0.587000
+vn -0.102800 0.805900 -0.583100
+vn -0.049300 0.824900 -0.563200
+vn -0.051600 0.805900 -0.589800
+vn -0.122300 0.824900 -0.551900
+vn -0.128100 0.805900 -0.578000
+vn 0.000000 -0.698800 0.715300
+vn -0.031200 -0.698800 0.714600
+vn -0.032200 -0.672400 0.739400
+vn 0.000000 -0.672400 0.740100
+vn 0.032200 -0.672400 0.739400
+vn 0.031200 -0.698800 0.714600
+vn 0.030800 -0.706700 0.706800
+vn 0.000000 -0.706700 0.707400
+vn 0.031300 -0.694100 0.719100
+vn 0.000000 -0.694100 0.719800
+vn -0.030800 -0.706700 0.706800
+vn -0.031300 -0.694100 0.719100
+vn 0.000000 0.831300 -0.555700
+vn -0.024200 0.831300 -0.555200
+vn -0.024100 0.833000 -0.552700
+vn 0.000000 0.833000 -0.553200
+vn -0.024400 0.828900 -0.558900
+vn 0.000000 0.828900 -0.559400
+vn 0.024100 0.833000 -0.552700
+vn 0.024200 0.831300 -0.555200
+vn 0.024400 0.828900 -0.558900
+vn 0.024600 0.824900 -0.564800
+vn 0.000000 0.824900 -0.565300
+vn 0.025800 0.805900 -0.591500
+vn 0.000000 0.805900 -0.592000
+vn -0.024600 0.824900 -0.564800
+vn -0.025800 0.805900 -0.591500
+vn 0.000000 0.684700 -0.728800
+vn -0.031700 0.684700 -0.728100
+vn -0.028000 0.765500 -0.642800
+vn 0.000000 0.765500 -0.643500
+vn -0.063500 0.684700 -0.726100
+vn -0.056100 0.765500 -0.641000
+vn 0.028000 0.765500 -0.642800
+vn 0.031700 0.684700 -0.728100
+vn 0.037300 0.516700 -0.855300
+vn 0.000000 0.516700 -0.856100
+vn 0.039300 0.428800 -0.902500
+vn 0.000000 0.428900 -0.903300
+vn -0.037300 0.516700 -0.855300
+vn -0.074600 0.516700 -0.852900
+vn -0.039300 0.428900 -0.902500
+vn -0.078700 0.428900 -0.899900
+vn -0.126600 0.684700 -0.717800
+vn -0.157700 0.684700 -0.711600
+vn -0.139200 0.765500 -0.628200
+vn -0.111700 0.765500 -0.633700
+vn -0.188600 0.684700 -0.704000
+vn -0.166500 0.765500 -0.621500
+vn -0.084000 0.765500 -0.638000
+vn -0.095200 0.684700 -0.722600
+vn -0.111800 0.516700 -0.848800
+vn -0.148700 0.516700 -0.843100
+vn -0.117900 0.428900 -0.895600
+vn -0.156900 0.428900 -0.889600
+vn -0.185200 0.516700 -0.835800
+vn -0.221600 0.516700 -0.827000
+vn -0.195500 0.428900 -0.881900
+vn -0.233800 0.428900 -0.872600
+vn -0.249300 0.684700 -0.684900
+vn -0.278900 0.684700 -0.673400
+vn -0.246200 0.765500 -0.594500
+vn -0.220100 0.765500 -0.604700
+vn -0.308000 0.684700 -0.660500
+vn -0.271900 0.765500 -0.583200
+vn -0.193500 0.765500 -0.613700
+vn -0.219200 0.684700 -0.695100
+vn -0.257500 0.516700 -0.816500
+vn -0.292800 0.516700 -0.804500
+vn -0.271700 0.428900 -0.861500
+vn -0.308900 0.428900 -0.848900
+vn -0.327600 0.516700 -0.791000
+vn -0.361800 0.516700 -0.775900
+vn -0.345700 0.428900 -0.834600
+vn -0.381800 0.428900 -0.818700
+vn -0.364400 0.684700 -0.631200
+vn -0.391600 0.684700 -0.614700
+vn -0.345700 0.765500 -0.542700
+vn -0.321700 0.765500 -0.557200
+vn -0.418000 0.684700 -0.597000
+vn -0.369100 0.765500 -0.527100
+vn -0.297100 0.765500 -0.570700
+vn -0.336600 0.684700 -0.646500
+vn -0.395300 0.516700 -0.759400
+vn -0.428100 0.516700 -0.741400
+vn -0.417200 0.428900 -0.801300
+vn -0.451700 0.428800 -0.782300
+vn -0.459900 0.516700 -0.722100
+vn -0.491000 0.516700 -0.701300
+vn -0.485300 0.428800 -0.761900
+vn -0.518100 0.428800 -0.740000
+vn -0.468500 0.684700 -0.558300
+vn -0.492400 0.684700 -0.537400
+vn -0.434700 0.765500 -0.474400
+vn -0.413600 0.765500 -0.492900
+vn -0.515400 0.684700 -0.515400
+vn -0.455000 0.765500 -0.455000
+vn -0.391700 0.765500 -0.510500
+vn -0.443700 0.684700 -0.578200
+vn -0.521200 0.516700 -0.679200
+vn -0.550300 0.516700 -0.655800
+vn -0.549900 0.428800 -0.716600
+vn -0.580600 0.428800 -0.692000
+vn -0.578400 0.516700 -0.631200
+vn -0.605400 0.516700 -0.605400
+vn -0.610300 0.428800 -0.666000
+vn -0.638800 0.428900 -0.638800
+vn -0.558300 0.684700 -0.468500
+vn -0.578200 0.684700 -0.443700
+vn -0.510500 0.765500 -0.391700
+vn -0.492900 0.765500 -0.413600
+vn -0.597000 0.684700 -0.418000
+vn -0.527100 0.765500 -0.369100
+vn -0.474400 0.765500 -0.434700
+vn -0.537400 0.684700 -0.492400
+vn -0.631200 0.516700 -0.578400
+vn -0.655800 0.516700 -0.550300
+vn -0.666000 0.428800 -0.610200
+vn -0.692000 0.428800 -0.580600
+vn -0.679200 0.516700 -0.521200
+vn -0.701300 0.516700 -0.491000
+vn -0.716600 0.428800 -0.549900
+vn -0.740000 0.428800 -0.518100
+vn -0.631200 0.684700 -0.364400
+vn -0.646500 0.684700 -0.336600
+vn -0.570700 0.765500 -0.297100
+vn -0.557200 0.765500 -0.321700
+vn -0.660500 0.684700 -0.308000
+vn -0.583200 0.765500 -0.271900
+vn -0.542700 0.765500 -0.345700
+vn -0.614700 0.684700 -0.391600
+vn -0.722100 0.516700 -0.459900
+vn -0.741400 0.516700 -0.428100
+vn -0.761900 0.428800 -0.485300
+vn -0.782300 0.428800 -0.451700
+vn -0.759400 0.516700 -0.395300
+vn -0.775900 0.516700 -0.361800
+vn -0.801300 0.428800 -0.417200
+vn -0.818700 0.428900 -0.381800
+vn -0.684900 0.684700 -0.249300
+vn -0.695100 0.684700 -0.219200
+vn -0.613700 0.765500 -0.193500
+vn -0.604700 0.765500 -0.220100
+vn -0.704000 0.684700 -0.188600
+vn -0.621500 0.765500 -0.166500
+vn -0.594500 0.765500 -0.246200
+vn -0.673400 0.684700 -0.278900
+vn -0.791000 0.516700 -0.327600
+vn -0.804500 0.516700 -0.292800
+vn -0.834600 0.428800 -0.345700
+vn -0.848900 0.428800 -0.309000
+vn -0.816500 0.516700 -0.257500
+vn -0.827000 0.516700 -0.221600
+vn -0.861500 0.428900 -0.271700
+vn -0.872600 0.428900 -0.233800
+vn -0.717800 0.684700 -0.126600
+vn -0.722600 0.684700 -0.095200
+vn -0.638000 0.765500 -0.084000
+vn -0.633700 0.765500 -0.111700
+vn -0.726100 0.684700 -0.063500
+vn -0.641000 0.765500 -0.056100
+vn -0.628200 0.765500 -0.139200
+vn -0.711600 0.684700 -0.157700
+vn -0.835800 0.516700 -0.185200
+vn -0.843100 0.516700 -0.148700
+vn -0.882000 0.428900 -0.195500
+vn -0.889600 0.428800 -0.156900
+vn -0.848800 0.516700 -0.111800
+vn -0.852900 0.516700 -0.074600
+vn -0.895600 0.428800 -0.117900
+vn -0.899900 0.428900 -0.078700
+vn -0.728800 0.684700 0.000000
+vn -0.728100 0.684700 0.031700
+vn -0.642800 0.765500 0.028000
+vn -0.643500 0.765500 0.000000
+vn -0.726100 0.684700 0.063500
+vn -0.641000 0.765500 0.056100
+vn -0.642800 0.765500 -0.028000
+vn -0.728100 0.684700 -0.031700
+vn -0.855300 0.516700 -0.037300
+vn -0.856100 0.516700 0.000000
+vn -0.902500 0.428800 -0.039300
+vn -0.903300 0.428800 0.000000
+vn -0.855300 0.516700 0.037300
+vn -0.852900 0.516700 0.074600
+vn -0.902500 0.428800 0.039300
+vn -0.899900 0.428800 0.078700
+vn -0.717800 0.684700 0.126600
+vn -0.711600 0.684700 0.157700
+vn -0.628200 0.765500 0.139200
+vn -0.633700 0.765500 0.111700
+vn -0.704000 0.684700 0.188600
+vn -0.621500 0.765500 0.166500
+vn -0.638000 0.765500 0.084000
+vn -0.722600 0.684700 0.095200
+vn -0.848800 0.516700 0.111800
+vn -0.843100 0.516700 0.148700
+vn -0.895600 0.428800 0.117900
+vn -0.889600 0.428900 0.156900
+vn -0.835800 0.516700 0.185200
+vn -0.827000 0.516700 0.221600
+vn -0.882000 0.428800 0.195500
+vn -0.872600 0.428800 0.233800
+vn -0.684900 0.684700 0.249300
+vn -0.673400 0.684700 0.278900
+vn -0.594500 0.765500 0.246200
+vn -0.604700 0.765500 0.220100
+vn -0.660500 0.684700 0.308000
+vn -0.583200 0.765500 0.271900
+vn -0.613700 0.765500 0.193500
+vn -0.695100 0.684700 0.219200
+vn -0.816500 0.516700 0.257500
+vn -0.804500 0.516700 0.292800
+vn -0.861500 0.428800 0.271700
+vn -0.848900 0.428800 0.308900
+vn -0.791000 0.516700 0.327600
+vn -0.775900 0.516700 0.361800
+vn -0.834600 0.428800 0.345700
+vn -0.818700 0.428800 0.381800
+vn -0.632600 0.684900 0.361400
+vn -0.617700 0.685200 0.385900
+vn -0.545100 0.765900 0.340900
+vn -0.558500 0.765600 0.319200
+vn -0.601500 0.685600 0.410000
+vn -0.530700 0.766300 0.362100
+vn -0.571100 0.765500 0.296400
+vn -0.646800 0.684700 0.335700
+vn -0.759800 0.516800 0.394300
+vn -0.743200 0.517000 0.424500
+vn -0.801800 0.428900 0.416100
+vn -0.784400 0.429000 0.448000
+vn -0.725800 0.517300 0.453400
+vn -0.707100 0.517700 0.481600
+vn -0.766000 0.429300 0.478400
+vn -0.746300 0.429700 0.508300
+vn -0.582100 0.689000 0.431700
+vn -0.733200 0.651200 0.195600
+vn -0.689700 0.715400 0.112000
+vn -0.520400 0.767000 0.375300
+vn -0.497500 0.768200 0.402800
+vn -0.564100 0.688200 0.456100
+vn -0.495600 0.768000 0.405600
+vn -0.562000 0.687800 0.459400
+vn -0.663500 0.519800 0.538100
+vn -0.679200 0.515800 0.522100
+vn -0.700100 0.431800 0.568600
+vn -0.711800 0.433900 0.552300
+vn -0.661400 0.520200 0.540300
+vn -0.698800 0.431200 0.570700
+vn -0.778400 0.493400 0.388200
+vn -0.812500 0.423700 0.400400
+vn -0.884600 0.386900 0.260200
+vn -0.886100 0.353400 -0.299900
+vn -0.622600 -0.006400 -0.782500
+vn -0.610200 -0.016600 -0.792100
+vn -0.627900 -0.015600 -0.778100
+vn -0.636200 -0.006100 -0.771400
+vn -0.569900 -0.044300 -0.820500
+vn -0.602800 -0.041800 -0.796800
+vn -0.639900 -0.001500 -0.768400
+vn -0.627700 -0.001600 -0.778400
+vn -0.641100 0.000000 -0.767400
+vn -0.629300 0.000000 -0.777200
+vn -0.538400 -0.001900 -0.842700
+vn -0.524700 -0.007800 -0.851300
+vn -0.542500 0.000000 -0.840000
+vn -0.493800 -0.018400 -0.869400
+vn -0.408600 -0.039700 -0.911800
+vn 0.361300 -0.480900 -0.798900
+vn 0.632700 -0.508200 -0.584200
+vn 0.543200 -0.646000 -0.536200
+vn 0.219900 -0.577700 -0.786000
+vn 0.669500 -0.502200 -0.547300
+vn 0.591600 -0.644600 -0.484200
+vn -0.327000 -0.272000 -0.905000
+vn -0.171600 -0.251900 -0.952400
+vn 0.063100 -0.144800 -0.987400
+vn 0.560800 -0.278600 -0.779700
+vn 0.729200 -0.265500 -0.630600
+vn 0.748100 -0.258300 -0.611200
+vn 0.752400 -0.499000 -0.429900
+vn 0.769200 -0.498900 -0.399200
+vn 0.680800 -0.641600 -0.353400
+vn 0.665800 -0.641700 -0.380600
+vn 0.785500 -0.498800 -0.366300
+vn 0.695200 -0.641500 -0.324200
+vn 0.650000 -0.642000 -0.406500
+vn 0.734700 -0.499400 -0.459100
+vn 0.633000 -0.642500 -0.431900
+vn 0.715700 -0.499800 -0.487800
+vn 0.819700 -0.256500 -0.512000
+vn 0.839300 -0.256300 -0.479400
+vn 0.798700 -0.256800 -0.544100
+vn 0.857900 -0.256200 -0.445300
+vn 0.876100 -0.256100 -0.408500
+vn 0.814400 -0.498800 -0.296400
+vn 0.826600 -0.498800 -0.260600
+vn 0.731600 -0.641500 -0.230700
+vn 0.720800 -0.641500 -0.262300
+vn 0.837200 -0.498800 -0.224300
+vn 0.741000 -0.641500 -0.198500
+vn 0.708700 -0.641500 -0.293500
+vn 0.800700 -0.498800 -0.331600
+vn 0.893100 -0.256100 -0.369900
+vn 0.908300 -0.256100 -0.330600
+vn 0.921900 -0.256100 -0.290700
+vn 0.933700 -0.256100 -0.250200
+vn 0.853500 -0.498800 -0.150500
+vn 0.859300 -0.498800 -0.113100
+vn 0.760500 -0.641500 -0.100100
+vn 0.755400 -0.641500 -0.133200
+vn 0.863400 -0.498800 -0.075500
+vn 0.764200 -0.641500 -0.066800
+vn 0.748900 -0.641500 -0.166000
+vn 0.846200 -0.498800 -0.187500
+vn 0.943700 -0.256100 -0.209200
+vn 0.951900 -0.256100 -0.167900
+vn 0.958300 -0.256100 -0.126200
+vn 0.963000 -0.256100 -0.084200
+vn 0.866700 -0.498800 0.000000
+vn 0.865900 -0.498800 0.037800
+vn 0.766400 -0.641500 0.033400
+vn 0.767100 -0.641500 0.000000
+vn 0.863400 -0.498800 0.075500
+vn 0.764200 -0.641500 0.066800
+vn 0.766400 -0.641500 -0.033400
+vn 0.865900 -0.498800 -0.037800
+vn 0.965700 -0.256100 -0.042100
+vn 0.966600 -0.256100 0.000000
+vn 0.965700 -0.256100 0.042100
+vn 0.963000 -0.256100 0.084200
+vn 0.853500 -0.498800 0.150500
+vn 0.846200 -0.498800 0.187500
+vn 0.748900 -0.641500 0.166000
+vn 0.755400 -0.641500 0.133200
+vn 0.837200 -0.498800 0.224300
+vn 0.741000 -0.641500 0.198500
+vn 0.760500 -0.641500 0.100100
+vn 0.859300 -0.498800 0.113200
+vn 0.958300 -0.256100 0.126200
+vn 0.951900 -0.256100 0.167900
+vn 0.943700 -0.256100 0.209200
+vn 0.933700 -0.256100 0.250200
+vn 0.814400 -0.498800 0.296400
+vn 0.800700 -0.498800 0.331600
+vn 0.708700 -0.641500 0.293500
+vn 0.720800 -0.641500 0.262300
+vn 0.785500 -0.498800 0.366300
+vn 0.695200 -0.641500 0.324200
+vn 0.731600 -0.641500 0.230700
+vn 0.826600 -0.498800 0.260600
+vn 0.921900 -0.256100 0.290700
+vn 0.908300 -0.256100 0.330600
+vn 0.893100 -0.256100 0.369900
+vn 0.876100 -0.256100 0.408500
+vn 0.750600 -0.498800 0.433300
+vn 0.731000 -0.498800 0.465600
+vn 0.647000 -0.641500 0.412100
+vn 0.664300 -0.641500 0.383500
+vn 0.710000 -0.498800 0.497100
+vn 0.628400 -0.641500 0.440000
+vn 0.680400 -0.641500 0.354200
+vn 0.768700 -0.498800 0.400200
+vn 0.857400 -0.256100 0.446400
+vn 0.837100 -0.256100 0.483300
+vn 0.815300 -0.256100 0.519300
+vn 0.791800 -0.256100 0.554400
+vn 0.663900 -0.498800 0.557100
+vn 0.639000 -0.498800 0.585500
+vn 0.565600 -0.641500 0.518200
+vn 0.587600 -0.641500 0.493100
+vn 0.612800 -0.498800 0.612800
+vn 0.542400 -0.641500 0.542400
+vn 0.608500 -0.641500 0.467000
+vn 0.687600 -0.498800 0.527600
+vn 0.766800 -0.256100 0.588500
+vn 0.740500 -0.256100 0.621300
+vn 0.712700 -0.256100 0.653000
+vn 0.683500 -0.256100 0.683500
+vn 0.557100 -0.498800 0.663900
+vn 0.527600 -0.498800 0.687600
+vn 0.467000 -0.641500 0.608500
+vn 0.493100 -0.641500 0.587600
+vn 0.497100 -0.498800 0.710000
+vn 0.440000 -0.641500 0.628400
+vn 0.518200 -0.641500 0.565600
+vn 0.585500 -0.498800 0.639000
+vn 0.653000 -0.256100 0.712700
+vn 0.621300 -0.256100 0.740500
+vn 0.588500 -0.256100 0.766800
+vn 0.554400 -0.256100 0.791800
+vn 0.433300 -0.498800 0.750600
+vn 0.400200 -0.498800 0.768700
+vn 0.354200 -0.641500 0.680400
+vn 0.383500 -0.641500 0.664300
+vn 0.366300 -0.498800 0.785500
+vn 0.324200 -0.641500 0.695200
+vn 0.412100 -0.641500 0.647000
+vn 0.465600 -0.498800 0.731000
+vn 0.519300 -0.256100 0.815300
+vn 0.483300 -0.256100 0.837100
+vn 0.446400 -0.256100 0.857400
+vn 0.408500 -0.256100 0.876100
+vn 0.296400 -0.498800 0.814400
+vn 0.260600 -0.498800 0.826600
+vn 0.230700 -0.641500 0.731600
+vn 0.262300 -0.641500 0.720800
+vn 0.224300 -0.498800 0.837200
+vn 0.198500 -0.641500 0.741000
+vn 0.293500 -0.641500 0.708700
+vn 0.331600 -0.498800 0.800700
+vn 0.369900 -0.256100 0.893100
+vn 0.330600 -0.256100 0.908300
+vn 0.290700 -0.256100 0.921900
+vn 0.250200 -0.256100 0.933700
+vn 0.150500 -0.498800 0.853500
+vn 0.113200 -0.498800 0.859300
+vn 0.100100 -0.641500 0.760500
+vn 0.133200 -0.641500 0.755500
+vn 0.075500 -0.498800 0.863400
+vn 0.066800 -0.641500 0.764200
+vn 0.166000 -0.641500 0.748900
+vn 0.187500 -0.498800 0.846200
+vn 0.209200 -0.256100 0.943700
+vn 0.167900 -0.256100 0.951900
+vn 0.126200 -0.256100 0.958300
+vn 0.084200 -0.256100 0.963000
+vn 0.000000 -0.498800 0.866700
+vn -0.037800 -0.498800 0.865900
+vn -0.033400 -0.641500 0.766400
+vn 0.000000 -0.641500 0.767100
+vn 0.033400 -0.641500 0.766400
+vn 0.037800 -0.498800 0.865900
+vn 0.042100 -0.256100 0.965700
+vn 0.000000 -0.256100 0.966600
+vn -0.042100 -0.256100 0.965700
+vn -0.781400 -0.018000 0.623700
+vn -0.797700 -0.018000 0.602800
+vn -0.797800 -0.004500 0.602900
+vn -0.781600 -0.004500 0.623800
+vn -0.797800 0.000000 0.602900
+vn -0.781600 0.000000 0.623800
+vn -0.770400 -0.004500 0.637600
+vn -0.770200 -0.018000 0.637500
+vn -0.770400 0.000000 0.637500
+vn -0.769400 -0.046100 0.637100
+vn -0.780700 -0.046200 0.623200
+vn -0.764200 -0.122000 0.633300
+vn -0.775600 -0.122400 0.619300
+vn -0.796900 -0.046300 0.602300
+vn -0.791700 -0.122500 0.598400
+vn -0.777800 0.098000 0.620700
+vn -0.793900 0.098000 0.600000
+vn -0.715500 0.442300 0.540700
+vn -0.701100 0.442100 0.559500
+vn -0.448700 0.826800 0.339100
+vn -0.439900 0.826500 0.351100
+vn -0.691100 0.441900 0.571900
+vn -0.766700 0.098000 0.634400
+vn -0.433800 0.826300 0.359000
+vn -0.770300 0.013500 0.637500
+vn -0.781500 0.013500 0.623700
+vn -0.797700 0.013500 0.602800
+vn -0.572900 0.680200 0.457200
+vn -0.585000 0.679900 0.442100
+vn -0.736300 0.384900 0.556400
+vn -0.721300 0.385100 0.575700
+vn -0.786000 0.171300 0.594000
+vn -0.770000 0.171400 0.614600
+vn -0.710900 0.385400 0.588300
+vn -0.564400 0.680700 0.467100
+vn -0.759000 0.171500 0.628100
+vn -0.364100 0.881200 0.301300
+vn -0.369800 0.881000 0.295100
+vn -0.377700 0.880800 0.285400
+vn -0.781400 0.022100 0.623600
+vn -0.781600 0.004800 0.623800
+vn -0.770400 0.004800 0.637500
+vn -0.770200 0.022100 0.637400
+vn -0.768800 0.063500 0.636200
+vn -0.780000 0.063500 0.622500
+vn -0.796200 0.063500 0.601700
+vn -0.797600 0.022100 0.602700
+vn -0.797800 0.004800 0.602900
+vn 0.015300 0.999700 0.019300
+vn 0.001600 1.000000 0.005100
+vn -0.354600 0.894000 0.273800
+vn -0.339700 0.891400 0.300100
+vn -0.638100 0.596200 0.487200
+vn -0.616000 0.596000 0.515000
+vn -0.332400 0.874100 0.354100
+vn 0.049900 0.997000 0.058300
+vn -0.359700 0.805400 0.471000
+vn 0.142200 0.977000 0.158600
+vn -0.590300 0.594000 0.546600
+vn -0.564000 0.589300 0.578500
+vn 0.411400 0.872900 -0.262200
+vn 0.369500 0.890600 -0.264900
+vn 0.650500 0.594400 -0.472800
+vn 0.640300 0.597500 -0.482600
+vn 0.529600 0.802100 -0.275900
+vn 0.669000 0.587200 -0.455700
+vn 0.358600 0.895200 -0.264500
+vn 0.642200 0.598300 -0.479100
+vn -0.433900 0.833100 0.343000
+vn -0.443400 0.826300 0.347100
+vn -0.436300 0.826800 0.354800
+vn -0.425600 0.834000 0.350900
+vn -0.465400 0.807400 0.362500
+vn -0.458400 0.807800 0.370600
+vn -0.417700 0.836600 0.354400
+vn -0.429200 0.835000 0.344300
+vn -0.415300 0.832600 0.366400
+vn -0.431300 0.830700 0.351800
+vn -0.441100 0.834100 0.331200
+vn -0.444400 0.832400 0.331100
+vn -0.444800 0.830000 0.336500
+vn -0.453100 0.825900 0.335500
+vn -0.475200 0.807000 0.350400
+vn -0.574300 0.686800 0.445500
+vn -0.675500 0.519000 0.523700
+vn -0.665500 0.519600 0.535800
+vn -0.565700 0.687300 0.455600
+vn -0.713300 0.430600 0.552900
+vn -0.702900 0.431000 0.565800
+vn -0.498800 0.767600 0.402400
+vn -0.506500 0.767200 0.393400
+vn -0.517100 0.766800 0.380300
+vn -0.586200 0.686200 0.430600
+vn -0.689300 0.518400 0.506000
+vn -0.727800 0.430200 0.534100
+vn 0.790300 -0.016600 -0.612500
+vn 0.790400 -0.004300 -0.612600
+vn 0.806200 -0.004300 -0.591600
+vn 0.806100 -0.016600 -0.591500
+vn 0.790400 0.000000 -0.612600
+vn 0.806200 0.000000 -0.591600
+vn 0.805600 -0.039300 -0.591100
+vn 0.789800 -0.039400 -0.612100
+vn 0.803200 -0.085800 -0.589500
+vn 0.787400 -0.086000 -0.610400
+vn 0.778400 -0.039500 -0.626500
+vn 0.778900 -0.016700 -0.626900
+vn 0.776100 -0.086100 -0.624700
+vn 0.779000 -0.004300 -0.626900
+vn 0.779000 0.000000 -0.626900
+vn 0.683700 -0.501100 -0.530400
+vn 0.697700 -0.500400 -0.512500
+vn 0.616900 -0.643100 -0.453700
+vn 0.604400 -0.643600 -0.469500
+vn 0.578200 -0.695500 -0.426400
+vn 0.566400 -0.696000 -0.441200
+vn 0.595400 -0.644100 -0.480200
+vn 0.673700 -0.501600 -0.542700
+vn 0.557900 -0.696500 -0.451200
+vn 0.752600 -0.257900 -0.605900
+vn 0.763600 -0.257600 -0.592000
+vn 0.779000 -0.257200 -0.571800
+vn 0.561000 -0.700600 -0.440900
+vn 0.572800 -0.700100 -0.426200
+vn 0.591700 -0.673800 -0.442500
+vn 0.579500 -0.674200 -0.457800
+vn 0.637100 -0.604000 -0.478700
+vn 0.624000 -0.604400 -0.495300
+vn 0.570900 -0.674600 -0.467900
+vn 0.552700 -0.700900 -0.450800
+vn 0.614800 -0.604800 -0.506100
+vn 0.547500 -0.709000 -0.444400
+vn 0.555800 -0.708600 -0.434600
+vn 0.567500 -0.708100 -0.420100
+vn 0.778300 0.095600 -0.620600
+vn 0.794300 0.096000 -0.599800
+vn 0.564300 0.706900 -0.426400
+vn 0.553200 0.706500 -0.441400
+vn 0.247400 0.950700 -0.187000
+vn 0.242600 0.950600 -0.193700
+vn 0.545500 0.706100 -0.451400
+vn 0.767100 0.095300 -0.634300
+vn 0.239300 0.950500 -0.198100
+vn 0.703100 -0.410700 -0.580500
+vn 0.713400 -0.410400 -0.567900
+vn 0.728200 -0.410100 -0.549000
+vn 0.038100 0.998800 -0.030400
+vn 0.038800 0.998800 -0.029300
+vn 0.009600 0.999900 -0.007300
+vn 0.009400 0.999900 -0.007500
+vn 0.009300 0.999900 -0.007700
+vn 0.037600 0.998800 -0.031100
+vn 0.095400 0.992300 -0.079000
+vn 0.096800 0.992300 -0.077200
+vn 0.098700 0.992300 -0.074600
+vn 0.026300 0.999400 -0.021000
+vn 0.026900 0.999400 -0.020300
+vn 0.178400 0.974600 -0.134800
+vn 0.174400 0.974800 -0.139200
+vn 0.464800 0.812700 -0.351200
+vn 0.454900 0.813100 -0.363100
+vn 0.171500 0.974900 -0.141900
+vn 0.025900 0.999400 -0.021400
+vn 0.448000 0.813500 -0.370700
+vn 0.003300 1.000000 -0.002700
+vn 0.003300 1.000000 -0.002600
+vn 0.003400 1.000000 -0.002600
+vn 0.778200 0.093300 -0.621100
+vn 0.794300 0.093200 -0.600300
+vn 0.797700 0.012800 -0.602900
+vn 0.781500 0.012800 -0.623700
+vn 0.797800 0.000000 -0.602900
+vn 0.781600 0.000000 -0.623800
+vn 0.770300 0.012800 -0.637500
+vn 0.767000 0.093300 -0.634800
+vn 0.770400 0.000000 -0.637500
+vn 0.696900 0.426200 -0.576700
+vn 0.707100 0.425800 -0.564400
+vn 0.722000 0.425500 -0.545600
+vn 0.781500 -0.018200 -0.623600
+vn 0.797700 -0.018300 -0.602800
+vn 0.796900 -0.046800 -0.602200
+vn 0.780800 -0.046700 -0.623000
+vn 0.791700 -0.123800 -0.598200
+vn 0.775700 -0.123500 -0.618800
+vn 0.769700 -0.046400 -0.636600
+vn 0.770300 -0.018100 -0.637400
+vn 0.765000 -0.122900 -0.632200
+vn 0.770400 -0.004500 -0.637500
+vn 0.781600 -0.004500 -0.623800
+vn 0.797800 -0.004500 -0.602900
+vn -0.683600 0.021600 -0.729500
+vn -0.714600 0.161200 -0.680700
+vn -0.711800 0.168900 -0.681800
+vn -0.665000 0.022600 -0.746500
+vn -0.715700 0.180600 -0.674600
+vn -0.657700 0.024300 -0.752800
+vn -0.657200 0.002700 -0.753700
+vn -0.678200 0.002600 -0.734800
+vn -0.648000 0.003000 -0.761600
+vn -0.699600 0.002600 -0.714500
+vn -0.703400 0.021600 -0.710500
+vn -0.707600 0.002700 -0.706600
+vn -0.711100 0.021900 -0.702800
+vn -0.722900 0.159900 -0.672100
+vn -0.728100 0.158800 -0.666800
+vn -0.658200 0.030200 -0.752300
+vn -0.660200 0.034300 -0.750200
+vn -0.645100 0.004200 -0.764100
+vn -0.645200 0.003700 -0.763900
+vn -0.663400 0.038300 -0.747300
+vn -0.645400 0.004600 -0.763800
+vn -0.645900 0.003200 -0.763400
+vn -0.657100 0.026800 -0.753300
+vn -0.722100 0.196600 -0.663200
+vn -0.730300 0.218000 -0.647400
+vn -0.740400 0.242400 -0.626900
+vn -0.753300 0.261700 -0.603400
+vn -0.713100 0.690500 -0.121400
+vn -0.724500 0.684400 -0.081200
+vn -0.667000 0.050700 -0.743300
+vn -0.628600 0.074600 -0.774100
+vn -0.548400 0.005100 -0.836100
+vn -0.633300 0.005100 -0.773900
+vn -0.502700 0.086300 -0.860100
+vn -0.320600 0.007000 -0.947200
+vn -0.644200 0.005000 -0.764800
+vn -0.666400 0.041500 -0.744400
+vn -0.794400 0.368800 -0.482600
+vn -0.825600 0.375500 -0.421200
+vn 0.652600 0.249400 -0.715400
+vn -0.099100 0.979400 -0.175700
+vn -0.004900 0.999500 -0.029300
+vn 0.739900 0.247200 -0.625600
+vn 0.005900 1.000000 -0.004800
+vn 0.750600 0.246400 -0.613000
+vn 0.767300 0.017000 -0.641000
+vn 0.710700 0.017800 -0.703300
+vn 0.774400 0.016800 -0.632400
+vn 0.269400 0.015600 -0.962900
+vn 0.135900 0.181700 -0.973900
+vn -0.433100 0.779800 -0.451900
+vn -0.857800 0.334200 -0.390400
+vn 0.766200 0.245600 -0.593800
+vn 0.011000 0.999900 -0.008500
+vn 0.013000 0.999800 -0.009600
+vn 0.781600 0.245200 -0.573500
+vn 0.015700 0.999800 -0.010700
+vn 0.801400 0.244800 -0.545800
+vn 0.806100 0.016800 -0.591500
+vn 0.790300 0.016800 -0.612500
+vn 0.826400 0.016700 -0.562800
+vn 0.778900 0.016800 -0.626900
+vn 0.755100 0.246000 -0.607700
+vn 0.009100 0.999900 -0.007300
+vn 0.842000 0.244300 -0.480900
+vn 0.016300 0.999800 -0.009300
+vn 0.017100 0.999800 -0.008800
+vn 0.860700 0.244200 -0.446700
+vn 0.018100 0.999800 -0.008500
+vn 0.878900 0.244100 -0.409800
+vn 0.887400 0.016700 -0.460600
+vn 0.868200 0.016700 -0.495900
+vn 0.906200 0.016700 -0.422500
+vn 0.848000 0.016700 -0.529600
+vn 0.822400 0.244500 -0.513600
+vn 0.015900 0.999800 -0.009800
+vn 0.911200 0.244100 -0.331600
+vn 0.018800 0.999800 -0.006800
+vn 0.019100 0.999800 -0.006000
+vn 0.924800 0.244100 -0.291600
+vn 0.019300 0.999800 -0.005200
+vn 0.936700 0.244100 -0.251000
+vn 0.953600 0.016700 -0.300700
+vn 0.939500 0.016700 -0.342000
+vn 0.965800 0.016700 -0.258800
+vn 0.923800 0.016700 -0.382600
+vn 0.895900 0.244100 -0.371000
+vn 0.018500 0.999800 -0.007600
+vn 0.955000 0.244200 -0.168400
+vn 0.019700 0.999800 -0.003400
+vn 0.019800 0.999800 -0.002600
+vn 0.961400 0.244100 -0.126600
+vn 0.019900 0.999800 -0.001700
+vn 0.966000 0.244200 -0.084500
+vn 0.991300 0.016700 -0.130500
+vn 0.984600 0.016700 -0.173600
+vn 0.996000 0.016700 -0.087100
+vn 0.976200 0.016700 -0.216300
+vn 0.946700 0.244200 -0.209800
+vn 0.019500 0.999800 -0.004300
+vn 0.969700 0.244200 0.000000
+vn 0.019900 0.999800 0.000000
+vn 0.019900 0.999800 0.000900
+vn 0.968800 0.244200 0.042200
+vn 0.019900 0.999800 0.001700
+vn 0.966000 0.244200 0.084500
+vn 0.998900 0.016700 0.043500
+vn 0.999800 0.016700 0.000000
+vn 0.996000 0.016700 0.087100
+vn 0.998900 0.016700 -0.043500
+vn 0.968800 0.244200 -0.042200
+vn 0.019900 0.999800 -0.000900
+vn 0.955000 0.244200 0.168400
+vn 0.019600 0.999800 0.003400
+vn 0.019500 0.999800 0.004300
+vn 0.946700 0.244200 0.209800
+vn 0.019300 0.999800 0.005200
+vn 0.936700 0.244200 0.251000
+vn 0.976200 0.016700 0.216300
+vn 0.984600 0.016700 0.173600
+vn 0.965800 0.016700 0.258800
+vn 0.991300 0.016700 0.130500
+vn 0.961400 0.244200 0.126600
+vn 0.019700 0.999800 0.002600
+vn 0.911200 0.244200 0.331600
+vn 0.018700 0.999800 0.006800
+vn 0.018400 0.999800 0.007600
+vn 0.895900 0.244200 0.371000
+vn 0.018100 0.999800 0.008400
+vn 0.878800 0.244200 0.409800
+vn 0.923800 0.016700 0.382600
+vn 0.939500 0.016700 0.342000
+vn 0.906200 0.016700 0.422500
+vn 0.953600 0.016700 0.300700
+vn 0.924800 0.244200 0.291600
+vn 0.019000 0.999800 0.006000
+vn 0.839800 0.244200 0.484800
+vn 0.017200 0.999800 0.009900
+vn 0.016800 0.999800 0.010700
+vn 0.817900 0.244200 0.521000
+vn 0.016400 0.999800 0.011400
+vn 0.794300 0.244200 0.556200
+vn 0.843300 0.016700 0.537200
+vn 0.865900 0.016700 0.499900
+vn 0.819000 0.016700 0.573500
+vn 0.886900 0.016700 0.461700
+vn 0.860100 0.244200 0.447800
+vn 0.017600 0.999800 0.009200
+vn 0.742900 0.244200 0.623300
+vn 0.015300 0.999800 0.012800
+vn 0.014700 0.999800 0.013500
+vn 0.715000 0.244200 0.655100
+vn 0.014100 0.999800 0.014100
+vn 0.685700 0.244100 0.685700
+vn 0.737200 0.016700 0.675500
+vn 0.765900 0.016700 0.642700
+vn 0.707000 0.016700 0.707000
+vn 0.793200 0.016700 0.608700
+vn 0.769300 0.244200 0.590400
+vn 0.015800 0.999800 0.012100
+vn 0.623300 0.244200 0.742800
+vn 0.012800 0.999800 0.015200
+vn 0.012100 0.999800 0.015800
+vn 0.590400 0.244200 0.769300
+vn 0.011400 0.999800 0.016300
+vn 0.556200 0.244200 0.794300
+vn 0.608700 0.016700 0.793200
+vn 0.642700 0.016700 0.765900
+vn 0.573500 0.016700 0.819000
+vn 0.675400 0.016700 0.737200
+vn 0.655100 0.244200 0.715000
+vn 0.013500 0.999800 0.014700
+vn 0.484800 0.244200 0.839800
+vn 0.009900 0.999800 0.017200
+vn 0.009200 0.999800 0.017700
+vn 0.447800 0.244100 0.860100
+vn 0.008500 0.999800 0.018100
+vn 0.409800 0.244100 0.878900
+vn 0.461700 0.016700 0.886900
+vn 0.499900 0.016700 0.865900
+vn 0.422500 0.016700 0.906200
+vn 0.537200 0.016700 0.843300
+vn 0.521000 0.244200 0.817900
+vn 0.010700 0.999800 0.016800
+vn 0.331600 0.244200 0.911200
+vn 0.006800 0.999800 0.018700
+vn 0.006000 0.999800 0.019000
+vn 0.291600 0.244200 0.924800
+vn 0.005200 0.999800 0.019300
+vn 0.251000 0.244200 0.936700
+vn 0.300700 0.016700 0.953600
+vn 0.342000 0.016700 0.939500
+vn 0.258800 0.016700 0.965800
+vn 0.382600 0.016700 0.923800
+vn 0.371000 0.244200 0.895900
+vn 0.007600 0.999800 0.018400
+vn 0.168400 0.244200 0.955000
+vn 0.003400 0.999800 0.019600
+vn 0.002600 0.999800 0.019800
+vn 0.126600 0.244200 0.961400
+vn 0.001700 0.999800 0.019900
+vn 0.084500 0.244200 0.966000
+vn 0.130500 0.016700 0.991300
+vn 0.173600 0.016700 0.984600
+vn 0.087100 0.016700 0.996000
+vn 0.216300 0.016700 0.976200
+vn 0.209800 0.244200 0.946700
+vn 0.004300 0.999800 0.019500
+vn 0.000000 0.244200 0.969700
+vn 0.000000 0.999800 0.019900
+vn -0.000900 0.999800 0.019900
+vn -0.042200 0.244200 0.968800
+vn -0.043500 0.016700 0.998900
+vn 0.000000 0.016700 0.999800
+vn 0.043500 0.016700 0.998900
+vn 0.042200 0.244200 0.968800
+vn 0.000900 0.999800 0.019900
+vn 0.000000 0.630500 -0.776100
+vn 0.000000 0.897300 -0.441300
+vn -0.019200 0.897300 -0.440900
+vn -0.033800 0.630600 -0.775400
+vn -0.038500 0.897300 -0.439600
+vn -0.067600 0.630600 -0.773200
+vn 0.000000 0.947600 -0.319400
+vn -0.013900 0.947600 -0.319100
+vn -0.027800 0.947600 -0.318200
+vn -0.042800 0.181300 -0.982500
+vn 0.000000 0.181300 -0.983400
+vn -0.085700 0.181300 -0.979700
+vn 0.042800 0.181300 -0.982500
+vn 0.033800 0.630600 -0.775400
+vn 0.019200 0.897300 -0.440900
+vn 0.013900 0.947600 -0.319100
+vn -0.134800 0.630500 -0.764300
+vn -0.076600 0.897300 -0.434600
+vn -0.095500 0.897300 -0.430900
+vn -0.167900 0.630600 -0.757700
+vn -0.114200 0.897300 -0.426300
+vn -0.200900 0.630600 -0.749700
+vn -0.055500 0.947600 -0.314600
+vn -0.069100 0.947600 -0.311900
+vn -0.082700 0.947600 -0.308600
+vn -0.212800 0.181300 -0.960100
+vn -0.170800 0.181300 -0.968500
+vn -0.254500 0.181300 -0.949900
+vn -0.128400 0.181300 -0.975000
+vn -0.101300 0.630600 -0.769500
+vn -0.057600 0.897300 -0.437500
+vn -0.041700 0.947600 -0.316700
+vn -0.265500 0.630600 -0.729300
+vn -0.150900 0.897300 -0.414700
+vn -0.168900 0.897300 -0.407800
+vn -0.297000 0.630600 -0.717000
+vn -0.186500 0.897300 -0.400000
+vn -0.328000 0.630600 -0.703400
+vn -0.109300 0.947600 -0.300200
+vn -0.122200 0.947600 -0.295100
+vn -0.135000 0.947600 -0.289500
+vn -0.376300 0.181300 -0.908600
+vn -0.336300 0.181300 -0.924100
+vn -0.415600 0.181300 -0.891300
+vn -0.295800 0.181300 -0.937900
+vn -0.233400 0.630600 -0.740200
+vn -0.132700 0.897300 -0.420900
+vn -0.096100 0.947600 -0.304700
+vn -0.388000 0.630600 -0.672100
+vn -0.220600 0.897300 -0.382200
+vn -0.237100 0.897300 -0.372200
+vn -0.417000 0.630600 -0.654600
+vn -0.253100 0.897300 -0.361500
+vn -0.445100 0.630600 -0.635700
+vn -0.159700 0.947600 -0.276700
+vn -0.171600 0.947600 -0.269400
+vn -0.183200 0.947600 -0.261700
+vn -0.528300 0.181300 -0.829400
+vn -0.491700 0.181300 -0.851600
+vn -0.564000 0.181300 -0.805600
+vn -0.454100 0.181300 -0.872300
+vn -0.358400 0.630600 -0.688400
+vn -0.203800 0.897300 -0.391500
+vn -0.147500 0.947600 -0.283300
+vn -0.498900 0.630600 -0.594500
+vn -0.283700 0.897300 -0.338100
+vn -0.298100 0.897300 -0.325400
+vn -0.524300 0.630600 -0.572200
+vn -0.312100 0.897300 -0.312100
+vn -0.548800 0.630600 -0.548800
+vn -0.205300 0.947600 -0.244700
+vn -0.215800 0.947600 -0.235500
+vn -0.225900 0.947600 -0.225900
+vn -0.664400 0.181300 -0.725100
+vn -0.632100 0.181300 -0.753300
+vn -0.695400 0.181300 -0.695400
+vn -0.598700 0.181300 -0.780200
+vn -0.472500 0.630600 -0.615700
+vn -0.268700 0.897300 -0.350100
+vn -0.194500 0.947600 -0.253400
+vn -0.594500 0.630600 -0.498900
+vn -0.338100 0.897300 -0.283700
+vn -0.350100 0.897300 -0.268700
+vn -0.615700 0.630600 -0.472500
+vn -0.361500 0.897300 -0.253100
+vn -0.635700 0.630600 -0.445100
+vn -0.244700 0.947600 -0.205300
+vn -0.253400 0.947600 -0.194500
+vn -0.261700 0.947600 -0.183200
+vn -0.780200 0.181300 -0.598700
+vn -0.753300 0.181300 -0.632100
+vn -0.805600 0.181300 -0.564000
+vn -0.725100 0.181300 -0.664400
+vn -0.572200 0.630600 -0.524300
+vn -0.325400 0.897300 -0.298100
+vn -0.235500 0.947600 -0.215800
+vn -0.672100 0.630600 -0.388000
+vn -0.382200 0.897300 -0.220600
+vn -0.391500 0.897300 -0.203800
+vn -0.688400 0.630600 -0.358400
+vn -0.400000 0.897300 -0.186500
+vn -0.703400 0.630600 -0.328000
+vn -0.276700 0.947600 -0.159700
+vn -0.283300 0.947600 -0.147500
+vn -0.289500 0.947600 -0.135000
+vn -0.872300 0.181300 -0.454100
+vn -0.851600 0.181300 -0.491700
+vn -0.891300 0.181300 -0.415600
+vn -0.829400 0.181300 -0.528300
+vn -0.654600 0.630600 -0.417000
+vn -0.372200 0.897300 -0.237100
+vn -0.269400 0.947600 -0.171600
+vn -0.729300 0.630500 -0.265500
+vn -0.414700 0.897300 -0.150900
+vn -0.420900 0.897300 -0.132700
+vn -0.740200 0.630600 -0.233400
+vn -0.426300 0.897300 -0.114200
+vn -0.749700 0.630600 -0.200900
+vn -0.300200 0.947600 -0.109300
+vn -0.304700 0.947600 -0.096100
+vn -0.308600 0.947600 -0.082700
+vn -0.937900 0.181300 -0.295800
+vn -0.924100 0.181300 -0.336300
+vn -0.949900 0.181300 -0.254500
+vn -0.908600 0.181300 -0.376300
+vn -0.717000 0.630600 -0.297000
+vn -0.407800 0.897300 -0.168900
+vn -0.295100 0.947600 -0.122200
+vn -0.764300 0.630600 -0.134800
+vn -0.434600 0.897300 -0.076600
+vn -0.437600 0.897300 -0.057600
+vn -0.769500 0.630600 -0.101300
+vn -0.439600 0.897300 -0.038500
+vn -0.773200 0.630600 -0.067600
+vn -0.314600 0.947600 -0.055500
+vn -0.316700 0.947600 -0.041700
+vn -0.318200 0.947600 -0.027800
+vn -0.975000 0.181300 -0.128400
+vn -0.968500 0.181300 -0.170800
+vn -0.979700 0.181300 -0.085700
+vn -0.960100 0.181300 -0.212800
+vn -0.757700 0.630600 -0.167900
+vn -0.430900 0.897300 -0.095500
+vn -0.311900 0.947600 -0.069100
+vn -0.776100 0.630600 0.000000
+vn -0.441300 0.897300 0.000000
+vn -0.440900 0.897300 0.019200
+vn -0.775400 0.630600 0.033800
+vn -0.439600 0.897300 0.038500
+vn -0.773200 0.630600 0.067600
+vn -0.319400 0.947600 0.000000
+vn -0.319100 0.947600 0.013900
+vn -0.318200 0.947600 0.027800
+vn -0.982500 0.181300 0.042800
+vn -0.983400 0.181300 0.000000
+vn -0.979700 0.181300 0.085700
+vn -0.982500 0.181300 -0.042800
+vn -0.775400 0.630600 -0.033800
+vn -0.440900 0.897300 -0.019200
+vn -0.319100 0.947600 -0.013900
+vn -0.764300 0.630600 0.134800
+vn -0.434600 0.897300 0.076600
+vn -0.430900 0.897300 0.095500
+vn -0.757700 0.630600 0.167900
+vn -0.426300 0.897300 0.114200
+vn -0.749700 0.630600 0.200900
+vn -0.314600 0.947600 0.055500
+vn -0.311900 0.947600 0.069100
+vn -0.308600 0.947600 0.082700
+vn -0.960100 0.181300 0.212800
+vn -0.968500 0.181300 0.170800
+vn -0.949900 0.181300 0.254500
+vn -0.975000 0.181300 0.128400
+vn -0.769500 0.630600 0.101300
+vn -0.437500 0.897300 0.057600
+vn -0.316700 0.947600 0.041700
+vn -0.729300 0.630600 0.265500
+vn -0.414700 0.897300 0.150900
+vn -0.407800 0.897300 0.168900
+vn -0.717000 0.630600 0.297000
+vn -0.400000 0.897300 0.186500
+vn -0.703400 0.630600 0.328000
+vn -0.300200 0.947600 0.109300
+vn -0.295100 0.947600 0.122200
+vn -0.289500 0.947600 0.135000
+vn -0.908600 0.181300 0.376300
+vn -0.924100 0.181300 0.336300
+vn -0.891300 0.181300 0.415600
+vn -0.937900 0.181300 0.295800
+vn -0.740200 0.630600 0.233400
+vn -0.420900 0.897300 0.132700
+vn -0.304700 0.947600 0.096100
+vn -0.672400 0.630500 0.387700
+vn -0.382300 0.897300 0.220500
+vn -0.372400 0.897300 0.236800
+vn -0.655000 0.630500 0.416400
+vn -0.361800 0.897300 0.252700
+vn -0.636200 0.630600 0.444500
+vn -0.276700 0.947600 0.159600
+vn -0.269600 0.947600 0.171400
+vn -0.261800 0.947600 0.182900
+vn -0.829900 0.181300 0.527600
+vn -0.851900 0.181300 0.491300
+vn -0.806200 0.181300 0.563200
+vn -0.872300 0.181300 0.454000
+vn -0.688500 0.630500 0.358300
+vn -0.391500 0.897300 0.203700
+vn -0.283400 0.947600 0.147500
+vn -0.607200 0.629600 0.484600
+vn -0.345400 0.897100 0.275600
+vn -0.340500 0.897000 0.281800
+vn -0.598700 0.629300 0.495400
+vn -0.338800 0.896800 0.284300
+vn -0.595700 0.628700 0.499800
+vn -0.249700 0.947600 0.199300
+vn -0.246000 0.947600 0.203600
+vn -0.244700 0.947600 0.205300
+vn -0.757700 0.181100 0.627000
+vn -0.768700 0.181100 0.613400
+vn -0.753400 0.181000 0.632200
+vn -0.784600 0.181200 0.592900
+vn -0.619600 0.630000 0.468200
+vn -0.352400 0.897200 0.266300
+vn -0.254900 0.947600 0.192600
+vn -0.866300 0.487800 -0.107400
+vn -0.616700 0.784900 -0.060100
+vn -0.710700 0.584900 -0.390700
+vn -0.809000 0.243500 -0.534900
+vn -0.742600 0.209400 -0.636100
+vn -0.725300 0.038400 -0.687300
+vn -0.343900 0.933200 0.103900
+vn -0.615300 0.739200 -0.273800
+vn -0.733800 0.390500 -0.555900
+vn -0.793200 0.030200 -0.608200
+vn -0.980600 0.117100 -0.157000
+vn -0.718500 0.004500 -0.695500
+vn -0.888500 0.161800 0.429300
+vn -0.720600 0.584900 0.372200
+vn -0.394500 0.884800 0.248000
+vn -0.256800 0.946500 0.195400
+vn -0.707000 -0.003600 -0.707200
+vn -0.707000 -0.003800 -0.707200
+vn -0.706800 -0.009700 -0.707300
+vn -0.706800 -0.009200 -0.707300
+vn -0.706300 -0.025800 -0.707400
+vn -0.706400 -0.024500 -0.707400
+vn -0.706800 -0.008700 -0.707300
+vn -0.707000 -0.003400 -0.707200
+vn -0.706400 -0.023200 -0.707400
+vn -0.707100 -0.000900 -0.707100
+vn -0.707300 0.001100 -0.706900
+vn -0.707600 0.001700 -0.706600
+vn -0.707200 0.000300 -0.707000
+vn -0.707100 0.000200 -0.707100
+vn -0.707900 0.001300 -0.706200
+vn -0.707300 0.000200 -0.706900
+vn -0.707100 0.000700 -0.707000
+vn -0.707400 0.003200 -0.706700
+vn -0.708200 0.006100 -0.705900
+vn -0.709500 0.005200 -0.704700
+vn -0.708500 0.000300 -0.705700
+vn -0.708500 0.000100 -0.705600
+vn -0.707400 0.000000 -0.706700
+vn -0.708600 0.000000 -0.705600
+vn -0.707400 0.000100 -0.706800
+vn -0.708200 0.000700 -0.705900
+vn -0.710200 0.002300 -0.703900
+vn -0.710700 0.000900 -0.703500
+vn -0.710800 0.000200 -0.703300
+vn -0.710900 0.000000 -0.703300
+vn -0.712800 0.021600 -0.701000
+vn -0.730900 0.148000 -0.666200
+vn -0.729400 0.152700 -0.666800
+vn -0.711600 0.021600 -0.702300
+vn -0.723000 0.426000 -0.543900
+vn -0.718500 0.439200 -0.539400
+vn -0.708000 0.002700 -0.706200
+vn -0.709100 0.002700 -0.705100
+vn -0.711500 0.003000 -0.702600
+vn -0.715900 0.024400 -0.697700
+vn -0.734400 0.156400 -0.660400
+vn -0.727600 0.411700 -0.548700
+vn -0.272000 0.953200 0.131500
+vn -0.224900 0.957700 0.179400
+vn -0.215600 0.960600 0.175100
+vn -0.267300 0.955600 0.123700
+vn -0.219300 0.958000 0.184700
+vn -0.210100 0.961100 0.179200
+vn -0.528000 0.827800 -0.189400
+vn -0.540600 0.818400 -0.194600
+vn -0.565300 0.795900 -0.216800
+vn -0.289600 0.948400 0.129000
+vn -0.234900 0.954300 0.184800
+vn -0.227900 0.954700 0.191300
+vn -0.224500 0.957900 0.179000
+vn -0.229100 0.957900 0.173200
+vn -0.221200 0.960800 0.167200
+vn -0.216600 0.960800 0.172900
+vn -0.206300 0.965900 0.156100
+vn -0.201100 0.966200 0.161200
+vn -0.235400 0.957900 0.164500
+vn -0.227300 0.960800 0.158800
+vn -0.212100 0.965900 0.148200
+vn -0.213100 0.960900 0.176400
+vn -0.221100 0.957900 0.182800
+vn -0.194900 0.967100 0.163400
+vn -0.229300 0.954700 0.189700
+vn -0.232800 0.954600 0.185700
+vn -0.237600 0.954600 0.179600
+vn -0.244100 0.954600 0.170600
+vn -0.248800 0.957900 0.143500
+vn -0.254800 0.957900 0.132600
+vn -0.245900 0.960800 0.128000
+vn -0.240200 0.960800 0.138500
+vn -0.229500 0.965900 0.119400
+vn -0.224100 0.965900 0.129200
+vn -0.260300 0.957900 0.121400
+vn -0.251300 0.960800 0.117200
+vn -0.234500 0.965900 0.109300
+vn -0.234000 0.960800 0.148700
+vn -0.242400 0.957900 0.154100
+vn -0.218300 0.965900 0.138800
+vn -0.251400 0.954600 0.159800
+vn -0.258000 0.954600 0.148800
+vn -0.264200 0.954600 0.137500
+vn -0.269900 0.954600 0.125900
+vn -0.269900 0.957900 0.098200
+vn -0.273900 0.957900 0.086400
+vn -0.264400 0.960800 0.083400
+vn -0.260500 0.960800 0.094800
+vn -0.246700 0.965900 0.077800
+vn -0.243100 0.965900 0.088500
+vn -0.277400 0.957900 0.074300
+vn -0.267800 0.960800 0.071700
+vn -0.249900 0.965900 0.067000
+vn -0.256100 0.960800 0.106100
+vn -0.265400 0.957900 0.109900
+vn -0.239000 0.965900 0.099000
+vn -0.275200 0.954600 0.114000
+vn -0.279900 0.954600 0.101900
+vn -0.284100 0.954600 0.089600
+vn -0.287700 0.954600 0.077100
+vn -0.282800 0.957900 0.049900
+vn -0.284700 0.957900 0.037500
+vn -0.274900 0.960800 0.036200
+vn -0.273000 0.960800 0.048100
+vn -0.256500 0.965900 0.033800
+vn -0.254800 0.965900 0.044900
+vn -0.286100 0.957900 0.025000
+vn -0.276200 0.960800 0.024100
+vn -0.257700 0.965900 0.022500
+vn -0.270700 0.960800 0.060000
+vn -0.280400 0.957900 0.062100
+vn -0.252600 0.965900 0.056000
+vn -0.290800 0.954600 0.064500
+vn -0.293300 0.954600 0.051700
+vn -0.295300 0.954600 0.038900
+vn -0.296700 0.954600 0.025900
+vn -0.287200 0.957900 0.000000
+vn -0.286900 0.957900 -0.012500
+vn -0.277000 0.960800 -0.012100
+vn -0.277300 0.960800 0.000000
+vn -0.258500 0.965900 -0.011300
+vn -0.258700 0.965900 0.000000
+vn -0.286100 0.957900 -0.025000
+vn -0.276200 0.960800 -0.024100
+vn -0.257700 0.965900 -0.022500
+vn -0.277000 0.960800 0.012100
+vn -0.286900 0.957900 0.012500
+vn -0.258500 0.965900 0.011300
+vn -0.297600 0.954600 0.013000
+vn -0.297900 0.954600 0.000000
+vn -0.297600 0.954600 -0.013000
+vn -0.296700 0.954600 -0.025900
+vn -0.282800 0.957900 -0.049900
+vn -0.280400 0.957900 -0.062100
+vn -0.270700 0.960800 -0.060000
+vn -0.273000 0.960800 -0.048100
+vn -0.252600 0.965900 -0.056000
+vn -0.254800 0.965900 -0.044900
+vn -0.277400 0.957900 -0.074300
+vn -0.267800 0.960800 -0.071700
+vn -0.249900 0.965900 -0.067000
+vn -0.274900 0.960800 -0.036200
+vn -0.284700 0.957900 -0.037500
+vn -0.256500 0.965900 -0.033800
+vn -0.295300 0.954600 -0.038900
+vn -0.293300 0.954600 -0.051700
+vn -0.290800 0.954600 -0.064500
+vn -0.287700 0.954600 -0.077100
+vn -0.269900 0.957900 -0.098200
+vn -0.265400 0.957900 -0.109900
+vn -0.256100 0.960800 -0.106100
+vn -0.260500 0.960800 -0.094800
+vn -0.239100 0.965900 -0.099000
+vn -0.243100 0.965900 -0.088500
+vn -0.260300 0.957900 -0.121400
+vn -0.251300 0.960800 -0.117200
+vn -0.234500 0.965900 -0.109300
+vn -0.264400 0.960800 -0.083400
+vn -0.273900 0.957900 -0.086400
+vn -0.246700 0.965900 -0.077800
+vn -0.284100 0.954600 -0.089600
+vn -0.279900 0.954600 -0.101900
+vn -0.275200 0.954600 -0.114000
+vn -0.269900 0.954600 -0.125900
+vn -0.248700 0.957900 -0.143600
+vn -0.242200 0.957900 -0.154300
+vn -0.233800 0.960800 -0.149000
+vn -0.240100 0.960800 -0.138600
+vn -0.218200 0.965900 -0.139000
+vn -0.224100 0.965900 -0.129400
+vn -0.235300 0.957900 -0.164700
+vn -0.227100 0.960800 -0.159000
+vn -0.211900 0.965900 -0.148400
+vn -0.245900 0.960800 -0.128000
+vn -0.254700 0.957900 -0.132600
+vn -0.229500 0.965900 -0.119500
+vn -0.264200 0.954600 -0.137500
+vn -0.257900 0.954600 -0.148900
+vn -0.251200 0.954600 -0.160000
+vn -0.244000 0.954600 -0.170800
+vn -0.220000 0.957900 -0.184600
+vn -0.211800 0.957900 -0.194000
+vn -0.204400 0.960800 -0.187300
+vn -0.212400 0.960800 -0.178200
+vn -0.190800 0.965900 -0.174800
+vn -0.198200 0.965900 -0.166300
+vn -0.203100 0.957900 -0.203100
+vn -0.196100 0.960800 -0.196100
+vn -0.182900 0.965900 -0.183000
+vn -0.219900 0.960800 -0.168800
+vn -0.227900 0.957900 -0.174800
+vn -0.205300 0.965900 -0.157500
+vn -0.236300 0.954600 -0.181300
+vn -0.228200 0.954600 -0.191400
+vn -0.219600 0.954600 -0.201200
+vn -0.210600 0.954600 -0.210600
+vn -0.184600 0.957900 -0.220000
+vn -0.174800 0.957900 -0.227900
+vn -0.168800 0.960800 -0.219900
+vn -0.178200 0.960800 -0.212400
+vn -0.157500 0.965900 -0.205300
+vn -0.166300 0.965900 -0.198200
+vn -0.164700 0.957900 -0.235300
+vn -0.159000 0.960800 -0.227100
+vn -0.148400 0.965900 -0.211900
+vn -0.187300 0.960800 -0.204400
+vn -0.194000 0.957900 -0.211800
+vn -0.174800 0.965900 -0.190800
+vn -0.201200 0.954600 -0.219600
+vn -0.191400 0.954600 -0.228200
+vn -0.181300 0.954600 -0.236300
+vn -0.170800 0.954600 -0.244000
+vn -0.143600 0.957900 -0.248700
+vn -0.132600 0.957900 -0.254700
+vn -0.128000 0.960800 -0.245900
+vn -0.138600 0.960800 -0.240100
+vn -0.119500 0.965900 -0.229500
+vn -0.129400 0.965900 -0.224100
+vn -0.121400 0.957900 -0.260300
+vn -0.117200 0.960800 -0.251300
+vn -0.109300 0.965900 -0.234500
+vn -0.149000 0.960800 -0.233800
+vn -0.154300 0.957900 -0.242200
+vn -0.139000 0.965900 -0.218200
+vn -0.160000 0.954600 -0.251200
+vn -0.148900 0.954600 -0.257900
+vn -0.137500 0.954600 -0.264200
+vn -0.125900 0.954600 -0.269900
+vn -0.098200 0.957900 -0.269900
+vn -0.086400 0.957900 -0.273900
+vn -0.083400 0.960800 -0.264400
+vn -0.094800 0.960800 -0.260500
+vn -0.077800 0.965900 -0.246700
+vn -0.088500 0.965900 -0.243100
+vn -0.074300 0.957900 -0.277400
+vn -0.071700 0.960800 -0.267800
+vn -0.067000 0.965900 -0.249900
+vn -0.106100 0.960800 -0.256100
+vn -0.109900 0.957900 -0.265400
+vn -0.099000 0.965900 -0.239100
+vn -0.114000 0.954600 -0.275200
+vn -0.101900 0.954600 -0.279900
+vn -0.089600 0.954600 -0.284100
+vn -0.077100 0.954600 -0.287700
+vn -0.049900 0.957900 -0.282800
+vn -0.037500 0.957900 -0.284700
+vn -0.036200 0.960800 -0.274900
+vn -0.048100 0.960800 -0.273000
+vn -0.033800 0.965900 -0.256500
+vn -0.044900 0.965900 -0.254800
+vn -0.025000 0.957900 -0.286100
+vn -0.024100 0.960800 -0.276200
+vn -0.022500 0.965900 -0.257700
+vn -0.060000 0.960800 -0.270700
+vn -0.062100 0.957900 -0.280400
+vn -0.056000 0.965900 -0.252600
+vn -0.064500 0.954600 -0.290800
+vn -0.051700 0.954600 -0.293300
+vn -0.038900 0.954600 -0.295300
+vn -0.025900 0.954600 -0.296700
+vn 0.000000 0.957900 -0.287200
+vn 0.012500 0.957900 -0.286900
+vn 0.012100 0.960800 -0.277000
+vn 0.000000 0.960800 -0.277300
+vn 0.011300 0.965900 -0.258500
+vn 0.000000 0.965900 -0.258700
+vn -0.012100 0.960800 -0.277000
+vn -0.012500 0.957900 -0.286900
+vn -0.011300 0.965900 -0.258500
+vn -0.013000 0.954600 -0.297600
+vn 0.000000 0.954600 -0.297900
+vn 0.013000 0.954600 -0.297600
+vn -0.587300 0.735100 0.338600
+vn -0.601500 0.735000 0.313000
+vn -0.518800 0.811200 0.269900
+vn -0.506500 0.811300 0.291800
+vn -0.614600 0.734900 0.286600
+vn -0.530000 0.811200 0.247100
+vn -0.493300 0.811500 0.313100
+vn -0.571900 0.735400 0.363400
+vn -0.479000 0.811900 0.333800
+vn -0.555300 0.735800 0.387600
+vn -0.788100 0.357600 0.501000
+vn -0.809100 0.357400 0.466500
+vn -0.765500 0.357900 0.534700
+vn -0.828500 0.357300 0.431200
+vn -0.846500 0.357300 0.394700
+vn 0.076800 0.996000 -0.044300
+vn 0.074900 0.996000 -0.047600
+vn -0.168400 0.979900 0.107100
+vn -0.172900 0.979900 0.099700
+vn 0.072800 0.996000 -0.050800
+vn -0.163600 0.979900 0.114300
+vn -0.177000 0.979900 0.092100
+vn 0.078700 0.996000 -0.041000
+vn -0.180900 0.979900 0.084300
+vn 0.080400 0.996000 -0.037500
+vn 0.723000 0.579300 -0.376300
+vn 0.706100 0.579300 -0.407200
+vn 0.738800 0.579200 -0.344500
+vn 0.687900 0.579300 -0.437300
+vn 0.668200 0.579200 -0.466800
+vn -0.637200 0.734900 0.231900
+vn -0.646700 0.734900 0.203900
+vn -0.557700 0.811200 0.175900
+vn -0.549500 0.811200 0.200000
+vn -0.655000 0.734900 0.175500
+vn -0.564900 0.811200 0.151300
+vn -0.540300 0.811200 0.223800
+vn -0.626500 0.734900 0.259500
+vn -0.862900 0.357300 0.357400
+vn -0.877700 0.357300 0.319400
+vn -0.890700 0.357300 0.280900
+vn -0.902200 0.357300 0.241700
+vn 0.083400 0.996000 -0.030300
+vn 0.082000 0.996000 -0.033900
+vn -0.184400 0.979900 0.076400
+vn -0.187500 0.979900 0.068200
+vn -0.190300 0.979900 0.060000
+vn 0.084600 0.996000 -0.026700
+vn -0.192800 0.979900 0.051600
+vn 0.085700 0.996000 -0.022900
+vn 0.777400 0.579200 -0.245100
+vn 0.766000 0.579200 -0.278800
+vn 0.787400 0.579200 -0.211000
+vn 0.753100 0.579200 -0.311900
+vn -0.667800 0.734900 0.117700
+vn -0.672300 0.734900 0.088500
+vn -0.579800 0.811200 0.076400
+vn -0.575900 0.811200 0.101500
+vn -0.675500 0.734900 0.059100
+vn -0.582600 0.811200 0.051000
+vn -0.570900 0.811200 0.126500
+vn -0.662000 0.734900 0.146700
+vn -0.911900 0.357200 0.202100
+vn -0.919800 0.357200 0.162200
+vn -0.926000 0.357200 0.121900
+vn -0.930400 0.357200 0.081400
+vn 0.087400 0.996000 -0.015400
+vn 0.086600 0.996000 -0.019200
+vn -0.194800 0.979900 0.043200
+vn -0.196500 0.979900 0.034600
+vn -0.197900 0.979900 0.026000
+vn 0.088000 0.996000 -0.011600
+vn -0.198800 0.979900 0.017400
+vn 0.088400 0.996000 -0.007700
+vn 0.808200 0.579200 -0.106400
+vn 0.802800 0.579200 -0.141500
+vn 0.812000 0.579200 -0.071000
+vn 0.795800 0.579200 -0.176400
+vn -0.678100 0.734900 0.000000
+vn -0.677400 0.734900 -0.029500
+vn -0.584200 0.811200 -0.025500
+vn -0.584800 0.811200 0.000000
+vn -0.675500 0.734900 -0.059100
+vn -0.582600 0.811200 -0.051000
+vn -0.584200 0.811200 0.025500
+vn -0.677400 0.734900 0.029500
+vn -0.933100 0.357200 0.040700
+vn -0.934000 0.357200 0.000000
+vn -0.933100 0.357200 -0.040700
+vn -0.930400 0.357200 -0.081400
+vn 0.088700 0.996000 0.000000
+vn 0.088700 0.996000 -0.003800
+vn -0.199400 0.979900 0.008700
+vn -0.199600 0.979900 0.000000
+vn -0.199400 0.979900 -0.008700
+vn 0.088700 0.996000 0.003800
+vn -0.198800 0.979900 -0.017400
+vn 0.088400 0.996000 0.007700
+vn 0.814400 0.579200 0.035500
+vn 0.815100 0.579200 0.000000
+vn 0.812000 0.579200 0.071000
+vn 0.814400 0.579200 -0.035500
+vn -0.667800 0.734900 -0.117700
+vn -0.662000 0.734900 -0.146700
+vn -0.570900 0.811200 -0.126500
+vn -0.575900 0.811200 -0.101500
+vn -0.655000 0.734900 -0.175500
+vn -0.564900 0.811200 -0.151300
+vn -0.579800 0.811200 -0.076400
+vn -0.672300 0.734900 -0.088500
+vn -0.926000 0.357200 -0.121900
+vn -0.919800 0.357200 -0.162200
+vn -0.911900 0.357200 -0.202100
+vn -0.902200 0.357300 -0.241700
+vn 0.087400 0.996000 0.015400
+vn 0.088000 0.996000 0.011600
+vn -0.197900 0.979900 -0.026000
+vn -0.196500 0.979900 -0.034600
+vn -0.194800 0.979900 -0.043200
+vn 0.086600 0.996000 0.019200
+vn -0.192800 0.979900 -0.051600
+vn 0.085700 0.996000 0.022900
+vn 0.795800 0.579200 0.176400
+vn 0.802800 0.579200 0.141500
+vn 0.787400 0.579200 0.211000
+vn 0.808200 0.579200 0.106400
+vn -0.637200 0.734900 -0.231900
+vn -0.626500 0.734900 -0.259500
+vn -0.540300 0.811200 -0.223800
+vn -0.549500 0.811200 -0.200000
+vn -0.614600 0.734900 -0.286600
+vn -0.530000 0.811200 -0.247100
+vn -0.557700 0.811200 -0.175900
+vn -0.646700 0.734900 -0.203900
+vn -0.890700 0.357200 -0.280900
+vn -0.877700 0.357200 -0.319400
+vn -0.862900 0.357200 -0.357400
+vn -0.846500 0.357200 -0.394700
+vn 0.083400 0.996000 0.030300
+vn 0.084600 0.996000 0.026700
+vn -0.190300 0.979900 -0.060000
+vn -0.187500 0.979900 -0.068200
+vn -0.184400 0.979900 -0.076400
+vn 0.082000 0.996000 0.033900
+vn -0.180900 0.979900 -0.084300
+vn 0.080400 0.996000 0.037500
+vn 0.753100 0.579200 0.311900
+vn 0.766000 0.579200 0.278800
+vn 0.738800 0.579200 0.344500
+vn 0.777400 0.579200 0.245100
+vn -0.587200 0.734900 -0.339000
+vn -0.571900 0.734900 -0.364300
+vn -0.493200 0.811200 -0.314200
+vn -0.506500 0.811200 -0.292400
+vn -0.555500 0.734900 -0.388900
+vn -0.479000 0.811200 -0.335400
+vn -0.518700 0.811200 -0.270100
+vn -0.601500 0.734900 -0.313100
+vn -0.828400 0.357300 -0.431300
+vn -0.808900 0.357200 -0.467000
+vn -0.787700 0.357300 -0.501800
+vn -0.765100 0.357300 -0.535700
+vn 0.076800 0.996000 0.044300
+vn 0.078700 0.996000 0.041000
+vn -0.177000 0.979900 -0.092200
+vn -0.172800 0.979900 -0.099800
+vn -0.168300 0.979900 -0.107200
+vn 0.074800 0.996000 0.047700
+vn -0.163500 0.979900 -0.114500
+vn 0.072700 0.996000 0.050900
+vn 0.687500 0.579200 0.437900
+vn 0.705900 0.579200 0.407600
+vn 0.667700 0.579200 0.467500
+vn 0.723000 0.579200 0.376400
+vn -0.519500 0.734900 -0.435900
+vn -0.500000 0.734900 -0.458100
+vn -0.431200 0.811200 -0.395100
+vn -0.448000 0.811200 -0.375900
+vn -0.479500 0.734900 -0.479500
+vn -0.413500 0.811200 -0.413500
+vn -0.463900 0.811200 -0.356000
+vn -0.537900 0.734900 -0.412800
+vn -0.741000 0.357300 -0.568600
+vn -0.715500 0.357200 -0.600400
+vn -0.688600 0.357200 -0.631000
+vn -0.660400 0.357300 -0.660400
+vn 0.068000 0.996000 0.057000
+vn 0.070400 0.996000 0.054000
+vn -0.158300 0.979900 -0.121500
+vn -0.152900 0.979900 -0.128300
+vn -0.147100 0.979900 -0.134800
+vn 0.065400 0.996000 0.059900
+vn -0.141100 0.979900 -0.141100
+vn 0.062700 0.996000 0.062700
+vn 0.601000 0.579200 0.550700
+vn 0.624400 0.579200 0.524000
+vn 0.576400 0.579200 0.576400
+vn 0.646700 0.579200 0.496300
+vn -0.435900 0.734900 -0.519500
+vn -0.412800 0.734900 -0.537900
+vn -0.356000 0.811200 -0.463900
+vn -0.375900 0.811200 -0.448000
+vn -0.388900 0.734900 -0.555500
+vn -0.335400 0.811200 -0.479000
+vn -0.395100 0.811200 -0.431200
+vn -0.458100 0.734900 -0.500000
+vn -0.630900 0.357200 -0.688600
+vn -0.600400 0.357200 -0.715500
+vn -0.568600 0.357200 -0.741000
+vn -0.535700 0.357300 -0.765100
+vn 0.057000 0.996000 0.068000
+vn 0.059900 0.996000 0.065400
+vn -0.134800 0.979900 -0.147100
+vn -0.128300 0.979900 -0.152900
+vn -0.121500 0.979900 -0.158300
+vn 0.054000 0.996000 0.070400
+vn -0.114500 0.979900 -0.163500
+vn 0.050900 0.996000 0.072700
+vn 0.496300 0.579200 0.646700
+vn 0.523900 0.579200 0.624400
+vn 0.467500 0.579200 0.667700
+vn 0.550700 0.579200 0.601000
+vn 0.675500 0.000000 0.737300
+vn -0.339000 0.734900 -0.587200
+vn -0.313100 0.734900 -0.601500
+vn -0.270100 0.811200 -0.518700
+vn -0.292400 0.811200 -0.506500
+vn -0.286600 0.734900 -0.614600
+vn -0.247100 0.811200 -0.530000
+vn -0.314200 0.811200 -0.493200
+vn -0.364300 0.734900 -0.571900
+vn -0.501800 0.357200 -0.787700
+vn -0.467000 0.357200 -0.808900
+vn -0.431300 0.357200 -0.828400
+vn -0.394700 0.357300 -0.846500
+vn 0.044400 0.996000 0.076800
+vn 0.047700 0.996000 0.074800
+vn -0.107200 0.979900 -0.168300
+vn -0.099800 0.979900 -0.172800
+vn -0.092100 0.979900 -0.177000
+vn 0.041000 0.996000 0.078700
+vn -0.084300 0.979900 -0.180900
+vn 0.037500 0.996000 0.080400
+vn 0.376400 0.579200 0.723000
+vn 0.407600 0.579200 0.705900
+vn 0.344500 0.579200 0.738800
+vn 0.437900 0.579200 0.687500
+vn -0.231900 0.734900 -0.637200
+vn -0.203900 0.734900 -0.646700
+vn -0.175900 0.811200 -0.557700
+vn -0.200000 0.811200 -0.549500
+vn -0.175500 0.734900 -0.655000
+vn -0.151300 0.811200 -0.564900
+vn -0.223800 0.811200 -0.540300
+vn -0.259500 0.734900 -0.626500
+vn -0.357400 0.357200 -0.862900
+vn -0.319400 0.357200 -0.877700
+vn -0.280900 0.357300 -0.890700
+vn -0.241700 0.357300 -0.902200
+vn 0.030300 0.996000 0.083400
+vn 0.033900 0.996000 0.082000
+vn -0.076400 0.979900 -0.184400
+vn -0.068200 0.979900 -0.187500
+vn -0.060000 0.979900 -0.190300
+vn 0.026700 0.996000 0.084600
+vn -0.051600 0.979900 -0.192800
+vn 0.022900 0.996000 0.085700
+vn 0.245100 0.579200 0.777400
+vn 0.278800 0.579200 0.766000
+vn 0.211000 0.579200 0.787400
+vn 0.311900 0.579200 0.753100
+vn -0.117700 0.734900 -0.667800
+vn -0.088500 0.734900 -0.672300
+vn -0.076400 0.811200 -0.579800
+vn -0.101500 0.811200 -0.575900
+vn -0.059100 0.734900 -0.675500
+vn -0.051000 0.811200 -0.582600
+vn -0.126500 0.811200 -0.570900
+vn -0.146700 0.734900 -0.662000
+vn -0.202100 0.357300 -0.911900
+vn -0.162200 0.357200 -0.919800
+vn -0.121900 0.357200 -0.926000
+vn -0.081400 0.357200 -0.930400
+vn 0.015400 0.996000 0.087400
+vn 0.019200 0.996000 0.086600
+vn -0.043200 0.979900 -0.194800
+vn -0.034600 0.979900 -0.196500
+vn -0.026000 0.979900 -0.197900
+vn 0.011600 0.996000 0.088000
+vn -0.017400 0.979900 -0.198800
+vn 0.007700 0.996000 0.088400
+vn 0.106400 0.579200 0.808200
+vn 0.141500 0.579200 0.802800
+vn 0.071000 0.579200 0.812000
+vn 0.176400 0.579200 0.795800
+vn 0.000000 0.734900 -0.678100
+vn 0.029500 0.734900 -0.677400
+vn 0.025500 0.811200 -0.584200
+vn 0.000000 0.811200 -0.584800
+vn -0.025500 0.811200 -0.584200
+vn -0.029500 0.734900 -0.677400
+vn -0.040700 0.357200 -0.933100
+vn 0.000000 0.357200 -0.934000
+vn 0.040700 0.357200 -0.933100
+vn 0.000000 0.996000 0.088700
+vn 0.003800 0.996000 0.088700
+vn -0.008700 0.979900 -0.199400
+vn 0.000000 0.979900 -0.199600
+vn 0.008700 0.979900 -0.199400
+vn -0.003800 0.996000 0.088700
+vn -0.035500 0.579200 0.814400
+vn 0.000000 0.579200 0.815100
+vn 0.035500 0.579200 0.814400
+vn -0.525100 0.730800 0.436100
+vn -0.539000 0.735200 0.410800
+vn -0.464400 0.812100 0.353200
+vn -0.450000 0.811800 0.372100
+vn -0.431800 0.810400 0.395800
+vn -0.510800 0.718200 0.472400
+vn -0.385600 0.806500 0.448000
+vn -0.476200 0.688900 0.546400
+vn -0.694400 0.337900 0.635200
+vn -0.721200 0.351700 0.596900
+vn -0.739900 0.000000 0.672700
+vn -0.771200 0.000000 0.636600
+vn -0.639400 0.306400 0.705200
+vn -0.678300 0.000000 0.734700
+vn -0.743000 0.356900 0.566100
+vn -0.795600 0.000000 0.605800
+vn 0.421000 0.638400 0.644300
+vn -0.268700 0.590700 0.760800
+vn -0.192500 0.766700 0.612500
+vn 0.174900 0.794700 0.581300
+vn 0.144600 0.962500 0.229500
+vn 0.609000 0.792900 0.019600
+vn -0.086600 0.990700 0.104500
+vn 0.263900 0.956300 -0.125900
+vn 0.930200 0.268700 -0.249800
+vn 0.642300 0.239600 0.728000
+vn 0.950300 0.000000 -0.311300
+vn 0.655800 0.000000 0.754900
+vn 0.759300 0.448900 -0.471100
+vn 0.840900 0.000000 -0.541100
+vn -0.408200 0.222500 0.885300
+vn -0.455400 0.000000 0.890300
+vn 0.091200 0.993700 -0.064900
+vn 0.143700 0.985200 -0.093000
+vn -0.131000 0.984600 0.115800
+vn -0.149800 0.981200 0.121800
+vn -0.158500 0.980000 0.120200
+vn 0.073500 0.995800 -0.054000
+vn 0.652900 0.578400 -0.489100
+vn 0.654200 0.565900 -0.501800
+vn 0.800100 0.000000 -0.599900
+vn 0.792000 0.000000 -0.610500
+vn 0.681400 0.529600 -0.505100
+vn 0.799500 0.000000 -0.600600
+vn 0.786800 0.119800 -0.605500
+vn 0.793800 0.135700 -0.592800
+vn 0.799700 0.031100 -0.599600
+vn 0.791700 0.028600 -0.610200
+vn 0.828200 0.196600 -0.524700
+vn 0.843400 0.045100 -0.535400
+vn 0.799800 0.028100 -0.599600
+vn 0.794800 0.115400 -0.595700
+vn 0.819400 0.028000 -0.572500
+vn 0.814400 0.114700 -0.568900
+vn 0.766700 0.287500 -0.574000
+vn 0.759000 0.294500 -0.580600
+vn 0.785500 0.286200 -0.548700
+vn 0.761300 0.316900 -0.565700
+vn 0.764900 0.405800 -0.500200
+vn 0.525700 0.600400 0.602600
+vn -0.419000 0.387300 0.821200
+vn -0.432100 0.105200 0.895600
+vn 0.641400 0.201100 0.740400
+vn -0.659500 0.199600 0.724700
+vn -0.672900 0.045800 0.738300
+vn 0.952100 0.100500 -0.288900
+vn 0.881700 0.375800 -0.285200
+vn 0.711500 0.638800 -0.292700
+vn 0.309200 0.885600 0.346600
+vn -0.403200 0.647100 0.647100
+vn -0.624200 0.409300 0.665400
+vn -0.765700 0.114200 0.632900
+vn -0.790500 0.113600 0.601800
+vn -0.795300 0.027700 0.605500
+vn -0.770700 0.027300 0.636600
+vn -0.814400 0.114400 0.568900
+vn -0.819400 0.028000 0.572500
+vn -0.738400 0.030400 0.673700
+vn -0.730600 0.133500 0.669600
+vn -0.700800 0.312500 0.641300
+vn -0.737900 0.287500 0.610500
+vn -0.762700 0.284700 0.580600
+vn -0.785700 0.285300 0.548900
+vn -0.860600 0.114400 0.496200
+vn -0.881200 0.114400 0.458600
+vn -0.886700 0.028000 0.461400
+vn -0.865900 0.028000 0.499300
+vn -0.900300 0.114400 0.419800
+vn -0.843600 0.028000 0.536300
+vn -0.838300 0.114400 0.533000
+vn -0.808800 0.285300 0.514200
+vn -0.830300 0.285300 0.478700
+vn -0.850200 0.285300 0.442400
+vn -0.868600 0.285300 0.405000
+vn -0.933500 0.114400 0.339800
+vn -0.947400 0.114400 0.298700
+vn -0.959600 0.114400 0.257100
+vn -0.917800 0.114400 0.380100
+vn -0.885500 0.285300 0.366700
+vn -0.900600 0.285300 0.327800
+vn -0.914000 0.285300 0.288200
+vn -0.925700 0.285300 0.248100
+vn -0.978300 0.114400 0.172500
+vn -0.984900 0.114400 0.129700
+vn -0.989600 0.114400 0.086600
+vn -0.969900 0.114400 0.215000
+vn -0.935700 0.285300 0.207400
+vn -0.943800 0.285300 0.166400
+vn -0.950200 0.285300 0.125100
+vn -0.954800 0.285300 0.083500
+vn -0.993400 0.114400 0.000000
+vn -0.992500 0.114400 -0.043300
+vn -0.989600 0.114400 -0.086600
+vn -0.992500 0.114400 0.043300
+vn -0.957500 0.285300 0.041700
+vn -0.958400 0.285300 0.000000
+vn -0.957500 0.285300 -0.041700
+vn -0.954800 0.285300 -0.083500
+vn -0.978300 0.114400 -0.172500
+vn -0.969900 0.114400 -0.215000
+vn -0.959600 0.114400 -0.257100
+vn -0.984900 0.114400 -0.129700
+vn -0.950200 0.285300 -0.125100
+vn -0.943800 0.285300 -0.166400
+vn -0.935700 0.285300 -0.207400
+vn -0.925700 0.285300 -0.248100
+vn -0.933500 0.114400 -0.339800
+vn -0.917800 0.114400 -0.380100
+vn -0.900300 0.114400 -0.419800
+vn -0.947400 0.114400 -0.298700
+vn -0.914000 0.285300 -0.288200
+vn -0.900600 0.285300 -0.327800
+vn -0.885500 0.285300 -0.366700
+vn -0.868600 0.285300 -0.405000
+vn -0.860300 0.114400 -0.496700
+vn -0.837900 0.114400 -0.533700
+vn -0.843100 0.028000 -0.537000
+vn -0.865700 0.028000 -0.499800
+vn -0.813700 0.114400 -0.569800
+vn -0.818800 0.028000 -0.573400
+vn -0.886600 0.028000 -0.461600
+vn -0.881200 0.114400 -0.458700
+vn -0.850100 0.285300 -0.442600
+vn -0.830000 0.285300 -0.479200
+vn -0.808300 0.285300 -0.514900
+vn -0.785100 0.285300 -0.549700
+vn -0.761000 0.114400 -0.638500
+vn -0.732400 0.114400 -0.671100
+vn -0.737000 0.028000 -0.675300
+vn -0.765700 0.028000 -0.642500
+vn -0.702400 0.114400 -0.702400
+vn -0.706800 0.028000 -0.706800
+vn -0.793000 0.028000 -0.608500
+vn -0.788100 0.114400 -0.604800
+vn -0.760300 0.285300 -0.583500
+vn -0.734200 0.285300 -0.616000
+vn -0.706600 0.285300 -0.647500
+vn -0.677700 0.285300 -0.677700
+vn -0.638500 0.114400 -0.761000
+vn -0.604800 0.114400 -0.788100
+vn -0.608500 0.028000 -0.793000
+vn -0.642500 0.028000 -0.765700
+vn -0.569800 0.114400 -0.813700
+vn -0.573300 0.028000 -0.818800
+vn -0.675300 0.028000 -0.737000
+vn -0.671100 0.114400 -0.732400
+vn -0.647500 0.285300 -0.706600
+vn -0.616000 0.285300 -0.734200
+vn -0.583500 0.285300 -0.760300
+vn -0.549700 0.285300 -0.785100
+vn -0.496700 0.114400 -0.860300
+vn -0.458700 0.114400 -0.881200
+vn -0.461600 0.028000 -0.886600
+vn -0.499800 0.028000 -0.865700
+vn -0.419800 0.114400 -0.900300
+vn -0.422400 0.028000 -0.905900
+vn -0.537000 0.028000 -0.843100
+vn -0.533700 0.114400 -0.837900
+vn -0.514900 0.285300 -0.808300
+vn -0.479200 0.285300 -0.830000
+vn -0.442600 0.285300 -0.850100
+vn -0.405000 0.285300 -0.868600
+vn -0.339800 0.114400 -0.933500
+vn -0.298700 0.114400 -0.947400
+vn -0.300600 0.028000 -0.953300
+vn -0.341900 0.028000 -0.939300
+vn -0.257100 0.114400 -0.959600
+vn -0.258700 0.028000 -0.965500
+vn -0.382500 0.028000 -0.923500
+vn -0.380100 0.114400 -0.917800
+vn -0.366700 0.285300 -0.885500
+vn -0.327800 0.285300 -0.900600
+vn -0.288200 0.285300 -0.914000
+vn -0.248100 0.285300 -0.925700
+vn -0.172500 0.114400 -0.978300
+vn -0.129700 0.114400 -0.984900
+vn -0.130500 0.028000 -0.991000
+vn -0.173600 0.028000 -0.984400
+vn -0.086600 0.114400 -0.989600
+vn -0.087100 0.028000 -0.995800
+vn -0.216300 0.028000 -0.975900
+vn -0.215000 0.114400 -0.969900
+vn -0.207400 0.285300 -0.935700
+vn -0.166400 0.285300 -0.943800
+vn -0.125100 0.285300 -0.950200
+vn -0.083500 0.285300 -0.954800
+vn 0.000000 0.114400 -0.993400
+vn 0.043300 0.114400 -0.992500
+vn 0.043500 0.028000 -0.998700
+vn 0.000000 0.028000 -0.999600
+vn -0.043500 0.028000 -0.998700
+vn -0.043300 0.114400 -0.992500
+vn -0.041700 0.285300 -0.957500
+vn 0.000000 0.285300 -0.958400
+vn 0.041700 0.285300 -0.957500
+vn 0.000000 0.114600 0.993400
+vn 0.043300 0.114600 0.992500
+vn 0.043500 0.028000 0.998700
+vn 0.000000 0.028000 0.999600
+vn 0.086600 0.114600 0.989600
+vn 0.087100 0.028000 0.995800
+vn -0.043500 0.028000 0.998700
+vn -0.043300 0.114600 0.992500
+vn -0.041700 0.286200 0.957200
+vn 0.000000 0.286200 0.958200
+vn 0.041700 0.286200 0.957200
+vn 0.083500 0.286200 0.954500
+vn 0.172500 0.114600 0.978300
+vn 0.214900 0.114600 0.969800
+vn 0.216300 0.028000 0.975900
+vn 0.173600 0.028000 0.984400
+vn 0.257100 0.114600 0.959500
+vn 0.258700 0.028000 0.965500
+vn 0.130500 0.028000 0.991000
+vn 0.129700 0.114600 0.984900
+vn 0.125100 0.286200 0.949900
+vn 0.166400 0.286200 0.943600
+vn 0.207300 0.286200 0.935500
+vn 0.248000 0.286200 0.925500
+vn 0.339800 0.114600 0.933500
+vn 0.380100 0.114600 0.917800
+vn 0.382500 0.028000 0.923500
+vn 0.341900 0.028000 0.939300
+vn 0.419800 0.114700 0.900300
+vn 0.422400 0.028000 0.905900
+vn 0.300600 0.028000 0.953300
+vn 0.298700 0.114600 0.947400
+vn 0.288200 0.286200 0.913800
+vn 0.327700 0.286200 0.900400
+vn 0.366600 0.286200 0.885200
+vn 0.404900 0.286200 0.868400
+vn 0.496700 0.114600 0.860300
+vn 0.533700 0.114600 0.837800
+vn 0.537000 0.028000 0.843100
+vn 0.499800 0.028000 0.865700
+vn 0.569800 0.114600 0.813700
+vn 0.573400 0.028000 0.818800
+vn 0.461600 0.028000 0.886600
+vn 0.458700 0.114700 0.881100
+vn 0.442500 0.286200 0.849800
+vn 0.479000 0.286200 0.829800
+vn 0.514800 0.286200 0.808100
+vn 0.549500 0.286200 0.784900
+vn 0.638500 0.114600 0.761000
+vn 0.671100 0.114600 0.732400
+vn 0.675300 0.028000 0.737000
+vn 0.642500 0.028000 0.765700
+vn 0.702400 0.114600 0.702400
+vn 0.706800 0.028000 0.706800
+vn 0.608500 0.028000 0.793000
+vn 0.604800 0.114600 0.788100
+vn 0.583300 0.286200 0.760100
+vn 0.615900 0.286200 0.734000
+vn 0.647300 0.286200 0.706400
+vn 0.677500 0.286200 0.677500
+vn 0.761000 0.114600 0.638500
+vn 0.788100 0.114600 0.604800
+vn 0.793000 0.028000 0.608500
+vn 0.765700 0.028000 0.642500
+vn 0.813700 0.114600 0.569800
+vn 0.818800 0.028000 0.573400
+vn 0.737000 0.028000 0.675300
+vn 0.732400 0.114600 0.671100
+vn 0.706400 0.286200 0.647300
+vn 0.734000 0.286200 0.615900
+vn 0.760100 0.286200 0.583300
+vn 0.784900 0.286200 0.549500
+vn 0.860300 0.114600 0.496700
+vn 0.881100 0.114600 0.458700
+vn 0.886600 0.028000 0.461600
+vn 0.865700 0.028000 0.499800
+vn 0.900300 0.114600 0.419800
+vn 0.843100 0.028000 0.537000
+vn 0.837800 0.114600 0.533700
+vn 0.808100 0.286200 0.514800
+vn 0.829800 0.286200 0.479100
+vn 0.849800 0.286200 0.442500
+vn 0.868400 0.286200 0.404900
+vn 0.933500 0.114600 0.339800
+vn 0.947400 0.114600 0.298700
+vn 0.959500 0.114600 0.257100
+vn 0.917800 0.114600 0.380100
+vn 0.885200 0.286200 0.366600
+vn 0.900400 0.286200 0.327700
+vn 0.913800 0.286200 0.288200
+vn 0.925500 0.286200 0.248000
+vn 0.978300 0.114600 0.172500
+vn 0.984900 0.114600 0.129700
+vn 0.989600 0.114600 0.086600
+vn 0.969800 0.114600 0.214900
+vn 0.935500 0.286200 0.207300
+vn 0.943600 0.286200 0.166400
+vn 0.949900 0.286200 0.125100
+vn 0.954500 0.286200 0.083500
+vn 0.993400 0.114600 0.000000
+vn 0.992500 0.114600 -0.043300
+vn 0.989600 0.114600 -0.086600
+vn 0.992500 0.114600 0.043300
+vn 0.957200 0.286200 0.041700
+vn 0.958100 0.286200 0.000000
+vn 0.957200 0.286200 -0.041700
+vn 0.954500 0.286200 -0.083500
+vn 0.978300 0.114600 -0.172500
+vn 0.969800 0.114600 -0.214900
+vn 0.959500 0.114600 -0.257100
+vn 0.984900 0.114600 -0.129700
+vn 0.949900 0.286200 -0.125100
+vn 0.943600 0.286200 -0.166400
+vn 0.935500 0.286200 -0.207300
+vn 0.925500 0.286200 -0.248000
+vn 0.933500 0.114600 -0.339800
+vn 0.917800 0.114600 -0.380100
+vn 0.900300 0.114600 -0.419800
+vn 0.947400 0.114600 -0.298700
+vn 0.913800 0.286200 -0.288200
+vn 0.900400 0.286200 -0.327700
+vn 0.885200 0.286200 -0.366600
+vn 0.868400 0.286200 -0.404900
+vn 0.860600 0.114600 -0.496200
+vn 0.838300 0.114700 -0.532900
+vn 0.843600 0.028000 -0.536300
+vn 0.865900 0.028000 -0.499300
+vn 0.886700 0.028000 -0.461400
+vn 0.881200 0.114600 -0.458600
+vn 0.849900 0.286200 -0.442300
+vn 0.830000 0.286200 -0.478600
+vn 0.808600 0.286200 -0.514000
+vn -0.734300 -0.636000 -0.237200
+vn -0.779700 -0.186600 -0.597600
+vn -0.705600 -0.173000 -0.687100
+vn -0.554300 -0.681300 -0.478000
+vn -0.695200 -0.171700 -0.698000
+vn -0.516000 -0.679800 -0.521100
+vn -0.200700 -0.976000 -0.084000
+vn -0.466700 -0.866600 0.176400
+vn -0.067200 -0.996100 0.057000
+vn -0.368800 -0.875500 0.312200
+vn -0.135300 -0.981100 -0.137900
+vn 0.000000 -1.000000 0.000000
+vn -0.735600 -0.460300 0.496900
+vn -0.927000 -0.361600 0.099600
+vn -0.685100 -0.442600 0.578500
+vn -0.945400 -0.124900 -0.300800
+vn -0.415400 -0.877500 0.239500
+vn -0.075500 -0.996200 0.043500
+vn -0.077300 -0.996200 0.040200
+vn -0.425300 -0.877500 0.221300
+vn -0.079000 -0.996200 0.036800
+vn -0.434500 -0.877600 0.202600
+vn -0.794200 -0.445400 0.413300
+vn -0.775600 -0.445400 0.447200
+vn -0.811400 -0.445400 0.378400
+vn -0.755500 -0.445400 0.480300
+vn -0.404600 -0.877500 0.257200
+vn -0.733900 -0.445400 0.512700
+vn -0.393000 -0.877600 0.274500
+vn -0.073500 -0.996200 0.046700
+vn -0.071400 -0.996200 0.049900
+vn -0.375900 -0.876600 0.300400
+vn -0.068500 -0.996100 0.054800
+vn -0.069800 -0.996200 0.052700
+vn -0.383200 -0.877000 0.289700
+vn -0.714400 -0.445000 0.540000
+vn -0.699900 -0.444500 0.559000
+vn -0.689700 -0.443900 0.572100
+vn -0.370700 -0.876200 0.307800
+vn -0.067600 -0.996100 0.056200
+vn 0.114200 -0.786700 -0.606600
+vn 0.526300 -0.333100 -0.782300
+vn 0.660000 -0.296900 -0.690100
+vn 0.373100 -0.812100 -0.448600
+vn 0.677400 -0.280100 -0.680200
+vn 0.423600 -0.798700 -0.427300
+vn 0.030400 -0.992500 -0.118000
+vn -0.235700 -0.916900 -0.322100
+vn -0.047700 -0.998100 -0.039600
+vn -0.308900 -0.915700 -0.256900
+vn 0.081000 -0.993300 -0.082600
+vn -0.622200 -0.514400 -0.590000
+vn -0.314500 -0.491200 -0.812300
+vn -0.665300 -0.499600 -0.554700
+vn 0.091800 -0.215200 -0.972200
+vn -0.450500 -0.877600 0.164000
+vn -0.442900 -0.877600 0.183400
+vn -0.080500 -0.996200 0.033300
+vn -0.081900 -0.996200 0.029800
+vn -0.083100 -0.996200 0.026200
+vn -0.457200 -0.877600 0.144200
+vn -0.084100 -0.996200 0.022500
+vn -0.463100 -0.877600 0.124100
+vn -0.853800 -0.445400 0.269200
+vn -0.841300 -0.445400 0.306200
+vn -0.864800 -0.445400 0.231700
+vn -0.827100 -0.445400 0.342600
+vn -0.472200 -0.877600 0.083300
+vn -0.468100 -0.877600 0.103700
+vn -0.085100 -0.996200 0.018800
+vn -0.085800 -0.996200 0.015100
+vn -0.086400 -0.996200 0.011400
+vn -0.475300 -0.877600 0.062600
+vn -0.086800 -0.996200 0.007600
+vn -0.477600 -0.877600 0.041800
+vn -0.887600 -0.445400 0.116900
+vn -0.881700 -0.445400 0.155500
+vn -0.891900 -0.445400 0.078000
+vn -0.874100 -0.445400 0.193700
+vn -0.479400 -0.877600 0.000000
+vn -0.479000 -0.877600 0.020900
+vn -0.087000 -0.996200 0.003800
+vn -0.087100 -0.996200 0.000000
+vn -0.087000 -0.996200 -0.003800
+vn -0.479000 -0.877600 -0.020900
+vn -0.086800 -0.996200 -0.007600
+vn -0.477600 -0.877600 -0.041800
+vn -0.894400 -0.445400 -0.039000
+vn -0.895300 -0.445400 0.000000
+vn -0.891900 -0.445400 -0.078000
+vn -0.894400 -0.445400 0.039000
+vn -0.472200 -0.877600 -0.083300
+vn -0.475300 -0.877600 -0.062600
+vn -0.086400 -0.996200 -0.011400
+vn -0.085800 -0.996200 -0.015100
+vn -0.085100 -0.996200 -0.018800
+vn -0.468100 -0.877600 -0.103700
+vn -0.084100 -0.996200 -0.022500
+vn -0.463100 -0.877600 -0.124100
+vn -0.874100 -0.445400 -0.193700
+vn -0.881700 -0.445400 -0.155500
+vn -0.864800 -0.445400 -0.231700
+vn -0.887600 -0.445400 -0.116900
+vn -0.450500 -0.877600 -0.164000
+vn -0.457200 -0.877600 -0.144200
+vn -0.083100 -0.996200 -0.026200
+vn -0.081900 -0.996200 -0.029800
+vn -0.080500 -0.996200 -0.033300
+vn -0.442900 -0.877600 -0.183400
+vn -0.079000 -0.996200 -0.036800
+vn -0.434500 -0.877600 -0.202600
+vn -0.827100 -0.445400 -0.342600
+vn -0.841300 -0.445400 -0.306200
+vn -0.811400 -0.445400 -0.378400
+vn -0.853800 -0.445400 -0.269200
+vn -0.415200 -0.877600 -0.239700
+vn -0.425200 -0.877600 -0.221400
+vn -0.077300 -0.996200 -0.040200
+vn -0.075400 -0.996200 -0.043500
+vn -0.073500 -0.996200 -0.046800
+vn -0.404400 -0.877600 -0.257600
+vn -0.071400 -0.996200 -0.050000
+vn -0.392700 -0.877600 -0.275000
+vn -0.755100 -0.445400 -0.481000
+vn -0.775400 -0.445400 -0.447600
+vn -0.733400 -0.445400 -0.513500
+vn -0.794100 -0.445400 -0.413400
+vn -0.367300 -0.877600 -0.308200
+vn -0.380400 -0.877600 -0.291900
+vn -0.069100 -0.996200 -0.053000
+vn -0.066700 -0.996200 -0.056000
+vn -0.064200 -0.996200 -0.058800
+vn -0.353500 -0.877600 -0.323900
+vn -0.061600 -0.996200 -0.061600
+vn -0.339000 -0.877600 -0.339000
+vn -0.660100 -0.445400 -0.604800
+vn -0.685800 -0.445400 -0.575500
+vn -0.633000 -0.445400 -0.633000
+vn -0.710300 -0.445400 -0.545000
+vn -0.308200 -0.877600 -0.367300
+vn -0.323900 -0.877600 -0.353500
+vn -0.058800 -0.996200 -0.064200
+vn -0.056000 -0.996200 -0.066700
+vn -0.053000 -0.996200 -0.069100
+vn -0.291900 -0.877600 -0.380400
+vn -0.050000 -0.996200 -0.071400
+vn -0.275000 -0.877600 -0.392700
+vn -0.545000 -0.445400 -0.710300
+vn -0.575500 -0.445400 -0.685800
+vn -0.513500 -0.445400 -0.733400
+vn -0.604800 -0.445400 -0.660100
+vn -0.239700 -0.877600 -0.415200
+vn -0.257600 -0.877600 -0.404400
+vn -0.046800 -0.996200 -0.073500
+vn -0.043500 -0.996200 -0.075400
+vn -0.040200 -0.996200 -0.077300
+vn -0.221400 -0.877600 -0.425200
+vn -0.036800 -0.996200 -0.079000
+vn -0.202600 -0.877600 -0.434500
+vn -0.413400 -0.445400 -0.794100
+vn -0.447600 -0.445400 -0.775400
+vn -0.378400 -0.445400 -0.811400
+vn -0.481000 -0.445400 -0.755100
+vn -0.164000 -0.877600 -0.450500
+vn -0.183400 -0.877600 -0.442900
+vn -0.033300 -0.996200 -0.080500
+vn -0.029800 -0.996200 -0.081900
+vn -0.026200 -0.996200 -0.083100
+vn -0.144200 -0.877600 -0.457200
+vn -0.022500 -0.996200 -0.084100
+vn -0.124100 -0.877600 -0.463100
+vn -0.269200 -0.445400 -0.853800
+vn -0.306200 -0.445400 -0.841300
+vn -0.231700 -0.445400 -0.864800
+vn -0.342600 -0.445400 -0.827100
+vn -0.083300 -0.877600 -0.472200
+vn -0.103700 -0.877600 -0.468100
+vn -0.018800 -0.996200 -0.085100
+vn -0.015100 -0.996200 -0.085800
+vn -0.011400 -0.996200 -0.086400
+vn -0.062600 -0.877600 -0.475300
+vn -0.007600 -0.996200 -0.086800
+vn -0.041800 -0.877600 -0.477600
+vn -0.116900 -0.445400 -0.887600
+vn -0.155500 -0.445400 -0.881700
+vn -0.078000 -0.445400 -0.891900
+vn -0.193700 -0.445400 -0.874100
+vn 0.000000 -0.877600 -0.479400
+vn -0.020900 -0.877600 -0.479000
+vn -0.003800 -0.996200 -0.087000
+vn 0.000000 -0.996200 -0.087100
+vn 0.003800 -0.996200 -0.087000
+vn 0.020900 -0.877600 -0.479000
+vn 0.007600 -0.996200 -0.086800
+vn 0.041800 -0.877600 -0.477600
+vn 0.039000 -0.445400 -0.894400
+vn 0.000000 -0.445400 -0.895300
+vn 0.078000 -0.445400 -0.891900
+vn -0.039000 -0.445400 -0.894400
+vn 0.083300 -0.877600 -0.472200
+vn 0.062600 -0.877600 -0.475300
+vn 0.011400 -0.996200 -0.086400
+vn 0.015100 -0.996200 -0.085800
+vn 0.018800 -0.996200 -0.085100
+vn 0.103700 -0.877600 -0.468100
+vn 0.022500 -0.996200 -0.084100
+vn 0.124100 -0.877600 -0.463100
+vn 0.193700 -0.445400 -0.874100
+vn 0.155500 -0.445400 -0.881700
+vn 0.231700 -0.445400 -0.864800
+vn 0.116900 -0.445400 -0.887600
+vn 0.164000 -0.877600 -0.450500
+vn 0.144200 -0.877600 -0.457200
+vn 0.026200 -0.996200 -0.083100
+vn 0.029800 -0.996200 -0.081900
+vn 0.033300 -0.996200 -0.080500
+vn 0.183400 -0.877600 -0.442900
+vn 0.036800 -0.996200 -0.079000
+vn 0.202600 -0.877600 -0.434500
+vn 0.342600 -0.445400 -0.827100
+vn 0.306200 -0.445400 -0.841300
+vn 0.378400 -0.445400 -0.811400
+vn 0.269200 -0.445400 -0.853800
+vn 0.239700 -0.877600 -0.415200
+vn 0.221400 -0.877600 -0.425200
+vn 0.040200 -0.996200 -0.077300
+vn 0.043500 -0.996200 -0.075400
+vn 0.046800 -0.996200 -0.073500
+vn 0.257600 -0.877600 -0.404400
+vn 0.050000 -0.996200 -0.071400
+vn 0.275000 -0.877600 -0.392700
+vn 0.481000 -0.445400 -0.755100
+vn 0.447600 -0.445400 -0.775400
+vn 0.513500 -0.445400 -0.733400
+vn 0.413400 -0.445400 -0.794100
+vn 0.308200 -0.877600 -0.367300
+vn 0.291900 -0.877600 -0.380400
+vn 0.053000 -0.996200 -0.069100
+vn 0.056000 -0.996200 -0.066700
+vn 0.058800 -0.996200 -0.064200
+vn 0.323900 -0.877600 -0.353500
+vn 0.061600 -0.996200 -0.061600
+vn 0.339000 -0.877600 -0.339000
+vn 0.604800 -0.445400 -0.660100
+vn 0.575500 -0.445400 -0.685800
+vn 0.633000 -0.445400 -0.633100
+vn 0.545000 -0.445400 -0.710300
+vn 0.367300 -0.877600 -0.308200
+vn 0.353500 -0.877600 -0.323900
+vn 0.064200 -0.996200 -0.058800
+vn 0.066700 -0.996200 -0.056000
+vn 0.069100 -0.996200 -0.053000
+vn 0.380400 -0.877600 -0.291900
+vn 0.071400 -0.996200 -0.050000
+vn 0.392700 -0.877600 -0.275000
+vn 0.710300 -0.445400 -0.545000
+vn 0.685800 -0.445400 -0.575500
+vn 0.733400 -0.445400 -0.513500
+vn 0.660100 -0.445400 -0.604800
+vn 0.415200 -0.877600 -0.239700
+vn 0.404400 -0.877600 -0.257600
+vn 0.073500 -0.996200 -0.046800
+vn 0.075400 -0.996200 -0.043500
+vn 0.077300 -0.996200 -0.040200
+vn 0.425200 -0.877600 -0.221400
+vn 0.079000 -0.996200 -0.036800
+vn 0.434500 -0.877600 -0.202600
+vn 0.794100 -0.445400 -0.413400
+vn 0.775400 -0.445400 -0.447600
+vn 0.811400 -0.445400 -0.378400
+vn 0.755100 -0.445400 -0.481000
+vn 0.450500 -0.877600 -0.164000
+vn 0.442900 -0.877600 -0.183400
+vn 0.080500 -0.996200 -0.033300
+vn 0.081900 -0.996200 -0.029800
+vn 0.083100 -0.996200 -0.026200
+vn 0.457200 -0.877600 -0.144200
+vn 0.084100 -0.996200 -0.022500
+vn 0.463100 -0.877600 -0.124100
+vn 0.853800 -0.445400 -0.269200
+vn 0.841300 -0.445400 -0.306200
+vn 0.864800 -0.445400 -0.231700
+vn 0.827100 -0.445400 -0.342600
+vn 0.472200 -0.877600 -0.083300
+vn 0.468100 -0.877600 -0.103700
+vn 0.085100 -0.996200 -0.018800
+vn 0.085800 -0.996200 -0.015100
+vn 0.086400 -0.996200 -0.011400
+vn 0.475300 -0.877600 -0.062600
+vn 0.086800 -0.996200 -0.007600
+vn 0.477600 -0.877600 -0.041800
+vn 0.887600 -0.445400 -0.116900
+vn 0.881700 -0.445400 -0.155500
+vn 0.891900 -0.445400 -0.078000
+vn 0.874100 -0.445400 -0.193700
+vn 0.479400 -0.877600 0.000000
+vn 0.479000 -0.877600 -0.020900
+vn 0.087000 -0.996200 -0.003800
+vn 0.087100 -0.996200 0.000000
+vn 0.087000 -0.996200 0.003800
+vn 0.479000 -0.877600 0.020900
+vn 0.086800 -0.996200 0.007600
+vn 0.477600 -0.877600 0.041800
+vn 0.894400 -0.445400 0.039000
+vn 0.895300 -0.445400 0.000000
+vn 0.891900 -0.445400 0.078000
+vn 0.894400 -0.445400 -0.039000
+vn 0.472200 -0.877600 0.083300
+vn 0.475300 -0.877600 0.062600
+vn 0.086400 -0.996200 0.011400
+vn 0.085800 -0.996200 0.015100
+vn 0.085100 -0.996200 0.018800
+vn 0.468100 -0.877600 0.103700
+vn 0.084100 -0.996200 0.022500
+vn 0.463100 -0.877600 0.124100
+vn 0.874100 -0.445400 0.193700
+vn 0.881700 -0.445400 0.155500
+vn 0.864800 -0.445400 0.231700
+vn 0.887600 -0.445400 0.116900
+vn 0.450500 -0.877600 0.164000
+vn 0.457200 -0.877600 0.144200
+vn 0.083100 -0.996200 0.026200
+vn 0.081900 -0.996200 0.029800
+vn 0.080500 -0.996200 0.033300
+vn 0.442900 -0.877600 0.183400
+vn 0.079000 -0.996200 0.036800
+vn 0.434500 -0.877600 0.202600
+vn 0.827100 -0.445400 0.342600
+vn 0.841300 -0.445400 0.306200
+vn 0.811400 -0.445400 0.378400
+vn 0.853800 -0.445400 0.269200
+vn 0.415400 -0.877500 0.239500
+vn 0.425300 -0.877500 0.221300
+vn 0.077300 -0.996200 0.040200
+vn 0.075500 -0.996200 0.043500
+vn 0.073500 -0.996200 0.046700
+vn 0.404600 -0.877500 0.257200
+vn 0.071400 -0.996200 0.049900
+vn 0.393000 -0.877600 0.274500
+vn 0.755500 -0.445400 0.480300
+vn 0.775600 -0.445400 0.447200
+vn 0.733900 -0.445400 0.512700
+vn 0.794200 -0.445400 0.413300
+vn 0.375900 -0.876600 0.300400
+vn 0.699900 -0.444500 0.559000
+vn 0.714400 -0.445000 0.540000
+vn 0.383200 -0.877000 0.289700
+vn 0.069800 -0.996200 0.052700
+vn 0.068500 -0.996100 0.054800
+vn 0.067600 -0.996100 0.056200
+vn 0.370700 -0.876200 0.307800
+vn 0.067200 -0.996100 0.057000
+vn 0.368800 -0.875500 0.312200
+vn 0.689700 -0.443900 0.572100
+vn 0.685100 -0.442600 0.578500
+vn 0.314700 -0.915400 -0.250800
+vn 0.676700 -0.500900 -0.539600
+vn 0.690600 -0.500800 -0.521800
+vn 0.321600 -0.915200 -0.242900
+vn 0.709800 -0.500300 -0.495900
+vn 0.331200 -0.914800 -0.231400
+vn 0.049900 -0.998000 -0.037700
+vn 0.048800 -0.998000 -0.038900
+vn 0.051500 -0.998000 -0.036000
+vn 0.048000 -0.998000 -0.039600
+vn 0.310300 -0.915600 -0.255800
+vn 0.047700 -0.998100 -0.039600
+vn 0.308900 -0.915700 -0.256900
+vn 0.667500 -0.500600 -0.551100
+vn 0.665300 -0.499600 -0.554700
+vn 0.349900 -0.914800 -0.201800
+vn 0.750100 -0.500300 -0.432500
+vn 0.768100 -0.500300 -0.399700
+vn 0.358300 -0.914800 -0.186500
+vn 0.784700 -0.500300 -0.365900
+vn 0.366100 -0.914700 -0.170700
+vn 0.055700 -0.998000 -0.029000
+vn 0.054400 -0.998000 -0.031400
+vn 0.056900 -0.998000 -0.026600
+vn 0.053000 -0.998000 -0.033700
+vn 0.340900 -0.914800 -0.216700
+vn 0.730700 -0.500300 -0.464500
+vn 0.379600 -0.914700 -0.138200
+vn 0.373200 -0.914700 -0.154600
+vn 0.800000 -0.500300 -0.331300
+vn 0.813700 -0.500300 -0.296100
+vn 0.825800 -0.500300 -0.260400
+vn 0.385300 -0.914700 -0.121500
+vn 0.836400 -0.500200 -0.224100
+vn 0.390200 -0.914700 -0.104600
+vn 0.059900 -0.998000 -0.018900
+vn 0.059000 -0.998000 -0.021500
+vn 0.060700 -0.998000 -0.016200
+vn 0.058000 -0.998000 -0.024000
+vn 0.397800 -0.914700 -0.070100
+vn 0.394400 -0.914700 -0.087400
+vn 0.845300 -0.500300 -0.187400
+vn 0.852700 -0.500300 -0.150300
+vn 0.858500 -0.500300 -0.113000
+vn 0.400500 -0.914700 -0.052700
+vn 0.862600 -0.500200 -0.075400
+vn 0.402400 -0.914700 -0.035200
+vn 0.062300 -0.998000 -0.008200
+vn 0.061900 -0.998000 -0.010900
+vn 0.062600 -0.998000 -0.005500
+vn 0.061300 -0.998000 -0.013600
+vn 0.404000 -0.914700 0.000000
+vn 0.403600 -0.914700 -0.017600
+vn 0.865000 -0.500300 -0.037700
+vn 0.865900 -0.500300 0.000000
+vn 0.865000 -0.500300 0.037700
+vn 0.403600 -0.914700 0.017600
+vn 0.862600 -0.500200 0.075400
+vn 0.402400 -0.914700 0.035200
+vn 0.062700 -0.998000 0.002700
+vn 0.062800 -0.998000 0.000000
+vn 0.062600 -0.998000 0.005500
+vn 0.062700 -0.998000 -0.002700
+vn 0.397800 -0.914700 0.070100
+vn 0.400500 -0.914700 0.052700
+vn 0.858500 -0.500300 0.113000
+vn 0.852700 -0.500300 0.150300
+vn 0.845300 -0.500300 0.187400
+vn 0.394400 -0.914700 0.087400
+vn 0.836400 -0.500300 0.224100
+vn 0.390200 -0.914700 0.104600
+vn 0.061300 -0.998000 0.013600
+vn 0.061900 -0.998000 0.010900
+vn 0.060700 -0.998000 0.016200
+vn 0.062300 -0.998000 0.008200
+vn 0.379600 -0.914700 0.138200
+vn 0.385300 -0.914700 0.121500
+vn 0.825800 -0.500300 0.260400
+vn 0.813700 -0.500300 0.296100
+vn 0.800000 -0.500300 0.331300
+vn 0.373200 -0.914700 0.154600
+vn 0.784700 -0.500200 0.365900
+vn 0.366100 -0.914700 0.170700
+vn 0.058000 -0.998000 0.024000
+vn 0.059000 -0.998000 0.021500
+vn 0.056900 -0.998000 0.026600
+vn 0.059900 -0.998000 0.018900
+vn 0.349900 -0.914700 0.202000
+vn 0.358300 -0.914700 0.186600
+vn 0.768000 -0.500300 0.399800
+vn 0.749800 -0.500300 0.432900
+vn 0.730300 -0.500200 0.465200
+vn 0.340700 -0.914700 0.217000
+vn 0.709300 -0.500200 0.496600
+vn 0.330900 -0.914700 0.231700
+vn 0.053000 -0.998000 0.033800
+vn 0.054400 -0.998000 0.031400
+vn 0.051500 -0.998000 0.036000
+vn 0.055700 -0.998000 0.029000
+vn 0.309500 -0.914700 0.259700
+vn 0.320500 -0.914700 0.245900
+vn 0.686900 -0.500300 0.527100
+vn 0.663300 -0.500300 0.556600
+vn 0.638400 -0.500300 0.584900
+vn 0.297900 -0.914700 0.272900
+vn 0.612300 -0.500200 0.612300
+vn 0.285700 -0.914700 0.285700
+vn 0.046300 -0.998000 0.042400
+vn 0.048100 -0.998000 0.040400
+vn 0.044400 -0.998000 0.044400
+vn 0.049800 -0.998000 0.038200
+vn 0.259700 -0.914700 0.309500
+vn 0.272900 -0.914700 0.297900
+vn 0.584900 -0.500300 0.638400
+vn 0.556600 -0.500300 0.663300
+vn 0.527100 -0.500300 0.686900
+vn 0.245900 -0.914700 0.320500
+vn 0.496600 -0.500200 0.709300
+vn 0.231700 -0.914700 0.330900
+vn 0.038200 -0.998000 0.049800
+vn 0.040400 -0.998000 0.048100
+vn 0.036000 -0.998000 0.051500
+vn 0.042400 -0.998000 0.046300
+vn 0.202000 -0.914700 0.349900
+vn 0.217000 -0.914700 0.340700
+vn 0.465200 -0.500300 0.730300
+vn 0.432900 -0.500300 0.749800
+vn 0.399800 -0.500300 0.768000
+vn 0.186600 -0.914700 0.358300
+vn 0.365900 -0.500200 0.784700
+vn 0.170700 -0.914700 0.366100
+vn 0.029000 -0.998000 0.055700
+vn 0.031400 -0.998000 0.054400
+vn 0.026600 -0.998000 0.056900
+vn 0.033800 -0.998000 0.053000
+vn 0.138200 -0.914700 0.379600
+vn 0.154600 -0.914700 0.373200
+vn 0.331300 -0.500300 0.800000
+vn 0.296100 -0.500300 0.813700
+vn 0.260400 -0.500300 0.825800
+vn 0.121500 -0.914700 0.385300
+vn 0.224100 -0.500200 0.836400
+vn 0.104600 -0.914700 0.390200
+vn 0.018900 -0.998000 0.059900
+vn 0.021500 -0.998000 0.059000
+vn 0.016200 -0.998000 0.060700
+vn 0.024000 -0.998000 0.058000
+vn 0.070100 -0.914700 0.397800
+vn 0.087400 -0.914700 0.394400
+vn 0.187400 -0.500200 0.845300
+vn 0.150300 -0.500300 0.852700
+vn 0.113000 -0.500300 0.858500
+vn 0.052700 -0.914700 0.400500
+vn 0.075400 -0.500200 0.862600
+vn 0.035200 -0.914700 0.402400
+vn 0.008200 -0.998000 0.062300
+vn 0.010900 -0.998000 0.061900
+vn 0.005500 -0.998000 0.062600
+vn 0.013600 -0.998000 0.061300
+vn 0.000000 -0.914700 0.404000
+vn 0.017600 -0.914700 0.403600
+vn 0.037700 -0.500300 0.865000
+vn 0.000000 -0.500300 0.865800
+vn -0.037700 -0.500300 0.865000
+vn -0.017600 -0.914700 0.403600
+vn -0.075400 -0.500200 0.862600
+vn -0.035200 -0.914700 0.402400
+vn -0.002700 -0.998000 0.062700
+vn 0.000000 -0.998000 0.062800
+vn -0.005500 -0.998000 0.062600
+vn 0.002700 -0.998000 0.062700
+vn -0.070100 -0.914700 0.397800
+vn -0.052700 -0.914700 0.400500
+vn -0.113000 -0.500300 0.858500
+vn -0.150300 -0.500300 0.852700
+vn -0.187400 -0.500300 0.845300
+vn -0.087400 -0.914700 0.394400
+vn -0.224100 -0.500200 0.836400
+vn -0.104600 -0.914700 0.390200
+vn -0.013600 -0.998000 0.061300
+vn -0.010900 -0.998000 0.061900
+vn -0.016200 -0.998000 0.060700
+vn -0.008200 -0.998000 0.062300
+vn -0.138200 -0.914700 0.379600
+vn -0.121500 -0.914700 0.385300
+vn -0.260400 -0.500300 0.825800
+vn -0.296100 -0.500300 0.813700
+vn -0.331300 -0.500300 0.800000
+vn -0.154600 -0.914700 0.373200
+vn -0.365900 -0.500200 0.784700
+vn -0.170700 -0.914700 0.366100
+vn -0.024000 -0.998000 0.058000
+vn -0.021500 -0.998000 0.059000
+vn -0.026600 -0.998000 0.056900
+vn -0.018900 -0.998000 0.059900
+vn -0.202000 -0.914700 0.349900
+vn -0.186600 -0.914700 0.358300
+vn -0.399800 -0.500300 0.768000
+vn -0.432900 -0.500300 0.749800
+vn -0.465200 -0.500300 0.730300
+vn -0.217000 -0.914700 0.340700
+vn -0.496600 -0.500200 0.709300
+vn -0.231700 -0.914700 0.330900
+vn -0.033800 -0.998000 0.053000
+vn -0.031400 -0.998000 0.054400
+vn -0.036000 -0.998000 0.051500
+vn -0.029000 -0.998000 0.055700
+vn -0.259700 -0.914700 0.309500
+vn -0.245900 -0.914700 0.320500
+vn -0.527100 -0.500300 0.686900
+vn -0.556600 -0.500300 0.663300
+vn -0.584900 -0.500300 0.638400
+vn -0.272900 -0.914700 0.297900
+vn -0.612300 -0.500200 0.612300
+vn -0.285700 -0.914700 0.285700
+vn -0.042400 -0.998000 0.046300
+vn -0.040400 -0.998000 0.048100
+vn -0.044400 -0.998000 0.044400
+vn -0.038200 -0.998000 0.049800
+vn -0.309500 -0.914700 0.259700
+vn -0.297900 -0.914700 0.272900
+vn -0.638400 -0.500300 0.584900
+vn -0.663300 -0.500300 0.556600
+vn -0.686900 -0.500300 0.527100
+vn -0.320500 -0.914700 0.245900
+vn -0.709300 -0.500200 0.496600
+vn -0.330900 -0.914700 0.231700
+vn -0.049800 -0.998000 0.038200
+vn -0.048100 -0.998000 0.040400
+vn -0.051500 -0.998000 0.036000
+vn -0.046300 -0.998000 0.042400
+vn -0.349900 -0.914700 0.202000
+vn -0.340700 -0.914700 0.217000
+vn -0.730300 -0.500300 0.465200
+vn -0.749800 -0.500300 0.432900
+vn -0.768000 -0.500300 0.399800
+vn -0.358300 -0.914700 0.186600
+vn -0.784700 -0.500200 0.365900
+vn -0.366100 -0.914700 0.170700
+vn -0.055700 -0.998000 0.029000
+vn -0.054400 -0.998000 0.031400
+vn -0.056900 -0.998000 0.026600
+vn -0.053000 -0.998000 0.033800
+vn -0.379600 -0.914700 0.138200
+vn -0.373200 -0.914700 0.154600
+vn -0.800000 -0.500300 0.331300
+vn -0.813700 -0.500300 0.296100
+vn -0.825800 -0.500300 0.260400
+vn -0.385300 -0.914700 0.121500
+vn -0.836400 -0.500300 0.224100
+vn -0.390200 -0.914700 0.104600
+vn -0.059900 -0.998000 0.018900
+vn -0.059000 -0.998000 0.021500
+vn -0.060700 -0.998000 0.016200
+vn -0.058000 -0.998000 0.024000
+vn -0.397800 -0.914700 0.070100
+vn -0.394400 -0.914700 0.087400
+vn -0.845300 -0.500300 0.187400
+vn -0.852700 -0.500300 0.150300
+vn -0.858500 -0.500300 0.113000
+vn -0.400500 -0.914700 0.052700
+vn -0.862600 -0.500200 0.075400
+vn -0.402400 -0.914700 0.035200
+vn -0.062300 -0.998000 0.008200
+vn -0.061900 -0.998000 0.010900
+vn -0.062600 -0.998000 0.005500
+vn -0.061300 -0.998000 0.013600
+vn -0.404000 -0.914700 0.000000
+vn -0.403600 -0.914700 0.017600
+vn -0.865000 -0.500300 0.037700
+vn -0.865900 -0.500300 0.000000
+vn -0.865000 -0.500300 -0.037700
+vn -0.403600 -0.914700 -0.017600
+vn -0.862600 -0.500200 -0.075400
+vn -0.402400 -0.914700 -0.035200
+vn -0.062700 -0.998000 -0.002700
+vn -0.062800 -0.998000 0.000000
+vn -0.062600 -0.998000 -0.005500
+vn -0.062700 -0.998000 0.002700
+vn -0.397800 -0.914700 -0.070100
+vn -0.400500 -0.914700 -0.052700
+vn -0.858500 -0.500300 -0.113000
+vn -0.852700 -0.500300 -0.150300
+vn -0.845300 -0.500300 -0.187400
+vn -0.394400 -0.914700 -0.087400
+vn -0.836400 -0.500200 -0.224100
+vn -0.390200 -0.914700 -0.104600
+vn -0.061300 -0.998000 -0.013600
+vn -0.061900 -0.998000 -0.010900
+vn -0.060700 -0.998000 -0.016200
+vn -0.062300 -0.998000 -0.008200
+vn -0.379600 -0.914700 -0.138200
+vn -0.385300 -0.914700 -0.121500
+vn -0.825800 -0.500300 -0.260400
+vn -0.813700 -0.500300 -0.296100
+vn -0.800000 -0.500300 -0.331300
+vn -0.373200 -0.914700 -0.154600
+vn -0.784700 -0.500200 -0.365900
+vn -0.366100 -0.914700 -0.170700
+vn -0.058000 -0.998000 -0.024000
+vn -0.059000 -0.998000 -0.021500
+vn -0.056900 -0.998000 -0.026600
+vn -0.059900 -0.998000 -0.018900
+vn -0.349900 -0.914800 -0.201800
+vn -0.358300 -0.914800 -0.186500
+vn -0.768100 -0.500300 -0.399700
+vn -0.750100 -0.500300 -0.432500
+vn -0.730700 -0.500300 -0.464500
+vn -0.340900 -0.914800 -0.216700
+vn -0.709800 -0.500300 -0.495900
+vn -0.331200 -0.914800 -0.231400
+vn -0.053000 -0.998000 -0.033700
+vn -0.054400 -0.998000 -0.031400
+vn -0.051500 -0.998000 -0.036000
+vn -0.055700 -0.998000 -0.029000
+vn -0.314700 -0.915400 -0.250800
+vn -0.310300 -0.915600 -0.255800
+vn -0.048000 -0.998000 -0.039600
+vn -0.048800 -0.998000 -0.038900
+vn -0.049900 -0.998000 -0.037700
+vn -0.321600 -0.915200 -0.242900
+vn -0.690600 -0.500800 -0.521800
+vn -0.676700 -0.500900 -0.539600
+vn -0.667500 -0.500600 -0.551100
+vn 0.442500 -0.777600 -0.446500
+vn 0.682100 -0.256400 -0.684800
+vn 0.684500 -0.242900 -0.687300
+vn 0.453400 -0.764800 -0.457600
+vn 0.686500 -0.231400 -0.689300
+vn 0.463000 -0.753200 -0.467200
+vn 0.095200 -0.990700 -0.097000
+vn 0.089700 -0.991800 -0.091400
+vn 0.100200 -0.989700 -0.102100
+vn 0.084800 -0.992600 -0.086400
+vn 0.432100 -0.789500 -0.435900
+vn 0.679600 -0.269400 -0.682300
+vn 0.474600 -0.738400 -0.479000
+vn 0.688700 -0.217500 -0.691600
+vn 0.689500 -0.212800 -0.692300
+vn 0.478700 -0.733000 -0.483200
+vn 0.690400 -0.207000 -0.693200
+vn 0.483800 -0.726200 -0.488300
+vn 0.109300 -0.987700 -0.111400
+vn 0.106800 -0.988300 -0.108800
+vn 0.112500 -0.987000 -0.114600
+vn 0.104100 -0.988900 -0.106000
+vn 0.469900 -0.744500 -0.474200
+vn 0.687900 -0.223200 -0.690700
+vn 0.499400 -0.704600 -0.504200
+vn 0.692800 -0.189600 -0.695700
+vn 0.694100 -0.179900 -0.697000
+vn 0.508300 -0.691500 -0.513200
+vn 0.695200 -0.171700 -0.698000
+vn 0.516000 -0.679800 -0.521100
+vn 0.129500 -0.982800 -0.131900
+vn 0.123000 -0.984400 -0.125300
+vn 0.135300 -0.981100 -0.137900
+vn 0.117100 -0.985900 -0.119300
+vn 0.490800 -0.716600 -0.495500
+vn 0.691500 -0.199100 -0.694400
+vn 0.734300 -0.636000 -0.237200
+vn 0.927000 -0.361600 0.099600
+vn 0.735600 -0.460300 0.496900
+vn 0.466700 -0.866600 0.176400
+vn 0.200700 -0.976000 -0.084000
+vn 0.554300 -0.681300 -0.478000
+vn 0.705600 -0.173000 -0.687100
+vn 0.779700 -0.186600 -0.597600
+vn 0.945400 -0.124900 -0.300800
+vn -0.442500 -0.777600 -0.446500
+vn -0.682100 -0.256400 -0.684800
+vn -0.679600 -0.269400 -0.682300
+vn -0.432100 -0.789500 -0.435900
+vn -0.677400 -0.280100 -0.680200
+vn -0.423600 -0.798700 -0.427300
+vn -0.084800 -0.992600 -0.086400
+vn -0.089700 -0.991800 -0.091400
+vn -0.081000 -0.993300 -0.082600
+vn -0.095200 -0.990700 -0.097000
+vn -0.453400 -0.764800 -0.457600
+vn -0.100200 -0.989700 -0.102100
+vn -0.463000 -0.753200 -0.467200
+vn -0.684500 -0.242900 -0.687300
+vn -0.686500 -0.231400 -0.689300
+vn -0.474600 -0.738400 -0.479000
+vn -0.688700 -0.217500 -0.691600
+vn -0.687900 -0.223200 -0.690700
+vn -0.469900 -0.744500 -0.474200
+vn -0.104100 -0.988900 -0.106000
+vn -0.106800 -0.988300 -0.108800
+vn -0.109300 -0.987700 -0.111400
+vn -0.478700 -0.733000 -0.483200
+vn -0.112500 -0.987000 -0.114600
+vn -0.483800 -0.726200 -0.488300
+vn -0.689500 -0.212800 -0.692300
+vn -0.690400 -0.207000 -0.693200
+vn -0.499400 -0.704600 -0.504200
+vn -0.692800 -0.189600 -0.695700
+vn -0.691500 -0.199100 -0.694400
+vn -0.490800 -0.716600 -0.495500
+vn -0.117100 -0.985900 -0.119300
+vn -0.123000 -0.984400 -0.125300
+vn -0.129500 -0.982800 -0.131900
+vn -0.508300 -0.691500 -0.513200
+vn -0.694100 -0.179900 -0.697000
+vn -0.114200 -0.786700 -0.606600
+vn 0.314500 -0.491200 -0.812300
+vn 0.622200 -0.514400 -0.590000
+vn 0.235700 -0.916900 -0.322100
+vn -0.030400 -0.992500 -0.118000
+vn -0.373100 -0.812100 -0.448600
+vn -0.660000 -0.296900 -0.690100
+vn -0.526300 -0.333100 -0.782300
+vn -0.091800 -0.215200 -0.972200
+vn 0.183700 0.639700 -0.746300
+vn 0.154700 0.652300 -0.742000
+vn 0.158500 0.659400 -0.734800
+vn 0.188300 0.648200 -0.737800
+vn 0.161700 0.666800 -0.727500
+vn 0.192100 0.656900 -0.729000
+vn 0.124900 0.664400 -0.736900
+vn 0.128100 0.670200 -0.731100
+vn 0.130600 0.676100 -0.725100
+vn 0.217900 0.636300 -0.740000
+vn 0.212600 0.626500 -0.749800
+vn 0.247800 0.623500 -0.741400
+vn 0.241800 0.612400 -0.752700
+vn 0.222300 0.646400 -0.729900
+vn 0.252800 0.635000 -0.729900
+vn 0.206400 0.616900 -0.759500
+vn 0.178400 0.631400 -0.754600
+vn 0.199300 0.607600 -0.768800
+vn 0.172200 0.623400 -0.762700
+vn 0.234800 0.601500 -0.763600
+vn 0.226700 0.590900 -0.774200
+vn 0.150200 0.645300 -0.749000
+vn 0.121300 0.658700 -0.742500
+vn 0.145000 0.638500 -0.755800
+vn 0.117100 0.653200 -0.748000
+vn 0.157800 0.608300 -0.777900
+vn 0.132800 0.625800 -0.768600
+vn 0.139200 0.632000 -0.762300
+vn 0.165300 0.615600 -0.770400
+vn 0.107300 0.643000 -0.758300
+vn 0.112400 0.648000 -0.753300
+vn 0.191300 0.598700 -0.777800
+vn 0.182600 0.590100 -0.786400
+vn 0.217600 0.580700 -0.784500
+vn 0.207700 0.571000 -0.794200
+vn 0.173100 0.582000 -0.794500
+vn 0.149500 0.601200 -0.784900
+vn 0.162800 0.574300 -0.802300
+vn 0.140600 0.594600 -0.791600
+vn 0.196800 0.561800 -0.803500
+vn 0.185100 0.553000 -0.812300
+vn 0.125900 0.619900 -0.774500
+vn 0.101700 0.638200 -0.763100
+vn 0.118400 0.614300 -0.780100
+vn 0.095600 0.633700 -0.767600
+vn 0.121100 0.582600 -0.803600
+vn 0.101900 0.604200 -0.790300
+vn 0.110400 0.609000 -0.785400
+vn 0.131100 0.588400 -0.797900
+vn 0.082300 0.625500 -0.775800
+vn 0.089100 0.629400 -0.771900
+vn 0.151700 0.567100 -0.809500
+vn 0.140100 0.560400 -0.816200
+vn 0.172600 0.544800 -0.820600
+vn 0.159400 0.537200 -0.828200
+vn 0.127900 0.554300 -0.822400
+vn 0.110500 0.577300 -0.809000
+vn 0.115100 0.548800 -0.828000
+vn 0.099500 0.572500 -0.813800
+vn 0.145500 0.530300 -0.835200
+vn 0.130900 0.523900 -0.841600
+vn 0.093100 0.599700 -0.794800
+vn 0.075200 0.621900 -0.779400
+vn 0.083700 0.595700 -0.798800
+vn 0.067600 0.618600 -0.782700
+vn 0.076100 0.564500 -0.821900
+vn 0.064100 0.588900 -0.805600
+vn 0.074000 0.592100 -0.802500
+vn 0.088000 0.568200 -0.818100
+vn 0.051800 0.613200 -0.788200
+vn 0.059800 0.615700 -0.785700
+vn 0.101800 0.543800 -0.833000
+vn 0.088100 0.539400 -0.837400
+vn 0.115800 0.518300 -0.847300
+vn 0.100200 0.513400 -0.852300
+vn 0.074000 0.535800 -0.841100
+vn 0.064000 0.561300 -0.825100
+vn 0.059600 0.532700 -0.844200
+vn 0.051500 0.558600 -0.827800
+vn 0.084200 0.509100 -0.856500
+vn 0.067800 0.505700 -0.860000
+vn 0.053800 0.586200 -0.808300
+vn 0.043500 0.611000 -0.790400
+vn 0.043300 0.584000 -0.810600
+vn 0.035000 0.609200 -0.792200
+vn 0.025900 0.555100 -0.831400
+vn 0.021900 0.581000 -0.813600
+vn 0.032600 0.582200 -0.812300
+vn 0.038800 0.556600 -0.829900
+vn 0.017600 0.606800 -0.794600
+vn 0.026400 0.607800 -0.793600
+vn 0.044900 0.530300 -0.846600
+vn 0.030000 0.528600 -0.848300
+vn 0.051100 0.502900 -0.862800
+vn 0.034200 0.501000 -0.864700
+vn 0.015100 0.527500 -0.849400
+vn 0.013000 0.554200 -0.832300
+vn 0.000000 0.527200 -0.849700
+vn 0.000000 0.553900 -0.832600
+vn 0.017200 0.499800 -0.865900
+vn 0.000000 0.499400 -0.866300
+vn 0.011000 0.580200 -0.814400
+vn 0.008900 0.606200 -0.795300
+vn 0.000000 0.580000 -0.814600
+vn 0.000000 0.606000 -0.795500
+vn -0.025900 0.555100 -0.831400
+vn -0.021900 0.581000 -0.813600
+vn -0.011000 0.580200 -0.814400
+vn -0.013000 0.554200 -0.832300
+vn -0.017600 0.606800 -0.794600
+vn -0.008900 0.606200 -0.795300
+vn -0.015100 0.527500 -0.849400
+vn -0.030000 0.528600 -0.848300
+vn -0.017200 0.499800 -0.865900
+vn -0.034200 0.501000 -0.864700
+vn -0.044900 0.530300 -0.846600
+vn -0.038800 0.556600 -0.829900
+vn -0.059600 0.532700 -0.844200
+vn -0.051500 0.558600 -0.827800
+vn -0.051100 0.502900 -0.862800
+vn -0.067800 0.505700 -0.860000
+vn -0.032600 0.582200 -0.812300
+vn -0.026400 0.607800 -0.793600
+vn -0.043300 0.584000 -0.810600
+vn -0.035000 0.609200 -0.792200
+vn -0.076100 0.564500 -0.821900
+vn -0.064100 0.588900 -0.805600
+vn -0.053800 0.586200 -0.808300
+vn -0.064000 0.561300 -0.825100
+vn -0.051800 0.613200 -0.788200
+vn -0.043500 0.611000 -0.790400
+vn -0.074000 0.535800 -0.841100
+vn -0.088100 0.539400 -0.837400
+vn -0.084200 0.509100 -0.856500
+vn -0.100200 0.513400 -0.852300
+vn -0.101800 0.543800 -0.833000
+vn -0.088000 0.568200 -0.818100
+vn -0.115100 0.548800 -0.828000
+vn -0.099500 0.572500 -0.813800
+vn -0.115800 0.518300 -0.847300
+vn -0.130900 0.523900 -0.841600
+vn -0.074000 0.592100 -0.802500
+vn -0.059800 0.615700 -0.785700
+vn -0.083700 0.595700 -0.798800
+vn -0.067600 0.618600 -0.782700
+vn -0.121100 0.582600 -0.803600
+vn -0.101900 0.604200 -0.790300
+vn -0.093100 0.599700 -0.794800
+vn -0.110500 0.577300 -0.809000
+vn -0.082300 0.625500 -0.775800
+vn -0.075200 0.621900 -0.779400
+vn -0.127900 0.554300 -0.822400
+vn -0.140100 0.560400 -0.816200
+vn -0.145500 0.530300 -0.835200
+vn -0.159400 0.537200 -0.828200
+vn -0.151700 0.567100 -0.809500
+vn -0.131100 0.588400 -0.797900
+vn -0.162800 0.574300 -0.802300
+vn -0.140600 0.594600 -0.791600
+vn -0.172600 0.544800 -0.820600
+vn -0.185100 0.553000 -0.812300
+vn -0.110400 0.609000 -0.785400
+vn -0.089100 0.629400 -0.771900
+vn -0.118400 0.614300 -0.780100
+vn -0.095600 0.633700 -0.767600
+vn -0.157800 0.608300 -0.777900
+vn -0.132800 0.625800 -0.768600
+vn -0.125900 0.619900 -0.774500
+vn -0.149500 0.601200 -0.784900
+vn -0.107300 0.643000 -0.758300
+vn -0.101700 0.638200 -0.763100
+vn -0.173100 0.582000 -0.794500
+vn -0.182600 0.590100 -0.786400
+vn -0.196800 0.561800 -0.803500
+vn -0.207700 0.571000 -0.794200
+vn -0.191300 0.598700 -0.777800
+vn -0.165300 0.615600 -0.770400
+vn -0.199300 0.607600 -0.768800
+vn -0.172200 0.623400 -0.762700
+vn -0.217600 0.580700 -0.784500
+vn -0.226700 0.590900 -0.774200
+vn -0.139200 0.632000 -0.762300
+vn -0.112400 0.648000 -0.753300
+vn -0.145000 0.638500 -0.755800
+vn -0.117100 0.653200 -0.748000
+vn -0.183700 0.639700 -0.746300
+vn -0.154700 0.652300 -0.742000
+vn -0.150200 0.645300 -0.749000
+vn -0.178400 0.631400 -0.754600
+vn -0.124900 0.664400 -0.736900
+vn -0.121300 0.658700 -0.742500
+vn -0.206400 0.616900 -0.759500
+vn -0.212600 0.626500 -0.749800
+vn -0.234800 0.601500 -0.763600
+vn -0.241800 0.612400 -0.752700
+vn -0.217900 0.636300 -0.740000
+vn -0.188300 0.648200 -0.737800
+vn -0.222300 0.646400 -0.729900
+vn -0.192100 0.656900 -0.729000
+vn -0.247800 0.623500 -0.741400
+vn -0.252800 0.635000 -0.729900
+vn -0.158500 0.659400 -0.734800
+vn -0.128100 0.670200 -0.731100
+vn -0.161700 0.666800 -0.727500
+vn -0.130600 0.676100 -0.725100
+vn -0.197100 0.674800 -0.711100
+vn -0.166000 0.681800 -0.712400
+vn -0.164200 0.674200 -0.720000
+vn -0.195000 0.665800 -0.720100
+vn -0.134100 0.688200 -0.713000
+vn -0.132600 0.682100 -0.719100
+vn -0.225700 0.656700 -0.719500
+vn -0.228100 0.667100 -0.709200
+vn -0.256700 0.646700 -0.718200
+vn -0.259500 0.658500 -0.706400
+vn -0.229600 0.677500 -0.698700
+vn -0.198400 0.683800 -0.702100
+vn -0.230100 0.688100 -0.688100
+vn -0.198800 0.693000 -0.693000
+vn -0.261100 0.670400 -0.694400
+vn -0.261700 0.682500 -0.682500
+vn -0.167100 0.689400 -0.704800
+vn -0.135000 0.694400 -0.706800
+vn -0.167400 0.697100 -0.697100
+vn -0.135200 0.700600 -0.700600
+vn -0.197100 0.711100 -0.674800
+vn -0.166000 0.712400 -0.681800
+vn -0.167100 0.704800 -0.689400
+vn -0.198400 0.702100 -0.683800
+vn -0.134100 0.713000 -0.688200
+vn -0.135000 0.706800 -0.694400
+vn -0.229600 0.698700 -0.677500
+vn -0.228100 0.709200 -0.667100
+vn -0.261100 0.694400 -0.670400
+vn -0.259500 0.706400 -0.658500
+vn -0.225700 0.719600 -0.656700
+vn -0.195000 0.720100 -0.665800
+vn -0.222300 0.729900 -0.646400
+vn -0.192100 0.729000 -0.656900
+vn -0.256700 0.718200 -0.646700
+vn -0.252800 0.729900 -0.635000
+vn -0.164200 0.720000 -0.674200
+vn -0.132600 0.719100 -0.682100
+vn -0.161700 0.727500 -0.666800
+vn -0.130600 0.725100 -0.676100
+vn -0.183700 0.746300 -0.639700
+vn -0.154700 0.742000 -0.652300
+vn -0.158500 0.734800 -0.659400
+vn -0.188300 0.737800 -0.648200
+vn -0.124900 0.736900 -0.664400
+vn -0.128100 0.731100 -0.670200
+vn -0.217900 0.740000 -0.636300
+vn -0.212600 0.749800 -0.626500
+vn -0.247800 0.741400 -0.623500
+vn -0.241800 0.752700 -0.612400
+vn -0.206400 0.759500 -0.616900
+vn -0.178400 0.754600 -0.631400
+vn -0.199300 0.768800 -0.607600
+vn -0.172200 0.762700 -0.623400
+vn -0.234800 0.763600 -0.601500
+vn -0.226700 0.774200 -0.590900
+vn -0.150200 0.749000 -0.645300
+vn -0.121300 0.742500 -0.658700
+vn -0.145000 0.755800 -0.638500
+vn -0.117100 0.748000 -0.653200
+vn -0.157800 0.777900 -0.608300
+vn -0.132800 0.768600 -0.625800
+vn -0.139200 0.762300 -0.632000
+vn -0.165300 0.770400 -0.615600
+vn -0.107300 0.758300 -0.643000
+vn -0.112400 0.753300 -0.648000
+vn -0.191300 0.777800 -0.598700
+vn -0.182600 0.786400 -0.590100
+vn -0.217600 0.784500 -0.580700
+vn -0.207700 0.794200 -0.571000
+vn -0.173100 0.794500 -0.582000
+vn -0.149500 0.784900 -0.601200
+vn -0.162800 0.802300 -0.574300
+vn -0.140600 0.791600 -0.594600
+vn -0.196800 0.803500 -0.561800
+vn -0.185100 0.812300 -0.553000
+vn -0.125900 0.774500 -0.619900
+vn -0.101700 0.763100 -0.638200
+vn -0.118400 0.780100 -0.614300
+vn -0.095600 0.767600 -0.633700
+vn -0.121100 0.803600 -0.582600
+vn -0.101900 0.790300 -0.604200
+vn -0.110400 0.785400 -0.609000
+vn -0.131100 0.797900 -0.588400
+vn -0.082300 0.775800 -0.625500
+vn -0.089100 0.771900 -0.629400
+vn -0.151700 0.809500 -0.567100
+vn -0.140100 0.816200 -0.560400
+vn -0.172600 0.820600 -0.544800
+vn -0.159400 0.828200 -0.537200
+vn -0.127900 0.822400 -0.554300
+vn -0.110500 0.809000 -0.577300
+vn -0.115100 0.828000 -0.548800
+vn -0.099400 0.813800 -0.572500
+vn -0.145500 0.835200 -0.530300
+vn -0.130900 0.841600 -0.523900
+vn -0.093100 0.794800 -0.599700
+vn -0.075200 0.779400 -0.621900
+vn -0.083700 0.798800 -0.595700
+vn -0.067600 0.782700 -0.618600
+vn -0.076100 0.821900 -0.564500
+vn -0.064100 0.805600 -0.588900
+vn -0.074000 0.802500 -0.592100
+vn -0.088000 0.818100 -0.568200
+vn -0.051800 0.788200 -0.613200
+vn -0.059800 0.785700 -0.615700
+vn -0.101800 0.833000 -0.543800
+vn -0.088100 0.837400 -0.539400
+vn -0.115800 0.847300 -0.518300
+vn -0.100200 0.852300 -0.513400
+vn -0.074000 0.841100 -0.535800
+vn -0.064000 0.825100 -0.561300
+vn -0.059600 0.844200 -0.532700
+vn -0.051500 0.827800 -0.558600
+vn -0.084200 0.856500 -0.509100
+vn -0.067800 0.860000 -0.505700
+vn -0.053800 0.808300 -0.586200
+vn -0.043500 0.790400 -0.611000
+vn -0.043300 0.810600 -0.584000
+vn -0.035000 0.792200 -0.609200
+vn -0.025900 0.831400 -0.555100
+vn -0.021900 0.813600 -0.581000
+vn -0.032600 0.812300 -0.582200
+vn -0.038800 0.829900 -0.556600
+vn -0.017600 0.794600 -0.606800
+vn -0.026400 0.793600 -0.607800
+vn -0.044900 0.846600 -0.530300
+vn -0.030000 0.848300 -0.528600
+vn -0.051100 0.862800 -0.502900
+vn -0.034200 0.864700 -0.501000
+vn -0.015100 0.849400 -0.527500
+vn -0.013000 0.832300 -0.554200
+vn 0.000000 0.849700 -0.527200
+vn 0.000000 0.832600 -0.553900
+vn -0.017200 0.865900 -0.499800
+vn 0.000000 0.866300 -0.499400
+vn -0.011000 0.814400 -0.580200
+vn -0.008900 0.795300 -0.606200
+vn 0.000000 0.814600 -0.580000
+vn 0.000000 0.795500 -0.606000
+vn 0.025900 0.831400 -0.555100
+vn 0.021900 0.813600 -0.581000
+vn 0.011000 0.814400 -0.580200
+vn 0.013000 0.832300 -0.554200
+vn 0.017600 0.794600 -0.606800
+vn 0.008900 0.795300 -0.606200
+vn 0.015100 0.849400 -0.527500
+vn 0.030000 0.848300 -0.528600
+vn 0.017200 0.865900 -0.499800
+vn 0.034200 0.864700 -0.501000
+vn 0.044900 0.846600 -0.530300
+vn 0.038800 0.829900 -0.556600
+vn 0.059600 0.844200 -0.532700
+vn 0.051500 0.827800 -0.558600
+vn 0.051100 0.862800 -0.502900
+vn 0.067800 0.860000 -0.505700
+vn 0.032600 0.812300 -0.582200
+vn 0.026400 0.793600 -0.607800
+vn 0.043300 0.810600 -0.584000
+vn 0.035000 0.792200 -0.609200
+vn 0.076100 0.821900 -0.564500
+vn 0.064100 0.805600 -0.588900
+vn 0.053800 0.808300 -0.586200
+vn 0.064000 0.825100 -0.561300
+vn 0.051800 0.788200 -0.613200
+vn 0.043500 0.790400 -0.611000
+vn 0.074000 0.841100 -0.535800
+vn 0.088100 0.837400 -0.539400
+vn 0.084200 0.856500 -0.509100
+vn 0.100200 0.852300 -0.513400
+vn 0.101800 0.833000 -0.543800
+vn 0.088000 0.818100 -0.568200
+vn 0.115100 0.828000 -0.548800
+vn 0.099400 0.813800 -0.572500
+vn 0.115800 0.847300 -0.518300
+vn 0.130900 0.841600 -0.523900
+vn 0.074000 0.802500 -0.592100
+vn 0.059800 0.785700 -0.615700
+vn 0.083700 0.798800 -0.595700
+vn 0.067600 0.782700 -0.618600
+vn 0.121100 0.803600 -0.582600
+vn 0.101900 0.790300 -0.604200
+vn 0.093100 0.794800 -0.599700
+vn 0.110500 0.809000 -0.577300
+vn 0.082300 0.775800 -0.625500
+vn 0.075200 0.779400 -0.621900
+vn 0.127900 0.822400 -0.554300
+vn 0.140100 0.816200 -0.560400
+vn 0.145500 0.835200 -0.530300
+vn 0.159400 0.828200 -0.537200
+vn 0.151700 0.809500 -0.567100
+vn 0.131100 0.797900 -0.588400
+vn 0.162800 0.802300 -0.574300
+vn 0.140600 0.791600 -0.594600
+vn 0.172600 0.820600 -0.544800
+vn 0.185100 0.812300 -0.553000
+vn 0.110400 0.785400 -0.609000
+vn 0.089100 0.771900 -0.629400
+vn 0.118400 0.780100 -0.614300
+vn 0.095600 0.767600 -0.633700
+vn 0.157800 0.777900 -0.608300
+vn 0.132800 0.768600 -0.625800
+vn 0.125900 0.774500 -0.619900
+vn 0.149500 0.784900 -0.601200
+vn 0.107300 0.758300 -0.643000
+vn 0.101700 0.763100 -0.638200
+vn 0.173100 0.794500 -0.582000
+vn 0.182600 0.786400 -0.590100
+vn 0.196800 0.803500 -0.561800
+vn 0.207700 0.794200 -0.571000
+vn 0.191300 0.777800 -0.598700
+vn 0.165300 0.770400 -0.615600
+vn 0.199300 0.768800 -0.607600
+vn 0.172200 0.762700 -0.623400
+vn 0.217600 0.784500 -0.580700
+vn 0.226700 0.774200 -0.590900
+vn 0.139200 0.762300 -0.632000
+vn 0.112400 0.753300 -0.648000
+vn 0.145000 0.755800 -0.638500
+vn 0.117100 0.748000 -0.653200
+vn 0.183700 0.746300 -0.639700
+vn 0.154700 0.742000 -0.652300
+vn 0.150200 0.749000 -0.645300
+vn 0.178400 0.754600 -0.631400
+vn 0.124900 0.736900 -0.664400
+vn 0.121300 0.742500 -0.658700
+vn 0.206400 0.759500 -0.616900
+vn 0.212600 0.749800 -0.626500
+vn 0.234800 0.763600 -0.601500
+vn 0.241800 0.752700 -0.612400
+vn 0.217900 0.740000 -0.636300
+vn 0.188300 0.737800 -0.648200
+vn 0.222300 0.729900 -0.646400
+vn 0.192100 0.729000 -0.656900
+vn 0.247800 0.741400 -0.623500
+vn 0.252800 0.729900 -0.635000
+vn 0.158500 0.734800 -0.659400
+vn 0.128100 0.731100 -0.670200
+vn 0.161700 0.727500 -0.666800
+vn 0.130600 0.725100 -0.676100
+vn 0.197100 0.711100 -0.674800
+vn 0.166000 0.712400 -0.681800
+vn 0.164200 0.720000 -0.674200
+vn 0.195000 0.720100 -0.665800
+vn 0.134100 0.713000 -0.688200
+vn 0.132600 0.719100 -0.682100
+vn 0.225700 0.719500 -0.656700
+vn 0.228100 0.709200 -0.667100
+vn 0.256700 0.718200 -0.646700
+vn 0.259500 0.706400 -0.658500
+vn 0.229600 0.698700 -0.677500
+vn 0.198400 0.702100 -0.683800
+vn 0.230100 0.688100 -0.688100
+vn 0.198800 0.693000 -0.693000
+vn 0.261100 0.694400 -0.670400
+vn 0.261700 0.682500 -0.682500
+vn 0.167100 0.704800 -0.689400
+vn 0.134900 0.706800 -0.694400
+vn 0.167400 0.697100 -0.697100
+vn 0.135200 0.700600 -0.700600
+vn 0.197100 0.674800 -0.711100
+vn 0.166000 0.681800 -0.712400
+vn 0.167100 0.689400 -0.704800
+vn 0.198400 0.683800 -0.702100
+vn 0.134100 0.688200 -0.712900
+vn 0.135000 0.694400 -0.706800
+vn 0.229600 0.677500 -0.698700
+vn 0.228100 0.667100 -0.709200
+vn 0.261100 0.670400 -0.694400
+vn 0.259500 0.658500 -0.706400
+vn 0.225700 0.656700 -0.719600
+vn 0.195000 0.665800 -0.720100
+vn 0.256700 0.646700 -0.718200
+vn 0.164200 0.674200 -0.720000
+vn 0.132600 0.682100 -0.719100
+vn 0.300100 0.581800 -0.755900
+vn 0.271200 0.597400 -0.754700
+vn 0.277900 0.609900 -0.742100
+vn 0.307600 0.595600 -0.742000
+vn 0.283500 0.622800 -0.729200
+vn 0.313800 0.609900 -0.727700
+vn 0.337000 0.580700 -0.741100
+vn 0.328800 0.565500 -0.756300
+vn 0.366000 0.565200 -0.739300
+vn 0.357100 0.548700 -0.755900
+vn 0.343700 0.596400 -0.725400
+vn 0.373300 0.582100 -0.722300
+vn 0.319200 0.550700 -0.771200
+vn 0.291400 0.568300 -0.769500
+vn 0.308200 0.536400 -0.785700
+vn 0.281400 0.555100 -0.782700
+vn 0.346700 0.532600 -0.772100
+vn 0.334800 0.517000 -0.787800
+vn 0.263300 0.585200 -0.767000
+vn 0.254200 0.573300 -0.778900
+vn 0.257800 0.530400 -0.807600
+vn 0.232900 0.551000 -0.801300
+vn 0.244000 0.561900 -0.790400
+vn 0.270100 0.542500 -0.795400
+vn 0.295900 0.522500 -0.799600
+vn 0.282400 0.509300 -0.812900
+vn 0.321500 0.501900 -0.802900
+vn 0.306800 0.487600 -0.817300
+vn 0.267700 0.496700 -0.825600
+vn 0.244400 0.519000 -0.819100
+vn 0.251700 0.484800 -0.837500
+vn 0.229800 0.508100 -0.830000
+vn 0.290800 0.474000 -0.831100
+vn 0.273500 0.461100 -0.844100
+vn 0.220700 0.540600 -0.811800
+vn 0.207600 0.530800 -0.821600
+vn 0.197900 0.488500 -0.849800
+vn 0.178700 0.513100 -0.839500
+vn 0.193500 0.521600 -0.830900
+vn 0.214300 0.497900 -0.840300
+vn 0.234700 0.473700 -0.848800
+vn 0.216800 0.463400 -0.859200
+vn 0.255000 0.449000 -0.856400
+vn 0.235500 0.437800 -0.867700
+vn 0.197900 0.454000 -0.868700
+vn 0.180600 0.479900 -0.858500
+vn 0.178100 0.445400 -0.877400
+vn 0.162500 0.472100 -0.866400
+vn 0.215000 0.427500 -0.878000
+vn 0.193400 0.418200 -0.887500
+vn 0.163200 0.505400 -0.847300
+vn 0.146800 0.498200 -0.854500
+vn 0.124400 0.458900 -0.879700
+vn 0.112400 0.486400 -0.866500
+vn 0.129800 0.491900 -0.860900
+vn 0.143700 0.465000 -0.873500
+vn 0.157500 0.437700 -0.885200
+vn 0.136300 0.431000 -0.892000
+vn 0.171100 0.409800 -0.896000
+vn 0.148100 0.402500 -0.903300
+vn 0.114500 0.425300 -0.897800
+vn 0.104600 0.453700 -0.885000
+vn 0.092200 0.420500 -0.902600
+vn 0.084100 0.449400 -0.889300
+vn 0.124400 0.396300 -0.909600
+vn 0.100200 0.391200 -0.914800
+vn 0.094400 0.481700 -0.871200
+vn 0.076000 0.477800 -0.875200
+vn 0.042400 0.443600 -0.895200
+vn 0.038300 0.472500 -0.880500
+vn 0.057300 0.474700 -0.878300
+vn 0.063400 0.446000 -0.892800
+vn 0.069400 0.416800 -0.906300
+vn 0.046500 0.414200 -0.909000
+vn 0.075400 0.387200 -0.918900
+vn 0.050500 0.384300 -0.921800
+vn 0.023300 0.412600 -0.910600
+vn 0.021300 0.442200 -0.896700
+vn 0.000000 0.412100 -0.911100
+vn 0.000000 0.441700 -0.897200
+vn 0.025400 0.382600 -0.923600
+vn 0.000000 0.382000 -0.924100
+vn 0.019200 0.471200 -0.881800
+vn 0.000000 0.470800 -0.882200
+vn -0.042400 0.443600 -0.895200
+vn -0.038300 0.472500 -0.880500
+vn -0.019200 0.471200 -0.881800
+vn -0.021300 0.442200 -0.896700
+vn -0.023300 0.412600 -0.910600
+vn -0.046500 0.414200 -0.909000
+vn -0.025400 0.382600 -0.923600
+vn -0.050500 0.384300 -0.921800
+vn -0.069400 0.416800 -0.906300
+vn -0.063400 0.446000 -0.892800
+vn -0.092200 0.420500 -0.902600
+vn -0.084100 0.449400 -0.889300
+vn -0.075400 0.387200 -0.918900
+vn -0.100200 0.391200 -0.914800
+vn -0.057300 0.474700 -0.878300
+vn -0.076000 0.477800 -0.875200
+vn -0.124400 0.458900 -0.879700
+vn -0.112400 0.486400 -0.866500
+vn -0.094400 0.481700 -0.871200
+vn -0.104600 0.453700 -0.885000
+vn -0.114500 0.425300 -0.897800
+vn -0.136300 0.431000 -0.892000
+vn -0.124400 0.396300 -0.909600
+vn -0.148100 0.402500 -0.903300
+vn -0.157500 0.437700 -0.885200
+vn -0.143700 0.465000 -0.873500
+vn -0.178100 0.445400 -0.877400
+vn -0.162500 0.472100 -0.866400
+vn -0.171100 0.409800 -0.896000
+vn -0.193400 0.418200 -0.887500
+vn -0.129800 0.491900 -0.860900
+vn -0.146800 0.498200 -0.854500
+vn -0.197900 0.488500 -0.849800
+vn -0.178700 0.513100 -0.839500
+vn -0.163200 0.505400 -0.847300
+vn -0.180600 0.479900 -0.858500
+vn -0.197900 0.454000 -0.868700
+vn -0.216800 0.463400 -0.859200
+vn -0.215000 0.427500 -0.878000
+vn -0.235500 0.437800 -0.867700
+vn -0.234700 0.473700 -0.848800
+vn -0.214300 0.497900 -0.840300
+vn -0.251700 0.484800 -0.837500
+vn -0.229800 0.508100 -0.830000
+vn -0.255000 0.449000 -0.856400
+vn -0.273500 0.461100 -0.844100
+vn -0.193500 0.521600 -0.830900
+vn -0.207600 0.530800 -0.821600
+vn -0.257800 0.530400 -0.807600
+vn -0.232900 0.551000 -0.801300
+vn -0.220700 0.540600 -0.811800
+vn -0.244400 0.519000 -0.819100
+vn -0.267700 0.496700 -0.825500
+vn -0.282400 0.509300 -0.812900
+vn -0.290800 0.474000 -0.831100
+vn -0.306800 0.487600 -0.817300
+vn -0.295900 0.522500 -0.799600
+vn -0.270100 0.542500 -0.795400
+vn -0.308200 0.536400 -0.785700
+vn -0.281400 0.555100 -0.782700
+vn -0.321500 0.501900 -0.802900
+vn -0.334800 0.517000 -0.787800
+vn -0.244000 0.561900 -0.790400
+vn -0.254200 0.573300 -0.778900
+vn -0.300100 0.581800 -0.755900
+vn -0.271200 0.597400 -0.754700
+vn -0.263300 0.585200 -0.767000
+vn -0.291400 0.568300 -0.769500
+vn -0.319200 0.550700 -0.771200
+vn -0.328800 0.565500 -0.756300
+vn -0.346700 0.532600 -0.772100
+vn -0.357100 0.548700 -0.755900
+vn -0.337000 0.580700 -0.741100
+vn -0.307600 0.595600 -0.742000
+vn -0.343700 0.596400 -0.725400
+vn -0.313800 0.609900 -0.727700
+vn -0.366000 0.565200 -0.739300
+vn -0.373300 0.582100 -0.722300
+vn -0.277900 0.609900 -0.742100
+vn -0.283500 0.622800 -0.729200
+vn -0.322100 0.639100 -0.698400
+vn -0.291000 0.649100 -0.702800
+vn -0.287800 0.635900 -0.716100
+vn -0.318600 0.624400 -0.713100
+vn -0.349000 0.612200 -0.709400
+vn -0.352800 0.628300 -0.693400
+vn -0.379100 0.599400 -0.704900
+vn -0.383200 0.616800 -0.687500
+vn -0.355100 0.644500 -0.677100
+vn -0.324100 0.653800 -0.683600
+vn -0.355800 0.660800 -0.660800
+vn -0.324800 0.668800 -0.668800
+vn -0.385600 0.634400 -0.669900
+vn -0.386500 0.652200 -0.652200
+vn -0.292800 0.662500 -0.689400
+vn -0.293500 0.676000 -0.676000
+vn -0.322100 0.698400 -0.639100
+vn -0.291000 0.702800 -0.649100
+vn -0.292800 0.689400 -0.662500
+vn -0.324100 0.683600 -0.653800
+vn -0.355100 0.677100 -0.644500
+vn -0.352800 0.693400 -0.628300
+vn -0.385600 0.669900 -0.634400
+vn -0.383200 0.687500 -0.616800
+vn -0.349000 0.709400 -0.612300
+vn -0.318600 0.713100 -0.624400
+vn -0.343700 0.725400 -0.596400
+vn -0.313800 0.727700 -0.609900
+vn -0.379100 0.704900 -0.599400
+vn -0.373300 0.722300 -0.582100
+vn -0.287800 0.716100 -0.635900
+vn -0.283500 0.729200 -0.622800
+vn -0.300100 0.755900 -0.581800
+vn -0.271200 0.754700 -0.597400
+vn -0.277900 0.742100 -0.609900
+vn -0.307600 0.742000 -0.595600
+vn -0.337000 0.741100 -0.580700
+vn -0.328800 0.756300 -0.565500
+vn -0.366000 0.739300 -0.565200
+vn -0.357100 0.755900 -0.548700
+vn -0.319200 0.771200 -0.550700
+vn -0.291400 0.769500 -0.568300
+vn -0.308200 0.785700 -0.536400
+vn -0.281400 0.782700 -0.555100
+vn -0.346700 0.772100 -0.532600
+vn -0.334800 0.787800 -0.517000
+vn -0.263300 0.767000 -0.585200
+vn -0.254200 0.778900 -0.573300
+vn -0.257800 0.807600 -0.530400
+vn -0.232900 0.801300 -0.551000
+vn -0.244000 0.790400 -0.561900
+vn -0.270100 0.795400 -0.542500
+vn -0.295900 0.799600 -0.522500
+vn -0.282400 0.812900 -0.509300
+vn -0.321500 0.802900 -0.501900
+vn -0.306800 0.817300 -0.487600
+vn -0.267700 0.825600 -0.496700
+vn -0.244400 0.819100 -0.519000
+vn -0.251700 0.837500 -0.484800
+vn -0.229800 0.830000 -0.508100
+vn -0.290800 0.831100 -0.474000
+vn -0.273500 0.844100 -0.461100
+vn -0.220700 0.811800 -0.540600
+vn -0.207600 0.821600 -0.530800
+vn -0.197900 0.849800 -0.488500
+vn -0.178700 0.839500 -0.513100
+vn -0.193500 0.830900 -0.521600
+vn -0.214300 0.840300 -0.497900
+vn -0.234700 0.848800 -0.473700
+vn -0.216800 0.859200 -0.463400
+vn -0.255000 0.856400 -0.449000
+vn -0.235500 0.867700 -0.437800
+vn -0.197900 0.868700 -0.454000
+vn -0.180600 0.858500 -0.479900
+vn -0.178100 0.877400 -0.445400
+vn -0.162500 0.866400 -0.472100
+vn -0.215000 0.878000 -0.427500
+vn -0.193400 0.887500 -0.418200
+vn -0.163200 0.847300 -0.505400
+vn -0.146800 0.854500 -0.498200
+vn -0.124400 0.879700 -0.458900
+vn -0.112400 0.866500 -0.486400
+vn -0.129800 0.860900 -0.491900
+vn -0.143700 0.873500 -0.465000
+vn -0.157500 0.885200 -0.437700
+vn -0.136300 0.892000 -0.431000
+vn -0.171100 0.896000 -0.409800
+vn -0.148100 0.903300 -0.402500
+vn -0.114500 0.897800 -0.425300
+vn -0.104600 0.885000 -0.453700
+vn -0.092200 0.902600 -0.420500
+vn -0.084100 0.889300 -0.449400
+vn -0.124400 0.909600 -0.396300
+vn -0.100200 0.914800 -0.391200
+vn -0.094400 0.871200 -0.481700
+vn -0.076000 0.875200 -0.477800
+vn -0.042400 0.895200 -0.443600
+vn -0.038300 0.880500 -0.472500
+vn -0.057300 0.878300 -0.474700
+vn -0.063400 0.892800 -0.446000
+vn -0.069400 0.906300 -0.416800
+vn -0.046500 0.909000 -0.414200
+vn -0.075400 0.918900 -0.387200
+vn -0.050500 0.921800 -0.384300
+vn -0.023300 0.910600 -0.412600
+vn -0.021300 0.896700 -0.442200
+vn 0.000000 0.911100 -0.412100
+vn 0.000000 0.897200 -0.441700
+vn -0.025400 0.923600 -0.382600
+vn 0.000000 0.924100 -0.382000
+vn -0.019200 0.881800 -0.471200
+vn 0.000000 0.882200 -0.470800
+vn 0.042400 0.895200 -0.443600
+vn 0.038300 0.880500 -0.472500
+vn 0.019200 0.881800 -0.471200
+vn 0.021300 0.896700 -0.442200
+vn 0.023300 0.910600 -0.412600
+vn 0.046500 0.909000 -0.414200
+vn 0.025400 0.923600 -0.382600
+vn 0.050500 0.921800 -0.384300
+vn 0.069400 0.906300 -0.416800
+vn 0.063400 0.892800 -0.446000
+vn 0.092200 0.902600 -0.420500
+vn 0.084100 0.889300 -0.449400
+vn 0.075400 0.918900 -0.387200
+vn 0.100200 0.914800 -0.391200
+vn 0.057300 0.878300 -0.474700
+vn 0.076000 0.875200 -0.477800
+vn 0.124400 0.879700 -0.458900
+vn 0.112400 0.866500 -0.486400
+vn 0.094400 0.871200 -0.481700
+vn 0.104500 0.885000 -0.453700
+vn 0.114500 0.897800 -0.425300
+vn 0.136300 0.892000 -0.431000
+vn 0.124400 0.909600 -0.396300
+vn 0.148100 0.903300 -0.402500
+vn 0.157500 0.885200 -0.437700
+vn 0.143700 0.873500 -0.465000
+vn 0.178100 0.877400 -0.445400
+vn 0.162500 0.866400 -0.472100
+vn 0.171100 0.896000 -0.409800
+vn 0.193400 0.887500 -0.418200
+vn 0.129800 0.860900 -0.491900
+vn 0.146800 0.854500 -0.498200
+vn 0.197900 0.849800 -0.488500
+vn 0.178700 0.839500 -0.513100
+vn 0.163200 0.847300 -0.505400
+vn 0.180600 0.858500 -0.479900
+vn 0.197900 0.868700 -0.454000
+vn 0.216800 0.859200 -0.463400
+vn 0.215000 0.878000 -0.427500
+vn 0.235500 0.867700 -0.437800
+vn 0.234700 0.848800 -0.473700
+vn 0.214300 0.840300 -0.497900
+vn 0.251700 0.837500 -0.484800
+vn 0.229800 0.830000 -0.508100
+vn 0.255000 0.856400 -0.449000
+vn 0.273500 0.844100 -0.461100
+vn 0.193500 0.830900 -0.521600
+vn 0.207600 0.821600 -0.530800
+vn 0.257800 0.807600 -0.530400
+vn 0.232900 0.801300 -0.551000
+vn 0.220700 0.811800 -0.540600
+vn 0.244400 0.819100 -0.519000
+vn 0.267700 0.825600 -0.496700
+vn 0.282400 0.812900 -0.509300
+vn 0.290800 0.831100 -0.474000
+vn 0.306800 0.817300 -0.487600
+vn 0.295900 0.799600 -0.522500
+vn 0.270100 0.795400 -0.542500
+vn 0.308200 0.785700 -0.536400
+vn 0.281400 0.782700 -0.555100
+vn 0.321500 0.802900 -0.501900
+vn 0.334800 0.787800 -0.517000
+vn 0.244000 0.790400 -0.561900
+vn 0.254200 0.778900 -0.573300
+vn 0.300100 0.755900 -0.581800
+vn 0.271200 0.754700 -0.597400
+vn 0.263300 0.767000 -0.585200
+vn 0.291400 0.769500 -0.568300
+vn 0.319200 0.771200 -0.550700
+vn 0.328800 0.756300 -0.565500
+vn 0.346700 0.772100 -0.532600
+vn 0.357100 0.755900 -0.548700
+vn 0.337000 0.741100 -0.580700
+vn 0.307600 0.742000 -0.595600
+vn 0.343700 0.725400 -0.596400
+vn 0.313800 0.727700 -0.609900
+vn 0.366000 0.739300 -0.565200
+vn 0.373300 0.722300 -0.582100
+vn 0.277900 0.742100 -0.609900
+vn 0.283500 0.729200 -0.622800
+vn 0.322100 0.698400 -0.639100
+vn 0.291000 0.702800 -0.649100
+vn 0.287800 0.716100 -0.635900
+vn 0.318600 0.713100 -0.624400
+vn 0.349000 0.709400 -0.612200
+vn 0.352800 0.693400 -0.628300
+vn 0.379100 0.704900 -0.599400
+vn 0.383200 0.687500 -0.616800
+vn 0.355100 0.677100 -0.644500
+vn 0.324100 0.683600 -0.653800
+vn 0.355800 0.660800 -0.660800
+vn 0.324800 0.668800 -0.668800
+vn 0.385600 0.669900 -0.634400
+vn 0.386500 0.652200 -0.652200
+vn 0.292800 0.689400 -0.662500
+vn 0.293500 0.676000 -0.676000
+vn 0.322100 0.639100 -0.698400
+vn 0.291000 0.649100 -0.702800
+vn 0.292800 0.662500 -0.689400
+vn 0.324100 0.653800 -0.683600
+vn 0.355100 0.644500 -0.677100
+vn 0.352800 0.628300 -0.693400
+vn 0.385600 0.634400 -0.669900
+vn 0.383200 0.616800 -0.687500
+vn 0.349000 0.612200 -0.709400
+vn 0.318600 0.624400 -0.713100
+vn 0.379100 0.599400 -0.704900
+vn 0.287800 0.635900 -0.716100
+vn 0.412500 0.513200 -0.752600
+vn 0.385100 0.531200 -0.754600
+vn 0.394600 0.549000 -0.736700
+vn 0.422700 0.532300 -0.733400
+vn 0.402500 0.567300 -0.718400
+vn 0.431200 0.551900 -0.713700
+vn 0.450400 0.515000 -0.729300
+vn 0.439500 0.494700 -0.749700
+vn 0.477600 0.497100 -0.724400
+vn 0.466000 0.475600 -0.746000
+vn 0.459400 0.535900 -0.708300
+vn 0.487200 0.519300 -0.702100
+vn 0.426700 0.474900 -0.769600
+vn 0.400500 0.494700 -0.771300
+vn 0.412100 0.455700 -0.789000
+vn 0.386700 0.476600 -0.789400
+vn 0.452500 0.454600 -0.767100
+vn 0.437000 0.434300 -0.787700
+vn 0.373900 0.513900 -0.772100
+vn 0.361000 0.497100 -0.789000
+vn 0.354400 0.442700 -0.823600
+vn 0.330800 0.465400 -0.820900
+vn 0.346600 0.480800 -0.805400
+vn 0.371300 0.459300 -0.806900
+vn 0.395600 0.437200 -0.807600
+vn 0.377600 0.419600 -0.825400
+vn 0.419500 0.414700 -0.807500
+vn 0.400400 0.395900 -0.826300
+vn 0.357900 0.402800 -0.842400
+vn 0.335900 0.427000 -0.839500
+vn 0.336600 0.386900 -0.858500
+vn 0.315900 0.412100 -0.854600
+vn 0.379600 0.378200 -0.844300
+vn 0.357000 0.361300 -0.861400
+vn 0.313500 0.450700 -0.835800
+vn 0.294900 0.436800 -0.849800
+vn 0.272000 0.385100 -0.881800
+vn 0.253900 0.411700 -0.875200
+vn 0.274900 0.423700 -0.863000
+vn 0.294600 0.398100 -0.868700
+vn 0.313900 0.372000 -0.873500
+vn 0.289900 0.358200 -0.887500
+vn 0.332900 0.345500 -0.877400
+vn 0.307400 0.330900 -0.892100
+vn 0.264700 0.345600 -0.900300
+vn 0.248400 0.373300 -0.893800
+vn 0.238200 0.334100 -0.911900
+vn 0.223500 0.362500 -0.904800
+vn 0.280700 0.317500 -0.905800
+vn 0.252600 0.305300 -0.918100
+vn 0.231800 0.400600 -0.886400
+vn 0.208600 0.390500 -0.896600
+vn 0.171100 0.344400 -0.923100
+vn 0.159700 0.373700 -0.913700
+vn 0.184500 0.381500 -0.905700
+vn 0.197700 0.352900 -0.914500
+vn 0.210600 0.323800 -0.922400
+vn 0.182300 0.314800 -0.931500
+vn 0.223400 0.294400 -0.929200
+vn 0.193400 0.284900 -0.938800
+vn 0.153200 0.307200 -0.939200
+vn 0.143800 0.337300 -0.930400
+vn 0.123300 0.300900 -0.945600
+vn 0.115700 0.331300 -0.936400
+vn 0.162500 0.276700 -0.947100
+vn 0.130800 0.270000 -0.953900
+vn 0.134200 0.367000 -0.920500
+vn 0.108000 0.361400 -0.926100
+vn 0.058400 0.323300 -0.944500
+vn 0.054500 0.354000 -0.933600
+vn 0.081400 0.357100 -0.930500
+vn 0.087200 0.326700 -0.941100
+vn 0.092900 0.295900 -0.950700
+vn 0.062200 0.292400 -0.954300
+vn 0.098500 0.264800 -0.959200
+vn 0.066000 0.261000 -0.963000
+vn 0.031200 0.290200 -0.956400
+vn 0.029300 0.321400 -0.946500
+vn 0.000000 0.289500 -0.957200
+vn 0.000000 0.320700 -0.947200
+vn 0.033100 0.258800 -0.965400
+vn 0.000000 0.258000 -0.966100
+vn 0.027300 0.352100 -0.935500
+vn 0.000000 0.351500 -0.936200
+vn -0.058400 0.323300 -0.944500
+vn -0.054500 0.354000 -0.933600
+vn -0.027300 0.352100 -0.935500
+vn -0.029300 0.321400 -0.946500
+vn -0.031200 0.290200 -0.956400
+vn -0.062200 0.292400 -0.954300
+vn -0.033100 0.258800 -0.965400
+vn -0.066000 0.261000 -0.963000
+vn -0.092900 0.295900 -0.950700
+vn -0.087200 0.326700 -0.941100
+vn -0.123300 0.300900 -0.945600
+vn -0.115700 0.331300 -0.936400
+vn -0.098500 0.264800 -0.959200
+vn -0.130800 0.270100 -0.953900
+vn -0.081300 0.357100 -0.930500
+vn -0.108000 0.361400 -0.926100
+vn -0.171100 0.344400 -0.923100
+vn -0.159700 0.373700 -0.913700
+vn -0.134200 0.367000 -0.920500
+vn -0.143800 0.337300 -0.930400
+vn -0.153200 0.307200 -0.939200
+vn -0.182300 0.314800 -0.931500
+vn -0.162500 0.276800 -0.947100
+vn -0.193400 0.284900 -0.938800
+vn -0.210600 0.323800 -0.922400
+vn -0.197700 0.352900 -0.914500
+vn -0.238200 0.334100 -0.911900
+vn -0.223500 0.362500 -0.904800
+vn -0.223400 0.294400 -0.929200
+vn -0.252600 0.305300 -0.918100
+vn -0.184500 0.381500 -0.905700
+vn -0.208600 0.390500 -0.896600
+vn -0.272000 0.385100 -0.881800
+vn -0.253900 0.411700 -0.875200
+vn -0.231800 0.400600 -0.886400
+vn -0.248400 0.373300 -0.893800
+vn -0.264700 0.345600 -0.900300
+vn -0.289900 0.358200 -0.887500
+vn -0.280700 0.317500 -0.905800
+vn -0.307400 0.330900 -0.892100
+vn -0.313900 0.372000 -0.873500
+vn -0.294600 0.398100 -0.868700
+vn -0.336600 0.386900 -0.858500
+vn -0.315900 0.412100 -0.854600
+vn -0.332900 0.345500 -0.877400
+vn -0.357000 0.361300 -0.861400
+vn -0.274900 0.423700 -0.863000
+vn -0.294900 0.436800 -0.849800
+vn -0.354400 0.442700 -0.823600
+vn -0.330800 0.465400 -0.820900
+vn -0.313500 0.450700 -0.835800
+vn -0.335900 0.427000 -0.839500
+vn -0.357900 0.402800 -0.842400
+vn -0.377600 0.419600 -0.825400
+vn -0.379600 0.378200 -0.844300
+vn -0.400400 0.395900 -0.826300
+vn -0.395600 0.437200 -0.807600
+vn -0.371300 0.459300 -0.806900
+vn -0.412100 0.455700 -0.789000
+vn -0.386700 0.476600 -0.789400
+vn -0.419500 0.414700 -0.807500
+vn -0.437000 0.434300 -0.787700
+vn -0.346600 0.480800 -0.805400
+vn -0.361000 0.497100 -0.789000
+vn -0.412500 0.513200 -0.752600
+vn -0.385100 0.531200 -0.754600
+vn -0.373900 0.513900 -0.772100
+vn -0.400500 0.494700 -0.771300
+vn -0.426700 0.474900 -0.769600
+vn -0.439500 0.494700 -0.749700
+vn -0.452500 0.454600 -0.767100
+vn -0.466000 0.475600 -0.746000
+vn -0.450400 0.515000 -0.729300
+vn -0.422700 0.532300 -0.733400
+vn -0.459400 0.535900 -0.708300
+vn -0.431200 0.551900 -0.713700
+vn -0.477600 0.497100 -0.724400
+vn -0.487200 0.519300 -0.702100
+vn -0.394600 0.549000 -0.736700
+vn -0.402500 0.567300 -0.718400
+vn -0.442500 0.591900 -0.673600
+vn -0.413100 0.604700 -0.680900
+vn -0.408700 0.585900 -0.699700
+vn -0.437800 0.571800 -0.693700
+vn -0.466500 0.557100 -0.687000
+vn -0.471500 0.578500 -0.665500
+vn -0.494600 0.541800 -0.679500
+vn -0.500000 0.564500 -0.656700
+vn -0.474500 0.600200 -0.643800
+vn -0.445400 0.612300 -0.653200
+vn -0.475600 0.622000 -0.622000
+vn -0.446400 0.632700 -0.632700
+vn -0.503200 0.587500 -0.633700
+vn -0.504300 0.610600 -0.610600
+vn -0.415800 0.623600 -0.661900
+vn -0.416700 0.642800 -0.642800
+vn -0.442500 0.673600 -0.591900
+vn -0.413100 0.680900 -0.604700
+vn -0.415800 0.661900 -0.623600
+vn -0.445400 0.653200 -0.612300
+vn -0.474500 0.643800 -0.600200
+vn -0.471500 0.665500 -0.578500
+vn -0.503200 0.633700 -0.587500
+vn -0.500000 0.656700 -0.564500
+vn -0.466500 0.687000 -0.557100
+vn -0.437800 0.693700 -0.571800
+vn -0.459400 0.708300 -0.535900
+vn -0.431200 0.713700 -0.551900
+vn -0.494600 0.679500 -0.541800
+vn -0.487200 0.702100 -0.519300
+vn -0.408700 0.699700 -0.585900
+vn -0.402500 0.718400 -0.567300
+vn -0.412500 0.752600 -0.513200
+vn -0.385100 0.754600 -0.531200
+vn -0.394600 0.736700 -0.549000
+vn -0.422700 0.733400 -0.532300
+vn -0.450400 0.729300 -0.515000
+vn -0.439500 0.749700 -0.494700
+vn -0.477600 0.724400 -0.497100
+vn -0.466000 0.746000 -0.475600
+vn -0.426700 0.769600 -0.474900
+vn -0.400500 0.771300 -0.494700
+vn -0.412100 0.789000 -0.455700
+vn -0.386700 0.789400 -0.476600
+vn -0.452500 0.767100 -0.454600
+vn -0.437000 0.787700 -0.434300
+vn -0.373900 0.772100 -0.513900
+vn -0.361000 0.789000 -0.497100
+vn -0.354400 0.823600 -0.442700
+vn -0.330800 0.820900 -0.465400
+vn -0.346600 0.805400 -0.480800
+vn -0.371300 0.806900 -0.459300
+vn -0.395600 0.807600 -0.437200
+vn -0.377600 0.825400 -0.419600
+vn -0.419500 0.807500 -0.414700
+vn -0.400400 0.826300 -0.395900
+vn -0.357900 0.842400 -0.402800
+vn -0.335900 0.839500 -0.427000
+vn -0.336600 0.858500 -0.386900
+vn -0.315900 0.854600 -0.412100
+vn -0.379600 0.844300 -0.378200
+vn -0.357000 0.861400 -0.361300
+vn -0.313500 0.835800 -0.450700
+vn -0.294900 0.849800 -0.436800
+vn -0.272000 0.881800 -0.385100
+vn -0.253900 0.875200 -0.411700
+vn -0.274900 0.863000 -0.423700
+vn -0.294600 0.868700 -0.398100
+vn -0.313900 0.873500 -0.372000
+vn -0.289900 0.887500 -0.358200
+vn -0.332900 0.877400 -0.345500
+vn -0.307400 0.892100 -0.330900
+vn -0.264700 0.900300 -0.345600
+vn -0.248400 0.893800 -0.373300
+vn -0.238200 0.911900 -0.334100
+vn -0.223500 0.904800 -0.362500
+vn -0.280700 0.905800 -0.317500
+vn -0.252600 0.918100 -0.305300
+vn -0.231800 0.886400 -0.400600
+vn -0.208600 0.896600 -0.390500
+vn -0.171100 0.923100 -0.344400
+vn -0.159700 0.913700 -0.373700
+vn -0.184500 0.905700 -0.381500
+vn -0.197700 0.914500 -0.352900
+vn -0.210600 0.922400 -0.323800
+vn -0.182300 0.931500 -0.314800
+vn -0.223400 0.929200 -0.294400
+vn -0.193400 0.938800 -0.284900
+vn -0.153200 0.939200 -0.307200
+vn -0.143800 0.930400 -0.337300
+vn -0.123300 0.945600 -0.300900
+vn -0.115700 0.936400 -0.331300
+vn -0.162500 0.947100 -0.276800
+vn -0.130800 0.953900 -0.270100
+vn -0.134200 0.920500 -0.367000
+vn -0.108000 0.926100 -0.361400
+vn -0.058400 0.944500 -0.323300
+vn -0.054500 0.933600 -0.354000
+vn -0.081400 0.930500 -0.357100
+vn -0.087200 0.941100 -0.326700
+vn -0.092900 0.950700 -0.295900
+vn -0.062200 0.954300 -0.292400
+vn -0.098500 0.959200 -0.264800
+vn -0.066000 0.963000 -0.261000
+vn -0.031200 0.956400 -0.290200
+vn -0.029300 0.946500 -0.321400
+vn 0.000000 0.957200 -0.289500
+vn 0.000000 0.947200 -0.320700
+vn -0.033100 0.965400 -0.258800
+vn 0.000000 0.966100 -0.258000
+vn -0.027300 0.935500 -0.352100
+vn 0.000000 0.936200 -0.351500
+vn 0.058400 0.944500 -0.323300
+vn 0.054500 0.933600 -0.354000
+vn 0.027300 0.935500 -0.352100
+vn 0.029300 0.946500 -0.321400
+vn 0.031200 0.956400 -0.290200
+vn 0.062200 0.954300 -0.292400
+vn 0.033100 0.965400 -0.258800
+vn 0.066000 0.963000 -0.261000
+vn 0.092900 0.950700 -0.295900
+vn 0.087200 0.941100 -0.326700
+vn 0.123300 0.945600 -0.300900
+vn 0.115700 0.936400 -0.331300
+vn 0.098500 0.959200 -0.264800
+vn 0.130800 0.953900 -0.270100
+vn 0.081400 0.930500 -0.357100
+vn 0.108000 0.926100 -0.361400
+vn 0.171100 0.923100 -0.344400
+vn 0.159700 0.913700 -0.373700
+vn 0.134200 0.920500 -0.367000
+vn 0.143800 0.930400 -0.337300
+vn 0.153200 0.939200 -0.307200
+vn 0.182300 0.931500 -0.314800
+vn 0.162500 0.947100 -0.276800
+vn 0.193400 0.938800 -0.284900
+vn 0.210600 0.922400 -0.323800
+vn 0.197700 0.914500 -0.352900
+vn 0.238200 0.911900 -0.334100
+vn 0.223500 0.904800 -0.362500
+vn 0.223400 0.929200 -0.294400
+vn 0.252600 0.918100 -0.305300
+vn 0.184500 0.905700 -0.381500
+vn 0.208600 0.896600 -0.390500
+vn 0.272000 0.881800 -0.385100
+vn 0.253900 0.875200 -0.411700
+vn 0.231800 0.886400 -0.400600
+vn 0.248400 0.893800 -0.373300
+vn 0.264700 0.900300 -0.345600
+vn 0.289900 0.887500 -0.358200
+vn 0.280700 0.905800 -0.317500
+vn 0.307400 0.892100 -0.330900
+vn 0.313900 0.873500 -0.372000
+vn 0.294600 0.868700 -0.398100
+vn 0.336600 0.858500 -0.386900
+vn 0.315900 0.854600 -0.412100
+vn 0.332900 0.877400 -0.345500
+vn 0.357000 0.861400 -0.361300
+vn 0.274900 0.863000 -0.423700
+vn 0.294900 0.849800 -0.436800
+vn 0.354400 0.823600 -0.442700
+vn 0.330800 0.820900 -0.465400
+vn 0.313500 0.835800 -0.450700
+vn 0.335900 0.839500 -0.427000
+vn 0.357900 0.842400 -0.402800
+vn 0.377600 0.825400 -0.419600
+vn 0.379600 0.844300 -0.378200
+vn 0.400400 0.826300 -0.395900
+vn 0.395600 0.807600 -0.437200
+vn 0.371300 0.806900 -0.459300
+vn 0.412100 0.789000 -0.455700
+vn 0.386700 0.789400 -0.476600
+vn 0.419500 0.807500 -0.414700
+vn 0.437000 0.787700 -0.434300
+vn 0.346600 0.805400 -0.480800
+vn 0.361000 0.789000 -0.497100
+vn 0.412500 0.752600 -0.513200
+vn 0.385100 0.754600 -0.531200
+vn 0.373900 0.772100 -0.513900
+vn 0.400500 0.771300 -0.494700
+vn 0.426700 0.769600 -0.474900
+vn 0.439500 0.749700 -0.494700
+vn 0.452500 0.767100 -0.454600
+vn 0.466000 0.746000 -0.475600
+vn 0.450400 0.729300 -0.515000
+vn 0.422700 0.733400 -0.532300
+vn 0.459400 0.708300 -0.535900
+vn 0.431200 0.713700 -0.551900
+vn 0.477600 0.724400 -0.497100
+vn 0.487200 0.702100 -0.519300
+vn 0.394600 0.736700 -0.549000
+vn 0.402500 0.718400 -0.567300
+vn 0.442500 0.673600 -0.591900
+vn 0.413100 0.680900 -0.604700
+vn 0.408700 0.699700 -0.585900
+vn 0.437800 0.693700 -0.571800
+vn 0.466500 0.687000 -0.557100
+vn 0.471500 0.665500 -0.578500
+vn 0.494600 0.679500 -0.541800
+vn 0.500000 0.656700 -0.564500
+vn 0.474500 0.643800 -0.600200
+vn 0.445400 0.653200 -0.612300
+vn 0.475600 0.622000 -0.622000
+vn 0.446400 0.632700 -0.632700
+vn 0.503200 0.633700 -0.587500
+vn 0.504300 0.610600 -0.610600
+vn 0.415800 0.661900 -0.623600
+vn 0.416700 0.642800 -0.642800
+vn 0.442500 0.591900 -0.673600
+vn 0.413100 0.604700 -0.680900
+vn 0.415800 0.623600 -0.661900
+vn 0.445400 0.612300 -0.653200
+vn 0.474500 0.600200 -0.643800
+vn 0.471500 0.578500 -0.665500
+vn 0.503200 0.587500 -0.633700
+vn 0.500000 0.564500 -0.656700
+vn 0.466500 0.557100 -0.687000
+vn 0.437800 0.571800 -0.693700
+vn 0.494600 0.541800 -0.679500
+vn 0.408700 0.585900 -0.699700
+vn 0.517500 0.436000 -0.736300
+vn 0.492000 0.456000 -0.741500
+vn 0.504300 0.478800 -0.718600
+vn 0.530300 0.459900 -0.712200
+vn 0.514300 0.502100 -0.695200
+vn 0.540900 0.484500 -0.687500
+vn 0.555800 0.440500 -0.704900
+vn 0.542400 0.415400 -0.730200
+vn 0.580700 0.420700 -0.697000
+vn 0.566700 0.394500 -0.723300
+vn 0.566900 0.466300 -0.679100
+vn 0.592300 0.447600 -0.669900
+vn 0.526700 0.391100 -0.754800
+vn 0.502500 0.412700 -0.759700
+vn 0.508600 0.367400 -0.778700
+vn 0.485200 0.390100 -0.782500
+vn 0.550200 0.369000 -0.749000
+vn 0.531400 0.344200 -0.774000
+vn 0.477800 0.433900 -0.763800
+vn 0.461400 0.412400 -0.785500
+vn 0.444700 0.347500 -0.825500
+vn 0.422800 0.371900 -0.826400
+vn 0.443000 0.391600 -0.806400
+vn 0.465900 0.368300 -0.804500
+vn 0.488400 0.344500 -0.801800
+vn 0.466100 0.322700 -0.823800
+vn 0.510200 0.320400 -0.798100
+vn 0.487000 0.297600 -0.821100
+vn 0.441800 0.302000 -0.844700
+vn 0.421600 0.327700 -0.845500
+vn 0.415600 0.282400 -0.864600
+vn 0.396500 0.309000 -0.864400
+vn 0.461700 0.275900 -0.843000
+vn 0.434300 0.255400 -0.863800
+vn 0.400800 0.353100 -0.845400
+vn 0.377000 0.335300 -0.863400
+vn 0.341500 0.275200 -0.898600
+vn 0.324700 0.303200 -0.895900
+vn 0.351500 0.318600 -0.880300
+vn 0.369700 0.291500 -0.882200
+vn 0.387600 0.264000 -0.883200
+vn 0.358000 0.247000 -0.900400
+vn 0.405000 0.236200 -0.883300
+vn 0.374000 0.218400 -0.901300
+vn 0.326800 0.231400 -0.916300
+vn 0.311800 0.260400 -0.913800
+vn 0.294100 0.217100 -0.930800
+vn 0.280600 0.246800 -0.927500
+vn 0.341500 0.202100 -0.917900
+vn 0.307400 0.187200 -0.933000
+vn 0.296400 0.289000 -0.910200
+vn 0.266700 0.276200 -0.923300
+vn 0.214800 0.224100 -0.950600
+vn 0.204200 0.254600 -0.945200
+vn 0.235900 0.264700 -0.935000
+vn 0.248100 0.234700 -0.939800
+vn 0.260100 0.204400 -0.943700
+vn 0.225200 0.193400 -0.954900
+vn 0.271800 0.174000 -0.946500
+vn 0.235300 0.162400 -0.958300
+vn 0.189200 0.183900 -0.964500
+vn 0.180500 0.215100 -0.959700
+vn 0.152300 0.176100 -0.972500
+vn 0.145300 0.207600 -0.967300
+vn 0.197800 0.152500 -0.968300
+vn 0.159200 0.144300 -0.976600
+vn 0.171600 0.246000 -0.953900
+vn 0.138100 0.238900 -0.961100
+vn 0.073300 0.197600 -0.977500
+vn 0.069700 0.229400 -0.970800
+vn 0.104000 0.233400 -0.966800
+vn 0.109500 0.201800 -0.973300
+vn 0.114700 0.170000 -0.978700
+vn 0.076800 0.165600 -0.983200
+vn 0.119900 0.137900 -0.983100
+vn 0.080300 0.133300 -0.987800
+vn 0.038600 0.162900 -0.985900
+vn 0.036800 0.195100 -0.980100
+vn 0.000000 0.162100 -0.986800
+vn 0.000000 0.194300 -0.980900
+vn 0.040300 0.130600 -0.990600
+vn 0.000000 0.129700 -0.991500
+vn 0.035000 0.227100 -0.973200
+vn 0.000000 0.226200 -0.974100
+vn -0.073300 0.197600 -0.977500
+vn -0.069700 0.229400 -0.970800
+vn -0.035000 0.227100 -0.973200
+vn -0.036800 0.195100 -0.980100
+vn -0.038600 0.162900 -0.985900
+vn -0.076800 0.165600 -0.983200
+vn -0.040300 0.130600 -0.990600
+vn -0.080300 0.133300 -0.987800
+vn -0.114700 0.170000 -0.978700
+vn -0.109500 0.201800 -0.973300
+vn -0.152300 0.176100 -0.972500
+vn -0.145300 0.207600 -0.967300
+vn -0.119900 0.137900 -0.983100
+vn -0.159200 0.144300 -0.976600
+vn -0.104000 0.233400 -0.966800
+vn -0.138100 0.238900 -0.961100
+vn -0.214800 0.224100 -0.950600
+vn -0.204200 0.254600 -0.945200
+vn -0.171600 0.246000 -0.953900
+vn -0.180500 0.215100 -0.959700
+vn -0.189200 0.183900 -0.964500
+vn -0.225200 0.193400 -0.954900
+vn -0.197800 0.152500 -0.968300
+vn -0.235300 0.162400 -0.958300
+vn -0.260100 0.204400 -0.943700
+vn -0.248100 0.234700 -0.939800
+vn -0.294100 0.217100 -0.930800
+vn -0.280600 0.246800 -0.927500
+vn -0.271800 0.174000 -0.946500
+vn -0.307400 0.187200 -0.933000
+vn -0.235900 0.264700 -0.935000
+vn -0.266700 0.276200 -0.923300
+vn -0.341500 0.275200 -0.898600
+vn -0.324700 0.303200 -0.895900
+vn -0.296400 0.289000 -0.910200
+vn -0.311800 0.260400 -0.913800
+vn -0.326800 0.231400 -0.916300
+vn -0.358000 0.247000 -0.900400
+vn -0.341500 0.202100 -0.917900
+vn -0.374000 0.218400 -0.901300
+vn -0.387600 0.264000 -0.883200
+vn -0.369700 0.291500 -0.882200
+vn -0.415600 0.282400 -0.864600
+vn -0.396500 0.309000 -0.864400
+vn -0.405000 0.236200 -0.883300
+vn -0.434300 0.255400 -0.863800
+vn -0.351500 0.318600 -0.880300
+vn -0.377000 0.335300 -0.863400
+vn -0.444700 0.347500 -0.825500
+vn -0.422800 0.371900 -0.826400
+vn -0.400800 0.353100 -0.845400
+vn -0.421600 0.327700 -0.845500
+vn -0.441800 0.302000 -0.844700
+vn -0.466100 0.322700 -0.823800
+vn -0.461700 0.275900 -0.843000
+vn -0.487000 0.297600 -0.821100
+vn -0.488300 0.344500 -0.801800
+vn -0.465900 0.368300 -0.804500
+vn -0.508600 0.367400 -0.778700
+vn -0.485200 0.390100 -0.782500
+vn -0.510200 0.320400 -0.798100
+vn -0.531400 0.344200 -0.774000
+vn -0.443000 0.391600 -0.806400
+vn -0.461400 0.412400 -0.785500
+vn -0.517500 0.436000 -0.736300
+vn -0.492000 0.456000 -0.741500
+vn -0.477800 0.433900 -0.763800
+vn -0.502500 0.412700 -0.759700
+vn -0.526700 0.391100 -0.754800
+vn -0.542400 0.415400 -0.730200
+vn -0.550200 0.369000 -0.749000
+vn -0.566700 0.394500 -0.723300
+vn -0.555800 0.440500 -0.704900
+vn -0.530300 0.459900 -0.712200
+vn -0.566900 0.466300 -0.679100
+vn -0.540900 0.484500 -0.687500
+vn -0.580700 0.420700 -0.697000
+vn -0.592300 0.447600 -0.669900
+vn -0.504300 0.478800 -0.718600
+vn -0.514300 0.502100 -0.695200
+vn -0.555100 0.534700 -0.637100
+vn -0.527800 0.549900 -0.647200
+vn -0.522200 0.525900 -0.671300
+vn -0.549200 0.509400 -0.662400
+vn -0.575600 0.492500 -0.652800
+vn -0.581800 0.518900 -0.626200
+vn -0.601400 0.475000 -0.642400
+vn -0.607900 0.502600 -0.614700
+vn -0.585500 0.545600 -0.599500
+vn -0.558700 0.560200 -0.611600
+vn -0.586800 0.572600 -0.572600
+vn -0.559900 0.585900 -0.585900
+vn -0.611700 0.530500 -0.586800
+vn -0.613100 0.558600 -0.558600
+vn -0.531300 0.574100 -0.623000
+vn -0.532400 0.598500 -0.598600
+vn -0.555100 0.637100 -0.534700
+vn -0.527900 0.647200 -0.549900
+vn -0.531300 0.623000 -0.574100
+vn -0.558700 0.611600 -0.560200
+vn -0.585500 0.599500 -0.545600
+vn -0.581800 0.626200 -0.518900
+vn -0.611700 0.586800 -0.530500
+vn -0.607900 0.614700 -0.502600
+vn -0.575600 0.652800 -0.492500
+vn -0.549200 0.662400 -0.509400
+vn -0.566900 0.679100 -0.466300
+vn -0.540900 0.687500 -0.484500
+vn -0.601400 0.642400 -0.475000
+vn -0.592300 0.669900 -0.447600
+vn -0.522200 0.671300 -0.525900
+vn -0.514300 0.695200 -0.502100
+vn -0.517500 0.736300 -0.436000
+vn -0.492000 0.741500 -0.456000
+vn -0.504300 0.718600 -0.478800
+vn -0.530300 0.712200 -0.459900
+vn -0.555800 0.704900 -0.440500
+vn -0.542400 0.730200 -0.415400
+vn -0.580700 0.697000 -0.420700
+vn -0.566700 0.723300 -0.394500
+vn -0.526700 0.754800 -0.391100
+vn -0.502500 0.759700 -0.412700
+vn -0.508600 0.778700 -0.367400
+vn -0.485200 0.782500 -0.390100
+vn -0.550200 0.749000 -0.369000
+vn -0.531400 0.774000 -0.344200
+vn -0.477800 0.763800 -0.433900
+vn -0.461400 0.785500 -0.412400
+vn -0.444700 0.825500 -0.347500
+vn -0.422800 0.826400 -0.371900
+vn -0.443000 0.806400 -0.391600
+vn -0.465900 0.804500 -0.368300
+vn -0.488300 0.801800 -0.344500
+vn -0.466100 0.823800 -0.322700
+vn -0.510200 0.798100 -0.320400
+vn -0.487000 0.821100 -0.297600
+vn -0.441800 0.844700 -0.302000
+vn -0.421600 0.845500 -0.327700
+vn -0.415600 0.864600 -0.282400
+vn -0.396500 0.864400 -0.309000
+vn -0.461700 0.843000 -0.276000
+vn -0.434300 0.863800 -0.255400
+vn -0.400800 0.845400 -0.353100
+vn -0.377000 0.863400 -0.335300
+vn -0.341500 0.898600 -0.275200
+vn -0.324700 0.895900 -0.303200
+vn -0.351500 0.880300 -0.318600
+vn -0.369700 0.882200 -0.291500
+vn -0.387600 0.883200 -0.264000
+vn -0.358000 0.900400 -0.247000
+vn -0.405000 0.883300 -0.236200
+vn -0.374000 0.901300 -0.218400
+vn -0.326800 0.916300 -0.231400
+vn -0.311800 0.913800 -0.260400
+vn -0.294100 0.930800 -0.217100
+vn -0.280600 0.927500 -0.246800
+vn -0.341500 0.917900 -0.202100
+vn -0.307400 0.933000 -0.187200
+vn -0.296400 0.910200 -0.289000
+vn -0.266700 0.923300 -0.276200
+vn -0.214800 0.950600 -0.224100
+vn -0.204200 0.945200 -0.254600
+vn -0.235900 0.935000 -0.264600
+vn -0.248100 0.939800 -0.234700
+vn -0.260100 0.943700 -0.204400
+vn -0.225200 0.954900 -0.193400
+vn -0.271800 0.946500 -0.174000
+vn -0.235300 0.958300 -0.162400
+vn -0.189200 0.964500 -0.183900
+vn -0.180500 0.959700 -0.215100
+vn -0.152300 0.972500 -0.176100
+vn -0.145300 0.967300 -0.207600
+vn -0.197800 0.968300 -0.152500
+vn -0.159200 0.976600 -0.144300
+vn -0.171600 0.953900 -0.246000
+vn -0.138100 0.961100 -0.238900
+vn -0.073300 0.977500 -0.197600
+vn -0.069700 0.970800 -0.229400
+vn -0.104000 0.966800 -0.233400
+vn -0.109400 0.973300 -0.201800
+vn -0.114700 0.978700 -0.170000
+vn -0.076800 0.983200 -0.165600
+vn -0.119900 0.983100 -0.137900
+vn -0.080300 0.987800 -0.133300
+vn -0.038600 0.985900 -0.162900
+vn -0.036800 0.980100 -0.195100
+vn 0.000000 0.986800 -0.162100
+vn 0.000000 0.980900 -0.194300
+vn -0.040300 0.990600 -0.130600
+vn 0.000000 0.991500 -0.129700
+vn -0.035000 0.973200 -0.227100
+vn 0.000000 0.974100 -0.226200
+vn 0.073300 0.977500 -0.197600
+vn 0.069700 0.970800 -0.229400
+vn 0.035000 0.973200 -0.227100
+vn 0.036800 0.980100 -0.195100
+vn 0.038600 0.985900 -0.162900
+vn 0.076800 0.983200 -0.165600
+vn 0.040300 0.990600 -0.130600
+vn 0.080300 0.987800 -0.133300
+vn 0.114700 0.978700 -0.170000
+vn 0.109400 0.973300 -0.201800
+vn 0.152300 0.972500 -0.176100
+vn 0.145300 0.967300 -0.207600
+vn 0.119900 0.983100 -0.137900
+vn 0.159200 0.976600 -0.144300
+vn 0.104000 0.966800 -0.233400
+vn 0.138100 0.961100 -0.238900
+vn 0.214800 0.950600 -0.224100
+vn 0.204200 0.945200 -0.254600
+vn 0.171600 0.953900 -0.246000
+vn 0.180500 0.959700 -0.215100
+vn 0.189200 0.964500 -0.183900
+vn 0.225200 0.954900 -0.193400
+vn 0.197800 0.968300 -0.152500
+vn 0.235300 0.958200 -0.162400
+vn 0.260100 0.943700 -0.204400
+vn 0.248100 0.939800 -0.234700
+vn 0.294100 0.930800 -0.217100
+vn 0.280600 0.927500 -0.246800
+vn 0.271800 0.946500 -0.174000
+vn 0.307400 0.933000 -0.187200
+vn 0.235900 0.935000 -0.264700
+vn 0.266700 0.923300 -0.276200
+vn 0.341500 0.898600 -0.275200
+vn 0.324700 0.895900 -0.303200
+vn 0.296400 0.910200 -0.289000
+vn 0.311800 0.913800 -0.260400
+vn 0.326800 0.916300 -0.231400
+vn 0.358000 0.900400 -0.247000
+vn 0.341500 0.917900 -0.202100
+vn 0.374000 0.901300 -0.218400
+vn 0.387600 0.883200 -0.264000
+vn 0.369700 0.882200 -0.291500
+vn 0.415600 0.864600 -0.282400
+vn 0.396500 0.864400 -0.309000
+vn 0.405000 0.883300 -0.236200
+vn 0.434300 0.863800 -0.255400
+vn 0.351500 0.880300 -0.318600
+vn 0.377000 0.863400 -0.335300
+vn 0.444700 0.825500 -0.347500
+vn 0.422800 0.826400 -0.371900
+vn 0.400800 0.845400 -0.353100
+vn 0.421600 0.845500 -0.327700
+vn 0.441800 0.844700 -0.302000
+vn 0.466100 0.823800 -0.322700
+vn 0.461700 0.843000 -0.276000
+vn 0.487000 0.821100 -0.297600
+vn 0.488300 0.801800 -0.344500
+vn 0.465900 0.804500 -0.368300
+vn 0.508600 0.778700 -0.367400
+vn 0.485200 0.782500 -0.390100
+vn 0.510200 0.798100 -0.320400
+vn 0.531400 0.774000 -0.344200
+vn 0.443000 0.806400 -0.391600
+vn 0.461400 0.785500 -0.412400
+vn 0.517500 0.736300 -0.436000
+vn 0.492000 0.741500 -0.456000
+vn 0.477800 0.763800 -0.433900
+vn 0.502500 0.759700 -0.412700
+vn 0.526700 0.754800 -0.391100
+vn 0.542400 0.730200 -0.415400
+vn 0.550200 0.749000 -0.369000
+vn 0.566700 0.723300 -0.394500
+vn 0.555800 0.704900 -0.440500
+vn 0.530300 0.712200 -0.459900
+vn 0.566900 0.679100 -0.466300
+vn 0.540900 0.687500 -0.484500
+vn 0.580700 0.697000 -0.420700
+vn 0.592300 0.669900 -0.447600
+vn 0.504300 0.718600 -0.478800
+vn 0.514300 0.695200 -0.502100
+vn 0.555100 0.637100 -0.534700
+vn 0.527900 0.647200 -0.549900
+vn 0.522200 0.671300 -0.525900
+vn 0.549200 0.662400 -0.509500
+vn 0.575600 0.652800 -0.492500
+vn 0.581800 0.626200 -0.518900
+vn 0.601400 0.642400 -0.475000
+vn 0.607900 0.614700 -0.502600
+vn 0.585500 0.599500 -0.545600
+vn 0.558700 0.611600 -0.560200
+vn 0.586800 0.572600 -0.572600
+vn 0.559900 0.585900 -0.585900
+vn 0.611700 0.586800 -0.530500
+vn 0.613100 0.558600 -0.558600
+vn 0.531300 0.623000 -0.574100
+vn 0.532400 0.598500 -0.598500
+vn 0.555100 0.534700 -0.637100
+vn 0.527800 0.549900 -0.647200
+vn 0.531300 0.574100 -0.623000
+vn 0.558700 0.560200 -0.611600
+vn 0.585500 0.545600 -0.599500
+vn 0.581800 0.518900 -0.626200
+vn 0.611700 0.530500 -0.586800
+vn 0.607900 0.502600 -0.614700
+vn 0.575600 0.492500 -0.652800
+vn 0.549200 0.509400 -0.662400
+vn 0.601400 0.475000 -0.642400
+vn 0.522200 0.525900 -0.671300
+vn 0.613400 0.351400 -0.707300
+vn 0.590400 0.373100 -0.715700
+vn 0.605000 0.400400 -0.688200
+vn 0.628500 0.379700 -0.678800
+vn 0.617100 0.428400 -0.660100
+vn 0.641100 0.408900 -0.649500
+vn 0.651400 0.358700 -0.668600
+vn 0.635700 0.329300 -0.698100
+vn 0.673600 0.337200 -0.657600
+vn 0.657400 0.306800 -0.688300
+vn 0.664400 0.388800 -0.638200
+vn 0.687000 0.368400 -0.626300
+vn 0.617300 0.300700 -0.727000
+vn 0.595600 0.323800 -0.735100
+vn 0.596200 0.272900 -0.755000
+vn 0.575200 0.296900 -0.762200
+vn 0.638400 0.277200 -0.718100
+vn 0.616500 0.248500 -0.747100
+vn 0.573300 0.346600 -0.742500
+vn 0.553600 0.320700 -0.768500
+vn 0.527200 0.246500 -0.813200
+vn 0.507400 0.272200 -0.817600
+vn 0.531600 0.295900 -0.793600
+vn 0.552400 0.271100 -0.788300
+vn 0.572500 0.246100 -0.782100
+vn 0.546400 0.220500 -0.807900
+vn 0.592000 0.220800 -0.775100
+vn 0.565100 0.194300 -0.801800
+vn 0.518100 0.196200 -0.832500
+vn 0.499800 0.223100 -0.836900
+vn 0.487300 0.173200 -0.855900
+vn 0.470100 0.200800 -0.859400
+vn 0.535800 0.169200 -0.827200
+vn 0.504000 0.145400 -0.851400
+vn 0.481000 0.249600 -0.840400
+vn 0.452500 0.228200 -0.862100
+vn 0.405000 0.160700 -0.900100
+vn 0.389700 0.189700 -0.901200
+vn 0.421900 0.208200 -0.882400
+vn 0.438400 0.180000 -0.880500
+vn 0.454500 0.151600 -0.877700
+vn 0.419800 0.131600 -0.898000
+vn 0.470000 0.123000 -0.874000
+vn 0.434200 0.102400 -0.895000
+vn 0.383300 0.113300 -0.916600
+vn 0.369800 0.143000 -0.918000
+vn 0.345000 0.096600 -0.933600
+vn 0.332800 0.126900 -0.934400
+vn 0.396400 0.083400 -0.914200
+vn 0.356800 0.066100 -0.931800
+vn 0.355800 0.172600 -0.918500
+vn 0.320200 0.157100 -0.934200
+vn 0.254800 0.100000 -0.961800
+vn 0.245200 0.131300 -0.960500
+vn 0.283200 0.143300 -0.948200
+vn 0.294400 0.112600 -0.949000
+vn 0.305100 0.081700 -0.948800
+vn 0.264100 0.068700 -0.962000
+vn 0.315600 0.050700 -0.947500
+vn 0.273200 0.037200 -0.961200
+vn 0.222000 0.057600 -0.973300
+vn 0.214100 0.089300 -0.972700
+vn 0.178700 0.048300 -0.982700
+vn 0.172400 0.080400 -0.981700
+vn 0.229600 0.025700 -0.972900
+vn 0.184900 0.016200 -0.982600
+vn 0.206100 0.120900 -0.971000
+vn 0.165900 0.112400 -0.979700
+vn 0.086900 0.068500 -0.993800
+vn 0.083700 0.101000 -0.991300
+vn 0.124900 0.105700 -0.986500
+vn 0.129900 0.073500 -0.988800
+vn 0.134600 0.041200 -0.990000
+vn 0.090200 0.036000 -0.995300
+vn 0.139300 0.008800 -0.990200
+vn 0.093200 0.003400 -0.995600
+vn 0.045300 0.032900 -0.998400
+vn 0.043700 0.065600 -0.996900
+vn 0.000000 0.031900 -0.999500
+vn 0.000000 0.064500 -0.997900
+vn 0.046800 0.000200 -0.998900
+vn 0.000000 -0.000800 -1.000000
+vn 0.042000 0.098100 -0.994300
+vn 0.000000 0.097100 -0.995200
+vn -0.086900 0.068500 -0.993800
+vn -0.083700 0.101000 -0.991300
+vn -0.042000 0.098100 -0.994300
+vn -0.043700 0.065600 -0.996900
+vn -0.045300 0.032900 -0.998400
+vn -0.090200 0.036000 -0.995300
+vn -0.046800 0.000200 -0.998900
+vn -0.093200 0.003400 -0.995600
+vn -0.134600 0.041200 -0.990000
+vn -0.129900 0.073500 -0.988800
+vn -0.178700 0.048300 -0.982700
+vn -0.172400 0.080400 -0.981700
+vn -0.139300 0.008800 -0.990200
+vn -0.184900 0.016200 -0.982600
+vn -0.124900 0.105700 -0.986500
+vn -0.165900 0.112400 -0.979700
+vn -0.254800 0.100000 -0.961800
+vn -0.245200 0.131300 -0.960500
+vn -0.206100 0.120900 -0.971000
+vn -0.214100 0.089300 -0.972700
+vn -0.222000 0.057600 -0.973300
+vn -0.264100 0.068700 -0.962000
+vn -0.229600 0.025700 -0.972900
+vn -0.273200 0.037200 -0.961200
+vn -0.305100 0.081700 -0.948800
+vn -0.294400 0.112600 -0.949000
+vn -0.345000 0.096600 -0.933600
+vn -0.332800 0.126900 -0.934400
+vn -0.315600 0.050700 -0.947500
+vn -0.356800 0.066100 -0.931800
+vn -0.283300 0.143300 -0.948200
+vn -0.320200 0.157200 -0.934200
+vn -0.405000 0.160700 -0.900100
+vn -0.389700 0.189700 -0.901200
+vn -0.355800 0.172600 -0.918500
+vn -0.369800 0.143000 -0.918000
+vn -0.383300 0.113300 -0.916600
+vn -0.419800 0.131600 -0.898000
+vn -0.396400 0.083400 -0.914200
+vn -0.434200 0.102400 -0.895000
+vn -0.454500 0.151600 -0.877700
+vn -0.438400 0.180000 -0.880500
+vn -0.487300 0.173200 -0.855900
+vn -0.470100 0.200800 -0.859400
+vn -0.470000 0.123000 -0.874000
+vn -0.504000 0.145400 -0.851400
+vn -0.421900 0.208200 -0.882400
+vn -0.452500 0.228200 -0.862100
+vn -0.527200 0.246500 -0.813200
+vn -0.507400 0.272200 -0.817600
+vn -0.481000 0.249600 -0.840400
+vn -0.499800 0.223100 -0.836900
+vn -0.518100 0.196200 -0.832500
+vn -0.546400 0.220500 -0.807900
+vn -0.535800 0.169200 -0.827200
+vn -0.565100 0.194300 -0.801800
+vn -0.572500 0.246100 -0.782100
+vn -0.552300 0.271100 -0.788300
+vn -0.596200 0.272900 -0.755000
+vn -0.575200 0.296900 -0.762200
+vn -0.592000 0.220800 -0.775100
+vn -0.616500 0.248500 -0.747100
+vn -0.531600 0.295900 -0.793600
+vn -0.553600 0.320700 -0.768500
+vn -0.613400 0.351400 -0.707300
+vn -0.590400 0.373100 -0.715700
+vn -0.573300 0.346600 -0.742500
+vn -0.595600 0.323800 -0.735100
+vn -0.617300 0.300700 -0.727000
+vn -0.635700 0.329300 -0.698100
+vn -0.638400 0.277200 -0.718100
+vn -0.657400 0.306800 -0.688300
+vn -0.651400 0.358700 -0.668600
+vn -0.628500 0.379700 -0.678800
+vn -0.664400 0.388800 -0.638200
+vn -0.641100 0.408900 -0.649500
+vn -0.673600 0.337200 -0.657600
+vn -0.687000 0.368400 -0.626300
+vn -0.605000 0.400400 -0.688200
+vn -0.617100 0.428400 -0.660100
+vn -0.657900 0.468400 -0.589700
+vn -0.633200 0.485700 -0.602500
+vn -0.626500 0.457000 -0.631400
+vn -0.650900 0.438500 -0.619700
+vn -0.674600 0.419500 -0.607400
+vn -0.681800 0.450500 -0.576300
+vn -0.697500 0.400200 -0.594400
+vn -0.705000 0.432200 -0.562200
+vn -0.686200 0.481800 -0.544900
+vn -0.662100 0.498600 -0.559500
+vn -0.687600 0.513400 -0.513400
+vn -0.663500 0.529000 -0.529000
+vn -0.709500 0.464600 -0.529800
+vn -0.711000 0.497200 -0.497200
+vn -0.637300 0.514800 -0.573400
+vn -0.638600 0.544100 -0.544100
+vn -0.657900 0.589700 -0.468400
+vn -0.633200 0.602500 -0.485700
+vn -0.637300 0.573400 -0.514800
+vn -0.662100 0.559500 -0.498600
+vn -0.686200 0.544900 -0.481800
+vn -0.681800 0.576300 -0.450500
+vn -0.709500 0.529800 -0.464600
+vn -0.705000 0.562200 -0.432200
+vn -0.674600 0.607400 -0.419500
+vn -0.650900 0.619700 -0.438500
+vn -0.664400 0.638200 -0.388800
+vn -0.641100 0.649500 -0.408900
+vn -0.697500 0.594400 -0.400200
+vn -0.687000 0.626300 -0.368400
+vn -0.626500 0.631400 -0.457000
+vn -0.617100 0.660100 -0.428400
+vn -0.613400 0.707300 -0.351400
+vn -0.590400 0.715700 -0.373100
+vn -0.605000 0.688200 -0.400400
+vn -0.628500 0.678800 -0.379700
+vn -0.651400 0.668600 -0.358700
+vn -0.635700 0.698100 -0.329300
+vn -0.673600 0.657600 -0.337200
+vn -0.657400 0.688300 -0.306800
+vn -0.617300 0.727000 -0.300700
+vn -0.595600 0.735100 -0.323800
+vn -0.596200 0.755000 -0.272900
+vn -0.575200 0.762200 -0.296900
+vn -0.638400 0.718100 -0.277200
+vn -0.616500 0.747100 -0.248500
+vn -0.573300 0.742500 -0.346600
+vn -0.553600 0.768500 -0.320700
+vn -0.527200 0.813200 -0.246500
+vn -0.507400 0.817600 -0.272200
+vn -0.531600 0.793600 -0.295900
+vn -0.552400 0.788300 -0.271100
+vn -0.572500 0.782100 -0.246100
+vn -0.546400 0.807900 -0.220500
+vn -0.592000 0.775100 -0.220800
+vn -0.565100 0.801800 -0.194300
+vn -0.518100 0.832500 -0.196200
+vn -0.499800 0.836900 -0.223000
+vn -0.487300 0.855900 -0.173200
+vn -0.470100 0.859400 -0.200800
+vn -0.535800 0.827200 -0.169200
+vn -0.504000 0.851400 -0.145400
+vn -0.481000 0.840400 -0.249600
+vn -0.452500 0.862100 -0.228200
+vn -0.405000 0.900100 -0.160700
+vn -0.389700 0.901200 -0.189700
+vn -0.421900 0.882400 -0.208200
+vn -0.438400 0.880500 -0.180000
+vn -0.454500 0.877700 -0.151600
+vn -0.419800 0.898000 -0.131600
+vn -0.470000 0.874000 -0.123000
+vn -0.434200 0.895000 -0.102400
+vn -0.383300 0.916600 -0.113300
+vn -0.369800 0.918000 -0.143000
+vn -0.345000 0.933600 -0.096600
+vn -0.332800 0.934400 -0.126900
+vn -0.396400 0.914200 -0.083400
+vn -0.356800 0.931800 -0.066100
+vn -0.355800 0.918500 -0.172600
+vn -0.320200 0.934200 -0.157200
+vn -0.254800 0.961800 -0.100000
+vn -0.245200 0.960500 -0.131300
+vn -0.283300 0.948200 -0.143300
+vn -0.294400 0.949000 -0.112600
+vn -0.305100 0.948800 -0.081700
+vn -0.264100 0.962000 -0.068700
+vn -0.315600 0.947500 -0.050700
+vn -0.273200 0.961200 -0.037200
+vn -0.222000 0.973300 -0.057600
+vn -0.214100 0.972700 -0.089300
+vn -0.178700 0.982700 -0.048300
+vn -0.172400 0.981700 -0.080400
+vn -0.229600 0.972900 -0.025700
+vn -0.184900 0.982600 -0.016200
+vn -0.206100 0.971000 -0.120900
+vn -0.165900 0.979700 -0.112400
+vn -0.086900 0.993800 -0.068500
+vn -0.083700 0.991300 -0.101000
+vn -0.124900 0.986500 -0.105700
+vn -0.129900 0.988800 -0.073500
+vn -0.134600 0.990000 -0.041200
+vn -0.090200 0.995300 -0.036000
+vn -0.139300 0.990200 -0.008800
+vn -0.093200 0.995600 -0.003400
+vn -0.045300 0.998400 -0.032900
+vn -0.043600 0.996900 -0.065600
+vn 0.000000 0.999500 -0.031900
+vn 0.000000 0.997900 -0.064500
+vn -0.046800 0.998900 -0.000200
+vn 0.000000 1.000000 0.000800
+vn -0.042000 0.994300 -0.098100
+vn 0.000000 0.995200 -0.097100
+vn 0.086900 0.993800 -0.068500
+vn 0.083700 0.991300 -0.101000
+vn 0.042000 0.994300 -0.098100
+vn 0.043600 0.996900 -0.065600
+vn 0.045300 0.998400 -0.032900
+vn 0.090200 0.995300 -0.036000
+vn 0.046800 0.998900 -0.000200
+vn 0.093200 0.995600 -0.003400
+vn 0.134600 0.990000 -0.041200
+vn 0.129900 0.988800 -0.073500
+vn 0.178700 0.982700 -0.048300
+vn 0.172400 0.981700 -0.080400
+vn 0.139300 0.990200 -0.008800
+vn 0.184900 0.982600 -0.016200
+vn 0.124900 0.986500 -0.105700
+vn 0.165900 0.979700 -0.112400
+vn 0.254800 0.961800 -0.100000
+vn 0.245200 0.960500 -0.131300
+vn 0.206100 0.971000 -0.120900
+vn 0.214100 0.972700 -0.089300
+vn 0.222000 0.973300 -0.057600
+vn 0.264100 0.962000 -0.068700
+vn 0.229600 0.972900 -0.025700
+vn 0.273200 0.961200 -0.037200
+vn 0.305100 0.948800 -0.081700
+vn 0.294400 0.949000 -0.112600
+vn 0.345000 0.933600 -0.096600
+vn 0.332800 0.934400 -0.126900
+vn 0.315600 0.947500 -0.050700
+vn 0.356800 0.931800 -0.066100
+vn 0.283300 0.948200 -0.143300
+vn 0.320200 0.934200 -0.157200
+vn 0.405000 0.900100 -0.160700
+vn 0.389700 0.901200 -0.189700
+vn 0.355800 0.918500 -0.172600
+vn 0.369800 0.918000 -0.143000
+vn 0.383300 0.916600 -0.113300
+vn 0.419800 0.898000 -0.131600
+vn 0.396400 0.914200 -0.083400
+vn 0.434200 0.895000 -0.102400
+vn 0.454500 0.877700 -0.151600
+vn 0.438400 0.880500 -0.180000
+vn 0.487300 0.855900 -0.173200
+vn 0.470100 0.859400 -0.200800
+vn 0.470000 0.874000 -0.123000
+vn 0.504000 0.851400 -0.145400
+vn 0.421900 0.882400 -0.208200
+vn 0.452500 0.862100 -0.228200
+vn 0.527200 0.813200 -0.246500
+vn 0.507400 0.817600 -0.272200
+vn 0.481000 0.840400 -0.249600
+vn 0.499800 0.836900 -0.223100
+vn 0.518100 0.832500 -0.196200
+vn 0.546400 0.807900 -0.220500
+vn 0.535800 0.827200 -0.169200
+vn 0.565100 0.801800 -0.194300
+vn 0.572500 0.782100 -0.246100
+vn 0.552300 0.788300 -0.271100
+vn 0.596200 0.755000 -0.272900
+vn 0.575200 0.762200 -0.296900
+vn 0.592000 0.775100 -0.220800
+vn 0.616500 0.747100 -0.248500
+vn 0.531600 0.793600 -0.295900
+vn 0.553600 0.768500 -0.320700
+vn 0.613400 0.707300 -0.351400
+vn 0.590400 0.715700 -0.373100
+vn 0.573300 0.742500 -0.346600
+vn 0.595600 0.735100 -0.323800
+vn 0.617300 0.727000 -0.300700
+vn 0.635700 0.698100 -0.329300
+vn 0.638400 0.718100 -0.277200
+vn 0.657400 0.688300 -0.306800
+vn 0.651400 0.668600 -0.358700
+vn 0.628500 0.678800 -0.379700
+vn 0.664400 0.638200 -0.388800
+vn 0.641100 0.649500 -0.408900
+vn 0.673600 0.657600 -0.337200
+vn 0.687000 0.626300 -0.368400
+vn 0.605000 0.688200 -0.400400
+vn 0.617100 0.660100 -0.428400
+vn 0.657900 0.589700 -0.468400
+vn 0.633200 0.602500 -0.485700
+vn 0.626500 0.631400 -0.457000
+vn 0.650900 0.619700 -0.438500
+vn 0.674600 0.607400 -0.419500
+vn 0.681800 0.576300 -0.450500
+vn 0.697500 0.594400 -0.400200
+vn 0.705000 0.562200 -0.432200
+vn 0.686200 0.544900 -0.481800
+vn 0.662100 0.559500 -0.498600
+vn 0.687600 0.513400 -0.513400
+vn 0.663500 0.529000 -0.529000
+vn 0.709500 0.529800 -0.464600
+vn 0.711000 0.497200 -0.497200
+vn 0.637300 0.573400 -0.514800
+vn 0.638600 0.544100 -0.544100
+vn 0.657900 0.468400 -0.589700
+vn 0.633200 0.485700 -0.602500
+vn 0.637300 0.514800 -0.573400
+vn 0.662100 0.498600 -0.559500
+vn 0.686200 0.481800 -0.545000
+vn 0.681800 0.450500 -0.576300
+vn 0.709500 0.464600 -0.529800
+vn 0.705000 0.432200 -0.562200
+vn 0.674600 0.419500 -0.607400
+vn 0.650900 0.438500 -0.619700
+vn 0.697500 0.400200 -0.594400
+vn 0.626500 0.457000 -0.631400
+vn 0.698500 0.261000 -0.666300
+vn 0.678300 0.284000 -0.677600
+vn 0.695100 0.315400 -0.646000
+vn 0.715700 0.293300 -0.633800
+vn 0.708900 0.347600 -0.613700
+vn 0.730000 0.326400 -0.600500
+vn 0.735600 0.270900 -0.620800
+vn 0.717900 0.237700 -0.654300
+vn 0.754800 0.248100 -0.607200
+vn 0.736600 0.214100 -0.641500
+vn 0.750300 0.304900 -0.586600
+vn 0.769800 0.283100 -0.572100
+vn 0.697200 0.205400 -0.686800
+vn 0.678300 0.229500 -0.698000
+vn 0.673400 0.173900 -0.718500
+vn 0.655100 0.199000 -0.728800
+vn 0.715300 0.180900 -0.674900
+vn 0.690900 0.148700 -0.707400
+vn 0.658700 0.253500 -0.708400
+vn 0.636200 0.223800 -0.738300
+vn 0.600500 0.141400 -0.787000
+vn 0.583100 0.167900 -0.794800
+vn 0.610900 0.195200 -0.767200
+vn 0.629100 0.169500 -0.758600
+vn 0.646700 0.143700 -0.749100
+vn 0.617300 0.114700 -0.778300
+vn 0.663500 0.117600 -0.738900
+vn 0.633400 0.088000 -0.768800
+vn 0.585300 0.087300 -0.806100
+vn 0.569400 0.114700 -0.814000
+vn 0.550600 0.061200 -0.832500
+vn 0.535600 0.089400 -0.839700
+vn 0.600500 0.059800 -0.797300
+vn 0.565000 0.033000 -0.824400
+vn 0.552900 0.142000 -0.821000
+vn 0.520100 0.117400 -0.846000
+vn 0.461400 0.043600 -0.886100
+vn 0.448000 0.073000 -0.891000
+vn 0.485000 0.094300 -0.869400
+vn 0.499600 0.065600 -0.863800
+vn 0.513500 0.036800 -0.857300
+vn 0.474300 0.014200 -0.880200
+vn 0.526900 0.007900 -0.849800
+vn 0.486800 -0.015300 -0.873400
+vn 0.433100 -0.006500 -0.901300
+vn 0.421400 0.023400 -0.906600
+vn 0.389900 -0.025500 -0.920500
+vn 0.379300 0.005000 -0.925300
+vn 0.444500 -0.036600 -0.895000
+vn 0.400100 -0.056000 -0.914700
+vn 0.409100 0.053400 -0.910900
+vn 0.368200 0.035600 -0.929000
+vn 0.290400 -0.025700 -0.956500
+vn 0.282000 0.005700 -0.959400
+vn 0.325700 0.019600 -0.945200
+vn 0.335500 -0.011400 -0.942000
+vn 0.344900 -0.042400 -0.937700
+vn 0.298600 -0.057100 -0.952700
+vn 0.353900 -0.073300 -0.932400
+vn 0.306400 -0.088500 -0.947800
+vn 0.251000 -0.069700 -0.965500
+vn 0.244100 -0.037900 -0.969000
+vn 0.202000 -0.080100 -0.976100
+vn 0.196500 -0.048000 -0.979300
+vn 0.257500 -0.101400 -0.960900
+vn 0.207300 -0.112100 -0.971800
+vn 0.237000 -0.006100 -0.971500
+vn 0.190800 -0.015900 -0.981500
+vn 0.099100 -0.061600 -0.993100
+vn 0.096200 -0.029100 -0.994900
+vn 0.143700 -0.023600 -0.989300
+vn 0.148000 -0.056000 -0.987400
+vn 0.152200 -0.088300 -0.984400
+vn 0.101900 -0.094100 -0.990300
+vn 0.156200 -0.120500 -0.980300
+vn 0.104600 -0.126500 -0.986400
+vn 0.051200 -0.097600 -0.993900
+vn 0.049800 -0.065100 -0.996600
+vn 0.000000 -0.098800 -0.995100
+vn 0.000000 -0.066200 -0.997800
+vn 0.052500 -0.130100 -0.990100
+vn 0.000000 -0.131300 -0.991300
+vn 0.048300 -0.032400 -0.998300
+vn 0.000000 -0.033500 -0.999400
+vn -0.099100 -0.061600 -0.993100
+vn -0.096200 -0.029100 -0.994900
+vn -0.048300 -0.032400 -0.998300
+vn -0.049800 -0.065100 -0.996600
+vn -0.051200 -0.097600 -0.993900
+vn -0.101900 -0.094100 -0.990300
+vn -0.052500 -0.130100 -0.990100
+vn -0.104600 -0.126500 -0.986400
+vn -0.152200 -0.088300 -0.984400
+vn -0.148000 -0.056000 -0.987400
+vn -0.202000 -0.080100 -0.976100
+vn -0.196500 -0.048000 -0.979300
+vn -0.156200 -0.120500 -0.980300
+vn -0.207300 -0.112100 -0.971800
+vn -0.143700 -0.023600 -0.989300
+vn -0.190800 -0.015900 -0.981500
+vn -0.290400 -0.025700 -0.956500
+vn -0.282000 0.005700 -0.959400
+vn -0.237000 -0.006100 -0.971500
+vn -0.244100 -0.037900 -0.969000
+vn -0.251000 -0.069700 -0.965500
+vn -0.298600 -0.057100 -0.952700
+vn -0.257500 -0.101400 -0.960900
+vn -0.306400 -0.088500 -0.947800
+vn -0.344900 -0.042400 -0.937700
+vn -0.335500 -0.011400 -0.942000
+vn -0.389900 -0.025500 -0.920500
+vn -0.379300 0.005000 -0.925300
+vn -0.353900 -0.073300 -0.932400
+vn -0.400100 -0.056000 -0.914700
+vn -0.325700 0.019600 -0.945200
+vn -0.368200 0.035600 -0.929000
+vn -0.461400 0.043600 -0.886100
+vn -0.448000 0.073000 -0.891000
+vn -0.409100 0.053400 -0.910900
+vn -0.421400 0.023400 -0.906600
+vn -0.433100 -0.006600 -0.901300
+vn -0.474300 0.014200 -0.880200
+vn -0.444500 -0.036600 -0.895000
+vn -0.486800 -0.015300 -0.873400
+vn -0.513500 0.036800 -0.857300
+vn -0.499600 0.065600 -0.863800
+vn -0.550600 0.061200 -0.832500
+vn -0.535600 0.089400 -0.839700
+vn -0.526900 0.007900 -0.849800
+vn -0.565000 0.033000 -0.824400
+vn -0.485100 0.094300 -0.869400
+vn -0.520100 0.117400 -0.846000
+vn -0.600500 0.141400 -0.787000
+vn -0.583100 0.167900 -0.794800
+vn -0.552900 0.142000 -0.821000
+vn -0.569400 0.114700 -0.814000
+vn -0.585300 0.087300 -0.806100
+vn -0.617300 0.114700 -0.778300
+vn -0.600500 0.059800 -0.797300
+vn -0.633400 0.088000 -0.768800
+vn -0.646700 0.143700 -0.749100
+vn -0.629100 0.169500 -0.758600
+vn -0.673400 0.173900 -0.718500
+vn -0.655100 0.199000 -0.728800
+vn -0.663500 0.117600 -0.738900
+vn -0.690900 0.148700 -0.707400
+vn -0.610900 0.195200 -0.767200
+vn -0.636200 0.223800 -0.738300
+vn -0.698500 0.261000 -0.666300
+vn -0.678300 0.284000 -0.677600
+vn -0.658700 0.253500 -0.708400
+vn -0.678300 0.229500 -0.698000
+vn -0.697200 0.205400 -0.686800
+vn -0.717900 0.237700 -0.654300
+vn -0.715300 0.180900 -0.674900
+vn -0.736600 0.214100 -0.641500
+vn -0.735600 0.270900 -0.620800
+vn -0.715700 0.293300 -0.633800
+vn -0.750300 0.304900 -0.586600
+vn -0.730000 0.326400 -0.600500
+vn -0.754800 0.248100 -0.607200
+vn -0.769800 0.283100 -0.572100
+vn -0.695100 0.315400 -0.646000
+vn -0.708900 0.347600 -0.613700
+vn -0.749100 0.394200 -0.532400
+vn -0.727400 0.413400 -0.547600
+vn -0.719700 0.380400 -0.580800
+vn -0.741100 0.360200 -0.566500
+vn -0.761700 0.339600 -0.551700
+vn -0.769900 0.374600 -0.516600
+vn -0.781500 0.318700 -0.536300
+vn -0.789800 0.354600 -0.500300
+vn -0.774800 0.410000 -0.481200
+vn -0.753800 0.428600 -0.498000
+vn -0.776400 0.445600 -0.445600
+vn -0.755500 0.463300 -0.463300
+vn -0.794900 0.390900 -0.464000
+vn -0.796600 0.427400 -0.427400
+vn -0.732100 0.446800 -0.514100
+vn -0.733700 0.480500 -0.480500
+vn -0.749100 0.532400 -0.394200
+vn -0.727400 0.547600 -0.413400
+vn -0.732100 0.514100 -0.446800
+vn -0.753800 0.498000 -0.428600
+vn -0.774800 0.481200 -0.410000
+vn -0.769900 0.516600 -0.374600
+vn -0.794900 0.464000 -0.390900
+vn -0.789800 0.500300 -0.354600
+vn -0.761700 0.551700 -0.339600
+vn -0.741100 0.566500 -0.360200
+vn -0.750300 0.586600 -0.304900
+vn -0.730000 0.600500 -0.326400
+vn -0.781500 0.536300 -0.318700
+vn -0.769800 0.572100 -0.283100
+vn -0.719700 0.580800 -0.380400
+vn -0.708900 0.613700 -0.347600
+vn -0.698500 0.666300 -0.261000
+vn -0.678300 0.677600 -0.284000
+vn -0.695100 0.646000 -0.315400
+vn -0.715700 0.633800 -0.293300
+vn -0.735600 0.620800 -0.270900
+vn -0.717900 0.654300 -0.237700
+vn -0.754800 0.607200 -0.248100
+vn -0.736600 0.641500 -0.214100
+vn -0.697200 0.686800 -0.205400
+vn -0.678300 0.698000 -0.229500
+vn -0.673400 0.718500 -0.173900
+vn -0.655100 0.728800 -0.199000
+vn -0.715300 0.674900 -0.180900
+vn -0.690900 0.707400 -0.148700
+vn -0.658700 0.708400 -0.253500
+vn -0.636200 0.738300 -0.223800
+vn -0.600500 0.787000 -0.141400
+vn -0.583100 0.794800 -0.167900
+vn -0.610900 0.767200 -0.195200
+vn -0.629100 0.758600 -0.169500
+vn -0.646700 0.749100 -0.143700
+vn -0.617300 0.778300 -0.114700
+vn -0.663500 0.738900 -0.117600
+vn -0.633400 0.768800 -0.088000
+vn -0.585300 0.806100 -0.087300
+vn -0.569400 0.814000 -0.114700
+vn -0.550600 0.832500 -0.061200
+vn -0.535600 0.839700 -0.089400
+vn -0.600500 0.797300 -0.059800
+vn -0.565000 0.824400 -0.033000
+vn -0.552900 0.821000 -0.142000
+vn -0.520100 0.846000 -0.117400
+vn -0.461400 0.886100 -0.043600
+vn -0.448000 0.891000 -0.073000
+vn -0.485100 0.869400 -0.094300
+vn -0.499600 0.863800 -0.065600
+vn -0.513500 0.857300 -0.036800
+vn -0.474300 0.880200 -0.014200
+vn -0.526900 0.849800 -0.007900
+vn -0.486800 0.873400 0.015300
+vn -0.433100 0.901300 0.006600
+vn -0.421400 0.906600 -0.023400
+vn -0.389900 0.920500 0.025500
+vn -0.379300 0.925300 -0.005000
+vn -0.444500 0.895000 0.036600
+vn -0.400100 0.914700 0.056000
+vn -0.409100 0.910900 -0.053400
+vn -0.368200 0.929000 -0.035600
+vn -0.290400 0.956500 0.025700
+vn -0.282000 0.959400 -0.005700
+vn -0.325700 0.945200 -0.019600
+vn -0.335500 0.942000 0.011400
+vn -0.344900 0.937700 0.042400
+vn -0.298600 0.952700 0.057100
+vn -0.353900 0.932400 0.073300
+vn -0.306400 0.947800 0.088500
+vn -0.251000 0.965500 0.069700
+vn -0.244100 0.969000 0.037900
+vn -0.202000 0.976100 0.080100
+vn -0.196500 0.979300 0.048000
+vn -0.257500 0.960900 0.101400
+vn -0.207300 0.971800 0.112100
+vn -0.237000 0.971500 0.006100
+vn -0.190800 0.981500 0.015900
+vn -0.099100 0.993100 0.061600
+vn -0.096200 0.994900 0.029100
+vn -0.143700 0.989300 0.023600
+vn -0.148000 0.987400 0.056000
+vn -0.152200 0.984400 0.088300
+vn -0.101900 0.990300 0.094100
+vn -0.156200 0.980300 0.120500
+vn -0.104600 0.986400 0.126500
+vn -0.051200 0.993900 0.097600
+vn -0.049800 0.996600 0.065100
+vn 0.000000 0.995100 0.098800
+vn 0.000000 0.997800 0.066200
+vn -0.052500 0.990100 0.130100
+vn 0.000000 0.991300 0.131300
+vn -0.048300 0.998300 0.032400
+vn 0.000000 0.999400 0.033500
+vn 0.099100 0.993100 0.061600
+vn 0.096200 0.994900 0.029100
+vn 0.048300 0.998300 0.032400
+vn 0.049800 0.996600 0.065100
+vn 0.051200 0.993900 0.097600
+vn 0.101900 0.990300 0.094100
+vn 0.052500 0.990100 0.130100
+vn 0.104600 0.986400 0.126500
+vn 0.152200 0.984400 0.088300
+vn 0.148000 0.987400 0.056000
+vn 0.202000 0.976100 0.080100
+vn 0.196500 0.979300 0.048000
+vn 0.156200 0.980300 0.120500
+vn 0.207300 0.971800 0.112100
+vn 0.143700 0.989300 0.023600
+vn 0.190800 0.981500 0.015900
+vn 0.290400 0.956500 0.025700
+vn 0.282000 0.959400 -0.005700
+vn 0.237000 0.971500 0.006100
+vn 0.244100 0.969000 0.037900
+vn 0.251000 0.965500 0.069700
+vn 0.298600 0.952700 0.057100
+vn 0.257500 0.960900 0.101400
+vn 0.306400 0.947800 0.088500
+vn 0.344900 0.937700 0.042400
+vn 0.335500 0.942000 0.011400
+vn 0.389900 0.920500 0.025500
+vn 0.379300 0.925300 -0.005000
+vn 0.353900 0.932400 0.073300
+vn 0.400100 0.914700 0.056000
+vn 0.325700 0.945200 -0.019600
+vn 0.368200 0.929000 -0.035600
+vn 0.461400 0.886100 -0.043600
+vn 0.448000 0.891000 -0.073000
+vn 0.409100 0.910900 -0.053400
+vn 0.421400 0.906600 -0.023400
+vn 0.433100 0.901300 0.006500
+vn 0.474300 0.880200 -0.014200
+vn 0.444500 0.895000 0.036600
+vn 0.486800 0.873400 0.015300
+vn 0.513500 0.857300 -0.036800
+vn 0.499600 0.863800 -0.065600
+vn 0.550600 0.832500 -0.061200
+vn 0.535600 0.839700 -0.089400
+vn 0.526900 0.849800 -0.007900
+vn 0.565000 0.824400 -0.033000
+vn 0.485100 0.869400 -0.094300
+vn 0.520100 0.846000 -0.117400
+vn 0.600500 0.787000 -0.141400
+vn 0.583100 0.794800 -0.167900
+vn 0.552900 0.821000 -0.142000
+vn 0.569400 0.814000 -0.114700
+vn 0.585300 0.806100 -0.087300
+vn 0.617300 0.778300 -0.114700
+vn 0.600500 0.797300 -0.059800
+vn 0.633400 0.768800 -0.088000
+vn 0.646700 0.749100 -0.143700
+vn 0.629100 0.758600 -0.169500
+vn 0.673400 0.718500 -0.173900
+vn 0.655100 0.728800 -0.199000
+vn 0.663500 0.738900 -0.117600
+vn 0.690900 0.707400 -0.148700
+vn 0.610900 0.767200 -0.195200
+vn 0.636200 0.738300 -0.223800
+vn 0.698500 0.666300 -0.261000
+vn 0.678300 0.677600 -0.284000
+vn 0.658700 0.708400 -0.253500
+vn 0.678300 0.698000 -0.229600
+vn 0.697200 0.686800 -0.205400
+vn 0.717900 0.654300 -0.237700
+vn 0.715300 0.674900 -0.180900
+vn 0.736600 0.641500 -0.214100
+vn 0.735600 0.620800 -0.270900
+vn 0.715700 0.633800 -0.293300
+vn 0.750300 0.586600 -0.304900
+vn 0.730000 0.600500 -0.326400
+vn 0.754800 0.607200 -0.248100
+vn 0.769800 0.572100 -0.283100
+vn 0.695100 0.646000 -0.315400
+vn 0.708900 0.613700 -0.347600
+vn 0.749100 0.532400 -0.394200
+vn 0.727400 0.547600 -0.413400
+vn 0.719700 0.580800 -0.380400
+vn 0.741100 0.566500 -0.360200
+vn 0.761700 0.551700 -0.339600
+vn 0.769900 0.516600 -0.374600
+vn 0.781500 0.536300 -0.318700
+vn 0.789800 0.500300 -0.354600
+vn 0.774800 0.481200 -0.410000
+vn 0.753800 0.498000 -0.428600
+vn 0.776400 0.445600 -0.445600
+vn 0.755500 0.463300 -0.463300
+vn 0.794900 0.464000 -0.390900
+vn 0.796600 0.427400 -0.427400
+vn 0.732100 0.514100 -0.446800
+vn 0.733700 0.480500 -0.480500
+vn 0.749100 0.394200 -0.532400
+vn 0.727400 0.413400 -0.547600
+vn 0.732100 0.446800 -0.514100
+vn 0.753800 0.428600 -0.498000
+vn 0.774800 0.410000 -0.481200
+vn 0.769900 0.374600 -0.516600
+vn 0.794900 0.390900 -0.464000
+vn 0.789800 0.354600 -0.500300
+vn 0.761700 0.339600 -0.551700
+vn 0.741100 0.360200 -0.566500
+vn 0.781500 0.318700 -0.536300
+vn 0.719700 0.380400 -0.580800
+vn 0.771500 0.166400 -0.614000
+vn 0.754500 0.190300 -0.628100
+vn 0.773100 0.225200 -0.593000
+vn 0.790500 0.202000 -0.578100
+vn 0.788400 0.261000 -0.557000
+vn 0.806200 0.238700 -0.541300
+vn 0.807100 0.178700 -0.562700
+vn 0.787700 0.142200 -0.599300
+vn 0.822900 0.155100 -0.546600
+vn 0.803100 0.118000 -0.584000
+vn 0.823100 0.216100 -0.525100
+vn 0.839200 0.193300 -0.508300
+vn 0.765000 0.106800 -0.635100
+vn 0.749300 0.131600 -0.649000
+vn 0.738900 0.072200 -0.669900
+vn 0.723700 0.097800 -0.683100
+vn 0.780000 0.081800 -0.620400
+vn 0.753400 0.046600 -0.655900
+vn 0.732700 0.156300 -0.662300
+vn 0.707700 0.123300 -0.695600
+vn 0.663500 0.034200 -0.747400
+vn 0.648800 0.061100 -0.758500
+vn 0.679600 0.091400 -0.727800
+vn 0.695000 0.065200 -0.716000
+vn 0.709700 0.039000 -0.703400
+vn 0.677500 0.007200 -0.735500
+vn 0.723600 0.012600 -0.690100
+vn 0.690800 -0.019700 -0.722800
+vn 0.642400 -0.022900 -0.766000
+vn 0.629100 0.004600 -0.777300
+vn 0.604400 -0.051600 -0.795000
+vn 0.591900 -0.023400 -0.805700
+vn 0.655000 -0.050500 -0.753900
+vn 0.616200 -0.079700 -0.783500
+vn 0.615200 0.032200 -0.787700
+vn 0.578700 0.004800 -0.815500
+vn 0.510000 -0.074100 -0.857000
+vn 0.498600 -0.044700 -0.865600
+vn 0.539800 -0.020900 -0.841500
+vn 0.552000 -0.049700 -0.832300
+vn 0.563700 -0.078500 -0.822200
+vn 0.520800 -0.103300 -0.847400
+vn 0.574800 -0.107200 -0.811200
+vn 0.531000 -0.132500 -0.836900
+vn 0.475600 -0.126200 -0.870500
+vn 0.465700 -0.096400 -0.879600
+vn 0.428100 -0.147000 -0.891700
+vn 0.419200 -0.116800 -0.900300
+vn 0.484900 -0.155800 -0.860500
+vn 0.436500 -0.177100 -0.882100
+vn 0.455400 -0.066600 -0.887800
+vn 0.409900 -0.086500 -0.908000
+vn 0.321100 -0.150900 -0.934900
+vn 0.313900 -0.119800 -0.941900
+vn 0.362600 -0.104300 -0.926100
+vn 0.370800 -0.135000 -0.918800
+vn 0.378700 -0.165600 -0.910600
+vn 0.327900 -0.181800 -0.927000
+vn 0.386200 -0.196100 -0.901300
+vn 0.334400 -0.212600 -0.918100
+vn 0.275600 -0.195700 -0.941100
+vn 0.269900 -0.164400 -0.948700
+vn 0.221900 -0.207200 -0.952800
+vn 0.217300 -0.175700 -0.960100
+vn 0.281000 -0.226800 -0.932500
+vn 0.226300 -0.238500 -0.944400
+vn 0.263900 -0.133000 -0.955300
+vn 0.212400 -0.144000 -0.966500
+vn 0.109600 -0.190700 -0.975500
+vn 0.107200 -0.158700 -0.981500
+vn 0.160000 -0.152600 -0.975200
+vn 0.163700 -0.184500 -0.969100
+vn 0.167100 -0.216200 -0.961900
+vn 0.111900 -0.222600 -0.968400
+vn 0.170400 -0.247600 -0.953700
+vn 0.114100 -0.254200 -0.960400
+vn 0.056200 -0.226400 -0.972400
+vn 0.055000 -0.194500 -0.979300
+vn 0.000000 -0.227700 -0.973700
+vn 0.000000 -0.195800 -0.980600
+vn 0.057300 -0.258100 -0.964400
+vn 0.000000 -0.259500 -0.965700
+vn 0.053800 -0.162400 -0.985200
+vn 0.000000 -0.163600 -0.986500
+vn -0.109600 -0.190700 -0.975500
+vn -0.107200 -0.158700 -0.981500
+vn -0.053800 -0.162400 -0.985200
+vn -0.055000 -0.194500 -0.979300
+vn -0.056200 -0.226400 -0.972400
+vn -0.111900 -0.222600 -0.968400
+vn -0.057300 -0.258200 -0.964400
+vn -0.114100 -0.254200 -0.960400
+vn -0.167100 -0.216200 -0.961900
+vn -0.163700 -0.184500 -0.969100
+vn -0.221900 -0.207200 -0.952800
+vn -0.217300 -0.175700 -0.960100
+vn -0.170400 -0.247700 -0.953700
+vn -0.226300 -0.238500 -0.944400
+vn -0.160000 -0.152600 -0.975200
+vn -0.212400 -0.144000 -0.966500
+vn -0.321100 -0.150900 -0.934900
+vn -0.313900 -0.119800 -0.941900
+vn -0.263900 -0.133000 -0.955300
+vn -0.269900 -0.164400 -0.948700
+vn -0.275600 -0.195700 -0.941100
+vn -0.327900 -0.181800 -0.927000
+vn -0.281000 -0.226800 -0.932500
+vn -0.334400 -0.212600 -0.918100
+vn -0.378700 -0.165600 -0.910600
+vn -0.370800 -0.135000 -0.918800
+vn -0.428100 -0.147000 -0.891700
+vn -0.419200 -0.116800 -0.900300
+vn -0.386200 -0.196100 -0.901300
+vn -0.436500 -0.177100 -0.882100
+vn -0.362600 -0.104300 -0.926100
+vn -0.409900 -0.086500 -0.908000
+vn -0.510000 -0.074100 -0.857000
+vn -0.498600 -0.044700 -0.865600
+vn -0.455400 -0.066600 -0.887800
+vn -0.465700 -0.096400 -0.879600
+vn -0.475600 -0.126200 -0.870500
+vn -0.520800 -0.103300 -0.847400
+vn -0.484900 -0.155800 -0.860500
+vn -0.531000 -0.132500 -0.836900
+vn -0.563700 -0.078500 -0.822200
+vn -0.552000 -0.049700 -0.832300
+vn -0.604400 -0.051600 -0.795000
+vn -0.591900 -0.023400 -0.805700
+vn -0.574800 -0.107200 -0.811200
+vn -0.616200 -0.079700 -0.783500
+vn -0.539800 -0.020900 -0.841500
+vn -0.578700 0.004800 -0.815500
+vn -0.663500 0.034200 -0.747400
+vn -0.648800 0.061100 -0.758500
+vn -0.615200 0.032200 -0.787700
+vn -0.629100 0.004600 -0.777300
+vn -0.642400 -0.022900 -0.766000
+vn -0.677500 0.007200 -0.735500
+vn -0.655000 -0.050500 -0.753900
+vn -0.690800 -0.019700 -0.722800
+vn -0.709700 0.039000 -0.703400
+vn -0.695000 0.065200 -0.716000
+vn -0.738900 0.072200 -0.669900
+vn -0.723700 0.097800 -0.683100
+vn -0.723600 0.012600 -0.690100
+vn -0.753400 0.046600 -0.655900
+vn -0.679600 0.091400 -0.727800
+vn -0.707700 0.123300 -0.695600
+vn -0.771500 0.166400 -0.614000
+vn -0.754500 0.190300 -0.628100
+vn -0.732700 0.156300 -0.662300
+vn -0.749300 0.131600 -0.649000
+vn -0.765000 0.106800 -0.635100
+vn -0.787700 0.142200 -0.599300
+vn -0.780000 0.081800 -0.620400
+vn -0.803100 0.118000 -0.584000
+vn -0.807100 0.178700 -0.562700
+vn -0.790500 0.202000 -0.578100
+vn -0.823100 0.216100 -0.525100
+vn -0.806200 0.238700 -0.541300
+vn -0.822900 0.155100 -0.546600
+vn -0.839200 0.193300 -0.508300
+vn -0.773100 0.225200 -0.593000
+vn -0.788400 0.261000 -0.557000
+vn -0.827200 0.313600 -0.466100
+vn -0.809000 0.334300 -0.483500
+vn -0.800400 0.297500 -0.520300
+vn -0.818500 0.275900 -0.503900
+vn -0.835700 0.254200 -0.486800
+vn -0.844600 0.292600 -0.448300
+vn -0.852000 0.232100 -0.469300
+vn -0.861100 0.271200 -0.430000
+vn -0.850000 0.331300 -0.409500
+vn -0.832500 0.351500 -0.428100
+vn -0.851800 0.370400 -0.370400
+vn -0.834300 0.389800 -0.389800
+vn -0.866500 0.310700 -0.390500
+vn -0.868400 0.350600 -0.350600
+vn -0.814200 0.371400 -0.446300
+vn -0.815900 0.408800 -0.408800
+vn -0.827200 0.466100 -0.313600
+vn -0.809000 0.483500 -0.334300
+vn -0.814200 0.446300 -0.371400
+vn -0.832500 0.428100 -0.351500
+vn -0.850000 0.409500 -0.331300
+vn -0.844600 0.448300 -0.292600
+vn -0.866500 0.390500 -0.310700
+vn -0.861100 0.430000 -0.271200
+vn -0.835700 0.486800 -0.254200
+vn -0.818500 0.503900 -0.275900
+vn -0.823100 0.525100 -0.216100
+vn -0.806200 0.541300 -0.238700
+vn -0.852000 0.469300 -0.232100
+vn -0.839200 0.508300 -0.193300
+vn -0.800400 0.520300 -0.297500
+vn -0.788400 0.557000 -0.261000
+vn -0.771500 0.614000 -0.166400
+vn -0.754500 0.628100 -0.190300
+vn -0.773100 0.593000 -0.225200
+vn -0.790500 0.578100 -0.202000
+vn -0.807100 0.562700 -0.178700
+vn -0.787700 0.599300 -0.142200
+vn -0.822900 0.546600 -0.155100
+vn -0.803100 0.584000 -0.118000
+vn -0.765000 0.635100 -0.106800
+vn -0.749300 0.649000 -0.131600
+vn -0.738900 0.669900 -0.072200
+vn -0.723700 0.683100 -0.097800
+vn -0.780000 0.620400 -0.081800
+vn -0.753400 0.655900 -0.046600
+vn -0.732700 0.662300 -0.156300
+vn -0.707700 0.695600 -0.123300
+vn -0.663500 0.747400 -0.034200
+vn -0.648800 0.758500 -0.061100
+vn -0.679600 0.727800 -0.091400
+vn -0.695000 0.716000 -0.065200
+vn -0.709700 0.703400 -0.039000
+vn -0.677500 0.735500 -0.007200
+vn -0.723600 0.690100 -0.012600
+vn -0.690800 0.722800 0.019700
+vn -0.642400 0.766000 0.022900
+vn -0.629100 0.777300 -0.004600
+vn -0.604400 0.795000 0.051600
+vn -0.591900 0.805700 0.023400
+vn -0.655000 0.753900 0.050500
+vn -0.616200 0.783500 0.079700
+vn -0.615200 0.787700 -0.032200
+vn -0.578700 0.815500 -0.004800
+vn -0.510000 0.857000 0.074100
+vn -0.498600 0.865600 0.044700
+vn -0.539800 0.841500 0.020900
+vn -0.552000 0.832300 0.049700
+vn -0.563700 0.822200 0.078500
+vn -0.520800 0.847400 0.103300
+vn -0.574800 0.811200 0.107200
+vn -0.531000 0.836900 0.132500
+vn -0.475600 0.870500 0.126200
+vn -0.465700 0.879600 0.096400
+vn -0.428100 0.891700 0.147000
+vn -0.419200 0.900300 0.116800
+vn -0.484900 0.860500 0.155800
+vn -0.436500 0.882100 0.177100
+vn -0.455400 0.887800 0.066600
+vn -0.409900 0.908000 0.086500
+vn -0.321100 0.934900 0.150900
+vn -0.313900 0.941900 0.119800
+vn -0.362600 0.926100 0.104300
+vn -0.370800 0.918800 0.135000
+vn -0.378700 0.910600 0.165600
+vn -0.327900 0.927000 0.181800
+vn -0.386200 0.901300 0.196100
+vn -0.334400 0.918100 0.212600
+vn -0.275600 0.941100 0.195700
+vn -0.269900 0.948700 0.164400
+vn -0.221900 0.952800 0.207200
+vn -0.217300 0.960100 0.175700
+vn -0.281000 0.932500 0.226800
+vn -0.226300 0.944400 0.238500
+vn -0.263800 0.955300 0.133000
+vn -0.212400 0.966500 0.144000
+vn -0.109600 0.975500 0.190700
+vn -0.107200 0.981500 0.158700
+vn -0.160000 0.975200 0.152600
+vn -0.163700 0.969100 0.184500
+vn -0.167100 0.961900 0.216200
+vn -0.111900 0.968400 0.222600
+vn -0.170400 0.953700 0.247600
+vn -0.114100 0.960400 0.254200
+vn -0.056200 0.972400 0.226400
+vn -0.055000 0.979300 0.194500
+vn 0.000000 0.973700 0.227700
+vn 0.000000 0.980600 0.195800
+vn -0.057300 0.964400 0.258100
+vn 0.000000 0.965700 0.259500
+vn -0.053800 0.985200 0.162400
+vn 0.000000 0.986500 0.163600
+vn 0.109600 0.975500 0.190700
+vn 0.107200 0.981500 0.158700
+vn 0.053800 0.985200 0.162400
+vn 0.055000 0.979300 0.194500
+vn 0.056200 0.972400 0.226400
+vn 0.111900 0.968400 0.222600
+vn 0.057300 0.964400 0.258100
+vn 0.114100 0.960400 0.254200
+vn 0.167100 0.961900 0.216200
+vn 0.163700 0.969100 0.184500
+vn 0.221900 0.952800 0.207200
+vn 0.217300 0.960100 0.175700
+vn 0.170400 0.953700 0.247600
+vn 0.226300 0.944400 0.238500
+vn 0.160000 0.975200 0.152600
+vn 0.212400 0.966500 0.144000
+vn 0.321100 0.934900 0.150900
+vn 0.313900 0.941900 0.119800
+vn 0.263800 0.955300 0.133000
+vn 0.269900 0.948700 0.164400
+vn 0.275600 0.941100 0.195700
+vn 0.327900 0.927000 0.181800
+vn 0.281000 0.932500 0.226800
+vn 0.334400 0.918100 0.212600
+vn 0.378700 0.910600 0.165600
+vn 0.370800 0.918800 0.135000
+vn 0.428100 0.891700 0.147000
+vn 0.419200 0.900300 0.116800
+vn 0.386200 0.901300 0.196100
+vn 0.436500 0.882100 0.177100
+vn 0.362600 0.926100 0.104300
+vn 0.409900 0.908000 0.086500
+vn 0.510000 0.857000 0.074100
+vn 0.498600 0.865600 0.044700
+vn 0.455400 0.887800 0.066600
+vn 0.465700 0.879600 0.096400
+vn 0.475600 0.870500 0.126200
+vn 0.520800 0.847400 0.103300
+vn 0.484900 0.860500 0.155800
+vn 0.531000 0.836900 0.132500
+vn 0.563700 0.822200 0.078500
+vn 0.552000 0.832300 0.049700
+vn 0.604400 0.795000 0.051600
+vn 0.591900 0.805700 0.023400
+vn 0.574800 0.811200 0.107200
+vn 0.616200 0.783500 0.079700
+vn 0.539800 0.841500 0.020900
+vn 0.578700 0.815500 -0.004800
+vn 0.663500 0.747400 -0.034200
+vn 0.648800 0.758500 -0.061100
+vn 0.615200 0.787700 -0.032200
+vn 0.629100 0.777300 -0.004600
+vn 0.642400 0.766000 0.022900
+vn 0.677500 0.735500 -0.007200
+vn 0.655000 0.753900 0.050500
+vn 0.690800 0.722800 0.019700
+vn 0.709700 0.703400 -0.039000
+vn 0.695000 0.716000 -0.065200
+vn 0.738900 0.669900 -0.072200
+vn 0.723700 0.683100 -0.097800
+vn 0.723600 0.690100 -0.012600
+vn 0.753400 0.655900 -0.046600
+vn 0.679600 0.727800 -0.091400
+vn 0.707700 0.695600 -0.123300
+vn 0.771500 0.614000 -0.166400
+vn 0.754500 0.628100 -0.190300
+vn 0.732700 0.662300 -0.156300
+vn 0.749300 0.649000 -0.131600
+vn 0.765000 0.635100 -0.106800
+vn 0.787700 0.599300 -0.142200
+vn 0.780000 0.620400 -0.081800
+vn 0.803100 0.584000 -0.118000
+vn 0.807100 0.562700 -0.178700
+vn 0.790500 0.578100 -0.202000
+vn 0.823100 0.525100 -0.216100
+vn 0.806200 0.541300 -0.238700
+vn 0.822900 0.546600 -0.155100
+vn 0.839200 0.508300 -0.193300
+vn 0.773100 0.593000 -0.225200
+vn 0.788400 0.557000 -0.261000
+vn 0.827200 0.466100 -0.313600
+vn 0.809000 0.483500 -0.334300
+vn 0.800400 0.520300 -0.297500
+vn 0.818500 0.503900 -0.275900
+vn 0.835700 0.486800 -0.254200
+vn 0.844600 0.448300 -0.292600
+vn 0.852000 0.469300 -0.232100
+vn 0.861100 0.430000 -0.271200
+vn 0.850000 0.409500 -0.331300
+vn 0.832500 0.428100 -0.351500
+vn 0.851800 0.370400 -0.370400
+vn 0.834300 0.389800 -0.389800
+vn 0.866500 0.390500 -0.310700
+vn 0.868400 0.350600 -0.350600
+vn 0.814200 0.446300 -0.371400
+vn 0.815900 0.408800 -0.408800
+vn 0.827200 0.313600 -0.466100
+vn 0.809000 0.334300 -0.483500
+vn 0.814200 0.371400 -0.446300
+vn 0.832500 0.351500 -0.428100
+vn 0.850000 0.331300 -0.409500
+vn 0.844600 0.292600 -0.448300
+vn 0.866500 0.310700 -0.390500
+vn 0.861100 0.271200 -0.430000
+vn 0.835700 0.254200 -0.486900
+vn 0.818500 0.275900 -0.503900
+vn 0.852000 0.232100 -0.469300
+vn 0.800400 0.297500 -0.520300
+vn 0.831300 0.069100 -0.551500
+vn 0.817700 0.093600 -0.568000
+vn 0.837800 0.131400 -0.530000
+vn 0.851700 0.107600 -0.512800
+vn 0.854400 0.170300 -0.491000
+vn 0.868600 0.147100 -0.473100
+vn 0.864800 0.083700 -0.495100
+vn 0.844100 0.044600 -0.534300
+vn 0.876900 0.059700 -0.476900
+vn 0.855900 0.020000 -0.516700
+vn 0.881900 0.123800 -0.454800
+vn 0.894300 0.100300 -0.436000
+vn 0.819800 0.006500 -0.572600
+vn 0.807400 0.031600 -0.589200
+vn 0.791800 -0.030500 -0.609900
+vn 0.779900 -0.004800 -0.625900
+vn 0.831300 -0.018600 -0.555500
+vn 0.803000 -0.056100 -0.593300
+vn 0.794100 0.056700 -0.605100
+vn 0.767100 0.020900 -0.641200
+vn 0.715100 -0.073500 -0.695200
+vn 0.703300 -0.046600 -0.709300
+vn 0.736700 -0.013700 -0.676100
+vn 0.749000 -0.039900 -0.661300
+vn 0.760500 -0.066200 -0.645900
+vn 0.726100 -0.100200 -0.680200
+vn 0.771300 -0.092300 -0.629800
+vn 0.736300 -0.126900 -0.664600
+vn 0.688500 -0.132600 -0.712900
+vn 0.678100 -0.105400 -0.727400
+vn 0.647800 -0.163400 -0.744000
+vn 0.638000 -0.135700 -0.758000
+vn 0.698300 -0.159800 -0.697800
+vn 0.657000 -0.191000 -0.729300
+vn 0.666900 -0.078000 -0.741000
+vn 0.627400 -0.107800 -0.771100
+vn 0.549800 -0.190400 -0.813300
+vn 0.540700 -0.161600 -0.825500
+vn 0.585300 -0.135700 -0.799400
+vn 0.595100 -0.164100 -0.786700
+vn 0.604300 -0.192300 -0.773200
+vn 0.558300 -0.219000 -0.800200
+vn 0.612800 -0.220300 -0.758900
+vn 0.566200 -0.247400 -0.786200
+vn 0.509800 -0.243500 -0.825000
+vn 0.502100 -0.214500 -0.837800
+vn 0.459000 -0.265900 -0.847700
+vn 0.452000 -0.236500 -0.860100
+vn 0.517100 -0.272300 -0.811400
+vn 0.465500 -0.295000 -0.834400
+vn 0.493800 -0.185300 -0.849600
+vn 0.444500 -0.206900 -0.871500
+vn 0.346200 -0.273400 -0.897400
+vn 0.340500 -0.243200 -0.908300
+vn 0.393200 -0.226300 -0.891100
+vn 0.399900 -0.256200 -0.880000
+vn 0.406000 -0.285900 -0.867900
+vn 0.351600 -0.303400 -0.885600
+vn 0.411800 -0.315300 -0.854900
+vn 0.356600 -0.333000 -0.872900
+vn 0.295500 -0.318300 -0.900700
+vn 0.291000 -0.288100 -0.912300
+vn 0.237900 -0.330600 -0.913300
+vn 0.234300 -0.300200 -0.924600
+vn 0.299700 -0.348200 -0.888200
+vn 0.241300 -0.360700 -0.900900
+vn 0.286200 -0.257600 -0.922900
+vn 0.230400 -0.269500 -0.935000
+vn 0.118200 -0.316500 -0.941200
+vn 0.116200 -0.285500 -0.951300
+vn 0.173600 -0.278900 -0.944500
+vn 0.176500 -0.309800 -0.934300
+vn 0.179200 -0.340300 -0.923100
+vn 0.120000 -0.347200 -0.930100
+vn 0.181800 -0.370500 -0.910800
+vn 0.121700 -0.377500 -0.917900
+vn 0.060300 -0.351400 -0.934300
+vn 0.059400 -0.320600 -0.945300
+vn 0.000000 -0.352800 -0.935700
+vn 0.000000 -0.322000 -0.946700
+vn 0.061100 -0.381800 -0.922200
+vn 0.000000 -0.383200 -0.923600
+vn 0.058400 -0.289600 -0.955400
+vn 0.000000 -0.290900 -0.956700
+vn -0.118200 -0.316500 -0.941200
+vn -0.116200 -0.285500 -0.951300
+vn -0.058400 -0.289600 -0.955400
+vn -0.059400 -0.320600 -0.945300
+vn -0.060300 -0.351400 -0.934300
+vn -0.120000 -0.347200 -0.930100
+vn -0.061100 -0.381800 -0.922200
+vn -0.121700 -0.377500 -0.917900
+vn -0.179200 -0.340300 -0.923100
+vn -0.176500 -0.309800 -0.934300
+vn -0.237900 -0.330600 -0.913300
+vn -0.234300 -0.300200 -0.924600
+vn -0.181800 -0.370500 -0.910800
+vn -0.241300 -0.360700 -0.900900
+vn -0.173600 -0.278900 -0.944500
+vn -0.230400 -0.269500 -0.935000
+vn -0.346200 -0.273400 -0.897400
+vn -0.340500 -0.243200 -0.908300
+vn -0.286200 -0.257600 -0.922900
+vn -0.291000 -0.288100 -0.912300
+vn -0.295500 -0.318300 -0.900700
+vn -0.351600 -0.303400 -0.885600
+vn -0.299700 -0.348200 -0.888200
+vn -0.356600 -0.333000 -0.872900
+vn -0.406000 -0.285900 -0.867900
+vn -0.399900 -0.256200 -0.880000
+vn -0.459000 -0.265900 -0.847700
+vn -0.452000 -0.236500 -0.860100
+vn -0.411800 -0.315300 -0.854900
+vn -0.465500 -0.295000 -0.834400
+vn -0.393200 -0.226300 -0.891100
+vn -0.444500 -0.206900 -0.871500
+vn -0.549800 -0.190400 -0.813300
+vn -0.540700 -0.161600 -0.825500
+vn -0.493800 -0.185300 -0.849600
+vn -0.502100 -0.214500 -0.837800
+vn -0.509800 -0.243500 -0.825000
+vn -0.558300 -0.219000 -0.800200
+vn -0.517100 -0.272300 -0.811400
+vn -0.566200 -0.247400 -0.786200
+vn -0.604300 -0.192300 -0.773200
+vn -0.595100 -0.164100 -0.786700
+vn -0.647800 -0.163400 -0.744000
+vn -0.638000 -0.135700 -0.758000
+vn -0.612800 -0.220300 -0.758900
+vn -0.657000 -0.191000 -0.729300
+vn -0.585300 -0.135700 -0.799400
+vn -0.627400 -0.107800 -0.771100
+vn -0.715100 -0.073500 -0.695200
+vn -0.703300 -0.046600 -0.709300
+vn -0.666900 -0.078000 -0.741000
+vn -0.678100 -0.105400 -0.727400
+vn -0.688500 -0.132600 -0.712900
+vn -0.726100 -0.100200 -0.680200
+vn -0.698300 -0.159800 -0.697800
+vn -0.736300 -0.126900 -0.664600
+vn -0.760500 -0.066200 -0.645900
+vn -0.749000 -0.039900 -0.661300
+vn -0.791800 -0.030500 -0.609900
+vn -0.779800 -0.004800 -0.625900
+vn -0.771200 -0.092300 -0.629800
+vn -0.803000 -0.056100 -0.593300
+vn -0.736700 -0.013700 -0.676100
+vn -0.767100 0.020900 -0.641200
+vn -0.831300 0.069100 -0.551500
+vn -0.817700 0.093600 -0.568000
+vn -0.794100 0.056700 -0.605100
+vn -0.807400 0.031600 -0.589200
+vn -0.819800 0.006500 -0.572600
+vn -0.844100 0.044600 -0.534300
+vn -0.831300 -0.018600 -0.555500
+vn -0.855900 0.020000 -0.516700
+vn -0.864800 0.083700 -0.495100
+vn -0.851700 0.107600 -0.512800
+vn -0.881900 0.123800 -0.454800
+vn -0.868600 0.147100 -0.473100
+vn -0.876900 0.059700 -0.476900
+vn -0.894300 0.100300 -0.436000
+vn -0.837800 0.131400 -0.530000
+vn -0.854400 0.170300 -0.491000
+vn -0.891200 0.227800 -0.392200
+vn -0.876600 0.249600 -0.411300
+vn -0.867300 0.209800 -0.451300
+vn -0.881800 0.187300 -0.432800
+vn -0.895300 0.164600 -0.413900
+vn -0.904900 0.205800 -0.372600
+vn -0.907900 0.141700 -0.394500
+vn -0.917600 0.183400 -0.352700
+vn -0.910600 0.247300 -0.331100
+vn -0.896900 0.268700 -0.351200
+vn -0.912500 0.289200 -0.289200
+vn -0.898800 0.309900 -0.309900
+vn -0.923400 0.225600 -0.310500
+vn -0.925400 0.268000 -0.268000
+vn -0.882200 0.289900 -0.371000
+vn -0.884100 0.330400 -0.330400
+vn -0.891200 0.392200 -0.227800
+vn -0.876600 0.411300 -0.249600
+vn -0.882200 0.371000 -0.289900
+vn -0.896900 0.351200 -0.268700
+vn -0.910600 0.331100 -0.247300
+vn -0.904900 0.372600 -0.205800
+vn -0.923400 0.310500 -0.225600
+vn -0.917600 0.352700 -0.183400
+vn -0.895300 0.413900 -0.164600
+vn -0.881800 0.432800 -0.187300
+vn -0.881900 0.454800 -0.123800
+vn -0.868600 0.473100 -0.147100
+vn -0.907900 0.394500 -0.141700
+vn -0.894300 0.436000 -0.100300
+vn -0.867300 0.451300 -0.209800
+vn -0.854400 0.491000 -0.170300
+vn -0.831300 0.551500 -0.069100
+vn -0.817700 0.568000 -0.093600
+vn -0.837800 0.530000 -0.131400
+vn -0.851700 0.512800 -0.107600
+vn -0.864800 0.495100 -0.083700
+vn -0.844100 0.534300 -0.044600
+vn -0.876900 0.476900 -0.059700
+vn -0.855900 0.516700 -0.020000
+vn -0.819800 0.572600 -0.006500
+vn -0.807400 0.589200 -0.031600
+vn -0.791800 0.609900 0.030500
+vn -0.779800 0.625900 0.004800
+vn -0.831300 0.555500 0.018600
+vn -0.803000 0.593300 0.056100
+vn -0.794100 0.605100 -0.056700
+vn -0.767100 0.641200 -0.020900
+vn -0.715100 0.695200 0.073500
+vn -0.703300 0.709300 0.046600
+vn -0.736700 0.676100 0.013700
+vn -0.749000 0.661300 0.039900
+vn -0.760500 0.645900 0.066200
+vn -0.726100 0.680200 0.100200
+vn -0.771200 0.629800 0.092300
+vn -0.736300 0.664600 0.126900
+vn -0.688500 0.712900 0.132600
+vn -0.678100 0.727400 0.105400
+vn -0.647800 0.744000 0.163400
+vn -0.638000 0.758000 0.135700
+vn -0.698300 0.697800 0.159800
+vn -0.657000 0.729300 0.191000
+vn -0.666900 0.741000 0.078000
+vn -0.627400 0.771100 0.107800
+vn -0.549800 0.813300 0.190400
+vn -0.540700 0.825500 0.161600
+vn -0.585300 0.799400 0.135700
+vn -0.595100 0.786700 0.164100
+vn -0.604300 0.773200 0.192300
+vn -0.558300 0.800200 0.219000
+vn -0.612800 0.758900 0.220300
+vn -0.566200 0.786200 0.247400
+vn -0.509800 0.825000 0.243500
+vn -0.502100 0.837800 0.214500
+vn -0.459000 0.847700 0.265900
+vn -0.452000 0.860100 0.236500
+vn -0.517100 0.811400 0.272300
+vn -0.465500 0.834400 0.295000
+vn -0.493800 0.849600 0.185300
+vn -0.444500 0.871500 0.206900
+vn -0.346200 0.897400 0.273400
+vn -0.340500 0.908300 0.243200
+vn -0.393200 0.891100 0.226300
+vn -0.399900 0.880000 0.256200
+vn -0.406000 0.867900 0.285900
+vn -0.351600 0.885600 0.303400
+vn -0.411800 0.854900 0.315300
+vn -0.356600 0.872900 0.333000
+vn -0.295500 0.900700 0.318300
+vn -0.291000 0.912300 0.288100
+vn -0.237900 0.913300 0.330600
+vn -0.234300 0.924600 0.300200
+vn -0.299700 0.888200 0.348200
+vn -0.241300 0.900900 0.360700
+vn -0.286200 0.922900 0.257600
+vn -0.230400 0.935000 0.269500
+vn -0.118200 0.941200 0.316500
+vn -0.116200 0.951300 0.285500
+vn -0.173600 0.944500 0.278900
+vn -0.176500 0.934300 0.309800
+vn -0.179200 0.923100 0.340300
+vn -0.120000 0.930100 0.347200
+vn -0.181800 0.910800 0.370500
+vn -0.121700 0.917900 0.377500
+vn -0.060300 0.934300 0.351400
+vn -0.059400 0.945300 0.320600
+vn 0.000000 0.935700 0.352800
+vn 0.000000 0.946700 0.322000
+vn -0.061100 0.922200 0.381800
+vn 0.000000 0.923600 0.383200
+vn -0.058400 0.955400 0.289600
+vn 0.000000 0.956700 0.290900
+vn 0.118200 0.941200 0.316500
+vn 0.116200 0.951300 0.285500
+vn 0.058400 0.955400 0.289600
+vn 0.059400 0.945300 0.320600
+vn 0.060300 0.934300 0.351400
+vn 0.120000 0.930100 0.347200
+vn 0.061100 0.922200 0.381800
+vn 0.121700 0.917900 0.377500
+vn 0.179200 0.923100 0.340300
+vn 0.176500 0.934300 0.309800
+vn 0.237900 0.913300 0.330600
+vn 0.234300 0.924600 0.300200
+vn 0.181800 0.910800 0.370500
+vn 0.241300 0.900900 0.360700
+vn 0.173600 0.944500 0.278900
+vn 0.230400 0.935000 0.269500
+vn 0.346200 0.897400 0.273400
+vn 0.340500 0.908300 0.243200
+vn 0.286200 0.922900 0.257600
+vn 0.291000 0.912300 0.288100
+vn 0.295500 0.900700 0.318300
+vn 0.351600 0.885600 0.303400
+vn 0.299700 0.888200 0.348200
+vn 0.356600 0.872900 0.333000
+vn 0.406000 0.867900 0.285900
+vn 0.399900 0.880000 0.256200
+vn 0.459000 0.847700 0.265900
+vn 0.452000 0.860100 0.236500
+vn 0.411800 0.854900 0.315300
+vn 0.465500 0.834400 0.295000
+vn 0.393200 0.891100 0.226300
+vn 0.444500 0.871500 0.206900
+vn 0.549800 0.813300 0.190400
+vn 0.540700 0.825500 0.161600
+vn 0.493800 0.849600 0.185300
+vn 0.502100 0.837800 0.214500
+vn 0.509800 0.825000 0.243500
+vn 0.558300 0.800200 0.219000
+vn 0.517100 0.811400 0.272300
+vn 0.566200 0.786200 0.247400
+vn 0.604300 0.773200 0.192300
+vn 0.595100 0.786700 0.164100
+vn 0.647800 0.744000 0.163400
+vn 0.638000 0.758000 0.135700
+vn 0.612800 0.758900 0.220300
+vn 0.657000 0.729300 0.191000
+vn 0.585300 0.799400 0.135700
+vn 0.627400 0.771100 0.107800
+vn 0.715100 0.695200 0.073500
+vn 0.703300 0.709300 0.046600
+vn 0.666900 0.741000 0.078000
+vn 0.678100 0.727400 0.105400
+vn 0.688500 0.712900 0.132600
+vn 0.726100 0.680200 0.100200
+vn 0.698300 0.697800 0.159800
+vn 0.736300 0.664600 0.126900
+vn 0.760500 0.645900 0.066200
+vn 0.749000 0.661300 0.039900
+vn 0.791800 0.609900 0.030500
+vn 0.779800 0.625900 0.004800
+vn 0.771200 0.629800 0.092300
+vn 0.803000 0.593300 0.056100
+vn 0.736700 0.676100 0.013700
+vn 0.767100 0.641200 -0.020900
+vn 0.831300 0.551500 -0.069100
+vn 0.817700 0.568000 -0.093600
+vn 0.794100 0.605100 -0.056700
+vn 0.807400 0.589200 -0.031600
+vn 0.819800 0.572600 -0.006500
+vn 0.844100 0.534300 -0.044600
+vn 0.831300 0.555500 0.018600
+vn 0.855900 0.516700 -0.020000
+vn 0.864800 0.495100 -0.083700
+vn 0.851700 0.512800 -0.107600
+vn 0.881900 0.454800 -0.123800
+vn 0.868600 0.473100 -0.147100
+vn 0.876900 0.476900 -0.059700
+vn 0.894300 0.436000 -0.100300
+vn 0.837800 0.530000 -0.131400
+vn 0.854400 0.491000 -0.170300
+vn 0.891200 0.392200 -0.227800
+vn 0.876600 0.411300 -0.249600
+vn 0.867400 0.451300 -0.209800
+vn 0.881800 0.432800 -0.187300
+vn 0.895300 0.413900 -0.164600
+vn 0.904900 0.372600 -0.205800
+vn 0.907900 0.394500 -0.141700
+vn 0.917600 0.352700 -0.183400
+vn 0.910600 0.331100 -0.247300
+vn 0.896900 0.351200 -0.268700
+vn 0.912500 0.289200 -0.289200
+vn 0.898800 0.309900 -0.309900
+vn 0.923400 0.310500 -0.225600
+vn 0.925400 0.268000 -0.268000
+vn 0.882200 0.371000 -0.289900
+vn 0.884100 0.330400 -0.330400
+vn 0.891200 0.227800 -0.392200
+vn 0.876600 0.249600 -0.411300
+vn 0.882200 0.289900 -0.371000
+vn 0.896900 0.268700 -0.351200
+vn 0.910600 0.247300 -0.331100
+vn 0.904900 0.205800 -0.372600
+vn 0.923400 0.225600 -0.310500
+vn 0.917600 0.183400 -0.352700
+vn 0.895300 0.164600 -0.413900
+vn 0.881800 0.187300 -0.432800
+vn 0.907900 0.141700 -0.394500
+vn 0.867300 0.209800 -0.451300
+vn 0.876900 -0.029100 -0.479700
+vn 0.866900 -0.004500 -0.498500
+vn 0.888100 0.035600 -0.458100
+vn 0.898400 0.011500 -0.438900
+vn 0.905700 0.076800 -0.416800
+vn 0.916200 0.053200 -0.397100
+vn 0.907700 -0.012500 -0.419300
+vn 0.886000 -0.053600 -0.460500
+vn 0.916100 -0.036600 -0.399200
+vn 0.894200 -0.078000 -0.440800
+vn 0.925700 0.029600 -0.377100
+vn 0.934200 0.005900 -0.356500
+vn 0.860500 -0.093600 -0.500700
+vn 0.851700 -0.068600 -0.519500
+vn 0.831300 -0.132500 -0.539800
+vn 0.822700 -0.107200 -0.558200
+vn 0.868500 -0.118400 -0.481300
+vn 0.839000 -0.157700 -0.520800
+vn 0.841900 -0.043600 -0.537800
+vn 0.813300 -0.081700 -0.576000
+vn 0.754400 -0.179700 -0.631200
+vn 0.745800 -0.153400 -0.648200
+vn 0.781200 -0.118400 -0.613000
+vn 0.790200 -0.144300 -0.595600
+vn 0.798400 -0.170000 -0.577500
+vn 0.762300 -0.205800 -0.613500
+vn 0.805800 -0.195600 -0.558900
+vn 0.769400 -0.231800 -0.595200
+vn 0.722900 -0.239900 -0.647900
+vn 0.715400 -0.213400 -0.665200
+vn 0.680200 -0.272300 -0.680500
+vn 0.673200 -0.245500 -0.697500
+vn 0.729600 -0.266200 -0.629900
+vn 0.686500 -0.298900 -0.662800
+vn 0.707200 -0.186700 -0.681800
+vn 0.665400 -0.218400 -0.713800
+vn 0.580200 -0.303400 -0.755900
+vn 0.573500 -0.275500 -0.771400
+vn 0.620700 -0.248100 -0.743700
+vn 0.627900 -0.275600 -0.727800
+vn 0.634500 -0.302700 -0.711100
+vn 0.586300 -0.330800 -0.739500
+vn 0.640400 -0.329600 -0.693700
+vn 0.591700 -0.358000 -0.722300
+vn 0.535400 -0.356700 -0.765500
+vn 0.529900 -0.328900 -0.781700
+vn 0.482000 -0.380200 -0.789300
+vn 0.477000 -0.352200 -0.805200
+vn 0.540400 -0.384100 -0.748600
+vn 0.486500 -0.407900 -0.772600
+vn 0.523800 -0.300800 -0.797000
+vn 0.471500 -0.323800 -0.820200
+vn 0.365400 -0.391200 -0.844600
+vn 0.361200 -0.362300 -0.859200
+vn 0.417200 -0.344400 -0.841000
+vn 0.422000 -0.373100 -0.826200
+vn 0.426500 -0.401300 -0.810600
+vn 0.369300 -0.419700 -0.829100
+vn 0.430500 -0.429200 -0.794000
+vn 0.372700 -0.447700 -0.812800
+vn 0.310400 -0.435400 -0.845000
+vn 0.307200 -0.406800 -0.860300
+vn 0.249900 -0.448400 -0.858100
+vn 0.247300 -0.419600 -0.873300
+vn 0.313300 -0.463600 -0.828800
+vn 0.252200 -0.476800 -0.842000
+vn 0.303600 -0.377700 -0.874700
+vn 0.244500 -0.390400 -0.887600
+vn 0.124800 -0.436900 -0.890800
+vn 0.123300 -0.407500 -0.904800
+vn 0.184100 -0.400300 -0.897600
+vn 0.186300 -0.429700 -0.883500
+vn 0.188300 -0.458600 -0.868400
+vn 0.126100 -0.465900 -0.875800
+vn 0.190000 -0.487000 -0.852400
+vn 0.127300 -0.494400 -0.859800
+vn 0.063300 -0.470300 -0.880200
+vn 0.062700 -0.441200 -0.895200
+vn 0.000000 -0.471800 -0.881700
+vn 0.000000 -0.442700 -0.896700
+vn 0.063900 -0.498800 -0.864300
+vn 0.000000 -0.500300 -0.865800
+vn 0.061900 -0.411700 -0.909200
+vn 0.000000 -0.413200 -0.910600
+vn -0.124800 -0.436900 -0.890800
+vn -0.123300 -0.407500 -0.904800
+vn -0.061900 -0.411700 -0.909200
+vn -0.062700 -0.441200 -0.895200
+vn -0.063300 -0.470300 -0.880200
+vn -0.126100 -0.465900 -0.875800
+vn -0.063900 -0.498800 -0.864300
+vn -0.127300 -0.494400 -0.859800
+vn -0.188300 -0.458600 -0.868400
+vn -0.186300 -0.429700 -0.883500
+vn -0.249900 -0.448400 -0.858100
+vn -0.247300 -0.419600 -0.873300
+vn -0.190000 -0.487000 -0.852400
+vn -0.252200 -0.476800 -0.842000
+vn -0.184100 -0.400300 -0.897600
+vn -0.244500 -0.390400 -0.887600
+vn -0.365400 -0.391200 -0.844600
+vn -0.361200 -0.362300 -0.859200
+vn -0.303600 -0.377700 -0.874700
+vn -0.307200 -0.406800 -0.860300
+vn -0.310400 -0.435400 -0.845000
+vn -0.369300 -0.419700 -0.829100
+vn -0.313300 -0.463600 -0.828800
+vn -0.372700 -0.447700 -0.812800
+vn -0.426500 -0.401300 -0.810600
+vn -0.422000 -0.373100 -0.826200
+vn -0.482000 -0.380200 -0.789300
+vn -0.477000 -0.352200 -0.805200
+vn -0.430500 -0.429200 -0.794000
+vn -0.486500 -0.407900 -0.772600
+vn -0.417200 -0.344400 -0.841000
+vn -0.471500 -0.323800 -0.820200
+vn -0.580200 -0.303400 -0.755900
+vn -0.573500 -0.275500 -0.771400
+vn -0.523800 -0.300800 -0.797000
+vn -0.529900 -0.328900 -0.781700
+vn -0.535400 -0.356700 -0.765500
+vn -0.586300 -0.330800 -0.739500
+vn -0.540400 -0.384100 -0.748600
+vn -0.591700 -0.358000 -0.722300
+vn -0.634500 -0.302700 -0.711100
+vn -0.627900 -0.275600 -0.727800
+vn -0.680200 -0.272300 -0.680500
+vn -0.673200 -0.245500 -0.697500
+vn -0.640400 -0.329600 -0.693700
+vn -0.686500 -0.298900 -0.662800
+vn -0.620700 -0.248100 -0.743700
+vn -0.665400 -0.218400 -0.713800
+vn -0.754400 -0.179700 -0.631200
+vn -0.745800 -0.153400 -0.648200
+vn -0.707200 -0.186700 -0.681800
+vn -0.715400 -0.213400 -0.665200
+vn -0.722900 -0.239900 -0.647900
+vn -0.762300 -0.205800 -0.613500
+vn -0.729600 -0.266200 -0.629900
+vn -0.769400 -0.231800 -0.595200
+vn -0.798400 -0.170000 -0.577500
+vn -0.790200 -0.144300 -0.595600
+vn -0.831300 -0.132500 -0.539800
+vn -0.822700 -0.107200 -0.558200
+vn -0.805800 -0.195600 -0.558900
+vn -0.839000 -0.157700 -0.520800
+vn -0.781200 -0.118400 -0.613000
+vn -0.813300 -0.081700 -0.576000
+vn -0.876900 -0.029100 -0.479700
+vn -0.866900 -0.004500 -0.498500
+vn -0.841900 -0.043600 -0.537800
+vn -0.851700 -0.068600 -0.519500
+vn -0.860500 -0.093600 -0.500700
+vn -0.886000 -0.053600 -0.460500
+vn -0.868500 -0.118400 -0.481300
+vn -0.894200 -0.078000 -0.440800
+vn -0.907700 -0.012500 -0.419300
+vn -0.898400 0.011500 -0.438900
+vn -0.925700 0.029600 -0.377100
+vn -0.916200 0.053200 -0.397100
+vn -0.916100 -0.036600 -0.399200
+vn -0.934200 0.005900 -0.356500
+vn -0.888100 0.035600 -0.458100
+vn -0.905700 0.076800 -0.416800
+vn -0.940000 0.138400 -0.311700
+vn -0.929300 0.161000 -0.332400
+vn -0.919500 0.118700 -0.374700
+vn -0.930100 0.095600 -0.354600
+vn -0.939700 0.072400 -0.334100
+vn -0.949700 0.115600 -0.290800
+vn -0.948400 0.049100 -0.313200
+vn -0.958500 0.092700 -0.269500
+vn -0.955800 0.159200 -0.247200
+vn -0.946000 0.181500 -0.268600
+vn -0.957800 0.203200 -0.203200
+vn -0.948000 0.225000 -0.225000
+vn -0.964600 0.136800 -0.225500
+vn -0.966600 0.181100 -0.181100
+vn -0.935200 0.203600 -0.289700
+vn -0.937200 0.246700 -0.246700
+vn -0.940000 0.311700 -0.138400
+vn -0.929300 0.332400 -0.161000
+vn -0.935200 0.289700 -0.203600
+vn -0.946000 0.268600 -0.181500
+vn -0.955800 0.247200 -0.159200
+vn -0.949700 0.290800 -0.115600
+vn -0.964600 0.225500 -0.136800
+vn -0.958500 0.269500 -0.092700
+vn -0.939700 0.334100 -0.072400
+vn -0.930100 0.354600 -0.095600
+vn -0.925700 0.377100 -0.029600
+vn -0.916200 0.397100 -0.053200
+vn -0.948400 0.313200 -0.049100
+vn -0.934200 0.356600 -0.005900
+vn -0.919500 0.374700 -0.118700
+vn -0.905700 0.416800 -0.076800
+vn -0.876900 0.479700 0.029100
+vn -0.866900 0.498500 0.004500
+vn -0.888100 0.458100 -0.035600
+vn -0.898400 0.438900 -0.011500
+vn -0.907700 0.419300 0.012500
+vn -0.886000 0.460500 0.053600
+vn -0.916100 0.399200 0.036600
+vn -0.894200 0.440800 0.078000
+vn -0.860500 0.500700 0.093600
+vn -0.851700 0.519500 0.068600
+vn -0.831300 0.539800 0.132500
+vn -0.822700 0.558200 0.107200
+vn -0.868500 0.481300 0.118400
+vn -0.839000 0.520800 0.157700
+vn -0.841900 0.537800 0.043600
+vn -0.813300 0.576000 0.081700
+vn -0.754400 0.631200 0.179700
+vn -0.745800 0.648200 0.153400
+vn -0.781200 0.613000 0.118400
+vn -0.790200 0.595600 0.144300
+vn -0.798400 0.577500 0.170000
+vn -0.762300 0.613500 0.205800
+vn -0.805800 0.558900 0.195600
+vn -0.769400 0.595200 0.231800
+vn -0.722900 0.647900 0.239900
+vn -0.715400 0.665200 0.213400
+vn -0.680200 0.680500 0.272300
+vn -0.673200 0.697500 0.245500
+vn -0.729600 0.629900 0.266200
+vn -0.686500 0.662800 0.298900
+vn -0.707200 0.681800 0.186700
+vn -0.665400 0.713800 0.218400
+vn -0.580200 0.755900 0.303400
+vn -0.573500 0.771400 0.275500
+vn -0.620700 0.743700 0.248100
+vn -0.627900 0.727800 0.275600
+vn -0.634500 0.711100 0.302700
+vn -0.586300 0.739500 0.330800
+vn -0.640400 0.693700 0.329600
+vn -0.591700 0.722300 0.358000
+vn -0.535400 0.765500 0.356700
+vn -0.529900 0.781700 0.328900
+vn -0.482000 0.789300 0.380200
+vn -0.477000 0.805200 0.352200
+vn -0.540400 0.748600 0.384100
+vn -0.486500 0.772600 0.407900
+vn -0.523800 0.797000 0.300800
+vn -0.471500 0.820200 0.323800
+vn -0.365400 0.844600 0.391200
+vn -0.361200 0.859200 0.362300
+vn -0.417200 0.841000 0.344400
+vn -0.422000 0.826200 0.373100
+vn -0.426500 0.810600 0.401300
+vn -0.369300 0.829100 0.419700
+vn -0.430500 0.794000 0.429200
+vn -0.372700 0.812800 0.447700
+vn -0.310400 0.845000 0.435400
+vn -0.307200 0.860300 0.406800
+vn -0.249900 0.858100 0.448400
+vn -0.247300 0.873300 0.419600
+vn -0.313300 0.828800 0.463600
+vn -0.252200 0.842000 0.476800
+vn -0.303600 0.874700 0.377700
+vn -0.244500 0.887600 0.390400
+vn -0.124800 0.890800 0.436900
+vn -0.123300 0.904800 0.407500
+vn -0.184100 0.897600 0.400300
+vn -0.186300 0.883500 0.429700
+vn -0.188300 0.868400 0.458600
+vn -0.126100 0.875800 0.465900
+vn -0.190000 0.852400 0.487000
+vn -0.127300 0.859800 0.494400
+vn -0.063300 0.880200 0.470300
+vn -0.062700 0.895200 0.441200
+vn 0.000000 0.881700 0.471800
+vn 0.000000 0.896700 0.442700
+vn -0.063900 0.864300 0.498800
+vn 0.000000 0.865800 0.500300
+vn -0.061900 0.909200 0.411700
+vn 0.000000 0.910600 0.413200
+vn 0.124800 0.890800 0.436900
+vn 0.123300 0.904800 0.407500
+vn 0.061900 0.909200 0.411700
+vn 0.062700 0.895200 0.441200
+vn 0.063300 0.880200 0.470300
+vn 0.126100 0.875800 0.465900
+vn 0.063900 0.864300 0.498800
+vn 0.127300 0.859800 0.494400
+vn 0.188300 0.868400 0.458600
+vn 0.186300 0.883500 0.429700
+vn 0.249900 0.858100 0.448400
+vn 0.247300 0.873300 0.419600
+vn 0.190000 0.852400 0.487000
+vn 0.252200 0.842000 0.476800
+vn 0.184100 0.897600 0.400300
+vn 0.244500 0.887600 0.390400
+vn 0.365400 0.844600 0.391200
+vn 0.361200 0.859200 0.362300
+vn 0.303600 0.874700 0.377700
+vn 0.307200 0.860300 0.406800
+vn 0.310400 0.845000 0.435400
+vn 0.369300 0.829100 0.419700
+vn 0.313300 0.828800 0.463600
+vn 0.372700 0.812800 0.447700
+vn 0.426500 0.810600 0.401300
+vn 0.422000 0.826200 0.373100
+vn 0.482000 0.789300 0.380200
+vn 0.477000 0.805200 0.352200
+vn 0.430500 0.794000 0.429200
+vn 0.486500 0.772600 0.407900
+vn 0.417200 0.841000 0.344400
+vn 0.471500 0.820200 0.323800
+vn 0.580200 0.755900 0.303400
+vn 0.573500 0.771400 0.275500
+vn 0.523800 0.797000 0.300800
+vn 0.529900 0.781700 0.328900
+vn 0.535400 0.765500 0.356700
+vn 0.586300 0.739500 0.330800
+vn 0.540400 0.748600 0.384100
+vn 0.591700 0.722300 0.358000
+vn 0.634500 0.711100 0.302700
+vn 0.627900 0.727800 0.275600
+vn 0.680200 0.680500 0.272300
+vn 0.673200 0.697500 0.245500
+vn 0.640400 0.693700 0.329600
+vn 0.686500 0.662800 0.298900
+vn 0.620700 0.743700 0.248100
+vn 0.665400 0.713800 0.218400
+vn 0.754400 0.631200 0.179700
+vn 0.745800 0.648200 0.153400
+vn 0.707200 0.681800 0.186700
+vn 0.715400 0.665200 0.213400
+vn 0.722900 0.647900 0.239900
+vn 0.762300 0.613500 0.205800
+vn 0.729600 0.629900 0.266200
+vn 0.769400 0.595200 0.231800
+vn 0.798400 0.577500 0.170000
+vn 0.790200 0.595600 0.144300
+vn 0.831300 0.539800 0.132500
+vn 0.822700 0.558200 0.107200
+vn 0.805800 0.558900 0.195600
+vn 0.839000 0.520800 0.157700
+vn 0.781200 0.613000 0.118400
+vn 0.813300 0.576000 0.081700
+vn 0.876900 0.479700 0.029100
+vn 0.866900 0.498500 0.004500
+vn 0.841900 0.537800 0.043600
+vn 0.851700 0.519500 0.068600
+vn 0.860500 0.500700 0.093600
+vn 0.886000 0.460500 0.053600
+vn 0.868500 0.481300 0.118400
+vn 0.894200 0.440800 0.078000
+vn 0.907700 0.419300 0.012500
+vn 0.898400 0.438900 -0.011500
+vn 0.925700 0.377100 -0.029600
+vn 0.916200 0.397100 -0.053200
+vn 0.916100 0.399200 0.036600
+vn 0.934200 0.356500 -0.005900
+vn 0.888100 0.458100 -0.035600
+vn 0.905700 0.416800 -0.076800
+vn 0.940000 0.311700 -0.138400
+vn 0.929300 0.332400 -0.161000
+vn 0.919500 0.374700 -0.118700
+vn 0.930100 0.354600 -0.095600
+vn 0.939700 0.334100 -0.072400
+vn 0.949700 0.290800 -0.115600
+vn 0.948400 0.313200 -0.049100
+vn 0.958500 0.269500 -0.092700
+vn 0.955800 0.247200 -0.159200
+vn 0.946000 0.268600 -0.181500
+vn 0.957800 0.203200 -0.203200
+vn 0.948000 0.225000 -0.225000
+vn 0.964600 0.225500 -0.136800
+vn 0.966600 0.181100 -0.181100
+vn 0.935200 0.289700 -0.203600
+vn 0.937200 0.246700 -0.246700
+vn 0.940000 0.138400 -0.311700
+vn 0.929300 0.161000 -0.332400
+vn 0.935200 0.203600 -0.289700
+vn 0.946000 0.181500 -0.268600
+vn 0.955800 0.159200 -0.247200
+vn 0.949700 0.115600 -0.290800
+vn 0.964600 0.136800 -0.225500
+vn 0.958500 0.092700 -0.269500
+vn 0.939700 0.072400 -0.334100
+vn 0.930100 0.095600 -0.354600
+vn 0.948400 0.049100 -0.313200
+vn 0.919500 0.118700 -0.374700
+vn 0.907700 -0.126700 -0.400000
+vn 0.901400 -0.102400 -0.420600
+vn 0.923500 -0.060600 -0.378700
+vn 0.929900 -0.084600 -0.357800
+vn 0.941800 -0.017800 -0.335700
+vn 0.948300 -0.041400 -0.314600
+vn 0.935400 -0.108400 -0.336600
+vn 0.913000 -0.150800 -0.379000
+vn 0.939800 -0.132200 -0.314900
+vn 0.917400 -0.174700 -0.357600
+vn 0.953900 -0.065000 -0.293000
+vn 0.958400 -0.088500 -0.271200
+vn 0.886800 -0.192000 -0.420400
+vn 0.881600 -0.167700 -0.441100
+vn 0.856700 -0.232200 -0.460600
+vn 0.851600 -0.207600 -0.481200
+vn 0.891000 -0.216200 -0.399100
+vn 0.860700 -0.256600 -0.439600
+vn 0.875500 -0.143100 -0.461400
+vn 0.845800 -0.182800 -0.501200
+vn 0.781100 -0.282800 -0.556700
+vn 0.775600 -0.257500 -0.576300
+vn 0.812400 -0.221000 -0.539600
+vn 0.818000 -0.246100 -0.519800
+vn 0.822800 -0.270900 -0.499500
+vn 0.785600 -0.307900 -0.536600
+vn 0.826800 -0.295500 -0.478600
+vn 0.789400 -0.332700 -0.515900
+vn 0.745000 -0.343100 -0.571900
+vn 0.740700 -0.317800 -0.591900
+vn 0.701100 -0.376500 -0.605500
+vn 0.697000 -0.351100 -0.625300
+vn 0.748600 -0.368100 -0.551400
+vn 0.704400 -0.401700 -0.585100
+vn 0.735600 -0.292200 -0.611200
+vn 0.692100 -0.325200 -0.644400
+vn 0.600700 -0.411100 -0.685600
+vn 0.596500 -0.384700 -0.704300
+vn 0.645600 -0.356100 -0.675500
+vn 0.650200 -0.382200 -0.656600
+vn 0.654000 -0.407900 -0.637000
+vn 0.604300 -0.437000 -0.666200
+vn 0.657200 -0.433200 -0.616800
+vn 0.607200 -0.462400 -0.646100
+vn 0.551900 -0.463700 -0.693100
+vn 0.548700 -0.437600 -0.712300
+vn 0.496900 -0.488000 -0.717600
+vn 0.493900 -0.461800 -0.736700
+vn 0.554600 -0.489300 -0.673100
+vn 0.499300 -0.513800 -0.697700
+vn 0.544800 -0.411100 -0.730800
+vn 0.490500 -0.435100 -0.755000
+vn 0.378400 -0.502300 -0.777500
+vn 0.375800 -0.475300 -0.795500
+vn 0.434000 -0.456600 -0.776600
+vn 0.437000 -0.483400 -0.758400
+vn 0.439600 -0.509800 -0.739400
+vn 0.380700 -0.528800 -0.758500
+vn 0.441800 -0.535700 -0.719600
+vn 0.382500 -0.554800 -0.738800
+vn 0.320000 -0.545100 -0.774900
+vn 0.318100 -0.518500 -0.793700
+vn 0.257600 -0.558500 -0.788400
+vn 0.256100 -0.531800 -0.807200
+vn 0.321500 -0.571100 -0.755200
+vn 0.258900 -0.584600 -0.768900
+vn 0.315900 -0.491300 -0.811600
+vn 0.254300 -0.504600 -0.825000
+vn 0.129200 -0.549800 -0.825200
+vn 0.128300 -0.522400 -0.843000
+vn 0.191600 -0.515000 -0.835500
+vn 0.193000 -0.542300 -0.817700
+vn 0.194100 -0.569000 -0.799000
+vn 0.130000 -0.576600 -0.806600
+vn 0.195000 -0.595200 -0.779500
+vn 0.130600 -0.602800 -0.787100
+vn 0.065300 -0.581100 -0.811200
+vn 0.064900 -0.554300 -0.829800
+vn 0.000000 -0.582700 -0.812700
+vn 0.000000 -0.555800 -0.831300
+vn 0.065600 -0.607400 -0.791700
+vn 0.000000 -0.608900 -0.793200
+vn 0.064400 -0.526800 -0.847500
+vn 0.000000 -0.528400 -0.849000
+vn -0.129200 -0.549800 -0.825200
+vn -0.128300 -0.522400 -0.843000
+vn -0.064400 -0.526800 -0.847500
+vn -0.064900 -0.554300 -0.829800
+vn -0.065300 -0.581100 -0.811200
+vn -0.130000 -0.576600 -0.806600
+vn -0.065600 -0.607400 -0.791700
+vn -0.130600 -0.602800 -0.787100
+vn -0.194100 -0.569000 -0.799000
+vn -0.193000 -0.542300 -0.817700
+vn -0.257600 -0.558500 -0.788400
+vn -0.256100 -0.531800 -0.807200
+vn -0.195000 -0.595200 -0.779500
+vn -0.258900 -0.584600 -0.768900
+vn -0.191600 -0.515000 -0.835500
+vn -0.254300 -0.504600 -0.825000
+vn -0.378400 -0.502300 -0.777500
+vn -0.375800 -0.475300 -0.795500
+vn -0.315900 -0.491300 -0.811600
+vn -0.318100 -0.518500 -0.793700
+vn -0.320000 -0.545100 -0.774900
+vn -0.380700 -0.528800 -0.758600
+vn -0.321500 -0.571100 -0.755200
+vn -0.382500 -0.554800 -0.738800
+vn -0.439600 -0.509800 -0.739400
+vn -0.437000 -0.483400 -0.758400
+vn -0.496900 -0.488000 -0.717600
+vn -0.493900 -0.461800 -0.736700
+vn -0.441800 -0.535700 -0.719600
+vn -0.499300 -0.513800 -0.697700
+vn -0.434000 -0.456600 -0.776600
+vn -0.490500 -0.435100 -0.755000
+vn -0.600700 -0.411100 -0.685600
+vn -0.596500 -0.384700 -0.704300
+vn -0.544800 -0.411100 -0.730800
+vn -0.548700 -0.437600 -0.712300
+vn -0.551900 -0.463700 -0.693100
+vn -0.604300 -0.437000 -0.666200
+vn -0.554600 -0.489300 -0.673100
+vn -0.607200 -0.462400 -0.646100
+vn -0.654000 -0.407900 -0.637000
+vn -0.650200 -0.382200 -0.656600
+vn -0.701100 -0.376500 -0.605500
+vn -0.697000 -0.351100 -0.625300
+vn -0.657200 -0.433200 -0.616800
+vn -0.704400 -0.401700 -0.585100
+vn -0.645600 -0.356100 -0.675500
+vn -0.692100 -0.325200 -0.644400
+vn -0.781100 -0.282800 -0.556700
+vn -0.775600 -0.257500 -0.576300
+vn -0.735600 -0.292200 -0.611200
+vn -0.740700 -0.317800 -0.591900
+vn -0.745000 -0.343100 -0.571900
+vn -0.785600 -0.307900 -0.536600
+vn -0.748600 -0.368100 -0.551400
+vn -0.789400 -0.332700 -0.515900
+vn -0.822800 -0.270900 -0.499500
+vn -0.818000 -0.246100 -0.519800
+vn -0.856700 -0.232200 -0.460600
+vn -0.851600 -0.207600 -0.481200
+vn -0.826800 -0.295500 -0.478600
+vn -0.860700 -0.256600 -0.439600
+vn -0.812400 -0.221000 -0.539600
+vn -0.845800 -0.182800 -0.501200
+vn -0.907700 -0.126700 -0.400000
+vn -0.901400 -0.102400 -0.420600
+vn -0.875500 -0.143100 -0.461400
+vn -0.881600 -0.167700 -0.441100
+vn -0.886800 -0.192000 -0.420400
+vn -0.913000 -0.150800 -0.379000
+vn -0.891000 -0.216200 -0.399100
+vn -0.917400 -0.174700 -0.357600
+vn -0.935400 -0.108400 -0.336600
+vn -0.929900 -0.084600 -0.357800
+vn -0.953900 -0.065000 -0.293000
+vn -0.948300 -0.041400 -0.314600
+vn -0.939800 -0.132200 -0.314900
+vn -0.958400 -0.088500 -0.271200
+vn -0.923500 -0.060600 -0.378700
+vn -0.941800 -0.017800 -0.335700
+vn -0.972900 0.046800 -0.226200
+vn -0.966200 0.069800 -0.248000
+vn -0.956100 0.025800 -0.292000
+vn -0.962700 0.002500 -0.270500
+vn -0.968300 -0.020800 -0.248800
+vn -0.978600 0.023700 -0.204200
+vn -0.972900 -0.044100 -0.226800
+vn -0.983300 0.000600 -0.182000
+vn -0.984800 0.068600 -0.159300
+vn -0.979100 0.091400 -0.181500
+vn -0.986900 0.114000 -0.114000
+vn -0.981200 0.136500 -0.136500
+vn -0.989500 0.045700 -0.136800
+vn -0.991600 0.091300 -0.091300
+vn -0.972400 0.114100 -0.203600
+vn -0.974400 0.158900 -0.158900
+vn -0.972900 0.226200 -0.046800
+vn -0.966200 0.248000 -0.069800
+vn -0.972400 0.203600 -0.114100
+vn -0.979100 0.181500 -0.091400
+vn -0.984800 0.159300 -0.068600
+vn -0.978600 0.204200 -0.023700
+vn -0.989500 0.136800 -0.045700
+vn -0.983300 0.182000 -0.000600
+vn -0.968300 0.248800 0.020800
+vn -0.962700 0.270500 -0.002500
+vn -0.953900 0.293000 0.065000
+vn -0.948300 0.314600 0.041400
+vn -0.972900 0.226800 0.044100
+vn -0.958400 0.271200 0.088500
+vn -0.956100 0.292000 -0.025800
+vn -0.941800 0.335700 0.017800
+vn -0.907700 0.400000 0.126700
+vn -0.901400 0.420600 0.102400
+vn -0.923500 0.378700 0.060600
+vn -0.929900 0.357800 0.084600
+vn -0.935400 0.336600 0.108400
+vn -0.913000 0.379000 0.150800
+vn -0.939800 0.314900 0.132200
+vn -0.917400 0.357600 0.174700
+vn -0.886800 0.420400 0.192000
+vn -0.881600 0.441100 0.167700
+vn -0.856700 0.460600 0.232200
+vn -0.851600 0.481200 0.207600
+vn -0.891000 0.399100 0.216200
+vn -0.860700 0.439600 0.256600
+vn -0.875500 0.461400 0.143100
+vn -0.845800 0.501200 0.182800
+vn -0.781100 0.556700 0.282800
+vn -0.775600 0.576300 0.257500
+vn -0.812400 0.539600 0.221000
+vn -0.818000 0.519800 0.246100
+vn -0.822800 0.499500 0.270900
+vn -0.785600 0.536600 0.307900
+vn -0.826800 0.478600 0.295500
+vn -0.789400 0.515900 0.332700
+vn -0.745000 0.571900 0.343100
+vn -0.740700 0.591900 0.317800
+vn -0.701100 0.605500 0.376500
+vn -0.697000 0.625300 0.351100
+vn -0.748600 0.551400 0.368100
+vn -0.704400 0.585100 0.401700
+vn -0.735600 0.611200 0.292200
+vn -0.692100 0.644400 0.325200
+vn -0.600700 0.685600 0.411100
+vn -0.596500 0.704300 0.384700
+vn -0.645600 0.675500 0.356100
+vn -0.650200 0.656600 0.382200
+vn -0.654000 0.637000 0.407900
+vn -0.604300 0.666200 0.437000
+vn -0.657200 0.616800 0.433200
+vn -0.607200 0.646100 0.462400
+vn -0.551900 0.693100 0.463700
+vn -0.548700 0.712300 0.437600
+vn -0.496900 0.717600 0.488100
+vn -0.493900 0.736700 0.461800
+vn -0.554600 0.673100 0.489300
+vn -0.499300 0.697700 0.513800
+vn -0.544800 0.730800 0.411100
+vn -0.490500 0.755000 0.435100
+vn -0.378400 0.777500 0.502300
+vn -0.375800 0.795500 0.475300
+vn -0.434000 0.776600 0.456600
+vn -0.437000 0.758400 0.483400
+vn -0.439600 0.739400 0.509800
+vn -0.380700 0.758500 0.528800
+vn -0.441800 0.719600 0.535700
+vn -0.382500 0.738800 0.554800
+vn -0.320000 0.774900 0.545100
+vn -0.318100 0.793700 0.518500
+vn -0.257600 0.788400 0.558500
+vn -0.256100 0.807200 0.531800
+vn -0.321500 0.755200 0.571100
+vn -0.258900 0.768900 0.584600
+vn -0.315900 0.811600 0.491300
+vn -0.254300 0.825000 0.504600
+vn -0.129200 0.825200 0.549800
+vn -0.128300 0.843000 0.522400
+vn -0.191600 0.835500 0.515000
+vn -0.193000 0.817700 0.542300
+vn -0.194100 0.799000 0.569000
+vn -0.130000 0.806600 0.576600
+vn -0.195000 0.779500 0.595200
+vn -0.130600 0.787100 0.602800
+vn -0.065300 0.811200 0.581100
+vn -0.064900 0.829800 0.554300
+vn 0.000000 0.812700 0.582700
+vn 0.000000 0.831300 0.555800
+vn -0.065600 0.791700 0.607400
+vn 0.000000 0.793200 0.608900
+vn -0.064400 0.847500 0.526800
+vn 0.000000 0.849000 0.528400
+vn 0.129200 0.825200 0.549800
+vn 0.128300 0.843000 0.522400
+vn 0.064400 0.847500 0.526800
+vn 0.064900 0.829800 0.554300
+vn 0.065300 0.811200 0.581100
+vn 0.130000 0.806600 0.576600
+vn 0.065600 0.791700 0.607400
+vn 0.130600 0.787100 0.602800
+vn 0.194100 0.799000 0.569000
+vn 0.193000 0.817700 0.542300
+vn 0.257600 0.788400 0.558500
+vn 0.256100 0.807200 0.531800
+vn 0.195000 0.779500 0.595200
+vn 0.258900 0.768900 0.584600
+vn 0.191600 0.835500 0.515000
+vn 0.254300 0.825000 0.504600
+vn 0.378400 0.777500 0.502300
+vn 0.375800 0.795500 0.475300
+vn 0.315900 0.811600 0.491300
+vn 0.318100 0.793700 0.518500
+vn 0.320000 0.774900 0.545100
+vn 0.380700 0.758500 0.528800
+vn 0.321500 0.755200 0.571100
+vn 0.382500 0.738800 0.554800
+vn 0.439600 0.739400 0.509800
+vn 0.437000 0.758400 0.483400
+vn 0.496900 0.717600 0.488000
+vn 0.493900 0.736700 0.461800
+vn 0.441800 0.719600 0.535700
+vn 0.499300 0.697700 0.513800
+vn 0.434000 0.776600 0.456600
+vn 0.490500 0.755000 0.435100
+vn 0.600700 0.685600 0.411100
+vn 0.596500 0.704300 0.384700
+vn 0.544800 0.730800 0.411100
+vn 0.548700 0.712300 0.437600
+vn 0.551900 0.693100 0.463700
+vn 0.604300 0.666200 0.437000
+vn 0.554600 0.673100 0.489300
+vn 0.607200 0.646100 0.462400
+vn 0.654000 0.637000 0.407900
+vn 0.650200 0.656600 0.382200
+vn 0.701100 0.605500 0.376500
+vn 0.697000 0.625300 0.351100
+vn 0.657200 0.616800 0.433200
+vn 0.704400 0.585100 0.401700
+vn 0.645600 0.675500 0.356100
+vn 0.692100 0.644400 0.325200
+vn 0.781100 0.556700 0.282800
+vn 0.775600 0.576300 0.257500
+vn 0.735600 0.611200 0.292200
+vn 0.740700 0.591900 0.317800
+vn 0.745000 0.571900 0.343100
+vn 0.785600 0.536600 0.307900
+vn 0.748600 0.551400 0.368100
+vn 0.789400 0.515900 0.332700
+vn 0.822800 0.499500 0.270900
+vn 0.818000 0.519800 0.246100
+vn 0.856700 0.460600 0.232200
+vn 0.851600 0.481200 0.207600
+vn 0.826800 0.478600 0.295500
+vn 0.860700 0.439600 0.256600
+vn 0.812400 0.539600 0.221000
+vn 0.845800 0.501200 0.182800
+vn 0.907700 0.400000 0.126700
+vn 0.901400 0.420600 0.102400
+vn 0.875500 0.461400 0.143100
+vn 0.881600 0.441100 0.167700
+vn 0.886800 0.420400 0.192000
+vn 0.913000 0.379000 0.150800
+vn 0.891000 0.399100 0.216200
+vn 0.917400 0.357600 0.174700
+vn 0.935400 0.336600 0.108400
+vn 0.929900 0.357800 0.084600
+vn 0.953900 0.293000 0.065000
+vn 0.948300 0.314500 0.041400
+vn 0.939800 0.315000 0.132200
+vn 0.958400 0.271200 0.088500
+vn 0.923500 0.378700 0.060600
+vn 0.941800 0.335700 0.017800
+vn 0.972900 0.226200 -0.046800
+vn 0.966200 0.248000 -0.069800
+vn 0.956100 0.292000 -0.025800
+vn 0.962700 0.270500 -0.002500
+vn 0.968300 0.248800 0.020800
+vn 0.978600 0.204200 -0.023700
+vn 0.972900 0.226800 0.044100
+vn 0.983300 0.182000 -0.000600
+vn 0.984800 0.159300 -0.068600
+vn 0.979100 0.181500 -0.091400
+vn 0.986900 0.114000 -0.114000
+vn 0.981200 0.136500 -0.136500
+vn 0.989500 0.136800 -0.045700
+vn 0.991600 0.091300 -0.091300
+vn 0.972400 0.203600 -0.114100
+vn 0.974400 0.158900 -0.158900
+vn 0.972900 0.046800 -0.226200
+vn 0.966200 0.069800 -0.248000
+vn 0.972400 0.114100 -0.203600
+vn 0.979100 0.091400 -0.181500
+vn 0.984800 0.068600 -0.159300
+vn 0.978600 0.023700 -0.204200
+vn 0.989500 0.045700 -0.136800
+vn 0.983300 0.000600 -0.182000
+vn 0.968300 -0.020800 -0.248800
+vn 0.962700 0.002500 -0.270500
+vn 0.972900 -0.044100 -0.226800
+vn 0.956100 0.025800 -0.292000
+vn 0.923200 -0.222000 -0.313600
+vn 0.920800 -0.198500 -0.335800
+vn 0.943300 -0.155800 -0.293000
+vn 0.945800 -0.179200 -0.270800
+vn 0.962000 -0.111900 -0.249100
+vn 0.964500 -0.135200 -0.226800
+vn 0.947300 -0.202400 -0.248200
+vn 0.924600 -0.245300 -0.291200
+vn 0.947800 -0.225400 -0.225400
+vn 0.925100 -0.268400 -0.268400
+vn 0.966000 -0.158400 -0.204200
+vn 0.966500 -0.181400 -0.181400
+vn 0.898100 -0.287100 -0.333000
+vn 0.896700 -0.263800 -0.355400
+vn 0.867600 -0.327900 -0.373800
+vn 0.866200 -0.304400 -0.396100
+vn 0.898600 -0.310300 -0.310300
+vn 0.868100 -0.351000 -0.351000
+vn 0.894300 -0.240100 -0.377500
+vn 0.863900 -0.280600 -0.418100
+vn 0.794400 -0.381100 -0.472900
+vn 0.792400 -0.357100 -0.494600
+vn 0.829900 -0.319700 -0.457200
+vn 0.832100 -0.343600 -0.435400
+vn 0.833400 -0.367200 -0.413100
+vn 0.795700 -0.404700 -0.450600
+vn 0.833800 -0.390300 -0.390300
+vn 0.796100 -0.427900 -0.427900
+vn 0.754600 -0.440400 -0.486400
+vn 0.753400 -0.416700 -0.508600
+vn 0.710100 -0.474300 -0.520300
+vn 0.708900 -0.450600 -0.542500
+vn 0.755000 -0.463600 -0.463600
+vn 0.710400 -0.497600 -0.497600
+vn 0.751400 -0.392600 -0.530300
+vn 0.707100 -0.426400 -0.564100
+vn 0.611100 -0.511800 -0.603800
+vn 0.609500 -0.487400 -0.625300
+vn 0.659600 -0.458100 -0.595900
+vn 0.661400 -0.482400 -0.574400
+vn 0.662400 -0.506200 -0.552200
+vn 0.612000 -0.535700 -0.581700
+vn 0.662800 -0.529500 -0.529500
+vn 0.612400 -0.559000 -0.559000
+vn 0.559000 -0.562800 -0.608900
+vn 0.558100 -0.538800 -0.630900
+vn 0.503300 -0.587500 -0.633600
+vn 0.502500 -0.563500 -0.655700
+vn 0.559300 -0.586100 -0.586100
+vn 0.503600 -0.610900 -0.610900
+vn 0.556700 -0.514400 -0.652300
+vn 0.501100 -0.539000 -0.677000
+vn 0.385000 -0.604800 -0.697100
+vn 0.383900 -0.580100 -0.718300
+vn 0.443400 -0.560900 -0.699100
+vn 0.444600 -0.585600 -0.677800
+vn 0.445300 -0.609600 -0.655800
+vn 0.385600 -0.628900 -0.675100
+vn 0.445500 -0.633000 -0.633000
+vn 0.385800 -0.652400 -0.652400
+vn 0.324100 -0.645400 -0.691600
+vn 0.323600 -0.621300 -0.713600
+vn 0.261000 -0.659100 -0.705300
+vn 0.260500 -0.635000 -0.727300
+vn 0.324300 -0.668900 -0.668900
+vn 0.261100 -0.682500 -0.682500
+vn 0.322800 -0.596500 -0.734800
+vn 0.259900 -0.610100 -0.748400
+vn 0.131400 -0.653200 -0.745600
+vn 0.131100 -0.628400 -0.766700
+vn 0.195800 -0.620800 -0.759100
+vn 0.196300 -0.645600 -0.737900
+vn 0.196600 -0.669800 -0.716000
+vn 0.131700 -0.677400 -0.723700
+vn 0.196700 -0.693300 -0.693300
+vn 0.131700 -0.700900 -0.700900
+vn 0.066100 -0.682100 -0.728300
+vn 0.066000 -0.657900 -0.750200
+vn 0.000000 -0.683600 -0.729800
+vn 0.000000 -0.659400 -0.751800
+vn 0.066200 -0.705600 -0.705500
+vn 0.000000 -0.707100 -0.707100
+vn 0.065800 -0.633000 -0.771400
+vn 0.000000 -0.634500 -0.772900
+vn -0.131400 -0.653200 -0.745600
+vn -0.131100 -0.628400 -0.766700
+vn -0.065800 -0.633000 -0.771400
+vn -0.066000 -0.657900 -0.750200
+vn -0.066100 -0.682100 -0.728300
+vn -0.131700 -0.677400 -0.723700
+vn -0.066200 -0.705600 -0.705500
+vn -0.131700 -0.700900 -0.700900
+vn -0.196600 -0.669800 -0.716000
+vn -0.196300 -0.645600 -0.738000
+vn -0.261000 -0.659100 -0.705300
+vn -0.260500 -0.635000 -0.727300
+vn -0.196700 -0.693300 -0.693300
+vn -0.261100 -0.682500 -0.682500
+vn -0.195800 -0.620800 -0.759100
+vn -0.259900 -0.610100 -0.748400
+vn -0.385000 -0.604800 -0.697100
+vn -0.383900 -0.580100 -0.718300
+vn -0.322800 -0.596500 -0.734800
+vn -0.323600 -0.621300 -0.713600
+vn -0.324100 -0.645400 -0.691600
+vn -0.385600 -0.628900 -0.675100
+vn -0.324300 -0.668900 -0.668900
+vn -0.385800 -0.652300 -0.652400
+vn -0.445300 -0.609600 -0.655800
+vn -0.444600 -0.585600 -0.677800
+vn -0.503300 -0.587500 -0.633600
+vn -0.502500 -0.563500 -0.655700
+vn -0.445500 -0.633000 -0.633000
+vn -0.503600 -0.610900 -0.610900
+vn -0.443400 -0.560900 -0.699100
+vn -0.501100 -0.539000 -0.677000
+vn -0.611100 -0.511800 -0.603800
+vn -0.609500 -0.487400 -0.625300
+vn -0.556700 -0.514400 -0.652300
+vn -0.558100 -0.538800 -0.630900
+vn -0.559000 -0.562800 -0.608900
+vn -0.612000 -0.535700 -0.581700
+vn -0.559300 -0.586100 -0.586100
+vn -0.612400 -0.559000 -0.559000
+vn -0.662400 -0.506200 -0.552200
+vn -0.661400 -0.482400 -0.574300
+vn -0.710100 -0.474300 -0.520300
+vn -0.708900 -0.450600 -0.542500
+vn -0.662800 -0.529500 -0.529500
+vn -0.710400 -0.497600 -0.497600
+vn -0.659600 -0.458100 -0.595900
+vn -0.707100 -0.426400 -0.564100
+vn -0.794400 -0.381100 -0.472900
+vn -0.792400 -0.357100 -0.494600
+vn -0.751400 -0.392600 -0.530300
+vn -0.753400 -0.416700 -0.508600
+vn -0.754600 -0.440400 -0.486400
+vn -0.795700 -0.404700 -0.450600
+vn -0.755000 -0.463600 -0.463600
+vn -0.796100 -0.427900 -0.427900
+vn -0.833400 -0.367200 -0.413100
+vn -0.832100 -0.343600 -0.435400
+vn -0.867600 -0.327900 -0.373800
+vn -0.866200 -0.304400 -0.396100
+vn -0.833800 -0.390300 -0.390300
+vn -0.868100 -0.351000 -0.351000
+vn -0.829900 -0.319700 -0.457200
+vn -0.863900 -0.280600 -0.418100
+vn -0.923200 -0.222000 -0.313600
+vn -0.920800 -0.198500 -0.335800
+vn -0.894300 -0.240100 -0.377500
+vn -0.896700 -0.263800 -0.355400
+vn -0.898100 -0.287100 -0.333000
+vn -0.924600 -0.245300 -0.291200
+vn -0.898600 -0.310300 -0.310300
+vn -0.925100 -0.268400 -0.268400
+vn -0.947300 -0.202400 -0.248200
+vn -0.945800 -0.179200 -0.270800
+vn -0.966000 -0.158400 -0.204200
+vn -0.964500 -0.135200 -0.226800
+vn -0.947800 -0.225400 -0.225400
+vn -0.966500 -0.181400 -0.181400
+vn -0.943300 -0.155800 -0.293000
+vn -0.962000 -0.111900 -0.249100
+vn -0.989500 -0.045500 -0.137000
+vn -0.986900 -0.022400 -0.159600
+vn -0.976500 -0.067400 -0.204500
+vn -0.979100 -0.090500 -0.182000
+vn -0.980600 -0.113600 -0.159400
+vn -0.991100 -0.068500 -0.114300
+vn -0.981100 -0.136600 -0.136600
+vn -0.991600 -0.091400 -0.091400
+vn -0.997300 -0.023000 -0.068800
+vn -0.995800 -0.000100 -0.091600
+vn -0.999500 0.022900 -0.022900
+vn -0.997900 0.045700 -0.045700
+vn -0.997900 -0.045900 -0.045900
+vn -0.993200 0.022800 -0.114200
+vn -0.995300 0.068500 -0.068500
+vn -0.989500 0.137000 0.045500
+vn -0.986900 0.159600 0.022400
+vn -0.993200 0.114200 -0.022800
+vn -0.995800 0.091600 0.000100
+vn -0.997300 0.068800 0.023000
+vn -0.991100 0.114300 0.068500
+vn -0.997900 0.045900 0.045900
+vn -0.991600 0.091400 0.091400
+vn -0.980600 0.159400 0.113600
+vn -0.979100 0.182000 0.090500
+vn -0.966000 0.204200 0.158400
+vn -0.964500 0.226800 0.135200
+vn -0.981100 0.136600 0.136600
+vn -0.966500 0.181400 0.181400
+vn -0.976500 0.204500 0.067400
+vn -0.962000 0.249100 0.111900
+vn -0.923200 0.313600 0.222000
+vn -0.920800 0.335800 0.198500
+vn -0.943300 0.293000 0.155800
+vn -0.945800 0.270800 0.179200
+vn -0.947300 0.248200 0.202400
+vn -0.924600 0.291200 0.245300
+vn -0.947800 0.225400 0.225400
+vn -0.925100 0.268400 0.268400
+vn -0.898100 0.333000 0.287100
+vn -0.896700 0.355400 0.263800
+vn -0.867600 0.373800 0.327900
+vn -0.866200 0.396100 0.304400
+vn -0.898600 0.310300 0.310300
+vn -0.868100 0.351000 0.351000
+vn -0.894300 0.377500 0.240100
+vn -0.863900 0.418100 0.280600
+vn -0.794400 0.472900 0.381100
+vn -0.792400 0.494600 0.357100
+vn -0.829900 0.457200 0.319700
+vn -0.832100 0.435400 0.343600
+vn -0.833400 0.413100 0.367200
+vn -0.795700 0.450600 0.404700
+vn -0.833800 0.390300 0.390300
+vn -0.796100 0.427900 0.427900
+vn -0.754600 0.486400 0.440400
+vn -0.753400 0.508600 0.416700
+vn -0.710100 0.520300 0.474300
+vn -0.708900 0.542500 0.450600
+vn -0.755000 0.463600 0.463600
+vn -0.710400 0.497600 0.497600
+vn -0.751400 0.530300 0.392600
+vn -0.707100 0.564100 0.426400
+vn -0.611100 0.603800 0.511800
+vn -0.609500 0.625300 0.487400
+vn -0.659600 0.595900 0.458100
+vn -0.661400 0.574300 0.482400
+vn -0.662400 0.552200 0.506200
+vn -0.612000 0.581700 0.535700
+vn -0.662800 0.529500 0.529500
+vn -0.612400 0.559000 0.559000
+vn -0.559000 0.608900 0.562800
+vn -0.558100 0.630900 0.538800
+vn -0.503300 0.633600 0.587500
+vn -0.502500 0.655700 0.563500
+vn -0.559300 0.586100 0.586100
+vn -0.503600 0.610900 0.610900
+vn -0.556700 0.652300 0.514400
+vn -0.501100 0.677000 0.539000
+vn -0.385000 0.697100 0.604800
+vn -0.383900 0.718300 0.580100
+vn -0.443400 0.699100 0.560900
+vn -0.444600 0.677800 0.585600
+vn -0.445300 0.655800 0.609600
+vn -0.385600 0.675100 0.628900
+vn -0.445500 0.633000 0.633000
+vn -0.385800 0.652400 0.652400
+vn -0.324100 0.691600 0.645400
+vn -0.323600 0.713600 0.621300
+vn -0.261000 0.705300 0.659100
+vn -0.260500 0.727300 0.635000
+vn -0.324300 0.668900 0.668900
+vn -0.261100 0.682500 0.682500
+vn -0.322800 0.734800 0.596500
+vn -0.259900 0.748400 0.610100
+vn -0.131400 0.745600 0.653200
+vn -0.131100 0.766700 0.628400
+vn -0.195800 0.759100 0.620800
+vn -0.196300 0.737900 0.645600
+vn -0.196600 0.716000 0.669800
+vn -0.131700 0.723700 0.677400
+vn -0.196700 0.693300 0.693300
+vn -0.131700 0.700900 0.700900
+vn -0.066100 0.728300 0.682100
+vn -0.066000 0.750200 0.657900
+vn 0.000000 0.729800 0.683600
+vn 0.000000 0.751800 0.659400
+vn -0.066200 0.705500 0.705500
+vn 0.000000 0.707100 0.707100
+vn -0.065800 0.771400 0.633000
+vn 0.000000 0.772900 0.634500
+vn 0.131400 0.745600 0.653200
+vn 0.131100 0.766700 0.628400
+vn 0.065800 0.771400 0.633000
+vn 0.066000 0.750200 0.657900
+vn 0.066100 0.728300 0.682100
+vn 0.131700 0.723700 0.677400
+vn 0.066200 0.705600 0.705500
+vn 0.131700 0.700900 0.700900
+vn 0.196600 0.716000 0.669800
+vn 0.196300 0.737900 0.645600
+vn 0.261000 0.705300 0.659100
+vn 0.260500 0.727300 0.635000
+vn 0.196700 0.693300 0.693300
+vn 0.261100 0.682500 0.682500
+vn 0.195800 0.759100 0.620800
+vn 0.259900 0.748400 0.610100
+vn 0.385000 0.697100 0.604800
+vn 0.383900 0.718300 0.580100
+vn 0.322800 0.734800 0.596500
+vn 0.323600 0.713600 0.621300
+vn 0.324100 0.691600 0.645400
+vn 0.385600 0.675100 0.628900
+vn 0.324300 0.668900 0.668900
+vn 0.385800 0.652400 0.652400
+vn 0.445300 0.655800 0.609600
+vn 0.444600 0.677800 0.585600
+vn 0.503300 0.633600 0.587500
+vn 0.502500 0.655700 0.563500
+vn 0.445500 0.633000 0.633000
+vn 0.503600 0.610900 0.610900
+vn 0.443400 0.699100 0.560900
+vn 0.501100 0.677000 0.539000
+vn 0.611100 0.603800 0.511800
+vn 0.609500 0.625300 0.487400
+vn 0.556700 0.652300 0.514400
+vn 0.558100 0.630900 0.538800
+vn 0.559000 0.608900 0.562800
+vn 0.612000 0.581700 0.535700
+vn 0.559300 0.586100 0.586100
+vn 0.612400 0.559000 0.559000
+vn 0.662400 0.552200 0.506200
+vn 0.661400 0.574300 0.482400
+vn 0.710100 0.520300 0.474300
+vn 0.708900 0.542500 0.450600
+vn 0.662800 0.529500 0.529500
+vn 0.710400 0.497600 0.497600
+vn 0.659600 0.595900 0.458100
+vn 0.707100 0.564100 0.426400
+vn 0.794400 0.472900 0.381100
+vn 0.792400 0.494600 0.357100
+vn 0.751400 0.530300 0.392600
+vn 0.753400 0.508600 0.416700
+vn 0.754600 0.486400 0.440400
+vn 0.795700 0.450600 0.404700
+vn 0.755000 0.463600 0.463600
+vn 0.796100 0.427900 0.427900
+vn 0.833400 0.413100 0.367200
+vn 0.832100 0.435400 0.343600
+vn 0.867600 0.373800 0.327900
+vn 0.866200 0.396100 0.304400
+vn 0.833800 0.390300 0.390300
+vn 0.868100 0.351000 0.351000
+vn 0.829900 0.457200 0.319700
+vn 0.863900 0.418100 0.280600
+vn 0.923200 0.313600 0.222000
+vn 0.920800 0.335800 0.198500
+vn 0.894300 0.377500 0.240100
+vn 0.896700 0.355400 0.263800
+vn 0.898100 0.333000 0.287100
+vn 0.924600 0.291200 0.245300
+vn 0.898600 0.310300 0.310300
+vn 0.925100 0.268400 0.268400
+vn 0.947300 0.248200 0.202400
+vn 0.945800 0.270800 0.179200
+vn 0.966000 0.204200 0.158400
+vn 0.964500 0.226800 0.135200
+vn 0.947800 0.225400 0.225400
+vn 0.966500 0.181400 0.181400
+vn 0.943300 0.293000 0.155800
+vn 0.962000 0.249100 0.111900
+vn 0.989500 0.137000 0.045500
+vn 0.986900 0.159600 0.022400
+vn 0.976500 0.204500 0.067400
+vn 0.979100 0.182000 0.090500
+vn 0.980600 0.159400 0.113600
+vn 0.991100 0.114300 0.068500
+vn 0.981100 0.136600 0.136600
+vn 0.991600 0.091400 0.091400
+vn 0.997300 0.068800 0.023000
+vn 0.995800 0.091600 0.000100
+vn 0.999500 0.022900 -0.022900
+vn 0.997900 0.045700 -0.045700
+vn 0.997900 0.045900 0.045900
+vn 0.993200 0.114200 -0.022800
+vn 0.995300 0.068500 -0.068500
+vn 0.989500 -0.045500 -0.137000
+vn 0.986900 -0.022400 -0.159600
+vn 0.993200 0.022800 -0.114200
+vn 0.995800 -0.000100 -0.091600
+vn 0.997300 -0.023000 -0.068800
+vn 0.991100 -0.068500 -0.114300
+vn 0.997900 -0.045900 -0.045900
+vn 0.991600 -0.091400 -0.091400
+vn 0.980600 -0.113600 -0.159400
+vn 0.979100 -0.090500 -0.182000
+vn 0.981100 -0.136600 -0.136600
+vn 0.976500 -0.067400 -0.204500
+vn 0.923200 -0.313600 -0.222000
+vn 0.924600 -0.291200 -0.245300
+vn 0.947300 -0.248200 -0.202400
+vn 0.945800 -0.270800 -0.179200
+vn 0.966000 -0.204200 -0.158400
+vn 0.964500 -0.226800 -0.135200
+vn 0.943300 -0.293000 -0.155800
+vn 0.920800 -0.335800 -0.198500
+vn 0.939800 -0.315000 -0.132200
+vn 0.917400 -0.357600 -0.174700
+vn 0.962000 -0.249100 -0.111900
+vn 0.958400 -0.271200 -0.088500
+vn 0.894300 -0.377500 -0.240100
+vn 0.896700 -0.355400 -0.263800
+vn 0.863900 -0.418100 -0.280600
+vn 0.866200 -0.396100 -0.304400
+vn 0.891000 -0.399100 -0.216200
+vn 0.860700 -0.439600 -0.256600
+vn 0.898100 -0.333000 -0.287100
+vn 0.867600 -0.373800 -0.327900
+vn 0.794400 -0.472900 -0.381100
+vn 0.795700 -0.450600 -0.404700
+vn 0.833400 -0.413100 -0.367200
+vn 0.832100 -0.435400 -0.343600
+vn 0.829900 -0.457200 -0.319700
+vn 0.792400 -0.494600 -0.357100
+vn 0.826800 -0.478600 -0.295500
+vn 0.789400 -0.515900 -0.332700
+vn 0.751400 -0.530300 -0.392600
+vn 0.753400 -0.508600 -0.416700
+vn 0.707100 -0.564100 -0.426400
+vn 0.708900 -0.542500 -0.450600
+vn 0.748600 -0.551400 -0.368100
+vn 0.704400 -0.585100 -0.401700
+vn 0.754600 -0.486400 -0.440400
+vn 0.710100 -0.520300 -0.474300
+vn 0.611100 -0.603800 -0.511800
+vn 0.612000 -0.581700 -0.535700
+vn 0.662400 -0.552200 -0.506200
+vn 0.661400 -0.574400 -0.482400
+vn 0.659600 -0.595900 -0.458100
+vn 0.609500 -0.625300 -0.487400
+vn 0.657200 -0.616800 -0.433200
+vn 0.607200 -0.646100 -0.462400
+vn 0.556700 -0.652300 -0.514300
+vn 0.558200 -0.630900 -0.538800
+vn 0.501100 -0.677000 -0.539000
+vn 0.502500 -0.655700 -0.563500
+vn 0.554600 -0.673100 -0.489300
+vn 0.499300 -0.697700 -0.513800
+vn 0.559000 -0.608900 -0.562800
+vn 0.503300 -0.633600 -0.587500
+vn 0.385000 -0.697100 -0.604800
+vn 0.385600 -0.675100 -0.628900
+vn 0.445300 -0.655800 -0.609600
+vn 0.444600 -0.677800 -0.585600
+vn 0.443400 -0.699100 -0.560900
+vn 0.383900 -0.718300 -0.580100
+vn 0.441800 -0.719600 -0.535700
+vn 0.382500 -0.738800 -0.554800
+vn 0.322800 -0.734800 -0.596500
+vn 0.323600 -0.713600 -0.621300
+vn 0.259900 -0.748400 -0.610100
+vn 0.260500 -0.727300 -0.635000
+vn 0.321500 -0.755200 -0.571100
+vn 0.258900 -0.768900 -0.584600
+vn 0.324100 -0.691600 -0.645400
+vn 0.261000 -0.705300 -0.659100
+vn 0.131400 -0.745600 -0.653200
+vn 0.131700 -0.723700 -0.677400
+vn 0.196600 -0.716000 -0.669800
+vn 0.196300 -0.738000 -0.645600
+vn 0.195800 -0.759100 -0.620800
+vn 0.131100 -0.766700 -0.628400
+vn 0.195000 -0.779500 -0.595200
+vn 0.130600 -0.787100 -0.602800
+vn 0.065800 -0.771400 -0.633000
+vn 0.066000 -0.750200 -0.657900
+vn 0.000000 -0.772900 -0.634500
+vn 0.000000 -0.751800 -0.659400
+vn 0.065600 -0.791700 -0.607400
+vn 0.000000 -0.793200 -0.608900
+vn 0.066100 -0.728300 -0.682100
+vn 0.000000 -0.729800 -0.683600
+vn -0.131400 -0.745600 -0.653200
+vn -0.131700 -0.723700 -0.677400
+vn -0.066100 -0.728300 -0.682100
+vn -0.066000 -0.750200 -0.657900
+vn -0.065800 -0.771400 -0.633000
+vn -0.131100 -0.766700 -0.628400
+vn -0.065600 -0.791700 -0.607400
+vn -0.130600 -0.787100 -0.602800
+vn -0.195800 -0.759100 -0.620800
+vn -0.196300 -0.738000 -0.645600
+vn -0.259900 -0.748400 -0.610100
+vn -0.260500 -0.727300 -0.635000
+vn -0.195000 -0.779500 -0.595200
+vn -0.258900 -0.768900 -0.584600
+vn -0.196600 -0.716000 -0.669800
+vn -0.261000 -0.705300 -0.659100
+vn -0.385000 -0.697100 -0.604800
+vn -0.385600 -0.675100 -0.628900
+vn -0.324100 -0.691600 -0.645400
+vn -0.323600 -0.713600 -0.621300
+vn -0.322800 -0.734800 -0.596500
+vn -0.383900 -0.718300 -0.580100
+vn -0.321500 -0.755200 -0.571100
+vn -0.382500 -0.738800 -0.554800
+vn -0.443400 -0.699100 -0.560900
+vn -0.444600 -0.677800 -0.585600
+vn -0.501100 -0.677000 -0.539000
+vn -0.502500 -0.655700 -0.563500
+vn -0.441800 -0.719600 -0.535700
+vn -0.499300 -0.697700 -0.513800
+vn -0.445300 -0.655800 -0.609600
+vn -0.503300 -0.633600 -0.587500
+vn -0.611100 -0.603800 -0.511800
+vn -0.612000 -0.581700 -0.535700
+vn -0.559000 -0.608900 -0.562800
+vn -0.558100 -0.630900 -0.538800
+vn -0.556700 -0.652300 -0.514400
+vn -0.609500 -0.625300 -0.487400
+vn -0.554600 -0.673100 -0.489300
+vn -0.607200 -0.646100 -0.462400
+vn -0.659600 -0.595900 -0.458100
+vn -0.661400 -0.574400 -0.482400
+vn -0.707100 -0.564100 -0.426400
+vn -0.708900 -0.542500 -0.450600
+vn -0.657200 -0.616800 -0.433200
+vn -0.704400 -0.585100 -0.401700
+vn -0.662400 -0.552200 -0.506200
+vn -0.710100 -0.520300 -0.474300
+vn -0.794400 -0.472900 -0.381100
+vn -0.795700 -0.450600 -0.404700
+vn -0.754600 -0.486400 -0.440400
+vn -0.753400 -0.508600 -0.416700
+vn -0.751400 -0.530300 -0.392600
+vn -0.792400 -0.494600 -0.357100
+vn -0.748600 -0.551400 -0.368100
+vn -0.789400 -0.515900 -0.332700
+vn -0.829900 -0.457200 -0.319700
+vn -0.832100 -0.435400 -0.343600
+vn -0.863900 -0.418100 -0.280600
+vn -0.866200 -0.396100 -0.304400
+vn -0.826800 -0.478600 -0.295500
+vn -0.860700 -0.439600 -0.256600
+vn -0.833400 -0.413100 -0.367200
+vn -0.867600 -0.373800 -0.327900
+vn -0.923200 -0.313600 -0.222000
+vn -0.924600 -0.291200 -0.245300
+vn -0.898100 -0.333000 -0.287100
+vn -0.896700 -0.355400 -0.263800
+vn -0.894300 -0.377500 -0.240100
+vn -0.920800 -0.335800 -0.198500
+vn -0.891000 -0.399100 -0.216200
+vn -0.917400 -0.357600 -0.174700
+vn -0.943300 -0.293000 -0.155800
+vn -0.945800 -0.270800 -0.179200
+vn -0.962000 -0.249100 -0.111900
+vn -0.964500 -0.226800 -0.135200
+vn -0.939800 -0.314900 -0.132200
+vn -0.958400 -0.271200 -0.088500
+vn -0.947300 -0.248200 -0.202400
+vn -0.966000 -0.204200 -0.158400
+vn -0.989500 -0.137000 -0.045500
+vn -0.991100 -0.114300 -0.068500
+vn -0.980600 -0.159400 -0.113600
+vn -0.979100 -0.182000 -0.090500
+vn -0.976500 -0.204500 -0.067400
+vn -0.986900 -0.159600 -0.022400
+vn -0.972900 -0.226800 -0.044100
+vn -0.983300 -0.182000 0.000600
+vn -0.993200 -0.114200 0.022800
+vn -0.995800 -0.091600 -0.000100
+vn -0.995300 -0.068500 0.068500
+vn -0.997900 -0.045700 0.045700
+vn -0.989500 -0.136800 0.045700
+vn -0.991600 -0.091300 0.091300
+vn -0.997300 -0.068800 -0.023000
+vn -0.999500 -0.022900 0.022900
+vn -0.989500 0.045500 0.137000
+vn -0.991100 0.068500 0.114300
+vn -0.997300 0.023000 0.068800
+vn -0.995800 0.000100 0.091600
+vn -0.993200 -0.022800 0.114200
+vn -0.986900 0.022400 0.159600
+vn -0.989500 -0.045700 0.136800
+vn -0.983300 -0.000600 0.182000
+vn -0.976500 0.067400 0.204500
+vn -0.979100 0.090500 0.182000
+vn -0.962000 0.111900 0.249100
+vn -0.964500 0.135200 0.226800
+vn -0.972900 0.044100 0.226800
+vn -0.958400 0.088500 0.271200
+vn -0.980600 0.113600 0.159400
+vn -0.966000 0.158400 0.204200
+vn -0.923200 0.222000 0.313600
+vn -0.924600 0.245300 0.291200
+vn -0.947300 0.202400 0.248200
+vn -0.945800 0.179200 0.270800
+vn -0.943300 0.155800 0.293000
+vn -0.920800 0.198500 0.335800
+vn -0.939800 0.132200 0.314900
+vn -0.917400 0.174700 0.357600
+vn -0.894300 0.240100 0.377500
+vn -0.896700 0.263800 0.355400
+vn -0.863900 0.280600 0.418100
+vn -0.866200 0.304400 0.396100
+vn -0.891000 0.216200 0.399100
+vn -0.860700 0.256600 0.439600
+vn -0.898100 0.287100 0.333000
+vn -0.867600 0.327900 0.373800
+vn -0.794400 0.381100 0.472900
+vn -0.795700 0.404700 0.450600
+vn -0.833400 0.367200 0.413100
+vn -0.832100 0.343600 0.435400
+vn -0.829900 0.319700 0.457200
+vn -0.792400 0.357100 0.494600
+vn -0.826800 0.295500 0.478600
+vn -0.789400 0.332700 0.515900
+vn -0.751400 0.392600 0.530300
+vn -0.753400 0.416700 0.508600
+vn -0.707100 0.426400 0.564100
+vn -0.708900 0.450600 0.542500
+vn -0.748600 0.368100 0.551400
+vn -0.704400 0.401700 0.585100
+vn -0.754600 0.440400 0.486400
+vn -0.710100 0.474300 0.520300
+vn -0.611100 0.511800 0.603800
+vn -0.612000 0.535700 0.581700
+vn -0.662400 0.506200 0.552200
+vn -0.661400 0.482400 0.574300
+vn -0.659600 0.458100 0.595900
+vn -0.609500 0.487400 0.625300
+vn -0.657200 0.433200 0.616800
+vn -0.607200 0.462400 0.646100
+vn -0.556700 0.514400 0.652300
+vn -0.558100 0.538800 0.630900
+vn -0.501100 0.539000 0.677000
+vn -0.502500 0.563500 0.655700
+vn -0.554600 0.489300 0.673100
+vn -0.499300 0.513800 0.697700
+vn -0.559000 0.562800 0.608900
+vn -0.503300 0.587500 0.633600
+vn -0.385000 0.604800 0.697100
+vn -0.385600 0.628900 0.675100
+vn -0.445300 0.609600 0.655800
+vn -0.444600 0.585600 0.677800
+vn -0.443400 0.560900 0.699100
+vn -0.383900 0.580100 0.718300
+vn -0.441800 0.535700 0.719600
+vn -0.382500 0.554800 0.738800
+vn -0.322800 0.596500 0.734800
+vn -0.323600 0.621300 0.713600
+vn -0.259900 0.610100 0.748400
+vn -0.260500 0.635000 0.727300
+vn -0.321500 0.571100 0.755200
+vn -0.258900 0.584600 0.768900
+vn -0.324100 0.645400 0.691600
+vn -0.261000 0.659100 0.705300
+vn -0.131400 0.653200 0.745600
+vn -0.131700 0.677400 0.723700
+vn -0.196600 0.669800 0.716000
+vn -0.196300 0.645600 0.738000
+vn -0.195800 0.620800 0.759100
+vn -0.131100 0.628400 0.766700
+vn -0.195000 0.595200 0.779500
+vn -0.130600 0.602800 0.787100
+vn -0.065800 0.633000 0.771400
+vn -0.066000 0.657900 0.750200
+vn 0.000000 0.634500 0.772900
+vn 0.000000 0.659400 0.751800
+vn -0.065600 0.607400 0.791700
+vn 0.000000 0.608900 0.793200
+vn -0.066100 0.682100 0.728300
+vn 0.000000 0.683600 0.729800
+vn 0.131400 0.653200 0.745600
+vn 0.131700 0.677400 0.723700
+vn 0.066100 0.682100 0.728300
+vn 0.066000 0.657900 0.750200
+vn 0.065800 0.633000 0.771400
+vn 0.131100 0.628400 0.766700
+vn 0.065600 0.607400 0.791700
+vn 0.130600 0.602800 0.787100
+vn 0.195800 0.620800 0.759100
+vn 0.196300 0.645600 0.738000
+vn 0.259900 0.610100 0.748400
+vn 0.260500 0.635000 0.727300
+vn 0.195000 0.595200 0.779500
+vn 0.258900 0.584600 0.768900
+vn 0.196600 0.669800 0.716000
+vn 0.261000 0.659100 0.705300
+vn 0.385000 0.604800 0.697100
+vn 0.385600 0.628900 0.675100
+vn 0.324100 0.645400 0.691600
+vn 0.323600 0.621300 0.713600
+vn 0.322800 0.596500 0.734800
+vn 0.383900 0.580100 0.718300
+vn 0.321500 0.571100 0.755200
+vn 0.382500 0.554800 0.738800
+vn 0.443400 0.560900 0.699100
+vn 0.444600 0.585600 0.677800
+vn 0.501100 0.539000 0.677000
+vn 0.502500 0.563500 0.655700
+vn 0.441800 0.535700 0.719600
+vn 0.499300 0.513800 0.697700
+vn 0.445300 0.609600 0.655800
+vn 0.503300 0.587500 0.633600
+vn 0.611100 0.511800 0.603800
+vn 0.612000 0.535700 0.581700
+vn 0.559000 0.562800 0.608900
+vn 0.558100 0.538800 0.630900
+vn 0.556700 0.514400 0.652300
+vn 0.609500 0.487400 0.625300
+vn 0.554600 0.489300 0.673100
+vn 0.607200 0.462400 0.646100
+vn 0.659600 0.458100 0.595900
+vn 0.661400 0.482400 0.574300
+vn 0.707100 0.426400 0.564100
+vn 0.708900 0.450600 0.542500
+vn 0.657200 0.433200 0.616800
+vn 0.704400 0.401700 0.585100
+vn 0.662400 0.506200 0.552200
+vn 0.710100 0.474300 0.520300
+vn 0.794400 0.381100 0.472900
+vn 0.795700 0.404700 0.450600
+vn 0.754600 0.440400 0.486400
+vn 0.753400 0.416700 0.508600
+vn 0.751400 0.392600 0.530300
+vn 0.792400 0.357100 0.494600
+vn 0.748600 0.368100 0.551400
+vn 0.789400 0.332700 0.515900
+vn 0.829900 0.319700 0.457200
+vn 0.832100 0.343600 0.435400
+vn 0.863900 0.280600 0.418100
+vn 0.866200 0.304400 0.396100
+vn 0.826800 0.295500 0.478600
+vn 0.860700 0.256600 0.439600
+vn 0.833400 0.367200 0.413100
+vn 0.867600 0.327900 0.373800
+vn 0.923200 0.222000 0.313600
+vn 0.924600 0.245300 0.291200
+vn 0.898100 0.287100 0.333000
+vn 0.896700 0.263800 0.355400
+vn 0.894300 0.240100 0.377500
+vn 0.920800 0.198500 0.335800
+vn 0.891000 0.216200 0.399100
+vn 0.917400 0.174700 0.357600
+vn 0.943300 0.155800 0.293000
+vn 0.945800 0.179200 0.270800
+vn 0.962000 0.111900 0.249100
+vn 0.964500 0.135200 0.226800
+vn 0.939800 0.132200 0.314900
+vn 0.958400 0.088500 0.271200
+vn 0.947300 0.202400 0.248200
+vn 0.966000 0.158400 0.204200
+vn 0.989500 0.045500 0.137000
+vn 0.991100 0.068500 0.114300
+vn 0.980600 0.113600 0.159400
+vn 0.979100 0.090500 0.182000
+vn 0.976500 0.067400 0.204500
+vn 0.986900 0.022400 0.159600
+vn 0.972900 0.044100 0.226800
+vn 0.983300 -0.000600 0.182000
+vn 0.993200 -0.022800 0.114200
+vn 0.995800 0.000100 0.091600
+vn 0.995300 -0.068500 0.068500
+vn 0.997900 -0.045700 0.045700
+vn 0.989500 -0.045700 0.136800
+vn 0.991600 -0.091300 0.091300
+vn 0.997300 0.023000 0.068800
+vn 0.999500 -0.022900 0.022900
+vn 0.989500 -0.137000 -0.045500
+vn 0.991100 -0.114300 -0.068500
+vn 0.997300 -0.068800 -0.023000
+vn 0.995800 -0.091600 -0.000100
+vn 0.993200 -0.114200 0.022800
+vn 0.986900 -0.159600 -0.022400
+vn 0.989500 -0.136800 0.045700
+vn 0.983300 -0.182000 0.000600
+vn 0.976500 -0.204500 -0.067400
+vn 0.979100 -0.182000 -0.090500
+vn 0.972900 -0.226800 -0.044100
+vn 0.980600 -0.159400 -0.113600
+vn 0.907700 -0.400000 -0.126700
+vn 0.913000 -0.379000 -0.150800
+vn 0.935400 -0.336600 -0.108400
+vn 0.929900 -0.357800 -0.084600
+vn 0.953900 -0.293000 -0.065000
+vn 0.948300 -0.314600 -0.041400
+vn 0.923500 -0.378700 -0.060600
+vn 0.901400 -0.420600 -0.102400
+vn 0.916100 -0.399200 -0.036600
+vn 0.894200 -0.440800 -0.078000
+vn 0.941800 -0.335700 -0.017800
+vn 0.934200 -0.356500 0.005900
+vn 0.875500 -0.461400 -0.143100
+vn 0.881600 -0.441100 -0.167700
+vn 0.845800 -0.501200 -0.182800
+vn 0.851600 -0.481200 -0.207600
+vn 0.868500 -0.481300 -0.118400
+vn 0.839000 -0.520800 -0.157700
+vn 0.886800 -0.420400 -0.192000
+vn 0.856700 -0.460600 -0.232200
+vn 0.781100 -0.556700 -0.282800
+vn 0.785600 -0.536600 -0.307900
+vn 0.822800 -0.499500 -0.270900
+vn 0.818000 -0.519800 -0.246100
+vn 0.812400 -0.539600 -0.221000
+vn 0.775600 -0.576300 -0.257500
+vn 0.805800 -0.558900 -0.195600
+vn 0.769400 -0.595200 -0.231800
+vn 0.735600 -0.611200 -0.292200
+vn 0.740700 -0.591900 -0.317800
+vn 0.692100 -0.644400 -0.325200
+vn 0.697000 -0.625300 -0.351100
+vn 0.729600 -0.629900 -0.266200
+vn 0.686500 -0.662800 -0.298900
+vn 0.745000 -0.571900 -0.343100
+vn 0.701100 -0.605500 -0.376500
+vn 0.600700 -0.685600 -0.411100
+vn 0.604300 -0.666200 -0.437000
+vn 0.654000 -0.637000 -0.407900
+vn 0.650200 -0.656600 -0.382200
+vn 0.645600 -0.675500 -0.356100
+vn 0.596500 -0.704300 -0.384700
+vn 0.640400 -0.693700 -0.329600
+vn 0.591700 -0.722300 -0.358000
+vn 0.544800 -0.730800 -0.411100
+vn 0.548700 -0.712300 -0.437600
+vn 0.490500 -0.755000 -0.435100
+vn 0.493900 -0.736700 -0.461800
+vn 0.540400 -0.748600 -0.384100
+vn 0.486500 -0.772600 -0.407900
+vn 0.551900 -0.693100 -0.463700
+vn 0.496900 -0.717600 -0.488000
+vn 0.378400 -0.777500 -0.502300
+vn 0.380700 -0.758600 -0.528800
+vn 0.439600 -0.739400 -0.509800
+vn 0.437000 -0.758400 -0.483400
+vn 0.434000 -0.776600 -0.456600
+vn 0.375800 -0.795500 -0.475300
+vn 0.430500 -0.794000 -0.429200
+vn 0.372700 -0.812800 -0.447700
+vn 0.315900 -0.811600 -0.491300
+vn 0.318100 -0.793700 -0.518500
+vn 0.254300 -0.825000 -0.504600
+vn 0.256100 -0.807200 -0.531800
+vn 0.313300 -0.828800 -0.463600
+vn 0.252200 -0.842000 -0.476800
+vn 0.320000 -0.774900 -0.545100
+vn 0.257600 -0.788400 -0.558500
+vn 0.129200 -0.825200 -0.549800
+vn 0.130000 -0.806600 -0.576600
+vn 0.194100 -0.799000 -0.569000
+vn 0.193000 -0.817700 -0.542300
+vn 0.191600 -0.835500 -0.515000
+vn 0.128300 -0.843000 -0.522400
+vn 0.190000 -0.852400 -0.487000
+vn 0.127300 -0.859800 -0.494400
+vn 0.064400 -0.847500 -0.526800
+vn 0.064900 -0.829800 -0.554300
+vn 0.000000 -0.849000 -0.528400
+vn 0.000000 -0.831300 -0.555800
+vn 0.063900 -0.864300 -0.498800
+vn 0.000000 -0.865800 -0.500300
+vn 0.065300 -0.811200 -0.581100
+vn 0.000000 -0.812700 -0.582700
+vn -0.129200 -0.825200 -0.549800
+vn -0.130000 -0.806600 -0.576600
+vn -0.065300 -0.811200 -0.581100
+vn -0.064900 -0.829800 -0.554300
+vn -0.064400 -0.847500 -0.526800
+vn -0.128300 -0.843000 -0.522400
+vn -0.063900 -0.864300 -0.498800
+vn -0.127300 -0.859800 -0.494400
+vn -0.191600 -0.835500 -0.515000
+vn -0.193000 -0.817700 -0.542300
+vn -0.254300 -0.825000 -0.504600
+vn -0.256100 -0.807200 -0.531800
+vn -0.190000 -0.852400 -0.487000
+vn -0.252200 -0.842000 -0.476800
+vn -0.194100 -0.799000 -0.569000
+vn -0.257600 -0.788400 -0.558500
+vn -0.378400 -0.777500 -0.502300
+vn -0.380700 -0.758500 -0.528800
+vn -0.320000 -0.774900 -0.545100
+vn -0.318100 -0.793700 -0.518500
+vn -0.315900 -0.811600 -0.491300
+vn -0.375800 -0.795500 -0.475300
+vn -0.313300 -0.828800 -0.463600
+vn -0.372700 -0.812800 -0.447700
+vn -0.434000 -0.776600 -0.456600
+vn -0.437000 -0.758400 -0.483400
+vn -0.490500 -0.755000 -0.435100
+vn -0.493900 -0.736700 -0.461800
+vn -0.430500 -0.794000 -0.429200
+vn -0.486500 -0.772600 -0.407900
+vn -0.439600 -0.739400 -0.509800
+vn -0.496900 -0.717600 -0.488100
+vn -0.600700 -0.685600 -0.411100
+vn -0.604300 -0.666200 -0.437000
+vn -0.551900 -0.693100 -0.463700
+vn -0.548700 -0.712300 -0.437600
+vn -0.544800 -0.730800 -0.411100
+vn -0.596500 -0.704300 -0.384700
+vn -0.540400 -0.748600 -0.384100
+vn -0.591700 -0.722300 -0.358000
+vn -0.645600 -0.675500 -0.356100
+vn -0.650200 -0.656600 -0.382200
+vn -0.692100 -0.644400 -0.325200
+vn -0.697000 -0.625300 -0.351100
+vn -0.640400 -0.693700 -0.329600
+vn -0.686500 -0.662800 -0.298900
+vn -0.654000 -0.637000 -0.407900
+vn -0.701100 -0.605500 -0.376500
+vn -0.781100 -0.556700 -0.282800
+vn -0.785600 -0.536600 -0.307900
+vn -0.745000 -0.571900 -0.343100
+vn -0.740700 -0.591900 -0.317800
+vn -0.735600 -0.611200 -0.292200
+vn -0.775600 -0.576300 -0.257500
+vn -0.729600 -0.629900 -0.266200
+vn -0.769400 -0.595200 -0.231800
+vn -0.812400 -0.539600 -0.221000
+vn -0.818000 -0.519800 -0.246100
+vn -0.845800 -0.501200 -0.182800
+vn -0.851600 -0.481200 -0.207600
+vn -0.805800 -0.558900 -0.195600
+vn -0.839000 -0.520800 -0.157700
+vn -0.822800 -0.499500 -0.270900
+vn -0.856700 -0.460600 -0.232200
+vn -0.907700 -0.400000 -0.126700
+vn -0.913000 -0.379000 -0.150800
+vn -0.886800 -0.420400 -0.192000
+vn -0.881600 -0.441100 -0.167700
+vn -0.875500 -0.461400 -0.143100
+vn -0.901400 -0.420600 -0.102400
+vn -0.868500 -0.481300 -0.118400
+vn -0.894200 -0.440800 -0.078000
+vn -0.923500 -0.378700 -0.060600
+vn -0.929900 -0.357800 -0.084600
+vn -0.941800 -0.335700 -0.017800
+vn -0.948300 -0.314600 -0.041400
+vn -0.916100 -0.399200 -0.036600
+vn -0.934200 -0.356500 0.005900
+vn -0.935400 -0.336600 -0.108400
+vn -0.953900 -0.293000 -0.065000
+vn -0.972900 -0.226200 0.046800
+vn -0.978600 -0.204200 0.023700
+vn -0.968300 -0.248800 -0.020800
+vn -0.962700 -0.270500 0.002500
+vn -0.956100 -0.292000 0.025800
+vn -0.966200 -0.248000 0.069800
+vn -0.948400 -0.313200 0.049100
+vn -0.958500 -0.269500 0.092700
+vn -0.972400 -0.203600 0.114100
+vn -0.979100 -0.181500 0.091400
+vn -0.974400 -0.158900 0.158900
+vn -0.981200 -0.136500 0.136500
+vn -0.964600 -0.225500 0.136800
+vn -0.966600 -0.181100 0.181100
+vn -0.984800 -0.159200 0.068600
+vn -0.986900 -0.114000 0.114000
+vn -0.972900 -0.046800 0.226200
+vn -0.978600 -0.023700 0.204200
+vn -0.984800 -0.068600 0.159300
+vn -0.979100 -0.091400 0.181500
+vn -0.972400 -0.114100 0.203600
+vn -0.966200 -0.069800 0.248000
+vn -0.964600 -0.136800 0.225500
+vn -0.958500 -0.092700 0.269500
+vn -0.956100 -0.025800 0.292000
+vn -0.962700 -0.002500 0.270500
+vn -0.941800 0.017800 0.335700
+vn -0.948300 0.041400 0.314600
+vn -0.948400 -0.049100 0.313200
+vn -0.934200 -0.005900 0.356500
+vn -0.968300 0.020800 0.248800
+vn -0.953900 0.065000 0.293000
+vn -0.907700 0.126700 0.400000
+vn -0.913000 0.150800 0.379000
+vn -0.935400 0.108400 0.336600
+vn -0.929900 0.084600 0.357800
+vn -0.923500 0.060600 0.378700
+vn -0.901400 0.102400 0.420600
+vn -0.916100 0.036600 0.399200
+vn -0.894200 0.078000 0.440800
+vn -0.875500 0.143100 0.461400
+vn -0.881600 0.167700 0.441100
+vn -0.845800 0.182800 0.501200
+vn -0.851600 0.207600 0.481200
+vn -0.868500 0.118400 0.481300
+vn -0.839000 0.157700 0.520800
+vn -0.886800 0.192000 0.420400
+vn -0.856700 0.232200 0.460600
+vn -0.781100 0.282800 0.556700
+vn -0.785600 0.307900 0.536600
+vn -0.822800 0.270900 0.499500
+vn -0.818000 0.246100 0.519800
+vn -0.812400 0.221000 0.539600
+vn -0.775600 0.257500 0.576300
+vn -0.805800 0.195600 0.558900
+vn -0.769400 0.231800 0.595200
+vn -0.735600 0.292200 0.611200
+vn -0.740700 0.317800 0.591900
+vn -0.692100 0.325200 0.644400
+vn -0.697000 0.351100 0.625300
+vn -0.729600 0.266200 0.629900
+vn -0.686500 0.298900 0.662800
+vn -0.745000 0.343100 0.571900
+vn -0.701100 0.376500 0.605500
+vn -0.600700 0.411100 0.685600
+vn -0.604300 0.437000 0.666200
+vn -0.654000 0.407900 0.637000
+vn -0.650200 0.382200 0.656600
+vn -0.645600 0.356100 0.675500
+vn -0.596500 0.384700 0.704300
+vn -0.640400 0.329600 0.693700
+vn -0.591700 0.358000 0.722300
+vn -0.544800 0.411100 0.730800
+vn -0.548700 0.437600 0.712300
+vn -0.490500 0.435100 0.755000
+vn -0.493900 0.461800 0.736700
+vn -0.540400 0.384100 0.748600
+vn -0.486500 0.407900 0.772600
+vn -0.551900 0.463700 0.693100
+vn -0.496900 0.488000 0.717600
+vn -0.378400 0.502300 0.777500
+vn -0.380700 0.528800 0.758500
+vn -0.439600 0.509800 0.739400
+vn -0.437000 0.483400 0.758400
+vn -0.434000 0.456600 0.776600
+vn -0.375800 0.475300 0.795500
+vn -0.430500 0.429200 0.794000
+vn -0.372700 0.447700 0.812800
+vn -0.315900 0.491300 0.811600
+vn -0.318100 0.518500 0.793700
+vn -0.254300 0.504600 0.825000
+vn -0.256100 0.531800 0.807200
+vn -0.313300 0.463600 0.828800
+vn -0.252200 0.476800 0.842000
+vn -0.320000 0.545100 0.774900
+vn -0.257600 0.558500 0.788400
+vn -0.129200 0.549800 0.825200
+vn -0.130000 0.576600 0.806600
+vn -0.194100 0.569000 0.799000
+vn -0.193000 0.542300 0.817700
+vn -0.191600 0.515000 0.835500
+vn -0.128300 0.522400 0.843000
+vn -0.190000 0.487000 0.852400
+vn -0.127300 0.494400 0.859800
+vn -0.064400 0.526800 0.847500
+vn -0.064900 0.554300 0.829800
+vn 0.000000 0.528400 0.849000
+vn 0.000000 0.555800 0.831300
+vn -0.063900 0.498800 0.864300
+vn 0.000000 0.500300 0.865800
+vn -0.065300 0.581100 0.811200
+vn 0.000000 0.582700 0.812700
+vn 0.129200 0.549800 0.825200
+vn 0.130000 0.576600 0.806600
+vn 0.065300 0.581100 0.811200
+vn 0.064900 0.554300 0.829800
+vn 0.064400 0.526800 0.847500
+vn 0.128300 0.522400 0.843000
+vn 0.063900 0.498800 0.864300
+vn 0.127300 0.494400 0.859800
+vn 0.191600 0.515000 0.835500
+vn 0.193000 0.542300 0.817700
+vn 0.254300 0.504600 0.825000
+vn 0.256100 0.531800 0.807200
+vn 0.190000 0.487000 0.852400
+vn 0.252200 0.476800 0.842000
+vn 0.194100 0.569000 0.799000
+vn 0.257600 0.558500 0.788400
+vn 0.378400 0.502300 0.777500
+vn 0.380700 0.528800 0.758500
+vn 0.320000 0.545100 0.774900
+vn 0.318100 0.518500 0.793700
+vn 0.315900 0.491300 0.811600
+vn 0.375800 0.475300 0.795500
+vn 0.313300 0.463600 0.828800
+vn 0.372700 0.447700 0.812800
+vn 0.434000 0.456600 0.776600
+vn 0.437000 0.483400 0.758400
+vn 0.490500 0.435100 0.755000
+vn 0.493900 0.461800 0.736700
+vn 0.430500 0.429200 0.794000
+vn 0.486500 0.407900 0.772600
+vn 0.439600 0.509800 0.739400
+vn 0.496900 0.488100 0.717600
+vn 0.600700 0.411100 0.685600
+vn 0.604300 0.437000 0.666200
+vn 0.551900 0.463700 0.693100
+vn 0.548700 0.437600 0.712300
+vn 0.544800 0.411100 0.730800
+vn 0.596500 0.384700 0.704300
+vn 0.540400 0.384100 0.748600
+vn 0.591700 0.358000 0.722300
+vn 0.645600 0.356100 0.675500
+vn 0.650200 0.382200 0.656600
+vn 0.692100 0.325200 0.644400
+vn 0.697000 0.351100 0.625300
+vn 0.640400 0.329600 0.693700
+vn 0.686500 0.298900 0.662800
+vn 0.654000 0.407900 0.637000
+vn 0.701100 0.376500 0.605500
+vn 0.781100 0.282800 0.556700
+vn 0.785600 0.307900 0.536600
+vn 0.745000 0.343100 0.571900
+vn 0.740700 0.317800 0.591900
+vn 0.735600 0.292200 0.611200
+vn 0.775600 0.257500 0.576300
+vn 0.729600 0.266200 0.629900
+vn 0.769400 0.231800 0.595200
+vn 0.812400 0.221000 0.539600
+vn 0.818000 0.246100 0.519800
+vn 0.845800 0.182800 0.501200
+vn 0.851600 0.207600 0.481200
+vn 0.805800 0.195600 0.558900
+vn 0.839000 0.157700 0.520800
+vn 0.822800 0.270900 0.499500
+vn 0.856700 0.232200 0.460600
+vn 0.907700 0.126700 0.400000
+vn 0.913000 0.150800 0.379000
+vn 0.886800 0.192000 0.420400
+vn 0.881600 0.167700 0.441100
+vn 0.875500 0.143100 0.461400
+vn 0.901400 0.102400 0.420600
+vn 0.868500 0.118400 0.481300
+vn 0.894200 0.078000 0.440800
+vn 0.923500 0.060600 0.378700
+vn 0.929900 0.084600 0.357800
+vn 0.941800 0.017800 0.335700
+vn 0.948300 0.041400 0.314600
+vn 0.916100 0.036600 0.399200
+vn 0.934200 -0.005900 0.356500
+vn 0.935400 0.108400 0.336600
+vn 0.953900 0.065000 0.293000
+vn 0.972900 -0.046800 0.226200
+vn 0.978600 -0.023700 0.204200
+vn 0.968300 0.020800 0.248800
+vn 0.962700 -0.002500 0.270500
+vn 0.956100 -0.025800 0.292000
+vn 0.966200 -0.069800 0.248000
+vn 0.948400 -0.049100 0.313200
+vn 0.958500 -0.092700 0.269500
+vn 0.972400 -0.114100 0.203600
+vn 0.979100 -0.091400 0.181500
+vn 0.974400 -0.158900 0.158900
+vn 0.981200 -0.136500 0.136500
+vn 0.964600 -0.136800 0.225500
+vn 0.966600 -0.181100 0.181100
+vn 0.984800 -0.068600 0.159300
+vn 0.986900 -0.114000 0.114000
+vn 0.972900 -0.226200 0.046800
+vn 0.978600 -0.204200 0.023700
+vn 0.984800 -0.159300 0.068600
+vn 0.979100 -0.181500 0.091400
+vn 0.972400 -0.203600 0.114100
+vn 0.966200 -0.248000 0.069800
+vn 0.964600 -0.225500 0.136800
+vn 0.958500 -0.269500 0.092700
+vn 0.956100 -0.292000 0.025800
+vn 0.962700 -0.270500 0.002500
+vn 0.948400 -0.313200 0.049100
+vn 0.968300 -0.248800 -0.020800
+vn 0.877300 -0.478900 -0.030200
+vn 0.886100 -0.460200 -0.053900
+vn 0.907900 -0.419000 -0.012800
+vn 0.898900 -0.438100 0.010500
+vn 0.925800 -0.376800 0.029300
+vn 0.916700 -0.396200 0.052200
+vn 0.889000 -0.456700 0.033800
+vn 0.867700 -0.497000 -0.006400
+vn 0.878000 -0.475200 0.057500
+vn 0.857000 -0.515000 0.017800
+vn 0.906600 -0.415300 0.075000
+vn 0.895400 -0.434300 0.098200
+vn 0.842700 -0.536400 -0.045500
+vn 0.852100 -0.518700 -0.069700
+vn 0.814100 -0.574700 -0.083700
+vn 0.823100 -0.557400 -0.108300
+vn 0.832300 -0.553900 -0.020800
+vn 0.804000 -0.591800 -0.058500
+vn 0.860700 -0.500400 -0.093900
+vn 0.831400 -0.539500 -0.132800
+vn 0.754800 -0.630500 -0.180900
+vn 0.762400 -0.613300 -0.206200
+vn 0.798500 -0.577300 -0.170400
+vn 0.790600 -0.594800 -0.145400
+vn 0.781900 -0.611700 -0.120400
+vn 0.746500 -0.647000 -0.155400
+vn 0.772200 -0.628300 -0.094700
+vn 0.737200 -0.663100 -0.129300
+vn 0.707900 -0.680600 -0.188800
+vn 0.715800 -0.664500 -0.214600
+vn 0.666000 -0.712500 -0.220500
+vn 0.673500 -0.696800 -0.246700
+vn 0.699100 -0.696300 -0.162300
+vn 0.657800 -0.727900 -0.193500
+vn 0.723000 -0.647700 -0.240300
+vn 0.680300 -0.680300 -0.272700
+vn 0.580500 -0.755200 -0.304600
+vn 0.586400 -0.739200 -0.331200
+vn 0.634600 -0.710900 -0.303100
+vn 0.628300 -0.727100 -0.276700
+vn 0.621300 -0.742500 -0.250200
+vn 0.574000 -0.770300 -0.277700
+vn 0.613600 -0.757500 -0.222800
+vn 0.566900 -0.784900 -0.250000
+vn 0.524200 -0.795800 -0.303000
+vn 0.530100 -0.781000 -0.330100
+vn 0.471900 -0.819100 -0.326000
+vn 0.477200 -0.804500 -0.353500
+vn 0.517700 -0.810100 -0.274900
+vn 0.466000 -0.833200 -0.297700
+vn 0.535500 -0.765300 -0.357000
+vn 0.482100 -0.789100 -0.380600
+vn 0.365600 -0.844000 -0.392500
+vn 0.369300 -0.828900 -0.420100
+vn 0.426500 -0.810400 -0.401700
+vn 0.422300 -0.825600 -0.374300
+vn 0.417600 -0.839900 -0.346600
+vn 0.361500 -0.858100 -0.364600
+vn 0.412300 -0.853700 -0.318000
+vn 0.357000 -0.871600 -0.335700
+vn 0.303900 -0.873700 -0.379900
+vn 0.307300 -0.859600 -0.408000
+vn 0.244700 -0.886500 -0.392700
+vn 0.247400 -0.872700 -0.420900
+vn 0.300100 -0.887000 -0.350900
+vn 0.241600 -0.899700 -0.363400
+vn 0.310400 -0.844800 -0.435800
+vn 0.249900 -0.857900 -0.448800
+vn 0.124800 -0.890200 -0.438200
+vn 0.126100 -0.875600 -0.466300
+vn 0.188300 -0.868200 -0.459000
+vn 0.186400 -0.882900 -0.431000
+vn 0.184300 -0.896600 -0.402600
+vn 0.123400 -0.903800 -0.409700
+vn 0.182000 -0.909700 -0.373300
+vn 0.121900 -0.916800 -0.380300
+vn 0.062000 -0.908100 -0.414000
+vn 0.062700 -0.894500 -0.442500
+vn 0.000000 -0.909600 -0.415400
+vn 0.000000 -0.896000 -0.444000
+vn 0.061200 -0.921000 -0.384500
+vn 0.000000 -0.922500 -0.385900
+vn 0.063300 -0.880000 -0.470700
+vn 0.000000 -0.881500 -0.472100
+vn -0.124800 -0.890200 -0.438200
+vn -0.126100 -0.875600 -0.466300
+vn -0.063300 -0.880000 -0.470700
+vn -0.062700 -0.894500 -0.442500
+vn -0.062000 -0.908100 -0.414000
+vn -0.123400 -0.903800 -0.409700
+vn -0.061200 -0.921000 -0.384500
+vn -0.121900 -0.916800 -0.380300
+vn -0.184300 -0.896600 -0.402600
+vn -0.186400 -0.882900 -0.431000
+vn -0.244700 -0.886500 -0.392700
+vn -0.247400 -0.872700 -0.420900
+vn -0.182000 -0.909700 -0.373300
+vn -0.241600 -0.899700 -0.363400
+vn -0.188300 -0.868200 -0.459000
+vn -0.249900 -0.857900 -0.448800
+vn -0.365600 -0.844000 -0.392500
+vn -0.369300 -0.828900 -0.420100
+vn -0.310400 -0.844800 -0.435800
+vn -0.307300 -0.859600 -0.408000
+vn -0.303900 -0.873700 -0.379900
+vn -0.361500 -0.858100 -0.364600
+vn -0.300100 -0.887000 -0.350900
+vn -0.357000 -0.871600 -0.335700
+vn -0.417600 -0.839900 -0.346600
+vn -0.422300 -0.825600 -0.374300
+vn -0.471900 -0.819100 -0.326000
+vn -0.477200 -0.804500 -0.353500
+vn -0.412300 -0.853700 -0.318000
+vn -0.466100 -0.833200 -0.297700
+vn -0.426500 -0.810400 -0.401700
+vn -0.482100 -0.789100 -0.380600
+vn -0.580500 -0.755200 -0.304600
+vn -0.586400 -0.739200 -0.331200
+vn -0.535500 -0.765300 -0.357000
+vn -0.530100 -0.781000 -0.330100
+vn -0.524200 -0.795800 -0.303000
+vn -0.574000 -0.770300 -0.277700
+vn -0.517700 -0.810100 -0.274900
+vn -0.566900 -0.784900 -0.250000
+vn -0.621300 -0.742500 -0.250200
+vn -0.628300 -0.727100 -0.276700
+vn -0.666000 -0.712500 -0.220500
+vn -0.673500 -0.696800 -0.246700
+vn -0.613600 -0.757500 -0.222800
+vn -0.657800 -0.727900 -0.193500
+vn -0.634600 -0.710900 -0.303000
+vn -0.680300 -0.680300 -0.272700
+vn -0.754800 -0.630500 -0.180900
+vn -0.762400 -0.613300 -0.206200
+vn -0.723000 -0.647700 -0.240300
+vn -0.715800 -0.664500 -0.214600
+vn -0.707900 -0.680600 -0.188800
+vn -0.746500 -0.647000 -0.155400
+vn -0.699100 -0.696300 -0.162200
+vn -0.737200 -0.663100 -0.129300
+vn -0.781900 -0.611700 -0.120400
+vn -0.790600 -0.594800 -0.145400
+vn -0.814100 -0.574700 -0.083700
+vn -0.823100 -0.557400 -0.108300
+vn -0.772200 -0.628300 -0.094700
+vn -0.804000 -0.591800 -0.058500
+vn -0.798500 -0.577300 -0.170400
+vn -0.831400 -0.539500 -0.132800
+vn -0.877300 -0.478900 -0.030200
+vn -0.886100 -0.460200 -0.053900
+vn -0.860700 -0.500400 -0.093900
+vn -0.852100 -0.518700 -0.069700
+vn -0.842700 -0.536400 -0.045500
+vn -0.867700 -0.497000 -0.006400
+vn -0.832300 -0.553900 -0.020800
+vn -0.857000 -0.515000 0.017800
+vn -0.889000 -0.456700 0.033800
+vn -0.898900 -0.438100 0.010500
+vn -0.906600 -0.415300 0.075000
+vn -0.916700 -0.396200 0.052200
+vn -0.878000 -0.475200 0.057500
+vn -0.895400 -0.434300 0.098200
+vn -0.907900 -0.419000 -0.012800
+vn -0.925800 -0.376800 0.029300
+vn -0.940500 -0.310800 0.137400
+vn -0.949900 -0.290500 0.115300
+vn -0.939800 -0.333800 0.072100
+vn -0.930500 -0.353700 0.094600
+vn -0.920300 -0.373200 0.116900
+vn -0.930100 -0.330800 0.159300
+vn -0.909000 -0.392700 0.139600
+vn -0.918700 -0.350800 0.181400
+vn -0.936000 -0.288100 0.201900
+vn -0.946400 -0.267600 0.180500
+vn -0.938000 -0.245000 0.245000
+vn -0.948500 -0.224100 0.224100
+vn -0.924500 -0.308600 0.223500
+vn -0.926500 -0.266100 0.266100
+vn -0.955900 -0.246900 0.158900
+vn -0.957900 -0.202900 0.202900
+vn -0.940500 -0.137400 0.310800
+vn -0.949900 -0.115300 0.290500
+vn -0.955900 -0.158900 0.246900
+vn -0.946400 -0.180500 0.267600
+vn -0.936000 -0.201900 0.288100
+vn -0.930100 -0.159300 0.330800
+vn -0.924500 -0.223500 0.308600
+vn -0.918700 -0.181400 0.350800
+vn -0.920300 -0.116900 0.373200
+vn -0.930500 -0.094600 0.353700
+vn -0.906600 -0.075000 0.415300
+vn -0.916700 -0.052200 0.396200
+vn -0.909000 -0.139600 0.392700
+vn -0.895400 -0.098200 0.434300
+vn -0.939800 -0.072100 0.333800
+vn -0.925800 -0.029300 0.376800
+vn -0.877300 0.030200 0.478900
+vn -0.886100 0.053900 0.460200
+vn -0.907900 0.012800 0.419000
+vn -0.898900 -0.010500 0.438100
+vn -0.889000 -0.033800 0.456700
+vn -0.867700 0.006400 0.497000
+vn -0.878000 -0.057500 0.475200
+vn -0.857000 -0.017800 0.515000
+vn -0.842700 0.045500 0.536400
+vn -0.852100 0.069700 0.518700
+vn -0.814100 0.083700 0.574700
+vn -0.823100 0.108300 0.557400
+vn -0.832300 0.020800 0.553900
+vn -0.804000 0.058500 0.591800
+vn -0.860700 0.093900 0.500400
+vn -0.831400 0.132800 0.539500
+vn -0.754800 0.180900 0.630500
+vn -0.762400 0.206200 0.613300
+vn -0.798500 0.170400 0.577300
+vn -0.790600 0.145400 0.594800
+vn -0.781900 0.120400 0.611700
+vn -0.746500 0.155400 0.647000
+vn -0.772200 0.094700 0.628300
+vn -0.737200 0.129300 0.663100
+vn -0.707900 0.188800 0.680600
+vn -0.715800 0.214600 0.664500
+vn -0.666000 0.220500 0.712500
+vn -0.673500 0.246700 0.696800
+vn -0.699100 0.162300 0.696300
+vn -0.657800 0.193500 0.727900
+vn -0.723000 0.240300 0.647700
+vn -0.680300 0.272700 0.680300
+vn -0.580500 0.304600 0.755200
+vn -0.586400 0.331200 0.739200
+vn -0.634600 0.303100 0.710900
+vn -0.628300 0.276700 0.727100
+vn -0.621300 0.250200 0.742500
+vn -0.574000 0.277700 0.770300
+vn -0.613600 0.222800 0.757500
+vn -0.566900 0.250000 0.784900
+vn -0.524200 0.303000 0.795800
+vn -0.530100 0.330100 0.781000
+vn -0.471900 0.326000 0.819100
+vn -0.477200 0.353500 0.804500
+vn -0.517700 0.274900 0.810100
+vn -0.466000 0.297700 0.833200
+vn -0.535500 0.357000 0.765300
+vn -0.482100 0.380600 0.789100
+vn -0.365600 0.392500 0.844000
+vn -0.369300 0.420100 0.828900
+vn -0.426500 0.401700 0.810400
+vn -0.422300 0.374300 0.825600
+vn -0.417600 0.346600 0.839900
+vn -0.361500 0.364600 0.858100
+vn -0.412300 0.318000 0.853700
+vn -0.357000 0.335700 0.871600
+vn -0.303900 0.379900 0.873700
+vn -0.307300 0.408000 0.859600
+vn -0.244700 0.392700 0.886500
+vn -0.247400 0.420900 0.872700
+vn -0.300100 0.350900 0.887000
+vn -0.241600 0.363400 0.899700
+vn -0.310400 0.435800 0.844800
+vn -0.249900 0.448800 0.857900
+vn -0.124800 0.438200 0.890100
+vn -0.126100 0.466300 0.875600
+vn -0.188300 0.459000 0.868200
+vn -0.186400 0.431000 0.882900
+vn -0.184300 0.402600 0.896600
+vn -0.123400 0.409700 0.903800
+vn -0.182000 0.373300 0.909700
+vn -0.121900 0.380300 0.916800
+vn -0.062000 0.414000 0.908100
+vn -0.062700 0.442500 0.894500
+vn 0.000000 0.415400 0.909600
+vn 0.000000 0.444000 0.896000
+vn -0.061200 0.384500 0.921000
+vn 0.000000 0.385900 0.922500
+vn -0.063300 0.470700 0.880000
+vn 0.000000 0.472100 0.881500
+vn 0.124800 0.438200 0.890100
+vn 0.126100 0.466300 0.875600
+vn 0.063300 0.470700 0.880000
+vn 0.062700 0.442500 0.894500
+vn 0.062000 0.414000 0.908100
+vn 0.123400 0.409700 0.903800
+vn 0.061200 0.384500 0.921000
+vn 0.121900 0.380300 0.916800
+vn 0.184300 0.402600 0.896600
+vn 0.186400 0.431000 0.882900
+vn 0.244700 0.392700 0.886500
+vn 0.247400 0.420900 0.872700
+vn 0.182000 0.373300 0.909700
+vn 0.241600 0.363400 0.899700
+vn 0.188300 0.459000 0.868200
+vn 0.249900 0.448800 0.857900
+vn 0.365600 0.392500 0.843900
+vn 0.369300 0.420100 0.828900
+vn 0.310400 0.435800 0.844800
+vn 0.307300 0.408000 0.859600
+vn 0.303900 0.379900 0.873700
+vn 0.361500 0.364600 0.858100
+vn 0.300100 0.350900 0.887000
+vn 0.357000 0.335700 0.871600
+vn 0.417600 0.346600 0.839900
+vn 0.422300 0.374300 0.825600
+vn 0.471900 0.326000 0.819100
+vn 0.477200 0.353500 0.804500
+vn 0.412300 0.318000 0.853700
+vn 0.466000 0.297700 0.833200
+vn 0.426500 0.401700 0.810400
+vn 0.482100 0.380600 0.789100
+vn 0.580500 0.304600 0.755200
+vn 0.586400 0.331200 0.739200
+vn 0.535500 0.357000 0.765300
+vn 0.530100 0.330100 0.781000
+vn 0.524200 0.303000 0.795800
+vn 0.574000 0.277700 0.770300
+vn 0.517700 0.274900 0.810100
+vn 0.566900 0.250000 0.784900
+vn 0.621300 0.250200 0.742500
+vn 0.628300 0.276700 0.727100
+vn 0.666000 0.220500 0.712500
+vn 0.673500 0.246700 0.696800
+vn 0.613600 0.222800 0.757500
+vn 0.657800 0.193500 0.727900
+vn 0.634600 0.303100 0.710900
+vn 0.680300 0.272700 0.680300
+vn 0.754800 0.180900 0.630500
+vn 0.762400 0.206200 0.613300
+vn 0.723000 0.240300 0.647700
+vn 0.715800 0.214600 0.664500
+vn 0.707900 0.188800 0.680600
+vn 0.746500 0.155400 0.647000
+vn 0.699100 0.162200 0.696300
+vn 0.737200 0.129300 0.663100
+vn 0.781900 0.120400 0.611700
+vn 0.790600 0.145400 0.594800
+vn 0.814100 0.083700 0.574700
+vn 0.823100 0.108300 0.557400
+vn 0.772200 0.094700 0.628300
+vn 0.804000 0.058500 0.591800
+vn 0.798500 0.170400 0.577300
+vn 0.831400 0.132800 0.539500
+vn 0.877300 0.030200 0.478900
+vn 0.886100 0.053900 0.460200
+vn 0.860700 0.093900 0.500400
+vn 0.852100 0.069700 0.518700
+vn 0.842700 0.045500 0.536400
+vn 0.867700 0.006400 0.497000
+vn 0.832300 0.020800 0.553900
+vn 0.857000 -0.017800 0.515000
+vn 0.889000 -0.033800 0.456700
+vn 0.898900 -0.010500 0.438100
+vn 0.906600 -0.075000 0.415300
+vn 0.916700 -0.052200 0.396200
+vn 0.878000 -0.057500 0.475200
+vn 0.895400 -0.098200 0.434300
+vn 0.907900 0.012800 0.419000
+vn 0.925800 -0.029300 0.376800
+vn 0.940500 -0.137400 0.310800
+vn 0.949900 -0.115300 0.290500
+vn 0.939800 -0.072100 0.333800
+vn 0.930500 -0.094600 0.353700
+vn 0.920300 -0.116900 0.373200
+vn 0.930100 -0.159300 0.330800
+vn 0.909000 -0.139600 0.392700
+vn 0.918700 -0.181400 0.350800
+vn 0.936000 -0.201900 0.288100
+vn 0.946400 -0.180500 0.267600
+vn 0.938000 -0.245000 0.245000
+vn 0.948500 -0.224100 0.224100
+vn 0.924500 -0.223500 0.308600
+vn 0.926500 -0.266100 0.266100
+vn 0.955900 -0.158900 0.246900
+vn 0.957900 -0.202900 0.202900
+vn 0.940500 -0.310800 0.137400
+vn 0.949900 -0.290500 0.115300
+vn 0.955900 -0.246900 0.158900
+vn 0.946400 -0.267600 0.180500
+vn 0.936000 -0.288100 0.201900
+vn 0.930100 -0.330800 0.159300
+vn 0.924500 -0.308600 0.223500
+vn 0.918700 -0.350800 0.181400
+vn 0.920300 -0.373200 0.116900
+vn 0.930500 -0.353700 0.094600
+vn 0.909000 -0.392700 0.139600
+vn 0.939800 -0.333800 0.072100
+vn 0.838100 -0.542500 0.056200
+vn 0.846600 -0.530700 0.039500
+vn 0.867400 -0.491300 0.078700
+vn 0.858700 -0.503500 0.095000
+vn 0.884600 -0.450900 0.118900
+vn 0.875700 -0.463500 0.134800
+vn 0.851800 -0.512700 0.107500
+vn 0.831400 -0.551400 0.069000
+vn 0.846700 -0.519200 0.116400
+vn 0.826400 -0.557600 0.078100
+vn 0.868600 -0.473100 0.147000
+vn 0.863500 -0.479700 0.155600
+vn 0.807400 -0.589100 0.031600
+vn 0.814000 -0.580600 0.018400
+vn 0.779900 -0.625800 -0.004900
+vn 0.786300 -0.617600 -0.018300
+vn 0.802600 -0.595100 0.040900
+vn 0.775200 -0.631600 0.004600
+vn 0.822200 -0.569100 0.001300
+vn 0.794200 -0.606500 -0.035800
+vn 0.721000 -0.687400 -0.087600
+vn 0.728300 -0.677000 -0.105800
+vn 0.762800 -0.642600 -0.071600
+vn 0.755200 -0.653300 -0.053800
+vn 0.749000 -0.661300 -0.040000
+vn 0.715100 -0.695100 -0.073600
+vn 0.744600 -0.666800 -0.030300
+vn 0.710800 -0.700400 -0.063600
+vn 0.678100 -0.727300 -0.105500
+vn 0.683700 -0.719900 -0.119800
+vn 0.638000 -0.757900 -0.135800
+vn 0.643200 -0.750700 -0.150300
+vn 0.674100 -0.732500 -0.095300
+vn 0.634200 -0.762900 -0.125500
+vn 0.690600 -0.709900 -0.138300
+vn 0.649800 -0.741000 -0.169200
+vn 0.554300 -0.806500 -0.205500
+vn 0.560000 -0.797400 -0.224900
+vn 0.606100 -0.770300 -0.198100
+vn 0.600000 -0.779700 -0.179000
+vn 0.595100 -0.786600 -0.164200
+vn 0.549800 -0.813300 -0.190500
+vn 0.591500 -0.791500 -0.153700
+vn 0.546500 -0.817900 -0.179800
+vn 0.502100 -0.837700 -0.214600
+vn 0.506200 -0.831200 -0.229800
+vn 0.452000 -0.860000 -0.236700
+vn 0.455700 -0.853700 -0.252100
+vn 0.499100 -0.842200 -0.203800
+vn 0.449300 -0.864400 -0.225700
+vn 0.511400 -0.822300 -0.249500
+vn 0.460400 -0.845000 -0.272000
+vn 0.349100 -0.891300 -0.289300
+vn 0.352600 -0.883000 -0.309600
+vn 0.407300 -0.865300 -0.292100
+vn 0.403200 -0.873800 -0.271900
+vn 0.399900 -0.880000 -0.256400
+vn 0.346200 -0.897400 -0.273500
+vn 0.397500 -0.884200 -0.245300
+vn 0.344100 -0.901500 -0.262300
+vn 0.291000 -0.912300 -0.288200
+vn 0.293400 -0.906300 -0.304000
+vn 0.234300 -0.924600 -0.300400
+vn 0.236200 -0.918800 -0.316300
+vn 0.289300 -0.916300 -0.276900
+vn 0.232900 -0.928600 -0.289000
+vn 0.296400 -0.898200 -0.324500
+vn 0.238700 -0.910800 -0.336900
+vn 0.119200 -0.935400 -0.332700
+vn 0.120400 -0.927600 -0.353600
+vn 0.179800 -0.920600 -0.346600
+vn 0.178000 -0.928500 -0.325900
+vn 0.176500 -0.934200 -0.309900
+vn 0.118200 -0.941100 -0.316700
+vn 0.175500 -0.938100 -0.298400
+vn 0.117500 -0.945000 -0.305200
+vn 0.059400 -0.945300 -0.320700
+vn 0.059800 -0.939600 -0.336900
+vn 0.000000 -0.946700 -0.322100
+vn 0.000000 -0.941000 -0.338300
+vn 0.059000 -0.949100 -0.309200
+vn 0.000000 -0.950500 -0.310600
+vn 0.060500 -0.931900 -0.357700
+vn 0.000000 -0.933300 -0.359100
+vn -0.119200 -0.935400 -0.332700
+vn -0.120400 -0.927600 -0.353600
+vn -0.060500 -0.931900 -0.357700
+vn -0.059800 -0.939600 -0.336900
+vn -0.059400 -0.945300 -0.320700
+vn -0.118200 -0.941100 -0.316700
+vn -0.059000 -0.949100 -0.309200
+vn -0.117500 -0.945000 -0.305200
+vn -0.176500 -0.934200 -0.309900
+vn -0.178000 -0.928500 -0.325900
+vn -0.234300 -0.924600 -0.300300
+vn -0.236200 -0.918800 -0.316300
+vn -0.175500 -0.938100 -0.298400
+vn -0.232900 -0.928600 -0.289000
+vn -0.179800 -0.920600 -0.346600
+vn -0.238700 -0.910800 -0.336900
+vn -0.349100 -0.891300 -0.289300
+vn -0.352600 -0.883000 -0.309600
+vn -0.296400 -0.898200 -0.324500
+vn -0.293400 -0.906300 -0.304000
+vn -0.291000 -0.912300 -0.288200
+vn -0.346200 -0.897400 -0.273500
+vn -0.289300 -0.916300 -0.276900
+vn -0.344100 -0.901500 -0.262300
+vn -0.399900 -0.880000 -0.256400
+vn -0.403200 -0.873800 -0.271900
+vn -0.452000 -0.860000 -0.236700
+vn -0.455700 -0.853700 -0.252100
+vn -0.397500 -0.884200 -0.245300
+vn -0.449300 -0.864400 -0.225700
+vn -0.407300 -0.865300 -0.292100
+vn -0.460400 -0.845000 -0.272000
+vn -0.554300 -0.806500 -0.205500
+vn -0.560000 -0.797400 -0.224900
+vn -0.511400 -0.822300 -0.249500
+vn -0.506200 -0.831200 -0.229900
+vn -0.502100 -0.837700 -0.214600
+vn -0.549800 -0.813300 -0.190500
+vn -0.499100 -0.842200 -0.203800
+vn -0.546500 -0.817900 -0.179800
+vn -0.595100 -0.786600 -0.164200
+vn -0.600000 -0.779700 -0.179000
+vn -0.638000 -0.757900 -0.135800
+vn -0.643200 -0.750700 -0.150300
+vn -0.591500 -0.791500 -0.153700
+vn -0.634200 -0.762900 -0.125500
+vn -0.606100 -0.770300 -0.198100
+vn -0.649800 -0.741000 -0.169200
+vn -0.721000 -0.687400 -0.087600
+vn -0.728300 -0.677000 -0.105800
+vn -0.690600 -0.709900 -0.138300
+vn -0.683700 -0.719900 -0.119800
+vn -0.678100 -0.727300 -0.105500
+vn -0.715100 -0.695100 -0.073600
+vn -0.674100 -0.732500 -0.095300
+vn -0.710800 -0.700400 -0.063600
+vn -0.749000 -0.661300 -0.040000
+vn -0.755200 -0.653300 -0.053800
+vn -0.779900 -0.625800 -0.004900
+vn -0.786300 -0.617600 -0.018300
+vn -0.744600 -0.666800 -0.030300
+vn -0.775200 -0.631600 0.004600
+vn -0.762800 -0.642600 -0.071600
+vn -0.794200 -0.606500 -0.035800
+vn -0.838100 -0.542500 0.056200
+vn -0.846600 -0.530700 0.039500
+vn -0.822200 -0.569100 0.001300
+vn -0.814000 -0.580600 0.018400
+vn -0.807400 -0.589100 0.031600
+vn -0.831400 -0.551400 0.069000
+vn -0.802600 -0.595100 0.040900
+vn -0.826400 -0.557600 0.078100
+vn -0.851800 -0.512700 0.107500
+vn -0.858700 -0.503500 0.095000
+vn -0.868600 -0.473100 0.147000
+vn -0.875700 -0.463500 0.134800
+vn -0.846700 -0.519200 0.116400
+vn -0.863500 -0.479700 0.155600
+vn -0.867400 -0.491300 0.078700
+vn -0.884600 -0.450900 0.118900
+vn -0.898500 -0.381900 0.216200
+vn -0.907600 -0.368500 0.201100
+vn -0.898000 -0.409900 0.159800
+vn -0.889000 -0.422900 0.175400
+vn -0.881900 -0.432700 0.187200
+vn -0.891300 -0.392100 0.227700
+vn -0.876600 -0.439600 0.195600
+vn -0.886000 -0.399200 0.235800
+vn -0.896900 -0.351100 0.268600
+vn -0.904200 -0.340600 0.257400
+vn -0.898800 -0.309900 0.309900
+vn -0.906200 -0.299000 0.299000
+vn -0.891600 -0.358500 0.276500
+vn -0.893500 -0.317500 0.317500
+vn -0.913400 -0.326800 0.242800
+vn -0.915300 -0.284800 0.284800
+vn -0.898500 -0.216200 0.381900
+vn -0.907600 -0.201100 0.368500
+vn -0.913400 -0.242800 0.326800
+vn -0.904200 -0.257400 0.340600
+vn -0.896900 -0.268600 0.351100
+vn -0.891300 -0.227700 0.392100
+vn -0.891600 -0.276500 0.358500
+vn -0.886000 -0.235800 0.399200
+vn -0.881900 -0.187200 0.432700
+vn -0.889000 -0.175400 0.422900
+vn -0.868600 -0.147000 0.473100
+vn -0.875700 -0.134800 0.463500
+vn -0.876600 -0.195600 0.439600
+vn -0.863500 -0.155600 0.479700
+vn -0.898000 -0.159800 0.409900
+vn -0.884600 -0.118900 0.450900
+vn -0.838100 -0.056200 0.542500
+vn -0.846600 -0.039500 0.530700
+vn -0.867400 -0.078700 0.491300
+vn -0.858700 -0.095000 0.503500
+vn -0.851800 -0.107500 0.512700
+vn -0.831400 -0.069000 0.551400
+vn -0.846700 -0.116300 0.519200
+vn -0.826400 -0.078100 0.557600
+vn -0.807400 -0.031600 0.589100
+vn -0.814000 -0.018400 0.580600
+vn -0.779900 0.004900 0.625800
+vn -0.786300 0.018300 0.617600
+vn -0.802600 -0.040900 0.595100
+vn -0.775200 -0.004600 0.631600
+vn -0.822200 -0.001300 0.569100
+vn -0.794200 0.035800 0.606500
+vn -0.721000 0.087600 0.687400
+vn -0.728300 0.105800 0.677000
+vn -0.762800 0.071600 0.642600
+vn -0.755200 0.053800 0.653300
+vn -0.749000 0.040000 0.661300
+vn -0.715100 0.073600 0.695100
+vn -0.744600 0.030300 0.666800
+vn -0.710800 0.063600 0.700400
+vn -0.678100 0.105500 0.727300
+vn -0.683700 0.119800 0.719900
+vn -0.638000 0.135800 0.757900
+vn -0.643200 0.150300 0.750700
+vn -0.674100 0.095300 0.732500
+vn -0.634200 0.125500 0.762900
+vn -0.690600 0.138300 0.709900
+vn -0.649800 0.169200 0.741000
+vn -0.554300 0.205500 0.806500
+vn -0.560000 0.224900 0.797400
+vn -0.606100 0.198100 0.770300
+vn -0.600000 0.179000 0.779700
+vn -0.595100 0.164200 0.786600
+vn -0.549800 0.190500 0.813300
+vn -0.591500 0.153700 0.791500
+vn -0.546500 0.179800 0.817900
+vn -0.502100 0.214600 0.837700
+vn -0.506200 0.229900 0.831200
+vn -0.452000 0.236700 0.860000
+vn -0.455700 0.252100 0.853700
+vn -0.499100 0.203800 0.842200
+vn -0.449300 0.225700 0.864400
+vn -0.511400 0.249500 0.822300
+vn -0.460400 0.272000 0.845000
+vn -0.349100 0.289300 0.891300
+vn -0.352600 0.309600 0.883100
+vn -0.407300 0.292100 0.865300
+vn -0.403200 0.271900 0.873800
+vn -0.399900 0.256400 0.880000
+vn -0.346200 0.273500 0.897400
+vn -0.397500 0.245300 0.884200
+vn -0.344100 0.262300 0.901500
+vn -0.291000 0.288200 0.912300
+vn -0.293400 0.304000 0.906300
+vn -0.234300 0.300400 0.924600
+vn -0.236200 0.316300 0.918800
+vn -0.289300 0.276900 0.916300
+vn -0.232900 0.289000 0.928600
+vn -0.296400 0.324500 0.898200
+vn -0.238700 0.336900 0.910800
+vn -0.119200 0.332700 0.935400
+vn -0.120400 0.353600 0.927600
+vn -0.179800 0.346600 0.920600
+vn -0.178000 0.325900 0.928500
+vn -0.176500 0.309900 0.934200
+vn -0.118200 0.316700 0.941100
+vn -0.175500 0.298400 0.938100
+vn -0.117500 0.305200 0.945000
+vn -0.059400 0.320700 0.945300
+vn -0.059800 0.336900 0.939600
+vn 0.000000 0.322100 0.946700
+vn 0.000000 0.338300 0.941000
+vn -0.059000 0.309200 0.949100
+vn 0.000000 0.310600 0.950500
+vn -0.060500 0.357700 0.931900
+vn 0.000000 0.359100 0.933300
+vn 0.119200 0.332700 0.935400
+vn 0.120400 0.353600 0.927600
+vn 0.060500 0.357700 0.931900
+vn 0.059800 0.336900 0.939600
+vn 0.059400 0.320700 0.945300
+vn 0.118200 0.316700 0.941100
+vn 0.059000 0.309200 0.949100
+vn 0.117500 0.305200 0.945000
+vn 0.176500 0.309900 0.934200
+vn 0.178000 0.325900 0.928500
+vn 0.234300 0.300400 0.924600
+vn 0.236200 0.316300 0.918800
+vn 0.175500 0.298400 0.938100
+vn 0.232900 0.289000 0.928600
+vn 0.179800 0.346600 0.920600
+vn 0.238700 0.336900 0.910800
+vn 0.349100 0.289300 0.891300
+vn 0.352600 0.309600 0.883000
+vn 0.296400 0.324500 0.898200
+vn 0.293400 0.304000 0.906300
+vn 0.291000 0.288200 0.912300
+vn 0.346200 0.273500 0.897400
+vn 0.289300 0.276900 0.916300
+vn 0.344100 0.262300 0.901500
+vn 0.399900 0.256400 0.880000
+vn 0.403200 0.271900 0.873800
+vn 0.452000 0.236700 0.860000
+vn 0.455700 0.252100 0.853700
+vn 0.397500 0.245300 0.884200
+vn 0.449300 0.225700 0.864400
+vn 0.407300 0.292100 0.865300
+vn 0.460400 0.272000 0.845000
+vn 0.554300 0.205500 0.806500
+vn 0.560000 0.224900 0.797400
+vn 0.511400 0.249500 0.822300
+vn 0.506200 0.229900 0.831200
+vn 0.502100 0.214600 0.837700
+vn 0.549800 0.190500 0.813300
+vn 0.499100 0.203800 0.842200
+vn 0.546500 0.179800 0.817900
+vn 0.595100 0.164200 0.786600
+vn 0.600000 0.179000 0.779700
+vn 0.638000 0.135800 0.757900
+vn 0.643200 0.150300 0.750700
+vn 0.591500 0.153700 0.791500
+vn 0.634200 0.125500 0.762900
+vn 0.606100 0.198100 0.770300
+vn 0.649800 0.169200 0.741000
+vn 0.721000 0.087600 0.687400
+vn 0.728300 0.105800 0.677000
+vn 0.690600 0.138300 0.709900
+vn 0.683700 0.119800 0.719900
+vn 0.678100 0.105500 0.727300
+vn 0.715100 0.073600 0.695100
+vn 0.674100 0.095300 0.732500
+vn 0.710800 0.063600 0.700400
+vn 0.749000 0.040000 0.661300
+vn 0.755200 0.053800 0.653300
+vn 0.779900 0.004900 0.625800
+vn 0.786300 0.018300 0.617600
+vn 0.744600 0.030300 0.666800
+vn 0.775200 -0.004600 0.631600
+vn 0.762800 0.071600 0.642600
+vn 0.794200 0.035800 0.606500
+vn 0.838100 -0.056200 0.542500
+vn 0.846600 -0.039500 0.530700
+vn 0.822200 -0.001300 0.569100
+vn 0.814000 -0.018400 0.580600
+vn 0.807400 -0.031600 0.589100
+vn 0.831400 -0.069000 0.551400
+vn 0.802600 -0.040900 0.595100
+vn 0.826400 -0.078100 0.557600
+vn 0.851800 -0.107500 0.512700
+vn 0.858700 -0.095000 0.503500
+vn 0.868600 -0.147000 0.473100
+vn 0.875700 -0.134800 0.463500
+vn 0.846700 -0.116400 0.519200
+vn 0.863500 -0.155600 0.479700
+vn 0.867400 -0.078700 0.491300
+vn 0.884600 -0.118900 0.450900
+vn 0.898500 -0.216200 0.381900
+vn 0.907600 -0.201100 0.368500
+vn 0.898000 -0.159900 0.409900
+vn 0.889000 -0.175300 0.422900
+vn 0.881900 -0.187200 0.432700
+vn 0.891300 -0.227700 0.392100
+vn 0.876600 -0.195600 0.439600
+vn 0.886000 -0.235800 0.399200
+vn 0.896900 -0.268600 0.351100
+vn 0.904200 -0.257400 0.340600
+vn 0.898800 -0.309900 0.309900
+vn 0.906200 -0.299000 0.299000
+vn 0.891600 -0.276500 0.358500
+vn 0.893500 -0.317500 0.317500
+vn 0.913400 -0.242800 0.326800
+vn 0.915300 -0.284800 0.284800
+vn 0.898500 -0.381900 0.216200
+vn 0.907600 -0.368500 0.201100
+vn 0.913400 -0.326800 0.242800
+vn 0.904200 -0.340600 0.257400
+vn 0.896900 -0.351100 0.268600
+vn 0.891300 -0.392100 0.227700
+vn 0.891600 -0.358500 0.276500
+vn 0.886000 -0.399200 0.235800
+vn 0.881900 -0.432700 0.187200
+vn 0.889000 -0.422900 0.175300
+vn 0.876600 -0.439600 0.195600
+vn 0.898000 -0.409900 0.159800
+vn 0.762600 -0.621600 0.179100
+vn 0.771400 -0.614200 0.166600
+vn 0.790400 -0.578300 0.202200
+vn 0.781300 -0.586100 0.214400
+vn 0.806100 -0.541500 0.238900
+vn 0.796900 -0.549700 0.250600
+vn 0.777500 -0.608800 0.157700
+vn 0.796600 -0.572600 0.193600
+vn 0.812400 -0.535500 0.230600
+vn 0.769300 -0.596000 0.230000
+vn 0.750800 -0.631000 0.195300
+vn 0.753000 -0.608500 0.250300
+vn 0.734900 -0.642700 0.216300
+vn 0.784600 -0.560200 0.265700
+vn 0.768000 -0.573400 0.285100
+vn 0.729100 -0.665000 0.161500
+vn 0.740600 -0.656200 0.144700
+vn 0.704200 -0.698200 0.128600
+vn 0.715300 -0.689900 0.111300
+vn 0.713700 -0.676000 0.183200
+vn 0.689300 -0.708500 0.151000
+vn 0.749100 -0.649200 0.131800
+vn 0.755000 -0.644100 0.122700
+vn 0.723600 -0.683200 0.098000
+vn 0.729300 -0.678400 0.088600
+vn 0.655800 -0.753300 0.048500
+vn 0.663400 -0.747500 0.034400
+vn 0.694900 -0.716100 0.065500
+vn 0.686900 -0.722300 0.079200
+vn 0.668600 -0.743200 0.024500
+vn 0.700400 -0.711500 0.055800
+vn 0.676300 -0.730200 0.097000
+vn 0.645600 -0.760700 0.066700
+vn 0.662000 -0.739800 0.120000
+vn 0.631900 -0.769700 0.090400
+vn 0.612100 -0.789800 0.038000
+vn 0.621800 -0.782900 0.019200
+vn 0.575900 -0.817400 0.010700
+vn 0.585000 -0.811000 -0.008500
+vn 0.599200 -0.798200 0.062300
+vn 0.563700 -0.825200 0.035600
+vn 0.629000 -0.777400 0.004900
+vn 0.634000 -0.773300 -0.005300
+vn 0.591800 -0.805700 -0.023200
+vn 0.596500 -0.801900 -0.033600
+vn 0.504000 -0.861700 -0.058500
+vn 0.509900 -0.857100 -0.073800
+vn 0.551900 -0.832400 -0.049500
+vn 0.545600 -0.837300 -0.034500
+vn 0.513900 -0.853600 -0.084600
+vn 0.556300 -0.828800 -0.060100
+vn 0.537100 -0.843300 -0.014900
+vn 0.496200 -0.867300 -0.038500
+vn 0.525700 -0.850600 0.010600
+vn 0.485600 -0.874100 -0.012500
+vn 0.453100 -0.889400 -0.060200
+vn 0.460300 -0.884100 -0.080600
+vn 0.407800 -0.909500 -0.080100
+vn 0.414300 -0.904500 -0.100700
+vn 0.443500 -0.895600 -0.033800
+vn 0.399200 -0.915300 -0.053200
+vn 0.465600 -0.879700 -0.096100
+vn 0.469300 -0.876500 -0.107200
+vn 0.419100 -0.900400 -0.116500
+vn 0.422500 -0.897300 -0.127700
+vn 0.317300 -0.938700 -0.134400
+vn 0.321000 -0.935000 -0.150600
+vn 0.370800 -0.918900 -0.134700
+vn 0.366500 -0.922800 -0.118700
+vn 0.323600 -0.932200 -0.162000
+vn 0.373700 -0.916000 -0.146000
+vn 0.360800 -0.927500 -0.097800
+vn 0.312400 -0.943200 -0.113200
+vn 0.353100 -0.932900 -0.070500
+vn 0.305700 -0.948200 -0.085600
+vn 0.262600 -0.956600 -0.126400
+vn 0.266700 -0.952400 -0.147800
+vn 0.211300 -0.967700 -0.137300
+vn 0.214700 -0.963700 -0.158900
+vn 0.256900 -0.961400 -0.098500
+vn 0.206900 -0.972200 -0.109200
+vn 0.269800 -0.948800 -0.164200
+vn 0.272000 -0.946100 -0.175700
+vn 0.217200 -0.960200 -0.175400
+vn 0.218900 -0.957600 -0.187000
+vn 0.108300 -0.978800 -0.173800
+vn 0.109600 -0.975600 -0.190400
+vn 0.163600 -0.969100 -0.184100
+vn 0.161700 -0.972500 -0.167500
+vn 0.110400 -0.973100 -0.202200
+vn 0.165000 -0.966600 -0.195900
+vn 0.159200 -0.976400 -0.145800
+vn 0.106600 -0.982600 -0.152000
+vn 0.155800 -0.980700 -0.117500
+vn 0.104300 -0.986800 -0.123500
+vn 0.053500 -0.986400 -0.155600
+vn 0.054400 -0.982600 -0.177500
+vn 0.000000 -0.987600 -0.156800
+vn 0.000000 -0.983900 -0.178700
+vn 0.052400 -0.990500 -0.127100
+vn 0.000000 -0.991700 -0.128300
+vn 0.055000 -0.979400 -0.194200
+vn 0.055500 -0.977000 -0.206000
+vn 0.000000 -0.980700 -0.195500
+vn 0.000000 -0.978200 -0.207300
+vn -0.108300 -0.978800 -0.173800
+vn -0.109600 -0.975600 -0.190400
+vn -0.055000 -0.979400 -0.194200
+vn -0.054400 -0.982600 -0.177500
+vn -0.110400 -0.973100 -0.202200
+vn -0.055500 -0.977000 -0.206100
+vn -0.053500 -0.986400 -0.155600
+vn -0.106600 -0.982600 -0.152000
+vn -0.052400 -0.990500 -0.127100
+vn -0.104300 -0.986800 -0.123500
+vn -0.159200 -0.976400 -0.145800
+vn -0.161700 -0.972500 -0.167500
+vn -0.211300 -0.967700 -0.137300
+vn -0.214700 -0.963700 -0.158900
+vn -0.155800 -0.980700 -0.117500
+vn -0.206900 -0.972200 -0.109200
+vn -0.163600 -0.969100 -0.184200
+vn -0.165000 -0.966600 -0.195900
+vn -0.217200 -0.960200 -0.175400
+vn -0.218900 -0.957600 -0.187000
+vn -0.317300 -0.938700 -0.134400
+vn -0.321000 -0.935000 -0.150600
+vn -0.269800 -0.948800 -0.164200
+vn -0.266700 -0.952400 -0.147800
+vn -0.323600 -0.932200 -0.162100
+vn -0.272000 -0.946100 -0.175700
+vn -0.262600 -0.956600 -0.126400
+vn -0.312400 -0.943200 -0.113200
+vn -0.256900 -0.961400 -0.098500
+vn -0.305700 -0.948200 -0.085600
+vn -0.360800 -0.927500 -0.097800
+vn -0.366500 -0.922800 -0.118700
+vn -0.407800 -0.909500 -0.080100
+vn -0.414300 -0.904500 -0.100700
+vn -0.353100 -0.932900 -0.070500
+vn -0.399200 -0.915300 -0.053200
+vn -0.370800 -0.918900 -0.134700
+vn -0.373700 -0.916000 -0.146000
+vn -0.419100 -0.900400 -0.116500
+vn -0.422500 -0.897300 -0.127700
+vn -0.504000 -0.861700 -0.058500
+vn -0.509900 -0.857100 -0.073800
+vn -0.465600 -0.879700 -0.096100
+vn -0.460300 -0.884100 -0.080600
+vn -0.513900 -0.853600 -0.084600
+vn -0.469300 -0.876500 -0.107200
+vn -0.453100 -0.889400 -0.060200
+vn -0.496200 -0.867300 -0.038500
+vn -0.443500 -0.895600 -0.033800
+vn -0.485600 -0.874100 -0.012500
+vn -0.537100 -0.843300 -0.014800
+vn -0.545600 -0.837300 -0.034500
+vn -0.575900 -0.817400 0.010700
+vn -0.585000 -0.811000 -0.008500
+vn -0.525700 -0.850600 0.010600
+vn -0.563700 -0.825200 0.035600
+vn -0.551900 -0.832400 -0.049500
+vn -0.556300 -0.828800 -0.060100
+vn -0.591800 -0.805700 -0.023200
+vn -0.596500 -0.801900 -0.033600
+vn -0.655800 -0.753300 0.048500
+vn -0.663400 -0.747500 0.034400
+vn -0.629000 -0.777400 0.004900
+vn -0.621800 -0.782900 0.019200
+vn -0.668600 -0.743200 0.024500
+vn -0.634000 -0.773300 -0.005300
+vn -0.612100 -0.789800 0.038000
+vn -0.645600 -0.760700 0.066700
+vn -0.599200 -0.798200 0.062300
+vn -0.631900 -0.769700 0.090400
+vn -0.676300 -0.730200 0.097000
+vn -0.686900 -0.722300 0.079200
+vn -0.704200 -0.698200 0.128600
+vn -0.715300 -0.689900 0.111300
+vn -0.662000 -0.739800 0.120000
+vn -0.689300 -0.708500 0.151000
+vn -0.694900 -0.716100 0.065500
+vn -0.700400 -0.711500 0.055800
+vn -0.723600 -0.683200 0.098000
+vn -0.729300 -0.678400 0.088600
+vn -0.762600 -0.621600 0.179100
+vn -0.771400 -0.614200 0.166600
+vn -0.749100 -0.649200 0.131800
+vn -0.740600 -0.656200 0.144700
+vn -0.777500 -0.608800 0.157700
+vn -0.755000 -0.644100 0.122700
+vn -0.729100 -0.665000 0.161500
+vn -0.750800 -0.631000 0.195300
+vn -0.713700 -0.676000 0.183200
+vn -0.734900 -0.642700 0.216300
+vn -0.769300 -0.596000 0.230000
+vn -0.781300 -0.586100 0.214400
+vn -0.784600 -0.560200 0.265700
+vn -0.796900 -0.549700 0.250600
+vn -0.753000 -0.608500 0.250300
+vn -0.768000 -0.573400 0.285100
+vn -0.790300 -0.578300 0.202200
+vn -0.796600 -0.572600 0.193600
+vn -0.806100 -0.541500 0.238900
+vn -0.812400 -0.535500 0.230600
+vn -0.817700 -0.475400 0.324600
+vn -0.827100 -0.466300 0.313800
+vn -0.818300 -0.504000 0.276200
+vn -0.809000 -0.512700 0.287400
+vn -0.833600 -0.459800 0.306000
+vn -0.824800 -0.497800 0.268100
+vn -0.796500 -0.523800 0.302000
+vn -0.805000 -0.487000 0.338600
+vn -0.779700 -0.537800 0.320700
+vn -0.788100 -0.501800 0.356500
+vn -0.810200 -0.450100 0.375500
+vn -0.822900 -0.437800 0.362100
+vn -0.811900 -0.412800 0.412800
+vn -0.824600 -0.400000 0.400000
+vn -0.793100 -0.465600 0.392600
+vn -0.794800 -0.429100 0.429100
+vn -0.832400 -0.428300 0.351700
+vn -0.838900 -0.421500 0.344300
+vn -0.834100 -0.390000 0.390000
+vn -0.840700 -0.382900 0.382900
+vn -0.817700 -0.324600 0.475400
+vn -0.827100 -0.313800 0.466300
+vn -0.832400 -0.351700 0.428300
+vn -0.822900 -0.362100 0.437800
+vn -0.833600 -0.306000 0.459800
+vn -0.838900 -0.344300 0.421500
+vn -0.810200 -0.375500 0.450100
+vn -0.805000 -0.338600 0.487000
+vn -0.793100 -0.392600 0.465600
+vn -0.788100 -0.356500 0.501800
+vn -0.796500 -0.302000 0.523800
+vn -0.809000 -0.287400 0.512700
+vn -0.784600 -0.265700 0.560200
+vn -0.796900 -0.250600 0.549700
+vn -0.779700 -0.320700 0.537800
+vn -0.768000 -0.285100 0.573400
+vn -0.818300 -0.276200 0.504000
+vn -0.824800 -0.268100 0.497800
+vn -0.806100 -0.238900 0.541500
+vn -0.812400 -0.230600 0.535500
+vn -0.762600 -0.179100 0.621600
+vn -0.771400 -0.166600 0.614200
+vn -0.790300 -0.202200 0.578300
+vn -0.781300 -0.214400 0.586100
+vn -0.777500 -0.157700 0.608800
+vn -0.796600 -0.193600 0.572600
+vn -0.769300 -0.230000 0.596000
+vn -0.750800 -0.195300 0.631000
+vn -0.753000 -0.250300 0.608500
+vn -0.734900 -0.216300 0.642700
+vn -0.729100 -0.161500 0.665000
+vn -0.740600 -0.144700 0.656200
+vn -0.704200 -0.128600 0.698200
+vn -0.715300 -0.111300 0.689900
+vn -0.713700 -0.183200 0.676000
+vn -0.689300 -0.151000 0.708500
+vn -0.749100 -0.131800 0.649200
+vn -0.755000 -0.122700 0.644100
+vn -0.723600 -0.098000 0.683200
+vn -0.729300 -0.088600 0.678400
+vn -0.655800 -0.048500 0.753400
+vn -0.663400 -0.034400 0.747500
+vn -0.694900 -0.065500 0.716100
+vn -0.686900 -0.079200 0.722300
+vn -0.668600 -0.024500 0.743200
+vn -0.700400 -0.055800 0.711500
+vn -0.676300 -0.097000 0.730200
+vn -0.645600 -0.066700 0.760700
+vn -0.662000 -0.120000 0.739800
+vn -0.631900 -0.090400 0.769700
+vn -0.612100 -0.038000 0.789800
+vn -0.621800 -0.019300 0.782900
+vn -0.575900 -0.010700 0.817400
+vn -0.585000 0.008500 0.811000
+vn -0.599200 -0.062300 0.798200
+vn -0.563700 -0.035600 0.825200
+vn -0.629000 -0.004900 0.777400
+vn -0.634000 0.005300 0.773300
+vn -0.591800 0.023200 0.805700
+vn -0.596500 0.033600 0.801900
+vn -0.504000 0.058500 0.861700
+vn -0.509900 0.073800 0.857100
+vn -0.551900 0.049500 0.832400
+vn -0.545600 0.034500 0.837300
+vn -0.513900 0.084600 0.853600
+vn -0.556300 0.060100 0.828800
+vn -0.537100 0.014900 0.843300
+vn -0.496200 0.038500 0.867300
+vn -0.525700 -0.010600 0.850600
+vn -0.485600 0.012600 0.874100
+vn -0.453100 0.060200 0.889400
+vn -0.460300 0.080600 0.884100
+vn -0.407800 0.080100 0.909500
+vn -0.414300 0.100700 0.904500
+vn -0.443500 0.033800 0.895600
+vn -0.399200 0.053200 0.915300
+vn -0.465600 0.096100 0.879700
+vn -0.469300 0.107200 0.876500
+vn -0.419100 0.116500 0.900400
+vn -0.422500 0.127700 0.897300
+vn -0.317300 0.134400 0.938700
+vn -0.321000 0.150600 0.935000
+vn -0.370800 0.134700 0.918900
+vn -0.366500 0.118700 0.922800
+vn -0.323600 0.162100 0.932200
+vn -0.373700 0.146000 0.916000
+vn -0.360800 0.097800 0.927500
+vn -0.312400 0.113200 0.943200
+vn -0.353100 0.070500 0.932900
+vn -0.305700 0.085600 0.948200
+vn -0.262600 0.126400 0.956600
+vn -0.266700 0.147800 0.952400
+vn -0.211300 0.137300 0.967700
+vn -0.214700 0.158900 0.963700
+vn -0.256900 0.098500 0.961400
+vn -0.206900 0.109200 0.972200
+vn -0.269800 0.164200 0.948800
+vn -0.272000 0.175700 0.946100
+vn -0.217200 0.175400 0.960200
+vn -0.218900 0.187000 0.957600
+vn -0.108300 0.173800 0.978800
+vn -0.109600 0.190400 0.975600
+vn -0.163600 0.184200 0.969100
+vn -0.161700 0.167500 0.972500
+vn -0.110400 0.202200 0.973100
+vn -0.165000 0.195900 0.966600
+vn -0.159200 0.145800 0.976400
+vn -0.106600 0.151900 0.982600
+vn -0.155800 0.117500 0.980700
+vn -0.104300 0.123500 0.986800
+vn -0.053500 0.155600 0.986400
+vn -0.054400 0.177500 0.982600
+vn 0.000000 0.156800 0.987600
+vn 0.000000 0.178700 0.983900
+vn -0.052400 0.127100 0.990500
+vn 0.000000 0.128300 0.991700
+vn -0.055000 0.194200 0.979400
+vn -0.055500 0.206000 0.977000
+vn 0.000000 0.195500 0.980700
+vn 0.000000 0.207300 0.978200
+vn 0.108300 0.173800 0.978800
+vn 0.109600 0.190400 0.975600
+vn 0.055000 0.194200 0.979400
+vn 0.054400 0.177500 0.982600
+vn 0.110400 0.202200 0.973100
+vn 0.055500 0.206000 0.977000
+vn 0.053500 0.155600 0.986400
+vn 0.106600 0.152000 0.982600
+vn 0.052400 0.127100 0.990500
+vn 0.104300 0.123500 0.986800
+vn 0.159200 0.145800 0.976400
+vn 0.161700 0.167500 0.972500
+vn 0.211300 0.137300 0.967700
+vn 0.214700 0.158900 0.963700
+vn 0.155800 0.117500 0.980700
+vn 0.206900 0.109200 0.972200
+vn 0.163600 0.184200 0.969100
+vn 0.165000 0.195900 0.966600
+vn 0.217200 0.175400 0.960200
+vn 0.218900 0.187000 0.957600
+vn 0.317300 0.134400 0.938700
+vn 0.321000 0.150600 0.935000
+vn 0.269800 0.164200 0.948800
+vn 0.266700 0.147800 0.952400
+vn 0.323600 0.162100 0.932200
+vn 0.272000 0.175700 0.946100
+vn 0.262600 0.126400 0.956600
+vn 0.312400 0.113200 0.943200
+vn 0.256900 0.098500 0.961400
+vn 0.305700 0.085600 0.948200
+vn 0.360800 0.097800 0.927500
+vn 0.366500 0.118700 0.922800
+vn 0.407800 0.080100 0.909500
+vn 0.414300 0.100700 0.904500
+vn 0.353100 0.070500 0.932900
+vn 0.399200 0.053200 0.915300
+vn 0.370800 0.134700 0.918900
+vn 0.373700 0.146000 0.916000
+vn 0.419100 0.116500 0.900400
+vn 0.422500 0.127700 0.897300
+vn 0.504000 0.058500 0.861700
+vn 0.509900 0.073800 0.857100
+vn 0.465600 0.096100 0.879700
+vn 0.460300 0.080600 0.884100
+vn 0.513900 0.084600 0.853600
+vn 0.469300 0.107200 0.876500
+vn 0.453100 0.060200 0.889400
+vn 0.496200 0.038500 0.867300
+vn 0.443500 0.033800 0.895600
+vn 0.485600 0.012600 0.874100
+vn 0.537100 0.014900 0.843300
+vn 0.545600 0.034500 0.837300
+vn 0.575900 -0.010700 0.817400
+vn 0.585000 0.008500 0.811000
+vn 0.525700 -0.010600 0.850600
+vn 0.563700 -0.035600 0.825200
+vn 0.551900 0.049500 0.832400
+vn 0.556300 0.060100 0.828800
+vn 0.591800 0.023200 0.805700
+vn 0.596500 0.033600 0.801900
+vn 0.655800 -0.048500 0.753300
+vn 0.663400 -0.034400 0.747500
+vn 0.629000 -0.004900 0.777400
+vn 0.621800 -0.019300 0.782900
+vn 0.668600 -0.024500 0.743200
+vn 0.634000 0.005300 0.773300
+vn 0.612100 -0.038000 0.789800
+vn 0.645600 -0.066700 0.760700
+vn 0.599200 -0.062300 0.798200
+vn 0.631900 -0.090400 0.769700
+vn 0.676300 -0.097000 0.730200
+vn 0.686900 -0.079200 0.722300
+vn 0.704200 -0.128600 0.698200
+vn 0.715300 -0.111300 0.689900
+vn 0.662000 -0.120000 0.739800
+vn 0.689300 -0.151000 0.708500
+vn 0.694900 -0.065500 0.716100
+vn 0.700400 -0.055800 0.711500
+vn 0.723600 -0.098000 0.683200
+vn 0.729300 -0.088600 0.678400
+vn 0.762600 -0.179100 0.621600
+vn 0.771400 -0.166600 0.614200
+vn 0.749100 -0.131800 0.649200
+vn 0.740600 -0.144700 0.656200
+vn 0.777500 -0.157700 0.608800
+vn 0.755000 -0.122700 0.644100
+vn 0.729100 -0.161500 0.665000
+vn 0.750800 -0.195300 0.631000
+vn 0.713700 -0.183200 0.676000
+vn 0.734900 -0.216300 0.642700
+vn 0.769300 -0.230000 0.596000
+vn 0.781300 -0.214400 0.586100
+vn 0.784600 -0.265700 0.560200
+vn 0.796900 -0.250600 0.549700
+vn 0.753000 -0.250300 0.608500
+vn 0.768000 -0.285100 0.573400
+vn 0.790300 -0.202200 0.578300
+vn 0.796600 -0.193600 0.572600
+vn 0.806100 -0.238900 0.541500
+vn 0.812400 -0.230600 0.535500
+vn 0.817700 -0.324600 0.475400
+vn 0.827100 -0.313800 0.466300
+vn 0.818300 -0.276200 0.504000
+vn 0.809000 -0.287400 0.512700
+vn 0.833600 -0.306000 0.459800
+vn 0.824800 -0.268100 0.497800
+vn 0.796500 -0.302000 0.523800
+vn 0.805000 -0.338600 0.487000
+vn 0.779700 -0.320700 0.537800
+vn 0.788100 -0.356500 0.501800
+vn 0.810200 -0.375500 0.450100
+vn 0.822900 -0.362100 0.437800
+vn 0.811900 -0.412800 0.412800
+vn 0.824600 -0.400000 0.400000
+vn 0.793100 -0.392600 0.465600
+vn 0.794800 -0.429100 0.429100
+vn 0.832400 -0.351700 0.428300
+vn 0.838900 -0.344300 0.421500
+vn 0.834100 -0.390000 0.390000
+vn 0.840700 -0.382900 0.382900
+vn 0.817700 -0.475400 0.324600
+vn 0.827100 -0.466300 0.313800
+vn 0.832400 -0.428300 0.351700
+vn 0.822900 -0.437800 0.362100
+vn 0.833600 -0.459800 0.306000
+vn 0.838900 -0.421500 0.344300
+vn 0.810200 -0.450100 0.375500
+vn 0.805000 -0.487000 0.338600
+vn 0.793100 -0.465600 0.392600
+vn 0.788100 -0.501800 0.356500
+vn 0.796500 -0.523800 0.302000
+vn 0.809000 -0.512700 0.287400
+vn 0.779700 -0.537800 0.320700
+vn 0.818300 -0.504000 0.276200
+vn 0.824800 -0.497800 0.268100
+vn 0.691900 -0.670100 0.268700
+vn 0.715000 -0.656100 0.241200
+vn 0.732600 -0.622900 0.274300
+vn 0.709000 -0.637900 0.300600
+vn 0.747200 -0.588700 0.308300
+vn 0.723100 -0.604900 0.333500
+vn 0.682100 -0.653200 0.328600
+vn 0.665700 -0.684100 0.297900
+vn 0.652500 -0.668100 0.357600
+vn 0.636800 -0.697700 0.328200
+vn 0.695800 -0.621400 0.360200
+vn 0.665500 -0.637700 0.387900
+vn 0.646500 -0.714300 0.267900
+vn 0.671900 -0.701500 0.237500
+vn 0.624300 -0.743700 0.238800
+vn 0.648900 -0.732000 0.207200
+vn 0.618300 -0.726600 0.299600
+vn 0.597200 -0.754700 0.271700
+vn 0.694400 -0.688600 0.209100
+vn 0.670600 -0.720100 0.177800
+vn 0.594800 -0.789600 0.150200
+vn 0.614800 -0.779700 0.118800
+vn 0.644000 -0.750600 0.147600
+vn 0.623200 -0.761500 0.178000
+vn 0.599600 -0.772100 0.210700
+vn 0.572300 -0.799100 0.183900
+vn 0.573400 -0.781800 0.244800
+vn 0.547300 -0.807600 0.219300
+vn 0.542600 -0.824900 0.158500
+vn 0.564000 -0.816400 0.123800
+vn 0.510400 -0.849400 0.134300
+vn 0.530500 -0.841900 0.098700
+vn 0.518900 -0.832300 0.195000
+vn 0.488100 -0.855600 0.171900
+vn 0.582900 -0.807400 0.091500
+vn 0.548300 -0.833700 0.065500
+vn 0.457100 -0.887800 0.053400
+vn 0.472400 -0.881200 0.018700
+vn 0.511400 -0.858300 0.041200
+vn 0.494800 -0.865700 0.075100
+vn 0.476000 -0.872300 0.111700
+vn 0.439700 -0.893500 0.090800
+vn 0.455200 -0.877600 0.150200
+vn 0.420500 -0.897900 0.130200
+vn 0.401500 -0.913100 0.071600
+vn 0.417300 -0.908100 0.033400
+vn 0.361300 -0.930800 0.054100
+vn 0.375700 -0.926600 0.015200
+vn 0.383900 -0.916500 0.111900
+vn 0.345500 -0.933600 0.095100
+vn 0.431400 -0.902200 -0.002000
+vn 0.388300 -0.921300 -0.020800
+vn 0.287700 -0.957600 -0.015300
+vn 0.297300 -0.953300 -0.052300
+vn 0.343500 -0.938400 -0.037600
+vn 0.332300 -0.943100 -0.001100
+vn 0.319700 -0.946700 0.038400
+vn 0.276700 -0.960600 0.024800
+vn 0.305600 -0.948700 0.080200
+vn 0.264600 -0.962000 0.067100
+vn 0.232600 -0.972500 0.013100
+vn 0.241800 -0.969900 -0.027400
+vn 0.187200 -0.982300 0.003500
+vn 0.194600 -0.980100 -0.037400
+vn 0.222400 -0.973300 0.056000
+vn 0.179000 -0.982700 0.046800
+vn 0.249900 -0.966100 -0.064900
+vn 0.201200 -0.976700 -0.075200
+vn 0.098200 -0.993800 -0.050900
+vn 0.101500 -0.990800 -0.089100
+vn 0.151600 -0.984900 -0.083300
+vn 0.146600 -0.988100 -0.045300
+vn 0.141000 -0.990000 -0.004000
+vn 0.094400 -0.995500 -0.009400
+vn 0.134900 -0.990100 0.039600
+vn 0.090300 -0.995300 0.034500
+vn 0.047400 -0.998800 -0.012700
+vn 0.049300 -0.997300 -0.054300
+vn 0.000000 -0.999900 -0.013700
+vn 0.000000 -0.998400 -0.055400
+vn 0.045300 -0.998500 0.031300
+vn 0.000000 -0.999500 0.030300
+vn 0.051000 -0.994400 -0.092600
+vn 0.000000 -0.995600 -0.093800
+vn -0.098200 -0.993900 -0.050900
+vn -0.101500 -0.990800 -0.089100
+vn -0.051000 -0.994400 -0.092600
+vn -0.049300 -0.997300 -0.054300
+vn -0.047400 -0.998800 -0.012700
+vn -0.094400 -0.995500 -0.009400
+vn -0.045300 -0.998500 0.031300
+vn -0.090300 -0.995300 0.034500
+vn -0.141000 -0.990000 -0.004000
+vn -0.146600 -0.988100 -0.045300
+vn -0.187200 -0.982300 0.003500
+vn -0.194600 -0.980100 -0.037400
+vn -0.134800 -0.990100 0.039600
+vn -0.179000 -0.982700 0.046800
+vn -0.151600 -0.984900 -0.083300
+vn -0.201200 -0.976700 -0.075200
+vn -0.287700 -0.957600 -0.015300
+vn -0.297300 -0.953300 -0.052300
+vn -0.249900 -0.966100 -0.064900
+vn -0.241800 -0.969900 -0.027400
+vn -0.232600 -0.972500 0.013200
+vn -0.276700 -0.960600 0.024800
+vn -0.222400 -0.973300 0.056000
+vn -0.264600 -0.962000 0.067100
+vn -0.319700 -0.946700 0.038400
+vn -0.332300 -0.943100 -0.001100
+vn -0.361300 -0.930800 0.054100
+vn -0.375700 -0.926600 0.015200
+vn -0.305600 -0.948700 0.080200
+vn -0.345500 -0.933600 0.095100
+vn -0.343500 -0.938400 -0.037600
+vn -0.388300 -0.921300 -0.020800
+vn -0.457100 -0.887800 0.053400
+vn -0.472400 -0.881200 0.018700
+vn -0.431400 -0.902200 -0.002000
+vn -0.417300 -0.908100 0.033400
+vn -0.401500 -0.913100 0.071600
+vn -0.439700 -0.893500 0.090800
+vn -0.383900 -0.916500 0.111900
+vn -0.420500 -0.897900 0.130200
+vn -0.476000 -0.872300 0.111700
+vn -0.494800 -0.865700 0.075100
+vn -0.510400 -0.849400 0.134300
+vn -0.530500 -0.841900 0.098700
+vn -0.455200 -0.877600 0.150200
+vn -0.488100 -0.855600 0.171800
+vn -0.511400 -0.858300 0.041200
+vn -0.548300 -0.833700 0.065500
+vn -0.594800 -0.789600 0.150200
+vn -0.614800 -0.779700 0.118800
+vn -0.582900 -0.807400 0.091500
+vn -0.564000 -0.816400 0.123800
+vn -0.542600 -0.824900 0.158500
+vn -0.572300 -0.799100 0.183900
+vn -0.518900 -0.832300 0.195000
+vn -0.547300 -0.807600 0.219300
+vn -0.599600 -0.772100 0.210700
+vn -0.623200 -0.761500 0.178000
+vn -0.624300 -0.743700 0.238800
+vn -0.648900 -0.732000 0.207200
+vn -0.573400 -0.781800 0.244800
+vn -0.597200 -0.754700 0.271700
+vn -0.644000 -0.750600 0.147600
+vn -0.670600 -0.720100 0.177800
+vn -0.691900 -0.670100 0.268700
+vn -0.715000 -0.656100 0.241200
+vn -0.694400 -0.688600 0.209100
+vn -0.671900 -0.701500 0.237500
+vn -0.646500 -0.714300 0.267900
+vn -0.665700 -0.684100 0.297900
+vn -0.618300 -0.726600 0.299600
+vn -0.636800 -0.697700 0.328200
+vn -0.682100 -0.653200 0.328600
+vn -0.709000 -0.637900 0.300600
+vn -0.695800 -0.621400 0.360200
+vn -0.723100 -0.604900 0.333500
+vn -0.652500 -0.668100 0.357600
+vn -0.665500 -0.637700 0.387900
+vn -0.732600 -0.622900 0.274300
+vn -0.747200 -0.588700 0.308300
+vn -0.742000 -0.537500 0.400600
+vn -0.766700 -0.519100 0.377700
+vn -0.758600 -0.554000 0.342800
+vn -0.734100 -0.571300 0.366900
+vn -0.706400 -0.589100 0.392400
+vn -0.714000 -0.556500 0.424800
+vn -0.675700 -0.606800 0.418600
+vn -0.682900 -0.575600 0.449700
+vn -0.718500 -0.523700 0.457600
+vn -0.746700 -0.503400 0.434700
+vn -0.720100 -0.490600 0.490600
+vn -0.748300 -0.469000 0.469000
+vn -0.687300 -0.544200 0.481000
+vn -0.688800 -0.512600 0.512600
+vn -0.771600 -0.483800 0.412800
+vn -0.773300 -0.448300 0.448300
+vn -0.742000 -0.400600 0.537500
+vn -0.766700 -0.377700 0.519100
+vn -0.771600 -0.412800 0.483800
+vn -0.746700 -0.434700 0.503400
+vn -0.718500 -0.457600 0.523700
+vn -0.714000 -0.424800 0.556500
+vn -0.687300 -0.481000 0.544200
+vn -0.682900 -0.449700 0.575600
+vn -0.706400 -0.392400 0.589100
+vn -0.734100 -0.366900 0.571300
+vn -0.695800 -0.360200 0.621400
+vn -0.723100 -0.333500 0.604900
+vn -0.675700 -0.418600 0.606800
+vn -0.665500 -0.387900 0.637700
+vn -0.758600 -0.342800 0.554000
+vn -0.747200 -0.308300 0.588700
+vn -0.691900 -0.268700 0.670100
+vn -0.715000 -0.241200 0.656100
+vn -0.732600 -0.274300 0.622900
+vn -0.709000 -0.300600 0.637900
+vn -0.682100 -0.328600 0.653200
+vn -0.665700 -0.297900 0.684100
+vn -0.652500 -0.357600 0.668100
+vn -0.636800 -0.328200 0.697700
+vn -0.646500 -0.267900 0.714300
+vn -0.671900 -0.237500 0.701500
+vn -0.624300 -0.238800 0.743700
+vn -0.648900 -0.207200 0.732000
+vn -0.618300 -0.299600 0.726600
+vn -0.597200 -0.271700 0.754700
+vn -0.694400 -0.209100 0.688600
+vn -0.670600 -0.177800 0.720100
+vn -0.594800 -0.150200 0.789600
+vn -0.614800 -0.118800 0.779700
+vn -0.644000 -0.147600 0.750600
+vn -0.623200 -0.178000 0.761500
+vn -0.599600 -0.210700 0.772100
+vn -0.572300 -0.183900 0.799100
+vn -0.573400 -0.244800 0.781800
+vn -0.547300 -0.219300 0.807600
+vn -0.542600 -0.158500 0.824900
+vn -0.564000 -0.123800 0.816400
+vn -0.510400 -0.134300 0.849400
+vn -0.530500 -0.098700 0.841900
+vn -0.518900 -0.195000 0.832300
+vn -0.488100 -0.171800 0.855600
+vn -0.582900 -0.091500 0.807400
+vn -0.548300 -0.065500 0.833700
+vn -0.457100 -0.053400 0.887800
+vn -0.472400 -0.018700 0.881200
+vn -0.511400 -0.041200 0.858300
+vn -0.494800 -0.075100 0.865700
+vn -0.476000 -0.111700 0.872300
+vn -0.439700 -0.090800 0.893500
+vn -0.455200 -0.150200 0.877600
+vn -0.420500 -0.130200 0.897900
+vn -0.401500 -0.071600 0.913100
+vn -0.417300 -0.033400 0.908100
+vn -0.361300 -0.054100 0.930800
+vn -0.375700 -0.015200 0.926600
+vn -0.383900 -0.111900 0.916500
+vn -0.345500 -0.095100 0.933600
+vn -0.431400 0.002000 0.902200
+vn -0.388300 0.020800 0.921300
+vn -0.287700 0.015300 0.957600
+vn -0.297300 0.052300 0.953300
+vn -0.343500 0.037600 0.938400
+vn -0.332300 0.001100 0.943100
+vn -0.319700 -0.038400 0.946700
+vn -0.276700 -0.024800 0.960600
+vn -0.305600 -0.080200 0.948700
+vn -0.264600 -0.067100 0.962000
+vn -0.232600 -0.013200 0.972500
+vn -0.241800 0.027400 0.969900
+vn -0.187200 -0.003500 0.982300
+vn -0.194600 0.037400 0.980100
+vn -0.222400 -0.056000 0.973300
+vn -0.179000 -0.046800 0.982700
+vn -0.249900 0.064900 0.966100
+vn -0.201200 0.075200 0.976700
+vn -0.098200 0.050900 0.993800
+vn -0.101500 0.089100 0.990800
+vn -0.151600 0.083300 0.984900
+vn -0.146600 0.045300 0.988100
+vn -0.141000 0.004000 0.990000
+vn -0.094400 0.009400 0.995500
+vn -0.134900 -0.039600 0.990100
+vn -0.090300 -0.034500 0.995300
+vn -0.047400 0.012700 0.998800
+vn -0.049300 0.054300 0.997300
+vn 0.000000 0.013700 0.999900
+vn 0.000000 0.055400 0.998400
+vn -0.045300 -0.031300 0.998500
+vn 0.000000 -0.030300 0.999500
+vn -0.051000 0.092600 0.994400
+vn 0.000000 0.093800 0.995600
+vn 0.098200 0.050900 0.993800
+vn 0.101500 0.089100 0.990800
+vn 0.051000 0.092600 0.994400
+vn 0.049300 0.054300 0.997300
+vn 0.047400 0.012700 0.998800
+vn 0.094400 0.009400 0.995500
+vn 0.045300 -0.031300 0.998500
+vn 0.090300 -0.034500 0.995300
+vn 0.141000 0.004000 0.990000
+vn 0.146600 0.045300 0.988100
+vn 0.187200 -0.003500 0.982300
+vn 0.194600 0.037400 0.980100
+vn 0.134900 -0.039600 0.990100
+vn 0.179000 -0.046800 0.982700
+vn 0.151600 0.083300 0.984900
+vn 0.201200 0.075200 0.976700
+vn 0.287700 0.015300 0.957600
+vn 0.297300 0.052300 0.953300
+vn 0.249900 0.064900 0.966100
+vn 0.241800 0.027400 0.969900
+vn 0.232600 -0.013200 0.972500
+vn 0.276700 -0.024800 0.960600
+vn 0.222400 -0.056000 0.973300
+vn 0.264600 -0.067100 0.962000
+vn 0.319700 -0.038400 0.946700
+vn 0.332300 0.001100 0.943100
+vn 0.361300 -0.054100 0.930800
+vn 0.375700 -0.015200 0.926600
+vn 0.305600 -0.080200 0.948700
+vn 0.345500 -0.095100 0.933600
+vn 0.343500 0.037600 0.938400
+vn 0.388300 0.020800 0.921300
+vn 0.457100 -0.053400 0.887800
+vn 0.472400 -0.018700 0.881200
+vn 0.431400 0.002000 0.902200
+vn 0.417300 -0.033400 0.908100
+vn 0.401500 -0.071600 0.913100
+vn 0.439700 -0.090800 0.893500
+vn 0.383900 -0.111900 0.916500
+vn 0.420500 -0.130200 0.897900
+vn 0.476000 -0.111700 0.872300
+vn 0.494800 -0.075100 0.865700
+vn 0.510400 -0.134300 0.849400
+vn 0.530500 -0.098700 0.841900
+vn 0.455200 -0.150200 0.877600
+vn 0.488100 -0.171800 0.855600
+vn 0.511400 -0.041200 0.858300
+vn 0.548300 -0.065500 0.833700
+vn 0.594800 -0.150200 0.789600
+vn 0.614800 -0.118800 0.779700
+vn 0.582900 -0.091500 0.807400
+vn 0.564000 -0.123800 0.816400
+vn 0.542600 -0.158500 0.824900
+vn 0.572300 -0.183900 0.799100
+vn 0.518900 -0.195000 0.832300
+vn 0.547300 -0.219300 0.807600
+vn 0.599600 -0.210700 0.772100
+vn 0.623200 -0.178000 0.761500
+vn 0.624300 -0.238800 0.743700
+vn 0.648900 -0.207200 0.732000
+vn 0.573400 -0.244900 0.781800
+vn 0.597200 -0.271700 0.754700
+vn 0.644000 -0.147600 0.750600
+vn 0.670600 -0.177800 0.720100
+vn 0.691900 -0.268700 0.670100
+vn 0.715000 -0.241200 0.656100
+vn 0.694400 -0.209100 0.688600
+vn 0.671900 -0.237500 0.701500
+vn 0.646500 -0.267900 0.714300
+vn 0.665700 -0.297900 0.684100
+vn 0.618300 -0.299600 0.726600
+vn 0.636800 -0.328200 0.697700
+vn 0.682100 -0.328600 0.653200
+vn 0.709000 -0.300600 0.637900
+vn 0.695800 -0.360200 0.621400
+vn 0.723100 -0.333500 0.604900
+vn 0.652500 -0.357600 0.668100
+vn 0.665500 -0.387900 0.637700
+vn 0.732600 -0.274300 0.622900
+vn 0.747200 -0.308300 0.588700
+vn 0.742000 -0.400600 0.537500
+vn 0.766700 -0.377700 0.519100
+vn 0.758600 -0.342800 0.554000
+vn 0.734100 -0.366900 0.571300
+vn 0.706400 -0.392400 0.589100
+vn 0.714000 -0.424800 0.556500
+vn 0.675700 -0.418600 0.606800
+vn 0.682900 -0.449700 0.575600
+vn 0.718500 -0.457600 0.523700
+vn 0.746700 -0.434700 0.503400
+vn 0.720100 -0.490600 0.490600
+vn 0.748300 -0.469000 0.469000
+vn 0.687300 -0.481000 0.544200
+vn 0.688800 -0.512600 0.512600
+vn 0.771600 -0.412800 0.483800
+vn 0.773300 -0.448300 0.448300
+vn 0.742000 -0.537500 0.400600
+vn 0.766700 -0.519100 0.377700
+vn 0.771600 -0.483800 0.412800
+vn 0.746700 -0.503400 0.434700
+vn 0.718500 -0.523700 0.457600
+vn 0.714000 -0.556500 0.424800
+vn 0.687300 -0.544200 0.481000
+vn 0.682900 -0.575600 0.449700
+vn 0.706400 -0.589100 0.392400
+vn 0.734100 -0.571300 0.366900
+vn 0.675700 -0.606800 0.418600
+vn 0.758600 -0.554000 0.342800
+vn 0.592900 -0.714800 0.370700
+vn 0.575600 -0.741800 0.344100
+vn 0.593200 -0.735900 0.326200
+vn 0.611000 -0.708200 0.353700
+vn 0.555800 -0.767900 0.318300
+vn 0.572900 -0.762900 0.299500
+vn 0.626100 -0.679800 0.381900
+vn 0.607700 -0.687200 0.398000
+vn 0.638600 -0.650600 0.410900
+vn 0.619900 -0.658800 0.426100
+vn 0.594900 -0.692000 0.408800
+vn 0.580200 -0.719100 0.382200
+vn 0.587800 -0.694700 0.414600
+vn 0.572800 -0.721700 0.388700
+vn 0.607100 -0.664200 0.436200
+vn 0.600200 -0.667000 0.441300
+vn 0.563100 -0.745600 0.356400
+vn 0.543400 -0.771200 0.331400
+vn 0.555300 -0.747900 0.363700
+vn 0.535300 -0.773400 0.339600
+vn 0.509100 -0.817300 0.269900
+vn 0.482500 -0.840200 0.247400
+vn 0.497700 -0.837300 0.226100
+vn 0.525000 -0.813700 0.249300
+vn 0.453700 -0.861900 0.226200
+vn 0.468100 -0.859800 0.204000
+vn 0.550100 -0.788900 0.273800
+vn 0.533500 -0.793200 0.293500
+vn 0.521400 -0.796000 0.307400
+vn 0.497300 -0.819500 0.284600
+vn 0.513000 -0.797800 0.316700
+vn 0.488600 -0.821100 0.294900
+vn 0.471100 -0.841900 0.262900
+vn 0.442800 -0.863200 0.242500
+vn 0.462200 -0.843200 0.274400
+vn 0.433900 -0.864100 0.255200
+vn 0.390600 -0.901200 0.187900
+vn 0.356500 -0.918500 0.171100
+vn 0.368100 -0.918100 0.146600
+vn 0.403200 -0.900300 0.164100
+vn 0.320800 -0.934200 0.155700
+vn 0.331300 -0.934400 0.130600
+vn 0.436500 -0.880800 0.183300
+vn 0.423000 -0.882300 0.206300
+vn 0.412500 -0.883100 0.223400
+vn 0.380700 -0.901500 0.205800
+vn 0.403700 -0.883500 0.237300
+vn 0.372100 -0.901500 0.220900
+vn 0.347400 -0.918300 0.189700
+vn 0.312400 -0.933700 0.175100
+vn 0.339100 -0.917900 0.206000
+vn 0.304500 -0.932800 0.192500
+vn 0.245500 -0.960600 0.130100
+vn 0.206300 -0.971100 0.119900
+vn 0.213100 -0.972500 0.093200
+vn 0.253600 -0.961700 0.103900
+vn 0.166000 -0.979800 0.111500
+vn 0.171600 -0.981500 0.084400
+vn 0.293000 -0.949000 0.116300
+vn 0.283700 -0.948300 0.142000
+vn 0.276100 -0.947300 0.162100
+vn 0.238900 -0.959300 0.150700
+vn 0.268900 -0.946100 0.180500
+vn 0.232400 -0.957600 0.170200
+vn 0.200700 -0.969400 0.141100
+vn 0.161400 -0.977800 0.133100
+vn 0.195000 -0.967400 0.161400
+vn 0.156800 -0.975500 0.154100
+vn 0.083700 -0.991400 0.100200
+vn 0.042000 -0.994400 0.097400
+vn 0.043500 -0.996600 0.069700
+vn 0.086500 -0.993600 0.072600
+vn 0.000000 -0.995300 0.096500
+vn 0.000000 -0.997600 0.068700
+vn 0.129200 -0.988600 0.077500
+vn 0.125100 -0.986600 0.104900
+vn 0.121600 -0.984400 0.126900
+vn 0.081400 -0.989100 0.122400
+vn 0.118000 -0.981800 0.148500
+vn 0.079000 -0.986300 0.144500
+vn 0.040900 -0.991900 0.119800
+vn 0.000000 -0.992900 0.118900
+vn 0.039600 -0.989000 0.142100
+vn 0.000000 -0.990000 0.141300
+vn -0.083700 -0.991400 0.100200
+vn -0.125100 -0.986600 0.104900
+vn -0.129200 -0.988600 0.077500
+vn -0.086500 -0.993600 0.072600
+vn -0.166000 -0.979800 0.111500
+vn -0.171600 -0.981500 0.084400
+vn -0.043500 -0.996600 0.069700
+vn -0.042000 -0.994400 0.097400
+vn -0.040900 -0.991900 0.119800
+vn -0.081400 -0.989100 0.122400
+vn -0.039600 -0.989000 0.142100
+vn -0.079000 -0.986300 0.144500
+vn -0.121600 -0.984400 0.126900
+vn -0.161400 -0.977800 0.133100
+vn -0.118000 -0.981800 0.148500
+vn -0.156800 -0.975500 0.154100
+vn -0.245500 -0.960600 0.130100
+vn -0.283700 -0.948300 0.142000
+vn -0.293000 -0.949000 0.116300
+vn -0.253600 -0.961700 0.103900
+vn -0.320800 -0.934200 0.155700
+vn -0.331300 -0.934400 0.130600
+vn -0.213100 -0.972500 0.093200
+vn -0.206300 -0.971100 0.119900
+vn -0.200700 -0.969400 0.141100
+vn -0.238900 -0.959300 0.150700
+vn -0.195000 -0.967400 0.161400
+vn -0.232400 -0.957600 0.170200
+vn -0.276100 -0.947300 0.162100
+vn -0.312400 -0.933700 0.175100
+vn -0.268900 -0.946100 0.180500
+vn -0.304500 -0.932800 0.192500
+vn -0.390600 -0.901200 0.187900
+vn -0.423000 -0.882300 0.206300
+vn -0.436500 -0.880800 0.183300
+vn -0.403200 -0.900300 0.164100
+vn -0.453700 -0.861900 0.226200
+vn -0.468100 -0.859800 0.204000
+vn -0.368100 -0.918100 0.146600
+vn -0.356500 -0.918500 0.171100
+vn -0.347400 -0.918300 0.189700
+vn -0.380700 -0.901500 0.205800
+vn -0.339100 -0.917900 0.206000
+vn -0.372100 -0.901500 0.220900
+vn -0.412500 -0.883100 0.223400
+vn -0.442800 -0.863200 0.242500
+vn -0.403700 -0.883500 0.237300
+vn -0.433900 -0.864100 0.255200
+vn -0.509100 -0.817300 0.269900
+vn -0.533500 -0.793200 0.293500
+vn -0.550100 -0.788900 0.273800
+vn -0.525000 -0.813700 0.249300
+vn -0.555800 -0.767900 0.318300
+vn -0.572900 -0.762900 0.299500
+vn -0.497700 -0.837300 0.226100
+vn -0.482500 -0.840200 0.247400
+vn -0.471100 -0.841900 0.262900
+vn -0.497300 -0.819500 0.284600
+vn -0.462200 -0.843200 0.274400
+vn -0.488600 -0.821100 0.294900
+vn -0.521400 -0.796000 0.307400
+vn -0.543400 -0.771200 0.331400
+vn -0.513000 -0.797800 0.316700
+vn -0.535300 -0.773400 0.339600
+vn -0.592900 -0.714800 0.370700
+vn -0.607700 -0.687200 0.398000
+vn -0.626100 -0.679800 0.381900
+vn -0.611000 -0.708200 0.353700
+vn -0.619900 -0.658800 0.426100
+vn -0.638600 -0.650600 0.410900
+vn -0.593200 -0.735900 0.326200
+vn -0.575600 -0.741800 0.344100
+vn -0.563100 -0.745600 0.356400
+vn -0.580200 -0.719100 0.382200
+vn -0.555300 -0.747900 0.363700
+vn -0.572800 -0.721700 0.388700
+vn -0.594900 -0.692000 0.408800
+vn -0.607100 -0.664200 0.436200
+vn -0.587800 -0.694700 0.414600
+vn -0.600200 -0.667000 0.441300
+vn -0.636300 -0.601000 0.483600
+vn -0.640500 -0.571700 0.512800
+vn -0.659600 -0.560900 0.500300
+vn -0.655400 -0.591100 0.470200
+vn -0.641800 -0.542200 0.542200
+vn -0.661000 -0.530600 0.530600
+vn -0.648400 -0.621000 0.440400
+vn -0.629500 -0.630000 0.454700
+vn -0.616600 -0.635900 0.464100
+vn -0.623400 -0.607400 0.492400
+vn -0.610000 -0.638900 0.468700
+vn -0.617000 -0.610500 0.496500
+vn -0.627500 -0.578700 0.520900
+vn -0.628900 -0.549800 0.549800
+vn -0.621200 -0.582000 0.524700
+vn -0.622600 -0.553300 0.553300
+vn -0.636300 -0.483600 0.601000
+vn -0.629500 -0.454700 0.630000
+vn -0.648400 -0.440400 0.621000
+vn -0.655400 -0.470200 0.591100
+vn -0.619900 -0.426100 0.658800
+vn -0.638600 -0.410900 0.650600
+vn -0.659600 -0.500300 0.560900
+vn -0.640500 -0.512800 0.571700
+vn -0.627500 -0.520900 0.578700
+vn -0.623400 -0.492400 0.607400
+vn -0.621200 -0.524700 0.582000
+vn -0.617000 -0.496500 0.610500
+vn -0.616600 -0.464100 0.635900
+vn -0.607100 -0.436200 0.664200
+vn -0.610000 -0.468700 0.638900
+vn -0.600200 -0.441300 0.667000
+vn -0.592900 -0.370700 0.714800
+vn -0.575600 -0.344100 0.741800
+vn -0.593200 -0.326200 0.735900
+vn -0.611000 -0.353700 0.708200
+vn -0.555800 -0.318300 0.767900
+vn -0.572900 -0.299500 0.762900
+vn -0.626100 -0.381900 0.679800
+vn -0.607700 -0.398000 0.687200
+vn -0.594900 -0.408800 0.692000
+vn -0.580200 -0.382200 0.719100
+vn -0.587800 -0.414600 0.694700
+vn -0.572800 -0.388700 0.721700
+vn -0.563100 -0.356400 0.745600
+vn -0.543400 -0.331400 0.771200
+vn -0.555300 -0.363700 0.747900
+vn -0.535300 -0.339600 0.773400
+vn -0.509100 -0.269900 0.817300
+vn -0.482500 -0.247400 0.840200
+vn -0.497700 -0.226100 0.837300
+vn -0.525000 -0.249300 0.813700
+vn -0.453700 -0.226200 0.861900
+vn -0.468100 -0.204000 0.859800
+vn -0.550100 -0.273800 0.788900
+vn -0.533500 -0.293500 0.793200
+vn -0.521400 -0.307400 0.796000
+vn -0.497300 -0.284600 0.819500
+vn -0.513000 -0.316600 0.797800
+vn -0.488600 -0.294900 0.821100
+vn -0.471100 -0.262900 0.841900
+vn -0.442800 -0.242500 0.863200
+vn -0.462200 -0.274400 0.843200
+vn -0.433900 -0.255200 0.864100
+vn -0.390600 -0.187900 0.901200
+vn -0.356500 -0.171100 0.918500
+vn -0.368100 -0.146600 0.918100
+vn -0.403200 -0.164100 0.900300
+vn -0.320800 -0.155700 0.934200
+vn -0.331300 -0.130600 0.934400
+vn -0.436500 -0.183300 0.880800
+vn -0.423000 -0.206300 0.882300
+vn -0.412500 -0.223400 0.883100
+vn -0.380700 -0.205800 0.901500
+vn -0.403700 -0.237300 0.883500
+vn -0.372100 -0.220900 0.901500
+vn -0.347400 -0.189700 0.918300
+vn -0.312400 -0.175100 0.933700
+vn -0.339100 -0.206000 0.917900
+vn -0.304500 -0.192500 0.932800
+vn -0.245500 -0.130100 0.960600
+vn -0.206300 -0.119900 0.971100
+vn -0.213100 -0.093200 0.972500
+vn -0.253600 -0.103900 0.961700
+vn -0.166000 -0.111500 0.979800
+vn -0.171600 -0.084400 0.981500
+vn -0.293000 -0.116300 0.949000
+vn -0.283700 -0.142000 0.948300
+vn -0.276100 -0.162100 0.947300
+vn -0.238900 -0.150700 0.959300
+vn -0.268900 -0.180500 0.946100
+vn -0.232400 -0.170200 0.957600
+vn -0.200700 -0.141100 0.969400
+vn -0.161400 -0.133100 0.977800
+vn -0.195000 -0.161400 0.967400
+vn -0.156800 -0.154100 0.975500
+vn -0.083700 -0.100200 0.991400
+vn -0.042000 -0.097400 0.994400
+vn -0.043500 -0.069700 0.996600
+vn -0.086500 -0.072600 0.993600
+vn 0.000000 -0.096500 0.995300
+vn 0.000000 -0.068700 0.997600
+vn -0.129200 -0.077500 0.988600
+vn -0.125100 -0.104900 0.986600
+vn -0.121600 -0.126900 0.984400
+vn -0.081400 -0.122400 0.989100
+vn -0.118000 -0.148500 0.981800
+vn -0.079000 -0.144500 0.986300
+vn -0.040900 -0.119800 0.991900
+vn 0.000000 -0.118900 0.992900
+vn -0.039600 -0.142100 0.989000
+vn 0.000000 -0.141300 0.990000
+vn 0.083700 -0.100200 0.991400
+vn 0.125100 -0.104900 0.986600
+vn 0.129200 -0.077500 0.988600
+vn 0.086500 -0.072600 0.993600
+vn 0.166000 -0.111500 0.979800
+vn 0.171600 -0.084400 0.981500
+vn 0.043500 -0.069700 0.996600
+vn 0.042000 -0.097400 0.994400
+vn 0.040900 -0.119800 0.991900
+vn 0.081400 -0.122400 0.989100
+vn 0.039600 -0.142100 0.989000
+vn 0.079000 -0.144500 0.986300
+vn 0.121600 -0.126900 0.984400
+vn 0.161400 -0.133100 0.977800
+vn 0.118000 -0.148500 0.981800
+vn 0.156800 -0.154100 0.975500
+vn 0.245500 -0.130100 0.960600
+vn 0.283700 -0.142000 0.948300
+vn 0.293000 -0.116300 0.949000
+vn 0.253600 -0.103900 0.961700
+vn 0.320800 -0.155700 0.934200
+vn 0.331300 -0.130600 0.934400
+vn 0.213100 -0.093200 0.972500
+vn 0.206300 -0.119900 0.971100
+vn 0.200700 -0.141100 0.969400
+vn 0.238900 -0.150700 0.959300
+vn 0.195000 -0.161400 0.967400
+vn 0.232400 -0.170200 0.957600
+vn 0.276100 -0.162100 0.947300
+vn 0.312400 -0.175100 0.933700
+vn 0.268900 -0.180500 0.946100
+vn 0.304500 -0.192500 0.932800
+vn 0.390600 -0.187900 0.901200
+vn 0.423000 -0.206300 0.882300
+vn 0.436500 -0.183300 0.880800
+vn 0.403200 -0.164100 0.900300
+vn 0.453700 -0.226200 0.861900
+vn 0.468100 -0.204000 0.859800
+vn 0.368100 -0.146600 0.918100
+vn 0.356500 -0.171100 0.918500
+vn 0.347400 -0.189700 0.918300
+vn 0.380700 -0.205800 0.901500
+vn 0.339100 -0.206000 0.917900
+vn 0.372100 -0.220900 0.901500
+vn 0.412500 -0.223400 0.883100
+vn 0.442800 -0.242500 0.863200
+vn 0.403700 -0.237300 0.883500
+vn 0.433900 -0.255200 0.864100
+vn 0.509100 -0.269900 0.817300
+vn 0.533500 -0.293500 0.793200
+vn 0.550100 -0.273800 0.788900
+vn 0.525000 -0.249300 0.813700
+vn 0.555800 -0.318300 0.767900
+vn 0.572900 -0.299500 0.762900
+vn 0.497700 -0.226100 0.837300
+vn 0.482500 -0.247400 0.840200
+vn 0.471100 -0.262900 0.841900
+vn 0.497300 -0.284600 0.819500
+vn 0.462200 -0.274400 0.843200
+vn 0.488600 -0.294900 0.821100
+vn 0.521400 -0.307400 0.796000
+vn 0.543400 -0.331400 0.771200
+vn 0.513000 -0.316600 0.797800
+vn 0.535300 -0.339600 0.773400
+vn 0.592900 -0.370700 0.714800
+vn 0.607700 -0.398000 0.687200
+vn 0.626100 -0.381900 0.679800
+vn 0.611000 -0.353700 0.708200
+vn 0.619900 -0.426100 0.658800
+vn 0.638600 -0.410900 0.650600
+vn 0.593200 -0.326200 0.735900
+vn 0.575600 -0.344100 0.741800
+vn 0.563100 -0.356400 0.745600
+vn 0.580200 -0.382200 0.719100
+vn 0.555300 -0.363700 0.747900
+vn 0.572800 -0.388700 0.721700
+vn 0.594900 -0.408800 0.692000
+vn 0.607100 -0.436200 0.664200
+vn 0.587800 -0.414600 0.694700
+vn 0.600200 -0.441300 0.667000
+vn 0.636300 -0.483600 0.601000
+vn 0.640500 -0.512800 0.571700
+vn 0.659600 -0.500300 0.560900
+vn 0.655400 -0.470200 0.591100
+vn 0.641800 -0.542200 0.542200
+vn 0.661000 -0.530600 0.530600
+vn 0.648400 -0.440400 0.621000
+vn 0.629500 -0.454700 0.630000
+vn 0.616600 -0.464100 0.635900
+vn 0.623400 -0.492400 0.607400
+vn 0.610000 -0.468700 0.638900
+vn 0.617000 -0.496500 0.610500
+vn 0.627500 -0.520900 0.578700
+vn 0.628900 -0.549800 0.549800
+vn 0.621200 -0.524700 0.582000
+vn 0.622600 -0.553300 0.553300
+vn 0.636300 -0.601000 0.483600
+vn 0.629500 -0.630000 0.454700
+vn 0.648400 -0.621000 0.440400
+vn 0.655400 -0.591100 0.470200
+vn 0.659600 -0.560900 0.500300
+vn 0.640500 -0.571700 0.512800
+vn 0.627500 -0.578700 0.520900
+vn 0.623400 -0.607400 0.492400
+vn 0.621200 -0.582000 0.524700
+vn 0.617000 -0.610500 0.496500
+vn 0.616600 -0.635900 0.464100
+vn 0.610000 -0.638900 0.468700
+vn 0.059100 0.717400 -0.694100
+vn 0.059800 0.721000 -0.690400
+vn 0.062500 0.717400 -0.693800
+vn 0.063000 0.713900 -0.697400
+vn 0.063900 0.715400 -0.695800
+vn 0.064500 0.712300 -0.698900
+vn 0.060200 0.722600 -0.688500
+vn 0.062200 0.719600 -0.691600
+vn 0.063400 0.717500 -0.693700
+vn 0.063300 0.709200 -0.702100
+vn 0.058100 0.710800 -0.700900
+vn 0.063700 0.705700 -0.705600
+vn 0.058900 0.705900 -0.705800
+vn 0.065000 0.708700 -0.702500
+vn 0.065200 0.705600 -0.705600
+vn 0.027300 0.716200 -0.697300
+vn 0.045800 0.725700 -0.686500
+vn 0.027600 0.706800 -0.706800
+vn 0.054500 0.726400 -0.685100
+vn 0.057200 0.726500 -0.684700
+vn 0.049300 0.731000 -0.680500
+vn 0.054300 0.729600 -0.681700
+vn 0.861100 -0.430000 0.271200
+vn 0.877400 -0.410300 0.248500
+vn 0.883000 -0.370000 0.288700
+vn 0.866600 -0.390500 0.310700
+vn 0.884900 -0.329300 0.329300
+vn 0.868400 -0.350600 0.350600
+vn 0.849000 -0.410600 0.332400
+vn 0.843700 -0.449300 0.293700
+vn 0.850800 -0.371500 0.371500
+vn 0.834700 -0.487800 0.255400
+vn 0.852000 -0.469300 0.232100
+vn 0.822200 -0.526000 0.217400
+vn 0.839200 -0.508300 0.193200
+vn 0.868200 -0.450300 0.208600
+vn 0.855200 -0.490000 0.169000
+vn 0.861100 -0.271200 0.430000
+vn 0.877400 -0.248500 0.410300
+vn 0.868200 -0.208600 0.450300
+vn 0.852000 -0.232100 0.469300
+vn 0.855200 -0.169000 0.490000
+vn 0.839200 -0.193200 0.508300
+vn 0.834700 -0.255400 0.487800
+vn 0.843700 -0.293700 0.449300
+vn 0.822200 -0.217400 0.526000
+vn 0.849000 -0.332400 0.410600
+vn 0.866600 -0.310700 0.390500
+vn 0.883000 -0.288700 0.370000
+vn 0.803200 -0.117900 0.583900
+vn 0.818400 -0.092200 0.567100
+vn 0.794800 -0.055400 0.604300
+vn 0.780000 -0.081700 0.620400
+vn 0.767800 -0.019500 0.640400
+vn 0.753400 -0.046500 0.655900
+vn 0.764200 -0.108100 0.635900
+vn 0.786900 -0.143600 0.600100
+vn 0.738100 -0.073600 0.670600
+vn 0.806200 -0.180000 0.563500
+vn 0.822900 -0.155100 0.546600
+vn 0.838500 -0.130100 0.529000
+vn 0.690800 0.019700 0.722800
+vn 0.704000 0.048100 0.708600
+vn 0.667500 0.079500 0.740300
+vn 0.655000 0.050500 0.753900
+vn 0.628000 0.109300 0.770400
+vn 0.616300 0.079800 0.783500
+vn 0.641700 0.021400 0.766700
+vn 0.676700 -0.008700 0.736100
+vn 0.603700 0.050100 0.795600
+vn 0.708900 -0.040400 0.704200
+vn 0.723600 -0.012600 0.690100
+vn 0.737400 0.015100 0.675300
+vn 0.531000 0.132600 0.836900
+vn 0.541200 0.163100 0.824900
+vn 0.494200 0.186900 0.849000
+vn 0.484900 0.155900 0.860500
+vn 0.444900 0.208600 0.870900
+vn 0.436500 0.177100 0.882000
+vn 0.475100 0.124500 0.871100
+vn 0.520200 0.101700 0.848000
+vn 0.427600 0.145300 0.892200
+vn 0.563100 0.076900 0.822800
+vn 0.574800 0.107200 0.811200
+vn 0.585800 0.137300 0.798700
+vn 0.334400 0.212700 0.918100
+vn 0.340800 0.244800 0.907700
+vn 0.286400 0.259300 0.922300
+vn 0.281000 0.226800 0.932500
+vn 0.230600 0.271200 0.934500
+vn 0.226300 0.238500 0.944400
+vn 0.275300 0.193900 0.941600
+vn 0.327500 0.180100 0.927500
+vn 0.221600 0.205400 0.953200
+vn 0.378300 0.163900 0.911000
+vn 0.386200 0.196100 0.901300
+vn 0.393600 0.227900 0.890600
+vn 0.114100 0.254200 0.960400
+vn 0.116300 0.287200 0.950700
+vn 0.058400 0.291300 0.954800
+vn 0.057300 0.258200 0.964400
+vn 0.000000 0.292600 0.956200
+vn 0.000000 0.259500 0.965700
+vn 0.056100 0.224700 0.972800
+vn 0.111800 0.220800 0.968900
+vn 0.000000 0.226000 0.974100
+vn 0.167000 0.214400 0.962300
+vn 0.170400 0.247700 0.953700
+vn 0.173700 0.280600 0.944000
+vn -0.114100 0.254200 0.960400
+vn -0.116300 0.287200 0.950700
+vn -0.173700 0.280600 0.944000
+vn -0.170400 0.247700 0.953700
+vn -0.230600 0.271200 0.934500
+vn -0.226300 0.238500 0.944400
+vn -0.167000 0.214400 0.962300
+vn -0.111800 0.220800 0.968900
+vn -0.221600 0.205400 0.953200
+vn -0.056100 0.224700 0.972800
+vn -0.057300 0.258200 0.964400
+vn -0.058400 0.291300 0.954800
+vn -0.334400 0.212700 0.918100
+vn -0.386200 0.196100 0.901300
+vn -0.378300 0.163900 0.911000
+vn -0.327500 0.180100 0.927500
+vn -0.436500 0.177100 0.882000
+vn -0.427600 0.145300 0.892200
+vn -0.275300 0.193900 0.941600
+vn -0.281000 0.226800 0.932500
+vn -0.286400 0.259300 0.922300
+vn -0.340800 0.244800 0.907700
+vn -0.393600 0.227900 0.890600
+vn -0.444900 0.208600 0.870900
+vn -0.531000 0.132500 0.836900
+vn -0.541200 0.163100 0.824900
+vn -0.585800 0.137300 0.798700
+vn -0.574800 0.107200 0.811200
+vn -0.628000 0.109300 0.770400
+vn -0.616300 0.079800 0.783500
+vn -0.563100 0.076900 0.822800
+vn -0.520200 0.101700 0.848000
+vn -0.603700 0.050100 0.795600
+vn -0.475100 0.124500 0.871100
+vn -0.484900 0.155900 0.860500
+vn -0.494200 0.186900 0.849000
+vn -0.690800 0.019700 0.722800
+vn -0.704000 0.048100 0.708600
+vn -0.737400 0.015100 0.675300
+vn -0.723600 -0.012600 0.690100
+vn -0.767800 -0.019500 0.640400
+vn -0.753400 -0.046500 0.655900
+vn -0.708900 -0.040400 0.704200
+vn -0.676700 -0.008700 0.736100
+vn -0.738100 -0.073600 0.670600
+vn -0.641700 0.021400 0.766700
+vn -0.655000 0.050500 0.753900
+vn -0.667500 0.079500 0.740300
+vn -0.803200 -0.117900 0.583900
+vn -0.818400 -0.092200 0.567100
+vn -0.838500 -0.130100 0.529000
+vn -0.822900 -0.155100 0.546600
+vn -0.855200 -0.169000 0.490000
+vn -0.839200 -0.193200 0.508300
+vn -0.806200 -0.180000 0.563500
+vn -0.786900 -0.143600 0.600100
+vn -0.822200 -0.217400 0.526000
+vn -0.764200 -0.108100 0.635900
+vn -0.780000 -0.081700 0.620400
+vn -0.794800 -0.055400 0.604300
+vn -0.861100 -0.271200 0.430000
+vn -0.877400 -0.248500 0.410300
+vn -0.883000 -0.288700 0.370000
+vn -0.866600 -0.310700 0.390500
+vn -0.884900 -0.329300 0.329300
+vn -0.868400 -0.350600 0.350600
+vn -0.849000 -0.332400 0.410600
+vn -0.843700 -0.293700 0.449300
+vn -0.850900 -0.371500 0.371500
+vn -0.834700 -0.255400 0.487800
+vn -0.852000 -0.232100 0.469300
+vn -0.868200 -0.208600 0.450300
+vn -0.861100 -0.430000 0.271200
+vn -0.877400 -0.410300 0.248500
+vn -0.868200 -0.450300 0.208600
+vn -0.852000 -0.469300 0.232100
+vn -0.855200 -0.490000 0.169000
+vn -0.839200 -0.508300 0.193200
+vn -0.834700 -0.487800 0.255400
+vn -0.843700 -0.449300 0.293700
+vn -0.822200 -0.526000 0.217400
+vn -0.849000 -0.410600 0.332400
+vn -0.866600 -0.390500 0.310700
+vn -0.883000 -0.370000 0.288700
+vn -0.803200 -0.583900 0.117900
+vn -0.818400 -0.567100 0.092200
+vn -0.794800 -0.604300 0.055400
+vn -0.780000 -0.620400 0.081700
+vn -0.767800 -0.640400 0.019500
+vn -0.753400 -0.655900 0.046500
+vn -0.764200 -0.635900 0.108100
+vn -0.786900 -0.600100 0.143600
+vn -0.738100 -0.670600 0.073600
+vn -0.806200 -0.563500 0.180000
+vn -0.822900 -0.546600 0.155100
+vn -0.838500 -0.529000 0.130100
+vn -0.690800 -0.722800 -0.019700
+vn -0.704000 -0.708600 -0.048100
+vn -0.667500 -0.740300 -0.079500
+vn -0.655000 -0.753900 -0.050500
+vn -0.628000 -0.770400 -0.109300
+vn -0.616300 -0.783500 -0.079800
+vn -0.641700 -0.766700 -0.021400
+vn -0.676700 -0.736100 0.008700
+vn -0.603700 -0.795600 -0.050100
+vn -0.708900 -0.704200 0.040400
+vn -0.723600 -0.690100 0.012600
+vn -0.737400 -0.675300 -0.015100
+vn -0.531000 -0.836900 -0.132500
+vn -0.541200 -0.824900 -0.163100
+vn -0.494200 -0.849000 -0.186900
+vn -0.484900 -0.860500 -0.155900
+vn -0.444900 -0.870900 -0.208600
+vn -0.436500 -0.882000 -0.177100
+vn -0.475100 -0.871100 -0.124500
+vn -0.520200 -0.848000 -0.101700
+vn -0.427600 -0.892200 -0.145300
+vn -0.563100 -0.822800 -0.076900
+vn -0.574800 -0.811200 -0.107200
+vn -0.585800 -0.798700 -0.137300
+vn -0.334400 -0.918100 -0.212700
+vn -0.340800 -0.907700 -0.244800
+vn -0.286400 -0.922300 -0.259300
+vn -0.281000 -0.932500 -0.226800
+vn -0.230600 -0.934500 -0.271200
+vn -0.226300 -0.944400 -0.238500
+vn -0.275300 -0.941600 -0.194000
+vn -0.327500 -0.927500 -0.180100
+vn -0.221600 -0.953200 -0.205400
+vn -0.378300 -0.911000 -0.163900
+vn -0.386200 -0.901300 -0.196100
+vn -0.393600 -0.890600 -0.227900
+vn -0.114100 -0.960400 -0.254200
+vn -0.116300 -0.950700 -0.287200
+vn -0.058400 -0.954800 -0.291300
+vn -0.057300 -0.964400 -0.258200
+vn 0.000000 -0.956200 -0.292600
+vn 0.000000 -0.965700 -0.259500
+vn -0.056100 -0.972800 -0.224700
+vn -0.111800 -0.968900 -0.220800
+vn 0.000000 -0.974100 -0.226000
+vn -0.167000 -0.962300 -0.214400
+vn -0.170400 -0.953700 -0.247700
+vn -0.173700 -0.944000 -0.280600
+vn 0.114100 -0.960400 -0.254200
+vn 0.116300 -0.950700 -0.287200
+vn 0.173700 -0.944000 -0.280600
+vn 0.170400 -0.953700 -0.247700
+vn 0.230600 -0.934500 -0.271200
+vn 0.226300 -0.944400 -0.238500
+vn 0.167000 -0.962300 -0.214400
+vn 0.111800 -0.968900 -0.220800
+vn 0.221600 -0.953200 -0.205500
+vn 0.056100 -0.972800 -0.224700
+vn 0.057300 -0.964400 -0.258200
+vn 0.058400 -0.954800 -0.291200
+vn 0.334400 -0.918100 -0.212700
+vn 0.340800 -0.907700 -0.244800
+vn 0.393600 -0.890600 -0.227900
+vn 0.386200 -0.901300 -0.196100
+vn 0.444900 -0.870900 -0.208600
+vn 0.436500 -0.882000 -0.177100
+vn 0.378300 -0.911000 -0.163900
+vn 0.327500 -0.927500 -0.180100
+vn 0.427600 -0.892200 -0.145300
+vn 0.275300 -0.941600 -0.194000
+vn 0.281000 -0.932500 -0.226800
+vn 0.286400 -0.922300 -0.259300
+vn 0.531000 -0.836900 -0.132600
+vn 0.541200 -0.824900 -0.163100
+vn 0.585800 -0.798700 -0.137300
+vn 0.574800 -0.811200 -0.107200
+vn 0.628000 -0.770400 -0.109300
+vn 0.616300 -0.783500 -0.079800
+vn 0.563100 -0.822800 -0.076900
+vn 0.520200 -0.848000 -0.101700
+vn 0.603700 -0.795600 -0.050100
+vn 0.475100 -0.871100 -0.124500
+vn 0.484900 -0.860500 -0.155900
+vn 0.494200 -0.849000 -0.186900
+vn 0.690800 -0.722800 -0.019700
+vn 0.704000 -0.708600 -0.048100
+vn 0.737400 -0.675300 -0.015100
+vn 0.723600 -0.690100 0.012600
+vn 0.767800 -0.640400 0.019500
+vn 0.753400 -0.655900 0.046500
+vn 0.708900 -0.704200 0.040400
+vn 0.676700 -0.736100 0.008700
+vn 0.738100 -0.670600 0.073600
+vn 0.641700 -0.766700 -0.021400
+vn 0.655000 -0.753900 -0.050500
+vn 0.667500 -0.740300 -0.079500
+vn 0.803200 -0.583900 0.117900
+vn 0.818400 -0.567100 0.092200
+vn 0.838500 -0.529000 0.130100
+vn 0.822900 -0.546600 0.155100
+vn 0.806200 -0.563500 0.180000
+vn 0.786900 -0.600100 0.143600
+vn 0.764200 -0.635900 0.108100
+vn 0.780000 -0.620400 0.081700
+vn 0.794800 -0.604300 0.055400
+vn -0.183700 -0.639100 0.746800
+vn -0.188300 -0.647800 0.738200
+vn -0.158500 -0.659000 0.735200
+vn -0.154700 -0.651800 0.742400
+vn -0.128100 -0.669900 0.731300
+vn -0.124900 -0.664000 0.737200
+vn -0.192100 -0.656600 0.729400
+vn -0.161700 -0.666500 0.727700
+vn -0.130600 -0.675800 0.725300
+vn -0.150200 -0.644800 0.749500
+vn -0.178400 -0.630800 0.755200
+vn -0.145000 -0.637900 0.756300
+vn -0.172200 -0.622700 0.763300
+vn -0.121300 -0.658300 0.742900
+vn -0.117100 -0.652800 0.748400
+vn -0.206400 -0.616200 0.760100
+vn -0.212600 -0.625800 0.750400
+vn -0.234700 -0.600600 0.764300
+vn -0.241800 -0.611600 0.753300
+vn -0.199300 -0.606800 0.769500
+vn -0.226700 -0.589900 0.775000
+vn -0.217900 -0.635800 0.740400
+vn -0.222300 -0.646000 0.730200
+vn -0.247800 -0.622900 0.742000
+vn -0.252800 -0.634500 0.730300
+vn -0.157800 -0.607400 0.778600
+vn -0.165300 -0.614800 0.771100
+vn -0.139200 -0.631300 0.762900
+vn -0.132800 -0.625000 0.769200
+vn -0.112400 -0.647500 0.753700
+vn -0.107300 -0.642400 0.758800
+vn -0.125900 -0.619100 0.775200
+vn -0.149500 -0.600300 0.785700
+vn -0.118400 -0.613400 0.780800
+vn -0.140600 -0.593500 0.792400
+vn -0.101700 -0.637600 0.763600
+vn -0.095600 -0.633000 0.768200
+vn -0.173000 -0.580900 0.795400
+vn -0.182500 -0.589100 0.787200
+vn -0.196800 -0.560400 0.804400
+vn -0.207600 -0.569800 0.795100
+vn -0.162700 -0.573000 0.803200
+vn -0.185100 -0.551600 0.813300
+vn -0.191300 -0.597700 0.778500
+vn -0.217600 -0.579600 0.785300
+vn -0.121000 -0.581400 0.804500
+vn -0.131100 -0.587200 0.798700
+vn -0.110400 -0.608100 0.786100
+vn -0.101900 -0.603200 0.791000
+vn -0.089100 -0.628700 0.772500
+vn -0.082300 -0.624700 0.776500
+vn -0.093000 -0.598700 0.795500
+vn -0.110500 -0.576100 0.809900
+vn -0.083700 -0.594600 0.799600
+vn -0.099400 -0.571200 0.814800
+vn -0.075100 -0.621100 0.780100
+vn -0.067600 -0.617800 0.783400
+vn -0.127800 -0.552800 0.823400
+vn -0.140100 -0.559000 0.817200
+vn -0.145400 -0.528600 0.836300
+vn -0.159300 -0.535600 0.829300
+vn -0.115100 -0.547200 0.829000
+vn -0.130900 -0.522200 0.842700
+vn -0.151700 -0.565800 0.810500
+vn -0.172500 -0.543300 0.821600
+vn -0.076100 -0.563100 0.822900
+vn -0.087900 -0.566900 0.819100
+vn -0.074000 -0.590900 0.803300
+vn -0.064100 -0.587700 0.806500
+vn -0.059800 -0.614800 0.786400
+vn -0.051800 -0.612200 0.789000
+vn -0.053800 -0.585000 0.809200
+vn -0.063900 -0.559800 0.826100
+vn -0.043300 -0.582800 0.811500
+vn -0.051500 -0.557100 0.828800
+vn -0.043500 -0.610000 0.791200
+vn -0.035000 -0.608200 0.793000
+vn -0.074000 -0.534000 0.842200
+vn -0.088000 -0.537800 0.838400
+vn -0.084100 -0.507200 0.857700
+vn -0.100100 -0.511500 0.853400
+vn -0.059500 -0.530900 0.845300
+vn -0.067700 -0.503700 0.861200
+vn -0.101700 -0.542200 0.834100
+vn -0.115700 -0.516400 0.848400
+vn -0.025900 -0.553500 0.832400
+vn -0.038800 -0.555000 0.830900
+vn -0.032600 -0.581000 0.813200
+vn -0.021800 -0.579700 0.814500
+vn -0.026300 -0.606800 0.794400
+vn -0.017600 -0.605800 0.795400
+vn -0.011000 -0.579000 0.815200
+vn -0.013000 -0.552700 0.833300
+vn 0.000000 -0.578700 0.815500
+vn 0.000000 -0.552400 0.833600
+vn -0.008900 -0.605200 0.796000
+vn 0.000000 -0.605000 0.796200
+vn -0.015100 -0.525700 0.850500
+vn -0.030000 -0.526800 0.849500
+vn -0.017200 -0.497800 0.867100
+vn -0.034200 -0.498900 0.865900
+vn 0.000000 -0.525400 0.850800
+vn 0.000000 -0.497400 0.867500
+vn -0.044900 -0.528500 0.847700
+vn -0.051000 -0.500900 0.864000
+vn 0.025900 -0.553500 0.832400
+vn 0.013000 -0.552700 0.833300
+vn 0.011000 -0.579000 0.815200
+vn 0.021900 -0.579700 0.814500
+vn 0.008900 -0.605200 0.796000
+vn 0.017600 -0.605800 0.795400
+vn 0.032600 -0.581000 0.813200
+vn 0.038800 -0.555000 0.830900
+vn 0.043300 -0.582800 0.811500
+vn 0.051500 -0.557100 0.828800
+vn 0.026300 -0.606800 0.794400
+vn 0.035000 -0.608200 0.793000
+vn 0.044800 -0.528500 0.847700
+vn 0.030000 -0.526800 0.849500
+vn 0.051000 -0.500900 0.864000
+vn 0.034200 -0.498900 0.865900
+vn 0.059500 -0.530900 0.845300
+vn 0.067700 -0.503700 0.861200
+vn 0.015100 -0.525700 0.850500
+vn 0.017200 -0.497800 0.867100
+vn 0.076100 -0.563100 0.822900
+vn 0.063900 -0.559800 0.826100
+vn 0.053800 -0.585000 0.809200
+vn 0.064100 -0.587700 0.806500
+vn 0.043500 -0.610000 0.791200
+vn 0.051700 -0.612200 0.789000
+vn 0.074000 -0.590900 0.803300
+vn 0.087900 -0.566900 0.819100
+vn 0.083700 -0.594600 0.799600
+vn 0.099400 -0.571200 0.814800
+vn 0.059800 -0.614800 0.786400
+vn 0.067600 -0.617800 0.783400
+vn 0.101700 -0.542200 0.834100
+vn 0.088000 -0.537800 0.838400
+vn 0.115700 -0.516400 0.848400
+vn 0.100200 -0.511500 0.853400
+vn 0.115100 -0.547200 0.829000
+vn 0.130900 -0.522200 0.842700
+vn 0.074000 -0.534000 0.842200
+vn 0.084100 -0.507200 0.857700
+vn 0.121000 -0.581400 0.804500
+vn 0.110500 -0.576100 0.809900
+vn 0.093000 -0.598700 0.795500
+vn 0.101900 -0.603200 0.791000
+vn 0.075100 -0.621100 0.780100
+vn 0.082300 -0.624700 0.776500
+vn 0.110400 -0.608100 0.786100
+vn 0.131100 -0.587200 0.798700
+vn 0.118400 -0.613400 0.780800
+vn 0.140600 -0.593500 0.792400
+vn 0.089100 -0.628700 0.772500
+vn 0.095600 -0.633000 0.768200
+vn 0.151700 -0.565800 0.810500
+vn 0.140100 -0.559000 0.817200
+vn 0.172500 -0.543300 0.821600
+vn 0.159300 -0.535600 0.829300
+vn 0.162700 -0.573000 0.803200
+vn 0.185100 -0.551600 0.813300
+vn 0.127800 -0.552800 0.823400
+vn 0.145400 -0.528600 0.836300
+vn 0.157800 -0.607400 0.778600
+vn 0.149500 -0.600300 0.785700
+vn 0.125900 -0.619100 0.775200
+vn 0.132800 -0.625000 0.769200
+vn 0.101700 -0.637600 0.763600
+vn 0.107300 -0.642400 0.758800
+vn 0.139200 -0.631300 0.762900
+vn 0.165300 -0.614800 0.771100
+vn 0.145000 -0.637900 0.756300
+vn 0.172200 -0.622700 0.763300
+vn 0.112400 -0.647500 0.753700
+vn 0.117100 -0.652800 0.748400
+vn 0.191300 -0.597700 0.778500
+vn 0.182600 -0.589100 0.787200
+vn 0.217600 -0.579600 0.785300
+vn 0.207600 -0.569800 0.795100
+vn 0.199300 -0.606800 0.769500
+vn 0.226700 -0.589900 0.775000
+vn 0.173000 -0.580900 0.795400
+vn 0.196800 -0.560400 0.804400
+vn 0.183700 -0.639100 0.746800
+vn 0.178400 -0.630800 0.755200
+vn 0.150200 -0.644800 0.749500
+vn 0.154700 -0.651800 0.742400
+vn 0.121300 -0.658300 0.742900
+vn 0.124900 -0.664000 0.737200
+vn 0.158500 -0.659000 0.735200
+vn 0.188300 -0.647800 0.738200
+vn 0.161700 -0.666500 0.727700
+vn 0.192100 -0.656600 0.729400
+vn 0.128100 -0.669900 0.731300
+vn 0.130600 -0.675800 0.725300
+vn 0.217900 -0.635800 0.740400
+vn 0.212600 -0.625800 0.750400
+vn 0.247800 -0.622900 0.742000
+vn 0.241800 -0.611600 0.753300
+vn 0.222300 -0.646000 0.730200
+vn 0.252800 -0.634500 0.730300
+vn 0.206400 -0.616200 0.760100
+vn 0.234700 -0.600600 0.764300
+vn 0.197100 -0.674600 0.711300
+vn 0.195000 -0.665500 0.720400
+vn 0.164200 -0.674000 0.720200
+vn 0.166000 -0.681700 0.712600
+vn 0.132600 -0.681900 0.719200
+vn 0.134100 -0.688100 0.713100
+vn 0.167100 -0.689400 0.704900
+vn 0.198400 -0.683700 0.702200
+vn 0.167400 -0.697100 0.697100
+vn 0.198900 -0.693000 0.693000
+vn 0.135000 -0.694300 0.706900
+vn 0.135200 -0.700600 0.700600
+vn 0.229600 -0.677400 0.698800
+vn 0.228100 -0.666900 0.709300
+vn 0.261100 -0.670300 0.694600
+vn 0.259500 -0.658300 0.706600
+vn 0.230100 -0.688100 0.688100
+vn 0.261700 -0.682500 0.682500
+vn 0.225700 -0.656400 0.719800
+vn 0.256700 -0.646400 0.718500
+vn 0.197100 -0.711300 0.674600
+vn 0.198400 -0.702200 0.683700
+vn 0.167100 -0.704900 0.689400
+vn 0.166000 -0.712600 0.681700
+vn 0.135000 -0.706900 0.694300
+vn 0.134100 -0.713100 0.688100
+vn 0.164200 -0.720200 0.674000
+vn 0.195000 -0.720400 0.665500
+vn 0.161700 -0.727700 0.666500
+vn 0.192100 -0.729400 0.656600
+vn 0.132600 -0.719200 0.681900
+vn 0.130600 -0.725300 0.675800
+vn 0.225700 -0.719800 0.656400
+vn 0.228100 -0.709300 0.666900
+vn 0.256700 -0.718500 0.646400
+vn 0.259500 -0.706600 0.658300
+vn 0.222300 -0.730200 0.646000
+vn 0.252800 -0.730300 0.634500
+vn 0.229600 -0.698800 0.677400
+vn 0.261100 -0.694600 0.670300
+vn 0.183700 -0.746800 0.639100
+vn 0.188300 -0.738200 0.647800
+vn 0.158500 -0.735200 0.659000
+vn 0.154700 -0.742400 0.651800
+vn 0.128100 -0.731300 0.669900
+vn 0.124900 -0.737200 0.664000
+vn 0.150200 -0.749500 0.644800
+vn 0.178400 -0.755200 0.630800
+vn 0.145000 -0.756300 0.637900
+vn 0.172200 -0.763300 0.622700
+vn 0.121300 -0.742900 0.658300
+vn 0.117100 -0.748400 0.652800
+vn 0.206400 -0.760100 0.616200
+vn 0.212600 -0.750400 0.625800
+vn 0.234700 -0.764300 0.600600
+vn 0.241800 -0.753300 0.611600
+vn 0.199300 -0.769500 0.606800
+vn 0.226700 -0.775000 0.589900
+vn 0.217900 -0.740400 0.635800
+vn 0.247800 -0.742000 0.622900
+vn 0.157800 -0.778600 0.607400
+vn 0.165300 -0.771100 0.614800
+vn 0.139200 -0.762900 0.631300
+vn 0.132800 -0.769200 0.625000
+vn 0.112400 -0.753700 0.647500
+vn 0.107300 -0.758800 0.642400
+vn 0.125900 -0.775200 0.619100
+vn 0.149500 -0.785700 0.600300
+vn 0.118400 -0.780800 0.613400
+vn 0.140600 -0.792400 0.593500
+vn 0.101700 -0.763600 0.637600
+vn 0.095600 -0.768200 0.633000
+vn 0.173000 -0.795400 0.580900
+vn 0.182600 -0.787200 0.589100
+vn 0.196800 -0.804400 0.560400
+vn 0.207600 -0.795100 0.569800
+vn 0.162700 -0.803200 0.573000
+vn 0.185100 -0.813300 0.551600
+vn 0.191300 -0.778500 0.597700
+vn 0.217600 -0.785300 0.579600
+vn 0.121000 -0.804500 0.581400
+vn 0.131100 -0.798700 0.587200
+vn 0.110400 -0.786100 0.608100
+vn 0.101900 -0.791000 0.603200
+vn 0.089100 -0.772500 0.628700
+vn 0.082300 -0.776500 0.624700
+vn 0.093000 -0.795500 0.598700
+vn 0.110500 -0.809900 0.576100
+vn 0.083700 -0.799600 0.594600
+vn 0.099400 -0.814800 0.571200
+vn 0.075100 -0.780100 0.621100
+vn 0.067600 -0.783400 0.617800
+vn 0.127800 -0.823400 0.552800
+vn 0.140100 -0.817200 0.559000
+vn 0.145400 -0.836300 0.528600
+vn 0.159300 -0.829300 0.535600
+vn 0.115100 -0.829000 0.547200
+vn 0.130900 -0.842700 0.522200
+vn 0.151700 -0.810500 0.565800
+vn 0.172500 -0.821600 0.543300
+vn 0.076100 -0.822900 0.563100
+vn 0.087900 -0.819100 0.566900
+vn 0.074000 -0.803300 0.590900
+vn 0.064100 -0.806500 0.587700
+vn 0.059800 -0.786400 0.614800
+vn 0.051700 -0.789000 0.612200
+vn 0.053800 -0.809200 0.585000
+vn 0.063900 -0.826100 0.559800
+vn 0.043300 -0.811500 0.582800
+vn 0.051500 -0.828800 0.557100
+vn 0.043500 -0.791200 0.610000
+vn 0.035000 -0.793000 0.608200
+vn 0.074000 -0.842200 0.534000
+vn 0.088000 -0.838400 0.537800
+vn 0.084100 -0.857700 0.507200
+vn 0.100200 -0.853400 0.511500
+vn 0.059500 -0.845300 0.530900
+vn 0.067700 -0.861200 0.503700
+vn 0.101700 -0.834100 0.542200
+vn 0.115700 -0.848400 0.516400
+vn 0.025900 -0.832400 0.553500
+vn 0.038800 -0.830900 0.555000
+vn 0.032600 -0.813200 0.581000
+vn 0.021900 -0.814500 0.579700
+vn 0.026400 -0.794400 0.606800
+vn 0.017600 -0.795400 0.605800
+vn 0.011000 -0.815200 0.579000
+vn 0.013000 -0.833300 0.552700
+vn 0.000000 -0.815500 0.578700
+vn 0.000000 -0.833600 0.552400
+vn 0.008900 -0.796000 0.605200
+vn 0.000000 -0.796200 0.605000
+vn 0.015100 -0.850500 0.525700
+vn 0.030000 -0.849500 0.526800
+vn 0.017200 -0.867100 0.497800
+vn 0.034200 -0.865900 0.498900
+vn 0.000000 -0.850800 0.525400
+vn 0.000000 -0.867500 0.497400
+vn 0.044800 -0.847700 0.528500
+vn 0.051000 -0.864000 0.500900
+vn -0.025900 -0.832400 0.553500
+vn -0.013000 -0.833300 0.552700
+vn -0.011000 -0.815200 0.579000
+vn -0.021900 -0.814500 0.579700
+vn -0.008900 -0.796000 0.605200
+vn -0.017600 -0.795400 0.605800
+vn -0.032600 -0.813200 0.581000
+vn -0.038800 -0.830900 0.555000
+vn -0.043300 -0.811500 0.582800
+vn -0.051500 -0.828800 0.557100
+vn -0.026400 -0.794400 0.606800
+vn -0.035000 -0.793000 0.608200
+vn -0.044800 -0.847700 0.528500
+vn -0.030000 -0.849500 0.526800
+vn -0.051000 -0.864000 0.500900
+vn -0.034200 -0.865900 0.498900
+vn -0.059500 -0.845300 0.530900
+vn -0.067700 -0.861200 0.503700
+vn -0.015100 -0.850500 0.525700
+vn -0.017200 -0.867100 0.497800
+vn -0.076100 -0.822900 0.563100
+vn -0.063900 -0.826100 0.559800
+vn -0.053800 -0.809200 0.585000
+vn -0.064100 -0.806500 0.587700
+vn -0.043500 -0.791200 0.610000
+vn -0.051700 -0.788900 0.612200
+vn -0.074000 -0.803300 0.590900
+vn -0.087900 -0.819100 0.566900
+vn -0.083700 -0.799600 0.594600
+vn -0.099400 -0.814800 0.571200
+vn -0.059800 -0.786400 0.614800
+vn -0.067600 -0.783400 0.617800
+vn -0.101700 -0.834100 0.542200
+vn -0.088000 -0.838400 0.537800
+vn -0.115700 -0.848400 0.516400
+vn -0.100200 -0.853400 0.511500
+vn -0.115100 -0.829000 0.547200
+vn -0.130900 -0.842700 0.522200
+vn -0.074000 -0.842200 0.534000
+vn -0.084100 -0.857700 0.507200
+vn -0.121000 -0.804500 0.581400
+vn -0.110500 -0.809900 0.576100
+vn -0.093000 -0.795500 0.598700
+vn -0.101900 -0.791000 0.603200
+vn -0.075100 -0.780100 0.621100
+vn -0.082300 -0.776500 0.624700
+vn -0.110400 -0.786100 0.608100
+vn -0.131100 -0.798700 0.587200
+vn -0.118400 -0.780800 0.613400
+vn -0.140600 -0.792400 0.593500
+vn -0.089100 -0.772500 0.628700
+vn -0.095600 -0.768200 0.633000
+vn -0.151700 -0.810500 0.565800
+vn -0.140100 -0.817200 0.559000
+vn -0.172500 -0.821600 0.543300
+vn -0.159300 -0.829300 0.535600
+vn -0.162700 -0.803200 0.573000
+vn -0.185100 -0.813300 0.551600
+vn -0.127900 -0.823400 0.552800
+vn -0.145400 -0.836300 0.528600
+vn -0.157800 -0.778600 0.607400
+vn -0.149500 -0.785700 0.600300
+vn -0.125900 -0.775200 0.619100
+vn -0.132800 -0.769200 0.625000
+vn -0.101700 -0.763600 0.637600
+vn -0.107300 -0.758800 0.642400
+vn -0.139200 -0.762900 0.631300
+vn -0.165300 -0.771100 0.614800
+vn -0.145000 -0.756300 0.637900
+vn -0.172200 -0.763300 0.622700
+vn -0.112400 -0.753700 0.647500
+vn -0.117100 -0.748400 0.652800
+vn -0.191300 -0.778500 0.597700
+vn -0.182600 -0.787200 0.589100
+vn -0.217600 -0.785300 0.579600
+vn -0.207600 -0.795100 0.569800
+vn -0.199300 -0.769500 0.606800
+vn -0.226700 -0.775000 0.589900
+vn -0.173000 -0.795400 0.580900
+vn -0.196800 -0.804400 0.560400
+vn -0.183700 -0.746800 0.639100
+vn -0.178400 -0.755200 0.630800
+vn -0.150200 -0.749500 0.644800
+vn -0.154700 -0.742400 0.651800
+vn -0.121300 -0.742900 0.658300
+vn -0.124900 -0.737200 0.664000
+vn -0.158500 -0.735200 0.659000
+vn -0.188300 -0.738200 0.647800
+vn -0.161700 -0.727700 0.666500
+vn -0.192100 -0.729400 0.656600
+vn -0.128100 -0.731300 0.669900
+vn -0.130600 -0.725400 0.675800
+vn -0.217900 -0.740400 0.635800
+vn -0.212600 -0.750400 0.625800
+vn -0.247800 -0.742000 0.622900
+vn -0.241800 -0.753300 0.611600
+vn -0.222300 -0.730200 0.646000
+vn -0.252800 -0.730300 0.634500
+vn -0.206400 -0.760100 0.616200
+vn -0.234700 -0.764300 0.600600
+vn -0.197100 -0.711300 0.674600
+vn -0.195000 -0.720400 0.665500
+vn -0.164200 -0.720200 0.674000
+vn -0.166000 -0.712600 0.681700
+vn -0.132600 -0.719200 0.681900
+vn -0.134100 -0.713100 0.688100
+vn -0.167100 -0.704900 0.689400
+vn -0.198400 -0.702200 0.683800
+vn -0.167400 -0.697100 0.697100
+vn -0.198900 -0.693000 0.693000
+vn -0.135000 -0.706900 0.694300
+vn -0.135200 -0.700600 0.700600
+vn -0.229600 -0.698800 0.677400
+vn -0.228100 -0.709300 0.666900
+vn -0.261100 -0.694600 0.670300
+vn -0.259500 -0.706600 0.658300
+vn -0.230100 -0.688100 0.688100
+vn -0.261700 -0.682500 0.682500
+vn -0.225700 -0.719800 0.656400
+vn -0.256700 -0.718500 0.646400
+vn -0.197100 -0.674600 0.711300
+vn -0.198400 -0.683800 0.702200
+vn -0.167100 -0.689400 0.704900
+vn -0.166000 -0.681700 0.712600
+vn -0.135000 -0.694300 0.706900
+vn -0.134100 -0.688100 0.713100
+vn -0.164200 -0.674000 0.720200
+vn -0.195000 -0.665500 0.720400
+vn -0.132600 -0.682000 0.719200
+vn -0.225700 -0.656400 0.719800
+vn -0.228100 -0.666900 0.709300
+vn -0.256700 -0.646400 0.718500
+vn -0.259500 -0.658300 0.706600
+vn -0.229600 -0.677400 0.698800
+vn -0.261100 -0.670300 0.694600
+vn -0.300100 -0.580800 0.756600
+vn -0.307600 -0.594900 0.742600
+vn -0.277900 -0.609200 0.742700
+vn -0.271100 -0.596500 0.755400
+vn -0.313800 -0.609300 0.728200
+vn -0.283500 -0.622200 0.729700
+vn -0.263200 -0.584200 0.767700
+vn -0.291400 -0.567200 0.770300
+vn -0.254100 -0.572200 0.779700
+vn -0.281300 -0.553900 0.783600
+vn -0.319200 -0.549500 0.772100
+vn -0.328700 -0.564500 0.757100
+vn -0.346600 -0.531300 0.773000
+vn -0.357000 -0.547600 0.756700
+vn -0.308100 -0.535000 0.786600
+vn -0.334700 -0.515500 0.788800
+vn -0.336900 -0.579900 0.741700
+vn -0.343700 -0.595700 0.725900
+vn -0.365900 -0.564300 0.740000
+vn -0.373300 -0.581400 0.722900
+vn -0.257700 -0.528900 0.808600
+vn -0.270100 -0.541100 0.796400
+vn -0.244000 -0.560600 0.791300
+vn -0.232800 -0.549600 0.802300
+vn -0.220600 -0.539100 0.812800
+vn -0.244200 -0.517300 0.820200
+vn -0.207500 -0.529200 0.822700
+vn -0.229700 -0.506300 0.831200
+vn -0.267600 -0.494900 0.826700
+vn -0.282300 -0.507600 0.814000
+vn -0.290600 -0.472000 0.832300
+vn -0.306600 -0.485800 0.818500
+vn -0.251600 -0.482900 0.838700
+vn -0.273300 -0.458900 0.845400
+vn -0.295800 -0.521000 0.800600
+vn -0.321300 -0.500300 0.804000
+vn -0.197700 -0.486500 0.851000
+vn -0.214100 -0.496000 0.841500
+vn -0.193500 -0.519900 0.832000
+vn -0.178700 -0.511300 0.840600
+vn -0.163100 -0.503400 0.848500
+vn -0.180500 -0.477800 0.859700
+vn -0.146700 -0.496200 0.855700
+vn -0.162400 -0.469800 0.867700
+vn -0.197700 -0.451600 0.870000
+vn -0.216600 -0.461200 0.860400
+vn -0.214800 -0.424900 0.879400
+vn -0.235300 -0.435300 0.869000
+vn -0.177900 -0.442900 0.878700
+vn -0.193200 -0.415500 0.888800
+vn -0.234600 -0.471600 0.850000
+vn -0.254800 -0.446700 0.857600
+vn -0.124300 -0.456500 0.880900
+vn -0.143600 -0.462700 0.874800
+vn -0.129700 -0.489800 0.862100
+vn -0.112300 -0.484200 0.867700
+vn -0.094400 -0.479400 0.872500
+vn -0.104400 -0.451200 0.886300
+vn -0.075900 -0.475500 0.876400
+vn -0.084000 -0.446900 0.890600
+vn -0.114400 -0.422600 0.899100
+vn -0.136200 -0.428300 0.893300
+vn -0.124300 -0.393400 0.910900
+vn -0.147900 -0.399700 0.904600
+vn -0.092100 -0.417800 0.903900
+vn -0.100000 -0.388200 0.916100
+vn -0.157300 -0.435100 0.886500
+vn -0.170900 -0.407000 0.897300
+vn -0.042400 -0.441000 0.896500
+vn -0.063300 -0.443500 0.894000
+vn -0.057200 -0.472400 0.879500
+vn -0.038300 -0.470200 0.881700
+vn -0.019200 -0.468900 0.883000
+vn -0.021300 -0.439500 0.897900
+vn 0.000000 -0.468400 0.883500
+vn 0.000000 -0.439000 0.898400
+vn -0.023300 -0.409700 0.911900
+vn -0.046400 -0.411300 0.910300
+vn -0.025300 -0.379400 0.924800
+vn -0.050400 -0.381200 0.923100
+vn 0.000000 -0.409200 0.912400
+vn 0.000000 -0.378900 0.925400
+vn -0.069400 -0.414000 0.907600
+vn -0.075300 -0.384100 0.920200
+vn 0.042400 -0.441000 0.896500
+vn 0.021300 -0.439500 0.897900
+vn 0.019200 -0.468900 0.883000
+vn 0.038300 -0.470200 0.881700
+vn 0.057200 -0.472400 0.879500
+vn 0.063300 -0.443500 0.894000
+vn 0.075900 -0.475500 0.876400
+vn 0.084000 -0.446900 0.890600
+vn 0.069400 -0.414000 0.907600
+vn 0.046400 -0.411300 0.910300
+vn 0.075300 -0.384100 0.920200
+vn 0.050400 -0.381200 0.923100
+vn 0.092100 -0.417800 0.903900
+vn 0.100000 -0.388200 0.916100
+vn 0.023300 -0.409700 0.911900
+vn 0.025300 -0.379400 0.924800
+vn 0.124300 -0.456500 0.880900
+vn 0.104400 -0.451200 0.886300
+vn 0.094400 -0.479400 0.872500
+vn 0.112300 -0.484200 0.867700
+vn 0.129700 -0.489800 0.862100
+vn 0.143600 -0.462700 0.874800
+vn 0.146700 -0.496200 0.855700
+vn 0.162400 -0.469800 0.867700
+vn 0.157300 -0.435100 0.886500
+vn 0.136200 -0.428300 0.893300
+vn 0.170900 -0.407000 0.897300
+vn 0.147900 -0.399700 0.904600
+vn 0.177900 -0.442900 0.878700
+vn 0.193200 -0.415500 0.888800
+vn 0.114400 -0.422600 0.899100
+vn 0.124300 -0.393400 0.910900
+vn 0.197700 -0.486500 0.851000
+vn 0.180500 -0.477800 0.859700
+vn 0.163100 -0.503400 0.848500
+vn 0.178700 -0.511300 0.840600
+vn 0.193500 -0.519900 0.832000
+vn 0.214100 -0.496000 0.841500
+vn 0.207500 -0.529200 0.822700
+vn 0.229700 -0.506300 0.831200
+vn 0.234600 -0.471600 0.850000
+vn 0.216600 -0.461200 0.860400
+vn 0.254800 -0.446700 0.857600
+vn 0.235300 -0.435300 0.869000
+vn 0.251600 -0.482900 0.838700
+vn 0.273300 -0.458900 0.845400
+vn 0.197700 -0.451600 0.870000
+vn 0.214800 -0.424900 0.879400
+vn 0.257700 -0.528900 0.808600
+vn 0.244200 -0.517300 0.820200
+vn 0.220600 -0.539100 0.812800
+vn 0.232800 -0.549600 0.802300
+vn 0.244000 -0.560700 0.791300
+vn 0.270100 -0.541100 0.796400
+vn 0.254100 -0.572200 0.779700
+vn 0.281300 -0.553900 0.783600
+vn 0.295800 -0.521000 0.800600
+vn 0.282300 -0.507600 0.814000
+vn 0.321300 -0.500300 0.804000
+vn 0.306600 -0.485800 0.818500
+vn 0.308100 -0.535000 0.786600
+vn 0.334700 -0.515500 0.788800
+vn 0.267600 -0.494900 0.826700
+vn 0.290600 -0.472000 0.832300
+vn 0.300100 -0.580800 0.756600
+vn 0.291400 -0.567200 0.770300
+vn 0.263200 -0.584200 0.767700
+vn 0.271100 -0.596500 0.755400
+vn 0.277900 -0.609200 0.742700
+vn 0.307600 -0.594900 0.742600
+vn 0.283500 -0.622200 0.729700
+vn 0.313800 -0.609300 0.728200
+vn 0.336900 -0.579900 0.741700
+vn 0.328700 -0.564500 0.757100
+vn 0.365900 -0.564300 0.740000
+vn 0.357100 -0.547600 0.756700
+vn 0.343700 -0.595700 0.725900
+vn 0.373300 -0.581400 0.722900
+vn 0.319200 -0.549500 0.772100
+vn 0.346600 -0.531300 0.773000
+vn 0.322100 -0.638800 0.698700
+vn 0.318600 -0.624000 0.713500
+vn 0.287800 -0.635500 0.716400
+vn 0.291000 -0.648900 0.703100
+vn 0.292800 -0.662300 0.689600
+vn 0.324100 -0.653700 0.683800
+vn 0.293500 -0.676000 0.676000
+vn 0.324800 -0.668800 0.668800
+vn 0.355100 -0.644300 0.677300
+vn 0.352800 -0.627900 0.693700
+vn 0.385600 -0.634200 0.670100
+vn 0.383200 -0.616500 0.687800
+vn 0.355800 -0.660800 0.660800
+vn 0.386500 -0.652200 0.652200
+vn 0.349000 -0.611700 0.709900
+vn 0.379000 -0.598900 0.705400
+vn 0.322100 -0.698700 0.638800
+vn 0.324100 -0.683800 0.653700
+vn 0.292800 -0.689600 0.662300
+vn 0.291000 -0.703100 0.648900
+vn 0.287800 -0.716400 0.635500
+vn 0.318600 -0.713500 0.624000
+vn 0.283500 -0.729700 0.622200
+vn 0.313800 -0.728200 0.609300
+vn 0.349000 -0.709900 0.611700
+vn 0.352800 -0.693700 0.627900
+vn 0.379000 -0.705400 0.598900
+vn 0.383200 -0.687800 0.616500
+vn 0.343700 -0.725900 0.595700
+vn 0.373300 -0.722900 0.581400
+vn 0.355100 -0.677300 0.644300
+vn 0.385600 -0.670100 0.634200
+vn 0.300100 -0.756600 0.580800
+vn 0.307600 -0.742600 0.594900
+vn 0.277900 -0.742700 0.609200
+vn 0.271100 -0.755400 0.596500
+vn 0.263200 -0.767700 0.584200
+vn 0.291400 -0.770300 0.567200
+vn 0.254100 -0.779700 0.572200
+vn 0.281300 -0.783600 0.553900
+vn 0.319200 -0.772100 0.549500
+vn 0.328700 -0.757100 0.564500
+vn 0.346600 -0.773000 0.531300
+vn 0.357100 -0.756700 0.547600
+vn 0.308100 -0.786600 0.535000
+vn 0.334700 -0.788800 0.515500
+vn 0.336900 -0.741700 0.579900
+vn 0.365900 -0.740000 0.564300
+vn 0.257700 -0.808600 0.528900
+vn 0.270100 -0.796400 0.541100
+vn 0.244000 -0.791300 0.560700
+vn 0.232800 -0.802300 0.549600
+vn 0.220600 -0.812800 0.539100
+vn 0.244200 -0.820200 0.517300
+vn 0.207500 -0.822700 0.529200
+vn 0.229700 -0.831200 0.506300
+vn 0.267600 -0.826700 0.494900
+vn 0.282300 -0.814000 0.507600
+vn 0.290600 -0.832300 0.472000
+vn 0.306600 -0.818500 0.485800
+vn 0.251600 -0.838700 0.482900
+vn 0.273300 -0.845400 0.458900
+vn 0.295800 -0.800600 0.521000
+vn 0.321300 -0.804000 0.500300
+vn 0.197700 -0.851000 0.486500
+vn 0.214100 -0.841500 0.496000
+vn 0.193500 -0.832000 0.519900
+vn 0.178700 -0.840600 0.511300
+vn 0.163100 -0.848500 0.503400
+vn 0.180500 -0.859700 0.477800
+vn 0.146700 -0.855700 0.496200
+vn 0.162400 -0.867700 0.469800
+vn 0.197700 -0.870000 0.451600
+vn 0.216600 -0.860400 0.461200
+vn 0.214800 -0.879400 0.424900
+vn 0.235300 -0.869000 0.435300
+vn 0.177900 -0.878700 0.442900
+vn 0.193200 -0.888800 0.415500
+vn 0.234600 -0.850000 0.471600
+vn 0.254800 -0.857600 0.446600
+vn 0.124300 -0.880900 0.456500
+vn 0.143600 -0.874800 0.462700
+vn 0.129700 -0.862100 0.489800
+vn 0.112300 -0.867700 0.484200
+vn 0.094400 -0.872500 0.479400
+vn 0.104400 -0.886300 0.451200
+vn 0.075900 -0.876400 0.475500
+vn 0.084000 -0.890600 0.446900
+vn 0.114400 -0.899100 0.422600
+vn 0.136200 -0.893300 0.428300
+vn 0.124300 -0.910900 0.393400
+vn 0.147900 -0.904600 0.399700
+vn 0.092100 -0.903900 0.417800
+vn 0.100000 -0.916100 0.388200
+vn 0.157300 -0.886500 0.435100
+vn 0.170900 -0.897300 0.407000
+vn 0.042400 -0.896500 0.441000
+vn 0.063300 -0.894000 0.443500
+vn 0.057200 -0.879500 0.472400
+vn 0.038300 -0.881700 0.470200
+vn 0.019200 -0.883000 0.468900
+vn 0.021300 -0.897900 0.439500
+vn 0.000000 -0.883500 0.468400
+vn 0.000000 -0.898400 0.439000
+vn 0.023300 -0.911900 0.409700
+vn 0.046400 -0.910300 0.411300
+vn 0.025300 -0.924800 0.379400
+vn 0.050400 -0.923100 0.381200
+vn 0.000000 -0.912400 0.409200
+vn 0.000000 -0.925400 0.378900
+vn 0.069400 -0.907600 0.414000
+vn 0.075300 -0.920200 0.384100
+vn -0.042400 -0.896500 0.441000
+vn -0.021300 -0.897900 0.439500
+vn -0.019200 -0.883000 0.468900
+vn -0.038300 -0.881700 0.470200
+vn -0.057200 -0.879500 0.472400
+vn -0.063300 -0.894000 0.443500
+vn -0.075900 -0.876400 0.475500
+vn -0.084000 -0.890600 0.446900
+vn -0.069400 -0.907600 0.414000
+vn -0.046400 -0.910300 0.411300
+vn -0.075300 -0.920200 0.384100
+vn -0.050400 -0.923100 0.381200
+vn -0.092100 -0.903900 0.417800
+vn -0.100000 -0.916100 0.388200
+vn -0.023300 -0.911900 0.409700
+vn -0.025300 -0.924800 0.379400
+vn -0.124300 -0.880900 0.456500
+vn -0.104400 -0.886300 0.451200
+vn -0.094400 -0.872500 0.479400
+vn -0.112300 -0.867700 0.484200
+vn -0.129700 -0.862100 0.489800
+vn -0.143600 -0.874800 0.462700
+vn -0.146700 -0.855700 0.496200
+vn -0.162400 -0.867700 0.469800
+vn -0.157300 -0.886500 0.435100
+vn -0.136200 -0.893300 0.428300
+vn -0.170900 -0.897300 0.407000
+vn -0.147900 -0.904600 0.399700
+vn -0.177900 -0.878700 0.442900
+vn -0.193200 -0.888800 0.415500
+vn -0.114400 -0.899100 0.422600
+vn -0.124300 -0.910900 0.393400
+vn -0.197700 -0.851000 0.486500
+vn -0.180500 -0.859700 0.477800
+vn -0.163100 -0.848500 0.503400
+vn -0.178700 -0.840600 0.511300
+vn -0.193500 -0.832000 0.519900
+vn -0.214100 -0.841500 0.496000
+vn -0.207500 -0.822700 0.529200
+vn -0.229700 -0.831200 0.506300
+vn -0.234600 -0.850000 0.471600
+vn -0.216600 -0.860400 0.461200
+vn -0.254800 -0.857600 0.446600
+vn -0.235300 -0.869000 0.435300
+vn -0.251600 -0.838700 0.482900
+vn -0.273300 -0.845400 0.458900
+vn -0.197700 -0.870000 0.451600
+vn -0.214800 -0.879400 0.424900
+vn -0.257700 -0.808600 0.528900
+vn -0.244200 -0.820200 0.517300
+vn -0.220600 -0.812800 0.539100
+vn -0.232800 -0.802300 0.549600
+vn -0.244000 -0.791300 0.560600
+vn -0.270100 -0.796400 0.541100
+vn -0.254100 -0.779700 0.572200
+vn -0.281300 -0.783600 0.553900
+vn -0.295800 -0.800600 0.521000
+vn -0.282300 -0.814000 0.507600
+vn -0.321300 -0.804000 0.500300
+vn -0.306600 -0.818500 0.485800
+vn -0.308100 -0.786600 0.535000
+vn -0.334700 -0.788800 0.515500
+vn -0.267600 -0.826700 0.494900
+vn -0.290600 -0.832300 0.472000
+vn -0.300100 -0.756600 0.580800
+vn -0.291400 -0.770300 0.567200
+vn -0.263200 -0.767700 0.584200
+vn -0.271100 -0.755400 0.596500
+vn -0.277900 -0.742700 0.609200
+vn -0.307600 -0.742600 0.594900
+vn -0.283500 -0.729700 0.622200
+vn -0.313800 -0.728200 0.609300
+vn -0.336900 -0.741700 0.579900
+vn -0.328700 -0.757100 0.564500
+vn -0.365900 -0.740000 0.564300
+vn -0.357100 -0.756700 0.547600
+vn -0.343700 -0.725900 0.595700
+vn -0.373300 -0.722900 0.581400
+vn -0.319200 -0.772100 0.549500
+vn -0.346600 -0.773000 0.531300
+vn -0.322100 -0.698700 0.638800
+vn -0.318600 -0.713500 0.624000
+vn -0.287800 -0.716400 0.635500
+vn -0.291000 -0.703100 0.648900
+vn -0.292800 -0.689600 0.662300
+vn -0.324100 -0.683800 0.653700
+vn -0.293500 -0.676000 0.676000
+vn -0.324800 -0.668800 0.668800
+vn -0.355100 -0.677300 0.644300
+vn -0.352800 -0.693700 0.627900
+vn -0.385600 -0.670100 0.634200
+vn -0.383200 -0.687800 0.616500
+vn -0.355800 -0.660800 0.660800
+vn -0.386500 -0.652200 0.652200
+vn -0.349000 -0.709900 0.611700
+vn -0.379000 -0.705400 0.598900
+vn -0.322100 -0.638800 0.698700
+vn -0.324100 -0.653700 0.683800
+vn -0.292800 -0.662300 0.689600
+vn -0.291000 -0.648900 0.703100
+vn -0.287800 -0.635500 0.716400
+vn -0.318600 -0.624000 0.713500
+vn -0.349000 -0.611700 0.709900
+vn -0.352800 -0.627900 0.693700
+vn -0.379000 -0.598900 0.705400
+vn -0.383200 -0.616500 0.687800
+vn -0.355100 -0.644300 0.677300
+vn -0.385600 -0.634200 0.670100
+vn -0.412400 -0.511900 0.753500
+vn -0.422700 -0.531200 0.734200
+vn -0.394500 -0.548000 0.737500
+vn -0.385000 -0.530000 0.755500
+vn -0.431200 -0.551000 0.714400
+vn -0.402500 -0.566500 0.719000
+vn -0.373700 -0.512500 0.773100
+vn -0.400400 -0.493200 0.772300
+vn -0.360900 -0.495500 0.790100
+vn -0.386500 -0.474900 0.790600
+vn -0.426600 -0.473300 0.770700
+vn -0.439400 -0.493300 0.750700
+vn -0.452300 -0.452900 0.768300
+vn -0.465900 -0.474100 0.747100
+vn -0.411800 -0.453900 0.790200
+vn -0.436700 -0.432300 0.788900
+vn -0.450300 -0.513900 0.730200
+vn -0.459400 -0.535000 0.709000
+vn -0.477500 -0.495900 0.725300
+vn -0.487100 -0.518300 0.702900
+vn -0.354100 -0.440600 0.824900
+vn -0.371100 -0.457400 0.808100
+vn -0.346400 -0.479000 0.806500
+vn -0.330600 -0.463400 0.822100
+vn -0.313300 -0.448500 0.837000
+vn -0.335600 -0.424700 0.840800
+vn -0.294600 -0.434400 0.851100
+vn -0.315600 -0.409600 0.855900
+vn -0.357600 -0.400300 0.843700
+vn -0.377300 -0.417300 0.826700
+vn -0.379200 -0.375500 0.845700
+vn -0.400100 -0.393500 0.827700
+vn -0.336300 -0.384200 0.859800
+vn -0.356500 -0.358500 0.862700
+vn -0.395400 -0.435100 0.808900
+vn -0.419200 -0.412500 0.808700
+vn -0.271700 -0.382300 0.883100
+vn -0.294300 -0.395400 0.870100
+vn -0.274700 -0.421200 0.864300
+vn -0.253600 -0.409000 0.876500
+vn -0.231500 -0.397800 0.887800
+vn -0.248000 -0.370300 0.895200
+vn -0.208300 -0.387600 0.897900
+vn -0.223200 -0.359400 0.906100
+vn -0.264300 -0.342400 0.901600
+vn -0.289500 -0.355200 0.888800
+vn -0.280200 -0.314200 0.907100
+vn -0.307000 -0.327700 0.893500
+vn -0.237800 -0.330800 0.913200
+vn -0.252100 -0.301800 0.919400
+vn -0.313500 -0.369200 0.874900
+vn -0.332400 -0.342500 0.878700
+vn -0.170800 -0.341100 0.924300
+vn -0.197400 -0.349600 0.915800
+vn -0.184200 -0.378500 0.907000
+vn -0.159500 -0.370600 0.915000
+vn -0.134000 -0.363800 0.921800
+vn -0.143500 -0.333900 0.931600
+vn -0.107800 -0.358200 0.927400
+vn -0.115500 -0.327900 0.937600
+vn -0.152900 -0.303600 0.940400
+vn -0.182000 -0.311300 0.932700
+vn -0.162100 -0.273000 0.948200
+vn -0.193000 -0.281200 0.940000
+vn -0.123100 -0.297200 0.946800
+vn -0.130500 -0.266200 0.955000
+vn -0.210300 -0.320400 0.923600
+vn -0.223000 -0.290800 0.930400
+vn -0.058300 -0.319800 0.945700
+vn -0.087000 -0.323200 0.942300
+vn -0.081200 -0.353800 0.931800
+vn -0.054400 -0.350700 0.934900
+vn -0.027300 -0.348800 0.936800
+vn -0.029200 -0.317800 0.947700
+vn 0.000000 -0.348200 0.937400
+vn 0.000000 -0.317100 0.948400
+vn -0.031200 -0.286400 0.957600
+vn -0.062000 -0.288600 0.955400
+vn -0.033100 -0.254800 0.966400
+vn -0.065800 -0.257100 0.964100
+vn 0.000000 -0.285700 0.958300
+vn 0.000000 -0.254000 0.967200
+vn -0.092700 -0.292200 0.951800
+vn -0.098300 -0.260900 0.960300
+vn 0.058300 -0.319800 0.945700
+vn 0.029200 -0.317800 0.947700
+vn 0.027300 -0.348800 0.936800
+vn 0.054400 -0.350700 0.934900
+vn 0.081200 -0.353800 0.931800
+vn 0.087000 -0.323200 0.942300
+vn 0.107800 -0.358200 0.927400
+vn 0.115500 -0.327900 0.937600
+vn 0.092700 -0.292200 0.951800
+vn 0.062100 -0.288600 0.955400
+vn 0.098300 -0.260900 0.960300
+vn 0.065800 -0.257100 0.964100
+vn 0.123100 -0.297200 0.946800
+vn 0.130500 -0.266200 0.955000
+vn 0.031200 -0.286400 0.957600
+vn 0.033100 -0.254800 0.966400
+vn 0.170800 -0.341100 0.924300
+vn 0.143500 -0.333900 0.931600
+vn 0.134000 -0.363800 0.921800
+vn 0.159400 -0.370600 0.915000
+vn 0.184200 -0.378500 0.907000
+vn 0.197400 -0.349600 0.915800
+vn 0.208300 -0.387600 0.897900
+vn 0.223200 -0.359400 0.906100
+vn 0.210300 -0.320400 0.923600
+vn 0.182000 -0.311300 0.932700
+vn 0.223000 -0.290800 0.930400
+vn 0.193000 -0.281200 0.940000
+vn 0.237800 -0.330800 0.913200
+vn 0.252100 -0.301800 0.919400
+vn 0.152900 -0.303600 0.940400
+vn 0.162100 -0.273000 0.948200
+vn 0.271700 -0.382300 0.883100
+vn 0.248000 -0.370300 0.895200
+vn 0.231500 -0.397800 0.887800
+vn 0.253600 -0.409000 0.876500
+vn 0.274700 -0.421200 0.864300
+vn 0.294300 -0.395400 0.870100
+vn 0.294600 -0.434400 0.851100
+vn 0.315600 -0.409600 0.855900
+vn 0.313500 -0.369200 0.874900
+vn 0.289500 -0.355200 0.888800
+vn 0.332400 -0.342500 0.878700
+vn 0.307000 -0.327700 0.893500
+vn 0.336300 -0.384200 0.859800
+vn 0.356500 -0.358500 0.862700
+vn 0.264300 -0.342400 0.901600
+vn 0.280200 -0.314200 0.907100
+vn 0.354100 -0.440600 0.824900
+vn 0.335600 -0.424700 0.840800
+vn 0.313300 -0.448500 0.837000
+vn 0.330600 -0.463400 0.822100
+vn 0.346400 -0.479000 0.806500
+vn 0.371100 -0.457400 0.808100
+vn 0.360900 -0.495500 0.790100
+vn 0.386500 -0.474900 0.790600
+vn 0.395400 -0.435100 0.808900
+vn 0.377300 -0.417300 0.826700
+vn 0.419200 -0.412500 0.808700
+vn 0.400100 -0.393500 0.827700
+vn 0.411800 -0.453900 0.790200
+vn 0.436700 -0.432300 0.788900
+vn 0.357600 -0.400300 0.843700
+vn 0.379200 -0.375500 0.845700
+vn 0.412400 -0.511900 0.753500
+vn 0.400400 -0.493200 0.772300
+vn 0.373700 -0.512500 0.773100
+vn 0.385000 -0.530000 0.755500
+vn 0.394500 -0.548000 0.737500
+vn 0.422700 -0.531200 0.734200
+vn 0.402500 -0.566500 0.719000
+vn 0.431200 -0.551000 0.714400
+vn 0.450300 -0.513900 0.730200
+vn 0.439400 -0.493300 0.750700
+vn 0.477500 -0.495900 0.725300
+vn 0.465900 -0.474100 0.747100
+vn 0.459400 -0.535000 0.709000
+vn 0.487100 -0.518300 0.702900
+vn 0.426600 -0.473300 0.770700
+vn 0.452300 -0.452900 0.768300
+vn 0.442500 -0.591500 0.673900
+vn 0.437800 -0.571200 0.694300
+vn 0.408700 -0.585300 0.700200
+vn 0.413100 -0.604300 0.681200
+vn 0.415800 -0.623500 0.662100
+vn 0.445400 -0.612000 0.653400
+vn 0.416700 -0.642800 0.642800
+vn 0.446400 -0.632700 0.632700
+vn 0.474500 -0.600000 0.644100
+vn 0.471500 -0.578100 0.665900
+vn 0.503200 -0.587200 0.634000
+vn 0.500000 -0.564000 0.657200
+vn 0.475600 -0.622000 0.622000
+vn 0.504300 -0.610600 0.610600
+vn 0.466400 -0.556400 0.687600
+vn 0.494600 -0.541100 0.680100
+vn 0.442500 -0.673900 0.591500
+vn 0.445400 -0.653400 0.612000
+vn 0.415800 -0.662100 0.623500
+vn 0.413100 -0.681200 0.604300
+vn 0.408700 -0.700200 0.585300
+vn 0.437800 -0.694300 0.571200
+vn 0.402500 -0.719000 0.566500
+vn 0.431200 -0.714400 0.551000
+vn 0.466400 -0.687600 0.556400
+vn 0.471500 -0.665900 0.578100
+vn 0.494600 -0.680100 0.541100
+vn 0.500000 -0.657200 0.564000
+vn 0.459400 -0.709000 0.535000
+vn 0.487100 -0.702900 0.518300
+vn 0.474500 -0.644100 0.600000
+vn 0.503200 -0.634000 0.587200
+vn 0.412400 -0.753500 0.511900
+vn 0.422700 -0.734200 0.531200
+vn 0.394500 -0.737500 0.548000
+vn 0.385000 -0.755500 0.530000
+vn 0.373700 -0.773100 0.512500
+vn 0.400400 -0.772300 0.493200
+vn 0.360900 -0.790100 0.495500
+vn 0.386500 -0.790600 0.474900
+vn 0.426600 -0.770700 0.473300
+vn 0.439400 -0.750700 0.493300
+vn 0.452300 -0.768300 0.452900
+vn 0.465900 -0.747100 0.474100
+vn 0.411800 -0.790200 0.453900
+vn 0.436700 -0.788900 0.432300
+vn 0.450300 -0.730200 0.513900
+vn 0.477500 -0.725300 0.495900
+vn 0.354100 -0.824900 0.440600
+vn 0.371100 -0.808100 0.457400
+vn 0.346400 -0.806500 0.479000
+vn 0.330600 -0.822100 0.463400
+vn 0.313300 -0.837000 0.448500
+vn 0.335600 -0.840800 0.424700
+vn 0.294600 -0.851100 0.434400
+vn 0.315600 -0.855900 0.409600
+vn 0.357600 -0.843700 0.400300
+vn 0.377300 -0.826700 0.417300
+vn 0.379200 -0.845700 0.375500
+vn 0.400100 -0.827700 0.393500
+vn 0.336300 -0.859800 0.384200
+vn 0.356500 -0.862700 0.358500
+vn 0.395400 -0.808900 0.435100
+vn 0.419200 -0.808700 0.412500
+vn 0.271700 -0.883100 0.382300
+vn 0.294300 -0.870100 0.395400
+vn 0.274700 -0.864300 0.421200
+vn 0.253600 -0.876500 0.409000
+vn 0.231500 -0.887800 0.397800
+vn 0.248000 -0.895200 0.370300
+vn 0.208300 -0.897900 0.387600
+vn 0.223200 -0.906100 0.359400
+vn 0.264300 -0.901600 0.342400
+vn 0.289500 -0.888800 0.355200
+vn 0.280200 -0.907100 0.314200
+vn 0.307000 -0.893500 0.327700
+vn 0.237800 -0.913200 0.330800
+vn 0.252100 -0.919400 0.301800
+vn 0.313500 -0.874900 0.369200
+vn 0.332400 -0.878700 0.342500
+vn 0.170800 -0.924300 0.341100
+vn 0.197400 -0.915800 0.349600
+vn 0.184200 -0.907000 0.378500
+vn 0.159400 -0.915000 0.370600
+vn 0.134000 -0.921800 0.363800
+vn 0.143500 -0.931600 0.333900
+vn 0.107800 -0.927400 0.358200
+vn 0.115500 -0.937600 0.327900
+vn 0.152900 -0.940400 0.303600
+vn 0.182000 -0.932700 0.311300
+vn 0.162100 -0.948200 0.273000
+vn 0.193000 -0.940000 0.281200
+vn 0.123100 -0.946800 0.297200
+vn 0.130500 -0.955000 0.266200
+vn 0.210300 -0.923600 0.320400
+vn 0.223000 -0.930400 0.290800
+vn 0.058300 -0.945700 0.319800
+vn 0.087000 -0.942300 0.323200
+vn 0.081200 -0.931800 0.353800
+vn 0.054400 -0.934900 0.350700
+vn 0.027300 -0.936800 0.348800
+vn 0.029200 -0.947700 0.317800
+vn 0.000000 -0.937400 0.348200
+vn 0.000000 -0.948400 0.317100
+vn 0.031200 -0.957600 0.286400
+vn 0.062100 -0.955400 0.288600
+vn 0.033100 -0.966400 0.254800
+vn 0.065800 -0.964100 0.257100
+vn 0.000000 -0.958300 0.285700
+vn 0.000000 -0.967200 0.254000
+vn 0.092700 -0.951800 0.292200
+vn 0.098300 -0.960300 0.260900
+vn -0.058300 -0.945700 0.319800
+vn -0.029200 -0.947700 0.317800
+vn -0.027300 -0.936800 0.348800
+vn -0.054400 -0.934900 0.350700
+vn -0.081200 -0.931800 0.353800
+vn -0.087000 -0.942300 0.323200
+vn -0.107800 -0.927400 0.358200
+vn -0.115500 -0.937600 0.327900
+vn -0.092700 -0.951800 0.292200
+vn -0.062100 -0.955400 0.288600
+vn -0.098300 -0.960300 0.260900
+vn -0.065800 -0.964100 0.257100
+vn -0.123100 -0.946800 0.297200
+vn -0.130500 -0.955000 0.266200
+vn -0.031200 -0.957600 0.286400
+vn -0.033100 -0.966400 0.254800
+vn -0.170800 -0.924300 0.341100
+vn -0.143500 -0.931600 0.333900
+vn -0.134000 -0.921800 0.363800
+vn -0.159400 -0.915000 0.370600
+vn -0.184200 -0.907000 0.378500
+vn -0.197400 -0.915800 0.349600
+vn -0.208300 -0.897900 0.387600
+vn -0.223200 -0.906100 0.359400
+vn -0.210300 -0.923600 0.320400
+vn -0.182000 -0.932700 0.311300
+vn -0.223000 -0.930400 0.290800
+vn -0.193000 -0.940000 0.281200
+vn -0.237800 -0.913200 0.330800
+vn -0.252100 -0.919400 0.301800
+vn -0.152900 -0.940400 0.303600
+vn -0.162100 -0.948200 0.273000
+vn -0.271700 -0.883100 0.382300
+vn -0.248000 -0.895200 0.370300
+vn -0.231500 -0.887800 0.397800
+vn -0.253600 -0.876500 0.409000
+vn -0.274700 -0.864300 0.421200
+vn -0.294300 -0.870100 0.395400
+vn -0.294600 -0.851100 0.434400
+vn -0.315600 -0.855900 0.409600
+vn -0.313500 -0.874900 0.369200
+vn -0.289500 -0.888800 0.355200
+vn -0.332400 -0.878700 0.342500
+vn -0.307000 -0.893500 0.327700
+vn -0.336300 -0.859800 0.384200
+vn -0.356500 -0.862700 0.358500
+vn -0.264300 -0.901600 0.342400
+vn -0.280200 -0.907100 0.314200
+vn -0.354100 -0.824900 0.440600
+vn -0.335600 -0.840800 0.424700
+vn -0.313300 -0.837000 0.448500
+vn -0.330600 -0.822100 0.463400
+vn -0.346400 -0.806500 0.479000
+vn -0.371100 -0.808100 0.457400
+vn -0.360900 -0.790100 0.495500
+vn -0.386500 -0.790600 0.474900
+vn -0.395400 -0.808900 0.435100
+vn -0.377300 -0.826700 0.417300
+vn -0.419200 -0.808700 0.412500
+vn -0.400100 -0.827700 0.393500
+vn -0.411800 -0.790200 0.453900
+vn -0.436700 -0.788900 0.432300
+vn -0.357600 -0.843700 0.400300
+vn -0.379200 -0.845700 0.375500
+vn -0.412400 -0.753500 0.511900
+vn -0.400400 -0.772300 0.493200
+vn -0.373700 -0.773100 0.512500
+vn -0.385000 -0.755500 0.530000
+vn -0.394500 -0.737500 0.548000
+vn -0.422700 -0.734200 0.531200
+vn -0.402500 -0.719000 0.566500
+vn -0.431200 -0.714400 0.551000
+vn -0.450300 -0.730200 0.513900
+vn -0.439400 -0.750700 0.493300
+vn -0.477500 -0.725300 0.495900
+vn -0.465900 -0.747100 0.474100
+vn -0.459400 -0.709000 0.535000
+vn -0.487100 -0.702900 0.518300
+vn -0.426600 -0.770700 0.473300
+vn -0.452300 -0.768300 0.452900
+vn -0.442500 -0.673900 0.591500
+vn -0.437800 -0.694300 0.571200
+vn -0.408700 -0.700200 0.585300
+vn -0.413100 -0.681200 0.604300
+vn -0.415800 -0.662100 0.623500
+vn -0.445400 -0.653400 0.612000
+vn -0.416700 -0.642800 0.642800
+vn -0.446400 -0.632700 0.632700
+vn -0.474500 -0.644100 0.600000
+vn -0.471500 -0.665900 0.578100
+vn -0.503200 -0.634000 0.587200
+vn -0.500000 -0.657200 0.564000
+vn -0.475600 -0.622000 0.622000
+vn -0.504300 -0.610600 0.610600
+vn -0.466400 -0.687600 0.556400
+vn -0.494600 -0.680100 0.541100
+vn -0.442500 -0.591500 0.673900
+vn -0.445400 -0.612000 0.653400
+vn -0.415800 -0.623500 0.662100
+vn -0.413100 -0.604300 0.681200
+vn -0.408700 -0.585300 0.700200
+vn -0.437800 -0.571200 0.694300
+vn -0.466400 -0.556400 0.687600
+vn -0.471500 -0.578100 0.665900
+vn -0.494600 -0.541100 0.680100
+vn -0.500000 -0.564000 0.657200
+vn -0.474500 -0.600000 0.644100
+vn -0.503200 -0.587200 0.634000
+vn -0.517300 -0.434300 0.737400
+vn -0.530200 -0.458500 0.713200
+vn -0.504100 -0.477500 0.719600
+vn -0.491900 -0.454500 0.742600
+vn -0.540800 -0.483400 0.688300
+vn -0.514200 -0.501100 0.696000
+vn -0.477500 -0.432100 0.765000
+vn -0.502200 -0.410800 0.760900
+vn -0.461100 -0.410300 0.786800
+vn -0.484900 -0.387900 0.783800
+vn -0.526300 -0.389100 0.756000
+vn -0.542100 -0.413800 0.731300
+vn -0.549900 -0.366900 0.750300
+vn -0.566400 -0.392700 0.724500
+vn -0.508200 -0.365100 0.780000
+vn -0.530900 -0.341900 0.775400
+vn -0.555600 -0.439100 0.706000
+vn -0.566800 -0.465200 0.680000
+vn -0.580500 -0.419200 0.698000
+vn -0.592200 -0.446400 0.670800
+vn -0.444200 -0.344800 0.826900
+vn -0.465500 -0.365900 0.805900
+vn -0.442600 -0.389400 0.807700
+vn -0.422400 -0.369400 0.827700
+vn -0.400300 -0.350400 0.846700
+vn -0.421000 -0.324800 0.846900
+vn -0.376400 -0.332300 0.864700
+vn -0.395900 -0.305900 0.865800
+vn -0.441200 -0.299000 0.846100
+vn -0.465500 -0.320000 0.825200
+vn -0.461000 -0.272800 0.844400
+vn -0.486400 -0.294700 0.822500
+vn -0.414900 -0.279200 0.866000
+vn -0.433500 -0.252100 0.865200
+vn -0.487800 -0.342000 0.803100
+vn -0.509700 -0.317700 0.799500
+vn -0.340800 -0.271700 0.900000
+vn -0.369100 -0.288200 0.883600
+vn -0.351000 -0.315500 0.881600
+vn -0.324100 -0.299900 0.897200
+vn -0.295800 -0.285500 0.911500
+vn -0.311100 -0.256700 0.915000
+vn -0.266200 -0.272500 0.924600
+vn -0.279900 -0.243000 0.928700
+vn -0.326100 -0.227600 0.917500
+vn -0.357200 -0.243400 0.901700
+vn -0.340700 -0.198200 0.919000
+vn -0.373200 -0.214700 0.902600
+vn -0.293400 -0.213200 0.931900
+vn -0.306500 -0.183200 0.934000
+vn -0.386800 -0.260500 0.884500
+vn -0.404200 -0.232600 0.884600
+vn -0.214300 -0.220100 0.951600
+vn -0.247600 -0.230800 0.941000
+vn -0.235400 -0.260900 0.936200
+vn -0.203700 -0.250700 0.946300
+vn -0.171200 -0.242100 0.955000
+vn -0.180000 -0.211000 0.960800
+vn -0.137800 -0.234900 0.962200
+vn -0.144900 -0.203400 0.968300
+vn -0.188700 -0.179700 0.965500
+vn -0.224600 -0.189200 0.955900
+vn -0.197100 -0.148100 0.969100
+vn -0.234600 -0.158100 0.959100
+vn -0.151900 -0.171800 0.973400
+vn -0.158700 -0.139900 0.977400
+vn -0.259400 -0.200400 0.944700
+vn -0.271100 -0.169800 0.947400
+vn -0.073100 -0.193300 0.978400
+vn -0.109100 -0.197500 0.974200
+vn -0.103800 -0.229300 0.967800
+vn -0.069500 -0.225300 0.971800
+vn -0.034900 -0.222900 0.974200
+vn -0.036700 -0.190800 0.980900
+vn 0.000000 -0.222100 0.975000
+vn 0.000000 -0.189900 0.981800
+vn -0.038500 -0.158500 0.986600
+vn -0.076600 -0.161200 0.983900
+vn -0.040200 -0.126000 0.991200
+vn -0.080000 -0.128800 0.988400
+vn 0.000000 -0.157600 0.987500
+vn 0.000000 -0.125100 0.992100
+vn -0.114400 -0.165600 0.979500
+vn -0.119500 -0.133400 0.983800
+vn 0.073100 -0.193300 0.978400
+vn 0.036700 -0.190800 0.980900
+vn 0.034900 -0.222900 0.974200
+vn 0.069500 -0.225300 0.971800
+vn 0.103800 -0.229300 0.967800
+vn 0.109100 -0.197500 0.974200
+vn 0.137800 -0.234900 0.962200
+vn 0.144900 -0.203400 0.968300
+vn 0.114400 -0.165600 0.979500
+vn 0.076600 -0.161200 0.983900
+vn 0.119500 -0.133400 0.983800
+vn 0.080000 -0.128800 0.988400
+vn 0.151900 -0.171800 0.973400
+vn 0.158700 -0.139900 0.977400
+vn 0.038500 -0.158500 0.986600
+vn 0.040200 -0.126000 0.991200
+vn 0.214300 -0.220100 0.951600
+vn 0.180000 -0.211000 0.960800
+vn 0.171200 -0.242100 0.955000
+vn 0.203700 -0.250700 0.946300
+vn 0.235400 -0.260900 0.936200
+vn 0.247600 -0.230800 0.941000
+vn 0.266200 -0.272500 0.924600
+vn 0.279900 -0.243000 0.928700
+vn 0.259400 -0.200400 0.944700
+vn 0.224600 -0.189200 0.955900
+vn 0.271100 -0.169800 0.947400
+vn 0.234600 -0.158100 0.959100
+vn 0.293400 -0.213200 0.931900
+vn 0.306500 -0.183200 0.934000
+vn 0.188700 -0.179700 0.965500
+vn 0.197100 -0.148100 0.969100
+vn 0.340800 -0.271700 0.900000
+vn 0.311100 -0.256700 0.915000
+vn 0.295800 -0.285500 0.911500
+vn 0.324100 -0.299900 0.897200
+vn 0.351000 -0.315500 0.881600
+vn 0.369100 -0.288200 0.883600
+vn 0.376400 -0.332300 0.864700
+vn 0.395900 -0.305900 0.865800
+vn 0.386800 -0.260500 0.884500
+vn 0.357200 -0.243400 0.901700
+vn 0.404200 -0.232600 0.884600
+vn 0.373200 -0.214700 0.902600
+vn 0.414900 -0.279200 0.866000
+vn 0.433500 -0.252100 0.865200
+vn 0.326100 -0.227600 0.917500
+vn 0.340700 -0.198200 0.919000
+vn 0.444200 -0.344800 0.826900
+vn 0.421000 -0.324800 0.846900
+vn 0.400300 -0.350400 0.846700
+vn 0.422400 -0.369400 0.827700
+vn 0.442600 -0.389300 0.807700
+vn 0.465500 -0.365900 0.805900
+vn 0.461100 -0.410300 0.786800
+vn 0.484900 -0.387900 0.783800
+vn 0.487800 -0.342000 0.803100
+vn 0.465500 -0.320000 0.825200
+vn 0.509700 -0.317700 0.799500
+vn 0.486400 -0.294700 0.822500
+vn 0.508200 -0.365100 0.780000
+vn 0.530900 -0.341900 0.775400
+vn 0.441200 -0.299000 0.846100
+vn 0.461000 -0.272800 0.844400
+vn 0.517300 -0.434300 0.737400
+vn 0.502200 -0.410800 0.760900
+vn 0.477500 -0.432100 0.765000
+vn 0.491900 -0.454500 0.742600
+vn 0.504100 -0.477500 0.719600
+vn 0.530200 -0.458500 0.713200
+vn 0.514200 -0.501100 0.696000
+vn 0.540800 -0.483400 0.688300
+vn 0.555600 -0.439100 0.706000
+vn 0.542100 -0.413800 0.731300
+vn 0.580500 -0.419200 0.698000
+vn 0.566400 -0.392700 0.724500
+vn 0.566800 -0.465200 0.680000
+vn 0.592200 -0.446400 0.670800
+vn 0.526300 -0.389100 0.756000
+vn 0.549900 -0.366900 0.750300
+vn 0.555100 -0.534200 0.637500
+vn 0.549200 -0.508700 0.663000
+vn 0.522200 -0.525100 0.671900
+vn 0.527800 -0.549400 0.647700
+vn 0.531200 -0.573900 0.623200
+vn 0.558700 -0.559900 0.611800
+vn 0.532400 -0.598500 0.598500
+vn 0.559900 -0.585900 0.585900
+vn 0.585500 -0.545300 0.599700
+vn 0.581800 -0.518400 0.626700
+vn 0.611700 -0.530200 0.587000
+vn 0.607800 -0.502000 0.615200
+vn 0.586800 -0.572600 0.572600
+vn 0.613100 -0.558600 0.558600
+vn 0.575500 -0.491700 0.653400
+vn 0.601300 -0.474100 0.643100
+vn 0.555100 -0.637500 0.534200
+vn 0.558700 -0.611800 0.559900
+vn 0.531200 -0.623200 0.573900
+vn 0.527800 -0.647700 0.549400
+vn 0.522200 -0.671900 0.525200
+vn 0.549200 -0.663000 0.508700
+vn 0.514200 -0.696000 0.501100
+vn 0.540800 -0.688300 0.483400
+vn 0.575500 -0.653400 0.491700
+vn 0.581800 -0.626700 0.518400
+vn 0.601300 -0.643100 0.474100
+vn 0.607800 -0.615200 0.502000
+vn 0.566800 -0.680000 0.465200
+vn 0.592200 -0.670800 0.446400
+vn 0.585500 -0.599700 0.545300
+vn 0.611700 -0.587000 0.530200
+vn 0.517300 -0.737400 0.434300
+vn 0.530200 -0.713200 0.458500
+vn 0.504100 -0.719600 0.477500
+vn 0.491900 -0.742600 0.454500
+vn 0.477500 -0.765000 0.432100
+vn 0.502200 -0.760900 0.410800
+vn 0.461100 -0.786800 0.410300
+vn 0.484900 -0.783800 0.387900
+vn 0.526300 -0.756000 0.389100
+vn 0.542100 -0.731300 0.413800
+vn 0.549900 -0.750300 0.366900
+vn 0.566400 -0.724500 0.392700
+vn 0.508200 -0.780000 0.365100
+vn 0.530900 -0.775400 0.341900
+vn 0.555600 -0.706000 0.439100
+vn 0.580500 -0.698000 0.419200
+vn 0.444200 -0.826900 0.344800
+vn 0.465500 -0.805900 0.365900
+vn 0.442600 -0.807700 0.389400
+vn 0.422400 -0.827700 0.369400
+vn 0.400300 -0.846700 0.350400
+vn 0.421000 -0.846900 0.324800
+vn 0.376400 -0.864700 0.332300
+vn 0.395900 -0.865800 0.305900
+vn 0.441200 -0.846100 0.299000
+vn 0.465500 -0.825100 0.320000
+vn 0.461000 -0.844400 0.272800
+vn 0.486400 -0.822500 0.294700
+vn 0.414900 -0.866000 0.279200
+vn 0.433500 -0.865100 0.252100
+vn 0.487800 -0.803100 0.342000
+vn 0.509700 -0.799500 0.317700
+vn 0.340800 -0.900000 0.271700
+vn 0.369100 -0.883600 0.288200
+vn 0.351000 -0.881600 0.315500
+vn 0.324100 -0.897200 0.299900
+vn 0.295800 -0.911500 0.285600
+vn 0.311100 -0.915000 0.256700
+vn 0.266200 -0.924600 0.272500
+vn 0.279900 -0.928700 0.243000
+vn 0.326100 -0.917500 0.227600
+vn 0.357200 -0.901700 0.243400
+vn 0.340700 -0.919000 0.198200
+vn 0.373200 -0.902600 0.214700
+vn 0.293400 -0.931900 0.213200
+vn 0.306500 -0.934000 0.183200
+vn 0.386800 -0.884500 0.260500
+vn 0.404200 -0.884600 0.232600
+vn 0.214300 -0.951600 0.220100
+vn 0.247600 -0.941000 0.230800
+vn 0.235400 -0.936200 0.260900
+vn 0.203700 -0.946300 0.250700
+vn 0.171200 -0.955000 0.242100
+vn 0.180000 -0.960800 0.211000
+vn 0.137800 -0.962200 0.234900
+vn 0.144900 -0.968300 0.203400
+vn 0.188700 -0.965500 0.179700
+vn 0.224600 -0.955900 0.189200
+vn 0.197100 -0.969100 0.148100
+vn 0.234600 -0.959100 0.158100
+vn 0.151900 -0.973400 0.171800
+vn 0.158700 -0.977400 0.139900
+vn 0.259400 -0.944700 0.200400
+vn 0.271100 -0.947400 0.169800
+vn 0.073100 -0.978400 0.193300
+vn 0.109100 -0.974200 0.197500
+vn 0.103800 -0.967800 0.229300
+vn 0.069500 -0.971800 0.225300
+vn 0.034900 -0.974200 0.222900
+vn 0.036700 -0.980900 0.190800
+vn 0.000000 -0.975000 0.222100
+vn 0.000000 -0.981800 0.189900
+vn 0.038500 -0.986600 0.158500
+vn 0.076600 -0.983900 0.161200
+vn 0.040200 -0.991200 0.126000
+vn 0.080000 -0.988400 0.128800
+vn 0.000000 -0.987500 0.157600
+vn 0.000000 -0.992100 0.125100
+vn 0.114400 -0.979500 0.165600
+vn 0.119500 -0.983800 0.133400
+vn -0.073100 -0.978400 0.193300
+vn -0.036700 -0.980900 0.190800
+vn -0.034900 -0.974200 0.222900
+vn -0.069500 -0.971800 0.225300
+vn -0.103800 -0.967800 0.229300
+vn -0.109100 -0.974200 0.197500
+vn -0.137800 -0.962200 0.234900
+vn -0.144900 -0.968300 0.203400
+vn -0.114400 -0.979500 0.165600
+vn -0.076600 -0.983900 0.161200
+vn -0.119500 -0.983800 0.133400
+vn -0.080000 -0.988400 0.128800
+vn -0.151900 -0.973400 0.171800
+vn -0.158700 -0.977400 0.139900
+vn -0.038500 -0.986600 0.158500
+vn -0.040200 -0.991200 0.126000
+vn -0.214300 -0.951600 0.220100
+vn -0.180000 -0.960800 0.211000
+vn -0.171200 -0.955000 0.242100
+vn -0.203700 -0.946300 0.250700
+vn -0.235400 -0.936200 0.260900
+vn -0.247600 -0.941000 0.230800
+vn -0.266200 -0.924600 0.272500
+vn -0.279900 -0.928700 0.243000
+vn -0.259400 -0.944700 0.200400
+vn -0.224600 -0.955900 0.189200
+vn -0.271100 -0.947400 0.169800
+vn -0.234600 -0.959100 0.158100
+vn -0.293400 -0.931900 0.213200
+vn -0.306500 -0.934000 0.183200
+vn -0.188700 -0.965500 0.179700
+vn -0.197100 -0.969100 0.148100
+vn -0.340800 -0.900000 0.271700
+vn -0.311100 -0.915000 0.256700
+vn -0.295800 -0.911500 0.285600
+vn -0.324100 -0.897200 0.299900
+vn -0.351000 -0.881600 0.315500
+vn -0.369100 -0.883600 0.288200
+vn -0.376400 -0.864700 0.332300
+vn -0.395900 -0.865800 0.305900
+vn -0.386800 -0.884500 0.260500
+vn -0.357200 -0.901700 0.243400
+vn -0.404200 -0.884600 0.232600
+vn -0.373200 -0.902600 0.214700
+vn -0.414900 -0.866000 0.279200
+vn -0.433500 -0.865200 0.252100
+vn -0.326100 -0.917500 0.227600
+vn -0.340700 -0.919000 0.198200
+vn -0.444200 -0.826900 0.344800
+vn -0.421000 -0.846900 0.324800
+vn -0.400300 -0.846700 0.350400
+vn -0.422400 -0.827700 0.369400
+vn -0.442600 -0.807700 0.389400
+vn -0.465500 -0.805900 0.365900
+vn -0.461100 -0.786800 0.410300
+vn -0.484900 -0.783800 0.387900
+vn -0.487800 -0.803100 0.342000
+vn -0.465500 -0.825200 0.320000
+vn -0.509700 -0.799500 0.317700
+vn -0.486400 -0.822500 0.294700
+vn -0.508200 -0.780000 0.365100
+vn -0.530900 -0.775400 0.341900
+vn -0.441200 -0.846100 0.299000
+vn -0.461000 -0.844400 0.272800
+vn -0.517300 -0.737400 0.434300
+vn -0.502200 -0.760900 0.410800
+vn -0.477500 -0.765000 0.432100
+vn -0.491900 -0.742600 0.454500
+vn -0.504100 -0.719600 0.477500
+vn -0.530200 -0.713200 0.458500
+vn -0.514200 -0.696000 0.501100
+vn -0.540800 -0.688300 0.483400
+vn -0.555600 -0.706000 0.439100
+vn -0.542100 -0.731300 0.413800
+vn -0.580500 -0.698000 0.419200
+vn -0.566400 -0.724500 0.392700
+vn -0.566800 -0.680000 0.465200
+vn -0.592200 -0.670800 0.446400
+vn -0.526300 -0.756000 0.389100
+vn -0.549900 -0.750300 0.366900
+vn -0.555100 -0.637500 0.534200
+vn -0.549200 -0.663000 0.508700
+vn -0.522200 -0.671900 0.525200
+vn -0.527800 -0.647700 0.549400
+vn -0.531200 -0.623200 0.573900
+vn -0.558700 -0.611800 0.559900
+vn -0.532400 -0.598500 0.598500
+vn -0.559900 -0.585900 0.585900
+vn -0.585500 -0.599700 0.545400
+vn -0.581800 -0.626700 0.518400
+vn -0.611700 -0.587000 0.530200
+vn -0.607800 -0.615200 0.502000
+vn -0.586800 -0.572600 0.572600
+vn -0.613100 -0.558600 0.558600
+vn -0.575500 -0.653400 0.491700
+vn -0.601300 -0.643100 0.474100
+vn -0.555100 -0.534200 0.637500
+vn -0.558700 -0.559900 0.611800
+vn -0.531200 -0.573900 0.623200
+vn -0.527800 -0.549400 0.647700
+vn -0.522200 -0.525200 0.671900
+vn -0.549200 -0.508700 0.663000
+vn -0.575500 -0.491700 0.653400
+vn -0.581800 -0.518400 0.626700
+vn -0.601300 -0.474100 0.643100
+vn -0.607800 -0.502000 0.615200
+vn -0.585500 -0.545300 0.599700
+vn -0.611700 -0.530200 0.587000
+vn -0.613000 -0.349500 0.708500
+vn -0.628300 -0.378100 0.679900
+vn -0.604700 -0.398900 0.689300
+vn -0.590000 -0.371300 0.716900
+vn -0.640900 -0.407600 0.650400
+vn -0.616900 -0.427200 0.661000
+vn -0.572800 -0.344400 0.743800
+vn -0.595100 -0.321500 0.736500
+vn -0.553100 -0.318300 0.769900
+vn -0.574600 -0.294400 0.763600
+vn -0.616700 -0.298400 0.728400
+vn -0.635300 -0.327300 0.699500
+vn -0.637700 -0.274800 0.719500
+vn -0.656900 -0.304800 0.689600
+vn -0.595500 -0.270200 0.756500
+vn -0.615800 -0.245800 0.748600
+vn -0.651100 -0.357000 0.669700
+vn -0.664200 -0.387500 0.639200
+vn -0.673300 -0.335500 0.658900
+vn -0.686800 -0.367000 0.627300
+vn -0.526400 -0.243400 0.814600
+vn -0.551600 -0.268300 0.789700
+vn -0.531000 -0.293100 0.795000
+vn -0.506700 -0.269200 0.819000
+vn -0.480200 -0.246400 0.841800
+vn -0.498900 -0.219700 0.838300
+vn -0.451600 -0.224800 0.863400
+vn -0.469200 -0.197200 0.860800
+vn -0.517000 -0.192800 0.833900
+vn -0.545500 -0.217400 0.809400
+vn -0.534700 -0.165700 0.828600
+vn -0.564100 -0.191100 0.803200
+vn -0.486200 -0.169600 0.857200
+vn -0.502800 -0.141700 0.852700
+vn -0.571700 -0.243200 0.783600
+vn -0.591100 -0.217800 0.776600
+vn -0.403900 -0.156800 0.901200
+vn -0.437400 -0.176200 0.881800
+vn -0.421000 -0.204500 0.883700
+vn -0.388800 -0.185800 0.902400
+vn -0.354900 -0.168600 0.919600
+vn -0.368700 -0.139000 0.919100
+vn -0.319300 -0.153000 0.935200
+vn -0.331700 -0.122700 0.935300
+vn -0.382100 -0.109100 0.917600
+vn -0.418600 -0.127600 0.899100
+vn -0.395100 -0.079200 0.915200
+vn -0.432800 -0.098300 0.896100
+vn -0.343800 -0.092300 0.934500
+vn -0.355500 -0.061700 0.932600
+vn -0.453300 -0.147700 0.879000
+vn -0.468700 -0.119100 0.875200
+vn -0.253900 -0.095600 0.962500
+vn -0.293400 -0.108200 0.949800
+vn -0.282400 -0.139000 0.949200
+vn -0.244400 -0.126900 0.961300
+vn -0.205400 -0.116500 0.971700
+vn -0.213400 -0.084700 0.973300
+vn -0.165300 -0.107900 0.980300
+vn -0.171700 -0.075800 0.982200
+vn -0.221100 -0.052900 0.973800
+vn -0.263100 -0.064100 0.962600
+vn -0.228600 -0.021100 0.973300
+vn -0.272100 -0.032700 0.961700
+vn -0.178000 -0.043700 0.983100
+vn -0.184000 -0.011500 0.982800
+vn -0.304000 -0.077200 0.949500
+vn -0.314400 -0.046200 0.948100
+vn -0.086600 -0.063800 0.994200
+vn -0.129300 -0.068800 0.989200
+vn -0.124500 -0.101200 0.987000
+vn -0.083300 -0.096300 0.991800
+vn -0.041800 -0.093400 0.994700
+vn -0.043500 -0.060900 0.997200
+vn 0.000000 -0.092500 0.995700
+vn 0.000000 -0.059800 0.998200
+vn -0.045000 -0.028200 0.998600
+vn -0.089800 -0.031300 0.995500
+vn -0.046600 0.004500 0.998900
+vn -0.092800 0.001300 0.995700
+vn 0.000000 -0.027100 0.999600
+vn 0.000000 0.005600 1.000000
+vn -0.134000 -0.036500 0.990300
+vn -0.138600 -0.004000 0.990300
+vn 0.086600 -0.063800 0.994200
+vn 0.043500 -0.060900 0.997200
+vn 0.041800 -0.093400 0.994700
+vn 0.083300 -0.096300 0.991800
+vn 0.124500 -0.101200 0.987000
+vn 0.129300 -0.068800 0.989200
+vn 0.165300 -0.107900 0.980300
+vn 0.171700 -0.075800 0.982200
+vn 0.134000 -0.036500 0.990300
+vn 0.089800 -0.031300 0.995500
+vn 0.138600 -0.004000 0.990300
+vn 0.092800 0.001300 0.995700
+vn 0.178000 -0.043700 0.983100
+vn 0.184000 -0.011500 0.982800
+vn 0.045000 -0.028200 0.998600
+vn 0.046600 0.004500 0.998900
+vn 0.253900 -0.095600 0.962500
+vn 0.213400 -0.084700 0.973300
+vn 0.205400 -0.116500 0.971700
+vn 0.244400 -0.126900 0.961300
+vn 0.282400 -0.139000 0.949200
+vn 0.293400 -0.108200 0.949800
+vn 0.319300 -0.153000 0.935200
+vn 0.331700 -0.122700 0.935300
+vn 0.304000 -0.077200 0.949500
+vn 0.263100 -0.064100 0.962600
+vn 0.314400 -0.046200 0.948100
+vn 0.272100 -0.032700 0.961700
+vn 0.343800 -0.092300 0.934500
+vn 0.355500 -0.061700 0.932600
+vn 0.221100 -0.052900 0.973800
+vn 0.228600 -0.021100 0.973300
+vn 0.403900 -0.156800 0.901200
+vn 0.368700 -0.139000 0.919100
+vn 0.354900 -0.168600 0.919600
+vn 0.388800 -0.185800 0.902400
+vn 0.421000 -0.204500 0.883700
+vn 0.437400 -0.176200 0.881800
+vn 0.451600 -0.224800 0.863400
+vn 0.469200 -0.197200 0.860800
+vn 0.453300 -0.147700 0.879000
+vn 0.418600 -0.127600 0.899100
+vn 0.468700 -0.119100 0.875200
+vn 0.432800 -0.098300 0.896100
+vn 0.486200 -0.169600 0.857200
+vn 0.502800 -0.141700 0.852700
+vn 0.382100 -0.109100 0.917600
+vn 0.395100 -0.079200 0.915200
+vn 0.526400 -0.243400 0.814600
+vn 0.498900 -0.219700 0.838300
+vn 0.480200 -0.246400 0.841800
+vn 0.506700 -0.269200 0.819000
+vn 0.531000 -0.293100 0.795000
+vn 0.551600 -0.268300 0.789700
+vn 0.553100 -0.318300 0.769900
+vn 0.574600 -0.294400 0.763600
+vn 0.571700 -0.243200 0.783600
+vn 0.545500 -0.217400 0.809400
+vn 0.591100 -0.217800 0.776600
+vn 0.564100 -0.191100 0.803200
+vn 0.595500 -0.270200 0.756500
+vn 0.615800 -0.245800 0.748600
+vn 0.517000 -0.192800 0.833900
+vn 0.534700 -0.165700 0.828600
+vn 0.613000 -0.349500 0.708500
+vn 0.595100 -0.321500 0.736500
+vn 0.572800 -0.344400 0.743800
+vn 0.590000 -0.371300 0.716900
+vn 0.604700 -0.398900 0.689300
+vn 0.628300 -0.378100 0.679900
+vn 0.616900 -0.427200 0.661000
+vn 0.640900 -0.407600 0.650400
+vn 0.651100 -0.357000 0.669700
+vn 0.635300 -0.327300 0.699500
+vn 0.673300 -0.335500 0.658900
+vn 0.656900 -0.304800 0.689600
+vn 0.664200 -0.387500 0.639200
+vn 0.686800 -0.367000 0.627300
+vn 0.616700 -0.298400 0.728400
+vn 0.637700 -0.274800 0.719500
+vn 0.657800 -0.467800 0.590300
+vn 0.650800 -0.437500 0.620500
+vn 0.626400 -0.456000 0.632100
+vn 0.633200 -0.485200 0.603000
+vn 0.637300 -0.514500 0.573700
+vn 0.662100 -0.498200 0.559800
+vn 0.638700 -0.544100 0.544100
+vn 0.663500 -0.529000 0.529000
+vn 0.686100 -0.481500 0.545200
+vn 0.681800 -0.449900 0.576800
+vn 0.709500 -0.464200 0.530100
+vn 0.704900 -0.431600 0.562800
+vn 0.687600 -0.513400 0.513400
+vn 0.711000 -0.497200 0.497200
+vn 0.674400 -0.418600 0.608200
+vn 0.697400 -0.399200 0.595200
+vn 0.657800 -0.590300 0.467800
+vn 0.662100 -0.559800 0.498200
+vn 0.637300 -0.573700 0.514500
+vn 0.633200 -0.603000 0.485200
+vn 0.626400 -0.632100 0.456000
+vn 0.650800 -0.620500 0.437500
+vn 0.616900 -0.661000 0.427200
+vn 0.640900 -0.650400 0.407600
+vn 0.674400 -0.608200 0.418600
+vn 0.681800 -0.576800 0.449900
+vn 0.697400 -0.595200 0.399200
+vn 0.704900 -0.562800 0.431600
+vn 0.664200 -0.639200 0.387500
+vn 0.686800 -0.627300 0.367000
+vn 0.686100 -0.545200 0.481500
+vn 0.709500 -0.530100 0.464200
+vn 0.613000 -0.708500 0.349500
+vn 0.628300 -0.679900 0.378100
+vn 0.604700 -0.689300 0.398900
+vn 0.590000 -0.716900 0.371300
+vn 0.572800 -0.743800 0.344400
+vn 0.595100 -0.736500 0.321500
+vn 0.553100 -0.769900 0.318300
+vn 0.574600 -0.763600 0.294400
+vn 0.616700 -0.728400 0.298400
+vn 0.635300 -0.699500 0.327300
+vn 0.637700 -0.719500 0.274800
+vn 0.656900 -0.689600 0.304800
+vn 0.595500 -0.756500 0.270200
+vn 0.615800 -0.748600 0.245800
+vn 0.651100 -0.669700 0.357000
+vn 0.673300 -0.658900 0.335500
+vn 0.526400 -0.814600 0.243400
+vn 0.551600 -0.789700 0.268300
+vn 0.531000 -0.795000 0.293100
+vn 0.506700 -0.819000 0.269200
+vn 0.480200 -0.841800 0.246400
+vn 0.498900 -0.838300 0.219700
+vn 0.451600 -0.863400 0.224800
+vn 0.469200 -0.860800 0.197200
+vn 0.517000 -0.833900 0.192800
+vn 0.545500 -0.809400 0.217400
+vn 0.534700 -0.828600 0.165700
+vn 0.564100 -0.803200 0.191100
+vn 0.486200 -0.857200 0.169600
+vn 0.502800 -0.852700 0.141700
+vn 0.571700 -0.783600 0.243200
+vn 0.591100 -0.776600 0.217800
+vn 0.403900 -0.901200 0.156800
+vn 0.437400 -0.881800 0.176200
+vn 0.421000 -0.883700 0.204500
+vn 0.388800 -0.902400 0.185800
+vn 0.354900 -0.919600 0.168600
+vn 0.368700 -0.919100 0.139000
+vn 0.319300 -0.935200 0.153000
+vn 0.331700 -0.935300 0.122700
+vn 0.382100 -0.917600 0.109100
+vn 0.418600 -0.899100 0.127600
+vn 0.395100 -0.915200 0.079200
+vn 0.432800 -0.896100 0.098300
+vn 0.343800 -0.934500 0.092300
+vn 0.355500 -0.932600 0.061800
+vn 0.453300 -0.879000 0.147700
+vn 0.468700 -0.875200 0.119100
+vn 0.253900 -0.962500 0.095600
+vn 0.293400 -0.949800 0.108200
+vn 0.282400 -0.949200 0.139000
+vn 0.244400 -0.961300 0.126900
+vn 0.205400 -0.971700 0.116500
+vn 0.213400 -0.973300 0.084700
+vn 0.165300 -0.980300 0.107900
+vn 0.171700 -0.982200 0.075800
+vn 0.221100 -0.973800 0.052900
+vn 0.263100 -0.962600 0.064100
+vn 0.228600 -0.973300 0.021100
+vn 0.272100 -0.961700 0.032700
+vn 0.178000 -0.983100 0.043700
+vn 0.184000 -0.982800 0.011500
+vn 0.304000 -0.949500 0.077200
+vn 0.314400 -0.948100 0.046200
+vn 0.086600 -0.994200 0.063800
+vn 0.129300 -0.989200 0.068800
+vn 0.124500 -0.987000 0.101200
+vn 0.083300 -0.991800 0.096300
+vn 0.041800 -0.994700 0.093400
+vn 0.043500 -0.997200 0.060900
+vn 0.000000 -0.995700 0.092500
+vn 0.000000 -0.998200 0.059800
+vn 0.045000 -0.998600 0.028200
+vn 0.089800 -0.995500 0.031300
+vn 0.046600 -0.998900 -0.004500
+vn 0.092800 -0.995700 -0.001300
+vn 0.000000 -0.999600 0.027100
+vn 0.000000 -1.000000 -0.005600
+vn 0.134000 -0.990300 0.036500
+vn 0.138600 -0.990300 0.004000
+vn -0.086600 -0.994200 0.063800
+vn -0.043500 -0.997200 0.060900
+vn -0.041800 -0.994700 0.093400
+vn -0.083300 -0.991800 0.096300
+vn -0.124500 -0.987000 0.101200
+vn -0.129300 -0.989200 0.068800
+vn -0.165300 -0.980300 0.107900
+vn -0.171700 -0.982200 0.075800
+vn -0.134000 -0.990300 0.036500
+vn -0.089800 -0.995500 0.031300
+vn -0.138600 -0.990300 0.004000
+vn -0.092800 -0.995700 -0.001300
+vn -0.178000 -0.983100 0.043700
+vn -0.184000 -0.982800 0.011500
+vn -0.045000 -0.998600 0.028200
+vn -0.046600 -0.998900 -0.004500
+vn -0.253900 -0.962500 0.095600
+vn -0.213400 -0.973300 0.084700
+vn -0.205400 -0.971700 0.116500
+vn -0.244400 -0.961300 0.126900
+vn -0.282400 -0.949200 0.139000
+vn -0.293400 -0.949800 0.108200
+vn -0.319300 -0.935200 0.153000
+vn -0.331700 -0.935300 0.122700
+vn -0.304000 -0.949500 0.077200
+vn -0.263100 -0.962600 0.064100
+vn -0.314400 -0.948100 0.046200
+vn -0.272100 -0.961700 0.032700
+vn -0.343800 -0.934500 0.092300
+vn -0.355500 -0.932600 0.061800
+vn -0.221100 -0.973800 0.052900
+vn -0.228600 -0.973300 0.021100
+vn -0.403900 -0.901200 0.156800
+vn -0.368700 -0.919100 0.139000
+vn -0.354900 -0.919600 0.168600
+vn -0.388800 -0.902400 0.185800
+vn -0.421000 -0.883700 0.204500
+vn -0.437400 -0.881800 0.176200
+vn -0.451600 -0.863400 0.224800
+vn -0.469200 -0.860800 0.197200
+vn -0.453300 -0.879000 0.147700
+vn -0.418600 -0.899100 0.127600
+vn -0.468700 -0.875200 0.119100
+vn -0.432800 -0.896100 0.098300
+vn -0.486200 -0.857200 0.169600
+vn -0.502800 -0.852700 0.141700
+vn -0.382100 -0.917600 0.109100
+vn -0.395100 -0.915200 0.079200
+vn -0.526400 -0.814600 0.243400
+vn -0.498900 -0.838300 0.219700
+vn -0.480200 -0.841800 0.246400
+vn -0.506700 -0.819000 0.269200
+vn -0.531000 -0.795000 0.293100
+vn -0.551600 -0.789700 0.268300
+vn -0.553100 -0.769900 0.318300
+vn -0.574600 -0.763600 0.294400
+vn -0.571700 -0.783600 0.243200
+vn -0.545500 -0.809400 0.217400
+vn -0.591100 -0.776600 0.217800
+vn -0.564100 -0.803200 0.191100
+vn -0.595500 -0.756500 0.270200
+vn -0.615800 -0.748600 0.245800
+vn -0.517000 -0.833900 0.192800
+vn -0.534700 -0.828600 0.165700
+vn -0.613000 -0.708500 0.349500
+vn -0.595100 -0.736500 0.321500
+vn -0.572800 -0.743800 0.344400
+vn -0.590000 -0.716900 0.371300
+vn -0.604700 -0.689300 0.398900
+vn -0.628300 -0.679900 0.378100
+vn -0.616900 -0.661000 0.427200
+vn -0.640900 -0.650400 0.407600
+vn -0.651100 -0.669700 0.357000
+vn -0.635300 -0.699500 0.327300
+vn -0.673300 -0.658900 0.335500
+vn -0.656900 -0.689600 0.304800
+vn -0.664200 -0.639200 0.387500
+vn -0.686800 -0.627300 0.367000
+vn -0.616800 -0.728400 0.298400
+vn -0.637700 -0.719500 0.274800
+vn -0.657800 -0.590300 0.467800
+vn -0.650800 -0.620500 0.437500
+vn -0.626400 -0.632100 0.456000
+vn -0.633200 -0.603000 0.485200
+vn -0.637300 -0.573700 0.514500
+vn -0.662100 -0.559800 0.498200
+vn -0.638700 -0.544100 0.544100
+vn -0.663500 -0.529000 0.529000
+vn -0.686100 -0.545200 0.481500
+vn -0.681800 -0.576800 0.449900
+vn -0.709500 -0.530100 0.464200
+vn -0.704900 -0.562800 0.431600
+vn -0.687600 -0.513400 0.513400
+vn -0.711000 -0.497200 0.497200
+vn -0.674400 -0.608200 0.418600
+vn -0.697400 -0.595200 0.399200
+vn -0.657800 -0.467800 0.590300
+vn -0.662100 -0.498200 0.559800
+vn -0.637300 -0.514500 0.573700
+vn -0.633200 -0.485200 0.603000
+vn -0.626400 -0.456000 0.632100
+vn -0.650800 -0.437500 0.620500
+vn -0.674400 -0.418600 0.608200
+vn -0.681800 -0.449900 0.576800
+vn -0.697400 -0.399200 0.595200
+vn -0.704900 -0.431600 0.562800
+vn -0.686100 -0.481500 0.545200
+vn -0.709500 -0.464200 0.530100
+vn -0.698000 -0.258800 0.667700
+vn -0.715300 -0.291500 0.635100
+vn -0.694700 -0.313600 0.647300
+vn -0.677800 -0.281900 0.679000
+vn -0.729700 -0.325000 0.601500
+vn -0.708700 -0.346200 0.614700
+vn -0.658000 -0.251100 0.709900
+vn -0.677600 -0.227100 0.699500
+vn -0.635400 -0.221100 0.739900
+vn -0.654300 -0.196200 0.730400
+vn -0.696400 -0.202800 0.688300
+vn -0.717300 -0.235500 0.655700
+vn -0.714500 -0.178400 0.676500
+vn -0.736000 -0.211900 0.643000
+vn -0.672400 -0.171100 0.720100
+vn -0.689900 -0.145800 0.709100
+vn -0.735200 -0.269000 0.622200
+vn -0.750000 -0.303500 0.587700
+vn -0.754300 -0.246300 0.608600
+vn -0.769500 -0.281600 0.573200
+vn -0.599400 -0.138100 0.788500
+vn -0.628100 -0.166400 0.760100
+vn -0.609900 -0.192200 0.768800
+vn -0.582000 -0.164600 0.796300
+vn -0.551700 -0.138500 0.822500
+vn -0.568000 -0.111100 0.815400
+vn -0.518800 -0.113600 0.847300
+vn -0.534200 -0.085500 0.841000
+vn -0.583800 -0.083700 0.807500
+vn -0.616000 -0.111400 0.779800
+vn -0.599000 -0.056100 0.798800
+vn -0.632000 -0.084500 0.770300
+vn -0.549000 -0.057400 0.833800
+vn -0.563300 -0.029100 0.825700
+vn -0.645500 -0.140500 0.750700
+vn -0.662300 -0.114400 0.740400
+vn -0.459900 -0.039500 0.887100
+vn -0.498000 -0.061600 0.865000
+vn -0.483700 -0.090400 0.870600
+vn -0.446600 -0.068900 0.892100
+vn -0.407700 -0.049100 0.911800
+vn -0.419800 -0.019100 0.907400
+vn -0.366800 -0.031200 0.929700
+vn -0.377700 -0.000600 0.925900
+vn -0.431400 0.010800 0.902000
+vn -0.472700 -0.010000 0.881200
+vn -0.442600 0.040900 0.895700
+vn -0.484900 0.019400 0.874300
+vn -0.388200 0.029800 0.921100
+vn -0.398300 0.060400 0.915300
+vn -0.511900 -0.032700 0.858400
+vn -0.525100 -0.003900 0.851000
+vn -0.289100 0.030200 0.956800
+vn -0.334000 0.015800 0.942400
+vn -0.324400 -0.015100 0.945800
+vn -0.280700 -0.001200 0.959700
+vn -0.235900 0.010700 0.971700
+vn -0.242900 0.042500 0.969100
+vn -0.189900 0.020600 0.981600
+vn -0.195500 0.052700 0.979300
+vn -0.249700 0.074300 0.965500
+vn -0.297100 0.061600 0.952800
+vn -0.256100 0.105900 0.960800
+vn -0.304800 0.093000 0.947800
+vn -0.200900 0.084700 0.975900
+vn -0.206200 0.116600 0.971500
+vn -0.343300 0.046800 0.938000
+vn -0.352200 0.077800 0.932600
+vn -0.098600 0.066300 0.992900
+vn -0.147300 0.060600 0.987200
+vn -0.143000 0.028400 0.989300
+vn -0.095700 0.033800 0.994800
+vn -0.048100 0.037200 0.998100
+vn -0.049500 0.069800 0.996300
+vn 0.000000 0.038300 0.999200
+vn 0.000000 0.070900 0.997500
+vn -0.050900 0.102200 0.993400
+vn -0.101300 0.098700 0.989900
+vn -0.052200 0.134600 0.989500
+vn -0.104000 0.131000 0.985900
+vn 0.000000 0.103400 0.994600
+vn 0.000000 0.135800 0.990700
+vn -0.151300 0.092900 0.984100
+vn -0.155300 0.125000 0.979900
+vn 0.098600 0.066300 0.992900
+vn 0.049500 0.069800 0.996300
+vn 0.048100 0.037200 0.998100
+vn 0.095700 0.033800 0.994800
+vn 0.143000 0.028300 0.989300
+vn 0.147300 0.060600 0.987200
+vn 0.189900 0.020600 0.981600
+vn 0.195500 0.052700 0.979300
+vn 0.151300 0.092900 0.984100
+vn 0.101300 0.098700 0.989900
+vn 0.155300 0.125000 0.979900
+vn 0.104000 0.131000 0.985900
+vn 0.200900 0.084700 0.975900
+vn 0.206200 0.116600 0.971500
+vn 0.050900 0.102200 0.993400
+vn 0.052200 0.134600 0.989500
+vn 0.289100 0.030200 0.956800
+vn 0.242900 0.042500 0.969100
+vn 0.235900 0.010700 0.971700
+vn 0.280700 -0.001200 0.959700
+vn 0.324400 -0.015100 0.945800
+vn 0.334000 0.015800 0.942400
+vn 0.366800 -0.031200 0.929700
+vn 0.377700 -0.000600 0.925900
+vn 0.343300 0.046800 0.938000
+vn 0.297100 0.061600 0.952800
+vn 0.352200 0.077800 0.932600
+vn 0.304800 0.093000 0.947800
+vn 0.388200 0.029800 0.921100
+vn 0.398300 0.060400 0.915300
+vn 0.249700 0.074300 0.965500
+vn 0.256100 0.105900 0.960800
+vn 0.459900 -0.039500 0.887100
+vn 0.419800 -0.019100 0.907400
+vn 0.407700 -0.049200 0.911800
+vn 0.446600 -0.068900 0.892100
+vn 0.483700 -0.090400 0.870600
+vn 0.498000 -0.061600 0.865000
+vn 0.518800 -0.113600 0.847300
+vn 0.534200 -0.085500 0.841000
+vn 0.511900 -0.032700 0.858400
+vn 0.472700 -0.010000 0.881200
+vn 0.525100 -0.003900 0.851000
+vn 0.484900 0.019400 0.874300
+vn 0.549000 -0.057400 0.833800
+vn 0.563300 -0.029100 0.825700
+vn 0.431400 0.010800 0.902000
+vn 0.442600 0.040900 0.895700
+vn 0.599400 -0.138100 0.788500
+vn 0.568000 -0.111100 0.815400
+vn 0.551700 -0.138500 0.822500
+vn 0.582000 -0.164600 0.796300
+vn 0.609900 -0.192200 0.768800
+vn 0.628100 -0.166400 0.760100
+vn 0.635400 -0.221100 0.739900
+vn 0.654300 -0.196200 0.730400
+vn 0.645500 -0.140500 0.750700
+vn 0.616000 -0.111400 0.779800
+vn 0.662300 -0.114400 0.740400
+vn 0.632000 -0.084500 0.770300
+vn 0.672400 -0.171100 0.720100
+vn 0.689900 -0.145800 0.709100
+vn 0.583800 -0.083700 0.807500
+vn 0.599000 -0.056100 0.798800
+vn 0.698000 -0.258800 0.667700
+vn 0.677600 -0.227100 0.699500
+vn 0.658000 -0.251100 0.709900
+vn 0.677800 -0.281900 0.679000
+vn 0.694700 -0.313600 0.647300
+vn 0.715300 -0.291500 0.635100
+vn 0.708700 -0.346200 0.614700
+vn 0.729700 -0.325000 0.601500
+vn 0.735200 -0.269000 0.622200
+vn 0.717300 -0.235500 0.655700
+vn 0.754300 -0.246300 0.608600
+vn 0.736000 -0.211900 0.643000
+vn 0.750000 -0.303500 0.587700
+vn 0.769500 -0.281600 0.573200
+vn 0.696400 -0.202800 0.688300
+vn 0.714500 -0.178400 0.676500
+vn 0.749000 -0.393500 0.533000
+vn 0.741000 -0.359100 0.567400
+vn 0.719600 -0.379300 0.581600
+vn 0.727400 -0.412800 0.548200
+vn 0.732100 -0.446500 0.514500
+vn 0.753800 -0.428300 0.498300
+vn 0.733700 -0.480500 0.480500
+vn 0.755500 -0.463300 0.463300
+vn 0.774800 -0.409600 0.481600
+vn 0.769800 -0.373900 0.517300
+vn 0.794900 -0.390500 0.464300
+vn 0.789800 -0.353900 0.501000
+vn 0.776400 -0.445600 0.445600
+vn 0.796600 -0.427400 0.427400
+vn 0.761500 -0.338500 0.552600
+vn 0.781300 -0.317600 0.537200
+vn 0.749000 -0.533000 0.393500
+vn 0.753800 -0.498300 0.428300
+vn 0.732100 -0.514500 0.446500
+vn 0.727400 -0.548200 0.412800
+vn 0.719600 -0.581600 0.379300
+vn 0.741000 -0.567400 0.359100
+vn 0.708700 -0.614700 0.346200
+vn 0.729700 -0.601500 0.325000
+vn 0.761500 -0.552600 0.338500
+vn 0.769800 -0.517300 0.373900
+vn 0.781300 -0.537200 0.317600
+vn 0.789800 -0.501000 0.353900
+vn 0.750000 -0.587700 0.303500
+vn 0.769500 -0.573200 0.281600
+vn 0.774800 -0.481600 0.409600
+vn 0.794900 -0.464300 0.390500
+vn 0.698000 -0.667700 0.258800
+vn 0.715300 -0.635100 0.291500
+vn 0.694700 -0.647300 0.313600
+vn 0.677800 -0.679000 0.281900
+vn 0.658000 -0.709900 0.251100
+vn 0.677600 -0.699500 0.227100
+vn 0.635400 -0.739900 0.221100
+vn 0.654300 -0.730400 0.196200
+vn 0.696400 -0.688300 0.202800
+vn 0.717300 -0.655700 0.235500
+vn 0.714500 -0.676500 0.178400
+vn 0.736000 -0.643000 0.211900
+vn 0.672400 -0.720100 0.171100
+vn 0.689900 -0.709100 0.145800
+vn 0.735200 -0.622200 0.269000
+vn 0.754300 -0.608600 0.246300
+vn 0.599400 -0.788500 0.138100
+vn 0.628100 -0.760100 0.166400
+vn 0.609900 -0.768800 0.192200
+vn 0.582000 -0.796300 0.164600
+vn 0.551700 -0.822500 0.138500
+vn 0.568000 -0.815400 0.111100
+vn 0.518800 -0.847300 0.113600
+vn 0.534200 -0.841000 0.085500
+vn 0.583800 -0.807500 0.083700
+vn 0.616000 -0.779800 0.111400
+vn 0.599000 -0.798800 0.056100
+vn 0.632000 -0.770300 0.084500
+vn 0.549000 -0.833800 0.057400
+vn 0.563300 -0.825700 0.029100
+vn 0.645500 -0.750700 0.140500
+vn 0.662300 -0.740400 0.114400
+vn 0.459900 -0.887100 0.039500
+vn 0.498000 -0.865000 0.061600
+vn 0.483700 -0.870600 0.090400
+vn 0.446600 -0.892100 0.068900
+vn 0.407700 -0.911800 0.049100
+vn 0.419800 -0.907400 0.019100
+vn 0.366800 -0.929700 0.031200
+vn 0.377700 -0.925900 0.000600
+vn 0.431400 -0.902000 -0.010800
+vn 0.472700 -0.881200 0.010000
+vn 0.442600 -0.895700 -0.040900
+vn 0.484900 -0.874300 -0.019400
+vn 0.388200 -0.921100 -0.029800
+vn 0.398300 -0.915300 -0.060400
+vn 0.511900 -0.858400 0.032700
+vn 0.525100 -0.851000 0.003900
+vn 0.289100 -0.956800 -0.030200
+vn 0.334000 -0.942400 -0.015800
+vn 0.324400 -0.945800 0.015100
+vn 0.280700 -0.959700 0.001200
+vn 0.235900 -0.971700 -0.010700
+vn 0.242900 -0.969100 -0.042500
+vn 0.189900 -0.981600 -0.020600
+vn 0.195500 -0.979300 -0.052700
+vn 0.249700 -0.965500 -0.074300
+vn 0.297100 -0.952800 -0.061600
+vn 0.256100 -0.960800 -0.105900
+vn 0.304800 -0.947800 -0.093000
+vn 0.200900 -0.975900 -0.084700
+vn 0.206200 -0.971500 -0.116600
+vn 0.343300 -0.938000 -0.046800
+vn 0.352200 -0.932600 -0.077800
+vn 0.098600 -0.992900 -0.066300
+vn 0.147300 -0.987200 -0.060600
+vn 0.143000 -0.989300 -0.028400
+vn 0.095700 -0.994800 -0.033800
+vn 0.048100 -0.998100 -0.037200
+vn 0.049500 -0.996300 -0.069800
+vn 0.000000 -0.999200 -0.038300
+vn 0.000000 -0.997500 -0.070900
+vn 0.050900 -0.993400 -0.102200
+vn 0.101300 -0.989900 -0.098700
+vn 0.052200 -0.989500 -0.134600
+vn 0.104000 -0.985900 -0.131000
+vn 0.000000 -0.994600 -0.103400
+vn 0.000000 -0.990700 -0.135800
+vn 0.151300 -0.984100 -0.092900
+vn 0.155300 -0.979900 -0.125000
+vn -0.098600 -0.992900 -0.066300
+vn -0.049500 -0.996300 -0.069800
+vn -0.048100 -0.998100 -0.037200
+vn -0.095700 -0.994800 -0.033800
+vn -0.143000 -0.989300 -0.028400
+vn -0.147300 -0.987200 -0.060600
+vn -0.189900 -0.981600 -0.020600
+vn -0.195500 -0.979300 -0.052700
+vn -0.151300 -0.984100 -0.092900
+vn -0.101300 -0.989900 -0.098700
+vn -0.155300 -0.979900 -0.125000
+vn -0.104000 -0.985900 -0.131000
+vn -0.200900 -0.975900 -0.084700
+vn -0.206200 -0.971500 -0.116600
+vn -0.050900 -0.993400 -0.102200
+vn -0.052200 -0.989500 -0.134600
+vn -0.289100 -0.956800 -0.030200
+vn -0.242900 -0.969100 -0.042500
+vn -0.235900 -0.971700 -0.010700
+vn -0.280700 -0.959700 0.001200
+vn -0.324400 -0.945800 0.015100
+vn -0.334000 -0.942400 -0.015800
+vn -0.366800 -0.929700 0.031200
+vn -0.377700 -0.925900 0.000600
+vn -0.343300 -0.938000 -0.046800
+vn -0.297100 -0.952800 -0.061600
+vn -0.352200 -0.932600 -0.077800
+vn -0.304800 -0.947800 -0.093000
+vn -0.388200 -0.921100 -0.029800
+vn -0.398300 -0.915300 -0.060400
+vn -0.249700 -0.965500 -0.074300
+vn -0.256100 -0.960800 -0.105900
+vn -0.459900 -0.887100 0.039500
+vn -0.419800 -0.907400 0.019100
+vn -0.407700 -0.911800 0.049200
+vn -0.446600 -0.892100 0.068900
+vn -0.483700 -0.870600 0.090400
+vn -0.498000 -0.865000 0.061600
+vn -0.518800 -0.847300 0.113600
+vn -0.534200 -0.841000 0.085500
+vn -0.511900 -0.858400 0.032700
+vn -0.472700 -0.881200 0.010000
+vn -0.525100 -0.851000 0.003900
+vn -0.484900 -0.874300 -0.019400
+vn -0.549000 -0.833800 0.057400
+vn -0.563300 -0.825700 0.029100
+vn -0.431400 -0.902000 -0.010800
+vn -0.442600 -0.895700 -0.040900
+vn -0.599400 -0.788500 0.138100
+vn -0.568000 -0.815400 0.111100
+vn -0.551700 -0.822500 0.138500
+vn -0.582000 -0.796300 0.164600
+vn -0.609900 -0.768800 0.192200
+vn -0.628100 -0.760100 0.166400
+vn -0.635400 -0.739900 0.221100
+vn -0.654300 -0.730400 0.196200
+vn -0.645500 -0.750700 0.140500
+vn -0.616000 -0.779800 0.111400
+vn -0.662300 -0.740400 0.114400
+vn -0.632000 -0.770300 0.084500
+vn -0.672400 -0.720100 0.171100
+vn -0.689900 -0.709100 0.145800
+vn -0.583800 -0.807500 0.083700
+vn -0.599000 -0.798800 0.056100
+vn -0.698000 -0.667700 0.258800
+vn -0.677600 -0.699500 0.227100
+vn -0.658000 -0.709900 0.251100
+vn -0.677800 -0.679000 0.281900
+vn -0.694700 -0.647300 0.313600
+vn -0.715300 -0.635100 0.291500
+vn -0.708700 -0.614700 0.346200
+vn -0.729700 -0.601500 0.325000
+vn -0.735200 -0.622200 0.269000
+vn -0.717300 -0.655700 0.235500
+vn -0.754300 -0.608600 0.246300
+vn -0.736000 -0.643000 0.211900
+vn -0.750000 -0.587700 0.303500
+vn -0.769500 -0.573200 0.281600
+vn -0.696400 -0.688300 0.202800
+vn -0.714500 -0.676500 0.178400
+vn -0.749000 -0.533000 0.393500
+vn -0.741000 -0.567400 0.359100
+vn -0.719600 -0.581600 0.379300
+vn -0.727400 -0.548200 0.412700
+vn -0.732100 -0.514500 0.446500
+vn -0.753800 -0.498300 0.428300
+vn -0.733700 -0.480500 0.480500
+vn -0.755500 -0.463300 0.463300
+vn -0.774800 -0.481600 0.409600
+vn -0.769800 -0.517300 0.373900
+vn -0.794900 -0.464300 0.390500
+vn -0.789800 -0.501000 0.353900
+vn -0.776400 -0.445600 0.445600
+vn -0.796600 -0.427400 0.427400
+vn -0.761500 -0.552600 0.338500
+vn -0.781300 -0.537200 0.317600
+vn -0.749000 -0.393500 0.533000
+vn -0.753800 -0.428300 0.498300
+vn -0.732100 -0.446500 0.514500
+vn -0.727400 -0.412700 0.548200
+vn -0.719600 -0.379300 0.581600
+vn -0.741000 -0.359100 0.567400
+vn -0.761500 -0.338500 0.552600
+vn -0.769800 -0.373900 0.517300
+vn -0.781300 -0.317600 0.537200
+vn -0.789800 -0.353900 0.501000
+vn -0.774800 -0.409600 0.481600
+vn -0.794900 -0.390500 0.464300
+vn -0.770800 -0.164000 0.615600
+vn -0.790000 -0.200100 0.579500
+vn -0.772500 -0.223300 0.594300
+vn -0.753800 -0.188000 0.629600
+vn -0.805900 -0.237100 0.542500
+vn -0.788100 -0.259500 0.558200
+vn -0.731800 -0.153700 0.663900
+vn -0.748300 -0.129000 0.650700
+vn -0.706600 -0.120400 0.697300
+vn -0.722500 -0.094900 0.684800
+vn -0.764000 -0.104100 0.636700
+vn -0.787000 -0.139900 0.600900
+vn -0.778900 -0.079100 0.622100
+vn -0.802300 -0.115600 0.585600
+vn -0.737700 -0.069200 0.671600
+vn -0.752000 -0.043600 0.657600
+vn -0.806500 -0.176700 0.564100
+vn -0.822800 -0.214500 0.526300
+vn -0.822300 -0.153100 0.548100
+vn -0.838800 -0.191700 0.509500
+vn -0.661900 -0.030700 0.749000
+vn -0.693600 -0.062000 0.717600
+vn -0.678300 -0.088200 0.729400
+vn -0.647300 -0.057600 0.760000
+vn -0.613500 -0.028500 0.789100
+vn -0.627300 -0.000900 0.778700
+vn -0.576900 -0.000900 0.816800
+vn -0.589900 0.027300 0.807000
+vn -0.640500 0.026600 0.767500
+vn -0.675800 -0.003700 0.737100
+vn -0.653000 0.054200 0.755400
+vn -0.689000 0.023200 0.724400
+vn -0.602300 0.055500 0.796300
+vn -0.614000 0.083600 0.784800
+vn -0.708200 -0.035700 0.705100
+vn -0.722000 -0.009400 0.691800
+vn -0.507900 0.078200 0.857800
+vn -0.550000 0.053700 0.833400
+vn -0.537900 0.025000 0.842600
+vn -0.496700 0.048900 0.866500
+vn -0.453400 0.070800 0.888500
+vn -0.463600 0.100600 0.880300
+vn -0.407900 0.090800 0.908500
+vn -0.417100 0.121100 0.900700
+vn -0.473300 0.130300 0.871200
+vn -0.518500 0.107400 0.848300
+vn -0.482600 0.159900 0.861100
+vn -0.528600 0.136500 0.837800
+vn -0.425900 0.151200 0.892000
+vn -0.434200 0.181200 0.882400
+vn -0.561500 0.082500 0.823300
+vn -0.572500 0.111100 0.812300
+vn -0.319300 0.155200 0.934800
+vn -0.368900 0.139300 0.918900
+vn -0.360800 0.108600 0.926300
+vn -0.312200 0.124200 0.941800
+vn -0.262400 0.137400 0.955100
+vn -0.268300 0.168800 0.948400
+vn -0.211200 0.148400 0.966100
+vn -0.215900 0.180000 0.959700
+vn -0.273900 0.199900 0.940700
+vn -0.326000 0.186000 0.926900
+vn -0.279200 0.230800 0.932000
+vn -0.332300 0.216700 0.917900
+vn -0.220400 0.211300 0.952200
+vn -0.224700 0.242500 0.943700
+vn -0.376600 0.169800 0.910600
+vn -0.384000 0.200100 0.901400
+vn -0.108900 0.195000 0.974700
+vn -0.162600 0.188800 0.968400
+vn -0.159100 0.157000 0.974700
+vn -0.106500 0.163200 0.980800
+vn -0.053500 0.166800 0.984500
+vn -0.054700 0.198800 0.978500
+vn 0.000000 0.168100 0.985700
+vn 0.000000 0.200100 0.979800
+vn -0.055800 0.230600 0.971400
+vn -0.111200 0.226700 0.967600
+vn -0.056900 0.262100 0.963300
+vn -0.113300 0.258200 0.959400
+vn 0.000000 0.231900 0.972700
+vn 0.000000 0.263400 0.964700
+vn -0.166100 0.220300 0.961200
+vn -0.169300 0.251700 0.952900
+vn 0.108900 0.195000 0.974700
+vn 0.054700 0.198800 0.978500
+vn 0.053500 0.166800 0.984500
+vn 0.106500 0.163200 0.980800
+vn 0.159000 0.157000 0.974700
+vn 0.162600 0.188800 0.968400
+vn 0.211200 0.148400 0.966100
+vn 0.215900 0.180000 0.959700
+vn 0.166100 0.220300 0.961200
+vn 0.111200 0.226700 0.967600
+vn 0.169300 0.251700 0.952900
+vn 0.113300 0.258200 0.959400
+vn 0.220400 0.211300 0.952200
+vn 0.224700 0.242500 0.943700
+vn 0.055800 0.230600 0.971400
+vn 0.056900 0.262100 0.963300
+vn 0.319300 0.155200 0.934800
+vn 0.268300 0.168800 0.948400
+vn 0.262400 0.137400 0.955100
+vn 0.312200 0.124200 0.941800
+vn 0.360800 0.108600 0.926300
+vn 0.368900 0.139300 0.918900
+vn 0.407900 0.090800 0.908500
+vn 0.417100 0.121100 0.900700
+vn 0.376600 0.169800 0.910600
+vn 0.326000 0.186000 0.926900
+vn 0.384000 0.200100 0.901400
+vn 0.332300 0.216700 0.917900
+vn 0.425900 0.151200 0.892000
+vn 0.434200 0.181200 0.882400
+vn 0.273900 0.199900 0.940700
+vn 0.279200 0.230800 0.932000
+vn 0.507900 0.078200 0.857800
+vn 0.463600 0.100600 0.880300
+vn 0.453400 0.070800 0.888500
+vn 0.496700 0.048900 0.866500
+vn 0.537900 0.025000 0.842600
+vn 0.550000 0.053700 0.833400
+vn 0.576900 -0.000900 0.816800
+vn 0.589900 0.027300 0.807000
+vn 0.561500 0.082500 0.823300
+vn 0.518500 0.107400 0.848300
+vn 0.572500 0.111100 0.812300
+vn 0.528600 0.136500 0.837800
+vn 0.602300 0.055500 0.796300
+vn 0.614000 0.083600 0.784800
+vn 0.473300 0.130300 0.871200
+vn 0.482600 0.159900 0.861100
+vn 0.661900 -0.030700 0.749000
+vn 0.627300 -0.000900 0.778700
+vn 0.613500 -0.028500 0.789100
+vn 0.647300 -0.057600 0.760000
+vn 0.678300 -0.088200 0.729400
+vn 0.693600 -0.062000 0.717600
+vn 0.706600 -0.120400 0.697300
+vn 0.722500 -0.094900 0.684800
+vn 0.708200 -0.035700 0.705100
+vn 0.675800 -0.003700 0.737100
+vn 0.722000 -0.009400 0.691800
+vn 0.689000 0.023200 0.724400
+vn 0.737700 -0.069200 0.671600
+vn 0.752000 -0.043600 0.657600
+vn 0.640500 0.026600 0.767500
+vn 0.653000 0.054200 0.755400
+vn 0.770800 -0.164000 0.615600
+vn 0.748300 -0.129000 0.650700
+vn 0.731800 -0.153700 0.663900
+vn 0.753800 -0.188000 0.629600
+vn 0.772500 -0.223300 0.594300
+vn 0.790000 -0.200100 0.579500
+vn 0.788100 -0.259500 0.558200
+vn 0.805900 -0.237100 0.542500
+vn 0.806500 -0.176700 0.564100
+vn 0.787000 -0.139900 0.600900
+vn 0.822300 -0.153100 0.548100
+vn 0.802300 -0.115600 0.585600
+vn 0.822800 -0.214500 0.526300
+vn 0.838800 -0.191700 0.509500
+vn 0.764000 -0.104100 0.636700
+vn 0.778900 -0.079100 0.622100
+vn 0.827100 -0.312800 0.466800
+vn 0.818300 -0.274800 0.504800
+vn 0.800200 -0.296300 0.521300
+vn 0.808900 -0.333500 0.484100
+vn 0.814100 -0.371000 0.446600
+vn 0.832500 -0.351100 0.428500
+vn 0.815900 -0.408800 0.408800
+vn 0.834300 -0.389800 0.389800
+vn 0.850000 -0.330900 0.409900
+vn 0.844500 -0.291800 0.449000
+vn 0.866500 -0.310300 0.390900
+vn 0.861000 -0.270500 0.430700
+vn 0.851800 -0.370400 0.370400
+vn 0.835400 -0.253000 0.487800
+vn 0.851700 -0.230900 0.470300
+vn 0.827100 -0.466800 0.312800
+vn 0.832500 -0.428500 0.351100
+vn 0.814100 -0.446600 0.371000
+vn 0.808900 -0.484100 0.333500
+vn 0.800200 -0.521300 0.296300
+vn 0.818300 -0.504800 0.274800
+vn 0.788100 -0.558200 0.259500
+vn 0.805900 -0.542500 0.237100
+vn 0.835400 -0.487800 0.253000
+vn 0.844500 -0.449000 0.291800
+vn 0.851700 -0.470300 0.230900
+vn 0.861000 -0.430700 0.270500
+vn 0.822800 -0.526300 0.214500
+vn 0.838800 -0.509500 0.191700
+vn 0.850000 -0.409900 0.330900
+vn 0.866500 -0.390900 0.310300
+vn 0.770800 -0.615600 0.164000
+vn 0.790000 -0.579500 0.200100
+vn 0.772500 -0.594300 0.223300
+vn 0.753800 -0.629600 0.188000
+vn 0.731800 -0.663900 0.153700
+vn 0.748300 -0.650700 0.129000
+vn 0.706600 -0.697300 0.120400
+vn 0.722500 -0.684800 0.094900
+vn 0.764000 -0.636700 0.104100
+vn 0.787000 -0.600900 0.139900
+vn 0.778900 -0.622100 0.079100
+vn 0.802300 -0.585600 0.115600
+vn 0.737700 -0.671600 0.069200
+vn 0.752000 -0.657600 0.043600
+vn 0.806500 -0.564100 0.176700
+vn 0.822300 -0.548100 0.153100
+vn 0.661900 -0.749000 0.030700
+vn 0.693600 -0.717600 0.062000
+vn 0.678300 -0.729400 0.088200
+vn 0.647300 -0.760000 0.057600
+vn 0.613500 -0.789100 0.028500
+vn 0.627300 -0.778700 0.000900
+vn 0.576900 -0.816800 0.000900
+vn 0.589900 -0.807000 -0.027300
+vn 0.640500 -0.767500 -0.026600
+vn 0.675800 -0.737100 0.003700
+vn 0.653000 -0.755400 -0.054200
+vn 0.689000 -0.724400 -0.023200
+vn 0.602300 -0.796300 -0.055500
+vn 0.614000 -0.784800 -0.083600
+vn 0.708200 -0.705100 0.035700
+vn 0.722000 -0.691800 0.009400
+vn 0.507900 -0.857800 -0.078200
+vn 0.550000 -0.833400 -0.053700
+vn 0.537900 -0.842600 -0.025000
+vn 0.496700 -0.866500 -0.048900
+vn 0.453400 -0.888500 -0.070800
+vn 0.463600 -0.880300 -0.100600
+vn 0.407900 -0.908500 -0.090800
+vn 0.417100 -0.900700 -0.121100
+vn 0.473300 -0.871200 -0.130300
+vn 0.518500 -0.848300 -0.107400
+vn 0.482600 -0.861100 -0.159900
+vn 0.528600 -0.837800 -0.136500
+vn 0.425900 -0.892000 -0.151200
+vn 0.434200 -0.882400 -0.181200
+vn 0.561500 -0.823300 -0.082500
+vn 0.572500 -0.812300 -0.111100
+vn 0.319300 -0.934800 -0.155200
+vn 0.368900 -0.918900 -0.139300
+vn 0.360800 -0.926300 -0.108600
+vn 0.312200 -0.941800 -0.124200
+vn 0.262400 -0.955100 -0.137400
+vn 0.268300 -0.948400 -0.168800
+vn 0.211200 -0.966100 -0.148400
+vn 0.215900 -0.959700 -0.180000
+vn 0.273900 -0.940700 -0.199900
+vn 0.326000 -0.926900 -0.186000
+vn 0.279200 -0.932000 -0.230800
+vn 0.332300 -0.917900 -0.216700
+vn 0.220400 -0.952200 -0.211300
+vn 0.224700 -0.943700 -0.242500
+vn 0.376600 -0.910600 -0.169800
+vn 0.384000 -0.901400 -0.200100
+vn 0.108900 -0.974700 -0.195000
+vn 0.162600 -0.968400 -0.188800
+vn 0.159100 -0.974700 -0.157000
+vn 0.106500 -0.980800 -0.163200
+vn 0.053500 -0.984500 -0.166800
+vn 0.054700 -0.978500 -0.198800
+vn 0.000000 -0.985700 -0.168100
+vn 0.000000 -0.979800 -0.200100
+vn 0.055800 -0.971400 -0.230600
+vn 0.111200 -0.967600 -0.226700
+vn 0.056900 -0.963300 -0.262100
+vn 0.113300 -0.959400 -0.258200
+vn 0.000000 -0.972700 -0.231900
+vn 0.000000 -0.964700 -0.263400
+vn 0.166100 -0.961200 -0.220300
+vn 0.169300 -0.952900 -0.251700
+vn -0.108900 -0.974700 -0.195000
+vn -0.054700 -0.978500 -0.198800
+vn -0.053500 -0.984500 -0.166800
+vn -0.106500 -0.980800 -0.163200
+vn -0.159100 -0.974700 -0.157000
+vn -0.162600 -0.968400 -0.188800
+vn -0.211200 -0.966100 -0.148400
+vn -0.215900 -0.959700 -0.180000
+vn -0.166100 -0.961200 -0.220300
+vn -0.111200 -0.967600 -0.226700
+vn -0.169300 -0.952900 -0.251700
+vn -0.113300 -0.959400 -0.258200
+vn -0.220400 -0.952200 -0.211300
+vn -0.224700 -0.943700 -0.242500
+vn -0.055800 -0.971400 -0.230600
+vn -0.056900 -0.963300 -0.262100
+vn -0.319300 -0.934800 -0.155200
+vn -0.268300 -0.948400 -0.168800
+vn -0.262400 -0.955100 -0.137400
+vn -0.312200 -0.941800 -0.124200
+vn -0.360800 -0.926300 -0.108600
+vn -0.368900 -0.918900 -0.139300
+vn -0.407900 -0.908500 -0.090800
+vn -0.417100 -0.900700 -0.121100
+vn -0.376600 -0.910600 -0.169800
+vn -0.326000 -0.926900 -0.186000
+vn -0.384000 -0.901400 -0.200100
+vn -0.332300 -0.917900 -0.216700
+vn -0.425900 -0.892000 -0.151200
+vn -0.434200 -0.882400 -0.181200
+vn -0.273900 -0.940700 -0.199900
+vn -0.279200 -0.932000 -0.230800
+vn -0.507900 -0.857800 -0.078200
+vn -0.463600 -0.880300 -0.100600
+vn -0.453400 -0.888500 -0.070800
+vn -0.496700 -0.866500 -0.048900
+vn -0.537900 -0.842600 -0.025000
+vn -0.550000 -0.833400 -0.053700
+vn -0.576900 -0.816800 0.000900
+vn -0.589900 -0.807000 -0.027300
+vn -0.561500 -0.823300 -0.082500
+vn -0.518500 -0.848300 -0.107400
+vn -0.572500 -0.812300 -0.111100
+vn -0.528600 -0.837800 -0.136500
+vn -0.602300 -0.796300 -0.055500
+vn -0.614000 -0.784800 -0.083600
+vn -0.473300 -0.871200 -0.130300
+vn -0.482600 -0.861100 -0.159900
+vn -0.661900 -0.749000 0.030700
+vn -0.627300 -0.778700 0.000900
+vn -0.613500 -0.789100 0.028500
+vn -0.647300 -0.760000 0.057600
+vn -0.678300 -0.729400 0.088200
+vn -0.693600 -0.717600 0.062000
+vn -0.706600 -0.697300 0.120400
+vn -0.722500 -0.684800 0.094900
+vn -0.708200 -0.705100 0.035700
+vn -0.675800 -0.737100 0.003700
+vn -0.722000 -0.691800 0.009400
+vn -0.689000 -0.724400 -0.023200
+vn -0.737700 -0.671600 0.069200
+vn -0.752000 -0.657600 0.043600
+vn -0.640500 -0.767500 -0.026600
+vn -0.653000 -0.755400 -0.054200
+vn -0.770800 -0.615600 0.164000
+vn -0.748300 -0.650700 0.129000
+vn -0.731800 -0.663900 0.153700
+vn -0.753800 -0.629600 0.188000
+vn -0.772500 -0.594300 0.223300
+vn -0.790000 -0.579500 0.200100
+vn -0.788100 -0.558200 0.259500
+vn -0.805900 -0.542500 0.237100
+vn -0.806500 -0.564100 0.176700
+vn -0.787000 -0.600900 0.139900
+vn -0.822300 -0.548100 0.153100
+vn -0.802300 -0.585600 0.115600
+vn -0.822800 -0.526300 0.214500
+vn -0.838800 -0.509500 0.191700
+vn -0.764000 -0.636700 0.104100
+vn -0.778900 -0.622100 0.079100
+vn -0.827100 -0.466800 0.312800
+vn -0.818300 -0.504800 0.274800
+vn -0.800200 -0.521300 0.296300
+vn -0.808900 -0.484100 0.333500
+vn -0.814100 -0.446600 0.371000
+vn -0.832500 -0.428500 0.351100
+vn -0.815900 -0.408800 0.408800
+vn -0.834300 -0.389800 0.389800
+vn -0.850000 -0.409900 0.330900
+vn -0.844500 -0.449000 0.291800
+vn -0.866500 -0.390900 0.310300
+vn -0.861000 -0.430700 0.270500
+vn -0.851800 -0.370400 0.370400
+vn -0.835400 -0.487800 0.253000
+vn -0.851700 -0.470300 0.230900
+vn -0.827100 -0.312800 0.466800
+vn -0.832500 -0.351100 0.428500
+vn -0.814100 -0.371000 0.446600
+vn -0.808900 -0.333500 0.484100
+vn -0.800200 -0.296300 0.521300
+vn -0.818300 -0.274800 0.504800
+vn -0.835400 -0.253000 0.487800
+vn -0.844500 -0.291800 0.449000
+vn -0.851700 -0.230900 0.470300
+vn -0.861000 -0.270500 0.430700
+vn -0.850000 -0.330900 0.409900
+vn -0.866500 -0.310300 0.390900
+vn -0.830400 -0.066700 0.553100
+vn -0.851000 -0.105600 0.514300
+vn -0.837100 -0.129400 0.531400
+vn -0.816800 -0.091200 0.569700
+vn -0.868200 -0.145500 0.474400
+vn -0.853900 -0.168600 0.492200
+vn -0.793000 -0.054000 0.606900
+vn -0.806100 -0.028900 0.591000
+vn -0.765600 -0.017900 0.643000
+vn -0.778400 0.007800 0.627700
+vn -0.818500 -0.003800 0.574500
+vn -0.843100 -0.042200 0.536100
+vn -0.830000 0.021300 0.557400
+vn -0.854900 -0.017600 0.518400
+vn -0.790300 0.033400 0.611800
+vn -0.801400 0.059100 0.595200
+vn -0.864100 -0.081600 0.496700
+vn -0.881400 -0.122100 0.456200
+vn -0.876200 -0.057600 0.478400
+vn -0.893800 -0.098700 0.437400
+vn -0.713100 0.076900 0.696800
+vn -0.747200 0.043200 0.663100
+vn -0.735000 0.016900 0.677800
+vn -0.701400 0.050100 0.711000
+vn -0.664800 0.081700 0.742500
+vn -0.675800 0.109000 0.728900
+vn -0.625100 0.111600 0.772500
+vn -0.635500 0.139400 0.759400
+vn -0.686200 0.136200 0.714500
+vn -0.724000 0.103600 0.682000
+vn -0.695800 0.163300 0.699400
+vn -0.734100 0.130300 0.666400
+vn -0.645300 0.167100 0.745400
+vn -0.654300 0.194600 0.730700
+vn -0.758700 0.069400 0.647700
+vn -0.769300 0.095600 0.631600
+vn -0.547100 0.194300 0.814200
+vn -0.592500 0.167900 0.787800
+vn -0.582800 0.139600 0.800500
+vn -0.538200 0.165500 0.826400
+vn -0.491300 0.189300 0.850200
+vn -0.499400 0.218400 0.838300
+vn -0.442000 0.210900 0.871800
+vn -0.449400 0.240400 0.860300
+vn -0.507100 0.247300 0.825600
+vn -0.555500 0.222800 0.801100
+vn -0.514200 0.275900 0.812000
+vn -0.563300 0.251000 0.787100
+vn -0.456300 0.269700 0.848000
+vn -0.462700 0.298600 0.834700
+vn -0.601600 0.196000 0.774300
+vn -0.610000 0.223900 0.760000
+vn -0.343900 0.277200 0.897100
+vn -0.397400 0.260100 0.880000
+vn -0.390900 0.230300 0.891100
+vn -0.338300 0.247100 0.908000
+vn -0.284300 0.261500 0.922400
+vn -0.289000 0.291800 0.911700
+vn -0.228800 0.273400 0.934300
+vn -0.232600 0.303900 0.923900
+vn -0.293400 0.321800 0.900100
+vn -0.349200 0.307000 0.885300
+vn -0.297600 0.351500 0.887600
+vn -0.354100 0.336500 0.872600
+vn -0.236200 0.334100 0.912400
+vn -0.239500 0.364000 0.900100
+vn -0.403500 0.289600 0.867900
+vn -0.409100 0.318800 0.854900
+vn -0.117300 0.320100 0.940100
+vn -0.175200 0.313400 0.933300
+vn -0.172300 0.282700 0.943600
+vn -0.115400 0.289300 0.950200
+vn -0.057900 0.293300 0.954200
+vn -0.058900 0.324200 0.944100
+vn 0.000000 0.294700 0.955600
+vn 0.000000 0.325600 0.945500
+vn -0.059800 0.354700 0.933000
+vn -0.119100 0.350600 0.928900
+vn -0.060600 0.384900 0.921000
+vn -0.120800 0.380700 0.916800
+vn 0.000000 0.356100 0.934400
+vn 0.000000 0.386300 0.922400
+vn -0.177900 0.343700 0.922100
+vn -0.180400 0.373700 0.909800
+vn 0.117300 0.320100 0.940100
+vn 0.058900 0.324200 0.944100
+vn 0.057900 0.293300 0.954200
+vn 0.115400 0.289300 0.950200
+vn 0.172300 0.282700 0.943600
+vn 0.175200 0.313400 0.933300
+vn 0.228800 0.273400 0.934300
+vn 0.232600 0.303900 0.923900
+vn 0.177900 0.343700 0.922100
+vn 0.119100 0.350600 0.928900
+vn 0.180400 0.373700 0.909800
+vn 0.120800 0.380700 0.916800
+vn 0.236200 0.334100 0.912400
+vn 0.239500 0.364000 0.900100
+vn 0.059800 0.354700 0.933000
+vn 0.060600 0.384900 0.921000
+vn 0.343900 0.277200 0.897100
+vn 0.289000 0.291800 0.911700
+vn 0.284300 0.261500 0.922400
+vn 0.338300 0.247100 0.908000
+vn 0.390900 0.230300 0.891100
+vn 0.397400 0.260100 0.880000
+vn 0.442000 0.210900 0.871800
+vn 0.449400 0.240400 0.860300
+vn 0.403500 0.289600 0.867900
+vn 0.349200 0.307000 0.885300
+vn 0.409200 0.318800 0.854900
+vn 0.354100 0.336500 0.872600
+vn 0.456300 0.269700 0.848000
+vn 0.462700 0.298600 0.834700
+vn 0.293400 0.321800 0.900100
+vn 0.297600 0.351500 0.887600
+vn 0.547100 0.194300 0.814200
+vn 0.499400 0.218400 0.838300
+vn 0.491300 0.189300 0.850200
+vn 0.538200 0.165500 0.826400
+vn 0.582800 0.139600 0.800500
+vn 0.592500 0.167900 0.787800
+vn 0.625100 0.111600 0.772500
+vn 0.635500 0.139400 0.759400
+vn 0.601600 0.196000 0.774300
+vn 0.555500 0.222800 0.801100
+vn 0.610000 0.223900 0.760000
+vn 0.563300 0.251000 0.787100
+vn 0.645300 0.167100 0.745400
+vn 0.654300 0.194600 0.730700
+vn 0.507100 0.247300 0.825600
+vn 0.514200 0.275900 0.812000
+vn 0.713100 0.076900 0.696800
+vn 0.675800 0.109000 0.728900
+vn 0.664800 0.081700 0.742500
+vn 0.701400 0.050100 0.711000
+vn 0.735000 0.016900 0.677800
+vn 0.747200 0.043200 0.663100
+vn 0.765600 -0.017900 0.643000
+vn 0.778400 0.007800 0.627700
+vn 0.758700 0.069400 0.647700
+vn 0.724000 0.103600 0.682000
+vn 0.769300 0.095600 0.631600
+vn 0.734100 0.130300 0.666400
+vn 0.790300 0.033400 0.611800
+vn 0.801400 0.059100 0.595200
+vn 0.686200 0.136200 0.714500
+vn 0.695800 0.163300 0.699400
+vn 0.830400 -0.066700 0.553100
+vn 0.806100 -0.028900 0.591000
+vn 0.793000 -0.054000 0.606800
+vn 0.816800 -0.091200 0.569700
+vn 0.837100 -0.129400 0.531400
+vn 0.851000 -0.105600 0.514300
+vn 0.853900 -0.168600 0.492200
+vn 0.868200 -0.145500 0.474400
+vn 0.864100 -0.081600 0.496700
+vn 0.843100 -0.042200 0.536100
+vn 0.876200 -0.057600 0.478400
+vn 0.854900 -0.017600 0.518400
+vn 0.881400 -0.122100 0.456200
+vn 0.893800 -0.098700 0.437400
+vn 0.818500 -0.003800 0.574500
+vn 0.830000 0.021300 0.557400
+vn 0.891100 -0.227000 0.392900
+vn 0.881500 -0.186000 0.433900
+vn 0.867100 -0.208600 0.452300
+vn 0.876500 -0.248800 0.412000
+vn 0.882200 -0.289500 0.371400
+vn 0.896800 -0.268300 0.351600
+vn 0.884100 -0.330400 0.330400
+vn 0.910600 -0.246900 0.331400
+vn 0.904800 -0.204900 0.373400
+vn 0.923400 -0.225100 0.310900
+vn 0.917400 -0.182600 0.353400
+vn 0.912500 -0.289200 0.289200
+vn 0.925400 -0.268000 0.268000
+vn 0.895000 -0.163300 0.415000
+vn 0.907600 -0.140500 0.395600
+vn 0.891100 -0.392900 0.227000
+vn 0.896800 -0.351600 0.268300
+vn 0.882200 -0.371400 0.289500
+vn 0.876500 -0.412000 0.248800
+vn 0.867100 -0.452300 0.208600
+vn 0.881500 -0.433900 0.186000
+vn 0.853900 -0.492200 0.168600
+vn 0.868200 -0.474400 0.145500
+vn 0.895000 -0.415000 0.163400
+vn 0.904800 -0.373400 0.204900
+vn 0.907600 -0.395600 0.140500
+vn 0.917400 -0.353400 0.182600
+vn 0.881400 -0.456200 0.122100
+vn 0.893800 -0.437400 0.098700
+vn 0.910600 -0.331400 0.246900
+vn 0.923400 -0.310900 0.225100
+vn 0.830400 -0.553100 0.066700
+vn 0.851000 -0.514300 0.105600
+vn 0.837100 -0.531400 0.129400
+vn 0.816800 -0.569700 0.091200
+vn 0.793000 -0.606900 0.054000
+vn 0.806100 -0.591000 0.028900
+vn 0.765600 -0.643000 0.017900
+vn 0.778400 -0.627700 -0.007800
+vn 0.818500 -0.574500 0.003800
+vn 0.843100 -0.536100 0.042200
+vn 0.830000 -0.557400 -0.021300
+vn 0.854900 -0.518400 0.017600
+vn 0.790300 -0.611800 -0.033400
+vn 0.801400 -0.595200 -0.059100
+vn 0.864100 -0.496700 0.081600
+vn 0.876200 -0.478400 0.057600
+vn 0.713100 -0.696900 -0.076900
+vn 0.747200 -0.663100 -0.043200
+vn 0.735000 -0.677800 -0.016900
+vn 0.701400 -0.711000 -0.050100
+vn 0.664800 -0.742500 -0.081700
+vn 0.675800 -0.728900 -0.109000
+vn 0.625100 -0.772500 -0.111600
+vn 0.635500 -0.759400 -0.139400
+vn 0.686200 -0.714500 -0.136200
+vn 0.724000 -0.682000 -0.103600
+vn 0.695800 -0.699400 -0.163300
+vn 0.734100 -0.666400 -0.130300
+vn 0.645300 -0.745400 -0.167100
+vn 0.654300 -0.730700 -0.194600
+vn 0.758700 -0.647700 -0.069400
+vn 0.769300 -0.631600 -0.095600
+vn 0.547100 -0.814200 -0.194300
+vn 0.592500 -0.787800 -0.167900
+vn 0.582800 -0.800500 -0.139600
+vn 0.538200 -0.826400 -0.165500
+vn 0.491300 -0.850200 -0.189300
+vn 0.499400 -0.838300 -0.218400
+vn 0.442000 -0.871800 -0.210900
+vn 0.449400 -0.860300 -0.240400
+vn 0.507100 -0.825600 -0.247300
+vn 0.555500 -0.801100 -0.222800
+vn 0.514200 -0.812000 -0.275900
+vn 0.563300 -0.787100 -0.251000
+vn 0.456300 -0.848000 -0.269600
+vn 0.462700 -0.834700 -0.298600
+vn 0.601600 -0.774300 -0.196000
+vn 0.610000 -0.760000 -0.223900
+vn 0.343900 -0.897100 -0.277200
+vn 0.397400 -0.880000 -0.260100
+vn 0.390900 -0.891100 -0.230300
+vn 0.338300 -0.908000 -0.247100
+vn 0.284300 -0.922400 -0.261500
+vn 0.289000 -0.911700 -0.291800
+vn 0.228800 -0.934300 -0.273400
+vn 0.232600 -0.923900 -0.303900
+vn 0.293400 -0.900100 -0.321800
+vn 0.349200 -0.885300 -0.307000
+vn 0.297600 -0.887600 -0.351500
+vn 0.354100 -0.872600 -0.336500
+vn 0.236200 -0.912400 -0.334100
+vn 0.239500 -0.900100 -0.364000
+vn 0.403500 -0.867900 -0.289600
+vn 0.409100 -0.854900 -0.318800
+vn 0.117300 -0.940100 -0.320100
+vn 0.175200 -0.933300 -0.313400
+vn 0.172300 -0.943600 -0.282700
+vn 0.115400 -0.950200 -0.289300
+vn 0.057900 -0.954200 -0.293300
+vn 0.058900 -0.944100 -0.324200
+vn 0.000000 -0.955600 -0.294700
+vn 0.000000 -0.945500 -0.325600
+vn 0.059800 -0.933000 -0.354700
+vn 0.119100 -0.928900 -0.350600
+vn 0.060600 -0.921000 -0.384900
+vn 0.120800 -0.916800 -0.380700
+vn 0.000000 -0.934400 -0.356100
+vn 0.000000 -0.922400 -0.386300
+vn 0.177900 -0.922100 -0.343700
+vn 0.180400 -0.909800 -0.373700
+vn -0.117300 -0.940100 -0.320100
+vn -0.058900 -0.944100 -0.324200
+vn -0.057900 -0.954200 -0.293300
+vn -0.115400 -0.950200 -0.289300
+vn -0.172300 -0.943600 -0.282700
+vn -0.175200 -0.933300 -0.313400
+vn -0.228800 -0.934300 -0.273400
+vn -0.232600 -0.923900 -0.303900
+vn -0.177900 -0.922100 -0.343700
+vn -0.119100 -0.928900 -0.350600
+vn -0.180400 -0.909800 -0.373700
+vn -0.120800 -0.916800 -0.380700
+vn -0.236200 -0.912400 -0.334100
+vn -0.239500 -0.900100 -0.364000
+vn -0.059800 -0.933000 -0.354700
+vn -0.060600 -0.921000 -0.384900
+vn -0.343900 -0.897100 -0.277200
+vn -0.289000 -0.911700 -0.291800
+vn -0.284300 -0.922400 -0.261500
+vn -0.338300 -0.908000 -0.247100
+vn -0.390900 -0.891100 -0.230300
+vn -0.397400 -0.880000 -0.260100
+vn -0.442000 -0.871800 -0.210900
+vn -0.449400 -0.860300 -0.240400
+vn -0.403500 -0.867900 -0.289600
+vn -0.349200 -0.885300 -0.307000
+vn -0.409100 -0.854900 -0.318800
+vn -0.354100 -0.872600 -0.336500
+vn -0.456300 -0.848000 -0.269600
+vn -0.462700 -0.834700 -0.298600
+vn -0.293400 -0.900100 -0.321800
+vn -0.297600 -0.887600 -0.351500
+vn -0.547100 -0.814200 -0.194300
+vn -0.499400 -0.838300 -0.218400
+vn -0.491300 -0.850200 -0.189300
+vn -0.538200 -0.826400 -0.165500
+vn -0.582800 -0.800500 -0.139600
+vn -0.592500 -0.787800 -0.167900
+vn -0.625100 -0.772500 -0.111600
+vn -0.635500 -0.759400 -0.139400
+vn -0.601600 -0.774300 -0.196000
+vn -0.555500 -0.801100 -0.222800
+vn -0.610000 -0.760000 -0.223900
+vn -0.563300 -0.787100 -0.251000
+vn -0.645300 -0.745400 -0.167100
+vn -0.654300 -0.730700 -0.194600
+vn -0.507100 -0.825600 -0.247300
+vn -0.514200 -0.812000 -0.275900
+vn -0.713100 -0.696900 -0.076900
+vn -0.675800 -0.728900 -0.109000
+vn -0.664800 -0.742500 -0.081700
+vn -0.701400 -0.711000 -0.050100
+vn -0.735000 -0.677800 -0.016900
+vn -0.747200 -0.663100 -0.043200
+vn -0.765600 -0.643000 0.017900
+vn -0.778400 -0.627700 -0.007800
+vn -0.758700 -0.647700 -0.069400
+vn -0.724000 -0.682000 -0.103600
+vn -0.769300 -0.631600 -0.095600
+vn -0.734100 -0.666400 -0.130300
+vn -0.790300 -0.611800 -0.033400
+vn -0.801400 -0.595200 -0.059100
+vn -0.686200 -0.714500 -0.136200
+vn -0.695800 -0.699400 -0.163300
+vn -0.830400 -0.553100 0.066700
+vn -0.806100 -0.591000 0.028900
+vn -0.793000 -0.606900 0.054000
+vn -0.816800 -0.569700 0.091200
+vn -0.837100 -0.531400 0.129400
+vn -0.851000 -0.514300 0.105600
+vn -0.853900 -0.492200 0.168600
+vn -0.868200 -0.474400 0.145500
+vn -0.864100 -0.496700 0.081600
+vn -0.843100 -0.536100 0.042200
+vn -0.876200 -0.478400 0.057600
+vn -0.854900 -0.518400 0.017600
+vn -0.881400 -0.456200 0.122100
+vn -0.893800 -0.437400 0.098700
+vn -0.818500 -0.574500 0.003800
+vn -0.830000 -0.557400 -0.021300
+vn -0.891100 -0.392900 0.227000
+vn -0.881500 -0.433900 0.186000
+vn -0.867100 -0.452300 0.208600
+vn -0.876500 -0.412000 0.248800
+vn -0.882200 -0.371400 0.289500
+vn -0.896800 -0.351600 0.268300
+vn -0.884100 -0.330400 0.330400
+vn -0.910600 -0.331400 0.246900
+vn -0.904800 -0.373400 0.204900
+vn -0.923400 -0.310900 0.225100
+vn -0.917400 -0.353400 0.182600
+vn -0.912500 -0.289200 0.289200
+vn -0.925400 -0.268000 0.268000
+vn -0.895000 -0.415000 0.163400
+vn -0.907600 -0.395600 0.140500
+vn -0.891100 -0.227000 0.392900
+vn -0.896800 -0.268300 0.351600
+vn -0.882200 -0.289500 0.371400
+vn -0.876500 -0.248800 0.412000
+vn -0.867100 -0.208600 0.452300
+vn -0.881500 -0.186000 0.433900
+vn -0.895000 -0.163300 0.415000
+vn -0.904800 -0.204900 0.373400
+vn -0.907600 -0.140500 0.395600
+vn -0.917400 -0.182600 0.353400
+vn -0.910600 -0.246900 0.331400
+vn -0.923400 -0.225100 0.310900
+vn -0.875800 0.031500 0.481600
+vn -0.897600 -0.009500 0.440600
+vn -0.887400 -0.033500 0.459800
+vn -0.865800 0.006900 0.500200
+vn -0.915700 -0.051500 0.398500
+vn -0.905200 -0.075100 0.418200
+vn -0.840600 0.046300 0.539700
+vn -0.850300 0.071400 0.521400
+vn -0.811600 0.084700 0.578000
+vn -0.821000 0.110100 0.560200
+vn -0.859100 0.096300 0.502700
+vn -0.884900 0.056000 0.462400
+vn -0.867000 0.121100 0.483400
+vn -0.893000 0.080400 0.442700
+vn -0.829500 0.135400 0.541800
+vn -0.837100 0.160600 0.522900
+vn -0.906900 0.014600 0.421000
+vn -0.925200 -0.027900 0.378500
+vn -0.915300 0.038700 0.400900
+vn -0.933700 -0.004200 0.358000
+vn -0.752100 0.183000 0.633100
+vn -0.788100 0.147400 0.597500
+vn -0.779100 0.121600 0.614900
+vn -0.743500 0.156700 0.650100
+vn -0.704700 0.190200 0.683500
+vn -0.712800 0.216900 0.667000
+vn -0.662700 0.221900 0.715200
+vn -0.670300 0.248900 0.699000
+vn -0.720200 0.243300 0.649700
+vn -0.759900 0.209100 0.615500
+vn -0.726800 0.269400 0.631700
+vn -0.766900 0.235000 0.597200
+vn -0.677300 0.275700 0.682100
+vn -0.683500 0.302200 0.664400
+vn -0.796300 0.173100 0.579500
+vn -0.803600 0.198700 0.560900
+vn -0.577100 0.306800 0.756900
+vn -0.625000 0.279000 0.729100
+vn -0.617800 0.251600 0.745000
+vn -0.570500 0.279100 0.772400
+vn -0.520800 0.304300 0.797600
+vn -0.526800 0.332300 0.782300
+vn -0.468600 0.327200 0.820600
+vn -0.474000 0.355500 0.805600
+vn -0.532200 0.359900 0.766300
+vn -0.583100 0.334100 0.740500
+vn -0.537100 0.387100 0.749400
+vn -0.588400 0.361100 0.723400
+vn -0.478900 0.383300 0.789700
+vn -0.483300 0.410800 0.773100
+vn -0.631400 0.306000 0.712500
+vn -0.637200 0.332800 0.695100
+vn -0.362800 0.394200 0.844400
+vn -0.419100 0.376200 0.826300
+vn -0.414400 0.347700 0.841000
+vn -0.358600 0.365600 0.858900
+vn -0.301400 0.380800 0.874100
+vn -0.304800 0.409700 0.859800
+vn -0.242600 0.393400 0.886700
+vn -0.245300 0.422400 0.872500
+vn -0.308000 0.438100 0.844500
+vn -0.366500 0.422500 0.828900
+vn -0.310800 0.466000 0.828300
+vn -0.369900 0.450300 0.812600
+vn -0.247900 0.451000 0.857400
+vn -0.250200 0.479100 0.841300
+vn -0.423500 0.404200 0.810700
+vn -0.427400 0.431900 0.794200
+vn -0.123700 0.439600 0.889600
+vn -0.184800 0.432400 0.882500
+vn -0.182700 0.403300 0.896600
+vn -0.122300 0.410400 0.903700
+vn -0.061400 0.414600 0.907900
+vn -0.062100 0.443800 0.893900
+vn 0.000000 0.416000 0.909300
+vn 0.000000 0.445300 0.895400
+vn -0.062800 0.472600 0.879000
+vn -0.125000 0.468300 0.874700
+vn -0.063400 0.500900 0.863200
+vn -0.126200 0.496500 0.858800
+vn 0.000000 0.474100 0.880500
+vn 0.000000 0.502400 0.864600
+vn -0.186700 0.461100 0.867500
+vn -0.188400 0.489200 0.851500
+vn 0.123700 0.439600 0.889600
+vn 0.062100 0.443800 0.893900
+vn 0.061400 0.414600 0.907900
+vn 0.122300 0.410400 0.903700
+vn 0.182700 0.403300 0.896600
+vn 0.184800 0.432400 0.882500
+vn 0.242600 0.393400 0.886700
+vn 0.245300 0.422400 0.872500
+vn 0.186700 0.461100 0.867500
+vn 0.125000 0.468300 0.874700
+vn 0.188400 0.489200 0.851500
+vn 0.126200 0.496500 0.858800
+vn 0.247900 0.451000 0.857400
+vn 0.250200 0.479100 0.841300
+vn 0.062800 0.472600 0.879000
+vn 0.063400 0.500900 0.863200
+vn 0.362800 0.394300 0.844400
+vn 0.304800 0.409700 0.859800
+vn 0.301400 0.380800 0.874100
+vn 0.358600 0.365600 0.858900
+vn 0.414400 0.347700 0.841000
+vn 0.419100 0.376200 0.826300
+vn 0.468600 0.327200 0.820600
+vn 0.474000 0.355500 0.805600
+vn 0.423500 0.404200 0.810700
+vn 0.366500 0.422500 0.828900
+vn 0.427400 0.431900 0.794200
+vn 0.369900 0.450300 0.812600
+vn 0.478900 0.383300 0.789700
+vn 0.483300 0.410800 0.773100
+vn 0.308000 0.438100 0.844500
+vn 0.310800 0.466000 0.828300
+vn 0.577100 0.306800 0.756900
+vn 0.526800 0.332300 0.782300
+vn 0.520800 0.304300 0.797600
+vn 0.570500 0.279100 0.772400
+vn 0.617800 0.251600 0.745000
+vn 0.625000 0.279000 0.729100
+vn 0.662700 0.221900 0.715200
+vn 0.670300 0.248900 0.699000
+vn 0.631400 0.306000 0.712500
+vn 0.583100 0.334100 0.740500
+vn 0.637200 0.332800 0.695100
+vn 0.588400 0.361100 0.723400
+vn 0.677300 0.275700 0.682100
+vn 0.683500 0.302200 0.664400
+vn 0.532200 0.359900 0.766300
+vn 0.537100 0.387100 0.749400
+vn 0.752100 0.183000 0.633100
+vn 0.712800 0.216900 0.667000
+vn 0.704700 0.190200 0.683500
+vn 0.743500 0.156700 0.650100
+vn 0.779200 0.121600 0.614900
+vn 0.788100 0.147400 0.597500
+vn 0.811600 0.084700 0.578000
+vn 0.821000 0.110100 0.560200
+vn 0.796300 0.173100 0.579500
+vn 0.759900 0.209100 0.615500
+vn 0.803600 0.198700 0.560900
+vn 0.766900 0.235000 0.597200
+vn 0.829500 0.135400 0.541800
+vn 0.837100 0.160600 0.522900
+vn 0.720200 0.243300 0.649700
+vn 0.726800 0.269400 0.631700
+vn 0.875800 0.031500 0.481600
+vn 0.850300 0.071400 0.521400
+vn 0.840600 0.046400 0.539700
+vn 0.865800 0.006900 0.500200
+vn 0.887400 -0.033500 0.459800
+vn 0.897600 -0.009500 0.440600
+vn 0.905200 -0.075100 0.418200
+vn 0.915700 -0.051500 0.398500
+vn 0.906900 0.014600 0.421000
+vn 0.884900 0.056000 0.462400
+vn 0.915300 0.038700 0.400900
+vn 0.893000 0.080400 0.442700
+vn 0.925200 -0.027900 0.378500
+vn 0.933700 -0.004200 0.358000
+vn 0.859100 0.096300 0.502700
+vn 0.867000 0.121100 0.483400
+vn 0.939900 -0.137500 0.312500
+vn 0.929800 -0.094300 0.355700
+vn 0.919200 -0.117500 0.375800
+vn 0.929200 -0.160100 0.333100
+vn 0.935100 -0.203200 0.290100
+vn 0.946000 -0.181100 0.269000
+vn 0.937200 -0.246700 0.246700
+vn 0.948000 -0.225000 0.225000
+vn 0.955700 -0.158800 0.247600
+vn 0.949600 -0.114800 0.291600
+vn 0.964500 -0.136300 0.225900
+vn 0.958300 -0.091900 0.270300
+vn 0.957800 -0.203200 0.203200
+vn 0.939400 -0.071100 0.335200
+vn 0.948100 -0.047900 0.314400
+vn 0.939900 -0.312500 0.137500
+vn 0.946000 -0.269000 0.181100
+vn 0.935100 -0.290100 0.203200
+vn 0.929200 -0.333100 0.160100
+vn 0.919200 -0.375800 0.117500
+vn 0.929800 -0.355700 0.094300
+vn 0.905200 -0.418200 0.075100
+vn 0.915700 -0.398500 0.051500
+vn 0.939400 -0.335200 0.071100
+vn 0.949600 -0.291600 0.114800
+vn 0.948100 -0.314400 0.047900
+vn 0.958300 -0.270300 0.091900
+vn 0.925200 -0.378500 0.027900
+vn 0.933700 -0.358000 0.004200
+vn 0.955700 -0.247600 0.158800
+vn 0.964500 -0.225900 0.136300
+vn 0.875800 -0.481600 -0.031500
+vn 0.897600 -0.440600 0.009500
+vn 0.887400 -0.459800 0.033500
+vn 0.865800 -0.500200 -0.006900
+vn 0.840600 -0.539700 -0.046300
+vn 0.850300 -0.521400 -0.071400
+vn 0.811600 -0.578000 -0.084700
+vn 0.821000 -0.560200 -0.110100
+vn 0.859100 -0.502700 -0.096300
+vn 0.884900 -0.462400 -0.056000
+vn 0.867000 -0.483400 -0.121100
+vn 0.893000 -0.442700 -0.080400
+vn 0.829500 -0.541800 -0.135400
+vn 0.837100 -0.522900 -0.160600
+vn 0.906900 -0.421000 -0.014600
+vn 0.915300 -0.400900 -0.038700
+vn 0.752100 -0.633100 -0.183000
+vn 0.788100 -0.597500 -0.147400
+vn 0.779200 -0.614900 -0.121600
+vn 0.743500 -0.650100 -0.156700
+vn 0.704700 -0.683500 -0.190200
+vn 0.712800 -0.667000 -0.216900
+vn 0.662700 -0.715200 -0.221900
+vn 0.670300 -0.699000 -0.248900
+vn 0.720200 -0.649700 -0.243300
+vn 0.759900 -0.615500 -0.209100
+vn 0.726800 -0.631700 -0.269400
+vn 0.766900 -0.597200 -0.235000
+vn 0.677300 -0.682100 -0.275700
+vn 0.683500 -0.664400 -0.302200
+vn 0.796300 -0.579500 -0.173100
+vn 0.803600 -0.560900 -0.198700
+vn 0.577100 -0.756900 -0.306800
+vn 0.625000 -0.729100 -0.279000
+vn 0.617800 -0.745000 -0.251600
+vn 0.570500 -0.772400 -0.279100
+vn 0.520800 -0.797600 -0.304300
+vn 0.526800 -0.782300 -0.332300
+vn 0.468600 -0.820600 -0.327200
+vn 0.474000 -0.805600 -0.355500
+vn 0.532200 -0.766300 -0.359900
+vn 0.583100 -0.740500 -0.334100
+vn 0.537100 -0.749400 -0.387100
+vn 0.588400 -0.723400 -0.361100
+vn 0.478900 -0.789700 -0.383300
+vn 0.483300 -0.773100 -0.410800
+vn 0.631400 -0.712500 -0.306000
+vn 0.637200 -0.695100 -0.332800
+vn 0.362800 -0.844400 -0.394300
+vn 0.419100 -0.826300 -0.376200
+vn 0.414400 -0.841000 -0.347700
+vn 0.358600 -0.858900 -0.365600
+vn 0.301400 -0.874100 -0.380800
+vn 0.304800 -0.859800 -0.409700
+vn 0.242600 -0.886700 -0.393400
+vn 0.245300 -0.872500 -0.422400
+vn 0.308000 -0.844500 -0.438100
+vn 0.366500 -0.828900 -0.422500
+vn 0.310800 -0.828300 -0.466000
+vn 0.369900 -0.812600 -0.450300
+vn 0.247900 -0.857400 -0.451000
+vn 0.250200 -0.841300 -0.479100
+vn 0.423500 -0.810700 -0.404200
+vn 0.427400 -0.794200 -0.431900
+vn 0.123700 -0.889600 -0.439600
+vn 0.184800 -0.882500 -0.432400
+vn 0.182700 -0.896600 -0.403300
+vn 0.122300 -0.903700 -0.410400
+vn 0.061400 -0.907900 -0.414600
+vn 0.062100 -0.893900 -0.443800
+vn 0.000000 -0.909300 -0.416000
+vn 0.000000 -0.895400 -0.445300
+vn 0.062800 -0.879000 -0.472600
+vn 0.125000 -0.874700 -0.468300
+vn 0.063400 -0.863200 -0.500900
+vn 0.126200 -0.858800 -0.496500
+vn 0.000000 -0.880500 -0.474000
+vn 0.000000 -0.864600 -0.502400
+vn 0.186700 -0.867500 -0.461100
+vn 0.188400 -0.851500 -0.489200
+vn -0.123700 -0.889600 -0.439600
+vn -0.062100 -0.893900 -0.443800
+vn -0.061400 -0.907900 -0.414600
+vn -0.122300 -0.903700 -0.410400
+vn -0.182700 -0.896600 -0.403300
+vn -0.184800 -0.882500 -0.432400
+vn -0.242500 -0.886700 -0.393400
+vn -0.245300 -0.872500 -0.422400
+vn -0.186700 -0.867500 -0.461100
+vn -0.125000 -0.874700 -0.468300
+vn -0.188400 -0.851500 -0.489200
+vn -0.126200 -0.858800 -0.496500
+vn -0.247900 -0.857400 -0.451000
+vn -0.250200 -0.841300 -0.479100
+vn -0.062800 -0.879000 -0.472600
+vn -0.063400 -0.863200 -0.500900
+vn -0.362800 -0.844400 -0.394300
+vn -0.304800 -0.859800 -0.409700
+vn -0.301400 -0.874100 -0.380800
+vn -0.358600 -0.858900 -0.365600
+vn -0.414400 -0.841000 -0.347700
+vn -0.419100 -0.826300 -0.376200
+vn -0.468600 -0.820600 -0.327200
+vn -0.474000 -0.805600 -0.355500
+vn -0.423500 -0.810700 -0.404200
+vn -0.366500 -0.828900 -0.422500
+vn -0.427400 -0.794200 -0.431900
+vn -0.369900 -0.812600 -0.450300
+vn -0.478900 -0.789700 -0.383300
+vn -0.483300 -0.773100 -0.410800
+vn -0.308000 -0.844500 -0.438100
+vn -0.310800 -0.828300 -0.466000
+vn -0.577100 -0.756900 -0.306800
+vn -0.526800 -0.782300 -0.332300
+vn -0.520800 -0.797600 -0.304300
+vn -0.570500 -0.772400 -0.279100
+vn -0.617800 -0.745000 -0.251600
+vn -0.625000 -0.729100 -0.279000
+vn -0.662700 -0.715200 -0.221900
+vn -0.670300 -0.699000 -0.248900
+vn -0.631400 -0.712500 -0.306000
+vn -0.583100 -0.740500 -0.334100
+vn -0.637200 -0.695100 -0.332800
+vn -0.588400 -0.723400 -0.361100
+vn -0.677300 -0.682100 -0.275700
+vn -0.683500 -0.664400 -0.302200
+vn -0.532200 -0.766300 -0.359900
+vn -0.537100 -0.749400 -0.387100
+vn -0.752100 -0.633100 -0.183000
+vn -0.712800 -0.667000 -0.216900
+vn -0.704700 -0.683500 -0.190200
+vn -0.743500 -0.650100 -0.156700
+vn -0.779100 -0.614900 -0.121600
+vn -0.788100 -0.597500 -0.147400
+vn -0.811600 -0.578000 -0.084700
+vn -0.821000 -0.560200 -0.110100
+vn -0.796300 -0.579500 -0.173100
+vn -0.759900 -0.615500 -0.209100
+vn -0.803600 -0.560900 -0.198700
+vn -0.766900 -0.597200 -0.235000
+vn -0.829500 -0.541800 -0.135400
+vn -0.837100 -0.522900 -0.160600
+vn -0.720200 -0.649700 -0.243300
+vn -0.726800 -0.631700 -0.269400
+vn -0.875800 -0.481600 -0.031500
+vn -0.850300 -0.521400 -0.071300
+vn -0.840600 -0.539700 -0.046300
+vn -0.865800 -0.500300 -0.006900
+vn -0.887400 -0.459800 0.033500
+vn -0.897600 -0.440600 0.009500
+vn -0.905200 -0.418200 0.075100
+vn -0.915700 -0.398500 0.051500
+vn -0.906900 -0.421000 -0.014600
+vn -0.884900 -0.462400 -0.056000
+vn -0.915300 -0.400900 -0.038700
+vn -0.893000 -0.442700 -0.080400
+vn -0.925200 -0.378500 0.027900
+vn -0.933700 -0.358000 0.004200
+vn -0.859100 -0.502600 -0.096300
+vn -0.867000 -0.483400 -0.121100
+vn -0.939900 -0.312500 0.137500
+vn -0.929800 -0.355700 0.094300
+vn -0.919200 -0.375800 0.117500
+vn -0.929200 -0.333100 0.160100
+vn -0.935100 -0.290100 0.203200
+vn -0.946000 -0.269000 0.181100
+vn -0.937200 -0.246700 0.246700
+vn -0.948000 -0.225000 0.225000
+vn -0.955700 -0.247600 0.158800
+vn -0.949600 -0.291600 0.114800
+vn -0.964500 -0.225900 0.136300
+vn -0.958300 -0.270300 0.091900
+vn -0.957800 -0.203200 0.203200
+vn -0.939400 -0.335200 0.071100
+vn -0.948100 -0.314400 0.047900
+vn -0.939900 -0.137500 0.312500
+vn -0.946000 -0.181100 0.269000
+vn -0.935100 -0.203200 0.290100
+vn -0.929200 -0.160100 0.333100
+vn -0.919200 -0.117500 0.375800
+vn -0.929800 -0.094300 0.355700
+vn -0.939400 -0.071100 0.335200
+vn -0.949600 -0.114800 0.291600
+vn -0.948100 -0.047900 0.314400
+vn -0.958300 -0.091900 0.270300
+vn -0.955700 -0.158800 0.247600
+vn -0.964500 -0.136300 0.225900
+vn -0.906500 0.129000 0.402000
+vn -0.929100 0.086600 0.359600
+vn -0.922700 0.062700 0.380400
+vn -0.900200 0.104800 0.422500
+vn -0.947800 0.043100 0.316000
+vn -0.941200 0.019400 0.337200
+vn -0.874000 0.145800 0.463500
+vn -0.880100 0.170300 0.443300
+vn -0.843900 0.185600 0.503400
+vn -0.849700 0.210400 0.483400
+vn -0.885200 0.194600 0.422500
+vn -0.911800 0.153100 0.381000
+vn -0.889400 0.218700 0.401300
+vn -0.916100 0.177000 0.359600
+vn -0.854700 0.235000 0.462900
+vn -0.858800 0.259300 0.441900
+vn -0.934500 0.110400 0.338400
+vn -0.953300 0.066700 0.294600
+vn -0.938900 0.134200 0.316800
+vn -0.957800 0.090200 0.272800
+vn -0.778400 0.285900 0.558800
+vn -0.815700 0.249000 0.522000
+vn -0.810100 0.224000 0.541700
+vn -0.773100 0.260600 0.578300
+vn -0.732700 0.295300 0.613100
+vn -0.737800 0.320900 0.593900
+vn -0.689000 0.328300 0.646100
+vn -0.693800 0.354100 0.627100
+vn -0.742100 0.346100 0.574000
+vn -0.783000 0.310900 0.538800
+vn -0.745600 0.371000 0.553500
+vn -0.786700 0.335600 0.518100
+vn -0.697800 0.379500 0.607400
+vn -0.701200 0.404500 0.587100
+vn -0.820500 0.273800 0.501800
+vn -0.824400 0.298300 0.480900
+vn -0.597300 0.413900 0.686900
+vn -0.646800 0.385200 0.658200
+vn -0.642400 0.359200 0.677000
+vn -0.593200 0.387700 0.705500
+vn -0.541500 0.414000 0.731700
+vn -0.545200 0.440300 0.713300
+vn -0.487200 0.437800 0.755600
+vn -0.490600 0.464300 0.737300
+vn -0.548400 0.466200 0.694100
+vn -0.600800 0.439700 0.667600
+vn -0.551000 0.491700 0.674200
+vn -0.603700 0.465000 0.647600
+vn -0.493500 0.490400 0.718300
+vn -0.495800 0.515900 0.698500
+vn -0.650600 0.410800 0.638700
+vn -0.653700 0.435900 0.618500
+vn -0.375500 0.504500 0.777500
+vn -0.433800 0.485800 0.758800
+vn -0.430800 0.459100 0.776900
+vn -0.372900 0.477700 0.795400
+vn -0.313300 0.493500 0.811300
+vn -0.315500 0.520500 0.793400
+vn -0.252200 0.506700 0.824400
+vn -0.253900 0.533700 0.806600
+vn -0.317400 0.546800 0.774700
+vn -0.377700 0.530800 0.758700
+vn -0.318900 0.572600 0.755200
+vn -0.379500 0.556500 0.739100
+vn -0.255400 0.560100 0.788000
+vn -0.256600 0.586000 0.768600
+vn -0.436400 0.511900 0.739900
+vn -0.438500 0.537600 0.720200
+vn -0.128100 0.551400 0.824300
+vn -0.191300 0.544000 0.817000
+vn -0.189900 0.516900 0.834700
+vn -0.127200 0.524200 0.842000
+vn -0.063800 0.528600 0.846400
+vn -0.064300 0.555800 0.828800
+vn 0.000000 0.530100 0.847900
+vn 0.000000 0.557300 0.830300
+vn -0.064700 0.582400 0.810300
+vn -0.128800 0.577900 0.805800
+vn -0.065000 0.608400 0.791000
+vn -0.129400 0.603900 0.786500
+vn 0.000000 0.583900 0.811800
+vn 0.000000 0.609900 0.792500
+vn -0.192400 0.570500 0.798400
+vn -0.193300 0.596400 0.779000
+vn 0.128100 0.551400 0.824300
+vn 0.064300 0.555800 0.828800
+vn 0.063800 0.528600 0.846400
+vn 0.127200 0.524200 0.842000
+vn 0.189900 0.516900 0.834700
+vn 0.191300 0.544000 0.817000
+vn 0.252200 0.506600 0.824400
+vn 0.253900 0.533600 0.806600
+vn 0.192400 0.570500 0.798400
+vn 0.128800 0.577900 0.805800
+vn 0.193300 0.596400 0.779000
+vn 0.129400 0.603900 0.786500
+vn 0.255400 0.560100 0.788000
+vn 0.256600 0.586000 0.768600
+vn 0.064700 0.582400 0.810300
+vn 0.065000 0.608400 0.791000
+vn 0.375500 0.504500 0.777500
+vn 0.315500 0.520500 0.793400
+vn 0.313300 0.493500 0.811300
+vn 0.372900 0.477700 0.795400
+vn 0.430800 0.459100 0.776900
+vn 0.433800 0.485800 0.758800
+vn 0.487200 0.437800 0.755600
+vn 0.490600 0.464300 0.737300
+vn 0.436400 0.511900 0.739900
+vn 0.377700 0.530800 0.758700
+vn 0.438500 0.537600 0.720200
+vn 0.379500 0.556500 0.739100
+vn 0.493500 0.490400 0.718300
+vn 0.495800 0.515900 0.698500
+vn 0.317400 0.546800 0.774700
+vn 0.318900 0.572600 0.755200
+vn 0.597300 0.413900 0.686900
+vn 0.545200 0.440300 0.713300
+vn 0.541500 0.414000 0.731700
+vn 0.593200 0.387700 0.705500
+vn 0.642400 0.359200 0.677000
+vn 0.646800 0.385200 0.658200
+vn 0.689000 0.328300 0.646100
+vn 0.693800 0.354100 0.627100
+vn 0.650600 0.410800 0.638700
+vn 0.600800 0.439700 0.667600
+vn 0.653700 0.435900 0.618500
+vn 0.603700 0.465000 0.647600
+vn 0.697800 0.379500 0.607400
+vn 0.701200 0.404500 0.587100
+vn 0.548400 0.466200 0.694100
+vn 0.551000 0.491700 0.674200
+vn 0.778400 0.285900 0.558800
+vn 0.737800 0.320900 0.593900
+vn 0.732700 0.295300 0.613100
+vn 0.773100 0.260600 0.578300
+vn 0.810100 0.224000 0.541700
+vn 0.815700 0.249000 0.522000
+vn 0.843900 0.185600 0.503400
+vn 0.849700 0.210400 0.483400
+vn 0.820500 0.273800 0.501800
+vn 0.783000 0.310900 0.538800
+vn 0.824400 0.298300 0.480900
+vn 0.786700 0.335600 0.518100
+vn 0.854700 0.235000 0.462900
+vn 0.858800 0.259300 0.441900
+vn 0.742100 0.346100 0.574000
+vn 0.745600 0.371000 0.553500
+vn 0.906500 0.129000 0.402000
+vn 0.880100 0.170300 0.443300
+vn 0.874000 0.145800 0.463500
+vn 0.900200 0.104800 0.422500
+vn 0.922700 0.062700 0.380400
+vn 0.929100 0.086600 0.359600
+vn 0.941200 0.019400 0.337200
+vn 0.947800 0.043100 0.316000
+vn 0.934500 0.110400 0.338400
+vn 0.911800 0.153100 0.381000
+vn 0.938900 0.134200 0.316800
+vn 0.916100 0.177000 0.359600
+vn 0.953300 0.066700 0.294600
+vn 0.957800 0.090200 0.272800
+vn 0.885200 0.194600 0.422500
+vn 0.889400 0.218700 0.401300
+vn 0.972800 -0.045900 0.227000
+vn 0.962300 -0.001200 0.271700
+vn 0.955700 -0.024500 0.293200
+vn 0.966100 -0.068900 0.248800
+vn 0.972300 -0.113700 0.204000
+vn 0.979100 -0.091000 0.182000
+vn 0.984800 -0.068200 0.159700
+vn 0.978500 -0.022900 0.205000
+vn 0.989500 -0.045300 0.137200
+vn 0.983100 0.000200 0.182800
+vn 0.968000 0.022100 0.250000
+vn 0.972600 0.045400 0.228000
+vn 0.972800 -0.227000 0.045900
+vn 0.979100 -0.182000 0.091000
+vn 0.972300 -0.204000 0.113700
+vn 0.966100 -0.248800 0.068900
+vn 0.955700 -0.293200 0.024500
+vn 0.962300 -0.271700 0.001200
+vn 0.941200 -0.337200 -0.019400
+vn 0.947800 -0.316000 -0.043100
+vn 0.968000 -0.250000 -0.022100
+vn 0.978500 -0.205000 0.022900
+vn 0.972600 -0.228000 -0.045400
+vn 0.983100 -0.182800 -0.000200
+vn 0.953300 -0.294600 -0.066700
+vn 0.957800 -0.272800 -0.090200
+vn 0.984800 -0.159700 0.068200
+vn 0.989500 -0.137200 0.045300
+vn 0.906500 -0.402000 -0.129000
+vn 0.929100 -0.359600 -0.086600
+vn 0.922700 -0.380400 -0.062700
+vn 0.900200 -0.422500 -0.104800
+vn 0.874000 -0.463500 -0.145800
+vn 0.880100 -0.443300 -0.170300
+vn 0.843900 -0.503400 -0.185600
+vn 0.849700 -0.483400 -0.210400
+vn 0.885200 -0.422500 -0.194600
+vn 0.911800 -0.381000 -0.153100
+vn 0.889400 -0.401300 -0.218700
+vn 0.916100 -0.359600 -0.177000
+vn 0.854700 -0.462900 -0.235000
+vn 0.858800 -0.441900 -0.259300
+vn 0.934500 -0.338400 -0.110400
+vn 0.938900 -0.316800 -0.134200
+vn 0.778400 -0.558800 -0.285900
+vn 0.815700 -0.522000 -0.249000
+vn 0.810100 -0.541700 -0.224000
+vn 0.773100 -0.578300 -0.260600
+vn 0.732700 -0.613100 -0.295300
+vn 0.737800 -0.593900 -0.320900
+vn 0.689000 -0.646100 -0.328300
+vn 0.693800 -0.627100 -0.354100
+vn 0.742100 -0.574000 -0.346100
+vn 0.783000 -0.538800 -0.310900
+vn 0.745600 -0.553500 -0.370900
+vn 0.786700 -0.518100 -0.335600
+vn 0.697800 -0.607400 -0.379500
+vn 0.701200 -0.587100 -0.404500
+vn 0.820500 -0.501800 -0.273800
+vn 0.824400 -0.480900 -0.298300
+vn 0.597300 -0.686900 -0.413900
+vn 0.646800 -0.658200 -0.385200
+vn 0.642400 -0.677000 -0.359200
+vn 0.593200 -0.705500 -0.387700
+vn 0.541500 -0.731700 -0.414000
+vn 0.545200 -0.713300 -0.440300
+vn 0.487200 -0.755600 -0.437800
+vn 0.490600 -0.737300 -0.464300
+vn 0.548400 -0.694100 -0.466200
+vn 0.600800 -0.667600 -0.439700
+vn 0.551000 -0.674200 -0.491700
+vn 0.603700 -0.647600 -0.465000
+vn 0.493500 -0.718300 -0.490400
+vn 0.495800 -0.698500 -0.515900
+vn 0.650600 -0.638700 -0.410800
+vn 0.653700 -0.618500 -0.435900
+vn 0.375500 -0.777500 -0.504500
+vn 0.433800 -0.758800 -0.485800
+vn 0.430800 -0.776900 -0.459100
+vn 0.372900 -0.795400 -0.477700
+vn 0.313300 -0.811300 -0.493500
+vn 0.315500 -0.793400 -0.520500
+vn 0.252200 -0.824400 -0.506600
+vn 0.253900 -0.806600 -0.533600
+vn 0.317400 -0.774700 -0.546800
+vn 0.377700 -0.758700 -0.530800
+vn 0.318900 -0.755200 -0.572600
+vn 0.379500 -0.739100 -0.556500
+vn 0.255400 -0.788000 -0.560100
+vn 0.256600 -0.768600 -0.586000
+vn 0.436400 -0.739900 -0.511900
+vn 0.438500 -0.720200 -0.537600
+vn 0.128100 -0.824300 -0.551400
+vn 0.191300 -0.817000 -0.544000
+vn 0.189900 -0.834700 -0.516900
+vn 0.127200 -0.842000 -0.524200
+vn 0.063800 -0.846400 -0.528600
+vn 0.064300 -0.828800 -0.555800
+vn 0.000000 -0.847900 -0.530100
+vn 0.000000 -0.830300 -0.557300
+vn 0.064700 -0.810300 -0.582400
+vn 0.128800 -0.805800 -0.577900
+vn 0.065000 -0.790900 -0.608400
+vn 0.129400 -0.786500 -0.603900
+vn 0.000000 -0.811800 -0.583900
+vn 0.000000 -0.792500 -0.609900
+vn 0.192400 -0.798400 -0.570500
+vn 0.193300 -0.779000 -0.596400
+vn -0.128100 -0.824300 -0.551400
+vn -0.064300 -0.828800 -0.555800
+vn -0.063800 -0.846400 -0.528600
+vn -0.127200 -0.842000 -0.524200
+vn -0.189900 -0.834700 -0.516900
+vn -0.191300 -0.817000 -0.544000
+vn -0.252200 -0.824400 -0.506600
+vn -0.253900 -0.806600 -0.533600
+vn -0.192400 -0.798400 -0.570500
+vn -0.128800 -0.805800 -0.577900
+vn -0.193300 -0.779000 -0.596400
+vn -0.129400 -0.786500 -0.603900
+vn -0.255400 -0.788000 -0.560100
+vn -0.256600 -0.768600 -0.586000
+vn -0.064700 -0.810300 -0.582400
+vn -0.065000 -0.791000 -0.608400
+vn -0.375500 -0.777500 -0.504500
+vn -0.315500 -0.793400 -0.520500
+vn -0.313300 -0.811300 -0.493500
+vn -0.372900 -0.795400 -0.477700
+vn -0.430800 -0.776900 -0.459100
+vn -0.433800 -0.758800 -0.485800
+vn -0.487200 -0.755600 -0.437800
+vn -0.490600 -0.737300 -0.464300
+vn -0.436400 -0.739900 -0.511900
+vn -0.377700 -0.758700 -0.530700
+vn -0.438500 -0.720200 -0.537600
+vn -0.379500 -0.739100 -0.556500
+vn -0.493500 -0.718300 -0.490400
+vn -0.495800 -0.698500 -0.515900
+vn -0.317400 -0.774700 -0.546800
+vn -0.318900 -0.755200 -0.572600
+vn -0.597300 -0.686900 -0.413900
+vn -0.545200 -0.713300 -0.440300
+vn -0.541500 -0.731700 -0.414000
+vn -0.593200 -0.705500 -0.387700
+vn -0.642400 -0.677000 -0.359200
+vn -0.646800 -0.658200 -0.385200
+vn -0.689000 -0.646100 -0.328300
+vn -0.693800 -0.627100 -0.354100
+vn -0.650600 -0.638700 -0.410800
+vn -0.600800 -0.667600 -0.439700
+vn -0.653700 -0.618500 -0.435900
+vn -0.603700 -0.647600 -0.465000
+vn -0.697800 -0.607400 -0.379500
+vn -0.701200 -0.587100 -0.404500
+vn -0.548400 -0.694100 -0.466200
+vn -0.551000 -0.674200 -0.491700
+vn -0.778400 -0.558800 -0.285900
+vn -0.737800 -0.593900 -0.320900
+vn -0.732700 -0.613100 -0.295300
+vn -0.773100 -0.578300 -0.260600
+vn -0.810100 -0.541700 -0.224000
+vn -0.815700 -0.522000 -0.249000
+vn -0.843900 -0.503400 -0.185600
+vn -0.849700 -0.483400 -0.210400
+vn -0.820500 -0.501800 -0.273800
+vn -0.783000 -0.538800 -0.310900
+vn -0.824400 -0.480900 -0.298300
+vn -0.786700 -0.518100 -0.335600
+vn -0.854700 -0.462900 -0.235000
+vn -0.858800 -0.441900 -0.259300
+vn -0.742100 -0.574000 -0.346100
+vn -0.745600 -0.553500 -0.370900
+vn -0.906500 -0.402000 -0.129000
+vn -0.880100 -0.443300 -0.170300
+vn -0.874000 -0.463500 -0.145800
+vn -0.900200 -0.422500 -0.104800
+vn -0.922700 -0.380400 -0.062700
+vn -0.929100 -0.359600 -0.086600
+vn -0.941200 -0.337200 -0.019400
+vn -0.947800 -0.316000 -0.043100
+vn -0.934500 -0.338400 -0.110400
+vn -0.911800 -0.381000 -0.153100
+vn -0.938900 -0.316800 -0.134200
+vn -0.916100 -0.359600 -0.177000
+vn -0.953300 -0.294600 -0.066700
+vn -0.957800 -0.272800 -0.090200
+vn -0.885200 -0.422500 -0.194600
+vn -0.889400 -0.401300 -0.218700
+vn -0.972800 -0.227000 0.045900
+vn -0.962300 -0.271700 0.001200
+vn -0.955700 -0.293200 0.024500
+vn -0.966100 -0.248800 0.068900
+vn -0.972300 -0.204000 0.113700
+vn -0.979100 -0.182000 0.091000
+vn -0.974400 -0.158800 0.158900
+vn -0.984800 -0.159700 0.068200
+vn -0.978500 -0.205000 0.022900
+vn -0.989500 -0.137200 0.045300
+vn -0.983100 -0.182800 -0.000200
+vn -0.968000 -0.250000 -0.022100
+vn -0.972600 -0.228000 -0.045400
+vn -0.972800 -0.045900 0.227000
+vn -0.979100 -0.091000 0.182000
+vn -0.972300 -0.113700 0.204000
+vn -0.966100 -0.068900 0.248800
+vn -0.955700 -0.024500 0.293200
+vn -0.962300 -0.001200 0.271700
+vn -0.968000 0.022100 0.250000
+vn -0.978500 -0.022900 0.205100
+vn -0.972600 0.045400 0.228000
+vn -0.983100 0.000200 0.182800
+vn -0.984800 -0.068200 0.159700
+vn -0.989500 -0.045300 0.137200
+vn -0.921900 0.224300 0.315700
+vn -0.944900 0.181200 0.272600
+vn -0.942400 0.157800 0.294800
+vn -0.919500 0.200800 0.337800
+vn -0.963900 0.136900 0.228400
+vn -0.961400 0.113600 0.250700
+vn -0.892700 0.242600 0.379700
+vn -0.895000 0.266200 0.357700
+vn -0.861900 0.283300 0.420400
+vn -0.864200 0.307000 0.398500
+vn -0.896500 0.289600 0.335400
+vn -0.923400 0.247500 0.293300
+vn -0.896900 0.312600 0.312600
+vn -0.923900 0.270600 0.270600
+vn -0.865600 0.330500 0.376300
+vn -0.866000 0.353500 0.353500
+vn -0.946400 0.204400 0.250200
+vn -0.965400 0.160000 0.205800
+vn -0.946900 0.227400 0.227400
+vn -0.965900 0.183000 0.183000
+vn -0.791700 0.383800 0.475300
+vn -0.829600 0.346400 0.437800
+vn -0.827400 0.322500 0.459600
+vn -0.789600 0.359900 0.497000
+vn -0.748400 0.395400 0.532500
+vn -0.750300 0.419400 0.510900
+vn -0.703800 0.429100 0.566200
+vn -0.705600 0.453200 0.544700
+vn -0.751500 0.443000 0.488800
+vn -0.792900 0.407300 0.453100
+vn -0.751900 0.466100 0.466100
+vn -0.793300 0.430400 0.430400
+vn -0.706700 0.476800 0.522600
+vn -0.707100 0.500000 0.500000
+vn -0.830900 0.369800 0.415600
+vn -0.831400 0.392900 0.392900
+vn -0.607500 0.514100 0.605500
+vn -0.657900 0.484800 0.576300
+vn -0.656100 0.460600 0.597700
+vn -0.605900 0.489800 0.626900
+vn -0.553100 0.516600 0.653600
+vn -0.554500 0.540900 0.632400
+vn -0.497600 0.540900 0.678000
+vn -0.498900 0.565300 0.656800
+vn -0.555400 0.564700 0.610500
+vn -0.608400 0.537800 0.583600
+vn -0.555700 0.587900 0.587900
+vn -0.608800 0.561000 0.561000
+vn -0.499700 0.589100 0.634900
+vn -0.500000 0.612400 0.612400
+vn -0.658900 0.508500 0.554300
+vn -0.659200 0.531700 0.531700
+vn -0.381900 0.606200 0.697700
+vn -0.441200 0.587100 0.678600
+vn -0.440100 0.562700 0.699800
+vn -0.380900 0.581700 0.718700
+vn -0.320000 0.597800 0.734900
+vn -0.320900 0.622400 0.713900
+vn -0.257600 0.611200 0.748300
+vn -0.258200 0.635800 0.727300
+vn -0.321400 0.646300 0.692100
+vn -0.382500 0.630000 0.675800
+vn -0.321500 0.669500 0.669500
+vn -0.382700 0.653300 0.653300
+vn -0.258700 0.659700 0.705500
+vn -0.258800 0.683000 0.683000
+vn -0.441900 0.611000 0.656800
+vn -0.442200 0.634200 0.634200
+vn -0.130200 0.653800 0.745300
+vn -0.194500 0.646300 0.737800
+vn -0.194000 0.621700 0.758800
+vn -0.129900 0.629200 0.766300
+vn -0.065200 0.633700 0.770800
+vn -0.065400 0.658300 0.749800
+vn 0.000000 0.635200 0.772300
+vn 0.000000 0.659900 0.751400
+vn -0.065500 0.682300 0.728100
+vn -0.130400 0.677800 0.723600
+vn -0.065500 0.705600 0.705600
+vn -0.130500 0.701000 0.701000
+vn 0.000000 0.683800 0.729600
+vn -0.194800 0.670300 0.716100
+vn -0.194900 0.693500 0.693500
+vn 0.130200 0.653800 0.745300
+vn 0.065400 0.658300 0.749800
+vn 0.065200 0.633700 0.770800
+vn 0.129900 0.629200 0.766300
+vn 0.194000 0.621700 0.758800
+vn 0.194500 0.646300 0.737800
+vn 0.257600 0.611200 0.748300
+vn 0.258200 0.635800 0.727300
+vn 0.194800 0.670300 0.716100
+vn 0.130400 0.677800 0.723600
+vn 0.194900 0.693500 0.693500
+vn 0.130500 0.701000 0.701000
+vn 0.258700 0.659700 0.705500
+vn 0.258800 0.683000 0.683000
+vn 0.065500 0.682300 0.728100
+vn 0.065500 0.705600 0.705600
+vn 0.381900 0.606200 0.697700
+vn 0.320900 0.622400 0.713900
+vn 0.320000 0.597800 0.734900
+vn 0.380900 0.581700 0.718700
+vn 0.440100 0.562700 0.699800
+vn 0.441200 0.587100 0.678600
+vn 0.497600 0.540900 0.678000
+vn 0.498900 0.565300 0.656800
+vn 0.441900 0.611000 0.656800
+vn 0.382500 0.630000 0.675800
+vn 0.442200 0.634200 0.634200
+vn 0.382700 0.653300 0.653300
+vn 0.499700 0.589100 0.634900
+vn 0.500000 0.612400 0.612400
+vn 0.321400 0.646300 0.692100
+vn 0.321500 0.669500 0.669500
+vn 0.607500 0.514100 0.605500
+vn 0.554500 0.540900 0.632400
+vn 0.553100 0.516600 0.653600
+vn 0.605900 0.489800 0.626900
+vn 0.656100 0.460600 0.597700
+vn 0.657900 0.484800 0.576300
+vn 0.703800 0.429100 0.566200
+vn 0.705600 0.453200 0.544700
+vn 0.658900 0.508500 0.554300
+vn 0.608400 0.537800 0.583600
+vn 0.659200 0.531700 0.531700
+vn 0.608800 0.561000 0.561000
+vn 0.706700 0.476800 0.522600
+vn 0.707100 0.500000 0.500000
+vn 0.555400 0.564700 0.610500
+vn 0.555700 0.587900 0.587900
+vn 0.791700 0.383800 0.475300
+vn 0.750300 0.419400 0.510900
+vn 0.748400 0.395400 0.532500
+vn 0.789600 0.359900 0.497000
+vn 0.827400 0.322500 0.459600
+vn 0.829600 0.346400 0.437800
+vn 0.861900 0.283300 0.420400
+vn 0.864200 0.307000 0.398500
+vn 0.830900 0.369800 0.415600
+vn 0.792900 0.407300 0.453100
+vn 0.831400 0.392900 0.392900
+vn 0.793300 0.430400 0.430400
+vn 0.865600 0.330500 0.376300
+vn 0.866000 0.353500 0.353500
+vn 0.751500 0.443000 0.488800
+vn 0.751900 0.466100 0.466100
+vn 0.921900 0.224300 0.315700
+vn 0.895000 0.266200 0.357700
+vn 0.892700 0.242600 0.379700
+vn 0.919500 0.200800 0.337800
+vn 0.942400 0.157800 0.294800
+vn 0.944900 0.181200 0.272600
+vn 0.961400 0.113600 0.250700
+vn 0.963900 0.136900 0.228400
+vn 0.946400 0.204400 0.250200
+vn 0.923400 0.247500 0.293300
+vn 0.946900 0.227400 0.227400
+vn 0.923900 0.270600 0.270600
+vn 0.965400 0.160000 0.205800
+vn 0.965900 0.183000 0.183000
+vn 0.896500 0.289600 0.335400
+vn 0.896900 0.312600 0.312600
+vn 0.989300 0.046400 0.137800
+vn 0.978700 0.091800 0.183300
+vn 0.976200 0.068600 0.205700
+vn 0.986800 0.023300 0.160400
+vn 0.993100 -0.022400 0.114700
+vn 0.995800 0.000500 0.092000
+vn 0.997300 0.023400 0.069200
+vn 0.990900 0.069300 0.115100
+vn 0.997800 0.046300 0.046300
+vn 0.991400 0.092300 0.092300
+vn 0.980300 0.114900 0.160600
+vn 0.980800 0.137800 0.137800
+vn 0.989300 -0.137800 -0.046400
+vn 0.995800 -0.092000 -0.000500
+vn 0.993100 -0.114700 0.022400
+vn 0.986800 -0.160400 -0.023300
+vn 0.976200 -0.205700 -0.068600
+vn 0.978700 -0.183300 -0.091800
+vn 0.961400 -0.250700 -0.113600
+vn 0.963900 -0.228400 -0.136900
+vn 0.980300 -0.160600 -0.114900
+vn 0.990900 -0.115100 -0.069300
+vn 0.980800 -0.137900 -0.137800
+vn 0.991400 -0.092300 -0.092300
+vn 0.965400 -0.205800 -0.160000
+vn 0.965900 -0.183000 -0.183000
+vn 0.997300 -0.069200 -0.023400
+vn 0.997800 -0.046300 -0.046300
+vn 0.921900 -0.315700 -0.224300
+vn 0.944900 -0.272600 -0.181200
+vn 0.942400 -0.294800 -0.157800
+vn 0.919500 -0.337800 -0.200800
+vn 0.892700 -0.379700 -0.242600
+vn 0.895000 -0.357700 -0.266200
+vn 0.861900 -0.420400 -0.283300
+vn 0.864200 -0.398500 -0.307000
+vn 0.896500 -0.335400 -0.289600
+vn 0.923400 -0.293300 -0.247500
+vn 0.896900 -0.312600 -0.312600
+vn 0.923900 -0.270600 -0.270600
+vn 0.865600 -0.376300 -0.330500
+vn 0.866000 -0.353500 -0.353500
+vn 0.946400 -0.250200 -0.204400
+vn 0.946900 -0.227400 -0.227400
+vn 0.791700 -0.475300 -0.383800
+vn 0.829600 -0.437800 -0.346400
+vn 0.827400 -0.459600 -0.322500
+vn 0.789600 -0.497000 -0.359900
+vn 0.748400 -0.532500 -0.395400
+vn 0.750300 -0.510900 -0.419400
+vn 0.703800 -0.566200 -0.429100
+vn 0.705600 -0.544700 -0.453200
+vn 0.751500 -0.488800 -0.443000
+vn 0.792900 -0.453100 -0.407300
+vn 0.751900 -0.466100 -0.466100
+vn 0.793300 -0.430400 -0.430400
+vn 0.706700 -0.522600 -0.476800
+vn 0.707100 -0.500000 -0.500000
+vn 0.830900 -0.415600 -0.369800
+vn 0.831400 -0.392900 -0.392900
+vn 0.607500 -0.605500 -0.514100
+vn 0.657900 -0.576300 -0.484800
+vn 0.656100 -0.597700 -0.460600
+vn 0.605900 -0.626900 -0.489800
+vn 0.553100 -0.653600 -0.516600
+vn 0.554500 -0.632400 -0.540900
+vn 0.497600 -0.678000 -0.540900
+vn 0.498900 -0.656800 -0.565300
+vn 0.555400 -0.610500 -0.564700
+vn 0.608400 -0.583600 -0.537800
+vn 0.555700 -0.587900 -0.587900
+vn 0.608800 -0.561000 -0.561000
+vn 0.499700 -0.634900 -0.589100
+vn 0.500000 -0.612400 -0.612400
+vn 0.658900 -0.554300 -0.508500
+vn 0.659200 -0.531700 -0.531700
+vn 0.381900 -0.697700 -0.606200
+vn 0.441200 -0.678600 -0.587100
+vn 0.440100 -0.699800 -0.562700
+vn 0.380900 -0.718700 -0.581700
+vn 0.320000 -0.734900 -0.597800
+vn 0.320900 -0.713900 -0.622400
+vn 0.257600 -0.748300 -0.611200
+vn 0.258200 -0.727300 -0.635800
+vn 0.321400 -0.692100 -0.646300
+vn 0.382500 -0.675800 -0.630000
+vn 0.321500 -0.669500 -0.669500
+vn 0.382700 -0.653300 -0.653300
+vn 0.258700 -0.705500 -0.659700
+vn 0.258800 -0.683000 -0.683000
+vn 0.441900 -0.656800 -0.611000
+vn 0.442200 -0.634200 -0.634200
+vn 0.130200 -0.745300 -0.653800
+vn 0.194500 -0.737800 -0.646300
+vn 0.194000 -0.758800 -0.621700
+vn 0.129900 -0.766300 -0.629200
+vn 0.065200 -0.770800 -0.633700
+vn 0.065400 -0.749800 -0.658300
+vn 0.000000 -0.772300 -0.635200
+vn 0.000000 -0.751400 -0.659900
+vn 0.065500 -0.728100 -0.682300
+vn 0.130400 -0.723600 -0.677800
+vn 0.065500 -0.705600 -0.705600
+vn 0.130500 -0.701000 -0.701000
+vn 0.000000 -0.729600 -0.683800
+vn 0.194800 -0.716100 -0.670300
+vn 0.194900 -0.693500 -0.693500
+vn -0.130200 -0.745300 -0.653800
+vn -0.065400 -0.749800 -0.658300
+vn -0.065200 -0.770800 -0.633700
+vn -0.129900 -0.766300 -0.629200
+vn -0.194000 -0.758800 -0.621700
+vn -0.194500 -0.737800 -0.646300
+vn -0.257600 -0.748300 -0.611200
+vn -0.258200 -0.727300 -0.635800
+vn -0.194800 -0.716100 -0.670300
+vn -0.130400 -0.723600 -0.677800
+vn -0.194900 -0.693500 -0.693500
+vn -0.130500 -0.701000 -0.701000
+vn -0.258700 -0.705500 -0.659700
+vn -0.258800 -0.683000 -0.683000
+vn -0.065500 -0.728100 -0.682300
+vn -0.065500 -0.705600 -0.705600
+vn -0.381900 -0.697700 -0.606200
+vn -0.320900 -0.713900 -0.622400
+vn -0.320000 -0.734900 -0.597800
+vn -0.380900 -0.718700 -0.581700
+vn -0.440100 -0.699800 -0.562700
+vn -0.441200 -0.678600 -0.587100
+vn -0.497600 -0.678000 -0.540900
+vn -0.498900 -0.656800 -0.565300
+vn -0.441900 -0.656800 -0.611000
+vn -0.382500 -0.675800 -0.630000
+vn -0.442200 -0.634200 -0.634200
+vn -0.382700 -0.653300 -0.653300
+vn -0.499700 -0.634900 -0.589100
+vn -0.500000 -0.612400 -0.612400
+vn -0.321400 -0.692100 -0.646300
+vn -0.321500 -0.669500 -0.669500
+vn -0.607500 -0.605500 -0.514100
+vn -0.554500 -0.632400 -0.540900
+vn -0.553100 -0.653600 -0.516600
+vn -0.605900 -0.626900 -0.489800
+vn -0.656100 -0.597700 -0.460600
+vn -0.657900 -0.576300 -0.484800
+vn -0.703800 -0.566200 -0.429100
+vn -0.705600 -0.544700 -0.453200
+vn -0.658900 -0.554300 -0.508500
+vn -0.608400 -0.583600 -0.537800
+vn -0.659200 -0.531700 -0.531700
+vn -0.608800 -0.561000 -0.561000
+vn -0.706700 -0.522600 -0.476800
+vn -0.707100 -0.500000 -0.500000
+vn -0.555400 -0.610500 -0.564700
+vn -0.555700 -0.587900 -0.587900
+vn -0.791700 -0.475300 -0.383800
+vn -0.750300 -0.510900 -0.419400
+vn -0.748400 -0.532500 -0.395400
+vn -0.789600 -0.497000 -0.359900
+vn -0.827400 -0.459600 -0.322500
+vn -0.829600 -0.437800 -0.346400
+vn -0.861900 -0.420400 -0.283300
+vn -0.864200 -0.398500 -0.307000
+vn -0.830900 -0.415600 -0.369800
+vn -0.792900 -0.453100 -0.407300
+vn -0.831400 -0.392900 -0.392900
+vn -0.793300 -0.430400 -0.430400
+vn -0.865600 -0.376200 -0.330500
+vn -0.866000 -0.353500 -0.353500
+vn -0.751500 -0.488800 -0.443000
+vn -0.751900 -0.466100 -0.466100
+vn -0.921900 -0.315700 -0.224300
+vn -0.895000 -0.357700 -0.266200
+vn -0.892700 -0.379700 -0.242600
+vn -0.919500 -0.337800 -0.200800
+vn -0.942400 -0.294800 -0.157800
+vn -0.944900 -0.272600 -0.181200
+vn -0.961400 -0.250700 -0.113600
+vn -0.963900 -0.228400 -0.136900
+vn -0.946400 -0.250200 -0.204400
+vn -0.923400 -0.293300 -0.247500
+vn -0.946900 -0.227400 -0.227400
+vn -0.923900 -0.270600 -0.270600
+vn -0.965400 -0.205800 -0.160000
+vn -0.965900 -0.183000 -0.183000
+vn -0.896500 -0.335400 -0.289600
+vn -0.896900 -0.312600 -0.312600
+vn -0.989300 -0.137800 -0.046400
+vn -0.978700 -0.183300 -0.091800
+vn -0.976200 -0.205700 -0.068600
+vn -0.986800 -0.160400 -0.023300
+vn -0.993100 -0.114700 0.022400
+vn -0.995800 -0.092000 -0.000500
+vn -0.997300 -0.069200 -0.023400
+vn -0.990900 -0.115100 -0.069300
+vn -0.997800 -0.046300 -0.046300
+vn -0.991400 -0.092300 -0.092300
+vn -0.980300 -0.160600 -0.114900
+vn -0.980800 -0.137800 -0.137800
+vn -0.989300 0.046400 0.137800
+vn -0.995800 0.000500 0.092000
+vn -0.993100 -0.022400 0.114700
+vn -0.986800 0.023300 0.160400
+vn -0.976200 0.068600 0.205700
+vn -0.978700 0.091800 0.183300
+vn -0.980300 0.114900 0.160600
+vn -0.990900 0.069300 0.115100
+vn -0.980800 0.137900 0.137900
+vn -0.991400 0.092300 0.092300
+vn -0.997300 0.023400 0.069200
+vn -0.997800 0.046300 0.046300
+vn -0.921900 0.315700 0.224300
+vn -0.944900 0.272700 0.181200
+vn -0.946400 0.250200 0.204400
+vn -0.923400 0.293300 0.247500
+vn -0.963900 0.228400 0.136900
+vn -0.965400 0.205800 0.160000
+vn -0.896500 0.335400 0.289600
+vn -0.895000 0.357700 0.266200
+vn -0.865600 0.376200 0.330500
+vn -0.864200 0.398500 0.307000
+vn -0.892700 0.379700 0.242600
+vn -0.919500 0.337800 0.200800
+vn -0.889400 0.401300 0.218700
+vn -0.916100 0.359600 0.177000
+vn -0.861900 0.420400 0.283300
+vn -0.858800 0.441900 0.259300
+vn -0.942400 0.294800 0.157800
+vn -0.961400 0.250700 0.113600
+vn -0.938900 0.316800 0.134200
+vn -0.957800 0.272800 0.090200
+vn -0.791700 0.475300 0.383800
+vn -0.829600 0.437800 0.346400
+vn -0.830900 0.415600 0.369800
+vn -0.792900 0.453100 0.407300
+vn -0.751500 0.488800 0.443000
+vn -0.750300 0.510900 0.419400
+vn -0.706700 0.522600 0.476800
+vn -0.705600 0.544700 0.453200
+vn -0.748400 0.532500 0.395400
+vn -0.789600 0.497000 0.359900
+vn -0.745600 0.553500 0.370900
+vn -0.786700 0.518100 0.335600
+vn -0.703800 0.566200 0.429100
+vn -0.701200 0.587100 0.404500
+vn -0.827400 0.459600 0.322500
+vn -0.824400 0.480900 0.298300
+vn -0.607500 0.605500 0.514100
+vn -0.657900 0.576300 0.484800
+vn -0.658900 0.554300 0.508500
+vn -0.608400 0.583600 0.537800
+vn -0.555400 0.610500 0.564700
+vn -0.554500 0.632400 0.540900
+vn -0.499700 0.634900 0.589100
+vn -0.498900 0.656800 0.565300
+vn -0.553100 0.653600 0.516600
+vn -0.605900 0.626900 0.489800
+vn -0.551000 0.674200 0.491700
+vn -0.603700 0.647600 0.465000
+vn -0.497600 0.678000 0.540900
+vn -0.495800 0.698500 0.515900
+vn -0.656100 0.597700 0.460600
+vn -0.653700 0.618500 0.435900
+vn -0.381900 0.697700 0.606200
+vn -0.441200 0.678600 0.587100
+vn -0.441900 0.656800 0.611000
+vn -0.382500 0.675800 0.630000
+vn -0.321400 0.692100 0.646300
+vn -0.320900 0.713900 0.622400
+vn -0.258700 0.705500 0.659700
+vn -0.258200 0.727300 0.635800
+vn -0.320000 0.734900 0.597800
+vn -0.380900 0.718700 0.581700
+vn -0.318900 0.755200 0.572600
+vn -0.379500 0.739100 0.556500
+vn -0.257600 0.748300 0.611200
+vn -0.256600 0.768600 0.586000
+vn -0.440100 0.699800 0.562700
+vn -0.438500 0.720200 0.537600
+vn -0.130300 0.745300 0.653800
+vn -0.194500 0.737800 0.646300
+vn -0.194800 0.716100 0.670300
+vn -0.130400 0.723600 0.677800
+vn -0.065500 0.728100 0.682300
+vn -0.065400 0.749800 0.658300
+vn 0.000000 0.729600 0.683800
+vn 0.000000 0.751400 0.659900
+vn -0.065200 0.770800 0.633700
+vn -0.129900 0.766300 0.629200
+vn -0.065000 0.791000 0.608400
+vn -0.129400 0.786500 0.603900
+vn 0.000000 0.772300 0.635200
+vn 0.000000 0.792500 0.609900
+vn -0.194000 0.758800 0.621700
+vn -0.193300 0.779000 0.596400
+vn 0.130300 0.745300 0.653800
+vn 0.065400 0.749800 0.658300
+vn 0.065500 0.728100 0.682300
+vn 0.130400 0.723600 0.677800
+vn 0.194800 0.716100 0.670300
+vn 0.194500 0.737800 0.646300
+vn 0.258700 0.705500 0.659700
+vn 0.258200 0.727300 0.635800
+vn 0.194000 0.758800 0.621700
+vn 0.129900 0.766300 0.629200
+vn 0.193300 0.779000 0.596400
+vn 0.129400 0.786500 0.603900
+vn 0.257600 0.748300 0.611200
+vn 0.256600 0.768600 0.586000
+vn 0.065200 0.770800 0.633700
+vn 0.065000 0.791000 0.608400
+vn 0.381900 0.697700 0.606200
+vn 0.320900 0.713900 0.622400
+vn 0.321400 0.692100 0.646300
+vn 0.382500 0.675800 0.630000
+vn 0.441900 0.656800 0.611000
+vn 0.441200 0.678600 0.587100
+vn 0.499700 0.634900 0.589100
+vn 0.498900 0.656800 0.565300
+vn 0.440100 0.699800 0.562700
+vn 0.380900 0.718700 0.581700
+vn 0.438500 0.720200 0.537600
+vn 0.379500 0.739100 0.556500
+vn 0.497600 0.678000 0.540900
+vn 0.495800 0.698500 0.515900
+vn 0.320000 0.734900 0.597800
+vn 0.318900 0.755200 0.572600
+vn 0.607500 0.605500 0.514100
+vn 0.554500 0.632400 0.540900
+vn 0.555400 0.610500 0.564700
+vn 0.608400 0.583600 0.537800
+vn 0.658900 0.554300 0.508500
+vn 0.657900 0.576300 0.484800
+vn 0.706700 0.522600 0.476800
+vn 0.705600 0.544700 0.453200
+vn 0.656100 0.597700 0.460600
+vn 0.605900 0.626900 0.489800
+vn 0.653700 0.618500 0.435900
+vn 0.603700 0.647600 0.465000
+vn 0.703800 0.566200 0.429100
+vn 0.701200 0.587100 0.404500
+vn 0.553100 0.653600 0.516600
+vn 0.551000 0.674200 0.491700
+vn 0.791700 0.475300 0.383800
+vn 0.750300 0.510900 0.419400
+vn 0.751500 0.488800 0.443000
+vn 0.792900 0.453100 0.407300
+vn 0.830900 0.415600 0.369800
+vn 0.829600 0.437800 0.346400
+vn 0.865600 0.376300 0.330500
+vn 0.864200 0.398500 0.307000
+vn 0.827400 0.459600 0.322500
+vn 0.789600 0.497000 0.359900
+vn 0.824400 0.480900 0.298300
+vn 0.786700 0.518100 0.335600
+vn 0.861900 0.420400 0.283300
+vn 0.858800 0.441900 0.259300
+vn 0.748400 0.532500 0.395400
+vn 0.745600 0.553500 0.371000
+vn 0.921900 0.315700 0.224300
+vn 0.895000 0.357700 0.266200
+vn 0.896500 0.335400 0.289600
+vn 0.923400 0.293300 0.247500
+vn 0.946400 0.250200 0.204400
+vn 0.944900 0.272600 0.181200
+vn 0.965400 0.205800 0.160000
+vn 0.963900 0.228400 0.136900
+vn 0.942400 0.294800 0.157800
+vn 0.919500 0.337800 0.200800
+vn 0.938900 0.316800 0.134200
+vn 0.916100 0.359600 0.177000
+vn 0.961400 0.250700 0.113600
+vn 0.957800 0.272800 0.090200
+vn 0.892700 0.379700 0.242600
+vn 0.889400 0.401300 0.218700
+vn 0.989300 0.137800 0.046400
+vn 0.978700 0.183300 0.091800
+vn 0.980300 0.160600 0.114900
+vn 0.990900 0.115100 0.069300
+vn 0.997300 0.069200 0.023400
+vn 0.995800 0.092000 0.000500
+vn 0.993100 0.114700 -0.022400
+vn 0.986800 0.160400 0.023300
+vn 0.989500 0.137200 -0.045300
+vn 0.983100 0.182800 0.000200
+vn 0.976200 0.205700 0.068600
+vn 0.972600 0.228000 0.045400
+vn 0.989300 -0.046400 -0.137800
+vn 0.995800 -0.000500 -0.092000
+vn 0.997300 -0.023400 -0.069200
+vn 0.990900 -0.069300 -0.115100
+vn 0.980300 -0.114900 -0.160600
+vn 0.978700 -0.091800 -0.183300
+vn 0.965400 -0.160000 -0.205800
+vn 0.963900 -0.136900 -0.228400
+vn 0.976200 -0.068600 -0.205700
+vn 0.986800 -0.023300 -0.160400
+vn 0.972600 -0.045400 -0.228000
+vn 0.983100 -0.000200 -0.182800
+vn 0.961400 -0.113600 -0.250700
+vn 0.957800 -0.090200 -0.272800
+vn 0.993100 0.022400 -0.114700
+vn 0.989500 0.045300 -0.137200
+vn 0.921900 -0.224300 -0.315700
+vn 0.944900 -0.181200 -0.272700
+vn 0.946400 -0.204400 -0.250200
+vn 0.923400 -0.247500 -0.293300
+vn 0.896500 -0.289600 -0.335400
+vn 0.895000 -0.266200 -0.357700
+vn 0.865600 -0.330500 -0.376200
+vn 0.864200 -0.307000 -0.398500
+vn 0.892700 -0.242600 -0.379700
+vn 0.919500 -0.200800 -0.337800
+vn 0.889400 -0.218700 -0.401300
+vn 0.916100 -0.177000 -0.359600
+vn 0.861900 -0.283300 -0.420400
+vn 0.858800 -0.259300 -0.441900
+vn 0.942400 -0.157800 -0.294800
+vn 0.938900 -0.134200 -0.316800
+vn 0.791700 -0.383800 -0.475300
+vn 0.829600 -0.346400 -0.437800
+vn 0.830900 -0.369800 -0.415600
+vn 0.792900 -0.407300 -0.453100
+vn 0.751500 -0.443000 -0.488800
+vn 0.750300 -0.419400 -0.510900
+vn 0.706700 -0.476800 -0.522600
+vn 0.705600 -0.453200 -0.544700
+vn 0.748400 -0.395400 -0.532500
+vn 0.789600 -0.359900 -0.497000
+vn 0.745600 -0.371000 -0.553500
+vn 0.786700 -0.335600 -0.518100
+vn 0.703800 -0.429100 -0.566200
+vn 0.701200 -0.404500 -0.587100
+vn 0.827400 -0.322500 -0.459600
+vn 0.824400 -0.298300 -0.480900
+vn 0.607500 -0.514100 -0.605500
+vn 0.657900 -0.484800 -0.576300
+vn 0.658900 -0.508500 -0.554300
+vn 0.608400 -0.537800 -0.583600
+vn 0.555400 -0.564700 -0.610500
+vn 0.554500 -0.540900 -0.632400
+vn 0.499700 -0.589100 -0.634900
+vn 0.498900 -0.565300 -0.656800
+vn 0.553100 -0.516600 -0.653600
+vn 0.605900 -0.489800 -0.626900
+vn 0.551000 -0.491700 -0.674200
+vn 0.603700 -0.465000 -0.647600
+vn 0.497600 -0.540900 -0.678000
+vn 0.495800 -0.515900 -0.698500
+vn 0.656100 -0.460600 -0.597700
+vn 0.653700 -0.435900 -0.618500
+vn 0.381900 -0.606200 -0.697700
+vn 0.441200 -0.587100 -0.678600
+vn 0.441900 -0.611000 -0.656800
+vn 0.382500 -0.630000 -0.675800
+vn 0.321400 -0.646300 -0.692100
+vn 0.320900 -0.622400 -0.713900
+vn 0.258700 -0.659700 -0.705500
+vn 0.258200 -0.635800 -0.727300
+vn 0.320000 -0.597800 -0.734900
+vn 0.380900 -0.581700 -0.718700
+vn 0.318900 -0.572600 -0.755200
+vn 0.379500 -0.556500 -0.739100
+vn 0.257600 -0.611200 -0.748300
+vn 0.256600 -0.586000 -0.768600
+vn 0.440100 -0.562700 -0.699800
+vn 0.438500 -0.537600 -0.720200
+vn 0.130200 -0.653800 -0.745300
+vn 0.194500 -0.646300 -0.737800
+vn 0.194800 -0.670300 -0.716100
+vn 0.130400 -0.677800 -0.723600
+vn 0.065500 -0.682300 -0.728100
+vn 0.065400 -0.658300 -0.749800
+vn 0.000000 -0.683800 -0.729600
+vn 0.000000 -0.659900 -0.751400
+vn 0.065200 -0.633700 -0.770800
+vn 0.129900 -0.629200 -0.766300
+vn 0.065000 -0.608400 -0.791000
+vn 0.129400 -0.603900 -0.786500
+vn 0.000000 -0.635200 -0.772300
+vn 0.000000 -0.609900 -0.792500
+vn 0.194000 -0.621700 -0.758800
+vn 0.193300 -0.596400 -0.779000
+vn -0.130200 -0.653800 -0.745300
+vn -0.065400 -0.658300 -0.749800
+vn -0.065500 -0.682300 -0.728100
+vn -0.130400 -0.677800 -0.723600
+vn -0.194800 -0.670300 -0.716100
+vn -0.194500 -0.646300 -0.737800
+vn -0.258700 -0.659700 -0.705500
+vn -0.258200 -0.635800 -0.727300
+vn -0.194000 -0.621700 -0.758800
+vn -0.129900 -0.629200 -0.766300
+vn -0.193300 -0.596400 -0.779000
+vn -0.129400 -0.603900 -0.786500
+vn -0.257600 -0.611200 -0.748300
+vn -0.256600 -0.586000 -0.768600
+vn -0.065200 -0.633700 -0.770800
+vn -0.065000 -0.608400 -0.790900
+vn -0.381900 -0.606200 -0.697700
+vn -0.320900 -0.622400 -0.713900
+vn -0.321400 -0.646300 -0.692100
+vn -0.382500 -0.630000 -0.675800
+vn -0.441900 -0.611000 -0.656800
+vn -0.441200 -0.587100 -0.678600
+vn -0.499700 -0.589100 -0.634900
+vn -0.498900 -0.565300 -0.656800
+vn -0.440100 -0.562700 -0.699800
+vn -0.380900 -0.581700 -0.718700
+vn -0.438500 -0.537600 -0.720200
+vn -0.379500 -0.556500 -0.739100
+vn -0.497600 -0.540900 -0.678000
+vn -0.495800 -0.515900 -0.698500
+vn -0.320000 -0.597800 -0.734900
+vn -0.318900 -0.572600 -0.755200
+vn -0.607500 -0.514100 -0.605500
+vn -0.554500 -0.540900 -0.632400
+vn -0.555400 -0.564700 -0.610500
+vn -0.608400 -0.537800 -0.583600
+vn -0.658900 -0.508500 -0.554300
+vn -0.657900 -0.484800 -0.576300
+vn -0.706700 -0.476800 -0.522600
+vn -0.705600 -0.453200 -0.544700
+vn -0.656100 -0.460600 -0.597700
+vn -0.605900 -0.489800 -0.626900
+vn -0.653700 -0.435900 -0.618500
+vn -0.603700 -0.465000 -0.647600
+vn -0.703800 -0.429100 -0.566200
+vn -0.701200 -0.404500 -0.587100
+vn -0.553100 -0.516600 -0.653600
+vn -0.551000 -0.491700 -0.674200
+vn -0.791700 -0.383800 -0.475300
+vn -0.750400 -0.419400 -0.510900
+vn -0.751500 -0.443000 -0.488800
+vn -0.792900 -0.407300 -0.453100
+vn -0.830900 -0.369800 -0.415600
+vn -0.829600 -0.346400 -0.437800
+vn -0.865600 -0.330500 -0.376200
+vn -0.864200 -0.307000 -0.398500
+vn -0.827400 -0.322500 -0.459600
+vn -0.789600 -0.359900 -0.497000
+vn -0.824400 -0.298300 -0.480900
+vn -0.786700 -0.335600 -0.518100
+vn -0.861900 -0.283300 -0.420400
+vn -0.858800 -0.259300 -0.441900
+vn -0.748400 -0.395400 -0.532500
+vn -0.745600 -0.371000 -0.553500
+vn -0.921900 -0.224300 -0.315700
+vn -0.895000 -0.266200 -0.357700
+vn -0.896500 -0.289600 -0.335400
+vn -0.923400 -0.247500 -0.293300
+vn -0.946400 -0.204400 -0.250200
+vn -0.944900 -0.181200 -0.272600
+vn -0.965400 -0.160000 -0.205800
+vn -0.963900 -0.136900 -0.228400
+vn -0.942400 -0.157800 -0.294800
+vn -0.919500 -0.200800 -0.337800
+vn -0.938900 -0.134200 -0.316800
+vn -0.916100 -0.177000 -0.359600
+vn -0.961400 -0.113600 -0.250700
+vn -0.957800 -0.090200 -0.272800
+vn -0.892700 -0.242600 -0.379700
+vn -0.889400 -0.218700 -0.401300
+vn -0.989300 -0.046400 -0.137800
+vn -0.978700 -0.091800 -0.183300
+vn -0.980300 -0.114900 -0.160600
+vn -0.990900 -0.069300 -0.115100
+vn -0.997300 -0.023400 -0.069200
+vn -0.995800 -0.000500 -0.092000
+vn -0.993100 0.022400 -0.114700
+vn -0.986800 -0.023300 -0.160400
+vn -0.989500 0.045300 -0.137200
+vn -0.983100 -0.000200 -0.182800
+vn -0.976200 -0.068600 -0.205700
+vn -0.972600 -0.045400 -0.228000
+vn -0.989300 0.137800 0.046400
+vn -0.995800 0.092000 0.000500
+vn -0.997300 0.069200 0.023400
+vn -0.990900 0.115100 0.069300
+vn -0.980300 0.160600 0.114900
+vn -0.978700 0.183300 0.091800
+vn -0.976200 0.205700 0.068600
+vn -0.986800 0.160400 0.023300
+vn -0.972600 0.228000 0.045400
+vn -0.983100 0.182800 0.000200
+vn -0.993100 0.114700 -0.022400
+vn -0.989500 0.137200 -0.045300
+vn -0.906500 0.402000 0.129000
+vn -0.929100 0.359600 0.086600
+vn -0.934500 0.338400 0.110400
+vn -0.911800 0.381000 0.153100
+vn -0.947800 0.316000 0.043100
+vn -0.953300 0.294600 0.066700
+vn -0.885200 0.422500 0.194600
+vn -0.880100 0.443300 0.170300
+vn -0.854700 0.462900 0.235000
+vn -0.849700 0.483400 0.210400
+vn -0.874000 0.463500 0.145800
+vn -0.900200 0.422500 0.104800
+vn -0.867000 0.483400 0.121100
+vn -0.893000 0.442700 0.080400
+vn -0.843900 0.503400 0.185600
+vn -0.837100 0.522900 0.160600
+vn -0.922700 0.380400 0.062700
+vn -0.941200 0.337200 0.019400
+vn -0.915300 0.400900 0.038600
+vn -0.933700 0.358000 -0.004200
+vn -0.778400 0.558800 0.285900
+vn -0.815700 0.522000 0.249000
+vn -0.820500 0.501800 0.273800
+vn -0.783000 0.538800 0.310900
+vn -0.742100 0.574000 0.346100
+vn -0.737800 0.593900 0.320900
+vn -0.697800 0.607400 0.379500
+vn -0.693800 0.627100 0.354100
+vn -0.732700 0.613100 0.295300
+vn -0.773100 0.578300 0.260600
+vn -0.726800 0.631700 0.269400
+vn -0.766900 0.597200 0.235000
+vn -0.689000 0.646100 0.328300
+vn -0.683500 0.664400 0.302200
+vn -0.810100 0.541700 0.224000
+vn -0.803600 0.560900 0.198700
+vn -0.597300 0.686900 0.413900
+vn -0.646800 0.658200 0.385200
+vn -0.650600 0.638700 0.410800
+vn -0.600800 0.667600 0.439700
+vn -0.548400 0.694100 0.466200
+vn -0.545200 0.713300 0.440300
+vn -0.493500 0.718300 0.490400
+vn -0.490600 0.737300 0.464300
+vn -0.541500 0.731700 0.414000
+vn -0.593200 0.705500 0.387700
+vn -0.537100 0.749400 0.387100
+vn -0.588400 0.723400 0.361100
+vn -0.487200 0.755600 0.437800
+vn -0.483300 0.773100 0.410800
+vn -0.642400 0.677000 0.359200
+vn -0.637200 0.695100 0.332800
+vn -0.375500 0.777500 0.504500
+vn -0.433800 0.758800 0.485800
+vn -0.436400 0.739900 0.511900
+vn -0.377700 0.758700 0.530800
+vn -0.317400 0.774700 0.546800
+vn -0.315500 0.793400 0.520500
+vn -0.255400 0.788000 0.560100
+vn -0.253900 0.806600 0.533600
+vn -0.313300 0.811300 0.493500
+vn -0.372900 0.795400 0.477700
+vn -0.310800 0.828300 0.466000
+vn -0.369900 0.812600 0.450300
+vn -0.252200 0.824400 0.506600
+vn -0.250200 0.841300 0.479100
+vn -0.430800 0.776900 0.459100
+vn -0.427400 0.794200 0.431900
+vn -0.128100 0.824300 0.551400
+vn -0.191300 0.817000 0.544000
+vn -0.192400 0.798400 0.570500
+vn -0.128800 0.805800 0.577900
+vn -0.064700 0.810300 0.582400
+vn -0.064300 0.828800 0.555800
+vn 0.000000 0.811800 0.583900
+vn 0.000000 0.830300 0.557300
+vn -0.063800 0.846400 0.528600
+vn -0.127200 0.842000 0.524200
+vn -0.063400 0.863200 0.500900
+vn -0.126200 0.858800 0.496500
+vn 0.000000 0.847900 0.530100
+vn 0.000000 0.864600 0.502400
+vn -0.189900 0.834700 0.516900
+vn -0.188400 0.851500 0.489200
+vn 0.128100 0.824300 0.551400
+vn 0.064300 0.828800 0.555800
+vn 0.064700 0.810300 0.582400
+vn 0.128800 0.805800 0.577900
+vn 0.192400 0.798400 0.570500
+vn 0.191300 0.817000 0.544000
+vn 0.255400 0.788000 0.560100
+vn 0.253900 0.806600 0.533600
+vn 0.189900 0.834700 0.516900
+vn 0.127200 0.842000 0.524200
+vn 0.188400 0.851500 0.489200
+vn 0.126200 0.858800 0.496500
+vn 0.252200 0.824400 0.506600
+vn 0.250200 0.841300 0.479100
+vn 0.063800 0.846400 0.528600
+vn 0.063400 0.863200 0.500900
+vn 0.375500 0.777500 0.504500
+vn 0.315500 0.793400 0.520500
+vn 0.317400 0.774700 0.546800
+vn 0.377700 0.758700 0.530700
+vn 0.436400 0.739900 0.511900
+vn 0.433800 0.758800 0.485800
+vn 0.493500 0.718300 0.490400
+vn 0.490600 0.737300 0.464300
+vn 0.430800 0.776900 0.459100
+vn 0.372900 0.795400 0.477700
+vn 0.427400 0.794200 0.431900
+vn 0.369900 0.812600 0.450300
+vn 0.487200 0.755600 0.437800
+vn 0.483300 0.773100 0.410800
+vn 0.313300 0.811300 0.493500
+vn 0.310800 0.828300 0.466000
+vn 0.597300 0.686900 0.413900
+vn 0.545200 0.713300 0.440300
+vn 0.548400 0.694100 0.466200
+vn 0.600800 0.667600 0.439700
+vn 0.650600 0.638700 0.410800
+vn 0.646800 0.658200 0.385200
+vn 0.697800 0.607400 0.379500
+vn 0.693800 0.627100 0.354100
+vn 0.642400 0.677000 0.359200
+vn 0.593200 0.705500 0.387700
+vn 0.637200 0.695100 0.332800
+vn 0.588400 0.723400 0.361100
+vn 0.689000 0.646100 0.328300
+vn 0.683500 0.664400 0.302200
+vn 0.541500 0.731700 0.414000
+vn 0.537100 0.749400 0.387100
+vn 0.778400 0.558800 0.285900
+vn 0.737800 0.593900 0.320900
+vn 0.742100 0.574000 0.346100
+vn 0.783000 0.538800 0.310900
+vn 0.820500 0.501800 0.273800
+vn 0.815700 0.522000 0.249000
+vn 0.854700 0.462900 0.235000
+vn 0.849700 0.483400 0.210400
+vn 0.810100 0.541700 0.224000
+vn 0.773100 0.578300 0.260600
+vn 0.803600 0.560900 0.198700
+vn 0.766900 0.597200 0.235000
+vn 0.843900 0.503400 0.185600
+vn 0.837100 0.522900 0.160600
+vn 0.732700 0.613100 0.295300
+vn 0.726800 0.631700 0.269400
+vn 0.906500 0.402000 0.129000
+vn 0.880100 0.443300 0.170300
+vn 0.885200 0.422500 0.194600
+vn 0.911800 0.381000 0.153100
+vn 0.934500 0.338400 0.110400
+vn 0.929100 0.359600 0.086600
+vn 0.953300 0.294600 0.066700
+vn 0.947800 0.316000 0.043100
+vn 0.922700 0.380400 0.062700
+vn 0.900200 0.422500 0.104800
+vn 0.915300 0.400900 0.038600
+vn 0.893000 0.442700 0.080400
+vn 0.941200 0.337200 0.019400
+vn 0.933700 0.358000 -0.004200
+vn 0.874000 0.463500 0.145800
+vn 0.867000 0.483400 0.121100
+vn 0.972800 0.227000 -0.045900
+vn 0.962300 0.271700 -0.001200
+vn 0.968000 0.250000 0.022100
+vn 0.978500 0.205000 -0.022900
+vn 0.984800 0.159700 -0.068200
+vn 0.979100 0.182000 -0.091000
+vn 0.972300 0.204000 -0.113700
+vn 0.966100 0.248800 -0.068900
+vn 0.964500 0.225900 -0.136300
+vn 0.958300 0.270300 -0.091900
+vn 0.955700 0.293200 -0.024500
+vn 0.948100 0.314400 -0.047900
+vn 0.972800 0.045900 -0.227000
+vn 0.979100 0.091000 -0.182000
+vn 0.984800 0.068200 -0.159700
+vn 0.978500 0.022900 -0.205000
+vn 0.968000 -0.022100 -0.250000
+vn 0.962300 0.001200 -0.271700
+vn 0.953300 -0.066700 -0.294600
+vn 0.947800 -0.043100 -0.316000
+vn 0.955700 0.024500 -0.293200
+vn 0.966100 0.068900 -0.248800
+vn 0.948100 0.047900 -0.314400
+vn 0.958300 0.091900 -0.270300
+vn 0.941200 -0.019400 -0.337200
+vn 0.933700 0.004200 -0.358000
+vn 0.972300 0.113700 -0.204000
+vn 0.964500 0.136300 -0.225900
+vn 0.906500 -0.129000 -0.402000
+vn 0.929100 -0.086600 -0.359600
+vn 0.934500 -0.110400 -0.338400
+vn 0.911800 -0.153100 -0.381000
+vn 0.885200 -0.194600 -0.422500
+vn 0.880100 -0.170300 -0.443300
+vn 0.854700 -0.235000 -0.462900
+vn 0.849700 -0.210400 -0.483400
+vn 0.874000 -0.145800 -0.463500
+vn 0.900200 -0.104800 -0.422500
+vn 0.867000 -0.121100 -0.483400
+vn 0.893000 -0.080400 -0.442700
+vn 0.843900 -0.185600 -0.503400
+vn 0.837100 -0.160600 -0.522900
+vn 0.922700 -0.062700 -0.380400
+vn 0.915300 -0.038600 -0.400900
+vn 0.778400 -0.285900 -0.558800
+vn 0.815700 -0.249000 -0.522000
+vn 0.820500 -0.273800 -0.501800
+vn 0.783000 -0.310900 -0.538800
+vn 0.742100 -0.346100 -0.574000
+vn 0.737800 -0.320900 -0.593900
+vn 0.697800 -0.379500 -0.607400
+vn 0.693800 -0.354100 -0.627100
+vn 0.732700 -0.295300 -0.613100
+vn 0.773100 -0.260600 -0.578300
+vn 0.726800 -0.269400 -0.631700
+vn 0.766900 -0.235000 -0.597200
+vn 0.689000 -0.328300 -0.646100
+vn 0.683500 -0.302200 -0.664400
+vn 0.810100 -0.224000 -0.541700
+vn 0.803600 -0.198700 -0.560900
+vn 0.597300 -0.413900 -0.686900
+vn 0.646800 -0.385200 -0.658200
+vn 0.650600 -0.410800 -0.638700
+vn 0.600800 -0.439700 -0.667600
+vn 0.548400 -0.466200 -0.694100
+vn 0.545200 -0.440300 -0.713300
+vn 0.493500 -0.490400 -0.718300
+vn 0.490600 -0.464300 -0.737300
+vn 0.541500 -0.414000 -0.731700
+vn 0.593200 -0.387700 -0.705500
+vn 0.537100 -0.387100 -0.749400
+vn 0.588400 -0.361100 -0.723400
+vn 0.487200 -0.437800 -0.755600
+vn 0.483300 -0.410800 -0.773100
+vn 0.642400 -0.359200 -0.677000
+vn 0.637200 -0.332800 -0.695100
+vn 0.375500 -0.504500 -0.777500
+vn 0.433800 -0.485800 -0.758800
+vn 0.436400 -0.511900 -0.739900
+vn 0.377700 -0.530800 -0.758700
+vn 0.317400 -0.546800 -0.774700
+vn 0.315500 -0.520500 -0.793400
+vn 0.255400 -0.560100 -0.788000
+vn 0.253900 -0.533600 -0.806600
+vn 0.313300 -0.493500 -0.811300
+vn 0.372900 -0.477700 -0.795400
+vn 0.310800 -0.466000 -0.828300
+vn 0.369900 -0.450300 -0.812600
+vn 0.252200 -0.506600 -0.824400
+vn 0.250200 -0.479100 -0.841300
+vn 0.430800 -0.459100 -0.776900
+vn 0.427400 -0.431900 -0.794200
+vn 0.128100 -0.551400 -0.824300
+vn 0.191300 -0.544000 -0.817000
+vn 0.192400 -0.570500 -0.798400
+vn 0.128800 -0.577900 -0.805800
+vn 0.064700 -0.582400 -0.810300
+vn 0.064300 -0.555800 -0.828800
+vn 0.000000 -0.583900 -0.811800
+vn 0.000000 -0.557300 -0.830300
+vn 0.063800 -0.528600 -0.846400
+vn 0.127200 -0.524200 -0.842000
+vn 0.063400 -0.500900 -0.863200
+vn 0.126200 -0.496500 -0.858800
+vn 0.000000 -0.530100 -0.847900
+vn 0.000000 -0.502400 -0.864600
+vn 0.189900 -0.516900 -0.834700
+vn 0.188400 -0.489200 -0.851500
+vn -0.128100 -0.551400 -0.824300
+vn -0.064300 -0.555800 -0.828800
+vn -0.064700 -0.582400 -0.810300
+vn -0.128800 -0.577900 -0.805800
+vn -0.192400 -0.570500 -0.798400
+vn -0.191300 -0.544000 -0.817000
+vn -0.255400 -0.560100 -0.788000
+vn -0.253900 -0.533600 -0.806600
+vn -0.189900 -0.516900 -0.834700
+vn -0.127200 -0.524200 -0.842000
+vn -0.188400 -0.489200 -0.851500
+vn -0.126200 -0.496500 -0.858800
+vn -0.252200 -0.506600 -0.824400
+vn -0.250200 -0.479100 -0.841300
+vn -0.063800 -0.528600 -0.846400
+vn -0.063400 -0.500900 -0.863200
+vn -0.375500 -0.504500 -0.777500
+vn -0.315500 -0.520500 -0.793400
+vn -0.317400 -0.546800 -0.774700
+vn -0.377700 -0.530700 -0.758700
+vn -0.436400 -0.511900 -0.739900
+vn -0.433800 -0.485800 -0.758800
+vn -0.493500 -0.490400 -0.718300
+vn -0.490600 -0.464300 -0.737300
+vn -0.430800 -0.459100 -0.776900
+vn -0.372900 -0.477700 -0.795400
+vn -0.427400 -0.431900 -0.794200
+vn -0.369900 -0.450300 -0.812600
+vn -0.487200 -0.437800 -0.755600
+vn -0.483300 -0.410800 -0.773100
+vn -0.313300 -0.493500 -0.811300
+vn -0.310800 -0.466000 -0.828300
+vn -0.597300 -0.413900 -0.686900
+vn -0.545200 -0.440300 -0.713300
+vn -0.548400 -0.466200 -0.694100
+vn -0.600800 -0.439700 -0.667600
+vn -0.650600 -0.410800 -0.638700
+vn -0.646800 -0.385200 -0.658200
+vn -0.697800 -0.379500 -0.607400
+vn -0.693800 -0.354100 -0.627100
+vn -0.642400 -0.359200 -0.677000
+vn -0.593200 -0.387700 -0.705500
+vn -0.637200 -0.332800 -0.695100
+vn -0.588400 -0.361100 -0.723400
+vn -0.689000 -0.328300 -0.646100
+vn -0.683500 -0.302200 -0.664400
+vn -0.541500 -0.414000 -0.731700
+vn -0.537100 -0.387100 -0.749400
+vn -0.778400 -0.285900 -0.558800
+vn -0.737800 -0.320900 -0.593900
+vn -0.742100 -0.346100 -0.574000
+vn -0.783000 -0.310900 -0.538800
+vn -0.820500 -0.273800 -0.501800
+vn -0.815700 -0.249000 -0.522000
+vn -0.854700 -0.235000 -0.462900
+vn -0.849700 -0.210400 -0.483400
+vn -0.810100 -0.224000 -0.541700
+vn -0.773100 -0.260600 -0.578300
+vn -0.803600 -0.198700 -0.560900
+vn -0.766900 -0.235000 -0.597200
+vn -0.843900 -0.185600 -0.503400
+vn -0.837100 -0.160600 -0.522900
+vn -0.732700 -0.295300 -0.613100
+vn -0.726800 -0.269400 -0.631700
+vn -0.906500 -0.129000 -0.402000
+vn -0.880100 -0.170300 -0.443300
+vn -0.885200 -0.194600 -0.422500
+vn -0.911800 -0.153100 -0.381000
+vn -0.934500 -0.110400 -0.338400
+vn -0.929100 -0.086600 -0.359600
+vn -0.953300 -0.066700 -0.294600
+vn -0.947800 -0.043100 -0.316000
+vn -0.922700 -0.062700 -0.380400
+vn -0.900200 -0.104800 -0.422500
+vn -0.915300 -0.038700 -0.400900
+vn -0.893000 -0.080400 -0.442700
+vn -0.941200 -0.019400 -0.337200
+vn -0.933700 0.004200 -0.358000
+vn -0.874000 -0.145800 -0.463500
+vn -0.867000 -0.121100 -0.483400
+vn -0.972800 0.045900 -0.227000
+vn -0.962300 0.001200 -0.271700
+vn -0.968000 -0.022100 -0.250000
+vn -0.978500 0.022900 -0.205000
+vn -0.984800 0.068200 -0.159700
+vn -0.979100 0.091000 -0.182000
+vn -0.972300 0.113700 -0.204000
+vn -0.966100 0.068900 -0.248800
+vn -0.964500 0.136300 -0.225900
+vn -0.958300 0.091900 -0.270300
+vn -0.955700 0.024500 -0.293200
+vn -0.948100 0.047900 -0.314400
+vn -0.972800 0.227000 -0.045900
+vn -0.979100 0.182000 -0.091000
+vn -0.984800 0.159700 -0.068200
+vn -0.978500 0.205100 -0.022900
+vn -0.968000 0.250000 0.022100
+vn -0.962300 0.271700 -0.001200
+vn -0.955700 0.293200 -0.024500
+vn -0.966100 0.248800 -0.068900
+vn -0.948100 0.314400 -0.047900
+vn -0.958300 0.270300 -0.091900
+vn -0.972300 0.204000 -0.113700
+vn -0.964500 0.225900 -0.136300
+vn -0.876200 0.480700 0.032600
+vn -0.898100 0.439700 -0.008400
+vn -0.907000 0.420700 0.014900
+vn -0.885000 0.462100 0.056300
+vn -0.916100 0.397700 -0.050500
+vn -0.925300 0.378200 -0.027600
+vn -0.859200 0.502400 0.096600
+vn -0.850700 0.520600 0.072500
+vn -0.829600 0.541600 0.135700
+vn -0.821400 0.559400 0.111200
+vn -0.841400 0.538300 0.048200
+vn -0.866600 0.498800 0.008800
+vn -0.831000 0.555700 0.023600
+vn -0.856000 0.516800 -0.015400
+vn -0.812300 0.576600 0.086600
+vn -0.802300 0.593600 0.061400
+vn -0.888200 0.458300 -0.031700
+vn -0.906100 0.416700 -0.073300
+vn -0.877300 0.476800 -0.055400
+vn -0.894900 0.435700 -0.096500
+vn -0.752400 0.632300 0.184200
+vn -0.788500 0.596800 0.148600
+vn -0.796400 0.579300 0.173500
+vn -0.760000 0.615300 0.209400
+vn -0.720300 0.649400 0.243600
+vn -0.713200 0.666200 0.218000
+vn -0.677400 0.681900 0.276000
+vn -0.670600 0.698300 0.250100
+vn -0.705300 0.682300 0.192200
+vn -0.744200 0.648800 0.158800
+vn -0.696600 0.698000 0.165800
+vn -0.735000 0.664900 0.132700
+vn -0.663300 0.714000 0.224000
+vn -0.655100 0.729300 0.197100
+vn -0.779900 0.613600 0.123500
+vn -0.770300 0.630100 0.097900
+vn -0.577400 0.756100 0.308000
+vn -0.625200 0.728400 0.280200
+vn -0.631500 0.712200 0.306400
+vn -0.583100 0.740300 0.334500
+vn -0.532300 0.766000 0.360200
+vn -0.527000 0.781600 0.333500
+vn -0.479000 0.789500 0.383700
+vn -0.474200 0.804900 0.356700
+vn -0.521300 0.796500 0.306400
+vn -0.571000 0.771200 0.281200
+vn -0.514800 0.810800 0.278500
+vn -0.564000 0.785800 0.253600
+vn -0.469000 0.819500 0.329400
+vn -0.463200 0.833400 0.301200
+vn -0.618400 0.743800 0.253700
+vn -0.610800 0.758700 0.226500
+vn -0.363000 0.843700 0.395500
+vn -0.419400 0.825600 0.377400
+vn -0.423500 0.810400 0.404600
+vn -0.366600 0.828700 0.422900
+vn -0.308000 0.844300 0.438500
+vn -0.305000 0.859100 0.410900
+vn -0.247900 0.857200 0.451300
+vn -0.245500 0.871900 0.423700
+vn -0.301600 0.873100 0.383000
+vn -0.359000 0.857800 0.367800
+vn -0.297900 0.886400 0.354200
+vn -0.354500 0.871300 0.339200
+vn -0.242800 0.885700 0.395700
+vn -0.239800 0.898900 0.366700
+vn -0.414700 0.839900 0.349900
+vn -0.409600 0.853700 0.321500
+vn -0.123800 0.889000 0.440800
+vn -0.184900 0.881900 0.433700
+vn -0.186700 0.867300 0.461400
+vn -0.125000 0.874500 0.468600
+vn -0.062800 0.878800 0.473000
+vn -0.062100 0.893300 0.445100
+vn 0.000000 0.880300 0.474400
+vn 0.000000 0.894700 0.446500
+vn -0.061500 0.906900 0.416900
+vn -0.122400 0.902600 0.412600
+vn -0.060700 0.919800 0.387600
+vn -0.120900 0.915600 0.383400
+vn 0.000000 0.908300 0.418300
+vn 0.000000 0.921200 0.389000
+vn -0.182900 0.895600 0.405500
+vn -0.180600 0.908600 0.376400
+vn 0.123800 0.889000 0.440800
+vn 0.062100 0.893300 0.445100
+vn 0.062800 0.878800 0.473000
+vn 0.125000 0.874500 0.468600
+vn 0.186700 0.867300 0.461400
+vn 0.184900 0.881900 0.433700
+vn 0.247900 0.857200 0.451300
+vn 0.245500 0.871900 0.423700
+vn 0.182900 0.895600 0.405500
+vn 0.122400 0.902600 0.412600
+vn 0.180600 0.908600 0.376400
+vn 0.120900 0.915600 0.383400
+vn 0.242800 0.885700 0.395700
+vn 0.239800 0.898900 0.366700
+vn 0.061500 0.906900 0.416900
+vn 0.060700 0.919800 0.387600
+vn 0.363000 0.843700 0.395500
+vn 0.305000 0.859100 0.410900
+vn 0.308000 0.844300 0.438500
+vn 0.366600 0.828700 0.422900
+vn 0.423500 0.810400 0.404600
+vn 0.419400 0.825600 0.377500
+vn 0.479000 0.789500 0.383700
+vn 0.474200 0.804900 0.356700
+vn 0.414700 0.839900 0.349900
+vn 0.359000 0.857800 0.367800
+vn 0.409600 0.853700 0.321500
+vn 0.354500 0.871300 0.339200
+vn 0.469000 0.819500 0.329400
+vn 0.463200 0.833400 0.301200
+vn 0.301600 0.873100 0.383000
+vn 0.297900 0.886400 0.354200
+vn 0.577400 0.756100 0.308000
+vn 0.527000 0.781600 0.333500
+vn 0.532300 0.766000 0.360200
+vn 0.583100 0.740300 0.334500
+vn 0.631500 0.712200 0.306400
+vn 0.625200 0.728400 0.280200
+vn 0.677400 0.681900 0.276000
+vn 0.670600 0.698300 0.250100
+vn 0.618400 0.743800 0.253700
+vn 0.571000 0.771200 0.281200
+vn 0.610800 0.758700 0.226500
+vn 0.564000 0.785800 0.253600
+vn 0.663300 0.714000 0.224000
+vn 0.655100 0.729300 0.197100
+vn 0.521300 0.796500 0.306400
+vn 0.514800 0.810800 0.278500
+vn 0.752400 0.632300 0.184200
+vn 0.713200 0.666200 0.218000
+vn 0.720300 0.649400 0.243600
+vn 0.760000 0.615300 0.209400
+vn 0.796400 0.579300 0.173500
+vn 0.788500 0.596800 0.148600
+vn 0.829600 0.541600 0.135700
+vn 0.821400 0.559400 0.111200
+vn 0.779900 0.613600 0.123500
+vn 0.744200 0.648800 0.158800
+vn 0.770300 0.630100 0.097900
+vn 0.735000 0.664900 0.132700
+vn 0.812300 0.576600 0.086600
+vn 0.802400 0.593600 0.061400
+vn 0.705300 0.682300 0.192200
+vn 0.696600 0.698000 0.165800
+vn 0.876200 0.480700 0.032600
+vn 0.850700 0.520600 0.072500
+vn 0.859200 0.502400 0.096600
+vn 0.885000 0.462100 0.056300
+vn 0.907000 0.420700 0.014900
+vn 0.898100 0.439700 -0.008400
+vn 0.925300 0.378200 -0.027600
+vn 0.916100 0.397700 -0.050500
+vn 0.888200 0.458300 -0.031700
+vn 0.866600 0.498800 0.008800
+vn 0.877300 0.476800 -0.055400
+vn 0.856000 0.516800 -0.015400
+vn 0.906100 0.416700 -0.073300
+vn 0.894900 0.435700 -0.096500
+vn 0.841400 0.538300 0.048200
+vn 0.831000 0.555700 0.023600
+vn 0.940300 0.311600 -0.136500
+vn 0.930200 0.354800 -0.093300
+vn 0.939500 0.334900 -0.070800
+vn 0.949700 0.291300 -0.114500
+vn 0.955900 0.247300 -0.158500
+vn 0.946400 0.268000 -0.180100
+vn 0.957900 0.202900 -0.202900
+vn 0.948500 0.224100 -0.224100
+vn 0.936000 0.288500 -0.201500
+vn 0.930000 0.331600 -0.158400
+vn 0.924500 0.309000 -0.223200
+vn 0.918500 0.351600 -0.180600
+vn 0.938000 0.245000 -0.245000
+vn 0.926500 0.266100 -0.266100
+vn 0.920000 0.374300 -0.115700
+vn 0.908700 0.393800 -0.138400
+vn 0.940300 0.136500 -0.311600
+vn 0.946400 0.180100 -0.268000
+vn 0.955900 0.158500 -0.247300
+vn 0.949700 0.114500 -0.291300
+vn 0.939500 0.070800 -0.334900
+vn 0.930200 0.093300 -0.354800
+vn 0.925300 0.027600 -0.378200
+vn 0.916100 0.050500 -0.397700
+vn 0.920000 0.115700 -0.374300
+vn 0.930000 0.158400 -0.331600
+vn 0.908700 0.138400 -0.393800
+vn 0.918500 0.180600 -0.351600
+vn 0.906100 0.073300 -0.416700
+vn 0.894900 0.096500 -0.435700
+vn 0.936000 0.201500 -0.288500
+vn 0.924500 0.223200 -0.309000
+vn 0.876200 -0.032600 -0.480700
+vn 0.898100 0.008400 -0.439700
+vn 0.907000 -0.014900 -0.420700
+vn 0.885000 -0.056300 -0.462100
+vn 0.859200 -0.096600 -0.502400
+vn 0.850700 -0.072500 -0.520600
+vn 0.829600 -0.135700 -0.541600
+vn 0.821400 -0.111200 -0.559400
+vn 0.841400 -0.048200 -0.538300
+vn 0.866600 -0.008800 -0.498800
+vn 0.831000 -0.023600 -0.555700
+vn 0.856000 0.015400 -0.516800
+vn 0.812300 -0.086600 -0.576600
+vn 0.802300 -0.061400 -0.593600
+vn 0.888200 0.031700 -0.458300
+vn 0.877300 0.055400 -0.476800
+vn 0.752400 -0.184200 -0.632300
+vn 0.788500 -0.148600 -0.596800
+vn 0.796400 -0.173500 -0.579300
+vn 0.760000 -0.209400 -0.615300
+vn 0.720300 -0.243600 -0.649400
+vn 0.713200 -0.218000 -0.666200
+vn 0.677400 -0.276000 -0.681900
+vn 0.670600 -0.250100 -0.698300
+vn 0.705300 -0.192200 -0.682300
+vn 0.744200 -0.158800 -0.648800
+vn 0.696600 -0.165800 -0.698000
+vn 0.735000 -0.132700 -0.664900
+vn 0.663300 -0.224000 -0.714000
+vn 0.655100 -0.197100 -0.729300
+vn 0.779900 -0.123500 -0.613600
+vn 0.770300 -0.097900 -0.630100
+vn 0.577400 -0.308000 -0.756100
+vn 0.625200 -0.280200 -0.728400
+vn 0.631500 -0.306400 -0.712200
+vn 0.583100 -0.334500 -0.740300
+vn 0.532300 -0.360200 -0.766000
+vn 0.527000 -0.333500 -0.781600
+vn 0.479000 -0.383700 -0.789500
+vn 0.474200 -0.356700 -0.804900
+vn 0.521300 -0.306400 -0.796500
+vn 0.571000 -0.281200 -0.771200
+vn 0.514800 -0.278500 -0.810800
+vn 0.564000 -0.253600 -0.785800
+vn 0.469000 -0.329400 -0.819500
+vn 0.463200 -0.301200 -0.833400
+vn 0.618400 -0.253700 -0.743800
+vn 0.610800 -0.226500 -0.758700
+vn 0.363000 -0.395500 -0.843700
+vn 0.419400 -0.377500 -0.825600
+vn 0.423500 -0.404600 -0.810400
+vn 0.366600 -0.422900 -0.828700
+vn 0.308000 -0.438500 -0.844300
+vn 0.305000 -0.410900 -0.859100
+vn 0.247900 -0.451300 -0.857200
+vn 0.245500 -0.423700 -0.871900
+vn 0.301600 -0.383000 -0.873100
+vn 0.359000 -0.367800 -0.857800
+vn 0.297900 -0.354200 -0.886400
+vn 0.354500 -0.339200 -0.871300
+vn 0.242800 -0.395700 -0.885700
+vn 0.239800 -0.366700 -0.898900
+vn 0.414700 -0.349900 -0.839900
+vn 0.409600 -0.321500 -0.853700
+vn 0.123800 -0.440800 -0.889000
+vn 0.184900 -0.433700 -0.881900
+vn 0.186700 -0.461400 -0.867300
+vn 0.125000 -0.468600 -0.874500
+vn 0.062800 -0.473000 -0.878800
+vn 0.062100 -0.445100 -0.893300
+vn 0.000000 -0.474400 -0.880300
+vn 0.000000 -0.446500 -0.894700
+vn 0.061500 -0.416900 -0.906900
+vn 0.122400 -0.412600 -0.902600
+vn 0.060700 -0.387600 -0.919800
+vn 0.120900 -0.383400 -0.915600
+vn 0.000000 -0.418300 -0.908300
+vn 0.000000 -0.389000 -0.921200
+vn 0.182900 -0.405500 -0.895600
+vn 0.180600 -0.376400 -0.908600
+vn -0.123800 -0.440800 -0.889000
+vn -0.062100 -0.445100 -0.893300
+vn -0.062800 -0.473000 -0.878800
+vn -0.125000 -0.468600 -0.874500
+vn -0.186700 -0.461400 -0.867300
+vn -0.184900 -0.433700 -0.881900
+vn -0.247900 -0.451300 -0.857200
+vn -0.245500 -0.423700 -0.871900
+vn -0.182900 -0.405500 -0.895600
+vn -0.122400 -0.412600 -0.902600
+vn -0.180600 -0.376400 -0.908600
+vn -0.120900 -0.383400 -0.915600
+vn -0.242800 -0.395700 -0.885700
+vn -0.239800 -0.366700 -0.898900
+vn -0.061500 -0.416900 -0.906900
+vn -0.060700 -0.387600 -0.919800
+vn -0.363000 -0.395500 -0.843700
+vn -0.305000 -0.410900 -0.859100
+vn -0.308000 -0.438500 -0.844300
+vn -0.366600 -0.422900 -0.828700
+vn -0.423500 -0.404600 -0.810400
+vn -0.419400 -0.377500 -0.825600
+vn -0.479000 -0.383700 -0.789500
+vn -0.474200 -0.356700 -0.804900
+vn -0.414700 -0.349900 -0.839900
+vn -0.359000 -0.367800 -0.857800
+vn -0.409600 -0.321500 -0.853700
+vn -0.354500 -0.339200 -0.871300
+vn -0.469000 -0.329400 -0.819500
+vn -0.463200 -0.301200 -0.833400
+vn -0.301600 -0.383000 -0.873100
+vn -0.297900 -0.354200 -0.886400
+vn -0.577400 -0.308000 -0.756100
+vn -0.527000 -0.333500 -0.781600
+vn -0.532300 -0.360200 -0.766000
+vn -0.583100 -0.334500 -0.740300
+vn -0.631500 -0.306400 -0.712200
+vn -0.625200 -0.280200 -0.728400
+vn -0.677400 -0.276000 -0.681900
+vn -0.670600 -0.250100 -0.698300
+vn -0.618400 -0.253700 -0.743800
+vn -0.571000 -0.281200 -0.771200
+vn -0.610800 -0.226500 -0.758700
+vn -0.564000 -0.253600 -0.785800
+vn -0.663300 -0.224000 -0.714000
+vn -0.655100 -0.197100 -0.729300
+vn -0.521300 -0.306400 -0.796500
+vn -0.514800 -0.278500 -0.810800
+vn -0.752400 -0.184200 -0.632300
+vn -0.713200 -0.218000 -0.666200
+vn -0.720300 -0.243600 -0.649400
+vn -0.760000 -0.209400 -0.615300
+vn -0.796400 -0.173500 -0.579300
+vn -0.788500 -0.148600 -0.596800
+vn -0.829600 -0.135700 -0.541600
+vn -0.821400 -0.111200 -0.559400
+vn -0.779900 -0.123500 -0.613600
+vn -0.744200 -0.158800 -0.648800
+vn -0.770300 -0.097900 -0.630100
+vn -0.735000 -0.132700 -0.664900
+vn -0.812300 -0.086600 -0.576600
+vn -0.802300 -0.061400 -0.593600
+vn -0.705300 -0.192200 -0.682300
+vn -0.696600 -0.165800 -0.698000
+vn -0.876200 -0.032600 -0.480700
+vn -0.850700 -0.072500 -0.520600
+vn -0.859200 -0.096600 -0.502400
+vn -0.885000 -0.056300 -0.462100
+vn -0.907000 -0.014900 -0.420700
+vn -0.898100 0.008400 -0.439700
+vn -0.925300 0.027600 -0.378200
+vn -0.916100 0.050500 -0.397700
+vn -0.888200 0.031700 -0.458300
+vn -0.866600 -0.008800 -0.498800
+vn -0.877300 0.055400 -0.476800
+vn -0.856000 0.015400 -0.516800
+vn -0.906100 0.073300 -0.416700
+vn -0.894900 0.096500 -0.435700
+vn -0.841400 -0.048200 -0.538300
+vn -0.831000 -0.023600 -0.555800
+vn -0.940300 0.136500 -0.311600
+vn -0.930200 0.093300 -0.354800
+vn -0.939500 0.070800 -0.334900
+vn -0.949700 0.114500 -0.291300
+vn -0.955900 0.158500 -0.247300
+vn -0.946400 0.180100 -0.268000
+vn -0.957900 0.202900 -0.202900
+vn -0.948500 0.224100 -0.224100
+vn -0.936000 0.201500 -0.288500
+vn -0.930000 0.158400 -0.331600
+vn -0.924500 0.223200 -0.309000
+vn -0.918500 0.180600 -0.351600
+vn -0.938000 0.245000 -0.245000
+vn -0.926500 0.266100 -0.266100
+vn -0.920000 0.115700 -0.374300
+vn -0.908700 0.138400 -0.393800
+vn -0.940300 0.311600 -0.136500
+vn -0.946400 0.268000 -0.180100
+vn -0.955900 0.247300 -0.158500
+vn -0.949700 0.291300 -0.114500
+vn -0.939500 0.334900 -0.070800
+vn -0.930200 0.354800 -0.093300
+vn -0.920000 0.374300 -0.115700
+vn -0.930000 0.331600 -0.158400
+vn -0.908700 0.393800 -0.138400
+vn -0.918500 0.351600 -0.180600
+vn -0.936000 0.288500 -0.201500
+vn -0.924500 0.309000 -0.223200
+vn -0.836000 0.545900 -0.056100
+vn -0.856800 0.506800 -0.095200
+vn -0.866500 0.493200 -0.077100
+vn -0.845400 0.532800 -0.037500
+vn -0.874000 0.466600 -0.135400
+vn -0.883900 0.452600 -0.117700
+vn -0.820700 0.571300 0.000900
+vn -0.811600 0.583900 -0.018100
+vn -0.792400 0.608700 0.038300
+vn -0.783600 0.620900 0.018900
+vn -0.802400 0.595600 -0.036200
+vn -0.826500 0.558000 -0.073900
+vn -0.790100 0.610100 -0.059200
+vn -0.813800 0.573000 -0.096300
+vn -0.774700 0.632200 0.000300
+vn -0.762900 0.646100 -0.023200
+vn -0.847100 0.519400 -0.112500
+vn -0.864100 0.479700 -0.152200
+vn -0.834100 0.534900 -0.134300
+vn -0.850900 0.495900 -0.173400
+vn -0.717900 0.690500 0.088500
+vn -0.752300 0.656500 0.054500
+vn -0.760800 0.644700 0.074400
+vn -0.725900 0.679100 0.108700
+vn -0.688000 0.711700 0.141400
+vn -0.680400 0.722800 0.120800
+vn -0.647000 0.742700 0.172300
+vn -0.639800 0.753400 0.151400
+vn -0.672700 0.733000 0.101100
+vn -0.709700 0.701000 0.069100
+vn -0.662400 0.745300 0.076000
+vn -0.698900 0.713800 0.044500
+vn -0.632600 0.763200 0.131400
+vn -0.622900 0.775100 0.105800
+vn -0.743800 0.667500 0.035600
+vn -0.732400 0.680800 0.011500
+vn -0.550800 0.808600 0.206600
+vn -0.596500 0.782100 0.180100
+vn -0.603200 0.771700 0.201300
+vn -0.557100 0.798500 0.228200
+vn -0.508500 0.823100 0.252800
+vn -0.502800 0.832900 0.230900
+vn -0.457500 0.845500 0.275200
+vn -0.452400 0.855100 0.253100
+vn -0.497100 0.841900 0.210000
+vn -0.544600 0.817800 0.185900
+vn -0.489500 0.852500 0.183200
+vn -0.536300 0.828800 0.159500
+vn -0.447300 0.863800 0.231900
+vn -0.440400 0.874100 0.204800
+vn -0.589800 0.791600 0.159700
+vn -0.580700 0.803000 0.133700
+vn -0.346300 0.892100 0.290100
+vn -0.400100 0.874900 0.272900
+vn -0.404600 0.865500 0.295200
+vn -0.350200 0.883000 0.312600
+vn -0.294200 0.897900 0.327500
+vn -0.291000 0.906900 0.304800
+vn -0.236800 0.910200 0.339800
+vn -0.234200 0.919000 0.317000
+vn -0.287700 0.914900 0.283000
+vn -0.342400 0.900400 0.268500
+vn -0.283300 0.924500 0.255200
+vn -0.337100 0.910100 0.240800
+vn -0.231500 0.927000 0.295100
+vn -0.228000 0.936300 0.267000
+vn -0.395600 0.883300 0.251400
+vn -0.389500 0.893300 0.224000
+vn -0.118100 0.935400 0.333400
+vn -0.176400 0.928600 0.326500
+vn -0.178400 0.919800 0.349400
+vn -0.119400 0.926700 0.356300
+vn -0.060000 0.930800 0.360500
+vn -0.059300 0.939500 0.337400
+vn 0.000000 0.932200 0.361900
+vn 0.000000 0.940800 0.338800
+vn -0.058600 0.947200 0.315300
+vn -0.116800 0.943100 0.311200
+vn -0.057700 0.956200 0.286900
+vn -0.115000 0.952200 0.282900
+vn 0.000000 0.948500 0.316600
+vn 0.000000 0.957500 0.288200
+vn -0.174400 0.936400 0.304500
+vn -0.171700 0.945600 0.276300
+vn 0.118100 0.935400 0.333400
+vn 0.059300 0.939500 0.337400
+vn 0.060000 0.930800 0.360500
+vn 0.119400 0.926700 0.356300
+vn 0.178400 0.919800 0.349400
+vn 0.176400 0.928600 0.326500
+vn 0.236800 0.910200 0.339800
+vn 0.234200 0.919000 0.317000
+vn 0.174400 0.936400 0.304500
+vn 0.116800 0.943100 0.311200
+vn 0.171700 0.945600 0.276300
+vn 0.115000 0.952200 0.282900
+vn 0.231500 0.927000 0.295100
+vn 0.228000 0.936300 0.267000
+vn 0.058600 0.947200 0.315300
+vn 0.057700 0.956200 0.286900
+vn 0.346300 0.892100 0.290100
+vn 0.291000 0.906900 0.304800
+vn 0.294200 0.897900 0.327500
+vn 0.350200 0.883000 0.312600
+vn 0.404600 0.865500 0.295200
+vn 0.400100 0.874900 0.272900
+vn 0.457500 0.845500 0.275200
+vn 0.452400 0.855100 0.253100
+vn 0.395600 0.883300 0.251400
+vn 0.342300 0.900400 0.268500
+vn 0.389500 0.893300 0.224000
+vn 0.337100 0.910100 0.240800
+vn 0.447300 0.863800 0.231900
+vn 0.440400 0.874100 0.204800
+vn 0.287700 0.914900 0.283000
+vn 0.283300 0.924500 0.255100
+vn 0.550800 0.808600 0.206600
+vn 0.502800 0.832900 0.230900
+vn 0.508500 0.823100 0.252800
+vn 0.557100 0.798500 0.228200
+vn 0.603200 0.771700 0.201400
+vn 0.596500 0.782100 0.180100
+vn 0.647000 0.742700 0.172300
+vn 0.639800 0.753400 0.151400
+vn 0.589800 0.791600 0.159700
+vn 0.544600 0.817800 0.185900
+vn 0.580700 0.803000 0.133700
+vn 0.536200 0.828800 0.159500
+vn 0.632600 0.763200 0.131400
+vn 0.622900 0.775100 0.105800
+vn 0.497100 0.841900 0.210000
+vn 0.489500 0.852500 0.183200
+vn 0.717900 0.690500 0.088500
+vn 0.680400 0.722800 0.120800
+vn 0.688000 0.711700 0.141400
+vn 0.725900 0.679100 0.108700
+vn 0.760800 0.644700 0.074400
+vn 0.752300 0.656500 0.054500
+vn 0.792400 0.608700 0.038300
+vn 0.783600 0.620900 0.018900
+vn 0.743800 0.667500 0.035600
+vn 0.709700 0.701000 0.069100
+vn 0.732400 0.680800 0.011500
+vn 0.698900 0.713800 0.044500
+vn 0.774700 0.632200 0.000300
+vn 0.762900 0.646100 -0.023200
+vn 0.672700 0.733000 0.101100
+vn 0.662400 0.745300 0.076000
+vn 0.836000 0.545900 -0.056100
+vn 0.811600 0.583900 -0.018100
+vn 0.820700 0.571300 0.000900
+vn 0.845400 0.532800 -0.037500
+vn 0.866500 0.493200 -0.077100
+vn 0.856800 0.506800 -0.095200
+vn 0.883900 0.452600 -0.117700
+vn 0.874000 0.466600 -0.135400
+vn 0.847100 0.519400 -0.112500
+vn 0.826500 0.558000 -0.073900
+vn 0.834100 0.534900 -0.134300
+vn 0.813800 0.573000 -0.096300
+vn 0.864100 0.479700 -0.152200
+vn 0.850900 0.495900 -0.173400
+vn 0.802400 0.595600 -0.036200
+vn 0.790100 0.610100 -0.059200
+vn 0.897100 0.384500 -0.217500
+vn 0.887500 0.425700 -0.176200
+vn 0.897500 0.411300 -0.159000
+vn 0.907200 0.369600 -0.200700
+vn 0.913100 0.327600 -0.242700
+vn 0.902900 0.342900 -0.259000
+vn 0.915000 0.285200 -0.285200
+vn 0.904800 0.301000 -0.301000
+vn 0.892700 0.357400 -0.274500
+vn 0.887000 0.398500 -0.233400
+vn 0.879000 0.375500 -0.293800
+vn 0.873400 0.415900 -0.253300
+vn 0.894600 0.315900 -0.315900
+vn 0.880900 0.334600 -0.334600
+vn 0.877400 0.439300 -0.192600
+vn 0.864000 0.456100 -0.213200
+vn 0.897100 0.217500 -0.384500
+vn 0.902900 0.259000 -0.342900
+vn 0.913100 0.242700 -0.327600
+vn 0.907200 0.200700 -0.369600
+vn 0.897500 0.159000 -0.411300
+vn 0.887500 0.176200 -0.425700
+vn 0.883900 0.117700 -0.452600
+vn 0.874000 0.135400 -0.466600
+vn 0.877400 0.192600 -0.439300
+vn 0.887000 0.233400 -0.398500
+vn 0.864000 0.213200 -0.456100
+vn 0.873400 0.253300 -0.415900
+vn 0.864100 0.152200 -0.479700
+vn 0.850900 0.173400 -0.495900
+vn 0.892700 0.274500 -0.357400
+vn 0.879000 0.293800 -0.375500
+vn 0.836000 0.056100 -0.545900
+vn 0.856800 0.095200 -0.506800
+vn 0.866500 0.077100 -0.493200
+vn 0.845400 0.037500 -0.532800
+vn 0.820700 -0.000900 -0.571300
+vn 0.811600 0.018100 -0.583900
+vn 0.792400 -0.038300 -0.608700
+vn 0.783600 -0.018900 -0.620900
+vn 0.802400 0.036200 -0.595600
+vn 0.826500 0.073900 -0.558000
+vn 0.790100 0.059200 -0.610100
+vn 0.813800 0.096300 -0.573000
+vn 0.774700 -0.000300 -0.632200
+vn 0.762900 0.023200 -0.646100
+vn 0.847100 0.112500 -0.519400
+vn 0.834100 0.134300 -0.534900
+vn 0.717900 -0.088500 -0.690500
+vn 0.752300 -0.054500 -0.656500
+vn 0.760800 -0.074400 -0.644700
+vn 0.725900 -0.108700 -0.679100
+vn 0.688000 -0.141400 -0.711700
+vn 0.680400 -0.120800 -0.722800
+vn 0.647000 -0.172300 -0.742700
+vn 0.639800 -0.151400 -0.753400
+vn 0.672700 -0.101100 -0.733000
+vn 0.709700 -0.069100 -0.701000
+vn 0.662400 -0.076000 -0.745300
+vn 0.698900 -0.044500 -0.713800
+vn 0.632600 -0.131400 -0.763200
+vn 0.622900 -0.105800 -0.775100
+vn 0.743800 -0.035600 -0.667500
+vn 0.732400 -0.011500 -0.680800
+vn 0.550800 -0.206600 -0.808600
+vn 0.596500 -0.180100 -0.782100
+vn 0.603200 -0.201300 -0.771700
+vn 0.557100 -0.228200 -0.798500
+vn 0.508500 -0.252800 -0.823100
+vn 0.502800 -0.230900 -0.832900
+vn 0.457500 -0.275200 -0.845500
+vn 0.452400 -0.253100 -0.855100
+vn 0.497100 -0.210000 -0.841900
+vn 0.544600 -0.185900 -0.817800
+vn 0.489500 -0.183200 -0.852500
+vn 0.536200 -0.159500 -0.828800
+vn 0.447300 -0.231900 -0.863800
+vn 0.440400 -0.204800 -0.874100
+vn 0.589800 -0.159700 -0.791600
+vn 0.580700 -0.133700 -0.803000
+vn 0.346300 -0.290100 -0.892100
+vn 0.400100 -0.272900 -0.874900
+vn 0.404600 -0.295200 -0.865500
+vn 0.350200 -0.312600 -0.883000
+vn 0.294300 -0.327500 -0.897900
+vn 0.291000 -0.304800 -0.906900
+vn 0.236800 -0.339800 -0.910200
+vn 0.234200 -0.317000 -0.919000
+vn 0.287700 -0.283000 -0.914900
+vn 0.342400 -0.268500 -0.900400
+vn 0.283300 -0.255200 -0.924500
+vn 0.337100 -0.240800 -0.910100
+vn 0.231500 -0.295100 -0.927000
+vn 0.228000 -0.267000 -0.936300
+vn 0.395600 -0.251400 -0.883300
+vn 0.389500 -0.224000 -0.893300
+vn 0.118100 -0.333400 -0.935400
+vn 0.176400 -0.326500 -0.928600
+vn 0.178400 -0.349400 -0.919800
+vn 0.119400 -0.356300 -0.926700
+vn 0.060000 -0.360500 -0.930800
+vn 0.059300 -0.337400 -0.939500
+vn 0.000000 -0.361900 -0.932200
+vn 0.000000 -0.338800 -0.940800
+vn 0.058600 -0.315300 -0.947200
+vn 0.116800 -0.311200 -0.943100
+vn 0.057700 -0.286900 -0.956200
+vn 0.115000 -0.282900 -0.952200
+vn 0.000000 -0.316600 -0.948500
+vn 0.000000 -0.288200 -0.957500
+vn 0.174400 -0.304500 -0.936400
+vn 0.171700 -0.276300 -0.945600
+vn -0.118100 -0.333400 -0.935400
+vn -0.059300 -0.337400 -0.939500
+vn -0.060000 -0.360500 -0.930800
+vn -0.119400 -0.356300 -0.926700
+vn -0.178400 -0.349400 -0.919800
+vn -0.176400 -0.326500 -0.928600
+vn -0.236800 -0.339800 -0.910200
+vn -0.234200 -0.317000 -0.919000
+vn -0.174400 -0.304500 -0.936400
+vn -0.116800 -0.311200 -0.943100
+vn -0.171700 -0.276300 -0.945600
+vn -0.115000 -0.282900 -0.952200
+vn -0.231500 -0.295100 -0.927000
+vn -0.228000 -0.267000 -0.936300
+vn -0.058600 -0.315300 -0.947200
+vn -0.057700 -0.286900 -0.956200
+vn -0.346300 -0.290100 -0.892100
+vn -0.291000 -0.304800 -0.906900
+vn -0.294300 -0.327500 -0.897900
+vn -0.350200 -0.312600 -0.883000
+vn -0.404600 -0.295200 -0.865500
+vn -0.400100 -0.272900 -0.874900
+vn -0.457500 -0.275200 -0.845500
+vn -0.452400 -0.253100 -0.855100
+vn -0.395600 -0.251400 -0.883300
+vn -0.342400 -0.268500 -0.900400
+vn -0.389500 -0.224000 -0.893300
+vn -0.337100 -0.240800 -0.910100
+vn -0.447300 -0.231900 -0.863800
+vn -0.440400 -0.204800 -0.874100
+vn -0.287700 -0.283000 -0.914900
+vn -0.283300 -0.255200 -0.924500
+vn -0.550800 -0.206600 -0.808600
+vn -0.502800 -0.230900 -0.832900
+vn -0.508500 -0.252800 -0.823100
+vn -0.557100 -0.228200 -0.798500
+vn -0.603200 -0.201300 -0.771700
+vn -0.596500 -0.180100 -0.782100
+vn -0.647000 -0.172300 -0.742700
+vn -0.639800 -0.151400 -0.753400
+vn -0.589800 -0.159700 -0.791600
+vn -0.544600 -0.185900 -0.817800
+vn -0.580700 -0.133700 -0.803000
+vn -0.536200 -0.159500 -0.828800
+vn -0.632600 -0.131400 -0.763200
+vn -0.622900 -0.105800 -0.775100
+vn -0.497100 -0.210000 -0.841900
+vn -0.489500 -0.183200 -0.852500
+vn -0.717900 -0.088500 -0.690500
+vn -0.680400 -0.120800 -0.722800
+vn -0.688000 -0.141400 -0.711700
+vn -0.725900 -0.108700 -0.679100
+vn -0.760800 -0.074400 -0.644700
+vn -0.752300 -0.054500 -0.656500
+vn -0.792400 -0.038300 -0.608700
+vn -0.783600 -0.018900 -0.620900
+vn -0.743800 -0.035600 -0.667500
+vn -0.709700 -0.069100 -0.701000
+vn -0.732400 -0.011500 -0.680800
+vn -0.698900 -0.044500 -0.713800
+vn -0.774700 -0.000300 -0.632200
+vn -0.762900 0.023200 -0.646100
+vn -0.672700 -0.101100 -0.733000
+vn -0.662400 -0.076000 -0.745300
+vn -0.836000 0.056100 -0.545900
+vn -0.811600 0.018100 -0.583900
+vn -0.820700 -0.000900 -0.571300
+vn -0.845400 0.037500 -0.532800
+vn -0.866500 0.077100 -0.493200
+vn -0.856800 0.095200 -0.506800
+vn -0.883900 0.117700 -0.452600
+vn -0.874000 0.135400 -0.466600
+vn -0.847100 0.112500 -0.519400
+vn -0.826500 0.073900 -0.558000
+vn -0.834100 0.134300 -0.534900
+vn -0.813800 0.096300 -0.573000
+vn -0.864100 0.152200 -0.479700
+vn -0.850900 0.173400 -0.495900
+vn -0.802400 0.036200 -0.595600
+vn -0.790100 0.059200 -0.610100
+vn -0.897100 0.217500 -0.384500
+vn -0.887500 0.176200 -0.425700
+vn -0.897500 0.159000 -0.411300
+vn -0.907200 0.200700 -0.369600
+vn -0.913100 0.242700 -0.327600
+vn -0.902900 0.259000 -0.342900
+vn -0.915000 0.285200 -0.285200
+vn -0.904800 0.301000 -0.301000
+vn -0.892700 0.274500 -0.357400
+vn -0.887000 0.233400 -0.398500
+vn -0.879000 0.293800 -0.375500
+vn -0.873400 0.253300 -0.415900
+vn -0.894600 0.315900 -0.315900
+vn -0.880900 0.334600 -0.334600
+vn -0.877400 0.192600 -0.439300
+vn -0.864000 0.213200 -0.456100
+vn -0.897100 0.384500 -0.217500
+vn -0.902900 0.342900 -0.259000
+vn -0.913100 0.327600 -0.242700
+vn -0.907200 0.369600 -0.200700
+vn -0.897500 0.411300 -0.159000
+vn -0.887500 0.425700 -0.176200
+vn -0.877400 0.439300 -0.192600
+vn -0.887000 0.398500 -0.233400
+vn -0.864000 0.456100 -0.213200
+vn -0.873400 0.415900 -0.253300
+vn -0.892700 0.357400 -0.274500
+vn -0.879000 0.375500 -0.293800
+vn -0.762900 0.622300 -0.175400
+vn -0.781900 0.586600 -0.211100
+vn -0.793300 0.576500 -0.195500
+vn -0.774000 0.612700 -0.159300
+vn -0.806600 0.564000 -0.176600
+vn -0.787000 0.600800 -0.139800
+vn -0.797600 0.549900 -0.247700
+vn -0.809300 0.539400 -0.232700
+vn -0.822900 0.526200 -0.214400
+vn -0.751500 0.648000 -0.124100
+vn -0.740600 0.657000 -0.140700
+vn -0.725500 0.682200 -0.089800
+vn -0.715100 0.690800 -0.106900
+vn -0.764100 0.636600 -0.103900
+vn -0.737800 0.671500 -0.069100
+vn -0.728400 0.666500 -0.158700
+vn -0.750300 0.632300 -0.192800
+vn -0.712900 0.677600 -0.180600
+vn -0.734300 0.644200 -0.214000
+vn -0.703300 0.699700 -0.125500
+vn -0.688300 0.710100 -0.148100
+vn -0.768900 0.597200 -0.227900
+vn -0.784400 0.561200 -0.264000
+vn -0.752600 0.609800 -0.248400
+vn -0.767700 0.574600 -0.283600
+vn -0.655100 0.754300 -0.043400
+vn -0.686500 0.723300 -0.074400
+vn -0.696600 0.715200 -0.056800
+vn -0.664700 0.746700 -0.025400
+vn -0.708200 0.705000 -0.035600
+vn -0.675900 0.737000 -0.003600
+vn -0.630000 0.776600 0.004500
+vn -0.620900 0.783700 -0.013900
+vn -0.592400 0.804900 0.032900
+vn -0.583900 0.811700 0.014000
+vn -0.640600 0.767400 0.026800
+vn -0.602400 0.796300 0.055600
+vn -0.610600 0.791200 -0.034000
+vn -0.644300 0.762200 -0.063000
+vn -0.597600 0.799600 -0.058600
+vn -0.630500 0.771200 -0.087000
+vn -0.574200 0.818600 -0.006500
+vn -0.562000 0.826500 -0.031700
+vn -0.675200 0.731700 -0.093500
+vn -0.660800 0.741400 -0.116800
+vn -0.502700 0.862100 0.064400
+vn -0.544300 0.837900 0.040200
+vn -0.552300 0.831500 0.059400
+vn -0.510000 0.856000 0.084000
+vn -0.561600 0.823200 0.082600
+vn -0.518600 0.848200 0.107600
+vn -0.465600 0.878600 0.106500
+vn -0.458800 0.884300 0.086600
+vn -0.418900 0.899100 0.127000
+vn -0.412900 0.904500 0.106800
+vn -0.473400 0.871100 0.130500
+vn -0.425900 0.892000 0.151300
+vn -0.451300 0.890000 0.064800
+vn -0.494400 0.868200 0.043000
+vn -0.441600 0.896400 0.038100
+vn -0.483800 0.875000 0.016700
+vn -0.406000 0.909900 0.084700
+vn -0.397400 0.915800 0.057600
+vn -0.535400 0.844400 0.019200
+vn -0.523900 0.851700 -0.006500
+vn -0.316000 0.938300 0.140600
+vn -0.365100 0.922500 0.124900
+vn -0.370400 0.917400 0.145300
+vn -0.320600 0.933300 0.161300
+vn -0.376700 0.910600 0.170000
+vn -0.326000 0.926800 0.186200
+vn -0.269400 0.947000 0.174900
+vn -0.265500 0.951700 0.154000
+vn -0.216800 0.958300 0.186200
+vn -0.213700 0.962800 0.165100
+vn -0.273900 0.940700 0.200000
+vn -0.220500 0.952100 0.211500
+vn -0.261100 0.956300 0.131100
+vn -0.310800 0.943100 0.117900
+vn -0.255600 0.961300 0.103000
+vn -0.304100 0.948300 0.090100
+vn -0.210200 0.967300 0.142100
+vn -0.205700 0.972000 0.113700
+vn -0.359100 0.927600 0.102500
+vn -0.351400 0.933200 0.075000
+vn -0.107800 0.977700 0.180000
+vn -0.161000 0.971500 0.173800
+vn -0.163300 0.967100 0.195000
+vn -0.109300 0.973400 0.201300
+vn -0.166100 0.961100 0.220500
+vn -0.111200 0.967500 0.226900
+vn -0.054900 0.977200 0.205100
+vn -0.054100 0.981500 0.183800
+vn 0.000000 0.978500 0.206400
+vn 0.000000 0.982700 0.185000
+vn -0.055800 0.971400 0.230800
+vn 0.000000 0.972700 0.232100
+vn -0.053200 0.985600 0.160400
+vn -0.106000 0.981900 0.156700
+vn -0.052100 0.989900 0.131700
+vn -0.103700 0.986300 0.128100
+vn 0.000000 0.986800 0.161600
+vn 0.000000 0.991100 0.132900
+vn -0.158300 0.975800 0.150600
+vn -0.154900 0.980300 0.122100
+vn 0.107800 0.977700 0.180000
+vn 0.054100 0.981500 0.183800
+vn 0.054900 0.977200 0.205100
+vn 0.109300 0.973400 0.201300
+vn 0.055800 0.971400 0.230800
+vn 0.111200 0.967500 0.226900
+vn 0.163300 0.967100 0.195000
+vn 0.161000 0.971500 0.173800
+vn 0.216800 0.958300 0.186200
+vn 0.213700 0.962800 0.165100
+vn 0.166100 0.961100 0.220500
+vn 0.220500 0.952100 0.211500
+vn 0.158300 0.975800 0.150600
+vn 0.106000 0.981900 0.156700
+vn 0.154900 0.980300 0.122100
+vn 0.103700 0.986300 0.128100
+vn 0.210200 0.967300 0.142100
+vn 0.205700 0.972000 0.113700
+vn 0.053200 0.985600 0.160400
+vn 0.052100 0.989900 0.131700
+vn 0.316000 0.938300 0.140600
+vn 0.265500 0.951700 0.154000
+vn 0.269400 0.947000 0.174900
+vn 0.320600 0.933300 0.161300
+vn 0.273900 0.940700 0.200100
+vn 0.326000 0.926800 0.186200
+vn 0.370400 0.917400 0.145300
+vn 0.365100 0.922500 0.124900
+vn 0.418900 0.899100 0.127000
+vn 0.412900 0.904500 0.106800
+vn 0.376700 0.910600 0.170000
+vn 0.425900 0.892000 0.151300
+vn 0.359100 0.927600 0.102500
+vn 0.310800 0.943100 0.117900
+vn 0.351400 0.933200 0.075000
+vn 0.304100 0.948300 0.090100
+vn 0.406000 0.909900 0.084700
+vn 0.397400 0.915800 0.057600
+vn 0.261100 0.956300 0.131100
+vn 0.255600 0.961300 0.103000
+vn 0.502700 0.862100 0.064400
+vn 0.458800 0.884300 0.086600
+vn 0.465600 0.878600 0.106500
+vn 0.510000 0.856000 0.084000
+vn 0.473400 0.871100 0.130500
+vn 0.518600 0.848200 0.107600
+vn 0.552300 0.831500 0.059400
+vn 0.544400 0.837900 0.040200
+vn 0.592400 0.804900 0.032900
+vn 0.583900 0.811700 0.014000
+vn 0.561600 0.823200 0.082600
+vn 0.602400 0.796300 0.055600
+vn 0.535400 0.844400 0.019200
+vn 0.494400 0.868200 0.043000
+vn 0.523900 0.851700 -0.006500
+vn 0.483800 0.875000 0.016800
+vn 0.574200 0.818600 -0.006500
+vn 0.562000 0.826500 -0.031700
+vn 0.451300 0.890000 0.064800
+vn 0.441600 0.896400 0.038100
+vn 0.655100 0.754300 -0.043400
+vn 0.620900 0.783700 -0.013900
+vn 0.630000 0.776600 0.004500
+vn 0.664700 0.746700 -0.025400
+vn 0.640600 0.767400 0.026800
+vn 0.675900 0.737000 -0.003600
+vn 0.696600 0.715200 -0.056800
+vn 0.686500 0.723300 -0.074400
+vn 0.725500 0.682200 -0.089800
+vn 0.715100 0.690800 -0.106900
+vn 0.708200 0.705000 -0.035600
+vn 0.737800 0.671500 -0.069100
+vn 0.675200 0.731700 -0.093500
+vn 0.644300 0.762200 -0.063000
+vn 0.660800 0.741400 -0.116800
+vn 0.630500 0.771200 -0.087000
+vn 0.703300 0.699700 -0.125500
+vn 0.688300 0.710100 -0.148100
+vn 0.610600 0.791200 -0.034000
+vn 0.597600 0.799600 -0.058600
+vn 0.762900 0.622300 -0.175400
+vn 0.740600 0.657000 -0.140700
+vn 0.751500 0.648000 -0.124100
+vn 0.774000 0.612700 -0.159300
+vn 0.764100 0.636600 -0.103900
+vn 0.787000 0.600800 -0.139800
+vn 0.793300 0.576500 -0.195500
+vn 0.781900 0.586600 -0.211100
+vn 0.809300 0.539400 -0.232700
+vn 0.797600 0.549900 -0.247700
+vn 0.806600 0.564000 -0.176600
+vn 0.822900 0.526200 -0.214400
+vn 0.768900 0.597200 -0.227900
+vn 0.750300 0.632300 -0.192800
+vn 0.752600 0.609800 -0.248400
+vn 0.734300 0.644200 -0.214000
+vn 0.784400 0.561200 -0.264000
+vn 0.767700 0.574600 -0.283600
+vn 0.728400 0.666500 -0.158700
+vn 0.712900 0.677600 -0.180600
+vn 0.818700 0.475100 -0.322600
+vn 0.809900 0.512600 -0.285000
+vn 0.821700 0.501500 -0.270500
+vn 0.830700 0.463300 -0.308700
+vn 0.835500 0.487700 -0.252800
+vn 0.844600 0.448900 -0.291700
+vn 0.836000 0.424800 -0.347200
+vn 0.823900 0.437100 -0.360600
+vn 0.837800 0.386000 -0.386000
+vn 0.825700 0.398800 -0.398800
+vn 0.850100 0.409800 -0.330800
+vn 0.851900 0.370300 -0.370300
+vn 0.810400 0.450200 -0.375000
+vn 0.805100 0.487500 -0.337600
+vn 0.793100 0.466000 -0.392300
+vn 0.788000 0.502500 -0.355800
+vn 0.812100 0.412600 -0.412600
+vn 0.794800 0.429100 -0.429100
+vn 0.796500 0.524600 -0.300600
+vn 0.779500 0.538700 -0.319500
+vn 0.818700 0.322600 -0.475100
+vn 0.823900 0.360600 -0.437100
+vn 0.836000 0.347200 -0.424800
+vn 0.830700 0.308700 -0.463300
+vn 0.850100 0.330800 -0.409800
+vn 0.844600 0.291700 -0.448900
+vn 0.821700 0.270500 -0.501500
+vn 0.809900 0.285000 -0.512600
+vn 0.809300 0.232700 -0.539400
+vn 0.797600 0.247700 -0.549900
+vn 0.835500 0.252800 -0.487700
+vn 0.822900 0.214400 -0.526200
+vn 0.796500 0.300600 -0.524600
+vn 0.805100 0.337600 -0.487500
+vn 0.779500 0.319500 -0.538700
+vn 0.788000 0.355800 -0.502500
+vn 0.784400 0.264000 -0.561200
+vn 0.767700 0.283600 -0.574600
+vn 0.810400 0.375000 -0.450200
+vn 0.793100 0.392300 -0.466000
+vn 0.762900 0.175400 -0.622300
+vn 0.781900 0.211100 -0.586600
+vn 0.793300 0.195500 -0.576500
+vn 0.774000 0.159300 -0.612700
+vn 0.806600 0.176600 -0.564000
+vn 0.787000 0.139800 -0.600800
+vn 0.751500 0.124100 -0.648000
+vn 0.740600 0.140700 -0.657000
+vn 0.725500 0.089800 -0.682200
+vn 0.715100 0.106900 -0.690800
+vn 0.764100 0.103900 -0.636600
+vn 0.737800 0.069100 -0.671500
+vn 0.728400 0.158700 -0.666500
+vn 0.750300 0.192800 -0.632300
+vn 0.712900 0.180600 -0.677600
+vn 0.734300 0.214000 -0.644200
+vn 0.703300 0.125500 -0.699700
+vn 0.688300 0.148100 -0.710100
+vn 0.768900 0.227900 -0.597200
+vn 0.752600 0.248400 -0.609800
+vn 0.655100 0.043400 -0.754300
+vn 0.686500 0.074400 -0.723300
+vn 0.696600 0.056800 -0.715200
+vn 0.664700 0.025400 -0.746700
+vn 0.708200 0.035600 -0.705000
+vn 0.675800 0.003600 -0.737000
+vn 0.630000 -0.004500 -0.776600
+vn 0.620900 0.013900 -0.783700
+vn 0.592400 -0.032900 -0.804900
+vn 0.583900 -0.014000 -0.811700
+vn 0.640600 -0.026800 -0.767400
+vn 0.602400 -0.055600 -0.796300
+vn 0.610600 0.034000 -0.791200
+vn 0.644300 0.063000 -0.762200
+vn 0.597600 0.058600 -0.799600
+vn 0.630500 0.087000 -0.771200
+vn 0.574200 0.006500 -0.818600
+vn 0.562000 0.031700 -0.826500
+vn 0.675200 0.093500 -0.731700
+vn 0.660800 0.116800 -0.741400
+vn 0.502700 -0.064400 -0.862100
+vn 0.544300 -0.040200 -0.837900
+vn 0.552300 -0.059400 -0.831500
+vn 0.510000 -0.084000 -0.856000
+vn 0.561600 -0.082600 -0.823200
+vn 0.518600 -0.107600 -0.848200
+vn 0.465600 -0.106500 -0.878600
+vn 0.458800 -0.086600 -0.884300
+vn 0.418900 -0.127000 -0.899100
+vn 0.412900 -0.106800 -0.904500
+vn 0.473400 -0.130500 -0.871100
+vn 0.425900 -0.151300 -0.892000
+vn 0.451300 -0.064800 -0.890000
+vn 0.494400 -0.043000 -0.868200
+vn 0.441600 -0.038100 -0.896400
+vn 0.483800 -0.016700 -0.875000
+vn 0.406000 -0.084700 -0.909900
+vn 0.397400 -0.057600 -0.915800
+vn 0.535400 -0.019200 -0.844400
+vn 0.523900 0.006500 -0.851700
+vn 0.316000 -0.140600 -0.938300
+vn 0.365100 -0.124900 -0.922500
+vn 0.370400 -0.145300 -0.917400
+vn 0.320600 -0.161300 -0.933300
+vn 0.376700 -0.170000 -0.910600
+vn 0.326000 -0.186200 -0.926800
+vn 0.269400 -0.174900 -0.947000
+vn 0.265500 -0.154000 -0.951700
+vn 0.216800 -0.186200 -0.958300
+vn 0.213700 -0.165100 -0.962800
+vn 0.273900 -0.200100 -0.940700
+vn 0.220500 -0.211500 -0.952100
+vn 0.261100 -0.131100 -0.956300
+vn 0.310800 -0.117900 -0.943100
+vn 0.255600 -0.103000 -0.961300
+vn 0.304100 -0.090100 -0.948300
+vn 0.210200 -0.142100 -0.967300
+vn 0.205700 -0.113700 -0.972000
+vn 0.359100 -0.102500 -0.927600
+vn 0.351400 -0.075000 -0.933200
+vn 0.107800 -0.180000 -0.977700
+vn 0.161000 -0.173800 -0.971500
+vn 0.163300 -0.195000 -0.967100
+vn 0.109300 -0.201300 -0.973400
+vn 0.166100 -0.220500 -0.961100
+vn 0.111200 -0.226900 -0.967500
+vn 0.054900 -0.205100 -0.977200
+vn 0.054100 -0.183800 -0.981500
+vn 0.000000 -0.206400 -0.978500
+vn 0.000000 -0.185000 -0.982700
+vn 0.055800 -0.230800 -0.971400
+vn 0.000000 -0.232100 -0.972700
+vn 0.053200 -0.160400 -0.985600
+vn 0.106000 -0.156700 -0.981900
+vn 0.052100 -0.131700 -0.989900
+vn 0.103700 -0.128100 -0.986300
+vn 0.000000 -0.161600 -0.986800
+vn 0.000000 -0.132900 -0.991100
+vn 0.158300 -0.150600 -0.975800
+vn 0.154900 -0.122100 -0.980300
+vn -0.107800 -0.180000 -0.977700
+vn -0.054100 -0.183800 -0.981500
+vn -0.054900 -0.205100 -0.977200
+vn -0.109300 -0.201300 -0.973400
+vn -0.055800 -0.230800 -0.971400
+vn -0.111200 -0.226900 -0.967500
+vn -0.163300 -0.195000 -0.967100
+vn -0.161000 -0.173800 -0.971500
+vn -0.216800 -0.186200 -0.958300
+vn -0.213700 -0.165100 -0.962800
+vn -0.166100 -0.220500 -0.961100
+vn -0.220500 -0.211500 -0.952100
+vn -0.158300 -0.150600 -0.975800
+vn -0.106000 -0.156700 -0.981900
+vn -0.154900 -0.122100 -0.980300
+vn -0.103700 -0.128100 -0.986300
+vn -0.210200 -0.142100 -0.967300
+vn -0.205700 -0.113700 -0.972000
+vn -0.053200 -0.160400 -0.985600
+vn -0.052100 -0.131700 -0.989900
+vn -0.316000 -0.140600 -0.938300
+vn -0.265500 -0.154000 -0.951700
+vn -0.269400 -0.174900 -0.947000
+vn -0.320600 -0.161300 -0.933300
+vn -0.273900 -0.200100 -0.940700
+vn -0.326000 -0.186200 -0.926800
+vn -0.370400 -0.145300 -0.917400
+vn -0.365100 -0.124900 -0.922500
+vn -0.418900 -0.127000 -0.899100
+vn -0.412900 -0.106800 -0.904500
+vn -0.376700 -0.170000 -0.910600
+vn -0.425900 -0.151400 -0.892000
+vn -0.359100 -0.102500 -0.927600
+vn -0.310800 -0.117900 -0.943100
+vn -0.351400 -0.075000 -0.933200
+vn -0.304100 -0.090100 -0.948300
+vn -0.406000 -0.084700 -0.909900
+vn -0.397400 -0.057600 -0.915800
+vn -0.261100 -0.131100 -0.956300
+vn -0.255600 -0.103000 -0.961300
+vn -0.502700 -0.064400 -0.862100
+vn -0.458800 -0.086600 -0.884300
+vn -0.465600 -0.106500 -0.878600
+vn -0.510000 -0.084000 -0.856000
+vn -0.473400 -0.130500 -0.871100
+vn -0.518600 -0.107600 -0.848200
+vn -0.552300 -0.059400 -0.831500
+vn -0.544400 -0.040200 -0.837900
+vn -0.592400 -0.032900 -0.804900
+vn -0.583900 -0.014000 -0.811700
+vn -0.561600 -0.082600 -0.823200
+vn -0.602400 -0.055600 -0.796300
+vn -0.535400 -0.019200 -0.844400
+vn -0.494400 -0.043000 -0.868200
+vn -0.523900 0.006500 -0.851700
+vn -0.483800 -0.016700 -0.875000
+vn -0.574200 0.006500 -0.818600
+vn -0.562000 0.031700 -0.826500
+vn -0.451300 -0.064800 -0.890000
+vn -0.441600 -0.038100 -0.896400
+vn -0.655100 0.043400 -0.754300
+vn -0.620900 0.013900 -0.783700
+vn -0.630000 -0.004500 -0.776600
+vn -0.664700 0.025400 -0.746700
+vn -0.640600 -0.026800 -0.767400
+vn -0.675800 0.003600 -0.737000
+vn -0.696600 0.056800 -0.715200
+vn -0.686500 0.074400 -0.723300
+vn -0.725500 0.089800 -0.682200
+vn -0.715100 0.106900 -0.690800
+vn -0.708200 0.035600 -0.705000
+vn -0.737800 0.069100 -0.671500
+vn -0.675200 0.093500 -0.731700
+vn -0.644300 0.063000 -0.762200
+vn -0.660800 0.116800 -0.741400
+vn -0.630500 0.087000 -0.771200
+vn -0.703300 0.125500 -0.699700
+vn -0.688300 0.148100 -0.710100
+vn -0.610600 0.034000 -0.791200
+vn -0.597600 0.058600 -0.799600
+vn -0.762900 0.175400 -0.622300
+vn -0.740600 0.140700 -0.657000
+vn -0.751500 0.124100 -0.648000
+vn -0.774000 0.159300 -0.612700
+vn -0.764100 0.103900 -0.636600
+vn -0.787000 0.139800 -0.600800
+vn -0.793300 0.195500 -0.576500
+vn -0.781900 0.211100 -0.586600
+vn -0.809300 0.232700 -0.539400
+vn -0.797600 0.247700 -0.549900
+vn -0.806600 0.176600 -0.564000
+vn -0.822900 0.214400 -0.526200
+vn -0.768900 0.227900 -0.597200
+vn -0.750300 0.192800 -0.632300
+vn -0.752600 0.248400 -0.609800
+vn -0.734300 0.214000 -0.644200
+vn -0.784400 0.264000 -0.561200
+vn -0.767700 0.283600 -0.574600
+vn -0.728400 0.158700 -0.666500
+vn -0.712900 0.180600 -0.677600
+vn -0.818700 0.322600 -0.475100
+vn -0.809900 0.285000 -0.512600
+vn -0.821700 0.270500 -0.501500
+vn -0.830700 0.308700 -0.463300
+vn -0.835500 0.252800 -0.487700
+vn -0.844600 0.291700 -0.448900
+vn -0.836000 0.347200 -0.424800
+vn -0.823900 0.360600 -0.437100
+vn -0.837800 0.386000 -0.386000
+vn -0.825700 0.398800 -0.398800
+vn -0.850100 0.330800 -0.409800
+vn -0.851900 0.370300 -0.370300
+vn -0.810400 0.375000 -0.450200
+vn -0.805100 0.337600 -0.487500
+vn -0.793100 0.392300 -0.466000
+vn -0.788000 0.355800 -0.502500
+vn -0.812100 0.412600 -0.412600
+vn -0.794800 0.429100 -0.429100
+vn -0.796500 0.300600 -0.524500
+vn -0.779500 0.319500 -0.538700
+vn -0.818700 0.475100 -0.322600
+vn -0.823900 0.437100 -0.360600
+vn -0.836000 0.424800 -0.347200
+vn -0.830700 0.463400 -0.308700
+vn -0.850100 0.409800 -0.330800
+vn -0.844600 0.448900 -0.291700
+vn -0.821700 0.501500 -0.270500
+vn -0.809900 0.512600 -0.285000
+vn -0.835500 0.487700 -0.252800
+vn -0.796500 0.524600 -0.300600
+vn -0.805100 0.487500 -0.337600
+vn -0.779500 0.538700 -0.319500
+vn -0.788000 0.502500 -0.355800
+vn -0.810400 0.450200 -0.375000
+vn -0.793100 0.466000 -0.392300
+vn -0.697100 0.668200 -0.259900
+vn -0.714400 0.635600 -0.292500
+vn -0.733700 0.623200 -0.270800
+vn -0.715900 0.656600 -0.237300
+vn -0.728800 0.602100 -0.326000
+vn -0.748500 0.588800 -0.305200
+vn -0.695000 0.689200 -0.204700
+vn -0.676700 0.699900 -0.228100
+vn -0.671000 0.720900 -0.173000
+vn -0.653400 0.730800 -0.197300
+vn -0.657800 0.710000 -0.251400
+vn -0.677500 0.679100 -0.282200
+vn -0.637700 0.719500 -0.274800
+vn -0.656900 0.689600 -0.304800
+vn -0.635100 0.740000 -0.221400
+vn -0.615800 0.748600 -0.245800
+vn -0.694400 0.647500 -0.313900
+vn -0.708400 0.614900 -0.346500
+vn -0.673300 0.658900 -0.335500
+vn -0.686800 0.627300 -0.367000
+vn -0.598600 0.788800 -0.139300
+vn -0.627300 0.760500 -0.167600
+vn -0.644200 0.751400 -0.142500
+vn -0.614700 0.780500 -0.113400
+vn -0.582600 0.808200 -0.085800
+vn -0.567300 0.815800 -0.112300
+vn -0.547900 0.834400 -0.059500
+vn -0.533500 0.841300 -0.086800
+vn -0.551400 0.822600 -0.138800
+vn -0.581800 0.796400 -0.165000
+vn -0.534700 0.828600 -0.165700
+vn -0.564100 0.803200 -0.191100
+vn -0.518600 0.847400 -0.114000
+vn -0.502800 0.852700 -0.141700
+vn -0.609700 0.768900 -0.192500
+vn -0.591100 0.776600 -0.217800
+vn -0.459300 0.887300 -0.040800
+vn -0.497400 0.865200 -0.062900
+vn -0.510800 0.858900 -0.034900
+vn -0.471700 0.881600 -0.012300
+vn -0.430600 0.902500 0.008500
+vn -0.419300 0.907600 -0.020500
+vn -0.387400 0.921500 0.027500
+vn -0.377200 0.926100 -0.002000
+vn -0.407500 0.911800 -0.049600
+vn -0.446400 0.892100 -0.069300
+vn -0.395100 0.915200 -0.079200
+vn -0.432800 0.896100 -0.098300
+vn -0.366700 0.929800 -0.031600
+vn -0.355500 0.932600 -0.061700
+vn -0.483400 0.870600 -0.090800
+vn -0.468700 0.875200 -0.119100
+vn -0.288700 0.957000 0.028800
+vn -0.333600 0.942600 0.014500
+vn -0.342600 0.938400 0.044500
+vn -0.296500 0.953200 0.059200
+vn -0.249200 0.965800 0.071800
+vn -0.242600 0.969200 0.041100
+vn -0.200500 0.976200 0.082200
+vn -0.195300 0.979400 0.051300
+vn -0.235800 0.971700 0.010300
+vn -0.280600 0.959800 -0.001600
+vn -0.228600 0.973300 -0.021100
+vn -0.272100 0.961700 -0.032700
+vn -0.189800 0.981600 0.020200
+vn -0.184000 0.982800 -0.011500
+vn -0.324300 0.945800 -0.015600
+vn -0.314400 0.948100 -0.046200
+vn -0.098500 0.993000 0.064900
+vn -0.147100 0.987300 0.059200
+vn -0.151000 0.984400 0.090400
+vn -0.101100 0.990200 0.096300
+vn -0.050800 0.993700 0.099800
+vn -0.049400 0.996400 0.068300
+vn 0.000000 0.994900 0.100900
+vn 0.000000 0.997600 0.069500
+vn -0.048100 0.998100 0.036700
+vn -0.095700 0.994800 0.033400
+vn -0.046600 0.998900 0.004500
+vn -0.092800 0.995700 0.001300
+vn 0.000000 0.999300 0.037800
+vn 0.000000 1.000000 0.005600
+vn -0.142900 0.989300 0.027900
+vn -0.138600 0.990300 -0.004000
+vn 0.098500 0.993000 0.064900
+vn 0.049400 0.996400 0.068300
+vn 0.050800 0.993700 0.099800
+vn 0.101100 0.990200 0.096300
+vn 0.151000 0.984400 0.090400
+vn 0.147100 0.987300 0.059200
+vn 0.200500 0.976200 0.082200
+vn 0.195300 0.979400 0.051300
+vn 0.142900 0.989300 0.027900
+vn 0.095700 0.994800 0.033400
+vn 0.138600 0.990300 -0.004000
+vn 0.092800 0.995700 0.001300
+vn 0.189800 0.981600 0.020200
+vn 0.184000 0.982800 -0.011500
+vn 0.048100 0.998100 0.036700
+vn 0.046600 0.998900 0.004500
+vn 0.288700 0.957000 0.028800
+vn 0.242600 0.969200 0.041100
+vn 0.249200 0.965800 0.071800
+vn 0.296500 0.953200 0.059200
+vn 0.342600 0.938400 0.044500
+vn 0.333600 0.942600 0.014500
+vn 0.387400 0.921500 0.027500
+vn 0.377200 0.926100 -0.002000
+vn 0.324300 0.945800 -0.015600
+vn 0.280600 0.959800 -0.001600
+vn 0.314400 0.948100 -0.046200
+vn 0.272100 0.961700 -0.032700
+vn 0.366700 0.929800 -0.031600
+vn 0.355500 0.932600 -0.061800
+vn 0.235800 0.971700 0.010300
+vn 0.228600 0.973300 -0.021100
+vn 0.459300 0.887300 -0.040800
+vn 0.419300 0.907600 -0.020500
+vn 0.430600 0.902500 0.008500
+vn 0.471700 0.881600 -0.012300
+vn 0.510800 0.858900 -0.035000
+vn 0.497400 0.865200 -0.062900
+vn 0.547900 0.834400 -0.059500
+vn 0.533500 0.841300 -0.086800
+vn 0.483400 0.870600 -0.090800
+vn 0.446400 0.892100 -0.069300
+vn 0.468700 0.875200 -0.119100
+vn 0.432800 0.896100 -0.098300
+vn 0.518600 0.847400 -0.114000
+vn 0.502800 0.852700 -0.141700
+vn 0.407500 0.911800 -0.049600
+vn 0.395100 0.915200 -0.079200
+vn 0.598600 0.788800 -0.139300
+vn 0.567300 0.815800 -0.112300
+vn 0.582600 0.808200 -0.085800
+vn 0.614700 0.780500 -0.113400
+vn 0.644200 0.751400 -0.142500
+vn 0.627300 0.760500 -0.167600
+vn 0.671000 0.720900 -0.173000
+vn 0.653400 0.730800 -0.197300
+vn 0.609700 0.768900 -0.192500
+vn 0.581800 0.796400 -0.165000
+vn 0.591100 0.776600 -0.217800
+vn 0.564100 0.803200 -0.191100
+vn 0.635100 0.740000 -0.221400
+vn 0.615800 0.748600 -0.245800
+vn 0.551400 0.822600 -0.138800
+vn 0.534700 0.828600 -0.165700
+vn 0.697100 0.668200 -0.259900
+vn 0.676700 0.699900 -0.228100
+vn 0.695000 0.689200 -0.204700
+vn 0.715900 0.656600 -0.237300
+vn 0.733700 0.623200 -0.270800
+vn 0.714400 0.635600 -0.292500
+vn 0.748500 0.588800 -0.305200
+vn 0.728800 0.602100 -0.326000
+vn 0.694400 0.647500 -0.313900
+vn 0.677500 0.679100 -0.282200
+vn 0.673300 0.658900 -0.335500
+vn 0.656900 0.689600 -0.304800
+vn 0.708400 0.614900 -0.346500
+vn 0.686800 0.627300 -0.367000
+vn 0.657800 0.710000 -0.251400
+vn 0.637700 0.719500 -0.274800
+vn 0.748000 0.533700 -0.394400
+vn 0.740000 0.568000 -0.360000
+vn 0.760000 0.553800 -0.340100
+vn 0.768200 0.518500 -0.375400
+vn 0.773200 0.482900 -0.411100
+vn 0.752900 0.499000 -0.429100
+vn 0.774900 0.447000 -0.447000
+vn 0.754500 0.464000 -0.464000
+vn 0.731800 0.514700 -0.446700
+vn 0.727100 0.548400 -0.413000
+vn 0.709500 0.530100 -0.464200
+vn 0.704900 0.562800 -0.431600
+vn 0.733400 0.480700 -0.480700
+vn 0.719300 0.581800 -0.379600
+vn 0.697400 0.595200 -0.399200
+vn 0.748000 0.394400 -0.533700
+vn 0.752900 0.429100 -0.499000
+vn 0.773200 0.411100 -0.482900
+vn 0.768200 0.375400 -0.518500
+vn 0.760000 0.340100 -0.553800
+vn 0.740000 0.360000 -0.568000
+vn 0.748500 0.305200 -0.588800
+vn 0.728800 0.326000 -0.602100
+vn 0.719300 0.379600 -0.581800
+vn 0.727100 0.413000 -0.548400
+vn 0.697400 0.399200 -0.595200
+vn 0.704900 0.431600 -0.562800
+vn 0.708400 0.346500 -0.614900
+vn 0.686800 0.367000 -0.627300
+vn 0.731800 0.446700 -0.514700
+vn 0.709500 0.464200 -0.530100
+vn 0.697100 0.259900 -0.668200
+vn 0.714400 0.292500 -0.635600
+vn 0.733700 0.270800 -0.623200
+vn 0.715900 0.237300 -0.656600
+vn 0.695000 0.204700 -0.689200
+vn 0.676700 0.228100 -0.699900
+vn 0.671000 0.173000 -0.720900
+vn 0.653400 0.197300 -0.730800
+vn 0.657800 0.251400 -0.710000
+vn 0.677500 0.282200 -0.679100
+vn 0.637700 0.274900 -0.719500
+vn 0.656900 0.304800 -0.689600
+vn 0.635100 0.221400 -0.740000
+vn 0.615800 0.245800 -0.748600
+vn 0.694400 0.313900 -0.647500
+vn 0.673300 0.335500 -0.658900
+vn 0.598600 0.139300 -0.788800
+vn 0.627300 0.167600 -0.760500
+vn 0.644200 0.142500 -0.751400
+vn 0.614700 0.113400 -0.780500
+vn 0.582600 0.085800 -0.808200
+vn 0.567300 0.112300 -0.815800
+vn 0.547900 0.059500 -0.834400
+vn 0.533500 0.086800 -0.841300
+vn 0.551400 0.138800 -0.822600
+vn 0.581800 0.165000 -0.796400
+vn 0.534700 0.165700 -0.828600
+vn 0.564100 0.191100 -0.803200
+vn 0.518600 0.114000 -0.847400
+vn 0.502800 0.141700 -0.852700
+vn 0.609700 0.192500 -0.768900
+vn 0.591100 0.217800 -0.776600
+vn 0.459300 0.040800 -0.887300
+vn 0.497400 0.062900 -0.865200
+vn 0.510800 0.034900 -0.858900
+vn 0.471700 0.012300 -0.881600
+vn 0.430600 -0.008500 -0.902500
+vn 0.419300 0.020500 -0.907600
+vn 0.387400 -0.027500 -0.921500
+vn 0.377200 0.002000 -0.926100
+vn 0.407500 0.049600 -0.911800
+vn 0.446400 0.069300 -0.892100
+vn 0.395100 0.079200 -0.915200
+vn 0.432800 0.098300 -0.896100
+vn 0.366700 0.031600 -0.929800
+vn 0.355500 0.061700 -0.932600
+vn 0.483400 0.090800 -0.870600
+vn 0.468700 0.119100 -0.875200
+vn 0.288700 -0.028800 -0.957000
+vn 0.333600 -0.014500 -0.942600
+vn 0.342600 -0.044500 -0.938400
+vn 0.296500 -0.059200 -0.953200
+vn 0.249200 -0.071800 -0.965800
+vn 0.242600 -0.041100 -0.969200
+vn 0.200500 -0.082200 -0.976200
+vn 0.195300 -0.051300 -0.979400
+vn 0.235800 -0.010300 -0.971700
+vn 0.280600 0.001600 -0.959800
+vn 0.228600 0.021100 -0.973300
+vn 0.272100 0.032700 -0.961700
+vn 0.189800 -0.020200 -0.981600
+vn 0.184000 0.011500 -0.982800
+vn 0.324300 0.015600 -0.945800
+vn 0.314400 0.046200 -0.948100
+vn 0.098500 -0.064900 -0.993000
+vn 0.147100 -0.059200 -0.987300
+vn 0.151000 -0.090400 -0.984400
+vn 0.101100 -0.096300 -0.990200
+vn 0.050800 -0.099800 -0.993700
+vn 0.049400 -0.068300 -0.996400
+vn 0.000000 -0.100900 -0.994900
+vn 0.000000 -0.069500 -0.997600
+vn 0.048100 -0.036700 -0.998100
+vn 0.095700 -0.033400 -0.994800
+vn 0.046600 -0.004500 -0.998900
+vn 0.092800 -0.001300 -0.995700
+vn 0.000000 -0.037800 -0.999300
+vn 0.000000 -0.005600 -1.000000
+vn 0.142900 -0.027900 -0.989300
+vn 0.138600 0.004000 -0.990300
+vn -0.098500 -0.064900 -0.993000
+vn -0.049400 -0.068300 -0.996400
+vn -0.050800 -0.099800 -0.993700
+vn -0.101100 -0.096300 -0.990200
+vn -0.151000 -0.090400 -0.984400
+vn -0.147100 -0.059200 -0.987300
+vn -0.200500 -0.082200 -0.976200
+vn -0.195300 -0.051300 -0.979400
+vn -0.142900 -0.027900 -0.989300
+vn -0.095700 -0.033400 -0.994800
+vn -0.138600 0.004000 -0.990300
+vn -0.092800 -0.001300 -0.995700
+vn -0.189800 -0.020200 -0.981600
+vn -0.184000 0.011500 -0.982800
+vn -0.048100 -0.036700 -0.998100
+vn -0.046600 -0.004500 -0.998900
+vn -0.288700 -0.028800 -0.957000
+vn -0.242600 -0.041100 -0.969200
+vn -0.249200 -0.071800 -0.965800
+vn -0.296500 -0.059200 -0.953200
+vn -0.342600 -0.044500 -0.938400
+vn -0.333600 -0.014500 -0.942600
+vn -0.387400 -0.027500 -0.921500
+vn -0.377200 0.002000 -0.926100
+vn -0.324300 0.015600 -0.945800
+vn -0.280600 0.001600 -0.959800
+vn -0.314400 0.046200 -0.948100
+vn -0.272100 0.032700 -0.961700
+vn -0.366700 0.031600 -0.929800
+vn -0.355500 0.061800 -0.932600
+vn -0.235800 -0.010300 -0.971700
+vn -0.228600 0.021100 -0.973300
+vn -0.459300 0.040800 -0.887300
+vn -0.419300 0.020500 -0.907600
+vn -0.430600 -0.008500 -0.902500
+vn -0.471700 0.012300 -0.881600
+vn -0.510800 0.034900 -0.858900
+vn -0.497400 0.062900 -0.865200
+vn -0.547900 0.059500 -0.834400
+vn -0.533500 0.086800 -0.841300
+vn -0.483400 0.090800 -0.870600
+vn -0.446400 0.069300 -0.892100
+vn -0.468700 0.119100 -0.875200
+vn -0.432800 0.098300 -0.896100
+vn -0.518600 0.114000 -0.847400
+vn -0.502800 0.141700 -0.852700
+vn -0.407500 0.049600 -0.911800
+vn -0.395100 0.079200 -0.915200
+vn -0.598600 0.139300 -0.788800
+vn -0.567300 0.112300 -0.815800
+vn -0.582600 0.085800 -0.808200
+vn -0.614700 0.113400 -0.780500
+vn -0.644200 0.142500 -0.751400
+vn -0.627300 0.167600 -0.760500
+vn -0.671000 0.173000 -0.720900
+vn -0.653400 0.197300 -0.730800
+vn -0.609700 0.192500 -0.768900
+vn -0.581800 0.165000 -0.796400
+vn -0.591100 0.217800 -0.776600
+vn -0.564100 0.191100 -0.803200
+vn -0.635100 0.221400 -0.740000
+vn -0.615800 0.245800 -0.748600
+vn -0.551400 0.138800 -0.822600
+vn -0.534700 0.165700 -0.828600
+vn -0.697100 0.259900 -0.668200
+vn -0.676700 0.228100 -0.699900
+vn -0.695000 0.204700 -0.689200
+vn -0.715900 0.237300 -0.656600
+vn -0.733700 0.270800 -0.623200
+vn -0.714400 0.292500 -0.635600
+vn -0.748500 0.305200 -0.588800
+vn -0.728800 0.326000 -0.602100
+vn -0.694400 0.313900 -0.647500
+vn -0.677500 0.282200 -0.679100
+vn -0.673300 0.335500 -0.658900
+vn -0.656900 0.304800 -0.689600
+vn -0.708400 0.346500 -0.614900
+vn -0.686800 0.367000 -0.627300
+vn -0.657800 0.251400 -0.710000
+vn -0.637700 0.274800 -0.719500
+vn -0.748000 0.394400 -0.533700
+vn -0.740000 0.360000 -0.568000
+vn -0.760000 0.340100 -0.553800
+vn -0.768200 0.375400 -0.518500
+vn -0.773200 0.411100 -0.482900
+vn -0.752900 0.429100 -0.499000
+vn -0.774900 0.447000 -0.447000
+vn -0.754500 0.464000 -0.464000
+vn -0.731800 0.446700 -0.514700
+vn -0.727100 0.413000 -0.548400
+vn -0.709500 0.464200 -0.530100
+vn -0.704900 0.431600 -0.562800
+vn -0.733400 0.480700 -0.480700
+vn -0.719300 0.379600 -0.581800
+vn -0.697400 0.399200 -0.595200
+vn -0.748000 0.533700 -0.394400
+vn -0.752900 0.499000 -0.429100
+vn -0.773200 0.482900 -0.411100
+vn -0.768200 0.518500 -0.375400
+vn -0.760000 0.553800 -0.340100
+vn -0.740000 0.568000 -0.360000
+vn -0.719300 0.581800 -0.379600
+vn -0.727100 0.548400 -0.413000
+vn -0.697400 0.595200 -0.399200
+vn -0.704900 0.562800 -0.431600
+vn -0.731800 0.514700 -0.446700
+vn -0.709500 0.530100 -0.464200
+vn -0.606700 0.711000 -0.355500
+vn -0.621800 0.682600 -0.383900
+vn -0.650300 0.670100 -0.357800
+vn -0.634500 0.699800 -0.328100
+vn -0.634300 0.653400 -0.413100
+vn -0.663400 0.639600 -0.388300
+vn -0.616000 0.728700 -0.299200
+vn -0.589000 0.738600 -0.327900
+vn -0.594700 0.756800 -0.271200
+vn -0.568700 0.765400 -0.301100
+vn -0.546300 0.751200 -0.370400
+vn -0.562700 0.725600 -0.396000
+vn -0.448200 0.768700 -0.456300
+vn -0.461600 0.747700 -0.477300
+vn -0.527400 0.776100 -0.345500
+vn -0.432700 0.789100 -0.435800
+vn -0.576700 0.699300 -0.422300
+vn -0.588300 0.672300 -0.449400
+vn -0.473100 0.726100 -0.498900
+vn -0.482600 0.703900 -0.521000
+vn -0.521000 0.815900 -0.250600
+vn -0.545900 0.791300 -0.275200
+vn -0.571000 0.783800 -0.244100
+vn -0.544800 0.809600 -0.218300
+vn -0.516400 0.834100 -0.193800
+vn -0.493800 0.839400 -0.227100
+vn -0.485600 0.857400 -0.170600
+vn -0.464300 0.861600 -0.204900
+vn -0.457900 0.844700 -0.276900
+vn -0.483200 0.823000 -0.298700
+vn -0.375700 0.845400 -0.379600
+vn -0.396400 0.827600 -0.397400
+vn -0.430600 0.865400 -0.256300
+vn -0.353300 0.862300 -0.362700
+vn -0.506300 0.800100 -0.321500
+vn -0.415400 0.808800 -0.416200
+vn -0.399800 0.901600 -0.164900
+vn -0.432900 0.882400 -0.184100
+vn -0.452700 0.879100 -0.148800
+vn -0.418100 0.899200 -0.128700
+vn -0.381600 0.917700 -0.110200
+vn -0.364900 0.919300 -0.147200
+vn -0.343400 0.934500 -0.093400
+vn -0.328300 0.935400 -0.131100
+vn -0.338400 0.918900 -0.202800
+vn -0.370700 0.902500 -0.219200
+vn -0.277600 0.906200 -0.318800
+vn -0.304100 0.892800 -0.332200
+vn -0.304500 0.933800 -0.187900
+vn -0.249800 0.918500 -0.306500
+vn -0.401500 0.884600 -0.237000
+vn -0.329400 0.878200 -0.346800
+vn -0.251300 0.962200 -0.104300
+vn -0.290400 0.949700 -0.116800
+vn -0.303700 0.949500 -0.078400
+vn -0.262800 0.962600 -0.065300
+vn -0.220800 0.973800 -0.054100
+vn -0.211200 0.972900 -0.093600
+vn -0.177700 0.983000 -0.044900
+vn -0.170000 0.981800 -0.084700
+vn -0.195800 0.968600 -0.153100
+vn -0.233100 0.958700 -0.162900
+vn -0.160600 0.947100 -0.278000
+vn -0.191200 0.938900 -0.286100
+vn -0.157600 0.976800 -0.144800
+vn -0.129300 0.953800 -0.271200
+vn -0.269300 0.947100 -0.174500
+vn -0.220900 0.929400 -0.295600
+vn -0.085700 0.993600 -0.072900
+vn -0.128000 0.988700 -0.077800
+vn -0.133900 0.990300 -0.037700
+vn -0.089600 0.995400 -0.032500
+vn -0.045000 0.998500 -0.029400
+vn -0.043000 0.996600 -0.069900
+vn 0.000000 0.999600 -0.028400
+vn 0.000000 0.997600 -0.068900
+vn -0.039900 0.990500 -0.131100
+vn -0.079500 0.987800 -0.133900
+vn -0.032700 0.965100 -0.260000
+vn -0.065200 0.962800 -0.262200
+vn 0.000000 0.991500 -0.130200
+vn 0.000000 0.965800 -0.259200
+vn -0.118700 0.983200 -0.138400
+vn -0.097400 0.959000 -0.266000
+vn 0.085700 0.993600 -0.072900
+vn 0.043000 0.996600 -0.069900
+vn 0.045000 0.998500 -0.029400
+vn 0.089600 0.995400 -0.032500
+vn 0.133900 0.990300 -0.037700
+vn 0.128000 0.988700 -0.077800
+vn 0.177700 0.983000 -0.044900
+vn 0.170000 0.981800 -0.084700
+vn 0.118700 0.983200 -0.138400
+vn 0.079500 0.987800 -0.133900
+vn 0.097400 0.959000 -0.266000
+vn 0.065200 0.962800 -0.262200
+vn 0.157600 0.976800 -0.144800
+vn 0.129300 0.953800 -0.271200
+vn 0.039900 0.990500 -0.131100
+vn 0.032700 0.965100 -0.260000
+vn 0.251300 0.962200 -0.104300
+vn 0.211200 0.972900 -0.093600
+vn 0.220800 0.973800 -0.054100
+vn 0.262800 0.962600 -0.065300
+vn 0.303700 0.949500 -0.078400
+vn 0.290400 0.949700 -0.116800
+vn 0.343400 0.934500 -0.093400
+vn 0.328300 0.935400 -0.131100
+vn 0.269300 0.947100 -0.174500
+vn 0.233100 0.958700 -0.162900
+vn 0.220900 0.929400 -0.295600
+vn 0.191200 0.938900 -0.286100
+vn 0.304500 0.933800 -0.187900
+vn 0.249800 0.918500 -0.306500
+vn 0.195800 0.968600 -0.153100
+vn 0.160600 0.947100 -0.278000
+vn 0.399800 0.901600 -0.164900
+vn 0.364900 0.919300 -0.147200
+vn 0.381600 0.917700 -0.110200
+vn 0.418100 0.899200 -0.128700
+vn 0.452700 0.879100 -0.148800
+vn 0.432900 0.882400 -0.184100
+vn 0.485600 0.857400 -0.170600
+vn 0.464300 0.861600 -0.204900
+vn 0.401500 0.884600 -0.237000
+vn 0.370700 0.902500 -0.219200
+vn 0.329400 0.878200 -0.346800
+vn 0.304100 0.892800 -0.332200
+vn 0.430600 0.865400 -0.256300
+vn 0.353300 0.862300 -0.362700
+vn 0.338400 0.918900 -0.202800
+vn 0.277600 0.906200 -0.318800
+vn 0.521000 0.815900 -0.250600
+vn 0.493800 0.839400 -0.227100
+vn 0.516400 0.834100 -0.193800
+vn 0.544800 0.809600 -0.218300
+vn 0.571000 0.783800 -0.244100
+vn 0.545900 0.791300 -0.275200
+vn 0.594700 0.756800 -0.271200
+vn 0.568700 0.765400 -0.301100
+vn 0.506300 0.800100 -0.321500
+vn 0.483200 0.823000 -0.298700
+vn 0.415400 0.808800 -0.416200
+vn 0.396400 0.827600 -0.397400
+vn 0.527400 0.776100 -0.345500
+vn 0.432700 0.789100 -0.435800
+vn 0.457900 0.844700 -0.276900
+vn 0.375700 0.845400 -0.379600
+vn 0.606700 0.711000 -0.355500
+vn 0.589000 0.738600 -0.327900
+vn 0.616000 0.728700 -0.299200
+vn 0.634500 0.699800 -0.328100
+vn 0.650300 0.670100 -0.357800
+vn 0.621800 0.682600 -0.383900
+vn 0.663400 0.639600 -0.388300
+vn 0.634300 0.653400 -0.413100
+vn 0.576700 0.699300 -0.422300
+vn 0.562700 0.725600 -0.396000
+vn 0.473100 0.726100 -0.498900
+vn 0.461600 0.747700 -0.477300
+vn 0.588300 0.672300 -0.449400
+vn 0.482600 0.703900 -0.521000
+vn 0.546300 0.751200 -0.370400
+vn 0.448200 0.768700 -0.456300
+vn 0.651100 0.593900 -0.472600
+vn 0.644100 0.623800 -0.442700
+vn 0.673600 0.608600 -0.419300
+vn 0.680900 0.577300 -0.450600
+vn 0.685300 0.545800 -0.482100
+vn 0.655300 0.563700 -0.502800
+vn 0.686800 0.514000 -0.514000
+vn 0.656700 0.533200 -0.533200
+vn 0.607700 0.589000 -0.532600
+vn 0.603800 0.617000 -0.504600
+vn 0.498600 0.635600 -0.589300
+vn 0.495400 0.658600 -0.566400
+vn 0.609000 0.560800 -0.560800
+vn 0.499600 0.612500 -0.612500
+vn 0.597300 0.644800 -0.476900
+vn 0.490100 0.681400 -0.543600
+vn 0.651100 0.472600 -0.593900
+vn 0.655300 0.502800 -0.563700
+vn 0.685300 0.482100 -0.545800
+vn 0.680900 0.450600 -0.577300
+vn 0.673600 0.419300 -0.608600
+vn 0.644100 0.442700 -0.623800
+vn 0.663400 0.388300 -0.639600
+vn 0.634300 0.413100 -0.653400
+vn 0.597300 0.476900 -0.644800
+vn 0.603800 0.504600 -0.617000
+vn 0.490100 0.543600 -0.681400
+vn 0.495400 0.566400 -0.658600
+vn 0.588300 0.449400 -0.672300
+vn 0.482600 0.521000 -0.703900
+vn 0.607700 0.532600 -0.589000
+vn 0.498600 0.589300 -0.635600
+vn 0.606700 0.355500 -0.711000
+vn 0.621800 0.383900 -0.682600
+vn 0.650300 0.357800 -0.670100
+vn 0.634500 0.328100 -0.699800
+vn 0.616000 0.299200 -0.728700
+vn 0.589000 0.327900 -0.738600
+vn 0.594700 0.271200 -0.756800
+vn 0.568700 0.301100 -0.765400
+vn 0.546300 0.370400 -0.751200
+vn 0.562700 0.396000 -0.725600
+vn 0.448200 0.456300 -0.768700
+vn 0.461600 0.477300 -0.747700
+vn 0.527400 0.345500 -0.776100
+vn 0.432700 0.435800 -0.789100
+vn 0.576700 0.422300 -0.699300
+vn 0.473100 0.498900 -0.726100
+vn 0.521000 0.250600 -0.815900
+vn 0.545900 0.275200 -0.791300
+vn 0.571000 0.244100 -0.783800
+vn 0.544800 0.218300 -0.809600
+vn 0.516400 0.193800 -0.834100
+vn 0.493800 0.227100 -0.839400
+vn 0.485600 0.170600 -0.857400
+vn 0.464300 0.204900 -0.861600
+vn 0.457900 0.276900 -0.844700
+vn 0.483200 0.298700 -0.823000
+vn 0.375700 0.379600 -0.845400
+vn 0.396400 0.397400 -0.827600
+vn 0.430600 0.256300 -0.865400
+vn 0.353300 0.362700 -0.862300
+vn 0.506300 0.321500 -0.800100
+vn 0.415400 0.416200 -0.808800
+vn 0.399800 0.164900 -0.901600
+vn 0.432900 0.184100 -0.882400
+vn 0.452700 0.148800 -0.879100
+vn 0.418100 0.128700 -0.899200
+vn 0.381600 0.110200 -0.917700
+vn 0.364900 0.147200 -0.919300
+vn 0.343400 0.093400 -0.934500
+vn 0.328300 0.131100 -0.935400
+vn 0.338400 0.202800 -0.918900
+vn 0.370700 0.219200 -0.902500
+vn 0.277600 0.318800 -0.906200
+vn 0.304100 0.332200 -0.892800
+vn 0.304500 0.187900 -0.933800
+vn 0.249800 0.306500 -0.918500
+vn 0.401500 0.237000 -0.884600
+vn 0.329400 0.346800 -0.878200
+vn 0.251300 0.104300 -0.962200
+vn 0.290400 0.116800 -0.949700
+vn 0.303700 0.078400 -0.949500
+vn 0.262800 0.065300 -0.962600
+vn 0.220800 0.054100 -0.973800
+vn 0.211200 0.093600 -0.972900
+vn 0.177700 0.044900 -0.983000
+vn 0.170000 0.084700 -0.981800
+vn 0.195800 0.153000 -0.968600
+vn 0.233100 0.162900 -0.958700
+vn 0.160600 0.277900 -0.947100
+vn 0.191200 0.286100 -0.938900
+vn 0.157600 0.144800 -0.976800
+vn 0.129300 0.271200 -0.953800
+vn 0.269300 0.174500 -0.947100
+vn 0.220900 0.295600 -0.929400
+vn 0.085700 0.072900 -0.993600
+vn 0.128000 0.077800 -0.988700
+vn 0.133900 0.037700 -0.990300
+vn 0.089600 0.032500 -0.995400
+vn 0.045000 0.029400 -0.998500
+vn 0.043000 0.069900 -0.996600
+vn 0.000000 0.028300 -0.999600
+vn 0.000000 0.068900 -0.997600
+vn 0.039900 0.131100 -0.990500
+vn 0.079500 0.133800 -0.987800
+vn 0.032700 0.259900 -0.965100
+vn 0.065200 0.262200 -0.962800
+vn 0.000000 0.130200 -0.991500
+vn 0.000000 0.259200 -0.965800
+vn 0.118700 0.138400 -0.983200
+vn 0.097400 0.266000 -0.959000
+vn -0.085700 0.072900 -0.993600
+vn -0.043000 0.069900 -0.996600
+vn -0.045000 0.029400 -0.998500
+vn -0.089600 0.032500 -0.995400
+vn -0.133900 0.037700 -0.990300
+vn -0.128000 0.077800 -0.988700
+vn -0.177700 0.044900 -0.983000
+vn -0.170000 0.084700 -0.981800
+vn -0.118700 0.138400 -0.983200
+vn -0.079500 0.133900 -0.987800
+vn -0.097400 0.266000 -0.959000
+vn -0.065200 0.262200 -0.962800
+vn -0.157600 0.144800 -0.976800
+vn -0.129300 0.271200 -0.953800
+vn -0.039900 0.131100 -0.990500
+vn -0.032700 0.259900 -0.965100
+vn -0.251300 0.104300 -0.962200
+vn -0.211200 0.093600 -0.972900
+vn -0.220800 0.054100 -0.973800
+vn -0.262800 0.065300 -0.962600
+vn -0.303700 0.078400 -0.949500
+vn -0.290400 0.116800 -0.949700
+vn -0.343400 0.093400 -0.934500
+vn -0.328300 0.131100 -0.935400
+vn -0.269300 0.174500 -0.947100
+vn -0.233100 0.162900 -0.958700
+vn -0.220900 0.295600 -0.929400
+vn -0.191200 0.286100 -0.938900
+vn -0.304500 0.187800 -0.933800
+vn -0.249800 0.306500 -0.918500
+vn -0.195800 0.153000 -0.968600
+vn -0.160600 0.278000 -0.947100
+vn -0.399800 0.164900 -0.901600
+vn -0.364900 0.147200 -0.919300
+vn -0.381600 0.110200 -0.917700
+vn -0.418100 0.128700 -0.899200
+vn -0.452700 0.148800 -0.879100
+vn -0.432900 0.184100 -0.882400
+vn -0.485600 0.170600 -0.857400
+vn -0.464300 0.204900 -0.861600
+vn -0.401500 0.237000 -0.884600
+vn -0.370700 0.219200 -0.902500
+vn -0.329400 0.346800 -0.878200
+vn -0.304100 0.332200 -0.892800
+vn -0.430600 0.256300 -0.865400
+vn -0.353300 0.362700 -0.862300
+vn -0.338400 0.202800 -0.918900
+vn -0.277600 0.318800 -0.906200
+vn -0.521000 0.250600 -0.815900
+vn -0.493800 0.227100 -0.839400
+vn -0.516400 0.193800 -0.834100
+vn -0.544800 0.218300 -0.809600
+vn -0.571000 0.244100 -0.783800
+vn -0.545900 0.275200 -0.791300
+vn -0.594700 0.271200 -0.756800
+vn -0.568700 0.301100 -0.765400
+vn -0.506300 0.321500 -0.800100
+vn -0.483200 0.298700 -0.823000
+vn -0.415400 0.416200 -0.808800
+vn -0.396400 0.397400 -0.827600
+vn -0.527400 0.345500 -0.776100
+vn -0.432700 0.435800 -0.789100
+vn -0.457900 0.276900 -0.844700
+vn -0.375700 0.379600 -0.845400
+vn -0.606700 0.355500 -0.711000
+vn -0.589000 0.327900 -0.738600
+vn -0.616000 0.299200 -0.728700
+vn -0.634500 0.328100 -0.699800
+vn -0.650300 0.357800 -0.670100
+vn -0.621800 0.383900 -0.682600
+vn -0.663400 0.388300 -0.639600
+vn -0.634300 0.413100 -0.653400
+vn -0.576700 0.422300 -0.699300
+vn -0.562700 0.396000 -0.725600
+vn -0.473100 0.498900 -0.726100
+vn -0.461600 0.477300 -0.747700
+vn -0.588300 0.449400 -0.672300
+vn -0.482600 0.521000 -0.703900
+vn -0.546300 0.370400 -0.751200
+vn -0.448200 0.456300 -0.768700
+vn -0.651100 0.472600 -0.593900
+vn -0.644100 0.442700 -0.623800
+vn -0.673600 0.419300 -0.608600
+vn -0.680900 0.450600 -0.577300
+vn -0.685300 0.482100 -0.545800
+vn -0.655300 0.502800 -0.563700
+vn -0.686800 0.514000 -0.514000
+vn -0.656700 0.533200 -0.533200
+vn -0.607700 0.532600 -0.589000
+vn -0.603800 0.504600 -0.617000
+vn -0.498600 0.589300 -0.635600
+vn -0.495400 0.566400 -0.658600
+vn -0.609000 0.560800 -0.560800
+vn -0.499600 0.612500 -0.612500
+vn -0.597300 0.476900 -0.644800
+vn -0.490100 0.543600 -0.681400
+vn -0.651100 0.593900 -0.472600
+vn -0.655300 0.563700 -0.502800
+vn -0.685300 0.545800 -0.482100
+vn -0.680900 0.577300 -0.450600
+vn -0.673600 0.608600 -0.419300
+vn -0.644100 0.623800 -0.442700
+vn -0.597300 0.644800 -0.476900
+vn -0.603800 0.617000 -0.504600
+vn -0.490100 0.681400 -0.543600
+vn -0.495400 0.658600 -0.566400
+vn -0.607700 0.589000 -0.532600
+vn -0.498600 0.635600 -0.589300
+vn 0.059400 -0.690000 0.721300
+vn 0.060200 -0.688400 0.722800
+vn 0.057200 -0.684500 0.726700
+vn 0.053400 -0.684700 0.726900
+vn 0.054300 -0.681400 0.729800
+vn 0.048700 -0.680300 0.731300
+vn 0.057100 -0.699400 0.712500
+vn 0.027400 -0.696400 0.717100
+vn 0.027600 -0.706800 0.706800
+vn 0.058900 -0.705900 0.705800
+vn 0.057500 -0.692900 0.718700
+vn 0.063300 -0.702100 0.709200
+vn 0.063000 -0.697300 0.714000
+vn 0.065000 -0.702500 0.708700
+vn 0.064500 -0.698800 0.712300
+vn 0.063700 -0.705700 0.705600
+vn 0.065200 -0.705600 0.705600
+vn 0.062500 -0.693700 0.717500
+vn 0.062300 -0.691500 0.719700
+vn 0.063900 -0.695700 0.715400
+vn 0.063400 -0.693500 0.717600
+vn 0.348600 0.552700 -0.756900
+vn 0.357300 0.569000 -0.740600
+vn -0.148200 0.734000 -0.662800
+vn -0.144600 0.740700 -0.656000
+vn 0.364500 0.585800 -0.723900
+vn -0.151200 0.727000 -0.669700
+vn -0.140400 0.747300 -0.649400
+vn 0.338500 0.536800 -0.772800
+vn -0.135500 0.753700 -0.643000
+vn 0.326800 0.521400 -0.788200
+vn 0.603400 0.312800 -0.733500
+vn 0.621500 0.341100 -0.705200
+vn 0.653200 0.256800 -0.712200
+vn 0.672900 0.287400 -0.681600
+vn 0.582600 0.285300 -0.761000
+vn 0.630700 0.227000 -0.742000
+vn 0.637000 0.370200 -0.676100
+vn 0.649800 0.400100 -0.646300
+vn 0.689600 0.318900 -0.650100
+vn 0.703500 0.351200 -0.617800
+vn 0.299400 0.492400 -0.817300
+vn 0.313700 0.506500 -0.803100
+vn -0.130100 0.759900 -0.636900
+vn -0.124100 0.765700 -0.631000
+vn -0.117600 0.771300 -0.625400
+vn 0.283800 0.478900 -0.830700
+vn -0.110700 0.776600 -0.620100
+vn 0.266800 0.466100 -0.843500
+vn 0.505800 0.209600 -0.836800
+vn 0.533700 0.233600 -0.812700
+vn 0.547600 0.145000 -0.824000
+vn 0.577800 0.171000 -0.798000
+vn 0.475700 0.186800 -0.859500
+vn 0.515000 0.120400 -0.848700
+vn 0.559300 0.258800 -0.787500
+vn 0.605500 0.198300 -0.770700
+vn 0.229700 0.443100 -0.866500
+vn 0.248800 0.454100 -0.855500
+vn -0.103200 0.781600 -0.615200
+vn -0.095200 0.786200 -0.610600
+vn -0.086900 0.790400 -0.606400
+vn 0.209700 0.433000 -0.876700
+vn -0.078200 0.794200 -0.602500
+vn 0.188700 0.423700 -0.885900
+vn 0.373800 0.127700 -0.918600
+vn 0.409500 0.145800 -0.900600
+vn 0.404700 0.056300 -0.912700
+vn 0.443400 0.075900 -0.893100
+vn 0.336300 0.111200 -0.935100
+vn 0.364100 0.038500 -0.930500
+vn 0.443500 0.165500 -0.880900
+vn 0.480100 0.097300 -0.871800
+vn 0.144400 0.408200 -0.901300
+vn 0.166800 0.415400 -0.894200
+vn -0.069200 0.797600 -0.599100
+vn -0.059900 0.800600 -0.596100
+vn -0.050300 0.803200 -0.593600
+vn 0.121300 0.402100 -0.907500
+vn -0.040500 0.805300 -0.591400
+vn 0.097700 0.397100 -0.912500
+vn 0.216300 0.072800 -0.973600
+vn 0.257400 0.083700 -0.962600
+vn 0.234200 -0.003100 -0.972200
+vn 0.278700 0.008700 -0.960300
+vn 0.174100 0.063700 -0.982600
+vn 0.188500 -0.012900 -0.982000
+vn 0.297400 0.096500 -0.949800
+vn 0.322000 0.022600 -0.946400
+vn 0.049300 0.390200 -0.919400
+vn 0.073500 0.393100 -0.916500
+vn -0.030500 0.806900 -0.589800
+vn -0.020400 0.808100 -0.588700
+vn -0.010300 0.808800 -0.588000
+vn 0.024700 0.388500 -0.921100
+vn 0.000000 0.809000 -0.587700
+vn 0.000000 0.388000 -0.921600
+vn 0.044100 0.048500 -0.997800
+vn 0.087800 0.051500 -0.994800
+vn 0.047700 -0.029400 -0.998400
+vn 0.095100 -0.026100 -0.995100
+vn 0.000000 0.047500 -0.998900
+vn 0.000000 -0.030500 -0.999500
+vn 0.131100 0.056600 -0.989700
+vn 0.142000 -0.020600 -0.989600
+vn -0.049300 0.390200 -0.919400
+vn -0.024700 0.388500 -0.921100
+vn 0.010300 0.808800 -0.588000
+vn 0.020400 0.808100 -0.588700
+vn 0.030500 0.806900 -0.589800
+vn -0.073500 0.393100 -0.916500
+vn 0.040500 0.805300 -0.591500
+vn -0.097700 0.397100 -0.912600
+vn -0.131100 0.056600 -0.989700
+vn -0.087800 0.051500 -0.994800
+vn -0.142000 -0.020600 -0.989700
+vn -0.095100 -0.026100 -0.995100
+vn -0.174100 0.063700 -0.982600
+vn -0.188500 -0.012900 -0.982000
+vn -0.044100 0.048500 -0.997800
+vn -0.047700 -0.029400 -0.998400
+vn -0.144400 0.408200 -0.901300
+vn -0.121300 0.402100 -0.907500
+vn 0.050300 0.803200 -0.593600
+vn 0.059900 0.800600 -0.596100
+vn 0.069200 0.797600 -0.599100
+vn -0.166800 0.415400 -0.894200
+vn 0.078200 0.794200 -0.602500
+vn -0.188700 0.423700 -0.885900
+vn -0.297400 0.096500 -0.949800
+vn -0.257400 0.083700 -0.962600
+vn -0.322000 0.022600 -0.946400
+vn -0.278700 0.008700 -0.960300
+vn -0.336300 0.111200 -0.935100
+vn -0.364100 0.038500 -0.930500
+vn -0.216300 0.072800 -0.973600
+vn -0.234200 -0.003100 -0.972200
+vn -0.229700 0.443100 -0.866500
+vn -0.209700 0.432900 -0.876700
+vn 0.086900 0.790400 -0.606400
+vn 0.095200 0.786200 -0.610600
+vn 0.103200 0.781600 -0.615200
+vn -0.248800 0.454100 -0.855500
+vn 0.110700 0.776600 -0.620100
+vn -0.266800 0.466100 -0.843500
+vn -0.443500 0.165500 -0.880900
+vn -0.409500 0.145800 -0.900600
+vn -0.480100 0.097300 -0.871800
+vn -0.443400 0.075900 -0.893100
+vn -0.475700 0.186800 -0.859500
+vn -0.515000 0.120400 -0.848700
+vn -0.373800 0.127700 -0.918600
+vn -0.404700 0.056300 -0.912700
+vn -0.299400 0.492400 -0.817300
+vn -0.283800 0.478900 -0.830700
+vn 0.117600 0.771300 -0.625400
+vn 0.124100 0.765700 -0.631000
+vn 0.130100 0.759900 -0.636900
+vn -0.313700 0.506500 -0.803100
+vn 0.135500 0.753700 -0.643000
+vn -0.326800 0.521400 -0.788200
+vn -0.559300 0.258800 -0.787500
+vn -0.533700 0.233600 -0.812700
+vn -0.605500 0.198300 -0.770700
+vn -0.577800 0.171000 -0.798000
+vn -0.582600 0.285300 -0.761000
+vn -0.630700 0.227000 -0.742000
+vn -0.505800 0.209600 -0.836800
+vn -0.547600 0.145000 -0.824000
+vn -0.348600 0.552700 -0.756900
+vn -0.338500 0.536800 -0.772800
+vn 0.140400 0.747300 -0.649500
+vn 0.144600 0.740700 -0.656000
+vn 0.148200 0.734000 -0.662800
+vn -0.357300 0.569000 -0.740600
+vn 0.151200 0.727000 -0.669700
+vn -0.364500 0.585700 -0.723900
+vn -0.637000 0.370200 -0.676100
+vn -0.621500 0.341100 -0.705200
+vn -0.689600 0.318900 -0.650100
+vn -0.672900 0.287400 -0.681600
+vn -0.649800 0.400100 -0.646300
+vn -0.703500 0.351200 -0.617800
+vn -0.603400 0.312800 -0.733500
+vn -0.653200 0.256800 -0.712200
+vn -0.374200 0.620000 -0.689600
+vn -0.370100 0.602800 -0.706800
+vn 0.153500 0.720000 -0.676800
+vn 0.155100 0.712800 -0.684000
+vn 0.156200 0.705600 -0.691100
+vn -0.376500 0.637300 -0.672300
+vn 0.156500 0.698400 -0.698400
+vn -0.377300 0.654800 -0.654800
+vn -0.671300 0.492000 -0.554300
+vn -0.667000 0.461100 -0.585300
+vn -0.726700 0.450800 -0.518300
+vn -0.722100 0.417300 -0.551700
+vn -0.672700 0.523200 -0.523200
+vn -0.728300 0.484500 -0.484500
+vn -0.659800 0.430400 -0.615900
+vn -0.714300 0.384100 -0.584900
+vn -0.374200 0.689600 -0.620000
+vn -0.376600 0.672300 -0.637300
+vn 0.156100 0.691100 -0.705600
+vn 0.155100 0.684000 -0.712800
+vn 0.153500 0.676800 -0.720000
+vn -0.370100 0.706800 -0.602800
+vn 0.151200 0.669700 -0.727000
+vn -0.364500 0.723900 -0.585800
+vn -0.659800 0.615900 -0.430400
+vn -0.667000 0.585300 -0.461100
+vn -0.714300 0.584900 -0.384100
+vn -0.722100 0.551700 -0.417300
+vn -0.649800 0.646300 -0.400100
+vn -0.703500 0.617800 -0.351200
+vn -0.671300 0.554300 -0.492000
+vn -0.726700 0.518300 -0.450800
+vn -0.348600 0.756900 -0.552700
+vn -0.357300 0.740600 -0.569000
+vn 0.148200 0.662800 -0.734000
+vn 0.144600 0.656000 -0.740700
+vn 0.140400 0.649500 -0.747300
+vn -0.338500 0.772800 -0.536800
+vn 0.135500 0.643000 -0.753700
+vn -0.326800 0.788200 -0.521400
+vn -0.603400 0.733500 -0.312800
+vn -0.621500 0.705200 -0.341100
+vn -0.653200 0.712200 -0.256800
+vn -0.672900 0.681600 -0.287400
+vn -0.582600 0.761000 -0.285300
+vn -0.630700 0.742000 -0.227000
+vn -0.637000 0.676100 -0.370200
+vn -0.689600 0.650100 -0.318900
+vn -0.299400 0.817300 -0.492400
+vn -0.313700 0.803100 -0.506500
+vn 0.130100 0.636900 -0.759900
+vn 0.124100 0.631000 -0.765700
+vn 0.117600 0.625400 -0.771300
+vn -0.283800 0.830700 -0.478900
+vn 0.110700 0.620100 -0.776600
+vn -0.266800 0.843500 -0.466100
+vn -0.505800 0.836800 -0.209600
+vn -0.533700 0.812700 -0.233600
+vn -0.547600 0.824000 -0.145000
+vn -0.577800 0.798000 -0.171000
+vn -0.475700 0.859500 -0.186800
+vn -0.515000 0.848700 -0.120400
+vn -0.559300 0.787500 -0.258800
+vn -0.605500 0.770700 -0.198300
+vn -0.229700 0.866500 -0.443100
+vn -0.248800 0.855500 -0.454100
+vn 0.103200 0.615200 -0.781600
+vn 0.095200 0.610600 -0.786200
+vn 0.086900 0.606400 -0.790400
+vn -0.209700 0.876700 -0.433000
+vn 0.078200 0.602500 -0.794200
+vn -0.188700 0.885900 -0.423700
+vn -0.373800 0.918600 -0.127700
+vn -0.409500 0.900600 -0.145800
+vn -0.404700 0.912700 -0.056300
+vn -0.443400 0.893100 -0.075900
+vn -0.336300 0.935100 -0.111200
+vn -0.364100 0.930500 -0.038500
+vn -0.443500 0.880900 -0.165500
+vn -0.480100 0.871800 -0.097300
+vn -0.144400 0.901400 -0.408200
+vn -0.166800 0.894200 -0.415400
+vn 0.069200 0.599100 -0.797600
+vn 0.059900 0.596100 -0.800600
+vn 0.050300 0.593600 -0.803200
+vn -0.121300 0.907500 -0.402100
+vn 0.040500 0.591400 -0.805300
+vn -0.097700 0.912600 -0.397100
+vn -0.216300 0.973600 -0.072700
+vn -0.257400 0.962600 -0.083700
+vn -0.234200 0.972200 0.003100
+vn -0.278700 0.960300 -0.008700
+vn -0.174100 0.982600 -0.063700
+vn -0.188500 0.982000 0.012900
+vn -0.297400 0.949800 -0.096500
+vn -0.322000 0.946400 -0.022600
+vn -0.049300 0.919400 -0.390200
+vn -0.073500 0.916500 -0.393100
+vn 0.030500 0.589800 -0.806900
+vn 0.020400 0.588700 -0.808100
+vn 0.010300 0.588000 -0.808800
+vn -0.024700 0.921100 -0.388500
+vn 0.000000 0.587700 -0.809000
+vn 0.000000 0.921600 -0.388000
+vn -0.044100 0.997800 -0.048500
+vn -0.087800 0.994800 -0.051500
+vn -0.047700 0.998400 0.029400
+vn -0.095100 0.995100 0.026100
+vn 0.000000 0.998900 -0.047500
+vn 0.000000 0.999500 0.030500
+vn -0.131100 0.989700 -0.056600
+vn -0.142000 0.989600 0.020600
+vn 0.049300 0.919400 -0.390200
+vn 0.024700 0.921100 -0.388500
+vn -0.010300 0.588000 -0.808800
+vn -0.020400 0.588700 -0.808100
+vn -0.030500 0.589800 -0.806900
+vn 0.073500 0.916500 -0.393100
+vn -0.040500 0.591500 -0.805300
+vn 0.097700 0.912600 -0.397100
+vn 0.131100 0.989700 -0.056600
+vn 0.087800 0.994800 -0.051500
+vn 0.142000 0.989600 0.020600
+vn 0.095100 0.995100 0.026100
+vn 0.174100 0.982600 -0.063700
+vn 0.188500 0.982000 0.012900
+vn 0.044100 0.997800 -0.048500
+vn 0.047700 0.998400 0.029400
+vn 0.144400 0.901300 -0.408200
+vn 0.121300 0.907500 -0.402100
+vn -0.050300 0.593600 -0.803200
+vn -0.059900 0.596100 -0.800600
+vn -0.069200 0.599100 -0.797600
+vn 0.166800 0.894200 -0.415400
+vn -0.078200 0.602500 -0.794200
+vn 0.188700 0.885900 -0.423700
+vn 0.297400 0.949800 -0.096500
+vn 0.257400 0.962600 -0.083700
+vn 0.322000 0.946400 -0.022600
+vn 0.278700 0.960300 -0.008700
+vn 0.336300 0.935100 -0.111200
+vn 0.364100 0.930500 -0.038500
+vn 0.216300 0.973600 -0.072800
+vn 0.234200 0.972200 0.003100
+vn 0.229700 0.866500 -0.443100
+vn 0.209700 0.876700 -0.433000
+vn -0.086900 0.606400 -0.790400
+vn -0.095200 0.610600 -0.786200
+vn -0.103200 0.615200 -0.781600
+vn 0.248800 0.855500 -0.454100
+vn -0.110700 0.620100 -0.776600
+vn 0.266800 0.843500 -0.466100
+vn 0.443500 0.880900 -0.165500
+vn 0.409500 0.900600 -0.145800
+vn 0.480100 0.871800 -0.097300
+vn 0.443400 0.893100 -0.075900
+vn 0.475700 0.859500 -0.186800
+vn 0.515000 0.848700 -0.120400
+vn 0.373800 0.918600 -0.127700
+vn 0.404700 0.912700 -0.056400
+vn 0.299400 0.817300 -0.492400
+vn 0.283800 0.830700 -0.478900
+vn -0.117600 0.625400 -0.771300
+vn -0.124100 0.631000 -0.765700
+vn -0.130100 0.636900 -0.759900
+vn 0.313700 0.803100 -0.506500
+vn -0.135600 0.643000 -0.753700
+vn 0.326800 0.788200 -0.521400
+vn 0.559300 0.787500 -0.258800
+vn 0.533700 0.812700 -0.233600
+vn 0.605500 0.770700 -0.198300
+vn 0.577800 0.798000 -0.171000
+vn 0.582600 0.761000 -0.285300
+vn 0.630700 0.742000 -0.227000
+vn 0.505800 0.836800 -0.209600
+vn 0.547600 0.824000 -0.145000
+vn 0.348600 0.756900 -0.552700
+vn 0.338500 0.772800 -0.536800
+vn -0.140400 0.649500 -0.747300
+vn -0.144600 0.656000 -0.740700
+vn -0.148200 0.662800 -0.734000
+vn 0.357300 0.740600 -0.569000
+vn -0.151200 0.669700 -0.727000
+vn 0.364500 0.723900 -0.585800
+vn 0.637000 0.676100 -0.370200
+vn 0.621500 0.705200 -0.341100
+vn 0.689600 0.650100 -0.318900
+vn 0.672900 0.681600 -0.287400
+vn 0.649800 0.646300 -0.400100
+vn 0.703500 0.617800 -0.351200
+vn 0.603400 0.733500 -0.312800
+vn 0.653200 0.712200 -0.256800
+vn 0.374200 0.689600 -0.620000
+vn 0.370100 0.706800 -0.602800
+vn -0.153500 0.676800 -0.720000
+vn -0.155100 0.684000 -0.712800
+vn -0.156100 0.691100 -0.705600
+vn 0.376600 0.672300 -0.637300
+vn -0.156500 0.698400 -0.698400
+vn 0.377300 0.654800 -0.654800
+vn 0.671300 0.554300 -0.492000
+vn 0.667000 0.585300 -0.461100
+vn 0.726700 0.518300 -0.450800
+vn 0.722100 0.551700 -0.417300
+vn 0.672700 0.523200 -0.523200
+vn 0.728300 0.484500 -0.484500
+vn 0.659800 0.615900 -0.430400
+vn 0.714300 0.584900 -0.384100
+vn 0.374200 0.620000 -0.689600
+vn 0.376500 0.637300 -0.672300
+vn -0.156200 0.705600 -0.691100
+vn -0.155100 0.712800 -0.684000
+vn -0.153500 0.720000 -0.676800
+vn 0.370100 0.602800 -0.706800
+vn 0.659800 0.430400 -0.615900
+vn 0.667000 0.461100 -0.585300
+vn 0.714300 0.384100 -0.584900
+vn 0.722100 0.417300 -0.551700
+vn 0.671300 0.492000 -0.554300
+vn 0.726700 0.450800 -0.518300
+vn 0.443100 0.893200 -0.076700
+vn 0.404500 0.912700 -0.056900
+vn 0.403700 0.913000 -0.058800
+vn 0.442200 0.893400 -0.078400
+vn 0.364100 0.930500 -0.038900
+vn 0.363300 0.930800 -0.041000
+vn 0.478900 0.872200 -0.099700
+vn 0.479700 0.871900 -0.098200
+vn 0.513600 0.849100 -0.122800
+vn 0.514400 0.848800 -0.121500
+vn 0.482700 0.870800 -0.092800
+vn 0.446000 0.892200 -0.070900
+vn 0.491600 0.867500 -0.076000
+vn 0.454600 0.889100 -0.052700
+vn 0.517400 0.847700 -0.116600
+vn 0.526400 0.844100 -0.101000
+vn 0.407300 0.911900 -0.050700
+vn 0.366700 0.929800 -0.032200
+vn 0.415600 0.909000 -0.031200
+vn 0.374500 0.927200 -0.011500
+vn 0.278800 0.960300 -0.008800
+vn 0.234300 0.972100 0.003100
+vn 0.233600 0.972300 0.000700
+vn 0.278100 0.960500 -0.011100
+vn 0.188600 0.982000 0.013100
+vn 0.188100 0.982100 0.010500
+vn 0.321300 0.946700 -0.025000
+vn 0.322000 0.946400 -0.022900
+vn 0.324400 0.945800 -0.015700
+vn 0.280900 0.959700 -0.001300
+vn 0.331600 0.943400 0.006100
+vn 0.287300 0.957600 0.021600
+vn 0.236200 0.971600 0.011000
+vn 0.190100 0.981500 0.021200
+vn 0.241700 0.969700 0.034900
+vn 0.194700 0.979800 0.045900
+vn 0.095100 0.995100 0.026400
+vn 0.047800 0.998400 0.029800
+vn 0.047600 0.998500 0.026900
+vn 0.094900 0.995200 0.023700
+vn 0.000000 0.999500 0.030900
+vn 0.000000 0.999600 0.028000
+vn 0.141700 0.989700 0.018200
+vn 0.142000 0.989600 0.020800
+vn 0.143200 0.989200 0.029200
+vn 0.095900 0.994800 0.034900
+vn 0.146700 0.987600 0.054500
+vn 0.098300 0.993300 0.060700
+vn 0.048200 0.998100 0.038300
+vn 0.000000 0.999200 0.039500
+vn 0.049400 0.996700 0.064500
+vn 0.000000 0.997800 0.065700
+vn -0.095100 0.995100 0.026400
+vn -0.142000 0.989600 0.020800
+vn -0.141700 0.989700 0.018200
+vn -0.094900 0.995200 0.023700
+vn -0.188600 0.982000 0.013100
+vn -0.188100 0.982100 0.010500
+vn -0.047600 0.998500 0.026900
+vn -0.047800 0.998400 0.029800
+vn -0.048200 0.998100 0.038300
+vn -0.095900 0.994800 0.034900
+vn -0.049400 0.996700 0.064500
+vn -0.098300 0.993300 0.060700
+vn -0.143200 0.989200 0.029200
+vn -0.190100 0.981500 0.021200
+vn -0.146700 0.987600 0.054500
+vn -0.194700 0.979800 0.045900
+vn -0.278800 0.960300 -0.008800
+vn -0.322000 0.946400 -0.022900
+vn -0.321300 0.946700 -0.025000
+vn -0.278100 0.960500 -0.011100
+vn -0.364100 0.930500 -0.038900
+vn -0.363300 0.930800 -0.041000
+vn -0.233600 0.972300 0.000700
+vn -0.234300 0.972100 0.003100
+vn -0.236100 0.971600 0.011000
+vn -0.280900 0.959700 -0.001300
+vn -0.241700 0.969700 0.034900
+vn -0.287300 0.957600 0.021600
+vn -0.324400 0.945800 -0.015700
+vn -0.366700 0.929800 -0.032200
+vn -0.331600 0.943400 0.006100
+vn -0.374500 0.927200 -0.011500
+vn -0.443100 0.893200 -0.076700
+vn -0.479700 0.871900 -0.098200
+vn -0.478900 0.872200 -0.099700
+vn -0.442200 0.893400 -0.078400
+vn -0.514400 0.848800 -0.121500
+vn -0.513600 0.849100 -0.122800
+vn -0.403700 0.913000 -0.058800
+vn -0.404500 0.912700 -0.056900
+vn -0.407300 0.911900 -0.050700
+vn -0.446000 0.892200 -0.070900
+vn -0.415600 0.909000 -0.031200
+vn -0.454600 0.889100 -0.052700
+vn -0.482700 0.870800 -0.092800
+vn -0.517400 0.847700 -0.116600
+vn -0.491600 0.867500 -0.076000
+vn -0.526400 0.844100 -0.101000
+vn -0.576900 0.798400 -0.172400
+vn -0.604400 0.771100 -0.199900
+vn -0.603800 0.771400 -0.200700
+vn -0.576200 0.798700 -0.173400
+vn -0.629500 0.742500 -0.228700
+vn -0.629000 0.742800 -0.229300
+vn -0.546200 0.824600 -0.147400
+vn -0.546900 0.824300 -0.146300
+vn -0.549900 0.823100 -0.141800
+vn -0.579900 0.797100 -0.168300
+vn -0.559000 0.819300 -0.127500
+vn -0.588900 0.793100 -0.155300
+vn -0.607300 0.769800 -0.196200
+vn -0.632300 0.741200 -0.225300
+vn -0.616200 0.765700 -0.184300
+vn -0.640900 0.736900 -0.214600
+vn -0.671300 0.682400 -0.289200
+vn -0.687900 0.651000 -0.320700
+vn -0.687600 0.651200 -0.321000
+vn -0.670900 0.682600 -0.289600
+vn -0.701700 0.618900 -0.353000
+vn -0.701400 0.619000 -0.353300
+vn -0.651400 0.713100 -0.259000
+vn -0.651900 0.712900 -0.258500
+vn -0.654500 0.711500 -0.255500
+vn -0.673900 0.681000 -0.286500
+vn -0.663000 0.707100 -0.245800
+vn -0.682100 0.676500 -0.277600
+vn -0.690400 0.649600 -0.318300
+vn -0.704100 0.617400 -0.350800
+vn -0.698400 0.645000 -0.310200
+vn -0.711800 0.612700 -0.343400
+vn -0.720100 0.553000 -0.419000
+vn -0.724700 0.519700 -0.452400
+vn -0.724500 0.519800 -0.452500
+vn -0.719900 0.553200 -0.419100
+vn -0.726300 0.486000 -0.486000
+vn -0.726100 0.486200 -0.486200
+vn -0.712200 0.586300 -0.386100
+vn -0.712500 0.586100 -0.385800
+vn -0.714700 0.584600 -0.383900
+vn -0.722300 0.551500 -0.417100
+vn -0.722300 0.579700 -0.377100
+vn -0.729800 0.546500 -0.410800
+vn -0.726900 0.518100 -0.450600
+vn -0.728400 0.484400 -0.484400
+vn -0.734200 0.512800 -0.444800
+vn -0.735700 0.478900 -0.478900
+vn -0.720100 0.419000 -0.553000
+vn -0.712400 0.385800 -0.586100
+vn -0.712200 0.386100 -0.586300
+vn -0.719900 0.419100 -0.553200
+vn -0.701700 0.353000 -0.618900
+vn -0.701400 0.353300 -0.619000
+vn -0.724500 0.452500 -0.519800
+vn -0.724700 0.452400 -0.519700
+vn -0.726900 0.450600 -0.518100
+vn -0.722300 0.417100 -0.551500
+vn -0.734200 0.444800 -0.512800
+vn -0.729800 0.410800 -0.546500
+vn -0.714700 0.383900 -0.584600
+vn -0.704100 0.350800 -0.617400
+vn -0.722300 0.377100 -0.579700
+vn -0.711800 0.343400 -0.612700
+vn -0.671300 0.289200 -0.682400
+vn -0.651900 0.258500 -0.712900
+vn -0.651400 0.259000 -0.713100
+vn -0.670900 0.289600 -0.682600
+vn -0.629500 0.228700 -0.742500
+vn -0.629000 0.229300 -0.742800
+vn -0.687600 0.321000 -0.651200
+vn -0.687900 0.320700 -0.651000
+vn -0.690400 0.318300 -0.649600
+vn -0.673900 0.286500 -0.681000
+vn -0.698400 0.310200 -0.645000
+vn -0.682100 0.277600 -0.676500
+vn -0.654500 0.255500 -0.711500
+vn -0.632300 0.225300 -0.741200
+vn -0.663000 0.245800 -0.707100
+vn -0.640900 0.214600 -0.736900
+vn -0.576900 0.172400 -0.798400
+vn -0.546900 0.146300 -0.824300
+vn -0.546200 0.147400 -0.824600
+vn -0.576200 0.173400 -0.798700
+vn -0.514400 0.121500 -0.848800
+vn -0.513600 0.122800 -0.849100
+vn -0.603800 0.200700 -0.771400
+vn -0.604400 0.199900 -0.771100
+vn -0.607300 0.196200 -0.769800
+vn -0.579900 0.168300 -0.797100
+vn -0.616200 0.184300 -0.765700
+vn -0.588900 0.155300 -0.793100
+vn -0.549900 0.141800 -0.823100
+vn -0.517400 0.116600 -0.847700
+vn -0.559000 0.127500 -0.819300
+vn -0.526400 0.101000 -0.844100
+vn -0.443100 0.076700 -0.893200
+vn -0.404500 0.056900 -0.912700
+vn -0.403700 0.058800 -0.913000
+vn -0.442200 0.078400 -0.893400
+vn -0.364100 0.038900 -0.930500
+vn -0.363300 0.041000 -0.930800
+vn -0.478900 0.099700 -0.872200
+vn -0.479700 0.098200 -0.871900
+vn -0.482700 0.092800 -0.870800
+vn -0.446000 0.070900 -0.892200
+vn -0.491600 0.076000 -0.867500
+vn -0.454600 0.052700 -0.889100
+vn -0.407300 0.050700 -0.911900
+vn -0.366700 0.032200 -0.929800
+vn -0.415600 0.031200 -0.909000
+vn -0.374500 0.011500 -0.927200
+vn -0.278800 0.008800 -0.960300
+vn -0.234300 -0.003100 -0.972100
+vn -0.233600 -0.000700 -0.972300
+vn -0.278100 0.011100 -0.960500
+vn -0.188600 -0.013100 -0.982000
+vn -0.188100 -0.010500 -0.982100
+vn -0.321300 0.025000 -0.946700
+vn -0.322000 0.022900 -0.946400
+vn -0.324400 0.015700 -0.945800
+vn -0.280900 0.001300 -0.959700
+vn -0.331600 -0.006100 -0.943400
+vn -0.287300 -0.021600 -0.957600
+vn -0.236100 -0.011000 -0.971600
+vn -0.190100 -0.021200 -0.981500
+vn -0.241700 -0.034900 -0.969700
+vn -0.194700 -0.045900 -0.979800
+vn -0.095100 -0.026400 -0.995100
+vn -0.047800 -0.029800 -0.998400
+vn -0.047600 -0.026900 -0.998500
+vn -0.094900 -0.023700 -0.995200
+vn 0.000000 -0.030900 -0.999500
+vn 0.000000 -0.028000 -0.999600
+vn -0.141700 -0.018200 -0.989700
+vn -0.142000 -0.020800 -0.989600
+vn -0.143200 -0.029200 -0.989200
+vn -0.095900 -0.034900 -0.994800
+vn -0.146700 -0.054500 -0.987600
+vn -0.098300 -0.060700 -0.993300
+vn -0.048200 -0.038300 -0.998100
+vn 0.000000 -0.039500 -0.999200
+vn -0.049400 -0.064500 -0.996700
+vn 0.000000 -0.065700 -0.997800
+vn 0.095100 -0.026400 -0.995100
+vn 0.142000 -0.020800 -0.989600
+vn 0.141700 -0.018200 -0.989700
+vn 0.094900 -0.023700 -0.995200
+vn 0.188600 -0.013100 -0.982000
+vn 0.188100 -0.010500 -0.982100
+vn 0.047600 -0.026900 -0.998500
+vn 0.047800 -0.029800 -0.998400
+vn 0.048200 -0.038300 -0.998100
+vn 0.095900 -0.034900 -0.994800
+vn 0.049400 -0.064500 -0.996700
+vn 0.098300 -0.060700 -0.993300
+vn 0.143200 -0.029200 -0.989200
+vn 0.190100 -0.021200 -0.981500
+vn 0.146700 -0.054500 -0.987600
+vn 0.194700 -0.045900 -0.979800
+vn 0.278800 0.008800 -0.960300
+vn 0.322000 0.022900 -0.946400
+vn 0.321300 0.025000 -0.946700
+vn 0.278100 0.011100 -0.960500
+vn 0.364100 0.038900 -0.930500
+vn 0.363300 0.041000 -0.930800
+vn 0.233600 -0.000700 -0.972300
+vn 0.234300 -0.003100 -0.972100
+vn 0.236100 -0.011000 -0.971600
+vn 0.280900 0.001300 -0.959700
+vn 0.241700 -0.034900 -0.969700
+vn 0.287300 -0.021600 -0.957600
+vn 0.324400 0.015700 -0.945800
+vn 0.366700 0.032200 -0.929800
+vn 0.331600 -0.006100 -0.943400
+vn 0.374500 0.011500 -0.927200
+vn 0.443100 0.076700 -0.893200
+vn 0.479700 0.098200 -0.871900
+vn 0.478900 0.099700 -0.872200
+vn 0.442200 0.078400 -0.893400
+vn 0.514400 0.121500 -0.848800
+vn 0.513600 0.122800 -0.849100
+vn 0.403700 0.058800 -0.913000
+vn 0.404500 0.056900 -0.912700
+vn 0.407300 0.050700 -0.911900
+vn 0.446000 0.070900 -0.892200
+vn 0.415600 0.031200 -0.909000
+vn 0.454600 0.052700 -0.889100
+vn 0.482700 0.092800 -0.870800
+vn 0.517400 0.116600 -0.847700
+vn 0.491600 0.076000 -0.867500
+vn 0.526400 0.101000 -0.844100
+vn 0.576900 0.172400 -0.798400
+vn 0.604400 0.199900 -0.771100
+vn 0.603800 0.200700 -0.771400
+vn 0.576200 0.173400 -0.798700
+vn 0.629500 0.228700 -0.742500
+vn 0.629000 0.229300 -0.742800
+vn 0.546200 0.147400 -0.824600
+vn 0.546900 0.146300 -0.824300
+vn 0.549900 0.141800 -0.823100
+vn 0.579900 0.168300 -0.797100
+vn 0.559000 0.127500 -0.819300
+vn 0.588900 0.155300 -0.793100
+vn 0.607300 0.196200 -0.769800
+vn 0.632300 0.225300 -0.741200
+vn 0.616200 0.184300 -0.765700
+vn 0.640900 0.214600 -0.736900
+vn 0.671300 0.289200 -0.682400
+vn 0.687900 0.320700 -0.651000
+vn 0.687600 0.321000 -0.651200
+vn 0.670900 0.289600 -0.682600
+vn 0.701700 0.353000 -0.618900
+vn 0.701400 0.353300 -0.619000
+vn 0.651400 0.259000 -0.713100
+vn 0.651900 0.258500 -0.712900
+vn 0.654500 0.255500 -0.711500
+vn 0.673900 0.286500 -0.681000
+vn 0.663000 0.245800 -0.707100
+vn 0.682100 0.277600 -0.676500
+vn 0.690400 0.318300 -0.649600
+vn 0.704100 0.350800 -0.617400
+vn 0.698400 0.310200 -0.645000
+vn 0.711800 0.343400 -0.612700
+vn 0.720100 0.419000 -0.553000
+vn 0.724700 0.452400 -0.519700
+vn 0.724500 0.452500 -0.519800
+vn 0.719900 0.419100 -0.553200
+vn 0.726300 0.486000 -0.486000
+vn 0.726100 0.486200 -0.486200
+vn 0.712200 0.386100 -0.586300
+vn 0.712400 0.385800 -0.586100
+vn 0.714700 0.383900 -0.584600
+vn 0.722300 0.417100 -0.551500
+vn 0.722300 0.377100 -0.579700
+vn 0.729800 0.410800 -0.546500
+vn 0.726900 0.450600 -0.518100
+vn 0.728400 0.484400 -0.484400
+vn 0.734200 0.444800 -0.512800
+vn 0.735700 0.478900 -0.478900
+vn 0.720100 0.553000 -0.419000
+vn 0.712500 0.586100 -0.385900
+vn 0.712200 0.586300 -0.386100
+vn 0.719900 0.553200 -0.419100
+vn 0.701700 0.618900 -0.353000
+vn 0.701400 0.619000 -0.353300
+vn 0.724500 0.519800 -0.452500
+vn 0.724700 0.519700 -0.452400
+vn 0.726900 0.518100 -0.450600
+vn 0.722300 0.551500 -0.417100
+vn 0.734200 0.512800 -0.444800
+vn 0.729800 0.546500 -0.410800
+vn 0.714700 0.584600 -0.383900
+vn 0.704100 0.617400 -0.350800
+vn 0.722300 0.579700 -0.377100
+vn 0.711800 0.612700 -0.343400
+vn 0.671300 0.682400 -0.289200
+vn 0.651900 0.712900 -0.258500
+vn 0.651400 0.713100 -0.259000
+vn 0.670900 0.682600 -0.289600
+vn 0.629500 0.742500 -0.228700
+vn 0.629000 0.742800 -0.229300
+vn 0.687600 0.651200 -0.321000
+vn 0.687900 0.651000 -0.320700
+vn 0.690400 0.649600 -0.318300
+vn 0.673900 0.681000 -0.286500
+vn 0.698400 0.645000 -0.310200
+vn 0.682100 0.676500 -0.277600
+vn 0.654500 0.711500 -0.255500
+vn 0.632300 0.741200 -0.225300
+vn 0.663000 0.707100 -0.245800
+vn 0.640900 0.736900 -0.214600
+vn 0.576900 0.798400 -0.172400
+vn 0.546900 0.824300 -0.146300
+vn 0.546200 0.824600 -0.147400
+vn 0.576200 0.798700 -0.173400
+vn 0.603800 0.771400 -0.200700
+vn 0.604400 0.771100 -0.199900
+vn 0.607300 0.769800 -0.196200
+vn 0.579900 0.797100 -0.168300
+vn 0.616200 0.765700 -0.184300
+vn 0.588900 0.793100 -0.155300
+vn 0.549900 0.823100 -0.141800
+vn 0.559000 0.819300 -0.127500
+vn -0.719500 0.553500 -0.419500
+vn -0.724100 0.520100 -0.452800
+vn -0.843000 0.417400 -0.339100
+vn -0.837600 0.456300 -0.300300
+vn -0.725700 0.486500 -0.486500
+vn -0.844800 0.378300 -0.378300
+vn -0.828600 0.494800 -0.261800
+vn -0.711800 0.586500 -0.386400
+vn -0.816000 0.532900 -0.223700
+vn -0.701000 0.619300 -0.353700
+vn -0.473000 0.685900 -0.553000
+vn -0.478100 0.663900 -0.574900
+vn -0.319600 0.713400 -0.623600
+vn -0.323000 0.698600 -0.638400
+vn -0.465800 0.707700 -0.531200
+vn -0.314700 0.728100 -0.608900
+vn -0.481200 0.641800 -0.597100
+vn -0.482300 0.619400 -0.619400
+vn -0.325100 0.683600 -0.653400
+vn -0.325800 0.668500 -0.668500
+vn -0.719500 0.419500 -0.553500
+vn -0.711800 0.386500 -0.586500
+vn -0.828600 0.261800 -0.494800
+vn -0.837600 0.300300 -0.456300
+vn -0.701000 0.353600 -0.619300
+vn -0.816000 0.223700 -0.532900
+vn -0.843000 0.339100 -0.417400
+vn -0.724100 0.452800 -0.520100
+vn -0.481200 0.597100 -0.641800
+vn -0.478100 0.574900 -0.663900
+vn -0.325100 0.653400 -0.683600
+vn -0.323000 0.638400 -0.698600
+vn -0.473000 0.553000 -0.685900
+vn -0.465800 0.531200 -0.707700
+vn -0.319600 0.623600 -0.713400
+vn -0.314700 0.608900 -0.728100
+vn -0.670500 0.290100 -0.682900
+vn -0.650900 0.259600 -0.713400
+vn -0.757800 0.114100 -0.642400
+vn -0.780500 0.149700 -0.606900
+vn -0.628500 0.229900 -0.743100
+vn -0.731700 0.079600 -0.677000
+vn -0.800000 0.186200 -0.570400
+vn -0.687200 0.321500 -0.651500
+vn -0.456600 0.509800 -0.729100
+vn -0.445500 0.488900 -0.749900
+vn -0.308500 0.594400 -0.742600
+vn -0.301000 0.580300 -0.756700
+vn -0.432500 0.468600 -0.770200
+vn -0.417600 0.448900 -0.789900
+vn -0.292200 0.566600 -0.770400
+vn -0.282200 0.553300 -0.783700
+vn -0.575700 0.174100 -0.798900
+vn -0.545700 0.148200 -0.824800
+vn -0.635300 -0.015500 -0.772100
+vn -0.670200 0.014600 -0.742000
+vn -0.513100 0.123600 -0.849300
+vn -0.597400 -0.044100 -0.800700
+vn -0.702400 0.046300 -0.710300
+vn -0.603300 0.201300 -0.771600
+vn -0.400900 0.429900 -0.808900
+vn -0.382600 0.411800 -0.827000
+vn -0.270900 0.540500 -0.796500
+vn -0.258500 0.528200 -0.808800
+vn -0.362600 0.394600 -0.844200
+vn -0.341000 0.378300 -0.860600
+vn -0.245000 0.516600 -0.820400
+vn -0.230400 0.505600 -0.831400
+vn -0.441800 0.079400 -0.893600
+vn -0.403200 0.059800 -0.913100
+vn -0.469500 -0.118400 -0.875000
+vn -0.514300 -0.095600 -0.852200
+vn -0.362800 0.042100 -0.930900
+vn -0.422400 -0.139000 -0.895700
+vn -0.556900 -0.070900 -0.827500
+vn -0.478400 0.100600 -0.872300
+vn -0.317900 0.363000 -0.875900
+vn -0.293600 0.348900 -0.890000
+vn -0.214800 0.495300 -0.841800
+vn -0.198300 0.485700 -0.851300
+vn -0.268000 0.335900 -0.903000
+vn -0.241100 0.324100 -0.914800
+vn -0.181000 0.476900 -0.860100
+vn -0.162900 0.468900 -0.868000
+vn -0.277700 0.012400 -0.960600
+vn -0.233300 0.000600 -0.972400
+vn -0.271700 -0.187400 -0.944000
+vn -0.323300 -0.173600 -0.930200
+vn -0.187800 -0.009200 -0.982100
+vn -0.218600 -0.198700 -0.955300
+vn -0.373500 -0.157500 -0.914100
+vn -0.320900 0.026200 -0.946700
+vn -0.213200 0.313600 -0.925300
+vn -0.184500 0.304400 -0.934500
+vn -0.144000 0.461800 -0.875100
+vn -0.124700 0.455600 -0.881400
+vn -0.155100 0.296500 -0.942300
+vn -0.124800 0.290000 -0.948800
+vn -0.104800 0.450300 -0.886700
+vn -0.084300 0.445900 -0.891000
+vn -0.094700 -0.022200 -0.995200
+vn -0.047500 -0.025500 -0.998500
+vn -0.055400 -0.217800 -0.974400
+vn -0.110300 -0.214000 -0.970600
+vn 0.000000 -0.026600 -0.999600
+vn 0.000000 -0.219100 -0.975700
+vn -0.164700 -0.207600 -0.964200
+vn -0.141500 -0.016800 -0.989800
+vn -0.094000 0.285000 -0.953900
+vn -0.062900 0.281400 -0.957500
+vn -0.063500 0.442500 -0.894500
+vn -0.042500 0.440000 -0.896900
+vn -0.031600 0.279200 -0.959700
+vn 0.000000 0.278400 -0.960400
+vn -0.021300 0.438600 -0.898400
+vn 0.000000 0.438100 -0.898900
+vn 0.094700 -0.022200 -0.995200
+vn 0.141500 -0.016800 -0.989800
+vn 0.164700 -0.207600 -0.964200
+vn 0.110300 -0.214000 -0.970600
+vn 0.187800 -0.009200 -0.982100
+vn 0.218600 -0.198700 -0.955300
+vn 0.055400 -0.217800 -0.974400
+vn 0.047500 -0.025500 -0.998500
+vn 0.031600 0.279200 -0.959700
+vn 0.062900 0.281400 -0.957500
+vn 0.021300 0.438600 -0.898400
+vn 0.042500 0.440100 -0.896900
+vn 0.094000 0.285000 -0.953900
+vn 0.124800 0.290000 -0.948800
+vn 0.063500 0.442500 -0.894500
+vn 0.084300 0.446000 -0.891000
+vn 0.277700 0.012400 -0.960600
+vn 0.320900 0.026200 -0.946700
+vn 0.373500 -0.157500 -0.914100
+vn 0.323300 -0.173600 -0.930200
+vn 0.362800 0.042100 -0.930900
+vn 0.422400 -0.139000 -0.895700
+vn 0.271700 -0.187400 -0.944000
+vn 0.233300 0.000600 -0.972400
+vn 0.155100 0.296500 -0.942300
+vn 0.184500 0.304400 -0.934500
+vn 0.104800 0.450300 -0.886700
+vn 0.124700 0.455600 -0.881400
+vn 0.213200 0.313600 -0.925300
+vn 0.241100 0.324100 -0.914800
+vn 0.144000 0.461800 -0.875100
+vn 0.162900 0.469000 -0.868000
+vn 0.441800 0.079400 -0.893600
+vn 0.478400 0.100600 -0.872300
+vn 0.556900 -0.070900 -0.827500
+vn 0.514300 -0.095600 -0.852200
+vn 0.513100 0.123600 -0.849300
+vn 0.597400 -0.044100 -0.800700
+vn 0.469500 -0.118400 -0.875000
+vn 0.403200 0.059800 -0.913100
+vn 0.268000 0.335900 -0.903000
+vn 0.293600 0.348900 -0.890000
+vn 0.181000 0.476900 -0.860000
+vn 0.198300 0.485700 -0.851300
+vn 0.317900 0.363000 -0.875900
+vn 0.341000 0.378300 -0.860600
+vn 0.214800 0.495300 -0.841700
+vn 0.230400 0.505600 -0.831400
+vn 0.575700 0.174100 -0.798900
+vn 0.603300 0.201300 -0.771600
+vn 0.702400 0.046300 -0.710300
+vn 0.670200 0.014600 -0.742000
+vn 0.628500 0.229900 -0.743000
+vn 0.731700 0.079600 -0.677000
+vn 0.635200 -0.015500 -0.772100
+vn 0.545700 0.148200 -0.824800
+vn 0.362600 0.394600 -0.844200
+vn 0.382600 0.411800 -0.827000
+vn 0.245000 0.516600 -0.820400
+vn 0.258500 0.528200 -0.808800
+vn 0.400900 0.429900 -0.808900
+vn 0.417600 0.448900 -0.789900
+vn 0.270900 0.540500 -0.796500
+vn 0.282200 0.553300 -0.783700
+vn 0.670500 0.290100 -0.682900
+vn 0.687200 0.321500 -0.651500
+vn 0.800000 0.186200 -0.570400
+vn 0.780500 0.149700 -0.606900
+vn 0.701000 0.353600 -0.619300
+vn 0.816000 0.223700 -0.532900
+vn 0.757800 0.114100 -0.642400
+vn 0.650900 0.259600 -0.713400
+vn 0.432500 0.468600 -0.770200
+vn 0.445500 0.488900 -0.749900
+vn 0.292200 0.566600 -0.770400
+vn 0.301000 0.580300 -0.756700
+vn 0.456600 0.509800 -0.729100
+vn 0.465800 0.531200 -0.707700
+vn 0.308500 0.594400 -0.742600
+vn 0.314700 0.608900 -0.728100
+vn 0.719500 0.419500 -0.553500
+vn 0.724100 0.452800 -0.520100
+vn 0.843000 0.339100 -0.417400
+vn 0.837600 0.300300 -0.456300
+vn 0.725700 0.486500 -0.486500
+vn 0.844800 0.378300 -0.378300
+vn 0.828600 0.261800 -0.494800
+vn 0.711800 0.386500 -0.586500
+vn 0.473000 0.553000 -0.685900
+vn 0.478100 0.574900 -0.663900
+vn 0.319600 0.623600 -0.713400
+vn 0.323000 0.638400 -0.698600
+vn 0.481200 0.597100 -0.641800
+vn 0.482300 0.619400 -0.619400
+vn 0.325100 0.653400 -0.683600
+vn 0.325800 0.668500 -0.668500
+vn 0.719500 0.553500 -0.419500
+vn 0.711800 0.586500 -0.386400
+vn 0.828600 0.494800 -0.261800
+vn 0.837600 0.456300 -0.300300
+vn 0.700900 0.619300 -0.353600
+vn 0.816000 0.532900 -0.223700
+vn 0.843000 0.417400 -0.339100
+vn 0.724100 0.520100 -0.452800
+vn 0.481200 0.641800 -0.597100
+vn 0.478100 0.664000 -0.574900
+vn 0.325100 0.683600 -0.653400
+vn 0.323000 0.698600 -0.638400
+vn 0.473000 0.685900 -0.553000
+vn 0.465800 0.707700 -0.531200
+vn 0.319600 0.713400 -0.623600
+vn 0.314700 0.728100 -0.608900
+vn 0.670500 0.682900 -0.290100
+vn 0.650900 0.713400 -0.259600
+vn 0.757800 0.642400 -0.114100
+vn 0.780500 0.606900 -0.149700
+vn 0.628500 0.743100 -0.229900
+vn 0.731700 0.677000 -0.079600
+vn 0.800000 0.570400 -0.186200
+vn 0.687200 0.651500 -0.321500
+vn 0.456600 0.729100 -0.509800
+vn 0.445500 0.749900 -0.488900
+vn 0.308500 0.742600 -0.594400
+vn 0.301000 0.756700 -0.580300
+vn 0.432500 0.770200 -0.468600
+vn 0.417600 0.789900 -0.448900
+vn 0.292200 0.770400 -0.566600
+vn 0.282200 0.783700 -0.553300
+vn 0.575700 0.798900 -0.174100
+vn 0.545700 0.824800 -0.148200
+vn 0.635200 0.772100 0.015500
+vn 0.670200 0.742000 -0.014600
+vn 0.513100 0.849300 -0.123600
+vn 0.597400 0.800700 0.044100
+vn 0.702400 0.710300 -0.046300
+vn 0.603300 0.771600 -0.201300
+vn 0.400900 0.808900 -0.429900
+vn 0.382600 0.827000 -0.411800
+vn 0.270900 0.796500 -0.540500
+vn 0.258500 0.808800 -0.528200
+vn 0.362600 0.844200 -0.394600
+vn 0.341000 0.860600 -0.378300
+vn 0.245000 0.820400 -0.516600
+vn 0.230400 0.831400 -0.505600
+vn 0.441800 0.893600 -0.079400
+vn 0.403200 0.913100 -0.059800
+vn 0.469500 0.875000 0.118400
+vn 0.514300 0.852200 0.095600
+vn 0.362800 0.930900 -0.042100
+vn 0.422400 0.895700 0.139000
+vn 0.556900 0.827500 0.070900
+vn 0.478400 0.872300 -0.100600
+vn 0.317900 0.875900 -0.363000
+vn 0.293600 0.890000 -0.348900
+vn 0.214800 0.841800 -0.495300
+vn 0.198400 0.851300 -0.485700
+vn 0.268000 0.903000 -0.335900
+vn 0.241100 0.914800 -0.324100
+vn 0.181100 0.860100 -0.476900
+vn 0.162900 0.868000 -0.469000
+vn 0.277700 0.960600 -0.012400
+vn 0.233300 0.972400 -0.000600
+vn 0.271700 0.944000 0.187400
+vn 0.323300 0.930200 0.173600
+vn 0.187800 0.982100 0.009200
+vn 0.218600 0.955300 0.198700
+vn 0.373500 0.914100 0.157500
+vn 0.320900 0.946700 -0.026200
+vn 0.213200 0.925300 -0.313600
+vn 0.184500 0.934500 -0.304400
+vn 0.144000 0.875100 -0.461900
+vn 0.124700 0.881400 -0.455600
+vn 0.155100 0.942300 -0.296500
+vn 0.124800 0.948800 -0.290000
+vn 0.104800 0.886700 -0.450300
+vn 0.084300 0.891000 -0.445900
+vn 0.094700 0.995200 0.022200
+vn 0.047500 0.998500 0.025500
+vn 0.055400 0.974400 0.217800
+vn 0.110300 0.970600 0.214000
+vn 0.000000 0.999600 0.026600
+vn 0.000000 0.975700 0.219100
+vn 0.164700 0.964200 0.207600
+vn 0.141500 0.989800 0.016800
+vn 0.094000 0.953900 -0.285000
+vn 0.062900 0.957500 -0.281300
+vn 0.063500 0.894500 -0.442500
+vn 0.042500 0.896900 -0.440100
+vn 0.031600 0.959700 -0.279100
+vn 0.000000 0.960400 -0.278400
+vn 0.021300 0.898400 -0.438600
+vn 0.000000 0.898900 -0.438100
+vn -0.094700 0.995200 0.022200
+vn -0.141500 0.989800 0.016800
+vn -0.164700 0.964200 0.207600
+vn -0.110300 0.970600 0.214000
+vn -0.187800 0.982100 0.009200
+vn -0.218600 0.955300 0.198700
+vn -0.055400 0.974400 0.217800
+vn -0.047500 0.998500 0.025500
+vn -0.031600 0.959700 -0.279100
+vn -0.062900 0.957500 -0.281300
+vn -0.021300 0.898400 -0.438600
+vn -0.042500 0.896900 -0.440100
+vn -0.094000 0.953900 -0.285000
+vn -0.124800 0.948800 -0.290000
+vn -0.063500 0.894500 -0.442500
+vn -0.084300 0.891000 -0.445900
+vn -0.277700 0.960600 -0.012400
+vn -0.320900 0.946700 -0.026200
+vn -0.373500 0.914100 0.157500
+vn -0.323300 0.930200 0.173600
+vn -0.362800 0.930900 -0.042100
+vn -0.422400 0.895700 0.139000
+vn -0.271700 0.944000 0.187400
+vn -0.233300 0.972400 -0.000600
+vn -0.155100 0.942300 -0.296500
+vn -0.184500 0.934500 -0.304400
+vn -0.104800 0.886700 -0.450300
+vn -0.124700 0.881400 -0.455600
+vn -0.213200 0.925300 -0.313600
+vn -0.241100 0.914800 -0.324100
+vn -0.144000 0.875100 -0.461900
+vn -0.162900 0.868000 -0.469000
+vn -0.441800 0.893600 -0.079400
+vn -0.478400 0.872300 -0.100600
+vn -0.556900 0.827500 0.070900
+vn -0.514300 0.852200 0.095600
+vn -0.513100 0.849300 -0.123600
+vn -0.597400 0.800700 0.044100
+vn -0.469500 0.875000 0.118400
+vn -0.403200 0.913100 -0.059800
+vn -0.268000 0.903000 -0.335900
+vn -0.293600 0.890000 -0.348900
+vn -0.181100 0.860100 -0.476900
+vn -0.198400 0.851300 -0.485700
+vn -0.317900 0.875900 -0.363000
+vn -0.341000 0.860600 -0.378300
+vn -0.214800 0.841800 -0.495200
+vn -0.230400 0.831400 -0.505600
+vn -0.575700 0.798900 -0.174100
+vn -0.603300 0.771600 -0.201300
+vn -0.702400 0.710300 -0.046300
+vn -0.670200 0.742000 -0.014600
+vn -0.628500 0.743100 -0.229900
+vn -0.731700 0.677000 -0.079600
+vn -0.635200 0.772100 0.015500
+vn -0.545700 0.824800 -0.148200
+vn -0.362600 0.844200 -0.394600
+vn -0.382600 0.827000 -0.411800
+vn -0.245000 0.820400 -0.516600
+vn -0.258500 0.808800 -0.528200
+vn -0.400900 0.808900 -0.429900
+vn -0.417600 0.789900 -0.448900
+vn -0.270900 0.796500 -0.540500
+vn -0.282200 0.783700 -0.553300
+vn -0.670500 0.682900 -0.290100
+vn -0.687200 0.651500 -0.321500
+vn -0.800000 0.570400 -0.186200
+vn -0.780500 0.606900 -0.149700
+vn -0.757800 0.642400 -0.114100
+vn -0.650900 0.713400 -0.259600
+vn -0.432500 0.770200 -0.468700
+vn -0.445500 0.749900 -0.488900
+vn -0.292200 0.770400 -0.566600
+vn -0.301000 0.756700 -0.580300
+vn -0.456600 0.729100 -0.509800
+vn -0.308500 0.742600 -0.594400
+vn -0.502900 -0.274000 0.819700
+vn -0.527000 -0.297800 0.796000
+vn -0.758600 0.069200 0.647800
+vn -0.723900 0.103500 0.682100
+vn -0.769200 0.631900 0.095200
+vn -0.734000 0.666600 0.129900
+vn -0.549000 -0.322700 0.771000
+vn -0.790200 0.033300 0.611900
+vn -0.801200 0.595400 0.058700
+vn -0.686100 0.136100 0.714600
+vn -0.476700 -0.251400 0.842400
+vn -0.645200 0.166900 0.745500
+vn -0.448200 -0.229900 0.863800
+vn -0.695700 0.699600 0.162900
+vn -0.654200 0.730900 0.194200
+vn -0.373900 -0.381700 0.845300
+vn -0.394500 -0.399400 0.827500
+vn -0.344200 -0.415300 0.842000
+vn -0.363100 -0.431700 0.825700
+vn -0.351600 -0.364900 0.862100
+vn -0.323600 -0.399800 0.857500
+vn -0.413400 -0.418100 0.808900
+vn -0.430600 -0.437700 0.789300
+vn -0.380500 -0.448800 0.808500
+vn -0.396400 -0.466800 0.790500
+vn -0.385900 -0.191200 0.902500
+vn -0.417900 -0.209800 0.883900
+vn -0.601500 0.195900 0.774400
+vn -0.555500 0.222600 0.801100
+vn -0.609900 0.760300 0.223500
+vn -0.563200 0.787300 0.250600
+vn -0.507100 0.247100 0.825700
+vn -0.352200 -0.174200 0.919500
+vn -0.456200 0.269400 0.848000
+vn -0.316900 -0.158700 0.935100
+vn -0.514100 0.812300 0.275500
+vn -0.462600 0.834900 0.298100
+vn -0.276300 -0.321200 0.905800
+vn -0.302700 -0.334500 0.892400
+vn -0.254300 -0.359600 0.897800
+vn -0.278600 -0.371900 0.885400
+vn -0.248600 -0.309000 0.918000
+vn -0.228800 -0.348400 0.909000
+vn -0.327800 -0.349100 0.877900
+vn -0.301700 -0.385300 0.872000
+vn -0.242600 -0.132700 0.961000
+vn -0.280300 -0.144800 0.948900
+vn -0.403500 0.289400 0.868000
+vn -0.349200 0.306800 0.885400
+vn -0.409100 0.855100 0.318400
+vn -0.354000 0.872700 0.336000
+vn -0.293400 0.321600 0.900200
+vn -0.203800 -0.122400 0.971300
+vn -0.236200 0.333900 0.912500
+vn -0.164100 -0.113900 0.979800
+vn -0.297500 0.887800 0.351100
+vn -0.239400 0.900200 0.363600
+vn -0.159900 -0.280600 0.946400
+vn -0.190300 -0.288600 0.938300
+vn -0.147200 -0.322200 0.935100
+vn -0.175100 -0.329700 0.927700
+vn -0.128700 -0.273900 0.953100
+vn -0.118400 -0.316000 0.941300
+vn -0.219800 -0.298100 0.928800
+vn -0.202400 -0.338400 0.919000
+vn -0.082700 -0.102400 0.991300
+vn -0.123600 -0.107200 0.986500
+vn -0.177900 0.343500 0.922100
+vn -0.119100 0.350400 0.929000
+vn -0.180400 0.910000 0.373300
+vn -0.120700 0.916900 0.380300
+vn -0.059800 0.354500 0.933100
+vn -0.041500 -0.099600 0.994100
+vn 0.000000 0.355900 0.934500
+vn 0.000000 -0.098600 0.995100
+vn -0.060600 0.921100 0.384400
+vn 0.000000 0.922500 0.385800
+vn -0.032600 -0.262600 0.964300
+vn -0.064900 -0.264900 0.962100
+vn -0.030000 -0.305700 0.951600
+vn -0.059700 -0.307700 0.949600
+vn 0.000000 -0.261900 0.965100
+vn 0.000000 -0.305000 0.952300
+vn -0.096900 -0.268600 0.958300
+vn -0.089200 -0.311200 0.946100
+vn 0.082700 -0.102500 0.991300
+vn 0.041500 -0.099600 0.994100
+vn 0.059800 0.354500 0.933100
+vn 0.119100 0.350400 0.929000
+vn 0.060600 0.921100 0.384400
+vn 0.120800 0.916900 0.380300
+vn 0.177900 0.343500 0.922100
+vn 0.123600 -0.107200 0.986500
+vn 0.236200 0.333900 0.912500
+vn 0.164000 -0.113900 0.979800
+vn 0.180400 0.910000 0.373300
+vn 0.239400 0.900300 0.363500
+vn 0.096900 -0.268600 0.958300
+vn 0.064900 -0.264900 0.962100
+vn 0.089200 -0.311200 0.946100
+vn 0.059700 -0.307700 0.949600
+vn 0.128700 -0.273900 0.953100
+vn 0.118500 -0.316000 0.941300
+vn 0.032600 -0.262600 0.964300
+vn 0.030000 -0.305700 0.951600
+vn 0.242600 -0.132700 0.961000
+vn 0.203800 -0.122400 0.971300
+vn 0.293400 0.321600 0.900200
+vn 0.349200 0.306800 0.885400
+vn 0.297500 0.887800 0.351100
+vn 0.354000 0.872700 0.336100
+vn 0.403500 0.289400 0.868000
+vn 0.280300 -0.144800 0.948900
+vn 0.456200 0.269400 0.848100
+vn 0.316900 -0.158700 0.935100
+vn 0.409100 0.855100 0.318400
+vn 0.462600 0.834900 0.298200
+vn 0.219900 -0.298100 0.928800
+vn 0.190300 -0.288600 0.938300
+vn 0.202400 -0.338400 0.919000
+vn 0.175100 -0.329600 0.927700
+vn 0.248600 -0.309000 0.918000
+vn 0.228800 -0.348400 0.909000
+vn 0.159900 -0.280600 0.946400
+vn 0.147200 -0.322200 0.935100
+vn 0.385900 -0.191200 0.902500
+vn 0.352200 -0.174200 0.919500
+vn 0.507000 0.247100 0.825700
+vn 0.555500 0.222600 0.801200
+vn 0.514100 0.812200 0.275600
+vn 0.563200 0.787300 0.250700
+vn 0.601500 0.195800 0.774400
+vn 0.417900 -0.209800 0.883900
+vn 0.645200 0.166900 0.745500
+vn 0.448200 -0.229900 0.863800
+vn 0.609900 0.760200 0.223500
+vn 0.654200 0.730900 0.194200
+vn 0.327800 -0.349100 0.877900
+vn 0.302700 -0.334500 0.892400
+vn 0.301700 -0.385300 0.872000
+vn 0.278600 -0.371900 0.885400
+vn 0.351600 -0.364900 0.862100
+vn 0.323600 -0.399800 0.857500
+vn 0.276300 -0.321200 0.905800
+vn 0.254300 -0.359600 0.897800
+vn 0.502900 -0.274000 0.819700
+vn 0.476700 -0.251400 0.842400
+vn 0.686100 0.136100 0.714600
+vn 0.723900 0.103500 0.682100
+vn 0.695700 0.699600 0.162900
+vn 0.734000 0.666600 0.129900
+vn 0.758600 0.069200 0.647800
+vn 0.527000 -0.297800 0.796000
+vn 0.790200 0.033300 0.611900
+vn 0.549000 -0.322700 0.771000
+vn 0.769200 0.631900 0.095200
+vn 0.801200 0.595400 0.058700
+vn 0.413400 -0.418100 0.808900
+vn 0.394500 -0.399400 0.827500
+vn 0.380500 -0.448800 0.808500
+vn 0.363100 -0.431700 0.825700
+vn 0.430600 -0.437700 0.789300
+vn 0.396400 -0.466800 0.790500
+vn 0.373900 -0.381700 0.845300
+vn 0.344200 -0.415300 0.842000
+vn 0.585700 -0.375300 0.718400
+vn 0.568600 -0.348700 0.745000
+vn 0.818400 -0.004000 0.574600
+vn 0.843000 -0.042400 0.536200
+vn 0.829800 0.557600 0.020900
+vn 0.854800 0.518700 -0.018000
+vn 0.864000 -0.081800 0.496800
+vn 0.600200 -0.402700 0.691000
+vn 0.881400 -0.122300 0.456300
+vn 0.612300 -0.430900 0.662900
+vn 0.876000 0.478700 -0.058000
+vn 0.893600 0.437700 -0.099000
+vn 0.470800 -0.500400 0.726600
+vn 0.459400 -0.478900 0.748000
+vn 0.433400 -0.524600 0.732700
+vn 0.422900 -0.504800 0.752500
+vn 0.480300 -0.522500 0.704500
+vn 0.442100 -0.544900 0.712400
+vn 0.446000 -0.458000 0.768900
+vn 0.410500 -0.485500 0.771800
+vn 0.628500 -0.488300 0.605400
+vn 0.621800 -0.459500 0.634200
+vn 0.895000 -0.163500 0.415100
+vn 0.904700 -0.205100 0.373500
+vn 0.907400 0.395900 -0.140800
+vn 0.917300 0.353700 -0.182900
+vn 0.910500 -0.247000 0.331600
+vn 0.632600 -0.517500 0.576300
+vn 0.912400 -0.289300 0.289300
+vn 0.633900 -0.546900 0.546900
+vn 0.923200 0.311200 -0.225400
+vn 0.925200 0.268300 -0.268300
+vn 0.496200 -0.590400 0.636500
+vn 0.493000 -0.567600 0.659400
+vn 0.456700 -0.607400 0.649900
+vn 0.453800 -0.586400 0.670900
+vn 0.497200 -0.613500 0.613500
+vn 0.457700 -0.628700 0.628700
+vn 0.487700 -0.544900 0.682000
+vn 0.448900 -0.565600 0.691800
+vn 0.628500 -0.605400 0.488300
+vn 0.632600 -0.576300 0.517500
+vn 0.910500 -0.331600 0.247000
+vn 0.904700 -0.373500 0.205100
+vn 0.923200 0.225400 -0.311200
+vn 0.917300 0.182900 -0.353700
+vn 0.895000 -0.415100 0.163500
+vn 0.621800 -0.634200 0.459500
+vn 0.881400 -0.456300 0.122300
+vn 0.612300 -0.662900 0.430900
+vn 0.907400 0.140800 -0.395900
+vn 0.893600 0.099000 -0.437700
+vn 0.487700 -0.682000 0.544900
+vn 0.493000 -0.659400 0.567600
+vn 0.448900 -0.691800 0.565600
+vn 0.453800 -0.670900 0.586400
+vn 0.480300 -0.704500 0.522500
+vn 0.442100 -0.712500 0.544900
+vn 0.496100 -0.636500 0.590400
+vn 0.456700 -0.649900 0.607400
+vn 0.585700 -0.718400 0.375300
+vn 0.600200 -0.691000 0.402700
+vn 0.864000 -0.496800 0.081800
+vn 0.843000 -0.536200 0.042400
+vn 0.876000 0.058000 -0.478700
+vn 0.854800 0.018000 -0.518700
+vn 0.818400 -0.574600 0.004000
+vn 0.568600 -0.745000 0.348600
+vn 0.790200 -0.611900 -0.033300
+vn 0.549000 -0.771000 0.322700
+vn 0.829800 -0.020900 -0.557600
+vn 0.801200 -0.058700 -0.595400
+vn 0.446000 -0.768900 0.458000
+vn 0.459400 -0.748000 0.478900
+vn 0.410500 -0.771800 0.485500
+vn 0.422900 -0.752500 0.504800
+vn 0.430600 -0.789300 0.437700
+vn 0.396400 -0.790500 0.466800
+vn 0.470800 -0.726600 0.500400
+vn 0.433400 -0.732700 0.524600
+vn 0.502900 -0.819700 0.274000
+vn 0.527000 -0.796000 0.297800
+vn 0.758600 -0.647800 -0.069200
+vn 0.723900 -0.682100 -0.103500
+vn 0.769200 -0.095200 -0.631900
+vn 0.734000 -0.129900 -0.666600
+vn 0.686100 -0.714700 -0.136000
+vn 0.476600 -0.842400 0.251400
+vn 0.645200 -0.745500 -0.166900
+vn 0.448200 -0.863800 0.229900
+vn 0.695700 -0.162900 -0.699600
+vn 0.654200 -0.194200 -0.730900
+vn 0.373900 -0.845300 0.381700
+vn 0.394500 -0.827500 0.399400
+vn 0.344200 -0.842000 0.415300
+vn 0.363100 -0.825700 0.431600
+vn 0.351600 -0.862100 0.364900
+vn 0.323600 -0.857500 0.399800
+vn 0.413400 -0.808900 0.418100
+vn 0.380500 -0.808500 0.448800
+vn 0.385900 -0.902500 0.191200
+vn 0.417900 -0.883900 0.209800
+vn 0.601500 -0.774400 -0.195900
+vn 0.555500 -0.801200 -0.222600
+vn 0.609900 -0.223500 -0.760200
+vn 0.563200 -0.250700 -0.787300
+vn 0.507000 -0.825700 -0.247100
+vn 0.352200 -0.919500 0.174200
+vn 0.456200 -0.848100 -0.269400
+vn 0.316900 -0.935100 0.158700
+vn 0.514100 -0.275600 -0.812200
+vn 0.462600 -0.298200 -0.834900
+vn 0.276300 -0.905800 0.321100
+vn 0.302700 -0.892400 0.334500
+vn 0.254300 -0.897800 0.359600
+vn 0.278600 -0.885400 0.371900
+vn 0.248600 -0.918000 0.309000
+vn 0.228900 -0.909000 0.348300
+vn 0.327800 -0.877900 0.349100
+vn 0.301700 -0.872000 0.385300
+vn 0.242600 -0.961000 0.132700
+vn 0.280300 -0.948900 0.144800
+vn 0.403500 -0.868000 -0.289400
+vn 0.349200 -0.885400 -0.306800
+vn 0.409100 -0.318400 -0.855100
+vn 0.354000 -0.336100 -0.872700
+vn 0.293400 -0.900200 -0.321600
+vn 0.203800 -0.971300 0.122400
+vn 0.236200 -0.912500 -0.333900
+vn 0.164000 -0.979800 0.113900
+vn 0.297500 -0.351100 -0.887800
+vn 0.239400 -0.363500 -0.900300
+vn 0.159900 -0.946400 0.280600
+vn 0.190300 -0.938300 0.288600
+vn 0.147200 -0.935100 0.322200
+vn 0.175100 -0.927700 0.329600
+vn 0.128700 -0.953100 0.273900
+vn 0.118400 -0.941300 0.316000
+vn 0.219900 -0.928800 0.298100
+vn 0.202400 -0.919000 0.338400
+vn 0.082700 -0.991300 0.102400
+vn 0.123600 -0.986500 0.107200
+vn 0.177900 -0.922100 -0.343500
+vn 0.119100 -0.929000 -0.350400
+vn 0.180400 -0.373300 -0.910000
+vn 0.120800 -0.380300 -0.916900
+vn 0.059800 -0.933100 -0.354500
+vn 0.041500 -0.994100 0.099600
+vn 0.000000 -0.934500 -0.355900
+vn 0.000000 -0.995100 0.098600
+vn 0.060600 -0.384500 -0.921100
+vn 0.000000 -0.385800 -0.922500
+vn 0.032600 -0.964300 0.262600
+vn 0.064900 -0.962100 0.264900
+vn 0.030000 -0.951600 0.305700
+vn 0.059700 -0.949600 0.307700
+vn 0.000000 -0.965100 0.261900
+vn 0.000000 -0.952300 0.305000
+vn 0.096900 -0.958300 0.268600
+vn 0.089200 -0.946100 0.311200
+vn -0.082700 -0.991300 0.102500
+vn -0.041500 -0.994100 0.099600
+vn -0.059800 -0.933100 -0.354500
+vn -0.119100 -0.929000 -0.350400
+vn -0.060600 -0.384400 -0.921100
+vn -0.120700 -0.380300 -0.916900
+vn -0.177900 -0.922100 -0.343500
+vn -0.123600 -0.986500 0.107200
+vn -0.236200 -0.912500 -0.333900
+vn -0.164000 -0.979800 0.113900
+vn -0.180400 -0.373300 -0.910000
+vn -0.239400 -0.363500 -0.900300
+vn -0.096900 -0.958300 0.268600
+vn -0.064900 -0.962100 0.264900
+vn -0.089200 -0.946100 0.311200
+vn -0.059700 -0.949600 0.307800
+vn -0.128700 -0.953100 0.273900
+vn -0.118400 -0.941300 0.316000
+vn -0.032600 -0.964300 0.262600
+vn -0.030000 -0.951600 0.305700
+vn -0.242600 -0.961000 0.132700
+vn -0.203800 -0.971300 0.122400
+vn -0.293400 -0.900200 -0.321600
+vn -0.349200 -0.885400 -0.306800
+vn -0.297500 -0.351100 -0.887800
+vn -0.354000 -0.336100 -0.872700
+vn -0.403500 -0.868000 -0.289400
+vn -0.280300 -0.948900 0.144800
+vn -0.456200 -0.848000 -0.269500
+vn -0.316900 -0.935100 0.158700
+vn -0.409100 -0.318400 -0.855100
+vn -0.462600 -0.298200 -0.834900
+vn -0.219800 -0.928800 0.298100
+vn -0.190300 -0.938300 0.288600
+vn -0.202400 -0.919000 0.338400
+vn -0.175100 -0.927700 0.329700
+vn -0.248600 -0.918000 0.309000
+vn -0.228800 -0.909000 0.348400
+vn -0.159900 -0.946400 0.280600
+vn -0.147200 -0.935100 0.322200
+vn -0.385900 -0.902500 0.191200
+vn -0.352200 -0.919500 0.174200
+vn -0.507000 -0.825700 -0.247100
+vn -0.555500 -0.801200 -0.222600
+vn -0.514100 -0.275500 -0.812300
+vn -0.563200 -0.250600 -0.787300
+vn -0.601500 -0.774500 -0.195800
+vn -0.417900 -0.883900 0.209800
+vn -0.645200 -0.745500 -0.166900
+vn -0.448200 -0.863800 0.229900
+vn -0.609900 -0.223600 -0.760200
+vn -0.654200 -0.194200 -0.730900
+vn -0.327800 -0.877900 0.349100
+vn -0.302700 -0.892400 0.334500
+vn -0.301700 -0.872000 0.385300
+vn -0.278600 -0.885400 0.371900
+vn -0.351600 -0.862100 0.364800
+vn -0.323600 -0.857500 0.399800
+vn -0.276300 -0.905800 0.321200
+vn -0.254300 -0.897800 0.359600
+vn -0.502900 -0.819700 0.274000
+vn -0.476600 -0.842400 0.251400
+vn -0.686100 -0.714600 -0.136100
+vn -0.723900 -0.682100 -0.103500
+vn -0.695700 -0.162900 -0.699600
+vn -0.734000 -0.129900 -0.666600
+vn -0.758600 -0.647800 -0.069200
+vn -0.527000 -0.796000 0.297800
+vn -0.790200 -0.611900 -0.033300
+vn -0.549000 -0.771000 0.322800
+vn -0.769200 -0.095200 -0.631900
+vn -0.801200 -0.058700 -0.595400
+vn -0.413400 -0.808900 0.418100
+vn -0.394500 -0.827500 0.399500
+vn -0.380500 -0.808500 0.448800
+vn -0.363100 -0.825700 0.431700
+vn -0.430600 -0.789300 0.437700
+vn -0.396400 -0.790500 0.466800
+vn -0.373900 -0.845300 0.381700
+vn -0.344200 -0.842000 0.415300
+vn -0.585700 -0.718400 0.375300
+vn -0.568600 -0.745000 0.348700
+vn -0.818400 -0.574600 0.004000
+vn -0.843000 -0.536200 0.042400
+vn -0.829800 -0.020900 -0.557600
+vn -0.854800 0.018000 -0.518700
+vn -0.864000 -0.496800 0.081800
+vn -0.600200 -0.691000 0.402700
+vn -0.881400 -0.456300 0.122300
+vn -0.612300 -0.662900 0.430900
+vn -0.876000 0.058000 -0.478700
+vn -0.893600 0.099000 -0.437700
+vn -0.470800 -0.726600 0.500400
+vn -0.459400 -0.748000 0.478900
+vn -0.433400 -0.732700 0.524600
+vn -0.422900 -0.752500 0.504800
+vn -0.480300 -0.704500 0.522500
+vn -0.442100 -0.712400 0.544900
+vn -0.446000 -0.768900 0.458000
+vn -0.410500 -0.771800 0.485500
+vn -0.628500 -0.605400 0.488400
+vn -0.621700 -0.634300 0.459500
+vn -0.895000 -0.415100 0.163500
+vn -0.904700 -0.373500 0.205100
+vn -0.907400 0.140800 -0.395900
+vn -0.917300 0.182900 -0.353700
+vn -0.910500 -0.331600 0.247000
+vn -0.632600 -0.576200 0.517500
+vn -0.912500 -0.289300 0.289300
+vn -0.633900 -0.546900 0.546900
+vn -0.923200 0.225400 -0.311200
+vn -0.925200 0.268300 -0.268300
+vn -0.496100 -0.636500 0.590400
+vn -0.493000 -0.659400 0.567600
+vn -0.456700 -0.649900 0.607400
+vn -0.453800 -0.670900 0.586400
+vn -0.497200 -0.613500 0.613500
+vn -0.457700 -0.628700 0.628700
+vn -0.487700 -0.682000 0.544900
+vn -0.449000 -0.691800 0.565600
+vn -0.628500 -0.488400 0.605400
+vn -0.632500 -0.517500 0.576300
+vn -0.910500 -0.247000 0.331600
+vn -0.904700 -0.205100 0.373500
+vn -0.923200 0.311200 -0.225500
+vn -0.917300 0.353700 -0.183000
+vn -0.895000 -0.163500 0.415100
+vn -0.621800 -0.459500 0.634200
+vn -0.881400 -0.122300 0.456300
+vn -0.612300 -0.430900 0.662900
+vn -0.907400 0.395900 -0.140800
+vn -0.893600 0.437700 -0.099000
+vn -0.487700 -0.544900 0.682000
+vn -0.493000 -0.567600 0.659400
+vn -0.448900 -0.565600 0.691800
+vn -0.453800 -0.586400 0.670900
+vn -0.480300 -0.522500 0.704500
+vn -0.442100 -0.544900 0.712400
+vn -0.496200 -0.590400 0.636500
+vn -0.456700 -0.607400 0.649900
+vn -0.585700 -0.375300 0.718400
+vn -0.600200 -0.402700 0.691000
+vn -0.864000 -0.081800 0.496700
+vn -0.843000 -0.042400 0.536200
+vn -0.876000 0.478700 -0.058000
+vn -0.854800 0.518700 -0.018000
+vn -0.818400 -0.004000 0.574600
+vn -0.568600 -0.348600 0.745000
+vn -0.829800 0.557600 0.020900
+vn -0.446000 -0.458000 0.768900
+vn -0.459400 -0.478900 0.748000
+vn -0.410500 -0.485500 0.771800
+vn -0.422900 -0.504800 0.752500
+vn -0.470800 -0.500400 0.726600
+vn -0.433400 -0.524600 0.732700
+vn 0.247700 0.417600 -0.874200
+vn 0.268300 0.429500 -0.862300
+vn 0.227100 0.480700 -0.847000
+vn 0.209700 0.470600 -0.857100
+vn 0.287700 0.442400 -0.849400
+vn 0.243600 0.491600 -0.836100
+vn 0.191400 0.461300 -0.866300
+vn 0.226100 0.406700 -0.885100
+vn 0.172200 0.452900 -0.874800
+vn 0.203500 0.396700 -0.895100
+vn 0.310600 0.257800 -0.914900
+vn 0.340300 0.272800 -0.899900
+vn 0.279400 0.244100 -0.928600
+vn 0.368400 0.289200 -0.883500
+vn 0.395200 0.306900 -0.865800
+vn 0.322800 0.470700 -0.821100
+vn 0.338300 0.486000 -0.805800
+vn 0.286400 0.528500 -0.799200
+vn 0.273300 0.515500 -0.812100
+vn 0.352400 0.502000 -0.789800
+vn 0.298300 0.542000 -0.785600
+vn 0.259000 0.503200 -0.824400
+vn 0.306000 0.456200 -0.835600
+vn 0.420200 0.325800 -0.846900
+vn 0.443400 0.345700 -0.826900
+vn 0.464700 0.366700 -0.806000
+vn 0.484000 0.388700 -0.783900
+vn 0.376000 0.535800 -0.756000
+vn 0.385300 0.553400 -0.738400
+vn 0.326200 0.585500 -0.742100
+vn 0.318200 0.570600 -0.757000
+vn 0.393100 0.571400 -0.720400
+vn 0.332700 0.600800 -0.726900
+vn 0.309000 0.556100 -0.771500
+vn 0.365000 0.518700 -0.773100
+vn 0.501300 0.411600 -0.761100
+vn 0.516400 0.435100 -0.737600
+vn 0.529200 0.459200 -0.713400
+vn 0.539800 0.484100 -0.688600
+vn 0.403500 0.608300 -0.683500
+vn 0.406000 0.627000 -0.664800
+vn 0.343700 0.647800 -0.679800
+vn 0.341500 0.632000 -0.695600
+vn 0.406900 0.645900 -0.645900
+vn 0.344500 0.663800 -0.663800
+vn 0.337900 0.616300 -0.711300
+vn 0.399100 0.589800 -0.702000
+vn 0.548200 0.509300 -0.663400
+vn 0.554100 0.534700 -0.637900
+vn 0.557700 0.560400 -0.612200
+vn 0.558900 0.586400 -0.586400
+vn 0.403500 0.683500 -0.608300
+vn 0.399100 0.702000 -0.589800
+vn 0.337900 0.711300 -0.616300
+vn 0.341500 0.695600 -0.632000
+vn 0.393000 0.720400 -0.571400
+vn 0.332700 0.726900 -0.600800
+vn 0.343700 0.679800 -0.647800
+vn 0.406000 0.664800 -0.627000
+vn 0.557700 0.612200 -0.560400
+vn 0.554100 0.637900 -0.534700
+vn 0.548200 0.663400 -0.509300
+vn 0.539800 0.688600 -0.484100
+vn 0.376000 0.756000 -0.535800
+vn 0.365000 0.773100 -0.518700
+vn 0.309000 0.771500 -0.556100
+vn 0.318200 0.757000 -0.570600
+vn 0.352400 0.789800 -0.502000
+vn 0.298300 0.785600 -0.542000
+vn 0.326200 0.742100 -0.585500
+vn 0.385300 0.738400 -0.553400
+vn 0.529200 0.713400 -0.459200
+vn 0.516400 0.737600 -0.435100
+vn 0.501300 0.761100 -0.411600
+vn 0.484000 0.783900 -0.388700
+vn 0.322900 0.821100 -0.470700
+vn 0.306000 0.835600 -0.456200
+vn 0.259000 0.824400 -0.503200
+vn 0.273300 0.812100 -0.515500
+vn 0.287700 0.849400 -0.442400
+vn 0.243600 0.836100 -0.491600
+vn 0.286400 0.799200 -0.528500
+vn 0.338300 0.805800 -0.486000
+vn 0.464700 0.805900 -0.366700
+vn 0.443400 0.826900 -0.345700
+vn 0.420300 0.846900 -0.325800
+vn 0.395200 0.865800 -0.306900
+vn 0.247700 0.874200 -0.417600
+vn 0.226100 0.885100 -0.406700
+vn 0.191400 0.866300 -0.461300
+vn 0.209700 0.857100 -0.470600
+vn 0.203500 0.895100 -0.396700
+vn 0.172200 0.874800 -0.452900
+vn 0.227100 0.846900 -0.480700
+vn 0.268300 0.862300 -0.429500
+vn 0.368400 0.883500 -0.289100
+vn 0.340200 0.899900 -0.272800
+vn 0.310600 0.914900 -0.257700
+vn 0.279400 0.928600 -0.244100
+vn 0.155700 0.911700 -0.380000
+vn 0.130900 0.918400 -0.373400
+vn 0.110800 0.894500 -0.433100
+vn 0.131800 0.888900 -0.438800
+vn 0.105300 0.923900 -0.367900
+vn 0.089100 0.899100 -0.428500
+vn 0.152300 0.882300 -0.445300
+vn 0.179900 0.904000 -0.387800
+vn 0.247100 0.940800 -0.231800
+vn 0.213900 0.951500 -0.221200
+vn 0.179700 0.960600 -0.212100
+vn 0.144600 0.968100 -0.204600
+vn 0.053100 0.931200 -0.360600
+vn 0.026700 0.933000 -0.358700
+vn 0.022600 0.906900 -0.420800
+vn 0.045000 0.905300 -0.422300
+vn 0.000000 0.933700 -0.358100
+vn 0.000000 0.907400 -0.420200
+vn 0.067100 0.902700 -0.424900
+vn 0.079300 0.928100 -0.363700
+vn 0.109000 0.974000 -0.198700
+vn 0.072900 0.978200 -0.194500
+vn 0.036600 0.980700 -0.191900
+vn 0.000000 0.981500 -0.191100
+vn -0.053100 0.931200 -0.360600
+vn -0.079300 0.928100 -0.363700
+vn -0.067100 0.902700 -0.424900
+vn -0.045000 0.905300 -0.422300
+vn -0.105300 0.923800 -0.368000
+vn -0.089100 0.899100 -0.428500
+vn -0.022600 0.906900 -0.420800
+vn -0.026700 0.933000 -0.358700
+vn -0.036600 0.980700 -0.192000
+vn -0.072900 0.978200 -0.194500
+vn -0.109000 0.974000 -0.198700
+vn -0.144600 0.968100 -0.204600
+vn -0.155700 0.911700 -0.380000
+vn -0.179900 0.904000 -0.387800
+vn -0.152300 0.882300 -0.445300
+vn -0.131800 0.888900 -0.438800
+vn -0.203500 0.895100 -0.396700
+vn -0.172200 0.874800 -0.452900
+vn -0.110800 0.894500 -0.433100
+vn -0.130900 0.918400 -0.373400
+vn -0.179700 0.960500 -0.212100
+vn -0.213900 0.951500 -0.221200
+vn -0.247100 0.940800 -0.231800
+vn -0.279400 0.928600 -0.244100
+vn -0.247700 0.874200 -0.417600
+vn -0.268300 0.862300 -0.429500
+vn -0.227100 0.847000 -0.480700
+vn -0.209700 0.857100 -0.470600
+vn -0.287700 0.849400 -0.442400
+vn -0.243600 0.836100 -0.491600
+vn -0.191400 0.866300 -0.461300
+vn -0.226100 0.885100 -0.406700
+vn -0.310600 0.914900 -0.257700
+vn -0.340300 0.899900 -0.272800
+vn -0.368400 0.883500 -0.289200
+vn -0.395200 0.865800 -0.306900
+vn -0.322800 0.821100 -0.470700
+vn -0.338300 0.805800 -0.486000
+vn -0.286400 0.799200 -0.528500
+vn -0.273300 0.812100 -0.515500
+vn -0.352400 0.789800 -0.502000
+vn -0.298300 0.785600 -0.542000
+vn -0.259000 0.824400 -0.503200
+vn -0.306000 0.835600 -0.456200
+vn -0.420300 0.846900 -0.325800
+vn -0.443400 0.826900 -0.345700
+vn -0.464700 0.806000 -0.366700
+vn -0.484000 0.783900 -0.388700
+vn -0.376000 0.756000 -0.535800
+vn -0.385300 0.738400 -0.553400
+vn -0.326200 0.742100 -0.585500
+vn -0.318200 0.757000 -0.570600
+vn -0.393000 0.720400 -0.571400
+vn -0.332700 0.726900 -0.600800
+vn -0.309000 0.771500 -0.556100
+vn -0.365000 0.773100 -0.518700
+vn -0.501300 0.761100 -0.411600
+vn -0.516400 0.737600 -0.435100
+vn -0.529200 0.713400 -0.459200
+vn -0.539800 0.688600 -0.484100
+vn -0.403500 0.683500 -0.608300
+vn -0.406000 0.664800 -0.627000
+vn -0.343700 0.679800 -0.647800
+vn -0.341500 0.695600 -0.632000
+vn -0.406900 0.645900 -0.645900
+vn -0.344500 0.663800 -0.663800
+vn -0.337900 0.711300 -0.616300
+vn -0.399100 0.702000 -0.589800
+vn -0.548200 0.663400 -0.509300
+vn -0.554100 0.637900 -0.534700
+vn -0.557700 0.612200 -0.560400
+vn -0.558900 0.586300 -0.586400
+vn -0.403500 0.608300 -0.683500
+vn -0.399100 0.589800 -0.702000
+vn -0.337900 0.616300 -0.711300
+vn -0.341500 0.632000 -0.695600
+vn -0.393000 0.571400 -0.720400
+vn -0.332700 0.600800 -0.726900
+vn -0.343700 0.647800 -0.679800
+vn -0.406000 0.627000 -0.664800
+vn -0.557700 0.560400 -0.612200
+vn -0.554200 0.534700 -0.637900
+vn -0.548200 0.509300 -0.663400
+vn -0.539800 0.484100 -0.688600
+vn -0.376000 0.535800 -0.756000
+vn -0.365000 0.518700 -0.773100
+vn -0.309000 0.556100 -0.771500
+vn -0.318200 0.570600 -0.757000
+vn -0.352400 0.502000 -0.789800
+vn -0.298300 0.542000 -0.785600
+vn -0.326200 0.585500 -0.742100
+vn -0.385300 0.553400 -0.738400
+vn -0.529200 0.459200 -0.713400
+vn -0.516400 0.435100 -0.737600
+vn -0.501300 0.411600 -0.761100
+vn -0.484000 0.388700 -0.784000
+vn -0.322800 0.470700 -0.821100
+vn -0.306000 0.456200 -0.835600
+vn -0.259000 0.503200 -0.824400
+vn -0.273300 0.515500 -0.812100
+vn -0.287700 0.442400 -0.849400
+vn -0.243600 0.491600 -0.836100
+vn -0.286400 0.528500 -0.799200
+vn -0.338300 0.486000 -0.805800
+vn -0.464700 0.366700 -0.806000
+vn -0.443400 0.345700 -0.826900
+vn -0.420300 0.325800 -0.846900
+vn -0.395200 0.306900 -0.865800
+vn -0.247700 0.417600 -0.874200
+vn -0.226100 0.406700 -0.885100
+vn -0.191400 0.461300 -0.866300
+vn -0.209700 0.470600 -0.857100
+vn -0.203500 0.396700 -0.895100
+vn -0.172200 0.452900 -0.874800
+vn -0.227100 0.480700 -0.847000
+vn -0.268300 0.429500 -0.862300
+vn -0.368400 0.289200 -0.883500
+vn -0.340300 0.272800 -0.899900
+vn -0.310600 0.257800 -0.914900
+vn -0.279400 0.244100 -0.928600
+vn -0.155700 0.380000 -0.911700
+vn -0.130800 0.373400 -0.918400
+vn -0.110800 0.433200 -0.894500
+vn -0.131800 0.438800 -0.888900
+vn -0.105300 0.368000 -0.923800
+vn -0.089100 0.428500 -0.899100
+vn -0.152300 0.445300 -0.882300
+vn -0.179900 0.387800 -0.904000
+vn -0.247100 0.231800 -0.940800
+vn -0.213900 0.221200 -0.951500
+vn -0.179700 0.212100 -0.960600
+vn -0.144600 0.204600 -0.968100
+vn -0.053100 0.360600 -0.931200
+vn -0.026700 0.358700 -0.933000
+vn -0.022600 0.420800 -0.906900
+vn -0.045000 0.422300 -0.905300
+vn 0.000000 0.358100 -0.933700
+vn 0.000000 0.420200 -0.907400
+vn -0.067100 0.424900 -0.902700
+vn -0.079300 0.363700 -0.928100
+vn -0.109000 0.198700 -0.974000
+vn -0.072900 0.194500 -0.978200
+vn -0.036600 0.192000 -0.980700
+vn 0.000000 0.191100 -0.981500
+vn 0.053100 0.360600 -0.931200
+vn 0.079300 0.363700 -0.928100
+vn 0.067100 0.424900 -0.902700
+vn 0.045000 0.422300 -0.905300
+vn 0.105300 0.368000 -0.923800
+vn 0.089100 0.428500 -0.899100
+vn 0.022600 0.420800 -0.906900
+vn 0.026700 0.358700 -0.933000
+vn 0.036600 0.192000 -0.980700
+vn 0.072900 0.194500 -0.978200
+vn 0.109000 0.198700 -0.974000
+vn 0.144600 0.204600 -0.968100
+vn 0.155700 0.380000 -0.911700
+vn 0.179900 0.387800 -0.904000
+vn 0.152300 0.445300 -0.882300
+vn 0.131800 0.438800 -0.888900
+vn 0.110800 0.433100 -0.894500
+vn 0.130800 0.373400 -0.918400
+vn 0.179700 0.212100 -0.960600
+vn 0.213900 0.221200 -0.951500
+vn 0.247100 0.231800 -0.940800
+vn 0.603400 -0.462100 -0.649900
+vn 0.653400 -0.433000 -0.620900
+vn 0.538200 -0.842400 -0.025700
+vn 0.497000 -0.866300 -0.049500
+vn 0.700800 -0.401600 -0.589500
+vn 0.577300 -0.816600 0.000200
+vn 0.453600 -0.888300 -0.071500
+vn 0.550700 -0.488700 -0.676600
+vn 0.408200 -0.908300 -0.091600
+vn 0.495600 -0.513000 -0.700900
+vn 0.494200 -0.199500 -0.846100
+vn 0.541400 -0.175600 -0.822200
+vn 0.444700 -0.221300 -0.867900
+vn 0.586300 -0.149500 -0.796200
+vn 0.628800 -0.121300 -0.768000
+vn 0.786300 -0.332700 -0.520600
+vn 0.824000 -0.295500 -0.483400
+vn 0.678700 -0.729100 0.087600
+vn 0.647600 -0.759800 0.057000
+vn 0.858300 -0.256500 -0.444300
+vn 0.707000 -0.697000 0.119700
+vn 0.613800 -0.788900 0.027800
+vn 0.745300 -0.368100 -0.555900
+vn 0.668700 -0.091200 -0.737900
+vn 0.705600 -0.059500 -0.706100
+vn 0.739400 -0.026100 -0.672700
+vn 0.770200 0.008900 -0.637700
+vn 0.915700 -0.174200 -0.362100
+vn 0.938500 -0.131400 -0.319300
+vn 0.773000 -0.594000 0.222700
+vn 0.754200 -0.629300 0.187500
+vn 0.957300 -0.087400 -0.275300
+vn 0.788500 -0.557800 0.258900
+vn 0.732200 -0.663600 0.153100
+vn 0.889000 -0.215900 -0.403800
+vn 0.797700 0.045300 -0.601400
+vn 0.821600 0.082600 -0.564000
+vn 0.842100 0.121100 -0.525500
+vn 0.859000 0.160600 -0.486100
+vn 0.982600 0.002400 -0.185400
+vn 0.989000 0.048000 -0.139900
+vn 0.814600 -0.446200 0.370500
+vn 0.809400 -0.483700 0.333000
+vn 0.991100 0.093900 -0.093900
+vn 0.816400 -0.408300 0.408300
+vn 0.800700 -0.520900 0.295800
+vn 0.972100 -0.042700 -0.230600
+vn 0.872200 0.200700 -0.445900
+vn 0.881700 0.241200 -0.405400
+vn 0.887400 0.282100 -0.364500
+vn 0.889300 0.323300 -0.323300
+vn 0.982600 0.185400 -0.002400
+vn 0.972100 0.230600 0.042700
+vn 0.800700 -0.295800 0.520900
+vn 0.809400 -0.333000 0.483700
+vn 0.957300 0.275300 0.087400
+vn 0.788500 -0.258900 0.557800
+vn 0.814600 -0.370600 0.446200
+vn 0.989000 0.139900 -0.048000
+vn 0.887400 0.364500 -0.282100
+vn 0.881700 0.405400 -0.241200
+vn 0.872200 0.445900 -0.200700
+vn 0.859000 0.486100 -0.160600
+vn 0.915700 0.362100 0.174200
+vn 0.889000 0.403800 0.215900
+vn 0.732200 -0.153100 0.663600
+vn 0.754200 -0.187500 0.629300
+vn 0.858300 0.444300 0.256500
+vn 0.707000 -0.119800 0.697000
+vn 0.773000 -0.222800 0.594000
+vn 0.938500 0.319300 0.131400
+vn 0.842100 0.525500 -0.121100
+vn 0.821600 0.564000 -0.082700
+vn 0.797700 0.601400 -0.045300
+vn 0.770200 0.637700 -0.008900
+vn 0.786300 0.520600 0.332700
+vn 0.745300 0.555900 0.368100
+vn 0.613800 -0.027800 0.788900
+vn 0.647600 -0.057000 0.759800
+vn 0.700800 0.589500 0.401600
+vn 0.577300 -0.000200 0.816600
+vn 0.678700 -0.087600 0.729100
+vn 0.824000 0.483400 0.295500
+vn 0.739400 0.672700 0.026100
+vn 0.705600 0.706100 0.059500
+vn 0.668700 0.737900 0.091200
+vn 0.628800 0.768000 0.121300
+vn 0.603400 0.649900 0.462100
+vn 0.550700 0.676600 0.488700
+vn 0.453600 0.071500 0.888300
+vn 0.496900 0.049500 0.866400
+vn 0.495600 0.700900 0.513000
+vn 0.408200 0.091600 0.908300
+vn 0.538100 0.025600 0.842400
+vn 0.653400 0.620900 0.433000
+vn 0.586300 0.796200 0.149500
+vn 0.541400 0.822200 0.175500
+vn 0.494200 0.846100 0.199500
+vn 0.444700 0.867900 0.221300
+vn 0.379300 0.741400 0.553500
+vn 0.318700 0.757600 0.569600
+vn 0.262500 0.138200 0.955000
+vn 0.312400 0.124900 0.941700
+vn 0.256500 0.770900 0.583000
+vn 0.211300 0.149200 0.965900
+vn 0.360900 0.109400 0.926100
+vn 0.438200 0.722500 0.534600
+vn 0.393200 0.887400 0.240700
+vn 0.340300 0.904300 0.257600
+vn 0.286000 0.918800 0.272100
+vn 0.230200 0.930800 0.284100
+vn 0.129400 0.788800 0.600900
+vn 0.064900 0.793200 0.605400
+vn 0.053500 0.167600 0.984400
+vn 0.106500 0.163900 0.980700
+vn 0.000000 0.794800 0.606900
+vn 0.000000 0.168800 0.985600
+vn 0.159200 0.157800 0.974500
+vn 0.193200 0.781300 0.593400
+vn 0.173400 0.940100 0.293500
+vn 0.116100 0.946800 0.300100
+vn 0.058300 0.950800 0.304100
+vn 0.000000 0.952200 0.305500
+vn -0.129400 0.788800 0.600800
+vn -0.193200 0.781300 0.593400
+vn -0.159200 0.157800 0.974500
+vn -0.106500 0.163900 0.980700
+vn -0.256500 0.770900 0.583000
+vn -0.211300 0.149200 0.965900
+vn -0.053500 0.167600 0.984400
+vn -0.064900 0.793300 0.605400
+vn -0.058300 0.950800 0.304100
+vn -0.116100 0.946800 0.300100
+vn -0.173400 0.940100 0.293400
+vn -0.230200 0.930700 0.284100
+vn -0.379300 0.741400 0.553500
+vn -0.438200 0.722600 0.534600
+vn -0.360900 0.109400 0.926100
+vn -0.312400 0.124900 0.941700
+vn -0.495600 0.700900 0.513000
+vn -0.408200 0.091600 0.908300
+vn -0.262500 0.138200 0.955000
+vn -0.318700 0.757500 0.569700
+vn -0.286000 0.918800 0.272100
+vn -0.340300 0.904300 0.257700
+vn -0.393200 0.887400 0.240700
+vn -0.444700 0.867900 0.221300
+vn -0.603400 0.650000 0.462100
+vn -0.653400 0.620900 0.433000
+vn -0.538200 0.025600 0.842400
+vn -0.496900 0.049600 0.866300
+vn -0.700800 0.589500 0.401600
+vn -0.577300 -0.000200 0.816600
+vn -0.453600 0.071500 0.888300
+vn -0.550700 0.676600 0.488700
+vn -0.494200 0.846100 0.199500
+vn -0.541400 0.822200 0.175600
+vn -0.586300 0.796200 0.149500
+vn -0.628800 0.768000 0.121300
+vn -0.786300 0.520600 0.332700
+vn -0.824000 0.483400 0.295500
+vn -0.678700 -0.087600 0.729100
+vn -0.647600 -0.057000 0.759800
+vn -0.858300 0.444300 0.256500
+vn -0.707000 -0.119700 0.697000
+vn -0.613800 -0.027800 0.788900
+vn -0.745300 0.555900 0.368100
+vn -0.668700 0.737900 0.091200
+vn -0.705600 0.706100 0.059500
+vn -0.739400 0.672700 0.026100
+vn -0.770200 0.637700 -0.008900
+vn -0.915700 0.362100 0.174200
+vn -0.938500 0.319300 0.131400
+vn -0.773000 -0.222700 0.594000
+vn -0.754200 -0.187400 0.629300
+vn -0.957300 0.275300 0.087400
+vn -0.788500 -0.258900 0.557800
+vn -0.732200 -0.153100 0.663600
+vn -0.889000 0.403800 0.215900
+vn -0.797700 0.601400 -0.045300
+vn -0.821600 0.564000 -0.082600
+vn -0.842100 0.525500 -0.121100
+vn -0.859000 0.486100 -0.160600
+vn -0.982600 0.185400 -0.002400
+vn -0.989000 0.139800 -0.048000
+vn -0.814600 -0.370600 0.446200
+vn -0.809400 -0.333000 0.483700
+vn -0.991100 0.093900 -0.093900
+vn -0.816400 -0.408400 0.408400
+vn -0.800700 -0.295800 0.520900
+vn -0.972100 0.230600 0.042700
+vn -0.872200 0.445900 -0.200700
+vn -0.881700 0.405400 -0.241200
+vn -0.887400 0.364500 -0.282100
+vn -0.889300 0.323300 -0.323300
+vn -0.982600 0.002400 -0.185400
+vn -0.972100 -0.042700 -0.230500
+vn -0.800700 -0.520900 0.295800
+vn -0.809400 -0.483700 0.333000
+vn -0.957300 -0.087400 -0.275300
+vn -0.788500 -0.557800 0.258900
+vn -0.814600 -0.446200 0.370600
+vn -0.989000 0.048000 -0.139900
+vn -0.887400 0.282100 -0.364500
+vn -0.881700 0.241200 -0.405400
+vn -0.872200 0.200700 -0.445900
+vn -0.859000 0.160600 -0.486100
+vn -0.915700 -0.174200 -0.362100
+vn -0.889000 -0.215900 -0.403800
+vn -0.732200 -0.663600 0.153100
+vn -0.754200 -0.629300 0.187500
+vn -0.858300 -0.256500 -0.444300
+vn -0.707000 -0.697000 0.119700
+vn -0.773000 -0.594000 0.222800
+vn -0.938500 -0.131400 -0.319300
+vn -0.842100 0.121100 -0.525500
+vn -0.821600 0.082600 -0.564000
+vn -0.797700 0.045300 -0.601400
+vn -0.770200 0.008900 -0.637700
+vn -0.786300 -0.332700 -0.520600
+vn -0.745300 -0.368100 -0.555900
+vn -0.613800 -0.788900 0.027900
+vn -0.647600 -0.759800 0.057000
+vn -0.700800 -0.401600 -0.589500
+vn -0.577200 -0.816600 0.000200
+vn -0.678700 -0.729100 0.087600
+vn -0.824000 -0.295500 -0.483400
+vn -0.739400 -0.026100 -0.672700
+vn -0.705500 -0.059500 -0.706100
+vn -0.668700 -0.091200 -0.737900
+vn -0.628800 -0.121300 -0.768000
+vn -0.603400 -0.462100 -0.650000
+vn -0.550800 -0.488700 -0.676600
+vn -0.453600 -0.888300 -0.071500
+vn -0.497000 -0.866300 -0.049600
+vn -0.495600 -0.513000 -0.700900
+vn -0.408200 -0.908300 -0.091500
+vn -0.538200 -0.842400 -0.025700
+vn -0.653400 -0.433000 -0.620900
+vn -0.586300 -0.149500 -0.796200
+vn -0.541400 -0.175600 -0.822200
+vn -0.494200 -0.199500 -0.846100
+vn -0.444700 -0.221300 -0.867900
+vn -0.379300 -0.553500 -0.741400
+vn -0.318700 -0.569700 -0.757500
+vn -0.262500 -0.955000 -0.138200
+vn -0.312400 -0.941700 -0.124900
+vn -0.256500 -0.583000 -0.770900
+vn -0.211300 -0.965900 -0.149200
+vn -0.360900 -0.926100 -0.109300
+vn -0.438200 -0.534700 -0.722500
+vn -0.393200 -0.240700 -0.887400
+vn -0.340300 -0.257600 -0.904300
+vn -0.286000 -0.272100 -0.918800
+vn -0.230200 -0.284100 -0.930800
+vn -0.129400 -0.600900 -0.788800
+vn -0.064900 -0.605400 -0.793200
+vn -0.053500 -0.984400 -0.167600
+vn -0.106500 -0.980700 -0.163900
+vn 0.000000 -0.606900 -0.794800
+vn 0.000000 -0.985600 -0.168900
+vn -0.159100 -0.974500 -0.157800
+vn -0.193200 -0.593400 -0.781300
+vn -0.173400 -0.293500 -0.940100
+vn -0.116100 -0.300100 -0.946800
+vn -0.058300 -0.304200 -0.950800
+vn 0.000000 -0.305500 -0.952200
+vn 0.129400 -0.600900 -0.788800
+vn 0.193200 -0.593400 -0.781300
+vn 0.159100 -0.974500 -0.157800
+vn 0.106500 -0.980700 -0.163900
+vn 0.256500 -0.583000 -0.770900
+vn 0.211300 -0.965900 -0.149200
+vn 0.053500 -0.984400 -0.167600
+vn 0.064900 -0.605400 -0.793300
+vn 0.058300 -0.304200 -0.950800
+vn 0.116100 -0.300100 -0.946800
+vn 0.173400 -0.293400 -0.940100
+vn 0.230200 -0.284100 -0.930800
+vn 0.379300 -0.553500 -0.741400
+vn 0.438200 -0.534700 -0.722500
+vn 0.360900 -0.926100 -0.109400
+vn 0.312400 -0.941700 -0.124900
+vn 0.262500 -0.955000 -0.138200
+vn 0.318700 -0.569700 -0.757500
+vn 0.286000 -0.272100 -0.918800
+vn 0.340300 -0.257600 -0.904300
+vn 0.393200 -0.240700 -0.887400
+vn -0.607300 0.483000 0.630800
+vn -0.554100 0.504700 0.662000
+vn -0.403500 -0.063500 0.912700
+vn -0.443900 -0.079000 0.892600
+vn -0.498300 0.524100 0.690600
+vn -0.361700 -0.049700 0.930900
+vn -0.482700 -0.096200 0.870500
+vn -0.657900 0.459200 0.596900
+vn -0.519900 -0.115200 0.846400
+vn -0.705900 0.433000 0.560500
+vn -0.562700 0.822600 0.081500
+vn -0.521200 0.846200 0.110700
+vn -0.601600 0.797100 0.050400
+vn -0.477200 0.867900 0.137900
+vn -0.430600 0.887700 0.162900
+vn -0.792500 0.374200 0.481500
+vn -0.750900 0.404600 0.521900
+vn -0.555200 -0.135900 0.820500
+vn -0.588200 -0.158200 0.793100
+vn -0.618900 -0.182300 0.764000
+vn -0.830700 0.341900 0.439400
+vn -0.647100 -0.208000 0.733500
+vn -0.865400 0.307400 0.395700
+vn -0.700800 0.711400 -0.051500
+vn -0.670800 0.741400 -0.016300
+vn -0.727900 0.680000 -0.088000
+vn -0.637800 0.770000 0.017600
+vn -0.923300 0.233100 0.305100
+vn -0.896400 0.271000 0.350700
+vn -0.672500 -0.235400 0.701700
+vn -0.694900 -0.264000 0.668900
+vn -0.714100 -0.294000 0.635200
+vn -0.946300 0.193500 0.258700
+vn -0.730200 -0.325500 0.600700
+vn -0.965400 0.152300 0.211700
+vn -0.790100 0.579000 -0.201000
+vn -0.772600 0.613600 -0.162800
+vn -0.804600 0.543300 -0.239600
+vn -0.751900 0.647300 -0.125100
+vn -0.990800 0.066000 0.117500
+vn -0.980300 0.109700 0.164500
+vn -0.742800 -0.358000 0.565700
+vn -0.751900 -0.391300 0.530600
+vn -0.757300 -0.425400 0.495400
+vn -0.997300 0.021300 0.070800
+vn -0.759200 -0.460200 0.460200
+vn -0.999400 -0.024400 0.024400
+vn -0.828600 0.432300 -0.355700
+vn -0.823800 0.469900 -0.317100
+vn -0.830200 0.394200 -0.394200
+vn -0.815800 0.506900 -0.278400
+vn -0.990800 -0.117500 -0.066000
+vn -0.997300 -0.070800 -0.021300
+vn -0.757300 -0.495400 0.425400
+vn -0.751900 -0.530600 0.391300
+vn -0.742800 -0.565700 0.358000
+vn -0.980300 -0.164500 -0.109700
+vn -0.730200 -0.600700 0.325500
+vn -0.965400 -0.211700 -0.152300
+vn -0.815800 0.278400 -0.506900
+vn -0.823800 0.317100 -0.469900
+vn -0.804600 0.239600 -0.543300
+vn -0.828600 0.355700 -0.432400
+vn -0.923300 -0.305100 -0.233100
+vn -0.946300 -0.258700 -0.193500
+vn -0.714100 -0.635200 0.294100
+vn -0.694900 -0.668900 0.264000
+vn -0.672500 -0.701700 0.235300
+vn -0.896400 -0.350700 -0.271000
+vn -0.647100 -0.733500 0.208000
+vn -0.865400 -0.395700 -0.307400
+vn -0.751900 0.125100 -0.647300
+vn -0.772600 0.162800 -0.613600
+vn -0.727900 0.088000 -0.680000
+vn -0.790100 0.201000 -0.579000
+vn -0.792500 -0.481500 -0.374300
+vn -0.830700 -0.439400 -0.341900
+vn -0.618900 -0.764000 0.182300
+vn -0.588200 -0.793100 0.158200
+vn -0.555200 -0.820500 0.135900
+vn -0.750900 -0.521900 -0.404600
+vn -0.519900 -0.846400 0.115200
+vn -0.705900 -0.560500 -0.433000
+vn -0.637800 -0.017700 -0.770000
+vn -0.670800 0.016300 -0.741400
+vn -0.601600 -0.050400 -0.797100
+vn -0.700800 0.051500 -0.711400
+vn -0.607300 -0.630800 -0.483000
+vn -0.657900 -0.596900 -0.459200
+vn -0.482700 -0.870500 0.096200
+vn -0.443900 -0.892600 0.079000
+vn -0.403500 -0.912700 0.063500
+vn -0.554100 -0.662000 -0.504700
+vn -0.361700 -0.930900 0.049700
+vn -0.498300 -0.690600 -0.524100
+vn -0.477200 -0.137900 -0.867900
+vn -0.521200 -0.110700 -0.846200
+vn -0.430600 -0.162900 -0.887700
+vn -0.562700 -0.081500 -0.822600
+vn -0.381000 -0.738600 -0.556100
+vn -0.440400 -0.716200 -0.541300
+vn -0.318800 -0.947100 0.037600
+vn -0.275000 -0.961000 0.027300
+vn -0.230400 -0.972900 0.018600
+vn -0.320000 -0.757800 -0.568600
+vn -0.185000 -0.982600 0.011400
+vn -0.257500 -0.773700 -0.578900
+vn -0.278900 -0.222600 -0.934100
+vn -0.331200 -0.205500 -0.920900
+vn -0.224800 -0.236900 -0.945100
+vn -0.381800 -0.185500 -0.905400
+vn -0.129800 -0.795000 -0.592500
+vn -0.193900 -0.786100 -0.586900
+vn -0.139100 -0.990200 0.005900
+vn -0.093000 -0.995600 0.002000
+vn -0.046700 -0.998900 -0.000300
+vn -0.065200 -0.800300 -0.595900
+vn 0.000000 -1.000000 -0.001100
+vn 0.000000 -0.802100 -0.597100
+vn -0.057100 -0.261100 -0.963600
+vn -0.113700 -0.256300 -0.959900
+vn 0.000000 -0.262800 -0.964800
+vn -0.169600 -0.248200 -0.953700
+vn 0.129800 -0.795000 -0.592500
+vn 0.065200 -0.800300 -0.595900
+vn 0.046700 -0.998900 -0.000300
+vn 0.093000 -0.995600 0.002000
+vn 0.139100 -0.990200 0.005900
+vn 0.193900 -0.786100 -0.586900
+vn 0.185000 -0.982600 0.011400
+vn 0.257500 -0.773700 -0.578900
+vn 0.169600 -0.248200 -0.953700
+vn 0.113700 -0.256300 -0.959900
+vn 0.224800 -0.236900 -0.945100
+vn 0.057100 -0.261100 -0.963600
+vn 0.381000 -0.738600 -0.556100
+vn 0.320000 -0.757800 -0.568600
+vn 0.230400 -0.972900 0.018600
+vn 0.275000 -0.961000 0.027300
+vn 0.318800 -0.947100 0.037600
+vn 0.440400 -0.716200 -0.541300
+vn 0.361700 -0.930900 0.049700
+vn 0.498300 -0.690600 -0.524100
+vn 0.381800 -0.185500 -0.905400
+vn 0.331200 -0.205500 -0.920900
+vn 0.430600 -0.162900 -0.887700
+vn 0.278900 -0.222600 -0.934100
+vn 0.607300 -0.630800 -0.483000
+vn 0.554100 -0.662000 -0.504700
+vn 0.403500 -0.912700 0.063500
+vn 0.443900 -0.892600 0.079000
+vn 0.482700 -0.870500 0.096200
+vn 0.657900 -0.596900 -0.459200
+vn 0.519900 -0.846400 0.115200
+vn 0.705900 -0.560500 -0.433000
+vn 0.562700 -0.081500 -0.822600
+vn 0.521200 -0.110700 -0.846200
+vn 0.601600 -0.050400 -0.797100
+vn 0.477200 -0.137900 -0.867900
+vn 0.792500 -0.481500 -0.374300
+vn 0.750900 -0.521900 -0.404600
+vn 0.555200 -0.820500 0.135900
+vn 0.588200 -0.793100 0.158200
+vn 0.618900 -0.764000 0.182300
+vn 0.830700 -0.439400 -0.341900
+vn 0.647100 -0.733500 0.208000
+vn 0.865400 -0.395700 -0.307400
+vn 0.700800 0.051500 -0.711400
+vn 0.670800 0.016300 -0.741400
+vn 0.727900 0.088000 -0.680000
+vn 0.637800 -0.017700 -0.770000
+vn 0.923300 -0.305100 -0.233100
+vn 0.896400 -0.350700 -0.271000
+vn 0.672500 -0.701700 0.235300
+vn 0.694900 -0.668900 0.264000
+vn 0.714100 -0.635200 0.294000
+vn 0.946300 -0.258700 -0.193500
+vn 0.730200 -0.600700 0.325500
+vn 0.965400 -0.211700 -0.152300
+vn 0.790100 0.201000 -0.579000
+vn 0.772600 0.162800 -0.613600
+vn 0.804600 0.239600 -0.543300
+vn 0.751900 0.125100 -0.647300
+vn 0.990800 -0.117500 -0.066000
+vn 0.980300 -0.164500 -0.109700
+vn 0.742800 -0.565700 0.358000
+vn 0.751900 -0.530600 0.391300
+vn 0.757300 -0.495400 0.425400
+vn 0.997300 -0.070800 -0.021300
+vn 0.759200 -0.460200 0.460200
+vn 0.999400 -0.024400 0.024400
+vn 0.828600 0.355700 -0.432400
+vn 0.823800 0.317100 -0.469900
+vn 0.830200 0.394200 -0.394200
+vn 0.815800 0.278400 -0.506900
+vn 0.990800 0.066000 0.117500
+vn 0.997300 0.021300 0.070800
+vn 0.757300 -0.425400 0.495400
+vn 0.751900 -0.391300 0.530600
+vn 0.742800 -0.358000 0.565700
+vn 0.980300 0.109700 0.164500
+vn 0.730200 -0.325500 0.600700
+vn 0.965400 0.152300 0.211700
+vn 0.815800 0.506900 -0.278400
+vn 0.823800 0.469900 -0.317100
+vn 0.804600 0.543300 -0.239600
+vn 0.828600 0.432300 -0.355700
+vn 0.923300 0.233100 0.305100
+vn 0.946300 0.193500 0.258700
+vn 0.714100 -0.294000 0.635200
+vn 0.694900 -0.264000 0.668900
+vn 0.672500 -0.235400 0.701700
+vn 0.896400 0.271000 0.350700
+vn 0.647100 -0.208000 0.733500
+vn 0.865400 0.307400 0.395700
+vn 0.751900 0.647300 -0.125100
+vn 0.772600 0.613600 -0.162800
+vn 0.727900 0.680000 -0.088000
+vn 0.790100 0.579000 -0.201000
+vn 0.792500 0.374200 0.481500
+vn 0.830700 0.341900 0.439400
+vn 0.618900 -0.182300 0.764000
+vn 0.588200 -0.158200 0.793100
+vn 0.555200 -0.135900 0.820500
+vn 0.750900 0.404600 0.521900
+vn 0.519900 -0.115200 0.846400
+vn 0.705900 0.433000 0.560500
+vn 0.637800 0.770000 0.017700
+vn 0.670800 0.741400 -0.016300
+vn 0.601600 0.797100 0.050400
+vn 0.700800 0.711400 -0.051500
+vn 0.607300 0.483000 0.630800
+vn 0.657900 0.459200 0.596900
+vn 0.482700 -0.096200 0.870500
+vn 0.443900 -0.079000 0.892600
+vn 0.403500 -0.063500 0.912700
+vn 0.554100 0.504700 0.662000
+vn 0.361700 -0.049700 0.930900
+vn 0.498300 0.524100 0.690600
+vn 0.477200 0.867900 0.137900
+vn 0.521200 0.846200 0.110700
+vn 0.430600 0.887700 0.162900
+vn 0.562700 0.822600 0.081500
+vn 0.381000 0.556100 0.738600
+vn 0.440400 0.541300 0.716200
+vn 0.318800 -0.037600 0.947100
+vn 0.275000 -0.027300 0.961000
+vn 0.230400 -0.018500 0.972900
+vn 0.320000 0.568600 0.757800
+vn 0.185000 -0.011400 0.982600
+vn 0.257500 0.578900 0.773700
+vn 0.278900 0.934100 0.222600
+vn 0.331200 0.920900 0.205500
+vn 0.224800 0.945100 0.236900
+vn 0.381800 0.905400 0.185500
+vn 0.129800 0.592500 0.795000
+vn 0.193900 0.586900 0.786100
+vn 0.139100 -0.005900 0.990200
+vn 0.093000 -0.002000 0.995600
+vn 0.046700 0.000300 0.998900
+vn 0.065200 0.595900 0.800300
+vn 0.000000 0.001100 1.000000
+vn 0.000000 0.597100 0.802200
+vn 0.057100 0.963600 0.261100
+vn 0.113700 0.959900 0.256300
+vn 0.000000 0.964800 0.262800
+vn 0.169600 0.953700 0.248200
+vn -0.129800 0.592500 0.795000
+vn -0.065200 0.595900 0.800400
+vn -0.046700 0.000300 0.998900
+vn -0.093000 -0.002000 0.995600
+vn -0.139100 -0.005900 0.990200
+vn -0.193900 0.586900 0.786100
+vn -0.185000 -0.011400 0.982600
+vn -0.257500 0.578900 0.773700
+vn -0.169600 0.953700 0.248200
+vn -0.113700 0.959900 0.256300
+vn -0.224800 0.945100 0.236900
+vn -0.057100 0.963600 0.261100
+vn -0.381000 0.556100 0.738600
+vn -0.320000 0.568600 0.757800
+vn -0.230400 -0.018500 0.972900
+vn -0.275000 -0.027300 0.961000
+vn -0.318800 -0.037600 0.947100
+vn -0.440400 0.541300 0.716200
+vn -0.381800 0.905400 0.185600
+vn -0.331200 0.920900 0.205500
+vn -0.278900 0.934100 0.222600
+vn -0.085500 -0.711200 0.697700
+vn -0.085700 -0.708200 0.700800
+vn -0.106500 -0.707900 0.698200
+vn -0.106000 -0.712600 0.693500
+vn -0.085900 -0.704500 0.704500
+vn -0.106800 -0.703100 0.703100
+vn -0.105100 -0.717400 0.688700
+vn -0.085600 -0.714800 0.694000
+vn -0.103500 -0.722600 0.683400
+vn -0.084500 -0.720400 0.688400
+vn -0.071100 -0.713900 0.696600
+vn -0.070400 -0.711200 0.699400
+vn -0.063900 -0.715400 0.695700
+vn -0.064500 -0.712300 0.698800
+vn -0.071400 -0.718700 0.691600
+vn -0.063400 -0.717600 0.693600
+vn -0.070900 -0.708400 0.702200
+vn -0.071400 -0.705300 0.705300
+vn -0.065000 -0.708700 0.702500
+vn -0.065200 -0.705600 0.705600
+vn -0.078800 -0.728900 0.680000
+vn -0.081500 -0.725700 0.683200
+vn -0.101200 -0.727800 0.678300
+vn -0.098600 -0.732300 0.673800
+vn -0.095700 -0.736500 0.669600
+vn -0.076700 -0.731700 0.677300
+vn -0.092400 -0.740800 0.665300
+vn -0.074200 -0.734900 0.674100
+vn -0.063200 -0.728000 0.682700
+vn -0.065000 -0.725200 0.685400
+vn -0.057200 -0.726700 0.684500
+vn -0.060200 -0.722800 0.688400
+vn -0.061200 -0.730900 0.679800
+vn -0.054300 -0.729800 0.681400
+vn -0.067700 -0.722900 0.687600
+vn -0.062300 -0.719700 0.691500
+vn -0.067800 -0.741400 0.667500
+vn -0.071100 -0.738300 0.670700
+vn -0.088700 -0.745000 0.661100
+vn -0.084600 -0.749000 0.657100
+vn -0.080200 -0.752800 0.653300
+vn -0.064200 -0.744500 0.664500
+vn -0.075400 -0.756400 0.649700
+vn -0.060300 -0.747300 0.661700
+vn -0.052600 -0.738600 0.672100
+vn -0.055600 -0.736100 0.674500
+vn -0.045700 -0.736300 0.675100
+vn -0.048700 -0.734300 0.677100
+vn -0.049200 -0.740800 0.669800
+vn -0.042500 -0.738100 0.673300
+vn -0.058500 -0.733600 0.677100
+vn -0.051600 -0.732100 0.679200
+vn -0.051800 -0.752400 0.656600
+vn -0.056200 -0.750000 0.659000
+vn -0.070300 -0.759800 0.646400
+vn -0.064900 -0.762900 0.643200
+vn -0.059200 -0.765700 0.640400
+vn -0.047200 -0.754700 0.654300
+vn -0.053300 -0.768300 0.637800
+vn -0.042500 -0.756700 0.652300
+vn -0.038300 -0.746600 0.664100
+vn -0.042100 -0.744900 0.665800
+vn -0.032300 -0.742600 0.669000
+vn -0.035700 -0.741200 0.670200
+vn -0.034300 -0.748200 0.662500
+vn -0.028700 -0.743700 0.667800
+vn -0.045700 -0.743000 0.667700
+vn -0.039100 -0.739700 0.671700
+vn -0.032400 -0.760100 0.648900
+vn -0.037500 -0.758500 0.650500
+vn -0.047100 -0.770700 0.635500
+vn -0.040700 -0.772700 0.633500
+vn -0.034200 -0.774400 0.631700
+vn -0.027200 -0.761500 0.647600
+vn -0.027600 -0.775800 0.630300
+vn -0.021900 -0.762600 0.646500
+vn -0.021900 -0.751900 0.658900
+vn -0.026100 -0.750800 0.659900
+vn -0.018000 -0.746300 0.665300
+vn -0.021600 -0.745600 0.666000
+vn -0.017600 -0.752700 0.658100
+vn -0.014400 -0.746900 0.664800
+vn -0.030200 -0.749600 0.661100
+vn -0.025200 -0.744700 0.666900
+vn -0.011000 -0.764100 0.645000
+vn -0.016500 -0.763500 0.645600
+vn -0.020800 -0.776900 0.629200
+vn -0.013900 -0.777700 0.628400
+vn -0.007000 -0.778200 0.627900
+vn -0.005500 -0.764400 0.644600
+vn 0.000000 -0.778400 0.627800
+vn 0.000000 -0.764500 0.644500
+vn -0.004400 -0.754100 0.656700
+vn -0.008800 -0.753800 0.657000
+vn -0.003600 -0.747800 0.663900
+vn -0.007200 -0.747600 0.664100
+vn 0.000000 -0.754200 0.656600
+vn 0.000000 -0.747900 0.663800
+vn -0.013200 -0.753300 0.657500
+vn -0.010800 -0.747300 0.664400
+vn 0.011000 -0.764100 0.645000
+vn 0.005500 -0.764400 0.644600
+vn 0.007000 -0.778200 0.627900
+vn 0.013900 -0.777700 0.628400
+vn 0.020800 -0.776900 0.629200
+vn 0.016500 -0.763500 0.645600
+vn 0.027600 -0.775800 0.630300
+vn 0.021900 -0.762600 0.646500
+vn 0.013200 -0.753300 0.657500
+vn 0.008800 -0.753800 0.657000
+vn 0.010800 -0.747300 0.664400
+vn 0.007200 -0.747600 0.664100
+vn 0.017600 -0.752700 0.658100
+vn 0.014400 -0.746900 0.664800
+vn 0.004400 -0.754100 0.656700
+vn 0.003600 -0.747800 0.663900
+vn 0.032400 -0.760100 0.648900
+vn 0.027200 -0.761500 0.647600
+vn 0.034200 -0.774400 0.631700
+vn 0.040700 -0.772700 0.633500
+vn 0.047100 -0.770700 0.635500
+vn 0.037500 -0.758500 0.650500
+vn 0.053300 -0.768300 0.637800
+vn 0.042500 -0.756700 0.652300
+vn 0.030200 -0.749600 0.661100
+vn 0.026100 -0.750800 0.659900
+vn 0.025200 -0.744700 0.666900
+vn 0.021600 -0.745600 0.666000
+vn 0.034300 -0.748200 0.662500
+vn 0.028700 -0.743700 0.667800
+vn 0.021900 -0.751900 0.658900
+vn 0.018000 -0.746300 0.665300
+vn 0.051800 -0.752400 0.656600
+vn 0.047200 -0.754700 0.654300
+vn 0.059200 -0.765700 0.640400
+vn 0.064900 -0.762900 0.643200
+vn 0.070300 -0.759800 0.646400
+vn 0.056100 -0.750000 0.659000
+vn 0.075400 -0.756400 0.649700
+vn 0.060300 -0.747300 0.661700
+vn 0.045700 -0.743000 0.667700
+vn 0.042100 -0.744900 0.665800
+vn 0.039100 -0.739700 0.671700
+vn 0.035700 -0.741200 0.670200
+vn 0.049200 -0.740800 0.669900
+vn 0.042500 -0.738100 0.673300
+vn 0.038300 -0.746600 0.664100
+vn 0.032300 -0.742500 0.669000
+vn 0.067800 -0.741400 0.667500
+vn 0.064200 -0.744500 0.664500
+vn 0.080200 -0.752800 0.653300
+vn 0.084600 -0.749000 0.657100
+vn 0.088700 -0.745000 0.661100
+vn 0.071100 -0.738300 0.670700
+vn 0.092400 -0.740800 0.665300
+vn 0.074200 -0.734900 0.674100
+vn 0.058500 -0.733600 0.677100
+vn 0.055600 -0.736100 0.674500
+vn 0.051600 -0.732100 0.679200
+vn 0.048700 -0.734300 0.677100
+vn 0.061200 -0.730900 0.679800
+vn 0.054300 -0.729800 0.681400
+vn 0.052600 -0.738600 0.672100
+vn 0.045700 -0.736300 0.675100
+vn 0.078800 -0.728900 0.680000
+vn 0.076700 -0.731700 0.677300
+vn 0.095700 -0.736500 0.669600
+vn 0.098600 -0.732300 0.673800
+vn 0.101200 -0.727700 0.678300
+vn 0.081500 -0.725700 0.683200
+vn 0.103500 -0.722600 0.683400
+vn 0.084500 -0.720400 0.688400
+vn 0.067700 -0.722900 0.687600
+vn 0.065000 -0.725200 0.685400
+vn 0.062300 -0.719700 0.691500
+vn 0.060200 -0.722800 0.688400
+vn 0.071400 -0.718700 0.691600
+vn 0.063400 -0.717600 0.693600
+vn 0.063200 -0.728000 0.682700
+vn 0.057200 -0.726700 0.684500
+vn 0.085500 -0.711200 0.697700
+vn 0.085600 -0.714800 0.694000
+vn 0.105100 -0.717400 0.688700
+vn 0.106000 -0.712600 0.693500
+vn 0.106500 -0.707900 0.698200
+vn 0.085700 -0.708200 0.700800
+vn 0.106800 -0.703100 0.703100
+vn 0.085900 -0.704500 0.704500
+vn 0.070900 -0.708400 0.702200
+vn 0.070400 -0.711200 0.699400
+vn 0.065000 -0.708700 0.702500
+vn 0.064500 -0.712300 0.698800
+vn 0.071400 -0.705300 0.705300
+vn 0.071100 -0.713900 0.696600
+vn 0.063900 -0.715400 0.695700
+vn 0.085500 -0.697700 0.711200
+vn 0.085700 -0.700800 0.708200
+vn 0.106500 -0.698200 0.707900
+vn 0.106100 -0.693500 0.712600
+vn 0.105100 -0.688700 0.717400
+vn 0.085600 -0.694000 0.714800
+vn 0.103500 -0.683400 0.722600
+vn 0.084500 -0.688400 0.720400
+vn 0.071100 -0.696600 0.713900
+vn 0.070400 -0.699400 0.711200
+vn 0.071400 -0.691600 0.718700
+vn 0.070900 -0.702200 0.708400
+vn 0.078800 -0.680000 0.728900
+vn 0.081500 -0.683200 0.725700
+vn 0.101200 -0.678300 0.727700
+vn 0.098600 -0.673800 0.732300
+vn 0.095700 -0.669600 0.736500
+vn 0.076700 -0.677300 0.731700
+vn 0.092400 -0.665300 0.740800
+vn 0.074200 -0.674100 0.734900
+vn 0.063200 -0.682700 0.728000
+vn 0.065000 -0.685400 0.725200
+vn 0.061200 -0.679800 0.730900
+vn 0.067700 -0.687600 0.722900
+vn 0.067800 -0.667500 0.741400
+vn 0.071100 -0.670700 0.738300
+vn 0.088700 -0.661100 0.745000
+vn 0.084600 -0.657100 0.749000
+vn 0.080200 -0.653300 0.752800
+vn 0.064200 -0.664500 0.744500
+vn 0.075400 -0.649700 0.756400
+vn 0.060300 -0.661700 0.747300
+vn 0.052600 -0.672100 0.738600
+vn 0.055600 -0.674500 0.736100
+vn 0.045700 -0.675100 0.736300
+vn 0.048700 -0.677100 0.734300
+vn 0.049200 -0.669900 0.740800
+vn 0.042500 -0.673300 0.738100
+vn 0.058500 -0.677100 0.733600
+vn 0.051600 -0.679200 0.732100
+vn 0.051800 -0.656600 0.752400
+vn 0.056200 -0.659000 0.750000
+vn 0.070300 -0.646400 0.759800
+vn 0.064900 -0.643200 0.762900
+vn 0.059200 -0.640400 0.765700
+vn 0.047200 -0.654300 0.754700
+vn 0.053300 -0.637800 0.768300
+vn 0.042500 -0.652300 0.756700
+vn 0.038200 -0.664100 0.746700
+vn 0.042100 -0.665800 0.744900
+vn 0.032300 -0.669000 0.742600
+vn 0.035700 -0.670200 0.741200
+vn 0.034300 -0.662500 0.748200
+vn 0.028700 -0.667800 0.743700
+vn 0.045700 -0.667700 0.743000
+vn 0.039100 -0.671700 0.739700
+vn 0.032400 -0.648900 0.760100
+vn 0.037500 -0.650500 0.758500
+vn 0.047100 -0.635500 0.770700
+vn 0.040700 -0.633500 0.772700
+vn 0.034200 -0.631700 0.774400
+vn 0.027200 -0.647600 0.761500
+vn 0.027500 -0.630300 0.775800
+vn 0.021900 -0.646500 0.762600
+vn 0.021900 -0.658900 0.751900
+vn 0.026100 -0.659900 0.750800
+vn 0.018000 -0.665300 0.746300
+vn 0.021600 -0.666000 0.745600
+vn 0.017600 -0.658100 0.752700
+vn 0.014500 -0.664800 0.746900
+vn 0.030200 -0.661100 0.749600
+vn 0.025200 -0.666900 0.744700
+vn 0.011000 -0.645000 0.764100
+vn 0.016500 -0.645600 0.763500
+vn 0.020700 -0.629200 0.776900
+vn 0.013900 -0.628400 0.777700
+vn 0.007000 -0.627900 0.778200
+vn 0.005500 -0.644600 0.764400
+vn 0.000000 -0.627800 0.778400
+vn 0.000000 -0.644500 0.764500
+vn 0.004400 -0.656700 0.754100
+vn 0.008800 -0.657000 0.753800
+vn 0.003600 -0.663900 0.747800
+vn 0.007200 -0.664100 0.747600
+vn 0.000000 -0.656600 0.754200
+vn 0.000000 -0.663800 0.747900
+vn 0.013200 -0.657500 0.753300
+vn 0.010800 -0.664400 0.747300
+vn -0.011000 -0.645000 0.764100
+vn -0.005500 -0.644600 0.764400
+vn -0.007000 -0.627900 0.778200
+vn -0.013900 -0.628400 0.777700
+vn -0.020800 -0.629200 0.776900
+vn -0.016500 -0.645600 0.763500
+vn -0.027500 -0.630300 0.775800
+vn -0.021900 -0.646500 0.762600
+vn -0.013200 -0.657500 0.753300
+vn -0.008800 -0.657000 0.753800
+vn -0.010800 -0.664400 0.747300
+vn -0.007200 -0.664100 0.747600
+vn -0.017600 -0.658100 0.752700
+vn -0.014400 -0.664800 0.746900
+vn -0.004400 -0.656700 0.754100
+vn -0.003600 -0.663900 0.747800
+vn -0.032400 -0.648900 0.760100
+vn -0.027200 -0.647600 0.761500
+vn -0.034200 -0.631700 0.774400
+vn -0.040700 -0.633500 0.772700
+vn -0.047100 -0.635500 0.770700
+vn -0.037500 -0.650500 0.758500
+vn -0.053300 -0.637800 0.768300
+vn -0.042500 -0.652300 0.756700
+vn -0.030200 -0.661200 0.749600
+vn -0.026100 -0.659900 0.750800
+vn -0.025200 -0.666900 0.744700
+vn -0.021600 -0.666000 0.745600
+vn -0.034300 -0.662500 0.748200
+vn -0.028700 -0.667800 0.743700
+vn -0.021900 -0.658900 0.751900
+vn -0.018000 -0.665300 0.746300
+vn -0.051800 -0.656600 0.752400
+vn -0.047200 -0.654300 0.754700
+vn -0.059200 -0.640400 0.765700
+vn -0.064900 -0.643200 0.762900
+vn -0.070300 -0.646400 0.759800
+vn -0.056200 -0.659000 0.750000
+vn -0.075400 -0.649700 0.756400
+vn -0.060300 -0.661700 0.747300
+vn -0.045700 -0.667700 0.742900
+vn -0.042100 -0.665800 0.744900
+vn -0.039100 -0.671700 0.739700
+vn -0.035700 -0.670200 0.741200
+vn -0.049200 -0.669800 0.740800
+vn -0.042500 -0.673300 0.738100
+vn -0.038200 -0.664100 0.746700
+vn -0.032300 -0.669000 0.742600
+vn -0.067800 -0.667600 0.741400
+vn -0.064200 -0.664500 0.744500
+vn -0.080200 -0.653300 0.752800
+vn -0.084600 -0.657100 0.749000
+vn -0.088700 -0.661100 0.745000
+vn -0.071100 -0.670700 0.738300
+vn -0.092400 -0.665300 0.740800
+vn -0.074200 -0.674100 0.734900
+vn -0.058500 -0.677100 0.733600
+vn -0.055600 -0.674500 0.736100
+vn -0.051600 -0.679200 0.732100
+vn -0.048700 -0.677100 0.734200
+vn -0.061200 -0.679800 0.730900
+vn -0.054300 -0.681400 0.729800
+vn -0.052600 -0.672100 0.738600
+vn -0.045700 -0.675100 0.736300
+vn -0.078800 -0.680000 0.728900
+vn -0.076700 -0.677300 0.731700
+vn -0.095700 -0.669600 0.736500
+vn -0.098600 -0.673800 0.732300
+vn -0.101200 -0.678300 0.727700
+vn -0.081500 -0.683200 0.725700
+vn -0.103500 -0.683400 0.722600
+vn -0.084500 -0.688400 0.720400
+vn -0.067700 -0.687600 0.722900
+vn -0.065000 -0.685400 0.725200
+vn -0.062200 -0.691500 0.719700
+vn -0.060200 -0.688400 0.722800
+vn -0.071400 -0.691600 0.718700
+vn -0.063400 -0.693500 0.717600
+vn -0.063200 -0.682700 0.728000
+vn -0.057200 -0.684500 0.726700
+vn -0.085500 -0.697700 0.711200
+vn -0.085600 -0.694000 0.714800
+vn -0.105100 -0.688700 0.717400
+vn -0.106000 -0.693500 0.712600
+vn -0.106500 -0.698200 0.707900
+vn -0.085700 -0.700800 0.708200
+vn -0.070900 -0.702200 0.708400
+vn -0.070400 -0.699400 0.711200
+vn -0.065000 -0.702500 0.708700
+vn -0.064500 -0.698800 0.712300
+vn -0.071100 -0.696600 0.713900
+vn -0.063900 -0.695700 0.715400
+vn -0.003000 -0.681100 0.732200
+vn -0.005400 -0.670000 0.742300
+vn -0.008100 -0.670100 0.742200
+vn -0.004400 -0.681000 0.732300
+vn -0.010900 -0.670200 0.742000
+vn -0.005900 -0.680900 0.732400
+vn -0.001400 -0.681100 0.732200
+vn -0.002700 -0.669900 0.742400
+vn -0.000000 -0.681100 0.732100
+vn 0.000000 -0.669900 0.742400
+vn -0.009300 -0.680600 0.732600
+vn -0.016600 -0.670700 0.741500
+vn -0.019500 -0.671000 0.741100
+vn -0.011300 -0.680300 0.732800
+vn -0.023000 -0.671600 0.740500
+vn -0.007600 -0.680700 0.732500
+vn -0.013700 -0.670500 0.741800
+vn -0.029300 -0.672800 0.739200
+vn -0.032800 -0.673600 0.738300
+vn -0.036000 -0.674600 0.737300
+vn -0.026200 -0.672100 0.740000
+vn -0.042700 -0.677100 0.734600
+vn -0.046200 -0.678600 0.733000
+vn -0.049300 -0.680200 0.731300
+vn -0.039600 -0.675800 0.736000
+vn -0.059100 -0.694000 0.717500
+vn -0.063000 -0.697300 0.714000
+vn -0.063300 -0.702100 0.709200
+vn -0.058100 -0.700900 0.710800
+vn -0.063700 -0.705700 0.705600
+vn -0.058900 -0.705900 0.705900
+vn -0.028800 -0.697600 0.715900
+vn -0.043900 -0.686000 0.726200
+vn -0.027700 -0.706800 0.706800
+vn -0.054500 -0.684900 0.726600
+vn -0.059800 -0.690200 0.721100
+vn -0.062500 -0.693700 0.717600
+vn 0.002800 -0.681100 0.732200
+vn 0.005400 -0.670000 0.742300
+vn 0.002700 -0.669900 0.742400
+vn 0.001400 -0.681100 0.732100
+vn 0.004400 -0.681100 0.732200
+vn 0.008100 -0.670100 0.742200
+vn 0.005800 -0.680900 0.732300
+vn 0.010900 -0.670300 0.742000
+vn 0.009100 -0.680700 0.732500
+vn 0.016600 -0.670700 0.741500
+vn 0.013700 -0.670500 0.741800
+vn 0.007500 -0.680800 0.732400
+vn 0.011000 -0.680600 0.732600
+vn 0.019500 -0.671100 0.741100
+vn 0.013900 -0.680300 0.732700
+vn 0.023100 -0.671700 0.740400
+vn 0.029000 -0.672900 0.739100
+vn 0.025800 -0.672200 0.739900
+vn 0.032300 -0.673600 0.738300
+vn 0.035600 -0.674700 0.737200
+vn 0.042200 -0.677100 0.734600
+vn 0.039000 -0.675800 0.736000
+vn 0.045600 -0.678500 0.733100
+vn -0.059100 -0.717500 0.694000
+vn -0.063000 -0.714000 0.697300
+vn -0.062500 -0.717500 0.693700
+vn -0.059800 -0.721100 0.690200
+vn -0.054500 -0.726600 0.684900
+vn -0.043900 -0.726200 0.686000
+vn -0.049200 -0.731300 0.680200
+vn -0.028800 -0.715900 0.697600
+vn -0.058100 -0.710900 0.700900
+vn -0.063300 -0.709200 0.702100
+vn -0.042700 -0.734600 0.677100
+vn -0.046200 -0.733000 0.678600
+vn -0.039600 -0.736000 0.675800
+vn -0.036000 -0.737300 0.674600
+vn -0.029400 -0.739200 0.672800
+vn -0.032800 -0.738300 0.673600
+vn -0.026200 -0.740000 0.672100
+vn -0.023000 -0.740500 0.671600
+vn -0.009300 -0.732600 0.680600
+vn -0.011300 -0.732800 0.680300
+vn -0.019500 -0.741100 0.671000
+vn -0.016600 -0.741500 0.670700
+vn -0.013700 -0.741800 0.670500
+vn -0.007600 -0.732500 0.680700
+vn -0.010900 -0.742000 0.670200
+vn -0.006000 -0.732400 0.680900
+vn -0.002900 -0.732200 0.681100
+vn -0.004400 -0.732300 0.681000
+vn -0.008100 -0.742200 0.670100
+vn -0.005400 -0.742300 0.670000
+vn -0.002700 -0.742400 0.669900
+vn -0.001400 -0.732200 0.681100
+vn 0.000000 -0.742400 0.669900
+vn -0.000100 -0.732100 0.681100
+vn 0.002800 -0.732200 0.681100
+vn 0.001500 -0.732100 0.681100
+vn 0.002700 -0.742400 0.669900
+vn 0.005400 -0.742300 0.670000
+vn 0.008100 -0.742200 0.670100
+vn 0.004400 -0.732200 0.681000
+vn 0.010900 -0.742000 0.670200
+vn 0.005900 -0.732300 0.680900
+vn 0.009100 -0.732500 0.680700
+vn 0.007500 -0.732400 0.680800
+vn 0.013700 -0.741800 0.670500
+vn 0.016600 -0.741500 0.670700
+vn 0.019600 -0.741100 0.671100
+vn 0.011000 -0.732600 0.680600
+vn 0.023100 -0.740400 0.671700
+vn 0.013900 -0.732700 0.680300
+vn 0.029000 -0.739100 0.672900
+vn 0.025800 -0.739900 0.672200
+vn 0.032300 -0.738300 0.673600
+vn 0.035500 -0.737200 0.674700
+vn 0.042200 -0.734600 0.677100
+vn 0.039000 -0.736000 0.675800
+vn 0.045600 -0.733100 0.678500
+vn 0.048700 -0.731300 0.680300
+vn 0.057500 -0.718700 0.692900
+vn 0.063000 -0.714000 0.697300
+vn 0.063300 -0.709200 0.702100
+vn 0.057000 -0.712500 0.699300
+vn 0.027500 -0.717100 0.696400
+vn 0.059400 -0.721300 0.690000
+vn 0.053400 -0.726900 0.684700
+vn 0.062500 -0.717500 0.693700
+vn 0.085500 0.697800 -0.711100
+vn 0.106000 0.693600 -0.712500
+vn 0.105100 0.688800 -0.717200
+vn 0.085600 0.694100 -0.714700
+vn 0.103500 0.683600 -0.722500
+vn 0.084400 0.688500 -0.720200
+vn 0.071100 0.696600 -0.713800
+vn 0.070400 0.699500 -0.711100
+vn 0.063900 0.695800 -0.715400
+vn 0.064500 0.698900 -0.712300
+vn 0.071300 0.691800 -0.718600
+vn 0.063400 0.693700 -0.717500
+vn 0.070900 0.702300 -0.708400
+vn 0.085700 0.700800 -0.708100
+vn 0.071400 0.705300 -0.705300
+vn 0.085900 0.704500 -0.704500
+vn 0.065000 0.702500 -0.708700
+vn 0.106500 0.698200 -0.707900
+vn 0.106800 0.703100 -0.703100
+vn 0.078800 0.680200 -0.728700
+vn 0.098600 0.674100 -0.732000
+vn 0.095700 0.669900 -0.736200
+vn 0.076700 0.677600 -0.731400
+vn 0.092400 0.665700 -0.740500
+vn 0.074200 0.674400 -0.734600
+vn 0.063200 0.682900 -0.727700
+vn 0.065000 0.685600 -0.725100
+vn 0.057200 0.684700 -0.726500
+vn 0.060200 0.688500 -0.722700
+vn 0.061200 0.680000 -0.730600
+vn 0.054300 0.681700 -0.729600
+vn 0.067700 0.687700 -0.722800
+vn 0.081500 0.683400 -0.725500
+vn 0.062300 0.691600 -0.719500
+vn 0.101200 0.678500 -0.727500
+vn 0.067800 0.667900 -0.741100
+vn 0.084600 0.657600 -0.748600
+vn 0.080200 0.653800 -0.752300
+vn 0.064200 0.664900 -0.744100
+vn 0.075400 0.650300 -0.755900
+vn 0.060300 0.662100 -0.746900
+vn 0.052600 0.672400 -0.738300
+vn 0.055600 0.674800 -0.735900
+vn 0.045700 0.675400 -0.736000
+vn 0.048700 0.677400 -0.734000
+vn 0.049200 0.670200 -0.740500
+vn 0.042400 0.673600 -0.737800
+vn 0.058500 0.677300 -0.733300
+vn 0.071100 0.671000 -0.738000
+vn 0.051600 0.679500 -0.731900
+vn 0.088700 0.661500 -0.744600
+vn 0.051800 0.657100 -0.752000
+vn 0.064900 0.643800 -0.762400
+vn 0.059200 0.641000 -0.765200
+vn 0.047200 0.654900 -0.754200
+vn 0.053300 0.638500 -0.767800
+vn 0.042500 0.652900 -0.756300
+vn 0.038200 0.664500 -0.746300
+vn 0.042100 0.666200 -0.744500
+vn 0.032200 0.669300 -0.742200
+vn 0.035700 0.670600 -0.740900
+vn 0.034300 0.663000 -0.747900
+vn 0.028700 0.668200 -0.743400
+vn 0.045700 0.668100 -0.742600
+vn 0.056200 0.659500 -0.749600
+vn 0.039100 0.672000 -0.739500
+vn 0.070300 0.646900 -0.759300
+vn 0.032400 0.649500 -0.759600
+vn 0.040700 0.634200 -0.772100
+vn 0.034200 0.632500 -0.773800
+vn 0.027200 0.648200 -0.761000
+vn 0.027600 0.631100 -0.775200
+vn 0.021900 0.647100 -0.762100
+vn 0.021900 0.659400 -0.751500
+vn 0.026100 0.660400 -0.750500
+vn 0.018000 0.665700 -0.745900
+vn 0.021600 0.666400 -0.745200
+vn 0.017500 0.658600 -0.752300
+vn 0.014400 0.665200 -0.746500
+vn 0.030200 0.661600 -0.749200
+vn 0.037500 0.651100 -0.758100
+vn 0.025200 0.667300 -0.744400
+vn 0.047100 0.636200 -0.770100
+vn 0.011000 0.645600 -0.763500
+vn 0.013900 0.629200 -0.777100
+vn 0.007000 0.628700 -0.777600
+vn 0.005500 0.645300 -0.763900
+vn 0.000000 0.628600 -0.777700
+vn 0.000000 0.645100 -0.764000
+vn 0.004400 0.657200 -0.753700
+vn 0.008800 0.657500 -0.753400
+vn 0.003600 0.664300 -0.747400
+vn 0.007200 0.664400 -0.747200
+vn 0.000000 0.657100 -0.753800
+vn 0.000000 0.664200 -0.747500
+vn 0.013200 0.657900 -0.752900
+vn 0.016500 0.646200 -0.762900
+vn 0.010800 0.664800 -0.746900
+vn 0.020800 0.630000 -0.776300
+vn -0.011000 0.645600 -0.763500
+vn -0.013900 0.629200 -0.777100
+vn -0.020800 0.630000 -0.776300
+vn -0.016500 0.646200 -0.762900
+vn -0.027600 0.631100 -0.775200
+vn -0.021900 0.647100 -0.762100
+vn -0.013200 0.657900 -0.752900
+vn -0.008900 0.657500 -0.753400
+vn -0.010800 0.664800 -0.746900
+vn -0.007200 0.664400 -0.747200
+vn -0.017500 0.658600 -0.752300
+vn -0.014400 0.665200 -0.746500
+vn -0.004400 0.657200 -0.753700
+vn -0.005500 0.645300 -0.763900
+vn -0.003600 0.664300 -0.747400
+vn -0.007000 0.628700 -0.777600
+vn -0.032400 0.649500 -0.759600
+vn -0.040700 0.634200 -0.772100
+vn -0.047100 0.636200 -0.770100
+vn -0.037500 0.651100 -0.758100
+vn -0.053300 0.638500 -0.767800
+vn -0.042500 0.652900 -0.756300
+vn -0.030200 0.661600 -0.749200
+vn -0.026100 0.660400 -0.750500
+vn -0.025200 0.667300 -0.744400
+vn -0.021600 0.666400 -0.745200
+vn -0.034300 0.663000 -0.747900
+vn -0.028700 0.668200 -0.743400
+vn -0.021900 0.659400 -0.751500
+vn -0.027200 0.648200 -0.761000
+vn -0.018000 0.665700 -0.745900
+vn -0.034200 0.632500 -0.773800
+vn -0.051800 0.657100 -0.752000
+vn -0.064900 0.643800 -0.762400
+vn -0.070300 0.646900 -0.759300
+vn -0.056200 0.659500 -0.749600
+vn -0.075400 0.650300 -0.755900
+vn -0.060300 0.662100 -0.746900
+vn -0.045700 0.668100 -0.742600
+vn -0.042100 0.666200 -0.744500
+vn -0.039100 0.672000 -0.739500
+vn -0.035700 0.670600 -0.740900
+vn -0.049200 0.670200 -0.740500
+vn -0.042500 0.673700 -0.737800
+vn -0.038300 0.664500 -0.746300
+vn -0.047200 0.654900 -0.754200
+vn -0.032300 0.669300 -0.742200
+vn -0.059200 0.641000 -0.765200
+vn -0.067800 0.667900 -0.741100
+vn -0.084600 0.657600 -0.748600
+vn -0.088700 0.661500 -0.744600
+vn -0.071100 0.671000 -0.738000
+vn -0.092400 0.665700 -0.740500
+vn -0.074200 0.674400 -0.734600
+vn -0.058500 0.677300 -0.733300
+vn -0.055700 0.674800 -0.735900
+vn -0.051600 0.679500 -0.731900
+vn -0.048700 0.677400 -0.734000
+vn -0.061200 0.680000 -0.730600
+vn -0.054300 0.681700 -0.729600
+vn -0.052600 0.672400 -0.738300
+vn -0.064200 0.664900 -0.744100
+vn -0.045700 0.675400 -0.736000
+vn -0.080200 0.653800 -0.752400
+vn -0.078800 0.680200 -0.728700
+vn -0.098600 0.674100 -0.732000
+vn -0.101200 0.678500 -0.727500
+vn -0.081500 0.683400 -0.725500
+vn -0.103500 0.683600 -0.722500
+vn -0.084400 0.688500 -0.720200
+vn -0.067700 0.687700 -0.722800
+vn -0.065000 0.685600 -0.725100
+vn -0.062300 0.691600 -0.719600
+vn -0.060200 0.688500 -0.722700
+vn -0.071300 0.691800 -0.718600
+vn -0.063400 0.693700 -0.717500
+vn -0.063200 0.682900 -0.727800
+vn -0.076700 0.677600 -0.731400
+vn -0.057200 0.684700 -0.726500
+vn -0.095700 0.669900 -0.736200
+vn -0.085500 0.697800 -0.711100
+vn -0.106000 0.693600 -0.712500
+vn -0.106500 0.698200 -0.707900
+vn -0.085700 0.700800 -0.708100
+vn -0.106800 0.703100 -0.703100
+vn -0.085900 0.704500 -0.704500
+vn -0.070900 0.702300 -0.708400
+vn -0.070400 0.699500 -0.711100
+vn -0.065000 0.702500 -0.708700
+vn -0.064500 0.698900 -0.712300
+vn -0.071400 0.705300 -0.705300
+vn -0.065200 0.705600 -0.705600
+vn -0.071100 0.696600 -0.713800
+vn -0.085600 0.694100 -0.714700
+vn -0.063900 0.695800 -0.715400
+vn -0.105100 0.688800 -0.717200
+vn -0.085500 0.711100 -0.697800
+vn -0.106000 0.712500 -0.693600
+vn -0.105100 0.717300 -0.688800
+vn -0.085600 0.714700 -0.694100
+vn -0.103500 0.722500 -0.683600
+vn -0.084400 0.720200 -0.688500
+vn -0.071100 0.713900 -0.696600
+vn -0.070400 0.711200 -0.699500
+vn -0.063900 0.715400 -0.695800
+vn -0.064500 0.712300 -0.698900
+vn -0.071300 0.718600 -0.691800
+vn -0.063400 0.717500 -0.693700
+vn -0.070900 0.708400 -0.702300
+vn -0.085700 0.708100 -0.700800
+vn -0.065000 0.708700 -0.702500
+vn -0.106500 0.707900 -0.698200
+vn -0.078800 0.728700 -0.680200
+vn -0.098600 0.732000 -0.674100
+vn -0.095700 0.736200 -0.669900
+vn -0.076700 0.731400 -0.677600
+vn -0.092400 0.740500 -0.665700
+vn -0.074200 0.734600 -0.674400
+vn -0.063200 0.727700 -0.682900
+vn -0.065000 0.725100 -0.685600
+vn -0.057200 0.726500 -0.684700
+vn -0.060200 0.722700 -0.688500
+vn -0.061200 0.730600 -0.680000
+vn -0.054300 0.729600 -0.681700
+vn -0.067700 0.722700 -0.687700
+vn -0.081500 0.725500 -0.683400
+vn -0.062300 0.719600 -0.691600
+vn -0.101200 0.727500 -0.678500
+vn -0.067800 0.741100 -0.667900
+vn -0.084600 0.748600 -0.657600
+vn -0.080200 0.752400 -0.653800
+vn -0.064200 0.744100 -0.664900
+vn -0.075400 0.755900 -0.650300
+vn -0.060300 0.746900 -0.662100
+vn -0.052600 0.738300 -0.672400
+vn -0.055700 0.735900 -0.674800
+vn -0.045700 0.736000 -0.675400
+vn -0.048700 0.734000 -0.677400
+vn -0.049200 0.740500 -0.670200
+vn -0.042500 0.737800 -0.673700
+vn -0.058500 0.733300 -0.677400
+vn -0.071100 0.737900 -0.671100
+vn -0.051600 0.731900 -0.679500
+vn -0.088700 0.744600 -0.661500
+vn -0.051800 0.752000 -0.657100
+vn -0.064900 0.762400 -0.643800
+vn -0.059200 0.765200 -0.641000
+vn -0.047200 0.754300 -0.654900
+vn -0.053300 0.767800 -0.638500
+vn -0.042500 0.756300 -0.652900
+vn -0.038200 0.746300 -0.664500
+vn -0.042100 0.744500 -0.666200
+vn -0.032300 0.742200 -0.669300
+vn -0.035700 0.740900 -0.670600
+vn -0.034300 0.747900 -0.663000
+vn -0.028700 0.743400 -0.668200
+vn -0.045700 0.742600 -0.668100
+vn -0.056200 0.749600 -0.659500
+vn -0.039100 0.739400 -0.672000
+vn -0.070300 0.759300 -0.646900
+vn -0.032400 0.759600 -0.649500
+vn -0.040700 0.772100 -0.634200
+vn -0.034200 0.773800 -0.632500
+vn -0.027200 0.761000 -0.648200
+vn -0.027500 0.775200 -0.631100
+vn -0.021900 0.762100 -0.647100
+vn -0.021900 0.751500 -0.659400
+vn -0.026100 0.750400 -0.660400
+vn -0.018000 0.745900 -0.665700
+vn -0.021600 0.745200 -0.666400
+vn -0.017600 0.752300 -0.658600
+vn -0.014400 0.746500 -0.665200
+vn -0.030200 0.749200 -0.661600
+vn -0.037500 0.758100 -0.651100
+vn -0.025200 0.744400 -0.667300
+vn -0.047100 0.770100 -0.636200
+vn -0.011000 0.763500 -0.645600
+vn -0.013900 0.777100 -0.629200
+vn -0.007000 0.777600 -0.628700
+vn -0.005500 0.763900 -0.645300
+vn 0.000000 0.777700 -0.628600
+vn 0.000000 0.764000 -0.645100
+vn -0.004400 0.753700 -0.657200
+vn -0.008800 0.753400 -0.657500
+vn -0.003600 0.747400 -0.664300
+vn -0.007200 0.747200 -0.664500
+vn 0.000000 0.753800 -0.657100
+vn 0.000000 0.747500 -0.664200
+vn -0.013200 0.752900 -0.657900
+vn -0.016500 0.762900 -0.646200
+vn -0.010800 0.746900 -0.664800
+vn -0.020800 0.776300 -0.630000
+vn 0.011000 0.763500 -0.645600
+vn 0.013900 0.777100 -0.629200
+vn 0.020800 0.776300 -0.630000
+vn 0.016500 0.762900 -0.646200
+vn 0.027500 0.775200 -0.631100
+vn 0.021900 0.762100 -0.647100
+vn 0.013200 0.752900 -0.657900
+vn 0.008900 0.753400 -0.657500
+vn 0.010800 0.746900 -0.664800
+vn 0.007200 0.747200 -0.664400
+vn 0.017500 0.752300 -0.658600
+vn 0.014400 0.746500 -0.665200
+vn 0.004400 0.753700 -0.657200
+vn 0.005500 0.763900 -0.645300
+vn 0.003600 0.747500 -0.664300
+vn 0.007000 0.777600 -0.628700
+vn 0.032400 0.759600 -0.649500
+vn 0.040700 0.772100 -0.634200
+vn 0.047100 0.770100 -0.636200
+vn 0.037500 0.758100 -0.651100
+vn 0.053300 0.767800 -0.638500
+vn 0.042500 0.756300 -0.652900
+vn 0.030200 0.749200 -0.661600
+vn 0.026100 0.750400 -0.660400
+vn 0.025200 0.744400 -0.667300
+vn 0.021600 0.745200 -0.666400
+vn 0.034300 0.747900 -0.663000
+vn 0.028700 0.743400 -0.668200
+vn 0.021900 0.751500 -0.659400
+vn 0.027200 0.761000 -0.648200
+vn 0.018000 0.745900 -0.665700
+vn 0.034200 0.773800 -0.632500
+vn 0.051800 0.752000 -0.657100
+vn 0.064900 0.762400 -0.643800
+vn 0.070300 0.759300 -0.646900
+vn 0.056200 0.749600 -0.659500
+vn 0.075400 0.755900 -0.650300
+vn 0.060300 0.746900 -0.662100
+vn 0.045700 0.742600 -0.668100
+vn 0.042100 0.744500 -0.666200
+vn 0.039100 0.739400 -0.672000
+vn 0.035700 0.740900 -0.670600
+vn 0.049200 0.740500 -0.670200
+vn 0.042400 0.737800 -0.673600
+vn 0.038300 0.746300 -0.664500
+vn 0.047200 0.754200 -0.654900
+vn 0.032300 0.742200 -0.669300
+vn 0.059200 0.765200 -0.641000
+vn 0.067800 0.741100 -0.667900
+vn 0.084600 0.748600 -0.657600
+vn 0.088700 0.744600 -0.661500
+vn 0.071100 0.738000 -0.671100
+vn 0.092400 0.740500 -0.665700
+vn 0.074200 0.734600 -0.674400
+vn 0.058500 0.733300 -0.677400
+vn 0.055600 0.735900 -0.674800
+vn 0.051600 0.731900 -0.679500
+vn 0.048700 0.734000 -0.677400
+vn 0.061200 0.730600 -0.680000
+vn 0.052600 0.738300 -0.672400
+vn 0.064200 0.744100 -0.664900
+vn 0.045700 0.736000 -0.675400
+vn 0.080200 0.752400 -0.653800
+vn 0.078800 0.728700 -0.680200
+vn 0.098600 0.732000 -0.674100
+vn 0.101200 0.727500 -0.678500
+vn 0.081500 0.725500 -0.683400
+vn 0.103500 0.722500 -0.683600
+vn 0.084500 0.720200 -0.688500
+vn 0.067700 0.722800 -0.687700
+vn 0.065000 0.725100 -0.685600
+vn 0.071300 0.718600 -0.691800
+vn 0.063200 0.727700 -0.682900
+vn 0.076700 0.731400 -0.677600
+vn 0.095700 0.736200 -0.669900
+vn 0.085500 0.711100 -0.697800
+vn 0.106100 0.712500 -0.693600
+vn 0.106500 0.707900 -0.698200
+vn 0.085700 0.708100 -0.700800
+vn 0.070900 0.708400 -0.702300
+vn 0.070400 0.711200 -0.699500
+vn 0.071100 0.713800 -0.696600
+vn 0.085600 0.714700 -0.694100
+vn 0.105100 0.717300 -0.688800
+vn -0.005300 0.742000 -0.670400
+vn -0.002700 0.742000 -0.670300
+vn 0.000100 0.742100 -0.670300
+vn -0.008200 0.741800 -0.670500
+vn -0.010900 0.741700 -0.670600
+vn -0.016700 0.741100 -0.671200
+vn -0.013800 0.741400 -0.670900
+vn -0.019700 0.740700 -0.671600
+vn -0.022700 0.740200 -0.672000
+vn -0.029000 0.738900 -0.673200
+vn -0.025800 0.739600 -0.672600
+vn -0.032200 0.738000 -0.674000
+vn -0.035600 0.737000 -0.674900
+vn -0.042300 0.734400 -0.677400
+vn -0.038900 0.735700 -0.676100
+vn -0.045500 0.732800 -0.678900
+vn -0.048800 0.731100 -0.680400
+vn -0.059100 0.717400 -0.694100
+vn -0.059800 0.721000 -0.690300
+vn -0.053200 0.727300 -0.684200
+vn -0.043700 0.726200 -0.686100
+vn -0.028300 0.716000 -0.697500
+vn -0.058100 0.710800 -0.700900
+vn -0.027700 0.706800 -0.706800
+vn -0.058900 0.705900 -0.705900
+vn -0.063300 0.709200 -0.702100
+vn -0.063000 0.713900 -0.697400
+vn -0.063700 0.705600 -0.705600
+vn -0.062500 0.717400 -0.693800
+vn 0.005600 0.742000 -0.670400
+vn 0.008400 0.741900 -0.670500
+vn 0.011200 0.741700 -0.670600
+vn 0.002800 0.742100 -0.670300
+vn 0.017000 0.741100 -0.671100
+vn 0.020000 0.740700 -0.671500
+vn 0.023000 0.740200 -0.671900
+vn 0.014100 0.741400 -0.670800
+vn 0.029400 0.738900 -0.673100
+vn 0.032800 0.738000 -0.674000
+vn 0.036000 0.737000 -0.674900
+vn 0.026200 0.739600 -0.672400
+vn 0.042700 0.734400 -0.677400
+vn 0.046200 0.732800 -0.678900
+vn 0.039600 0.735800 -0.676000
+vn 0.059100 0.694100 -0.717400
+vn 0.045800 0.686500 -0.725700
+vn 0.027200 0.697400 -0.716200
+vn 0.058100 0.701000 -0.710800
+vn 0.063300 0.702200 -0.709200
+vn 0.063000 0.697400 -0.713900
+vn 0.062500 0.693800 -0.717400
+vn 0.059700 0.690300 -0.721000
+vn 0.054500 0.685100 -0.726400
+vn 0.049300 0.680500 -0.731000
+vn 0.042700 0.677300 -0.734400
+vn 0.046200 0.678900 -0.732800
+vn 0.039600 0.676100 -0.735700
+vn 0.036000 0.674900 -0.737000
+vn 0.029300 0.673100 -0.738900
+vn 0.032800 0.673900 -0.738000
+vn 0.026200 0.672400 -0.739600
+vn 0.023000 0.671900 -0.740200
+vn 0.017000 0.671100 -0.741100
+vn 0.020100 0.671500 -0.740700
+vn 0.014000 0.670800 -0.741400
+vn 0.011200 0.670600 -0.741700
+vn 0.005600 0.670400 -0.742000
+vn 0.008300 0.670500 -0.741900
+vn 0.002800 0.670300 -0.742100
+vn 0.000100 0.670300 -0.742100
+vn -0.005300 0.670400 -0.742000
+vn -0.002700 0.670300 -0.742000
+vn -0.008200 0.670500 -0.741800
+vn -0.010900 0.670600 -0.741700
+vn -0.016600 0.671200 -0.741100
+vn -0.013800 0.670900 -0.741400
+vn -0.019700 0.671600 -0.740700
+vn -0.022700 0.672000 -0.740200
+vn -0.029000 0.673200 -0.738900
+vn -0.025800 0.672600 -0.739600
+vn -0.032300 0.674000 -0.738000
+vn -0.035600 0.674900 -0.737000
+vn -0.042300 0.677400 -0.734400
+vn -0.038900 0.676100 -0.735700
+vn -0.045400 0.678900 -0.732800
+vn -0.048800 0.680500 -0.731100
+vn -0.059100 0.694100 -0.717400
+vn -0.063000 0.697400 -0.713900
+vn -0.063300 0.702200 -0.709200
+vn -0.058100 0.700900 -0.710800
+vn -0.028300 0.697500 -0.716000
+vn -0.043700 0.686100 -0.726200
+vn -0.053200 0.684200 -0.727300
+vn -0.059800 0.690300 -0.721000
+vn -0.062500 0.693800 -0.717400
+vn 0.041100 -0.684000 0.728300
+vn 0.007800 -0.693300 0.720500
+vn 0.000000 -0.707100 0.707100
+vn -0.000900 -0.697600 0.716500
+vn -0.001600 -0.697300 0.716700
+vn -0.000200 -0.697700 0.716400
+vn -0.014000 -0.679900 0.733200
+vn -0.002800 -0.697000 0.717100
+vn -0.004100 -0.696500 0.717500
+vn -0.018500 -0.679500 0.733400
+vn -0.023900 -0.679300 0.733500
+vn -0.007800 -0.695200 0.718800
+vn -0.005600 -0.695900 0.718100
+vn -0.030100 -0.679300 0.733200
+vn -0.010500 -0.694400 0.719500
+vn 0.000400 -0.697700 0.716400
+vn 0.001100 -0.697500 0.716500
+vn 0.001800 -0.697300 0.716800
+vn 0.002300 -0.696900 0.717200
+vn 0.017900 -0.679900 0.733100
+vn 0.002900 -0.696300 0.717700
+vn 0.004100 -0.695500 0.718500
+vn 0.023200 -0.679800 0.733100
+vn 0.029300 -0.679900 0.732700
+vn 0.005700 -0.694500 0.719400
+vn -0.030100 -0.733200 0.679300
+vn -0.023900 -0.733500 0.679300
+vn -0.007800 -0.718800 0.695200
+vn -0.010500 -0.719500 0.694400
+vn -0.018500 -0.733400 0.679500
+vn -0.014000 -0.733200 0.679900
+vn -0.004100 -0.717500 0.696500
+vn -0.005700 -0.718100 0.695900
+vn -0.001600 -0.716700 0.697400
+vn -0.002700 -0.717000 0.697000
+vn -0.000200 -0.716400 0.697700
+vn -0.000900 -0.716500 0.697600
+vn 0.001000 -0.716500 0.697600
+vn 0.000400 -0.716400 0.697700
+vn 0.002300 -0.717200 0.696900
+vn 0.001800 -0.716800 0.697300
+vn 0.017900 -0.733100 0.679900
+vn 0.004000 -0.718500 0.695500
+vn 0.002900 -0.717700 0.696300
+vn 0.023100 -0.733100 0.679700
+vn 0.029300 -0.732700 0.680000
+vn 0.007900 -0.720500 0.693300
+vn 0.005600 -0.719400 0.694500
+vn 0.041100 -0.728300 0.684000
+vn -0.001700 0.732000 -0.681300
+vn 0.001300 0.732000 -0.681300
+vn 0.000000 0.716200 -0.697800
+vn -0.000500 0.716300 -0.697700
+vn 0.000000 0.707100 -0.707100
+vn -0.004700 0.732100 -0.681100
+vn -0.001000 0.716500 -0.697500
+vn -0.007800 0.732300 -0.680900
+vn -0.001700 0.716800 -0.697200
+vn -0.011400 0.732500 -0.680600
+vn -0.002400 0.717300 -0.696700
+vn -0.015500 0.732800 -0.680300
+vn -0.003400 0.717900 -0.696000
+vn -0.020400 0.732800 -0.680000
+vn -0.004800 0.718800 -0.695200
+vn -0.026200 0.732700 -0.680100
+vn -0.008300 0.719600 -0.694300
+vn -0.031600 0.732500 -0.680000
+vn 0.004200 0.732100 -0.681100
+vn 0.007400 0.732300 -0.680900
+vn 0.001000 0.716500 -0.697500
+vn 0.000500 0.716300 -0.697700
+vn 0.010900 0.732500 -0.680600
+vn 0.014900 0.732800 -0.680300
+vn 0.002400 0.717300 -0.696700
+vn 0.001600 0.716800 -0.697200
+vn 0.019700 0.732900 -0.680000
+vn 0.025400 0.732700 -0.680000
+vn 0.004800 0.718800 -0.695200
+vn 0.003400 0.717900 -0.696100
+vn 0.031800 0.732500 -0.680000
+vn 0.006800 0.719800 -0.694100
+vn 0.031800 0.680000 -0.732500
+vn 0.025400 0.680000 -0.732700
+vn 0.006800 0.694100 -0.719800
+vn 0.004800 0.695200 -0.718800
+vn 0.019700 0.680000 -0.732900
+vn 0.015000 0.680300 -0.732700
+vn 0.003400 0.696000 -0.717900
+vn 0.002400 0.696700 -0.717300
+vn 0.010900 0.680600 -0.732500
+vn 0.007400 0.680900 -0.732300
+vn 0.001600 0.697200 -0.716800
+vn 0.001000 0.697500 -0.716500
+vn 0.004200 0.681100 -0.732100
+vn 0.001200 0.681300 -0.732000
+vn 0.000500 0.697700 -0.716300
+vn 0.000000 0.697800 -0.716300
+vn -0.001600 0.681300 -0.732000
+vn -0.004600 0.681100 -0.732100
+vn -0.000500 0.697700 -0.716300
+vn -0.001000 0.697500 -0.716500
+vn -0.007800 0.680900 -0.732300
+vn -0.011400 0.680600 -0.732500
+vn -0.001600 0.697200 -0.716800
+vn -0.002400 0.696700 -0.717300
+vn -0.015600 0.680300 -0.732700
+vn -0.020400 0.680000 -0.732800
+vn -0.003400 0.696100 -0.717900
+vn -0.004800 0.695200 -0.718800
+vn -0.026200 0.680100 -0.732700
+vn -0.031600 0.680000 -0.732500
+vn -0.008300 0.694300 -0.719600
+vn -0.186300 -0.747100 -0.638000
+vn -0.191000 -0.737500 -0.647700
+vn -0.164000 -0.733100 -0.660100
+vn -0.159600 -0.743200 -0.649700
+vn -0.135900 -0.727000 -0.673100
+vn -0.131700 -0.738500 -0.661300
+vn -0.194100 -0.729500 -0.655900
+vn -0.165200 -0.728000 -0.665400
+vn -0.134600 -0.725700 -0.674700
+vn -0.152500 -0.752800 -0.640300
+vn -0.180000 -0.756400 -0.628800
+vn -0.148100 -0.757200 -0.636200
+vn -0.174000 -0.763700 -0.621600
+vn -0.123100 -0.748900 -0.651100
+vn -0.120700 -0.749500 -0.650900
+vn -0.206900 -0.760300 -0.615700
+vn -0.213300 -0.750500 -0.625500
+vn -0.234700 -0.764300 -0.600600
+vn -0.241800 -0.753300 -0.611600
+vn -0.199800 -0.769600 -0.606400
+vn -0.226700 -0.775000 -0.589900
+vn -0.218600 -0.740300 -0.635700
+vn -0.222800 -0.730200 -0.645800
+vn -0.247800 -0.742000 -0.622900
+vn -0.252800 -0.730300 -0.634500
+vn -0.160000 -0.779400 -0.605700
+vn -0.168100 -0.770900 -0.614300
+vn -0.145100 -0.761800 -0.631300
+vn -0.137000 -0.770800 -0.622100
+vn -0.121400 -0.750900 -0.649100
+vn -0.113100 -0.761300 -0.638500
+vn -0.126700 -0.778800 -0.614400
+vn -0.150500 -0.787200 -0.598100
+vn -0.120900 -0.782200 -0.611100
+vn -0.142100 -0.793100 -0.592200
+vn -0.101000 -0.769800 -0.630200
+vn -0.098500 -0.769900 -0.630500
+vn -0.173400 -0.795700 -0.580300
+vn -0.183200 -0.787400 -0.588600
+vn -0.196800 -0.804400 -0.560400
+vn -0.207600 -0.795100 -0.569800
+vn -0.163100 -0.803400 -0.572600
+vn -0.185100 -0.813300 -0.551600
+vn -0.192000 -0.778600 -0.597400
+vn -0.217600 -0.785300 -0.579600
+vn -0.122800 -0.805700 -0.579400
+vn -0.133700 -0.799000 -0.586200
+vn -0.116200 -0.786200 -0.607000
+vn -0.105100 -0.793400 -0.599600
+vn -0.098600 -0.771400 -0.628600
+vn -0.086800 -0.779900 -0.619900
+vn -0.092300 -0.799200 -0.594000
+vn -0.110800 -0.811500 -0.573700
+vn -0.085500 -0.801400 -0.591900
+vn -0.100500 -0.815700 -0.569600
+vn -0.072000 -0.785900 -0.614200
+vn -0.069700 -0.785500 -0.614900
+vn -0.128100 -0.823800 -0.552200
+vn -0.140600 -0.817500 -0.558500
+vn -0.145400 -0.836300 -0.528600
+vn -0.159300 -0.829300 -0.535600
+vn -0.115400 -0.829300 -0.546700
+vn -0.130900 -0.842700 -0.522200
+vn -0.152300 -0.810600 -0.565400
+vn -0.172500 -0.821600 -0.543300
+vn -0.077200 -0.824300 -0.560800
+vn -0.090200 -0.819900 -0.565300
+vn -0.079500 -0.804400 -0.588700
+vn -0.066100 -0.809300 -0.583600
+vn -0.069200 -0.787000 -0.613000
+vn -0.054600 -0.793000 -0.606700
+vn -0.051600 -0.812600 -0.580600
+vn -0.063500 -0.827700 -0.557500
+vn -0.044300 -0.813500 -0.579800
+vn -0.052000 -0.829900 -0.555400
+vn -0.038100 -0.796100 -0.603900
+vn -0.036000 -0.795400 -0.605000
+vn -0.074000 -0.842600 -0.533400
+vn -0.088400 -0.838800 -0.537100
+vn -0.084100 -0.857700 -0.507200
+vn -0.100200 -0.853400 -0.511500
+vn -0.059700 -0.845600 -0.530400
+vn -0.067700 -0.861200 -0.503700
+vn -0.102200 -0.834300 -0.541700
+vn -0.115700 -0.848400 -0.516400
+vn -0.026300 -0.833900 -0.551200
+vn -0.040500 -0.832100 -0.553100
+vn -0.037300 -0.815200 -0.577900
+vn -0.022500 -0.817600 -0.575400
+vn -0.034900 -0.796700 -0.603300
+vn -0.018600 -0.799800 -0.599900
+vn -0.007400 -0.818000 -0.575100
+vn -0.011900 -0.834700 -0.550500
+vn 0.000000 -0.817700 -0.575700
+vn 0.000000 -0.834800 -0.550600
+vn -0.001600 -0.799800 -0.600200
+vn 0.000000 -0.798700 -0.601600
+vn -0.014900 -0.850900 -0.525100
+vn -0.030100 -0.849900 -0.526100
+vn -0.017200 -0.867100 -0.497800
+vn -0.034200 -0.865900 -0.498900
+vn 0.000000 -0.851200 -0.524900
+vn 0.000000 -0.867500 -0.497400
+vn -0.045200 -0.848000 -0.527900
+vn -0.051000 -0.864000 -0.500900
+vn 0.026300 -0.833900 -0.551200
+vn 0.011900 -0.834700 -0.550500
+vn 0.007400 -0.818000 -0.575100
+vn 0.022500 -0.817600 -0.575400
+vn 0.001600 -0.799800 -0.600200
+vn 0.018600 -0.799800 -0.599900
+vn 0.037300 -0.815200 -0.577900
+vn 0.040500 -0.832100 -0.553100
+vn 0.044300 -0.813500 -0.579800
+vn 0.052000 -0.829900 -0.555400
+vn 0.034900 -0.796700 -0.603300
+vn 0.036000 -0.795400 -0.605000
+vn 0.045200 -0.848000 -0.527900
+vn 0.030100 -0.849800 -0.526100
+vn 0.051000 -0.864000 -0.500900
+vn 0.034200 -0.865900 -0.498900
+vn 0.059700 -0.845600 -0.530400
+vn 0.067700 -0.861200 -0.503700
+vn 0.014900 -0.850900 -0.525100
+vn 0.017200 -0.867100 -0.497800
+vn 0.077200 -0.824300 -0.560800
+vn 0.063500 -0.827700 -0.557500
+vn 0.051600 -0.812600 -0.580600
+vn 0.066100 -0.809300 -0.583600
+vn 0.038100 -0.796100 -0.603900
+vn 0.054600 -0.793000 -0.606700
+vn 0.079500 -0.804400 -0.588700
+vn 0.090200 -0.819900 -0.565300
+vn 0.085500 -0.801400 -0.591900
+vn 0.100500 -0.815700 -0.569600
+vn 0.069200 -0.787000 -0.613000
+vn 0.069700 -0.785500 -0.614900
+vn 0.102200 -0.834300 -0.541700
+vn 0.088400 -0.838800 -0.537100
+vn 0.115700 -0.848400 -0.516400
+vn 0.100200 -0.853400 -0.511500
+vn 0.115400 -0.829300 -0.546700
+vn 0.130900 -0.842700 -0.522200
+vn 0.074000 -0.842600 -0.533400
+vn 0.084100 -0.857700 -0.507200
+vn 0.122800 -0.805700 -0.579400
+vn 0.110800 -0.811500 -0.573700
+vn 0.092300 -0.799200 -0.594000
+vn 0.105100 -0.793400 -0.599600
+vn 0.072000 -0.785900 -0.614200
+vn 0.086800 -0.779900 -0.619900
+vn 0.116200 -0.786200 -0.607000
+vn 0.133700 -0.799000 -0.586200
+vn 0.120900 -0.782200 -0.611100
+vn 0.142100 -0.793100 -0.592200
+vn 0.098600 -0.771400 -0.628600
+vn 0.098500 -0.769900 -0.630500
+vn 0.152300 -0.810600 -0.565400
+vn 0.140600 -0.817500 -0.558500
+vn 0.172500 -0.821600 -0.543300
+vn 0.159300 -0.829300 -0.535600
+vn 0.163100 -0.803400 -0.572600
+vn 0.185100 -0.813300 -0.551600
+vn 0.128100 -0.823800 -0.552200
+vn 0.145400 -0.836300 -0.528600
+vn 0.160000 -0.779400 -0.605700
+vn 0.150500 -0.787200 -0.598000
+vn 0.126700 -0.778800 -0.614400
+vn 0.137000 -0.770800 -0.622100
+vn 0.101000 -0.769800 -0.630200
+vn 0.113100 -0.761300 -0.638500
+vn 0.145100 -0.761800 -0.631300
+vn 0.168100 -0.770900 -0.614300
+vn 0.148100 -0.757200 -0.636200
+vn 0.174000 -0.763700 -0.621600
+vn 0.121400 -0.750900 -0.649100
+vn 0.120700 -0.749500 -0.650900
+vn 0.192000 -0.778600 -0.597400
+vn 0.183200 -0.787400 -0.588600
+vn 0.217600 -0.785300 -0.579600
+vn 0.207600 -0.795100 -0.569800
+vn 0.199800 -0.769600 -0.606400
+vn 0.226700 -0.775000 -0.589900
+vn 0.173400 -0.795700 -0.580300
+vn 0.196800 -0.804400 -0.560400
+vn 0.186300 -0.747100 -0.638000
+vn 0.180000 -0.756400 -0.628800
+vn 0.152500 -0.752800 -0.640300
+vn 0.159600 -0.743200 -0.649700
+vn 0.123100 -0.748900 -0.651100
+vn 0.131700 -0.738500 -0.661300
+vn 0.164000 -0.733100 -0.660100
+vn 0.191000 -0.737500 -0.647700
+vn 0.165200 -0.728000 -0.665400
+vn 0.194100 -0.729500 -0.655900
+vn 0.135900 -0.727000 -0.673100
+vn 0.134600 -0.725700 -0.674700
+vn 0.218600 -0.740300 -0.635700
+vn 0.213300 -0.750500 -0.625500
+vn 0.247800 -0.742000 -0.622900
+vn 0.241800 -0.753300 -0.611600
+vn 0.222800 -0.730200 -0.645800
+vn 0.252800 -0.730300 -0.634500
+vn 0.206900 -0.760300 -0.615700
+vn 0.234700 -0.764300 -0.600600
+vn 0.200000 -0.711200 -0.673900
+vn 0.197200 -0.721300 -0.663900
+vn 0.167900 -0.723000 -0.670200
+vn 0.171200 -0.712400 -0.680500
+vn 0.136800 -0.724700 -0.675300
+vn 0.141400 -0.713000 -0.686700
+vn 0.171800 -0.701800 -0.691300
+vn 0.201000 -0.701000 -0.684200
+vn 0.171100 -0.696700 -0.696700
+vn 0.200900 -0.692700 -0.692700
+vn 0.141100 -0.701200 -0.698800
+vn 0.139300 -0.700200 -0.700200
+vn 0.230300 -0.698500 -0.677400
+vn 0.228900 -0.709300 -0.666700
+vn 0.261100 -0.694600 -0.670300
+vn 0.259500 -0.706600 -0.658300
+vn 0.230700 -0.688000 -0.688000
+vn 0.261700 -0.682500 -0.682500
+vn 0.226300 -0.720000 -0.656000
+vn 0.256700 -0.718500 -0.646400
+vn 0.200000 -0.673900 -0.711200
+vn 0.201000 -0.684200 -0.701000
+vn 0.171800 -0.691300 -0.701800
+vn 0.171200 -0.680500 -0.712400
+vn 0.141100 -0.698800 -0.701200
+vn 0.141400 -0.686700 -0.713000
+vn 0.167900 -0.670200 -0.723000
+vn 0.197200 -0.663900 -0.721300
+vn 0.165200 -0.665400 -0.728000
+vn 0.194100 -0.655900 -0.729500
+vn 0.136800 -0.675300 -0.724700
+vn 0.134600 -0.674700 -0.725700
+vn 0.226300 -0.656000 -0.720000
+vn 0.228900 -0.666700 -0.709300
+vn 0.256700 -0.646400 -0.718500
+vn 0.259500 -0.658300 -0.706600
+vn 0.222800 -0.645800 -0.730200
+vn 0.252800 -0.634500 -0.730300
+vn 0.230300 -0.677400 -0.698500
+vn 0.261100 -0.670300 -0.694600
+vn 0.186300 -0.638000 -0.747100
+vn 0.191000 -0.647700 -0.737500
+vn 0.164000 -0.660100 -0.733100
+vn 0.159600 -0.649700 -0.743200
+vn 0.135900 -0.673100 -0.727000
+vn 0.131700 -0.661300 -0.738500
+vn 0.152500 -0.640300 -0.752800
+vn 0.180000 -0.628800 -0.756400
+vn 0.148100 -0.636200 -0.757200
+vn 0.174000 -0.621600 -0.763700
+vn 0.123100 -0.651100 -0.748900
+vn 0.120700 -0.650900 -0.749500
+vn 0.206900 -0.615700 -0.760300
+vn 0.213300 -0.625500 -0.750500
+vn 0.234700 -0.600600 -0.764300
+vn 0.241800 -0.611600 -0.753300
+vn 0.199800 -0.606400 -0.769600
+vn 0.226700 -0.589900 -0.775000
+vn 0.218600 -0.635700 -0.740300
+vn 0.247800 -0.622900 -0.742000
+vn 0.160000 -0.605700 -0.779400
+vn 0.168100 -0.614300 -0.770900
+vn 0.145100 -0.631300 -0.761800
+vn 0.137000 -0.622100 -0.770800
+vn 0.121400 -0.649100 -0.750900
+vn 0.113100 -0.638500 -0.761300
+vn 0.126700 -0.614300 -0.778800
+vn 0.150500 -0.598000 -0.787200
+vn 0.120900 -0.611100 -0.782200
+vn 0.142100 -0.592200 -0.793100
+vn 0.101000 -0.630200 -0.769800
+vn 0.098500 -0.630500 -0.769900
+vn 0.173400 -0.580300 -0.795700
+vn 0.183200 -0.588600 -0.787400
+vn 0.196800 -0.560400 -0.804400
+vn 0.207600 -0.569800 -0.795100
+vn 0.163100 -0.572600 -0.803400
+vn 0.185100 -0.551600 -0.813300
+vn 0.192000 -0.597400 -0.778600
+vn 0.217600 -0.579600 -0.785300
+vn 0.122800 -0.579400 -0.805700
+vn 0.133700 -0.586200 -0.799000
+vn 0.116200 -0.607000 -0.786200
+vn 0.105100 -0.599600 -0.793400
+vn 0.098600 -0.628600 -0.771400
+vn 0.086800 -0.619900 -0.779900
+vn 0.092300 -0.594000 -0.799200
+vn 0.110800 -0.573700 -0.811500
+vn 0.085500 -0.591900 -0.801400
+vn 0.100500 -0.569600 -0.815700
+vn 0.072000 -0.614200 -0.785900
+vn 0.069700 -0.614900 -0.785500
+vn 0.128100 -0.552200 -0.823800
+vn 0.140500 -0.558500 -0.817500
+vn 0.145400 -0.528600 -0.836300
+vn 0.159300 -0.535600 -0.829300
+vn 0.115400 -0.546700 -0.829300
+vn 0.130900 -0.522200 -0.842700
+vn 0.152300 -0.565400 -0.810600
+vn 0.172500 -0.543300 -0.821600
+vn 0.077200 -0.560800 -0.824300
+vn 0.090200 -0.565300 -0.819900
+vn 0.079500 -0.588700 -0.804400
+vn 0.066100 -0.583600 -0.809300
+vn 0.069200 -0.613000 -0.787000
+vn 0.054600 -0.606700 -0.793000
+vn 0.051600 -0.580600 -0.812600
+vn 0.063500 -0.557500 -0.827700
+vn 0.044300 -0.579800 -0.813500
+vn 0.052000 -0.555400 -0.829900
+vn 0.038100 -0.603900 -0.796100
+vn 0.036000 -0.605000 -0.795400
+vn 0.074000 -0.533400 -0.842600
+vn 0.088400 -0.537100 -0.838800
+vn 0.084100 -0.507200 -0.857700
+vn 0.100200 -0.511500 -0.853400
+vn 0.059700 -0.530400 -0.845600
+vn 0.067700 -0.503700 -0.861200
+vn 0.102200 -0.541700 -0.834300
+vn 0.115700 -0.516400 -0.848400
+vn 0.026300 -0.551200 -0.833900
+vn 0.040500 -0.553200 -0.832100
+vn 0.037300 -0.577900 -0.815200
+vn 0.022500 -0.575400 -0.817600
+vn 0.034900 -0.603300 -0.796700
+vn 0.018600 -0.599900 -0.799800
+vn 0.007400 -0.575100 -0.818000
+vn 0.011900 -0.550500 -0.834700
+vn 0.000000 -0.575700 -0.817700
+vn 0.000000 -0.550600 -0.834800
+vn 0.001600 -0.600200 -0.799800
+vn 0.000000 -0.601600 -0.798700
+vn 0.014900 -0.525100 -0.850900
+vn 0.030100 -0.526100 -0.849900
+vn 0.017100 -0.497800 -0.867100
+vn 0.034200 -0.498900 -0.865900
+vn 0.000000 -0.524900 -0.851200
+vn 0.000000 -0.497400 -0.867500
+vn 0.045200 -0.527900 -0.848000
+vn 0.051000 -0.500900 -0.864000
+vn -0.026300 -0.551200 -0.833900
+vn -0.011900 -0.550500 -0.834700
+vn -0.007400 -0.575100 -0.818000
+vn -0.022500 -0.575400 -0.817600
+vn -0.001600 -0.600200 -0.799800
+vn -0.018600 -0.599900 -0.799800
+vn -0.037300 -0.577900 -0.815200
+vn -0.040500 -0.553100 -0.832100
+vn -0.044300 -0.579800 -0.813500
+vn -0.052000 -0.555400 -0.829900
+vn -0.034900 -0.603300 -0.796700
+vn -0.036000 -0.605000 -0.795400
+vn -0.045200 -0.527900 -0.848000
+vn -0.030100 -0.526100 -0.849900
+vn -0.051000 -0.500900 -0.864000
+vn -0.034200 -0.498900 -0.865900
+vn -0.059700 -0.530400 -0.845600
+vn -0.067700 -0.503700 -0.861200
+vn -0.014900 -0.525100 -0.850900
+vn -0.017200 -0.497800 -0.867100
+vn -0.077200 -0.560800 -0.824300
+vn -0.063500 -0.557500 -0.827700
+vn -0.051600 -0.580600 -0.812600
+vn -0.066100 -0.583600 -0.809300
+vn -0.038100 -0.603900 -0.796100
+vn -0.054600 -0.606700 -0.793000
+vn -0.079500 -0.588700 -0.804400
+vn -0.090200 -0.565300 -0.819900
+vn -0.085500 -0.591900 -0.801400
+vn -0.100500 -0.569600 -0.815700
+vn -0.069200 -0.613000 -0.787000
+vn -0.069700 -0.614900 -0.785500
+vn -0.102200 -0.541700 -0.834300
+vn -0.088400 -0.537100 -0.838800
+vn -0.115700 -0.516400 -0.848400
+vn -0.100200 -0.511500 -0.853400
+vn -0.115400 -0.546700 -0.829300
+vn -0.130900 -0.522200 -0.842700
+vn -0.074000 -0.533400 -0.842600
+vn -0.084100 -0.507200 -0.857700
+vn -0.122800 -0.579400 -0.805700
+vn -0.110800 -0.573700 -0.811500
+vn -0.092300 -0.594000 -0.799200
+vn -0.105100 -0.599600 -0.793400
+vn -0.072000 -0.614200 -0.785900
+vn -0.086800 -0.619900 -0.779900
+vn -0.116200 -0.607000 -0.786200
+vn -0.133700 -0.586200 -0.799000
+vn -0.120900 -0.611100 -0.782200
+vn -0.142100 -0.592200 -0.793100
+vn -0.098600 -0.628600 -0.771400
+vn -0.098500 -0.630500 -0.769900
+vn -0.152300 -0.565400 -0.810600
+vn -0.140600 -0.558500 -0.817500
+vn -0.172500 -0.543300 -0.821600
+vn -0.159300 -0.535600 -0.829300
+vn -0.163100 -0.572600 -0.803400
+vn -0.185100 -0.551600 -0.813300
+vn -0.128100 -0.552200 -0.823800
+vn -0.145400 -0.528600 -0.836300
+vn -0.160000 -0.605700 -0.779400
+vn -0.150500 -0.598100 -0.787200
+vn -0.126700 -0.614400 -0.778800
+vn -0.137000 -0.622100 -0.770800
+vn -0.101000 -0.630300 -0.769800
+vn -0.113100 -0.638500 -0.761300
+vn -0.145100 -0.631300 -0.761800
+vn -0.168100 -0.614300 -0.771000
+vn -0.148100 -0.636200 -0.757200
+vn -0.174000 -0.621600 -0.763700
+vn -0.121400 -0.649100 -0.750900
+vn -0.120700 -0.650900 -0.749500
+vn -0.192000 -0.597400 -0.778600
+vn -0.183200 -0.588600 -0.787400
+vn -0.217600 -0.579600 -0.785300
+vn -0.207600 -0.569800 -0.795100
+vn -0.199800 -0.606400 -0.769600
+vn -0.226700 -0.589900 -0.775000
+vn -0.173400 -0.580300 -0.795700
+vn -0.196800 -0.560400 -0.804400
+vn -0.186300 -0.638000 -0.747100
+vn -0.180000 -0.628800 -0.756400
+vn -0.152500 -0.640300 -0.752800
+vn -0.159600 -0.649700 -0.743200
+vn -0.123100 -0.651100 -0.748900
+vn -0.131700 -0.661300 -0.738500
+vn -0.164000 -0.660100 -0.733100
+vn -0.191000 -0.647700 -0.737500
+vn -0.165200 -0.665400 -0.728000
+vn -0.194100 -0.655900 -0.729500
+vn -0.135900 -0.673100 -0.727000
+vn -0.134600 -0.674700 -0.725700
+vn -0.218600 -0.635700 -0.740300
+vn -0.213300 -0.625500 -0.750500
+vn -0.247800 -0.622900 -0.742000
+vn -0.241800 -0.611600 -0.753300
+vn -0.222800 -0.645800 -0.730200
+vn -0.252800 -0.634500 -0.730300
+vn -0.206900 -0.615700 -0.760300
+vn -0.234700 -0.600600 -0.764300
+vn -0.200000 -0.673900 -0.711200
+vn -0.197200 -0.663900 -0.721300
+vn -0.167900 -0.670200 -0.723000
+vn -0.171200 -0.680500 -0.712400
+vn -0.136800 -0.675300 -0.724700
+vn -0.141400 -0.686700 -0.713000
+vn -0.171800 -0.691300 -0.701800
+vn -0.201000 -0.684200 -0.701000
+vn -0.171100 -0.696700 -0.696700
+vn -0.200900 -0.692700 -0.692700
+vn -0.141100 -0.698800 -0.701200
+vn -0.139300 -0.700200 -0.700200
+vn -0.230300 -0.677400 -0.698500
+vn -0.228900 -0.666700 -0.709300
+vn -0.261100 -0.670300 -0.694600
+vn -0.259500 -0.658300 -0.706600
+vn -0.230700 -0.688000 -0.688000
+vn -0.261700 -0.682500 -0.682500
+vn -0.226300 -0.656000 -0.720000
+vn -0.256700 -0.646400 -0.718500
+vn -0.200000 -0.711200 -0.673900
+vn -0.201000 -0.701000 -0.684200
+vn -0.171800 -0.701800 -0.691300
+vn -0.171200 -0.712400 -0.680500
+vn -0.141100 -0.701200 -0.698800
+vn -0.141400 -0.713000 -0.686700
+vn -0.167900 -0.723000 -0.670200
+vn -0.197200 -0.721300 -0.663900
+vn -0.136800 -0.724700 -0.675300
+vn -0.226300 -0.720000 -0.656000
+vn -0.228900 -0.709300 -0.666700
+vn -0.256700 -0.718500 -0.646400
+vn -0.259500 -0.706600 -0.658300
+vn -0.230300 -0.698500 -0.677400
+vn -0.261100 -0.694600 -0.670300
+vn -0.300100 -0.756600 -0.580800
+vn -0.307600 -0.742600 -0.594900
+vn -0.277900 -0.742700 -0.609200
+vn -0.271100 -0.755400 -0.596500
+vn -0.313800 -0.728200 -0.609300
+vn -0.283500 -0.729700 -0.622200
+vn -0.263200 -0.767700 -0.584200
+vn -0.291400 -0.770300 -0.567200
+vn -0.254100 -0.779700 -0.572200
+vn -0.281300 -0.783600 -0.553900
+vn -0.319200 -0.772100 -0.549500
+vn -0.328700 -0.757100 -0.564500
+vn -0.346600 -0.773000 -0.531300
+vn -0.357000 -0.756700 -0.547600
+vn -0.308100 -0.786600 -0.535000
+vn -0.334700 -0.788800 -0.515500
+vn -0.336900 -0.741700 -0.579900
+vn -0.343700 -0.725900 -0.595700
+vn -0.365900 -0.740000 -0.564300
+vn -0.373300 -0.722900 -0.581400
+vn -0.257700 -0.808600 -0.528900
+vn -0.270100 -0.796400 -0.541100
+vn -0.244000 -0.791300 -0.560700
+vn -0.232800 -0.802300 -0.549600
+vn -0.220600 -0.812800 -0.539100
+vn -0.244200 -0.820200 -0.517300
+vn -0.207500 -0.822700 -0.529200
+vn -0.229700 -0.831200 -0.506300
+vn -0.267600 -0.826700 -0.494900
+vn -0.282300 -0.814000 -0.507600
+vn -0.290600 -0.832300 -0.472000
+vn -0.306600 -0.818500 -0.485800
+vn -0.251600 -0.838700 -0.482900
+vn -0.273300 -0.845400 -0.458900
+vn -0.295800 -0.800600 -0.521000
+vn -0.321300 -0.804000 -0.500300
+vn -0.197700 -0.851000 -0.486500
+vn -0.214100 -0.841500 -0.496000
+vn -0.193500 -0.832000 -0.519900
+vn -0.178700 -0.840600 -0.511300
+vn -0.163100 -0.848500 -0.503400
+vn -0.180500 -0.859700 -0.477800
+vn -0.146700 -0.855700 -0.496200
+vn -0.162400 -0.867700 -0.469800
+vn -0.197700 -0.870000 -0.451600
+vn -0.216600 -0.860400 -0.461200
+vn -0.214800 -0.879400 -0.424900
+vn -0.235300 -0.869000 -0.435300
+vn -0.177900 -0.878700 -0.442900
+vn -0.193200 -0.888800 -0.415500
+vn -0.234600 -0.850000 -0.471600
+vn -0.254800 -0.857600 -0.446600
+vn -0.124300 -0.880900 -0.456500
+vn -0.143600 -0.874800 -0.462700
+vn -0.129700 -0.862100 -0.489800
+vn -0.112300 -0.867700 -0.484200
+vn -0.094400 -0.872500 -0.479400
+vn -0.104400 -0.886300 -0.451200
+vn -0.075900 -0.876400 -0.475500
+vn -0.084000 -0.890600 -0.446900
+vn -0.114400 -0.899100 -0.422600
+vn -0.136200 -0.893300 -0.428300
+vn -0.124300 -0.910900 -0.393400
+vn -0.147900 -0.904600 -0.399700
+vn -0.092100 -0.903900 -0.417800
+vn -0.100000 -0.916100 -0.388200
+vn -0.157300 -0.886500 -0.435100
+vn -0.170900 -0.897300 -0.407000
+vn -0.042400 -0.896500 -0.441000
+vn -0.063300 -0.894000 -0.443500
+vn -0.057200 -0.879500 -0.472400
+vn -0.038300 -0.881700 -0.470200
+vn -0.019200 -0.883000 -0.468900
+vn -0.021300 -0.897900 -0.439500
+vn 0.000000 -0.883500 -0.468400
+vn 0.000000 -0.898400 -0.439000
+vn -0.023300 -0.911900 -0.409700
+vn -0.046400 -0.910300 -0.411300
+vn -0.025300 -0.924800 -0.379400
+vn -0.050400 -0.923100 -0.381200
+vn 0.000000 -0.912400 -0.409200
+vn 0.000000 -0.925400 -0.378900
+vn -0.069400 -0.907600 -0.414000
+vn -0.075300 -0.920200 -0.384100
+vn 0.042400 -0.896500 -0.441000
+vn 0.021300 -0.897900 -0.439500
+vn 0.019200 -0.883000 -0.468900
+vn 0.038300 -0.881700 -0.470200
+vn 0.057200 -0.879500 -0.472400
+vn 0.063300 -0.894000 -0.443500
+vn 0.075900 -0.876400 -0.475500
+vn 0.084000 -0.890600 -0.446900
+vn 0.069400 -0.907600 -0.414000
+vn 0.046400 -0.910300 -0.411300
+vn 0.075300 -0.920200 -0.384100
+vn 0.050400 -0.923100 -0.381200
+vn 0.092100 -0.903900 -0.417800
+vn 0.100000 -0.916100 -0.388200
+vn 0.023300 -0.911900 -0.409700
+vn 0.025300 -0.924800 -0.379400
+vn 0.124300 -0.880900 -0.456500
+vn 0.104400 -0.886300 -0.451200
+vn 0.094400 -0.872500 -0.479500
+vn 0.112300 -0.867700 -0.484200
+vn 0.129700 -0.862100 -0.489800
+vn 0.143600 -0.874800 -0.462700
+vn 0.146700 -0.855700 -0.496200
+vn 0.162400 -0.867700 -0.469800
+vn 0.157300 -0.886500 -0.435100
+vn 0.136200 -0.893300 -0.428300
+vn 0.170900 -0.897300 -0.407000
+vn 0.147900 -0.904600 -0.399700
+vn 0.177900 -0.878700 -0.442900
+vn 0.193200 -0.888800 -0.415500
+vn 0.114400 -0.899100 -0.422600
+vn 0.124300 -0.910900 -0.393400
+vn 0.197700 -0.851000 -0.486500
+vn 0.180500 -0.859700 -0.477800
+vn 0.163100 -0.848500 -0.503400
+vn 0.178700 -0.840600 -0.511300
+vn 0.193500 -0.832000 -0.519900
+vn 0.214100 -0.841500 -0.496000
+vn 0.207500 -0.822700 -0.529200
+vn 0.229700 -0.831200 -0.506300
+vn 0.234600 -0.850000 -0.471600
+vn 0.216600 -0.860400 -0.461200
+vn 0.254800 -0.857600 -0.446600
+vn 0.235300 -0.869000 -0.435300
+vn 0.251600 -0.838700 -0.482900
+vn 0.273300 -0.845400 -0.458900
+vn 0.197700 -0.870000 -0.451600
+vn 0.214800 -0.879400 -0.424900
+vn 0.257700 -0.808600 -0.528900
+vn 0.244200 -0.820200 -0.517300
+vn 0.220600 -0.812800 -0.539100
+vn 0.232800 -0.802300 -0.549600
+vn 0.244000 -0.791300 -0.560700
+vn 0.270100 -0.796400 -0.541100
+vn 0.254100 -0.779700 -0.572200
+vn 0.281300 -0.783600 -0.553900
+vn 0.295800 -0.800600 -0.521000
+vn 0.282300 -0.814000 -0.507600
+vn 0.321300 -0.804000 -0.500300
+vn 0.306600 -0.818500 -0.485800
+vn 0.308100 -0.786600 -0.535000
+vn 0.334700 -0.788800 -0.515500
+vn 0.267600 -0.826700 -0.494900
+vn 0.290600 -0.832300 -0.472000
+vn 0.300100 -0.756600 -0.580800
+vn 0.291400 -0.770300 -0.567200
+vn 0.263200 -0.767700 -0.584200
+vn 0.271100 -0.755400 -0.596500
+vn 0.277900 -0.742700 -0.609200
+vn 0.307600 -0.742600 -0.594900
+vn 0.283500 -0.729700 -0.622200
+vn 0.313800 -0.728200 -0.609300
+vn 0.336900 -0.741700 -0.579900
+vn 0.328700 -0.757100 -0.564500
+vn 0.365900 -0.740000 -0.564300
+vn 0.357100 -0.756700 -0.547600
+vn 0.343700 -0.725900 -0.595700
+vn 0.373300 -0.722900 -0.581400
+vn 0.319200 -0.772100 -0.549500
+vn 0.346600 -0.773000 -0.531300
+vn 0.322100 -0.698700 -0.638800
+vn 0.318600 -0.713500 -0.624000
+vn 0.287800 -0.716400 -0.635500
+vn 0.291000 -0.703100 -0.648900
+vn 0.292800 -0.689600 -0.662300
+vn 0.324100 -0.683800 -0.653700
+vn 0.293500 -0.676000 -0.676000
+vn 0.324800 -0.668800 -0.668800
+vn 0.355100 -0.677300 -0.644300
+vn 0.352800 -0.693700 -0.627900
+vn 0.385600 -0.670100 -0.634200
+vn 0.383200 -0.687800 -0.616500
+vn 0.355800 -0.660800 -0.660800
+vn 0.386500 -0.652200 -0.652200
+vn 0.349000 -0.709900 -0.611700
+vn 0.379000 -0.705400 -0.598900
+vn 0.322100 -0.638800 -0.698700
+vn 0.324100 -0.653700 -0.683800
+vn 0.292800 -0.662300 -0.689600
+vn 0.291000 -0.648900 -0.703100
+vn 0.287800 -0.635500 -0.716400
+vn 0.318600 -0.624000 -0.713500
+vn 0.283500 -0.622200 -0.729700
+vn 0.313800 -0.609300 -0.728200
+vn 0.349000 -0.611700 -0.709900
+vn 0.352800 -0.627900 -0.693700
+vn 0.379000 -0.598900 -0.705400
+vn 0.383200 -0.616500 -0.687800
+vn 0.343700 -0.595700 -0.725900
+vn 0.373300 -0.581400 -0.722900
+vn 0.355100 -0.644300 -0.677300
+vn 0.385600 -0.634200 -0.670100
+vn 0.300100 -0.580800 -0.756600
+vn 0.307600 -0.594900 -0.742600
+vn 0.277900 -0.609200 -0.742700
+vn 0.271100 -0.596500 -0.755400
+vn 0.263200 -0.584200 -0.767700
+vn 0.291400 -0.567200 -0.770300
+vn 0.254100 -0.572200 -0.779700
+vn 0.281300 -0.553900 -0.783600
+vn 0.319200 -0.549500 -0.772100
+vn 0.328700 -0.564500 -0.757100
+vn 0.346600 -0.531300 -0.773000
+vn 0.357100 -0.547600 -0.756700
+vn 0.308100 -0.535000 -0.786600
+vn 0.334700 -0.515500 -0.788800
+vn 0.336900 -0.579900 -0.741700
+vn 0.365900 -0.564300 -0.740000
+vn 0.257700 -0.528900 -0.808600
+vn 0.270100 -0.541100 -0.796400
+vn 0.244000 -0.560600 -0.791300
+vn 0.232800 -0.549600 -0.802300
+vn 0.220600 -0.539100 -0.812800
+vn 0.244200 -0.517300 -0.820200
+vn 0.207500 -0.529200 -0.822700
+vn 0.229700 -0.506300 -0.831200
+vn 0.267600 -0.494900 -0.826700
+vn 0.282300 -0.507600 -0.814000
+vn 0.290600 -0.472000 -0.832300
+vn 0.306600 -0.485800 -0.818500
+vn 0.251600 -0.482900 -0.838700
+vn 0.273300 -0.458900 -0.845400
+vn 0.295800 -0.521000 -0.800600
+vn 0.321300 -0.500300 -0.804000
+vn 0.197700 -0.486500 -0.851000
+vn 0.214100 -0.496000 -0.841500
+vn 0.193500 -0.519900 -0.832000
+vn 0.178700 -0.511300 -0.840600
+vn 0.163100 -0.503400 -0.848500
+vn 0.180500 -0.477800 -0.859700
+vn 0.146700 -0.496200 -0.855700
+vn 0.162400 -0.469800 -0.867700
+vn 0.197700 -0.451600 -0.870000
+vn 0.216600 -0.461200 -0.860400
+vn 0.214800 -0.424900 -0.879400
+vn 0.235300 -0.435300 -0.869000
+vn 0.177900 -0.442900 -0.878700
+vn 0.193200 -0.415500 -0.888800
+vn 0.234600 -0.471600 -0.850000
+vn 0.254800 -0.446700 -0.857600
+vn 0.124300 -0.456500 -0.880900
+vn 0.143600 -0.462700 -0.874800
+vn 0.129700 -0.489800 -0.862100
+vn 0.112300 -0.484200 -0.867700
+vn 0.094400 -0.479400 -0.872500
+vn 0.104400 -0.451200 -0.886300
+vn 0.075900 -0.475500 -0.876400
+vn 0.084000 -0.446900 -0.890600
+vn 0.114400 -0.422600 -0.899100
+vn 0.136200 -0.428300 -0.893300
+vn 0.124300 -0.393400 -0.910900
+vn 0.147900 -0.399700 -0.904600
+vn 0.092100 -0.417800 -0.903900
+vn 0.100000 -0.388200 -0.916100
+vn 0.157300 -0.435100 -0.886500
+vn 0.170900 -0.407000 -0.897300
+vn 0.042400 -0.441000 -0.896500
+vn 0.063300 -0.443500 -0.894000
+vn 0.057200 -0.472400 -0.879500
+vn 0.038300 -0.470200 -0.881700
+vn 0.019200 -0.468900 -0.883000
+vn 0.021300 -0.439500 -0.897900
+vn 0.000000 -0.468400 -0.883500
+vn 0.000000 -0.439000 -0.898400
+vn 0.023300 -0.409700 -0.911900
+vn 0.046400 -0.411300 -0.910300
+vn 0.025300 -0.379400 -0.924800
+vn 0.050400 -0.381200 -0.923100
+vn 0.000000 -0.409200 -0.912400
+vn 0.000000 -0.378900 -0.925400
+vn 0.069400 -0.414000 -0.907600
+vn 0.075300 -0.384100 -0.920200
+vn -0.042400 -0.441000 -0.896500
+vn -0.021300 -0.439500 -0.897900
+vn -0.019200 -0.468900 -0.883000
+vn -0.038300 -0.470200 -0.881700
+vn -0.057200 -0.472400 -0.879500
+vn -0.063300 -0.443500 -0.894000
+vn -0.075900 -0.475500 -0.876400
+vn -0.084000 -0.446900 -0.890600
+vn -0.069400 -0.414000 -0.907600
+vn -0.046400 -0.411300 -0.910300
+vn -0.075300 -0.384100 -0.920200
+vn -0.050400 -0.381200 -0.923100
+vn -0.092100 -0.417800 -0.903900
+vn -0.100000 -0.388200 -0.916100
+vn -0.023300 -0.409700 -0.911900
+vn -0.025300 -0.379400 -0.924800
+vn -0.124300 -0.456500 -0.880900
+vn -0.104400 -0.451200 -0.886300
+vn -0.094400 -0.479400 -0.872500
+vn -0.112300 -0.484200 -0.867700
+vn -0.129700 -0.489800 -0.862100
+vn -0.143600 -0.462700 -0.874800
+vn -0.146700 -0.496200 -0.855700
+vn -0.162400 -0.469800 -0.867700
+vn -0.157300 -0.435100 -0.886500
+vn -0.136200 -0.428300 -0.893300
+vn -0.170900 -0.407000 -0.897300
+vn -0.147900 -0.399700 -0.904600
+vn -0.177900 -0.442900 -0.878700
+vn -0.193200 -0.415500 -0.888800
+vn -0.114400 -0.422600 -0.899100
+vn -0.124300 -0.393400 -0.910900
+vn -0.197700 -0.486500 -0.851000
+vn -0.180500 -0.477800 -0.859700
+vn -0.163100 -0.503400 -0.848500
+vn -0.178600 -0.511300 -0.840600
+vn -0.193500 -0.519900 -0.832000
+vn -0.214100 -0.496000 -0.841500
+vn -0.207500 -0.529200 -0.822700
+vn -0.229700 -0.506300 -0.831200
+vn -0.234600 -0.471600 -0.850000
+vn -0.216600 -0.461200 -0.860400
+vn -0.254800 -0.446700 -0.857600
+vn -0.235300 -0.435300 -0.869000
+vn -0.251600 -0.482900 -0.838700
+vn -0.273300 -0.458900 -0.845400
+vn -0.197700 -0.451600 -0.870000
+vn -0.214800 -0.424900 -0.879400
+vn -0.257700 -0.528900 -0.808600
+vn -0.244200 -0.517300 -0.820200
+vn -0.220600 -0.539100 -0.812800
+vn -0.232800 -0.549600 -0.802300
+vn -0.244000 -0.560700 -0.791300
+vn -0.270100 -0.541100 -0.796400
+vn -0.254100 -0.572200 -0.779700
+vn -0.281300 -0.553900 -0.783600
+vn -0.295800 -0.521000 -0.800600
+vn -0.282300 -0.507600 -0.814000
+vn -0.321300 -0.500300 -0.804000
+vn -0.306600 -0.485800 -0.818500
+vn -0.308100 -0.535000 -0.786600
+vn -0.334700 -0.515500 -0.788800
+vn -0.267600 -0.494900 -0.826700
+vn -0.290600 -0.472000 -0.832300
+vn -0.300100 -0.580800 -0.756600
+vn -0.291400 -0.567200 -0.770300
+vn -0.263200 -0.584200 -0.767700
+vn -0.271100 -0.596500 -0.755400
+vn -0.277900 -0.609200 -0.742700
+vn -0.307600 -0.594900 -0.742600
+vn -0.283500 -0.622200 -0.729700
+vn -0.313800 -0.609300 -0.728200
+vn -0.336900 -0.579900 -0.741700
+vn -0.328700 -0.564500 -0.757100
+vn -0.365900 -0.564300 -0.740000
+vn -0.357100 -0.547600 -0.756700
+vn -0.343700 -0.595700 -0.725900
+vn -0.373300 -0.581400 -0.722900
+vn -0.319200 -0.549500 -0.772100
+vn -0.346600 -0.531300 -0.773000
+vn -0.322100 -0.638800 -0.698700
+vn -0.318600 -0.624000 -0.713500
+vn -0.287800 -0.635500 -0.716400
+vn -0.291000 -0.648900 -0.703100
+vn -0.292800 -0.662300 -0.689600
+vn -0.324100 -0.653700 -0.683800
+vn -0.293500 -0.676000 -0.676000
+vn -0.324800 -0.668800 -0.668800
+vn -0.355100 -0.644300 -0.677300
+vn -0.352800 -0.627900 -0.693700
+vn -0.385600 -0.634200 -0.670100
+vn -0.383200 -0.616500 -0.687800
+vn -0.355800 -0.660800 -0.660800
+vn -0.386500 -0.652200 -0.652200
+vn -0.349000 -0.611700 -0.709900
+vn -0.379000 -0.598900 -0.705400
+vn -0.322100 -0.698700 -0.638800
+vn -0.324100 -0.683800 -0.653700
+vn -0.292800 -0.689600 -0.662300
+vn -0.291000 -0.703100 -0.648900
+vn -0.287800 -0.716400 -0.635500
+vn -0.318600 -0.713500 -0.624000
+vn -0.349000 -0.709900 -0.611700
+vn -0.352800 -0.693700 -0.627900
+vn -0.379000 -0.705400 -0.598900
+vn -0.383200 -0.687800 -0.616500
+vn -0.355100 -0.677300 -0.644300
+vn -0.385600 -0.670100 -0.634200
+vn -0.412400 -0.753500 -0.511900
+vn -0.422700 -0.734200 -0.531200
+vn -0.394500 -0.737500 -0.548000
+vn -0.385000 -0.755500 -0.530000
+vn -0.431200 -0.714400 -0.551000
+vn -0.402500 -0.719000 -0.566500
+vn -0.373700 -0.773100 -0.512500
+vn -0.400400 -0.772300 -0.493200
+vn -0.360900 -0.790100 -0.495500
+vn -0.386500 -0.790600 -0.474900
+vn -0.426600 -0.770700 -0.473300
+vn -0.439400 -0.750700 -0.493300
+vn -0.452300 -0.768300 -0.452900
+vn -0.465900 -0.747100 -0.474100
+vn -0.411800 -0.790200 -0.453900
+vn -0.436700 -0.788900 -0.432300
+vn -0.450300 -0.730200 -0.513900
+vn -0.459400 -0.709000 -0.535000
+vn -0.477500 -0.725300 -0.495900
+vn -0.487100 -0.702900 -0.518300
+vn -0.354100 -0.824900 -0.440600
+vn -0.371100 -0.808100 -0.457400
+vn -0.346400 -0.806500 -0.479000
+vn -0.330600 -0.822100 -0.463400
+vn -0.313300 -0.837000 -0.448500
+vn -0.335600 -0.840800 -0.424700
+vn -0.294600 -0.851100 -0.434400
+vn -0.315600 -0.855900 -0.409600
+vn -0.357600 -0.843700 -0.400300
+vn -0.377300 -0.826700 -0.417300
+vn -0.379200 -0.845700 -0.375500
+vn -0.400100 -0.827700 -0.393500
+vn -0.336300 -0.859800 -0.384200
+vn -0.356500 -0.862700 -0.358500
+vn -0.395400 -0.808900 -0.435100
+vn -0.419200 -0.808700 -0.412500
+vn -0.271700 -0.883100 -0.382300
+vn -0.294300 -0.870100 -0.395400
+vn -0.274700 -0.864300 -0.421200
+vn -0.253600 -0.876500 -0.409000
+vn -0.231500 -0.887800 -0.397800
+vn -0.248000 -0.895200 -0.370300
+vn -0.208300 -0.897900 -0.387600
+vn -0.223200 -0.906100 -0.359400
+vn -0.264300 -0.901600 -0.342400
+vn -0.289500 -0.888800 -0.355200
+vn -0.280200 -0.907100 -0.314200
+vn -0.307000 -0.893500 -0.327700
+vn -0.237800 -0.913200 -0.330800
+vn -0.252100 -0.919400 -0.301800
+vn -0.313500 -0.874900 -0.369200
+vn -0.332400 -0.878700 -0.342500
+vn -0.170800 -0.924300 -0.341100
+vn -0.197400 -0.915800 -0.349600
+vn -0.184200 -0.907000 -0.378500
+vn -0.159400 -0.915000 -0.370600
+vn -0.134000 -0.921800 -0.363800
+vn -0.143500 -0.931600 -0.333900
+vn -0.107800 -0.927400 -0.358200
+vn -0.115500 -0.937600 -0.327900
+vn -0.152900 -0.940400 -0.303600
+vn -0.182000 -0.932700 -0.311300
+vn -0.162100 -0.948200 -0.273000
+vn -0.193000 -0.940000 -0.281200
+vn -0.123100 -0.946800 -0.297200
+vn -0.130500 -0.955000 -0.266200
+vn -0.210300 -0.923600 -0.320400
+vn -0.223000 -0.930400 -0.290800
+vn -0.058300 -0.945700 -0.319800
+vn -0.087000 -0.942300 -0.323200
+vn -0.081200 -0.931800 -0.353800
+vn -0.054400 -0.934900 -0.350700
+vn -0.027300 -0.936800 -0.348800
+vn -0.029200 -0.947700 -0.317800
+vn 0.000000 -0.937400 -0.348200
+vn 0.000000 -0.948400 -0.317100
+vn -0.031200 -0.957600 -0.286400
+vn -0.062100 -0.955400 -0.288600
+vn -0.033100 -0.966400 -0.254800
+vn -0.065800 -0.964100 -0.257100
+vn 0.000000 -0.958300 -0.285700
+vn 0.000000 -0.967200 -0.254000
+vn -0.092700 -0.951800 -0.292200
+vn -0.098300 -0.960300 -0.260900
+vn 0.058300 -0.945700 -0.319800
+vn 0.029200 -0.947700 -0.317800
+vn 0.027300 -0.936800 -0.348800
+vn 0.054400 -0.934900 -0.350700
+vn 0.081200 -0.931800 -0.353800
+vn 0.087000 -0.942300 -0.323200
+vn 0.107800 -0.927400 -0.358200
+vn 0.115500 -0.937600 -0.327900
+vn 0.092700 -0.951800 -0.292200
+vn 0.062100 -0.955400 -0.288600
+vn 0.098300 -0.960300 -0.260900
+vn 0.065800 -0.964100 -0.257100
+vn 0.123100 -0.946800 -0.297200
+vn 0.130500 -0.955000 -0.266200
+vn 0.031200 -0.957600 -0.286400
+vn 0.033100 -0.966400 -0.254800
+vn 0.170800 -0.924300 -0.341100
+vn 0.143500 -0.931600 -0.333900
+vn 0.134000 -0.921800 -0.363800
+vn 0.159400 -0.915000 -0.370600
+vn 0.184200 -0.907000 -0.378500
+vn 0.197400 -0.915800 -0.349600
+vn 0.208300 -0.897900 -0.387600
+vn 0.223200 -0.906100 -0.359400
+vn 0.210300 -0.923600 -0.320400
+vn 0.182000 -0.932700 -0.311300
+vn 0.223000 -0.930400 -0.290800
+vn 0.193000 -0.940000 -0.281200
+vn 0.237800 -0.913200 -0.330800
+vn 0.252100 -0.919400 -0.301800
+vn 0.152900 -0.940400 -0.303600
+vn 0.162100 -0.948200 -0.273000
+vn 0.271700 -0.883100 -0.382300
+vn 0.248000 -0.895100 -0.370300
+vn 0.231500 -0.887800 -0.397800
+vn 0.253600 -0.876500 -0.409000
+vn 0.274700 -0.864300 -0.421200
+vn 0.294300 -0.870100 -0.395400
+vn 0.294600 -0.851100 -0.434400
+vn 0.315600 -0.855900 -0.409600
+vn 0.313500 -0.874900 -0.369200
+vn 0.289500 -0.888800 -0.355200
+vn 0.332400 -0.878700 -0.342500
+vn 0.307000 -0.893500 -0.327700
+vn 0.336300 -0.859800 -0.384200
+vn 0.356500 -0.862700 -0.358500
+vn 0.264300 -0.901600 -0.342400
+vn 0.280200 -0.907100 -0.314200
+vn 0.354100 -0.824900 -0.440600
+vn 0.335600 -0.840800 -0.424700
+vn 0.313300 -0.837000 -0.448500
+vn 0.330600 -0.822100 -0.463400
+vn 0.346400 -0.806500 -0.479000
+vn 0.371100 -0.808100 -0.457400
+vn 0.360900 -0.790100 -0.495500
+vn 0.386500 -0.790600 -0.474900
+vn 0.395400 -0.808900 -0.435100
+vn 0.377300 -0.826700 -0.417300
+vn 0.419200 -0.808700 -0.412500
+vn 0.400100 -0.827700 -0.393500
+vn 0.411800 -0.790200 -0.453900
+vn 0.436700 -0.788900 -0.432300
+vn 0.357600 -0.843700 -0.400300
+vn 0.379200 -0.845700 -0.375500
+vn 0.412400 -0.753500 -0.511900
+vn 0.400400 -0.772300 -0.493200
+vn 0.373700 -0.773100 -0.512500
+vn 0.385000 -0.755500 -0.530000
+vn 0.394500 -0.737500 -0.548000
+vn 0.422700 -0.734200 -0.531200
+vn 0.402500 -0.719000 -0.566500
+vn 0.431200 -0.714400 -0.551000
+vn 0.450300 -0.730200 -0.513900
+vn 0.439400 -0.750700 -0.493300
+vn 0.477500 -0.725300 -0.495900
+vn 0.465900 -0.747100 -0.474100
+vn 0.459400 -0.709000 -0.535000
+vn 0.487100 -0.702900 -0.518300
+vn 0.426600 -0.770700 -0.473300
+vn 0.452300 -0.768300 -0.452900
+vn 0.442500 -0.673900 -0.591500
+vn 0.437800 -0.694300 -0.571200
+vn 0.408700 -0.700200 -0.585300
+vn 0.413100 -0.681200 -0.604300
+vn 0.415800 -0.662100 -0.623500
+vn 0.445400 -0.653400 -0.612000
+vn 0.416700 -0.642800 -0.642800
+vn 0.446400 -0.632700 -0.632700
+vn 0.474500 -0.644100 -0.600000
+vn 0.471500 -0.665900 -0.578100
+vn 0.503200 -0.634000 -0.587200
+vn 0.500000 -0.657200 -0.564000
+vn 0.475600 -0.622000 -0.622000
+vn 0.504300 -0.610600 -0.610600
+vn 0.466400 -0.687600 -0.556400
+vn 0.494600 -0.680100 -0.541100
+vn 0.442500 -0.591500 -0.673900
+vn 0.445400 -0.612000 -0.653400
+vn 0.415800 -0.623500 -0.662100
+vn 0.413100 -0.604300 -0.681200
+vn 0.408700 -0.585300 -0.700200
+vn 0.437800 -0.571200 -0.694300
+vn 0.402500 -0.566500 -0.719000
+vn 0.431200 -0.551000 -0.714400
+vn 0.466400 -0.556400 -0.687600
+vn 0.471500 -0.578100 -0.665900
+vn 0.494600 -0.541100 -0.680100
+vn 0.500000 -0.564000 -0.657200
+vn 0.459400 -0.535000 -0.709000
+vn 0.487100 -0.518300 -0.702900
+vn 0.474500 -0.600000 -0.644100
+vn 0.503200 -0.587200 -0.634000
+vn 0.412400 -0.511900 -0.753500
+vn 0.422700 -0.531200 -0.734200
+vn 0.394500 -0.548000 -0.737500
+vn 0.385000 -0.530000 -0.755500
+vn 0.373700 -0.512500 -0.773100
+vn 0.400400 -0.493200 -0.772300
+vn 0.360900 -0.495500 -0.790100
+vn 0.386500 -0.474900 -0.790600
+vn 0.426600 -0.473300 -0.770700
+vn 0.439400 -0.493300 -0.750700
+vn 0.452300 -0.452900 -0.768300
+vn 0.465900 -0.474100 -0.747100
+vn 0.411800 -0.453900 -0.790200
+vn 0.436700 -0.432300 -0.788900
+vn 0.450300 -0.513900 -0.730200
+vn 0.477500 -0.495900 -0.725300
+vn 0.354100 -0.440600 -0.824900
+vn 0.371100 -0.457400 -0.808100
+vn 0.346400 -0.479000 -0.806500
+vn 0.330600 -0.463400 -0.822100
+vn 0.313300 -0.448500 -0.837000
+vn 0.335600 -0.424700 -0.840800
+vn 0.294600 -0.434400 -0.851100
+vn 0.315600 -0.409600 -0.855900
+vn 0.357600 -0.400300 -0.843700
+vn 0.377300 -0.417300 -0.826700
+vn 0.379200 -0.375500 -0.845700
+vn 0.400100 -0.393500 -0.827700
+vn 0.336300 -0.384200 -0.859800
+vn 0.356500 -0.358500 -0.862700
+vn 0.395400 -0.435100 -0.808900
+vn 0.419200 -0.412500 -0.808700
+vn 0.271700 -0.382300 -0.883100
+vn 0.294300 -0.395400 -0.870100
+vn 0.274700 -0.421200 -0.864300
+vn 0.253600 -0.409000 -0.876500
+vn 0.231500 -0.397800 -0.887800
+vn 0.248000 -0.370300 -0.895100
+vn 0.208300 -0.387600 -0.897900
+vn 0.223200 -0.359400 -0.906100
+vn 0.264300 -0.342400 -0.901600
+vn 0.289500 -0.355200 -0.888800
+vn 0.280200 -0.314200 -0.907100
+vn 0.307000 -0.327700 -0.893500
+vn 0.237800 -0.330800 -0.913200
+vn 0.252100 -0.301800 -0.919400
+vn 0.313500 -0.369200 -0.874900
+vn 0.332400 -0.342500 -0.878700
+vn 0.170800 -0.341100 -0.924300
+vn 0.197400 -0.349600 -0.915800
+vn 0.184200 -0.378500 -0.907000
+vn 0.159400 -0.370600 -0.915000
+vn 0.134000 -0.363800 -0.921800
+vn 0.143500 -0.333900 -0.931600
+vn 0.107800 -0.358200 -0.927400
+vn 0.115500 -0.327900 -0.937600
+vn 0.152900 -0.303600 -0.940400
+vn 0.182000 -0.311300 -0.932700
+vn 0.162100 -0.273000 -0.948200
+vn 0.193000 -0.281200 -0.940000
+vn 0.123100 -0.297200 -0.946800
+vn 0.130500 -0.266200 -0.955000
+vn 0.210300 -0.320400 -0.923600
+vn 0.223000 -0.290800 -0.930400
+vn 0.058300 -0.319800 -0.945700
+vn 0.087000 -0.323200 -0.942300
+vn 0.081200 -0.353800 -0.931800
+vn 0.054400 -0.350700 -0.934900
+vn 0.027300 -0.348800 -0.936800
+vn 0.029200 -0.317800 -0.947700
+vn 0.000000 -0.348200 -0.937400
+vn 0.000000 -0.317100 -0.948400
+vn 0.031200 -0.286400 -0.957600
+vn 0.062100 -0.288600 -0.955400
+vn 0.033100 -0.254800 -0.966400
+vn 0.065800 -0.257100 -0.964100
+vn 0.000000 -0.285700 -0.958300
+vn 0.000000 -0.254000 -0.967200
+vn 0.092700 -0.292200 -0.951800
+vn 0.098300 -0.260900 -0.960300
+vn -0.058300 -0.319800 -0.945700
+vn -0.029200 -0.317800 -0.947700
+vn -0.027300 -0.348800 -0.936800
+vn -0.054400 -0.350700 -0.934900
+vn -0.081200 -0.353800 -0.931800
+vn -0.087000 -0.323200 -0.942300
+vn -0.107800 -0.358200 -0.927400
+vn -0.115500 -0.327900 -0.937600
+vn -0.092700 -0.292200 -0.951800
+vn -0.062100 -0.288600 -0.955400
+vn -0.098300 -0.260900 -0.960300
+vn -0.065800 -0.257100 -0.964100
+vn -0.123100 -0.297200 -0.946800
+vn -0.130500 -0.266200 -0.955000
+vn -0.031200 -0.286400 -0.957600
+vn -0.033100 -0.254800 -0.966400
+vn -0.170800 -0.341100 -0.924300
+vn -0.143500 -0.333900 -0.931600
+vn -0.134000 -0.363800 -0.921800
+vn -0.159400 -0.370600 -0.915000
+vn -0.184200 -0.378500 -0.907000
+vn -0.197400 -0.349600 -0.915800
+vn -0.208300 -0.387600 -0.897900
+vn -0.223200 -0.359400 -0.906100
+vn -0.210300 -0.320400 -0.923600
+vn -0.182000 -0.311300 -0.932700
+vn -0.223000 -0.290800 -0.930400
+vn -0.193000 -0.281200 -0.940000
+vn -0.237800 -0.330800 -0.913200
+vn -0.252100 -0.301800 -0.919400
+vn -0.152900 -0.303600 -0.940400
+vn -0.162100 -0.273000 -0.948200
+vn -0.271700 -0.382300 -0.883100
+vn -0.248000 -0.370300 -0.895100
+vn -0.231500 -0.397800 -0.887800
+vn -0.253600 -0.409000 -0.876500
+vn -0.274700 -0.421200 -0.864300
+vn -0.294300 -0.395400 -0.870100
+vn -0.294600 -0.434400 -0.851100
+vn -0.315600 -0.409600 -0.855900
+vn -0.313500 -0.369200 -0.874900
+vn -0.289500 -0.355200 -0.888800
+vn -0.332400 -0.342500 -0.878700
+vn -0.307000 -0.327700 -0.893500
+vn -0.336300 -0.384200 -0.859800
+vn -0.356500 -0.358500 -0.862700
+vn -0.264300 -0.342400 -0.901600
+vn -0.280200 -0.314200 -0.907100
+vn -0.354100 -0.440600 -0.824900
+vn -0.335600 -0.424700 -0.840800
+vn -0.313300 -0.448500 -0.837000
+vn -0.330600 -0.463400 -0.822100
+vn -0.346400 -0.479000 -0.806500
+vn -0.371100 -0.457400 -0.808100
+vn -0.360900 -0.495500 -0.790100
+vn -0.386500 -0.474900 -0.790600
+vn -0.395400 -0.435100 -0.808900
+vn -0.377300 -0.417300 -0.826700
+vn -0.419200 -0.412500 -0.808700
+vn -0.400100 -0.393500 -0.827700
+vn -0.411800 -0.453900 -0.790200
+vn -0.436700 -0.432300 -0.788900
+vn -0.357600 -0.400300 -0.843700
+vn -0.379200 -0.375500 -0.845700
+vn -0.412400 -0.511900 -0.753500
+vn -0.400400 -0.493200 -0.772300
+vn -0.373700 -0.512500 -0.773100
+vn -0.385000 -0.530000 -0.755500
+vn -0.394500 -0.548000 -0.737500
+vn -0.422700 -0.531200 -0.734200
+vn -0.402500 -0.566500 -0.719000
+vn -0.431200 -0.551000 -0.714400
+vn -0.450300 -0.513900 -0.730200
+vn -0.439400 -0.493300 -0.750700
+vn -0.477500 -0.495900 -0.725300
+vn -0.465900 -0.474100 -0.747100
+vn -0.459400 -0.535000 -0.709000
+vn -0.487100 -0.518300 -0.702900
+vn -0.426600 -0.473300 -0.770700
+vn -0.452300 -0.452900 -0.768300
+vn -0.442500 -0.591500 -0.673900
+vn -0.437800 -0.571200 -0.694300
+vn -0.408700 -0.585300 -0.700200
+vn -0.413100 -0.604300 -0.681200
+vn -0.415800 -0.623500 -0.662100
+vn -0.445400 -0.612000 -0.653400
+vn -0.416700 -0.642800 -0.642800
+vn -0.446400 -0.632700 -0.632700
+vn -0.474500 -0.600000 -0.644100
+vn -0.471500 -0.578100 -0.665900
+vn -0.503200 -0.587200 -0.634000
+vn -0.500000 -0.564000 -0.657200
+vn -0.475600 -0.622000 -0.622000
+vn -0.504300 -0.610600 -0.610600
+vn -0.466400 -0.556400 -0.687600
+vn -0.494600 -0.541100 -0.680100
+vn -0.442500 -0.673900 -0.591500
+vn -0.445400 -0.653400 -0.612000
+vn -0.415800 -0.662100 -0.623500
+vn -0.413100 -0.681200 -0.604300
+vn -0.408700 -0.700200 -0.585300
+vn -0.437800 -0.694300 -0.571200
+vn -0.466400 -0.687600 -0.556400
+vn -0.471500 -0.665900 -0.578100
+vn -0.494600 -0.680100 -0.541100
+vn -0.500000 -0.657200 -0.564000
+vn -0.474500 -0.644100 -0.600000
+vn -0.503200 -0.634000 -0.587200
+vn -0.517300 -0.737400 -0.434300
+vn -0.530200 -0.713200 -0.458500
+vn -0.504100 -0.719600 -0.477500
+vn -0.491900 -0.742600 -0.454500
+vn -0.540800 -0.688300 -0.483400
+vn -0.514200 -0.696000 -0.501100
+vn -0.477500 -0.765000 -0.432100
+vn -0.502200 -0.760900 -0.410800
+vn -0.461100 -0.786800 -0.410300
+vn -0.484900 -0.783800 -0.387900
+vn -0.526300 -0.756000 -0.389100
+vn -0.542100 -0.731300 -0.413800
+vn -0.549900 -0.750300 -0.366900
+vn -0.566400 -0.724500 -0.392700
+vn -0.508200 -0.780000 -0.365100
+vn -0.530900 -0.775400 -0.341900
+vn -0.555600 -0.706000 -0.439100
+vn -0.566800 -0.680000 -0.465200
+vn -0.580500 -0.698000 -0.419200
+vn -0.592200 -0.670800 -0.446400
+vn -0.444200 -0.826900 -0.344800
+vn -0.465500 -0.805900 -0.365900
+vn -0.442600 -0.807700 -0.389400
+vn -0.422400 -0.827700 -0.369400
+vn -0.400300 -0.846700 -0.350400
+vn -0.421000 -0.846900 -0.324800
+vn -0.376400 -0.864700 -0.332300
+vn -0.395900 -0.865800 -0.305900
+vn -0.441200 -0.846100 -0.299000
+vn -0.465500 -0.825200 -0.320000
+vn -0.461000 -0.844400 -0.272800
+vn -0.486400 -0.822500 -0.294700
+vn -0.414900 -0.866000 -0.279200
+vn -0.433500 -0.865200 -0.252100
+vn -0.487800 -0.803100 -0.342000
+vn -0.509700 -0.799500 -0.317700
+vn -0.340800 -0.900000 -0.271700
+vn -0.369100 -0.883600 -0.288200
+vn -0.351000 -0.881600 -0.315500
+vn -0.324100 -0.897200 -0.299900
+vn -0.295800 -0.911500 -0.285500
+vn -0.311100 -0.915000 -0.256700
+vn -0.266200 -0.924600 -0.272500
+vn -0.279900 -0.928700 -0.243000
+vn -0.326100 -0.917500 -0.227600
+vn -0.357200 -0.901700 -0.243400
+vn -0.340700 -0.919000 -0.198200
+vn -0.373200 -0.902600 -0.214700
+vn -0.293400 -0.931900 -0.213200
+vn -0.306500 -0.934000 -0.183200
+vn -0.386800 -0.884500 -0.260500
+vn -0.404200 -0.884600 -0.232600
+vn -0.214300 -0.951600 -0.220100
+vn -0.247600 -0.941000 -0.230800
+vn -0.235400 -0.936200 -0.260900
+vn -0.203700 -0.946300 -0.250700
+vn -0.171200 -0.955000 -0.242100
+vn -0.180000 -0.960800 -0.211000
+vn -0.137800 -0.962200 -0.234900
+vn -0.144900 -0.968300 -0.203400
+vn -0.188700 -0.965500 -0.179700
+vn -0.224600 -0.955900 -0.189200
+vn -0.197100 -0.969100 -0.148100
+vn -0.234600 -0.959100 -0.158100
+vn -0.151900 -0.973400 -0.171800
+vn -0.158700 -0.977400 -0.139900
+vn -0.259400 -0.944700 -0.200400
+vn -0.271100 -0.947400 -0.169800
+vn -0.073100 -0.978400 -0.193300
+vn -0.109100 -0.974200 -0.197500
+vn -0.103800 -0.967800 -0.229300
+vn -0.069500 -0.971800 -0.225300
+vn -0.034900 -0.974200 -0.222900
+vn -0.036700 -0.980900 -0.190800
+vn 0.000000 -0.975000 -0.222100
+vn 0.000000 -0.981800 -0.189900
+vn -0.038500 -0.986600 -0.158500
+vn -0.076600 -0.983900 -0.161200
+vn -0.040200 -0.991200 -0.126000
+vn -0.080000 -0.988400 -0.128800
+vn 0.000000 -0.987500 -0.157600
+vn 0.000000 -0.992100 -0.125100
+vn -0.114400 -0.979500 -0.165600
+vn -0.119500 -0.983800 -0.133400
+vn 0.073100 -0.978400 -0.193300
+vn 0.036700 -0.980900 -0.190800
+vn 0.034900 -0.974200 -0.222900
+vn 0.069500 -0.971800 -0.225300
+vn 0.103800 -0.967800 -0.229300
+vn 0.109100 -0.974200 -0.197500
+vn 0.137800 -0.962200 -0.234900
+vn 0.144900 -0.968300 -0.203400
+vn 0.114400 -0.979500 -0.165600
+vn 0.076600 -0.983900 -0.161200
+vn 0.119500 -0.983800 -0.133400
+vn 0.080000 -0.988400 -0.128800
+vn 0.151900 -0.973400 -0.171800
+vn 0.158700 -0.977400 -0.139900
+vn 0.038500 -0.986600 -0.158500
+vn 0.040200 -0.991200 -0.126000
+vn 0.214300 -0.951600 -0.220100
+vn 0.180000 -0.960800 -0.211000
+vn 0.171200 -0.955000 -0.242100
+vn 0.203700 -0.946300 -0.250700
+vn 0.235400 -0.936200 -0.260900
+vn 0.247600 -0.941000 -0.230800
+vn 0.266200 -0.924600 -0.272500
+vn 0.279900 -0.928700 -0.243000
+vn 0.259400 -0.944700 -0.200400
+vn 0.224600 -0.955900 -0.189200
+vn 0.271100 -0.947400 -0.169800
+vn 0.234600 -0.959100 -0.158100
+vn 0.293400 -0.931900 -0.213200
+vn 0.306500 -0.934000 -0.183200
+vn 0.188700 -0.965500 -0.179700
+vn 0.197100 -0.969100 -0.148100
+vn 0.340800 -0.900000 -0.271700
+vn 0.311100 -0.915000 -0.256700
+vn 0.295800 -0.911500 -0.285600
+vn 0.324100 -0.897200 -0.299900
+vn 0.351000 -0.881600 -0.315500
+vn 0.369100 -0.883600 -0.288200
+vn 0.376400 -0.864700 -0.332300
+vn 0.395900 -0.865800 -0.305900
+vn 0.386800 -0.884500 -0.260500
+vn 0.357200 -0.901700 -0.243400
+vn 0.404200 -0.884600 -0.232600
+vn 0.373200 -0.902600 -0.214700
+vn 0.414900 -0.866000 -0.279200
+vn 0.433500 -0.865200 -0.252100
+vn 0.326100 -0.917500 -0.227600
+vn 0.340700 -0.919000 -0.198200
+vn 0.444200 -0.826900 -0.344800
+vn 0.421000 -0.846900 -0.324800
+vn 0.400300 -0.846700 -0.350400
+vn 0.422400 -0.827700 -0.369400
+vn 0.442600 -0.807700 -0.389400
+vn 0.465500 -0.805900 -0.365900
+vn 0.461100 -0.786800 -0.410300
+vn 0.484900 -0.783800 -0.387900
+vn 0.487800 -0.803100 -0.342000
+vn 0.465500 -0.825200 -0.320000
+vn 0.509700 -0.799500 -0.317700
+vn 0.486400 -0.822500 -0.294700
+vn 0.508200 -0.780000 -0.365100
+vn 0.530900 -0.775400 -0.341900
+vn 0.441200 -0.846100 -0.299000
+vn 0.461000 -0.844400 -0.272800
+vn 0.517300 -0.737400 -0.434300
+vn 0.502200 -0.760900 -0.410800
+vn 0.477500 -0.765000 -0.432100
+vn 0.491900 -0.742600 -0.454500
+vn 0.504100 -0.719600 -0.477500
+vn 0.530200 -0.713200 -0.458500
+vn 0.514200 -0.696000 -0.501100
+vn 0.540800 -0.688300 -0.483400
+vn 0.555600 -0.706000 -0.439100
+vn 0.542100 -0.731300 -0.413800
+vn 0.580500 -0.698000 -0.419200
+vn 0.566400 -0.724500 -0.392700
+vn 0.566800 -0.680000 -0.465200
+vn 0.592200 -0.670800 -0.446400
+vn 0.526300 -0.756000 -0.389100
+vn 0.549900 -0.750300 -0.366900
+vn 0.555100 -0.637500 -0.534200
+vn 0.549200 -0.663000 -0.508700
+vn 0.522200 -0.671900 -0.525100
+vn 0.527800 -0.647700 -0.549400
+vn 0.531200 -0.623200 -0.573900
+vn 0.558700 -0.611800 -0.559900
+vn 0.532400 -0.598500 -0.598500
+vn 0.559900 -0.585900 -0.585900
+vn 0.585500 -0.599700 -0.545300
+vn 0.581800 -0.626700 -0.518400
+vn 0.611700 -0.587000 -0.530200
+vn 0.607800 -0.615200 -0.502000
+vn 0.586800 -0.572600 -0.572600
+vn 0.613100 -0.558600 -0.558600
+vn 0.575500 -0.653400 -0.491700
+vn 0.601300 -0.643100 -0.474100
+vn 0.555100 -0.534200 -0.637500
+vn 0.558700 -0.559900 -0.611800
+vn 0.531200 -0.573900 -0.623200
+vn 0.527800 -0.549400 -0.647700
+vn 0.522200 -0.525100 -0.671900
+vn 0.549200 -0.508700 -0.663000
+vn 0.514200 -0.501100 -0.696000
+vn 0.540800 -0.483400 -0.688300
+vn 0.575500 -0.491700 -0.653400
+vn 0.581800 -0.518400 -0.626700
+vn 0.601300 -0.474100 -0.643100
+vn 0.607800 -0.502000 -0.615200
+vn 0.566800 -0.465200 -0.680000
+vn 0.592200 -0.446400 -0.670800
+vn 0.585500 -0.545300 -0.599700
+vn 0.611700 -0.530200 -0.587000
+vn 0.517300 -0.434300 -0.737400
+vn 0.530200 -0.458500 -0.713200
+vn 0.504100 -0.477500 -0.719600
+vn 0.491900 -0.454500 -0.742600
+vn 0.477500 -0.432100 -0.765000
+vn 0.502200 -0.410800 -0.760900
+vn 0.461100 -0.410300 -0.786800
+vn 0.484900 -0.387900 -0.783800
+vn 0.526300 -0.389100 -0.756000
+vn 0.542100 -0.413800 -0.731300
+vn 0.549900 -0.366900 -0.750300
+vn 0.566400 -0.392700 -0.724500
+vn 0.508200 -0.365100 -0.780000
+vn 0.530900 -0.341900 -0.775400
+vn 0.555600 -0.439100 -0.706000
+vn 0.580500 -0.419200 -0.698000
+vn 0.444200 -0.344800 -0.826900
+vn 0.465500 -0.365900 -0.805900
+vn 0.442600 -0.389400 -0.807700
+vn 0.422400 -0.369400 -0.827700
+vn 0.400300 -0.350400 -0.846700
+vn 0.421000 -0.324800 -0.846900
+vn 0.376400 -0.332300 -0.864700
+vn 0.395900 -0.305900 -0.865800
+vn 0.441200 -0.299000 -0.846100
+vn 0.465500 -0.320000 -0.825200
+vn 0.461000 -0.272800 -0.844400
+vn 0.486400 -0.294700 -0.822500
+vn 0.414900 -0.279200 -0.866000
+vn 0.433500 -0.252100 -0.865100
+vn 0.487800 -0.342000 -0.803100
+vn 0.509700 -0.317700 -0.799500
+vn 0.340800 -0.271700 -0.900000
+vn 0.369100 -0.288200 -0.883600
+vn 0.351000 -0.315500 -0.881600
+vn 0.324100 -0.299900 -0.897200
+vn 0.295800 -0.285600 -0.911500
+vn 0.311100 -0.256700 -0.915000
+vn 0.266200 -0.272500 -0.924600
+vn 0.279900 -0.243000 -0.928700
+vn 0.326100 -0.227600 -0.917500
+vn 0.357200 -0.243400 -0.901700
+vn 0.340700 -0.198200 -0.919000
+vn 0.373200 -0.214700 -0.902600
+vn 0.293400 -0.213200 -0.931900
+vn 0.306500 -0.183200 -0.934000
+vn 0.386800 -0.260500 -0.884500
+vn 0.404200 -0.232600 -0.884600
+vn 0.214300 -0.220100 -0.951600
+vn 0.247600 -0.230800 -0.941000
+vn 0.235400 -0.260900 -0.936200
+vn 0.203700 -0.250700 -0.946300
+vn 0.171200 -0.242100 -0.955000
+vn 0.180000 -0.211000 -0.960800
+vn 0.137800 -0.234900 -0.962200
+vn 0.144900 -0.203400 -0.968300
+vn 0.188700 -0.179700 -0.965500
+vn 0.224600 -0.189200 -0.955900
+vn 0.197100 -0.148100 -0.969100
+vn 0.234600 -0.158100 -0.959100
+vn 0.151900 -0.171800 -0.973400
+vn 0.158700 -0.139900 -0.977400
+vn 0.259400 -0.200400 -0.944700
+vn 0.271100 -0.169800 -0.947400
+vn 0.073100 -0.193300 -0.978400
+vn 0.109100 -0.197500 -0.974200
+vn 0.103800 -0.229300 -0.967800
+vn 0.069500 -0.225300 -0.971800
+vn 0.034900 -0.222900 -0.974200
+vn 0.036700 -0.190800 -0.980900
+vn 0.000000 -0.222100 -0.975000
+vn 0.000000 -0.189900 -0.981800
+vn 0.038500 -0.158500 -0.986600
+vn 0.076600 -0.161200 -0.983900
+vn 0.040200 -0.126000 -0.991200
+vn 0.080000 -0.128800 -0.988400
+vn 0.000000 -0.157600 -0.987500
+vn 0.000000 -0.125100 -0.992100
+vn 0.114400 -0.165600 -0.979500
+vn 0.119500 -0.133400 -0.983800
+vn -0.073100 -0.193300 -0.978400
+vn -0.036700 -0.190800 -0.980900
+vn -0.034900 -0.222900 -0.974200
+vn -0.069500 -0.225300 -0.971800
+vn -0.103800 -0.229300 -0.967800
+vn -0.109100 -0.197500 -0.974200
+vn -0.137800 -0.234900 -0.962200
+vn -0.144900 -0.203400 -0.968300
+vn -0.114400 -0.165600 -0.979500
+vn -0.076600 -0.161200 -0.983900
+vn -0.119500 -0.133400 -0.983800
+vn -0.080000 -0.128800 -0.988400
+vn -0.151900 -0.171800 -0.973400
+vn -0.158700 -0.139900 -0.977400
+vn -0.038500 -0.158500 -0.986600
+vn -0.040200 -0.126000 -0.991200
+vn -0.214300 -0.220100 -0.951600
+vn -0.180000 -0.211000 -0.960800
+vn -0.171200 -0.242100 -0.955000
+vn -0.203700 -0.250700 -0.946300
+vn -0.235400 -0.260900 -0.936200
+vn -0.247600 -0.230800 -0.941000
+vn -0.266200 -0.272500 -0.924600
+vn -0.279900 -0.243000 -0.928700
+vn -0.259400 -0.200400 -0.944700
+vn -0.224600 -0.189200 -0.955900
+vn -0.271100 -0.169800 -0.947400
+vn -0.234600 -0.158100 -0.959100
+vn -0.293400 -0.213200 -0.931900
+vn -0.306500 -0.183200 -0.934000
+vn -0.188700 -0.179700 -0.965500
+vn -0.197100 -0.148100 -0.969100
+vn -0.340800 -0.271700 -0.900000
+vn -0.311100 -0.256700 -0.915000
+vn -0.295800 -0.285500 -0.911500
+vn -0.324100 -0.299900 -0.897200
+vn -0.351000 -0.315500 -0.881600
+vn -0.369100 -0.288200 -0.883600
+vn -0.376400 -0.332300 -0.864700
+vn -0.395900 -0.305900 -0.865800
+vn -0.386800 -0.260500 -0.884500
+vn -0.357200 -0.243400 -0.901700
+vn -0.404200 -0.232600 -0.884600
+vn -0.373200 -0.214700 -0.902600
+vn -0.414900 -0.279200 -0.866000
+vn -0.433500 -0.252100 -0.865100
+vn -0.326100 -0.227600 -0.917500
+vn -0.340700 -0.198200 -0.919000
+vn -0.444200 -0.344800 -0.826900
+vn -0.421000 -0.324800 -0.846900
+vn -0.400300 -0.350400 -0.846700
+vn -0.422400 -0.369400 -0.827700
+vn -0.442600 -0.389400 -0.807700
+vn -0.465500 -0.365900 -0.805900
+vn -0.461100 -0.410300 -0.786800
+vn -0.484900 -0.387900 -0.783800
+vn -0.487800 -0.342000 -0.803100
+vn -0.465500 -0.320000 -0.825100
+vn -0.509700 -0.317700 -0.799500
+vn -0.486400 -0.294700 -0.822500
+vn -0.508200 -0.365100 -0.780000
+vn -0.530900 -0.341900 -0.775400
+vn -0.441200 -0.299000 -0.846100
+vn -0.461000 -0.272800 -0.844400
+vn -0.517300 -0.434300 -0.737400
+vn -0.502200 -0.410800 -0.760900
+vn -0.477500 -0.432100 -0.765000
+vn -0.491900 -0.454500 -0.742600
+vn -0.504100 -0.477500 -0.719600
+vn -0.530200 -0.458500 -0.713200
+vn -0.514200 -0.501100 -0.696000
+vn -0.540800 -0.483400 -0.688300
+vn -0.555600 -0.439100 -0.706000
+vn -0.542100 -0.413800 -0.731300
+vn -0.580500 -0.419200 -0.698000
+vn -0.566400 -0.392700 -0.724500
+vn -0.566800 -0.465200 -0.680000
+vn -0.592200 -0.446400 -0.670800
+vn -0.526300 -0.389100 -0.756000
+vn -0.549900 -0.366900 -0.750300
+vn -0.555100 -0.534200 -0.637500
+vn -0.549200 -0.508700 -0.663000
+vn -0.522200 -0.525200 -0.671900
+vn -0.527800 -0.549400 -0.647700
+vn -0.531200 -0.573900 -0.623200
+vn -0.558700 -0.559900 -0.611800
+vn -0.532400 -0.598500 -0.598500
+vn -0.559900 -0.585900 -0.585900
+vn -0.585500 -0.545300 -0.599700
+vn -0.581800 -0.518400 -0.626700
+vn -0.611700 -0.530200 -0.587000
+vn -0.607800 -0.502000 -0.615200
+vn -0.586800 -0.572600 -0.572600
+vn -0.613100 -0.558600 -0.558600
+vn -0.575500 -0.491700 -0.653400
+vn -0.601300 -0.474100 -0.643100
+vn -0.555100 -0.637500 -0.534200
+vn -0.558700 -0.611800 -0.559900
+vn -0.531200 -0.623200 -0.573900
+vn -0.527800 -0.647700 -0.549400
+vn -0.522200 -0.671900 -0.525100
+vn -0.549200 -0.663000 -0.508700
+vn -0.575500 -0.653400 -0.491700
+vn -0.581800 -0.626700 -0.518400
+vn -0.601300 -0.643100 -0.474100
+vn -0.607800 -0.615200 -0.502000
+vn -0.585500 -0.599700 -0.545300
+vn -0.611700 -0.587000 -0.530200
+vn -0.613000 -0.708500 -0.349500
+vn -0.628300 -0.679900 -0.378100
+vn -0.604700 -0.689300 -0.398900
+vn -0.590000 -0.716900 -0.371300
+vn -0.640900 -0.650400 -0.407600
+vn -0.616900 -0.661000 -0.427200
+vn -0.572800 -0.743800 -0.344400
+vn -0.595100 -0.736500 -0.321500
+vn -0.553100 -0.769900 -0.318300
+vn -0.574600 -0.763600 -0.294400
+vn -0.616700 -0.728400 -0.298400
+vn -0.635300 -0.699500 -0.327300
+vn -0.637700 -0.719500 -0.274800
+vn -0.656900 -0.689600 -0.304800
+vn -0.595500 -0.756500 -0.270200
+vn -0.615800 -0.748600 -0.245800
+vn -0.651100 -0.669700 -0.357000
+vn -0.664200 -0.639200 -0.387500
+vn -0.673300 -0.658900 -0.335500
+vn -0.686800 -0.627300 -0.367000
+vn -0.526400 -0.814600 -0.243400
+vn -0.551600 -0.789700 -0.268300
+vn -0.531000 -0.795000 -0.293100
+vn -0.506700 -0.819000 -0.269200
+vn -0.480200 -0.841800 -0.246400
+vn -0.498900 -0.838300 -0.219700
+vn -0.451600 -0.863400 -0.224800
+vn -0.469200 -0.860800 -0.197200
+vn -0.517000 -0.833900 -0.192800
+vn -0.545500 -0.809400 -0.217400
+vn -0.534700 -0.828600 -0.165700
+vn -0.564100 -0.803200 -0.191100
+vn -0.486200 -0.857200 -0.169600
+vn -0.502800 -0.852700 -0.141700
+vn -0.571700 -0.783600 -0.243200
+vn -0.591100 -0.776600 -0.217800
+vn -0.403900 -0.901200 -0.156800
+vn -0.437400 -0.881800 -0.176200
+vn -0.421000 -0.883700 -0.204500
+vn -0.388800 -0.902400 -0.185800
+vn -0.354900 -0.919600 -0.168600
+vn -0.368700 -0.919100 -0.139000
+vn -0.319300 -0.935200 -0.153000
+vn -0.331700 -0.935300 -0.122700
+vn -0.382100 -0.917600 -0.109100
+vn -0.418600 -0.899100 -0.127600
+vn -0.395100 -0.915200 -0.079200
+vn -0.432800 -0.896100 -0.098300
+vn -0.343800 -0.934500 -0.092300
+vn -0.355500 -0.932600 -0.061800
+vn -0.453300 -0.879000 -0.147700
+vn -0.468700 -0.875200 -0.119100
+vn -0.253900 -0.962500 -0.095600
+vn -0.293400 -0.949800 -0.108200
+vn -0.282400 -0.949200 -0.139000
+vn -0.244400 -0.961300 -0.126900
+vn -0.205400 -0.971700 -0.116500
+vn -0.213400 -0.973300 -0.084700
+vn -0.165300 -0.980300 -0.107900
+vn -0.171700 -0.982200 -0.075800
+vn -0.221100 -0.973800 -0.052900
+vn -0.263100 -0.962600 -0.064100
+vn -0.228600 -0.973300 -0.021100
+vn -0.272100 -0.961700 -0.032700
+vn -0.178000 -0.983100 -0.043700
+vn -0.184000 -0.982800 -0.011500
+vn -0.304000 -0.949500 -0.077200
+vn -0.314400 -0.948100 -0.046200
+vn -0.086600 -0.994200 -0.063800
+vn -0.129300 -0.989200 -0.068800
+vn -0.124500 -0.987000 -0.101200
+vn -0.083300 -0.991800 -0.096300
+vn -0.041800 -0.994700 -0.093400
+vn -0.043500 -0.997200 -0.060900
+vn 0.000000 -0.995700 -0.092500
+vn 0.000000 -0.998200 -0.059800
+vn -0.045000 -0.998600 -0.028200
+vn -0.089800 -0.995500 -0.031300
+vn -0.046600 -0.998900 0.004500
+vn -0.092800 -0.995700 0.001300
+vn 0.000000 -0.999600 -0.027100
+vn 0.000000 -1.000000 0.005600
+vn -0.134000 -0.990300 -0.036500
+vn -0.138600 -0.990300 -0.004000
+vn 0.086600 -0.994200 -0.063800
+vn 0.043500 -0.997200 -0.060900
+vn 0.041800 -0.994700 -0.093400
+vn 0.083300 -0.991800 -0.096300
+vn 0.124500 -0.987000 -0.101200
+vn 0.129300 -0.989200 -0.068800
+vn 0.165300 -0.980300 -0.107900
+vn 0.171700 -0.982200 -0.075800
+vn 0.134000 -0.990300 -0.036500
+vn 0.089800 -0.995500 -0.031300
+vn 0.138600 -0.990300 -0.004000
+vn 0.092800 -0.995700 0.001300
+vn 0.178000 -0.983100 -0.043700
+vn 0.184000 -0.982800 -0.011500
+vn 0.045000 -0.998600 -0.028200
+vn 0.046600 -0.998900 0.004500
+vn 0.253900 -0.962500 -0.095600
+vn 0.213400 -0.973300 -0.084700
+vn 0.205400 -0.971700 -0.116500
+vn 0.244400 -0.961300 -0.126900
+vn 0.282400 -0.949200 -0.139000
+vn 0.293400 -0.949800 -0.108200
+vn 0.319300 -0.935200 -0.153000
+vn 0.331700 -0.935300 -0.122700
+vn 0.304000 -0.949500 -0.077200
+vn 0.263100 -0.962600 -0.064100
+vn 0.314400 -0.948100 -0.046200
+vn 0.272100 -0.961700 -0.032700
+vn 0.343800 -0.934500 -0.092300
+vn 0.355500 -0.932600 -0.061800
+vn 0.221100 -0.973800 -0.052900
+vn 0.228600 -0.973300 -0.021100
+vn 0.403900 -0.901200 -0.156800
+vn 0.368700 -0.919100 -0.139000
+vn 0.354900 -0.919600 -0.168600
+vn 0.388800 -0.902400 -0.185800
+vn 0.421000 -0.883700 -0.204500
+vn 0.437400 -0.881800 -0.176200
+vn 0.451600 -0.863400 -0.224800
+vn 0.469200 -0.860800 -0.197200
+vn 0.453300 -0.879000 -0.147700
+vn 0.418600 -0.899100 -0.127600
+vn 0.468700 -0.875200 -0.119100
+vn 0.432800 -0.896100 -0.098300
+vn 0.486200 -0.857200 -0.169600
+vn 0.502800 -0.852700 -0.141700
+vn 0.382100 -0.917600 -0.109100
+vn 0.395100 -0.915200 -0.079200
+vn 0.526400 -0.814600 -0.243400
+vn 0.498900 -0.838300 -0.219700
+vn 0.480200 -0.841800 -0.246400
+vn 0.506700 -0.819000 -0.269200
+vn 0.531000 -0.795000 -0.293100
+vn 0.551600 -0.789700 -0.268300
+vn 0.553100 -0.769900 -0.318300
+vn 0.574600 -0.763600 -0.294400
+vn 0.571700 -0.783600 -0.243200
+vn 0.545500 -0.809400 -0.217400
+vn 0.591100 -0.776600 -0.217800
+vn 0.564100 -0.803200 -0.191100
+vn 0.595500 -0.756500 -0.270200
+vn 0.615800 -0.748600 -0.245800
+vn 0.517000 -0.833900 -0.192800
+vn 0.534700 -0.828600 -0.165700
+vn 0.613000 -0.708500 -0.349500
+vn 0.595100 -0.736500 -0.321500
+vn 0.572800 -0.743800 -0.344400
+vn 0.590000 -0.716900 -0.371300
+vn 0.604700 -0.689300 -0.398900
+vn 0.628300 -0.679900 -0.378100
+vn 0.616900 -0.661000 -0.427200
+vn 0.640900 -0.650400 -0.407600
+vn 0.651100 -0.669700 -0.357000
+vn 0.635300 -0.699500 -0.327300
+vn 0.673300 -0.658900 -0.335500
+vn 0.656900 -0.689600 -0.304800
+vn 0.664200 -0.639200 -0.387500
+vn 0.686800 -0.627300 -0.367000
+vn 0.616700 -0.728400 -0.298400
+vn 0.637700 -0.719500 -0.274800
+vn 0.657800 -0.590300 -0.467800
+vn 0.650800 -0.620500 -0.437500
+vn 0.626400 -0.632100 -0.456000
+vn 0.633200 -0.603000 -0.485200
+vn 0.637300 -0.573700 -0.514500
+vn 0.662100 -0.559800 -0.498200
+vn 0.638700 -0.544100 -0.544100
+vn 0.663500 -0.529000 -0.529000
+vn 0.686100 -0.545200 -0.481500
+vn 0.681800 -0.576800 -0.449900
+vn 0.709500 -0.530100 -0.464200
+vn 0.704900 -0.562800 -0.431600
+vn 0.687600 -0.513400 -0.513400
+vn 0.711000 -0.497200 -0.497200
+vn 0.674400 -0.608200 -0.418600
+vn 0.697400 -0.595200 -0.399200
+vn 0.657800 -0.467800 -0.590300
+vn 0.662100 -0.498200 -0.559800
+vn 0.637300 -0.514500 -0.573700
+vn 0.633200 -0.485200 -0.603000
+vn 0.626400 -0.456000 -0.632100
+vn 0.650800 -0.437500 -0.620500
+vn 0.616900 -0.427200 -0.661000
+vn 0.640900 -0.407600 -0.650400
+vn 0.674400 -0.418600 -0.608200
+vn 0.681800 -0.449900 -0.576800
+vn 0.697400 -0.399200 -0.595200
+vn 0.704900 -0.431600 -0.562800
+vn 0.664200 -0.387500 -0.639200
+vn 0.686800 -0.367000 -0.627300
+vn 0.686100 -0.481500 -0.545200
+vn 0.709500 -0.464200 -0.530100
+vn 0.613000 -0.349500 -0.708500
+vn 0.628300 -0.378100 -0.679900
+vn 0.604700 -0.398900 -0.689300
+vn 0.590000 -0.371300 -0.716900
+vn 0.572800 -0.344400 -0.743800
+vn 0.595100 -0.321500 -0.736500
+vn 0.553100 -0.318300 -0.769900
+vn 0.574600 -0.294400 -0.763600
+vn 0.616700 -0.298400 -0.728400
+vn 0.635300 -0.327300 -0.699500
+vn 0.637700 -0.274800 -0.719500
+vn 0.656900 -0.304800 -0.689600
+vn 0.595500 -0.270200 -0.756500
+vn 0.615800 -0.245800 -0.748600
+vn 0.651100 -0.357000 -0.669700
+vn 0.673300 -0.335500 -0.658900
+vn 0.526400 -0.243400 -0.814600
+vn 0.551600 -0.268300 -0.789700
+vn 0.531000 -0.293100 -0.795000
+vn 0.506700 -0.269200 -0.819000
+vn 0.480200 -0.246400 -0.841800
+vn 0.498900 -0.219700 -0.838300
+vn 0.451600 -0.224800 -0.863400
+vn 0.469200 -0.197200 -0.860800
+vn 0.517000 -0.192800 -0.833900
+vn 0.545500 -0.217400 -0.809400
+vn 0.534700 -0.165700 -0.828600
+vn 0.564100 -0.191100 -0.803200
+vn 0.486200 -0.169600 -0.857200
+vn 0.502800 -0.141700 -0.852700
+vn 0.571700 -0.243200 -0.783600
+vn 0.591100 -0.217800 -0.776600
+vn 0.403900 -0.156800 -0.901200
+vn 0.437400 -0.176200 -0.881800
+vn 0.421000 -0.204500 -0.883700
+vn 0.388800 -0.185800 -0.902400
+vn 0.354900 -0.168600 -0.919600
+vn 0.368700 -0.139000 -0.919100
+vn 0.319300 -0.153000 -0.935200
+vn 0.331700 -0.122700 -0.935300
+vn 0.382100 -0.109100 -0.917600
+vn 0.418600 -0.127600 -0.899100
+vn 0.395100 -0.079200 -0.915200
+vn 0.432800 -0.098300 -0.896100
+vn 0.343800 -0.092300 -0.934500
+vn 0.355500 -0.061800 -0.932600
+vn 0.453300 -0.147700 -0.879000
+vn 0.468700 -0.119100 -0.875200
+vn 0.253900 -0.095600 -0.962500
+vn 0.293400 -0.108200 -0.949800
+vn 0.282400 -0.139000 -0.949200
+vn 0.244400 -0.126900 -0.961300
+vn 0.205400 -0.116500 -0.971700
+vn 0.213400 -0.084700 -0.973300
+vn 0.165300 -0.107900 -0.980300
+vn 0.171700 -0.075800 -0.982200
+vn 0.221100 -0.052900 -0.973800
+vn 0.263100 -0.064100 -0.962600
+vn 0.228600 -0.021100 -0.973300
+vn 0.272100 -0.032700 -0.961700
+vn 0.178000 -0.043700 -0.983100
+vn 0.184000 -0.011500 -0.982800
+vn 0.304000 -0.077200 -0.949500
+vn 0.314400 -0.046200 -0.948100
+vn 0.086600 -0.063800 -0.994200
+vn 0.129300 -0.068800 -0.989200
+vn 0.124500 -0.101200 -0.987000
+vn 0.083300 -0.096300 -0.991800
+vn 0.041800 -0.093400 -0.994700
+vn 0.043500 -0.060900 -0.997200
+vn 0.000000 -0.092500 -0.995700
+vn 0.000000 -0.059800 -0.998200
+vn 0.045000 -0.028200 -0.998600
+vn 0.089800 -0.031300 -0.995500
+vn 0.046600 0.004500 -0.998900
+vn 0.092800 0.001300 -0.995700
+vn 0.000000 -0.027100 -0.999600
+vn 0.000000 0.005600 -1.000000
+vn 0.134000 -0.036500 -0.990300
+vn 0.138600 -0.004000 -0.990300
+vn -0.086600 -0.063800 -0.994200
+vn -0.043500 -0.060900 -0.997200
+vn -0.041800 -0.093400 -0.994700
+vn -0.083300 -0.096300 -0.991800
+vn -0.124500 -0.101200 -0.987000
+vn -0.129300 -0.068800 -0.989200
+vn -0.165300 -0.107900 -0.980300
+vn -0.171700 -0.075800 -0.982200
+vn -0.134000 -0.036500 -0.990300
+vn -0.089800 -0.031300 -0.995500
+vn -0.138600 -0.004000 -0.990300
+vn -0.092800 0.001300 -0.995700
+vn -0.178000 -0.043700 -0.983100
+vn -0.184000 -0.011500 -0.982800
+vn -0.045000 -0.028200 -0.998600
+vn -0.046600 0.004500 -0.998900
+vn -0.253900 -0.095600 -0.962500
+vn -0.213400 -0.084700 -0.973300
+vn -0.205400 -0.116500 -0.971700
+vn -0.244400 -0.126900 -0.961300
+vn -0.282400 -0.139000 -0.949200
+vn -0.293400 -0.108200 -0.949800
+vn -0.319300 -0.153000 -0.935200
+vn -0.331700 -0.122700 -0.935300
+vn -0.304000 -0.077200 -0.949500
+vn -0.263100 -0.064100 -0.962600
+vn -0.314400 -0.046200 -0.948100
+vn -0.272100 -0.032700 -0.961700
+vn -0.343800 -0.092300 -0.934500
+vn -0.355500 -0.061800 -0.932600
+vn -0.221100 -0.052900 -0.973800
+vn -0.228600 -0.021100 -0.973300
+vn -0.403900 -0.156800 -0.901200
+vn -0.368700 -0.139000 -0.919100
+vn -0.354900 -0.168600 -0.919600
+vn -0.388800 -0.185800 -0.902400
+vn -0.421000 -0.204500 -0.883700
+vn -0.437400 -0.176200 -0.881800
+vn -0.451600 -0.224800 -0.863400
+vn -0.469200 -0.197200 -0.860800
+vn -0.453300 -0.147700 -0.879000
+vn -0.418600 -0.127600 -0.899100
+vn -0.468700 -0.119100 -0.875200
+vn -0.432800 -0.098300 -0.896100
+vn -0.486200 -0.169600 -0.857200
+vn -0.502800 -0.141700 -0.852700
+vn -0.382100 -0.109100 -0.917600
+vn -0.395100 -0.079200 -0.915200
+vn -0.526400 -0.243400 -0.814600
+vn -0.498900 -0.219700 -0.838300
+vn -0.480200 -0.246400 -0.841800
+vn -0.506700 -0.269200 -0.819000
+vn -0.531000 -0.293100 -0.795000
+vn -0.551600 -0.268300 -0.789700
+vn -0.553100 -0.318300 -0.769900
+vn -0.574600 -0.294400 -0.763600
+vn -0.571700 -0.243200 -0.783600
+vn -0.545500 -0.217400 -0.809400
+vn -0.591100 -0.217800 -0.776600
+vn -0.564100 -0.191100 -0.803200
+vn -0.595500 -0.270200 -0.756500
+vn -0.615800 -0.245800 -0.748600
+vn -0.517000 -0.192800 -0.833900
+vn -0.534700 -0.165700 -0.828600
+vn -0.613000 -0.349500 -0.708500
+vn -0.595100 -0.321500 -0.736500
+vn -0.572800 -0.344400 -0.743800
+vn -0.590000 -0.371300 -0.716900
+vn -0.604700 -0.398900 -0.689300
+vn -0.628300 -0.378100 -0.679900
+vn -0.616900 -0.427200 -0.661000
+vn -0.640900 -0.407600 -0.650400
+vn -0.651100 -0.357000 -0.669700
+vn -0.635300 -0.327300 -0.699500
+vn -0.673300 -0.335500 -0.658900
+vn -0.656900 -0.304800 -0.689600
+vn -0.664200 -0.387500 -0.639200
+vn -0.686800 -0.367000 -0.627300
+vn -0.616700 -0.298400 -0.728400
+vn -0.637700 -0.274800 -0.719500
+vn -0.657800 -0.467800 -0.590300
+vn -0.650800 -0.437500 -0.620500
+vn -0.626400 -0.456000 -0.632100
+vn -0.633200 -0.485200 -0.603000
+vn -0.637300 -0.514500 -0.573700
+vn -0.662100 -0.498200 -0.559800
+vn -0.638700 -0.544100 -0.544100
+vn -0.663500 -0.529000 -0.529000
+vn -0.686100 -0.481500 -0.545200
+vn -0.681800 -0.449900 -0.576800
+vn -0.709500 -0.464200 -0.530100
+vn -0.704900 -0.431600 -0.562800
+vn -0.687600 -0.513400 -0.513400
+vn -0.711000 -0.497200 -0.497200
+vn -0.674400 -0.418600 -0.608200
+vn -0.697400 -0.399200 -0.595200
+vn -0.657800 -0.590300 -0.467800
+vn -0.662100 -0.559800 -0.498200
+vn -0.637300 -0.573700 -0.514500
+vn -0.633200 -0.603000 -0.485200
+vn -0.626400 -0.632100 -0.456000
+vn -0.650800 -0.620500 -0.437500
+vn -0.674400 -0.608200 -0.418600
+vn -0.681800 -0.576800 -0.449900
+vn -0.697400 -0.595200 -0.399200
+vn -0.704900 -0.562800 -0.431600
+vn -0.686100 -0.545200 -0.481500
+vn -0.709500 -0.530100 -0.464200
+vn -0.698000 -0.667700 -0.258800
+vn -0.715300 -0.635100 -0.291500
+vn -0.694700 -0.647300 -0.313600
+vn -0.677800 -0.679000 -0.281900
+vn -0.729700 -0.601500 -0.325000
+vn -0.708700 -0.614700 -0.346200
+vn -0.658000 -0.709900 -0.251100
+vn -0.677600 -0.699500 -0.227100
+vn -0.635400 -0.739900 -0.221100
+vn -0.654300 -0.730400 -0.196200
+vn -0.696400 -0.688300 -0.202800
+vn -0.717300 -0.655700 -0.235500
+vn -0.714500 -0.676500 -0.178400
+vn -0.736000 -0.643000 -0.211900
+vn -0.672400 -0.720100 -0.171100
+vn -0.689900 -0.709100 -0.145800
+vn -0.735200 -0.622200 -0.269000
+vn -0.750000 -0.587700 -0.303500
+vn -0.754300 -0.608600 -0.246300
+vn -0.769500 -0.573200 -0.281600
+vn -0.599400 -0.788500 -0.138100
+vn -0.628100 -0.760100 -0.166400
+vn -0.609900 -0.768800 -0.192200
+vn -0.582000 -0.796300 -0.164600
+vn -0.551700 -0.822500 -0.138500
+vn -0.568000 -0.815400 -0.111100
+vn -0.518800 -0.847300 -0.113600
+vn -0.534200 -0.841000 -0.085500
+vn -0.583800 -0.807500 -0.083700
+vn -0.616000 -0.779800 -0.111400
+vn -0.599000 -0.798800 -0.056100
+vn -0.632000 -0.770300 -0.084500
+vn -0.549000 -0.833800 -0.057400
+vn -0.563300 -0.825700 -0.029100
+vn -0.645500 -0.750700 -0.140500
+vn -0.662300 -0.740400 -0.114400
+vn -0.459900 -0.887100 -0.039500
+vn -0.498000 -0.865000 -0.061600
+vn -0.483700 -0.870600 -0.090400
+vn -0.446600 -0.892100 -0.068900
+vn -0.407700 -0.911800 -0.049200
+vn -0.419800 -0.907400 -0.019100
+vn -0.366800 -0.929700 -0.031200
+vn -0.377700 -0.925900 -0.000600
+vn -0.431400 -0.902000 0.010800
+vn -0.472700 -0.881200 -0.010000
+vn -0.442600 -0.895700 0.040900
+vn -0.484900 -0.874300 0.019400
+vn -0.388200 -0.921100 0.029800
+vn -0.398300 -0.915300 0.060400
+vn -0.511900 -0.858400 -0.032700
+vn -0.525100 -0.851000 -0.003900
+vn -0.289100 -0.956800 0.030200
+vn -0.334000 -0.942400 0.015800
+vn -0.324400 -0.945800 -0.015100
+vn -0.280700 -0.959700 -0.001200
+vn -0.235900 -0.971700 0.010700
+vn -0.242900 -0.969100 0.042500
+vn -0.189900 -0.981600 0.020600
+vn -0.195500 -0.979300 0.052700
+vn -0.249700 -0.965500 0.074300
+vn -0.297100 -0.952800 0.061600
+vn -0.256100 -0.960800 0.105900
+vn -0.304800 -0.947800 0.093000
+vn -0.200900 -0.975900 0.084700
+vn -0.206200 -0.971500 0.116600
+vn -0.343300 -0.938000 0.046800
+vn -0.352200 -0.932600 0.077800
+vn -0.098600 -0.992900 0.066300
+vn -0.147300 -0.987200 0.060600
+vn -0.143000 -0.989300 0.028400
+vn -0.095700 -0.994800 0.033800
+vn -0.048100 -0.998100 0.037200
+vn -0.049500 -0.996300 0.069800
+vn 0.000000 -0.999200 0.038300
+vn 0.000000 -0.997500 0.070900
+vn -0.050900 -0.993400 0.102200
+vn -0.101300 -0.989900 0.098700
+vn -0.052200 -0.989500 0.134600
+vn -0.104000 -0.985900 0.131000
+vn 0.000000 -0.994600 0.103400
+vn 0.000000 -0.990700 0.135800
+vn -0.151300 -0.984100 0.092900
+vn -0.155300 -0.979900 0.125000
+vn 0.098600 -0.992900 0.066300
+vn 0.049500 -0.996300 0.069800
+vn 0.048100 -0.998100 0.037200
+vn 0.095700 -0.994800 0.033800
+vn 0.143000 -0.989300 0.028400
+vn 0.147300 -0.987200 0.060600
+vn 0.189900 -0.981600 0.020600
+vn 0.195500 -0.979300 0.052700
+vn 0.151300 -0.984100 0.092900
+vn 0.101300 -0.989900 0.098700
+vn 0.155300 -0.979900 0.125000
+vn 0.104000 -0.985900 0.131000
+vn 0.200900 -0.975900 0.084700
+vn 0.206200 -0.971500 0.116600
+vn 0.050900 -0.993400 0.102200
+vn 0.052200 -0.989500 0.134600
+vn 0.289100 -0.956800 0.030200
+vn 0.242900 -0.969100 0.042500
+vn 0.235900 -0.971700 0.010700
+vn 0.280700 -0.959700 -0.001200
+vn 0.324400 -0.945800 -0.015100
+vn 0.334000 -0.942400 0.015800
+vn 0.366800 -0.929700 -0.031200
+vn 0.377700 -0.925900 -0.000600
+vn 0.343300 -0.938000 0.046800
+vn 0.297100 -0.952800 0.061600
+vn 0.352200 -0.932600 0.077800
+vn 0.304800 -0.947800 0.093000
+vn 0.388200 -0.921100 0.029800
+vn 0.398300 -0.915300 0.060400
+vn 0.249700 -0.965500 0.074300
+vn 0.256100 -0.960800 0.105900
+vn 0.459900 -0.887100 -0.039500
+vn 0.419800 -0.907400 -0.019100
+vn 0.407700 -0.911800 -0.049200
+vn 0.446600 -0.892100 -0.068900
+vn 0.483700 -0.870600 -0.090400
+vn 0.498000 -0.865000 -0.061600
+vn 0.518800 -0.847300 -0.113600
+vn 0.534200 -0.841000 -0.085500
+vn 0.511900 -0.858400 -0.032700
+vn 0.472700 -0.881200 -0.010000
+vn 0.525100 -0.851000 -0.003900
+vn 0.484900 -0.874300 0.019400
+vn 0.549000 -0.833800 -0.057400
+vn 0.563300 -0.825700 -0.029100
+vn 0.431400 -0.902000 0.010800
+vn 0.442600 -0.895700 0.040900
+vn 0.599400 -0.788500 -0.138100
+vn 0.568000 -0.815400 -0.111100
+vn 0.551700 -0.822500 -0.138500
+vn 0.582000 -0.796300 -0.164600
+vn 0.609900 -0.768800 -0.192200
+vn 0.628100 -0.760100 -0.166400
+vn 0.635400 -0.739900 -0.221100
+vn 0.654300 -0.730400 -0.196200
+vn 0.645500 -0.750700 -0.140500
+vn 0.616000 -0.779800 -0.111400
+vn 0.662300 -0.740400 -0.114400
+vn 0.632000 -0.770300 -0.084500
+vn 0.672400 -0.720100 -0.171100
+vn 0.689900 -0.709100 -0.145800
+vn 0.583800 -0.807500 -0.083700
+vn 0.599000 -0.798800 -0.056100
+vn 0.698000 -0.667700 -0.258800
+vn 0.677600 -0.699500 -0.227100
+vn 0.658000 -0.709900 -0.251100
+vn 0.677800 -0.679000 -0.281900
+vn 0.694700 -0.647300 -0.313600
+vn 0.715300 -0.635100 -0.291500
+vn 0.708700 -0.614700 -0.346200
+vn 0.729700 -0.601500 -0.325000
+vn 0.735200 -0.622200 -0.269000
+vn 0.717300 -0.655700 -0.235500
+vn 0.754300 -0.608600 -0.246300
+vn 0.736000 -0.643000 -0.211900
+vn 0.750000 -0.587700 -0.303500
+vn 0.769500 -0.573200 -0.281600
+vn 0.696400 -0.688300 -0.202800
+vn 0.714500 -0.676500 -0.178400
+vn 0.749000 -0.533000 -0.393500
+vn 0.741000 -0.567400 -0.359100
+vn 0.719600 -0.581600 -0.379300
+vn 0.727400 -0.548200 -0.412800
+vn 0.732100 -0.514500 -0.446500
+vn 0.753800 -0.498300 -0.428300
+vn 0.733700 -0.480500 -0.480500
+vn 0.755500 -0.463300 -0.463300
+vn 0.774800 -0.481600 -0.409600
+vn 0.769800 -0.517300 -0.373900
+vn 0.794900 -0.464300 -0.390500
+vn 0.789800 -0.501000 -0.353900
+vn 0.776400 -0.445600 -0.445600
+vn 0.796600 -0.427400 -0.427400
+vn 0.761500 -0.552600 -0.338500
+vn 0.781300 -0.537200 -0.317600
+vn 0.749000 -0.393500 -0.533000
+vn 0.753800 -0.428300 -0.498300
+vn 0.732100 -0.446500 -0.514500
+vn 0.727400 -0.412800 -0.548200
+vn 0.719600 -0.379300 -0.581600
+vn 0.741000 -0.359100 -0.567400
+vn 0.708700 -0.346200 -0.614700
+vn 0.729700 -0.325000 -0.601500
+vn 0.761500 -0.338500 -0.552600
+vn 0.769800 -0.373900 -0.517300
+vn 0.781300 -0.317600 -0.537200
+vn 0.789800 -0.353900 -0.501000
+vn 0.750000 -0.303500 -0.587700
+vn 0.769500 -0.281600 -0.573200
+vn 0.774800 -0.409600 -0.481600
+vn 0.794900 -0.390500 -0.464300
+vn 0.698000 -0.258800 -0.667700
+vn 0.715300 -0.291500 -0.635100
+vn 0.694700 -0.313600 -0.647300
+vn 0.677800 -0.281900 -0.679000
+vn 0.658000 -0.251100 -0.709900
+vn 0.677600 -0.227100 -0.699500
+vn 0.635400 -0.221100 -0.739900
+vn 0.654300 -0.196200 -0.730400
+vn 0.696400 -0.202800 -0.688300
+vn 0.717300 -0.235500 -0.655700
+vn 0.714500 -0.178400 -0.676500
+vn 0.736000 -0.211900 -0.643000
+vn 0.672400 -0.171100 -0.720100
+vn 0.689900 -0.145800 -0.709100
+vn 0.735200 -0.269000 -0.622200
+vn 0.754300 -0.246300 -0.608600
+vn 0.599400 -0.138100 -0.788500
+vn 0.628100 -0.166400 -0.760100
+vn 0.609900 -0.192200 -0.768800
+vn 0.582000 -0.164600 -0.796300
+vn 0.551700 -0.138500 -0.822500
+vn 0.568000 -0.111100 -0.815400
+vn 0.518800 -0.113600 -0.847300
+vn 0.534200 -0.085500 -0.841000
+vn 0.583800 -0.083700 -0.807500
+vn 0.616000 -0.111400 -0.779800
+vn 0.599000 -0.056100 -0.798800
+vn 0.632000 -0.084500 -0.770300
+vn 0.549000 -0.057400 -0.833800
+vn 0.563300 -0.029100 -0.825700
+vn 0.645500 -0.140500 -0.750700
+vn 0.662300 -0.114400 -0.740400
+vn 0.459900 -0.039500 -0.887100
+vn 0.498000 -0.061600 -0.865000
+vn 0.483700 -0.090400 -0.870600
+vn 0.446600 -0.068900 -0.892100
+vn 0.407700 -0.049200 -0.911800
+vn 0.419800 -0.019100 -0.907400
+vn 0.366800 -0.031200 -0.929700
+vn 0.377700 -0.000600 -0.925900
+vn 0.431400 0.010800 -0.902000
+vn 0.472700 -0.010000 -0.881200
+vn 0.442600 0.040900 -0.895700
+vn 0.484900 0.019400 -0.874300
+vn 0.388200 0.029800 -0.921100
+vn 0.398300 0.060400 -0.915300
+vn 0.511900 -0.032700 -0.858400
+vn 0.525100 -0.003900 -0.851000
+vn 0.289100 0.030200 -0.956800
+vn 0.334000 0.015800 -0.942400
+vn 0.324400 -0.015100 -0.945800
+vn 0.280700 -0.001200 -0.959700
+vn 0.235900 0.010700 -0.971700
+vn 0.242900 0.042500 -0.969100
+vn 0.189900 0.020600 -0.981600
+vn 0.195500 0.052700 -0.979300
+vn 0.249700 0.074300 -0.965500
+vn 0.297100 0.061600 -0.952800
+vn 0.256100 0.105900 -0.960800
+vn 0.304800 0.093000 -0.947800
+vn 0.200900 0.084700 -0.975900
+vn 0.206200 0.116600 -0.971500
+vn 0.343300 0.046800 -0.938000
+vn 0.352200 0.077800 -0.932600
+vn 0.098600 0.066300 -0.992900
+vn 0.147300 0.060600 -0.987200
+vn 0.143000 0.028400 -0.989300
+vn 0.095700 0.033800 -0.994800
+vn 0.048100 0.037200 -0.998100
+vn 0.049500 0.069800 -0.996300
+vn 0.000000 0.038300 -0.999200
+vn 0.000000 0.070900 -0.997500
+vn 0.050900 0.102200 -0.993400
+vn 0.101300 0.098700 -0.989900
+vn 0.052200 0.134600 -0.989500
+vn 0.104000 0.131000 -0.985900
+vn 0.000000 0.103400 -0.994600
+vn 0.000000 0.135800 -0.990700
+vn 0.151300 0.092900 -0.984100
+vn 0.155300 0.125000 -0.979900
+vn -0.098600 0.066300 -0.992900
+vn -0.049500 0.069800 -0.996300
+vn -0.048100 0.037200 -0.998100
+vn -0.095700 0.033800 -0.994800
+vn -0.143000 0.028300 -0.989300
+vn -0.147300 0.060600 -0.987200
+vn -0.189900 0.020600 -0.981600
+vn -0.195500 0.052700 -0.979300
+vn -0.151300 0.092900 -0.984100
+vn -0.101300 0.098700 -0.989900
+vn -0.155300 0.125000 -0.979900
+vn -0.104000 0.131000 -0.985900
+vn -0.200900 0.084700 -0.975900
+vn -0.206200 0.116600 -0.971500
+vn -0.050900 0.102200 -0.993400
+vn -0.052200 0.134600 -0.989500
+vn -0.289100 0.030200 -0.956800
+vn -0.242900 0.042500 -0.969100
+vn -0.235900 0.010700 -0.971700
+vn -0.280700 -0.001200 -0.959700
+vn -0.324400 -0.015100 -0.945800
+vn -0.334000 0.015800 -0.942400
+vn -0.366800 -0.031200 -0.929700
+vn -0.377700 -0.000600 -0.925900
+vn -0.343300 0.046800 -0.938000
+vn -0.297100 0.061600 -0.952800
+vn -0.352200 0.077800 -0.932600
+vn -0.304800 0.093000 -0.947800
+vn -0.388200 0.029800 -0.921100
+vn -0.398300 0.060400 -0.915300
+vn -0.249700 0.074300 -0.965500
+vn -0.256100 0.105900 -0.960800
+vn -0.459900 -0.039500 -0.887100
+vn -0.419800 -0.019100 -0.907400
+vn -0.407700 -0.049200 -0.911800
+vn -0.446600 -0.068900 -0.892100
+vn -0.483700 -0.090400 -0.870600
+vn -0.498000 -0.061600 -0.865000
+vn -0.518800 -0.113600 -0.847300
+vn -0.534200 -0.085500 -0.841000
+vn -0.511900 -0.032700 -0.858400
+vn -0.472700 -0.010000 -0.881200
+vn -0.525100 -0.003900 -0.851000
+vn -0.484900 0.019400 -0.874300
+vn -0.549000 -0.057400 -0.833800
+vn -0.563300 -0.029100 -0.825700
+vn -0.431400 0.010800 -0.902000
+vn -0.442600 0.040900 -0.895700
+vn -0.599400 -0.138100 -0.788500
+vn -0.568000 -0.111100 -0.815400
+vn -0.551700 -0.138500 -0.822500
+vn -0.582000 -0.164600 -0.796300
+vn -0.609900 -0.192200 -0.768800
+vn -0.628100 -0.166400 -0.760100
+vn -0.635400 -0.221100 -0.739900
+vn -0.654300 -0.196200 -0.730400
+vn -0.645500 -0.140500 -0.750700
+vn -0.616000 -0.111400 -0.779800
+vn -0.662300 -0.114400 -0.740400
+vn -0.632000 -0.084500 -0.770300
+vn -0.672400 -0.171100 -0.720100
+vn -0.689900 -0.145800 -0.709100
+vn -0.583800 -0.083700 -0.807500
+vn -0.599000 -0.056100 -0.798800
+vn -0.698000 -0.258800 -0.667700
+vn -0.677600 -0.227100 -0.699500
+vn -0.658000 -0.251100 -0.709900
+vn -0.677800 -0.281900 -0.679000
+vn -0.694700 -0.313600 -0.647300
+vn -0.715300 -0.291500 -0.635100
+vn -0.708700 -0.346200 -0.614700
+vn -0.729700 -0.325000 -0.601500
+vn -0.735200 -0.269000 -0.622200
+vn -0.717300 -0.235500 -0.655700
+vn -0.754300 -0.246300 -0.608600
+vn -0.736000 -0.211900 -0.643000
+vn -0.750000 -0.303500 -0.587700
+vn -0.769500 -0.281600 -0.573200
+vn -0.696400 -0.202800 -0.688300
+vn -0.714500 -0.178400 -0.676500
+vn -0.749000 -0.393500 -0.533000
+vn -0.741000 -0.359100 -0.567400
+vn -0.719600 -0.379300 -0.581600
+vn -0.727400 -0.412800 -0.548200
+vn -0.732100 -0.446500 -0.514500
+vn -0.753800 -0.428300 -0.498300
+vn -0.733700 -0.480500 -0.480500
+vn -0.755500 -0.463300 -0.463300
+vn -0.774800 -0.409600 -0.481600
+vn -0.769800 -0.373900 -0.517300
+vn -0.794900 -0.390500 -0.464300
+vn -0.789800 -0.353900 -0.501000
+vn -0.776400 -0.445600 -0.445600
+vn -0.796600 -0.427400 -0.427400
+vn -0.761500 -0.338500 -0.552600
+vn -0.781300 -0.317600 -0.537200
+vn -0.749000 -0.533000 -0.393500
+vn -0.753800 -0.498300 -0.428300
+vn -0.732100 -0.514500 -0.446500
+vn -0.727400 -0.548200 -0.412700
+vn -0.719600 -0.581600 -0.379300
+vn -0.741000 -0.567400 -0.359100
+vn -0.761500 -0.552600 -0.338500
+vn -0.769800 -0.517300 -0.373900
+vn -0.781300 -0.537200 -0.317600
+vn -0.789800 -0.501000 -0.353900
+vn -0.774800 -0.481600 -0.409600
+vn -0.794900 -0.464300 -0.390500
+vn -0.770800 -0.615600 -0.164000
+vn -0.790000 -0.579500 -0.200100
+vn -0.772500 -0.594300 -0.223300
+vn -0.753800 -0.629600 -0.188000
+vn -0.805900 -0.542500 -0.237100
+vn -0.788100 -0.558200 -0.259500
+vn -0.731800 -0.663900 -0.153700
+vn -0.748300 -0.650700 -0.129000
+vn -0.706600 -0.697300 -0.120400
+vn -0.722500 -0.684800 -0.094900
+vn -0.764000 -0.636700 -0.104100
+vn -0.787000 -0.600900 -0.139900
+vn -0.778900 -0.622100 -0.079100
+vn -0.802300 -0.585600 -0.115600
+vn -0.737700 -0.671600 -0.069200
+vn -0.752000 -0.657600 -0.043600
+vn -0.806500 -0.564100 -0.176700
+vn -0.822800 -0.526300 -0.214500
+vn -0.822300 -0.548100 -0.153100
+vn -0.838800 -0.509500 -0.191700
+vn -0.661900 -0.749000 -0.030700
+vn -0.693600 -0.717600 -0.062000
+vn -0.678300 -0.729400 -0.088200
+vn -0.647300 -0.760000 -0.057600
+vn -0.613500 -0.789100 -0.028500
+vn -0.627300 -0.778700 -0.000900
+vn -0.576900 -0.816800 -0.000900
+vn -0.589900 -0.807000 0.027300
+vn -0.640500 -0.767500 0.026600
+vn -0.675800 -0.737100 -0.003700
+vn -0.653000 -0.755400 0.054200
+vn -0.689000 -0.724400 0.023200
+vn -0.602300 -0.796300 0.055500
+vn -0.614000 -0.784800 0.083600
+vn -0.708200 -0.705100 -0.035700
+vn -0.722000 -0.691800 -0.009400
+vn -0.507900 -0.857800 0.078200
+vn -0.550000 -0.833400 0.053700
+vn -0.537900 -0.842600 0.025000
+vn -0.496700 -0.866500 0.048900
+vn -0.453400 -0.888500 0.070800
+vn -0.463600 -0.880300 0.100600
+vn -0.407900 -0.908500 0.090800
+vn -0.417100 -0.900700 0.121100
+vn -0.473300 -0.871200 0.130300
+vn -0.518500 -0.848300 0.107400
+vn -0.482600 -0.861100 0.159900
+vn -0.528600 -0.837800 0.136500
+vn -0.425900 -0.892000 0.151200
+vn -0.434200 -0.882400 0.181200
+vn -0.561500 -0.823300 0.082500
+vn -0.572500 -0.812300 0.111100
+vn -0.319300 -0.934800 0.155200
+vn -0.368900 -0.918900 0.139300
+vn -0.360800 -0.926300 0.108600
+vn -0.312200 -0.941800 0.124200
+vn -0.262400 -0.955100 0.137400
+vn -0.268300 -0.948400 0.168800
+vn -0.211200 -0.966100 0.148400
+vn -0.215900 -0.959700 0.180000
+vn -0.273900 -0.940700 0.199900
+vn -0.326000 -0.926900 0.186000
+vn -0.279200 -0.932000 0.230800
+vn -0.332300 -0.917900 0.216700
+vn -0.220400 -0.952200 0.211300
+vn -0.224700 -0.943700 0.242500
+vn -0.376600 -0.910600 0.169800
+vn -0.384000 -0.901400 0.200100
+vn -0.108900 -0.974700 0.195000
+vn -0.162600 -0.968400 0.188800
+vn -0.159100 -0.974700 0.157000
+vn -0.106500 -0.980800 0.163200
+vn -0.053500 -0.984500 0.166800
+vn -0.054700 -0.978500 0.198800
+vn 0.000000 -0.985700 0.168100
+vn 0.000000 -0.979800 0.200100
+vn -0.055800 -0.971400 0.230600
+vn -0.111200 -0.967600 0.226700
+vn -0.056900 -0.963300 0.262100
+vn -0.113300 -0.959400 0.258200
+vn 0.000000 -0.972700 0.231900
+vn 0.000000 -0.964700 0.263400
+vn -0.166100 -0.961200 0.220300
+vn -0.169300 -0.952900 0.251700
+vn 0.108900 -0.974700 0.195000
+vn 0.054700 -0.978500 0.198800
+vn 0.053500 -0.984500 0.166800
+vn 0.106500 -0.980800 0.163200
+vn 0.159100 -0.974700 0.157000
+vn 0.162600 -0.968400 0.188800
+vn 0.211200 -0.966100 0.148400
+vn 0.215900 -0.959700 0.180000
+vn 0.166100 -0.961200 0.220300
+vn 0.111200 -0.967600 0.226700
+vn 0.169300 -0.952900 0.251700
+vn 0.113300 -0.959400 0.258200
+vn 0.220400 -0.952200 0.211300
+vn 0.224700 -0.943700 0.242500
+vn 0.055800 -0.971400 0.230600
+vn 0.056900 -0.963300 0.262100
+vn 0.319300 -0.934800 0.155200
+vn 0.268300 -0.948400 0.168800
+vn 0.262400 -0.955100 0.137400
+vn 0.312200 -0.941800 0.124200
+vn 0.360800 -0.926300 0.108600
+vn 0.368900 -0.918900 0.139300
+vn 0.407900 -0.908500 0.090800
+vn 0.417100 -0.900700 0.121100
+vn 0.376600 -0.910600 0.169800
+vn 0.326000 -0.926900 0.186000
+vn 0.384000 -0.901400 0.200100
+vn 0.332300 -0.917900 0.216700
+vn 0.425900 -0.892000 0.151200
+vn 0.434200 -0.882400 0.181200
+vn 0.273900 -0.940700 0.199900
+vn 0.279200 -0.932000 0.230800
+vn 0.507900 -0.857800 0.078200
+vn 0.463600 -0.880300 0.100600
+vn 0.453400 -0.888500 0.070800
+vn 0.496700 -0.866500 0.048900
+vn 0.537900 -0.842600 0.025000
+vn 0.550000 -0.833400 0.053700
+vn 0.576900 -0.816800 -0.000900
+vn 0.589900 -0.807000 0.027300
+vn 0.561500 -0.823300 0.082500
+vn 0.518500 -0.848300 0.107400
+vn 0.572500 -0.812300 0.111100
+vn 0.528600 -0.837800 0.136500
+vn 0.602300 -0.796300 0.055500
+vn 0.614000 -0.784800 0.083600
+vn 0.473300 -0.871200 0.130300
+vn 0.482600 -0.861100 0.159900
+vn 0.661900 -0.749000 -0.030700
+vn 0.627300 -0.778700 -0.000900
+vn 0.613500 -0.789100 -0.028500
+vn 0.647300 -0.760000 -0.057600
+vn 0.678300 -0.729400 -0.088200
+vn 0.693600 -0.717600 -0.062000
+vn 0.706600 -0.697300 -0.120400
+vn 0.722500 -0.684800 -0.094900
+vn 0.708200 -0.705100 -0.035700
+vn 0.675800 -0.737100 -0.003700
+vn 0.722000 -0.691800 -0.009400
+vn 0.689000 -0.724400 0.023200
+vn 0.737700 -0.671600 -0.069200
+vn 0.752000 -0.657600 -0.043600
+vn 0.640500 -0.767500 0.026600
+vn 0.653000 -0.755400 0.054200
+vn 0.770800 -0.615600 -0.164000
+vn 0.748300 -0.650700 -0.129000
+vn 0.731800 -0.663900 -0.153700
+vn 0.753800 -0.629600 -0.188000
+vn 0.772500 -0.594300 -0.223300
+vn 0.790000 -0.579500 -0.200100
+vn 0.788100 -0.558200 -0.259500
+vn 0.805900 -0.542500 -0.237100
+vn 0.806500 -0.564100 -0.176700
+vn 0.787000 -0.600900 -0.139900
+vn 0.822300 -0.548100 -0.153100
+vn 0.802300 -0.585600 -0.115600
+vn 0.822800 -0.526300 -0.214500
+vn 0.838800 -0.509500 -0.191700
+vn 0.764000 -0.636700 -0.104100
+vn 0.778900 -0.622100 -0.079100
+vn 0.827100 -0.466800 -0.312800
+vn 0.818300 -0.504800 -0.274800
+vn 0.800200 -0.521300 -0.296300
+vn 0.808900 -0.484100 -0.333500
+vn 0.814100 -0.446600 -0.371000
+vn 0.832500 -0.428500 -0.351100
+vn 0.815900 -0.408800 -0.408800
+vn 0.834300 -0.389800 -0.389800
+vn 0.850000 -0.409900 -0.330900
+vn 0.844500 -0.449000 -0.291800
+vn 0.866500 -0.390900 -0.310300
+vn 0.861000 -0.430700 -0.270500
+vn 0.851800 -0.370400 -0.370400
+vn 0.868400 -0.350600 -0.350600
+vn 0.835400 -0.487800 -0.253000
+vn 0.851700 -0.470300 -0.230900
+vn 0.827100 -0.312800 -0.466800
+vn 0.832500 -0.351100 -0.428500
+vn 0.814100 -0.371000 -0.446600
+vn 0.808900 -0.333500 -0.484100
+vn 0.800200 -0.296300 -0.521300
+vn 0.818300 -0.274800 -0.504800
+vn 0.788100 -0.259500 -0.558200
+vn 0.805900 -0.237100 -0.542500
+vn 0.835400 -0.253000 -0.487800
+vn 0.844500 -0.291800 -0.449000
+vn 0.851700 -0.230900 -0.470300
+vn 0.861000 -0.270500 -0.430700
+vn 0.822800 -0.214500 -0.526300
+vn 0.838800 -0.191700 -0.509500
+vn 0.850000 -0.330900 -0.409900
+vn 0.866500 -0.310300 -0.390900
+vn 0.770800 -0.164000 -0.615600
+vn 0.790000 -0.200100 -0.579500
+vn 0.772500 -0.223300 -0.594300
+vn 0.753800 -0.188000 -0.629600
+vn 0.731800 -0.153700 -0.663900
+vn 0.748300 -0.129000 -0.650700
+vn 0.706600 -0.120400 -0.697300
+vn 0.722500 -0.094900 -0.684800
+vn 0.764000 -0.104100 -0.636700
+vn 0.787000 -0.139900 -0.600900
+vn 0.778900 -0.079100 -0.622100
+vn 0.802300 -0.115600 -0.585600
+vn 0.737700 -0.069200 -0.671600
+vn 0.752000 -0.043600 -0.657600
+vn 0.806500 -0.176700 -0.564100
+vn 0.822300 -0.153100 -0.548100
+vn 0.661900 -0.030700 -0.749000
+vn 0.693600 -0.062000 -0.717600
+vn 0.678300 -0.088200 -0.729400
+vn 0.647300 -0.057600 -0.760000
+vn 0.613500 -0.028500 -0.789100
+vn 0.627300 -0.000900 -0.778700
+vn 0.576900 -0.000900 -0.816800
+vn 0.589900 0.027300 -0.807000
+vn 0.640500 0.026600 -0.767500
+vn 0.675800 -0.003700 -0.737100
+vn 0.653000 0.054200 -0.755400
+vn 0.689000 0.023200 -0.724400
+vn 0.602300 0.055500 -0.796300
+vn 0.614000 0.083600 -0.784800
+vn 0.708200 -0.035700 -0.705100
+vn 0.722000 -0.009400 -0.691800
+vn 0.507900 0.078200 -0.857800
+vn 0.550000 0.053700 -0.833400
+vn 0.537900 0.025000 -0.842600
+vn 0.496700 0.048900 -0.866500
+vn 0.453400 0.070800 -0.888500
+vn 0.463600 0.100600 -0.880300
+vn 0.407900 0.090800 -0.908500
+vn 0.417100 0.121100 -0.900700
+vn 0.473300 0.130300 -0.871200
+vn 0.518500 0.107400 -0.848300
+vn 0.482600 0.159900 -0.861100
+vn 0.528600 0.136500 -0.837800
+vn 0.425900 0.151200 -0.892000
+vn 0.434200 0.181200 -0.882400
+vn 0.561500 0.082500 -0.823300
+vn 0.572500 0.111100 -0.812300
+vn 0.319300 0.155200 -0.934800
+vn 0.368900 0.139300 -0.918900
+vn 0.360800 0.108600 -0.926300
+vn 0.312200 0.124200 -0.941800
+vn 0.262400 0.137400 -0.955100
+vn 0.268300 0.168800 -0.948400
+vn 0.211200 0.148400 -0.966100
+vn 0.215900 0.180000 -0.959700
+vn 0.273900 0.199900 -0.940700
+vn 0.326000 0.186000 -0.926900
+vn 0.279200 0.230800 -0.932000
+vn 0.332300 0.216700 -0.917900
+vn 0.220400 0.211300 -0.952200
+vn 0.224700 0.242500 -0.943700
+vn 0.376600 0.169800 -0.910600
+vn 0.384000 0.200100 -0.901400
+vn 0.108900 0.195000 -0.974700
+vn 0.162600 0.188800 -0.968400
+vn 0.159100 0.157000 -0.974700
+vn 0.106500 0.163200 -0.980800
+vn 0.053500 0.166800 -0.984500
+vn 0.054700 0.198800 -0.978500
+vn 0.000000 0.168100 -0.985700
+vn 0.000000 0.200100 -0.979800
+vn 0.055800 0.230600 -0.971400
+vn 0.111200 0.226700 -0.967600
+vn 0.056900 0.262100 -0.963300
+vn 0.113300 0.258200 -0.959400
+vn 0.000000 0.231900 -0.972700
+vn 0.000000 0.263400 -0.964700
+vn 0.166100 0.220300 -0.961200
+vn 0.169300 0.251700 -0.952900
+vn -0.108900 0.195000 -0.974700
+vn -0.054700 0.198800 -0.978500
+vn -0.053500 0.166800 -0.984500
+vn -0.106500 0.163200 -0.980800
+vn -0.159000 0.157000 -0.974700
+vn -0.162600 0.188800 -0.968400
+vn -0.211200 0.148400 -0.966100
+vn -0.215900 0.180000 -0.959700
+vn -0.166100 0.220300 -0.961200
+vn -0.111200 0.226700 -0.967600
+vn -0.169300 0.251700 -0.952900
+vn -0.113300 0.258200 -0.959400
+vn -0.220400 0.211300 -0.952200
+vn -0.224700 0.242500 -0.943700
+vn -0.055800 0.230600 -0.971400
+vn -0.056900 0.262100 -0.963300
+vn -0.319300 0.155200 -0.934800
+vn -0.268300 0.168800 -0.948400
+vn -0.262400 0.137400 -0.955100
+vn -0.312200 0.124200 -0.941800
+vn -0.360800 0.108600 -0.926300
+vn -0.368900 0.139300 -0.918900
+vn -0.407900 0.090800 -0.908500
+vn -0.417100 0.121100 -0.900700
+vn -0.376600 0.169800 -0.910600
+vn -0.326000 0.186000 -0.926900
+vn -0.384000 0.200100 -0.901400
+vn -0.332300 0.216700 -0.917900
+vn -0.425900 0.151200 -0.892000
+vn -0.434200 0.181200 -0.882400
+vn -0.273900 0.199900 -0.940700
+vn -0.279200 0.230800 -0.932000
+vn -0.507900 0.078200 -0.857800
+vn -0.463600 0.100600 -0.880300
+vn -0.453400 0.070800 -0.888500
+vn -0.496700 0.048900 -0.866500
+vn -0.537900 0.025000 -0.842600
+vn -0.550000 0.053700 -0.833400
+vn -0.576900 -0.000900 -0.816800
+vn -0.589900 0.027300 -0.807000
+vn -0.561500 0.082500 -0.823300
+vn -0.518500 0.107400 -0.848300
+vn -0.572500 0.111100 -0.812300
+vn -0.528600 0.136500 -0.837800
+vn -0.602300 0.055500 -0.796300
+vn -0.614000 0.083600 -0.784800
+vn -0.473300 0.130300 -0.871200
+vn -0.482600 0.159900 -0.861100
+vn -0.661900 -0.030700 -0.749000
+vn -0.627300 -0.000900 -0.778700
+vn -0.613500 -0.028500 -0.789100
+vn -0.647300 -0.057600 -0.760000
+vn -0.678300 -0.088200 -0.729400
+vn -0.693600 -0.062000 -0.717600
+vn -0.706600 -0.120400 -0.697300
+vn -0.722500 -0.094900 -0.684800
+vn -0.708200 -0.035700 -0.705100
+vn -0.675800 -0.003700 -0.737100
+vn -0.722000 -0.009400 -0.691800
+vn -0.689000 0.023200 -0.724400
+vn -0.737700 -0.069200 -0.671600
+vn -0.752000 -0.043600 -0.657600
+vn -0.640500 0.026600 -0.767500
+vn -0.653000 0.054200 -0.755400
+vn -0.770800 -0.164000 -0.615600
+vn -0.748300 -0.129000 -0.650700
+vn -0.731800 -0.153700 -0.663900
+vn -0.753800 -0.188000 -0.629600
+vn -0.772500 -0.223300 -0.594300
+vn -0.790000 -0.200100 -0.579500
+vn -0.788100 -0.259500 -0.558200
+vn -0.805900 -0.237100 -0.542500
+vn -0.806500 -0.176700 -0.564100
+vn -0.787000 -0.139900 -0.600900
+vn -0.822300 -0.153100 -0.548100
+vn -0.802300 -0.115600 -0.585600
+vn -0.822800 -0.214500 -0.526300
+vn -0.838800 -0.191700 -0.509500
+vn -0.764000 -0.104100 -0.636700
+vn -0.778900 -0.079100 -0.622100
+vn -0.827100 -0.312800 -0.466800
+vn -0.818300 -0.274800 -0.504800
+vn -0.800200 -0.296300 -0.521300
+vn -0.808900 -0.333500 -0.484100
+vn -0.814100 -0.371000 -0.446600
+vn -0.832500 -0.351100 -0.428500
+vn -0.815900 -0.408800 -0.408800
+vn -0.834300 -0.389800 -0.389800
+vn -0.850000 -0.330900 -0.409900
+vn -0.844500 -0.291800 -0.449000
+vn -0.866500 -0.310300 -0.390900
+vn -0.861000 -0.270500 -0.430700
+vn -0.851800 -0.370400 -0.370400
+vn -0.868400 -0.350600 -0.350600
+vn -0.835400 -0.253000 -0.487800
+vn -0.851700 -0.230900 -0.470300
+vn -0.827100 -0.466800 -0.312800
+vn -0.832500 -0.428500 -0.351100
+vn -0.814100 -0.446600 -0.371000
+vn -0.808900 -0.484100 -0.333500
+vn -0.800200 -0.521300 -0.296300
+vn -0.818300 -0.504800 -0.274800
+vn -0.835400 -0.487800 -0.253000
+vn -0.844500 -0.449000 -0.291800
+vn -0.851700 -0.470300 -0.230900
+vn -0.861000 -0.430700 -0.270500
+vn -0.850000 -0.409900 -0.330900
+vn -0.866500 -0.390900 -0.310300
+vn -0.830400 -0.553100 -0.066700
+vn -0.851000 -0.514300 -0.105600
+vn -0.837100 -0.531400 -0.129400
+vn -0.816800 -0.569700 -0.091200
+vn -0.868200 -0.474400 -0.145500
+vn -0.853900 -0.492200 -0.168600
+vn -0.793000 -0.606900 -0.054000
+vn -0.806100 -0.591000 -0.028900
+vn -0.765600 -0.643000 -0.017900
+vn -0.778400 -0.627700 0.007800
+vn -0.818500 -0.574500 -0.003800
+vn -0.843100 -0.536100 -0.042200
+vn -0.830000 -0.557400 0.021300
+vn -0.854900 -0.518400 -0.017600
+vn -0.790300 -0.611800 0.033400
+vn -0.801400 -0.595200 0.059100
+vn -0.864100 -0.496700 -0.081600
+vn -0.881400 -0.456200 -0.122100
+vn -0.876200 -0.478400 -0.057600
+vn -0.893800 -0.437400 -0.098700
+vn -0.713100 -0.696800 0.076900
+vn -0.747200 -0.663100 0.043200
+vn -0.735000 -0.677800 0.016900
+vn -0.701400 -0.711000 0.050100
+vn -0.664800 -0.742500 0.081700
+vn -0.675800 -0.728900 0.109000
+vn -0.625100 -0.772500 0.111600
+vn -0.635500 -0.759400 0.139400
+vn -0.686200 -0.714500 0.136200
+vn -0.724000 -0.682000 0.103600
+vn -0.695800 -0.699400 0.163300
+vn -0.734100 -0.666400 0.130300
+vn -0.645300 -0.745400 0.167100
+vn -0.654300 -0.730700 0.194600
+vn -0.758700 -0.647700 0.069400
+vn -0.769300 -0.631600 0.095600
+vn -0.547100 -0.814200 0.194300
+vn -0.592500 -0.787800 0.167900
+vn -0.582800 -0.800500 0.139600
+vn -0.538200 -0.826400 0.165500
+vn -0.491300 -0.850200 0.189300
+vn -0.499400 -0.838300 0.218400
+vn -0.442000 -0.871800 0.210900
+vn -0.449400 -0.860300 0.240400
+vn -0.507100 -0.825600 0.247300
+vn -0.555500 -0.801100 0.222800
+vn -0.514200 -0.812000 0.275900
+vn -0.563300 -0.787100 0.251000
+vn -0.456300 -0.848000 0.269600
+vn -0.462700 -0.834700 0.298600
+vn -0.601600 -0.774300 0.196000
+vn -0.610000 -0.760000 0.223900
+vn -0.343900 -0.897100 0.277200
+vn -0.397400 -0.880000 0.260100
+vn -0.390900 -0.891100 0.230300
+vn -0.338300 -0.908000 0.247100
+vn -0.284300 -0.922400 0.261500
+vn -0.289000 -0.911700 0.291800
+vn -0.228800 -0.934300 0.273400
+vn -0.232600 -0.923900 0.303900
+vn -0.293400 -0.900100 0.321800
+vn -0.349200 -0.885300 0.307000
+vn -0.297600 -0.887600 0.351500
+vn -0.354100 -0.872600 0.336500
+vn -0.236200 -0.912400 0.334100
+vn -0.239500 -0.900100 0.364000
+vn -0.403500 -0.867900 0.289600
+vn -0.409100 -0.854900 0.318800
+vn -0.117300 -0.940100 0.320100
+vn -0.175200 -0.933300 0.313400
+vn -0.172300 -0.943600 0.282700
+vn -0.115400 -0.950200 0.289300
+vn -0.057900 -0.954200 0.293300
+vn -0.058900 -0.944100 0.324200
+vn 0.000000 -0.955600 0.294700
+vn 0.000000 -0.945500 0.325600
+vn -0.059800 -0.933000 0.354700
+vn -0.119100 -0.928900 0.350600
+vn -0.060600 -0.921000 0.384900
+vn -0.120800 -0.916800 0.380700
+vn 0.000000 -0.934400 0.356100
+vn 0.000000 -0.922400 0.386300
+vn -0.177900 -0.922100 0.343700
+vn -0.180400 -0.909800 0.373700
+vn 0.117300 -0.940100 0.320100
+vn 0.058900 -0.944100 0.324200
+vn 0.057900 -0.954200 0.293300
+vn 0.115400 -0.950200 0.289300
+vn 0.172300 -0.943600 0.282700
+vn 0.175200 -0.933300 0.313400
+vn 0.228800 -0.934300 0.273400
+vn 0.232600 -0.923900 0.303900
+vn 0.177900 -0.922100 0.343700
+vn 0.119100 -0.928900 0.350600
+vn 0.180400 -0.909800 0.373700
+vn 0.120800 -0.916800 0.380700
+vn 0.236200 -0.912400 0.334100
+vn 0.239500 -0.900100 0.364000
+vn 0.059800 -0.933000 0.354700
+vn 0.060600 -0.921000 0.384900
+vn 0.343900 -0.897100 0.277200
+vn 0.289000 -0.911700 0.291800
+vn 0.284300 -0.922400 0.261500
+vn 0.338300 -0.908000 0.247100
+vn 0.390900 -0.891100 0.230300
+vn 0.397400 -0.880000 0.260100
+vn 0.442000 -0.871800 0.210900
+vn 0.449400 -0.860300 0.240400
+vn 0.403500 -0.867900 0.289600
+vn 0.349200 -0.885300 0.307000
+vn 0.409100 -0.854900 0.318800
+vn 0.354100 -0.872600 0.336500
+vn 0.456300 -0.848000 0.269600
+vn 0.462700 -0.834700 0.298600
+vn 0.293400 -0.900100 0.321800
+vn 0.297600 -0.887600 0.351500
+vn 0.547100 -0.814200 0.194300
+vn 0.499400 -0.838300 0.218400
+vn 0.491300 -0.850200 0.189300
+vn 0.538200 -0.826400 0.165500
+vn 0.582800 -0.800500 0.139600
+vn 0.592500 -0.787800 0.167900
+vn 0.625100 -0.772500 0.111600
+vn 0.635500 -0.759400 0.139400
+vn 0.601600 -0.774300 0.196000
+vn 0.555500 -0.801100 0.222800
+vn 0.610000 -0.760000 0.223900
+vn 0.563300 -0.787100 0.251000
+vn 0.645300 -0.745400 0.167100
+vn 0.654300 -0.730700 0.194600
+vn 0.507100 -0.825600 0.247300
+vn 0.514200 -0.812000 0.275900
+vn 0.713100 -0.696900 0.076900
+vn 0.675800 -0.728900 0.109000
+vn 0.664800 -0.742500 0.081700
+vn 0.701400 -0.711000 0.050100
+vn 0.735000 -0.677800 0.016900
+vn 0.747200 -0.663100 0.043200
+vn 0.765600 -0.643000 -0.017900
+vn 0.778400 -0.627700 0.007800
+vn 0.758700 -0.647700 0.069400
+vn 0.724000 -0.682000 0.103600
+vn 0.769300 -0.631600 0.095600
+vn 0.734100 -0.666400 0.130300
+vn 0.790300 -0.611800 0.033400
+vn 0.801400 -0.595200 0.059100
+vn 0.686200 -0.714500 0.136200
+vn 0.695800 -0.699400 0.163300
+vn 0.830400 -0.553100 -0.066700
+vn 0.806100 -0.591000 -0.028900
+vn 0.793000 -0.606900 -0.054000
+vn 0.816800 -0.569700 -0.091200
+vn 0.837100 -0.531400 -0.129400
+vn 0.851000 -0.514300 -0.105600
+vn 0.853900 -0.492200 -0.168600
+vn 0.868200 -0.474400 -0.145500
+vn 0.864100 -0.496700 -0.081600
+vn 0.843100 -0.536100 -0.042200
+vn 0.876200 -0.478400 -0.057600
+vn 0.854900 -0.518400 -0.017600
+vn 0.881500 -0.456200 -0.122100
+vn 0.893800 -0.437400 -0.098700
+vn 0.818500 -0.574500 -0.003800
+vn 0.830000 -0.557400 0.021300
+vn 0.891100 -0.392900 -0.227000
+vn 0.881600 -0.433900 -0.186000
+vn 0.867100 -0.452300 -0.208600
+vn 0.876500 -0.412000 -0.248800
+vn 0.882200 -0.371400 -0.289500
+vn 0.896800 -0.351600 -0.268300
+vn 0.884100 -0.330400 -0.330400
+vn 0.898800 -0.309900 -0.309900
+vn 0.910600 -0.331400 -0.246900
+vn 0.904800 -0.373400 -0.204900
+vn 0.923400 -0.310900 -0.225100
+vn 0.917400 -0.353400 -0.182600
+vn 0.912500 -0.289200 -0.289200
+vn 0.925400 -0.268000 -0.268000
+vn 0.895000 -0.415000 -0.163300
+vn 0.907600 -0.395600 -0.140500
+vn 0.891100 -0.227000 -0.392900
+vn 0.896800 -0.268300 -0.351600
+vn 0.882200 -0.289500 -0.371400
+vn 0.876500 -0.248800 -0.412000
+vn 0.867100 -0.208600 -0.452300
+vn 0.881500 -0.186000 -0.433900
+vn 0.853900 -0.168600 -0.492200
+vn 0.868200 -0.145500 -0.474400
+vn 0.895000 -0.163300 -0.415000
+vn 0.904800 -0.204900 -0.373400
+vn 0.907600 -0.140500 -0.395600
+vn 0.917400 -0.182600 -0.353400
+vn 0.881400 -0.122100 -0.456200
+vn 0.893800 -0.098700 -0.437400
+vn 0.910600 -0.246900 -0.331400
+vn 0.923400 -0.225100 -0.310900
+vn 0.830400 -0.066700 -0.553100
+vn 0.851000 -0.105600 -0.514300
+vn 0.837100 -0.129400 -0.531400
+vn 0.816800 -0.091200 -0.569700
+vn 0.793000 -0.054000 -0.606900
+vn 0.806100 -0.028900 -0.591000
+vn 0.765600 -0.017900 -0.643000
+vn 0.778400 0.007800 -0.627700
+vn 0.818500 -0.003800 -0.574500
+vn 0.843100 -0.042200 -0.536100
+vn 0.830000 0.021300 -0.557400
+vn 0.854900 -0.017600 -0.518400
+vn 0.790300 0.033400 -0.611800
+vn 0.801400 0.059100 -0.595200
+vn 0.864100 -0.081600 -0.496700
+vn 0.876200 -0.057600 -0.478400
+vn 0.713100 0.076900 -0.696800
+vn 0.747200 0.043200 -0.663100
+vn 0.735000 0.016900 -0.677800
+vn 0.701400 0.050100 -0.711000
+vn 0.664800 0.081700 -0.742500
+vn 0.675800 0.109000 -0.728900
+vn 0.625100 0.111600 -0.772500
+vn 0.635500 0.139400 -0.759400
+vn 0.686200 0.136200 -0.714500
+vn 0.724000 0.103600 -0.682000
+vn 0.695800 0.163300 -0.699400
+vn 0.734100 0.130300 -0.666400
+vn 0.645300 0.167100 -0.745400
+vn 0.654300 0.194600 -0.730700
+vn 0.758700 0.069400 -0.647700
+vn 0.769300 0.095600 -0.631600
+vn 0.547100 0.194300 -0.814200
+vn 0.592500 0.167900 -0.787800
+vn 0.582800 0.139600 -0.800500
+vn 0.538200 0.165500 -0.826400
+vn 0.491300 0.189300 -0.850200
+vn 0.499400 0.218400 -0.838300
+vn 0.442000 0.210900 -0.871800
+vn 0.449400 0.240400 -0.860300
+vn 0.507100 0.247300 -0.825600
+vn 0.555500 0.222800 -0.801100
+vn 0.514200 0.275900 -0.812000
+vn 0.563300 0.251000 -0.787100
+vn 0.456300 0.269600 -0.848000
+vn 0.462700 0.298600 -0.834700
+vn 0.601600 0.196000 -0.774300
+vn 0.610000 0.223900 -0.760000
+vn 0.343900 0.277200 -0.897100
+vn 0.397400 0.260100 -0.880000
+vn 0.390900 0.230300 -0.891100
+vn 0.338300 0.247100 -0.908000
+vn 0.284300 0.261500 -0.922400
+vn 0.289000 0.291800 -0.911700
+vn 0.228800 0.273400 -0.934300
+vn 0.232600 0.303900 -0.923900
+vn 0.293400 0.321800 -0.900100
+vn 0.349200 0.307000 -0.885300
+vn 0.297600 0.351500 -0.887600
+vn 0.354100 0.336500 -0.872600
+vn 0.236200 0.334100 -0.912400
+vn 0.239500 0.364000 -0.900100
+vn 0.403500 0.289600 -0.867900
+vn 0.409100 0.318800 -0.854900
+vn 0.117300 0.320100 -0.940100
+vn 0.175200 0.313400 -0.933300
+vn 0.172300 0.282700 -0.943600
+vn 0.115400 0.289300 -0.950200
+vn 0.057900 0.293300 -0.954200
+vn 0.058900 0.324200 -0.944100
+vn 0.000000 0.294700 -0.955600
+vn 0.000000 0.325600 -0.945500
+vn 0.059800 0.354700 -0.933000
+vn 0.119100 0.350600 -0.928900
+vn 0.060600 0.384900 -0.921000
+vn 0.120800 0.380700 -0.916800
+vn 0.000000 0.356100 -0.934400
+vn 0.000000 0.386300 -0.922400
+vn 0.177900 0.343700 -0.922100
+vn 0.180400 0.373700 -0.909800
+vn -0.117300 0.320100 -0.940100
+vn -0.058900 0.324200 -0.944100
+vn -0.057900 0.293300 -0.954200
+vn -0.115400 0.289300 -0.950200
+vn -0.172300 0.282700 -0.943600
+vn -0.175200 0.313400 -0.933300
+vn -0.228800 0.273400 -0.934300
+vn -0.232600 0.303900 -0.923900
+vn -0.177900 0.343700 -0.922100
+vn -0.119100 0.350600 -0.928900
+vn -0.180400 0.373700 -0.909800
+vn -0.120800 0.380700 -0.916800
+vn -0.236200 0.334100 -0.912400
+vn -0.239500 0.364000 -0.900100
+vn -0.059800 0.354700 -0.933000
+vn -0.060600 0.384900 -0.921000
+vn -0.343900 0.277200 -0.897100
+vn -0.289000 0.291800 -0.911700
+vn -0.284300 0.261500 -0.922400
+vn -0.338300 0.247100 -0.908000
+vn -0.390900 0.230300 -0.891100
+vn -0.397400 0.260100 -0.880000
+vn -0.442000 0.210900 -0.871800
+vn -0.449400 0.240400 -0.860300
+vn -0.403500 0.289600 -0.867900
+vn -0.349200 0.307000 -0.885300
+vn -0.409100 0.318800 -0.854900
+vn -0.354100 0.336500 -0.872600
+vn -0.456300 0.269600 -0.848000
+vn -0.462700 0.298600 -0.834700
+vn -0.293400 0.321800 -0.900100
+vn -0.297600 0.351500 -0.887600
+vn -0.547100 0.194300 -0.814200
+vn -0.499400 0.218400 -0.838300
+vn -0.491300 0.189300 -0.850200
+vn -0.538200 0.165500 -0.826400
+vn -0.582800 0.139600 -0.800500
+vn -0.592500 0.167900 -0.787800
+vn -0.625100 0.111600 -0.772500
+vn -0.635500 0.139400 -0.759400
+vn -0.601600 0.196000 -0.774300
+vn -0.555500 0.222800 -0.801100
+vn -0.610000 0.223900 -0.760000
+vn -0.563300 0.251000 -0.787100
+vn -0.645300 0.167100 -0.745400
+vn -0.654300 0.194600 -0.730700
+vn -0.507100 0.247300 -0.825600
+vn -0.514200 0.275900 -0.812000
+vn -0.713100 0.076900 -0.696900
+vn -0.675800 0.109000 -0.728900
+vn -0.664800 0.081700 -0.742500
+vn -0.701400 0.050100 -0.711000
+vn -0.735000 0.016900 -0.677800
+vn -0.747200 0.043200 -0.663100
+vn -0.765600 -0.017900 -0.643000
+vn -0.778400 0.007800 -0.627700
+vn -0.758700 0.069400 -0.647700
+vn -0.724000 0.103600 -0.682000
+vn -0.769300 0.095600 -0.631600
+vn -0.734100 0.130300 -0.666400
+vn -0.790300 0.033400 -0.611800
+vn -0.801400 0.059100 -0.595200
+vn -0.686200 0.136200 -0.714500
+vn -0.695800 0.163300 -0.699400
+vn -0.830400 -0.066700 -0.553100
+vn -0.806100 -0.028900 -0.591000
+vn -0.793000 -0.054000 -0.606900
+vn -0.816800 -0.091200 -0.569700
+vn -0.837100 -0.129400 -0.531400
+vn -0.851000 -0.105600 -0.514300
+vn -0.853900 -0.168600 -0.492200
+vn -0.868200 -0.145500 -0.474400
+vn -0.864100 -0.081600 -0.496700
+vn -0.843100 -0.042200 -0.536100
+vn -0.876200 -0.057600 -0.478400
+vn -0.854900 -0.017600 -0.518400
+vn -0.881500 -0.122100 -0.456200
+vn -0.893800 -0.098700 -0.437400
+vn -0.818500 -0.003800 -0.574500
+vn -0.830000 0.021300 -0.557400
+vn -0.891100 -0.227000 -0.392900
+vn -0.881500 -0.186000 -0.433900
+vn -0.867100 -0.208600 -0.452300
+vn -0.876500 -0.248800 -0.412000
+vn -0.882200 -0.289500 -0.371400
+vn -0.896800 -0.268300 -0.351600
+vn -0.884100 -0.330400 -0.330400
+vn -0.898800 -0.309900 -0.309900
+vn -0.910600 -0.246900 -0.331400
+vn -0.904800 -0.204900 -0.373400
+vn -0.923400 -0.225100 -0.310900
+vn -0.917400 -0.182600 -0.353400
+vn -0.912500 -0.289200 -0.289200
+vn -0.925400 -0.268000 -0.268000
+vn -0.895000 -0.163300 -0.415000
+vn -0.907600 -0.140500 -0.395600
+vn -0.891100 -0.392900 -0.227000
+vn -0.896800 -0.351600 -0.268300
+vn -0.882200 -0.371400 -0.289500
+vn -0.876500 -0.412000 -0.248800
+vn -0.867100 -0.452300 -0.208600
+vn -0.881500 -0.433900 -0.186000
+vn -0.895000 -0.415000 -0.163300
+vn -0.904800 -0.373400 -0.204900
+vn -0.907600 -0.395600 -0.140500
+vn -0.917400 -0.353400 -0.182600
+vn -0.910600 -0.331400 -0.246900
+vn -0.923400 -0.310900 -0.225100
+vn -0.875800 -0.481600 0.031500
+vn -0.897600 -0.440600 -0.009500
+vn -0.887400 -0.459800 -0.033500
+vn -0.865800 -0.500300 0.006900
+vn -0.915700 -0.398500 -0.051500
+vn -0.905200 -0.418200 -0.075100
+vn -0.840600 -0.539700 0.046300
+vn -0.850300 -0.521400 0.071400
+vn -0.811600 -0.578000 0.084700
+vn -0.821000 -0.560200 0.110100
+vn -0.859100 -0.502600 0.096300
+vn -0.884900 -0.462400 0.056000
+vn -0.867000 -0.483400 0.121100
+vn -0.893000 -0.442700 0.080400
+vn -0.829500 -0.541800 0.135400
+vn -0.837100 -0.522900 0.160600
+vn -0.906900 -0.421000 0.014600
+vn -0.925200 -0.378500 -0.027900
+vn -0.915300 -0.400900 0.038600
+vn -0.933700 -0.358000 -0.004200
+vn -0.752100 -0.633100 0.183000
+vn -0.788100 -0.597500 0.147400
+vn -0.779200 -0.614900 0.121600
+vn -0.743500 -0.650100 0.156700
+vn -0.704700 -0.683500 0.190200
+vn -0.712800 -0.667000 0.216900
+vn -0.662700 -0.715200 0.221900
+vn -0.670300 -0.699000 0.248900
+vn -0.720200 -0.649700 0.243300
+vn -0.759900 -0.615500 0.209100
+vn -0.726800 -0.631700 0.269400
+vn -0.766900 -0.597200 0.235000
+vn -0.677300 -0.682100 0.275700
+vn -0.683500 -0.664400 0.302200
+vn -0.796300 -0.579500 0.173100
+vn -0.803600 -0.560900 0.198700
+vn -0.577100 -0.756900 0.306800
+vn -0.625000 -0.729100 0.279000
+vn -0.617800 -0.745000 0.251600
+vn -0.570500 -0.772400 0.279100
+vn -0.520800 -0.797600 0.304300
+vn -0.526800 -0.782300 0.332300
+vn -0.468600 -0.820600 0.327200
+vn -0.474000 -0.805600 0.355500
+vn -0.532200 -0.766300 0.359900
+vn -0.583100 -0.740500 0.334100
+vn -0.537100 -0.749400 0.387100
+vn -0.588400 -0.723400 0.361100
+vn -0.478900 -0.789700 0.383300
+vn -0.483300 -0.773100 0.410800
+vn -0.631400 -0.712500 0.306000
+vn -0.637200 -0.695100 0.332800
+vn -0.362800 -0.844400 0.394200
+vn -0.419100 -0.826300 0.376200
+vn -0.414400 -0.841000 0.347700
+vn -0.358600 -0.858900 0.365600
+vn -0.301400 -0.874100 0.380800
+vn -0.304800 -0.859800 0.409700
+vn -0.242600 -0.886700 0.393400
+vn -0.245300 -0.872500 0.422400
+vn -0.308000 -0.844500 0.438100
+vn -0.366500 -0.828900 0.422500
+vn -0.310800 -0.828300 0.466000
+vn -0.369900 -0.812600 0.450300
+vn -0.247900 -0.857400 0.451000
+vn -0.250200 -0.841300 0.479100
+vn -0.423500 -0.810700 0.404200
+vn -0.427400 -0.794200 0.431900
+vn -0.123700 -0.889600 0.439600
+vn -0.184800 -0.882500 0.432400
+vn -0.182700 -0.896600 0.403300
+vn -0.122300 -0.903700 0.410400
+vn -0.061400 -0.907900 0.414600
+vn -0.062100 -0.893900 0.443800
+vn 0.000000 -0.909300 0.416000
+vn 0.000000 -0.895400 0.445300
+vn -0.062800 -0.879000 0.472600
+vn -0.125000 -0.874700 0.468300
+vn -0.063400 -0.863200 0.500900
+vn -0.126200 -0.858800 0.496500
+vn 0.000000 -0.880500 0.474000
+vn 0.000000 -0.864600 0.502400
+vn -0.186700 -0.867500 0.461100
+vn -0.188400 -0.851500 0.489200
+vn 0.123700 -0.889600 0.439600
+vn 0.062100 -0.893900 0.443800
+vn 0.061400 -0.907900 0.414600
+vn 0.122300 -0.903700 0.410400
+vn 0.182700 -0.896600 0.403300
+vn 0.184800 -0.882500 0.432400
+vn 0.242600 -0.886700 0.393400
+vn 0.245300 -0.872500 0.422400
+vn 0.186700 -0.867500 0.461100
+vn 0.125000 -0.874700 0.468300
+vn 0.188400 -0.851500 0.489200
+vn 0.126200 -0.858800 0.496500
+vn 0.247900 -0.857400 0.451000
+vn 0.250200 -0.841300 0.479100
+vn 0.062800 -0.879000 0.472600
+vn 0.063400 -0.863200 0.500900
+vn 0.362800 -0.844400 0.394300
+vn 0.304800 -0.859800 0.409700
+vn 0.301400 -0.874100 0.380800
+vn 0.358600 -0.858900 0.365600
+vn 0.414400 -0.841000 0.347700
+vn 0.419100 -0.826300 0.376200
+vn 0.468600 -0.820600 0.327200
+vn 0.474000 -0.805600 0.355500
+vn 0.423500 -0.810700 0.404200
+vn 0.366500 -0.828900 0.422500
+vn 0.427400 -0.794200 0.431900
+vn 0.369900 -0.812600 0.450300
+vn 0.478900 -0.789700 0.383300
+vn 0.483300 -0.773100 0.410800
+vn 0.308000 -0.844500 0.438100
+vn 0.310800 -0.828300 0.466000
+vn 0.577100 -0.756900 0.306800
+vn 0.526800 -0.782300 0.332300
+vn 0.520800 -0.797600 0.304300
+vn 0.570500 -0.772400 0.279100
+vn 0.617800 -0.745000 0.251600
+vn 0.625000 -0.729100 0.279000
+vn 0.662700 -0.715200 0.221900
+vn 0.670300 -0.699000 0.248900
+vn 0.631400 -0.712500 0.306000
+vn 0.583100 -0.740500 0.334100
+vn 0.637200 -0.695100 0.332800
+vn 0.588400 -0.723400 0.361100
+vn 0.677300 -0.682100 0.275700
+vn 0.683500 -0.664400 0.302200
+vn 0.532200 -0.766300 0.359900
+vn 0.537100 -0.749400 0.387100
+vn 0.752100 -0.633100 0.183000
+vn 0.712800 -0.667000 0.216900
+vn 0.704700 -0.683500 0.190200
+vn 0.743500 -0.650100 0.156700
+vn 0.779200 -0.614900 0.121600
+vn 0.788100 -0.597500 0.147400
+vn 0.811600 -0.578000 0.084700
+vn 0.821000 -0.560200 0.110100
+vn 0.796300 -0.579500 0.173100
+vn 0.759900 -0.615500 0.209100
+vn 0.803600 -0.560900 0.198700
+vn 0.766900 -0.597200 0.235000
+vn 0.829500 -0.541800 0.135400
+vn 0.837100 -0.522900 0.160600
+vn 0.720200 -0.649700 0.243300
+vn 0.726800 -0.631700 0.269400
+vn 0.875800 -0.481600 0.031500
+vn 0.850300 -0.521400 0.071400
+vn 0.840600 -0.539700 0.046300
+vn 0.865800 -0.500300 0.006900
+vn 0.887400 -0.459800 -0.033500
+vn 0.897600 -0.440600 -0.009500
+vn 0.905200 -0.418200 -0.075100
+vn 0.915700 -0.398500 -0.051500
+vn 0.906900 -0.421000 0.014600
+vn 0.884900 -0.462400 0.056000
+vn 0.915300 -0.400900 0.038700
+vn 0.893000 -0.442700 0.080400
+vn 0.925200 -0.378500 -0.027900
+vn 0.933700 -0.358000 -0.004200
+vn 0.859100 -0.502600 0.096300
+vn 0.867000 -0.483400 0.121100
+vn 0.939900 -0.312500 -0.137500
+vn 0.929800 -0.355700 -0.094300
+vn 0.919200 -0.375800 -0.117500
+vn 0.929200 -0.333100 -0.160100
+vn 0.935100 -0.290100 -0.203200
+vn 0.946000 -0.269000 -0.181100
+vn 0.937200 -0.246700 -0.246700
+vn 0.948000 -0.225000 -0.225000
+vn 0.955700 -0.247600 -0.158800
+vn 0.949600 -0.291600 -0.114800
+vn 0.964500 -0.225900 -0.136300
+vn 0.958300 -0.270300 -0.091900
+vn 0.957800 -0.203200 -0.203200
+vn 0.966600 -0.181100 -0.181100
+vn 0.939400 -0.335200 -0.071100
+vn 0.948100 -0.314400 -0.047900
+vn 0.939900 -0.137500 -0.312500
+vn 0.946000 -0.181100 -0.269000
+vn 0.935100 -0.203200 -0.290100
+vn 0.929200 -0.160200 -0.333100
+vn 0.919200 -0.117500 -0.375800
+vn 0.929800 -0.094300 -0.355700
+vn 0.905200 -0.075100 -0.418200
+vn 0.915700 -0.051500 -0.398500
+vn 0.939400 -0.071100 -0.335200
+vn 0.949600 -0.114800 -0.291600
+vn 0.948100 -0.047900 -0.314400
+vn 0.958300 -0.091900 -0.270300
+vn 0.925200 -0.027900 -0.378500
+vn 0.933700 -0.004200 -0.358000
+vn 0.955700 -0.158800 -0.247600
+vn 0.964500 -0.136300 -0.225900
+vn 0.875800 0.031500 -0.481600
+vn 0.897600 -0.009500 -0.440600
+vn 0.887400 -0.033500 -0.459800
+vn 0.865800 0.006900 -0.500300
+vn 0.840600 0.046300 -0.539700
+vn 0.850300 0.071400 -0.521400
+vn 0.811600 0.084700 -0.578000
+vn 0.821000 0.110100 -0.560200
+vn 0.859100 0.096300 -0.502700
+vn 0.884900 0.056000 -0.462400
+vn 0.867000 0.121100 -0.483400
+vn 0.893000 0.080400 -0.442700
+vn 0.829500 0.135400 -0.541800
+vn 0.837100 0.160600 -0.522900
+vn 0.906900 0.014600 -0.421000
+vn 0.915300 0.038700 -0.400900
+vn 0.752100 0.183000 -0.633100
+vn 0.788100 0.147400 -0.597500
+vn 0.779200 0.121600 -0.614900
+vn 0.743500 0.156700 -0.650100
+vn 0.704700 0.190200 -0.683500
+vn 0.712800 0.216900 -0.667000
+vn 0.662700 0.221900 -0.715200
+vn 0.670300 0.248900 -0.699000
+vn 0.720200 0.243300 -0.649700
+vn 0.759900 0.209100 -0.615500
+vn 0.726800 0.269400 -0.631700
+vn 0.766900 0.235000 -0.597200
+vn 0.677300 0.275700 -0.682100
+vn 0.683500 0.302200 -0.664400
+vn 0.796300 0.173100 -0.579500
+vn 0.803600 0.198700 -0.560900
+vn 0.577100 0.306800 -0.756900
+vn 0.625000 0.279000 -0.729100
+vn 0.617800 0.251600 -0.745000
+vn 0.570500 0.279100 -0.772400
+vn 0.520800 0.304300 -0.797600
+vn 0.526800 0.332300 -0.782300
+vn 0.468600 0.327200 -0.820600
+vn 0.474000 0.355500 -0.805600
+vn 0.532200 0.359900 -0.766300
+vn 0.583100 0.334100 -0.740500
+vn 0.537100 0.387100 -0.749400
+vn 0.588400 0.361100 -0.723400
+vn 0.478900 0.383300 -0.789700
+vn 0.483300 0.410800 -0.773100
+vn 0.631400 0.306000 -0.712500
+vn 0.637200 0.332800 -0.695100
+vn 0.362800 0.394300 -0.844400
+vn 0.419100 0.376200 -0.826300
+vn 0.414400 0.347700 -0.841000
+vn 0.358600 0.365600 -0.858900
+vn 0.301400 0.380800 -0.874100
+vn 0.304800 0.409700 -0.859800
+vn 0.242500 0.393400 -0.886700
+vn 0.245300 0.422400 -0.872500
+vn 0.308000 0.438100 -0.844500
+vn 0.366500 0.422500 -0.828900
+vn 0.310800 0.466000 -0.828300
+vn 0.369900 0.450300 -0.812600
+vn 0.247900 0.451000 -0.857400
+vn 0.250200 0.479100 -0.841300
+vn 0.423500 0.404200 -0.810700
+vn 0.427400 0.431900 -0.794200
+vn 0.123700 0.439600 -0.889600
+vn 0.184800 0.432400 -0.882500
+vn 0.182700 0.403300 -0.896600
+vn 0.122300 0.410400 -0.903700
+vn 0.061400 0.414600 -0.907900
+vn 0.062100 0.443800 -0.893900
+vn 0.000000 0.416000 -0.909300
+vn 0.000000 0.445300 -0.895400
+vn 0.062800 0.472600 -0.879000
+vn 0.125000 0.468300 -0.874700
+vn 0.063400 0.500900 -0.863200
+vn 0.126200 0.496500 -0.858800
+vn 0.000000 0.474100 -0.880500
+vn 0.000000 0.502400 -0.864600
+vn 0.186700 0.461100 -0.867500
+vn 0.188400 0.489200 -0.851500
+vn -0.123700 0.439600 -0.889600
+vn -0.062100 0.443800 -0.893900
+vn -0.061400 0.414600 -0.907900
+vn -0.122300 0.410400 -0.903700
+vn -0.182700 0.403300 -0.896600
+vn -0.184800 0.432400 -0.882500
+vn -0.242600 0.393400 -0.886700
+vn -0.245300 0.422400 -0.872500
+vn -0.186700 0.461100 -0.867500
+vn -0.125000 0.468300 -0.874700
+vn -0.188400 0.489200 -0.851500
+vn -0.126200 0.496500 -0.858800
+vn -0.247900 0.451000 -0.857400
+vn -0.250200 0.479100 -0.841300
+vn -0.062800 0.472600 -0.879000
+vn -0.063400 0.500900 -0.863200
+vn -0.362800 0.394300 -0.844400
+vn -0.304800 0.409700 -0.859800
+vn -0.301400 0.380800 -0.874100
+vn -0.358600 0.365600 -0.858900
+vn -0.414400 0.347700 -0.841000
+vn -0.419100 0.376200 -0.826300
+vn -0.468600 0.327200 -0.820600
+vn -0.474000 0.355500 -0.805600
+vn -0.423500 0.404200 -0.810700
+vn -0.366500 0.422500 -0.828900
+vn -0.427400 0.431900 -0.794200
+vn -0.369900 0.450300 -0.812600
+vn -0.478900 0.383300 -0.789700
+vn -0.483300 0.410800 -0.773100
+vn -0.308000 0.438100 -0.844500
+vn -0.310800 0.466000 -0.828300
+vn -0.577100 0.306800 -0.756900
+vn -0.526800 0.332300 -0.782300
+vn -0.520800 0.304300 -0.797600
+vn -0.570500 0.279100 -0.772400
+vn -0.617800 0.251600 -0.745000
+vn -0.625000 0.279000 -0.729100
+vn -0.662700 0.221900 -0.715200
+vn -0.670300 0.248900 -0.699000
+vn -0.631400 0.306000 -0.712500
+vn -0.583100 0.334100 -0.740500
+vn -0.637200 0.332800 -0.695100
+vn -0.588400 0.361100 -0.723400
+vn -0.677300 0.275700 -0.682100
+vn -0.683500 0.302200 -0.664400
+vn -0.532200 0.359900 -0.766300
+vn -0.537100 0.387100 -0.749400
+vn -0.752100 0.183000 -0.633100
+vn -0.712800 0.216900 -0.667000
+vn -0.704700 0.190200 -0.683500
+vn -0.743500 0.156700 -0.650100
+vn -0.779200 0.121600 -0.614900
+vn -0.788100 0.147400 -0.597500
+vn -0.811600 0.084700 -0.578000
+vn -0.821000 0.110100 -0.560200
+vn -0.796300 0.173100 -0.579500
+vn -0.759900 0.209100 -0.615500
+vn -0.803600 0.198700 -0.560900
+vn -0.766900 0.235000 -0.597200
+vn -0.829500 0.135400 -0.541800
+vn -0.837100 0.160600 -0.522900
+vn -0.720200 0.243300 -0.649700
+vn -0.726800 0.269400 -0.631700
+vn -0.875800 0.031500 -0.481600
+vn -0.850300 0.071400 -0.521400
+vn -0.840600 0.046300 -0.539700
+vn -0.865800 0.006900 -0.500200
+vn -0.887400 -0.033500 -0.459800
+vn -0.897600 -0.009500 -0.440600
+vn -0.905200 -0.075100 -0.418200
+vn -0.915700 -0.051500 -0.398500
+vn -0.906900 0.014600 -0.421000
+vn -0.884900 0.056000 -0.462400
+vn -0.915300 0.038700 -0.400900
+vn -0.893000 0.080400 -0.442700
+vn -0.925200 -0.027900 -0.378500
+vn -0.933700 -0.004200 -0.358000
+vn -0.859100 0.096300 -0.502700
+vn -0.867000 0.121100 -0.483400
+vn -0.939900 -0.137500 -0.312500
+vn -0.929800 -0.094300 -0.355700
+vn -0.919200 -0.117500 -0.375800
+vn -0.929200 -0.160100 -0.333100
+vn -0.935100 -0.203200 -0.290100
+vn -0.946000 -0.181100 -0.269000
+vn -0.937200 -0.246700 -0.246700
+vn -0.948000 -0.225000 -0.225000
+vn -0.955700 -0.158800 -0.247600
+vn -0.949600 -0.114800 -0.291600
+vn -0.964500 -0.136300 -0.225900
+vn -0.958300 -0.091900 -0.270300
+vn -0.957800 -0.203200 -0.203200
+vn -0.966600 -0.181100 -0.181100
+vn -0.939400 -0.071100 -0.335200
+vn -0.948100 -0.047900 -0.314400
+vn -0.939900 -0.312500 -0.137500
+vn -0.946000 -0.269000 -0.181100
+vn -0.935100 -0.290100 -0.203200
+vn -0.929200 -0.333100 -0.160100
+vn -0.919200 -0.375800 -0.117500
+vn -0.929800 -0.355700 -0.094300
+vn -0.939400 -0.335200 -0.071100
+vn -0.949600 -0.291600 -0.114800
+vn -0.948100 -0.314400 -0.047900
+vn -0.958300 -0.270300 -0.091900
+vn -0.955700 -0.247600 -0.158800
+vn -0.964500 -0.225900 -0.136300
+vn -0.906500 -0.402000 0.129000
+vn -0.929100 -0.359600 0.086600
+vn -0.922700 -0.380400 0.062700
+vn -0.900200 -0.422500 0.104800
+vn -0.947800 -0.316000 0.043100
+vn -0.941200 -0.337200 0.019400
+vn -0.874000 -0.463500 0.145800
+vn -0.880100 -0.443300 0.170300
+vn -0.843900 -0.503400 0.185600
+vn -0.849700 -0.483400 0.210400
+vn -0.885200 -0.422500 0.194600
+vn -0.911800 -0.381000 0.153100
+vn -0.889400 -0.401300 0.218700
+vn -0.916100 -0.359600 0.177000
+vn -0.854700 -0.462900 0.235000
+vn -0.858800 -0.441900 0.259300
+vn -0.934500 -0.338400 0.110400
+vn -0.953300 -0.294600 0.066700
+vn -0.938900 -0.316800 0.134200
+vn -0.957800 -0.272800 0.090200
+vn -0.778400 -0.558800 0.285900
+vn -0.815700 -0.522000 0.249000
+vn -0.810100 -0.541700 0.224000
+vn -0.773100 -0.578300 0.260600
+vn -0.732700 -0.613100 0.295300
+vn -0.737800 -0.593900 0.320900
+vn -0.689000 -0.646100 0.328300
+vn -0.693800 -0.627100 0.354100
+vn -0.742100 -0.574000 0.346100
+vn -0.783000 -0.538800 0.310900
+vn -0.745600 -0.553500 0.371000
+vn -0.786700 -0.518100 0.335600
+vn -0.697800 -0.607400 0.379500
+vn -0.701200 -0.587100 0.404500
+vn -0.820500 -0.501800 0.273800
+vn -0.824400 -0.480900 0.298300
+vn -0.597300 -0.686900 0.413900
+vn -0.646800 -0.658200 0.385200
+vn -0.642400 -0.677000 0.359200
+vn -0.593200 -0.705500 0.387700
+vn -0.541500 -0.731700 0.414000
+vn -0.545200 -0.713300 0.440300
+vn -0.487200 -0.755600 0.437800
+vn -0.490600 -0.737300 0.464300
+vn -0.548400 -0.694100 0.466200
+vn -0.600800 -0.667600 0.439700
+vn -0.551000 -0.674200 0.491700
+vn -0.603700 -0.647600 0.465000
+vn -0.493500 -0.718300 0.490400
+vn -0.495800 -0.698500 0.515900
+vn -0.650600 -0.638700 0.410800
+vn -0.653700 -0.618500 0.435900
+vn -0.375500 -0.777500 0.504500
+vn -0.433800 -0.758800 0.485800
+vn -0.430800 -0.776900 0.459100
+vn -0.372900 -0.795400 0.477700
+vn -0.313300 -0.811300 0.493500
+vn -0.315500 -0.793400 0.520500
+vn -0.252200 -0.824400 0.506600
+vn -0.253900 -0.806600 0.533600
+vn -0.317400 -0.774700 0.546800
+vn -0.377700 -0.758700 0.530800
+vn -0.318900 -0.755200 0.572600
+vn -0.379500 -0.739100 0.556500
+vn -0.255400 -0.788000 0.560100
+vn -0.256600 -0.768600 0.586000
+vn -0.436400 -0.739900 0.511900
+vn -0.438500 -0.720200 0.537600
+vn -0.128100 -0.824300 0.551400
+vn -0.191300 -0.817000 0.544000
+vn -0.189900 -0.834700 0.516900
+vn -0.127200 -0.842000 0.524200
+vn -0.063800 -0.846400 0.528600
+vn -0.064300 -0.828800 0.555800
+vn 0.000000 -0.847900 0.530100
+vn 0.000000 -0.830300 0.557300
+vn -0.064700 -0.810300 0.582400
+vn -0.128800 -0.805800 0.577900
+vn -0.065000 -0.790900 0.608400
+vn -0.129400 -0.786500 0.603900
+vn 0.000000 -0.811800 0.583900
+vn 0.000000 -0.792500 0.609900
+vn -0.192400 -0.798400 0.570500
+vn -0.193300 -0.779000 0.596400
+vn 0.128100 -0.824300 0.551400
+vn 0.064300 -0.828800 0.555800
+vn 0.063800 -0.846400 0.528600
+vn 0.127200 -0.842000 0.524200
+vn 0.189900 -0.834700 0.516900
+vn 0.191300 -0.817000 0.544000
+vn 0.252200 -0.824400 0.506600
+vn 0.253900 -0.806600 0.533600
+vn 0.192400 -0.798400 0.570500
+vn 0.128800 -0.805800 0.577900
+vn 0.193300 -0.779000 0.596400
+vn 0.129400 -0.786500 0.603900
+vn 0.255400 -0.788000 0.560100
+vn 0.256600 -0.768600 0.586000
+vn 0.064700 -0.810300 0.582400
+vn 0.065000 -0.790900 0.608400
+vn 0.375500 -0.777500 0.504500
+vn 0.315500 -0.793400 0.520500
+vn 0.313300 -0.811300 0.493500
+vn 0.372900 -0.795400 0.477700
+vn 0.430800 -0.776900 0.459100
+vn 0.433800 -0.758800 0.485800
+vn 0.487200 -0.755600 0.437800
+vn 0.490600 -0.737300 0.464300
+vn 0.436400 -0.739900 0.511900
+vn 0.377700 -0.758700 0.530800
+vn 0.438500 -0.720200 0.537600
+vn 0.379500 -0.739100 0.556500
+vn 0.493500 -0.718300 0.490400
+vn 0.495800 -0.698500 0.515900
+vn 0.317400 -0.774700 0.546800
+vn 0.318900 -0.755200 0.572600
+vn 0.597300 -0.686900 0.413900
+vn 0.545200 -0.713300 0.440300
+vn 0.541500 -0.731700 0.414000
+vn 0.593200 -0.705500 0.387700
+vn 0.642400 -0.677000 0.359200
+vn 0.646800 -0.658200 0.385200
+vn 0.689000 -0.646100 0.328300
+vn 0.693800 -0.627100 0.354100
+vn 0.650600 -0.638700 0.410800
+vn 0.600800 -0.667600 0.439700
+vn 0.653700 -0.618500 0.435900
+vn 0.603700 -0.647600 0.465000
+vn 0.697800 -0.607400 0.379500
+vn 0.701200 -0.587100 0.404500
+vn 0.548400 -0.694100 0.466200
+vn 0.551000 -0.674200 0.491700
+vn 0.778400 -0.558800 0.285900
+vn 0.737800 -0.593900 0.320900
+vn 0.732700 -0.613100 0.295300
+vn 0.773100 -0.578300 0.260600
+vn 0.810100 -0.541700 0.224000
+vn 0.815700 -0.522000 0.249000
+vn 0.843900 -0.503400 0.185600
+vn 0.849700 -0.483400 0.210400
+vn 0.820500 -0.501800 0.273800
+vn 0.783000 -0.538800 0.310900
+vn 0.824400 -0.480900 0.298300
+vn 0.786700 -0.518100 0.335600
+vn 0.854700 -0.462900 0.235000
+vn 0.858800 -0.441900 0.259300
+vn 0.742100 -0.574000 0.346100
+vn 0.745600 -0.553500 0.370900
+vn 0.906500 -0.402000 0.129000
+vn 0.880100 -0.443300 0.170300
+vn 0.874000 -0.463500 0.145800
+vn 0.900200 -0.422500 0.104800
+vn 0.922700 -0.380400 0.062700
+vn 0.929100 -0.359600 0.086600
+vn 0.941200 -0.337200 0.019400
+vn 0.947800 -0.316000 0.043100
+vn 0.934500 -0.338400 0.110400
+vn 0.911800 -0.381000 0.153100
+vn 0.938900 -0.316800 0.134200
+vn 0.916100 -0.359600 0.177000
+vn 0.953300 -0.294600 0.066700
+vn 0.957800 -0.272800 0.090200
+vn 0.885200 -0.422500 0.194600
+vn 0.889400 -0.401300 0.218700
+vn 0.972800 -0.227000 -0.045900
+vn 0.962300 -0.271700 -0.001200
+vn 0.955700 -0.293200 -0.024500
+vn 0.966100 -0.248800 -0.068900
+vn 0.972300 -0.204000 -0.113700
+vn 0.979100 -0.182000 -0.091000
+vn 0.974400 -0.158900 -0.158900
+vn 0.981200 -0.136500 -0.136500
+vn 0.984800 -0.159700 -0.068200
+vn 0.978500 -0.205000 -0.022900
+vn 0.989500 -0.137200 -0.045300
+vn 0.983100 -0.182800 0.000200
+vn 0.986900 -0.114000 -0.114000
+vn 0.991600 -0.091300 -0.091300
+vn 0.968000 -0.250000 0.022100
+vn 0.972600 -0.228000 0.045400
+vn 0.972800 -0.045900 -0.227000
+vn 0.979100 -0.091000 -0.182000
+vn 0.972300 -0.113700 -0.204000
+vn 0.966100 -0.068900 -0.248800
+vn 0.955700 -0.024500 -0.293200
+vn 0.962300 -0.001200 -0.271700
+vn 0.941200 0.019400 -0.337200
+vn 0.947800 0.043100 -0.316000
+vn 0.968000 0.022100 -0.250000
+vn 0.978500 -0.022900 -0.205000
+vn 0.972600 0.045400 -0.228000
+vn 0.983100 0.000200 -0.182800
+vn 0.953300 0.066700 -0.294600
+vn 0.957800 0.090200 -0.272800
+vn 0.984800 -0.068200 -0.159700
+vn 0.989500 -0.045300 -0.137200
+vn 0.906500 0.129000 -0.402000
+vn 0.929100 0.086600 -0.359600
+vn 0.922700 0.062700 -0.380400
+vn 0.900200 0.104800 -0.422500
+vn 0.874000 0.145800 -0.463500
+vn 0.880100 0.170300 -0.443300
+vn 0.843900 0.185600 -0.503400
+vn 0.849700 0.210400 -0.483400
+vn 0.885200 0.194600 -0.422500
+vn 0.911800 0.153100 -0.381000
+vn 0.889400 0.218700 -0.401300
+vn 0.916100 0.177000 -0.359600
+vn 0.854700 0.235000 -0.462900
+vn 0.858800 0.259300 -0.441900
+vn 0.934500 0.110400 -0.338400
+vn 0.938900 0.134200 -0.316800
+vn 0.778400 0.285900 -0.558800
+vn 0.815700 0.249000 -0.522000
+vn 0.810100 0.224000 -0.541700
+vn 0.773100 0.260600 -0.578300
+vn 0.732700 0.295300 -0.613100
+vn 0.737800 0.320900 -0.593900
+vn 0.689000 0.328300 -0.646100
+vn 0.693800 0.354100 -0.627100
+vn 0.742100 0.346100 -0.574000
+vn 0.783000 0.310900 -0.538800
+vn 0.745600 0.371000 -0.553500
+vn 0.786700 0.335600 -0.518100
+vn 0.697800 0.379500 -0.607400
+vn 0.701200 0.404500 -0.587100
+vn 0.820500 0.273800 -0.501800
+vn 0.824400 0.298300 -0.480900
+vn 0.597300 0.413900 -0.686900
+vn 0.646800 0.385200 -0.658200
+vn 0.642400 0.359200 -0.677000
+vn 0.593200 0.387700 -0.705500
+vn 0.541500 0.414000 -0.731700
+vn 0.545200 0.440300 -0.713300
+vn 0.487200 0.437800 -0.755600
+vn 0.490600 0.464300 -0.737300
+vn 0.548400 0.466200 -0.694100
+vn 0.600800 0.439700 -0.667600
+vn 0.551000 0.491700 -0.674200
+vn 0.603700 0.465000 -0.647600
+vn 0.493500 0.490400 -0.718300
+vn 0.495800 0.515900 -0.698500
+vn 0.650600 0.410800 -0.638700
+vn 0.653700 0.435900 -0.618500
+vn 0.375500 0.504500 -0.777500
+vn 0.433800 0.485800 -0.758800
+vn 0.430800 0.459100 -0.776900
+vn 0.372900 0.477700 -0.795400
+vn 0.313300 0.493500 -0.811300
+vn 0.315500 0.520500 -0.793400
+vn 0.252200 0.506700 -0.824400
+vn 0.253900 0.533600 -0.806600
+vn 0.317400 0.546800 -0.774700
+vn 0.377700 0.530800 -0.758700
+vn 0.318900 0.572600 -0.755200
+vn 0.379500 0.556500 -0.739100
+vn 0.255400 0.560100 -0.788000
+vn 0.256600 0.586000 -0.768600
+vn 0.436400 0.511900 -0.739900
+vn 0.438500 0.537600 -0.720200
+vn 0.128100 0.551400 -0.824300
+vn 0.191300 0.544000 -0.817000
+vn 0.189900 0.516900 -0.834700
+vn 0.127200 0.524200 -0.842000
+vn 0.063800 0.528600 -0.846400
+vn 0.064300 0.555800 -0.828800
+vn 0.000000 0.530100 -0.847900
+vn 0.000000 0.557300 -0.830300
+vn 0.064700 0.582400 -0.810300
+vn 0.128800 0.577900 -0.805800
+vn 0.065000 0.608400 -0.790900
+vn 0.129400 0.603900 -0.786500
+vn 0.000000 0.583900 -0.811800
+vn 0.000000 0.609900 -0.792500
+vn 0.192400 0.570500 -0.798400
+vn 0.193300 0.596400 -0.779000
+vn -0.128100 0.551400 -0.824300
+vn -0.064300 0.555800 -0.828800
+vn -0.063800 0.528600 -0.846400
+vn -0.127200 0.524200 -0.842000
+vn -0.189900 0.516900 -0.834700
+vn -0.191300 0.544000 -0.817000
+vn -0.252200 0.506700 -0.824400
+vn -0.253900 0.533600 -0.806600
+vn -0.192400 0.570500 -0.798400
+vn -0.128800 0.577900 -0.805800
+vn -0.193300 0.596400 -0.779000
+vn -0.129400 0.603900 -0.786500
+vn -0.255400 0.560100 -0.788000
+vn -0.256600 0.586000 -0.768600
+vn -0.064700 0.582400 -0.810300
+vn -0.065000 0.608400 -0.790900
+vn -0.375500 0.504500 -0.777500
+vn -0.315500 0.520500 -0.793400
+vn -0.313300 0.493500 -0.811300
+vn -0.372900 0.477700 -0.795400
+vn -0.430800 0.459100 -0.776900
+vn -0.433800 0.485800 -0.758800
+vn -0.487200 0.437800 -0.755600
+vn -0.490600 0.464300 -0.737300
+vn -0.436400 0.511900 -0.739900
+vn -0.377700 0.530800 -0.758700
+vn -0.438500 0.537600 -0.720200
+vn -0.379500 0.556500 -0.739100
+vn -0.493500 0.490400 -0.718300
+vn -0.495800 0.515900 -0.698500
+vn -0.317400 0.546800 -0.774700
+vn -0.318900 0.572600 -0.755200
+vn -0.597300 0.413900 -0.686900
+vn -0.545200 0.440300 -0.713300
+vn -0.541500 0.414000 -0.731700
+vn -0.593200 0.387700 -0.705500
+vn -0.642400 0.359200 -0.677000
+vn -0.646800 0.385200 -0.658200
+vn -0.689000 0.328300 -0.646100
+vn -0.693800 0.354100 -0.627100
+vn -0.650600 0.410800 -0.638700
+vn -0.600800 0.439700 -0.667600
+vn -0.653700 0.435900 -0.618500
+vn -0.603700 0.465000 -0.647600
+vn -0.697800 0.379500 -0.607400
+vn -0.701200 0.404500 -0.587100
+vn -0.548400 0.466200 -0.694100
+vn -0.551000 0.491700 -0.674200
+vn -0.778400 0.285900 -0.558800
+vn -0.737800 0.320900 -0.593900
+vn -0.732700 0.295300 -0.613100
+vn -0.773100 0.260600 -0.578300
+vn -0.810100 0.224000 -0.541700
+vn -0.815700 0.249000 -0.522000
+vn -0.843900 0.185600 -0.503400
+vn -0.849700 0.210400 -0.483400
+vn -0.820500 0.273800 -0.501800
+vn -0.783000 0.310900 -0.538800
+vn -0.824400 0.298300 -0.480900
+vn -0.786700 0.335600 -0.518100
+vn -0.854700 0.235000 -0.462900
+vn -0.858800 0.259300 -0.441900
+vn -0.742100 0.346100 -0.574000
+vn -0.745600 0.370900 -0.553500
+vn -0.906500 0.129000 -0.402000
+vn -0.880100 0.170300 -0.443300
+vn -0.874000 0.145800 -0.463500
+vn -0.900200 0.104800 -0.422500
+vn -0.922700 0.062700 -0.380400
+vn -0.929100 0.086600 -0.359600
+vn -0.941200 0.019400 -0.337200
+vn -0.947800 0.043100 -0.316000
+vn -0.934500 0.110400 -0.338400
+vn -0.911800 0.153100 -0.381000
+vn -0.938900 0.134200 -0.316800
+vn -0.916100 0.177000 -0.359600
+vn -0.953300 0.066700 -0.294600
+vn -0.957800 0.090200 -0.272800
+vn -0.885200 0.194600 -0.422500
+vn -0.889400 0.218700 -0.401300
+vn -0.972800 -0.045900 -0.227000
+vn -0.962300 -0.001200 -0.271700
+vn -0.955700 -0.024500 -0.293200
+vn -0.966100 -0.068900 -0.248800
+vn -0.972300 -0.113700 -0.204000
+vn -0.979100 -0.091000 -0.182000
+vn -0.974400 -0.158900 -0.158900
+vn -0.981200 -0.136500 -0.136500
+vn -0.984800 -0.068200 -0.159700
+vn -0.978500 -0.022900 -0.205000
+vn -0.989500 -0.045300 -0.137200
+vn -0.983100 0.000200 -0.182800
+vn -0.986900 -0.114000 -0.114000
+vn -0.991600 -0.091300 -0.091300
+vn -0.968000 0.022100 -0.250000
+vn -0.972600 0.045400 -0.228000
+vn -0.972800 -0.227000 -0.045900
+vn -0.979100 -0.182000 -0.091000
+vn -0.972300 -0.204000 -0.113700
+vn -0.966100 -0.248800 -0.068900
+vn -0.955700 -0.293200 -0.024500
+vn -0.962300 -0.271700 -0.001200
+vn -0.968000 -0.250000 0.022100
+vn -0.978500 -0.205000 -0.022900
+vn -0.972600 -0.228000 0.045400
+vn -0.983100 -0.182800 0.000200
+vn -0.984800 -0.159700 -0.068200
+vn -0.989500 -0.137200 -0.045300
+vn -0.921900 -0.315700 0.224300
+vn -0.944900 -0.272600 0.181200
+vn -0.942400 -0.294800 0.157800
+vn -0.919500 -0.337800 0.200800
+vn -0.963900 -0.228400 0.136900
+vn -0.961400 -0.250700 0.113600
+vn -0.892700 -0.379700 0.242600
+vn -0.895000 -0.357700 0.266200
+vn -0.861900 -0.420400 0.283300
+vn -0.864200 -0.398500 0.307000
+vn -0.896500 -0.335400 0.289600
+vn -0.923400 -0.293300 0.247500
+vn -0.896900 -0.312600 0.312600
+vn -0.923900 -0.270600 0.270600
+vn -0.865600 -0.376200 0.330500
+vn -0.866000 -0.353500 0.353500
+vn -0.946400 -0.250200 0.204400
+vn -0.965400 -0.205800 0.160000
+vn -0.946900 -0.227400 0.227400
+vn -0.965900 -0.183000 0.183000
+vn -0.791700 -0.475300 0.383800
+vn -0.829600 -0.437800 0.346400
+vn -0.827400 -0.459600 0.322500
+vn -0.789600 -0.497000 0.359900
+vn -0.748400 -0.532500 0.395400
+vn -0.750300 -0.510900 0.419400
+vn -0.703800 -0.566200 0.429100
+vn -0.705600 -0.544700 0.453200
+vn -0.751500 -0.488800 0.443000
+vn -0.792900 -0.453100 0.407300
+vn -0.751900 -0.466100 0.466100
+vn -0.793300 -0.430400 0.430400
+vn -0.706700 -0.522600 0.476800
+vn -0.707100 -0.500000 0.500000
+vn -0.830900 -0.415600 0.369800
+vn -0.831400 -0.392900 0.392900
+vn -0.607500 -0.605500 0.514100
+vn -0.657900 -0.576300 0.484800
+vn -0.656100 -0.597700 0.460600
+vn -0.605900 -0.626900 0.489800
+vn -0.553100 -0.653600 0.516600
+vn -0.554500 -0.632400 0.540900
+vn -0.497600 -0.678000 0.540900
+vn -0.498900 -0.656800 0.565300
+vn -0.555400 -0.610500 0.564700
+vn -0.608400 -0.583600 0.537800
+vn -0.555700 -0.587900 0.587900
+vn -0.608800 -0.561000 0.561000
+vn -0.499700 -0.634900 0.589100
+vn -0.500000 -0.612400 0.612400
+vn -0.658900 -0.554300 0.508500
+vn -0.659200 -0.531700 0.531700
+vn -0.381900 -0.697700 0.606200
+vn -0.441200 -0.678600 0.587100
+vn -0.440100 -0.699800 0.562700
+vn -0.380900 -0.718700 0.581700
+vn -0.320000 -0.734900 0.597800
+vn -0.320900 -0.713900 0.622400
+vn -0.257600 -0.748300 0.611200
+vn -0.258200 -0.727300 0.635800
+vn -0.321400 -0.692100 0.646300
+vn -0.382500 -0.675800 0.630000
+vn -0.321500 -0.669500 0.669500
+vn -0.382700 -0.653300 0.653300
+vn -0.258700 -0.705500 0.659700
+vn -0.258800 -0.683000 0.683000
+vn -0.441900 -0.656800 0.611000
+vn -0.442200 -0.634200 0.634200
+vn -0.130300 -0.745300 0.653800
+vn -0.194500 -0.737800 0.646300
+vn -0.194000 -0.758800 0.621700
+vn -0.129900 -0.766300 0.629200
+vn -0.065200 -0.770800 0.633700
+vn -0.065400 -0.749800 0.658300
+vn 0.000000 -0.772300 0.635200
+vn 0.000000 -0.751400 0.659900
+vn -0.065500 -0.728100 0.682300
+vn -0.130400 -0.723600 0.677800
+vn -0.065500 -0.705600 0.705600
+vn -0.130500 -0.701000 0.701000
+vn 0.000000 -0.729600 0.683800
+vn -0.194800 -0.716100 0.670300
+vn -0.195000 -0.693500 0.693500
+vn 0.130200 -0.745300 0.653800
+vn 0.065400 -0.749800 0.658300
+vn 0.065200 -0.770800 0.633700
+vn 0.129900 -0.766300 0.629200
+vn 0.194000 -0.758800 0.621700
+vn 0.194500 -0.737800 0.646300
+vn 0.257600 -0.748300 0.611200
+vn 0.258200 -0.727300 0.635800
+vn 0.194800 -0.716100 0.670300
+vn 0.130400 -0.723600 0.677800
+vn 0.194900 -0.693500 0.693500
+vn 0.130500 -0.701000 0.701000
+vn 0.258700 -0.705500 0.659700
+vn 0.258800 -0.683000 0.683000
+vn 0.065500 -0.728100 0.682300
+vn 0.065500 -0.705600 0.705600
+vn 0.381900 -0.697700 0.606200
+vn 0.320900 -0.713900 0.622400
+vn 0.320000 -0.734900 0.597800
+vn 0.380900 -0.718700 0.581700
+vn 0.440100 -0.699800 0.562700
+vn 0.441200 -0.678600 0.587100
+vn 0.497600 -0.678000 0.540900
+vn 0.498900 -0.656800 0.565300
+vn 0.441900 -0.656800 0.611000
+vn 0.382500 -0.675800 0.630000
+vn 0.442200 -0.634200 0.634200
+vn 0.382700 -0.653300 0.653300
+vn 0.499700 -0.634900 0.589100
+vn 0.500000 -0.612400 0.612400
+vn 0.321400 -0.692100 0.646300
+vn 0.321500 -0.669500 0.669500
+vn 0.607500 -0.605500 0.514100
+vn 0.554500 -0.632400 0.540900
+vn 0.553100 -0.653600 0.516600
+vn 0.605900 -0.626900 0.489800
+vn 0.656100 -0.597700 0.460600
+vn 0.657900 -0.576300 0.484800
+vn 0.703800 -0.566200 0.429100
+vn 0.705600 -0.544700 0.453200
+vn 0.658900 -0.554300 0.508500
+vn 0.608400 -0.583600 0.537800
+vn 0.659200 -0.531700 0.531700
+vn 0.608800 -0.561000 0.561000
+vn 0.706700 -0.522600 0.476800
+vn 0.707100 -0.500000 0.500000
+vn 0.555400 -0.610500 0.564700
+vn 0.555700 -0.587900 0.587900
+vn 0.791700 -0.475300 0.383800
+vn 0.750300 -0.510900 0.419400
+vn 0.748400 -0.532500 0.395400
+vn 0.789600 -0.497000 0.359900
+vn 0.827400 -0.459600 0.322500
+vn 0.829600 -0.437800 0.346400
+vn 0.861900 -0.420400 0.283300
+vn 0.864200 -0.398500 0.307000
+vn 0.830900 -0.415600 0.369800
+vn 0.792900 -0.453100 0.407300
+vn 0.831400 -0.392900 0.392900
+vn 0.793300 -0.430400 0.430400
+vn 0.865600 -0.376200 0.330500
+vn 0.866000 -0.353500 0.353500
+vn 0.751500 -0.488800 0.443000
+vn 0.751900 -0.466100 0.466100
+vn 0.921900 -0.315700 0.224300
+vn 0.895000 -0.357700 0.266200
+vn 0.892700 -0.379700 0.242600
+vn 0.919500 -0.337800 0.200800
+vn 0.942400 -0.294800 0.157800
+vn 0.944900 -0.272600 0.181200
+vn 0.961400 -0.250700 0.113600
+vn 0.963900 -0.228400 0.136900
+vn 0.946400 -0.250200 0.204400
+vn 0.923400 -0.293300 0.247500
+vn 0.946900 -0.227400 0.227400
+vn 0.923900 -0.270600 0.270600
+vn 0.965400 -0.205800 0.160000
+vn 0.965900 -0.183000 0.183000
+vn 0.896500 -0.335400 0.289600
+vn 0.896900 -0.312600 0.312600
+vn 0.989300 -0.137800 0.046400
+vn 0.978700 -0.183300 0.091800
+vn 0.976200 -0.205700 0.068600
+vn 0.986800 -0.160400 0.023300
+vn 0.993100 -0.114700 -0.022400
+vn 0.995800 -0.092000 0.000500
+vn 0.995300 -0.068500 -0.068500
+vn 0.997900 -0.045700 -0.045700
+vn 0.997300 -0.069200 0.023400
+vn 0.990900 -0.115100 0.069300
+vn 0.997800 -0.046300 0.046300
+vn 0.991400 -0.092300 0.092300
+vn 0.999500 -0.022900 -0.022900
+vn 0.980300 -0.160600 0.114900
+vn 0.980800 -0.137800 0.137800
+vn 0.989300 0.046400 -0.137800
+vn 0.995800 0.000500 -0.092000
+vn 0.993100 -0.022400 -0.114700
+vn 0.986800 0.023300 -0.160400
+vn 0.976200 0.068600 -0.205700
+vn 0.978700 0.091800 -0.183300
+vn 0.961400 0.113600 -0.250700
+vn 0.963900 0.136900 -0.228400
+vn 0.980300 0.114900 -0.160600
+vn 0.990900 0.069300 -0.115100
+vn 0.980800 0.137800 -0.137900
+vn 0.991400 0.092300 -0.092300
+vn 0.965400 0.160000 -0.205800
+vn 0.965900 0.183000 -0.183000
+vn 0.997300 0.023400 -0.069200
+vn 0.997800 0.046300 -0.046300
+vn 0.921900 0.224300 -0.315700
+vn 0.944900 0.181200 -0.272700
+vn 0.942400 0.157800 -0.294800
+vn 0.919500 0.200800 -0.337800
+vn 0.892700 0.242600 -0.379700
+vn 0.895000 0.266200 -0.357700
+vn 0.861900 0.283300 -0.420400
+vn 0.864200 0.307000 -0.398500
+vn 0.896500 0.289600 -0.335400
+vn 0.923400 0.247500 -0.293300
+vn 0.896900 0.312600 -0.312600
+vn 0.923900 0.270600 -0.270600
+vn 0.865600 0.330500 -0.376300
+vn 0.866000 0.353500 -0.353500
+vn 0.946400 0.204400 -0.250200
+vn 0.946900 0.227400 -0.227400
+vn 0.791700 0.383800 -0.475300
+vn 0.829600 0.346400 -0.437800
+vn 0.827400 0.322500 -0.459600
+vn 0.789600 0.359900 -0.497000
+vn 0.748400 0.395400 -0.532500
+vn 0.750400 0.419400 -0.510900
+vn 0.703800 0.429100 -0.566200
+vn 0.705600 0.453200 -0.544700
+vn 0.751500 0.443000 -0.488800
+vn 0.792900 0.407300 -0.453100
+vn 0.751900 0.466100 -0.466100
+vn 0.793300 0.430400 -0.430400
+vn 0.706700 0.476800 -0.522600
+vn 0.707100 0.500000 -0.500000
+vn 0.830900 0.369800 -0.415600
+vn 0.831400 0.392900 -0.392900
+vn 0.607500 0.514100 -0.605500
+vn 0.657900 0.484800 -0.576300
+vn 0.656100 0.460600 -0.597700
+vn 0.605900 0.489800 -0.626900
+vn 0.553100 0.516600 -0.653600
+vn 0.554500 0.540900 -0.632400
+vn 0.497600 0.540900 -0.678000
+vn 0.498900 0.565300 -0.656800
+vn 0.555400 0.564700 -0.610500
+vn 0.608400 0.537800 -0.583600
+vn 0.555700 0.587900 -0.587900
+vn 0.608800 0.561000 -0.561000
+vn 0.499700 0.589100 -0.634900
+vn 0.500000 0.612400 -0.612400
+vn 0.658900 0.508500 -0.554300
+vn 0.659200 0.531700 -0.531700
+vn 0.381900 0.606200 -0.697700
+vn 0.441200 0.587100 -0.678600
+vn 0.440100 0.562700 -0.699800
+vn 0.380900 0.581700 -0.718700
+vn 0.320000 0.597800 -0.734900
+vn 0.320900 0.622400 -0.713900
+vn 0.257600 0.611200 -0.748300
+vn 0.258200 0.635800 -0.727300
+vn 0.321400 0.646300 -0.692100
+vn 0.382500 0.630000 -0.675800
+vn 0.321500 0.669500 -0.669500
+vn 0.382700 0.653300 -0.653300
+vn 0.258700 0.659700 -0.705500
+vn 0.258800 0.683000 -0.683000
+vn 0.441900 0.611000 -0.656800
+vn 0.442200 0.634200 -0.634200
+vn 0.130200 0.653800 -0.745300
+vn 0.194500 0.646300 -0.737800
+vn 0.194000 0.621700 -0.758800
+vn 0.129900 0.629200 -0.766300
+vn 0.065200 0.633700 -0.770800
+vn 0.065400 0.658300 -0.749800
+vn 0.000000 0.635200 -0.772300
+vn 0.000000 0.659900 -0.751400
+vn 0.065500 0.682300 -0.728100
+vn 0.130400 0.677800 -0.723600
+vn 0.065500 0.705600 -0.705600
+vn 0.130500 0.701000 -0.701000
+vn 0.000000 0.683800 -0.729600
+vn 0.194800 0.670300 -0.716100
+vn 0.194900 0.693500 -0.693500
+vn -0.130200 0.653800 -0.745300
+vn -0.065400 0.658300 -0.749800
+vn -0.065200 0.633700 -0.770800
+vn -0.129900 0.629200 -0.766300
+vn -0.194000 0.621700 -0.758800
+vn -0.194500 0.646300 -0.737800
+vn -0.257600 0.611200 -0.748300
+vn -0.258200 0.635800 -0.727300
+vn -0.194800 0.670300 -0.716100
+vn -0.130400 0.677800 -0.723600
+vn -0.194900 0.693500 -0.693500
+vn -0.130500 0.701000 -0.701000
+vn -0.258700 0.659700 -0.705500
+vn -0.258800 0.683000 -0.683000
+vn -0.065500 0.682300 -0.728100
+vn -0.065500 0.705600 -0.705600
+vn -0.381900 0.606200 -0.697700
+vn -0.320900 0.622400 -0.713900
+vn -0.320000 0.597800 -0.734900
+vn -0.380900 0.581700 -0.718700
+vn -0.440100 0.562700 -0.699800
+vn -0.441200 0.587100 -0.678600
+vn -0.497600 0.540900 -0.678000
+vn -0.498900 0.565300 -0.656800
+vn -0.441900 0.611000 -0.656800
+vn -0.382500 0.630000 -0.675800
+vn -0.442200 0.634200 -0.634200
+vn -0.382700 0.653300 -0.653300
+vn -0.499700 0.589100 -0.634900
+vn -0.500000 0.612400 -0.612400
+vn -0.321400 0.646300 -0.692100
+vn -0.321500 0.669500 -0.669500
+vn -0.607500 0.514100 -0.605500
+vn -0.554500 0.540900 -0.632400
+vn -0.553100 0.516600 -0.653600
+vn -0.605900 0.489800 -0.626900
+vn -0.656100 0.460600 -0.597700
+vn -0.657900 0.484800 -0.576300
+vn -0.703800 0.429100 -0.566200
+vn -0.705600 0.453200 -0.544700
+vn -0.658900 0.508500 -0.554300
+vn -0.608400 0.537800 -0.583600
+vn -0.659200 0.531700 -0.531700
+vn -0.608800 0.561000 -0.561000
+vn -0.706700 0.476800 -0.522600
+vn -0.707100 0.500000 -0.500000
+vn -0.555400 0.564700 -0.610500
+vn -0.555700 0.587900 -0.587900
+vn -0.791700 0.383800 -0.475300
+vn -0.750300 0.419400 -0.510900
+vn -0.748400 0.395400 -0.532500
+vn -0.789600 0.359900 -0.497000
+vn -0.827400 0.322500 -0.459600
+vn -0.829600 0.346400 -0.437800
+vn -0.861900 0.283300 -0.420400
+vn -0.864200 0.307000 -0.398500
+vn -0.830900 0.369800 -0.415600
+vn -0.792900 0.407300 -0.453100
+vn -0.831400 0.392900 -0.392900
+vn -0.793300 0.430400 -0.430400
+vn -0.865600 0.330500 -0.376300
+vn -0.866000 0.353500 -0.353500
+vn -0.751500 0.443000 -0.488800
+vn -0.751900 0.466100 -0.466100
+vn -0.921900 0.224300 -0.315700
+vn -0.895000 0.266200 -0.357700
+vn -0.892700 0.242600 -0.379700
+vn -0.919500 0.200800 -0.337800
+vn -0.942400 0.157800 -0.294800
+vn -0.944900 0.181200 -0.272600
+vn -0.961400 0.113600 -0.250700
+vn -0.963900 0.136900 -0.228300
+vn -0.946400 0.204400 -0.250200
+vn -0.923400 0.247500 -0.293300
+vn -0.946900 0.227400 -0.227400
+vn -0.923900 0.270600 -0.270600
+vn -0.965400 0.160000 -0.205800
+vn -0.965900 0.183000 -0.183000
+vn -0.896500 0.289600 -0.335400
+vn -0.896900 0.312600 -0.312600
+vn -0.989300 0.046400 -0.137800
+vn -0.978700 0.091800 -0.183300
+vn -0.976200 0.068600 -0.205700
+vn -0.986800 0.023300 -0.160400
+vn -0.993100 -0.022400 -0.114700
+vn -0.995800 0.000500 -0.092000
+vn -0.995300 -0.068500 -0.068500
+vn -0.997900 -0.045700 -0.045700
+vn -0.997300 0.023400 -0.069200
+vn -0.990900 0.069300 -0.115100
+vn -0.997800 0.046300 -0.046300
+vn -0.991400 0.092300 -0.092300
+vn -0.999500 -0.022900 -0.022900
+vn -0.980300 0.114900 -0.160600
+vn -0.980800 0.137800 -0.137800
+vn -0.989300 -0.137800 0.046400
+vn -0.995800 -0.092000 0.000500
+vn -0.993100 -0.114700 -0.022400
+vn -0.986800 -0.160400 0.023300
+vn -0.976200 -0.205700 0.068600
+vn -0.978700 -0.183300 0.091800
+vn -0.980300 -0.160600 0.114900
+vn -0.990900 -0.115100 0.069300
+vn -0.980800 -0.137900 0.137900
+vn -0.991400 -0.092300 0.092300
+vn -0.997300 -0.069200 0.023400
+vn -0.997800 -0.046300 0.046300
+vn -0.921900 -0.224300 0.315700
+vn -0.944900 -0.181200 0.272600
+vn -0.946400 -0.204400 0.250200
+vn -0.923400 -0.247500 0.293300
+vn -0.963900 -0.136900 0.228400
+vn -0.965400 -0.160000 0.205800
+vn -0.896500 -0.289600 0.335400
+vn -0.895000 -0.266200 0.357700
+vn -0.865600 -0.330500 0.376200
+vn -0.864200 -0.307000 0.398500
+vn -0.892700 -0.242600 0.379700
+vn -0.919500 -0.200800 0.337800
+vn -0.889400 -0.218700 0.401300
+vn -0.916100 -0.177000 0.359600
+vn -0.861900 -0.283300 0.420400
+vn -0.858800 -0.259300 0.441900
+vn -0.942400 -0.157800 0.294800
+vn -0.961400 -0.113600 0.250700
+vn -0.938900 -0.134200 0.316800
+vn -0.957800 -0.090200 0.272800
+vn -0.791700 -0.383800 0.475300
+vn -0.829600 -0.346400 0.437800
+vn -0.830900 -0.369800 0.415600
+vn -0.792900 -0.407300 0.453100
+vn -0.751500 -0.443000 0.488800
+vn -0.750300 -0.419400 0.510900
+vn -0.706700 -0.476800 0.522600
+vn -0.705600 -0.453200 0.544700
+vn -0.748400 -0.395400 0.532500
+vn -0.789600 -0.359900 0.497000
+vn -0.745600 -0.370900 0.553500
+vn -0.786700 -0.335600 0.518100
+vn -0.703800 -0.429100 0.566200
+vn -0.701200 -0.404500 0.587100
+vn -0.827400 -0.322500 0.459600
+vn -0.824400 -0.298300 0.480900
+vn -0.607500 -0.514100 0.605500
+vn -0.657900 -0.484800 0.576300
+vn -0.658900 -0.508500 0.554300
+vn -0.608400 -0.537800 0.583600
+vn -0.555400 -0.564700 0.610500
+vn -0.554500 -0.540900 0.632400
+vn -0.499700 -0.589100 0.634900
+vn -0.498900 -0.565300 0.656800
+vn -0.553100 -0.516600 0.653600
+vn -0.605900 -0.489800 0.626900
+vn -0.551000 -0.491700 0.674200
+vn -0.603700 -0.465000 0.647600
+vn -0.497600 -0.540900 0.678000
+vn -0.495800 -0.515900 0.698500
+vn -0.656100 -0.460600 0.597700
+vn -0.653700 -0.435900 0.618500
+vn -0.381900 -0.606200 0.697700
+vn -0.441200 -0.587100 0.678600
+vn -0.441900 -0.611000 0.656800
+vn -0.382500 -0.630000 0.675800
+vn -0.321400 -0.646300 0.692100
+vn -0.320900 -0.622400 0.713900
+vn -0.258700 -0.659700 0.705500
+vn -0.258200 -0.635800 0.727300
+vn -0.320000 -0.597800 0.734900
+vn -0.380900 -0.581700 0.718700
+vn -0.318900 -0.572600 0.755200
+vn -0.379500 -0.556500 0.739100
+vn -0.257600 -0.611200 0.748300
+vn -0.256600 -0.586000 0.768600
+vn -0.440100 -0.562700 0.699800
+vn -0.438500 -0.537600 0.720200
+vn -0.130300 -0.653800 0.745300
+vn -0.194500 -0.646300 0.737800
+vn -0.194800 -0.670300 0.716100
+vn -0.130400 -0.677800 0.723600
+vn -0.065500 -0.682300 0.728100
+vn -0.065400 -0.658300 0.749800
+vn 0.000000 -0.683800 0.729600
+vn 0.000000 -0.659900 0.751400
+vn -0.065200 -0.633700 0.770800
+vn -0.129900 -0.629200 0.766300
+vn -0.065000 -0.608400 0.790900
+vn -0.129400 -0.603900 0.786500
+vn 0.000000 -0.635200 0.772300
+vn 0.000000 -0.609900 0.792500
+vn -0.194000 -0.621700 0.758800
+vn -0.193300 -0.596400 0.779000
+vn 0.130200 -0.653800 0.745300
+vn 0.065400 -0.658300 0.749800
+vn 0.065500 -0.682300 0.728100
+vn 0.130400 -0.677800 0.723600
+vn 0.194800 -0.670300 0.716100
+vn 0.194500 -0.646300 0.737800
+vn 0.258700 -0.659700 0.705500
+vn 0.258200 -0.635800 0.727300
+vn 0.194000 -0.621700 0.758800
+vn 0.129900 -0.629200 0.766300
+vn 0.193300 -0.596400 0.779000
+vn 0.129400 -0.603900 0.786500
+vn 0.257600 -0.611200 0.748300
+vn 0.256600 -0.586000 0.768600
+vn 0.065200 -0.633700 0.770800
+vn 0.065000 -0.608400 0.790900
+vn 0.381900 -0.606200 0.697700
+vn 0.320900 -0.622400 0.713900
+vn 0.321400 -0.646300 0.692100
+vn 0.382500 -0.630000 0.675800
+vn 0.441900 -0.611000 0.656800
+vn 0.441200 -0.587100 0.678600
+vn 0.499700 -0.589100 0.634900
+vn 0.498900 -0.565300 0.656800
+vn 0.440100 -0.562700 0.699800
+vn 0.380900 -0.581700 0.718700
+vn 0.438500 -0.537600 0.720200
+vn 0.379500 -0.556500 0.739100
+vn 0.497600 -0.540900 0.678000
+vn 0.495800 -0.515900 0.698500
+vn 0.320000 -0.597800 0.734900
+vn 0.318900 -0.572600 0.755200
+vn 0.607500 -0.514100 0.605500
+vn 0.554500 -0.540900 0.632400
+vn 0.555400 -0.564700 0.610500
+vn 0.608400 -0.537800 0.583600
+vn 0.658900 -0.508500 0.554300
+vn 0.657900 -0.484800 0.576300
+vn 0.706700 -0.476800 0.522600
+vn 0.705600 -0.453200 0.544700
+vn 0.656100 -0.460600 0.597700
+vn 0.605900 -0.489800 0.626900
+vn 0.653700 -0.435900 0.618500
+vn 0.603700 -0.465000 0.647600
+vn 0.703800 -0.429100 0.566200
+vn 0.701200 -0.404500 0.587100
+vn 0.553100 -0.516600 0.653600
+vn 0.551000 -0.491700 0.674200
+vn 0.791700 -0.383800 0.475300
+vn 0.750300 -0.419400 0.510900
+vn 0.751500 -0.443000 0.488800
+vn 0.792900 -0.407300 0.453100
+vn 0.830900 -0.369800 0.415600
+vn 0.829600 -0.346400 0.437800
+vn 0.865600 -0.330500 0.376200
+vn 0.864200 -0.307000 0.398500
+vn 0.827400 -0.322500 0.459600
+vn 0.789600 -0.359900 0.497000
+vn 0.824400 -0.298300 0.480900
+vn 0.786700 -0.335600 0.518100
+vn 0.861900 -0.283300 0.420400
+vn 0.858800 -0.259300 0.441900
+vn 0.748400 -0.395400 0.532500
+vn 0.745600 -0.370900 0.553500
+vn 0.921900 -0.224300 0.315700
+vn 0.895000 -0.266200 0.357700
+vn 0.896500 -0.289600 0.335400
+vn 0.923400 -0.247500 0.293300
+vn 0.946400 -0.204400 0.250200
+vn 0.944900 -0.181200 0.272600
+vn 0.965400 -0.160000 0.205800
+vn 0.963900 -0.136900 0.228400
+vn 0.942400 -0.157800 0.294800
+vn 0.919500 -0.200800 0.337800
+vn 0.938900 -0.134200 0.316800
+vn 0.916100 -0.177000 0.359600
+vn 0.961400 -0.113600 0.250700
+vn 0.957800 -0.090200 0.272800
+vn 0.892700 -0.242600 0.379700
+vn 0.889400 -0.218700 0.401300
+vn 0.989300 -0.046400 0.137800
+vn 0.978700 -0.091800 0.183300
+vn 0.980300 -0.114900 0.160600
+vn 0.990900 -0.069300 0.115100
+vn 0.997300 -0.023400 0.069200
+vn 0.995800 -0.000500 0.092000
+vn 0.999500 0.022900 0.022900
+vn 0.997900 0.045700 0.045700
+vn 0.993100 0.022400 0.114700
+vn 0.986800 -0.023300 0.160400
+vn 0.989500 0.045300 0.137200
+vn 0.983100 -0.000200 0.182800
+vn 0.995300 0.068500 0.068500
+vn 0.991600 0.091300 0.091300
+vn 0.976200 -0.068600 0.205700
+vn 0.972600 -0.045400 0.228000
+vn 0.989300 0.137800 -0.046400
+vn 0.995800 0.092000 -0.000500
+vn 0.997300 0.069200 -0.023400
+vn 0.990900 0.115100 -0.069300
+vn 0.980300 0.160600 -0.114900
+vn 0.978700 0.183300 -0.091800
+vn 0.965400 0.205800 -0.160000
+vn 0.963900 0.228400 -0.136900
+vn 0.976200 0.205700 -0.068600
+vn 0.986800 0.160400 -0.023300
+vn 0.972600 0.228000 -0.045400
+vn 0.983100 0.182800 -0.000200
+vn 0.961400 0.250700 -0.113600
+vn 0.957800 0.272800 -0.090200
+vn 0.993100 0.114700 0.022400
+vn 0.989500 0.137200 0.045300
+vn 0.921900 0.315700 -0.224300
+vn 0.944900 0.272600 -0.181200
+vn 0.946400 0.250200 -0.204400
+vn 0.923400 0.293300 -0.247500
+vn 0.896500 0.335400 -0.289600
+vn 0.895000 0.357700 -0.266200
+vn 0.865600 0.376300 -0.330500
+vn 0.864200 0.398500 -0.307000
+vn 0.892700 0.379700 -0.242600
+vn 0.919500 0.337800 -0.200800
+vn 0.889400 0.401300 -0.218700
+vn 0.916100 0.359600 -0.177000
+vn 0.861900 0.420400 -0.283300
+vn 0.858800 0.441900 -0.259300
+vn 0.942400 0.294800 -0.157800
+vn 0.938900 0.316800 -0.134200
+vn 0.791700 0.475300 -0.383800
+vn 0.829600 0.437800 -0.346400
+vn 0.830900 0.415600 -0.369800
+vn 0.792900 0.453100 -0.407300
+vn 0.751500 0.488800 -0.443000
+vn 0.750300 0.510900 -0.419400
+vn 0.706700 0.522600 -0.476800
+vn 0.705600 0.544700 -0.453200
+vn 0.748400 0.532500 -0.395400
+vn 0.789600 0.497000 -0.359900
+vn 0.745600 0.553500 -0.371000
+vn 0.786700 0.518100 -0.335600
+vn 0.703800 0.566200 -0.429100
+vn 0.701200 0.587100 -0.404500
+vn 0.827400 0.459600 -0.322500
+vn 0.824400 0.480900 -0.298300
+vn 0.607500 0.605500 -0.514100
+vn 0.657900 0.576300 -0.484800
+vn 0.658900 0.554300 -0.508500
+vn 0.608400 0.583600 -0.537800
+vn 0.555400 0.610500 -0.564700
+vn 0.554500 0.632400 -0.540900
+vn 0.499700 0.634900 -0.589100
+vn 0.498900 0.656800 -0.565300
+vn 0.553100 0.653600 -0.516600
+vn 0.605900 0.626900 -0.489800
+vn 0.551000 0.674200 -0.491700
+vn 0.603700 0.647600 -0.465000
+vn 0.497600 0.678000 -0.540900
+vn 0.495800 0.698500 -0.515900
+vn 0.656100 0.597700 -0.460600
+vn 0.653700 0.618500 -0.435900
+vn 0.381900 0.697700 -0.606200
+vn 0.441200 0.678600 -0.587100
+vn 0.441900 0.656800 -0.611000
+vn 0.382500 0.675800 -0.630000
+vn 0.321400 0.692100 -0.646300
+vn 0.320900 0.713900 -0.622400
+vn 0.258700 0.705500 -0.659700
+vn 0.258200 0.727300 -0.635800
+vn 0.320000 0.734900 -0.597800
+vn 0.380900 0.718700 -0.581700
+vn 0.318900 0.755200 -0.572600
+vn 0.379500 0.739100 -0.556500
+vn 0.257600 0.748300 -0.611200
+vn 0.256600 0.768600 -0.586000
+vn 0.440100 0.699800 -0.562700
+vn 0.438500 0.720200 -0.537600
+vn 0.130300 0.745300 -0.653800
+vn 0.194500 0.737800 -0.646300
+vn 0.194800 0.716100 -0.670300
+vn 0.130400 0.723600 -0.677800
+vn 0.065500 0.728100 -0.682300
+vn 0.065400 0.749800 -0.658300
+vn 0.000000 0.729600 -0.683800
+vn 0.000000 0.751400 -0.659900
+vn 0.065200 0.770800 -0.633700
+vn 0.129900 0.766300 -0.629200
+vn 0.065000 0.791000 -0.608400
+vn 0.129400 0.786500 -0.603900
+vn 0.000000 0.772300 -0.635200
+vn 0.000000 0.792500 -0.609900
+vn 0.194000 0.758800 -0.621700
+vn 0.193300 0.779000 -0.596400
+vn -0.130300 0.745300 -0.653800
+vn -0.065400 0.749800 -0.658300
+vn -0.065500 0.728100 -0.682300
+vn -0.130400 0.723600 -0.677800
+vn -0.194800 0.716100 -0.670300
+vn -0.194500 0.737800 -0.646300
+vn -0.258700 0.705500 -0.659700
+vn -0.258200 0.727300 -0.635800
+vn -0.194000 0.758800 -0.621700
+vn -0.129900 0.766300 -0.629200
+vn -0.193300 0.779000 -0.596400
+vn -0.129400 0.786500 -0.603900
+vn -0.257600 0.748300 -0.611200
+vn -0.256600 0.768600 -0.586000
+vn -0.065200 0.770800 -0.633700
+vn -0.065000 0.791000 -0.608400
+vn -0.381900 0.697600 -0.606200
+vn -0.320900 0.713900 -0.622400
+vn -0.321400 0.692100 -0.646300
+vn -0.382500 0.675800 -0.630000
+vn -0.441900 0.656800 -0.611000
+vn -0.441200 0.678600 -0.587100
+vn -0.499700 0.634900 -0.589100
+vn -0.498900 0.656800 -0.565300
+vn -0.440100 0.699800 -0.562700
+vn -0.380900 0.718700 -0.581700
+vn -0.438500 0.720200 -0.537600
+vn -0.379500 0.739100 -0.556500
+vn -0.497600 0.678000 -0.540900
+vn -0.495800 0.698500 -0.515900
+vn -0.320000 0.734900 -0.597800
+vn -0.318900 0.755200 -0.572600
+vn -0.607500 0.605500 -0.514100
+vn -0.554500 0.632400 -0.540900
+vn -0.555400 0.610500 -0.564700
+vn -0.608400 0.583600 -0.537800
+vn -0.658900 0.554300 -0.508500
+vn -0.657900 0.576300 -0.484800
+vn -0.706700 0.522600 -0.476800
+vn -0.705600 0.544700 -0.453200
+vn -0.656100 0.597700 -0.460600
+vn -0.605900 0.626900 -0.489800
+vn -0.653700 0.618500 -0.435900
+vn -0.603700 0.647600 -0.465000
+vn -0.703800 0.566200 -0.429100
+vn -0.701200 0.587100 -0.404500
+vn -0.553100 0.653600 -0.516600
+vn -0.551000 0.674200 -0.491700
+vn -0.791700 0.475300 -0.383800
+vn -0.750300 0.510900 -0.419400
+vn -0.751500 0.488800 -0.443000
+vn -0.792900 0.453100 -0.407300
+vn -0.830900 0.415600 -0.369800
+vn -0.829600 0.437800 -0.346400
+vn -0.865600 0.376200 -0.330500
+vn -0.864200 0.398500 -0.307000
+vn -0.827400 0.459600 -0.322500
+vn -0.789600 0.497000 -0.359900
+vn -0.824400 0.480900 -0.298300
+vn -0.786700 0.518100 -0.335600
+vn -0.861900 0.420400 -0.283300
+vn -0.858800 0.441900 -0.259300
+vn -0.748400 0.532500 -0.395400
+vn -0.745600 0.553500 -0.370900
+vn -0.921900 0.315700 -0.224300
+vn -0.895000 0.357700 -0.266200
+vn -0.896500 0.335400 -0.289600
+vn -0.923400 0.293300 -0.247500
+vn -0.946400 0.250200 -0.204400
+vn -0.944900 0.272600 -0.181200
+vn -0.965400 0.205800 -0.160000
+vn -0.963900 0.228400 -0.136900
+vn -0.942400 0.294800 -0.157800
+vn -0.919500 0.337800 -0.200800
+vn -0.938900 0.316800 -0.134200
+vn -0.916100 0.359600 -0.177000
+vn -0.961400 0.250700 -0.113600
+vn -0.957800 0.272800 -0.090200
+vn -0.892700 0.379700 -0.242600
+vn -0.889400 0.401300 -0.218700
+vn -0.989300 0.137800 -0.046400
+vn -0.978700 0.183300 -0.091800
+vn -0.980300 0.160600 -0.114900
+vn -0.990900 0.115100 -0.069300
+vn -0.997300 0.069200 -0.023400
+vn -0.995800 0.092000 -0.000500
+vn -0.999500 0.022900 0.022900
+vn -0.997900 0.045700 0.045700
+vn -0.993100 0.114700 0.022400
+vn -0.986800 0.160400 -0.023300
+vn -0.989500 0.137200 0.045300
+vn -0.983100 0.182800 -0.000200
+vn -0.995300 0.068500 0.068500
+vn -0.991600 0.091300 0.091300
+vn -0.976200 0.205700 -0.068600
+vn -0.972600 0.228000 -0.045400
+vn -0.989300 -0.046400 0.137800
+vn -0.995800 -0.000500 0.092000
+vn -0.997300 -0.023400 0.069200
+vn -0.990900 -0.069300 0.115100
+vn -0.980300 -0.114900 0.160600
+vn -0.978700 -0.091800 0.183300
+vn -0.976200 -0.068600 0.205700
+vn -0.986800 -0.023300 0.160400
+vn -0.972600 -0.045400 0.228000
+vn -0.983100 -0.000200 0.182800
+vn -0.993100 0.022400 0.114700
+vn -0.989500 0.045300 0.137200
+vn -0.906500 -0.129000 0.402000
+vn -0.929100 -0.086600 0.359600
+vn -0.934500 -0.110400 0.338400
+vn -0.911800 -0.153100 0.381000
+vn -0.947800 -0.043100 0.316000
+vn -0.953300 -0.066700 0.294600
+vn -0.885200 -0.194600 0.422500
+vn -0.880100 -0.170300 0.443300
+vn -0.854700 -0.235000 0.462900
+vn -0.849700 -0.210400 0.483400
+vn -0.874000 -0.145800 0.463500
+vn -0.900200 -0.104800 0.422500
+vn -0.867000 -0.121100 0.483400
+vn -0.893000 -0.080400 0.442700
+vn -0.843900 -0.185600 0.503400
+vn -0.837100 -0.160600 0.522900
+vn -0.922700 -0.062700 0.380400
+vn -0.941200 -0.019400 0.337200
+vn -0.915300 -0.038700 0.400900
+vn -0.933700 0.004200 0.358000
+vn -0.778400 -0.285900 0.558800
+vn -0.815700 -0.249000 0.522000
+vn -0.820500 -0.273800 0.501800
+vn -0.783000 -0.310900 0.538800
+vn -0.742100 -0.346100 0.574000
+vn -0.737800 -0.320900 0.593900
+vn -0.697800 -0.379500 0.607400
+vn -0.693800 -0.354100 0.627100
+vn -0.732700 -0.295300 0.613100
+vn -0.773100 -0.260600 0.578300
+vn -0.726800 -0.269400 0.631700
+vn -0.766900 -0.235000 0.597200
+vn -0.689000 -0.328300 0.646100
+vn -0.683500 -0.302200 0.664400
+vn -0.810100 -0.224000 0.541700
+vn -0.803600 -0.198700 0.560900
+vn -0.597300 -0.413900 0.686900
+vn -0.646800 -0.385200 0.658200
+vn -0.650600 -0.410800 0.638700
+vn -0.600800 -0.439700 0.667600
+vn -0.548400 -0.466200 0.694100
+vn -0.545200 -0.440300 0.713300
+vn -0.493500 -0.490400 0.718300
+vn -0.490600 -0.464300 0.737300
+vn -0.541500 -0.414000 0.731700
+vn -0.593200 -0.387700 0.705500
+vn -0.537100 -0.387100 0.749400
+vn -0.588400 -0.361100 0.723400
+vn -0.487200 -0.437800 0.755600
+vn -0.483300 -0.410800 0.773100
+vn -0.642400 -0.359200 0.677000
+vn -0.637200 -0.332800 0.695100
+vn -0.375500 -0.504500 0.777500
+vn -0.433800 -0.485800 0.758800
+vn -0.436400 -0.511900 0.739900
+vn -0.377700 -0.530800 0.758700
+vn -0.317400 -0.546800 0.774700
+vn -0.315500 -0.520500 0.793400
+vn -0.255400 -0.560100 0.788000
+vn -0.253900 -0.533600 0.806600
+vn -0.313300 -0.493500 0.811300
+vn -0.372900 -0.477700 0.795400
+vn -0.310800 -0.466000 0.828300
+vn -0.369900 -0.450300 0.812600
+vn -0.252200 -0.506600 0.824400
+vn -0.250200 -0.479100 0.841300
+vn -0.430800 -0.459100 0.776900
+vn -0.427400 -0.431900 0.794200
+vn -0.128100 -0.551400 0.824300
+vn -0.191300 -0.544000 0.817000
+vn -0.192400 -0.570500 0.798400
+vn -0.128800 -0.577900 0.805800
+vn -0.064700 -0.582400 0.810300
+vn -0.064300 -0.555800 0.828800
+vn 0.000000 -0.583900 0.811800
+vn 0.000000 -0.557300 0.830300
+vn -0.063800 -0.528600 0.846400
+vn -0.127200 -0.524200 0.842000
+vn -0.063400 -0.500900 0.863200
+vn -0.126200 -0.496500 0.858800
+vn 0.000000 -0.530100 0.847900
+vn 0.000000 -0.502400 0.864600
+vn -0.189900 -0.516900 0.834700
+vn -0.188400 -0.489200 0.851500
+vn 0.128100 -0.551400 0.824300
+vn 0.064300 -0.555800 0.828800
+vn 0.064700 -0.582400 0.810300
+vn 0.128800 -0.577900 0.805800
+vn 0.192400 -0.570500 0.798400
+vn 0.191300 -0.544000 0.817000
+vn 0.255400 -0.560100 0.788000
+vn 0.253900 -0.533600 0.806600
+vn 0.189900 -0.516900 0.834700
+vn 0.127200 -0.524200 0.842000
+vn 0.188400 -0.489200 0.851500
+vn 0.126200 -0.496500 0.858800
+vn 0.252200 -0.506700 0.824400
+vn 0.250200 -0.479100 0.841300
+vn 0.063800 -0.528600 0.846400
+vn 0.063400 -0.500900 0.863200
+vn 0.375500 -0.504500 0.777500
+vn 0.315500 -0.520500 0.793400
+vn 0.317400 -0.546800 0.774700
+vn 0.377700 -0.530700 0.758700
+vn 0.436400 -0.511900 0.739900
+vn 0.433800 -0.485800 0.758800
+vn 0.493500 -0.490400 0.718300
+vn 0.490600 -0.464300 0.737300
+vn 0.430800 -0.459100 0.776900
+vn 0.372900 -0.477700 0.795400
+vn 0.427400 -0.431900 0.794200
+vn 0.369900 -0.450300 0.812600
+vn 0.487200 -0.437800 0.755600
+vn 0.483300 -0.410800 0.773100
+vn 0.313300 -0.493500 0.811300
+vn 0.310800 -0.466000 0.828300
+vn 0.597300 -0.413900 0.686900
+vn 0.545200 -0.440300 0.713300
+vn 0.548400 -0.466200 0.694100
+vn 0.600800 -0.439700 0.667600
+vn 0.650600 -0.410800 0.638700
+vn 0.646800 -0.385200 0.658200
+vn 0.697800 -0.379500 0.607400
+vn 0.693800 -0.354100 0.627100
+vn 0.642400 -0.359200 0.677000
+vn 0.593200 -0.387700 0.705500
+vn 0.637200 -0.332800 0.695100
+vn 0.588400 -0.361100 0.723400
+vn 0.689000 -0.328300 0.646100
+vn 0.683500 -0.302200 0.664400
+vn 0.541500 -0.414000 0.731700
+vn 0.537100 -0.387100 0.749400
+vn 0.778400 -0.285900 0.558800
+vn 0.737800 -0.320900 0.593900
+vn 0.742100 -0.346100 0.574000
+vn 0.783000 -0.310900 0.538800
+vn 0.820500 -0.273800 0.501800
+vn 0.815700 -0.249000 0.522000
+vn 0.854700 -0.235000 0.462900
+vn 0.849700 -0.210400 0.483400
+vn 0.810100 -0.224000 0.541700
+vn 0.773100 -0.260600 0.578300
+vn 0.803600 -0.198700 0.560900
+vn 0.766900 -0.235000 0.597200
+vn 0.843900 -0.185600 0.503400
+vn 0.837100 -0.160600 0.522900
+vn 0.732700 -0.295300 0.613100
+vn 0.726800 -0.269400 0.631700
+vn 0.906500 -0.129000 0.402000
+vn 0.880100 -0.170300 0.443300
+vn 0.885200 -0.194600 0.422500
+vn 0.911800 -0.153100 0.381000
+vn 0.934500 -0.110400 0.338400
+vn 0.929100 -0.086600 0.359600
+vn 0.953300 -0.066700 0.294600
+vn 0.947800 -0.043100 0.316000
+vn 0.922700 -0.062700 0.380400
+vn 0.900200 -0.104800 0.422500
+vn 0.915300 -0.038700 0.400900
+vn 0.893000 -0.080400 0.442700
+vn 0.941200 -0.019400 0.337200
+vn 0.933700 0.004200 0.358000
+vn 0.874000 -0.145800 0.463500
+vn 0.867000 -0.121100 0.483400
+vn 0.972800 0.045900 0.227000
+vn 0.962300 0.001200 0.271700
+vn 0.968000 -0.022100 0.250000
+vn 0.978500 0.022900 0.205000
+vn 0.984800 0.068200 0.159700
+vn 0.979100 0.091000 0.182000
+vn 0.986900 0.114000 0.114000
+vn 0.981200 0.136500 0.136500
+vn 0.972300 0.113700 0.204000
+vn 0.966100 0.068900 0.248800
+vn 0.964500 0.136300 0.225900
+vn 0.958300 0.091900 0.270300
+vn 0.974400 0.158900 0.158900
+vn 0.966600 0.181100 0.181100
+vn 0.955700 0.024500 0.293200
+vn 0.948100 0.047900 0.314400
+vn 0.972800 0.227000 0.045900
+vn 0.979100 0.182000 0.091000
+vn 0.984800 0.159700 0.068200
+vn 0.978500 0.205000 0.022900
+vn 0.968000 0.250000 -0.022100
+vn 0.962300 0.271700 0.001200
+vn 0.953300 0.294600 -0.066700
+vn 0.947800 0.316000 -0.043100
+vn 0.955700 0.293200 0.024500
+vn 0.966100 0.248800 0.068900
+vn 0.948100 0.314400 0.047900
+vn 0.958300 0.270300 0.091900
+vn 0.941200 0.337200 -0.019400
+vn 0.933700 0.358000 0.004200
+vn 0.972300 0.204000 0.113700
+vn 0.964500 0.225900 0.136300
+vn 0.906500 0.402000 -0.129000
+vn 0.929100 0.359600 -0.086600
+vn 0.934500 0.338400 -0.110400
+vn 0.911800 0.381000 -0.153100
+vn 0.885200 0.422500 -0.194600
+vn 0.880100 0.443300 -0.170300
+vn 0.854700 0.462900 -0.235000
+vn 0.849700 0.483400 -0.210400
+vn 0.874000 0.463500 -0.145800
+vn 0.900200 0.422500 -0.104800
+vn 0.867000 0.483400 -0.121100
+vn 0.893000 0.442700 -0.080400
+vn 0.843900 0.503400 -0.185600
+vn 0.837100 0.522900 -0.160600
+vn 0.922700 0.380400 -0.062700
+vn 0.915300 0.400900 -0.038700
+vn 0.778400 0.558800 -0.285900
+vn 0.815700 0.522000 -0.249000
+vn 0.820500 0.501800 -0.273800
+vn 0.783000 0.538800 -0.310900
+vn 0.742100 0.574000 -0.346100
+vn 0.737800 0.593900 -0.320900
+vn 0.697800 0.607400 -0.379500
+vn 0.693800 0.627100 -0.354100
+vn 0.732700 0.613100 -0.295300
+vn 0.773100 0.578300 -0.260600
+vn 0.726800 0.631700 -0.269400
+vn 0.766900 0.597200 -0.235000
+vn 0.689000 0.646100 -0.328300
+vn 0.683500 0.664400 -0.302200
+vn 0.810100 0.541700 -0.224000
+vn 0.803600 0.560900 -0.198700
+vn 0.597300 0.686900 -0.413900
+vn 0.646800 0.658200 -0.385200
+vn 0.650600 0.638700 -0.410800
+vn 0.600800 0.667600 -0.439700
+vn 0.548400 0.694100 -0.466200
+vn 0.545200 0.713300 -0.440300
+vn 0.493500 0.718300 -0.490400
+vn 0.490600 0.737300 -0.464300
+vn 0.541500 0.731700 -0.414000
+vn 0.593200 0.705500 -0.387700
+vn 0.537100 0.749400 -0.387100
+vn 0.588400 0.723400 -0.361100
+vn 0.487200 0.755600 -0.437800
+vn 0.483300 0.773100 -0.410800
+vn 0.642400 0.677000 -0.359200
+vn 0.637200 0.695100 -0.332800
+vn 0.375500 0.777500 -0.504500
+vn 0.433800 0.758800 -0.485800
+vn 0.436400 0.739900 -0.511900
+vn 0.377700 0.758700 -0.530800
+vn 0.317400 0.774700 -0.546800
+vn 0.315500 0.793400 -0.520500
+vn 0.255400 0.788000 -0.560100
+vn 0.253900 0.806600 -0.533600
+vn 0.313300 0.811300 -0.493500
+vn 0.372900 0.795400 -0.477700
+vn 0.310800 0.828300 -0.466000
+vn 0.369900 0.812600 -0.450300
+vn 0.252200 0.824400 -0.506600
+vn 0.250200 0.841300 -0.479100
+vn 0.430800 0.776900 -0.459100
+vn 0.427400 0.794200 -0.431900
+vn 0.128100 0.824300 -0.551400
+vn 0.191300 0.817000 -0.544000
+vn 0.192400 0.798400 -0.570500
+vn 0.128800 0.805800 -0.577900
+vn 0.064700 0.810300 -0.582400
+vn 0.064300 0.828800 -0.555800
+vn 0.000000 0.811800 -0.583900
+vn 0.000000 0.830300 -0.557300
+vn 0.063800 0.846400 -0.528600
+vn 0.127200 0.842000 -0.524200
+vn 0.063400 0.863200 -0.500900
+vn 0.126200 0.858800 -0.496500
+vn 0.000000 0.847900 -0.530100
+vn 0.000000 0.864600 -0.502400
+vn 0.189900 0.834700 -0.516900
+vn 0.188400 0.851500 -0.489200
+vn -0.128100 0.824300 -0.551400
+vn -0.064300 0.828800 -0.555800
+vn -0.064700 0.810300 -0.582400
+vn -0.128800 0.805800 -0.577900
+vn -0.192400 0.798400 -0.570500
+vn -0.191300 0.817000 -0.544000
+vn -0.255400 0.788000 -0.560100
+vn -0.253900 0.806600 -0.533600
+vn -0.189900 0.834700 -0.516900
+vn -0.127200 0.842000 -0.524200
+vn -0.188400 0.851500 -0.489200
+vn -0.126200 0.858800 -0.496500
+vn -0.252200 0.824400 -0.506600
+vn -0.250200 0.841300 -0.479100
+vn -0.063800 0.846400 -0.528600
+vn -0.063400 0.863200 -0.500900
+vn -0.375500 0.777500 -0.504500
+vn -0.315500 0.793400 -0.520500
+vn -0.317400 0.774700 -0.546800
+vn -0.377700 0.758700 -0.530800
+vn -0.436400 0.739900 -0.511900
+vn -0.433800 0.758800 -0.485800
+vn -0.493500 0.718300 -0.490400
+vn -0.490600 0.737300 -0.464300
+vn -0.430800 0.776900 -0.459100
+vn -0.372900 0.795400 -0.477700
+vn -0.427400 0.794200 -0.431900
+vn -0.369900 0.812600 -0.450300
+vn -0.487200 0.755600 -0.437800
+vn -0.483300 0.773100 -0.410800
+vn -0.313300 0.811300 -0.493500
+vn -0.310800 0.828300 -0.466000
+vn -0.597300 0.686900 -0.413900
+vn -0.545200 0.713300 -0.440300
+vn -0.548400 0.694100 -0.466200
+vn -0.600800 0.667600 -0.439700
+vn -0.650600 0.638700 -0.410800
+vn -0.646800 0.658200 -0.385200
+vn -0.697800 0.607400 -0.379500
+vn -0.693800 0.627100 -0.354100
+vn -0.642400 0.677000 -0.359200
+vn -0.593200 0.705500 -0.387700
+vn -0.637200 0.695100 -0.332800
+vn -0.588400 0.723400 -0.361100
+vn -0.689000 0.646100 -0.328300
+vn -0.683500 0.664400 -0.302200
+vn -0.541500 0.731700 -0.414000
+vn -0.537100 0.749400 -0.387100
+vn -0.778400 0.558800 -0.285900
+vn -0.737800 0.593900 -0.320900
+vn -0.742100 0.574000 -0.346100
+vn -0.783000 0.538800 -0.310900
+vn -0.820500 0.501800 -0.273800
+vn -0.815700 0.522000 -0.249000
+vn -0.854700 0.462900 -0.235000
+vn -0.849700 0.483400 -0.210400
+vn -0.810100 0.541700 -0.224000
+vn -0.773100 0.578300 -0.260600
+vn -0.803600 0.560900 -0.198700
+vn -0.766900 0.597200 -0.235000
+vn -0.843900 0.503400 -0.185600
+vn -0.837100 0.522900 -0.160600
+vn -0.732700 0.613100 -0.295300
+vn -0.726800 0.631700 -0.269400
+vn -0.906500 0.402000 -0.129000
+vn -0.880100 0.443300 -0.170300
+vn -0.885200 0.422500 -0.194600
+vn -0.911800 0.381000 -0.153100
+vn -0.934500 0.338400 -0.110400
+vn -0.929100 0.359600 -0.086600
+vn -0.953300 0.294600 -0.066700
+vn -0.947800 0.316000 -0.043100
+vn -0.922700 0.380400 -0.062700
+vn -0.900200 0.422500 -0.104800
+vn -0.915300 0.400900 -0.038700
+vn -0.893000 0.442700 -0.080400
+vn -0.941200 0.337200 -0.019400
+vn -0.933700 0.358000 0.004200
+vn -0.874000 0.463500 -0.145800
+vn -0.867000 0.483400 -0.121100
+vn -0.972800 0.227000 0.045900
+vn -0.962300 0.271700 0.001200
+vn -0.968000 0.250000 -0.022100
+vn -0.978500 0.205000 0.022900
+vn -0.984800 0.159700 0.068200
+vn -0.979100 0.182000 0.091000
+vn -0.986900 0.114000 0.114000
+vn -0.981200 0.136500 0.136500
+vn -0.972300 0.204000 0.113700
+vn -0.966100 0.248800 0.068900
+vn -0.964500 0.225900 0.136300
+vn -0.958300 0.270300 0.091900
+vn -0.974400 0.158900 0.158900
+vn -0.966600 0.181100 0.181100
+vn -0.955700 0.293200 0.024500
+vn -0.948100 0.314400 0.047900
+vn -0.972800 0.045900 0.227000
+vn -0.979100 0.091000 0.182000
+vn -0.984800 0.068200 0.159700
+vn -0.978500 0.022900 0.205000
+vn -0.968000 -0.022100 0.250000
+vn -0.962300 0.001200 0.271700
+vn -0.955700 0.024500 0.293200
+vn -0.966100 0.068900 0.248800
+vn -0.948100 0.047900 0.314400
+vn -0.958300 0.091900 0.270300
+vn -0.972300 0.113700 0.204000
+vn -0.964500 0.136300 0.225900
+vn -0.875800 -0.031500 0.481600
+vn -0.897600 0.009500 0.440600
+vn -0.906900 -0.014600 0.421000
+vn -0.884900 -0.056000 0.462400
+vn -0.915700 0.051500 0.398500
+vn -0.925200 0.027900 0.378500
+vn -0.859100 -0.096300 0.502700
+vn -0.850300 -0.071400 0.521400
+vn -0.829500 -0.135400 0.541800
+vn -0.821000 -0.110100 0.560200
+vn -0.840600 -0.046300 0.539700
+vn -0.865800 -0.006900 0.500300
+vn -0.830000 -0.021300 0.557400
+vn -0.854900 0.017600 0.518400
+vn -0.811600 -0.084700 0.578000
+vn -0.801400 -0.059100 0.595200
+vn -0.887400 0.033500 0.459800
+vn -0.905200 0.075100 0.418200
+vn -0.876200 0.057600 0.478400
+vn -0.893800 0.098700 0.437400
+vn -0.752100 -0.183000 0.633100
+vn -0.788100 -0.147400 0.597500
+vn -0.796300 -0.173100 0.579500
+vn -0.759900 -0.209100 0.615500
+vn -0.720200 -0.243300 0.649700
+vn -0.712800 -0.216900 0.667000
+vn -0.677300 -0.275700 0.682100
+vn -0.670300 -0.248900 0.699000
+vn -0.704700 -0.190200 0.683500
+vn -0.743500 -0.156700 0.650100
+vn -0.695800 -0.163300 0.699400
+vn -0.734100 -0.130300 0.666400
+vn -0.662700 -0.221900 0.715200
+vn -0.654300 -0.194600 0.730700
+vn -0.779200 -0.121600 0.614900
+vn -0.769300 -0.095600 0.631600
+vn -0.577100 -0.306700 0.756900
+vn -0.625000 -0.279000 0.729100
+vn -0.631400 -0.306000 0.712500
+vn -0.583100 -0.334100 0.740500
+vn -0.532200 -0.359900 0.766300
+vn -0.526800 -0.332300 0.782300
+vn -0.478900 -0.383300 0.789700
+vn -0.474000 -0.355500 0.805600
+vn -0.520800 -0.304300 0.797600
+vn -0.570500 -0.279100 0.772400
+vn -0.514200 -0.275900 0.812000
+vn -0.563300 -0.251000 0.787100
+vn -0.468600 -0.327200 0.820600
+vn -0.462700 -0.298600 0.834700
+vn -0.617800 -0.251600 0.745000
+vn -0.610000 -0.223900 0.760000
+vn -0.362800 -0.394300 0.844400
+vn -0.419100 -0.376200 0.826300
+vn -0.423500 -0.404200 0.810700
+vn -0.366500 -0.422500 0.828900
+vn -0.308000 -0.438100 0.844500
+vn -0.304800 -0.409700 0.859800
+vn -0.247900 -0.451000 0.857400
+vn -0.245300 -0.422400 0.872500
+vn -0.301400 -0.380800 0.874100
+vn -0.358600 -0.365600 0.858900
+vn -0.297600 -0.351500 0.887600
+vn -0.354100 -0.336500 0.872600
+vn -0.242600 -0.393400 0.886700
+vn -0.239500 -0.364000 0.900100
+vn -0.414400 -0.347700 0.841000
+vn -0.409200 -0.318800 0.854900
+vn -0.123700 -0.439600 0.889600
+vn -0.184800 -0.432400 0.882500
+vn -0.186700 -0.461100 0.867500
+vn -0.125000 -0.468300 0.874700
+vn -0.062800 -0.472600 0.879000
+vn -0.062100 -0.443800 0.893900
+vn 0.000000 -0.474000 0.880500
+vn 0.000000 -0.445300 0.895400
+vn -0.061400 -0.414600 0.907900
+vn -0.122300 -0.410400 0.903700
+vn -0.060600 -0.384900 0.921000
+vn -0.120800 -0.380700 0.916800
+vn 0.000000 -0.416000 0.909300
+vn 0.000000 -0.386300 0.922400
+vn -0.182700 -0.403300 0.896600
+vn -0.180400 -0.373700 0.909800
+vn 0.123700 -0.439600 0.889600
+vn 0.062100 -0.443800 0.893900
+vn 0.062800 -0.472600 0.879000
+vn 0.125000 -0.468300 0.874700
+vn 0.186700 -0.461100 0.867500
+vn 0.184800 -0.432400 0.882500
+vn 0.247900 -0.451000 0.857400
+vn 0.245300 -0.422400 0.872500
+vn 0.182700 -0.403300 0.896600
+vn 0.122300 -0.410400 0.903700
+vn 0.180400 -0.373700 0.909800
+vn 0.120800 -0.380700 0.916800
+vn 0.242600 -0.393400 0.886700
+vn 0.239500 -0.364000 0.900100
+vn 0.061400 -0.414600 0.907900
+vn 0.060600 -0.384900 0.921000
+vn 0.362800 -0.394300 0.844400
+vn 0.304800 -0.409700 0.859800
+vn 0.308000 -0.438100 0.844500
+vn 0.366500 -0.422500 0.828900
+vn 0.423500 -0.404200 0.810700
+vn 0.419100 -0.376200 0.826300
+vn 0.478900 -0.383300 0.789700
+vn 0.474000 -0.355500 0.805600
+vn 0.414400 -0.347700 0.841000
+vn 0.358600 -0.365600 0.858900
+vn 0.409100 -0.318800 0.854900
+vn 0.354100 -0.336500 0.872600
+vn 0.468600 -0.327200 0.820600
+vn 0.462700 -0.298600 0.834700
+vn 0.301400 -0.380800 0.874100
+vn 0.297600 -0.351500 0.887600
+vn 0.577100 -0.306700 0.756900
+vn 0.526800 -0.332300 0.782300
+vn 0.532200 -0.359900 0.766300
+vn 0.583100 -0.334100 0.740500
+vn 0.631400 -0.306000 0.712500
+vn 0.625000 -0.279000 0.729100
+vn 0.677300 -0.275700 0.682100
+vn 0.670300 -0.248900 0.699000
+vn 0.617800 -0.251600 0.745000
+vn 0.570500 -0.279100 0.772400
+vn 0.610000 -0.223900 0.760000
+vn 0.563300 -0.251000 0.787100
+vn 0.662700 -0.221900 0.715200
+vn 0.654300 -0.194600 0.730700
+vn 0.520800 -0.304300 0.797600
+vn 0.514200 -0.275900 0.812000
+vn 0.752100 -0.183000 0.633100
+vn 0.712800 -0.216900 0.667000
+vn 0.720200 -0.243300 0.649700
+vn 0.759900 -0.209100 0.615500
+vn 0.796300 -0.173100 0.579500
+vn 0.788100 -0.147400 0.597500
+vn 0.829500 -0.135400 0.541800
+vn 0.821000 -0.110100 0.560200
+vn 0.779100 -0.121600 0.614900
+vn 0.743500 -0.156700 0.650100
+vn 0.769300 -0.095600 0.631600
+vn 0.734100 -0.130300 0.666400
+vn 0.811600 -0.084700 0.578000
+vn 0.801400 -0.059100 0.595200
+vn 0.704700 -0.190200 0.683500
+vn 0.695800 -0.163300 0.699400
+vn 0.875800 -0.031500 0.481600
+vn 0.850300 -0.071400 0.521400
+vn 0.859100 -0.096300 0.502700
+vn 0.884900 -0.056000 0.462400
+vn 0.906900 -0.014600 0.421000
+vn 0.897600 0.009500 0.440600
+vn 0.925200 0.027900 0.378500
+vn 0.915700 0.051500 0.398500
+vn 0.887400 0.033500 0.459800
+vn 0.865800 -0.006900 0.500200
+vn 0.876200 0.057600 0.478400
+vn 0.854900 0.017600 0.518400
+vn 0.905200 0.075100 0.418200
+vn 0.893800 0.098700 0.437400
+vn 0.840600 -0.046300 0.539700
+vn 0.830000 -0.021300 0.557400
+vn 0.939900 0.137500 0.312500
+vn 0.929800 0.094300 0.355700
+vn 0.939400 0.071100 0.335200
+vn 0.949600 0.114800 0.291600
+vn 0.955700 0.158800 0.247600
+vn 0.946000 0.181100 0.269000
+vn 0.957800 0.203200 0.203200
+vn 0.948000 0.225000 0.225000
+vn 0.935100 0.203200 0.290100
+vn 0.929200 0.160100 0.333100
+vn 0.923400 0.225100 0.310900
+vn 0.917400 0.182600 0.353400
+vn 0.937200 0.246700 0.246700
+vn 0.925400 0.268000 0.268000
+vn 0.919200 0.117500 0.375800
+vn 0.907600 0.140500 0.395600
+vn 0.939900 0.312500 0.137500
+vn 0.946000 0.269000 0.181100
+vn 0.955700 0.247600 0.158800
+vn 0.949600 0.291600 0.114800
+vn 0.939400 0.335200 0.071100
+vn 0.929800 0.355700 0.094300
+vn 0.925200 0.378500 0.027900
+vn 0.915700 0.398500 0.051500
+vn 0.919200 0.375800 0.117500
+vn 0.929200 0.333100 0.160100
+vn 0.907600 0.395600 0.140500
+vn 0.917400 0.353400 0.182600
+vn 0.905200 0.418200 0.075100
+vn 0.893800 0.437400 0.098700
+vn 0.935100 0.290100 0.203200
+vn 0.923400 0.310900 0.225100
+vn 0.875800 0.481600 -0.031500
+vn 0.897600 0.440600 0.009500
+vn 0.906900 0.421000 -0.014600
+vn 0.884900 0.462400 -0.056000
+vn 0.859100 0.502700 -0.096300
+vn 0.850300 0.521400 -0.071400
+vn 0.829500 0.541800 -0.135400
+vn 0.821000 0.560200 -0.110100
+vn 0.840600 0.539700 -0.046300
+vn 0.865800 0.500200 -0.006900
+vn 0.830000 0.557400 -0.021300
+vn 0.854900 0.518400 0.017600
+vn 0.811600 0.578000 -0.084700
+vn 0.801400 0.595200 -0.059100
+vn 0.887400 0.459800 0.033500
+vn 0.876200 0.478400 0.057600
+vn 0.752100 0.633100 -0.183000
+vn 0.788100 0.597500 -0.147400
+vn 0.796300 0.579500 -0.173100
+vn 0.759900 0.615500 -0.209100
+vn 0.720200 0.649700 -0.243300
+vn 0.712800 0.667000 -0.216900
+vn 0.677300 0.682100 -0.275700
+vn 0.670300 0.699000 -0.248900
+vn 0.704700 0.683500 -0.190200
+vn 0.743500 0.650100 -0.156700
+vn 0.695800 0.699400 -0.163300
+vn 0.734100 0.666400 -0.130300
+vn 0.662700 0.715200 -0.221900
+vn 0.654300 0.730700 -0.194600
+vn 0.779100 0.614900 -0.121600
+vn 0.769300 0.631600 -0.095600
+vn 0.577100 0.756900 -0.306700
+vn 0.625000 0.729100 -0.279000
+vn 0.631400 0.712500 -0.306000
+vn 0.583100 0.740500 -0.334100
+vn 0.532200 0.766300 -0.359900
+vn 0.526800 0.782300 -0.332300
+vn 0.478900 0.789700 -0.383300
+vn 0.474000 0.805600 -0.355500
+vn 0.520800 0.797600 -0.304300
+vn 0.570500 0.772400 -0.279100
+vn 0.514200 0.812000 -0.275900
+vn 0.563300 0.787100 -0.251000
+vn 0.468600 0.820600 -0.327200
+vn 0.462700 0.834700 -0.298600
+vn 0.617800 0.745000 -0.251600
+vn 0.610000 0.760000 -0.223900
+vn 0.362800 0.844400 -0.394200
+vn 0.419100 0.826300 -0.376200
+vn 0.423500 0.810700 -0.404200
+vn 0.366500 0.828900 -0.422500
+vn 0.308000 0.844500 -0.438100
+vn 0.304800 0.859800 -0.409700
+vn 0.247900 0.857400 -0.451000
+vn 0.245300 0.872500 -0.422400
+vn 0.301400 0.874100 -0.380800
+vn 0.358600 0.858900 -0.365600
+vn 0.297600 0.887600 -0.351500
+vn 0.354100 0.872600 -0.336500
+vn 0.242500 0.886700 -0.393400
+vn 0.239500 0.900100 -0.364000
+vn 0.414400 0.841000 -0.347700
+vn 0.409100 0.854900 -0.318800
+vn 0.123700 0.889600 -0.439600
+vn 0.184800 0.882500 -0.432400
+vn 0.186700 0.867500 -0.461100
+vn 0.125000 0.874700 -0.468300
+vn 0.062800 0.879000 -0.472600
+vn 0.062100 0.893900 -0.443800
+vn 0.000000 0.880500 -0.474000
+vn 0.000000 0.895400 -0.445300
+vn 0.061400 0.907900 -0.414600
+vn 0.122300 0.903700 -0.410400
+vn 0.060600 0.921000 -0.384900
+vn 0.120800 0.916800 -0.380700
+vn 0.000000 0.909300 -0.416000
+vn 0.000000 0.922400 -0.386300
+vn 0.182700 0.896600 -0.403300
+vn 0.180400 0.909800 -0.373700
+vn -0.123700 0.889600 -0.439600
+vn -0.062100 0.893900 -0.443800
+vn -0.062800 0.879000 -0.472600
+vn -0.125000 0.874700 -0.468300
+vn -0.186700 0.867500 -0.461100
+vn -0.184800 0.882500 -0.432400
+vn -0.247900 0.857400 -0.451000
+vn -0.245300 0.872500 -0.422400
+vn -0.182700 0.896600 -0.403300
+vn -0.122300 0.903700 -0.410400
+vn -0.180400 0.909800 -0.373700
+vn -0.120800 0.916800 -0.380700
+vn -0.242600 0.886700 -0.393400
+vn -0.239500 0.900100 -0.364000
+vn -0.061400 0.907900 -0.414600
+vn -0.060600 0.921000 -0.384900
+vn -0.362800 0.844400 -0.394300
+vn -0.304800 0.859800 -0.409700
+vn -0.308000 0.844500 -0.438100
+vn -0.366500 0.828900 -0.422500
+vn -0.423500 0.810700 -0.404200
+vn -0.419100 0.826300 -0.376200
+vn -0.478900 0.789700 -0.383300
+vn -0.474000 0.805600 -0.355500
+vn -0.414400 0.841000 -0.347700
+vn -0.358600 0.858900 -0.365600
+vn -0.409100 0.854900 -0.318800
+vn -0.354100 0.872600 -0.336500
+vn -0.468600 0.820600 -0.327200
+vn -0.462700 0.834700 -0.298600
+vn -0.301400 0.874100 -0.380800
+vn -0.297600 0.887600 -0.351500
+vn -0.577100 0.756900 -0.306700
+vn -0.526800 0.782300 -0.332300
+vn -0.532200 0.766300 -0.359900
+vn -0.583100 0.740500 -0.334100
+vn -0.631400 0.712500 -0.306000
+vn -0.625000 0.729100 -0.279000
+vn -0.677300 0.682100 -0.275700
+vn -0.670300 0.699000 -0.248900
+vn -0.617800 0.745000 -0.251600
+vn -0.570500 0.772400 -0.279100
+vn -0.610000 0.760000 -0.223900
+vn -0.563300 0.787100 -0.251000
+vn -0.662700 0.715200 -0.221900
+vn -0.654300 0.730700 -0.194600
+vn -0.520800 0.797600 -0.304300
+vn -0.514200 0.812000 -0.275900
+vn -0.752100 0.633100 -0.183000
+vn -0.712800 0.667000 -0.216900
+vn -0.720200 0.649700 -0.243300
+vn -0.759900 0.615500 -0.209100
+vn -0.796300 0.579500 -0.173100
+vn -0.788100 0.597500 -0.147400
+vn -0.829500 0.541800 -0.135400
+vn -0.821000 0.560200 -0.110100
+vn -0.779100 0.614900 -0.121600
+vn -0.743500 0.650100 -0.156700
+vn -0.769300 0.631600 -0.095600
+vn -0.734100 0.666400 -0.130300
+vn -0.811600 0.578000 -0.084700
+vn -0.801400 0.595200 -0.059100
+vn -0.704700 0.683500 -0.190200
+vn -0.695800 0.699400 -0.163300
+vn -0.875800 0.481600 -0.031500
+vn -0.850300 0.521400 -0.071400
+vn -0.859100 0.502700 -0.096300
+vn -0.884900 0.462400 -0.056000
+vn -0.906900 0.421000 -0.014600
+vn -0.897600 0.440600 0.009500
+vn -0.925200 0.378500 0.027900
+vn -0.915700 0.398500 0.051500
+vn -0.887400 0.459800 0.033500
+vn -0.865800 0.500300 -0.006900
+vn -0.876200 0.478400 0.057600
+vn -0.854900 0.518400 0.017600
+vn -0.905200 0.418200 0.075100
+vn -0.893800 0.437400 0.098700
+vn -0.840600 0.539700 -0.046300
+vn -0.830000 0.557400 -0.021300
+vn -0.939900 0.312500 0.137500
+vn -0.929800 0.355700 0.094300
+vn -0.939400 0.335200 0.071100
+vn -0.949600 0.291600 0.114800
+vn -0.955700 0.247600 0.158800
+vn -0.946000 0.269000 0.181100
+vn -0.957800 0.203200 0.203200
+vn -0.948000 0.225000 0.225000
+vn -0.935100 0.290100 0.203200
+vn -0.929200 0.333100 0.160100
+vn -0.923400 0.310900 0.225100
+vn -0.917400 0.353400 0.182600
+vn -0.937200 0.246700 0.246700
+vn -0.925400 0.268000 0.268000
+vn -0.919200 0.375800 0.117500
+vn -0.907600 0.395600 0.140500
+vn -0.939900 0.137500 0.312500
+vn -0.946000 0.181100 0.269000
+vn -0.955700 0.158800 0.247600
+vn -0.949600 0.114800 0.291600
+vn -0.939400 0.071100 0.335200
+vn -0.929800 0.094300 0.355700
+vn -0.919200 0.117500 0.375800
+vn -0.929200 0.160100 0.333100
+vn -0.907600 0.140500 0.395600
+vn -0.917400 0.182600 0.353400
+vn -0.935100 0.203200 0.290100
+vn -0.923400 0.225100 0.310900
+vn -0.830400 0.066700 0.553100
+vn -0.851000 0.105600 0.514300
+vn -0.864100 0.081600 0.496700
+vn -0.843100 0.042200 0.536100
+vn -0.868200 0.145500 0.474400
+vn -0.881400 0.122100 0.456200
+vn -0.818500 0.003800 0.574500
+vn -0.806100 0.028900 0.591000
+vn -0.790300 -0.033400 0.611800
+vn -0.778400 -0.007800 0.627700
+vn -0.793000 0.054000 0.606900
+vn -0.816800 0.091200 0.569700
+vn -0.778900 0.079100 0.622100
+vn -0.802300 0.115600 0.585600
+vn -0.765600 0.017900 0.643000
+vn -0.752000 0.043600 0.657600
+vn -0.837100 0.129400 0.531400
+vn -0.853900 0.168600 0.492200
+vn -0.822300 0.153100 0.548100
+vn -0.838800 0.191700 0.509500
+vn -0.713100 -0.076900 0.696800
+vn -0.747200 -0.043200 0.663100
+vn -0.758700 -0.069400 0.647700
+vn -0.724000 -0.103600 0.682000
+vn -0.686200 -0.136200 0.714500
+vn -0.675800 -0.109000 0.728900
+vn -0.645300 -0.167100 0.745400
+vn -0.635500 -0.139400 0.759400
+vn -0.664800 -0.081700 0.742500
+vn -0.701400 -0.050100 0.711000
+vn -0.653000 -0.054200 0.755400
+vn -0.689000 -0.023200 0.724400
+vn -0.625100 -0.111600 0.772500
+vn -0.614000 -0.083600 0.784800
+vn -0.735000 -0.016900 0.677800
+vn -0.722000 0.009400 0.691800
+vn -0.547100 -0.194300 0.814200
+vn -0.592500 -0.167900 0.787800
+vn -0.601600 -0.196000 0.774300
+vn -0.555500 -0.222800 0.801100
+vn -0.507100 -0.247300 0.825600
+vn -0.499400 -0.218400 0.838300
+vn -0.456300 -0.269700 0.848000
+vn -0.449400 -0.240400 0.860300
+vn -0.491300 -0.189300 0.850200
+vn -0.538200 -0.165500 0.826400
+vn -0.482600 -0.159900 0.861100
+vn -0.528600 -0.136500 0.837800
+vn -0.442000 -0.210900 0.871800
+vn -0.434200 -0.181200 0.882400
+vn -0.582800 -0.139600 0.800500
+vn -0.572500 -0.111100 0.812300
+vn -0.343900 -0.277200 0.897100
+vn -0.397400 -0.260100 0.880000
+vn -0.403500 -0.289600 0.867900
+vn -0.349200 -0.307000 0.885300
+vn -0.293400 -0.321800 0.900100
+vn -0.289000 -0.291800 0.911700
+vn -0.236200 -0.334100 0.912400
+vn -0.232600 -0.303900 0.923900
+vn -0.284300 -0.261500 0.922400
+vn -0.338300 -0.247100 0.908000
+vn -0.279200 -0.230800 0.932000
+vn -0.332300 -0.216700 0.917900
+vn -0.228800 -0.273400 0.934300
+vn -0.224700 -0.242500 0.943700
+vn -0.390900 -0.230300 0.891100
+vn -0.384000 -0.200100 0.901400
+vn -0.117300 -0.320100 0.940100
+vn -0.175200 -0.313400 0.933300
+vn -0.177900 -0.343700 0.922100
+vn -0.119100 -0.350600 0.928900
+vn -0.059800 -0.354700 0.933000
+vn -0.058900 -0.324200 0.944100
+vn 0.000000 -0.356100 0.934400
+vn 0.000000 -0.325600 0.945500
+vn -0.057900 -0.293300 0.954200
+vn -0.115400 -0.289300 0.950200
+vn -0.056900 -0.262100 0.963300
+vn -0.113300 -0.258200 0.959400
+vn 0.000000 -0.294700 0.955600
+vn 0.000000 -0.263400 0.964700
+vn -0.172300 -0.282700 0.943600
+vn -0.169300 -0.251700 0.952900
+vn 0.117300 -0.320100 0.940100
+vn 0.058900 -0.324200 0.944100
+vn 0.059800 -0.354700 0.933000
+vn 0.119100 -0.350600 0.928900
+vn 0.177900 -0.343700 0.922100
+vn 0.175200 -0.313400 0.933300
+vn 0.236200 -0.334100 0.912400
+vn 0.232600 -0.303900 0.923900
+vn 0.172300 -0.282700 0.943600
+vn 0.115400 -0.289300 0.950200
+vn 0.169300 -0.251700 0.952900
+vn 0.113300 -0.258200 0.959400
+vn 0.228800 -0.273400 0.934300
+vn 0.224700 -0.242500 0.943700
+vn 0.057900 -0.293300 0.954200
+vn 0.056900 -0.262100 0.963300
+vn 0.343900 -0.277200 0.897100
+vn 0.289000 -0.291800 0.911700
+vn 0.293400 -0.321800 0.900100
+vn 0.349200 -0.307000 0.885300
+vn 0.403500 -0.289600 0.867900
+vn 0.397400 -0.260100 0.880000
+vn 0.456300 -0.269700 0.848000
+vn 0.449400 -0.240400 0.860300
+vn 0.390900 -0.230300 0.891100
+vn 0.338300 -0.247100 0.908000
+vn 0.384000 -0.200100 0.901400
+vn 0.332300 -0.216700 0.917900
+vn 0.442000 -0.210900 0.871800
+vn 0.434200 -0.181200 0.882400
+vn 0.284300 -0.261500 0.922400
+vn 0.279200 -0.230800 0.932000
+vn 0.547100 -0.194300 0.814200
+vn 0.499400 -0.218400 0.838300
+vn 0.507100 -0.247300 0.825600
+vn 0.555500 -0.222800 0.801100
+vn 0.601600 -0.196000 0.774300
+vn 0.592500 -0.167900 0.787800
+vn 0.645300 -0.167100 0.745400
+vn 0.635500 -0.139400 0.759400
+vn 0.582800 -0.139600 0.800500
+vn 0.538200 -0.165500 0.826400
+vn 0.572500 -0.111100 0.812300
+vn 0.528600 -0.136500 0.837800
+vn 0.625100 -0.111600 0.772500
+vn 0.614000 -0.083600 0.784800
+vn 0.491300 -0.189300 0.850200
+vn 0.482600 -0.159900 0.861100
+vn 0.713100 -0.076900 0.696800
+vn 0.675800 -0.109000 0.728900
+vn 0.686200 -0.136200 0.714500
+vn 0.724000 -0.103600 0.682000
+vn 0.758700 -0.069400 0.647700
+vn 0.747200 -0.043200 0.663100
+vn 0.790300 -0.033400 0.611800
+vn 0.778400 -0.007800 0.627700
+vn 0.735000 -0.016900 0.677800
+vn 0.701400 -0.050100 0.711000
+vn 0.722000 0.009400 0.691800
+vn 0.689000 -0.023200 0.724400
+vn 0.765600 0.017900 0.643000
+vn 0.752000 0.043600 0.657600
+vn 0.664800 -0.081700 0.742500
+vn 0.653000 -0.054200 0.755400
+vn 0.830400 0.066700 0.553100
+vn 0.806100 0.028900 0.591000
+vn 0.818500 0.003800 0.574500
+vn 0.843100 0.042200 0.536100
+vn 0.864100 0.081600 0.496700
+vn 0.851000 0.105600 0.514300
+vn 0.881400 0.122100 0.456200
+vn 0.868200 0.145500 0.474400
+vn 0.837100 0.129400 0.531400
+vn 0.816800 0.091200 0.569700
+vn 0.822300 0.153100 0.548100
+vn 0.802300 0.115600 0.585600
+vn 0.853900 0.168600 0.492200
+vn 0.838800 0.191700 0.509500
+vn 0.793000 0.054000 0.606900
+vn 0.778900 0.079100 0.622100
+vn 0.891100 0.227000 0.392900
+vn 0.881500 0.186000 0.433900
+vn 0.895000 0.163300 0.415000
+vn 0.904800 0.204900 0.373400
+vn 0.910600 0.246900 0.331400
+vn 0.896800 0.268300 0.351600
+vn 0.912500 0.289200 0.289200
+vn 0.898800 0.309900 0.309900
+vn 0.882200 0.289500 0.371400
+vn 0.876500 0.248800 0.412000
+vn 0.866500 0.310300 0.390900
+vn 0.861000 0.270500 0.430700
+vn 0.884100 0.330400 0.330400
+vn 0.868400 0.350600 0.350600
+vn 0.867100 0.208600 0.452300
+vn 0.851700 0.230900 0.470300
+vn 0.891100 0.392900 0.227000
+vn 0.896800 0.351600 0.268300
+vn 0.910600 0.331400 0.246900
+vn 0.904800 0.373400 0.204900
+vn 0.895000 0.414900 0.163300
+vn 0.881500 0.433900 0.186000
+vn 0.881500 0.456200 0.122100
+vn 0.868200 0.474400 0.145500
+vn 0.867100 0.452300 0.208600
+vn 0.876500 0.412000 0.248800
+vn 0.851700 0.470300 0.230900
+vn 0.861000 0.430700 0.270500
+vn 0.853900 0.492200 0.168600
+vn 0.838800 0.509500 0.191700
+vn 0.882200 0.371400 0.289500
+vn 0.866500 0.390900 0.310300
+vn 0.830400 0.553100 0.066700
+vn 0.851000 0.514300 0.105600
+vn 0.864100 0.496700 0.081600
+vn 0.843100 0.536100 0.042200
+vn 0.818500 0.574500 0.003800
+vn 0.806100 0.591000 0.028900
+vn 0.790300 0.611800 -0.033400
+vn 0.778400 0.627700 -0.007800
+vn 0.793000 0.606900 0.054000
+vn 0.816800 0.569700 0.091200
+vn 0.778900 0.622100 0.079100
+vn 0.802300 0.585600 0.115600
+vn 0.765600 0.643000 0.017900
+vn 0.752000 0.657600 0.043600
+vn 0.837100 0.531400 0.129400
+vn 0.822300 0.548100 0.153100
+vn 0.713100 0.696900 -0.076900
+vn 0.747200 0.663100 -0.043200
+vn 0.758700 0.647700 -0.069400
+vn 0.724000 0.682000 -0.103600
+vn 0.686200 0.714500 -0.136200
+vn 0.675800 0.728900 -0.109000
+vn 0.645300 0.745400 -0.167100
+vn 0.635500 0.759400 -0.139400
+vn 0.664800 0.742500 -0.081700
+vn 0.701400 0.711000 -0.050100
+vn 0.653000 0.755400 -0.054200
+vn 0.689000 0.724400 -0.023200
+vn 0.625100 0.772500 -0.111600
+vn 0.614000 0.784800 -0.083600
+vn 0.735000 0.677800 -0.016900
+vn 0.722000 0.691800 0.009400
+vn 0.547100 0.814200 -0.194300
+vn 0.592500 0.787800 -0.167900
+vn 0.601600 0.774300 -0.196000
+vn 0.555500 0.801100 -0.222800
+vn 0.507100 0.825600 -0.247300
+vn 0.499400 0.838300 -0.218400
+vn 0.456300 0.848000 -0.269700
+vn 0.449400 0.860300 -0.240400
+vn 0.491300 0.850200 -0.189300
+vn 0.538200 0.826400 -0.165500
+vn 0.482600 0.861100 -0.159900
+vn 0.528600 0.837800 -0.136500
+vn 0.442000 0.871800 -0.210900
+vn 0.434200 0.882400 -0.181200
+vn 0.582800 0.800500 -0.139600
+vn 0.572500 0.812300 -0.111100
+vn 0.343900 0.897100 -0.277200
+vn 0.397400 0.880000 -0.260100
+vn 0.403500 0.867900 -0.289600
+vn 0.349200 0.885300 -0.307000
+vn 0.293400 0.900100 -0.321800
+vn 0.289000 0.911700 -0.291800
+vn 0.236200 0.912400 -0.334100
+vn 0.232600 0.923900 -0.303900
+vn 0.284300 0.922400 -0.261500
+vn 0.338300 0.908000 -0.247100
+vn 0.279200 0.932000 -0.230800
+vn 0.332300 0.917900 -0.216700
+vn 0.228800 0.934300 -0.273400
+vn 0.224700 0.943700 -0.242500
+vn 0.390900 0.891100 -0.230300
+vn 0.384000 0.901400 -0.200100
+vn 0.117300 0.940100 -0.320100
+vn 0.175200 0.933300 -0.313400
+vn 0.177900 0.922100 -0.343700
+vn 0.119100 0.928900 -0.350600
+vn 0.059800 0.933000 -0.354700
+vn 0.058900 0.944100 -0.324200
+vn 0.000000 0.934400 -0.356100
+vn 0.000000 0.945500 -0.325600
+vn 0.057900 0.954200 -0.293300
+vn 0.115400 0.950200 -0.289300
+vn 0.056900 0.963300 -0.262100
+vn 0.113300 0.959400 -0.258200
+vn 0.000000 0.955600 -0.294700
+vn 0.000000 0.964700 -0.263400
+vn 0.172300 0.943600 -0.282700
+vn 0.169300 0.952900 -0.251700
+vn -0.117300 0.940100 -0.320100
+vn -0.058900 0.944100 -0.324200
+vn -0.059800 0.933000 -0.354700
+vn -0.119100 0.928900 -0.350600
+vn -0.177900 0.922100 -0.343700
+vn -0.175200 0.933300 -0.313400
+vn -0.236200 0.912400 -0.334100
+vn -0.232600 0.923900 -0.303900
+vn -0.172300 0.943600 -0.282700
+vn -0.115400 0.950200 -0.289300
+vn -0.169300 0.952900 -0.251700
+vn -0.113300 0.959400 -0.258200
+vn -0.228800 0.934300 -0.273400
+vn -0.224700 0.943700 -0.242500
+vn -0.057900 0.954200 -0.293300
+vn -0.056900 0.963300 -0.262100
+vn -0.343900 0.897100 -0.277200
+vn -0.289000 0.911700 -0.291800
+vn -0.293400 0.900100 -0.321800
+vn -0.349200 0.885300 -0.307000
+vn -0.403500 0.867900 -0.289600
+vn -0.397400 0.880000 -0.260100
+vn -0.456300 0.848000 -0.269700
+vn -0.449400 0.860300 -0.240400
+vn -0.390900 0.891100 -0.230300
+vn -0.338300 0.908000 -0.247100
+vn -0.384000 0.901400 -0.200100
+vn -0.332300 0.917900 -0.216700
+vn -0.442000 0.871800 -0.210900
+vn -0.434200 0.882400 -0.181200
+vn -0.284300 0.922400 -0.261500
+vn -0.279200 0.932000 -0.230800
+vn -0.547100 0.814200 -0.194300
+vn -0.499400 0.838300 -0.218400
+vn -0.507100 0.825600 -0.247300
+vn -0.555500 0.801100 -0.222800
+vn -0.601600 0.774300 -0.196000
+vn -0.592500 0.787800 -0.167900
+vn -0.645300 0.745400 -0.167100
+vn -0.635500 0.759400 -0.139400
+vn -0.582800 0.800500 -0.139600
+vn -0.538200 0.826400 -0.165500
+vn -0.572500 0.812300 -0.111100
+vn -0.528600 0.837800 -0.136500
+vn -0.625100 0.772500 -0.111600
+vn -0.614000 0.784800 -0.083600
+vn -0.491300 0.850200 -0.189300
+vn -0.482600 0.861100 -0.159900
+vn -0.713100 0.696800 -0.076900
+vn -0.675800 0.728900 -0.109000
+vn -0.686200 0.714500 -0.136200
+vn -0.724000 0.682000 -0.103600
+vn -0.758700 0.647700 -0.069400
+vn -0.747200 0.663100 -0.043200
+vn -0.790300 0.611800 -0.033400
+vn -0.778400 0.627700 -0.007800
+vn -0.735000 0.677800 -0.016900
+vn -0.701400 0.711000 -0.050100
+vn -0.722000 0.691800 0.009400
+vn -0.689000 0.724400 -0.023200
+vn -0.765600 0.643000 0.017900
+vn -0.752000 0.657600 0.043600
+vn -0.664800 0.742500 -0.081700
+vn -0.653000 0.755400 -0.054200
+vn -0.830400 0.553100 0.066700
+vn -0.806100 0.591000 0.028900
+vn -0.818500 0.574500 0.003800
+vn -0.843100 0.536100 0.042200
+vn -0.864100 0.496700 0.081600
+vn -0.851000 0.514300 0.105600
+vn -0.881400 0.456200 0.122100
+vn -0.868200 0.474400 0.145500
+vn -0.837100 0.531400 0.129400
+vn -0.816800 0.569700 0.091200
+vn -0.822300 0.548100 0.153100
+vn -0.802300 0.585600 0.115600
+vn -0.853900 0.492200 0.168600
+vn -0.838800 0.509500 0.191700
+vn -0.793000 0.606900 0.054000
+vn -0.778900 0.622100 0.079100
+vn -0.891100 0.392900 0.227000
+vn -0.881500 0.433900 0.186000
+vn -0.895000 0.415000 0.163300
+vn -0.904800 0.373400 0.204900
+vn -0.910600 0.331400 0.246900
+vn -0.896800 0.351600 0.268300
+vn -0.912500 0.289200 0.289200
+vn -0.898800 0.309900 0.309900
+vn -0.882200 0.371400 0.289500
+vn -0.876500 0.412000 0.248800
+vn -0.866500 0.390900 0.310300
+vn -0.861000 0.430700 0.270500
+vn -0.884100 0.330400 0.330400
+vn -0.868400 0.350600 0.350600
+vn -0.867100 0.452300 0.208600
+vn -0.851700 0.470300 0.230900
+vn -0.891100 0.227000 0.392900
+vn -0.896800 0.268300 0.351600
+vn -0.910600 0.246900 0.331400
+vn -0.904800 0.204900 0.373400
+vn -0.895000 0.163300 0.415000
+vn -0.881500 0.186000 0.433900
+vn -0.867100 0.208600 0.452300
+vn -0.876500 0.248800 0.412000
+vn -0.851700 0.230900 0.470300
+vn -0.861000 0.270500 0.430700
+vn -0.882200 0.289500 0.371400
+vn -0.866500 0.310300 0.390900
+vn -0.770800 0.164000 0.615600
+vn -0.790000 0.200100 0.579500
+vn -0.806500 0.176700 0.564100
+vn -0.787000 0.139900 0.600900
+vn -0.805900 0.237100 0.542500
+vn -0.822800 0.214500 0.526300
+vn -0.764000 0.104100 0.636700
+vn -0.748300 0.129000 0.650700
+vn -0.737700 0.069200 0.671600
+vn -0.722500 0.094900 0.684800
+vn -0.731800 0.153700 0.663900
+vn -0.753800 0.188000 0.629600
+vn -0.714500 0.178400 0.676500
+vn -0.736000 0.211900 0.643000
+vn -0.706600 0.120400 0.697300
+vn -0.689900 0.145800 0.709100
+vn -0.772500 0.223300 0.594300
+vn -0.788100 0.259500 0.558200
+vn -0.754300 0.246300 0.608600
+vn -0.769500 0.281600 0.573200
+vn -0.661900 0.030700 0.749000
+vn -0.693600 0.062000 0.717600
+vn -0.708200 0.035700 0.705100
+vn -0.675800 0.003700 0.737100
+vn -0.640500 -0.026600 0.767500
+vn -0.627300 0.000900 0.778700
+vn -0.602300 -0.055500 0.796300
+vn -0.589900 -0.027300 0.807000
+vn -0.613500 0.028500 0.789100
+vn -0.647300 0.057600 0.760000
+vn -0.599000 0.056100 0.798800
+vn -0.632000 0.084500 0.770300
+vn -0.576900 0.000900 0.816800
+vn -0.563300 0.029100 0.825700
+vn -0.678300 0.088200 0.729400
+vn -0.662300 0.114400 0.740400
+vn -0.507900 -0.078200 0.857800
+vn -0.550000 -0.053700 0.833400
+vn -0.561500 -0.082500 0.823300
+vn -0.518500 -0.107400 0.848300
+vn -0.473300 -0.130300 0.871200
+vn -0.463600 -0.100600 0.880300
+vn -0.425900 -0.151200 0.892000
+vn -0.417100 -0.121100 0.900700
+vn -0.453400 -0.070800 0.888500
+vn -0.496700 -0.048900 0.866500
+vn -0.442600 -0.040900 0.895700
+vn -0.484900 -0.019400 0.874300
+vn -0.407900 -0.090800 0.908500
+vn -0.398300 -0.060400 0.915300
+vn -0.537900 -0.025000 0.842600
+vn -0.525100 0.003900 0.851000
+vn -0.319300 -0.155200 0.934800
+vn -0.368900 -0.139300 0.918900
+vn -0.376600 -0.169800 0.910600
+vn -0.326000 -0.186000 0.926900
+vn -0.273900 -0.199900 0.940700
+vn -0.268300 -0.168800 0.948400
+vn -0.220400 -0.211300 0.952200
+vn -0.215900 -0.180000 0.959700
+vn -0.262400 -0.137400 0.955100
+vn -0.312200 -0.124200 0.941800
+vn -0.256100 -0.105900 0.960800
+vn -0.304800 -0.093000 0.947800
+vn -0.211200 -0.148400 0.966100
+vn -0.206200 -0.116600 0.971500
+vn -0.360800 -0.108600 0.926300
+vn -0.352200 -0.077800 0.932600
+vn -0.108900 -0.195000 0.974700
+vn -0.162600 -0.188800 0.968400
+vn -0.166100 -0.220300 0.961200
+vn -0.111200 -0.226700 0.967600
+vn -0.055800 -0.230600 0.971400
+vn -0.054700 -0.198800 0.978500
+vn 0.000000 -0.231900 0.972700
+vn 0.000000 -0.200100 0.979800
+vn -0.053500 -0.166800 0.984500
+vn -0.106500 -0.163200 0.980800
+vn -0.052200 -0.134600 0.989500
+vn -0.104000 -0.131000 0.985900
+vn 0.000000 -0.168100 0.985700
+vn 0.000000 -0.135800 0.990700
+vn -0.159100 -0.157000 0.974700
+vn -0.155300 -0.125000 0.979900
+vn 0.108900 -0.195000 0.974700
+vn 0.054700 -0.198800 0.978500
+vn 0.055800 -0.230600 0.971400
+vn 0.111200 -0.226700 0.967600
+vn 0.166100 -0.220300 0.961200
+vn 0.162600 -0.188800 0.968400
+vn 0.220400 -0.211300 0.952200
+vn 0.215900 -0.180000 0.959700
+vn 0.159000 -0.157000 0.974700
+vn 0.106500 -0.163200 0.980800
+vn 0.155300 -0.125000 0.979900
+vn 0.104000 -0.131000 0.985900
+vn 0.211200 -0.148400 0.966100
+vn 0.206200 -0.116600 0.971500
+vn 0.053500 -0.166800 0.984500
+vn 0.052200 -0.134600 0.989500
+vn 0.319300 -0.155200 0.934800
+vn 0.268300 -0.168800 0.948400
+vn 0.273900 -0.199900 0.940700
+vn 0.326000 -0.186000 0.926900
+vn 0.376600 -0.169800 0.910600
+vn 0.368900 -0.139300 0.918900
+vn 0.425900 -0.151200 0.892000
+vn 0.417100 -0.121100 0.900700
+vn 0.360800 -0.108600 0.926300
+vn 0.312200 -0.124200 0.941800
+vn 0.352200 -0.077800 0.932600
+vn 0.304800 -0.093000 0.947800
+vn 0.407900 -0.090800 0.908500
+vn 0.398300 -0.060400 0.915300
+vn 0.262400 -0.137500 0.955100
+vn 0.256100 -0.105900 0.960800
+vn 0.507900 -0.078200 0.857800
+vn 0.463600 -0.100600 0.880300
+vn 0.473300 -0.130300 0.871200
+vn 0.518500 -0.107400 0.848300
+vn 0.561500 -0.082500 0.823300
+vn 0.550000 -0.053700 0.833400
+vn 0.602300 -0.055500 0.796300
+vn 0.589900 -0.027300 0.807000
+vn 0.537900 -0.025000 0.842600
+vn 0.496700 -0.048900 0.866500
+vn 0.525100 0.003900 0.851000
+vn 0.484900 -0.019400 0.874300
+vn 0.576900 0.000900 0.816800
+vn 0.563300 0.029100 0.825700
+vn 0.453400 -0.070800 0.888500
+vn 0.442600 -0.040900 0.895700
+vn 0.661900 0.030700 0.749000
+vn 0.627300 0.000900 0.778700
+vn 0.640500 -0.026600 0.767500
+vn 0.675800 0.003700 0.737100
+vn 0.708200 0.035700 0.705100
+vn 0.693600 0.062000 0.717600
+vn 0.737700 0.069200 0.671600
+vn 0.722500 0.094900 0.684800
+vn 0.678300 0.088200 0.729400
+vn 0.647300 0.057600 0.760000
+vn 0.662300 0.114400 0.740400
+vn 0.632000 0.084500 0.770300
+vn 0.706600 0.120400 0.697300
+vn 0.689900 0.145800 0.709100
+vn 0.613500 0.028500 0.789100
+vn 0.599000 0.056100 0.798800
+vn 0.770800 0.164000 0.615600
+vn 0.748300 0.129000 0.650700
+vn 0.764000 0.104100 0.636700
+vn 0.787000 0.139900 0.600900
+vn 0.806500 0.176700 0.564100
+vn 0.790000 0.200100 0.579500
+vn 0.822800 0.214500 0.526300
+vn 0.805900 0.237100 0.542500
+vn 0.772500 0.223300 0.594300
+vn 0.753800 0.188000 0.629600
+vn 0.754300 0.246300 0.608600
+vn 0.736000 0.211900 0.643000
+vn 0.788100 0.259500 0.558200
+vn 0.769500 0.281600 0.573200
+vn 0.731800 0.153700 0.663900
+vn 0.714500 0.178400 0.676500
+vn 0.827100 0.312800 0.466800
+vn 0.818300 0.274800 0.504800
+vn 0.835400 0.253000 0.487800
+vn 0.844500 0.291800 0.449000
+vn 0.850000 0.330900 0.409900
+vn 0.832500 0.351100 0.428500
+vn 0.851800 0.370400 0.370400
+vn 0.834300 0.389800 0.389800
+vn 0.814100 0.371000 0.446600
+vn 0.808900 0.333500 0.484100
+vn 0.794900 0.390500 0.464300
+vn 0.789800 0.353900 0.501000
+vn 0.815900 0.408800 0.408800
+vn 0.796600 0.427400 0.427400
+vn 0.800200 0.296300 0.521300
+vn 0.781300 0.317600 0.537200
+vn 0.827100 0.466800 0.312800
+vn 0.832500 0.428500 0.351100
+vn 0.850000 0.409900 0.330900
+vn 0.844500 0.449000 0.291800
+vn 0.835400 0.487800 0.253000
+vn 0.818300 0.504800 0.274800
+vn 0.822800 0.526300 0.214500
+vn 0.805900 0.542500 0.237100
+vn 0.800200 0.521300 0.296300
+vn 0.808900 0.484100 0.333500
+vn 0.781300 0.537200 0.317600
+vn 0.789800 0.501000 0.353900
+vn 0.788100 0.558200 0.259500
+vn 0.769500 0.573200 0.281600
+vn 0.814100 0.446600 0.371000
+vn 0.794900 0.464300 0.390500
+vn 0.770800 0.615600 0.164000
+vn 0.790000 0.579500 0.200100
+vn 0.806500 0.564100 0.176700
+vn 0.787000 0.600900 0.139900
+vn 0.764000 0.636700 0.104100
+vn 0.748300 0.650700 0.129000
+vn 0.737700 0.671600 0.069200
+vn 0.722500 0.684800 0.094900
+vn 0.731800 0.663900 0.153700
+vn 0.753800 0.629600 0.188000
+vn 0.714500 0.676500 0.178400
+vn 0.736000 0.643000 0.211900
+vn 0.706600 0.697300 0.120400
+vn 0.689900 0.709100 0.145800
+vn 0.772500 0.594300 0.223300
+vn 0.754300 0.608600 0.246300
+vn 0.661900 0.749000 0.030700
+vn 0.693600 0.717600 0.062000
+vn 0.708200 0.705100 0.035700
+vn 0.675800 0.737100 0.003700
+vn 0.640500 0.767500 -0.026600
+vn 0.627300 0.778700 0.000900
+vn 0.602300 0.796300 -0.055500
+vn 0.589900 0.807000 -0.027300
+vn 0.613500 0.789100 0.028500
+vn 0.647300 0.760000 0.057600
+vn 0.599000 0.798800 0.056100
+vn 0.632000 0.770300 0.084500
+vn 0.576900 0.816800 0.000900
+vn 0.563300 0.825700 0.029100
+vn 0.678300 0.729400 0.088200
+vn 0.662300 0.740400 0.114400
+vn 0.507900 0.857800 -0.078200
+vn 0.550000 0.833400 -0.053700
+vn 0.561500 0.823300 -0.082500
+vn 0.518500 0.848300 -0.107400
+vn 0.473300 0.871200 -0.130300
+vn 0.463600 0.880300 -0.100600
+vn 0.425900 0.892000 -0.151200
+vn 0.417100 0.900700 -0.121100
+vn 0.453400 0.888500 -0.070800
+vn 0.496700 0.866500 -0.048900
+vn 0.442600 0.895700 -0.040900
+vn 0.484900 0.874300 -0.019400
+vn 0.407900 0.908500 -0.090800
+vn 0.398300 0.915300 -0.060400
+vn 0.537900 0.842600 -0.025000
+vn 0.525100 0.851000 0.003900
+vn 0.319300 0.934800 -0.155200
+vn 0.368900 0.918900 -0.139300
+vn 0.376600 0.910600 -0.169800
+vn 0.326000 0.926900 -0.186000
+vn 0.273900 0.940700 -0.199900
+vn 0.268300 0.948400 -0.168800
+vn 0.220400 0.952200 -0.211300
+vn 0.215900 0.959700 -0.180000
+vn 0.262400 0.955100 -0.137500
+vn 0.312200 0.941800 -0.124200
+vn 0.256100 0.960800 -0.105900
+vn 0.304800 0.947800 -0.093000
+vn 0.211200 0.966100 -0.148400
+vn 0.206200 0.971500 -0.116600
+vn 0.360800 0.926300 -0.108600
+vn 0.352200 0.932600 -0.077800
+vn 0.108900 0.974700 -0.195000
+vn 0.162600 0.968400 -0.188800
+vn 0.166100 0.961200 -0.220300
+vn 0.111200 0.967600 -0.226700
+vn 0.055800 0.971400 -0.230600
+vn 0.054700 0.978500 -0.198800
+vn 0.000000 0.972700 -0.231900
+vn 0.000000 0.979800 -0.200100
+vn 0.053500 0.984500 -0.166800
+vn 0.106500 0.980800 -0.163200
+vn 0.052200 0.989500 -0.134600
+vn 0.104000 0.985900 -0.131000
+vn 0.000000 0.985700 -0.168100
+vn 0.000000 0.990700 -0.135800
+vn 0.159000 0.974700 -0.157000
+vn 0.155300 0.979900 -0.125000
+vn -0.108900 0.974700 -0.195000
+vn -0.054700 0.978500 -0.198800
+vn -0.055800 0.971400 -0.230600
+vn -0.111200 0.967600 -0.226700
+vn -0.166100 0.961200 -0.220300
+vn -0.162600 0.968400 -0.188800
+vn -0.220400 0.952200 -0.211300
+vn -0.215900 0.959700 -0.180000
+vn -0.159000 0.974700 -0.157000
+vn -0.106500 0.980800 -0.163200
+vn -0.155300 0.979900 -0.125000
+vn -0.104000 0.985900 -0.131000
+vn -0.211200 0.966100 -0.148400
+vn -0.206200 0.971500 -0.116600
+vn -0.053500 0.984500 -0.166800
+vn -0.052200 0.989500 -0.134600
+vn -0.319300 0.934800 -0.155200
+vn -0.268300 0.948400 -0.168800
+vn -0.273900 0.940700 -0.199900
+vn -0.326000 0.926900 -0.186000
+vn -0.376600 0.910600 -0.169800
+vn -0.368900 0.918900 -0.139300
+vn -0.425900 0.892000 -0.151200
+vn -0.417100 0.900700 -0.121100
+vn -0.360800 0.926300 -0.108600
+vn -0.312200 0.941800 -0.124200
+vn -0.352200 0.932600 -0.077800
+vn -0.304800 0.947800 -0.093000
+vn -0.407900 0.908500 -0.090800
+vn -0.398300 0.915300 -0.060400
+vn -0.262400 0.955100 -0.137400
+vn -0.256100 0.960800 -0.105900
+vn -0.507900 0.857800 -0.078200
+vn -0.463600 0.880300 -0.100600
+vn -0.473300 0.871200 -0.130300
+vn -0.518500 0.848300 -0.107400
+vn -0.561500 0.823300 -0.082500
+vn -0.550000 0.833400 -0.053700
+vn -0.602300 0.796300 -0.055500
+vn -0.589900 0.807000 -0.027300
+vn -0.537900 0.842600 -0.025000
+vn -0.496700 0.866500 -0.048900
+vn -0.525100 0.851000 0.003900
+vn -0.484900 0.874300 -0.019400
+vn -0.576900 0.816800 0.000900
+vn -0.563300 0.825700 0.029100
+vn -0.453400 0.888500 -0.070800
+vn -0.442600 0.895700 -0.040900
+vn -0.661900 0.749000 0.030700
+vn -0.627300 0.778700 0.000900
+vn -0.640500 0.767500 -0.026600
+vn -0.675800 0.737100 0.003700
+vn -0.708200 0.705100 0.035700
+vn -0.693600 0.717600 0.062000
+vn -0.737700 0.671600 0.069200
+vn -0.722500 0.684800 0.094900
+vn -0.678300 0.729400 0.088200
+vn -0.647300 0.760000 0.057600
+vn -0.662300 0.740400 0.114400
+vn -0.632000 0.770300 0.084500
+vn -0.706600 0.697300 0.120400
+vn -0.689900 0.709100 0.145800
+vn -0.613500 0.789100 0.028500
+vn -0.599000 0.798800 0.056100
+vn -0.770800 0.615600 0.164000
+vn -0.748300 0.650700 0.129000
+vn -0.764000 0.636700 0.104100
+vn -0.787000 0.600900 0.139900
+vn -0.806500 0.564100 0.176700
+vn -0.790000 0.579500 0.200100
+vn -0.822800 0.526300 0.214500
+vn -0.805900 0.542500 0.237100
+vn -0.772500 0.594300 0.223300
+vn -0.753800 0.629600 0.188000
+vn -0.754300 0.608600 0.246300
+vn -0.736000 0.643000 0.211900
+vn -0.788100 0.558200 0.259500
+vn -0.769500 0.573200 0.281600
+vn -0.731800 0.663900 0.153700
+vn -0.714500 0.676500 0.178400
+vn -0.827100 0.466800 0.312800
+vn -0.818300 0.504800 0.274800
+vn -0.835400 0.487800 0.253000
+vn -0.844500 0.449000 0.291800
+vn -0.850000 0.409900 0.330900
+vn -0.832500 0.428500 0.351100
+vn -0.851800 0.370400 0.370400
+vn -0.834300 0.389800 0.389800
+vn -0.814100 0.446600 0.371000
+vn -0.808900 0.484100 0.333500
+vn -0.794900 0.464300 0.390500
+vn -0.789800 0.501000 0.353900
+vn -0.815900 0.408800 0.408800
+vn -0.796600 0.427400 0.427400
+vn -0.800200 0.521300 0.296300
+vn -0.781300 0.537200 0.317600
+vn -0.827100 0.312800 0.466800
+vn -0.832500 0.351100 0.428500
+vn -0.850000 0.330900 0.409900
+vn -0.844500 0.291800 0.449000
+vn -0.835400 0.253000 0.487800
+vn -0.818300 0.274800 0.504800
+vn -0.800200 0.296300 0.521300
+vn -0.808900 0.333500 0.484100
+vn -0.781300 0.317600 0.537200
+vn -0.789800 0.353900 0.501000
+vn -0.814100 0.371000 0.446600
+vn -0.794900 0.390500 0.464300
+vn -0.698000 0.258800 0.667700
+vn -0.715300 0.291500 0.635100
+vn -0.735200 0.269000 0.622200
+vn -0.717300 0.235500 0.655700
+vn -0.729700 0.325000 0.601500
+vn -0.750000 0.303500 0.587700
+vn -0.696400 0.202800 0.688300
+vn -0.677600 0.227100 0.699500
+vn -0.672400 0.171100 0.720100
+vn -0.654300 0.196200 0.730400
+vn -0.658000 0.251100 0.709900
+vn -0.677800 0.281900 0.679000
+vn -0.637700 0.274900 0.719500
+vn -0.656900 0.304800 0.689600
+vn -0.635400 0.221100 0.739900
+vn -0.615800 0.245800 0.748600
+vn -0.694700 0.313600 0.647300
+vn -0.708700 0.346200 0.614700
+vn -0.673300 0.335500 0.658900
+vn -0.686800 0.367000 0.627300
+vn -0.599400 0.138100 0.788500
+vn -0.628100 0.166400 0.760100
+vn -0.645500 0.140500 0.750700
+vn -0.616000 0.111400 0.779800
+vn -0.583800 0.083700 0.807500
+vn -0.568000 0.111100 0.815400
+vn -0.549000 0.057400 0.833800
+vn -0.534200 0.085500 0.841000
+vn -0.551700 0.138500 0.822500
+vn -0.582000 0.164600 0.796300
+vn -0.534700 0.165700 0.828600
+vn -0.564100 0.191100 0.803200
+vn -0.518800 0.113600 0.847300
+vn -0.502800 0.141700 0.852700
+vn -0.609900 0.192200 0.768800
+vn -0.591100 0.217800 0.776600
+vn -0.459900 0.039500 0.887100
+vn -0.498000 0.061600 0.865000
+vn -0.511900 0.032700 0.858400
+vn -0.472700 0.010000 0.881200
+vn -0.431400 -0.010800 0.902000
+vn -0.419800 0.019100 0.907400
+vn -0.388200 -0.029800 0.921100
+vn -0.377700 0.000600 0.925900
+vn -0.407700 0.049200 0.911800
+vn -0.446600 0.068900 0.892100
+vn -0.395100 0.079200 0.915200
+vn -0.432800 0.098300 0.896100
+vn -0.366800 0.031200 0.929700
+vn -0.355500 0.061800 0.932600
+vn -0.483700 0.090400 0.870600
+vn -0.468700 0.119100 0.875200
+vn -0.289100 -0.030200 0.956800
+vn -0.334000 -0.015800 0.942400
+vn -0.343300 -0.046800 0.938000
+vn -0.297100 -0.061600 0.952800
+vn -0.249700 -0.074300 0.965500
+vn -0.242900 -0.042500 0.969100
+vn -0.200900 -0.084700 0.975900
+vn -0.195500 -0.052700 0.979300
+vn -0.235900 -0.010700 0.971700
+vn -0.280700 0.001200 0.959700
+vn -0.228600 0.021100 0.973300
+vn -0.272100 0.032700 0.961700
+vn -0.189900 -0.020600 0.981600
+vn -0.184000 0.011500 0.982800
+vn -0.324400 0.015100 0.945800
+vn -0.314400 0.046200 0.948100
+vn -0.098600 -0.066300 0.992900
+vn -0.147300 -0.060600 0.987200
+vn -0.151300 -0.092900 0.984100
+vn -0.101300 -0.098700 0.989900
+vn -0.050900 -0.102200 0.993400
+vn -0.049500 -0.069800 0.996300
+vn 0.000000 -0.103400 0.994600
+vn 0.000000 -0.070900 0.997500
+vn -0.048100 -0.037200 0.998100
+vn -0.095700 -0.033800 0.994800
+vn -0.046600 -0.004500 0.998900
+vn -0.092800 -0.001300 0.995700
+vn 0.000000 -0.038300 0.999200
+vn 0.000000 -0.005600 1.000000
+vn -0.143000 -0.028300 0.989300
+vn -0.138600 0.004000 0.990300
+vn 0.098600 -0.066300 0.992900
+vn 0.049500 -0.069800 0.996300
+vn 0.050900 -0.102200 0.993400
+vn 0.101300 -0.098700 0.989900
+vn 0.151300 -0.092900 0.984100
+vn 0.147300 -0.060600 0.987200
+vn 0.200900 -0.084700 0.975900
+vn 0.195500 -0.052700 0.979300
+vn 0.143000 -0.028300 0.989300
+vn 0.095700 -0.033800 0.994800
+vn 0.138600 0.004000 0.990300
+vn 0.092800 -0.001300 0.995700
+vn 0.189900 -0.020600 0.981600
+vn 0.184000 0.011500 0.982800
+vn 0.048100 -0.037200 0.998100
+vn 0.046600 -0.004500 0.998900
+vn 0.289100 -0.030200 0.956800
+vn 0.242900 -0.042500 0.969100
+vn 0.249700 -0.074300 0.965500
+vn 0.297100 -0.061600 0.952800
+vn 0.343300 -0.046800 0.938000
+vn 0.334000 -0.015800 0.942400
+vn 0.388200 -0.029800 0.921100
+vn 0.377700 0.000600 0.925900
+vn 0.324400 0.015100 0.945800
+vn 0.280700 0.001200 0.959700
+vn 0.314400 0.046200 0.948100
+vn 0.272100 0.032700 0.961700
+vn 0.366800 0.031200 0.929700
+vn 0.355500 0.061800 0.932600
+vn 0.235900 -0.010700 0.971700
+vn 0.228600 0.021100 0.973300
+vn 0.459900 0.039500 0.887100
+vn 0.419800 0.019100 0.907400
+vn 0.431400 -0.010800 0.902000
+vn 0.472700 0.010000 0.881200
+vn 0.511900 0.032700 0.858400
+vn 0.498000 0.061600 0.865000
+vn 0.549000 0.057400 0.833800
+vn 0.534200 0.085500 0.841000
+vn 0.483700 0.090400 0.870600
+vn 0.446600 0.068900 0.892100
+vn 0.468700 0.119100 0.875200
+vn 0.432800 0.098300 0.896100
+vn 0.518800 0.113600 0.847300
+vn 0.502800 0.141700 0.852700
+vn 0.407700 0.049200 0.911800
+vn 0.395100 0.079200 0.915200
+vn 0.599400 0.138100 0.788500
+vn 0.568000 0.111100 0.815400
+vn 0.583800 0.083700 0.807500
+vn 0.616000 0.111400 0.779800
+vn 0.645500 0.140500 0.750700
+vn 0.628100 0.166400 0.760100
+vn 0.672400 0.171100 0.720100
+vn 0.654300 0.196200 0.730400
+vn 0.609900 0.192200 0.768800
+vn 0.582000 0.164600 0.796300
+vn 0.591100 0.217800 0.776600
+vn 0.564100 0.191100 0.803200
+vn 0.635400 0.221100 0.739900
+vn 0.615800 0.245800 0.748600
+vn 0.551700 0.138500 0.822500
+vn 0.534700 0.165700 0.828600
+vn 0.698000 0.258800 0.667700
+vn 0.677600 0.227100 0.699500
+vn 0.696400 0.202800 0.688300
+vn 0.717300 0.235500 0.655700
+vn 0.735200 0.269000 0.622200
+vn 0.715300 0.291500 0.635100
+vn 0.750000 0.303500 0.587700
+vn 0.729700 0.325000 0.601500
+vn 0.694700 0.313600 0.647300
+vn 0.677800 0.281900 0.679000
+vn 0.673300 0.335500 0.658900
+vn 0.656900 0.304800 0.689600
+vn 0.708700 0.346200 0.614700
+vn 0.686800 0.367000 0.627300
+vn 0.658000 0.251100 0.709900
+vn 0.637700 0.274900 0.719500
+vn 0.749000 0.393500 0.533000
+vn 0.741000 0.359100 0.567400
+vn 0.761500 0.338500 0.552600
+vn 0.769800 0.373900 0.517300
+vn 0.774800 0.409600 0.481600
+vn 0.753800 0.428300 0.498300
+vn 0.776400 0.445600 0.445600
+vn 0.755500 0.463300 0.463300
+vn 0.732100 0.446500 0.514500
+vn 0.727400 0.412700 0.548200
+vn 0.709500 0.464200 0.530100
+vn 0.704900 0.431600 0.562800
+vn 0.733700 0.480500 0.480500
+vn 0.711000 0.497200 0.497200
+vn 0.719600 0.379300 0.581600
+vn 0.697400 0.399200 0.595200
+vn 0.749000 0.533000 0.393500
+vn 0.753800 0.498300 0.428300
+vn 0.774800 0.481600 0.409600
+vn 0.769800 0.517300 0.373900
+vn 0.761500 0.552600 0.338500
+vn 0.741000 0.567400 0.359100
+vn 0.750000 0.587700 0.303500
+vn 0.729700 0.601500 0.325000
+vn 0.719600 0.581600 0.379300
+vn 0.727400 0.548200 0.412700
+vn 0.697400 0.595200 0.399200
+vn 0.704900 0.562800 0.431600
+vn 0.708700 0.614700 0.346200
+vn 0.686800 0.627300 0.367000
+vn 0.732100 0.514500 0.446500
+vn 0.709500 0.530100 0.464200
+vn 0.698000 0.667700 0.258800
+vn 0.715300 0.635100 0.291500
+vn 0.735200 0.622200 0.269000
+vn 0.717300 0.655700 0.235500
+vn 0.696400 0.688300 0.202800
+vn 0.677600 0.699500 0.227100
+vn 0.672400 0.720100 0.171100
+vn 0.654300 0.730400 0.196200
+vn 0.658000 0.709900 0.251100
+vn 0.677800 0.679000 0.281900
+vn 0.637700 0.719500 0.274900
+vn 0.656900 0.689600 0.304800
+vn 0.635400 0.739900 0.221100
+vn 0.615800 0.748600 0.245800
+vn 0.694700 0.647300 0.313600
+vn 0.673300 0.658900 0.335500
+vn 0.599400 0.788500 0.138100
+vn 0.628100 0.760100 0.166400
+vn 0.645500 0.750700 0.140500
+vn 0.616000 0.779800 0.111400
+vn 0.583800 0.807500 0.083700
+vn 0.568000 0.815400 0.111100
+vn 0.549000 0.833800 0.057400
+vn 0.534200 0.841000 0.085500
+vn 0.551700 0.822500 0.138500
+vn 0.582000 0.796300 0.164600
+vn 0.534700 0.828600 0.165700
+vn 0.564100 0.803200 0.191100
+vn 0.518800 0.847300 0.113600
+vn 0.502800 0.852700 0.141700
+vn 0.609900 0.768800 0.192200
+vn 0.591100 0.776600 0.217800
+vn 0.459900 0.887100 0.039500
+vn 0.498000 0.865000 0.061600
+vn 0.511900 0.858400 0.032700
+vn 0.472700 0.881200 0.010000
+vn 0.431400 0.902000 -0.010800
+vn 0.419800 0.907400 0.019100
+vn 0.388200 0.921100 -0.029800
+vn 0.377700 0.925900 0.000600
+vn 0.407700 0.911800 0.049200
+vn 0.446600 0.892100 0.068900
+vn 0.395100 0.915200 0.079200
+vn 0.432800 0.896100 0.098300
+vn 0.366800 0.929700 0.031200
+vn 0.355500 0.932600 0.061800
+vn 0.483700 0.870600 0.090400
+vn 0.468700 0.875200 0.119100
+vn 0.289100 0.956800 -0.030200
+vn 0.334000 0.942400 -0.015800
+vn 0.343300 0.938000 -0.046800
+vn 0.297100 0.952800 -0.061600
+vn 0.249700 0.965500 -0.074300
+vn 0.242900 0.969100 -0.042500
+vn 0.200900 0.975900 -0.084700
+vn 0.195500 0.979300 -0.052700
+vn 0.235900 0.971700 -0.010700
+vn 0.280700 0.959700 0.001200
+vn 0.228600 0.973300 0.021100
+vn 0.272100 0.961700 0.032700
+vn 0.189900 0.981600 -0.020600
+vn 0.184000 0.982800 0.011500
+vn 0.324400 0.945800 0.015100
+vn 0.314400 0.948100 0.046200
+vn 0.098600 0.992900 -0.066300
+vn 0.147300 0.987200 -0.060600
+vn 0.151300 0.984100 -0.092900
+vn 0.101300 0.989900 -0.098700
+vn 0.050900 0.993400 -0.102200
+vn 0.049500 0.996300 -0.069800
+vn 0.000000 0.994600 -0.103400
+vn 0.000000 0.997500 -0.070900
+vn 0.048100 0.998100 -0.037200
+vn 0.095800 0.994800 -0.033800
+vn 0.046600 0.998900 -0.004500
+vn 0.092800 0.995700 -0.001300
+vn 0.000000 0.999200 -0.038300
+vn 0.000000 1.000000 -0.005600
+vn 0.143000 0.989300 -0.028400
+vn 0.138600 0.990300 0.004000
+vn -0.098600 0.992900 -0.066300
+vn -0.049500 0.996300 -0.069700
+vn -0.050900 0.993400 -0.102200
+vn -0.101300 0.989900 -0.098700
+vn -0.151300 0.984100 -0.092900
+vn -0.147300 0.987200 -0.060600
+vn -0.200900 0.975900 -0.084700
+vn -0.195500 0.979300 -0.052700
+vn -0.143000 0.989300 -0.028400
+vn -0.095700 0.994800 -0.033800
+vn -0.138600 0.990300 0.004000
+vn -0.092800 0.995700 -0.001300
+vn -0.189900 0.981600 -0.020600
+vn -0.184000 0.982800 0.011500
+vn -0.048100 0.998100 -0.037200
+vn -0.046600 0.998900 -0.004500
+vn -0.289100 0.956800 -0.030200
+vn -0.242900 0.969100 -0.042500
+vn -0.249700 0.965500 -0.074300
+vn -0.297100 0.952800 -0.061600
+vn -0.343300 0.938000 -0.046800
+vn -0.334000 0.942400 -0.015800
+vn -0.388200 0.921100 -0.029800
+vn -0.377700 0.925900 0.000600
+vn -0.324400 0.945800 0.015100
+vn -0.280700 0.959700 0.001200
+vn -0.314400 0.948100 0.046200
+vn -0.272100 0.961700 0.032700
+vn -0.366800 0.929700 0.031200
+vn -0.355500 0.932600 0.061800
+vn -0.235900 0.971700 -0.010700
+vn -0.228600 0.973300 0.021100
+vn -0.459900 0.887100 0.039500
+vn -0.419800 0.907400 0.019100
+vn -0.431400 0.902000 -0.010800
+vn -0.472700 0.881200 0.010000
+vn -0.511900 0.858400 0.032700
+vn -0.498000 0.865000 0.061600
+vn -0.549000 0.833800 0.057400
+vn -0.534200 0.841000 0.085500
+vn -0.483700 0.870600 0.090400
+vn -0.446600 0.892100 0.068900
+vn -0.468700 0.875200 0.119100
+vn -0.432800 0.896100 0.098300
+vn -0.518800 0.847300 0.113600
+vn -0.502800 0.852700 0.141700
+vn -0.407700 0.911800 0.049200
+vn -0.395100 0.915200 0.079200
+vn -0.599400 0.788500 0.138100
+vn -0.568000 0.815400 0.111100
+vn -0.583800 0.807500 0.083700
+vn -0.616000 0.779800 0.111400
+vn -0.645500 0.750700 0.140500
+vn -0.628100 0.760100 0.166400
+vn -0.672400 0.720100 0.171100
+vn -0.654300 0.730400 0.196200
+vn -0.609900 0.768800 0.192200
+vn -0.582000 0.796300 0.164600
+vn -0.591100 0.776600 0.217800
+vn -0.564100 0.803200 0.191100
+vn -0.635400 0.739900 0.221100
+vn -0.615800 0.748600 0.245800
+vn -0.551700 0.822500 0.138500
+vn -0.534700 0.828600 0.165700
+vn -0.698000 0.667700 0.258800
+vn -0.677600 0.699500 0.227100
+vn -0.696400 0.688300 0.202800
+vn -0.717300 0.655700 0.235500
+vn -0.735200 0.622200 0.269000
+vn -0.715300 0.635100 0.291500
+vn -0.750000 0.587700 0.303500
+vn -0.729700 0.601500 0.325000
+vn -0.694700 0.647300 0.313600
+vn -0.677800 0.679000 0.281900
+vn -0.673300 0.658900 0.335500
+vn -0.656900 0.689600 0.304800
+vn -0.708700 0.614700 0.346200
+vn -0.686800 0.627300 0.367000
+vn -0.658000 0.709900 0.251100
+vn -0.637700 0.719500 0.274900
+vn -0.749000 0.533000 0.393500
+vn -0.741000 0.567400 0.359100
+vn -0.761500 0.552600 0.338500
+vn -0.769800 0.517300 0.373900
+vn -0.774800 0.481600 0.409600
+vn -0.753800 0.498300 0.428300
+vn -0.776400 0.445600 0.445600
+vn -0.755500 0.463300 0.463300
+vn -0.732100 0.514500 0.446500
+vn -0.727400 0.548200 0.412700
+vn -0.709500 0.530100 0.464200
+vn -0.704900 0.562800 0.431600
+vn -0.733700 0.480500 0.480500
+vn -0.711000 0.497200 0.497200
+vn -0.719600 0.581600 0.379300
+vn -0.697400 0.595200 0.399200
+vn -0.749000 0.393500 0.533000
+vn -0.753800 0.428300 0.498300
+vn -0.774800 0.409600 0.481600
+vn -0.769800 0.373900 0.517300
+vn -0.761500 0.338500 0.552600
+vn -0.741000 0.359100 0.567400
+vn -0.719600 0.379300 0.581600
+vn -0.727400 0.412700 0.548200
+vn -0.697400 0.399200 0.595200
+vn -0.704900 0.431600 0.562800
+vn -0.732100 0.446500 0.514500
+vn -0.709500 0.464200 0.530100
+vn -0.613000 0.349500 0.708500
+vn -0.628300 0.378100 0.679900
+vn -0.651100 0.357000 0.669700
+vn -0.635300 0.327300 0.699500
+vn -0.640900 0.407600 0.650400
+vn -0.664200 0.387500 0.639200
+vn -0.616700 0.298400 0.728400
+vn -0.595100 0.321500 0.736500
+vn -0.595500 0.270200 0.756500
+vn -0.574600 0.294400 0.763600
+vn -0.572800 0.344400 0.743800
+vn -0.590000 0.371300 0.716900
+vn -0.549900 0.366900 0.750300
+vn -0.566400 0.392700 0.724500
+vn -0.553100 0.318300 0.769900
+vn -0.530900 0.341900 0.775400
+vn -0.604700 0.398900 0.689300
+vn -0.616900 0.427200 0.661000
+vn -0.580500 0.419200 0.698000
+vn -0.592200 0.446400 0.670800
+vn -0.526400 0.243400 0.814600
+vn -0.551600 0.268300 0.789700
+vn -0.571700 0.243200 0.783600
+vn -0.545500 0.217400 0.809400
+vn -0.517000 0.192800 0.833900
+vn -0.498900 0.219700 0.838300
+vn -0.486200 0.169600 0.857200
+vn -0.469200 0.197200 0.860800
+vn -0.480200 0.246400 0.841800
+vn -0.506700 0.269200 0.819000
+vn -0.461000 0.272800 0.844400
+vn -0.486400 0.294700 0.822500
+vn -0.451600 0.224800 0.863400
+vn -0.433500 0.252100 0.865200
+vn -0.531000 0.293100 0.795000
+vn -0.509700 0.317700 0.799500
+vn -0.403900 0.156800 0.901200
+vn -0.437400 0.176200 0.881800
+vn -0.453300 0.147700 0.879000
+vn -0.418600 0.127600 0.899100
+vn -0.382100 0.109100 0.917600
+vn -0.368700 0.139000 0.919100
+vn -0.343800 0.092300 0.934500
+vn -0.331700 0.122700 0.935300
+vn -0.354900 0.168600 0.919600
+vn -0.388800 0.185800 0.902400
+vn -0.340700 0.198200 0.919000
+vn -0.373200 0.214700 0.902600
+vn -0.319300 0.153000 0.935200
+vn -0.306500 0.183200 0.934000
+vn -0.421000 0.204500 0.883700
+vn -0.404200 0.232600 0.884600
+vn -0.253900 0.095600 0.962500
+vn -0.293400 0.108200 0.949800
+vn -0.304000 0.077200 0.949500
+vn -0.263100 0.064100 0.962600
+vn -0.221100 0.052900 0.973800
+vn -0.213400 0.084700 0.973300
+vn -0.178000 0.043700 0.983100
+vn -0.171700 0.075800 0.982200
+vn -0.205400 0.116500 0.971700
+vn -0.244400 0.126900 0.961300
+vn -0.197100 0.148100 0.969100
+vn -0.234600 0.158100 0.959100
+vn -0.165300 0.107900 0.980300
+vn -0.158700 0.139900 0.977400
+vn -0.282400 0.139000 0.949200
+vn -0.271100 0.169800 0.947400
+vn -0.086600 0.063800 0.994200
+vn -0.129300 0.068800 0.989200
+vn -0.134000 0.036500 0.990300
+vn -0.089800 0.031300 0.995500
+vn -0.045000 0.028200 0.998600
+vn -0.043500 0.060900 0.997200
+vn 0.000000 0.027100 0.999600
+vn 0.000000 0.059800 0.998200
+vn -0.041800 0.093400 0.994700
+vn -0.083300 0.096300 0.991800
+vn -0.040200 0.126000 0.991200
+vn -0.080000 0.128800 0.988400
+vn 0.000000 0.092500 0.995700
+vn 0.000000 0.125100 0.992100
+vn -0.124500 0.101200 0.987000
+vn -0.119500 0.133400 0.983800
+vn 0.086600 0.063800 0.994200
+vn 0.043500 0.060900 0.997200
+vn 0.045000 0.028200 0.998600
+vn 0.089800 0.031300 0.995500
+vn 0.134000 0.036500 0.990300
+vn 0.129300 0.068800 0.989200
+vn 0.178000 0.043700 0.983100
+vn 0.171700 0.075800 0.982200
+vn 0.124500 0.101200 0.987000
+vn 0.083300 0.096300 0.991800
+vn 0.119500 0.133400 0.983800
+vn 0.080000 0.128800 0.988400
+vn 0.165300 0.107900 0.980300
+vn 0.158700 0.139900 0.977400
+vn 0.041800 0.093400 0.994700
+vn 0.040200 0.126000 0.991200
+vn 0.253900 0.095600 0.962500
+vn 0.213400 0.084700 0.973300
+vn 0.221100 0.052900 0.973800
+vn 0.263100 0.064100 0.962600
+vn 0.304000 0.077200 0.949500
+vn 0.293400 0.108200 0.949800
+vn 0.343800 0.092300 0.934500
+vn 0.331700 0.122700 0.935300
+vn 0.282400 0.139000 0.949200
+vn 0.244400 0.126900 0.961300
+vn 0.271100 0.169800 0.947400
+vn 0.234600 0.158100 0.959100
+vn 0.319300 0.153000 0.935200
+vn 0.306500 0.183200 0.934000
+vn 0.205400 0.116500 0.971700
+vn 0.197100 0.148100 0.969100
+vn 0.403900 0.156800 0.901200
+vn 0.368700 0.139000 0.919100
+vn 0.382100 0.109100 0.917600
+vn 0.418600 0.127600 0.899100
+vn 0.453300 0.147700 0.879000
+vn 0.437400 0.176200 0.881800
+vn 0.486200 0.169600 0.857200
+vn 0.469200 0.197200 0.860800
+vn 0.421000 0.204500 0.883700
+vn 0.388800 0.185800 0.902400
+vn 0.404200 0.232600 0.884600
+vn 0.373200 0.214700 0.902600
+vn 0.451600 0.224800 0.863400
+vn 0.433500 0.252100 0.865100
+vn 0.354900 0.168600 0.919600
+vn 0.340700 0.198200 0.919000
+vn 0.526400 0.243400 0.814600
+vn 0.498900 0.219700 0.838300
+vn 0.517000 0.192800 0.833900
+vn 0.545500 0.217400 0.809400
+vn 0.571700 0.243200 0.783600
+vn 0.551600 0.268300 0.789700
+vn 0.595500 0.270200 0.756500
+vn 0.574600 0.294400 0.763600
+vn 0.531000 0.293100 0.795000
+vn 0.506700 0.269200 0.819000
+vn 0.509700 0.317700 0.799500
+vn 0.486400 0.294700 0.822500
+vn 0.553100 0.318300 0.769900
+vn 0.530900 0.341900 0.775400
+vn 0.480200 0.246400 0.841800
+vn 0.461000 0.272800 0.844400
+vn 0.613000 0.349500 0.708500
+vn 0.595100 0.321500 0.736500
+vn 0.616700 0.298400 0.728400
+vn 0.635300 0.327300 0.699500
+vn 0.651100 0.357000 0.669700
+vn 0.628300 0.378100 0.679900
+vn 0.664200 0.387500 0.639200
+vn 0.640900 0.407600 0.650400
+vn 0.604700 0.398900 0.689300
+vn 0.590000 0.371300 0.716900
+vn 0.580500 0.419200 0.698000
+vn 0.566400 0.392700 0.724500
+vn 0.616900 0.427200 0.661000
+vn 0.592200 0.446400 0.670800
+vn 0.572800 0.344400 0.743800
+vn 0.549900 0.366900 0.750300
+vn 0.657800 0.467800 0.590300
+vn 0.650800 0.437500 0.620500
+vn 0.674400 0.418600 0.608200
+vn 0.681800 0.449900 0.576800
+vn 0.686100 0.481500 0.545200
+vn 0.662100 0.498200 0.559800
+vn 0.687600 0.513400 0.513400
+vn 0.663500 0.529000 0.529000
+vn 0.637300 0.514500 0.573700
+vn 0.633200 0.485200 0.603000
+vn 0.611700 0.530200 0.587000
+vn 0.607800 0.502000 0.615200
+vn 0.638700 0.544100 0.544100
+vn 0.613100 0.558600 0.558600
+vn 0.626400 0.456000 0.632100
+vn 0.601300 0.474100 0.643100
+vn 0.657800 0.590300 0.467800
+vn 0.662100 0.559800 0.498200
+vn 0.686100 0.545200 0.481500
+vn 0.681800 0.576800 0.449900
+vn 0.674400 0.608200 0.418600
+vn 0.650800 0.620500 0.437500
+vn 0.664200 0.639200 0.387500
+vn 0.640900 0.650400 0.407600
+vn 0.626400 0.632100 0.456000
+vn 0.633200 0.603000 0.485200
+vn 0.601300 0.643100 0.474100
+vn 0.607800 0.615200 0.502000
+vn 0.616900 0.661000 0.427200
+vn 0.592200 0.670800 0.446400
+vn 0.637300 0.573700 0.514500
+vn 0.611700 0.587000 0.530200
+vn 0.613000 0.708500 0.349500
+vn 0.628300 0.679900 0.378100
+vn 0.651100 0.669700 0.357000
+vn 0.635300 0.699500 0.327300
+vn 0.616700 0.728400 0.298400
+vn 0.595100 0.736500 0.321500
+vn 0.595500 0.756500 0.270200
+vn 0.574600 0.763600 0.294400
+vn 0.572800 0.743800 0.344400
+vn 0.590000 0.716900 0.371300
+vn 0.549900 0.750300 0.366900
+vn 0.566400 0.724500 0.392700
+vn 0.553100 0.769900 0.318300
+vn 0.530900 0.775400 0.341900
+vn 0.604700 0.689300 0.398900
+vn 0.580500 0.698000 0.419200
+vn 0.526400 0.814600 0.243400
+vn 0.551600 0.789700 0.268300
+vn 0.571700 0.783600 0.243200
+vn 0.545500 0.809400 0.217400
+vn 0.517000 0.833900 0.192800
+vn 0.498900 0.838300 0.219700
+vn 0.486200 0.857200 0.169600
+vn 0.469200 0.860800 0.197200
+vn 0.480200 0.841800 0.246400
+vn 0.506700 0.819000 0.269200
+vn 0.461000 0.844400 0.272800
+vn 0.486400 0.822500 0.294700
+vn 0.451600 0.863400 0.224800
+vn 0.433500 0.865100 0.252100
+vn 0.531000 0.795000 0.293100
+vn 0.509700 0.799500 0.317700
+vn 0.403900 0.901200 0.156800
+vn 0.437400 0.881800 0.176200
+vn 0.453300 0.879000 0.147700
+vn 0.418600 0.899100 0.127600
+vn 0.382100 0.917600 0.109100
+vn 0.368700 0.919100 0.139000
+vn 0.343800 0.934500 0.092300
+vn 0.331700 0.935300 0.122700
+vn 0.354900 0.919600 0.168600
+vn 0.388800 0.902400 0.185800
+vn 0.340600 0.919000 0.198200
+vn 0.373200 0.902600 0.214700
+vn 0.319300 0.935200 0.153000
+vn 0.306500 0.934000 0.183200
+vn 0.421000 0.883700 0.204500
+vn 0.404200 0.884600 0.232600
+vn 0.253900 0.962500 0.095600
+vn 0.293400 0.949800 0.108200
+vn 0.304000 0.949500 0.077200
+vn 0.263100 0.962600 0.064100
+vn 0.221100 0.973800 0.052900
+vn 0.213400 0.973300 0.084700
+vn 0.178000 0.983100 0.043700
+vn 0.171700 0.982200 0.075800
+vn 0.205400 0.971700 0.116500
+vn 0.244400 0.961300 0.126900
+vn 0.197100 0.969100 0.148100
+vn 0.234600 0.959100 0.158100
+vn 0.165300 0.980300 0.107900
+vn 0.158700 0.977400 0.139900
+vn 0.282400 0.949200 0.139000
+vn 0.271100 0.947400 0.169800
+vn 0.086600 0.994200 0.063800
+vn 0.129300 0.989200 0.068800
+vn 0.134000 0.990300 0.036500
+vn 0.089800 0.995500 0.031300
+vn 0.045000 0.998600 0.028200
+vn 0.043500 0.997200 0.060900
+vn 0.000000 0.999600 0.027100
+vn 0.000000 0.998200 0.059800
+vn 0.041800 0.994700 0.093400
+vn 0.083300 0.991800 0.096300
+vn 0.040200 0.991200 0.126000
+vn 0.080000 0.988400 0.128800
+vn 0.000000 0.995700 0.092500
+vn 0.000000 0.992100 0.125100
+vn 0.124500 0.987000 0.101200
+vn 0.119500 0.983800 0.133400
+vn -0.086600 0.994200 0.063800
+vn -0.043500 0.997200 0.060900
+vn -0.045000 0.998600 0.028200
+vn -0.089800 0.995500 0.031300
+vn -0.134000 0.990300 0.036500
+vn -0.129300 0.989200 0.068800
+vn -0.178000 0.983100 0.043700
+vn -0.171700 0.982200 0.075800
+vn -0.124500 0.987000 0.101100
+vn -0.083300 0.991800 0.096300
+vn -0.119500 0.983800 0.133400
+vn -0.080000 0.988400 0.128800
+vn -0.165300 0.980300 0.107900
+vn -0.158700 0.977400 0.139900
+vn -0.041800 0.994700 0.093400
+vn -0.040200 0.991200 0.126000
+vn -0.253900 0.962500 0.095600
+vn -0.213400 0.973300 0.084700
+vn -0.221100 0.973800 0.052900
+vn -0.263100 0.962600 0.064100
+vn -0.304000 0.949500 0.077200
+vn -0.293400 0.949800 0.108200
+vn -0.343800 0.934500 0.092300
+vn -0.331700 0.935300 0.122700
+vn -0.282400 0.949200 0.139000
+vn -0.244400 0.961300 0.126900
+vn -0.271100 0.947400 0.169800
+vn -0.234600 0.959100 0.158100
+vn -0.319300 0.935200 0.153000
+vn -0.306500 0.934000 0.183200
+vn -0.205400 0.971700 0.116500
+vn -0.197100 0.969100 0.148100
+vn -0.403900 0.901200 0.156800
+vn -0.368700 0.919100 0.139000
+vn -0.382100 0.917600 0.109100
+vn -0.418600 0.899100 0.127600
+vn -0.453300 0.879000 0.147700
+vn -0.437400 0.881800 0.176200
+vn -0.486200 0.857200 0.169600
+vn -0.469200 0.860800 0.197300
+vn -0.421000 0.883700 0.204500
+vn -0.388800 0.902400 0.185800
+vn -0.404200 0.884600 0.232600
+vn -0.373200 0.902600 0.214700
+vn -0.451600 0.863400 0.224800
+vn -0.433500 0.865200 0.252100
+vn -0.354900 0.919600 0.168600
+vn -0.340700 0.919000 0.198200
+vn -0.526400 0.814600 0.243400
+vn -0.498900 0.838300 0.219700
+vn -0.517000 0.833900 0.192800
+vn -0.545500 0.809400 0.217400
+vn -0.571700 0.783600 0.243200
+vn -0.551600 0.789700 0.268300
+vn -0.595500 0.756500 0.270200
+vn -0.574600 0.763600 0.294400
+vn -0.531000 0.795000 0.293100
+vn -0.506700 0.819000 0.269200
+vn -0.509700 0.799500 0.317700
+vn -0.486400 0.822500 0.294700
+vn -0.553100 0.769900 0.318300
+vn -0.530900 0.775400 0.341900
+vn -0.480200 0.841800 0.246400
+vn -0.461000 0.844400 0.272800
+vn -0.613000 0.708500 0.349500
+vn -0.595100 0.736500 0.321600
+vn -0.616700 0.728400 0.298400
+vn -0.635300 0.699500 0.327300
+vn -0.651100 0.669700 0.357000
+vn -0.628300 0.679900 0.378100
+vn -0.664200 0.639200 0.387500
+vn -0.640900 0.650400 0.407600
+vn -0.604700 0.689300 0.398900
+vn -0.590000 0.716900 0.371300
+vn -0.580500 0.698000 0.419200
+vn -0.566400 0.724500 0.392700
+vn -0.616900 0.661000 0.427200
+vn -0.592200 0.670800 0.446400
+vn -0.572800 0.743800 0.344400
+vn -0.549900 0.750300 0.366900
+vn -0.657800 0.590300 0.467800
+vn -0.650800 0.620500 0.437500
+vn -0.674400 0.608200 0.418600
+vn -0.681800 0.576800 0.449900
+vn -0.686100 0.545200 0.481500
+vn -0.662100 0.559800 0.498200
+vn -0.687600 0.513400 0.513400
+vn -0.663500 0.529000 0.529000
+vn -0.637300 0.573700 0.514500
+vn -0.633200 0.603000 0.485200
+vn -0.611700 0.587000 0.530200
+vn -0.607800 0.615200 0.502000
+vn -0.638700 0.544100 0.544100
+vn -0.613100 0.558600 0.558600
+vn -0.626400 0.632100 0.456000
+vn -0.601300 0.643100 0.474100
+vn -0.657800 0.467800 0.590300
+vn -0.662100 0.498200 0.559800
+vn -0.686100 0.481500 0.545200
+vn -0.681800 0.449900 0.576800
+vn -0.674400 0.418600 0.608200
+vn -0.650800 0.437500 0.620500
+vn -0.626400 0.456000 0.632100
+vn -0.633200 0.485200 0.603000
+vn -0.601300 0.474100 0.643100
+vn -0.607800 0.502000 0.615200
+vn -0.637300 0.514500 0.573700
+vn -0.611700 0.530200 0.587000
+vn -0.517300 0.434300 0.737400
+vn -0.530200 0.458500 0.713200
+vn -0.555600 0.439100 0.706000
+vn -0.542100 0.413800 0.731300
+vn -0.540800 0.483400 0.688300
+vn -0.566800 0.465200 0.680000
+vn -0.526300 0.389100 0.756000
+vn -0.502200 0.410800 0.760900
+vn -0.508200 0.365100 0.780000
+vn -0.484900 0.387900 0.783800
+vn -0.477500 0.432100 0.765000
+vn -0.491900 0.454500 0.742600
+vn -0.452300 0.452900 0.768300
+vn -0.465900 0.474100 0.747100
+vn -0.461100 0.410300 0.786800
+vn -0.436700 0.432300 0.788900
+vn -0.504100 0.477500 0.719600
+vn -0.514200 0.501100 0.696000
+vn -0.477500 0.495900 0.725300
+vn -0.487100 0.518300 0.702900
+vn -0.444200 0.344800 0.826900
+vn -0.465500 0.365900 0.805900
+vn -0.487800 0.342000 0.803100
+vn -0.465500 0.320000 0.825200
+vn -0.441200 0.299000 0.846100
+vn -0.421000 0.324800 0.846900
+vn -0.414900 0.279200 0.866000
+vn -0.395900 0.305900 0.865800
+vn -0.400300 0.350400 0.846700
+vn -0.422400 0.369400 0.827700
+vn -0.379200 0.375500 0.845700
+vn -0.400100 0.393500 0.827700
+vn -0.376400 0.332300 0.864700
+vn -0.356500 0.358500 0.862700
+vn -0.442600 0.389400 0.807700
+vn -0.419200 0.412500 0.808700
+vn -0.340800 0.271700 0.900000
+vn -0.369100 0.288200 0.883600
+vn -0.386800 0.260500 0.884500
+vn -0.357200 0.243400 0.901700
+vn -0.326100 0.227600 0.917500
+vn -0.311100 0.256700 0.915000
+vn -0.293400 0.213200 0.931900
+vn -0.279900 0.243000 0.928700
+vn -0.295800 0.285500 0.911500
+vn -0.324100 0.299900 0.897200
+vn -0.280200 0.314200 0.907100
+vn -0.307000 0.327700 0.893500
+vn -0.266200 0.272500 0.924600
+vn -0.252100 0.301800 0.919400
+vn -0.351000 0.315500 0.881600
+vn -0.332400 0.342500 0.878700
+vn -0.214300 0.220100 0.951600
+vn -0.247600 0.230800 0.941000
+vn -0.259400 0.200400 0.944700
+vn -0.224600 0.189200 0.955900
+vn -0.188700 0.179700 0.965500
+vn -0.180000 0.211000 0.960800
+vn -0.151900 0.171800 0.973400
+vn -0.144900 0.203400 0.968300
+vn -0.171200 0.242100 0.955000
+vn -0.203700 0.250700 0.946300
+vn -0.162100 0.273000 0.948200
+vn -0.193000 0.281200 0.940000
+vn -0.137800 0.234900 0.962200
+vn -0.130500 0.266200 0.955000
+vn -0.235400 0.260900 0.936200
+vn -0.223000 0.290800 0.930400
+vn -0.073100 0.193300 0.978400
+vn -0.109100 0.197500 0.974200
+vn -0.114400 0.165600 0.979500
+vn -0.076600 0.161200 0.983900
+vn -0.038500 0.158500 0.986600
+vn -0.036700 0.190800 0.980900
+vn 0.000000 0.157600 0.987500
+vn 0.000000 0.189900 0.981800
+vn -0.034900 0.222900 0.974200
+vn -0.069500 0.225300 0.971800
+vn -0.033100 0.254800 0.966400
+vn -0.065800 0.257100 0.964100
+vn 0.000000 0.222100 0.975000
+vn 0.000000 0.254000 0.967200
+vn -0.103800 0.229300 0.967800
+vn -0.098300 0.260900 0.960300
+vn 0.073100 0.193300 0.978400
+vn 0.036700 0.190800 0.980900
+vn 0.038500 0.158500 0.986600
+vn 0.076600 0.161200 0.983900
+vn 0.114400 0.165600 0.979500
+vn 0.109100 0.197500 0.974200
+vn 0.151900 0.171800 0.973400
+vn 0.144900 0.203400 0.968300
+vn 0.103800 0.229300 0.967800
+vn 0.069500 0.225300 0.971800
+vn 0.098300 0.260900 0.960300
+vn 0.065800 0.257100 0.964100
+vn 0.137800 0.234900 0.962200
+vn 0.130500 0.266200 0.955000
+vn 0.034900 0.222900 0.974200
+vn 0.033100 0.254800 0.966400
+vn 0.214300 0.220100 0.951600
+vn 0.180000 0.211000 0.960800
+vn 0.188700 0.179700 0.965500
+vn 0.224600 0.189200 0.955900
+vn 0.259400 0.200400 0.944700
+vn 0.247600 0.230800 0.941000
+vn 0.293400 0.213200 0.931900
+vn 0.279900 0.243000 0.928700
+vn 0.235400 0.260900 0.936200
+vn 0.203700 0.250700 0.946300
+vn 0.223000 0.290800 0.930400
+vn 0.193000 0.281200 0.940000
+vn 0.266200 0.272500 0.924600
+vn 0.252100 0.301800 0.919400
+vn 0.171200 0.242100 0.955000
+vn 0.162100 0.273000 0.948200
+vn 0.340800 0.271700 0.900000
+vn 0.311100 0.256700 0.915000
+vn 0.326100 0.227600 0.917500
+vn 0.357200 0.243400 0.901700
+vn 0.386800 0.260500 0.884500
+vn 0.369100 0.288200 0.883600
+vn 0.414900 0.279200 0.866000
+vn 0.395900 0.305900 0.865800
+vn 0.351000 0.315500 0.881600
+vn 0.324100 0.299900 0.897200
+vn 0.332400 0.342500 0.878700
+vn 0.307000 0.327700 0.893500
+vn 0.376400 0.332300 0.864700
+vn 0.356500 0.358500 0.862700
+vn 0.295800 0.285600 0.911500
+vn 0.280200 0.314200 0.907100
+vn 0.444200 0.344800 0.826900
+vn 0.421000 0.324800 0.846900
+vn 0.441200 0.299000 0.846100
+vn 0.465500 0.320000 0.825100
+vn 0.487800 0.342000 0.803100
+vn 0.465500 0.365900 0.805900
+vn 0.508200 0.365100 0.780000
+vn 0.484900 0.387900 0.783800
+vn 0.442600 0.389400 0.807700
+vn 0.422400 0.369400 0.827700
+vn 0.419200 0.412500 0.808700
+vn 0.400100 0.393500 0.827700
+vn 0.461100 0.410300 0.786800
+vn 0.436700 0.432300 0.788900
+vn 0.400300 0.350400 0.846700
+vn 0.379200 0.375500 0.845700
+vn 0.517300 0.434300 0.737400
+vn 0.502200 0.410800 0.760900
+vn 0.526300 0.389100 0.756000
+vn 0.542100 0.413800 0.731300
+vn 0.555600 0.439100 0.706000
+vn 0.530200 0.458500 0.713200
+vn 0.566800 0.465200 0.680000
+vn 0.540800 0.483400 0.688300
+vn 0.504100 0.477500 0.719600
+vn 0.491900 0.454500 0.742600
+vn 0.477500 0.495900 0.725300
+vn 0.465900 0.474100 0.747100
+vn 0.514200 0.501100 0.696000
+vn 0.487100 0.518300 0.702900
+vn 0.477500 0.432100 0.765000
+vn 0.452300 0.452900 0.768300
+vn 0.555100 0.534200 0.637500
+vn 0.549200 0.508700 0.663000
+vn 0.575500 0.491700 0.653400
+vn 0.581800 0.518400 0.626700
+vn 0.585500 0.545400 0.599700
+vn 0.558700 0.559900 0.611800
+vn 0.586800 0.572600 0.572600
+vn 0.559900 0.585900 0.585900
+vn 0.531200 0.573900 0.623200
+vn 0.527800 0.549400 0.647700
+vn 0.503200 0.587200 0.634000
+vn 0.500000 0.564000 0.657200
+vn 0.532400 0.598500 0.598500
+vn 0.504300 0.610600 0.610600
+vn 0.522200 0.525200 0.671900
+vn 0.494600 0.541100 0.680100
+vn 0.555100 0.637500 0.534200
+vn 0.558700 0.611800 0.559900
+vn 0.585500 0.599700 0.545300
+vn 0.581800 0.626700 0.518400
+vn 0.575500 0.653400 0.491700
+vn 0.549200 0.663000 0.508700
+vn 0.566800 0.680000 0.465200
+vn 0.540800 0.688300 0.483400
+vn 0.522200 0.671900 0.525200
+vn 0.527800 0.647700 0.549400
+vn 0.494600 0.680100 0.541100
+vn 0.500000 0.657200 0.564000
+vn 0.514300 0.696000 0.501100
+vn 0.487100 0.702900 0.518300
+vn 0.531200 0.623200 0.573900
+vn 0.503200 0.634000 0.587200
+vn 0.517300 0.737400 0.434300
+vn 0.530200 0.713200 0.458500
+vn 0.555600 0.706000 0.439100
+vn 0.542100 0.731300 0.413800
+vn 0.526300 0.756000 0.389100
+vn 0.502200 0.760900 0.410800
+vn 0.508200 0.780000 0.365100
+vn 0.484900 0.783800 0.387900
+vn 0.477500 0.765000 0.432100
+vn 0.491900 0.742600 0.454500
+vn 0.452300 0.768300 0.452900
+vn 0.465900 0.747100 0.474100
+vn 0.461100 0.786800 0.410300
+vn 0.436700 0.788900 0.432300
+vn 0.504100 0.719600 0.477500
+vn 0.477500 0.725300 0.495900
+vn 0.444200 0.826900 0.344800
+vn 0.465500 0.805900 0.365900
+vn 0.487800 0.803100 0.342000
+vn 0.465500 0.825100 0.320000
+vn 0.441200 0.846100 0.299000
+vn 0.421000 0.846900 0.324800
+vn 0.414900 0.866000 0.279200
+vn 0.395900 0.865800 0.305900
+vn 0.400300 0.846700 0.350400
+vn 0.422400 0.827700 0.369400
+vn 0.379200 0.845700 0.375500
+vn 0.400100 0.827700 0.393500
+vn 0.376400 0.864700 0.332300
+vn 0.356500 0.862700 0.358500
+vn 0.442600 0.807700 0.389300
+vn 0.419200 0.808700 0.412500
+vn 0.340800 0.900000 0.271700
+vn 0.369100 0.883600 0.288200
+vn 0.386800 0.884500 0.260500
+vn 0.357200 0.901700 0.243400
+vn 0.326100 0.917500 0.227600
+vn 0.311100 0.915000 0.256700
+vn 0.293400 0.931900 0.213200
+vn 0.279900 0.928700 0.243000
+vn 0.295800 0.911500 0.285500
+vn 0.324100 0.897200 0.299900
+vn 0.280200 0.907100 0.314200
+vn 0.307000 0.893500 0.327700
+vn 0.266200 0.924600 0.272500
+vn 0.252100 0.919400 0.301800
+vn 0.351000 0.881600 0.315500
+vn 0.332400 0.878700 0.342500
+vn 0.214300 0.951600 0.220100
+vn 0.247600 0.941000 0.230700
+vn 0.259400 0.944700 0.200400
+vn 0.224600 0.955900 0.189200
+vn 0.188700 0.965500 0.179600
+vn 0.180000 0.960800 0.211000
+vn 0.151900 0.973400 0.171800
+vn 0.144900 0.968300 0.203400
+vn 0.171200 0.955000 0.242100
+vn 0.203700 0.946300 0.250700
+vn 0.162100 0.948200 0.273000
+vn 0.193000 0.940000 0.281200
+vn 0.137800 0.962200 0.234900
+vn 0.130500 0.955000 0.266200
+vn 0.235400 0.936200 0.260900
+vn 0.223000 0.930400 0.290800
+vn 0.073100 0.978400 0.193300
+vn 0.109100 0.974200 0.197500
+vn 0.114400 0.979500 0.165600
+vn 0.076600 0.983900 0.161200
+vn 0.038500 0.986600 0.158500
+vn 0.036700 0.980900 0.190800
+vn 0.000000 0.987500 0.157600
+vn 0.000000 0.981800 0.189900
+vn 0.034900 0.974200 0.222900
+vn 0.069500 0.971800 0.225300
+vn 0.033100 0.966400 0.254800
+vn 0.065800 0.964100 0.257100
+vn 0.000000 0.975000 0.222100
+vn 0.000000 0.967200 0.254000
+vn 0.103800 0.967800 0.229300
+vn 0.098300 0.960300 0.260900
+vn -0.073100 0.978400 0.193300
+vn -0.036700 0.980900 0.190800
+vn -0.038500 0.986600 0.158500
+vn -0.076600 0.983900 0.161200
+vn -0.114400 0.979500 0.165600
+vn -0.109100 0.974200 0.197500
+vn -0.151900 0.973400 0.171800
+vn -0.144900 0.968300 0.203400
+vn -0.103800 0.967800 0.229300
+vn -0.069500 0.971800 0.225300
+vn -0.098300 0.960300 0.260900
+vn -0.065800 0.964100 0.257100
+vn -0.137800 0.962200 0.234900
+vn -0.130500 0.955000 0.266200
+vn -0.034900 0.974200 0.222900
+vn -0.033100 0.966400 0.254800
+vn -0.214300 0.951600 0.220100
+vn -0.180000 0.960800 0.211000
+vn -0.188700 0.965500 0.179700
+vn -0.224600 0.955900 0.189200
+vn -0.259400 0.944700 0.200400
+vn -0.247600 0.941000 0.230800
+vn -0.293400 0.931900 0.213200
+vn -0.279900 0.928700 0.243000
+vn -0.235400 0.936200 0.260900
+vn -0.203700 0.946300 0.250700
+vn -0.223000 0.930400 0.290800
+vn -0.193000 0.940000 0.281200
+vn -0.266200 0.924600 0.272500
+vn -0.252100 0.919400 0.301800
+vn -0.171200 0.955000 0.242100
+vn -0.162100 0.948200 0.273000
+vn -0.340800 0.900000 0.271700
+vn -0.311100 0.915000 0.256700
+vn -0.326100 0.917500 0.227600
+vn -0.357200 0.901700 0.243400
+vn -0.386800 0.884500 0.260500
+vn -0.369100 0.883600 0.288200
+vn -0.414900 0.866000 0.279200
+vn -0.395900 0.865800 0.305900
+vn -0.351000 0.881600 0.315500
+vn -0.324100 0.897200 0.299900
+vn -0.332400 0.878700 0.342500
+vn -0.307000 0.893500 0.327700
+vn -0.376400 0.864700 0.332300
+vn -0.356500 0.862700 0.358500
+vn -0.295800 0.911500 0.285500
+vn -0.280200 0.907100 0.314200
+vn -0.444200 0.826900 0.344800
+vn -0.421000 0.846900 0.324800
+vn -0.441200 0.846100 0.299000
+vn -0.465500 0.825100 0.320000
+vn -0.487900 0.803100 0.342000
+vn -0.465500 0.805900 0.365900
+vn -0.508200 0.780000 0.365100
+vn -0.484900 0.783800 0.387900
+vn -0.442600 0.807700 0.389300
+vn -0.422400 0.827700 0.369400
+vn -0.419200 0.808700 0.412500
+vn -0.400100 0.827700 0.393500
+vn -0.461100 0.786800 0.410300
+vn -0.436700 0.788900 0.432300
+vn -0.400300 0.846700 0.350400
+vn -0.379200 0.845700 0.375500
+vn -0.517300 0.737400 0.434300
+vn -0.502200 0.760900 0.410800
+vn -0.526300 0.756000 0.389100
+vn -0.542100 0.731300 0.413800
+vn -0.555600 0.706000 0.439100
+vn -0.530200 0.713200 0.458500
+vn -0.566800 0.680000 0.465200
+vn -0.540800 0.688300 0.483400
+vn -0.504100 0.719600 0.477500
+vn -0.491900 0.742600 0.454500
+vn -0.477500 0.725300 0.495900
+vn -0.465900 0.747100 0.474100
+vn -0.514200 0.696000 0.501100
+vn -0.487100 0.702900 0.518300
+vn -0.477500 0.765000 0.432100
+vn -0.452300 0.768300 0.452900
+vn -0.555100 0.637500 0.534200
+vn -0.549200 0.663000 0.508700
+vn -0.575500 0.653400 0.491700
+vn -0.581800 0.626700 0.518400
+vn -0.585500 0.599700 0.545300
+vn -0.558700 0.611800 0.559900
+vn -0.586800 0.572600 0.572600
+vn -0.559900 0.585900 0.585900
+vn -0.531200 0.623200 0.573900
+vn -0.527800 0.647700 0.549400
+vn -0.503200 0.634000 0.587200
+vn -0.500000 0.657200 0.564000
+vn -0.532400 0.598500 0.598500
+vn -0.504300 0.610600 0.610600
+vn -0.522200 0.671900 0.525100
+vn -0.494600 0.680100 0.541100
+vn -0.555100 0.534200 0.637500
+vn -0.558700 0.559900 0.611800
+vn -0.585500 0.545400 0.599700
+vn -0.581800 0.518400 0.626700
+vn -0.575500 0.491700 0.653400
+vn -0.549200 0.508700 0.663000
+vn -0.522200 0.525200 0.671900
+vn -0.527800 0.549400 0.647700
+vn -0.494600 0.541100 0.680100
+vn -0.500000 0.564000 0.657200
+vn -0.531200 0.573900 0.623200
+vn -0.503200 0.587200 0.634000
+vn -0.412400 0.511900 0.753500
+vn -0.422700 0.531200 0.734200
+vn -0.450300 0.513900 0.730200
+vn -0.439400 0.493300 0.750700
+vn -0.431200 0.551000 0.714400
+vn -0.459400 0.535000 0.709000
+vn -0.426600 0.473300 0.770700
+vn -0.400400 0.493200 0.772300
+vn -0.411800 0.453900 0.790200
+vn -0.386500 0.474900 0.790600
+vn -0.373700 0.512500 0.773100
+vn -0.385000 0.530000 0.755500
+vn -0.346600 0.531300 0.773000
+vn -0.357100 0.547600 0.756700
+vn -0.360900 0.495500 0.790100
+vn -0.334700 0.515500 0.788800
+vn -0.394500 0.548000 0.737500
+vn -0.402500 0.566500 0.719000
+vn -0.365900 0.564300 0.740000
+vn -0.373300 0.581400 0.722900
+vn -0.354100 0.440600 0.824900
+vn -0.371100 0.457400 0.808100
+vn -0.395400 0.435100 0.808900
+vn -0.377300 0.417300 0.826700
+vn -0.357600 0.400300 0.843700
+vn -0.335600 0.424700 0.840800
+vn -0.336300 0.384200 0.859800
+vn -0.315600 0.409600 0.855900
+vn -0.313300 0.448500 0.837000
+vn -0.330600 0.463400 0.822100
+vn -0.290600 0.472000 0.832300
+vn -0.306600 0.485800 0.818500
+vn -0.294600 0.434400 0.851100
+vn -0.273300 0.458900 0.845400
+vn -0.346400 0.479000 0.806500
+vn -0.321300 0.500300 0.804000
+vn -0.271700 0.382300 0.883100
+vn -0.294300 0.395400 0.870100
+vn -0.313500 0.369200 0.874900
+vn -0.289500 0.355200 0.888800
+vn -0.264300 0.342400 0.901600
+vn -0.248000 0.370300 0.895200
+vn -0.237800 0.330800 0.913200
+vn -0.223200 0.359400 0.906100
+vn -0.231500 0.397800 0.887800
+vn -0.253600 0.409000 0.876500
+vn -0.214800 0.424900 0.879400
+vn -0.235300 0.435300 0.869000
+vn -0.208300 0.387600 0.897900
+vn -0.193200 0.415500 0.888800
+vn -0.274700 0.421200 0.864300
+vn -0.254800 0.446600 0.857600
+vn -0.170800 0.341100 0.924300
+vn -0.197400 0.349600 0.915800
+vn -0.210300 0.320400 0.923600
+vn -0.182000 0.311300 0.932700
+vn -0.152900 0.303600 0.940400
+vn -0.143500 0.333900 0.931600
+vn -0.123100 0.297200 0.946800
+vn -0.115500 0.327900 0.937600
+vn -0.134000 0.363800 0.921800
+vn -0.159400 0.370600 0.915000
+vn -0.124300 0.393400 0.910900
+vn -0.147900 0.399700 0.904600
+vn -0.107800 0.358200 0.927400
+vn -0.100000 0.388200 0.916100
+vn -0.184200 0.378500 0.907000
+vn -0.170900 0.407000 0.897300
+vn -0.058300 0.319800 0.945700
+vn -0.087000 0.323200 0.942300
+vn -0.092700 0.292200 0.951800
+vn -0.062100 0.288600 0.955400
+vn -0.031200 0.286400 0.957600
+vn -0.029200 0.317800 0.947700
+vn 0.000000 0.285700 0.958300
+vn 0.000000 0.317100 0.948400
+vn -0.027300 0.348800 0.936800
+vn -0.054400 0.350700 0.934900
+vn -0.025300 0.379400 0.924800
+vn -0.050400 0.381200 0.923100
+vn 0.000000 0.348200 0.937400
+vn 0.000000 0.378900 0.925400
+vn -0.081200 0.353800 0.931800
+vn -0.075300 0.384100 0.920200
+vn 0.058300 0.319800 0.945700
+vn 0.029200 0.317800 0.947700
+vn 0.031200 0.286400 0.957600
+vn 0.062100 0.288600 0.955400
+vn 0.092700 0.292200 0.951800
+vn 0.087000 0.323200 0.942300
+vn 0.123100 0.297200 0.946800
+vn 0.115500 0.327900 0.937600
+vn 0.081200 0.353800 0.931800
+vn 0.054400 0.350700 0.934900
+vn 0.075300 0.384100 0.920200
+vn 0.050400 0.381200 0.923100
+vn 0.107800 0.358200 0.927400
+vn 0.100000 0.388200 0.916100
+vn 0.027300 0.348800 0.936800
+vn 0.025300 0.379400 0.924800
+vn 0.170800 0.341100 0.924300
+vn 0.143500 0.333900 0.931600
+vn 0.152900 0.303600 0.940400
+vn 0.182000 0.311300 0.932700
+vn 0.210300 0.320400 0.923600
+vn 0.197400 0.349600 0.915800
+vn 0.237800 0.330800 0.913200
+vn 0.223200 0.359400 0.906100
+vn 0.184200 0.378500 0.907000
+vn 0.159500 0.370600 0.915000
+vn 0.170900 0.407000 0.897300
+vn 0.147900 0.399700 0.904600
+vn 0.208300 0.387600 0.897900
+vn 0.193200 0.415500 0.888800
+vn 0.134000 0.363800 0.921800
+vn 0.124300 0.393400 0.910900
+vn 0.271700 0.382300 0.883100
+vn 0.248000 0.370300 0.895200
+vn 0.264300 0.342400 0.901600
+vn 0.289500 0.355200 0.888800
+vn 0.313500 0.369200 0.874900
+vn 0.294300 0.395400 0.870100
+vn 0.336300 0.384200 0.859800
+vn 0.315600 0.409600 0.855900
+vn 0.274700 0.421200 0.864300
+vn 0.253600 0.409000 0.876500
+vn 0.254800 0.446700 0.857600
+vn 0.235300 0.435300 0.869000
+vn 0.294600 0.434400 0.851100
+vn 0.273300 0.458900 0.845400
+vn 0.231500 0.397800 0.887800
+vn 0.214800 0.424900 0.879400
+vn 0.354100 0.440600 0.824900
+vn 0.335600 0.424700 0.840800
+vn 0.357600 0.400300 0.843700
+vn 0.377300 0.417300 0.826700
+vn 0.395400 0.435100 0.808900
+vn 0.371100 0.457400 0.808100
+vn 0.411800 0.453900 0.790200
+vn 0.386500 0.474900 0.790600
+vn 0.346400 0.479000 0.806500
+vn 0.330600 0.463400 0.822100
+vn 0.321300 0.500300 0.804000
+vn 0.306600 0.485800 0.818500
+vn 0.360900 0.495500 0.790100
+vn 0.334700 0.515500 0.788800
+vn 0.313300 0.448500 0.837000
+vn 0.290600 0.472000 0.832300
+vn 0.412400 0.511900 0.753500
+vn 0.400400 0.493200 0.772300
+vn 0.426600 0.473300 0.770700
+vn 0.439400 0.493300 0.750700
+vn 0.450300 0.513900 0.730200
+vn 0.422700 0.531200 0.734200
+vn 0.459400 0.535000 0.709000
+vn 0.431200 0.551000 0.714400
+vn 0.394500 0.548000 0.737500
+vn 0.385000 0.530000 0.755500
+vn 0.365900 0.564300 0.740000
+vn 0.357100 0.547600 0.756700
+vn 0.402500 0.566500 0.719000
+vn 0.373300 0.581400 0.722900
+vn 0.373700 0.512500 0.773100
+vn 0.346600 0.531300 0.773000
+vn 0.442500 0.591500 0.673900
+vn 0.437800 0.571200 0.694300
+vn 0.466400 0.556400 0.687600
+vn 0.471500 0.578100 0.665900
+vn 0.474500 0.600000 0.644100
+vn 0.445400 0.612000 0.653400
+vn 0.475600 0.622000 0.622000
+vn 0.446400 0.632700 0.632700
+vn 0.415800 0.623500 0.662100
+vn 0.413100 0.604300 0.681200
+vn 0.385600 0.634200 0.670100
+vn 0.383200 0.616500 0.687800
+vn 0.416700 0.642800 0.642800
+vn 0.386500 0.652200 0.652200
+vn 0.408700 0.585300 0.700200
+vn 0.379100 0.598900 0.705400
+vn 0.442500 0.673900 0.591500
+vn 0.445400 0.653400 0.612000
+vn 0.474500 0.644100 0.600000
+vn 0.471500 0.665900 0.578100
+vn 0.466400 0.687600 0.556400
+vn 0.437800 0.694300 0.571200
+vn 0.459400 0.709000 0.535000
+vn 0.431200 0.714400 0.551000
+vn 0.408700 0.700200 0.585300
+vn 0.413100 0.681200 0.604300
+vn 0.379100 0.705400 0.598900
+vn 0.383200 0.687800 0.616500
+vn 0.402500 0.719000 0.566500
+vn 0.373300 0.722900 0.581400
+vn 0.415800 0.662100 0.623500
+vn 0.385600 0.670100 0.634200
+vn 0.412400 0.753500 0.511900
+vn 0.422700 0.734200 0.531200
+vn 0.450300 0.730200 0.513900
+vn 0.439400 0.750700 0.493300
+vn 0.426600 0.770700 0.473300
+vn 0.400400 0.772300 0.493200
+vn 0.411800 0.790200 0.453900
+vn 0.386500 0.790600 0.474900
+vn 0.373700 0.773100 0.512500
+vn 0.385000 0.755500 0.530000
+vn 0.346600 0.773000 0.531300
+vn 0.357100 0.756700 0.547600
+vn 0.360900 0.790100 0.495500
+vn 0.334700 0.788800 0.515500
+vn 0.394500 0.737500 0.548000
+vn 0.365900 0.740000 0.564300
+vn 0.354100 0.824900 0.440600
+vn 0.371100 0.808100 0.457300
+vn 0.395400 0.808900 0.435100
+vn 0.377300 0.826700 0.417300
+vn 0.357600 0.843700 0.400300
+vn 0.335600 0.840800 0.424700
+vn 0.336300 0.859800 0.384200
+vn 0.315600 0.855900 0.409600
+vn 0.313300 0.837000 0.448600
+vn 0.330600 0.822100 0.463400
+vn 0.290600 0.832300 0.472000
+vn 0.306600 0.818500 0.485800
+vn 0.294600 0.851100 0.434400
+vn 0.273300 0.845400 0.458900
+vn 0.346400 0.806500 0.479000
+vn 0.321300 0.804000 0.500300
+vn 0.271700 0.883100 0.382300
+vn 0.294300 0.870100 0.395400
+vn 0.313500 0.874900 0.369200
+vn 0.289500 0.888800 0.355200
+vn 0.264300 0.901600 0.342400
+vn 0.248000 0.895100 0.370300
+vn 0.237800 0.913200 0.330800
+vn 0.223200 0.906100 0.359400
+vn 0.231500 0.887800 0.397800
+vn 0.253600 0.876500 0.409000
+vn 0.214800 0.879400 0.424900
+vn 0.235300 0.869000 0.435300
+vn 0.208300 0.897900 0.387600
+vn 0.193200 0.888800 0.415500
+vn 0.274700 0.864300 0.421200
+vn 0.254800 0.857600 0.446600
+vn 0.170800 0.924300 0.341100
+vn 0.197400 0.915800 0.349600
+vn 0.210300 0.923600 0.320400
+vn 0.182000 0.932700 0.311300
+vn 0.152900 0.940400 0.303600
+vn 0.143500 0.931600 0.333900
+vn 0.123100 0.946800 0.297200
+vn 0.115500 0.937600 0.327900
+vn 0.134000 0.921800 0.363800
+vn 0.159400 0.915000 0.370600
+vn 0.124300 0.910900 0.393400
+vn 0.147900 0.904600 0.399700
+vn 0.107800 0.927400 0.358200
+vn 0.100000 0.916100 0.388200
+vn 0.184200 0.907000 0.378500
+vn 0.170900 0.897300 0.407000
+vn 0.058300 0.945700 0.319800
+vn 0.087000 0.942300 0.323200
+vn 0.092700 0.951800 0.292200
+vn 0.062100 0.955400 0.288600
+vn 0.031200 0.957600 0.286400
+vn 0.029200 0.947700 0.317800
+vn 0.000000 0.958300 0.285700
+vn 0.000000 0.948400 0.317100
+vn 0.027300 0.936800 0.348800
+vn 0.054400 0.934900 0.350700
+vn 0.025300 0.924800 0.379400
+vn 0.050400 0.923100 0.381200
+vn 0.000000 0.937400 0.348200
+vn 0.000000 0.925400 0.378900
+vn 0.081200 0.931800 0.353800
+vn 0.075300 0.920200 0.384100
+vn -0.058300 0.945700 0.319800
+vn -0.029200 0.947700 0.317800
+vn -0.031200 0.957600 0.286400
+vn -0.062000 0.955400 0.288600
+vn -0.092700 0.951800 0.292200
+vn -0.087000 0.942300 0.323200
+vn -0.123100 0.946800 0.297200
+vn -0.115500 0.937600 0.327900
+vn -0.081200 0.931800 0.353800
+vn -0.054400 0.934900 0.350700
+vn -0.075300 0.920200 0.384100
+vn -0.050400 0.923100 0.381200
+vn -0.107800 0.927400 0.358200
+vn -0.100000 0.916100 0.388200
+vn -0.027300 0.936800 0.348800
+vn -0.025300 0.924800 0.379400
+vn -0.170800 0.924300 0.341100
+vn -0.143500 0.931600 0.333900
+vn -0.152900 0.940400 0.303600
+vn -0.182000 0.932700 0.311300
+vn -0.210300 0.923600 0.320400
+vn -0.197400 0.915800 0.349600
+vn -0.237800 0.913200 0.330800
+vn -0.223200 0.906100 0.359400
+vn -0.184200 0.907000 0.378500
+vn -0.159400 0.915000 0.370600
+vn -0.170900 0.897300 0.407000
+vn -0.147900 0.904600 0.399700
+vn -0.208300 0.897900 0.387600
+vn -0.193200 0.888800 0.415500
+vn -0.134000 0.921800 0.363800
+vn -0.124300 0.910900 0.393400
+vn -0.271700 0.883100 0.382300
+vn -0.248000 0.895100 0.370300
+vn -0.264300 0.901600 0.342400
+vn -0.289500 0.888800 0.355200
+vn -0.313500 0.874900 0.369200
+vn -0.294300 0.870100 0.395400
+vn -0.336300 0.859800 0.384200
+vn -0.315600 0.855900 0.409600
+vn -0.274700 0.864300 0.421200
+vn -0.253600 0.876500 0.409000
+vn -0.254800 0.857600 0.446600
+vn -0.235300 0.869000 0.435300
+vn -0.294600 0.851100 0.434400
+vn -0.273300 0.845400 0.458900
+vn -0.231500 0.887800 0.397800
+vn -0.214800 0.879400 0.424900
+vn -0.354100 0.824900 0.440600
+vn -0.335600 0.840800 0.424700
+vn -0.357600 0.843700 0.400300
+vn -0.377300 0.826700 0.417300
+vn -0.395400 0.808900 0.435100
+vn -0.371100 0.808100 0.457300
+vn -0.411800 0.790200 0.453900
+vn -0.386500 0.790600 0.474900
+vn -0.346400 0.806500 0.479000
+vn -0.330600 0.822100 0.463400
+vn -0.321300 0.804000 0.500300
+vn -0.306600 0.818500 0.485800
+vn -0.360900 0.790100 0.495500
+vn -0.334700 0.788800 0.515500
+vn -0.313300 0.837000 0.448600
+vn -0.290600 0.832300 0.472000
+vn -0.412400 0.753500 0.511900
+vn -0.400400 0.772300 0.493200
+vn -0.426600 0.770700 0.473300
+vn -0.439400 0.750700 0.493300
+vn -0.450300 0.730200 0.513900
+vn -0.422700 0.734200 0.531200
+vn -0.459400 0.709000 0.535000
+vn -0.431200 0.714400 0.551000
+vn -0.394500 0.737500 0.548000
+vn -0.385000 0.755500 0.530000
+vn -0.365900 0.740000 0.564300
+vn -0.357100 0.756700 0.547600
+vn -0.402500 0.719000 0.566500
+vn -0.373300 0.722900 0.581400
+vn -0.373700 0.773100 0.512500
+vn -0.346600 0.773000 0.531300
+vn -0.442500 0.673900 0.591500
+vn -0.437800 0.694300 0.571200
+vn -0.466400 0.687600 0.556400
+vn -0.471500 0.665900 0.578100
+vn -0.474500 0.644100 0.600000
+vn -0.445400 0.653400 0.612000
+vn -0.475600 0.622000 0.622000
+vn -0.446400 0.632700 0.632700
+vn -0.415800 0.662100 0.623500
+vn -0.413100 0.681200 0.604300
+vn -0.385600 0.670100 0.634200
+vn -0.383200 0.687800 0.616500
+vn -0.416700 0.642800 0.642800
+vn -0.386500 0.652200 0.652200
+vn -0.408700 0.700200 0.585300
+vn -0.379000 0.705400 0.598900
+vn -0.442500 0.591500 0.673900
+vn -0.445400 0.612000 0.653400
+vn -0.474500 0.600000 0.644100
+vn -0.471500 0.578100 0.665900
+vn -0.466400 0.556400 0.687600
+vn -0.437800 0.571200 0.694300
+vn -0.408700 0.585300 0.700200
+vn -0.413100 0.604300 0.681200
+vn -0.379100 0.598900 0.705400
+vn -0.383200 0.616500 0.687800
+vn -0.415800 0.623500 0.662100
+vn -0.385600 0.634200 0.670100
+vn -0.300100 0.580800 0.756600
+vn -0.307600 0.594900 0.742600
+vn -0.336900 0.579900 0.741700
+vn -0.328700 0.564500 0.757100
+vn -0.313800 0.609300 0.728200
+vn -0.343700 0.595700 0.725900
+vn -0.319200 0.549500 0.772100
+vn -0.291400 0.567200 0.770300
+vn -0.308100 0.535000 0.786600
+vn -0.281300 0.553900 0.783600
+vn -0.263200 0.584200 0.767700
+vn -0.271100 0.596500 0.755400
+vn -0.234700 0.600600 0.764300
+vn -0.241800 0.611600 0.753300
+vn -0.254100 0.572200 0.779700
+vn -0.226700 0.589900 0.775000
+vn -0.277900 0.609200 0.742700
+vn -0.283500 0.622200 0.729700
+vn -0.247800 0.622900 0.742000
+vn -0.252800 0.634500 0.730300
+vn -0.257700 0.528900 0.808600
+vn -0.270100 0.541100 0.796400
+vn -0.295800 0.521000 0.800600
+vn -0.282300 0.507600 0.814000
+vn -0.267600 0.494900 0.826700
+vn -0.244200 0.517300 0.820200
+vn -0.251600 0.482900 0.838700
+vn -0.229700 0.506300 0.831200
+vn -0.220600 0.539100 0.812800
+vn -0.232800 0.549600 0.802300
+vn -0.196800 0.560400 0.804500
+vn -0.207600 0.569800 0.795100
+vn -0.207500 0.529200 0.822700
+vn -0.185100 0.551600 0.813300
+vn -0.244000 0.560700 0.791300
+vn -0.217600 0.579600 0.785300
+vn -0.197700 0.486500 0.851000
+vn -0.214100 0.496000 0.841500
+vn -0.234600 0.471600 0.850000
+vn -0.216600 0.461200 0.860400
+vn -0.197700 0.451600 0.870000
+vn -0.180500 0.477800 0.859700
+vn -0.177900 0.442900 0.878700
+vn -0.162400 0.469800 0.867700
+vn -0.163100 0.503400 0.848500
+vn -0.178700 0.511300 0.840600
+vn -0.145400 0.528600 0.836300
+vn -0.159300 0.535600 0.829300
+vn -0.146700 0.496200 0.855700
+vn -0.130900 0.522200 0.842700
+vn -0.193500 0.519900 0.832000
+vn -0.172500 0.543300 0.821600
+vn -0.124300 0.456500 0.880900
+vn -0.143600 0.462700 0.874800
+vn -0.157300 0.435100 0.886500
+vn -0.136200 0.428300 0.893300
+vn -0.114400 0.422600 0.899100
+vn -0.104400 0.451200 0.886300
+vn -0.092100 0.417800 0.903900
+vn -0.084000 0.446900 0.890600
+vn -0.094400 0.479500 0.872500
+vn -0.112300 0.484200 0.867700
+vn -0.084100 0.507200 0.857700
+vn -0.100200 0.511500 0.853400
+vn -0.075900 0.475500 0.876400
+vn -0.067700 0.503700 0.861200
+vn -0.129700 0.489800 0.862100
+vn -0.115700 0.516400 0.848400
+vn -0.042400 0.441000 0.896500
+vn -0.063300 0.443500 0.894000
+vn -0.069400 0.414000 0.907600
+vn -0.046400 0.411300 0.910300
+vn -0.023300 0.409700 0.911900
+vn -0.021300 0.439500 0.897900
+vn 0.000000 0.409200 0.912400
+vn 0.000000 0.439000 0.898400
+vn -0.019200 0.468900 0.883000
+vn -0.038300 0.470200 0.881700
+vn -0.017200 0.497800 0.867100
+vn -0.034200 0.498900 0.865900
+vn 0.000000 0.468400 0.883500
+vn 0.000000 0.497400 0.867500
+vn -0.057200 0.472400 0.879500
+vn -0.051000 0.500900 0.864000
+vn 0.042400 0.441000 0.896500
+vn 0.021300 0.439500 0.897900
+vn 0.023300 0.409700 0.911900
+vn 0.046400 0.411300 0.910300
+vn 0.069400 0.414000 0.907600
+vn 0.063300 0.443500 0.894000
+vn 0.092100 0.417800 0.903900
+vn 0.084000 0.446900 0.890600
+vn 0.057200 0.472400 0.879500
+vn 0.038300 0.470200 0.881700
+vn 0.051000 0.500900 0.864000
+vn 0.034200 0.498900 0.865900
+vn 0.075900 0.475500 0.876400
+vn 0.067700 0.503700 0.861200
+vn 0.019200 0.468900 0.883000
+vn 0.017200 0.497800 0.867100
+vn 0.124300 0.456500 0.880900
+vn 0.104400 0.451200 0.886300
+vn 0.114400 0.422600 0.899100
+vn 0.136200 0.428300 0.893300
+vn 0.157300 0.435100 0.886500
+vn 0.143600 0.462700 0.874800
+vn 0.177900 0.442900 0.878700
+vn 0.162400 0.469800 0.867700
+vn 0.129800 0.489800 0.862100
+vn 0.112300 0.484200 0.867700
+vn 0.115700 0.516400 0.848400
+vn 0.100100 0.511500 0.853400
+vn 0.146700 0.496200 0.855700
+vn 0.130900 0.522200 0.842700
+vn 0.094400 0.479500 0.872500
+vn 0.084100 0.507200 0.857700
+vn 0.197700 0.486500 0.851000
+vn 0.180500 0.477800 0.859700
+vn 0.197700 0.451600 0.870000
+vn 0.216600 0.461200 0.860400
+vn 0.234600 0.471600 0.850000
+vn 0.214100 0.496000 0.841500
+vn 0.251600 0.482900 0.838700
+vn 0.229700 0.506300 0.831200
+vn 0.193500 0.519900 0.832000
+vn 0.178700 0.511300 0.840600
+vn 0.172500 0.543300 0.821600
+vn 0.159300 0.535600 0.829300
+vn 0.207500 0.529200 0.822700
+vn 0.185100 0.551600 0.813300
+vn 0.163100 0.503400 0.848500
+vn 0.145400 0.528600 0.836300
+vn 0.257700 0.528900 0.808600
+vn 0.244200 0.517300 0.820200
+vn 0.267600 0.494900 0.826700
+vn 0.282300 0.507600 0.814000
+vn 0.295800 0.521000 0.800600
+vn 0.270100 0.541100 0.796400
+vn 0.308100 0.535000 0.786600
+vn 0.281300 0.553900 0.783600
+vn 0.244000 0.560700 0.791300
+vn 0.232800 0.549600 0.802300
+vn 0.217600 0.579600 0.785300
+vn 0.207600 0.569800 0.795100
+vn 0.254100 0.572200 0.779700
+vn 0.226700 0.589900 0.775000
+vn 0.220600 0.539100 0.812800
+vn 0.196800 0.560400 0.804500
+vn 0.300100 0.580800 0.756600
+vn 0.291400 0.567200 0.770300
+vn 0.319200 0.549500 0.772100
+vn 0.328700 0.564500 0.757100
+vn 0.336900 0.579900 0.741700
+vn 0.307600 0.594900 0.742600
+vn 0.343700 0.595700 0.725900
+vn 0.313800 0.609300 0.728200
+vn 0.277900 0.609200 0.742700
+vn 0.271100 0.596500 0.755400
+vn 0.247800 0.622900 0.742000
+vn 0.241800 0.611600 0.753300
+vn 0.283500 0.622200 0.729700
+vn 0.252800 0.634500 0.730300
+vn 0.263200 0.584200 0.767700
+vn 0.234700 0.600600 0.764300
+vn 0.322100 0.638800 0.698700
+vn 0.318600 0.624000 0.713500
+vn 0.349000 0.611700 0.709900
+vn 0.352800 0.627900 0.693700
+vn 0.355100 0.644300 0.677300
+vn 0.324100 0.653700 0.683800
+vn 0.355800 0.660800 0.660800
+vn 0.324800 0.668800 0.668800
+vn 0.292800 0.662300 0.689600
+vn 0.291000 0.648900 0.703100
+vn 0.261100 0.670300 0.694600
+vn 0.259500 0.658300 0.706600
+vn 0.293500 0.676000 0.676000
+vn 0.261700 0.682400 0.682500
+vn 0.287800 0.635500 0.716400
+vn 0.256700 0.646400 0.718500
+vn 0.322100 0.698700 0.638800
+vn 0.324100 0.683800 0.653700
+vn 0.355100 0.677300 0.644300
+vn 0.352800 0.693700 0.627900
+vn 0.349000 0.709900 0.611700
+vn 0.318600 0.713500 0.624000
+vn 0.343700 0.725900 0.595700
+vn 0.313800 0.728200 0.609300
+vn 0.287800 0.716400 0.635500
+vn 0.290900 0.703100 0.648900
+vn 0.256700 0.718500 0.646400
+vn 0.259500 0.706600 0.658300
+vn 0.283500 0.729700 0.622200
+vn 0.252800 0.730300 0.634500
+vn 0.292800 0.689600 0.662300
+vn 0.261100 0.694600 0.670300
+vn 0.300100 0.756600 0.580800
+vn 0.307600 0.742600 0.594900
+vn 0.336900 0.741700 0.579900
+vn 0.328700 0.757100 0.564500
+vn 0.319200 0.772100 0.549500
+vn 0.291400 0.770300 0.567200
+vn 0.308100 0.786600 0.535000
+vn 0.281300 0.783600 0.553900
+vn 0.263200 0.767700 0.584200
+vn 0.271100 0.755400 0.596500
+vn 0.234700 0.764300 0.600600
+vn 0.241800 0.753300 0.611600
+vn 0.254100 0.779700 0.572200
+vn 0.226700 0.775000 0.589900
+vn 0.277900 0.742700 0.609200
+vn 0.247800 0.742000 0.622900
+vn 0.257700 0.808600 0.528900
+vn 0.270100 0.796400 0.541100
+vn 0.295800 0.800600 0.521000
+vn 0.282300 0.814000 0.507600
+vn 0.267600 0.826700 0.494900
+vn 0.244200 0.820200 0.517300
+vn 0.251600 0.838700 0.482900
+vn 0.229700 0.831200 0.506300
+vn 0.220600 0.812800 0.539100
+vn 0.232800 0.802300 0.549600
+vn 0.196800 0.804400 0.560400
+vn 0.207600 0.795100 0.569800
+vn 0.207500 0.822700 0.529200
+vn 0.185100 0.813300 0.551600
+vn 0.244000 0.791300 0.560700
+vn 0.217600 0.785300 0.579600
+vn 0.197700 0.851000 0.486500
+vn 0.214100 0.841500 0.496000
+vn 0.234600 0.850000 0.471600
+vn 0.216600 0.860400 0.461200
+vn 0.197700 0.870000 0.451600
+vn 0.180500 0.859700 0.477800
+vn 0.177900 0.878700 0.442900
+vn 0.162400 0.867700 0.469800
+vn 0.163100 0.848500 0.503400
+vn 0.178700 0.840600 0.511300
+vn 0.145400 0.836300 0.528600
+vn 0.159300 0.829300 0.535600
+vn 0.146700 0.855700 0.496200
+vn 0.130900 0.842700 0.522200
+vn 0.193500 0.832000 0.519900
+vn 0.172500 0.821600 0.543300
+vn 0.124300 0.880900 0.456500
+vn 0.143600 0.874800 0.462700
+vn 0.157300 0.886500 0.435100
+vn 0.136200 0.893300 0.428300
+vn 0.114400 0.899100 0.422500
+vn 0.104400 0.886300 0.451200
+vn 0.092100 0.903900 0.417800
+vn 0.084000 0.890600 0.446900
+vn 0.094400 0.872500 0.479400
+vn 0.112300 0.867700 0.484200
+vn 0.084100 0.857700 0.507200
+vn 0.100200 0.853400 0.511500
+vn 0.075900 0.876400 0.475500
+vn 0.067700 0.861200 0.503700
+vn 0.129800 0.862100 0.489800
+vn 0.115700 0.848400 0.516400
+vn 0.042400 0.896500 0.441000
+vn 0.063300 0.894000 0.443500
+vn 0.069400 0.907600 0.414000
+vn 0.046400 0.910300 0.411300
+vn 0.023300 0.911900 0.409700
+vn 0.021300 0.897900 0.439500
+vn 0.000000 0.912400 0.409200
+vn 0.000000 0.898400 0.439000
+vn 0.019200 0.883000 0.468900
+vn 0.038300 0.881700 0.470200
+vn 0.017200 0.867100 0.497800
+vn 0.034200 0.865900 0.498900
+vn 0.000000 0.883500 0.468400
+vn 0.000000 0.867500 0.497400
+vn 0.057200 0.879500 0.472400
+vn 0.051000 0.864000 0.500900
+vn -0.042400 0.896500 0.441000
+vn -0.021300 0.897900 0.439500
+vn -0.023300 0.911900 0.409700
+vn -0.046400 0.910300 0.411300
+vn -0.069400 0.907600 0.414000
+vn -0.063300 0.894000 0.443400
+vn -0.092100 0.903900 0.417800
+vn -0.084000 0.890600 0.446900
+vn -0.057200 0.879500 0.472400
+vn -0.038300 0.881700 0.470200
+vn -0.051000 0.864000 0.500900
+vn -0.034200 0.865900 0.498900
+vn -0.075900 0.876400 0.475500
+vn -0.067700 0.861200 0.503700
+vn -0.019200 0.883000 0.468900
+vn -0.017200 0.867100 0.497800
+vn -0.124300 0.880900 0.456500
+vn -0.104400 0.886200 0.451200
+vn -0.114400 0.899100 0.422600
+vn -0.136200 0.893300 0.428300
+vn -0.157300 0.886500 0.435100
+vn -0.143600 0.874800 0.462700
+vn -0.177900 0.878700 0.442900
+vn -0.162400 0.867700 0.469800
+vn -0.129800 0.862100 0.489800
+vn -0.112300 0.867700 0.484200
+vn -0.115700 0.848400 0.516400
+vn -0.100200 0.853400 0.511500
+vn -0.146700 0.855700 0.496200
+vn -0.130900 0.842700 0.522200
+vn -0.094400 0.872500 0.479500
+vn -0.084100 0.857700 0.507200
+vn -0.197700 0.851000 0.486500
+vn -0.180500 0.859700 0.477800
+vn -0.197700 0.870000 0.451600
+vn -0.216600 0.860400 0.461200
+vn -0.234600 0.850000 0.471600
+vn -0.214100 0.841500 0.496000
+vn -0.251600 0.838700 0.482900
+vn -0.229700 0.831200 0.506300
+vn -0.193500 0.832000 0.519900
+vn -0.178600 0.840600 0.511300
+vn -0.172500 0.821600 0.543300
+vn -0.159300 0.829300 0.535600
+vn -0.207500 0.822700 0.529200
+vn -0.185100 0.813300 0.551600
+vn -0.163100 0.848500 0.503400
+vn -0.145400 0.836300 0.528600
+vn -0.257700 0.808600 0.528900
+vn -0.244200 0.820200 0.517300
+vn -0.267600 0.826700 0.494900
+vn -0.282300 0.814000 0.507600
+vn -0.295800 0.800600 0.521000
+vn -0.270100 0.796400 0.541100
+vn -0.308100 0.786600 0.535000
+vn -0.281300 0.783600 0.553900
+vn -0.244000 0.791300 0.560600
+vn -0.232800 0.802300 0.549600
+vn -0.217600 0.785300 0.579600
+vn -0.207600 0.795100 0.569800
+vn -0.254100 0.779700 0.572200
+vn -0.226700 0.775000 0.589900
+vn -0.220600 0.812800 0.539100
+vn -0.196800 0.804400 0.560400
+vn -0.300100 0.756600 0.580800
+vn -0.291400 0.770300 0.567200
+vn -0.319200 0.772100 0.549500
+vn -0.328700 0.757100 0.564500
+vn -0.336900 0.741700 0.579900
+vn -0.307600 0.742600 0.594900
+vn -0.343700 0.725900 0.595700
+vn -0.313800 0.728200 0.609300
+vn -0.277900 0.742700 0.609200
+vn -0.271100 0.755400 0.596500
+vn -0.247800 0.742000 0.622900
+vn -0.241800 0.753300 0.611600
+vn -0.283500 0.729700 0.622200
+vn -0.252800 0.730300 0.634500
+vn -0.263200 0.767700 0.584200
+vn -0.234700 0.764300 0.600600
+vn -0.322100 0.698700 0.638800
+vn -0.318600 0.713500 0.624000
+vn -0.349000 0.709900 0.611700
+vn -0.352800 0.693700 0.627900
+vn -0.355100 0.677300 0.644300
+vn -0.324100 0.683800 0.653700
+vn -0.355800 0.660800 0.660800
+vn -0.324800 0.668800 0.668800
+vn -0.292800 0.689600 0.662300
+vn -0.290900 0.703100 0.648900
+vn -0.261100 0.694600 0.670300
+vn -0.259500 0.706600 0.658300
+vn -0.293500 0.676000 0.676000
+vn -0.261700 0.682400 0.682500
+vn -0.287800 0.716400 0.635500
+vn -0.256700 0.718500 0.646400
+vn -0.322100 0.638800 0.698700
+vn -0.324100 0.653700 0.683800
+vn -0.355100 0.644300 0.677300
+vn -0.352800 0.628000 0.693700
+vn -0.349000 0.611700 0.709900
+vn -0.318600 0.624000 0.713500
+vn -0.287800 0.635500 0.716400
+vn -0.290900 0.648900 0.703100
+vn -0.256700 0.646400 0.718500
+vn -0.259500 0.658300 0.706600
+vn -0.292800 0.662300 0.689600
+vn -0.261100 0.670300 0.694600
+vn -0.186300 0.638000 0.747200
+vn -0.191000 0.647700 0.737500
+vn -0.218600 0.635700 0.740300
+vn -0.213300 0.625500 0.750500
+vn -0.194100 0.655900 0.729500
+vn -0.222800 0.645800 0.730200
+vn -0.206900 0.615700 0.760300
+vn -0.180000 0.628800 0.756400
+vn -0.199800 0.606400 0.769600
+vn -0.174000 0.621600 0.763700
+vn -0.152500 0.640300 0.752800
+vn -0.159600 0.649700 0.743200
+vn -0.123100 0.651100 0.748900
+vn -0.131700 0.661300 0.738500
+vn -0.148100 0.636200 0.757200
+vn -0.120700 0.650900 0.749500
+vn -0.164000 0.660100 0.733100
+vn -0.165200 0.665400 0.728000
+vn -0.135900 0.673100 0.727000
+vn -0.134600 0.674700 0.725700
+vn -0.160000 0.605700 0.779400
+vn -0.168100 0.614300 0.770900
+vn -0.192000 0.597400 0.778600
+vn -0.183200 0.588600 0.787400
+vn -0.173400 0.580300 0.795700
+vn -0.150500 0.598000 0.787200
+vn -0.163100 0.572600 0.803400
+vn -0.142100 0.592200 0.793100
+vn -0.126700 0.614300 0.778800
+vn -0.137000 0.622100 0.770800
+vn -0.101000 0.630200 0.769800
+vn -0.113100 0.638500 0.761300
+vn -0.120900 0.611100 0.782200
+vn -0.098500 0.630500 0.769900
+vn -0.145100 0.631300 0.761800
+vn -0.121400 0.649100 0.750900
+vn -0.122800 0.579400 0.805700
+vn -0.133700 0.586200 0.799000
+vn -0.152300 0.565400 0.810600
+vn -0.140500 0.558400 0.817500
+vn -0.128100 0.552200 0.823800
+vn -0.110800 0.573700 0.811500
+vn -0.115400 0.546700 0.829300
+vn -0.100500 0.569600 0.815700
+vn -0.092300 0.594000 0.799200
+vn -0.105100 0.599600 0.793400
+vn -0.072000 0.614200 0.785900
+vn -0.086800 0.619900 0.779900
+vn -0.085500 0.591900 0.801400
+vn -0.069700 0.614900 0.785500
+vn -0.116200 0.607000 0.786200
+vn -0.098600 0.628600 0.771400
+vn -0.077200 0.560800 0.824300
+vn -0.090200 0.565300 0.819900
+vn -0.102200 0.541700 0.834300
+vn -0.088400 0.537100 0.838800
+vn -0.074000 0.533400 0.842600
+vn -0.063500 0.557500 0.827700
+vn -0.059700 0.530400 0.845600
+vn -0.052000 0.555400 0.829900
+vn -0.051600 0.580600 0.812600
+vn -0.066100 0.583600 0.809300
+vn -0.038100 0.603900 0.796100
+vn -0.054600 0.606700 0.793000
+vn -0.044300 0.579800 0.813500
+vn -0.036100 0.605000 0.795400
+vn -0.079500 0.588700 0.804400
+vn -0.069200 0.613000 0.787000
+vn -0.026300 0.551200 0.833900
+vn -0.040500 0.553200 0.832100
+vn -0.045200 0.527900 0.848000
+vn -0.030100 0.526100 0.849900
+vn -0.014900 0.525100 0.850900
+vn -0.011900 0.550500 0.834700
+vn 0.000000 0.524900 0.851200
+vn 0.000000 0.550600 0.834800
+vn -0.007400 0.575100 0.818000
+vn -0.022500 0.575400 0.817600
+vn -0.001600 0.600200 0.799800
+vn -0.018600 0.599900 0.799800
+vn 0.000000 0.575700 0.817700
+vn 0.000000 0.601600 0.798700
+vn -0.037300 0.577900 0.815200
+vn -0.034900 0.603300 0.796700
+vn 0.026300 0.551200 0.833900
+vn 0.011900 0.550500 0.834700
+vn 0.014900 0.525100 0.850900
+vn 0.030100 0.526100 0.849800
+vn 0.045200 0.527900 0.848000
+vn 0.040500 0.553100 0.832100
+vn 0.059700 0.530400 0.845600
+vn 0.052000 0.555400 0.829900
+vn 0.037300 0.577900 0.815200
+vn 0.022500 0.575400 0.817600
+vn 0.034900 0.603300 0.796700
+vn 0.018600 0.599900 0.799800
+vn 0.044300 0.579800 0.813500
+vn 0.036100 0.605000 0.795400
+vn 0.007400 0.575100 0.818000
+vn 0.001600 0.600200 0.799800
+vn 0.077200 0.560800 0.824300
+vn 0.063500 0.557500 0.827700
+vn 0.074000 0.533400 0.842600
+vn 0.088400 0.537100 0.838800
+vn 0.102300 0.541700 0.834300
+vn 0.090200 0.565300 0.819900
+vn 0.115400 0.546700 0.829300
+vn 0.100500 0.569600 0.815700
+vn 0.079500 0.588700 0.804400
+vn 0.066100 0.583600 0.809300
+vn 0.069200 0.613000 0.787000
+vn 0.054600 0.606700 0.793000
+vn 0.085500 0.591900 0.801400
+vn 0.069700 0.614900 0.785500
+vn 0.051600 0.580600 0.812600
+vn 0.038100 0.603900 0.796100
+vn 0.122800 0.579400 0.805700
+vn 0.110800 0.573700 0.811500
+vn 0.128100 0.552200 0.823800
+vn 0.140600 0.558400 0.817500
+vn 0.152300 0.565400 0.810600
+vn 0.133700 0.586200 0.799000
+vn 0.163100 0.572600 0.803400
+vn 0.142100 0.592200 0.793100
+vn 0.116200 0.607000 0.786200
+vn 0.105100 0.599600 0.793400
+vn 0.098600 0.628600 0.771400
+vn 0.086800 0.619900 0.779900
+vn 0.120900 0.611100 0.782200
+vn 0.098500 0.630500 0.769900
+vn 0.092300 0.594000 0.799200
+vn 0.072000 0.614200 0.785900
+vn 0.160000 0.605700 0.779400
+vn 0.150500 0.598000 0.787200
+vn 0.173400 0.580300 0.795700
+vn 0.183200 0.588600 0.787400
+vn 0.192000 0.597400 0.778600
+vn 0.168100 0.614300 0.770900
+vn 0.199800 0.606400 0.769600
+vn 0.174000 0.621600 0.763700
+vn 0.145100 0.631300 0.761800
+vn 0.137000 0.622100 0.770800
+vn 0.121400 0.649100 0.750900
+vn 0.113100 0.638500 0.761300
+vn 0.148100 0.636200 0.757200
+vn 0.120700 0.650900 0.749500
+vn 0.126700 0.614400 0.778800
+vn 0.101000 0.630200 0.769800
+vn 0.186300 0.638000 0.747100
+vn 0.180000 0.628800 0.756400
+vn 0.206900 0.615700 0.760300
+vn 0.213300 0.625500 0.750500
+vn 0.218600 0.635700 0.740300
+vn 0.191000 0.647700 0.737500
+vn 0.222800 0.645800 0.730200
+vn 0.194100 0.655900 0.729500
+vn 0.164000 0.660100 0.733100
+vn 0.159600 0.649700 0.743200
+vn 0.135900 0.673100 0.727000
+vn 0.131700 0.661300 0.738500
+vn 0.165200 0.665400 0.728000
+vn 0.134600 0.674700 0.725700
+vn 0.152500 0.640300 0.752800
+vn 0.123100 0.651100 0.748900
+vn 0.200000 0.673900 0.711200
+vn 0.197200 0.663900 0.721300
+vn 0.226300 0.656000 0.720000
+vn 0.228900 0.666700 0.709300
+vn 0.230300 0.677400 0.698500
+vn 0.201000 0.684200 0.701000
+vn 0.230700 0.688000 0.688000
+vn 0.200900 0.692600 0.692700
+vn 0.171800 0.691300 0.701800
+vn 0.171200 0.680500 0.712400
+vn 0.141100 0.698800 0.701200
+vn 0.141400 0.686700 0.713000
+vn 0.171100 0.696600 0.696700
+vn 0.139300 0.700200 0.700200
+vn 0.167900 0.670200 0.723000
+vn 0.136800 0.675300 0.724700
+vn 0.200000 0.711200 0.673900
+vn 0.201000 0.701000 0.684200
+vn 0.230300 0.698500 0.677400
+vn 0.228900 0.709300 0.666700
+vn 0.226300 0.720000 0.656000
+vn 0.197200 0.721300 0.663900
+vn 0.222800 0.730200 0.645800
+vn 0.194100 0.729500 0.655900
+vn 0.167900 0.723000 0.670200
+vn 0.171200 0.712400 0.680500
+vn 0.136800 0.724700 0.675300
+vn 0.141400 0.713000 0.686700
+vn 0.165200 0.728000 0.665400
+vn 0.134600 0.725700 0.674700
+vn 0.171800 0.701800 0.691300
+vn 0.141100 0.701200 0.698800
+vn 0.186300 0.747200 0.638000
+vn 0.191000 0.737500 0.647700
+vn 0.218600 0.740300 0.635700
+vn 0.213300 0.750500 0.625500
+vn 0.206900 0.760300 0.615700
+vn 0.180000 0.756400 0.628800
+vn 0.199800 0.769600 0.606400
+vn 0.174000 0.763700 0.621600
+vn 0.152500 0.752800 0.640300
+vn 0.159600 0.743200 0.649700
+vn 0.123100 0.748900 0.651100
+vn 0.131700 0.738500 0.661300
+vn 0.148100 0.757200 0.636200
+vn 0.120700 0.749500 0.650900
+vn 0.164000 0.733100 0.660100
+vn 0.135900 0.727000 0.673100
+vn 0.160000 0.779400 0.605700
+vn 0.168100 0.771000 0.614300
+vn 0.192000 0.778600 0.597400
+vn 0.183200 0.787400 0.588600
+vn 0.173400 0.795700 0.580300
+vn 0.150500 0.787200 0.598100
+vn 0.163100 0.803400 0.572600
+vn 0.142100 0.793100 0.592200
+vn 0.126700 0.778800 0.614400
+vn 0.137000 0.770800 0.622100
+vn 0.101000 0.769800 0.630300
+vn 0.113100 0.761300 0.638500
+vn 0.121000 0.782200 0.611100
+vn 0.098500 0.769900 0.630500
+vn 0.145100 0.761800 0.631300
+vn 0.121400 0.750900 0.649100
+vn 0.122800 0.805700 0.579400
+vn 0.133700 0.799000 0.586200
+vn 0.152300 0.810600 0.565400
+vn 0.140500 0.817500 0.558400
+vn 0.128100 0.823800 0.552200
+vn 0.110800 0.811500 0.573700
+vn 0.115400 0.829300 0.546700
+vn 0.100500 0.815700 0.569600
+vn 0.092300 0.799200 0.594000
+vn 0.105100 0.793400 0.599600
+vn 0.072000 0.785900 0.614200
+vn 0.086800 0.779900 0.619900
+vn 0.085500 0.801400 0.591900
+vn 0.069700 0.785500 0.614900
+vn 0.116200 0.786200 0.607000
+vn 0.098600 0.771400 0.628600
+vn 0.077200 0.824300 0.560800
+vn 0.090200 0.819900 0.565300
+vn 0.102300 0.834300 0.541700
+vn 0.088400 0.838800 0.537100
+vn 0.074000 0.842600 0.533400
+vn 0.063500 0.827700 0.557500
+vn 0.059700 0.845600 0.530400
+vn 0.052000 0.829900 0.555400
+vn 0.051600 0.812600 0.580600
+vn 0.066100 0.809300 0.583600
+vn 0.038100 0.796100 0.603900
+vn 0.054500 0.793000 0.606700
+vn 0.044300 0.813500 0.579800
+vn 0.036000 0.795400 0.605000
+vn 0.079500 0.804400 0.588700
+vn 0.069200 0.787000 0.613000
+vn 0.026300 0.833900 0.551200
+vn 0.040500 0.832100 0.553100
+vn 0.045200 0.848000 0.527900
+vn 0.030100 0.849900 0.526100
+vn 0.014900 0.850900 0.525100
+vn 0.011800 0.834700 0.550500
+vn 0.000000 0.851200 0.524900
+vn 0.000000 0.834800 0.550600
+vn 0.007400 0.818000 0.575100
+vn 0.022500 0.817600 0.575400
+vn 0.001600 0.799800 0.600200
+vn 0.018600 0.799800 0.599900
+vn 0.000000 0.817700 0.575700
+vn 0.000000 0.798700 0.601600
+vn 0.037300 0.815200 0.577900
+vn 0.034900 0.796700 0.603300
+vn -0.026300 0.833900 0.551200
+vn -0.011900 0.834700 0.550500
+vn -0.014900 0.850900 0.525100
+vn -0.030100 0.849900 0.526100
+vn -0.045200 0.848000 0.527900
+vn -0.040500 0.832100 0.553200
+vn -0.059700 0.845600 0.530400
+vn -0.052000 0.829900 0.555400
+vn -0.037300 0.815200 0.577900
+vn -0.022500 0.817600 0.575400
+vn -0.034900 0.796700 0.603300
+vn -0.018600 0.799800 0.599900
+vn -0.044300 0.813500 0.579800
+vn -0.036000 0.795400 0.605000
+vn -0.007400 0.818000 0.575100
+vn -0.001600 0.799800 0.600200
+vn -0.077200 0.824300 0.560800
+vn -0.063500 0.827700 0.557500
+vn -0.074000 0.842600 0.533400
+vn -0.088400 0.838800 0.537100
+vn -0.102300 0.834300 0.541700
+vn -0.090200 0.819900 0.565300
+vn -0.115400 0.829300 0.546700
+vn -0.100500 0.815700 0.569600
+vn -0.079500 0.804400 0.588700
+vn -0.066100 0.809300 0.583600
+vn -0.069200 0.787000 0.613000
+vn -0.054600 0.793000 0.606700
+vn -0.085500 0.801400 0.591900
+vn -0.069700 0.785500 0.614900
+vn -0.051600 0.812600 0.580600
+vn -0.038100 0.796100 0.603900
+vn -0.122800 0.805700 0.579400
+vn -0.110800 0.811500 0.573700
+vn -0.128100 0.823800 0.552200
+vn -0.140500 0.817500 0.558400
+vn -0.152300 0.810600 0.565400
+vn -0.133700 0.799000 0.586200
+vn -0.163200 0.803400 0.572600
+vn -0.142100 0.793100 0.592200
+vn -0.116200 0.786200 0.607000
+vn -0.105100 0.793400 0.599600
+vn -0.098600 0.771400 0.628600
+vn -0.086800 0.779800 0.619900
+vn -0.121000 0.782200 0.611100
+vn -0.098500 0.769900 0.630500
+vn -0.092300 0.799200 0.594000
+vn -0.072000 0.785900 0.614200
+vn -0.160000 0.779400 0.605700
+vn -0.150500 0.787200 0.598100
+vn -0.173400 0.795700 0.580300
+vn -0.183200 0.787400 0.588600
+vn -0.192000 0.778600 0.597400
+vn -0.168100 0.771000 0.614300
+vn -0.199800 0.769600 0.606400
+vn -0.174000 0.763700 0.621600
+vn -0.145100 0.761800 0.631300
+vn -0.137000 0.770800 0.622100
+vn -0.121400 0.750900 0.649100
+vn -0.113100 0.761300 0.638500
+vn -0.148100 0.757200 0.636200
+vn -0.120700 0.749500 0.650900
+vn -0.126700 0.778800 0.614400
+vn -0.101000 0.769800 0.630200
+vn -0.186300 0.747100 0.638000
+vn -0.180000 0.756400 0.628800
+vn -0.206900 0.760300 0.615700
+vn -0.213300 0.750500 0.625500
+vn -0.218600 0.740300 0.635700
+vn -0.191000 0.737500 0.647700
+vn -0.222800 0.730200 0.645800
+vn -0.194100 0.729500 0.655900
+vn -0.164000 0.733100 0.660100
+vn -0.159600 0.743200 0.649700
+vn -0.135900 0.727000 0.673100
+vn -0.131700 0.738500 0.661300
+vn -0.165200 0.728000 0.665400
+vn -0.134600 0.725700 0.674700
+vn -0.152500 0.752800 0.640300
+vn -0.123100 0.748900 0.651100
+vn -0.200000 0.711200 0.673900
+vn -0.197200 0.721300 0.663900
+vn -0.226300 0.720000 0.656000
+vn -0.228900 0.709300 0.666700
+vn -0.230300 0.698500 0.677400
+vn -0.201000 0.701000 0.684200
+vn -0.230700 0.688000 0.688000
+vn -0.200900 0.692600 0.692700
+vn -0.171800 0.701800 0.691300
+vn -0.171200 0.712400 0.680500
+vn -0.141100 0.701200 0.698800
+vn -0.141400 0.713000 0.686700
+vn -0.171100 0.696600 0.696700
+vn -0.139300 0.700200 0.700200
+vn -0.167900 0.723000 0.670200
+vn -0.136800 0.724700 0.675300
+vn -0.200000 0.673900 0.711200
+vn -0.201000 0.684200 0.701000
+vn -0.230300 0.677400 0.698500
+vn -0.228900 0.666700 0.709300
+vn -0.226300 0.656000 0.720000
+vn -0.197200 0.663900 0.721300
+vn -0.167900 0.670200 0.723000
+vn -0.171200 0.680500 0.712400
+vn -0.136800 0.675300 0.724700
+vn -0.141400 0.686700 0.713000
+vn -0.171800 0.691300 0.701800
+vn -0.141100 0.698800 0.701200
+vn -0.086300 -0.729300 -0.678700
+vn -0.071400 -0.734800 -0.674500
+vn -0.093800 -0.744300 -0.661200
+vn -0.104600 -0.733200 -0.671900
+vn -0.067300 -0.732400 -0.677400
+vn -0.092800 -0.740900 -0.665100
+vn -0.107900 -0.720300 -0.685200
+vn -0.080600 -0.719000 -0.690300
+vn -0.103500 -0.722600 -0.683400
+vn -0.075100 -0.719200 -0.690700
+vn -0.061400 -0.723500 -0.687500
+vn -0.048800 -0.725900 -0.686000
+vn -0.054400 -0.716300 -0.695700
+vn -0.074100 -0.744200 -0.663800
+vn -0.057900 -0.746800 -0.662500
+vn -0.075400 -0.760000 -0.645500
+vn -0.089800 -0.751300 -0.653800
+vn -0.055000 -0.743800 -0.666100
+vn -0.075800 -0.756600 -0.649400
+vn -0.097800 -0.739400 -0.666100
+vn -0.072600 -0.733300 -0.676000
+vn -0.052700 -0.734200 -0.676900
+vn -0.039800 -0.734200 -0.677800
+vn -0.056900 -0.756400 -0.651600
+vn -0.040500 -0.756000 -0.653300
+vn -0.051900 -0.771900 -0.633600
+vn -0.068900 -0.766000 -0.639100
+vn -0.038900 -0.752600 -0.657300
+vn -0.053600 -0.768700 -0.637300
+vn -0.081000 -0.756100 -0.649400
+vn -0.059700 -0.745600 -0.663700
+vn -0.040500 -0.742800 -0.668200
+vn -0.028200 -0.740500 -0.671500
+vn -0.035700 -0.765000 -0.643000
+vn -0.020300 -0.761700 -0.647600
+vn -0.024800 -0.779000 -0.626500
+vn -0.043300 -0.776500 -0.628600
+vn -0.020100 -0.758100 -0.651800
+vn -0.027700 -0.776200 -0.629800
+vn -0.058700 -0.769100 -0.636400
+vn -0.042600 -0.755100 -0.654200
+vn -0.025400 -0.749000 -0.662100
+vn -0.014600 -0.744500 -0.667500
+vn -0.012200 -0.769500 -0.638500
+vn 0.001200 -0.763500 -0.645800
+vn 0.003900 -0.781000 -0.624500
+vn -0.014800 -0.781900 -0.623200
+vn 0.000000 -0.759900 -0.650000
+vn 0.000000 -0.778800 -0.627200
+vn -0.032400 -0.777600 -0.627900
+vn -0.022700 -0.761200 -0.648100
+vn -0.008700 -0.752200 -0.658900
+vn 0.000000 -0.745800 -0.666100
+vn 0.012200 -0.769500 -0.638500
+vn 0.022700 -0.761200 -0.648100
+vn 0.032400 -0.777600 -0.627900
+vn 0.014700 -0.781900 -0.623200
+vn 0.020100 -0.758100 -0.651800
+vn 0.027700 -0.776200 -0.629800
+vn -0.003900 -0.781000 -0.624500
+vn -0.001200 -0.763500 -0.645800
+vn 0.008700 -0.752200 -0.658900
+vn 0.014600 -0.744500 -0.667500
+vn 0.035700 -0.765000 -0.643000
+vn 0.042600 -0.755100 -0.654200
+vn 0.058700 -0.769100 -0.636400
+vn 0.043300 -0.776500 -0.628600
+vn 0.038900 -0.752600 -0.657300
+vn 0.053600 -0.768700 -0.637300
+vn 0.024800 -0.779000 -0.626500
+vn 0.020300 -0.761700 -0.647600
+vn 0.025400 -0.749000 -0.662100
+vn 0.028200 -0.740500 -0.671500
+vn 0.056800 -0.756400 -0.651600
+vn 0.059600 -0.745600 -0.663700
+vn 0.081000 -0.756100 -0.649400
+vn 0.068900 -0.766000 -0.639100
+vn 0.055000 -0.743800 -0.666100
+vn 0.075800 -0.756600 -0.649400
+vn 0.051900 -0.771900 -0.633600
+vn 0.040500 -0.756000 -0.653300
+vn 0.040500 -0.742800 -0.668200
+vn 0.039800 -0.734200 -0.677800
+vn 0.074100 -0.744200 -0.663800
+vn 0.072600 -0.733300 -0.676000
+vn 0.097800 -0.739400 -0.666100
+vn 0.089800 -0.751300 -0.653800
+vn 0.067300 -0.732400 -0.677400
+vn 0.092800 -0.740900 -0.665100
+vn 0.075400 -0.760000 -0.645500
+vn 0.057900 -0.746800 -0.662500
+vn 0.052700 -0.734200 -0.676900
+vn 0.048800 -0.725900 -0.686100
+vn 0.086300 -0.729300 -0.678700
+vn 0.080600 -0.719000 -0.690300
+vn 0.107900 -0.720300 -0.685200
+vn 0.104600 -0.733200 -0.671900
+vn 0.075100 -0.719200 -0.690700
+vn 0.103500 -0.722600 -0.683400
+vn 0.093800 -0.744300 -0.661200
+vn 0.071400 -0.734800 -0.674500
+vn 0.061400 -0.723500 -0.687500
+vn 0.054400 -0.716300 -0.695600
+vn 0.092600 -0.712600 -0.695400
+vn 0.083100 -0.703800 -0.705500
+vn 0.110600 -0.699900 -0.705600
+vn 0.112200 -0.713000 -0.692100
+vn 0.077800 -0.704900 -0.704900
+vn 0.107200 -0.703000 -0.703000
+vn 0.105800 -0.725700 -0.679800
+vn 0.080000 -0.720700 -0.688600
+vn 0.065900 -0.711700 -0.699400
+vn 0.056300 -0.706000 -0.706000
+vn 0.092600 -0.695400 -0.712600
+vn 0.080000 -0.688600 -0.720700
+vn 0.105800 -0.679800 -0.725700
+vn 0.112200 -0.692100 -0.713000
+vn 0.075100 -0.690700 -0.719200
+vn 0.103500 -0.683400 -0.722600
+vn 0.110600 -0.705600 -0.699900
+vn 0.083100 -0.705500 -0.703800
+vn 0.065900 -0.699400 -0.711700
+vn 0.054400 -0.695600 -0.716300
+vn 0.086300 -0.678700 -0.729300
+vn 0.071400 -0.674500 -0.734800
+vn 0.093800 -0.661200 -0.744300
+vn 0.104600 -0.671900 -0.733200
+vn 0.067300 -0.677400 -0.732400
+vn 0.092800 -0.665100 -0.740900
+vn 0.107900 -0.685200 -0.720300
+vn 0.080600 -0.690300 -0.719000
+vn 0.061400 -0.687500 -0.723500
+vn 0.048800 -0.686100 -0.725900
+vn 0.074100 -0.663800 -0.744200
+vn 0.057900 -0.662500 -0.746800
+vn 0.075400 -0.645500 -0.760000
+vn 0.089800 -0.653800 -0.751300
+vn 0.055000 -0.666100 -0.743800
+vn 0.075800 -0.649400 -0.756600
+vn 0.097800 -0.666100 -0.739400
+vn 0.072600 -0.676000 -0.733300
+vn 0.052700 -0.676900 -0.734200
+vn 0.039800 -0.677800 -0.734200
+vn 0.056800 -0.651600 -0.756400
+vn 0.040500 -0.653300 -0.756000
+vn 0.051900 -0.633600 -0.771900
+vn 0.068900 -0.639100 -0.766000
+vn 0.038900 -0.657300 -0.752600
+vn 0.053600 -0.637300 -0.768700
+vn 0.081000 -0.649400 -0.756100
+vn 0.059700 -0.663700 -0.745600
+vn 0.040500 -0.668200 -0.742800
+vn 0.028200 -0.671500 -0.740500
+vn 0.035700 -0.643000 -0.765000
+vn 0.020300 -0.647600 -0.761700
+vn 0.024800 -0.626500 -0.779000
+vn 0.043300 -0.628600 -0.776500
+vn 0.020100 -0.651800 -0.758100
+vn 0.027700 -0.629800 -0.776200
+vn 0.058700 -0.636400 -0.769100
+vn 0.042600 -0.654200 -0.755100
+vn 0.025400 -0.662100 -0.749000
+vn 0.014600 -0.667500 -0.744500
+vn 0.012200 -0.638500 -0.769500
+vn -0.001200 -0.645800 -0.763500
+vn -0.003900 -0.624500 -0.781000
+vn 0.014800 -0.623200 -0.781900
+vn 0.000000 -0.650000 -0.759900
+vn 0.000000 -0.627200 -0.778800
+vn 0.032400 -0.627900 -0.777600
+vn 0.022700 -0.648100 -0.761200
+vn 0.008700 -0.658900 -0.752200
+vn 0.000000 -0.666100 -0.745800
+vn -0.012200 -0.638500 -0.769500
+vn -0.022700 -0.648100 -0.761200
+vn -0.032400 -0.627900 -0.777600
+vn -0.014800 -0.623200 -0.781900
+vn -0.020100 -0.651800 -0.758100
+vn -0.027700 -0.629800 -0.776200
+vn 0.003900 -0.624500 -0.781000
+vn 0.001200 -0.645800 -0.763500
+vn -0.008700 -0.658900 -0.752200
+vn -0.014600 -0.667500 -0.744500
+vn -0.035700 -0.643000 -0.765000
+vn -0.042600 -0.654200 -0.755100
+vn -0.058700 -0.636400 -0.769100
+vn -0.043300 -0.628600 -0.776500
+vn -0.038900 -0.657300 -0.752600
+vn -0.053600 -0.637300 -0.768700
+vn -0.024800 -0.626500 -0.779000
+vn -0.020300 -0.647600 -0.761700
+vn -0.025500 -0.662100 -0.749000
+vn -0.028200 -0.671500 -0.740500
+vn -0.056800 -0.651600 -0.756400
+vn -0.059600 -0.663700 -0.745600
+vn -0.081000 -0.649400 -0.756100
+vn -0.068900 -0.639100 -0.766000
+vn -0.055000 -0.666100 -0.743800
+vn -0.075800 -0.649400 -0.756600
+vn -0.051900 -0.633600 -0.771900
+vn -0.040500 -0.653300 -0.756000
+vn -0.040500 -0.668200 -0.742800
+vn -0.039800 -0.677800 -0.734200
+vn -0.074100 -0.663800 -0.744200
+vn -0.072600 -0.676000 -0.733300
+vn -0.097800 -0.666100 -0.739400
+vn -0.089800 -0.653800 -0.751300
+vn -0.067300 -0.677400 -0.732400
+vn -0.092800 -0.665100 -0.740900
+vn -0.075400 -0.645500 -0.760000
+vn -0.057900 -0.662500 -0.746800
+vn -0.052700 -0.676900 -0.734200
+vn -0.048800 -0.686100 -0.725900
+vn -0.086300 -0.678700 -0.729300
+vn -0.080600 -0.690300 -0.719000
+vn -0.107900 -0.685200 -0.720300
+vn -0.104600 -0.671900 -0.733200
+vn -0.075100 -0.690700 -0.719200
+vn -0.103500 -0.683400 -0.722600
+vn -0.093800 -0.661200 -0.744300
+vn -0.071400 -0.674500 -0.734800
+vn -0.061400 -0.687500 -0.723500
+vn -0.054400 -0.695700 -0.716300
+vn -0.092600 -0.695400 -0.712600
+vn -0.083100 -0.705500 -0.703800
+vn -0.110600 -0.705600 -0.699900
+vn -0.112200 -0.692100 -0.713000
+vn -0.077800 -0.704900 -0.704900
+vn -0.107200 -0.703000 -0.703000
+vn -0.105800 -0.679800 -0.725700
+vn -0.080000 -0.688600 -0.720700
+vn -0.065900 -0.699400 -0.711700
+vn -0.056300 -0.706000 -0.706000
+vn -0.092600 -0.712600 -0.695400
+vn -0.080000 -0.720700 -0.688600
+vn -0.105800 -0.725700 -0.679800
+vn -0.112200 -0.713000 -0.692100
+vn -0.110600 -0.699900 -0.705600
+vn -0.083100 -0.703800 -0.705500
+vn -0.065900 -0.711700 -0.699400
+vn -0.086300 0.678700 0.729300
+vn -0.080600 0.690300 0.719000
+vn -0.107900 0.685200 0.720300
+vn -0.104600 0.671900 0.733200
+vn -0.075100 0.690700 0.719200
+vn -0.103500 0.683400 0.722600
+vn -0.093800 0.661200 0.744300
+vn -0.071400 0.674500 0.734800
+vn -0.092800 0.665100 0.740900
+vn -0.067300 0.677400 0.732400
+vn -0.061400 0.687500 0.723500
+vn -0.054400 0.695600 0.716300
+vn -0.048800 0.686000 0.725900
+vn -0.074100 0.663800 0.744200
+vn -0.072600 0.676000 0.733300
+vn -0.097800 0.666100 0.739400
+vn -0.089800 0.653800 0.751300
+vn -0.075400 0.645500 0.760000
+vn -0.057900 0.662500 0.746800
+vn -0.075800 0.649400 0.756600
+vn -0.055000 0.666100 0.743800
+vn -0.052700 0.676900 0.734200
+vn -0.039800 0.677800 0.734200
+vn -0.056800 0.651600 0.756400
+vn -0.059600 0.663700 0.745600
+vn -0.081000 0.649400 0.756100
+vn -0.068900 0.639100 0.766000
+vn -0.051900 0.633600 0.771900
+vn -0.040500 0.653300 0.756000
+vn -0.053600 0.637300 0.768700
+vn -0.038900 0.657300 0.752600
+vn -0.040500 0.668200 0.742900
+vn -0.028200 0.671400 0.740500
+vn -0.035700 0.643000 0.765000
+vn -0.042600 0.654200 0.755100
+vn -0.058700 0.636400 0.769100
+vn -0.043300 0.628600 0.776500
+vn -0.024800 0.626500 0.779000
+vn -0.020300 0.647600 0.761700
+vn -0.027700 0.629800 0.776200
+vn -0.020100 0.651800 0.758000
+vn -0.025400 0.662100 0.749000
+vn -0.014600 0.667500 0.744500
+vn -0.012100 0.638500 0.769500
+vn -0.022700 0.648100 0.761200
+vn -0.032400 0.627900 0.777600
+vn -0.014700 0.623200 0.781900
+vn 0.004000 0.624500 0.781000
+vn 0.001200 0.645800 0.763500
+vn 0.000000 0.627200 0.778800
+vn 0.000000 0.650000 0.759900
+vn -0.008700 0.658900 0.752100
+vn 0.000000 0.666100 0.745800
+vn 0.012200 0.638500 0.769500
+vn -0.001200 0.645900 0.763500
+vn -0.004000 0.624500 0.781000
+vn 0.014800 0.623200 0.781900
+vn 0.032400 0.627900 0.777600
+vn 0.022700 0.648100 0.761200
+vn 0.027700 0.629800 0.776200
+vn 0.020100 0.651800 0.758000
+vn 0.008600 0.658900 0.752100
+vn 0.014600 0.667500 0.744500
+vn 0.035700 0.643000 0.765000
+vn 0.020300 0.647600 0.761700
+vn 0.024800 0.626500 0.779000
+vn 0.043300 0.628600 0.776500
+vn 0.058700 0.636400 0.769100
+vn 0.042600 0.654200 0.755100
+vn 0.053600 0.637300 0.768700
+vn 0.038900 0.657300 0.752600
+vn 0.025400 0.662100 0.749000
+vn 0.028200 0.671500 0.740500
+vn 0.056800 0.651600 0.756400
+vn 0.040500 0.653300 0.756000
+vn 0.051900 0.633600 0.771900
+vn 0.068900 0.639100 0.766000
+vn 0.081000 0.649400 0.756100
+vn 0.059700 0.663700 0.745600
+vn 0.075800 0.649400 0.756600
+vn 0.055000 0.666100 0.743800
+vn 0.040500 0.668200 0.742800
+vn 0.039900 0.677800 0.734200
+vn 0.074100 0.663800 0.744200
+vn 0.057900 0.662500 0.746800
+vn 0.075400 0.645500 0.760000
+vn 0.089800 0.653800 0.751300
+vn 0.097800 0.666100 0.739400
+vn 0.072600 0.676000 0.733300
+vn 0.092800 0.665100 0.740900
+vn 0.067300 0.677400 0.732400
+vn 0.052700 0.676900 0.734200
+vn 0.048800 0.686100 0.725900
+vn 0.086300 0.678700 0.729300
+vn 0.071400 0.674500 0.734800
+vn 0.093800 0.661200 0.744300
+vn 0.104600 0.671900 0.733200
+vn 0.107900 0.685200 0.720300
+vn 0.080600 0.690300 0.719000
+vn 0.103500 0.683400 0.722600
+vn 0.075100 0.690700 0.719200
+vn 0.061400 0.687500 0.723500
+vn 0.054400 0.695600 0.716300
+vn 0.092600 0.695400 0.712600
+vn 0.080000 0.688600 0.720700
+vn 0.105800 0.679800 0.725700
+vn 0.112200 0.692100 0.713000
+vn 0.110600 0.705600 0.699900
+vn 0.083100 0.705500 0.703800
+vn 0.107200 0.703000 0.703000
+vn 0.077800 0.704900 0.704900
+vn 0.065900 0.699400 0.711700
+vn 0.056300 0.706000 0.706000
+vn 0.092600 0.712600 0.695400
+vn 0.083100 0.703800 0.705500
+vn 0.110600 0.699900 0.705600
+vn 0.112200 0.713000 0.692100
+vn 0.105800 0.725700 0.679800
+vn 0.080000 0.720700 0.688600
+vn 0.103500 0.722600 0.683400
+vn 0.075100 0.719200 0.690700
+vn 0.065900 0.711700 0.699400
+vn 0.054400 0.716300 0.695600
+vn 0.086300 0.729300 0.678700
+vn 0.080600 0.719000 0.690300
+vn 0.107900 0.720300 0.685200
+vn 0.104600 0.733200 0.671900
+vn 0.093800 0.744300 0.661200
+vn 0.071400 0.734800 0.674500
+vn 0.092800 0.740900 0.665100
+vn 0.067300 0.732400 0.677400
+vn 0.061400 0.723500 0.687500
+vn 0.048800 0.725900 0.686000
+vn 0.074100 0.744200 0.663800
+vn 0.072600 0.733300 0.676000
+vn 0.097800 0.739400 0.666100
+vn 0.089800 0.751300 0.653800
+vn 0.075400 0.760000 0.645500
+vn 0.057900 0.746800 0.662500
+vn 0.075800 0.756600 0.649400
+vn 0.055000 0.743800 0.666100
+vn 0.052700 0.734200 0.676900
+vn 0.039800 0.734200 0.677800
+vn 0.056800 0.756400 0.651600
+vn 0.059600 0.745600 0.663700
+vn 0.081000 0.756100 0.649400
+vn 0.068900 0.766000 0.639100
+vn 0.051900 0.771900 0.633600
+vn 0.040500 0.756000 0.653300
+vn 0.053600 0.768700 0.637300
+vn 0.038900 0.752600 0.657300
+vn 0.040500 0.742800 0.668200
+vn 0.028200 0.740500 0.671500
+vn 0.035700 0.765000 0.643000
+vn 0.042600 0.755100 0.654200
+vn 0.058700 0.769100 0.636400
+vn 0.043300 0.776500 0.628600
+vn 0.024800 0.779000 0.626500
+vn 0.020300 0.761700 0.647600
+vn 0.027700 0.776200 0.629800
+vn 0.020100 0.758100 0.651800
+vn 0.025400 0.749000 0.662100
+vn 0.014600 0.744500 0.667500
+vn 0.012200 0.769500 0.638500
+vn 0.022700 0.761200 0.648100
+vn 0.032400 0.777600 0.627900
+vn 0.014800 0.781900 0.623200
+vn -0.003900 0.781000 0.624500
+vn -0.001200 0.763400 0.645900
+vn 0.000000 0.778800 0.627200
+vn 0.000000 0.759900 0.650000
+vn 0.008700 0.752200 0.658900
+vn 0.000000 0.745800 0.666100
+vn -0.012200 0.769500 0.638500
+vn 0.001200 0.763500 0.645900
+vn 0.003900 0.781000 0.624500
+vn -0.014800 0.781900 0.623200
+vn -0.032400 0.777600 0.627900
+vn -0.022700 0.761200 0.648100
+vn -0.027700 0.776300 0.629800
+vn -0.020100 0.758100 0.651800
+vn -0.008700 0.752200 0.658900
+vn -0.014600 0.744500 0.667500
+vn -0.035700 0.765000 0.643000
+vn -0.020300 0.761700 0.647600
+vn -0.024800 0.779000 0.626500
+vn -0.043300 0.776500 0.628600
+vn -0.058700 0.769100 0.636400
+vn -0.042600 0.755100 0.654200
+vn -0.053600 0.768700 0.637300
+vn -0.038900 0.752600 0.657300
+vn -0.025500 0.749000 0.662100
+vn -0.028200 0.740500 0.671400
+vn -0.056800 0.756400 0.651600
+vn -0.040500 0.756000 0.653300
+vn -0.051900 0.771900 0.633600
+vn -0.068900 0.766000 0.639100
+vn -0.081000 0.756100 0.649400
+vn -0.059600 0.745600 0.663700
+vn -0.075800 0.756600 0.649400
+vn -0.055000 0.743800 0.666100
+vn -0.040500 0.742800 0.668200
+vn -0.039800 0.734200 0.677800
+vn -0.074100 0.744200 0.663800
+vn -0.057900 0.746800 0.662400
+vn -0.075400 0.760000 0.645500
+vn -0.089800 0.751300 0.653800
+vn -0.097800 0.739400 0.666100
+vn -0.072600 0.733300 0.676000
+vn -0.092800 0.740900 0.665100
+vn -0.067300 0.732400 0.677400
+vn -0.052800 0.734200 0.676900
+vn -0.048800 0.725900 0.686000
+vn -0.086300 0.729300 0.678700
+vn -0.071400 0.734800 0.674500
+vn -0.093800 0.744300 0.661200
+vn -0.104600 0.733200 0.671900
+vn -0.107900 0.720300 0.685200
+vn -0.080600 0.719000 0.690300
+vn -0.103500 0.722600 0.683400
+vn -0.075100 0.719200 0.690700
+vn -0.061400 0.723500 0.687500
+vn -0.054400 0.716300 0.695600
+vn -0.092600 0.712600 0.695400
+vn -0.080000 0.720700 0.688600
+vn -0.105800 0.725700 0.679800
+vn -0.112200 0.713000 0.692100
+vn -0.110600 0.699900 0.705600
+vn -0.083100 0.703800 0.705500
+vn -0.107200 0.703000 0.703000
+vn -0.077800 0.704900 0.704900
+vn -0.065900 0.711700 0.699400
+vn -0.056300 0.706000 0.706000
+vn -0.092600 0.695400 0.712600
+vn -0.083100 0.705500 0.703800
+vn -0.110600 0.705600 0.699900
+vn -0.112200 0.692100 0.713000
+vn -0.105800 0.679800 0.725700
+vn -0.080000 0.688600 0.720700
+vn -0.065900 0.699400 0.711700
+usemtl OuterMat
+s 1
+f 1/1/1 5/2/2 6/3/3 2/4/4
+f 2/4/4 6/3/3 8050/5/5 8051/6/6
+f 5/2/2 8057/7/7 8058/8/8 6/3/3
+f 6/3/3 8058/8/8 12798/9/9 8050/5/5
+f 1/1/1 2/4/4 7/10/10 3/11/11
+f 3/11/11 7/10/10 7669/12/12 7670/13/13
+f 2/4/4 8051/6/6 8052/14/14 7/10/10
+f 7/10/10 8052/14/14 12726/15/15 7669/12/12
+f 1/1/1 3/11/11 8/16/16 4/17/17
+f 4/17/17 8/16/16 8053/18/18 8054/19/19
+f 3/11/11 7670/13/13 7671/20/20 8/16/16
+f 8/16/16 7671/20/20 12727/21/21 8053/18/18
+f 1/1/1 4/17/17 9/22/22 5/2/2
+f 5/2/2 9/22/22 8056/23/23 8057/7/7
+f 4/17/17 8054/19/19 8055/24/24 9/22/22
+f 9/22/22 8055/24/24 12799/25/25 8056/23/23
+f 10/26/26 14/27/27 15/28/28 11/29/29
+f 11/29/29 15/28/28 8055/24/24 8054/19/19
+f 14/27/27 8063/30/30 8064/31/31 15/28/28
+f 15/28/28 8064/31/31 12799/25/25 8055/24/24
+f 10/26/26 11/29/29 16/32/32 12/33/33
+f 12/33/33 16/32/32 7672/34/34 7673/35/35
+f 11/29/29 8054/19/19 8053/18/18 16/32/32
+f 16/32/32 8053/18/18 12727/21/21 7672/34/34
+f 10/26/26 12/33/33 17/36/36 13/37/37
+f 13/37/37 17/36/36 8059/38/38 8060/39/39
+f 12/33/33 7673/35/35 7674/40/40 17/36/36
+f 17/36/36 7674/40/40 12728/41/41 8059/38/38
+f 10/26/26 13/37/37 18/42/42 14/27/27
+f 14/27/27 18/42/42 8062/43/43 8063/30/30
+f 13/37/37 8060/39/39 8061/44/44 18/42/42
+f 18/42/42 8061/44/44 12800/45/45 8062/43/43
+f 19/46/46 23/47/47 24/48/48 20/49/49
+f 20/49/49 24/48/48 8061/44/44 8060/39/39
+f 23/47/47 8069/50/50 8070/51/51 24/48/48
+f 24/48/48 8070/51/51 12800/45/45 8061/44/44
+f 19/46/46 20/49/49 25/52/52 21/53/53
+f 21/53/53 25/52/52 7675/54/54 7676/55/55
+f 20/49/49 8060/39/39 8059/38/38 25/52/52
+f 25/52/52 8059/38/38 12728/41/41 7675/54/54
+f 19/46/46 21/53/53 26/56/56 22/57/57
+f 22/57/57 26/56/56 8065/58/58 8066/59/59
+f 21/53/53 7676/55/55 7677/60/60 26/56/56
+f 26/56/56 7677/60/60 12729/61/61 8065/58/58
+f 19/46/46 22/57/57 27/62/62 23/47/47
+f 23/47/47 27/62/62 8068/63/63 8069/50/50
+f 22/57/57 8066/59/59 8067/64/64 27/62/62
+f 27/62/62 8067/64/64 12801/65/65 8068/63/63
+f 28/66/66 32/67/67 33/68/68 29/69/69
+f 29/69/69 33/68/68 8067/64/64 8066/59/59
+f 32/67/67 8075/70/70 8076/71/71 33/68/68
+f 33/68/68 8076/71/71 12801/65/65 8067/64/64
+f 28/66/66 29/69/69 34/72/72 30/73/73
+f 30/73/73 34/72/72 7678/74/74 7679/75/75
+f 29/69/69 8066/59/59 8065/58/58 34/72/72
+f 34/72/72 8065/58/58 12729/61/61 7678/74/74
+f 28/66/66 30/73/73 35/76/76 31/77/77
+f 31/77/77 35/76/76 8071/78/78 8072/79/79
+f 30/73/73 7679/75/75 7680/80/80 35/76/76
+f 35/76/76 7680/80/80 12730/81/81 8071/78/78
+f 28/66/66 31/77/77 36/82/82 32/67/67
+f 32/67/67 36/82/82 8074/83/83 8075/70/70
+f 31/77/77 8072/79/79 8073/84/84 36/82/82
+f 36/82/82 8073/84/84 12802/85/85 8074/83/83
+f 37/86/86 41/87/87 42/88/88 38/89/89
+f 38/89/89 42/88/88 8073/84/84 8072/79/79
+f 41/87/87 8081/90/90 8082/91/91 42/88/88
+f 42/88/88 8082/91/91 12802/85/85 8073/84/84
+f 37/86/86 38/89/89 43/92/92 39/93/93
+f 39/93/93 43/92/92 7681/94/94 7682/95/95
+f 38/89/89 8072/79/79 8071/78/78 43/92/92
+f 43/92/92 8071/78/78 12730/81/81 7681/94/94
+f 37/86/86 39/93/93 44/96/96 40/97/97
+f 40/97/97 44/96/96 8077/98/98 8078/99/99
+f 39/93/93 7682/95/95 7683/100/100 44/96/96
+f 44/96/96 7683/100/100 12731/101/101 8077/98/98
+f 37/86/86 40/97/97 45/102/102 41/87/87
+f 41/87/87 45/102/102 8080/103/103 8081/90/90
+f 40/97/97 8078/99/99 8079/104/104 45/102/102
+f 45/102/102 8079/104/104 12803/105/105 8080/103/103
+f 46/106/106 50/107/107 51/108/108 47/109/109
+f 47/109/109 51/108/108 8079/104/104 8078/99/99
+f 50/107/107 8087/110/110 8088/111/111 51/108/108
+f 51/108/108 8088/111/111 12803/105/105 8079/104/104
+f 46/106/106 47/109/109 52/112/112 48/113/113
+f 48/113/113 52/112/112 7684/114/114 7685/115/115
+f 47/109/109 8078/99/99 8077/98/98 52/112/112
+f 52/112/112 8077/98/98 12731/101/101 7684/114/114
+f 46/106/106 48/113/113 53/116/116 49/117/117
+f 49/117/117 53/116/116 8083/118/118 8084/119/119
+f 48/113/113 7685/115/115 7686/120/120 53/116/116
+f 53/116/116 7686/120/120 12732/121/121 8083/118/118
+f 46/106/106 49/117/117 54/122/122 50/107/107
+f 50/107/107 54/122/122 8086/123/123 8087/110/110
+f 49/117/117 8084/119/119 8085/124/124 54/122/122
+f 54/122/122 8085/124/124 12804/125/125 8086/123/123
+f 55/126/126 59/127/127 60/128/128 56/129/129
+f 56/129/129 60/128/128 8085/124/124 8084/119/119
+f 59/127/127 8093/130/130 8094/131/131 60/128/128
+f 60/128/128 8094/131/131 12804/125/125 8085/124/124
+f 55/126/126 56/129/129 61/132/132 57/133/133
+f 57/133/133 61/132/132 7687/134/134 7688/135/135
+f 56/129/129 8084/119/119 8083/118/118 61/132/132
+f 61/132/132 8083/118/118 12732/121/121 7687/134/134
+f 55/126/126 57/133/133 62/136/136 58/137/137
+f 58/137/137 62/136/136 8089/138/138 8090/139/139
+f 57/133/133 7688/135/135 7689/140/140 62/136/136
+f 62/136/136 7689/140/140 12733/141/141 8089/138/138
+f 55/126/126 58/137/137 63/142/142 59/127/127
+f 59/127/127 63/142/142 8092/143/143 8093/130/130
+f 58/137/137 8090/139/139 8091/144/144 63/142/142
+f 63/142/142 8091/144/144 12805/145/145 8092/143/143
+f 64/146/146 68/147/147 69/148/148 65/149/149
+f 65/149/149 69/148/148 8091/144/144 8090/139/139
+f 68/147/147 8099/150/150 8100/151/151 69/148/148
+f 69/148/148 8100/151/151 12805/145/145 8091/144/144
+f 64/146/146 65/149/149 70/152/152 66/153/153
+f 66/153/153 70/152/152 7690/154/154 7691/155/155
+f 65/149/149 8090/139/139 8089/138/138 70/152/152
+f 70/152/152 8089/138/138 12733/141/141 7690/154/154
+f 64/146/146 66/153/153 71/156/156 67/157/157
+f 67/157/157 71/156/156 8095/158/158 8096/159/159
+f 66/153/153 7691/155/155 7692/160/160 71/156/156
+f 71/156/156 7692/160/160 12734/161/161 8095/158/158
+f 64/146/146 67/157/157 72/162/162 68/147/147
+f 68/147/147 72/162/162 8098/163/163 8099/150/150
+f 67/157/157 8096/159/159 8097/164/164 72/162/162
+f 72/162/162 8097/164/164 12806/165/165 8098/163/163
+f 73/166/166 77/167/167 78/168/168 74/169/169
+f 74/169/169 78/168/168 8097/164/164 8096/159/159
+f 77/167/167 8105/170/170 8106/171/171 78/168/168
+f 78/168/168 8106/171/171 12806/165/165 8097/164/164
+f 73/166/166 74/169/169 79/172/172 75/173/173
+f 75/173/173 79/172/172 7693/174/174 7694/175/175
+f 74/169/169 8096/159/159 8095/158/158 79/172/172
+f 79/172/172 8095/158/158 12734/161/161 7693/174/174
+f 73/166/166 75/173/173 80/176/176 76/177/177
+f 76/177/177 80/176/176 8101/178/178 8102/179/179
+f 75/173/173 7694/175/175 7695/180/180 80/176/176
+f 80/176/176 7695/180/180 12735/181/181 8101/178/178
+f 73/166/166 76/177/177 81/182/182 77/167/167
+f 77/167/167 81/182/182 8104/183/183 8105/170/170
+f 76/177/177 8102/179/179 8103/184/184 81/182/182
+f 81/182/182 8103/184/184 12807/185/185 8104/183/183
+f 82/186/186 86/187/187 87/188/188 83/189/189
+f 83/189/189 87/188/188 8103/184/184 8102/179/179
+f 86/187/187 8111/190/190 8112/191/191 87/188/188
+f 87/188/188 8112/191/191 12807/185/185 8103/184/184
+f 82/186/186 83/189/189 88/192/192 84/193/193
+f 84/193/193 88/192/192 7696/194/194 7697/195/195
+f 83/189/189 8102/179/179 8101/178/178 88/192/192
+f 88/192/192 8101/178/178 12735/181/181 7696/194/194
+f 82/186/186 84/193/193 89/196/196 85/197/197
+f 85/197/197 89/196/196 8107/198/198 8108/199/199
+f 84/193/193 7697/195/195 7698/200/200 89/196/196
+f 89/196/196 7698/200/200 12736/201/201 8107/198/198
+f 82/186/186 85/197/197 90/202/202 86/187/187
+f 86/187/187 90/202/202 8110/203/203 8111/190/190
+f 85/197/197 8108/199/199 8109/204/204 90/202/202
+f 90/202/202 8109/204/204 12808/205/205 8110/203/203
+f 91/206/206 95/207/207 96/208/208 92/209/209
+f 92/209/209 96/208/208 8109/204/204 8108/199/199
+f 95/207/207 8117/210/210 8118/211/211 96/208/208
+f 96/208/208 8118/211/211 12808/205/205 8109/204/204
+f 91/206/206 92/209/209 97/212/212 93/213/213
+f 93/213/213 97/212/212 7699/214/214 7700/215/215
+f 92/209/209 8108/199/199 8107/198/198 97/212/212
+f 97/212/212 8107/198/198 12736/201/201 7699/214/214
+f 91/206/206 93/213/213 98/216/216 94/217/217
+f 94/217/217 98/216/216 8113/218/218 8114/219/219
+f 93/213/213 7700/215/215 7701/220/220 98/216/216
+f 98/216/216 7701/220/220 12737/221/221 8113/218/218
+f 91/206/206 94/217/217 99/222/222 95/207/207
+f 95/207/207 99/222/222 8116/223/223 8117/210/210
+f 94/217/217 8114/219/219 8115/224/224 99/222/222
+f 99/222/222 8115/224/224 12809/225/225 8116/223/223
+f 100/226/226 104/227/227 105/228/228 101/229/229
+f 101/229/229 105/228/228 8115/224/224 8114/219/219
+f 104/227/227 8123/230/230 8124/231/231 105/228/228
+f 105/228/228 8124/231/231 12809/225/225 8115/224/224
+f 100/226/226 101/229/229 106/232/232 102/233/233
+f 102/233/233 106/232/232 7702/234/234 7703/235/235
+f 101/229/229 8114/219/219 8113/218/218 106/232/232
+f 106/232/232 8113/218/218 12737/221/221 7702/234/234
+f 100/226/226 102/233/233 107/236/236 103/237/237
+f 103/237/237 107/236/236 8119/238/238 8120/239/239
+f 102/233/233 7703/235/235 7704/240/240 107/236/236
+f 107/236/236 7704/240/240 12738/241/241 8119/238/238
+f 100/226/226 103/237/237 108/242/242 104/227/227
+f 104/227/227 108/242/242 8122/243/243 8123/230/230
+f 103/237/237 8120/239/239 8121/244/244 108/242/242
+f 108/242/242 8121/244/244 12810/245/245 8122/243/243
+f 109/246/246 113/247/247 114/248/248 110/249/249
+f 110/249/249 114/248/248 9067/250/250 9068/251/251
+f 113/247/247 9065/252/252 9066/253/253 114/248/248
+f 114/248/248 9066/253/253 12970/254/254 9067/250/250
+f 109/246/246 110/249/249 115/255/255 111/256/256
+f 111/256/256 115/255/255 9058/257/257 9059/258/258
+f 110/249/249 9068/251/251 9069/259/259 115/255/255
+f 115/255/255 9069/259/259 12969/260/260 9058/257/257
+f 109/246/246 111/256/256 116/261/261 112/262/262
+f 112/262/262 116/261/261 8125/263/263 8126/264/264
+f 111/256/256 9059/258/258 9060/265/265 116/261/261
+f 116/261/261 9060/265/265 12739/266/266 8125/263/263
+f 109/246/246 112/262/262 117/267/267 113/247/247
+f 113/247/247 117/267/267 9064/268/268 9065/252/252
+f 112/262/262 8126/264/264 8127/269/269 117/267/267
+f 117/267/267 8127/269/269 12811/270/270 9064/268/268
+f 118/271/271 122/272/272 123/273/273 119/274/274
+f 119/274/274 123/273/273 7711/275/275 7712/276/276
+f 122/272/272 7670/13/13 7669/12/12 123/273/273
+f 123/273/273 7669/12/12 12726/15/15 7711/275/275
+f 118/271/271 119/274/274 124/277/277 120/278/278
+f 120/278/278 124/277/277 7921/279/279 7922/280/279
+f 119/274/274 7712/276/276 7713/281/280 124/277/277
+f 124/277/277 7713/281/280 12769/282/279 7921/279/279
+f 118/271/271 120/278/278 125/283/281 121/284/282
+f 121/284/282 125/283/281 7714/285/283 7715/286/284
+f 120/278/278 7922/280/279 7923/287/279 125/283/281
+f 125/283/281 7923/287/279 12768/288/279 7714/285/283
+f 118/271/271 121/284/282 126/289/285 122/272/272
+f 122/272/272 126/289/285 7671/20/20 7670/13/13
+f 121/284/282 7715/286/284 7716/290/286 126/289/285
+f 126/289/285 7716/290/286 12727/21/21 7671/20/20
+f 127/291/287 131/292/288 132/293/289 128/294/290
+f 128/294/290 132/293/289 7716/290/286 7715/286/284
+f 131/292/288 7673/35/35 7672/34/34 132/293/289
+f 132/293/289 7672/34/34 12727/21/21 7716/290/286
+f 127/291/287 128/294/290 133/295/291 129/296/292
+f 129/296/292 133/295/291 7915/297/279 7916/298/279
+f 128/294/290 7715/286/284 7714/285/283 133/295/291
+f 133/295/291 7714/285/283 12768/288/279 7915/297/279
+f 127/291/287 129/296/292 134/299/293 130/300/294
+f 130/300/294 134/299/293 7717/301/295 7718/302/296
+f 129/296/292 7916/298/279 7917/303/279 134/299/293
+f 134/299/293 7917/303/279 12767/304/279 7717/301/295
+f 127/291/287 130/300/294 135/305/297 131/292/288
+f 131/292/288 135/305/297 7674/40/40 7673/35/35
+f 130/300/294 7718/302/296 7719/306/298 135/305/297
+f 135/305/297 7719/306/298 12728/41/41 7674/40/40
+f 136/307/299 140/308/300 141/309/301 137/310/302
+f 137/310/302 141/309/301 7719/306/298 7718/302/296
+f 140/308/300 7676/55/55 7675/54/54 141/309/301
+f 141/309/301 7675/54/54 12728/41/41 7719/306/298
+f 136/307/299 137/310/302 142/311/303 138/312/304
+f 138/312/304 142/311/303 7909/313/279 7910/314/279
+f 137/310/302 7718/302/296 7717/301/295 142/311/303
+f 142/311/303 7717/301/295 12767/304/279 7909/313/279
+f 136/307/299 138/312/304 143/315/305 139/316/306
+f 139/316/306 143/315/305 7720/317/307 7721/318/308
+f 138/312/304 7910/314/279 7911/319/279 143/315/305
+f 143/315/305 7911/319/279 12766/320/279 7720/317/307
+f 136/307/299 139/316/306 144/321/309 140/308/300
+f 140/308/300 144/321/309 7677/60/60 7676/55/55
+f 139/316/306 7721/318/308 7722/322/310 144/321/309
+f 144/321/309 7722/322/310 12729/61/61 7677/60/60
+f 145/323/311 149/324/312 150/325/313 146/326/314
+f 146/326/314 150/325/313 7722/322/310 7721/318/308
+f 149/324/312 7679/75/75 7678/74/74 150/325/313
+f 150/325/313 7678/74/74 12729/61/61 7722/322/310
+f 145/323/311 146/326/314 151/327/315 147/328/316
+f 147/328/316 151/327/315 7903/329/279 7904/330/279
+f 146/326/314 7721/318/308 7720/317/307 151/327/315
+f 151/327/315 7720/317/307 12766/320/279 7903/329/279
+f 145/323/311 147/328/316 152/331/317 148/332/318
+f 148/332/318 152/331/317 7723/333/319 7724/334/320
+f 147/328/316 7904/330/279 7905/335/279 152/331/317
+f 152/331/317 7905/335/279 12765/336/279 7723/333/319
+f 145/323/311 148/332/318 153/337/321 149/324/312
+f 149/324/312 153/337/321 7680/80/80 7679/75/75
+f 148/332/318 7724/334/320 7725/338/322 153/337/321
+f 153/337/321 7725/338/322 12730/81/81 7680/80/80
+f 154/339/323 158/340/324 159/341/325 155/342/326
+f 155/342/326 159/341/325 7725/338/322 7724/334/320
+f 158/340/324 7682/95/95 7681/94/94 159/341/325
+f 159/341/325 7681/94/94 12730/81/81 7725/338/322
+f 154/339/323 155/342/326 160/343/327 156/344/328
+f 156/344/328 160/343/327 7897/345/279 7898/346/279
+f 155/342/326 7724/334/320 7723/333/319 160/343/327
+f 160/343/327 7723/333/319 12765/336/279 7897/345/279
+f 154/339/323 156/344/328 161/347/329 157/348/330
+f 157/348/330 161/347/329 7726/349/331 7727/350/332
+f 156/344/328 7898/346/279 7899/351/279 161/347/329
+f 161/347/329 7899/351/279 12764/352/279 7726/349/331
+f 154/339/323 157/348/330 162/353/333 158/340/324
+f 158/340/324 162/353/333 7683/100/100 7682/95/95
+f 157/348/330 7727/350/332 7728/354/334 162/353/333
+f 162/353/333 7728/354/334 12731/101/101 7683/100/100
+f 163/355/335 167/356/336 168/357/337 164/358/338
+f 164/358/338 168/357/337 7728/354/334 7727/350/332
+f 167/356/336 7685/115/115 7684/114/114 168/357/337
+f 168/357/337 7684/114/114 12731/101/101 7728/354/334
+f 163/355/335 164/358/338 169/359/339 165/360/340
+f 165/360/340 169/359/339 7891/361/279 7892/362/279
+f 164/358/338 7727/350/332 7726/349/331 169/359/339
+f 169/359/339 7726/349/331 12764/352/279 7891/361/279
+f 163/355/335 165/360/340 170/363/341 166/364/342
+f 166/364/342 170/363/341 7729/365/343 7730/366/344
+f 165/360/340 7892/362/279 7893/367/279 170/363/341
+f 170/363/341 7893/367/279 12763/368/279 7729/365/343
+f 163/355/335 166/364/342 171/369/345 167/356/336
+f 167/356/336 171/369/345 7686/120/120 7685/115/115
+f 166/364/342 7730/366/344 7731/370/346 171/369/345
+f 171/369/345 7731/370/346 12732/121/121 7686/120/120
+f 172/371/347 176/372/348 177/373/349 173/374/350
+f 173/374/350 177/373/349 7731/370/346 7730/366/344
+f 176/372/348 7688/135/135 7687/134/134 177/373/349
+f 177/373/349 7687/134/134 12732/121/121 7731/370/346
+f 172/371/347 173/374/350 178/375/351 174/376/352
+f 174/376/352 178/375/351 7885/377/279 7886/378/279
+f 173/374/350 7730/366/344 7729/365/343 178/375/351
+f 178/375/351 7729/365/343 12763/368/279 7885/377/279
+f 172/371/347 174/376/352 179/379/353 175/380/354
+f 175/380/354 179/379/353 7732/381/355 7733/382/356
+f 174/376/352 7886/378/279 7887/383/279 179/379/353
+f 179/379/353 7887/383/279 12762/384/279 7732/381/355
+f 172/371/347 175/380/354 180/385/357 176/372/348
+f 176/372/348 180/385/357 7689/140/140 7688/135/135
+f 175/380/354 7733/382/356 7734/386/358 180/385/357
+f 180/385/357 7734/386/358 12733/141/141 7689/140/140
+f 181/387/359 185/388/360 186/389/361 182/390/362
+f 182/390/362 186/389/361 7734/386/358 7733/382/356
+f 185/388/360 7691/155/155 7690/154/154 186/389/361
+f 186/389/361 7690/154/154 12733/141/141 7734/386/358
+f 181/387/359 182/390/362 187/391/363 183/392/364
+f 183/392/364 187/391/363 7879/393/279 7880/394/279
+f 182/390/362 7733/382/356 7732/381/355 187/391/363
+f 187/391/363 7732/381/355 12762/384/279 7879/393/279
+f 181/387/359 183/392/364 188/395/365 184/396/366
+f 184/396/366 188/395/365 7735/397/367 7736/398/368
+f 183/392/364 7880/394/279 7881/399/279 188/395/365
+f 188/395/365 7881/399/279 12761/400/279 7735/397/367
+f 181/387/359 184/396/366 189/401/369 185/388/360
+f 185/388/360 189/401/369 7692/160/160 7691/155/155
+f 184/396/366 7736/398/368 7737/402/370 189/401/369
+f 189/401/369 7737/402/370 12734/161/161 7692/160/160
+f 190/403/371 194/404/372 195/405/373 191/406/374
+f 191/406/374 195/405/373 7737/402/370 7736/398/368
+f 194/404/372 7694/175/175 7693/174/174 195/405/373
+f 195/405/373 7693/174/174 12734/161/161 7737/402/370
+f 190/403/371 191/406/374 196/407/375 192/408/376
+f 192/408/376 196/407/375 7873/409/279 7874/410/279
+f 191/406/374 7736/398/368 7735/397/367 196/407/375
+f 196/407/375 7735/397/367 12761/400/279 7873/409/279
+f 190/403/371 192/408/376 197/411/377 193/412/378
+f 193/412/378 197/411/377 7738/413/379 7739/414/380
+f 192/408/376 7874/410/279 7875/415/279 197/411/377
+f 197/411/377 7875/415/279 12760/416/279 7738/413/379
+f 190/403/371 193/412/378 198/417/381 194/404/372
+f 194/404/372 198/417/381 7695/180/180 7694/175/175
+f 193/412/378 7739/414/380 7740/418/382 198/417/381
+f 198/417/381 7740/418/382 12735/181/181 7695/180/180
+f 199/419/383 203/420/384 204/421/385 200/422/386
+f 200/422/386 204/421/385 7740/418/382 7739/414/380
+f 203/420/384 7697/195/195 7696/194/194 204/421/385
+f 204/421/385 7696/194/194 12735/181/181 7740/418/382
+f 199/419/383 200/422/386 205/423/387 201/424/388
+f 201/424/388 205/423/387 7867/425/279 7868/426/279
+f 200/422/386 7739/414/380 7738/413/379 205/423/387
+f 205/423/387 7738/413/379 12760/416/279 7867/425/279
+f 199/419/383 201/424/388 206/427/389 202/428/390
+f 202/428/390 206/427/389 7741/429/391 7742/430/392
+f 201/424/388 7868/426/279 7869/431/279 206/427/389
+f 206/427/389 7869/431/279 12759/432/279 7741/429/391
+f 199/419/383 202/428/390 207/433/393 203/420/384
+f 203/420/384 207/433/393 7698/200/200 7697/195/195
+f 202/428/390 7742/430/392 7743/434/394 207/433/393
+f 207/433/393 7743/434/394 12736/201/201 7698/200/200
+f 208/435/395 212/436/396 213/437/397 209/438/398
+f 209/438/398 213/437/397 7743/434/394 7742/430/392
+f 212/436/396 7700/215/215 7699/214/214 213/437/397
+f 213/437/397 7699/214/214 12736/201/201 7743/434/394
+f 208/435/395 209/438/398 214/439/399 210/440/400
+f 210/440/400 214/439/399 7861/441/279 7862/442/279
+f 209/438/398 7742/430/392 7741/429/391 214/439/399
+f 214/439/399 7741/429/391 12759/432/279 7861/441/279
+f 208/435/395 210/440/400 215/443/401 211/444/402
+f 211/444/402 215/443/401 7744/445/403 7745/446/404
+f 210/440/400 7862/442/279 7863/447/279 215/443/401
+f 215/443/401 7863/447/279 12758/448/279 7744/445/403
+f 208/435/395 211/444/402 216/449/405 212/436/396
+f 212/436/396 216/449/405 7701/220/220 7700/215/215
+f 211/444/402 7745/446/404 7746/450/406 216/449/405
+f 216/449/405 7746/450/406 12737/221/221 7701/220/220
+f 217/451/407 221/452/408 222/453/409 218/454/410
+f 218/454/410 222/453/409 7746/450/406 7745/446/404
+f 221/452/408 7703/235/235 7702/234/234 222/453/409
+f 222/453/409 7702/234/234 12737/221/221 7746/450/406
+f 217/451/407 218/454/410 223/455/411 219/456/412
+f 219/456/412 223/455/411 7855/457/279 7856/458/279
+f 218/454/410 7745/446/404 7744/445/403 223/455/411
+f 223/455/411 7744/445/403 12758/448/279 7855/457/279
+f 217/451/407 219/456/412 224/459/413 220/460/414
+f 220/460/414 224/459/413 7747/461/415 7748/462/416
+f 219/456/412 7856/458/279 7857/463/279 224/459/413
+f 224/459/413 7857/463/279 12757/464/279 7747/461/415
+f 217/451/407 220/460/414 225/465/417 221/452/408
+f 221/452/408 225/465/417 7704/240/240 7703/235/235
+f 220/460/414 7748/462/416 7749/466/418 225/465/417
+f 225/465/417 7749/466/418 12738/241/241 7704/240/240
+f 226/467/419 230/468/420 231/469/421 227/470/422
+f 227/470/422 231/469/421 9061/471/423 9062/472/424
+f 230/468/420 9059/258/258 9058/257/257 231/469/421
+f 231/469/421 9058/257/257 12969/260/260 9061/471/423
+f 226/467/419 227/470/422 232/473/425 228/474/426
+f 228/474/426 232/473/425 7849/475/427 7850/476/428
+f 227/470/422 9062/472/424 9063/477/429 232/473/425
+f 232/473/425 9063/477/429 12968/478/279 7849/475/427
+f 226/467/419 228/474/426 233/479/430 229/480/431
+f 229/480/431 233/479/430 7750/481/432 7751/482/433
+f 228/474/426 7850/476/428 7851/483/434 233/479/430
+f 233/479/430 7851/483/434 12756/484/435 7750/481/432
+f 226/467/419 229/480/431 234/485/436 230/468/420
+f 230/468/420 234/485/436 9060/265/265 9059/258/258
+f 229/480/431 7751/482/433 7752/486/437 234/485/436
+f 234/485/436 7752/486/437 12739/266/266 9060/265/265
+f 235/487/438 239/488/439 240/489/440 236/490/441
+f 236/490/441 240/489/440 7752/491/437 7751/492/433
+f 239/488/439 8126/493/264 8125/494/263 240/489/440
+f 240/489/440 8125/494/263 12739/495/266 7752/491/437
+f 235/487/438 236/490/441 241/496/442 237/497/443
+f 237/497/443 241/496/442 8131/498/444 8132/499/445
+f 236/490/441 7751/492/433 7750/500/432 241/496/442
+f 241/496/442 7750/500/432 12756/501/435 8131/498/444
+f 235/487/438 237/497/443 242/502/446 238/503/447
+f 238/503/447 242/502/446 8134/504/448 8135/505/449
+f 237/497/443 8132/499/445 8133/506/450 242/502/446
+f 242/502/446 8133/506/450 12812/507/451 8134/504/448
+f 235/487/438 238/503/447 243/508/452 239/488/439
+f 239/488/439 243/508/452 8127/509/269 8126/493/264
+f 238/503/447 8135/505/449 8136/510/453 243/508/452
+f 243/508/452 8136/510/453 12811/511/270 8127/509/269
+f 244/512/454 248/513/455 249/514/456 245/515/457
+f 245/515/457 249/514/456 7843/516/458 7844/517/459
+f 248/513/455 8132/499/445 8131/498/444 249/514/456
+f 249/514/456 8131/498/444 12756/501/435 7843/516/458
+f 244/512/454 245/515/457 250/518/460 246/519/461
+f 246/519/461 250/518/460 8137/520/462 8138/521/463
+f 245/515/457 7844/517/459 7845/522/464 250/518/460
+f 250/518/460 7845/522/464 12771/523/465 8137/520/462
+f 244/512/454 246/519/461 251/524/466 247/525/467
+f 247/525/467 251/524/466 8140/526/451 8141/527/451
+f 246/519/461 8138/521/463 8139/528/468 251/524/466
+f 251/524/466 8139/528/468 12813/529/451 8140/526/451
+f 244/512/454 247/525/467 252/530/469 248/513/455
+f 248/513/455 252/530/469 8133/506/450 8132/499/445
+f 247/525/467 8141/527/451 8142/531/451 252/530/469
+f 252/530/469 8142/531/451 12812/507/451 8133/506/450
+f 253/532/470 257/533/471 258/534/472 254/535/473
+f 254/535/473 258/534/472 9055/536/474 9056/537/475
+f 257/533/471 7850/476/428 7849/475/427 258/534/472
+f 258/534/472 7849/475/427 12968/478/279 9055/536/474
+f 253/532/470 254/535/473 259/538/476 255/539/477
+f 255/539/477 259/538/476 7933/540/478 7934/541/479
+f 254/535/473 9056/537/475 9057/542/480 259/538/476
+f 259/538/476 9057/542/480 12967/543/481 7933/540/478
+f 253/532/470 255/539/477 260/544/482 256/545/483
+f 256/545/483 260/544/482 7845/546/464 7844/547/459
+f 255/539/477 7934/541/479 7935/548/484 260/544/482
+f 260/544/482 7935/548/484 12771/549/465 7845/546/464
+f 253/532/470 256/545/483 261/550/485 257/533/471
+f 257/533/471 261/550/485 7851/483/434 7850/476/428
+f 256/545/483 7844/547/459 7843/551/458 261/550/485
+f 261/550/485 7843/551/458 12756/484/435 7851/483/434
+f 262/552/486 266/553/487 267/554/488 263/555/489
+f 263/555/489 267/554/488 7852/556/490 7853/557/491
+f 266/553/487 7856/458/279 7855/457/279 267/554/488
+f 267/554/488 7855/457/279 12758/448/279 7852/556/490
+f 262/552/486 263/555/489 268/558/492 264/559/493
+f 264/559/493 268/558/492 7936/560/494 7937/561/495
+f 263/555/489 7853/557/491 7854/562/496 268/558/492
+f 268/558/492 7854/562/496 12773/563/497 7936/560/494
+f 262/552/486 264/559/493 269/564/498 265/565/499
+f 265/565/499 269/564/498 7846/566/500 7847/567/501
+f 264/559/493 7937/561/495 7938/568/502 269/564/498
+f 269/564/498 7938/568/502 12772/569/503 7846/566/500
+f 262/552/486 265/565/499 270/570/504 266/553/487
+f 266/553/487 270/570/504 7857/463/279 7856/458/279
+f 265/565/499 7847/567/501 7848/571/505 270/570/504
+f 270/570/504 7848/571/505 12757/464/279 7857/463/279
+f 271/572/506 275/573/507 276/574/508 272/575/509
+f 272/575/509 276/574/508 7858/576/510 7859/577/511
+f 275/573/507 7862/442/279 7861/441/279 276/574/508
+f 276/574/508 7861/441/279 12759/432/279 7858/576/510
+f 271/572/506 272/575/509 277/578/512 273/579/513
+f 273/579/513 277/578/512 7939/580/514 7940/581/515
+f 272/575/509 7859/577/511 7860/582/516 277/578/512
+f 277/578/512 7860/582/516 12774/583/517 7939/580/514
+f 271/572/506 273/579/513 278/584/518 274/585/519
+f 274/585/519 278/584/518 7854/562/496 7853/557/491
+f 273/579/513 7940/581/515 7941/586/520 278/584/518
+f 278/584/518 7941/586/520 12773/563/497 7854/562/496
+f 271/572/506 274/585/519 279/587/521 275/573/507
+f 275/573/507 279/587/521 7863/447/279 7862/442/279
+f 274/585/519 7853/557/491 7852/556/490 279/587/521
+f 279/587/521 7852/556/490 12758/448/279 7863/447/279
+f 280/588/522 284/589/523 285/590/524 281/591/525
+f 281/591/525 285/590/524 7864/592/526 7865/593/527
+f 284/589/523 7868/426/279 7867/425/279 285/590/524
+f 285/590/524 7867/425/279 12760/416/279 7864/592/526
+f 280/588/522 281/591/525 286/594/528 282/595/529
+f 282/595/529 286/594/528 7942/596/530 7943/597/531
+f 281/591/525 7865/593/527 7866/598/532 286/594/528
+f 286/594/528 7866/598/532 12775/599/533 7942/596/530
+f 280/588/522 282/595/529 287/600/534 283/601/535
+f 283/601/535 287/600/534 7860/582/516 7859/577/511
+f 282/595/529 7943/597/531 7944/602/536 287/600/534
+f 287/600/534 7944/602/536 12774/583/517 7860/582/516
+f 280/588/522 283/601/535 288/603/537 284/589/523
+f 284/589/523 288/603/537 7869/431/279 7868/426/279
+f 283/601/535 7859/577/511 7858/576/510 288/603/537
+f 288/603/537 7858/576/510 12759/432/279 7869/431/279
+f 289/604/538 293/605/539 294/606/540 290/607/541
+f 290/607/541 294/606/540 7870/608/542 7871/609/543
+f 293/605/539 7874/410/279 7873/409/279 294/606/540
+f 294/606/540 7873/409/279 12761/400/279 7870/608/542
+f 289/604/538 290/607/541 295/610/544 291/611/545
+f 291/611/545 295/610/544 7945/612/546 7946/613/547
+f 290/607/541 7871/609/543 7872/614/548 295/610/544
+f 295/610/544 7872/614/548 12776/615/549 7945/612/546
+f 289/604/538 291/611/545 296/616/550 292/617/551
+f 292/617/551 296/616/550 7866/598/532 7865/593/527
+f 291/611/545 7946/613/547 7947/618/552 296/616/550
+f 296/616/550 7947/618/552 12775/599/533 7866/598/532
+f 289/604/538 292/617/551 297/619/553 293/605/539
+f 293/605/539 297/619/553 7875/415/279 7874/410/279
+f 292/617/551 7865/593/527 7864/592/526 297/619/553
+f 297/619/553 7864/592/526 12760/416/279 7875/415/279
+f 298/620/554 302/621/555 303/622/556 299/623/557
+f 299/623/557 303/622/556 7876/624/558 7877/625/559
+f 302/621/555 7880/394/279 7879/393/279 303/622/556
+f 303/622/556 7879/393/279 12762/384/279 7876/624/558
+f 298/620/554 299/623/557 304/626/560 300/627/561
+f 300/627/561 304/626/560 7948/628/562 7949/629/563
+f 299/623/557 7877/625/559 7878/630/564 304/626/560
+f 304/626/560 7878/630/564 12777/631/565 7948/628/562
+f 298/620/554 300/627/561 305/632/566 301/633/567
+f 301/633/567 305/632/566 7872/614/548 7871/609/543
+f 300/627/561 7949/629/563 7950/634/568 305/632/566
+f 305/632/566 7950/634/568 12776/615/549 7872/614/548
+f 298/620/554 301/633/567 306/635/569 302/621/555
+f 302/621/555 306/635/569 7881/399/279 7880/394/279
+f 301/633/567 7871/609/543 7870/608/542 306/635/569
+f 306/635/569 7870/608/542 12761/400/279 7881/399/279
+f 307/636/570 311/637/571 312/638/572 308/639/573
+f 308/639/573 312/638/572 7882/640/574 7883/641/575
+f 311/637/571 7886/378/279 7885/377/279 312/638/572
+f 312/638/572 7885/377/279 12763/368/279 7882/640/574
+f 307/636/570 308/639/573 313/642/576 309/643/577
+f 309/643/577 313/642/576 7951/644/578 7952/645/579
+f 308/639/573 7883/641/575 7884/646/580 313/642/576
+f 313/642/576 7884/646/580 12778/647/581 7951/644/578
+f 307/636/570 309/643/577 314/648/582 310/649/583
+f 310/649/583 314/648/582 7878/630/564 7877/625/559
+f 309/643/577 7952/645/579 7953/650/584 314/648/582
+f 314/648/582 7953/650/584 12777/631/565 7878/630/564
+f 307/636/570 310/649/583 315/651/585 311/637/571
+f 311/637/571 315/651/585 7887/383/279 7886/378/279
+f 310/649/583 7877/625/559 7876/624/558 315/651/585
+f 315/651/585 7876/624/558 12762/384/279 7887/383/279
+f 316/652/586 320/653/587 321/654/588 317/655/589
+f 317/655/589 321/654/588 7888/656/590 7889/657/591
+f 320/653/587 7892/362/279 7891/361/279 321/654/588
+f 321/654/588 7891/361/279 12764/352/279 7888/656/590
+f 316/652/586 317/655/589 322/658/592 318/659/593
+f 318/659/593 322/658/592 7954/660/594 7955/661/595
+f 317/655/589 7889/657/591 7890/662/596 322/658/592
+f 322/658/592 7890/662/596 12779/663/597 7954/660/594
+f 316/652/586 318/659/593 323/664/598 319/665/599
+f 319/665/599 323/664/598 7884/646/580 7883/641/575
+f 318/659/593 7955/661/595 7956/666/600 323/664/598
+f 323/664/598 7956/666/600 12778/647/581 7884/646/580
+f 316/652/586 319/665/599 324/667/601 320/653/587
+f 320/653/587 324/667/601 7893/367/279 7892/362/279
+f 319/665/599 7883/641/575 7882/640/574 324/667/601
+f 324/667/601 7882/640/574 12763/368/279 7893/367/279
+f 325/668/602 329/669/603 330/670/604 326/671/605
+f 326/671/605 330/670/604 7894/672/606 7895/673/607
+f 329/669/603 7898/346/279 7897/345/279 330/670/604
+f 330/670/604 7897/345/279 12765/336/279 7894/672/606
+f 325/668/602 326/671/605 331/674/608 327/675/609
+f 327/675/609 331/674/608 7957/676/610 7958/677/611
+f 326/671/605 7895/673/607 7896/678/612 331/674/608
+f 331/674/608 7896/678/612 12780/679/613 7957/676/610
+f 325/668/602 327/675/609 332/680/614 328/681/615
+f 328/681/615 332/680/614 7890/662/596 7889/657/591
+f 327/675/609 7958/677/611 7959/682/616 332/680/614
+f 332/680/614 7959/682/616 12779/663/597 7890/662/596
+f 325/668/602 328/681/615 333/683/617 329/669/603
+f 329/669/603 333/683/617 7899/351/279 7898/346/279
+f 328/681/615 7889/657/591 7888/656/590 333/683/617
+f 333/683/617 7888/656/590 12764/352/279 7899/351/279
+f 334/684/618 338/685/619 339/686/620 335/687/621
+f 335/687/621 339/686/620 7900/688/622 7901/689/623
+f 338/685/619 7904/330/279 7903/329/279 339/686/620
+f 339/686/620 7903/329/279 12766/320/279 7900/688/622
+f 334/684/618 335/687/621 340/690/624 336/691/625
+f 336/691/625 340/690/624 7960/692/626 7961/693/627
+f 335/687/621 7901/689/623 7902/694/628 340/690/624
+f 340/690/624 7902/694/628 12781/695/629 7960/692/626
+f 334/684/618 336/691/625 341/696/630 337/697/631
+f 337/697/631 341/696/630 7896/678/612 7895/673/607
+f 336/691/625 7961/693/627 7962/698/632 341/696/630
+f 341/696/630 7962/698/632 12780/679/613 7896/678/612
+f 334/684/618 337/697/631 342/699/633 338/685/619
+f 338/685/619 342/699/633 7905/335/279 7904/330/279
+f 337/697/631 7895/673/607 7894/672/606 342/699/633
+f 342/699/633 7894/672/606 12765/336/279 7905/335/279
+f 343/700/634 347/701/635 348/702/636 344/703/637
+f 344/703/637 348/702/636 7906/704/638 7907/705/639
+f 347/701/635 7910/314/279 7909/313/279 348/702/636
+f 348/702/636 7909/313/279 12767/304/279 7906/704/638
+f 343/700/634 344/703/637 349/706/640 345/707/641
+f 345/707/641 349/706/640 7963/708/642 7964/709/643
+f 344/703/637 7907/705/639 7908/710/644 349/706/640
+f 349/706/640 7908/710/644 12782/711/645 7963/708/642
+f 343/700/634 345/707/641 350/712/646 346/713/647
+f 346/713/647 350/712/646 7902/694/628 7901/689/623
+f 345/707/641 7964/709/643 7965/714/648 350/712/646
+f 350/712/646 7965/714/648 12781/695/629 7902/694/628
+f 343/700/634 346/713/647 351/715/649 347/701/635
+f 347/701/635 351/715/649 7911/319/279 7910/314/279
+f 346/713/647 7901/689/623 7900/688/622 351/715/649
+f 351/715/649 7900/688/622 12766/320/279 7911/319/279
+f 352/716/650 356/717/651 357/718/652 353/719/653
+f 353/719/653 357/718/652 7912/720/654 7913/721/655
+f 356/717/651 7916/298/279 7915/297/279 357/718/652
+f 357/718/652 7915/297/279 12768/288/279 7912/720/654
+f 352/716/650 353/719/653 358/722/656 354/723/657
+f 354/723/657 358/722/656 7966/724/658 7967/725/659
+f 353/719/653 7913/721/655 7914/726/660 358/722/656
+f 358/722/656 7914/726/660 12783/727/661 7966/724/658
+f 352/716/650 354/723/657 359/728/662 355/729/663
+f 355/729/663 359/728/662 7908/710/644 7907/705/639
+f 354/723/657 7967/725/659 7968/730/664 359/728/662
+f 359/728/662 7968/730/664 12782/711/645 7908/710/644
+f 352/716/650 355/729/663 360/731/665 356/717/651
+f 356/717/651 360/731/665 7917/303/279 7916/298/279
+f 355/729/663 7907/705/639 7906/704/638 360/731/665
+f 360/731/665 7906/704/638 12767/304/279 7917/303/279
+f 361/732/666 365/733/667 366/734/668 362/735/669
+f 362/735/669 366/734/668 7918/736/670 7919/737/671
+f 365/733/667 7922/280/279 7921/279/279 366/734/668
+f 366/734/668 7921/279/279 12769/282/279 7918/736/670
+f 361/732/666 362/735/669 367/738/672 363/739/673
+f 363/739/673 367/738/672 7969/740/674 7970/741/675
+f 362/735/669 7919/737/671 7920/742/676 367/738/672
+f 367/738/672 7920/742/676 12784/743/677 7969/740/674
+f 361/732/666 363/739/673 368/744/678 364/745/679
+f 364/745/679 368/744/678 7914/726/660 7913/721/655
+f 363/739/673 7970/741/675 7971/746/680 368/744/678
+f 368/744/678 7971/746/680 12783/727/661 7914/726/660
+f 361/732/666 364/745/679 369/747/681 365/733/667
+f 365/733/667 369/747/681 7923/287/279 7922/280/279
+f 364/745/679 7913/721/655 7912/720/654 369/747/681
+f 369/747/681 7912/720/654 12768/288/279 7923/287/279
+f 370/748/682 374/749/683 375/750/684 371/751/685
+f 371/751/685 375/750/684 8139/528/468 8138/521/463
+f 374/749/683 8147/752/451 8148/753/451 375/750/684
+f 375/750/684 8148/753/451 12813/529/451 8139/528/468
+f 370/748/682 371/751/685 376/754/686 372/755/687
+f 372/755/687 376/754/686 7927/756/688 7928/757/689
+f 371/751/685 8138/521/463 8137/520/462 376/754/686
+f 376/754/686 8137/520/462 12771/523/465 7927/756/688
+f 370/748/682 372/755/687 377/758/690 373/759/691
+f 373/759/691 377/758/690 9277/760/451 9278/761/451
+f 372/755/687 7928/757/689 7929/762/692 377/758/690
+f 377/758/690 7929/762/692 13006/763/451 9277/760/451
+f 370/748/682 373/759/691 378/764/451 374/749/683
+f 374/749/683 378/764/451 8146/765/451 8147/752/451
+f 373/759/691 9278/761/451 9279/766/451 378/764/451
+f 378/764/451 9279/766/451 13005/767/451 8146/765/451
+f 379/768/693 383/769/694 384/770/695 380/771/696
+f 380/771/696 384/770/695 9298/772/697 9299/773/698
+f 383/769/694 8327/774/699 8328/775/700 384/770/695
+f 384/770/695 8328/775/700 12961/776/701 9298/772/697
+f 379/768/693 380/771/696 385/777/702 381/778/703
+f 381/778/703 385/777/702 9301/779/704 9302/780/705
+f 380/771/696 9299/773/698 9300/781/706 385/777/702
+f 385/777/702 9300/781/706 13010/782/707 9301/779/704
+f 379/768/693 381/778/703 386/783/708 382/784/709
+f 382/784/709 386/783/708 8332/785/710 8333/786/711
+f 381/778/703 9302/780/705 9303/787/712 386/783/708
+f 386/783/708 9303/787/712 13009/788/713 8332/785/710
+f 379/768/693 382/784/709 387/789/714 383/769/694
+f 383/769/694 387/789/714 8326/790/715 8327/774/699
+f 382/784/709 8333/786/711 8334/791/716 387/789/714
+f 387/789/714 8334/791/716 12844/792/717 8326/790/715
+f 388/793/718 392/794/719 393/795/720 389/796/721
+f 389/796/721 393/795/720 9403/797/722 9404/798/723
+f 392/794/719 9389/799/724 9390/800/725 393/795/720
+f 393/795/720 9390/800/725 13025/801/726 9403/797/722
+f 388/793/718 389/796/721 394/802/727 390/803/728
+f 390/803/728 394/802/727 9400/804/729 9401/805/730
+f 389/796/721 9404/798/723 9405/806/731 394/802/727
+f 394/802/727 9405/806/731 13027/807/732 9400/804/729
+f 388/793/718 390/803/728 395/808/733 391/809/734
+f 391/809/734 395/808/733 9394/810/735 9395/811/736
+f 390/803/728 9401/805/730 9402/812/737 395/808/733
+f 395/808/733 9402/812/737 13026/813/738 9394/810/735
+f 388/793/718 391/809/734 396/814/739 392/794/719
+f 392/794/719 396/814/739 9388/815/740 9389/799/724
+f 391/809/734 9395/811/736 9396/816/741 396/814/739
+f 396/814/739 9396/816/741 13024/817/742 9388/815/740
+f 397/818/743 401/819/744 402/820/745 398/821/746
+f 398/821/746 402/820/745 9418/822/747 9419/823/748
+f 401/819/744 9410/824/749 9411/825/750 402/820/745
+f 402/820/745 9411/825/750 13028/826/751 9418/822/747
+f 397/818/743 398/821/746 403/827/752 399/828/753
+f 399/828/753 403/827/752 9415/829/754 9416/830/755
+f 398/821/746 9419/823/748 9420/831/756 403/827/752
+f 403/827/752 9420/831/756 13029/832/757 9415/829/754
+f 397/818/743 399/828/753 404/833/758 400/834/759
+f 400/834/759 404/833/758 9405/806/731 9404/798/723
+f 399/828/753 9416/830/755 9417/835/760 404/833/758
+f 404/833/758 9417/835/760 13027/807/732 9405/806/731
+f 397/818/743 400/834/759 405/836/761 401/819/744
+f 401/819/744 405/836/761 9409/837/762 9410/824/749
+f 400/834/759 9404/798/723 9403/797/722 405/836/761
+f 405/836/761 9403/797/722 13025/801/726 9409/837/762
+f 406/838/763 410/839/764 411/840/765 407/841/766
+f 407/841/766 411/840/765 9433/842/767 9434/843/768
+f 410/839/764 9425/844/769 9426/845/770 411/840/765
+f 411/840/765 9426/845/770 13030/846/771 9433/842/767
+f 406/838/763 407/841/766 412/847/772 408/848/773
+f 408/848/773 412/847/772 9430/849/774 9431/850/775
+f 407/841/766 9434/843/768 9435/851/776 412/847/772
+f 412/847/772 9435/851/776 13031/852/777 9430/849/774
+f 406/838/763 408/848/773 413/853/778 409/854/779
+f 409/854/779 413/853/778 9420/831/756 9419/823/748
+f 408/848/773 9431/850/775 9432/855/780 413/853/778
+f 413/853/778 9432/855/780 13029/832/757 9420/831/756
+f 406/838/763 409/854/779 414/856/781 410/839/764
+f 410/839/764 414/856/781 9424/857/782 9425/844/769
+f 409/854/779 9419/823/748 9418/822/747 414/856/781
+f 414/856/781 9418/822/747 13028/826/751 9424/857/782
+f 415/858/783 419/859/784 420/860/785 416/861/786
+f 416/861/786 420/860/785 9448/862/787 9449/863/788
+f 419/859/784 9440/864/789 9441/865/790 420/860/785
+f 420/860/785 9441/865/790 13032/866/791 9448/862/787
+f 415/858/783 416/861/786 421/867/792 417/868/793
+f 417/868/793 421/867/792 9445/869/794 9446/870/795
+f 416/861/786 9449/863/788 9450/871/796 421/867/792
+f 421/867/792 9450/871/796 13033/872/797 9445/869/794
+f 415/858/783 417/868/793 422/873/798 418/874/799
+f 418/874/799 422/873/798 9435/851/776 9434/843/768
+f 417/868/793 9446/870/795 9447/875/800 422/873/798
+f 422/873/798 9447/875/800 13031/852/777 9435/851/776
+f 415/858/783 418/874/799 423/876/801 419/859/784
+f 419/859/784 423/876/801 9439/877/802 9440/864/789
+f 418/874/799 9434/843/768 9433/842/767 423/876/801
+f 423/876/801 9433/842/767 13030/846/771 9439/877/802
+f 424/878/803 428/879/804 429/880/805 425/881/806
+f 425/881/806 429/880/805 9463/882/807 9464/883/808
+f 428/879/804 9455/884/809 9456/885/810 429/880/805
+f 429/880/805 9456/885/810 13034/886/811 9463/882/807
+f 424/878/803 425/881/806 430/887/812 426/888/813
+f 426/888/813 430/887/812 9460/889/814 9461/890/815
+f 425/881/806 9464/883/808 9465/891/816 430/887/812
+f 430/887/812 9465/891/816 13035/892/817 9460/889/814
+f 424/878/803 426/888/813 431/893/818 427/894/819
+f 427/894/819 431/893/818 9450/871/796 9449/863/788
+f 426/888/813 9461/890/815 9462/895/820 431/893/818
+f 431/893/818 9462/895/820 13033/872/797 9450/871/796
+f 424/878/803 427/894/819 432/896/821 428/879/804
+f 428/879/804 432/896/821 9454/897/822 9455/884/809
+f 427/894/819 9449/863/788 9448/862/787 432/896/821
+f 432/896/821 9448/862/787 13032/866/791 9454/897/822
+f 433/898/823 437/899/824 438/900/825 434/901/826
+f 434/901/826 438/900/825 9478/902/827 9479/903/828
+f 437/899/824 9470/904/829 9471/905/830 438/900/825
+f 438/900/825 9471/905/830 13036/906/831 9478/902/827
+f 433/898/823 434/901/826 439/907/832 435/908/833
+f 435/908/833 439/907/832 9475/909/834 9476/910/835
+f 434/901/826 9479/903/828 9480/911/836 439/907/832
+f 439/907/832 9480/911/836 13037/912/837 9475/909/834
+f 433/898/823 435/908/833 440/913/838 436/914/839
+f 436/914/839 440/913/838 9465/891/816 9464/883/808
+f 435/908/833 9476/910/835 9477/915/840 440/913/838
+f 440/913/838 9477/915/840 13035/892/817 9465/891/816
+f 433/898/823 436/914/839 441/916/841 437/899/824
+f 437/899/824 441/916/841 9469/917/842 9470/904/829
+f 436/914/839 9464/883/808 9463/882/807 441/916/841
+f 441/916/841 9463/882/807 13034/886/811 9469/917/842
+f 442/918/843 446/919/844 447/920/845 443/921/846
+f 443/921/846 447/920/845 9493/922/847 9494/923/848
+f 446/919/844 9485/924/849 9486/925/850 447/920/845
+f 447/920/845 9486/925/850 13038/926/851 9493/922/847
+f 442/918/843 443/921/846 448/927/852 444/928/853
+f 444/928/853 448/927/852 9490/929/854 9491/930/855
+f 443/921/846 9494/923/848 9495/931/856 448/927/852
+f 448/927/852 9495/931/856 13039/932/857 9490/929/854
+f 442/918/843 444/928/853 449/933/858 445/934/859
+f 445/934/859 449/933/858 9480/911/836 9479/903/828
+f 444/928/853 9491/930/855 9492/935/860 449/933/858
+f 449/933/858 9492/935/860 13037/912/837 9480/911/836
+f 442/918/843 445/934/859 450/936/861 446/919/844
+f 446/919/844 450/936/861 9484/937/862 9485/924/849
+f 445/934/859 9479/903/828 9478/902/827 450/936/861
+f 450/936/861 9478/902/827 13036/906/831 9484/937/862
+f 451/938/863 455/939/864 456/940/865 452/941/866
+f 452/941/866 456/940/865 9508/942/867 9509/943/868
+f 455/939/864 9500/944/869 9501/945/870 456/940/865
+f 456/940/865 9501/945/870 13040/946/871 9508/942/867
+f 451/938/863 452/941/866 457/947/872 453/948/873
+f 453/948/873 457/947/872 9505/949/874 9506/950/875
+f 452/941/866 9509/943/868 9510/951/876 457/947/872
+f 457/947/872 9510/951/876 13041/952/877 9505/949/874
+f 451/938/863 453/948/873 458/953/878 454/954/879
+f 454/954/879 458/953/878 9495/931/856 9494/923/848
+f 453/948/873 9506/950/875 9507/955/880 458/953/878
+f 458/953/878 9507/955/880 13039/932/857 9495/931/856
+f 451/938/863 454/954/879 459/956/881 455/939/864
+f 455/939/864 459/956/881 9499/957/882 9500/944/869
+f 454/954/879 9494/923/848 9493/922/847 459/956/881
+f 459/956/881 9493/922/847 13038/926/851 9499/957/882
+f 460/958/883 464/959/884 465/960/885 461/961/886
+f 461/961/886 465/960/885 9523/962/887 9524/963/888
+f 464/959/884 9515/964/889 9516/965/890 465/960/885
+f 465/960/885 9516/965/890 13042/966/891 9523/962/887
+f 460/958/883 461/961/886 466/967/892 462/968/893
+f 462/968/893 466/967/892 9520/969/894 9521/970/895
+f 461/961/886 9524/963/888 9525/971/896 466/967/892
+f 466/967/892 9525/971/896 13043/972/897 9520/969/894
+f 460/958/883 462/968/893 467/973/898 463/974/899
+f 463/974/899 467/973/898 9510/951/876 9509/943/868
+f 462/968/893 9521/970/895 9522/975/900 467/973/898
+f 467/973/898 9522/975/900 13041/952/877 9510/951/876
+f 460/958/883 463/974/899 468/976/901 464/959/884
+f 464/959/884 468/976/901 9514/977/902 9515/964/889
+f 463/974/899 9509/943/868 9508/942/867 468/976/901
+f 468/976/901 9508/942/867 13040/946/871 9514/977/902
+f 469/978/903 473/979/904 474/980/905 470/981/906
+f 470/981/906 474/980/905 9538/982/907 9539/983/908
+f 473/979/904 9530/984/909 9531/985/910 474/980/905
+f 474/980/905 9531/985/910 13044/986/911 9538/982/907
+f 469/978/903 470/981/906 475/987/912 471/988/913
+f 471/988/913 475/987/912 9535/989/914 9536/990/915
+f 470/981/906 9539/983/908 9540/991/916 475/987/912
+f 475/987/912 9540/991/916 13045/992/917 9535/989/914
+f 469/978/903 471/988/913 476/993/918 472/994/919
+f 472/994/919 476/993/918 9525/971/896 9524/963/888
+f 471/988/913 9536/990/915 9537/995/920 476/993/918
+f 476/993/918 9537/995/920 13043/972/897 9525/971/896
+f 469/978/903 472/994/919 477/996/921 473/979/904
+f 473/979/904 477/996/921 9529/997/922 9530/984/909
+f 472/994/919 9524/963/888 9523/962/887 477/996/921
+f 477/996/921 9523/962/887 13042/966/891 9529/997/922
+f 478/998/923 482/999/924 483/1000/925 479/1001/926
+f 479/1001/926 483/1000/925 9553/1002/927 9554/1003/928
+f 482/999/924 9545/1004/929 9546/1005/930 483/1000/925
+f 483/1000/925 9546/1005/930 13046/1006/931 9553/1002/927
+f 478/998/923 479/1001/926 484/1007/932 480/1008/933
+f 480/1008/933 484/1007/932 9550/1009/934 9551/1010/935
+f 479/1001/926 9554/1003/928 9555/1011/936 484/1007/932
+f 484/1007/932 9555/1011/936 13047/1012/937 9550/1009/934
+f 478/998/923 480/1008/933 485/1013/938 481/1014/939
+f 481/1014/939 485/1013/938 9540/991/916 9539/983/908
+f 480/1008/933 9551/1010/935 9552/1015/940 485/1013/938
+f 485/1013/938 9552/1015/940 13045/992/917 9540/991/916
+f 478/998/923 481/1014/939 486/1016/941 482/999/924
+f 482/999/924 486/1016/941 9544/1017/942 9545/1004/929
+f 481/1014/939 9539/983/908 9538/982/907 486/1016/941
+f 486/1016/941 9538/982/907 13044/986/911 9544/1017/942
+f 487/1018/943 491/1019/944 492/1020/945 488/1021/946
+f 488/1021/946 492/1020/945 9568/1022/947 9569/1023/948
+f 491/1019/944 9560/1024/949 9561/1025/950 492/1020/945
+f 492/1020/945 9561/1025/950 13048/1026/951 9568/1022/947
+f 487/1018/943 488/1021/946 493/1027/952 489/1028/953
+f 489/1028/953 493/1027/952 9565/1029/954 9566/1030/955
+f 488/1021/946 9569/1023/948 9570/1031/956 493/1027/952
+f 493/1027/952 9570/1031/956 13049/1032/957 9565/1029/954
+f 487/1018/943 489/1028/953 494/1033/958 490/1034/959
+f 490/1034/959 494/1033/958 9555/1011/936 9554/1003/928
+f 489/1028/953 9566/1030/955 9567/1035/960 494/1033/958
+f 494/1033/958 9567/1035/960 13047/1012/937 9555/1011/936
+f 487/1018/943 490/1034/959 495/1036/961 491/1019/944
+f 491/1019/944 495/1036/961 9559/1037/962 9560/1024/949
+f 490/1034/959 9554/1003/928 9553/1002/927 495/1036/961
+f 495/1036/961 9553/1002/927 13046/1006/931 9559/1037/962
+f 496/1038/963 500/1039/964 501/1040/965 497/1041/966
+f 497/1041/966 501/1040/965 7972/1042/967 7973/1043/968
+f 500/1039/964 7793/1044/969 7794/1045/970 501/1040/965
+f 501/1040/965 7794/1045/970 12740/1046/971 7972/1042/967
+f 496/1038/963 497/1041/966 502/1047/972 498/1048/973
+f 498/1048/973 502/1047/972 8224/1049/974 8225/1050/975
+f 497/1041/966 7973/1043/968 7974/1051/976 502/1047/972
+f 502/1047/972 7974/1051/976 12827/1052/977 8224/1049/974
+f 496/1038/963 498/1048/973 503/1053/978 499/1054/979
+f 499/1054/979 503/1053/978 7975/1055/980 7976/1056/981
+f 498/1048/973 8225/1050/975 8226/1057/982 503/1053/978
+f 503/1053/978 8226/1057/982 12826/1058/983 7975/1055/980
+f 496/1038/963 499/1054/979 504/1059/984 500/1039/964
+f 500/1039/964 504/1059/984 7792/1060/985 7793/1044/969
+f 499/1054/979 7976/1056/981 7977/1061/986 504/1059/984
+f 504/1059/984 7977/1061/986 12741/1062/987 7792/1060/985
+f 505/1063/988 509/1064/989 510/1065/990 506/1066/991
+f 506/1066/991 510/1065/990 7977/1061/986 7976/1056/981
+f 509/1064/989 7796/1067/992 7797/1068/993 510/1065/990
+f 510/1065/990 7797/1068/993 12741/1062/987 7977/1061/986
+f 505/1063/988 506/1066/991 511/1069/994 507/1070/995
+f 507/1070/995 511/1069/994 8218/1071/996 8219/1072/997
+f 506/1066/991 7976/1056/981 7975/1055/980 511/1069/994
+f 511/1069/994 7975/1055/980 12826/1058/983 8218/1071/996
+f 505/1063/988 507/1070/995 512/1073/998 508/1074/999
+f 508/1074/999 512/1073/998 7981/1075/1000 7982/1076/1001
+f 507/1070/995 8219/1072/997 8220/1077/1002 512/1073/998
+f 512/1073/998 8220/1077/1002 12825/1078/1003 7981/1075/1000
+f 505/1063/988 508/1074/999 513/1079/1004 509/1064/989
+f 509/1064/989 513/1079/1004 7795/1080/1005 7796/1067/992
+f 508/1074/999 7982/1076/1001 7983/1081/1006 513/1079/1004
+f 513/1079/1004 7983/1081/1006 12742/1082/1007 7795/1080/1005
+f 514/1083/1008 518/1084/1009 519/1085/1010 515/1086/1011
+f 515/1086/1011 519/1085/1010 7983/1081/1006 7982/1076/1001
+f 518/1084/1009 7799/1087/1012 7800/1088/1013 519/1085/1010
+f 519/1085/1010 7800/1088/1013 12742/1082/1007 7983/1081/1006
+f 514/1083/1008 515/1086/1011 520/1089/1014 516/1090/1015
+f 516/1090/1015 520/1089/1014 8212/1091/1016 8213/1092/1017
+f 515/1086/1011 7982/1076/1001 7981/1075/1000 520/1089/1014
+f 520/1089/1014 7981/1075/1000 12825/1078/1003 8212/1091/1016
+f 514/1083/1008 516/1090/1015 521/1093/1018 517/1094/1019
+f 517/1094/1019 521/1093/1018 7987/1095/1020 7988/1096/1021
+f 516/1090/1015 8213/1092/1017 8214/1097/1022 521/1093/1018
+f 521/1093/1018 8214/1097/1022 12824/1098/1023 7987/1095/1020
+f 514/1083/1008 517/1094/1019 522/1099/1024 518/1084/1009
+f 518/1084/1009 522/1099/1024 7798/1100/1025 7799/1087/1012
+f 517/1094/1019 7988/1096/1021 7989/1101/1026 522/1099/1024
+f 522/1099/1024 7989/1101/1026 12743/1102/1027 7798/1100/1025
+f 523/1103/1028 527/1104/1029 528/1105/1030 524/1106/1031
+f 524/1106/1031 528/1105/1030 7989/1101/1026 7988/1096/1021
+f 527/1104/1029 7802/1107/1032 7803/1108/1033 528/1105/1030
+f 528/1105/1030 7803/1108/1033 12743/1102/1027 7989/1101/1026
+f 523/1103/1028 524/1106/1031 529/1109/1034 525/1110/1035
+f 525/1110/1035 529/1109/1034 8206/1111/1036 8207/1112/1037
+f 524/1106/1031 7988/1096/1021 7987/1095/1020 529/1109/1034
+f 529/1109/1034 7987/1095/1020 12824/1098/1023 8206/1111/1036
+f 523/1103/1028 525/1110/1035 530/1113/1038 526/1114/1039
+f 526/1114/1039 530/1113/1038 7993/1115/1040 7994/1116/1041
+f 525/1110/1035 8207/1112/1037 8208/1117/1042 530/1113/1038
+f 530/1113/1038 8208/1117/1042 12823/1118/451 7993/1115/1040
+f 523/1103/1028 526/1114/1039 531/1119/1043 527/1104/1029
+f 527/1104/1029 531/1119/1043 7801/1120/1044 7802/1107/1032
+f 526/1114/1039 7994/1116/1041 7995/1121/1045 531/1119/1043
+f 531/1119/1043 7995/1121/1045 12744/1122/1046 7801/1120/1044
+f 532/1123/1047 536/1124/1048 537/1125/1049 533/1126/1050
+f 533/1126/1050 537/1125/1049 7995/1121/1045 7994/1116/1041
+f 536/1124/1048 7805/1127/1051 7806/1128/1052 537/1125/1049
+f 537/1125/1049 7806/1128/1052 12744/1122/1046 7995/1121/1045
+f 532/1123/1047 533/1126/1050 538/1129/1053 534/1130/1054
+f 534/1130/1054 538/1129/1053 8200/1131/1055 8201/1132/1056
+f 533/1126/1050 7994/1116/1041 7993/1115/1040 538/1129/1053
+f 538/1129/1053 7993/1115/1040 12823/1118/451 8200/1131/1055
+f 532/1123/1047 534/1130/1054 539/1133/1057 535/1134/1058
+f 535/1134/1058 539/1133/1057 7999/1135/1059 8000/1136/1060
+f 534/1130/1054 8201/1132/1056 8202/1137/1061 539/1133/1057
+f 539/1133/1057 8202/1137/1061 12822/1138/1062 7999/1135/1059
+f 532/1123/1047 535/1134/1058 540/1139/1063 536/1124/1048
+f 536/1124/1048 540/1139/1063 7804/1140/1064 7805/1127/1051
+f 535/1134/1058 8000/1136/1060 8001/1141/1065 540/1139/1063
+f 540/1139/1063 8001/1141/1065 12745/1142/1066 7804/1140/1064
+f 541/1143/1067 545/1144/1068 546/1145/1069 542/1146/1070
+f 542/1146/1070 546/1145/1069 8001/1141/1065 8000/1136/1060
+f 545/1144/1068 7808/1147/1071 7809/1148/1072 546/1145/1069
+f 546/1145/1069 7809/1148/1072 12745/1142/1066 8001/1141/1065
+f 541/1143/1067 542/1146/1070 547/1149/1073 543/1150/1074
+f 543/1150/1074 547/1149/1073 8194/1151/1075 8195/1152/1076
+f 542/1146/1070 8000/1136/1060 7999/1135/1059 547/1149/1073
+f 547/1149/1073 7999/1135/1059 12822/1138/1062 8194/1151/1075
+f 541/1143/1067 543/1150/1074 548/1153/1077 544/1154/1078
+f 544/1154/1078 548/1153/1077 8005/1155/1079 8006/1156/1080
+f 543/1150/1074 8195/1152/1076 8196/1157/1081 548/1153/1077
+f 548/1153/1077 8196/1157/1081 12821/1158/1082 8005/1155/1079
+f 541/1143/1067 544/1154/1078 549/1159/1083 545/1144/1068
+f 545/1144/1068 549/1159/1083 7807/1160/1084 7808/1147/1071
+f 544/1154/1078 8006/1156/1080 8007/1161/1085 549/1159/1083
+f 549/1159/1083 8007/1161/1085 12746/1162/1086 7807/1160/1084
+f 550/1163/1087 554/1164/1088 555/1165/1089 551/1166/1090
+f 551/1166/1090 555/1165/1089 8007/1161/1085 8006/1156/1080
+f 554/1164/1088 7811/1167/1091 7812/1168/1092 555/1165/1089
+f 555/1165/1089 7812/1168/1092 12746/1162/1086 8007/1161/1085
+f 550/1163/1087 551/1166/1090 556/1169/1093 552/1170/1094
+f 552/1170/1094 556/1169/1093 8188/1171/1095 8189/1172/1096
+f 551/1166/1090 8006/1156/1080 8005/1155/1079 556/1169/1093
+f 556/1169/1093 8005/1155/1079 12821/1158/1082 8188/1171/1095
+f 550/1163/1087 552/1170/1094 557/1173/1097 553/1174/1098
+f 553/1174/1098 557/1173/1097 8011/1175/1099 8012/1176/1100
+f 552/1170/1094 8189/1172/1096 8190/1177/1101 557/1173/1097
+f 557/1173/1097 8190/1177/1101 12820/1178/1102 8011/1175/1099
+f 550/1163/1087 553/1174/1098 558/1179/1103 554/1164/1088
+f 554/1164/1088 558/1179/1103 7810/1180/1104 7811/1167/1091
+f 553/1174/1098 8012/1176/1100 8013/1181/1105 558/1179/1103
+f 558/1179/1103 8013/1181/1105 12747/1182/1106 7810/1180/1104
+f 559/1183/1107 563/1184/1108 564/1185/1109 560/1186/1110
+f 560/1186/1110 564/1185/1109 8013/1181/1105 8012/1176/1100
+f 563/1184/1108 7814/1187/1111 7815/1188/1112 564/1185/1109
+f 564/1185/1109 7815/1188/1112 12747/1182/1106 8013/1181/1105
+f 559/1183/1107 560/1186/1110 565/1189/1113 561/1190/1114
+f 561/1190/1114 565/1189/1113 8182/1191/1115 8183/1192/1116
+f 560/1186/1110 8012/1176/1100 8011/1175/1099 565/1189/1113
+f 565/1189/1113 8011/1175/1099 12820/1178/1102 8182/1191/1115
+f 559/1183/1107 561/1190/1114 566/1193/1117 562/1194/1118
+f 562/1194/1118 566/1193/1117 8017/1195/1119 8018/1196/1120
+f 561/1190/1114 8183/1192/1116 8184/1197/1121 566/1193/1117
+f 566/1193/1117 8184/1197/1121 12819/1198/1122 8017/1195/1119
+f 559/1183/1107 562/1194/1118 567/1199/1123 563/1184/1108
+f 563/1184/1108 567/1199/1123 7813/1200/1124 7814/1187/1111
+f 562/1194/1118 8018/1196/1120 8019/1201/1125 567/1199/1123
+f 567/1199/1123 8019/1201/1125 12748/1202/1126 7813/1200/1124
+f 568/1203/1127 572/1204/1128 573/1205/1129 569/1206/1130
+f 569/1206/1130 573/1205/1129 8019/1201/1125 8018/1196/1120
+f 572/1204/1128 7817/1207/1131 7818/1208/1132 573/1205/1129
+f 573/1205/1129 7818/1208/1132 12748/1202/1126 8019/1201/1125
+f 568/1203/1127 569/1206/1130 574/1209/1133 570/1210/1134
+f 570/1210/1134 574/1209/1133 8176/1211/1135 8177/1212/1136
+f 569/1206/1130 8018/1196/1120 8017/1195/1119 574/1209/1133
+f 574/1209/1133 8017/1195/1119 12819/1198/1122 8176/1211/1135
+f 568/1203/1127 570/1210/1134 575/1213/1137 571/1214/1138
+f 571/1214/1138 575/1213/1137 8023/1215/1139 8024/1216/1140
+f 570/1210/1134 8177/1212/1136 8178/1217/1141 575/1213/1137
+f 575/1213/1137 8178/1217/1141 12818/1218/1142 8023/1215/1139
+f 568/1203/1127 571/1214/1138 576/1219/1143 572/1204/1128
+f 572/1204/1128 576/1219/1143 7816/1220/1144 7817/1207/1131
+f 571/1214/1138 8024/1216/1140 8025/1221/1145 576/1219/1143
+f 576/1219/1143 8025/1221/1145 12749/1222/1146 7816/1220/1144
+f 577/1223/1147 581/1224/1148 582/1225/1149 578/1226/1150
+f 578/1226/1150 582/1225/1149 8025/1221/1145 8024/1216/1140
+f 581/1224/1148 7820/1227/1151 7821/1228/1152 582/1225/1149
+f 582/1225/1149 7821/1228/1152 12749/1222/1146 8025/1221/1145
+f 577/1223/1147 578/1226/1150 583/1229/1153 579/1230/1154
+f 579/1230/1154 583/1229/1153 8170/1231/1155 8171/1232/1156
+f 578/1226/1150 8024/1216/1140 8023/1215/1139 583/1229/1153
+f 583/1229/1153 8023/1215/1139 12818/1218/1142 8170/1231/1155
+f 577/1223/1147 579/1230/1154 584/1233/1157 580/1234/1158
+f 580/1234/1158 584/1233/1157 8029/1235/1159 8030/1236/1160
+f 579/1230/1154 8171/1232/1156 8172/1237/1161 584/1233/1157
+f 584/1233/1157 8172/1237/1161 12817/1238/1162 8029/1235/1159
+f 577/1223/1147 580/1234/1158 585/1239/1163 581/1224/1148
+f 581/1224/1148 585/1239/1163 7819/1240/1164 7820/1227/1151
+f 580/1234/1158 8030/1236/1160 8031/1241/1165 585/1239/1163
+f 585/1239/1163 8031/1241/1165 12750/1242/1166 7819/1240/1164
+f 586/1243/1167 590/1244/1168 591/1245/1169 587/1246/1170
+f 587/1246/1170 591/1245/1169 8031/1241/1165 8030/1236/1160
+f 590/1244/1168 7823/1247/1171 7824/1248/1172 591/1245/1169
+f 591/1245/1169 7824/1248/1172 12750/1242/1166 8031/1241/1165
+f 586/1243/1167 587/1246/1170 592/1249/1173 588/1250/1174
+f 588/1250/1174 592/1249/1173 8164/1251/1175 8165/1252/1176
+f 587/1246/1170 8030/1236/1160 8029/1235/1159 592/1249/1173
+f 592/1249/1173 8029/1235/1159 12817/1238/1162 8164/1251/1175
+f 586/1243/1167 588/1250/1174 593/1253/1177 589/1254/1178
+f 589/1254/1178 593/1253/1177 8035/1255/1179 8036/1256/1180
+f 588/1250/1174 8165/1252/1176 8166/1257/1181 593/1253/1177
+f 593/1253/1177 8166/1257/1181 12816/1258/1182 8035/1255/1179
+f 586/1243/1167 589/1254/1178 594/1259/1183 590/1244/1168
+f 590/1244/1168 594/1259/1183 7822/1260/1184 7823/1247/1171
+f 589/1254/1178 8036/1256/1180 8037/1261/1185 594/1259/1183
+f 594/1259/1183 8037/1261/1185 12751/1262/1186 7822/1260/1184
+f 595/1263/1187 599/1264/1188 600/1265/1189 596/1266/1190
+f 596/1266/1190 600/1265/1189 8037/1261/1185 8036/1256/1180
+f 599/1264/1188 7826/1267/1191 7827/1268/1192 600/1265/1189
+f 600/1265/1189 7827/1268/1192 12751/1262/1186 8037/1261/1185
+f 595/1263/1187 596/1266/1190 601/1269/1193 597/1270/1194
+f 597/1270/1194 601/1269/1193 8158/1271/1195 8159/1272/1196
+f 596/1266/1190 8036/1256/1180 8035/1255/1179 601/1269/1193
+f 601/1269/1193 8035/1255/1179 12816/1258/1182 8158/1271/1195
+f 595/1263/1187 597/1270/1194 602/1273/1197 598/1274/1198
+f 598/1274/1198 602/1273/1197 8041/1275/1199 8042/1276/1200
+f 597/1270/1194 8159/1272/1196 8160/1277/1201 602/1273/1197
+f 602/1273/1197 8160/1277/1201 12815/1278/1202 8041/1275/1199
+f 595/1263/1187 598/1274/1198 603/1279/1203 599/1264/1188
+f 599/1264/1188 603/1279/1203 7825/1280/1204 7826/1267/1191
+f 598/1274/1198 8042/1276/1200 8043/1281/1205 603/1279/1203
+f 603/1279/1203 8043/1281/1205 12752/1282/1206 7825/1280/1204
+f 604/1283/1207 608/1284/1208 609/1285/1209 605/1286/1210
+f 605/1286/1210 609/1285/1209 8989/1287/1211 8990/1288/1212
+f 608/1284/1208 8987/1289/1213 8988/1290/1214 609/1285/1209
+f 609/1285/1209 8988/1290/1214 12957/1291/1215 8989/1287/1211
+f 604/1283/1207 605/1286/1210 610/1292/1216 606/1293/1217
+f 606/1293/1217 610/1292/1216 8152/1294/1218 8153/1295/1219
+f 605/1286/1210 8990/1288/1212 8991/1296/1220 610/1292/1216
+f 610/1292/1216 8991/1296/1220 12956/1297/1221 8152/1294/1218
+f 604/1283/1207 606/1293/1217 611/1298/1222 607/1299/1223
+f 607/1299/1223 611/1298/1222 7831/1300/1224 7832/1301/1225
+f 606/1293/1217 8153/1295/1219 8154/1302/1226 611/1298/1222
+f 611/1298/1222 8154/1302/1226 12814/1303/1227 7831/1300/1224
+f 604/1283/1207 607/1299/1223 612/1304/1228 608/1284/1208
+f 608/1284/1208 612/1304/1228 8986/1305/1229 8987/1289/1213
+f 607/1299/1223 7832/1301/1225 7833/1306/1230 612/1304/1228
+f 612/1304/1228 7833/1306/1230 12753/1307/1231 8986/1305/1229
+f 613/1308/1232 617/1309/1233 618/1310/1234 614/1311/1235
+f 614/1311/1235 618/1310/1234 7789/1312/1236 7790/1313/1237
+f 617/1309/1233 7631/1314/1238 7632/1315/1239 618/1310/1234
+f 618/1310/1234 7632/1315/1239 12712/1316/1240 7789/1312/1236
+f 613/1308/1232 614/1311/1235 619/1317/1241 615/1318/1242
+f 615/1318/1242 619/1317/1241 8058/8/8 8057/7/7
+f 614/1311/1235 7790/1313/1237 7791/1319/1243 619/1317/1241
+f 619/1317/1241 7791/1319/1243 12798/9/9 8058/8/8
+f 613/1308/1232 615/1318/1242 620/1320/1244 616/1321/1245
+f 616/1321/1245 620/1320/1244 7786/1322/1246 7787/1323/1247
+f 615/1318/1242 8057/7/7 8056/23/23 620/1320/1244
+f 620/1320/1244 8056/23/23 12799/25/25 7786/1322/1246
+f 613/1308/1232 616/1321/1245 621/1324/1248 617/1309/1233
+f 617/1309/1233 621/1324/1248 7630/1325/1249 7631/1314/1238
+f 616/1321/1245 7787/1323/1247 7788/1326/1250 621/1324/1248
+f 621/1324/1248 7788/1326/1250 12713/1327/1251 7630/1325/1249
+f 622/1328/1252 626/1329/1253 627/1330/1254 623/1331/1255
+f 623/1331/1255 627/1330/1254 7788/1326/1250 7787/1323/1247
+f 626/1329/1253 7634/1332/1256 7635/1333/1257 627/1330/1254
+f 627/1330/1254 7635/1333/1257 12713/1327/1251 7788/1326/1250
+f 622/1328/1252 623/1331/1255 628/1334/1258 624/1335/1259
+f 624/1335/1259 628/1334/1258 8064/31/31 8063/30/30
+f 623/1331/1255 7787/1323/1247 7786/1322/1246 628/1334/1258
+f 628/1334/1258 7786/1322/1246 12799/25/25 8064/31/31
+f 622/1328/1252 624/1335/1259 629/1336/1260 625/1337/1261
+f 625/1337/1261 629/1336/1260 7783/1338/1262 7784/1339/1263
+f 624/1335/1259 8063/30/30 8062/43/43 629/1336/1260
+f 629/1336/1260 8062/43/43 12800/45/45 7783/1338/1262
+f 622/1328/1252 625/1337/1261 630/1340/1264 626/1329/1253
+f 626/1329/1253 630/1340/1264 7633/1341/1265 7634/1332/1256
+f 625/1337/1261 7784/1339/1263 7785/1342/1266 630/1340/1264
+f 630/1340/1264 7785/1342/1266 12714/1343/1267 7633/1341/1265
+f 631/1344/1268 635/1345/1269 636/1346/1270 632/1347/1271
+f 632/1347/1271 636/1346/1270 7785/1342/1266 7784/1339/1263
+f 635/1345/1269 7637/1348/1272 7638/1349/1273 636/1346/1270
+f 636/1346/1270 7638/1349/1273 12714/1343/1267 7785/1342/1266
+f 631/1344/1268 632/1347/1271 637/1350/1274 633/1351/1275
+f 633/1351/1275 637/1350/1274 8070/51/51 8069/50/50
+f 632/1347/1271 7784/1339/1263 7783/1338/1262 637/1350/1274
+f 637/1350/1274 7783/1338/1262 12800/45/45 8070/51/51
+f 631/1344/1268 633/1351/1275 638/1352/1276 634/1353/1277
+f 634/1353/1277 638/1352/1276 7780/1354/1278 7781/1355/1279
+f 633/1351/1275 8069/50/50 8068/63/63 638/1352/1276
+f 638/1352/1276 8068/63/63 12801/65/65 7780/1354/1278
+f 631/1344/1268 634/1353/1277 639/1356/1280 635/1345/1269
+f 635/1345/1269 639/1356/1280 7636/1357/1281 7637/1348/1272
+f 634/1353/1277 7781/1355/1279 7782/1358/1282 639/1356/1280
+f 639/1356/1280 7782/1358/1282 12715/1359/1283 7636/1357/1281
+f 640/1360/1284 644/1361/1285 645/1362/1286 641/1363/1287
+f 641/1363/1287 645/1362/1286 7782/1358/1282 7781/1355/1279
+f 644/1361/1285 7640/1364/1288 7641/1365/1289 645/1362/1286
+f 645/1362/1286 7641/1365/1289 12715/1359/1283 7782/1358/1282
+f 640/1360/1284 641/1363/1287 646/1366/1290 642/1367/1291
+f 642/1367/1291 646/1366/1290 8076/71/71 8075/70/70
+f 641/1363/1287 7781/1355/1279 7780/1354/1278 646/1366/1290
+f 646/1366/1290 7780/1354/1278 12801/65/65 8076/71/71
+f 640/1360/1284 642/1367/1291 647/1368/1292 643/1369/1293
+f 643/1369/1293 647/1368/1292 7777/1370/1294 7778/1371/1295
+f 642/1367/1291 8075/70/70 8074/83/83 647/1368/1292
+f 647/1368/1292 8074/83/83 12802/85/85 7777/1370/1294
+f 640/1360/1284 643/1369/1293 648/1372/1296 644/1361/1285
+f 644/1361/1285 648/1372/1296 7639/1373/1297 7640/1364/1288
+f 643/1369/1293 7778/1371/1295 7779/1374/1298 648/1372/1296
+f 648/1372/1296 7779/1374/1298 12716/1375/1299 7639/1373/1297
+f 649/1376/1300 653/1377/1301 654/1378/1302 650/1379/1303
+f 650/1379/1303 654/1378/1302 7779/1374/1298 7778/1371/1295
+f 653/1377/1301 7643/1380/1304 7644/1381/1305 654/1378/1302
+f 654/1378/1302 7644/1381/1305 12716/1375/1299 7779/1374/1298
+f 649/1376/1300 650/1379/1303 655/1382/1306 651/1383/1307
+f 651/1383/1307 655/1382/1306 8082/91/91 8081/90/90
+f 650/1379/1303 7778/1371/1295 7777/1370/1294 655/1382/1306
+f 655/1382/1306 7777/1370/1294 12802/85/85 8082/91/91
+f 649/1376/1300 651/1383/1307 656/1384/1308 652/1385/1309
+f 652/1385/1309 656/1384/1308 7774/1386/1310 7775/1387/1311
+f 651/1383/1307 8081/90/90 8080/103/103 656/1384/1308
+f 656/1384/1308 8080/103/103 12803/105/105 7774/1386/1310
+f 649/1376/1300 652/1385/1309 657/1388/1312 653/1377/1301
+f 653/1377/1301 657/1388/1312 7642/1389/1313 7643/1380/1304
+f 652/1385/1309 7775/1387/1311 7776/1390/1314 657/1388/1312
+f 657/1388/1312 7776/1390/1314 12717/1391/1315 7642/1389/1313
+f 658/1392/1316 662/1393/1317 663/1394/1318 659/1395/1319
+f 659/1395/1319 663/1394/1318 7776/1390/1314 7775/1387/1311
+f 662/1393/1317 7646/1396/1320 7647/1397/1321 663/1394/1318
+f 663/1394/1318 7647/1397/1321 12717/1391/1315 7776/1390/1314
+f 658/1392/1316 659/1395/1319 664/1398/1322 660/1399/1323
+f 660/1399/1323 664/1398/1322 8088/111/111 8087/110/110
+f 659/1395/1319 7775/1387/1311 7774/1386/1310 664/1398/1322
+f 664/1398/1322 7774/1386/1310 12803/105/105 8088/111/111
+f 658/1392/1316 660/1399/1323 665/1400/1324 661/1401/1325
+f 661/1401/1325 665/1400/1324 7771/1402/1326 7772/1403/1327
+f 660/1399/1323 8087/110/110 8086/123/123 665/1400/1324
+f 665/1400/1324 8086/123/123 12804/125/125 7771/1402/1326
+f 658/1392/1316 661/1401/1325 666/1404/1328 662/1393/1317
+f 662/1393/1317 666/1404/1328 7645/1405/1329 7646/1396/1320
+f 661/1401/1325 7772/1403/1327 7773/1406/1330 666/1404/1328
+f 666/1404/1328 7773/1406/1330 12718/1407/1331 7645/1405/1329
+f 667/1408/1332 671/1409/1333 672/1410/1334 668/1411/1335
+f 668/1411/1335 672/1410/1334 7773/1406/1330 7772/1403/1327
+f 671/1409/1333 7649/1412/1336 7650/1413/1337 672/1410/1334
+f 672/1410/1334 7650/1413/1337 12718/1407/1331 7773/1406/1330
+f 667/1408/1332 668/1411/1335 673/1414/1338 669/1415/1339
+f 669/1415/1339 673/1414/1338 8094/131/131 8093/130/130
+f 668/1411/1335 7772/1403/1327 7771/1402/1326 673/1414/1338
+f 673/1414/1338 7771/1402/1326 12804/125/125 8094/131/131
+f 667/1408/1332 669/1415/1339 674/1416/1340 670/1417/1341
+f 670/1417/1341 674/1416/1340 7768/1418/1342 7769/1419/1343
+f 669/1415/1339 8093/130/130 8092/143/143 674/1416/1340
+f 674/1416/1340 8092/143/143 12805/145/145 7768/1418/1342
+f 667/1408/1332 670/1417/1341 675/1420/1344 671/1409/1333
+f 671/1409/1333 675/1420/1344 7648/1421/1345 7649/1412/1336
+f 670/1417/1341 7769/1419/1343 7770/1422/1346 675/1420/1344
+f 675/1420/1344 7770/1422/1346 12719/1423/1347 7648/1421/1345
+f 676/1424/1348 680/1425/1349 681/1426/1350 677/1427/1351
+f 677/1427/1351 681/1426/1350 7770/1422/1346 7769/1419/1343
+f 680/1425/1349 7652/1428/1352 7653/1429/1353 681/1426/1350
+f 681/1426/1350 7653/1429/1353 12719/1423/1347 7770/1422/1346
+f 676/1424/1348 677/1427/1351 682/1430/1354 678/1431/1355
+f 678/1431/1355 682/1430/1354 8100/151/151 8099/150/150
+f 677/1427/1351 7769/1419/1343 7768/1418/1342 682/1430/1354
+f 682/1430/1354 7768/1418/1342 12805/145/145 8100/151/151
+f 676/1424/1348 678/1431/1355 683/1432/1356 679/1433/1357
+f 679/1433/1357 683/1432/1356 7765/1434/1358 7766/1435/1359
+f 678/1431/1355 8099/150/150 8098/163/163 683/1432/1356
+f 683/1432/1356 8098/163/163 12806/165/165 7765/1434/1358
+f 676/1424/1348 679/1433/1357 684/1436/1360 680/1425/1349
+f 680/1425/1349 684/1436/1360 7651/1437/1361 7652/1428/1352
+f 679/1433/1357 7766/1435/1359 7767/1438/1362 684/1436/1360
+f 684/1436/1360 7767/1438/1362 12720/1439/1363 7651/1437/1361
+f 685/1440/1364 689/1441/1365 690/1442/1366 686/1443/1367
+f 686/1443/1367 690/1442/1366 7767/1438/1362 7766/1435/1359
+f 689/1441/1365 7655/1444/1368 7656/1445/1369 690/1442/1366
+f 690/1442/1366 7656/1445/1369 12720/1439/1363 7767/1438/1362
+f 685/1440/1364 686/1443/1367 691/1446/1370 687/1447/1371
+f 687/1447/1371 691/1446/1370 8106/171/171 8105/170/170
+f 686/1443/1367 7766/1435/1359 7765/1434/1358 691/1446/1370
+f 691/1446/1370 7765/1434/1358 12806/165/165 8106/171/171
+f 685/1440/1364 687/1447/1371 692/1448/1372 688/1449/1373
+f 688/1449/1373 692/1448/1372 7762/1450/1374 7763/1451/1375
+f 687/1447/1371 8105/170/170 8104/183/183 692/1448/1372
+f 692/1448/1372 8104/183/183 12807/185/185 7762/1450/1374
+f 685/1440/1364 688/1449/1373 693/1452/1376 689/1441/1365
+f 689/1441/1365 693/1452/1376 7654/1453/1377 7655/1444/1368
+f 688/1449/1373 7763/1451/1375 7764/1454/1378 693/1452/1376
+f 693/1452/1376 7764/1454/1378 12721/1455/1379 7654/1453/1377
+f 694/1456/1380 698/1457/1381 699/1458/1382 695/1459/1383
+f 695/1459/1383 699/1458/1382 7764/1454/1378 7763/1451/1375
+f 698/1457/1381 7658/1460/1384 7659/1461/1385 699/1458/1382
+f 699/1458/1382 7659/1461/1385 12721/1455/1379 7764/1454/1378
+f 694/1456/1380 695/1459/1383 700/1462/1386 696/1463/1387
+f 696/1463/1387 700/1462/1386 8112/191/191 8111/190/190
+f 695/1459/1383 7763/1451/1375 7762/1450/1374 700/1462/1386
+f 700/1462/1386 7762/1450/1374 12807/185/185 8112/191/191
+f 694/1456/1380 696/1463/1387 701/1464/1388 697/1465/1389
+f 697/1465/1389 701/1464/1388 7759/1466/1390 7760/1467/1391
+f 696/1463/1387 8111/190/190 8110/203/203 701/1464/1388
+f 701/1464/1388 8110/203/203 12808/205/205 7759/1466/1390
+f 694/1456/1380 697/1465/1389 702/1468/1392 698/1457/1381
+f 698/1457/1381 702/1468/1392 7657/1469/1393 7658/1460/1384
+f 697/1465/1389 7760/1467/1391 7761/1470/1394 702/1468/1392
+f 702/1468/1392 7761/1470/1394 12722/1471/1395 7657/1469/1393
+f 703/1472/1396 707/1473/1397 708/1474/1398 704/1475/1399
+f 704/1475/1399 708/1474/1398 7761/1470/1394 7760/1467/1391
+f 707/1473/1397 7661/1476/1400 7662/1477/1401 708/1474/1398
+f 708/1474/1398 7662/1477/1401 12722/1471/1395 7761/1470/1394
+f 703/1472/1396 704/1475/1399 709/1478/1402 705/1479/1403
+f 705/1479/1403 709/1478/1402 8118/211/211 8117/210/210
+f 704/1475/1399 7760/1467/1391 7759/1466/1390 709/1478/1402
+f 709/1478/1402 7759/1466/1390 12808/205/205 8118/211/211
+f 703/1472/1396 705/1479/1403 710/1480/1404 706/1481/1405
+f 706/1481/1405 710/1480/1404 7756/1482/1406 7757/1483/1407
+f 705/1479/1403 8117/210/210 8116/223/223 710/1480/1404
+f 710/1480/1404 8116/223/223 12809/225/225 7756/1482/1406
+f 703/1472/1396 706/1481/1405 711/1484/1408 707/1473/1397
+f 707/1473/1397 711/1484/1408 7660/1485/1409 7661/1476/1400
+f 706/1481/1405 7757/1483/1407 7758/1486/1410 711/1484/1408
+f 711/1484/1408 7758/1486/1410 12723/1487/1411 7660/1485/1409
+f 712/1488/1412 716/1489/1413 717/1490/1414 713/1491/1415
+f 713/1491/1415 717/1490/1414 7758/1486/1410 7757/1483/1407
+f 716/1489/1413 7664/1492/1416 7665/1493/1417 717/1490/1414
+f 717/1490/1414 7665/1493/1417 12723/1487/1411 7758/1486/1410
+f 712/1488/1412 713/1491/1415 718/1494/1418 714/1495/1419
+f 714/1495/1419 718/1494/1418 8124/231/231 8123/230/230
+f 713/1491/1415 7757/1483/1407 7756/1482/1406 718/1494/1418
+f 718/1494/1418 7756/1482/1406 12809/225/225 8124/231/231
+f 712/1488/1412 714/1495/1419 719/1496/1420 715/1497/1421
+f 715/1497/1421 719/1496/1420 7753/1498/1422 7754/1499/1423
+f 714/1495/1419 8123/230/230 8122/243/243 719/1496/1420
+f 719/1496/1420 8122/243/243 12810/245/245 7753/1498/1422
+f 712/1488/1412 715/1497/1421 720/1500/1424 716/1489/1413
+f 716/1489/1413 720/1500/1424 7663/1501/1425 7664/1492/1416
+f 715/1497/1421 7754/1499/1423 7755/1502/1426 720/1500/1424
+f 720/1500/1424 7755/1502/1426 12724/1503/1427 7663/1501/1425
+f 721/1504/1428 725/1505/1429 726/1506/1430 722/1507/1431
+f 722/1507/1431 726/1506/1430 9073/1508/1432 9074/1509/1433
+f 725/1505/1429 9071/1510/1434 9072/1511/1435 726/1506/1430
+f 726/1506/1430 9072/1511/1435 12971/1512/1436 9073/1508/1432
+f 721/1504/1428 722/1507/1431 727/1513/1437 723/1514/1438
+f 723/1514/1438 727/1513/1437 9066/253/253 9065/252/252
+f 722/1507/1431 9074/1509/1433 9075/1515/1439 727/1513/1437
+f 727/1513/1437 9075/1515/1439 12970/254/254 9066/253/253
+f 721/1504/1428 723/1514/1438 728/1516/1440 724/1517/1441
+f 724/1517/1441 728/1516/1440 7708/1518/1442 7709/1519/1443
+f 723/1514/1438 9065/252/252 9064/268/268 728/1516/1440
+f 728/1516/1440 9064/268/268 12811/270/270 7708/1518/1442
+f 721/1504/1428 724/1517/1441 729/1520/1444 725/1505/1429
+f 725/1505/1429 729/1520/1444 9070/1521/1445 9071/1510/1434
+f 724/1517/1441 7709/1519/1443 7710/1522/1446 729/1520/1444
+f 729/1520/1444 7710/1522/1446 12725/1523/1447 9070/1521/1445
+f 730/1524/1448 734/1525/1449 735/1526/1450 731/1527/1451
+f 731/1527/1451 735/1526/1450 7840/1528/1452 7841/1529/1453
+f 734/1525/1449 8135/505/449 8134/504/448 735/1526/1450
+f 735/1526/1450 8134/504/448 12812/507/451 7840/1528/1452
+f 730/1524/1448 731/1527/1451 736/1530/1454 732/1531/1455
+f 732/1531/1455 736/1530/1454 7837/1532/1456 7838/1533/1457
+f 731/1527/1451 7841/1529/1453 7842/1534/1458 736/1530/1454
+f 736/1530/1454 7842/1534/1458 12755/1535/1459 7837/1532/1456
+f 730/1524/1448 732/1531/1455 737/1536/1460 733/1537/1461
+f 733/1537/1461 737/1536/1460 7710/1538/1446 7709/1539/1443
+f 732/1531/1455 7838/1533/1457 7839/1540/1462 737/1536/1460
+f 737/1536/1460 7839/1540/1462 12725/1541/1447 7710/1538/1446
+f 730/1524/1448 733/1537/1461 738/1542/1463 734/1525/1449
+f 734/1525/1449 738/1542/1463 8136/510/453 8135/505/449
+f 733/1537/1461 7709/1539/1443 7708/1543/1442 738/1542/1463
+f 738/1542/1463 7708/1543/1442 12811/511/270 8136/510/453
+f 739/1544/1464 743/1545/1465 744/1546/1465 740/1547/1466
+f 740/1547/1466 744/1546/1465 7930/1548/1467 7931/1549/1468
+f 743/1545/1465 8141/527/451 8140/526/451 744/1546/1465
+f 744/1546/1465 8140/526/451 12813/529/451 7930/1548/1467
+f 739/1544/1464 740/1547/1466 745/1550/1469 741/1551/1470
+f 741/1551/1470 745/1550/1469 7924/1552/1471 7925/1553/1472
+f 740/1547/1466 7931/1549/1468 7932/1554/1473 745/1550/1469
+f 745/1550/1469 7932/1554/1473 12770/1555/1474 7924/1552/1471
+f 739/1544/1464 741/1551/1470 746/1556/1475 742/1557/1476
+f 742/1557/1476 746/1556/1475 7842/1534/1458 7841/1529/1453
+f 741/1551/1470 7925/1553/1472 7926/1558/1477 746/1556/1475
+f 746/1556/1475 7926/1558/1477 12755/1535/1459 7842/1534/1458
+f 739/1544/1464 742/1557/1476 747/1559/1478 743/1545/1465
+f 743/1545/1465 747/1559/1478 8142/531/451 8141/527/451
+f 742/1557/1476 7841/1529/1453 7840/1528/1452 747/1559/1478
+f 747/1559/1478 7840/1528/1452 12812/507/451 8142/531/451
+f 748/1560/1479 752/1561/1480 753/1562/1481 749/1563/1482
+f 749/1563/1482 753/1562/1481 7932/1554/1473 7931/1549/1468
+f 752/1561/1480 9266/1564/1483 9267/1565/1484 753/1562/1481
+f 753/1562/1481 9267/1565/1484 12770/1555/1474 7932/1554/1473
+f 748/1560/1479 749/1563/1482 754/1566/1485 750/1567/1485
+f 750/1567/1485 754/1566/1485 8148/753/451 8147/752/451
+f 749/1563/1482 7931/1549/1468 7930/1548/1467 754/1566/1485
+f 754/1566/1485 7930/1548/1467 12813/529/451 8148/753/451
+f 748/1560/1479 750/1567/1485 755/1568/1485 751/1569/1486
+f 751/1569/1486 755/1568/1485 9271/1570/1485 9272/1571/1487
+f 750/1567/1485 8147/752/451 8146/765/451 755/1568/1485
+f 755/1568/1485 8146/765/451 13005/767/451 9271/1570/1485
+f 748/1560/1479 751/1569/1486 756/1572/1488 752/1561/1480
+f 752/1561/1480 756/1572/1488 9265/1573/1489 9266/1564/1483
+f 751/1569/1486 9272/1571/1487 9273/1574/1490 756/1572/1488
+f 756/1572/1488 9273/1574/1490 13004/1575/1491 9265/1573/1489
+f 757/1576/1492 761/1577/1493 762/1578/1494 758/1579/1495
+f 758/1579/1495 762/1578/1494 8983/1580/1496 8984/1581/1497
+f 761/1577/1493 8153/1295/1219 8152/1294/1218 762/1578/1494
+f 762/1578/1494 8152/1294/1218 12956/1297/1221 8983/1580/1496
+f 757/1576/1492 758/1579/1495 763/1582/1498 759/1583/1499
+f 759/1583/1499 763/1582/1498 8977/1584/1500 8978/1585/1501
+f 758/1579/1495 8984/1581/1497 8985/1586/1502 763/1582/1498
+f 763/1582/1498 8985/1586/1502 12955/1587/1503 8977/1584/1500
+f 757/1576/1492 759/1583/1499 764/1588/1504 760/1589/1505
+f 760/1589/1505 764/1588/1504 8143/1590/1506 8144/1591/1507
+f 759/1583/1499 8978/1585/1501 8979/1592/1508 764/1588/1504
+f 764/1588/1504 8979/1592/1508 12754/1593/1509 8143/1590/1506
+f 757/1576/1492 760/1589/1505 765/1594/1510 761/1577/1493
+f 761/1577/1493 765/1594/1510 8154/1302/1226 8153/1295/1219
+f 760/1589/1505 8144/1591/1507 8145/1595/1511 765/1594/1510
+f 765/1594/1510 8145/1595/1511 12814/1303/1227 8154/1302/1226
+f 766/1596/1512 770/1597/1513 771/1598/1514 767/1599/1515
+f 767/1599/1515 771/1598/1514 8155/1600/1516 8156/1601/1517
+f 770/1597/1513 8159/1272/1196 8158/1271/1195 771/1598/1514
+f 771/1598/1514 8158/1271/1195 12816/1258/1182 8155/1600/1516
+f 766/1596/1512 767/1599/1515 772/1602/1518 768/1603/1519
+f 768/1603/1519 772/1602/1518 8044/1604/1520 8045/1605/1521
+f 767/1599/1515 8156/1601/1517 8157/1606/1522 772/1602/1518
+f 772/1602/1518 8157/1606/1522 12796/1607/1523 8044/1604/1520
+f 766/1596/1512 768/1603/1519 773/1608/1524 769/1609/1525
+f 769/1609/1525 773/1608/1524 8149/1610/1526 8150/1611/1527
+f 768/1603/1519 8045/1605/1521 8046/1612/1528 773/1608/1524
+f 773/1608/1524 8046/1612/1528 12797/1613/1529 8149/1610/1526
+f 766/1596/1512 769/1609/1525 774/1614/1530 770/1597/1513
+f 770/1597/1513 774/1614/1530 8160/1277/1201 8159/1272/1196
+f 769/1609/1525 8150/1611/1527 8151/1615/1531 774/1614/1530
+f 774/1614/1530 8151/1615/1531 12815/1278/1202 8160/1277/1201
+f 775/1616/1532 779/1617/1533 780/1618/1534 776/1619/1535
+f 776/1619/1535 780/1618/1534 8161/1620/1536 8162/1621/1537
+f 779/1617/1533 8165/1252/1176 8164/1251/1175 780/1618/1534
+f 780/1618/1534 8164/1251/1175 12817/1238/1162 8161/1620/1536
+f 775/1616/1532 776/1619/1535 781/1622/1538 777/1623/1539
+f 777/1623/1539 781/1622/1538 8038/1624/1540 8039/1625/1541
+f 776/1619/1535 8162/1621/1537 8163/1626/1542 781/1622/1538
+f 781/1622/1538 8163/1626/1542 12795/1627/1543 8038/1624/1540
+f 775/1616/1532 777/1623/1539 782/1628/1544 778/1629/1545
+f 778/1629/1545 782/1628/1544 8157/1606/1522 8156/1601/1517
+f 777/1623/1539 8039/1625/1541 8040/1630/1546 782/1628/1544
+f 782/1628/1544 8040/1630/1546 12796/1607/1523 8157/1606/1522
+f 775/1616/1532 778/1629/1545 783/1631/1547 779/1617/1533
+f 779/1617/1533 783/1631/1547 8166/1257/1181 8165/1252/1176
+f 778/1629/1545 8156/1601/1517 8155/1600/1516 783/1631/1547
+f 783/1631/1547 8155/1600/1516 12816/1258/1182 8166/1257/1181
+f 784/1632/1548 788/1633/1549 789/1634/1550 785/1635/1551
+f 785/1635/1551 789/1634/1550 8167/1636/1552 8168/1637/1553
+f 788/1633/1549 8171/1232/1156 8170/1231/1155 789/1634/1550
+f 789/1634/1550 8170/1231/1155 12818/1218/1142 8167/1636/1552
+f 784/1632/1548 785/1635/1551 790/1638/1554 786/1639/1555
+f 786/1639/1555 790/1638/1554 8032/1640/1556 8033/1641/1557
+f 785/1635/1551 8168/1637/1553 8169/1642/1558 790/1638/1554
+f 790/1638/1554 8169/1642/1558 12794/1643/1559 8032/1640/1556
+f 784/1632/1548 786/1639/1555 791/1644/1560 787/1645/1561
+f 787/1645/1561 791/1644/1560 8163/1626/1542 8162/1621/1537
+f 786/1639/1555 8033/1641/1557 8034/1646/1562 791/1644/1560
+f 791/1644/1560 8034/1646/1562 12795/1627/1543 8163/1626/1542
+f 784/1632/1548 787/1645/1561 792/1647/1563 788/1633/1549
+f 788/1633/1549 792/1647/1563 8172/1237/1161 8171/1232/1156
+f 787/1645/1561 8162/1621/1537 8161/1620/1536 792/1647/1563
+f 792/1647/1563 8161/1620/1536 12817/1238/1162 8172/1237/1161
+f 793/1648/1564 797/1649/1565 798/1650/1566 794/1651/1567
+f 794/1651/1567 798/1650/1566 8173/1652/1568 8174/1653/1569
+f 797/1649/1565 8177/1212/1136 8176/1211/1135 798/1650/1566
+f 798/1650/1566 8176/1211/1135 12819/1198/1122 8173/1652/1568
+f 793/1648/1564 794/1651/1567 799/1654/1570 795/1655/1571
+f 795/1655/1571 799/1654/1570 8026/1656/1572 8027/1657/1573
+f 794/1651/1567 8174/1653/1569 8175/1658/1574 799/1654/1570
+f 799/1654/1570 8175/1658/1574 12793/1659/1575 8026/1656/1572
+f 793/1648/1564 795/1655/1571 800/1660/1576 796/1661/1577
+f 796/1661/1577 800/1660/1576 8169/1642/1558 8168/1637/1553
+f 795/1655/1571 8027/1657/1573 8028/1662/1578 800/1660/1576
+f 800/1660/1576 8028/1662/1578 12794/1643/1559 8169/1642/1558
+f 793/1648/1564 796/1661/1577 801/1663/1579 797/1649/1565
+f 797/1649/1565 801/1663/1579 8178/1217/1141 8177/1212/1136
+f 796/1661/1577 8168/1637/1553 8167/1636/1552 801/1663/1579
+f 801/1663/1579 8167/1636/1552 12818/1218/1142 8178/1217/1141
+f 802/1664/1580 806/1665/1581 807/1666/1582 803/1667/1583
+f 803/1667/1583 807/1666/1582 8179/1668/1584 8180/1669/1585
+f 806/1665/1581 8183/1192/1116 8182/1191/1115 807/1666/1582
+f 807/1666/1582 8182/1191/1115 12820/1178/1102 8179/1668/1584
+f 802/1664/1580 803/1667/1583 808/1670/1586 804/1671/1587
+f 804/1671/1587 808/1670/1586 8020/1672/1588 8021/1673/1589
+f 803/1667/1583 8180/1669/1585 8181/1674/1590 808/1670/1586
+f 808/1670/1586 8181/1674/1590 12792/1675/1591 8020/1672/1588
+f 802/1664/1580 804/1671/1587 809/1676/1592 805/1677/1593
+f 805/1677/1593 809/1676/1592 8175/1658/1574 8174/1653/1569
+f 804/1671/1587 8021/1673/1589 8022/1678/1594 809/1676/1592
+f 809/1676/1592 8022/1678/1594 12793/1659/1575 8175/1658/1574
+f 802/1664/1580 805/1677/1593 810/1679/1595 806/1665/1581
+f 806/1665/1581 810/1679/1595 8184/1197/1121 8183/1192/1116
+f 805/1677/1593 8174/1653/1569 8173/1652/1568 810/1679/1595
+f 810/1679/1595 8173/1652/1568 12819/1198/1122 8184/1197/1121
+f 811/1680/1596 815/1681/1597 816/1682/1598 812/1683/1599
+f 812/1683/1599 816/1682/1598 8185/1684/1600 8186/1685/1601
+f 815/1681/1597 8189/1172/1096 8188/1171/1095 816/1682/1598
+f 816/1682/1598 8188/1171/1095 12821/1158/1082 8185/1684/1600
+f 811/1680/1596 812/1683/1599 817/1686/1602 813/1687/1603
+f 813/1687/1603 817/1686/1602 8014/1688/1604 8015/1689/1605
+f 812/1683/1599 8186/1685/1601 8187/1690/1606 817/1686/1602
+f 817/1686/1602 8187/1690/1606 12791/1691/1607 8014/1688/1604
+f 811/1680/1596 813/1687/1603 818/1692/1608 814/1693/1609
+f 814/1693/1609 818/1692/1608 8181/1674/1590 8180/1669/1585
+f 813/1687/1603 8015/1689/1605 8016/1694/1610 818/1692/1608
+f 818/1692/1608 8016/1694/1610 12792/1675/1591 8181/1674/1590
+f 811/1680/1596 814/1693/1609 819/1695/1611 815/1681/1597
+f 815/1681/1597 819/1695/1611 8190/1177/1101 8189/1172/1096
+f 814/1693/1609 8180/1669/1585 8179/1668/1584 819/1695/1611
+f 819/1695/1611 8179/1668/1584 12820/1178/1102 8190/1177/1101
+f 820/1696/1612 824/1697/1613 825/1698/1614 821/1699/1615
+f 821/1699/1615 825/1698/1614 8191/1700/1616 8192/1701/1617
+f 824/1697/1613 8195/1152/1076 8194/1151/1075 825/1698/1614
+f 825/1698/1614 8194/1151/1075 12822/1138/1062 8191/1700/1616
+f 820/1696/1612 821/1699/1615 826/1702/1618 822/1703/1619
+f 822/1703/1619 826/1702/1618 8008/1704/1620 8009/1705/1621
+f 821/1699/1615 8192/1701/1617 8193/1706/1622 826/1702/1618
+f 826/1702/1618 8193/1706/1622 12790/1707/1623 8008/1704/1620
+f 820/1696/1612 822/1703/1619 827/1708/1624 823/1709/1625
+f 823/1709/1625 827/1708/1624 8187/1690/1606 8186/1685/1601
+f 822/1703/1619 8009/1705/1621 8010/1710/1626 827/1708/1624
+f 827/1708/1624 8010/1710/1626 12791/1691/1607 8187/1690/1606
+f 820/1696/1612 823/1709/1625 828/1711/1627 824/1697/1613
+f 824/1697/1613 828/1711/1627 8196/1157/1081 8195/1152/1076
+f 823/1709/1625 8186/1685/1601 8185/1684/1600 828/1711/1627
+f 828/1711/1627 8185/1684/1600 12821/1158/1082 8196/1157/1081
+f 829/1712/1628 833/1713/1629 834/1714/1630 830/1715/1631
+f 830/1715/1631 834/1714/1630 8197/1716/1632 8198/1717/1633
+f 833/1713/1629 8201/1132/1056 8200/1131/1055 834/1714/1630
+f 834/1714/1630 8200/1131/1055 12823/1118/451 8197/1716/1632
+f 829/1712/1628 830/1715/1631 835/1718/1634 831/1719/1635
+f 831/1719/1635 835/1718/1634 8002/1720/1636 8003/1721/1637
+f 830/1715/1631 8198/1717/1633 8199/1722/1638 835/1718/1634
+f 835/1718/1634 8199/1722/1638 12789/1723/1639 8002/1720/1636
+f 829/1712/1628 831/1719/1635 836/1724/1640 832/1725/1641
+f 832/1725/1641 836/1724/1640 8193/1706/1622 8192/1701/1617
+f 831/1719/1635 8003/1721/1637 8004/1726/1642 836/1724/1640
+f 836/1724/1640 8004/1726/1642 12790/1707/1623 8193/1706/1622
+f 829/1712/1628 832/1725/1641 837/1727/1643 833/1713/1629
+f 833/1713/1629 837/1727/1643 8202/1137/1061 8201/1132/1056
+f 832/1725/1641 8192/1701/1617 8191/1700/1616 837/1727/1643
+f 837/1727/1643 8191/1700/1616 12822/1138/1062 8202/1137/1061
+f 838/1728/1644 842/1729/1645 843/1730/1646 839/1731/1647
+f 839/1731/1647 843/1730/1646 8203/1732/1648 8204/1733/1649
+f 842/1729/1645 8207/1112/1037 8206/1111/1036 843/1730/1646
+f 843/1730/1646 8206/1111/1036 12824/1098/1023 8203/1732/1648
+f 838/1728/1644 839/1731/1647 844/1734/1650 840/1735/1651
+f 840/1735/1651 844/1734/1650 7996/1736/1652 7997/1737/1653
+f 839/1731/1647 8204/1733/1649 8205/1738/1654 844/1734/1650
+f 844/1734/1650 8205/1738/1654 12788/1739/1655 7996/1736/1652
+f 838/1728/1644 840/1735/1651 845/1740/1656 841/1741/1657
+f 841/1741/1657 845/1740/1656 8199/1722/1638 8198/1717/1633
+f 840/1735/1651 7997/1737/1653 7998/1742/1658 845/1740/1656
+f 845/1740/1656 7998/1742/1658 12789/1723/1639 8199/1722/1638
+f 838/1728/1644 841/1741/1657 846/1743/1659 842/1729/1645
+f 842/1729/1645 846/1743/1659 8208/1117/1042 8207/1112/1037
+f 841/1741/1657 8198/1717/1633 8197/1716/1632 846/1743/1659
+f 846/1743/1659 8197/1716/1632 12823/1118/451 8208/1117/1042
+f 847/1744/1660 851/1745/1661 852/1746/1662 848/1747/1663
+f 848/1747/1663 852/1746/1662 8209/1748/1664 8210/1749/1665
+f 851/1745/1661 8213/1092/1017 8212/1091/1016 852/1746/1662
+f 852/1746/1662 8212/1091/1016 12825/1078/1003 8209/1748/1664
+f 847/1744/1660 848/1747/1663 853/1750/1666 849/1751/1667
+f 849/1751/1667 853/1750/1666 7990/1752/1668 7991/1753/1669
+f 848/1747/1663 8210/1749/1665 8211/1754/1670 853/1750/1666
+f 853/1750/1666 8211/1754/1670 12787/1755/1671 7990/1752/1668
+f 847/1744/1660 849/1751/1667 854/1756/1672 850/1757/1673
+f 850/1757/1673 854/1756/1672 8205/1738/1654 8204/1733/1649
+f 849/1751/1667 7991/1753/1669 7992/1758/1674 854/1756/1672
+f 854/1756/1672 7992/1758/1674 12788/1739/1655 8205/1738/1654
+f 847/1744/1660 850/1757/1673 855/1759/1675 851/1745/1661
+f 851/1745/1661 855/1759/1675 8214/1097/1022 8213/1092/1017
+f 850/1757/1673 8204/1733/1649 8203/1732/1648 855/1759/1675
+f 855/1759/1675 8203/1732/1648 12824/1098/1023 8214/1097/1022
+f 856/1760/1676 860/1761/1677 861/1762/1678 857/1763/1679
+f 857/1763/1679 861/1762/1678 8215/1764/1680 8216/1765/1681
+f 860/1761/1677 8219/1072/997 8218/1071/996 861/1762/1678
+f 861/1762/1678 8218/1071/996 12826/1058/983 8215/1764/1680
+f 856/1760/1676 857/1763/1679 862/1766/1682 858/1767/1683
+f 858/1767/1683 862/1766/1682 7984/1768/1684 7985/1769/1685
+f 857/1763/1679 8216/1765/1681 8217/1770/1686 862/1766/1682
+f 862/1766/1682 8217/1770/1686 12786/1771/1687 7984/1768/1684
+f 856/1760/1676 858/1767/1683 863/1772/1688 859/1773/1689
+f 859/1773/1689 863/1772/1688 8211/1754/1670 8210/1749/1665
+f 858/1767/1683 7985/1769/1685 7986/1774/1690 863/1772/1688
+f 863/1772/1688 7986/1774/1690 12787/1755/1671 8211/1754/1670
+f 856/1760/1676 859/1773/1689 864/1775/1691 860/1761/1677
+f 860/1761/1677 864/1775/1691 8220/1077/1002 8219/1072/997
+f 859/1773/1689 8210/1749/1665 8209/1748/1664 864/1775/1691
+f 864/1775/1691 8209/1748/1664 12825/1078/1003 8220/1077/1002
+f 865/1776/1692 869/1777/1693 870/1778/1694 866/1779/1695
+f 866/1779/1695 870/1778/1694 8221/1780/1696 8222/1781/1697
+f 869/1777/1693 8225/1050/975 8224/1049/974 870/1778/1694
+f 870/1778/1694 8224/1049/974 12827/1052/977 8221/1780/1696
+f 865/1776/1692 866/1779/1695 871/1782/1698 867/1783/1699
+f 867/1783/1699 871/1782/1698 7978/1784/1700 7979/1785/1701
+f 866/1779/1695 8222/1781/1697 8223/1786/1702 871/1782/1698
+f 871/1782/1698 8223/1786/1702 12785/1787/1703 7978/1784/1700
+f 865/1776/1692 867/1783/1699 872/1788/1704 868/1789/1705
+f 868/1789/1705 872/1788/1704 8217/1770/1686 8216/1765/1681
+f 867/1783/1699 7979/1785/1701 7980/1790/1706 872/1788/1704
+f 872/1788/1704 7980/1790/1706 12786/1771/1687 8217/1770/1686
+f 865/1776/1692 868/1789/1705 873/1791/1707 869/1777/1693
+f 869/1777/1693 873/1791/1707 8226/1057/982 8225/1050/975
+f 868/1789/1705 8216/1765/1681 8215/1764/1680 873/1791/1707
+f 873/1791/1707 8215/1764/1680 12826/1058/983 8226/1057/982
+f 874/1792/1708 878/1793/1709 879/1794/1710 875/1795/1711
+f 875/1795/1711 879/1794/1710 8233/1796/1712 8234/1797/1713
+f 878/1793/1709 7835/1798/1714 7836/1799/1715 879/1794/1710
+f 879/1794/1710 7836/1799/1715 12828/1800/1716 8233/1796/1712
+f 874/1792/1708 875/1795/1711 880/1801/1717 876/1802/1718
+f 876/1802/1718 880/1801/1717 8230/1803/1719 8231/1804/1720
+f 875/1795/1711 8234/1797/1713 8235/1805/1721 880/1801/1717
+f 880/1801/1717 8235/1805/1721 12829/1806/451 8230/1803/1719
+f 874/1792/1708 876/1802/1718 881/1807/1722 877/1808/1723
+f 877/1808/1723 881/1807/1722 8145/1595/1511 8144/1591/1507
+f 876/1802/1718 8231/1804/1720 8232/1809/1724 881/1807/1722
+f 881/1807/1722 8232/1809/1724 12814/1303/1227 8145/1595/1511
+f 874/1792/1708 877/1808/1723 882/1810/1725 878/1793/1709
+f 878/1793/1709 882/1810/1725 7834/1811/1726 7835/1798/1714
+f 877/1808/1723 8144/1591/1507 8143/1590/1506 882/1810/1725
+f 882/1810/1725 8143/1590/1506 12754/1593/1509 7834/1811/1726
+f 883/1812/1727 887/1813/1728 888/1814/1729 884/1815/1730
+f 884/1815/1730 888/1814/1729 8236/1816/1731 8237/1817/1732
+f 887/1813/1728 8240/1818/1733 8241/1819/1734 888/1814/1729
+f 888/1814/1729 8241/1819/1734 12830/1820/1735 8236/1816/1731
+f 883/1812/1727 884/1815/1730 889/1821/1736 885/1822/1737
+f 885/1822/1737 889/1821/1736 7833/1306/1230 7832/1301/1225
+f 884/1815/1730 8237/1817/1732 8238/1823/1738 889/1821/1736
+f 889/1821/1736 8238/1823/1738 12753/1307/1231 7833/1306/1230
+f 883/1812/1727 885/1822/1737 890/1824/1739 886/1825/1740
+f 886/1825/1740 890/1824/1739 8232/1809/1724 8231/1804/1720
+f 885/1822/1737 7832/1301/1225 7831/1300/1224 890/1824/1739
+f 890/1824/1739 7831/1300/1224 12814/1303/1227 8232/1809/1724
+f 883/1812/1727 886/1825/1740 891/1826/1741 887/1813/1728
+f 887/1813/1728 891/1826/1741 8239/1827/1742 8240/1818/1733
+f 886/1825/1740 8231/1804/1720 8230/1803/1719 891/1826/1741
+f 891/1826/1741 8230/1803/1719 12829/1806/451 8239/1827/1742
+f 892/1828/1743 896/1829/1744 897/1830/1745 893/1831/1746
+f 893/1831/1746 897/1830/1745 8995/1832/1747 8996/1833/1748
+f 896/1829/1744 8246/1834/1749 8247/1835/1750 897/1830/1745
+f 897/1830/1745 8247/1835/1750 12958/1836/1751 8995/1832/1747
+f 892/1828/1743 893/1831/1746 898/1837/1752 894/1838/1753
+f 894/1838/1753 898/1837/1752 8988/1290/1214 8987/1289/1213
+f 893/1831/1746 8996/1833/1748 8997/1839/1754 898/1837/1752
+f 898/1837/1752 8997/1839/1754 12957/1291/1215 8988/1290/1214
+f 892/1828/1743 894/1838/1753 899/1840/1755 895/1841/1756
+f 895/1841/1756 899/1840/1755 8238/1823/1738 8237/1817/1732
+f 894/1838/1753 8987/1289/1213 8986/1305/1229 899/1840/1755
+f 899/1840/1755 8986/1305/1229 12753/1307/1231 8238/1823/1738
+f 892/1828/1743 895/1841/1756 900/1842/1757 896/1829/1744
+f 896/1829/1744 900/1842/1757 8245/1843/1758 8246/1834/1749
+f 895/1841/1756 8237/1817/1732 8236/1816/1731 900/1842/1757
+f 900/1842/1757 8236/1816/1731 12830/1820/1735 8245/1843/1758
+f 901/1844/1759 905/1845/1760 906/1846/1761 902/1847/1762
+f 902/1847/1762 906/1846/1761 8248/1848/1763 8249/1849/1764
+f 905/1845/1760 8252/1850/1765 8253/1851/1766 906/1846/1761
+f 906/1846/1761 8253/1851/1766 12832/1852/1767 8248/1848/1763
+f 901/1844/1759 902/1847/1762 907/1853/1768 903/1854/1769
+f 903/1854/1769 907/1853/1768 7827/1268/1192 7826/1267/1191
+f 902/1847/1762 8249/1849/1764 8250/1855/1770 907/1853/1768
+f 907/1853/1768 8250/1855/1770 12751/1262/1186 7827/1268/1192
+f 901/1844/1759 903/1854/1769 908/1856/1771 904/1857/1772
+f 904/1857/1772 908/1856/1771 8242/1858/1773 8243/1859/1774
+f 903/1854/1769 7826/1267/1191 7825/1280/1204 908/1856/1771
+f 908/1856/1771 7825/1280/1204 12752/1282/1206 8242/1858/1773
+f 901/1844/1759 904/1857/1772 909/1860/1775 905/1845/1760
+f 905/1845/1760 909/1860/1775 8251/1861/1776 8252/1850/1765
+f 904/1857/1772 8243/1859/1774 8244/1862/1777 909/1860/1775
+f 909/1860/1775 8244/1862/1777 12831/1863/1778 8251/1861/1776
+f 910/1864/1779 914/1865/1780 915/1866/1781 911/1867/1782
+f 911/1867/1782 915/1866/1781 8254/1868/1783 8255/1869/1784
+f 914/1865/1780 8258/1870/1785 8259/1871/1786 915/1866/1781
+f 915/1866/1781 8259/1871/1786 12833/1872/1787 8254/1868/1783
+f 910/1864/1779 911/1867/1782 916/1873/1788 912/1874/1789
+f 912/1874/1789 916/1873/1788 7824/1248/1172 7823/1247/1171
+f 911/1867/1782 8255/1869/1784 8256/1875/1790 916/1873/1788
+f 916/1873/1788 8256/1875/1790 12750/1242/1166 7824/1248/1172
+f 910/1864/1779 912/1874/1789 917/1876/1791 913/1877/1792
+f 913/1877/1792 917/1876/1791 8250/1855/1770 8249/1849/1764
+f 912/1874/1789 7823/1247/1171 7822/1260/1184 917/1876/1791
+f 917/1876/1791 7822/1260/1184 12751/1262/1186 8250/1855/1770
+f 910/1864/1779 913/1877/1792 918/1878/1793 914/1865/1780
+f 914/1865/1780 918/1878/1793 8257/1879/1794 8258/1870/1785
+f 913/1877/1792 8249/1849/1764 8248/1848/1763 918/1878/1793
+f 918/1878/1793 8248/1848/1763 12832/1852/1767 8257/1879/1794
+f 919/1880/1795 923/1881/1796 924/1882/1797 920/1883/1798
+f 920/1883/1798 924/1882/1797 8260/1884/1799 8261/1885/1800
+f 923/1881/1796 8264/1886/1801 8265/1887/1802 924/1882/1797
+f 924/1882/1797 8265/1887/1802 12834/1888/1803 8260/1884/1799
+f 919/1880/1795 920/1883/1798 925/1889/1804 921/1890/1805
+f 921/1890/1805 925/1889/1804 7821/1228/1152 7820/1227/1151
+f 920/1883/1798 8261/1885/1800 8262/1891/1806 925/1889/1804
+f 925/1889/1804 8262/1891/1806 12749/1222/1146 7821/1228/1152
+f 919/1880/1795 921/1890/1805 926/1892/1807 922/1893/1808
+f 922/1893/1808 926/1892/1807 8256/1875/1790 8255/1869/1784
+f 921/1890/1805 7820/1227/1151 7819/1240/1164 926/1892/1807
+f 926/1892/1807 7819/1240/1164 12750/1242/1166 8256/1875/1790
+f 919/1880/1795 922/1893/1808 927/1894/1809 923/1881/1796
+f 923/1881/1796 927/1894/1809 8263/1895/1810 8264/1886/1801
+f 922/1893/1808 8255/1869/1784 8254/1868/1783 927/1894/1809
+f 927/1894/1809 8254/1868/1783 12833/1872/1787 8263/1895/1810
+f 928/1896/1811 932/1897/1812 933/1898/1813 929/1899/1814
+f 929/1899/1814 933/1898/1813 8266/1900/1815 8267/1901/1816
+f 932/1897/1812 8270/1902/1817 8271/1903/1818 933/1898/1813
+f 933/1898/1813 8271/1903/1818 12835/1904/1819 8266/1900/1815
+f 928/1896/1811 929/1899/1814 934/1905/1820 930/1906/1821
+f 930/1906/1821 934/1905/1820 7818/1208/1132 7817/1207/1131
+f 929/1899/1814 8267/1901/1816 8268/1907/1822 934/1905/1820
+f 934/1905/1820 8268/1907/1822 12748/1202/1126 7818/1208/1132
+f 928/1896/1811 930/1906/1821 935/1908/1823 931/1909/1824
+f 931/1909/1824 935/1908/1823 8262/1891/1806 8261/1885/1800
+f 930/1906/1821 7817/1207/1131 7816/1220/1144 935/1908/1823
+f 935/1908/1823 7816/1220/1144 12749/1222/1146 8262/1891/1806
+f 928/1896/1811 931/1909/1824 936/1910/1825 932/1897/1812
+f 932/1897/1812 936/1910/1825 8269/1911/1826 8270/1902/1817
+f 931/1909/1824 8261/1885/1800 8260/1884/1799 936/1910/1825
+f 936/1910/1825 8260/1884/1799 12834/1888/1803 8269/1911/1826
+f 937/1912/1827 941/1913/1828 942/1914/1829 938/1915/1830
+f 938/1915/1830 942/1914/1829 8272/1916/1831 8273/1917/1832
+f 941/1913/1828 8276/1918/1833 8277/1919/1834 942/1914/1829
+f 942/1914/1829 8277/1919/1834 12836/1920/1835 8272/1916/1831
+f 937/1912/1827 938/1915/1830 943/1921/1836 939/1922/1837
+f 939/1922/1837 943/1921/1836 7815/1188/1112 7814/1187/1111
+f 938/1915/1830 8273/1917/1832 8274/1923/1838 943/1921/1836
+f 943/1921/1836 8274/1923/1838 12747/1182/1106 7815/1188/1112
+f 937/1912/1827 939/1922/1837 944/1924/1839 940/1925/1840
+f 940/1925/1840 944/1924/1839 8268/1907/1822 8267/1901/1816
+f 939/1922/1837 7814/1187/1111 7813/1200/1124 944/1924/1839
+f 944/1924/1839 7813/1200/1124 12748/1202/1126 8268/1907/1822
+f 937/1912/1827 940/1925/1840 945/1926/1841 941/1913/1828
+f 941/1913/1828 945/1926/1841 8275/1927/1842 8276/1918/1833
+f 940/1925/1840 8267/1901/1816 8266/1900/1815 945/1926/1841
+f 945/1926/1841 8266/1900/1815 12835/1904/1819 8275/1927/1842
+f 946/1928/1843 950/1929/1844 951/1930/1845 947/1931/1846
+f 947/1931/1846 951/1930/1845 8278/1932/1847 8279/1933/1848
+f 950/1929/1844 8282/1934/1849 8283/1935/1850 951/1930/1845
+f 951/1930/1845 8283/1935/1850 12837/1936/1851 8278/1932/1847
+f 946/1928/1843 947/1931/1846 952/1937/1852 948/1938/1853
+f 948/1938/1853 952/1937/1852 7812/1168/1092 7811/1167/1091
+f 947/1931/1846 8279/1933/1848 8280/1939/1854 952/1937/1852
+f 952/1937/1852 8280/1939/1854 12746/1162/1086 7812/1168/1092
+f 946/1928/1843 948/1938/1853 953/1940/1855 949/1941/1856
+f 949/1941/1856 953/1940/1855 8274/1923/1838 8273/1917/1832
+f 948/1938/1853 7811/1167/1091 7810/1180/1104 953/1940/1855
+f 953/1940/1855 7810/1180/1104 12747/1182/1106 8274/1923/1838
+f 946/1928/1843 949/1941/1856 954/1942/1857 950/1929/1844
+f 950/1929/1844 954/1942/1857 8281/1943/1858 8282/1934/1849
+f 949/1941/1856 8273/1917/1832 8272/1916/1831 954/1942/1857
+f 954/1942/1857 8272/1916/1831 12836/1920/1835 8281/1943/1858
+f 955/1944/1859 959/1945/1860 960/1946/1861 956/1947/1862
+f 956/1947/1862 960/1946/1861 8284/1948/1863 8285/1949/1864
+f 959/1945/1860 8288/1950/1865 8289/1951/1866 960/1946/1861
+f 960/1946/1861 8289/1951/1866 12838/1952/1867 8284/1948/1863
+f 955/1944/1859 956/1947/1862 961/1953/1868 957/1954/1869
+f 957/1954/1869 961/1953/1868 7809/1148/1072 7808/1147/1071
+f 956/1947/1862 8285/1949/1864 8286/1955/1870 961/1953/1868
+f 961/1953/1868 8286/1955/1870 12745/1142/1066 7809/1148/1072
+f 955/1944/1859 957/1954/1869 962/1956/1871 958/1957/1872
+f 958/1957/1872 962/1956/1871 8280/1939/1854 8279/1933/1848
+f 957/1954/1869 7808/1147/1071 7807/1160/1084 962/1956/1871
+f 962/1956/1871 7807/1160/1084 12746/1162/1086 8280/1939/1854
+f 955/1944/1859 958/1957/1872 963/1958/1873 959/1945/1860
+f 959/1945/1860 963/1958/1873 8287/1959/1874 8288/1950/1865
+f 958/1957/1872 8279/1933/1848 8278/1932/1847 963/1958/1873
+f 963/1958/1873 8278/1932/1847 12837/1936/1851 8287/1959/1874
+f 964/1960/1875 968/1961/1876 969/1962/1877 965/1963/1878
+f 965/1963/1878 969/1962/1877 8290/1964/1879 8291/1965/1880
+f 968/1961/1876 8294/1966/1881 8295/1967/1882 969/1962/1877
+f 969/1962/1877 8295/1967/1882 12839/1968/1883 8290/1964/1879
+f 964/1960/1875 965/1963/1878 970/1969/1884 966/1970/1885
+f 966/1970/1885 970/1969/1884 7806/1128/1052 7805/1127/1051
+f 965/1963/1878 8291/1965/1880 8292/1971/1886 970/1969/1884
+f 970/1969/1884 8292/1971/1886 12744/1122/1046 7806/1128/1052
+f 964/1960/1875 966/1970/1885 971/1972/1887 967/1973/1888
+f 967/1973/1888 971/1972/1887 8286/1955/1870 8285/1949/1864
+f 966/1970/1885 7805/1127/1051 7804/1140/1064 971/1972/1887
+f 971/1972/1887 7804/1140/1064 12745/1142/1066 8286/1955/1870
+f 964/1960/1875 967/1973/1888 972/1974/1889 968/1961/1876
+f 968/1961/1876 972/1974/1889 8293/1975/1890 8294/1966/1881
+f 967/1973/1888 8285/1949/1864 8284/1948/1863 972/1974/1889
+f 972/1974/1889 8284/1948/1863 12838/1952/1867 8293/1975/1890
+f 973/1976/1891 977/1977/1892 978/1978/1893 974/1979/1894
+f 974/1979/1894 978/1978/1893 8296/1980/1895 8297/1981/1896
+f 977/1977/1892 8300/1982/1897 8301/1983/1898 978/1978/1893
+f 978/1978/1893 8301/1983/1898 12840/1984/1899 8296/1980/1895
+f 973/1976/1891 974/1979/1894 979/1985/1900 975/1986/1901
+f 975/1986/1901 979/1985/1900 7803/1108/1033 7802/1107/1032
+f 974/1979/1894 8297/1981/1896 8298/1987/1902 979/1985/1900
+f 979/1985/1900 8298/1987/1902 12743/1102/1027 7803/1108/1033
+f 973/1976/1891 975/1986/1901 980/1988/1903 976/1989/1904
+f 976/1989/1904 980/1988/1903 8292/1971/1886 8291/1965/1880
+f 975/1986/1901 7802/1107/1032 7801/1120/1044 980/1988/1903
+f 980/1988/1903 7801/1120/1044 12744/1122/1046 8292/1971/1886
+f 973/1976/1891 976/1989/1904 981/1990/1905 977/1977/1892
+f 977/1977/1892 981/1990/1905 8299/1991/1906 8300/1982/1897
+f 976/1989/1904 8291/1965/1880 8290/1964/1879 981/1990/1905
+f 981/1990/1905 8290/1964/1879 12839/1968/1883 8299/1991/1906
+f 982/1992/1907 986/1993/1908 987/1994/1909 983/1995/1910
+f 983/1995/1910 987/1994/1909 8302/1996/1911 8303/1997/1912
+f 986/1993/1908 8306/1998/1913 8307/1999/1914 987/1994/1909
+f 987/1994/1909 8307/1999/1914 12841/2000/1915 8302/1996/1911
+f 982/1992/1907 983/1995/1910 988/2001/1916 984/2002/1917
+f 984/2002/1917 988/2001/1916 7800/1088/1013 7799/1087/1012
+f 983/1995/1910 8303/1997/1912 8304/2003/1918 988/2001/1916
+f 988/2001/1916 8304/2003/1918 12742/1082/1007 7800/1088/1013
+f 982/1992/1907 984/2002/1917 989/2004/1919 985/2005/1920
+f 985/2005/1920 989/2004/1919 8298/1987/1902 8297/1981/1896
+f 984/2002/1917 7799/1087/1012 7798/1100/1025 989/2004/1919
+f 989/2004/1919 7798/1100/1025 12743/1102/1027 8298/1987/1902
+f 982/1992/1907 985/2005/1920 990/2006/1921 986/1993/1908
+f 986/1993/1908 990/2006/1921 8305/2007/1922 8306/1998/1913
+f 985/2005/1920 8297/1981/1896 8296/1980/1895 990/2006/1921
+f 990/2006/1921 8296/1980/1895 12840/1984/1899 8305/2007/1922
+f 991/2008/1923 995/2009/1924 996/2010/1925 992/2011/1926
+f 992/2011/1926 996/2010/1925 8308/2012/1927 8309/2013/1928
+f 995/2009/1924 8312/2014/1929 8313/2015/1930 996/2010/1925
+f 996/2010/1925 8313/2015/1930 12842/2016/1931 8308/2012/1927
+f 991/2008/1923 992/2011/1926 997/2017/1932 993/2018/1933
+f 993/2018/1933 997/2017/1932 7797/1068/993 7796/1067/992
+f 992/2011/1926 8309/2013/1928 8310/2019/1934 997/2017/1932
+f 997/2017/1932 8310/2019/1934 12741/1062/987 7797/1068/993
+f 991/2008/1923 993/2018/1933 998/2020/1935 994/2021/1936
+f 994/2021/1936 998/2020/1935 8304/2003/1918 8303/1997/1912
+f 993/2018/1933 7796/1067/992 7795/1080/1005 998/2020/1935
+f 998/2020/1935 7795/1080/1005 12742/1082/1007 8304/2003/1918
+f 991/2008/1923 994/2021/1936 999/2022/1937 995/2009/1924
+f 995/2009/1924 999/2022/1937 8311/2023/1938 8312/2014/1929
+f 994/2021/1936 8303/1997/1912 8302/1996/1911 999/2022/1937
+f 999/2022/1937 8302/1996/1911 12841/2000/1915 8311/2023/1938
+f 1000/2024/1939 1004/2025/1940 1005/2026/1941 1001/2027/1942
+f 1001/2027/1942 1005/2026/1941 8314/2028/1943 8315/2029/1944
+f 1004/2025/1940 8318/2030/1945 8319/2031/1946 1005/2026/1941
+f 1005/2026/1941 8319/2031/1946 12843/2032/1947 8314/2028/1943
+f 1000/2024/1939 1001/2027/1942 1006/2033/1948 1002/2034/1949
+f 1002/2034/1949 1006/2033/1948 7794/1045/970 7793/1044/969
+f 1001/2027/1942 8315/2029/1944 8316/2035/1950 1006/2033/1948
+f 1006/2033/1948 8316/2035/1950 12740/1046/971 7794/1045/970
+f 1000/2024/1939 1002/2034/1949 1007/2036/1951 1003/2037/1952
+f 1003/2037/1952 1007/2036/1951 8310/2019/1934 8309/2013/1928
+f 1002/2034/1949 7793/1044/969 7792/1060/985 1007/2036/1951
+f 1007/2036/1951 7792/1060/985 12741/1062/987 8310/2019/1934
+f 1000/2024/1939 1003/2037/1952 1008/2038/1953 1004/2025/1940
+f 1004/2025/1940 1008/2038/1953 8317/2039/1954 8318/2030/1945
+f 1003/2037/1952 8309/2013/1928 8308/2012/1927 1008/2038/1953
+f 1008/2038/1953 8308/2012/1927 12842/2016/1931 8317/2039/1954
+f 1009/2040/1955 1013/2041/1956 1014/2042/1957 1010/2043/1958
+f 1010/2043/1958 1014/2042/1957 9049/2044/1959 9050/2045/1960
+f 1013/2041/1956 7934/541/479 7933/540/478 1014/2042/1957
+f 1014/2042/1957 7933/540/478 12967/543/481 9049/2044/1959
+f 1009/2040/1955 1010/2043/1958 1015/2046/1961 1011/2047/1962
+f 1011/2047/1962 1015/2046/1961 8572/2048/1963 8573/2049/1964
+f 1010/2043/1958 9050/2045/1960 9051/2050/1965 1015/2046/1961
+f 1015/2046/1961 9051/2050/1965 12966/2051/1966 8572/2048/1963
+f 1009/2040/1955 1011/2047/1962 1016/2052/1967 1012/2053/1968
+f 1012/2053/1968 1016/2052/1967 8320/2054/1969 8321/2055/1970
+f 1011/2047/1962 8573/2049/1964 8574/2056/1971 1016/2052/1967
+f 1016/2052/1967 8574/2056/1971 12886/2057/1972 8320/2054/1969
+f 1009/2040/1955 1012/2053/1968 1017/2058/1973 1013/2041/1956
+f 1013/2041/1956 1017/2058/1973 7935/548/484 7934/541/479
+f 1012/2053/1968 8321/2055/1970 8322/2059/1974 1017/2058/1973
+f 1017/2058/1973 8322/2059/1974 12771/549/465 7935/548/484
+f 1018/2060/1975 1022/2061/1976 1023/2062/1977 1019/2063/1978
+f 1019/2063/1978 1023/2062/1977 8322/2064/1974 8321/2065/1970
+f 1022/2061/1976 7928/757/689 7927/756/688 1023/2062/1977
+f 1023/2062/1977 7927/756/688 12771/523/465 8322/2064/1974
+f 1018/2060/1975 1019/2063/1978 1024/2066/1979 1020/2067/1980
+f 1020/2067/1980 1024/2066/1979 9280/2068/1981 9281/2069/1982
+f 1019/2063/1978 8321/2065/1970 8320/2070/1969 1024/2066/1979
+f 1024/2066/1979 8320/2070/1969 12886/2071/1972 9280/2068/1981
+f 1018/2060/1975 1020/2067/1980 1025/2072/1983 1021/2073/1984
+f 1021/2073/1984 1025/2072/1983 9283/2074/451 9284/2075/451
+f 1020/2067/1980 9281/2069/1982 9282/2076/1985 1025/2072/1983
+f 1025/2072/1983 9282/2076/1985 13007/2077/451 9283/2074/451
+f 1018/2060/1975 1021/2073/1984 1026/2078/1986 1022/2061/1976
+f 1022/2061/1976 1026/2078/1986 7929/762/692 7928/757/689
+f 1021/2073/1984 9284/2075/451 9285/2079/451 1026/2078/1986
+f 1026/2078/1986 9285/2079/451 13006/763/451 7929/762/692
+f 1027/2080/1987 1031/2081/1988 1032/2082/1989 1028/2083/1990
+f 1028/2083/1990 1032/2082/1989 8329/2084/1991 8330/2085/1992
+f 1031/2081/1988 8246/1834/1749 8245/1843/1758 1032/2082/1989
+f 1032/2082/1989 8245/1843/1758 12830/1820/1735 8329/2084/1991
+f 1027/2080/1987 1028/2083/1990 1033/2086/1993 1029/2087/1994
+f 1029/2087/1994 1033/2086/1993 8998/2088/1995 8999/2089/1996
+f 1028/2083/1990 8330/2085/1992 8331/2090/1997 1033/2086/1993
+f 1033/2086/1993 8331/2090/1997 12885/2091/1998 8998/2088/1995
+f 1027/2080/1987 1029/2087/1994 1034/2092/1999 1030/2093/2000
+f 1030/2093/2000 1034/2092/1999 9001/2094/2001 9002/2095/2002
+f 1029/2087/1994 8999/2089/1996 9000/2096/2003 1034/2092/1999
+f 1034/2092/1999 9000/2096/2003 12959/2097/1221 9001/2094/2001
+f 1027/2080/1987 1030/2093/2000 1035/2098/2004 1031/2081/1988
+f 1031/2081/1988 1035/2098/2004 8247/1835/1750 8246/1834/1749
+f 1030/2093/2000 9002/2095/2002 9003/2099/2005 1035/2098/2004
+f 1035/2098/2004 9003/2099/2005 12958/1836/1751 8247/1835/1750
+f 1036/2100/2006 1040/2101/2007 1041/2102/2008 1037/2103/2009
+f 1037/2103/2009 1041/2102/2008 8341/2104/2010 8342/2105/2011
+f 1040/2101/2007 7937/561/495 7936/560/494 1041/2102/2008
+f 1041/2102/2008 7936/560/494 12773/563/497 8341/2104/2010
+f 1036/2100/2006 1037/2103/2009 1042/2106/2012 1038/2107/2013
+f 1038/2107/2013 1042/2106/2012 8575/2108/2014 8576/2109/2015
+f 1037/2103/2009 8342/2105/2011 8343/2110/2016 1042/2106/2012
+f 1042/2106/2012 8343/2110/2016 12888/2111/2017 8575/2108/2014
+f 1036/2100/2006 1038/2107/2013 1043/2112/2018 1039/2113/2019
+f 1039/2113/2019 1043/2112/2018 8323/2114/2020 8324/2115/2021
+f 1038/2107/2013 8576/2109/2015 8577/2116/2022 1043/2112/2018
+f 1043/2112/2018 8577/2116/2022 12887/2117/2023 8323/2114/2020
+f 1036/2100/2006 1039/2113/2019 1044/2118/2024 1040/2101/2007
+f 1040/2101/2007 1044/2118/2024 7938/568/502 7937/561/495
+f 1039/2113/2019 8324/2115/2021 8325/2119/2025 1044/2118/2024
+f 1044/2118/2024 8325/2119/2025 12772/569/503 7938/568/502
+f 1045/2120/2026 1049/2121/2027 1050/2122/2028 1046/2123/2029
+f 1046/2123/2029 1050/2122/2028 8335/2124/2030 8336/2125/2031
+f 1049/2121/2027 8252/1850/1765 8251/1861/1776 1050/2122/2028
+f 1050/2122/2028 8251/1861/1776 12831/1863/1778 8335/2124/2030
+f 1045/2120/2026 1046/2123/2029 1051/2126/2032 1047/2127/2033
+f 1047/2127/2033 1051/2126/2032 8557/2128/1201 8558/2129/1196
+f 1046/2123/2029 8336/2125/2031 8337/2130/2034 1051/2126/2032
+f 1051/2126/2032 8337/2130/2034 12884/2131/1202 8557/2128/1201
+f 1045/2120/2026 1047/2127/2033 1052/2132/2035 1048/2133/2036
+f 1048/2133/2036 1052/2132/2035 8347/2134/2037 8348/2135/2038
+f 1047/2127/2033 8558/2129/1196 8559/2136/1195 1052/2132/2035
+f 1052/2132/2035 8559/2136/1195 12883/2137/1182 8347/2134/2037
+f 1045/2120/2026 1048/2133/2036 1053/2138/2039 1049/2121/2027
+f 1049/2121/2027 1053/2138/2039 8253/1851/1766 8252/1850/1765
+f 1048/2133/2036 8348/2135/2038 8349/2139/2040 1053/2138/2039
+f 1053/2138/2039 8349/2139/2040 12832/1852/1767 8253/1851/1766
+f 1054/2140/2041 1058/2141/2042 1059/2142/2043 1055/2143/2044
+f 1055/2143/2044 1059/2142/2043 8353/2144/2045 8354/2145/2046
+f 1058/2141/2042 7940/581/515 7939/580/514 1059/2142/2043
+f 1059/2142/2043 7939/580/514 12774/583/517 8353/2144/2045
+f 1054/2140/2041 1055/2143/2044 1060/2146/2047 1056/2147/2048
+f 1056/2147/2048 1060/2146/2047 8578/2148/2049 8579/2149/2050
+f 1055/2143/2044 8354/2145/2046 8355/2150/2051 1060/2146/2047
+f 1060/2146/2047 8355/2150/2051 12889/2151/2052 8578/2148/2049
+f 1054/2140/2041 1056/2147/2048 1061/2152/2053 1057/2153/2054
+f 1057/2153/2054 1061/2152/2053 8343/2110/2016 8342/2105/2011
+f 1056/2147/2048 8579/2149/2050 8580/2154/2055 1061/2152/2053
+f 1061/2152/2053 8580/2154/2055 12888/2111/2017 8343/2110/2016
+f 1054/2140/2041 1057/2153/2054 1062/2155/2056 1058/2141/2042
+f 1058/2141/2042 1062/2155/2056 7941/586/520 7940/581/515
+f 1057/2153/2054 8342/2105/2011 8341/2104/2010 1062/2155/2056
+f 1062/2155/2056 8341/2104/2010 12773/563/497 7941/586/520
+f 1063/2156/2057 1067/2157/2058 1068/2158/2059 1064/2159/2060
+f 1064/2159/2060 1068/2158/2059 8349/2139/2040 8348/2135/2038
+f 1067/2157/2058 8258/1870/1785 8257/1879/1794 1068/2158/2059
+f 1068/2158/2059 8257/1879/1794 12832/1852/1767 8349/2139/2040
+f 1063/2156/2057 1064/2159/2060 1069/2160/2061 1065/2161/2062
+f 1065/2161/2062 1069/2160/2061 8551/2162/1181 8552/2163/1176
+f 1064/2159/2060 8348/2135/2038 8347/2134/2037 1069/2160/2061
+f 1069/2160/2061 8347/2134/2037 12883/2137/1182 8551/2162/1181
+f 1063/2156/2057 1065/2161/2062 1070/2164/2063 1066/2165/2064
+f 1066/2165/2064 1070/2164/2063 8359/2166/2065 8360/2167/2066
+f 1065/2161/2062 8552/2163/1176 8553/2168/1175 1070/2164/2063
+f 1070/2164/2063 8553/2168/1175 12882/2169/1162 8359/2166/2065
+f 1063/2156/2057 1066/2165/2064 1071/2170/2067 1067/2157/2058
+f 1067/2157/2058 1071/2170/2067 8259/1871/1786 8258/1870/1785
+f 1066/2165/2064 8360/2167/2066 8361/2171/2068 1071/2170/2067
+f 1071/2170/2067 8361/2171/2068 12833/1872/1787 8259/1871/1786
+f 1072/2172/2069 1076/2173/2070 1077/2174/2071 1073/2175/2072
+f 1073/2175/2072 1077/2174/2071 8365/2176/2073 8366/2177/2074
+f 1076/2173/2070 7943/597/531 7942/596/530 1077/2174/2071
+f 1077/2174/2071 7942/596/530 12775/599/533 8365/2176/2073
+f 1072/2172/2069 1073/2175/2072 1078/2178/2075 1074/2179/2076
+f 1074/2179/2076 1078/2178/2075 8581/2180/2077 8582/2181/2078
+f 1073/2175/2072 8366/2177/2074 8367/2182/2079 1078/2178/2075
+f 1078/2178/2075 8367/2182/2079 12890/2183/2080 8581/2180/2077
+f 1072/2172/2069 1074/2179/2076 1079/2184/2081 1075/2185/2082
+f 1075/2185/2082 1079/2184/2081 8355/2150/2051 8354/2145/2046
+f 1074/2179/2076 8582/2181/2078 8583/2186/2083 1079/2184/2081
+f 1079/2184/2081 8583/2186/2083 12889/2151/2052 8355/2150/2051
+f 1072/2172/2069 1075/2185/2082 1080/2187/2084 1076/2173/2070
+f 1076/2173/2070 1080/2187/2084 7944/602/536 7943/597/531
+f 1075/2185/2082 8354/2145/2046 8353/2144/2045 1080/2187/2084
+f 1080/2187/2084 8353/2144/2045 12774/583/517 7944/602/536
+f 1081/2188/2085 1085/2189/2086 1086/2190/2087 1082/2191/2088
+f 1082/2191/2088 1086/2190/2087 8361/2171/2068 8360/2167/2066
+f 1085/2189/2086 8264/1886/1801 8263/1895/1810 1086/2190/2087
+f 1086/2190/2087 8263/1895/1810 12833/1872/1787 8361/2171/2068
+f 1081/2188/2085 1082/2191/2088 1087/2192/2089 1083/2193/2090
+f 1083/2193/2090 1087/2192/2089 8545/2194/1161 8546/2195/1156
+f 1082/2191/2088 8360/2167/2066 8359/2166/2065 1087/2192/2089
+f 1087/2192/2089 8359/2166/2065 12882/2169/1162 8545/2194/1161
+f 1081/2188/2085 1083/2193/2090 1088/2196/2091 1084/2197/2092
+f 1084/2197/2092 1088/2196/2091 8371/2198/2093 8372/2199/2094
+f 1083/2193/2090 8546/2195/1156 8547/2200/1155 1088/2196/2091
+f 1088/2196/2091 8547/2200/1155 12881/2201/1142 8371/2198/2093
+f 1081/2188/2085 1084/2197/2092 1089/2202/2095 1085/2189/2086
+f 1085/2189/2086 1089/2202/2095 8265/1887/1802 8264/1886/1801
+f 1084/2197/2092 8372/2199/2094 8373/2203/2096 1089/2202/2095
+f 1089/2202/2095 8373/2203/2096 12834/1888/1803 8265/1887/1802
+f 1090/2204/2097 1094/2205/2098 1095/2206/2099 1091/2207/2100
+f 1091/2207/2100 1095/2206/2099 8377/2208/2101 8378/2209/2102
+f 1094/2205/2098 7946/613/547 7945/612/546 1095/2206/2099
+f 1095/2206/2099 7945/612/546 12776/615/549 8377/2208/2101
+f 1090/2204/2097 1091/2207/2100 1096/2210/2103 1092/2211/2104
+f 1092/2211/2104 1096/2210/2103 8584/2212/2105 8585/2213/2106
+f 1091/2207/2100 8378/2209/2102 8379/2214/2107 1096/2210/2103
+f 1096/2210/2103 8379/2214/2107 12891/2215/2108 8584/2212/2105
+f 1090/2204/2097 1092/2211/2104 1097/2216/2109 1093/2217/2110
+f 1093/2217/2110 1097/2216/2109 8367/2182/2079 8366/2177/2074
+f 1092/2211/2104 8585/2213/2106 8586/2218/2111 1097/2216/2109
+f 1097/2216/2109 8586/2218/2111 12890/2183/2080 8367/2182/2079
+f 1090/2204/2097 1093/2217/2110 1098/2219/2112 1094/2205/2098
+f 1094/2205/2098 1098/2219/2112 7947/618/552 7946/613/547
+f 1093/2217/2110 8366/2177/2074 8365/2176/2073 1098/2219/2112
+f 1098/2219/2112 8365/2176/2073 12775/599/533 7947/618/552
+f 1099/2220/2113 1103/2221/2114 1104/2222/2115 1100/2223/2116
+f 1100/2223/2116 1104/2222/2115 8373/2203/2096 8372/2199/2094
+f 1103/2221/2114 8270/1902/1817 8269/1911/1826 1104/2222/2115
+f 1104/2222/2115 8269/1911/1826 12834/1888/1803 8373/2203/2096
+f 1099/2220/2113 1100/2223/2116 1105/2224/2117 1101/2225/2118
+f 1101/2225/2118 1105/2224/2117 8539/2226/1141 8540/2227/1136
+f 1100/2223/2116 8372/2199/2094 8371/2198/2093 1105/2224/2117
+f 1105/2224/2117 8371/2198/2093 12881/2201/1142 8539/2226/1141
+f 1099/2220/2113 1101/2225/2118 1106/2228/2119 1102/2229/2120
+f 1102/2229/2120 1106/2228/2119 8383/2230/2121 8384/2231/2122
+f 1101/2225/2118 8540/2227/1136 8541/2232/1135 1106/2228/2119
+f 1106/2228/2119 8541/2232/1135 12880/2233/1122 8383/2230/2121
+f 1099/2220/2113 1102/2229/2120 1107/2234/2123 1103/2221/2114
+f 1103/2221/2114 1107/2234/2123 8271/1903/1818 8270/1902/1817
+f 1102/2229/2120 8384/2231/2122 8385/2235/2124 1107/2234/2123
+f 1107/2234/2123 8385/2235/2124 12835/1904/1819 8271/1903/1818
+f 1108/2236/2125 1112/2237/2126 1113/2238/2127 1109/2239/2128
+f 1109/2239/2128 1113/2238/2127 8389/2240/2129 8390/2241/2130
+f 1112/2237/2126 7949/629/563 7948/628/562 1113/2238/2127
+f 1113/2238/2127 7948/628/562 12777/631/565 8389/2240/2129
+f 1108/2236/2125 1109/2239/2128 1114/2242/2131 1110/2243/2132
+f 1110/2243/2132 1114/2242/2131 8587/2244/2133 8588/2245/2134
+f 1109/2239/2128 8390/2241/2130 8391/2246/2135 1114/2242/2131
+f 1114/2242/2131 8391/2246/2135 12892/2247/2136 8587/2244/2133
+f 1108/2236/2125 1110/2243/2132 1115/2248/2137 1111/2249/2138
+f 1111/2249/2138 1115/2248/2137 8379/2214/2107 8378/2209/2102
+f 1110/2243/2132 8588/2245/2134 8589/2250/2139 1115/2248/2137
+f 1115/2248/2137 8589/2250/2139 12891/2215/2108 8379/2214/2107
+f 1108/2236/2125 1111/2249/2138 1116/2251/2140 1112/2237/2126
+f 1112/2237/2126 1116/2251/2140 7950/634/568 7949/629/563
+f 1111/2249/2138 8378/2209/2102 8377/2208/2101 1116/2251/2140
+f 1116/2251/2140 8377/2208/2101 12776/615/549 7950/634/568
+f 1117/2252/2141 1121/2253/2142 1122/2254/2143 1118/2255/2144
+f 1118/2255/2144 1122/2254/2143 8385/2235/2124 8384/2231/2122
+f 1121/2253/2142 8276/1918/1833 8275/1927/1842 1122/2254/2143
+f 1122/2254/2143 8275/1927/1842 12835/1904/1819 8385/2235/2124
+f 1117/2252/2141 1118/2255/2144 1123/2256/2145 1119/2257/2146
+f 1119/2257/2146 1123/2256/2145 8533/2258/1121 8534/2259/1116
+f 1118/2255/2144 8384/2231/2122 8383/2230/2121 1123/2256/2145
+f 1123/2256/2145 8383/2230/2121 12880/2233/1122 8533/2258/1121
+f 1117/2252/2141 1119/2257/2146 1124/2260/2147 1120/2261/2148
+f 1120/2261/2148 1124/2260/2147 8395/2262/2149 8396/2263/2150
+f 1119/2257/2146 8534/2259/1116 8535/2264/1115 1124/2260/2147
+f 1124/2260/2147 8535/2264/1115 12879/2265/1102 8395/2262/2149
+f 1117/2252/2141 1120/2261/2148 1125/2266/2151 1121/2253/2142
+f 1121/2253/2142 1125/2266/2151 8277/1919/1834 8276/1918/1833
+f 1120/2261/2148 8396/2263/2150 8397/2267/2152 1125/2266/2151
+f 1125/2266/2151 8397/2267/2152 12836/1920/1835 8277/1919/1834
+f 1126/2268/2153 1130/2269/2154 1131/2270/2155 1127/2271/2156
+f 1127/2271/2156 1131/2270/2155 8401/2272/2157 8402/2273/2158
+f 1130/2269/2154 7952/645/579 7951/644/578 1131/2270/2155
+f 1131/2270/2155 7951/644/578 12778/647/581 8401/2272/2157
+f 1126/2268/2153 1127/2271/2156 1132/2274/2159 1128/2275/2160
+f 1128/2275/2160 1132/2274/2159 8590/2276/2161 8591/2277/2162
+f 1127/2271/2156 8402/2273/2158 8403/2278/2163 1132/2274/2159
+f 1132/2274/2159 8403/2278/2163 12893/2279/2164 8590/2276/2161
+f 1126/2268/2153 1128/2275/2160 1133/2280/2165 1129/2281/2166
+f 1129/2281/2166 1133/2280/2165 8391/2246/2135 8390/2241/2130
+f 1128/2275/2160 8591/2277/2162 8592/2282/2167 1133/2280/2165
+f 1133/2280/2165 8592/2282/2167 12892/2247/2136 8391/2246/2135
+f 1126/2268/2153 1129/2281/2166 1134/2283/2168 1130/2269/2154
+f 1130/2269/2154 1134/2283/2168 7953/650/584 7952/645/579
+f 1129/2281/2166 8390/2241/2130 8389/2240/2129 1134/2283/2168
+f 1134/2283/2168 8389/2240/2129 12777/631/565 7953/650/584
+f 1135/2284/2169 1139/2285/2170 1140/2286/2171 1136/2287/2172
+f 1136/2287/2172 1140/2286/2171 8397/2267/2152 8396/2263/2150
+f 1139/2285/2170 8282/1934/1849 8281/1943/1858 1140/2286/2171
+f 1140/2286/2171 8281/1943/1858 12836/1920/1835 8397/2267/2152
+f 1135/2284/2169 1136/2287/2172 1141/2288/2173 1137/2289/2174
+f 1137/2289/2174 1141/2288/2173 8527/2290/1101 8528/2291/1096
+f 1136/2287/2172 8396/2263/2150 8395/2262/2149 1141/2288/2173
+f 1141/2288/2173 8395/2262/2149 12879/2265/1102 8527/2290/1101
+f 1135/2284/2169 1137/2289/2174 1142/2292/2175 1138/2293/2176
+f 1138/2293/2176 1142/2292/2175 8407/2294/2177 8408/2295/2178
+f 1137/2289/2174 8528/2291/1096 8529/2296/1095 1142/2292/2175
+f 1142/2292/2175 8529/2296/1095 12878/2297/1082 8407/2294/2177
+f 1135/2284/2169 1138/2293/2176 1143/2298/2179 1139/2285/2170
+f 1139/2285/2170 1143/2298/2179 8283/1935/1850 8282/1934/1849
+f 1138/2293/2176 8408/2295/2178 8409/2299/2180 1143/2298/2179
+f 1143/2298/2179 8409/2299/2180 12837/1936/1851 8283/1935/1850
+f 1144/2300/2181 1148/2301/2182 1149/2302/2183 1145/2303/2184
+f 1145/2303/2184 1149/2302/2183 8413/2304/2185 8414/2305/2186
+f 1148/2301/2182 7955/661/595 7954/660/594 1149/2302/2183
+f 1149/2302/2183 7954/660/594 12779/663/597 8413/2304/2185
+f 1144/2300/2181 1145/2303/2184 1150/2306/2187 1146/2307/2188
+f 1146/2307/2188 1150/2306/2187 8593/2308/2189 8594/2309/2190
+f 1145/2303/2184 8414/2305/2186 8415/2310/2191 1150/2306/2187
+f 1150/2306/2187 8415/2310/2191 12894/2311/2192 8593/2308/2189
+f 1144/2300/2181 1146/2307/2188 1151/2312/2193 1147/2313/2194
+f 1147/2313/2194 1151/2312/2193 8403/2278/2163 8402/2273/2158
+f 1146/2307/2188 8594/2309/2190 8595/2314/2195 1151/2312/2193
+f 1151/2312/2193 8595/2314/2195 12893/2279/2164 8403/2278/2163
+f 1144/2300/2181 1147/2313/2194 1152/2315/2196 1148/2301/2182
+f 1148/2301/2182 1152/2315/2196 7956/666/600 7955/661/595
+f 1147/2313/2194 8402/2273/2158 8401/2272/2157 1152/2315/2196
+f 1152/2315/2196 8401/2272/2157 12778/647/581 7956/666/600
+f 1153/2316/2197 1157/2317/2198 1158/2318/2199 1154/2319/2200
+f 1154/2319/2200 1158/2318/2199 8409/2299/2180 8408/2295/2178
+f 1157/2317/2198 8288/1950/1865 8287/1959/1874 1158/2318/2199
+f 1158/2318/2199 8287/1959/1874 12837/1936/1851 8409/2299/2180
+f 1153/2316/2197 1154/2319/2200 1159/2320/2201 1155/2321/2202
+f 1155/2321/2202 1159/2320/2201 8521/2322/1081 8522/2323/1076
+f 1154/2319/2200 8408/2295/2178 8407/2294/2177 1159/2320/2201
+f 1159/2320/2201 8407/2294/2177 12878/2297/1082 8521/2322/1081
+f 1153/2316/2197 1155/2321/2202 1160/2324/2203 1156/2325/2204
+f 1156/2325/2204 1160/2324/2203 8419/2326/2205 8420/2327/2206
+f 1155/2321/2202 8522/2323/1076 8523/2328/1075 1160/2324/2203
+f 1160/2324/2203 8523/2328/1075 12877/2329/1062 8419/2326/2205
+f 1153/2316/2197 1156/2325/2204 1161/2330/2207 1157/2317/2198
+f 1157/2317/2198 1161/2330/2207 8289/1951/1866 8288/1950/1865
+f 1156/2325/2204 8420/2327/2206 8421/2331/2208 1161/2330/2207
+f 1161/2330/2207 8421/2331/2208 12838/1952/1867 8289/1951/1866
+f 1162/2332/2209 1166/2333/2210 1167/2334/2211 1163/2335/2212
+f 1163/2335/2212 1167/2334/2211 8425/2336/2213 8426/2337/2214
+f 1166/2333/2210 7958/677/611 7957/676/610 1167/2334/2211
+f 1167/2334/2211 7957/676/610 12780/679/613 8425/2336/2213
+f 1162/2332/2209 1163/2335/2212 1168/2338/2215 1164/2339/2216
+f 1164/2339/2216 1168/2338/2215 8596/2340/2217 8597/2341/2218
+f 1163/2335/2212 8426/2337/2214 8427/2342/2219 1168/2338/2215
+f 1168/2338/2215 8427/2342/2219 12895/2343/2220 8596/2340/2217
+f 1162/2332/2209 1164/2339/2216 1169/2344/2221 1165/2345/2222
+f 1165/2345/2222 1169/2344/2221 8415/2310/2191 8414/2305/2186
+f 1164/2339/2216 8597/2341/2218 8598/2346/2223 1169/2344/2221
+f 1169/2344/2221 8598/2346/2223 12894/2311/2192 8415/2310/2191
+f 1162/2332/2209 1165/2345/2222 1170/2347/2224 1166/2333/2210
+f 1166/2333/2210 1170/2347/2224 7959/682/616 7958/677/611
+f 1165/2345/2222 8414/2305/2186 8413/2304/2185 1170/2347/2224
+f 1170/2347/2224 8413/2304/2185 12779/663/597 7959/682/616
+f 1171/2348/2225 1175/2349/2226 1176/2350/2227 1172/2351/2228
+f 1172/2351/2228 1176/2350/2227 8421/2331/2208 8420/2327/2206
+f 1175/2349/2226 8294/1966/1881 8293/1975/1890 1176/2350/2227
+f 1176/2350/2227 8293/1975/1890 12838/1952/1867 8421/2331/2208
+f 1171/2348/2225 1172/2351/2228 1177/2352/2229 1173/2353/2230
+f 1173/2353/2230 1177/2352/2229 8515/2354/1061 8516/2355/1056
+f 1172/2351/2228 8420/2327/2206 8419/2326/2205 1177/2352/2229
+f 1177/2352/2229 8419/2326/2205 12877/2329/1062 8515/2354/1061
+f 1171/2348/2225 1173/2353/2230 1178/2356/2231 1174/2357/2232
+f 1174/2357/2232 1178/2356/2231 8431/2358/2233 8432/2359/2234
+f 1173/2353/2230 8516/2355/1056 8517/2360/1055 1178/2356/2231
+f 1178/2356/2231 8517/2360/1055 12876/2361/451 8431/2358/2233
+f 1171/2348/2225 1174/2357/2232 1179/2362/2235 1175/2349/2226
+f 1175/2349/2226 1179/2362/2235 8295/1967/1882 8294/1966/1881
+f 1174/2357/2232 8432/2359/2234 8433/2363/2236 1179/2362/2235
+f 1179/2362/2235 8433/2363/2236 12839/1968/1883 8295/1967/1882
+f 1180/2364/2237 1184/2365/2238 1185/2366/2239 1181/2367/2240
+f 1181/2367/2240 1185/2366/2239 8437/2368/2241 8438/2369/2242
+f 1184/2365/2238 7961/693/627 7960/692/626 1185/2366/2239
+f 1185/2366/2239 7960/692/626 12781/695/629 8437/2368/2241
+f 1180/2364/2237 1181/2367/2240 1186/2370/2243 1182/2371/2244
+f 1182/2371/2244 1186/2370/2243 8599/2372/2245 8600/2373/2246
+f 1181/2367/2240 8438/2369/2242 8439/2374/2247 1186/2370/2243
+f 1186/2370/2243 8439/2374/2247 12896/2375/2248 8599/2372/2245
+f 1180/2364/2237 1182/2371/2244 1187/2376/2249 1183/2377/2250
+f 1183/2377/2250 1187/2376/2249 8427/2342/2219 8426/2337/2214
+f 1182/2371/2244 8600/2373/2246 8601/2378/2251 1187/2376/2249
+f 1187/2376/2249 8601/2378/2251 12895/2343/2220 8427/2342/2219
+f 1180/2364/2237 1183/2377/2250 1188/2379/2252 1184/2365/2238
+f 1184/2365/2238 1188/2379/2252 7962/698/632 7961/693/627
+f 1183/2377/2250 8426/2337/2214 8425/2336/2213 1188/2379/2252
+f 1188/2379/2252 8425/2336/2213 12780/679/613 7962/698/632
+f 1189/2380/2253 1193/2381/2254 1194/2382/2255 1190/2383/2256
+f 1190/2383/2256 1194/2382/2255 8433/2363/2236 8432/2359/2234
+f 1193/2381/2254 8300/1982/1897 8299/1991/1906 1194/2382/2255
+f 1194/2382/2255 8299/1991/1906 12839/1968/1883 8433/2363/2236
+f 1189/2380/2253 1190/2383/2256 1195/2384/2257 1191/2385/2258
+f 1191/2385/2258 1195/2384/2257 8509/2386/1042 8510/2387/1037
+f 1190/2383/2256 8432/2359/2234 8431/2358/2233 1195/2384/2257
+f 1195/2384/2257 8431/2358/2233 12876/2361/451 8509/2386/1042
+f 1189/2380/2253 1191/2385/2258 1196/2388/2259 1192/2389/2260
+f 1192/2389/2260 1196/2388/2259 8443/2390/2261 8444/2391/2262
+f 1191/2385/2258 8510/2387/1037 8511/2392/1036 1196/2388/2259
+f 1196/2388/2259 8511/2392/1036 12875/2393/1023 8443/2390/2261
+f 1189/2380/2253 1192/2389/2260 1197/2394/2263 1193/2381/2254
+f 1193/2381/2254 1197/2394/2263 8301/1983/1898 8300/1982/1897
+f 1192/2389/2260 8444/2391/2262 8445/2395/2264 1197/2394/2263
+f 1197/2394/2263 8445/2395/2264 12840/1984/1899 8301/1983/1898
+f 1198/2396/2265 1202/2397/2266 1203/2398/2267 1199/2399/2268
+f 1199/2399/2268 1203/2398/2267 8449/2400/2269 8450/2401/2270
+f 1202/2397/2266 7964/709/643 7963/708/642 1203/2398/2267
+f 1203/2398/2267 7963/708/642 12782/711/645 8449/2400/2269
+f 1198/2396/2265 1199/2399/2268 1204/2402/2271 1200/2403/2272
+f 1200/2403/2272 1204/2402/2271 8602/2404/2273 8603/2405/2274
+f 1199/2399/2268 8450/2401/2270 8451/2406/2275 1204/2402/2271
+f 1204/2402/2271 8451/2406/2275 12897/2407/2276 8602/2404/2273
+f 1198/2396/2265 1200/2403/2272 1205/2408/2277 1201/2409/2278
+f 1201/2409/2278 1205/2408/2277 8439/2374/2247 8438/2369/2242
+f 1200/2403/2272 8603/2405/2274 8604/2410/2279 1205/2408/2277
+f 1205/2408/2277 8604/2410/2279 12896/2375/2248 8439/2374/2247
+f 1198/2396/2265 1201/2409/2278 1206/2411/2280 1202/2397/2266
+f 1202/2397/2266 1206/2411/2280 7965/714/648 7964/709/643
+f 1201/2409/2278 8438/2369/2242 8437/2368/2241 1206/2411/2280
+f 1206/2411/2280 8437/2368/2241 12781/695/629 7965/714/648
+f 1207/2412/2281 1211/2413/2282 1212/2414/2283 1208/2415/2284
+f 1208/2415/2284 1212/2414/2283 8445/2395/2264 8444/2391/2262
+f 1211/2413/2282 8306/1998/1913 8305/2007/1922 1212/2414/2283
+f 1212/2414/2283 8305/2007/1922 12840/1984/1899 8445/2395/2264
+f 1207/2412/2281 1208/2415/2284 1213/2416/2285 1209/2417/2286
+f 1209/2417/2286 1213/2416/2285 8503/2418/1022 8504/2419/1017
+f 1208/2415/2284 8444/2391/2262 8443/2390/2261 1213/2416/2285
+f 1213/2416/2285 8443/2390/2261 12875/2393/1023 8503/2418/1022
+f 1207/2412/2281 1209/2417/2286 1214/2420/2287 1210/2421/2288
+f 1210/2421/2288 1214/2420/2287 8455/2422/2289 8456/2423/2290
+f 1209/2417/2286 8504/2419/1017 8505/2424/1016 1214/2420/2287
+f 1214/2420/2287 8505/2424/1016 12874/2425/1003 8455/2422/2289
+f 1207/2412/2281 1210/2421/2288 1215/2426/2291 1211/2413/2282
+f 1211/2413/2282 1215/2426/2291 8307/1999/1914 8306/1998/1913
+f 1210/2421/2288 8456/2423/2290 8457/2427/2292 1215/2426/2291
+f 1215/2426/2291 8457/2427/2292 12841/2000/1915 8307/1999/1914
+f 1216/2428/2293 1220/2429/2294 1221/2430/2295 1217/2431/2296
+f 1217/2431/2296 1221/2430/2295 8461/2432/2297 8462/2433/2298
+f 1220/2429/2294 7967/725/659 7966/724/658 1221/2430/2295
+f 1221/2430/2295 7966/724/658 12783/727/661 8461/2432/2297
+f 1216/2428/2293 1217/2431/2296 1222/2434/2299 1218/2435/2300
+f 1218/2435/2300 1222/2434/2299 8605/2436/2301 8606/2437/2302
+f 1217/2431/2296 8462/2433/2298 8463/2438/2303 1222/2434/2299
+f 1222/2434/2299 8463/2438/2303 12898/2439/2304 8605/2436/2301
+f 1216/2428/2293 1218/2435/2300 1223/2440/2305 1219/2441/2306
+f 1219/2441/2306 1223/2440/2305 8451/2406/2275 8450/2401/2270
+f 1218/2435/2300 8606/2437/2302 8607/2442/2307 1223/2440/2305
+f 1223/2440/2305 8607/2442/2307 12897/2407/2276 8451/2406/2275
+f 1216/2428/2293 1219/2441/2306 1224/2443/2308 1220/2429/2294
+f 1220/2429/2294 1224/2443/2308 7968/730/664 7967/725/659
+f 1219/2441/2306 8450/2401/2270 8449/2400/2269 1224/2443/2308
+f 1224/2443/2308 8449/2400/2269 12782/711/645 7968/730/664
+f 1225/2444/2309 1229/2445/2310 1230/2446/2311 1226/2447/2312
+f 1226/2447/2312 1230/2446/2311 8457/2427/2292 8456/2423/2290
+f 1229/2445/2310 8312/2014/1929 8311/2023/1938 1230/2446/2311
+f 1230/2446/2311 8311/2023/1938 12841/2000/1915 8457/2427/2292
+f 1225/2444/2309 1226/2447/2312 1231/2448/2313 1227/2449/2314
+f 1227/2449/2314 1231/2448/2313 8497/2450/1002 8498/2451/997
+f 1226/2447/2312 8456/2423/2290 8455/2422/2289 1231/2448/2313
+f 1231/2448/2313 8455/2422/2289 12874/2425/1003 8497/2450/1002
+f 1225/2444/2309 1227/2449/2314 1232/2452/2315 1228/2453/2316
+f 1228/2453/2316 1232/2452/2315 8467/2454/2317 8468/2455/2318
+f 1227/2449/2314 8498/2451/997 8499/2456/996 1232/2452/2315
+f 1232/2452/2315 8499/2456/996 12873/2457/983 8467/2454/2317
+f 1225/2444/2309 1228/2453/2316 1233/2458/2319 1229/2445/2310
+f 1229/2445/2310 1233/2458/2319 8313/2015/1930 8312/2014/1929
+f 1228/2453/2316 8468/2455/2318 8469/2459/2320 1233/2458/2319
+f 1233/2458/2319 8469/2459/2320 12842/2016/1931 8313/2015/1930
+f 1234/2460/2321 1238/2461/2322 1239/2462/2323 1235/2463/2324
+f 1235/2463/2324 1239/2462/2323 8473/2464/2325 8474/2465/2326
+f 1238/2461/2322 7970/741/675 7969/740/674 1239/2462/2323
+f 1239/2462/2323 7969/740/674 12784/743/677 8473/2464/2325
+f 1234/2460/2321 1235/2463/2324 1240/2466/2327 1236/2467/2328
+f 1236/2467/2328 1240/2466/2327 8608/2468/2329 8609/2469/2330
+f 1235/2463/2324 8474/2465/2326 8475/2470/2331 1240/2466/2327
+f 1240/2466/2327 8475/2470/2331 12899/2471/2332 8608/2468/2329
+f 1234/2460/2321 1236/2467/2328 1241/2472/2333 1237/2473/2334
+f 1237/2473/2334 1241/2472/2333 8463/2438/2303 8462/2433/2298
+f 1236/2467/2328 8609/2469/2330 8610/2474/2335 1241/2472/2333
+f 1241/2472/2333 8610/2474/2335 12898/2439/2304 8463/2438/2303
+f 1234/2460/2321 1237/2473/2334 1242/2475/2336 1238/2461/2322
+f 1238/2461/2322 1242/2475/2336 7971/746/680 7970/741/675
+f 1237/2473/2334 8462/2433/2298 8461/2432/2297 1242/2475/2336
+f 1242/2475/2336 8461/2432/2297 12783/727/661 7971/746/680
+f 1243/2476/2337 1247/2477/2338 1248/2478/2339 1244/2479/2340
+f 1244/2479/2340 1248/2478/2339 8469/2459/2320 8468/2455/2318
+f 1247/2477/2338 8318/2030/1945 8317/2039/1954 1248/2478/2339
+f 1248/2478/2339 8317/2039/1954 12842/2016/1931 8469/2459/2320
+f 1243/2476/2337 1244/2479/2340 1249/2480/2341 1245/2481/2342
+f 1245/2481/2342 1249/2480/2341 8491/2482/982 8492/2483/975
+f 1244/2479/2340 8468/2455/2318 8467/2454/2317 1249/2480/2341
+f 1249/2480/2341 8467/2454/2317 12873/2457/983 8491/2482/982
+f 1243/2476/2337 1245/2481/2342 1250/2484/2343 1246/2485/2344
+f 1246/2485/2344 1250/2484/2343 8479/2486/2345 8480/2487/2346
+f 1245/2481/2342 8492/2483/975 8493/2488/974 1250/2484/2343
+f 1250/2484/2343 8493/2488/974 12872/2489/977 8479/2486/2345
+f 1243/2476/2337 1246/2485/2344 1251/2490/2347 1247/2477/2338
+f 1247/2477/2338 1251/2490/2347 8319/2031/1946 8318/2030/1945
+f 1246/2485/2344 8480/2487/2346 8481/2491/2348 1251/2490/2347
+f 1251/2490/2347 8481/2491/2348 12843/2032/1947 8319/2031/1946
+f 1252/2492/975 1256/2493/982 1257/2494/982 1253/2495/975
+f 1253/2495/975 1257/2494/982 9187/2496/982 9188/2497/975
+f 1256/2493/982 8489/2498/983 8490/2499/983 1257/2494/982
+f 1257/2494/982 8490/2499/983 12991/2500/983 9187/2496/982
+f 1252/2492/975 1253/2495/975 1258/2501/974 1254/2502/974
+f 1254/2502/974 1258/2501/974 8485/2503/977 8486/2504/977
+f 1253/2495/975 9188/2497/975 9189/2505/974 1258/2501/974
+f 1258/2501/974 9189/2505/974 12990/2506/977 8485/2503/977
+f 1252/2492/975 1254/2502/974 1259/2507/974 1255/2508/975
+f 1255/2508/975 1259/2507/974 8493/2488/974 8492/2483/975
+f 1254/2502/974 8486/2504/977 8487/2509/977 1259/2507/974
+f 1259/2507/974 8487/2509/977 12872/2489/977 8493/2488/974
+f 1252/2492/975 1255/2508/975 1260/2510/982 1256/2493/982
+f 1256/2493/982 1260/2510/982 8488/2511/983 8489/2498/983
+f 1255/2508/975 8492/2483/975 8491/2482/982 1260/2510/982
+f 1260/2510/982 8491/2482/982 12873/2457/983 8488/2511/983
+f 1261/2512/997 1265/2513/1002 1266/2514/1002 1262/2515/997
+f 1262/2515/997 1266/2514/1002 9193/2516/1002 9194/2517/997
+f 1265/2513/1002 8495/2518/1003 8496/2519/1003 1266/2514/1002
+f 1266/2514/1002 8496/2519/1003 12992/2520/1003 9193/2516/1002
+f 1261/2512/997 1262/2515/997 1267/2521/996 1263/2522/996
+f 1263/2522/996 1267/2521/996 8490/2499/983 8489/2498/983
+f 1262/2515/997 9194/2517/997 9195/2523/996 1267/2521/996
+f 1267/2521/996 9195/2523/996 12991/2500/983 8490/2499/983
+f 1261/2512/997 1263/2522/996 1268/2524/996 1264/2525/997
+f 1264/2525/997 1268/2524/996 8499/2456/996 8498/2451/997
+f 1263/2522/996 8489/2498/983 8488/2511/983 1268/2524/996
+f 1268/2524/996 8488/2511/983 12873/2457/983 8499/2456/996
+f 1261/2512/997 1264/2525/997 1269/2526/1002 1265/2513/1002
+f 1265/2513/1002 1269/2526/1002 8494/2527/1003 8495/2518/1003
+f 1264/2525/997 8498/2451/997 8497/2450/1002 1269/2526/1002
+f 1269/2526/1002 8497/2450/1002 12874/2425/1003 8494/2527/1003
+f 1270/2528/1017 1274/2529/1022 1275/2530/1022 1271/2531/1017
+f 1271/2531/1017 1275/2530/1022 9199/2532/1022 9200/2533/1017
+f 1274/2529/1022 8501/2534/1023 8502/2535/1023 1275/2530/1022
+f 1275/2530/1022 8502/2535/1023 12993/2536/1023 9199/2532/1022
+f 1270/2528/1017 1271/2531/1017 1276/2537/1016 1272/2538/1016
+f 1272/2538/1016 1276/2537/1016 8496/2519/1003 8495/2518/1003
+f 1271/2531/1017 9200/2533/1017 9201/2539/1016 1276/2537/1016
+f 1276/2537/1016 9201/2539/1016 12992/2520/1003 8496/2519/1003
+f 1270/2528/1017 1272/2538/1016 1277/2540/1016 1273/2541/1017
+f 1273/2541/1017 1277/2540/1016 8505/2424/1016 8504/2419/1017
+f 1272/2538/1016 8495/2518/1003 8494/2527/1003 1277/2540/1016
+f 1277/2540/1016 8494/2527/1003 12874/2425/1003 8505/2424/1016
+f 1270/2528/1017 1273/2541/1017 1278/2542/1022 1274/2529/1022
+f 1274/2529/1022 1278/2542/1022 8500/2543/1023 8501/2534/1023
+f 1273/2541/1017 8504/2419/1017 8503/2418/1022 1278/2542/1022
+f 1278/2542/1022 8503/2418/1022 12875/2393/1023 8500/2543/1023
+f 1279/2544/1037 1283/2545/1042 1284/2546/1042 1280/2547/1037
+f 1280/2547/1037 1284/2546/1042 9205/2548/1042 9206/2549/1037
+f 1283/2545/1042 8507/2550/451 8508/2551/451 1284/2546/1042
+f 1284/2546/1042 8508/2551/451 12994/2552/451 9205/2548/1042
+f 1279/2544/1037 1280/2547/1037 1285/2553/1036 1281/2554/1036
+f 1281/2554/1036 1285/2553/1036 8502/2535/1023 8501/2534/1023
+f 1280/2547/1037 9206/2549/1037 9207/2555/1036 1285/2553/1036
+f 1285/2553/1036 9207/2555/1036 12993/2536/1023 8502/2535/1023
+f 1279/2544/1037 1281/2554/1036 1286/2556/1036 1282/2557/1037
+f 1282/2557/1037 1286/2556/1036 8511/2392/1036 8510/2387/1037
+f 1281/2554/1036 8501/2534/1023 8500/2543/1023 1286/2556/1036
+f 1286/2556/1036 8500/2543/1023 12875/2393/1023 8511/2392/1036
+f 1279/2544/1037 1282/2557/1037 1287/2558/1042 1283/2545/1042
+f 1283/2545/1042 1287/2558/1042 8506/2559/451 8507/2550/451
+f 1282/2557/1037 8510/2387/1037 8509/2386/1042 1287/2558/1042
+f 1287/2558/1042 8509/2386/1042 12876/2361/451 8506/2559/451
+f 1288/2560/1056 1292/2561/1061 1293/2562/1061 1289/2563/1056
+f 1289/2563/1056 1293/2562/1061 9211/2564/1061 9212/2565/1056
+f 1292/2561/1061 8513/2566/1062 8514/2567/1062 1293/2562/1061
+f 1293/2562/1061 8514/2567/1062 12995/2568/1062 9211/2564/1061
+f 1288/2560/1056 1289/2563/1056 1294/2569/1055 1290/2570/1055
+f 1290/2570/1055 1294/2569/1055 8508/2551/451 8507/2550/451
+f 1289/2563/1056 9212/2565/1056 9213/2571/1055 1294/2569/1055
+f 1294/2569/1055 9213/2571/1055 12994/2552/451 8508/2551/451
+f 1288/2560/1056 1290/2570/1055 1295/2572/1055 1291/2573/1056
+f 1291/2573/1056 1295/2572/1055 8517/2360/1055 8516/2355/1056
+f 1290/2570/1055 8507/2550/451 8506/2559/451 1295/2572/1055
+f 1295/2572/1055 8506/2559/451 12876/2361/451 8517/2360/1055
+f 1288/2560/1056 1291/2573/1056 1296/2574/1061 1292/2561/1061
+f 1292/2561/1061 1296/2574/1061 8512/2575/1062 8513/2566/1062
+f 1291/2573/1056 8516/2355/1056 8515/2354/1061 1296/2574/1061
+f 1296/2574/1061 8515/2354/1061 12877/2329/1062 8512/2575/1062
+f 1297/2576/1076 1301/2577/1081 1302/2578/1081 1298/2579/1076
+f 1298/2579/1076 1302/2578/1081 9217/2580/1081 9218/2581/1076
+f 1301/2577/1081 8519/2582/1082 8520/2583/1082 1302/2578/1081
+f 1302/2578/1081 8520/2583/1082 12996/2584/1082 9217/2580/1081
+f 1297/2576/1076 1298/2579/1076 1303/2585/1075 1299/2586/1075
+f 1299/2586/1075 1303/2585/1075 8514/2567/1062 8513/2566/1062
+f 1298/2579/1076 9218/2581/1076 9219/2587/1075 1303/2585/1075
+f 1303/2585/1075 9219/2587/1075 12995/2568/1062 8514/2567/1062
+f 1297/2576/1076 1299/2586/1075 1304/2588/1075 1300/2589/1076
+f 1300/2589/1076 1304/2588/1075 8523/2328/1075 8522/2323/1076
+f 1299/2586/1075 8513/2566/1062 8512/2575/1062 1304/2588/1075
+f 1304/2588/1075 8512/2575/1062 12877/2329/1062 8523/2328/1075
+f 1297/2576/1076 1300/2589/1076 1305/2590/1081 1301/2577/1081
+f 1301/2577/1081 1305/2590/1081 8518/2591/1082 8519/2582/1082
+f 1300/2589/1076 8522/2323/1076 8521/2322/1081 1305/2590/1081
+f 1305/2590/1081 8521/2322/1081 12878/2297/1082 8518/2591/1082
+f 1306/2592/1096 1310/2593/1101 1311/2594/1101 1307/2595/1096
+f 1307/2595/1096 1311/2594/1101 9223/2596/1101 9224/2597/1096
+f 1310/2593/1101 8525/2598/1102 8526/2599/1102 1311/2594/1101
+f 1311/2594/1101 8526/2599/1102 12997/2600/1102 9223/2596/1101
+f 1306/2592/1096 1307/2595/1096 1312/2601/1095 1308/2602/1095
+f 1308/2602/1095 1312/2601/1095 8520/2583/1082 8519/2582/1082
+f 1307/2595/1096 9224/2597/1096 9225/2603/1095 1312/2601/1095
+f 1312/2601/1095 9225/2603/1095 12996/2584/1082 8520/2583/1082
+f 1306/2592/1096 1308/2602/1095 1313/2604/1095 1309/2605/1096
+f 1309/2605/1096 1313/2604/1095 8529/2296/1095 8528/2291/1096
+f 1308/2602/1095 8519/2582/1082 8518/2591/1082 1313/2604/1095
+f 1313/2604/1095 8518/2591/1082 12878/2297/1082 8529/2296/1095
+f 1306/2592/1096 1309/2605/1096 1314/2606/1101 1310/2593/1101
+f 1310/2593/1101 1314/2606/1101 8524/2607/1102 8525/2598/1102
+f 1309/2605/1096 8528/2291/1096 8527/2290/1101 1314/2606/1101
+f 1314/2606/1101 8527/2290/1101 12879/2265/1102 8524/2607/1102
+f 1315/2608/1116 1319/2609/1121 1320/2610/1121 1316/2611/1116
+f 1316/2611/1116 1320/2610/1121 9229/2612/1121 9230/2613/1116
+f 1319/2609/1121 8531/2614/1122 8532/2615/1122 1320/2610/1121
+f 1320/2610/1121 8532/2615/1122 12998/2616/1122 9229/2612/1121
+f 1315/2608/1116 1316/2611/1116 1321/2617/1115 1317/2618/1115
+f 1317/2618/1115 1321/2617/1115 8526/2599/1102 8525/2598/1102
+f 1316/2611/1116 9230/2613/1116 9231/2619/1115 1321/2617/1115
+f 1321/2617/1115 9231/2619/1115 12997/2600/1102 8526/2599/1102
+f 1315/2608/1116 1317/2618/1115 1322/2620/1115 1318/2621/1116
+f 1318/2621/1116 1322/2620/1115 8535/2264/1115 8534/2259/1116
+f 1317/2618/1115 8525/2598/1102 8524/2607/1102 1322/2620/1115
+f 1322/2620/1115 8524/2607/1102 12879/2265/1102 8535/2264/1115
+f 1315/2608/1116 1318/2621/1116 1323/2622/1121 1319/2609/1121
+f 1319/2609/1121 1323/2622/1121 8530/2623/1122 8531/2614/1122
+f 1318/2621/1116 8534/2259/1116 8533/2258/1121 1323/2622/1121
+f 1323/2622/1121 8533/2258/1121 12880/2233/1122 8530/2623/1122
+f 1324/2624/1136 1328/2625/1141 1329/2626/1141 1325/2627/1136
+f 1325/2627/1136 1329/2626/1141 9235/2628/1141 9236/2629/1136
+f 1328/2625/1141 8537/2630/1142 8538/2631/1142 1329/2626/1141
+f 1329/2626/1141 8538/2631/1142 12999/2632/1142 9235/2628/1141
+f 1324/2624/1136 1325/2627/1136 1330/2633/1135 1326/2634/1135
+f 1326/2634/1135 1330/2633/1135 8532/2615/1122 8531/2614/1122
+f 1325/2627/1136 9236/2629/1136 9237/2635/1135 1330/2633/1135
+f 1330/2633/1135 9237/2635/1135 12998/2616/1122 8532/2615/1122
+f 1324/2624/1136 1326/2634/1135 1331/2636/1135 1327/2637/1136
+f 1327/2637/1136 1331/2636/1135 8541/2232/1135 8540/2227/1136
+f 1326/2634/1135 8531/2614/1122 8530/2623/1122 1331/2636/1135
+f 1331/2636/1135 8530/2623/1122 12880/2233/1122 8541/2232/1135
+f 1324/2624/1136 1327/2637/1136 1332/2638/1141 1328/2625/1141
+f 1328/2625/1141 1332/2638/1141 8536/2639/1142 8537/2630/1142
+f 1327/2637/1136 8540/2227/1136 8539/2226/1141 1332/2638/1141
+f 1332/2638/1141 8539/2226/1141 12881/2201/1142 8536/2639/1142
+f 1333/2640/1156 1337/2641/1161 1338/2642/1161 1334/2643/1156
+f 1334/2643/1156 1338/2642/1161 9241/2644/1161 9242/2645/1156
+f 1337/2641/1161 8543/2646/1162 8544/2647/1162 1338/2642/1161
+f 1338/2642/1161 8544/2647/1162 13000/2648/1162 9241/2644/1161
+f 1333/2640/1156 1334/2643/1156 1339/2649/1155 1335/2650/1155
+f 1335/2650/1155 1339/2649/1155 8538/2631/1142 8537/2630/1142
+f 1334/2643/1156 9242/2645/1156 9243/2651/1155 1339/2649/1155
+f 1339/2649/1155 9243/2651/1155 12999/2632/1142 8538/2631/1142
+f 1333/2640/1156 1335/2650/1155 1340/2652/1155 1336/2653/1156
+f 1336/2653/1156 1340/2652/1155 8547/2200/1155 8546/2195/1156
+f 1335/2650/1155 8537/2630/1142 8536/2639/1142 1340/2652/1155
+f 1340/2652/1155 8536/2639/1142 12881/2201/1142 8547/2200/1155
+f 1333/2640/1156 1336/2653/1156 1341/2654/1161 1337/2641/1161
+f 1337/2641/1161 1341/2654/1161 8542/2655/1162 8543/2646/1162
+f 1336/2653/1156 8546/2195/1156 8545/2194/1161 1341/2654/1161
+f 1341/2654/1161 8545/2194/1161 12882/2169/1162 8542/2655/1162
+f 1342/2656/1176 1346/2657/1181 1347/2658/1181 1343/2659/1176
+f 1343/2659/1176 1347/2658/1181 9247/2660/1181 9248/2661/1176
+f 1346/2657/1181 8549/2662/1182 8550/2663/1182 1347/2658/1181
+f 1347/2658/1181 8550/2663/1182 13001/2664/1182 9247/2660/1181
+f 1342/2656/1176 1343/2659/1176 1348/2665/1175 1344/2666/1175
+f 1344/2666/1175 1348/2665/1175 8544/2647/1162 8543/2646/1162
+f 1343/2659/1176 9248/2661/1176 9249/2667/1175 1348/2665/1175
+f 1348/2665/1175 9249/2667/1175 13000/2648/1162 8544/2647/1162
+f 1342/2656/1176 1344/2666/1175 1349/2668/1175 1345/2669/1176
+f 1345/2669/1176 1349/2668/1175 8553/2168/1175 8552/2163/1176
+f 1344/2666/1175 8543/2646/1162 8542/2655/1162 1349/2668/1175
+f 1349/2668/1175 8542/2655/1162 12882/2169/1162 8553/2168/1175
+f 1342/2656/1176 1345/2669/1176 1350/2670/1181 1346/2657/1181
+f 1346/2657/1181 1350/2670/1181 8548/2671/1182 8549/2662/1182
+f 1345/2669/1176 8552/2163/1176 8551/2162/1181 1350/2670/1181
+f 1350/2670/1181 8551/2162/1181 12883/2137/1182 8548/2671/1182
+f 1351/2672/1196 1355/2673/1201 1356/2674/1201 1352/2675/1196
+f 1352/2675/1196 1356/2674/1201 9253/2676/1201 9254/2677/1196
+f 1355/2673/1201 8555/2678/1202 8556/2679/1202 1356/2674/1201
+f 1356/2674/1201 8556/2679/1202 13002/2680/1202 9253/2676/1201
+f 1351/2672/1196 1352/2675/1196 1357/2681/1195 1353/2682/1195
+f 1353/2682/1195 1357/2681/1195 8550/2663/1182 8549/2662/1182
+f 1352/2675/1196 9254/2677/1196 9255/2683/1195 1357/2681/1195
+f 1357/2681/1195 9255/2683/1195 13001/2664/1182 8550/2663/1182
+f 1351/2672/1196 1353/2682/1195 1358/2684/1195 1354/2685/1196
+f 1354/2685/1196 1358/2684/1195 8559/2136/1195 8558/2129/1196
+f 1353/2682/1195 8549/2662/1182 8548/2671/1182 1358/2684/1195
+f 1358/2684/1195 8548/2671/1182 12883/2137/1182 8559/2136/1195
+f 1351/2672/1196 1354/2685/1196 1359/2686/1201 1355/2673/1201
+f 1355/2673/1201 1359/2686/1201 8554/2687/1202 8555/2678/1202
+f 1354/2685/1196 8558/2129/1196 8557/2128/1201 1359/2686/1201
+f 1359/2686/1201 8557/2128/1201 12884/2131/1202 8554/2687/1202
+f 1360/2688/1996 1364/2689/1996 1365/2690/2003 1361/2691/2003
+f 1361/2691/2003 1365/2690/2003 9007/2692/1221 9008/2693/1221
+f 1364/2689/1996 9263/2694/1996 9264/2695/2003 1365/2690/2003
+f 1365/2690/2003 9264/2695/2003 13003/2696/1221 9007/2692/1221
+f 1360/2688/1996 1361/2691/2003 1366/2697/2003 1362/2698/1996
+f 1362/2698/1996 1366/2697/2003 9000/2096/2003 8999/2089/1996
+f 1361/2691/2003 9008/2693/1221 9009/2699/1221 1366/2697/2003
+f 1366/2697/2003 9009/2699/1221 12959/2097/1221 9000/2096/2003
+f 1360/2688/1996 1362/2698/1996 1367/2700/1995 1363/2701/1995
+f 1363/2701/1995 1367/2700/1995 8560/2702/1998 8561/2703/1998
+f 1362/2698/1996 8999/2089/1996 8998/2088/1995 1367/2700/1995
+f 1367/2700/1995 8998/2088/1995 12885/2091/1998 8560/2702/1998
+f 1360/2688/1996 1363/2701/1995 1368/2704/1995 1364/2689/1996
+f 1364/2689/1996 1368/2704/1995 9262/2705/1995 9263/2694/1996
+f 1363/2701/1995 8561/2703/1998 8562/2706/1998 1368/2704/1995
+f 1368/2704/1995 8562/2706/1998 12972/2707/1998 9262/2705/1995
+f 1369/2708/2349 1373/2709/2350 1374/2710/2351 1370/2711/2352
+f 1370/2711/2352 1374/2710/2351 9286/2712/2353 9287/2713/2354
+f 1373/2709/2350 8567/2714/2355 8568/2715/2356 1374/2710/2351
+f 1374/2710/2351 8568/2715/2356 12973/2716/2357 9286/2712/2353
+f 1369/2708/2349 1370/2711/2352 1375/2717/2358 1371/2718/2359
+f 1371/2718/2359 1375/2717/2358 9289/2719/451 9290/2720/451
+f 1370/2711/2352 9287/2713/2354 9288/2721/2358 1375/2717/2358
+f 1375/2717/2358 9288/2721/2358 13008/2722/451 9289/2719/451
+f 1369/2708/2349 1371/2718/2359 1376/2723/2360 1372/2724/2361
+f 1372/2724/2361 1376/2723/2360 9282/2076/1985 9281/2069/1982
+f 1371/2718/2359 9290/2720/451 9291/2725/451 1376/2723/2360
+f 1376/2723/2360 9291/2725/451 13007/2077/451 9282/2076/1985
+f 1369/2708/2349 1372/2724/2361 1377/2726/2362 1373/2709/2350
+f 1373/2709/2350 1377/2726/2362 8566/2727/2363 8567/2714/2355
+f 1372/2724/2361 9281/2069/1982 9280/2068/1981 1377/2726/2362
+f 1377/2726/2362 9280/2068/1981 12886/2071/1972 8566/2727/2363
+f 1378/2728/2364 1382/2729/2365 1383/2730/2366 1379/2731/2367
+f 1379/2731/2367 1383/2730/2366 9100/2732/2368 9101/2733/2369
+f 1382/2729/2365 9098/2734/2370 9099/2735/2371 1383/2730/2366
+f 1383/2730/2366 9099/2735/2371 12976/2736/2372 9100/2732/2368
+f 1378/2728/2364 1379/2731/2367 1384/2737/2373 1380/2738/2374
+f 1380/2738/2374 1384/2737/2373 8628/2739/2375 8629/2740/2376
+f 1379/2731/2367 9101/2733/2369 9102/2741/2377 1384/2737/2373
+f 1384/2737/2373 9102/2741/2377 12975/2742/2378 8628/2739/2375
+f 1378/2728/2364 1380/2738/2374 1385/2743/2379 1381/2744/2380
+f 1381/2744/2380 1385/2743/2379 8623/2745/2381 8624/2746/2382
+f 1380/2738/2374 8629/2740/2376 8630/2747/2383 1385/2743/2379
+f 1385/2743/2379 8630/2747/2383 12902/2748/2384 8623/2745/2381
+f 1378/2728/2364 1381/2744/2380 1386/2749/2385 1382/2729/2365
+f 1382/2729/2365 1386/2749/2385 9097/2750/2386 9098/2734/2370
+f 1381/2744/2380 8624/2746/2382 8625/2751/2387 1386/2749/2385
+f 1386/2749/2385 8625/2751/2387 12964/2752/2388 9097/2750/2386
+f 1387/2753/2389 1391/2754/2390 1392/2755/2391 1388/2756/2392
+f 1388/2756/2392 1392/2755/2391 9112/2757/2393 9113/2758/2394
+f 1391/2754/2390 8641/2759/2395 8642/2760/2396 1392/2755/2391
+f 1392/2755/2391 8642/2760/2396 12978/2761/225 9112/2757/2393
+f 1387/2753/2389 1388/2756/2392 1393/2762/2397 1389/2763/2398
+f 1389/2763/2398 1393/2762/2397 8617/2764/2399 8618/2765/2400
+f 1388/2756/2392 9113/2758/2394 9114/2766/2401 1393/2762/2397
+f 1393/2762/2397 9114/2766/2401 12977/2767/2402 8617/2764/2399
+f 1387/2753/2389 1389/2763/2398 1394/2768/2403 1390/2769/2404
+f 1390/2769/2404 1394/2768/2403 8643/2770/2405 8644/2771/2406
+f 1389/2763/2398 8618/2765/2400 8619/2772/2407 1394/2768/2403
+f 1394/2768/2403 8619/2772/2407 12900/2773/2408 8643/2770/2405
+f 1387/2753/2389 1390/2769/2404 1395/2774/2409 1391/2754/2390
+f 1391/2754/2390 1395/2774/2409 8640/2775/2410 8641/2759/2395
+f 1390/2769/2404 8644/2771/2406 8645/2776/2411 1395/2774/2409
+f 1395/2774/2409 8645/2776/2411 12904/2777/2412 8640/2775/2410
+f 1396/2778/2413 1400/2779/2414 1401/2780/2415 1397/2781/2416
+f 1397/2781/2416 1401/2780/2415 9118/2782/211 9119/2783/210
+f 1400/2779/2414 8656/2784/2417 8657/2785/2418 1401/2780/2415
+f 1401/2780/2415 8657/2785/2418 12979/2786/205 9118/2782/211
+f 1396/2778/2413 1397/2781/2416 1402/2787/2419 1398/2788/2420
+f 1398/2788/2420 1402/2787/2419 8642/2760/2396 8641/2759/2395
+f 1397/2781/2416 9119/2783/210 9120/2789/223 1402/2787/2419
+f 1402/2787/2419 9120/2789/223 12978/2761/225 8642/2760/2396
+f 1396/2778/2413 1398/2788/2420 1403/2790/2421 1399/2791/2422
+f 1399/2791/2422 1403/2790/2421 8658/2792/2423 8659/2793/2424
+f 1398/2788/2420 8641/2759/2395 8640/2775/2410 1403/2790/2421
+f 1403/2790/2421 8640/2775/2410 12904/2777/2412 8658/2792/2423
+f 1396/2778/2413 1399/2791/2422 1404/2794/2425 1400/2779/2414
+f 1400/2779/2414 1404/2794/2425 8655/2795/2426 8656/2784/2417
+f 1399/2791/2422 8659/2793/2424 8660/2796/2427 1404/2794/2425
+f 1404/2794/2425 8660/2796/2427 12906/2797/2428 8655/2795/2426
+f 1405/2798/2429 1409/2799/2430 1410/2800/2431 1406/2801/2432
+f 1406/2801/2432 1410/2800/2431 9124/2802/191 9125/2803/190
+f 1409/2799/2430 8671/2804/2433 8672/2805/2434 1410/2800/2431
+f 1410/2800/2431 8672/2805/2434 12980/2806/185 9124/2802/191
+f 1405/2798/2429 1406/2801/2432 1411/2807/2435 1407/2808/2436
+f 1407/2808/2436 1411/2807/2435 8657/2785/2418 8656/2784/2417
+f 1406/2801/2432 9125/2803/190 9126/2809/203 1411/2807/2435
+f 1411/2807/2435 9126/2809/203 12979/2786/205 8657/2785/2418
+f 1405/2798/2429 1407/2808/2436 1412/2810/2437 1408/2811/2438
+f 1408/2811/2438 1412/2810/2437 8673/2812/2439 8674/2813/2440
+f 1407/2808/2436 8656/2784/2417 8655/2795/2426 1412/2810/2437
+f 1412/2810/2437 8655/2795/2426 12906/2797/2428 8673/2812/2439
+f 1405/2798/2429 1408/2811/2438 1413/2814/2441 1409/2799/2430
+f 1409/2799/2430 1413/2814/2441 8670/2815/2442 8671/2804/2433
+f 1408/2811/2438 8674/2813/2440 8675/2816/2443 1413/2814/2441
+f 1413/2814/2441 8675/2816/2443 12908/2817/2444 8670/2815/2442
+f 1414/2818/2445 1418/2819/2446 1419/2820/2447 1415/2821/2448
+f 1415/2821/2448 1419/2820/2447 9130/2822/171 9131/2823/170
+f 1418/2819/2446 8686/2824/2449 8687/2825/2450 1419/2820/2447
+f 1419/2820/2447 8687/2825/2450 12981/2826/165 9130/2822/171
+f 1414/2818/2445 1415/2821/2448 1420/2827/2451 1416/2828/2452
+f 1416/2828/2452 1420/2827/2451 8672/2805/2434 8671/2804/2433
+f 1415/2821/2448 9131/2823/170 9132/2829/183 1420/2827/2451
+f 1420/2827/2451 9132/2829/183 12980/2806/185 8672/2805/2434
+f 1414/2818/2445 1416/2828/2452 1421/2830/2453 1417/2831/2454
+f 1417/2831/2454 1421/2830/2453 8688/2832/2455 8689/2833/2456
+f 1416/2828/2452 8671/2804/2433 8670/2815/2442 1421/2830/2453
+f 1421/2830/2453 8670/2815/2442 12908/2817/2444 8688/2832/2455
+f 1414/2818/2445 1417/2831/2454 1422/2834/2457 1418/2819/2446
+f 1418/2819/2446 1422/2834/2457 8685/2835/2458 8686/2824/2449
+f 1417/2831/2454 8689/2833/2456 8690/2836/2459 1422/2834/2457
+f 1422/2834/2457 8690/2836/2459 12910/2837/2460 8685/2835/2458
+f 1423/2838/2461 1427/2839/2462 1428/2840/2463 1424/2841/2464
+f 1424/2841/2464 1428/2840/2463 9136/2842/151 9137/2843/150
+f 1427/2839/2462 8701/2844/2465 8702/2845/2466 1428/2840/2463
+f 1428/2840/2463 8702/2845/2466 12982/2846/145 9136/2842/151
+f 1423/2838/2461 1424/2841/2464 1429/2847/2467 1425/2848/2468
+f 1425/2848/2468 1429/2847/2467 8687/2825/2450 8686/2824/2449
+f 1424/2841/2464 9137/2843/150 9138/2849/163 1429/2847/2467
+f 1429/2847/2467 9138/2849/163 12981/2826/165 8687/2825/2450
+f 1423/2838/2461 1425/2848/2468 1430/2850/2469 1426/2851/2470
+f 1426/2851/2470 1430/2850/2469 8703/2852/2471 8704/2853/2472
+f 1425/2848/2468 8686/2824/2449 8685/2835/2458 1430/2850/2469
+f 1430/2850/2469 8685/2835/2458 12910/2837/2460 8703/2852/2471
+f 1423/2838/2461 1426/2851/2470 1431/2854/2473 1427/2839/2462
+f 1427/2839/2462 1431/2854/2473 8700/2855/2474 8701/2844/2465
+f 1426/2851/2470 8704/2853/2472 8705/2856/2475 1431/2854/2473
+f 1431/2854/2473 8705/2856/2475 12912/2857/2476 8700/2855/2474
+f 1432/2858/2477 1436/2859/2478 1437/2860/2479 1433/2861/2480
+f 1433/2861/2480 1437/2860/2479 9142/2862/131 9143/2863/130
+f 1436/2859/2478 8716/2864/2481 8717/2865/2482 1437/2860/2479
+f 1437/2860/2479 8717/2865/2482 12983/2866/125 9142/2862/131
+f 1432/2858/2477 1433/2861/2480 1438/2867/2483 1434/2868/2484
+f 1434/2868/2484 1438/2867/2483 8702/2845/2466 8701/2844/2465
+f 1433/2861/2480 9143/2863/130 9144/2869/143 1438/2867/2483
+f 1438/2867/2483 9144/2869/143 12982/2846/145 8702/2845/2466
+f 1432/2858/2477 1434/2868/2484 1439/2870/2485 1435/2871/2486
+f 1435/2871/2486 1439/2870/2485 8718/2872/2487 8719/2873/2488
+f 1434/2868/2484 8701/2844/2465 8700/2855/2474 1439/2870/2485
+f 1439/2870/2485 8700/2855/2474 12912/2857/2476 8718/2872/2487
+f 1432/2858/2477 1435/2871/2486 1440/2874/2489 1436/2859/2478
+f 1436/2859/2478 1440/2874/2489 8715/2875/2490 8716/2864/2481
+f 1435/2871/2486 8719/2873/2488 8720/2876/2491 1440/2874/2489
+f 1440/2874/2489 8720/2876/2491 12914/2877/2492 8715/2875/2490
+f 1441/2878/2493 1445/2879/2494 1446/2880/2495 1442/2881/2496
+f 1442/2881/2496 1446/2880/2495 9148/2882/111 9149/2883/110
+f 1445/2879/2494 8731/2884/2497 8732/2885/2498 1446/2880/2495
+f 1446/2880/2495 8732/2885/2498 12984/2886/105 9148/2882/111
+f 1441/2878/2493 1442/2881/2496 1447/2887/2499 1443/2888/2500
+f 1443/2888/2500 1447/2887/2499 8717/2865/2482 8716/2864/2481
+f 1442/2881/2496 9149/2883/110 9150/2889/123 1447/2887/2499
+f 1447/2887/2499 9150/2889/123 12983/2866/125 8717/2865/2482
+f 1441/2878/2493 1443/2888/2500 1448/2890/2501 1444/2891/2502
+f 1444/2891/2502 1448/2890/2501 8733/2892/2503 8734/2893/2504
+f 1443/2888/2500 8716/2864/2481 8715/2875/2490 1448/2890/2501
+f 1448/2890/2501 8715/2875/2490 12914/2877/2492 8733/2892/2503
+f 1441/2878/2493 1444/2891/2502 1449/2894/2505 1445/2879/2494
+f 1445/2879/2494 1449/2894/2505 8730/2895/2506 8731/2884/2497
+f 1444/2891/2502 8734/2893/2504 8735/2896/2507 1449/2894/2505
+f 1449/2894/2505 8735/2896/2507 12916/2897/2508 8730/2895/2506
+f 1450/2898/2509 1454/2899/2510 1455/2900/2511 1451/2901/2512
+f 1451/2901/2512 1455/2900/2511 9154/2902/91 9155/2903/90
+f 1454/2899/2510 8746/2904/2513 8747/2905/2514 1455/2900/2511
+f 1455/2900/2511 8747/2905/2514 12985/2906/85 9154/2902/91
+f 1450/2898/2509 1451/2901/2512 1456/2907/2515 1452/2908/2516
+f 1452/2908/2516 1456/2907/2515 8732/2885/2498 8731/2884/2497
+f 1451/2901/2512 9155/2903/90 9156/2909/103 1456/2907/2515
+f 1456/2907/2515 9156/2909/103 12984/2886/105 8732/2885/2498
+f 1450/2898/2509 1452/2908/2516 1457/2910/2517 1453/2911/2518
+f 1453/2911/2518 1457/2910/2517 8748/2912/2519 8749/2913/2520
+f 1452/2908/2516 8731/2884/2497 8730/2895/2506 1457/2910/2517
+f 1457/2910/2517 8730/2895/2506 12916/2897/2508 8748/2912/2519
+f 1450/2898/2509 1453/2911/2518 1458/2914/2521 1454/2899/2510
+f 1454/2899/2510 1458/2914/2521 8745/2915/2522 8746/2904/2513
+f 1453/2911/2518 8749/2913/2520 8750/2916/2523 1458/2914/2521
+f 1458/2914/2521 8750/2916/2523 12918/2917/2524 8745/2915/2522
+f 1459/2918/2525 1463/2919/2526 1464/2920/2527 1460/2921/2528
+f 1460/2921/2528 1464/2920/2527 9160/2922/71 9161/2923/70
+f 1463/2919/2526 8761/2924/2529 8762/2925/2530 1464/2920/2527
+f 1464/2920/2527 8762/2925/2530 12986/2926/65 9160/2922/71
+f 1459/2918/2525 1460/2921/2528 1465/2927/2531 1461/2928/2532
+f 1461/2928/2532 1465/2927/2531 8747/2905/2514 8746/2904/2513
+f 1460/2921/2528 9161/2923/70 9162/2929/83 1465/2927/2531
+f 1465/2927/2531 9162/2929/83 12985/2906/85 8747/2905/2514
+f 1459/2918/2525 1461/2928/2532 1466/2930/2533 1462/2931/2534
+f 1462/2931/2534 1466/2930/2533 8763/2932/2535 8764/2933/2536
+f 1461/2928/2532 8746/2904/2513 8745/2915/2522 1466/2930/2533
+f 1466/2930/2533 8745/2915/2522 12918/2917/2524 8763/2932/2535
+f 1459/2918/2525 1462/2931/2534 1467/2934/2537 1463/2919/2526
+f 1463/2919/2526 1467/2934/2537 8760/2935/2538 8761/2924/2529
+f 1462/2931/2534 8764/2933/2536 8765/2936/2539 1467/2934/2537
+f 1467/2934/2537 8765/2936/2539 12920/2937/2540 8760/2935/2538
+f 1468/2938/2541 1472/2939/2542 1473/2940/2543 1469/2941/2544
+f 1469/2941/2544 1473/2940/2543 9166/2942/51 9167/2943/50
+f 1472/2939/2542 8776/2944/2545 8777/2945/2546 1473/2940/2543
+f 1473/2940/2543 8777/2945/2546 12987/2946/45 9166/2942/51
+f 1468/2938/2541 1469/2941/2544 1474/2947/2547 1470/2948/2548
+f 1470/2948/2548 1474/2947/2547 8762/2925/2530 8761/2924/2529
+f 1469/2941/2544 9167/2943/50 9168/2949/63 1474/2947/2547
+f 1474/2947/2547 9168/2949/63 12986/2926/65 8762/2925/2530
+f 1468/2938/2541 1470/2948/2548 1475/2950/2549 1471/2951/2550
+f 1471/2951/2550 1475/2950/2549 8778/2952/2551 8779/2953/2552
+f 1470/2948/2548 8761/2924/2529 8760/2935/2538 1475/2950/2549
+f 1475/2950/2549 8760/2935/2538 12920/2937/2540 8778/2952/2551
+f 1468/2938/2541 1471/2951/2550 1476/2954/2553 1472/2939/2542
+f 1472/2939/2542 1476/2954/2553 8775/2955/2554 8776/2944/2545
+f 1471/2951/2550 8779/2953/2552 8780/2956/2555 1476/2954/2553
+f 1476/2954/2553 8780/2956/2555 12922/2957/2556 8775/2955/2554
+f 1477/2958/2557 1481/2959/2558 1482/2960/2559 1478/2961/2560
+f 1478/2961/2560 1482/2960/2559 9172/2962/31 9173/2963/30
+f 1481/2959/2558 8791/2964/2561 8792/2965/2562 1482/2960/2559
+f 1482/2960/2559 8792/2965/2562 12988/2966/25 9172/2962/31
+f 1477/2958/2557 1478/2961/2560 1483/2967/2563 1479/2968/2564
+f 1479/2968/2564 1483/2967/2563 8777/2945/2546 8776/2944/2545
+f 1478/2961/2560 9173/2963/30 9174/2969/43 1483/2967/2563
+f 1483/2967/2563 9174/2969/43 12987/2946/45 8777/2945/2546
+f 1477/2958/2557 1479/2968/2564 1484/2970/2565 1480/2971/2566
+f 1480/2971/2566 1484/2970/2565 8793/2972/2567 8794/2973/2568
+f 1479/2968/2564 8776/2944/2545 8775/2955/2554 1484/2970/2565
+f 1484/2970/2565 8775/2955/2554 12922/2957/2556 8793/2972/2567
+f 1477/2958/2557 1480/2971/2566 1485/2974/2569 1481/2959/2558
+f 1481/2959/2558 1485/2974/2569 8790/2975/2570 8791/2964/2561
+f 1480/2971/2566 8794/2973/2568 8795/2976/2571 1485/2974/2569
+f 1485/2974/2569 8795/2976/2571 12924/2977/2572 8790/2975/2570
+f 1486/2978/2573 1490/2979/2574 1491/2980/2575 1487/2981/2576
+f 1487/2981/2576 1491/2980/2575 9178/2982/8 9179/2983/7
+f 1490/2979/2574 8806/2984/2577 8807/2985/2578 1491/2980/2575
+f 1491/2980/2575 8807/2985/2578 12989/2986/9 9178/2982/8
+f 1486/2978/2573 1487/2981/2576 1492/2987/2579 1488/2988/2580
+f 1488/2988/2580 1492/2987/2579 8792/2965/2562 8791/2964/2561
+f 1487/2981/2576 9179/2983/7 9180/2989/23 1492/2987/2579
+f 1492/2987/2579 9180/2989/23 12988/2966/25 8792/2965/2562
+f 1486/2978/2573 1488/2988/2580 1493/2990/2581 1489/2991/2582
+f 1489/2991/2582 1493/2990/2581 8808/2992/2583 8809/2993/2584
+f 1488/2988/2580 8791/2964/2561 8790/2975/2570 1493/2990/2581
+f 1493/2990/2581 8790/2975/2570 12924/2977/2572 8808/2992/2583
+f 1486/2978/2573 1489/2991/2582 1494/2994/2585 1490/2979/2574
+f 1490/2979/2574 1494/2994/2585 8805/2995/2586 8806/2984/2577
+f 1489/2991/2582 8809/2993/2584 8810/2996/2587 1494/2994/2585
+f 1494/2994/2585 8810/2996/2587 12926/2997/2588 8805/2995/2586
+f 1495/2998/2589 1499/2999/2590 1500/3000/2591 1496/3001/2592
+f 1496/3001/2592 1500/3000/2591 9043/3002/2593 9044/3003/2594
+f 1499/2999/2590 8573/2049/1964 8572/2048/1963 1500/3000/2591
+f 1500/3000/2591 8572/2048/1963 12966/2051/1966 9043/3002/2593
+f 1495/2998/2589 1496/3001/2592 1501/3004/2595 1497/3005/2596
+f 1497/3005/2596 1501/3004/2595 8902/3006/2597 8903/3007/2598
+f 1496/3001/2592 9044/3003/2594 9045/3008/2599 1501/3004/2595
+f 1501/3004/2595 9045/3008/2599 12965/3009/2600 8902/3006/2597
+f 1495/2998/2589 1497/3005/2596 1502/3010/2601 1498/3011/2602
+f 1498/3011/2602 1502/3010/2601 8620/3012/2603 8621/3013/2604
+f 1497/3005/2596 8903/3007/2598 8904/3014/2605 1502/3010/2601
+f 1502/3010/2601 8904/3014/2605 12941/3015/2606 8620/3012/2603
+f 1495/2998/2589 1498/3011/2602 1503/3016/2607 1499/2999/2590
+f 1499/2999/2590 1503/3016/2607 8574/2056/1971 8573/2049/1964
+f 1498/3011/2602 8621/3013/2604 8622/3017/2608 1503/3016/2607
+f 1503/3016/2607 8622/3017/2608 12886/2057/1972 8574/2056/1971
+f 1504/3018/2609 1508/3019/2610 1509/3020/2611 1505/3021/2612
+f 1505/3021/2612 1509/3020/2611 8622/3022/2608 8621/3023/2604
+f 1508/3019/2610 8567/2714/2355 8566/2727/2363 1509/3020/2611
+f 1509/3020/2611 8566/2727/2363 12886/2071/1972 8622/3022/2608
+f 1504/3018/2609 1505/3021/2612 1510/3024/2613 1506/3025/2614
+f 1506/3025/2614 1510/3024/2613 9085/3026/2615 9086/3027/2616
+f 1505/3021/2612 8621/3023/2604 8620/3028/2603 1510/3024/2613
+f 1510/3024/2613 8620/3028/2603 12941/3029/2606 9085/3026/2615
+f 1504/3018/2609 1506/3025/2614 1511/3030/2617 1507/3031/2618
+f 1507/3031/2618 1511/3030/2617 9088/3032/2619 9089/3033/2620
+f 1506/3025/2614 9086/3027/2616 9087/3034/2621 1511/3030/2617
+f 1511/3030/2617 9087/3034/2621 12974/3035/1037 9088/3032/2619
+f 1504/3018/2609 1507/3031/2618 1512/3036/2622 1508/3019/2610
+f 1508/3019/2610 1512/3036/2622 8568/2715/2356 8567/2714/2355
+f 1507/3031/2618 9089/3033/2620 9090/3037/2623 1512/3036/2622
+f 1512/3036/2622 9090/3037/2623 12973/2716/2357 8568/2715/2356
+f 1513/3038/2624 1517/3039/2625 1518/3040/2626 1514/3041/2627
+f 1514/3041/2627 1518/3040/2626 8626/3042/2628 8627/3043/2629
+f 1517/3039/2625 8327/774/699 8326/790/715 1518/3040/2626
+f 1518/3040/2626 8326/790/715 12844/792/717 8626/3042/2628
+f 1513/3038/2624 1514/3041/2627 1519/3044/2630 1515/3045/2631
+f 1515/3045/2631 1519/3044/2630 9016/3046/2632 9017/3047/2633
+f 1513/3038/2624 1515/3045/2631 1520/3048/2634 1516/3049/2635
+f 1516/3049/2635 1520/3048/2634 9019/3050/2636 9020/3051/2637
+f 1515/3045/2631 9017/3047/2633 9018/3052/2638 1520/3048/2634
+f 1520/3048/2634 9018/3052/2638 12962/3053/2639 9019/3050/2636
+f 1513/3038/2624 1516/3049/2635 1521/3054/2640 1517/3039/2625
+f 1517/3039/2625 1521/3054/2640 8328/775/700 8327/774/699
+f 1516/3049/2635 9020/3051/2637 9021/3055/2641 1521/3054/2640
+f 1521/3054/2640 9021/3055/2641 12961/776/701 8328/775/700
+f 1522/3056/2642 1526/3057/2643 1527/3058/2644 1523/3059/2645
+f 1523/3059/2645 1527/3058/2644 8634/3060/2646 8635/3061/2647
+f 1526/3057/2643 8576/2109/2015 8575/2108/2014 1527/3058/2644
+f 1527/3058/2644 8575/2108/2014 12888/2111/2017 8634/3060/2646
+f 1522/3056/2642 1523/3059/2645 1528/3062/2648 1524/3063/2649
+f 1524/3063/2649 1528/3062/2648 8908/3064/2650 8909/3065/2651
+f 1523/3059/2645 8635/3061/2647 8636/3066/2652 1528/3062/2648
+f 1528/3062/2648 8636/3066/2652 12943/3067/2653 8908/3064/2650
+f 1522/3056/2642 1524/3063/2649 1529/3068/2654 1525/3069/2655
+f 1525/3069/2655 1529/3068/2654 8611/3070/2656 8612/3071/2657
+f 1524/3063/2649 8909/3065/2651 8910/3072/2658 1529/3068/2654
+f 1529/3068/2654 8910/3072/2658 12942/3073/2659 8611/3070/2656
+f 1522/3056/2642 1525/3069/2655 1530/3074/2660 1526/3057/2643
+f 1526/3057/2643 1530/3074/2660 8577/2116/2022 8576/2109/2015
+f 1525/3069/2655 8612/3071/2657 8613/3075/2661 1530/3074/2660
+f 1530/3074/2660 8613/3075/2661 12887/2117/2023 8577/2116/2022
+f 1531/3076/2662 1535/3077/2663 1536/3078/2664 1532/3079/2665
+f 1532/3079/2665 1536/3078/2664 8614/3080/2666 8615/3081/2667
+f 1535/3077/2663 8345/3082/2668 8346/3083/2669 1536/3078/2664
+f 1536/3078/2664 8346/3083/2669 12845/3084/2670 8614/3080/2666
+f 1531/3076/2662 1532/3079/2665 1537/3085/2671 1533/3086/2672
+f 1533/3086/2672 1537/3085/2671 8886/3087/2673 8887/3088/2674
+f 1532/3079/2665 8615/3081/2667 8616/3089/2675 1537/3085/2671
+f 1537/3085/2671 8616/3089/2675 12940/3090/2676 8886/3087/2673
+f 1531/3076/2662 1533/3086/2672 1538/3091/2677 1534/3092/2678
+f 1534/3092/2678 1538/3091/2677 8637/3093/2679 8638/3094/2680
+f 1533/3086/2672 8887/3088/2674 8888/3095/2681 1538/3091/2677
+f 1538/3091/2677 8888/3095/2681 12939/3096/2682 8637/3093/2679
+f 1531/3076/2662 1534/3092/2678 1539/3097/2683 1535/3077/2663
+f 1535/3077/2663 1539/3097/2683 8344/3098/2684 8345/3082/2668
+f 1534/3092/2678 8638/3094/2680 8639/3099/2685 1539/3097/2683
+f 1539/3097/2683 8639/3099/2685 12848/3100/2686 8344/3098/2684
+f 1540/3101/2687 1544/3102/2688 1545/3103/2689 1541/3104/2690
+f 1541/3104/2690 1545/3103/2689 8649/3105/2691 8650/3106/2692
+f 1544/3102/2688 8579/2149/2050 8578/2148/2049 1545/3103/2689
+f 1545/3103/2689 8578/2148/2049 12889/2151/2052 8649/3105/2691
+f 1540/3101/2687 1541/3104/2690 1546/3107/2693 1542/3108/2694
+f 1542/3108/2694 1546/3107/2693 8914/3109/2695 8915/3110/2696
+f 1541/3104/2690 8650/3106/2692 8651/3111/2697 1546/3107/2693
+f 1546/3107/2693 8651/3111/2697 12944/3112/2698 8914/3109/2695
+f 1540/3101/2687 1542/3108/2694 1547/3113/2699 1543/3114/2700
+f 1543/3114/2700 1547/3113/2699 8636/3066/2652 8635/3061/2647
+f 1542/3108/2694 8915/3110/2696 8916/3115/2701 1547/3113/2699
+f 1547/3113/2699 8916/3115/2701 12943/3067/2653 8636/3066/2652
+f 1540/3101/2687 1543/3114/2700 1548/3116/2702 1544/3102/2688
+f 1544/3102/2688 1548/3116/2702 8580/2154/2055 8579/2149/2050
+f 1543/3114/2700 8635/3061/2647 8634/3060/2646 1548/3116/2702
+f 1548/3116/2702 8634/3060/2646 12888/2111/2017 8580/2154/2055
+f 1549/3117/2703 1553/3118/2704 1554/3119/2705 1550/3120/2706
+f 1550/3120/2706 1554/3119/2705 8639/3099/2685 8638/3094/2680
+f 1553/3118/2704 8357/3121/2707 8358/3122/2708 1554/3119/2705
+f 1554/3119/2705 8358/3122/2708 12848/3100/2686 8639/3099/2685
+f 1549/3117/2703 1550/3120/2706 1555/3123/2709 1551/3124/2710
+f 1551/3124/2710 1555/3123/2709 8880/3125/2711 8881/3126/2712
+f 1550/3120/2706 8638/3094/2680 8637/3093/2679 1555/3123/2709
+f 1555/3123/2709 8637/3093/2679 12939/3096/2682 8880/3125/2711
+f 1549/3117/2703 1551/3124/2710 1556/3127/2713 1552/3128/2714
+f 1552/3128/2714 1556/3127/2713 8652/3129/2715 8653/3130/2716
+f 1551/3124/2710 8881/3126/2712 8882/3131/2717 1556/3127/2713
+f 1556/3127/2713 8882/3131/2717 12938/3132/2718 8652/3129/2715
+f 1549/3117/2703 1552/3128/2714 1557/3133/2719 1553/3118/2704
+f 1553/3118/2704 1557/3133/2719 8356/3134/2720 8357/3121/2707
+f 1552/3128/2714 8653/3130/2716 8654/3135/2721 1557/3133/2719
+f 1557/3133/2719 8654/3135/2721 12850/3136/2722 8356/3134/2720
+f 1558/3137/2723 1562/3138/2724 1563/3139/2725 1559/3140/2726
+f 1559/3140/2726 1563/3139/2725 8664/3141/2727 8665/3142/2728
+f 1562/3138/2724 8582/2181/2078 8581/2180/2077 1563/3139/2725
+f 1563/3139/2725 8581/2180/2077 12890/2183/2080 8664/3141/2727
+f 1558/3137/2723 1559/3140/2726 1564/3143/2729 1560/3144/2730
+f 1560/3144/2730 1564/3143/2729 8920/3145/2731 8921/3146/2732
+f 1559/3140/2726 8665/3142/2728 8666/3147/2733 1564/3143/2729
+f 1564/3143/2729 8666/3147/2733 12945/3148/2734 8920/3145/2731
+f 1558/3137/2723 1560/3144/2730 1565/3149/2735 1561/3150/2736
+f 1561/3150/2736 1565/3149/2735 8651/3111/2697 8650/3106/2692
+f 1560/3144/2730 8921/3146/2732 8922/3151/2737 1565/3149/2735
+f 1565/3149/2735 8922/3151/2737 12944/3112/2698 8651/3111/2697
+f 1558/3137/2723 1561/3150/2736 1566/3152/2738 1562/3138/2724
+f 1562/3138/2724 1566/3152/2738 8583/2186/2083 8582/2181/2078
+f 1561/3150/2736 8650/3106/2692 8649/3105/2691 1566/3152/2738
+f 1566/3152/2738 8649/3105/2691 12889/2151/2052 8583/2186/2083
+f 1567/3153/2739 1571/3154/2740 1572/3155/2741 1568/3156/2742
+f 1568/3156/2742 1572/3155/2741 8654/3135/2721 8653/3130/2716
+f 1571/3154/2740 8369/3157/2743 8370/3158/2744 1572/3155/2741
+f 1572/3155/2741 8370/3158/2744 12850/3136/2722 8654/3135/2721
+f 1567/3153/2739 1568/3156/2742 1573/3159/2745 1569/3160/2746
+f 1569/3160/2746 1573/3159/2745 8874/3161/2747 8875/3162/2748
+f 1568/3156/2742 8653/3130/2716 8652/3129/2715 1573/3159/2745
+f 1573/3159/2745 8652/3129/2715 12938/3132/2718 8874/3161/2747
+f 1567/3153/2739 1569/3160/2746 1574/3163/2749 1570/3164/2750
+f 1570/3164/2750 1574/3163/2749 8667/3165/2751 8668/3166/2752
+f 1569/3160/2746 8875/3162/2748 8876/3167/2753 1574/3163/2749
+f 1574/3163/2749 8876/3167/2753 12937/3168/2754 8667/3165/2751
+f 1567/3153/2739 1570/3164/2750 1575/3169/2755 1571/3154/2740
+f 1571/3154/2740 1575/3169/2755 8368/3170/2756 8369/3157/2743
+f 1570/3164/2750 8668/3166/2752 8669/3171/2757 1575/3169/2755
+f 1575/3169/2755 8669/3171/2757 12852/3172/2758 8368/3170/2756
+f 1576/3173/2759 1580/3174/2760 1581/3175/2761 1577/3176/2762
+f 1577/3176/2762 1581/3175/2761 8679/3177/2763 8680/3178/2764
+f 1580/3174/2760 8585/2213/2106 8584/2212/2105 1581/3175/2761
+f 1581/3175/2761 8584/2212/2105 12891/2215/2108 8679/3177/2763
+f 1576/3173/2759 1577/3176/2762 1582/3179/2765 1578/3180/2766
+f 1578/3180/2766 1582/3179/2765 8926/3181/2767 8927/3182/2768
+f 1577/3176/2762 8680/3178/2764 8681/3183/2769 1582/3179/2765
+f 1582/3179/2765 8681/3183/2769 12946/3184/2770 8926/3181/2767
+f 1576/3173/2759 1578/3180/2766 1583/3185/2771 1579/3186/2772
+f 1579/3186/2772 1583/3185/2771 8666/3147/2733 8665/3142/2728
+f 1578/3180/2766 8927/3182/2768 8928/3187/2773 1583/3185/2771
+f 1583/3185/2771 8928/3187/2773 12945/3148/2734 8666/3147/2733
+f 1576/3173/2759 1579/3186/2772 1584/3188/2774 1580/3174/2760
+f 1580/3174/2760 1584/3188/2774 8586/2218/2111 8585/2213/2106
+f 1579/3186/2772 8665/3142/2728 8664/3141/2727 1584/3188/2774
+f 1584/3188/2774 8664/3141/2727 12890/2183/2080 8586/2218/2111
+f 1585/3189/2775 1589/3190/2776 1590/3191/2777 1586/3192/2778
+f 1586/3192/2778 1590/3191/2777 8669/3171/2757 8668/3166/2752
+f 1589/3190/2776 8381/3193/2779 8382/3194/2780 1590/3191/2777
+f 1590/3191/2777 8382/3194/2780 12852/3172/2758 8669/3171/2757
+f 1585/3189/2775 1586/3192/2778 1591/3195/2781 1587/3196/2782
+f 1587/3196/2782 1591/3195/2781 8868/3197/2783 8869/3198/2784
+f 1586/3192/2778 8668/3166/2752 8667/3165/2751 1591/3195/2781
+f 1591/3195/2781 8667/3165/2751 12937/3168/2754 8868/3197/2783
+f 1585/3189/2775 1587/3196/2782 1592/3199/2785 1588/3200/2786
+f 1588/3200/2786 1592/3199/2785 8682/3201/2787 8683/3202/2788
+f 1587/3196/2782 8869/3198/2784 8870/3203/2789 1592/3199/2785
+f 1592/3199/2785 8870/3203/2789 12936/3204/2790 8682/3201/2787
+f 1585/3189/2775 1588/3200/2786 1593/3205/2791 1589/3190/2776
+f 1589/3190/2776 1593/3205/2791 8380/3206/2792 8381/3193/2779
+f 1588/3200/2786 8683/3202/2788 8684/3207/2793 1593/3205/2791
+f 1593/3205/2791 8684/3207/2793 12854/3208/2794 8380/3206/2792
+f 1594/3209/2795 1598/3210/2796 1599/3211/2797 1595/3212/2798
+f 1595/3212/2798 1599/3211/2797 8694/3213/2799 8695/3214/2800
+f 1598/3210/2796 8588/2245/2134 8587/2244/2133 1599/3211/2797
+f 1599/3211/2797 8587/2244/2133 12892/2247/2136 8694/3213/2799
+f 1594/3209/2795 1595/3212/2798 1600/3215/2801 1596/3216/2802
+f 1596/3216/2802 1600/3215/2801 8932/3217/2803 8933/3218/2804
+f 1595/3212/2798 8695/3214/2800 8696/3219/2805 1600/3215/2801
+f 1600/3215/2801 8696/3219/2805 12947/3220/2806 8932/3217/2803
+f 1594/3209/2795 1596/3216/2802 1601/3221/2807 1597/3222/2808
+f 1597/3222/2808 1601/3221/2807 8681/3183/2769 8680/3178/2764
+f 1596/3216/2802 8933/3218/2804 8934/3223/2809 1601/3221/2807
+f 1601/3221/2807 8934/3223/2809 12946/3184/2770 8681/3183/2769
+f 1594/3209/2795 1597/3222/2808 1602/3224/2810 1598/3210/2796
+f 1598/3210/2796 1602/3224/2810 8589/2250/2139 8588/2245/2134
+f 1597/3222/2808 8680/3178/2764 8679/3177/2763 1602/3224/2810
+f 1602/3224/2810 8679/3177/2763 12891/2215/2108 8589/2250/2139
+f 1603/3225/2811 1607/3226/2812 1608/3227/2813 1604/3228/2814
+f 1604/3228/2814 1608/3227/2813 8684/3207/2793 8683/3202/2788
+f 1607/3226/2812 8393/3229/2815 8394/3230/2816 1608/3227/2813
+f 1608/3227/2813 8394/3230/2816 12854/3208/2794 8684/3207/2793
+f 1603/3225/2811 1604/3228/2814 1609/3231/2817 1605/3232/2818
+f 1605/3232/2818 1609/3231/2817 8862/3233/2819 8863/3234/2820
+f 1604/3228/2814 8683/3202/2788 8682/3201/2787 1609/3231/2817
+f 1609/3231/2817 8682/3201/2787 12936/3204/2790 8862/3233/2819
+f 1603/3225/2811 1605/3232/2818 1610/3235/2821 1606/3236/2822
+f 1606/3236/2822 1610/3235/2821 8697/3237/2823 8698/3238/2824
+f 1605/3232/2818 8863/3234/2820 8864/3239/2825 1610/3235/2821
+f 1610/3235/2821 8864/3239/2825 12935/3240/2826 8697/3237/2823
+f 1603/3225/2811 1606/3236/2822 1611/3241/2827 1607/3226/2812
+f 1607/3226/2812 1611/3241/2827 8392/3242/2828 8393/3229/2815
+f 1606/3236/2822 8698/3238/2824 8699/3243/2829 1611/3241/2827
+f 1611/3241/2827 8699/3243/2829 12856/3244/2830 8392/3242/2828
+f 1612/3245/2831 1616/3246/2832 1617/3247/2833 1613/3248/2834
+f 1613/3248/2834 1617/3247/2833 8709/3249/2835 8710/3250/2836
+f 1616/3246/2832 8591/2277/2162 8590/2276/2161 1617/3247/2833
+f 1617/3247/2833 8590/2276/2161 12893/2279/2164 8709/3249/2835
+f 1612/3245/2831 1613/3248/2834 1618/3251/2837 1614/3252/2838
+f 1614/3252/2838 1618/3251/2837 8938/3253/2839 8939/3254/2840
+f 1613/3248/2834 8710/3250/2836 8711/3255/2841 1618/3251/2837
+f 1618/3251/2837 8711/3255/2841 12948/3256/2842 8938/3253/2839
+f 1612/3245/2831 1614/3252/2838 1619/3257/2843 1615/3258/2844
+f 1615/3258/2844 1619/3257/2843 8696/3219/2805 8695/3214/2800
+f 1614/3252/2838 8939/3254/2840 8940/3259/2845 1619/3257/2843
+f 1619/3257/2843 8940/3259/2845 12947/3220/2806 8696/3219/2805
+f 1612/3245/2831 1615/3258/2844 1620/3260/2846 1616/3246/2832
+f 1616/3246/2832 1620/3260/2846 8592/2282/2167 8591/2277/2162
+f 1615/3258/2844 8695/3214/2800 8694/3213/2799 1620/3260/2846
+f 1620/3260/2846 8694/3213/2799 12892/2247/2136 8592/2282/2167
+f 1621/3261/2847 1625/3262/2848 1626/3263/2849 1622/3264/2850
+f 1622/3264/2850 1626/3263/2849 8699/3243/2829 8698/3238/2824
+f 1625/3262/2848 8405/3265/2851 8406/3266/2852 1626/3263/2849
+f 1626/3263/2849 8406/3266/2852 12856/3244/2830 8699/3243/2829
+f 1621/3261/2847 1622/3264/2850 1627/3267/2853 1623/3268/2854
+f 1623/3268/2854 1627/3267/2853 8856/3269/2855 8857/3270/2856
+f 1622/3264/2850 8698/3238/2824 8697/3237/2823 1627/3267/2853
+f 1627/3267/2853 8697/3237/2823 12935/3240/2826 8856/3269/2855
+f 1621/3261/2847 1623/3268/2854 1628/3271/2857 1624/3272/2858
+f 1624/3272/2858 1628/3271/2857 8712/3273/2859 8713/3274/2860
+f 1623/3268/2854 8857/3270/2856 8858/3275/2861 1628/3271/2857
+f 1628/3271/2857 8858/3275/2861 12934/3276/2862 8712/3273/2859
+f 1621/3261/2847 1624/3272/2858 1629/3277/2863 1625/3262/2848
+f 1625/3262/2848 1629/3277/2863 8404/3278/2864 8405/3265/2851
+f 1624/3272/2858 8713/3274/2860 8714/3279/2865 1629/3277/2863
+f 1629/3277/2863 8714/3279/2865 12858/3280/2866 8404/3278/2864
+f 1630/3281/2867 1634/3282/2868 1635/3283/2869 1631/3284/2870
+f 1631/3284/2870 1635/3283/2869 8724/3285/2871 8725/3286/2872
+f 1634/3282/2868 8594/2309/2190 8593/2308/2189 1635/3283/2869
+f 1635/3283/2869 8593/2308/2189 12894/2311/2192 8724/3285/2871
+f 1630/3281/2867 1631/3284/2870 1636/3287/2873 1632/3288/2874
+f 1632/3288/2874 1636/3287/2873 8944/3289/2875 8945/3290/2876
+f 1631/3284/2870 8725/3286/2872 8726/3291/2877 1636/3287/2873
+f 1636/3287/2873 8726/3291/2877 12949/3292/2878 8944/3289/2875
+f 1630/3281/2867 1632/3288/2874 1637/3293/2879 1633/3294/2880
+f 1633/3294/2880 1637/3293/2879 8711/3255/2841 8710/3250/2836
+f 1632/3288/2874 8945/3290/2876 8946/3295/2881 1637/3293/2879
+f 1637/3293/2879 8946/3295/2881 12948/3256/2842 8711/3255/2841
+f 1630/3281/2867 1633/3294/2880 1638/3296/2882 1634/3282/2868
+f 1634/3282/2868 1638/3296/2882 8595/2314/2195 8594/2309/2190
+f 1633/3294/2880 8710/3250/2836 8709/3249/2835 1638/3296/2882
+f 1638/3296/2882 8709/3249/2835 12893/2279/2164 8595/2314/2195
+f 1639/3297/2883 1643/3298/2884 1644/3299/2885 1640/3300/2886
+f 1640/3300/2886 1644/3299/2885 8714/3279/2865 8713/3274/2860
+f 1643/3298/2884 8417/3301/2887 8418/3302/2888 1644/3299/2885
+f 1644/3299/2885 8418/3302/2888 12858/3280/2866 8714/3279/2865
+f 1639/3297/2883 1640/3300/2886 1645/3303/2889 1641/3304/2890
+f 1641/3304/2890 1645/3303/2889 8850/3305/2891 8851/3306/2892
+f 1640/3300/2886 8713/3274/2860 8712/3273/2859 1645/3303/2889
+f 1645/3303/2889 8712/3273/2859 12934/3276/2862 8850/3305/2891
+f 1639/3297/2883 1641/3304/2890 1646/3307/2893 1642/3308/2894
+f 1642/3308/2894 1646/3307/2893 8727/3309/2895 8728/3310/2896
+f 1641/3304/2890 8851/3306/2892 8852/3311/2897 1646/3307/2893
+f 1646/3307/2893 8852/3311/2897 12933/3312/2898 8727/3309/2895
+f 1639/3297/2883 1642/3308/2894 1647/3313/2899 1643/3298/2884
+f 1643/3298/2884 1647/3313/2899 8416/3314/2900 8417/3301/2887
+f 1642/3308/2894 8728/3310/2896 8729/3315/2901 1647/3313/2899
+f 1647/3313/2899 8729/3315/2901 12860/3316/2902 8416/3314/2900
+f 1648/3317/2903 1652/3318/2904 1653/3319/2905 1649/3320/2906
+f 1649/3320/2906 1653/3319/2905 8739/3321/2907 8740/3322/2908
+f 1652/3318/2904 8597/2341/2218 8596/2340/2217 1653/3319/2905
+f 1653/3319/2905 8596/2340/2217 12895/2343/2220 8739/3321/2907
+f 1648/3317/2903 1649/3320/2906 1654/3323/2909 1650/3324/2910
+f 1650/3324/2910 1654/3323/2909 8950/3325/2911 8951/3326/2912
+f 1649/3320/2906 8740/3322/2908 8741/3327/2913 1654/3323/2909
+f 1654/3323/2909 8741/3327/2913 12950/3328/2914 8950/3325/2911
+f 1648/3317/2903 1650/3324/2910 1655/3329/2915 1651/3330/2916
+f 1651/3330/2916 1655/3329/2915 8726/3291/2877 8725/3286/2872
+f 1650/3324/2910 8951/3326/2912 8952/3331/2917 1655/3329/2915
+f 1655/3329/2915 8952/3331/2917 12949/3292/2878 8726/3291/2877
+f 1648/3317/2903 1651/3330/2916 1656/3332/2918 1652/3318/2904
+f 1652/3318/2904 1656/3332/2918 8598/2346/2223 8597/2341/2218
+f 1651/3330/2916 8725/3286/2872 8724/3285/2871 1656/3332/2918
+f 1656/3332/2918 8724/3285/2871 12894/2311/2192 8598/2346/2223
+f 1657/3333/2919 1661/3334/2920 1662/3335/2921 1658/3336/2922
+f 1658/3336/2922 1662/3335/2921 8729/3315/2901 8728/3310/2896
+f 1661/3334/2920 8429/3337/2923 8430/3338/2924 1662/3335/2921
+f 1662/3335/2921 8430/3338/2924 12860/3316/2902 8729/3315/2901
+f 1657/3333/2919 1658/3336/2922 1663/3339/2925 1659/3340/2926
+f 1659/3340/2926 1663/3339/2925 8844/3341/2927 8845/3342/2928
+f 1658/3336/2922 8728/3310/2896 8727/3309/2895 1663/3339/2925
+f 1663/3339/2925 8727/3309/2895 12933/3312/2898 8844/3341/2927
+f 1657/3333/2919 1659/3340/2926 1664/3343/2929 1660/3344/2930
+f 1660/3344/2930 1664/3343/2929 8742/3345/2931 8743/3346/2932
+f 1659/3340/2926 8845/3342/2928 8846/3347/2933 1664/3343/2929
+f 1664/3343/2929 8846/3347/2933 12932/3348/2934 8742/3345/2931
+f 1657/3333/2919 1660/3344/2930 1665/3349/2935 1661/3334/2920
+f 1661/3334/2920 1665/3349/2935 8428/3350/2936 8429/3337/2923
+f 1660/3344/2930 8743/3346/2932 8744/3351/2937 1665/3349/2935
+f 1665/3349/2935 8744/3351/2937 12862/3352/2938 8428/3350/2936
+f 1666/3353/2939 1670/3354/2940 1671/3355/2941 1667/3356/2942
+f 1667/3356/2942 1671/3355/2941 8754/3357/2943 8755/3358/2944
+f 1670/3354/2940 8600/2373/2246 8599/2372/2245 1671/3355/2941
+f 1671/3355/2941 8599/2372/2245 12896/2375/2248 8754/3357/2943
+f 1666/3353/2939 1667/3356/2942 1672/3359/2945 1668/3360/2946
+f 1668/3360/2946 1672/3359/2945 8956/3361/2947 8957/3362/2948
+f 1667/3356/2942 8755/3358/2944 8756/3363/2949 1672/3359/2945
+f 1672/3359/2945 8756/3363/2949 12951/3364/2950 8956/3361/2947
+f 1666/3353/2939 1668/3360/2946 1673/3365/2951 1669/3366/2952
+f 1669/3366/2952 1673/3365/2951 8741/3327/2913 8740/3322/2908
+f 1668/3360/2946 8957/3362/2948 8958/3367/2953 1673/3365/2951
+f 1673/3365/2951 8958/3367/2953 12950/3328/2914 8741/3327/2913
+f 1666/3353/2939 1669/3366/2952 1674/3368/2954 1670/3354/2940
+f 1670/3354/2940 1674/3368/2954 8601/2378/2251 8600/2373/2246
+f 1669/3366/2952 8740/3322/2908 8739/3321/2907 1674/3368/2954
+f 1674/3368/2954 8739/3321/2907 12895/2343/2220 8601/2378/2251
+f 1675/3369/2955 1679/3370/2956 1680/3371/2957 1676/3372/2958
+f 1676/3372/2958 1680/3371/2957 8744/3351/2937 8743/3346/2932
+f 1679/3370/2956 8441/3373/2959 8442/3374/2960 1680/3371/2957
+f 1680/3371/2957 8442/3374/2960 12862/3352/2938 8744/3351/2937
+f 1675/3369/2955 1676/3372/2958 1681/3375/2961 1677/3376/2962
+f 1677/3376/2962 1681/3375/2961 8838/3377/2963 8839/3378/2964
+f 1676/3372/2958 8743/3346/2932 8742/3345/2931 1681/3375/2961
+f 1681/3375/2961 8742/3345/2931 12932/3348/2934 8838/3377/2963
+f 1675/3369/2955 1677/3376/2962 1682/3379/2965 1678/3380/2966
+f 1678/3380/2966 1682/3379/2965 8757/3381/2967 8758/3382/2968
+f 1677/3376/2962 8839/3378/2964 8840/3383/2969 1682/3379/2965
+f 1682/3379/2965 8840/3383/2969 12931/3384/2970 8757/3381/2967
+f 1675/3369/2955 1678/3380/2966 1683/3385/2971 1679/3370/2956
+f 1679/3370/2956 1683/3385/2971 8440/3386/2972 8441/3373/2959
+f 1678/3380/2966 8758/3382/2968 8759/3387/2973 1683/3385/2971
+f 1683/3385/2971 8759/3387/2973 12864/3388/2974 8440/3386/2972
+f 1684/3389/2975 1688/3390/2976 1689/3391/2977 1685/3392/2978
+f 1685/3392/2978 1689/3391/2977 8769/3393/2979 8770/3394/2980
+f 1688/3390/2976 8603/2405/2274 8602/2404/2273 1689/3391/2977
+f 1689/3391/2977 8602/2404/2273 12897/2407/2276 8769/3393/2979
+f 1684/3389/2975 1685/3392/2978 1690/3395/2981 1686/3396/2982
+f 1686/3396/2982 1690/3395/2981 8962/3397/2983 8963/3398/2984
+f 1685/3392/2978 8770/3394/2980 8771/3399/2985 1690/3395/2981
+f 1690/3395/2981 8771/3399/2985 12952/3400/2986 8962/3397/2983
+f 1684/3389/2975 1686/3396/2982 1691/3401/2987 1687/3402/2988
+f 1687/3402/2988 1691/3401/2987 8756/3363/2949 8755/3358/2944
+f 1686/3396/2982 8963/3398/2984 8964/3403/2989 1691/3401/2987
+f 1691/3401/2987 8964/3403/2989 12951/3364/2950 8756/3363/2949
+f 1684/3389/2975 1687/3402/2988 1692/3404/2990 1688/3390/2976
+f 1688/3390/2976 1692/3404/2990 8604/2410/2279 8603/2405/2274
+f 1687/3402/2988 8755/3358/2944 8754/3357/2943 1692/3404/2990
+f 1692/3404/2990 8754/3357/2943 12896/2375/2248 8604/2410/2279
+f 1693/3405/2991 1697/3406/2992 1698/3407/2993 1694/3408/2994
+f 1694/3408/2994 1698/3407/2993 8759/3387/2973 8758/3382/2968
+f 1697/3406/2992 8453/3409/2995 8454/3410/2996 1698/3407/2993
+f 1698/3407/2993 8454/3410/2996 12864/3388/2974 8759/3387/2973
+f 1693/3405/2991 1694/3408/2994 1699/3411/2997 1695/3412/2998
+f 1695/3412/2998 1699/3411/2997 8832/3413/2999 8833/3414/3000
+f 1694/3408/2994 8758/3382/2968 8757/3381/2967 1699/3411/2997
+f 1699/3411/2997 8757/3381/2967 12931/3384/2970 8832/3413/2999
+f 1693/3405/2991 1695/3412/2998 1700/3415/3001 1696/3416/3002
+f 1696/3416/3002 1700/3415/3001 8772/3417/3003 8773/3418/3004
+f 1695/3412/2998 8833/3414/3000 8834/3419/3005 1700/3415/3001
+f 1700/3415/3001 8834/3419/3005 12930/3420/3006 8772/3417/3003
+f 1693/3405/2991 1696/3416/3002 1701/3421/3007 1697/3406/2992
+f 1697/3406/2992 1701/3421/3007 8452/3422/3008 8453/3409/2995
+f 1696/3416/3002 8773/3418/3004 8774/3423/3009 1701/3421/3007
+f 1701/3421/3007 8774/3423/3009 12866/3424/3010 8452/3422/3008
+f 1702/3425/3011 1706/3426/3012 1707/3427/3013 1703/3428/3014
+f 1703/3428/3014 1707/3427/3013 8784/3429/3015 8785/3430/3016
+f 1706/3426/3012 8606/2437/2302 8605/2436/2301 1707/3427/3013
+f 1707/3427/3013 8605/2436/2301 12898/2439/2304 8784/3429/3015
+f 1702/3425/3011 1703/3428/3014 1708/3431/3017 1704/3432/3018
+f 1704/3432/3018 1708/3431/3017 8968/3433/3019 8969/3434/3020
+f 1703/3428/3014 8785/3430/3016 8786/3435/3021 1708/3431/3017
+f 1708/3431/3017 8786/3435/3021 12953/3436/3022 8968/3433/3019
+f 1702/3425/3011 1704/3432/3018 1709/3437/3023 1705/3438/3024
+f 1705/3438/3024 1709/3437/3023 8771/3399/2985 8770/3394/2980
+f 1704/3432/3018 8969/3434/3020 8970/3439/3025 1709/3437/3023
+f 1709/3437/3023 8970/3439/3025 12952/3400/2986 8771/3399/2985
+f 1702/3425/3011 1705/3438/3024 1710/3440/3026 1706/3426/3012
+f 1706/3426/3012 1710/3440/3026 8607/2442/2307 8606/2437/2302
+f 1705/3438/3024 8770/3394/2980 8769/3393/2979 1710/3440/3026
+f 1710/3440/3026 8769/3393/2979 12897/2407/2276 8607/2442/2307
+f 1711/3441/3027 1715/3442/3028 1716/3443/3029 1712/3444/3030
+f 1712/3444/3030 1716/3443/3029 8774/3423/3009 8773/3418/3004
+f 1715/3442/3028 8465/3445/3031 8466/3446/3032 1716/3443/3029
+f 1716/3443/3029 8466/3446/3032 12866/3424/3010 8774/3423/3009
+f 1711/3441/3027 1712/3444/3030 1717/3447/3033 1713/3448/3034
+f 1713/3448/3034 1717/3447/3033 8826/3449/3035 8827/3450/3036
+f 1712/3444/3030 8773/3418/3004 8772/3417/3003 1717/3447/3033
+f 1717/3447/3033 8772/3417/3003 12930/3420/3006 8826/3449/3035
+f 1711/3441/3027 1713/3448/3034 1718/3451/3037 1714/3452/3038
+f 1714/3452/3038 1718/3451/3037 8787/3453/3039 8788/3454/3040
+f 1713/3448/3034 8827/3450/3036 8828/3455/3041 1718/3451/3037
+f 1718/3451/3037 8828/3455/3041 12929/3456/3042 8787/3453/3039
+f 1711/3441/3027 1714/3452/3038 1719/3457/3043 1715/3442/3028
+f 1715/3442/3028 1719/3457/3043 8464/3458/3044 8465/3445/3031
+f 1714/3452/3038 8788/3454/3040 8789/3459/3045 1719/3457/3043
+f 1719/3457/3043 8789/3459/3045 12868/3460/3046 8464/3458/3044
+f 1720/3461/3047 1724/3462/3048 1725/3463/3049 1721/3464/3050
+f 1721/3464/3050 1725/3463/3049 8799/3465/3051 8800/3466/3052
+f 1724/3462/3048 8609/2469/2330 8608/2468/2329 1725/3463/3049
+f 1725/3463/3049 8608/2468/2329 12899/2471/2332 8799/3465/3051
+f 1720/3461/3047 1721/3464/3050 1726/3467/3053 1722/3468/3054
+f 1722/3468/3054 1726/3467/3053 8974/3469/3055 8975/3470/3056
+f 1721/3464/3050 8800/3466/3052 8801/3471/3057 1726/3467/3053
+f 1726/3467/3053 8801/3471/3057 12954/3472/3058 8974/3469/3055
+f 1720/3461/3047 1722/3468/3054 1727/3473/3059 1723/3474/3060
+f 1723/3474/3060 1727/3473/3059 8786/3435/3021 8785/3430/3016
+f 1722/3468/3054 8975/3470/3056 8976/3475/3061 1727/3473/3059
+f 1727/3473/3059 8976/3475/3061 12953/3436/3022 8786/3435/3021
+f 1720/3461/3047 1723/3474/3060 1728/3476/3062 1724/3462/3048
+f 1724/3462/3048 1728/3476/3062 8610/2474/2335 8609/2469/2330
+f 1723/3474/3060 8785/3430/3016 8784/3429/3015 1728/3476/3062
+f 1728/3476/3062 8784/3429/3015 12898/2439/2304 8610/2474/2335
+f 1729/3477/3063 1733/3478/3064 1734/3479/3065 1730/3480/3066
+f 1730/3480/3066 1734/3479/3065 8789/3459/3045 8788/3454/3040
+f 1733/3478/3064 8477/3481/3067 8478/3482/3068 1734/3479/3065
+f 1734/3479/3065 8478/3482/3068 12868/3460/3046 8789/3459/3045
+f 1729/3477/3063 1730/3480/3066 1735/3483/3069 1731/3484/3070
+f 1731/3484/3070 1735/3483/3069 8820/3485/3071 8821/3486/3072
+f 1730/3480/3066 8788/3454/3040 8787/3453/3039 1735/3483/3069
+f 1735/3483/3069 8787/3453/3039 12929/3456/3042 8820/3485/3071
+f 1729/3477/3063 1731/3484/3070 1736/3487/3073 1732/3488/3074
+f 1732/3488/3074 1736/3487/3073 8802/3489/3075 8803/3490/3076
+f 1731/3484/3070 8821/3486/3072 8822/3491/3077 1736/3487/3073
+f 1736/3487/3073 8822/3491/3077 12928/3492/3078 8802/3489/3075
+f 1729/3477/3063 1732/3488/3074 1737/3493/3079 1733/3478/3064
+f 1733/3478/3064 1737/3493/3079 8476/3494/3080 8477/3481/3067
+f 1732/3488/3074 8803/3490/3076 8804/3495/3081 1737/3493/3079
+f 1737/3493/3079 8804/3495/3081 12870/3496/3082 8476/3494/3080
+f 1738/3497/3083 1742/3498/3084 1743/3499/3085 1739/3500/3086
+f 1739/3500/3086 1743/3499/3085 8817/3501/3087 8818/3502/3088
+f 1742/3498/3084 8821/3486/3072 8820/3485/3071 1743/3499/3085
+f 1743/3499/3085 8820/3485/3071 12929/3456/3042 8817/3501/3087
+f 1738/3497/3083 1739/3500/3086 1744/3503/3089 1740/3504/3090
+f 1740/3504/3090 1744/3503/3089 8811/3505/3091 8812/3506/3092
+f 1739/3500/3086 8818/3502/3088 8819/3507/3093 1744/3503/3089
+f 1744/3503/3089 8819/3507/3093 12925/3508/3094 8811/3505/3091
+f 1738/3497/3083 1740/3504/3090 1745/3509/3095 1741/3510/3096
+f 1741/3510/3096 1745/3509/3095 8814/3511/3097 8815/3512/3098
+f 1740/3504/3090 8812/3506/3092 8813/3513/3099 1745/3509/3095
+f 1745/3509/3095 8813/3513/3099 12927/3514/3100 8814/3511/3097
+f 1738/3497/3083 1741/3510/3096 1746/3515/3101 1742/3498/3084
+f 1742/3498/3084 1746/3515/3101 8822/3491/3077 8821/3486/3072
+f 1741/3510/3096 8815/3512/3098 8816/3516/3102 1746/3515/3101
+f 1746/3515/3101 8816/3516/3102 12928/3492/3078 8822/3491/3077
+f 1747/3517/3103 1751/3518/3104 1752/3519/3105 1748/3520/3106
+f 1748/3520/3106 1752/3519/3105 8823/3521/3107 8824/3522/3108
+f 1751/3518/3104 8827/3450/3036 8826/3449/3035 1752/3519/3105
+f 1752/3519/3105 8826/3449/3035 12930/3420/3006 8823/3521/3107
+f 1747/3517/3103 1748/3520/3106 1753/3523/3109 1749/3524/3110
+f 1749/3524/3110 1753/3523/3109 8796/3525/3111 8797/3526/3112
+f 1748/3520/3106 8824/3522/3108 8825/3527/3113 1753/3523/3109
+f 1753/3523/3109 8825/3527/3113 12923/3528/3114 8796/3525/3111
+f 1747/3517/3103 1749/3524/3110 1754/3529/3115 1750/3530/3116
+f 1750/3530/3116 1754/3529/3115 8819/3507/3093 8818/3502/3088
+f 1749/3524/3110 8797/3526/3112 8798/3531/3117 1754/3529/3115
+f 1754/3529/3115 8798/3531/3117 12925/3508/3094 8819/3507/3093
+f 1747/3517/3103 1750/3530/3116 1755/3532/3118 1751/3518/3104
+f 1751/3518/3104 1755/3532/3118 8828/3455/3041 8827/3450/3036
+f 1750/3530/3116 8818/3502/3088 8817/3501/3087 1755/3532/3118
+f 1755/3532/3118 8817/3501/3087 12929/3456/3042 8828/3455/3041
+f 1756/3533/3119 1760/3534/3120 1761/3535/3121 1757/3536/3122
+f 1757/3536/3122 1761/3535/3121 8829/3537/3123 8830/3538/3124
+f 1760/3534/3120 8833/3414/3000 8832/3413/2999 1761/3535/3121
+f 1761/3535/3121 8832/3413/2999 12931/3384/2970 8829/3537/3123
+f 1756/3533/3119 1757/3536/3122 1762/3539/3125 1758/3540/3126
+f 1758/3540/3126 1762/3539/3125 8781/3541/3127 8782/3542/3128
+f 1757/3536/3122 8830/3538/3124 8831/3543/3129 1762/3539/3125
+f 1762/3539/3125 8831/3543/3129 12921/3544/3130 8781/3541/3127
+f 1756/3533/3119 1758/3540/3126 1763/3545/3131 1759/3546/3132
+f 1759/3546/3132 1763/3545/3131 8825/3527/3113 8824/3522/3108
+f 1758/3540/3126 8782/3542/3128 8783/3547/3133 1763/3545/3131
+f 1763/3545/3131 8783/3547/3133 12923/3528/3114 8825/3527/3113
+f 1756/3533/3119 1759/3546/3132 1764/3548/3134 1760/3534/3120
+f 1760/3534/3120 1764/3548/3134 8834/3419/3005 8833/3414/3000
+f 1759/3546/3132 8824/3522/3108 8823/3521/3107 1764/3548/3134
+f 1764/3548/3134 8823/3521/3107 12930/3420/3006 8834/3419/3005
+f 1765/3549/3135 1769/3550/3136 1770/3551/3137 1766/3552/3138
+f 1766/3552/3138 1770/3551/3137 8835/3553/3139 8836/3554/3140
+f 1769/3550/3136 8839/3378/2964 8838/3377/2963 1770/3551/3137
+f 1770/3551/3137 8838/3377/2963 12932/3348/2934 8835/3553/3139
+f 1765/3549/3135 1766/3552/3138 1771/3555/3141 1767/3556/3142
+f 1767/3556/3142 1771/3555/3141 8766/3557/3143 8767/3558/3144
+f 1766/3552/3138 8836/3554/3140 8837/3559/3145 1771/3555/3141
+f 1771/3555/3141 8837/3559/3145 12919/3560/3146 8766/3557/3143
+f 1765/3549/3135 1767/3556/3142 1772/3561/3147 1768/3562/3148
+f 1768/3562/3148 1772/3561/3147 8831/3543/3129 8830/3538/3124
+f 1767/3556/3142 8767/3558/3144 8768/3563/3149 1772/3561/3147
+f 1772/3561/3147 8768/3563/3149 12921/3544/3130 8831/3543/3129
+f 1765/3549/3135 1768/3562/3148 1773/3564/3150 1769/3550/3136
+f 1769/3550/3136 1773/3564/3150 8840/3383/2969 8839/3378/2964
+f 1768/3562/3148 8830/3538/3124 8829/3537/3123 1773/3564/3150
+f 1773/3564/3150 8829/3537/3123 12931/3384/2970 8840/3383/2969
+f 1774/3565/3151 1778/3566/3152 1779/3567/3153 1775/3568/3154
+f 1775/3568/3154 1779/3567/3153 8841/3569/3155 8842/3570/3156
+f 1778/3566/3152 8845/3342/2928 8844/3341/2927 1779/3567/3153
+f 1779/3567/3153 8844/3341/2927 12933/3312/2898 8841/3569/3155
+f 1774/3565/3151 1775/3568/3154 1780/3571/3157 1776/3572/3158
+f 1776/3572/3158 1780/3571/3157 8751/3573/3159 8752/3574/3160
+f 1775/3568/3154 8842/3570/3156 8843/3575/3161 1780/3571/3157
+f 1780/3571/3157 8843/3575/3161 12917/3576/3162 8751/3573/3159
+f 1774/3565/3151 1776/3572/3158 1781/3577/3163 1777/3578/3164
+f 1777/3578/3164 1781/3577/3163 8837/3559/3145 8836/3554/3140
+f 1776/3572/3158 8752/3574/3160 8753/3579/3165 1781/3577/3163
+f 1781/3577/3163 8753/3579/3165 12919/3560/3146 8837/3559/3145
+f 1774/3565/3151 1777/3578/3164 1782/3580/3166 1778/3566/3152
+f 1778/3566/3152 1782/3580/3166 8846/3347/2933 8845/3342/2928
+f 1777/3578/3164 8836/3554/3140 8835/3553/3139 1782/3580/3166
+f 1782/3580/3166 8835/3553/3139 12932/3348/2934 8846/3347/2933
+f 1783/3581/3167 1787/3582/3168 1788/3583/3169 1784/3584/3170
+f 1784/3584/3170 1788/3583/3169 8847/3585/3171 8848/3586/3172
+f 1787/3582/3168 8851/3306/2892 8850/3305/2891 1788/3583/3169
+f 1788/3583/3169 8850/3305/2891 12934/3276/2862 8847/3585/3171
+f 1783/3581/3167 1784/3584/3170 1789/3587/3173 1785/3588/3174
+f 1785/3588/3174 1789/3587/3173 8736/3589/3175 8737/3590/3176
+f 1784/3584/3170 8848/3586/3172 8849/3591/3177 1789/3587/3173
+f 1789/3587/3173 8849/3591/3177 12915/3592/3178 8736/3589/3175
+f 1783/3581/3167 1785/3588/3174 1790/3593/3179 1786/3594/3180
+f 1786/3594/3180 1790/3593/3179 8843/3575/3161 8842/3570/3156
+f 1785/3588/3174 8737/3590/3176 8738/3595/3181 1790/3593/3179
+f 1790/3593/3179 8738/3595/3181 12917/3576/3162 8843/3575/3161
+f 1783/3581/3167 1786/3594/3180 1791/3596/3182 1787/3582/3168
+f 1787/3582/3168 1791/3596/3182 8852/3311/2897 8851/3306/2892
+f 1786/3594/3180 8842/3570/3156 8841/3569/3155 1791/3596/3182
+f 1791/3596/3182 8841/3569/3155 12933/3312/2898 8852/3311/2897
+f 1792/3597/3183 1796/3598/3184 1797/3599/3185 1793/3600/3186
+f 1793/3600/3186 1797/3599/3185 8853/3601/3187 8854/3602/3188
+f 1796/3598/3184 8857/3270/2856 8856/3269/2855 1797/3599/3185
+f 1797/3599/3185 8856/3269/2855 12935/3240/2826 8853/3601/3187
+f 1792/3597/3183 1793/3600/3186 1798/3603/3189 1794/3604/3190
+f 1794/3604/3190 1798/3603/3189 8721/3605/3191 8722/3606/3192
+f 1793/3600/3186 8854/3602/3188 8855/3607/3193 1798/3603/3189
+f 1798/3603/3189 8855/3607/3193 12913/3608/3194 8721/3605/3191
+f 1792/3597/3183 1794/3604/3190 1799/3609/3195 1795/3610/3196
+f 1795/3610/3196 1799/3609/3195 8849/3591/3177 8848/3586/3172
+f 1794/3604/3190 8722/3606/3192 8723/3611/3197 1799/3609/3195
+f 1799/3609/3195 8723/3611/3197 12915/3592/3178 8849/3591/3177
+f 1792/3597/3183 1795/3610/3196 1800/3612/3198 1796/3598/3184
+f 1796/3598/3184 1800/3612/3198 8858/3275/2861 8857/3270/2856
+f 1795/3610/3196 8848/3586/3172 8847/3585/3171 1800/3612/3198
+f 1800/3612/3198 8847/3585/3171 12934/3276/2862 8858/3275/2861
+f 1801/3613/3199 1805/3614/3200 1806/3615/3201 1802/3616/3202
+f 1802/3616/3202 1806/3615/3201 8859/3617/3203 8860/3618/3204
+f 1805/3614/3200 8863/3234/2820 8862/3233/2819 1806/3615/3201
+f 1806/3615/3201 8862/3233/2819 12936/3204/2790 8859/3617/3203
+f 1801/3613/3199 1802/3616/3202 1807/3619/3205 1803/3620/3206
+f 1803/3620/3206 1807/3619/3205 8706/3621/3207 8707/3622/3208
+f 1802/3616/3202 8860/3618/3204 8861/3623/3209 1807/3619/3205
+f 1807/3619/3205 8861/3623/3209 12911/3624/3210 8706/3621/3207
+f 1801/3613/3199 1803/3620/3206 1808/3625/3211 1804/3626/3212
+f 1804/3626/3212 1808/3625/3211 8855/3607/3193 8854/3602/3188
+f 1803/3620/3206 8707/3622/3208 8708/3627/3213 1808/3625/3211
+f 1808/3625/3211 8708/3627/3213 12913/3608/3194 8855/3607/3193
+f 1801/3613/3199 1804/3626/3212 1809/3628/3214 1805/3614/3200
+f 1805/3614/3200 1809/3628/3214 8864/3239/2825 8863/3234/2820
+f 1804/3626/3212 8854/3602/3188 8853/3601/3187 1809/3628/3214
+f 1809/3628/3214 8853/3601/3187 12935/3240/2826 8864/3239/2825
+f 1810/3629/3215 1814/3630/3216 1815/3631/3217 1811/3632/3218
+f 1811/3632/3218 1815/3631/3217 8865/3633/3219 8866/3634/3220
+f 1814/3630/3216 8869/3198/2784 8868/3197/2783 1815/3631/3217
+f 1815/3631/3217 8868/3197/2783 12937/3168/2754 8865/3633/3219
+f 1810/3629/3215 1811/3632/3218 1816/3635/3221 1812/3636/3222
+f 1812/3636/3222 1816/3635/3221 8691/3637/3223 8692/3638/3224
+f 1811/3632/3218 8866/3634/3220 8867/3639/3225 1816/3635/3221
+f 1816/3635/3221 8867/3639/3225 12909/3640/3226 8691/3637/3223
+f 1810/3629/3215 1812/3636/3222 1817/3641/3227 1813/3642/3228
+f 1813/3642/3228 1817/3641/3227 8861/3623/3209 8860/3618/3204
+f 1812/3636/3222 8692/3638/3224 8693/3643/3229 1817/3641/3227
+f 1817/3641/3227 8693/3643/3229 12911/3624/3210 8861/3623/3209
+f 1810/3629/3215 1813/3642/3228 1818/3644/3230 1814/3630/3216
+f 1814/3630/3216 1818/3644/3230 8870/3203/2789 8869/3198/2784
+f 1813/3642/3228 8860/3618/3204 8859/3617/3203 1818/3644/3230
+f 1818/3644/3230 8859/3617/3203 12936/3204/2790 8870/3203/2789
+f 1819/3645/3231 1823/3646/3232 1824/3647/3233 1820/3648/3234
+f 1820/3648/3234 1824/3647/3233 8871/3649/3235 8872/3650/3236
+f 1823/3646/3232 8875/3162/2748 8874/3161/2747 1824/3647/3233
+f 1824/3647/3233 8874/3161/2747 12938/3132/2718 8871/3649/3235
+f 1819/3645/3231 1820/3648/3234 1825/3651/3237 1821/3652/3238
+f 1821/3652/3238 1825/3651/3237 8676/3653/3239 8677/3654/3240
+f 1820/3648/3234 8872/3650/3236 8873/3655/3241 1825/3651/3237
+f 1825/3651/3237 8873/3655/3241 12907/3656/3242 8676/3653/3239
+f 1819/3645/3231 1821/3652/3238 1826/3657/3243 1822/3658/3244
+f 1822/3658/3244 1826/3657/3243 8867/3639/3225 8866/3634/3220
+f 1821/3652/3238 8677/3654/3240 8678/3659/3245 1826/3657/3243
+f 1826/3657/3243 8678/3659/3245 12909/3640/3226 8867/3639/3225
+f 1819/3645/3231 1822/3658/3244 1827/3660/3246 1823/3646/3232
+f 1823/3646/3232 1827/3660/3246 8876/3167/2753 8875/3162/2748
+f 1822/3658/3244 8866/3634/3220 8865/3633/3219 1827/3660/3246
+f 1827/3660/3246 8865/3633/3219 12937/3168/2754 8876/3167/2753
+f 1828/3661/3247 1832/3662/3248 1833/3663/3249 1829/3664/3250
+f 1829/3664/3250 1833/3663/3249 8877/3665/3251 8878/3666/3252
+f 1832/3662/3248 8881/3126/2712 8880/3125/2711 1833/3663/3249
+f 1833/3663/3249 8880/3125/2711 12939/3096/2682 8877/3665/3251
+f 1828/3661/3247 1829/3664/3250 1834/3667/3253 1830/3668/3254
+f 1830/3668/3254 1834/3667/3253 8661/3669/3255 8662/3670/3256
+f 1829/3664/3250 8878/3666/3252 8879/3671/3257 1834/3667/3253
+f 1834/3667/3253 8879/3671/3257 12905/3672/3258 8661/3669/3255
+f 1828/3661/3247 1830/3668/3254 1835/3673/3259 1831/3674/3260
+f 1831/3674/3260 1835/3673/3259 8873/3655/3241 8872/3650/3236
+f 1830/3668/3254 8662/3670/3256 8663/3675/3261 1835/3673/3259
+f 1835/3673/3259 8663/3675/3261 12907/3656/3242 8873/3655/3241
+f 1828/3661/3247 1831/3674/3260 1836/3676/3262 1832/3662/3248
+f 1832/3662/3248 1836/3676/3262 8882/3131/2717 8881/3126/2712
+f 1831/3674/3260 8872/3650/3236 8871/3649/3235 1836/3676/3262
+f 1836/3676/3262 8871/3649/3235 12938/3132/2718 8882/3131/2717
+f 1837/3677/3263 1841/3678/3264 1842/3679/3265 1838/3680/3266
+f 1838/3680/3266 1842/3679/3265 8883/3681/3267 8884/3682/3268
+f 1841/3678/3264 8887/3088/2674 8886/3087/2673 1842/3679/3265
+f 1842/3679/3265 8886/3087/2673 12940/3090/2676 8883/3681/3267
+f 1837/3677/3263 1838/3680/3266 1843/3683/3269 1839/3684/3270
+f 1839/3684/3270 1843/3683/3269 8646/3685/3271 8647/3686/3272
+f 1838/3680/3266 8884/3682/3268 8885/3687/3273 1843/3683/3269
+f 1843/3683/3269 8885/3687/3273 12901/3688/3274 8646/3685/3271
+f 1837/3677/3263 1839/3684/3270 1844/3689/3275 1840/3690/3276
+f 1840/3690/3276 1844/3689/3275 8879/3671/3257 8878/3666/3252
+f 1839/3684/3270 8647/3686/3272 8648/3691/3277 1844/3689/3275
+f 1844/3689/3275 8648/3691/3277 12905/3672/3258 8879/3671/3257
+f 1837/3677/3263 1840/3690/3276 1845/3692/3278 1841/3678/3264
+f 1841/3678/3264 1845/3692/3278 8888/3095/2681 8887/3088/2674
+f 1840/3690/3276 8878/3666/3252 8877/3665/3251 1845/3692/3278
+f 1845/3692/3278 8877/3665/3251 12939/3096/2682 8888/3095/2681
+f 1846/3693/3279 1850/3694/3280 1851/3695/3281 1847/3696/3282
+f 1850/3694/3280 9017/3047/2633 9016/3046/2632 1851/3695/3281
+f 1846/3693/3279 1847/3696/3282 1852/3697/3283 1848/3698/3284
+f 1848/3698/3284 1852/3697/3283 8631/3699/3285 8632/3700/3286
+f 1852/3697/3283 8889/3701/3287 12903/3702/3288 8631/3699/3285
+f 1846/3693/3279 1848/3698/3284 1853/3703/3289 1849/3704/3290
+f 1849/3704/3290 1853/3703/3289 9025/3705/3291 9026/3706/3292
+f 1848/3698/3284 8632/3700/3286 8633/3707/3293 1853/3703/3289
+f 1853/3703/3289 8633/3707/3293 12963/3708/3294 9025/3705/3291
+f 1846/3693/3279 1849/3704/3290 1854/3709/3295 1850/3694/3280
+f 1850/3694/3280 1854/3709/3295 9018/3052/2638 9017/3047/2633
+f 1849/3704/3290 9026/3706/3292 9027/3710/3296 1854/3709/3295
+f 1854/3709/3295 9027/3710/3296 12962/3053/2639 9018/3052/2638
+f 1855/3711/3297 1859/3712/3298 1860/3713/3299 1856/3714/3300
+f 1856/3714/3300 1860/3713/3299 8893/3715/3301 8894/3716/3302
+f 1859/3712/3298 9086/3027/2616 9085/3026/2615 1860/3713/3299
+f 1860/3713/3299 9085/3026/2615 12941/3029/2606 8893/3715/3301
+f 1855/3711/3297 1856/3714/3300 1861/3717/3303 1857/3718/3304
+f 1857/3718/3304 1861/3717/3303 8630/3719/2383 8629/3720/2376
+f 1856/3714/3300 8894/3716/3302 8895/3721/3305 1861/3717/3303
+f 1861/3717/3303 8895/3721/3305 12902/3722/2384 8630/3719/2383
+f 1855/3711/3297 1857/3718/3304 1862/3723/3306 1858/3724/3307
+f 1858/3724/3307 1862/3723/3306 9094/3725/3308 9095/3726/3309
+f 1857/3718/3304 8629/3720/2376 8628/3727/2375 1862/3723/3306
+f 1862/3723/3306 8628/3727/2375 12975/3728/2378 9094/3725/3308
+f 1855/3711/3297 1858/3724/3307 1863/3729/3310 1859/3712/3298
+f 1859/3712/3298 1863/3729/3310 9087/3034/2621 9086/3027/2616
+f 1858/3724/3307 9095/3726/3309 9096/3730/3311 1863/3729/3310
+f 1863/3729/3310 9096/3730/3311 12974/3035/1037 9087/3034/2621
+f 1864/3731/3312 1868/3732/3313 1869/3733/3314 1865/3734/3315
+f 1865/3734/3315 1869/3733/3314 9037/3735/3316 9038/3736/3317
+f 1868/3732/3313 8903/3007/2598 8902/3006/2597 1869/3733/3314
+f 1869/3733/3314 8902/3006/2597 12965/3009/2600 9037/3735/3316
+f 1864/3731/3312 1865/3734/3315 1870/3737/3318 1866/3738/3319
+f 1866/3738/3319 1870/3737/3318 8625/2751/2387 8624/2746/2382
+f 1865/3734/3315 9038/3736/3317 9039/3739/3320 1870/3737/3318
+f 1870/3737/3318 9039/3739/3320 12964/2752/2388 8625/2751/2387
+f 1864/3731/3312 1866/3738/3319 1871/3740/3321 1867/3741/3322
+f 1867/3741/3322 1871/3740/3321 8895/3742/3305 8894/3743/3302
+f 1866/3738/3319 8624/2746/2382 8623/2745/2381 1871/3740/3321
+f 1871/3740/3321 8623/2745/2381 12902/2748/2384 8895/3742/3305
+f 1864/3731/3312 1867/3741/3322 1872/3744/3323 1868/3732/3313
+f 1868/3732/3313 1872/3744/3323 8904/3014/2605 8903/3007/2598
+f 1867/3741/3322 8894/3743/3302 8893/3745/3301 1872/3744/3323
+f 1872/3744/3323 8893/3745/3301 12941/3015/2606 8904/3014/2605
+f 1873/3746/3324 1877/3747/3325 1878/3748/3326 1874/3749/3327
+f 1874/3749/3327 1878/3748/3326 8905/3750/3328 8906/3751/3329
+f 1877/3747/3325 8909/3065/2651 8908/3064/2650 1878/3748/3326
+f 1878/3748/3326 8908/3064/2650 12943/3067/2653 8905/3750/3328
+f 1873/3746/3324 1874/3749/3327 1879/3752/3330 1875/3753/3331
+f 1875/3753/3331 1879/3752/3330 8645/2776/2411 8644/2771/2406
+f 1874/3749/3327 8906/3751/3329 8907/3754/3332 1879/3752/3330
+f 1879/3752/3330 8907/3754/3332 12904/2777/2412 8645/2776/2411
+f 1873/3746/3324 1875/3753/3331 1880/3755/3333 1876/3756/3334
+f 1876/3756/3334 1880/3755/3333 8899/3757/3335 8900/3758/3336
+f 1875/3753/3331 8644/2771/2406 8643/2770/2405 1880/3755/3333
+f 1880/3755/3333 8643/2770/2405 12900/2773/2408 8899/3757/3335
+f 1873/3746/3324 1876/3756/3334 1881/3759/3337 1877/3747/3325
+f 1877/3747/3325 1881/3759/3337 8910/3072/2658 8909/3065/2651
+f 1876/3756/3334 8900/3758/3336 8901/3760/3338 1881/3759/3337
+f 1881/3759/3337 8901/3760/3338 12942/3073/2659 8910/3072/2658
+f 1882/3761/3339 1886/3762/3340 1887/3763/3341 1883/3764/3342
+f 1883/3764/3342 1887/3763/3341 8911/3765/3343 8912/3766/3344
+f 1886/3762/3340 8915/3110/2696 8914/3109/2695 1887/3763/3341
+f 1887/3763/3341 8914/3109/2695 12944/3112/2698 8911/3765/3343
+f 1882/3761/3339 1883/3764/3342 1888/3767/3345 1884/3768/3346
+f 1884/3768/3346 1888/3767/3345 8660/2796/2427 8659/2793/2424
+f 1883/3764/3342 8912/3766/3344 8913/3769/3347 1888/3767/3345
+f 1888/3767/3345 8913/3769/3347 12906/2797/2428 8660/2796/2427
+f 1882/3761/3339 1884/3768/3346 1889/3770/3348 1885/3771/3349
+f 1885/3771/3349 1889/3770/3348 8907/3754/3332 8906/3751/3329
+f 1884/3768/3346 8659/2793/2424 8658/2792/2423 1889/3770/3348
+f 1889/3770/3348 8658/2792/2423 12904/2777/2412 8907/3754/3332
+f 1882/3761/3339 1885/3771/3349 1890/3772/3350 1886/3762/3340
+f 1886/3762/3340 1890/3772/3350 8916/3115/2701 8915/3110/2696
+f 1885/3771/3349 8906/3751/3329 8905/3750/3328 1890/3772/3350
+f 1890/3772/3350 8905/3750/3328 12943/3067/2653 8916/3115/2701
+f 1891/3773/3351 1895/3774/3352 1896/3775/3353 1892/3776/3354
+f 1892/3776/3354 1896/3775/3353 8917/3777/3355 8918/3778/3356
+f 1895/3774/3352 8921/3146/2732 8920/3145/2731 1896/3775/3353
+f 1896/3775/3353 8920/3145/2731 12945/3148/2734 8917/3777/3355
+f 1891/3773/3351 1892/3776/3354 1897/3779/3357 1893/3780/3358
+f 1893/3780/3358 1897/3779/3357 8675/2816/2443 8674/2813/2440
+f 1892/3776/3354 8918/3778/3356 8919/3781/3359 1897/3779/3357
+f 1897/3779/3357 8919/3781/3359 12908/2817/2444 8675/2816/2443
+f 1891/3773/3351 1893/3780/3358 1898/3782/3360 1894/3783/3361
+f 1894/3783/3361 1898/3782/3360 8913/3769/3347 8912/3766/3344
+f 1893/3780/3358 8674/2813/2440 8673/2812/2439 1898/3782/3360
+f 1898/3782/3360 8673/2812/2439 12906/2797/2428 8913/3769/3347
+f 1891/3773/3351 1894/3783/3361 1899/3784/3362 1895/3774/3352
+f 1895/3774/3352 1899/3784/3362 8922/3151/2737 8921/3146/2732
+f 1894/3783/3361 8912/3766/3344 8911/3765/3343 1899/3784/3362
+f 1899/3784/3362 8911/3765/3343 12944/3112/2698 8922/3151/2737
+f 1900/3785/3363 1904/3786/3364 1905/3787/3365 1901/3788/3366
+f 1901/3788/3366 1905/3787/3365 8923/3789/3367 8924/3790/3368
+f 1904/3786/3364 8927/3182/2768 8926/3181/2767 1905/3787/3365
+f 1905/3787/3365 8926/3181/2767 12946/3184/2770 8923/3789/3367
+f 1900/3785/3363 1901/3788/3366 1906/3791/3369 1902/3792/3370
+f 1902/3792/3370 1906/3791/3369 8690/2836/2459 8689/2833/2456
+f 1901/3788/3366 8924/3790/3368 8925/3793/3371 1906/3791/3369
+f 1906/3791/3369 8925/3793/3371 12910/2837/2460 8690/2836/2459
+f 1900/3785/3363 1902/3792/3370 1907/3794/3372 1903/3795/3373
+f 1903/3795/3373 1907/3794/3372 8919/3781/3359 8918/3778/3356
+f 1902/3792/3370 8689/2833/2456 8688/2832/2455 1907/3794/3372
+f 1907/3794/3372 8688/2832/2455 12908/2817/2444 8919/3781/3359
+f 1900/3785/3363 1903/3795/3373 1908/3796/3374 1904/3786/3364
+f 1904/3786/3364 1908/3796/3374 8928/3187/2773 8927/3182/2768
+f 1903/3795/3373 8918/3778/3356 8917/3777/3355 1908/3796/3374
+f 1908/3796/3374 8917/3777/3355 12945/3148/2734 8928/3187/2773
+f 1909/3797/3375 1913/3798/3376 1914/3799/3377 1910/3800/3378
+f 1910/3800/3378 1914/3799/3377 8929/3801/3379 8930/3802/3380
+f 1913/3798/3376 8933/3218/2804 8932/3217/2803 1914/3799/3377
+f 1914/3799/3377 8932/3217/2803 12947/3220/2806 8929/3801/3379
+f 1909/3797/3375 1910/3800/3378 1915/3803/3381 1911/3804/3382
+f 1911/3804/3382 1915/3803/3381 8705/2856/2475 8704/2853/2472
+f 1910/3800/3378 8930/3802/3380 8931/3805/3383 1915/3803/3381
+f 1915/3803/3381 8931/3805/3383 12912/2857/2476 8705/2856/2475
+f 1909/3797/3375 1911/3804/3382 1916/3806/3384 1912/3807/3385
+f 1912/3807/3385 1916/3806/3384 8925/3793/3371 8924/3790/3368
+f 1911/3804/3382 8704/2853/2472 8703/2852/2471 1916/3806/3384
+f 1916/3806/3384 8703/2852/2471 12910/2837/2460 8925/3793/3371
+f 1909/3797/3375 1912/3807/3385 1917/3808/3386 1913/3798/3376
+f 1913/3798/3376 1917/3808/3386 8934/3223/2809 8933/3218/2804
+f 1912/3807/3385 8924/3790/3368 8923/3789/3367 1917/3808/3386
+f 1917/3808/3386 8923/3789/3367 12946/3184/2770 8934/3223/2809
+f 1918/3809/3387 1922/3810/3388 1923/3811/3389 1919/3812/3390
+f 1919/3812/3390 1923/3811/3389 8935/3813/3391 8936/3814/3392
+f 1922/3810/3388 8939/3254/2840 8938/3253/2839 1923/3811/3389
+f 1923/3811/3389 8938/3253/2839 12948/3256/2842 8935/3813/3391
+f 1918/3809/3387 1919/3812/3390 1924/3815/3393 1920/3816/3394
+f 1920/3816/3394 1924/3815/3393 8720/2876/2491 8719/2873/2488
+f 1919/3812/3390 8936/3814/3392 8937/3817/3395 1924/3815/3393
+f 1924/3815/3393 8937/3817/3395 12914/2877/2492 8720/2876/2491
+f 1918/3809/3387 1920/3816/3394 1925/3818/3396 1921/3819/3397
+f 1921/3819/3397 1925/3818/3396 8931/3805/3383 8930/3802/3380
+f 1920/3816/3394 8719/2873/2488 8718/2872/2487 1925/3818/3396
+f 1925/3818/3396 8718/2872/2487 12912/2857/2476 8931/3805/3383
+f 1918/3809/3387 1921/3819/3397 1926/3820/3398 1922/3810/3388
+f 1922/3810/3388 1926/3820/3398 8940/3259/2845 8939/3254/2840
+f 1921/3819/3397 8930/3802/3380 8929/3801/3379 1926/3820/3398
+f 1926/3820/3398 8929/3801/3379 12947/3220/2806 8940/3259/2845
+f 1927/3821/3399 1931/3822/3400 1932/3823/3401 1928/3824/3402
+f 1928/3824/3402 1932/3823/3401 8941/3825/3403 8942/3826/3404
+f 1931/3822/3400 8945/3290/2876 8944/3289/2875 1932/3823/3401
+f 1932/3823/3401 8944/3289/2875 12949/3292/2878 8941/3825/3403
+f 1927/3821/3399 1928/3824/3402 1933/3827/3405 1929/3828/3406
+f 1929/3828/3406 1933/3827/3405 8735/2896/2507 8734/2893/2504
+f 1928/3824/3402 8942/3826/3404 8943/3829/3407 1933/3827/3405
+f 1933/3827/3405 8943/3829/3407 12916/2897/2508 8735/2896/2507
+f 1927/3821/3399 1929/3828/3406 1934/3830/3408 1930/3831/3409
+f 1930/3831/3409 1934/3830/3408 8937/3817/3395 8936/3814/3392
+f 1929/3828/3406 8734/2893/2504 8733/2892/2503 1934/3830/3408
+f 1934/3830/3408 8733/2892/2503 12914/2877/2492 8937/3817/3395
+f 1927/3821/3399 1930/3831/3409 1935/3832/3410 1931/3822/3400
+f 1931/3822/3400 1935/3832/3410 8946/3295/2881 8945/3290/2876
+f 1930/3831/3409 8936/3814/3392 8935/3813/3391 1935/3832/3410
+f 1935/3832/3410 8935/3813/3391 12948/3256/2842 8946/3295/2881
+f 1936/3833/3411 1940/3834/3412 1941/3835/3413 1937/3836/3414
+f 1937/3836/3414 1941/3835/3413 8947/3837/3415 8948/3838/3416
+f 1940/3834/3412 8951/3326/2912 8950/3325/2911 1941/3835/3413
+f 1941/3835/3413 8950/3325/2911 12950/3328/2914 8947/3837/3415
+f 1936/3833/3411 1937/3836/3414 1942/3839/3417 1938/3840/3418
+f 1938/3840/3418 1942/3839/3417 8750/2916/2523 8749/2913/2520
+f 1937/3836/3414 8948/3838/3416 8949/3841/3419 1942/3839/3417
+f 1942/3839/3417 8949/3841/3419 12918/2917/2524 8750/2916/2523
+f 1936/3833/3411 1938/3840/3418 1943/3842/3420 1939/3843/3421
+f 1939/3843/3421 1943/3842/3420 8943/3829/3407 8942/3826/3404
+f 1938/3840/3418 8749/2913/2520 8748/2912/2519 1943/3842/3420
+f 1943/3842/3420 8748/2912/2519 12916/2897/2508 8943/3829/3407
+f 1936/3833/3411 1939/3843/3421 1944/3844/3422 1940/3834/3412
+f 1940/3834/3412 1944/3844/3422 8952/3331/2917 8951/3326/2912
+f 1939/3843/3421 8942/3826/3404 8941/3825/3403 1944/3844/3422
+f 1944/3844/3422 8941/3825/3403 12949/3292/2878 8952/3331/2917
+f 1945/3845/3423 1949/3846/3424 1950/3847/3425 1946/3848/3426
+f 1946/3848/3426 1950/3847/3425 8953/3849/3427 8954/3850/3428
+f 1949/3846/3424 8957/3362/2948 8956/3361/2947 1950/3847/3425
+f 1950/3847/3425 8956/3361/2947 12951/3364/2950 8953/3849/3427
+f 1945/3845/3423 1946/3848/3426 1951/3851/3429 1947/3852/3430
+f 1947/3852/3430 1951/3851/3429 8765/2936/2539 8764/2933/2536
+f 1946/3848/3426 8954/3850/3428 8955/3853/3431 1951/3851/3429
+f 1951/3851/3429 8955/3853/3431 12920/2937/2540 8765/2936/2539
+f 1945/3845/3423 1947/3852/3430 1952/3854/3432 1948/3855/3433
+f 1948/3855/3433 1952/3854/3432 8949/3841/3419 8948/3838/3416
+f 1947/3852/3430 8764/2933/2536 8763/2932/2535 1952/3854/3432
+f 1952/3854/3432 8763/2932/2535 12918/2917/2524 8949/3841/3419
+f 1945/3845/3423 1948/3855/3433 1953/3856/3434 1949/3846/3424
+f 1949/3846/3424 1953/3856/3434 8958/3367/2953 8957/3362/2948
+f 1948/3855/3433 8948/3838/3416 8947/3837/3415 1953/3856/3434
+f 1953/3856/3434 8947/3837/3415 12950/3328/2914 8958/3367/2953
+f 1954/3857/3435 1958/3858/3436 1959/3859/3437 1955/3860/3438
+f 1955/3860/3438 1959/3859/3437 8959/3861/3439 8960/3862/3440
+f 1958/3858/3436 8963/3398/2984 8962/3397/2983 1959/3859/3437
+f 1959/3859/3437 8962/3397/2983 12952/3400/2986 8959/3861/3439
+f 1954/3857/3435 1955/3860/3438 1960/3863/3441 1956/3864/3442
+f 1956/3864/3442 1960/3863/3441 8780/2956/2555 8779/2953/2552
+f 1955/3860/3438 8960/3862/3440 8961/3865/3443 1960/3863/3441
+f 1960/3863/3441 8961/3865/3443 12922/2957/2556 8780/2956/2555
+f 1954/3857/3435 1956/3864/3442 1961/3866/3444 1957/3867/3445
+f 1957/3867/3445 1961/3866/3444 8955/3853/3431 8954/3850/3428
+f 1956/3864/3442 8779/2953/2552 8778/2952/2551 1961/3866/3444
+f 1961/3866/3444 8778/2952/2551 12920/2937/2540 8955/3853/3431
+f 1954/3857/3435 1957/3867/3445 1962/3868/3446 1958/3858/3436
+f 1958/3858/3436 1962/3868/3446 8964/3403/2989 8963/3398/2984
+f 1957/3867/3445 8954/3850/3428 8953/3849/3427 1962/3868/3446
+f 1962/3868/3446 8953/3849/3427 12951/3364/2950 8964/3403/2989
+f 1963/3869/3447 1967/3870/3448 1968/3871/3449 1964/3872/3450
+f 1964/3872/3450 1968/3871/3449 8965/3873/3451 8966/3874/3452
+f 1967/3870/3448 8969/3434/3020 8968/3433/3019 1968/3871/3449
+f 1968/3871/3449 8968/3433/3019 12953/3436/3022 8965/3873/3451
+f 1963/3869/3447 1964/3872/3450 1969/3875/3453 1965/3876/3454
+f 1965/3876/3454 1969/3875/3453 8795/2976/2571 8794/2973/2568
+f 1964/3872/3450 8966/3874/3452 8967/3877/3455 1969/3875/3453
+f 1969/3875/3453 8967/3877/3455 12924/2977/2572 8795/2976/2571
+f 1963/3869/3447 1965/3876/3454 1970/3878/3456 1966/3879/3457
+f 1966/3879/3457 1970/3878/3456 8961/3865/3443 8960/3862/3440
+f 1965/3876/3454 8794/2973/2568 8793/2972/2567 1970/3878/3456
+f 1970/3878/3456 8793/2972/2567 12922/2957/2556 8961/3865/3443
+f 1963/3869/3447 1966/3879/3457 1971/3880/3458 1967/3870/3448
+f 1967/3870/3448 1971/3880/3458 8970/3439/3025 8969/3434/3020
+f 1966/3879/3457 8960/3862/3440 8959/3861/3439 1971/3880/3458
+f 1971/3880/3458 8959/3861/3439 12952/3400/2986 8970/3439/3025
+f 1972/3881/3459 1976/3882/3460 1977/3883/3461 1973/3884/3462
+f 1973/3884/3462 1977/3883/3461 8971/3885/3463 8972/3886/3464
+f 1976/3882/3460 8975/3470/3056 8974/3469/3055 1977/3883/3461
+f 1977/3883/3461 8974/3469/3055 12954/3472/3058 8971/3885/3463
+f 1972/3881/3459 1973/3884/3462 1978/3887/3465 1974/3888/3466
+f 1974/3888/3466 1978/3887/3465 8810/2996/2587 8809/2993/2584
+f 1973/3884/3462 8972/3886/3464 8973/3889/3467 1978/3887/3465
+f 1978/3887/3465 8973/3889/3467 12926/2997/2588 8810/2996/2587
+f 1972/3881/3459 1974/3888/3466 1979/3890/3468 1975/3891/3469
+f 1975/3891/3469 1979/3890/3468 8967/3877/3455 8966/3874/3452
+f 1974/3888/3466 8809/2993/2584 8808/2992/2583 1979/3890/3468
+f 1979/3890/3468 8808/2992/2583 12924/2977/2572 8967/3877/3455
+f 1972/3881/3459 1975/3891/3469 1980/3892/3470 1976/3882/3460
+f 1976/3882/3460 1980/3892/3470 8976/3475/3061 8975/3470/3056
+f 1975/3891/3469 8966/3874/3452 8965/3873/3451 1980/3892/3470
+f 1980/3892/3470 8965/3873/3451 12953/3436/3022 8976/3475/3061
+f 1981/3893/3471 1985/3894/3472 1986/3895/3473 1982/3896/3474
+f 1982/3896/3474 1986/3895/3473 8151/1615/1531 8150/1611/1527
+f 1985/3894/3472 8981/3897/3475 8982/3898/3476 1986/3895/3473
+f 1986/3895/3473 8982/3898/3476 12815/1278/1202 8151/1615/1531
+f 1981/3893/3471 1982/3896/3474 1987/3899/3477 1983/3900/3478
+f 1983/3900/3478 1987/3899/3477 8047/3901/3479 8048/3902/3480
+f 1982/3896/3474 8150/1611/1527 8149/1610/1526 1987/3899/3477
+f 1987/3899/3477 8149/1610/1526 12797/1613/1529 8047/3901/3479
+f 1981/3893/3471 1983/3900/3478 1988/3903/3481 1984/3904/3482
+f 1984/3904/3482 1988/3903/3481 8985/1586/1502 8984/1581/1497
+f 1983/3900/3478 8048/3902/3480 8049/3905/3483 1988/3903/3481
+f 1988/3903/3481 8049/3905/3483 12955/1587/1503 8985/1586/1502
+f 1981/3893/3471 1984/3904/3482 1989/3906/3484 1985/3894/3472
+f 1985/3894/3472 1989/3906/3484 8980/3907/3485 8981/3897/3475
+f 1984/3904/3482 8984/1581/1497 8983/1580/1496 1989/3906/3484
+f 1989/3906/3484 8983/1580/1496 12956/1297/1221 8980/3907/3485
+f 1990/3908/3486 1994/3909/3487 1995/3910/3488 1991/3911/3489
+f 1991/3911/3489 1995/3910/3488 8043/1281/1205 8042/1276/1200
+f 1994/3909/3487 7829/3912/3490 7830/3913/3491 1995/3910/3488
+f 1995/3910/3488 7830/3913/3491 12752/1282/1206 8043/1281/1205
+f 1990/3908/3486 1991/3911/3489 1996/3914/3492 1992/3915/3493
+f 1992/3915/3493 1996/3914/3492 8982/3898/3476 8981/3897/3475
+f 1991/3911/3489 8042/1276/1200 8041/1275/1199 1996/3914/3492
+f 1996/3914/3492 8041/1275/1199 12815/1278/1202 8982/3898/3476
+f 1990/3908/3486 1992/3915/3493 1997/3916/3494 1993/3917/3495
+f 1993/3917/3495 1997/3916/3494 8991/1296/1220 8990/1288/1212
+f 1992/3915/3493 8981/3897/3475 8980/3907/3485 1997/3916/3494
+f 1997/3916/3494 8980/3907/3485 12956/1297/1221 8991/1296/1220
+f 1990/3908/3486 1993/3917/3495 1998/3918/3496 1994/3909/3487
+f 1994/3909/3487 1998/3918/3496 7828/3919/3497 7829/3912/3490
+f 1993/3917/3495 8990/1288/1212 8989/1287/1211 1998/3918/3496
+f 1998/3918/3496 8989/1287/1211 12957/1291/1215 7828/3919/3497
+f 1999/3920/3498 2003/3921/3499 2004/3922/3500 2000/3923/3501
+f 2000/3923/3501 2004/3922/3500 8244/1862/1777 8243/1859/1774
+f 2003/3921/3499 8993/3924/3502 8994/3925/3503 2004/3922/3500
+f 2004/3922/3500 8994/3925/3503 12831/1863/1778 8244/1862/1777
+f 1999/3920/3498 2000/3923/3501 2005/3926/3504 2001/3927/3505
+f 2001/3927/3505 2005/3926/3504 7830/3913/3491 7829/3912/3490
+f 2000/3923/3501 8243/1859/1774 8242/1858/1773 2005/3926/3504
+f 2005/3926/3504 8242/1858/1773 12752/1282/1206 7830/3913/3491
+f 1999/3920/3498 2001/3927/3505 2006/3928/3506 2002/3929/3507
+f 2002/3929/3507 2006/3928/3506 8997/1839/1754 8996/1833/1748
+f 2001/3927/3505 7829/3912/3490 7828/3919/3497 2006/3928/3506
+f 2006/3928/3506 7828/3919/3497 12957/1291/1215 8997/1839/1754
+f 1999/3920/3498 2002/3929/3507 2007/3930/3508 2003/3921/3499
+f 2003/3921/3499 2007/3930/3508 8992/3931/3509 8993/3924/3502
+f 2002/3929/3507 8996/1833/1748 8995/1832/1747 2007/3930/3508
+f 2007/3930/3508 8995/1832/1747 12958/1836/1751 8992/3931/3509
+f 2008/3932/3510 2012/3933/3511 2013/3934/3512 2009/3935/3513
+f 2009/3935/3513 2013/3934/3512 8563/3936/3485 8564/3937/3475
+f 2012/3933/3511 9002/2095/2002 9001/2094/2001 2013/3934/3512
+f 2013/3934/3512 9001/2094/2001 12959/2097/1221 8563/3936/3485
+f 2008/3932/3510 2009/3935/3513 2014/3938/3514 2010/3939/3515
+f 2010/3939/3515 2014/3938/3514 8337/2130/2034 8336/2125/2031
+f 2009/3935/3513 8564/3937/3475 8565/3940/3476 2014/3938/3514
+f 2014/3938/3514 8565/3940/3476 12884/2131/1202 8337/2130/2034
+f 2008/3932/3510 2010/3939/3515 2015/3941/3516 2011/3942/3517
+f 2011/3942/3517 2015/3941/3516 8994/3925/3503 8993/3924/3502
+f 2010/3939/3515 8336/2125/2031 8335/2124/2030 2015/3941/3516
+f 2015/3941/3516 8335/2124/2030 12831/1863/1778 8994/3925/3503
+f 2008/3932/3510 2011/3942/3517 2016/3943/3518 2012/3933/3511
+f 2012/3933/3511 2016/3943/3518 9003/2099/2005 9002/2095/2002
+f 2011/3942/3517 8993/3924/3502 8992/3931/3509 2016/3943/3518
+f 2016/3943/3518 8992/3931/3509 12958/1836/1751 9003/2099/2005
+f 2017/3944/3475 2021/3945/3485 2022/3946/3485 2018/3947/3475
+f 2018/3947/3475 2022/3946/3485 9259/3948/3485 9260/3949/3475
+f 2021/3945/3485 9008/2693/1221 9007/2692/1221 2022/3946/3485
+f 2022/3946/3485 9007/2692/1221 13003/2696/1221 9259/3948/3485
+f 2017/3944/3475 2018/3947/3475 2023/3950/3476 2019/3951/3476
+f 2019/3951/3476 2023/3950/3476 8556/2679/1202 8555/2678/1202
+f 2018/3947/3475 9260/3949/3475 9261/3952/3476 2023/3950/3476
+f 2023/3950/3476 9261/3952/3476 13002/2680/1202 8556/2679/1202
+f 2017/3944/3475 2019/3951/3476 2024/3953/3476 2020/3954/3475
+f 2020/3954/3475 2024/3953/3476 8565/3940/3476 8564/3937/3475
+f 2019/3951/3476 8555/2678/1202 8554/2687/1202 2024/3953/3476
+f 2024/3953/3476 8554/2687/1202 12884/2131/1202 8565/3940/3476
+f 2017/3944/3475 2020/3954/3475 2025/3955/3485 2021/3945/3485
+f 2021/3945/3485 2025/3955/3485 9009/2699/1221 9008/2693/1221
+f 2020/3954/3475 8564/3937/3475 8563/3936/3485 2025/3955/3485
+f 2025/3955/3485 8563/3936/3485 12959/2097/1221 9009/2699/1221
+f 2026/3956/3519 2030/3957/3520 2031/3958/3521 2027/3959/3522
+f 2027/3959/3522 2031/3958/3521 9396/816/741 9395/811/736
+f 2030/3957/3520 9575/3960/3523 9576/3961/3524 2031/3958/3521
+f 2031/3958/3521 9576/3961/3524 13024/817/742 9396/816/741
+f 2026/3956/3519 2027/3959/3522 2032/3962/3525 2028/3963/3526
+f 2028/3963/3526 2032/3962/3525 9583/3964/3527 9584/3965/3528
+f 2027/3959/3522 9395/811/736 9394/810/735 2032/3962/3525
+f 2032/3962/3525 9394/810/735 13026/813/738 9583/3964/3527
+f 2026/3956/3519 2028/3963/3526 2033/3966/3529 2029/3967/3530
+f 2029/3967/3530 2033/3966/3529 9580/3968/3531 9581/3969/3532
+f 2028/3963/3526 9584/3965/3528 9585/3970/3533 2033/3966/3529
+f 2033/3966/3529 9585/3970/3533 13051/3971/3534 9580/3968/3531
+f 2026/3956/3519 2029/3967/3530 2034/3972/3535 2030/3957/3520
+f 2030/3957/3520 2034/3972/3535 9574/3973/3536 9575/3960/3523
+f 2029/3967/3530 9581/3969/3532 9582/3974/3537 2034/3972/3535
+f 2034/3972/3535 9582/3974/3537 13050/3975/3538 9574/3973/3536
+f 2035/3976/3539 2039/3977/3540 2040/3978/3541 2036/3979/3542
+f 2036/3979/3542 2040/3978/3541 8890/3980/3543 8891/3981/3544
+f 2039/3977/3540 9020/3051/2637 9019/3050/2636 2040/3978/3541
+f 2040/3978/3541 9019/3050/2636 12962/3053/2639 8890/3980/3543
+f 2035/3976/3539 2036/3979/3542 2041/3982/3545 2037/3983/3546
+f 2037/3983/3546 2041/3982/3545 8616/3089/2675 8615/3081/2667
+f 2036/3979/3542 8891/3981/3544 8892/3984/3547 2041/3982/3545
+f 2041/3982/3545 8892/3984/3547 12940/3090/2676 8616/3089/2675
+f 2035/3976/3539 2037/3983/3546 2042/3985/3548 2038/3986/3549
+f 2038/3986/3549 2042/3985/3548 9010/3987/3550 9011/3988/3551
+f 2037/3983/3546 8615/3081/2667 8614/3080/2666 2042/3985/3548
+f 2042/3985/3548 8614/3080/2666 12845/3084/2670 9010/3987/3550
+f 2035/3976/3539 2038/3986/3549 2043/3989/3552 2039/3977/3540
+f 2039/3977/3540 2043/3989/3552 9021/3055/2641 9020/3051/2637
+f 2038/3986/3549 9011/3988/3551 9012/3990/3553 2043/3989/3552
+f 2043/3989/3552 9012/3990/3553 12961/776/701 9021/3055/2641
+f 2044/3991/3554 2048/3992/3555 2049/3993/3556 2045/3994/3557
+f 2045/3994/3557 2049/3993/3556 9022/3995/3558 9023/3996/3559
+f 2048/3992/3555 9026/3706/3292 9025/3705/3291 2049/3993/3556
+f 2049/3993/3556 9025/3705/3291 12963/3708/3294 9022/3995/3558
+f 2044/3991/3554 2045/3994/3557 2050/3997/3560 2046/3998/3561
+f 2046/3998/3561 2050/3997/3560 8885/3687/3273 8884/3682/3268
+f 2045/3994/3557 9023/3996/3559 9024/3999/3562 2050/3997/3560
+f 2050/3997/3560 9024/3999/3562 12901/3688/3274 8885/3687/3273
+f 2044/3991/3554 2046/3998/3561 2051/4000/3563 2047/4001/3564
+f 2047/4001/3564 2051/4000/3563 8892/3984/3547 8891/3981/3544
+f 2046/3998/3561 8884/3682/3268 8883/3681/3267 2051/4000/3563
+f 2051/4000/3563 8883/3681/3267 12940/3090/2676 8892/3984/3547
+f 2044/3991/3554 2047/4001/3564 2052/4002/3565 2048/3992/3555
+f 2048/3992/3555 2052/4002/3565 9027/3710/3296 9026/3706/3292
+f 2047/4001/3564 8891/3981/3544 8890/3980/3543 2052/4002/3565
+f 2052/4002/3565 8890/3980/3543 12962/3053/2639 9027/3710/3296
+f 2053/4003/3566 2057/4004/3567 2058/4005/3568 2054/4006/3569
+f 2054/4006/3569 2058/4005/3568 9106/4007/3570 9107/4008/3571
+f 2057/4004/3567 8618/2765/2400 8617/2764/2399 2058/4005/3568
+f 2058/4005/3568 8617/2764/2399 12977/2767/2402 9106/4007/3570
+f 2053/4003/3566 2054/4006/3569 2059/4009/3572 2055/4010/3573
+f 2055/4010/3573 2059/4009/3572 9099/2735/2371 9098/2734/2370
+f 2054/4006/3569 9107/4008/3571 9108/4011/3574 2059/4009/3572
+f 2059/4009/3572 9108/4011/3574 12976/2736/2372 9099/2735/2371
+f 2053/4003/3566 2055/4010/3573 2060/4012/3575 2056/4013/3576
+f 2056/4013/3576 2060/4012/3575 9028/4014/3577 9029/4015/3578
+f 2055/4010/3573 9098/2734/2370 9097/2750/2386 2060/4012/3575
+f 2060/4012/3575 9097/2750/2386 12964/2752/2388 9028/4014/3577
+f 2053/4003/3566 2056/4013/3576 2061/4016/3579 2057/4004/3567
+f 2057/4004/3567 2061/4016/3579 8619/2772/2407 8618/2765/2400
+f 2056/4013/3576 9029/4015/3578 9030/4017/3580 2061/4016/3579
+f 2061/4016/3579 9030/4017/3580 12900/2773/2408 8619/2772/2407
+f 2062/4018/3581 2066/4019/3582 2067/4020/3583 2063/4021/3584
+f 2063/4021/3584 2067/4020/3583 8901/3760/3338 8900/3758/3336
+f 2066/4019/3582 9035/4022/3585 9036/4023/3586 2067/4020/3583
+f 2067/4020/3583 9036/4023/3586 12942/3073/2659 8901/3760/3338
+f 2062/4018/3581 2063/4021/3584 2068/4024/3587 2064/4025/3588
+f 2064/4025/3588 2068/4024/3587 9030/4017/3580 9029/4015/3578
+f 2063/4021/3584 8900/3758/3336 8899/3757/3335 2068/4024/3587
+f 2068/4024/3587 8899/3757/3335 12900/2773/2408 9030/4017/3580
+f 2062/4018/3581 2064/4025/3588 2069/4026/3589 2065/4027/3590
+f 2065/4027/3590 2069/4026/3589 9039/3739/3320 9038/3736/3317
+f 2064/4025/3588 9029/4015/3578 9028/4014/3577 2069/4026/3589
+f 2069/4026/3589 9028/4014/3577 12964/2752/2388 9039/3739/3320
+f 2062/4018/3581 2065/4027/3590 2070/4028/3591 2066/4019/3582
+f 2066/4019/3582 2070/4028/3591 9034/4029/3592 9035/4022/3585
+f 2065/4027/3590 9038/3736/3317 9037/3735/3316 2070/4028/3591
+f 2070/4028/3591 9037/3735/3316 12965/3009/2600 9034/4029/3592
+f 2071/4030/3593 2075/4031/3594 2076/4032/3595 2072/4033/3596
+f 2072/4033/3596 2076/4032/3595 8613/3075/2661 8612/3071/2657
+f 2075/4031/3594 9041/4034/3597 9042/4035/3598 2076/4032/3595
+f 2076/4032/3595 9042/4035/3598 12887/2117/2023 8613/3075/2661
+f 2071/4030/3593 2072/4033/3596 2077/4036/3599 2073/4037/3600
+f 2073/4037/3600 2077/4036/3599 9036/4023/3586 9035/4022/3585
+f 2072/4033/3596 8612/3071/2657 8611/3070/2656 2077/4036/3599
+f 2077/4036/3599 8611/3070/2656 12942/3073/2659 9036/4023/3586
+f 2071/4030/3593 2073/4037/3600 2078/4038/3601 2074/4039/3602
+f 2074/4039/3602 2078/4038/3601 9045/3008/2599 9044/3003/2594
+f 2073/4037/3600 9035/4022/3585 9034/4029/3592 2078/4038/3601
+f 2078/4038/3601 9034/4029/3592 12965/3009/2600 9045/3008/2599
+f 2071/4030/3593 2074/4039/3602 2079/4040/3603 2075/4031/3594
+f 2075/4031/3594 2079/4040/3603 9040/4041/3604 9041/4034/3597
+f 2074/4039/3602 9044/3003/2594 9043/3002/2593 2079/4040/3603
+f 2079/4040/3603 9043/3002/2593 12966/2051/1966 9040/4041/3604
+f 2080/4042/3605 2084/4043/3606 2085/4044/3607 2081/4045/3608
+f 2081/4045/3608 2085/4044/3607 8325/2119/2025 8324/2115/2021
+f 2084/4043/3606 9047/4046/3609 9048/4047/3610 2085/4044/3607
+f 2085/4044/3607 9048/4047/3610 12772/569/503 8325/2119/2025
+f 2080/4042/3605 2081/4045/3608 2086/4048/3611 2082/4049/3612
+f 2082/4049/3612 2086/4048/3611 9042/4035/3598 9041/4034/3597
+f 2081/4045/3608 8324/2115/2021 8323/2114/2020 2086/4048/3611
+f 2086/4048/3611 8323/2114/2020 12887/2117/2023 9042/4035/3598
+f 2080/4042/3605 2082/4049/3612 2087/4050/3613 2083/4051/3614
+f 2083/4051/3614 2087/4050/3613 9051/2050/1965 9050/2045/1960
+f 2082/4049/3612 9041/4034/3597 9040/4041/3604 2087/4050/3613
+f 2087/4050/3613 9040/4041/3604 12966/2051/1966 9051/2050/1965
+f 2080/4042/3605 2083/4051/3614 2088/4052/3615 2084/4043/3606
+f 2084/4043/3606 2088/4052/3615 9046/4053/3616 9047/4046/3609
+f 2083/4051/3614 9050/2045/1960 9049/2044/1959 2088/4052/3615
+f 2088/4052/3615 9049/2044/1959 12967/543/481 9046/4053/3616
+f 2089/4054/3617 2093/4055/3618 2094/4056/3619 2090/4057/3620
+f 2090/4057/3620 2094/4056/3619 7848/571/505 7847/567/501
+f 2093/4055/3618 9053/4058/279 9054/4059/279 2094/4056/3619
+f 2094/4056/3619 9054/4059/279 12757/464/279 7848/571/505
+f 2089/4054/3617 2090/4057/3620 2095/4060/3621 2091/4061/3622
+f 2091/4061/3622 2095/4060/3621 9048/4047/3610 9047/4046/3609
+f 2090/4057/3620 7847/567/501 7846/566/500 2095/4060/3621
+f 2095/4060/3621 7846/566/500 12772/569/503 9048/4047/3610
+f 2089/4054/3617 2091/4061/3622 2096/4062/3623 2092/4063/3624
+f 2092/4063/3624 2096/4062/3623 9057/542/480 9056/537/475
+f 2091/4061/3622 9047/4046/3609 9046/4053/3616 2096/4062/3623
+f 2096/4062/3623 9046/4053/3616 12967/543/481 9057/542/480
+f 2089/4054/3617 2092/4063/3624 2097/4064/3625 2093/4055/3618
+f 2093/4055/3618 2097/4064/3625 9052/4065/279 9053/4058/279
+f 2092/4063/3624 9056/537/475 9055/536/474 2097/4064/3625
+f 2097/4064/3625 9055/536/474 12968/478/279 9052/4065/279
+f 2098/4066/3626 2102/4067/3627 2103/4068/3628 2099/4069/3629
+f 2099/4069/3629 2103/4068/3628 7749/466/418 7748/462/416
+f 2102/4067/3627 7706/4070/3630 7707/4071/3631 2103/4068/3628
+f 2103/4068/3628 7707/4071/3631 12738/241/241 7749/466/418
+f 2098/4066/3626 2099/4069/3629 2104/4072/3632 2100/4073/3633
+f 2100/4073/3633 2104/4072/3632 9054/4059/279 9053/4058/279
+f 2099/4069/3629 7748/462/416 7747/461/415 2104/4072/3632
+f 2104/4072/3632 7747/461/415 12757/464/279 9054/4059/279
+f 2098/4066/3626 2100/4073/3633 2105/4074/3634 2101/4075/3635
+f 2101/4075/3635 2105/4074/3634 9063/477/429 9062/472/424
+f 2100/4073/3633 9053/4058/279 9052/4065/279 2105/4074/3634
+f 2105/4074/3634 9052/4065/279 12968/478/279 9063/477/429
+f 2098/4066/3626 2101/4075/3635 2106/4076/3636 2102/4067/3627
+f 2102/4067/3627 2106/4076/3636 7705/4077/3637 7706/4070/3630
+f 2101/4075/3635 9062/472/424 9061/471/423 2106/4076/3636
+f 2106/4076/3636 9061/471/423 12969/260/260 7705/4077/3637
+f 2107/4078/3638 2111/4079/3639 2112/4080/3640 2108/4081/3641
+f 2108/4081/3641 2112/4080/3640 8121/244/244 8120/239/239
+f 2111/4079/3639 8129/4082/3642 8130/4083/3643 2112/4080/3640
+f 2112/4080/3640 8130/4083/3643 12810/245/245 8121/244/244
+f 2107/4078/3638 2108/4081/3641 2113/4084/3644 2109/4085/3645
+f 2109/4085/3645 2113/4084/3644 7707/4071/3631 7706/4070/3630
+f 2108/4081/3641 8120/239/239 8119/238/238 2113/4084/3644
+f 2113/4084/3644 8119/238/238 12738/241/241 7707/4071/3631
+f 2107/4078/3638 2109/4085/3645 2114/4086/3646 2110/4087/3647
+f 2110/4087/3647 2114/4086/3646 9069/259/259 9068/251/251
+f 2109/4085/3645 7706/4070/3630 7705/4077/3637 2114/4086/3646
+f 2114/4086/3646 7705/4077/3637 12969/260/260 9069/259/259
+f 2107/4078/3638 2110/4087/3647 2115/4088/3648 2111/4079/3639
+f 2111/4079/3639 2115/4088/3648 8128/4089/3649 8129/4082/3642
+f 2110/4087/3647 9068/251/251 9067/250/250 2115/4088/3648
+f 2115/4088/3648 9067/250/250 12970/254/254 8128/4089/3649
+f 2116/4090/3650 2120/4091/3651 2121/4092/3652 2117/4093/3653
+f 2117/4093/3653 2121/4092/3652 7755/1502/1426 7754/1499/1423
+f 2120/4091/3651 7667/4094/3654 7668/4095/3655 2121/4092/3652
+f 2121/4092/3652 7668/4095/3655 12724/1503/1427 7755/1502/1426
+f 2116/4090/3650 2117/4093/3653 2122/4096/3656 2118/4097/3657
+f 2118/4097/3657 2122/4096/3656 8130/4083/3643 8129/4082/3642
+f 2117/4093/3653 7754/1499/1423 7753/1498/1422 2122/4096/3656
+f 2122/4096/3656 7753/1498/1422 12810/245/245 8130/4083/3643
+f 2116/4090/3650 2118/4097/3657 2123/4098/3658 2119/4099/3659
+f 2119/4099/3659 2123/4098/3658 9075/1515/1439 9074/1509/1433
+f 2118/4097/3657 8129/4082/3642 8128/4089/3649 2123/4098/3658
+f 2123/4098/3658 8128/4089/3649 12970/254/254 9075/1515/1439
+f 2116/4090/3650 2119/4099/3659 2124/4100/3660 2120/4091/3651
+f 2120/4091/3651 2124/4100/3660 7666/4101/3661 7667/4094/3654
+f 2119/4099/3659 9074/1509/1433 9073/1508/1432 2124/4100/3660
+f 2124/4100/3660 9073/1508/1432 12971/1512/1436 7666/4101/3661
+f 2125/4102/3662 2129/4103/3663 2130/4104/3664 2126/4105/3665
+f 2126/4105/3665 2130/4104/3664 8334/4106/716 8333/4107/711
+f 2129/4103/3663 9080/4108/3666 9081/4109/3667 2130/4104/3664
+f 2130/4104/3664 9081/4109/3667 12844/4110/717 8334/4106/716
+f 2125/4102/3662 2126/4105/3665 2131/4111/3668 2127/4112/3669
+f 2127/4112/3669 2131/4111/3668 9295/4113/3670 9296/4114/3671
+f 2126/4105/3665 8333/4107/711 8332/4115/710 2131/4111/3668
+f 2131/4111/3668 8332/4115/710 13009/4116/713 9295/4113/3670
+f 2125/4102/3662 2127/4112/3669 2132/4117/3672 2128/4118/3673
+f 2128/4118/3673 2132/4117/3672 9288/2721/2358 9287/2713/2354
+f 2127/4112/3669 9296/4114/3671 9297/4119/3674 2132/4117/3672
+f 2132/4117/3672 9297/4119/3674 13008/2722/451 9288/2721/2358
+f 2125/4102/3662 2128/4118/3673 2133/4120/3675 2129/4103/3663
+f 2129/4103/3663 2133/4120/3675 9079/4121/3676 9080/4108/3666
+f 2128/4118/3673 9287/2713/2354 9286/2712/2353 2133/4120/3675
+f 2133/4120/3675 9286/2712/2353 12973/2716/2357 9079/4121/3676
+f 2134/4122/3677 2138/4123/3678 2139/4124/3679 2135/4125/3680
+f 2135/4125/3680 2139/4124/3679 8896/4126/3681 8897/4127/3682
+f 2138/4123/3678 9089/3033/2620 9088/3032/2619 2139/4124/3679
+f 2139/4124/3679 9088/3032/2619 12974/3035/1037 8896/4126/3681
+f 2134/4122/3677 2135/4125/3680 2140/4128/3683 2136/4129/3684
+f 2135/4125/3680 8897/4127/3682 8898/4130/3685 2140/4128/3683
+f 2134/4122/3677 2136/4129/3684 2141/4131/3686 2137/4132/3687
+f 2137/4132/3687 2141/4131/3686 9081/4109/3667 9080/4108/3666
+f 2136/4129/3684 8627/4133/2629 8626/4134/2628 2141/4131/3686
+f 2141/4131/3686 8626/4134/2628 12844/4110/717 9081/4109/3667
+f 2134/4122/3677 2137/4132/3687 2142/4135/3688 2138/4123/3678
+f 2138/4123/3678 2142/4135/3688 9090/3037/2623 9089/3033/2620
+f 2137/4132/3687 9080/4108/3666 9079/4121/3676 2142/4135/3688
+f 2142/4135/3688 9079/4121/3676 12973/2716/2357 9090/3037/2623
+f 2143/4136/3689 2147/4137/3690 2148/4138/3691 2144/4139/3692
+f 2144/4139/3692 2148/4138/3691 9091/4140/3693 9092/4141/3694
+f 2147/4137/3690 9095/3726/3309 9094/3725/3308 2148/4138/3691
+f 2148/4138/3691 9094/3725/3308 12975/3728/2378 9091/4140/3693
+f 2143/4136/3689 2145/4142/3695 2149/4143/3696 2146/4144/3697
+f 2146/4144/3697 2149/4143/3696 8898/4130/3685 8897/4127/3682
+f 2143/4136/3689 2146/4144/3697 2150/4145/3698 2147/4137/3690
+f 2147/4137/3690 2150/4145/3698 9096/3730/3311 9095/3726/3309
+f 2146/4144/3697 8897/4127/3682 8896/4126/3681 2150/4145/3698
+f 2150/4145/3698 8896/4126/3681 12974/3035/1037 9096/3730/3311
+f 2151/4146/3699 2155/4147/3700 2156/4148/3701 2152/4149/3702
+f 2152/4149/3702 2156/4148/3701 8633/3707/3293 8632/3700/3286
+f 2155/4147/3700 9032/4150/3703 9033/4151/3704 2156/4148/3701
+f 2156/4148/3701 9033/4151/3704 12963/3708/3294 8633/3707/3293
+f 2151/4146/3699 2152/4149/3702 2157/4152/3705 2153/4153/3706
+f 2153/4153/3706 2157/4152/3705 9093/4154/3707 9092/4155/3694
+f 2152/4149/3702 8632/3700/3286 8631/3699/3285 2157/4152/3705
+f 2157/4152/3705 8631/3699/3285 12903/3702/3288 9093/4154/3707
+f 2151/4146/3699 2153/4153/3706 2158/4156/3708 2154/4157/3709
+f 2154/4157/3709 2158/4156/3708 9102/2741/2377 9101/2733/2369
+f 2153/4153/3706 9092/4155/3694 9091/4158/3693 2158/4156/3708
+f 2158/4156/3708 9091/4158/3693 12975/2742/2378 9102/2741/2377
+f 2151/4146/3699 2154/4157/3709 2159/4159/3710 2155/4147/3700
+f 2155/4147/3700 2159/4159/3710 9031/4160/3711 9032/4150/3703
+f 2154/4157/3709 9101/2733/2369 9100/2732/2368 2159/4159/3710
+f 2159/4159/3710 9100/2732/2368 12976/2736/2372 9031/4160/3711
+f 2160/4161/3712 2164/4162/3713 2165/4163/3714 2161/4164/3715
+f 2161/4164/3715 2165/4163/3714 9024/3999/3562 9023/3996/3559
+f 2164/4162/3713 9104/4165/3716 9105/4166/3717 2165/4163/3714
+f 2165/4163/3714 9105/4166/3717 12901/3688/3274 9024/3999/3562
+f 2160/4161/3712 2161/4164/3715 2166/4167/3718 2162/4168/3719
+f 2162/4168/3719 2166/4167/3718 9033/4151/3704 9032/4150/3703
+f 2161/4164/3715 9023/3996/3559 9022/3995/3558 2166/4167/3718
+f 2166/4167/3718 9022/3995/3558 12963/3708/3294 9033/4151/3704
+f 2160/4161/3712 2162/4168/3719 2167/4169/3720 2163/4170/3721
+f 2163/4170/3721 2167/4169/3720 9108/4011/3574 9107/4008/3571
+f 2162/4168/3719 9032/4150/3703 9031/4160/3711 2167/4169/3720
+f 2167/4169/3720 9031/4160/3711 12976/2736/2372 9108/4011/3574
+f 2160/4161/3712 2163/4170/3721 2168/4171/3722 2164/4162/3713
+f 2164/4162/3713 2168/4171/3722 9103/4172/3723 9104/4165/3716
+f 2163/4170/3721 9107/4008/3571 9106/4007/3570 2168/4171/3722
+f 2168/4171/3722 9106/4007/3570 12977/2767/2402 9103/4172/3723
+f 2169/4173/3724 2173/4174/3725 2174/4175/3726 2170/4176/3727
+f 2170/4176/3727 2174/4175/3726 8648/3691/3277 8647/3686/3272
+f 2173/4174/3725 9110/4177/3728 9111/4178/3729 2174/4175/3726
+f 2174/4175/3726 9111/4178/3729 12905/3672/3258 8648/3691/3277
+f 2169/4173/3724 2170/4176/3727 2175/4179/3730 2171/4180/3731
+f 2171/4180/3731 2175/4179/3730 9105/4166/3717 9104/4165/3716
+f 2170/4176/3727 8647/3686/3272 8646/3685/3271 2175/4179/3730
+f 2175/4179/3730 8646/3685/3271 12901/3688/3274 9105/4166/3717
+f 2169/4173/3724 2171/4180/3731 2176/4181/3732 2172/4182/3733
+f 2172/4182/3733 2176/4181/3732 9114/2766/2401 9113/2758/2394
+f 2171/4180/3731 9104/4165/3716 9103/4172/3723 2176/4181/3732
+f 2176/4181/3732 9103/4172/3723 12977/2767/2402 9114/2766/2401
+f 2169/4173/3724 2172/4182/3733 2177/4183/3734 2173/4174/3725
+f 2173/4174/3725 2177/4183/3734 9109/4184/3735 9110/4177/3728
+f 2172/4182/3733 9113/2758/2394 9112/2757/2393 2177/4183/3734
+f 2177/4183/3734 9112/2757/2393 12978/2761/225 9109/4184/3735
+f 2178/4185/3736 2182/4186/3737 2183/4187/3738 2179/4188/3739
+f 2179/4188/3739 2183/4187/3738 8663/3675/3261 8662/3670/3256
+f 2182/4186/3737 9116/4189/3740 9117/4190/3741 2183/4187/3738
+f 2183/4187/3738 9117/4190/3741 12907/3656/3242 8663/3675/3261
+f 2178/4185/3736 2179/4188/3739 2184/4191/3742 2180/4192/3743
+f 2180/4192/3743 2184/4191/3742 9111/4178/3729 9110/4177/3728
+f 2179/4188/3739 8662/3670/3256 8661/3669/3255 2184/4191/3742
+f 2184/4191/3742 8661/3669/3255 12905/3672/3258 9111/4178/3729
+f 2178/4185/3736 2180/4192/3743 2185/4193/3744 2181/4194/3745
+f 2181/4194/3745 2185/4193/3744 9120/2789/223 9119/2783/210
+f 2180/4192/3743 9110/4177/3728 9109/4184/3735 2185/4193/3744
+f 2185/4193/3744 9109/4184/3735 12978/2761/225 9120/2789/223
+f 2178/4185/3736 2181/4194/3745 2186/4195/3746 2182/4186/3737
+f 2182/4186/3737 2186/4195/3746 9115/4196/3747 9116/4189/3740
+f 2181/4194/3745 9119/2783/210 9118/2782/211 2186/4195/3746
+f 2186/4195/3746 9118/2782/211 12979/2786/205 9115/4196/3747
+f 2187/4197/3748 2191/4198/3749 2192/4199/3750 2188/4200/3751
+f 2188/4200/3751 2192/4199/3750 8678/3659/3245 8677/3654/3240
+f 2191/4198/3749 9122/4201/3752 9123/4202/3753 2192/4199/3750
+f 2192/4199/3750 9123/4202/3753 12909/3640/3226 8678/3659/3245
+f 2187/4197/3748 2188/4200/3751 2193/4203/3754 2189/4204/3755
+f 2189/4204/3755 2193/4203/3754 9117/4190/3741 9116/4189/3740
+f 2188/4200/3751 8677/3654/3240 8676/3653/3239 2193/4203/3754
+f 2193/4203/3754 8676/3653/3239 12907/3656/3242 9117/4190/3741
+f 2187/4197/3748 2189/4204/3755 2194/4205/3756 2190/4206/3757
+f 2190/4206/3757 2194/4205/3756 9126/2809/203 9125/2803/190
+f 2189/4204/3755 9116/4189/3740 9115/4196/3747 2194/4205/3756
+f 2194/4205/3756 9115/4196/3747 12979/2786/205 9126/2809/203
+f 2187/4197/3748 2190/4206/3757 2195/4207/3758 2191/4198/3749
+f 2191/4198/3749 2195/4207/3758 9121/4208/3759 9122/4201/3752
+f 2190/4206/3757 9125/2803/190 9124/2802/191 2195/4207/3758
+f 2195/4207/3758 9124/2802/191 12980/2806/185 9121/4208/3759
+f 2196/4209/3760 2200/4210/3761 2201/4211/3762 2197/4212/3763
+f 2197/4212/3763 2201/4211/3762 8693/3643/3229 8692/3638/3224
+f 2200/4210/3761 9128/4213/3764 9129/4214/3765 2201/4211/3762
+f 2201/4211/3762 9129/4214/3765 12911/3624/3210 8693/3643/3229
+f 2196/4209/3760 2197/4212/3763 2202/4215/3766 2198/4216/3767
+f 2198/4216/3767 2202/4215/3766 9123/4202/3753 9122/4201/3752
+f 2197/4212/3763 8692/3638/3224 8691/3637/3223 2202/4215/3766
+f 2202/4215/3766 8691/3637/3223 12909/3640/3226 9123/4202/3753
+f 2196/4209/3760 2198/4216/3767 2203/4217/3768 2199/4218/3769
+f 2199/4218/3769 2203/4217/3768 9132/2829/183 9131/2823/170
+f 2198/4216/3767 9122/4201/3752 9121/4208/3759 2203/4217/3768
+f 2203/4217/3768 9121/4208/3759 12980/2806/185 9132/2829/183
+f 2196/4209/3760 2199/4218/3769 2204/4219/3770 2200/4210/3761
+f 2200/4210/3761 2204/4219/3770 9127/4220/3771 9128/4213/3764
+f 2199/4218/3769 9131/2823/170 9130/2822/171 2204/4219/3770
+f 2204/4219/3770 9130/2822/171 12981/2826/165 9127/4220/3771
+f 2205/4221/3772 2209/4222/3773 2210/4223/3774 2206/4224/3775
+f 2206/4224/3775 2210/4223/3774 8708/3627/3213 8707/3622/3208
+f 2209/4222/3773 9134/4225/3776 9135/4226/3777 2210/4223/3774
+f 2210/4223/3774 9135/4226/3777 12913/3608/3194 8708/3627/3213
+f 2205/4221/3772 2206/4224/3775 2211/4227/3778 2207/4228/3779
+f 2207/4228/3779 2211/4227/3778 9129/4214/3765 9128/4213/3764
+f 2206/4224/3775 8707/3622/3208 8706/3621/3207 2211/4227/3778
+f 2211/4227/3778 8706/3621/3207 12911/3624/3210 9129/4214/3765
+f 2205/4221/3772 2207/4228/3779 2212/4229/3780 2208/4230/3781
+f 2208/4230/3781 2212/4229/3780 9138/2849/163 9137/2843/150
+f 2207/4228/3779 9128/4213/3764 9127/4220/3771 2212/4229/3780
+f 2212/4229/3780 9127/4220/3771 12981/2826/165 9138/2849/163
+f 2205/4221/3772 2208/4230/3781 2213/4231/3782 2209/4222/3773
+f 2209/4222/3773 2213/4231/3782 9133/4232/3783 9134/4225/3776
+f 2208/4230/3781 9137/2843/150 9136/2842/151 2213/4231/3782
+f 2213/4231/3782 9136/2842/151 12982/2846/145 9133/4232/3783
+f 2214/4233/3784 2218/4234/3785 2219/4235/3786 2215/4236/3787
+f 2215/4236/3787 2219/4235/3786 8723/3611/3197 8722/3606/3192
+f 2218/4234/3785 9140/4237/3788 9141/4238/3789 2219/4235/3786
+f 2219/4235/3786 9141/4238/3789 12915/3592/3178 8723/3611/3197
+f 2214/4233/3784 2215/4236/3787 2220/4239/3790 2216/4240/3791
+f 2216/4240/3791 2220/4239/3790 9135/4226/3777 9134/4225/3776
+f 2215/4236/3787 8722/3606/3192 8721/3605/3191 2220/4239/3790
+f 2220/4239/3790 8721/3605/3191 12913/3608/3194 9135/4226/3777
+f 2214/4233/3784 2216/4240/3791 2221/4241/3792 2217/4242/3793
+f 2217/4242/3793 2221/4241/3792 9144/2869/143 9143/2863/130
+f 2216/4240/3791 9134/4225/3776 9133/4232/3783 2221/4241/3792
+f 2221/4241/3792 9133/4232/3783 12982/2846/145 9144/2869/143
+f 2214/4233/3784 2217/4242/3793 2222/4243/3794 2218/4234/3785
+f 2218/4234/3785 2222/4243/3794 9139/4244/3795 9140/4237/3788
+f 2217/4242/3793 9143/2863/130 9142/2862/131 2222/4243/3794
+f 2222/4243/3794 9142/2862/131 12983/2866/125 9139/4244/3795
+f 2223/4245/3796 2227/4246/3797 2228/4247/3798 2224/4248/3799
+f 2224/4248/3799 2228/4247/3798 8738/3595/3181 8737/3590/3176
+f 2227/4246/3797 9146/4249/3800 9147/4250/3801 2228/4247/3798
+f 2228/4247/3798 9147/4250/3801 12917/3576/3162 8738/3595/3181
+f 2223/4245/3796 2224/4248/3799 2229/4251/3802 2225/4252/3803
+f 2225/4252/3803 2229/4251/3802 9141/4238/3789 9140/4237/3788
+f 2224/4248/3799 8737/3590/3176 8736/3589/3175 2229/4251/3802
+f 2229/4251/3802 8736/3589/3175 12915/3592/3178 9141/4238/3789
+f 2223/4245/3796 2225/4252/3803 2230/4253/3804 2226/4254/3805
+f 2226/4254/3805 2230/4253/3804 9150/2889/123 9149/2883/110
+f 2225/4252/3803 9140/4237/3788 9139/4244/3795 2230/4253/3804
+f 2230/4253/3804 9139/4244/3795 12983/2866/125 9150/2889/123
+f 2223/4245/3796 2226/4254/3805 2231/4255/3806 2227/4246/3797
+f 2227/4246/3797 2231/4255/3806 9145/4256/3807 9146/4249/3800
+f 2226/4254/3805 9149/2883/110 9148/2882/111 2231/4255/3806
+f 2231/4255/3806 9148/2882/111 12984/2886/105 9145/4256/3807
+f 2232/4257/3808 2236/4258/3809 2237/4259/3810 2233/4260/3811
+f 2233/4260/3811 2237/4259/3810 8753/3579/3165 8752/3574/3160
+f 2236/4258/3809 9152/4261/3812 9153/4262/3813 2237/4259/3810
+f 2237/4259/3810 9153/4262/3813 12919/3560/3146 8753/3579/3165
+f 2232/4257/3808 2233/4260/3811 2238/4263/3814 2234/4264/3815
+f 2234/4264/3815 2238/4263/3814 9147/4250/3801 9146/4249/3800
+f 2233/4260/3811 8752/3574/3160 8751/3573/3159 2238/4263/3814
+f 2238/4263/3814 8751/3573/3159 12917/3576/3162 9147/4250/3801
+f 2232/4257/3808 2234/4264/3815 2239/4265/3816 2235/4266/3817
+f 2235/4266/3817 2239/4265/3816 9156/2909/103 9155/2903/90
+f 2234/4264/3815 9146/4249/3800 9145/4256/3807 2239/4265/3816
+f 2239/4265/3816 9145/4256/3807 12984/2886/105 9156/2909/103
+f 2232/4257/3808 2235/4266/3817 2240/4267/3818 2236/4258/3809
+f 2236/4258/3809 2240/4267/3818 9151/4268/3819 9152/4261/3812
+f 2235/4266/3817 9155/2903/90 9154/2902/91 2240/4267/3818
+f 2240/4267/3818 9154/2902/91 12985/2906/85 9151/4268/3819
+f 2241/4269/3820 2245/4270/3821 2246/4271/3822 2242/4272/3823
+f 2242/4272/3823 2246/4271/3822 8768/3563/3149 8767/3558/3144
+f 2245/4270/3821 9158/4273/3824 9159/4274/3825 2246/4271/3822
+f 2246/4271/3822 9159/4274/3825 12921/3544/3130 8768/3563/3149
+f 2241/4269/3820 2242/4272/3823 2247/4275/3826 2243/4276/3827
+f 2243/4276/3827 2247/4275/3826 9153/4262/3813 9152/4261/3812
+f 2242/4272/3823 8767/3558/3144 8766/3557/3143 2247/4275/3826
+f 2247/4275/3826 8766/3557/3143 12919/3560/3146 9153/4262/3813
+f 2241/4269/3820 2243/4276/3827 2248/4277/3828 2244/4278/3829
+f 2244/4278/3829 2248/4277/3828 9162/2929/83 9161/2923/70
+f 2243/4276/3827 9152/4261/3812 9151/4268/3819 2248/4277/3828
+f 2248/4277/3828 9151/4268/3819 12985/2906/85 9162/2929/83
+f 2241/4269/3820 2244/4278/3829 2249/4279/3830 2245/4270/3821
+f 2245/4270/3821 2249/4279/3830 9157/4280/3831 9158/4273/3824
+f 2244/4278/3829 9161/2923/70 9160/2922/71 2249/4279/3830
+f 2249/4279/3830 9160/2922/71 12986/2926/65 9157/4280/3831
+f 2250/4281/3832 2254/4282/3833 2255/4283/3834 2251/4284/3835
+f 2251/4284/3835 2255/4283/3834 8783/3547/3133 8782/3542/3128
+f 2254/4282/3833 9164/4285/3836 9165/4286/3837 2255/4283/3834
+f 2255/4283/3834 9165/4286/3837 12923/3528/3114 8783/3547/3133
+f 2250/4281/3832 2251/4284/3835 2256/4287/3838 2252/4288/3839
+f 2252/4288/3839 2256/4287/3838 9159/4274/3825 9158/4273/3824
+f 2251/4284/3835 8782/3542/3128 8781/3541/3127 2256/4287/3838
+f 2256/4287/3838 8781/3541/3127 12921/3544/3130 9159/4274/3825
+f 2250/4281/3832 2252/4288/3839 2257/4289/3840 2253/4290/3841
+f 2253/4290/3841 2257/4289/3840 9168/2949/63 9167/2943/50
+f 2252/4288/3839 9158/4273/3824 9157/4280/3831 2257/4289/3840
+f 2257/4289/3840 9157/4280/3831 12986/2926/65 9168/2949/63
+f 2250/4281/3832 2253/4290/3841 2258/4291/3842 2254/4282/3833
+f 2254/4282/3833 2258/4291/3842 9163/4292/3843 9164/4285/3836
+f 2253/4290/3841 9167/2943/50 9166/2942/51 2258/4291/3842
+f 2258/4291/3842 9166/2942/51 12987/2946/45 9163/4292/3843
+f 2259/4293/3844 2263/4294/3845 2264/4295/3846 2260/4296/3847
+f 2260/4296/3847 2264/4295/3846 8798/3531/3117 8797/3526/3112
+f 2263/4294/3845 9170/4297/3848 9171/4298/3849 2264/4295/3846
+f 2264/4295/3846 9171/4298/3849 12925/3508/3094 8798/3531/3117
+f 2259/4293/3844 2260/4296/3847 2265/4299/3850 2261/4300/3851
+f 2261/4300/3851 2265/4299/3850 9165/4286/3837 9164/4285/3836
+f 2260/4296/3847 8797/3526/3112 8796/3525/3111 2265/4299/3850
+f 2265/4299/3850 8796/3525/3111 12923/3528/3114 9165/4286/3837
+f 2259/4293/3844 2261/4300/3851 2266/4301/3852 2262/4302/3853
+f 2262/4302/3853 2266/4301/3852 9174/2969/43 9173/2963/30
+f 2261/4300/3851 9164/4285/3836 9163/4292/3843 2266/4301/3852
+f 2266/4301/3852 9163/4292/3843 12987/2946/45 9174/2969/43
+f 2259/4293/3844 2262/4302/3853 2267/4303/3854 2263/4294/3845
+f 2263/4294/3845 2267/4303/3854 9169/4304/3855 9170/4297/3848
+f 2262/4302/3853 9173/2963/30 9172/2962/31 2267/4303/3854
+f 2267/4303/3854 9172/2962/31 12988/2966/25 9169/4304/3855
+f 2268/4305/3856 2272/4306/3857 2273/4307/3858 2269/4308/3859
+f 2269/4308/3859 2273/4307/3858 8813/3513/3099 8812/3506/3092
+f 2272/4306/3857 9176/4309/3860 9177/4310/3861 2273/4307/3858
+f 2273/4307/3858 9177/4310/3861 12927/3514/3100 8813/3513/3099
+f 2268/4305/3856 2269/4308/3859 2274/4311/3862 2270/4312/3863
+f 2270/4312/3863 2274/4311/3862 9171/4298/3849 9170/4297/3848
+f 2269/4308/3859 8812/3506/3092 8811/3505/3091 2274/4311/3862
+f 2274/4311/3862 8811/3505/3091 12925/3508/3094 9171/4298/3849
+f 2268/4305/3856 2270/4312/3863 2275/4313/3864 2271/4314/3865
+f 2271/4314/3865 2275/4313/3864 9180/2989/23 9179/2983/7
+f 2270/4312/3863 9170/4297/3848 9169/4304/3855 2275/4313/3864
+f 2275/4313/3864 9169/4304/3855 12988/2966/25 9180/2989/23
+f 2268/4305/3856 2271/4314/3865 2276/4315/3866 2272/4306/3857
+f 2272/4306/3857 2276/4315/3866 9175/4316/3867 9176/4309/3860
+f 2271/4314/3865 9179/2983/7 9178/2982/8 2276/4315/3866
+f 2276/4315/3866 9178/2982/8 12989/2986/9 9175/4316/3867
+f 2277/4317/3868 2281/4318/3869 2282/4319/3870 2278/4320/3871
+f 2278/4320/3871 2282/4319/3870 8482/4321/3872 8483/4322/3873
+f 2281/4318/3869 9185/4323/3874 9186/4324/3875 2282/4319/3870
+f 2282/4319/3870 9186/4324/3875 12869/4325/3876 8482/4321/3872
+f 2277/4317/3868 2278/4320/3871 2283/4326/3877 2279/4327/3878
+f 2279/4327/3878 2283/4326/3877 9181/4328/3879 9182/4329/3880
+f 2278/4320/3871 8483/4322/3873 8484/4330/3881 2283/4326/3877
+f 2283/4326/3877 8484/4330/3881 12871/4331/3882 9181/4328/3879
+f 2277/4317/3868 2279/4327/3878 2284/4332/3883 2280/4333/3884
+f 2280/4333/3884 2284/4332/3883 9189/2505/974 9188/2497/975
+f 2279/4327/3878 9182/4329/3880 9183/4334/3885 2284/4332/3883
+f 2284/4332/3883 9183/4334/3885 12990/2506/977 9189/2505/974
+f 2277/4317/3868 2280/4333/3884 2285/4335/3886 2281/4318/3869
+f 2281/4318/3869 2285/4335/3886 9184/4336/3887 9185/4323/3874
+f 2280/4333/3884 9188/2497/975 9187/2496/982 2285/4335/3886
+f 2285/4335/3886 9187/2496/982 12991/2500/983 9184/4336/3887
+f 2286/4337/3888 2290/4338/3889 2291/4339/3890 2287/4340/3891
+f 2287/4340/3891 2291/4339/3890 8470/4341/3892 8471/4342/3893
+f 2290/4338/3889 9191/4343/3894 9192/4344/3895 2291/4339/3890
+f 2291/4339/3890 9192/4344/3895 12867/4345/3896 8470/4341/3892
+f 2286/4337/3888 2287/4340/3891 2292/4346/3897 2288/4347/3898
+f 2288/4347/3898 2292/4346/3897 9186/4324/3875 9185/4323/3874
+f 2287/4340/3891 8471/4342/3893 8472/4348/3899 2292/4346/3897
+f 2292/4346/3897 8472/4348/3899 12869/4325/3876 9186/4324/3875
+f 2286/4337/3888 2288/4347/3898 2293/4349/3900 2289/4350/3901
+f 2289/4350/3901 2293/4349/3900 9195/2523/996 9194/2517/997
+f 2288/4347/3898 9185/4323/3874 9184/4336/3887 2293/4349/3900
+f 2293/4349/3900 9184/4336/3887 12991/2500/983 9195/2523/996
+f 2286/4337/3888 2289/4350/3901 2294/4351/3902 2290/4338/3889
+f 2290/4338/3889 2294/4351/3902 9190/4352/3903 9191/4343/3894
+f 2289/4350/3901 9194/2517/997 9193/2516/1002 2294/4351/3902
+f 2294/4351/3902 9193/2516/1002 12992/2520/1003 9190/4352/3903
+f 2295/4353/3904 2299/4354/3905 2300/4355/3906 2296/4356/3907
+f 2296/4356/3907 2300/4355/3906 8458/4357/3908 8459/4358/3909
+f 2299/4354/3905 9197/4359/3910 9198/4360/3911 2300/4355/3906
+f 2300/4355/3906 9198/4360/3911 12865/4361/3912 8458/4357/3908
+f 2295/4353/3904 2296/4356/3907 2301/4362/3913 2297/4363/3914
+f 2297/4363/3914 2301/4362/3913 9192/4344/3895 9191/4343/3894
+f 2296/4356/3907 8459/4358/3909 8460/4364/3915 2301/4362/3913
+f 2301/4362/3913 8460/4364/3915 12867/4345/3896 9192/4344/3895
+f 2295/4353/3904 2297/4363/3914 2302/4365/3916 2298/4366/3917
+f 2298/4366/3917 2302/4365/3916 9201/2539/1016 9200/2533/1017
+f 2297/4363/3914 9191/4343/3894 9190/4352/3903 2302/4365/3916
+f 2302/4365/3916 9190/4352/3903 12992/2520/1003 9201/2539/1016
+f 2295/4353/3904 2298/4366/3917 2303/4367/3918 2299/4354/3905
+f 2299/4354/3905 2303/4367/3918 9196/4368/3919 9197/4359/3910
+f 2298/4366/3917 9200/2533/1017 9199/2532/1022 2303/4367/3918
+f 2303/4367/3918 9199/2532/1022 12993/2536/1023 9196/4368/3919
+f 2304/4369/3920 2308/4370/3921 2309/4371/3922 2305/4372/3923
+f 2305/4372/3923 2309/4371/3922 8446/4373/3924 8447/4374/3925
+f 2308/4370/3921 9203/4375/3926 9204/4376/3927 2309/4371/3922
+f 2309/4371/3922 9204/4376/3927 12863/4377/3928 8446/4373/3924
+f 2304/4369/3920 2305/4372/3923 2310/4378/3929 2306/4379/3930
+f 2306/4379/3930 2310/4378/3929 9198/4360/3911 9197/4359/3910
+f 2305/4372/3923 8447/4374/3925 8448/4380/3931 2310/4378/3929
+f 2310/4378/3929 8448/4380/3931 12865/4361/3912 9198/4360/3911
+f 2304/4369/3920 2306/4379/3930 2311/4381/3932 2307/4382/3933
+f 2307/4382/3933 2311/4381/3932 9207/2555/1036 9206/2549/1037
+f 2306/4379/3930 9197/4359/3910 9196/4368/3919 2311/4381/3932
+f 2311/4381/3932 9196/4368/3919 12993/2536/1023 9207/2555/1036
+f 2304/4369/3920 2307/4382/3933 2312/4383/3934 2308/4370/3921
+f 2308/4370/3921 2312/4383/3934 9202/4384/3935 9203/4375/3926
+f 2307/4382/3933 9206/2549/1037 9205/2548/1042 2312/4383/3934
+f 2312/4383/3934 9205/2548/1042 12994/2552/451 9202/4384/3935
+f 2313/4385/3936 2317/4386/3937 2318/4387/3938 2314/4388/3939
+f 2314/4388/3939 2318/4387/3938 8434/4389/3940 8435/4390/3941
+f 2317/4386/3937 9209/4391/3942 9210/4392/3943 2318/4387/3938
+f 2318/4387/3938 9210/4392/3943 12861/4393/3944 8434/4389/3940
+f 2313/4385/3936 2314/4388/3939 2319/4394/3945 2315/4395/3946
+f 2315/4395/3946 2319/4394/3945 9204/4376/3927 9203/4375/3926
+f 2314/4388/3939 8435/4390/3941 8436/4396/3947 2319/4394/3945
+f 2319/4394/3945 8436/4396/3947 12863/4377/3928 9204/4376/3927
+f 2313/4385/3936 2315/4395/3946 2320/4397/3948 2316/4398/3949
+f 2316/4398/3949 2320/4397/3948 9213/2571/1055 9212/2565/1056
+f 2315/4395/3946 9203/4375/3926 9202/4384/3935 2320/4397/3948
+f 2320/4397/3948 9202/4384/3935 12994/2552/451 9213/2571/1055
+f 2313/4385/3936 2316/4398/3949 2321/4399/3950 2317/4386/3937
+f 2317/4386/3937 2321/4399/3950 9208/4400/3951 9209/4391/3942
+f 2316/4398/3949 9212/2565/1056 9211/2564/1061 2321/4399/3950
+f 2321/4399/3950 9211/2564/1061 12995/2568/1062 9208/4400/3951
+f 2322/4401/3952 2326/4402/3953 2327/4403/3954 2323/4404/3955
+f 2323/4404/3955 2327/4403/3954 8422/4405/3956 8423/4406/3957
+f 2326/4402/3953 9215/4407/3958 9216/4408/3959 2327/4403/3954
+f 2327/4403/3954 9216/4408/3959 12859/4409/3960 8422/4405/3956
+f 2322/4401/3952 2323/4404/3955 2328/4410/3961 2324/4411/3962
+f 2324/4411/3962 2328/4410/3961 9210/4392/3943 9209/4391/3942
+f 2323/4404/3955 8423/4406/3957 8424/4412/3963 2328/4410/3961
+f 2328/4410/3961 8424/4412/3963 12861/4393/3944 9210/4392/3943
+f 2322/4401/3952 2324/4411/3962 2329/4413/3964 2325/4414/3965
+f 2325/4414/3965 2329/4413/3964 9219/2587/1075 9218/2581/1076
+f 2324/4411/3962 9209/4391/3942 9208/4400/3951 2329/4413/3964
+f 2329/4413/3964 9208/4400/3951 12995/2568/1062 9219/2587/1075
+f 2322/4401/3952 2325/4414/3965 2330/4415/3966 2326/4402/3953
+f 2326/4402/3953 2330/4415/3966 9214/4416/3967 9215/4407/3958
+f 2325/4414/3965 9218/2581/1076 9217/2580/1081 2330/4415/3966
+f 2330/4415/3966 9217/2580/1081 12996/2584/1082 9214/4416/3967
+f 2331/4417/3968 2335/4418/3969 2336/4419/3970 2332/4420/3971
+f 2332/4420/3971 2336/4419/3970 8410/4421/3972 8411/4422/3973
+f 2335/4418/3969 9221/4423/3974 9222/4424/3975 2336/4419/3970
+f 2336/4419/3970 9222/4424/3975 12857/4425/3976 8410/4421/3972
+f 2331/4417/3968 2332/4420/3971 2337/4426/3977 2333/4427/3978
+f 2333/4427/3978 2337/4426/3977 9216/4408/3959 9215/4407/3958
+f 2332/4420/3971 8411/4422/3973 8412/4428/3979 2337/4426/3977
+f 2337/4426/3977 8412/4428/3979 12859/4409/3960 9216/4408/3959
+f 2331/4417/3968 2333/4427/3978 2338/4429/3980 2334/4430/3981
+f 2334/4430/3981 2338/4429/3980 9225/2603/1095 9224/2597/1096
+f 2333/4427/3978 9215/4407/3958 9214/4416/3967 2338/4429/3980
+f 2338/4429/3980 9214/4416/3967 12996/2584/1082 9225/2603/1095
+f 2331/4417/3968 2334/4430/3981 2339/4431/3982 2335/4418/3969
+f 2335/4418/3969 2339/4431/3982 9220/4432/3983 9221/4423/3974
+f 2334/4430/3981 9224/2597/1096 9223/2596/1101 2339/4431/3982
+f 2339/4431/3982 9223/2596/1101 12997/2600/1102 9220/4432/3983
+f 2340/4433/3984 2344/4434/3985 2345/4435/3986 2341/4436/3987
+f 2341/4436/3987 2345/4435/3986 8398/4437/3988 8399/4438/3989
+f 2344/4434/3985 9227/4439/3990 9228/4440/3991 2345/4435/3986
+f 2345/4435/3986 9228/4440/3991 12855/4441/3992 8398/4437/3988
+f 2340/4433/3984 2341/4436/3987 2346/4442/3993 2342/4443/3994
+f 2342/4443/3994 2346/4442/3993 9222/4424/3975 9221/4423/3974
+f 2341/4436/3987 8399/4438/3989 8400/4444/3995 2346/4442/3993
+f 2346/4442/3993 8400/4444/3995 12857/4425/3976 9222/4424/3975
+f 2340/4433/3984 2342/4443/3994 2347/4445/3996 2343/4446/3997
+f 2343/4446/3997 2347/4445/3996 9231/2619/1115 9230/2613/1116
+f 2342/4443/3994 9221/4423/3974 9220/4432/3983 2347/4445/3996
+f 2347/4445/3996 9220/4432/3983 12997/2600/1102 9231/2619/1115
+f 2340/4433/3984 2343/4446/3997 2348/4447/3998 2344/4434/3985
+f 2344/4434/3985 2348/4447/3998 9226/4448/3999 9227/4439/3990
+f 2343/4446/3997 9230/2613/1116 9229/2612/1121 2348/4447/3998
+f 2348/4447/3998 9229/2612/1121 12998/2616/1122 9226/4448/3999
+f 2349/4449/4000 2353/4450/4001 2354/4451/4002 2350/4452/4003
+f 2350/4452/4003 2354/4451/4002 8386/4453/4004 8387/4454/4005
+f 2353/4450/4001 9233/4455/4006 9234/4456/4007 2354/4451/4002
+f 2354/4451/4002 9234/4456/4007 12853/4457/4008 8386/4453/4004
+f 2349/4449/4000 2350/4452/4003 2355/4458/4009 2351/4459/4010
+f 2351/4459/4010 2355/4458/4009 9228/4440/3991 9227/4439/3990
+f 2350/4452/4003 8387/4454/4005 8388/4460/4011 2355/4458/4009
+f 2355/4458/4009 8388/4460/4011 12855/4441/3992 9228/4440/3991
+f 2349/4449/4000 2351/4459/4010 2356/4461/4012 2352/4462/4013
+f 2352/4462/4013 2356/4461/4012 9237/2635/1135 9236/2629/1136
+f 2351/4459/4010 9227/4439/3990 9226/4448/3999 2356/4461/4012
+f 2356/4461/4012 9226/4448/3999 12998/2616/1122 9237/2635/1135
+f 2349/4449/4000 2352/4462/4013 2357/4463/4014 2353/4450/4001
+f 2353/4450/4001 2357/4463/4014 9232/4464/4015 9233/4455/4006
+f 2352/4462/4013 9236/2629/1136 9235/2628/1141 2357/4463/4014
+f 2357/4463/4014 9235/2628/1141 12999/2632/1142 9232/4464/4015
+f 2358/4465/4016 2362/4466/4017 2363/4467/4018 2359/4468/4019
+f 2359/4468/4019 2363/4467/4018 8374/4469/4020 8375/4470/4021
+f 2362/4466/4017 9239/4471/4022 9240/4472/4023 2363/4467/4018
+f 2363/4467/4018 9240/4472/4023 12851/4473/4024 8374/4469/4020
+f 2358/4465/4016 2359/4468/4019 2364/4474/4025 2360/4475/4026
+f 2360/4475/4026 2364/4474/4025 9234/4456/4007 9233/4455/4006
+f 2359/4468/4019 8375/4470/4021 8376/4476/4027 2364/4474/4025
+f 2364/4474/4025 8376/4476/4027 12853/4457/4008 9234/4456/4007
+f 2358/4465/4016 2360/4475/4026 2365/4477/4028 2361/4478/4029
+f 2361/4478/4029 2365/4477/4028 9243/2651/1155 9242/2645/1156
+f 2360/4475/4026 9233/4455/4006 9232/4464/4015 2365/4477/4028
+f 2365/4477/4028 9232/4464/4015 12999/2632/1142 9243/2651/1155
+f 2358/4465/4016 2361/4478/4029 2366/4479/4030 2362/4466/4017
+f 2362/4466/4017 2366/4479/4030 9238/4480/4031 9239/4471/4022
+f 2361/4478/4029 9242/2645/1156 9241/2644/1161 2366/4479/4030
+f 2366/4479/4030 9241/2644/1161 13000/2648/1162 9238/4480/4031
+f 2367/4481/4032 2371/4482/4033 2372/4483/4034 2368/4484/4035
+f 2368/4484/4035 2372/4483/4034 8362/4485/4036 8363/4486/4037
+f 2371/4482/4033 9245/4487/4038 9246/4488/4039 2372/4483/4034
+f 2372/4483/4034 9246/4488/4039 12849/4489/4040 8362/4485/4036
+f 2367/4481/4032 2368/4484/4035 2373/4490/4041 2369/4491/4042
+f 2369/4491/4042 2373/4490/4041 9240/4472/4023 9239/4471/4022
+f 2368/4484/4035 8363/4486/4037 8364/4492/4043 2373/4490/4041
+f 2373/4490/4041 8364/4492/4043 12851/4473/4024 9240/4472/4023
+f 2367/4481/4032 2369/4491/4042 2374/4493/4044 2370/4494/4045
+f 2370/4494/4045 2374/4493/4044 9249/2667/1175 9248/2661/1176
+f 2369/4491/4042 9239/4471/4022 9238/4480/4031 2374/4493/4044
+f 2374/4493/4044 9238/4480/4031 13000/2648/1162 9249/2667/1175
+f 2367/4481/4032 2370/4494/4045 2375/4495/4046 2371/4482/4033
+f 2371/4482/4033 2375/4495/4046 9244/4496/4047 9245/4487/4038
+f 2370/4494/4045 9248/2661/1176 9247/2660/1181 2375/4495/4046
+f 2375/4495/4046 9247/2660/1181 13001/2664/1182 9244/4496/4047
+f 2376/4497/4048 2380/4498/4049 2381/4499/4050 2377/4500/4051
+f 2377/4500/4051 2381/4499/4050 8350/4501/4052 8351/4502/4053
+f 2380/4498/4049 9251/4503/4054 9252/4504/4055 2381/4499/4050
+f 2381/4499/4050 9252/4504/4055 12847/4505/4056 8350/4501/4052
+f 2376/4497/4048 2377/4500/4051 2382/4506/4057 2378/4507/4058
+f 2378/4507/4058 2382/4506/4057 9246/4488/4039 9245/4487/4038
+f 2377/4500/4051 8351/4502/4053 8352/4508/4059 2382/4506/4057
+f 2382/4506/4057 8352/4508/4059 12849/4489/4040 9246/4488/4039
+f 2376/4497/4048 2378/4507/4058 2383/4509/4060 2379/4510/4061
+f 2379/4510/4061 2383/4509/4060 9255/2683/1195 9254/2677/1196
+f 2378/4507/4058 9245/4487/4038 9244/4496/4047 2383/4509/4060
+f 2383/4509/4060 9244/4496/4047 13001/2664/1182 9255/2683/1195
+f 2376/4497/4048 2379/4510/4061 2384/4511/4062 2380/4498/4049
+f 2380/4498/4049 2384/4511/4062 9250/4512/4063 9251/4503/4054
+f 2379/4510/4061 9254/2677/1196 9253/2676/1201 2384/4511/4062
+f 2384/4511/4062 9253/2676/1201 13002/2680/1202 9250/4512/4063
+f 2385/4513/4064 2389/4514/4065 2390/4515/4066 2386/4516/4067
+f 2386/4516/4067 2390/4515/4066 9004/4517/4068 9005/4518/4069
+f 2389/4514/4065 9257/4519/4070 9258/4520/4071 2390/4515/4066
+f 2390/4515/4066 9258/4520/4071 12960/4521/4072 9004/4517/4068
+f 2385/4513/4064 2386/4516/4067 2391/4522/4073 2387/4523/4074
+f 2387/4523/4074 2391/4522/4073 9252/4504/4055 9251/4503/4054
+f 2386/4516/4067 9005/4518/4069 9006/4524/4075 2391/4522/4073
+f 2391/4522/4073 9006/4524/4075 12847/4505/4056 9252/4504/4055
+f 2385/4513/4064 2387/4523/4074 2392/4525/4076 2388/4526/4077
+f 2388/4526/4077 2392/4525/4076 9261/3952/3476 9260/3949/3475
+f 2387/4523/4074 9251/4503/4054 9250/4512/4063 2392/4525/4076
+f 2392/4525/4076 9250/4512/4063 13002/2680/1202 9261/3952/3476
+f 2385/4513/4064 2388/4526/4077 2393/4527/4078 2389/4514/4065
+f 2389/4514/4065 2393/4527/4078 9256/4528/4079 9257/4519/4070
+f 2388/4526/4077 9260/3949/3475 9259/3948/3485 2393/4527/4078
+f 2393/4527/4078 9259/3948/3485 13003/2696/1221 9256/4528/4079
+f 2394/4529/4080 2398/4530/4081 2399/4531/4082 2395/4532/4083
+f 2395/4532/4083 2399/4531/4082 8338/4533/4084 8339/4534/4085
+f 2398/4530/4081 9077/4535/4086 9078/4536/4087 2399/4531/4082
+f 2399/4531/4082 9078/4536/4087 12846/4537/4088 8338/4533/4084
+f 2394/4529/4080 2395/4532/4083 2400/4538/4089 2396/4539/4090
+f 2396/4539/4090 2400/4538/4089 9258/4520/4071 9257/4519/4070
+f 2395/4532/4083 8339/4534/4085 8340/4540/4091 2400/4538/4089
+f 2400/4538/4089 8340/4540/4091 12960/4521/4072 9258/4520/4071
+f 2394/4529/4080 2396/4539/4090 2401/4541/4092 2397/4542/4093
+f 2397/4542/4093 2401/4541/4092 9264/2695/2003 9263/2694/1996
+f 2396/4539/4090 9257/4519/4070 9256/4528/4079 2401/4541/4092
+f 2401/4541/4092 9256/4528/4079 13003/2696/1221 9264/2695/2003
+f 2394/4529/4080 2397/4542/4093 2402/4543/4094 2398/4530/4081
+f 2398/4530/4081 2402/4543/4094 9076/4544/4095 9077/4535/4086
+f 2397/4542/4093 9263/2694/1996 9262/2705/1995 2402/4543/4094
+f 2402/4543/4094 9262/2705/1995 12972/2707/1998 9076/4544/4095
+f 2403/4545/4096 2407/4546/4097 2408/4547/4098 2404/4548/4099
+f 2404/4548/4099 2408/4547/4098 9273/1574/1490 9272/1571/1487
+f 2407/4546/4097 8228/4549/4100 8229/4550/4101 2408/4547/4098
+f 2408/4547/4098 8229/4550/4101 13004/1575/1491 9273/1574/1490
+f 2403/4545/4096 2404/4548/4099 2409/4551/4102 2405/4552/4102
+f 2405/4552/4102 2409/4551/4102 9268/4553/451 9269/4554/451
+f 2404/4548/4099 9272/1571/1487 9271/1570/1485 2409/4551/4102
+f 2409/4551/4102 9271/1570/1485 13005/767/451 9268/4553/451
+f 2403/4545/4096 2405/4552/4102 2410/4555/1721 2406/4556/4103
+f 2406/4556/4103 2410/4555/1721 8235/1805/1721 8234/1797/1713
+f 2405/4552/4102 9269/4554/451 9270/4557/451 2410/4555/1721
+f 2410/4555/1721 9270/4557/451 12829/1806/451 8235/1805/1721
+f 2403/4545/4096 2406/4556/4103 2411/4558/4104 2407/4546/4097
+f 2407/4546/4097 2411/4558/4104 8227/4559/4105 8228/4549/4100
+f 2406/4556/4103 8234/1797/1713 8233/1796/1712 2411/4558/4104
+f 2411/4558/4104 8233/1796/1712 12828/1800/1716 8227/4559/4105
+f 2412/4560/4106 2416/4561/4107 2417/4562/4108 2413/4563/4109
+f 2413/4563/4109 2417/4562/4108 9274/4564/4110 9275/4565/4111
+f 2416/4561/4107 9278/761/451 9277/760/451 2417/4562/4108
+f 2417/4562/4108 9277/760/451 13006/763/451 9274/4564/4110
+f 2412/4560/4106 2413/4563/4109 2418/4566/4112 2414/4567/4113
+f 2414/4567/4113 2418/4566/4112 8241/1819/1734 8240/1818/1733
+f 2413/4563/4109 9275/4565/4111 9276/4568/4114 2418/4566/4112
+f 2418/4566/4112 9276/4568/4114 12830/1820/1735 8241/1819/1734
+f 2412/4560/4106 2414/4567/4113 2419/4569/4115 2415/4570/4107
+f 2415/4570/4107 2419/4569/4115 9270/4557/451 9269/4554/451
+f 2414/4567/4113 8240/1818/1733 8239/1827/1742 2419/4569/4115
+f 2419/4569/4115 8239/1827/1742 12829/1806/451 9270/4557/451
+f 2412/4560/4106 2415/4570/4107 2420/4571/451 2416/4561/4107
+f 2416/4561/4107 2420/4571/451 9279/766/451 9278/761/451
+f 2415/4570/4107 9269/4554/451 9268/4553/451 2420/4571/451
+f 2420/4571/451 9268/4553/451 13005/767/451 9279/766/451
+f 2421/4572/4116 2425/4573/4117 2426/4574/4117 2422/4575/4118
+f 2422/4575/4118 2426/4574/4117 8569/4576/4117 8570/4577/4119
+f 2425/4573/4117 9284/2075/451 9283/2074/451 2426/4574/4117
+f 2426/4574/4117 9283/2074/451 13007/2077/451 8569/4576/4117
+f 2421/4572/4116 2422/4575/4118 2427/4578/4120 2423/4579/4121
+f 2423/4579/4121 2427/4578/4120 8331/2090/1997 8330/2085/1992
+f 2422/4575/4118 8570/4577/4119 8571/4580/4122 2427/4578/4120
+f 2427/4578/4120 8571/4580/4122 12885/2091/1998 8331/2090/1997
+f 2421/4572/4116 2423/4579/4121 2428/4581/4123 2424/4582/4124
+f 2424/4582/4124 2428/4581/4123 9276/4568/4114 9275/4565/4111
+f 2423/4579/4121 8330/2085/1992 8329/2084/1991 2428/4581/4123
+f 2428/4581/4123 8329/2084/1991 12830/1820/1735 9276/4568/4114
+f 2421/4572/4116 2424/4582/4124 2429/4583/4125 2425/4573/4117
+f 2425/4573/4117 2429/4583/4125 9285/2079/451 9284/2075/451
+f 2424/4582/4124 9275/4565/4111 9274/4564/4110 2429/4583/4125
+f 2429/4583/4125 9274/4564/4110 13006/763/451 9285/2079/451
+f 2430/4584/4119 2434/4585/4117 2435/4586/4117 2431/4587/4119
+f 2431/4587/4119 2435/4586/4117 9082/4588/4117 9083/4589/4119
+f 2434/4585/4117 9290/2720/451 9289/2719/451 2435/4586/4117
+f 2435/4586/4117 9289/2719/451 13008/2722/451 9082/4588/4117
+f 2430/4584/4119 2431/4587/4119 2436/4590/4122 2432/4591/4122
+f 2432/4591/4122 2436/4590/4122 8562/2706/1998 8561/2703/1998
+f 2431/4587/4119 9083/4589/4119 9084/4592/4122 2436/4590/4122
+f 2436/4590/4122 9084/4592/4122 12972/2707/1998 8562/2706/1998
+f 2430/4584/4119 2432/4591/4122 2437/4593/4122 2433/4594/4119
+f 2433/4594/4119 2437/4593/4122 8571/4580/4122 8570/4577/4119
+f 2432/4591/4122 8561/2703/1998 8560/2702/1998 2437/4593/4122
+f 2437/4593/4122 8560/2702/1998 12885/2091/1998 8571/4580/4122
+f 2430/4584/4119 2433/4594/4119 2438/4595/4117 2434/4585/4117
+f 2434/4585/4117 2438/4595/4117 9291/2725/451 9290/2720/451
+f 2433/4594/4119 8570/4577/4119 8569/4576/4117 2438/4595/4117
+f 2438/4595/4117 8569/4576/4117 13007/2077/451 9291/2725/451
+f 2439/4596/4126 2443/4597/4127 2444/4598/4128 2440/4599/4129
+f 2440/4599/4129 2444/4598/4128 9292/4600/4130 9293/4601/4131
+f 2443/4597/4127 9296/4114/3671 9295/4113/3670 2444/4598/4128
+f 2444/4598/4128 9295/4113/3670 13009/4116/713 9292/4600/4130
+f 2439/4596/4126 2440/4599/4129 2445/4602/4132 2441/4603/4133
+f 2441/4603/4133 2445/4602/4132 9078/4536/4087 9077/4535/4086
+f 2440/4599/4129 9293/4601/4131 9294/4604/4134 2445/4602/4132
+f 2445/4602/4132 9294/4604/4134 12846/4537/4088 9078/4536/4087
+f 2439/4596/4126 2441/4603/4133 2446/4605/4135 2442/4606/4136
+f 2442/4606/4136 2446/4605/4135 9084/4592/4122 9083/4589/4119
+f 2441/4603/4133 9077/4535/4086 9076/4544/4095 2446/4605/4135
+f 2446/4605/4135 9076/4544/4095 12972/2707/1998 9084/4592/4122
+f 2439/4596/4126 2442/4606/4136 2447/4607/4137 2443/4597/4127
+f 2443/4597/4127 2447/4607/4137 9297/4119/3674 9296/4114/3671
+f 2442/4606/4136 9083/4589/4119 9082/4588/4117 2447/4607/4137
+f 2447/4607/4137 9082/4588/4117 13008/2722/451 9297/4119/3674
+f 2448/4608/4138 2452/4609/4139 2453/4610/4140 2449/4611/4141
+f 2449/4611/4141 2453/4610/4140 9013/4612/4142 9014/4613/4143
+f 2452/4609/4139 9302/780/705 9301/779/704 2453/4610/4140
+f 2453/4610/4140 9301/779/704 13010/782/707 9013/4612/4142
+f 2448/4608/4138 2449/4611/4141 2454/4614/4144 2450/4615/4145
+f 2450/4615/4145 2454/4614/4144 8340/4540/4091 8339/4534/4085
+f 2449/4611/4141 9014/4613/4143 9015/4616/4146 2454/4614/4144
+f 2454/4614/4144 9015/4616/4146 12960/4521/4072 8340/4540/4091
+f 2448/4608/4138 2450/4615/4145 2455/4617/4147 2451/4618/4148
+f 2451/4618/4148 2455/4617/4147 9294/4619/4134 9293/4620/4131
+f 2450/4615/4145 8339/4534/4085 8338/4533/4084 2455/4617/4147
+f 2455/4617/4147 8338/4533/4084 12846/4537/4088 9294/4619/4134
+f 2448/4608/4138 2451/4618/4148 2456/4621/4149 2452/4609/4139
+f 2452/4609/4139 2456/4621/4149 9303/787/712 9302/780/705
+f 2451/4618/4148 9293/4620/4131 9292/4622/4130 2456/4621/4149
+f 2456/4621/4149 9292/4622/4130 13009/788/713 9303/787/712
+f 2457/4623/4150 2461/4624/4151 2462/4625/4152 2458/4626/4153
+f 2458/4626/4153 2462/4625/4152 9304/4627/4154 9305/4628/4155
+f 2461/4624/4151 9308/4629/4156 9309/4630/4157 2462/4625/4152
+f 2462/4625/4152 9309/4630/4157 13011/4631/4158 9304/4627/4154
+f 2457/4623/4150 2458/4626/4153 2463/4632/4159 2459/4633/4160
+f 2459/4633/4160 2463/4632/4159 9006/4524/4075 9005/4518/4069
+f 2458/4626/4153 9305/4628/4155 9306/4634/4161 2463/4632/4159
+f 2463/4632/4159 9306/4634/4161 12847/4505/4056 9006/4524/4075
+f 2457/4623/4150 2459/4633/4160 2464/4635/4162 2460/4636/4163
+f 2460/4636/4163 2464/4635/4162 9015/4616/4146 9014/4613/4143
+f 2459/4633/4160 9005/4518/4069 9004/4517/4068 2464/4635/4162
+f 2464/4635/4162 9004/4517/4068 12960/4521/4072 9015/4616/4146
+f 2457/4623/4150 2460/4636/4163 2465/4637/4164 2461/4624/4151
+f 2461/4624/4151 2465/4637/4164 9307/4638/4165 9308/4629/4156
+f 2460/4636/4163 9014/4613/4143 9013/4612/4142 2465/4637/4164
+f 2465/4637/4164 9013/4612/4142 13010/782/707 9307/4638/4165
+f 2466/4639/4166 2470/4640/4167 2471/4641/4168 2467/4642/4169
+f 2467/4642/4169 2471/4641/4168 9310/4643/4170 9311/4644/4171
+f 2470/4640/4167 9314/4645/4172 9315/4646/4173 2471/4641/4168
+f 2471/4641/4168 9315/4646/4173 13012/4647/4174 9310/4643/4170
+f 2466/4639/4166 2467/4642/4169 2472/4648/4175 2468/4649/4176
+f 2468/4649/4176 2472/4648/4175 8352/4508/4059 8351/4502/4053
+f 2467/4642/4169 9311/4644/4171 9312/4650/4177 2472/4648/4175
+f 2472/4648/4175 9312/4650/4177 12849/4489/4040 8352/4508/4059
+f 2466/4639/4166 2468/4649/4176 2473/4651/4178 2469/4652/4179
+f 2469/4652/4179 2473/4651/4178 9306/4634/4161 9305/4628/4155
+f 2468/4649/4176 8351/4502/4053 8350/4501/4052 2473/4651/4178
+f 2473/4651/4178 8350/4501/4052 12847/4505/4056 9306/4634/4161
+f 2466/4639/4166 2469/4652/4179 2474/4653/4180 2470/4640/4167
+f 2470/4640/4167 2474/4653/4180 9313/4654/4181 9314/4645/4172
+f 2469/4652/4179 9305/4628/4155 9304/4627/4154 2474/4653/4180
+f 2474/4653/4180 9304/4627/4154 13011/4631/4158 9313/4654/4181
+f 2475/4655/4182 2479/4656/4183 2480/4657/4184 2476/4658/4185
+f 2476/4658/4185 2480/4657/4184 9316/4659/4186 9317/4660/4187
+f 2479/4656/4183 9320/4661/4188 9321/4662/4189 2480/4657/4184
+f 2480/4657/4184 9321/4662/4189 13013/4663/4190 9316/4659/4186
+f 2475/4655/4182 2476/4658/4185 2481/4664/4191 2477/4665/4192
+f 2477/4665/4192 2481/4664/4191 8364/4492/4043 8363/4486/4037
+f 2476/4658/4185 9317/4660/4187 9318/4666/4193 2481/4664/4191
+f 2481/4664/4191 9318/4666/4193 12851/4473/4024 8364/4492/4043
+f 2475/4655/4182 2477/4665/4192 2482/4667/4194 2478/4668/4195
+f 2478/4668/4195 2482/4667/4194 9312/4650/4177 9311/4644/4171
+f 2477/4665/4192 8363/4486/4037 8362/4485/4036 2482/4667/4194
+f 2482/4667/4194 8362/4485/4036 12849/4489/4040 9312/4650/4177
+f 2475/4655/4182 2478/4668/4195 2483/4669/4196 2479/4656/4183
+f 2479/4656/4183 2483/4669/4196 9319/4670/4197 9320/4661/4188
+f 2478/4668/4195 9311/4644/4171 9310/4643/4170 2483/4669/4196
+f 2483/4669/4196 9310/4643/4170 13012/4647/4174 9319/4670/4197
+f 2484/4671/4198 2488/4672/4199 2489/4673/4200 2485/4674/4201
+f 2485/4674/4201 2489/4673/4200 9322/4675/4202 9323/4676/4203
+f 2488/4672/4199 9326/4677/4204 9327/4678/4205 2489/4673/4200
+f 2489/4673/4200 9327/4678/4205 13014/4679/4206 9322/4675/4202
+f 2484/4671/4198 2485/4674/4201 2490/4680/4207 2486/4681/4208
+f 2486/4681/4208 2490/4680/4207 8376/4476/4027 8375/4470/4021
+f 2485/4674/4201 9323/4676/4203 9324/4682/4209 2490/4680/4207
+f 2490/4680/4207 9324/4682/4209 12853/4457/4008 8376/4476/4027
+f 2484/4671/4198 2486/4681/4208 2491/4683/4210 2487/4684/4211
+f 2487/4684/4211 2491/4683/4210 9318/4666/4193 9317/4660/4187
+f 2486/4681/4208 8375/4470/4021 8374/4469/4020 2491/4683/4210
+f 2491/4683/4210 8374/4469/4020 12851/4473/4024 9318/4666/4193
+f 2484/4671/4198 2487/4684/4211 2492/4685/4212 2488/4672/4199
+f 2488/4672/4199 2492/4685/4212 9325/4686/4213 9326/4677/4204
+f 2487/4684/4211 9317/4660/4187 9316/4659/4186 2492/4685/4212
+f 2492/4685/4212 9316/4659/4186 13013/4663/4190 9325/4686/4213
+f 2493/4687/4214 2497/4688/4215 2498/4689/4216 2494/4690/4217
+f 2494/4690/4217 2498/4689/4216 9328/4691/4218 9329/4692/4219
+f 2497/4688/4215 9332/4693/4220 9333/4694/4221 2498/4689/4216
+f 2498/4689/4216 9333/4694/4221 13015/4695/4222 9328/4691/4218
+f 2493/4687/4214 2494/4690/4217 2499/4696/4223 2495/4697/4224
+f 2495/4697/4224 2499/4696/4223 8388/4460/4011 8387/4454/4005
+f 2494/4690/4217 9329/4692/4219 9330/4698/4225 2499/4696/4223
+f 2499/4696/4223 9330/4698/4225 12855/4441/3992 8388/4460/4011
+f 2493/4687/4214 2495/4697/4224 2500/4699/4226 2496/4700/4227
+f 2496/4700/4227 2500/4699/4226 9324/4682/4209 9323/4676/4203
+f 2495/4697/4224 8387/4454/4005 8386/4453/4004 2500/4699/4226
+f 2500/4699/4226 8386/4453/4004 12853/4457/4008 9324/4682/4209
+f 2493/4687/4214 2496/4700/4227 2501/4701/4228 2497/4688/4215
+f 2497/4688/4215 2501/4701/4228 9331/4702/4229 9332/4693/4220
+f 2496/4700/4227 9323/4676/4203 9322/4675/4202 2501/4701/4228
+f 2501/4701/4228 9322/4675/4202 13014/4679/4206 9331/4702/4229
+f 2502/4703/4230 2506/4704/4231 2507/4705/4232 2503/4706/4233
+f 2503/4706/4233 2507/4705/4232 9334/4707/4234 9335/4708/4235
+f 2506/4704/4231 9338/4709/4236 9339/4710/4237 2507/4705/4232
+f 2507/4705/4232 9339/4710/4237 13016/4711/4238 9334/4707/4234
+f 2502/4703/4230 2503/4706/4233 2508/4712/4239 2504/4713/4240
+f 2504/4713/4240 2508/4712/4239 8400/4444/3995 8399/4438/3989
+f 2503/4706/4233 9335/4708/4235 9336/4714/4241 2508/4712/4239
+f 2508/4712/4239 9336/4714/4241 12857/4425/3976 8400/4444/3995
+f 2502/4703/4230 2504/4713/4240 2509/4715/4242 2505/4716/4243
+f 2505/4716/4243 2509/4715/4242 9330/4698/4225 9329/4692/4219
+f 2504/4713/4240 8399/4438/3989 8398/4437/3988 2509/4715/4242
+f 2509/4715/4242 8398/4437/3988 12855/4441/3992 9330/4698/4225
+f 2502/4703/4230 2505/4716/4243 2510/4717/4244 2506/4704/4231
+f 2506/4704/4231 2510/4717/4244 9337/4718/4245 9338/4709/4236
+f 2505/4716/4243 9329/4692/4219 9328/4691/4218 2510/4717/4244
+f 2510/4717/4244 9328/4691/4218 13015/4695/4222 9337/4718/4245
+f 2511/4719/4246 2515/4720/4247 2516/4721/4248 2512/4722/4249
+f 2512/4722/4249 2516/4721/4248 9340/4723/4250 9341/4724/4251
+f 2515/4720/4247 9344/4725/4252 9345/4726/4253 2516/4721/4248
+f 2516/4721/4248 9345/4726/4253 13017/4727/4254 9340/4723/4250
+f 2511/4719/4246 2512/4722/4249 2517/4728/4255 2513/4729/4256
+f 2513/4729/4256 2517/4728/4255 8412/4428/3979 8411/4422/3973
+f 2512/4722/4249 9341/4724/4251 9342/4730/4257 2517/4728/4255
+f 2517/4728/4255 9342/4730/4257 12859/4409/3960 8412/4428/3979
+f 2511/4719/4246 2513/4729/4256 2518/4731/4258 2514/4732/4259
+f 2514/4732/4259 2518/4731/4258 9336/4714/4241 9335/4708/4235
+f 2513/4729/4256 8411/4422/3973 8410/4421/3972 2518/4731/4258
+f 2518/4731/4258 8410/4421/3972 12857/4425/3976 9336/4714/4241
+f 2511/4719/4246 2514/4732/4259 2519/4733/4260 2515/4720/4247
+f 2515/4720/4247 2519/4733/4260 9343/4734/4261 9344/4725/4252
+f 2514/4732/4259 9335/4708/4235 9334/4707/4234 2519/4733/4260
+f 2519/4733/4260 9334/4707/4234 13016/4711/4238 9343/4734/4261
+f 2520/4735/4262 2524/4736/4263 2525/4737/4264 2521/4738/4265
+f 2521/4738/4265 2525/4737/4264 9346/4739/4266 9347/4740/4267
+f 2524/4736/4263 9350/4741/4268 9351/4742/4269 2525/4737/4264
+f 2525/4737/4264 9351/4742/4269 13018/4743/4270 9346/4739/4266
+f 2520/4735/4262 2521/4738/4265 2526/4744/4271 2522/4745/4272
+f 2522/4745/4272 2526/4744/4271 8424/4412/3963 8423/4406/3957
+f 2521/4738/4265 9347/4740/4267 9348/4746/4273 2526/4744/4271
+f 2526/4744/4271 9348/4746/4273 12861/4393/3944 8424/4412/3963
+f 2520/4735/4262 2522/4745/4272 2527/4747/4274 2523/4748/4275
+f 2523/4748/4275 2527/4747/4274 9342/4730/4257 9341/4724/4251
+f 2522/4745/4272 8423/4406/3957 8422/4405/3956 2527/4747/4274
+f 2527/4747/4274 8422/4405/3956 12859/4409/3960 9342/4730/4257
+f 2520/4735/4262 2523/4748/4275 2528/4749/4276 2524/4736/4263
+f 2524/4736/4263 2528/4749/4276 9349/4750/4277 9350/4741/4268
+f 2523/4748/4275 9341/4724/4251 9340/4723/4250 2528/4749/4276
+f 2528/4749/4276 9340/4723/4250 13017/4727/4254 9349/4750/4277
+f 2529/4751/4278 2533/4752/4279 2534/4753/4280 2530/4754/4281
+f 2530/4754/4281 2534/4753/4280 9352/4755/4282 9353/4756/4283
+f 2533/4752/4279 9356/4757/4284 9357/4758/4285 2534/4753/4280
+f 2534/4753/4280 9357/4758/4285 13019/4759/4286 9352/4755/4282
+f 2529/4751/4278 2530/4754/4281 2535/4760/4287 2531/4761/4288
+f 2531/4761/4288 2535/4760/4287 8436/4396/3947 8435/4390/3941
+f 2530/4754/4281 9353/4756/4283 9354/4762/4289 2535/4760/4287
+f 2535/4760/4287 9354/4762/4289 12863/4377/3928 8436/4396/3947
+f 2529/4751/4278 2531/4761/4288 2536/4763/4290 2532/4764/4291
+f 2532/4764/4291 2536/4763/4290 9348/4746/4273 9347/4740/4267
+f 2531/4761/4288 8435/4390/3941 8434/4389/3940 2536/4763/4290
+f 2536/4763/4290 8434/4389/3940 12861/4393/3944 9348/4746/4273
+f 2529/4751/4278 2532/4764/4291 2537/4765/4292 2533/4752/4279
+f 2533/4752/4279 2537/4765/4292 9355/4766/4293 9356/4757/4284
+f 2532/4764/4291 9347/4740/4267 9346/4739/4266 2537/4765/4292
+f 2537/4765/4292 9346/4739/4266 13018/4743/4270 9355/4766/4293
+f 2538/4767/4294 2542/4768/4295 2543/4769/4296 2539/4770/4297
+f 2539/4770/4297 2543/4769/4296 9358/4771/4298 9359/4772/4299
+f 2542/4768/4295 9362/4773/4300 9363/4774/4301 2543/4769/4296
+f 2543/4769/4296 9363/4774/4301 13020/4775/4302 9358/4771/4298
+f 2538/4767/4294 2539/4770/4297 2544/4776/4303 2540/4777/4304
+f 2540/4777/4304 2544/4776/4303 8448/4380/3931 8447/4374/3925
+f 2539/4770/4297 9359/4772/4299 9360/4778/4305 2544/4776/4303
+f 2544/4776/4303 9360/4778/4305 12865/4361/3912 8448/4380/3931
+f 2538/4767/4294 2540/4777/4304 2545/4779/4306 2541/4780/4307
+f 2541/4780/4307 2545/4779/4306 9354/4762/4289 9353/4756/4283
+f 2540/4777/4304 8447/4374/3925 8446/4373/3924 2545/4779/4306
+f 2545/4779/4306 8446/4373/3924 12863/4377/3928 9354/4762/4289
+f 2538/4767/4294 2541/4780/4307 2546/4781/4308 2542/4768/4295
+f 2542/4768/4295 2546/4781/4308 9361/4782/4309 9362/4773/4300
+f 2541/4780/4307 9353/4756/4283 9352/4755/4282 2546/4781/4308
+f 2546/4781/4308 9352/4755/4282 13019/4759/4286 9361/4782/4309
+f 2547/4783/4310 2551/4784/4311 2552/4785/4312 2548/4786/4313
+f 2548/4786/4313 2552/4785/4312 9364/4787/4314 9365/4788/4315
+f 2551/4784/4311 9368/4789/4316 9369/4790/4317 2552/4785/4312
+f 2552/4785/4312 9369/4790/4317 13021/4791/4318 9364/4787/4314
+f 2547/4783/4310 2548/4786/4313 2553/4792/4319 2549/4793/4320
+f 2549/4793/4320 2553/4792/4319 8460/4364/3915 8459/4358/3909
+f 2548/4786/4313 9365/4788/4315 9366/4794/4321 2553/4792/4319
+f 2553/4792/4319 9366/4794/4321 12867/4345/3896 8460/4364/3915
+f 2547/4783/4310 2549/4793/4320 2554/4795/4322 2550/4796/4323
+f 2550/4796/4323 2554/4795/4322 9360/4778/4305 9359/4772/4299
+f 2549/4793/4320 8459/4358/3909 8458/4357/3908 2554/4795/4322
+f 2554/4795/4322 8458/4357/3908 12865/4361/3912 9360/4778/4305
+f 2547/4783/4310 2550/4796/4323 2555/4797/4324 2551/4784/4311
+f 2551/4784/4311 2555/4797/4324 9367/4798/4325 9368/4789/4316
+f 2550/4796/4323 9359/4772/4299 9358/4771/4298 2555/4797/4324
+f 2555/4797/4324 9358/4771/4298 13020/4775/4302 9367/4798/4325
+f 2556/4799/4326 2560/4800/4327 2561/4801/4328 2557/4802/4329
+f 2557/4802/4329 2561/4801/4328 9370/4803/4330 9371/4804/4331
+f 2560/4800/4327 9374/4805/4332 9375/4806/4333 2561/4801/4328
+f 2561/4801/4328 9375/4806/4333 13022/4807/4334 9370/4803/4330
+f 2556/4799/4326 2557/4802/4329 2562/4808/4335 2558/4809/4336
+f 2558/4809/4336 2562/4808/4335 8472/4348/3899 8471/4342/3893
+f 2557/4802/4329 9371/4804/4331 9372/4810/4337 2562/4808/4335
+f 2562/4808/4335 9372/4810/4337 12869/4325/3876 8472/4348/3899
+f 2556/4799/4326 2558/4809/4336 2563/4811/4338 2559/4812/4339
+f 2559/4812/4339 2563/4811/4338 9366/4794/4321 9365/4788/4315
+f 2558/4809/4336 8471/4342/3893 8470/4341/3892 2563/4811/4338
+f 2563/4811/4338 8470/4341/3892 12867/4345/3896 9366/4794/4321
+f 2556/4799/4326 2559/4812/4339 2564/4813/4340 2560/4800/4327
+f 2560/4800/4327 2564/4813/4340 9373/4814/4341 9374/4805/4332
+f 2559/4812/4339 9365/4788/4315 9364/4787/4314 2564/4813/4340
+f 2564/4813/4340 9364/4787/4314 13021/4791/4318 9373/4814/4341
+f 2565/4815/4342 2569/4816/4343 2570/4817/4344 2566/4818/4345
+f 2566/4818/4345 2570/4817/4344 9376/4819/4346 9377/4820/4347
+f 2569/4816/4343 9380/4821/4348 9381/4822/4349 2570/4817/4344
+f 2570/4817/4344 9381/4822/4349 13023/4823/4350 9376/4819/4346
+f 2565/4815/4342 2566/4818/4345 2571/4824/4351 2567/4825/4352
+f 2567/4825/4352 2571/4824/4351 8484/4330/3881 8483/4322/3873
+f 2566/4818/4345 9377/4820/4347 9378/4826/4353 2571/4824/4351
+f 2571/4824/4351 9378/4826/4353 12871/4331/3882 8484/4330/3881
+f 2565/4815/4342 2567/4825/4352 2572/4827/4354 2568/4828/4355
+f 2568/4828/4355 2572/4827/4354 9372/4810/4337 9371/4804/4331
+f 2567/4825/4352 8483/4322/3873 8482/4321/3872 2572/4827/4354
+f 2572/4827/4354 8482/4321/3872 12869/4325/3876 9372/4810/4337
+f 2565/4815/4342 2568/4828/4355 2573/4829/4356 2569/4816/4343
+f 2569/4816/4343 2573/4829/4356 9379/4830/4357 9380/4821/4348
+f 2568/4828/4355 9371/4804/4331 9370/4803/4330 2573/4829/4356
+f 2573/4829/4356 9370/4803/4330 13022/4807/4334 9379/4830/4357
+f 2574/4831/4358 2578/4832/4359 2579/4833/4360 2575/4834/4361
+f 2575/4834/4361 2579/4833/4360 9385/4835/4362 9386/4836/4363
+f 2578/4832/4359 8345/4837/2668 8344/4838/2684 2579/4833/4360
+f 2579/4833/4360 8344/4838/2684 12848/4839/2686 9385/4835/4362
+f 2574/4831/4358 2575/4834/4361 2580/4840/4364 2576/4841/4365
+f 2576/4841/4365 2580/4840/4364 9610/4842/1195 9611/4843/1196
+f 2575/4834/4361 9386/4836/4363 9387/4844/4366 2580/4840/4364
+f 2580/4840/4364 9387/4844/4366 13056/4845/1182 9610/4842/1195
+f 2574/4831/4358 2576/4841/4365 2581/4846/4367 2577/4847/4368
+f 2577/4847/4368 2581/4846/4367 9382/4848/4369 9383/4849/4370
+f 2576/4841/4365 9611/4843/1196 9612/4850/1201 2581/4846/4367
+f 2581/4846/4367 9612/4850/1201 13055/4851/1202 9382/4848/4369
+f 2574/4831/4358 2577/4847/4368 2582/4852/4371 2578/4832/4359
+f 2578/4832/4359 2582/4852/4371 8346/4853/2669 8345/4837/2668
+f 2577/4847/4368 9383/4849/4370 9384/4854/4372 2582/4852/4371
+f 2582/4852/4371 9384/4854/4372 12845/4855/2670 8346/4853/2669
+f 2583/4856/4373 2587/4857/4374 2588/4858/4375 2584/4859/4376
+f 2584/4859/4376 2588/4858/4375 9391/4860/4377 9392/4861/4378
+f 2587/4857/4374 9314/4862/4172 9313/4863/4181 2588/4858/4375
+f 2588/4858/4375 9313/4863/4181 13011/4864/4158 9391/4860/4377
+f 2583/4856/4373 2584/4859/4376 2589/4865/4379 2585/4866/4380
+f 2585/4866/4380 2589/4865/4379 9748/4867/243 9749/4868/230
+f 2584/4859/4376 9392/4861/4378 9393/4869/4381 2589/4865/4379
+f 2589/4865/4379 9393/4869/4381 13052/4870/245 9748/4867/243
+f 2583/4856/4373 2585/4866/4380 2590/4871/4382 2586/4872/4383
+f 2586/4872/4383 2590/4871/4382 9397/4873/4384 9398/4874/4385
+f 2585/4866/4380 9749/4868/230 9750/4875/231 2590/4871/4382
+f 2590/4871/4382 9750/4875/231 13079/4876/225 9397/4873/4384
+f 2583/4856/4373 2586/4872/4383 2591/4877/4386 2587/4857/4374
+f 2587/4857/4374 2591/4877/4386 9315/4878/4173 9314/4862/4172
+f 2586/4872/4383 9398/4874/4385 9399/4879/4387 2591/4877/4386
+f 2591/4877/4386 9399/4879/4387 13012/4880/4174 9315/4878/4173
+f 2592/4881/4388 2596/4882/4389 2597/4883/4390 2593/4884/4391
+f 2593/4884/4391 2597/4883/4390 9406/4885/4392 9407/4886/4393
+f 2596/4882/4389 8357/4887/2707 8356/4888/2720 2597/4883/4390
+f 2597/4883/4390 8356/4888/2720 12850/4889/2722 9406/4885/4392
+f 2592/4881/4388 2593/4884/4391 2598/4890/4394 2594/4891/4395
+f 2594/4891/4395 2598/4890/4394 9616/4892/1175 9617/4893/1176
+f 2593/4884/4391 9407/4886/4393 9408/4894/4396 2598/4890/4394
+f 2598/4890/4394 9408/4894/4396 13057/4895/1162 9616/4892/1175
+f 2592/4881/4388 2594/4891/4395 2599/4896/4397 2595/4897/4398
+f 2595/4897/4398 2599/4896/4397 9387/4844/4366 9386/4836/4363
+f 2594/4891/4395 9617/4893/1176 9618/4898/1181 2599/4896/4397
+f 2599/4896/4397 9618/4898/1181 13056/4845/1182 9387/4844/4366
+f 2592/4881/4388 2595/4897/4398 2600/4899/4399 2596/4882/4389
+f 2596/4882/4389 2600/4899/4399 8358/4900/2708 8357/4887/2707
+f 2595/4897/4398 9386/4836/4363 9385/4835/4362 2600/4899/4399
+f 2600/4899/4399 9385/4835/4362 12848/4839/2686 8358/4900/2708
+f 2601/4901/4400 2605/4902/4401 2606/4903/4402 2602/4904/4403
+f 2602/4904/4403 2606/4903/4402 9399/4879/4387 9398/4874/4385
+f 2605/4902/4401 9320/4905/4188 9319/4906/4197 2606/4903/4402
+f 2606/4903/4402 9319/4906/4197 13012/4880/4174 9399/4879/4387
+f 2601/4901/4400 2602/4904/4403 2607/4907/4404 2603/4908/4405
+f 2603/4908/4405 2607/4907/4404 9745/4909/223 9746/4910/210
+f 2602/4904/4403 9398/4874/4385 9397/4873/4384 2607/4907/4404
+f 2607/4907/4404 9397/4873/4384 13079/4876/225 9745/4909/223
+f 2601/4901/4400 2603/4908/4405 2608/4911/4406 2604/4912/4407
+f 2604/4912/4407 2608/4911/4406 9412/4913/4408 9413/4914/4409
+f 2603/4908/4405 9746/4910/210 9747/4915/211 2608/4911/4406
+f 2608/4911/4406 9747/4915/211 13078/4916/205 9412/4913/4408
+f 2601/4901/4400 2604/4912/4407 2609/4917/4410 2605/4902/4401
+f 2605/4902/4401 2609/4917/4410 9321/4918/4189 9320/4905/4188
+f 2604/4912/4407 9413/4914/4409 9414/4919/4411 2609/4917/4410
+f 2609/4917/4410 9414/4919/4411 13013/4920/4190 9321/4918/4189
+f 2610/4921/4412 2614/4922/4413 2615/4923/4414 2611/4924/4415
+f 2611/4924/4415 2615/4923/4414 9421/4925/4416 9422/4926/4417
+f 2614/4922/4413 8369/4927/2743 8368/4928/2756 2615/4923/4414
+f 2615/4923/4414 8368/4928/2756 12852/4929/2758 9421/4925/4416
+f 2610/4921/4412 2611/4924/4415 2616/4930/4418 2612/4931/4419
+f 2612/4931/4419 2616/4930/4418 9622/4932/1155 9623/4933/1156
+f 2611/4924/4415 9422/4926/4417 9423/4934/4420 2616/4930/4418
+f 2616/4930/4418 9423/4934/4420 13058/4935/1142 9622/4932/1155
+f 2610/4921/4412 2612/4931/4419 2617/4936/4421 2613/4937/4422
+f 2613/4937/4422 2617/4936/4421 9408/4894/4396 9407/4886/4393
+f 2612/4931/4419 9623/4933/1156 9624/4938/1161 2617/4936/4421
+f 2617/4936/4421 9624/4938/1161 13057/4895/1162 9408/4894/4396
+f 2610/4921/4412 2613/4937/4422 2618/4939/4423 2614/4922/4413
+f 2614/4922/4413 2618/4939/4423 8370/4940/2744 8369/4927/2743
+f 2613/4937/4422 9407/4886/4393 9406/4885/4392 2618/4939/4423
+f 2618/4939/4423 9406/4885/4392 12850/4889/2722 8370/4940/2744
+f 2619/4941/4424 2623/4942/4425 2624/4943/4426 2620/4944/4427
+f 2620/4944/4427 2624/4943/4426 9414/4919/4411 9413/4914/4409
+f 2623/4942/4425 9326/4945/4204 9325/4946/4213 2624/4943/4426
+f 2624/4943/4426 9325/4946/4213 13013/4920/4190 9414/4919/4411
+f 2619/4941/4424 2620/4944/4427 2625/4947/4428 2621/4948/4429
+f 2621/4948/4429 2625/4947/4428 9739/4949/203 9740/4950/190
+f 2620/4944/4427 9413/4914/4409 9412/4913/4408 2625/4947/4428
+f 2625/4947/4428 9412/4913/4408 13078/4916/205 9739/4949/203
+f 2619/4941/4424 2621/4948/4429 2626/4951/4430 2622/4952/4431
+f 2622/4952/4431 2626/4951/4430 9427/4953/4432 9428/4954/4433
+f 2621/4948/4429 9740/4950/190 9741/4955/191 2626/4951/4430
+f 2626/4951/4430 9741/4955/191 13077/4956/185 9427/4953/4432
+f 2619/4941/4424 2622/4952/4431 2627/4957/4434 2623/4942/4425
+f 2623/4942/4425 2627/4957/4434 9327/4958/4205 9326/4945/4204
+f 2622/4952/4431 9428/4954/4433 9429/4959/4435 2627/4957/4434
+f 2627/4957/4434 9429/4959/4435 13014/4960/4206 9327/4958/4205
+f 2628/4961/4436 2632/4962/4437 2633/4963/4438 2629/4964/4439
+f 2629/4964/4439 2633/4963/4438 9436/4965/4440 9437/4966/4441
+f 2632/4962/4437 8381/4967/2779 8380/4968/2792 2633/4963/4438
+f 2633/4963/4438 8380/4968/2792 12854/4969/2794 9436/4965/4440
+f 2628/4961/4436 2629/4964/4439 2634/4970/4442 2630/4971/4443
+f 2630/4971/4443 2634/4970/4442 9628/4972/1135 9629/4973/1136
+f 2629/4964/4439 9437/4966/4441 9438/4974/4444 2634/4970/4442
+f 2634/4970/4442 9438/4974/4444 13059/4975/1122 9628/4972/1135
+f 2628/4961/4436 2630/4971/4443 2635/4976/4445 2631/4977/4446
+f 2631/4977/4446 2635/4976/4445 9423/4934/4420 9422/4926/4417
+f 2630/4971/4443 9629/4973/1136 9630/4978/1141 2635/4976/4445
+f 2635/4976/4445 9630/4978/1141 13058/4935/1142 9423/4934/4420
+f 2628/4961/4436 2631/4977/4446 2636/4979/4447 2632/4962/4437
+f 2632/4962/4437 2636/4979/4447 8382/4980/2780 8381/4967/2779
+f 2631/4977/4446 9422/4926/4417 9421/4925/4416 2636/4979/4447
+f 2636/4979/4447 9421/4925/4416 12852/4929/2758 8382/4980/2780
+f 2637/4981/4448 2641/4982/4449 2642/4983/4450 2638/4984/4451
+f 2638/4984/4451 2642/4983/4450 9429/4959/4435 9428/4954/4433
+f 2641/4982/4449 9332/4985/4220 9331/4986/4229 2642/4983/4450
+f 2642/4983/4450 9331/4986/4229 13014/4960/4206 9429/4959/4435
+f 2637/4981/4448 2638/4984/4451 2643/4987/4452 2639/4988/4453
+f 2639/4988/4453 2643/4987/4452 9733/4989/183 9734/4990/170
+f 2638/4984/4451 9428/4954/4433 9427/4953/4432 2643/4987/4452
+f 2643/4987/4452 9427/4953/4432 13077/4956/185 9733/4989/183
+f 2637/4981/4448 2639/4988/4453 2644/4991/4454 2640/4992/4455
+f 2640/4992/4455 2644/4991/4454 9442/4993/4456 9443/4994/4457
+f 2639/4988/4453 9734/4990/170 9735/4995/171 2644/4991/4454
+f 2644/4991/4454 9735/4995/171 13076/4996/165 9442/4993/4456
+f 2637/4981/4448 2640/4992/4455 2645/4997/4458 2641/4982/4449
+f 2641/4982/4449 2645/4997/4458 9333/4998/4221 9332/4985/4220
+f 2640/4992/4455 9443/4994/4457 9444/4999/4459 2645/4997/4458
+f 2645/4997/4458 9444/4999/4459 13015/5000/4222 9333/4998/4221
+f 2646/5001/4460 2650/5002/4461 2651/5003/4462 2647/5004/4463
+f 2647/5004/4463 2651/5003/4462 9451/5005/4464 9452/5006/4465
+f 2650/5002/4461 8393/5007/2815 8392/5008/2828 2651/5003/4462
+f 2651/5003/4462 8392/5008/2828 12856/5009/2830 9451/5005/4464
+f 2646/5001/4460 2647/5004/4463 2652/5010/4466 2648/5011/4467
+f 2648/5011/4467 2652/5010/4466 9634/5012/1115 9635/5013/1116
+f 2647/5004/4463 9452/5006/4465 9453/5014/4468 2652/5010/4466
+f 2652/5010/4466 9453/5014/4468 13060/5015/1102 9634/5012/1115
+f 2646/5001/4460 2648/5011/4467 2653/5016/4469 2649/5017/4470
+f 2649/5017/4470 2653/5016/4469 9438/4974/4444 9437/4966/4441
+f 2648/5011/4467 9635/5013/1116 9636/5018/1121 2653/5016/4469
+f 2653/5016/4469 9636/5018/1121 13059/4975/1122 9438/4974/4444
+f 2646/5001/4460 2649/5017/4470 2654/5019/4471 2650/5002/4461
+f 2650/5002/4461 2654/5019/4471 8394/5020/2816 8393/5007/2815
+f 2649/5017/4470 9437/4966/4441 9436/4965/4440 2654/5019/4471
+f 2654/5019/4471 9436/4965/4440 12854/4969/2794 8394/5020/2816
+f 2655/5021/4472 2659/5022/4473 2660/5023/4474 2656/5024/4475
+f 2656/5024/4475 2660/5023/4474 9444/4999/4459 9443/4994/4457
+f 2659/5022/4473 9338/5025/4236 9337/5026/4245 2660/5023/4474
+f 2660/5023/4474 9337/5026/4245 13015/5000/4222 9444/4999/4459
+f 2655/5021/4472 2656/5024/4475 2661/5027/4476 2657/5028/4477
+f 2657/5028/4477 2661/5027/4476 9727/5029/163 9728/5030/150
+f 2656/5024/4475 9443/4994/4457 9442/4993/4456 2661/5027/4476
+f 2661/5027/4476 9442/4993/4456 13076/4996/165 9727/5029/163
+f 2655/5021/4472 2657/5028/4477 2662/5031/4478 2658/5032/4479
+f 2658/5032/4479 2662/5031/4478 9457/5033/4480 9458/5034/4481
+f 2657/5028/4477 9728/5030/150 9729/5035/151 2662/5031/4478
+f 2662/5031/4478 9729/5035/151 13075/5036/145 9457/5033/4480
+f 2655/5021/4472 2658/5032/4479 2663/5037/4482 2659/5022/4473
+f 2659/5022/4473 2663/5037/4482 9339/5038/4237 9338/5025/4236
+f 2658/5032/4479 9458/5034/4481 9459/5039/4483 2663/5037/4482
+f 2663/5037/4482 9459/5039/4483 13016/5040/4238 9339/5038/4237
+f 2664/5041/4484 2668/5042/4485 2669/5043/4486 2665/5044/4487
+f 2665/5044/4487 2669/5043/4486 9466/5045/4488 9467/5046/4489
+f 2668/5042/4485 8405/5047/2851 8404/5048/2864 2669/5043/4486
+f 2669/5043/4486 8404/5048/2864 12858/5049/2866 9466/5045/4488
+f 2664/5041/4484 2665/5044/4487 2670/5050/4490 2666/5051/4491
+f 2666/5051/4491 2670/5050/4490 9640/5052/1095 9641/5053/1096
+f 2665/5044/4487 9467/5046/4489 9468/5054/4492 2670/5050/4490
+f 2670/5050/4490 9468/5054/4492 13061/5055/1082 9640/5052/1095
+f 2664/5041/4484 2666/5051/4491 2671/5056/4493 2667/5057/4494
+f 2667/5057/4494 2671/5056/4493 9453/5014/4468 9452/5006/4465
+f 2666/5051/4491 9641/5053/1096 9642/5058/1101 2671/5056/4493
+f 2671/5056/4493 9642/5058/1101 13060/5015/1102 9453/5014/4468
+f 2664/5041/4484 2667/5057/4494 2672/5059/4495 2668/5042/4485
+f 2668/5042/4485 2672/5059/4495 8406/5060/2852 8405/5047/2851
+f 2667/5057/4494 9452/5006/4465 9451/5005/4464 2672/5059/4495
+f 2672/5059/4495 9451/5005/4464 12856/5009/2830 8406/5060/2852
+f 2673/5061/4496 2677/5062/4497 2678/5063/4498 2674/5064/4499
+f 2674/5064/4499 2678/5063/4498 9459/5039/4483 9458/5034/4481
+f 2677/5062/4497 9344/5065/4252 9343/5066/4261 2678/5063/4498
+f 2678/5063/4498 9343/5066/4261 13016/5040/4238 9459/5039/4483
+f 2673/5061/4496 2674/5064/4499 2679/5067/4500 2675/5068/4501
+f 2675/5068/4501 2679/5067/4500 9721/5069/143 9722/5070/130
+f 2674/5064/4499 9458/5034/4481 9457/5033/4480 2679/5067/4500
+f 2679/5067/4500 9457/5033/4480 13075/5036/145 9721/5069/143
+f 2673/5061/4496 2675/5068/4501 2680/5071/4502 2676/5072/4503
+f 2676/5072/4503 2680/5071/4502 9472/5073/4504 9473/5074/4505
+f 2675/5068/4501 9722/5070/130 9723/5075/131 2680/5071/4502
+f 2680/5071/4502 9723/5075/131 13074/5076/125 9472/5073/4504
+f 2673/5061/4496 2676/5072/4503 2681/5077/4506 2677/5062/4497
+f 2677/5062/4497 2681/5077/4506 9345/5078/4253 9344/5065/4252
+f 2676/5072/4503 9473/5074/4505 9474/5079/4507 2681/5077/4506
+f 2681/5077/4506 9474/5079/4507 13017/5080/4254 9345/5078/4253
+f 2682/5081/4508 2686/5082/4509 2687/5083/4510 2683/5084/4511
+f 2683/5084/4511 2687/5083/4510 9481/5085/4512 9482/5086/4513
+f 2686/5082/4509 8417/5087/2887 8416/5088/2900 2687/5083/4510
+f 2687/5083/4510 8416/5088/2900 12860/5089/2902 9481/5085/4512
+f 2682/5081/4508 2683/5084/4511 2688/5090/4514 2684/5091/4515
+f 2684/5091/4515 2688/5090/4514 9646/5092/1075 9647/5093/1076
+f 2683/5084/4511 9482/5086/4513 9483/5094/4516 2688/5090/4514
+f 2688/5090/4514 9483/5094/4516 13062/5095/1062 9646/5092/1075
+f 2682/5081/4508 2684/5091/4515 2689/5096/4517 2685/5097/4518
+f 2685/5097/4518 2689/5096/4517 9468/5054/4492 9467/5046/4489
+f 2684/5091/4515 9647/5093/1076 9648/5098/1081 2689/5096/4517
+f 2689/5096/4517 9648/5098/1081 13061/5055/1082 9468/5054/4492
+f 2682/5081/4508 2685/5097/4518 2690/5099/4519 2686/5082/4509
+f 2686/5082/4509 2690/5099/4519 8418/5100/2888 8417/5087/2887
+f 2685/5097/4518 9467/5046/4489 9466/5045/4488 2690/5099/4519
+f 2690/5099/4519 9466/5045/4488 12858/5049/2866 8418/5100/2888
+f 2691/5101/4520 2695/5102/4521 2696/5103/4522 2692/5104/4523
+f 2692/5104/4523 2696/5103/4522 9474/5079/4507 9473/5074/4505
+f 2695/5102/4521 9350/5105/4268 9349/5106/4277 2696/5103/4522
+f 2696/5103/4522 9349/5106/4277 13017/5080/4254 9474/5079/4507
+f 2691/5101/4520 2692/5104/4523 2697/5107/4524 2693/5108/4525
+f 2693/5108/4525 2697/5107/4524 9715/5109/123 9716/5110/110
+f 2692/5104/4523 9473/5074/4505 9472/5073/4504 2697/5107/4524
+f 2697/5107/4524 9472/5073/4504 13074/5076/125 9715/5109/123
+f 2691/5101/4520 2693/5108/4525 2698/5111/4526 2694/5112/4527
+f 2694/5112/4527 2698/5111/4526 9487/5113/4528 9488/5114/4529
+f 2693/5108/4525 9716/5110/110 9717/5115/111 2698/5111/4526
+f 2698/5111/4526 9717/5115/111 13073/5116/105 9487/5113/4528
+f 2691/5101/4520 2694/5112/4527 2699/5117/4530 2695/5102/4521
+f 2695/5102/4521 2699/5117/4530 9351/5118/4269 9350/5105/4268
+f 2694/5112/4527 9488/5114/4529 9489/5119/4531 2699/5117/4530
+f 2699/5117/4530 9489/5119/4531 13018/5120/4270 9351/5118/4269
+f 2700/5121/4532 2704/5122/4533 2705/5123/4534 2701/5124/4535
+f 2701/5124/4535 2705/5123/4534 9496/5125/4536 9497/5126/4537
+f 2704/5122/4533 8429/5127/2923 8428/5128/2936 2705/5123/4534
+f 2705/5123/4534 8428/5128/2936 12862/5129/2938 9496/5125/4536
+f 2700/5121/4532 2701/5124/4535 2706/5130/4538 2702/5131/4539
+f 2702/5131/4539 2706/5130/4538 9652/5132/1055 9653/5133/1056
+f 2701/5124/4535 9497/5126/4537 9498/5134/4540 2706/5130/4538
+f 2706/5130/4538 9498/5134/4540 13063/5135/451 9652/5132/1055
+f 2700/5121/4532 2702/5131/4539 2707/5136/4541 2703/5137/4542
+f 2703/5137/4542 2707/5136/4541 9483/5094/4516 9482/5086/4513
+f 2702/5131/4539 9653/5133/1056 9654/5138/1061 2707/5136/4541
+f 2707/5136/4541 9654/5138/1061 13062/5095/1062 9483/5094/4516
+f 2700/5121/4532 2703/5137/4542 2708/5139/4543 2704/5122/4533
+f 2704/5122/4533 2708/5139/4543 8430/5140/2924 8429/5127/2923
+f 2703/5137/4542 9482/5086/4513 9481/5085/4512 2708/5139/4543
+f 2708/5139/4543 9481/5085/4512 12860/5089/2902 8430/5140/2924
+f 2709/5141/4544 2713/5142/4545 2714/5143/4546 2710/5144/4547
+f 2710/5144/4547 2714/5143/4546 9489/5119/4531 9488/5114/4529
+f 2713/5142/4545 9356/5145/4284 9355/5146/4293 2714/5143/4546
+f 2714/5143/4546 9355/5146/4293 13018/5120/4270 9489/5119/4531
+f 2709/5141/4544 2710/5144/4547 2715/5147/4548 2711/5148/4549
+f 2711/5148/4549 2715/5147/4548 9709/5149/103 9710/5150/90
+f 2710/5144/4547 9488/5114/4529 9487/5113/4528 2715/5147/4548
+f 2715/5147/4548 9487/5113/4528 13073/5116/105 9709/5149/103
+f 2709/5141/4544 2711/5148/4549 2716/5151/4550 2712/5152/4551
+f 2712/5152/4551 2716/5151/4550 9502/5153/4552 9503/5154/4553
+f 2711/5148/4549 9710/5150/90 9711/5155/91 2716/5151/4550
+f 2716/5151/4550 9711/5155/91 13072/5156/85 9502/5153/4552
+f 2709/5141/4544 2712/5152/4551 2717/5157/4554 2713/5142/4545
+f 2713/5142/4545 2717/5157/4554 9357/5158/4285 9356/5145/4284
+f 2712/5152/4551 9503/5154/4553 9504/5159/4555 2717/5157/4554
+f 2717/5157/4554 9504/5159/4555 13019/5160/4286 9357/5158/4285
+f 2718/5161/4556 2722/5162/4557 2723/5163/4558 2719/5164/4559
+f 2719/5164/4559 2723/5163/4558 9511/5165/4560 9512/5166/4561
+f 2722/5162/4557 8441/5167/2959 8440/5168/2972 2723/5163/4558
+f 2723/5163/4558 8440/5168/2972 12864/5169/2974 9511/5165/4560
+f 2718/5161/4556 2719/5164/4559 2724/5170/4562 2720/5171/4563
+f 2720/5171/4563 2724/5170/4562 9658/5172/1036 9659/5173/1037
+f 2719/5164/4559 9512/5166/4561 9513/5174/4564 2724/5170/4562
+f 2724/5170/4562 9513/5174/4564 13064/5175/1023 9658/5172/1036
+f 2718/5161/4556 2720/5171/4563 2725/5176/4565 2721/5177/4566
+f 2721/5177/4566 2725/5176/4565 9498/5134/4540 9497/5126/4537
+f 2720/5171/4563 9659/5173/1037 9660/5178/1042 2725/5176/4565
+f 2725/5176/4565 9660/5178/1042 13063/5135/451 9498/5134/4540
+f 2718/5161/4556 2721/5177/4566 2726/5179/4567 2722/5162/4557
+f 2722/5162/4557 2726/5179/4567 8442/5180/2960 8441/5167/2959
+f 2721/5177/4566 9497/5126/4537 9496/5125/4536 2726/5179/4567
+f 2726/5179/4567 9496/5125/4536 12862/5129/2938 8442/5180/2960
+f 2727/5181/4568 2731/5182/4569 2732/5183/4570 2728/5184/4571
+f 2728/5184/4571 2732/5183/4570 9504/5159/4555 9503/5154/4553
+f 2731/5182/4569 9362/5185/4300 9361/5186/4309 2732/5183/4570
+f 2732/5183/4570 9361/5186/4309 13019/5160/4286 9504/5159/4555
+f 2727/5181/4568 2728/5184/4571 2733/5187/4572 2729/5188/4573
+f 2729/5188/4573 2733/5187/4572 9703/5189/4574 9704/5190/70
+f 2728/5184/4571 9503/5154/4553 9502/5153/4552 2733/5187/4572
+f 2733/5187/4572 9502/5153/4552 13072/5156/85 9703/5189/4574
+f 2727/5181/4568 2729/5188/4573 2734/5191/4575 2730/5192/4576
+f 2730/5192/4576 2734/5191/4575 9517/5193/4577 9518/5194/4578
+f 2729/5188/4573 9704/5190/70 9705/5195/71 2734/5191/4575
+f 2734/5191/4575 9705/5195/71 13071/5196/65 9517/5193/4577
+f 2727/5181/4568 2730/5192/4576 2735/5197/4579 2731/5182/4569
+f 2731/5182/4569 2735/5197/4579 9363/5198/4301 9362/5185/4300
+f 2730/5192/4576 9518/5194/4578 9519/5199/4580 2735/5197/4579
+f 2735/5197/4579 9519/5199/4580 13020/5200/4302 9363/5198/4301
+f 2736/5201/4581 2740/5202/4582 2741/5203/4583 2737/5204/4584
+f 2737/5204/4584 2741/5203/4583 9526/5205/4585 9527/5206/4586
+f 2740/5202/4582 8453/5207/2995 8452/5208/3008 2741/5203/4583
+f 2741/5203/4583 8452/5208/3008 12866/5209/3010 9526/5205/4585
+f 2736/5201/4581 2737/5204/4584 2742/5210/4587 2738/5211/4588
+f 2738/5211/4588 2742/5210/4587 9664/5212/1016 9665/5213/1017
+f 2737/5204/4584 9527/5206/4586 9528/5214/4589 2742/5210/4587
+f 2742/5210/4587 9528/5214/4589 13065/5215/1003 9664/5212/1016
+f 2736/5201/4581 2738/5211/4588 2743/5216/4590 2739/5217/4591
+f 2739/5217/4591 2743/5216/4590 9513/5174/4564 9512/5166/4561
+f 2738/5211/4588 9665/5213/1017 9666/5218/1022 2743/5216/4590
+f 2743/5216/4590 9666/5218/1022 13064/5175/1023 9513/5174/4564
+f 2736/5201/4581 2739/5217/4591 2744/5219/4592 2740/5202/4582
+f 2740/5202/4582 2744/5219/4592 8454/5220/2996 8453/5207/2995
+f 2739/5217/4591 9512/5166/4561 9511/5165/4560 2744/5219/4592
+f 2744/5219/4592 9511/5165/4560 12864/5169/2974 8454/5220/2996
+f 2745/5221/4593 2749/5222/4594 2750/5223/4595 2746/5224/4596
+f 2746/5224/4596 2750/5223/4595 9519/5199/4580 9518/5194/4578
+f 2749/5222/4594 9368/5225/4316 9367/5226/4325 2750/5223/4595
+f 2750/5223/4595 9367/5226/4325 13020/5200/4302 9519/5199/4580
+f 2745/5221/4593 2746/5224/4596 2751/5227/4597 2747/5228/4598
+f 2747/5228/4598 2751/5227/4597 9697/5229/63 9698/5230/50
+f 2746/5224/4596 9518/5194/4578 9517/5193/4577 2751/5227/4597
+f 2751/5227/4597 9517/5193/4577 13071/5196/65 9697/5229/63
+f 2745/5221/4593 2747/5228/4598 2752/5231/4599 2748/5232/4600
+f 2748/5232/4600 2752/5231/4599 9532/5233/4601 9533/5234/4602
+f 2747/5228/4598 9698/5230/50 9699/5235/51 2752/5231/4599
+f 2752/5231/4599 9699/5235/51 13070/5236/45 9532/5233/4601
+f 2745/5221/4593 2748/5232/4600 2753/5237/4603 2749/5222/4594
+f 2749/5222/4594 2753/5237/4603 9369/5238/4317 9368/5225/4316
+f 2748/5232/4600 9533/5234/4602 9534/5239/4604 2753/5237/4603
+f 2753/5237/4603 9534/5239/4604 13021/5240/4318 9369/5238/4317
+f 2754/5241/4605 2758/5242/4606 2759/5243/4607 2755/5244/4608
+f 2755/5244/4608 2759/5243/4607 9541/5245/4609 9542/5246/4610
+f 2758/5242/4606 8465/5247/3031 8464/5248/3044 2759/5243/4607
+f 2759/5243/4607 8464/5248/3044 12868/5249/3046 9541/5245/4609
+f 2754/5241/4605 2755/5244/4608 2760/5250/4611 2756/5251/4612
+f 2756/5251/4612 2760/5250/4611 9670/5252/996 9671/5253/997
+f 2755/5244/4608 9542/5246/4610 9543/5254/4613 2760/5250/4611
+f 2760/5250/4611 9543/5254/4613 13066/5255/983 9670/5252/996
+f 2754/5241/4605 2756/5251/4612 2761/5256/4614 2757/5257/4615
+f 2757/5257/4615 2761/5256/4614 9528/5214/4589 9527/5206/4586
+f 2756/5251/4612 9671/5253/997 9672/5258/1002 2761/5256/4614
+f 2761/5256/4614 9672/5258/1002 13065/5215/1003 9528/5214/4589
+f 2754/5241/4605 2757/5257/4615 2762/5259/4616 2758/5242/4606
+f 2758/5242/4606 2762/5259/4616 8466/5260/3032 8465/5247/3031
+f 2757/5257/4615 9527/5206/4586 9526/5205/4585 2762/5259/4616
+f 2762/5259/4616 9526/5205/4585 12866/5209/3010 8466/5260/3032
+f 2763/5261/4617 2767/5262/4618 2768/5263/4619 2764/5264/4620
+f 2764/5264/4620 2768/5263/4619 9534/5239/4604 9533/5234/4602
+f 2767/5262/4618 9374/5265/4332 9373/5266/4341 2768/5263/4619
+f 2768/5263/4619 9373/5266/4341 13021/5240/4318 9534/5239/4604
+f 2763/5261/4617 2764/5264/4620 2769/5267/4621 2765/5268/4622
+f 2765/5268/4622 2769/5267/4621 9691/5269/43 9692/5270/30
+f 2764/5264/4620 9533/5234/4602 9532/5233/4601 2769/5267/4621
+f 2769/5267/4621 9532/5233/4601 13070/5236/45 9691/5269/43
+f 2763/5261/4617 2765/5268/4622 2770/5271/4623 2766/5272/4624
+f 2766/5272/4624 2770/5271/4623 9547/5273/4625 9548/5274/4626
+f 2765/5268/4622 9692/5270/30 9693/5275/31 2770/5271/4623
+f 2770/5271/4623 9693/5275/31 13069/5276/25 9547/5273/4625
+f 2763/5261/4617 2766/5272/4624 2771/5277/4627 2767/5262/4618
+f 2767/5262/4618 2771/5277/4627 9375/5278/4333 9374/5265/4332
+f 2766/5272/4624 9548/5274/4626 9549/5279/4628 2771/5277/4627
+f 2771/5277/4627 9549/5279/4628 13022/5280/4334 9375/5278/4333
+f 2772/5281/4629 2776/5282/4630 2777/5283/4631 2773/5284/4632
+f 2773/5284/4632 2777/5283/4631 9556/5285/4633 9557/5286/4634
+f 2776/5282/4630 8477/5287/3067 8476/5288/3080 2777/5283/4631
+f 2777/5283/4631 8476/5288/3080 12870/5289/3082 9556/5285/4633
+f 2772/5281/4629 2773/5284/4632 2778/5290/4635 2774/5291/4636
+f 2774/5291/4636 2778/5290/4635 9676/5292/974 9677/5293/975
+f 2773/5284/4632 9557/5286/4634 9558/5294/4637 2778/5290/4635
+f 2778/5290/4635 9558/5294/4637 13067/5295/977 9676/5292/974
+f 2772/5281/4629 2774/5291/4636 2779/5296/4638 2775/5297/4639
+f 2775/5297/4639 2779/5296/4638 9543/5254/4613 9542/5246/4610
+f 2774/5291/4636 9677/5293/975 9678/5298/982 2779/5296/4638
+f 2779/5296/4638 9678/5298/982 13066/5255/983 9543/5254/4613
+f 2772/5281/4629 2775/5297/4639 2780/5299/4640 2776/5282/4630
+f 2776/5282/4630 2780/5299/4640 8478/5300/3068 8477/5287/3067
+f 2775/5297/4639 9542/5246/4610 9541/5245/4609 2780/5299/4640
+f 2780/5299/4640 9541/5245/4609 12868/5249/3046 8478/5300/3068
+f 2781/5301/4641 2785/5302/4642 2786/5303/4643 2782/5304/4644
+f 2782/5304/4644 2786/5303/4643 9549/5279/4628 9548/5274/4626
+f 2785/5302/4642 9380/5305/4348 9379/5306/4357 2786/5303/4643
+f 2786/5303/4643 9379/5306/4357 13022/5280/4334 9549/5279/4628
+f 2781/5301/4641 2782/5304/4644 2787/5307/4645 2783/5308/4646
+f 2783/5308/4646 2787/5307/4645 9685/5309/23 9686/5310/7
+f 2782/5304/4644 9548/5274/4626 9547/5273/4625 2787/5307/4645
+f 2787/5307/4645 9547/5273/4625 13069/5276/25 9685/5309/23
+f 2781/5301/4641 2783/5308/4646 2788/5311/4647 2784/5312/4648
+f 2784/5312/4648 2788/5311/4647 9562/5313/4649 9563/5314/4650
+f 2783/5308/4646 9686/5310/7 9687/5315/8 2788/5311/4647
+f 2788/5311/4647 9687/5315/8 13068/5316/9 9562/5313/4649
+f 2781/5301/4641 2784/5312/4648 2789/5317/4651 2785/5302/4642
+f 2785/5302/4642 2789/5317/4651 9381/5318/4349 9380/5305/4348
+f 2784/5312/4648 9563/5314/4650 9564/5319/4652 2789/5317/4651
+f 2789/5317/4651 9564/5319/4652 13023/5320/4350 9381/5318/4349
+f 2790/5321/4653 2794/5322/4654 2795/5323/4655 2791/5324/4656
+f 2791/5324/4656 2795/5323/4655 9384/4854/4372 9383/4849/4370
+f 2794/5322/4654 9011/5325/3551 9010/5326/3550 2795/5323/4655
+f 2795/5323/4655 9010/5326/3550 12845/4855/2670 9384/4854/4372
+f 2790/5321/4653 2791/5324/4656 2796/5327/4657 2792/5328/4658
+f 2792/5328/4658 2796/5327/4657 9604/5329/4659 9605/5330/4660
+f 2791/5324/4656 9383/4849/4370 9382/4848/4369 2796/5327/4657
+f 2796/5327/4657 9382/4848/4369 13055/4851/1202 9604/5329/4659
+f 2790/5321/4653 2792/5328/4658 2797/5331/4661 2793/5332/4662
+f 2793/5332/4662 2797/5331/4661 9571/5333/4663 9572/5334/4664
+f 2792/5328/4658 9605/5330/4660 9606/5335/4665 2797/5331/4661
+f 2797/5331/4661 9606/5335/4665 13054/5336/4666 9571/5333/4663
+f 2790/5321/4653 2793/5332/4662 2798/5337/4667 2794/5322/4654
+f 2794/5322/4654 2798/5337/4667 9012/5338/3553 9011/5325/3551
+f 2793/5332/4662 9572/5334/4664 9573/5339/4668 2798/5337/4667
+f 2798/5337/4667 9573/5339/4668 12961/5340/701 9012/5338/3553
+f 2799/5341/4669 2803/5342/4670 2804/5343/4671 2800/5344/4672
+f 2800/5344/4672 2804/5343/4671 9573/5345/4668 9572/5346/4664
+f 2803/5342/4670 9299/5347/698 9298/5348/697 2804/5343/4671
+f 2804/5343/4671 9298/5348/697 12961/5349/701 9573/5345/4668
+f 2799/5341/4669 2800/5344/4672 2805/5350/4673 2801/5351/4674
+f 2801/5351/4674 2805/5350/4673 9598/5352/4675 9599/5353/4676
+f 2800/5344/4672 9572/5346/4664 9571/5354/4663 2805/5350/4673
+f 2805/5350/4673 9571/5354/4663 13054/5355/4666 9598/5352/4675
+f 2799/5341/4669 2801/5351/4674 2806/5356/4677 2802/5357/4678
+f 2802/5357/4678 2806/5356/4677 9577/5358/4679 9578/5359/4680
+f 2801/5351/4674 9599/5353/4676 9600/5360/4681 2806/5356/4677
+f 2806/5356/4677 9600/5360/4681 13053/5361/4682 9577/5358/4679
+f 2799/5341/4669 2802/5357/4678 2807/5362/4683 2803/5342/4670
+f 2803/5342/4670 2807/5362/4683 9300/5363/706 9299/5347/698
+f 2802/5357/4678 9578/5359/4680 9579/5364/4684 2807/5362/4683
+f 2807/5362/4683 9579/5364/4684 13010/5365/707 9300/5363/706
+f 2808/5366/4685 2812/5367/4686 2813/5368/4687 2809/5369/4688
+f 2809/5369/4688 2813/5368/4687 9579/5370/4684 9578/5371/4680
+f 2812/5367/4686 9308/5372/4156 9307/5373/4165 2813/5368/4687
+f 2813/5368/4687 9307/5373/4165 13010/5374/707 9579/5370/4684
+f 2808/5366/4685 2809/5369/4688 2814/5375/4689 2810/5376/4690
+f 2810/5376/4690 2814/5375/4689 9592/5377/4691 9593/5378/4692
+f 2809/5369/4688 9578/5371/4680 9577/5379/4679 2814/5375/4689
+f 2814/5375/4689 9577/5379/4679 13053/5380/4682 9592/5377/4691
+f 2808/5366/4685 2810/5376/4690 2815/5381/4693 2811/5382/4694
+f 2811/5382/4694 2815/5381/4693 9393/4869/4381 9392/4861/4378
+f 2810/5376/4690 9593/5378/4692 9594/5383/4695 2815/5381/4693
+f 2815/5381/4693 9594/5383/4695 13052/4870/245 9393/4869/4381
+f 2808/5366/4685 2811/5382/4694 2816/5384/4696 2812/5367/4686
+f 2812/5367/4686 2816/5384/4696 9309/5385/4157 9308/5372/4156
+f 2811/5382/4694 9392/4861/4378 9391/4860/4377 2816/5384/4696
+f 2816/5384/4696 9391/4860/4377 13011/4864/4158 9309/5385/4157
+f 2817/5386/4697 2821/5387/4698 2822/5388/4699 2818/5389/4700
+f 2818/5389/4700 2822/5388/4699 9589/5390/4701 9590/5391/4702
+f 2821/5387/4698 9593/5378/4692 9592/5377/4691 2822/5388/4699
+f 2822/5388/4699 9592/5377/4691 13053/5380/4682 9589/5390/4701
+f 2817/5386/4697 2818/5389/4700 2823/5392/4703 2819/5393/4704
+f 2819/5393/4704 2823/5392/4703 9585/3970/3533 9584/3965/3528
+f 2818/5389/4700 9590/5391/4702 9591/5394/4705 2823/5392/4703
+f 2823/5392/4703 9591/5394/4705 13051/3971/3534 9585/3970/3533
+f 2817/5386/4697 2819/5393/4704 2824/5395/4706 2820/5383/4707
+f 2820/5383/4707 2824/5395/4706 9586/5396/4708 9587/4870/4709
+f 2819/5393/4704 9584/3965/3528 9583/3964/3527 2824/5395/4706
+f 2824/5395/4706 9583/3964/3527 13026/813/738 9586/5396/4708
+f 2817/5386/4697 2820/5383/4707 2825/5397/4710 2821/5387/4698
+f 2821/5387/4698 2825/5397/4710 9594/5383/4695 9593/5378/4692
+f 2820/5383/4707 9587/4870/4709 9588/5398/4711 2825/5397/4710
+f 2825/5397/4710 9588/5398/4711 13052/4870/245 9594/5383/4695
+f 2826/5399/4712 2830/5400/4713 2831/5401/4714 2827/5402/4715
+f 2827/5402/4715 2831/5401/4714 9595/5403/4716 9596/5404/4717
+f 2830/5400/4713 9599/5353/4676 9598/5352/4675 2831/5401/4714
+f 2831/5401/4714 9598/5352/4675 13054/5355/4666 9595/5403/4716
+f 2826/5399/4712 2827/5402/4715 2832/5405/4718 2828/5406/4719
+f 2828/5406/4719 2832/5405/4718 9582/3974/3537 9581/3969/3532
+f 2827/5402/4715 9596/5404/4717 9597/5407/4720 2832/5405/4718
+f 2832/5405/4718 9597/5407/4720 13050/3975/3538 9582/3974/3537
+f 2826/5399/4712 2828/5406/4719 2833/5408/4721 2829/5409/4722
+f 2829/5409/4722 2833/5408/4721 9591/5410/4705 9590/5411/4702
+f 2828/5406/4719 9581/3969/3532 9580/3968/3531 2833/5408/4721
+f 2833/5408/4721 9580/3968/3531 13051/3971/3534 9591/5410/4705
+f 2826/5399/4712 2829/5409/4722 2834/5412/4723 2830/5400/4713
+f 2830/5400/4713 2834/5412/4723 9600/5360/4681 9599/5353/4676
+f 2829/5409/4722 9590/5411/4702 9589/5413/4701 2834/5412/4723
+f 2834/5412/4723 9589/5413/4701 13053/5361/4682 9600/5360/4681
+f 2835/5414/4724 2839/5415/4725 2840/5416/4726 2836/5417/4727
+f 2836/5417/4727 2840/5416/4726 9601/5418/4728 9602/5419/4729
+f 2839/5415/4725 9605/5330/4660 9604/5329/4659 2840/5416/4726
+f 2840/5416/4726 9604/5329/4659 13055/4851/1202 9601/5418/4728
+f 2835/5414/4724 2836/5417/4727 2841/5420/4730 2837/5421/4731
+f 2837/5421/4731 2841/5420/4730 9576/3961/3524 9575/3960/3523
+f 2836/5417/4727 9602/5419/4729 9603/5422/4732 2841/5420/4730
+f 2841/5420/4730 9603/5422/4732 13024/817/742 9576/3961/3524
+f 2835/5414/4724 2837/5421/4731 2842/5423/4733 2838/5424/4734
+f 2838/5424/4734 2842/5423/4733 9597/5425/4720 9596/5426/4717
+f 2837/5421/4731 9575/3960/3523 9574/3973/3536 2842/5423/4733
+f 2842/5423/4733 9574/3973/3536 13050/3975/3538 9597/5425/4720
+f 2835/5414/4724 2838/5424/4734 2843/5427/4735 2839/5415/4725
+f 2839/5415/4725 2843/5427/4735 9606/5335/4665 9605/5330/4660
+f 2838/5424/4734 9596/5426/4717 9595/5428/4716 2843/5427/4735
+f 2843/5427/4735 9595/5428/4716 13054/5336/4666 9606/5335/4665
+f 2844/5429/4736 2848/5430/4737 2849/5431/4738 2845/5432/4739
+f 2845/5432/4739 2849/5431/4738 9607/5433/4740 9608/5434/4741
+f 2848/5430/4737 9611/4843/1196 9610/4842/1195 2849/5431/4738
+f 2849/5431/4738 9610/4842/1195 13056/4845/1182 9607/5433/4740
+f 2844/5429/4736 2845/5432/4739 2850/5435/4742 2846/5436/4743
+f 2846/5436/4743 2850/5435/4742 9390/800/725 9389/799/724
+f 2845/5432/4739 9608/5434/4741 9609/5437/4744 2850/5435/4742
+f 2850/5435/4742 9609/5437/4744 13025/801/726 9390/800/725
+f 2844/5429/4736 2846/5436/4743 2851/5438/4745 2847/5439/4746
+f 2847/5439/4746 2851/5438/4745 9603/5422/4732 9602/5419/4729
+f 2846/5436/4743 9389/799/724 9388/815/740 2851/5438/4745
+f 2851/5438/4745 9388/815/740 13024/817/742 9603/5422/4732
+f 2844/5429/4736 2847/5439/4746 2852/5440/4747 2848/5430/4737
+f 2848/5430/4737 2852/5440/4747 9612/4850/1201 9611/4843/1196
+f 2847/5439/4746 9602/5419/4729 9601/5418/4728 2852/5440/4747
+f 2852/5440/4747 9601/5418/4728 13055/4851/1202 9612/4850/1201
+f 2853/5441/4748 2857/5442/4749 2858/5443/4750 2854/5444/4751
+f 2854/5444/4751 2858/5443/4750 9613/5445/4752 9614/5446/4753
+f 2857/5442/4749 9617/4893/1176 9616/4892/1175 2858/5443/4750
+f 2858/5443/4750 9616/4892/1175 13057/4895/1162 9613/5445/4752
+f 2853/5441/4748 2854/5444/4751 2859/5447/4754 2855/5448/4755
+f 2855/5448/4755 2859/5447/4754 9411/825/750 9410/824/749
+f 2854/5444/4751 9614/5446/4753 9615/5449/4756 2859/5447/4754
+f 2859/5447/4754 9615/5449/4756 13028/826/751 9411/825/750
+f 2853/5441/4748 2855/5448/4755 2860/5450/4757 2856/5451/4758
+f 2856/5451/4758 2860/5450/4757 9609/5437/4744 9608/5434/4741
+f 2855/5448/4755 9410/824/749 9409/837/762 2860/5450/4757
+f 2860/5450/4757 9409/837/762 13025/801/726 9609/5437/4744
+f 2853/5441/4748 2856/5451/4758 2861/5452/4759 2857/5442/4749
+f 2857/5442/4749 2861/5452/4759 9618/4898/1181 9617/4893/1176
+f 2856/5451/4758 9608/5434/4741 9607/5433/4740 2861/5452/4759
+f 2861/5452/4759 9607/5433/4740 13056/4845/1182 9618/4898/1181
+f 2862/5453/4760 2866/5454/4761 2867/5455/4762 2863/5456/4763
+f 2863/5456/4763 2867/5455/4762 9619/5457/4764 9620/5458/4765
+f 2866/5454/4761 9623/4933/1156 9622/4932/1155 2867/5455/4762
+f 2867/5455/4762 9622/4932/1155 13058/4935/1142 9619/5457/4764
+f 2862/5453/4760 2863/5456/4763 2868/5459/4766 2864/5460/4767
+f 2864/5460/4767 2868/5459/4766 9426/845/770 9425/844/769
+f 2863/5456/4763 9620/5458/4765 9621/5461/4768 2868/5459/4766
+f 2868/5459/4766 9621/5461/4768 13030/846/771 9426/845/770
+f 2862/5453/4760 2864/5460/4767 2869/5462/4769 2865/5463/4770
+f 2865/5463/4770 2869/5462/4769 9615/5449/4756 9614/5446/4753
+f 2864/5460/4767 9425/844/769 9424/857/782 2869/5462/4769
+f 2869/5462/4769 9424/857/782 13028/826/751 9615/5449/4756
+f 2862/5453/4760 2865/5463/4770 2870/5464/4771 2866/5454/4761
+f 2866/5454/4761 2870/5464/4771 9624/4938/1161 9623/4933/1156
+f 2865/5463/4770 9614/5446/4753 9613/5445/4752 2870/5464/4771
+f 2870/5464/4771 9613/5445/4752 13057/4895/1162 9624/4938/1161
+f 2871/5465/4772 2875/5466/4773 2876/5467/4774 2872/5468/4775
+f 2872/5468/4775 2876/5467/4774 9625/5469/4776 9626/5470/4777
+f 2875/5466/4773 9629/4973/1136 9628/4972/1135 2876/5467/4774
+f 2876/5467/4774 9628/4972/1135 13059/4975/1122 9625/5469/4776
+f 2871/5465/4772 2872/5468/4775 2877/5471/4778 2873/5472/4779
+f 2873/5472/4779 2877/5471/4778 9441/865/790 9440/864/789
+f 2872/5468/4775 9626/5470/4777 9627/5473/4780 2877/5471/4778
+f 2877/5471/4778 9627/5473/4780 13032/866/791 9441/865/790
+f 2871/5465/4772 2873/5472/4779 2878/5474/4781 2874/5475/4782
+f 2874/5475/4782 2878/5474/4781 9621/5461/4768 9620/5458/4765
+f 2873/5472/4779 9440/864/789 9439/877/802 2878/5474/4781
+f 2878/5474/4781 9439/877/802 13030/846/771 9621/5461/4768
+f 2871/5465/4772 2874/5475/4782 2879/5476/4783 2875/5466/4773
+f 2875/5466/4773 2879/5476/4783 9630/4978/1141 9629/4973/1136
+f 2874/5475/4782 9620/5458/4765 9619/5457/4764 2879/5476/4783
+f 2879/5476/4783 9619/5457/4764 13058/4935/1142 9630/4978/1141
+f 2880/5477/4784 2884/5478/4785 2885/5479/4786 2881/5480/4787
+f 2881/5480/4787 2885/5479/4786 9631/5481/4788 9632/5482/4789
+f 2884/5478/4785 9635/5013/1116 9634/5012/1115 2885/5479/4786
+f 2885/5479/4786 9634/5012/1115 13060/5015/1102 9631/5481/4788
+f 2880/5477/4784 2881/5480/4787 2886/5483/4790 2882/5484/4791
+f 2882/5484/4791 2886/5483/4790 9456/885/810 9455/884/809
+f 2881/5480/4787 9632/5482/4789 9633/5485/4792 2886/5483/4790
+f 2886/5483/4790 9633/5485/4792 13034/886/811 9456/885/810
+f 2880/5477/4784 2882/5484/4791 2887/5486/4793 2883/5487/4794
+f 2883/5487/4794 2887/5486/4793 9627/5473/4780 9626/5470/4777
+f 2882/5484/4791 9455/884/809 9454/897/822 2887/5486/4793
+f 2887/5486/4793 9454/897/822 13032/866/791 9627/5473/4780
+f 2880/5477/4784 2883/5487/4794 2888/5488/4795 2884/5478/4785
+f 2884/5478/4785 2888/5488/4795 9636/5018/1121 9635/5013/1116
+f 2883/5487/4794 9626/5470/4777 9625/5469/4776 2888/5488/4795
+f 2888/5488/4795 9625/5469/4776 13059/4975/1122 9636/5018/1121
+f 2889/5489/4796 2893/5490/4797 2894/5491/4798 2890/5492/4799
+f 2890/5492/4799 2894/5491/4798 9637/5493/4800 9638/5494/4801
+f 2893/5490/4797 9641/5053/1096 9640/5052/1095 2894/5491/4798
+f 2894/5491/4798 9640/5052/1095 13061/5055/1082 9637/5493/4800
+f 2889/5489/4796 2890/5492/4799 2895/5495/4802 2891/5496/4803
+f 2891/5496/4803 2895/5495/4802 9471/905/830 9470/904/829
+f 2890/5492/4799 9638/5494/4801 9639/5497/4804 2895/5495/4802
+f 2895/5495/4802 9639/5497/4804 13036/906/831 9471/905/830
+f 2889/5489/4796 2891/5496/4803 2896/5498/4805 2892/5499/4806
+f 2892/5499/4806 2896/5498/4805 9633/5485/4792 9632/5482/4789
+f 2891/5496/4803 9470/904/829 9469/917/842 2896/5498/4805
+f 2896/5498/4805 9469/917/842 13034/886/811 9633/5485/4792
+f 2889/5489/4796 2892/5499/4806 2897/5500/4807 2893/5490/4797
+f 2893/5490/4797 2897/5500/4807 9642/5058/1101 9641/5053/1096
+f 2892/5499/4806 9632/5482/4789 9631/5481/4788 2897/5500/4807
+f 2897/5500/4807 9631/5481/4788 13060/5015/1102 9642/5058/1101
+f 2898/5501/4808 2902/5502/4809 2903/5503/4810 2899/5504/4811
+f 2899/5504/4811 2903/5503/4810 9643/5505/4812 9644/5506/4813
+f 2902/5502/4809 9647/5093/1076 9646/5092/1075 2903/5503/4810
+f 2903/5503/4810 9646/5092/1075 13062/5095/1062 9643/5505/4812
+f 2898/5501/4808 2899/5504/4811 2904/5507/4814 2900/5508/4815
+f 2900/5508/4815 2904/5507/4814 9486/925/850 9485/924/849
+f 2899/5504/4811 9644/5506/4813 9645/5509/4816 2904/5507/4814
+f 2904/5507/4814 9645/5509/4816 13038/926/851 9486/925/850
+f 2898/5501/4808 2900/5508/4815 2905/5510/4817 2901/5511/4818
+f 2901/5511/4818 2905/5510/4817 9639/5497/4804 9638/5494/4801
+f 2900/5508/4815 9485/924/849 9484/937/862 2905/5510/4817
+f 2905/5510/4817 9484/937/862 13036/906/831 9639/5497/4804
+f 2898/5501/4808 2901/5511/4818 2906/5512/4819 2902/5502/4809
+f 2902/5502/4809 2906/5512/4819 9648/5098/1081 9647/5093/1076
+f 2901/5511/4818 9638/5494/4801 9637/5493/4800 2906/5512/4819
+f 2906/5512/4819 9637/5493/4800 13061/5055/1082 9648/5098/1081
+f 2907/5513/4820 2911/5514/4821 2912/5515/4822 2908/5516/4823
+f 2908/5516/4823 2912/5515/4822 9649/5517/4824 9650/5518/4825
+f 2911/5514/4821 9653/5133/1056 9652/5132/1055 2912/5515/4822
+f 2912/5515/4822 9652/5132/1055 13063/5135/451 9649/5517/4824
+f 2907/5513/4820 2908/5516/4823 2913/5519/4826 2909/5520/4827
+f 2909/5520/4827 2913/5519/4826 9501/945/870 9500/944/869
+f 2908/5516/4823 9650/5518/4825 9651/5521/4828 2913/5519/4826
+f 2913/5519/4826 9651/5521/4828 13040/946/871 9501/945/870
+f 2907/5513/4820 2909/5520/4827 2914/5522/4829 2910/5523/4830
+f 2910/5523/4830 2914/5522/4829 9645/5509/4816 9644/5506/4813
+f 2909/5520/4827 9500/944/869 9499/957/882 2914/5522/4829
+f 2914/5522/4829 9499/957/882 13038/926/851 9645/5509/4816
+f 2907/5513/4820 2910/5523/4830 2915/5524/4831 2911/5514/4821
+f 2911/5514/4821 2915/5524/4831 9654/5138/1061 9653/5133/1056
+f 2910/5523/4830 9644/5506/4813 9643/5505/4812 2915/5524/4831
+f 2915/5524/4831 9643/5505/4812 13062/5095/1062 9654/5138/1061
+f 2916/5525/4832 2920/5526/4833 2921/5527/4834 2917/5528/4835
+f 2917/5528/4835 2921/5527/4834 9655/5529/4836 9656/5530/4837
+f 2920/5526/4833 9659/5173/1037 9658/5172/1036 2921/5527/4834
+f 2921/5527/4834 9658/5172/1036 13064/5175/1023 9655/5529/4836
+f 2916/5525/4832 2917/5528/4835 2922/5531/4838 2918/5532/4839
+f 2918/5532/4839 2922/5531/4838 9516/965/890 9515/964/889
+f 2917/5528/4835 9656/5530/4837 9657/5533/4840 2922/5531/4838
+f 2922/5531/4838 9657/5533/4840 13042/966/891 9516/965/890
+f 2916/5525/4832 2918/5532/4839 2923/5534/4841 2919/5535/4842
+f 2919/5535/4842 2923/5534/4841 9651/5521/4828 9650/5518/4825
+f 2918/5532/4839 9515/964/889 9514/977/902 2923/5534/4841
+f 2923/5534/4841 9514/977/902 13040/946/871 9651/5521/4828
+f 2916/5525/4832 2919/5535/4842 2924/5536/4843 2920/5526/4833
+f 2920/5526/4833 2924/5536/4843 9660/5178/1042 9659/5173/1037
+f 2919/5535/4842 9650/5518/4825 9649/5517/4824 2924/5536/4843
+f 2924/5536/4843 9649/5517/4824 13063/5135/451 9660/5178/1042
+f 2925/5537/4844 2929/5538/4845 2930/5539/4846 2926/5540/4847
+f 2926/5540/4847 2930/5539/4846 9661/5541/4848 9662/5542/4849
+f 2929/5538/4845 9665/5213/1017 9664/5212/1016 2930/5539/4846
+f 2930/5539/4846 9664/5212/1016 13065/5215/1003 9661/5541/4848
+f 2925/5537/4844 2926/5540/4847 2931/5543/4850 2927/5544/4851
+f 2927/5544/4851 2931/5543/4850 9531/985/910 9530/984/909
+f 2926/5540/4847 9662/5542/4849 9663/5545/4852 2931/5543/4850
+f 2931/5543/4850 9663/5545/4852 13044/986/911 9531/985/910
+f 2925/5537/4844 2927/5544/4851 2932/5546/4853 2928/5547/4854
+f 2928/5547/4854 2932/5546/4853 9657/5533/4840 9656/5530/4837
+f 2927/5544/4851 9530/984/909 9529/997/922 2932/5546/4853
+f 2932/5546/4853 9529/997/922 13042/966/891 9657/5533/4840
+f 2925/5537/4844 2928/5547/4854 2933/5548/4855 2929/5538/4845
+f 2929/5538/4845 2933/5548/4855 9666/5218/1022 9665/5213/1017
+f 2928/5547/4854 9656/5530/4837 9655/5529/4836 2933/5548/4855
+f 2933/5548/4855 9655/5529/4836 13064/5175/1023 9666/5218/1022
+f 2934/5549/4856 2938/5550/4857 2939/5551/4858 2935/5552/4859
+f 2935/5552/4859 2939/5551/4858 9667/5553/4860 9668/5554/4861
+f 2938/5550/4857 9671/5253/997 9670/5252/996 2939/5551/4858
+f 2939/5551/4858 9670/5252/996 13066/5255/983 9667/5553/4860
+f 2934/5549/4856 2935/5552/4859 2940/5555/4862 2936/5556/4863
+f 2936/5556/4863 2940/5555/4862 9546/1005/930 9545/1004/929
+f 2935/5552/4859 9668/5554/4861 9669/5557/4864 2940/5555/4862
+f 2940/5555/4862 9669/5557/4864 13046/1006/931 9546/1005/930
+f 2934/5549/4856 2936/5556/4863 2941/5558/4865 2937/5559/4866
+f 2937/5559/4866 2941/5558/4865 9663/5545/4852 9662/5542/4849
+f 2936/5556/4863 9545/1004/929 9544/1017/942 2941/5558/4865
+f 2941/5558/4865 9544/1017/942 13044/986/911 9663/5545/4852
+f 2934/5549/4856 2937/5559/4866 2942/5560/4867 2938/5550/4857
+f 2938/5550/4857 2942/5560/4867 9672/5258/1002 9671/5253/997
+f 2937/5559/4866 9662/5542/4849 9661/5541/4848 2942/5560/4867
+f 2942/5560/4867 9661/5541/4848 13065/5215/1003 9672/5258/1002
+f 2943/5561/4868 2947/5562/4869 2948/5563/4870 2944/5564/4871
+f 2944/5564/4871 2948/5563/4870 9673/5565/4872 9674/5566/4873
+f 2947/5562/4869 9677/5293/975 9676/5292/974 2948/5563/4870
+f 2948/5563/4870 9676/5292/974 13067/5295/977 9673/5565/4872
+f 2943/5561/4868 2944/5564/4871 2949/5567/4874 2945/5568/4875
+f 2945/5568/4875 2949/5567/4874 9561/1025/950 9560/1024/949
+f 2944/5564/4871 9674/5566/4873 9675/5569/4876 2949/5567/4874
+f 2949/5567/4874 9675/5569/4876 13048/1026/951 9561/1025/950
+f 2943/5561/4868 2945/5568/4875 2950/5570/4877 2946/5571/4878
+f 2946/5571/4878 2950/5570/4877 9669/5557/4864 9668/5554/4861
+f 2945/5568/4875 9560/1024/949 9559/1037/962 2950/5570/4877
+f 2950/5570/4877 9559/1037/962 13046/1006/931 9669/5557/4864
+f 2943/5561/4868 2946/5571/4878 2951/5572/4879 2947/5562/4869
+f 2947/5562/4869 2951/5572/4879 9678/5298/982 9677/5293/975
+f 2946/5571/4878 9668/5554/4861 9667/5553/4860 2951/5572/4879
+f 2951/5572/4879 9667/5553/4860 13066/5255/983 9678/5298/982
+f 2952/5310/4880 2956/5573/4881 2957/5574/4882 2953/5309/4883
+f 2953/5309/4883 2957/5574/4882 9682/5575/4884 9683/5276/4885
+f 2956/5573/4881 9686/5310/7 9685/5309/23 2957/5574/4882
+f 2957/5574/4882 9685/5309/23 13069/5276/25 9682/5575/4884
+f 2952/5310/4880 2953/5309/4883 2958/5576/4886 2954/5577/4887
+f 2954/5577/4887 2958/5576/4886 9567/1035/960 9566/1030/955
+f 2953/5309/4883 9683/5276/4885 9684/5578/4888 2958/5576/4886
+f 2958/5576/4886 9684/5578/4888 13047/1012/937 9567/1035/960
+f 2952/5310/4880 2954/5577/4887 2959/5579/4889 2955/5315/4890
+f 2955/5315/4890 2959/5579/4889 9679/5580/4891 9680/5316/4892
+f 2954/5577/4887 9566/1030/955 9565/1029/954 2959/5579/4889
+f 2959/5579/4889 9565/1029/954 13049/1032/957 9679/5580/4891
+f 2952/5310/4880 2955/5315/4890 2960/5581/4893 2956/5573/4881
+f 2956/5573/4881 2960/5581/4893 9687/5315/8 9686/5310/7
+f 2955/5315/4890 9680/5316/4892 9681/5582/4894 2960/5581/4893
+f 2960/5581/4893 9681/5582/4894 13068/5316/9 9687/5315/8
+f 2961/5270/4895 2965/5583/4896 2966/5584/4897 2962/5269/4898
+f 2962/5269/4898 2966/5584/4897 9688/5585/4899 9689/5236/4900
+f 2965/5583/4896 9692/5270/30 9691/5269/43 2966/5584/4897
+f 2966/5584/4897 9691/5269/43 13070/5236/45 9688/5585/4899
+f 2961/5270/4895 2962/5269/4898 2967/5586/4901 2963/5587/4902
+f 2963/5587/4902 2967/5586/4901 9552/1015/940 9551/1010/935
+f 2962/5269/4898 9689/5236/4900 9690/5588/4903 2967/5586/4901
+f 2967/5586/4901 9690/5588/4903 13045/992/917 9552/1015/940
+f 2961/5270/4895 2963/5587/4902 2968/5589/4904 2964/5275/4905
+f 2964/5275/4905 2968/5589/4904 9684/5578/4888 9683/5276/4885
+f 2963/5587/4902 9551/1010/935 9550/1009/934 2968/5589/4904
+f 2968/5589/4904 9550/1009/934 13047/1012/937 9684/5578/4888
+f 2961/5270/4895 2964/5275/4905 2969/5590/4906 2965/5583/4896
+f 2965/5583/4896 2969/5590/4906 9693/5275/31 9692/5270/30
+f 2964/5275/4905 9683/5276/4885 9682/5575/4884 2969/5590/4906
+f 2969/5590/4906 9682/5575/4884 13069/5276/25 9693/5275/31
+f 2970/5230/4907 2974/5591/4908 2975/5592/4909 2971/5229/4910
+f 2971/5229/4910 2975/5592/4909 9694/5593/4911 9695/5196/4912
+f 2974/5591/4908 9698/5230/50 9697/5229/63 2975/5592/4909
+f 2975/5592/4909 9697/5229/63 13071/5196/65 9694/5593/4911
+f 2970/5230/4907 2971/5229/4910 2976/5594/4913 2972/5595/4914
+f 2972/5595/4914 2976/5594/4913 9537/995/920 9536/990/915
+f 2971/5229/4910 9695/5196/4912 9696/5596/4915 2976/5594/4913
+f 2976/5594/4913 9696/5596/4915 13043/972/897 9537/995/920
+f 2970/5230/4907 2972/5595/4914 2977/5597/4916 2973/5235/4917
+f 2973/5235/4917 2977/5597/4916 9690/5588/4903 9689/5236/4900
+f 2972/5595/4914 9536/990/915 9535/989/914 2977/5597/4916
+f 2977/5597/4916 9535/989/914 13045/992/917 9690/5588/4903
+f 2970/5230/4907 2973/5235/4917 2978/5598/4918 2974/5591/4908
+f 2974/5591/4908 2978/5598/4918 9699/5235/51 9698/5230/50
+f 2973/5235/4917 9689/5236/4900 9688/5585/4899 2978/5598/4918
+f 2978/5598/4918 9688/5585/4899 13070/5236/45 9699/5235/51
+f 2979/5190/4919 2983/5599/4920 2984/5600/4921 2980/5189/4922
+f 2980/5189/4922 2984/5600/4921 9700/5601/4923 9701/5156/4924
+f 2983/5599/4920 9704/5190/70 9703/5189/4574 2984/5600/4921
+f 2984/5600/4921 9703/5189/4574 13072/5156/85 9700/5601/4923
+f 2979/5190/4919 2980/5189/4922 2985/5602/4925 2981/5603/4926
+f 2981/5603/4926 2985/5602/4925 9522/975/900 9521/970/895
+f 2980/5189/4922 9701/5156/4924 9702/5604/4927 2985/5602/4925
+f 2985/5602/4925 9702/5604/4927 13041/952/877 9522/975/900
+f 2979/5190/4919 2981/5603/4926 2986/5605/4928 2982/5606/4929
+f 2982/5606/4929 2986/5605/4928 9696/5596/4915 9695/5196/4912
+f 2981/5603/4926 9521/970/895 9520/969/894 2986/5605/4928
+f 2986/5605/4928 9520/969/894 13043/972/897 9696/5596/4915
+f 2979/5190/4919 2982/5606/4929 2987/5607/4930 2983/5599/4920
+f 2983/5599/4920 2987/5607/4930 9705/5195/71 9704/5190/70
+f 2982/5606/4929 9695/5196/4912 9694/5593/4911 2987/5607/4930
+f 2987/5607/4930 9694/5593/4911 13071/5196/65 9705/5195/71
+f 2988/5150/4931 2992/5608/4932 2993/5609/4933 2989/5149/4934
+f 2989/5149/4934 2993/5609/4933 9706/5610/4935 9707/5116/4936
+f 2992/5608/4932 9710/5150/90 9709/5149/103 2993/5609/4933
+f 2993/5609/4933 9709/5149/103 13073/5116/105 9706/5610/4935
+f 2988/5150/4931 2989/5149/4934 2994/5611/4937 2990/5612/4938
+f 2990/5612/4938 2994/5611/4937 9507/955/880 9506/950/875
+f 2989/5149/4934 9707/5116/4936 9708/5613/4939 2994/5611/4937
+f 2994/5611/4937 9708/5613/4939 13039/932/857 9507/955/880
+f 2988/5150/4931 2990/5612/4938 2995/5614/4940 2991/5155/4941
+f 2991/5155/4941 2995/5614/4940 9702/5604/4927 9701/5156/4924
+f 2990/5612/4938 9506/950/875 9505/949/874 2995/5614/4940
+f 2995/5614/4940 9505/949/874 13041/952/877 9702/5604/4927
+f 2988/5150/4931 2991/5155/4941 2996/5615/4942 2992/5608/4932
+f 2992/5608/4932 2996/5615/4942 9711/5155/91 9710/5150/90
+f 2991/5155/4941 9701/5156/4924 9700/5601/4923 2996/5615/4942
+f 2996/5615/4942 9700/5601/4923 13072/5156/85 9711/5155/91
+f 2997/5616/4943 3001/5617/4944 3002/5618/4945 2998/5109/4946
+f 2998/5109/4946 3002/5618/4945 9712/5619/4947 9713/5076/4948
+f 3001/5617/4944 9716/5110/110 9715/5109/123 3002/5618/4945
+f 3002/5618/4945 9715/5109/123 13074/5076/125 9712/5619/4947
+f 2997/5616/4943 2998/5109/4946 3003/5620/4949 2999/5621/4950
+f 2999/5621/4950 3003/5620/4949 9492/935/860 9491/930/855
+f 2998/5109/4946 9713/5076/4948 9714/5622/4951 3003/5620/4949
+f 3003/5620/4949 9714/5622/4951 13037/912/837 9492/935/860
+f 2997/5616/4943 2999/5621/4950 3004/5623/4952 3000/5115/4953
+f 3000/5115/4953 3004/5623/4952 9708/5613/4939 9707/5116/4936
+f 2999/5621/4950 9491/930/855 9490/929/854 3004/5623/4952
+f 3004/5623/4952 9490/929/854 13039/932/857 9708/5613/4939
+f 2997/5616/4943 3000/5115/4953 3005/5624/4954 3001/5617/4944
+f 3001/5617/4944 3005/5624/4954 9717/5115/111 9716/5110/110
+f 3000/5115/4953 9707/5116/4936 9706/5610/4935 3005/5624/4954
+f 3005/5624/4954 9706/5610/4935 13073/5116/105 9717/5115/111
+f 3006/5070/4955 3010/5625/4956 3011/5626/4957 3007/5069/4958
+f 3007/5069/4958 3011/5626/4957 9718/5627/4959 9719/5036/4960
+f 3010/5625/4956 9722/5070/130 9721/5069/143 3011/5626/4957
+f 3011/5626/4957 9721/5069/143 13075/5036/145 9718/5627/4959
+f 3006/5070/4955 3007/5069/4958 3012/5628/4961 3008/5629/4962
+f 3008/5629/4962 3012/5628/4961 9477/915/840 9476/910/835
+f 3007/5069/4958 9719/5036/4960 9720/5630/4963 3012/5628/4961
+f 3012/5628/4961 9720/5630/4963 13035/892/817 9477/915/840
+f 3006/5070/4955 3008/5629/4962 3013/5631/4964 3009/5075/4965
+f 3009/5075/4965 3013/5631/4964 9714/5622/4951 9713/5076/4948
+f 3008/5629/4962 9476/910/835 9475/909/834 3013/5631/4964
+f 3013/5631/4964 9475/909/834 13037/912/837 9714/5622/4951
+f 3006/5070/4955 3009/5075/4965 3014/5632/4966 3010/5625/4956
+f 3010/5625/4956 3014/5632/4966 9723/5075/131 9722/5070/130
+f 3009/5075/4965 9713/5076/4948 9712/5619/4947 3014/5632/4966
+f 3014/5632/4966 9712/5619/4947 13074/5076/125 9723/5075/131
+f 3015/5030/4967 3019/5633/4968 3020/5634/4969 3016/5029/4970
+f 3016/5029/4970 3020/5634/4969 9724/5635/4971 9725/4996/4972
+f 3019/5633/4968 9728/5030/150 9727/5029/163 3020/5634/4969
+f 3020/5634/4969 9727/5029/163 13076/4996/165 9724/5635/4971
+f 3015/5030/4967 3016/5029/4970 3021/5636/4973 3017/5637/4974
+f 3017/5637/4974 3021/5636/4973 9462/895/820 9461/890/815
+f 3016/5029/4970 9725/4996/4972 9726/5638/4975 3021/5636/4973
+f 3021/5636/4973 9726/5638/4975 13033/872/797 9462/895/820
+f 3015/5030/4967 3017/5637/4974 3022/5639/4976 3018/5035/4977
+f 3018/5035/4977 3022/5639/4976 9720/5630/4963 9719/5036/4960
+f 3017/5637/4974 9461/890/815 9460/889/814 3022/5639/4976
+f 3022/5639/4976 9460/889/814 13035/892/817 9720/5630/4963
+f 3015/5030/4967 3018/5035/4977 3023/5640/4978 3019/5633/4968
+f 3019/5633/4968 3023/5640/4978 9729/5035/151 9728/5030/150
+f 3018/5035/4977 9719/5036/4960 9718/5627/4959 3023/5640/4978
+f 3023/5640/4978 9718/5627/4959 13075/5036/145 9729/5035/151
+f 3024/4990/4979 3028/5641/4980 3029/5642/4981 3025/4989/4982
+f 3025/4989/4982 3029/5642/4981 9730/5643/4983 9731/4956/4984
+f 3028/5641/4980 9734/4990/170 9733/4989/183 3029/5642/4981
+f 3029/5642/4981 9733/4989/183 13077/4956/185 9730/5643/4983
+f 3024/4990/4979 3025/4989/4982 3030/5644/4985 3026/5645/4986
+f 3026/5645/4986 3030/5644/4985 9447/875/800 9446/870/795
+f 3025/4989/4982 9731/4956/4984 9732/5646/4987 3030/5644/4985
+f 3030/5644/4985 9732/5646/4987 13031/852/777 9447/875/800
+f 3024/4990/4979 3026/5645/4986 3031/5647/4988 3027/4995/4989
+f 3027/4995/4989 3031/5647/4988 9726/5638/4975 9725/4996/4972
+f 3026/5645/4986 9446/870/795 9445/869/794 3031/5647/4988
+f 3031/5647/4988 9445/869/794 13033/872/797 9726/5638/4975
+f 3024/4990/4979 3027/4995/4989 3032/5648/4990 3028/5641/4980
+f 3028/5641/4980 3032/5648/4990 9735/4995/171 9734/4990/170
+f 3027/4995/4989 9725/4996/4972 9724/5635/4971 3032/5648/4990
+f 3032/5648/4990 9724/5635/4971 13076/4996/165 9735/4995/171
+f 3033/5649/4991 3037/5650/4992 3038/5651/4993 3034/4949/4994
+f 3034/4949/4994 3038/5651/4993 9736/5652/4995 9737/4916/4996
+f 3037/5650/4992 9740/4950/190 9739/4949/203 3038/5651/4993
+f 3038/5651/4993 9739/4949/203 13078/4916/205 9736/5652/4995
+f 3033/5649/4991 3034/4949/4994 3039/5653/4997 3035/5654/4998
+f 3035/5654/4998 3039/5653/4997 9432/855/780 9431/850/775
+f 3034/4949/4994 9737/4916/4996 9738/5655/4999 3039/5653/4997
+f 3039/5653/4997 9738/5655/4999 13029/832/757 9432/855/780
+f 3033/5649/4991 3035/5654/4998 3040/5656/5000 3036/4955/5001
+f 3036/4955/5001 3040/5656/5000 9732/5646/4987 9731/4956/4984
+f 3035/5654/4998 9431/850/775 9430/849/774 3040/5656/5000
+f 3040/5656/5000 9430/849/774 13031/852/777 9732/5646/4987
+f 3033/5649/4991 3036/4955/5001 3041/5657/5002 3037/5650/4992
+f 3037/5650/4992 3041/5657/5002 9741/4955/191 9740/4950/190
+f 3036/4955/5001 9731/4956/4984 9730/5643/4983 3041/5657/5002
+f 3041/5657/5002 9730/5643/4983 13077/4956/185 9741/4955/191
+f 3042/4910/5003 3046/5658/5004 3047/5659/5005 3043/4909/5006
+f 3043/4909/5006 3047/5659/5005 9742/5660/5007 9743/4876/5008
+f 3046/5658/5004 9746/4910/210 9745/4909/223 3047/5659/5005
+f 3047/5659/5005 9745/4909/223 13079/4876/225 9742/5660/5007
+f 3042/4910/5003 3043/4909/5006 3048/5661/5009 3044/5662/5010
+f 3044/5662/5010 3048/5661/5009 9417/835/760 9416/830/755
+f 3043/4909/5006 9743/4876/5008 9744/5663/5011 3048/5661/5009
+f 3048/5661/5009 9744/5663/5011 13027/807/732 9417/835/760
+f 3042/4910/5003 3044/5662/5010 3049/5664/5012 3045/4915/5013
+f 3045/4915/5013 3049/5664/5012 9738/5655/4999 9737/4916/4996
+f 3044/5662/5010 9416/830/755 9415/829/754 3049/5664/5012
+f 3049/5664/5012 9415/829/754 13029/832/757 9738/5655/4999
+f 3042/4910/5003 3045/4915/5013 3050/5665/5014 3046/5658/5004
+f 3046/5658/5004 3050/5665/5014 9747/4915/211 9746/4910/210
+f 3045/4915/5013 9737/4916/4996 9736/5652/4995 3050/5665/5014
+f 3050/5665/5014 9736/5652/4995 13078/4916/205 9747/4915/211
+f 3051/4868/5015 3055/5666/5016 3056/5667/5017 3052/4867/5018
+f 3052/4867/5018 3056/5667/5017 9588/5398/4711 9587/4870/4709
+f 3055/5666/5016 9749/4868/230 9748/4867/243 3056/5667/5017
+f 3056/5667/5017 9748/4867/243 13052/4870/245 9588/5398/4711
+f 3051/4868/5015 3052/4867/5018 3057/5668/5019 3053/5669/5020
+f 3053/5669/5020 3057/5668/5019 9402/812/737 9401/805/730
+f 3052/4867/5018 9587/4870/4709 9586/5396/4708 3057/5668/5019
+f 3057/5668/5019 9586/5396/4708 13026/813/738 9402/812/737
+f 3051/4868/5015 3053/5669/5020 3058/5670/5021 3054/5671/5022
+f 3054/5671/5022 3058/5670/5021 9744/5663/5011 9743/4876/5008
+f 3053/5669/5020 9401/805/730 9400/804/729 3058/5670/5021
+f 3058/5670/5021 9400/804/729 13027/807/732 9744/5663/5011
+f 3051/4868/5015 3054/5671/5022 3059/5672/5023 3055/5666/5016
+f 3055/5666/5016 3059/5672/5023 9750/4875/231 9749/4868/230
+f 3054/5671/5022 9743/4876/5008 9742/5660/5007 3059/5672/5023
+f 3059/5672/5023 9742/5660/5007 13079/4876/225 9750/4875/231
+f 3060/5673/5024 3064/5674/5025 3065/5675/5026 3061/5676/5027
+f 3061/5676/5027 3065/5675/5026 10192/5677/5028 10193/5678/5029
+f 3064/5674/5025 8051/6/6 8050/5/5 3065/5675/5026
+f 3065/5675/5026 8050/5/5 12798/9/9 10192/5677/5028
+f 3060/5673/5024 3061/5676/5027 3066/5679/5030 3062/5680/5031
+f 3062/5680/5031 3066/5679/5030 10189/5681/5032 10190/5682/5033
+f 3061/5676/5027 10193/5678/5029 10194/5683/5034 3066/5679/5030
+f 3066/5679/5030 10194/5683/5034 13166/5684/5035 10189/5681/5032
+f 3060/5673/5024 3062/5680/5031 3067/5685/5036 3063/5686/5037
+f 3063/5686/5037 3067/5685/5036 9793/5687/5038 9794/5688/5039
+f 3062/5680/5031 10190/5682/5033 10191/5689/5040 3067/5685/5036
+f 3067/5685/5036 10191/5689/5040 13094/5690/5041 9793/5687/5038
+f 3060/5673/5024 3063/5686/5037 3068/5691/5042 3064/5674/5025
+f 3064/5674/5025 3068/5691/5042 8052/14/14 8051/6/6
+f 3063/5686/5037 9794/5688/5039 9795/5692/5043 3068/5691/5042
+f 3068/5691/5042 9795/5692/5043 12726/15/15 8052/14/14
+f 3069/5693/5044 3073/5694/5045 3074/5695/5046 3070/5696/5047
+f 3070/5696/5047 3074/5695/5046 10198/5697/5048 10199/5698/5049
+f 3073/5694/5045 10190/5682/5033 10189/5681/5032 3074/5695/5046
+f 3074/5695/5046 10189/5681/5032 13166/5684/5035 10198/5697/5048
+f 3069/5693/5044 3070/5696/5047 3075/5699/5050 3071/5700/5051
+f 3071/5700/5051 3075/5699/5050 10195/5701/5052 10196/5702/5053
+f 3070/5696/5047 10199/5698/5049 10200/5703/5054 3075/5699/5050
+f 3075/5699/5050 10200/5703/5054 13167/5704/5055 10195/5701/5052
+f 3069/5693/5044 3071/5700/5051 3076/5705/5056 3072/5706/5057
+f 3072/5706/5057 3076/5705/5056 9796/5707/5058 9797/5708/5059
+f 3071/5700/5051 10196/5702/5053 10197/5709/5060 3076/5705/5056
+f 3076/5705/5056 10197/5709/5060 13095/5710/5061 9796/5707/5058
+f 3069/5693/5044 3072/5706/5057 3077/5711/5062 3073/5694/5045
+f 3073/5694/5045 3077/5711/5062 10191/5689/5040 10190/5682/5033
+f 3072/5706/5057 9797/5708/5059 9798/5712/5063 3077/5711/5062
+f 3077/5711/5062 9798/5712/5063 13094/5690/5041 10191/5689/5040
+f 3078/5713/5064 3082/5714/5065 3083/5715/5066 3079/5716/5067
+f 3079/5716/5067 3083/5715/5066 10204/5717/5068 10205/5718/5069
+f 3082/5714/5065 10196/5702/5053 10195/5701/5052 3083/5715/5066
+f 3083/5715/5066 10195/5701/5052 13167/5704/5055 10204/5717/5068
+f 3078/5713/5064 3079/5716/5067 3084/5719/5070 3080/5720/5071
+f 3080/5720/5071 3084/5719/5070 10201/5721/5072 10202/5722/5073
+f 3079/5716/5067 10205/5718/5069 10206/5723/5074 3084/5719/5070
+f 3084/5719/5070 10206/5723/5074 13168/5724/5075 10201/5721/5072
+f 3078/5713/5064 3080/5720/5071 3085/5725/5076 3081/5726/5077
+f 3081/5726/5077 3085/5725/5076 9799/5727/5078 9800/5728/5079
+f 3080/5720/5071 10202/5722/5073 10203/5729/5080 3085/5725/5076
+f 3085/5725/5076 10203/5729/5080 13096/5730/5081 9799/5727/5078
+f 3078/5713/5064 3081/5726/5077 3086/5731/5082 3082/5714/5065
+f 3082/5714/5065 3086/5731/5082 10197/5709/5060 10196/5702/5053
+f 3081/5726/5077 9800/5728/5079 9801/5732/5083 3086/5731/5082
+f 3086/5731/5082 9801/5732/5083 13095/5710/5061 10197/5709/5060
+f 3087/5733/5084 3091/5734/5085 3092/5735/5086 3088/5736/5087
+f 3088/5736/5087 3092/5735/5086 10210/5737/5088 10211/5738/5089
+f 3091/5734/5085 10202/5722/5073 10201/5721/5072 3092/5735/5086
+f 3092/5735/5086 10201/5721/5072 13168/5724/5075 10210/5737/5088
+f 3087/5733/5084 3088/5736/5087 3093/5739/5090 3089/5740/5091
+f 3089/5740/5091 3093/5739/5090 10207/5741/5092 10208/5742/5093
+f 3088/5736/5087 10211/5738/5089 10212/5743/5094 3093/5739/5090
+f 3093/5739/5090 10212/5743/5094 13169/5744/5095 10207/5741/5092
+f 3087/5733/5084 3089/5740/5091 3094/5745/5096 3090/5746/5097
+f 3090/5746/5097 3094/5745/5096 9802/5747/5098 9803/5748/5099
+f 3089/5740/5091 10208/5742/5093 10209/5749/5100 3094/5745/5096
+f 3094/5745/5096 10209/5749/5100 13097/5750/5101 9802/5747/5098
+f 3087/5733/5084 3090/5746/5097 3095/5751/5102 3091/5734/5085
+f 3091/5734/5085 3095/5751/5102 10203/5729/5080 10202/5722/5073
+f 3090/5746/5097 9803/5748/5099 9804/5752/5103 3095/5751/5102
+f 3095/5751/5102 9804/5752/5103 13096/5730/5081 10203/5729/5080
+f 3096/5753/5104 3100/5754/5105 3101/5755/5106 3097/5756/5107
+f 3097/5756/5107 3101/5755/5106 10216/5757/5108 10217/5758/5109
+f 3100/5754/5105 10208/5742/5093 10207/5741/5092 3101/5755/5106
+f 3101/5755/5106 10207/5741/5092 13169/5744/5095 10216/5757/5108
+f 3096/5753/5104 3097/5756/5107 3102/5759/5110 3098/5760/5111
+f 3098/5760/5111 3102/5759/5110 10213/5761/5112 10214/5762/5113
+f 3097/5756/5107 10217/5758/5109 10218/5763/5114 3102/5759/5110
+f 3102/5759/5110 10218/5763/5114 13170/5764/5115 10213/5761/5112
+f 3096/5753/5104 3098/5760/5111 3103/5765/5116 3099/5766/5117
+f 3099/5766/5117 3103/5765/5116 9805/5767/5118 9806/5768/5119
+f 3098/5760/5111 10214/5762/5113 10215/5769/5120 3103/5765/5116
+f 3103/5765/5116 10215/5769/5120 13098/5770/5121 9805/5767/5118
+f 3096/5753/5104 3099/5766/5117 3104/5771/5122 3100/5754/5105
+f 3100/5754/5105 3104/5771/5122 10209/5749/5100 10208/5742/5093
+f 3099/5766/5117 9806/5768/5119 9807/5772/5123 3104/5771/5122
+f 3104/5771/5122 9807/5772/5123 13097/5750/5101 10209/5749/5100
+f 3105/5773/5124 3109/5774/5125 3110/5775/5126 3106/5776/5127
+f 3106/5776/5127 3110/5775/5126 10222/5777/5128 10223/5778/1221
+f 3109/5774/5125 10214/5762/5113 10213/5761/5112 3110/5775/5126
+f 3110/5775/5126 10213/5761/5112 13170/5764/5115 10222/5777/5128
+f 3105/5773/5124 3106/5776/5127 3111/5779/5129 3107/5780/5130
+f 3107/5780/5130 3111/5779/5129 10219/5781/5131 10220/5782/5132
+f 3106/5776/5127 10223/5778/1221 10224/5783/5133 3111/5779/5129
+f 3111/5779/5129 10224/5783/5133 13171/5784/5134 10219/5781/5131
+f 3105/5773/5124 3107/5780/5130 3112/5785/5135 3108/5786/5136
+f 3108/5786/5136 3112/5785/5135 9808/5787/5137 9809/5788/5138
+f 3107/5780/5130 10220/5782/5132 10221/5789/5139 3112/5785/5135
+f 3112/5785/5135 10221/5789/5139 13099/5790/5140 9808/5787/5137
+f 3105/5773/5124 3108/5786/5136 3113/5791/5141 3109/5774/5125
+f 3109/5774/5125 3113/5791/5141 10215/5769/5120 10214/5762/5113
+f 3108/5786/5136 9809/5788/5138 9810/5792/5142 3113/5791/5141
+f 3113/5791/5141 9810/5792/5142 13098/5770/5121 10215/5769/5120
+f 3114/5793/5143 3118/5794/5144 3119/5795/5145 3115/5796/5146
+f 3115/5796/5146 3119/5795/5145 10228/5797/5147 10229/5798/5148
+f 3118/5794/5144 10220/5782/5132 10219/5781/5131 3119/5795/5145
+f 3119/5795/5145 10219/5781/5131 13171/5784/5134 10228/5797/5147
+f 3114/5793/5143 3115/5796/5146 3120/5799/5149 3116/5800/5150
+f 3116/5800/5150 3120/5799/5149 10225/5801/5151 10226/5802/5152
+f 3115/5796/5146 10229/5798/5148 10230/5803/5153 3120/5799/5149
+f 3120/5799/5149 10230/5803/5153 13172/5804/1182 10225/5801/5151
+f 3114/5793/5143 3116/5800/5150 3121/5805/5154 3117/5806/5155
+f 3117/5806/5155 3121/5805/5154 9811/5807/5156 9812/5808/5157
+f 3116/5800/5150 10226/5802/5152 10227/5809/5158 3121/5805/5154
+f 3121/5805/5154 10227/5809/5158 13100/5810/5159 9811/5807/5156
+f 3114/5793/5143 3117/5806/5155 3122/5811/5160 3118/5794/5144
+f 3118/5794/5144 3122/5811/5160 10221/5789/5139 10220/5782/5132
+f 3117/5806/5155 9812/5808/5157 9813/5812/5161 3122/5811/5160
+f 3122/5811/5160 9813/5812/5161 13099/5790/5140 10221/5789/5139
+f 3123/5813/5162 3127/5814/5163 3128/5815/5164 3124/5816/5165
+f 3124/5816/5165 3128/5815/5164 10234/5817/1181 10235/5818/1176
+f 3127/5814/5163 10226/5802/5152 10225/5801/5151 3128/5815/5164
+f 3128/5815/5164 10225/5801/5151 13172/5804/1182 10234/5817/1181
+f 3123/5813/5162 3124/5816/5165 3129/5819/5166 3125/5820/5167
+f 3125/5820/5167 3129/5819/5166 10231/5821/5168 10232/5822/5169
+f 3124/5816/5165 10235/5818/1176 10236/5823/1175 3129/5819/5166
+f 3129/5819/5166 10236/5823/1175 13173/5824/1162 10231/5821/5168
+f 3123/5813/5162 3125/5820/5167 3130/5825/5170 3126/5826/5171
+f 3126/5826/5171 3130/5825/5170 9814/5827/5172 9815/5828/5173
+f 3125/5820/5167 10232/5822/5169 10233/5829/5174 3130/5825/5170
+f 3130/5825/5170 10233/5829/5174 13101/5830/5175 9814/5827/5172
+f 3123/5813/5162 3126/5826/5171 3131/5831/5176 3127/5814/5163
+f 3127/5814/5163 3131/5831/5176 10227/5809/5158 10226/5802/5152
+f 3126/5826/5171 9815/5828/5173 9816/5832/5177 3131/5831/5176
+f 3131/5831/5176 9816/5832/5177 13100/5810/5159 10227/5809/5158
+f 3132/5833/5178 3136/5834/5179 3137/5835/5180 3133/5836/5181
+f 3133/5836/5181 3137/5835/5180 10240/5837/1161 10241/5838/1156
+f 3136/5834/5179 10232/5822/5169 10231/5821/5168 3137/5835/5180
+f 3137/5835/5180 10231/5821/5168 13173/5824/1162 10240/5837/1161
+f 3132/5833/5178 3133/5836/5181 3138/5839/5182 3134/5840/5183
+f 3134/5840/5183 3138/5839/5182 10237/5841/5184 10238/5842/5185
+f 3133/5836/5181 10241/5838/1156 10242/5843/1155 3138/5839/5182
+f 3138/5839/5182 10242/5843/1155 13174/5844/1142 10237/5841/5184
+f 3132/5833/5178 3134/5840/5183 3139/5845/5186 3135/5846/5187
+f 3135/5846/5187 3139/5845/5186 9817/5847/5188 9818/5848/5189
+f 3134/5840/5183 10238/5842/5185 10239/5849/5190 3139/5845/5186
+f 3139/5845/5186 10239/5849/5190 13102/5850/5191 9817/5847/5188
+f 3132/5833/5178 3135/5846/5187 3140/5851/5192 3136/5834/5179
+f 3136/5834/5179 3140/5851/5192 10233/5829/5174 10232/5822/5169
+f 3135/5846/5187 9818/5848/5189 9819/5852/5193 3140/5851/5192
+f 3140/5851/5192 9819/5852/5193 13101/5830/5175 10233/5829/5174
+f 3141/5853/5194 3145/5854/5195 3146/5855/5196 3142/5856/5197
+f 3142/5856/5197 3146/5855/5196 10246/5857/1141 10247/5858/1136
+f 3145/5854/5195 10238/5842/5185 10237/5841/5184 3146/5855/5196
+f 3146/5855/5196 10237/5841/5184 13174/5844/1142 10246/5857/1141
+f 3141/5853/5194 3142/5856/5197 3147/5859/5198 3143/5860/5199
+f 3143/5860/5199 3147/5859/5198 10243/5861/5200 10244/5862/5201
+f 3142/5856/5197 10247/5858/1136 10248/5863/1135 3147/5859/5198
+f 3147/5859/5198 10248/5863/1135 13175/5864/1122 10243/5861/5200
+f 3141/5853/5194 3143/5860/5199 3148/5865/5202 3144/5866/5203
+f 3144/5866/5203 3148/5865/5202 9820/5867/5204 9821/5868/5205
+f 3143/5860/5199 10244/5862/5201 10245/5869/5206 3148/5865/5202
+f 3148/5865/5202 10245/5869/5206 13103/5870/5207 9820/5867/5204
+f 3141/5853/5194 3144/5866/5203 3149/5871/5208 3145/5854/5195
+f 3145/5854/5195 3149/5871/5208 10239/5849/5190 10238/5842/5185
+f 3144/5866/5203 9821/5868/5205 9822/5872/5209 3149/5871/5208
+f 3149/5871/5208 9822/5872/5209 13102/5850/5191 10239/5849/5190
+f 3150/5873/5210 3154/5874/5211 3155/5875/5212 3151/5876/5213
+f 3151/5876/5213 3155/5875/5212 10252/5877/1121 10253/5878/1116
+f 3154/5874/5211 10244/5862/5201 10243/5861/5200 3155/5875/5212
+f 3155/5875/5212 10243/5861/5200 13175/5864/1122 10252/5877/1121
+f 3150/5873/5210 3151/5876/5213 3156/5879/5214 3152/5880/5215
+f 3152/5880/5215 3156/5879/5214 10249/5881/5216 10250/5882/5217
+f 3151/5876/5213 10253/5878/1116 10254/5883/1115 3156/5879/5214
+f 3156/5879/5214 10254/5883/1115 13176/5884/1102 10249/5881/5216
+f 3150/5873/5210 3152/5880/5215 3157/5885/5218 3153/5886/5219
+f 3153/5886/5219 3157/5885/5218 9823/5887/5220 9824/5888/5221
+f 3152/5880/5215 10250/5882/5217 10251/5889/5222 3157/5885/5218
+f 3157/5885/5218 10251/5889/5222 13104/5890/5223 9823/5887/5220
+f 3150/5873/5210 3153/5886/5219 3158/5891/5224 3154/5874/5211
+f 3154/5874/5211 3158/5891/5224 10245/5869/5206 10244/5862/5201
+f 3153/5886/5219 9824/5888/5221 9825/5892/5225 3158/5891/5224
+f 3158/5891/5224 9825/5892/5225 13103/5870/5207 10245/5869/5206
+f 3159/5893/5226 3163/5894/5227 3164/5895/5228 3160/5896/5229
+f 3160/5896/5229 3164/5895/5228 10258/5897/1101 10259/5898/1096
+f 3163/5894/5227 10250/5882/5217 10249/5881/5216 3164/5895/5228
+f 3164/5895/5228 10249/5881/5216 13176/5884/1102 10258/5897/1101
+f 3159/5893/5226 3160/5896/5229 3165/5899/5230 3161/5900/5231
+f 3161/5900/5231 3165/5899/5230 10255/5901/5232 10256/5902/5233
+f 3160/5896/5229 10259/5898/1096 10260/5903/1095 3165/5899/5230
+f 3165/5899/5230 10260/5903/1095 13177/5904/1082 10255/5901/5232
+f 3159/5893/5226 3161/5900/5231 3166/5905/5234 3162/5906/5235
+f 3162/5906/5235 3166/5905/5234 9826/5907/5236 9827/5908/5237
+f 3161/5900/5231 10256/5902/5233 10257/5909/5238 3166/5905/5234
+f 3166/5905/5234 10257/5909/5238 13105/5910/5239 9826/5907/5236
+f 3159/5893/5226 3162/5906/5235 3167/5911/5240 3163/5894/5227
+f 3163/5894/5227 3167/5911/5240 10251/5889/5222 10250/5882/5217
+f 3162/5906/5235 9827/5908/5237 9828/5912/5241 3167/5911/5240
+f 3167/5911/5240 9828/5912/5241 13104/5890/5223 10251/5889/5222
+f 3168/5913/5242 3172/5914/5243 3173/5915/5244 3169/5916/5245
+f 3169/5916/5245 3173/5915/5244 10264/5917/5246 10265/5918/5247
+f 3172/5914/5243 10256/5902/5233 10255/5901/5232 3173/5915/5244
+f 3173/5915/5244 10255/5901/5232 13177/5904/1082 10264/5917/5246
+f 3168/5913/5242 3169/5916/5245 3174/5919/5248 3170/5920/5249
+f 3170/5920/5249 3174/5919/5248 10261/5921/5250 10262/5922/5251
+f 3169/5916/5245 10265/5918/5247 10266/5923/5252 3174/5919/5248
+f 3174/5919/5248 10266/5923/5252 13178/5924/5253 10261/5921/5250
+f 3168/5913/5242 3170/5920/5249 3175/5925/5254 3171/5926/5255
+f 3171/5926/5255 3175/5925/5254 9829/5927/5256 9830/5928/5257
+f 3170/5920/5249 10262/5922/5251 10263/5929/5258 3175/5925/5254
+f 3175/5925/5254 10263/5929/5258 13106/5930/5259 9829/5927/5256
+f 3168/5913/5242 3171/5926/5255 3176/5931/5260 3172/5914/5243
+f 3172/5914/5243 3176/5931/5260 10257/5909/5238 10256/5902/5233
+f 3171/5926/5255 9830/5928/5257 9831/5932/5261 3176/5931/5260
+f 3176/5931/5260 9831/5932/5261 13105/5910/5239 10257/5909/5238
+f 3177/5933/5262 3181/5934/5263 3182/5935/5264 3178/5936/5265
+f 3178/5936/5265 3182/5935/5264 11236/5937/5266 11237/5938/5267
+f 3181/5934/5263 11240/5939/5268 11241/5940/5269 3182/5935/5264
+f 3182/5935/5264 11241/5940/5269 13339/5941/1056 11236/5937/5266
+f 3177/5933/5262 3178/5936/5265 3183/5942/5270 3179/5943/5271
+f 3179/5943/5271 3183/5942/5270 10267/5944/5272 10268/5945/5273
+f 3178/5936/5265 11237/5938/5267 11238/5946/5274 3183/5942/5270
+f 3183/5942/5270 11238/5946/5274 13179/5947/5275 10267/5944/5272
+f 3177/5933/5262 3179/5943/5271 3184/5948/5276 3180/5949/5277
+f 3180/5949/5277 3184/5948/5276 11230/5950/5278 11231/5951/5279
+f 3179/5943/5271 10268/5945/5273 10269/5952/5280 3184/5948/5276
+f 3184/5948/5276 10269/5952/5280 13107/5953/5281 11230/5950/5278
+f 3177/5933/5262 3180/5949/5277 3185/5954/5282 3181/5934/5263
+f 3181/5934/5263 3185/5954/5282 11239/5955/5283 11240/5939/5268
+f 3180/5949/5277 11231/5951/5279 11232/5956/5284 3185/5954/5282
+f 3185/5954/5282 11232/5956/5284 13338/5957/5285 11239/5955/5283
+f 3186/5958/5286 3190/5959/5287 3191/5960/5288 3187/5961/5289
+f 3187/5961/5289 3191/5960/5288 9795/5692/5043 9794/5688/5039
+f 3190/5959/5287 7712/276/276 7711/275/275 3191/5960/5288
+f 3191/5960/5288 7711/275/275 12726/15/15 9795/5692/5043
+f 3186/5958/5286 3187/5961/5289 3192/5962/5290 3188/5963/5291
+f 3188/5963/5291 3192/5962/5290 9838/5964/5292 9839/5965/5293
+f 3187/5961/5289 9794/5688/5039 9793/5687/5038 3192/5962/5290
+f 3192/5962/5290 9793/5687/5038 13094/5690/5041 9838/5964/5292
+f 3186/5958/5286 3188/5963/5291 3193/5966/5294 3189/5967/5295
+f 3189/5967/5295 3193/5966/5294 10054/5968/279 10055/5969/279
+f 3188/5963/5291 9839/5965/5293 9840/5970/5296 3193/5966/5294
+f 3193/5966/5294 9840/5970/5296 13137/5971/279 10054/5968/279
+f 3186/5958/5286 3189/5967/5295 3194/5972/5297 3190/5959/5287
+f 3190/5959/5287 3194/5972/5297 7713/281/280 7712/276/276
+f 3189/5967/5295 10055/5969/279 10056/5973/279 3194/5972/5297
+f 3194/5972/5297 10056/5973/279 12769/282/279 7713/281/280
+f 3195/5974/5298 3199/5975/5299 3200/5976/5300 3196/5977/5301
+f 3196/5977/5301 3200/5976/5300 9798/5712/5063 9797/5708/5059
+f 3199/5975/5299 9839/5965/5293 9838/5964/5292 3200/5976/5300
+f 3200/5976/5300 9838/5964/5292 13094/5690/5041 9798/5712/5063
+f 3195/5974/5298 3196/5977/5301 3201/5978/5302 3197/5979/5303
+f 3197/5979/5303 3201/5978/5302 9841/5980/5304 9842/5981/5305
+f 3196/5977/5301 9797/5708/5059 9796/5707/5058 3201/5978/5302
+f 3201/5978/5302 9796/5707/5058 13095/5710/5061 9841/5980/5304
+f 3195/5974/5298 3197/5979/5303 3202/5982/5306 3198/5983/5307
+f 3198/5983/5307 3202/5982/5306 10051/5984/279 10052/5985/279
+f 3197/5979/5303 9842/5981/5305 9843/5986/5308 3202/5982/5306
+f 3202/5982/5306 9843/5986/5308 13136/5987/279 10051/5984/279
+f 3195/5974/5298 3198/5983/5307 3203/5988/5309 3199/5975/5299
+f 3199/5975/5299 3203/5988/5309 9840/5970/5296 9839/5965/5293
+f 3198/5983/5307 10052/5985/279 10053/5989/279 3203/5988/5309
+f 3203/5988/5309 10053/5989/279 13137/5971/279 9840/5970/5296
+f 3204/5990/5310 3208/5991/5311 3209/5992/5312 3205/5993/5313
+f 3205/5993/5313 3209/5992/5312 9801/5732/5083 9800/5728/5079
+f 3208/5991/5311 9842/5981/5305 9841/5980/5304 3209/5992/5312
+f 3209/5992/5312 9841/5980/5304 13095/5710/5061 9801/5732/5083
+f 3204/5990/5310 3205/5993/5313 3210/5994/5314 3206/5995/5315
+f 3206/5995/5315 3210/5994/5314 9844/5996/5316 9845/5997/5317
+f 3205/5993/5313 9800/5728/5079 9799/5727/5078 3210/5994/5314
+f 3210/5994/5314 9799/5727/5078 13096/5730/5081 9844/5996/5316
+f 3204/5990/5310 3206/5995/5315 3211/5998/5318 3207/5999/5319
+f 3207/5999/5319 3211/5998/5318 10045/6000/279 10046/6001/279
+f 3206/5995/5315 9845/5997/5317 9846/6002/5320 3211/5998/5318
+f 3211/5998/5318 9846/6002/5320 13135/6003/279 10045/6000/279
+f 3204/5990/5310 3207/5999/5319 3212/6004/5321 3208/5991/5311
+f 3208/5991/5311 3212/6004/5321 9843/5986/5308 9842/5981/5305
+f 3207/5999/5319 10046/6001/279 10047/6005/279 3212/6004/5321
+f 3212/6004/5321 10047/6005/279 13136/5987/279 9843/5986/5308
+f 3213/6006/5322 3217/6007/5323 3218/6008/5324 3214/6009/5325
+f 3214/6009/5325 3218/6008/5324 9804/5752/5103 9803/5748/5099
+f 3217/6007/5323 9845/5997/5317 9844/5996/5316 3218/6008/5324
+f 3218/6008/5324 9844/5996/5316 13096/5730/5081 9804/5752/5103
+f 3213/6006/5322 3214/6009/5325 3219/6010/5326 3215/6011/5327
+f 3215/6011/5327 3219/6010/5326 9847/6012/5328 9848/6013/5329
+f 3214/6009/5325 9803/5748/5099 9802/5747/5098 3219/6010/5326
+f 3219/6010/5326 9802/5747/5098 13097/5750/5101 9847/6012/5328
+f 3213/6006/5322 3215/6011/5327 3220/6014/5330 3216/6015/5331
+f 3216/6015/5331 3220/6014/5330 10039/6016/279 10040/6017/279
+f 3215/6011/5327 9848/6013/5329 9849/6018/5332 3220/6014/5330
+f 3220/6014/5330 9849/6018/5332 13134/6019/279 10039/6016/279
+f 3213/6006/5322 3216/6015/5331 3221/6020/5333 3217/6007/5323
+f 3217/6007/5323 3221/6020/5333 9846/6002/5320 9845/5997/5317
+f 3216/6015/5331 10040/6017/279 10041/6021/279 3221/6020/5333
+f 3221/6020/5333 10041/6021/279 13135/6003/279 9846/6002/5320
+f 3222/6022/5334 3226/6023/5335 3227/6024/5336 3223/6025/5337
+f 3223/6025/5337 3227/6024/5336 9807/5772/5123 9806/5768/5119
+f 3226/6023/5335 9848/6013/5329 9847/6012/5328 3227/6024/5336
+f 3227/6024/5336 9847/6012/5328 13097/5750/5101 9807/5772/5123
+f 3222/6022/5334 3223/6025/5337 3228/6026/5338 3224/6027/5339
+f 3224/6027/5339 3228/6026/5338 9850/6028/5340 9851/6029/5341
+f 3223/6025/5337 9806/5768/5119 9805/5767/5118 3228/6026/5338
+f 3228/6026/5338 9805/5767/5118 13098/5770/5121 9850/6028/5340
+f 3222/6022/5334 3224/6027/5339 3229/6030/5342 3225/6031/5343
+f 3225/6031/5343 3229/6030/5342 10033/6032/279 10034/6033/279
+f 3224/6027/5339 9851/6029/5341 9852/6034/5344 3229/6030/5342
+f 3229/6030/5342 9852/6034/5344 13133/6035/279 10033/6032/279
+f 3222/6022/5334 3225/6031/5343 3230/6036/5345 3226/6023/5335
+f 3226/6023/5335 3230/6036/5345 9849/6018/5332 9848/6013/5329
+f 3225/6031/5343 10034/6033/279 10035/6037/279 3230/6036/5345
+f 3230/6036/5345 10035/6037/279 13134/6019/279 9849/6018/5332
+f 3231/6038/5346 3235/6039/5347 3236/6040/5348 3232/6041/5349
+f 3232/6041/5349 3236/6040/5348 9810/5792/5142 9809/5788/5138
+f 3235/6039/5347 9851/6029/5341 9850/6028/5340 3236/6040/5348
+f 3236/6040/5348 9850/6028/5340 13098/5770/5121 9810/5792/5142
+f 3231/6038/5346 3232/6041/5349 3237/6042/5350 3233/6043/5351
+f 3233/6043/5351 3237/6042/5350 9853/6044/5352 9854/6045/5353
+f 3232/6041/5349 9809/5788/5138 9808/5787/5137 3237/6042/5350
+f 3237/6042/5350 9808/5787/5137 13099/5790/5140 9853/6044/5352
+f 3231/6038/5346 3233/6043/5351 3238/6046/5354 3234/6047/5355
+f 3234/6047/5355 3238/6046/5354 10027/6048/279 10028/6049/279
+f 3233/6043/5351 9854/6045/5353 9855/6050/5356 3238/6046/5354
+f 3238/6046/5354 9855/6050/5356 13132/6051/279 10027/6048/279
+f 3231/6038/5346 3234/6047/5355 3239/6052/5357 3235/6039/5347
+f 3235/6039/5347 3239/6052/5357 9852/6034/5344 9851/6029/5341
+f 3234/6047/5355 10028/6049/279 10029/6053/279 3239/6052/5357
+f 3239/6052/5357 10029/6053/279 13133/6035/279 9852/6034/5344
+f 3240/6054/5358 3244/6055/5359 3245/6056/5360 3241/6057/5361
+f 3241/6057/5361 3245/6056/5360 9813/5812/5161 9812/5808/5157
+f 3244/6055/5359 9854/6045/5353 9853/6044/5352 3245/6056/5360
+f 3245/6056/5360 9853/6044/5352 13099/5790/5140 9813/5812/5161
+f 3240/6054/5358 3241/6057/5361 3246/6058/5362 3242/6059/5363
+f 3242/6059/5363 3246/6058/5362 9856/6060/5364 9857/6061/5365
+f 3241/6057/5361 9812/5808/5157 9811/5807/5156 3246/6058/5362
+f 3246/6058/5362 9811/5807/5156 13100/5810/5159 9856/6060/5364
+f 3240/6054/5358 3242/6059/5363 3247/6062/5366 3243/6063/5367
+f 3243/6063/5367 3247/6062/5366 10021/6064/279 10022/6065/279
+f 3242/6059/5363 9857/6061/5365 9858/6066/5368 3247/6062/5366
+f 3247/6062/5366 9858/6066/5368 13131/6067/279 10021/6064/279
+f 3240/6054/5358 3243/6063/5367 3248/6068/5369 3244/6055/5359
+f 3244/6055/5359 3248/6068/5369 9855/6050/5356 9854/6045/5353
+f 3243/6063/5367 10022/6065/279 10023/6069/279 3248/6068/5369
+f 3248/6068/5369 10023/6069/279 13132/6051/279 9855/6050/5356
+f 3249/6070/5370 3253/6071/5371 3254/6072/5372 3250/6073/5373
+f 3250/6073/5373 3254/6072/5372 9816/5832/5177 9815/5828/5173
+f 3253/6071/5371 9857/6061/5365 9856/6060/5364 3254/6072/5372
+f 3254/6072/5372 9856/6060/5364 13100/5810/5159 9816/5832/5177
+f 3249/6070/5370 3250/6073/5373 3255/6074/5374 3251/6075/5375
+f 3251/6075/5375 3255/6074/5374 9859/6076/5376 9860/6077/5377
+f 3250/6073/5373 9815/5828/5173 9814/5827/5172 3255/6074/5374
+f 3255/6074/5374 9814/5827/5172 13101/5830/5175 9859/6076/5376
+f 3249/6070/5370 3251/6075/5375 3256/6078/5378 3252/6079/5379
+f 3252/6079/5379 3256/6078/5378 10015/6080/279 10016/6081/279
+f 3251/6075/5375 9860/6077/5377 9861/6082/5380 3256/6078/5378
+f 3256/6078/5378 9861/6082/5380 13130/6083/279 10015/6080/279
+f 3249/6070/5370 3252/6079/5379 3257/6084/5381 3253/6071/5371
+f 3253/6071/5371 3257/6084/5381 9858/6066/5368 9857/6061/5365
+f 3252/6079/5379 10016/6081/279 10017/6085/279 3257/6084/5381
+f 3257/6084/5381 10017/6085/279 13131/6067/279 9858/6066/5368
+f 3258/6086/5382 3262/6087/5383 3263/6088/5384 3259/6089/5385
+f 3259/6089/5385 3263/6088/5384 9819/5852/5193 9818/5848/5189
+f 3262/6087/5383 9860/6077/5377 9859/6076/5376 3263/6088/5384
+f 3263/6088/5384 9859/6076/5376 13101/5830/5175 9819/5852/5193
+f 3258/6086/5382 3259/6089/5385 3264/6090/5386 3260/6091/5387
+f 3260/6091/5387 3264/6090/5386 9862/6092/5388 9863/6093/5389
+f 3259/6089/5385 9818/5848/5189 9817/5847/5188 3264/6090/5386
+f 3264/6090/5386 9817/5847/5188 13102/5850/5191 9862/6092/5388
+f 3258/6086/5382 3260/6091/5387 3265/6094/5390 3261/6095/5391
+f 3261/6095/5391 3265/6094/5390 10009/6096/279 10010/6097/279
+f 3260/6091/5387 9863/6093/5389 9864/6098/5392 3265/6094/5390
+f 3265/6094/5390 9864/6098/5392 13129/6099/279 10009/6096/279
+f 3258/6086/5382 3261/6095/5391 3266/6100/5393 3262/6087/5383
+f 3262/6087/5383 3266/6100/5393 9861/6082/5380 9860/6077/5377
+f 3261/6095/5391 10010/6097/279 10011/6101/279 3266/6100/5393
+f 3266/6100/5393 10011/6101/279 13130/6083/279 9861/6082/5380
+f 3267/6102/5394 3271/6103/5395 3272/6104/5396 3268/6105/5397
+f 3268/6105/5397 3272/6104/5396 9822/5872/5209 9821/5868/5205
+f 3271/6103/5395 9863/6093/5389 9862/6092/5388 3272/6104/5396
+f 3272/6104/5396 9862/6092/5388 13102/5850/5191 9822/5872/5209
+f 3267/6102/5394 3268/6105/5397 3273/6106/5398 3269/6107/5399
+f 3269/6107/5399 3273/6106/5398 9865/6108/5400 9866/6109/5401
+f 3268/6105/5397 9821/5868/5205 9820/5867/5204 3273/6106/5398
+f 3273/6106/5398 9820/5867/5204 13103/5870/5207 9865/6108/5400
+f 3267/6102/5394 3269/6107/5399 3274/6110/5402 3270/6111/5403
+f 3270/6111/5403 3274/6110/5402 10003/6112/279 10004/6113/279
+f 3269/6107/5399 9866/6109/5401 9867/6114/5404 3274/6110/5402
+f 3274/6110/5402 9867/6114/5404 13128/6115/279 10003/6112/279
+f 3267/6102/5394 3270/6111/5403 3275/6116/5405 3271/6103/5395
+f 3271/6103/5395 3275/6116/5405 9864/6098/5392 9863/6093/5389
+f 3270/6111/5403 10004/6113/279 10005/6117/279 3275/6116/5405
+f 3275/6116/5405 10005/6117/279 13129/6099/279 9864/6098/5392
+f 3276/6118/5406 3280/6119/5407 3281/6120/5408 3277/6121/5409
+f 3277/6121/5409 3281/6120/5408 9825/5892/5225 9824/5888/5221
+f 3280/6119/5407 9866/6109/5401 9865/6108/5400 3281/6120/5408
+f 3281/6120/5408 9865/6108/5400 13103/5870/5207 9825/5892/5225
+f 3276/6118/5406 3277/6121/5409 3282/6122/5410 3278/6123/5411
+f 3278/6123/5411 3282/6122/5410 9868/6124/5412 9869/6125/5413
+f 3277/6121/5409 9824/5888/5221 9823/5887/5220 3282/6122/5410
+f 3282/6122/5410 9823/5887/5220 13104/5890/5223 9868/6124/5412
+f 3276/6118/5406 3278/6123/5411 3283/6126/5414 3279/6127/5415
+f 3279/6127/5415 3283/6126/5414 9997/6128/279 9998/6129/279
+f 3278/6123/5411 9869/6125/5413 9870/6130/5416 3283/6126/5414
+f 3283/6126/5414 9870/6130/5416 13127/6131/279 9997/6128/279
+f 3276/6118/5406 3279/6127/5415 3284/6132/5417 3280/6119/5407
+f 3280/6119/5407 3284/6132/5417 9867/6114/5404 9866/6109/5401
+f 3279/6127/5415 9998/6129/279 9999/6133/279 3284/6132/5417
+f 3284/6132/5417 9999/6133/279 13128/6115/279 9867/6114/5404
+f 3285/6134/5418 3289/6135/5419 3290/6136/5420 3286/6137/5421
+f 3286/6137/5421 3290/6136/5420 9828/5912/5241 9827/5908/5237
+f 3289/6135/5419 9869/6125/5413 9868/6124/5412 3290/6136/5420
+f 3290/6136/5420 9868/6124/5412 13104/5890/5223 9828/5912/5241
+f 3285/6134/5418 3286/6137/5421 3291/6138/5422 3287/6139/5423
+f 3287/6139/5423 3291/6138/5422 9871/6140/5424 9872/6141/5425
+f 3286/6137/5421 9827/5908/5237 9826/5907/5236 3291/6138/5422
+f 3291/6138/5422 9826/5907/5236 13105/5910/5239 9871/6140/5424
+f 3285/6134/5418 3287/6139/5423 3292/6142/5426 3288/6143/5427
+f 3288/6143/5427 3292/6142/5426 9991/6144/279 9992/6145/279
+f 3287/6139/5423 9872/6141/5425 9873/6146/5428 3292/6142/5426
+f 3292/6142/5426 9873/6146/5428 13126/6147/279 9991/6144/279
+f 3285/6134/5418 3288/6143/5427 3293/6148/5429 3289/6135/5419
+f 3289/6135/5419 3293/6148/5429 9870/6130/5416 9869/6125/5413
+f 3288/6143/5427 9992/6145/279 9993/6149/279 3293/6148/5429
+f 3293/6148/5429 9993/6149/279 13127/6131/279 9870/6130/5416
+f 3294/6150/5430 3298/6151/5431 3299/6152/5432 3295/6153/5433
+f 3295/6153/5433 3299/6152/5432 9831/5932/5261 9830/5928/5257
+f 3298/6151/5431 9872/6141/5425 9871/6140/5424 3299/6152/5432
+f 3299/6152/5432 9871/6140/5424 13105/5910/5239 9831/5932/5261
+f 3294/6150/5430 3295/6153/5433 3300/6154/5434 3296/6155/5435
+f 3296/6155/5435 3300/6154/5434 9874/6156/5436 9875/6157/5437
+f 3295/6153/5433 9830/5928/5257 9829/5927/5256 3300/6154/5434
+f 3300/6154/5434 9829/5927/5256 13106/5930/5259 9874/6156/5436
+f 3294/6150/5430 3296/6155/5435 3301/6158/5438 3297/6159/5439
+f 3297/6159/5439 3301/6158/5438 9985/6160/279 9986/6161/279
+f 3296/6155/5435 9875/6157/5437 9876/6162/5440 3301/6158/5438
+f 3301/6158/5438 9876/6162/5440 13125/6163/279 9985/6160/279
+f 3294/6150/5430 3297/6159/5439 3302/6164/5441 3298/6151/5431
+f 3298/6151/5431 3302/6164/5441 9873/6146/5428 9872/6141/5425
+f 3297/6159/5439 9986/6161/279 9987/6165/279 3302/6164/5441
+f 3302/6164/5441 9987/6165/279 13126/6147/279 9873/6146/5428
+f 3303/6166/5442 3307/6167/5443 3308/6168/5444 3304/6169/5445
+f 3304/6169/5445 3308/6168/5444 11232/5956/5284 11231/5951/5279
+f 3307/6167/5443 11234/6170/5446 11235/6171/5447 3308/6168/5444
+f 3308/6168/5444 11235/6171/5447 13338/5957/5285 11232/5956/5284
+f 3303/6166/5442 3304/6169/5445 3309/6172/5448 3305/6173/5449
+f 3305/6173/5449 3309/6172/5448 9877/6174/5450 9878/6175/5451
+f 3304/6169/5445 11231/5951/5279 11230/5950/5278 3309/6172/5448
+f 3309/6172/5448 11230/5950/5278 13107/5953/5281 9877/6174/5450
+f 3303/6166/5442 3305/6173/5449 3310/6176/5452 3306/6177/5453
+f 3306/6177/5453 3310/6176/5452 9979/6178/5454 9980/6179/5455
+f 3305/6173/5449 9878/6175/5451 9879/6180/5456 3310/6176/5452
+f 3310/6176/5452 9879/6180/5456 13124/6181/5457 9979/6178/5454
+f 3303/6166/5442 3306/6177/5453 3311/6182/5458 3307/6167/5443
+f 3307/6167/5443 3311/6182/5458 11233/6183/5459 11234/6170/5446
+f 3306/6177/5453 9980/6179/5455 9981/6184/5460 3311/6182/5458
+f 3311/6182/5458 9981/6184/5460 13337/6185/279 11233/6183/5459
+f 3312/6186/5461 3316/6187/5462 3317/6188/5463 3313/6189/5464
+f 3313/6189/5464 3317/6188/5463 10269/6190/5280 10268/6191/5273
+f 3316/6187/5462 9878/6192/5451 9877/6193/5450 3317/6188/5463
+f 3317/6188/5463 9877/6193/5450 13107/6194/5281 10269/6190/5280
+f 3312/6186/5461 3313/6189/5464 3318/6195/5465 3314/6196/5466
+f 3314/6196/5466 3318/6195/5465 10276/6197/5467 10277/6198/5468
+f 3313/6189/5464 10268/6191/5273 10267/6199/5272 3318/6195/5465
+f 3318/6195/5465 10267/6199/5272 13179/6200/5275 10276/6197/5467
+f 3312/6186/5461 3314/6196/5466 3319/6201/5469 3315/6202/5470
+f 3315/6202/5470 3319/6201/5469 10273/6203/5471 10274/6204/5472
+f 3314/6196/5466 10277/6198/5468 10278/6205/5473 3319/6201/5469
+f 3319/6201/5469 10278/6205/5473 13180/6206/5474 10273/6203/5471
+f 3312/6186/5461 3315/6202/5470 3320/6207/5475 3316/6187/5462
+f 3316/6187/5462 3320/6207/5475 9879/6208/5456 9878/6192/5451
+f 3315/6202/5470 10274/6204/5472 10275/6209/5476 3320/6207/5475
+f 3320/6207/5475 10275/6209/5476 13124/6210/5457 9879/6208/5456
+f 3321/6211/5477 3325/6212/5478 3326/6213/5479 3322/6214/5480
+f 3322/6214/5480 3326/6213/5479 10275/6209/5476 10274/6204/5472
+f 3325/6212/5478 9974/6215/5481 9975/6216/5482 3326/6213/5479
+f 3326/6213/5479 9975/6216/5482 13124/6210/5457 10275/6209/5476
+f 3321/6211/5477 3322/6214/5480 3327/6217/5483 3323/6218/5484
+f 3323/6218/5484 3327/6217/5483 10282/6219/5474 10283/6220/5474
+f 3322/6214/5480 10274/6204/5472 10273/6203/5471 3327/6217/5483
+f 3327/6217/5483 10273/6203/5471 13180/6206/5474 10282/6219/5474
+f 3321/6211/5477 3323/6218/5484 3328/6221/5485 3324/6222/5486
+f 3324/6222/5486 3328/6221/5485 10279/6223/5487 10280/6224/5488
+f 3323/6218/5484 10283/6220/5474 10284/6225/5474 3328/6221/5485
+f 3328/6221/5485 10284/6225/5474 13181/6226/5474 10279/6223/5487
+f 3321/6211/5477 3324/6222/5486 3329/6227/5489 3325/6212/5478
+f 3325/6212/5478 3329/6227/5489 9973/6228/5490 9974/6215/5481
+f 3324/6222/5486 10280/6224/5488 10281/6229/5491 3329/6227/5489
+f 3329/6227/5489 10281/6229/5491 13139/6230/5492 9973/6228/5490
+f 3330/6231/5493 3334/6232/5494 3335/6233/5495 3331/6234/5496
+f 3331/6234/5496 3335/6233/5495 9981/6184/5460 9980/6179/5455
+f 3334/6232/5494 11228/6235/5497 11229/6236/5498 3335/6233/5495
+f 3335/6233/5495 11229/6236/5498 13337/6185/279 9981/6184/5460
+f 3330/6231/5493 3331/6234/5496 3336/6237/5499 3332/6238/5500
+f 3332/6238/5500 3336/6237/5499 9975/6239/5482 9974/6240/5481
+f 3331/6234/5496 9980/6179/5455 9979/6178/5454 3336/6237/5499
+f 3336/6237/5499 9979/6178/5454 13124/6181/5457 9975/6239/5482
+f 3330/6231/5493 3332/6238/5500 3337/6241/5501 3333/6242/5502
+f 3333/6242/5502 3337/6241/5501 10066/6243/5503 10067/6244/5504
+f 3332/6238/5500 9974/6240/5481 9973/6245/5490 3337/6241/5501
+f 3337/6241/5501 9973/6245/5490 13139/6246/5492 10066/6243/5503
+f 3330/6231/5493 3333/6242/5502 3338/6247/5505 3334/6232/5494
+f 3334/6232/5494 3338/6247/5505 11227/6248/5506 11228/6235/5497
+f 3333/6242/5502 10067/6244/5504 10068/6249/5507 3338/6247/5505
+f 3338/6247/5505 10068/6249/5507 13336/6250/5508 11227/6248/5506
+f 3339/6251/5509 3343/6252/5510 3344/6253/5511 3340/6254/5512
+f 3340/6254/5512 3344/6253/5511 9987/6165/279 9986/6161/279
+f 3343/6252/5510 9983/6255/5513 9984/6256/5514 3344/6253/5511
+f 3344/6253/5511 9984/6256/5514 13126/6147/279 9987/6165/279
+f 3339/6251/5509 3340/6254/5512 3345/6257/5515 3341/6258/5516
+f 3341/6258/5516 3345/6257/5515 9976/6259/5517 9977/6260/5518
+f 3340/6254/5512 9986/6161/279 9985/6160/279 3345/6257/5515
+f 3345/6257/5515 9985/6160/279 13125/6163/279 9976/6259/5517
+f 3339/6251/5509 3341/6258/5516 3346/6261/5519 3342/6262/5520
+f 3342/6262/5520 3346/6261/5519 10069/6263/5521 10070/6264/5522
+f 3341/6258/5516 9977/6260/5518 9978/6265/5523 3346/6261/5519
+f 3346/6261/5519 9978/6265/5523 13140/6266/5524 10069/6263/5521
+f 3339/6251/5509 3342/6262/5520 3347/6267/5525 3343/6252/5510
+f 3343/6252/5510 3347/6267/5525 9982/6268/5526 9983/6255/5513
+f 3342/6262/5520 10070/6264/5522 10071/6269/5527 3347/6267/5525
+f 3347/6267/5525 10071/6269/5527 13141/6270/5528 9982/6268/5526
+f 3348/6271/5529 3352/6272/5530 3353/6273/5531 3349/6274/5532
+f 3349/6274/5532 3353/6273/5531 9993/6149/279 9992/6145/279
+f 3352/6272/5530 9989/6275/5533 9990/6276/5534 3353/6273/5531
+f 3353/6273/5531 9990/6276/5534 13127/6131/279 9993/6149/279
+f 3348/6271/5529 3349/6274/5532 3354/6277/5535 3350/6278/5536
+f 3350/6278/5536 3354/6277/5535 9984/6256/5514 9983/6255/5513
+f 3349/6274/5532 9992/6145/279 9991/6144/279 3354/6277/5535
+f 3354/6277/5535 9991/6144/279 13126/6147/279 9984/6256/5514
+f 3348/6271/5529 3350/6278/5536 3355/6279/5537 3351/6280/5538
+f 3351/6280/5538 3355/6279/5537 10072/6281/5539 10073/6282/5540
+f 3350/6278/5536 9983/6255/5513 9982/6268/5526 3355/6279/5537
+f 3355/6279/5537 9982/6268/5526 13141/6270/5528 10072/6281/5539
+f 3348/6271/5529 3351/6280/5538 3356/6283/5541 3352/6272/5530
+f 3352/6272/5530 3356/6283/5541 9988/6284/5542 9989/6275/5533
+f 3351/6280/5538 10073/6282/5540 10074/6285/5543 3356/6283/5541
+f 3356/6283/5541 10074/6285/5543 13142/6286/5544 9988/6284/5542
+f 3357/6287/5545 3361/6288/5546 3362/6289/5547 3358/6290/5548
+f 3358/6290/5548 3362/6289/5547 9999/6133/279 9998/6129/279
+f 3361/6288/5546 9995/6291/5549 9996/6292/5550 3362/6289/5547
+f 3362/6289/5547 9996/6292/5550 13128/6115/279 9999/6133/279
+f 3357/6287/5545 3358/6290/5548 3363/6293/5551 3359/6294/5552
+f 3359/6294/5552 3363/6293/5551 9990/6276/5534 9989/6275/5533
+f 3358/6290/5548 9998/6129/279 9997/6128/279 3363/6293/5551
+f 3363/6293/5551 9997/6128/279 13127/6131/279 9990/6276/5534
+f 3357/6287/5545 3359/6294/5552 3364/6295/5553 3360/6296/5554
+f 3360/6296/5554 3364/6295/5553 10075/6297/5555 10076/6298/5556
+f 3359/6294/5552 9989/6275/5533 9988/6284/5542 3364/6295/5553
+f 3364/6295/5553 9988/6284/5542 13142/6286/5544 10075/6297/5555
+f 3357/6287/5545 3360/6296/5554 3365/6299/5557 3361/6288/5546
+f 3361/6288/5546 3365/6299/5557 9994/6300/5558 9995/6291/5549
+f 3360/6296/5554 10076/6298/5556 10077/6301/5559 3365/6299/5557
+f 3365/6299/5557 10077/6301/5559 13143/6302/5560 9994/6300/5558
+f 3366/6303/5561 3370/6304/5562 3371/6305/5563 3367/6306/5564
+f 3367/6306/5564 3371/6305/5563 10005/6117/279 10004/6113/279
+f 3370/6304/5562 10001/6307/5565 10002/6308/5566 3371/6305/5563
+f 3371/6305/5563 10002/6308/5566 13129/6099/279 10005/6117/279
+f 3366/6303/5561 3367/6306/5564 3372/6309/5567 3368/6310/5568
+f 3368/6310/5568 3372/6309/5567 9996/6292/5550 9995/6291/5549
+f 3367/6306/5564 10004/6113/279 10003/6112/279 3372/6309/5567
+f 3372/6309/5567 10003/6112/279 13128/6115/279 9996/6292/5550
+f 3366/6303/5561 3368/6310/5568 3373/6311/5569 3369/6312/5570
+f 3369/6312/5570 3373/6311/5569 10078/6313/5571 10079/6314/5572
+f 3368/6310/5568 9995/6291/5549 9994/6300/5558 3373/6311/5569
+f 3373/6311/5569 9994/6300/5558 13143/6302/5560 10078/6313/5571
+f 3366/6303/5561 3369/6312/5570 3374/6315/5573 3370/6304/5562
+f 3370/6304/5562 3374/6315/5573 10000/6316/5574 10001/6307/5565
+f 3369/6312/5570 10079/6314/5572 10080/6317/5575 3374/6315/5573
+f 3374/6315/5573 10080/6317/5575 13144/6318/5576 10000/6316/5574
+f 3375/6319/5577 3379/6320/5578 3380/6321/5579 3376/6322/5580
+f 3376/6322/5580 3380/6321/5579 10011/6101/279 10010/6097/279
+f 3379/6320/5578 10007/6323/5581 10008/6324/5582 3380/6321/5579
+f 3380/6321/5579 10008/6324/5582 13130/6083/279 10011/6101/279
+f 3375/6319/5577 3376/6322/5580 3381/6325/5583 3377/6326/5584
+f 3377/6326/5584 3381/6325/5583 10002/6308/5566 10001/6307/5565
+f 3376/6322/5580 10010/6097/279 10009/6096/279 3381/6325/5583
+f 3381/6325/5583 10009/6096/279 13129/6099/279 10002/6308/5566
+f 3375/6319/5577 3377/6326/5584 3382/6327/5585 3378/6328/5586
+f 3378/6328/5586 3382/6327/5585 10081/6329/5587 10082/6330/5588
+f 3377/6326/5584 10001/6307/5565 10000/6316/5574 3382/6327/5585
+f 3382/6327/5585 10000/6316/5574 13144/6318/5576 10081/6329/5587
+f 3375/6319/5577 3378/6328/5586 3383/6331/5589 3379/6320/5578
+f 3379/6320/5578 3383/6331/5589 10006/6332/5590 10007/6323/5581
+f 3378/6328/5586 10082/6330/5588 10083/6333/5591 3383/6331/5589
+f 3383/6331/5589 10083/6333/5591 13145/6334/5592 10006/6332/5590
+f 3384/6335/5593 3388/6336/5594 3389/6337/5595 3385/6338/5596
+f 3385/6338/5596 3389/6337/5595 10017/6085/279 10016/6081/279
+f 3388/6336/5594 10013/6339/5597 10014/6340/5598 3389/6337/5595
+f 3389/6337/5595 10014/6340/5598 13131/6067/279 10017/6085/279
+f 3384/6335/5593 3385/6338/5596 3390/6341/5599 3386/6342/5600
+f 3386/6342/5600 3390/6341/5599 10008/6324/5582 10007/6323/5581
+f 3385/6338/5596 10016/6081/279 10015/6080/279 3390/6341/5599
+f 3390/6341/5599 10015/6080/279 13130/6083/279 10008/6324/5582
+f 3384/6335/5593 3386/6342/5600 3391/6343/5601 3387/6344/5602
+f 3387/6344/5602 3391/6343/5601 10084/6345/5603 10085/6346/5604
+f 3386/6342/5600 10007/6323/5581 10006/6332/5590 3391/6343/5601
+f 3391/6343/5601 10006/6332/5590 13145/6334/5592 10084/6345/5603
+f 3384/6335/5593 3387/6344/5602 3392/6347/5605 3388/6336/5594
+f 3388/6336/5594 3392/6347/5605 10012/6348/5606 10013/6339/5597
+f 3387/6344/5602 10085/6346/5604 10086/6349/5607 3392/6347/5605
+f 3392/6347/5605 10086/6349/5607 13146/6350/5608 10012/6348/5606
+f 3393/6351/5609 3397/6352/5610 3398/6353/5611 3394/6354/5612
+f 3394/6354/5612 3398/6353/5611 10023/6069/279 10022/6065/279
+f 3397/6352/5610 10019/6355/5613 10020/6356/5614 3398/6353/5611
+f 3398/6353/5611 10020/6356/5614 13132/6051/279 10023/6069/279
+f 3393/6351/5609 3394/6354/5612 3399/6357/5615 3395/6358/5616
+f 3395/6358/5616 3399/6357/5615 10014/6340/5598 10013/6339/5597
+f 3394/6354/5612 10022/6065/279 10021/6064/279 3399/6357/5615
+f 3399/6357/5615 10021/6064/279 13131/6067/279 10014/6340/5598
+f 3393/6351/5609 3395/6358/5616 3400/6359/5617 3396/6360/5618
+f 3396/6360/5618 3400/6359/5617 10087/6361/5619 10088/6362/5620
+f 3395/6358/5616 10013/6339/5597 10012/6348/5606 3400/6359/5617
+f 3400/6359/5617 10012/6348/5606 13146/6350/5608 10087/6361/5619
+f 3393/6351/5609 3396/6360/5618 3401/6363/5621 3397/6352/5610
+f 3397/6352/5610 3401/6363/5621 10018/6364/5622 10019/6355/5613
+f 3396/6360/5618 10088/6362/5620 10089/6365/5623 3401/6363/5621
+f 3401/6363/5621 10089/6365/5623 13147/6366/5624 10018/6364/5622
+f 3402/6367/5625 3406/6368/5626 3407/6369/5627 3403/6370/5628
+f 3403/6370/5628 3407/6369/5627 10029/6053/279 10028/6049/279
+f 3406/6368/5626 10025/6371/5629 10026/6372/5630 3407/6369/5627
+f 3407/6369/5627 10026/6372/5630 13133/6035/279 10029/6053/279
+f 3402/6367/5625 3403/6370/5628 3408/6373/5631 3404/6374/5632
+f 3404/6374/5632 3408/6373/5631 10020/6356/5614 10019/6355/5613
+f 3403/6370/5628 10028/6049/279 10027/6048/279 3408/6373/5631
+f 3408/6373/5631 10027/6048/279 13132/6051/279 10020/6356/5614
+f 3402/6367/5625 3404/6374/5632 3409/6375/5633 3405/6376/5634
+f 3405/6376/5634 3409/6375/5633 10090/6377/5635 10091/6378/5636
+f 3404/6374/5632 10019/6355/5613 10018/6364/5622 3409/6375/5633
+f 3409/6375/5633 10018/6364/5622 13147/6366/5624 10090/6377/5635
+f 3402/6367/5625 3405/6376/5634 3410/6379/5637 3406/6368/5626
+f 3406/6368/5626 3410/6379/5637 10024/6380/5638 10025/6371/5629
+f 3405/6376/5634 10091/6378/5636 10092/6381/5639 3410/6379/5637
+f 3410/6379/5637 10092/6381/5639 13148/6382/5640 10024/6380/5638
+f 3411/6383/5641 3415/6384/5642 3416/6385/5643 3412/6386/5644
+f 3412/6386/5644 3416/6385/5643 10035/6037/279 10034/6033/279
+f 3415/6384/5642 10031/6387/5645 10032/6388/5646 3416/6385/5643
+f 3416/6385/5643 10032/6388/5646 13134/6019/279 10035/6037/279
+f 3411/6383/5641 3412/6386/5644 3417/6389/5647 3413/6390/5648
+f 3413/6390/5648 3417/6389/5647 10026/6372/5630 10025/6371/5629
+f 3412/6386/5644 10034/6033/279 10033/6032/279 3417/6389/5647
+f 3417/6389/5647 10033/6032/279 13133/6035/279 10026/6372/5630
+f 3411/6383/5641 3413/6390/5648 3418/6391/5649 3414/6392/5650
+f 3414/6392/5650 3418/6391/5649 10093/6393/5651 10094/6394/5652
+f 3413/6390/5648 10025/6371/5629 10024/6380/5638 3418/6391/5649
+f 3418/6391/5649 10024/6380/5638 13148/6382/5640 10093/6393/5651
+f 3411/6383/5641 3414/6392/5650 3419/6395/5653 3415/6384/5642
+f 3415/6384/5642 3419/6395/5653 10030/6396/5654 10031/6387/5645
+f 3414/6392/5650 10094/6394/5652 10095/6397/5655 3419/6395/5653
+f 3419/6395/5653 10095/6397/5655 13149/6398/5656 10030/6396/5654
+f 3420/6399/5657 3424/6400/5658 3425/6401/5659 3421/6402/5660
+f 3421/6402/5660 3425/6401/5659 10041/6021/279 10040/6017/279
+f 3424/6400/5658 10037/6403/5661 10038/6404/5662 3425/6401/5659
+f 3425/6401/5659 10038/6404/5662 13135/6003/279 10041/6021/279
+f 3420/6399/5657 3421/6402/5660 3426/6405/5663 3422/6406/5664
+f 3422/6406/5664 3426/6405/5663 10032/6388/5646 10031/6387/5645
+f 3421/6402/5660 10040/6017/279 10039/6016/279 3426/6405/5663
+f 3426/6405/5663 10039/6016/279 13134/6019/279 10032/6388/5646
+f 3420/6399/5657 3422/6406/5664 3427/6407/5665 3423/6408/5666
+f 3423/6408/5666 3427/6407/5665 10096/6409/5667 10097/6410/5668
+f 3422/6406/5664 10031/6387/5645 10030/6396/5654 3427/6407/5665
+f 3427/6407/5665 10030/6396/5654 13149/6398/5656 10096/6409/5667
+f 3420/6399/5657 3423/6408/5666 3428/6411/5669 3424/6400/5658
+f 3424/6400/5658 3428/6411/5669 10036/6412/5670 10037/6403/5661
+f 3423/6408/5666 10097/6410/5668 10098/6413/5671 3428/6411/5669
+f 3428/6411/5669 10098/6413/5671 13150/6414/5672 10036/6412/5670
+f 3429/6415/5673 3433/6416/5674 3434/6417/5675 3430/6418/5676
+f 3430/6418/5676 3434/6417/5675 10047/6005/279 10046/6001/279
+f 3433/6416/5674 10043/6419/5677 10044/6420/5678 3434/6417/5675
+f 3434/6417/5675 10044/6420/5678 13136/5987/279 10047/6005/279
+f 3429/6415/5673 3430/6418/5676 3435/6421/5679 3431/6422/5680
+f 3431/6422/5680 3435/6421/5679 10038/6404/5662 10037/6403/5661
+f 3430/6418/5676 10046/6001/279 10045/6000/279 3435/6421/5679
+f 3435/6421/5679 10045/6000/279 13135/6003/279 10038/6404/5662
+f 3429/6415/5673 3431/6422/5680 3436/6423/5681 3432/6424/5682
+f 3432/6424/5682 3436/6423/5681 10099/6425/5683 10100/6426/5684
+f 3431/6422/5680 10037/6403/5661 10036/6412/5670 3436/6423/5681
+f 3436/6423/5681 10036/6412/5670 13150/6414/5672 10099/6425/5683
+f 3429/6415/5673 3432/6424/5682 3437/6427/5685 3433/6416/5674
+f 3433/6416/5674 3437/6427/5685 10042/6428/5686 10043/6419/5677
+f 3432/6424/5682 10100/6426/5684 10101/6429/5687 3437/6427/5685
+f 3437/6427/5685 10101/6429/5687 13151/6430/5688 10042/6428/5686
+f 3438/6431/5689 3442/6432/5690 3443/6433/5691 3439/6434/5692
+f 3439/6434/5692 3443/6433/5691 10053/5989/279 10052/5985/279
+f 3442/6432/5690 10049/6435/5693 10050/6436/5694 3443/6433/5691
+f 3443/6433/5691 10050/6436/5694 13137/5971/279 10053/5989/279
+f 3438/6431/5689 3439/6434/5692 3444/6437/5695 3440/6438/5696
+f 3440/6438/5696 3444/6437/5695 10044/6420/5678 10043/6419/5677
+f 3439/6434/5692 10052/5985/279 10051/5984/279 3444/6437/5695
+f 3444/6437/5695 10051/5984/279 13136/5987/279 10044/6420/5678
+f 3438/6431/5689 3440/6438/5696 3445/6439/5697 3441/6440/5698
+f 3441/6440/5698 3445/6439/5697 10102/6441/5699 10103/6442/5700
+f 3440/6438/5696 10043/6419/5677 10042/6428/5686 3445/6439/5697
+f 3445/6439/5697 10042/6428/5686 13151/6430/5688 10102/6441/5699
+f 3438/6431/5689 3441/6440/5698 3446/6443/5701 3442/6432/5690
+f 3442/6432/5690 3446/6443/5701 10048/6444/5702 10049/6435/5693
+f 3441/6440/5698 10103/6442/5700 10104/6445/5703 3446/6443/5701
+f 3446/6443/5701 10104/6445/5703 13152/6446/5704 10048/6444/5702
+f 3447/6447/5705 3451/6448/5706 3452/6449/5707 3448/6450/5708
+f 3448/6450/5708 3452/6449/5707 10056/5973/279 10055/5969/279
+f 3451/6448/5706 7919/737/671 7918/736/670 3452/6449/5707
+f 3452/6449/5707 7918/736/670 12769/282/279 10056/5973/279
+f 3447/6447/5705 3448/6450/5708 3453/6451/5709 3449/6452/5710
+f 3449/6452/5710 3453/6451/5709 10050/6436/5694 10049/6435/5693
+f 3448/6450/5708 10055/5969/279 10054/5968/279 3453/6451/5709
+f 3453/6451/5709 10054/5968/279 13137/5971/279 10050/6436/5694
+f 3447/6447/5705 3449/6452/5710 3454/6453/5711 3450/6454/5712
+f 3450/6454/5712 3454/6453/5711 10105/6455/5713 10106/6456/5714
+f 3449/6452/5710 10049/6435/5693 10048/6444/5702 3454/6453/5711
+f 3454/6453/5711 10048/6444/5702 13152/6446/5704 10105/6455/5713
+f 3447/6447/5705 3450/6454/5712 3455/6457/5715 3451/6448/5706
+f 3451/6448/5706 3455/6457/5715 7920/742/676 7919/737/671
+f 3450/6454/5712 10106/6456/5714 10107/6458/5716 3455/6457/5715
+f 3455/6457/5715 10107/6458/5716 12784/743/677 7920/742/676
+f 3456/6459/5717 3460/6460/5718 3461/6461/5719 3457/6462/5720
+f 3457/6462/5720 3461/6461/5719 10288/6463/5474 10289/6464/5474
+f 3460/6460/5718 10280/6224/5488 10279/6223/5487 3461/6461/5719
+f 3461/6461/5719 10279/6223/5487 13181/6226/5474 10288/6463/5474
+f 3456/6459/5717 3457/6462/5720 3462/6465/5474 3458/6466/5721
+f 3458/6466/5721 3462/6465/5474 11455/6467/5474 11456/6468/5474
+f 3457/6462/5720 10289/6464/5474 10290/6469/5474 3462/6465/5474
+f 3462/6465/5474 10290/6469/5474 13374/6470/5474 11455/6467/5474
+f 3456/6459/5717 3458/6466/5721 3463/6471/5722 3459/6472/5723
+f 3459/6472/5723 3463/6471/5722 10060/6473/5724 10061/6474/5725
+f 3458/6466/5721 11456/6468/5474 11457/6475/5474 3463/6471/5722
+f 3463/6471/5722 11457/6475/5474 13375/6476/5474 10060/6473/5724
+f 3456/6459/5717 3459/6472/5723 3464/6477/5726 3460/6460/5718
+f 3460/6460/5718 3464/6477/5726 10281/6229/5491 10280/6224/5488
+f 3459/6472/5723 10061/6474/5725 10062/6478/5727 3464/6477/5726
+f 3464/6477/5726 10062/6478/5727 13139/6230/5492 10281/6229/5491
+f 3465/6479/5728 3469/6480/5729 3470/6481/5730 3466/6482/5731
+f 3466/6482/5731 3470/6481/5730 10474/6483/5732 10475/6484/5733
+f 3469/6480/5729 11477/6485/5734 11478/6486/5735 3470/6481/5730
+f 3470/6481/5730 11478/6486/5735 13330/6487/5736 10474/6483/5732
+f 3465/6479/5728 3466/6482/5731 3471/6488/5737 3467/6489/5738
+f 3467/6489/5738 3471/6488/5737 10480/6490/5739 10481/6491/5740
+f 3466/6482/5731 10475/6484/5733 10476/6492/5741 3471/6488/5737
+f 3471/6488/5737 10476/6492/5741 13212/6493/5742 10480/6490/5739
+f 3465/6479/5728 3467/6489/5738 3472/6494/5743 3468/6495/5744
+f 3468/6495/5744 3472/6494/5743 11479/6496/5745 11480/6497/5746
+f 3467/6489/5738 10481/6491/5740 10482/6498/5747 3472/6494/5743
+f 3472/6494/5743 10482/6498/5747 13378/6499/5748 11479/6496/5745
+f 3465/6479/5728 3468/6495/5744 3473/6500/5749 3469/6480/5729
+f 3469/6480/5729 3473/6500/5749 11476/6501/5750 11477/6485/5734
+f 3468/6495/5744 11480/6497/5746 11481/6502/5751 3473/6500/5749
+f 3473/6500/5749 11481/6502/5751 13379/6503/5752 11476/6501/5750
+f 3474/6504/5753 3478/6505/5754 3479/6506/5755 3475/6507/5756
+f 3475/6507/5756 3479/6506/5755 11569/6508/5757 11570/6509/5758
+f 3478/6505/5754 11585/6510/5759 11586/6511/5760 3479/6506/5755
+f 3479/6506/5755 11586/6511/5760 13394/6512/5761 11569/6508/5757
+f 3474/6504/5753 3475/6507/5756 3480/6513/5762 3476/6514/5763
+f 3476/6514/5763 3480/6513/5762 11575/6515/5764 11576/6516/5765
+f 3475/6507/5756 11570/6509/5758 11571/6517/5766 3480/6513/5762
+f 3480/6513/5762 11571/6517/5766 13393/6518/5767 11575/6515/5764
+f 3474/6504/5753 3476/6514/5763 3481/6519/5768 3477/6520/5769
+f 3477/6520/5769 3481/6519/5768 11581/6521/5770 11582/6522/5771
+f 3476/6514/5763 11576/6516/5765 11577/6523/5772 3481/6519/5768
+f 3481/6519/5768 11577/6523/5772 13395/6524/5773 11581/6521/5770
+f 3474/6504/5753 3477/6520/5769 3482/6525/5774 3478/6505/5754
+f 3478/6505/5754 3482/6525/5774 11584/6526/5775 11585/6510/5759
+f 3477/6520/5769 11582/6522/5771 11583/6527/5776 3482/6525/5774
+f 3482/6525/5774 11583/6527/5776 13396/6528/5777 11584/6526/5775
+f 3483/6529/5778 3487/6530/5779 3488/6531/5780 3484/6532/5781
+f 3484/6532/5781 3488/6531/5780 11590/6533/5782 11591/6534/5783
+f 3487/6530/5779 11600/6535/5784 11601/6536/5785 3488/6531/5780
+f 3488/6531/5780 11601/6536/5785 13397/6537/5786 11590/6533/5782
+f 3483/6529/5778 3484/6532/5781 3489/6538/5787 3485/6539/5788
+f 3485/6539/5788 3489/6538/5787 11586/6511/5760 11585/6510/5759
+f 3484/6532/5781 11591/6534/5783 11592/6540/5789 3489/6538/5787
+f 3489/6538/5787 11592/6540/5789 13394/6512/5761 11586/6511/5760
+f 3483/6529/5778 3485/6539/5788 3490/6541/5790 3486/6542/5791
+f 3486/6542/5791 3490/6541/5790 11596/6543/5792 11597/6544/5793
+f 3485/6539/5788 11585/6510/5759 11584/6526/5775 3490/6541/5790
+f 3490/6541/5790 11584/6526/5775 13396/6528/5777 11596/6543/5792
+f 3483/6529/5778 3486/6542/5791 3491/6545/5794 3487/6530/5779
+f 3487/6530/5779 3491/6545/5794 11599/6546/5795 11600/6535/5784
+f 3486/6542/5791 11597/6544/5793 11598/6547/5796 3491/6545/5794
+f 3491/6545/5794 11598/6547/5796 13398/6548/5797 11599/6546/5795
+f 3492/6549/5798 3496/6550/5799 3497/6551/5800 3493/6552/5801
+f 3493/6552/5801 3497/6551/5800 11605/6553/5802 11606/6554/5803
+f 3496/6550/5799 11615/6555/5804 11616/6556/5805 3497/6551/5800
+f 3497/6551/5800 11616/6556/5805 13399/6557/5806 11605/6553/5802
+f 3492/6549/5798 3493/6552/5801 3498/6558/5807 3494/6559/5808
+f 3494/6559/5808 3498/6558/5807 11601/6536/5785 11600/6535/5784
+f 3493/6552/5801 11606/6554/5803 11607/6560/5809 3498/6558/5807
+f 3498/6558/5807 11607/6560/5809 13397/6537/5786 11601/6536/5785
+f 3492/6549/5798 3494/6559/5808 3499/6561/5810 3495/6562/5811
+f 3495/6562/5811 3499/6561/5810 11611/6563/5812 11612/6564/5813
+f 3494/6559/5808 11600/6535/5784 11599/6546/5795 3499/6561/5810
+f 3499/6561/5810 11599/6546/5795 13398/6548/5797 11611/6563/5812
+f 3492/6549/5798 3495/6562/5811 3500/6565/5814 3496/6550/5799
+f 3496/6550/5799 3500/6565/5814 11614/6566/5815 11615/6555/5804
+f 3495/6562/5811 11612/6564/5813 11613/6567/5816 3500/6565/5814
+f 3500/6565/5814 11613/6567/5816 13400/6568/5817 11614/6566/5815
+f 3501/6569/5818 3505/6570/5819 3506/6571/5820 3502/6572/5821
+f 3502/6572/5821 3506/6571/5820 11620/6573/5822 11621/6574/5823
+f 3505/6570/5819 11630/6575/5824 11631/6576/5825 3506/6571/5820
+f 3506/6571/5820 11631/6576/5825 13401/6577/5826 11620/6573/5822
+f 3501/6569/5818 3502/6572/5821 3507/6578/5827 3503/6579/5828
+f 3503/6579/5828 3507/6578/5827 11616/6556/5805 11615/6555/5804
+f 3502/6572/5821 11621/6574/5823 11622/6580/5829 3507/6578/5827
+f 3507/6578/5827 11622/6580/5829 13399/6557/5806 11616/6556/5805
+f 3501/6569/5818 3503/6579/5828 3508/6581/5830 3504/6582/5831
+f 3504/6582/5831 3508/6581/5830 11626/6583/5832 11627/6584/5833
+f 3503/6579/5828 11615/6555/5804 11614/6566/5815 3508/6581/5830
+f 3508/6581/5830 11614/6566/5815 13400/6568/5817 11626/6583/5832
+f 3501/6569/5818 3504/6582/5831 3509/6585/5834 3505/6570/5819
+f 3505/6570/5819 3509/6585/5834 11629/6586/5835 11630/6575/5824
+f 3504/6582/5831 11627/6584/5833 11628/6587/5836 3509/6585/5834
+f 3509/6585/5834 11628/6587/5836 13402/6588/5837 11629/6586/5835
+f 3510/6589/5838 3514/6590/5839 3515/6591/5840 3511/6592/5841
+f 3511/6592/5841 3515/6591/5840 11635/6593/5842 11636/6594/5843
+f 3514/6590/5839 11645/6595/5844 11646/6596/5845 3515/6591/5840
+f 3515/6591/5840 11646/6596/5845 13403/6597/5846 11635/6593/5842
+f 3510/6589/5838 3511/6592/5841 3516/6598/5847 3512/6599/5848
+f 3512/6599/5848 3516/6598/5847 11631/6576/5825 11630/6575/5824
+f 3511/6592/5841 11636/6594/5843 11637/6600/5849 3516/6598/5847
+f 3516/6598/5847 11637/6600/5849 13401/6577/5826 11631/6576/5825
+f 3510/6589/5838 3512/6599/5848 3517/6601/5850 3513/6602/5851
+f 3513/6602/5851 3517/6601/5850 11641/6603/5852 11642/6604/5853
+f 3512/6599/5848 11630/6575/5824 11629/6586/5835 3517/6601/5850
+f 3517/6601/5850 11629/6586/5835 13402/6588/5837 11641/6603/5852
+f 3510/6589/5838 3513/6602/5851 3518/6605/5854 3514/6590/5839
+f 3514/6590/5839 3518/6605/5854 11644/6606/5855 11645/6595/5844
+f 3513/6602/5851 11642/6604/5853 11643/6607/5856 3518/6605/5854
+f 3518/6605/5854 11643/6607/5856 13404/6608/5857 11644/6606/5855
+f 3519/6609/5858 3523/6610/5859 3524/6611/5860 3520/6612/5861
+f 3520/6612/5861 3524/6611/5860 11650/6613/5862 11651/6614/5863
+f 3523/6610/5859 11660/6615/5864 11661/6616/5865 3524/6611/5860
+f 3524/6611/5860 11661/6616/5865 13405/6617/5866 11650/6613/5862
+f 3519/6609/5858 3520/6612/5861 3525/6618/5867 3521/6619/5868
+f 3521/6619/5868 3525/6618/5867 11646/6596/5845 11645/6595/5844
+f 3520/6612/5861 11651/6614/5863 11652/6620/5869 3525/6618/5867
+f 3525/6618/5867 11652/6620/5869 13403/6597/5846 11646/6596/5845
+f 3519/6609/5858 3521/6619/5868 3526/6621/5870 3522/6622/5871
+f 3522/6622/5871 3526/6621/5870 11656/6623/5872 11657/6624/5873
+f 3521/6619/5868 11645/6595/5844 11644/6606/5855 3526/6621/5870
+f 3526/6621/5870 11644/6606/5855 13404/6608/5857 11656/6623/5872
+f 3519/6609/5858 3522/6622/5871 3527/6625/5874 3523/6610/5859
+f 3523/6610/5859 3527/6625/5874 11659/6626/5875 11660/6615/5864
+f 3522/6622/5871 11657/6624/5873 11658/6627/5876 3527/6625/5874
+f 3527/6625/5874 11658/6627/5876 13406/6628/5877 11659/6626/5875
+f 3528/6629/5878 3532/6630/5879 3533/6631/5880 3529/6632/5881
+f 3529/6632/5881 3533/6631/5880 11665/6633/5882 11666/6634/5883
+f 3532/6630/5879 11675/6635/5884 11676/6636/5885 3533/6631/5880
+f 3533/6631/5880 11676/6636/5885 13407/6637/5886 11665/6633/5882
+f 3528/6629/5878 3529/6632/5881 3534/6638/5887 3530/6639/5888
+f 3530/6639/5888 3534/6638/5887 11661/6616/5865 11660/6615/5864
+f 3529/6632/5881 11666/6634/5883 11667/6640/5889 3534/6638/5887
+f 3534/6638/5887 11667/6640/5889 13405/6617/5866 11661/6616/5865
+f 3528/6629/5878 3530/6639/5888 3535/6641/5890 3531/6642/5891
+f 3531/6642/5891 3535/6641/5890 11671/6643/5892 11672/6644/5893
+f 3530/6639/5888 11660/6615/5864 11659/6626/5875 3535/6641/5890
+f 3535/6641/5890 11659/6626/5875 13406/6628/5877 11671/6643/5892
+f 3528/6629/5878 3531/6642/5891 3536/6645/5894 3532/6630/5879
+f 3532/6630/5879 3536/6645/5894 11674/6646/5895 11675/6635/5884
+f 3531/6642/5891 11672/6644/5893 11673/6647/5896 3536/6645/5894
+f 3536/6645/5894 11673/6647/5896 13408/6648/5897 11674/6646/5895
+f 3537/6649/5898 3541/6650/5899 3542/6651/5900 3538/6652/5901
+f 3538/6652/5901 3542/6651/5900 11680/6653/5902 11681/6654/5903
+f 3541/6650/5899 11690/6655/5904 11691/6656/5905 3542/6651/5900
+f 3542/6651/5900 11691/6656/5905 13409/6657/5906 11680/6653/5902
+f 3537/6649/5898 3538/6652/5901 3543/6658/5907 3539/6659/5908
+f 3539/6659/5908 3543/6658/5907 11676/6636/5885 11675/6635/5884
+f 3538/6652/5901 11681/6654/5903 11682/6660/5909 3543/6658/5907
+f 3543/6658/5907 11682/6660/5909 13407/6637/5886 11676/6636/5885
+f 3537/6649/5898 3539/6659/5908 3544/6661/5910 3540/6662/5911
+f 3540/6662/5911 3544/6661/5910 11686/6663/5912 11687/6664/5913
+f 3539/6659/5908 11675/6635/5884 11674/6646/5895 3544/6661/5910
+f 3544/6661/5910 11674/6646/5895 13408/6648/5897 11686/6663/5912
+f 3537/6649/5898 3540/6662/5911 3545/6665/5914 3541/6650/5899
+f 3541/6650/5899 3545/6665/5914 11689/6666/5915 11690/6655/5904
+f 3540/6662/5911 11687/6664/5913 11688/6667/5916 3545/6665/5914
+f 3545/6665/5914 11688/6667/5916 13410/6668/5917 11689/6666/5915
+f 3546/6669/5918 3550/6670/5919 3551/6671/5920 3547/6672/5921
+f 3547/6672/5921 3551/6671/5920 11695/6673/5922 11696/6674/5923
+f 3550/6670/5919 11705/6675/5924 11706/6676/5925 3551/6671/5920
+f 3551/6671/5920 11706/6676/5925 13411/6677/5926 11695/6673/5922
+f 3546/6669/5918 3547/6672/5921 3552/6678/5927 3548/6679/5928
+f 3548/6679/5928 3552/6678/5927 11691/6656/5905 11690/6655/5904
+f 3547/6672/5921 11696/6674/5923 11697/6680/5929 3552/6678/5927
+f 3552/6678/5927 11697/6680/5929 13409/6657/5906 11691/6656/5905
+f 3546/6669/5918 3548/6679/5928 3553/6681/5930 3549/6682/5931
+f 3549/6682/5931 3553/6681/5930 11701/6683/5932 11702/6684/5933
+f 3548/6679/5928 11690/6655/5904 11689/6666/5915 3553/6681/5930
+f 3553/6681/5930 11689/6666/5915 13410/6668/5917 11701/6683/5932
+f 3546/6669/5918 3549/6682/5931 3554/6685/5934 3550/6670/5919
+f 3550/6670/5919 3554/6685/5934 11704/6686/5935 11705/6675/5924
+f 3549/6682/5931 11702/6684/5933 11703/6687/5936 3554/6685/5934
+f 3554/6685/5934 11703/6687/5936 13412/6688/5937 11704/6686/5935
+f 3555/6689/5938 3559/6690/5939 3560/6691/5940 3556/6692/5941
+f 3556/6692/5941 3560/6691/5940 11710/6693/5942 11711/6694/5943
+f 3559/6690/5939 11720/6695/5944 11721/6696/5945 3560/6691/5940
+f 3560/6691/5940 11721/6696/5945 13413/6697/5946 11710/6693/5942
+f 3555/6689/5938 3556/6692/5941 3561/6698/5947 3557/6699/5948
+f 3557/6699/5948 3561/6698/5947 11706/6676/5925 11705/6675/5924
+f 3556/6692/5941 11711/6694/5943 11712/6700/5949 3561/6698/5947
+f 3561/6698/5947 11712/6700/5949 13411/6677/5926 11706/6676/5925
+f 3555/6689/5938 3557/6699/5948 3562/6701/5950 3558/6702/5951
+f 3558/6702/5951 3562/6701/5950 11716/6703/5952 11717/6704/5953
+f 3557/6699/5948 11705/6675/5924 11704/6686/5935 3562/6701/5950
+f 3562/6701/5950 11704/6686/5935 13412/6688/5937 11716/6703/5952
+f 3555/6689/5938 3558/6702/5951 3563/6705/5954 3559/6690/5939
+f 3559/6690/5939 3563/6705/5954 11719/6706/5955 11720/6695/5944
+f 3558/6702/5951 11717/6704/5953 11718/6707/5956 3563/6705/5954
+f 3563/6705/5954 11718/6707/5956 13414/6708/5957 11719/6706/5955
+f 3564/6709/5958 3568/6710/5959 3569/6711/5960 3565/6712/5961
+f 3565/6712/5961 3569/6711/5960 11725/6713/5962 11726/6714/5963
+f 3568/6710/5959 11735/6715/5964 11736/6716/5965 3569/6711/5960
+f 3569/6711/5960 11736/6716/5965 13415/6717/5966 11725/6713/5962
+f 3564/6709/5958 3565/6712/5961 3570/6718/5967 3566/6719/5968
+f 3566/6719/5968 3570/6718/5967 11721/6696/5945 11720/6695/5944
+f 3565/6712/5961 11726/6714/5963 11727/6720/5969 3570/6718/5967
+f 3570/6718/5967 11727/6720/5969 13413/6697/5946 11721/6696/5945
+f 3564/6709/5958 3566/6719/5968 3571/6721/5970 3567/6722/5971
+f 3567/6722/5971 3571/6721/5970 11731/6723/5972 11732/6724/5973
+f 3566/6719/5968 11720/6695/5944 11719/6706/5955 3571/6721/5970
+f 3571/6721/5970 11719/6706/5955 13414/6708/5957 11731/6723/5972
+f 3564/6709/5958 3567/6722/5971 3572/6725/5974 3568/6710/5959
+f 3568/6710/5959 3572/6725/5974 11734/6726/5975 11735/6715/5964
+f 3567/6722/5971 11732/6724/5973 11733/6727/5976 3572/6725/5974
+f 3572/6725/5974 11733/6727/5976 13416/6728/5977 11734/6726/5975
+f 3573/6729/5978 3577/6730/5979 3578/6731/5980 3574/6732/5981
+f 3574/6732/5981 3578/6731/5980 11740/6733/5982 11741/6734/5983
+f 3577/6730/5979 11750/6735/5984 11751/6736/5985 3578/6731/5980
+f 3578/6731/5980 11751/6736/5985 13417/6737/5986 11740/6733/5982
+f 3573/6729/5978 3574/6732/5981 3579/6738/5987 3575/6739/5988
+f 3575/6739/5988 3579/6738/5987 11736/6716/5965 11735/6715/5964
+f 3574/6732/5981 11741/6734/5983 11742/6740/5989 3579/6738/5987
+f 3579/6738/5987 11742/6740/5989 13415/6717/5966 11736/6716/5965
+f 3573/6729/5978 3575/6739/5988 3580/6741/5990 3576/6742/5991
+f 3576/6742/5991 3580/6741/5990 11746/6743/5992 11747/6744/5993
+f 3575/6739/5988 11735/6715/5964 11734/6726/5975 3580/6741/5990
+f 3580/6741/5990 11734/6726/5975 13416/6728/5977 11746/6743/5992
+f 3573/6729/5978 3576/6742/5991 3581/6745/5994 3577/6730/5979
+f 3577/6730/5979 3581/6745/5994 11749/6746/5995 11750/6735/5984
+f 3576/6742/5991 11747/6744/5993 11748/6747/5996 3581/6745/5994
+f 3581/6745/5994 11748/6747/5996 13418/6748/5997 11749/6746/5995
+f 3582/6749/5998 3586/6750/5999 3587/6751/6000 3583/6752/6001
+f 3583/6752/6001 3587/6751/6000 11752/6753/6002 11753/6754/6003
+f 3586/6750/5999 9569/1023/948 9568/1022/947 3587/6751/6000
+f 3587/6751/6000 9568/1022/947 13048/1026/951 11752/6753/6002
+f 3582/6749/5998 3583/6752/6001 3588/6755/6004 3584/6756/6005
+f 3584/6756/6005 3588/6755/6004 11751/6736/5985 11750/6735/5984
+f 3583/6752/6001 11753/6754/6003 11754/6757/6006 3588/6755/6004
+f 3588/6755/6004 11754/6757/6006 13417/6737/5986 11751/6736/5985
+f 3582/6749/5998 3584/6756/6005 3589/6758/6007 3585/6759/6008
+f 3585/6759/6008 3589/6758/6007 11755/6760/6009 11756/6761/6010
+f 3584/6756/6005 11750/6735/5984 11749/6746/5995 3589/6758/6007
+f 3589/6758/6007 11749/6746/5995 13418/6748/5997 11755/6760/6009
+f 3582/6749/5998 3585/6759/6008 3590/6762/6011 3586/6750/5999
+f 3586/6750/5999 3590/6762/6011 9570/1031/956 9569/1023/948
+f 3585/6759/6008 11756/6761/6010 11757/6763/6012 3590/6762/6011
+f 3590/6762/6011 11757/6763/6012 13049/1032/957 9570/1031/956
+f 3591/6764/6013 3595/6765/6014 3596/6766/6015 3592/6767/6016
+f 3592/6767/6016 3596/6766/6015 9919/6768/6017 9920/6769/6018
+f 3595/6765/6014 7973/1043/968 7972/1042/967 3596/6766/6015
+f 3596/6766/6015 7972/1042/967 12740/1046/971 9919/6768/6017
+f 3591/6764/6013 3592/6767/6016 3597/6770/6019 3593/6771/6020
+f 3593/6771/6020 3597/6770/6019 10108/6772/6021 10109/6773/6022
+f 3592/6767/6016 9920/6769/6018 9921/6774/6023 3597/6770/6019
+f 3597/6770/6019 9921/6774/6023 13108/6775/6024 10108/6772/6021
+f 3591/6764/6013 3593/6771/6020 3598/6776/6025 3594/6777/6026
+f 3594/6777/6026 3598/6776/6025 10369/6778/6027 10370/6779/6028
+f 3593/6771/6020 10109/6773/6022 10110/6780/6029 3598/6776/6025
+f 3598/6776/6025 10110/6780/6029 13195/6781/6030 10369/6778/6027
+f 3591/6764/6013 3594/6777/6026 3599/6782/6031 3595/6765/6014
+f 3595/6765/6014 3599/6782/6031 7974/1051/976 7973/1043/968
+f 3594/6777/6026 10370/6779/6028 10371/6783/6032 3599/6782/6031
+f 3599/6782/6031 10371/6783/6032 12827/1052/977 7974/1051/976
+f 3600/6784/6033 3604/6785/6034 3605/6786/6035 3601/6787/6036
+f 3601/6787/6036 3605/6786/6035 9922/6788/6037 9923/6789/6038
+f 3604/6785/6034 10109/6773/6022 10108/6772/6021 3605/6786/6035
+f 3605/6786/6035 10108/6772/6021 13108/6775/6024 9922/6788/6037
+f 3600/6784/6033 3601/6787/6036 3606/6790/6039 3602/6791/6040
+f 3602/6791/6040 3606/6790/6039 10114/6792/6041 10115/6793/6042
+f 3601/6787/6036 9923/6789/6038 9924/6794/6043 3606/6790/6039
+f 3606/6790/6039 9924/6794/6043 13109/6795/6044 10114/6792/6041
+f 3600/6784/6033 3602/6791/6040 3607/6796/6045 3603/6797/6046
+f 3603/6797/6046 3607/6796/6045 10366/6798/6047 10367/6799/6048
+f 3602/6791/6040 10115/6793/6042 10116/6800/6049 3607/6796/6045
+f 3607/6796/6045 10116/6800/6049 13194/6801/6050 10366/6798/6047
+f 3600/6784/6033 3603/6797/6046 3608/6802/6051 3604/6785/6034
+f 3604/6785/6034 3608/6802/6051 10110/6780/6029 10109/6773/6022
+f 3603/6797/6046 10367/6799/6048 10368/6803/6052 3608/6802/6051
+f 3608/6802/6051 10368/6803/6052 13195/6781/6030 10110/6780/6029
+f 3609/6804/6053 3613/6805/6054 3614/6806/6055 3610/6807/6056
+f 3610/6807/6056 3614/6806/6055 9925/6808/6057 9926/6809/6058
+f 3613/6805/6054 10115/6793/6042 10114/6792/6041 3614/6806/6055
+f 3614/6806/6055 10114/6792/6041 13109/6795/6044 9925/6808/6057
+f 3609/6804/6053 3610/6807/6056 3615/6810/6059 3611/6811/6060
+f 3611/6811/6060 3615/6810/6059 10120/6812/6061 10121/6813/6062
+f 3610/6807/6056 9926/6809/6058 9927/6814/6063 3615/6810/6059
+f 3615/6810/6059 9927/6814/6063 13110/6815/6064 10120/6812/6061
+f 3609/6804/6053 3611/6811/6060 3616/6816/6065 3612/6817/6066
+f 3612/6817/6066 3616/6816/6065 10360/6818/6067 10361/6819/6068
+f 3611/6811/6060 10121/6813/6062 10122/6820/6069 3616/6816/6065
+f 3616/6816/6065 10122/6820/6069 13193/6821/6070 10360/6818/6067
+f 3609/6804/6053 3612/6817/6066 3617/6822/6071 3613/6805/6054
+f 3613/6805/6054 3617/6822/6071 10116/6800/6049 10115/6793/6042
+f 3612/6817/6066 10361/6819/6068 10362/6823/6072 3617/6822/6071
+f 3617/6822/6071 10362/6823/6072 13194/6801/6050 10116/6800/6049
+f 3618/6824/6073 3622/6825/6074 3623/6826/6075 3619/6827/6076
+f 3619/6827/6076 3623/6826/6075 9928/6828/6077 9929/6829/6078
+f 3622/6825/6074 10121/6813/6062 10120/6812/6061 3623/6826/6075
+f 3623/6826/6075 10120/6812/6061 13110/6815/6064 9928/6828/6077
+f 3618/6824/6073 3619/6827/6076 3624/6830/6079 3620/6831/6080
+f 3620/6831/6080 3624/6830/6079 10126/6832/6081 10127/6833/6082
+f 3619/6827/6076 9929/6829/6078 9930/6834/6083 3624/6830/6079
+f 3624/6830/6079 9930/6834/6083 13111/6835/6084 10126/6832/6081
+f 3618/6824/6073 3620/6831/6080 3625/6836/6085 3621/6837/6086
+f 3621/6837/6086 3625/6836/6085 10354/6838/6087 10355/6839/6088
+f 3620/6831/6080 10127/6833/6082 10128/6840/6089 3625/6836/6085
+f 3625/6836/6085 10128/6840/6089 13192/6841/6090 10354/6838/6087
+f 3618/6824/6073 3621/6837/6086 3626/6842/6091 3622/6825/6074
+f 3622/6825/6074 3626/6842/6091 10122/6820/6069 10121/6813/6062
+f 3621/6837/6086 10355/6839/6088 10356/6843/6092 3626/6842/6091
+f 3626/6842/6091 10356/6843/6092 13193/6821/6070 10122/6820/6069
+f 3627/6844/6093 3631/6845/6094 3632/6846/6095 3628/6847/6096
+f 3628/6847/6096 3632/6846/6095 9931/6848/6097 9932/6849/6098
+f 3631/6845/6094 10127/6833/6082 10126/6832/6081 3632/6846/6095
+f 3632/6846/6095 10126/6832/6081 13111/6835/6084 9931/6848/6097
+f 3627/6844/6093 3628/6847/6096 3633/6850/6099 3629/6851/6100
+f 3629/6851/6100 3633/6850/6099 10132/6852/6101 10133/6853/6102
+f 3628/6847/6096 9932/6849/6098 9933/6854/6103 3633/6850/6099
+f 3633/6850/6099 9933/6854/6103 13112/6855/6104 10132/6852/6101
+f 3627/6844/6093 3629/6851/6100 3634/6856/6105 3630/6857/6106
+f 3630/6857/6106 3634/6856/6105 10348/6858/6107 10349/6859/6108
+f 3629/6851/6100 10133/6853/6102 10134/6860/6109 3634/6856/6105
+f 3634/6856/6105 10134/6860/6109 13191/6861/5474 10348/6858/6107
+f 3627/6844/6093 3630/6857/6106 3635/6862/6110 3631/6845/6094
+f 3631/6845/6094 3635/6862/6110 10128/6840/6089 10127/6833/6082
+f 3630/6857/6106 10349/6859/6108 10350/6863/6111 3635/6862/6110
+f 3635/6862/6110 10350/6863/6111 13192/6841/6090 10128/6840/6089
+f 3636/6864/6112 3640/6865/6113 3641/6866/6114 3637/6867/6115
+f 3637/6867/6115 3641/6866/6114 9934/6868/6116 9935/6869/6117
+f 3640/6865/6113 10133/6853/6102 10132/6852/6101 3641/6866/6114
+f 3641/6866/6114 10132/6852/6101 13112/6855/6104 9934/6868/6116
+f 3636/6864/6112 3637/6867/6115 3642/6870/6118 3638/6871/6119
+f 3638/6871/6119 3642/6870/6118 10138/6872/6120 10139/6873/6121
+f 3637/6867/6115 9935/6869/6117 9936/6874/6122 3642/6870/6118
+f 3642/6870/6118 9936/6874/6122 13113/6875/6123 10138/6872/6120
+f 3636/6864/6112 3638/6871/6119 3643/6876/6124 3639/6877/6125
+f 3639/6877/6125 3643/6876/6124 10342/6878/6126 10343/6879/254
+f 3638/6871/6119 10139/6873/6121 10140/6880/6127 3643/6876/6124
+f 3643/6876/6124 10140/6880/6127 13190/6881/6128 10342/6878/6126
+f 3636/6864/6112 3639/6877/6125 3644/6882/6129 3640/6865/6113
+f 3640/6865/6113 3644/6882/6129 10134/6860/6109 10133/6853/6102
+f 3639/6877/6125 10343/6879/254 10344/6883/6130 3644/6882/6129
+f 3644/6882/6129 10344/6883/6130 13191/6861/5474 10134/6860/6109
+f 3645/6884/6131 3649/6885/6132 3650/6886/6133 3646/6887/6134
+f 3646/6887/6134 3650/6886/6133 9937/6888/6135 9938/6889/6136
+f 3649/6885/6132 10139/6873/6121 10138/6872/6120 3650/6886/6133
+f 3650/6886/6133 10138/6872/6120 13113/6875/6123 9937/6888/6135
+f 3645/6884/6131 3646/6887/6134 3651/6890/6137 3647/6891/6138
+f 3647/6891/6138 3651/6890/6137 10144/6892/6139 10145/6893/6140
+f 3646/6887/6134 9938/6889/6136 9939/6894/6141 3651/6890/6137
+f 3651/6890/6137 9939/6894/6141 13114/6895/6142 10144/6892/6139
+f 3645/6884/6131 3647/6891/6138 3652/6896/6143 3648/6897/6144
+f 3648/6897/6144 3652/6896/6143 10336/6898/6145 10337/6899/6146
+f 3647/6891/6138 10145/6893/6140 10146/6900/6147 3652/6896/6143
+f 3652/6896/6143 10146/6900/6147 13189/6901/225 10336/6898/6145
+f 3645/6884/6131 3648/6897/6144 3653/6902/6148 3649/6885/6132
+f 3649/6885/6132 3653/6902/6148 10140/6880/6127 10139/6873/6121
+f 3648/6897/6144 10337/6899/6146 10338/6903/6149 3653/6902/6148
+f 3653/6902/6148 10338/6903/6149 13190/6881/6128 10140/6880/6127
+f 3654/6904/6150 3658/6905/6151 3659/6906/6152 3655/6907/6153
+f 3655/6907/6153 3659/6906/6152 9940/6908/6154 9941/6909/6155
+f 3658/6905/6151 10145/6893/6140 10144/6892/6139 3659/6906/6152
+f 3659/6906/6152 10144/6892/6139 13114/6895/6142 9940/6908/6154
+f 3654/6904/6150 3655/6907/6153 3660/6910/6156 3656/6911/6157
+f 3656/6911/6157 3660/6910/6156 10150/6912/6158 10151/6913/6159
+f 3655/6907/6153 9941/6909/6155 9942/6914/6160 3660/6910/6156
+f 3660/6910/6156 9942/6914/6160 13115/6915/6161 10150/6912/6158
+f 3654/6904/6150 3656/6911/6157 3661/6916/6162 3657/6917/6163
+f 3657/6917/6163 3661/6916/6162 10330/6918/211 10331/6919/210
+f 3656/6911/6157 10151/6913/6159 10152/6920/6164 3661/6916/6162
+f 3661/6916/6162 10152/6920/6164 13188/6921/205 10330/6918/211
+f 3654/6904/6150 3657/6917/6163 3662/6922/6165 3658/6905/6151
+f 3658/6905/6151 3662/6922/6165 10146/6900/6147 10145/6893/6140
+f 3657/6917/6163 10331/6919/210 10332/6923/223 3662/6922/6165
+f 3662/6922/6165 10332/6923/223 13189/6901/225 10146/6900/6147
+f 3663/6924/6166 3667/6925/6167 3668/6926/6168 3664/6927/6169
+f 3664/6927/6169 3668/6926/6168 9943/6928/6170 9944/6929/6171
+f 3667/6925/6167 10151/6913/6159 10150/6912/6158 3668/6926/6168
+f 3668/6926/6168 10150/6912/6158 13115/6915/6161 9943/6928/6170
+f 3663/6924/6166 3664/6927/6169 3669/6930/6172 3665/6931/6173
+f 3665/6931/6173 3669/6930/6172 10156/6932/6174 10157/6933/6175
+f 3664/6927/6169 9944/6929/6171 9945/6934/6176 3669/6930/6172
+f 3669/6930/6172 9945/6934/6176 13116/6935/6177 10156/6932/6174
+f 3663/6924/6166 3665/6931/6173 3670/6936/6178 3666/6937/6179
+f 3666/6937/6179 3670/6936/6178 10324/6938/191 10325/6939/190
+f 3665/6931/6173 10157/6933/6175 10158/6940/6180 3670/6936/6178
+f 3670/6936/6178 10158/6940/6180 13187/6941/185 10324/6938/191
+f 3663/6924/6166 3666/6937/6179 3671/6942/6181 3667/6925/6167
+f 3667/6925/6167 3671/6942/6181 10152/6920/6164 10151/6913/6159
+f 3666/6937/6179 10325/6939/190 10326/6943/203 3671/6942/6181
+f 3671/6942/6181 10326/6943/203 13188/6921/205 10152/6920/6164
+f 3672/6944/6182 3676/6945/6183 3677/6946/6184 3673/6947/6185
+f 3673/6947/6185 3677/6946/6184 9946/6948/6186 9947/6949/6187
+f 3676/6945/6183 10157/6933/6175 10156/6932/6174 3677/6946/6184
+f 3677/6946/6184 10156/6932/6174 13116/6935/6177 9946/6948/6186
+f 3672/6944/6182 3673/6947/6185 3678/6950/6188 3674/6951/6189
+f 3674/6951/6189 3678/6950/6188 10162/6952/6190 10163/6953/6191
+f 3673/6947/6185 9947/6949/6187 9948/6954/6192 3678/6950/6188
+f 3678/6950/6188 9948/6954/6192 13117/6955/6193 10162/6952/6190
+f 3672/6944/6182 3674/6951/6189 3679/6956/6194 3675/6957/6195
+f 3675/6957/6195 3679/6956/6194 10318/6958/171 10319/6959/170
+f 3674/6951/6189 10163/6953/6191 10164/6960/6196 3679/6956/6194
+f 3679/6956/6194 10164/6960/6196 13186/6961/165 10318/6958/171
+f 3672/6944/6182 3675/6957/6195 3680/6962/6197 3676/6945/6183
+f 3676/6945/6183 3680/6962/6197 10158/6940/6180 10157/6933/6175
+f 3675/6957/6195 10319/6959/170 10320/6963/183 3680/6962/6197
+f 3680/6962/6197 10320/6963/183 13187/6941/185 10158/6940/6180
+f 3681/6964/6198 3685/6965/6199 3686/6966/6200 3682/6967/6201
+f 3682/6967/6201 3686/6966/6200 9949/6968/6202 9950/6969/6203
+f 3685/6965/6199 10163/6953/6191 10162/6952/6190 3686/6966/6200
+f 3686/6966/6200 10162/6952/6190 13117/6955/6193 9949/6968/6202
+f 3681/6964/6198 3682/6967/6201 3687/6970/6204 3683/6971/6205
+f 3683/6971/6205 3687/6970/6204 10168/6972/6206 10169/6973/6207
+f 3682/6967/6201 9950/6969/6203 9951/6974/6208 3687/6970/6204
+f 3687/6970/6204 9951/6974/6208 13118/6975/6209 10168/6972/6206
+f 3681/6964/6198 3683/6971/6205 3688/6976/6210 3684/6977/6211
+f 3684/6977/6211 3688/6976/6210 10312/6978/151 10313/6979/150
+f 3683/6971/6205 10169/6973/6207 10170/6980/6212 3688/6976/6210
+f 3688/6976/6210 10170/6980/6212 13185/6981/145 10312/6978/151
+f 3681/6964/6198 3684/6977/6211 3689/6982/6213 3685/6965/6199
+f 3685/6965/6199 3689/6982/6213 10164/6960/6196 10163/6953/6191
+f 3684/6977/6211 10313/6979/150 10314/6983/163 3689/6982/6213
+f 3689/6982/6213 10314/6983/163 13186/6961/165 10164/6960/6196
+f 3690/6984/6214 3694/6985/6215 3695/6986/6216 3691/6987/6217
+f 3691/6987/6217 3695/6986/6216 9952/6988/6218 9953/6989/6219
+f 3694/6985/6215 10169/6973/6207 10168/6972/6206 3695/6986/6216
+f 3695/6986/6216 10168/6972/6206 13118/6975/6209 9952/6988/6218
+f 3690/6984/6214 3691/6987/6217 3696/6990/6220 3692/6991/6221
+f 3692/6991/6221 3696/6990/6220 10174/6992/6222 10175/6993/6223
+f 3691/6987/6217 9953/6989/6219 9954/6994/6224 3696/6990/6220
+f 3696/6990/6220 9954/6994/6224 13119/6995/6225 10174/6992/6222
+f 3690/6984/6214 3692/6991/6221 3697/6996/6226 3693/6997/6227
+f 3693/6997/6227 3697/6996/6226 10306/6998/131 10307/6999/130
+f 3692/6991/6221 10175/6993/6223 10176/7000/6228 3697/6996/6226
+f 3697/6996/6226 10176/7000/6228 13184/7001/125 10306/6998/131
+f 3690/6984/6214 3693/6997/6227 3698/7002/6229 3694/6985/6215
+f 3694/6985/6215 3698/7002/6229 10170/6980/6212 10169/6973/6207
+f 3693/6997/6227 10307/6999/130 10308/7003/143 3698/7002/6229
+f 3698/7002/6229 10308/7003/143 13185/6981/145 10170/6980/6212
+f 3699/7004/6230 3703/7005/6231 3704/7006/6232 3700/7007/6233
+f 3700/7007/6233 3704/7006/6232 9955/7008/6234 9956/7009/6235
+f 3703/7005/6231 10175/6993/6223 10174/6992/6222 3704/7006/6232
+f 3704/7006/6232 10174/6992/6222 13119/6995/6225 9955/7008/6234
+f 3699/7004/6230 3700/7007/6233 3705/7010/6236 3701/7011/6237
+f 3701/7011/6237 3705/7010/6236 10180/7012/6238 10181/7013/6239
+f 3700/7007/6233 9956/7009/6235 9957/7014/6240 3705/7010/6236
+f 3705/7010/6236 9957/7014/6240 13120/7015/6241 10180/7012/6238
+f 3699/7004/6230 3701/7011/6237 3706/7016/6242 3702/7017/6243
+f 3702/7017/6243 3706/7016/6242 10300/7018/6244 10301/7019/6245
+f 3701/7011/6237 10181/7013/6239 10182/7020/6246 3706/7016/6242
+f 3706/7016/6242 10182/7020/6246 13183/7021/6247 10300/7018/6244
+f 3699/7004/6230 3702/7017/6243 3707/7022/6248 3703/7005/6231
+f 3703/7005/6231 3707/7022/6248 10176/7000/6228 10175/6993/6223
+f 3702/7017/6243 10301/7019/6245 10302/7023/6249 3707/7022/6248
+f 3707/7022/6248 10302/7023/6249 13184/7001/125 10176/7000/6228
+f 3708/7024/6250 3712/7025/6251 3713/7026/6252 3709/7027/6253
+f 3709/7027/6253 3713/7026/6252 11159/7028/6254 11160/7029/6255
+f 3712/7025/6251 11163/7030/6256 11164/7031/6257 3713/7026/6252
+f 3713/7026/6252 11164/7031/6257 13326/7032/6258 11159/7028/6254
+f 3708/7024/6250 3709/7027/6253 3714/7033/6259 3710/7034/6260
+f 3710/7034/6260 3714/7033/6259 9961/7035/6261 9962/7036/6262
+f 3709/7027/6253 11160/7029/6255 11161/7037/6263 3714/7033/6259
+f 3714/7033/6259 11161/7037/6263 13121/7038/6264 9961/7035/6261
+f 3708/7024/6250 3710/7034/6260 3715/7039/6265 3711/7040/6266
+f 3711/7040/6266 3715/7039/6265 10294/7041/6267 10295/7042/6268
+f 3710/7034/6260 9962/7036/6262 9963/7043/6269 3715/7039/6265
+f 3715/7039/6265 9963/7043/6269 13182/7044/6270 10294/7041/6267
+f 3708/7024/6250 3711/7040/6266 3716/7045/6271 3712/7025/6251
+f 3712/7025/6251 3716/7045/6271 11162/7046/6272 11163/7030/6256
+f 3711/7040/6266 10295/7042/6268 10296/7047/6273 3716/7045/6271
+f 3716/7045/6271 10296/7047/6273 13325/7048/90 11162/7046/6272
+f 3717/7049/6274 3721/7050/6275 3722/7051/6276 3718/7052/6277
+f 3718/7052/6277 3722/7051/6276 9751/7053/6278 9752/7054/6279
+f 3721/7050/6275 7790/1313/1237 7789/1312/1236 3722/7051/6276
+f 3722/7051/6276 7789/1312/1236 12712/1316/1240 9751/7053/6278
+f 3717/7049/6274 3718/7052/6277 3723/7055/6280 3719/7056/6281
+f 3719/7056/6281 3723/7055/6280 9916/7057/6282 9917/7058/6283
+f 3718/7052/6277 9752/7054/6279 9753/7059/6284 3723/7055/6280
+f 3723/7055/6280 9753/7059/6284 13080/7060/6285 9916/7057/6282
+f 3717/7049/6274 3719/7056/6281 3724/7061/6286 3720/7062/6287
+f 3720/7062/6287 3724/7061/6286 10194/5683/5034 10193/5678/5029
+f 3719/7056/6281 9917/7058/6283 9918/7063/6288 3724/7061/6286
+f 3724/7061/6286 9918/7063/6288 13166/5684/5035 10194/5683/5034
+f 3717/7049/6274 3720/7062/6287 3725/7064/6289 3721/7050/6275
+f 3721/7050/6275 3725/7064/6289 7791/1319/1243 7790/1313/1237
+f 3720/7062/6287 10193/5678/5029 10192/5677/5028 3725/7064/6289
+f 3725/7064/6289 10192/5677/5028 12798/9/9 7791/1319/1243
+f 3726/7065/6290 3730/7066/6291 3731/7067/6292 3727/7068/6293
+f 3727/7068/6293 3731/7067/6292 9754/7069/6294 9755/7070/6295
+f 3730/7066/6291 9917/7058/6283 9916/7057/6282 3731/7067/6292
+f 3731/7067/6292 9916/7057/6282 13080/7060/6285 9754/7069/6294
+f 3726/7065/6290 3727/7068/6293 3732/7071/6296 3728/7072/6297
+f 3728/7072/6297 3732/7071/6296 9913/7073/6298 9914/7074/6299
+f 3727/7068/6293 9755/7070/6295 9756/7075/6300 3732/7071/6296
+f 3732/7071/6296 9756/7075/6300 13081/7076/6301 9913/7073/6298
+f 3726/7065/6290 3728/7072/6297 3733/7077/6302 3729/7078/6303
+f 3729/7078/6303 3733/7077/6302 10200/5703/5054 10199/5698/5049
+f 3728/7072/6297 9914/7074/6299 9915/7079/6304 3733/7077/6302
+f 3733/7077/6302 9915/7079/6304 13167/5704/5055 10200/5703/5054
+f 3726/7065/6290 3729/7078/6303 3734/7080/6305 3730/7066/6291
+f 3730/7066/6291 3734/7080/6305 9918/7063/6288 9917/7058/6283
+f 3729/7078/6303 10199/5698/5049 10198/5697/5048 3734/7080/6305
+f 3734/7080/6305 10198/5697/5048 13166/5684/5035 9918/7063/6288
+f 3735/7081/6306 3739/7082/6307 3740/7083/6308 3736/7084/6309
+f 3736/7084/6309 3740/7083/6308 9757/7085/6310 9758/7086/6311
+f 3739/7082/6307 9914/7074/6299 9913/7073/6298 3740/7083/6308
+f 3740/7083/6308 9913/7073/6298 13081/7076/6301 9757/7085/6310
+f 3735/7081/6306 3736/7084/6309 3741/7087/6312 3737/7088/6313
+f 3737/7088/6313 3741/7087/6312 9910/7089/6314 9911/7090/6315
+f 3736/7084/6309 9758/7086/6311 9759/7091/6316 3741/7087/6312
+f 3741/7087/6312 9759/7091/6316 13082/7092/6317 9910/7089/6314
+f 3735/7081/6306 3737/7088/6313 3742/7093/6318 3738/7094/6319
+f 3738/7094/6319 3742/7093/6318 10206/5723/5074 10205/5718/5069
+f 3737/7088/6313 9911/7090/6315 9912/7095/6320 3742/7093/6318
+f 3742/7093/6318 9912/7095/6320 13168/5724/5075 10206/5723/5074
+f 3735/7081/6306 3738/7094/6319 3743/7096/6321 3739/7082/6307
+f 3739/7082/6307 3743/7096/6321 9915/7079/6304 9914/7074/6299
+f 3738/7094/6319 10205/5718/5069 10204/5717/5068 3743/7096/6321
+f 3743/7096/6321 10204/5717/5068 13167/5704/5055 9915/7079/6304
+f 3744/7097/6322 3748/7098/6323 3749/7099/6324 3745/7100/6325
+f 3745/7100/6325 3749/7099/6324 9760/7101/6326 9761/7102/6327
+f 3748/7098/6323 9911/7090/6315 9910/7089/6314 3749/7099/6324
+f 3749/7099/6324 9910/7089/6314 13082/7092/6317 9760/7101/6326
+f 3744/7097/6322 3745/7100/6325 3750/7103/6328 3746/7104/6329
+f 3746/7104/6329 3750/7103/6328 9907/7105/6330 9908/7106/6331
+f 3745/7100/6325 9761/7102/6327 9762/7107/6332 3750/7103/6328
+f 3750/7103/6328 9762/7107/6332 13083/7108/6333 9907/7105/6330
+f 3744/7097/6322 3746/7104/6329 3751/7109/6334 3747/7110/6335
+f 3747/7110/6335 3751/7109/6334 10212/5743/5094 10211/5738/5089
+f 3746/7104/6329 9908/7106/6331 9909/7111/6336 3751/7109/6334
+f 3751/7109/6334 9909/7111/6336 13169/5744/5095 10212/5743/5094
+f 3744/7097/6322 3747/7110/6335 3752/7112/6337 3748/7098/6323
+f 3748/7098/6323 3752/7112/6337 9912/7095/6320 9911/7090/6315
+f 3747/7110/6335 10211/5738/5089 10210/5737/5088 3752/7112/6337
+f 3752/7112/6337 10210/5737/5088 13168/5724/5075 9912/7095/6320
+f 3753/7113/6338 3757/7114/6339 3758/7115/6340 3754/7116/6341
+f 3754/7116/6341 3758/7115/6340 9763/7117/6342 9764/7118/6343
+f 3757/7114/6339 9908/7106/6331 9907/7105/6330 3758/7115/6340
+f 3758/7115/6340 9907/7105/6330 13083/7108/6333 9763/7117/6342
+f 3753/7113/6338 3754/7116/6341 3759/7119/6344 3755/7120/6345
+f 3755/7120/6345 3759/7119/6344 9904/7121/6346 9905/7122/6347
+f 3754/7116/6341 9764/7118/6343 9765/7123/6348 3759/7119/6344
+f 3759/7119/6344 9765/7123/6348 13084/7124/6349 9904/7121/6346
+f 3753/7113/6338 3755/7120/6345 3760/7125/6350 3756/7126/6351
+f 3756/7126/6351 3760/7125/6350 10218/5763/5114 10217/5758/5109
+f 3755/7120/6345 9905/7122/6347 9906/7127/6352 3760/7125/6350
+f 3760/7125/6350 9906/7127/6352 13170/5764/5115 10218/5763/5114
+f 3753/7113/6338 3756/7126/6351 3761/7128/6353 3757/7114/6339
+f 3757/7114/6339 3761/7128/6353 9909/7111/6336 9908/7106/6331
+f 3756/7126/6351 10217/5758/5109 10216/5757/5108 3761/7128/6353
+f 3761/7128/6353 10216/5757/5108 13169/5744/5095 9909/7111/6336
+f 3762/7129/6354 3766/7130/6355 3767/7131/6356 3763/7132/6357
+f 3763/7132/6357 3767/7131/6356 9766/7133/6358 9767/7134/6359
+f 3766/7130/6355 9905/7122/6347 9904/7121/6346 3767/7131/6356
+f 3767/7131/6356 9904/7121/6346 13084/7124/6349 9766/7133/6358
+f 3762/7129/6354 3763/7132/6357 3768/7135/6360 3764/7136/6361
+f 3764/7136/6361 3768/7135/6360 9901/7137/6362 9902/7138/6363
+f 3763/7132/6357 9767/7134/6359 9768/7139/6364 3768/7135/6360
+f 3768/7135/6360 9768/7139/6364 13085/7140/6365 9901/7137/6362
+f 3762/7129/6354 3764/7136/6361 3769/7141/6366 3765/7142/6367
+f 3765/7142/6367 3769/7141/6366 10224/5783/5133 10223/5778/1221
+f 3764/7136/6361 9902/7138/6363 9903/7143/6368 3769/7141/6366
+f 3769/7141/6366 9903/7143/6368 13171/5784/5134 10224/5783/5133
+f 3762/7129/6354 3765/7142/6367 3770/7144/6369 3766/7130/6355
+f 3766/7130/6355 3770/7144/6369 9906/7127/6352 9905/7122/6347
+f 3765/7142/6367 10223/5778/1221 10222/5777/5128 3770/7144/6369
+f 3770/7144/6369 10222/5777/5128 13170/5764/5115 9906/7127/6352
+f 3771/7145/6370 3775/7146/6371 3776/7147/6372 3772/7148/6373
+f 3772/7148/6373 3776/7147/6372 9769/7149/6374 9770/7150/6375
+f 3775/7146/6371 9902/7138/6363 9901/7137/6362 3776/7147/6372
+f 3776/7147/6372 9901/7137/6362 13085/7140/6365 9769/7149/6374
+f 3771/7145/6370 3772/7148/6373 3777/7151/6376 3773/7152/6377
+f 3773/7152/6377 3777/7151/6376 9898/7153/6378 9899/7154/6379
+f 3772/7148/6373 9770/7150/6375 9771/7155/6380 3777/7151/6376
+f 3777/7151/6376 9771/7155/6380 13086/7156/6381 9898/7153/6378
+f 3771/7145/6370 3773/7152/6377 3778/7157/6382 3774/7158/6383
+f 3774/7158/6383 3778/7157/6382 10230/5803/5153 10229/5798/5148
+f 3773/7152/6377 9899/7154/6379 9900/7159/1516 3778/7157/6382
+f 3778/7157/6382 9900/7159/1516 13172/5804/1182 10230/5803/5153
+f 3771/7145/6370 3774/7158/6383 3779/7160/6384 3775/7146/6371
+f 3775/7146/6371 3779/7160/6384 9903/7143/6368 9902/7138/6363
+f 3774/7158/6383 10229/5798/5148 10228/5797/5147 3779/7160/6384
+f 3779/7160/6384 10228/5797/5147 13171/5784/5134 9903/7143/6368
+f 3780/7161/6385 3784/7162/6386 3785/7163/6387 3781/7164/6388
+f 3781/7164/6388 3785/7163/6387 9772/7165/6389 9773/7166/6390
+f 3784/7162/6386 9899/7154/6379 9898/7153/6378 3785/7163/6387
+f 3785/7163/6387 9898/7153/6378 13086/7156/6381 9772/7165/6389
+f 3780/7161/6385 3781/7164/6388 3786/7167/6391 3782/7168/6392
+f 3782/7168/6392 3786/7167/6391 9895/7169/6393 9896/7170/6394
+f 3781/7164/6388 9773/7166/6390 9774/7171/6395 3786/7167/6391
+f 3786/7167/6391 9774/7171/6395 13087/7172/6396 9895/7169/6393
+f 3780/7161/6385 3782/7168/6392 3787/7173/1534 3783/7174/1533
+f 3783/7174/1533 3787/7173/1534 10236/5823/1175 10235/5818/1176
+f 3782/7168/6392 9896/7170/6394 9897/7175/1536 3787/7173/1534
+f 3787/7173/1534 9897/7175/1536 13173/5824/1162 10236/5823/1175
+f 3780/7161/6385 3783/7174/1533 3788/7176/1547 3784/7162/6386
+f 3784/7162/6386 3788/7176/1547 9900/7159/1516 9899/7154/6379
+f 3783/7174/1533 10235/5818/1176 10234/5817/1181 3788/7176/1547
+f 3788/7176/1547 10234/5817/1181 13172/5804/1182 9900/7159/1516
+f 3789/7177/6397 3793/7178/6398 3794/7179/6399 3790/7180/6400
+f 3790/7180/6400 3794/7179/6399 9775/7181/6401 9776/7182/6402
+f 3793/7178/6398 9896/7170/6394 9895/7169/6393 3794/7179/6399
+f 3794/7179/6399 9895/7169/6393 13087/7172/6396 9775/7181/6401
+f 3789/7177/6397 3790/7180/6400 3795/7183/6403 3791/7184/6404
+f 3791/7184/6404 3795/7183/6403 9892/7185/6405 9893/7186/6406
+f 3790/7180/6400 9776/7182/6402 9777/7187/6407 3795/7183/6403
+f 3795/7183/6403 9777/7187/6407 13088/7188/6408 9892/7185/6405
+f 3789/7177/6397 3791/7184/6404 3796/7189/1550 3792/7190/1549
+f 3792/7190/1549 3796/7189/1550 10242/5843/1155 10241/5838/1156
+f 3791/7184/6404 9893/7186/6406 9894/7191/1552 3796/7189/1550
+f 3796/7189/1550 9894/7191/1552 13174/5844/1142 10242/5843/1155
+f 3789/7177/6397 3792/7190/1549 3797/7192/1563 3793/7178/6398
+f 3793/7178/6398 3797/7192/1563 9897/7175/1536 9896/7170/6394
+f 3792/7190/1549 10241/5838/1156 10240/5837/1161 3797/7192/1563
+f 3797/7192/1563 10240/5837/1161 13173/5824/1162 9897/7175/1536
+f 3798/7193/6409 3802/7194/6410 3803/7195/6411 3799/7196/6412
+f 3799/7196/6412 3803/7195/6411 9778/7197/6413 9779/7198/6414
+f 3802/7194/6410 9893/7186/6406 9892/7185/6405 3803/7195/6411
+f 3803/7195/6411 9892/7185/6405 13088/7188/6408 9778/7197/6413
+f 3798/7193/6409 3799/7196/6412 3804/7199/6415 3800/7200/6416
+f 3800/7200/6416 3804/7199/6415 9889/7201/6417 9890/7202/6418
+f 3799/7196/6412 9779/7198/6414 9780/7203/6419 3804/7199/6415
+f 3804/7199/6415 9780/7203/6419 13089/7204/6420 9889/7201/6417
+f 3798/7193/6409 3800/7200/6416 3805/7205/1566 3801/7206/1565
+f 3801/7206/1565 3805/7205/1566 10248/5863/1135 10247/5858/1136
+f 3800/7200/6416 9890/7202/6418 9891/7207/1568 3805/7205/1566
+f 3805/7205/1566 9891/7207/1568 13175/5864/1122 10248/5863/1135
+f 3798/7193/6409 3801/7206/1565 3806/7208/1579 3802/7194/6410
+f 3802/7194/6410 3806/7208/1579 9894/7191/1552 9893/7186/6406
+f 3801/7206/1565 10247/5858/1136 10246/5857/1141 3806/7208/1579
+f 3806/7208/1579 10246/5857/1141 13174/5844/1142 9894/7191/1552
+f 3807/7209/6421 3811/7210/6422 3812/7211/6423 3808/7212/6424
+f 3808/7212/6424 3812/7211/6423 9781/7213/6425 9782/7214/6426
+f 3811/7210/6422 9890/7202/6418 9889/7201/6417 3812/7211/6423
+f 3812/7211/6423 9889/7201/6417 13089/7204/6420 9781/7213/6425
+f 3807/7209/6421 3808/7212/6424 3813/7215/6427 3809/7216/6428
+f 3809/7216/6428 3813/7215/6427 9886/7217/6429 9887/7218/6430
+f 3808/7212/6424 9782/7214/6426 9783/7219/6431 3813/7215/6427
+f 3813/7215/6427 9783/7219/6431 13090/7220/6432 9886/7217/6429
+f 3807/7209/6421 3809/7216/6428 3814/7221/1582 3810/7222/1581
+f 3810/7222/1581 3814/7221/1582 10254/5883/1115 10253/5878/1116
+f 3809/7216/6428 9887/7218/6430 9888/7223/1584 3814/7221/1582
+f 3814/7221/1582 9888/7223/1584 13176/5884/1102 10254/5883/1115
+f 3807/7209/6421 3810/7222/1581 3815/7224/1595 3811/7210/6422
+f 3811/7210/6422 3815/7224/1595 9891/7207/1568 9890/7202/6418
+f 3810/7222/1581 10253/5878/1116 10252/5877/1121 3815/7224/1595
+f 3815/7224/1595 10252/5877/1121 13175/5864/1122 9891/7207/1568
+f 3816/7225/6433 3820/7226/6434 3821/7227/6435 3817/7228/6436
+f 3817/7228/6436 3821/7227/6435 9784/7229/6437 9785/7230/6438
+f 3820/7226/6434 9887/7218/6430 9886/7217/6429 3821/7227/6435
+f 3821/7227/6435 9886/7217/6429 13090/7220/6432 9784/7229/6437
+f 3816/7225/6433 3817/7228/6436 3822/7231/6439 3818/7232/6440
+f 3818/7232/6440 3822/7231/6439 9883/7233/6441 9884/7234/6442
+f 3817/7228/6436 9785/7230/6438 9786/7235/6443 3822/7231/6439
+f 3822/7231/6439 9786/7235/6443 13091/7236/6444 9883/7233/6441
+f 3816/7225/6433 3818/7232/6440 3823/7237/1598 3819/7238/1597
+f 3819/7238/1597 3823/7237/1598 10260/5903/1095 10259/5898/1096
+f 3818/7232/6440 9884/7234/6442 9885/7239/1600 3823/7237/1598
+f 3823/7237/1598 9885/7239/1600 13177/5904/1082 10260/5903/1095
+f 3816/7225/6433 3819/7238/1597 3824/7240/1611 3820/7226/6434
+f 3820/7226/6434 3824/7240/1611 9888/7223/1584 9887/7218/6430
+f 3819/7238/1597 10259/5898/1096 10258/5897/1101 3824/7240/1611
+f 3824/7240/1611 10258/5897/1101 13176/5884/1102 9888/7223/1584
+f 3825/7241/6445 3829/7242/6446 3830/7243/6447 3826/7244/6448
+f 3826/7244/6448 3830/7243/6447 9787/7245/6449 9788/7246/6450
+f 3829/7242/6446 9884/7234/6442 9883/7233/6441 3830/7243/6447
+f 3830/7243/6447 9883/7233/6441 13091/7236/6444 9787/7245/6449
+f 3825/7241/6445 3826/7244/6448 3831/7247/6451 3827/7248/6452
+f 3827/7248/6452 3831/7247/6451 9880/7249/6453 9881/7250/6454
+f 3826/7244/6448 9788/7246/6450 9789/7251/6455 3831/7247/6451
+f 3831/7247/6451 9789/7251/6455 13092/7252/6456 9880/7249/6453
+f 3825/7241/6445 3827/7248/6452 3832/7253/6457 3828/7254/6458
+f 3828/7254/6458 3832/7253/6457 10266/5923/5252 10265/5918/5247
+f 3827/7248/6452 9881/7250/6454 9882/7255/6459 3832/7253/6457
+f 3832/7253/6457 9882/7255/6459 13178/5924/5253 10266/5923/5252
+f 3825/7241/6445 3828/7254/6458 3833/7256/6460 3829/7242/6446
+f 3829/7242/6446 3833/7256/6460 9885/7239/1600 9884/7234/6442
+f 3828/7254/6458 10265/5918/5247 10264/5917/5246 3833/7256/6460
+f 3833/7256/6460 10264/5917/5246 13177/5904/1082 9885/7239/1600
+f 3834/7257/6461 3838/7258/6462 3839/7259/6463 3835/7260/6464
+f 3835/7260/6464 3839/7259/6463 11242/7261/6465 11243/7262/6466
+f 3838/7258/6462 11246/7263/6467 11247/7264/6468 3839/7259/6463
+f 3839/7259/6463 11247/7264/6468 13340/7265/6469 11242/7261/6465
+f 3834/7257/6461 3835/7260/6464 3840/7266/6470 3836/7267/6471
+f 3836/7267/6471 3840/7266/6470 9835/7268/6472 9836/7269/6473
+f 3835/7260/6464 11243/7262/6466 11244/7270/6474 3840/7266/6470
+f 3840/7266/6470 11244/7270/6474 13093/7271/6475 9835/7268/6472
+f 3834/7257/6461 3836/7267/6471 3841/7272/6476 3837/7273/6477
+f 3837/7273/6477 3841/7272/6476 11238/5946/5274 11237/5938/5267
+f 3836/7267/6471 9836/7269/6473 9837/7274/6478 3841/7272/6476
+f 3841/7272/6476 9837/7274/6478 13179/5947/5275 11238/5946/5274
+f 3834/7257/6461 3837/7273/6477 3842/7275/6479 3838/7258/6462
+f 3838/7258/6462 3842/7275/6479 11245/7276/6480 11246/7263/6467
+f 3837/7273/6477 11237/5938/5267 11236/5937/5266 3842/7275/6479
+f 3842/7275/6479 11236/5937/5266 13339/5941/1056 11245/7276/6480
+f 3843/7277/6481 3847/7278/6482 3848/7279/6483 3844/7280/6484
+f 3844/7280/6484 3848/7279/6483 10278/6205/5473 10277/6198/5468
+f 3847/7278/6482 9971/7281/6485 9972/7282/6486 3848/7279/6483
+f 3848/7279/6483 9972/7282/6486 13180/6206/5474 10278/6205/5473
+f 3843/7277/6481 3844/7280/6484 3849/7283/6487 3845/7284/6488
+f 3845/7284/6488 3849/7283/6487 9837/7285/6478 9836/7286/6473
+f 3844/7280/6484 10277/6198/5468 10276/6197/5467 3849/7283/6487
+f 3849/7283/6487 10276/6197/5467 13179/6200/5275 9837/7285/6478
+f 3843/7277/6481 3845/7284/6488 3850/7287/6489 3846/7288/6490
+f 3846/7288/6490 3850/7287/6489 9967/7289/6491 9968/7290/6492
+f 3845/7284/6488 9836/7286/6473 9835/7291/6472 3850/7287/6489
+f 3850/7287/6489 9835/7291/6472 13093/7292/6475 9967/7289/6491
+f 3843/7277/6481 3846/7288/6490 3851/7293/6493 3847/7278/6482
+f 3847/7278/6482 3851/7293/6493 9970/7294/6494 9971/7281/6485
+f 3846/7288/6490 9968/7290/6492 9969/7295/6495 3851/7293/6493
+f 3851/7293/6493 9969/7295/6495 13123/7296/6496 9970/7294/6494
+f 3852/7297/6497 3856/7298/6498 3857/7299/6499 3853/7300/6499
+f 3853/7300/6499 3857/7299/6499 10284/6225/5474 10283/6220/5474
+f 3856/7298/6498 10064/7301/6500 10065/7302/6501 3857/7299/6499
+f 3857/7299/6499 10065/7302/6501 13181/6226/5474 10284/6225/5474
+f 3852/7297/6497 3853/7300/6499 3858/7303/6502 3854/7304/6503
+f 3854/7304/6503 3858/7303/6502 9972/7282/6486 9971/7281/6485
+f 3853/7300/6499 10283/6220/5474 10282/6219/5474 3858/7303/6502
+f 3858/7303/6502 10282/6219/5474 13180/6206/5474 9972/7282/6486
+f 3852/7297/6497 3854/7304/6503 3859/7305/6504 3855/7306/6505
+f 3855/7306/6505 3859/7305/6504 10057/7307/6506 10058/7308/6507
+f 3854/7304/6503 9971/7281/6485 9970/7294/6494 3859/7305/6504
+f 3859/7305/6504 9970/7294/6494 13123/7296/6496 10057/7307/6506
+f 3852/7297/6497 3855/7306/6505 3860/7309/6508 3856/7298/6498
+f 3856/7298/6498 3860/7309/6508 10063/7310/6509 10064/7301/6500
+f 3855/7306/6505 10058/7308/6507 10059/7311/6510 3860/7309/6508
+f 3860/7309/6508 10059/7311/6510 13138/7312/6511 10063/7310/6509
+f 3861/7313/6512 3865/7314/6513 3866/7315/6514 3862/7316/6515
+f 3862/7316/6515 3866/7315/6514 11443/7317/6516 11444/7318/6517
+f 3865/7314/6513 10064/7301/6500 10063/7310/6509 3866/7315/6514
+f 3866/7315/6514 10063/7310/6509 13138/7312/6511 11443/7317/6516
+f 3861/7313/6512 3862/7316/6515 3867/7319/6518 3863/7320/6519
+f 3863/7320/6519 3867/7319/6518 11449/7321/6520 11450/7322/6521
+f 3862/7316/6515 11444/7318/6517 11445/7323/6522 3867/7319/6518
+f 3867/7319/6518 11445/7323/6522 13373/7324/6523 11449/7321/6520
+f 3861/7313/6512 3863/7320/6519 3868/7325/6524 3864/7326/6524
+f 3864/7326/6524 3868/7325/6524 10290/6469/5474 10289/6464/5474
+f 3863/7320/6519 11450/7322/6521 11451/7327/6524 3868/7325/6524
+f 3868/7325/6524 11451/7327/6524 13374/6470/5474 10290/6469/5474
+f 3861/7313/6512 3864/7326/6524 3869/7328/6524 3865/7314/6513
+f 3865/7314/6513 3869/7328/6524 10065/7302/6501 10064/7301/6500
+f 3864/7326/6524 10289/6464/5474 10288/6463/5474 3869/7328/6524
+f 3869/7328/6524 10288/6463/5474 13181/6226/5474 10065/7302/6501
+f 3870/7329/6525 3874/7330/6526 3875/7331/6527 3871/7332/6528
+f 3871/7332/6528 3875/7331/6527 10296/7047/6273 10295/7042/6268
+f 3874/7330/6526 11157/7333/6529 11158/7334/6530 3875/7331/6527
+f 3875/7331/6527 11158/7334/6530 13325/7048/90 10296/7047/6273
+f 3870/7329/6525 3871/7332/6528 3876/7335/6531 3872/7336/6532
+f 3872/7336/6532 3876/7335/6531 10285/7337/6533 10286/7338/6534
+f 3871/7332/6528 10295/7042/6268 10294/7041/6267 3876/7335/6531
+f 3876/7335/6531 10294/7041/6267 13182/7044/6270 10285/7337/6533
+f 3870/7329/6525 3872/7336/6532 3877/7339/6535 3873/7340/6536
+f 3873/7340/6536 3877/7339/6535 11150/7341/6537 11151/7342/6538
+f 3872/7336/6532 10286/7338/6534 10287/7343/6539 3877/7339/6535
+f 3877/7339/6535 10287/7343/6539 13122/7344/6540 11150/7341/6537
+f 3870/7329/6525 3873/7340/6536 3878/7345/6541 3874/7330/6526
+f 3874/7330/6526 3878/7345/6541 11156/7346/6542 11157/7333/6529
+f 3873/7340/6536 11151/7342/6538 11152/7347/6543 3878/7345/6541
+f 3878/7345/6541 11152/7347/6543 13324/7348/6544 11156/7346/6542
+f 3879/7349/6545 3883/7350/6546 3884/7351/6547 3880/7352/6548
+f 3880/7352/6548 3884/7351/6547 10302/7023/6249 10301/7019/6245
+f 3883/7350/6546 10298/7353/6549 10299/7354/1326 3884/7351/6547
+f 3884/7351/6547 10299/7354/1326 13184/7001/125 10302/7023/6249
+f 3879/7349/6545 3880/7352/6548 3885/7355/6550 3881/7356/6551
+f 3881/7356/6551 3885/7355/6550 10291/7357/6552 10292/7358/6553
+f 3880/7352/6548 10301/7019/6245 10300/7018/6244 3885/7355/6550
+f 3885/7355/6550 10300/7018/6244 13183/7021/6247 10291/7357/6552
+f 3879/7349/6545 3881/7356/6551 3886/7359/6554 3882/7360/6555
+f 3882/7360/6555 3886/7359/6554 10183/7361/6556 10184/7362/6557
+f 3881/7356/6551 10292/7358/6553 10293/7363/6558 3886/7359/6554
+f 3886/7359/6554 10293/7363/6558 13165/7364/6559 10183/7361/6556
+f 3879/7349/6545 3882/7360/6555 3887/7365/6560 3883/7350/6546
+f 3883/7350/6546 3887/7365/6560 10297/7366/6561 10298/7353/6549
+f 3882/7360/6555 10184/7362/6557 10185/7367/6562 3887/7365/6560
+f 3887/7365/6560 10185/7367/6562 13164/7368/6563 10297/7366/6561
+f 3888/7369/6564 3892/7370/6565 3893/7371/1340 3889/7372/1339
+f 3889/7372/1339 3893/7371/1340 10308/7003/143 10307/6999/130
+f 3892/7370/6565 10304/7373/6566 10305/7374/1342 3893/7371/1340
+f 3893/7371/1340 10305/7374/1342 13185/6981/145 10308/7003/143
+f 3888/7369/6564 3889/7372/1339 3894/7375/1338 3890/7376/6567
+f 3890/7376/6567 3894/7375/1338 10299/7354/1326 10298/7353/6549
+f 3889/7372/1339 10307/6999/130 10306/6998/131 3894/7375/1338
+f 3894/7375/1338 10306/6998/131 13184/7001/125 10299/7354/1326
+f 3888/7369/6564 3890/7376/6567 3895/7377/6568 3891/7378/6569
+f 3891/7378/6569 3895/7377/6568 10177/7379/6570 10178/7380/6571
+f 3890/7376/6567 10298/7353/6549 10297/7366/6561 3895/7377/6568
+f 3895/7377/6568 10297/7366/6561 13164/7368/6563 10177/7379/6570
+f 3888/7369/6564 3891/7378/6569 3896/7381/6572 3892/7370/6565
+f 3892/7370/6565 3896/7381/6572 10303/7382/6573 10304/7373/6566
+f 3891/7378/6569 10178/7380/6571 10179/7383/6574 3896/7381/6572
+f 3896/7381/6572 10179/7383/6574 13163/7384/6575 10303/7382/6573
+f 3897/7385/6576 3901/7386/6577 3902/7387/1356 3898/7388/1355
+f 3898/7388/1355 3902/7387/1356 10314/6983/163 10313/6979/150
+f 3901/7386/6577 10310/7389/6578 10311/7390/1358 3902/7387/1356
+f 3902/7387/1356 10311/7390/1358 13186/6961/165 10314/6983/163
+f 3897/7385/6576 3898/7388/1355 3903/7391/1354 3899/7392/6579
+f 3899/7392/6579 3903/7391/1354 10305/7374/1342 10304/7373/6566
+f 3898/7388/1355 10313/6979/150 10312/6978/151 3903/7391/1354
+f 3903/7391/1354 10312/6978/151 13185/6981/145 10305/7374/1342
+f 3897/7385/6576 3899/7392/6579 3904/7393/6580 3900/7394/6581
+f 3900/7394/6581 3904/7393/6580 10171/7395/6582 10172/7396/6583
+f 3899/7392/6579 10304/7373/6566 10303/7382/6573 3904/7393/6580
+f 3904/7393/6580 10303/7382/6573 13163/7384/6575 10171/7395/6582
+f 3897/7385/6576 3900/7394/6581 3905/7397/6584 3901/7386/6577
+f 3901/7386/6577 3905/7397/6584 10309/7398/6585 10310/7389/6578
+f 3900/7394/6581 10172/7396/6583 10173/7399/6586 3905/7397/6584
+f 3905/7397/6584 10173/7399/6586 13162/7400/6587 10309/7398/6585
+f 3906/7401/6588 3910/7402/6589 3911/7403/1372 3907/7404/1371
+f 3907/7404/1371 3911/7403/1372 10320/6963/183 10319/6959/170
+f 3910/7402/6589 10316/7405/6590 10317/7406/1374 3911/7403/1372
+f 3911/7403/1372 10317/7406/1374 13187/6941/185 10320/6963/183
+f 3906/7401/6588 3907/7404/1371 3912/7407/1370 3908/7408/6591
+f 3908/7408/6591 3912/7407/1370 10311/7390/1358 10310/7389/6578
+f 3907/7404/1371 10319/6959/170 10318/6958/171 3912/7407/1370
+f 3912/7407/1370 10318/6958/171 13186/6961/165 10311/7390/1358
+f 3906/7401/6588 3908/7408/6591 3913/7409/6592 3909/7410/6593
+f 3909/7410/6593 3913/7409/6592 10165/7411/6594 10166/7412/6595
+f 3908/7408/6591 10310/7389/6578 10309/7398/6585 3913/7409/6592
+f 3913/7409/6592 10309/7398/6585 13162/7400/6587 10165/7411/6594
+f 3906/7401/6588 3909/7410/6593 3914/7413/6596 3910/7402/6589
+f 3910/7402/6589 3914/7413/6596 10315/7414/6597 10316/7405/6590
+f 3909/7410/6593 10166/7412/6595 10167/7415/6598 3914/7413/6596
+f 3914/7413/6596 10167/7415/6598 13161/7416/6599 10315/7414/6597
+f 3915/7417/6600 3919/7418/6601 3920/7419/1388 3916/7420/1387
+f 3916/7420/1387 3920/7419/1388 10326/6943/203 10325/6939/190
+f 3919/7418/6601 10322/7421/6602 10323/7422/1390 3920/7419/1388
+f 3920/7419/1388 10323/7422/1390 13188/6921/205 10326/6943/203
+f 3915/7417/6600 3916/7420/1387 3921/7423/1386 3917/7424/6603
+f 3917/7424/6603 3921/7423/1386 10317/7406/1374 10316/7405/6590
+f 3916/7420/1387 10325/6939/190 10324/6938/191 3921/7423/1386
+f 3921/7423/1386 10324/6938/191 13187/6941/185 10317/7406/1374
+f 3915/7417/6600 3917/7424/6603 3922/7425/6604 3918/7426/6605
+f 3918/7426/6605 3922/7425/6604 10159/7427/6606 10160/7428/6607
+f 3917/7424/6603 10316/7405/6590 10315/7414/6597 3922/7425/6604
+f 3922/7425/6604 10315/7414/6597 13161/7416/6599 10159/7427/6606
+f 3915/7417/6600 3918/7426/6605 3923/7429/6608 3919/7418/6601
+f 3919/7418/6601 3923/7429/6608 10321/7430/6609 10322/7421/6602
+f 3918/7426/6605 10160/7428/6607 10161/7431/6610 3923/7429/6608
+f 3923/7429/6608 10161/7431/6610 13160/7432/6611 10321/7430/6609
+f 3924/7433/6612 3928/7434/6613 3929/7435/1404 3925/7436/1403
+f 3925/7436/1403 3929/7435/1404 10332/6923/223 10331/6919/210
+f 3928/7434/6613 10328/7437/6614 10329/7438/1406 3929/7435/1404
+f 3929/7435/1404 10329/7438/1406 13189/6901/225 10332/6923/223
+f 3924/7433/6612 3925/7436/1403 3930/7439/1402 3926/7440/6615
+f 3926/7440/6615 3930/7439/1402 10323/7422/1390 10322/7421/6602
+f 3925/7436/1403 10331/6919/210 10330/6918/211 3930/7439/1402
+f 3930/7439/1402 10330/6918/211 13188/6921/205 10323/7422/1390
+f 3924/7433/6612 3926/7440/6615 3931/7441/6616 3927/7442/6617
+f 3927/7442/6617 3931/7441/6616 10153/7443/6618 10154/7444/6619
+f 3926/7440/6615 10322/7421/6602 10321/7430/6609 3931/7441/6616
+f 3931/7441/6616 10321/7430/6609 13160/7432/6611 10153/7443/6618
+f 3924/7433/6612 3927/7442/6617 3932/7445/6620 3928/7434/6613
+f 3928/7434/6613 3932/7445/6620 10327/7446/6621 10328/7437/6614
+f 3927/7442/6617 10154/7444/6619 10155/7447/6622 3932/7445/6620
+f 3932/7445/6620 10155/7447/6622 13159/7448/6623 10327/7446/6621
+f 3933/7449/6624 3937/7450/6625 3938/7451/6626 3934/7452/6627
+f 3934/7452/6627 3938/7451/6626 10338/6903/6149 10337/6899/6146
+f 3937/7450/6625 10334/7453/6628 10335/7454/6629 3938/7451/6626
+f 3938/7451/6626 10335/7454/6629 13190/6881/6128 10338/6903/6149
+f 3933/7449/6624 3934/7452/6627 3939/7455/6630 3935/7456/6631
+f 3935/7456/6631 3939/7455/6630 10329/7438/1406 10328/7437/6614
+f 3934/7452/6627 10337/6899/6146 10336/6898/6145 3939/7455/6630
+f 3939/7455/6630 10336/6898/6145 13189/6901/225 10329/7438/1406
+f 3933/7449/6624 3935/7456/6631 3940/7457/6632 3936/7458/6633
+f 3936/7458/6633 3940/7457/6632 10147/7459/6634 10148/7460/6635
+f 3935/7456/6631 10328/7437/6614 10327/7446/6621 3940/7457/6632
+f 3940/7457/6632 10327/7446/6621 13159/7448/6623 10147/7459/6634
+f 3933/7449/6624 3936/7458/6633 3941/7461/6636 3937/7450/6625
+f 3937/7450/6625 3941/7461/6636 10333/7462/6637 10334/7453/6628
+f 3936/7458/6633 10148/7460/6635 10149/7463/6638 3941/7461/6636
+f 3941/7461/6636 10149/7463/6638 13158/7464/6639 10333/7462/6637
+f 3942/7465/6640 3946/7466/6641 3947/7467/6642 3943/7468/6643
+f 3943/7468/6643 3947/7467/6642 10344/6883/6130 10343/6879/254
+f 3946/7466/6641 10340/7469/6644 10341/7470/6645 3947/7467/6642
+f 3947/7467/6642 10341/7470/6645 13191/6861/5474 10344/6883/6130
+f 3942/7465/6640 3943/7468/6643 3948/7471/6646 3944/7472/6647
+f 3944/7472/6647 3948/7471/6646 10335/7454/6629 10334/7453/6628
+f 3943/7468/6643 10343/6879/254 10342/6878/6126 3948/7471/6646
+f 3948/7471/6646 10342/6878/6126 13190/6881/6128 10335/7454/6629
+f 3942/7465/6640 3944/7472/6647 3949/7473/6648 3945/7474/6649
+f 3945/7474/6649 3949/7473/6648 10141/7475/6650 10142/7476/6651
+f 3944/7472/6647 10334/7453/6628 10333/7462/6637 3949/7473/6648
+f 3949/7473/6648 10333/7462/6637 13158/7464/6639 10141/7475/6650
+f 3942/7465/6640 3945/7474/6649 3950/7477/6652 3946/7466/6641
+f 3946/7466/6641 3950/7477/6652 10339/7478/6653 10340/7469/6644
+f 3945/7474/6649 10142/7476/6651 10143/7479/6654 3950/7477/6652
+f 3950/7477/6652 10143/7479/6654 13157/7480/6655 10339/7478/6653
+f 3951/7481/6656 3955/7482/6657 3956/7483/6658 3952/7484/6659
+f 3952/7484/6659 3956/7483/6658 10350/6863/6111 10349/6859/6108
+f 3955/7482/6657 10346/7485/6660 10347/7486/6661 3956/7483/6658
+f 3956/7483/6658 10347/7486/6661 13192/6841/6090 10350/6863/6111
+f 3951/7481/6656 3952/7484/6659 3957/7487/6662 3953/7488/6663
+f 3953/7488/6663 3957/7487/6662 10341/7470/6645 10340/7469/6644
+f 3952/7484/6659 10349/6859/6108 10348/6858/6107 3957/7487/6662
+f 3957/7487/6662 10348/6858/6107 13191/6861/5474 10341/7470/6645
+f 3951/7481/6656 3953/7488/6663 3958/7489/6664 3954/7490/6665
+f 3954/7490/6665 3958/7489/6664 10135/7491/6666 10136/7492/6667
+f 3953/7488/6663 10340/7469/6644 10339/7478/6653 3958/7489/6664
+f 3958/7489/6664 10339/7478/6653 13157/7480/6655 10135/7491/6666
+f 3951/7481/6656 3954/7490/6665 3959/7493/6668 3955/7482/6657
+f 3955/7482/6657 3959/7493/6668 10345/7494/6669 10346/7485/6660
+f 3954/7490/6665 10136/7492/6667 10137/7495/6670 3959/7493/6668
+f 3959/7493/6668 10137/7495/6670 13156/7496/6671 10345/7494/6669
+f 3960/7497/6672 3964/7498/6673 3965/7499/6674 3961/7500/6675
+f 3961/7500/6675 3965/7499/6674 10356/6843/6092 10355/6839/6088
+f 3964/7498/6673 10352/7501/6676 10353/7502/6677 3965/7499/6674
+f 3965/7499/6674 10353/7502/6677 13193/6821/6070 10356/6843/6092
+f 3960/7497/6672 3961/7500/6675 3966/7503/6678 3962/7504/6679
+f 3962/7504/6679 3966/7503/6678 10347/7486/6661 10346/7485/6660
+f 3961/7500/6675 10355/6839/6088 10354/6838/6087 3966/7503/6678
+f 3966/7503/6678 10354/6838/6087 13192/6841/6090 10347/7486/6661
+f 3960/7497/6672 3962/7504/6679 3967/7505/6680 3963/7506/6681
+f 3963/7506/6681 3967/7505/6680 10129/7507/6682 10130/7508/6683
+f 3962/7504/6679 10346/7485/6660 10345/7494/6669 3967/7505/6680
+f 3967/7505/6680 10345/7494/6669 13156/7496/6671 10129/7507/6682
+f 3960/7497/6672 3963/7506/6681 3968/7509/6684 3964/7498/6673
+f 3964/7498/6673 3968/7509/6684 10351/7510/6685 10352/7501/6676
+f 3963/7506/6681 10130/7508/6683 10131/7511/6686 3968/7509/6684
+f 3968/7509/6684 10131/7511/6686 13155/7512/6687 10351/7510/6685
+f 3969/7513/6688 3973/7514/6689 3974/7515/6690 3970/7516/6691
+f 3970/7516/6691 3974/7515/6690 10362/6823/6072 10361/6819/6068
+f 3973/7514/6689 10358/7517/6692 10359/7518/6693 3974/7515/6690
+f 3974/7515/6690 10359/7518/6693 13194/6801/6050 10362/6823/6072
+f 3969/7513/6688 3970/7516/6691 3975/7519/6694 3971/7520/6695
+f 3971/7520/6695 3975/7519/6694 10353/7502/6677 10352/7501/6676
+f 3970/7516/6691 10361/6819/6068 10360/6818/6067 3975/7519/6694
+f 3975/7519/6694 10360/6818/6067 13193/6821/6070 10353/7502/6677
+f 3969/7513/6688 3971/7520/6695 3976/7521/6696 3972/7522/6697
+f 3972/7522/6697 3976/7521/6696 10123/7523/6698 10124/7524/6699
+f 3971/7520/6695 10352/7501/6676 10351/7510/6685 3976/7521/6696
+f 3976/7521/6696 10351/7510/6685 13155/7512/6687 10123/7523/6698
+f 3969/7513/6688 3972/7522/6697 3977/7525/6700 3973/7514/6689
+f 3973/7514/6689 3977/7525/6700 10357/7526/6701 10358/7517/6692
+f 3972/7522/6697 10124/7524/6699 10125/7527/6702 3977/7525/6700
+f 3977/7525/6700 10125/7527/6702 13154/7528/6703 10357/7526/6701
+f 3978/7529/6704 3982/7530/6705 3983/7531/6706 3979/7532/6707
+f 3979/7532/6707 3983/7531/6706 10368/6803/6052 10367/6799/6048
+f 3982/7530/6705 10364/7533/6708 10365/7534/6709 3983/7531/6706
+f 3983/7531/6706 10365/7534/6709 13195/6781/6030 10368/6803/6052
+f 3978/7529/6704 3979/7532/6707 3984/7535/6710 3980/7536/6711
+f 3980/7536/6711 3984/7535/6710 10359/7518/6693 10358/7517/6692
+f 3979/7532/6707 10367/6799/6048 10366/6798/6047 3984/7535/6710
+f 3984/7535/6710 10366/6798/6047 13194/6801/6050 10359/7518/6693
+f 3978/7529/6704 3980/7536/6711 3985/7537/6712 3981/7538/6713
+f 3981/7538/6713 3985/7537/6712 10117/7539/6714 10118/7540/6715
+f 3980/7536/6711 10358/7517/6692 10357/7526/6701 3985/7537/6712
+f 3985/7537/6712 10357/7526/6701 13154/7528/6703 10117/7539/6714
+f 3978/7529/6704 3981/7538/6713 3986/7541/6716 3982/7530/6705
+f 3982/7530/6705 3986/7541/6716 10363/7542/6717 10364/7533/6708
+f 3981/7538/6713 10118/7540/6715 10119/7543/6718 3986/7541/6716
+f 3986/7541/6716 10119/7543/6718 13153/7544/6719 10363/7542/6717
+f 3987/7545/6720 3991/7546/6721 3992/7547/6722 3988/7548/6723
+f 3988/7548/6723 3992/7547/6722 10371/6783/6032 10370/6779/6028
+f 3991/7546/6721 8222/1781/1697 8221/1780/1696 3992/7547/6722
+f 3992/7547/6722 8221/1780/1696 12827/1052/977 10371/6783/6032
+f 3987/7545/6720 3988/7548/6723 3993/7549/6724 3989/7550/6725
+f 3989/7550/6725 3993/7549/6724 10365/7534/6709 10364/7533/6708
+f 3988/7548/6723 10370/6779/6028 10369/6778/6027 3993/7549/6724
+f 3993/7549/6724 10369/6778/6027 13195/6781/6030 10365/7534/6709
+f 3987/7545/6720 3989/7550/6725 3994/7551/6726 3990/7552/6727
+f 3990/7552/6727 3994/7551/6726 10111/7553/6728 10112/7554/6729
+f 3989/7550/6725 10364/7533/6708 10363/7542/6717 3994/7551/6726
+f 3994/7551/6726 10363/7542/6717 13153/7544/6719 10111/7553/6728
+f 3987/7545/6720 3990/7552/6727 3995/7555/6730 3991/7546/6721
+f 3991/7546/6721 3995/7555/6730 8223/1786/1702 8222/1781/1697
+f 3990/7552/6727 10112/7554/6729 10113/7556/6731 3995/7555/6730
+f 3995/7555/6730 10113/7556/6731 12785/1787/1703 8223/1786/1702
+f 3996/7557/6732 4000/7558/6733 4001/7559/6734 3997/7560/6735
+f 3997/7560/6735 4001/7559/6734 9964/7561/6736 9965/7562/6737
+f 4000/7558/6733 10379/7563/6738 10380/7564/6739 4001/7559/6734
+f 4001/7559/6734 10380/7564/6739 13196/7565/6740 9964/7561/6736
+f 3996/7557/6732 3997/7560/6735 4002/7566/6741 3998/7567/6742
+f 3998/7567/6742 4002/7566/6741 10287/7343/6539 10286/7338/6534
+f 3997/7560/6735 9965/7562/6737 9966/7568/6743 4002/7566/6741
+f 4002/7566/6741 9966/7568/6743 13122/7344/6540 10287/7343/6539
+f 3996/7557/6732 3998/7567/6742 4003/7569/6744 3999/7570/6745
+f 3999/7570/6745 4003/7569/6744 10375/7571/6746 10376/7572/6747
+f 3998/7567/6742 10286/7338/6534 10285/7337/6533 4003/7569/6744
+f 4003/7569/6744 10285/7337/6533 13182/7044/6270 10375/7571/6746
+f 3996/7557/6732 3999/7570/6745 4004/7573/6748 4000/7558/6733
+f 4000/7558/6733 4004/7573/6748 10378/7574/6749 10379/7563/6738
+f 3999/7570/6745 10376/7572/6747 10377/7575/6750 4004/7573/6748
+f 4004/7573/6748 10377/7575/6750 13197/7576/5474 10378/7574/6749
+f 4005/7577/6751 4009/7578/6752 4010/7579/6753 4006/7580/6754
+f 4006/7580/6754 4010/7579/6753 10384/7581/6755 10385/7582/6756
+f 4009/7578/6752 10382/7583/6757 10383/7584/6758 4010/7579/6753
+f 4010/7579/6753 10383/7584/6758 13198/7585/6759 10384/7581/6755
+f 4005/7577/6751 4006/7580/6754 4011/7586/6760 4007/7587/6761
+f 4007/7587/6761 4011/7586/6760 10377/7575/6750 10376/7572/6747
+f 4006/7580/6754 10385/7582/6756 10386/7588/6762 4011/7586/6760
+f 4011/7586/6760 10386/7588/6762 13197/7576/5474 10377/7575/6750
+f 4005/7577/6751 4007/7587/6761 4012/7589/6763 4008/7590/6764
+f 4008/7590/6764 4012/7589/6763 9963/7043/6269 9962/7036/6262
+f 4007/7587/6761 10376/7572/6747 10375/7571/6746 4012/7589/6763
+f 4012/7589/6763 10375/7571/6746 13182/7044/6270 9963/7043/6269
+f 4005/7577/6751 4008/7590/6764 4013/7591/6765 4009/7578/6752
+f 4009/7578/6752 4013/7591/6765 10381/7592/6766 10382/7583/6757
+f 4008/7590/6764 9962/7036/6262 9961/7035/6261 4013/7591/6765
+f 4013/7591/6765 9961/7035/6261 13121/7038/6264 10381/7592/6766
+f 4014/7593/6767 4018/7594/6768 4019/7595/6769 4015/7596/6770
+f 4015/7596/6770 4019/7595/6769 10390/7597/6771 10391/7598/6772
+f 4018/7594/6768 11169/7599/6773 11170/7600/6774 4019/7595/6769
+f 4019/7595/6769 11170/7600/6774 13327/7601/6775 10390/7597/6771
+f 4014/7593/6767 4015/7596/6770 4020/7602/6776 4016/7603/6777
+f 4016/7603/6777 4020/7602/6776 10383/7584/6758 10382/7583/6757
+f 4015/7596/6770 10391/7598/6772 10392/7604/6778 4020/7602/6776
+f 4020/7602/6776 10392/7604/6778 13198/7585/6759 10383/7584/6758
+f 4014/7593/6767 4016/7603/6777 4021/7605/6779 4017/7606/6780
+f 4017/7606/6780 4021/7605/6779 11161/7037/6263 11160/7029/6255
+f 4016/7603/6777 10382/7583/6757 10381/7592/6766 4021/7605/6779
+f 4021/7605/6779 10381/7592/6766 13121/7038/6264 11161/7037/6263
+f 4014/7593/6767 4017/7606/6780 4022/7607/6781 4018/7594/6768
+f 4018/7594/6768 4022/7607/6781 11168/7608/6782 11169/7599/6773
+f 4017/7606/6780 11160/7029/6255 11159/7028/6254 4022/7607/6781
+f 4022/7607/6781 11159/7028/6254 13326/7032/6258 11168/7608/6782
+f 4023/7609/6783 4027/7610/6784 4028/7611/6785 4024/7612/6786
+f 4024/7612/6786 4028/7611/6785 10396/7613/6787 10397/7614/6788
+f 4027/7610/6784 10394/7615/6789 10395/7616/6790 4028/7611/6785
+f 4028/7611/6785 10395/7616/6790 13200/7617/6791 10396/7613/6787
+f 4023/7609/6783 4024/7612/6786 4029/7618/6792 4025/7619/6793
+f 4025/7619/6793 4029/7618/6792 10387/7620/6794 10388/7621/6795
+f 4024/7612/6786 10397/7614/6788 10398/7622/6796 4029/7618/6792
+f 4029/7618/6792 10398/7622/6796 13199/7623/6797 10387/7620/6794
+f 4023/7609/6783 4025/7619/6793 4030/7624/6798 4026/7625/6799
+f 4026/7625/6799 4030/7624/6798 9957/7014/6240 9956/7009/6235
+f 4025/7619/6793 10388/7621/6795 10389/7626/6800 4030/7624/6798
+f 4030/7624/6798 10389/7626/6800 13120/7015/6241 9957/7014/6240
+f 4023/7609/6783 4026/7625/6799 4031/7627/6801 4027/7610/6784
+f 4027/7610/6784 4031/7627/6801 10393/7628/6802 10394/7615/6789
+f 4026/7625/6799 9956/7009/6235 9955/7008/6234 4031/7627/6801
+f 4031/7627/6801 9955/7008/6234 13119/6995/6225 10393/7628/6802
+f 4032/7629/6803 4036/7630/6804 4037/7631/6805 4033/7632/6806
+f 4033/7632/6806 4037/7631/6805 10402/7633/6807 10403/7634/6808
+f 4036/7630/6804 10400/7635/6809 10401/7636/6810 4037/7631/6805
+f 4037/7631/6805 10401/7636/6810 13201/7637/6811 10402/7633/6807
+f 4032/7629/6803 4033/7632/6806 4038/7638/6812 4034/7639/6813
+f 4034/7639/6813 4038/7638/6812 10395/7616/6790 10394/7615/6789
+f 4033/7632/6806 10403/7634/6808 10404/7640/6814 4038/7638/6812
+f 4038/7638/6812 10404/7640/6814 13200/7617/6791 10395/7616/6790
+f 4032/7629/6803 4034/7639/6813 4039/7641/6815 4035/7642/6816
+f 4035/7642/6816 4039/7641/6815 9954/6994/6224 9953/6989/6219
+f 4034/7639/6813 10394/7615/6789 10393/7628/6802 4039/7641/6815
+f 4039/7641/6815 10393/7628/6802 13119/6995/6225 9954/6994/6224
+f 4032/7629/6803 4035/7642/6816 4040/7643/6817 4036/7630/6804
+f 4036/7630/6804 4040/7643/6817 10399/7644/6818 10400/7635/6809
+f 4035/7642/6816 9953/6989/6219 9952/6988/6218 4040/7643/6817
+f 4040/7643/6817 9952/6988/6218 13118/6975/6209 10399/7644/6818
+f 4041/7645/6819 4045/7646/6820 4046/7647/6821 4042/7648/6822
+f 4042/7648/6822 4046/7647/6821 10408/7649/6823 10409/7650/6824
+f 4045/7646/6820 10406/7651/6825 10407/7652/6826 4046/7647/6821
+f 4046/7647/6821 10407/7652/6826 13202/7653/6827 10408/7649/6823
+f 4041/7645/6819 4042/7648/6822 4047/7654/6828 4043/7655/6829
+f 4043/7655/6829 4047/7654/6828 10401/7636/6810 10400/7635/6809
+f 4042/7648/6822 10409/7650/6824 10410/7656/6830 4047/7654/6828
+f 4047/7654/6828 10410/7656/6830 13201/7637/6811 10401/7636/6810
+f 4041/7645/6819 4043/7655/6829 4048/7657/6831 4044/7658/6832
+f 4044/7658/6832 4048/7657/6831 9951/6974/6208 9950/6969/6203
+f 4043/7655/6829 10400/7635/6809 10399/7644/6818 4048/7657/6831
+f 4048/7657/6831 10399/7644/6818 13118/6975/6209 9951/6974/6208
+f 4041/7645/6819 4044/7658/6832 4049/7659/6833 4045/7646/6820
+f 4045/7646/6820 4049/7659/6833 10405/7660/6834 10406/7651/6825
+f 4044/7658/6832 9950/6969/6203 9949/6968/6202 4049/7659/6833
+f 4049/7659/6833 9949/6968/6202 13117/6955/6193 10405/7660/6834
+f 4050/7661/6835 4054/7662/6836 4055/7663/6837 4051/7664/6838
+f 4051/7664/6838 4055/7663/6837 10414/7665/6839 10415/7666/6840
+f 4054/7662/6836 10412/7667/6841 10413/7668/6842 4055/7663/6837
+f 4055/7663/6837 10413/7668/6842 13203/7669/6843 10414/7665/6839
+f 4050/7661/6835 4051/7664/6838 4056/7670/6844 4052/7671/6845
+f 4052/7671/6845 4056/7670/6844 10407/7652/6826 10406/7651/6825
+f 4051/7664/6838 10415/7666/6840 10416/7672/6846 4056/7670/6844
+f 4056/7670/6844 10416/7672/6846 13202/7653/6827 10407/7652/6826
+f 4050/7661/6835 4052/7671/6845 4057/7673/6847 4053/7674/6848
+f 4053/7674/6848 4057/7673/6847 9948/6954/6192 9947/6949/6187
+f 4052/7671/6845 10406/7651/6825 10405/7660/6834 4057/7673/6847
+f 4057/7673/6847 10405/7660/6834 13117/6955/6193 9948/6954/6192
+f 4050/7661/6835 4053/7674/6848 4058/7675/6849 4054/7662/6836
+f 4054/7662/6836 4058/7675/6849 10411/7676/6850 10412/7667/6841
+f 4053/7674/6848 9947/6949/6187 9946/6948/6186 4058/7675/6849
+f 4058/7675/6849 9946/6948/6186 13116/6935/6177 10411/7676/6850
+f 4059/7677/6851 4063/7678/6852 4064/7679/6853 4060/7680/6854
+f 4060/7680/6854 4064/7679/6853 10420/7681/6855 10421/7682/6856
+f 4063/7678/6852 10418/7683/6857 10419/7684/6858 4064/7679/6853
+f 4064/7679/6853 10419/7684/6858 13204/7685/6859 10420/7681/6855
+f 4059/7677/6851 4060/7680/6854 4065/7686/6860 4061/7687/6861
+f 4061/7687/6861 4065/7686/6860 10413/7668/6842 10412/7667/6841
+f 4060/7680/6854 10421/7682/6856 10422/7688/6862 4065/7686/6860
+f 4065/7686/6860 10422/7688/6862 13203/7669/6843 10413/7668/6842
+f 4059/7677/6851 4061/7687/6861 4066/7689/6863 4062/7690/6864
+f 4062/7690/6864 4066/7689/6863 9945/6934/6176 9944/6929/6171
+f 4061/7687/6861 10412/7667/6841 10411/7676/6850 4066/7689/6863
+f 4066/7689/6863 10411/7676/6850 13116/6935/6177 9945/6934/6176
+f 4059/7677/6851 4062/7690/6864 4067/7691/6865 4063/7678/6852
+f 4063/7678/6852 4067/7691/6865 10417/7692/6866 10418/7683/6857
+f 4062/7690/6864 9944/6929/6171 9943/6928/6170 4067/7691/6865
+f 4067/7691/6865 9943/6928/6170 13115/6915/6161 10417/7692/6866
+f 4068/7693/6867 4072/7694/6868 4073/7695/6869 4069/7696/6870
+f 4069/7696/6870 4073/7695/6869 10426/7697/6871 10427/7698/6872
+f 4072/7694/6868 10424/7699/6873 10425/7700/6874 4073/7695/6869
+f 4073/7695/6869 10425/7700/6874 13205/7701/6875 10426/7697/6871
+f 4068/7693/6867 4069/7696/6870 4074/7702/6876 4070/7703/6877
+f 4070/7703/6877 4074/7702/6876 10419/7684/6858 10418/7683/6857
+f 4069/7696/6870 10427/7698/6872 10428/7704/6878 4074/7702/6876
+f 4074/7702/6876 10428/7704/6878 13204/7685/6859 10419/7684/6858
+f 4068/7693/6867 4070/7703/6877 4075/7705/6879 4071/7706/6880
+f 4071/7706/6880 4075/7705/6879 9942/6914/6160 9941/6909/6155
+f 4070/7703/6877 10418/7683/6857 10417/7692/6866 4075/7705/6879
+f 4075/7705/6879 10417/7692/6866 13115/6915/6161 9942/6914/6160
+f 4068/7693/6867 4071/7706/6880 4076/7707/6881 4072/7694/6868
+f 4072/7694/6868 4076/7707/6881 10423/7708/6882 10424/7699/6873
+f 4071/7706/6880 9941/6909/6155 9940/6908/6154 4076/7707/6881
+f 4076/7707/6881 9940/6908/6154 13114/6895/6142 10423/7708/6882
+f 4077/7709/6883 4081/7710/6884 4082/7711/6885 4078/7712/6886
+f 4078/7712/6886 4082/7711/6885 10432/7713/6887 10433/7714/6888
+f 4081/7710/6884 10430/7715/6889 10431/7716/6890 4082/7711/6885
+f 4082/7711/6885 10431/7716/6890 13206/7717/6891 10432/7713/6887
+f 4077/7709/6883 4078/7712/6886 4083/7718/6892 4079/7719/6893
+f 4079/7719/6893 4083/7718/6892 10425/7700/6874 10424/7699/6873
+f 4078/7712/6886 10433/7714/6888 10434/7720/6894 4083/7718/6892
+f 4083/7718/6892 10434/7720/6894 13205/7701/6875 10425/7700/6874
+f 4077/7709/6883 4079/7719/6893 4084/7721/6895 4080/7722/6896
+f 4080/7722/6896 4084/7721/6895 9939/6894/6141 9938/6889/6136
+f 4079/7719/6893 10424/7699/6873 10423/7708/6882 4084/7721/6895
+f 4084/7721/6895 10423/7708/6882 13114/6895/6142 9939/6894/6141
+f 4077/7709/6883 4080/7722/6896 4085/7723/6897 4081/7710/6884
+f 4081/7710/6884 4085/7723/6897 10429/7724/6898 10430/7715/6889
+f 4080/7722/6896 9938/6889/6136 9937/6888/6135 4085/7723/6897
+f 4085/7723/6897 9937/6888/6135 13113/6875/6123 10429/7724/6898
+f 4086/7725/6899 4090/7726/6900 4091/7727/6901 4087/7728/6902
+f 4087/7728/6902 4091/7727/6901 10438/7729/6903 10439/7730/6904
+f 4090/7726/6900 10436/7731/6905 10437/7732/6906 4091/7727/6901
+f 4091/7727/6901 10437/7732/6906 13207/7733/6907 10438/7729/6903
+f 4086/7725/6899 4087/7728/6902 4092/7734/6908 4088/7735/6909
+f 4088/7735/6909 4092/7734/6908 10431/7716/6890 10430/7715/6889
+f 4087/7728/6902 10439/7730/6904 10440/7736/6910 4092/7734/6908
+f 4092/7734/6908 10440/7736/6910 13206/7717/6891 10431/7716/6890
+f 4086/7725/6899 4088/7735/6909 4093/7737/6911 4089/7738/6912
+f 4089/7738/6912 4093/7737/6911 9936/6874/6122 9935/6869/6117
+f 4088/7735/6909 10430/7715/6889 10429/7724/6898 4093/7737/6911
+f 4093/7737/6911 10429/7724/6898 13113/6875/6123 9936/6874/6122
+f 4086/7725/6899 4089/7738/6912 4094/7739/6913 4090/7726/6900
+f 4090/7726/6900 4094/7739/6913 10435/7740/6914 10436/7731/6905
+f 4089/7738/6912 9935/6869/6117 9934/6868/6116 4094/7739/6913
+f 4094/7739/6913 9934/6868/6116 13112/6855/6104 10435/7740/6914
+f 4095/7741/6915 4099/7742/6916 4100/7743/6917 4096/7744/6918
+f 4096/7744/6918 4100/7743/6917 10444/7745/6919 10445/7746/6920
+f 4099/7742/6916 10442/7747/6921 10443/7748/6922 4100/7743/6917
+f 4100/7743/6917 10443/7748/6922 13208/7749/6923 10444/7745/6919
+f 4095/7741/6915 4096/7744/6918 4101/7750/6924 4097/7751/6925
+f 4097/7751/6925 4101/7750/6924 10437/7732/6906 10436/7731/6905
+f 4096/7744/6918 10445/7746/6920 10446/7752/6926 4101/7750/6924
+f 4101/7750/6924 10446/7752/6926 13207/7733/6907 10437/7732/6906
+f 4095/7741/6915 4097/7751/6925 4102/7753/6927 4098/7754/6928
+f 4098/7754/6928 4102/7753/6927 9933/6854/6103 9932/6849/6098
+f 4097/7751/6925 10436/7731/6905 10435/7740/6914 4102/7753/6927
+f 4102/7753/6927 10435/7740/6914 13112/6855/6104 9933/6854/6103
+f 4095/7741/6915 4098/7754/6928 4103/7755/6929 4099/7742/6916
+f 4099/7742/6916 4103/7755/6929 10441/7756/6930 10442/7747/6921
+f 4098/7754/6928 9932/6849/6098 9931/6848/6097 4103/7755/6929
+f 4103/7755/6929 9931/6848/6097 13111/6835/6084 10441/7756/6930
+f 4104/7757/6931 4108/7758/6932 4109/7759/6933 4105/7760/6934
+f 4105/7760/6934 4109/7759/6933 10450/7761/6935 10451/7762/6936
+f 4108/7758/6932 10448/7763/6937 10449/7764/6938 4109/7759/6933
+f 4109/7759/6933 10449/7764/6938 13209/7765/6939 10450/7761/6935
+f 4104/7757/6931 4105/7760/6934 4110/7766/6940 4106/7767/6941
+f 4106/7767/6941 4110/7766/6940 10443/7748/6922 10442/7747/6921
+f 4105/7760/6934 10451/7762/6936 10452/7768/6942 4110/7766/6940
+f 4110/7766/6940 10452/7768/6942 13208/7749/6923 10443/7748/6922
+f 4104/7757/6931 4106/7767/6941 4111/7769/6943 4107/7770/6944
+f 4107/7770/6944 4111/7769/6943 9930/6834/6083 9929/6829/6078
+f 4106/7767/6941 10442/7747/6921 10441/7756/6930 4111/7769/6943
+f 4111/7769/6943 10441/7756/6930 13111/6835/6084 9930/6834/6083
+f 4104/7757/6931 4107/7770/6944 4112/7771/6945 4108/7758/6932
+f 4108/7758/6932 4112/7771/6945 10447/7772/6946 10448/7763/6937
+f 4107/7770/6944 9929/6829/6078 9928/6828/6077 4112/7771/6945
+f 4112/7771/6945 9928/6828/6077 13110/6815/6064 10447/7772/6946
+f 4113/7773/6947 4117/7774/6948 4118/7775/6949 4114/7776/6950
+f 4114/7776/6950 4118/7775/6949 10456/7777/6951 10457/7778/6952
+f 4117/7774/6948 10454/7779/6953 10455/7780/6954 4118/7775/6949
+f 4118/7775/6949 10455/7780/6954 13210/7781/6955 10456/7777/6951
+f 4113/7773/6947 4114/7776/6950 4119/7782/6956 4115/7783/6957
+f 4115/7783/6957 4119/7782/6956 10449/7764/6938 10448/7763/6937
+f 4114/7776/6950 10457/7778/6952 10458/7784/6958 4119/7782/6956
+f 4119/7782/6956 10458/7784/6958 13209/7765/6939 10449/7764/6938
+f 4113/7773/6947 4115/7783/6957 4120/7785/6959 4116/7786/6960
+f 4116/7786/6960 4120/7785/6959 9927/6814/6063 9926/6809/6058
+f 4115/7783/6957 10448/7763/6937 10447/7772/6946 4120/7785/6959
+f 4120/7785/6959 10447/7772/6946 13110/6815/6064 9927/6814/6063
+f 4113/7773/6947 4116/7786/6960 4121/7787/6961 4117/7774/6948
+f 4117/7774/6948 4121/7787/6961 10453/7788/6962 10454/7779/6953
+f 4116/7786/6960 9926/6809/6058 9925/6808/6057 4121/7787/6961
+f 4121/7787/6961 9925/6808/6057 13109/6795/6044 10453/7788/6962
+f 4122/7789/6963 4126/7790/6964 4127/7791/6965 4123/7792/6966
+f 4123/7792/6966 4127/7791/6965 10462/7793/6967 10463/7794/6968
+f 4126/7790/6964 10460/7795/6969 10461/7796/6970 4127/7791/6965
+f 4127/7791/6965 10461/7796/6970 13211/7797/6971 10462/7793/6967
+f 4122/7789/6963 4123/7792/6966 4128/7798/6972 4124/7799/6973
+f 4124/7799/6973 4128/7798/6972 10455/7780/6954 10454/7779/6953
+f 4123/7792/6966 10463/7794/6968 10464/7800/6974 4128/7798/6972
+f 4128/7798/6972 10464/7800/6974 13210/7781/6955 10455/7780/6954
+f 4122/7789/6963 4124/7799/6973 4129/7801/6975 4125/7802/6976
+f 4125/7802/6976 4129/7801/6975 9924/6794/6043 9923/6789/6038
+f 4124/7799/6973 10454/7779/6953 10453/7788/6962 4129/7801/6975
+f 4129/7801/6975 10453/7788/6962 13109/6795/6044 9924/6794/6043
+f 4122/7789/6963 4125/7802/6976 4130/7803/6977 4126/7790/6964
+f 4126/7790/6964 4130/7803/6977 10459/7804/6978 10460/7795/6969
+f 4125/7802/6976 9923/6789/6038 9922/6788/6037 4130/7803/6977
+f 4130/7803/6977 9922/6788/6037 13108/6775/6024 10459/7804/6978
+f 4131/7805/6979 4135/7806/6980 4136/7807/6981 4132/7808/6982
+f 4132/7808/6982 4136/7807/6981 10465/7809/6983 10466/7810/6984
+f 4135/7806/6980 8315/2029/1944 8314/2028/1943 4136/7807/6981
+f 4136/7807/6981 8314/2028/1943 12843/2032/1947 10465/7809/6983
+f 4131/7805/6979 4132/7808/6982 4137/7811/6985 4133/7812/6986
+f 4133/7812/6986 4137/7811/6985 10461/7796/6970 10460/7795/6969
+f 4132/7808/6982 10466/7810/6984 10467/7813/6987 4137/7811/6985
+f 4137/7811/6985 10467/7813/6987 13211/7797/6971 10461/7796/6970
+f 4131/7805/6979 4133/7812/6986 4138/7814/6988 4134/7815/6989
+f 4134/7815/6989 4138/7814/6988 9921/6774/6023 9920/6769/6018
+f 4133/7812/6986 10460/7795/6969 10459/7804/6978 4138/7814/6988
+f 4138/7814/6988 10459/7804/6978 13108/6775/6024 9921/6774/6023
+f 4131/7805/6979 4134/7815/6989 4139/7816/6990 4135/7806/6980
+f 4135/7806/6980 4139/7816/6990 8316/2035/1950 8315/2029/1944
+f 4134/7815/6989 9920/6769/6018 9919/6768/6017 4139/7816/6990
+f 4139/7816/6990 9919/6768/6017 12740/1046/971 8316/2035/1950
+f 4140/7817/6991 4144/7818/6992 4145/7819/6993 4141/7820/6994
+f 4141/7820/6994 4145/7819/6993 10068/6249/5507 10067/6244/5504
+f 4144/7818/6992 11222/7821/6995 11223/7822/6996 4145/7819/6993
+f 4145/7819/6993 11223/7822/6996 13336/6250/5508 10068/6249/5507
+f 4140/7817/6991 4141/7820/6994 4146/7823/6997 4142/7824/6998
+f 4142/7824/6998 4146/7823/6997 10468/7825/6999 10469/7826/7000
+f 4141/7820/6994 10067/6244/5504 10066/6243/5503 4146/7823/6997
+f 4146/7823/6997 10066/6243/5503 13139/6246/5492 10468/7825/6999
+f 4140/7817/6991 4142/7824/6998 4147/7827/7001 4143/7828/7002
+f 4143/7828/7002 4147/7827/7001 10729/7829/7003 10730/7830/7004
+f 4142/7824/6998 10469/7826/7000 10470/7831/7005 4147/7827/7001
+f 4147/7827/7001 10470/7831/7005 13254/7832/7006 10729/7829/7003
+f 4140/7817/6991 4143/7828/7002 4148/7833/7007 4144/7818/6992
+f 4144/7818/6992 4148/7833/7007 11221/7834/7008 11222/7821/6995
+f 4143/7828/7002 10730/7830/7004 10731/7835/7009 4148/7833/7007
+f 4148/7833/7007 10731/7835/7009 13335/7836/7010 11221/7834/7008
+f 4149/7837/7011 4153/7838/7012 4154/7839/7013 4150/7840/7014
+f 4150/7840/7014 4154/7839/7013 10062/6478/5727 10061/6474/5725
+f 4153/7838/7012 10469/7841/7000 10468/7842/6999 4154/7839/7013
+f 4154/7839/7013 10468/7842/6999 13139/6230/5492 10062/6478/5727
+f 4149/7837/7011 4150/7840/7014 4155/7843/7015 4151/7844/7016
+f 4151/7844/7016 4155/7843/7015 11461/7845/5474 11462/7846/5474
+f 4150/7840/7014 10061/6474/5725 10060/6473/5724 4155/7843/7015
+f 4155/7843/7015 10060/6473/5724 13375/6476/5474 11461/7845/5474
+f 4149/7837/7011 4151/7844/7016 4156/7847/7017 4152/7848/7018
+f 4152/7848/7018 4156/7847/7017 11458/7849/7019 11459/7850/7020
+f 4151/7844/7016 11462/7846/5474 11463/7851/5474 4156/7847/7017
+f 4156/7847/7017 11463/7851/5474 13376/7852/5474 11458/7849/7019
+f 4149/7837/7011 4152/7848/7018 4157/7853/7021 4153/7838/7012
+f 4153/7838/7012 4157/7853/7021 10470/7854/7005 10469/7841/7000
+f 4152/7848/7018 11459/7850/7020 11460/7855/7022 4157/7853/7021
+f 4157/7853/7021 11460/7855/7022 13254/7856/7006 10470/7854/7005
+f 4158/7857/7023 4162/7858/7024 4163/7859/7025 4159/7860/7026
+f 4159/7860/7026 4163/7859/7025 10392/7604/6778 10391/7598/6772
+f 4162/7858/7024 10478/7861/7027 10479/7862/7028 4163/7859/7025
+f 4163/7859/7025 10479/7862/7028 13198/7585/6759 10392/7604/6778
+f 4158/7857/7023 4159/7860/7026 4164/7863/7029 4160/7864/7030
+f 4160/7864/7030 4164/7863/7029 11174/7865/7031 11175/7866/7032
+f 4159/7860/7026 10391/7598/6772 10390/7597/6771 4164/7863/7029
+f 4164/7863/7029 10390/7597/6771 13327/7601/6775 11174/7865/7031
+f 4158/7857/7023 4160/7864/7030 4165/7867/7033 4161/7868/7034
+f 4161/7868/7034 4165/7867/7033 11171/7869/7035 11172/7870/7036
+f 4160/7864/7030 11175/7866/7032 11176/7871/7037 4165/7867/7033
+f 4165/7867/7033 11176/7871/7037 13328/7872/90 11171/7869/7035
+f 4158/7857/7023 4161/7868/7034 4166/7873/7038 4162/7858/7024
+f 4162/7858/7024 4166/7873/7038 10477/7874/7039 10478/7861/7027
+f 4161/7868/7034 11172/7870/7036 11173/7875/7040 4166/7873/7038
+f 4166/7873/7038 11173/7875/7040 13253/7876/7041 10477/7874/7039
+f 4167/7877/7042 4171/7878/7043 4172/7879/7044 4168/7880/7045
+f 4168/7880/7045 4172/7879/7044 10071/6269/5527 10070/6264/5522
+f 4171/7878/7043 10490/7881/7046 10491/7882/7047 4172/7879/7044
+f 4172/7879/7044 10491/7882/7047 13141/6270/5528 10071/6269/5527
+f 4167/7877/7042 4168/7880/7045 4173/7883/7048 4169/7884/7049
+f 4169/7884/7049 4173/7883/7048 10471/7885/7050 10472/7886/7051
+f 4168/7880/7045 10070/6264/5522 10069/6263/5521 4173/7883/7048
+f 4173/7883/7048 10069/6263/5521 13140/6266/5524 10471/7885/7050
+f 4167/7877/7042 4169/7884/7049 4174/7887/7052 4170/7888/7053
+f 4170/7888/7053 4174/7887/7052 10732/7889/7054 10733/7890/7055
+f 4169/7884/7049 10472/7886/7051 10473/7891/7056 4174/7887/7052
+f 4174/7887/7052 10473/7891/7056 13255/7892/7057 10732/7889/7054
+f 4167/7877/7042 4170/7888/7053 4175/7893/7058 4171/7878/7043
+f 4171/7878/7043 4175/7893/7058 10489/7894/7059 10490/7881/7046
+f 4170/7888/7053 10733/7890/7055 10734/7895/7060 4175/7893/7058
+f 4175/7893/7058 10734/7895/7060 13256/7896/7061 10489/7894/7059
+f 4176/7897/7062 4180/7898/7063 4181/7899/7064 4177/7900/7065
+f 4177/7900/7065 4181/7899/7064 10398/7622/6796 10397/7614/6788
+f 4180/7898/7063 10484/7901/7066 10485/7902/7067 4181/7899/7064
+f 4181/7899/7064 10485/7902/7067 13199/7623/6797 10398/7622/6796
+f 4176/7897/7062 4177/7900/7065 4182/7903/7068 4178/7904/7069
+f 4178/7904/7069 4182/7903/7068 10495/7905/7070 10496/7906/7071
+f 4177/7900/7065 10397/7614/6788 10396/7613/6787 4182/7903/7068
+f 4182/7903/7068 10396/7613/6787 13200/7617/6791 10495/7905/7070
+f 4176/7897/7062 4178/7904/7069 4183/7907/7072 4179/7908/7073
+f 4179/7908/7073 4183/7907/7072 10714/7909/6249 10715/7910/6245
+f 4178/7904/7069 10496/7906/7071 10497/7911/7074 4183/7907/7072
+f 4183/7907/7072 10497/7911/7074 13251/7912/125 10714/7909/6249
+f 4176/7897/7062 4179/7908/7073 4184/7913/7075 4180/7898/7063
+f 4180/7898/7063 4184/7913/7075 10483/7914/7076 10484/7901/7066
+f 4179/7908/7073 10715/7910/6245 10716/7915/6244 4184/7913/7075
+f 4184/7913/7075 10716/7915/6244 13252/7916/6247 10483/7914/7076
+f 4185/7917/7077 4189/7918/7078 4190/7919/7079 4186/7920/7080
+f 4186/7920/7080 4190/7919/7079 10074/6285/5543 10073/6282/5540
+f 4189/7918/7078 10502/7921/7081 10503/7922/7082 4190/7919/7079
+f 4190/7919/7079 10503/7922/7082 13142/6286/5544 10074/6285/5543
+f 4185/7917/7077 4186/7920/7080 4191/7923/7083 4187/7924/7084
+f 4187/7924/7084 4191/7923/7083 10491/7882/7047 10490/7881/7046
+f 4186/7920/7080 10073/6282/5540 10072/6281/5539 4191/7923/7083
+f 4191/7923/7083 10072/6281/5539 13141/6270/5528 10491/7882/7047
+f 4185/7917/7077 4187/7924/7084 4192/7925/7085 4188/7926/7086
+f 4188/7926/7086 4192/7925/7085 10735/7927/7087 10736/7928/7088
+f 4187/7924/7084 10490/7881/7046 10489/7894/7059 4192/7925/7085
+f 4192/7925/7085 10489/7894/7059 13256/7896/7061 10735/7927/7087
+f 4185/7917/7077 4188/7926/7086 4193/7929/7089 4189/7918/7078
+f 4189/7918/7078 4193/7929/7089 10501/7930/7090 10502/7921/7081
+f 4188/7926/7086 10736/7928/7088 10737/7931/7091 4193/7929/7089
+f 4193/7929/7089 10737/7931/7091 13257/7932/7092 10501/7930/7090
+f 4194/7933/7093 4198/7934/7094 4199/7935/7095 4195/7936/7096
+f 4195/7936/7096 4199/7935/7095 10404/7640/6814 10403/7634/6808
+f 4198/7934/7094 10496/7906/7071 10495/7905/7070 4199/7935/7095
+f 4199/7935/7095 10495/7905/7070 13200/7617/6791 10404/7640/6814
+f 4194/7933/7093 4195/7936/7096 4200/7937/7097 4196/7938/7098
+f 4196/7938/7098 4200/7937/7097 10507/7939/7099 10508/7940/7100
+f 4195/7936/7096 10403/7634/6808 10402/7633/6807 4200/7937/7097
+f 4200/7937/7097 10402/7633/6807 13201/7637/6811 10507/7939/7099
+f 4194/7933/7093 4196/7938/7098 4201/7941/7101 4197/7942/7102
+f 4197/7942/7102 4201/7941/7101 10708/7943/143 10709/7944/130
+f 4196/7938/7098 10508/7940/7100 10509/7945/7103 4201/7941/7101
+f 4201/7941/7101 10509/7945/7103 13250/7946/145 10708/7943/143
+f 4194/7933/7093 4197/7942/7102 4202/7947/7104 4198/7934/7094
+f 4198/7934/7094 4202/7947/7104 10497/7911/7074 10496/7906/7071
+f 4197/7942/7102 10709/7944/130 10710/7948/131 4202/7947/7104
+f 4202/7947/7104 10710/7948/131 13251/7912/125 10497/7911/7074
+f 4203/7949/7105 4207/7950/7106 4208/7951/7107 4204/7952/7108
+f 4204/7952/7108 4208/7951/7107 10077/6301/5559 10076/6298/5556
+f 4207/7950/7106 10514/7953/7109 10515/7954/7110 4208/7951/7107
+f 4208/7951/7107 10515/7954/7110 13143/6302/5560 10077/6301/5559
+f 4203/7949/7105 4204/7952/7108 4209/7955/7111 4205/7956/7112
+f 4205/7956/7112 4209/7955/7111 10503/7922/7082 10502/7921/7081
+f 4204/7952/7108 10076/6298/5556 10075/6297/5555 4209/7955/7111
+f 4209/7955/7111 10075/6297/5555 13142/6286/5544 10503/7922/7082
+f 4203/7949/7105 4205/7956/7112 4210/7957/7113 4206/7958/7114
+f 4206/7958/7114 4210/7957/7113 10738/7959/7115 10739/7960/7116
+f 4205/7956/7112 10502/7921/7081 10501/7930/7090 4210/7957/7113
+f 4210/7957/7113 10501/7930/7090 13257/7932/7092 10738/7959/7115
+f 4203/7949/7105 4206/7958/7114 4211/7961/7117 4207/7950/7106
+f 4207/7950/7106 4211/7961/7117 10513/7962/7118 10514/7953/7109
+f 4206/7958/7114 10739/7960/7116 10740/7963/7119 4211/7961/7117
+f 4211/7961/7117 10740/7963/7119 13258/7964/7120 10513/7962/7118
+f 4212/7965/7121 4216/7966/7122 4217/7967/7123 4213/7968/7124
+f 4213/7968/7124 4217/7967/7123 10410/7656/6830 10409/7650/6824
+f 4216/7966/7122 10508/7940/7100 10507/7939/7099 4217/7967/7123
+f 4217/7967/7123 10507/7939/7099 13201/7637/6811 10410/7656/6830
+f 4212/7965/7121 4213/7968/7124 4218/7969/7125 4214/7970/7126
+f 4214/7970/7126 4218/7969/7125 10519/7971/7127 10520/7972/7128
+f 4213/7968/7124 10409/7650/6824 10408/7649/6823 4218/7969/7125
+f 4218/7969/7125 10408/7649/6823 13202/7653/6827 10519/7971/7127
+f 4212/7965/7121 4214/7970/7126 4219/7973/7129 4215/7974/7130
+f 4215/7974/7130 4219/7973/7129 10702/7975/163 10703/7976/150
+f 4214/7970/7126 10520/7972/7128 10521/7977/7131 4219/7973/7129
+f 4219/7973/7129 10521/7977/7131 13249/7978/165 10702/7975/163
+f 4212/7965/7121 4215/7974/7130 4220/7979/7132 4216/7966/7122
+f 4216/7966/7122 4220/7979/7132 10509/7945/7103 10508/7940/7100
+f 4215/7974/7130 10703/7976/150 10704/7980/151 4220/7979/7132
+f 4220/7979/7132 10704/7980/151 13250/7946/145 10509/7945/7103
+f 4221/7981/7133 4225/7982/7134 4226/7983/7135 4222/7984/7136
+f 4222/7984/7136 4226/7983/7135 10080/6317/5575 10079/6314/5572
+f 4225/7982/7134 10526/7985/7137 10527/7986/7138 4226/7983/7135
+f 4226/7983/7135 10527/7986/7138 13144/6318/5576 10080/6317/5575
+f 4221/7981/7133 4222/7984/7136 4227/7987/7139 4223/7988/7140
+f 4223/7988/7140 4227/7987/7139 10515/7954/7110 10514/7953/7109
+f 4222/7984/7136 10079/6314/5572 10078/6313/5571 4227/7987/7139
+f 4227/7987/7139 10078/6313/5571 13143/6302/5560 10515/7954/7110
+f 4221/7981/7133 4223/7988/7140 4228/7989/7141 4224/7990/7142
+f 4224/7990/7142 4228/7989/7141 10741/7991/7143 10742/7992/7144
+f 4223/7988/7140 10514/7953/7109 10513/7962/7118 4228/7989/7141
+f 4228/7989/7141 10513/7962/7118 13258/7964/7120 10741/7991/7143
+f 4221/7981/7133 4224/7990/7142 4229/7993/7145 4225/7982/7134
+f 4225/7982/7134 4229/7993/7145 10525/7994/7146 10526/7985/7137
+f 4224/7990/7142 10742/7992/7144 10743/7995/7147 4229/7993/7145
+f 4229/7993/7145 10743/7995/7147 13259/7996/7148 10525/7994/7146
+f 4230/7997/7149 4234/7998/7150 4235/7999/7151 4231/8000/7152
+f 4231/8000/7152 4235/7999/7151 10416/7672/6846 10415/7666/6840
+f 4234/7998/7150 10520/7972/7128 10519/7971/7127 4235/7999/7151
+f 4235/7999/7151 10519/7971/7127 13202/7653/6827 10416/7672/6846
+f 4230/7997/7149 4231/8000/7152 4236/8001/7153 4232/8002/7154
+f 4232/8002/7154 4236/8001/7153 10531/8003/7155 10532/8004/7156
+f 4231/8000/7152 10415/7666/6840 10414/7665/6839 4236/8001/7153
+f 4236/8001/7153 10414/7665/6839 13203/7669/6843 10531/8003/7155
+f 4230/7997/7149 4232/8002/7154 4237/8005/7157 4233/8006/7158
+f 4233/8006/7158 4237/8005/7157 10696/8007/183 10697/8008/170
+f 4232/8002/7154 10532/8004/7156 10533/8009/7159 4237/8005/7157
+f 4237/8005/7157 10533/8009/7159 13248/8010/185 10696/8007/183
+f 4230/7997/7149 4233/8006/7158 4238/8011/7160 4234/7998/7150
+f 4234/7998/7150 4238/8011/7160 10521/7977/7131 10520/7972/7128
+f 4233/8006/7158 10697/8008/170 10698/8012/171 4238/8011/7160
+f 4238/8011/7160 10698/8012/171 13249/7978/165 10521/7977/7131
+f 4239/8013/7161 4243/8014/7162 4244/8015/7163 4240/8016/7164
+f 4240/8016/7164 4244/8015/7163 10083/6333/5591 10082/6330/5588
+f 4243/8014/7162 10538/8017/7165 10539/8018/7166 4244/8015/7163
+f 4244/8015/7163 10539/8018/7166 13145/6334/5592 10083/6333/5591
+f 4239/8013/7161 4240/8016/7164 4245/8019/7167 4241/8020/7168
+f 4241/8020/7168 4245/8019/7167 10527/7986/7138 10526/7985/7137
+f 4240/8016/7164 10082/6330/5588 10081/6329/5587 4245/8019/7167
+f 4245/8019/7167 10081/6329/5587 13144/6318/5576 10527/7986/7138
+f 4239/8013/7161 4241/8020/7168 4246/8021/7169 4242/8022/7170
+f 4242/8022/7170 4246/8021/7169 10744/8023/7171 10745/8024/7172
+f 4241/8020/7168 10526/7985/7137 10525/7994/7146 4246/8021/7169
+f 4246/8021/7169 10525/7994/7146 13259/7996/7148 10744/8023/7171
+f 4239/8013/7161 4242/8022/7170 4247/8025/7173 4243/8014/7162
+f 4243/8014/7162 4247/8025/7173 10537/8026/7174 10538/8017/7165
+f 4242/8022/7170 10745/8024/7172 10746/8027/7175 4247/8025/7173
+f 4247/8025/7173 10746/8027/7175 13260/8028/7176 10537/8026/7174
+f 4248/8029/7177 4252/8030/7178 4253/8031/7179 4249/8032/7180
+f 4249/8032/7180 4253/8031/7179 10422/7688/6862 10421/7682/6856
+f 4252/8030/7178 10532/8004/7156 10531/8003/7155 4253/8031/7179
+f 4253/8031/7179 10531/8003/7155 13203/7669/6843 10422/7688/6862
+f 4248/8029/7177 4249/8032/7180 4254/8033/7181 4250/8034/7182
+f 4250/8034/7182 4254/8033/7181 10543/8035/7183 10544/8036/7184
+f 4249/8032/7180 10421/7682/6856 10420/7681/6855 4254/8033/7181
+f 4254/8033/7181 10420/7681/6855 13204/7685/6859 10543/8035/7183
+f 4248/8029/7177 4250/8034/7182 4255/8037/7185 4251/8038/7186
+f 4251/8038/7186 4255/8037/7185 10690/8039/203 10691/8040/190
+f 4250/8034/7182 10544/8036/7184 10545/8041/7187 4255/8037/7185
+f 4255/8037/7185 10545/8041/7187 13247/8042/205 10690/8039/203
+f 4248/8029/7177 4251/8038/7186 4256/8043/7188 4252/8030/7178
+f 4252/8030/7178 4256/8043/7188 10533/8009/7159 10532/8004/7156
+f 4251/8038/7186 10691/8040/190 10692/8044/191 4256/8043/7188
+f 4256/8043/7188 10692/8044/191 13248/8010/185 10533/8009/7159
+f 4257/8045/7189 4261/8046/7190 4262/8047/7191 4258/8048/7192
+f 4258/8048/7192 4262/8047/7191 10086/6349/5607 10085/6346/5604
+f 4261/8046/7190 10550/8049/7193 10551/8050/7194 4262/8047/7191
+f 4262/8047/7191 10551/8050/7194 13146/6350/5608 10086/6349/5607
+f 4257/8045/7189 4258/8048/7192 4263/8051/7195 4259/8052/7196
+f 4259/8052/7196 4263/8051/7195 10539/8018/7166 10538/8017/7165
+f 4258/8048/7192 10085/6346/5604 10084/6345/5603 4263/8051/7195
+f 4263/8051/7195 10084/6345/5603 13145/6334/5592 10539/8018/7166
+f 4257/8045/7189 4259/8052/7196 4264/8053/7197 4260/8054/7198
+f 4260/8054/7198 4264/8053/7197 10747/8055/7199 10748/8056/7200
+f 4259/8052/7196 10538/8017/7165 10537/8026/7174 4264/8053/7197
+f 4264/8053/7197 10537/8026/7174 13260/8028/7176 10747/8055/7199
+f 4257/8045/7189 4260/8054/7198 4265/8057/7201 4261/8046/7190
+f 4261/8046/7190 4265/8057/7201 10549/8058/7202 10550/8049/7193
+f 4260/8054/7198 10748/8056/7200 10749/8059/7203 4265/8057/7201
+f 4265/8057/7201 10749/8059/7203 13261/8060/7204 10549/8058/7202
+f 4266/8061/7205 4270/8062/7206 4271/8063/7207 4267/8064/7208
+f 4267/8064/7208 4271/8063/7207 10428/7704/6878 10427/7698/6872
+f 4270/8062/7206 10544/8036/7184 10543/8035/7183 4271/8063/7207
+f 4271/8063/7207 10543/8035/7183 13204/7685/6859 10428/7704/6878
+f 4266/8061/7205 4267/8064/7208 4272/8065/7209 4268/8066/7210
+f 4268/8066/7210 4272/8065/7209 10555/8067/7211 10556/8068/7212
+f 4267/8064/7208 10427/7698/6872 10426/7697/6871 4272/8065/7209
+f 4272/8065/7209 10426/7697/6871 13205/7701/6875 10555/8067/7211
+f 4266/8061/7205 4268/8066/7210 4273/8069/7213 4269/8070/7214
+f 4269/8070/7214 4273/8069/7213 10684/8071/223 10685/8072/210
+f 4268/8066/7210 10556/8068/7212 10557/8073/7215 4273/8069/7213
+f 4273/8069/7213 10557/8073/7215 13246/8074/225 10684/8071/223
+f 4266/8061/7205 4269/8070/7214 4274/8075/7216 4270/8062/7206
+f 4270/8062/7206 4274/8075/7216 10545/8041/7187 10544/8036/7184
+f 4269/8070/7214 10685/8072/210 10686/8076/211 4274/8075/7216
+f 4274/8075/7216 10686/8076/211 13247/8042/205 10545/8041/7187
+f 4275/8077/7217 4279/8078/7218 4280/8079/7219 4276/8080/7220
+f 4276/8080/7220 4280/8079/7219 10089/6365/5623 10088/6362/5620
+f 4279/8078/7218 10562/8081/7221 10563/8082/7222 4280/8079/7219
+f 4280/8079/7219 10563/8082/7222 13147/6366/5624 10089/6365/5623
+f 4275/8077/7217 4276/8080/7220 4281/8083/7223 4277/8084/7224
+f 4277/8084/7224 4281/8083/7223 10551/8050/7194 10550/8049/7193
+f 4276/8080/7220 10088/6362/5620 10087/6361/5619 4281/8083/7223
+f 4281/8083/7223 10087/6361/5619 13146/6350/5608 10551/8050/7194
+f 4275/8077/7217 4277/8084/7224 4282/8085/7225 4278/8086/7226
+f 4278/8086/7226 4282/8085/7225 10750/8087/7227 10751/8088/7228
+f 4277/8084/7224 10550/8049/7193 10549/8058/7202 4282/8085/7225
+f 4282/8085/7225 10549/8058/7202 13261/8060/7204 10750/8087/7227
+f 4275/8077/7217 4278/8086/7226 4283/8089/7229 4279/8078/7218
+f 4279/8078/7218 4283/8089/7229 10561/8090/7230 10562/8081/7221
+f 4278/8086/7226 10751/8088/7228 10752/8091/7231 4283/8089/7229
+f 4283/8089/7229 10752/8091/7231 13262/8092/7232 10561/8090/7230
+f 4284/8093/7233 4288/8094/7234 4289/8095/7235 4285/8096/7236
+f 4285/8096/7236 4289/8095/7235 10434/7720/6894 10433/7714/6888
+f 4288/8094/7234 10556/8068/7212 10555/8067/7211 4289/8095/7235
+f 4289/8095/7235 10555/8067/7211 13205/7701/6875 10434/7720/6894
+f 4284/8093/7233 4285/8096/7236 4290/8097/7237 4286/8098/7238
+f 4286/8098/7238 4290/8097/7237 10567/8099/7239 10568/8100/7240
+f 4285/8096/7236 10433/7714/6888 10432/7713/6887 4290/8097/7237
+f 4290/8097/7237 10432/7713/6887 13206/7717/6891 10567/8099/7239
+f 4284/8093/7233 4286/8098/7238 4291/8101/7241 4287/8102/7242
+f 4287/8102/7242 4291/8101/7241 10678/8103/6149 10679/8104/6146
+f 4286/8098/7238 10568/8100/7240 10569/8105/7243 4291/8101/7241
+f 4291/8101/7241 10569/8105/7243 13245/8106/6128 10678/8103/6149
+f 4284/8093/7233 4287/8102/7242 4292/8107/7244 4288/8094/7234
+f 4288/8094/7234 4292/8107/7244 10557/8073/7215 10556/8068/7212
+f 4287/8102/7242 10679/8104/6146 10680/8108/6145 4292/8107/7244
+f 4292/8107/7244 10680/8108/6145 13246/8074/225 10557/8073/7215
+f 4293/8109/7245 4297/8110/7246 4298/8111/7247 4294/8112/7248
+f 4294/8112/7248 4298/8111/7247 10092/6381/5639 10091/6378/5636
+f 4297/8110/7246 10574/8113/7249 10575/8114/7250 4298/8111/7247
+f 4298/8111/7247 10575/8114/7250 13148/6382/5640 10092/6381/5639
+f 4293/8109/7245 4294/8112/7248 4299/8115/7251 4295/8116/7252
+f 4295/8116/7252 4299/8115/7251 10563/8082/7222 10562/8081/7221
+f 4294/8112/7248 10091/6378/5636 10090/6377/5635 4299/8115/7251
+f 4299/8115/7251 10090/6377/5635 13147/6366/5624 10563/8082/7222
+f 4293/8109/7245 4295/8116/7252 4300/8117/7253 4296/8118/7254
+f 4296/8118/7254 4300/8117/7253 10753/8119/7255 10754/8120/7256
+f 4295/8116/7252 10562/8081/7221 10561/8090/7230 4300/8117/7253
+f 4300/8117/7253 10561/8090/7230 13262/8092/7232 10753/8119/7255
+f 4293/8109/7245 4296/8118/7254 4301/8121/7257 4297/8110/7246
+f 4297/8110/7246 4301/8121/7257 10573/8122/7258 10574/8113/7249
+f 4296/8118/7254 10754/8120/7256 10755/8123/7259 4301/8121/7257
+f 4301/8121/7257 10755/8123/7259 13263/8124/7260 10573/8122/7258
+f 4302/8125/7261 4306/8126/7262 4307/8127/7263 4303/8128/7264
+f 4303/8128/7264 4307/8127/7263 10440/7736/6910 10439/7730/6904
+f 4306/8126/7262 10568/8100/7240 10567/8099/7239 4307/8127/7263
+f 4307/8127/7263 10567/8099/7239 13206/7717/6891 10440/7736/6910
+f 4302/8125/7261 4303/8128/7264 4308/8129/7265 4304/8130/7266
+f 4304/8130/7266 4308/8129/7265 10579/8131/7267 10580/8132/7268
+f 4303/8128/7264 10439/7730/6904 10438/7729/6903 4308/8129/7265
+f 4308/8129/7265 10438/7729/6903 13207/7733/6907 10579/8131/7267
+f 4302/8125/7261 4304/8130/7266 4309/8133/7269 4305/8134/7270
+f 4305/8134/7270 4309/8133/7269 10672/8135/6130 10673/8136/254
+f 4304/8130/7266 10580/8132/7268 10581/8137/7271 4309/8133/7269
+f 4309/8133/7269 10581/8137/7271 13244/8138/5474 10672/8135/6130
+f 4302/8125/7261 4305/8134/7270 4310/8139/7272 4306/8126/7262
+f 4306/8126/7262 4310/8139/7272 10569/8105/7243 10568/8100/7240
+f 4305/8134/7270 10673/8136/254 10674/8140/6126 4310/8139/7272
+f 4310/8139/7272 10674/8140/6126 13245/8106/6128 10569/8105/7243
+f 4311/8141/7273 4315/8142/7274 4316/8143/7275 4312/8144/7276
+f 4312/8144/7276 4316/8143/7275 10095/6397/5655 10094/6394/5652
+f 4315/8142/7274 10586/8145/7277 10587/8146/7278 4316/8143/7275
+f 4316/8143/7275 10587/8146/7278 13149/6398/5656 10095/6397/5655
+f 4311/8141/7273 4312/8144/7276 4317/8147/7279 4313/8148/7280
+f 4313/8148/7280 4317/8147/7279 10575/8114/7250 10574/8113/7249
+f 4312/8144/7276 10094/6394/5652 10093/6393/5651 4317/8147/7279
+f 4317/8147/7279 10093/6393/5651 13148/6382/5640 10575/8114/7250
+f 4311/8141/7273 4313/8148/7280 4318/8149/7281 4314/8150/7282
+f 4314/8150/7282 4318/8149/7281 10756/8151/7283 10757/8152/7284
+f 4313/8148/7280 10574/8113/7249 10573/8122/7258 4318/8149/7281
+f 4318/8149/7281 10573/8122/7258 13263/8124/7260 10756/8151/7283
+f 4311/8141/7273 4314/8150/7282 4319/8153/7285 4315/8142/7274
+f 4315/8142/7274 4319/8153/7285 10585/8154/7286 10586/8145/7277
+f 4314/8150/7282 10757/8152/7284 10758/8155/7287 4319/8153/7285
+f 4319/8153/7285 10758/8155/7287 13264/8156/7288 10585/8154/7286
+f 4320/8157/7289 4324/8158/7290 4325/8159/7291 4321/8160/7292
+f 4321/8160/7292 4325/8159/7291 10446/7752/6926 10445/7746/6920
+f 4324/8158/7290 10580/8132/7268 10579/8131/7267 4325/8159/7291
+f 4325/8159/7291 10579/8131/7267 13207/7733/6907 10446/7752/6926
+f 4320/8157/7289 4321/8160/7292 4326/8161/7293 4322/8162/7294
+f 4322/8162/7294 4326/8161/7293 10591/8163/7295 10592/8164/7296
+f 4321/8160/7292 10445/7746/6920 10444/7745/6919 4326/8161/7293
+f 4326/8161/7293 10444/7745/6919 13208/7749/6923 10591/8163/7295
+f 4320/8157/7289 4322/8162/7294 4327/8165/7297 4323/8166/7298
+f 4323/8166/7298 4327/8165/7297 10666/8167/6111 10667/8168/6108
+f 4322/8162/7294 10592/8164/7296 10593/8169/7299 4327/8165/7297
+f 4327/8165/7297 10593/8169/7299 13243/8170/6090 10666/8167/6111
+f 4320/8157/7289 4323/8166/7298 4328/8171/7300 4324/8158/7290
+f 4324/8158/7290 4328/8171/7300 10581/8137/7271 10580/8132/7268
+f 4323/8166/7298 10667/8168/6108 10668/8172/6107 4328/8171/7300
+f 4328/8171/7300 10668/8172/6107 13244/8138/5474 10581/8137/7271
+f 4329/8173/7301 4333/8174/7302 4334/8175/7303 4330/8176/7304
+f 4330/8176/7304 4334/8175/7303 10098/6413/5671 10097/6410/5668
+f 4333/8174/7302 10598/8177/7305 10599/8178/7306 4334/8175/7303
+f 4334/8175/7303 10599/8178/7306 13150/6414/5672 10098/6413/5671
+f 4329/8173/7301 4330/8176/7304 4335/8179/7307 4331/8180/7308
+f 4331/8180/7308 4335/8179/7307 10587/8146/7278 10586/8145/7277
+f 4330/8176/7304 10097/6410/5668 10096/6409/5667 4335/8179/7307
+f 4335/8179/7307 10096/6409/5667 13149/6398/5656 10587/8146/7278
+f 4329/8173/7301 4331/8180/7308 4336/8181/7309 4332/8182/7310
+f 4332/8182/7310 4336/8181/7309 10759/8183/7311 10760/8184/7312
+f 4331/8180/7308 10586/8145/7277 10585/8154/7286 4336/8181/7309
+f 4336/8181/7309 10585/8154/7286 13264/8156/7288 10759/8183/7311
+f 4329/8173/7301 4332/8182/7310 4337/8185/7313 4333/8174/7302
+f 4333/8174/7302 4337/8185/7313 10597/8186/7314 10598/8177/7305
+f 4332/8182/7310 10760/8184/7312 10761/8187/7315 4337/8185/7313
+f 4337/8185/7313 10761/8187/7315 13265/8188/7316 10597/8186/7314
+f 4338/8189/7317 4342/8190/7318 4343/8191/7319 4339/8192/7320
+f 4339/8192/7320 4343/8191/7319 10452/7768/6942 10451/7762/6936
+f 4342/8190/7318 10592/8164/7296 10591/8163/7295 4343/8191/7319
+f 4343/8191/7319 10591/8163/7295 13208/7749/6923 10452/7768/6942
+f 4338/8189/7317 4339/8192/7320 4344/8193/7321 4340/8194/7322
+f 4340/8194/7322 4344/8193/7321 10603/8195/7323 10604/8196/7324
+f 4339/8192/7320 10451/7762/6936 10450/7761/6935 4344/8193/7321
+f 4344/8193/7321 10450/7761/6935 13209/7765/6939 10603/8195/7323
+f 4338/8189/7317 4340/8194/7322 4345/8197/7325 4341/8198/7326
+f 4341/8198/7326 4345/8197/7325 10660/8199/6092 10661/8200/6088
+f 4340/8194/7322 10604/8196/7324 10605/8201/7327 4345/8197/7325
+f 4345/8197/7325 10605/8201/7327 13242/8202/6070 10660/8199/6092
+f 4338/8189/7317 4341/8198/7326 4346/8203/7328 4342/8190/7318
+f 4342/8190/7318 4346/8203/7328 10593/8169/7299 10592/8164/7296
+f 4341/8198/7326 10661/8200/6088 10662/8204/6087 4346/8203/7328
+f 4346/8203/7328 10662/8204/6087 13243/8170/6090 10593/8169/7299
+f 4347/8205/7329 4351/8206/7330 4352/8207/7331 4348/8208/7332
+f 4348/8208/7332 4352/8207/7331 10101/6429/5687 10100/6426/5684
+f 4351/8206/7330 10610/8209/7333 10611/8210/7334 4352/8207/7331
+f 4352/8207/7331 10611/8210/7334 13151/6430/5688 10101/6429/5687
+f 4347/8205/7329 4348/8208/7332 4353/8211/7335 4349/8212/7336
+f 4349/8212/7336 4353/8211/7335 10599/8178/7306 10598/8177/7305
+f 4348/8208/7332 10100/6426/5684 10099/6425/5683 4353/8211/7335
+f 4353/8211/7335 10099/6425/5683 13150/6414/5672 10599/8178/7306
+f 4347/8205/7329 4349/8212/7336 4354/8213/7337 4350/8214/7338
+f 4350/8214/7338 4354/8213/7337 10762/8215/7339 10763/8216/7340
+f 4349/8212/7336 10598/8177/7305 10597/8186/7314 4354/8213/7337
+f 4354/8213/7337 10597/8186/7314 13265/8188/7316 10762/8215/7339
+f 4347/8205/7329 4350/8214/7338 4355/8217/7341 4351/8206/7330
+f 4351/8206/7330 4355/8217/7341 10609/8218/7342 10610/8209/7333
+f 4350/8214/7338 10763/8216/7340 10764/8219/7343 4355/8217/7341
+f 4355/8217/7341 10764/8219/7343 13266/8220/7344 10609/8218/7342
+f 4356/8221/7345 4360/8222/7346 4361/8223/7347 4357/8224/7348
+f 4357/8224/7348 4361/8223/7347 10458/7784/6958 10457/7778/6952
+f 4360/8222/7346 10604/8196/7324 10603/8195/7323 4361/8223/7347
+f 4361/8223/7347 10603/8195/7323 13209/7765/6939 10458/7784/6958
+f 4356/8221/7345 4357/8224/7348 4362/8225/7349 4358/8226/7350
+f 4358/8226/7350 4362/8225/7349 10615/8227/7351 10616/8228/7352
+f 4357/8224/7348 10457/7778/6952 10456/7777/6951 4362/8225/7349
+f 4362/8225/7349 10456/7777/6951 13210/7781/6955 10615/8227/7351
+f 4356/8221/7345 4358/8226/7350 4363/8229/7353 4359/8230/7354
+f 4359/8230/7354 4363/8229/7353 10654/8231/6072 10655/8232/6068
+f 4358/8226/7350 10616/8228/7352 10617/8233/7355 4363/8229/7353
+f 4363/8229/7353 10617/8233/7355 13241/8234/6050 10654/8231/6072
+f 4356/8221/7345 4359/8230/7354 4364/8235/7356 4360/8222/7346
+f 4360/8222/7346 4364/8235/7356 10605/8201/7327 10604/8196/7324
+f 4359/8230/7354 10655/8232/6068 10656/8236/6067 4364/8235/7356
+f 4364/8235/7356 10656/8236/6067 13242/8202/6070 10605/8201/7327
+f 4365/8237/7357 4369/8238/7358 4370/8239/7359 4366/8240/7360
+f 4366/8240/7360 4370/8239/7359 10104/6445/5703 10103/6442/5700
+f 4369/8238/7358 10622/8241/7361 10623/8242/7362 4370/8239/7359
+f 4370/8239/7359 10623/8242/7362 13152/6446/5704 10104/6445/5703
+f 4365/8237/7357 4366/8240/7360 4371/8243/7363 4367/8244/7364
+f 4367/8244/7364 4371/8243/7363 10611/8210/7334 10610/8209/7333
+f 4366/8240/7360 10103/6442/5700 10102/6441/5699 4371/8243/7363
+f 4371/8243/7363 10102/6441/5699 13151/6430/5688 10611/8210/7334
+f 4365/8237/7357 4367/8244/7364 4372/8245/7365 4368/8246/7366
+f 4368/8246/7366 4372/8245/7365 10765/8247/7367 10766/8248/7368
+f 4367/8244/7364 10610/8209/7333 10609/8218/7342 4372/8245/7365
+f 4372/8245/7365 10609/8218/7342 13266/8220/7344 10765/8247/7367
+f 4365/8237/7357 4368/8246/7366 4373/8249/7369 4369/8238/7358
+f 4369/8238/7358 4373/8249/7369 10621/8250/7370 10622/8241/7361
+f 4368/8246/7366 10766/8248/7368 10767/8251/7371 4373/8249/7369
+f 4373/8249/7369 10767/8251/7371 13267/8252/7372 10621/8250/7370
+f 4374/8253/7373 4378/8254/7374 4379/8255/7375 4375/8256/7376
+f 4375/8256/7376 4379/8255/7375 10464/7800/6974 10463/7794/6968
+f 4378/8254/7374 10616/8228/7352 10615/8227/7351 4379/8255/7375
+f 4379/8255/7375 10615/8227/7351 13210/7781/6955 10464/7800/6974
+f 4374/8253/7373 4375/8256/7376 4380/8257/7377 4376/8258/7378
+f 4376/8258/7378 4380/8257/7377 10627/8259/7379 10628/8260/7380
+f 4375/8256/7376 10463/7794/6968 10462/7793/6967 4380/8257/7377
+f 4380/8257/7377 10462/7793/6967 13211/7797/6971 10627/8259/7379
+f 4374/8253/7373 4376/8258/7378 4381/8261/7381 4377/8262/7382
+f 4377/8262/7382 4381/8261/7381 10648/8263/6052 10649/8264/6048
+f 4376/8258/7378 10628/8260/7380 10629/8265/7383 4381/8261/7381
+f 4381/8261/7381 10629/8265/7383 13240/8266/6030 10648/8263/6052
+f 4374/8253/7373 4377/8262/7382 4382/8267/7384 4378/8254/7374
+f 4378/8254/7374 4382/8267/7384 10617/8233/7355 10616/8228/7352
+f 4377/8262/7382 10649/8264/6048 10650/8268/6047 4382/8267/7384
+f 4382/8267/7384 10650/8268/6047 13241/8234/6050 10617/8233/7355
+f 4383/8269/7385 4387/8270/7386 4388/8271/7387 4384/8272/7388
+f 4384/8272/7388 4388/8271/7387 10107/6458/5716 10106/6456/5714
+f 4387/8270/7386 8474/2465/2326 8473/2464/2325 4388/8271/7387
+f 4388/8271/7387 8473/2464/2325 12784/743/677 10107/6458/5716
+f 4383/8269/7385 4384/8272/7388 4389/8273/7389 4385/8274/7390
+f 4385/8274/7390 4389/8273/7389 10623/8242/7362 10622/8241/7361
+f 4384/8272/7388 10106/6456/5714 10105/6455/5713 4389/8273/7389
+f 4389/8273/7389 10105/6455/5713 13152/6446/5704 10623/8242/7362
+f 4383/8269/7385 4385/8274/7390 4390/8275/7391 4386/8276/7392
+f 4386/8276/7392 4390/8275/7391 10768/8277/7393 10769/8278/7394
+f 4385/8274/7390 10622/8241/7361 10621/8250/7370 4390/8275/7391
+f 4390/8275/7391 10621/8250/7370 13267/8252/7372 10768/8277/7393
+f 4383/8269/7385 4386/8276/7392 4391/8279/7395 4387/8270/7386
+f 4387/8270/7386 4391/8279/7395 8475/2470/2331 8474/2465/2326
+f 4386/8276/7392 10769/8278/7394 10770/8280/7396 4391/8279/7395
+f 4391/8279/7395 10770/8280/7396 12899/2471/2332 8475/2470/2331
+f 4392/8281/7397 4396/8282/7398 4397/8283/7399 4393/8284/7400
+f 4393/8284/7400 4397/8283/7399 10467/7813/6987 10466/7810/6984
+f 4396/8282/7398 10628/8260/7380 10627/8259/7379 4397/8283/7399
+f 4397/8283/7399 10627/8259/7379 13211/7797/6971 10467/7813/6987
+f 4392/8281/7397 4393/8284/7400 4398/8285/7401 4394/8286/7402
+f 4394/8286/7402 4398/8285/7401 8481/2491/2348 8480/2487/2346
+f 4393/8284/7400 10466/7810/6984 10465/7809/6983 4398/8285/7401
+f 4398/8285/7401 10465/7809/6983 12843/2032/1947 8481/2491/2348
+f 4392/8281/7397 4394/8286/7402 4399/8287/7403 4395/8288/7404
+f 4395/8288/7404 4399/8287/7403 10642/8289/6032 10643/8290/6028
+f 4394/8286/7402 8480/2487/2346 8479/2486/2345 4399/8287/7403
+f 4399/8287/7403 8479/2486/2345 12872/2489/977 10642/8289/6032
+f 4392/8281/7397 4395/8288/7404 4400/8291/7405 4396/8282/7398
+f 4396/8282/7398 4400/8291/7405 10629/8265/7383 10628/8260/7380
+f 4395/8288/7404 10643/8290/6028 10644/8292/6027 4400/8291/7405
+f 4400/8291/7405 10644/8292/6027 13240/8266/6030 10629/8265/7383
+f 4401/8293/6028 4405/8294/6028 4406/8295/6027 4402/8296/6027
+f 4402/8296/6027 4406/8295/6027 10639/8297/6030 10640/8298/6030
+f 4405/8294/6028 11360/8299/6028 11361/8300/6027 4406/8295/6027
+f 4406/8295/6027 11361/8300/6027 13359/8301/6030 10639/8297/6030
+f 4401/8293/6028 4402/8296/6027 4407/8302/6027 4403/8303/6028
+f 4403/8303/6028 4407/8302/6027 10644/8292/6027 10643/8290/6028
+f 4402/8296/6027 10640/8298/6030 10641/8304/6030 4407/8302/6027
+f 4407/8302/6027 10641/8304/6030 13240/8266/6030 10644/8292/6027
+f 4401/8293/6028 4403/8303/6028 4408/8305/6032 4404/8306/6032
+f 4404/8306/6032 4408/8305/6032 8487/2509/977 8486/2504/977
+f 4403/8303/6028 10643/8290/6028 10642/8289/6032 4408/8305/6032
+f 4408/8305/6032 10642/8289/6032 12872/2489/977 8487/2509/977
+f 4401/8293/6028 4404/8306/6032 4409/8307/6032 4405/8294/6028
+f 4405/8294/6028 4409/8307/6032 11359/8308/6032 11360/8299/6028
+f 4404/8306/6032 8486/2504/977 8485/2503/977 4409/8307/6032
+f 4409/8307/6032 8485/2503/977 12990/2506/977 11359/8308/6032
+f 4410/8309/6048 4414/8310/6048 4415/8311/6047 4411/8312/6047
+f 4411/8312/6047 4415/8311/6047 10645/8313/6050 10646/8314/6050
+f 4414/8310/6048 11366/8315/6048 11367/8316/6047 4415/8311/6047
+f 4415/8311/6047 11367/8316/6047 13360/8317/6050 10645/8313/6050
+f 4410/8309/6048 4411/8312/6047 4416/8318/6047 4412/8319/6048
+f 4412/8319/6048 4416/8318/6047 10650/8268/6047 10649/8264/6048
+f 4411/8312/6047 10646/8314/6050 10647/8320/6050 4416/8318/6047
+f 4416/8318/6047 10647/8320/6050 13241/8234/6050 10650/8268/6047
+f 4410/8309/6048 4412/8319/6048 4417/8321/6052 4413/8322/6052
+f 4413/8322/6052 4417/8321/6052 10641/8304/6030 10640/8298/6030
+f 4412/8319/6048 10649/8264/6048 10648/8263/6052 4417/8321/6052
+f 4417/8321/6052 10648/8263/6052 13240/8266/6030 10641/8304/6030
+f 4410/8309/6048 4413/8322/6052 4418/8323/6052 4414/8310/6048
+f 4414/8310/6048 4418/8323/6052 11365/8324/6052 11366/8315/6048
+f 4413/8322/6052 10640/8298/6030 10639/8297/6030 4418/8323/6052
+f 4418/8323/6052 10639/8297/6030 13359/8301/6030 11365/8324/6052
+f 4419/8325/6068 4423/8326/6068 4424/8327/6067 4420/8328/6067
+f 4420/8328/6067 4424/8327/6067 10651/8329/6070 10652/8330/6070
+f 4423/8326/6068 11372/8331/6068 11373/8332/6067 4424/8327/6067
+f 4424/8327/6067 11373/8332/6067 13361/8333/6070 10651/8329/6070
+f 4419/8325/6068 4420/8328/6067 4425/8334/6067 4421/8335/6068
+f 4421/8335/6068 4425/8334/6067 10656/8236/6067 10655/8232/6068
+f 4420/8328/6067 10652/8330/6070 10653/8336/6070 4425/8334/6067
+f 4425/8334/6067 10653/8336/6070 13242/8202/6070 10656/8236/6067
+f 4419/8325/6068 4421/8335/6068 4426/8337/6072 4422/8338/6072
+f 4422/8338/6072 4426/8337/6072 10647/8320/6050 10646/8314/6050
+f 4421/8335/6068 10655/8232/6068 10654/8231/6072 4426/8337/6072
+f 4426/8337/6072 10654/8231/6072 13241/8234/6050 10647/8320/6050
+f 4419/8325/6068 4422/8338/6072 4427/8339/6072 4423/8326/6068
+f 4423/8326/6068 4427/8339/6072 11371/8340/6072 11372/8331/6068
+f 4422/8338/6072 10646/8314/6050 10645/8313/6050 4427/8339/6072
+f 4427/8339/6072 10645/8313/6050 13360/8317/6050 11371/8340/6072
+f 4428/8341/6088 4432/8342/6088 4433/8343/6087 4429/8344/6087
+f 4429/8344/6087 4433/8343/6087 10657/8345/6090 10658/8346/6090
+f 4432/8342/6088 11378/8347/6088 11379/8348/6087 4433/8343/6087
+f 4433/8343/6087 11379/8348/6087 13362/8349/6090 10657/8345/6090
+f 4428/8341/6088 4429/8344/6087 4434/8350/6087 4430/8351/6088
+f 4430/8351/6088 4434/8350/6087 10662/8204/6087 10661/8200/6088
+f 4429/8344/6087 10658/8346/6090 10659/8352/6090 4434/8350/6087
+f 4434/8350/6087 10659/8352/6090 13243/8170/6090 10662/8204/6087
+f 4428/8341/6088 4430/8351/6088 4435/8353/6092 4431/8354/6092
+f 4431/8354/6092 4435/8353/6092 10653/8336/6070 10652/8330/6070
+f 4430/8351/6088 10661/8200/6088 10660/8199/6092 4435/8353/6092
+f 4435/8353/6092 10660/8199/6092 13242/8202/6070 10653/8336/6070
+f 4428/8341/6088 4431/8354/6092 4436/8355/6092 4432/8342/6088
+f 4432/8342/6088 4436/8355/6092 11377/8356/6092 11378/8347/6088
+f 4431/8354/6092 10652/8330/6070 10651/8329/6070 4436/8355/6092
+f 4436/8355/6092 10651/8329/6070 13361/8333/6070 11377/8356/6092
+f 4437/8357/6108 4441/8358/6108 4442/8359/6107 4438/8360/6107
+f 4438/8360/6107 4442/8359/6107 10663/8361/5474 10664/8362/5474
+f 4441/8358/6108 11384/8363/6108 11385/8364/6107 4442/8359/6107
+f 4442/8359/6107 11385/8364/6107 13363/8365/5474 10663/8361/5474
+f 4437/8357/6108 4438/8360/6107 4443/8366/6107 4439/8367/6108
+f 4439/8367/6108 4443/8366/6107 10668/8172/6107 10667/8168/6108
+f 4438/8360/6107 10664/8362/5474 10665/8368/5474 4443/8366/6107
+f 4443/8366/6107 10665/8368/5474 13244/8138/5474 10668/8172/6107
+f 4437/8357/6108 4439/8367/6108 4444/8369/6111 4440/8370/6111
+f 4440/8370/6111 4444/8369/6111 10659/8352/6090 10658/8346/6090
+f 4439/8367/6108 10667/8168/6108 10666/8167/6111 4444/8369/6111
+f 4444/8369/6111 10666/8167/6111 13243/8170/6090 10659/8352/6090
+f 4437/8357/6108 4440/8370/6111 4445/8371/6111 4441/8358/6108
+f 4441/8358/6108 4445/8371/6111 11383/8372/6111 11384/8363/6108
+f 4440/8370/6111 10658/8346/6090 10657/8345/6090 4445/8371/6111
+f 4445/8371/6111 10657/8345/6090 13362/8349/6090 11383/8372/6111
+f 4446/8373/254 4450/8374/254 4451/8375/6126 4447/8376/6126
+f 4447/8376/6126 4451/8375/6126 10669/8377/6128 10670/8378/6128
+f 4450/8374/254 11390/8379/254 11391/8380/6126 4451/8375/6126
+f 4451/8375/6126 11391/8380/6126 13364/8381/6128 10669/8377/6128
+f 4446/8373/254 4447/8376/6126 4452/8382/6126 4448/8383/254
+f 4448/8383/254 4452/8382/6126 10674/8140/6126 10673/8136/254
+f 4447/8376/6126 10670/8378/6128 10671/8384/6128 4452/8382/6126
+f 4452/8382/6126 10671/8384/6128 13245/8106/6128 10674/8140/6126
+f 4446/8373/254 4448/8383/254 4453/8385/6130 4449/8386/6130
+f 4449/8386/6130 4453/8385/6130 10665/8368/5474 10664/8362/5474
+f 4448/8383/254 10673/8136/254 10672/8135/6130 4453/8385/6130
+f 4453/8385/6130 10672/8135/6130 13244/8138/5474 10665/8368/5474
+f 4446/8373/254 4449/8386/6130 4454/8387/6130 4450/8374/254
+f 4450/8374/254 4454/8387/6130 11389/8388/6130 11390/8379/254
+f 4449/8386/6130 10664/8362/5474 10663/8361/5474 4454/8387/6130
+f 4454/8387/6130 10663/8361/5474 13363/8365/5474 11389/8388/6130
+f 4455/8389/6146 4459/8390/6146 4460/8391/6145 4456/8392/6145
+f 4456/8392/6145 4460/8391/6145 10675/8393/225 10676/8394/225
+f 4459/8390/6146 11396/8395/6146 11397/8396/6145 4460/8391/6145
+f 4460/8391/6145 11397/8396/6145 13365/8397/225 10675/8393/225
+f 4455/8389/6146 4456/8392/6145 4461/8398/6145 4457/8399/6146
+f 4457/8399/6146 4461/8398/6145 10680/8108/6145 10679/8104/6146
+f 4456/8392/6145 10676/8394/225 10677/8400/225 4461/8398/6145
+f 4461/8398/6145 10677/8400/225 13246/8074/225 10680/8108/6145
+f 4455/8389/6146 4457/8399/6146 4462/8401/6149 4458/8402/6149
+f 4458/8402/6149 4462/8401/6149 10671/8384/6128 10670/8378/6128
+f 4457/8399/6146 10679/8104/6146 10678/8103/6149 4462/8401/6149
+f 4462/8401/6149 10678/8103/6149 13245/8106/6128 10671/8384/6128
+f 4455/8389/6146 4458/8402/6149 4463/8403/6149 4459/8390/6146
+f 4459/8390/6146 4463/8403/6149 11395/8404/6149 11396/8395/6146
+f 4458/8402/6149 10670/8378/6128 10669/8377/6128 4463/8403/6149
+f 4463/8403/6149 10669/8377/6128 13364/8381/6128 11395/8404/6149
+f 4464/8405/210 4468/8406/210 4469/8407/211 4465/8408/211
+f 4465/8408/211 4469/8407/211 10681/8409/205 10682/8410/205
+f 4468/8406/210 11402/8411/210 11403/8412/211 4469/8407/211
+f 4469/8407/211 11403/8412/211 13366/8413/205 10681/8409/205
+f 4464/8405/210 4465/8408/211 4470/8414/211 4466/8415/210
+f 4466/8415/210 4470/8414/211 10686/8076/211 10685/8072/210
+f 4465/8408/211 10682/8410/205 10683/8416/205 4470/8414/211
+f 4470/8414/211 10683/8416/205 13247/8042/205 10686/8076/211
+f 4464/8405/210 4466/8415/210 4471/8417/223 4467/8418/223
+f 4467/8418/223 4471/8417/223 10677/8400/225 10676/8394/225
+f 4466/8415/210 10685/8072/210 10684/8071/223 4471/8417/223
+f 4471/8417/223 10684/8071/223 13246/8074/225 10677/8400/225
+f 4464/8405/210 4467/8418/223 4472/8419/223 4468/8406/210
+f 4468/8406/210 4472/8419/223 11401/8420/223 11402/8411/210
+f 4467/8418/223 10676/8394/225 10675/8393/225 4472/8419/223
+f 4472/8419/223 10675/8393/225 13365/8397/225 11401/8420/223
+f 4473/8421/190 4477/8422/190 4478/8423/191 4474/8424/191
+f 4474/8424/191 4478/8423/191 10687/8425/185 10688/8426/185
+f 4477/8422/190 11408/8427/190 11409/8428/191 4478/8423/191
+f 4478/8423/191 11409/8428/191 13367/8429/185 10687/8425/185
+f 4473/8421/190 4474/8424/191 4479/8430/191 4475/8431/190
+f 4475/8431/190 4479/8430/191 10692/8044/191 10691/8040/190
+f 4474/8424/191 10688/8426/185 10689/8432/185 4479/8430/191
+f 4479/8430/191 10689/8432/185 13248/8010/185 10692/8044/191
+f 4473/8421/190 4475/8431/190 4480/8433/203 4476/8434/203
+f 4476/8434/203 4480/8433/203 10683/8416/205 10682/8410/205
+f 4475/8431/190 10691/8040/190 10690/8039/203 4480/8433/203
+f 4480/8433/203 10690/8039/203 13247/8042/205 10683/8416/205
+f 4473/8421/190 4476/8434/203 4481/8435/203 4477/8422/190
+f 4477/8422/190 4481/8435/203 11407/8436/203 11408/8427/190
+f 4476/8434/203 10682/8410/205 10681/8409/205 4481/8435/203
+f 4481/8435/203 10681/8409/205 13366/8413/205 11407/8436/203
+f 4482/8437/170 4486/8438/170 4487/8439/171 4483/8440/171
+f 4483/8440/171 4487/8439/171 10693/8441/165 10694/8442/165
+f 4486/8438/170 11414/8443/170 11415/8444/171 4487/8439/171
+f 4487/8439/171 11415/8444/171 13368/8445/165 10693/8441/165
+f 4482/8437/170 4483/8440/171 4488/8446/171 4484/8447/170
+f 4484/8447/170 4488/8446/171 10698/8012/171 10697/8008/170
+f 4483/8440/171 10694/8442/165 10695/8448/165 4488/8446/171
+f 4488/8446/171 10695/8448/165 13249/7978/165 10698/8012/171
+f 4482/8437/170 4484/8447/170 4489/8449/183 4485/8450/183
+f 4485/8450/183 4489/8449/183 10689/8432/185 10688/8426/185
+f 4484/8447/170 10697/8008/170 10696/8007/183 4489/8449/183
+f 4489/8449/183 10696/8007/183 13248/8010/185 10689/8432/185
+f 4482/8437/170 4485/8450/183 4490/8451/183 4486/8438/170
+f 4486/8438/170 4490/8451/183 11413/8452/183 11414/8443/170
+f 4485/8450/183 10688/8426/185 10687/8425/185 4490/8451/183
+f 4490/8451/183 10687/8425/185 13367/8429/185 11413/8452/183
+f 4491/8453/150 4495/8454/150 4496/8455/151 4492/8456/151
+f 4492/8456/151 4496/8455/151 10699/8457/145 10700/8458/145
+f 4495/8454/150 11420/8459/150 11421/8460/151 4496/8455/151
+f 4496/8455/151 11421/8460/151 13369/8461/145 10699/8457/145
+f 4491/8453/150 4492/8456/151 4497/8462/151 4493/8463/150
+f 4493/8463/150 4497/8462/151 10704/7980/151 10703/7976/150
+f 4492/8456/151 10700/8458/145 10701/8464/145 4497/8462/151
+f 4497/8462/151 10701/8464/145 13250/7946/145 10704/7980/151
+f 4491/8453/150 4493/8463/150 4498/8465/163 4494/8466/163
+f 4494/8466/163 4498/8465/163 10695/8448/165 10694/8442/165
+f 4493/8463/150 10703/7976/150 10702/7975/163 4498/8465/163
+f 4498/8465/163 10702/7975/163 13249/7978/165 10695/8448/165
+f 4491/8453/150 4494/8466/163 4499/8467/163 4495/8454/150
+f 4495/8454/150 4499/8467/163 11419/8468/163 11420/8459/150
+f 4494/8466/163 10694/8442/165 10693/8441/165 4499/8467/163
+f 4499/8467/163 10693/8441/165 13368/8445/165 11419/8468/163
+f 4500/8469/130 4504/8470/130 4505/8471/131 4501/8472/131
+f 4501/8472/131 4505/8471/131 10705/8473/125 10706/8474/125
+f 4504/8470/130 11426/8475/130 11427/8476/131 4505/8471/131
+f 4505/8471/131 11427/8476/131 13370/8477/125 10705/8473/125
+f 4500/8469/130 4501/8472/131 4506/8478/131 4502/8479/130
+f 4502/8479/130 4506/8478/131 10710/7948/131 10709/7944/130
+f 4501/8472/131 10706/8474/125 10707/8480/125 4506/8478/131
+f 4506/8478/131 10707/8480/125 13251/7912/125 10710/7948/131
+f 4500/8469/130 4502/8479/130 4507/8481/143 4503/8482/143
+f 4503/8482/143 4507/8481/143 10701/8464/145 10700/8458/145
+f 4502/8479/130 10709/7944/130 10708/7943/143 4507/8481/143
+f 4507/8481/143 10708/7943/143 13250/7946/145 10701/8464/145
+f 4500/8469/130 4503/8482/143 4508/8483/143 4504/8470/130
+f 4504/8470/130 4508/8483/143 11425/8484/143 11426/8475/130
+f 4503/8482/143 10700/8458/145 10699/8457/145 4508/8483/143
+f 4508/8483/143 10699/8457/145 13369/8461/145 11425/8484/143
+f 4509/8485/6245 4513/8486/6245 4514/8487/6244 4510/8488/6244
+f 4510/8488/6244 4514/8487/6244 10711/8489/6247 10712/8490/6247
+f 4513/8486/6245 11432/8491/6245 11433/8492/6244 4514/8487/6244
+f 4514/8487/6244 11433/8492/6244 13371/8493/6247 10711/8489/6247
+f 4509/8485/6245 4510/8488/6244 4515/8494/6244 4511/8495/6245
+f 4511/8495/6245 4515/8494/6244 10716/7915/6244 10715/7910/6245
+f 4510/8488/6244 10712/8490/6247 10713/8496/6247 4515/8494/6244
+f 4515/8494/6244 10713/8496/6247 13252/7916/6247 10716/7915/6244
+f 4509/8485/6245 4511/8495/6245 4516/8497/6249 4512/8498/6249
+f 4512/8498/6249 4516/8497/6249 10707/8480/125 10706/8474/125
+f 4511/8495/6245 10715/7910/6245 10714/7909/6249 4516/8497/6249
+f 4516/8497/6249 10714/7909/6249 13251/7912/125 10707/8480/125
+f 4509/8485/6245 4512/8498/6249 4517/8499/6249 4513/8486/6245
+f 4513/8486/6245 4517/8499/6249 11431/8500/6249 11432/8491/6245
+f 4512/8498/6249 10706/8474/125 10705/8473/125 4517/8499/6249
+f 4517/8499/6249 10705/8473/125 13370/8477/125 11431/8500/6249
+f 4518/8501/7036 4522/8502/7035 4523/8503/7035 4519/8504/7036
+f 4519/8504/7036 4523/8503/7035 11440/8505/7035 11441/8506/7036
+f 4522/8502/7035 11181/8507/90 11182/8508/90 4523/8503/7035
+f 4523/8503/7035 11182/8508/90 13372/8509/90 11440/8505/7035
+f 4518/8501/7036 4519/8504/7036 4524/8510/7406 4520/8511/7040
+f 4520/8511/7040 4524/8510/7406 10717/8512/7041 10718/8513/7041
+f 4519/8504/7036 11441/8506/7036 11442/8514/7040 4524/8510/7406
+f 4524/8510/7406 11442/8514/7040 13341/8515/7041 10717/8512/7041
+f 4518/8501/7036 4520/8511/7040 4525/8516/7040 4521/8517/7036
+f 4521/8517/7036 4525/8516/7040 11173/7875/7040 11172/7870/7036
+f 4520/8511/7040 10718/8513/7041 10719/8518/7041 4525/8516/7040
+f 4525/8516/7040 10719/8518/7041 13253/7876/7041 11173/7875/7040
+f 4518/8501/7036 4521/8517/7036 4526/8519/7035 4522/8502/7035
+f 4522/8502/7035 4526/8519/7035 11180/8520/90 11181/8507/90
+f 4521/8517/7036 11172/7870/7036 11171/7869/7035 4526/8519/7035
+f 4526/8519/7035 11171/7869/7035 13328/7872/90 11180/8520/90
+f 4527/8521/7407 4531/8522/7408 4532/8523/7409 4528/8524/7410
+f 4528/8524/7410 4532/8523/7409 10723/8525/7411 10724/8526/7412
+f 4531/8522/7408 11465/8527/7413 11466/8528/7414 4532/8523/7409
+f 4532/8523/7409 11466/8528/7414 13342/8529/7415 10723/8525/7411
+f 4527/8521/7407 4528/8524/7410 4533/8530/7416 4529/8531/7417
+f 4529/8531/7417 4533/8530/7416 11460/7855/7022 11459/7850/7020
+f 4528/8524/7410 10724/8526/7412 10725/8532/7418 4533/8530/7416
+f 4533/8530/7416 10725/8532/7418 13254/7856/7006 11460/7855/7022
+f 4527/8521/7407 4529/8531/7417 4534/8533/7419 4530/8534/7420
+f 4530/8534/7420 4534/8533/7419 11467/8535/5474 11468/8536/5474
+f 4529/8531/7417 11459/7850/7020 11458/7849/7019 4534/8533/7419
+f 4534/8533/7419 11458/7849/7019 13376/7852/5474 11467/8535/5474
+f 4527/8521/7407 4530/8534/7420 4535/8537/7421 4531/8522/7408
+f 4531/8522/7408 4535/8537/7421 11464/8538/7421 11465/8527/7413
+f 4530/8534/7420 11468/8536/5474 11469/8539/5474 4535/8537/7421
+f 4535/8537/7421 11469/8539/5474 13377/8540/5474 11464/8538/7421
+f 4536/8541/7422 4540/8542/7423 4541/8543/7424 4537/8544/7425
+f 4537/8544/7425 4541/8543/7424 11269/8545/7426 11270/8546/7427
+f 4540/8542/7423 11273/8547/7428 11274/8548/7429 4541/8543/7424
+f 4541/8543/7424 11274/8548/7429 13345/8549/7430 11269/8545/7426
+f 4536/8541/7422 4537/8544/7425 4542/8550/7431 4538/8551/7432
+f 4538/8551/7432 4542/8550/7431 10783/8552/7433 10784/8553/7434
+f 4537/8544/7425 11270/8546/7427 11271/8554/7435 4542/8550/7431
+f 4542/8550/7431 11271/8554/7435 13333/8555/7436 10783/8552/7433
+f 4536/8541/7422 4538/8551/7432 4543/8556/7437 4539/8557/7438
+f 4539/8557/7438 4543/8556/7437 10789/8558/7439 10790/8559/7440
+f 4538/8551/7432 10784/8553/7434 10785/8560/7441 4543/8556/7437
+f 4543/8556/7437 10785/8560/7441 13270/8561/7442 10789/8558/7439
+f 4536/8541/7422 4539/8557/7438 4544/8562/7443 4540/8542/7423
+f 4540/8542/7423 4544/8562/7443 11272/8563/7444 11273/8547/7428
+f 4539/8557/7438 10790/8559/7440 10791/8564/7445 4544/8562/7443
+f 4544/8562/7443 10791/8564/7445 13344/8565/7446 11272/8563/7444
+f 4545/8566/7447 4549/8567/7448 4550/8568/7449 4546/8569/7450
+f 4546/8569/7450 4550/8568/7449 10801/8570/7451 10802/8571/7452
+f 4549/8567/7448 11285/8572/7453 11286/8573/7454 4550/8568/7449
+f 4550/8568/7449 11286/8573/7454 13347/8574/1082 10801/8570/7451
+f 4545/8566/7447 4546/8569/7450 4551/8575/7455 4547/8576/7456
+f 4547/8576/7456 4551/8575/7455 10804/8577/7457 10805/8578/7458
+f 4546/8569/7450 10802/8571/7452 10803/8579/7459 4551/8575/7455
+f 4551/8575/7455 10803/8579/7459 13272/8580/7460 10804/8577/7457
+f 4545/8566/7447 4547/8576/7456 4552/8581/7461 4548/8582/7462
+f 4548/8582/7462 4552/8581/7461 10777/8583/7463 10778/8584/7464
+f 4547/8576/7456 10805/8578/7458 10806/8585/7465 4552/8581/7461
+f 4552/8581/7461 10806/8585/7465 13268/8586/7466 10777/8583/7463
+f 4545/8566/7447 4548/8582/7462 4553/8587/7467 4549/8567/7448
+f 4549/8567/7448 4553/8587/7467 11284/8588/7468 11285/8572/7453
+f 4548/8582/7462 10778/8584/7464 10779/8589/7469 4553/8587/7467
+f 4553/8587/7467 10779/8589/7469 13346/8590/7470 11284/8588/7468
+f 4554/8591/7471 4558/8592/7472 4559/8593/7473 4555/8594/7474
+f 4555/8594/7474 4559/8593/7473 10816/8595/7475 10817/8596/7476
+f 4558/8592/7472 11291/8597/1096 11292/8598/1101 4559/8593/7473
+f 4559/8593/7473 11292/8598/1101 13348/8599/1102 10816/8595/7475
+f 4554/8591/7471 4555/8594/7474 4560/8600/7477 4556/8601/7478
+f 4556/8601/7478 4560/8600/7477 10819/8602/7479 10820/8603/7480
+f 4555/8594/7474 10817/8596/7476 10818/8604/7481 4560/8600/7477
+f 4560/8600/7477 10818/8604/7481 13274/8605/7482 10819/8602/7479
+f 4554/8591/7471 4556/8601/7478 4561/8606/7483 4557/8607/7484
+f 4557/8607/7484 4561/8606/7483 10803/8579/7459 10802/8571/7452
+f 4556/8601/7478 10820/8603/7480 10821/8608/7485 4561/8606/7483
+f 4561/8606/7483 10821/8608/7485 13272/8580/7460 10803/8579/7459
+f 4554/8591/7471 4557/8607/7484 4562/8609/7486 4558/8592/7472
+f 4558/8592/7472 4562/8609/7486 11290/8610/1095 11291/8597/1096
+f 4557/8607/7484 10802/8571/7452 10801/8570/7451 4562/8609/7486
+f 4562/8609/7486 10801/8570/7451 13347/8574/1082 11290/8610/1095
+f 4563/8611/7487 4567/8612/7488 4568/8613/7489 4564/8614/7490
+f 4564/8614/7490 4568/8613/7489 10831/8615/7491 10832/8616/7492
+f 4567/8612/7488 11297/8617/1116 11298/8618/1121 4568/8613/7489
+f 4568/8613/7489 11298/8618/1121 13349/8619/1122 10831/8615/7491
+f 4563/8611/7487 4564/8614/7490 4569/8620/7493 4565/8621/7494
+f 4565/8621/7494 4569/8620/7493 10834/8622/7495 10835/8623/7496
+f 4564/8614/7490 10832/8616/7492 10833/8624/7497 4569/8620/7493
+f 4569/8620/7493 10833/8624/7497 13276/8625/7498 10834/8622/7495
+f 4563/8611/7487 4565/8621/7494 4570/8626/7499 4566/8627/7500
+f 4566/8627/7500 4570/8626/7499 10818/8604/7481 10817/8596/7476
+f 4565/8621/7494 10835/8623/7496 10836/8628/7501 4570/8626/7499
+f 4570/8626/7499 10836/8628/7501 13274/8605/7482 10818/8604/7481
+f 4563/8611/7487 4566/8627/7500 4571/8629/7502 4567/8612/7488
+f 4567/8612/7488 4571/8629/7502 11296/8630/1115 11297/8617/1116
+f 4566/8627/7500 10817/8596/7476 10816/8595/7475 4571/8629/7502
+f 4571/8629/7502 10816/8595/7475 13348/8599/1102 11296/8630/1115
+f 4572/8631/7503 4576/8632/7504 4577/8633/7505 4573/8634/7506
+f 4573/8634/7506 4577/8633/7505 10846/8635/7507 10847/8636/7508
+f 4576/8632/7504 11303/8637/1136 11304/8638/1141 4577/8633/7505
+f 4577/8633/7505 11304/8638/1141 13350/8639/1142 10846/8635/7507
+f 4572/8631/7503 4573/8634/7506 4578/8640/7509 4574/8641/7510
+f 4574/8641/7510 4578/8640/7509 10849/8642/7511 10850/8643/7512
+f 4573/8634/7506 10847/8636/7508 10848/8644/7513 4578/8640/7509
+f 4578/8640/7509 10848/8644/7513 13278/8645/7514 10849/8642/7511
+f 4572/8631/7503 4574/8641/7510 4579/8646/7515 4575/8647/7516
+f 4575/8647/7516 4579/8646/7515 10833/8624/7497 10832/8616/7492
+f 4574/8641/7510 10850/8643/7512 10851/8648/7517 4579/8646/7515
+f 4579/8646/7515 10851/8648/7517 13276/8625/7498 10833/8624/7497
+f 4572/8631/7503 4575/8647/7516 4580/8649/7518 4576/8632/7504
+f 4576/8632/7504 4580/8649/7518 11302/8650/1135 11303/8637/1136
+f 4575/8647/7516 10832/8616/7492 10831/8615/7491 4580/8649/7518
+f 4580/8649/7518 10831/8615/7491 13349/8619/1122 11302/8650/1135
+f 4581/8651/7519 4585/8652/7520 4586/8653/7521 4582/8654/7522
+f 4582/8654/7522 4586/8653/7521 10861/8655/7523 10862/8656/7524
+f 4585/8652/7520 11309/8657/1156 11310/8658/1161 4586/8653/7521
+f 4586/8653/7521 11310/8658/1161 13351/8659/1162 10861/8655/7523
+f 4581/8651/7519 4582/8654/7522 4587/8660/7525 4583/8661/7526
+f 4583/8661/7526 4587/8660/7525 10864/8662/7527 10865/8663/7528
+f 4582/8654/7522 10862/8656/7524 10863/8664/7529 4587/8660/7525
+f 4587/8660/7525 10863/8664/7529 13280/8665/7530 10864/8662/7527
+f 4581/8651/7519 4583/8661/7526 4588/8666/7531 4584/8667/7532
+f 4584/8667/7532 4588/8666/7531 10848/8644/7513 10847/8636/7508
+f 4583/8661/7526 10865/8663/7528 10866/8668/7533 4588/8666/7531
+f 4588/8666/7531 10866/8668/7533 13278/8645/7514 10848/8644/7513
+f 4581/8651/7519 4584/8667/7532 4589/8669/7534 4585/8652/7520
+f 4585/8652/7520 4589/8669/7534 11308/8670/1155 11309/8657/1156
+f 4584/8667/7532 10847/8636/7508 10846/8635/7507 4589/8669/7534
+f 4589/8669/7534 10846/8635/7507 13350/8639/1142 11308/8670/1155
+f 4590/8671/7535 4594/8672/7536 4595/8673/7537 4591/8674/7538
+f 4591/8674/7538 4595/8673/7537 10876/8675/7539 10877/8676/7540
+f 4594/8672/7536 11315/8677/1176 11316/8678/1181 4595/8673/7537
+f 4595/8673/7537 11316/8678/1181 13352/8679/1182 10876/8675/7539
+f 4590/8671/7535 4591/8674/7538 4596/8680/7541 4592/8681/7542
+f 4592/8681/7542 4596/8680/7541 10879/8682/7543 10880/8683/7544
+f 4591/8674/7538 10877/8676/7540 10878/8684/7545 4596/8680/7541
+f 4596/8680/7541 10878/8684/7545 13282/8685/7546 10879/8682/7543
+f 4590/8671/7535 4592/8681/7542 4597/8686/7547 4593/8687/7548
+f 4593/8687/7548 4597/8686/7547 10863/8664/7529 10862/8656/7524
+f 4592/8681/7542 10880/8683/7544 10881/8688/7549 4597/8686/7547
+f 4597/8686/7547 10881/8688/7549 13280/8665/7530 10863/8664/7529
+f 4590/8671/7535 4593/8687/7548 4598/8689/7550 4594/8672/7536
+f 4594/8672/7536 4598/8689/7550 11314/8690/1175 11315/8677/1176
+f 4593/8687/7548 10862/8656/7524 10861/8655/7523 4598/8689/7550
+f 4598/8689/7550 10861/8655/7523 13351/8659/1162 11314/8690/1175
+f 4599/8691/7551 4603/8692/7552 4604/8693/7553 4600/8694/7554
+f 4600/8694/7554 4604/8693/7553 10891/8695/7555 10892/8696/7556
+f 4603/8692/7552 11321/8697/5148 11322/8698/5147 4604/8693/7553
+f 4604/8693/7553 11322/8698/5147 13353/8699/5134 10891/8695/7555
+f 4599/8691/7551 4600/8694/7554 4605/8700/7557 4601/8701/7558
+f 4601/8701/7558 4605/8700/7557 10894/8702/7559 10895/8703/7560
+f 4600/8694/7554 10892/8696/7556 10893/8704/7561 4605/8700/7557
+f 4605/8700/7557 10893/8704/7561 13284/8705/7562 10894/8702/7559
+f 4599/8691/7551 4601/8701/7558 4606/8706/7563 4602/8707/7564
+f 4602/8707/7564 4606/8706/7563 10878/8684/7545 10877/8676/7540
+f 4601/8701/7558 10895/8703/7560 10896/8708/7565 4606/8706/7563
+f 4606/8706/7563 10896/8708/7565 13282/8685/7546 10878/8684/7545
+f 4599/8691/7551 4602/8707/7564 4607/8709/7566 4603/8692/7552
+f 4603/8692/7552 4607/8709/7566 11320/8710/5153 11321/8697/5148
+f 4602/8707/7564 10877/8676/7540 10876/8675/7539 4607/8709/7566
+f 4607/8709/7566 10876/8675/7539 13352/8679/1182 11320/8710/5153
+f 4608/8711/7567 4612/8712/7568 4613/8713/7569 4609/8714/7570
+f 4609/8714/7570 4613/8713/7569 10906/8715/7571 10907/8716/7572
+f 4612/8712/7568 11327/8717/1221 11328/8718/5128 4613/8713/7569
+f 4613/8713/7569 11328/8718/5128 13354/8719/5115 10906/8715/7571
+f 4608/8711/7567 4609/8714/7570 4614/8720/7573 4610/8721/7574
+f 4610/8721/7574 4614/8720/7573 10909/8722/7575 10910/8723/7576
+f 4609/8714/7570 10907/8716/7572 10908/8724/7577 4614/8720/7573
+f 4614/8720/7573 10908/8724/7577 13286/8725/7578 10909/8722/7575
+f 4608/8711/7567 4610/8721/7574 4615/8726/7579 4611/8727/7580
+f 4611/8727/7580 4615/8726/7579 10893/8704/7561 10892/8696/7556
+f 4610/8721/7574 10910/8723/7576 10911/8728/7581 4615/8726/7579
+f 4615/8726/7579 10911/8728/7581 13284/8705/7562 10893/8704/7561
+f 4608/8711/7567 4611/8727/7580 4616/8729/7582 4612/8712/7568
+f 4612/8712/7568 4616/8729/7582 11326/8730/5133 11327/8717/1221
+f 4611/8727/7580 10892/8696/7556 10891/8695/7555 4616/8729/7582
+f 4616/8729/7582 10891/8695/7555 13353/8699/5134 11326/8730/5133
+f 4617/8731/7583 4621/8732/7584 4622/8733/7585 4618/8734/7586
+f 4618/8734/7586 4622/8733/7585 10921/8735/7587 10922/8736/7588
+f 4621/8732/7584 11333/8737/5109 11334/8738/5108 4622/8733/7585
+f 4622/8733/7585 11334/8738/5108 13355/8739/5095 10921/8735/7587
+f 4617/8731/7583 4618/8734/7586 4623/8740/7589 4619/8741/7590
+f 4619/8741/7590 4623/8740/7589 10924/8742/7591 10925/8743/7592
+f 4618/8734/7586 10922/8736/7588 10923/8744/7593 4623/8740/7589
+f 4623/8740/7589 10923/8744/7593 13288/8745/7594 10924/8742/7591
+f 4617/8731/7583 4619/8741/7590 4624/8746/7595 4620/8747/7596
+f 4620/8747/7596 4624/8746/7595 10908/8724/7577 10907/8716/7572
+f 4619/8741/7590 10925/8743/7592 10926/8748/7597 4624/8746/7595
+f 4624/8746/7595 10926/8748/7597 13286/8725/7578 10908/8724/7577
+f 4617/8731/7583 4620/8747/7596 4625/8749/7598 4621/8732/7584
+f 4621/8732/7584 4625/8749/7598 11332/8750/5114 11333/8737/5109
+f 4620/8747/7596 10907/8716/7572 10906/8715/7571 4625/8749/7598
+f 4625/8749/7598 10906/8715/7571 13354/8719/5115 11332/8750/5114
+f 4626/8751/7599 4630/8752/7600 4631/8753/7601 4627/8754/7602
+f 4627/8754/7602 4631/8753/7601 10936/8755/7603 10937/8756/7604
+f 4630/8752/7600 11339/8757/5089 11340/8758/5088 4631/8753/7601
+f 4631/8753/7601 11340/8758/5088 13356/8759/5075 10936/8755/7603
+f 4626/8751/7599 4627/8754/7602 4632/8760/7605 4628/8761/7606
+f 4628/8761/7606 4632/8760/7605 10939/8762/7607 10940/8763/7608
+f 4627/8754/7602 10937/8756/7604 10938/8764/7609 4632/8760/7605
+f 4632/8760/7605 10938/8764/7609 13290/8765/7610 10939/8762/7607
+f 4626/8751/7599 4628/8761/7606 4633/8766/7611 4629/8767/7612
+f 4629/8767/7612 4633/8766/7611 10923/8744/7593 10922/8736/7588
+f 4628/8761/7606 10940/8763/7608 10941/8768/7613 4633/8766/7611
+f 4633/8766/7611 10941/8768/7613 13288/8745/7594 10923/8744/7593
+f 4626/8751/7599 4629/8767/7612 4634/8769/7614 4630/8752/7600
+f 4630/8752/7600 4634/8769/7614 11338/8770/5094 11339/8757/5089
+f 4629/8767/7612 10922/8736/7588 10921/8735/7587 4634/8769/7614
+f 4634/8769/7614 10921/8735/7587 13355/8739/5095 11338/8770/5094
+f 4635/8771/7615 4639/8772/7616 4640/8773/7617 4636/8774/7618
+f 4636/8774/7618 4640/8773/7617 10951/8775/7619 10952/8776/7620
+f 4639/8772/7616 11345/8777/5069 11346/8778/5068 4640/8773/7617
+f 4640/8773/7617 11346/8778/5068 13357/8779/5055 10951/8775/7619
+f 4635/8771/7615 4636/8774/7618 4641/8780/7621 4637/8781/7622
+f 4637/8781/7622 4641/8780/7621 10954/8782/7623 10955/8783/7624
+f 4636/8774/7618 10952/8776/7620 10953/8784/7625 4641/8780/7621
+f 4641/8780/7621 10953/8784/7625 13292/8785/7626 10954/8782/7623
+f 4635/8771/7615 4637/8781/7622 4642/8786/7627 4638/8787/7628
+f 4638/8787/7628 4642/8786/7627 10938/8764/7609 10937/8756/7604
+f 4637/8781/7622 10955/8783/7624 10956/8788/7629 4642/8786/7627
+f 4642/8786/7627 10956/8788/7629 13290/8765/7610 10938/8764/7609
+f 4635/8771/7615 4638/8787/7628 4643/8789/7630 4639/8772/7616
+f 4639/8772/7616 4643/8789/7630 11344/8790/5074 11345/8777/5069
+f 4638/8787/7628 10937/8756/7604 10936/8755/7603 4643/8789/7630
+f 4643/8789/7630 10936/8755/7603 13356/8759/5075 11344/8790/5074
+f 4644/8791/7631 4648/8792/7632 4649/8793/7633 4645/8794/7634
+f 4645/8794/7634 4649/8793/7633 10966/8795/7635 10967/8796/7636
+f 4648/8792/7632 11351/8797/5049 11352/8798/5048 4649/8793/7633
+f 4649/8793/7633 11352/8798/5048 13358/8799/5035 10966/8795/7635
+f 4644/8791/7631 4645/8794/7634 4650/8800/7637 4646/8801/7638
+f 4646/8801/7638 4650/8800/7637 10969/8802/7639 10970/8803/7640
+f 4645/8794/7634 10967/8796/7636 10968/8804/7641 4650/8800/7637
+f 4650/8800/7637 10968/8804/7641 13294/8805/7642 10969/8802/7639
+f 4644/8791/7631 4646/8801/7638 4651/8806/7643 4647/8807/7644
+f 4647/8807/7644 4651/8806/7643 10953/8784/7625 10952/8776/7620
+f 4646/8801/7638 10970/8803/7640 10971/8808/7645 4651/8806/7643
+f 4651/8806/7643 10971/8808/7645 13292/8785/7626 10953/8784/7625
+f 4644/8791/7631 4647/8807/7644 4652/8809/7646 4648/8792/7632
+f 4648/8792/7632 4652/8809/7646 11350/8810/5054 11351/8797/5049
+f 4647/8807/7644 10952/8776/7620 10951/8775/7619 4652/8809/7646
+f 4652/8809/7646 10951/8775/7619 13357/8779/5055 11350/8810/5054
+f 4653/8811/7647 4657/8812/7648 4658/8813/7649 4654/8814/7650
+f 4654/8814/7650 4658/8813/7649 8807/2985/2578 8806/2984/2577
+f 4657/8812/7648 11354/8815/5029 11355/8816/5028 4658/8813/7649
+f 4658/8813/7649 11355/8816/5028 12989/2986/9 8807/2985/2578
+f 4653/8811/7647 4654/8814/7650 4659/8817/7651 4655/8818/7652
+f 4655/8818/7652 4659/8817/7651 10975/8819/7653 10976/8820/7654
+f 4654/8814/7650 8806/2984/2577 8805/2995/2586 4659/8817/7651
+f 4659/8817/7651 8805/2995/2586 12926/2997/2588 10975/8819/7653
+f 4653/8811/7647 4655/8818/7652 4660/8821/7655 4656/8822/7656
+f 4656/8822/7656 4660/8821/7655 10968/8804/7641 10967/8796/7636
+f 4655/8818/7652 10976/8820/7654 10977/8823/7657 4660/8821/7655
+f 4660/8821/7655 10977/8823/7657 13294/8805/7642 10968/8804/7641
+f 4653/8811/7647 4656/8822/7656 4661/8824/7658 4657/8812/7648
+f 4657/8812/7648 4661/8824/7658 11353/8825/5034 11354/8815/5029
+f 4656/8822/7656 10967/8796/7636 10966/8795/7635 4661/8824/7658
+f 4661/8824/7658 10966/8795/7635 13358/8799/5035 11353/8825/5034
+f 4662/8826/7659 4666/8827/7660 4667/8828/7661 4663/8829/7662
+f 4663/8829/7662 4667/8828/7661 10731/7835/7009 10730/7830/7004
+f 4666/8827/7660 11216/8830/7663 11217/8831/7664 4667/8828/7661
+f 4667/8828/7661 11217/8831/7664 13335/7836/7010 10731/7835/7009
+f 4662/8826/7659 4663/8829/7662 4668/8832/7665 4664/8833/7666
+f 4664/8833/7666 4668/8832/7665 10780/8834/7667 10781/8835/7668
+f 4663/8829/7662 10730/7830/7004 10729/7829/7003 4668/8832/7665
+f 4668/8832/7665 10729/7829/7003 13254/7832/7006 10780/8834/7667
+f 4662/8826/7659 4664/8833/7666 4669/8836/7669 4665/8837/7670
+f 4665/8837/7670 4669/8836/7669 11072/8838/7671 11073/8839/7672
+f 4664/8833/7666 10781/8835/7668 10782/8840/7673 4669/8836/7669
+f 4669/8836/7669 10782/8840/7673 13310/8841/7674 11072/8838/7671
+f 4662/8826/7659 4665/8837/7670 4670/8842/7675 4666/8827/7660
+f 4666/8827/7660 4670/8842/7675 11215/8843/7676 11216/8830/7663
+f 4665/8837/7670 11073/8839/7672 11074/8844/7677 4670/8842/7675
+f 4670/8842/7675 11074/8844/7677 13334/8845/7678 11215/8843/7676
+f 4671/8846/7679 4675/8847/7680 4676/8848/7681 4672/8849/7682
+f 4672/8849/7682 4676/8848/7681 10725/8532/7418 10724/8526/7412
+f 4675/8847/7680 10781/8850/7668 10780/8851/7667 4676/8848/7681
+f 4676/8848/7681 10780/8851/7667 13254/7856/7006 10725/8532/7418
+f 4671/8846/7679 4672/8849/7682 4677/8852/7683 4673/8853/7684
+f 4673/8853/7684 4677/8852/7683 11260/8854/7685 11261/8855/7686
+f 4672/8849/7682 10724/8526/7412 10723/8525/7411 4677/8852/7683
+f 4677/8852/7683 10723/8525/7411 13342/8529/7415 11260/8854/7685
+f 4671/8846/7679 4673/8853/7684 4678/8856/7687 4674/8857/7688
+f 4674/8857/7688 4678/8856/7687 11257/8858/7689 11258/8859/7690
+f 4673/8853/7684 11261/8855/7686 11262/8860/7691 4678/8856/7687
+f 4678/8856/7687 11262/8860/7691 13343/8861/6108 11257/8858/7689
+f 4671/8846/7679 4674/8857/7688 4679/8862/7692 4675/8847/7680
+f 4675/8847/7680 4679/8862/7692 10782/8863/7673 10781/8850/7668
+f 4674/8857/7688 11258/8859/7690 11259/8864/7693 4679/8862/7692
+f 4679/8862/7692 11259/8864/7693 13310/8865/7674 10782/8863/7673
+f 4680/8866/7694 4684/8867/7695 4685/8868/7696 4681/8869/7697
+f 4681/8869/7697 4685/8868/7696 10476/6492/5741 10475/6484/5733
+f 4684/8867/7695 10787/8870/7698 10788/8871/7699 4685/8868/7696
+f 4685/8868/7696 10788/8871/7699 13212/6493/5742 10476/6492/5741
+f 4680/8866/7694 4681/8869/7697 4686/8872/7700 4682/8873/7701
+f 4682/8873/7701 4686/8872/7700 11191/8874/7702 11192/8875/7703
+f 4681/8869/7697 10475/6484/5733 10474/6483/5732 4686/8872/7700
+f 4686/8872/7700 10474/6483/5732 13330/6487/5736 11191/8874/7702
+f 4680/8866/7694 4682/8873/7701 4687/8876/7704 4683/8877/7705
+f 4683/8877/7705 4687/8876/7704 11189/8878/7706 11190/8879/7707
+f 4682/8873/7701 11192/8875/7703 11193/8880/7708 4687/8876/7704
+f 4687/8876/7704 11193/8880/7708 13331/8881/7709 11189/8878/7706
+f 4688/8882/7710 4692/8883/7711 4693/8884/7712 4689/8885/7713
+f 4689/8885/7713 4693/8884/7712 10734/7895/7060 10733/7890/7055
+f 4692/8883/7711 10796/8886/7714 10797/8887/7715 4693/8884/7712
+f 4693/8884/7712 10797/8887/7715 13256/7896/7061 10734/7895/7060
+f 4688/8882/7710 4689/8885/7713 4694/8888/7716 4690/8889/7717
+f 4690/8889/7717 4694/8888/7716 10771/8890/7718 10772/8891/7719
+f 4689/8885/7713 10733/7890/7055 10732/7889/7054 4694/8888/7716
+f 4694/8888/7716 10732/7889/7054 13255/7892/7057 10771/8890/7718
+f 4688/8882/7710 4690/8889/7717 4695/8892/7720 4691/8893/7721
+f 4691/8893/7721 4695/8892/7720 11078/8894/7722 11079/8895/7723
+f 4690/8889/7717 10772/8891/7719 10773/8896/7724 4695/8892/7720
+f 4695/8892/7720 10773/8896/7724 13311/8897/7725 11078/8894/7722
+f 4688/8882/7710 4691/8893/7721 4696/8898/7726 4692/8883/7711
+f 4692/8883/7711 4696/8898/7726 10795/8899/7727 10796/8886/7714
+f 4691/8893/7721 11079/8895/7723 11080/8900/7728 4696/8898/7726
+f 4696/8898/7726 11080/8900/7728 13312/8901/7729 10795/8899/7727
+f 4697/8902/7730 4701/8903/7731 4702/8904/7732 4698/8905/7733
+f 4698/8905/7733 4702/8904/7732 10492/8906/7734 10493/8907/7735
+f 4701/8903/7731 10775/8908/7736 10776/8909/7737 4702/8904/7732
+f 4702/8904/7732 10776/8909/7737 13213/8910/7738 10492/8906/7734
+f 4697/8902/7730 4698/8905/7733 4703/8911/7739 4699/8912/7740
+f 4699/8912/7740 4703/8911/7739 10798/8913/7741 10799/8914/7742
+f 4698/8905/7733 10493/8907/7735 10494/8915/7743 4703/8911/7739
+f 4703/8911/7739 10494/8915/7743 13216/8916/7744 10798/8913/7741
+f 4697/8902/7730 4699/8912/7740 4704/8917/7745 4700/8918/7746
+f 4700/8918/7746 4704/8917/7745 11056/8919/7747 11057/8920/7748
+f 4699/8912/7740 10799/8914/7742 10800/8921/7749 4704/8917/7745
+f 4704/8917/7745 10800/8921/7749 13307/8922/7750 11056/8919/7747
+f 4697/8902/7730 4700/8918/7746 4705/8923/7751 4701/8903/7731
+f 4701/8903/7731 4705/8923/7751 10774/8924/7752 10775/8908/7736
+f 4700/8918/7746 11057/8920/7748 11058/8925/7753 4705/8923/7751
+f 4705/8923/7751 11058/8925/7753 13308/8926/7754 10774/8924/7752
+f 4706/8927/7755 4710/8928/7756 4711/8929/7757 4707/8930/7758
+f 4707/8930/7758 4711/8929/7757 10737/7931/7091 10736/7928/7088
+f 4710/8928/7756 10811/8931/7759 10812/8932/7760 4711/8929/7757
+f 4711/8929/7757 10812/8932/7760 13257/7932/7092 10737/7931/7091
+f 4706/8927/7755 4707/8930/7758 4712/8933/7761 4708/8934/7762
+f 4708/8934/7762 4712/8933/7761 10797/8887/7715 10796/8886/7714
+f 4707/8930/7758 10736/7928/7088 10735/7927/7087 4712/8933/7761
+f 4712/8933/7761 10735/7927/7087 13256/7896/7061 10797/8887/7715
+f 4706/8927/7755 4708/8934/7762 4713/8935/7763 4709/8936/7764
+f 4709/8936/7764 4713/8935/7763 11084/8937/7765 11085/8938/7766
+f 4708/8934/7762 10796/8886/7714 10795/8899/7727 4713/8935/7763
+f 4713/8935/7763 10795/8899/7727 13312/8901/7729 11084/8937/7765
+f 4706/8927/7755 4709/8936/7764 4714/8939/7767 4710/8928/7756
+f 4710/8928/7756 4714/8939/7767 10810/8940/7768 10811/8931/7759
+f 4709/8936/7764 11085/8938/7766 11086/8941/7769 4714/8939/7767
+f 4714/8939/7767 11086/8941/7769 13313/8942/7770 10810/8940/7768
+f 4715/8943/7771 4719/8944/7772 4720/8945/7773 4716/8946/7774
+f 4716/8946/7774 4720/8945/7773 10504/8947/7775 10505/8948/7776
+f 4719/8944/7772 10799/8914/7742 10798/8913/7741 4720/8945/7773
+f 4720/8945/7773 10798/8913/7741 13216/8916/7744 10504/8947/7775
+f 4715/8943/7771 4716/8946/7774 4721/8949/7777 4717/8950/7778
+f 4717/8950/7778 4721/8949/7777 10813/8951/7779 10814/8952/7780
+f 4716/8946/7774 10505/8948/7776 10506/8953/7781 4721/8949/7777
+f 4721/8949/7777 10506/8953/7781 13218/8954/7782 10813/8951/7779
+f 4715/8943/7771 4717/8950/7778 4722/8955/7783 4718/8956/7784
+f 4718/8956/7784 4722/8955/7783 11050/8957/7785 11051/8958/7786
+f 4717/8950/7778 10814/8952/7780 10815/8959/7787 4722/8955/7783
+f 4722/8955/7783 10815/8959/7787 13306/8960/7788 11050/8957/7785
+f 4715/8943/7771 4718/8956/7784 4723/8961/7789 4719/8944/7772
+f 4719/8944/7772 4723/8961/7789 10800/8921/7749 10799/8914/7742
+f 4718/8956/7784 11051/8958/7786 11052/8962/7790 4723/8961/7789
+f 4723/8961/7789 11052/8962/7790 13307/8922/7750 10800/8921/7749
+f 4724/8963/7791 4728/8964/7792 4729/8965/7793 4725/8966/7794
+f 4725/8966/7794 4729/8965/7793 10740/7963/7119 10739/7960/7116
+f 4728/8964/7792 10826/8967/7795 10827/8968/7796 4729/8965/7793
+f 4729/8965/7793 10827/8968/7796 13258/7964/7120 10740/7963/7119
+f 4724/8963/7791 4725/8966/7794 4730/8969/7797 4726/8970/7798
+f 4726/8970/7798 4730/8969/7797 10812/8932/7760 10811/8931/7759
+f 4725/8966/7794 10739/7960/7116 10738/7959/7115 4730/8969/7797
+f 4730/8969/7797 10738/7959/7115 13257/7932/7092 10812/8932/7760
+f 4724/8963/7791 4726/8970/7798 4731/8971/7799 4727/8972/7800
+f 4727/8972/7800 4731/8971/7799 11090/8973/7801 11091/8974/7802
+f 4726/8970/7798 10811/8931/7759 10810/8940/7768 4731/8971/7799
+f 4731/8971/7799 10810/8940/7768 13313/8942/7770 11090/8973/7801
+f 4724/8963/7791 4727/8972/7800 4732/8975/7803 4728/8964/7792
+f 4728/8964/7792 4732/8975/7803 10825/8976/7804 10826/8967/7795
+f 4727/8972/7800 11091/8974/7802 11092/8977/7805 4732/8975/7803
+f 4732/8975/7803 11092/8977/7805 13314/8978/7806 10825/8976/7804
+f 4733/8979/7807 4737/8980/7808 4738/8981/7809 4734/8982/7810
+f 4734/8982/7810 4738/8981/7809 10516/8983/7811 10517/8984/7812
+f 4737/8980/7808 10814/8952/7780 10813/8951/7779 4738/8981/7809
+f 4738/8981/7809 10813/8951/7779 13218/8954/7782 10516/8983/7811
+f 4733/8979/7807 4734/8982/7810 4739/8985/7813 4735/8986/7814
+f 4735/8986/7814 4739/8985/7813 10828/8987/7815 10829/8988/7816
+f 4734/8982/7810 10517/8984/7812 10518/8989/7817 4739/8985/7813
+f 4739/8985/7813 10518/8989/7817 13220/8990/7818 10828/8987/7815
+f 4733/8979/7807 4735/8986/7814 4740/8991/7819 4736/8992/7820
+f 4736/8992/7820 4740/8991/7819 11044/8993/7821 11045/8994/7822
+f 4735/8986/7814 10829/8988/7816 10830/8995/7823 4740/8991/7819
+f 4740/8991/7819 10830/8995/7823 13305/8996/7824 11044/8993/7821
+f 4733/8979/7807 4736/8992/7820 4741/8997/7825 4737/8980/7808
+f 4737/8980/7808 4741/8997/7825 10815/8959/7787 10814/8952/7780
+f 4736/8992/7820 11045/8994/7822 11046/8998/7826 4741/8997/7825
+f 4741/8997/7825 11046/8998/7826 13306/8960/7788 10815/8959/7787
+f 4742/8999/7827 4746/9000/7828 4747/9001/7829 4743/9002/7830
+f 4743/9002/7830 4747/9001/7829 10743/7995/7147 10742/7992/7144
+f 4746/9000/7828 10841/9003/7831 10842/9004/7832 4747/9001/7829
+f 4747/9001/7829 10842/9004/7832 13259/7996/7148 10743/7995/7147
+f 4742/8999/7827 4743/9002/7830 4748/9005/7833 4744/9006/7834
+f 4744/9006/7834 4748/9005/7833 10827/8968/7796 10826/8967/7795
+f 4743/9002/7830 10742/7992/7144 10741/7991/7143 4748/9005/7833
+f 4748/9005/7833 10741/7991/7143 13258/7964/7120 10827/8968/7796
+f 4742/8999/7827 4744/9006/7834 4749/9007/7835 4745/9008/7836
+f 4745/9008/7836 4749/9007/7835 11096/9009/7837 11097/9010/7838
+f 4744/9006/7834 10826/8967/7795 10825/8976/7804 4749/9007/7835
+f 4749/9007/7835 10825/8976/7804 13314/8978/7806 11096/9009/7837
+f 4742/8999/7827 4745/9008/7836 4750/9011/7839 4746/9000/7828
+f 4746/9000/7828 4750/9011/7839 10840/9012/7840 10841/9003/7831
+f 4745/9008/7836 11097/9010/7838 11098/9013/7841 4750/9011/7839
+f 4750/9011/7839 11098/9013/7841 13315/9014/7842 10840/9012/7840
+f 4751/9015/7843 4755/9016/7844 4756/9017/7845 4752/9018/7846
+f 4752/9018/7846 4756/9017/7845 10528/9019/7847 10529/9020/7848
+f 4755/9016/7844 10829/8988/7816 10828/8987/7815 4756/9017/7845
+f 4756/9017/7845 10828/8987/7815 13220/8990/7818 10528/9019/7847
+f 4751/9015/7843 4752/9018/7846 4757/9021/7849 4753/9022/7850
+f 4753/9022/7850 4757/9021/7849 10843/9023/7851 10844/9024/7852
+f 4752/9018/7846 10529/9020/7848 10530/9025/7853 4757/9021/7849
+f 4757/9021/7849 10530/9025/7853 13222/9026/7854 10843/9023/7851
+f 4751/9015/7843 4753/9022/7850 4758/9027/7855 4754/9028/7856
+f 4754/9028/7856 4758/9027/7855 11038/9029/7857 11039/9030/7858
+f 4753/9022/7850 10844/9024/7852 10845/9031/7859 4758/9027/7855
+f 4758/9027/7855 10845/9031/7859 13304/9032/7860 11038/9029/7857
+f 4751/9015/7843 4754/9028/7856 4759/9033/7861 4755/9016/7844
+f 4755/9016/7844 4759/9033/7861 10830/8995/7823 10829/8988/7816
+f 4754/9028/7856 11039/9030/7858 11040/9034/7862 4759/9033/7861
+f 4759/9033/7861 11040/9034/7862 13305/8996/7824 10830/8995/7823
+f 4760/9035/7863 4764/9036/7864 4765/9037/7865 4761/9038/7866
+f 4761/9038/7866 4765/9037/7865 10746/8027/7175 10745/8024/7172
+f 4764/9036/7864 10856/9039/7867 10857/9040/7868 4765/9037/7865
+f 4765/9037/7865 10857/9040/7868 13260/8028/7176 10746/8027/7175
+f 4760/9035/7863 4761/9038/7866 4766/9041/7869 4762/9042/7870
+f 4762/9042/7870 4766/9041/7869 10842/9004/7832 10841/9003/7831
+f 4761/9038/7866 10745/8024/7172 10744/8023/7171 4766/9041/7869
+f 4766/9041/7869 10744/8023/7171 13259/7996/7148 10842/9004/7832
+f 4760/9035/7863 4762/9042/7870 4767/9043/7871 4763/9044/7872
+f 4763/9044/7872 4767/9043/7871 11102/9045/7873 11103/9046/7874
+f 4762/9042/7870 10841/9003/7831 10840/9012/7840 4767/9043/7871
+f 4767/9043/7871 10840/9012/7840 13315/9014/7842 11102/9045/7873
+f 4760/9035/7863 4763/9044/7872 4768/9047/7875 4764/9036/7864
+f 4764/9036/7864 4768/9047/7875 10855/9048/7876 10856/9039/7867
+f 4763/9044/7872 11103/9046/7874 11104/9049/7877 4768/9047/7875
+f 4768/9047/7875 11104/9049/7877 13316/9050/7878 10855/9048/7876
+f 4769/9051/7879 4773/9052/7880 4774/9053/7881 4770/9054/7882
+f 4770/9054/7882 4774/9053/7881 10540/9055/7883 10541/9056/7884
+f 4773/9052/7880 10844/9024/7852 10843/9023/7851 4774/9053/7881
+f 4774/9053/7881 10843/9023/7851 13222/9026/7854 10540/9055/7883
+f 4769/9051/7879 4770/9054/7882 4775/9057/7885 4771/9058/7886
+f 4771/9058/7886 4775/9057/7885 10858/9059/7887 10859/9060/7888
+f 4770/9054/7882 10541/9056/7884 10542/9061/7889 4775/9057/7885
+f 4775/9057/7885 10542/9061/7889 13224/9062/7890 10858/9059/7887
+f 4769/9051/7879 4771/9058/7886 4776/9063/7891 4772/9064/7892
+f 4772/9064/7892 4776/9063/7891 11032/9065/7893 11033/9066/7894
+f 4771/9058/7886 10859/9060/7888 10860/9067/7895 4776/9063/7891
+f 4776/9063/7891 10860/9067/7895 13303/9068/7896 11032/9065/7893
+f 4769/9051/7879 4772/9064/7892 4777/9069/7897 4773/9052/7880
+f 4773/9052/7880 4777/9069/7897 10845/9031/7859 10844/9024/7852
+f 4772/9064/7892 11033/9066/7894 11034/9070/7898 4777/9069/7897
+f 4777/9069/7897 11034/9070/7898 13304/9032/7860 10845/9031/7859
+f 4778/9071/7899 4782/9072/7900 4783/9073/7901 4779/9074/7902
+f 4779/9074/7902 4783/9073/7901 10749/8059/7203 10748/8056/7200
+f 4782/9072/7900 10871/9075/7903 10872/9076/7904 4783/9073/7901
+f 4783/9073/7901 10872/9076/7904 13261/8060/7204 10749/8059/7203
+f 4778/9071/7899 4779/9074/7902 4784/9077/7905 4780/9078/7906
+f 4780/9078/7906 4784/9077/7905 10857/9040/7868 10856/9039/7867
+f 4779/9074/7902 10748/8056/7200 10747/8055/7199 4784/9077/7905
+f 4784/9077/7905 10747/8055/7199 13260/8028/7176 10857/9040/7868
+f 4778/9071/7899 4780/9078/7906 4785/9079/7907 4781/9080/7908
+f 4781/9080/7908 4785/9079/7907 11108/9081/7909 11109/9082/7910
+f 4780/9078/7906 10856/9039/7867 10855/9048/7876 4785/9079/7907
+f 4785/9079/7907 10855/9048/7876 13316/9050/7878 11108/9081/7909
+f 4778/9071/7899 4781/9080/7908 4786/9083/7911 4782/9072/7900
+f 4782/9072/7900 4786/9083/7911 10870/9084/7912 10871/9075/7903
+f 4781/9080/7908 11109/9082/7910 11110/9085/7913 4786/9083/7911
+f 4786/9083/7911 11110/9085/7913 13317/9086/7914 10870/9084/7912
+f 4787/9087/7915 4791/9088/7916 4792/9089/7917 4788/9090/7918
+f 4788/9090/7918 4792/9089/7917 10552/9091/7919 10553/9092/7920
+f 4791/9088/7916 10859/9060/7888 10858/9059/7887 4792/9089/7917
+f 4792/9089/7917 10858/9059/7887 13224/9062/7890 10552/9091/7919
+f 4787/9087/7915 4788/9090/7918 4793/9093/7921 4789/9094/7922
+f 4789/9094/7922 4793/9093/7921 10873/9095/7923 10874/9096/7924
+f 4788/9090/7918 10553/9092/7920 10554/9097/7925 4793/9093/7921
+f 4793/9093/7921 10554/9097/7925 13226/9098/7926 10873/9095/7923
+f 4787/9087/7915 4789/9094/7922 4794/9099/7927 4790/9100/7928
+f 4790/9100/7928 4794/9099/7927 11026/9101/7929 11027/9102/7930
+f 4789/9094/7922 10874/9096/7924 10875/9103/7931 4794/9099/7927
+f 4794/9099/7927 10875/9103/7931 13302/9104/7932 11026/9101/7929
+f 4787/9087/7915 4790/9100/7928 4795/9105/7933 4791/9088/7916
+f 4791/9088/7916 4795/9105/7933 10860/9067/7895 10859/9060/7888
+f 4790/9100/7928 11027/9102/7930 11028/9106/7934 4795/9105/7933
+f 4795/9105/7933 11028/9106/7934 13303/9068/7896 10860/9067/7895
+f 4796/9107/7935 4800/9108/7936 4801/9109/7937 4797/9110/7938
+f 4797/9110/7938 4801/9109/7937 10752/8091/7231 10751/8088/7228
+f 4800/9108/7936 10886/9111/7939 10887/9112/7940 4801/9109/7937
+f 4801/9109/7937 10887/9112/7940 13262/8092/7232 10752/8091/7231
+f 4796/9107/7935 4797/9110/7938 4802/9113/7941 4798/9114/7942
+f 4798/9114/7942 4802/9113/7941 10872/9076/7904 10871/9075/7903
+f 4797/9110/7938 10751/8088/7228 10750/8087/7227 4802/9113/7941
+f 4802/9113/7941 10750/8087/7227 13261/8060/7204 10872/9076/7904
+f 4796/9107/7935 4798/9114/7942 4803/9115/7943 4799/9116/7944
+f 4799/9116/7944 4803/9115/7943 11114/9117/7945 11115/9118/7946
+f 4798/9114/7942 10871/9075/7903 10870/9084/7912 4803/9115/7943
+f 4803/9115/7943 10870/9084/7912 13317/9086/7914 11114/9117/7945
+f 4796/9107/7935 4799/9116/7944 4804/9119/7947 4800/9108/7936
+f 4800/9108/7936 4804/9119/7947 10885/9120/7948 10886/9111/7939
+f 4799/9116/7944 11115/9118/7946 11116/9121/7949 4804/9119/7947
+f 4804/9119/7947 11116/9121/7949 13318/9122/7950 10885/9120/7948
+f 4805/9123/7951 4809/9124/7952 4810/9125/7953 4806/9126/7954
+f 4806/9126/7954 4810/9125/7953 10564/9127/7955 10565/9128/7956
+f 4809/9124/7952 10874/9096/7924 10873/9095/7923 4810/9125/7953
+f 4810/9125/7953 10873/9095/7923 13226/9098/7926 10564/9127/7955
+f 4805/9123/7951 4806/9126/7954 4811/9129/7957 4807/9130/7958
+f 4807/9130/7958 4811/9129/7957 10888/9131/7959 10889/9132/7960
+f 4806/9126/7954 10565/9128/7956 10566/9133/7961 4811/9129/7957
+f 4811/9129/7957 10566/9133/7961 13228/9134/7962 10888/9131/7959
+f 4805/9123/7951 4807/9130/7958 4812/9135/7963 4808/9136/7964
+f 4808/9136/7964 4812/9135/7963 11020/9137/7965 11021/9138/7966
+f 4807/9130/7958 10889/9132/7960 10890/9139/7967 4812/9135/7963
+f 4812/9135/7963 10890/9139/7967 13301/9140/7968 11020/9137/7965
+f 4805/9123/7951 4808/9136/7964 4813/9141/7969 4809/9124/7952
+f 4809/9124/7952 4813/9141/7969 10875/9103/7931 10874/9096/7924
+f 4808/9136/7964 11021/9138/7966 11022/9142/7970 4813/9141/7969
+f 4813/9141/7969 11022/9142/7970 13302/9104/7932 10875/9103/7931
+f 4814/9143/7971 4818/9144/7972 4819/9145/7973 4815/9146/7974
+f 4815/9146/7974 4819/9145/7973 10755/8123/7259 10754/8120/7256
+f 4818/9144/7972 10901/9147/7975 10902/9148/7976 4819/9145/7973
+f 4819/9145/7973 10902/9148/7976 13263/8124/7260 10755/8123/7259
+f 4814/9143/7971 4815/9146/7974 4820/9149/7977 4816/9150/7978
+f 4816/9150/7978 4820/9149/7977 10887/9112/7940 10886/9111/7939
+f 4815/9146/7974 10754/8120/7256 10753/8119/7255 4820/9149/7977
+f 4820/9149/7977 10753/8119/7255 13262/8092/7232 10887/9112/7940
+f 4814/9143/7971 4816/9150/7978 4821/9151/7979 4817/9152/7980
+f 4817/9152/7980 4821/9151/7979 11120/9153/7981 11121/9154/7982
+f 4816/9150/7978 10886/9111/7939 10885/9120/7948 4821/9151/7979
+f 4821/9151/7979 10885/9120/7948 13318/9122/7950 11120/9153/7981
+f 4814/9143/7971 4817/9152/7980 4822/9155/7983 4818/9144/7972
+f 4818/9144/7972 4822/9155/7983 10900/9156/7984 10901/9147/7975
+f 4817/9152/7980 11121/9154/7982 11122/9157/7985 4822/9155/7983
+f 4822/9155/7983 11122/9157/7985 13319/9158/7986 10900/9156/7984
+f 4823/9159/7987 4827/9160/7988 4828/9161/7989 4824/9162/7990
+f 4824/9162/7990 4828/9161/7989 10576/9163/7991 10577/9164/7992
+f 4827/9160/7988 10889/9132/7960 10888/9131/7959 4828/9161/7989
+f 4828/9161/7989 10888/9131/7959 13228/9134/7962 10576/9163/7991
+f 4823/9159/7987 4824/9162/7990 4829/9165/7993 4825/9166/7994
+f 4825/9166/7994 4829/9165/7993 10903/9167/7995 10904/9168/7996
+f 4824/9162/7990 10577/9164/7992 10578/9169/7997 4829/9165/7993
+f 4829/9165/7993 10578/9169/7997 13230/9170/7998 10903/9167/7995
+f 4823/9159/7987 4825/9166/7994 4830/9171/7999 4826/9172/8000
+f 4826/9172/8000 4830/9171/7999 11014/9173/8001 11015/9174/8002
+f 4825/9166/7994 10904/9168/7996 10905/9175/8003 4830/9171/7999
+f 4830/9171/7999 10905/9175/8003 13300/9176/8004 11014/9173/8001
+f 4823/9159/7987 4826/9172/8000 4831/9177/8005 4827/9160/7988
+f 4827/9160/7988 4831/9177/8005 10890/9139/7967 10889/9132/7960
+f 4826/9172/8000 11015/9174/8002 11016/9178/8006 4831/9177/8005
+f 4831/9177/8005 11016/9178/8006 13301/9140/7968 10890/9139/7967
+f 4832/9179/8007 4836/9180/8008 4837/9181/8009 4833/9182/8010
+f 4833/9182/8010 4837/9181/8009 10758/8155/7287 10757/8152/7284
+f 4836/9180/8008 10916/9183/8011 10917/9184/8012 4837/9181/8009
+f 4837/9181/8009 10917/9184/8012 13264/8156/7288 10758/8155/7287
+f 4832/9179/8007 4833/9182/8010 4838/9185/8013 4834/9186/8014
+f 4834/9186/8014 4838/9185/8013 10902/9148/7976 10901/9147/7975
+f 4833/9182/8010 10757/8152/7284 10756/8151/7283 4838/9185/8013
+f 4838/9185/8013 10756/8151/7283 13263/8124/7260 10902/9148/7976
+f 4832/9179/8007 4834/9186/8014 4839/9187/8015 4835/9188/8016
+f 4835/9188/8016 4839/9187/8015 11126/9189/8017 11127/9190/8018
+f 4834/9186/8014 10901/9147/7975 10900/9156/7984 4839/9187/8015
+f 4839/9187/8015 10900/9156/7984 13319/9158/7986 11126/9189/8017
+f 4832/9179/8007 4835/9188/8016 4840/9191/8019 4836/9180/8008
+f 4836/9180/8008 4840/9191/8019 10915/9192/8020 10916/9183/8011
+f 4835/9188/8016 11127/9190/8018 11128/9193/8021 4840/9191/8019
+f 4840/9191/8019 11128/9193/8021 13320/9194/8022 10915/9192/8020
+f 4841/9195/8023 4845/9196/8024 4846/9197/8025 4842/9198/8026
+f 4842/9198/8026 4846/9197/8025 10588/9199/8027 10589/9200/8028
+f 4845/9196/8024 10904/9168/7996 10903/9167/7995 4846/9197/8025
+f 4846/9197/8025 10903/9167/7995 13230/9170/7998 10588/9199/8027
+f 4841/9195/8023 4842/9198/8026 4847/9201/8029 4843/9202/8030
+f 4843/9202/8030 4847/9201/8029 10918/9203/8031 10919/9204/8032
+f 4842/9198/8026 10589/9200/8028 10590/9205/8033 4847/9201/8029
+f 4847/9201/8029 10590/9205/8033 13232/9206/8034 10918/9203/8031
+f 4841/9195/8023 4843/9202/8030 4848/9207/8035 4844/9208/8036
+f 4844/9208/8036 4848/9207/8035 11008/9209/8037 11009/9210/8038
+f 4843/9202/8030 10919/9204/8032 10920/9211/8039 4848/9207/8035
+f 4848/9207/8035 10920/9211/8039 13299/9212/8040 11008/9209/8037
+f 4841/9195/8023 4844/9208/8036 4849/9213/8041 4845/9196/8024
+f 4845/9196/8024 4849/9213/8041 10905/9175/8003 10904/9168/7996
+f 4844/9208/8036 11009/9210/8038 11010/9214/8042 4849/9213/8041
+f 4849/9213/8041 11010/9214/8042 13300/9176/8004 10905/9175/8003
+f 4850/9215/8043 4854/9216/8044 4855/9217/8045 4851/9218/8046
+f 4851/9218/8046 4855/9217/8045 10761/8187/7315 10760/8184/7312
+f 4854/9216/8044 10931/9219/8047 10932/9220/8048 4855/9217/8045
+f 4855/9217/8045 10932/9220/8048 13265/8188/7316 10761/8187/7315
+f 4850/9215/8043 4851/9218/8046 4856/9221/8049 4852/9222/8050
+f 4852/9222/8050 4856/9221/8049 10917/9184/8012 10916/9183/8011
+f 4851/9218/8046 10760/8184/7312 10759/8183/7311 4856/9221/8049
+f 4856/9221/8049 10759/8183/7311 13264/8156/7288 10917/9184/8012
+f 4850/9215/8043 4852/9222/8050 4857/9223/8051 4853/9224/8052
+f 4853/9224/8052 4857/9223/8051 11132/9225/8053 11133/9226/8054
+f 4852/9222/8050 10916/9183/8011 10915/9192/8020 4857/9223/8051
+f 4857/9223/8051 10915/9192/8020 13320/9194/8022 11132/9225/8053
+f 4850/9215/8043 4853/9224/8052 4858/9227/8055 4854/9216/8044
+f 4854/9216/8044 4858/9227/8055 10930/9228/8056 10931/9219/8047
+f 4853/9224/8052 11133/9226/8054 11134/9229/8057 4858/9227/8055
+f 4858/9227/8055 11134/9229/8057 13321/9230/8058 10930/9228/8056
+f 4859/9231/8059 4863/9232/8060 4864/9233/8061 4860/9234/8062
+f 4860/9234/8062 4864/9233/8061 10600/9235/8063 10601/9236/8064
+f 4863/9232/8060 10919/9204/8032 10918/9203/8031 4864/9233/8061
+f 4864/9233/8061 10918/9203/8031 13232/9206/8034 10600/9235/8063
+f 4859/9231/8059 4860/9234/8062 4865/9237/8065 4861/9238/8066
+f 4861/9238/8066 4865/9237/8065 10933/9239/8067 10934/9240/8068
+f 4860/9234/8062 10601/9236/8064 10602/9241/8069 4865/9237/8065
+f 4865/9237/8065 10602/9241/8069 13234/9242/8070 10933/9239/8067
+f 4859/9231/8059 4861/9238/8066 4866/9243/8071 4862/9244/8072
+f 4862/9244/8072 4866/9243/8071 11002/9245/8073 11003/9246/8074
+f 4861/9238/8066 10934/9240/8068 10935/9247/8075 4866/9243/8071
+f 4866/9243/8071 10935/9247/8075 13298/9248/8076 11002/9245/8073
+f 4859/9231/8059 4862/9244/8072 4867/9249/8077 4863/9232/8060
+f 4863/9232/8060 4867/9249/8077 10920/9211/8039 10919/9204/8032
+f 4862/9244/8072 11003/9246/8074 11004/9250/8078 4867/9249/8077
+f 4867/9249/8077 11004/9250/8078 13299/9212/8040 10920/9211/8039
+f 4868/9251/8079 4872/9252/8080 4873/9253/8081 4869/9254/8082
+f 4869/9254/8082 4873/9253/8081 10764/8219/7343 10763/8216/7340
+f 4872/9252/8080 10946/9255/8083 10947/9256/8084 4873/9253/8081
+f 4873/9253/8081 10947/9256/8084 13266/8220/7344 10764/8219/7343
+f 4868/9251/8079 4869/9254/8082 4874/9257/8085 4870/9258/8086
+f 4870/9258/8086 4874/9257/8085 10932/9220/8048 10931/9219/8047
+f 4869/9254/8082 10763/8216/7340 10762/8215/7339 4874/9257/8085
+f 4874/9257/8085 10762/8215/7339 13265/8188/7316 10932/9220/8048
+f 4868/9251/8079 4870/9258/8086 4875/9259/8087 4871/9260/8088
+f 4871/9260/8088 4875/9259/8087 11138/9261/8089 11139/9262/8090
+f 4870/9258/8086 10931/9219/8047 10930/9228/8056 4875/9259/8087
+f 4875/9259/8087 10930/9228/8056 13321/9230/8058 11138/9261/8089
+f 4868/9251/8079 4871/9260/8088 4876/9263/8091 4872/9252/8080
+f 4872/9252/8080 4876/9263/8091 10945/9264/8092 10946/9255/8083
+f 4871/9260/8088 11139/9262/8090 11140/9265/8093 4876/9263/8091
+f 4876/9263/8091 11140/9265/8093 13322/9266/8094 10945/9264/8092
+f 4877/9267/8095 4881/9268/8096 4882/9269/8097 4878/9270/8098
+f 4878/9270/8098 4882/9269/8097 10612/9271/8099 10613/9272/8100
+f 4881/9268/8096 10934/9240/8068 10933/9239/8067 4882/9269/8097
+f 4882/9269/8097 10933/9239/8067 13234/9242/8070 10612/9271/8099
+f 4877/9267/8095 4878/9270/8098 4883/9273/8101 4879/9274/8102
+f 4879/9274/8102 4883/9273/8101 10948/9275/8103 10949/9276/8104
+f 4878/9270/8098 10613/9272/8100 10614/9277/8105 4883/9273/8101
+f 4883/9273/8101 10614/9277/8105 13236/9278/8106 10948/9275/8103
+f 4877/9267/8095 4879/9274/8102 4884/9279/8107 4880/9280/8108
+f 4880/9280/8108 4884/9279/8107 10996/9281/8109 10997/9282/8110
+f 4879/9274/8102 10949/9276/8104 10950/9283/8111 4884/9279/8107
+f 4884/9279/8107 10950/9283/8111 13297/9284/8112 10996/9281/8109
+f 4877/9267/8095 4880/9280/8108 4885/9285/8113 4881/9268/8096
+f 4881/9268/8096 4885/9285/8113 10935/9247/8075 10934/9240/8068
+f 4880/9280/8108 10997/9282/8110 10998/9286/8114 4885/9285/8113
+f 4885/9285/8113 10998/9286/8114 13298/9248/8076 10935/9247/8075
+f 4886/9287/8115 4890/9288/8116 4891/9289/8117 4887/9290/8118
+f 4887/9290/8118 4891/9289/8117 10767/8251/7371 10766/8248/7368
+f 4890/9288/8116 10961/9291/8119 10962/9292/8120 4891/9289/8117
+f 4891/9289/8117 10962/9292/8120 13267/8252/7372 10767/8251/7371
+f 4886/9287/8115 4887/9290/8118 4892/9293/8121 4888/9294/8122
+f 4888/9294/8122 4892/9293/8121 10947/9256/8084 10946/9255/8083
+f 4887/9290/8118 10766/8248/7368 10765/8247/7367 4892/9293/8121
+f 4892/9293/8121 10765/8247/7367 13266/8220/7344 10947/9256/8084
+f 4886/9287/8115 4888/9294/8122 4893/9295/8123 4889/9296/8124
+f 4889/9296/8124 4893/9295/8123 11144/9297/8125 11145/9298/8126
+f 4888/9294/8122 10946/9255/8083 10945/9264/8092 4893/9295/8123
+f 4893/9295/8123 10945/9264/8092 13322/9266/8094 11144/9297/8125
+f 4886/9287/8115 4889/9296/8124 4894/9299/8127 4890/9288/8116
+f 4890/9288/8116 4894/9299/8127 10960/9300/8128 10961/9291/8119
+f 4889/9296/8124 11145/9298/8126 11146/9301/8129 4894/9299/8127
+f 4894/9299/8127 11146/9301/8129 13323/9302/8130 10960/9300/8128
+f 4895/9303/8131 4899/9304/8132 4900/9305/8133 4896/9306/8134
+f 4896/9306/8134 4900/9305/8133 10624/9307/8135 10625/9308/8136
+f 4899/9304/8132 10949/9276/8104 10948/9275/8103 4900/9305/8133
+f 4900/9305/8133 10948/9275/8103 13236/9278/8106 10624/9307/8135
+f 4895/9303/8131 4896/9306/8134 4901/9309/8137 4897/9310/8138
+f 4897/9310/8138 4901/9309/8137 10963/9311/8139 10964/9312/8140
+f 4896/9306/8134 10625/9308/8136 10626/9313/8141 4901/9309/8137
+f 4901/9309/8137 10626/9313/8141 13238/9314/8142 10963/9311/8139
+f 4895/9303/8131 4897/9310/8138 4902/9315/8143 4898/9316/8144
+f 4898/9316/8144 4902/9315/8143 10990/9317/8145 10991/9318/8146
+f 4897/9310/8138 10964/9312/8140 10965/9319/8147 4902/9315/8143
+f 4902/9315/8143 10965/9319/8147 13296/9320/8148 10990/9317/8145
+f 4895/9303/8131 4898/9316/8144 4903/9321/8149 4899/9304/8132
+f 4899/9304/8132 4903/9321/8149 10950/9283/8111 10949/9276/8104
+f 4898/9316/8144 10991/9318/8146 10992/9322/8150 4903/9321/8149
+f 4903/9321/8149 10992/9322/8150 13297/9284/8112 10950/9283/8111
+f 4904/9323/8151 4908/9324/8152 4909/9325/8153 4905/9326/8154
+f 4905/9326/8154 4909/9325/8153 10770/8280/7396 10769/8278/7394
+f 4908/9324/8152 8800/3466/3052 8799/3465/3051 4909/9325/8153
+f 4909/9325/8153 8799/3465/3051 12899/2471/2332 10770/8280/7396
+f 4904/9323/8151 4905/9326/8154 4910/9327/8155 4906/9328/8156
+f 4906/9328/8156 4910/9327/8155 10962/9292/8120 10961/9291/8119
+f 4905/9326/8154 10769/8278/7394 10768/8277/7393 4910/9327/8155
+f 4910/9327/8155 10768/8277/7393 13267/8252/7372 10962/9292/8120
+f 4904/9323/8151 4906/9328/8156 4911/9329/8157 4907/9330/8158
+f 4907/9330/8158 4911/9329/8157 11147/9331/8159 11148/9332/8160
+f 4906/9328/8156 10961/9291/8119 10960/9300/8128 4911/9329/8157
+f 4911/9329/8157 10960/9300/8128 13323/9302/8130 11147/9331/8159
+f 4904/9323/8151 4907/9330/8158 4912/9333/8161 4908/9324/8152
+f 4908/9324/8152 4912/9333/8161 8801/3471/3057 8800/3466/3052
+f 4907/9330/8158 11148/9332/8160 11149/9334/8162 4912/9333/8161
+f 4912/9333/8161 11149/9334/8162 12954/3472/3058 8801/3471/3057
+f 4913/9335/8163 4917/9336/8164 4918/9337/8165 4914/9338/8166
+f 4914/9338/8166 4918/9337/8165 10633/9339/8167 10634/9340/8168
+f 4917/9336/8164 10964/9312/8140 10963/9311/8139 4918/9337/8165
+f 4918/9337/8165 10963/9311/8139 13238/9314/8142 10633/9339/8167
+f 4913/9335/8163 4914/9338/8166 4919/9341/8169 4915/9342/8170
+f 4915/9342/8170 4919/9341/8169 8804/3495/3081 8803/3490/3076
+f 4914/9338/8166 10634/9340/8168 10635/9343/8171 4919/9341/8169
+f 4919/9341/8169 10635/9343/8171 12870/3496/3082 8804/3495/3081
+f 4913/9335/8163 4915/9342/8170 4920/9344/8172 4916/9345/8173
+f 4916/9345/8173 4920/9344/8172 10984/9346/8174 10985/9347/8175
+f 4915/9342/8170 8803/3490/3076 8802/3489/3075 4920/9344/8172
+f 4920/9344/8172 8802/3489/3075 12928/3492/3078 10984/9346/8174
+f 4913/9335/8163 4916/9345/8173 4921/9348/8176 4917/9336/8164
+f 4917/9336/8164 4921/9348/8176 10965/9319/8147 10964/9312/8140
+f 4916/9345/8173 10985/9347/8175 10986/9349/8177 4921/9348/8176
+f 4921/9348/8176 10986/9349/8177 13296/9320/8148 10965/9319/8147
+f 4922/9350/8178 4926/9351/8179 4927/9352/8180 4923/9353/8181
+f 4923/9353/8181 4927/9352/8180 10986/9349/8177 10985/9347/8175
+f 4926/9351/8179 10982/9354/8182 10983/9355/8183 4927/9352/8180
+f 4927/9352/8180 10983/9355/8183 13296/9320/8148 10986/9349/8177
+f 4922/9350/8178 4923/9353/8181 4928/9356/8184 4924/9357/8185
+f 4924/9357/8185 4928/9356/8184 8816/3516/3102 8815/3512/3098
+f 4923/9353/8181 10985/9347/8175 10984/9346/8174 4928/9356/8184
+f 4928/9356/8184 10984/9346/8174 12928/3492/3078 8816/3516/3102
+f 4922/9350/8178 4924/9357/8185 4929/9358/8186 4925/9359/8187
+f 4925/9359/8187 4929/9358/8186 10978/9360/8188 10979/9361/8189
+f 4924/9357/8185 8815/3512/3098 8814/3511/3097 4929/9358/8186
+f 4929/9358/8186 8814/3511/3097 12927/3514/3100 10978/9360/8188
+f 4922/9350/8178 4925/9359/8187 4930/9362/8190 4926/9351/8179
+f 4926/9351/8179 4930/9362/8190 10981/9363/8191 10982/9354/8182
+f 4925/9359/8187 10979/9361/8189 10980/9364/8192 4930/9362/8190
+f 4930/9362/8190 10980/9364/8192 13295/9365/8193 10981/9363/8191
+f 4931/9366/8194 4935/9367/8195 4936/9368/8196 4932/9369/8197
+f 4932/9369/8197 4936/9368/8196 10992/9322/8150 10991/9318/8146
+f 4935/9367/8195 10988/9370/8198 10989/9371/8199 4936/9368/8196
+f 4936/9368/8196 10989/9371/8199 13297/9284/8112 10992/9322/8150
+f 4931/9366/8194 4932/9369/8197 4937/9372/8200 4933/9373/8201
+f 4933/9373/8201 4937/9372/8200 10983/9355/8183 10982/9354/8182
+f 4932/9369/8197 10991/9318/8146 10990/9317/8145 4937/9372/8200
+f 4937/9372/8200 10990/9317/8145 13296/9320/8148 10983/9355/8183
+f 4931/9366/8194 4933/9373/8201 4938/9374/8202 4934/9375/8203
+f 4934/9375/8203 4938/9374/8202 10972/9376/8204 10973/9377/8205
+f 4933/9373/8201 10982/9354/8182 10981/9363/8191 4938/9374/8202
+f 4938/9374/8202 10981/9363/8191 13295/9365/8193 10972/9376/8204
+f 4931/9366/8194 4934/9375/8203 4939/9378/8206 4935/9367/8195
+f 4935/9367/8195 4939/9378/8206 10987/9379/8207 10988/9370/8198
+f 4934/9375/8203 10973/9377/8205 10974/9380/8208 4939/9378/8206
+f 4939/9378/8206 10974/9380/8208 13293/9381/8209 10987/9379/8207
+f 4940/9382/8210 4944/9383/8211 4945/9384/8212 4941/9385/8213
+f 4941/9385/8213 4945/9384/8212 10998/9286/8114 10997/9282/8110
+f 4944/9383/8211 10994/9386/8214 10995/9387/8215 4945/9384/8212
+f 4945/9384/8212 10995/9387/8215 13298/9248/8076 10998/9286/8114
+f 4940/9382/8210 4941/9385/8213 4946/9388/8216 4942/9389/8217
+f 4942/9389/8217 4946/9388/8216 10989/9371/8199 10988/9370/8198
+f 4941/9385/8213 10997/9282/8110 10996/9281/8109 4946/9388/8216
+f 4946/9388/8216 10996/9281/8109 13297/9284/8112 10989/9371/8199
+f 4940/9382/8210 4942/9389/8217 4947/9390/8218 4943/9391/8219
+f 4943/9391/8219 4947/9390/8218 10957/9392/8220 10958/9393/8221
+f 4942/9389/8217 10988/9370/8198 10987/9379/8207 4947/9390/8218
+f 4947/9390/8218 10987/9379/8207 13293/9381/8209 10957/9392/8220
+f 4940/9382/8210 4943/9391/8219 4948/9394/8222 4944/9383/8211
+f 4944/9383/8211 4948/9394/8222 10993/9395/8223 10994/9386/8214
+f 4943/9391/8219 10958/9393/8221 10959/9396/8224 4948/9394/8222
+f 4948/9394/8222 10959/9396/8224 13291/9397/8225 10993/9395/8223
+f 4949/9398/8226 4953/9399/8227 4954/9400/8228 4950/9401/8229
+f 4950/9401/8229 4954/9400/8228 11004/9250/8078 11003/9246/8074
+f 4953/9399/8227 11000/9402/8230 11001/9403/8231 4954/9400/8228
+f 4954/9400/8228 11001/9403/8231 13299/9212/8040 11004/9250/8078
+f 4949/9398/8226 4950/9401/8229 4955/9404/8232 4951/9405/8233
+f 4951/9405/8233 4955/9404/8232 10995/9387/8215 10994/9386/8214
+f 4950/9401/8229 11003/9246/8074 11002/9245/8073 4955/9404/8232
+f 4955/9404/8232 11002/9245/8073 13298/9248/8076 10995/9387/8215
+f 4949/9398/8226 4951/9405/8233 4956/9406/8234 4952/9407/8235
+f 4952/9407/8235 4956/9406/8234 10942/9408/8236 10943/9409/8237
+f 4951/9405/8233 10994/9386/8214 10993/9395/8223 4956/9406/8234
+f 4956/9406/8234 10993/9395/8223 13291/9397/8225 10942/9408/8236
+f 4949/9398/8226 4952/9407/8235 4957/9410/8238 4953/9399/8227
+f 4953/9399/8227 4957/9410/8238 10999/9411/8239 11000/9402/8230
+f 4952/9407/8235 10943/9409/8237 10944/9412/8240 4957/9410/8238
+f 4957/9410/8238 10944/9412/8240 13289/9413/8241 10999/9411/8239
+f 4958/9414/8242 4962/9415/8243 4963/9416/8244 4959/9417/8245
+f 4959/9417/8245 4963/9416/8244 11010/9214/8042 11009/9210/8038
+f 4962/9415/8243 11006/9418/8246 11007/9419/8247 4963/9416/8244
+f 4963/9416/8244 11007/9419/8247 13300/9176/8004 11010/9214/8042
+f 4958/9414/8242 4959/9417/8245 4964/9420/8248 4960/9421/8249
+f 4960/9421/8249 4964/9420/8248 11001/9403/8231 11000/9402/8230
+f 4959/9417/8245 11009/9210/8038 11008/9209/8037 4964/9420/8248
+f 4964/9420/8248 11008/9209/8037 13299/9212/8040 11001/9403/8231
+f 4958/9414/8242 4960/9421/8249 4965/9422/8250 4961/9423/8251
+f 4961/9423/8251 4965/9422/8250 10927/9424/8252 10928/9425/8253
+f 4960/9421/8249 11000/9402/8230 10999/9411/8239 4965/9422/8250
+f 4965/9422/8250 10999/9411/8239 13289/9413/8241 10927/9424/8252
+f 4958/9414/8242 4961/9423/8251 4966/9426/8254 4962/9415/8243
+f 4962/9415/8243 4966/9426/8254 11005/9427/8255 11006/9418/8246
+f 4961/9423/8251 10928/9425/8253 10929/9428/8256 4966/9426/8254
+f 4966/9426/8254 10929/9428/8256 13287/9429/8257 11005/9427/8255
+f 4967/9430/8258 4971/9431/8259 4972/9432/8260 4968/9433/8261
+f 4968/9433/8261 4972/9432/8260 11016/9178/8006 11015/9174/8002
+f 4971/9431/8259 11012/9434/8262 11013/9435/8263 4972/9432/8260
+f 4972/9432/8260 11013/9435/8263 13301/9140/7968 11016/9178/8006
+f 4967/9430/8258 4968/9433/8261 4973/9436/8264 4969/9437/8265
+f 4969/9437/8265 4973/9436/8264 11007/9419/8247 11006/9418/8246
+f 4968/9433/8261 11015/9174/8002 11014/9173/8001 4973/9436/8264
+f 4973/9436/8264 11014/9173/8001 13300/9176/8004 11007/9419/8247
+f 4967/9430/8258 4969/9437/8265 4974/9438/8266 4970/9439/8267
+f 4970/9439/8267 4974/9438/8266 10912/9440/8268 10913/9441/8269
+f 4969/9437/8265 11006/9418/8246 11005/9427/8255 4974/9438/8266
+f 4974/9438/8266 11005/9427/8255 13287/9429/8257 10912/9440/8268
+f 4967/9430/8258 4970/9439/8267 4975/9442/8270 4971/9431/8259
+f 4971/9431/8259 4975/9442/8270 11011/9443/8271 11012/9434/8262
+f 4970/9439/8267 10913/9441/8269 10914/9444/8272 4975/9442/8270
+f 4975/9442/8270 10914/9444/8272 13285/9445/8273 11011/9443/8271
+f 4976/9446/8274 4980/9447/8275 4981/9448/8276 4977/9449/8277
+f 4977/9449/8277 4981/9448/8276 11022/9142/7970 11021/9138/7966
+f 4980/9447/8275 11018/9450/8278 11019/9451/8279 4981/9448/8276
+f 4981/9448/8276 11019/9451/8279 13302/9104/7932 11022/9142/7970
+f 4976/9446/8274 4977/9449/8277 4982/9452/8280 4978/9453/8281
+f 4978/9453/8281 4982/9452/8280 11013/9435/8263 11012/9434/8262
+f 4977/9449/8277 11021/9138/7966 11020/9137/7965 4982/9452/8280
+f 4982/9452/8280 11020/9137/7965 13301/9140/7968 11013/9435/8263
+f 4976/9446/8274 4978/9453/8281 4983/9454/8282 4979/9455/8283
+f 4979/9455/8283 4983/9454/8282 10897/9456/8284 10898/9457/8285
+f 4978/9453/8281 11012/9434/8262 11011/9443/8271 4983/9454/8282
+f 4983/9454/8282 11011/9443/8271 13285/9445/8273 10897/9456/8284
+f 4976/9446/8274 4979/9455/8283 4984/9458/8286 4980/9447/8275
+f 4980/9447/8275 4984/9458/8286 11017/9459/8287 11018/9450/8278
+f 4979/9455/8283 10898/9457/8285 10899/9460/8288 4984/9458/8286
+f 4984/9458/8286 10899/9460/8288 13283/9461/8289 11017/9459/8287
+f 4985/9462/8290 4989/9463/8291 4990/9464/8292 4986/9465/8293
+f 4986/9465/8293 4990/9464/8292 11028/9106/7934 11027/9102/7930
+f 4989/9463/8291 11024/9466/8294 11025/9467/8295 4990/9464/8292
+f 4990/9464/8292 11025/9467/8295 13303/9068/7896 11028/9106/7934
+f 4985/9462/8290 4986/9465/8293 4991/9468/8296 4987/9469/8297
+f 4987/9469/8297 4991/9468/8296 11019/9451/8279 11018/9450/8278
+f 4986/9465/8293 11027/9102/7930 11026/9101/7929 4991/9468/8296
+f 4991/9468/8296 11026/9101/7929 13302/9104/7932 11019/9451/8279
+f 4985/9462/8290 4987/9469/8297 4992/9470/8298 4988/9471/8299
+f 4988/9471/8299 4992/9470/8298 10882/9472/8300 10883/9473/8301
+f 4987/9469/8297 11018/9450/8278 11017/9459/8287 4992/9470/8298
+f 4992/9470/8298 11017/9459/8287 13283/9461/8289 10882/9472/8300
+f 4985/9462/8290 4988/9471/8299 4993/9474/8302 4989/9463/8291
+f 4989/9463/8291 4993/9474/8302 11023/9475/8303 11024/9466/8294
+f 4988/9471/8299 10883/9473/8301 10884/9476/8304 4993/9474/8302
+f 4993/9474/8302 10884/9476/8304 13281/9477/8305 11023/9475/8303
+f 4994/9478/8306 4998/9479/8307 4999/9480/8308 4995/9481/8309
+f 4995/9481/8309 4999/9480/8308 11034/9070/7898 11033/9066/7894
+f 4998/9479/8307 11030/9482/8310 11031/9483/8311 4999/9480/8308
+f 4999/9480/8308 11031/9483/8311 13304/9032/7860 11034/9070/7898
+f 4994/9478/8306 4995/9481/8309 5000/9484/8312 4996/9485/8313
+f 4996/9485/8313 5000/9484/8312 11025/9467/8295 11024/9466/8294
+f 4995/9481/8309 11033/9066/7894 11032/9065/7893 5000/9484/8312
+f 5000/9484/8312 11032/9065/7893 13303/9068/7896 11025/9467/8295
+f 4994/9478/8306 4996/9485/8313 5001/9486/8314 4997/9487/8315
+f 4997/9487/8315 5001/9486/8314 10867/9488/8316 10868/9489/8317
+f 4996/9485/8313 11024/9466/8294 11023/9475/8303 5001/9486/8314
+f 5001/9486/8314 11023/9475/8303 13281/9477/8305 10867/9488/8316
+f 4994/9478/8306 4997/9487/8315 5002/9490/8318 4998/9479/8307
+f 4998/9479/8307 5002/9490/8318 11029/9491/8319 11030/9482/8310
+f 4997/9487/8315 10868/9489/8317 10869/9492/8320 5002/9490/8318
+f 5002/9490/8318 10869/9492/8320 13279/9493/8321 11029/9491/8319
+f 5003/9494/8322 5007/9495/8323 5008/9496/8324 5004/9497/8325
+f 5004/9497/8325 5008/9496/8324 11040/9034/7862 11039/9030/7858
+f 5007/9495/8323 11036/9498/8326 11037/9499/8327 5008/9496/8324
+f 5008/9496/8324 11037/9499/8327 13305/8996/7824 11040/9034/7862
+f 5003/9494/8322 5004/9497/8325 5009/9500/8328 5005/9501/8329
+f 5005/9501/8329 5009/9500/8328 11031/9483/8311 11030/9482/8310
+f 5004/9497/8325 11039/9030/7858 11038/9029/7857 5009/9500/8328
+f 5009/9500/8328 11038/9029/7857 13304/9032/7860 11031/9483/8311
+f 5003/9494/8322 5005/9501/8329 5010/9502/8330 5006/9503/8331
+f 5006/9503/8331 5010/9502/8330 10852/9504/8332 10853/9505/8333
+f 5005/9501/8329 11030/9482/8310 11029/9491/8319 5010/9502/8330
+f 5010/9502/8330 11029/9491/8319 13279/9493/8321 10852/9504/8332
+f 5003/9494/8322 5006/9503/8331 5011/9506/8334 5007/9495/8323
+f 5007/9495/8323 5011/9506/8334 11035/9507/8335 11036/9498/8326
+f 5006/9503/8331 10853/9505/8333 10854/9508/8336 5011/9506/8334
+f 5011/9506/8334 10854/9508/8336 13277/9509/8337 11035/9507/8335
+f 5012/9510/8338 5016/9511/8339 5017/9512/8340 5013/9513/8341
+f 5013/9513/8341 5017/9512/8340 11046/8998/7826 11045/8994/7822
+f 5016/9511/8339 11042/9514/8342 11043/9515/8343 5017/9512/8340
+f 5017/9512/8340 11043/9515/8343 13306/8960/7788 11046/8998/7826
+f 5012/9510/8338 5013/9513/8341 5018/9516/8344 5014/9517/8345
+f 5014/9517/8345 5018/9516/8344 11037/9499/8327 11036/9498/8326
+f 5013/9513/8341 11045/8994/7822 11044/8993/7821 5018/9516/8344
+f 5018/9516/8344 11044/8993/7821 13305/8996/7824 11037/9499/8327
+f 5012/9510/8338 5014/9517/8345 5019/9518/8346 5015/9519/8347
+f 5015/9519/8347 5019/9518/8346 10837/9520/8348 10838/9521/8349
+f 5014/9517/8345 11036/9498/8326 11035/9507/8335 5019/9518/8346
+f 5019/9518/8346 11035/9507/8335 13277/9509/8337 10837/9520/8348
+f 5012/9510/8338 5015/9519/8347 5020/9522/8350 5016/9511/8339
+f 5016/9511/8339 5020/9522/8350 11041/9523/8351 11042/9514/8342
+f 5015/9519/8347 10838/9521/8349 10839/9524/8352 5020/9522/8350
+f 5020/9522/8350 10839/9524/8352 13275/9525/8353 11041/9523/8351
+f 5021/9526/8354 5025/9527/8355 5026/9528/8356 5022/9529/8357
+f 5022/9529/8357 5026/9528/8356 11052/8962/7790 11051/8958/7786
+f 5025/9527/8355 11048/9530/8358 11049/9531/8359 5026/9528/8356
+f 5026/9528/8356 11049/9531/8359 13307/8922/7750 11052/8962/7790
+f 5021/9526/8354 5022/9529/8357 5027/9532/8360 5023/9533/8361
+f 5023/9533/8361 5027/9532/8360 11043/9515/8343 11042/9514/8342
+f 5022/9529/8357 11051/8958/7786 11050/8957/7785 5027/9532/8360
+f 5027/9532/8360 11050/8957/7785 13306/8960/7788 11043/9515/8343
+f 5021/9526/8354 5023/9533/8361 5028/9534/8362 5024/9535/8363
+f 5024/9535/8363 5028/9534/8362 10822/9536/8364 10823/9537/8365
+f 5023/9533/8361 11042/9514/8342 11041/9523/8351 5028/9534/8362
+f 5028/9534/8362 11041/9523/8351 13275/9525/8353 10822/9536/8364
+f 5021/9526/8354 5024/9535/8363 5029/9538/8366 5025/9527/8355
+f 5025/9527/8355 5029/9538/8366 11047/9539/8367 11048/9530/8358
+f 5024/9535/8363 10823/9537/8365 10824/9540/8368 5029/9538/8366
+f 5029/9538/8366 10824/9540/8368 13273/9541/8369 11047/9539/8367
+f 5030/9542/8370 5034/9543/8371 5035/9544/8372 5031/9545/8373
+f 5031/9545/8373 5035/9544/8372 11058/8925/7753 11057/8920/7748
+f 5034/9543/8371 11054/9546/8374 11055/9547/8375 5035/9544/8372
+f 5035/9544/8372 11055/9547/8375 13308/8926/7754 11058/8925/7753
+f 5030/9542/8370 5031/9545/8373 5036/9548/8376 5032/9549/8377
+f 5032/9549/8377 5036/9548/8376 11049/9531/8359 11048/9530/8358
+f 5031/9545/8373 11057/8920/7748 11056/8919/7747 5036/9548/8376
+f 5036/9548/8376 11056/8919/7747 13307/8922/7750 11049/9531/8359
+f 5030/9542/8370 5032/9549/8377 5037/9550/8378 5033/9551/8379
+f 5033/9551/8379 5037/9550/8378 10807/9552/8380 10808/9553/8381
+f 5032/9549/8377 11048/9530/8358 11047/9539/8367 5037/9550/8378
+f 5037/9550/8378 11047/9539/8367 13273/9541/8369 10807/9552/8380
+f 5030/9542/8370 5033/9551/8379 5038/9554/8382 5034/9543/8371
+f 5034/9543/8371 5038/9554/8382 11053/9555/8383 11054/9546/8374
+f 5033/9551/8379 10808/9553/8381 10809/9556/8384 5038/9554/8382
+f 5038/9554/8382 10809/9556/8384 13269/9557/8385 11053/9555/8383
+f 5039/9558/8386 5043/9559/8387 5044/9560/8388 5040/9561/8389
+f 5039/9558/8386 5040/9561/8389 5045/9562/8390 5041/9563/8391
+f 5041/9563/8391 5045/9562/8390 11197/9564/8392 11198/9565/8393
+f 5040/9561/8389 11190/8879/7707 11189/8878/7706 5045/9562/8390
+f 5045/9562/8390 11189/8878/7706 13331/8881/7709 11197/9564/8392
+f 5039/9558/8386 5041/9563/8391 5046/9566/8394 5042/9567/8395
+f 5042/9567/8395 5046/9566/8394 10792/9568/8396 10793/9569/8397
+f 5041/9563/8391 11198/9565/8393 11199/9570/8398 5046/9566/8394
+f 5046/9566/8394 11199/9570/8398 13332/9571/8399 10792/9568/8396
+f 5039/9558/8386 5042/9567/8395 5047/9572/8400 5043/9559/8387
+f 5042/9567/8395 10793/9569/8397 10794/9573/8401 5047/9572/8400
+f 5047/9572/8400 10794/9573/8401 13271/9574/8402 11059/9575/8403
+f 5048/9576/8404 5052/9577/8405 5053/9578/8406 5049/9579/8407
+f 5049/9579/8407 5053/9578/8406 11259/8864/7693 11258/8859/7690
+f 5052/9577/8405 11064/9580/8408 11065/9581/8409 5053/9578/8406
+f 5053/9578/8406 11065/9581/8409 13310/8865/7674 11259/8864/7693
+f 5048/9576/8404 5049/9579/8407 5054/9582/8410 5050/9583/8411
+f 5050/9583/8411 5054/9582/8410 11266/9584/8412 11267/9585/8413
+f 5049/9579/8407 11258/8859/7690 11257/8858/7689 5054/9582/8410
+f 5054/9582/8410 11257/8858/7689 13343/8861/6108 11266/9584/8412
+f 5048/9576/8404 5050/9583/8411 5055/9586/8414 5051/9587/8415
+f 5051/9587/8415 5055/9586/8414 10791/9588/7445 10790/9589/7440
+f 5050/9583/8411 11267/9585/8413 11268/9590/8416 5055/9586/8414
+f 5055/9586/8414 11268/9590/8416 13344/9591/7446 10791/9588/7445
+f 5048/9576/8404 5051/9587/8415 5056/9592/8417 5052/9577/8405
+f 5052/9577/8405 5056/9592/8417 11063/9593/8418 11064/9580/8408
+f 5051/9587/8415 10790/9589/7440 10789/9594/7439 5056/9592/8417
+f 5056/9592/8417 10789/9594/7439 13270/9595/7442 11063/9593/8418
+f 5057/9596/8419 5061/9597/8420 5062/9598/8421 5058/9599/8422
+f 5058/9599/8422 5062/9598/8421 11074/8844/7677 11073/8839/7672
+f 5061/9597/8420 11210/9600/8423 11211/9601/8424 5062/9598/8421
+f 5062/9598/8421 11211/9601/8424 13334/8845/7678 11074/8844/7677
+f 5057/9596/8419 5058/9599/8422 5063/9602/8425 5059/9603/8426
+f 5059/9603/8426 5063/9602/8425 11065/9604/8409 11064/9605/8408
+f 5058/9599/8422 11073/8839/7672 11072/8838/7671 5063/9602/8425
+f 5063/9602/8425 11072/8838/7671 13310/8841/7674 11065/9604/8409
+f 5057/9596/8419 5059/9603/8426 5064/9606/8427 5060/9607/8428
+f 5060/9607/8428 5064/9606/8427 10785/8560/7441 10784/8553/7434
+f 5059/9603/8426 11064/9605/8408 11063/9608/8418 5064/9606/8427
+f 5064/9606/8427 11063/9608/8418 13270/8561/7442 10785/8560/7441
+f 5057/9596/8419 5060/9607/8428 5065/9609/8429 5061/9597/8420
+f 5061/9597/8420 5065/9609/8429 11209/9610/8430 11210/9600/8423
+f 5060/9607/8428 10784/8553/7434 10783/8552/7433 5065/9609/8429
+f 5065/9609/8429 10783/8552/7433 13333/8555/7436 11209/9610/8430
+f 5066/9611/8431 5070/9612/8432 5071/9613/8433 5067/9614/8434
+f 5067/9614/8434 5071/9613/8433 11080/8900/7728 11079/8895/7723
+f 5070/9612/8432 11076/9615/8435 11077/9616/8436 5071/9613/8433
+f 5071/9613/8433 11077/9616/8436 13312/8901/7729 11080/8900/7728
+f 5066/9611/8431 5067/9614/8434 5072/9617/8437 5068/9618/8438
+f 5068/9618/8438 5072/9617/8437 11069/9619/8439 11070/9620/8440
+f 5067/9614/8434 11079/8895/7723 11078/8894/7722 5072/9617/8437
+f 5072/9617/8437 11078/8894/7722 13311/8897/7725 11069/9619/8439
+f 5066/9611/8431 5068/9618/8438 5073/9621/8441 5069/9622/8442
+f 5069/9622/8442 5073/9621/8441 10806/8585/7465 10805/8578/7458
+f 5068/9618/8438 11070/9620/8440 11071/9623/8443 5073/9621/8441
+f 5073/9621/8441 11071/9623/8443 13268/8586/7466 10806/8585/7465
+f 5066/9611/8431 5069/9622/8442 5074/9624/8444 5070/9612/8432
+f 5070/9612/8432 5074/9624/8444 11075/9625/8445 11076/9615/8435
+f 5069/9622/8442 10805/8578/7458 10804/8577/7457 5074/9624/8444
+f 5074/9624/8444 10804/8577/7457 13272/8580/7460 11075/9625/8445
+f 5075/9626/8446 5079/9627/8447 5080/9628/8448 5076/9629/8449
+f 5076/9629/8449 5080/9628/8448 11086/8941/7769 11085/8938/7766
+f 5079/9627/8447 11082/9630/8450 11083/9631/8451 5080/9628/8448
+f 5080/9628/8448 11083/9631/8451 13313/8942/7770 11086/8941/7769
+f 5075/9626/8446 5076/9629/8449 5081/9632/8452 5077/9633/8453
+f 5077/9633/8453 5081/9632/8452 11077/9616/8436 11076/9615/8435
+f 5076/9629/8449 11085/8938/7766 11084/8937/7765 5081/9632/8452
+f 5081/9632/8452 11084/8937/7765 13312/8901/7729 11077/9616/8436
+f 5075/9626/8446 5077/9633/8453 5082/9634/8454 5078/9635/8455
+f 5078/9635/8455 5082/9634/8454 10821/8608/7485 10820/8603/7480
+f 5077/9633/8453 11076/9615/8435 11075/9625/8445 5082/9634/8454
+f 5082/9634/8454 11075/9625/8445 13272/8580/7460 10821/8608/7485
+f 5075/9626/8446 5078/9635/8455 5083/9636/8456 5079/9627/8447
+f 5079/9627/8447 5083/9636/8456 11081/9637/8457 11082/9630/8450
+f 5078/9635/8455 10820/8603/7480 10819/8602/7479 5083/9636/8456
+f 5083/9636/8456 10819/8602/7479 13274/8605/7482 11081/9637/8457
+f 5084/9638/8458 5088/9639/8459 5089/9640/8460 5085/9641/8461
+f 5085/9641/8461 5089/9640/8460 11092/8977/7805 11091/8974/7802
+f 5088/9639/8459 11088/9642/8462 11089/9643/8463 5089/9640/8460
+f 5089/9640/8460 11089/9643/8463 13314/8978/7806 11092/8977/7805
+f 5084/9638/8458 5085/9641/8461 5090/9644/8464 5086/9645/8465
+f 5086/9645/8465 5090/9644/8464 11083/9631/8451 11082/9630/8450
+f 5085/9641/8461 11091/8974/7802 11090/8973/7801 5090/9644/8464
+f 5090/9644/8464 11090/8973/7801 13313/8942/7770 11083/9631/8451
+f 5084/9638/8458 5086/9645/8465 5091/9646/8466 5087/9647/8467
+f 5087/9647/8467 5091/9646/8466 10836/8628/7501 10835/8623/7496
+f 5086/9645/8465 11082/9630/8450 11081/9637/8457 5091/9646/8466
+f 5091/9646/8466 11081/9637/8457 13274/8605/7482 10836/8628/7501
+f 5084/9638/8458 5087/9647/8467 5092/9648/8468 5088/9639/8459
+f 5088/9639/8459 5092/9648/8468 11087/9649/8469 11088/9642/8462
+f 5087/9647/8467 10835/8623/7496 10834/8622/7495 5092/9648/8468
+f 5092/9648/8468 10834/8622/7495 13276/8625/7498 11087/9649/8469
+f 5093/9650/8470 5097/9651/8471 5098/9652/8472 5094/9653/8473
+f 5094/9653/8473 5098/9652/8472 11098/9013/7841 11097/9010/7838
+f 5097/9651/8471 11094/9654/8474 11095/9655/8475 5098/9652/8472
+f 5098/9652/8472 11095/9655/8475 13315/9014/7842 11098/9013/7841
+f 5093/9650/8470 5094/9653/8473 5099/9656/8476 5095/9657/8477
+f 5095/9657/8477 5099/9656/8476 11089/9643/8463 11088/9642/8462
+f 5094/9653/8473 11097/9010/7838 11096/9009/7837 5099/9656/8476
+f 5099/9656/8476 11096/9009/7837 13314/8978/7806 11089/9643/8463
+f 5093/9650/8470 5095/9657/8477 5100/9658/8478 5096/9659/8479
+f 5096/9659/8479 5100/9658/8478 10851/8648/7517 10850/8643/7512
+f 5095/9657/8477 11088/9642/8462 11087/9649/8469 5100/9658/8478
+f 5100/9658/8478 11087/9649/8469 13276/8625/7498 10851/8648/7517
+f 5093/9650/8470 5096/9659/8479 5101/9660/8480 5097/9651/8471
+f 5097/9651/8471 5101/9660/8480 11093/9661/8481 11094/9654/8474
+f 5096/9659/8479 10850/8643/7512 10849/8642/7511 5101/9660/8480
+f 5101/9660/8480 10849/8642/7511 13278/8645/7514 11093/9661/8481
+f 5102/9662/8482 5106/9663/8483 5107/9664/8484 5103/9665/8485
+f 5103/9665/8485 5107/9664/8484 11104/9049/7877 11103/9046/7874
+f 5106/9663/8483 11100/9666/8486 11101/9667/8487 5107/9664/8484
+f 5107/9664/8484 11101/9667/8487 13316/9050/7878 11104/9049/7877
+f 5102/9662/8482 5103/9665/8485 5108/9668/8488 5104/9669/8489
+f 5104/9669/8489 5108/9668/8488 11095/9655/8475 11094/9654/8474
+f 5103/9665/8485 11103/9046/7874 11102/9045/7873 5108/9668/8488
+f 5108/9668/8488 11102/9045/7873 13315/9014/7842 11095/9655/8475
+f 5102/9662/8482 5104/9669/8489 5109/9670/8490 5105/9671/8491
+f 5105/9671/8491 5109/9670/8490 10866/8668/7533 10865/8663/7528
+f 5104/9669/8489 11094/9654/8474 11093/9661/8481 5109/9670/8490
+f 5109/9670/8490 11093/9661/8481 13278/8645/7514 10866/8668/7533
+f 5102/9662/8482 5105/9671/8491 5110/9672/8492 5106/9663/8483
+f 5106/9663/8483 5110/9672/8492 11099/9673/8493 11100/9666/8486
+f 5105/9671/8491 10865/8663/7528 10864/8662/7527 5110/9672/8492
+f 5110/9672/8492 10864/8662/7527 13280/8665/7530 11099/9673/8493
+f 5111/9674/8494 5115/9675/8495 5116/9676/8496 5112/9677/8497
+f 5112/9677/8497 5116/9676/8496 11110/9085/7913 11109/9082/7910
+f 5115/9675/8495 11106/9678/8498 11107/9679/8499 5116/9676/8496
+f 5116/9676/8496 11107/9679/8499 13317/9086/7914 11110/9085/7913
+f 5111/9674/8494 5112/9677/8497 5117/9680/8500 5113/9681/8501
+f 5113/9681/8501 5117/9680/8500 11101/9667/8487 11100/9666/8486
+f 5112/9677/8497 11109/9082/7910 11108/9081/7909 5117/9680/8500
+f 5117/9680/8500 11108/9081/7909 13316/9050/7878 11101/9667/8487
+f 5111/9674/8494 5113/9681/8501 5118/9682/8502 5114/9683/8503
+f 5114/9683/8503 5118/9682/8502 10881/8688/7549 10880/8683/7544
+f 5113/9681/8501 11100/9666/8486 11099/9673/8493 5118/9682/8502
+f 5118/9682/8502 11099/9673/8493 13280/8665/7530 10881/8688/7549
+f 5111/9674/8494 5114/9683/8503 5119/9684/8504 5115/9675/8495
+f 5115/9675/8495 5119/9684/8504 11105/9685/8505 11106/9678/8498
+f 5114/9683/8503 10880/8683/7544 10879/8682/7543 5119/9684/8504
+f 5119/9684/8504 10879/8682/7543 13282/8685/7546 11105/9685/8505
+f 5120/9686/8506 5124/9687/8507 5125/9688/8508 5121/9689/8509
+f 5121/9689/8509 5125/9688/8508 11116/9121/7949 11115/9118/7946
+f 5124/9687/8507 11112/9690/8510 11113/9691/8511 5125/9688/8508
+f 5125/9688/8508 11113/9691/8511 13318/9122/7950 11116/9121/7949
+f 5120/9686/8506 5121/9689/8509 5126/9692/8512 5122/9693/8513
+f 5122/9693/8513 5126/9692/8512 11107/9679/8499 11106/9678/8498
+f 5121/9689/8509 11115/9118/7946 11114/9117/7945 5126/9692/8512
+f 5126/9692/8512 11114/9117/7945 13317/9086/7914 11107/9679/8499
+f 5120/9686/8506 5122/9693/8513 5127/9694/8514 5123/9695/8515
+f 5123/9695/8515 5127/9694/8514 10896/8708/7565 10895/8703/7560
+f 5122/9693/8513 11106/9678/8498 11105/9685/8505 5127/9694/8514
+f 5127/9694/8514 11105/9685/8505 13282/8685/7546 10896/8708/7565
+f 5120/9686/8506 5123/9695/8515 5128/9696/8516 5124/9687/8507
+f 5124/9687/8507 5128/9696/8516 11111/9697/8517 11112/9690/8510
+f 5123/9695/8515 10895/8703/7560 10894/8702/7559 5128/9696/8516
+f 5128/9696/8516 10894/8702/7559 13284/8705/7562 11111/9697/8517
+f 5129/9698/8518 5133/9699/8519 5134/9700/8520 5130/9701/8521
+f 5130/9701/8521 5134/9700/8520 11122/9157/7985 11121/9154/7982
+f 5133/9699/8519 11118/9702/8522 11119/9703/8523 5134/9700/8520
+f 5134/9700/8520 11119/9703/8523 13319/9158/7986 11122/9157/7985
+f 5129/9698/8518 5130/9701/8521 5135/9704/8524 5131/9705/8525
+f 5131/9705/8525 5135/9704/8524 11113/9691/8511 11112/9690/8510
+f 5130/9701/8521 11121/9154/7982 11120/9153/7981 5135/9704/8524
+f 5135/9704/8524 11120/9153/7981 13318/9122/7950 11113/9691/8511
+f 5129/9698/8518 5131/9705/8525 5136/9706/8526 5132/9707/8527
+f 5132/9707/8527 5136/9706/8526 10911/8728/7581 10910/8723/7576
+f 5131/9705/8525 11112/9690/8510 11111/9697/8517 5136/9706/8526
+f 5136/9706/8526 11111/9697/8517 13284/8705/7562 10911/8728/7581
+f 5129/9698/8518 5132/9707/8527 5137/9708/8528 5133/9699/8519
+f 5133/9699/8519 5137/9708/8528 11117/9709/8529 11118/9702/8522
+f 5132/9707/8527 10910/8723/7576 10909/8722/7575 5137/9708/8528
+f 5137/9708/8528 10909/8722/7575 13286/8725/7578 11117/9709/8529
+f 5138/9710/8530 5142/9711/8531 5143/9712/8532 5139/9713/8533
+f 5139/9713/8533 5143/9712/8532 11128/9193/8021 11127/9190/8018
+f 5142/9711/8531 11124/9714/8534 11125/9715/8535 5143/9712/8532
+f 5143/9712/8532 11125/9715/8535 13320/9194/8022 11128/9193/8021
+f 5138/9710/8530 5139/9713/8533 5144/9716/8536 5140/9717/8537
+f 5140/9717/8537 5144/9716/8536 11119/9703/8523 11118/9702/8522
+f 5139/9713/8533 11127/9190/8018 11126/9189/8017 5144/9716/8536
+f 5144/9716/8536 11126/9189/8017 13319/9158/7986 11119/9703/8523
+f 5138/9710/8530 5140/9717/8537 5145/9718/8538 5141/9719/8539
+f 5141/9719/8539 5145/9718/8538 10926/8748/7597 10925/8743/7592
+f 5140/9717/8537 11118/9702/8522 11117/9709/8529 5145/9718/8538
+f 5145/9718/8538 11117/9709/8529 13286/8725/7578 10926/8748/7597
+f 5138/9710/8530 5141/9719/8539 5146/9720/8540 5142/9711/8531
+f 5142/9711/8531 5146/9720/8540 11123/9721/8541 11124/9714/8534
+f 5141/9719/8539 10925/8743/7592 10924/8742/7591 5146/9720/8540
+f 5146/9720/8540 10924/8742/7591 13288/8745/7594 11123/9721/8541
+f 5147/9722/8542 5151/9723/8543 5152/9724/8544 5148/9725/8545
+f 5148/9725/8545 5152/9724/8544 11134/9229/8057 11133/9226/8054
+f 5151/9723/8543 11130/9726/8546 11131/9727/8547 5152/9724/8544
+f 5152/9724/8544 11131/9727/8547 13321/9230/8058 11134/9229/8057
+f 5147/9722/8542 5148/9725/8545 5153/9728/8548 5149/9729/8549
+f 5149/9729/8549 5153/9728/8548 11125/9715/8535 11124/9714/8534
+f 5148/9725/8545 11133/9226/8054 11132/9225/8053 5153/9728/8548
+f 5153/9728/8548 11132/9225/8053 13320/9194/8022 11125/9715/8535
+f 5147/9722/8542 5149/9729/8549 5154/9730/8550 5150/9731/8551
+f 5150/9731/8551 5154/9730/8550 10941/8768/7613 10940/8763/7608
+f 5149/9729/8549 11124/9714/8534 11123/9721/8541 5154/9730/8550
+f 5154/9730/8550 11123/9721/8541 13288/8745/7594 10941/8768/7613
+f 5147/9722/8542 5150/9731/8551 5155/9732/8552 5151/9723/8543
+f 5151/9723/8543 5155/9732/8552 11129/9733/8553 11130/9726/8546
+f 5150/9731/8551 10940/8763/7608 10939/8762/7607 5155/9732/8552
+f 5155/9732/8552 10939/8762/7607 13290/8765/7610 11129/9733/8553
+f 5156/9734/8554 5160/9735/8555 5161/9736/8556 5157/9737/8557
+f 5157/9737/8557 5161/9736/8556 11140/9265/8093 11139/9262/8090
+f 5160/9735/8555 11136/9738/8558 11137/9739/8559 5161/9736/8556
+f 5161/9736/8556 11137/9739/8559 13322/9266/8094 11140/9265/8093
+f 5156/9734/8554 5157/9737/8557 5162/9740/8560 5158/9741/8561
+f 5158/9741/8561 5162/9740/8560 11131/9727/8547 11130/9726/8546
+f 5157/9737/8557 11139/9262/8090 11138/9261/8089 5162/9740/8560
+f 5162/9740/8560 11138/9261/8089 13321/9230/8058 11131/9727/8547
+f 5156/9734/8554 5158/9741/8561 5163/9742/8562 5159/9743/8563
+f 5159/9743/8563 5163/9742/8562 10956/8788/7629 10955/8783/7624
+f 5158/9741/8561 11130/9726/8546 11129/9733/8553 5163/9742/8562
+f 5163/9742/8562 11129/9733/8553 13290/8765/7610 10956/8788/7629
+f 5156/9734/8554 5159/9743/8563 5164/9744/8564 5160/9735/8555
+f 5160/9735/8555 5164/9744/8564 11135/9745/8565 11136/9738/8558
+f 5159/9743/8563 10955/8783/7624 10954/8782/7623 5164/9744/8564
+f 5164/9744/8564 10954/8782/7623 13292/8785/7626 11135/9745/8565
+f 5165/9746/8566 5169/9747/8567 5170/9748/8568 5166/9749/8569
+f 5166/9749/8569 5170/9748/8568 11146/9301/8129 11145/9298/8126
+f 5169/9747/8567 11142/9750/8570 11143/9751/8571 5170/9748/8568
+f 5170/9748/8568 11143/9751/8571 13323/9302/8130 11146/9301/8129
+f 5165/9746/8566 5166/9749/8569 5171/9752/8572 5167/9753/8573
+f 5167/9753/8573 5171/9752/8572 11137/9739/8559 11136/9738/8558
+f 5166/9749/8569 11145/9298/8126 11144/9297/8125 5171/9752/8572
+f 5171/9752/8572 11144/9297/8125 13322/9266/8094 11137/9739/8559
+f 5165/9746/8566 5167/9753/8573 5172/9754/8574 5168/9755/8575
+f 5168/9755/8575 5172/9754/8574 10971/8808/7645 10970/8803/7640
+f 5167/9753/8573 11136/9738/8558 11135/9745/8565 5172/9754/8574
+f 5172/9754/8574 11135/9745/8565 13292/8785/7626 10971/8808/7645
+f 5165/9746/8566 5168/9755/8575 5173/9756/8576 5169/9747/8567
+f 5169/9747/8567 5173/9756/8576 11141/9757/8577 11142/9750/8570
+f 5168/9755/8575 10970/8803/7640 10969/8802/7639 5173/9756/8576
+f 5173/9756/8576 10969/8802/7639 13294/8805/7642 11141/9757/8577
+f 5174/9758/8578 5178/9759/8579 5179/9760/8580 5175/9761/8581
+f 5175/9761/8581 5179/9760/8580 11149/9334/8162 11148/9332/8160
+f 5178/9759/8579 8972/3886/3464 8971/3885/3463 5179/9760/8580
+f 5179/9760/8580 8971/3885/3463 12954/3472/3058 11149/9334/8162
+f 5174/9758/8578 5175/9761/8581 5180/9762/8582 5176/9763/8583
+f 5176/9763/8583 5180/9762/8582 11143/9751/8571 11142/9750/8570
+f 5175/9761/8581 11148/9332/8160 11147/9331/8159 5180/9762/8582
+f 5180/9762/8582 11147/9331/8159 13323/9302/8130 11143/9751/8571
+f 5174/9758/8578 5176/9763/8583 5181/9764/8584 5177/9765/8585
+f 5177/9765/8585 5181/9764/8584 10977/8823/7657 10976/8820/7654
+f 5176/9763/8583 11142/9750/8570 11141/9757/8577 5181/9764/8584
+f 5181/9764/8584 11141/9757/8577 13294/8805/7642 10977/8823/7657
+f 5174/9758/8578 5177/9765/8585 5182/9766/8586 5178/9759/8579
+f 5178/9759/8579 5182/9766/8586 8973/3889/3467 8972/3886/3464
+f 5177/9765/8585 10976/8820/7654 10975/8819/7653 5182/9766/8586
+f 5182/9766/8586 10975/8819/7653 12926/2997/2588 8973/3889/3467
+f 5183/9767/8587 5187/9768/8588 5188/9769/8589 5184/9770/8590
+f 5184/9770/8590 5188/9769/8589 11153/9771/8591 11154/9772/8592
+f 5187/9768/8588 10292/7358/6553 10291/7357/6552 5188/9769/8589
+f 5188/9769/8589 10291/7357/6552 13183/7021/6247 11153/9771/8591
+f 5183/9767/8587 5184/9770/8590 5189/9773/8593 5185/9774/8594
+f 5185/9774/8594 5189/9773/8593 11158/7334/6530 11157/7333/6529
+f 5184/9770/8590 11154/9772/8592 11155/9775/8595 5189/9773/8593
+f 5189/9773/8593 11155/9775/8595 13325/7048/90 11158/7334/6530
+f 5183/9767/8587 5185/9774/8594 5190/9776/8596 5186/9777/8597
+f 5186/9777/8597 5190/9776/8596 10186/9778/8598 10187/9779/8599
+f 5185/9774/8594 11157/7333/6529 11156/7346/6542 5190/9776/8596
+f 5190/9776/8596 11156/7346/6542 13324/7348/6544 10186/9778/8598
+f 5183/9767/8587 5186/9777/8597 5191/9780/8600 5187/9768/8588
+f 5187/9768/8588 5191/9780/8600 10293/7363/6558 10292/7358/6553
+f 5186/9777/8597 10187/9779/8599 10188/9781/8601 5191/9780/8600
+f 5191/9780/8600 10188/9781/8601 13165/7364/6559 10293/7363/6558
+f 5192/9782/8602 5196/9783/8603 5197/9784/8604 5193/9785/8605
+f 5193/9785/8605 5197/9784/8604 9958/9786/8606 9959/9787/8607
+f 5196/9783/8603 10181/7013/6239 10180/7012/6238 5197/9784/8604
+f 5197/9784/8604 10180/7012/6238 13120/7015/6241 9958/9786/8606
+f 5192/9782/8602 5193/9785/8605 5198/9788/8608 5194/9789/8609
+f 5194/9789/8609 5198/9788/8608 11164/7031/6257 11163/7030/6256
+f 5193/9785/8605 9959/9787/8607 9960/9790/8610 5198/9788/8608
+f 5198/9788/8608 9960/9790/8610 13326/7032/6258 11164/7031/6257
+f 5192/9782/8602 5194/9789/8609 5199/9791/8611 5195/9792/8612
+f 5195/9792/8612 5199/9791/8611 11155/9775/8595 11154/9772/8592
+f 5194/9789/8609 11163/7030/6256 11162/7046/6272 5199/9791/8611
+f 5199/9791/8611 11162/7046/6272 13325/7048/90 11155/9775/8595
+f 5192/9782/8602 5195/9792/8612 5200/9793/8613 5196/9783/8603
+f 5196/9783/8603 5200/9793/8613 10182/7020/6246 10181/7013/6239
+f 5195/9792/8612 11154/9772/8592 11153/9771/8591 5200/9793/8613
+f 5200/9793/8613 11153/9771/8591 13183/7021/6247 10182/7020/6246
+f 5201/9794/8614 5205/9795/8615 5206/9796/8616 5202/9797/8617
+f 5202/9797/8617 5206/9796/8616 11165/9798/8618 11166/9799/8619
+f 5205/9795/8615 10388/7621/6795 10387/7620/6794 5206/9796/8616
+f 5206/9796/8616 10387/7620/6794 13199/7623/6797 11165/9798/8618
+f 5201/9794/8614 5202/9797/8617 5207/9800/8620 5203/9801/8621
+f 5203/9801/8621 5207/9800/8620 11170/7600/6774 11169/7599/6773
+f 5202/9797/8617 11166/9799/8619 11167/9802/8622 5207/9800/8620
+f 5207/9800/8620 11167/9802/8622 13327/7601/6775 11170/7600/6774
+f 5201/9794/8614 5203/9801/8621 5208/9803/8623 5204/9804/8624
+f 5204/9804/8624 5208/9803/8623 9960/9790/8610 9959/9787/8607
+f 5203/9801/8621 11169/7599/6773 11168/7608/6782 5208/9803/8623
+f 5208/9803/8623 11168/7608/6782 13326/7032/6258 9960/9790/8610
+f 5201/9794/8614 5204/9804/8624 5209/9805/8625 5205/9795/8615
+f 5205/9795/8615 5209/9805/8625 10389/7626/6800 10388/7621/6795
+f 5204/9804/8624 9959/9787/8607 9958/9786/8606 5209/9805/8625
+f 5209/9805/8625 9958/9786/8606 13120/7015/6241 10389/7626/6800
+f 5210/9806/8626 5214/9807/8627 5215/9808/8628 5211/9809/8629
+f 5211/9809/8629 5215/9808/8628 11176/7871/7037 11175/7866/7032
+f 5214/9807/8627 10721/9810/8592 10722/9811/8595 5215/9808/8628
+f 5215/9808/8628 10722/9811/8595 13328/7872/90 11176/7871/7037
+f 5210/9806/8626 5211/9809/8629 5216/9812/8630 5212/9813/8631
+f 5212/9813/8631 5216/9812/8630 11167/9802/8622 11166/9799/8619
+f 5211/9809/8629 11175/7866/7032 11174/7865/7031 5216/9812/8630
+f 5216/9812/8630 11174/7865/7031 13327/7601/6775 11167/9802/8622
+f 5210/9806/8626 5212/9813/8631 5217/9814/8632 5213/9815/8633
+f 5213/9815/8633 5217/9814/8632 10485/7902/7067 10484/7901/7066
+f 5212/9813/8631 11166/9799/8619 11165/9798/8618 5217/9814/8632
+f 5217/9814/8632 11165/9798/8618 13199/7623/6797 10485/7902/7067
+f 5210/9806/8626 5213/9815/8633 5218/9816/8634 5214/9807/8627
+f 5214/9807/8627 5218/9816/8634 10720/9817/8591 10721/9810/8592
+f 5213/9815/8633 10484/7901/7066 10483/7914/7076 5218/9816/8634
+f 5218/9816/8634 10483/7914/7076 13252/7916/6247 10720/9817/8591
+f 5219/9818/8592 5223/9819/8592 5224/9820/8595 5220/9821/8595
+f 5220/9821/8595 5224/9820/8595 11182/8508/90 11181/8507/90
+f 5223/9819/8592 11438/9822/8592 11439/9823/8595 5224/9820/8595
+f 5224/9820/8595 11439/9823/8595 13372/8509/90 11182/8508/90
+f 5219/9818/8592 5220/9821/8595 5225/9824/8595 5221/9825/8592
+f 5221/9825/8592 5225/9824/8595 10722/9811/8595 10721/9810/8592
+f 5220/9821/8595 11181/8507/90 11180/8520/90 5225/9824/8595
+f 5225/9824/8595 11180/8520/90 13328/7872/90 10722/9811/8595
+f 5219/9818/8592 5221/9825/8592 5226/9826/8591 5222/9827/8591
+f 5222/9827/8591 5226/9826/8591 10713/8496/6247 10712/8490/6247
+f 5221/9825/8592 10721/9810/8592 10720/9817/8591 5226/9826/8591
+f 5226/9826/8591 10720/9817/8591 13252/7916/6247 10713/8496/6247
+f 5219/9818/8592 5222/9827/8591 5227/9828/8591 5223/9819/8592
+f 5223/9819/8592 5227/9828/8591 11437/9829/8591 11438/9822/8592
+f 5222/9827/8591 10712/8490/6247 10711/8489/6247 5227/9828/8591
+f 5227/9828/8591 10711/8489/6247 13371/8493/6247 11437/9829/8591
+f 5228/9830/8635 5232/9831/8636 5233/9832/8637 5229/9833/8638
+f 5229/9833/8638 5233/9832/8637 11761/9834/8639 11762/9835/8640
+f 5232/9831/8636 11576/6516/5765 11575/6515/5764 5233/9832/8637
+f 5233/9832/8637 11575/6515/5764 13393/6518/5767 11761/9834/8639
+f 5228/9830/8635 5229/9833/8638 5234/9836/8641 5230/9837/8642
+f 5230/9837/8642 5234/9836/8641 11767/9838/8643 11768/9839/8644
+f 5229/9833/8638 11762/9835/8640 11763/9840/8645 5234/9836/8641
+f 5234/9836/8641 11763/9840/8645 13419/9841/8646 11767/9838/8643
+f 5228/9830/8635 5230/9837/8642 5235/9842/8647 5231/9843/8648
+f 5231/9843/8648 5235/9842/8647 11770/9844/8649 11771/9845/8650
+f 5230/9837/8642 11768/9839/8644 11769/9846/8651 5235/9842/8647
+f 5235/9842/8647 11769/9846/8651 13420/9847/8652 11770/9844/8649
+f 5228/9830/8635 5231/9843/8648 5236/9848/8653 5232/9831/8636
+f 5232/9831/8636 5236/9848/8653 11577/6523/5772 11576/6516/5765
+f 5231/9843/8648 11771/9845/8650 11772/9849/8654 5236/9848/8653
+f 5236/9848/8653 11772/9849/8654 13395/6524/5773 11577/6523/5772
+f 5237/9850/8655 5241/9851/8656 5242/9852/8657 5238/9853/8658
+f 5238/9853/8658 5242/9852/8657 11193/8880/7708 11192/8875/7703
+f 5241/9851/8656 11061/9854/8659 11062/9855/8660 5242/9852/8657
+f 5242/9852/8657 11062/9855/8660 13331/8881/7709 11193/8880/7708
+f 5237/9850/8655 5238/9853/8658 5243/9856/8661 5239/9857/8662
+f 5239/9857/8662 5243/9856/8661 11183/9858/8663 11184/9859/8664
+f 5238/9853/8658 11192/8875/7703 11191/8874/7702 5243/9856/8661
+f 5243/9856/8661 11191/8874/7702 13330/6487/5736 11183/9858/8663
+f 5237/9850/8655 5239/9857/8662 5244/9860/8665 5240/9861/8666
+f 5240/9861/8666 5244/9860/8665 10776/8909/7737 10775/8908/7736
+f 5239/9857/8662 11184/9859/8664 11185/9862/8667 5244/9860/8665
+f 5244/9860/8665 11185/9862/8667 13213/8910/7738 10776/8909/7737
+f 5237/9850/8655 5240/9861/8666 5245/9863/8668 5241/9851/8656
+f 5241/9851/8656 5245/9863/8668 11060/9864/8669 11061/9854/8659
+f 5240/9861/8666 10775/8908/7736 10774/8924/7752 5245/9863/8668
+f 5245/9863/8668 10774/8924/7752 13308/8926/7754 11060/9864/8669
+f 5246/9865/8670 5250/9866/8671 5251/9867/8672 5247/9868/8673
+f 5247/9868/8673 5251/9867/8672 11199/9570/8398 11198/9565/8393
+f 5250/9866/8671 11195/9869/8674 11196/9870/8675 5251/9867/8672
+f 5251/9867/8672 11196/9870/8675 13332/9571/8399 11199/9570/8398
+f 5246/9865/8670 5247/9868/8673 5252/9871/8676 5248/9872/8677
+f 5248/9872/8677 5252/9871/8676 11062/9855/8660 11061/9854/8659
+f 5247/9868/8673 11198/9565/8393 11197/9564/8392 5252/9871/8676
+f 5252/9871/8676 11197/9564/8392 13331/8881/7709 11062/9855/8660
+f 5246/9865/8670 5248/9872/8677 5253/9873/8678 5249/9874/8679
+f 5249/9874/8679 5253/9873/8678 11055/9547/8375 11054/9546/8374
+f 5248/9872/8677 11061/9854/8659 11060/9864/8669 5253/9873/8678
+f 5253/9873/8678 11060/9864/8669 13308/8926/7754 11055/9547/8375
+f 5246/9865/8670 5249/9874/8679 5254/9875/8680 5250/9866/8671
+f 5250/9866/8671 5254/9875/8680 11194/9876/8681 11195/9869/8674
+f 5249/9874/8679 11054/9546/8374 11053/9555/8383 5254/9875/8680
+f 5254/9875/8680 11053/9555/8383 13269/9557/8385 11194/9876/8681
+f 5255/9877/8682 5259/9878/8683 5260/9879/8684 5256/9880/8685
+f 5256/9880/8685 5260/9879/8684 10779/8589/7469 10778/8584/7464
+f 5259/9878/8683 11279/9881/8686 11280/9882/8687 5260/9879/8684
+f 5260/9879/8684 11280/9882/8687 13346/8590/7470 10779/8589/7469
+f 5255/9877/8682 5256/9880/8685 5261/9883/8688 5257/9884/8689
+f 5257/9884/8689 5261/9883/8688 11200/9885/8690 11201/9886/8691
+f 5256/9880/8685 10778/8584/7464 10777/8583/7463 5261/9883/8688
+f 5261/9883/8688 10777/8583/7463 13268/8586/7466 11200/9885/8690
+f 5255/9877/8682 5257/9884/8689 5262/9887/8692 5258/9888/8693
+f 5258/9888/8693 5262/9887/8692 11271/8554/7435 11270/8546/7427
+f 5257/9884/8689 11201/9886/8691 11202/9889/8694 5262/9887/8692
+f 5262/9887/8692 11202/9889/8694 13333/8555/7436 11271/8554/7435
+f 5255/9877/8682 5258/9888/8693 5263/9890/8695 5259/9878/8683
+f 5259/9878/8683 5263/9890/8695 11278/9891/8696 11279/9881/8686
+f 5258/9888/8693 11270/8546/7427 11269/8545/7426 5263/9890/8695
+f 5263/9890/8695 11269/8545/7426 13345/8549/7430 11278/9891/8696
+f 5264/9892/8697 5268/9893/8698 5269/9894/8699 5265/9895/8700
+f 5265/9895/8700 5269/9894/8699 11206/9896/8701 11207/9897/8702
+f 5268/9893/8698 11070/9620/8440 11069/9619/8439 5269/9894/8699
+f 5269/9894/8699 11069/9619/8439 13311/8897/7725 11206/9896/8701
+f 5264/9892/8697 5265/9895/8700 5270/9898/8703 5266/9899/8704
+f 5266/9899/8704 5270/9898/8703 11211/9601/8424 11210/9600/8423
+f 5265/9895/8700 11207/9897/8702 11208/9900/8705 5270/9898/8703
+f 5270/9898/8703 11208/9900/8705 13334/8845/7678 11211/9601/8424
+f 5264/9892/8697 5266/9899/8704 5271/9901/8706 5267/9902/8707
+f 5267/9902/8707 5271/9901/8706 11202/9889/8694 11201/9886/8691
+f 5266/9899/8704 11210/9600/8423 11209/9610/8430 5271/9901/8706
+f 5271/9901/8706 11209/9610/8430 13333/8555/7436 11202/9889/8694
+f 5264/9892/8697 5267/9902/8707 5272/9903/8708 5268/9893/8698
+f 5268/9893/8698 5272/9903/8708 11071/9623/8443 11070/9620/8440
+f 5267/9902/8707 11201/9886/8691 11200/9885/8690 5272/9903/8708
+f 5272/9903/8708 11200/9885/8690 13268/8586/7466 11071/9623/8443
+f 5273/9904/8709 5277/9905/8710 5278/9906/8711 5274/9907/8712
+f 5274/9907/8712 5278/9906/8711 11212/9908/8713 11213/9909/8714
+f 5277/9905/8710 10772/8891/7719 10771/8890/7718 5278/9906/8711
+f 5278/9906/8711 10771/8890/7718 13255/7892/7057 11212/9908/8713
+f 5273/9904/8709 5274/9907/8712 5279/9910/8715 5275/9911/8716
+f 5275/9911/8716 5279/9910/8715 11217/8831/7664 11216/8830/7663
+f 5274/9907/8712 11213/9909/8714 11214/9912/8717 5279/9910/8715
+f 5279/9910/8715 11214/9912/8717 13335/7836/7010 11217/8831/7664
+f 5273/9904/8709 5275/9911/8716 5280/9913/8718 5276/9914/8719
+f 5276/9914/8719 5280/9913/8718 11208/9900/8705 11207/9897/8702
+f 5275/9911/8716 11216/8830/7663 11215/8843/7676 5280/9913/8718
+f 5280/9913/8718 11215/8843/7676 13334/8845/7678 11208/9900/8705
+f 5273/9904/8709 5276/9914/8719 5281/9915/8720 5277/9905/8710
+f 5277/9905/8710 5281/9915/8720 10773/8896/7724 10772/8891/7719
+f 5276/9914/8719 11207/9897/8702 11206/9896/8701 5281/9915/8720
+f 5281/9915/8720 11206/9896/8701 13311/8897/7725 10773/8896/7724
+f 5282/9916/8721 5286/9917/8722 5287/9918/8723 5283/9919/8724
+f 5283/9919/8724 5287/9918/8723 11218/9920/8725 11219/9921/8726
+f 5286/9917/8722 10472/7886/7051 10471/7885/7050 5287/9918/8723
+f 5287/9918/8723 10471/7885/7050 13140/6266/5524 11218/9920/8725
+f 5282/9916/8721 5283/9919/8724 5288/9922/8727 5284/9923/8728
+f 5284/9923/8728 5288/9922/8727 11223/7822/6996 11222/7821/6995
+f 5283/9919/8724 11219/9921/8726 11220/9924/8729 5288/9922/8727
+f 5288/9922/8727 11220/9924/8729 13336/6250/5508 11223/7822/6996
+f 5282/9916/8721 5284/9923/8728 5289/9925/8730 5285/9926/8731
+f 5285/9926/8731 5289/9925/8730 11214/9912/8717 11213/9909/8714
+f 5284/9923/8728 11222/7821/6995 11221/7834/7008 5289/9925/8730
+f 5289/9925/8730 11221/7834/7008 13335/7836/7010 11214/9912/8717
+f 5282/9916/8721 5285/9926/8731 5290/9927/8732 5286/9917/8722
+f 5286/9917/8722 5290/9927/8732 10473/7891/7056 10472/7886/7051
+f 5285/9926/8731 11213/9909/8714 11212/9908/8713 5290/9927/8732
+f 5290/9927/8732 11212/9908/8713 13255/7892/7057 10473/7891/7056
+f 5291/9928/8733 5295/9929/8734 5296/9930/8735 5292/9931/8736
+f 5292/9931/8736 5296/9930/8735 11224/9932/279 11225/9933/279
+f 5295/9929/8734 9977/6260/5518 9976/6259/5517 5296/9930/8735
+f 5296/9930/8735 9976/6259/5517 13125/6163/279 11224/9932/279
+f 5291/9928/8733 5292/9931/8736 5297/9934/8737 5293/9935/8738
+f 5293/9935/8738 5297/9934/8737 11229/6236/5498 11228/6235/5497
+f 5292/9931/8736 11225/9933/279 11226/9936/279 5297/9934/8737
+f 5297/9934/8737 11226/9936/279 13337/6185/279 11229/6236/5498
+f 5291/9928/8733 5293/9935/8738 5298/9937/8739 5294/9938/8740
+f 5294/9938/8740 5298/9937/8739 11220/9924/8729 11219/9921/8726
+f 5293/9935/8738 11228/6235/5497 11227/6248/5506 5298/9937/8739
+f 5298/9937/8739 11227/6248/5506 13336/6250/5508 11220/9924/8729
+f 5291/9928/8733 5294/9938/8740 5299/9939/8741 5295/9929/8734
+f 5295/9929/8734 5299/9939/8741 9978/6265/5523 9977/6260/5518
+f 5294/9938/8740 11219/9921/8726 11218/9920/8725 5299/9939/8741
+f 5299/9939/8741 11218/9920/8725 13140/6266/5524 9978/6265/5523
+f 5300/9940/8742 5304/9941/8743 5305/9942/8744 5301/9943/8745
+f 5301/9943/8745 5305/9942/8744 9832/9944/8746 9833/9945/8747
+f 5304/9941/8743 9875/6157/5437 9874/6156/5436 5305/9942/8744
+f 5305/9942/8744 9874/6156/5436 13106/5930/5259 9832/9944/8746
+f 5300/9940/8742 5301/9943/8745 5306/9946/8748 5302/9947/8749
+f 5302/9947/8749 5306/9946/8748 11235/6171/5447 11234/6170/5446
+f 5301/9943/8745 9833/9945/8747 9834/9948/8750 5306/9946/8748
+f 5306/9946/8748 9834/9948/8750 13338/5957/5285 11235/6171/5447
+f 5300/9940/8742 5302/9947/8749 5307/9949/8751 5303/9950/8752
+f 5303/9950/8752 5307/9949/8751 11226/9936/279 11225/9933/279
+f 5302/9947/8749 11234/6170/5446 11233/6183/5459 5307/9949/8751
+f 5307/9949/8751 11233/6183/5459 13337/6185/279 11226/9936/279
+f 5300/9940/8742 5303/9950/8752 5308/9951/8753 5304/9941/8743
+f 5304/9941/8743 5308/9951/8753 9876/6162/5440 9875/6157/5437
+f 5303/9950/8752 11225/9933/279 11224/9932/279 5308/9951/8753
+f 5308/9951/8753 11224/9932/279 13125/6163/279 9876/6162/5440
+f 5309/9952/8754 5313/9953/8755 5314/9954/8756 5310/9955/8757
+f 5310/9955/8757 5314/9954/8756 10270/9956/8758 10271/9957/8759
+f 5313/9953/8755 10262/5922/5251 10261/5921/5250 5314/9954/8756
+f 5314/9954/8756 10261/5921/5250 13178/5924/5253 10270/9956/8758
+f 5309/9952/8754 5310/9955/8757 5315/9958/8760 5311/9959/8761
+f 5311/9959/8761 5315/9958/8760 11241/5940/5269 11240/5939/5268
+f 5310/9955/8757 10271/9957/8759 10272/9960/8762 5315/9958/8760
+f 5315/9958/8760 10272/9960/8762 13339/5941/1056 11241/5940/5269
+f 5309/9952/8754 5311/9959/8761 5316/9961/8763 5312/9962/8764
+f 5312/9962/8764 5316/9961/8763 9834/9948/8750 9833/9945/8747
+f 5311/9959/8761 11240/5939/5268 11239/5955/5283 5316/9961/8763
+f 5316/9961/8763 11239/5955/5283 13338/5957/5285 9834/9948/8750
+f 5309/9952/8754 5312/9962/8764 5317/9963/8765 5313/9953/8755
+f 5313/9953/8755 5317/9963/8765 10263/5929/5258 10262/5922/5251
+f 5312/9962/8764 9833/9945/8747 9832/9944/8746 5317/9963/8765
+f 5317/9963/8765 9832/9944/8746 13106/5930/5259 10263/5929/5258
+f 5318/9964/8766 5322/9965/8767 5323/9966/8768 5319/9967/8769
+f 5319/9967/8769 5323/9966/8768 9790/9968/8770 9791/9969/8771
+f 5322/9965/8767 9881/7250/6454 9880/7249/6453 5323/9966/8768
+f 5323/9966/8768 9880/7249/6453 13092/7252/6456 9790/9968/8770
+f 5318/9964/8766 5319/9967/8769 5324/9970/8772 5320/9971/8773
+f 5320/9971/8773 5324/9970/8772 11247/7264/6468 11246/7263/6467
+f 5319/9967/8769 9791/9969/8771 9792/9972/8774 5324/9970/8772
+f 5324/9970/8772 9792/9972/8774 13340/7265/6469 11247/7264/6468
+f 5318/9964/8766 5320/9971/8773 5325/9973/8775 5321/9974/8776
+f 5321/9974/8776 5325/9973/8775 10272/9960/8762 10271/9957/8759
+f 5320/9971/8773 11246/7263/6467 11245/7276/6480 5325/9973/8775
+f 5325/9973/8775 11245/7276/6480 13339/5941/1056 10272/9960/8762
+f 5318/9964/8766 5321/9974/8776 5326/9975/8777 5322/9965/8767
+f 5322/9965/8767 5326/9975/8777 9882/7255/6459 9881/7250/6454
+f 5321/9974/8776 10271/9957/8759 10270/9956/8758 5326/9975/8777
+f 5326/9975/8777 10270/9956/8758 13178/5924/5253 9882/7255/6459
+f 5327/9976/8778 5331/9977/8779 5332/9978/8780 5328/9979/8781
+f 5328/9979/8781 5332/9978/8780 11251/9980/8782 11252/9981/8783
+f 5331/9977/8779 10481/9982/5740 10480/9983/5739 5332/9978/8780
+f 5332/9978/8780 10480/9983/5739 13212/9984/5742 11251/9980/8782
+f 5327/9976/8778 5328/9979/8781 5333/9985/8784 5329/9986/8785
+f 5329/9986/8785 5333/9985/8784 11466/8528/7414 11465/8527/7413
+f 5328/9979/8781 11252/9981/8783 11253/9987/8786 5333/9985/8784
+f 5333/9985/8784 11253/9987/8786 13342/8529/7415 11466/8528/7414
+f 5327/9976/8778 5329/9986/8785 5334/9988/8787 5330/9989/8788
+f 5330/9989/8788 5334/9988/8787 11473/9990/8789 11474/9991/8790
+f 5329/9986/8785 11465/8527/7413 11464/8538/7421 5334/9988/8787
+f 5334/9988/8787 11464/8538/7421 13377/8540/5474 11473/9990/8789
+f 5327/9976/8778 5330/9989/8788 5335/9992/8791 5331/9977/8779
+f 5331/9977/8779 5335/9992/8791 10482/9993/5747 10481/9982/5740
+f 5330/9989/8788 11474/9991/8790 11475/9994/8792 5335/9992/8791
+f 5335/9992/8791 11475/9994/8792 13378/9995/5748 10482/9993/5747
+f 5336/9996/8793 5340/9997/8794 5341/9998/8795 5337/9999/8796
+f 5337/9999/8796 5341/9998/8795 11262/8860/7691 11261/8855/7686
+f 5340/9997/8794 11067/10000/8797 11068/10001/8798 5341/9998/8795
+f 5341/9998/8795 11068/10001/8798 13343/8861/6108 11262/8860/7691
+f 5336/9996/8793 5337/9999/8796 5342/10002/8799 5338/10003/8800
+f 5338/10003/8800 5342/10002/8799 11253/9987/8786 11252/9981/8783
+f 5337/9999/8796 11261/8855/7686 11260/8854/7685 5342/10002/8799
+f 5342/10002/8799 11260/8854/7685 13342/8529/7415 11253/9987/8786
+f 5336/9996/8793 5338/10003/8800 5343/10004/8801 5339/10005/8802
+f 5339/10005/8802 5343/10004/8801 10788/10006/7699 10787/10007/7698
+f 5338/10003/8800 11252/9981/8783 11251/9980/8782 5343/10004/8801
+f 5343/10004/8801 11251/9980/8782 13212/9984/5742 10788/10006/7699
+f 5336/9996/8793 5339/10005/8802 5344/10008/8803 5340/9997/8794
+f 5340/9997/8794 5344/10008/8803 11066/10009/8804 11067/10000/8797
+f 5339/10005/8802 10787/10007/7698 10786/10010/8805 5344/10008/8803
+f 5344/10008/8803 10786/10010/8805 13309/10011/8806 11066/10009/8804
+f 5345/10012/8807 5349/10013/8808 5350/10014/8809 5346/10015/8810
+f 5346/10015/8810 5350/10014/8809 11268/9590/8416 11267/9585/8413
+f 5349/10013/8808 11264/10016/8811 11265/10017/8812 5350/10014/8809
+f 5350/10014/8809 11265/10017/8812 13344/9591/7446 11268/9590/8416
+f 5345/10012/8807 5346/10015/8810 5351/10018/8813 5347/10019/8814
+f 5347/10019/8814 5351/10018/8813 11068/10001/8798 11067/10000/8797
+f 5346/10015/8810 11267/9585/8413 11266/9584/8412 5351/10018/8813
+f 5351/10018/8813 11266/9584/8412 13343/8861/6108 11068/10001/8798
+f 5345/10012/8807 5347/10019/8814 5352/10020/8815 5348/10021/8816
+f 5347/10019/8814 11067/10000/8797 11066/10009/8804 5352/10020/8815
+f 5353/10022/8817 5357/10023/8818 5358/10024/8819 5354/10025/8820
+f 5354/10025/8820 5358/10024/8819 11203/10026/8821 11204/10027/8822
+f 5357/10023/8818 10793/9569/8397 10792/9568/8396 5358/10024/8819
+f 5358/10024/8819 10792/9568/8396 13332/9571/8399 11203/10026/8821
+f 5353/10022/8817 5354/10025/8820 5359/10028/8823 5355/10029/8824
+f 5355/10029/8824 5359/10028/8823 11274/8548/7429 11273/8547/7428
+f 5354/10025/8820 11204/10027/8822 11205/10030/8825 5359/10028/8823
+f 5359/10028/8823 11205/10030/8825 13345/8549/7430 11274/8548/7429
+f 5353/10022/8817 5355/10029/8824 5360/10031/8826 5356/10032/8827
+f 5356/10032/8827 5360/10031/8826 11265/10033/8812 11264/10034/8811
+f 5355/10029/8824 11273/8547/7428 11272/8563/7444 5360/10031/8826
+f 5360/10031/8826 11272/8563/7444 13344/8565/7446 11265/10033/8812
+f 5353/10022/8817 5356/10032/8827 5361/10035/8828 5357/10023/8818
+f 5357/10023/8818 5361/10035/8828 10794/9573/8401 10793/9569/8397
+f 5356/10032/8827 11264/10034/8811 11263/10036/8829 5361/10035/8828
+f 5361/10035/8828 11263/10036/8829 13271/9574/8402 10794/9573/8401
+f 5362/10037/8830 5366/10038/8831 5367/10039/8832 5363/10040/8833
+f 5363/10040/8833 5367/10039/8832 11275/10041/8834 11276/10042/8835
+f 5366/10038/8831 11195/9869/8674 11194/9876/8681 5367/10039/8832
+f 5367/10039/8832 11194/9876/8681 13269/9557/8385 11275/10041/8834
+f 5362/10037/8830 5363/10040/8833 5368/10043/8836 5364/10044/8837
+f 5364/10044/8837 5368/10043/8836 11280/9882/8687 11279/9881/8686
+f 5363/10040/8833 11276/10042/8835 11277/10045/8838 5368/10043/8836
+f 5368/10043/8836 11277/10045/8838 13346/8590/7470 11280/9882/8687
+f 5362/10037/8830 5364/10044/8837 5369/10046/8839 5365/10047/8840
+f 5365/10047/8840 5369/10046/8839 11205/10030/8825 11204/10027/8822
+f 5364/10044/8837 11279/9881/8686 11278/9891/8696 5369/10046/8839
+f 5369/10046/8839 11278/9891/8696 13345/8549/7430 11205/10030/8825
+f 5362/10037/8830 5365/10047/8840 5370/10048/8841 5366/10038/8831
+f 5366/10038/8831 5370/10048/8841 11196/9870/8675 11195/9869/8674
+f 5365/10047/8840 11204/10027/8822 11203/10026/8821 5370/10048/8841
+f 5370/10048/8841 11203/10026/8821 13332/9571/8399 11196/9870/8675
+f 5371/10049/8842 5375/10050/8843 5376/10051/8844 5372/10052/8845
+f 5372/10052/8845 5376/10051/8844 11281/10053/8846 11282/10054/8847
+f 5375/10050/8843 10808/9553/8381 10807/9552/8380 5376/10051/8844
+f 5376/10051/8844 10807/9552/8380 13273/9541/8369 11281/10053/8846
+f 5371/10049/8842 5372/10052/8845 5377/10055/8848 5373/10056/8849
+f 5373/10056/8849 5377/10055/8848 11286/8573/7454 11285/8572/7453
+f 5372/10052/8845 11282/10054/8847 11283/10057/8850 5377/10055/8848
+f 5377/10055/8848 11283/10057/8850 13347/8574/1082 11286/8573/7454
+f 5371/10049/8842 5373/10056/8849 5378/10058/8851 5374/10059/8852
+f 5374/10059/8852 5378/10058/8851 11277/10045/8838 11276/10042/8835
+f 5373/10056/8849 11285/8572/7453 11284/8588/7468 5378/10058/8851
+f 5378/10058/8851 11284/8588/7468 13346/8590/7470 11277/10045/8838
+f 5371/10049/8842 5374/10059/8852 5379/10060/8853 5375/10050/8843
+f 5375/10050/8843 5379/10060/8853 10809/9556/8384 10808/9553/8381
+f 5374/10059/8852 11276/10042/8835 11275/10041/8834 5379/10060/8853
+f 5379/10060/8853 11275/10041/8834 13269/9557/8385 10809/9556/8384
+f 5380/10061/8854 5384/10062/8855 5385/10063/8856 5381/10064/8857
+f 5381/10064/8857 5385/10063/8856 11287/10065/8858 11288/10066/8859
+f 5384/10062/8855 10823/9537/8365 10822/9536/8364 5385/10063/8856
+f 5385/10063/8856 10822/9536/8364 13275/9525/8353 11287/10065/8858
+f 5380/10061/8854 5381/10064/8857 5386/10067/8860 5382/10068/8861
+f 5382/10068/8861 5386/10067/8860 11292/8598/1101 11291/8597/1096
+f 5381/10064/8857 11288/10066/8859 11289/10069/8862 5386/10067/8860
+f 5386/10067/8860 11289/10069/8862 13348/8599/1102 11292/8598/1101
+f 5380/10061/8854 5382/10068/8861 5387/10070/8863 5383/10071/8864
+f 5383/10071/8864 5387/10070/8863 11283/10057/8850 11282/10054/8847
+f 5382/10068/8861 11291/8597/1096 11290/8610/1095 5387/10070/8863
+f 5387/10070/8863 11290/8610/1095 13347/8574/1082 11283/10057/8850
+f 5380/10061/8854 5383/10071/8864 5388/10072/8865 5384/10062/8855
+f 5384/10062/8855 5388/10072/8865 10824/9540/8368 10823/9537/8365
+f 5383/10071/8864 11282/10054/8847 11281/10053/8846 5388/10072/8865
+f 5388/10072/8865 11281/10053/8846 13273/9541/8369 10824/9540/8368
+f 5389/10073/8866 5393/10074/8867 5394/10075/8868 5390/10076/8869
+f 5390/10076/8869 5394/10075/8868 11293/10077/8870 11294/10078/8871
+f 5393/10074/8867 10838/9521/8349 10837/9520/8348 5394/10075/8868
+f 5394/10075/8868 10837/9520/8348 13277/9509/8337 11293/10077/8870
+f 5389/10073/8866 5390/10076/8869 5395/10079/8872 5391/10080/8873
+f 5391/10080/8873 5395/10079/8872 11298/8618/1121 11297/8617/1116
+f 5390/10076/8869 11294/10078/8871 11295/10081/8874 5395/10079/8872
+f 5395/10079/8872 11295/10081/8874 13349/8619/1122 11298/8618/1121
+f 5389/10073/8866 5391/10080/8873 5396/10082/8875 5392/10083/8876
+f 5392/10083/8876 5396/10082/8875 11289/10069/8862 11288/10066/8859
+f 5391/10080/8873 11297/8617/1116 11296/8630/1115 5396/10082/8875
+f 5396/10082/8875 11296/8630/1115 13348/8599/1102 11289/10069/8862
+f 5389/10073/8866 5392/10083/8876 5397/10084/8877 5393/10074/8867
+f 5393/10074/8867 5397/10084/8877 10839/9524/8352 10838/9521/8349
+f 5392/10083/8876 11288/10066/8859 11287/10065/8858 5397/10084/8877
+f 5397/10084/8877 11287/10065/8858 13275/9525/8353 10839/9524/8352
+f 5398/10085/8878 5402/10086/8879 5403/10087/8880 5399/10088/8881
+f 5399/10088/8881 5403/10087/8880 11299/10089/8882 11300/10090/8883
+f 5402/10086/8879 10853/9505/8333 10852/9504/8332 5403/10087/8880
+f 5403/10087/8880 10852/9504/8332 13279/9493/8321 11299/10089/8882
+f 5398/10085/8878 5399/10088/8881 5404/10091/8884 5400/10092/8885
+f 5400/10092/8885 5404/10091/8884 11304/8638/1141 11303/8637/1136
+f 5399/10088/8881 11300/10090/8883 11301/10093/8886 5404/10091/8884
+f 5404/10091/8884 11301/10093/8886 13350/8639/1142 11304/8638/1141
+f 5398/10085/8878 5400/10092/8885 5405/10094/8887 5401/10095/8888
+f 5401/10095/8888 5405/10094/8887 11295/10081/8874 11294/10078/8871
+f 5400/10092/8885 11303/8637/1136 11302/8650/1135 5405/10094/8887
+f 5405/10094/8887 11302/8650/1135 13349/8619/1122 11295/10081/8874
+f 5398/10085/8878 5401/10095/8888 5406/10096/8889 5402/10086/8879
+f 5402/10086/8879 5406/10096/8889 10854/9508/8336 10853/9505/8333
+f 5401/10095/8888 11294/10078/8871 11293/10077/8870 5406/10096/8889
+f 5406/10096/8889 11293/10077/8870 13277/9509/8337 10854/9508/8336
+f 5407/10097/8890 5411/10098/8891 5412/10099/8892 5408/10100/8893
+f 5408/10100/8893 5412/10099/8892 11305/10101/8894 11306/10102/8895
+f 5411/10098/8891 10868/9489/8317 10867/9488/8316 5412/10099/8892
+f 5412/10099/8892 10867/9488/8316 13281/9477/8305 11305/10101/8894
+f 5407/10097/8890 5408/10100/8893 5413/10103/8896 5409/10104/8897
+f 5409/10104/8897 5413/10103/8896 11310/8658/1161 11309/8657/1156
+f 5408/10100/8893 11306/10102/8895 11307/10105/8898 5413/10103/8896
+f 5413/10103/8896 11307/10105/8898 13351/8659/1162 11310/8658/1161
+f 5407/10097/8890 5409/10104/8897 5414/10106/8899 5410/10107/8900
+f 5410/10107/8900 5414/10106/8899 11301/10093/8886 11300/10090/8883
+f 5409/10104/8897 11309/8657/1156 11308/8670/1155 5414/10106/8899
+f 5414/10106/8899 11308/8670/1155 13350/8639/1142 11301/10093/8886
+f 5407/10097/8890 5410/10107/8900 5415/10108/8901 5411/10098/8891
+f 5411/10098/8891 5415/10108/8901 10869/9492/8320 10868/9489/8317
+f 5410/10107/8900 11300/10090/8883 11299/10089/8882 5415/10108/8901
+f 5415/10108/8901 11299/10089/8882 13279/9493/8321 10869/9492/8320
+f 5416/10109/8902 5420/10110/8903 5421/10111/8904 5417/10112/8905
+f 5417/10112/8905 5421/10111/8904 11311/10113/8906 11312/10114/8907
+f 5420/10110/8903 10883/9473/8301 10882/9472/8300 5421/10111/8904
+f 5421/10111/8904 10882/9472/8300 13283/9461/8289 11311/10113/8906
+f 5416/10109/8902 5417/10112/8905 5422/10115/8908 5418/10116/8909
+f 5418/10116/8909 5422/10115/8908 11316/8678/1181 11315/8677/1176
+f 5417/10112/8905 11312/10114/8907 11313/10117/8910 5422/10115/8908
+f 5422/10115/8908 11313/10117/8910 13352/8679/1182 11316/8678/1181
+f 5416/10109/8902 5418/10116/8909 5423/10118/8911 5419/10119/8912
+f 5419/10119/8912 5423/10118/8911 11307/10105/8898 11306/10102/8895
+f 5418/10116/8909 11315/8677/1176 11314/8690/1175 5423/10118/8911
+f 5423/10118/8911 11314/8690/1175 13351/8659/1162 11307/10105/8898
+f 5416/10109/8902 5419/10119/8912 5424/10120/8913 5420/10110/8903
+f 5420/10110/8903 5424/10120/8913 10884/9476/8304 10883/9473/8301
+f 5419/10119/8912 11306/10102/8895 11305/10101/8894 5424/10120/8913
+f 5424/10120/8913 11305/10101/8894 13281/9477/8305 10884/9476/8304
+f 5425/10121/8914 5429/10122/8915 5430/10123/8916 5426/10124/8917
+f 5426/10124/8917 5430/10123/8916 11317/10125/8918 11318/10126/8919
+f 5429/10122/8915 10898/9457/8285 10897/9456/8284 5430/10123/8916
+f 5430/10123/8916 10897/9456/8284 13285/9445/8273 11317/10125/8918
+f 5425/10121/8914 5426/10124/8917 5431/10127/8920 5427/10128/8921
+f 5427/10128/8921 5431/10127/8920 11322/8698/5147 11321/8697/5148
+f 5426/10124/8917 11318/10126/8919 11319/10129/8922 5431/10127/8920
+f 5431/10127/8920 11319/10129/8922 13353/8699/5134 11322/8698/5147
+f 5425/10121/8914 5427/10128/8921 5432/10130/8923 5428/10131/8924
+f 5428/10131/8924 5432/10130/8923 11313/10117/8910 11312/10114/8907
+f 5427/10128/8921 11321/8697/5148 11320/8710/5153 5432/10130/8923
+f 5432/10130/8923 11320/8710/5153 13352/8679/1182 11313/10117/8910
+f 5425/10121/8914 5428/10131/8924 5433/10132/8925 5429/10122/8915
+f 5429/10122/8915 5433/10132/8925 10899/9460/8288 10898/9457/8285
+f 5428/10131/8924 11312/10114/8907 11311/10113/8906 5433/10132/8925
+f 5433/10132/8925 11311/10113/8906 13283/9461/8289 10899/9460/8288
+f 5434/10133/8926 5438/10134/8927 5439/10135/8928 5435/10136/8929
+f 5435/10136/8929 5439/10135/8928 11323/10137/8930 11324/10138/8931
+f 5438/10134/8927 10913/9441/8269 10912/9440/8268 5439/10135/8928
+f 5439/10135/8928 10912/9440/8268 13287/9429/8257 11323/10137/8930
+f 5434/10133/8926 5435/10136/8929 5440/10139/8932 5436/10140/8933
+f 5436/10140/8933 5440/10139/8932 11328/8718/5128 11327/8717/1221
+f 5435/10136/8929 11324/10138/8931 11325/10141/8934 5440/10139/8932
+f 5440/10139/8932 11325/10141/8934 13354/8719/5115 11328/8718/5128
+f 5434/10133/8926 5436/10140/8933 5441/10142/8935 5437/10143/8936
+f 5437/10143/8936 5441/10142/8935 11319/10129/8922 11318/10126/8919
+f 5436/10140/8933 11327/8717/1221 11326/8730/5133 5441/10142/8935
+f 5441/10142/8935 11326/8730/5133 13353/8699/5134 11319/10129/8922
+f 5434/10133/8926 5437/10143/8936 5442/10144/8937 5438/10134/8927
+f 5438/10134/8927 5442/10144/8937 10914/9444/8272 10913/9441/8269
+f 5437/10143/8936 11318/10126/8919 11317/10125/8918 5442/10144/8937
+f 5442/10144/8937 11317/10125/8918 13285/9445/8273 10914/9444/8272
+f 5443/10145/8938 5447/10146/8939 5448/10147/8940 5444/10148/8941
+f 5444/10148/8941 5448/10147/8940 11329/10149/8942 11330/10150/8943
+f 5447/10146/8939 10928/9425/8253 10927/9424/8252 5448/10147/8940
+f 5448/10147/8940 10927/9424/8252 13289/9413/8241 11329/10149/8942
+f 5443/10145/8938 5444/10148/8941 5449/10151/8944 5445/10152/8945
+f 5445/10152/8945 5449/10151/8944 11334/8738/5108 11333/8737/5109
+f 5444/10148/8941 11330/10150/8943 11331/10153/8946 5449/10151/8944
+f 5449/10151/8944 11331/10153/8946 13355/8739/5095 11334/8738/5108
+f 5443/10145/8938 5445/10152/8945 5450/10154/8947 5446/10155/8948
+f 5446/10155/8948 5450/10154/8947 11325/10141/8934 11324/10138/8931
+f 5445/10152/8945 11333/8737/5109 11332/8750/5114 5450/10154/8947
+f 5450/10154/8947 11332/8750/5114 13354/8719/5115 11325/10141/8934
+f 5443/10145/8938 5446/10155/8948 5451/10156/8949 5447/10146/8939
+f 5447/10146/8939 5451/10156/8949 10929/9428/8256 10928/9425/8253
+f 5446/10155/8948 11324/10138/8931 11323/10137/8930 5451/10156/8949
+f 5451/10156/8949 11323/10137/8930 13287/9429/8257 10929/9428/8256
+f 5452/10157/8950 5456/10158/8951 5457/10159/8952 5453/10160/8953
+f 5453/10160/8953 5457/10159/8952 11335/10161/8954 11336/10162/8955
+f 5456/10158/8951 10943/9409/8237 10942/9408/8236 5457/10159/8952
+f 5457/10159/8952 10942/9408/8236 13291/9397/8225 11335/10161/8954
+f 5452/10157/8950 5453/10160/8953 5458/10163/8956 5454/10164/8957
+f 5454/10164/8957 5458/10163/8956 11340/8758/5088 11339/8757/5089
+f 5453/10160/8953 11336/10162/8955 11337/10165/8958 5458/10163/8956
+f 5458/10163/8956 11337/10165/8958 13356/8759/5075 11340/8758/5088
+f 5452/10157/8950 5454/10164/8957 5459/10166/8959 5455/10167/8960
+f 5455/10167/8960 5459/10166/8959 11331/10153/8946 11330/10150/8943
+f 5454/10164/8957 11339/8757/5089 11338/8770/5094 5459/10166/8959
+f 5459/10166/8959 11338/8770/5094 13355/8739/5095 11331/10153/8946
+f 5452/10157/8950 5455/10167/8960 5460/10168/8961 5456/10158/8951
+f 5456/10158/8951 5460/10168/8961 10944/9412/8240 10943/9409/8237
+f 5455/10167/8960 11330/10150/8943 11329/10149/8942 5460/10168/8961
+f 5460/10168/8961 11329/10149/8942 13289/9413/8241 10944/9412/8240
+f 5461/10169/8962 5465/10170/8963 5466/10171/8964 5462/10172/8965
+f 5462/10172/8965 5466/10171/8964 11341/10173/8966 11342/10174/8967
+f 5465/10170/8963 10958/9393/8221 10957/9392/8220 5466/10171/8964
+f 5466/10171/8964 10957/9392/8220 13293/9381/8209 11341/10173/8966
+f 5461/10169/8962 5462/10172/8965 5467/10175/8968 5463/10176/8969
+f 5463/10176/8969 5467/10175/8968 11346/8778/5068 11345/8777/5069
+f 5462/10172/8965 11342/10174/8967 11343/10177/8970 5467/10175/8968
+f 5467/10175/8968 11343/10177/8970 13357/8779/5055 11346/8778/5068
+f 5461/10169/8962 5463/10176/8969 5468/10178/8971 5464/10179/8972
+f 5464/10179/8972 5468/10178/8971 11337/10165/8958 11336/10162/8955
+f 5463/10176/8969 11345/8777/5069 11344/8790/5074 5468/10178/8971
+f 5468/10178/8971 11344/8790/5074 13356/8759/5075 11337/10165/8958
+f 5461/10169/8962 5464/10179/8972 5469/10180/8973 5465/10170/8963
+f 5465/10170/8963 5469/10180/8973 10959/9396/8224 10958/9393/8221
+f 5464/10179/8972 11336/10162/8955 11335/10161/8954 5469/10180/8973
+f 5469/10180/8973 11335/10161/8954 13291/9397/8225 10959/9396/8224
+f 5470/10181/8974 5474/10182/8975 5475/10183/8976 5471/10184/8977
+f 5471/10184/8977 5475/10183/8976 11347/10185/8978 11348/10186/8979
+f 5474/10182/8975 10973/9377/8205 10972/9376/8204 5475/10183/8976
+f 5475/10183/8976 10972/9376/8204 13295/9365/8193 11347/10185/8978
+f 5470/10181/8974 5471/10184/8977 5476/10187/8980 5472/10188/8981
+f 5472/10188/8981 5476/10187/8980 11352/8798/5048 11351/8797/5049
+f 5471/10184/8977 11348/10186/8979 11349/10189/8982 5476/10187/8980
+f 5476/10187/8980 11349/10189/8982 13358/8799/5035 11352/8798/5048
+f 5470/10181/8974 5472/10188/8981 5477/10190/8983 5473/10191/8984
+f 5473/10191/8984 5477/10190/8983 11343/10177/8970 11342/10174/8967
+f 5472/10188/8981 11351/8797/5049 11350/8810/5054 5477/10190/8983
+f 5477/10190/8983 11350/8810/5054 13357/8779/5055 11343/10177/8970
+f 5470/10181/8974 5473/10191/8984 5478/10192/8985 5474/10182/8975
+f 5474/10182/8975 5478/10192/8985 10974/9380/8208 10973/9377/8205
+f 5473/10191/8984 11342/10174/8967 11341/10173/8966 5478/10192/8985
+f 5478/10192/8985 11341/10173/8966 13293/9381/8209 10974/9380/8208
+f 5479/10193/8986 5483/10194/8987 5484/10195/8988 5480/10196/8989
+f 5480/10196/8989 5484/10195/8988 9177/4310/3861 9176/4309/3860
+f 5483/10194/8987 10979/9361/8189 10978/9360/8188 5484/10195/8988
+f 5484/10195/8988 10978/9360/8188 12927/3514/3100 9177/4310/3861
+f 5479/10193/8986 5480/10196/8989 5485/10197/8990 5481/10198/8991
+f 5481/10198/8991 5485/10197/8990 11355/8816/5028 11354/8815/5029
+f 5480/10196/8989 9176/4309/3860 9175/4316/3867 5485/10197/8990
+f 5485/10197/8990 9175/4316/3867 12989/2986/9 11355/8816/5028
+f 5479/10193/8986 5481/10198/8991 5486/10199/8992 5482/10200/8993
+f 5482/10200/8993 5486/10199/8992 11349/10189/8982 11348/10186/8979
+f 5481/10198/8991 11354/8815/5029 11353/8825/5034 5486/10199/8992
+f 5486/10199/8992 11353/8825/5034 13358/8799/5035 11349/10189/8982
+f 5479/10193/8986 5482/10200/8993 5487/10201/8994 5483/10194/8987
+f 5483/10194/8987 5487/10201/8994 10980/9364/8192 10979/9361/8189
+f 5482/10200/8993 11348/10186/8979 11347/10185/8978 5487/10201/8994
+f 5487/10201/8994 11347/10185/8978 13295/9365/8193 10980/9364/8192
+f 5488/10202/8995 5492/10203/8996 5493/10204/8997 5489/10205/8998
+f 5489/10205/8998 5493/10204/8997 11356/10206/8999 11357/10207/9000
+f 5492/10203/8996 10637/10208/9001 10638/10209/9002 5493/10204/8997
+f 5493/10204/8997 10638/10209/9002 13239/10210/9003 11356/10206/8999
+f 5488/10202/8995 5489/10205/8998 5494/10211/9004 5490/10212/9005
+f 5490/10212/9005 5494/10211/9004 11361/8300/6027 11360/8299/6028
+f 5489/10205/8998 11357/10207/9000 11358/10213/9006 5494/10211/9004
+f 5494/10211/9004 11358/10213/9006 13359/8301/6030 11361/8300/6027
+f 5488/10202/8995 5490/10212/9005 5495/10214/9007 5491/10215/9008
+f 5491/10215/9008 5495/10214/9007 9183/4334/3885 9182/4329/3880
+f 5490/10212/9005 11360/8299/6028 11359/8308/6032 5495/10214/9007
+f 5495/10214/9007 11359/8308/6032 12990/2506/977 9183/4334/3885
+f 5488/10202/8995 5491/10215/9008 5496/10216/9009 5492/10203/8996
+f 5492/10203/8996 5496/10216/9009 10636/10217/9010 10637/10208/9001
+f 5491/10215/9008 9182/4329/3880 9181/4328/3879 5496/10216/9009
+f 5496/10216/9009 9181/4328/3879 12871/4331/3882 10636/10217/9010
+f 5497/10218/9011 5501/10219/9012 5502/10220/9013 5498/10221/9014
+f 5498/10221/9014 5502/10220/9013 11362/10222/9015 11363/10223/9016
+f 5501/10219/9012 10631/10224/9017 10632/10225/9018 5502/10220/9013
+f 5502/10220/9013 10632/10225/9018 13237/10226/9019 11362/10222/9015
+f 5497/10218/9011 5498/10221/9014 5503/10227/9020 5499/10228/9021
+f 5499/10228/9021 5503/10227/9020 11367/8316/6047 11366/8315/6048
+f 5498/10221/9014 11363/10223/9016 11364/10229/9022 5503/10227/9020
+f 5503/10227/9020 11364/10229/9022 13360/8317/6050 11367/8316/6047
+f 5497/10218/9011 5499/10228/9021 5504/10230/9023 5500/10231/9024
+f 5500/10231/9024 5504/10230/9023 11358/10213/9006 11357/10207/9000
+f 5499/10228/9021 11366/8315/6048 11365/8324/6052 5504/10230/9023
+f 5504/10230/9023 11365/8324/6052 13359/8301/6030 11358/10213/9006
+f 5497/10218/9011 5500/10231/9024 5505/10232/9025 5501/10219/9012
+f 5501/10219/9012 5505/10232/9025 10630/10233/9026 10631/10224/9017
+f 5500/10231/9024 11357/10207/9000 11356/10206/8999 5505/10232/9025
+f 5505/10232/9025 11356/10206/8999 13239/10210/9003 10630/10233/9026
+f 5506/10234/9027 5510/10235/9028 5511/10236/9029 5507/10237/9030
+f 5507/10237/9030 5511/10236/9029 11368/10238/9031 11369/10239/9032
+f 5510/10235/9028 10619/10240/9033 10620/10241/9034 5511/10236/9029
+f 5511/10236/9029 10620/10241/9034 13235/10242/9035 11368/10238/9031
+f 5506/10234/9027 5507/10237/9030 5512/10243/9036 5508/10244/9037
+f 5508/10244/9037 5512/10243/9036 11373/8332/6067 11372/8331/6068
+f 5507/10237/9030 11369/10239/9032 11370/10245/9038 5512/10243/9036
+f 5512/10243/9036 11370/10245/9038 13361/8333/6070 11373/8332/6067
+f 5506/10234/9027 5508/10244/9037 5513/10246/9039 5509/10247/9040
+f 5509/10247/9040 5513/10246/9039 11364/10229/9022 11363/10223/9016
+f 5508/10244/9037 11372/8331/6068 11371/8340/6072 5513/10246/9039
+f 5513/10246/9039 11371/8340/6072 13360/8317/6050 11364/10229/9022
+f 5506/10234/9027 5509/10247/9040 5514/10248/9041 5510/10235/9028
+f 5510/10235/9028 5514/10248/9041 10618/10249/9042 10619/10240/9033
+f 5509/10247/9040 11363/10223/9016 11362/10222/9015 5514/10248/9041
+f 5514/10248/9041 11362/10222/9015 13237/10226/9019 10618/10249/9042
+f 5515/10250/9043 5519/10251/9044 5520/10252/9045 5516/10253/9046
+f 5516/10253/9046 5520/10252/9045 11374/10254/9047 11375/10255/9048
+f 5519/10251/9044 10607/10256/9049 10608/10257/9050 5520/10252/9045
+f 5520/10252/9045 10608/10257/9050 13233/10258/9051 11374/10254/9047
+f 5515/10250/9043 5516/10253/9046 5521/10259/9052 5517/10260/9053
+f 5517/10260/9053 5521/10259/9052 11379/8348/6087 11378/8347/6088
+f 5516/10253/9046 11375/10255/9048 11376/10261/9054 5521/10259/9052
+f 5521/10259/9052 11376/10261/9054 13362/8349/6090 11379/8348/6087
+f 5515/10250/9043 5517/10260/9053 5522/10262/9055 5518/10263/9056
+f 5518/10263/9056 5522/10262/9055 11370/10245/9038 11369/10239/9032
+f 5517/10260/9053 11378/8347/6088 11377/8356/6092 5522/10262/9055
+f 5522/10262/9055 11377/8356/6092 13361/8333/6070 11370/10245/9038
+f 5515/10250/9043 5518/10263/9056 5523/10264/9057 5519/10251/9044
+f 5519/10251/9044 5523/10264/9057 10606/10265/9058 10607/10256/9049
+f 5518/10263/9056 11369/10239/9032 11368/10238/9031 5523/10264/9057
+f 5523/10264/9057 11368/10238/9031 13235/10242/9035 10606/10265/9058
+f 5524/10266/9059 5528/10267/9060 5529/10268/9061 5525/10269/9062
+f 5525/10269/9062 5529/10268/9061 11380/10270/9063 11381/10271/9064
+f 5528/10267/9060 10595/10272/9065 10596/10273/9066 5529/10268/9061
+f 5529/10268/9061 10596/10273/9066 13231/10274/9067 11380/10270/9063
+f 5524/10266/9059 5525/10269/9062 5530/10275/9068 5526/10276/9069
+f 5526/10276/9069 5530/10275/9068 11385/8364/6107 11384/8363/6108
+f 5525/10269/9062 11381/10271/9064 11382/10277/9070 5530/10275/9068
+f 5530/10275/9068 11382/10277/9070 13363/8365/5474 11385/8364/6107
+f 5524/10266/9059 5526/10276/9069 5531/10278/9071 5527/10279/9072
+f 5527/10279/9072 5531/10278/9071 11376/10261/9054 11375/10255/9048
+f 5526/10276/9069 11384/8363/6108 11383/8372/6111 5531/10278/9071
+f 5531/10278/9071 11383/8372/6111 13362/8349/6090 11376/10261/9054
+f 5524/10266/9059 5527/10279/9072 5532/10280/9073 5528/10267/9060
+f 5528/10267/9060 5532/10280/9073 10594/10281/9074 10595/10272/9065
+f 5527/10279/9072 11375/10255/9048 11374/10254/9047 5532/10280/9073
+f 5532/10280/9073 11374/10254/9047 13233/10258/9051 10594/10281/9074
+f 5533/10282/9075 5537/10283/9076 5538/10284/9077 5534/10285/9078
+f 5534/10285/9078 5538/10284/9077 11386/10286/9079 11387/10287/9080
+f 5537/10283/9076 10583/10288/9081 10584/10289/9082 5538/10284/9077
+f 5538/10284/9077 10584/10289/9082 13229/10290/9083 11386/10286/9079
+f 5533/10282/9075 5534/10285/9078 5539/10291/9084 5535/10292/9085
+f 5535/10292/9085 5539/10291/9084 11391/8380/6126 11390/8379/254
+f 5534/10285/9078 11387/10287/9080 11388/10293/9086 5539/10291/9084
+f 5539/10291/9084 11388/10293/9086 13364/8381/6128 11391/8380/6126
+f 5533/10282/9075 5535/10292/9085 5540/10294/9087 5536/10295/9088
+f 5536/10295/9088 5540/10294/9087 11382/10277/9070 11381/10271/9064
+f 5535/10292/9085 11390/8379/254 11389/8388/6130 5540/10294/9087
+f 5540/10294/9087 11389/8388/6130 13363/8365/5474 11382/10277/9070
+f 5533/10282/9075 5536/10295/9088 5541/10296/9089 5537/10283/9076
+f 5537/10283/9076 5541/10296/9089 10582/10297/9090 10583/10288/9081
+f 5536/10295/9088 11381/10271/9064 11380/10270/9063 5541/10296/9089
+f 5541/10296/9089 11380/10270/9063 13231/10274/9067 10582/10297/9090
+f 5542/10298/9091 5546/10299/9092 5547/10300/9093 5543/10301/9094
+f 5543/10301/9094 5547/10300/9093 11392/10302/9095 11393/10303/9096
+f 5546/10299/9092 10571/10304/9097 10572/10305/9098 5547/10300/9093
+f 5547/10300/9093 10572/10305/9098 13227/10306/9099 11392/10302/9095
+f 5542/10298/9091 5543/10301/9094 5548/10307/9100 5544/10308/9101
+f 5544/10308/9101 5548/10307/9100 11397/8396/6145 11396/8395/6146
+f 5543/10301/9094 11393/10303/9096 11394/10309/9102 5548/10307/9100
+f 5548/10307/9100 11394/10309/9102 13365/8397/225 11397/8396/6145
+f 5542/10298/9091 5544/10308/9101 5549/10310/9103 5545/10311/9104
+f 5545/10311/9104 5549/10310/9103 11388/10293/9086 11387/10287/9080
+f 5544/10308/9101 11396/8395/6146 11395/8404/6149 5549/10310/9103
+f 5549/10310/9103 11395/8404/6149 13364/8381/6128 11388/10293/9086
+f 5542/10298/9091 5545/10311/9104 5550/10312/9105 5546/10299/9092
+f 5546/10299/9092 5550/10312/9105 10570/10313/9106 10571/10304/9097
+f 5545/10311/9104 11387/10287/9080 11386/10286/9079 5550/10312/9105
+f 5550/10312/9105 11386/10286/9079 13229/10290/9083 10570/10313/9106
+f 5551/10314/9107 5555/10315/9108 5556/10316/9109 5552/10317/9110
+f 5552/10317/9110 5556/10316/9109 11398/10318/9111 11399/10319/9112
+f 5555/10315/9108 10559/10320/9113 10560/10321/9114 5556/10316/9109
+f 5556/10316/9109 10560/10321/9114 13225/10322/9115 11398/10318/9111
+f 5551/10314/9107 5552/10317/9110 5557/10323/9116 5553/10324/9117
+f 5553/10324/9117 5557/10323/9116 11403/8412/211 11402/8411/210
+f 5552/10317/9110 11399/10319/9112 11400/10325/9118 5557/10323/9116
+f 5557/10323/9116 11400/10325/9118 13366/8413/205 11403/8412/211
+f 5551/10314/9107 5553/10324/9117 5558/10326/9119 5554/10327/9120
+f 5554/10327/9120 5558/10326/9119 11394/10309/9102 11393/10303/9096
+f 5553/10324/9117 11402/8411/210 11401/8420/223 5558/10326/9119
+f 5558/10326/9119 11401/8420/223 13365/8397/225 11394/10309/9102
+f 5551/10314/9107 5554/10327/9120 5559/10328/9121 5555/10315/9108
+f 5555/10315/9108 5559/10328/9121 10558/10329/9122 10559/10320/9113
+f 5554/10327/9120 11393/10303/9096 11392/10302/9095 5559/10328/9121
+f 5559/10328/9121 11392/10302/9095 13227/10306/9099 10558/10329/9122
+f 5560/10330/9123 5564/10331/9124 5565/10332/9125 5561/10333/9126
+f 5561/10333/9126 5565/10332/9125 11404/10334/9127 11405/10335/9128
+f 5564/10331/9124 10547/10336/9129 10548/10337/9130 5565/10332/9125
+f 5565/10332/9125 10548/10337/9130 13223/10338/9131 11404/10334/9127
+f 5560/10330/9123 5561/10333/9126 5566/10339/9132 5562/10340/9133
+f 5562/10340/9133 5566/10339/9132 11409/8428/191 11408/8427/190
+f 5561/10333/9126 11405/10335/9128 11406/10341/9134 5566/10339/9132
+f 5566/10339/9132 11406/10341/9134 13367/8429/185 11409/8428/191
+f 5560/10330/9123 5562/10340/9133 5567/10342/9135 5563/10343/9136
+f 5563/10343/9136 5567/10342/9135 11400/10325/9118 11399/10319/9112
+f 5562/10340/9133 11408/8427/190 11407/8436/203 5567/10342/9135
+f 5567/10342/9135 11407/8436/203 13366/8413/205 11400/10325/9118
+f 5560/10330/9123 5563/10343/9136 5568/10344/9137 5564/10331/9124
+f 5564/10331/9124 5568/10344/9137 10546/10345/9138 10547/10336/9129
+f 5563/10343/9136 11399/10319/9112 11398/10318/9111 5568/10344/9137
+f 5568/10344/9137 11398/10318/9111 13225/10322/9115 10546/10345/9138
+f 5569/10346/9139 5573/10347/9140 5574/10348/9141 5570/10349/9142
+f 5570/10349/9142 5574/10348/9141 11410/10350/9143 11411/10351/9144
+f 5573/10347/9140 10535/10352/9145 10536/10353/9146 5574/10348/9141
+f 5574/10348/9141 10536/10353/9146 13221/10354/9147 11410/10350/9143
+f 5569/10346/9139 5570/10349/9142 5575/10355/9148 5571/10356/9149
+f 5571/10356/9149 5575/10355/9148 11415/8444/171 11414/8443/170
+f 5570/10349/9142 11411/10351/9144 11412/10357/9150 5575/10355/9148
+f 5575/10355/9148 11412/10357/9150 13368/8445/165 11415/8444/171
+f 5569/10346/9139 5571/10356/9149 5576/10358/9151 5572/10359/9152
+f 5572/10359/9152 5576/10358/9151 11406/10341/9134 11405/10335/9128
+f 5571/10356/9149 11414/8443/170 11413/8452/183 5576/10358/9151
+f 5576/10358/9151 11413/8452/183 13367/8429/185 11406/10341/9134
+f 5569/10346/9139 5572/10359/9152 5577/10360/9153 5573/10347/9140
+f 5573/10347/9140 5577/10360/9153 10534/10361/9154 10535/10352/9145
+f 5572/10359/9152 11405/10335/9128 11404/10334/9127 5577/10360/9153
+f 5577/10360/9153 11404/10334/9127 13223/10338/9131 10534/10361/9154
+f 5578/10362/9155 5582/10363/9156 5583/10364/9157 5579/10365/9158
+f 5579/10365/9158 5583/10364/9157 11416/10366/9159 11417/10367/9160
+f 5582/10363/9156 10523/10368/9161 10524/10369/9162 5583/10364/9157
+f 5583/10364/9157 10524/10369/9162 13219/10370/9163 11416/10366/9159
+f 5578/10362/9155 5579/10365/9158 5584/10371/9164 5580/10372/9165
+f 5580/10372/9165 5584/10371/9164 11421/8460/151 11420/8459/150
+f 5579/10365/9158 11417/10367/9160 11418/10373/9166 5584/10371/9164
+f 5584/10371/9164 11418/10373/9166 13369/8461/145 11421/8460/151
+f 5578/10362/9155 5580/10372/9165 5585/10374/9167 5581/10375/9168
+f 5581/10375/9168 5585/10374/9167 11412/10357/9150 11411/10351/9144
+f 5580/10372/9165 11420/8459/150 11419/8468/163 5585/10374/9167
+f 5585/10374/9167 11419/8468/163 13368/8445/165 11412/10357/9150
+f 5578/10362/9155 5581/10375/9168 5586/10376/9169 5582/10363/9156
+f 5582/10363/9156 5586/10376/9169 10522/10377/9170 10523/10368/9161
+f 5581/10375/9168 11411/10351/9144 11410/10350/9143 5586/10376/9169
+f 5586/10376/9169 11410/10350/9143 13221/10354/9147 10522/10377/9170
+f 5587/10378/9171 5591/10379/9172 5592/10380/9173 5588/10381/9174
+f 5588/10381/9174 5592/10380/9173 11422/10382/9175 11423/10383/9176
+f 5591/10379/9172 10511/10384/9177 10512/10385/9178 5592/10380/9173
+f 5592/10380/9173 10512/10385/9178 13217/10386/9179 11422/10382/9175
+f 5587/10378/9171 5588/10381/9174 5593/10387/9180 5589/10388/9181
+f 5589/10388/9181 5593/10387/9180 11427/8476/131 11426/8475/130
+f 5588/10381/9174 11423/10383/9176 11424/10389/9182 5593/10387/9180
+f 5593/10387/9180 11424/10389/9182 13370/8477/125 11427/8476/131
+f 5587/10378/9171 5589/10388/9181 5594/10390/9183 5590/10391/9184
+f 5590/10391/9184 5594/10390/9183 11418/10373/9166 11417/10367/9160
+f 5589/10388/9181 11426/8475/130 11425/8484/143 5594/10390/9183
+f 5594/10390/9183 11425/8484/143 13369/8461/145 11418/10373/9166
+f 5587/10378/9171 5590/10391/9184 5595/10392/9185 5591/10379/9172
+f 5591/10379/9172 5595/10392/9185 10510/10393/9186 10511/10384/9177
+f 5590/10391/9184 11417/10367/9160 11416/10366/9159 5595/10392/9185
+f 5595/10392/9185 11416/10366/9159 13219/10370/9163 10510/10393/9186
+f 5596/10394/9187 5600/10395/9188 5601/10396/9189 5597/10397/9190
+f 5597/10397/9190 5601/10396/9189 11428/10398/9191 11429/10399/9192
+f 5600/10395/9188 10499/10400/9193 10500/10401/9194 5601/10396/9189
+f 5601/10396/9189 10500/10401/9194 13215/10402/9195 11428/10398/9191
+f 5596/10394/9187 5597/10397/9190 5602/10403/9196 5598/10404/9197
+f 5598/10404/9197 5602/10403/9196 11433/8492/6244 11432/8491/6245
+f 5597/10397/9190 11429/10399/9192 11430/10405/9198 5602/10403/9196
+f 5602/10403/9196 11430/10405/9198 13371/8493/6247 11433/8492/6244
+f 5596/10394/9187 5598/10404/9197 5603/10406/9199 5599/10407/9200
+f 5599/10407/9200 5603/10406/9199 11424/10389/9182 11423/10383/9176
+f 5598/10404/9197 11432/8491/6245 11431/8500/6249 5603/10406/9199
+f 5603/10406/9199 11431/8500/6249 13370/8477/125 11424/10389/9182
+f 5596/10394/9187 5599/10407/9200 5604/10408/9201 5600/10395/9188
+f 5600/10395/9188 5604/10408/9201 10498/10409/9202 10499/10400/9193
+f 5599/10407/9200 11423/10383/9176 11422/10382/9175 5604/10408/9201
+f 5604/10408/9201 11422/10382/9175 13217/10386/9179 10498/10409/9202
+f 5605/10410/9203 5609/10411/9204 5610/10412/9205 5606/10413/9206
+f 5606/10413/9206 5610/10412/9205 11434/10414/9207 11435/10415/9208
+f 5609/10411/9204 11178/10416/9209 11179/10417/9210 5610/10412/9205
+f 5610/10412/9205 11179/10417/9210 13329/10418/9211 11434/10414/9207
+f 5605/10410/9203 5606/10413/9206 5611/10419/9212 5607/10420/9213
+f 5607/10420/9213 5611/10419/9212 11439/9823/8595 11438/9822/8592
+f 5606/10413/9206 11435/10415/9208 11436/10421/9214 5611/10419/9212
+f 5611/10419/9212 11436/10421/9214 13372/8509/90 11439/9823/8595
+f 5605/10410/9203 5607/10420/9213 5612/10422/9215 5608/10423/9216
+f 5608/10423/9216 5612/10422/9215 11430/10405/9198 11429/10399/9192
+f 5607/10420/9213 11438/9822/8592 11437/9829/8591 5612/10422/9215
+f 5612/10422/9215 11437/9829/8591 13371/8493/6247 11430/10405/9198
+f 5605/10410/9203 5608/10423/9216 5613/10424/9217 5609/10411/9204
+f 5609/10411/9204 5613/10424/9217 11177/10425/9218 11178/10416/9209
+f 5608/10423/9216 11429/10399/9192 11428/10398/9191 5613/10424/9217
+f 5613/10424/9217 11428/10398/9191 13215/10402/9195 11177/10425/9218
+f 5614/10426/9219 5618/10427/9220 5619/10428/9221 5615/10429/9222
+f 5615/10429/9222 5619/10428/9221 11248/10430/9223 11249/10431/9224
+f 5618/10427/9220 10487/10432/9225 10488/10433/9226 5619/10428/9221
+f 5619/10428/9221 10488/10433/9226 13214/10434/9227 11248/10430/9223
+f 5614/10426/9219 5615/10429/9222 5620/10435/9228 5616/10436/9229
+f 5616/10436/9229 5620/10435/9228 11442/8514/7040 11441/8506/7036
+f 5615/10429/9222 11249/10431/9224 11250/10437/9230 5620/10435/9228
+f 5620/10435/9228 11250/10437/9230 13341/8515/7041 11442/8514/7040
+f 5614/10426/9219 5616/10436/9229 5621/10438/9231 5617/10439/9232
+f 5617/10439/9232 5621/10438/9231 11436/10421/9214 11435/10415/9208
+f 5616/10436/9229 11441/8506/7036 11440/8505/7035 5621/10438/9231
+f 5621/10438/9231 11440/8505/7035 13372/8509/90 11436/10421/9214
+f 5614/10426/9219 5617/10439/9232 5622/10440/9233 5618/10427/9220
+f 5618/10427/9220 5622/10440/9233 10486/10441/9234 10487/10432/9225
+f 5617/10439/9232 11435/10415/9208 11434/10414/9207 5622/10440/9233
+f 5622/10440/9233 11434/10414/9207 13329/10418/9211 10486/10441/9234
+f 5623/10442/9235 5627/10443/9236 5628/10444/9237 5624/10445/9238
+f 5624/10445/9238 5628/10444/9237 10372/10446/9239 10373/10447/9240
+f 5627/10443/9236 11450/7322/6521 11449/7321/6520 5628/10444/9237
+f 5628/10444/9237 11449/7321/6520 13373/7324/6523 10372/10446/9239
+f 5623/10442/9235 5624/10445/9238 5629/10448/9241 5625/10449/9242
+f 5625/10449/9242 5629/10448/9241 10380/7564/6739 10379/7563/6738
+f 5624/10445/9238 10373/10447/9240 10374/10450/9243 5629/10448/9241
+f 5629/10448/9241 10374/10450/9243 13196/7565/6740 10380/7564/6739
+f 5623/10442/9235 5625/10449/9242 5630/10451/6749 5626/10452/9244
+f 5626/10452/9244 5630/10451/6749 11446/10453/5474 11447/10454/5474
+f 5625/10449/9242 10379/7563/6738 10378/7574/6749 5630/10451/6749
+f 5630/10451/6749 10378/7574/6749 13197/7576/5474 11446/10453/5474
+f 5623/10442/9235 5626/10452/9244 5631/10455/9244 5627/10443/9236
+f 5627/10443/9236 5631/10455/9244 11451/7327/6524 11450/7322/6521
+f 5626/10452/9244 11447/10454/5474 11448/10456/5474 5631/10455/9244
+f 5631/10455/9244 11448/10456/5474 13374/6470/5474 11451/7327/6524
+f 5632/10457/9245 5636/10458/9246 5637/10459/9247 5633/10460/9248
+f 5633/10460/9248 5637/10459/9247 11457/6475/5474 11456/6468/5474
+f 5636/10458/9246 11453/10461/9249 11454/10462/9250 5637/10459/9247
+f 5637/10459/9247 11454/10462/9250 13375/6476/5474 11457/6475/5474
+f 5632/10457/9245 5633/10460/9248 5638/10463/5474 5634/10464/9248
+f 5634/10464/9248 5638/10463/5474 11448/10456/5474 11447/10454/5474
+f 5633/10460/9248 11456/6468/5474 11455/6467/5474 5638/10463/5474
+f 5638/10463/5474 11455/6467/5474 13374/6470/5474 11448/10456/5474
+f 5632/10457/9245 5634/10464/9248 5639/10465/9251 5635/10466/9252
+f 5635/10466/9252 5639/10465/9251 10386/7588/6762 10385/7582/6756
+f 5634/10464/9248 11447/10454/5474 11446/10453/5474 5639/10465/9251
+f 5639/10465/9251 11446/10453/5474 13197/7576/5474 10386/7588/6762
+f 5632/10457/9245 5635/10466/9252 5640/10467/9253 5636/10458/9246
+f 5636/10458/9246 5640/10467/9253 11452/10468/9254 11453/10461/9249
+f 5635/10466/9252 10385/7582/6756 10384/7581/6755 5640/10467/9253
+f 5640/10467/9253 10384/7581/6755 13198/7585/6759 11452/10468/9254
+f 5641/10469/9255 5645/10470/9256 5646/10471/9257 5642/10472/9257
+f 5642/10472/9257 5646/10471/9257 11463/7851/5474 11462/7846/5474
+f 5645/10470/9256 10727/10473/9258 10728/10474/9257 5646/10471/9257
+f 5646/10471/9257 10728/10474/9257 13376/7852/5474 11463/7851/5474
+f 5641/10469/9255 5642/10472/9257 5647/10475/9259 5643/10476/9260
+f 5643/10476/9260 5647/10475/9259 11454/10462/9250 11453/10461/9249
+f 5642/10472/9257 11462/7846/5474 11461/7845/5474 5647/10475/9259
+f 5647/10475/9259 11461/7845/5474 13375/6476/5474 11454/10462/9250
+f 5641/10469/9255 5643/10476/9260 5648/10477/9261 5644/10478/9262
+f 5644/10478/9262 5648/10477/9261 10479/7862/7028 10478/7861/7027
+f 5643/10476/9260 11453/10461/9249 11452/10468/9254 5648/10477/9261
+f 5648/10477/9261 11452/10468/9254 13198/7585/6759 10479/7862/7028
+f 5641/10469/9255 5644/10478/9262 5649/10479/9263 5645/10470/9256
+f 5645/10470/9256 5649/10479/9263 10726/10480/9264 10727/10473/9258
+f 5644/10478/9262 10478/7861/7027 10477/7874/7039 5649/10479/9263
+f 5649/10479/9263 10477/7874/7039 13253/7876/7041 10726/10480/9264
+f 5650/10481/9258 5654/10482/9258 5655/10483/9257 5651/10484/9257
+f 5651/10484/9257 5655/10483/9257 11469/8539/5474 11468/8536/5474
+f 5654/10482/9258 11255/10485/9258 11256/10486/9257 5655/10483/9257
+f 5655/10483/9257 11256/10486/9257 13377/8540/5474 11469/8539/5474
+f 5650/10481/9258 5651/10484/9257 5656/10487/9257 5652/10488/9258
+f 5652/10488/9258 5656/10487/9257 10728/10474/9257 10727/10473/9258
+f 5651/10484/9257 11468/8536/5474 11467/8535/5474 5656/10487/9257
+f 5656/10487/9257 11467/8535/5474 13376/7852/5474 10728/10474/9257
+f 5650/10481/9258 5652/10488/9258 5657/10489/9264 5653/10490/9264
+f 5653/10490/9264 5657/10489/9264 10719/8518/7041 10718/8513/7041
+f 5652/10488/9258 10727/10473/9258 10726/10480/9264 5657/10489/9264
+f 5657/10489/9264 10726/10480/9264 13253/7876/7041 10719/8518/7041
+f 5650/10481/9258 5653/10490/9264 5658/10491/9264 5654/10482/9258
+f 5654/10482/9258 5658/10491/9264 11254/10492/9264 11255/10485/9258
+f 5653/10490/9264 10718/8513/7041 10717/8512/7041 5658/10491/9264
+f 5658/10491/9264 10717/8512/7041 13341/8515/7041 11254/10492/9264
+f 5659/10493/9265 5663/10494/9266 5664/10495/9267 5660/10496/9268
+f 5660/10496/9268 5664/10495/9267 11475/9994/8792 11474/9991/8790
+f 5663/10494/9266 11471/10497/9269 11472/10498/9270 5664/10495/9267
+f 5664/10495/9267 11472/10498/9270 13378/9995/5748 11475/9994/8792
+f 5659/10493/9265 5660/10496/9268 5665/10499/9271 5661/10500/9272
+f 5661/10500/9272 5665/10499/9271 11256/10486/9257 11255/10485/9258
+f 5660/10496/9268 11474/9991/8790 11473/9990/8789 5665/10499/9271
+f 5665/10499/9271 11473/9990/8789 13377/8540/5474 11256/10486/9257
+f 5659/10493/9265 5661/10500/9272 5666/10501/9273 5662/10502/9274
+f 5662/10502/9274 5666/10501/9273 11250/10437/9230 11249/10431/9224
+f 5661/10500/9272 11255/10485/9258 11254/10492/9264 5666/10501/9273
+f 5666/10501/9273 11254/10492/9264 13341/8515/7041 11250/10437/9230
+f 5659/10493/9265 5662/10502/9274 5667/10503/9275 5663/10494/9266
+f 5663/10494/9266 5667/10503/9275 11470/10504/9276 11471/10497/9269
+f 5662/10502/9274 11249/10431/9224 11248/10430/9223 5667/10503/9275
+f 5667/10503/9275 11248/10430/9223 13214/10434/9227 11470/10504/9276
+f 5668/10505/9277 5672/10506/9278 5673/10507/9279 5669/10508/9280
+f 5669/10508/9280 5673/10507/9279 11481/6502/5751 11480/6497/5746
+f 5672/10506/9278 11187/10509/9281 11188/10510/9282 5673/10507/9279
+f 5673/10507/9279 11188/10510/9282 13379/6503/5752 11481/6502/5751
+f 5668/10505/9277 5669/10508/9280 5674/10511/9283 5670/10512/9284
+f 5670/10512/9284 5674/10511/9283 11472/10513/9270 11471/10514/9269
+f 5669/10508/9280 11480/6497/5746 11479/6496/5745 5674/10511/9283
+f 5674/10511/9283 11479/6496/5745 13378/6499/5748 11472/10513/9270
+f 5668/10505/9277 5670/10512/9284 5675/10515/9285 5671/10516/9286
+f 5671/10516/9286 5675/10515/9285 10488/10433/9226 10487/10432/9225
+f 5670/10512/9284 11471/10514/9269 11470/10517/9276 5675/10515/9285
+f 5675/10515/9285 11470/10517/9276 13214/10434/9227 10488/10433/9226
+f 5668/10505/9277 5671/10516/9286 5676/10518/9287 5672/10506/9278
+f 5672/10506/9278 5676/10518/9287 11186/10519/9288 11187/10509/9281
+f 5671/10516/9286 10487/10432/9225 10486/10441/9234 5676/10518/9287
+f 5676/10518/9287 10486/10441/9234 13329/10418/9211 11186/10519/9288
+f 5677/10520/9289 5681/10521/9290 5682/10522/9291 5678/10523/9292
+f 5678/10523/9292 5682/10522/9291 11485/10524/9293 11486/10525/9294
+f 5681/10521/9290 11483/10526/9295 11484/10527/9296 5682/10522/9291
+f 5682/10522/9291 11484/10527/9296 13380/10528/9297 11485/10524/9293
+f 5677/10520/9289 5678/10523/9292 5683/10529/9298 5679/10530/9299
+f 5679/10530/9299 5683/10529/9298 11188/10510/9282 11187/10509/9281
+f 5678/10523/9292 11486/10525/9294 11487/10531/9300 5683/10529/9298
+f 5683/10529/9298 11487/10531/9300 13379/6503/5752 11188/10510/9282
+f 5677/10520/9289 5679/10530/9299 5684/10532/9301 5680/10533/9302
+f 5680/10533/9302 5684/10532/9301 11179/10417/9210 11178/10416/9209
+f 5679/10530/9299 11187/10509/9281 11186/10519/9288 5684/10532/9301
+f 5684/10532/9301 11186/10519/9288 13329/10418/9211 11179/10417/9210
+f 5677/10520/9289 5680/10533/9302 5685/10534/9303 5681/10521/9290
+f 5681/10521/9290 5685/10534/9303 11482/10535/9304 11483/10526/9295
+f 5680/10533/9302 11178/10416/9209 11177/10425/9218 5685/10534/9303
+f 5685/10534/9303 11177/10425/9218 13215/10402/9195 11482/10535/9304
+f 5686/10536/9305 5690/10537/9306 5691/10538/9307 5687/10539/9308
+f 5687/10539/9308 5691/10538/9307 11491/10540/9309 11492/10541/9310
+f 5690/10537/9306 11489/10542/9311 11490/10543/9312 5691/10538/9307
+f 5691/10538/9307 11490/10543/9312 13381/10544/9313 11491/10540/9309
+f 5686/10536/9305 5687/10539/9308 5692/10545/9314 5688/10546/9315
+f 5688/10546/9315 5692/10545/9314 11484/10527/9296 11483/10526/9295
+f 5687/10539/9308 11492/10541/9310 11493/10547/9316 5692/10545/9314
+f 5692/10545/9314 11493/10547/9316 13380/10528/9297 11484/10527/9296
+f 5686/10536/9305 5688/10546/9315 5693/10548/9317 5689/10549/9318
+f 5689/10549/9318 5693/10548/9317 10500/10401/9194 10499/10400/9193
+f 5688/10546/9315 11483/10526/9295 11482/10535/9304 5693/10548/9317
+f 5693/10548/9317 11482/10535/9304 13215/10402/9195 10500/10401/9194
+f 5686/10536/9305 5689/10549/9318 5694/10550/9319 5690/10537/9306
+f 5690/10537/9306 5694/10550/9319 11488/10551/9320 11489/10542/9311
+f 5689/10549/9318 10499/10400/9193 10498/10409/9202 5694/10550/9319
+f 5694/10550/9319 10498/10409/9202 13217/10386/9179 11488/10551/9320
+f 5695/10552/9321 5699/10553/9322 5700/10554/9323 5696/10555/9324
+f 5696/10555/9324 5700/10554/9323 11497/10556/9325 11498/10557/9326
+f 5699/10553/9322 11495/10558/9327 11496/10559/9328 5700/10554/9323
+f 5700/10554/9323 11496/10559/9328 13382/10560/9329 11497/10556/9325
+f 5695/10552/9321 5696/10555/9324 5701/10561/9330 5697/10562/9331
+f 5697/10562/9331 5701/10561/9330 11490/10543/9312 11489/10542/9311
+f 5696/10555/9324 11498/10557/9326 11499/10563/9332 5701/10561/9330
+f 5701/10561/9330 11499/10563/9332 13381/10544/9313 11490/10543/9312
+f 5695/10552/9321 5697/10562/9331 5702/10564/9333 5698/10565/9334
+f 5698/10565/9334 5702/10564/9333 10512/10385/9178 10511/10384/9177
+f 5697/10562/9331 11489/10542/9311 11488/10551/9320 5702/10564/9333
+f 5702/10564/9333 11488/10551/9320 13217/10386/9179 10512/10385/9178
+f 5695/10552/9321 5698/10565/9334 5703/10566/9335 5699/10553/9322
+f 5699/10553/9322 5703/10566/9335 11494/10567/9336 11495/10558/9327
+f 5698/10565/9334 10511/10384/9177 10510/10393/9186 5703/10566/9335
+f 5703/10566/9335 10510/10393/9186 13219/10370/9163 11494/10567/9336
+f 5704/10568/9337 5708/10569/9338 5709/10570/9339 5705/10571/9340
+f 5705/10571/9340 5709/10570/9339 11503/10572/9341 11504/10573/9342
+f 5708/10569/9338 11501/10574/9343 11502/10575/9344 5709/10570/9339
+f 5709/10570/9339 11502/10575/9344 13383/10576/9345 11503/10572/9341
+f 5704/10568/9337 5705/10571/9340 5710/10577/9346 5706/10578/9347
+f 5706/10578/9347 5710/10577/9346 11496/10559/9328 11495/10558/9327
+f 5705/10571/9340 11504/10573/9342 11505/10579/9348 5710/10577/9346
+f 5710/10577/9346 11505/10579/9348 13382/10560/9329 11496/10559/9328
+f 5704/10568/9337 5706/10578/9347 5711/10580/9349 5707/10581/9350
+f 5707/10581/9350 5711/10580/9349 10524/10369/9162 10523/10368/9161
+f 5706/10578/9347 11495/10558/9327 11494/10567/9336 5711/10580/9349
+f 5711/10580/9349 11494/10567/9336 13219/10370/9163 10524/10369/9162
+f 5704/10568/9337 5707/10581/9350 5712/10582/9351 5708/10569/9338
+f 5708/10569/9338 5712/10582/9351 11500/10583/9352 11501/10574/9343
+f 5707/10581/9350 10523/10368/9161 10522/10377/9170 5712/10582/9351
+f 5712/10582/9351 10522/10377/9170 13221/10354/9147 11500/10583/9352
+f 5713/10584/9353 5717/10585/9354 5718/10586/9355 5714/10587/9356
+f 5714/10587/9356 5718/10586/9355 11509/10588/9357 11510/10589/9358
+f 5717/10585/9354 11507/10590/9359 11508/10591/9360 5718/10586/9355
+f 5718/10586/9355 11508/10591/9360 13384/10592/9361 11509/10588/9357
+f 5713/10584/9353 5714/10587/9356 5719/10593/9362 5715/10594/9363
+f 5715/10594/9363 5719/10593/9362 11502/10575/9344 11501/10574/9343
+f 5714/10587/9356 11510/10589/9358 11511/10595/9364 5719/10593/9362
+f 5719/10593/9362 11511/10595/9364 13383/10576/9345 11502/10575/9344
+f 5713/10584/9353 5715/10594/9363 5720/10596/9365 5716/10597/9366
+f 5716/10597/9366 5720/10596/9365 10536/10353/9146 10535/10352/9145
+f 5715/10594/9363 11501/10574/9343 11500/10583/9352 5720/10596/9365
+f 5720/10596/9365 11500/10583/9352 13221/10354/9147 10536/10353/9146
+f 5713/10584/9353 5716/10597/9366 5721/10598/9367 5717/10585/9354
+f 5717/10585/9354 5721/10598/9367 11506/10599/9368 11507/10590/9359
+f 5716/10597/9366 10535/10352/9145 10534/10361/9154 5721/10598/9367
+f 5721/10598/9367 10534/10361/9154 13223/10338/9131 11506/10599/9368
+f 5722/10600/9369 5726/10601/9370 5727/10602/9371 5723/10603/9372
+f 5723/10603/9372 5727/10602/9371 11515/10604/9373 11516/10605/9374
+f 5726/10601/9370 11513/10606/9375 11514/10607/9376 5727/10602/9371
+f 5727/10602/9371 11514/10607/9376 13385/10608/9377 11515/10604/9373
+f 5722/10600/9369 5723/10603/9372 5728/10609/9378 5724/10610/9379
+f 5724/10610/9379 5728/10609/9378 11508/10591/9360 11507/10590/9359
+f 5723/10603/9372 11516/10605/9374 11517/10611/9380 5728/10609/9378
+f 5728/10609/9378 11517/10611/9380 13384/10592/9361 11508/10591/9360
+f 5722/10600/9369 5724/10610/9379 5729/10612/9381 5725/10613/9382
+f 5725/10613/9382 5729/10612/9381 10548/10337/9130 10547/10336/9129
+f 5724/10610/9379 11507/10590/9359 11506/10599/9368 5729/10612/9381
+f 5729/10612/9381 11506/10599/9368 13223/10338/9131 10548/10337/9130
+f 5722/10600/9369 5725/10613/9382 5730/10614/9383 5726/10601/9370
+f 5726/10601/9370 5730/10614/9383 11512/10615/9384 11513/10606/9375
+f 5725/10613/9382 10547/10336/9129 10546/10345/9138 5730/10614/9383
+f 5730/10614/9383 10546/10345/9138 13225/10322/9115 11512/10615/9384
+f 5731/10616/9385 5735/10617/9386 5736/10618/9387 5732/10619/9388
+f 5732/10619/9388 5736/10618/9387 11521/10620/9389 11522/10621/9390
+f 5735/10617/9386 11519/10622/9391 11520/10623/9392 5736/10618/9387
+f 5736/10618/9387 11520/10623/9392 13386/10624/9393 11521/10620/9389
+f 5731/10616/9385 5732/10619/9388 5737/10625/9394 5733/10626/9395
+f 5733/10626/9395 5737/10625/9394 11514/10607/9376 11513/10606/9375
+f 5732/10619/9388 11522/10621/9390 11523/10627/9396 5737/10625/9394
+f 5737/10625/9394 11523/10627/9396 13385/10608/9377 11514/10607/9376
+f 5731/10616/9385 5733/10626/9395 5738/10628/9397 5734/10629/9398
+f 5734/10629/9398 5738/10628/9397 10560/10321/9114 10559/10320/9113
+f 5733/10626/9395 11513/10606/9375 11512/10615/9384 5738/10628/9397
+f 5738/10628/9397 11512/10615/9384 13225/10322/9115 10560/10321/9114
+f 5731/10616/9385 5734/10629/9398 5739/10630/9399 5735/10617/9386
+f 5735/10617/9386 5739/10630/9399 11518/10631/9400 11519/10622/9391
+f 5734/10629/9398 10559/10320/9113 10558/10329/9122 5739/10630/9399
+f 5739/10630/9399 10558/10329/9122 13227/10306/9099 11518/10631/9400
+f 5740/10632/9401 5744/10633/9402 5745/10634/9403 5741/10635/9404
+f 5741/10635/9404 5745/10634/9403 11527/10636/9405 11528/10637/9406
+f 5744/10633/9402 11525/10638/9407 11526/10639/9408 5745/10634/9403
+f 5745/10634/9403 11526/10639/9408 13387/10640/9409 11527/10636/9405
+f 5740/10632/9401 5741/10635/9404 5746/10641/9410 5742/10642/9411
+f 5742/10642/9411 5746/10641/9410 11520/10623/9392 11519/10622/9391
+f 5741/10635/9404 11528/10637/9406 11529/10643/9412 5746/10641/9410
+f 5746/10641/9410 11529/10643/9412 13386/10624/9393 11520/10623/9392
+f 5740/10632/9401 5742/10642/9411 5747/10644/9413 5743/10645/9414
+f 5743/10645/9414 5747/10644/9413 10572/10305/9098 10571/10304/9097
+f 5742/10642/9411 11519/10622/9391 11518/10631/9400 5747/10644/9413
+f 5747/10644/9413 11518/10631/9400 13227/10306/9099 10572/10305/9098
+f 5740/10632/9401 5743/10645/9414 5748/10646/9415 5744/10633/9402
+f 5744/10633/9402 5748/10646/9415 11524/10647/9416 11525/10638/9407
+f 5743/10645/9414 10571/10304/9097 10570/10313/9106 5748/10646/9415
+f 5748/10646/9415 10570/10313/9106 13229/10290/9083 11524/10647/9416
+f 5749/10648/9417 5753/10649/9418 5754/10650/9419 5750/10651/9420
+f 5750/10651/9420 5754/10650/9419 11533/10652/9421 11534/10653/9422
+f 5753/10649/9418 11531/10654/9423 11532/10655/9424 5754/10650/9419
+f 5754/10650/9419 11532/10655/9424 13388/10656/9425 11533/10652/9421
+f 5749/10648/9417 5750/10651/9420 5755/10657/9426 5751/10658/9427
+f 5751/10658/9427 5755/10657/9426 11526/10639/9408 11525/10638/9407
+f 5750/10651/9420 11534/10653/9422 11535/10659/9428 5755/10657/9426
+f 5755/10657/9426 11535/10659/9428 13387/10640/9409 11526/10639/9408
+f 5749/10648/9417 5751/10658/9427 5756/10660/9429 5752/10661/9430
+f 5752/10661/9430 5756/10660/9429 10584/10289/9082 10583/10288/9081
+f 5751/10658/9427 11525/10638/9407 11524/10647/9416 5756/10660/9429
+f 5756/10660/9429 11524/10647/9416 13229/10290/9083 10584/10289/9082
+f 5749/10648/9417 5752/10661/9430 5757/10662/9431 5753/10649/9418
+f 5753/10649/9418 5757/10662/9431 11530/10663/9432 11531/10654/9423
+f 5752/10661/9430 10583/10288/9081 10582/10297/9090 5757/10662/9431
+f 5757/10662/9431 10582/10297/9090 13231/10274/9067 11530/10663/9432
+f 5758/10664/9433 5762/10665/9434 5763/10666/9435 5759/10667/9436
+f 5759/10667/9436 5763/10666/9435 11539/10668/9437 11540/10669/9438
+f 5762/10665/9434 11537/10670/9439 11538/10671/9440 5763/10666/9435
+f 5763/10666/9435 11538/10671/9440 13389/10672/9441 11539/10668/9437
+f 5758/10664/9433 5759/10667/9436 5764/10673/9442 5760/10674/9443
+f 5760/10674/9443 5764/10673/9442 11532/10655/9424 11531/10654/9423
+f 5759/10667/9436 11540/10669/9438 11541/10675/9444 5764/10673/9442
+f 5764/10673/9442 11541/10675/9444 13388/10656/9425 11532/10655/9424
+f 5758/10664/9433 5760/10674/9443 5765/10676/9445 5761/10677/9446
+f 5761/10677/9446 5765/10676/9445 10596/10273/9066 10595/10272/9065
+f 5760/10674/9443 11531/10654/9423 11530/10663/9432 5765/10676/9445
+f 5765/10676/9445 11530/10663/9432 13231/10274/9067 10596/10273/9066
+f 5758/10664/9433 5761/10677/9446 5766/10678/9447 5762/10665/9434
+f 5762/10665/9434 5766/10678/9447 11536/10679/9448 11537/10670/9439
+f 5761/10677/9446 10595/10272/9065 10594/10281/9074 5766/10678/9447
+f 5766/10678/9447 10594/10281/9074 13233/10258/9051 11536/10679/9448
+f 5767/10680/9449 5771/10681/9450 5772/10682/9451 5768/10683/9452
+f 5768/10683/9452 5772/10682/9451 11545/10684/9453 11546/10685/9454
+f 5771/10681/9450 11543/10686/9455 11544/10687/9456 5772/10682/9451
+f 5772/10682/9451 11544/10687/9456 13390/10688/9457 11545/10684/9453
+f 5767/10680/9449 5768/10683/9452 5773/10689/9458 5769/10690/9459
+f 5769/10690/9459 5773/10689/9458 11538/10671/9440 11537/10670/9439
+f 5768/10683/9452 11546/10685/9454 11547/10691/9460 5773/10689/9458
+f 5773/10689/9458 11547/10691/9460 13389/10672/9441 11538/10671/9440
+f 5767/10680/9449 5769/10690/9459 5774/10692/9461 5770/10693/9462
+f 5770/10693/9462 5774/10692/9461 10608/10257/9050 10607/10256/9049
+f 5769/10690/9459 11537/10670/9439 11536/10679/9448 5774/10692/9461
+f 5774/10692/9461 11536/10679/9448 13233/10258/9051 10608/10257/9050
+f 5767/10680/9449 5770/10693/9462 5775/10694/9463 5771/10681/9450
+f 5771/10681/9450 5775/10694/9463 11542/10695/9464 11543/10686/9455
+f 5770/10693/9462 10607/10256/9049 10606/10265/9058 5775/10694/9463
+f 5775/10694/9463 10606/10265/9058 13235/10242/9035 11542/10695/9464
+f 5776/10696/9465 5780/10697/9466 5781/10698/9467 5777/10699/9468
+f 5777/10699/9468 5781/10698/9467 11551/10700/9469 11552/10701/9470
+f 5780/10697/9466 11549/10702/9471 11550/10703/9472 5781/10698/9467
+f 5781/10698/9467 11550/10703/9472 13391/10704/9473 11551/10700/9469
+f 5776/10696/9465 5777/10699/9468 5782/10705/9474 5778/10706/9475
+f 5778/10706/9475 5782/10705/9474 11544/10687/9456 11543/10686/9455
+f 5777/10699/9468 11552/10701/9470 11553/10707/9476 5782/10705/9474
+f 5782/10705/9474 11553/10707/9476 13390/10688/9457 11544/10687/9456
+f 5776/10696/9465 5778/10706/9475 5783/10708/9477 5779/10709/9478
+f 5779/10709/9478 5783/10708/9477 10620/10241/9034 10619/10240/9033
+f 5778/10706/9475 11543/10686/9455 11542/10695/9464 5783/10708/9477
+f 5783/10708/9477 11542/10695/9464 13235/10242/9035 10620/10241/9034
+f 5776/10696/9465 5779/10709/9478 5784/10710/9479 5780/10697/9466
+f 5780/10697/9466 5784/10710/9479 11548/10711/9480 11549/10702/9471
+f 5779/10709/9478 10619/10240/9033 10618/10249/9042 5784/10710/9479
+f 5784/10710/9479 10618/10249/9042 13237/10226/9019 11548/10711/9480
+f 5785/10712/9481 5789/10713/9482 5790/10714/9483 5786/10715/9484
+f 5786/10715/9484 5790/10714/9483 11557/10716/9485 11558/10717/9486
+f 5789/10713/9482 11555/10718/9487 11556/10719/9488 5790/10714/9483
+f 5790/10714/9483 11556/10719/9488 13392/10720/9489 11557/10716/9485
+f 5785/10712/9481 5786/10715/9484 5791/10721/9490 5787/10722/9491
+f 5787/10722/9491 5791/10721/9490 11550/10703/9472 11549/10702/9471
+f 5786/10715/9484 11558/10717/9486 11559/10723/9492 5791/10721/9490
+f 5791/10721/9490 11559/10723/9492 13391/10704/9473 11550/10703/9472
+f 5785/10712/9481 5787/10722/9491 5792/10724/9493 5788/10725/9494
+f 5788/10725/9494 5792/10724/9493 10632/10225/9018 10631/10224/9017
+f 5787/10722/9491 11549/10702/9471 11548/10711/9480 5792/10724/9493
+f 5792/10724/9493 11548/10711/9480 13237/10226/9019 10632/10225/9018
+f 5785/10712/9481 5788/10725/9494 5793/10726/9495 5789/10713/9482
+f 5789/10713/9482 5793/10726/9495 11554/10727/9496 11555/10718/9487
+f 5788/10725/9494 10631/10224/9017 10630/10233/9026 5793/10726/9495
+f 5793/10726/9495 10630/10233/9026 13239/10210/9003 11554/10727/9496
+f 5794/10728/9497 5798/10729/9498 5799/10730/9499 5795/10731/9500
+f 5795/10731/9500 5799/10730/9499 11560/10732/9501 11561/10733/9502
+f 5798/10729/9498 9377/4820/4347 9376/4819/4346 5799/10730/9499
+f 5799/10730/9499 9376/4819/4346 13023/4823/4350 11560/10732/9501
+f 5794/10728/9497 5795/10731/9500 5800/10734/9503 5796/10735/9504
+f 5796/10735/9504 5800/10734/9503 11556/10719/9488 11555/10718/9487
+f 5795/10731/9500 11561/10733/9502 11562/10736/9505 5800/10734/9503
+f 5800/10734/9503 11562/10736/9505 13392/10720/9489 11556/10719/9488
+f 5794/10728/9497 5796/10735/9504 5801/10737/9506 5797/10738/9507
+f 5797/10738/9507 5801/10737/9506 10638/10209/9002 10637/10208/9001
+f 5796/10735/9504 11555/10718/9487 11554/10727/9496 5801/10737/9506
+f 5801/10737/9506 11554/10727/9496 13239/10210/9003 10638/10209/9002
+f 5794/10728/9497 5797/10738/9507 5802/10739/9508 5798/10729/9498
+f 5798/10729/9498 5802/10739/9508 9378/4826/4353 9377/4820/4347
+f 5797/10738/9507 10637/10208/9001 10636/10217/9010 5802/10739/9508
+f 5802/10739/9508 10636/10217/9010 12871/4331/3882 9378/4826/4353
+f 5803/10740/9509 5807/10741/9510 5808/10742/9511 5804/10743/9512
+f 5804/10743/9512 5808/10742/9511 10494/10744/7743 10493/10745/7735
+f 5807/10741/9510 11567/10746/9513 11568/10747/9514 5808/10742/9511
+f 5808/10742/9511 11568/10747/9514 13216/10748/7744 10494/10744/7743
+f 5803/10740/9509 5804/10743/9512 5809/10749/9515 5805/10750/9516
+f 5805/10750/9516 5809/10749/9515 11563/10751/9517 11564/10752/9518
+f 5804/10743/9512 10493/10745/7735 10492/10753/7734 5809/10749/9515
+f 5809/10749/9515 10492/10753/7734 13213/10754/7738 11563/10751/9517
+f 5803/10740/9509 5805/10750/9516 5810/10755/9519 5806/10756/9520
+f 5806/10756/9520 5810/10755/9519 11797/10757/6244 11798/10758/6245
+f 5805/10750/9516 11564/10752/9518 11565/10759/9521 5810/10755/9519
+f 5810/10755/9519 11565/10759/9521 13424/10760/6247 11797/10757/6244
+f 5803/10740/9509 5806/10756/9520 5811/10761/9522 5807/10741/9510
+f 5807/10741/9510 5811/10761/9522 11566/10762/9523 11567/10746/9513
+f 5806/10756/9520 11798/10758/6245 11799/10763/6249 5811/10761/9522
+f 5811/10761/9522 11799/10763/6249 13425/10764/125 11566/10762/9523
+f 5812/10765/9524 5816/10766/9525 5817/10767/9526 5813/10768/9527
+f 5813/10768/9527 5817/10767/9526 11493/10769/9316 11492/10770/9310
+f 5816/10766/9525 11573/10771/9528 11574/10772/9529 5817/10767/9526
+f 5817/10767/9526 11574/10772/9529 13380/10773/9297 11493/10769/9316
+f 5812/10765/9524 5813/10768/9527 5818/10774/9530 5814/10775/9531
+f 5814/10775/9531 5818/10774/9530 11578/10776/9532 11579/10777/9533
+f 5813/10768/9527 11492/10770/9310 11491/10778/9309 5818/10774/9530
+f 5818/10774/9530 11491/10778/9309 13381/10779/9313 11578/10776/9532
+f 5812/10765/9524 5814/10775/9531 5819/10780/9534 5815/10781/9535
+f 5815/10781/9535 5819/10780/9534 11941/10782/5246 11942/10783/5247
+f 5814/10775/9531 11579/10777/9533 11580/10784/9536 5819/10780/9534
+f 5819/10780/9534 11580/10784/9536 13448/10785/1082 11941/10782/5246
+f 5812/10765/9524 5815/10781/9535 5820/10786/9537 5816/10766/9525
+f 5816/10766/9525 5820/10786/9537 11572/10787/9538 11573/10771/9528
+f 5815/10781/9535 11942/10783/5247 11943/10788/5252 5820/10786/9537
+f 5820/10786/9537 11943/10788/5252 13421/10789/5253 11572/10787/9538
+f 5821/10790/9539 5825/10791/9540 5826/10792/9541 5822/10793/9542
+f 5822/10793/9542 5826/10792/9541 10506/10794/7781 10505/10795/7776
+f 5825/10791/9540 11588/10796/9543 11589/10797/9544 5826/10792/9541
+f 5826/10792/9541 11589/10797/9544 13218/10798/7782 10506/10794/7781
+f 5821/10790/9539 5822/10793/9542 5827/10799/9545 5823/10800/9546
+f 5823/10800/9546 5827/10799/9545 11568/10747/9514 11567/10746/9513
+f 5822/10793/9542 10505/10795/7776 10504/10801/7775 5827/10799/9545
+f 5827/10799/9545 10504/10801/7775 13216/10748/7744 11568/10747/9514
+f 5821/10790/9539 5823/10800/9546 5828/10802/9547 5824/10803/9548
+f 5824/10803/9548 5828/10802/9547 11803/10804/131 11804/10805/130
+f 5823/10800/9546 11567/10746/9513 11566/10762/9523 5828/10802/9547
+f 5828/10802/9547 11566/10762/9523 13425/10764/125 11803/10804/131
+f 5821/10790/9539 5824/10803/9548 5829/10806/9549 5825/10791/9540
+f 5825/10791/9540 5829/10806/9549 11587/10807/9550 11588/10796/9543
+f 5824/10803/9548 11804/10805/130 11805/10808/143 5829/10806/9549
+f 5829/10806/9549 11805/10808/143 13426/10809/145 11587/10807/9550
+f 5830/10810/9551 5834/10811/9552 5835/10812/9553 5831/10813/9554
+f 5831/10813/9554 5835/10812/9553 11499/10814/9332 11498/10815/9326
+f 5834/10811/9552 11579/10777/9533 11578/10776/9532 5835/10812/9553
+f 5835/10812/9553 11578/10776/9532 13381/10779/9313 11499/10814/9332
+f 5830/10810/9551 5831/10813/9554 5836/10816/9555 5832/10817/9556
+f 5832/10817/9556 5836/10816/9555 11593/10818/9557 11594/10819/9558
+f 5831/10813/9554 11498/10815/9326 11497/10820/9325 5836/10816/9555
+f 5836/10816/9555 11497/10820/9325 13382/10821/9329 11593/10818/9557
+f 5830/10810/9551 5832/10817/9556 5837/10822/9559 5833/10823/9560
+f 5833/10823/9560 5837/10822/9559 11938/10824/1101 11939/10825/1096
+f 5832/10817/9556 11594/10819/9558 11595/10826/9561 5837/10822/9559
+f 5837/10822/9559 11595/10826/9561 13447/10827/1102 11938/10824/1101
+f 5830/10810/9551 5833/10823/9560 5838/10828/9562 5834/10811/9552
+f 5834/10811/9552 5838/10828/9562 11580/10784/9536 11579/10777/9533
+f 5833/10823/9560 11939/10825/1096 11940/10829/1095 5838/10828/9562
+f 5838/10828/9562 11940/10829/1095 13448/10785/1082 11580/10784/9536
+f 5839/10830/9563 5843/10831/9564 5844/10832/9565 5840/10833/9566
+f 5840/10833/9566 5844/10832/9565 10518/10834/7817 10517/10835/7812
+f 5843/10831/9564 11603/10836/9567 11604/10837/9568 5844/10832/9565
+f 5844/10832/9565 11604/10837/9568 13220/10838/7818 10518/10834/7817
+f 5839/10830/9563 5840/10833/9566 5845/10839/9569 5841/10840/9570
+f 5841/10840/9570 5845/10839/9569 11589/10797/9544 11588/10796/9543
+f 5840/10833/9566 10517/10835/7812 10516/10841/7811 5845/10839/9569
+f 5845/10839/9569 10516/10841/7811 13218/10798/7782 11589/10797/9544
+f 5839/10830/9563 5841/10840/9570 5846/10842/9571 5842/10843/9572
+f 5842/10843/9572 5846/10842/9571 11809/10844/151 11810/10845/150
+f 5841/10840/9570 11588/10796/9543 11587/10807/9550 5846/10842/9571
+f 5846/10842/9571 11587/10807/9550 13426/10809/145 11809/10844/151
+f 5839/10830/9563 5842/10843/9572 5847/10846/9573 5843/10831/9564
+f 5843/10831/9564 5847/10846/9573 11602/10847/9574 11603/10836/9567
+f 5842/10843/9572 11810/10845/150 11811/10848/163 5847/10846/9573
+f 5847/10846/9573 11811/10848/163 13427/10849/165 11602/10847/9574
+f 5848/10850/9575 5852/10851/9576 5853/10852/9577 5849/10853/9578
+f 5849/10853/9578 5853/10852/9577 11505/10854/9348 11504/10855/9342
+f 5852/10851/9576 11594/10819/9558 11593/10818/9557 5853/10852/9577
+f 5853/10852/9577 11593/10818/9557 13382/10821/9329 11505/10854/9348
+f 5848/10850/9575 5849/10853/9578 5854/10856/9579 5850/10857/9580
+f 5850/10857/9580 5854/10856/9579 11608/10858/9581 11609/10859/9582
+f 5849/10853/9578 11504/10855/9342 11503/10860/9341 5854/10856/9579
+f 5854/10856/9579 11503/10860/9341 13383/10861/9345 11608/10858/9581
+f 5848/10850/9575 5850/10857/9580 5855/10862/9583 5851/10863/9584
+f 5851/10863/9584 5855/10862/9583 11932/10864/1121 11933/10865/1116
+f 5850/10857/9580 11609/10859/9582 11610/10866/9585 5855/10862/9583
+f 5855/10862/9583 11610/10866/9585 13446/10867/1122 11932/10864/1121
+f 5848/10850/9575 5851/10863/9584 5856/10868/9586 5852/10851/9576
+f 5852/10851/9576 5856/10868/9586 11595/10826/9561 11594/10819/9558
+f 5851/10863/9584 11933/10865/1116 11934/10869/1115 5856/10868/9586
+f 5856/10868/9586 11934/10869/1115 13447/10827/1102 11595/10826/9561
+f 5857/10870/9587 5861/10871/9588 5862/10872/9589 5858/10873/9590
+f 5858/10873/9590 5862/10872/9589 10530/10874/7853 10529/10875/7848
+f 5861/10871/9588 11618/10876/9591 11619/10877/9592 5862/10872/9589
+f 5862/10872/9589 11619/10877/9592 13222/10878/7854 10530/10874/7853
+f 5857/10870/9587 5858/10873/9590 5863/10879/9593 5859/10880/9594
+f 5859/10880/9594 5863/10879/9593 11604/10837/9568 11603/10836/9567
+f 5858/10873/9590 10529/10875/7848 10528/10881/7847 5863/10879/9593
+f 5863/10879/9593 10528/10881/7847 13220/10838/7818 11604/10837/9568
+f 5857/10870/9587 5859/10880/9594 5864/10882/9595 5860/10883/9596
+f 5860/10883/9596 5864/10882/9595 11815/10884/171 11816/10885/170
+f 5859/10880/9594 11603/10836/9567 11602/10847/9574 5864/10882/9595
+f 5864/10882/9595 11602/10847/9574 13427/10849/165 11815/10884/171
+f 5857/10870/9587 5860/10883/9596 5865/10886/9597 5861/10871/9588
+f 5861/10871/9588 5865/10886/9597 11617/10887/9598 11618/10876/9591
+f 5860/10883/9596 11816/10885/170 11817/10888/183 5865/10886/9597
+f 5865/10886/9597 11817/10888/183 13428/10889/185 11617/10887/9598
+f 5866/10890/9599 5870/10891/9600 5871/10892/9601 5867/10893/9602
+f 5867/10893/9602 5871/10892/9601 11511/10894/9364 11510/10895/9358
+f 5870/10891/9600 11609/10859/9582 11608/10858/9581 5871/10892/9601
+f 5871/10892/9601 11608/10858/9581 13383/10861/9345 11511/10894/9364
+f 5866/10890/9599 5867/10893/9602 5872/10896/9603 5868/10897/9604
+f 5868/10897/9604 5872/10896/9603 11623/10898/9605 11624/10899/9606
+f 5867/10893/9602 11510/10895/9358 11509/10900/9357 5872/10896/9603
+f 5872/10896/9603 11509/10900/9357 13384/10901/9361 11623/10898/9605
+f 5866/10890/9599 5868/10897/9604 5873/10902/9607 5869/10903/9608
+f 5869/10903/9608 5873/10902/9607 11926/10904/1141 11927/10905/1136
+f 5868/10897/9604 11624/10899/9606 11625/10906/9609 5873/10902/9607
+f 5873/10902/9607 11625/10906/9609 13445/10907/1142 11926/10904/1141
+f 5866/10890/9599 5869/10903/9608 5874/10908/9610 5870/10891/9600
+f 5870/10891/9600 5874/10908/9610 11610/10866/9585 11609/10859/9582
+f 5869/10903/9608 11927/10905/1136 11928/10909/1135 5874/10908/9610
+f 5874/10908/9610 11928/10909/1135 13446/10867/1122 11610/10866/9585
+f 5875/10910/9611 5879/10911/9612 5880/10912/9613 5876/10913/9614
+f 5876/10913/9614 5880/10912/9613 10542/10914/7889 10541/10915/7884
+f 5879/10911/9612 11633/10916/9615 11634/10917/9616 5880/10912/9613
+f 5880/10912/9613 11634/10917/9616 13224/10918/7890 10542/10914/7889
+f 5875/10910/9611 5876/10913/9614 5881/10919/9617 5877/10920/9618
+f 5877/10920/9618 5881/10919/9617 11619/10877/9592 11618/10876/9591
+f 5876/10913/9614 10541/10915/7884 10540/10921/7883 5881/10919/9617
+f 5881/10919/9617 10540/10921/7883 13222/10878/7854 11619/10877/9592
+f 5875/10910/9611 5877/10920/9618 5882/10922/9619 5878/10923/9620
+f 5878/10923/9620 5882/10922/9619 11821/10924/191 11822/10925/190
+f 5877/10920/9618 11618/10876/9591 11617/10887/9598 5882/10922/9619
+f 5882/10922/9619 11617/10887/9598 13428/10889/185 11821/10924/191
+f 5875/10910/9611 5878/10923/9620 5883/10926/9621 5879/10911/9612
+f 5879/10911/9612 5883/10926/9621 11632/10927/9622 11633/10916/9615
+f 5878/10923/9620 11822/10925/190 11823/10928/203 5883/10926/9621
+f 5883/10926/9621 11823/10928/203 13429/10929/205 11632/10927/9622
+f 5884/10930/9623 5888/10931/9624 5889/10932/9625 5885/10933/9626
+f 5885/10933/9626 5889/10932/9625 11517/10934/9380 11516/10935/9374
+f 5888/10931/9624 11624/10899/9606 11623/10898/9605 5889/10932/9625
+f 5889/10932/9625 11623/10898/9605 13384/10901/9361 11517/10934/9380
+f 5884/10930/9623 5885/10933/9626 5890/10936/9627 5886/10937/9628
+f 5886/10937/9628 5890/10936/9627 11638/10938/9629 11639/10939/9630
+f 5885/10933/9626 11516/10935/9374 11515/10940/9373 5890/10936/9627
+f 5890/10936/9627 11515/10940/9373 13385/10941/9377 11638/10938/9629
+f 5884/10930/9623 5886/10937/9628 5891/10942/9631 5887/10943/9632
+f 5887/10943/9632 5891/10942/9631 11920/10944/1161 11921/10945/1156
+f 5886/10937/9628 11639/10939/9630 11640/10946/9633 5891/10942/9631
+f 5891/10942/9631 11640/10946/9633 13444/10947/1162 11920/10944/1161
+f 5884/10930/9623 5887/10943/9632 5892/10948/9634 5888/10931/9624
+f 5888/10931/9624 5892/10948/9634 11625/10906/9609 11624/10899/9606
+f 5887/10943/9632 11921/10945/1156 11922/10949/1155 5892/10948/9634
+f 5892/10948/9634 11922/10949/1155 13445/10907/1142 11625/10906/9609
+f 5893/10950/9635 5897/10951/9636 5898/10952/9637 5894/10953/9638
+f 5894/10953/9638 5898/10952/9637 10554/10954/7925 10553/10955/7920
+f 5897/10951/9636 11648/10956/9639 11649/10957/9640 5898/10952/9637
+f 5898/10952/9637 11649/10957/9640 13226/10958/7926 10554/10954/7925
+f 5893/10950/9635 5894/10953/9638 5899/10959/9641 5895/10960/9642
+f 5895/10960/9642 5899/10959/9641 11634/10917/9616 11633/10916/9615
+f 5894/10953/9638 10553/10955/7920 10552/10961/7919 5899/10959/9641
+f 5899/10959/9641 10552/10961/7919 13224/10918/7890 11634/10917/9616
+f 5893/10950/9635 5895/10960/9642 5900/10962/9643 5896/10963/9644
+f 5896/10963/9644 5900/10962/9643 11827/10964/211 11828/10965/210
+f 5895/10960/9642 11633/10916/9615 11632/10927/9622 5900/10962/9643
+f 5900/10962/9643 11632/10927/9622 13429/10929/205 11827/10964/211
+f 5893/10950/9635 5896/10963/9644 5901/10966/9645 5897/10951/9636
+f 5897/10951/9636 5901/10966/9645 11647/10967/9646 11648/10956/9639
+f 5896/10963/9644 11828/10965/210 11829/10968/223 5901/10966/9645
+f 5901/10966/9645 11829/10968/223 13430/10969/225 11647/10967/9646
+f 5902/10970/9647 5906/10971/9648 5907/10972/9649 5903/10973/9650
+f 5903/10973/9650 5907/10972/9649 11523/10974/9396 11522/10975/9390
+f 5906/10971/9648 11639/10939/9630 11638/10938/9629 5907/10972/9649
+f 5907/10972/9649 11638/10938/9629 13385/10941/9377 11523/10974/9396
+f 5902/10970/9647 5903/10973/9650 5908/10976/9651 5904/10977/9652
+f 5904/10977/9652 5908/10976/9651 11653/10978/9653 11654/10979/9654
+f 5903/10973/9650 11522/10975/9390 11521/10980/9389 5908/10976/9651
+f 5908/10976/9651 11521/10980/9389 13386/10981/9393 11653/10978/9653
+f 5902/10970/9647 5904/10977/9652 5909/10982/9655 5905/10983/9656
+f 5905/10983/9656 5909/10982/9655 11914/10984/1181 11915/10985/1176
+f 5904/10977/9652 11654/10979/9654 11655/10986/9657 5909/10982/9655
+f 5909/10982/9655 11655/10986/9657 13443/10987/1182 11914/10984/1181
+f 5902/10970/9647 5905/10983/9656 5910/10988/9658 5906/10971/9648
+f 5906/10971/9648 5910/10988/9658 11640/10946/9633 11639/10939/9630
+f 5905/10983/9656 11915/10985/1176 11916/10989/1175 5910/10988/9658
+f 5910/10988/9658 11916/10989/1175 13444/10947/1162 11640/10946/9633
+f 5911/10990/9659 5915/10991/9660 5916/10992/9661 5912/10993/9662
+f 5912/10993/9662 5916/10992/9661 10566/10994/7961 10565/10995/7956
+f 5915/10991/9660 11663/10996/9663 11664/10997/9664 5916/10992/9661
+f 5916/10992/9661 11664/10997/9664 13228/10998/7962 10566/10994/7961
+f 5911/10990/9659 5912/10993/9662 5917/10999/9665 5913/11000/9666
+f 5913/11000/9666 5917/10999/9665 11649/10957/9640 11648/10956/9639
+f 5912/10993/9662 10565/10995/7956 10564/11001/7955 5917/10999/9665
+f 5917/10999/9665 10564/11001/7955 13226/10958/7926 11649/10957/9640
+f 5911/10990/9659 5913/11000/9666 5918/11002/9667 5914/11003/9668
+f 5914/11003/9668 5918/11002/9667 11833/11004/6145 11834/11005/6146
+f 5913/11000/9666 11648/10956/9639 11647/10967/9646 5918/11002/9667
+f 5918/11002/9667 11647/10967/9646 13430/10969/225 11833/11004/6145
+f 5911/10990/9659 5914/11003/9668 5919/11006/9669 5915/10991/9660
+f 5915/10991/9660 5919/11006/9669 11662/11007/9670 11663/10996/9663
+f 5914/11003/9668 11834/11005/6146 11835/11008/6149 5919/11006/9669
+f 5919/11006/9669 11835/11008/6149 13431/11009/6128 11662/11007/9670
+f 5920/11010/9671 5924/11011/9672 5925/11012/9673 5921/11013/9674
+f 5921/11013/9674 5925/11012/9673 11529/11014/9412 11528/11015/9406
+f 5924/11011/9672 11654/10979/9654 11653/10978/9653 5925/11012/9673
+f 5925/11012/9673 11653/10978/9653 13386/10981/9393 11529/11014/9412
+f 5920/11010/9671 5921/11013/9674 5926/11016/9675 5922/11017/9676
+f 5922/11017/9676 5926/11016/9675 11668/11018/9677 11669/11019/9678
+f 5921/11013/9674 11528/11015/9406 11527/11020/9405 5926/11016/9675
+f 5926/11016/9675 11527/11020/9405 13387/11021/9409 11668/11018/9677
+f 5920/11010/9671 5922/11017/9676 5927/11022/9679 5923/11023/9680
+f 5923/11023/9680 5927/11022/9679 11908/11024/5147 11909/11025/5148
+f 5922/11017/9676 11669/11019/9678 11670/11026/9681 5927/11022/9679
+f 5927/11022/9679 11670/11026/9681 13442/11027/5134 11908/11024/5147
+f 5920/11010/9671 5923/11023/9680 5928/11028/9682 5924/11011/9672
+f 5924/11011/9672 5928/11028/9682 11655/10986/9657 11654/10979/9654
+f 5923/11023/9680 11909/11025/5148 11910/11029/5153 5928/11028/9682
+f 5928/11028/9682 11910/11029/5153 13443/10987/1182 11655/10986/9657
+f 5929/11030/9683 5933/11031/9684 5934/11032/9685 5930/11033/9686
+f 5930/11033/9686 5934/11032/9685 10578/11034/7997 10577/11035/7992
+f 5933/11031/9684 11678/11036/9687 11679/11037/9688 5934/11032/9685
+f 5934/11032/9685 11679/11037/9688 13230/11038/7998 10578/11034/7997
+f 5929/11030/9683 5930/11033/9686 5935/11039/9689 5931/11040/9690
+f 5931/11040/9690 5935/11039/9689 11664/10997/9664 11663/10996/9663
+f 5930/11033/9686 10577/11035/7992 10576/11041/7991 5935/11039/9689
+f 5935/11039/9689 10576/11041/7991 13228/10998/7962 11664/10997/9664
+f 5929/11030/9683 5931/11040/9690 5936/11042/9691 5932/11043/9692
+f 5932/11043/9692 5936/11042/9691 11839/11044/6126 11840/11045/254
+f 5931/11040/9690 11663/10996/9663 11662/11007/9670 5936/11042/9691
+f 5936/11042/9691 11662/11007/9670 13431/11009/6128 11839/11044/6126
+f 5929/11030/9683 5932/11043/9692 5937/11046/9693 5933/11031/9684
+f 5933/11031/9684 5937/11046/9693 11677/11047/9694 11678/11036/9687
+f 5932/11043/9692 11840/11045/254 11841/11048/6130 5937/11046/9693
+f 5937/11046/9693 11841/11048/6130 13432/11049/5474 11677/11047/9694
+f 5938/11050/9695 5942/11051/9696 5943/11052/9697 5939/11053/9698
+f 5939/11053/9698 5943/11052/9697 11535/11054/9428 11534/11055/9422
+f 5942/11051/9696 11669/11019/9678 11668/11018/9677 5943/11052/9697
+f 5943/11052/9697 11668/11018/9677 13387/11021/9409 11535/11054/9428
+f 5938/11050/9695 5939/11053/9698 5944/11056/9699 5940/11057/9700
+f 5940/11057/9700 5944/11056/9699 11683/11058/9701 11684/11059/9702
+f 5939/11053/9698 11534/11055/9422 11533/11060/9421 5944/11056/9699
+f 5944/11056/9699 11533/11060/9421 13388/11061/9425 11683/11058/9701
+f 5938/11050/9695 5940/11057/9700 5945/11062/9703 5941/11063/9704
+f 5941/11063/9704 5945/11062/9703 11902/11064/5128 11903/11065/1221
+f 5940/11057/9700 11684/11059/9702 11685/11066/9705 5945/11062/9703
+f 5945/11062/9703 11685/11066/9705 13441/11067/5115 11902/11064/5128
+f 5938/11050/9695 5941/11063/9704 5946/11068/9706 5942/11051/9696
+f 5942/11051/9696 5946/11068/9706 11670/11026/9681 11669/11019/9678
+f 5941/11063/9704 11903/11065/1221 11904/11069/5133 5946/11068/9706
+f 5946/11068/9706 11904/11069/5133 13442/11027/5134 11670/11026/9681
+f 5947/11070/9707 5951/11071/9708 5952/11072/9709 5948/11073/9710
+f 5948/11073/9710 5952/11072/9709 10590/11074/8033 10589/11075/8028
+f 5951/11071/9708 11693/11076/9711 11694/11077/9712 5952/11072/9709
+f 5952/11072/9709 11694/11077/9712 13232/11078/8034 10590/11074/8033
+f 5947/11070/9707 5948/11073/9710 5953/11079/9713 5949/11080/9714
+f 5949/11080/9714 5953/11079/9713 11679/11037/9688 11678/11036/9687
+f 5948/11073/9710 10589/11075/8028 10588/11081/8027 5953/11079/9713
+f 5953/11079/9713 10588/11081/8027 13230/11038/7998 11679/11037/9688
+f 5947/11070/9707 5949/11080/9714 5954/11082/9715 5950/11083/9716
+f 5950/11083/9716 5954/11082/9715 11845/11084/6107 11846/11085/6108
+f 5949/11080/9714 11678/11036/9687 11677/11047/9694 5954/11082/9715
+f 5954/11082/9715 11677/11047/9694 13432/11049/5474 11845/11084/6107
+f 5947/11070/9707 5950/11083/9716 5955/11086/9717 5951/11071/9708
+f 5951/11071/9708 5955/11086/9717 11692/11087/9718 11693/11076/9711
+f 5950/11083/9716 11846/11085/6108 11847/11088/6111 5955/11086/9717
+f 5955/11086/9717 11847/11088/6111 13433/11089/6090 11692/11087/9718
+f 5956/11090/9719 5960/11091/9720 5961/11092/9721 5957/11093/9722
+f 5957/11093/9722 5961/11092/9721 11541/11094/9444 11540/11095/9438
+f 5960/11091/9720 11684/11059/9702 11683/11058/9701 5961/11092/9721
+f 5961/11092/9721 11683/11058/9701 13388/11061/9425 11541/11094/9444
+f 5956/11090/9719 5957/11093/9722 5962/11096/9723 5958/11097/9724
+f 5958/11097/9724 5962/11096/9723 11698/11098/9725 11699/11099/9726
+f 5957/11093/9722 11540/11095/9438 11539/11100/9437 5962/11096/9723
+f 5962/11096/9723 11539/11100/9437 13389/11101/9441 11698/11098/9725
+f 5956/11090/9719 5958/11097/9724 5963/11102/9727 5959/11103/9728
+f 5959/11103/9728 5963/11102/9727 11896/11104/5108 11897/11105/5109
+f 5958/11097/9724 11699/11099/9726 11700/11106/9729 5963/11102/9727
+f 5963/11102/9727 11700/11106/9729 13440/11107/5095 11896/11104/5108
+f 5956/11090/9719 5959/11103/9728 5964/11108/9730 5960/11091/9720
+f 5960/11091/9720 5964/11108/9730 11685/11066/9705 11684/11059/9702
+f 5959/11103/9728 11897/11105/5109 11898/11109/9731 5964/11108/9730
+f 5964/11108/9730 11898/11109/9731 13441/11067/5115 11685/11066/9705
+f 5965/11110/9732 5969/11111/9733 5970/11112/9734 5966/11113/9735
+f 5966/11113/9735 5970/11112/9734 10602/11114/8069 10601/11115/8064
+f 5969/11111/9733 11708/11116/9736 11709/11117/9737 5970/11112/9734
+f 5970/11112/9734 11709/11117/9737 13234/11118/8070 10602/11114/8069
+f 5965/11110/9732 5966/11113/9735 5971/11119/9738 5967/11120/9739
+f 5967/11120/9739 5971/11119/9738 11694/11077/9712 11693/11076/9711
+f 5966/11113/9735 10601/11115/8064 10600/11121/8063 5971/11119/9738
+f 5971/11119/9738 10600/11121/8063 13232/11078/8034 11694/11077/9712
+f 5965/11110/9732 5967/11120/9739 5972/11122/9740 5968/11123/9741
+f 5968/11123/9741 5972/11122/9740 11851/11124/6087 11852/11125/6088
+f 5967/11120/9739 11693/11076/9711 11692/11087/9718 5972/11122/9740
+f 5972/11122/9740 11692/11087/9718 13433/11089/6090 11851/11124/6087
+f 5965/11110/9732 5968/11123/9741 5973/11126/9742 5969/11111/9733
+f 5969/11111/9733 5973/11126/9742 11707/11127/9743 11708/11116/9736
+f 5968/11123/9741 11852/11125/6088 11853/11128/6092 5973/11126/9742
+f 5973/11126/9742 11853/11128/6092 13434/11129/6070 11707/11127/9743
+f 5974/11130/9744 5978/11131/9745 5979/11132/9746 5975/11133/9747
+f 5975/11133/9747 5979/11132/9746 11547/11134/9460 11546/11135/9454
+f 5978/11131/9745 11699/11099/9726 11698/11098/9725 5979/11132/9746
+f 5979/11132/9746 11698/11098/9725 13389/11101/9441 11547/11134/9460
+f 5974/11130/9744 5975/11133/9747 5980/11136/9748 5976/11137/9749
+f 5976/11137/9749 5980/11136/9748 11713/11138/9750 11714/11139/9751
+f 5975/11133/9747 11546/11135/9454 11545/11140/9453 5980/11136/9748
+f 5980/11136/9748 11545/11140/9453 13390/11141/9457 11713/11138/9750
+f 5974/11130/9744 5976/11137/9749 5981/11142/9752 5977/11143/9753
+f 5977/11143/9753 5981/11142/9752 11890/11144/5088 11891/11145/5089
+f 5976/11137/9749 11714/11139/9751 11715/11146/9754 5981/11142/9752
+f 5981/11142/9752 11715/11146/9754 13439/11147/5075 11890/11144/5088
+f 5974/11130/9744 5977/11143/9753 5982/11148/9755 5978/11131/9745
+f 5978/11131/9745 5982/11148/9755 11700/11106/9729 11699/11099/9726
+f 5977/11143/9753 11891/11145/5089 11892/11149/5094 5982/11148/9755
+f 5982/11148/9755 11892/11149/5094 13440/11107/5095 11700/11106/9729
+f 5983/11150/9756 5987/11151/9757 5988/11152/9758 5984/11153/9759
+f 5984/11153/9759 5988/11152/9758 10614/11154/8105 10613/11155/8100
+f 5987/11151/9757 11723/11156/9760 11724/11157/9761 5988/11152/9758
+f 5988/11152/9758 11724/11157/9761 13236/11158/8106 10614/11154/8105
+f 5983/11150/9756 5984/11153/9759 5989/11159/9762 5985/11160/9763
+f 5985/11160/9763 5989/11159/9762 11709/11117/9737 11708/11116/9736
+f 5984/11153/9759 10613/11155/8100 10612/11161/8099 5989/11159/9762
+f 5989/11159/9762 10612/11161/8099 13234/11118/8070 11709/11117/9737
+f 5983/11150/9756 5985/11160/9763 5990/11162/9764 5986/11163/9765
+f 5986/11163/9765 5990/11162/9764 11857/11164/6067 11858/11165/6068
+f 5985/11160/9763 11708/11116/9736 11707/11127/9743 5990/11162/9764
+f 5990/11162/9764 11707/11127/9743 13434/11129/6070 11857/11164/6067
+f 5983/11150/9756 5986/11163/9765 5991/11166/9766 5987/11151/9757
+f 5987/11151/9757 5991/11166/9766 11722/11167/9767 11723/11156/9760
+f 5986/11163/9765 11858/11165/6068 11859/11168/6072 5991/11166/9766
+f 5991/11166/9766 11859/11168/6072 13435/11169/6050 11722/11167/9767
+f 5992/11170/9768 5996/11171/9769 5997/11172/9770 5993/11173/9771
+f 5993/11173/9771 5997/11172/9770 11553/11174/9476 11552/11175/9470
+f 5996/11171/9769 11714/11139/9751 11713/11138/9750 5997/11172/9770
+f 5997/11172/9770 11713/11138/9750 13390/11141/9457 11553/11174/9476
+f 5992/11170/9768 5993/11173/9771 5998/11176/9772 5994/11177/9773
+f 5994/11177/9773 5998/11176/9772 11728/11178/9774 11729/11179/9775
+f 5993/11173/9771 11552/11175/9470 11551/11180/9469 5998/11176/9772
+f 5998/11176/9772 11551/11180/9469 13391/11181/9473 11728/11178/9774
+f 5992/11170/9768 5994/11177/9773 5999/11182/9776 5995/11183/9777
+f 5995/11183/9777 5999/11182/9776 11884/11184/5068 11885/11185/5069
+f 5994/11177/9773 11729/11179/9775 11730/11186/9778 5999/11182/9776
+f 5999/11182/9776 11730/11186/9778 13438/11187/5055 11884/11184/5068
+f 5992/11170/9768 5995/11183/9777 6000/11188/9779 5996/11171/9769
+f 5996/11171/9769 6000/11188/9779 11715/11146/9754 11714/11139/9751
+f 5995/11183/9777 11885/11185/5069 11886/11189/5074 6000/11188/9779
+f 6000/11188/9779 11886/11189/5074 13439/11147/5075 11715/11146/9754
+f 6001/11190/9780 6005/11191/9781 6006/11192/9782 6002/11193/9783
+f 6002/11193/9783 6006/11192/9782 10626/11194/8141 10625/11195/8136
+f 6005/11191/9781 11738/11196/9784 11739/11197/9785 6006/11192/9782
+f 6006/11192/9782 11739/11197/9785 13238/11198/8142 10626/11194/8141
+f 6001/11190/9780 6002/11193/9783 6007/11199/9786 6003/11200/9787
+f 6003/11200/9787 6007/11199/9786 11724/11157/9761 11723/11156/9760
+f 6002/11193/9783 10625/11195/8136 10624/11201/8135 6007/11199/9786
+f 6007/11199/9786 10624/11201/8135 13236/11158/8106 11724/11157/9761
+f 6001/11190/9780 6003/11200/9787 6008/11202/9788 6004/11203/9789
+f 6004/11203/9789 6008/11202/9788 11863/11204/6047 11864/11205/6048
+f 6003/11200/9787 11723/11156/9760 11722/11167/9767 6008/11202/9788
+f 6008/11202/9788 11722/11167/9767 13435/11169/6050 11863/11204/6047
+f 6001/11190/9780 6004/11203/9789 6009/11206/9790 6005/11191/9781
+f 6005/11191/9781 6009/11206/9790 11737/11207/9791 11738/11196/9784
+f 6004/11203/9789 11864/11205/6048 11865/11208/6052 6009/11206/9790
+f 6009/11206/9790 11865/11208/6052 13436/11209/6030 11737/11207/9791
+f 6010/11210/9792 6014/11211/9793 6015/11212/9794 6011/11213/9795
+f 6011/11213/9795 6015/11212/9794 11559/11214/9492 11558/11215/9486
+f 6014/11211/9793 11729/11179/9775 11728/11178/9774 6015/11212/9794
+f 6015/11212/9794 11728/11178/9774 13391/11181/9473 11559/11214/9492
+f 6010/11210/9792 6011/11213/9795 6016/11216/9796 6012/11217/9797
+f 6012/11217/9797 6016/11216/9796 11743/11218/9798 11744/11219/9799
+f 6011/11213/9795 11558/11215/9486 11557/11220/9485 6016/11216/9796
+f 6016/11216/9796 11557/11220/9485 13392/11221/9489 11743/11218/9798
+f 6010/11210/9792 6012/11217/9797 6017/11222/9800 6013/11223/9801
+f 6013/11223/9801 6017/11222/9800 11878/11224/5048 11879/11225/5049
+f 6012/11217/9797 11744/11219/9799 11745/11226/9802 6017/11222/9800
+f 6017/11222/9800 11745/11226/9802 13437/11227/5035 11878/11224/5048
+f 6010/11210/9792 6013/11223/9801 6018/11228/9803 6014/11211/9793
+f 6014/11211/9793 6018/11228/9803 11730/11186/9778 11729/11179/9775
+f 6013/11223/9801 11879/11225/5049 11880/11229/5054 6018/11228/9803
+f 6018/11228/9803 11880/11229/5054 13438/11187/5055 11730/11186/9778
+f 6019/11230/9804 6023/11231/9805 6024/11232/9806 6020/11233/9807
+f 6020/11233/9807 6024/11232/9806 10635/11234/8171 10634/11235/8168
+f 6023/11231/9805 9557/5286/4634 9556/5285/4633 6024/11232/9806
+f 6024/11232/9806 9556/5285/4633 12870/5289/3082 10635/11234/8171
+f 6019/11230/9804 6020/11233/9807 6025/11236/9808 6021/11237/9809
+f 6021/11237/9809 6025/11236/9808 11739/11197/9785 11738/11196/9784
+f 6020/11233/9807 10634/11235/8168 10633/11238/8167 6025/11236/9808
+f 6025/11236/9808 10633/11238/8167 13238/11198/8142 11739/11197/9785
+f 6019/11230/9804 6021/11237/9809 6026/11239/9810 6022/11240/9811
+f 6022/11240/9811 6026/11239/9810 11866/11241/6027 11867/11242/6028
+f 6021/11237/9809 11738/11196/9784 11737/11207/9791 6026/11239/9810
+f 6026/11239/9810 11737/11207/9791 13436/11209/6030 11866/11241/6027
+f 6019/11230/9804 6022/11240/9811 6027/11243/9812 6023/11231/9805
+f 6023/11231/9805 6027/11243/9812 9558/5294/4637 9557/5286/4634
+f 6022/11240/9811 11867/11242/6028 11868/11244/6032 6027/11243/9812
+f 6027/11243/9812 11868/11244/6032 13067/5295/977 9558/5294/4637
+f 6028/11245/9813 6032/11246/9814 6033/11247/9815 6029/11248/9816
+f 6029/11248/9816 6033/11247/9815 11562/11249/9505 11561/11250/9502
+f 6032/11246/9814 11744/11219/9799 11743/11218/9798 6033/11247/9815
+f 6033/11247/9815 11743/11218/9798 13392/11221/9489 11562/11249/9505
+f 6028/11245/9813 6029/11248/9816 6034/11251/9817 6030/11252/9818
+f 6030/11252/9818 6034/11251/9817 9564/5319/4652 9563/5314/4650
+f 6029/11248/9816 11561/11250/9502 11560/11253/9501 6034/11251/9817
+f 6034/11251/9817 11560/11253/9501 13023/5320/4350 9564/5319/4652
+f 6028/11245/9813 6030/11252/9818 6035/11254/9819 6031/11255/9820
+f 6031/11255/9820 6035/11254/9819 11872/11256/5028 11873/11257/5029
+f 6030/11252/9818 9563/5314/4650 9562/5313/4649 6035/11254/9819
+f 6035/11254/9819 9562/5313/4649 13068/5316/9 11872/11256/5028
+f 6028/11245/9813 6031/11255/9820 6036/11258/9821 6032/11246/9814
+f 6032/11246/9814 6036/11258/9821 11745/11226/9802 11744/11219/9799
+f 6031/11255/9820 11873/11257/5029 11874/11259/5034 6036/11258/9821
+f 6036/11258/9821 11874/11259/5034 13437/11227/5035 11745/11226/9802
+f 6037/11260/9822 6041/11261/9823 6042/11262/9824 6038/11263/9825
+f 6038/11263/9825 6042/11262/9824 11185/11264/8667 11184/11265/8664
+f 6041/11261/9823 11564/10752/9518 11563/10751/9517 6042/11262/9824
+f 6042/11262/9824 11563/10751/9517 13213/10754/7738 11185/11264/8667
+f 6037/11260/9822 6038/11263/9825 6043/11266/9826 6039/11267/9827
+f 6039/11267/9827 6043/11266/9826 11758/11268/9828 11759/11269/9829
+f 6038/11263/9825 11184/11265/8664 11183/11270/8663 6043/11266/9826
+f 6043/11266/9826 11183/11270/8663 13330/11271/5736 11758/11268/9828
+f 6037/11260/9822 6039/11267/9827 6044/11272/9830 6040/11273/9831
+f 6040/11273/9831 6044/11272/9830 11791/11274/9832 11792/11275/9833
+f 6039/11267/9827 11759/11269/9829 11760/11276/9834 6044/11272/9830
+f 6044/11272/9830 11760/11276/9834 13423/11277/9835 11791/11274/9832
+f 6037/11260/9822 6040/11273/9831 6045/11278/9836 6041/11261/9823
+f 6041/11261/9823 6045/11278/9836 11565/10759/9521 11564/10752/9518
+f 6040/11273/9831 11792/11275/9833 11793/11279/9837 6045/11278/9836
+f 6045/11278/9836 11793/11279/9837 13424/10760/6247 11565/10759/9521
+f 6046/11280/9838 6050/11281/9839 6051/11282/9840 6047/11283/9841
+f 6047/11283/9841 6051/11282/9840 11478/11284/5735 11477/11285/5734
+f 6050/11281/9839 11759/11286/9829 11758/11287/9828 6051/11282/9840
+f 6051/11282/9840 11758/11287/9828 13330/11288/5736 11478/11284/5735
+f 6046/11280/9838 6047/11283/9841 6052/11289/9842 6048/11290/9843
+f 6048/11290/9843 6052/11289/9842 11764/11291/9844 11765/11292/9845
+f 6047/11283/9841 11477/11285/5734 11476/11293/5750 6052/11289/9842
+f 6052/11289/9842 11476/11293/5750 13379/11294/5752 11764/11291/9844
+f 6046/11280/9838 6048/11290/9843 6053/11295/9846 6049/11296/9847
+f 6049/11296/9847 6053/11295/9846 11785/11297/9848 11786/11298/9849
+f 6048/11290/9843 11765/11292/9845 11766/11299/9850 6053/11295/9846
+f 6053/11295/9846 11766/11299/9850 13422/11300/9851 11785/11297/9848
+f 6046/11280/9838 6049/11296/9847 6054/11301/9852 6050/11281/9839
+f 6050/11281/9839 6054/11301/9852 11760/11302/9834 11759/11286/9829
+f 6049/11296/9847 11786/11298/9849 11787/11303/9853 6054/11301/9852
+f 6054/11301/9852 11787/11303/9853 13423/11304/9835 11760/11302/9834
+f 6055/11305/9854 6059/11306/9855 6060/11307/9856 6056/11308/9857
+f 6056/11308/9857 6060/11307/9856 11487/11309/9300 11486/11310/9294
+f 6059/11306/9855 11765/11311/9845 11764/11312/9844 6060/11307/9856
+f 6060/11307/9856 11764/11312/9844 13379/11313/5752 11487/11309/9300
+f 6055/11305/9854 6056/11308/9857 6061/11314/9858 6057/11315/9859
+f 6057/11315/9859 6061/11314/9858 11574/10772/9529 11573/10771/9528
+f 6056/11308/9857 11486/11310/9294 11485/11316/9293 6061/11314/9858
+f 6061/11314/9858 11485/11316/9293 13380/10773/9297 11574/10772/9529
+f 6055/11305/9854 6057/11315/9859 6062/11317/9860 6058/11318/9861
+f 6058/11318/9861 6062/11317/9860 11779/11319/9862 11780/11320/9863
+f 6057/11315/9859 11573/10771/9528 11572/10787/9538 6062/11317/9860
+f 6062/11317/9860 11572/10787/9538 13421/10789/5253 11779/11319/9862
+f 6055/11305/9854 6058/11318/9861 6063/11321/9864 6059/11306/9855
+f 6059/11306/9855 6063/11321/9864 11766/11322/9850 11765/11311/9845
+f 6058/11318/9861 11780/11320/9863 11781/11323/9865 6063/11321/9864
+f 6063/11321/9864 11781/11323/9865 13422/11324/9851 11766/11322/9850
+f 6064/11320/9866 6068/11325/9867 6069/11326/9868 6065/11327/9869
+f 6065/11327/9869 6069/11326/9868 11781/11323/9865 11780/11320/9863
+f 6068/11325/9867 11777/11328/9870 11778/11329/9871 6069/11326/9868
+f 6069/11326/9868 11778/11329/9871 13422/11324/9851 11781/11323/9865
+f 6064/11320/9866 6065/11327/9869 6070/11330/9872 6066/11319/9873
+f 6066/11319/9873 6070/11330/9872 11773/11331/9874 11774/11332/9875
+f 6065/11327/9869 11780/11320/9863 11779/11319/9862 6070/11330/9872
+f 6070/11330/9872 11779/11319/9862 13421/10789/5253 11773/11331/9874
+f 6064/11320/9866 6066/11319/9873 6071/11333/9876 6067/11334/9877
+f 6067/11334/9877 6071/11333/9876 11772/9849/8654 11771/9845/8650
+f 6066/11319/9873 11774/11332/9875 11775/11335/9878 6071/11333/9876
+f 6071/11333/9876 11775/11335/9878 13395/6524/5773 11772/9849/8654
+f 6064/11320/9866 6067/11334/9877 6072/11336/9879 6068/11325/9867
+f 6068/11325/9867 6072/11336/9879 11776/11337/9880 11777/11328/9870
+f 6067/11334/9877 11771/9845/8650 11770/9844/8649 6072/11336/9879
+f 6072/11336/9879 11770/9844/8649 13420/9847/8652 11776/11337/9880
+f 6073/11338/9881 6077/11339/9882 6078/11340/9883 6074/11341/9884
+f 6074/11341/9884 6078/11340/9883 11787/11303/9853 11786/11298/9849
+f 6077/11339/9882 11783/11342/9885 11784/11343/9886 6078/11340/9883
+f 6078/11340/9883 11784/11343/9886 13423/11304/9835 11787/11303/9853
+f 6073/11338/9881 6074/11341/9884 6079/11344/9887 6075/11345/9888
+f 6075/11345/9888 6079/11344/9887 11778/11346/9871 11777/11347/9870
+f 6074/11341/9884 11786/11298/9849 11785/11297/9848 6079/11344/9887
+f 6079/11344/9887 11785/11297/9848 13422/11300/9851 11778/11346/9871
+f 6073/11338/9881 6075/11345/9888 6080/11348/9889 6076/11349/9890
+f 6076/11349/9890 6080/11348/9889 11769/9846/8651 11768/9839/8644
+f 6075/11345/9888 11777/11347/9870 11776/11350/9880 6080/11348/9889
+f 6080/11348/9889 11776/11350/9880 13420/9847/8652 11769/9846/8651
+f 6073/11338/9881 6076/11349/9890 6081/11351/9891 6077/11339/9882
+f 6077/11339/9882 6081/11351/9891 11782/11352/9892 11783/11342/9885
+f 6076/11349/9890 11768/9839/8644 11767/9838/8643 6081/11351/9891
+f 6081/11351/9891 11767/9838/8643 13419/9841/8646 11782/11352/9892
+f 6082/11353/9893 6086/11354/9894 6087/11355/9895 6083/11356/9896
+f 6083/11356/9896 6087/11355/9895 11793/11279/9837 11792/11275/9833
+f 6086/11354/9894 11789/11357/9897 11790/11358/9898 6087/11355/9895
+f 6087/11355/9895 11790/11358/9898 13424/10760/6247 11793/11279/9837
+f 6082/11353/9893 6083/11356/9896 6088/11359/9899 6084/11360/9900
+f 6084/11360/9900 6088/11359/9899 11784/11361/9886 11783/11362/9885
+f 6083/11356/9896 11792/11275/9833 11791/11274/9832 6088/11359/9899
+f 6088/11359/9899 11791/11274/9832 13423/11277/9835 11784/11361/9886
+f 6082/11353/9893 6084/11360/9900 6089/11363/9901 6085/11364/9902
+f 6085/11364/9902 6089/11363/9901 11763/9840/8645 11762/9835/8640
+f 6084/11360/9900 11783/11362/9885 11782/11365/9892 6089/11363/9901
+f 6089/11363/9901 11782/11365/9892 13419/9841/8646 11763/9840/8645
+f 6082/11353/9893 6085/11364/9902 6090/11366/9903 6086/11354/9894
+f 6086/11354/9894 6090/11366/9903 11788/11367/9904 11789/11357/9897
+f 6085/11364/9902 11762/9835/8640 11761/9834/8639 6090/11366/9903
+f 6090/11366/9903 11761/9834/8639 13393/6518/5767 11788/11367/9904
+f 6091/11368/9905 6095/11369/9906 6096/11370/9907 6092/11371/9908
+f 6092/11371/9908 6096/11370/9907 11799/10763/6249 11798/10758/6245
+f 6095/11369/9906 11795/11372/9909 11796/11373/4947 6096/11370/9907
+f 6096/11370/9907 11796/11373/4947 13425/10764/125 11799/10763/6249
+f 6091/11368/9905 6092/11371/9908 6097/11374/9910 6093/11375/9911
+f 6093/11375/9911 6097/11374/9910 11790/11358/9898 11789/11357/9897
+f 6092/11371/9908 11798/10758/6245 11797/10757/6244 6097/11374/9910
+f 6097/11374/9910 11797/10757/6244 13424/10760/6247 11790/11358/9898
+f 6091/11368/9905 6093/11375/9911 6098/11376/9912 6094/11377/9913
+f 6094/11377/9913 6098/11376/9912 11571/6517/5766 11570/6509/5758
+f 6093/11375/9911 11789/11357/9897 11788/11367/9904 6098/11376/9912
+f 6098/11376/9912 11788/11367/9904 13393/6518/5767 11571/6517/5766
+f 6091/11368/9905 6094/11377/9913 6099/11378/9914 6095/11369/9906
+f 6095/11369/9906 6099/11378/9914 11794/11379/9915 11795/11372/9909
+f 6094/11377/9913 11570/6509/5758 11569/6508/5757 6099/11378/9914
+f 6099/11378/9914 11569/6508/5757 13394/6512/5761 11794/11379/9915
+f 6100/11380/9916 6104/11381/9917 6105/11382/4957 6101/11383/4956
+f 6101/11383/4956 6105/11382/4957 11805/10808/143 11804/10805/130
+f 6104/11381/9917 11801/11384/9918 11802/11385/4959 6105/11382/4957
+f 6105/11382/4957 11802/11385/4959 13426/10809/145 11805/10808/143
+f 6100/11380/9916 6101/11383/4956 6106/11386/4966 6102/11387/9919
+f 6102/11387/9919 6106/11386/4966 11796/11373/4947 11795/11372/9909
+f 6101/11383/4956 11804/10805/130 11803/10804/131 6106/11386/4966
+f 6106/11386/4966 11803/10804/131 13425/10764/125 11796/11373/4947
+f 6100/11380/9916 6102/11387/9919 6107/11388/9920 6103/11389/9921
+f 6103/11389/9921 6107/11388/9920 11592/6540/5789 11591/6534/5783
+f 6102/11387/9919 11795/11372/9909 11794/11379/9915 6107/11388/9920
+f 6107/11388/9920 11794/11379/9915 13394/6512/5761 11592/6540/5789
+f 6100/11380/9916 6103/11389/9921 6108/11390/9922 6104/11381/9917
+f 6104/11381/9917 6108/11390/9922 11800/11391/9923 11801/11384/9918
+f 6103/11389/9921 11591/6534/5783 11590/6533/5782 6108/11390/9922
+f 6108/11390/9922 11590/6533/5782 13397/6537/5786 11800/11391/9923
+f 6109/11392/9924 6113/11393/9925 6114/11394/4969 6110/11395/4968
+f 6110/11395/4968 6114/11394/4969 11811/10848/163 11810/10845/150
+f 6113/11393/9925 11807/11396/9926 11808/11397/4971 6114/11394/4969
+f 6114/11394/4969 11808/11397/4971 13427/10849/165 11811/10848/163
+f 6109/11392/9924 6110/11395/4968 6115/11398/4978 6111/11399/9927
+f 6111/11399/9927 6115/11398/4978 11802/11385/4959 11801/11384/9918
+f 6110/11395/4968 11810/10845/150 11809/10844/151 6115/11398/4978
+f 6115/11398/4978 11809/10844/151 13426/10809/145 11802/11385/4959
+f 6109/11392/9924 6111/11399/9927 6116/11400/9928 6112/11401/9929
+f 6112/11401/9929 6116/11400/9928 11607/6560/5809 11606/6554/5803
+f 6111/11399/9927 11801/11384/9918 11800/11391/9923 6116/11400/9928
+f 6116/11400/9928 11800/11391/9923 13397/6537/5786 11607/6560/5809
+f 6109/11392/9924 6112/11401/9929 6117/11402/9930 6113/11393/9925
+f 6113/11393/9925 6117/11402/9930 11806/11403/9931 11807/11396/9926
+f 6112/11401/9929 11606/6554/5803 11605/6553/5802 6117/11402/9930
+f 6117/11402/9930 11605/6553/5802 13399/6557/5806 11806/11403/9931
+f 6118/11404/9932 6122/11405/9933 6123/11406/4981 6119/11407/4980
+f 6119/11407/4980 6123/11406/4981 11817/10888/183 11816/10885/170
+f 6122/11405/9933 11813/11408/9934 11814/11409/4983 6123/11406/4981
+f 6123/11406/4981 11814/11409/4983 13428/10889/185 11817/10888/183
+f 6118/11404/9932 6119/11407/4980 6124/11410/4990 6120/11411/9935
+f 6120/11411/9935 6124/11410/4990 11808/11397/4971 11807/11396/9926
+f 6119/11407/4980 11816/10885/170 11815/10884/171 6124/11410/4990
+f 6124/11410/4990 11815/10884/171 13427/10849/165 11808/11397/4971
+f 6118/11404/9932 6120/11411/9935 6125/11412/9936 6121/11413/9937
+f 6121/11413/9937 6125/11412/9936 11622/6580/5829 11621/6574/5823
+f 6120/11411/9935 11807/11396/9926 11806/11403/9931 6125/11412/9936
+f 6125/11412/9936 11806/11403/9931 13399/6557/5806 11622/6580/5829
+f 6118/11404/9932 6121/11413/9937 6126/11414/9938 6122/11405/9933
+f 6122/11405/9933 6126/11414/9938 11812/11415/9939 11813/11408/9934
+f 6121/11413/9937 11621/6574/5823 11620/6573/5822 6126/11414/9938
+f 6126/11414/9938 11620/6573/5822 13401/6577/5826 11812/11415/9939
+f 6127/11416/9940 6131/11417/9941 6132/11418/4993 6128/11419/4992
+f 6128/11419/4992 6132/11418/4993 11823/10928/203 11822/10925/190
+f 6131/11417/9941 11819/11420/9942 11820/11421/4995 6132/11418/4993
+f 6132/11418/4993 11820/11421/4995 13429/10929/205 11823/10928/203
+f 6127/11416/9940 6128/11419/4992 6133/11422/5002 6129/11423/9943
+f 6129/11423/9943 6133/11422/5002 11814/11409/4983 11813/11408/9934
+f 6128/11419/4992 11822/10925/190 11821/10924/191 6133/11422/5002
+f 6133/11422/5002 11821/10924/191 13428/10889/185 11814/11409/4983
+f 6127/11416/9940 6129/11423/9943 6134/11424/9944 6130/11425/9945
+f 6130/11425/9945 6134/11424/9944 11637/6600/5849 11636/6594/5843
+f 6129/11423/9943 11813/11408/9934 11812/11415/9939 6134/11424/9944
+f 6134/11424/9944 11812/11415/9939 13401/6577/5826 11637/6600/5849
+f 6127/11416/9940 6130/11425/9945 6135/11426/9946 6131/11417/9941
+f 6131/11417/9941 6135/11426/9946 11818/11427/9947 11819/11420/9942
+f 6130/11425/9945 11636/6594/5843 11635/6593/5842 6135/11426/9946
+f 6135/11426/9946 11635/6593/5842 13403/6597/5846 11818/11427/9947
+f 6136/11428/9948 6140/11429/9949 6141/11430/5005 6137/11431/5004
+f 6137/11431/5004 6141/11430/5005 11829/10968/223 11828/10965/210
+f 6140/11429/9949 11825/11432/9950 11826/11433/5007 6141/11430/5005
+f 6141/11430/5005 11826/11433/5007 13430/10969/225 11829/10968/223
+f 6136/11428/9948 6137/11431/5004 6142/11434/5014 6138/11435/9951
+f 6138/11435/9951 6142/11434/5014 11820/11421/4995 11819/11420/9942
+f 6137/11431/5004 11828/10965/210 11827/10964/211 6142/11434/5014
+f 6142/11434/5014 11827/10964/211 13429/10929/205 11820/11421/4995
+f 6136/11428/9948 6138/11435/9951 6143/11436/9952 6139/11437/9953
+f 6139/11437/9953 6143/11436/9952 11652/6620/5869 11651/6614/5863
+f 6138/11435/9951 11819/11420/9942 11818/11427/9947 6143/11436/9952
+f 6143/11436/9952 11818/11427/9947 13403/6597/5846 11652/6620/5869
+f 6136/11428/9948 6139/11437/9953 6144/11438/9954 6140/11429/9949
+f 6140/11429/9949 6144/11438/9954 11824/11439/9955 11825/11432/9950
+f 6139/11437/9953 11651/6614/5863 11650/6613/5862 6144/11438/9954
+f 6144/11438/9954 11650/6613/5862 13405/6617/5866 11824/11439/9955
+f 6145/11440/9956 6149/11441/9957 6150/11442/9958 6146/11443/9959
+f 6146/11443/9959 6150/11442/9958 11835/11008/6149 11834/11005/6146
+f 6149/11441/9957 11831/11444/9960 11832/11445/9961 6150/11442/9958
+f 6150/11442/9958 11832/11445/9961 13431/11009/6128 11835/11008/6149
+f 6145/11440/9956 6146/11443/9959 6151/11446/9962 6147/11447/9963
+f 6147/11447/9963 6151/11446/9962 11826/11433/5007 11825/11432/9950
+f 6146/11443/9959 11834/11005/6146 11833/11004/6145 6151/11446/9962
+f 6151/11446/9962 11833/11004/6145 13430/10969/225 11826/11433/5007
+f 6145/11440/9956 6147/11447/9963 6152/11448/9964 6148/11449/9965
+f 6148/11449/9965 6152/11448/9964 11667/6640/5889 11666/6634/5883
+f 6147/11447/9963 11825/11432/9950 11824/11439/9955 6152/11448/9964
+f 6152/11448/9964 11824/11439/9955 13405/6617/5866 11667/6640/5889
+f 6145/11440/9956 6148/11449/9965 6153/11450/9966 6149/11441/9957
+f 6149/11441/9957 6153/11450/9966 11830/11451/9967 11831/11444/9960
+f 6148/11449/9965 11666/6634/5883 11665/6633/5882 6153/11450/9966
+f 6153/11450/9966 11665/6633/5882 13407/6637/5886 11830/11451/9967
+f 6154/11452/9968 6158/11453/9969 6159/11454/9970 6155/11455/9971
+f 6155/11455/9971 6159/11454/9970 11841/11048/6130 11840/11045/254
+f 6158/11453/9969 11837/11456/9972 11838/11457/9973 6159/11454/9970
+f 6159/11454/9970 11838/11457/9973 13432/11049/5474 11841/11048/6130
+f 6154/11452/9968 6155/11455/9971 6160/11458/9974 6156/11459/9975
+f 6156/11459/9975 6160/11458/9974 11832/11445/9961 11831/11444/9960
+f 6155/11455/9971 11840/11045/254 11839/11044/6126 6160/11458/9974
+f 6160/11458/9974 11839/11044/6126 13431/11009/6128 11832/11445/9961
+f 6154/11452/9968 6156/11459/9975 6161/11460/9976 6157/11461/9977
+f 6157/11461/9977 6161/11460/9976 11682/6660/5909 11681/6654/5903
+f 6156/11459/9975 11831/11444/9960 11830/11451/9967 6161/11460/9976
+f 6161/11460/9976 11830/11451/9967 13407/6637/5886 11682/6660/5909
+f 6154/11452/9968 6157/11461/9977 6162/11462/9978 6158/11453/9969
+f 6158/11453/9969 6162/11462/9978 11836/11463/9979 11837/11456/9972
+f 6157/11461/9977 11681/6654/5903 11680/6653/5902 6162/11462/9978
+f 6162/11462/9978 11680/6653/5902 13409/6657/5906 11836/11463/9979
+f 6163/11464/9980 6167/11465/9981 6168/11466/9982 6164/11467/9983
+f 6164/11467/9983 6168/11466/9982 11847/11088/6111 11846/11085/6108
+f 6167/11465/9981 11843/11468/9984 11844/11469/9985 6168/11466/9982
+f 6168/11466/9982 11844/11469/9985 13433/11089/6090 11847/11088/6111
+f 6163/11464/9980 6164/11467/9983 6169/11470/9986 6165/11471/9987
+f 6165/11471/9987 6169/11470/9986 11838/11457/9973 11837/11456/9972
+f 6164/11467/9983 11846/11085/6108 11845/11084/6107 6169/11470/9986
+f 6169/11470/9986 11845/11084/6107 13432/11049/5474 11838/11457/9973
+f 6163/11464/9980 6165/11471/9987 6170/11472/9988 6166/11473/9989
+f 6166/11473/9989 6170/11472/9988 11697/6680/5929 11696/6674/5923
+f 6165/11471/9987 11837/11456/9972 11836/11463/9979 6170/11472/9988
+f 6170/11472/9988 11836/11463/9979 13409/6657/5906 11697/6680/5929
+f 6163/11464/9980 6166/11473/9989 6171/11474/9990 6167/11465/9981
+f 6167/11465/9981 6171/11474/9990 11842/11475/9991 11843/11468/9984
+f 6166/11473/9989 11696/6674/5923 11695/6673/5922 6171/11474/9990
+f 6171/11474/9990 11695/6673/5922 13411/6677/5926 11842/11475/9991
+f 6172/11476/9992 6176/11477/9993 6177/11478/9994 6173/11479/9995
+f 6173/11479/9995 6177/11478/9994 11853/11128/6092 11852/11125/6088
+f 6176/11477/9993 11849/11480/9996 11850/11481/9997 6177/11478/9994
+f 6177/11478/9994 11850/11481/9997 13434/11129/6070 11853/11128/6092
+f 6172/11476/9992 6173/11479/9995 6178/11482/9998 6174/11483/9999
+f 6174/11483/9999 6178/11482/9998 11844/11469/9985 11843/11468/9984
+f 6173/11479/9995 11852/11125/6088 11851/11124/6087 6178/11482/9998
+f 6178/11482/9998 11851/11124/6087 13433/11089/6090 11844/11469/9985
+f 6172/11476/9992 6174/11483/9999 6179/11484/10000 6175/11485/10001
+f 6175/11485/10001 6179/11484/10000 11712/6700/5949 11711/6694/5943
+f 6174/11483/9999 11843/11468/9984 11842/11475/9991 6179/11484/10000
+f 6179/11484/10000 11842/11475/9991 13411/6677/5926 11712/6700/5949
+f 6172/11476/9992 6175/11485/10001 6180/11486/10002 6176/11477/9993
+f 6176/11477/9993 6180/11486/10002 11848/11487/10003 11849/11480/9996
+f 6175/11485/10001 11711/6694/5943 11710/6693/5942 6180/11486/10002
+f 6180/11486/10002 11710/6693/5942 13413/6697/5946 11848/11487/10003
+f 6181/11488/10004 6185/11489/10005 6186/11490/10006 6182/11491/10007
+f 6182/11491/10007 6186/11490/10006 11859/11168/6072 11858/11165/6068
+f 6185/11489/10005 11855/11492/10008 11856/11493/10009 6186/11490/10006
+f 6186/11490/10006 11856/11493/10009 13435/11169/6050 11859/11168/6072
+f 6181/11488/10004 6182/11491/10007 6187/11494/10010 6183/11495/10011
+f 6183/11495/10011 6187/11494/10010 11850/11481/9997 11849/11480/9996
+f 6182/11491/10007 11858/11165/6068 11857/11164/6067 6187/11494/10010
+f 6187/11494/10010 11857/11164/6067 13434/11129/6070 11850/11481/9997
+f 6181/11488/10004 6183/11495/10011 6188/11496/10012 6184/11497/10013
+f 6184/11497/10013 6188/11496/10012 11727/6720/5969 11726/6714/5963
+f 6183/11495/10011 11849/11480/9996 11848/11487/10003 6188/11496/10012
+f 6188/11496/10012 11848/11487/10003 13413/6697/5946 11727/6720/5969
+f 6181/11488/10004 6184/11497/10013 6189/11498/10014 6185/11489/10005
+f 6185/11489/10005 6189/11498/10014 11854/11499/10015 11855/11492/10008
+f 6184/11497/10013 11726/6714/5963 11725/6713/5962 6189/11498/10014
+f 6189/11498/10014 11725/6713/5962 13415/6717/5966 11854/11499/10015
+f 6190/11500/10016 6194/11501/10017 6195/11502/10018 6191/11503/10019
+f 6191/11503/10019 6195/11502/10018 11865/11208/6052 11864/11205/6048
+f 6194/11501/10017 11861/11504/10020 11862/11505/10021 6195/11502/10018
+f 6195/11502/10018 11862/11505/10021 13436/11209/6030 11865/11208/6052
+f 6190/11500/10016 6191/11503/10019 6196/11506/10022 6192/11507/10023
+f 6192/11507/10023 6196/11506/10022 11856/11493/10009 11855/11492/10008
+f 6191/11503/10019 11864/11205/6048 11863/11204/6047 6196/11506/10022
+f 6196/11506/10022 11863/11204/6047 13435/11169/6050 11856/11493/10009
+f 6190/11500/10016 6192/11507/10023 6197/11508/10024 6193/11509/10025
+f 6193/11509/10025 6197/11508/10024 11742/6740/5989 11741/6734/5983
+f 6192/11507/10023 11855/11492/10008 11854/11499/10015 6197/11508/10024
+f 6197/11508/10024 11854/11499/10015 13415/6717/5966 11742/6740/5989
+f 6190/11500/10016 6193/11509/10025 6198/11510/10026 6194/11501/10017
+f 6194/11501/10017 6198/11510/10026 11860/11511/10027 11861/11504/10020
+f 6193/11509/10025 11741/6734/5983 11740/6733/5982 6198/11510/10026
+f 6198/11510/10026 11740/6733/5982 13417/6737/5986 11860/11511/10027
+f 6199/11512/10028 6203/11513/10029 6204/11514/10030 6200/11515/10031
+f 6200/11515/10031 6204/11514/10030 11868/11244/6032 11867/11242/6028
+f 6203/11513/10029 9674/5566/4873 9673/5565/4872 6204/11514/10030
+f 6204/11514/10030 9673/5565/4872 13067/5295/977 11868/11244/6032
+f 6199/11512/10028 6200/11515/10031 6205/11516/10032 6201/11517/10033
+f 6201/11517/10033 6205/11516/10032 11862/11505/10021 11861/11504/10020
+f 6200/11515/10031 11867/11242/6028 11866/11241/6027 6205/11516/10032
+f 6205/11516/10032 11866/11241/6027 13436/11209/6030 11862/11505/10021
+f 6199/11512/10028 6201/11517/10033 6206/11518/10034 6202/11519/10035
+f 6202/11519/10035 6206/11518/10034 11754/6757/6006 11753/6754/6003
+f 6201/11517/10033 11861/11504/10020 11860/11511/10027 6206/11518/10034
+f 6206/11518/10034 11860/11511/10027 13417/6737/5986 11754/6757/6006
+f 6199/11512/10028 6202/11519/10035 6207/11520/10036 6203/11513/10029
+f 6203/11513/10029 6207/11520/10036 9675/5569/4876 9674/5566/4873
+f 6202/11519/10035 11753/6754/6003 11752/6753/6002 6207/11520/10036
+f 6207/11520/10036 11752/6753/6002 13048/1026/951 9675/5569/4876
+f 6208/11257/10037 6212/11259/10038 6213/11521/10039 6209/11522/10040
+f 6209/11522/10040 6213/11521/10039 11874/11259/5034 11873/11257/5029
+f 6212/11259/10038 11870/11227/10041 11871/11523/10042 6213/11521/10039
+f 6213/11521/10039 11871/11523/10042 13437/11227/5035 11874/11259/5034
+f 6208/11257/10037 6209/11522/10040 6214/11524/10043 6210/11256/10044
+f 6210/11256/10044 6214/11524/10043 9681/5582/4894 9680/5316/4892
+f 6209/11522/10040 11873/11257/5029 11872/11256/5028 6214/11524/10043
+f 6214/11524/10043 11872/11256/5028 13068/5316/9 9681/5582/4894
+f 6208/11257/10037 6210/11256/10044 6215/11525/10045 6211/11526/10046
+f 6211/11526/10046 6215/11525/10045 11757/6763/6012 11756/6761/6010
+f 6210/11256/10044 9680/5316/4892 9679/5580/4891 6215/11525/10045
+f 6215/11525/10045 9679/5580/4891 13049/1032/957 11757/6763/6012
+f 6208/11257/10037 6211/11526/10046 6216/11527/10047 6212/11259/10038
+f 6212/11259/10038 6216/11527/10047 11869/11528/10048 11870/11227/10041
+f 6211/11526/10046 11756/6761/6010 11755/6760/6009 6216/11527/10047
+f 6216/11527/10047 11755/6760/6009 13418/6748/5997 11869/11528/10048
+f 6217/11225/10049 6221/11229/10050 6222/11529/10051 6218/11530/10052
+f 6218/11530/10052 6222/11529/10051 11880/11229/5054 11879/11225/5049
+f 6221/11229/10050 11876/11187/10053 11877/11531/10054 6222/11529/10051
+f 6222/11529/10051 11877/11531/10054 13438/11187/5055 11880/11229/5054
+f 6217/11225/10049 6218/11530/10052 6223/11532/10055 6219/11224/10056
+f 6219/11224/10056 6223/11532/10055 11871/11523/10042 11870/11227/10041
+f 6218/11530/10052 11879/11225/5049 11878/11224/5048 6223/11532/10055
+f 6223/11532/10055 11878/11224/5048 13437/11227/5035 11871/11523/10042
+f 6217/11225/10049 6219/11224/10056 6224/11533/10057 6220/11534/10058
+f 6220/11534/10058 6224/11533/10057 11748/6747/5996 11747/6744/5993
+f 6219/11224/10056 11870/11227/10041 11869/11528/10048 6224/11533/10057
+f 6224/11533/10057 11869/11528/10048 13418/6748/5997 11748/6747/5996
+f 6217/11225/10049 6220/11534/10058 6225/11535/10059 6221/11229/10050
+f 6221/11229/10050 6225/11535/10059 11875/11536/10060 11876/11187/10053
+f 6220/11534/10058 11747/6744/5993 11746/6743/5992 6225/11535/10059
+f 6225/11535/10059 11746/6743/5992 13416/6728/5977 11875/11536/10060
+f 6226/11185/10061 6230/11189/10062 6231/11537/10063 6227/11538/10064
+f 6227/11538/10064 6231/11537/10063 11886/11189/5074 11885/11185/5069
+f 6230/11189/10062 11882/11147/10065 11883/11539/10066 6231/11537/10063
+f 6231/11537/10063 11883/11539/10066 13439/11147/5075 11886/11189/5074
+f 6226/11185/10061 6227/11538/10064 6232/11540/10067 6228/11184/10068
+f 6228/11184/10068 6232/11540/10067 11877/11531/10054 11876/11187/10053
+f 6227/11538/10064 11885/11185/5069 11884/11184/5068 6232/11540/10067
+f 6232/11540/10067 11884/11184/5068 13438/11187/5055 11877/11531/10054
+f 6226/11185/10061 6228/11184/10068 6233/11541/10069 6229/11542/10070
+f 6229/11542/10070 6233/11541/10069 11733/6727/5976 11732/6724/5973
+f 6228/11184/10068 11876/11187/10053 11875/11536/10060 6233/11541/10069
+f 6233/11541/10069 11875/11536/10060 13416/6728/5977 11733/6727/5976
+f 6226/11185/10061 6229/11542/10070 6234/11543/10071 6230/11189/10062
+f 6230/11189/10062 6234/11543/10071 11881/11544/10072 11882/11147/10065
+f 6229/11542/10070 11732/6724/5973 11731/6723/5972 6234/11543/10071
+f 6234/11543/10071 11731/6723/5972 13414/6708/5957 11881/11544/10072
+f 6235/11145/10073 6239/11149/10074 6240/11545/10075 6236/11546/10076
+f 6236/11546/10076 6240/11545/10075 11892/11149/5094 11891/11145/5089
+f 6239/11149/10074 11888/11107/10077 11889/11547/10078 6240/11545/10075
+f 6240/11545/10075 11889/11547/10078 13440/11107/5095 11892/11149/5094
+f 6235/11145/10073 6236/11546/10076 6241/11548/10079 6237/11144/10080
+f 6237/11144/10080 6241/11548/10079 11883/11539/10066 11882/11147/10065
+f 6236/11546/10076 11891/11145/5089 11890/11144/5088 6241/11548/10079
+f 6241/11548/10079 11890/11144/5088 13439/11147/5075 11883/11539/10066
+f 6235/11145/10073 6237/11144/10080 6242/11549/10081 6238/11550/10082
+f 6238/11550/10082 6242/11549/10081 11718/6707/5956 11717/6704/5953
+f 6237/11144/10080 11882/11147/10065 11881/11544/10072 6242/11549/10081
+f 6242/11549/10081 11881/11544/10072 13414/6708/5957 11718/6707/5956
+f 6235/11145/10073 6238/11550/10082 6243/11551/10083 6239/11149/10074
+f 6239/11149/10074 6243/11551/10083 11887/11552/10084 11888/11107/10077
+f 6238/11550/10082 11717/6704/5953 11716/6703/5952 6243/11551/10083
+f 6243/11551/10083 11716/6703/5952 13412/6688/5937 11887/11552/10084
+f 6244/11105/10085 6248/11109/10086 6249/11553/10087 6245/11554/10088
+f 6245/11554/10088 6249/11553/10087 11898/11109/9731 11897/11105/5109
+f 6248/11109/10086 11894/11555/10089 11895/11556/10090 6249/11553/10087
+f 6249/11553/10087 11895/11556/10090 13441/11067/5115 11898/11109/9731
+f 6244/11105/10085 6245/11554/10088 6250/11557/10091 6246/11104/10092
+f 6246/11104/10092 6250/11557/10091 11889/11547/10078 11888/11107/10077
+f 6245/11554/10088 11897/11105/5109 11896/11104/5108 6250/11557/10091
+f 6250/11557/10091 11896/11104/5108 13440/11107/5095 11889/11547/10078
+f 6244/11105/10085 6246/11104/10092 6251/11558/10093 6247/11559/10094
+f 6247/11559/10094 6251/11558/10093 11703/6687/5936 11702/6684/5933
+f 6246/11104/10092 11888/11107/10077 11887/11552/10084 6251/11558/10093
+f 6251/11558/10093 11887/11552/10084 13412/6688/5937 11703/6687/5936
+f 6244/11105/10085 6247/11559/10094 6252/11560/10095 6248/11109/10086
+f 6248/11109/10086 6252/11560/10095 11893/11561/10096 11894/11555/10089
+f 6247/11559/10094 11702/6684/5933 11701/6683/5932 6252/11560/10095
+f 6252/11560/10095 11701/6683/5932 13410/6668/5917 11893/11561/10096
+f 6253/11065/10097 6257/11069/10098 6258/11562/10099 6254/11563/10100
+f 6254/11563/10100 6258/11562/10099 11904/11069/5133 11903/11065/1221
+f 6257/11069/10098 11900/11027/10101 11901/11564/10102 6258/11562/10099
+f 6258/11562/10099 11901/11564/10102 13442/11027/5134 11904/11069/5133
+f 6253/11065/10097 6254/11563/10100 6259/11565/10103 6255/11064/10104
+f 6255/11064/10104 6259/11565/10103 11895/11556/10090 11894/11555/10089
+f 6254/11563/10100 11903/11065/1221 11902/11064/5128 6259/11565/10103
+f 6259/11565/10103 11902/11064/5128 13441/11067/5115 11895/11556/10090
+f 6253/11065/10097 6255/11064/10104 6260/11566/10105 6256/11567/10106
+f 6256/11567/10106 6260/11566/10105 11688/6667/5916 11687/6664/5913
+f 6255/11064/10104 11894/11555/10089 11893/11561/10096 6260/11566/10105
+f 6260/11566/10105 11893/11561/10096 13410/6668/5917 11688/6667/5916
+f 6253/11065/10097 6256/11567/10106 6261/11568/10107 6257/11069/10098
+f 6257/11069/10098 6261/11568/10107 11899/11569/10108 11900/11027/10101
+f 6256/11567/10106 11687/6664/5913 11686/6663/5912 6261/11568/10107
+f 6261/11568/10107 11686/6663/5912 13408/6648/5897 11899/11569/10108
+f 6262/11025/10109 6266/11570/10110 6267/11571/10111 6263/11572/10112
+f 6263/11572/10112 6267/11571/10111 11910/11029/5153 11909/11025/5148
+f 6266/11570/10110 11906/10987/10113 11907/11573/4740 6267/11571/10111
+f 6267/11571/10111 11907/11573/4740 13443/10987/1182 11910/11029/5153
+f 6262/11025/10109 6263/11572/10112 6268/11574/10114 6264/11024/10115
+f 6264/11024/10115 6268/11574/10114 11901/11564/10102 11900/11027/10101
+f 6263/11572/10112 11909/11025/5148 11908/11024/5147 6268/11574/10114
+f 6268/11574/10114 11908/11024/5147 13442/11027/5134 11901/11564/10102
+f 6262/11025/10109 6264/11024/10115 6269/11575/10116 6265/11576/10117
+f 6265/11576/10117 6269/11575/10116 11673/6647/5896 11672/6644/5893
+f 6264/11024/10115 11900/11027/10101 11899/11569/10108 6269/11575/10116
+f 6269/11575/10116 11899/11569/10108 13408/6648/5897 11673/6647/5896
+f 6262/11025/10109 6265/11576/10117 6270/11577/10118 6266/11570/10110
+f 6266/11570/10110 6270/11577/10118 11905/11578/10119 11906/10987/10113
+f 6265/11576/10117 11672/6644/5893 11671/6643/5892 6270/11577/10118
+f 6270/11577/10118 11671/6643/5892 13406/6628/5877 11905/11578/10119
+f 6271/10985/10120 6275/10989/10121 6276/11579/4750 6272/11580/4749
+f 6272/11580/4749 6276/11579/4750 11916/10989/1175 11915/10985/1176
+f 6275/10989/10121 11912/10947/10122 11913/11581/4752 6276/11579/4750
+f 6276/11579/4750 11913/11581/4752 13444/10947/1162 11916/10989/1175
+f 6271/10985/10120 6272/11580/4749 6277/11582/4759 6273/10984/10123
+f 6273/10984/10123 6277/11582/4759 11907/11573/4740 11906/10987/10113
+f 6272/11580/4749 11915/10985/1176 11914/10984/1181 6277/11582/4759
+f 6277/11582/4759 11914/10984/1181 13443/10987/1182 11907/11573/4740
+f 6271/10985/10120 6273/10984/10123 6278/11583/10124 6274/11584/10125
+f 6274/11584/10125 6278/11583/10124 11658/6627/5876 11657/6624/5873
+f 6273/10984/10123 11906/10987/10113 11905/11578/10119 6278/11583/10124
+f 6278/11583/10124 11905/11578/10119 13406/6628/5877 11658/6627/5876
+f 6271/10985/10120 6274/11584/10125 6279/11585/10126 6275/10989/10121
+f 6275/10989/10121 6279/11585/10126 11911/11586/10127 11912/10947/10122
+f 6274/11584/10125 11657/6624/5873 11656/6623/5872 6279/11585/10126
+f 6279/11585/10126 11656/6623/5872 13404/6608/5857 11911/11586/10127
+f 6280/10945/10128 6284/10949/10129 6285/11587/4762 6281/11588/4761
+f 6281/11588/4761 6285/11587/4762 11922/10949/1155 11921/10945/1156
+f 6284/10949/10129 11918/10907/10130 11919/11589/4764 6285/11587/4762
+f 6285/11587/4762 11919/11589/4764 13445/10907/1142 11922/10949/1155
+f 6280/10945/10128 6281/11588/4761 6286/11590/4771 6282/11591/10131
+f 6282/11591/10131 6286/11590/4771 11913/11581/4752 11912/10947/10122
+f 6281/11588/4761 11921/10945/1156 11920/10944/1161 6286/11590/4771
+f 6286/11590/4771 11920/10944/1161 13444/10947/1162 11913/11581/4752
+f 6280/10945/10128 6282/11591/10131 6287/11592/10132 6283/11593/10133
+f 6283/11593/10133 6287/11592/10132 11643/6607/5856 11642/6604/5853
+f 6282/11591/10131 11912/10947/10122 11911/11586/10127 6287/11592/10132
+f 6287/11592/10132 11911/11586/10127 13404/6608/5857 11643/6607/5856
+f 6280/10945/10128 6283/11593/10133 6288/11594/10134 6284/10949/10129
+f 6284/10949/10129 6288/11594/10134 11917/11595/10135 11918/10907/10130
+f 6283/11593/10133 11642/6604/5853 11641/6603/5852 6288/11594/10134
+f 6288/11594/10134 11641/6603/5852 13402/6588/5837 11917/11595/10135
+f 6289/10905/10136 6293/10909/10137 6294/11596/4774 6290/11597/4773
+f 6290/11597/4773 6294/11596/4774 11928/10909/1135 11927/10905/1136
+f 6293/10909/10137 11924/10867/10138 11925/11598/4776 6294/11596/4774
+f 6294/11596/4774 11925/11598/4776 13446/10867/1122 11928/10909/1135
+f 6289/10905/10136 6290/11597/4773 6295/11599/4783 6291/10904/10139
+f 6291/10904/10139 6295/11599/4783 11919/11589/4764 11918/10907/10130
+f 6290/11597/4773 11927/10905/1136 11926/10904/1141 6295/11599/4783
+f 6295/11599/4783 11926/10904/1141 13445/10907/1142 11919/11589/4764
+f 6289/10905/10136 6291/10904/10139 6296/11600/10140 6292/11601/10141
+f 6292/11601/10141 6296/11600/10140 11628/6587/5836 11627/6584/5833
+f 6291/10904/10139 11918/10907/10130 11917/11595/10135 6296/11600/10140
+f 6296/11600/10140 11917/11595/10135 13402/6588/5837 11628/6587/5836
+f 6289/10905/10136 6292/11601/10141 6297/11602/10142 6293/10909/10137
+f 6293/10909/10137 6297/11602/10142 11923/11603/10143 11924/10867/10138
+f 6292/11601/10141 11627/6584/5833 11626/6583/5832 6297/11602/10142
+f 6297/11602/10142 11626/6583/5832 13400/6568/5817 11923/11603/10143
+f 6298/10865/10144 6302/10869/10145 6303/11604/4786 6299/11605/4785
+f 6299/11605/4785 6303/11604/4786 11934/10869/1115 11933/10865/1116
+f 6302/10869/10145 11930/10827/10146 11931/11606/4788 6303/11604/4786
+f 6303/11604/4786 11931/11606/4788 13447/10827/1102 11934/10869/1115
+f 6298/10865/10144 6299/11605/4785 6304/11607/4795 6300/10864/10147
+f 6300/10864/10147 6304/11607/4795 11925/11598/4776 11924/10867/10138
+f 6299/11605/4785 11933/10865/1116 11932/10864/1121 6304/11607/4795
+f 6304/11607/4795 11932/10864/1121 13446/10867/1122 11925/11598/4776
+f 6298/10865/10144 6300/10864/10147 6305/11608/10148 6301/11609/10149
+f 6301/11609/10149 6305/11608/10148 11613/6567/5816 11612/6564/5813
+f 6300/10864/10147 11924/10867/10138 11923/11603/10143 6305/11608/10148
+f 6305/11608/10148 11923/11603/10143 13400/6568/5817 11613/6567/5816
+f 6298/10865/10144 6301/11609/10149 6306/11610/10150 6302/10869/10145
+f 6302/10869/10145 6306/11610/10150 11929/11611/10151 11930/10827/10146
+f 6301/11609/10149 11612/6564/5813 11611/6563/5812 6306/11610/10150
+f 6306/11610/10150 11611/6563/5812 13398/6548/5797 11929/11611/10151
+f 6307/10825/10152 6311/10829/10153 6312/11612/4798 6308/11613/4797
+f 6308/11613/4797 6312/11612/4798 11940/10829/1095 11939/10825/1096
+f 6311/10829/10153 11936/10785/10154 11937/11614/4800 6312/11612/4798
+f 6312/11612/4798 11937/11614/4800 13448/10785/1082 11940/10829/1095
+f 6307/10825/10152 6308/11613/4797 6313/11615/4807 6309/10824/10155
+f 6309/10824/10155 6313/11615/4807 11931/11606/4788 11930/10827/10146
+f 6308/11613/4797 11939/10825/1096 11938/10824/1101 6313/11615/4807
+f 6313/11615/4807 11938/10824/1101 13447/10827/1102 11931/11606/4788
+f 6307/10825/10152 6309/10824/10155 6314/11616/10156 6310/11617/10157
+f 6310/11617/10157 6314/11616/10156 11598/6547/5796 11597/6544/5793
+f 6309/10824/10155 11930/10827/10146 11929/11611/10151 6314/11616/10156
+f 6314/11616/10156 11929/11611/10151 13398/6548/5797 11598/6547/5796
+f 6307/10825/10152 6310/11617/10157 6315/11618/10158 6311/10829/10153
+f 6311/10829/10153 6315/11618/10158 11935/11619/10159 11936/10785/10154
+f 6310/11617/10157 11597/6544/5793 11596/6543/5792 6315/11618/10158
+f 6315/11618/10158 11596/6543/5792 13396/6528/5777 11935/11619/10159
+f 6316/10783/10160 6320/11620/10161 6321/11621/10162 6317/11622/10163
+f 6317/11622/10163 6321/11621/10162 11943/10788/5252 11942/10783/5247
+f 6320/11620/10161 11774/11332/9875 11773/11331/9874 6321/11621/10162
+f 6321/11621/10162 11773/11331/9874 13421/10789/5253 11943/10788/5252
+f 6316/10783/10160 6317/11622/10163 6322/11623/10164 6318/10782/10165
+f 6318/10782/10165 6322/11623/10164 11937/11614/4800 11936/10785/10154
+f 6317/11622/10163 11942/10783/5247 11941/10782/5246 6322/11623/10164
+f 6322/11623/10164 11941/10782/5246 13448/10785/1082 11937/11614/4800
+f 6316/10783/10160 6318/10782/10165 6323/11624/10166 6319/11625/10167
+f 6319/11625/10167 6323/11624/10166 11583/6527/5776 11582/6522/5771
+f 6318/10782/10165 11936/10785/10154 11935/11619/10159 6323/11624/10166
+f 6323/11624/10166 11935/11619/10159 13396/6528/5777 11583/6527/5776
+f 6316/10783/10160 6319/11625/10167 6324/11626/10168 6320/11620/10161
+f 6320/11620/10161 6324/11626/10168 11775/11335/9878 11774/11332/9875
+f 6319/11625/10167 11582/6522/5771 11581/6521/5770 6324/11626/10168
+f 6324/11626/10168 11581/6521/5770 13395/6524/5773 11775/11335/9878
+f 6325/11627/10169 6329/11628/10170 6330/11629/10171 6326/11630/10172
+f 6326/11630/10172 6330/11629/10171 12706/11631/10173 12707/11632/10174
+f 6329/11628/10170 9965/11633/6737 9964/11634/6736 6330/11629/10171
+f 6330/11629/10171 9964/11634/6736 13196/11635/6740 12706/11631/10173
+f 6325/11627/10169 6326/11630/10172 6331/11636/10175 6327/11637/10176
+f 6327/11637/10176 6331/11636/10175 12193/11638/10177 12194/11639/10178
+f 6326/11630/10172 12707/11632/10174 12708/11640/10179 6331/11636/10175
+f 6331/11636/10175 12708/11640/10179 13477/11641/10180 12193/11638/10177
+f 6325/11627/10169 6327/11637/10176 6332/11642/10181 6328/11643/10182
+f 6328/11643/10182 6332/11642/10181 11152/11644/6543 11151/11645/6538
+f 6327/11637/10176 12194/11639/10178 12195/11646/10183 6332/11642/10181
+f 6332/11642/10181 12195/11646/10183 13324/11647/6544 11152/11644/6543
+f 6325/11627/10169 6328/11643/10182 6333/11648/10184 6329/11628/10170
+f 6329/11628/10170 6333/11648/10184 9966/11649/6743 9965/11633/6737
+f 6328/11643/10182 11151/11645/6538 11150/11650/6537 6333/11648/10184
+f 6333/11648/10184 11150/11650/6537 13122/11651/6540 9966/11649/6743
+f 6334/11652/10185 6338/11653/10186 6339/11654/10187 6335/11655/10188
+f 6335/11655/10188 6339/11654/10187 12202/11656/10189 12203/11657/10190
+f 6338/11653/10186 12206/11658/10180 12207/11659/10180 6339/11654/10187
+f 6339/11654/10187 12207/11659/10180 13479/11660/10180 12202/11656/10189
+f 6334/11652/10185 6335/11655/10188 6340/11661/10191 6336/11662/10192
+f 6336/11662/10192 6340/11661/10191 10185/11663/6562 10184/11664/6557
+f 6335/11655/10188 12203/11657/10190 12204/11665/10193 6340/11661/10191
+f 6340/11661/10191 12204/11665/10193 13164/11666/6563 10185/11663/6562
+f 6334/11652/10185 6336/11662/10192 6341/11667/10194 6337/11668/10195
+f 6337/11668/10195 6341/11667/10194 12196/11669/10196 12197/11670/10197
+f 6336/11662/10192 10184/11664/6557 10183/11671/6556 6341/11667/10194
+f 6341/11667/10194 10183/11671/6556 13165/11672/6559 12196/11669/10196
+f 6334/11652/10185 6337/11668/10195 6342/11673/10198 6338/11653/10186
+f 6338/11653/10186 6342/11673/10198 12205/11674/10180 12206/11658/10180
+f 6337/11668/10195 12197/11670/10197 12198/11675/10199 6342/11673/10198
+f 6342/11673/10198 12198/11675/10199 13478/11676/10180 12205/11674/10180
+f 6343/11677/10200 6347/11678/10201 6348/11679/10202 6344/11680/10203
+f 6344/11680/10203 6348/11679/10202 12198/11675/10199 12197/11670/10197
+f 6347/11678/10201 12200/11681/10180 12201/11682/10180 6348/11679/10202
+f 6348/11679/10202 12201/11682/10180 13478/11676/10180 12198/11675/10199
+f 6343/11677/10200 6344/11680/10203 6349/11683/10204 6345/11684/10205
+f 6345/11684/10205 6349/11683/10204 10188/11685/8601 10187/11686/8599
+f 6344/11680/10203 12197/11670/10197 12196/11669/10196 6349/11683/10204
+f 6349/11683/10204 12196/11669/10196 13165/11672/6559 10188/11685/8601
+f 6343/11677/10200 6345/11684/10205 6350/11687/10206 6346/11688/10207
+f 6346/11688/10207 6350/11687/10206 12195/11646/10183 12194/11639/10178
+f 6345/11684/10205 10187/11686/8599 10186/11689/8598 6350/11687/10206
+f 6350/11687/10206 10186/11689/8598 13324/11647/6544 12195/11646/10183
+f 6343/11677/10200 6346/11688/10207 6351/11690/10208 6347/11678/10201
+f 6347/11678/10201 6351/11690/10208 12199/11691/10180 12200/11681/10180
+f 6346/11688/10207 12194/11639/10178 12193/11638/10177 6351/11690/10208
+f 6351/11690/10208 12193/11638/10177 13477/11641/10180 12199/11691/10180
+f 6352/11692/10209 6356/11693/10210 6357/11694/10211 6353/11695/10212
+f 6353/11695/10212 6357/11694/10211 12688/11696/10213 12689/11697/10214
+f 6356/11693/10210 7838/11698/1457 7837/11699/1456 6357/11694/10211
+f 6357/11694/10211 7837/11699/1456 12755/11700/1459 12688/11696/10213
+f 6352/11692/10209 6353/11695/10212 6358/11701/10215 6354/11702/10216
+f 6354/11702/10216 6358/11701/10215 12187/11703/10217 12188/11704/10218
+f 6353/11695/10212 12689/11697/10214 12690/11705/10219 6358/11701/10215
+f 6358/11701/10215 12690/11705/10219 13476/11706/10180 12187/11703/10217
+f 6352/11692/10209 6354/11702/10216 6359/11707/10220 6355/11708/10221
+f 6355/11708/10221 6359/11707/10220 9072/1511/1435 9071/1510/1434
+f 6354/11702/10216 12188/11704/10218 12189/11709/10222 6359/11707/10220
+f 6359/11707/10220 12189/11709/10222 12971/1512/1436 9072/1511/1435
+f 6352/11692/10209 6355/11708/10221 6360/11710/10223 6356/11693/10210
+f 6356/11693/10210 6360/11710/10223 7839/11711/1462 7838/11698/1457
+f 6355/11708/10221 9071/1510/1434 9070/1521/1445 6360/11710/10223
+f 6360/11710/10223 9070/1521/1445 12725/1523/1447 7839/11711/1462
+f 6361/11712/10224 6365/11713/10225 6366/11714/10226 6362/11715/10227
+f 6362/11715/10227 6366/11714/10226 12211/11716/10180 12212/11717/10180
+f 6365/11713/10225 12203/11657/10190 12202/11656/10189 6366/11714/10226
+f 6366/11714/10226 12202/11656/10189 13479/11660/10180 12211/11716/10180
+f 6361/11712/10224 6362/11715/10227 6367/11718/10228 6363/11719/10229
+f 6363/11719/10229 6367/11718/10228 12208/11720/10230 12209/11721/10231
+f 6362/11715/10227 12212/11717/10180 12213/11722/10180 6367/11718/10228
+f 6367/11718/10228 12213/11722/10180 13480/11723/10180 12208/11720/10230
+f 6361/11712/10224 6363/11719/10229 6368/11724/10232 6364/11725/10233
+f 6364/11725/10233 6368/11724/10232 10179/11726/6574 10178/11727/6571
+f 6363/11719/10229 12209/11721/10231 12210/11728/10234 6368/11724/10232
+f 6368/11724/10232 12210/11728/10234 13163/11729/6575 10179/11726/6574
+f 6361/11712/10224 6364/11725/10233 6369/11730/10235 6365/11713/10225
+f 6365/11713/10225 6369/11730/10235 12204/11665/10193 12203/11657/10190
+f 6364/11725/10233 10178/11727/6571 10177/11731/6570 6369/11730/10235
+f 6369/11730/10235 10177/11731/6570 13164/11666/6563 12204/11665/10193
+f 6370/11732/10236 6374/11733/10237 6375/11734/10238 6371/11735/10239
+f 6371/11735/10239 6375/11734/10238 12217/11736/10180 12218/11737/10180
+f 6374/11733/10237 12209/11721/10231 12208/11720/10230 6375/11734/10238
+f 6375/11734/10238 12208/11720/10230 13480/11723/10180 12217/11736/10180
+f 6370/11732/10236 6371/11735/10239 6376/11738/10240 6372/11739/10241
+f 6372/11739/10241 6376/11738/10240 12214/11740/10242 12215/11741/10243
+f 6371/11735/10239 12218/11737/10180 12219/11742/10180 6376/11738/10240
+f 6376/11738/10240 12219/11742/10180 13481/11743/10180 12214/11740/10242
+f 6370/11732/10236 6372/11739/10241 6377/11744/10244 6373/11745/10245
+f 6373/11745/10245 6377/11744/10244 10173/11746/6586 10172/11747/6583
+f 6372/11739/10241 12215/11741/10243 12216/11748/10246 6377/11744/10244
+f 6377/11744/10244 12216/11748/10246 13162/11749/6587 10173/11746/6586
+f 6370/11732/10236 6373/11745/10245 6378/11750/10247 6374/11733/10237
+f 6374/11733/10237 6378/11750/10247 12210/11728/10234 12209/11721/10231
+f 6373/11745/10245 10172/11747/6583 10171/11751/6582 6378/11750/10247
+f 6378/11750/10247 10171/11751/6582 13163/11729/6575 12210/11728/10234
+f 6379/11752/10248 6383/11753/10249 6384/11754/10250 6380/11755/10251
+f 6380/11755/10251 6384/11754/10250 12223/11756/10180 12224/11757/10180
+f 6383/11753/10249 12215/11741/10243 12214/11740/10242 6384/11754/10250
+f 6384/11754/10250 12214/11740/10242 13481/11743/10180 12223/11756/10180
+f 6379/11752/10248 6380/11755/10251 6385/11758/10252 6381/11759/10253
+f 6381/11759/10253 6385/11758/10252 12220/11760/10254 12221/11761/10255
+f 6380/11755/10251 12224/11757/10180 12225/11762/10180 6385/11758/10252
+f 6385/11758/10252 12225/11762/10180 13482/11763/10180 12220/11760/10254
+f 6379/11752/10248 6381/11759/10253 6386/11764/10256 6382/11765/10257
+f 6382/11765/10257 6386/11764/10256 10167/11766/6598 10166/11767/6595
+f 6381/11759/10253 12221/11761/10255 12222/11768/10258 6386/11764/10256
+f 6386/11764/10256 12222/11768/10258 13161/11769/6599 10167/11766/6598
+f 6379/11752/10248 6382/11765/10257 6387/11770/10259 6383/11753/10249
+f 6383/11753/10249 6387/11770/10259 12216/11748/10246 12215/11741/10243
+f 6382/11765/10257 10166/11767/6595 10165/11771/6594 6387/11770/10259
+f 6387/11770/10259 10165/11771/6594 13162/11749/6587 12216/11748/10246
+f 6388/11772/10260 6392/11773/10261 6393/11774/10262 6389/11775/10263
+f 6389/11775/10263 6393/11774/10262 12229/11776/10180 12230/11777/10180
+f 6392/11773/10261 12221/11761/10255 12220/11760/10254 6393/11774/10262
+f 6393/11774/10262 12220/11760/10254 13482/11763/10180 12229/11776/10180
+f 6388/11772/10260 6389/11775/10263 6394/11778/10264 6390/11779/10265
+f 6390/11779/10265 6394/11778/10264 12226/11780/10266 12227/11781/10267
+f 6389/11775/10263 12230/11777/10180 12231/11782/10180 6394/11778/10264
+f 6394/11778/10264 12231/11782/10180 13483/11783/10180 12226/11780/10266
+f 6388/11772/10260 6390/11779/10265 6395/11784/10268 6391/11785/10269
+f 6391/11785/10269 6395/11784/10268 10161/11786/6610 10160/11787/6607
+f 6390/11779/10265 12227/11781/10267 12228/11788/10270 6395/11784/10268
+f 6395/11784/10268 12228/11788/10270 13160/11789/6611 10161/11786/6610
+f 6388/11772/10260 6391/11785/10269 6396/11790/10271 6392/11773/10261
+f 6392/11773/10261 6396/11790/10271 12222/11768/10258 12221/11761/10255
+f 6391/11785/10269 10160/11787/6607 10159/11791/6606 6396/11790/10271
+f 6396/11790/10271 10159/11791/6606 13161/11769/6599 12222/11768/10258
+f 6397/11792/10272 6401/11793/10273 6402/11794/10274 6398/11795/10275
+f 6398/11795/10275 6402/11794/10274 12235/11796/10180 12236/11797/10180
+f 6401/11793/10273 12227/11781/10267 12226/11780/10266 6402/11794/10274
+f 6402/11794/10274 12226/11780/10266 13483/11783/10180 12235/11796/10180
+f 6397/11792/10272 6398/11795/10275 6403/11798/10276 6399/11799/10277
+f 6399/11799/10277 6403/11798/10276 12232/11800/10278 12233/11801/10279
+f 6398/11795/10275 12236/11797/10180 12237/11802/10180 6403/11798/10276
+f 6403/11798/10276 12237/11802/10180 13484/11803/10180 12232/11800/10278
+f 6397/11792/10272 6399/11799/10277 6404/11804/10280 6400/11805/10281
+f 6400/11805/10281 6404/11804/10280 10155/11806/6622 10154/11807/6619
+f 6399/11799/10277 12233/11801/10279 12234/11808/10282 6404/11804/10280
+f 6404/11804/10280 12234/11808/10282 13159/11809/6623 10155/11806/6622
+f 6397/11792/10272 6400/11805/10281 6405/11810/10283 6401/11793/10273
+f 6401/11793/10273 6405/11810/10283 12228/11788/10270 12227/11781/10267
+f 6400/11805/10281 10154/11807/6619 10153/11811/6618 6405/11810/10283
+f 6405/11810/10283 10153/11811/6618 13160/11789/6611 12228/11788/10270
+f 6406/11812/10284 6410/11813/10285 6411/11814/10286 6407/11815/10287
+f 6407/11815/10287 6411/11814/10286 12241/11816/10180 12242/11817/10180
+f 6410/11813/10285 12233/11801/10279 12232/11800/10278 6411/11814/10286
+f 6411/11814/10286 12232/11800/10278 13484/11803/10180 12241/11816/10180
+f 6406/11812/10284 6407/11815/10287 6412/11818/10288 6408/11819/10289
+f 6408/11819/10289 6412/11818/10288 12238/11820/10290 12239/11821/10291
+f 6407/11815/10287 12242/11817/10180 12243/11822/10180 6412/11818/10288
+f 6412/11818/10288 12243/11822/10180 13485/11823/10180 12238/11820/10290
+f 6406/11812/10284 6408/11819/10289 6413/11824/10292 6409/11825/10293
+f 6409/11825/10293 6413/11824/10292 10149/11826/6638 10148/11827/6635
+f 6408/11819/10289 12239/11821/10291 12240/11828/10294 6413/11824/10292
+f 6413/11824/10292 12240/11828/10294 13158/11829/6639 10149/11826/6638
+f 6406/11812/10284 6409/11825/10293 6414/11830/10295 6410/11813/10285
+f 6410/11813/10285 6414/11830/10295 12234/11808/10282 12233/11801/10279
+f 6409/11825/10293 10148/11827/6635 10147/11831/6634 6414/11830/10295
+f 6414/11830/10295 10147/11831/6634 13159/11809/6623 12234/11808/10282
+f 6415/11832/10296 6419/11833/10297 6420/11834/10298 6416/11835/10299
+f 6416/11835/10299 6420/11834/10298 12247/11836/10180 12248/11837/10180
+f 6419/11833/10297 12239/11821/10291 12238/11820/10290 6420/11834/10298
+f 6420/11834/10298 12238/11820/10290 13485/11823/10180 12247/11836/10180
+f 6415/11832/10296 6416/11835/10299 6421/11838/10300 6417/11839/10301
+f 6417/11839/10301 6421/11838/10300 12244/11840/10302 12245/11841/10303
+f 6416/11835/10299 12248/11837/10180 12249/11842/10180 6421/11838/10300
+f 6421/11838/10300 12249/11842/10180 13486/11843/10180 12244/11840/10302
+f 6415/11832/10296 6417/11839/10301 6422/11844/10304 6418/11845/10305
+f 6418/11845/10305 6422/11844/10304 10143/11846/6654 10142/11847/6651
+f 6417/11839/10301 12245/11841/10303 12246/11848/10306 6422/11844/10304
+f 6422/11844/10304 12246/11848/10306 13157/11849/6655 10143/11846/6654
+f 6415/11832/10296 6418/11845/10305 6423/11850/10307 6419/11833/10297
+f 6419/11833/10297 6423/11850/10307 12240/11828/10294 12239/11821/10291
+f 6418/11845/10305 10142/11847/6651 10141/11851/6650 6423/11850/10307
+f 6423/11850/10307 10141/11851/6650 13158/11829/6639 12240/11828/10294
+f 6424/11852/10308 6428/11853/10309 6429/11854/10310 6425/11855/10311
+f 6425/11855/10311 6429/11854/10310 12253/11856/10180 12254/11857/10180
+f 6428/11853/10309 12245/11841/10303 12244/11840/10302 6429/11854/10310
+f 6429/11854/10310 12244/11840/10302 13486/11843/10180 12253/11856/10180
+f 6424/11852/10308 6425/11855/10311 6430/11858/10312 6426/11859/10313
+f 6426/11859/10313 6430/11858/10312 12250/11860/10314 12251/11861/10315
+f 6425/11855/10311 12254/11857/10180 12255/11862/10180 6430/11858/10312
+f 6430/11858/10312 12255/11862/10180 13487/11863/10180 12250/11860/10314
+f 6424/11852/10308 6426/11859/10313 6431/11864/10316 6427/11865/10317
+f 6427/11865/10317 6431/11864/10316 10137/11866/6670 10136/11867/6667
+f 6426/11859/10313 12251/11861/10315 12252/11868/10318 6431/11864/10316
+f 6431/11864/10316 12252/11868/10318 13156/11869/6671 10137/11866/6670
+f 6424/11852/10308 6427/11865/10317 6432/11870/10319 6428/11853/10309
+f 6428/11853/10309 6432/11870/10319 12246/11848/10306 12245/11841/10303
+f 6427/11865/10317 10136/11867/6667 10135/11871/6666 6432/11870/10319
+f 6432/11870/10319 10135/11871/6666 13157/11849/6655 12246/11848/10306
+f 6433/11872/10320 6437/11873/10321 6438/11874/10322 6434/11875/10323
+f 6434/11875/10323 6438/11874/10322 12259/11876/10180 12260/11877/10180
+f 6437/11873/10321 12251/11861/10315 12250/11860/10314 6438/11874/10322
+f 6438/11874/10322 12250/11860/10314 13487/11863/10180 12259/11876/10180
+f 6433/11872/10320 6434/11875/10323 6439/11878/10324 6435/11879/10325
+f 6435/11879/10325 6439/11878/10324 12256/11880/10326 12257/11881/10327
+f 6434/11875/10323 12260/11877/10180 12261/11882/10180 6439/11878/10324
+f 6439/11878/10324 12261/11882/10180 13488/11883/10180 12256/11880/10326
+f 6433/11872/10320 6435/11879/10325 6440/11884/10328 6436/11885/10329
+f 6436/11885/10329 6440/11884/10328 10131/11886/6686 10130/11887/6683
+f 6435/11879/10325 12257/11881/10327 12258/11888/10330 6440/11884/10328
+f 6440/11884/10328 12258/11888/10330 13155/11889/6687 10131/11886/6686
+f 6433/11872/10320 6436/11885/10329 6441/11890/10331 6437/11873/10321
+f 6437/11873/10321 6441/11890/10331 12252/11868/10318 12251/11861/10315
+f 6436/11885/10329 10130/11887/6683 10129/11891/6682 6441/11890/10331
+f 6441/11890/10331 10129/11891/6682 13156/11869/6671 12252/11868/10318
+f 6442/11892/10332 6446/11893/10333 6447/11894/10334 6443/11895/10335
+f 6443/11895/10335 6447/11894/10334 12265/11896/10180 12266/11897/10180
+f 6446/11893/10333 12257/11881/10327 12256/11880/10326 6447/11894/10334
+f 6447/11894/10334 12256/11880/10326 13488/11883/10180 12265/11896/10180
+f 6442/11892/10332 6443/11895/10335 6448/11898/10336 6444/11899/10337
+f 6444/11899/10337 6448/11898/10336 12262/11900/10338 12263/11901/10339
+f 6443/11895/10335 12266/11897/10180 12267/11902/10180 6448/11898/10336
+f 6448/11898/10336 12267/11902/10180 13489/11903/10180 12262/11900/10338
+f 6442/11892/10332 6444/11899/10337 6449/11904/10340 6445/11905/10341
+f 6445/11905/10341 6449/11904/10340 10125/11906/6702 10124/11907/6699
+f 6444/11899/10337 12263/11901/10339 12264/11908/10342 6449/11904/10340
+f 6449/11904/10340 12264/11908/10342 13154/11909/6703 10125/11906/6702
+f 6442/11892/10332 6445/11905/10341 6450/11910/10343 6446/11893/10333
+f 6446/11893/10333 6450/11910/10343 12258/11888/10330 12257/11881/10327
+f 6445/11905/10341 10124/11907/6699 10123/11911/6698 6450/11910/10343
+f 6450/11910/10343 10123/11911/6698 13155/11889/6687 12258/11888/10330
+f 6451/11912/10344 6455/11913/10345 6456/11914/10346 6452/11915/10347
+f 6452/11915/10347 6456/11914/10346 12271/11916/10180 12272/11917/10180
+f 6455/11913/10345 12263/11901/10339 12262/11900/10338 6456/11914/10346
+f 6456/11914/10346 12262/11900/10338 13489/11903/10180 12271/11916/10180
+f 6451/11912/10344 6452/11915/10347 6457/11918/10348 6453/11919/10349
+f 6453/11919/10349 6457/11918/10348 12268/11920/10350 12269/11921/10351
+f 6452/11915/10347 12272/11917/10180 12273/11922/10180 6457/11918/10348
+f 6457/11918/10348 12273/11922/10180 13490/11923/10180 12268/11920/10350
+f 6451/11912/10344 6453/11919/10349 6458/11924/10352 6454/11925/10353
+f 6454/11925/10353 6458/11924/10352 10119/11926/6718 10118/11927/6715
+f 6453/11919/10349 12269/11921/10351 12270/11928/10354 6458/11924/10352
+f 6458/11924/10352 12270/11928/10354 13153/11929/6719 10119/11926/6718
+f 6451/11912/10344 6454/11925/10353 6459/11930/10355 6455/11913/10345
+f 6455/11913/10345 6459/11930/10355 12264/11908/10342 12263/11901/10339
+f 6454/11925/10353 10118/11927/6715 10117/11931/6714 6459/11930/10355
+f 6459/11930/10355 10117/11931/6714 13154/11909/6703 12264/11908/10342
+f 6460/11932/10356 6464/11933/10357 6465/11934/10358 6461/11935/10359
+f 6461/11935/10359 6465/11934/10358 12277/11936/10180 12278/11937/10180
+f 6464/11933/10357 12269/11921/10351 12268/11920/10350 6465/11934/10358
+f 6465/11934/10358 12268/11920/10350 13490/11923/10180 12277/11936/10180
+f 6460/11932/10356 6461/11935/10359 6466/11938/10360 6462/11939/10361
+f 6462/11939/10361 6466/11938/10360 12274/11940/10362 12275/11941/10363
+f 6461/11935/10359 12278/11937/10180 12279/11942/10180 6466/11938/10360
+f 6466/11938/10360 12279/11942/10180 13491/11943/10180 12274/11940/10362
+f 6460/11932/10356 6462/11939/10361 6467/11944/10364 6463/11945/10365
+f 6463/11945/10365 6467/11944/10364 10113/11946/6731 10112/11947/6729
+f 6462/11939/10361 12275/11941/10363 12276/11948/10366 6467/11944/10364
+f 6467/11944/10364 12276/11948/10366 12785/11949/1703 10113/11946/6731
+f 6460/11932/10356 6463/11945/10365 6468/11950/10367 6464/11933/10357
+f 6464/11933/10357 6468/11950/10367 12270/11928/10354 12269/11921/10351
+f 6463/11945/10365 10112/11947/6729 10111/11951/6728 6468/11950/10367
+f 6468/11950/10367 10111/11951/6728 13153/11929/6719 12270/11928/10354
+f 6469/11952/10368 6473/11953/10369 6474/11954/10370 6470/11955/10371
+f 6470/11955/10371 6474/11954/10370 12283/11956/10180 12284/11957/10180
+f 6473/11953/10369 12275/11941/10363 12274/11940/10362 6474/11954/10370
+f 6474/11954/10370 12274/11940/10362 13491/11943/10180 12283/11956/10180
+f 6469/11952/10368 6470/11955/10371 6475/11958/10372 6471/11959/10373
+f 6471/11959/10373 6475/11958/10372 12280/11960/10374 12281/11961/10375
+f 6470/11955/10371 12284/11957/10180 12285/11962/10180 6475/11958/10372
+f 6475/11958/10372 12285/11962/10180 13492/11963/10180 12280/11960/10374
+f 6469/11952/10368 6471/11959/10373 6476/11964/10376 6472/11965/10377
+f 6472/11965/10377 6476/11964/10376 7980/11966/1706 7979/11967/1701
+f 6471/11959/10373 12281/11961/10375 12282/11968/10378 6476/11964/10376
+f 6476/11964/10376 12282/11968/10378 12786/11969/1687 7980/11966/1706
+f 6469/11952/10368 6472/11965/10377 6477/11970/10379 6473/11953/10369
+f 6473/11953/10369 6477/11970/10379 12276/11948/10366 12275/11941/10363
+f 6472/11965/10377 7979/11967/1701 7978/11971/1700 6477/11970/10379
+f 6477/11970/10379 7978/11971/1700 12785/11949/1703 12276/11948/10366
+f 6478/11972/10380 6482/11973/10381 6483/11974/10382 6479/11975/10383
+f 6479/11975/10383 6483/11974/10382 12289/11976/10180 12290/11977/10180
+f 6482/11973/10381 12281/11961/10375 12280/11960/10374 6483/11974/10382
+f 6483/11974/10382 12280/11960/10374 13492/11963/10180 12289/11976/10180
+f 6478/11972/10380 6479/11975/10383 6484/11978/10384 6480/11979/10385
+f 6480/11979/10385 6484/11978/10384 12286/11980/10386 12287/11981/10387
+f 6479/11975/10383 12290/11977/10180 12291/11982/10180 6484/11978/10384
+f 6484/11978/10384 12291/11982/10180 13493/11983/10180 12286/11980/10386
+f 6478/11972/10380 6480/11979/10385 6485/11984/10388 6481/11985/10389
+f 6481/11985/10389 6485/11984/10388 7986/11986/1690 7985/11987/1685
+f 6480/11979/10385 12287/11981/10387 12288/11988/10390 6485/11984/10388
+f 6485/11984/10388 12288/11988/10390 12787/11989/1671 7986/11986/1690
+f 6478/11972/10380 6481/11985/10389 6486/11990/10391 6482/11973/10381
+f 6482/11973/10381 6486/11990/10391 12282/11968/10378 12281/11961/10375
+f 6481/11985/10389 7985/11987/1685 7984/11991/1684 6486/11990/10391
+f 6486/11990/10391 7984/11991/1684 12786/11969/1687 12282/11968/10378
+f 6487/11992/10392 6491/11993/10393 6492/11994/10394 6488/11995/10395
+f 6488/11995/10395 6492/11994/10394 12295/11996/10180 12296/11997/10180
+f 6491/11993/10393 12287/11981/10387 12286/11980/10386 6492/11994/10394
+f 6492/11994/10394 12286/11980/10386 13493/11983/10180 12295/11996/10180
+f 6487/11992/10392 6488/11995/10395 6493/11998/10396 6489/11999/10397
+f 6489/11999/10397 6493/11998/10396 12292/12000/10398 12293/12001/10399
+f 6488/11995/10395 12296/11997/10180 12297/12002/10180 6493/11998/10396
+f 6493/11998/10396 12297/12002/10180 13494/12003/10180 12292/12000/10398
+f 6487/11992/10392 6489/11999/10397 6494/12004/10400 6490/12005/10401
+f 6490/12005/10401 6494/12004/10400 7992/12006/1674 7991/12007/1669
+f 6489/11999/10397 12293/12001/10399 12294/12008/10402 6494/12004/10400
+f 6494/12004/10400 12294/12008/10402 12788/12009/1655 7992/12006/1674
+f 6487/11992/10392 6490/12005/10401 6495/12010/10403 6491/11993/10393
+f 6491/11993/10393 6495/12010/10403 12288/11988/10390 12287/11981/10387
+f 6490/12005/10401 7991/12007/1669 7990/12011/1668 6495/12010/10403
+f 6495/12010/10403 7990/12011/1668 12787/11989/1671 12288/11988/10390
+f 6496/12012/10404 6500/12013/10405 6501/12014/10406 6497/12015/10407
+f 6497/12015/10407 6501/12014/10406 12301/12016/10180 12302/12017/10180
+f 6500/12013/10405 12293/12001/10399 12292/12000/10398 6501/12014/10406
+f 6501/12014/10406 12292/12000/10398 13494/12003/10180 12301/12016/10180
+f 6496/12012/10404 6497/12015/10407 6502/12018/10408 6498/12019/10409
+f 6498/12019/10409 6502/12018/10408 12298/12020/10410 12299/12021/10411
+f 6497/12015/10407 12302/12017/10180 12303/12022/10180 6502/12018/10408
+f 6502/12018/10408 12303/12022/10180 13495/12023/10180 12298/12020/10410
+f 6496/12012/10404 6498/12019/10409 6503/12024/10412 6499/12025/10413
+f 6499/12025/10413 6503/12024/10412 7998/12026/1658 7997/12027/1653
+f 6498/12019/10409 12299/12021/10411 12300/12028/10414 6503/12024/10412
+f 6503/12024/10412 12300/12028/10414 12789/12029/1639 7998/12026/1658
+f 6496/12012/10404 6499/12025/10413 6504/12030/10415 6500/12013/10405
+f 6500/12013/10405 6504/12030/10415 12294/12008/10402 12293/12001/10399
+f 6499/12025/10413 7997/12027/1653 7996/12031/1652 6504/12030/10415
+f 6504/12030/10415 7996/12031/1652 12788/12009/1655 12294/12008/10402
+f 6505/12032/10416 6509/12033/10417 6510/12034/10418 6506/12035/10419
+f 6506/12035/10419 6510/12034/10418 12307/12036/10180 12308/12037/10180
+f 6509/12033/10417 12299/12021/10411 12298/12020/10410 6510/12034/10418
+f 6510/12034/10418 12298/12020/10410 13495/12023/10180 12307/12036/10180
+f 6505/12032/10416 6506/12035/10419 6511/12038/10420 6507/12039/10421
+f 6507/12039/10421 6511/12038/10420 12304/12040/10422 12305/12041/10423
+f 6506/12035/10419 12308/12037/10180 12309/12042/10180 6511/12038/10420
+f 6511/12038/10420 12309/12042/10180 13496/12043/10180 12304/12040/10422
+f 6505/12032/10416 6507/12039/10421 6512/12044/10424 6508/12045/10425
+f 6508/12045/10425 6512/12044/10424 8004/12046/1642 8003/12047/1637
+f 6507/12039/10421 12305/12041/10423 12306/12048/10426 6512/12044/10424
+f 6512/12044/10424 12306/12048/10426 12790/12049/1623 8004/12046/1642
+f 6505/12032/10416 6508/12045/10425 6513/12050/10427 6509/12033/10417
+f 6509/12033/10417 6513/12050/10427 12300/12028/10414 12299/12021/10411
+f 6508/12045/10425 8003/12047/1637 8002/12051/1636 6513/12050/10427
+f 6513/12050/10427 8002/12051/1636 12789/12029/1639 12300/12028/10414
+f 6514/12052/10428 6518/12053/10429 6519/12054/10430 6515/12055/10431
+f 6515/12055/10431 6519/12054/10430 12313/12056/10180 12314/12057/10180
+f 6518/12053/10429 12305/12041/10423 12304/12040/10422 6519/12054/10430
+f 6519/12054/10430 12304/12040/10422 13496/12043/10180 12313/12056/10180
+f 6514/12052/10428 6515/12055/10431 6520/12058/10432 6516/12059/10433
+f 6516/12059/10433 6520/12058/10432 12310/12060/10434 12311/12061/10435
+f 6515/12055/10431 12314/12057/10180 12315/12062/10180 6520/12058/10432
+f 6520/12058/10432 12315/12062/10180 13497/12063/10180 12310/12060/10434
+f 6514/12052/10428 6516/12059/10433 6521/12064/10436 6517/12065/10437
+f 6517/12065/10437 6521/12064/10436 8010/12066/1626 8009/12067/1621
+f 6516/12059/10433 12311/12061/10435 12312/12068/10438 6521/12064/10436
+f 6521/12064/10436 12312/12068/10438 12791/12069/1607 8010/12066/1626
+f 6514/12052/10428 6517/12065/10437 6522/12070/10439 6518/12053/10429
+f 6518/12053/10429 6522/12070/10439 12306/12048/10426 12305/12041/10423
+f 6517/12065/10437 8009/12067/1621 8008/12071/1620 6522/12070/10439
+f 6522/12070/10439 8008/12071/1620 12790/12049/1623 12306/12048/10426
+f 6523/12072/10440 6527/12073/10441 6528/12074/10442 6524/12075/10443
+f 6524/12075/10443 6528/12074/10442 12319/12076/10180 12320/12077/10180
+f 6527/12073/10441 12311/12061/10435 12310/12060/10434 6528/12074/10442
+f 6528/12074/10442 12310/12060/10434 13497/12063/10180 12319/12076/10180
+f 6523/12072/10440 6524/12075/10443 6529/12078/10444 6525/12079/10445
+f 6525/12079/10445 6529/12078/10444 12316/12080/10446 12317/12081/10447
+f 6524/12075/10443 12320/12077/10180 12321/12082/10180 6529/12078/10444
+f 6529/12078/10444 12321/12082/10180 13498/12083/10180 12316/12080/10446
+f 6523/12072/10440 6525/12079/10445 6530/12084/10448 6526/12085/10449
+f 6526/12085/10449 6530/12084/10448 8016/12086/1610 8015/12087/1605
+f 6525/12079/10445 12317/12081/10447 12318/12088/10450 6530/12084/10448
+f 6530/12084/10448 12318/12088/10450 12792/12089/1591 8016/12086/1610
+f 6523/12072/10440 6526/12085/10449 6531/12090/10451 6527/12073/10441
+f 6527/12073/10441 6531/12090/10451 12312/12068/10438 12311/12061/10435
+f 6526/12085/10449 8015/12087/1605 8014/12091/1604 6531/12090/10451
+f 6531/12090/10451 8014/12091/1604 12791/12069/1607 12312/12068/10438
+f 6532/12092/10452 6536/12093/10453 6537/12094/10454 6533/12095/10455
+f 6533/12095/10455 6537/12094/10454 12325/12096/10180 12326/12097/10180
+f 6536/12093/10453 12317/12081/10447 12316/12080/10446 6537/12094/10454
+f 6537/12094/10454 12316/12080/10446 13498/12083/10180 12325/12096/10180
+f 6532/12092/10452 6533/12095/10455 6538/12098/10456 6534/12099/10457
+f 6534/12099/10457 6538/12098/10456 12322/12100/10458 12323/12101/10459
+f 6533/12095/10455 12326/12097/10180 12327/12102/10180 6538/12098/10456
+f 6538/12098/10456 12327/12102/10180 13499/12103/10180 12322/12100/10458
+f 6532/12092/10452 6534/12099/10457 6539/12104/10460 6535/12105/10461
+f 6535/12105/10461 6539/12104/10460 8022/12106/1594 8021/12107/1589
+f 6534/12099/10457 12323/12101/10459 12324/12108/10462 6539/12104/10460
+f 6539/12104/10460 12324/12108/10462 12793/12109/1575 8022/12106/1594
+f 6532/12092/10452 6535/12105/10461 6540/12110/10463 6536/12093/10453
+f 6536/12093/10453 6540/12110/10463 12318/12088/10450 12317/12081/10447
+f 6535/12105/10461 8021/12107/1589 8020/12111/1588 6540/12110/10463
+f 6540/12110/10463 8020/12111/1588 12792/12089/1591 12318/12088/10450
+f 6541/12112/10464 6545/12113/10465 6546/12114/10466 6542/12115/10467
+f 6542/12115/10467 6546/12114/10466 12331/12116/10180 12332/12117/10180
+f 6545/12113/10465 12323/12101/10459 12322/12100/10458 6546/12114/10466
+f 6546/12114/10466 12322/12100/10458 13499/12103/10180 12331/12116/10180
+f 6541/12112/10464 6542/12115/10467 6547/12118/10468 6543/12119/10469
+f 6543/12119/10469 6547/12118/10468 12328/12120/10470 12329/12121/10471
+f 6542/12115/10467 12332/12117/10180 12333/12122/10180 6547/12118/10468
+f 6547/12118/10468 12333/12122/10180 13500/12123/10180 12328/12120/10470
+f 6541/12112/10464 6543/12119/10469 6548/12124/10472 6544/12125/10473
+f 6544/12125/10473 6548/12124/10472 8028/12126/1578 8027/12127/1573
+f 6543/12119/10469 12329/12121/10471 12330/12128/10474 6548/12124/10472
+f 6548/12124/10472 12330/12128/10474 12794/12129/1559 8028/12126/1578
+f 6541/12112/10464 6544/12125/10473 6549/12130/10475 6545/12113/10465
+f 6545/12113/10465 6549/12130/10475 12324/12108/10462 12323/12101/10459
+f 6544/12125/10473 8027/12127/1573 8026/12131/1572 6549/12130/10475
+f 6549/12130/10475 8026/12131/1572 12793/12109/1575 12324/12108/10462
+f 6550/12132/10476 6554/12133/10477 6555/12134/10478 6551/12135/10479
+f 6551/12135/10479 6555/12134/10478 12337/12136/10180 12338/12137/10180
+f 6554/12133/10477 12329/12121/10471 12328/12120/10470 6555/12134/10478
+f 6555/12134/10478 12328/12120/10470 13500/12123/10180 12337/12136/10180
+f 6550/12132/10476 6551/12135/10479 6556/12138/10480 6552/12139/10481
+f 6552/12139/10481 6556/12138/10480 12334/12140/10482 12335/12141/10483
+f 6551/12135/10479 12338/12137/10180 12339/12142/10180 6556/12138/10480
+f 6556/12138/10480 12339/12142/10180 13501/12143/10180 12334/12140/10482
+f 6550/12132/10476 6552/12139/10481 6557/12144/10484 6553/12145/10485
+f 6553/12145/10485 6557/12144/10484 8034/12146/1562 8033/12147/1557
+f 6552/12139/10481 12335/12141/10483 12336/12148/10486 6557/12144/10484
+f 6557/12144/10484 12336/12148/10486 12795/12149/1543 8034/12146/1562
+f 6550/12132/10476 6553/12145/10485 6558/12150/10487 6554/12133/10477
+f 6554/12133/10477 6558/12150/10487 12330/12128/10474 12329/12121/10471
+f 6553/12145/10485 8033/12147/1557 8032/12151/1556 6558/12150/10487
+f 6558/12150/10487 8032/12151/1556 12794/12129/1559 12330/12128/10474
+f 6559/12152/10488 6563/12153/10489 6564/12154/10490 6560/12155/10491
+f 6560/12155/10491 6564/12154/10490 12343/12156/10180 12344/12157/10180
+f 6563/12153/10489 12335/12141/10483 12334/12140/10482 6564/12154/10490
+f 6564/12154/10490 12334/12140/10482 13501/12143/10180 12343/12156/10180
+f 6559/12152/10488 6560/12155/10491 6565/12158/10492 6561/12159/10493
+f 6561/12159/10493 6565/12158/10492 12340/12160/10494 12341/12161/10495
+f 6560/12155/10491 12344/12157/10180 12345/12162/10180 6565/12158/10492
+f 6565/12158/10492 12345/12162/10180 13502/12163/10180 12340/12160/10494
+f 6559/12152/10488 6561/12159/10493 6566/12164/10496 6562/12165/10497
+f 6562/12165/10497 6566/12164/10496 8040/12166/1546 8039/12167/1541
+f 6561/12159/10493 12341/12161/10495 12342/12168/10498 6566/12164/10496
+f 6566/12164/10496 12342/12168/10498 12796/12169/1523 8040/12166/1546
+f 6559/12152/10488 6562/12165/10497 6567/12170/10499 6563/12153/10489
+f 6563/12153/10489 6567/12170/10499 12336/12148/10486 12335/12141/10483
+f 6562/12165/10497 8039/12167/1541 8038/12171/1540 6567/12170/10499
+f 6567/12170/10499 8038/12171/1540 12795/12149/1543 12336/12148/10486
+f 6568/12172/10500 6572/12173/10501 6573/12174/10502 6569/12175/10503
+f 6569/12175/10503 6573/12174/10502 12349/12176/10180 12350/12177/10180
+f 6572/12173/10501 12341/12161/10495 12340/12160/10494 6573/12174/10502
+f 6573/12174/10502 12340/12160/10494 13502/12163/10180 12349/12176/10180
+f 6568/12172/10500 6569/12175/10503 6574/12178/10504 6570/12179/10505
+f 6570/12179/10505 6574/12178/10504 11953/12180/10506 11954/12181/10507
+f 6569/12175/10503 12350/12177/10180 12351/12182/10180 6574/12178/10504
+f 6574/12178/10504 12351/12182/10180 13503/12183/10180 11953/12180/10506
+f 6568/12172/10500 6570/12179/10505 6575/12184/10508 6571/12185/10509
+f 6571/12185/10509 6575/12184/10508 8046/12186/1528 8045/12187/1521
+f 6570/12179/10505 11954/12181/10507 11955/12188/10510 6575/12184/10508
+f 6575/12184/10508 11955/12188/10510 12797/12189/1529 8046/12186/1528
+f 6568/12172/10500 6571/12185/10509 6576/12190/10511 6572/12173/10501
+f 6572/12173/10501 6576/12190/10511 12342/12168/10498 12341/12161/10495
+f 6571/12185/10509 8045/12187/1521 8044/12191/1520 6576/12190/10511
+f 6576/12190/10511 8044/12191/1520 12796/12169/1523 12342/12168/10498
+f 6577/12192/10512 6581/12193/10513 6582/12194/10514 6578/12195/10515
+f 6578/12195/10515 6582/12194/10514 11955/12188/10510 11954/12181/10507
+f 6581/12193/10513 8048/12196/3480 8047/12197/3479 6582/12194/10514
+f 6582/12194/10514 8047/12197/3479 12797/12189/1529 11955/12188/10510
+f 6577/12192/10512 6578/12195/10515 6583/12198/10516 6579/12199/10517
+f 6579/12199/10517 6583/12198/10516 12355/12200/10180 12356/12201/10180
+f 6578/12195/10515 11954/12181/10507 11953/12180/10506 6583/12198/10516
+f 6583/12198/10516 11953/12180/10506 13503/12183/10180 12355/12200/10180
+f 6577/12192/10512 6579/12199/10517 6584/12202/10518 6580/12203/10519
+f 6580/12203/10519 6584/12202/10518 12025/12204/10520 12026/12205/10521
+f 6579/12199/10517 12356/12201/10180 12357/12206/10180 6584/12202/10518
+f 6584/12202/10518 12357/12206/10180 13504/12207/10180 12025/12204/10520
+f 6577/12192/10512 6580/12203/10519 6585/12208/10522 6581/12193/10513
+f 6581/12193/10513 6585/12208/10522 8049/12209/3483 8048/12196/3480
+f 6580/12203/10519 12026/12205/10521 12027/12210/10523 6585/12208/10522
+f 6585/12208/10522 12027/12210/10523 12955/12211/1503 8049/12209/3483
+f 6586/12212/10524 6590/12213/10525 6591/12214/10526 6587/12215/10527
+f 6587/12215/10527 6591/12214/10526 11944/12216/10528 11945/12217/10529
+f 6590/12213/10525 9791/9969/8771 9790/9968/8770 6591/12214/10526
+f 6591/12214/10526 9790/9968/8770 13092/7252/6456 11944/12216/10528
+f 6586/12212/10524 6587/12215/10527 6592/12218/10530 6588/12219/10531
+f 6588/12219/10531 6592/12218/10530 12034/12220/10180 12035/12221/10180
+f 6587/12215/10527 11945/12217/10529 11946/12222/10532 6592/12218/10530
+f 6592/12218/10530 11946/12222/10532 13450/12223/10180 12034/12220/10180
+f 6586/12212/10524 6588/12219/10531 6593/12224/10533 6589/12225/10534
+f 6589/12225/10534 6593/12224/10533 11947/12226/10535 11948/12227/10536
+f 6588/12219/10531 12035/12221/10180 12036/12228/10180 6593/12224/10533
+f 6593/12224/10533 12036/12228/10180 13449/12229/10180 11947/12226/10535
+f 6586/12212/10524 6589/12225/10534 6594/12230/10537 6590/12213/10525
+f 6590/12213/10525 6594/12230/10537 9792/9972/8774 9791/9969/8771
+f 6589/12225/10534 11948/12227/10536 11949/12231/10538 6594/12230/10537
+f 6594/12230/10537 11949/12231/10538 13340/7265/6469 9792/9972/8774
+f 6595/12232/10539 6599/12233/10540 6600/12234/10541 6596/12235/10542
+f 6596/12235/10542 6600/12234/10541 11950/12236/10543 11951/12237/10544
+f 6599/12233/10540 9788/7246/6450 9787/7245/6449 6600/12234/10541
+f 6600/12234/10541 9787/7245/6449 13091/7236/6444 11950/12236/10543
+f 6595/12232/10539 6596/12235/10542 6601/12238/10545 6597/12239/10546
+f 6597/12239/10546 6601/12238/10545 12040/12240/10180 12041/12241/10180
+f 6596/12235/10542 11951/12237/10544 11952/12242/10547 6601/12238/10545
+f 6601/12238/10545 11952/12242/10547 13451/12243/10180 12040/12240/10180
+f 6595/12232/10539 6597/12239/10546 6602/12244/10548 6598/12245/10549
+f 6598/12245/10549 6602/12244/10548 11946/12222/10532 11945/12217/10529
+f 6597/12239/10546 12041/12241/10180 12042/12246/10180 6602/12244/10548
+f 6602/12244/10548 12042/12246/10180 13450/12223/10180 11946/12222/10532
+f 6595/12232/10539 6598/12245/10549 6603/12247/10550 6599/12233/10540
+f 6599/12233/10540 6603/12247/10550 9789/7251/6455 9788/7246/6450
+f 6598/12245/10549 11945/12217/10529 11944/12216/10528 6603/12247/10550
+f 6603/12247/10550 11944/12216/10528 13092/7252/6456 9789/7251/6455
+f 6604/12248/10551 6608/12249/10552 6609/12250/10553 6605/12251/10554
+f 6605/12251/10554 6609/12250/10553 9786/7235/6443 9785/7230/6438
+f 6608/12249/10552 11951/12237/10544 11950/12236/10543 6609/12250/10553
+f 6609/12250/10553 11950/12236/10543 13091/7236/6444 9786/7235/6443
+f 6604/12248/10551 6605/12251/10554 6610/12252/10555 6606/12253/10556
+f 6606/12253/10556 6610/12252/10555 11956/12254/10557 11957/12255/10558
+f 6605/12251/10554 9785/7230/6438 9784/7229/6437 6610/12252/10555
+f 6610/12252/10555 9784/7229/6437 13090/7220/6432 11956/12254/10557
+f 6604/12248/10551 6606/12253/10556 6611/12256/10559 6607/12257/10560
+f 6607/12257/10560 6611/12256/10559 12046/12258/10180 12047/12259/10180
+f 6606/12253/10556 11957/12255/10558 11958/12260/10561 6611/12256/10559
+f 6611/12256/10559 11958/12260/10561 13452/12261/10180 12046/12258/10180
+f 6604/12248/10551 6607/12257/10560 6612/12262/10562 6608/12249/10552
+f 6608/12249/10552 6612/12262/10562 11952/12242/10547 11951/12237/10544
+f 6607/12257/10560 12047/12259/10180 12048/12263/10180 6612/12262/10562
+f 6612/12262/10562 12048/12263/10180 13451/12243/10180 11952/12242/10547
+f 6613/12264/10563 6617/12265/10564 6618/12266/10565 6614/12267/10566
+f 6614/12267/10566 6618/12266/10565 9783/7219/6431 9782/7214/6426
+f 6617/12265/10564 11957/12255/10558 11956/12254/10557 6618/12266/10565
+f 6618/12266/10565 11956/12254/10557 13090/7220/6432 9783/7219/6431
+f 6613/12264/10563 6614/12267/10566 6619/12268/10567 6615/12269/10568
+f 6615/12269/10568 6619/12268/10567 11959/12270/10569 11960/12271/10570
+f 6614/12267/10566 9782/7214/6426 9781/7213/6425 6619/12268/10567
+f 6619/12268/10567 9781/7213/6425 13089/7204/6420 11959/12270/10569
+f 6613/12264/10563 6615/12269/10568 6620/12272/10571 6616/12273/10572
+f 6616/12273/10572 6620/12272/10571 12052/12274/10180 12053/12275/10180
+f 6615/12269/10568 11960/12271/10570 11961/12276/10573 6620/12272/10571
+f 6620/12272/10571 11961/12276/10573 13453/12277/10180 12052/12274/10180
+f 6613/12264/10563 6616/12273/10572 6621/12278/10574 6617/12265/10564
+f 6617/12265/10564 6621/12278/10574 11958/12260/10561 11957/12255/10558
+f 6616/12273/10572 12053/12275/10180 12054/12279/10180 6621/12278/10574
+f 6621/12278/10574 12054/12279/10180 13452/12261/10180 11958/12260/10561
+f 6622/12280/10575 6626/12281/10576 6627/12282/10577 6623/12283/10578
+f 6623/12283/10578 6627/12282/10577 9780/7203/6419 9779/7198/6414
+f 6626/12281/10576 11960/12271/10570 11959/12270/10569 6627/12282/10577
+f 6627/12282/10577 11959/12270/10569 13089/7204/6420 9780/7203/6419
+f 6622/12280/10575 6623/12283/10578 6628/12284/10579 6624/12285/10580
+f 6624/12285/10580 6628/12284/10579 11962/12286/10581 11963/12287/10582
+f 6623/12283/10578 9779/7198/6414 9778/7197/6413 6628/12284/10579
+f 6628/12284/10579 9778/7197/6413 13088/7188/6408 11962/12286/10581
+f 6622/12280/10575 6624/12285/10580 6629/12288/10583 6625/12289/10584
+f 6625/12289/10584 6629/12288/10583 12058/12290/10180 12059/12291/10180
+f 6624/12285/10580 11963/12287/10582 11964/12292/10585 6629/12288/10583
+f 6629/12288/10583 11964/12292/10585 13454/12293/10180 12058/12290/10180
+f 6622/12280/10575 6625/12289/10584 6630/12294/10586 6626/12281/10576
+f 6626/12281/10576 6630/12294/10586 11961/12276/10573 11960/12271/10570
+f 6625/12289/10584 12059/12291/10180 12060/12295/10180 6630/12294/10586
+f 6630/12294/10586 12060/12295/10180 13453/12277/10180 11961/12276/10573
+f 6631/12296/10587 6635/12297/10588 6636/12298/10589 6632/12299/10590
+f 6632/12299/10590 6636/12298/10589 9777/7187/6407 9776/7182/6402
+f 6635/12297/10588 11963/12287/10582 11962/12286/10581 6636/12298/10589
+f 6636/12298/10589 11962/12286/10581 13088/7188/6408 9777/7187/6407
+f 6631/12296/10587 6632/12299/10590 6637/12300/10591 6633/12301/10592
+f 6633/12301/10592 6637/12300/10591 11965/12302/10593 11966/12303/10594
+f 6632/12299/10590 9776/7182/6402 9775/7181/6401 6637/12300/10591
+f 6637/12300/10591 9775/7181/6401 13087/7172/6396 11965/12302/10593
+f 6631/12296/10587 6633/12301/10592 6638/12304/10595 6634/12305/10596
+f 6634/12305/10596 6638/12304/10595 12064/12306/10180 12065/12307/10180
+f 6633/12301/10592 11966/12303/10594 11967/12308/10597 6638/12304/10595
+f 6638/12304/10595 11967/12308/10597 13455/12309/10180 12064/12306/10180
+f 6631/12296/10587 6634/12305/10596 6639/12310/10598 6635/12297/10588
+f 6635/12297/10588 6639/12310/10598 11964/12292/10585 11963/12287/10582
+f 6634/12305/10596 12065/12307/10180 12066/12311/10180 6639/12310/10598
+f 6639/12310/10598 12066/12311/10180 13454/12293/10180 11964/12292/10585
+f 6640/12312/10599 6644/12313/10600 6645/12314/10601 6641/12315/10602
+f 6641/12315/10602 6645/12314/10601 9774/7171/6395 9773/7166/6390
+f 6644/12313/10600 11966/12303/10594 11965/12302/10593 6645/12314/10601
+f 6645/12314/10601 11965/12302/10593 13087/7172/6396 9774/7171/6395
+f 6640/12312/10599 6641/12315/10602 6646/12316/10603 6642/12317/10604
+f 6642/12317/10604 6646/12316/10603 11968/12318/10605 11969/12319/10606
+f 6641/12315/10602 9773/7166/6390 9772/7165/6389 6646/12316/10603
+f 6646/12316/10603 9772/7165/6389 13086/7156/6381 11968/12318/10605
+f 6640/12312/10599 6642/12317/10604 6647/12320/10607 6643/12321/10608
+f 6643/12321/10608 6647/12320/10607 12070/12322/10180 12071/12323/10180
+f 6642/12317/10604 11969/12319/10606 11970/12324/10609 6647/12320/10607
+f 6647/12320/10607 11970/12324/10609 13456/12325/10180 12070/12322/10180
+f 6640/12312/10599 6643/12321/10608 6648/12326/10610 6644/12313/10600
+f 6644/12313/10600 6648/12326/10610 11967/12308/10597 11966/12303/10594
+f 6643/12321/10608 12071/12323/10180 12072/12327/10180 6648/12326/10610
+f 6648/12326/10610 12072/12327/10180 13455/12309/10180 11967/12308/10597
+f 6649/12328/10611 6653/12329/10612 6654/12330/10613 6650/12331/10614
+f 6650/12331/10614 6654/12330/10613 9771/7155/6380 9770/7150/6375
+f 6653/12329/10612 11969/12319/10606 11968/12318/10605 6654/12330/10613
+f 6654/12330/10613 11968/12318/10605 13086/7156/6381 9771/7155/6380
+f 6649/12328/10611 6650/12331/10614 6655/12332/10615 6651/12333/10616
+f 6651/12333/10616 6655/12332/10615 11971/12334/10617 11972/12335/10618
+f 6650/12331/10614 9770/7150/6375 9769/7149/6374 6655/12332/10615
+f 6655/12332/10615 9769/7149/6374 13085/7140/6365 11971/12334/10617
+f 6649/12328/10611 6651/12333/10616 6656/12336/10619 6652/12337/10620
+f 6652/12337/10620 6656/12336/10619 12076/12338/10180 12077/12339/10180
+f 6651/12333/10616 11972/12335/10618 11973/12340/10621 6656/12336/10619
+f 6656/12336/10619 11973/12340/10621 13457/12341/10180 12076/12338/10180
+f 6649/12328/10611 6652/12337/10620 6657/12342/10622 6653/12329/10612
+f 6653/12329/10612 6657/12342/10622 11970/12324/10609 11969/12319/10606
+f 6652/12337/10620 12077/12339/10180 12078/12343/10180 6657/12342/10622
+f 6657/12342/10622 12078/12343/10180 13456/12325/10180 11970/12324/10609
+f 6658/12344/10623 6662/12345/10624 6663/12346/10625 6659/12347/10626
+f 6659/12347/10626 6663/12346/10625 9768/7139/6364 9767/7134/6359
+f 6662/12345/10624 11972/12335/10618 11971/12334/10617 6663/12346/10625
+f 6663/12346/10625 11971/12334/10617 13085/7140/6365 9768/7139/6364
+f 6658/12344/10623 6659/12347/10626 6664/12348/10627 6660/12349/10628
+f 6660/12349/10628 6664/12348/10627 11974/12350/10629 11975/12351/10630
+f 6659/12347/10626 9767/7134/6359 9766/7133/6358 6664/12348/10627
+f 6664/12348/10627 9766/7133/6358 13084/7124/6349 11974/12350/10629
+f 6658/12344/10623 6660/12349/10628 6665/12352/10631 6661/12353/10632
+f 6661/12353/10632 6665/12352/10631 12082/12354/10180 12083/12355/10180
+f 6660/12349/10628 11975/12351/10630 11976/12356/10633 6665/12352/10631
+f 6665/12352/10631 11976/12356/10633 13458/12357/10180 12082/12354/10180
+f 6658/12344/10623 6661/12353/10632 6666/12358/10634 6662/12345/10624
+f 6662/12345/10624 6666/12358/10634 11973/12340/10621 11972/12335/10618
+f 6661/12353/10632 12083/12355/10180 12084/12359/10180 6666/12358/10634
+f 6666/12358/10634 12084/12359/10180 13457/12341/10180 11973/12340/10621
+f 6667/12360/10635 6671/12361/10636 6672/12362/10637 6668/12363/10638
+f 6668/12363/10638 6672/12362/10637 9765/7123/6348 9764/7118/6343
+f 6671/12361/10636 11975/12351/10630 11974/12350/10629 6672/12362/10637
+f 6672/12362/10637 11974/12350/10629 13084/7124/6349 9765/7123/6348
+f 6667/12360/10635 6668/12363/10638 6673/12364/10639 6669/12365/10640
+f 6669/12365/10640 6673/12364/10639 11977/12366/10641 11978/12367/10642
+f 6668/12363/10638 9764/7118/6343 9763/7117/6342 6673/12364/10639
+f 6673/12364/10639 9763/7117/6342 13083/7108/6333 11977/12366/10641
+f 6667/12360/10635 6669/12365/10640 6674/12368/10643 6670/12369/10644
+f 6670/12369/10644 6674/12368/10643 12088/12370/10180 12089/12371/10180
+f 6669/12365/10640 11978/12367/10642 11979/12372/10645 6674/12368/10643
+f 6674/12368/10643 11979/12372/10645 13459/12373/10180 12088/12370/10180
+f 6667/12360/10635 6670/12369/10644 6675/12374/10646 6671/12361/10636
+f 6671/12361/10636 6675/12374/10646 11976/12356/10633 11975/12351/10630
+f 6670/12369/10644 12089/12371/10180 12090/12375/10180 6675/12374/10646
+f 6675/12374/10646 12090/12375/10180 13458/12357/10180 11976/12356/10633
+f 6676/12376/10647 6680/12377/10648 6681/12378/10649 6677/12379/10650
+f 6677/12379/10650 6681/12378/10649 9762/7107/6332 9761/7102/6327
+f 6680/12377/10648 11978/12367/10642 11977/12366/10641 6681/12378/10649
+f 6681/12378/10649 11977/12366/10641 13083/7108/6333 9762/7107/6332
+f 6676/12376/10647 6677/12379/10650 6682/12380/10651 6678/12381/10652
+f 6678/12381/10652 6682/12380/10651 11980/12382/10653 11981/12383/10654
+f 6677/12379/10650 9761/7102/6327 9760/7101/6326 6682/12380/10651
+f 6682/12380/10651 9760/7101/6326 13082/7092/6317 11980/12382/10653
+f 6676/12376/10647 6678/12381/10652 6683/12384/10655 6679/12385/10656
+f 6679/12385/10656 6683/12384/10655 12094/12386/10180 12095/12387/10180
+f 6678/12381/10652 11981/12383/10654 11982/12388/10657 6683/12384/10655
+f 6683/12384/10655 11982/12388/10657 13460/12389/10180 12094/12386/10180
+f 6676/12376/10647 6679/12385/10656 6684/12390/10658 6680/12377/10648
+f 6680/12377/10648 6684/12390/10658 11979/12372/10645 11978/12367/10642
+f 6679/12385/10656 12095/12387/10180 12096/12391/10180 6684/12390/10658
+f 6684/12390/10658 12096/12391/10180 13459/12373/10180 11979/12372/10645
+f 6685/12392/10659 6689/12393/10660 6690/12394/10661 6686/12395/10662
+f 6686/12395/10662 6690/12394/10661 9759/7091/6316 9758/7086/6311
+f 6689/12393/10660 11981/12383/10654 11980/12382/10653 6690/12394/10661
+f 6690/12394/10661 11980/12382/10653 13082/7092/6317 9759/7091/6316
+f 6685/12392/10659 6686/12395/10662 6691/12396/10663 6687/12397/10664
+f 6687/12397/10664 6691/12396/10663 11983/12398/10665 11984/12399/10666
+f 6686/12395/10662 9758/7086/6311 9757/7085/6310 6691/12396/10663
+f 6691/12396/10663 9757/7085/6310 13081/7076/6301 11983/12398/10665
+f 6685/12392/10659 6687/12397/10664 6692/12400/10667 6688/12401/10668
+f 6688/12401/10668 6692/12400/10667 12100/12402/10180 12101/12403/10180
+f 6687/12397/10664 11984/12399/10666 11985/12404/10669 6692/12400/10667
+f 6692/12400/10667 11985/12404/10669 13461/12405/10180 12100/12402/10180
+f 6685/12392/10659 6688/12401/10668 6693/12406/10670 6689/12393/10660
+f 6689/12393/10660 6693/12406/10670 11982/12388/10657 11981/12383/10654
+f 6688/12401/10668 12101/12403/10180 12102/12407/10180 6693/12406/10670
+f 6693/12406/10670 12102/12407/10180 13460/12389/10180 11982/12388/10657
+f 6694/12408/10671 6698/12409/10672 6699/12410/10673 6695/12411/10674
+f 6695/12411/10674 6699/12410/10673 9756/7075/6300 9755/7070/6295
+f 6698/12409/10672 11984/12399/10666 11983/12398/10665 6699/12410/10673
+f 6699/12410/10673 11983/12398/10665 13081/7076/6301 9756/7075/6300
+f 6694/12408/10671 6695/12411/10674 6700/12412/10675 6696/12413/10676
+f 6696/12413/10676 6700/12412/10675 11986/12414/10677 11987/12415/10678
+f 6695/12411/10674 9755/7070/6295 9754/7069/6294 6700/12412/10675
+f 6700/12412/10675 9754/7069/6294 13080/7060/6285 11986/12414/10677
+f 6694/12408/10671 6696/12413/10676 6701/12416/10679 6697/12417/10680
+f 6697/12417/10680 6701/12416/10679 12106/12418/10180 12107/12419/10180
+f 6696/12413/10676 11987/12415/10678 11988/12420/10681 6701/12416/10679
+f 6701/12416/10679 11988/12420/10681 13462/12421/10180 12106/12418/10180
+f 6694/12408/10671 6697/12417/10680 6702/12422/10682 6698/12409/10672
+f 6698/12409/10672 6702/12422/10682 11985/12404/10669 11984/12399/10666
+f 6697/12417/10680 12107/12419/10180 12108/12423/10180 6702/12422/10682
+f 6702/12422/10682 12108/12423/10180 13461/12405/10180 11985/12404/10669
+f 6703/12424/10683 6707/12425/10684 6708/12426/10685 6704/12427/10686
+f 6704/12427/10686 6708/12426/10685 9753/7059/6284 9752/7054/6279
+f 6707/12425/10684 11987/12415/10678 11986/12414/10677 6708/12426/10685
+f 6708/12426/10685 11986/12414/10677 13080/7060/6285 9753/7059/6284
+f 6703/12424/10683 6704/12427/10686 6709/12428/10687 6705/12429/10688
+f 6705/12429/10688 6709/12428/10687 11989/12430/10689 11990/12431/10690
+f 6704/12427/10686 9752/7054/6279 9751/7053/6278 6709/12428/10687
+f 6709/12428/10687 9751/7053/6278 12712/1316/1240 11989/12430/10689
+f 6703/12424/10683 6705/12429/10688 6710/12432/10691 6706/12433/10692
+f 6706/12433/10692 6710/12432/10691 12112/12434/10180 12113/12435/10180
+f 6705/12429/10688 11990/12431/10690 11991/12436/10693 6710/12432/10691
+f 6710/12432/10691 11991/12436/10693 13463/12437/10180 12112/12434/10180
+f 6703/12424/10683 6706/12433/10692 6711/12438/10694 6707/12425/10684
+f 6707/12425/10684 6711/12438/10694 11988/12420/10681 11987/12415/10678
+f 6706/12433/10692 12113/12435/10180 12114/12439/10180 6711/12438/10694
+f 6711/12438/10694 12114/12439/10180 13462/12421/10180 11988/12420/10681
+f 6712/12440/10695 6716/12441/10696 6717/12442/10697 6713/12443/10698
+f 6713/12443/10698 6717/12442/10697 7632/1315/1239 7631/1314/1238
+f 6716/12441/10696 11990/12431/10690 11989/12430/10689 6717/12442/10697
+f 6717/12442/10697 11989/12430/10689 12712/1316/1240 7632/1315/1239
+f 6712/12440/10695 6713/12443/10698 6718/12444/10699 6714/12445/10700
+f 6714/12445/10700 6718/12444/10699 11992/12446/10701 11993/12447/10702
+f 6713/12443/10698 7631/1314/1238 7630/1325/1249 6718/12444/10699
+f 6718/12444/10699 7630/1325/1249 12713/1327/1251 11992/12446/10701
+f 6712/12440/10695 6714/12445/10700 6719/12448/10703 6715/12449/10704
+f 6715/12449/10704 6719/12448/10703 12118/12450/10180 12119/12451/10180
+f 6714/12445/10700 11993/12447/10702 11994/12452/10705 6719/12448/10703
+f 6719/12448/10703 11994/12452/10705 13464/12453/10180 12118/12450/10180
+f 6712/12440/10695 6715/12449/10704 6720/12454/10706 6716/12441/10696
+f 6716/12441/10696 6720/12454/10706 11991/12436/10693 11990/12431/10690
+f 6715/12449/10704 12119/12451/10180 12120/12455/10180 6720/12454/10706
+f 6720/12454/10706 12120/12455/10180 13463/12437/10180 11991/12436/10693
+f 6721/12456/10707 6725/12457/10708 6726/12458/10709 6722/12459/10710
+f 6722/12459/10710 6726/12458/10709 7635/1333/1257 7634/1332/1256
+f 6725/12457/10708 11993/12447/10702 11992/12446/10701 6726/12458/10709
+f 6726/12458/10709 11992/12446/10701 12713/1327/1251 7635/1333/1257
+f 6721/12456/10707 6722/12459/10710 6727/12460/10711 6723/12461/10712
+f 6723/12461/10712 6727/12460/10711 11995/12462/10713 11996/12463/10714
+f 6722/12459/10710 7634/1332/1256 7633/1341/1265 6727/12460/10711
+f 6727/12460/10711 7633/1341/1265 12714/1343/1267 11995/12462/10713
+f 6721/12456/10707 6723/12461/10712 6728/12464/10715 6724/12465/10716
+f 6724/12465/10716 6728/12464/10715 12124/12466/10180 12125/12467/10180
+f 6723/12461/10712 11996/12463/10714 11997/12468/10717 6728/12464/10715
+f 6728/12464/10715 11997/12468/10717 13465/12469/10180 12124/12466/10180
+f 6721/12456/10707 6724/12465/10716 6729/12470/10718 6725/12457/10708
+f 6725/12457/10708 6729/12470/10718 11994/12452/10705 11993/12447/10702
+f 6724/12465/10716 12125/12467/10180 12126/12471/10180 6729/12470/10718
+f 6729/12470/10718 12126/12471/10180 13464/12453/10180 11994/12452/10705
+f 6730/12472/10719 6734/12473/10720 6735/12474/10721 6731/12475/10722
+f 6731/12475/10722 6735/12474/10721 7638/1349/1273 7637/1348/1272
+f 6734/12473/10720 11996/12463/10714 11995/12462/10713 6735/12474/10721
+f 6735/12474/10721 11995/12462/10713 12714/1343/1267 7638/1349/1273
+f 6730/12472/10719 6731/12475/10722 6736/12476/10723 6732/12477/10724
+f 6732/12477/10724 6736/12476/10723 11998/12478/10725 11999/12479/10726
+f 6731/12475/10722 7637/1348/1272 7636/1357/1281 6736/12476/10723
+f 6736/12476/10723 7636/1357/1281 12715/1359/1283 11998/12478/10725
+f 6730/12472/10719 6732/12477/10724 6737/12480/10727 6733/12481/10728
+f 6733/12481/10728 6737/12480/10727 12130/12482/10180 12131/12483/10180
+f 6732/12477/10724 11999/12479/10726 12000/12484/10729 6737/12480/10727
+f 6737/12480/10727 12000/12484/10729 13466/12485/10180 12130/12482/10180
+f 6730/12472/10719 6733/12481/10728 6738/12486/10730 6734/12473/10720
+f 6734/12473/10720 6738/12486/10730 11997/12468/10717 11996/12463/10714
+f 6733/12481/10728 12131/12483/10180 12132/12487/10180 6738/12486/10730
+f 6738/12486/10730 12132/12487/10180 13465/12469/10180 11997/12468/10717
+f 6739/12488/10731 6743/12489/10732 6744/12490/10733 6740/12491/10734
+f 6740/12491/10734 6744/12490/10733 7641/1365/1289 7640/1364/1288
+f 6743/12489/10732 11999/12479/10726 11998/12478/10725 6744/12490/10733
+f 6744/12490/10733 11998/12478/10725 12715/1359/1283 7641/1365/1289
+f 6739/12488/10731 6740/12491/10734 6745/12492/10735 6741/12493/10736
+f 6741/12493/10736 6745/12492/10735 12001/12494/10737 12002/12495/10738
+f 6740/12491/10734 7640/1364/1288 7639/1373/1297 6745/12492/10735
+f 6745/12492/10735 7639/1373/1297 12716/1375/1299 12001/12494/10737
+f 6739/12488/10731 6741/12493/10736 6746/12496/10739 6742/12497/10740
+f 6742/12497/10740 6746/12496/10739 12136/12498/10180 12137/12499/10180
+f 6741/12493/10736 12002/12495/10738 12003/12500/10741 6746/12496/10739
+f 6746/12496/10739 12003/12500/10741 13467/12501/10180 12136/12498/10180
+f 6739/12488/10731 6742/12497/10740 6747/12502/10742 6743/12489/10732
+f 6743/12489/10732 6747/12502/10742 12000/12484/10729 11999/12479/10726
+f 6742/12497/10740 12137/12499/10180 12138/12503/10180 6747/12502/10742
+f 6747/12502/10742 12138/12503/10180 13466/12485/10180 12000/12484/10729
+f 6748/12504/10743 6752/12505/10744 6753/12506/10745 6749/12507/10746
+f 6749/12507/10746 6753/12506/10745 7644/1381/1305 7643/1380/1304
+f 6752/12505/10744 12002/12495/10738 12001/12494/10737 6753/12506/10745
+f 6753/12506/10745 12001/12494/10737 12716/1375/1299 7644/1381/1305
+f 6748/12504/10743 6749/12507/10746 6754/12508/10747 6750/12509/10748
+f 6750/12509/10748 6754/12508/10747 12004/12510/10749 12005/12511/10750
+f 6749/12507/10746 7643/1380/1304 7642/1389/1313 6754/12508/10747
+f 6754/12508/10747 7642/1389/1313 12717/1391/1315 12004/12510/10749
+f 6748/12504/10743 6750/12509/10748 6755/12512/10751 6751/12513/10752
+f 6751/12513/10752 6755/12512/10751 12142/12514/10180 12143/12515/10180
+f 6750/12509/10748 12005/12511/10750 12006/12516/10753 6755/12512/10751
+f 6755/12512/10751 12006/12516/10753 13468/12517/10180 12142/12514/10180
+f 6748/12504/10743 6751/12513/10752 6756/12518/10754 6752/12505/10744
+f 6752/12505/10744 6756/12518/10754 12003/12500/10741 12002/12495/10738
+f 6751/12513/10752 12143/12515/10180 12144/12519/10180 6756/12518/10754
+f 6756/12518/10754 12144/12519/10180 13467/12501/10180 12003/12500/10741
+f 6757/12520/10755 6761/12521/10756 6762/12522/10757 6758/12523/10758
+f 6758/12523/10758 6762/12522/10757 7647/1397/1321 7646/1396/1320
+f 6761/12521/10756 12005/12511/10750 12004/12510/10749 6762/12522/10757
+f 6762/12522/10757 12004/12510/10749 12717/1391/1315 7647/1397/1321
+f 6757/12520/10755 6758/12523/10758 6763/12524/10759 6759/12525/10760
+f 6759/12525/10760 6763/12524/10759 12007/12526/10761 12008/12527/10762
+f 6758/12523/10758 7646/1396/1320 7645/1405/1329 6763/12524/10759
+f 6763/12524/10759 7645/1405/1329 12718/1407/1331 12007/12526/10761
+f 6757/12520/10755 6759/12525/10760 6764/12528/10763 6760/12529/10764
+f 6760/12529/10764 6764/12528/10763 12148/12530/10180 12149/12531/10180
+f 6759/12525/10760 12008/12527/10762 12009/12532/10765 6764/12528/10763
+f 6764/12528/10763 12009/12532/10765 13469/12533/10180 12148/12530/10180
+f 6757/12520/10755 6760/12529/10764 6765/12534/10766 6761/12521/10756
+f 6761/12521/10756 6765/12534/10766 12006/12516/10753 12005/12511/10750
+f 6760/12529/10764 12149/12531/10180 12150/12535/10180 6765/12534/10766
+f 6765/12534/10766 12150/12535/10180 13468/12517/10180 12006/12516/10753
+f 6766/12536/10767 6770/12537/10768 6771/12538/10769 6767/12539/10770
+f 6767/12539/10770 6771/12538/10769 7650/1413/1337 7649/1412/1336
+f 6770/12537/10768 12008/12527/10762 12007/12526/10761 6771/12538/10769
+f 6771/12538/10769 12007/12526/10761 12718/1407/1331 7650/1413/1337
+f 6766/12536/10767 6767/12539/10770 6772/12540/10771 6768/12541/10772
+f 6768/12541/10772 6772/12540/10771 12010/12542/10773 12011/12543/10774
+f 6767/12539/10770 7649/1412/1336 7648/1421/1345 6772/12540/10771
+f 6772/12540/10771 7648/1421/1345 12719/1423/1347 12010/12542/10773
+f 6766/12536/10767 6768/12541/10772 6773/12544/10775 6769/12545/10776
+f 6769/12545/10776 6773/12544/10775 12154/12546/10180 12155/12547/10180
+f 6768/12541/10772 12011/12543/10774 12012/12548/10777 6773/12544/10775
+f 6773/12544/10775 12012/12548/10777 13470/12549/10180 12154/12546/10180
+f 6766/12536/10767 6769/12545/10776 6774/12550/10778 6770/12537/10768
+f 6770/12537/10768 6774/12550/10778 12009/12532/10765 12008/12527/10762
+f 6769/12545/10776 12155/12547/10180 12156/12551/10180 6774/12550/10778
+f 6774/12550/10778 12156/12551/10180 13469/12533/10180 12009/12532/10765
+f 6775/12552/10779 6779/12553/10780 6780/12554/10781 6776/12555/10782
+f 6776/12555/10782 6780/12554/10781 7653/1429/1353 7652/1428/1352
+f 6779/12553/10780 12011/12543/10774 12010/12542/10773 6780/12554/10781
+f 6780/12554/10781 12010/12542/10773 12719/1423/1347 7653/1429/1353
+f 6775/12552/10779 6776/12555/10782 6781/12556/10783 6777/12557/10784
+f 6777/12557/10784 6781/12556/10783 12013/12558/10785 12014/12559/10786
+f 6776/12555/10782 7652/1428/1352 7651/1437/1361 6781/12556/10783
+f 6781/12556/10783 7651/1437/1361 12720/1439/1363 12013/12558/10785
+f 6775/12552/10779 6777/12557/10784 6782/12560/10787 6778/12561/10788
+f 6778/12561/10788 6782/12560/10787 12160/12562/10180 12161/12563/10180
+f 6777/12557/10784 12014/12559/10786 12015/12564/10789 6782/12560/10787
+f 6782/12560/10787 12015/12564/10789 13471/12565/10180 12160/12562/10180
+f 6775/12552/10779 6778/12561/10788 6783/12566/10790 6779/12553/10780
+f 6779/12553/10780 6783/12566/10790 12012/12548/10777 12011/12543/10774
+f 6778/12561/10788 12161/12563/10180 12162/12567/10180 6783/12566/10790
+f 6783/12566/10790 12162/12567/10180 13470/12549/10180 12012/12548/10777
+f 6784/12568/10791 6788/12569/10792 6789/12570/10793 6785/12571/10794
+f 6785/12571/10794 6789/12570/10793 7656/1445/1369 7655/1444/1368
+f 6788/12569/10792 12014/12559/10786 12013/12558/10785 6789/12570/10793
+f 6789/12570/10793 12013/12558/10785 12720/1439/1363 7656/1445/1369
+f 6784/12568/10791 6785/12571/10794 6790/12572/10795 6786/12573/10796
+f 6786/12573/10796 6790/12572/10795 12016/12574/10797 12017/12575/10798
+f 6785/12571/10794 7655/1444/1368 7654/1453/1377 6790/12572/10795
+f 6790/12572/10795 7654/1453/1377 12721/1455/1379 12016/12574/10797
+f 6784/12568/10791 6786/12573/10796 6791/12576/10799 6787/12577/10800
+f 6787/12577/10800 6791/12576/10799 12166/12578/10180 12167/12579/10180
+f 6786/12573/10796 12017/12575/10798 12018/12580/10801 6791/12576/10799
+f 6791/12576/10799 12018/12580/10801 13472/12581/10180 12166/12578/10180
+f 6784/12568/10791 6787/12577/10800 6792/12582/10802 6788/12569/10792
+f 6788/12569/10792 6792/12582/10802 12015/12564/10789 12014/12559/10786
+f 6787/12577/10800 12167/12579/10180 12168/12583/10180 6792/12582/10802
+f 6792/12582/10802 12168/12583/10180 13471/12565/10180 12015/12564/10789
+f 6793/12584/10803 6797/12585/10804 6798/12586/10805 6794/12587/10806
+f 6794/12587/10806 6798/12586/10805 7659/1461/1385 7658/1460/1384
+f 6797/12585/10804 12017/12575/10798 12016/12574/10797 6798/12586/10805
+f 6798/12586/10805 12016/12574/10797 12721/1455/1379 7659/1461/1385
+f 6793/12584/10803 6794/12587/10806 6799/12588/10807 6795/12589/10808
+f 6795/12589/10808 6799/12588/10807 12019/12590/10809 12020/12591/10810
+f 6794/12587/10806 7658/1460/1384 7657/1469/1393 6799/12588/10807
+f 6799/12588/10807 7657/1469/1393 12722/1471/1395 12019/12590/10809
+f 6793/12584/10803 6795/12589/10808 6800/12592/10811 6796/12593/10812
+f 6796/12593/10812 6800/12592/10811 12172/12594/10180 12173/12595/10180
+f 6795/12589/10808 12020/12591/10810 12021/12596/10813 6800/12592/10811
+f 6800/12592/10811 12021/12596/10813 13473/12597/10180 12172/12594/10180
+f 6793/12584/10803 6796/12593/10812 6801/12598/10814 6797/12585/10804
+f 6797/12585/10804 6801/12598/10814 12018/12580/10801 12017/12575/10798
+f 6796/12593/10812 12173/12595/10180 12174/12599/10180 6801/12598/10814
+f 6801/12598/10814 12174/12599/10180 13472/12581/10180 12018/12580/10801
+f 6802/12600/10815 6806/12601/10816 6807/12602/10817 6803/12603/10818
+f 6803/12603/10818 6807/12602/10817 7662/1477/1401 7661/1476/1400
+f 6806/12601/10816 12020/12591/10810 12019/12590/10809 6807/12602/10817
+f 6807/12602/10817 12019/12590/10809 12722/1471/1395 7662/1477/1401
+f 6802/12600/10815 6803/12603/10818 6808/12604/10819 6804/12605/10820
+f 6804/12605/10820 6808/12604/10819 12022/12606/10821 12023/12607/10822
+f 6803/12603/10818 7661/1476/1400 7660/1485/1409 6808/12604/10819
+f 6808/12604/10819 7660/1485/1409 12723/1487/1411 12022/12606/10821
+f 6802/12600/10815 6804/12605/10820 6809/12608/10823 6805/12609/10824
+f 6805/12609/10824 6809/12608/10823 12178/12610/10180 12179/12611/10180
+f 6804/12605/10820 12023/12607/10822 12024/12612/10825 6809/12608/10823
+f 6809/12608/10823 12024/12612/10825 13474/12613/10180 12178/12610/10180
+f 6802/12600/10815 6805/12609/10824 6810/12614/10826 6806/12601/10816
+f 6806/12601/10816 6810/12614/10826 12021/12596/10813 12020/12591/10810
+f 6805/12609/10824 12179/12611/10180 12180/12615/10180 6810/12614/10826
+f 6810/12614/10826 12180/12615/10180 13473/12597/10180 12021/12596/10813
+f 6811/12616/10827 6815/12617/10828 6816/12618/10829 6812/12619/10830
+f 6812/12619/10830 6816/12618/10829 7665/1493/1417 7664/1492/1416
+f 6815/12617/10828 12023/12607/10822 12022/12606/10821 6816/12618/10829
+f 6816/12618/10829 12022/12606/10821 12723/1487/1411 7665/1493/1417
+f 6811/12616/10827 6812/12619/10830 6817/12620/10831 6813/12621/10832
+f 6813/12621/10832 6817/12620/10831 12181/12622/10833 12182/12623/10834
+f 6812/12619/10830 7664/1492/1416 7663/1501/1425 6817/12620/10831
+f 6817/12620/10831 7663/1501/1425 12724/1503/1427 12181/12622/10833
+f 6811/12616/10827 6813/12621/10832 6818/12624/10835 6814/12625/10836
+f 6814/12625/10836 6818/12624/10835 12184/12626/10180 12185/12627/10180
+f 6813/12621/10832 12182/12623/10834 12183/12628/10837 6818/12624/10835
+f 6818/12624/10835 12183/12628/10837 13475/12629/10180 12184/12626/10180
+f 6811/12616/10827 6814/12625/10836 6819/12630/10838 6815/12617/10828
+f 6815/12617/10828 6819/12630/10838 12024/12612/10825 12023/12607/10822
+f 6814/12625/10836 12185/12627/10180 12186/12631/10180 6819/12630/10838
+f 6819/12630/10838 12186/12631/10180 13474/12613/10180 12024/12612/10825
+f 6820/12632/10839 6824/12633/10840 6825/12634/10841 6821/12635/10842
+f 6821/12635/10842 6825/12634/10841 12190/12636/10180 12191/12637/10180
+f 6824/12633/10840 12188/11704/10218 12187/11703/10217 6825/12634/10841
+f 6825/12634/10841 12187/11703/10217 13476/11706/10180 12190/12636/10180
+f 6820/12632/10839 6821/12635/10842 6826/12638/10843 6822/12639/10844
+f 6822/12639/10844 6826/12638/10843 12183/12628/10837 12182/12623/10834
+f 6821/12635/10842 12191/12637/10180 12192/12640/10180 6826/12638/10843
+f 6826/12638/10843 12192/12640/10180 13475/12629/10180 12183/12628/10837
+f 6820/12632/10839 6822/12639/10844 6827/12641/10845 6823/12642/10846
+f 6823/12642/10846 6827/12641/10845 7668/4095/3655 7667/4094/3654
+f 6822/12639/10844 12182/12623/10834 12181/12622/10833 6827/12641/10845
+f 6827/12641/10845 12181/12622/10833 12724/1503/1427 7668/4095/3655
+f 6820/12632/10839 6823/12642/10846 6828/12643/10847 6824/12633/10840
+f 6824/12633/10840 6828/12643/10847 12189/11709/10222 12188/11704/10218
+f 6823/12642/10846 7667/4094/3654 7666/4101/3661 6828/12643/10847
+f 6828/12643/10847 7666/4101/3661 12971/1512/1436 12189/11709/10222
+f 6829/12644/10180 6833/12645/10180 6834/12646/10180 6830/12647/10180
+f 6830/12647/10180 6834/12646/10180 12361/12648/10180 12362/12649/10180
+f 6833/12645/10180 12365/12650/10180 12366/12651/10180 6834/12646/10180
+f 6834/12646/10180 12366/12651/10180 13506/12652/10180 12361/12648/10180
+f 6829/12644/10180 6830/12647/10180 6835/12653/10180 6831/12654/10180
+f 6831/12654/10180 6835/12653/10180 12201/11682/10180 12200/11681/10180
+f 6830/12647/10180 12362/12649/10180 12363/12655/10180 6835/12653/10180
+f 6835/12653/10180 12363/12655/10180 13478/11676/10180 12201/11682/10180
+f 6829/12644/10180 6831/12654/10180 6836/12656/10180 6832/12657/10180
+f 6832/12657/10180 6836/12656/10180 12358/12658/10180 12359/12659/10180
+f 6831/12654/10180 12200/11681/10180 12199/11691/10180 6836/12656/10180
+f 6836/12656/10180 12199/11691/10180 13477/11641/10180 12358/12658/10180
+f 6829/12644/10180 6832/12657/10180 6837/12660/10180 6833/12645/10180
+f 6833/12645/10180 6837/12660/10180 12364/12661/10180 12365/12650/10180
+f 6832/12657/10180 12359/12659/10180 12360/12662/10180 6837/12660/10180
+f 6837/12660/10180 12360/12662/10180 13505/12663/10180 12364/12661/10180
+f 6838/12664/10180 6842/12665/10180 6843/12666/10180 6839/12667/10180
+f 6839/12667/10180 6843/12666/10180 12367/12668/10180 12368/12669/10180
+f 6842/12665/10180 12371/12670/10180 12372/12671/10180 6843/12666/10180
+f 6843/12666/10180 12372/12671/10180 13507/12672/10180 12367/12668/10180
+f 6838/12664/10180 6839/12667/10180 6844/12673/10180 6840/12674/10180
+f 6840/12674/10180 6844/12673/10180 12207/11659/10180 12206/11658/10180
+f 6839/12667/10180 12368/12669/10180 12369/12675/10180 6844/12673/10180
+f 6844/12673/10180 12369/12675/10180 13479/11660/10180 12207/11659/10180
+f 6838/12664/10180 6840/12674/10180 6845/12676/10180 6841/12677/10180
+f 6841/12677/10180 6845/12676/10180 12363/12655/10180 12362/12649/10180
+f 6840/12674/10180 12206/11658/10180 12205/11674/10180 6845/12676/10180
+f 6845/12676/10180 12205/11674/10180 13478/11676/10180 12363/12655/10180
+f 6838/12664/10180 6841/12677/10180 6846/12678/10180 6842/12665/10180
+f 6842/12665/10180 6846/12678/10180 12370/12679/10180 12371/12670/10180
+f 6841/12677/10180 12362/12649/10180 12361/12648/10180 6846/12678/10180
+f 6846/12678/10180 12361/12648/10180 13506/12652/10180 12370/12679/10180
+f 6847/12680/10180 6851/12681/10180 6852/12682/10180 6848/12683/10180
+f 6848/12683/10180 6852/12682/10180 12376/12684/10180 12377/12685/10180
+f 6851/12681/10180 12368/12669/10180 12367/12668/10180 6852/12682/10180
+f 6852/12682/10180 12367/12668/10180 13507/12672/10180 12376/12684/10180
+f 6847/12680/10180 6848/12683/10180 6853/12686/10180 6849/12687/10180
+f 6849/12687/10180 6853/12686/10180 12373/12688/10180 12374/12689/10180
+f 6848/12683/10180 12377/12685/10180 12378/12690/10180 6853/12686/10180
+f 6853/12686/10180 12378/12690/10180 13508/12691/10180 12373/12688/10180
+f 6847/12680/10180 6849/12687/10180 6854/12692/10180 6850/12693/10180
+f 6850/12693/10180 6854/12692/10180 12213/11722/10180 12212/11717/10180
+f 6849/12687/10180 12374/12689/10180 12375/12694/10180 6854/12692/10180
+f 6854/12692/10180 12375/12694/10180 13480/11723/10180 12213/11722/10180
+f 6847/12680/10180 6850/12693/10180 6855/12695/10180 6851/12681/10180
+f 6851/12681/10180 6855/12695/10180 12369/12675/10180 12368/12669/10180
+f 6850/12693/10180 12212/11717/10180 12211/11716/10180 6855/12695/10180
+f 6855/12695/10180 12211/11716/10180 13479/11660/10180 12369/12675/10180
+f 6856/12696/10180 6860/12697/10180 6861/12698/10180 6857/12699/10180
+f 6857/12699/10180 6861/12698/10180 12382/12700/10180 12383/12701/10180
+f 6860/12697/10180 12374/12689/10180 12373/12688/10180 6861/12698/10180
+f 6861/12698/10180 12373/12688/10180 13508/12691/10180 12382/12700/10180
+f 6856/12696/10180 6857/12699/10180 6862/12702/10180 6858/12703/10180
+f 6858/12703/10180 6862/12702/10180 12379/12704/10180 12380/12705/10180
+f 6857/12699/10180 12383/12701/10180 12384/12706/10180 6862/12702/10180
+f 6862/12702/10180 12384/12706/10180 13509/12707/10180 12379/12704/10180
+f 6856/12696/10180 6858/12703/10180 6863/12708/10180 6859/12709/10180
+f 6859/12709/10180 6863/12708/10180 12219/11742/10180 12218/11737/10180
+f 6858/12703/10180 12380/12705/10180 12381/12710/10180 6863/12708/10180
+f 6863/12708/10180 12381/12710/10180 13481/11743/10180 12219/11742/10180
+f 6856/12696/10180 6859/12709/10180 6864/12711/10180 6860/12697/10180
+f 6860/12697/10180 6864/12711/10180 12375/12694/10180 12374/12689/10180
+f 6859/12709/10180 12218/11737/10180 12217/11736/10180 6864/12711/10180
+f 6864/12711/10180 12217/11736/10180 13480/11723/10180 12375/12694/10180
+f 6865/12712/10180 6869/12713/10180 6870/12714/10180 6866/12715/10180
+f 6866/12715/10180 6870/12714/10180 12388/12716/10180 12389/12717/10180
+f 6869/12713/10180 12380/12705/10180 12379/12704/10180 6870/12714/10180
+f 6870/12714/10180 12379/12704/10180 13509/12707/10180 12388/12716/10180
+f 6865/12712/10180 6866/12715/10180 6871/12718/10180 6867/12719/10180
+f 6867/12719/10180 6871/12718/10180 12385/12720/10180 12386/12721/10180
+f 6866/12715/10180 12389/12717/10180 12390/12722/10180 6871/12718/10180
+f 6871/12718/10180 12390/12722/10180 13510/12723/10180 12385/12720/10180
+f 6865/12712/10180 6867/12719/10180 6872/12724/10180 6868/12725/10180
+f 6868/12725/10180 6872/12724/10180 12225/11762/10180 12224/11757/10180
+f 6867/12719/10180 12386/12721/10180 12387/12726/10180 6872/12724/10180
+f 6872/12724/10180 12387/12726/10180 13482/11763/10180 12225/11762/10180
+f 6865/12712/10180 6868/12725/10180 6873/12727/10180 6869/12713/10180
+f 6869/12713/10180 6873/12727/10180 12381/12710/10180 12380/12705/10180
+f 6868/12725/10180 12224/11757/10180 12223/11756/10180 6873/12727/10180
+f 6873/12727/10180 12223/11756/10180 13481/11743/10180 12381/12710/10180
+f 6874/12728/10180 6878/12729/10180 6879/12730/10180 6875/12731/10180
+f 6875/12731/10180 6879/12730/10180 12394/12732/10180 12395/12733/10180
+f 6878/12729/10180 12386/12721/10180 12385/12720/10180 6879/12730/10180
+f 6879/12730/10180 12385/12720/10180 13510/12723/10180 12394/12732/10180
+f 6874/12728/10180 6875/12731/10180 6880/12734/10180 6876/12735/10180
+f 6876/12735/10180 6880/12734/10180 12391/12736/10180 12392/12737/10180
+f 6875/12731/10180 12395/12733/10180 12396/12738/10180 6880/12734/10180
+f 6880/12734/10180 12396/12738/10180 13511/12739/10180 12391/12736/10180
+f 6874/12728/10180 6876/12735/10180 6881/12740/10180 6877/12741/10180
+f 6877/12741/10180 6881/12740/10180 12231/11782/10180 12230/11777/10180
+f 6876/12735/10180 12392/12737/10180 12393/12742/10180 6881/12740/10180
+f 6881/12740/10180 12393/12742/10180 13483/11783/10180 12231/11782/10180
+f 6874/12728/10180 6877/12741/10180 6882/12743/10180 6878/12729/10180
+f 6878/12729/10180 6882/12743/10180 12387/12726/10180 12386/12721/10180
+f 6877/12741/10180 12230/11777/10180 12229/11776/10180 6882/12743/10180
+f 6882/12743/10180 12229/11776/10180 13482/11763/10180 12387/12726/10180
+f 6883/12744/10180 6887/12745/10180 6888/12746/10180 6884/12747/10180
+f 6884/12747/10180 6888/12746/10180 12400/12748/10180 12401/12749/10180
+f 6887/12745/10180 12392/12737/10180 12391/12736/10180 6888/12746/10180
+f 6888/12746/10180 12391/12736/10180 13511/12739/10180 12400/12748/10180
+f 6883/12744/10180 6884/12747/10180 6889/12750/10180 6885/12751/10180
+f 6885/12751/10180 6889/12750/10180 12397/12752/10180 12398/12753/10180
+f 6884/12747/10180 12401/12749/10180 12402/12754/10180 6889/12750/10180
+f 6889/12750/10180 12402/12754/10180 13512/12755/10180 12397/12752/10180
+f 6883/12744/10180 6885/12751/10180 6890/12756/10180 6886/12757/10180
+f 6886/12757/10180 6890/12756/10180 12237/11802/10180 12236/11797/10180
+f 6885/12751/10180 12398/12753/10180 12399/12758/10180 6890/12756/10180
+f 6890/12756/10180 12399/12758/10180 13484/11803/10180 12237/11802/10180
+f 6883/12744/10180 6886/12757/10180 6891/12759/10180 6887/12745/10180
+f 6887/12745/10180 6891/12759/10180 12393/12742/10180 12392/12737/10180
+f 6886/12757/10180 12236/11797/10180 12235/11796/10180 6891/12759/10180
+f 6891/12759/10180 12235/11796/10180 13483/11783/10180 12393/12742/10180
+f 6892/12760/10180 6896/12761/10180 6897/12762/10180 6893/12763/10180
+f 6893/12763/10180 6897/12762/10180 12406/12764/10180 12407/12765/10180
+f 6896/12761/10180 12398/12753/10180 12397/12752/10180 6897/12762/10180
+f 6897/12762/10180 12397/12752/10180 13512/12755/10180 12406/12764/10180
+f 6892/12760/10180 6893/12763/10180 6898/12766/10180 6894/12767/10180
+f 6894/12767/10180 6898/12766/10180 12403/12768/10180 12404/12769/10180
+f 6893/12763/10180 12407/12765/10180 12408/12770/10180 6898/12766/10180
+f 6898/12766/10180 12408/12770/10180 13513/12771/10180 12403/12768/10180
+f 6892/12760/10180 6894/12767/10180 6899/12772/10180 6895/12773/10180
+f 6895/12773/10180 6899/12772/10180 12243/11822/10180 12242/11817/10180
+f 6894/12767/10180 12404/12769/10180 12405/12774/10180 6899/12772/10180
+f 6899/12772/10180 12405/12774/10180 13485/11823/10180 12243/11822/10180
+f 6892/12760/10180 6895/12773/10180 6900/12775/10180 6896/12761/10180
+f 6896/12761/10180 6900/12775/10180 12399/12758/10180 12398/12753/10180
+f 6895/12773/10180 12242/11817/10180 12241/11816/10180 6900/12775/10180
+f 6900/12775/10180 12241/11816/10180 13484/11803/10180 12399/12758/10180
+f 6901/12776/10180 6905/12777/10180 6906/12778/10180 6902/12779/10180
+f 6902/12779/10180 6906/12778/10180 12412/12780/10180 12413/12781/10180
+f 6905/12777/10180 12404/12769/10180 12403/12768/10180 6906/12778/10180
+f 6906/12778/10180 12403/12768/10180 13513/12771/10180 12412/12780/10180
+f 6901/12776/10180 6902/12779/10180 6907/12782/10180 6903/12783/10180
+f 6903/12783/10180 6907/12782/10180 12409/12784/10180 12410/12785/10180
+f 6902/12779/10180 12413/12781/10180 12414/12786/10180 6907/12782/10180
+f 6907/12782/10180 12414/12786/10180 13514/12787/10180 12409/12784/10180
+f 6901/12776/10180 6903/12783/10180 6908/12788/10180 6904/12789/10180
+f 6904/12789/10180 6908/12788/10180 12249/11842/10180 12248/11837/10180
+f 6903/12783/10180 12410/12785/10180 12411/12790/10180 6908/12788/10180
+f 6908/12788/10180 12411/12790/10180 13486/11843/10180 12249/11842/10180
+f 6901/12776/10180 6904/12789/10180 6909/12791/10180 6905/12777/10180
+f 6905/12777/10180 6909/12791/10180 12405/12774/10180 12404/12769/10180
+f 6904/12789/10180 12248/11837/10180 12247/11836/10180 6909/12791/10180
+f 6909/12791/10180 12247/11836/10180 13485/11823/10180 12405/12774/10180
+f 6910/12792/10180 6914/12793/10180 6915/12794/10180 6911/12795/10180
+f 6911/12795/10180 6915/12794/10180 12418/12796/10180 12419/12797/10180
+f 6914/12793/10180 12410/12785/10180 12409/12784/10180 6915/12794/10180
+f 6915/12794/10180 12409/12784/10180 13514/12787/10180 12418/12796/10180
+f 6910/12792/10180 6911/12795/10180 6916/12798/10180 6912/12799/10180
+f 6912/12799/10180 6916/12798/10180 12415/12800/10180 12416/12801/10180
+f 6911/12795/10180 12419/12797/10180 12420/12802/10180 6916/12798/10180
+f 6916/12798/10180 12420/12802/10180 13515/12803/10180 12415/12800/10180
+f 6910/12792/10180 6912/12799/10180 6917/12804/10180 6913/12805/10180
+f 6913/12805/10180 6917/12804/10180 12255/11862/10180 12254/11857/10180
+f 6912/12799/10180 12416/12801/10180 12417/12806/10180 6917/12804/10180
+f 6917/12804/10180 12417/12806/10180 13487/11863/10180 12255/11862/10180
+f 6910/12792/10180 6913/12805/10180 6918/12807/10180 6914/12793/10180
+f 6914/12793/10180 6918/12807/10180 12411/12790/10180 12410/12785/10180
+f 6913/12805/10180 12254/11857/10180 12253/11856/10180 6918/12807/10180
+f 6918/12807/10180 12253/11856/10180 13486/11843/10180 12411/12790/10180
+f 6919/12808/10180 6923/12809/10180 6924/12810/10180 6920/12811/10180
+f 6920/12811/10180 6924/12810/10180 12424/12812/10180 12425/12813/10180
+f 6923/12809/10180 12416/12801/10180 12415/12800/10180 6924/12810/10180
+f 6924/12810/10180 12415/12800/10180 13515/12803/10180 12424/12812/10180
+f 6919/12808/10180 6920/12811/10180 6925/12814/10180 6921/12815/10180
+f 6921/12815/10180 6925/12814/10180 12421/12816/10180 12422/12817/10180
+f 6920/12811/10180 12425/12813/10180 12426/12818/10180 6925/12814/10180
+f 6925/12814/10180 12426/12818/10180 13516/12819/10180 12421/12816/10180
+f 6919/12808/10180 6921/12815/10180 6926/12820/10180 6922/12821/10180
+f 6922/12821/10180 6926/12820/10180 12261/11882/10180 12260/11877/10180
+f 6921/12815/10180 12422/12817/10180 12423/12822/10180 6926/12820/10180
+f 6926/12820/10180 12423/12822/10180 13488/11883/10180 12261/11882/10180
+f 6919/12808/10180 6922/12821/10180 6927/12823/10180 6923/12809/10180
+f 6923/12809/10180 6927/12823/10180 12417/12806/10180 12416/12801/10180
+f 6922/12821/10180 12260/11877/10180 12259/11876/10180 6927/12823/10180
+f 6927/12823/10180 12259/11876/10180 13487/11863/10180 12417/12806/10180
+f 6928/12824/10180 6932/12825/10180 6933/12826/10180 6929/12827/10180
+f 6929/12827/10180 6933/12826/10180 12430/12828/10180 12431/12829/10180
+f 6932/12825/10180 12422/12817/10180 12421/12816/10180 6933/12826/10180
+f 6933/12826/10180 12421/12816/10180 13516/12819/10180 12430/12828/10180
+f 6928/12824/10180 6929/12827/10180 6934/12830/10180 6930/12831/10180
+f 6930/12831/10180 6934/12830/10180 12427/12832/10180 12428/12833/10180
+f 6929/12827/10180 12431/12829/10180 12432/12834/10180 6934/12830/10180
+f 6934/12830/10180 12432/12834/10180 13517/12835/10180 12427/12832/10180
+f 6928/12824/10180 6930/12831/10180 6935/12836/10180 6931/12837/10180
+f 6931/12837/10180 6935/12836/10180 12267/11902/10180 12266/11897/10180
+f 6930/12831/10180 12428/12833/10180 12429/12838/10180 6935/12836/10180
+f 6935/12836/10180 12429/12838/10180 13489/11903/10180 12267/11902/10180
+f 6928/12824/10180 6931/12837/10180 6936/12839/10180 6932/12825/10180
+f 6932/12825/10180 6936/12839/10180 12423/12822/10180 12422/12817/10180
+f 6931/12837/10180 12266/11897/10180 12265/11896/10180 6936/12839/10180
+f 6936/12839/10180 12265/11896/10180 13488/11883/10180 12423/12822/10180
+f 6937/12840/10180 6941/12841/10180 6942/12842/10180 6938/12843/10180
+f 6938/12843/10180 6942/12842/10180 12436/12844/10180 12437/12845/10180
+f 6941/12841/10180 12428/12833/10180 12427/12832/10180 6942/12842/10180
+f 6942/12842/10180 12427/12832/10180 13517/12835/10180 12436/12844/10180
+f 6937/12840/10180 6938/12843/10180 6943/12846/10180 6939/12847/10180
+f 6939/12847/10180 6943/12846/10180 12433/12848/10180 12434/12849/10180
+f 6938/12843/10180 12437/12845/10180 12438/12850/10180 6943/12846/10180
+f 6943/12846/10180 12438/12850/10180 13518/12851/10180 12433/12848/10180
+f 6937/12840/10180 6939/12847/10180 6944/12852/10180 6940/12853/10180
+f 6940/12853/10180 6944/12852/10180 12273/11922/10180 12272/11917/10180
+f 6939/12847/10180 12434/12849/10180 12435/12854/10180 6944/12852/10180
+f 6944/12852/10180 12435/12854/10180 13490/11923/10180 12273/11922/10180
+f 6937/12840/10180 6940/12853/10180 6945/12855/10180 6941/12841/10180
+f 6941/12841/10180 6945/12855/10180 12429/12838/10180 12428/12833/10180
+f 6940/12853/10180 12272/11917/10180 12271/11916/10180 6945/12855/10180
+f 6945/12855/10180 12271/11916/10180 13489/11903/10180 12429/12838/10180
+f 6946/12856/10180 6950/12857/10180 6951/12858/10180 6947/12859/10180
+f 6947/12859/10180 6951/12858/10180 12442/12860/10180 12443/12861/10180
+f 6950/12857/10180 12434/12849/10180 12433/12848/10180 6951/12858/10180
+f 6951/12858/10180 12433/12848/10180 13518/12851/10180 12442/12860/10180
+f 6946/12856/10180 6947/12859/10180 6952/12862/10180 6948/12863/10180
+f 6948/12863/10180 6952/12862/10180 12439/12864/10180 12440/12865/10180
+f 6947/12859/10180 12443/12861/10180 12444/12866/10180 6952/12862/10180
+f 6952/12862/10180 12444/12866/10180 13519/12867/10180 12439/12864/10180
+f 6946/12856/10180 6948/12863/10180 6953/12868/10180 6949/12869/10180
+f 6949/12869/10180 6953/12868/10180 12279/11942/10180 12278/11937/10180
+f 6948/12863/10180 12440/12865/10180 12441/12870/10180 6953/12868/10180
+f 6953/12868/10180 12441/12870/10180 13491/11943/10180 12279/11942/10180
+f 6946/12856/10180 6949/12869/10180 6954/12871/10180 6950/12857/10180
+f 6950/12857/10180 6954/12871/10180 12435/12854/10180 12434/12849/10180
+f 6949/12869/10180 12278/11937/10180 12277/11936/10180 6954/12871/10180
+f 6954/12871/10180 12277/11936/10180 13490/11923/10180 12435/12854/10180
+f 6955/12872/10180 6959/12873/10180 6960/12874/10180 6956/12875/10180
+f 6956/12875/10180 6960/12874/10180 12448/12876/10180 12449/12877/10180
+f 6959/12873/10180 12440/12865/10180 12439/12864/10180 6960/12874/10180
+f 6960/12874/10180 12439/12864/10180 13519/12867/10180 12448/12876/10180
+f 6955/12872/10180 6956/12875/10180 6961/12878/10180 6957/12879/10180
+f 6957/12879/10180 6961/12878/10180 12445/12880/10180 12446/12881/10180
+f 6956/12875/10180 12449/12877/10180 12450/12882/10180 6961/12878/10180
+f 6961/12878/10180 12450/12882/10180 13520/12883/10180 12445/12880/10180
+f 6955/12872/10180 6957/12879/10180 6962/12884/10180 6958/12885/10180
+f 6958/12885/10180 6962/12884/10180 12285/11962/10180 12284/11957/10180
+f 6957/12879/10180 12446/12881/10180 12447/12886/10180 6962/12884/10180
+f 6962/12884/10180 12447/12886/10180 13492/11963/10180 12285/11962/10180
+f 6955/12872/10180 6958/12885/10180 6963/12887/10180 6959/12873/10180
+f 6959/12873/10180 6963/12887/10180 12441/12870/10180 12440/12865/10180
+f 6958/12885/10180 12284/11957/10180 12283/11956/10180 6963/12887/10180
+f 6963/12887/10180 12283/11956/10180 13491/11943/10180 12441/12870/10180
+f 6964/12888/10180 6968/12889/10180 6969/12890/10180 6965/12891/10180
+f 6965/12891/10180 6969/12890/10180 12454/12892/10180 12455/12893/10180
+f 6968/12889/10180 12446/12881/10180 12445/12880/10180 6969/12890/10180
+f 6969/12890/10180 12445/12880/10180 13520/12883/10180 12454/12892/10180
+f 6964/12888/10180 6965/12891/10180 6970/12894/10180 6966/12895/10180
+f 6966/12895/10180 6970/12894/10180 12451/12896/10180 12452/12897/10180
+f 6965/12891/10180 12455/12893/10180 12456/12898/10180 6970/12894/10180
+f 6970/12894/10180 12456/12898/10180 13521/12899/10180 12451/12896/10180
+f 6964/12888/10180 6966/12895/10180 6971/12900/10180 6967/12901/10180
+f 6967/12901/10180 6971/12900/10180 12291/11982/10180 12290/11977/10180
+f 6966/12895/10180 12452/12897/10180 12453/12902/10180 6971/12900/10180
+f 6971/12900/10180 12453/12902/10180 13493/11983/10180 12291/11982/10180
+f 6964/12888/10180 6967/12901/10180 6972/12903/10180 6968/12889/10180
+f 6968/12889/10180 6972/12903/10180 12447/12886/10180 12446/12881/10180
+f 6967/12901/10180 12290/11977/10180 12289/11976/10180 6972/12903/10180
+f 6972/12903/10180 12289/11976/10180 13492/11963/10180 12447/12886/10180
+f 6973/12904/10180 6977/12905/10180 6978/12906/10180 6974/12907/10180
+f 6974/12907/10180 6978/12906/10180 12460/12908/10180 12461/12909/10180
+f 6977/12905/10180 12452/12897/10180 12451/12896/10180 6978/12906/10180
+f 6978/12906/10180 12451/12896/10180 13521/12899/10180 12460/12908/10180
+f 6973/12904/10180 6974/12907/10180 6979/12910/10180 6975/12911/10180
+f 6975/12911/10180 6979/12910/10180 12457/12912/10180 12458/12913/10180
+f 6974/12907/10180 12461/12909/10180 12462/12914/10180 6979/12910/10180
+f 6979/12910/10180 12462/12914/10180 13522/12915/10180 12457/12912/10180
+f 6973/12904/10180 6975/12911/10180 6980/12916/10180 6976/12917/10180
+f 6976/12917/10180 6980/12916/10180 12297/12002/10180 12296/11997/10180
+f 6975/12911/10180 12458/12913/10180 12459/12918/10180 6980/12916/10180
+f 6980/12916/10180 12459/12918/10180 13494/12003/10180 12297/12002/10180
+f 6973/12904/10180 6976/12917/10180 6981/12919/10180 6977/12905/10180
+f 6977/12905/10180 6981/12919/10180 12453/12902/10180 12452/12897/10180
+f 6976/12917/10180 12296/11997/10180 12295/11996/10180 6981/12919/10180
+f 6981/12919/10180 12295/11996/10180 13493/11983/10180 12453/12902/10180
+f 6982/12920/10180 6986/12921/10180 6987/12922/10180 6983/12923/10180
+f 6983/12923/10180 6987/12922/10180 12466/12924/10180 12467/12925/10180
+f 6986/12921/10180 12458/12913/10180 12457/12912/10180 6987/12922/10180
+f 6987/12922/10180 12457/12912/10180 13522/12915/10180 12466/12924/10180
+f 6982/12920/10180 6983/12923/10180 6988/12926/10180 6984/12927/10180
+f 6984/12927/10180 6988/12926/10180 12463/12928/10180 12464/12929/10180
+f 6983/12923/10180 12467/12925/10180 12468/12930/10180 6988/12926/10180
+f 6988/12926/10180 12468/12930/10180 13523/12931/10180 12463/12928/10180
+f 6982/12920/10180 6984/12927/10180 6989/12932/10180 6985/12933/10180
+f 6985/12933/10180 6989/12932/10180 12303/12022/10180 12302/12017/10180
+f 6984/12927/10180 12464/12929/10180 12465/12934/10180 6989/12932/10180
+f 6989/12932/10180 12465/12934/10180 13495/12023/10180 12303/12022/10180
+f 6982/12920/10180 6985/12933/10180 6990/12935/10180 6986/12921/10180
+f 6986/12921/10180 6990/12935/10180 12459/12918/10180 12458/12913/10180
+f 6985/12933/10180 12302/12017/10180 12301/12016/10180 6990/12935/10180
+f 6990/12935/10180 12301/12016/10180 13494/12003/10180 12459/12918/10180
+f 6991/12936/10180 6995/12937/10180 6996/12938/10180 6992/12939/10180
+f 6992/12939/10180 6996/12938/10180 12472/12940/10180 12473/12941/10180
+f 6995/12937/10180 12464/12929/10180 12463/12928/10180 6996/12938/10180
+f 6996/12938/10180 12463/12928/10180 13523/12931/10180 12472/12940/10180
+f 6991/12936/10180 6992/12939/10180 6997/12942/10180 6993/12943/10180
+f 6993/12943/10180 6997/12942/10180 12469/12944/10180 12470/12945/10180
+f 6992/12939/10180 12473/12941/10180 12474/12946/10180 6997/12942/10180
+f 6997/12942/10180 12474/12946/10180 13524/12947/10180 12469/12944/10180
+f 6991/12936/10180 6993/12943/10180 6998/12948/10180 6994/12949/10180
+f 6994/12949/10180 6998/12948/10180 12309/12042/10180 12308/12037/10180
+f 6993/12943/10180 12470/12945/10180 12471/12950/10180 6998/12948/10180
+f 6998/12948/10180 12471/12950/10180 13496/12043/10180 12309/12042/10180
+f 6991/12936/10180 6994/12949/10180 6999/12951/10180 6995/12937/10180
+f 6995/12937/10180 6999/12951/10180 12465/12934/10180 12464/12929/10180
+f 6994/12949/10180 12308/12037/10180 12307/12036/10180 6999/12951/10180
+f 6999/12951/10180 12307/12036/10180 13495/12023/10180 12465/12934/10180
+f 7000/12952/10180 7004/12953/10180 7005/12954/10180 7001/12955/10180
+f 7001/12955/10180 7005/12954/10180 12478/12956/10180 12479/12957/10180
+f 7004/12953/10180 12470/12945/10180 12469/12944/10180 7005/12954/10180
+f 7005/12954/10180 12469/12944/10180 13524/12947/10180 12478/12956/10180
+f 7000/12952/10180 7001/12955/10180 7006/12958/10180 7002/12959/10180
+f 7002/12959/10180 7006/12958/10180 12475/12960/10180 12476/12961/10180
+f 7001/12955/10180 12479/12957/10180 12480/12962/10180 7006/12958/10180
+f 7006/12958/10180 12480/12962/10180 13525/12963/10180 12475/12960/10180
+f 7000/12952/10180 7002/12959/10180 7007/12964/10180 7003/12965/10180
+f 7003/12965/10180 7007/12964/10180 12315/12062/10180 12314/12057/10180
+f 7002/12959/10180 12476/12961/10180 12477/12966/10180 7007/12964/10180
+f 7007/12964/10180 12477/12966/10180 13497/12063/10180 12315/12062/10180
+f 7000/12952/10180 7003/12965/10180 7008/12967/10180 7004/12953/10180
+f 7004/12953/10180 7008/12967/10180 12471/12950/10180 12470/12945/10180
+f 7003/12965/10180 12314/12057/10180 12313/12056/10180 7008/12967/10180
+f 7008/12967/10180 12313/12056/10180 13496/12043/10180 12471/12950/10180
+f 7009/12968/10180 7013/12969/10180 7014/12970/10180 7010/12971/10180
+f 7010/12971/10180 7014/12970/10180 12484/12972/10180 12485/12973/10180
+f 7013/12969/10180 12476/12961/10180 12475/12960/10180 7014/12970/10180
+f 7014/12970/10180 12475/12960/10180 13525/12963/10180 12484/12972/10180
+f 7009/12968/10180 7010/12971/10180 7015/12974/10180 7011/12975/10180
+f 7011/12975/10180 7015/12974/10180 12481/12976/10180 12482/12977/10180
+f 7010/12971/10180 12485/12973/10180 12486/12978/10180 7015/12974/10180
+f 7015/12974/10180 12486/12978/10180 13526/12979/10180 12481/12976/10180
+f 7009/12968/10180 7011/12975/10180 7016/12980/10180 7012/12981/10180
+f 7012/12981/10180 7016/12980/10180 12321/12082/10180 12320/12077/10180
+f 7011/12975/10180 12482/12977/10180 12483/12982/10180 7016/12980/10180
+f 7016/12980/10180 12483/12982/10180 13498/12083/10180 12321/12082/10180
+f 7009/12968/10180 7012/12981/10180 7017/12983/10180 7013/12969/10180
+f 7013/12969/10180 7017/12983/10180 12477/12966/10180 12476/12961/10180
+f 7012/12981/10180 12320/12077/10180 12319/12076/10180 7017/12983/10180
+f 7017/12983/10180 12319/12076/10180 13497/12063/10180 12477/12966/10180
+f 7018/12984/10180 7022/12985/10180 7023/12986/10180 7019/12987/10180
+f 7019/12987/10180 7023/12986/10180 12490/12988/10180 12491/12989/10180
+f 7022/12985/10180 12482/12977/10180 12481/12976/10180 7023/12986/10180
+f 7023/12986/10180 12481/12976/10180 13526/12979/10180 12490/12988/10180
+f 7018/12984/10180 7019/12987/10180 7024/12990/10180 7020/12991/10180
+f 7020/12991/10180 7024/12990/10180 12487/12992/10180 12488/12993/10180
+f 7019/12987/10180 12491/12989/10180 12492/12994/10180 7024/12990/10180
+f 7024/12990/10180 12492/12994/10180 13527/12995/10180 12487/12992/10180
+f 7018/12984/10180 7020/12991/10180 7025/12996/10180 7021/12997/10180
+f 7021/12997/10180 7025/12996/10180 12327/12102/10180 12326/12097/10180
+f 7020/12991/10180 12488/12993/10180 12489/12998/10180 7025/12996/10180
+f 7025/12996/10180 12489/12998/10180 13499/12103/10180 12327/12102/10180
+f 7018/12984/10180 7021/12997/10180 7026/12999/10180 7022/12985/10180
+f 7022/12985/10180 7026/12999/10180 12483/12982/10180 12482/12977/10180
+f 7021/12997/10180 12326/12097/10180 12325/12096/10180 7026/12999/10180
+f 7026/12999/10180 12325/12096/10180 13498/12083/10180 12483/12982/10180
+f 7027/13000/10180 7031/13001/10180 7032/13002/10180 7028/13003/10180
+f 7028/13003/10180 7032/13002/10180 12496/13004/10180 12497/13005/10180
+f 7031/13001/10180 12488/12993/10180 12487/12992/10180 7032/13002/10180
+f 7032/13002/10180 12487/12992/10180 13527/12995/10180 12496/13004/10180
+f 7027/13000/10180 7028/13003/10180 7033/13006/10180 7029/13007/10180
+f 7029/13007/10180 7033/13006/10180 12493/13008/10180 12494/13009/10180
+f 7028/13003/10180 12497/13005/10180 12498/13010/10180 7033/13006/10180
+f 7033/13006/10180 12498/13010/10180 13528/13011/10180 12493/13008/10180
+f 7027/13000/10180 7029/13007/10180 7034/13012/10180 7030/13013/10180
+f 7030/13013/10180 7034/13012/10180 12333/12122/10180 12332/12117/10180
+f 7029/13007/10180 12494/13009/10180 12495/13014/10180 7034/13012/10180
+f 7034/13012/10180 12495/13014/10180 13500/12123/10180 12333/12122/10180
+f 7027/13000/10180 7030/13013/10180 7035/13015/10180 7031/13001/10180
+f 7031/13001/10180 7035/13015/10180 12489/12998/10180 12488/12993/10180
+f 7030/13013/10180 12332/12117/10180 12331/12116/10180 7035/13015/10180
+f 7035/13015/10180 12331/12116/10180 13499/12103/10180 12489/12998/10180
+f 7036/13016/10180 7040/13017/10180 7041/13018/10180 7037/13019/10180
+f 7037/13019/10180 7041/13018/10180 12502/13020/10180 12503/13021/10180
+f 7040/13017/10180 12494/13009/10180 12493/13008/10180 7041/13018/10180
+f 7041/13018/10180 12493/13008/10180 13528/13011/10180 12502/13020/10180
+f 7036/13016/10180 7037/13019/10180 7042/13022/10180 7038/13023/10180
+f 7038/13023/10180 7042/13022/10180 12499/13024/10180 12500/13025/10180
+f 7037/13019/10180 12503/13021/10180 12504/13026/10180 7042/13022/10180
+f 7042/13022/10180 12504/13026/10180 13529/13027/10180 12499/13024/10180
+f 7036/13016/10180 7038/13023/10180 7043/13028/10180 7039/13029/10180
+f 7039/13029/10180 7043/13028/10180 12339/12142/10180 12338/12137/10180
+f 7038/13023/10180 12500/13025/10180 12501/13030/10180 7043/13028/10180
+f 7043/13028/10180 12501/13030/10180 13501/12143/10180 12339/12142/10180
+f 7036/13016/10180 7039/13029/10180 7044/13031/10180 7040/13017/10180
+f 7040/13017/10180 7044/13031/10180 12495/13014/10180 12494/13009/10180
+f 7039/13029/10180 12338/12137/10180 12337/12136/10180 7044/13031/10180
+f 7044/13031/10180 12337/12136/10180 13500/12123/10180 12495/13014/10180
+f 7045/13032/10180 7049/13033/10180 7050/13034/10180 7046/13035/10180
+f 7046/13035/10180 7050/13034/10180 12508/13036/10180 12509/13037/10180
+f 7049/13033/10180 12500/13025/10180 12499/13024/10180 7050/13034/10180
+f 7050/13034/10180 12499/13024/10180 13529/13027/10180 12508/13036/10180
+f 7045/13032/10180 7046/13035/10180 7051/13038/10180 7047/13039/10180
+f 7047/13039/10180 7051/13038/10180 12505/13040/10180 12506/13041/10180
+f 7046/13035/10180 12509/13037/10180 12510/13042/10180 7051/13038/10180
+f 7051/13038/10180 12510/13042/10180 13530/13043/10180 12505/13040/10180
+f 7045/13032/10180 7047/13039/10180 7052/13044/10180 7048/13045/10180
+f 7048/13045/10180 7052/13044/10180 12345/12162/10180 12344/12157/10180
+f 7047/13039/10180 12506/13041/10180 12507/13046/10180 7052/13044/10180
+f 7052/13044/10180 12507/13046/10180 13502/12163/10180 12345/12162/10180
+f 7045/13032/10180 7048/13045/10180 7053/13047/10180 7049/13033/10180
+f 7049/13033/10180 7053/13047/10180 12501/13030/10180 12500/13025/10180
+f 7048/13045/10180 12344/12157/10180 12343/12156/10180 7053/13047/10180
+f 7053/13047/10180 12343/12156/10180 13501/12143/10180 12501/13030/10180
+f 7054/13048/10180 7058/13049/10180 7059/13050/10180 7055/13051/10180
+f 7055/13051/10180 7059/13050/10180 12514/13052/10180 12515/13053/10180
+f 7058/13049/10180 12506/13041/10180 12505/13040/10180 7059/13050/10180
+f 7059/13050/10180 12505/13040/10180 13530/13043/10180 12514/13052/10180
+f 7054/13048/10180 7055/13051/10180 7060/13054/10180 7056/13055/10180
+f 7056/13055/10180 7060/13054/10180 12346/13056/10180 12347/13057/10180
+f 7055/13051/10180 12515/13053/10180 12516/13058/10180 7060/13054/10180
+f 7060/13054/10180 12516/13058/10180 13531/13059/10180 12346/13056/10180
+f 7054/13048/10180 7056/13055/10180 7061/13060/10180 7057/13061/10180
+f 7057/13061/10180 7061/13060/10180 12351/12182/10180 12350/12177/10180
+f 7056/13055/10180 12347/13057/10180 12348/13062/10180 7061/13060/10180
+f 7061/13060/10180 12348/13062/10180 13503/12183/10180 12351/12182/10180
+f 7054/13048/10180 7057/13061/10180 7062/13063/10180 7058/13049/10180
+f 7058/13049/10180 7062/13063/10180 12507/13046/10180 12506/13041/10180
+f 7057/13061/10180 12350/12177/10180 12349/12176/10180 7062/13063/10180
+f 7062/13063/10180 12349/12176/10180 13502/12163/10180 12507/13046/10180
+f 7063/13064/10180 7067/13065/10180 7068/13066/10180 7064/13067/10180
+f 7064/13067/10180 7068/13066/10180 12357/12206/10180 12356/12201/10180
+f 7067/13065/10180 12353/13068/10180 12354/13069/10180 7068/13066/10180
+f 7068/13066/10180 12354/13069/10180 13504/12207/10180 12357/12206/10180
+f 7063/13064/10180 7064/13067/10180 7069/13070/10180 7065/13071/10180
+f 7065/13071/10180 7069/13070/10180 12348/13062/10180 12347/13057/10180
+f 7064/13067/10180 12356/12201/10180 12355/12200/10180 7069/13070/10180
+f 7069/13070/10180 12355/12200/10180 13503/12183/10180 12348/13062/10180
+f 7063/13064/10180 7065/13071/10180 7070/13072/10180 7066/13073/10180
+f 7066/13073/10180 7070/13072/10180 12520/13074/10180 12521/13075/10180
+f 7065/13071/10180 12347/13057/10180 12346/13056/10180 7070/13072/10180
+f 7070/13072/10180 12346/13056/10180 13531/13059/10180 12520/13074/10180
+f 7063/13064/10180 7066/13073/10180 7071/13076/10180 7067/13065/10180
+f 7067/13065/10180 7071/13076/10180 12352/13077/10180 12353/13068/10180
+f 7066/13073/10180 12521/13075/10180 12522/13078/10180 7071/13076/10180
+f 7071/13076/10180 12522/13078/10180 13532/13079/10180 12352/13077/10180
+f 7072/13080/10180 7076/13081/10180 7077/13082/10180 7073/13083/10180
+f 7073/13083/10180 7077/13082/10180 12526/13084/10180 12527/13085/10180
+f 7076/13081/10180 12530/13086/10180 12531/13087/10180 7077/13082/10180
+f 7077/13082/10180 12531/13087/10180 13534/13088/10180 12526/13084/10180
+f 7072/13080/10180 7073/13083/10180 7078/13089/10180 7074/13090/10180
+f 7074/13090/10180 7078/13089/10180 12366/12651/10180 12365/12650/10180
+f 7073/13083/10180 12527/13085/10180 12528/13091/10180 7078/13089/10180
+f 7078/13089/10180 12528/13091/10180 13506/12652/10180 12366/12651/10180
+f 7072/13080/10180 7074/13090/10180 7079/13092/10180 7075/13093/10180
+f 7075/13093/10180 7079/13092/10180 12523/13094/10180 12524/13095/10180
+f 7074/13090/10180 12365/12650/10180 12364/12661/10180 7079/13092/10180
+f 7079/13092/10180 12364/12661/10180 13505/12663/10180 12523/13094/10180
+f 7072/13080/10180 7075/13093/10180 7080/13096/10180 7076/13081/10180
+f 7076/13081/10180 7080/13096/10180 12529/13097/10180 12530/13086/10180
+f 7075/13093/10180 12524/13095/10180 12525/13098/10180 7080/13096/10180
+f 7080/13096/10180 12525/13098/10180 13533/13099/10180 12529/13097/10180
+f 7081/13100/10180 7085/13101/10180 7086/13102/10180 7082/13103/10180
+f 7082/13103/10180 7086/13102/10180 12532/13104/10180 12533/13105/10180
+f 7085/13101/10180 12536/13106/10180 12537/13107/10180 7086/13102/10180
+f 7086/13102/10180 12537/13107/10180 13535/13108/10180 12532/13104/10180
+f 7081/13100/10180 7082/13103/10180 7087/13109/10180 7083/13110/10180
+f 7083/13110/10180 7087/13109/10180 12372/12671/10180 12371/12670/10180
+f 7082/13103/10180 12533/13105/10180 12534/13111/10180 7087/13109/10180
+f 7087/13109/10180 12534/13111/10180 13507/12672/10180 12372/12671/10180
+f 7081/13100/10180 7083/13110/10180 7088/13112/10180 7084/13113/10180
+f 7084/13113/10180 7088/13112/10180 12528/13091/10180 12527/13085/10180
+f 7083/13110/10180 12371/12670/10180 12370/12679/10180 7088/13112/10180
+f 7088/13112/10180 12370/12679/10180 13506/12652/10180 12528/13091/10180
+f 7081/13100/10180 7084/13113/10180 7089/13114/10180 7085/13101/10180
+f 7085/13101/10180 7089/13114/10180 12535/13115/10180 12536/13106/10180
+f 7084/13113/10180 12527/13085/10180 12526/13084/10180 7089/13114/10180
+f 7089/13114/10180 12526/13084/10180 13534/13088/10180 12535/13115/10180
+f 7090/13116/10180 7094/13117/10180 7095/13118/10180 7091/13119/10180
+f 7091/13119/10180 7095/13118/10180 12541/13120/10180 12542/13121/10180
+f 7094/13117/10180 12533/13105/10180 12532/13104/10180 7095/13118/10180
+f 7095/13118/10180 12532/13104/10180 13535/13108/10180 12541/13120/10180
+f 7090/13116/10180 7091/13119/10180 7096/13122/10180 7092/13123/10180
+f 7092/13123/10180 7096/13122/10180 12538/13124/10180 12539/13125/10180
+f 7091/13119/10180 12542/13121/10180 12543/13126/10180 7096/13122/10180
+f 7096/13122/10180 12543/13126/10180 13536/13127/10180 12538/13124/10180
+f 7090/13116/10180 7092/13123/10180 7097/13128/10180 7093/13129/10180
+f 7093/13129/10180 7097/13128/10180 12378/12690/10180 12377/12685/10180
+f 7092/13123/10180 12539/13125/10180 12540/13130/10180 7097/13128/10180
+f 7097/13128/10180 12540/13130/10180 13508/12691/10180 12378/12690/10180
+f 7090/13116/10180 7093/13129/10180 7098/13131/10180 7094/13117/10180
+f 7094/13117/10180 7098/13131/10180 12534/13111/10180 12533/13105/10180
+f 7093/13129/10180 12377/12685/10180 12376/12684/10180 7098/13131/10180
+f 7098/13131/10180 12376/12684/10180 13507/12672/10180 12534/13111/10180
+f 7099/13132/10180 7103/13133/10180 7104/13134/10180 7100/13135/10180
+f 7100/13135/10180 7104/13134/10180 12547/13136/10180 12548/13137/10180
+f 7103/13133/10180 12539/13125/10180 12538/13124/10180 7104/13134/10180
+f 7104/13134/10180 12538/13124/10180 13536/13127/10180 12547/13136/10180
+f 7099/13132/10180 7100/13135/10180 7105/13138/10180 7101/13139/10180
+f 7101/13139/10180 7105/13138/10180 12544/13140/10180 12545/13141/10180
+f 7100/13135/10180 12548/13137/10180 12549/13142/10180 7105/13138/10180
+f 7105/13138/10180 12549/13142/10180 13537/13143/10180 12544/13140/10180
+f 7099/13132/10180 7101/13139/10180 7106/13144/10180 7102/13145/10180
+f 7102/13145/10180 7106/13144/10180 12384/12706/10180 12383/12701/10180
+f 7101/13139/10180 12545/13141/10180 12546/13146/10180 7106/13144/10180
+f 7106/13144/10180 12546/13146/10180 13509/12707/10180 12384/12706/10180
+f 7099/13132/10180 7102/13145/10180 7107/13147/10180 7103/13133/10180
+f 7103/13133/10180 7107/13147/10180 12540/13130/10180 12539/13125/10180
+f 7102/13145/10180 12383/12701/10180 12382/12700/10180 7107/13147/10180
+f 7107/13147/10180 12382/12700/10180 13508/12691/10180 12540/13130/10180
+f 7108/13148/10180 7112/13149/10180 7113/13150/10180 7109/13151/10180
+f 7109/13151/10180 7113/13150/10180 12553/13152/10180 12554/13153/10180
+f 7112/13149/10180 12545/13141/10180 12544/13140/10180 7113/13150/10180
+f 7113/13150/10180 12544/13140/10180 13537/13143/10180 12553/13152/10180
+f 7108/13148/10180 7109/13151/10180 7114/13154/10180 7110/13155/10180
+f 7110/13155/10180 7114/13154/10180 12550/13156/10180 12551/13157/10180
+f 7109/13151/10180 12554/13153/10180 12555/13158/10180 7114/13154/10180
+f 7114/13154/10180 12555/13158/10180 13538/13159/10180 12550/13156/10180
+f 7108/13148/10180 7110/13155/10180 7115/13160/10180 7111/13161/10180
+f 7111/13161/10180 7115/13160/10180 12390/12722/10180 12389/12717/10180
+f 7110/13155/10180 12551/13157/10180 12552/13162/10180 7115/13160/10180
+f 7115/13160/10180 12552/13162/10180 13510/12723/10180 12390/12722/10180
+f 7108/13148/10180 7111/13161/10180 7116/13163/10180 7112/13149/10180
+f 7112/13149/10180 7116/13163/10180 12546/13146/10180 12545/13141/10180
+f 7111/13161/10180 12389/12717/10180 12388/12716/10180 7116/13163/10180
+f 7116/13163/10180 12388/12716/10180 13509/12707/10180 12546/13146/10180
+f 7117/13164/10180 7121/13165/10180 7122/13166/10180 7118/13167/10180
+f 7118/13167/10180 7122/13166/10180 12559/13168/10180 12560/13169/10180
+f 7121/13165/10180 12551/13157/10180 12550/13156/10180 7122/13166/10180
+f 7122/13166/10180 12550/13156/10180 13538/13159/10180 12559/13168/10180
+f 7117/13164/10180 7118/13167/10180 7123/13170/10180 7119/13171/10180
+f 7119/13171/10180 7123/13170/10180 12556/13172/10180 12557/13173/10180
+f 7118/13167/10180 12560/13169/10180 12561/13174/10180 7123/13170/10180
+f 7123/13170/10180 12561/13174/10180 13539/13175/10180 12556/13172/10180
+f 7117/13164/10180 7119/13171/10180 7124/13176/10180 7120/13177/10180
+f 7120/13177/10180 7124/13176/10180 12396/12738/10180 12395/12733/10180
+f 7119/13171/10180 12557/13173/10180 12558/13178/10180 7124/13176/10180
+f 7124/13176/10180 12558/13178/10180 13511/12739/10180 12396/12738/10180
+f 7117/13164/10180 7120/13177/10180 7125/13179/10180 7121/13165/10180
+f 7121/13165/10180 7125/13179/10180 12552/13162/10180 12551/13157/10180
+f 7120/13177/10180 12395/12733/10180 12394/12732/10180 7125/13179/10180
+f 7125/13179/10180 12394/12732/10180 13510/12723/10180 12552/13162/10180
+f 7126/13180/10180 7130/13181/10180 7131/13182/10180 7127/13183/10180
+f 7127/13183/10180 7131/13182/10180 12565/13184/10180 12566/13185/10180
+f 7130/13181/10180 12557/13173/10180 12556/13172/10180 7131/13182/10180
+f 7131/13182/10180 12556/13172/10180 13539/13175/10180 12565/13184/10180
+f 7126/13180/10180 7127/13183/10180 7132/13186/10180 7128/13187/10180
+f 7128/13187/10180 7132/13186/10180 12562/13188/10180 12563/13189/10180
+f 7127/13183/10180 12566/13185/10180 12567/13190/10180 7132/13186/10180
+f 7132/13186/10180 12567/13190/10180 13540/13191/10180 12562/13188/10180
+f 7126/13180/10180 7128/13187/10180 7133/13192/10180 7129/13193/10180
+f 7129/13193/10180 7133/13192/10180 12402/12754/10180 12401/12749/10180
+f 7128/13187/10180 12563/13189/10180 12564/13194/10180 7133/13192/10180
+f 7133/13192/10180 12564/13194/10180 13512/12755/10180 12402/12754/10180
+f 7126/13180/10180 7129/13193/10180 7134/13195/10180 7130/13181/10180
+f 7130/13181/10180 7134/13195/10180 12558/13178/10180 12557/13173/10180
+f 7129/13193/10180 12401/12749/10180 12400/12748/10180 7134/13195/10180
+f 7134/13195/10180 12400/12748/10180 13511/12739/10180 12558/13178/10180
+f 7135/13196/10180 7139/13197/10180 7140/13198/10180 7136/13199/10180
+f 7136/13199/10180 7140/13198/10180 12571/13200/10180 12572/13201/10180
+f 7139/13197/10180 12563/13189/10180 12562/13188/10180 7140/13198/10180
+f 7140/13198/10180 12562/13188/10180 13540/13191/10180 12571/13200/10180
+f 7135/13196/10180 7136/13199/10180 7141/13202/10180 7137/13203/10180
+f 7137/13203/10180 7141/13202/10180 12568/13204/10180 12569/13205/10180
+f 7136/13199/10180 12572/13201/10180 12573/13206/10180 7141/13202/10180
+f 7141/13202/10180 12573/13206/10180 13541/13207/10180 12568/13204/10180
+f 7135/13196/10180 7137/13203/10180 7142/13208/10180 7138/13209/10180
+f 7138/13209/10180 7142/13208/10180 12408/12770/10180 12407/12765/10180
+f 7137/13203/10180 12569/13205/10180 12570/13210/10180 7142/13208/10180
+f 7142/13208/10180 12570/13210/10180 13513/12771/10180 12408/12770/10180
+f 7135/13196/10180 7138/13209/10180 7143/13211/10180 7139/13197/10180
+f 7139/13197/10180 7143/13211/10180 12564/13194/10180 12563/13189/10180
+f 7138/13209/10180 12407/12765/10180 12406/12764/10180 7143/13211/10180
+f 7143/13211/10180 12406/12764/10180 13512/12755/10180 12564/13194/10180
+f 7144/13212/10180 7148/13213/10180 7149/13214/10180 7145/13215/10180
+f 7145/13215/10180 7149/13214/10180 12577/13216/10180 12578/13217/10180
+f 7148/13213/10180 12569/13205/10180 12568/13204/10180 7149/13214/10180
+f 7149/13214/10180 12568/13204/10180 13541/13207/10180 12577/13216/10180
+f 7144/13212/10180 7145/13215/10180 7150/13218/10180 7146/13219/10180
+f 7146/13219/10180 7150/13218/10180 12574/13220/10180 12575/13221/10180
+f 7145/13215/10180 12578/13217/10180 12579/13222/10180 7150/13218/10180
+f 7150/13218/10180 12579/13222/10180 13542/13223/10180 12574/13220/10180
+f 7144/13212/10180 7146/13219/10180 7151/13224/10180 7147/13225/10180
+f 7147/13225/10180 7151/13224/10180 12414/12786/10180 12413/12781/10180
+f 7146/13219/10180 12575/13221/10180 12576/13226/10180 7151/13224/10180
+f 7151/13224/10180 12576/13226/10180 13514/12787/10180 12414/12786/10180
+f 7144/13212/10180 7147/13225/10180 7152/13227/10180 7148/13213/10180
+f 7148/13213/10180 7152/13227/10180 12570/13210/10180 12569/13205/10180
+f 7147/13225/10180 12413/12781/10180 12412/12780/10180 7152/13227/10180
+f 7152/13227/10180 12412/12780/10180 13513/12771/10180 12570/13210/10180
+f 7153/13228/10180 7157/13229/10180 7158/13230/10180 7154/13231/10180
+f 7154/13231/10180 7158/13230/10180 12583/13232/10180 12584/13233/10180
+f 7157/13229/10180 12575/13221/10180 12574/13220/10180 7158/13230/10180
+f 7158/13230/10180 12574/13220/10180 13542/13223/10180 12583/13232/10180
+f 7153/13228/10180 7154/13231/10180 7159/13234/10180 7155/13235/10180
+f 7155/13235/10180 7159/13234/10180 12580/13236/10180 12581/13237/10180
+f 7154/13231/10180 12584/13233/10180 12585/13238/10180 7159/13234/10180
+f 7159/13234/10180 12585/13238/10180 13543/13239/10180 12580/13236/10180
+f 7153/13228/10180 7155/13235/10180 7160/13240/10180 7156/13241/10180
+f 7156/13241/10180 7160/13240/10180 12420/12802/10180 12419/12797/10180
+f 7155/13235/10180 12581/13237/10180 12582/13242/10180 7160/13240/10180
+f 7160/13240/10180 12582/13242/10180 13515/12803/10180 12420/12802/10180
+f 7153/13228/10180 7156/13241/10180 7161/13243/10180 7157/13229/10180
+f 7157/13229/10180 7161/13243/10180 12576/13226/10180 12575/13221/10180
+f 7156/13241/10180 12419/12797/10180 12418/12796/10180 7161/13243/10180
+f 7161/13243/10180 12418/12796/10180 13514/12787/10180 12576/13226/10180
+f 7162/13244/10180 7166/13245/10180 7167/13246/10180 7163/13247/10180
+f 7163/13247/10180 7167/13246/10180 12589/13248/10180 12590/13249/10180
+f 7166/13245/10180 12581/13237/10180 12580/13236/10180 7167/13246/10180
+f 7167/13246/10180 12580/13236/10180 13543/13239/10180 12589/13248/10180
+f 7162/13244/10180 7163/13247/10180 7168/13250/10180 7164/13251/10180
+f 7164/13251/10180 7168/13250/10180 12586/13252/10180 12587/13253/10180
+f 7163/13247/10180 12590/13249/10180 12591/13254/10180 7168/13250/10180
+f 7168/13250/10180 12591/13254/10180 13544/13255/10180 12586/13252/10180
+f 7162/13244/10180 7164/13251/10180 7169/13256/10180 7165/13257/10180
+f 7165/13257/10180 7169/13256/10180 12426/12818/10180 12425/12813/10180
+f 7164/13251/10180 12587/13253/10180 12588/13258/10180 7169/13256/10180
+f 7169/13256/10180 12588/13258/10180 13516/12819/10180 12426/12818/10180
+f 7162/13244/10180 7165/13257/10180 7170/13259/10180 7166/13245/10180
+f 7166/13245/10180 7170/13259/10180 12582/13242/10180 12581/13237/10180
+f 7165/13257/10180 12425/12813/10180 12424/12812/10180 7170/13259/10180
+f 7170/13259/10180 12424/12812/10180 13515/12803/10180 12582/13242/10180
+f 7171/13260/10180 7175/13261/10180 7176/13262/10180 7172/13263/10180
+f 7172/13263/10180 7176/13262/10180 12595/13264/10180 12596/13265/10180
+f 7175/13261/10180 12587/13253/10180 12586/13252/10180 7176/13262/10180
+f 7176/13262/10180 12586/13252/10180 13544/13255/10180 12595/13264/10180
+f 7171/13260/10180 7172/13263/10180 7177/13266/10180 7173/13267/10180
+f 7173/13267/10180 7177/13266/10180 12592/13268/10180 12593/13269/10180
+f 7172/13263/10180 12596/13265/10180 12597/13270/10180 7177/13266/10180
+f 7177/13266/10180 12597/13270/10180 13545/13271/10180 12592/13268/10180
+f 7171/13260/10180 7173/13267/10180 7178/13272/10180 7174/13273/10180
+f 7174/13273/10180 7178/13272/10180 12432/12834/10180 12431/12829/10180
+f 7173/13267/10180 12593/13269/10180 12594/13274/10180 7178/13272/10180
+f 7178/13272/10180 12594/13274/10180 13517/12835/10180 12432/12834/10180
+f 7171/13260/10180 7174/13273/10180 7179/13275/10180 7175/13261/10180
+f 7175/13261/10180 7179/13275/10180 12588/13258/10180 12587/13253/10180
+f 7174/13273/10180 12431/12829/10180 12430/12828/10180 7179/13275/10180
+f 7179/13275/10180 12430/12828/10180 13516/12819/10180 12588/13258/10180
+f 7180/13276/10180 7184/13277/10180 7185/13278/10180 7181/13279/10180
+f 7181/13279/10180 7185/13278/10180 12601/13280/10180 12602/13281/10180
+f 7184/13277/10180 12593/13269/10180 12592/13268/10180 7185/13278/10180
+f 7185/13278/10180 12592/13268/10180 13545/13271/10180 12601/13280/10180
+f 7180/13276/10180 7181/13279/10180 7186/13282/10180 7182/13283/10180
+f 7182/13283/10180 7186/13282/10180 12598/13284/10180 12599/13285/10180
+f 7181/13279/10180 12602/13281/10180 12603/13286/10180 7186/13282/10180
+f 7186/13282/10180 12603/13286/10180 13546/13287/10180 12598/13284/10180
+f 7180/13276/10180 7182/13283/10180 7187/13288/10180 7183/13289/10180
+f 7183/13289/10180 7187/13288/10180 12438/12850/10180 12437/12845/10180
+f 7182/13283/10180 12599/13285/10180 12600/13290/10180 7187/13288/10180
+f 7187/13288/10180 12600/13290/10180 13518/12851/10180 12438/12850/10180
+f 7180/13276/10180 7183/13289/10180 7188/13291/10180 7184/13277/10180
+f 7184/13277/10180 7188/13291/10180 12594/13274/10180 12593/13269/10180
+f 7183/13289/10180 12437/12845/10180 12436/12844/10180 7188/13291/10180
+f 7188/13291/10180 12436/12844/10180 13517/12835/10180 12594/13274/10180
+f 7189/13292/10180 7193/13293/10180 7194/13294/10180 7190/13295/10180
+f 7190/13295/10180 7194/13294/10180 12607/13296/10180 12608/13297/10180
+f 7193/13293/10180 12599/13285/10180 12598/13284/10180 7194/13294/10180
+f 7194/13294/10180 12598/13284/10180 13546/13287/10180 12607/13296/10180
+f 7189/13292/10180 7190/13295/10180 7195/13298/10180 7191/13299/10180
+f 7191/13299/10180 7195/13298/10180 12604/13300/10180 12605/13301/10180
+f 7190/13295/10180 12608/13297/10180 12609/13302/10180 7195/13298/10180
+f 7195/13298/10180 12609/13302/10180 13547/13303/10180 12604/13300/10180
+f 7189/13292/10180 7191/13299/10180 7196/13304/10180 7192/13305/10180
+f 7192/13305/10180 7196/13304/10180 12444/12866/10180 12443/12861/10180
+f 7191/13299/10180 12605/13301/10180 12606/13306/10180 7196/13304/10180
+f 7196/13304/10180 12606/13306/10180 13519/12867/10180 12444/12866/10180
+f 7189/13292/10180 7192/13305/10180 7197/13307/10180 7193/13293/10180
+f 7193/13293/10180 7197/13307/10180 12600/13290/10180 12599/13285/10180
+f 7192/13305/10180 12443/12861/10180 12442/12860/10180 7197/13307/10180
+f 7197/13307/10180 12442/12860/10180 13518/12851/10180 12600/13290/10180
+f 7198/13308/10180 7202/13309/10180 7203/13310/10180 7199/13311/10180
+f 7199/13311/10180 7203/13310/10180 12613/13312/10180 12614/13313/10180
+f 7202/13309/10180 12605/13301/10180 12604/13300/10180 7203/13310/10180
+f 7203/13310/10180 12604/13300/10180 13547/13303/10180 12613/13312/10180
+f 7198/13308/10180 7199/13311/10180 7204/13314/10180 7200/13315/10180
+f 7200/13315/10180 7204/13314/10180 12610/13316/10180 12611/13317/10180
+f 7199/13311/10180 12614/13313/10180 12615/13318/10180 7204/13314/10180
+f 7204/13314/10180 12615/13318/10180 13548/13319/10180 12610/13316/10180
+f 7198/13308/10180 7200/13315/10180 7205/13320/10180 7201/13321/10180
+f 7201/13321/10180 7205/13320/10180 12450/12882/10180 12449/12877/10180
+f 7200/13315/10180 12611/13317/10180 12612/13322/10180 7205/13320/10180
+f 7205/13320/10180 12612/13322/10180 13520/12883/10180 12450/12882/10180
+f 7198/13308/10180 7201/13321/10180 7206/13323/10180 7202/13309/10180
+f 7202/13309/10180 7206/13323/10180 12606/13306/10180 12605/13301/10180
+f 7201/13321/10180 12449/12877/10180 12448/12876/10180 7206/13323/10180
+f 7206/13323/10180 12448/12876/10180 13519/12867/10180 12606/13306/10180
+f 7207/13324/10180 7211/13325/10180 7212/13326/10180 7208/13327/10180
+f 7208/13327/10180 7212/13326/10180 12619/13328/10180 12620/13329/10180
+f 7211/13325/10180 12611/13317/10180 12610/13316/10180 7212/13326/10180
+f 7212/13326/10180 12610/13316/10180 13548/13319/10180 12619/13328/10180
+f 7207/13324/10180 7208/13327/10180 7213/13330/10180 7209/13331/10180
+f 7209/13331/10180 7213/13330/10180 12616/13332/10180 12617/13333/10180
+f 7208/13327/10180 12620/13329/10180 12621/13334/10180 7213/13330/10180
+f 7213/13330/10180 12621/13334/10180 13549/13335/10180 12616/13332/10180
+f 7207/13324/10180 7209/13331/10180 7214/13336/10180 7210/13337/10180
+f 7210/13337/10180 7214/13336/10180 12456/12898/10180 12455/12893/10180
+f 7209/13331/10180 12617/13333/10180 12618/13338/10180 7214/13336/10180
+f 7214/13336/10180 12618/13338/10180 13521/12899/10180 12456/12898/10180
+f 7207/13324/10180 7210/13337/10180 7215/13339/10180 7211/13325/10180
+f 7211/13325/10180 7215/13339/10180 12612/13322/10180 12611/13317/10180
+f 7210/13337/10180 12455/12893/10180 12454/12892/10180 7215/13339/10180
+f 7215/13339/10180 12454/12892/10180 13520/12883/10180 12612/13322/10180
+f 7216/13340/10180 7220/13341/10180 7221/13342/10180 7217/13343/10180
+f 7217/13343/10180 7221/13342/10180 12625/13344/10180 12626/13345/10180
+f 7220/13341/10180 12617/13333/10180 12616/13332/10180 7221/13342/10180
+f 7221/13342/10180 12616/13332/10180 13549/13335/10180 12625/13344/10180
+f 7216/13340/10180 7217/13343/10180 7222/13346/10180 7218/13347/10180
+f 7218/13347/10180 7222/13346/10180 12622/13348/10180 12623/13349/10180
+f 7217/13343/10180 12626/13345/10180 12627/13350/10180 7222/13346/10180
+f 7222/13346/10180 12627/13350/10180 13550/13351/10180 12622/13348/10180
+f 7216/13340/10180 7218/13347/10180 7223/13352/10180 7219/13353/10180
+f 7219/13353/10180 7223/13352/10180 12462/12914/10180 12461/12909/10180
+f 7218/13347/10180 12623/13349/10180 12624/13354/10180 7223/13352/10180
+f 7223/13352/10180 12624/13354/10180 13522/12915/10180 12462/12914/10180
+f 7216/13340/10180 7219/13353/10180 7224/13355/10180 7220/13341/10180
+f 7220/13341/10180 7224/13355/10180 12618/13338/10180 12617/13333/10180
+f 7219/13353/10180 12461/12909/10180 12460/12908/10180 7224/13355/10180
+f 7224/13355/10180 12460/12908/10180 13521/12899/10180 12618/13338/10180
+f 7225/13356/10180 7229/13357/10180 7230/13358/10180 7226/13359/10180
+f 7226/13359/10180 7230/13358/10180 12631/13360/10180 12632/13361/10180
+f 7229/13357/10180 12623/13349/10180 12622/13348/10180 7230/13358/10180
+f 7230/13358/10180 12622/13348/10180 13550/13351/10180 12631/13360/10180
+f 7225/13356/10180 7226/13359/10180 7231/13362/10180 7227/13363/10180
+f 7227/13363/10180 7231/13362/10180 12628/13364/10180 12629/13365/10180
+f 7226/13359/10180 12632/13361/10180 12633/13366/10180 7231/13362/10180
+f 7231/13362/10180 12633/13366/10180 13551/13367/10180 12628/13364/10180
+f 7225/13356/10180 7227/13363/10180 7232/13368/10180 7228/13369/10180
+f 7228/13369/10180 7232/13368/10180 12468/12930/10180 12467/12925/10180
+f 7227/13363/10180 12629/13365/10180 12630/13370/10180 7232/13368/10180
+f 7232/13368/10180 12630/13370/10180 13523/12931/10180 12468/12930/10180
+f 7225/13356/10180 7228/13369/10180 7233/13371/10180 7229/13357/10180
+f 7229/13357/10180 7233/13371/10180 12624/13354/10180 12623/13349/10180
+f 7228/13369/10180 12467/12925/10180 12466/12924/10180 7233/13371/10180
+f 7233/13371/10180 12466/12924/10180 13522/12915/10180 12624/13354/10180
+f 7234/13372/10180 7238/13373/10180 7239/13374/10180 7235/13375/10180
+f 7235/13375/10180 7239/13374/10180 12637/13376/10180 12638/13377/10180
+f 7238/13373/10180 12629/13365/10180 12628/13364/10180 7239/13374/10180
+f 7239/13374/10180 12628/13364/10180 13551/13367/10180 12637/13376/10180
+f 7234/13372/10180 7235/13375/10180 7240/13378/10180 7236/13379/10180
+f 7236/13379/10180 7240/13378/10180 12634/13380/10180 12635/13381/10180
+f 7235/13375/10180 12638/13377/10180 12639/13382/10180 7240/13378/10180
+f 7240/13378/10180 12639/13382/10180 13552/13383/10180 12634/13380/10180
+f 7234/13372/10180 7236/13379/10180 7241/13384/10180 7237/13385/10180
+f 7237/13385/10180 7241/13384/10180 12474/12946/10180 12473/12941/10180
+f 7236/13379/10180 12635/13381/10180 12636/13386/10180 7241/13384/10180
+f 7241/13384/10180 12636/13386/10180 13524/12947/10180 12474/12946/10180
+f 7234/13372/10180 7237/13385/10180 7242/13387/10180 7238/13373/10180
+f 7238/13373/10180 7242/13387/10180 12630/13370/10180 12629/13365/10180
+f 7237/13385/10180 12473/12941/10180 12472/12940/10180 7242/13387/10180
+f 7242/13387/10180 12472/12940/10180 13523/12931/10180 12630/13370/10180
+f 7243/13388/10180 7247/13389/10180 7248/13390/10180 7244/13391/10180
+f 7244/13391/10180 7248/13390/10180 12643/13392/10180 12644/13393/10180
+f 7247/13389/10180 12635/13381/10180 12634/13380/10180 7248/13390/10180
+f 7248/13390/10180 12634/13380/10180 13552/13383/10180 12643/13392/10180
+f 7243/13388/10180 7244/13391/10180 7249/13394/10180 7245/13395/10180
+f 7245/13395/10180 7249/13394/10180 12640/13396/10180 12641/13397/10180
+f 7244/13391/10180 12644/13393/10180 12645/13398/10180 7249/13394/10180
+f 7249/13394/10180 12645/13398/10180 13553/13399/10180 12640/13396/10180
+f 7243/13388/10180 7245/13395/10180 7250/13400/10180 7246/13401/10180
+f 7246/13401/10180 7250/13400/10180 12480/12962/10180 12479/12957/10180
+f 7245/13395/10180 12641/13397/10180 12642/13402/10180 7250/13400/10180
+f 7250/13400/10180 12642/13402/10180 13525/12963/10180 12480/12962/10180
+f 7243/13388/10180 7246/13401/10180 7251/13403/10180 7247/13389/10180
+f 7247/13389/10180 7251/13403/10180 12636/13386/10180 12635/13381/10180
+f 7246/13401/10180 12479/12957/10180 12478/12956/10180 7251/13403/10180
+f 7251/13403/10180 12478/12956/10180 13524/12947/10180 12636/13386/10180
+f 7252/13404/10180 7256/13405/10180 7257/13406/10180 7253/13407/10180
+f 7253/13407/10180 7257/13406/10180 12649/13408/10180 12650/13409/10180
+f 7256/13405/10180 12641/13397/10180 12640/13396/10180 7257/13406/10180
+f 7257/13406/10180 12640/13396/10180 13553/13399/10180 12649/13408/10180
+f 7252/13404/10180 7253/13407/10180 7258/13410/10180 7254/13411/10180
+f 7254/13411/10180 7258/13410/10180 12646/13412/10180 12647/13413/10180
+f 7253/13407/10180 12650/13409/10180 12651/13414/10180 7258/13410/10180
+f 7258/13410/10180 12651/13414/10180 13554/13415/10180 12646/13412/10180
+f 7252/13404/10180 7254/13411/10180 7259/13416/10180 7255/13417/10180
+f 7255/13417/10180 7259/13416/10180 12486/12978/10180 12485/12973/10180
+f 7254/13411/10180 12647/13413/10180 12648/13418/10180 7259/13416/10180
+f 7259/13416/10180 12648/13418/10180 13526/12979/10180 12486/12978/10180
+f 7252/13404/10180 7255/13417/10180 7260/13419/10180 7256/13405/10180
+f 7256/13405/10180 7260/13419/10180 12642/13402/10180 12641/13397/10180
+f 7255/13417/10180 12485/12973/10180 12484/12972/10180 7260/13419/10180
+f 7260/13419/10180 12484/12972/10180 13525/12963/10180 12642/13402/10180
+f 7261/13420/10180 7265/13421/10180 7266/13422/10180 7262/13423/10180
+f 7262/13423/10180 7266/13422/10180 12655/13424/10180 12656/13425/10180
+f 7265/13421/10180 12647/13413/10180 12646/13412/10180 7266/13422/10180
+f 7266/13422/10180 12646/13412/10180 13554/13415/10180 12655/13424/10180
+f 7261/13420/10180 7262/13423/10180 7267/13426/10180 7263/13427/10180
+f 7263/13427/10180 7267/13426/10180 12652/13428/10180 12653/13429/10180
+f 7262/13423/10180 12656/13425/10180 12657/13430/10180 7267/13426/10180
+f 7267/13426/10180 12657/13430/10180 13555/13431/10180 12652/13428/10180
+f 7261/13420/10180 7263/13427/10180 7268/13432/10180 7264/13433/10180
+f 7264/13433/10180 7268/13432/10180 12492/12994/10180 12491/12989/10180
+f 7263/13427/10180 12653/13429/10180 12654/13434/10180 7268/13432/10180
+f 7268/13432/10180 12654/13434/10180 13527/12995/10180 12492/12994/10180
+f 7261/13420/10180 7264/13433/10180 7269/13435/10180 7265/13421/10180
+f 7265/13421/10180 7269/13435/10180 12648/13418/10180 12647/13413/10180
+f 7264/13433/10180 12491/12989/10180 12490/12988/10180 7269/13435/10180
+f 7269/13435/10180 12490/12988/10180 13526/12979/10180 12648/13418/10180
+f 7270/13436/10180 7274/13437/10180 7275/13438/10180 7271/13439/10180
+f 7271/13439/10180 7275/13438/10180 12661/13440/10180 12662/13441/10180
+f 7274/13437/10180 12653/13429/10180 12652/13428/10180 7275/13438/10180
+f 7275/13438/10180 12652/13428/10180 13555/13431/10180 12661/13440/10180
+f 7270/13436/10180 7271/13439/10180 7276/13442/10180 7272/13443/10180
+f 7272/13443/10180 7276/13442/10180 12658/13444/10180 12659/13445/10180
+f 7271/13439/10180 12662/13441/10180 12663/13446/10180 7276/13442/10180
+f 7276/13442/10180 12663/13446/10180 13556/13447/10180 12658/13444/10180
+f 7270/13436/10180 7272/13443/10180 7277/13448/10180 7273/13449/10180
+f 7273/13449/10180 7277/13448/10180 12498/13010/10180 12497/13005/10180
+f 7272/13443/10180 12659/13445/10180 12660/13450/10180 7277/13448/10180
+f 7277/13448/10180 12660/13450/10180 13528/13011/10180 12498/13010/10180
+f 7270/13436/10180 7273/13449/10180 7278/13451/10180 7274/13437/10180
+f 7274/13437/10180 7278/13451/10180 12654/13434/10180 12653/13429/10180
+f 7273/13449/10180 12497/13005/10180 12496/13004/10180 7278/13451/10180
+f 7278/13451/10180 12496/13004/10180 13527/12995/10180 12654/13434/10180
+f 7279/13452/10180 7283/13453/10180 7284/13454/10180 7280/13455/10180
+f 7280/13455/10180 7284/13454/10180 12667/13456/10180 12668/13457/10180
+f 7283/13453/10180 12659/13445/10180 12658/13444/10180 7284/13454/10180
+f 7284/13454/10180 12658/13444/10180 13556/13447/10180 12667/13456/10180
+f 7279/13452/10180 7280/13455/10180 7285/13458/10180 7281/13459/10180
+f 7281/13459/10180 7285/13458/10180 12664/13460/10180 12665/13461/10180
+f 7280/13455/10180 12668/13457/10180 12669/13462/10180 7285/13458/10180
+f 7285/13458/10180 12669/13462/10180 13557/13463/10180 12664/13460/10180
+f 7279/13452/10180 7281/13459/10180 7286/13464/10180 7282/13465/10180
+f 7282/13465/10180 7286/13464/10180 12504/13026/10180 12503/13021/10180
+f 7281/13459/10180 12665/13461/10180 12666/13466/10180 7286/13464/10180
+f 7286/13464/10180 12666/13466/10180 13529/13027/10180 12504/13026/10180
+f 7279/13452/10180 7282/13465/10180 7287/13467/10180 7283/13453/10180
+f 7283/13453/10180 7287/13467/10180 12660/13450/10180 12659/13445/10180
+f 7282/13465/10180 12503/13021/10180 12502/13020/10180 7287/13467/10180
+f 7287/13467/10180 12502/13020/10180 13528/13011/10180 12660/13450/10180
+f 7288/13468/10180 7292/13469/10180 7293/13470/10180 7289/13471/10180
+f 7289/13471/10180 7293/13470/10180 12673/13472/10180 12674/13473/10180
+f 7292/13469/10180 12665/13461/10180 12664/13460/10180 7293/13470/10180
+f 7293/13470/10180 12664/13460/10180 13557/13463/10180 12673/13472/10180
+f 7288/13468/10180 7289/13471/10180 7294/13474/10180 7290/13475/10180
+f 7290/13475/10180 7294/13474/10180 12670/13476/10180 12671/13477/10180
+f 7289/13471/10180 12674/13473/10180 12675/13478/10180 7294/13474/10180
+f 7294/13474/10180 12675/13478/10180 13558/13479/10180 12670/13476/10180
+f 7288/13468/10180 7290/13475/10180 7295/13480/10180 7291/13481/10180
+f 7291/13481/10180 7295/13480/10180 12510/13042/10180 12509/13037/10180
+f 7290/13475/10180 12671/13477/10180 12672/13482/10180 7295/13480/10180
+f 7295/13480/10180 12672/13482/10180 13530/13043/10180 12510/13042/10180
+f 7288/13468/10180 7291/13481/10180 7296/13483/10180 7292/13469/10180
+f 7292/13469/10180 7296/13483/10180 12666/13466/10180 12665/13461/10180
+f 7291/13481/10180 12509/13037/10180 12508/13036/10180 7296/13483/10180
+f 7296/13483/10180 12508/13036/10180 13529/13027/10180 12666/13466/10180
+f 7297/13484/10180 7301/13485/10180 7302/13486/10180 7298/13487/10180
+f 7298/13487/10180 7302/13486/10180 12679/13488/10180 12680/13489/10180
+f 7301/13485/10180 12671/13477/10180 12670/13476/10180 7302/13486/10180
+f 7302/13486/10180 12670/13476/10180 13558/13479/10180 12679/13488/10180
+f 7297/13484/10180 7298/13487/10180 7303/13490/10180 7299/13491/10180
+f 7299/13491/10180 7303/13490/10180 12511/13492/10180 12512/13493/10180
+f 7298/13487/10180 12680/13489/10180 12681/13494/10180 7303/13490/10180
+f 7303/13490/10180 12681/13494/10180 13559/13495/10180 12511/13492/10180
+f 7297/13484/10180 7299/13491/10180 7304/13496/10180 7300/13497/10180
+f 7300/13497/10180 7304/13496/10180 12516/13058/10180 12515/13053/10180
+f 7299/13491/10180 12512/13493/10180 12513/13498/10180 7304/13496/10180
+f 7304/13496/10180 12513/13498/10180 13531/13059/10180 12516/13058/10180
+f 7297/13484/10180 7300/13497/10180 7305/13499/10180 7301/13485/10180
+f 7301/13485/10180 7305/13499/10180 12672/13482/10180 12671/13477/10180
+f 7300/13497/10180 12515/13053/10180 12514/13052/10180 7305/13499/10180
+f 7305/13499/10180 12514/13052/10180 13530/13043/10180 12672/13482/10180
+f 7306/13500/10180 7310/13501/10180 7311/13502/10180 7307/13503/10180
+f 7307/13503/10180 7311/13502/10180 12522/13078/10180 12521/13075/10180
+f 7310/13501/10180 12518/13504/10180 12519/13505/10180 7311/13502/10180
+f 7311/13502/10180 12519/13505/10180 13532/13079/10180 12522/13078/10180
+f 7306/13500/10180 7307/13503/10180 7312/13506/10180 7308/13507/10180
+f 7308/13507/10180 7312/13506/10180 12513/13498/10180 12512/13493/10180
+f 7307/13503/10180 12521/13075/10180 12520/13074/10180 7312/13506/10180
+f 7312/13506/10180 12520/13074/10180 13531/13059/10180 12513/13498/10180
+f 7306/13500/10180 7308/13507/10180 7313/13508/10180 7309/13509/10180
+f 7309/13509/10180 7313/13508/10180 12685/13510/10180 12686/13511/10180
+f 7308/13507/10180 12512/13493/10180 12511/13492/10180 7313/13508/10180
+f 7313/13508/10180 12511/13492/10180 13559/13495/10180 12685/13510/10180
+f 7306/13500/10180 7309/13509/10180 7314/13512/10180 7310/13501/10180
+f 7310/13501/10180 7314/13512/10180 12517/13513/10180 12518/13504/10180
+f 7309/13509/10180 12686/13511/10180 12687/13514/10180 7314/13512/10180
+f 7314/13512/10180 12687/13514/10180 13560/13515/10180 12517/13513/10180
+f 7315/13516/10180 7319/13517/10180 7320/13518/10180 7316/13519/10180
+f 7316/13519/10180 7320/13518/10180 12031/13520/10180 12032/13521/10180
+f 7319/13517/10180 12035/12221/10180 12034/12220/10180 7320/13518/10180
+f 7320/13518/10180 12034/12220/10180 13450/12223/10180 12031/13520/10180
+f 7315/13516/10180 7316/13519/10180 7321/13522/10180 7317/13523/10180
+f 7317/13523/10180 7321/13522/10180 12531/13087/10180 12530/13086/10180
+f 7316/13519/10180 12032/13521/10180 12033/13524/10180 7321/13522/10180
+f 7321/13522/10180 12033/13524/10180 13534/13088/10180 12531/13087/10180
+f 7315/13516/10180 7317/13523/10180 7322/13525/10180 7318/13526/10180
+f 7318/13526/10180 7322/13525/10180 12028/13527/10180 12029/13528/10180
+f 7317/13523/10180 12530/13086/10180 12529/13097/10180 7322/13525/10180
+f 7322/13525/10180 12529/13097/10180 13533/13099/10180 12028/13527/10180
+f 7315/13516/10180 7318/13526/10180 7323/13529/10180 7319/13517/10180
+f 7319/13517/10180 7323/13529/10180 12036/12228/10180 12035/12221/10180
+f 7318/13526/10180 12029/13528/10180 12030/13530/10180 7323/13529/10180
+f 7323/13529/10180 12030/13530/10180 13449/12229/10180 12036/12228/10180
+f 7324/13531/10180 7328/13532/10180 7329/13533/10180 7325/13534/10180
+f 7325/13534/10180 7329/13533/10180 12037/13535/10180 12038/13536/10180
+f 7328/13532/10180 12041/12241/10180 12040/12240/10180 7329/13533/10180
+f 7329/13533/10180 12040/12240/10180 13451/12243/10180 12037/13535/10180
+f 7324/13531/10180 7325/13534/10180 7330/13537/10180 7326/13538/10180
+f 7326/13538/10180 7330/13537/10180 12537/13107/10180 12536/13106/10180
+f 7325/13534/10180 12038/13536/10180 12039/13539/10180 7330/13537/10180
+f 7330/13537/10180 12039/13539/10180 13535/13108/10180 12537/13107/10180
+f 7324/13531/10180 7326/13538/10180 7331/13540/10180 7327/13541/10180
+f 7327/13541/10180 7331/13540/10180 12033/13524/10180 12032/13521/10180
+f 7326/13538/10180 12536/13106/10180 12535/13115/10180 7331/13540/10180
+f 7331/13540/10180 12535/13115/10180 13534/13088/10180 12033/13524/10180
+f 7324/13531/10180 7327/13541/10180 7332/13542/10180 7328/13532/10180
+f 7328/13532/10180 7332/13542/10180 12042/12246/10180 12041/12241/10180
+f 7327/13541/10180 12032/13521/10180 12031/13520/10180 7332/13542/10180
+f 7332/13542/10180 12031/13520/10180 13450/12223/10180 12042/12246/10180
+f 7333/13543/10180 7337/13544/10180 7338/13545/10180 7334/13546/10180
+f 7334/13546/10180 7338/13545/10180 12048/12263/10180 12047/12259/10180
+f 7337/13544/10180 12038/13536/10180 12037/13535/10180 7338/13545/10180
+f 7338/13545/10180 12037/13535/10180 13451/12243/10180 12048/12263/10180
+f 7333/13543/10180 7334/13546/10180 7339/13547/10180 7335/13548/10180
+f 7335/13548/10180 7339/13547/10180 12043/13549/10180 12044/13550/10180
+f 7334/13546/10180 12047/12259/10180 12046/12258/10180 7339/13547/10180
+f 7339/13547/10180 12046/12258/10180 13452/12261/10180 12043/13549/10180
+f 7333/13543/10180 7335/13548/10180 7340/13551/10180 7336/13552/10180
+f 7336/13552/10180 7340/13551/10180 12543/13126/10180 12542/13121/10180
+f 7335/13548/10180 12044/13550/10180 12045/13553/10180 7340/13551/10180
+f 7340/13551/10180 12045/13553/10180 13536/13127/10180 12543/13126/10180
+f 7333/13543/10180 7336/13552/10180 7341/13554/10180 7337/13544/10180
+f 7337/13544/10180 7341/13554/10180 12039/13539/10180 12038/13536/10180
+f 7336/13552/10180 12542/13121/10180 12541/13120/10180 7341/13554/10180
+f 7341/13554/10180 12541/13120/10180 13535/13108/10180 12039/13539/10180
+f 7342/13555/10180 7346/13556/10180 7347/13557/10180 7343/13558/10180
+f 7343/13558/10180 7347/13557/10180 12054/12279/10180 12053/12275/10180
+f 7346/13556/10180 12044/13550/10180 12043/13549/10180 7347/13557/10180
+f 7347/13557/10180 12043/13549/10180 13452/12261/10180 12054/12279/10180
+f 7342/13555/10180 7343/13558/10180 7348/13559/10180 7344/13560/10180
+f 7344/13560/10180 7348/13559/10180 12049/13561/10180 12050/13562/10180
+f 7343/13558/10180 12053/12275/10180 12052/12274/10180 7348/13559/10180
+f 7348/13559/10180 12052/12274/10180 13453/12277/10180 12049/13561/10180
+f 7342/13555/10180 7344/13560/10180 7349/13563/10180 7345/13564/10180
+f 7345/13564/10180 7349/13563/10180 12549/13142/10180 12548/13137/10180
+f 7344/13560/10180 12050/13562/10180 12051/13565/10180 7349/13563/10180
+f 7349/13563/10180 12051/13565/10180 13537/13143/10180 12549/13142/10180
+f 7342/13555/10180 7345/13564/10180 7350/13566/10180 7346/13556/10180
+f 7346/13556/10180 7350/13566/10180 12045/13553/10180 12044/13550/10180
+f 7345/13564/10180 12548/13137/10180 12547/13136/10180 7350/13566/10180
+f 7350/13566/10180 12547/13136/10180 13536/13127/10180 12045/13553/10180
+f 7351/13567/10180 7355/13568/10180 7356/13569/10180 7352/13570/10180
+f 7352/13570/10180 7356/13569/10180 12060/12295/10180 12059/12291/10180
+f 7355/13568/10180 12050/13562/10180 12049/13561/10180 7356/13569/10180
+f 7356/13569/10180 12049/13561/10180 13453/12277/10180 12060/12295/10180
+f 7351/13567/10180 7352/13570/10180 7357/13571/10180 7353/13572/10180
+f 7353/13572/10180 7357/13571/10180 12055/13573/10180 12056/13574/10180
+f 7352/13570/10180 12059/12291/10180 12058/12290/10180 7357/13571/10180
+f 7357/13571/10180 12058/12290/10180 13454/12293/10180 12055/13573/10180
+f 7351/13567/10180 7353/13572/10180 7358/13575/10180 7354/13576/10180
+f 7354/13576/10180 7358/13575/10180 12555/13158/10180 12554/13153/10180
+f 7353/13572/10180 12056/13574/10180 12057/13577/10180 7358/13575/10180
+f 7358/13575/10180 12057/13577/10180 13538/13159/10180 12555/13158/10180
+f 7351/13567/10180 7354/13576/10180 7359/13578/10180 7355/13568/10180
+f 7355/13568/10180 7359/13578/10180 12051/13565/10180 12050/13562/10180
+f 7354/13576/10180 12554/13153/10180 12553/13152/10180 7359/13578/10180
+f 7359/13578/10180 12553/13152/10180 13537/13143/10180 12051/13565/10180
+f 7360/13579/10180 7364/13580/10180 7365/13581/10180 7361/13582/10180
+f 7361/13582/10180 7365/13581/10180 12066/12311/10180 12065/12307/10180
+f 7364/13580/10180 12056/13574/10180 12055/13573/10180 7365/13581/10180
+f 7365/13581/10180 12055/13573/10180 13454/12293/10180 12066/12311/10180
+f 7360/13579/10180 7361/13582/10180 7366/13583/10180 7362/13584/10180
+f 7362/13584/10180 7366/13583/10180 12061/13585/10180 12062/13586/10180
+f 7361/13582/10180 12065/12307/10180 12064/12306/10180 7366/13583/10180
+f 7366/13583/10180 12064/12306/10180 13455/12309/10180 12061/13585/10180
+f 7360/13579/10180 7362/13584/10180 7367/13587/10180 7363/13588/10180
+f 7363/13588/10180 7367/13587/10180 12561/13174/10180 12560/13169/10180
+f 7362/13584/10180 12062/13586/10180 12063/13589/10180 7367/13587/10180
+f 7367/13587/10180 12063/13589/10180 13539/13175/10180 12561/13174/10180
+f 7360/13579/10180 7363/13588/10180 7368/13590/10180 7364/13580/10180
+f 7364/13580/10180 7368/13590/10180 12057/13577/10180 12056/13574/10180
+f 7363/13588/10180 12560/13169/10180 12559/13168/10180 7368/13590/10180
+f 7368/13590/10180 12559/13168/10180 13538/13159/10180 12057/13577/10180
+f 7369/13591/10180 7373/13592/10180 7374/13593/10180 7370/13594/10180
+f 7370/13594/10180 7374/13593/10180 12072/12327/10180 12071/12323/10180
+f 7373/13592/10180 12062/13586/10180 12061/13585/10180 7374/13593/10180
+f 7374/13593/10180 12061/13585/10180 13455/12309/10180 12072/12327/10180
+f 7369/13591/10180 7370/13594/10180 7375/13595/10180 7371/13596/10180
+f 7371/13596/10180 7375/13595/10180 12067/13597/10180 12068/13598/10180
+f 7370/13594/10180 12071/12323/10180 12070/12322/10180 7375/13595/10180
+f 7375/13595/10180 12070/12322/10180 13456/12325/10180 12067/13597/10180
+f 7369/13591/10180 7371/13596/10180 7376/13599/10180 7372/13600/10180
+f 7372/13600/10180 7376/13599/10180 12567/13190/10180 12566/13185/10180
+f 7371/13596/10180 12068/13598/10180 12069/13601/10180 7376/13599/10180
+f 7376/13599/10180 12069/13601/10180 13540/13191/10180 12567/13190/10180
+f 7369/13591/10180 7372/13600/10180 7377/13602/10180 7373/13592/10180
+f 7373/13592/10180 7377/13602/10180 12063/13589/10180 12062/13586/10180
+f 7372/13600/10180 12566/13185/10180 12565/13184/10180 7377/13602/10180
+f 7377/13602/10180 12565/13184/10180 13539/13175/10180 12063/13589/10180
+f 7378/13603/10180 7382/13604/10180 7383/13605/10180 7379/13606/10180
+f 7379/13606/10180 7383/13605/10180 12078/12343/10180 12077/12339/10180
+f 7382/13604/10180 12068/13598/10180 12067/13597/10180 7383/13605/10180
+f 7383/13605/10180 12067/13597/10180 13456/12325/10180 12078/12343/10180
+f 7378/13603/10180 7379/13606/10180 7384/13607/10180 7380/13608/10180
+f 7380/13608/10180 7384/13607/10180 12073/13609/10180 12074/13610/10180
+f 7379/13606/10180 12077/12339/10180 12076/12338/10180 7384/13607/10180
+f 7384/13607/10180 12076/12338/10180 13457/12341/10180 12073/13609/10180
+f 7378/13603/10180 7380/13608/10180 7385/13611/10180 7381/13612/10180
+f 7381/13612/10180 7385/13611/10180 12573/13206/10180 12572/13201/10180
+f 7380/13608/10180 12074/13610/10180 12075/13613/10180 7385/13611/10180
+f 7385/13611/10180 12075/13613/10180 13541/13207/10180 12573/13206/10180
+f 7378/13603/10180 7381/13612/10180 7386/13614/10180 7382/13604/10180
+f 7382/13604/10180 7386/13614/10180 12069/13601/10180 12068/13598/10180
+f 7381/13612/10180 12572/13201/10180 12571/13200/10180 7386/13614/10180
+f 7386/13614/10180 12571/13200/10180 13540/13191/10180 12069/13601/10180
+f 7387/13615/10180 7391/13616/10180 7392/13617/10180 7388/13618/10180
+f 7388/13618/10180 7392/13617/10180 12084/12359/10180 12083/12355/10180
+f 7391/13616/10180 12074/13610/10180 12073/13609/10180 7392/13617/10180
+f 7392/13617/10180 12073/13609/10180 13457/12341/10180 12084/12359/10180
+f 7387/13615/10180 7388/13618/10180 7393/13619/10180 7389/13620/10180
+f 7389/13620/10180 7393/13619/10180 12079/13621/10180 12080/13622/10180
+f 7388/13618/10180 12083/12355/10180 12082/12354/10180 7393/13619/10180
+f 7393/13619/10180 12082/12354/10180 13458/12357/10180 12079/13621/10180
+f 7387/13615/10180 7389/13620/10180 7394/13623/10180 7390/13624/10180
+f 7390/13624/10180 7394/13623/10180 12579/13222/10180 12578/13217/10180
+f 7389/13620/10180 12080/13622/10180 12081/13625/10180 7394/13623/10180
+f 7394/13623/10180 12081/13625/10180 13542/13223/10180 12579/13222/10180
+f 7387/13615/10180 7390/13624/10180 7395/13626/10180 7391/13616/10180
+f 7391/13616/10180 7395/13626/10180 12075/13613/10180 12074/13610/10180
+f 7390/13624/10180 12578/13217/10180 12577/13216/10180 7395/13626/10180
+f 7395/13626/10180 12577/13216/10180 13541/13207/10180 12075/13613/10180
+f 7396/13627/10180 7400/13628/10180 7401/13629/10180 7397/13630/10180
+f 7397/13630/10180 7401/13629/10180 12090/12375/10180 12089/12371/10180
+f 7400/13628/10180 12080/13622/10180 12079/13621/10180 7401/13629/10180
+f 7401/13629/10180 12079/13621/10180 13458/12357/10180 12090/12375/10180
+f 7396/13627/10180 7397/13630/10180 7402/13631/10180 7398/13632/10180
+f 7398/13632/10180 7402/13631/10180 12085/13633/10180 12086/13634/10180
+f 7397/13630/10180 12089/12371/10180 12088/12370/10180 7402/13631/10180
+f 7402/13631/10180 12088/12370/10180 13459/12373/10180 12085/13633/10180
+f 7396/13627/10180 7398/13632/10180 7403/13635/10180 7399/13636/10180
+f 7399/13636/10180 7403/13635/10180 12585/13238/10180 12584/13233/10180
+f 7398/13632/10180 12086/13634/10180 12087/13637/10180 7403/13635/10180
+f 7403/13635/10180 12087/13637/10180 13543/13239/10180 12585/13238/10180
+f 7396/13627/10180 7399/13636/10180 7404/13638/10180 7400/13628/10180
+f 7400/13628/10180 7404/13638/10180 12081/13625/10180 12080/13622/10180
+f 7399/13636/10180 12584/13233/10180 12583/13232/10180 7404/13638/10180
+f 7404/13638/10180 12583/13232/10180 13542/13223/10180 12081/13625/10180
+f 7405/13639/10180 7409/13640/10180 7410/13641/10180 7406/13642/10180
+f 7406/13642/10180 7410/13641/10180 12096/12391/10180 12095/12387/10180
+f 7409/13640/10180 12086/13634/10180 12085/13633/10180 7410/13641/10180
+f 7410/13641/10180 12085/13633/10180 13459/12373/10180 12096/12391/10180
+f 7405/13639/10180 7406/13642/10180 7411/13643/10180 7407/13644/10180
+f 7407/13644/10180 7411/13643/10180 12091/13645/10180 12092/13646/10180
+f 7406/13642/10180 12095/12387/10180 12094/12386/10180 7411/13643/10180
+f 7411/13643/10180 12094/12386/10180 13460/12389/10180 12091/13645/10180
+f 7405/13639/10180 7407/13644/10180 7412/13647/10180 7408/13648/10180
+f 7408/13648/10180 7412/13647/10180 12591/13254/10180 12590/13249/10180
+f 7407/13644/10180 12092/13646/10180 12093/13649/10180 7412/13647/10180
+f 7412/13647/10180 12093/13649/10180 13544/13255/10180 12591/13254/10180
+f 7405/13639/10180 7408/13648/10180 7413/13650/10180 7409/13640/10180
+f 7409/13640/10180 7413/13650/10180 12087/13637/10180 12086/13634/10180
+f 7408/13648/10180 12590/13249/10180 12589/13248/10180 7413/13650/10180
+f 7413/13650/10180 12589/13248/10180 13543/13239/10180 12087/13637/10180
+f 7414/13651/10180 7418/13652/10180 7419/13653/10180 7415/13654/10180
+f 7415/13654/10180 7419/13653/10180 12102/12407/10180 12101/12403/10180
+f 7418/13652/10180 12092/13646/10180 12091/13645/10180 7419/13653/10180
+f 7419/13653/10180 12091/13645/10180 13460/12389/10180 12102/12407/10180
+f 7414/13651/10180 7415/13654/10180 7420/13655/10180 7416/13656/10180
+f 7416/13656/10180 7420/13655/10180 12097/13657/10180 12098/13658/10180
+f 7415/13654/10180 12101/12403/10180 12100/12402/10180 7420/13655/10180
+f 7420/13655/10180 12100/12402/10180 13461/12405/10180 12097/13657/10180
+f 7414/13651/10180 7416/13656/10180 7421/13659/10180 7417/13660/10180
+f 7417/13660/10180 7421/13659/10180 12597/13270/10180 12596/13265/10180
+f 7416/13656/10180 12098/13658/10180 12099/13661/10180 7421/13659/10180
+f 7421/13659/10180 12099/13661/10180 13545/13271/10180 12597/13270/10180
+f 7414/13651/10180 7417/13660/10180 7422/13662/10180 7418/13652/10180
+f 7418/13652/10180 7422/13662/10180 12093/13649/10180 12092/13646/10180
+f 7417/13660/10180 12596/13265/10180 12595/13264/10180 7422/13662/10180
+f 7422/13662/10180 12595/13264/10180 13544/13255/10180 12093/13649/10180
+f 7423/13663/10180 7427/13664/10180 7428/13665/10180 7424/13666/10180
+f 7424/13666/10180 7428/13665/10180 12108/12423/10180 12107/12419/10180
+f 7427/13664/10180 12098/13658/10180 12097/13657/10180 7428/13665/10180
+f 7428/13665/10180 12097/13657/10180 13461/12405/10180 12108/12423/10180
+f 7423/13663/10180 7424/13666/10180 7429/13667/10180 7425/13668/10180
+f 7425/13668/10180 7429/13667/10180 12103/13669/10180 12104/13670/10180
+f 7424/13666/10180 12107/12419/10180 12106/12418/10180 7429/13667/10180
+f 7429/13667/10180 12106/12418/10180 13462/12421/10180 12103/13669/10180
+f 7423/13663/10180 7425/13668/10180 7430/13671/10180 7426/13672/10180
+f 7426/13672/10180 7430/13671/10180 12603/13286/10180 12602/13281/10180
+f 7425/13668/10180 12104/13670/10180 12105/13673/10180 7430/13671/10180
+f 7430/13671/10180 12105/13673/10180 13546/13287/10180 12603/13286/10180
+f 7423/13663/10180 7426/13672/10180 7431/13674/10180 7427/13664/10180
+f 7427/13664/10180 7431/13674/10180 12099/13661/10180 12098/13658/10180
+f 7426/13672/10180 12602/13281/10180 12601/13280/10180 7431/13674/10180
+f 7431/13674/10180 12601/13280/10180 13545/13271/10180 12099/13661/10180
+f 7432/13675/10180 7436/13676/10180 7437/13677/10180 7433/13678/10180
+f 7433/13678/10180 7437/13677/10180 12114/12439/10180 12113/12435/10180
+f 7436/13676/10180 12104/13670/10180 12103/13669/10180 7437/13677/10180
+f 7437/13677/10180 12103/13669/10180 13462/12421/10180 12114/12439/10180
+f 7432/13675/10180 7433/13678/10180 7438/13679/10180 7434/13680/10180
+f 7434/13680/10180 7438/13679/10180 12109/13681/10180 12110/13682/10180
+f 7433/13678/10180 12113/12435/10180 12112/12434/10180 7438/13679/10180
+f 7438/13679/10180 12112/12434/10180 13463/12437/10180 12109/13681/10180
+f 7432/13675/10180 7434/13680/10180 7439/13683/10180 7435/13684/10180
+f 7435/13684/10180 7439/13683/10180 12609/13302/10180 12608/13297/10180
+f 7434/13680/10180 12110/13682/10180 12111/13685/10180 7439/13683/10180
+f 7439/13683/10180 12111/13685/10180 13547/13303/10180 12609/13302/10180
+f 7432/13675/10180 7435/13684/10180 7440/13686/10180 7436/13676/10180
+f 7436/13676/10180 7440/13686/10180 12105/13673/10180 12104/13670/10180
+f 7435/13684/10180 12608/13297/10180 12607/13296/10180 7440/13686/10180
+f 7440/13686/10180 12607/13296/10180 13546/13287/10180 12105/13673/10180
+f 7441/13687/10180 7445/13688/10180 7446/13689/10180 7442/13690/10180
+f 7442/13690/10180 7446/13689/10180 12120/12455/10180 12119/12451/10180
+f 7445/13688/10180 12110/13682/10180 12109/13681/10180 7446/13689/10180
+f 7446/13689/10180 12109/13681/10180 13463/12437/10180 12120/12455/10180
+f 7441/13687/10180 7442/13690/10180 7447/13691/10180 7443/13692/10180
+f 7443/13692/10180 7447/13691/10180 12115/13693/10180 12116/13694/10180
+f 7442/13690/10180 12119/12451/10180 12118/12450/10180 7447/13691/10180
+f 7447/13691/10180 12118/12450/10180 13464/12453/10180 12115/13693/10180
+f 7441/13687/10180 7443/13692/10180 7448/13695/10180 7444/13696/10180
+f 7444/13696/10180 7448/13695/10180 12615/13318/10180 12614/13313/10180
+f 7443/13692/10180 12116/13694/10180 12117/13697/10180 7448/13695/10180
+f 7448/13695/10180 12117/13697/10180 13548/13319/10180 12615/13318/10180
+f 7441/13687/10180 7444/13696/10180 7449/13698/10180 7445/13688/10180
+f 7445/13688/10180 7449/13698/10180 12111/13685/10180 12110/13682/10180
+f 7444/13696/10180 12614/13313/10180 12613/13312/10180 7449/13698/10180
+f 7449/13698/10180 12613/13312/10180 13547/13303/10180 12111/13685/10180
+f 7450/13699/10180 7454/13700/10180 7455/13701/10180 7451/13702/10180
+f 7451/13702/10180 7455/13701/10180 12126/12471/10180 12125/12467/10180
+f 7454/13700/10180 12116/13694/10180 12115/13693/10180 7455/13701/10180
+f 7455/13701/10180 12115/13693/10180 13464/12453/10180 12126/12471/10180
+f 7450/13699/10180 7451/13702/10180 7456/13703/10180 7452/13704/10180
+f 7452/13704/10180 7456/13703/10180 12121/13705/10180 12122/13706/10180
+f 7451/13702/10180 12125/12467/10180 12124/12466/10180 7456/13703/10180
+f 7456/13703/10180 12124/12466/10180 13465/12469/10180 12121/13705/10180
+f 7450/13699/10180 7452/13704/10180 7457/13707/10180 7453/13708/10180
+f 7453/13708/10180 7457/13707/10180 12621/13334/10180 12620/13329/10180
+f 7452/13704/10180 12122/13706/10180 12123/13709/10180 7457/13707/10180
+f 7457/13707/10180 12123/13709/10180 13549/13335/10180 12621/13334/10180
+f 7450/13699/10180 7453/13708/10180 7458/13710/10180 7454/13700/10180
+f 7454/13700/10180 7458/13710/10180 12117/13697/10180 12116/13694/10180
+f 7453/13708/10180 12620/13329/10180 12619/13328/10180 7458/13710/10180
+f 7458/13710/10180 12619/13328/10180 13548/13319/10180 12117/13697/10180
+f 7459/13711/10180 7463/13712/10180 7464/13713/10180 7460/13714/10180
+f 7460/13714/10180 7464/13713/10180 12132/12487/10180 12131/12483/10180
+f 7463/13712/10180 12122/13706/10180 12121/13705/10180 7464/13713/10180
+f 7464/13713/10180 12121/13705/10180 13465/12469/10180 12132/12487/10180
+f 7459/13711/10180 7460/13714/10180 7465/13715/10180 7461/13716/10180
+f 7461/13716/10180 7465/13715/10180 12127/13717/10180 12128/13718/10180
+f 7460/13714/10180 12131/12483/10180 12130/12482/10180 7465/13715/10180
+f 7465/13715/10180 12130/12482/10180 13466/12485/10180 12127/13717/10180
+f 7459/13711/10180 7461/13716/10180 7466/13719/10180 7462/13720/10180
+f 7462/13720/10180 7466/13719/10180 12627/13350/10180 12626/13345/10180
+f 7461/13716/10180 12128/13718/10180 12129/13721/10180 7466/13719/10180
+f 7466/13719/10180 12129/13721/10180 13550/13351/10180 12627/13350/10180
+f 7459/13711/10180 7462/13720/10180 7467/13722/10180 7463/13712/10180
+f 7463/13712/10180 7467/13722/10180 12123/13709/10180 12122/13706/10180
+f 7462/13720/10180 12626/13345/10180 12625/13344/10180 7467/13722/10180
+f 7467/13722/10180 12625/13344/10180 13549/13335/10180 12123/13709/10180
+f 7468/13723/10180 7472/13724/10180 7473/13725/10180 7469/13726/10180
+f 7469/13726/10180 7473/13725/10180 12138/12503/10180 12137/12499/10180
+f 7472/13724/10180 12128/13718/10180 12127/13717/10180 7473/13725/10180
+f 7473/13725/10180 12127/13717/10180 13466/12485/10180 12138/12503/10180
+f 7468/13723/10180 7469/13726/10180 7474/13727/10180 7470/13728/10180
+f 7470/13728/10180 7474/13727/10180 12133/13729/10180 12134/13730/10180
+f 7469/13726/10180 12137/12499/10180 12136/12498/10180 7474/13727/10180
+f 7474/13727/10180 12136/12498/10180 13467/12501/10180 12133/13729/10180
+f 7468/13723/10180 7470/13728/10180 7475/13731/10180 7471/13732/10180
+f 7471/13732/10180 7475/13731/10180 12633/13366/10180 12632/13361/10180
+f 7470/13728/10180 12134/13730/10180 12135/13733/10180 7475/13731/10180
+f 7475/13731/10180 12135/13733/10180 13551/13367/10180 12633/13366/10180
+f 7468/13723/10180 7471/13732/10180 7476/13734/10180 7472/13724/10180
+f 7472/13724/10180 7476/13734/10180 12129/13721/10180 12128/13718/10180
+f 7471/13732/10180 12632/13361/10180 12631/13360/10180 7476/13734/10180
+f 7476/13734/10180 12631/13360/10180 13550/13351/10180 12129/13721/10180
+f 7477/13735/10180 7481/13736/10180 7482/13737/10180 7478/13738/10180
+f 7478/13738/10180 7482/13737/10180 12144/12519/10180 12143/12515/10180
+f 7481/13736/10180 12134/13730/10180 12133/13729/10180 7482/13737/10180
+f 7482/13737/10180 12133/13729/10180 13467/12501/10180 12144/12519/10180
+f 7477/13735/10180 7478/13738/10180 7483/13739/10180 7479/13740/10180
+f 7479/13740/10180 7483/13739/10180 12139/13741/10180 12140/13742/10180
+f 7478/13738/10180 12143/12515/10180 12142/12514/10180 7483/13739/10180
+f 7483/13739/10180 12142/12514/10180 13468/12517/10180 12139/13741/10180
+f 7477/13735/10180 7479/13740/10180 7484/13743/10180 7480/13744/10180
+f 7480/13744/10180 7484/13743/10180 12639/13382/10180 12638/13377/10180
+f 7479/13740/10180 12140/13742/10180 12141/13745/10180 7484/13743/10180
+f 7484/13743/10180 12141/13745/10180 13552/13383/10180 12639/13382/10180
+f 7477/13735/10180 7480/13744/10180 7485/13746/10180 7481/13736/10180
+f 7481/13736/10180 7485/13746/10180 12135/13733/10180 12134/13730/10180
+f 7480/13744/10180 12638/13377/10180 12637/13376/10180 7485/13746/10180
+f 7485/13746/10180 12637/13376/10180 13551/13367/10180 12135/13733/10180
+f 7486/13747/10180 7490/13748/10180 7491/13749/10180 7487/13750/10180
+f 7487/13750/10180 7491/13749/10180 12150/12535/10180 12149/12531/10180
+f 7490/13748/10180 12140/13742/10180 12139/13741/10180 7491/13749/10180
+f 7491/13749/10180 12139/13741/10180 13468/12517/10180 12150/12535/10180
+f 7486/13747/10180 7487/13750/10180 7492/13751/10180 7488/13752/10180
+f 7488/13752/10180 7492/13751/10180 12145/13753/10180 12146/13754/10180
+f 7487/13750/10180 12149/12531/10180 12148/12530/10180 7492/13751/10180
+f 7492/13751/10180 12148/12530/10180 13469/12533/10180 12145/13753/10180
+f 7486/13747/10180 7488/13752/10180 7493/13755/10180 7489/13756/10180
+f 7489/13756/10180 7493/13755/10180 12645/13398/10180 12644/13393/10180
+f 7488/13752/10180 12146/13754/10180 12147/13757/10180 7493/13755/10180
+f 7493/13755/10180 12147/13757/10180 13553/13399/10180 12645/13398/10180
+f 7486/13747/10180 7489/13756/10180 7494/13758/10180 7490/13748/10180
+f 7490/13748/10180 7494/13758/10180 12141/13745/10180 12140/13742/10180
+f 7489/13756/10180 12644/13393/10180 12643/13392/10180 7494/13758/10180
+f 7494/13758/10180 12643/13392/10180 13552/13383/10180 12141/13745/10180
+f 7495/13759/10180 7499/13760/10180 7500/13761/10180 7496/13762/10180
+f 7496/13762/10180 7500/13761/10180 12156/12551/10180 12155/12547/10180
+f 7499/13760/10180 12146/13754/10180 12145/13753/10180 7500/13761/10180
+f 7500/13761/10180 12145/13753/10180 13469/12533/10180 12156/12551/10180
+f 7495/13759/10180 7496/13762/10180 7501/13763/10180 7497/13764/10180
+f 7497/13764/10180 7501/13763/10180 12151/13765/10180 12152/13766/10180
+f 7496/13762/10180 12155/12547/10180 12154/12546/10180 7501/13763/10180
+f 7501/13763/10180 12154/12546/10180 13470/12549/10180 12151/13765/10180
+f 7495/13759/10180 7497/13764/10180 7502/13767/10180 7498/13768/10180
+f 7498/13768/10180 7502/13767/10180 12651/13414/10180 12650/13409/10180
+f 7497/13764/10180 12152/13766/10180 12153/13769/10180 7502/13767/10180
+f 7502/13767/10180 12153/13769/10180 13554/13415/10180 12651/13414/10180
+f 7495/13759/10180 7498/13768/10180 7503/13770/10180 7499/13760/10180
+f 7499/13760/10180 7503/13770/10180 12147/13757/10180 12146/13754/10180
+f 7498/13768/10180 12650/13409/10180 12649/13408/10180 7503/13770/10180
+f 7503/13770/10180 12649/13408/10180 13553/13399/10180 12147/13757/10180
+f 7504/13771/10180 7508/13772/10180 7509/13773/10180 7505/13774/10180
+f 7505/13774/10180 7509/13773/10180 12162/12567/10180 12161/12563/10180
+f 7508/13772/10180 12152/13766/10180 12151/13765/10180 7509/13773/10180
+f 7509/13773/10180 12151/13765/10180 13470/12549/10180 12162/12567/10180
+f 7504/13771/10180 7505/13774/10180 7510/13775/10180 7506/13776/10180
+f 7506/13776/10180 7510/13775/10180 12157/13777/10180 12158/13778/10180
+f 7505/13774/10180 12161/12563/10180 12160/12562/10180 7510/13775/10180
+f 7510/13775/10180 12160/12562/10180 13471/12565/10180 12157/13777/10180
+f 7504/13771/10180 7506/13776/10180 7511/13779/10180 7507/13780/10180
+f 7507/13780/10180 7511/13779/10180 12657/13430/10180 12656/13425/10180
+f 7506/13776/10180 12158/13778/10180 12159/13781/10180 7511/13779/10180
+f 7511/13779/10180 12159/13781/10180 13555/13431/10180 12657/13430/10180
+f 7504/13771/10180 7507/13780/10180 7512/13782/10180 7508/13772/10180
+f 7508/13772/10180 7512/13782/10180 12153/13769/10180 12152/13766/10180
+f 7507/13780/10180 12656/13425/10180 12655/13424/10180 7512/13782/10180
+f 7512/13782/10180 12655/13424/10180 13554/13415/10180 12153/13769/10180
+f 7513/13783/10180 7517/13784/10180 7518/13785/10180 7514/13786/10180
+f 7514/13786/10180 7518/13785/10180 12168/12583/10180 12167/12579/10180
+f 7517/13784/10180 12158/13778/10180 12157/13777/10180 7518/13785/10180
+f 7518/13785/10180 12157/13777/10180 13471/12565/10180 12168/12583/10180
+f 7513/13783/10180 7514/13786/10180 7519/13787/10180 7515/13788/10180
+f 7515/13788/10180 7519/13787/10180 12163/13789/10180 12164/13790/10180
+f 7514/13786/10180 12167/12579/10180 12166/12578/10180 7519/13787/10180
+f 7519/13787/10180 12166/12578/10180 13472/12581/10180 12163/13789/10180
+f 7513/13783/10180 7515/13788/10180 7520/13791/10180 7516/13792/10180
+f 7516/13792/10180 7520/13791/10180 12663/13446/10180 12662/13441/10180
+f 7515/13788/10180 12164/13790/10180 12165/13793/10180 7520/13791/10180
+f 7520/13791/10180 12165/13793/10180 13556/13447/10180 12663/13446/10180
+f 7513/13783/10180 7516/13792/10180 7521/13794/10180 7517/13784/10180
+f 7517/13784/10180 7521/13794/10180 12159/13781/10180 12158/13778/10180
+f 7516/13792/10180 12662/13441/10180 12661/13440/10180 7521/13794/10180
+f 7521/13794/10180 12661/13440/10180 13555/13431/10180 12159/13781/10180
+f 7522/13795/10180 7526/13796/10180 7527/13797/10180 7523/13798/10180
+f 7523/13798/10180 7527/13797/10180 12174/12599/10180 12173/12595/10180
+f 7526/13796/10180 12164/13790/10180 12163/13789/10180 7527/13797/10180
+f 7527/13797/10180 12163/13789/10180 13472/12581/10180 12174/12599/10180
+f 7522/13795/10180 7523/13798/10180 7528/13799/10180 7524/13800/10180
+f 7524/13800/10180 7528/13799/10180 12169/13801/10180 12170/13802/10180
+f 7523/13798/10180 12173/12595/10180 12172/12594/10180 7528/13799/10180
+f 7528/13799/10180 12172/12594/10180 13473/12597/10180 12169/13801/10180
+f 7522/13795/10180 7524/13800/10180 7529/13803/10180 7525/13804/10180
+f 7525/13804/10180 7529/13803/10180 12669/13462/10180 12668/13457/10180
+f 7524/13800/10180 12170/13802/10180 12171/13805/10180 7529/13803/10180
+f 7529/13803/10180 12171/13805/10180 13557/13463/10180 12669/13462/10180
+f 7522/13795/10180 7525/13804/10180 7530/13806/10180 7526/13796/10180
+f 7526/13796/10180 7530/13806/10180 12165/13793/10180 12164/13790/10180
+f 7525/13804/10180 12668/13457/10180 12667/13456/10180 7530/13806/10180
+f 7530/13806/10180 12667/13456/10180 13556/13447/10180 12165/13793/10180
+f 7531/13807/10180 7535/13808/10180 7536/13809/10180 7532/13810/10180
+f 7532/13810/10180 7536/13809/10180 12180/12615/10180 12179/12611/10180
+f 7535/13808/10180 12170/13802/10180 12169/13801/10180 7536/13809/10180
+f 7536/13809/10180 12169/13801/10180 13473/12597/10180 12180/12615/10180
+f 7531/13807/10180 7532/13810/10180 7537/13811/10180 7533/13812/10180
+f 7533/13812/10180 7537/13811/10180 12175/13813/10180 12176/13814/10180
+f 7532/13810/10180 12179/12611/10180 12178/12610/10180 7537/13811/10180
+f 7537/13811/10180 12178/12610/10180 13474/12613/10180 12175/13813/10180
+f 7531/13807/10180 7533/13812/10180 7538/13815/10180 7534/13816/10180
+f 7534/13816/10180 7538/13815/10180 12675/13478/10180 12674/13473/10180
+f 7533/13812/10180 12176/13814/10180 12177/13817/10180 7538/13815/10180
+f 7538/13815/10180 12177/13817/10180 13558/13479/10180 12675/13478/10180
+f 7531/13807/10180 7534/13816/10180 7539/13818/10180 7535/13808/10180
+f 7535/13808/10180 7539/13818/10180 12171/13805/10180 12170/13802/10180
+f 7534/13816/10180 12674/13473/10180 12673/13472/10180 7539/13818/10180
+f 7539/13818/10180 12673/13472/10180 13557/13463/10180 12171/13805/10180
+f 7540/13819/10180 7544/13820/10180 7545/13821/10180 7541/13822/10180
+f 7541/13822/10180 7545/13821/10180 12186/12631/10180 12185/12627/10180
+f 7544/13820/10180 12176/13814/10180 12175/13813/10180 7545/13821/10180
+f 7545/13821/10180 12175/13813/10180 13474/12613/10180 12186/12631/10180
+f 7540/13819/10180 7541/13822/10180 7546/13823/10180 7542/13824/10180
+f 7542/13824/10180 7546/13823/10180 12676/13825/10180 12677/13826/10180
+f 7541/13822/10180 12185/12627/10180 12184/12626/10180 7546/13823/10180
+f 7546/13823/10180 12184/12626/10180 13475/12629/10180 12676/13825/10180
+f 7540/13819/10180 7542/13824/10180 7547/13827/10180 7543/13828/10180
+f 7543/13828/10180 7547/13827/10180 12681/13494/10180 12680/13489/10180
+f 7542/13824/10180 12677/13826/10180 12678/13829/10180 7547/13827/10180
+f 7547/13827/10180 12678/13829/10180 13559/13495/10180 12681/13494/10180
+f 7540/13819/10180 7543/13828/10180 7548/13830/10180 7544/13820/10180
+f 7544/13820/10180 7548/13830/10180 12177/13817/10180 12176/13814/10180
+f 7543/13828/10180 12680/13489/10180 12679/13488/10180 7548/13830/10180
+f 7548/13830/10180 12679/13488/10180 13558/13479/10180 12177/13817/10180
+f 7549/13831/10180 7553/13832/10180 7554/13833/10180 7550/13834/10180
+f 7550/13834/10180 7554/13833/10180 12687/13514/10180 12686/13511/10180
+f 7553/13832/10180 12683/13835/10180 12684/13836/10180 7554/13833/10180
+f 7554/13833/10180 12684/13836/10180 13560/13515/10180 12687/13514/10180
+f 7549/13831/10180 7550/13834/10180 7555/13837/10180 7551/13838/10180
+f 7551/13838/10180 7555/13837/10180 12678/13829/10180 12677/13826/10180
+f 7550/13834/10180 12686/13511/10180 12685/13510/10180 7555/13837/10180
+f 7555/13837/10180 12685/13510/10180 13559/13495/10180 12678/13829/10180
+f 7549/13831/10180 7551/13838/10180 7556/13839/10180 7552/13840/10180
+f 7552/13840/10180 7556/13839/10180 12192/12640/10180 12191/12637/10180
+f 7551/13838/10180 12677/13826/10180 12676/13825/10180 7556/13839/10180
+f 7556/13839/10180 12676/13825/10180 13475/12629/10180 12192/12640/10180
+f 7549/13831/10180 7552/13840/10180 7557/13841/10180 7553/13832/10180
+f 7553/13832/10180 7557/13841/10180 12682/13842/10180 12683/13835/10180
+f 7552/13840/10180 12191/12637/10180 12190/12636/10180 7557/13841/10180
+f 7557/13841/10180 12190/12636/10180 13476/11706/10180 12682/13842/10180
+f 7558/13843/10848 7562/13844/10849 7563/13845/10850 7559/13846/10851
+f 7559/13846/10851 7563/13845/10850 12691/13847/10852 12692/13848/10853
+f 7562/13844/10849 7925/13849/1472 7924/13850/1471 7563/13845/10850
+f 7563/13845/10850 7924/13850/1471 12770/13851/1474 12691/13847/10852
+f 7558/13843/10848 7559/13846/10851 7564/13852/10854 7560/13853/10855
+f 7560/13853/10855 7564/13852/10854 12684/13836/10180 12683/13835/10180
+f 7559/13846/10851 12692/13848/10853 12693/13854/10856 7564/13852/10854
+f 7564/13852/10854 12693/13854/10856 13560/13515/10180 12684/13836/10180
+f 7558/13843/10848 7560/13853/10855 7565/13855/10857 7561/13856/10858
+f 7561/13856/10858 7565/13855/10857 12690/11705/10219 12689/11697/10214
+f 7560/13853/10855 12683/13835/10180 12682/13842/10180 7565/13855/10857
+f 7565/13855/10857 12682/13842/10180 13476/11706/10180 12690/11705/10219
+f 7558/13843/10848 7561/13856/10858 7566/13857/10859 7562/13844/10849
+f 7562/13844/10849 7566/13857/10859 7926/13858/1477 7925/13849/1472
+f 7561/13856/10858 12689/11697/10214 12688/11696/10213 7566/13857/10859
+f 7566/13857/10859 12688/11696/10213 12755/11700/1459 7926/13858/1477
+f 7567/13859/10860 7571/13860/10861 7572/13861/10862 7568/13862/10863
+f 7568/13862/10863 7572/13861/10862 12694/13863/10864 12695/13864/10865
+f 7571/13860/10861 9266/13865/1483 9265/13866/1489 7572/13861/10862
+f 7572/13861/10862 9265/13866/1489 13004/13867/1491 12694/13863/10864
+f 7567/13859/10860 7568/13862/10863 7573/13868/10866 7569/13869/10867
+f 7569/13869/10867 7573/13868/10866 12519/13505/10180 12518/13504/10180
+f 7568/13862/10863 12695/13864/10865 12696/13870/10868 7573/13868/10866
+f 7573/13868/10866 12696/13870/10868 13532/13079/10180 12519/13505/10180
+f 7567/13859/10860 7569/13869/10867 7574/13871/10869 7570/13872/10870
+f 7570/13872/10870 7574/13871/10869 12693/13854/10856 12692/13848/10853
+f 7569/13869/10867 12518/13504/10180 12517/13513/10180 7574/13871/10869
+f 7574/13871/10869 12517/13513/10180 13560/13515/10180 12693/13854/10856
+f 7567/13859/10860 7570/13872/10870 7575/13873/10871 7571/13860/10861
+f 7571/13860/10861 7575/13873/10871 9267/13874/1484 9266/13865/1483
+f 7570/13872/10870 12692/13848/10853 12691/13847/10852 7575/13873/10871
+f 7575/13873/10871 12691/13847/10852 12770/13851/1474 9267/13874/1484
+f 7576/13875/10872 7580/13876/10873 7581/13877/10874 7577/13878/10875
+f 7577/13878/10875 7581/13877/10874 12697/13879/10876 12698/13880/10877
+f 7580/13876/10873 8228/13881/4100 8227/13882/4105 7581/13877/10874
+f 7581/13877/10874 8227/13882/4105 12828/13883/1716 12697/13879/10876
+f 7576/13875/10872 7577/13878/10875 7582/13884/10878 7578/13885/10879
+f 7578/13885/10879 7582/13884/10878 12354/13069/10180 12353/13068/10180
+f 7577/13878/10875 12698/13880/10877 12699/13886/10880 7582/13884/10878
+f 7582/13884/10878 12699/13886/10880 13504/12207/10180 12354/13069/10180
+f 7576/13875/10872 7578/13885/10879 7583/13887/10881 7579/13888/10882
+f 7579/13888/10882 7583/13887/10881 12696/13870/10868 12695/13864/10865
+f 7578/13885/10879 12353/13068/10180 12352/13077/10180 7583/13887/10881
+f 7583/13887/10881 12352/13077/10180 13532/13079/10180 12696/13870/10868
+f 7576/13875/10872 7579/13888/10882 7584/13889/10883 7580/13876/10873
+f 7580/13876/10873 7584/13889/10883 8229/13890/4101 8228/13881/4100
+f 7579/13888/10882 12695/13864/10865 12694/13863/10864 7584/13889/10883
+f 7584/13889/10883 12694/13863/10864 13004/13867/1491 8229/13890/4101
+f 7585/13891/10884 7589/13892/10885 7590/13893/10886 7586/13894/10887
+f 7586/13894/10887 7590/13893/10886 12027/12210/10523 12026/12205/10521
+f 7589/13892/10885 8978/13895/1501 8977/13896/1500 7590/13893/10886
+f 7590/13893/10886 8977/13896/1500 12955/12211/1503 12027/12210/10523
+f 7585/13891/10884 7586/13894/10887 7591/13897/10888 7587/13898/10889
+f 7587/13898/10889 7591/13897/10888 12699/13886/10880 12698/13880/10877
+f 7586/13894/10887 12026/12205/10521 12025/12204/10520 7591/13897/10888
+f 7591/13897/10888 12025/12204/10520 13504/12207/10180 12699/13886/10880
+f 7585/13891/10884 7587/13898/10889 7592/13899/10890 7588/13900/10891
+f 7588/13900/10891 7592/13899/10890 7836/13901/1715 7835/13902/1714
+f 7587/13898/10889 12698/13880/10877 12697/13879/10876 7592/13899/10890
+f 7592/13899/10890 12697/13879/10876 12828/13883/1716 7836/13901/1715
+f 7585/13891/10884 7588/13900/10891 7593/13903/10892 7589/13892/10885
+f 7589/13892/10885 7593/13903/10892 8979/13904/1508 8978/13895/1501
+f 7588/13900/10891 7835/13902/1714 7834/13905/1726 7593/13903/10892
+f 7593/13903/10892 7834/13905/1726 12754/13906/1509 8979/13904/1508
+f 7594/13907/10893 7598/13908/10894 7599/13909/10895 7595/13910/10896
+f 7595/13910/10896 7599/13909/10895 12709/13911/10897 12710/13912/10898
+f 7598/13908/10894 10058/13913/6507 10057/13914/6506 7599/13909/10895
+f 7599/13909/10895 10057/13914/6506 13123/13915/6496 12709/13911/10897
+f 7594/13907/10893 7595/13910/10896 7600/13916/10899 7596/13917/10900
+f 7596/13917/10900 7600/13916/10899 12030/13530/10180 12029/13528/10180
+f 7595/13910/10896 12710/13912/10898 12711/13918/10901 7600/13916/10899
+f 7600/13916/10899 12711/13918/10901 13449/12229/10180 12030/13530/10180
+f 7594/13907/10893 7596/13917/10900 7601/13919/10902 7597/13920/10903
+f 7597/13920/10903 7601/13919/10902 12700/13921/10904 12701/13922/10905
+f 7596/13917/10900 12029/13528/10180 12028/13527/10180 7601/13919/10902
+f 7601/13919/10902 12028/13527/10180 13533/13099/10180 12700/13921/10904
+f 7594/13907/10893 7597/13920/10903 7602/13923/10906 7598/13908/10894
+f 7598/13908/10894 7602/13923/10906 10059/13924/6510 10058/13913/6507
+f 7597/13920/10903 12701/13922/10905 12702/13925/10907 7602/13923/10906
+f 7602/13923/10906 12702/13925/10907 13138/13926/6511 10059/13924/6510
+f 7603/13927/10908 7607/13928/10909 7608/13929/10910 7604/13930/10911
+f 7604/13930/10911 7608/13929/10910 12702/13925/10907 12701/13922/10905
+f 7607/13928/10909 11444/13931/6517 11443/13932/6516 7608/13929/10910
+f 7608/13929/10910 11443/13932/6516 13138/13926/6511 12702/13925/10907
+f 7603/13927/10908 7604/13930/10911 7609/13933/10912 7605/13934/10913
+f 7605/13934/10913 7609/13933/10912 12525/13098/10180 12524/13095/10180
+f 7604/13930/10911 12701/13922/10905 12700/13921/10904 7609/13933/10912
+f 7609/13933/10912 12700/13921/10904 13533/13099/10180 12525/13098/10180
+f 7603/13927/10908 7605/13934/10913 7610/13935/10914 7606/13936/10915
+f 7606/13936/10915 7610/13935/10914 12703/13937/10916 12704/13938/10917
+f 7605/13934/10913 12524/13095/10180 12523/13094/10180 7610/13935/10914
+f 7610/13935/10914 12523/13094/10180 13505/12663/10180 12703/13937/10916
+f 7603/13927/10908 7606/13936/10915 7611/13939/10918 7607/13928/10909
+f 7607/13928/10909 7611/13939/10918 11445/13940/6522 11444/13931/6517
+f 7606/13936/10915 12704/13938/10917 12705/13941/10919 7611/13939/10918
+f 7611/13939/10918 12705/13941/10919 13373/13942/6523 11445/13940/6522
+f 7612/13943/10920 7616/13944/10921 7617/13945/10922 7613/13946/10923
+f 7613/13946/10923 7617/13945/10922 12705/13941/10919 12704/13938/10917
+f 7616/13944/10921 10373/13947/9240 10372/13948/9239 7617/13945/10922
+f 7617/13945/10922 10372/13948/9239 13373/13942/6523 12705/13941/10919
+f 7612/13943/10920 7613/13946/10923 7618/13949/10924 7614/13950/10925
+f 7614/13950/10925 7618/13949/10924 12360/12662/10180 12359/12659/10180
+f 7613/13946/10923 12704/13938/10917 12703/13937/10916 7618/13949/10924
+f 7618/13949/10924 12703/13937/10916 13505/12663/10180 12360/12662/10180
+f 7612/13943/10920 7614/13950/10925 7619/13951/10926 7615/13952/10927
+f 7615/13952/10927 7619/13951/10926 12708/11640/10179 12707/11632/10174
+f 7614/13950/10925 12359/12659/10180 12358/12658/10180 7619/13951/10926
+f 7619/13951/10926 12358/12658/10180 13477/11641/10180 12708/11640/10179
+f 7612/13943/10920 7615/13952/10927 7620/13953/10928 7616/13944/10921
+f 7616/13944/10921 7620/13953/10928 10374/13954/9243 10373/13947/9240
+f 7615/13952/10927 12707/11632/10174 12706/11631/10173 7620/13953/10928
+f 7620/13953/10928 12706/11631/10173 13196/11635/6740 10374/13954/9243
+f 7621/13955/10929 7625/13956/10930 7626/13957/10931 7622/13958/10932
+f 7622/13958/10932 7626/13957/10931 11949/12231/10538 11948/12227/10536
+f 7625/13956/10930 11243/7262/6466 11242/7261/6465 7626/13957/10931
+f 7626/13957/10931 11242/7261/6465 13340/7265/6469 11949/12231/10538
+f 7621/13955/10929 7622/13958/10932 7627/13959/10933 7623/13960/10934
+f 7623/13960/10934 7627/13959/10933 12711/13918/10901 12710/13912/10898
+f 7622/13958/10932 11948/12227/10536 11947/12226/10535 7627/13959/10933
+f 7627/13959/10933 11947/12226/10535 13449/12229/10180 12711/13918/10901
+f 7621/13955/10929 7623/13960/10934 7628/13961/10935 7624/13962/10936
+f 7624/13962/10936 7628/13961/10935 9969/13963/6495 9968/13964/6492
+f 7623/13960/10934 12710/13912/10898 12709/13911/10897 7628/13961/10935
+f 7628/13961/10935 12709/13911/10897 13123/13915/6496 9969/13963/6495
+f 7621/13955/10929 7624/13962/10936 7629/13965/10937 7625/13956/10930
+f 7625/13956/10930 7629/13965/10937 11244/7270/6474 11243/7262/6466
+f 7624/13962/10936 9968/13964/6492 9967/13966/6491 7629/13965/10937
+f 7629/13965/10937 9967/13966/6491 13093/7271/6475 11244/7270/6474
+f 13561/13967/10938 13565/13968/10939 13566/13969/10940 13562/13970/10941
+f 13562/13970/10941 13566/13969/10940 25003/13971/10942 25004/13972/10943
+f 13565/13968/10939 23780/13973/10944 23781/13974/10945 13566/13969/10940
+f 13566/13969/10940 23781/13974/10945 30573/13975/10946 25003/13971/10942
+f 13561/13967/10938 13562/13970/10941 13567/13976/10947 13563/13977/10948
+f 13563/13977/10948 13567/13976/10947 23851/13978/10949 23852/13979/10950
+f 13562/13970/10941 25004/13972/10943 25005/13980/10951 13567/13976/10947
+f 13567/13976/10947 25005/13980/10951 30597/13981/10952 23851/13978/10949
+f 13561/13967/10938 13563/13977/10948 13568/13982/10953 13564/13983/10954
+f 13564/13983/10954 13568/13982/10953 25006/13984/10955 25007/13985/10956
+f 13563/13977/10948 23852/13979/10950 23853/13986/10957 13568/13982/10953
+f 13568/13982/10953 23853/13986/10957 30598/13987/10958 25006/13984/10955
+f 13561/13967/10938 13564/13983/10954 13569/13988/10959 13565/13968/10939
+f 13565/13968/10939 13569/13988/10959 23779/13989/10960 23780/13973/10944
+f 13564/13983/10954 25007/13985/10956 25008/13990/10961 13569/13988/10959
+f 13569/13988/10959 25008/13990/10961 30574/13991/10962 23779/13989/10960
+f 13570/13992/10963 13574/13993/10964 13575/13994/10965 13571/13995/10966
+f 13571/13995/10966 13575/13994/10965 25008/13990/10961 25007/13985/10956
+f 13574/13993/10964 23783/13996/10967 23784/13997/10968 13575/13994/10965
+f 13575/13994/10965 23784/13997/10968 30574/13991/10962 25008/13990/10961
+f 13570/13992/10963 13571/13995/10966 13576/13998/10969 13572/13999/10970
+f 13572/13999/10970 13576/13998/10969 23854/14000/10971 23855/14001/10972
+f 13571/13995/10966 25007/13985/10956 25006/13984/10955 13576/13998/10969
+f 13576/13998/10969 25006/13984/10955 30598/13987/10958 23854/14000/10971
+f 13570/13992/10963 13572/13999/10970 13577/14002/10973 13573/14003/10974
+f 13573/14003/10974 13577/14002/10973 25009/14004/10975 25010/14005/10976
+f 13572/13999/10970 23855/14001/10972 23856/14006/10977 13577/14002/10973
+f 13577/14002/10973 23856/14006/10977 30599/14007/10978 25009/14004/10975
+f 13570/13992/10963 13573/14003/10974 13578/14008/10979 13574/13993/10964
+f 13574/13993/10964 13578/14008/10979 23782/14009/10980 23783/13996/10967
+f 13573/14003/10974 25010/14005/10976 25011/14010/10981 13578/14008/10979
+f 13578/14008/10979 25011/14010/10981 30575/14011/10982 23782/14009/10980
+f 13579/14012/10983 13583/14013/10984 13584/14014/10985 13580/14015/10986
+f 13580/14015/10986 13584/14014/10985 25011/14010/10981 25010/14005/10976
+f 13583/14013/10984 23786/14016/10987 23787/14017/10988 13584/14014/10985
+f 13584/14014/10985 23787/14017/10988 30575/14011/10982 25011/14010/10981
+f 13579/14012/10983 13580/14015/10986 13585/14018/10989 13581/14019/10990
+f 13581/14019/10990 13585/14018/10989 23857/14020/10991 23858/14021/10992
+f 13580/14015/10986 25010/14005/10976 25009/14004/10975 13585/14018/10989
+f 13585/14018/10989 25009/14004/10975 30599/14007/10978 23857/14020/10991
+f 13579/14012/10983 13581/14019/10990 13586/14022/10993 13582/14023/10994
+f 13582/14023/10994 13586/14022/10993 25012/14024/10995 25013/14025/10996
+f 13581/14019/10990 23858/14021/10992 23859/14026/10997 13586/14022/10993
+f 13586/14022/10993 23859/14026/10997 30600/14027/10998 25012/14024/10995
+f 13579/14012/10983 13582/14023/10994 13587/14028/10999 13583/14013/10984
+f 13583/14013/10984 13587/14028/10999 23785/14029/11000 23786/14016/10987
+f 13582/14023/10994 25013/14025/10996 25014/14030/11001 13587/14028/10999
+f 13587/14028/10999 25014/14030/11001 30576/14031/11002 23785/14029/11000
+f 13588/14032/11003 13592/14033/11004 13593/14034/11005 13589/14035/11006
+f 13589/14035/11006 13593/14034/11005 25014/14030/11001 25013/14025/10996
+f 13592/14033/11004 23789/14036/11007 23790/14037/11008 13593/14034/11005
+f 13593/14034/11005 23790/14037/11008 30576/14031/11002 25014/14030/11001
+f 13588/14032/11003 13589/14035/11006 13594/14038/11009 13590/14039/11010
+f 13590/14039/11010 13594/14038/11009 23860/14040/11011 23861/14041/11012
+f 13589/14035/11006 25013/14025/10996 25012/14024/10995 13594/14038/11009
+f 13594/14038/11009 25012/14024/10995 30600/14027/10998 23860/14040/11011
+f 13588/14032/11003 13590/14039/11010 13595/14042/11013 13591/14043/11014
+f 13591/14043/11014 13595/14042/11013 25015/14044/11015 25016/14045/11016
+f 13590/14039/11010 23861/14041/11012 23862/14046/11017 13595/14042/11013
+f 13595/14042/11013 23862/14046/11017 30601/14047/11018 25015/14044/11015
+f 13588/14032/11003 13591/14043/11014 13596/14048/11019 13592/14033/11004
+f 13592/14033/11004 13596/14048/11019 23788/14049/11020 23789/14036/11007
+f 13591/14043/11014 25016/14045/11016 25017/14050/11021 13596/14048/11019
+f 13596/14048/11019 25017/14050/11021 30577/14051/11022 23788/14049/11020
+f 13597/14052/11023 13601/14053/11024 13602/14054/11025 13598/14055/11026
+f 13598/14055/11026 13602/14054/11025 25017/14050/11021 25016/14045/11016
+f 13601/14053/11024 23792/14056/11027 23793/14057/11028 13602/14054/11025
+f 13602/14054/11025 23793/14057/11028 30577/14051/11022 25017/14050/11021
+f 13597/14052/11023 13598/14055/11026 13603/14058/11029 13599/14059/11030
+f 13599/14059/11030 13603/14058/11029 23863/14060/11031 23864/14061/11032
+f 13598/14055/11026 25016/14045/11016 25015/14044/11015 13603/14058/11029
+f 13603/14058/11029 25015/14044/11015 30601/14047/11018 23863/14060/11031
+f 13597/14052/11023 13599/14059/11030 13604/14062/11033 13600/14063/11034
+f 13600/14063/11034 13604/14062/11033 25018/14064/11035 25019/14065/11036
+f 13599/14059/11030 23864/14061/11032 23865/14066/11037 13604/14062/11033
+f 13604/14062/11033 23865/14066/11037 30602/14067/11038 25018/14064/11035
+f 13597/14052/11023 13600/14063/11034 13605/14068/11039 13601/14053/11024
+f 13601/14053/11024 13605/14068/11039 23791/14069/11040 23792/14056/11027
+f 13600/14063/11034 25019/14065/11036 25020/14070/11041 13605/14068/11039
+f 13605/14068/11039 25020/14070/11041 30578/14071/11042 23791/14069/11040
+f 13606/14072/11043 13610/14073/11044 13611/14074/11045 13607/14075/11046
+f 13607/14075/11046 13611/14074/11045 25020/14070/11041 25019/14065/11036
+f 13610/14073/11044 23795/14076/11047 23796/14077/11048 13611/14074/11045
+f 13611/14074/11045 23796/14077/11048 30578/14071/11042 25020/14070/11041
+f 13606/14072/11043 13607/14075/11046 13612/14078/11049 13608/14079/11050
+f 13608/14079/11050 13612/14078/11049 23866/14080/11051 23867/14081/11052
+f 13607/14075/11046 25019/14065/11036 25018/14064/11035 13612/14078/11049
+f 13612/14078/11049 25018/14064/11035 30602/14067/11038 23866/14080/11051
+f 13606/14072/11043 13608/14079/11050 13613/14082/11053 13609/14083/11054
+f 13609/14083/11054 13613/14082/11053 25021/14084/11055 25022/14085/11056
+f 13608/14079/11050 23867/14081/11052 23868/14086/11057 13613/14082/11053
+f 13613/14082/11053 23868/14086/11057 30603/14087/11058 25021/14084/11055
+f 13606/14072/11043 13609/14083/11054 13614/14088/11059 13610/14073/11044
+f 13610/14073/11044 13614/14088/11059 23794/14089/11060 23795/14076/11047
+f 13609/14083/11054 25022/14085/11056 25023/14090/11061 13614/14088/11059
+f 13614/14088/11059 25023/14090/11061 30579/14091/11062 23794/14089/11060
+f 13615/14092/11063 13619/14093/11064 13620/14094/11065 13616/14095/11066
+f 13616/14095/11066 13620/14094/11065 25023/14090/11061 25022/14085/11056
+f 13619/14093/11064 23798/14096/11067 23799/14097/11068 13620/14094/11065
+f 13620/14094/11065 23799/14097/11068 30579/14091/11062 25023/14090/11061
+f 13615/14092/11063 13616/14095/11066 13621/14098/11069 13617/14099/11070
+f 13617/14099/11070 13621/14098/11069 23869/14100/11071 23870/14101/11072
+f 13616/14095/11066 25022/14085/11056 25021/14084/11055 13621/14098/11069
+f 13621/14098/11069 25021/14084/11055 30603/14087/11058 23869/14100/11071
+f 13615/14092/11063 13617/14099/11070 13622/14102/11073 13618/14103/11074
+f 13618/14103/11074 13622/14102/11073 25024/14104/11075 25025/14105/11076
+f 13617/14099/11070 23870/14101/11072 23871/14106/11077 13622/14102/11073
+f 13622/14102/11073 23871/14106/11077 30604/14107/11078 25024/14104/11075
+f 13615/14092/11063 13618/14103/11074 13623/14108/11079 13619/14093/11064
+f 13619/14093/11064 13623/14108/11079 23797/14109/11080 23798/14096/11067
+f 13618/14103/11074 25025/14105/11076 25026/14110/11081 13623/14108/11079
+f 13623/14108/11079 25026/14110/11081 30580/14111/11082 23797/14109/11080
+f 13624/14112/11083 13628/14113/11084 13629/14114/11085 13625/14115/11086
+f 13625/14115/11086 13629/14114/11085 25026/14110/11081 25025/14105/11076
+f 13628/14113/11084 23801/14116/11087 23802/14117/11088 13629/14114/11085
+f 13629/14114/11085 23802/14117/11088 30580/14111/11082 25026/14110/11081
+f 13624/14112/11083 13625/14115/11086 13630/14118/11089 13626/14119/11090
+f 13626/14119/11090 13630/14118/11089 23872/14120/11091 23873/14121/11092
+f 13625/14115/11086 25025/14105/11076 25024/14104/11075 13630/14118/11089
+f 13630/14118/11089 25024/14104/11075 30604/14107/11078 23872/14120/11091
+f 13624/14112/11083 13626/14119/11090 13631/14122/11093 13627/14123/11094
+f 13627/14123/11094 13631/14122/11093 25027/14124/11095 25028/14125/11096
+f 13626/14119/11090 23873/14121/11092 23874/14126/11097 13631/14122/11093
+f 13631/14122/11093 23874/14126/11097 30605/14127/11098 25027/14124/11095
+f 13624/14112/11083 13627/14123/11094 13632/14128/11099 13628/14113/11084
+f 13628/14113/11084 13632/14128/11099 23800/14129/11100 23801/14116/11087
+f 13627/14123/11094 25028/14125/11096 25029/14130/11101 13632/14128/11099
+f 13632/14128/11099 25029/14130/11101 30581/14131/11102 23800/14129/11100
+f 13633/14132/11103 13637/14133/11104 13638/14134/11105 13634/14135/11106
+f 13634/14135/11106 13638/14134/11105 25029/14130/11101 25028/14125/11096
+f 13637/14133/11104 23804/14136/11107 23805/14137/11108 13638/14134/11105
+f 13638/14134/11105 23805/14137/11108 30581/14131/11102 25029/14130/11101
+f 13633/14132/11103 13634/14135/11106 13639/14138/11109 13635/14139/11110
+f 13635/14139/11110 13639/14138/11109 23875/14140/11111 23876/14141/11112
+f 13634/14135/11106 25028/14125/11096 25027/14124/11095 13639/14138/11109
+f 13639/14138/11109 25027/14124/11095 30605/14127/11098 23875/14140/11111
+f 13633/14132/11103 13635/14139/11110 13640/14142/11113 13636/14143/11114
+f 13636/14143/11114 13640/14142/11113 25030/14144/11115 25031/14145/11116
+f 13635/14139/11110 23876/14141/11112 23877/14146/11117 13640/14142/11113
+f 13640/14142/11113 23877/14146/11117 30606/14147/11118 25030/14144/11115
+f 13633/14132/11103 13636/14143/11114 13641/14148/11119 13637/14133/11104
+f 13637/14133/11104 13641/14148/11119 23803/14149/11120 23804/14136/11107
+f 13636/14143/11114 25031/14145/11116 25032/14150/11121 13641/14148/11119
+f 13641/14148/11119 25032/14150/11121 30582/14151/11122 23803/14149/11120
+f 13642/14152/11123 13646/14153/11124 13647/14154/11125 13643/14155/11126
+f 13643/14155/11126 13647/14154/11125 25032/14150/11121 25031/14145/11116
+f 13646/14153/11124 23807/14156/11127 23808/14157/11128 13647/14154/11125
+f 13647/14154/11125 23808/14157/11128 30582/14151/11122 25032/14150/11121
+f 13642/14152/11123 13643/14155/11126 13648/14158/11129 13644/14159/11130
+f 13644/14159/11130 13648/14158/11129 23878/14160/11131 23879/14161/11132
+f 13643/14155/11126 25031/14145/11116 25030/14144/11115 13648/14158/11129
+f 13648/14158/11129 25030/14144/11115 30606/14147/11118 23878/14160/11131
+f 13642/14152/11123 13644/14159/11130 13649/14162/11133 13645/14163/11134
+f 13645/14163/11134 13649/14162/11133 25033/14164/11135 25034/14165/11136
+f 13644/14159/11130 23879/14161/11132 23880/14166/11137 13649/14162/11133
+f 13649/14162/11133 23880/14166/11137 30607/14167/11138 25033/14164/11135
+f 13642/14152/11123 13645/14163/11134 13650/14168/11139 13646/14153/11124
+f 13646/14153/11124 13650/14168/11139 23806/14169/11140 23807/14156/11127
+f 13645/14163/11134 25034/14165/11136 25035/14170/11141 13650/14168/11139
+f 13650/14168/11139 25035/14170/11141 30583/14171/11142 23806/14169/11140
+f 13651/14172/11143 13655/14173/11144 13656/14174/11145 13652/14175/11146
+f 13652/14175/11146 13656/14174/11145 25035/14170/11141 25034/14165/11136
+f 13655/14173/11144 23810/14176/11147 23811/14177/11148 13656/14174/11145
+f 13656/14174/11145 23811/14177/11148 30583/14171/11142 25035/14170/11141
+f 13651/14172/11143 13652/14175/11146 13657/14178/11149 13653/14179/11150
+f 13653/14179/11150 13657/14178/11149 23881/14180/11151 23882/14181/11152
+f 13652/14175/11146 25034/14165/11136 25033/14164/11135 13657/14178/11149
+f 13657/14178/11149 25033/14164/11135 30607/14167/11138 23881/14180/11151
+f 13651/14172/11143 13653/14179/11150 13658/14182/11153 13654/14183/11154
+f 13654/14183/11154 13658/14182/11153 25036/14184/11155 25037/14185/11156
+f 13653/14179/11150 23882/14181/11152 23883/14186/11157 13658/14182/11153
+f 13658/14182/11153 23883/14186/11157 30608/14187/11158 25036/14184/11155
+f 13651/14172/11143 13654/14183/11154 13659/14188/11159 13655/14173/11144
+f 13655/14173/11144 13659/14188/11159 23809/14189/11160 23810/14176/11147
+f 13654/14183/11154 25037/14185/11156 25038/14190/11161 13659/14188/11159
+f 13659/14188/11159 25038/14190/11161 30584/14191/11162 23809/14189/11160
+f 13660/14192/11163 13664/14193/11164 13665/14194/11165 13661/14195/11166
+f 13661/14195/11166 13665/14194/11165 25038/14190/11161 25037/14185/11156
+f 13664/14193/11164 23813/14196/11167 23814/14197/11168 13665/14194/11165
+f 13665/14194/11165 23814/14197/11168 30584/14191/11162 25038/14190/11161
+f 13660/14192/11163 13661/14195/11166 13666/14198/11169 13662/14199/11170
+f 13662/14199/11170 13666/14198/11169 23884/14200/11171 23885/14201/11172
+f 13661/14195/11166 25037/14185/11156 25036/14184/11155 13666/14198/11169
+f 13666/14198/11169 25036/14184/11155 30608/14187/11158 23884/14200/11171
+f 13660/14192/11163 13662/14199/11170 13667/14202/11173 13663/14203/11174
+f 13663/14203/11174 13667/14202/11173 25039/14204/11175 25040/14205/11176
+f 13662/14199/11170 23885/14201/11172 23886/14206/11177 13667/14202/11173
+f 13667/14202/11173 23886/14206/11177 30609/14207/11178 25039/14204/11175
+f 13660/14192/11163 13663/14203/11174 13668/14208/11179 13664/14193/11164
+f 13664/14193/11164 13668/14208/11179 23812/14209/11180 23813/14196/11167
+f 13663/14203/11174 25040/14205/11176 25041/14210/11181 13668/14208/11179
+f 13668/14208/11179 25041/14210/11181 30585/14211/11182 23812/14209/11180
+f 13669/14212/11183 13673/14213/11184 13674/14214/11185 13670/14215/11186
+f 13670/14215/11186 13674/14214/11185 25041/14210/11181 25040/14205/11176
+f 13673/14213/11184 23816/14216/11187 23817/14217/11188 13674/14214/11185
+f 13674/14214/11185 23817/14217/11188 30585/14211/11182 25041/14210/11181
+f 13669/14212/11183 13670/14215/11186 13675/14218/11189 13671/14219/11190
+f 13671/14219/11190 13675/14218/11189 23887/14220/11191 23888/14221/11192
+f 13670/14215/11186 25040/14205/11176 25039/14204/11175 13675/14218/11189
+f 13675/14218/11189 25039/14204/11175 30609/14207/11178 23887/14220/11191
+f 13669/14212/11183 13671/14219/11190 13676/14222/11193 13672/14223/11194
+f 13672/14223/11194 13676/14222/11193 25042/14224/11195 25043/14225/11196
+f 13671/14219/11190 23888/14221/11192 23889/14226/11197 13676/14222/11193
+f 13676/14222/11193 23889/14226/11197 30610/14227/11198 25042/14224/11195
+f 13669/14212/11183 13672/14223/11194 13677/14228/11199 13673/14213/11184
+f 13673/14213/11184 13677/14228/11199 23815/14229/11200 23816/14216/11187
+f 13672/14223/11194 25043/14225/11196 25044/14230/11201 13677/14228/11199
+f 13677/14228/11199 25044/14230/11201 30586/14231/11202 23815/14229/11200
+f 13678/14232/11203 13682/14233/11204 13683/14234/11205 13679/14235/11206
+f 13679/14235/11206 13683/14234/11205 25044/14230/11201 25043/14225/11196
+f 13682/14233/11204 23819/14236/11207 23820/14237/11208 13683/14234/11205
+f 13683/14234/11205 23820/14237/11208 30586/14231/11202 25044/14230/11201
+f 13678/14232/11203 13679/14235/11206 13684/14238/11209 13680/14239/11210
+f 13680/14239/11210 13684/14238/11209 23890/14240/11211 23891/14241/11212
+f 13679/14235/11206 25043/14225/11196 25042/14224/11195 13684/14238/11209
+f 13684/14238/11209 25042/14224/11195 30610/14227/11198 23890/14240/11211
+f 13678/14232/11203 13680/14239/11210 13685/14242/11213 13681/14243/11214
+f 13681/14243/11214 13685/14242/11213 25045/14244/11215 25046/14245/11216
+f 13680/14239/11210 23891/14241/11212 23892/14246/11217 13685/14242/11213
+f 13685/14242/11213 23892/14246/11217 30611/14247/11218 25045/14244/11215
+f 13678/14232/11203 13681/14243/11214 13686/14248/11219 13682/14233/11204
+f 13682/14233/11204 13686/14248/11219 23818/14249/11220 23819/14236/11207
+f 13681/14243/11214 25046/14245/11216 25047/14250/11221 13686/14248/11219
+f 13686/14248/11219 25047/14250/11221 30587/14251/11222 23818/14249/11220
+f 13687/14252/11223 13691/14253/11224 13692/14254/11225 13688/14255/11226
+f 13688/14255/11226 13692/14254/11225 25047/14250/11221 25046/14245/11216
+f 13691/14253/11224 23822/14256/11227 23823/14257/11228 13692/14254/11225
+f 13692/14254/11225 23823/14257/11228 30587/14251/11222 25047/14250/11221
+f 13687/14252/11223 13688/14255/11226 13693/14258/11229 13689/14259/11230
+f 13689/14259/11230 13693/14258/11229 23893/14260/11231 23894/14261/11232
+f 13688/14255/11226 25046/14245/11216 25045/14244/11215 13693/14258/11229
+f 13693/14258/11229 25045/14244/11215 30611/14247/11218 23893/14260/11231
+f 13687/14252/11223 13689/14259/11230 13694/14262/11233 13690/14263/11234
+f 13690/14263/11234 13694/14262/11233 25048/14264/11235 25049/14265/11236
+f 13689/14259/11230 23894/14261/11232 23895/14266/11237 13694/14262/11233
+f 13694/14262/11233 23895/14266/11237 30612/14267/11238 25048/14264/11235
+f 13687/14252/11223 13690/14263/11234 13695/14268/11239 13691/14253/11224
+f 13691/14253/11224 13695/14268/11239 23821/14269/11240 23822/14256/11227
+f 13690/14263/11234 25049/14265/11236 25050/14270/11241 13695/14268/11239
+f 13695/14268/11239 25050/14270/11241 30588/14271/11242 23821/14269/11240
+f 13696/14272/11243 13700/14273/11244 13701/14274/11245 13697/14275/11246
+f 13697/14275/11246 13701/14274/11245 25050/14270/11241 25049/14265/11236
+f 13700/14273/11244 23825/14276/11247 23826/14277/11248 13701/14274/11245
+f 13701/14274/11245 23826/14277/11248 30588/14271/11242 25050/14270/11241
+f 13696/14272/11243 13697/14275/11246 13702/14278/11249 13698/14279/11250
+f 13698/14279/11250 13702/14278/11249 23896/14280/11251 23897/14281/11252
+f 13697/14275/11246 25049/14265/11236 25048/14264/11235 13702/14278/11249
+f 13702/14278/11249 25048/14264/11235 30612/14267/11238 23896/14280/11251
+f 13696/14272/11243 13698/14279/11250 13703/14282/11253 13699/14283/11254
+f 13699/14283/11254 13703/14282/11253 25051/14284/11255 25052/14285/11256
+f 13698/14279/11250 23897/14281/11252 23898/14286/11257 13703/14282/11253
+f 13703/14282/11253 23898/14286/11257 30613/14287/11258 25051/14284/11255
+f 13696/14272/11243 13699/14283/11254 13704/14288/11259 13700/14273/11244
+f 13700/14273/11244 13704/14288/11259 23824/14289/11260 23825/14276/11247
+f 13699/14283/11254 25052/14285/11256 25053/14290/11261 13704/14288/11259
+f 13704/14288/11259 25053/14290/11261 30589/14291/11262 23824/14289/11260
+f 13705/14292/11263 13709/14293/11264 13710/14294/11265 13706/14295/11266
+f 13706/14295/11266 13710/14294/11265 25053/14290/11261 25052/14285/11256
+f 13709/14293/11264 23828/14296/11267 23829/14297/11268 13710/14294/11265
+f 13710/14294/11265 23829/14297/11268 30589/14291/11262 25053/14290/11261
+f 13705/14292/11263 13706/14295/11266 13711/14298/11269 13707/14299/11270
+f 13707/14299/11270 13711/14298/11269 23899/14300/11271 23900/14301/11272
+f 13706/14295/11266 25052/14285/11256 25051/14284/11255 13711/14298/11269
+f 13711/14298/11269 25051/14284/11255 30613/14287/11258 23899/14300/11271
+f 13705/14292/11263 13707/14299/11270 13712/14302/11273 13708/14303/11274
+f 13708/14303/11274 13712/14302/11273 25054/14304/11275 25055/14305/11276
+f 13707/14299/11270 23900/14301/11272 23901/14306/11277 13712/14302/11273
+f 13712/14302/11273 23901/14306/11277 30614/14307/11278 25054/14304/11275
+f 13705/14292/11263 13708/14303/11274 13713/14308/11279 13709/14293/11264
+f 13709/14293/11264 13713/14308/11279 23827/14309/11280 23828/14296/11267
+f 13708/14303/11274 25055/14305/11276 25056/14310/11281 13713/14308/11279
+f 13713/14308/11279 25056/14310/11281 30590/14311/11282 23827/14309/11280
+f 13714/14312/11283 13718/14313/11284 13719/14314/11285 13715/14315/11286
+f 13715/14315/11286 13719/14314/11285 25056/14316/11281 25055/14317/11276
+f 13718/14313/11284 23831/14318/11287 23832/14319/11288 13719/14314/11285
+f 13719/14314/11285 23832/14319/11288 30590/14320/11282 25056/14316/11281
+f 13714/14312/11283 13715/14315/11286 13720/14321/11289 13716/14322/11290
+f 13716/14322/11290 13720/14321/11289 23902/14323/11291 23903/14324/11292
+f 13715/14315/11286 25055/14317/11276 25054/14325/11275 13720/14321/11289
+f 13720/14321/11289 25054/14325/11275 30614/14326/11278 23902/14323/11291
+f 13714/14312/11283 13716/14322/11290 13721/14327/11293 13717/14328/11294
+f 13717/14328/11294 13721/14327/11293 25057/14329/11295 25058/14330/11296
+f 13716/14322/11290 23903/14324/11292 23904/14331/11297 13721/14327/11293
+f 13721/14327/11293 23904/14331/11297 30615/14332/11298 25057/14329/11295
+f 13714/14312/11283 13717/14328/11294 13722/14333/11299 13718/14313/11284
+f 13718/14313/11284 13722/14333/11299 23830/14334/11300 23831/14318/11287
+f 13717/14328/11294 25058/14330/11296 25059/14335/11301 13722/14333/11299
+f 13722/14333/11299 25059/14335/11301 30591/14336/11302 23830/14334/11300
+f 13723/14337/11303 13727/14338/11304 13728/14339/11305 13724/14340/11306
+f 13724/14340/11306 13728/14339/11305 25059/14335/11301 25058/14330/11296
+f 13727/14338/11304 23834/14341/11307 23835/14342/11308 13728/14339/11305
+f 13728/14339/11305 23835/14342/11308 30591/14336/11302 25059/14335/11301
+f 13723/14337/11303 13724/14340/11306 13729/14343/11309 13725/14344/11310
+f 13725/14344/11310 13729/14343/11309 23905/14345/11311 23906/14346/11312
+f 13724/14340/11306 25058/14330/11296 25057/14329/11295 13729/14343/11309
+f 13729/14343/11309 25057/14329/11295 30615/14332/11298 23905/14345/11311
+f 13723/14337/11303 13725/14344/11310 13730/14347/11313 13726/14348/11314
+f 13726/14348/11314 13730/14347/11313 25060/14349/11315 25061/14350/11316
+f 13725/14344/11310 23906/14346/11312 23907/14351/11317 13730/14347/11313
+f 13730/14347/11313 23907/14351/11317 30616/14352/11318 25060/14349/11315
+f 13723/14337/11303 13726/14348/11314 13731/14353/11319 13727/14338/11304
+f 13727/14338/11304 13731/14353/11319 23833/14354/11320 23834/14341/11307
+f 13726/14348/11314 25061/14350/11316 25062/14355/11321 13731/14353/11319
+f 13731/14353/11319 25062/14355/11321 30592/14356/11322 23833/14354/11320
+f 13732/14357/11323 13736/14358/11324 13737/14359/11325 13733/14360/11326
+f 13733/14360/11326 13737/14359/11325 25062/14355/11321 25061/14350/11316
+f 13736/14358/11324 23837/14361/11327 23838/14362/11328 13737/14359/11325
+f 13737/14359/11325 23838/14362/11328 30592/14356/11322 25062/14355/11321
+f 13732/14357/11323 13733/14360/11326 13738/14363/11329 13734/14364/11330
+f 13734/14364/11330 13738/14363/11329 23908/14365/11331 23909/14366/11332
+f 13733/14360/11326 25061/14350/11316 25060/14349/11315 13738/14363/11329
+f 13738/14363/11329 25060/14349/11315 30616/14352/11318 23908/14365/11331
+f 13732/14357/11323 13734/14364/11330 13739/14367/11333 13735/14368/11334
+f 13735/14368/11334 13739/14367/11333 25063/14369/11335 25064/14370/11336
+f 13734/14364/11330 23909/14366/11332 23910/14371/11337 13739/14367/11333
+f 13739/14367/11333 23910/14371/11337 30617/14372/11338 25063/14369/11335
+f 13732/14357/11323 13735/14368/11334 13740/14373/11339 13736/14358/11324
+f 13736/14358/11324 13740/14373/11339 23836/14374/11340 23837/14361/11327
+f 13735/14368/11334 25064/14370/11336 25065/14375/11341 13740/14373/11339
+f 13740/14373/11339 25065/14375/11341 30593/14376/11342 23836/14374/11340
+f 13741/14377/11343 13745/14378/11344 13746/14379/11345 13742/14380/11346
+f 13742/14380/11346 13746/14379/11345 25065/14375/11341 25064/14370/11336
+f 13745/14378/11344 23840/14381/11347 23841/14382/11348 13746/14379/11345
+f 13746/14379/11345 23841/14382/11348 30593/14376/11342 25065/14375/11341
+f 13741/14377/11343 13742/14380/11346 13747/14383/11349 13743/14384/11350
+f 13743/14384/11350 13747/14383/11349 23911/14385/11351 23912/14386/11352
+f 13742/14380/11346 25064/14370/11336 25063/14369/11335 13747/14383/11349
+f 13747/14383/11349 25063/14369/11335 30617/14372/11338 23911/14385/11351
+f 13741/14377/11343 13743/14384/11350 13748/14387/11353 13744/14388/11354
+f 13744/14388/11354 13748/14387/11353 25066/14389/11355 25067/14390/11356
+f 13743/14384/11350 23912/14386/11352 23913/14391/11357 13748/14387/11353
+f 13748/14387/11353 23913/14391/11357 30618/14392/11358 25066/14389/11355
+f 13741/14377/11343 13744/14388/11354 13749/14393/11359 13745/14378/11344
+f 13745/14378/11344 13749/14393/11359 23839/14394/11360 23840/14381/11347
+f 13744/14388/11354 25067/14390/11356 25068/14395/11361 13749/14393/11359
+f 13749/14393/11359 25068/14395/11361 30594/14396/11362 23839/14394/11360
+f 13750/14397/11363 13754/14398/11364 13755/14399/11365 13751/14400/11366
+f 13751/14400/11366 13755/14399/11365 25068/14395/11361 25067/14390/11356
+f 13754/14398/11364 23843/14401/11367 23844/14402/11368 13755/14399/11365
+f 13755/14399/11365 23844/14402/11368 30594/14396/11362 25068/14395/11361
+f 13750/14397/11363 13751/14400/11366 13756/14403/11369 13752/14404/11370
+f 13752/14404/11370 13756/14403/11369 23914/14405/11371 23915/14406/11372
+f 13751/14400/11366 25067/14390/11356 25066/14389/11355 13756/14403/11369
+f 13756/14403/11369 25066/14389/11355 30618/14392/11358 23914/14405/11371
+f 13750/14397/11363 13752/14404/11370 13757/14407/11373 13753/14408/11374
+f 13753/14408/11374 13757/14407/11373 25069/14409/11375 25070/14410/11376
+f 13752/14404/11370 23915/14406/11372 23916/14411/11377 13757/14407/11373
+f 13757/14407/11373 23916/14411/11377 30619/14412/11378 25069/14409/11375
+f 13750/14397/11363 13753/14408/11374 13758/14413/11379 13754/14398/11364
+f 13754/14398/11364 13758/14413/11379 23842/14414/11380 23843/14401/11367
+f 13753/14408/11374 25070/14410/11376 25071/14415/11381 13758/14413/11379
+f 13758/14413/11379 25071/14415/11381 30595/14416/11382 23842/14414/11380
+f 13759/14417/11383 13763/14418/11384 13764/14419/11385 13760/14420/11386
+f 13760/14420/11386 13764/14419/11385 25071/14415/11381 25070/14410/11376
+f 13763/14418/11384 23846/14421/11387 23847/14422/11388 13764/14419/11385
+f 13764/14419/11385 23847/14422/11388 30595/14416/11382 25071/14415/11381
+f 13759/14417/11383 13760/14420/11386 13765/14423/11389 13761/14424/11390
+f 13761/14424/11390 13765/14423/11389 23917/14425/11391 23918/14426/11392
+f 13760/14420/11386 25070/14410/11376 25069/14409/11375 13765/14423/11389
+f 13765/14423/11389 25069/14409/11375 30619/14412/11378 23917/14425/11391
+f 13759/14417/11383 13761/14424/11390 13766/14427/11393 13762/14428/11394
+f 13762/14428/11394 13766/14427/11393 25072/14429/11395 25073/14430/11396
+f 13761/14424/11390 23918/14426/11392 23919/14431/11397 13766/14427/11393
+f 13766/14427/11393 23919/14431/11397 30620/14432/11398 25072/14429/11395
+f 13759/14417/11383 13762/14428/11394 13767/14433/11399 13763/14418/11384
+f 13763/14418/11384 13767/14433/11399 23845/14434/11400 23846/14421/11387
+f 13762/14428/11394 25073/14430/11396 25074/14435/11401 13767/14433/11399
+f 13767/14433/11399 25074/14435/11401 30596/14436/11402 23845/14434/11400
+f 13768/14437/11403 13772/14438/11404 13773/14439/11405 13769/14440/11406
+f 13769/14440/11406 13773/14439/11405 25074/14435/11401 25073/14430/11396
+f 13772/14438/11404 23849/14441/11407 23850/14442/11408 13773/14439/11405
+f 13773/14439/11405 23850/14442/11408 30596/14436/11402 25074/14435/11401
+f 13768/14437/11403 13769/14440/11406 13774/14443/11409 13770/14444/11410
+f 13770/14444/11410 13774/14443/11409 23920/14445/11411 23921/14446/11412
+f 13769/14440/11406 25073/14430/11396 25072/14429/11395 13774/14443/11409
+f 13774/14443/11409 25072/14429/11395 30620/14432/11398 23920/14445/11411
+f 13768/14437/11403 13770/14444/11410 13775/14447/11413 13771/14448/11414
+f 13771/14448/11414 13775/14447/11413 25005/13980/10951 25004/13972/10943
+f 13770/14444/11410 23921/14446/11412 23922/14449/11415 13775/14447/11413
+f 13775/14447/11413 23922/14449/11415 30597/13981/10952 25005/13980/10951
+f 13768/14437/11403 13771/14448/11414 13776/14450/11416 13772/14438/11404
+f 13772/14438/11404 13776/14450/11416 23848/14451/11417 23849/14441/11407
+f 13771/14448/11414 25004/13972/10943 25003/13971/10942 13776/14450/11416
+f 13776/14450/11416 25003/13971/10942 30573/13975/10946 23848/14451/11417
+f 13777/14452/11418 13781/14453/11419 13782/14454/11420 13778/14455/11421
+f 13778/14455/11421 13782/14454/11420 25075/14456/11422 25076/14457/11423
+f 13781/14453/11419 23852/13979/10950 23851/13978/10949 13782/14454/11420
+f 13782/14454/11420 23851/13978/10949 30597/13981/10952 25075/14456/11422
+f 13777/14452/11418 13778/14455/11421 13783/14458/11424 13779/14459/11425
+f 13779/14459/11425 13783/14458/11424 23923/14460/11426 23924/14461/11427
+f 13778/14455/11421 25076/14457/11423 25077/14462/11428 13783/14458/11424
+f 13783/14458/11424 25077/14462/11428 30621/14463/11429 23923/14460/11426
+f 13777/14452/11418 13779/14459/11425 13784/14464/11430 13780/14465/11431
+f 13780/14465/11431 13784/14464/11430 25078/14466/11432 25079/14467/11433
+f 13779/14459/11425 23924/14461/11427 23925/14468/11434 13784/14464/11430
+f 13784/14464/11430 23925/14468/11434 30622/14469/11435 25078/14466/11432
+f 13777/14452/11418 13780/14465/11431 13785/14470/11436 13781/14453/11419
+f 13781/14453/11419 13785/14470/11436 23853/13986/10957 23852/13979/10950
+f 13780/14465/11431 25079/14467/11433 25080/14471/11437 13785/14470/11436
+f 13785/14470/11436 25080/14471/11437 30598/13987/10958 23853/13986/10957
+f 13786/14472/11438 13790/14473/11439 13791/14474/11440 13787/14475/11441
+f 13787/14475/11441 13791/14474/11440 25080/14471/11437 25079/14467/11433
+f 13790/14473/11439 23855/14001/10972 23854/14000/10971 13791/14474/11440
+f 13791/14474/11440 23854/14000/10971 30598/13987/10958 25080/14471/11437
+f 13786/14472/11438 13787/14475/11441 13792/14476/11442 13788/14477/11443
+f 13788/14477/11443 13792/14476/11442 23926/14478/11444 23927/14479/11445
+f 13787/14475/11441 25079/14467/11433 25078/14466/11432 13792/14476/11442
+f 13792/14476/11442 25078/14466/11432 30622/14469/11435 23926/14478/11444
+f 13786/14472/11438 13788/14477/11443 13793/14480/11446 13789/14481/11447
+f 13789/14481/11447 13793/14480/11446 25081/14482/11448 25082/14483/11449
+f 13788/14477/11443 23927/14479/11445 23928/14484/11450 13793/14480/11446
+f 13793/14480/11446 23928/14484/11450 30623/14485/11451 25081/14482/11448
+f 13786/14472/11438 13789/14481/11447 13794/14486/11452 13790/14473/11439
+f 13790/14473/11439 13794/14486/11452 23856/14006/10977 23855/14001/10972
+f 13789/14481/11447 25082/14483/11449 25083/14487/11453 13794/14486/11452
+f 13794/14486/11452 25083/14487/11453 30599/14007/10978 23856/14006/10977
+f 13795/14488/11454 13799/14489/11455 13800/14490/11456 13796/14491/11457
+f 13796/14491/11457 13800/14490/11456 25083/14487/11453 25082/14483/11449
+f 13799/14489/11455 23858/14021/10992 23857/14020/10991 13800/14490/11456
+f 13800/14490/11456 23857/14020/10991 30599/14007/10978 25083/14487/11453
+f 13795/14488/11454 13796/14491/11457 13801/14492/11458 13797/14493/11459
+f 13797/14493/11459 13801/14492/11458 23929/14494/11460 23930/14495/11461
+f 13796/14491/11457 25082/14483/11449 25081/14482/11448 13801/14492/11458
+f 13801/14492/11458 25081/14482/11448 30623/14485/11451 23929/14494/11460
+f 13795/14488/11454 13797/14493/11459 13802/14496/11462 13798/14497/11463
+f 13798/14497/11463 13802/14496/11462 25084/14498/11464 25085/14499/11465
+f 13797/14493/11459 23930/14495/11461 23931/14500/11466 13802/14496/11462
+f 13802/14496/11462 23931/14500/11466 30624/14501/11467 25084/14498/11464
+f 13795/14488/11454 13798/14497/11463 13803/14502/11468 13799/14489/11455
+f 13799/14489/11455 13803/14502/11468 23859/14026/10997 23858/14021/10992
+f 13798/14497/11463 25085/14499/11465 25086/14503/11469 13803/14502/11468
+f 13803/14502/11468 25086/14503/11469 30600/14027/10998 23859/14026/10997
+f 13804/14504/11470 13808/14505/11471 13809/14506/11472 13805/14507/11473
+f 13805/14507/11473 13809/14506/11472 25086/14503/11469 25085/14499/11465
+f 13808/14505/11471 23861/14041/11012 23860/14040/11011 13809/14506/11472
+f 13809/14506/11472 23860/14040/11011 30600/14027/10998 25086/14503/11469
+f 13804/14504/11470 13805/14507/11473 13810/14508/11474 13806/14509/11475
+f 13806/14509/11475 13810/14508/11474 23932/14510/11476 23933/14511/11477
+f 13805/14507/11473 25085/14499/11465 25084/14498/11464 13810/14508/11474
+f 13810/14508/11474 25084/14498/11464 30624/14501/11467 23932/14510/11476
+f 13804/14504/11470 13806/14509/11475 13811/14512/11478 13807/14513/11479
+f 13807/14513/11479 13811/14512/11478 25087/14514/11480 25088/14515/11481
+f 13806/14509/11475 23933/14511/11477 23934/14516/11482 13811/14512/11478
+f 13811/14512/11478 23934/14516/11482 30625/14517/11483 25087/14514/11480
+f 13804/14504/11470 13807/14513/11479 13812/14518/11484 13808/14505/11471
+f 13808/14505/11471 13812/14518/11484 23862/14046/11017 23861/14041/11012
+f 13807/14513/11479 25088/14515/11481 25089/14519/11485 13812/14518/11484
+f 13812/14518/11484 25089/14519/11485 30601/14047/11018 23862/14046/11017
+f 13813/14520/11486 13817/14521/11487 13818/14522/11488 13814/14523/11489
+f 13814/14523/11489 13818/14522/11488 25089/14519/11485 25088/14515/11481
+f 13817/14521/11487 23864/14061/11032 23863/14060/11031 13818/14522/11488
+f 13818/14522/11488 23863/14060/11031 30601/14047/11018 25089/14519/11485
+f 13813/14520/11486 13814/14523/11489 13819/14524/11490 13815/14525/11491
+f 13815/14525/11491 13819/14524/11490 23935/14526/11492 23936/14527/11493
+f 13814/14523/11489 25088/14515/11481 25087/14514/11480 13819/14524/11490
+f 13819/14524/11490 25087/14514/11480 30625/14517/11483 23935/14526/11492
+f 13813/14520/11486 13815/14525/11491 13820/14528/11494 13816/14529/11495
+f 13816/14529/11495 13820/14528/11494 25090/14530/11496 25091/14531/11497
+f 13815/14525/11491 23936/14527/11493 23937/14532/11498 13820/14528/11494
+f 13820/14528/11494 23937/14532/11498 30626/14533/11499 25090/14530/11496
+f 13813/14520/11486 13816/14529/11495 13821/14534/11500 13817/14521/11487
+f 13817/14521/11487 13821/14534/11500 23865/14066/11037 23864/14061/11032
+f 13816/14529/11495 25091/14531/11497 25092/14535/11501 13821/14534/11500
+f 13821/14534/11500 25092/14535/11501 30602/14067/11038 23865/14066/11037
+f 13822/14536/11502 13826/14537/11503 13827/14538/11504 13823/14539/11505
+f 13823/14539/11505 13827/14538/11504 25092/14535/11501 25091/14531/11497
+f 13826/14537/11503 23867/14081/11052 23866/14080/11051 13827/14538/11504
+f 13827/14538/11504 23866/14080/11051 30602/14067/11038 25092/14535/11501
+f 13822/14536/11502 13823/14539/11505 13828/14540/11506 13824/14541/11507
+f 13824/14541/11507 13828/14540/11506 23938/14542/11508 23939/14543/11509
+f 13823/14539/11505 25091/14531/11497 25090/14530/11496 13828/14540/11506
+f 13828/14540/11506 25090/14530/11496 30626/14533/11499 23938/14542/11508
+f 13822/14536/11502 13824/14541/11507 13829/14544/11510 13825/14545/11511
+f 13825/14545/11511 13829/14544/11510 25093/14546/11512 25094/14547/11513
+f 13824/14541/11507 23939/14543/11509 23940/14548/11514 13829/14544/11510
+f 13829/14544/11510 23940/14548/11514 30627/14549/11515 25093/14546/11512
+f 13822/14536/11502 13825/14545/11511 13830/14550/11516 13826/14537/11503
+f 13826/14537/11503 13830/14550/11516 23868/14086/11057 23867/14081/11052
+f 13825/14545/11511 25094/14547/11513 25095/14551/11517 13830/14550/11516
+f 13830/14550/11516 25095/14551/11517 30603/14087/11058 23868/14086/11057
+f 13831/14552/11518 13835/14553/11519 13836/14554/11520 13832/14555/11521
+f 13832/14555/11521 13836/14554/11520 25095/14551/11517 25094/14547/11513
+f 13835/14553/11519 23870/14101/11072 23869/14100/11071 13836/14554/11520
+f 13836/14554/11520 23869/14100/11071 30603/14087/11058 25095/14551/11517
+f 13831/14552/11518 13832/14555/11521 13837/14556/11522 13833/14557/11523
+f 13833/14557/11523 13837/14556/11522 23941/14558/11524 23942/14559/11525
+f 13832/14555/11521 25094/14547/11513 25093/14546/11512 13837/14556/11522
+f 13837/14556/11522 25093/14546/11512 30627/14549/11515 23941/14558/11524
+f 13831/14552/11518 13833/14557/11523 13838/14560/11526 13834/14561/11527
+f 13834/14561/11527 13838/14560/11526 25096/14562/11528 25097/14563/11529
+f 13833/14557/11523 23942/14559/11525 23943/14564/11530 13838/14560/11526
+f 13838/14560/11526 23943/14564/11530 30628/14565/11531 25096/14562/11528
+f 13831/14552/11518 13834/14561/11527 13839/14566/11532 13835/14553/11519
+f 13835/14553/11519 13839/14566/11532 23871/14106/11077 23870/14101/11072
+f 13834/14561/11527 25097/14563/11529 25098/14567/11533 13839/14566/11532
+f 13839/14566/11532 25098/14567/11533 30604/14107/11078 23871/14106/11077
+f 13840/14568/11534 13844/14569/11535 13845/14570/11536 13841/14571/11537
+f 13841/14571/11537 13845/14570/11536 25098/14567/11533 25097/14563/11529
+f 13844/14569/11535 23873/14121/11092 23872/14120/11091 13845/14570/11536
+f 13845/14570/11536 23872/14120/11091 30604/14107/11078 25098/14567/11533
+f 13840/14568/11534 13841/14571/11537 13846/14572/11538 13842/14573/11539
+f 13842/14573/11539 13846/14572/11538 23944/14574/11540 23945/14575/11541
+f 13841/14571/11537 25097/14563/11529 25096/14562/11528 13846/14572/11538
+f 13846/14572/11538 25096/14562/11528 30628/14565/11531 23944/14574/11540
+f 13840/14568/11534 13842/14573/11539 13847/14576/11542 13843/14577/11543
+f 13843/14577/11543 13847/14576/11542 25099/14578/11544 25100/14579/11545
+f 13842/14573/11539 23945/14575/11541 23946/14580/11546 13847/14576/11542
+f 13847/14576/11542 23946/14580/11546 30629/14581/11547 25099/14578/11544
+f 13840/14568/11534 13843/14577/11543 13848/14582/11548 13844/14569/11535
+f 13844/14569/11535 13848/14582/11548 23874/14126/11097 23873/14121/11092
+f 13843/14577/11543 25100/14579/11545 25101/14583/11549 13848/14582/11548
+f 13848/14582/11548 25101/14583/11549 30605/14127/11098 23874/14126/11097
+f 13849/14584/11550 13853/14585/11551 13854/14586/11552 13850/14587/11553
+f 13850/14587/11553 13854/14586/11552 25101/14583/11549 25100/14579/11545
+f 13853/14585/11551 23876/14141/11112 23875/14140/11111 13854/14586/11552
+f 13854/14586/11552 23875/14140/11111 30605/14127/11098 25101/14583/11549
+f 13849/14584/11550 13850/14587/11553 13855/14588/11554 13851/14589/11555
+f 13851/14589/11555 13855/14588/11554 23947/14590/11556 23948/14591/11557
+f 13850/14587/11553 25100/14579/11545 25099/14578/11544 13855/14588/11554
+f 13855/14588/11554 25099/14578/11544 30629/14581/11547 23947/14590/11556
+f 13849/14584/11550 13851/14589/11555 13856/14592/11558 13852/14593/11559
+f 13852/14593/11559 13856/14592/11558 25102/14594/11560 25103/14595/11561
+f 13851/14589/11555 23948/14591/11557 23949/14596/11562 13856/14592/11558
+f 13856/14592/11558 23949/14596/11562 30630/14597/11563 25102/14594/11560
+f 13849/14584/11550 13852/14593/11559 13857/14598/11564 13853/14585/11551
+f 13853/14585/11551 13857/14598/11564 23877/14146/11117 23876/14141/11112
+f 13852/14593/11559 25103/14595/11561 25104/14599/11565 13857/14598/11564
+f 13857/14598/11564 25104/14599/11565 30606/14147/11118 23877/14146/11117
+f 13858/14600/11566 13862/14601/11567 13863/14602/11568 13859/14603/11569
+f 13859/14603/11569 13863/14602/11568 25104/14599/11565 25103/14595/11561
+f 13862/14601/11567 23879/14161/11132 23878/14160/11131 13863/14602/11568
+f 13863/14602/11568 23878/14160/11131 30606/14147/11118 25104/14599/11565
+f 13858/14600/11566 13859/14603/11569 13864/14604/11570 13860/14605/11571
+f 13860/14605/11571 13864/14604/11570 23950/14606/11572 23951/14607/11573
+f 13859/14603/11569 25103/14595/11561 25102/14594/11560 13864/14604/11570
+f 13864/14604/11570 25102/14594/11560 30630/14597/11563 23950/14606/11572
+f 13858/14600/11566 13860/14605/11571 13865/14608/11574 13861/14609/11575
+f 13861/14609/11575 13865/14608/11574 25105/14610/11576 25106/14611/11577
+f 13860/14605/11571 23951/14607/11573 23952/14612/11578 13865/14608/11574
+f 13865/14608/11574 23952/14612/11578 30631/14613/11579 25105/14610/11576
+f 13858/14600/11566 13861/14609/11575 13866/14614/11580 13862/14601/11567
+f 13862/14601/11567 13866/14614/11580 23880/14166/11137 23879/14161/11132
+f 13861/14609/11575 25106/14611/11577 25107/14615/11581 13866/14614/11580
+f 13866/14614/11580 25107/14615/11581 30607/14167/11138 23880/14166/11137
+f 13867/14616/11582 13871/14617/11583 13872/14618/11584 13868/14619/11585
+f 13868/14619/11585 13872/14618/11584 25107/14615/11581 25106/14611/11577
+f 13871/14617/11583 23882/14181/11152 23881/14180/11151 13872/14618/11584
+f 13872/14618/11584 23881/14180/11151 30607/14167/11138 25107/14615/11581
+f 13867/14616/11582 13868/14619/11585 13873/14620/11586 13869/14621/11587
+f 13869/14621/11587 13873/14620/11586 23953/14622/11588 23954/14623/11589
+f 13868/14619/11585 25106/14611/11577 25105/14610/11576 13873/14620/11586
+f 13873/14620/11586 25105/14610/11576 30631/14613/11579 23953/14622/11588
+f 13867/14616/11582 13869/14621/11587 13874/14624/11590 13870/14625/11591
+f 13870/14625/11591 13874/14624/11590 25108/14626/11592 25109/14627/11593
+f 13869/14621/11587 23954/14623/11589 23955/14628/11594 13874/14624/11590
+f 13874/14624/11590 23955/14628/11594 30632/14629/11595 25108/14626/11592
+f 13867/14616/11582 13870/14625/11591 13875/14630/11596 13871/14617/11583
+f 13871/14617/11583 13875/14630/11596 23883/14186/11157 23882/14181/11152
+f 13870/14625/11591 25109/14627/11593 25110/14631/11597 13875/14630/11596
+f 13875/14630/11596 25110/14631/11597 30608/14187/11158 23883/14186/11157
+f 13876/14632/11598 13880/14633/11599 13881/14634/11600 13877/14635/11601
+f 13877/14635/11601 13881/14634/11600 25110/14631/11597 25109/14627/11593
+f 13880/14633/11599 23885/14201/11172 23884/14200/11171 13881/14634/11600
+f 13881/14634/11600 23884/14200/11171 30608/14187/11158 25110/14631/11597
+f 13876/14632/11598 13877/14635/11601 13882/14636/11602 13878/14637/11603
+f 13878/14637/11603 13882/14636/11602 23956/14638/11604 23957/14639/11605
+f 13877/14635/11601 25109/14627/11593 25108/14626/11592 13882/14636/11602
+f 13882/14636/11602 25108/14626/11592 30632/14629/11595 23956/14638/11604
+f 13876/14632/11598 13878/14637/11603 13883/14640/11606 13879/14641/11607
+f 13879/14641/11607 13883/14640/11606 25111/14642/11608 25112/14643/11609
+f 13878/14637/11603 23957/14639/11605 23958/14644/11610 13883/14640/11606
+f 13883/14640/11606 23958/14644/11610 30633/14645/11611 25111/14642/11608
+f 13876/14632/11598 13879/14641/11607 13884/14646/11612 13880/14633/11599
+f 13880/14633/11599 13884/14646/11612 23886/14206/11177 23885/14201/11172
+f 13879/14641/11607 25112/14643/11609 25113/14647/11613 13884/14646/11612
+f 13884/14646/11612 25113/14647/11613 30609/14207/11178 23886/14206/11177
+f 13885/14648/11614 13889/14649/11615 13890/14650/11616 13886/14651/11617
+f 13886/14651/11617 13890/14650/11616 25113/14647/11613 25112/14643/11609
+f 13889/14649/11615 23888/14221/11192 23887/14220/11191 13890/14650/11616
+f 13890/14650/11616 23887/14220/11191 30609/14207/11178 25113/14647/11613
+f 13885/14648/11614 13886/14651/11617 13891/14652/11618 13887/14653/11619
+f 13887/14653/11619 13891/14652/11618 23959/14654/11620 23960/14655/11621
+f 13886/14651/11617 25112/14643/11609 25111/14642/11608 13891/14652/11618
+f 13891/14652/11618 25111/14642/11608 30633/14645/11611 23959/14654/11620
+f 13885/14648/11614 13887/14653/11619 13892/14656/11622 13888/14657/11623
+f 13888/14657/11623 13892/14656/11622 25114/14658/11624 25115/14659/11625
+f 13887/14653/11619 23960/14655/11621 23961/14660/11626 13892/14656/11622
+f 13892/14656/11622 23961/14660/11626 30634/14661/11627 25114/14658/11624
+f 13885/14648/11614 13888/14657/11623 13893/14662/11628 13889/14649/11615
+f 13889/14649/11615 13893/14662/11628 23889/14226/11197 23888/14221/11192
+f 13888/14657/11623 25115/14659/11625 25116/14663/11629 13893/14662/11628
+f 13893/14662/11628 25116/14663/11629 30610/14227/11198 23889/14226/11197
+f 13894/14664/11630 13898/14665/11631 13899/14666/11632 13895/14667/11633
+f 13895/14667/11633 13899/14666/11632 25116/14663/11629 25115/14659/11625
+f 13898/14665/11631 23891/14241/11212 23890/14240/11211 13899/14666/11632
+f 13899/14666/11632 23890/14240/11211 30610/14227/11198 25116/14663/11629
+f 13894/14664/11630 13895/14667/11633 13900/14668/11634 13896/14669/11635
+f 13896/14669/11635 13900/14668/11634 23962/14670/11636 23963/14671/11637
+f 13895/14667/11633 25115/14659/11625 25114/14658/11624 13900/14668/11634
+f 13900/14668/11634 25114/14658/11624 30634/14661/11627 23962/14670/11636
+f 13894/14664/11630 13896/14669/11635 13901/14672/11638 13897/14673/11639
+f 13897/14673/11639 13901/14672/11638 25117/14674/11640 25118/14675/11641
+f 13896/14669/11635 23963/14671/11637 23964/14676/11642 13901/14672/11638
+f 13901/14672/11638 23964/14676/11642 30635/14677/11643 25117/14674/11640
+f 13894/14664/11630 13897/14673/11639 13902/14678/11644 13898/14665/11631
+f 13898/14665/11631 13902/14678/11644 23892/14246/11217 23891/14241/11212
+f 13897/14673/11639 25118/14675/11641 25119/14679/11645 13902/14678/11644
+f 13902/14678/11644 25119/14679/11645 30611/14247/11218 23892/14246/11217
+f 13903/14680/11646 13907/14681/11647 13908/14682/11648 13904/14683/11649
+f 13904/14683/11649 13908/14682/11648 25119/14679/11645 25118/14675/11641
+f 13907/14681/11647 23894/14261/11232 23893/14260/11231 13908/14682/11648
+f 13908/14682/11648 23893/14260/11231 30611/14247/11218 25119/14679/11645
+f 13903/14680/11646 13904/14683/11649 13909/14684/11650 13905/14685/11651
+f 13905/14685/11651 13909/14684/11650 23965/14686/11652 23966/14687/11653
+f 13904/14683/11649 25118/14675/11641 25117/14674/11640 13909/14684/11650
+f 13909/14684/11650 25117/14674/11640 30635/14677/11643 23965/14686/11652
+f 13903/14680/11646 13905/14685/11651 13910/14688/11654 13906/14689/11655
+f 13906/14689/11655 13910/14688/11654 25120/14690/11656 25121/14691/11657
+f 13905/14685/11651 23966/14687/11653 23967/14692/11658 13910/14688/11654
+f 13910/14688/11654 23967/14692/11658 30636/14693/11659 25120/14690/11656
+f 13903/14680/11646 13906/14689/11655 13911/14694/11660 13907/14681/11647
+f 13907/14681/11647 13911/14694/11660 23895/14266/11237 23894/14261/11232
+f 13906/14689/11655 25121/14691/11657 25122/14695/11661 13911/14694/11660
+f 13911/14694/11660 25122/14695/11661 30612/14267/11238 23895/14266/11237
+f 13912/14696/11662 13916/14697/11663 13917/14698/11664 13913/14699/11665
+f 13913/14699/11665 13917/14698/11664 25122/14695/11661 25121/14691/11657
+f 13916/14697/11663 23897/14281/11252 23896/14280/11251 13917/14698/11664
+f 13917/14698/11664 23896/14280/11251 30612/14267/11238 25122/14695/11661
+f 13912/14696/11662 13913/14699/11665 13918/14700/11666 13914/14701/11667
+f 13914/14701/11667 13918/14700/11666 23968/14702/11668 23969/14703/11669
+f 13913/14699/11665 25121/14691/11657 25120/14690/11656 13918/14700/11666
+f 13918/14700/11666 25120/14690/11656 30636/14693/11659 23968/14702/11668
+f 13912/14696/11662 13914/14701/11667 13919/14704/11670 13915/14705/11671
+f 13915/14705/11671 13919/14704/11670 25123/14706/11672 25124/14707/11673
+f 13914/14701/11667 23969/14703/11669 23970/14708/11674 13919/14704/11670
+f 13919/14704/11670 23970/14708/11674 30637/14709/11675 25123/14706/11672
+f 13912/14696/11662 13915/14705/11671 13920/14710/11676 13916/14697/11663
+f 13916/14697/11663 13920/14710/11676 23898/14286/11257 23897/14281/11252
+f 13915/14705/11671 25124/14707/11673 25125/14711/11677 13920/14710/11676
+f 13920/14710/11676 25125/14711/11677 30613/14287/11258 23898/14286/11257
+f 13921/14712/11678 13925/14713/11679 13926/14714/11680 13922/14715/11681
+f 13922/14715/11681 13926/14714/11680 25125/14711/11677 25124/14707/11673
+f 13925/14713/11679 23900/14301/11272 23899/14300/11271 13926/14714/11680
+f 13926/14714/11680 23899/14300/11271 30613/14287/11258 25125/14711/11677
+f 13921/14712/11678 13922/14715/11681 13927/14716/11682 13923/14717/11683
+f 13923/14717/11683 13927/14716/11682 23971/14718/11684 23972/14719/11685
+f 13922/14715/11681 25124/14707/11673 25123/14706/11672 13927/14716/11682
+f 13927/14716/11682 25123/14706/11672 30637/14709/11675 23971/14718/11684
+f 13921/14712/11678 13923/14717/11683 13928/14720/11686 13924/14721/11687
+f 13924/14721/11687 13928/14720/11686 25126/14722/11688 25127/14723/11689
+f 13923/14717/11683 23972/14719/11685 23973/14724/11690 13928/14720/11686
+f 13928/14720/11686 23973/14724/11690 30638/14725/11691 25126/14722/11688
+f 13921/14712/11678 13924/14721/11687 13929/14726/11692 13925/14713/11679
+f 13925/14713/11679 13929/14726/11692 23901/14306/11277 23900/14301/11272
+f 13924/14721/11687 25127/14723/11689 25128/14727/11693 13929/14726/11692
+f 13929/14726/11692 25128/14727/11693 30614/14307/11278 23901/14306/11277
+f 13930/14728/11694 13934/14729/11695 13935/14730/11696 13931/14731/11697
+f 13931/14731/11697 13935/14730/11696 25128/14732/11693 25127/14733/11689
+f 13934/14729/11695 23903/14324/11292 23902/14323/11291 13935/14730/11696
+f 13935/14730/11696 23902/14323/11291 30614/14326/11278 25128/14732/11693
+f 13930/14728/11694 13931/14731/11697 13936/14734/11698 13932/14735/11699
+f 13932/14735/11699 13936/14734/11698 23974/14736/11700 23975/14737/11701
+f 13931/14731/11697 25127/14733/11689 25126/14738/11688 13936/14734/11698
+f 13936/14734/11698 25126/14738/11688 30638/14739/11691 23974/14736/11700
+f 13930/14728/11694 13932/14735/11699 13937/14740/11702 13933/14741/11703
+f 13933/14741/11703 13937/14740/11702 25129/14742/11704 25130/14743/11705
+f 13932/14735/11699 23975/14737/11701 23976/14744/11706 13937/14740/11702
+f 13937/14740/11702 23976/14744/11706 30639/14745/11707 25129/14742/11704
+f 13930/14728/11694 13933/14741/11703 13938/14746/11708 13934/14729/11695
+f 13934/14729/11695 13938/14746/11708 23904/14331/11297 23903/14324/11292
+f 13933/14741/11703 25130/14743/11705 25131/14747/11709 13938/14746/11708
+f 13938/14746/11708 25131/14747/11709 30615/14332/11298 23904/14331/11297
+f 13939/14748/11710 13943/14749/11711 13944/14750/11712 13940/14751/11713
+f 13940/14751/11713 13944/14750/11712 25131/14747/11709 25130/14743/11705
+f 13943/14749/11711 23906/14346/11312 23905/14345/11311 13944/14750/11712
+f 13944/14750/11712 23905/14345/11311 30615/14332/11298 25131/14747/11709
+f 13939/14748/11710 13940/14751/11713 13945/14752/11714 13941/14753/11715
+f 13941/14753/11715 13945/14752/11714 23977/14754/11716 23978/14755/11717
+f 13940/14751/11713 25130/14743/11705 25129/14742/11704 13945/14752/11714
+f 13945/14752/11714 25129/14742/11704 30639/14745/11707 23977/14754/11716
+f 13939/14748/11710 13941/14753/11715 13946/14756/11718 13942/14757/11719
+f 13942/14757/11719 13946/14756/11718 25132/14758/11720 25133/14759/11721
+f 13941/14753/11715 23978/14755/11717 23979/14760/11722 13946/14756/11718
+f 13946/14756/11718 23979/14760/11722 30640/14761/11723 25132/14758/11720
+f 13939/14748/11710 13942/14757/11719 13947/14762/11724 13943/14749/11711
+f 13943/14749/11711 13947/14762/11724 23907/14351/11317 23906/14346/11312
+f 13942/14757/11719 25133/14759/11721 25134/14763/11725 13947/14762/11724
+f 13947/14762/11724 25134/14763/11725 30616/14352/11318 23907/14351/11317
+f 13948/14764/11726 13952/14765/11727 13953/14766/11728 13949/14767/11729
+f 13949/14767/11729 13953/14766/11728 25134/14763/11725 25133/14759/11721
+f 13952/14765/11727 23909/14366/11332 23908/14365/11331 13953/14766/11728
+f 13953/14766/11728 23908/14365/11331 30616/14352/11318 25134/14763/11725
+f 13948/14764/11726 13949/14767/11729 13954/14768/11730 13950/14769/11731
+f 13950/14769/11731 13954/14768/11730 23980/14770/11732 23981/14771/11733
+f 13949/14767/11729 25133/14759/11721 25132/14758/11720 13954/14768/11730
+f 13954/14768/11730 25132/14758/11720 30640/14761/11723 23980/14770/11732
+f 13948/14764/11726 13950/14769/11731 13955/14772/11734 13951/14773/11735
+f 13951/14773/11735 13955/14772/11734 25135/14774/11736 25136/14775/11737
+f 13950/14769/11731 23981/14771/11733 23982/14776/11738 13955/14772/11734
+f 13955/14772/11734 23982/14776/11738 30641/14777/11739 25135/14774/11736
+f 13948/14764/11726 13951/14773/11735 13956/14778/11740 13952/14765/11727
+f 13952/14765/11727 13956/14778/11740 23910/14371/11337 23909/14366/11332
+f 13951/14773/11735 25136/14775/11737 25137/14779/11741 13956/14778/11740
+f 13956/14778/11740 25137/14779/11741 30617/14372/11338 23910/14371/11337
+f 13957/14780/11742 13961/14781/11743 13962/14782/11744 13958/14783/11745
+f 13958/14783/11745 13962/14782/11744 25137/14779/11741 25136/14775/11737
+f 13961/14781/11743 23912/14386/11352 23911/14385/11351 13962/14782/11744
+f 13962/14782/11744 23911/14385/11351 30617/14372/11338 25137/14779/11741
+f 13957/14780/11742 13958/14783/11745 13963/14784/11746 13959/14785/11747
+f 13959/14785/11747 13963/14784/11746 23983/14786/11748 23984/14787/11749
+f 13958/14783/11745 25136/14775/11737 25135/14774/11736 13963/14784/11746
+f 13963/14784/11746 25135/14774/11736 30641/14777/11739 23983/14786/11748
+f 13957/14780/11742 13959/14785/11747 13964/14788/11750 13960/14789/11751
+f 13960/14789/11751 13964/14788/11750 25138/14790/11752 25139/14791/11753
+f 13959/14785/11747 23984/14787/11749 23985/14792/11754 13964/14788/11750
+f 13964/14788/11750 23985/14792/11754 30642/14793/11755 25138/14790/11752
+f 13957/14780/11742 13960/14789/11751 13965/14794/11756 13961/14781/11743
+f 13961/14781/11743 13965/14794/11756 23913/14391/11357 23912/14386/11352
+f 13960/14789/11751 25139/14791/11753 25140/14795/11757 13965/14794/11756
+f 13965/14794/11756 25140/14795/11757 30618/14392/11358 23913/14391/11357
+f 13966/14796/11758 13970/14797/11759 13971/14798/11760 13967/14799/11761
+f 13967/14799/11761 13971/14798/11760 25140/14795/11757 25139/14791/11753
+f 13970/14797/11759 23915/14406/11372 23914/14405/11371 13971/14798/11760
+f 13971/14798/11760 23914/14405/11371 30618/14392/11358 25140/14795/11757
+f 13966/14796/11758 13967/14799/11761 13972/14800/11762 13968/14801/11763
+f 13968/14801/11763 13972/14800/11762 23986/14802/11764 23987/14803/11765
+f 13967/14799/11761 25139/14791/11753 25138/14790/11752 13972/14800/11762
+f 13972/14800/11762 25138/14790/11752 30642/14793/11755 23986/14802/11764
+f 13966/14796/11758 13968/14801/11763 13973/14804/11766 13969/14805/11767
+f 13969/14805/11767 13973/14804/11766 25141/14806/11768 25142/14807/11769
+f 13968/14801/11763 23987/14803/11765 23988/14808/11770 13973/14804/11766
+f 13973/14804/11766 23988/14808/11770 30643/14809/11771 25141/14806/11768
+f 13966/14796/11758 13969/14805/11767 13974/14810/11772 13970/14797/11759
+f 13970/14797/11759 13974/14810/11772 23916/14411/11377 23915/14406/11372
+f 13969/14805/11767 25142/14807/11769 25143/14811/11773 13974/14810/11772
+f 13974/14810/11772 25143/14811/11773 30619/14412/11378 23916/14411/11377
+f 13975/14812/11774 13979/14813/11775 13980/14814/11776 13976/14815/11777
+f 13976/14815/11777 13980/14814/11776 25143/14811/11773 25142/14807/11769
+f 13979/14813/11775 23918/14426/11392 23917/14425/11391 13980/14814/11776
+f 13980/14814/11776 23917/14425/11391 30619/14412/11378 25143/14811/11773
+f 13975/14812/11774 13976/14815/11777 13981/14816/11778 13977/14817/11779
+f 13977/14817/11779 13981/14816/11778 23989/14818/11780 23990/14819/11781
+f 13976/14815/11777 25142/14807/11769 25141/14806/11768 13981/14816/11778
+f 13981/14816/11778 25141/14806/11768 30643/14809/11771 23989/14818/11780
+f 13975/14812/11774 13977/14817/11779 13982/14820/11782 13978/14821/11783
+f 13978/14821/11783 13982/14820/11782 25144/14822/11784 25145/14823/11785
+f 13977/14817/11779 23990/14819/11781 23991/14824/11786 13982/14820/11782
+f 13982/14820/11782 23991/14824/11786 30644/14825/11787 25144/14822/11784
+f 13975/14812/11774 13978/14821/11783 13983/14826/11788 13979/14813/11775
+f 13979/14813/11775 13983/14826/11788 23919/14431/11397 23918/14426/11392
+f 13978/14821/11783 25145/14823/11785 25146/14827/11789 13983/14826/11788
+f 13983/14826/11788 25146/14827/11789 30620/14432/11398 23919/14431/11397
+f 13984/14828/11790 13988/14829/11791 13989/14830/11792 13985/14831/11793
+f 13985/14831/11793 13989/14830/11792 25146/14827/11789 25145/14823/11785
+f 13988/14829/11791 23921/14446/11412 23920/14445/11411 13989/14830/11792
+f 13989/14830/11792 23920/14445/11411 30620/14432/11398 25146/14827/11789
+f 13984/14828/11790 13985/14831/11793 13990/14832/11794 13986/14833/11795
+f 13986/14833/11795 13990/14832/11794 23992/14834/11796 23993/14835/11797
+f 13985/14831/11793 25145/14823/11785 25144/14822/11784 13990/14832/11794
+f 13990/14832/11794 25144/14822/11784 30644/14825/11787 23992/14834/11796
+f 13984/14828/11790 13986/14833/11795 13991/14836/11798 13987/14837/11799
+f 13987/14837/11799 13991/14836/11798 25077/14462/11428 25076/14457/11423
+f 13986/14833/11795 23993/14835/11797 23994/14838/11800 13991/14836/11798
+f 13991/14836/11798 23994/14838/11800 30621/14463/11429 25077/14462/11428
+f 13984/14828/11790 13987/14837/11799 13992/14839/11801 13988/14829/11791
+f 13988/14829/11791 13992/14839/11801 23922/14449/11415 23921/14446/11412
+f 13987/14837/11799 25076/14457/11423 25075/14456/11422 13992/14839/11801
+f 13992/14839/11801 25075/14456/11422 30597/13981/10952 23922/14449/11415
+f 13993/14840/11802 13997/14841/11803 13998/14842/11804 13994/14843/11805
+f 13994/14843/11805 13998/14842/11804 25147/14844/11806 25148/14845/11807
+f 13997/14841/11803 23924/14461/11427 23923/14460/11426 13998/14842/11804
+f 13998/14842/11804 23923/14460/11426 30621/14463/11429 25147/14844/11806
+f 13993/14840/11802 13994/14843/11805 13999/14846/11808 13995/14847/11809
+f 13995/14847/11809 13999/14846/11808 23995/14848/11810 23996/14849/11811
+f 13994/14843/11805 25148/14845/11807 25149/14850/11812 13999/14846/11808
+f 13999/14846/11808 25149/14850/11812 30645/14851/11813 23995/14848/11810
+f 13993/14840/11802 13995/14847/11809 14000/14852/11814 13996/14853/11815
+f 13996/14853/11815 14000/14852/11814 25150/14854/11816 25151/14855/11817
+f 13995/14847/11809 23996/14849/11811 23997/14856/11818 14000/14852/11814
+f 14000/14852/11814 23997/14856/11818 30646/14857/11819 25150/14854/11816
+f 13993/14840/11802 13996/14853/11815 14001/14858/11820 13997/14841/11803
+f 13997/14841/11803 14001/14858/11820 23925/14468/11434 23924/14461/11427
+f 13996/14853/11815 25151/14855/11817 25152/14859/11821 14001/14858/11820
+f 14001/14858/11820 25152/14859/11821 30622/14469/11435 23925/14468/11434
+f 14002/14860/11822 14006/14861/11823 14007/14862/11824 14003/14863/11825
+f 14003/14863/11825 14007/14862/11824 25152/14859/11821 25151/14855/11817
+f 14006/14861/11823 23927/14479/11445 23926/14478/11444 14007/14862/11824
+f 14007/14862/11824 23926/14478/11444 30622/14469/11435 25152/14859/11821
+f 14002/14860/11822 14003/14863/11825 14008/14864/11826 14004/14865/11827
+f 14004/14865/11827 14008/14864/11826 23998/14866/11828 23999/14867/11829
+f 14003/14863/11825 25151/14855/11817 25150/14854/11816 14008/14864/11826
+f 14008/14864/11826 25150/14854/11816 30646/14857/11819 23998/14866/11828
+f 14002/14860/11822 14004/14865/11827 14009/14868/11830 14005/14869/11831
+f 14005/14869/11831 14009/14868/11830 25153/14870/11832 25154/14871/11833
+f 14004/14865/11827 23999/14867/11829 24000/14872/11834 14009/14868/11830
+f 14009/14868/11830 24000/14872/11834 30647/14873/11835 25153/14870/11832
+f 14002/14860/11822 14005/14869/11831 14010/14874/11836 14006/14861/11823
+f 14006/14861/11823 14010/14874/11836 23928/14484/11450 23927/14479/11445
+f 14005/14869/11831 25154/14871/11833 25155/14875/11837 14010/14874/11836
+f 14010/14874/11836 25155/14875/11837 30623/14485/11451 23928/14484/11450
+f 14011/14876/11838 14015/14877/11839 14016/14878/11840 14012/14879/11841
+f 14012/14879/11841 14016/14878/11840 25155/14875/11837 25154/14871/11833
+f 14015/14877/11839 23930/14495/11461 23929/14494/11460 14016/14878/11840
+f 14016/14878/11840 23929/14494/11460 30623/14485/11451 25155/14875/11837
+f 14011/14876/11838 14012/14879/11841 14017/14880/11842 14013/14881/11843
+f 14013/14881/11843 14017/14880/11842 24001/14882/11844 24002/14883/11845
+f 14012/14879/11841 25154/14871/11833 25153/14870/11832 14017/14880/11842
+f 14017/14880/11842 25153/14870/11832 30647/14873/11835 24001/14882/11844
+f 14011/14876/11838 14013/14881/11843 14018/14884/11846 14014/14885/11847
+f 14014/14885/11847 14018/14884/11846 25156/14886/11848 25157/14887/11849
+f 14013/14881/11843 24002/14883/11845 24003/14888/11850 14018/14884/11846
+f 14018/14884/11846 24003/14888/11850 30648/14889/11851 25156/14886/11848
+f 14011/14876/11838 14014/14885/11847 14019/14890/11852 14015/14877/11839
+f 14015/14877/11839 14019/14890/11852 23931/14500/11466 23930/14495/11461
+f 14014/14885/11847 25157/14887/11849 25158/14891/11853 14019/14890/11852
+f 14019/14890/11852 25158/14891/11853 30624/14501/11467 23931/14500/11466
+f 14020/14892/11854 14024/14893/11855 14025/14894/11856 14021/14895/11857
+f 14021/14895/11857 14025/14894/11856 25158/14891/11853 25157/14887/11849
+f 14024/14893/11855 23933/14511/11477 23932/14510/11476 14025/14894/11856
+f 14025/14894/11856 23932/14510/11476 30624/14501/11467 25158/14891/11853
+f 14020/14892/11854 14021/14895/11857 14026/14896/11858 14022/14897/11859
+f 14022/14897/11859 14026/14896/11858 24004/14898/11860 24005/14899/11861
+f 14021/14895/11857 25157/14887/11849 25156/14886/11848 14026/14896/11858
+f 14026/14896/11858 25156/14886/11848 30648/14889/11851 24004/14898/11860
+f 14020/14892/11854 14022/14897/11859 14027/14900/11862 14023/14901/11863
+f 14023/14901/11863 14027/14900/11862 25159/14902/11864 25160/14903/11865
+f 14022/14897/11859 24005/14899/11861 24006/14904/11866 14027/14900/11862
+f 14027/14900/11862 24006/14904/11866 30649/14905/11867 25159/14902/11864
+f 14020/14892/11854 14023/14901/11863 14028/14906/11868 14024/14893/11855
+f 14024/14893/11855 14028/14906/11868 23934/14516/11482 23933/14511/11477
+f 14023/14901/11863 25160/14903/11865 25161/14907/11869 14028/14906/11868
+f 14028/14906/11868 25161/14907/11869 30625/14517/11483 23934/14516/11482
+f 14029/14908/11870 14033/14909/11871 14034/14910/11872 14030/14911/11873
+f 14030/14911/11873 14034/14910/11872 25161/14907/11869 25160/14903/11865
+f 14033/14909/11871 23936/14527/11493 23935/14526/11492 14034/14910/11872
+f 14034/14910/11872 23935/14526/11492 30625/14517/11483 25161/14907/11869
+f 14029/14908/11870 14030/14911/11873 14035/14912/11874 14031/14913/11875
+f 14031/14913/11875 14035/14912/11874 24007/14914/11876 24008/14915/11877
+f 14030/14911/11873 25160/14903/11865 25159/14902/11864 14035/14912/11874
+f 14035/14912/11874 25159/14902/11864 30649/14905/11867 24007/14914/11876
+f 14029/14908/11870 14031/14913/11875 14036/14916/11878 14032/14917/11879
+f 14032/14917/11879 14036/14916/11878 25162/14918/11880 25163/14919/11881
+f 14031/14913/11875 24008/14915/11877 24009/14920/11882 14036/14916/11878
+f 14036/14916/11878 24009/14920/11882 30650/14921/11883 25162/14918/11880
+f 14029/14908/11870 14032/14917/11879 14037/14922/11884 14033/14909/11871
+f 14033/14909/11871 14037/14922/11884 23937/14532/11498 23936/14527/11493
+f 14032/14917/11879 25163/14919/11881 25164/14923/11885 14037/14922/11884
+f 14037/14922/11884 25164/14923/11885 30626/14533/11499 23937/14532/11498
+f 14038/14924/11886 14042/14925/11887 14043/14926/11888 14039/14927/11889
+f 14039/14927/11889 14043/14926/11888 25164/14923/11885 25163/14919/11881
+f 14042/14925/11887 23939/14543/11509 23938/14542/11508 14043/14926/11888
+f 14043/14926/11888 23938/14542/11508 30626/14533/11499 25164/14923/11885
+f 14038/14924/11886 14039/14927/11889 14044/14928/11890 14040/14929/11891
+f 14040/14929/11891 14044/14928/11890 24010/14930/11892 24011/14931/11893
+f 14039/14927/11889 25163/14919/11881 25162/14918/11880 14044/14928/11890
+f 14044/14928/11890 25162/14918/11880 30650/14921/11883 24010/14930/11892
+f 14038/14924/11886 14040/14929/11891 14045/14932/11894 14041/14933/11895
+f 14041/14933/11895 14045/14932/11894 25165/14934/11896 25166/14935/11897
+f 14040/14929/11891 24011/14931/11893 24012/14936/11898 14045/14932/11894
+f 14045/14932/11894 24012/14936/11898 30651/14937/11899 25165/14934/11896
+f 14038/14924/11886 14041/14933/11895 14046/14938/11900 14042/14925/11887
+f 14042/14925/11887 14046/14938/11900 23940/14548/11514 23939/14543/11509
+f 14041/14933/11895 25166/14935/11897 25167/14939/11901 14046/14938/11900
+f 14046/14938/11900 25167/14939/11901 30627/14549/11515 23940/14548/11514
+f 14047/14940/11902 14051/14941/11903 14052/14942/11904 14048/14943/11905
+f 14048/14943/11905 14052/14942/11904 25167/14939/11901 25166/14935/11897
+f 14051/14941/11903 23942/14559/11525 23941/14558/11524 14052/14942/11904
+f 14052/14942/11904 23941/14558/11524 30627/14549/11515 25167/14939/11901
+f 14047/14940/11902 14048/14943/11905 14053/14944/11906 14049/14945/11907
+f 14049/14945/11907 14053/14944/11906 24013/14946/11908 24014/14947/11909
+f 14048/14943/11905 25166/14935/11897 25165/14934/11896 14053/14944/11906
+f 14053/14944/11906 25165/14934/11896 30651/14937/11899 24013/14946/11908
+f 14047/14940/11902 14049/14945/11907 14054/14948/11910 14050/14949/11911
+f 14050/14949/11911 14054/14948/11910 25168/14950/11912 25169/14951/11913
+f 14049/14945/11907 24014/14947/11909 24015/14952/11914 14054/14948/11910
+f 14054/14948/11910 24015/14952/11914 30652/14953/11915 25168/14950/11912
+f 14047/14940/11902 14050/14949/11911 14055/14954/11916 14051/14941/11903
+f 14051/14941/11903 14055/14954/11916 23943/14564/11530 23942/14559/11525
+f 14050/14949/11911 25169/14951/11913 25170/14955/11917 14055/14954/11916
+f 14055/14954/11916 25170/14955/11917 30628/14565/11531 23943/14564/11530
+f 14056/14956/11918 14060/14957/11919 14061/14958/11920 14057/14959/11921
+f 14057/14959/11921 14061/14958/11920 25170/14955/11917 25169/14951/11913
+f 14060/14957/11919 23945/14575/11541 23944/14574/11540 14061/14958/11920
+f 14061/14958/11920 23944/14574/11540 30628/14565/11531 25170/14955/11917
+f 14056/14956/11918 14057/14959/11921 14062/14960/11922 14058/14961/11923
+f 14058/14961/11923 14062/14960/11922 24016/14962/11924 24017/14963/11925
+f 14057/14959/11921 25169/14951/11913 25168/14950/11912 14062/14960/11922
+f 14062/14960/11922 25168/14950/11912 30652/14953/11915 24016/14962/11924
+f 14056/14956/11918 14058/14961/11923 14063/14964/11926 14059/14965/11927
+f 14059/14965/11927 14063/14964/11926 25171/14966/11928 25172/14967/11929
+f 14058/14961/11923 24017/14963/11925 24018/14968/11930 14063/14964/11926
+f 14063/14964/11926 24018/14968/11930 30653/14969/11931 25171/14966/11928
+f 14056/14956/11918 14059/14965/11927 14064/14970/11932 14060/14957/11919
+f 14060/14957/11919 14064/14970/11932 23946/14580/11546 23945/14575/11541
+f 14059/14965/11927 25172/14967/11929 25173/14971/11933 14064/14970/11932
+f 14064/14970/11932 25173/14971/11933 30629/14581/11547 23946/14580/11546
+f 14065/14972/11934 14069/14973/11935 14070/14974/11936 14066/14975/11937
+f 14066/14975/11937 14070/14974/11936 25173/14971/11933 25172/14967/11929
+f 14069/14973/11935 23948/14591/11557 23947/14590/11556 14070/14974/11936
+f 14070/14974/11936 23947/14590/11556 30629/14581/11547 25173/14971/11933
+f 14065/14972/11934 14066/14975/11937 14071/14976/11938 14067/14977/11939
+f 14067/14977/11939 14071/14976/11938 24019/14978/11940 24020/14979/11941
+f 14066/14975/11937 25172/14967/11929 25171/14966/11928 14071/14976/11938
+f 14071/14976/11938 25171/14966/11928 30653/14969/11931 24019/14978/11940
+f 14065/14972/11934 14067/14977/11939 14072/14980/11942 14068/14981/11943
+f 14068/14981/11943 14072/14980/11942 25174/14982/11944 25175/14983/11945
+f 14067/14977/11939 24020/14979/11941 24021/14984/11946 14072/14980/11942
+f 14072/14980/11942 24021/14984/11946 30654/14985/11947 25174/14982/11944
+f 14065/14972/11934 14068/14981/11943 14073/14986/11948 14069/14973/11935
+f 14069/14973/11935 14073/14986/11948 23949/14596/11562 23948/14591/11557
+f 14068/14981/11943 25175/14983/11945 25176/14987/11949 14073/14986/11948
+f 14073/14986/11948 25176/14987/11949 30630/14597/11563 23949/14596/11562
+f 14074/14988/11950 14078/14989/11951 14079/14990/11952 14075/14991/11953
+f 14075/14991/11953 14079/14990/11952 25176/14987/11949 25175/14983/11945
+f 14078/14989/11951 23951/14607/11573 23950/14606/11572 14079/14990/11952
+f 14079/14990/11952 23950/14606/11572 30630/14597/11563 25176/14987/11949
+f 14074/14988/11950 14075/14991/11953 14080/14992/11954 14076/14993/11955
+f 14076/14993/11955 14080/14992/11954 24022/14994/11956 24023/14995/11957
+f 14075/14991/11953 25175/14983/11945 25174/14982/11944 14080/14992/11954
+f 14080/14992/11954 25174/14982/11944 30654/14985/11947 24022/14994/11956
+f 14074/14988/11950 14076/14993/11955 14081/14996/11958 14077/14997/11959
+f 14077/14997/11959 14081/14996/11958 25177/14998/11960 25178/14999/11961
+f 14076/14993/11955 24023/14995/11957 24024/15000/11962 14081/14996/11958
+f 14081/14996/11958 24024/15000/11962 30655/15001/11963 25177/14998/11960
+f 14074/14988/11950 14077/14997/11959 14082/15002/11964 14078/14989/11951
+f 14078/14989/11951 14082/15002/11964 23952/14612/11578 23951/14607/11573
+f 14077/14997/11959 25178/14999/11961 25179/15003/11965 14082/15002/11964
+f 14082/15002/11964 25179/15003/11965 30631/14613/11579 23952/14612/11578
+f 14083/15004/11966 14087/15005/11967 14088/15006/11968 14084/15007/11969
+f 14084/15007/11969 14088/15006/11968 25179/15003/11965 25178/14999/11961
+f 14087/15005/11967 23954/14623/11589 23953/14622/11588 14088/15006/11968
+f 14088/15006/11968 23953/14622/11588 30631/14613/11579 25179/15003/11965
+f 14083/15004/11966 14084/15007/11969 14089/15008/11970 14085/15009/11971
+f 14085/15009/11971 14089/15008/11970 24025/15010/11972 24026/15011/11973
+f 14084/15007/11969 25178/14999/11961 25177/14998/11960 14089/15008/11970
+f 14089/15008/11970 25177/14998/11960 30655/15001/11963 24025/15010/11972
+f 14083/15004/11966 14085/15009/11971 14090/15012/11974 14086/15013/11975
+f 14086/15013/11975 14090/15012/11974 25180/15014/11976 25181/15015/11977
+f 14085/15009/11971 24026/15011/11973 24027/15016/11978 14090/15012/11974
+f 14090/15012/11974 24027/15016/11978 30656/15017/11979 25180/15014/11976
+f 14083/15004/11966 14086/15013/11975 14091/15018/11980 14087/15005/11967
+f 14087/15005/11967 14091/15018/11980 23955/14628/11594 23954/14623/11589
+f 14086/15013/11975 25181/15015/11977 25182/15019/11981 14091/15018/11980
+f 14091/15018/11980 25182/15019/11981 30632/14629/11595 23955/14628/11594
+f 14092/15020/11982 14096/15021/11983 14097/15022/11984 14093/15023/11985
+f 14093/15023/11985 14097/15022/11984 25182/15019/11981 25181/15015/11977
+f 14096/15021/11983 23957/14639/11605 23956/14638/11604 14097/15022/11984
+f 14097/15022/11984 23956/14638/11604 30632/14629/11595 25182/15019/11981
+f 14092/15020/11982 14093/15023/11985 14098/15024/11986 14094/15025/11987
+f 14094/15025/11987 14098/15024/11986 24028/15026/11988 24029/15027/11989
+f 14093/15023/11985 25181/15015/11977 25180/15014/11976 14098/15024/11986
+f 14098/15024/11986 25180/15014/11976 30656/15017/11979 24028/15026/11988
+f 14092/15020/11982 14094/15025/11987 14099/15028/11990 14095/15029/11991
+f 14095/15029/11991 14099/15028/11990 25183/15030/11992 25184/15031/11993
+f 14094/15025/11987 24029/15027/11989 24030/15032/11994 14099/15028/11990
+f 14099/15028/11990 24030/15032/11994 30657/15033/11995 25183/15030/11992
+f 14092/15020/11982 14095/15029/11991 14100/15034/11996 14096/15021/11983
+f 14096/15021/11983 14100/15034/11996 23958/14644/11610 23957/14639/11605
+f 14095/15029/11991 25184/15031/11993 25185/15035/11997 14100/15034/11996
+f 14100/15034/11996 25185/15035/11997 30633/14645/11611 23958/14644/11610
+f 14101/15036/11998 14105/15037/11999 14106/15038/12000 14102/15039/12001
+f 14102/15039/12001 14106/15038/12000 25185/15035/11997 25184/15031/11993
+f 14105/15037/11999 23960/14655/11621 23959/14654/11620 14106/15038/12000
+f 14106/15038/12000 23959/14654/11620 30633/14645/11611 25185/15035/11997
+f 14101/15036/11998 14102/15039/12001 14107/15040/12002 14103/15041/12003
+f 14103/15041/12003 14107/15040/12002 24031/15042/12004 24032/15043/12005
+f 14102/15039/12001 25184/15031/11993 25183/15030/11992 14107/15040/12002
+f 14107/15040/12002 25183/15030/11992 30657/15033/11995 24031/15042/12004
+f 14101/15036/11998 14103/15041/12003 14108/15044/12006 14104/15045/12007
+f 14104/15045/12007 14108/15044/12006 25186/15046/12008 25187/15047/12009
+f 14103/15041/12003 24032/15043/12005 24033/15048/12010 14108/15044/12006
+f 14108/15044/12006 24033/15048/12010 30658/15049/12011 25186/15046/12008
+f 14101/15036/11998 14104/15045/12007 14109/15050/12012 14105/15037/11999
+f 14105/15037/11999 14109/15050/12012 23961/14660/11626 23960/14655/11621
+f 14104/15045/12007 25187/15047/12009 25188/15051/12013 14109/15050/12012
+f 14109/15050/12012 25188/15051/12013 30634/14661/11627 23961/14660/11626
+f 14110/15052/12014 14114/15053/12015 14115/15054/12016 14111/15055/12017
+f 14111/15055/12017 14115/15054/12016 25188/15051/12013 25187/15047/12009
+f 14114/15053/12015 23963/14671/11637 23962/14670/11636 14115/15054/12016
+f 14115/15054/12016 23962/14670/11636 30634/14661/11627 25188/15051/12013
+f 14110/15052/12014 14111/15055/12017 14116/15056/12018 14112/15057/12019
+f 14112/15057/12019 14116/15056/12018 24034/15058/12020 24035/15059/12021
+f 14111/15055/12017 25187/15047/12009 25186/15046/12008 14116/15056/12018
+f 14116/15056/12018 25186/15046/12008 30658/15049/12011 24034/15058/12020
+f 14110/15052/12014 14112/15057/12019 14117/15060/12022 14113/15061/12023
+f 14113/15061/12023 14117/15060/12022 25189/15062/12024 25190/15063/12025
+f 14112/15057/12019 24035/15059/12021 24036/15064/12026 14117/15060/12022
+f 14117/15060/12022 24036/15064/12026 30659/15065/12027 25189/15062/12024
+f 14110/15052/12014 14113/15061/12023 14118/15066/12028 14114/15053/12015
+f 14114/15053/12015 14118/15066/12028 23964/14676/11642 23963/14671/11637
+f 14113/15061/12023 25190/15063/12025 25191/15067/12029 14118/15066/12028
+f 14118/15066/12028 25191/15067/12029 30635/14677/11643 23964/14676/11642
+f 14119/15068/12030 14123/15069/12031 14124/15070/12032 14120/15071/12033
+f 14120/15071/12033 14124/15070/12032 25191/15067/12029 25190/15063/12025
+f 14123/15069/12031 23966/14687/11653 23965/14686/11652 14124/15070/12032
+f 14124/15070/12032 23965/14686/11652 30635/14677/11643 25191/15067/12029
+f 14119/15068/12030 14120/15071/12033 14125/15072/12034 14121/15073/12035
+f 14121/15073/12035 14125/15072/12034 24037/15074/12036 24038/15075/12037
+f 14120/15071/12033 25190/15063/12025 25189/15062/12024 14125/15072/12034
+f 14125/15072/12034 25189/15062/12024 30659/15065/12027 24037/15074/12036
+f 14119/15068/12030 14121/15073/12035 14126/15076/12038 14122/15077/12039
+f 14122/15077/12039 14126/15076/12038 25192/15078/12040 25193/15079/12041
+f 14121/15073/12035 24038/15075/12037 24039/15080/12042 14126/15076/12038
+f 14126/15076/12038 24039/15080/12042 30660/15081/12043 25192/15078/12040
+f 14119/15068/12030 14122/15077/12039 14127/15082/12044 14123/15069/12031
+f 14123/15069/12031 14127/15082/12044 23967/14692/11658 23966/14687/11653
+f 14122/15077/12039 25193/15079/12041 25194/15083/12045 14127/15082/12044
+f 14127/15082/12044 25194/15083/12045 30636/14693/11659 23967/14692/11658
+f 14128/15084/12046 14132/15085/12047 14133/15086/12048 14129/15087/12049
+f 14129/15087/12049 14133/15086/12048 25194/15083/12045 25193/15079/12041
+f 14132/15085/12047 23969/14703/11669 23968/14702/11668 14133/15086/12048
+f 14133/15086/12048 23968/14702/11668 30636/14693/11659 25194/15083/12045
+f 14128/15084/12046 14129/15087/12049 14134/15088/12050 14130/15089/12051
+f 14130/15089/12051 14134/15088/12050 24040/15090/12052 24041/15091/12053
+f 14129/15087/12049 25193/15079/12041 25192/15078/12040 14134/15088/12050
+f 14134/15088/12050 25192/15078/12040 30660/15081/12043 24040/15090/12052
+f 14128/15084/12046 14130/15089/12051 14135/15092/12054 14131/15093/12055
+f 14131/15093/12055 14135/15092/12054 25195/15094/12056 25196/15095/12057
+f 14130/15089/12051 24041/15091/12053 24042/15096/12058 14135/15092/12054
+f 14135/15092/12054 24042/15096/12058 30661/15097/12059 25195/15094/12056
+f 14128/15084/12046 14131/15093/12055 14136/15098/12060 14132/15085/12047
+f 14132/15085/12047 14136/15098/12060 23970/14708/11674 23969/14703/11669
+f 14131/15093/12055 25196/15095/12057 25197/15099/12061 14136/15098/12060
+f 14136/15098/12060 25197/15099/12061 30637/14709/11675 23970/14708/11674
+f 14137/15100/12062 14141/15101/12063 14142/15102/12064 14138/15103/12065
+f 14138/15103/12065 14142/15102/12064 25197/15099/12061 25196/15095/12057
+f 14141/15101/12063 23972/14719/11685 23971/14718/11684 14142/15102/12064
+f 14142/15102/12064 23971/14718/11684 30637/14709/11675 25197/15099/12061
+f 14137/15100/12062 14138/15103/12065 14143/15104/12066 14139/15105/12067
+f 14139/15105/12067 14143/15104/12066 24043/15106/12068 24044/15107/12069
+f 14138/15103/12065 25196/15095/12057 25195/15094/12056 14143/15104/12066
+f 14143/15104/12066 25195/15094/12056 30661/15097/12059 24043/15106/12068
+f 14137/15100/12062 14139/15105/12067 14144/15108/12070 14140/15109/12071
+f 14140/15109/12071 14144/15108/12070 25198/15110/12072 25199/15111/12073
+f 14139/15105/12067 24044/15107/12069 24045/15112/12074 14144/15108/12070
+f 14144/15108/12070 24045/15112/12074 30662/15113/12075 25198/15110/12072
+f 14137/15100/12062 14140/15109/12071 14145/15114/12076 14141/15101/12063
+f 14141/15101/12063 14145/15114/12076 23973/14724/11690 23972/14719/11685
+f 14140/15109/12071 25199/15111/12073 25200/15115/12077 14145/15114/12076
+f 14145/15114/12076 25200/15115/12077 30638/14725/11691 23973/14724/11690
+f 14146/15116/12078 14150/15117/12079 14151/15118/12080 14147/15119/12081
+f 14147/15119/12081 14151/15118/12080 25200/15120/12077 25199/15121/12073
+f 14150/15117/12079 23975/14737/11701 23974/14736/11700 14151/15118/12080
+f 14151/15118/12080 23974/14736/11700 30638/14739/11691 25200/15120/12077
+f 14146/15116/12078 14147/15119/12081 14152/15122/12082 14148/15123/12083
+f 14148/15123/12083 14152/15122/12082 24046/15124/12084 24047/15125/12085
+f 14147/15119/12081 25199/15121/12073 25198/15126/12072 14152/15122/12082
+f 14152/15122/12082 25198/15126/12072 30662/15127/12075 24046/15124/12084
+f 14146/15116/12078 14148/15123/12083 14153/15128/12086 14149/15129/12087
+f 14149/15129/12087 14153/15128/12086 25201/15130/12088 25202/15131/12089
+f 14148/15123/12083 24047/15125/12085 24048/15132/12090 14153/15128/12086
+f 14153/15128/12086 24048/15132/12090 30663/15133/12091 25201/15130/12088
+f 14146/15116/12078 14149/15129/12087 14154/15134/12092 14150/15117/12079
+f 14150/15117/12079 14154/15134/12092 23976/14744/11706 23975/14737/11701
+f 14149/15129/12087 25202/15131/12089 25203/15135/12093 14154/15134/12092
+f 14154/15134/12092 25203/15135/12093 30639/14745/11707 23976/14744/11706
+f 14155/15136/12094 14159/15137/12095 14160/15138/12096 14156/15139/12097
+f 14156/15139/12097 14160/15138/12096 25203/15135/12093 25202/15131/12089
+f 14159/15137/12095 23978/14755/11717 23977/14754/11716 14160/15138/12096
+f 14160/15138/12096 23977/14754/11716 30639/14745/11707 25203/15135/12093
+f 14155/15136/12094 14156/15139/12097 14161/15140/12098 14157/15141/12099
+f 14157/15141/12099 14161/15140/12098 24049/15142/12100 24050/15143/12101
+f 14156/15139/12097 25202/15131/12089 25201/15130/12088 14161/15140/12098
+f 14161/15140/12098 25201/15130/12088 30663/15133/12091 24049/15142/12100
+f 14155/15136/12094 14157/15141/12099 14162/15144/12102 14158/15145/12103
+f 14158/15145/12103 14162/15144/12102 25204/15146/12104 25205/15147/12105
+f 14157/15141/12099 24050/15143/12101 24051/15148/12106 14162/15144/12102
+f 14162/15144/12102 24051/15148/12106 30664/15149/12107 25204/15146/12104
+f 14155/15136/12094 14158/15145/12103 14163/15150/12108 14159/15137/12095
+f 14159/15137/12095 14163/15150/12108 23979/14760/11722 23978/14755/11717
+f 14158/15145/12103 25205/15147/12105 25206/15151/12109 14163/15150/12108
+f 14163/15150/12108 25206/15151/12109 30640/14761/11723 23979/14760/11722
+f 14164/15152/12110 14168/15153/12111 14169/15154/12112 14165/15155/12113
+f 14165/15155/12113 14169/15154/12112 25206/15151/12109 25205/15147/12105
+f 14168/15153/12111 23981/14771/11733 23980/14770/11732 14169/15154/12112
+f 14169/15154/12112 23980/14770/11732 30640/14761/11723 25206/15151/12109
+f 14164/15152/12110 14165/15155/12113 14170/15156/12114 14166/15157/12115
+f 14166/15157/12115 14170/15156/12114 24052/15158/12116 24053/15159/12117
+f 14165/15155/12113 25205/15147/12105 25204/15146/12104 14170/15156/12114
+f 14170/15156/12114 25204/15146/12104 30664/15149/12107 24052/15158/12116
+f 14164/15152/12110 14166/15157/12115 14171/15160/12118 14167/15161/12119
+f 14167/15161/12119 14171/15160/12118 25207/15162/12120 25208/15163/12121
+f 14166/15157/12115 24053/15159/12117 24054/15164/12122 14171/15160/12118
+f 14171/15160/12118 24054/15164/12122 30665/15165/12123 25207/15162/12120
+f 14164/15152/12110 14167/15161/12119 14172/15166/12124 14168/15153/12111
+f 14168/15153/12111 14172/15166/12124 23982/14776/11738 23981/14771/11733
+f 14167/15161/12119 25208/15163/12121 25209/15167/12125 14172/15166/12124
+f 14172/15166/12124 25209/15167/12125 30641/14777/11739 23982/14776/11738
+f 14173/15168/12126 14177/15169/12127 14178/15170/12128 14174/15171/12129
+f 14174/15171/12129 14178/15170/12128 25209/15167/12125 25208/15163/12121
+f 14177/15169/12127 23984/14787/11749 23983/14786/11748 14178/15170/12128
+f 14178/15170/12128 23983/14786/11748 30641/14777/11739 25209/15167/12125
+f 14173/15168/12126 14174/15171/12129 14179/15172/12130 14175/15173/12131
+f 14175/15173/12131 14179/15172/12130 24055/15174/12132 24056/15175/12133
+f 14174/15171/12129 25208/15163/12121 25207/15162/12120 14179/15172/12130
+f 14179/15172/12130 25207/15162/12120 30665/15165/12123 24055/15174/12132
+f 14173/15168/12126 14175/15173/12131 14180/15176/12134 14176/15177/12135
+f 14176/15177/12135 14180/15176/12134 25210/15178/12136 25211/15179/12137
+f 14175/15173/12131 24056/15175/12133 24057/15180/12138 14180/15176/12134
+f 14180/15176/12134 24057/15180/12138 30666/15181/12139 25210/15178/12136
+f 14173/15168/12126 14176/15177/12135 14181/15182/12140 14177/15169/12127
+f 14177/15169/12127 14181/15182/12140 23985/14792/11754 23984/14787/11749
+f 14176/15177/12135 25211/15179/12137 25212/15183/12141 14181/15182/12140
+f 14181/15182/12140 25212/15183/12141 30642/14793/11755 23985/14792/11754
+f 14182/15184/12142 14186/15185/12143 14187/15186/12144 14183/15187/12145
+f 14183/15187/12145 14187/15186/12144 25212/15183/12141 25211/15179/12137
+f 14186/15185/12143 23987/14803/11765 23986/14802/11764 14187/15186/12144
+f 14187/15186/12144 23986/14802/11764 30642/14793/11755 25212/15183/12141
+f 14182/15184/12142 14183/15187/12145 14188/15188/12146 14184/15189/12147
+f 14184/15189/12147 14188/15188/12146 24058/15190/12148 24059/15191/12149
+f 14183/15187/12145 25211/15179/12137 25210/15178/12136 14188/15188/12146
+f 14188/15188/12146 25210/15178/12136 30666/15181/12139 24058/15190/12148
+f 14182/15184/12142 14184/15189/12147 14189/15192/12150 14185/15193/12151
+f 14185/15193/12151 14189/15192/12150 25213/15194/12152 25214/15195/12153
+f 14184/15189/12147 24059/15191/12149 24060/15196/12154 14189/15192/12150
+f 14189/15192/12150 24060/15196/12154 30667/15197/12155 25213/15194/12152
+f 14182/15184/12142 14185/15193/12151 14190/15198/12156 14186/15185/12143
+f 14186/15185/12143 14190/15198/12156 23988/14808/11770 23987/14803/11765
+f 14185/15193/12151 25214/15195/12153 25215/15199/12157 14190/15198/12156
+f 14190/15198/12156 25215/15199/12157 30643/14809/11771 23988/14808/11770
+f 14191/15200/12158 14195/15201/12159 14196/15202/12160 14192/15203/12161
+f 14192/15203/12161 14196/15202/12160 25215/15199/12157 25214/15195/12153
+f 14195/15201/12159 23990/14819/11781 23989/14818/11780 14196/15202/12160
+f 14196/15202/12160 23989/14818/11780 30643/14809/11771 25215/15199/12157
+f 14191/15200/12158 14192/15203/12161 14197/15204/12162 14193/15205/12163
+f 14193/15205/12163 14197/15204/12162 24061/15206/12164 24062/15207/12165
+f 14192/15203/12161 25214/15195/12153 25213/15194/12152 14197/15204/12162
+f 14197/15204/12162 25213/15194/12152 30667/15197/12155 24061/15206/12164
+f 14191/15200/12158 14193/15205/12163 14198/15208/12166 14194/15209/12167
+f 14194/15209/12167 14198/15208/12166 25216/15210/12168 25217/15211/12169
+f 14193/15205/12163 24062/15207/12165 24063/15212/12170 14198/15208/12166
+f 14198/15208/12166 24063/15212/12170 30668/15213/12171 25216/15210/12168
+f 14191/15200/12158 14194/15209/12167 14199/15214/12172 14195/15201/12159
+f 14195/15201/12159 14199/15214/12172 23991/14824/11786 23990/14819/11781
+f 14194/15209/12167 25217/15211/12169 25218/15215/12173 14199/15214/12172
+f 14199/15214/12172 25218/15215/12173 30644/14825/11787 23991/14824/11786
+f 14200/15216/12174 14204/15217/12175 14205/15218/12176 14201/15219/12177
+f 14201/15219/12177 14205/15218/12176 25218/15215/12173 25217/15211/12169
+f 14204/15217/12175 23993/14835/11797 23992/14834/11796 14205/15218/12176
+f 14205/15218/12176 23992/14834/11796 30644/14825/11787 25218/15215/12173
+f 14200/15216/12174 14201/15219/12177 14206/15220/12178 14202/15221/12179
+f 14202/15221/12179 14206/15220/12178 24064/15222/12180 24065/15223/12181
+f 14201/15219/12177 25217/15211/12169 25216/15210/12168 14206/15220/12178
+f 14206/15220/12178 25216/15210/12168 30668/15213/12171 24064/15222/12180
+f 14200/15216/12174 14202/15221/12179 14207/15224/12182 14203/15225/12183
+f 14203/15225/12183 14207/15224/12182 25149/14850/11812 25148/14845/11807
+f 14202/15221/12179 24065/15223/12181 24066/15226/12184 14207/15224/12182
+f 14207/15224/12182 24066/15226/12184 30645/14851/11813 25149/14850/11812
+f 14200/15216/12174 14203/15225/12183 14208/15227/12185 14204/15217/12175
+f 14204/15217/12175 14208/15227/12185 23994/14838/11800 23993/14835/11797
+f 14203/15225/12183 25148/14845/11807 25147/14844/11806 14208/15227/12185
+f 14208/15227/12185 25147/14844/11806 30621/14463/11429 23994/14838/11800
+f 14209/15228/12186 14213/15229/12187 14214/15230/12188 14210/15231/12189
+f 14210/15231/12189 14214/15230/12188 25219/15232/12190 25220/15233/12191
+f 14213/15229/12187 23996/14849/11811 23995/14848/11810 14214/15230/12188
+f 14214/15230/12188 23995/14848/11810 30645/14851/11813 25219/15232/12190
+f 14209/15228/12186 14210/15231/12189 14215/15234/12192 14211/15235/12193
+f 14211/15235/12193 14215/15234/12192 24067/15236/12194 24068/15237/12195
+f 14210/15231/12189 25220/15233/12191 25221/15238/12196 14215/15234/12192
+f 14215/15234/12192 25221/15238/12196 30669/15239/12197 24067/15236/12194
+f 14209/15228/12186 14211/15235/12193 14216/15240/12198 14212/15241/12199
+f 14212/15241/12199 14216/15240/12198 25222/15242/12200 25223/15243/12201
+f 14211/15235/12193 24068/15237/12195 24069/15244/12202 14216/15240/12198
+f 14216/15240/12198 24069/15244/12202 30670/15245/12203 25222/15242/12200
+f 14209/15228/12186 14212/15241/12199 14217/15246/12204 14213/15229/12187
+f 14213/15229/12187 14217/15246/12204 23997/14856/11818 23996/14849/11811
+f 14212/15241/12199 25223/15243/12201 25224/15247/12205 14217/15246/12204
+f 14217/15246/12204 25224/15247/12205 30646/14857/11819 23997/14856/11818
+f 14218/15248/12206 14222/15249/12207 14223/15250/12208 14219/15251/12209
+f 14219/15251/12209 14223/15250/12208 25224/15247/12205 25223/15243/12201
+f 14222/15249/12207 23999/14867/11829 23998/14866/11828 14223/15250/12208
+f 14223/15250/12208 23998/14866/11828 30646/14857/11819 25224/15247/12205
+f 14218/15248/12206 14219/15251/12209 14224/15252/12210 14220/15253/12211
+f 14220/15253/12211 14224/15252/12210 24070/15254/12212 24071/15255/12213
+f 14219/15251/12209 25223/15243/12201 25222/15242/12200 14224/15252/12210
+f 14224/15252/12210 25222/15242/12200 30670/15245/12203 24070/15254/12212
+f 14218/15248/12206 14220/15253/12211 14225/15256/12214 14221/15257/12215
+f 14221/15257/12215 14225/15256/12214 25225/15258/12216 25226/15259/12217
+f 14220/15253/12211 24071/15255/12213 24072/15260/12218 14225/15256/12214
+f 14225/15256/12214 24072/15260/12218 30671/15261/12219 25225/15258/12216
+f 14218/15248/12206 14221/15257/12215 14226/15262/12220 14222/15249/12207
+f 14222/15249/12207 14226/15262/12220 24000/14872/11834 23999/14867/11829
+f 14221/15257/12215 25226/15259/12217 25227/15263/12221 14226/15262/12220
+f 14226/15262/12220 25227/15263/12221 30647/14873/11835 24000/14872/11834
+f 14227/15264/12222 14231/15265/12223 14232/15266/12224 14228/15267/12225
+f 14228/15267/12225 14232/15266/12224 25227/15263/12221 25226/15259/12217
+f 14231/15265/12223 24002/14883/11845 24001/14882/11844 14232/15266/12224
+f 14232/15266/12224 24001/14882/11844 30647/14873/11835 25227/15263/12221
+f 14227/15264/12222 14228/15267/12225 14233/15268/12226 14229/15269/12227
+f 14229/15269/12227 14233/15268/12226 24073/15270/12228 24074/15271/12229
+f 14228/15267/12225 25226/15259/12217 25225/15258/12216 14233/15268/12226
+f 14233/15268/12226 25225/15258/12216 30671/15261/12219 24073/15270/12228
+f 14227/15264/12222 14229/15269/12227 14234/15272/12230 14230/15273/12231
+f 14230/15273/12231 14234/15272/12230 25228/15274/12232 25229/15275/12233
+f 14229/15269/12227 24074/15271/12229 24075/15276/12234 14234/15272/12230
+f 14234/15272/12230 24075/15276/12234 30672/15277/12235 25228/15274/12232
+f 14227/15264/12222 14230/15273/12231 14235/15278/12236 14231/15265/12223
+f 14231/15265/12223 14235/15278/12236 24003/14888/11850 24002/14883/11845
+f 14230/15273/12231 25229/15275/12233 25230/15279/12237 14235/15278/12236
+f 14235/15278/12236 25230/15279/12237 30648/14889/11851 24003/14888/11850
+f 14236/15280/12238 14240/15281/12239 14241/15282/12240 14237/15283/12241
+f 14237/15283/12241 14241/15282/12240 25230/15279/12237 25229/15275/12233
+f 14240/15281/12239 24005/14899/11861 24004/14898/11860 14241/15282/12240
+f 14241/15282/12240 24004/14898/11860 30648/14889/11851 25230/15279/12237
+f 14236/15280/12238 14237/15283/12241 14242/15284/12242 14238/15285/12243
+f 14238/15285/12243 14242/15284/12242 24076/15286/12244 24077/15287/12245
+f 14237/15283/12241 25229/15275/12233 25228/15274/12232 14242/15284/12242
+f 14242/15284/12242 25228/15274/12232 30672/15277/12235 24076/15286/12244
+f 14236/15280/12238 14238/15285/12243 14243/15288/12246 14239/15289/12247
+f 14239/15289/12247 14243/15288/12246 25231/15290/12248 25232/15291/12249
+f 14238/15285/12243 24077/15287/12245 24078/15292/12250 14243/15288/12246
+f 14243/15288/12246 24078/15292/12250 30673/15293/12251 25231/15290/12248
+f 14236/15280/12238 14239/15289/12247 14244/15294/12252 14240/15281/12239
+f 14240/15281/12239 14244/15294/12252 24006/14904/11866 24005/14899/11861
+f 14239/15289/12247 25232/15291/12249 25233/15295/12253 14244/15294/12252
+f 14244/15294/12252 25233/15295/12253 30649/14905/11867 24006/14904/11866
+f 14245/15296/12254 14249/15297/12255 14250/15298/12256 14246/15299/12257
+f 14246/15299/12257 14250/15298/12256 25233/15295/12253 25232/15291/12249
+f 14249/15297/12255 24008/14915/11877 24007/14914/11876 14250/15298/12256
+f 14250/15298/12256 24007/14914/11876 30649/14905/11867 25233/15295/12253
+f 14245/15296/12254 14246/15299/12257 14251/15300/12258 14247/15301/12259
+f 14247/15301/12259 14251/15300/12258 24079/15302/12260 24080/15303/12261
+f 14246/15299/12257 25232/15291/12249 25231/15290/12248 14251/15300/12258
+f 14251/15300/12258 25231/15290/12248 30673/15293/12251 24079/15302/12260
+f 14245/15296/12254 14247/15301/12259 14252/15304/12262 14248/15305/12263
+f 14248/15305/12263 14252/15304/12262 25234/15306/12264 25235/15307/12265
+f 14247/15301/12259 24080/15303/12261 24081/15308/12266 14252/15304/12262
+f 14252/15304/12262 24081/15308/12266 30674/15309/12267 25234/15306/12264
+f 14245/15296/12254 14248/15305/12263 14253/15310/12268 14249/15297/12255
+f 14249/15297/12255 14253/15310/12268 24009/14920/11882 24008/14915/11877
+f 14248/15305/12263 25235/15307/12265 25236/15311/12269 14253/15310/12268
+f 14253/15310/12268 25236/15311/12269 30650/14921/11883 24009/14920/11882
+f 14254/15312/12270 14258/15313/12271 14259/15314/12272 14255/15315/12273
+f 14255/15315/12273 14259/15314/12272 25236/15311/12269 25235/15307/12265
+f 14258/15313/12271 24011/14931/11893 24010/14930/11892 14259/15314/12272
+f 14259/15314/12272 24010/14930/11892 30650/14921/11883 25236/15311/12269
+f 14254/15312/12270 14255/15315/12273 14260/15316/12274 14256/15317/12275
+f 14256/15317/12275 14260/15316/12274 24082/15318/12276 24083/15319/12277
+f 14255/15315/12273 25235/15307/12265 25234/15306/12264 14260/15316/12274
+f 14260/15316/12274 25234/15306/12264 30674/15309/12267 24082/15318/12276
+f 14254/15312/12270 14256/15317/12275 14261/15320/12278 14257/15321/12279
+f 14257/15321/12279 14261/15320/12278 25237/15322/12280 25238/15323/12281
+f 14256/15317/12275 24083/15319/12277 24084/15324/12282 14261/15320/12278
+f 14261/15320/12278 24084/15324/12282 30675/15325/12283 25237/15322/12280
+f 14254/15312/12270 14257/15321/12279 14262/15326/12284 14258/15313/12271
+f 14258/15313/12271 14262/15326/12284 24012/14936/11898 24011/14931/11893
+f 14257/15321/12279 25238/15323/12281 25239/15327/12285 14262/15326/12284
+f 14262/15326/12284 25239/15327/12285 30651/14937/11899 24012/14936/11898
+f 14263/15328/12286 14267/15329/12287 14268/15330/12288 14264/15331/12289
+f 14264/15331/12289 14268/15330/12288 25239/15327/12285 25238/15323/12281
+f 14267/15329/12287 24014/14947/11909 24013/14946/11908 14268/15330/12288
+f 14268/15330/12288 24013/14946/11908 30651/14937/11899 25239/15327/12285
+f 14263/15328/12286 14264/15331/12289 14269/15332/12290 14265/15333/12291
+f 14265/15333/12291 14269/15332/12290 24085/15334/12292 24086/15335/12293
+f 14264/15331/12289 25238/15323/12281 25237/15322/12280 14269/15332/12290
+f 14269/15332/12290 25237/15322/12280 30675/15325/12283 24085/15334/12292
+f 14263/15328/12286 14265/15333/12291 14270/15336/12294 14266/15337/12295
+f 14266/15337/12295 14270/15336/12294 25240/15338/12296 25241/15339/12297
+f 14265/15333/12291 24086/15335/12293 24087/15340/12298 14270/15336/12294
+f 14270/15336/12294 24087/15340/12298 30676/15341/12299 25240/15338/12296
+f 14263/15328/12286 14266/15337/12295 14271/15342/12300 14267/15329/12287
+f 14267/15329/12287 14271/15342/12300 24015/14952/11914 24014/14947/11909
+f 14266/15337/12295 25241/15339/12297 25242/15343/12301 14271/15342/12300
+f 14271/15342/12300 25242/15343/12301 30652/14953/11915 24015/14952/11914
+f 14272/15344/12302 14276/15345/12303 14277/15346/12304 14273/15347/12305
+f 14273/15347/12305 14277/15346/12304 25242/15343/12301 25241/15339/12297
+f 14276/15345/12303 24017/14963/11925 24016/14962/11924 14277/15346/12304
+f 14277/15346/12304 24016/14962/11924 30652/14953/11915 25242/15343/12301
+f 14272/15344/12302 14273/15347/12305 14278/15348/12306 14274/15349/12307
+f 14274/15349/12307 14278/15348/12306 24088/15350/12308 24089/15351/12309
+f 14273/15347/12305 25241/15339/12297 25240/15338/12296 14278/15348/12306
+f 14278/15348/12306 25240/15338/12296 30676/15341/12299 24088/15350/12308
+f 14272/15344/12302 14274/15349/12307 14279/15352/12310 14275/15353/12311
+f 14275/15353/12311 14279/15352/12310 25243/15354/12312 25244/15355/12313
+f 14274/15349/12307 24089/15351/12309 24090/15356/12314 14279/15352/12310
+f 14279/15352/12310 24090/15356/12314 30677/15357/12315 25243/15354/12312
+f 14272/15344/12302 14275/15353/12311 14280/15358/12316 14276/15345/12303
+f 14276/15345/12303 14280/15358/12316 24018/14968/11930 24017/14963/11925
+f 14275/15353/12311 25244/15355/12313 25245/15359/12317 14280/15358/12316
+f 14280/15358/12316 25245/15359/12317 30653/14969/11931 24018/14968/11930
+f 14281/15360/12318 14285/15361/12319 14286/15362/12320 14282/15363/12321
+f 14282/15363/12321 14286/15362/12320 25245/15359/12317 25244/15355/12313
+f 14285/15361/12319 24020/14979/11941 24019/14978/11940 14286/15362/12320
+f 14286/15362/12320 24019/14978/11940 30653/14969/11931 25245/15359/12317
+f 14281/15360/12318 14282/15363/12321 14287/15364/12322 14283/15365/12323
+f 14283/15365/12323 14287/15364/12322 24091/15366/12324 24092/15367/12325
+f 14282/15363/12321 25244/15355/12313 25243/15354/12312 14287/15364/12322
+f 14287/15364/12322 25243/15354/12312 30677/15357/12315 24091/15366/12324
+f 14281/15360/12318 14283/15365/12323 14288/15368/12326 14284/15369/12327
+f 14284/15369/12327 14288/15368/12326 25246/15370/12328 25247/15371/12329
+f 14283/15365/12323 24092/15367/12325 24093/15372/12330 14288/15368/12326
+f 14288/15368/12326 24093/15372/12330 30678/15373/12331 25246/15370/12328
+f 14281/15360/12318 14284/15369/12327 14289/15374/12332 14285/15361/12319
+f 14285/15361/12319 14289/15374/12332 24021/14984/11946 24020/14979/11941
+f 14284/15369/12327 25247/15371/12329 25248/15375/12333 14289/15374/12332
+f 14289/15374/12332 25248/15375/12333 30654/14985/11947 24021/14984/11946
+f 14290/15376/12334 14294/15377/12335 14295/15378/12336 14291/15379/12337
+f 14291/15379/12337 14295/15378/12336 25248/15375/12333 25247/15371/12329
+f 14294/15377/12335 24023/14995/11957 24022/14994/11956 14295/15378/12336
+f 14295/15378/12336 24022/14994/11956 30654/14985/11947 25248/15375/12333
+f 14290/15376/12334 14291/15379/12337 14296/15380/12338 14292/15381/12339
+f 14292/15381/12339 14296/15380/12338 24094/15382/12340 24095/15383/12341
+f 14291/15379/12337 25247/15371/12329 25246/15370/12328 14296/15380/12338
+f 14296/15380/12338 25246/15370/12328 30678/15373/12331 24094/15382/12340
+f 14290/15376/12334 14292/15381/12339 14297/15384/12342 14293/15385/12343
+f 14293/15385/12343 14297/15384/12342 25249/15386/12344 25250/15387/12345
+f 14292/15381/12339 24095/15383/12341 24096/15388/12346 14297/15384/12342
+f 14297/15384/12342 24096/15388/12346 30679/15389/12347 25249/15386/12344
+f 14290/15376/12334 14293/15385/12343 14298/15390/12348 14294/15377/12335
+f 14294/15377/12335 14298/15390/12348 24024/15000/11962 24023/14995/11957
+f 14293/15385/12343 25250/15387/12345 25251/15391/12349 14298/15390/12348
+f 14298/15390/12348 25251/15391/12349 30655/15001/11963 24024/15000/11962
+f 14299/15392/12350 14303/15393/12351 14304/15394/12352 14300/15395/12353
+f 14300/15395/12353 14304/15394/12352 25251/15391/12349 25250/15387/12345
+f 14303/15393/12351 24026/15011/11973 24025/15010/11972 14304/15394/12352
+f 14304/15394/12352 24025/15010/11972 30655/15001/11963 25251/15391/12349
+f 14299/15392/12350 14300/15395/12353 14305/15396/12354 14301/15397/12355
+f 14301/15397/12355 14305/15396/12354 24097/15398/12356 24098/15399/12357
+f 14300/15395/12353 25250/15387/12345 25249/15386/12344 14305/15396/12354
+f 14305/15396/12354 25249/15386/12344 30679/15389/12347 24097/15398/12356
+f 14299/15392/12350 14301/15397/12355 14306/15400/12358 14302/15401/12359
+f 14302/15401/12359 14306/15400/12358 25252/15402/12360 25253/15403/12361
+f 14301/15397/12355 24098/15399/12357 24099/15404/12362 14306/15400/12358
+f 14306/15400/12358 24099/15404/12362 30680/15405/12363 25252/15402/12360
+f 14299/15392/12350 14302/15401/12359 14307/15406/12364 14303/15393/12351
+f 14303/15393/12351 14307/15406/12364 24027/15016/11978 24026/15011/11973
+f 14302/15401/12359 25253/15403/12361 25254/15407/12365 14307/15406/12364
+f 14307/15406/12364 25254/15407/12365 30656/15017/11979 24027/15016/11978
+f 14308/15408/12366 14312/15409/12367 14313/15410/12368 14309/15411/12369
+f 14309/15411/12369 14313/15410/12368 25254/15407/12365 25253/15403/12361
+f 14312/15409/12367 24029/15027/11989 24028/15026/11988 14313/15410/12368
+f 14313/15410/12368 24028/15026/11988 30656/15017/11979 25254/15407/12365
+f 14308/15408/12366 14309/15411/12369 14314/15412/12370 14310/15413/12371
+f 14310/15413/12371 14314/15412/12370 24100/15414/12372 24101/15415/12373
+f 14309/15411/12369 25253/15403/12361 25252/15402/12360 14314/15412/12370
+f 14314/15412/12370 25252/15402/12360 30680/15405/12363 24100/15414/12372
+f 14308/15408/12366 14310/15413/12371 14315/15416/12374 14311/15417/12375
+f 14311/15417/12375 14315/15416/12374 25255/15418/12376 25256/15419/12377
+f 14310/15413/12371 24101/15415/12373 24102/15420/12378 14315/15416/12374
+f 14315/15416/12374 24102/15420/12378 30681/15421/12379 25255/15418/12376
+f 14308/15408/12366 14311/15417/12375 14316/15422/12380 14312/15409/12367
+f 14312/15409/12367 14316/15422/12380 24030/15032/11994 24029/15027/11989
+f 14311/15417/12375 25256/15419/12377 25257/15423/12381 14316/15422/12380
+f 14316/15422/12380 25257/15423/12381 30657/15033/11995 24030/15032/11994
+f 14317/15424/12382 14321/15425/12383 14322/15426/12384 14318/15427/12385
+f 14318/15427/12385 14322/15426/12384 25257/15423/12381 25256/15419/12377
+f 14321/15425/12383 24032/15043/12005 24031/15042/12004 14322/15426/12384
+f 14322/15426/12384 24031/15042/12004 30657/15033/11995 25257/15423/12381
+f 14317/15424/12382 14318/15427/12385 14323/15428/12386 14319/15429/12387
+f 14319/15429/12387 14323/15428/12386 24103/15430/12388 24104/15431/12389
+f 14318/15427/12385 25256/15419/12377 25255/15418/12376 14323/15428/12386
+f 14323/15428/12386 25255/15418/12376 30681/15421/12379 24103/15430/12388
+f 14317/15424/12382 14319/15429/12387 14324/15432/12390 14320/15433/12391
+f 14320/15433/12391 14324/15432/12390 25258/15434/12392 25259/15435/12393
+f 14319/15429/12387 24104/15431/12389 24105/15436/12394 14324/15432/12390
+f 14324/15432/12390 24105/15436/12394 30682/15437/12395 25258/15434/12392
+f 14317/15424/12382 14320/15433/12391 14325/15438/12396 14321/15425/12383
+f 14321/15425/12383 14325/15438/12396 24033/15048/12010 24032/15043/12005
+f 14320/15433/12391 25259/15435/12393 25260/15439/12397 14325/15438/12396
+f 14325/15438/12396 25260/15439/12397 30658/15049/12011 24033/15048/12010
+f 14326/15440/12398 14330/15441/12399 14331/15442/12400 14327/15443/12401
+f 14327/15443/12401 14331/15442/12400 25260/15439/12397 25259/15435/12393
+f 14330/15441/12399 24035/15059/12021 24034/15058/12020 14331/15442/12400
+f 14331/15442/12400 24034/15058/12020 30658/15049/12011 25260/15439/12397
+f 14326/15440/12398 14327/15443/12401 14332/15444/12402 14328/15445/12403
+f 14328/15445/12403 14332/15444/12402 24106/15446/12404 24107/15447/12405
+f 14327/15443/12401 25259/15435/12393 25258/15434/12392 14332/15444/12402
+f 14332/15444/12402 25258/15434/12392 30682/15437/12395 24106/15446/12404
+f 14326/15440/12398 14328/15445/12403 14333/15448/12406 14329/15449/12407
+f 14329/15449/12407 14333/15448/12406 25261/15450/12408 25262/15451/12409
+f 14328/15445/12403 24107/15447/12405 24108/15452/12410 14333/15448/12406
+f 14333/15448/12406 24108/15452/12410 30683/15453/12411 25261/15450/12408
+f 14326/15440/12398 14329/15449/12407 14334/15454/12412 14330/15441/12399
+f 14330/15441/12399 14334/15454/12412 24036/15064/12026 24035/15059/12021
+f 14329/15449/12407 25262/15451/12409 25263/15455/12413 14334/15454/12412
+f 14334/15454/12412 25263/15455/12413 30659/15065/12027 24036/15064/12026
+f 14335/15456/12414 14339/15457/12415 14340/15458/12416 14336/15459/12417
+f 14336/15459/12417 14340/15458/12416 25263/15455/12413 25262/15451/12409
+f 14339/15457/12415 24038/15075/12037 24037/15074/12036 14340/15458/12416
+f 14340/15458/12416 24037/15074/12036 30659/15065/12027 25263/15455/12413
+f 14335/15456/12414 14336/15459/12417 14341/15460/12418 14337/15461/12419
+f 14337/15461/12419 14341/15460/12418 24109/15462/12420 24110/15463/12421
+f 14336/15459/12417 25262/15451/12409 25261/15450/12408 14341/15460/12418
+f 14341/15460/12418 25261/15450/12408 30683/15453/12411 24109/15462/12420
+f 14335/15456/12414 14337/15461/12419 14342/15464/12422 14338/15465/12423
+f 14338/15465/12423 14342/15464/12422 25264/15466/12424 25265/15467/12425
+f 14337/15461/12419 24110/15463/12421 24111/15468/12426 14342/15464/12422
+f 14342/15464/12422 24111/15468/12426 30684/15469/12427 25264/15466/12424
+f 14335/15456/12414 14338/15465/12423 14343/15470/12428 14339/15457/12415
+f 14339/15457/12415 14343/15470/12428 24039/15080/12042 24038/15075/12037
+f 14338/15465/12423 25265/15467/12425 25266/15471/12429 14343/15470/12428
+f 14343/15470/12428 25266/15471/12429 30660/15081/12043 24039/15080/12042
+f 14344/15472/12430 14348/15473/12431 14349/15474/12432 14345/15475/12433
+f 14345/15475/12433 14349/15474/12432 25266/15471/12429 25265/15467/12425
+f 14348/15473/12431 24041/15091/12053 24040/15090/12052 14349/15474/12432
+f 14349/15474/12432 24040/15090/12052 30660/15081/12043 25266/15471/12429
+f 14344/15472/12430 14345/15475/12433 14350/15476/12434 14346/15477/12435
+f 14346/15477/12435 14350/15476/12434 24112/15478/12436 24113/15479/12437
+f 14345/15475/12433 25265/15467/12425 25264/15466/12424 14350/15476/12434
+f 14350/15476/12434 25264/15466/12424 30684/15469/12427 24112/15478/12436
+f 14344/15472/12430 14346/15477/12435 14351/15480/12438 14347/15481/12439
+f 14347/15481/12439 14351/15480/12438 25267/15482/12440 25268/15483/12441
+f 14346/15477/12435 24113/15479/12437 24114/15484/12442 14351/15480/12438
+f 14351/15480/12438 24114/15484/12442 30685/15485/12443 25267/15482/12440
+f 14344/15472/12430 14347/15481/12439 14352/15486/12444 14348/15473/12431
+f 14348/15473/12431 14352/15486/12444 24042/15096/12058 24041/15091/12053
+f 14347/15481/12439 25268/15483/12441 25269/15487/12445 14352/15486/12444
+f 14352/15486/12444 25269/15487/12445 30661/15097/12059 24042/15096/12058
+f 14353/15488/12446 14357/15489/12447 14358/15490/12448 14354/15491/12449
+f 14354/15491/12449 14358/15490/12448 25269/15487/12445 25268/15483/12441
+f 14357/15489/12447 24044/15107/12069 24043/15106/12068 14358/15490/12448
+f 14358/15490/12448 24043/15106/12068 30661/15097/12059 25269/15487/12445
+f 14353/15488/12446 14354/15491/12449 14359/15492/12450 14355/15493/12451
+f 14355/15493/12451 14359/15492/12450 24115/15494/12452 24116/15495/12453
+f 14354/15491/12449 25268/15483/12441 25267/15482/12440 14359/15492/12450
+f 14359/15492/12450 25267/15482/12440 30685/15485/12443 24115/15494/12452
+f 14353/15488/12446 14355/15493/12451 14360/15496/12454 14356/15497/12455
+f 14356/15497/12455 14360/15496/12454 25270/15498/12456 25271/15499/12457
+f 14355/15493/12451 24116/15495/12453 24117/15500/12458 14360/15496/12454
+f 14360/15496/12454 24117/15500/12458 30686/15501/12459 25270/15498/12456
+f 14353/15488/12446 14356/15497/12455 14361/15502/12460 14357/15489/12447
+f 14357/15489/12447 14361/15502/12460 24045/15112/12074 24044/15107/12069
+f 14356/15497/12455 25271/15499/12457 25272/15503/12461 14361/15502/12460
+f 14361/15502/12460 25272/15503/12461 30662/15113/12075 24045/15112/12074
+f 14362/15504/12462 14366/15505/12463 14367/15506/12464 14363/15507/12465
+f 14363/15507/12465 14367/15506/12464 25272/15508/12461 25271/15509/12457
+f 14366/15505/12463 24047/15125/12085 24046/15124/12084 14367/15506/12464
+f 14367/15506/12464 24046/15124/12084 30662/15127/12075 25272/15508/12461
+f 14362/15504/12462 14363/15507/12465 14368/15510/12466 14364/15511/12467
+f 14364/15511/12467 14368/15510/12466 24118/15512/12468 24119/15513/12469
+f 14363/15507/12465 25271/15509/12457 25270/15514/12456 14368/15510/12466
+f 14368/15510/12466 25270/15514/12456 30686/15515/12459 24118/15512/12468
+f 14362/15504/12462 14364/15511/12467 14369/15516/12470 14365/15517/12471
+f 14365/15517/12471 14369/15516/12470 25273/15518/12472 25274/15519/12473
+f 14364/15511/12467 24119/15513/12469 24120/15520/12474 14369/15516/12470
+f 14369/15516/12470 24120/15520/12474 30687/15521/12475 25273/15518/12472
+f 14362/15504/12462 14365/15517/12471 14370/15522/12476 14366/15505/12463
+f 14366/15505/12463 14370/15522/12476 24048/15132/12090 24047/15125/12085
+f 14365/15517/12471 25274/15519/12473 25275/15523/12477 14370/15522/12476
+f 14370/15522/12476 25275/15523/12477 30663/15133/12091 24048/15132/12090
+f 14371/15524/12478 14375/15525/12479 14376/15526/12480 14372/15527/12481
+f 14372/15527/12481 14376/15526/12480 25275/15523/12477 25274/15519/12473
+f 14375/15525/12479 24050/15143/12101 24049/15142/12100 14376/15526/12480
+f 14376/15526/12480 24049/15142/12100 30663/15133/12091 25275/15523/12477
+f 14371/15524/12478 14372/15527/12481 14377/15528/12482 14373/15529/12483
+f 14373/15529/12483 14377/15528/12482 24121/15530/12484 24122/15531/12485
+f 14372/15527/12481 25274/15519/12473 25273/15518/12472 14377/15528/12482
+f 14377/15528/12482 25273/15518/12472 30687/15521/12475 24121/15530/12484
+f 14371/15524/12478 14373/15529/12483 14378/15532/12486 14374/15533/12487
+f 14374/15533/12487 14378/15532/12486 25276/15534/12488 25277/15535/12489
+f 14373/15529/12483 24122/15531/12485 24123/15536/12490 14378/15532/12486
+f 14378/15532/12486 24123/15536/12490 30688/15537/12491 25276/15534/12488
+f 14371/15524/12478 14374/15533/12487 14379/15538/12492 14375/15525/12479
+f 14375/15525/12479 14379/15538/12492 24051/15148/12106 24050/15143/12101
+f 14374/15533/12487 25277/15535/12489 25278/15539/12493 14379/15538/12492
+f 14379/15538/12492 25278/15539/12493 30664/15149/12107 24051/15148/12106
+f 14380/15540/12494 14384/15541/12495 14385/15542/12496 14381/15543/12497
+f 14381/15543/12497 14385/15542/12496 25278/15539/12493 25277/15535/12489
+f 14384/15541/12495 24053/15159/12117 24052/15158/12116 14385/15542/12496
+f 14385/15542/12496 24052/15158/12116 30664/15149/12107 25278/15539/12493
+f 14380/15540/12494 14381/15543/12497 14386/15544/12498 14382/15545/12499
+f 14382/15545/12499 14386/15544/12498 24124/15546/12500 24125/15547/12501
+f 14381/15543/12497 25277/15535/12489 25276/15534/12488 14386/15544/12498
+f 14386/15544/12498 25276/15534/12488 30688/15537/12491 24124/15546/12500
+f 14380/15540/12494 14382/15545/12499 14387/15548/12502 14383/15549/12503
+f 14383/15549/12503 14387/15548/12502 25279/15550/12504 25280/15551/12505
+f 14382/15545/12499 24125/15547/12501 24126/15552/12506 14387/15548/12502
+f 14387/15548/12502 24126/15552/12506 30689/15553/12507 25279/15550/12504
+f 14380/15540/12494 14383/15549/12503 14388/15554/12508 14384/15541/12495
+f 14384/15541/12495 14388/15554/12508 24054/15164/12122 24053/15159/12117
+f 14383/15549/12503 25280/15551/12505 25281/15555/12509 14388/15554/12508
+f 14388/15554/12508 25281/15555/12509 30665/15165/12123 24054/15164/12122
+f 14389/15556/12510 14393/15557/12511 14394/15558/12512 14390/15559/12513
+f 14390/15559/12513 14394/15558/12512 25281/15555/12509 25280/15551/12505
+f 14393/15557/12511 24056/15175/12133 24055/15174/12132 14394/15558/12512
+f 14394/15558/12512 24055/15174/12132 30665/15165/12123 25281/15555/12509
+f 14389/15556/12510 14390/15559/12513 14395/15560/12514 14391/15561/12515
+f 14391/15561/12515 14395/15560/12514 24127/15562/12516 24128/15563/12517
+f 14390/15559/12513 25280/15551/12505 25279/15550/12504 14395/15560/12514
+f 14395/15560/12514 25279/15550/12504 30689/15553/12507 24127/15562/12516
+f 14389/15556/12510 14391/15561/12515 14396/15564/12518 14392/15565/12519
+f 14392/15565/12519 14396/15564/12518 25282/15566/12520 25283/15567/12521
+f 14391/15561/12515 24128/15563/12517 24129/15568/12522 14396/15564/12518
+f 14396/15564/12518 24129/15568/12522 30690/15569/12523 25282/15566/12520
+f 14389/15556/12510 14392/15565/12519 14397/15570/12524 14393/15557/12511
+f 14393/15557/12511 14397/15570/12524 24057/15180/12138 24056/15175/12133
+f 14392/15565/12519 25283/15567/12521 25284/15571/12525 14397/15570/12524
+f 14397/15570/12524 25284/15571/12525 30666/15181/12139 24057/15180/12138
+f 14398/15572/12526 14402/15573/12527 14403/15574/12528 14399/15575/12529
+f 14399/15575/12529 14403/15574/12528 25284/15571/12525 25283/15567/12521
+f 14402/15573/12527 24059/15191/12149 24058/15190/12148 14403/15574/12528
+f 14403/15574/12528 24058/15190/12148 30666/15181/12139 25284/15571/12525
+f 14398/15572/12526 14399/15575/12529 14404/15576/12530 14400/15577/12531
+f 14400/15577/12531 14404/15576/12530 24130/15578/12532 24131/15579/12533
+f 14399/15575/12529 25283/15567/12521 25282/15566/12520 14404/15576/12530
+f 14404/15576/12530 25282/15566/12520 30690/15569/12523 24130/15578/12532
+f 14398/15572/12526 14400/15577/12531 14405/15580/12534 14401/15581/12535
+f 14401/15581/12535 14405/15580/12534 25285/15582/12536 25286/15583/12537
+f 14400/15577/12531 24131/15579/12533 24132/15584/12538 14405/15580/12534
+f 14405/15580/12534 24132/15584/12538 30691/15585/12539 25285/15582/12536
+f 14398/15572/12526 14401/15581/12535 14406/15586/12540 14402/15573/12527
+f 14402/15573/12527 14406/15586/12540 24060/15196/12154 24059/15191/12149
+f 14401/15581/12535 25286/15583/12537 25287/15587/12541 14406/15586/12540
+f 14406/15586/12540 25287/15587/12541 30667/15197/12155 24060/15196/12154
+f 14407/15588/12542 14411/15589/12543 14412/15590/12544 14408/15591/12545
+f 14408/15591/12545 14412/15590/12544 25287/15587/12541 25286/15583/12537
+f 14411/15589/12543 24062/15207/12165 24061/15206/12164 14412/15590/12544
+f 14412/15590/12544 24061/15206/12164 30667/15197/12155 25287/15587/12541
+f 14407/15588/12542 14408/15591/12545 14413/15592/12546 14409/15593/12547
+f 14409/15593/12547 14413/15592/12546 24133/15594/12548 24134/15595/12549
+f 14408/15591/12545 25286/15583/12537 25285/15582/12536 14413/15592/12546
+f 14413/15592/12546 25285/15582/12536 30691/15585/12539 24133/15594/12548
+f 14407/15588/12542 14409/15593/12547 14414/15596/12550 14410/15597/12551
+f 14410/15597/12551 14414/15596/12550 25288/15598/12552 25289/15599/12553
+f 14409/15593/12547 24134/15595/12549 24135/15600/12554 14414/15596/12550
+f 14414/15596/12550 24135/15600/12554 30692/15601/12555 25288/15598/12552
+f 14407/15588/12542 14410/15597/12551 14415/15602/12556 14411/15589/12543
+f 14411/15589/12543 14415/15602/12556 24063/15212/12170 24062/15207/12165
+f 14410/15597/12551 25289/15599/12553 25290/15603/12557 14415/15602/12556
+f 14415/15602/12556 25290/15603/12557 30668/15213/12171 24063/15212/12170
+f 14416/15604/12558 14420/15605/12559 14421/15606/12560 14417/15607/12561
+f 14417/15607/12561 14421/15606/12560 25290/15603/12557 25289/15599/12553
+f 14420/15605/12559 24065/15223/12181 24064/15222/12180 14421/15606/12560
+f 14421/15606/12560 24064/15222/12180 30668/15213/12171 25290/15603/12557
+f 14416/15604/12558 14417/15607/12561 14422/15608/12562 14418/15609/12563
+f 14418/15609/12563 14422/15608/12562 24136/15610/12564 24137/15611/12565
+f 14417/15607/12561 25289/15599/12553 25288/15598/12552 14422/15608/12562
+f 14422/15608/12562 25288/15598/12552 30692/15601/12555 24136/15610/12564
+f 14416/15604/12558 14418/15609/12563 14423/15612/12566 14419/15613/12567
+f 14419/15613/12567 14423/15612/12566 25221/15238/12196 25220/15233/12191
+f 14418/15609/12563 24137/15611/12565 24138/15614/12568 14423/15612/12566
+f 14423/15612/12566 24138/15614/12568 30669/15239/12197 25221/15238/12196
+f 14416/15604/12558 14419/15613/12567 14424/15615/12569 14420/15605/12559
+f 14420/15605/12559 14424/15615/12569 24066/15226/12184 24065/15223/12181
+f 14419/15613/12567 25220/15233/12191 25219/15232/12190 14424/15615/12569
+f 14424/15615/12569 25219/15232/12190 30645/14851/11813 24066/15226/12184
+f 14425/15616/12570 14429/15617/12571 14430/15618/12572 14426/15619/12573
+f 14426/15619/12573 14430/15618/12572 25291/15620/12574 25292/15621/12575
+f 14429/15617/12571 24068/15237/12195 24067/15236/12194 14430/15618/12572
+f 14430/15618/12572 24067/15236/12194 30669/15239/12197 25291/15620/12574
+f 14425/15616/12570 14426/15619/12573 14431/15622/12576 14427/15623/12577
+f 14427/15623/12577 14431/15622/12576 24139/15624/12578 24140/15625/12579
+f 14426/15619/12573 25292/15621/12575 25293/15626/12580 14431/15622/12576
+f 14431/15622/12576 25293/15626/12580 30693/15627/12581 24139/15624/12578
+f 14425/15616/12570 14427/15623/12577 14432/15628/12582 14428/15629/12583
+f 14428/15629/12583 14432/15628/12582 25294/15630/12584 25295/15631/12585
+f 14427/15623/12577 24140/15625/12579 24141/15632/12586 14432/15628/12582
+f 14432/15628/12582 24141/15632/12586 30694/15633/12587 25294/15630/12584
+f 14425/15616/12570 14428/15629/12583 14433/15634/12588 14429/15617/12571
+f 14429/15617/12571 14433/15634/12588 24069/15244/12202 24068/15237/12195
+f 14428/15629/12583 25295/15631/12585 25296/15635/12589 14433/15634/12588
+f 14433/15634/12588 25296/15635/12589 30670/15245/12203 24069/15244/12202
+f 14434/15636/12590 14438/15637/12591 14439/15638/12592 14435/15639/12593
+f 14435/15639/12593 14439/15638/12592 25296/15635/12589 25295/15631/12585
+f 14438/15637/12591 24071/15255/12213 24070/15254/12212 14439/15638/12592
+f 14439/15638/12592 24070/15254/12212 30670/15245/12203 25296/15635/12589
+f 14434/15636/12590 14435/15639/12593 14440/15640/12594 14436/15641/12595
+f 14436/15641/12595 14440/15640/12594 24142/15642/12596 24143/15643/12597
+f 14435/15639/12593 25295/15631/12585 25294/15630/12584 14440/15640/12594
+f 14440/15640/12594 25294/15630/12584 30694/15633/12587 24142/15642/12596
+f 14434/15636/12590 14436/15641/12595 14441/15644/12598 14437/15645/12599
+f 14437/15645/12599 14441/15644/12598 25297/15646/12600 25298/15647/12601
+f 14436/15641/12595 24143/15643/12597 24144/15648/12602 14441/15644/12598
+f 14441/15644/12598 24144/15648/12602 30695/15649/12603 25297/15646/12600
+f 14434/15636/12590 14437/15645/12599 14442/15650/12604 14438/15637/12591
+f 14438/15637/12591 14442/15650/12604 24072/15260/12218 24071/15255/12213
+f 14437/15645/12599 25298/15647/12601 25299/15651/12605 14442/15650/12604
+f 14442/15650/12604 25299/15651/12605 30671/15261/12219 24072/15260/12218
+f 14443/15652/12606 14447/15653/12607 14448/15654/12608 14444/15655/12609
+f 14444/15655/12609 14448/15654/12608 25299/15651/12605 25298/15647/12601
+f 14447/15653/12607 24074/15271/12229 24073/15270/12228 14448/15654/12608
+f 14448/15654/12608 24073/15270/12228 30671/15261/12219 25299/15651/12605
+f 14443/15652/12606 14444/15655/12609 14449/15656/12610 14445/15657/12611
+f 14445/15657/12611 14449/15656/12610 24145/15658/12612 24146/15659/12613
+f 14444/15655/12609 25298/15647/12601 25297/15646/12600 14449/15656/12610
+f 14449/15656/12610 25297/15646/12600 30695/15649/12603 24145/15658/12612
+f 14443/15652/12606 14445/15657/12611 14450/15660/12614 14446/15661/12615
+f 14446/15661/12615 14450/15660/12614 25300/15662/12616 25301/15663/12617
+f 14445/15657/12611 24146/15659/12613 24147/15664/12618 14450/15660/12614
+f 14450/15660/12614 24147/15664/12618 30696/15665/12619 25300/15662/12616
+f 14443/15652/12606 14446/15661/12615 14451/15666/12620 14447/15653/12607
+f 14447/15653/12607 14451/15666/12620 24075/15276/12234 24074/15271/12229
+f 14446/15661/12615 25301/15663/12617 25302/15667/12621 14451/15666/12620
+f 14451/15666/12620 25302/15667/12621 30672/15277/12235 24075/15276/12234
+f 14452/15668/12622 14456/15669/12623 14457/15670/12624 14453/15671/12625
+f 14453/15671/12625 14457/15670/12624 25302/15667/12621 25301/15663/12617
+f 14456/15669/12623 24077/15287/12245 24076/15286/12244 14457/15670/12624
+f 14457/15670/12624 24076/15286/12244 30672/15277/12235 25302/15667/12621
+f 14452/15668/12622 14453/15671/12625 14458/15672/12626 14454/15673/12627
+f 14454/15673/12627 14458/15672/12626 24148/15674/12628 24149/15675/12629
+f 14453/15671/12625 25301/15663/12617 25300/15662/12616 14458/15672/12626
+f 14458/15672/12626 25300/15662/12616 30696/15665/12619 24148/15674/12628
+f 14452/15668/12622 14454/15673/12627 14459/15676/12630 14455/15677/12631
+f 14455/15677/12631 14459/15676/12630 25303/15678/12632 25304/15679/12633
+f 14454/15673/12627 24149/15675/12629 24150/15680/12634 14459/15676/12630
+f 14459/15676/12630 24150/15680/12634 30697/15681/12635 25303/15678/12632
+f 14452/15668/12622 14455/15677/12631 14460/15682/12636 14456/15669/12623
+f 14456/15669/12623 14460/15682/12636 24078/15292/12250 24077/15287/12245
+f 14455/15677/12631 25304/15679/12633 25305/15683/12637 14460/15682/12636
+f 14460/15682/12636 25305/15683/12637 30673/15293/12251 24078/15292/12250
+f 14461/15684/12638 14465/15685/12639 14466/15686/12640 14462/15687/12641
+f 14462/15687/12641 14466/15686/12640 25305/15683/12637 25304/15679/12633
+f 14465/15685/12639 24080/15303/12261 24079/15302/12260 14466/15686/12640
+f 14466/15686/12640 24079/15302/12260 30673/15293/12251 25305/15683/12637
+f 14461/15684/12638 14462/15687/12641 14467/15688/12642 14463/15689/12643
+f 14463/15689/12643 14467/15688/12642 24151/15690/12644 24152/15691/12645
+f 14462/15687/12641 25304/15679/12633 25303/15678/12632 14467/15688/12642
+f 14467/15688/12642 25303/15678/12632 30697/15681/12635 24151/15690/12644
+f 14461/15684/12638 14463/15689/12643 14468/15692/12646 14464/15693/12647
+f 14464/15693/12647 14468/15692/12646 25306/15694/12648 25307/15695/12649
+f 14463/15689/12643 24152/15691/12645 24153/15696/12650 14468/15692/12646
+f 14468/15692/12646 24153/15696/12650 30698/15697/12651 25306/15694/12648
+f 14461/15684/12638 14464/15693/12647 14469/15698/12652 14465/15685/12639
+f 14465/15685/12639 14469/15698/12652 24081/15308/12266 24080/15303/12261
+f 14464/15693/12647 25307/15695/12649 25308/15699/12653 14469/15698/12652
+f 14469/15698/12652 25308/15699/12653 30674/15309/12267 24081/15308/12266
+f 14470/15700/12654 14474/15701/12655 14475/15702/12656 14471/15703/12657
+f 14471/15703/12657 14475/15702/12656 25308/15699/12653 25307/15695/12649
+f 14474/15701/12655 24083/15319/12277 24082/15318/12276 14475/15702/12656
+f 14475/15702/12656 24082/15318/12276 30674/15309/12267 25308/15699/12653
+f 14470/15700/12654 14471/15703/12657 14476/15704/12658 14472/15705/12659
+f 14472/15705/12659 14476/15704/12658 24154/15706/12660 24155/15707/12661
+f 14471/15703/12657 25307/15695/12649 25306/15694/12648 14476/15704/12658
+f 14476/15704/12658 25306/15694/12648 30698/15697/12651 24154/15706/12660
+f 14470/15700/12654 14472/15705/12659 14477/15708/12662 14473/15709/12663
+f 14473/15709/12663 14477/15708/12662 25309/15710/12664 25310/15711/12665
+f 14472/15705/12659 24155/15707/12661 24156/15712/12666 14477/15708/12662
+f 14477/15708/12662 24156/15712/12666 30699/15713/12667 25309/15710/12664
+f 14470/15700/12654 14473/15709/12663 14478/15714/12668 14474/15701/12655
+f 14474/15701/12655 14478/15714/12668 24084/15324/12282 24083/15319/12277
+f 14473/15709/12663 25310/15711/12665 25311/15715/12669 14478/15714/12668
+f 14478/15714/12668 25311/15715/12669 30675/15325/12283 24084/15324/12282
+f 14479/15716/12670 14483/15717/12671 14484/15718/12672 14480/15719/12673
+f 14480/15719/12673 14484/15718/12672 25311/15715/12669 25310/15711/12665
+f 14483/15717/12671 24086/15335/12293 24085/15334/12292 14484/15718/12672
+f 14484/15718/12672 24085/15334/12292 30675/15325/12283 25311/15715/12669
+f 14479/15716/12670 14480/15719/12673 14485/15720/12674 14481/15721/12675
+f 14481/15721/12675 14485/15720/12674 24157/15722/12676 24158/15723/12677
+f 14480/15719/12673 25310/15711/12665 25309/15710/12664 14485/15720/12674
+f 14485/15720/12674 25309/15710/12664 30699/15713/12667 24157/15722/12676
+f 14479/15716/12670 14481/15721/12675 14486/15724/12678 14482/15725/12679
+f 14482/15725/12679 14486/15724/12678 25312/15726/12680 25313/15727/12681
+f 14481/15721/12675 24158/15723/12677 24159/15728/12682 14486/15724/12678
+f 14486/15724/12678 24159/15728/12682 30700/15729/12683 25312/15726/12680
+f 14479/15716/12670 14482/15725/12679 14487/15730/12684 14483/15717/12671
+f 14483/15717/12671 14487/15730/12684 24087/15340/12298 24086/15335/12293
+f 14482/15725/12679 25313/15727/12681 25314/15731/12685 14487/15730/12684
+f 14487/15730/12684 25314/15731/12685 30676/15341/12299 24087/15340/12298
+f 14488/15732/12686 14492/15733/12687 14493/15734/12688 14489/15735/12689
+f 14489/15735/12689 14493/15734/12688 25314/15731/12685 25313/15727/12681
+f 14492/15733/12687 24089/15351/12309 24088/15350/12308 14493/15734/12688
+f 14493/15734/12688 24088/15350/12308 30676/15341/12299 25314/15731/12685
+f 14488/15732/12686 14489/15735/12689 14494/15736/12690 14490/15737/12691
+f 14490/15737/12691 14494/15736/12690 24160/15738/12692 24161/15739/12693
+f 14489/15735/12689 25313/15727/12681 25312/15726/12680 14494/15736/12690
+f 14494/15736/12690 25312/15726/12680 30700/15729/12683 24160/15738/12692
+f 14488/15732/12686 14490/15737/12691 14495/15740/12694 14491/15741/12695
+f 14491/15741/12695 14495/15740/12694 25315/15742/12696 25316/15743/12697
+f 14490/15737/12691 24161/15739/12693 24162/15744/12698 14495/15740/12694
+f 14495/15740/12694 24162/15744/12698 30701/15745/12699 25315/15742/12696
+f 14488/15732/12686 14491/15741/12695 14496/15746/12700 14492/15733/12687
+f 14492/15733/12687 14496/15746/12700 24090/15356/12314 24089/15351/12309
+f 14491/15741/12695 25316/15743/12697 25317/15747/12701 14496/15746/12700
+f 14496/15746/12700 25317/15747/12701 30677/15357/12315 24090/15356/12314
+f 14497/15748/12702 14501/15749/12703 14502/15750/12704 14498/15751/12705
+f 14498/15751/12705 14502/15750/12704 25317/15747/12701 25316/15743/12697
+f 14501/15749/12703 24092/15367/12325 24091/15366/12324 14502/15750/12704
+f 14502/15750/12704 24091/15366/12324 30677/15357/12315 25317/15747/12701
+f 14497/15748/12702 14498/15751/12705 14503/15752/12706 14499/15753/12707
+f 14499/15753/12707 14503/15752/12706 24163/15754/12708 24164/15755/12709
+f 14498/15751/12705 25316/15743/12697 25315/15742/12696 14503/15752/12706
+f 14503/15752/12706 25315/15742/12696 30701/15745/12699 24163/15754/12708
+f 14497/15748/12702 14499/15753/12707 14504/15756/12710 14500/15757/12711
+f 14500/15757/12711 14504/15756/12710 25318/15758/12712 25319/15759/12713
+f 14499/15753/12707 24164/15755/12709 24165/15760/12714 14504/15756/12710
+f 14504/15756/12710 24165/15760/12714 30702/15761/12715 25318/15758/12712
+f 14497/15748/12702 14500/15757/12711 14505/15762/12716 14501/15749/12703
+f 14501/15749/12703 14505/15762/12716 24093/15372/12330 24092/15367/12325
+f 14500/15757/12711 25319/15759/12713 25320/15763/12717 14505/15762/12716
+f 14505/15762/12716 25320/15763/12717 30678/15373/12331 24093/15372/12330
+f 14506/15764/12718 14510/15765/12719 14511/15766/12720 14507/15767/12721
+f 14507/15767/12721 14511/15766/12720 25320/15763/12717 25319/15759/12713
+f 14510/15765/12719 24095/15383/12341 24094/15382/12340 14511/15766/12720
+f 14511/15766/12720 24094/15382/12340 30678/15373/12331 25320/15763/12717
+f 14506/15764/12718 14507/15767/12721 14512/15768/12722 14508/15769/12723
+f 14508/15769/12723 14512/15768/12722 24166/15770/12724 24167/15771/12725
+f 14507/15767/12721 25319/15759/12713 25318/15758/12712 14512/15768/12722
+f 14512/15768/12722 25318/15758/12712 30702/15761/12715 24166/15770/12724
+f 14506/15764/12718 14508/15769/12723 14513/15772/12726 14509/15773/12727
+f 14509/15773/12727 14513/15772/12726 25321/15774/12728 25322/15775/12729
+f 14508/15769/12723 24167/15771/12725 24168/15776/12730 14513/15772/12726
+f 14513/15772/12726 24168/15776/12730 30703/15777/12731 25321/15774/12728
+f 14506/15764/12718 14509/15773/12727 14514/15778/12732 14510/15765/12719
+f 14510/15765/12719 14514/15778/12732 24096/15388/12346 24095/15383/12341
+f 14509/15773/12727 25322/15775/12729 25323/15779/12733 14514/15778/12732
+f 14514/15778/12732 25323/15779/12733 30679/15389/12347 24096/15388/12346
+f 14515/15780/12734 14519/15781/12735 14520/15782/12736 14516/15783/12737
+f 14516/15783/12737 14520/15782/12736 25323/15779/12733 25322/15775/12729
+f 14519/15781/12735 24098/15399/12357 24097/15398/12356 14520/15782/12736
+f 14520/15782/12736 24097/15398/12356 30679/15389/12347 25323/15779/12733
+f 14515/15780/12734 14516/15783/12737 14521/15784/12738 14517/15785/12739
+f 14517/15785/12739 14521/15784/12738 24169/15786/12740 24170/15787/12741
+f 14516/15783/12737 25322/15775/12729 25321/15774/12728 14521/15784/12738
+f 14521/15784/12738 25321/15774/12728 30703/15777/12731 24169/15786/12740
+f 14515/15780/12734 14517/15785/12739 14522/15788/12742 14518/15789/12743
+f 14518/15789/12743 14522/15788/12742 25324/15790/12744 25325/15791/12745
+f 14517/15785/12739 24170/15787/12741 24171/15792/12746 14522/15788/12742
+f 14522/15788/12742 24171/15792/12746 30704/15793/12747 25324/15790/12744
+f 14515/15780/12734 14518/15789/12743 14523/15794/12748 14519/15781/12735
+f 14519/15781/12735 14523/15794/12748 24099/15404/12362 24098/15399/12357
+f 14518/15789/12743 25325/15791/12745 25326/15795/12749 14523/15794/12748
+f 14523/15794/12748 25326/15795/12749 30680/15405/12363 24099/15404/12362
+f 14524/15796/12750 14528/15797/12751 14529/15798/12752 14525/15799/12753
+f 14525/15799/12753 14529/15798/12752 25326/15795/12749 25325/15791/12745
+f 14528/15797/12751 24101/15415/12373 24100/15414/12372 14529/15798/12752
+f 14529/15798/12752 24100/15414/12372 30680/15405/12363 25326/15795/12749
+f 14524/15796/12750 14525/15799/12753 14530/15800/12754 14526/15801/12755
+f 14526/15801/12755 14530/15800/12754 24172/15802/12756 24173/15803/12757
+f 14525/15799/12753 25325/15791/12745 25324/15790/12744 14530/15800/12754
+f 14530/15800/12754 25324/15790/12744 30704/15793/12747 24172/15802/12756
+f 14524/15796/12750 14526/15801/12755 14531/15804/12758 14527/15805/12759
+f 14527/15805/12759 14531/15804/12758 25327/15806/12760 25328/15807/12761
+f 14526/15801/12755 24173/15803/12757 24174/15808/12762 14531/15804/12758
+f 14531/15804/12758 24174/15808/12762 30705/15809/12763 25327/15806/12760
+f 14524/15796/12750 14527/15805/12759 14532/15810/12764 14528/15797/12751
+f 14528/15797/12751 14532/15810/12764 24102/15420/12378 24101/15415/12373
+f 14527/15805/12759 25328/15807/12761 25329/15811/12765 14532/15810/12764
+f 14532/15810/12764 25329/15811/12765 30681/15421/12379 24102/15420/12378
+f 14533/15812/12766 14537/15813/12767 14538/15814/12768 14534/15815/12769
+f 14534/15815/12769 14538/15814/12768 25329/15811/12765 25328/15807/12761
+f 14537/15813/12767 24104/15431/12389 24103/15430/12388 14538/15814/12768
+f 14538/15814/12768 24103/15430/12388 30681/15421/12379 25329/15811/12765
+f 14533/15812/12766 14534/15815/12769 14539/15816/12770 14535/15817/12771
+f 14535/15817/12771 14539/15816/12770 24175/15818/12772 24176/15819/12773
+f 14534/15815/12769 25328/15807/12761 25327/15806/12760 14539/15816/12770
+f 14539/15816/12770 25327/15806/12760 30705/15809/12763 24175/15818/12772
+f 14533/15812/12766 14535/15817/12771 14540/15820/12774 14536/15821/12775
+f 14536/15821/12775 14540/15820/12774 25330/15822/12776 25331/15823/12777
+f 14535/15817/12771 24176/15819/12773 24177/15824/12778 14540/15820/12774
+f 14540/15820/12774 24177/15824/12778 30706/15825/12779 25330/15822/12776
+f 14533/15812/12766 14536/15821/12775 14541/15826/12780 14537/15813/12767
+f 14537/15813/12767 14541/15826/12780 24105/15436/12394 24104/15431/12389
+f 14536/15821/12775 25331/15823/12777 25332/15827/12781 14541/15826/12780
+f 14541/15826/12780 25332/15827/12781 30682/15437/12395 24105/15436/12394
+f 14542/15828/12782 14546/15829/12783 14547/15830/12784 14543/15831/12785
+f 14543/15831/12785 14547/15830/12784 25332/15827/12781 25331/15823/12777
+f 14546/15829/12783 24107/15447/12405 24106/15446/12404 14547/15830/12784
+f 14547/15830/12784 24106/15446/12404 30682/15437/12395 25332/15827/12781
+f 14542/15828/12782 14543/15831/12785 14548/15832/12786 14544/15833/12787
+f 14544/15833/12787 14548/15832/12786 24178/15834/12788 24179/15835/12789
+f 14543/15831/12785 25331/15823/12777 25330/15822/12776 14548/15832/12786
+f 14548/15832/12786 25330/15822/12776 30706/15825/12779 24178/15834/12788
+f 14542/15828/12782 14544/15833/12787 14549/15836/12790 14545/15837/12791
+f 14545/15837/12791 14549/15836/12790 25333/15838/12792 25334/15839/12793
+f 14544/15833/12787 24179/15835/12789 24180/15840/12794 14549/15836/12790
+f 14549/15836/12790 24180/15840/12794 30707/15841/12795 25333/15838/12792
+f 14542/15828/12782 14545/15837/12791 14550/15842/12796 14546/15829/12783
+f 14546/15829/12783 14550/15842/12796 24108/15452/12410 24107/15447/12405
+f 14545/15837/12791 25334/15839/12793 25335/15843/12797 14550/15842/12796
+f 14550/15842/12796 25335/15843/12797 30683/15453/12411 24108/15452/12410
+f 14551/15844/12798 14555/15845/12799 14556/15846/12800 14552/15847/12801
+f 14552/15847/12801 14556/15846/12800 25335/15843/12797 25334/15839/12793
+f 14555/15845/12799 24110/15463/12421 24109/15462/12420 14556/15846/12800
+f 14556/15846/12800 24109/15462/12420 30683/15453/12411 25335/15843/12797
+f 14551/15844/12798 14552/15847/12801 14557/15848/12802 14553/15849/12803
+f 14553/15849/12803 14557/15848/12802 24181/15850/12804 24182/15851/12805
+f 14552/15847/12801 25334/15839/12793 25333/15838/12792 14557/15848/12802
+f 14557/15848/12802 25333/15838/12792 30707/15841/12795 24181/15850/12804
+f 14551/15844/12798 14553/15849/12803 14558/15852/12806 14554/15853/12807
+f 14554/15853/12807 14558/15852/12806 25336/15854/12808 25337/15855/12809
+f 14553/15849/12803 24182/15851/12805 24183/15856/12810 14558/15852/12806
+f 14558/15852/12806 24183/15856/12810 30708/15857/12811 25336/15854/12808
+f 14551/15844/12798 14554/15853/12807 14559/15858/12812 14555/15845/12799
+f 14555/15845/12799 14559/15858/12812 24111/15468/12426 24110/15463/12421
+f 14554/15853/12807 25337/15855/12809 25338/15859/12813 14559/15858/12812
+f 14559/15858/12812 25338/15859/12813 30684/15469/12427 24111/15468/12426
+f 14560/15860/12814 14564/15861/12815 14565/15862/12816 14561/15863/12817
+f 14561/15863/12817 14565/15862/12816 25338/15859/12813 25337/15855/12809
+f 14564/15861/12815 24113/15479/12437 24112/15478/12436 14565/15862/12816
+f 14565/15862/12816 24112/15478/12436 30684/15469/12427 25338/15859/12813
+f 14560/15860/12814 14561/15863/12817 14566/15864/12818 14562/15865/12819
+f 14562/15865/12819 14566/15864/12818 24184/15866/12820 24185/15867/12821
+f 14561/15863/12817 25337/15855/12809 25336/15854/12808 14566/15864/12818
+f 14566/15864/12818 25336/15854/12808 30708/15857/12811 24184/15866/12820
+f 14560/15860/12814 14562/15865/12819 14567/15868/12822 14563/15869/12823
+f 14563/15869/12823 14567/15868/12822 25339/15870/12824 25340/15871/12825
+f 14562/15865/12819 24185/15867/12821 24186/15872/12826 14567/15868/12822
+f 14567/15868/12822 24186/15872/12826 30709/15873/12827 25339/15870/12824
+f 14560/15860/12814 14563/15869/12823 14568/15874/12828 14564/15861/12815
+f 14564/15861/12815 14568/15874/12828 24114/15484/12442 24113/15479/12437
+f 14563/15869/12823 25340/15871/12825 25341/15875/12829 14568/15874/12828
+f 14568/15874/12828 25341/15875/12829 30685/15485/12443 24114/15484/12442
+f 14569/15876/12830 14573/15877/12831 14574/15878/12832 14570/15879/12833
+f 14570/15879/12833 14574/15878/12832 25341/15875/12829 25340/15871/12825
+f 14573/15877/12831 24116/15495/12453 24115/15494/12452 14574/15878/12832
+f 14574/15878/12832 24115/15494/12452 30685/15485/12443 25341/15875/12829
+f 14569/15876/12830 14570/15879/12833 14575/15880/12834 14571/15881/12835
+f 14571/15881/12835 14575/15880/12834 24187/15882/12836 24188/15883/12837
+f 14570/15879/12833 25340/15871/12825 25339/15870/12824 14575/15880/12834
+f 14575/15880/12834 25339/15870/12824 30709/15873/12827 24187/15882/12836
+f 14569/15876/12830 14571/15881/12835 14576/15884/12838 14572/15885/12839
+f 14572/15885/12839 14576/15884/12838 25342/15886/12840 25343/15887/12841
+f 14571/15881/12835 24188/15883/12837 24189/15888/12842 14576/15884/12838
+f 14576/15884/12838 24189/15888/12842 30710/15889/12843 25342/15886/12840
+f 14569/15876/12830 14572/15885/12839 14577/15890/12844 14573/15877/12831
+f 14573/15877/12831 14577/15890/12844 24117/15500/12458 24116/15495/12453
+f 14572/15885/12839 25343/15887/12841 25344/15891/12845 14577/15890/12844
+f 14577/15890/12844 25344/15891/12845 30686/15501/12459 24117/15500/12458
+f 14578/15892/12846 14582/15893/12847 14583/15894/12848 14579/15895/12849
+f 14579/15895/12849 14583/15894/12848 25344/15896/12845 25343/15897/12841
+f 14582/15893/12847 24119/15513/12469 24118/15512/12468 14583/15894/12848
+f 14583/15894/12848 24118/15512/12468 30686/15515/12459 25344/15896/12845
+f 14578/15892/12846 14579/15895/12849 14584/15898/12850 14580/15899/12851
+f 14580/15899/12851 14584/15898/12850 24190/15900/12852 24191/15901/12853
+f 14579/15895/12849 25343/15897/12841 25342/15902/12840 14584/15898/12850
+f 14584/15898/12850 25342/15902/12840 30710/15903/12843 24190/15900/12852
+f 14578/15892/12846 14580/15899/12851 14585/15904/12854 14581/15905/12855
+f 14581/15905/12855 14585/15904/12854 25345/15906/12856 25346/15907/12857
+f 14580/15899/12851 24191/15901/12853 24192/15908/12858 14585/15904/12854
+f 14585/15904/12854 24192/15908/12858 30711/15909/12859 25345/15906/12856
+f 14578/15892/12846 14581/15905/12855 14586/15910/12860 14582/15893/12847
+f 14582/15893/12847 14586/15910/12860 24120/15520/12474 24119/15513/12469
+f 14581/15905/12855 25346/15907/12857 25347/15911/12861 14586/15910/12860
+f 14586/15910/12860 25347/15911/12861 30687/15521/12475 24120/15520/12474
+f 14587/15912/12862 14591/15913/12863 14592/15914/12864 14588/15915/12865
+f 14588/15915/12865 14592/15914/12864 25347/15911/12861 25346/15907/12857
+f 14591/15913/12863 24122/15531/12485 24121/15530/12484 14592/15914/12864
+f 14592/15914/12864 24121/15530/12484 30687/15521/12475 25347/15911/12861
+f 14587/15912/12862 14588/15915/12865 14593/15916/12866 14589/15917/12867
+f 14589/15917/12867 14593/15916/12866 24193/15918/12868 24194/15919/12869
+f 14588/15915/12865 25346/15907/12857 25345/15906/12856 14593/15916/12866
+f 14593/15916/12866 25345/15906/12856 30711/15909/12859 24193/15918/12868
+f 14587/15912/12862 14589/15917/12867 14594/15920/12870 14590/15921/12871
+f 14590/15921/12871 14594/15920/12870 25348/15922/12872 25349/15923/12873
+f 14589/15917/12867 24194/15919/12869 24195/15924/12874 14594/15920/12870
+f 14594/15920/12870 24195/15924/12874 30712/15925/12875 25348/15922/12872
+f 14587/15912/12862 14590/15921/12871 14595/15926/12876 14591/15913/12863
+f 14591/15913/12863 14595/15926/12876 24123/15536/12490 24122/15531/12485
+f 14590/15921/12871 25349/15923/12873 25350/15927/12877 14595/15926/12876
+f 14595/15926/12876 25350/15927/12877 30688/15537/12491 24123/15536/12490
+f 14596/15928/12878 14600/15929/12879 14601/15930/12880 14597/15931/12881
+f 14597/15931/12881 14601/15930/12880 25350/15927/12877 25349/15923/12873
+f 14600/15929/12879 24125/15547/12501 24124/15546/12500 14601/15930/12880
+f 14601/15930/12880 24124/15546/12500 30688/15537/12491 25350/15927/12877
+f 14596/15928/12878 14597/15931/12881 14602/15932/12882 14598/15933/12883
+f 14598/15933/12883 14602/15932/12882 24196/15934/12884 24197/15935/12885
+f 14597/15931/12881 25349/15923/12873 25348/15922/12872 14602/15932/12882
+f 14602/15932/12882 25348/15922/12872 30712/15925/12875 24196/15934/12884
+f 14596/15928/12878 14598/15933/12883 14603/15936/12886 14599/15937/12887
+f 14599/15937/12887 14603/15936/12886 25351/15938/12888 25352/15939/12889
+f 14598/15933/12883 24197/15935/12885 24198/15940/12890 14603/15936/12886
+f 14603/15936/12886 24198/15940/12890 30713/15941/12891 25351/15938/12888
+f 14596/15928/12878 14599/15937/12887 14604/15942/12892 14600/15929/12879
+f 14600/15929/12879 14604/15942/12892 24126/15552/12506 24125/15547/12501
+f 14599/15937/12887 25352/15939/12889 25353/15943/12893 14604/15942/12892
+f 14604/15942/12892 25353/15943/12893 30689/15553/12507 24126/15552/12506
+f 14605/15944/12894 14609/15945/12895 14610/15946/12896 14606/15947/12897
+f 14606/15947/12897 14610/15946/12896 25353/15943/12893 25352/15939/12889
+f 14609/15945/12895 24128/15563/12517 24127/15562/12516 14610/15946/12896
+f 14610/15946/12896 24127/15562/12516 30689/15553/12507 25353/15943/12893
+f 14605/15944/12894 14606/15947/12897 14611/15948/12898 14607/15949/12899
+f 14607/15949/12899 14611/15948/12898 24199/15950/12900 24200/15951/12901
+f 14606/15947/12897 25352/15939/12889 25351/15938/12888 14611/15948/12898
+f 14611/15948/12898 25351/15938/12888 30713/15941/12891 24199/15950/12900
+f 14605/15944/12894 14607/15949/12899 14612/15952/12902 14608/15953/12903
+f 14608/15953/12903 14612/15952/12902 25354/15954/12904 25355/15955/12905
+f 14607/15949/12899 24200/15951/12901 24201/15956/12906 14612/15952/12902
+f 14612/15952/12902 24201/15956/12906 30714/15957/12907 25354/15954/12904
+f 14605/15944/12894 14608/15953/12903 14613/15958/12908 14609/15945/12895
+f 14609/15945/12895 14613/15958/12908 24129/15568/12522 24128/15563/12517
+f 14608/15953/12903 25355/15955/12905 25356/15959/12909 14613/15958/12908
+f 14613/15958/12908 25356/15959/12909 30690/15569/12523 24129/15568/12522
+f 14614/15960/12910 14618/15961/12911 14619/15962/12912 14615/15963/12913
+f 14615/15963/12913 14619/15962/12912 25356/15959/12909 25355/15955/12905
+f 14618/15961/12911 24131/15579/12533 24130/15578/12532 14619/15962/12912
+f 14619/15962/12912 24130/15578/12532 30690/15569/12523 25356/15959/12909
+f 14614/15960/12910 14615/15963/12913 14620/15964/12914 14616/15965/12915
+f 14616/15965/12915 14620/15964/12914 24202/15966/12916 24203/15967/12917
+f 14615/15963/12913 25355/15955/12905 25354/15954/12904 14620/15964/12914
+f 14620/15964/12914 25354/15954/12904 30714/15957/12907 24202/15966/12916
+f 14614/15960/12910 14616/15965/12915 14621/15968/12918 14617/15969/12919
+f 14617/15969/12919 14621/15968/12918 25357/15970/12920 25358/15971/12921
+f 14616/15965/12915 24203/15967/12917 24204/15972/12922 14621/15968/12918
+f 14621/15968/12918 24204/15972/12922 30715/15973/12923 25357/15970/12920
+f 14614/15960/12910 14617/15969/12919 14622/15974/12924 14618/15961/12911
+f 14618/15961/12911 14622/15974/12924 24132/15584/12538 24131/15579/12533
+f 14617/15969/12919 25358/15971/12921 25359/15975/12925 14622/15974/12924
+f 14622/15974/12924 25359/15975/12925 30691/15585/12539 24132/15584/12538
+f 14623/15976/12926 14627/15977/12927 14628/15978/12928 14624/15979/12929
+f 14624/15979/12929 14628/15978/12928 25359/15975/12925 25358/15971/12921
+f 14627/15977/12927 24134/15595/12549 24133/15594/12548 14628/15978/12928
+f 14628/15978/12928 24133/15594/12548 30691/15585/12539 25359/15975/12925
+f 14623/15976/12926 14624/15979/12929 14629/15980/12930 14625/15981/12931
+f 14625/15981/12931 14629/15980/12930 24205/15982/12932 24206/15983/12933
+f 14624/15979/12929 25358/15971/12921 25357/15970/12920 14629/15980/12930
+f 14629/15980/12930 25357/15970/12920 30715/15973/12923 24205/15982/12932
+f 14623/15976/12926 14625/15981/12931 14630/15984/12934 14626/15985/12935
+f 14626/15985/12935 14630/15984/12934 25360/15986/12936 25361/15987/12937
+f 14625/15981/12931 24206/15983/12933 24207/15988/12938 14630/15984/12934
+f 14630/15984/12934 24207/15988/12938 30716/15989/12939 25360/15986/12936
+f 14623/15976/12926 14626/15985/12935 14631/15990/12940 14627/15977/12927
+f 14627/15977/12927 14631/15990/12940 24135/15600/12554 24134/15595/12549
+f 14626/15985/12935 25361/15987/12937 25362/15991/12941 14631/15990/12940
+f 14631/15990/12940 25362/15991/12941 30692/15601/12555 24135/15600/12554
+f 14632/15992/12942 14636/15993/12943 14637/15994/12944 14633/15995/12945
+f 14633/15995/12945 14637/15994/12944 25362/15991/12941 25361/15987/12937
+f 14636/15993/12943 24137/15611/12565 24136/15610/12564 14637/15994/12944
+f 14637/15994/12944 24136/15610/12564 30692/15601/12555 25362/15991/12941
+f 14632/15992/12942 14633/15995/12945 14638/15996/12946 14634/15997/12947
+f 14634/15997/12947 14638/15996/12946 24208/15998/12948 24209/15999/12949
+f 14633/15995/12945 25361/15987/12937 25360/15986/12936 14638/15996/12946
+f 14638/15996/12946 25360/15986/12936 30716/15989/12939 24208/15998/12948
+f 14632/15992/12942 14634/15997/12947 14639/16000/12950 14635/16001/12951
+f 14635/16001/12951 14639/16000/12950 25293/15626/12580 25292/15621/12575
+f 14634/15997/12947 24209/15999/12949 24210/16002/12952 14639/16000/12950
+f 14639/16000/12950 24210/16002/12952 30693/15627/12581 25293/15626/12580
+f 14632/15992/12942 14635/16001/12951 14640/16003/12953 14636/15993/12943
+f 14636/15993/12943 14640/16003/12953 24138/15614/12568 24137/15611/12565
+f 14635/16001/12951 25292/15621/12575 25291/15620/12574 14640/16003/12953
+f 14640/16003/12953 25291/15620/12574 30669/15239/12197 24138/15614/12568
+f 14641/16004/12954 14645/16005/12955 14646/16006/12956 14642/16007/12957
+f 14642/16007/12957 14646/16006/12956 25363/16008/12958 25364/16009/12959
+f 14645/16005/12955 24140/15625/12579 24139/15624/12578 14646/16006/12956
+f 14646/16006/12956 24139/15624/12578 30693/15627/12581 25363/16008/12958
+f 14641/16004/12954 14642/16007/12957 14647/16010/12960 14643/16011/12961
+f 14643/16011/12961 14647/16010/12960 24211/16012/12962 24212/16013/12963
+f 14642/16007/12957 25364/16009/12959 25365/16014/12964 14647/16010/12960
+f 14647/16010/12960 25365/16014/12964 30717/16015/12965 24211/16012/12962
+f 14641/16004/12954 14643/16011/12961 14648/16016/12966 14644/16017/12967
+f 14644/16017/12967 14648/16016/12966 25366/16018/12968 25367/16019/12969
+f 14643/16011/12961 24212/16013/12963 24213/16020/12970 14648/16016/12966
+f 14648/16016/12966 24213/16020/12970 30718/16021/12971 25366/16018/12968
+f 14641/16004/12954 14644/16017/12967 14649/16022/12972 14645/16005/12955
+f 14645/16005/12955 14649/16022/12972 24141/15632/12586 24140/15625/12579
+f 14644/16017/12967 25367/16019/12969 25368/16023/12973 14649/16022/12972
+f 14649/16022/12972 25368/16023/12973 30694/15633/12587 24141/15632/12586
+f 14650/16024/12974 14654/16025/12975 14655/16026/12976 14651/16027/12977
+f 14651/16027/12977 14655/16026/12976 25368/16023/12973 25367/16019/12969
+f 14654/16025/12975 24143/15643/12597 24142/15642/12596 14655/16026/12976
+f 14655/16026/12976 24142/15642/12596 30694/15633/12587 25368/16023/12973
+f 14650/16024/12974 14651/16027/12977 14656/16028/12978 14652/16029/12979
+f 14652/16029/12979 14656/16028/12978 24214/16030/12980 24215/16031/12981
+f 14651/16027/12977 25367/16019/12969 25366/16018/12968 14656/16028/12978
+f 14656/16028/12978 25366/16018/12968 30718/16021/12971 24214/16030/12980
+f 14650/16024/12974 14652/16029/12979 14657/16032/12982 14653/16033/12983
+f 14653/16033/12983 14657/16032/12982 25369/16034/12984 25370/16035/12985
+f 14652/16029/12979 24215/16031/12981 24216/16036/12986 14657/16032/12982
+f 14657/16032/12982 24216/16036/12986 30719/16037/12987 25369/16034/12984
+f 14650/16024/12974 14653/16033/12983 14658/16038/12988 14654/16025/12975
+f 14654/16025/12975 14658/16038/12988 24144/15648/12602 24143/15643/12597
+f 14653/16033/12983 25370/16035/12985 25371/16039/12989 14658/16038/12988
+f 14658/16038/12988 25371/16039/12989 30695/15649/12603 24144/15648/12602
+f 14659/16040/12990 14663/16041/12991 14664/16042/12992 14660/16043/12993
+f 14660/16043/12993 14664/16042/12992 25371/16039/12989 25370/16035/12985
+f 14663/16041/12991 24146/15659/12613 24145/15658/12612 14664/16042/12992
+f 14664/16042/12992 24145/15658/12612 30695/15649/12603 25371/16039/12989
+f 14659/16040/12990 14660/16043/12993 14665/16044/12994 14661/16045/12995
+f 14661/16045/12995 14665/16044/12994 24217/16046/12996 24218/16047/12997
+f 14660/16043/12993 25370/16035/12985 25369/16034/12984 14665/16044/12994
+f 14665/16044/12994 25369/16034/12984 30719/16037/12987 24217/16046/12996
+f 14659/16040/12990 14661/16045/12995 14666/16048/12998 14662/16049/12999
+f 14662/16049/12999 14666/16048/12998 25372/16050/13000 25373/16051/13001
+f 14661/16045/12995 24218/16047/12997 24219/16052/13002 14666/16048/12998
+f 14666/16048/12998 24219/16052/13002 30720/16053/13003 25372/16050/13000
+f 14659/16040/12990 14662/16049/12999 14667/16054/13004 14663/16041/12991
+f 14663/16041/12991 14667/16054/13004 24147/15664/12618 24146/15659/12613
+f 14662/16049/12999 25373/16051/13001 25374/16055/13005 14667/16054/13004
+f 14667/16054/13004 25374/16055/13005 30696/15665/12619 24147/15664/12618
+f 14668/16056/13006 14672/16057/13007 14673/16058/13008 14669/16059/13009
+f 14669/16059/13009 14673/16058/13008 25374/16055/13005 25373/16051/13001
+f 14672/16057/13007 24149/15675/12629 24148/15674/12628 14673/16058/13008
+f 14673/16058/13008 24148/15674/12628 30696/15665/12619 25374/16055/13005
+f 14668/16056/13006 14669/16059/13009 14674/16060/13010 14670/16061/13011
+f 14670/16061/13011 14674/16060/13010 24220/16062/13012 24221/16063/13013
+f 14669/16059/13009 25373/16051/13001 25372/16050/13000 14674/16060/13010
+f 14674/16060/13010 25372/16050/13000 30720/16053/13003 24220/16062/13012
+f 14668/16056/13006 14670/16061/13011 14675/16064/13014 14671/16065/13015
+f 14671/16065/13015 14675/16064/13014 25375/16066/13016 25376/16067/13017
+f 14670/16061/13011 24221/16063/13013 24222/16068/13018 14675/16064/13014
+f 14675/16064/13014 24222/16068/13018 30721/16069/13019 25375/16066/13016
+f 14668/16056/13006 14671/16065/13015 14676/16070/13020 14672/16057/13007
+f 14672/16057/13007 14676/16070/13020 24150/15680/12634 24149/15675/12629
+f 14671/16065/13015 25376/16067/13017 25377/16071/13021 14676/16070/13020
+f 14676/16070/13020 25377/16071/13021 30697/15681/12635 24150/15680/12634
+f 14677/16072/13022 14681/16073/13023 14682/16074/13024 14678/16075/13025
+f 14678/16075/13025 14682/16074/13024 25377/16071/13021 25376/16067/13017
+f 14681/16073/13023 24152/15691/12645 24151/15690/12644 14682/16074/13024
+f 14682/16074/13024 24151/15690/12644 30697/15681/12635 25377/16071/13021
+f 14677/16072/13022 14678/16075/13025 14683/16076/13026 14679/16077/13027
+f 14679/16077/13027 14683/16076/13026 24223/16078/13028 24224/16079/13029
+f 14678/16075/13025 25376/16067/13017 25375/16066/13016 14683/16076/13026
+f 14683/16076/13026 25375/16066/13016 30721/16069/13019 24223/16078/13028
+f 14677/16072/13022 14679/16077/13027 14684/16080/13030 14680/16081/13031
+f 14680/16081/13031 14684/16080/13030 25378/16082/13032 25379/16083/13033
+f 14679/16077/13027 24224/16079/13029 24225/16084/13034 14684/16080/13030
+f 14684/16080/13030 24225/16084/13034 30722/16085/13035 25378/16082/13032
+f 14677/16072/13022 14680/16081/13031 14685/16086/13036 14681/16073/13023
+f 14681/16073/13023 14685/16086/13036 24153/15696/12650 24152/15691/12645
+f 14680/16081/13031 25379/16083/13033 25380/16087/13037 14685/16086/13036
+f 14685/16086/13036 25380/16087/13037 30698/15697/12651 24153/15696/12650
+f 14686/16088/13038 14690/16089/13039 14691/16090/13040 14687/16091/13041
+f 14687/16091/13041 14691/16090/13040 25380/16087/13037 25379/16083/13033
+f 14690/16089/13039 24155/15707/12661 24154/15706/12660 14691/16090/13040
+f 14691/16090/13040 24154/15706/12660 30698/15697/12651 25380/16087/13037
+f 14686/16088/13038 14687/16091/13041 14692/16092/13042 14688/16093/13043
+f 14688/16093/13043 14692/16092/13042 24226/16094/13044 24227/16095/13045
+f 14687/16091/13041 25379/16083/13033 25378/16082/13032 14692/16092/13042
+f 14692/16092/13042 25378/16082/13032 30722/16085/13035 24226/16094/13044
+f 14686/16088/13038 14688/16093/13043 14693/16096/13046 14689/16097/13047
+f 14689/16097/13047 14693/16096/13046 25381/16098/13048 25382/16099/13049
+f 14688/16093/13043 24227/16095/13045 24228/16100/13050 14693/16096/13046
+f 14693/16096/13046 24228/16100/13050 30723/16101/13051 25381/16098/13048
+f 14686/16088/13038 14689/16097/13047 14694/16102/13052 14690/16089/13039
+f 14690/16089/13039 14694/16102/13052 24156/15712/12666 24155/15707/12661
+f 14689/16097/13047 25382/16099/13049 25383/16103/13053 14694/16102/13052
+f 14694/16102/13052 25383/16103/13053 30699/15713/12667 24156/15712/12666
+f 14695/16104/13054 14699/16105/13055 14700/16106/13056 14696/16107/13057
+f 14696/16107/13057 14700/16106/13056 25383/16103/13053 25382/16099/13049
+f 14699/16105/13055 24158/15723/12677 24157/15722/12676 14700/16106/13056
+f 14700/16106/13056 24157/15722/12676 30699/15713/12667 25383/16103/13053
+f 14695/16104/13054 14696/16107/13057 14701/16108/13058 14697/16109/13059
+f 14697/16109/13059 14701/16108/13058 24229/16110/13060 24230/16111/13061
+f 14696/16107/13057 25382/16099/13049 25381/16098/13048 14701/16108/13058
+f 14701/16108/13058 25381/16098/13048 30723/16101/13051 24229/16110/13060
+f 14695/16104/13054 14697/16109/13059 14702/16112/13062 14698/16113/13063
+f 14698/16113/13063 14702/16112/13062 25384/16114/13064 25385/16115/13065
+f 14697/16109/13059 24230/16111/13061 24231/16116/13066 14702/16112/13062
+f 14702/16112/13062 24231/16116/13066 30724/16117/13067 25384/16114/13064
+f 14695/16104/13054 14698/16113/13063 14703/16118/13068 14699/16105/13055
+f 14699/16105/13055 14703/16118/13068 24159/15728/12682 24158/15723/12677
+f 14698/16113/13063 25385/16115/13065 25386/16119/13069 14703/16118/13068
+f 14703/16118/13068 25386/16119/13069 30700/15729/12683 24159/15728/12682
+f 14704/16120/13070 14708/16121/13071 14709/16122/13072 14705/16123/13073
+f 14705/16123/13073 14709/16122/13072 25386/16119/13069 25385/16115/13065
+f 14708/16121/13071 24161/15739/12693 24160/15738/12692 14709/16122/13072
+f 14709/16122/13072 24160/15738/12692 30700/15729/12683 25386/16119/13069
+f 14704/16120/13070 14705/16123/13073 14710/16124/13074 14706/16125/13075
+f 14706/16125/13075 14710/16124/13074 24232/16126/13076 24233/16127/13077
+f 14705/16123/13073 25385/16115/13065 25384/16114/13064 14710/16124/13074
+f 14710/16124/13074 25384/16114/13064 30724/16117/13067 24232/16126/13076
+f 14704/16120/13070 14706/16125/13075 14711/16128/13078 14707/16129/13079
+f 14707/16129/13079 14711/16128/13078 25387/16130/13080 25388/16131/13081
+f 14706/16125/13075 24233/16127/13077 24234/16132/13082 14711/16128/13078
+f 14711/16128/13078 24234/16132/13082 30725/16133/13083 25387/16130/13080
+f 14704/16120/13070 14707/16129/13079 14712/16134/13084 14708/16121/13071
+f 14708/16121/13071 14712/16134/13084 24162/15744/12698 24161/15739/12693
+f 14707/16129/13079 25388/16131/13081 25389/16135/13085 14712/16134/13084
+f 14712/16134/13084 25389/16135/13085 30701/15745/12699 24162/15744/12698
+f 14713/16136/13086 14717/16137/13087 14718/16138/13088 14714/16139/13089
+f 14714/16139/13089 14718/16138/13088 25389/16135/13085 25388/16131/13081
+f 14717/16137/13087 24164/15755/12709 24163/15754/12708 14718/16138/13088
+f 14718/16138/13088 24163/15754/12708 30701/15745/12699 25389/16135/13085
+f 14713/16136/13086 14714/16139/13089 14719/16140/13090 14715/16141/13091
+f 14715/16141/13091 14719/16140/13090 24235/16142/13092 24236/16143/13093
+f 14714/16139/13089 25388/16131/13081 25387/16130/13080 14719/16140/13090
+f 14719/16140/13090 25387/16130/13080 30725/16133/13083 24235/16142/13092
+f 14713/16136/13086 14715/16141/13091 14720/16144/13094 14716/16145/13095
+f 14716/16145/13095 14720/16144/13094 25390/16146/13096 25391/16147/13097
+f 14715/16141/13091 24236/16143/13093 24237/16148/13098 14720/16144/13094
+f 14720/16144/13094 24237/16148/13098 30726/16149/13099 25390/16146/13096
+f 14713/16136/13086 14716/16145/13095 14721/16150/13100 14717/16137/13087
+f 14717/16137/13087 14721/16150/13100 24165/15760/12714 24164/15755/12709
+f 14716/16145/13095 25391/16147/13097 25392/16151/13101 14721/16150/13100
+f 14721/16150/13100 25392/16151/13101 30702/15761/12715 24165/15760/12714
+f 14722/16152/13102 14726/16153/13103 14727/16154/13104 14723/16155/13105
+f 14723/16155/13105 14727/16154/13104 25392/16151/13101 25391/16147/13097
+f 14726/16153/13103 24167/15771/12725 24166/15770/12724 14727/16154/13104
+f 14727/16154/13104 24166/15770/12724 30702/15761/12715 25392/16151/13101
+f 14722/16152/13102 14723/16155/13105 14728/16156/13106 14724/16157/13107
+f 14724/16157/13107 14728/16156/13106 24238/16158/13108 24239/16159/13109
+f 14723/16155/13105 25391/16147/13097 25390/16146/13096 14728/16156/13106
+f 14728/16156/13106 25390/16146/13096 30726/16149/13099 24238/16158/13108
+f 14722/16152/13102 14724/16157/13107 14729/16160/13110 14725/16161/13111
+f 14725/16161/13111 14729/16160/13110 25393/16162/13112 25394/16163/13113
+f 14724/16157/13107 24239/16159/13109 24240/16164/13114 14729/16160/13110
+f 14729/16160/13110 24240/16164/13114 30727/16165/13115 25393/16162/13112
+f 14722/16152/13102 14725/16161/13111 14730/16166/13116 14726/16153/13103
+f 14726/16153/13103 14730/16166/13116 24168/15776/12730 24167/15771/12725
+f 14725/16161/13111 25394/16163/13113 25395/16167/13117 14730/16166/13116
+f 14730/16166/13116 25395/16167/13117 30703/15777/12731 24168/15776/12730
+f 14731/16168/13118 14735/16169/13119 14736/16170/13120 14732/16171/13121
+f 14732/16171/13121 14736/16170/13120 25395/16167/13117 25394/16163/13113
+f 14735/16169/13119 24170/15787/12741 24169/15786/12740 14736/16170/13120
+f 14736/16170/13120 24169/15786/12740 30703/15777/12731 25395/16167/13117
+f 14731/16168/13118 14732/16171/13121 14737/16172/13122 14733/16173/13123
+f 14733/16173/13123 14737/16172/13122 24241/16174/13124 24242/16175/13125
+f 14732/16171/13121 25394/16163/13113 25393/16162/13112 14737/16172/13122
+f 14737/16172/13122 25393/16162/13112 30727/16165/13115 24241/16174/13124
+f 14731/16168/13118 14733/16173/13123 14738/16176/13126 14734/16177/13127
+f 14734/16177/13127 14738/16176/13126 25396/16178/13128 25397/16179/13129
+f 14733/16173/13123 24242/16175/13125 24243/16180/13130 14738/16176/13126
+f 14738/16176/13126 24243/16180/13130 30728/16181/13131 25396/16178/13128
+f 14731/16168/13118 14734/16177/13127 14739/16182/13132 14735/16169/13119
+f 14735/16169/13119 14739/16182/13132 24171/15792/12746 24170/15787/12741
+f 14734/16177/13127 25397/16179/13129 25398/16183/13133 14739/16182/13132
+f 14739/16182/13132 25398/16183/13133 30704/15793/12747 24171/15792/12746
+f 14740/16184/13134 14744/16185/13135 14745/16186/13136 14741/16187/13137
+f 14741/16187/13137 14745/16186/13136 25398/16183/13133 25397/16179/13129
+f 14744/16185/13135 24173/15803/12757 24172/15802/12756 14745/16186/13136
+f 14745/16186/13136 24172/15802/12756 30704/15793/12747 25398/16183/13133
+f 14740/16184/13134 14741/16187/13137 14746/16188/13138 14742/16189/13139
+f 14742/16189/13139 14746/16188/13138 24244/16190/13140 24245/16191/13141
+f 14741/16187/13137 25397/16179/13129 25396/16178/13128 14746/16188/13138
+f 14746/16188/13138 25396/16178/13128 30728/16181/13131 24244/16190/13140
+f 14740/16184/13134 14742/16189/13139 14747/16192/13142 14743/16193/13143
+f 14743/16193/13143 14747/16192/13142 25399/16194/13144 25400/16195/13145
+f 14742/16189/13139 24245/16191/13141 24246/16196/13146 14747/16192/13142
+f 14747/16192/13142 24246/16196/13146 30729/16197/13147 25399/16194/13144
+f 14740/16184/13134 14743/16193/13143 14748/16198/13148 14744/16185/13135
+f 14744/16185/13135 14748/16198/13148 24174/15808/12762 24173/15803/12757
+f 14743/16193/13143 25400/16195/13145 25401/16199/13149 14748/16198/13148
+f 14748/16198/13148 25401/16199/13149 30705/15809/12763 24174/15808/12762
+f 14749/16200/13150 14753/16201/13151 14754/16202/13152 14750/16203/13153
+f 14750/16203/13153 14754/16202/13152 25401/16199/13149 25400/16195/13145
+f 14753/16201/13151 24176/15819/12773 24175/15818/12772 14754/16202/13152
+f 14754/16202/13152 24175/15818/12772 30705/15809/12763 25401/16199/13149
+f 14749/16200/13150 14750/16203/13153 14755/16204/13154 14751/16205/13155
+f 14751/16205/13155 14755/16204/13154 24247/16206/13156 24248/16207/13157
+f 14750/16203/13153 25400/16195/13145 25399/16194/13144 14755/16204/13154
+f 14755/16204/13154 25399/16194/13144 30729/16197/13147 24247/16206/13156
+f 14749/16200/13150 14751/16205/13155 14756/16208/13158 14752/16209/13159
+f 14752/16209/13159 14756/16208/13158 25402/16210/13160 25403/16211/13161
+f 14751/16205/13155 24248/16207/13157 24249/16212/13162 14756/16208/13158
+f 14756/16208/13158 24249/16212/13162 30730/16213/13163 25402/16210/13160
+f 14749/16200/13150 14752/16209/13159 14757/16214/13164 14753/16201/13151
+f 14753/16201/13151 14757/16214/13164 24177/15824/12778 24176/15819/12773
+f 14752/16209/13159 25403/16211/13161 25404/16215/13165 14757/16214/13164
+f 14757/16214/13164 25404/16215/13165 30706/15825/12779 24177/15824/12778
+f 14758/16216/13166 14762/16217/13167 14763/16218/13168 14759/16219/13169
+f 14759/16219/13169 14763/16218/13168 25404/16215/13165 25403/16211/13161
+f 14762/16217/13167 24179/15835/12789 24178/15834/12788 14763/16218/13168
+f 14763/16218/13168 24178/15834/12788 30706/15825/12779 25404/16215/13165
+f 14758/16216/13166 14759/16219/13169 14764/16220/13170 14760/16221/13171
+f 14760/16221/13171 14764/16220/13170 24250/16222/13172 24251/16223/13173
+f 14759/16219/13169 25403/16211/13161 25402/16210/13160 14764/16220/13170
+f 14764/16220/13170 25402/16210/13160 30730/16213/13163 24250/16222/13172
+f 14758/16216/13166 14760/16221/13171 14765/16224/13174 14761/16225/13175
+f 14761/16225/13175 14765/16224/13174 25405/16226/13176 25406/16227/13177
+f 14760/16221/13171 24251/16223/13173 24252/16228/13178 14765/16224/13174
+f 14765/16224/13174 24252/16228/13178 30731/16229/13179 25405/16226/13176
+f 14758/16216/13166 14761/16225/13175 14766/16230/13180 14762/16217/13167
+f 14762/16217/13167 14766/16230/13180 24180/15840/12794 24179/15835/12789
+f 14761/16225/13175 25406/16227/13177 25407/16231/13181 14766/16230/13180
+f 14766/16230/13180 25407/16231/13181 30707/15841/12795 24180/15840/12794
+f 14767/16232/13182 14771/16233/13183 14772/16234/13184 14768/16235/13185
+f 14768/16235/13185 14772/16234/13184 25407/16231/13181 25406/16227/13177
+f 14771/16233/13183 24182/15851/12805 24181/15850/12804 14772/16234/13184
+f 14772/16234/13184 24181/15850/12804 30707/15841/12795 25407/16231/13181
+f 14767/16232/13182 14768/16235/13185 14773/16236/13186 14769/16237/13187
+f 14769/16237/13187 14773/16236/13186 24253/16238/13188 24254/16239/13189
+f 14768/16235/13185 25406/16227/13177 25405/16226/13176 14773/16236/13186
+f 14773/16236/13186 25405/16226/13176 30731/16229/13179 24253/16238/13188
+f 14767/16232/13182 14769/16237/13187 14774/16240/13190 14770/16241/13191
+f 14770/16241/13191 14774/16240/13190 25408/16242/13192 25409/16243/13193
+f 14769/16237/13187 24254/16239/13189 24255/16244/13194 14774/16240/13190
+f 14774/16240/13190 24255/16244/13194 30732/16245/13195 25408/16242/13192
+f 14767/16232/13182 14770/16241/13191 14775/16246/13196 14771/16233/13183
+f 14771/16233/13183 14775/16246/13196 24183/15856/12810 24182/15851/12805
+f 14770/16241/13191 25409/16243/13193 25410/16247/13197 14775/16246/13196
+f 14775/16246/13196 25410/16247/13197 30708/15857/12811 24183/15856/12810
+f 14776/16248/13198 14780/16249/13199 14781/16250/13200 14777/16251/13201
+f 14777/16251/13201 14781/16250/13200 25410/16247/13197 25409/16243/13193
+f 14780/16249/13199 24185/15867/12821 24184/15866/12820 14781/16250/13200
+f 14781/16250/13200 24184/15866/12820 30708/15857/12811 25410/16247/13197
+f 14776/16248/13198 14777/16251/13201 14782/16252/13202 14778/16253/13203
+f 14778/16253/13203 14782/16252/13202 24256/16254/13204 24257/16255/13205
+f 14777/16251/13201 25409/16243/13193 25408/16242/13192 14782/16252/13202
+f 14782/16252/13202 25408/16242/13192 30732/16245/13195 24256/16254/13204
+f 14776/16248/13198 14778/16253/13203 14783/16256/13206 14779/16257/13207
+f 14779/16257/13207 14783/16256/13206 25411/16258/13208 25412/16259/13209
+f 14778/16253/13203 24257/16255/13205 24258/16260/13210 14783/16256/13206
+f 14783/16256/13206 24258/16260/13210 30733/16261/13211 25411/16258/13208
+f 14776/16248/13198 14779/16257/13207 14784/16262/13212 14780/16249/13199
+f 14780/16249/13199 14784/16262/13212 24186/15872/12826 24185/15867/12821
+f 14779/16257/13207 25412/16259/13209 25413/16263/13213 14784/16262/13212
+f 14784/16262/13212 25413/16263/13213 30709/15873/12827 24186/15872/12826
+f 14785/16264/13214 14789/16265/13215 14790/16266/13216 14786/16267/13217
+f 14786/16267/13217 14790/16266/13216 25413/16263/13213 25412/16259/13209
+f 14789/16265/13215 24188/15883/12837 24187/15882/12836 14790/16266/13216
+f 14790/16266/13216 24187/15882/12836 30709/15873/12827 25413/16263/13213
+f 14785/16264/13214 14786/16267/13217 14791/16268/13218 14787/16269/13219
+f 14787/16269/13219 14791/16268/13218 24259/16270/13220 24260/16271/13221
+f 14786/16267/13217 25412/16259/13209 25411/16258/13208 14791/16268/13218
+f 14791/16268/13218 25411/16258/13208 30733/16261/13211 24259/16270/13220
+f 14785/16264/13214 14787/16269/13219 14792/16272/13222 14788/16273/13223
+f 14788/16273/13223 14792/16272/13222 25414/16274/13224 25415/16275/13225
+f 14787/16269/13219 24260/16271/13221 24261/16276/13226 14792/16272/13222
+f 14792/16272/13222 24261/16276/13226 30734/16277/13227 25414/16274/13224
+f 14785/16264/13214 14788/16273/13223 14793/16278/13228 14789/16265/13215
+f 14789/16265/13215 14793/16278/13228 24189/15888/12842 24188/15883/12837
+f 14788/16273/13223 25415/16275/13225 25416/16279/13229 14793/16278/13228
+f 14793/16278/13228 25416/16279/13229 30710/15889/12843 24189/15888/12842
+f 14794/16280/13230 14798/16281/13231 14799/16282/13232 14795/16283/13233
+f 14795/16283/13233 14799/16282/13232 25416/16284/13229 25415/16285/13225
+f 14798/16281/13231 24191/15901/12853 24190/15900/12852 14799/16282/13232
+f 14799/16282/13232 24190/15900/12852 30710/15903/12843 25416/16284/13229
+f 14794/16280/13230 14795/16283/13233 14800/16286/13234 14796/16287/13235
+f 14796/16287/13235 14800/16286/13234 24262/16288/13236 24263/16289/13237
+f 14795/16283/13233 25415/16285/13225 25414/16290/13224 14800/16286/13234
+f 14800/16286/13234 25414/16290/13224 30734/16291/13227 24262/16288/13236
+f 14794/16280/13230 14796/16287/13235 14801/16292/13238 14797/16293/13239
+f 14797/16293/13239 14801/16292/13238 25417/16294/13240 25418/16295/13241
+f 14796/16287/13235 24263/16289/13237 24264/16296/13242 14801/16292/13238
+f 14801/16292/13238 24264/16296/13242 30735/16297/13243 25417/16294/13240
+f 14794/16280/13230 14797/16293/13239 14802/16298/13244 14798/16281/13231
+f 14798/16281/13231 14802/16298/13244 24192/15908/12858 24191/15901/12853
+f 14797/16293/13239 25418/16295/13241 25419/16299/13245 14802/16298/13244
+f 14802/16298/13244 25419/16299/13245 30711/15909/12859 24192/15908/12858
+f 14803/16300/13246 14807/16301/13247 14808/16302/13248 14804/16303/13249
+f 14804/16303/13249 14808/16302/13248 25419/16299/13245 25418/16295/13241
+f 14807/16301/13247 24194/15919/12869 24193/15918/12868 14808/16302/13248
+f 14808/16302/13248 24193/15918/12868 30711/15909/12859 25419/16299/13245
+f 14803/16300/13246 14804/16303/13249 14809/16304/13250 14805/16305/13251
+f 14805/16305/13251 14809/16304/13250 24265/16306/13252 24266/16307/13253
+f 14804/16303/13249 25418/16295/13241 25417/16294/13240 14809/16304/13250
+f 14809/16304/13250 25417/16294/13240 30735/16297/13243 24265/16306/13252
+f 14803/16300/13246 14805/16305/13251 14810/16308/13254 14806/16309/13255
+f 14806/16309/13255 14810/16308/13254 25420/16310/13256 25421/16311/13257
+f 14805/16305/13251 24266/16307/13253 24267/16312/13258 14810/16308/13254
+f 14810/16308/13254 24267/16312/13258 30736/16313/13259 25420/16310/13256
+f 14803/16300/13246 14806/16309/13255 14811/16314/13260 14807/16301/13247
+f 14807/16301/13247 14811/16314/13260 24195/15924/12874 24194/15919/12869
+f 14806/16309/13255 25421/16311/13257 25422/16315/13261 14811/16314/13260
+f 14811/16314/13260 25422/16315/13261 30712/15925/12875 24195/15924/12874
+f 14812/16316/13262 14816/16317/13263 14817/16318/13264 14813/16319/13265
+f 14813/16319/13265 14817/16318/13264 25422/16315/13261 25421/16311/13257
+f 14816/16317/13263 24197/15935/12885 24196/15934/12884 14817/16318/13264
+f 14817/16318/13264 24196/15934/12884 30712/15925/12875 25422/16315/13261
+f 14812/16316/13262 14813/16319/13265 14818/16320/13266 14814/16321/13267
+f 14814/16321/13267 14818/16320/13266 24268/16322/13268 24269/16323/13269
+f 14813/16319/13265 25421/16311/13257 25420/16310/13256 14818/16320/13266
+f 14818/16320/13266 25420/16310/13256 30736/16313/13259 24268/16322/13268
+f 14812/16316/13262 14814/16321/13267 14819/16324/13270 14815/16325/13271
+f 14815/16325/13271 14819/16324/13270 25423/16326/13272 25424/16327/13273
+f 14814/16321/13267 24269/16323/13269 24270/16328/13274 14819/16324/13270
+f 14819/16324/13270 24270/16328/13274 30737/16329/13275 25423/16326/13272
+f 14812/16316/13262 14815/16325/13271 14820/16330/13276 14816/16317/13263
+f 14816/16317/13263 14820/16330/13276 24198/15940/12890 24197/15935/12885
+f 14815/16325/13271 25424/16327/13273 25425/16331/13277 14820/16330/13276
+f 14820/16330/13276 25425/16331/13277 30713/15941/12891 24198/15940/12890
+f 14821/16332/13278 14825/16333/13279 14826/16334/13280 14822/16335/13281
+f 14822/16335/13281 14826/16334/13280 25425/16331/13277 25424/16327/13273
+f 14825/16333/13279 24200/15951/12901 24199/15950/12900 14826/16334/13280
+f 14826/16334/13280 24199/15950/12900 30713/15941/12891 25425/16331/13277
+f 14821/16332/13278 14822/16335/13281 14827/16336/13282 14823/16337/13283
+f 14823/16337/13283 14827/16336/13282 24271/16338/13284 24272/16339/13285
+f 14822/16335/13281 25424/16327/13273 25423/16326/13272 14827/16336/13282
+f 14827/16336/13282 25423/16326/13272 30737/16329/13275 24271/16338/13284
+f 14821/16332/13278 14823/16337/13283 14828/16340/13286 14824/16341/13287
+f 14824/16341/13287 14828/16340/13286 25426/16342/13288 25427/16343/13289
+f 14823/16337/13283 24272/16339/13285 24273/16344/13290 14828/16340/13286
+f 14828/16340/13286 24273/16344/13290 30738/16345/13291 25426/16342/13288
+f 14821/16332/13278 14824/16341/13287 14829/16346/13292 14825/16333/13279
+f 14825/16333/13279 14829/16346/13292 24201/15956/12906 24200/15951/12901
+f 14824/16341/13287 25427/16343/13289 25428/16347/13293 14829/16346/13292
+f 14829/16346/13292 25428/16347/13293 30714/15957/12907 24201/15956/12906
+f 14830/16348/13294 14834/16349/13295 14835/16350/13296 14831/16351/13297
+f 14831/16351/13297 14835/16350/13296 25428/16347/13293 25427/16343/13289
+f 14834/16349/13295 24203/15967/12917 24202/15966/12916 14835/16350/13296
+f 14835/16350/13296 24202/15966/12916 30714/15957/12907 25428/16347/13293
+f 14830/16348/13294 14831/16351/13297 14836/16352/13298 14832/16353/13299
+f 14832/16353/13299 14836/16352/13298 24274/16354/13300 24275/16355/13301
+f 14831/16351/13297 25427/16343/13289 25426/16342/13288 14836/16352/13298
+f 14836/16352/13298 25426/16342/13288 30738/16345/13291 24274/16354/13300
+f 14830/16348/13294 14832/16353/13299 14837/16356/13302 14833/16357/13303
+f 14833/16357/13303 14837/16356/13302 25429/16358/13304 25430/16359/13305
+f 14832/16353/13299 24275/16355/13301 24276/16360/13306 14837/16356/13302
+f 14837/16356/13302 24276/16360/13306 30739/16361/13307 25429/16358/13304
+f 14830/16348/13294 14833/16357/13303 14838/16362/13308 14834/16349/13295
+f 14834/16349/13295 14838/16362/13308 24204/15972/12922 24203/15967/12917
+f 14833/16357/13303 25430/16359/13305 25431/16363/13309 14838/16362/13308
+f 14838/16362/13308 25431/16363/13309 30715/15973/12923 24204/15972/12922
+f 14839/16364/13310 14843/16365/13311 14844/16366/13312 14840/16367/13313
+f 14840/16367/13313 14844/16366/13312 25431/16363/13309 25430/16359/13305
+f 14843/16365/13311 24206/15983/12933 24205/15982/12932 14844/16366/13312
+f 14844/16366/13312 24205/15982/12932 30715/15973/12923 25431/16363/13309
+f 14839/16364/13310 14840/16367/13313 14845/16368/13314 14841/16369/13315
+f 14841/16369/13315 14845/16368/13314 24277/16370/13316 24278/16371/13317
+f 14840/16367/13313 25430/16359/13305 25429/16358/13304 14845/16368/13314
+f 14845/16368/13314 25429/16358/13304 30739/16361/13307 24277/16370/13316
+f 14839/16364/13310 14841/16369/13315 14846/16372/13318 14842/16373/13319
+f 14842/16373/13319 14846/16372/13318 25432/16374/13320 25433/16375/13321
+f 14841/16369/13315 24278/16371/13317 24279/16376/13322 14846/16372/13318
+f 14846/16372/13318 24279/16376/13322 30740/16377/13323 25432/16374/13320
+f 14839/16364/13310 14842/16373/13319 14847/16378/13324 14843/16365/13311
+f 14843/16365/13311 14847/16378/13324 24207/15988/12938 24206/15983/12933
+f 14842/16373/13319 25433/16375/13321 25434/16379/13325 14847/16378/13324
+f 14847/16378/13324 25434/16379/13325 30716/15989/12939 24207/15988/12938
+f 14848/16380/13326 14852/16381/13327 14853/16382/13328 14849/16383/13329
+f 14849/16383/13329 14853/16382/13328 25434/16379/13325 25433/16375/13321
+f 14852/16381/13327 24209/15999/12949 24208/15998/12948 14853/16382/13328
+f 14853/16382/13328 24208/15998/12948 30716/15989/12939 25434/16379/13325
+f 14848/16380/13326 14849/16383/13329 14854/16384/13330 14850/16385/13331
+f 14850/16385/13331 14854/16384/13330 24280/16386/13332 24281/16387/13333
+f 14849/16383/13329 25433/16375/13321 25432/16374/13320 14854/16384/13330
+f 14854/16384/13330 25432/16374/13320 30740/16377/13323 24280/16386/13332
+f 14848/16380/13326 14850/16385/13331 14855/16388/13334 14851/16389/13335
+f 14851/16389/13335 14855/16388/13334 25365/16014/12964 25364/16009/12959
+f 14850/16385/13331 24281/16387/13333 24282/16390/13336 14855/16388/13334
+f 14855/16388/13334 24282/16390/13336 30717/16015/12965 25365/16014/12964
+f 14848/16380/13326 14851/16389/13335 14856/16391/13337 14852/16381/13327
+f 14852/16381/13327 14856/16391/13337 24210/16002/12952 24209/15999/12949
+f 14851/16389/13335 25364/16009/12959 25363/16008/12958 14856/16391/13337
+f 14856/16391/13337 25363/16008/12958 30693/15627/12581 24210/16002/12952
+f 14857/16392/13338 14861/16393/13339 14862/16394/13340 14858/16395/13341
+f 14858/16395/13341 14862/16394/13340 25435/16396/13342 25436/16397/13343
+f 14861/16393/13339 24212/16013/12963 24211/16012/12962 14862/16394/13340
+f 14862/16394/13340 24211/16012/12962 30717/16015/12965 25435/16396/13342
+f 14857/16392/13338 14858/16395/13341 14863/16398/13344 14859/16399/13345
+f 14859/16399/13345 14863/16398/13344 24283/16400/13346 24284/16401/13347
+f 14858/16395/13341 25436/16397/13343 25437/16402/13348 14863/16398/13344
+f 14863/16398/13344 25437/16402/13348 30741/16403/13349 24283/16400/13346
+f 14857/16392/13338 14859/16399/13345 14864/16404/13350 14860/16405/13351
+f 14860/16405/13351 14864/16404/13350 25438/16406/13352 25439/16407/13353
+f 14859/16399/13345 24284/16401/13347 24285/16408/13354 14864/16404/13350
+f 14864/16404/13350 24285/16408/13354 30742/16409/13355 25438/16406/13352
+f 14857/16392/13338 14860/16405/13351 14865/16410/13356 14861/16393/13339
+f 14861/16393/13339 14865/16410/13356 24213/16020/12970 24212/16013/12963
+f 14860/16405/13351 25439/16407/13353 25440/16411/13357 14865/16410/13356
+f 14865/16410/13356 25440/16411/13357 30718/16021/12971 24213/16020/12970
+f 14866/16412/13358 14870/16413/13359 14871/16414/13360 14867/16415/13361
+f 14867/16415/13361 14871/16414/13360 25440/16411/13357 25439/16407/13353
+f 14870/16413/13359 24215/16031/12981 24214/16030/12980 14871/16414/13360
+f 14871/16414/13360 24214/16030/12980 30718/16021/12971 25440/16411/13357
+f 14866/16412/13358 14867/16415/13361 14872/16416/13362 14868/16417/13363
+f 14868/16417/13363 14872/16416/13362 24286/16418/13364 24287/16419/13365
+f 14867/16415/13361 25439/16407/13353 25438/16406/13352 14872/16416/13362
+f 14872/16416/13362 25438/16406/13352 30742/16409/13355 24286/16418/13364
+f 14866/16412/13358 14868/16417/13363 14873/16420/13366 14869/16421/13367
+f 14869/16421/13367 14873/16420/13366 25441/16422/13368 25442/16423/13369
+f 14868/16417/13363 24287/16419/13365 24288/16424/13370 14873/16420/13366
+f 14873/16420/13366 24288/16424/13370 30743/16425/13371 25441/16422/13368
+f 14866/16412/13358 14869/16421/13367 14874/16426/13372 14870/16413/13359
+f 14870/16413/13359 14874/16426/13372 24216/16036/12986 24215/16031/12981
+f 14869/16421/13367 25442/16423/13369 25443/16427/13373 14874/16426/13372
+f 14874/16426/13372 25443/16427/13373 30719/16037/12987 24216/16036/12986
+f 14875/16428/13374 14879/16429/13375 14880/16430/13376 14876/16431/13377
+f 14876/16431/13377 14880/16430/13376 25443/16427/13373 25442/16423/13369
+f 14879/16429/13375 24218/16047/12997 24217/16046/12996 14880/16430/13376
+f 14880/16430/13376 24217/16046/12996 30719/16037/12987 25443/16427/13373
+f 14875/16428/13374 14876/16431/13377 14881/16432/13378 14877/16433/13379
+f 14877/16433/13379 14881/16432/13378 24289/16434/13380 24290/16435/13381
+f 14876/16431/13377 25442/16423/13369 25441/16422/13368 14881/16432/13378
+f 14881/16432/13378 25441/16422/13368 30743/16425/13371 24289/16434/13380
+f 14875/16428/13374 14877/16433/13379 14882/16436/13382 14878/16437/13383
+f 14878/16437/13383 14882/16436/13382 25444/16438/13384 25445/16439/13385
+f 14877/16433/13379 24290/16435/13381 24291/16440/13386 14882/16436/13382
+f 14882/16436/13382 24291/16440/13386 30744/16441/13387 25444/16438/13384
+f 14875/16428/13374 14878/16437/13383 14883/16442/13388 14879/16429/13375
+f 14879/16429/13375 14883/16442/13388 24219/16052/13002 24218/16047/12997
+f 14878/16437/13383 25445/16439/13385 25446/16443/13389 14883/16442/13388
+f 14883/16442/13388 25446/16443/13389 30720/16053/13003 24219/16052/13002
+f 14884/16444/13390 14888/16445/13391 14889/16446/13392 14885/16447/13393
+f 14885/16447/13393 14889/16446/13392 25446/16443/13389 25445/16439/13385
+f 14888/16445/13391 24221/16063/13013 24220/16062/13012 14889/16446/13392
+f 14889/16446/13392 24220/16062/13012 30720/16053/13003 25446/16443/13389
+f 14884/16444/13390 14885/16447/13393 14890/16448/13394 14886/16449/13395
+f 14886/16449/13395 14890/16448/13394 24292/16450/13396 24293/16451/13397
+f 14885/16447/13393 25445/16439/13385 25444/16438/13384 14890/16448/13394
+f 14890/16448/13394 25444/16438/13384 30744/16441/13387 24292/16450/13396
+f 14884/16444/13390 14886/16449/13395 14891/16452/13398 14887/16453/13399
+f 14887/16453/13399 14891/16452/13398 25447/16454/13400 25448/16455/13401
+f 14886/16449/13395 24293/16451/13397 24294/16456/13402 14891/16452/13398
+f 14891/16452/13398 24294/16456/13402 30745/16457/13403 25447/16454/13400
+f 14884/16444/13390 14887/16453/13399 14892/16458/13404 14888/16445/13391
+f 14888/16445/13391 14892/16458/13404 24222/16068/13018 24221/16063/13013
+f 14887/16453/13399 25448/16455/13401 25449/16459/13405 14892/16458/13404
+f 14892/16458/13404 25449/16459/13405 30721/16069/13019 24222/16068/13018
+f 14893/16460/13406 14897/16461/13407 14898/16462/13408 14894/16463/13409
+f 14894/16463/13409 14898/16462/13408 25449/16459/13405 25448/16455/13401
+f 14897/16461/13407 24224/16079/13029 24223/16078/13028 14898/16462/13408
+f 14898/16462/13408 24223/16078/13028 30721/16069/13019 25449/16459/13405
+f 14893/16460/13406 14894/16463/13409 14899/16464/13410 14895/16465/13411
+f 14895/16465/13411 14899/16464/13410 24295/16466/13412 24296/16467/13413
+f 14894/16463/13409 25448/16455/13401 25447/16454/13400 14899/16464/13410
+f 14899/16464/13410 25447/16454/13400 30745/16457/13403 24295/16466/13412
+f 14893/16460/13406 14895/16465/13411 14900/16468/13414 14896/16469/13415
+f 14896/16469/13415 14900/16468/13414 25450/16470/13416 25451/16471/13417
+f 14895/16465/13411 24296/16467/13413 24297/16472/13418 14900/16468/13414
+f 14900/16468/13414 24297/16472/13418 30746/16473/13419 25450/16470/13416
+f 14893/16460/13406 14896/16469/13415 14901/16474/13420 14897/16461/13407
+f 14897/16461/13407 14901/16474/13420 24225/16084/13034 24224/16079/13029
+f 14896/16469/13415 25451/16471/13417 25452/16475/13421 14901/16474/13420
+f 14901/16474/13420 25452/16475/13421 30722/16085/13035 24225/16084/13034
+f 14902/16476/13422 14906/16477/13423 14907/16478/13424 14903/16479/13425
+f 14903/16479/13425 14907/16478/13424 25452/16475/13421 25451/16471/13417
+f 14906/16477/13423 24227/16095/13045 24226/16094/13044 14907/16478/13424
+f 14907/16478/13424 24226/16094/13044 30722/16085/13035 25452/16475/13421
+f 14902/16476/13422 14903/16479/13425 14908/16480/13426 14904/16481/13427
+f 14904/16481/13427 14908/16480/13426 24298/16482/13428 24299/16483/13429
+f 14903/16479/13425 25451/16471/13417 25450/16470/13416 14908/16480/13426
+f 14908/16480/13426 25450/16470/13416 30746/16473/13419 24298/16482/13428
+f 14902/16476/13422 14904/16481/13427 14909/16484/13430 14905/16485/13431
+f 14905/16485/13431 14909/16484/13430 25453/16486/13432 25454/16487/13433
+f 14904/16481/13427 24299/16483/13429 24300/16488/13434 14909/16484/13430
+f 14909/16484/13430 24300/16488/13434 30747/16489/13435 25453/16486/13432
+f 14902/16476/13422 14905/16485/13431 14910/16490/13436 14906/16477/13423
+f 14906/16477/13423 14910/16490/13436 24228/16100/13050 24227/16095/13045
+f 14905/16485/13431 25454/16487/13433 25455/16491/13437 14910/16490/13436
+f 14910/16490/13436 25455/16491/13437 30723/16101/13051 24228/16100/13050
+f 14911/16492/13438 14915/16493/13439 14916/16494/13440 14912/16495/13441
+f 14912/16495/13441 14916/16494/13440 25455/16491/13437 25454/16487/13433
+f 14915/16493/13439 24230/16111/13061 24229/16110/13060 14916/16494/13440
+f 14916/16494/13440 24229/16110/13060 30723/16101/13051 25455/16491/13437
+f 14911/16492/13438 14912/16495/13441 14917/16496/13442 14913/16497/13443
+f 14913/16497/13443 14917/16496/13442 24301/16498/13444 24302/16499/13445
+f 14912/16495/13441 25454/16487/13433 25453/16486/13432 14917/16496/13442
+f 14917/16496/13442 25453/16486/13432 30747/16489/13435 24301/16498/13444
+f 14911/16492/13438 14913/16497/13443 14918/16500/13446 14914/16501/13447
+f 14914/16501/13447 14918/16500/13446 25456/16502/13448 25457/16503/13449
+f 14913/16497/13443 24302/16499/13445 24303/16504/13450 14918/16500/13446
+f 14918/16500/13446 24303/16504/13450 30748/16505/13451 25456/16502/13448
+f 14911/16492/13438 14914/16501/13447 14919/16506/13452 14915/16493/13439
+f 14915/16493/13439 14919/16506/13452 24231/16116/13066 24230/16111/13061
+f 14914/16501/13447 25457/16503/13449 25458/16507/13453 14919/16506/13452
+f 14919/16506/13452 25458/16507/13453 30724/16117/13067 24231/16116/13066
+f 14920/16508/13454 14924/16509/13455 14925/16510/13456 14921/16511/13457
+f 14921/16511/13457 14925/16510/13456 25458/16507/13453 25457/16503/13449
+f 14924/16509/13455 24233/16127/13077 24232/16126/13076 14925/16510/13456
+f 14925/16510/13456 24232/16126/13076 30724/16117/13067 25458/16507/13453
+f 14920/16508/13454 14921/16511/13457 14926/16512/13458 14922/16513/13459
+f 14922/16513/13459 14926/16512/13458 24304/16514/13460 24305/16515/13461
+f 14921/16511/13457 25457/16503/13449 25456/16502/13448 14926/16512/13458
+f 14926/16512/13458 25456/16502/13448 30748/16505/13451 24304/16514/13460
+f 14920/16508/13454 14922/16513/13459 14927/16516/13462 14923/16517/13463
+f 14923/16517/13463 14927/16516/13462 25459/16518/13464 25460/16519/13465
+f 14922/16513/13459 24305/16515/13461 24306/16520/13466 14927/16516/13462
+f 14927/16516/13462 24306/16520/13466 30749/16521/13467 25459/16518/13464
+f 14920/16508/13454 14923/16517/13463 14928/16522/13468 14924/16509/13455
+f 14924/16509/13455 14928/16522/13468 24234/16132/13082 24233/16127/13077
+f 14923/16517/13463 25460/16519/13465 25461/16523/13469 14928/16522/13468
+f 14928/16522/13468 25461/16523/13469 30725/16133/13083 24234/16132/13082
+f 14929/16524/13470 14933/16525/13471 14934/16526/13472 14930/16527/13473
+f 14930/16527/13473 14934/16526/13472 25461/16523/13469 25460/16519/13465
+f 14933/16525/13471 24236/16143/13093 24235/16142/13092 14934/16526/13472
+f 14934/16526/13472 24235/16142/13092 30725/16133/13083 25461/16523/13469
+f 14929/16524/13470 14930/16527/13473 14935/16528/13474 14931/16529/13475
+f 14931/16529/13475 14935/16528/13474 24307/16530/13476 24308/16531/13477
+f 14930/16527/13473 25460/16519/13465 25459/16518/13464 14935/16528/13474
+f 14935/16528/13474 25459/16518/13464 30749/16521/13467 24307/16530/13476
+f 14929/16524/13470 14931/16529/13475 14936/16532/13478 14932/16533/13479
+f 14932/16533/13479 14936/16532/13478 25462/16534/13480 25463/16535/13481
+f 14931/16529/13475 24308/16531/13477 24309/16536/13482 14936/16532/13478
+f 14936/16532/13478 24309/16536/13482 30750/16537/13483 25462/16534/13480
+f 14929/16524/13470 14932/16533/13479 14937/16538/13484 14933/16525/13471
+f 14933/16525/13471 14937/16538/13484 24237/16148/13098 24236/16143/13093
+f 14932/16533/13479 25463/16535/13481 25464/16539/13485 14937/16538/13484
+f 14937/16538/13484 25464/16539/13485 30726/16149/13099 24237/16148/13098
+f 14938/16540/13486 14942/16541/13487 14943/16542/13488 14939/16543/13489
+f 14939/16543/13489 14943/16542/13488 25464/16539/13485 25463/16535/13481
+f 14942/16541/13487 24239/16159/13109 24238/16158/13108 14943/16542/13488
+f 14943/16542/13488 24238/16158/13108 30726/16149/13099 25464/16539/13485
+f 14938/16540/13486 14939/16543/13489 14944/16544/13490 14940/16545/13491
+f 14940/16545/13491 14944/16544/13490 24310/16546/13492 24311/16547/13493
+f 14939/16543/13489 25463/16535/13481 25462/16534/13480 14944/16544/13490
+f 14944/16544/13490 25462/16534/13480 30750/16537/13483 24310/16546/13492
+f 14938/16540/13486 14940/16545/13491 14945/16548/13494 14941/16549/13495
+f 14941/16549/13495 14945/16548/13494 25465/16550/13496 25466/16551/13497
+f 14940/16545/13491 24311/16547/13493 24312/16552/13498 14945/16548/13494
+f 14945/16548/13494 24312/16552/13498 30751/16553/13499 25465/16550/13496
+f 14938/16540/13486 14941/16549/13495 14946/16554/13500 14942/16541/13487
+f 14942/16541/13487 14946/16554/13500 24240/16164/13114 24239/16159/13109
+f 14941/16549/13495 25466/16551/13497 25467/16555/13501 14946/16554/13500
+f 14946/16554/13500 25467/16555/13501 30727/16165/13115 24240/16164/13114
+f 14947/16556/13502 14951/16557/13503 14952/16558/13504 14948/16559/13505
+f 14948/16559/13505 14952/16558/13504 25467/16555/13501 25466/16551/13497
+f 14951/16557/13503 24242/16175/13125 24241/16174/13124 14952/16558/13504
+f 14952/16558/13504 24241/16174/13124 30727/16165/13115 25467/16555/13501
+f 14947/16556/13502 14948/16559/13505 14953/16560/13506 14949/16561/13507
+f 14949/16561/13507 14953/16560/13506 24313/16562/13508 24314/16563/13509
+f 14948/16559/13505 25466/16551/13497 25465/16550/13496 14953/16560/13506
+f 14953/16560/13506 25465/16550/13496 30751/16553/13499 24313/16562/13508
+f 14947/16556/13502 14949/16561/13507 14954/16564/13510 14950/16565/13511
+f 14950/16565/13511 14954/16564/13510 25468/16566/13512 25469/16567/13513
+f 14949/16561/13507 24314/16563/13509 24315/16568/13514 14954/16564/13510
+f 14954/16564/13510 24315/16568/13514 30752/16569/13515 25468/16566/13512
+f 14947/16556/13502 14950/16565/13511 14955/16570/13516 14951/16557/13503
+f 14951/16557/13503 14955/16570/13516 24243/16180/13130 24242/16175/13125
+f 14950/16565/13511 25469/16567/13513 25470/16571/13517 14955/16570/13516
+f 14955/16570/13516 25470/16571/13517 30728/16181/13131 24243/16180/13130
+f 14956/16572/13518 14960/16573/13519 14961/16574/13520 14957/16575/13521
+f 14957/16575/13521 14961/16574/13520 25470/16571/13517 25469/16567/13513
+f 14960/16573/13519 24245/16191/13141 24244/16190/13140 14961/16574/13520
+f 14961/16574/13520 24244/16190/13140 30728/16181/13131 25470/16571/13517
+f 14956/16572/13518 14957/16575/13521 14962/16576/13522 14958/16577/13523
+f 14958/16577/13523 14962/16576/13522 24316/16578/13524 24317/16579/13525
+f 14957/16575/13521 25469/16567/13513 25468/16566/13512 14962/16576/13522
+f 14962/16576/13522 25468/16566/13512 30752/16569/13515 24316/16578/13524
+f 14956/16572/13518 14958/16577/13523 14963/16580/13526 14959/16581/13527
+f 14959/16581/13527 14963/16580/13526 25471/16582/13528 25472/16583/13529
+f 14958/16577/13523 24317/16579/13525 24318/16584/13530 14963/16580/13526
+f 14963/16580/13526 24318/16584/13530 30753/16585/13531 25471/16582/13528
+f 14956/16572/13518 14959/16581/13527 14964/16586/13532 14960/16573/13519
+f 14960/16573/13519 14964/16586/13532 24246/16196/13146 24245/16191/13141
+f 14959/16581/13527 25472/16583/13529 25473/16587/13533 14964/16586/13532
+f 14964/16586/13532 25473/16587/13533 30729/16197/13147 24246/16196/13146
+f 14965/16588/13534 14969/16589/13535 14970/16590/13536 14966/16591/13537
+f 14966/16591/13537 14970/16590/13536 25473/16587/13533 25472/16583/13529
+f 14969/16589/13535 24248/16207/13157 24247/16206/13156 14970/16590/13536
+f 14970/16590/13536 24247/16206/13156 30729/16197/13147 25473/16587/13533
+f 14965/16588/13534 14966/16591/13537 14971/16592/13538 14967/16593/13539
+f 14967/16593/13539 14971/16592/13538 24319/16594/13540 24320/16595/13541
+f 14966/16591/13537 25472/16583/13529 25471/16582/13528 14971/16592/13538
+f 14971/16592/13538 25471/16582/13528 30753/16585/13531 24319/16594/13540
+f 14965/16588/13534 14967/16593/13539 14972/16596/13542 14968/16597/13543
+f 14968/16597/13543 14972/16596/13542 25474/16598/13544 25475/16599/13545
+f 14967/16593/13539 24320/16595/13541 24321/16600/13546 14972/16596/13542
+f 14972/16596/13542 24321/16600/13546 30754/16601/13547 25474/16598/13544
+f 14965/16588/13534 14968/16597/13543 14973/16602/13548 14969/16589/13535
+f 14969/16589/13535 14973/16602/13548 24249/16212/13162 24248/16207/13157
+f 14968/16597/13543 25475/16599/13545 25476/16603/13549 14973/16602/13548
+f 14973/16602/13548 25476/16603/13549 30730/16213/13163 24249/16212/13162
+f 14974/16604/13550 14978/16605/13551 14979/16606/13552 14975/16607/13553
+f 14975/16607/13553 14979/16606/13552 25476/16603/13549 25475/16599/13545
+f 14978/16605/13551 24251/16223/13173 24250/16222/13172 14979/16606/13552
+f 14979/16606/13552 24250/16222/13172 30730/16213/13163 25476/16603/13549
+f 14974/16604/13550 14975/16607/13553 14980/16608/13554 14976/16609/13555
+f 14976/16609/13555 14980/16608/13554 24322/16610/13556 24323/16611/13557
+f 14975/16607/13553 25475/16599/13545 25474/16598/13544 14980/16608/13554
+f 14980/16608/13554 25474/16598/13544 30754/16601/13547 24322/16610/13556
+f 14974/16604/13550 14976/16609/13555 14981/16612/13558 14977/16613/13559
+f 14977/16613/13559 14981/16612/13558 25477/16614/13560 25478/16615/13561
+f 14976/16609/13555 24323/16611/13557 24324/16616/13562 14981/16612/13558
+f 14981/16612/13558 24324/16616/13562 30755/16617/13563 25477/16614/13560
+f 14974/16604/13550 14977/16613/13559 14982/16618/13564 14978/16605/13551
+f 14978/16605/13551 14982/16618/13564 24252/16228/13178 24251/16223/13173
+f 14977/16613/13559 25478/16615/13561 25479/16619/13565 14982/16618/13564
+f 14982/16618/13564 25479/16619/13565 30731/16229/13179 24252/16228/13178
+f 14983/16620/13566 14987/16621/13567 14988/16622/13568 14984/16623/13569
+f 14984/16623/13569 14988/16622/13568 25479/16619/13565 25478/16615/13561
+f 14987/16621/13567 24254/16239/13189 24253/16238/13188 14988/16622/13568
+f 14988/16622/13568 24253/16238/13188 30731/16229/13179 25479/16619/13565
+f 14983/16620/13566 14984/16623/13569 14989/16624/13570 14985/16625/13571
+f 14985/16625/13571 14989/16624/13570 24325/16626/13572 24326/16627/13573
+f 14984/16623/13569 25478/16615/13561 25477/16614/13560 14989/16624/13570
+f 14989/16624/13570 25477/16614/13560 30755/16617/13563 24325/16626/13572
+f 14983/16620/13566 14985/16625/13571 14990/16628/13574 14986/16629/13575
+f 14986/16629/13575 14990/16628/13574 25480/16630/13576 25481/16631/13577
+f 14985/16625/13571 24326/16627/13573 24327/16632/13578 14990/16628/13574
+f 14990/16628/13574 24327/16632/13578 30756/16633/13579 25480/16630/13576
+f 14983/16620/13566 14986/16629/13575 14991/16634/13580 14987/16621/13567
+f 14987/16621/13567 14991/16634/13580 24255/16244/13194 24254/16239/13189
+f 14986/16629/13575 25481/16631/13577 25482/16635/13581 14991/16634/13580
+f 14991/16634/13580 25482/16635/13581 30732/16245/13195 24255/16244/13194
+f 14992/16636/13582 14996/16637/13583 14997/16638/13584 14993/16639/13585
+f 14993/16639/13585 14997/16638/13584 25482/16635/13581 25481/16631/13577
+f 14996/16637/13583 24257/16255/13205 24256/16254/13204 14997/16638/13584
+f 14997/16638/13584 24256/16254/13204 30732/16245/13195 25482/16635/13581
+f 14992/16636/13582 14993/16639/13585 14998/16640/13586 14994/16641/13587
+f 14994/16641/13587 14998/16640/13586 24328/16642/13588 24329/16643/13589
+f 14993/16639/13585 25481/16631/13577 25480/16630/13576 14998/16640/13586
+f 14998/16640/13586 25480/16630/13576 30756/16633/13579 24328/16642/13588
+f 14992/16636/13582 14994/16641/13587 14999/16644/13590 14995/16645/13591
+f 14995/16645/13591 14999/16644/13590 25483/16646/13592 25484/16647/13593
+f 14994/16641/13587 24329/16643/13589 24330/16648/13594 14999/16644/13590
+f 14999/16644/13590 24330/16648/13594 30757/16649/13595 25483/16646/13592
+f 14992/16636/13582 14995/16645/13591 15000/16650/13596 14996/16637/13583
+f 14996/16637/13583 15000/16650/13596 24258/16260/13210 24257/16255/13205
+f 14995/16645/13591 25484/16647/13593 25485/16651/13597 15000/16650/13596
+f 15000/16650/13596 25485/16651/13597 30733/16261/13211 24258/16260/13210
+f 15001/16652/13598 15005/16653/13599 15006/16654/13600 15002/16655/13601
+f 15002/16655/13601 15006/16654/13600 25485/16651/13597 25484/16647/13593
+f 15005/16653/13599 24260/16271/13221 24259/16270/13220 15006/16654/13600
+f 15006/16654/13600 24259/16270/13220 30733/16261/13211 25485/16651/13597
+f 15001/16652/13598 15002/16655/13601 15007/16656/13602 15003/16657/13603
+f 15003/16657/13603 15007/16656/13602 24331/16658/13604 24332/16659/13605
+f 15002/16655/13601 25484/16647/13593 25483/16646/13592 15007/16656/13602
+f 15007/16656/13602 25483/16646/13592 30757/16649/13595 24331/16658/13604
+f 15001/16652/13598 15003/16657/13603 15008/16660/13606 15004/16661/13607
+f 15004/16661/13607 15008/16660/13606 25486/16662/13608 25487/16663/13609
+f 15003/16657/13603 24332/16659/13605 24333/16664/13610 15008/16660/13606
+f 15008/16660/13606 24333/16664/13610 30758/16665/13611 25486/16662/13608
+f 15001/16652/13598 15004/16661/13607 15009/16666/13612 15005/16653/13599
+f 15005/16653/13599 15009/16666/13612 24261/16276/13226 24260/16271/13221
+f 15004/16661/13607 25487/16663/13609 25488/16667/13613 15009/16666/13612
+f 15009/16666/13612 25488/16667/13613 30734/16277/13227 24261/16276/13226
+f 15010/16668/13614 15014/16669/13615 15015/16670/13616 15011/16671/13617
+f 15011/16671/13617 15015/16670/13616 25488/16672/13613 25487/16673/13609
+f 15014/16669/13615 24263/16289/13237 24262/16288/13236 15015/16670/13616
+f 15015/16670/13616 24262/16288/13236 30734/16291/13227 25488/16672/13613
+f 15010/16668/13614 15011/16671/13617 15016/16674/13618 15012/16675/13619
+f 15012/16675/13619 15016/16674/13618 24334/16676/13620 24335/16677/13621
+f 15011/16671/13617 25487/16673/13609 25486/16678/13608 15016/16674/13618
+f 15016/16674/13618 25486/16678/13608 30758/16679/13611 24334/16676/13620
+f 15010/16668/13614 15012/16675/13619 15017/16680/13622 15013/16681/13623
+f 15013/16681/13623 15017/16680/13622 25489/16682/13624 25490/16683/13625
+f 15012/16675/13619 24335/16677/13621 24336/16684/13626 15017/16680/13622
+f 15017/16680/13622 24336/16684/13626 30759/16685/13627 25489/16682/13624
+f 15010/16668/13614 15013/16681/13623 15018/16686/13628 15014/16669/13615
+f 15014/16669/13615 15018/16686/13628 24264/16296/13242 24263/16289/13237
+f 15013/16681/13623 25490/16683/13625 25491/16687/13629 15018/16686/13628
+f 15018/16686/13628 25491/16687/13629 30735/16297/13243 24264/16296/13242
+f 15019/16688/13630 15023/16689/13631 15024/16690/13632 15020/16691/13633
+f 15020/16691/13633 15024/16690/13632 25491/16687/13629 25490/16683/13625
+f 15023/16689/13631 24266/16307/13253 24265/16306/13252 15024/16690/13632
+f 15024/16690/13632 24265/16306/13252 30735/16297/13243 25491/16687/13629
+f 15019/16688/13630 15020/16691/13633 15025/16692/13634 15021/16693/13635
+f 15021/16693/13635 15025/16692/13634 24337/16694/13636 24338/16695/13637
+f 15020/16691/13633 25490/16683/13625 25489/16682/13624 15025/16692/13634
+f 15025/16692/13634 25489/16682/13624 30759/16685/13627 24337/16694/13636
+f 15019/16688/13630 15021/16693/13635 15026/16696/13638 15022/16697/13639
+f 15022/16697/13639 15026/16696/13638 25492/16698/13640 25493/16699/13641
+f 15021/16693/13635 24338/16695/13637 24339/16700/13642 15026/16696/13638
+f 15026/16696/13638 24339/16700/13642 30760/16701/13643 25492/16698/13640
+f 15019/16688/13630 15022/16697/13639 15027/16702/13644 15023/16689/13631
+f 15023/16689/13631 15027/16702/13644 24267/16312/13258 24266/16307/13253
+f 15022/16697/13639 25493/16699/13641 25494/16703/13645 15027/16702/13644
+f 15027/16702/13644 25494/16703/13645 30736/16313/13259 24267/16312/13258
+f 15028/16704/13646 15032/16705/13647 15033/16706/13648 15029/16707/13649
+f 15029/16707/13649 15033/16706/13648 25494/16703/13645 25493/16699/13641
+f 15032/16705/13647 24269/16323/13269 24268/16322/13268 15033/16706/13648
+f 15033/16706/13648 24268/16322/13268 30736/16313/13259 25494/16703/13645
+f 15028/16704/13646 15029/16707/13649 15034/16708/13650 15030/16709/13651
+f 15030/16709/13651 15034/16708/13650 24340/16710/13652 24341/16711/13653
+f 15029/16707/13649 25493/16699/13641 25492/16698/13640 15034/16708/13650
+f 15034/16708/13650 25492/16698/13640 30760/16701/13643 24340/16710/13652
+f 15028/16704/13646 15030/16709/13651 15035/16712/13654 15031/16713/13655
+f 15031/16713/13655 15035/16712/13654 25495/16714/13656 25496/16715/13657
+f 15030/16709/13651 24341/16711/13653 24342/16716/13658 15035/16712/13654
+f 15035/16712/13654 24342/16716/13658 30761/16717/13659 25495/16714/13656
+f 15028/16704/13646 15031/16713/13655 15036/16718/13660 15032/16705/13647
+f 15032/16705/13647 15036/16718/13660 24270/16328/13274 24269/16323/13269
+f 15031/16713/13655 25496/16715/13657 25497/16719/13661 15036/16718/13660
+f 15036/16718/13660 25497/16719/13661 30737/16329/13275 24270/16328/13274
+f 15037/16720/13662 15041/16721/13663 15042/16722/13664 15038/16723/13665
+f 15038/16723/13665 15042/16722/13664 25497/16719/13661 25496/16715/13657
+f 15041/16721/13663 24272/16339/13285 24271/16338/13284 15042/16722/13664
+f 15042/16722/13664 24271/16338/13284 30737/16329/13275 25497/16719/13661
+f 15037/16720/13662 15038/16723/13665 15043/16724/13666 15039/16725/13667
+f 15039/16725/13667 15043/16724/13666 24343/16726/13668 24344/16727/13669
+f 15038/16723/13665 25496/16715/13657 25495/16714/13656 15043/16724/13666
+f 15043/16724/13666 25495/16714/13656 30761/16717/13659 24343/16726/13668
+f 15037/16720/13662 15039/16725/13667 15044/16728/13670 15040/16729/13671
+f 15040/16729/13671 15044/16728/13670 25498/16730/13672 25499/16731/13673
+f 15039/16725/13667 24344/16727/13669 24345/16732/13674 15044/16728/13670
+f 15044/16728/13670 24345/16732/13674 30762/16733/13675 25498/16730/13672
+f 15037/16720/13662 15040/16729/13671 15045/16734/13676 15041/16721/13663
+f 15041/16721/13663 15045/16734/13676 24273/16344/13290 24272/16339/13285
+f 15040/16729/13671 25499/16731/13673 25500/16735/13677 15045/16734/13676
+f 15045/16734/13676 25500/16735/13677 30738/16345/13291 24273/16344/13290
+f 15046/16736/13678 15050/16737/13679 15051/16738/13680 15047/16739/13681
+f 15047/16739/13681 15051/16738/13680 25500/16735/13677 25499/16731/13673
+f 15050/16737/13679 24275/16355/13301 24274/16354/13300 15051/16738/13680
+f 15051/16738/13680 24274/16354/13300 30738/16345/13291 25500/16735/13677
+f 15046/16736/13678 15047/16739/13681 15052/16740/13682 15048/16741/13683
+f 15048/16741/13683 15052/16740/13682 24346/16742/13684 24347/16743/13685
+f 15047/16739/13681 25499/16731/13673 25498/16730/13672 15052/16740/13682
+f 15052/16740/13682 25498/16730/13672 30762/16733/13675 24346/16742/13684
+f 15046/16736/13678 15048/16741/13683 15053/16744/13686 15049/16745/13687
+f 15049/16745/13687 15053/16744/13686 25501/16746/13688 25502/16747/13689
+f 15048/16741/13683 24347/16743/13685 24348/16748/13690 15053/16744/13686
+f 15053/16744/13686 24348/16748/13690 30763/16749/13691 25501/16746/13688
+f 15046/16736/13678 15049/16745/13687 15054/16750/13692 15050/16737/13679
+f 15050/16737/13679 15054/16750/13692 24276/16360/13306 24275/16355/13301
+f 15049/16745/13687 25502/16747/13689 25503/16751/13693 15054/16750/13692
+f 15054/16750/13692 25503/16751/13693 30739/16361/13307 24276/16360/13306
+f 15055/16752/13694 15059/16753/13695 15060/16754/13696 15056/16755/13697
+f 15056/16755/13697 15060/16754/13696 25503/16751/13693 25502/16747/13689
+f 15059/16753/13695 24278/16371/13317 24277/16370/13316 15060/16754/13696
+f 15060/16754/13696 24277/16370/13316 30739/16361/13307 25503/16751/13693
+f 15055/16752/13694 15056/16755/13697 15061/16756/13698 15057/16757/13699
+f 15057/16757/13699 15061/16756/13698 24349/16758/13700 24350/16759/13701
+f 15056/16755/13697 25502/16747/13689 25501/16746/13688 15061/16756/13698
+f 15061/16756/13698 25501/16746/13688 30763/16749/13691 24349/16758/13700
+f 15055/16752/13694 15057/16757/13699 15062/16760/13702 15058/16761/13703
+f 15058/16761/13703 15062/16760/13702 25504/16762/13704 25505/16763/13705
+f 15057/16757/13699 24350/16759/13701 24351/16764/13706 15062/16760/13702
+f 15062/16760/13702 24351/16764/13706 30764/16765/13707 25504/16762/13704
+f 15055/16752/13694 15058/16761/13703 15063/16766/13708 15059/16753/13695
+f 15059/16753/13695 15063/16766/13708 24279/16376/13322 24278/16371/13317
+f 15058/16761/13703 25505/16763/13705 25506/16767/13709 15063/16766/13708
+f 15063/16766/13708 25506/16767/13709 30740/16377/13323 24279/16376/13322
+f 15064/16768/13710 15068/16769/13711 15069/16770/13712 15065/16771/13713
+f 15065/16771/13713 15069/16770/13712 25506/16767/13709 25505/16763/13705
+f 15068/16769/13711 24281/16387/13333 24280/16386/13332 15069/16770/13712
+f 15069/16770/13712 24280/16386/13332 30740/16377/13323 25506/16767/13709
+f 15064/16768/13710 15065/16771/13713 15070/16772/13714 15066/16773/13715
+f 15066/16773/13715 15070/16772/13714 24352/16774/13716 24353/16775/13717
+f 15065/16771/13713 25505/16763/13705 25504/16762/13704 15070/16772/13714
+f 15070/16772/13714 25504/16762/13704 30764/16765/13707 24352/16774/13716
+f 15064/16768/13710 15066/16773/13715 15071/16776/13718 15067/16777/13719
+f 15067/16777/13719 15071/16776/13718 25437/16402/13348 25436/16397/13343
+f 15066/16773/13715 24353/16775/13717 24354/16778/13720 15071/16776/13718
+f 15071/16776/13718 24354/16778/13720 30741/16403/13349 25437/16402/13348
+f 15064/16768/13710 15067/16777/13719 15072/16779/13721 15068/16769/13711
+f 15068/16769/13711 15072/16779/13721 24282/16390/13336 24281/16387/13333
+f 15067/16777/13719 25436/16397/13343 25435/16396/13342 15072/16779/13721
+f 15072/16779/13721 25435/16396/13342 30717/16015/12965 24282/16390/13336
+f 15073/16780/13722 15077/16781/13723 15078/16782/13724 15074/16783/13725
+f 15074/16783/13725 15078/16782/13724 25507/16784/13726 25508/16785/13727
+f 15077/16781/13723 24284/16401/13347 24283/16400/13346 15078/16782/13724
+f 15078/16782/13724 24283/16400/13346 30741/16403/13349 25507/16784/13726
+f 15073/16780/13722 15074/16783/13725 15079/16786/13728 15075/16787/13729
+f 15075/16787/13729 15079/16786/13728 24355/16788/13730 24356/16789/13731
+f 15074/16783/13725 25508/16785/13727 25509/16790/13732 15079/16786/13728
+f 15079/16786/13728 25509/16790/13732 30765/16791/13733 24355/16788/13730
+f 15073/16780/13722 15075/16787/13729 15080/16792/13734 15076/16793/13735
+f 15076/16793/13735 15080/16792/13734 25510/16794/13736 25511/16795/13737
+f 15075/16787/13729 24356/16789/13731 24357/16796/13738 15080/16792/13734
+f 15080/16792/13734 24357/16796/13738 30766/16797/13739 25510/16794/13736
+f 15073/16780/13722 15076/16793/13735 15081/16798/13740 15077/16781/13723
+f 15077/16781/13723 15081/16798/13740 24285/16408/13354 24284/16401/13347
+f 15076/16793/13735 25511/16795/13737 25512/16799/13741 15081/16798/13740
+f 15081/16798/13740 25512/16799/13741 30742/16409/13355 24285/16408/13354
+f 15082/16800/13742 15086/16801/13743 15087/16802/13744 15083/16803/13745
+f 15083/16803/13745 15087/16802/13744 25512/16799/13741 25511/16795/13737
+f 15086/16801/13743 24287/16419/13365 24286/16418/13364 15087/16802/13744
+f 15087/16802/13744 24286/16418/13364 30742/16409/13355 25512/16799/13741
+f 15082/16800/13742 15083/16803/13745 15088/16804/13746 15084/16805/13747
+f 15084/16805/13747 15088/16804/13746 24358/16806/13748 24359/16807/13749
+f 15083/16803/13745 25511/16795/13737 25510/16794/13736 15088/16804/13746
+f 15088/16804/13746 25510/16794/13736 30766/16797/13739 24358/16806/13748
+f 15082/16800/13742 15084/16805/13747 15089/16808/13750 15085/16809/13751
+f 15085/16809/13751 15089/16808/13750 25513/16810/13752 25514/16811/13753
+f 15084/16805/13747 24359/16807/13749 24360/16812/13754 15089/16808/13750
+f 15089/16808/13750 24360/16812/13754 30767/16813/13755 25513/16810/13752
+f 15082/16800/13742 15085/16809/13751 15090/16814/13756 15086/16801/13743
+f 15086/16801/13743 15090/16814/13756 24288/16424/13370 24287/16419/13365
+f 15085/16809/13751 25514/16811/13753 25515/16815/13757 15090/16814/13756
+f 15090/16814/13756 25515/16815/13757 30743/16425/13371 24288/16424/13370
+f 15091/16816/13758 15095/16817/13759 15096/16818/13760 15092/16819/13761
+f 15092/16819/13761 15096/16818/13760 25515/16815/13757 25514/16811/13753
+f 15095/16817/13759 24290/16435/13381 24289/16434/13380 15096/16818/13760
+f 15096/16818/13760 24289/16434/13380 30743/16425/13371 25515/16815/13757
+f 15091/16816/13758 15092/16819/13761 15097/16820/13762 15093/16821/13763
+f 15093/16821/13763 15097/16820/13762 24361/16822/13764 24362/16823/13765
+f 15092/16819/13761 25514/16811/13753 25513/16810/13752 15097/16820/13762
+f 15097/16820/13762 25513/16810/13752 30767/16813/13755 24361/16822/13764
+f 15091/16816/13758 15093/16821/13763 15098/16824/13766 15094/16825/13767
+f 15094/16825/13767 15098/16824/13766 25516/16826/13768 25517/16827/13769
+f 15093/16821/13763 24362/16823/13765 24363/16828/13770 15098/16824/13766
+f 15098/16824/13766 24363/16828/13770 30768/16829/13771 25516/16826/13768
+f 15091/16816/13758 15094/16825/13767 15099/16830/13772 15095/16817/13759
+f 15095/16817/13759 15099/16830/13772 24291/16440/13386 24290/16435/13381
+f 15094/16825/13767 25517/16827/13769 25518/16831/13773 15099/16830/13772
+f 15099/16830/13772 25518/16831/13773 30744/16441/13387 24291/16440/13386
+f 15100/16832/13774 15104/16833/13775 15105/16834/13776 15101/16835/13777
+f 15101/16835/13777 15105/16834/13776 25518/16831/13773 25517/16827/13769
+f 15104/16833/13775 24293/16451/13397 24292/16450/13396 15105/16834/13776
+f 15105/16834/13776 24292/16450/13396 30744/16441/13387 25518/16831/13773
+f 15100/16832/13774 15101/16835/13777 15106/16836/13778 15102/16837/13779
+f 15102/16837/13779 15106/16836/13778 24364/16838/13780 24365/16839/13781
+f 15101/16835/13777 25517/16827/13769 25516/16826/13768 15106/16836/13778
+f 15106/16836/13778 25516/16826/13768 30768/16829/13771 24364/16838/13780
+f 15100/16832/13774 15102/16837/13779 15107/16840/13782 15103/16841/13783
+f 15103/16841/13783 15107/16840/13782 25519/16842/13784 25520/16843/13785
+f 15102/16837/13779 24365/16839/13781 24366/16844/13786 15107/16840/13782
+f 15107/16840/13782 24366/16844/13786 30769/16845/13787 25519/16842/13784
+f 15100/16832/13774 15103/16841/13783 15108/16846/13788 15104/16833/13775
+f 15104/16833/13775 15108/16846/13788 24294/16456/13402 24293/16451/13397
+f 15103/16841/13783 25520/16843/13785 25521/16847/13789 15108/16846/13788
+f 15108/16846/13788 25521/16847/13789 30745/16457/13403 24294/16456/13402
+f 15109/16848/13790 15113/16849/13791 15114/16850/13792 15110/16851/13793
+f 15110/16851/13793 15114/16850/13792 25521/16847/13789 25520/16843/13785
+f 15113/16849/13791 24296/16467/13413 24295/16466/13412 15114/16850/13792
+f 15114/16850/13792 24295/16466/13412 30745/16457/13403 25521/16847/13789
+f 15109/16848/13790 15110/16851/13793 15115/16852/13794 15111/16853/13795
+f 15111/16853/13795 15115/16852/13794 24367/16854/13796 24368/16855/13797
+f 15110/16851/13793 25520/16843/13785 25519/16842/13784 15115/16852/13794
+f 15115/16852/13794 25519/16842/13784 30769/16845/13787 24367/16854/13796
+f 15109/16848/13790 15111/16853/13795 15116/16856/13798 15112/16857/13799
+f 15112/16857/13799 15116/16856/13798 25522/16858/13800 25523/16859/13801
+f 15111/16853/13795 24368/16855/13797 24369/16860/13802 15116/16856/13798
+f 15116/16856/13798 24369/16860/13802 30770/16861/13803 25522/16858/13800
+f 15109/16848/13790 15112/16857/13799 15117/16862/13804 15113/16849/13791
+f 15113/16849/13791 15117/16862/13804 24297/16472/13418 24296/16467/13413
+f 15112/16857/13799 25523/16859/13801 25524/16863/13805 15117/16862/13804
+f 15117/16862/13804 25524/16863/13805 30746/16473/13419 24297/16472/13418
+f 15118/16864/13806 15122/16865/13807 15123/16866/13808 15119/16867/13809
+f 15119/16867/13809 15123/16866/13808 25524/16863/13805 25523/16859/13801
+f 15122/16865/13807 24299/16483/13429 24298/16482/13428 15123/16866/13808
+f 15123/16866/13808 24298/16482/13428 30746/16473/13419 25524/16863/13805
+f 15118/16864/13806 15119/16867/13809 15124/16868/13810 15120/16869/13811
+f 15120/16869/13811 15124/16868/13810 24370/16870/13812 24371/16871/13813
+f 15119/16867/13809 25523/16859/13801 25522/16858/13800 15124/16868/13810
+f 15124/16868/13810 25522/16858/13800 30770/16861/13803 24370/16870/13812
+f 15118/16864/13806 15120/16869/13811 15125/16872/13814 15121/16873/13815
+f 15121/16873/13815 15125/16872/13814 25525/16874/13816 25526/16875/13817
+f 15120/16869/13811 24371/16871/13813 24372/16876/13818 15125/16872/13814
+f 15125/16872/13814 24372/16876/13818 30771/16877/13819 25525/16874/13816
+f 15118/16864/13806 15121/16873/13815 15126/16878/13820 15122/16865/13807
+f 15122/16865/13807 15126/16878/13820 24300/16488/13434 24299/16483/13429
+f 15121/16873/13815 25526/16875/13817 25527/16879/13821 15126/16878/13820
+f 15126/16878/13820 25527/16879/13821 30747/16489/13435 24300/16488/13434
+f 15127/16880/13822 15131/16881/13823 15132/16882/13824 15128/16883/13825
+f 15128/16883/13825 15132/16882/13824 25527/16879/13821 25526/16875/13817
+f 15131/16881/13823 24302/16499/13445 24301/16498/13444 15132/16882/13824
+f 15132/16882/13824 24301/16498/13444 30747/16489/13435 25527/16879/13821
+f 15127/16880/13822 15128/16883/13825 15133/16884/13826 15129/16885/13827
+f 15129/16885/13827 15133/16884/13826 24373/16886/13828 24374/16887/13829
+f 15128/16883/13825 25526/16875/13817 25525/16874/13816 15133/16884/13826
+f 15133/16884/13826 25525/16874/13816 30771/16877/13819 24373/16886/13828
+f 15127/16880/13822 15129/16885/13827 15134/16888/13830 15130/16889/13831
+f 15130/16889/13831 15134/16888/13830 25528/16890/13832 25529/16891/13833
+f 15129/16885/13827 24374/16887/13829 24375/16892/13834 15134/16888/13830
+f 15134/16888/13830 24375/16892/13834 30772/16893/13835 25528/16890/13832
+f 15127/16880/13822 15130/16889/13831 15135/16894/13836 15131/16881/13823
+f 15131/16881/13823 15135/16894/13836 24303/16504/13450 24302/16499/13445
+f 15130/16889/13831 25529/16891/13833 25530/16895/13837 15135/16894/13836
+f 15135/16894/13836 25530/16895/13837 30748/16505/13451 24303/16504/13450
+f 15136/16896/13838 15140/16897/13839 15141/16898/13840 15137/16899/13841
+f 15137/16899/13841 15141/16898/13840 25530/16895/13837 25529/16891/13833
+f 15140/16897/13839 24305/16515/13461 24304/16514/13460 15141/16898/13840
+f 15141/16898/13840 24304/16514/13460 30748/16505/13451 25530/16895/13837
+f 15136/16896/13838 15137/16899/13841 15142/16900/13842 15138/16901/13843
+f 15138/16901/13843 15142/16900/13842 24376/16902/13844 24377/16903/13845
+f 15137/16899/13841 25529/16891/13833 25528/16890/13832 15142/16900/13842
+f 15142/16900/13842 25528/16890/13832 30772/16893/13835 24376/16902/13844
+f 15136/16896/13838 15138/16901/13843 15143/16904/13846 15139/16905/13847
+f 15139/16905/13847 15143/16904/13846 25531/16906/13848 25532/16907/13849
+f 15138/16901/13843 24377/16903/13845 24378/16908/13850 15143/16904/13846
+f 15143/16904/13846 24378/16908/13850 30773/16909/13851 25531/16906/13848
+f 15136/16896/13838 15139/16905/13847 15144/16910/13852 15140/16897/13839
+f 15140/16897/13839 15144/16910/13852 24306/16520/13466 24305/16515/13461
+f 15139/16905/13847 25532/16907/13849 25533/16911/13853 15144/16910/13852
+f 15144/16910/13852 25533/16911/13853 30749/16521/13467 24306/16520/13466
+f 15145/16912/13854 15149/16913/13855 15150/16914/13856 15146/16915/13857
+f 15146/16915/13857 15150/16914/13856 25533/16911/13853 25532/16907/13849
+f 15149/16913/13855 24308/16531/13477 24307/16530/13476 15150/16914/13856
+f 15150/16914/13856 24307/16530/13476 30749/16521/13467 25533/16911/13853
+f 15145/16912/13854 15146/16915/13857 15151/16916/13858 15147/16917/13859
+f 15147/16917/13859 15151/16916/13858 24379/16918/13860 24380/16919/13861
+f 15146/16915/13857 25532/16907/13849 25531/16906/13848 15151/16916/13858
+f 15151/16916/13858 25531/16906/13848 30773/16909/13851 24379/16918/13860
+f 15145/16912/13854 15147/16917/13859 15152/16920/13862 15148/16921/13863
+f 15148/16921/13863 15152/16920/13862 25534/16922/13864 25535/16923/13865
+f 15147/16917/13859 24380/16919/13861 24381/16924/13866 15152/16920/13862
+f 15152/16920/13862 24381/16924/13866 30774/16925/13867 25534/16922/13864
+f 15145/16912/13854 15148/16921/13863 15153/16926/13868 15149/16913/13855
+f 15149/16913/13855 15153/16926/13868 24309/16536/13482 24308/16531/13477
+f 15148/16921/13863 25535/16923/13865 25536/16927/13869 15153/16926/13868
+f 15153/16926/13868 25536/16927/13869 30750/16537/13483 24309/16536/13482
+f 15154/16928/13870 15158/16929/13871 15159/16930/13872 15155/16931/13873
+f 15155/16931/13873 15159/16930/13872 25536/16927/13869 25535/16923/13865
+f 15158/16929/13871 24311/16547/13493 24310/16546/13492 15159/16930/13872
+f 15159/16930/13872 24310/16546/13492 30750/16537/13483 25536/16927/13869
+f 15154/16928/13870 15155/16931/13873 15160/16932/13874 15156/16933/13875
+f 15156/16933/13875 15160/16932/13874 24382/16934/13876 24383/16935/13877
+f 15155/16931/13873 25535/16923/13865 25534/16922/13864 15160/16932/13874
+f 15160/16932/13874 25534/16922/13864 30774/16925/13867 24382/16934/13876
+f 15154/16928/13870 15156/16933/13875 15161/16936/13878 15157/16937/13879
+f 15157/16937/13879 15161/16936/13878 25537/16938/13880 25538/16939/13881
+f 15156/16933/13875 24383/16935/13877 24384/16940/13882 15161/16936/13878
+f 15161/16936/13878 24384/16940/13882 30775/16941/13883 25537/16938/13880
+f 15154/16928/13870 15157/16937/13879 15162/16942/13884 15158/16929/13871
+f 15158/16929/13871 15162/16942/13884 24312/16552/13498 24311/16547/13493
+f 15157/16937/13879 25538/16939/13881 25539/16943/13885 15162/16942/13884
+f 15162/16942/13884 25539/16943/13885 30751/16553/13499 24312/16552/13498
+f 15163/16944/13886 15167/16945/13887 15168/16946/13888 15164/16947/13889
+f 15164/16947/13889 15168/16946/13888 25539/16943/13885 25538/16939/13881
+f 15167/16945/13887 24314/16563/13509 24313/16562/13508 15168/16946/13888
+f 15168/16946/13888 24313/16562/13508 30751/16553/13499 25539/16943/13885
+f 15163/16944/13886 15164/16947/13889 15169/16948/13890 15165/16949/13891
+f 15165/16949/13891 15169/16948/13890 24385/16950/13892 24386/16951/13893
+f 15164/16947/13889 25538/16939/13881 25537/16938/13880 15169/16948/13890
+f 15169/16948/13890 25537/16938/13880 30775/16941/13883 24385/16950/13892
+f 15163/16944/13886 15165/16949/13891 15170/16952/13894 15166/16953/13895
+f 15166/16953/13895 15170/16952/13894 25540/16954/13896 25541/16955/13897
+f 15165/16949/13891 24386/16951/13893 24387/16956/13898 15170/16952/13894
+f 15170/16952/13894 24387/16956/13898 30776/16957/13899 25540/16954/13896
+f 15163/16944/13886 15166/16953/13895 15171/16958/13900 15167/16945/13887
+f 15167/16945/13887 15171/16958/13900 24315/16568/13514 24314/16563/13509
+f 15166/16953/13895 25541/16955/13897 25542/16959/13901 15171/16958/13900
+f 15171/16958/13900 25542/16959/13901 30752/16569/13515 24315/16568/13514
+f 15172/16960/13902 15176/16961/13903 15177/16962/13904 15173/16963/13905
+f 15173/16963/13905 15177/16962/13904 25542/16959/13901 25541/16955/13897
+f 15176/16961/13903 24317/16579/13525 24316/16578/13524 15177/16962/13904
+f 15177/16962/13904 24316/16578/13524 30752/16569/13515 25542/16959/13901
+f 15172/16960/13902 15173/16963/13905 15178/16964/13906 15174/16965/13907
+f 15174/16965/13907 15178/16964/13906 24388/16966/13908 24389/16967/13909
+f 15173/16963/13905 25541/16955/13897 25540/16954/13896 15178/16964/13906
+f 15178/16964/13906 25540/16954/13896 30776/16957/13899 24388/16966/13908
+f 15172/16960/13902 15174/16965/13907 15179/16968/13910 15175/16969/13911
+f 15175/16969/13911 15179/16968/13910 25543/16970/13912 25544/16971/13913
+f 15174/16965/13907 24389/16967/13909 24390/16972/13914 15179/16968/13910
+f 15179/16968/13910 24390/16972/13914 30777/16973/13915 25543/16970/13912
+f 15172/16960/13902 15175/16969/13911 15180/16974/13916 15176/16961/13903
+f 15176/16961/13903 15180/16974/13916 24318/16584/13530 24317/16579/13525
+f 15175/16969/13911 25544/16971/13913 25545/16975/13917 15180/16974/13916
+f 15180/16974/13916 25545/16975/13917 30753/16585/13531 24318/16584/13530
+f 15181/16976/13918 15185/16977/13919 15186/16978/13920 15182/16979/13921
+f 15182/16979/13921 15186/16978/13920 25545/16975/13917 25544/16971/13913
+f 15185/16977/13919 24320/16595/13541 24319/16594/13540 15186/16978/13920
+f 15186/16978/13920 24319/16594/13540 30753/16585/13531 25545/16975/13917
+f 15181/16976/13918 15182/16979/13921 15187/16980/13922 15183/16981/13923
+f 15183/16981/13923 15187/16980/13922 24391/16982/13924 24392/16983/13925
+f 15182/16979/13921 25544/16971/13913 25543/16970/13912 15187/16980/13922
+f 15187/16980/13922 25543/16970/13912 30777/16973/13915 24391/16982/13924
+f 15181/16976/13918 15183/16981/13923 15188/16984/13926 15184/16985/13927
+f 15184/16985/13927 15188/16984/13926 25546/16986/13928 25547/16987/13929
+f 15183/16981/13923 24392/16983/13925 24393/16988/13930 15188/16984/13926
+f 15188/16984/13926 24393/16988/13930 30778/16989/13931 25546/16986/13928
+f 15181/16976/13918 15184/16985/13927 15189/16990/13932 15185/16977/13919
+f 15185/16977/13919 15189/16990/13932 24321/16600/13546 24320/16595/13541
+f 15184/16985/13927 25547/16987/13929 25548/16991/13933 15189/16990/13932
+f 15189/16990/13932 25548/16991/13933 30754/16601/13547 24321/16600/13546
+f 15190/16992/13934 15194/16993/13935 15195/16994/13936 15191/16995/13937
+f 15191/16995/13937 15195/16994/13936 25548/16991/13933 25547/16987/13929
+f 15194/16993/13935 24323/16611/13557 24322/16610/13556 15195/16994/13936
+f 15195/16994/13936 24322/16610/13556 30754/16601/13547 25548/16991/13933
+f 15190/16992/13934 15191/16995/13937 15196/16996/13938 15192/16997/13939
+f 15192/16997/13939 15196/16996/13938 24394/16998/13940 24395/16999/13941
+f 15191/16995/13937 25547/16987/13929 25546/16986/13928 15196/16996/13938
+f 15196/16996/13938 25546/16986/13928 30778/16989/13931 24394/16998/13940
+f 15190/16992/13934 15192/16997/13939 15197/17000/13942 15193/17001/13943
+f 15193/17001/13943 15197/17000/13942 25549/17002/13944 25550/17003/13945
+f 15192/16997/13939 24395/16999/13941 24396/17004/13946 15197/17000/13942
+f 15197/17000/13942 24396/17004/13946 30779/17005/13947 25549/17002/13944
+f 15190/16992/13934 15193/17001/13943 15198/17006/13948 15194/16993/13935
+f 15194/16993/13935 15198/17006/13948 24324/16616/13562 24323/16611/13557
+f 15193/17001/13943 25550/17003/13945 25551/17007/13949 15198/17006/13948
+f 15198/17006/13948 25551/17007/13949 30755/16617/13563 24324/16616/13562
+f 15199/17008/13950 15203/17009/13951 15204/17010/13952 15200/17011/13953
+f 15200/17011/13953 15204/17010/13952 25551/17007/13949 25550/17003/13945
+f 15203/17009/13951 24326/16627/13573 24325/16626/13572 15204/17010/13952
+f 15204/17010/13952 24325/16626/13572 30755/16617/13563 25551/17007/13949
+f 15199/17008/13950 15200/17011/13953 15205/17012/13954 15201/17013/13955
+f 15201/17013/13955 15205/17012/13954 24397/17014/13956 24398/17015/13957
+f 15200/17011/13953 25550/17003/13945 25549/17002/13944 15205/17012/13954
+f 15205/17012/13954 25549/17002/13944 30779/17005/13947 24397/17014/13956
+f 15199/17008/13950 15201/17013/13955 15206/17016/13958 15202/17017/13959
+f 15202/17017/13959 15206/17016/13958 25552/17018/13960 25553/17019/13961
+f 15201/17013/13955 24398/17015/13957 24399/17020/13962 15206/17016/13958
+f 15206/17016/13958 24399/17020/13962 30780/17021/13963 25552/17018/13960
+f 15199/17008/13950 15202/17017/13959 15207/17022/13964 15203/17009/13951
+f 15203/17009/13951 15207/17022/13964 24327/16632/13578 24326/16627/13573
+f 15202/17017/13959 25553/17019/13961 25554/17023/13965 15207/17022/13964
+f 15207/17022/13964 25554/17023/13965 30756/16633/13579 24327/16632/13578
+f 15208/17024/13966 15212/17025/13967 15213/17026/13968 15209/17027/13969
+f 15209/17027/13969 15213/17026/13968 25554/17023/13965 25553/17019/13961
+f 15212/17025/13967 24329/16643/13589 24328/16642/13588 15213/17026/13968
+f 15213/17026/13968 24328/16642/13588 30756/16633/13579 25554/17023/13965
+f 15208/17024/13966 15209/17027/13969 15214/17028/13970 15210/17029/13971
+f 15210/17029/13971 15214/17028/13970 24400/17030/13972 24401/17031/13973
+f 15209/17027/13969 25553/17019/13961 25552/17018/13960 15214/17028/13970
+f 15214/17028/13970 25552/17018/13960 30780/17021/13963 24400/17030/13972
+f 15208/17024/13966 15210/17029/13971 15215/17032/13974 15211/17033/13975
+f 15211/17033/13975 15215/17032/13974 25555/17034/13976 25556/17035/13977
+f 15210/17029/13971 24401/17031/13973 24402/17036/13978 15215/17032/13974
+f 15215/17032/13974 24402/17036/13978 30781/17037/13979 25555/17034/13976
+f 15208/17024/13966 15211/17033/13975 15216/17038/13980 15212/17025/13967
+f 15212/17025/13967 15216/17038/13980 24330/16648/13594 24329/16643/13589
+f 15211/17033/13975 25556/17035/13977 25557/17039/13981 15216/17038/13980
+f 15216/17038/13980 25557/17039/13981 30757/16649/13595 24330/16648/13594
+f 15217/17040/13982 15221/17041/13983 15222/17042/13984 15218/17043/13985
+f 15218/17043/13985 15222/17042/13984 25557/17039/13981 25556/17035/13977
+f 15221/17041/13983 24332/16659/13605 24331/16658/13604 15222/17042/13984
+f 15222/17042/13984 24331/16658/13604 30757/16649/13595 25557/17039/13981
+f 15217/17040/13982 15218/17043/13985 15223/17044/13986 15219/17045/13987
+f 15219/17045/13987 15223/17044/13986 24403/17046/13988 24404/17047/13989
+f 15218/17043/13985 25556/17035/13977 25555/17034/13976 15223/17044/13986
+f 15223/17044/13986 25555/17034/13976 30781/17037/13979 24403/17046/13988
+f 15217/17040/13982 15219/17045/13987 15224/17048/13990 15220/17049/13991
+f 15220/17049/13991 15224/17048/13990 25558/17050/13992 25559/17051/13993
+f 15219/17045/13987 24404/17047/13989 24405/17052/13994 15224/17048/13990
+f 15224/17048/13990 24405/17052/13994 30782/17053/13995 25558/17050/13992
+f 15217/17040/13982 15220/17049/13991 15225/17054/13996 15221/17041/13983
+f 15221/17041/13983 15225/17054/13996 24333/16664/13610 24332/16659/13605
+f 15220/17049/13991 25559/17051/13993 25560/17055/13997 15225/17054/13996
+f 15225/17054/13996 25560/17055/13997 30758/16665/13611 24333/16664/13610
+f 15226/17056/13998 15230/17057/13999 15231/17058/14000 15227/17059/14001
+f 15227/17059/14001 15231/17058/14000 25560/17060/13997 25559/17061/13993
+f 15230/17057/13999 24335/16677/13621 24334/16676/13620 15231/17058/14000
+f 15231/17058/14000 24334/16676/13620 30758/16679/13611 25560/17060/13997
+f 15226/17056/13998 15227/17059/14001 15232/17062/14002 15228/17063/14003
+f 15228/17063/14003 15232/17062/14002 24406/17064/14004 24407/17065/14005
+f 15227/17059/14001 25559/17061/13993 25558/17066/13992 15232/17062/14002
+f 15232/17062/14002 25558/17066/13992 30782/17067/13995 24406/17064/14004
+f 15226/17056/13998 15228/17063/14003 15233/17068/14006 15229/17069/14007
+f 15229/17069/14007 15233/17068/14006 25561/17070/14008 25562/17071/14009
+f 15228/17063/14003 24407/17065/14005 24408/17072/14010 15233/17068/14006
+f 15233/17068/14006 24408/17072/14010 30783/17073/14011 25561/17070/14008
+f 15226/17056/13998 15229/17069/14007 15234/17074/14012 15230/17057/13999
+f 15230/17057/13999 15234/17074/14012 24336/16684/13626 24335/16677/13621
+f 15229/17069/14007 25562/17071/14009 25563/17075/14013 15234/17074/14012
+f 15234/17074/14012 25563/17075/14013 30759/16685/13627 24336/16684/13626
+f 15235/17076/14014 15239/17077/14015 15240/17078/14016 15236/17079/14017
+f 15236/17079/14017 15240/17078/14016 25563/17075/14013 25562/17071/14009
+f 15239/17077/14015 24338/16695/13637 24337/16694/13636 15240/17078/14016
+f 15240/17078/14016 24337/16694/13636 30759/16685/13627 25563/17075/14013
+f 15235/17076/14014 15236/17079/14017 15241/17080/14018 15237/17081/14019
+f 15237/17081/14019 15241/17080/14018 24409/17082/14020 24410/17083/14021
+f 15236/17079/14017 25562/17071/14009 25561/17070/14008 15241/17080/14018
+f 15241/17080/14018 25561/17070/14008 30783/17073/14011 24409/17082/14020
+f 15235/17076/14014 15237/17081/14019 15242/17084/14022 15238/17085/14023
+f 15238/17085/14023 15242/17084/14022 25564/17086/14024 25565/17087/14025
+f 15237/17081/14019 24410/17083/14021 24411/17088/14026 15242/17084/14022
+f 15242/17084/14022 24411/17088/14026 30784/17089/14027 25564/17086/14024
+f 15235/17076/14014 15238/17085/14023 15243/17090/14028 15239/17077/14015
+f 15239/17077/14015 15243/17090/14028 24339/16700/13642 24338/16695/13637
+f 15238/17085/14023 25565/17087/14025 25566/17091/14029 15243/17090/14028
+f 15243/17090/14028 25566/17091/14029 30760/16701/13643 24339/16700/13642
+f 15244/17092/14030 15248/17093/14031 15249/17094/14032 15245/17095/14033
+f 15245/17095/14033 15249/17094/14032 25566/17091/14029 25565/17087/14025
+f 15248/17093/14031 24341/16711/13653 24340/16710/13652 15249/17094/14032
+f 15249/17094/14032 24340/16710/13652 30760/16701/13643 25566/17091/14029
+f 15244/17092/14030 15245/17095/14033 15250/17096/14034 15246/17097/14035
+f 15246/17097/14035 15250/17096/14034 24412/17098/14036 24413/17099/14037
+f 15245/17095/14033 25565/17087/14025 25564/17086/14024 15250/17096/14034
+f 15250/17096/14034 25564/17086/14024 30784/17089/14027 24412/17098/14036
+f 15244/17092/14030 15246/17097/14035 15251/17100/14038 15247/17101/14039
+f 15247/17101/14039 15251/17100/14038 25567/17102/14040 25568/17103/14041
+f 15246/17097/14035 24413/17099/14037 24414/17104/14042 15251/17100/14038
+f 15251/17100/14038 24414/17104/14042 30785/17105/14043 25567/17102/14040
+f 15244/17092/14030 15247/17101/14039 15252/17106/14044 15248/17093/14031
+f 15248/17093/14031 15252/17106/14044 24342/16716/13658 24341/16711/13653
+f 15247/17101/14039 25568/17103/14041 25569/17107/14045 15252/17106/14044
+f 15252/17106/14044 25569/17107/14045 30761/16717/13659 24342/16716/13658
+f 15253/17108/14046 15257/17109/14047 15258/17110/14048 15254/17111/14049
+f 15254/17111/14049 15258/17110/14048 25569/17107/14045 25568/17103/14041
+f 15257/17109/14047 24344/16727/13669 24343/16726/13668 15258/17110/14048
+f 15258/17110/14048 24343/16726/13668 30761/16717/13659 25569/17107/14045
+f 15253/17108/14046 15254/17111/14049 15259/17112/14050 15255/17113/14051
+f 15255/17113/14051 15259/17112/14050 24415/17114/14052 24416/17115/14053
+f 15254/17111/14049 25568/17103/14041 25567/17102/14040 15259/17112/14050
+f 15259/17112/14050 25567/17102/14040 30785/17105/14043 24415/17114/14052
+f 15253/17108/14046 15255/17113/14051 15260/17116/14054 15256/17117/14055
+f 15256/17117/14055 15260/17116/14054 25570/17118/14056 25571/17119/14057
+f 15255/17113/14051 24416/17115/14053 24417/17120/14058 15260/17116/14054
+f 15260/17116/14054 24417/17120/14058 30786/17121/14059 25570/17118/14056
+f 15253/17108/14046 15256/17117/14055 15261/17122/14060 15257/17109/14047
+f 15257/17109/14047 15261/17122/14060 24345/16732/13674 24344/16727/13669
+f 15256/17117/14055 25571/17119/14057 25572/17123/14061 15261/17122/14060
+f 15261/17122/14060 25572/17123/14061 30762/16733/13675 24345/16732/13674
+f 15262/17124/14062 15266/17125/14063 15267/17126/14064 15263/17127/14065
+f 15263/17127/14065 15267/17126/14064 25572/17123/14061 25571/17119/14057
+f 15266/17125/14063 24347/16743/13685 24346/16742/13684 15267/17126/14064
+f 15267/17126/14064 24346/16742/13684 30762/16733/13675 25572/17123/14061
+f 15262/17124/14062 15263/17127/14065 15268/17128/14066 15264/17129/14067
+f 15264/17129/14067 15268/17128/14066 24418/17130/14068 24419/17131/14069
+f 15263/17127/14065 25571/17119/14057 25570/17118/14056 15268/17128/14066
+f 15268/17128/14066 25570/17118/14056 30786/17121/14059 24418/17130/14068
+f 15262/17124/14062 15264/17129/14067 15269/17132/14070 15265/17133/14071
+f 15265/17133/14071 15269/17132/14070 25573/17134/14072 25574/17135/14073
+f 15264/17129/14067 24419/17131/14069 24420/17136/14074 15269/17132/14070
+f 15269/17132/14070 24420/17136/14074 30787/17137/14075 25573/17134/14072
+f 15262/17124/14062 15265/17133/14071 15270/17138/14076 15266/17125/14063
+f 15266/17125/14063 15270/17138/14076 24348/16748/13690 24347/16743/13685
+f 15265/17133/14071 25574/17135/14073 25575/17139/14077 15270/17138/14076
+f 15270/17138/14076 25575/17139/14077 30763/16749/13691 24348/16748/13690
+f 15271/17140/14078 15275/17141/14079 15276/17142/14080 15272/17143/14081
+f 15272/17143/14081 15276/17142/14080 25575/17139/14077 25574/17135/14073
+f 15275/17141/14079 24350/16759/13701 24349/16758/13700 15276/17142/14080
+f 15276/17142/14080 24349/16758/13700 30763/16749/13691 25575/17139/14077
+f 15271/17140/14078 15272/17143/14081 15277/17144/14082 15273/17145/14083
+f 15273/17145/14083 15277/17144/14082 24421/17146/14084 24422/17147/14085
+f 15272/17143/14081 25574/17135/14073 25573/17134/14072 15277/17144/14082
+f 15277/17144/14082 25573/17134/14072 30787/17137/14075 24421/17146/14084
+f 15271/17140/14078 15273/17145/14083 15278/17148/14086 15274/17149/14087
+f 15274/17149/14087 15278/17148/14086 25576/17150/14088 25577/17151/14089
+f 15273/17145/14083 24422/17147/14085 24423/17152/14090 15278/17148/14086
+f 15278/17148/14086 24423/17152/14090 30788/17153/14091 25576/17150/14088
+f 15271/17140/14078 15274/17149/14087 15279/17154/14092 15275/17141/14079
+f 15275/17141/14079 15279/17154/14092 24351/16764/13706 24350/16759/13701
+f 15274/17149/14087 25577/17151/14089 25578/17155/14093 15279/17154/14092
+f 15279/17154/14092 25578/17155/14093 30764/16765/13707 24351/16764/13706
+f 15280/17156/14094 15284/17157/14095 15285/17158/14096 15281/17159/14097
+f 15281/17159/14097 15285/17158/14096 25578/17155/14093 25577/17151/14089
+f 15284/17157/14095 24353/16775/13717 24352/16774/13716 15285/17158/14096
+f 15285/17158/14096 24352/16774/13716 30764/16765/13707 25578/17155/14093
+f 15280/17156/14094 15281/17159/14097 15286/17160/14098 15282/17161/14099
+f 15282/17161/14099 15286/17160/14098 24424/17162/14100 24425/17163/14101
+f 15281/17159/14097 25577/17151/14089 25576/17150/14088 15286/17160/14098
+f 15286/17160/14098 25576/17150/14088 30788/17153/14091 24424/17162/14100
+f 15280/17156/14094 15282/17161/14099 15287/17164/14102 15283/17165/14103
+f 15283/17165/14103 15287/17164/14102 25509/16790/13732 25508/16785/13727
+f 15282/17161/14099 24425/17163/14101 24426/17166/14104 15287/17164/14102
+f 15287/17164/14102 24426/17166/14104 30765/16791/13733 25509/16790/13732
+f 15280/17156/14094 15283/17165/14103 15288/17167/14105 15284/17157/14095
+f 15284/17157/14095 15288/17167/14105 24354/16778/13720 24353/16775/13717
+f 15283/17165/14103 25508/16785/13727 25507/16784/13726 15288/17167/14105
+f 15288/17167/14105 25507/16784/13726 30741/16403/13349 24354/16778/13720
+f 15289/17168/14106 15293/17169/14107 15294/17170/14108 15290/17171/14109
+f 15290/17171/14109 15294/17170/14108 25579/17172/14110 25580/17173/14111
+f 15293/17169/14107 24356/16789/13731 24355/16788/13730 15294/17170/14108
+f 15294/17170/14108 24355/16788/13730 30765/16791/13733 25579/17172/14110
+f 15289/17168/14106 15290/17171/14109 15295/17174/14112 15291/17175/14113
+f 15291/17175/14113 15295/17174/14112 24427/17176/14114 24428/17177/14115
+f 15290/17171/14109 25580/17173/14111 25581/17178/14116 15295/17174/14112
+f 15295/17174/14112 25581/17178/14116 30789/17179/14117 24427/17176/14114
+f 15289/17168/14106 15291/17175/14113 15296/17180/14118 15292/17181/14119
+f 15292/17181/14119 15296/17180/14118 25582/17182/14120 25583/17183/14121
+f 15291/17175/14113 24428/17177/14115 24429/17184/14122 15296/17180/14118
+f 15296/17180/14118 24429/17184/14122 30790/17185/14123 25582/17182/14120
+f 15289/17168/14106 15292/17181/14119 15297/17186/14124 15293/17169/14107
+f 15293/17169/14107 15297/17186/14124 24357/16796/13738 24356/16789/13731
+f 15292/17181/14119 25583/17183/14121 25584/17187/14125 15297/17186/14124
+f 15297/17186/14124 25584/17187/14125 30766/16797/13739 24357/16796/13738
+f 15298/17188/14126 15302/17189/14127 15303/17190/14128 15299/17191/14129
+f 15299/17191/14129 15303/17190/14128 25584/17187/14125 25583/17183/14121
+f 15302/17189/14127 24359/16807/13749 24358/16806/13748 15303/17190/14128
+f 15303/17190/14128 24358/16806/13748 30766/16797/13739 25584/17187/14125
+f 15298/17188/14126 15299/17191/14129 15304/17192/14130 15300/17193/14131
+f 15300/17193/14131 15304/17192/14130 24430/17194/14132 24431/17195/14133
+f 15299/17191/14129 25583/17183/14121 25582/17182/14120 15304/17192/14130
+f 15304/17192/14130 25582/17182/14120 30790/17185/14123 24430/17194/14132
+f 15298/17188/14126 15300/17193/14131 15305/17196/14134 15301/17197/14135
+f 15301/17197/14135 15305/17196/14134 25585/17198/14136 25586/17199/14137
+f 15300/17193/14131 24431/17195/14133 24432/17200/14138 15305/17196/14134
+f 15305/17196/14134 24432/17200/14138 30791/17201/14139 25585/17198/14136
+f 15298/17188/14126 15301/17197/14135 15306/17202/14140 15302/17189/14127
+f 15302/17189/14127 15306/17202/14140 24360/16812/13754 24359/16807/13749
+f 15301/17197/14135 25586/17199/14137 25587/17203/14141 15306/17202/14140
+f 15306/17202/14140 25587/17203/14141 30767/16813/13755 24360/16812/13754
+f 15307/17204/14142 15311/17205/14143 15312/17206/14144 15308/17207/14145
+f 15308/17207/14145 15312/17206/14144 25587/17203/14141 25586/17199/14137
+f 15311/17205/14143 24362/16823/13765 24361/16822/13764 15312/17206/14144
+f 15312/17206/14144 24361/16822/13764 30767/16813/13755 25587/17203/14141
+f 15307/17204/14142 15308/17207/14145 15313/17208/14146 15309/17209/14147
+f 15309/17209/14147 15313/17208/14146 24433/17210/14148 24434/17211/14149
+f 15308/17207/14145 25586/17199/14137 25585/17198/14136 15313/17208/14146
+f 15313/17208/14146 25585/17198/14136 30791/17201/14139 24433/17210/14148
+f 15307/17204/14142 15309/17209/14147 15314/17212/14150 15310/17213/14151
+f 15310/17213/14151 15314/17212/14150 25588/17214/14152 25589/17215/14153
+f 15309/17209/14147 24434/17211/14149 24435/17216/14154 15314/17212/14150
+f 15314/17212/14150 24435/17216/14154 30792/17217/14155 25588/17214/14152
+f 15307/17204/14142 15310/17213/14151 15315/17218/14156 15311/17205/14143
+f 15311/17205/14143 15315/17218/14156 24363/16828/13770 24362/16823/13765
+f 15310/17213/14151 25589/17215/14153 25590/17219/14157 15315/17218/14156
+f 15315/17218/14156 25590/17219/14157 30768/16829/13771 24363/16828/13770
+f 15316/17220/14158 15320/17221/14159 15321/17222/14160 15317/17223/14161
+f 15317/17223/14161 15321/17222/14160 25590/17219/14157 25589/17215/14153
+f 15320/17221/14159 24365/16839/13781 24364/16838/13780 15321/17222/14160
+f 15321/17222/14160 24364/16838/13780 30768/16829/13771 25590/17219/14157
+f 15316/17220/14158 15317/17223/14161 15322/17224/14162 15318/17225/14163
+f 15318/17225/14163 15322/17224/14162 24436/17226/14164 24437/17227/14165
+f 15317/17223/14161 25589/17215/14153 25588/17214/14152 15322/17224/14162
+f 15322/17224/14162 25588/17214/14152 30792/17217/14155 24436/17226/14164
+f 15316/17220/14158 15318/17225/14163 15323/17228/14166 15319/17229/14167
+f 15319/17229/14167 15323/17228/14166 25591/17230/14168 25592/17231/14169
+f 15318/17225/14163 24437/17227/14165 24438/17232/14170 15323/17228/14166
+f 15323/17228/14166 24438/17232/14170 30793/17233/14171 25591/17230/14168
+f 15316/17220/14158 15319/17229/14167 15324/17234/14172 15320/17221/14159
+f 15320/17221/14159 15324/17234/14172 24366/16844/13786 24365/16839/13781
+f 15319/17229/14167 25592/17231/14169 25593/17235/14173 15324/17234/14172
+f 15324/17234/14172 25593/17235/14173 30769/16845/13787 24366/16844/13786
+f 15325/17236/14174 15329/17237/14175 15330/17238/14176 15326/17239/14177
+f 15326/17239/14177 15330/17238/14176 25593/17235/14173 25592/17231/14169
+f 15329/17237/14175 24368/16855/13797 24367/16854/13796 15330/17238/14176
+f 15330/17238/14176 24367/16854/13796 30769/16845/13787 25593/17235/14173
+f 15325/17236/14174 15326/17239/14177 15331/17240/14178 15327/17241/14179
+f 15327/17241/14179 15331/17240/14178 24439/17242/14180 24440/17243/14181
+f 15326/17239/14177 25592/17231/14169 25591/17230/14168 15331/17240/14178
+f 15331/17240/14178 25591/17230/14168 30793/17233/14171 24439/17242/14180
+f 15325/17236/14174 15327/17241/14179 15332/17244/14182 15328/17245/14183
+f 15328/17245/14183 15332/17244/14182 25594/17246/14184 25595/17247/14185
+f 15327/17241/14179 24440/17243/14181 24441/17248/14186 15332/17244/14182
+f 15332/17244/14182 24441/17248/14186 30794/17249/14187 25594/17246/14184
+f 15325/17236/14174 15328/17245/14183 15333/17250/14188 15329/17237/14175
+f 15329/17237/14175 15333/17250/14188 24369/16860/13802 24368/16855/13797
+f 15328/17245/14183 25595/17247/14185 25596/17251/14189 15333/17250/14188
+f 15333/17250/14188 25596/17251/14189 30770/16861/13803 24369/16860/13802
+f 15334/17252/14190 15338/17253/14191 15339/17254/14192 15335/17255/14193
+f 15335/17255/14193 15339/17254/14192 25596/17251/14189 25595/17247/14185
+f 15338/17253/14191 24371/16871/13813 24370/16870/13812 15339/17254/14192
+f 15339/17254/14192 24370/16870/13812 30770/16861/13803 25596/17251/14189
+f 15334/17252/14190 15335/17255/14193 15340/17256/14194 15336/17257/14195
+f 15336/17257/14195 15340/17256/14194 24442/17258/14196 24443/17259/14197
+f 15335/17255/14193 25595/17247/14185 25594/17246/14184 15340/17256/14194
+f 15340/17256/14194 25594/17246/14184 30794/17249/14187 24442/17258/14196
+f 15334/17252/14190 15336/17257/14195 15341/17260/14198 15337/17261/14199
+f 15337/17261/14199 15341/17260/14198 25597/17262/14200 25598/17263/14201
+f 15336/17257/14195 24443/17259/14197 24444/17264/14202 15341/17260/14198
+f 15341/17260/14198 24444/17264/14202 30795/17265/14203 25597/17262/14200
+f 15334/17252/14190 15337/17261/14199 15342/17266/14204 15338/17253/14191
+f 15338/17253/14191 15342/17266/14204 24372/16876/13818 24371/16871/13813
+f 15337/17261/14199 25598/17263/14201 25599/17267/14205 15342/17266/14204
+f 15342/17266/14204 25599/17267/14205 30771/16877/13819 24372/16876/13818
+f 15343/17268/14206 15347/17269/14207 15348/17270/14208 15344/17271/14209
+f 15344/17271/14209 15348/17270/14208 25599/17267/14205 25598/17263/14201
+f 15347/17269/14207 24374/16887/13829 24373/16886/13828 15348/17270/14208
+f 15348/17270/14208 24373/16886/13828 30771/16877/13819 25599/17267/14205
+f 15343/17268/14206 15344/17271/14209 15349/17272/14210 15345/17273/14211
+f 15345/17273/14211 15349/17272/14210 24445/17274/14212 24446/17275/14213
+f 15344/17271/14209 25598/17263/14201 25597/17262/14200 15349/17272/14210
+f 15349/17272/14210 25597/17262/14200 30795/17265/14203 24445/17274/14212
+f 15343/17268/14206 15345/17273/14211 15350/17276/14214 15346/17277/14215
+f 15346/17277/14215 15350/17276/14214 25600/17278/14216 25601/17279/14217
+f 15345/17273/14211 24446/17275/14213 24447/17280/14218 15350/17276/14214
+f 15350/17276/14214 24447/17280/14218 30796/17281/14219 25600/17278/14216
+f 15343/17268/14206 15346/17277/14215 15351/17282/14220 15347/17269/14207
+f 15347/17269/14207 15351/17282/14220 24375/16892/13834 24374/16887/13829
+f 15346/17277/14215 25601/17279/14217 25602/17283/14221 15351/17282/14220
+f 15351/17282/14220 25602/17283/14221 30772/16893/13835 24375/16892/13834
+f 15352/17284/14222 15356/17285/14223 15357/17286/14224 15353/17287/14225
+f 15353/17287/14225 15357/17286/14224 25602/17283/14221 25601/17279/14217
+f 15356/17285/14223 24377/16903/13845 24376/16902/13844 15357/17286/14224
+f 15357/17286/14224 24376/16902/13844 30772/16893/13835 25602/17283/14221
+f 15352/17284/14222 15353/17287/14225 15358/17288/14226 15354/17289/14227
+f 15354/17289/14227 15358/17288/14226 24448/17290/14228 24449/17291/14229
+f 15353/17287/14225 25601/17279/14217 25600/17278/14216 15358/17288/14226
+f 15358/17288/14226 25600/17278/14216 30796/17281/14219 24448/17290/14228
+f 15352/17284/14222 15354/17289/14227 15359/17292/14230 15355/17293/14231
+f 15355/17293/14231 15359/17292/14230 25603/17294/14232 25604/17295/14233
+f 15354/17289/14227 24449/17291/14229 24450/17296/14234 15359/17292/14230
+f 15359/17292/14230 24450/17296/14234 30797/17297/14235 25603/17294/14232
+f 15352/17284/14222 15355/17293/14231 15360/17298/14236 15356/17285/14223
+f 15356/17285/14223 15360/17298/14236 24378/16908/13850 24377/16903/13845
+f 15355/17293/14231 25604/17295/14233 25605/17299/14237 15360/17298/14236
+f 15360/17298/14236 25605/17299/14237 30773/16909/13851 24378/16908/13850
+f 15361/17300/14238 15365/17301/14239 15366/17302/14240 15362/17303/14241
+f 15362/17303/14241 15366/17302/14240 25605/17299/14237 25604/17295/14233
+f 15365/17301/14239 24380/16919/13861 24379/16918/13860 15366/17302/14240
+f 15366/17302/14240 24379/16918/13860 30773/16909/13851 25605/17299/14237
+f 15361/17300/14238 15362/17303/14241 15367/17304/14242 15363/17305/14243
+f 15363/17305/14243 15367/17304/14242 24451/17306/14244 24452/17307/14245
+f 15362/17303/14241 25604/17295/14233 25603/17294/14232 15367/17304/14242
+f 15367/17304/14242 25603/17294/14232 30797/17297/14235 24451/17306/14244
+f 15361/17300/14238 15363/17305/14243 15368/17308/14246 15364/17309/14247
+f 15364/17309/14247 15368/17308/14246 25606/17310/14248 25607/17311/14249
+f 15363/17305/14243 24452/17307/14245 24453/17312/14250 15368/17308/14246
+f 15368/17308/14246 24453/17312/14250 30798/17313/14251 25606/17310/14248
+f 15361/17300/14238 15364/17309/14247 15369/17314/14252 15365/17301/14239
+f 15365/17301/14239 15369/17314/14252 24381/16924/13866 24380/16919/13861
+f 15364/17309/14247 25607/17311/14249 25608/17315/14253 15369/17314/14252
+f 15369/17314/14252 25608/17315/14253 30774/16925/13867 24381/16924/13866
+f 15370/17316/14254 15374/17317/14255 15375/17318/14256 15371/17319/14257
+f 15371/17319/14257 15375/17318/14256 25608/17315/14253 25607/17311/14249
+f 15374/17317/14255 24383/16935/13877 24382/16934/13876 15375/17318/14256
+f 15375/17318/14256 24382/16934/13876 30774/16925/13867 25608/17315/14253
+f 15370/17316/14254 15371/17319/14257 15376/17320/14258 15372/17321/14259
+f 15372/17321/14259 15376/17320/14258 24454/17322/14260 24455/17323/14261
+f 15371/17319/14257 25607/17311/14249 25606/17310/14248 15376/17320/14258
+f 15376/17320/14258 25606/17310/14248 30798/17313/14251 24454/17322/14260
+f 15370/17316/14254 15372/17321/14259 15377/17324/14262 15373/17325/14263
+f 15373/17325/14263 15377/17324/14262 25609/17326/14264 25610/17327/14265
+f 15372/17321/14259 24455/17323/14261 24456/17328/14266 15377/17324/14262
+f 15377/17324/14262 24456/17328/14266 30799/17329/14267 25609/17326/14264
+f 15370/17316/14254 15373/17325/14263 15378/17330/14268 15374/17317/14255
+f 15374/17317/14255 15378/17330/14268 24384/16940/13882 24383/16935/13877
+f 15373/17325/14263 25610/17327/14265 25611/17331/14269 15378/17330/14268
+f 15378/17330/14268 25611/17331/14269 30775/16941/13883 24384/16940/13882
+f 15379/17332/14270 15383/17333/14271 15384/17334/14272 15380/17335/14273
+f 15380/17335/14273 15384/17334/14272 25611/17331/14269 25610/17327/14265
+f 15383/17333/14271 24386/16951/13893 24385/16950/13892 15384/17334/14272
+f 15384/17334/14272 24385/16950/13892 30775/16941/13883 25611/17331/14269
+f 15379/17332/14270 15380/17335/14273 15385/17336/14274 15381/17337/14275
+f 15381/17337/14275 15385/17336/14274 24457/17338/14276 24458/17339/14277
+f 15380/17335/14273 25610/17327/14265 25609/17326/14264 15385/17336/14274
+f 15385/17336/14274 25609/17326/14264 30799/17329/14267 24457/17338/14276
+f 15379/17332/14270 15381/17337/14275 15386/17340/14278 15382/17341/14279
+f 15382/17341/14279 15386/17340/14278 25612/17342/14280 25613/17343/14281
+f 15381/17337/14275 24458/17339/14277 24459/17344/14282 15386/17340/14278
+f 15386/17340/14278 24459/17344/14282 30800/17345/14283 25612/17342/14280
+f 15379/17332/14270 15382/17341/14279 15387/17346/14284 15383/17333/14271
+f 15383/17333/14271 15387/17346/14284 24387/16956/13898 24386/16951/13893
+f 15382/17341/14279 25613/17343/14281 25614/17347/14285 15387/17346/14284
+f 15387/17346/14284 25614/17347/14285 30776/16957/13899 24387/16956/13898
+f 15388/17348/14286 15392/17349/14287 15393/17350/14288 15389/17351/14289
+f 15389/17351/14289 15393/17350/14288 25614/17347/14285 25613/17343/14281
+f 15392/17349/14287 24389/16967/13909 24388/16966/13908 15393/17350/14288
+f 15393/17350/14288 24388/16966/13908 30776/16957/13899 25614/17347/14285
+f 15388/17348/14286 15389/17351/14289 15394/17352/14290 15390/17353/14291
+f 15390/17353/14291 15394/17352/14290 24460/17354/14292 24461/17355/14293
+f 15389/17351/14289 25613/17343/14281 25612/17342/14280 15394/17352/14290
+f 15394/17352/14290 25612/17342/14280 30800/17345/14283 24460/17354/14292
+f 15388/17348/14286 15390/17353/14291 15395/17356/14294 15391/17357/14295
+f 15391/17357/14295 15395/17356/14294 25615/17358/14296 25616/17359/14297
+f 15390/17353/14291 24461/17355/14293 24462/17360/14298 15395/17356/14294
+f 15395/17356/14294 24462/17360/14298 30801/17361/14299 25615/17358/14296
+f 15388/17348/14286 15391/17357/14295 15396/17362/14300 15392/17349/14287
+f 15392/17349/14287 15396/17362/14300 24390/16972/13914 24389/16967/13909
+f 15391/17357/14295 25616/17359/14297 25617/17363/14301 15396/17362/14300
+f 15396/17362/14300 25617/17363/14301 30777/16973/13915 24390/16972/13914
+f 15397/17364/14302 15401/17365/14303 15402/17366/14304 15398/17367/14305
+f 15398/17367/14305 15402/17366/14304 25617/17363/14301 25616/17359/14297
+f 15401/17365/14303 24392/16983/13925 24391/16982/13924 15402/17366/14304
+f 15402/17366/14304 24391/16982/13924 30777/16973/13915 25617/17363/14301
+f 15397/17364/14302 15398/17367/14305 15403/17368/14306 15399/17369/14307
+f 15399/17369/14307 15403/17368/14306 24463/17370/14308 24464/17371/14309
+f 15398/17367/14305 25616/17359/14297 25615/17358/14296 15403/17368/14306
+f 15403/17368/14306 25615/17358/14296 30801/17361/14299 24463/17370/14308
+f 15397/17364/14302 15399/17369/14307 15404/17372/14310 15400/17373/14311
+f 15400/17373/14311 15404/17372/14310 25618/17374/14312 25619/17375/14313
+f 15399/17369/14307 24464/17371/14309 24465/17376/14314 15404/17372/14310
+f 15404/17372/14310 24465/17376/14314 30802/17377/14315 25618/17374/14312
+f 15397/17364/14302 15400/17373/14311 15405/17378/14316 15401/17365/14303
+f 15401/17365/14303 15405/17378/14316 24393/16988/13930 24392/16983/13925
+f 15400/17373/14311 25619/17375/14313 25620/17379/14317 15405/17378/14316
+f 15405/17378/14316 25620/17379/14317 30778/16989/13931 24393/16988/13930
+f 15406/17380/14318 15410/17381/14319 15411/17382/14320 15407/17383/14321
+f 15407/17383/14321 15411/17382/14320 25620/17379/14317 25619/17375/14313
+f 15410/17381/14319 24395/16999/13941 24394/16998/13940 15411/17382/14320
+f 15411/17382/14320 24394/16998/13940 30778/16989/13931 25620/17379/14317
+f 15406/17380/14318 15407/17383/14321 15412/17384/14322 15408/17385/14323
+f 15408/17385/14323 15412/17384/14322 24466/17386/14324 24467/17387/14325
+f 15407/17383/14321 25619/17375/14313 25618/17374/14312 15412/17384/14322
+f 15412/17384/14322 25618/17374/14312 30802/17377/14315 24466/17386/14324
+f 15406/17380/14318 15408/17385/14323 15413/17388/14326 15409/17389/14327
+f 15409/17389/14327 15413/17388/14326 25621/17390/14328 25622/17391/14329
+f 15408/17385/14323 24467/17387/14325 24468/17392/14330 15413/17388/14326
+f 15413/17388/14326 24468/17392/14330 30803/17393/14331 25621/17390/14328
+f 15406/17380/14318 15409/17389/14327 15414/17394/14332 15410/17381/14319
+f 15410/17381/14319 15414/17394/14332 24396/17004/13946 24395/16999/13941
+f 15409/17389/14327 25622/17391/14329 25623/17395/14333 15414/17394/14332
+f 15414/17394/14332 25623/17395/14333 30779/17005/13947 24396/17004/13946
+f 15415/17396/14334 15419/17397/14335 15420/17398/14336 15416/17399/14337
+f 15416/17399/14337 15420/17398/14336 25623/17395/14333 25622/17391/14329
+f 15419/17397/14335 24398/17015/13957 24397/17014/13956 15420/17398/14336
+f 15420/17398/14336 24397/17014/13956 30779/17005/13947 25623/17395/14333
+f 15415/17396/14334 15416/17399/14337 15421/17400/14338 15417/17401/14339
+f 15417/17401/14339 15421/17400/14338 24469/17402/14340 24470/17403/14341
+f 15416/17399/14337 25622/17391/14329 25621/17390/14328 15421/17400/14338
+f 15421/17400/14338 25621/17390/14328 30803/17393/14331 24469/17402/14340
+f 15415/17396/14334 15417/17401/14339 15422/17404/14342 15418/17405/14343
+f 15418/17405/14343 15422/17404/14342 25624/17406/14344 25625/17407/14345
+f 15417/17401/14339 24470/17403/14341 24471/17408/14346 15422/17404/14342
+f 15422/17404/14342 24471/17408/14346 30804/17409/14347 25624/17406/14344
+f 15415/17396/14334 15418/17405/14343 15423/17410/14348 15419/17397/14335
+f 15419/17397/14335 15423/17410/14348 24399/17020/13962 24398/17015/13957
+f 15418/17405/14343 25625/17407/14345 25626/17411/14349 15423/17410/14348
+f 15423/17410/14348 25626/17411/14349 30780/17021/13963 24399/17020/13962
+f 15424/17412/14350 15428/17413/14351 15429/17414/14352 15425/17415/14353
+f 15425/17415/14353 15429/17414/14352 25626/17411/14349 25625/17407/14345
+f 15428/17413/14351 24401/17031/13973 24400/17030/13972 15429/17414/14352
+f 15429/17414/14352 24400/17030/13972 30780/17021/13963 25626/17411/14349
+f 15424/17412/14350 15425/17415/14353 15430/17416/14354 15426/17417/14355
+f 15426/17417/14355 15430/17416/14354 24472/17418/14356 24473/17419/14357
+f 15425/17415/14353 25625/17407/14345 25624/17406/14344 15430/17416/14354
+f 15430/17416/14354 25624/17406/14344 30804/17409/14347 24472/17418/14356
+f 15424/17412/14350 15426/17417/14355 15431/17420/14358 15427/17421/14359
+f 15427/17421/14359 15431/17420/14358 25627/17422/14360 25628/17423/14361
+f 15426/17417/14355 24473/17419/14357 24474/17424/14362 15431/17420/14358
+f 15431/17420/14358 24474/17424/14362 30805/17425/14363 25627/17422/14360
+f 15424/17412/14350 15427/17421/14359 15432/17426/14364 15428/17413/14351
+f 15428/17413/14351 15432/17426/14364 24402/17036/13978 24401/17031/13973
+f 15427/17421/14359 25628/17423/14361 25629/17427/14365 15432/17426/14364
+f 15432/17426/14364 25629/17427/14365 30781/17037/13979 24402/17036/13978
+f 15433/17428/14366 15437/17429/14367 15438/17430/14368 15434/17431/14369
+f 15434/17431/14369 15438/17430/14368 25629/17427/14365 25628/17423/14361
+f 15437/17429/14367 24404/17047/13989 24403/17046/13988 15438/17430/14368
+f 15438/17430/14368 24403/17046/13988 30781/17037/13979 25629/17427/14365
+f 15433/17428/14366 15434/17431/14369 15439/17432/14370 15435/17433/14371
+f 15435/17433/14371 15439/17432/14370 24475/17434/14372 24476/17435/14373
+f 15434/17431/14369 25628/17423/14361 25627/17422/14360 15439/17432/14370
+f 15439/17432/14370 25627/17422/14360 30805/17425/14363 24475/17434/14372
+f 15433/17428/14366 15435/17433/14371 15440/17436/14374 15436/17437/14375
+f 15436/17437/14375 15440/17436/14374 25630/17438/14376 25631/17439/14377
+f 15435/17433/14371 24476/17435/14373 24477/17440/14378 15440/17436/14374
+f 15440/17436/14374 24477/17440/14378 30806/17441/14379 25630/17438/14376
+f 15433/17428/14366 15436/17437/14375 15441/17442/14380 15437/17429/14367
+f 15437/17429/14367 15441/17442/14380 24405/17052/13994 24404/17047/13989
+f 15436/17437/14375 25631/17439/14377 25632/17443/14381 15441/17442/14380
+f 15441/17442/14380 25632/17443/14381 30782/17053/13995 24405/17052/13994
+f 15442/17444/14382 15446/17445/14383 15447/17446/14384 15443/17447/14385
+f 15443/17447/14385 15447/17446/14384 25632/17448/14381 25631/17449/14377
+f 15446/17445/14383 24407/17065/14005 24406/17064/14004 15447/17446/14384
+f 15447/17446/14384 24406/17064/14004 30782/17067/13995 25632/17448/14381
+f 15442/17444/14382 15443/17447/14385 15448/17450/14386 15444/17451/14387
+f 15444/17451/14387 15448/17450/14386 24478/17452/14388 24479/17453/14389
+f 15443/17447/14385 25631/17449/14377 25630/17454/14376 15448/17450/14386
+f 15448/17450/14386 25630/17454/14376 30806/17455/14379 24478/17452/14388
+f 15442/17444/14382 15444/17451/14387 15449/17456/14390 15445/17457/14391
+f 15445/17457/14391 15449/17456/14390 25633/17458/14392 25634/17459/14393
+f 15444/17451/14387 24479/17453/14389 24480/17460/14394 15449/17456/14390
+f 15449/17456/14390 24480/17460/14394 30807/17461/14395 25633/17458/14392
+f 15442/17444/14382 15445/17457/14391 15450/17462/14396 15446/17445/14383
+f 15446/17445/14383 15450/17462/14396 24408/17072/14010 24407/17065/14005
+f 15445/17457/14391 25634/17459/14393 25635/17463/14397 15450/17462/14396
+f 15450/17462/14396 25635/17463/14397 30783/17073/14011 24408/17072/14010
+f 15451/17464/14398 15455/17465/14399 15456/17466/14400 15452/17467/14401
+f 15452/17467/14401 15456/17466/14400 25635/17463/14397 25634/17459/14393
+f 15455/17465/14399 24410/17083/14021 24409/17082/14020 15456/17466/14400
+f 15456/17466/14400 24409/17082/14020 30783/17073/14011 25635/17463/14397
+f 15451/17464/14398 15452/17467/14401 15457/17468/14402 15453/17469/14403
+f 15453/17469/14403 15457/17468/14402 24481/17470/14404 24482/17471/14405
+f 15452/17467/14401 25634/17459/14393 25633/17458/14392 15457/17468/14402
+f 15457/17468/14402 25633/17458/14392 30807/17461/14395 24481/17470/14404
+f 15451/17464/14398 15453/17469/14403 15458/17472/14406 15454/17473/14407
+f 15454/17473/14407 15458/17472/14406 25636/17474/14408 25637/17475/14409
+f 15453/17469/14403 24482/17471/14405 24483/17476/14410 15458/17472/14406
+f 15458/17472/14406 24483/17476/14410 30808/17477/14411 25636/17474/14408
+f 15451/17464/14398 15454/17473/14407 15459/17478/14412 15455/17465/14399
+f 15455/17465/14399 15459/17478/14412 24411/17088/14026 24410/17083/14021
+f 15454/17473/14407 25637/17475/14409 25638/17479/14413 15459/17478/14412
+f 15459/17478/14412 25638/17479/14413 30784/17089/14027 24411/17088/14026
+f 15460/17480/14414 15464/17481/14415 15465/17482/14416 15461/17483/14417
+f 15461/17483/14417 15465/17482/14416 25638/17479/14413 25637/17475/14409
+f 15464/17481/14415 24413/17099/14037 24412/17098/14036 15465/17482/14416
+f 15465/17482/14416 24412/17098/14036 30784/17089/14027 25638/17479/14413
+f 15460/17480/14414 15461/17483/14417 15466/17484/14418 15462/17485/14419
+f 15462/17485/14419 15466/17484/14418 24484/17486/14420 24485/17487/14421
+f 15461/17483/14417 25637/17475/14409 25636/17474/14408 15466/17484/14418
+f 15466/17484/14418 25636/17474/14408 30808/17477/14411 24484/17486/14420
+f 15460/17480/14414 15462/17485/14419 15467/17488/14422 15463/17489/14423
+f 15463/17489/14423 15467/17488/14422 25639/17490/14424 25640/17491/14425
+f 15462/17485/14419 24485/17487/14421 24486/17492/14426 15467/17488/14422
+f 15467/17488/14422 24486/17492/14426 30809/17493/14427 25639/17490/14424
+f 15460/17480/14414 15463/17489/14423 15468/17494/14428 15464/17481/14415
+f 15464/17481/14415 15468/17494/14428 24414/17104/14042 24413/17099/14037
+f 15463/17489/14423 25640/17491/14425 25641/17495/14429 15468/17494/14428
+f 15468/17494/14428 25641/17495/14429 30785/17105/14043 24414/17104/14042
+f 15469/17496/14430 15473/17497/14431 15474/17498/14432 15470/17499/14433
+f 15470/17499/14433 15474/17498/14432 25641/17495/14429 25640/17491/14425
+f 15473/17497/14431 24416/17115/14053 24415/17114/14052 15474/17498/14432
+f 15474/17498/14432 24415/17114/14052 30785/17105/14043 25641/17495/14429
+f 15469/17496/14430 15470/17499/14433 15475/17500/14434 15471/17501/14435
+f 15471/17501/14435 15475/17500/14434 24487/17502/14436 24488/17503/14437
+f 15470/17499/14433 25640/17491/14425 25639/17490/14424 15475/17500/14434
+f 15475/17500/14434 25639/17490/14424 30809/17493/14427 24487/17502/14436
+f 15469/17496/14430 15471/17501/14435 15476/17504/14438 15472/17505/14439
+f 15472/17505/14439 15476/17504/14438 25642/17506/14440 25643/17507/14441
+f 15471/17501/14435 24488/17503/14437 24489/17508/14442 15476/17504/14438
+f 15476/17504/14438 24489/17508/14442 30810/17509/14443 25642/17506/14440
+f 15469/17496/14430 15472/17505/14439 15477/17510/14444 15473/17497/14431
+f 15473/17497/14431 15477/17510/14444 24417/17120/14058 24416/17115/14053
+f 15472/17505/14439 25643/17507/14441 25644/17511/14445 15477/17510/14444
+f 15477/17510/14444 25644/17511/14445 30786/17121/14059 24417/17120/14058
+f 15478/17512/14446 15482/17513/14447 15483/17514/14448 15479/17515/14449
+f 15479/17515/14449 15483/17514/14448 25644/17511/14445 25643/17507/14441
+f 15482/17513/14447 24419/17131/14069 24418/17130/14068 15483/17514/14448
+f 15483/17514/14448 24418/17130/14068 30786/17121/14059 25644/17511/14445
+f 15478/17512/14446 15479/17515/14449 15484/17516/14450 15480/17517/14451
+f 15480/17517/14451 15484/17516/14450 24490/17518/14452 24491/17519/14453
+f 15479/17515/14449 25643/17507/14441 25642/17506/14440 15484/17516/14450
+f 15484/17516/14450 25642/17506/14440 30810/17509/14443 24490/17518/14452
+f 15478/17512/14446 15480/17517/14451 15485/17520/14454 15481/17521/14455
+f 15481/17521/14455 15485/17520/14454 25645/17522/14456 25646/17523/14457
+f 15480/17517/14451 24491/17519/14453 24492/17524/14458 15485/17520/14454
+f 15485/17520/14454 24492/17524/14458 30811/17525/14459 25645/17522/14456
+f 15478/17512/14446 15481/17521/14455 15486/17526/14460 15482/17513/14447
+f 15482/17513/14447 15486/17526/14460 24420/17136/14074 24419/17131/14069
+f 15481/17521/14455 25646/17523/14457 25647/17527/14461 15486/17526/14460
+f 15486/17526/14460 25647/17527/14461 30787/17137/14075 24420/17136/14074
+f 15487/17528/14462 15491/17529/14463 15492/17530/14464 15488/17531/14465
+f 15488/17531/14465 15492/17530/14464 25647/17527/14461 25646/17523/14457
+f 15491/17529/14463 24422/17147/14085 24421/17146/14084 15492/17530/14464
+f 15492/17530/14464 24421/17146/14084 30787/17137/14075 25647/17527/14461
+f 15487/17528/14462 15488/17531/14465 15493/17532/14466 15489/17533/14467
+f 15489/17533/14467 15493/17532/14466 24493/17534/14468 24494/17535/14469
+f 15488/17531/14465 25646/17523/14457 25645/17522/14456 15493/17532/14466
+f 15493/17532/14466 25645/17522/14456 30811/17525/14459 24493/17534/14468
+f 15487/17528/14462 15489/17533/14467 15494/17536/14470 15490/17537/14471
+f 15490/17537/14471 15494/17536/14470 25648/17538/14472 25649/17539/14473
+f 15489/17533/14467 24494/17535/14469 24495/17540/14474 15494/17536/14470
+f 15494/17536/14470 24495/17540/14474 30812/17541/14475 25648/17538/14472
+f 15487/17528/14462 15490/17537/14471 15495/17542/14476 15491/17529/14463
+f 15491/17529/14463 15495/17542/14476 24423/17152/14090 24422/17147/14085
+f 15490/17537/14471 25649/17539/14473 25650/17543/14477 15495/17542/14476
+f 15495/17542/14476 25650/17543/14477 30788/17153/14091 24423/17152/14090
+f 15496/17544/14478 15500/17545/14479 15501/17546/14480 15497/17547/14481
+f 15497/17547/14481 15501/17546/14480 25650/17543/14477 25649/17539/14473
+f 15500/17545/14479 24425/17163/14101 24424/17162/14100 15501/17546/14480
+f 15501/17546/14480 24424/17162/14100 30788/17153/14091 25650/17543/14477
+f 15496/17544/14478 15497/17547/14481 15502/17548/14482 15498/17549/14483
+f 15498/17549/14483 15502/17548/14482 24496/17550/14484 24497/17551/14485
+f 15497/17547/14481 25649/17539/14473 25648/17538/14472 15502/17548/14482
+f 15502/17548/14482 25648/17538/14472 30812/17541/14475 24496/17550/14484
+f 15496/17544/14478 15498/17549/14483 15503/17552/14486 15499/17553/14487
+f 15499/17553/14487 15503/17552/14486 25581/17178/14116 25580/17173/14111
+f 15498/17549/14483 24497/17551/14485 24498/17554/14488 15503/17552/14486
+f 15503/17552/14486 24498/17554/14488 30789/17179/14117 25581/17178/14116
+f 15496/17544/14478 15499/17553/14487 15504/17555/14489 15500/17545/14479
+f 15500/17545/14479 15504/17555/14489 24426/17166/14104 24425/17163/14101
+f 15499/17553/14487 25580/17173/14111 25579/17172/14110 15504/17555/14489
+f 15504/17555/14489 25579/17172/14110 30765/16791/13733 24426/17166/14104
+f 15505/17556/14490 15509/17557/14491 15510/17558/14492 15506/17559/14493
+f 15506/17559/14493 15510/17558/14492 25651/17560/14494 25652/17561/14495
+f 15509/17557/14491 24428/17177/14115 24427/17176/14114 15510/17558/14492
+f 15510/17558/14492 24427/17176/14114 30789/17179/14117 25651/17560/14494
+f 15505/17556/14490 15506/17559/14493 15511/17562/14496 15507/17563/14497
+f 15507/17563/14497 15511/17562/14496 24499/17564/14498 24500/17565/14499
+f 15506/17559/14493 25652/17561/14495 25653/17566/14500 15511/17562/14496
+f 15511/17562/14496 25653/17566/14500 30813/17567/14501 24499/17564/14498
+f 15505/17556/14490 15507/17563/14497 15512/17568/14502 15508/17569/14503
+f 15508/17569/14503 15512/17568/14502 25654/17570/14504 25655/17571/14505
+f 15507/17563/14497 24500/17565/14499 24501/17572/14506 15512/17568/14502
+f 15512/17568/14502 24501/17572/14506 30814/17573/14507 25654/17570/14504
+f 15505/17556/14490 15508/17569/14503 15513/17574/14508 15509/17557/14491
+f 15509/17557/14491 15513/17574/14508 24429/17184/14122 24428/17177/14115
+f 15508/17569/14503 25655/17571/14505 25656/17575/14509 15513/17574/14508
+f 15513/17574/14508 25656/17575/14509 30790/17185/14123 24429/17184/14122
+f 15514/17576/14510 15518/17577/14511 15519/17578/14512 15515/17579/14513
+f 15515/17579/14513 15519/17578/14512 25656/17575/14509 25655/17571/14505
+f 15518/17577/14511 24431/17195/14133 24430/17194/14132 15519/17578/14512
+f 15519/17578/14512 24430/17194/14132 30790/17185/14123 25656/17575/14509
+f 15514/17576/14510 15515/17579/14513 15520/17580/14514 15516/17581/14515
+f 15516/17581/14515 15520/17580/14514 24502/17582/14516 24503/17583/14517
+f 15515/17579/14513 25655/17571/14505 25654/17570/14504 15520/17580/14514
+f 15520/17580/14514 25654/17570/14504 30814/17573/14507 24502/17582/14516
+f 15514/17576/14510 15516/17581/14515 15521/17584/14518 15517/17585/14519
+f 15517/17585/14519 15521/17584/14518 25657/17586/14520 25658/17587/14521
+f 15516/17581/14515 24503/17583/14517 24504/17588/14522 15521/17584/14518
+f 15521/17584/14518 24504/17588/14522 30815/17589/14523 25657/17586/14520
+f 15514/17576/14510 15517/17585/14519 15522/17590/14524 15518/17577/14511
+f 15518/17577/14511 15522/17590/14524 24432/17200/14138 24431/17195/14133
+f 15517/17585/14519 25658/17587/14521 25659/17591/14525 15522/17590/14524
+f 15522/17590/14524 25659/17591/14525 30791/17201/14139 24432/17200/14138
+f 15523/17592/14526 15527/17593/14527 15528/17594/14528 15524/17595/14529
+f 15524/17595/14529 15528/17594/14528 25659/17591/14525 25658/17587/14521
+f 15527/17593/14527 24434/17211/14149 24433/17210/14148 15528/17594/14528
+f 15528/17594/14528 24433/17210/14148 30791/17201/14139 25659/17591/14525
+f 15523/17592/14526 15524/17595/14529 15529/17596/14530 15525/17597/14531
+f 15525/17597/14531 15529/17596/14530 24505/17598/14532 24506/17599/14533
+f 15524/17595/14529 25658/17587/14521 25657/17586/14520 15529/17596/14530
+f 15529/17596/14530 25657/17586/14520 30815/17589/14523 24505/17598/14532
+f 15523/17592/14526 15525/17597/14531 15530/17600/14534 15526/17601/14535
+f 15526/17601/14535 15530/17600/14534 25660/17602/14536 25661/17603/14537
+f 15525/17597/14531 24506/17599/14533 24507/17604/14538 15530/17600/14534
+f 15530/17600/14534 24507/17604/14538 30816/17605/14539 25660/17602/14536
+f 15523/17592/14526 15526/17601/14535 15531/17606/14540 15527/17593/14527
+f 15527/17593/14527 15531/17606/14540 24435/17216/14154 24434/17211/14149
+f 15526/17601/14535 25661/17603/14537 25662/17607/14541 15531/17606/14540
+f 15531/17606/14540 25662/17607/14541 30792/17217/14155 24435/17216/14154
+f 15532/17608/14542 15536/17609/14543 15537/17610/14544 15533/17611/14545
+f 15533/17611/14545 15537/17610/14544 25662/17607/14541 25661/17603/14537
+f 15536/17609/14543 24437/17227/14165 24436/17226/14164 15537/17610/14544
+f 15537/17610/14544 24436/17226/14164 30792/17217/14155 25662/17607/14541
+f 15532/17608/14542 15533/17611/14545 15538/17612/14546 15534/17613/14547
+f 15534/17613/14547 15538/17612/14546 24508/17614/14548 24509/17615/14549
+f 15533/17611/14545 25661/17603/14537 25660/17602/14536 15538/17612/14546
+f 15538/17612/14546 25660/17602/14536 30816/17605/14539 24508/17614/14548
+f 15532/17608/14542 15534/17613/14547 15539/17616/14550 15535/17617/14551
+f 15535/17617/14551 15539/17616/14550 25663/17618/14552 25664/17619/14553
+f 15534/17613/14547 24509/17615/14549 24510/17620/14554 15539/17616/14550
+f 15539/17616/14550 24510/17620/14554 30817/17621/14555 25663/17618/14552
+f 15532/17608/14542 15535/17617/14551 15540/17622/14556 15536/17609/14543
+f 15536/17609/14543 15540/17622/14556 24438/17232/14170 24437/17227/14165
+f 15535/17617/14551 25664/17619/14553 25665/17623/14557 15540/17622/14556
+f 15540/17622/14556 25665/17623/14557 30793/17233/14171 24438/17232/14170
+f 15541/17624/14558 15545/17625/14559 15546/17626/14560 15542/17627/14561
+f 15542/17627/14561 15546/17626/14560 25665/17623/14557 25664/17619/14553
+f 15545/17625/14559 24440/17243/14181 24439/17242/14180 15546/17626/14560
+f 15546/17626/14560 24439/17242/14180 30793/17233/14171 25665/17623/14557
+f 15541/17624/14558 15542/17627/14561 15547/17628/14562 15543/17629/14563
+f 15543/17629/14563 15547/17628/14562 24511/17630/14564 24512/17631/14565
+f 15542/17627/14561 25664/17619/14553 25663/17618/14552 15547/17628/14562
+f 15547/17628/14562 25663/17618/14552 30817/17621/14555 24511/17630/14564
+f 15541/17624/14558 15543/17629/14563 15548/17632/14566 15544/17633/14567
+f 15544/17633/14567 15548/17632/14566 25666/17634/14568 25667/17635/14569
+f 15543/17629/14563 24512/17631/14565 24513/17636/14570 15548/17632/14566
+f 15548/17632/14566 24513/17636/14570 30818/17637/14571 25666/17634/14568
+f 15541/17624/14558 15544/17633/14567 15549/17638/14572 15545/17625/14559
+f 15545/17625/14559 15549/17638/14572 24441/17248/14186 24440/17243/14181
+f 15544/17633/14567 25667/17635/14569 25668/17639/14573 15549/17638/14572
+f 15549/17638/14572 25668/17639/14573 30794/17249/14187 24441/17248/14186
+f 15550/17640/14574 15554/17641/14575 15555/17642/14576 15551/17643/14577
+f 15551/17643/14577 15555/17642/14576 25668/17639/14573 25667/17635/14569
+f 15554/17641/14575 24443/17259/14197 24442/17258/14196 15555/17642/14576
+f 15555/17642/14576 24442/17258/14196 30794/17249/14187 25668/17639/14573
+f 15550/17640/14574 15551/17643/14577 15556/17644/14578 15552/17645/14579
+f 15552/17645/14579 15556/17644/14578 24514/17646/14580 24515/17647/14581
+f 15551/17643/14577 25667/17635/14569 25666/17634/14568 15556/17644/14578
+f 15556/17644/14578 25666/17634/14568 30818/17637/14571 24514/17646/14580
+f 15550/17640/14574 15552/17645/14579 15557/17648/14582 15553/17649/14583
+f 15553/17649/14583 15557/17648/14582 25669/17650/14584 25670/17651/14585
+f 15552/17645/14579 24515/17647/14581 24516/17652/14586 15557/17648/14582
+f 15557/17648/14582 24516/17652/14586 30819/17653/14587 25669/17650/14584
+f 15550/17640/14574 15553/17649/14583 15558/17654/14588 15554/17641/14575
+f 15554/17641/14575 15558/17654/14588 24444/17264/14202 24443/17259/14197
+f 15553/17649/14583 25670/17651/14585 25671/17655/14589 15558/17654/14588
+f 15558/17654/14588 25671/17655/14589 30795/17265/14203 24444/17264/14202
+f 15559/17656/14590 15563/17657/14591 15564/17658/14592 15560/17659/14593
+f 15560/17659/14593 15564/17658/14592 25671/17655/14589 25670/17651/14585
+f 15563/17657/14591 24446/17275/14213 24445/17274/14212 15564/17658/14592
+f 15564/17658/14592 24445/17274/14212 30795/17265/14203 25671/17655/14589
+f 15559/17656/14590 15560/17659/14593 15565/17660/14594 15561/17661/14595
+f 15561/17661/14595 15565/17660/14594 24517/17662/14596 24518/17663/14597
+f 15560/17659/14593 25670/17651/14585 25669/17650/14584 15565/17660/14594
+f 15565/17660/14594 25669/17650/14584 30819/17653/14587 24517/17662/14596
+f 15559/17656/14590 15561/17661/14595 15566/17664/14598 15562/17665/14599
+f 15562/17665/14599 15566/17664/14598 25672/17666/14600 25673/17667/14601
+f 15561/17661/14595 24518/17663/14597 24519/17668/14602 15566/17664/14598
+f 15566/17664/14598 24519/17668/14602 30820/17669/14603 25672/17666/14600
+f 15559/17656/14590 15562/17665/14599 15567/17670/14604 15563/17657/14591
+f 15563/17657/14591 15567/17670/14604 24447/17280/14218 24446/17275/14213
+f 15562/17665/14599 25673/17667/14601 25674/17671/14605 15567/17670/14604
+f 15567/17670/14604 25674/17671/14605 30796/17281/14219 24447/17280/14218
+f 15568/17672/14606 15572/17673/14607 15573/17674/14608 15569/17675/14609
+f 15569/17675/14609 15573/17674/14608 25674/17671/14605 25673/17667/14601
+f 15572/17673/14607 24449/17291/14229 24448/17290/14228 15573/17674/14608
+f 15573/17674/14608 24448/17290/14228 30796/17281/14219 25674/17671/14605
+f 15568/17672/14606 15569/17675/14609 15574/17676/14610 15570/17677/14611
+f 15570/17677/14611 15574/17676/14610 24520/17678/14612 24521/17679/14613
+f 15569/17675/14609 25673/17667/14601 25672/17666/14600 15574/17676/14610
+f 15574/17676/14610 25672/17666/14600 30820/17669/14603 24520/17678/14612
+f 15568/17672/14606 15570/17677/14611 15575/17680/14614 15571/17681/14615
+f 15571/17681/14615 15575/17680/14614 25675/17682/14616 25676/17683/14617
+f 15570/17677/14611 24521/17679/14613 24522/17684/14618 15575/17680/14614
+f 15575/17680/14614 24522/17684/14618 30821/17685/14619 25675/17682/14616
+f 15568/17672/14606 15571/17681/14615 15576/17686/14620 15572/17673/14607
+f 15572/17673/14607 15576/17686/14620 24450/17296/14234 24449/17291/14229
+f 15571/17681/14615 25676/17683/14617 25677/17687/14621 15576/17686/14620
+f 15576/17686/14620 25677/17687/14621 30797/17297/14235 24450/17296/14234
+f 15577/17688/14622 15581/17689/14623 15582/17690/14624 15578/17691/14625
+f 15578/17691/14625 15582/17690/14624 25677/17687/14621 25676/17683/14617
+f 15581/17689/14623 24452/17307/14245 24451/17306/14244 15582/17690/14624
+f 15582/17690/14624 24451/17306/14244 30797/17297/14235 25677/17687/14621
+f 15577/17688/14622 15578/17691/14625 15583/17692/14626 15579/17693/14627
+f 15579/17693/14627 15583/17692/14626 24523/17694/14628 24524/17695/14629
+f 15578/17691/14625 25676/17683/14617 25675/17682/14616 15583/17692/14626
+f 15583/17692/14626 25675/17682/14616 30821/17685/14619 24523/17694/14628
+f 15577/17688/14622 15579/17693/14627 15584/17696/14630 15580/17697/14631
+f 15580/17697/14631 15584/17696/14630 25678/17698/14632 25679/17699/14633
+f 15579/17693/14627 24524/17695/14629 24525/17700/14634 15584/17696/14630
+f 15584/17696/14630 24525/17700/14634 30822/17701/14635 25678/17698/14632
+f 15577/17688/14622 15580/17697/14631 15585/17702/14636 15581/17689/14623
+f 15581/17689/14623 15585/17702/14636 24453/17312/14250 24452/17307/14245
+f 15580/17697/14631 25679/17699/14633 25680/17703/14637 15585/17702/14636
+f 15585/17702/14636 25680/17703/14637 30798/17313/14251 24453/17312/14250
+f 15586/17704/14638 15590/17705/14639 15591/17706/14640 15587/17707/14641
+f 15587/17707/14641 15591/17706/14640 25680/17703/14637 25679/17699/14633
+f 15590/17705/14639 24455/17323/14261 24454/17322/14260 15591/17706/14640
+f 15591/17706/14640 24454/17322/14260 30798/17313/14251 25680/17703/14637
+f 15586/17704/14638 15587/17707/14641 15592/17708/14642 15588/17709/14643
+f 15588/17709/14643 15592/17708/14642 24526/17710/14644 24527/17711/14645
+f 15587/17707/14641 25679/17699/14633 25678/17698/14632 15592/17708/14642
+f 15592/17708/14642 25678/17698/14632 30822/17701/14635 24526/17710/14644
+f 15586/17704/14638 15588/17709/14643 15593/17712/14646 15589/17713/14647
+f 15589/17713/14647 15593/17712/14646 25681/17714/14648 25682/17715/14649
+f 15588/17709/14643 24527/17711/14645 24528/17716/14650 15593/17712/14646
+f 15593/17712/14646 24528/17716/14650 30823/17717/14651 25681/17714/14648
+f 15586/17704/14638 15589/17713/14647 15594/17718/14652 15590/17705/14639
+f 15590/17705/14639 15594/17718/14652 24456/17328/14266 24455/17323/14261
+f 15589/17713/14647 25682/17715/14649 25683/17719/14653 15594/17718/14652
+f 15594/17718/14652 25683/17719/14653 30799/17329/14267 24456/17328/14266
+f 15595/17720/14654 15599/17721/14655 15600/17722/14656 15596/17723/14657
+f 15596/17723/14657 15600/17722/14656 25683/17719/14653 25682/17715/14649
+f 15599/17721/14655 24458/17339/14277 24457/17338/14276 15600/17722/14656
+f 15600/17722/14656 24457/17338/14276 30799/17329/14267 25683/17719/14653
+f 15595/17720/14654 15596/17723/14657 15601/17724/14658 15597/17725/14659
+f 15597/17725/14659 15601/17724/14658 24529/17726/14660 24530/17727/14661
+f 15596/17723/14657 25682/17715/14649 25681/17714/14648 15601/17724/14658
+f 15601/17724/14658 25681/17714/14648 30823/17717/14651 24529/17726/14660
+f 15595/17720/14654 15597/17725/14659 15602/17728/14662 15598/17729/14663
+f 15598/17729/14663 15602/17728/14662 25684/17730/14664 25685/17731/14665
+f 15597/17725/14659 24530/17727/14661 24531/17732/14666 15602/17728/14662
+f 15602/17728/14662 24531/17732/14666 30824/17733/14667 25684/17730/14664
+f 15595/17720/14654 15598/17729/14663 15603/17734/14668 15599/17721/14655
+f 15599/17721/14655 15603/17734/14668 24459/17344/14282 24458/17339/14277
+f 15598/17729/14663 25685/17731/14665 25686/17735/14669 15603/17734/14668
+f 15603/17734/14668 25686/17735/14669 30800/17345/14283 24459/17344/14282
+f 15604/17736/14670 15608/17737/14671 15609/17738/14672 15605/17739/14673
+f 15605/17739/14673 15609/17738/14672 25686/17735/14669 25685/17731/14665
+f 15608/17737/14671 24461/17355/14293 24460/17354/14292 15609/17738/14672
+f 15609/17738/14672 24460/17354/14292 30800/17345/14283 25686/17735/14669
+f 15604/17736/14670 15605/17739/14673 15610/17740/14674 15606/17741/14675
+f 15606/17741/14675 15610/17740/14674 24532/17742/14676 24533/17743/14677
+f 15605/17739/14673 25685/17731/14665 25684/17730/14664 15610/17740/14674
+f 15610/17740/14674 25684/17730/14664 30824/17733/14667 24532/17742/14676
+f 15604/17736/14670 15606/17741/14675 15611/17744/14678 15607/17745/14679
+f 15607/17745/14679 15611/17744/14678 25687/17746/14680 25688/17747/14681
+f 15606/17741/14675 24533/17743/14677 24534/17748/14682 15611/17744/14678
+f 15611/17744/14678 24534/17748/14682 30825/17749/14683 25687/17746/14680
+f 15604/17736/14670 15607/17745/14679 15612/17750/14684 15608/17737/14671
+f 15608/17737/14671 15612/17750/14684 24462/17360/14298 24461/17355/14293
+f 15607/17745/14679 25688/17747/14681 25689/17751/14685 15612/17750/14684
+f 15612/17750/14684 25689/17751/14685 30801/17361/14299 24462/17360/14298
+f 15613/17752/14686 15617/17753/14687 15618/17754/14688 15614/17755/14689
+f 15614/17755/14689 15618/17754/14688 25689/17751/14685 25688/17747/14681
+f 15617/17753/14687 24464/17371/14309 24463/17370/14308 15618/17754/14688
+f 15618/17754/14688 24463/17370/14308 30801/17361/14299 25689/17751/14685
+f 15613/17752/14686 15614/17755/14689 15619/17756/14690 15615/17757/14691
+f 15615/17757/14691 15619/17756/14690 24535/17758/14692 24536/17759/14693
+f 15614/17755/14689 25688/17747/14681 25687/17746/14680 15619/17756/14690
+f 15619/17756/14690 25687/17746/14680 30825/17749/14683 24535/17758/14692
+f 15613/17752/14686 15615/17757/14691 15620/17760/14694 15616/17761/14695
+f 15616/17761/14695 15620/17760/14694 25690/17762/14696 25691/17763/14697
+f 15615/17757/14691 24536/17759/14693 24537/17764/14698 15620/17760/14694
+f 15620/17760/14694 24537/17764/14698 30826/17765/14699 25690/17762/14696
+f 15613/17752/14686 15616/17761/14695 15621/17766/14700 15617/17753/14687
+f 15617/17753/14687 15621/17766/14700 24465/17376/14314 24464/17371/14309
+f 15616/17761/14695 25691/17763/14697 25692/17767/14701 15621/17766/14700
+f 15621/17766/14700 25692/17767/14701 30802/17377/14315 24465/17376/14314
+f 15622/17768/14702 15626/17769/14703 15627/17770/14704 15623/17771/14705
+f 15623/17771/14705 15627/17770/14704 25692/17767/14701 25691/17763/14697
+f 15626/17769/14703 24467/17387/14325 24466/17386/14324 15627/17770/14704
+f 15627/17770/14704 24466/17386/14324 30802/17377/14315 25692/17767/14701
+f 15622/17768/14702 15623/17771/14705 15628/17772/14706 15624/17773/14707
+f 15624/17773/14707 15628/17772/14706 24538/17774/14708 24539/17775/14709
+f 15623/17771/14705 25691/17763/14697 25690/17762/14696 15628/17772/14706
+f 15628/17772/14706 25690/17762/14696 30826/17765/14699 24538/17774/14708
+f 15622/17768/14702 15624/17773/14707 15629/17776/14710 15625/17777/14711
+f 15625/17777/14711 15629/17776/14710 25693/17778/14712 25694/17779/14713
+f 15624/17773/14707 24539/17775/14709 24540/17780/14714 15629/17776/14710
+f 15629/17776/14710 24540/17780/14714 30827/17781/14715 25693/17778/14712
+f 15622/17768/14702 15625/17777/14711 15630/17782/14716 15626/17769/14703
+f 15626/17769/14703 15630/17782/14716 24468/17392/14330 24467/17387/14325
+f 15625/17777/14711 25694/17779/14713 25695/17783/14717 15630/17782/14716
+f 15630/17782/14716 25695/17783/14717 30803/17393/14331 24468/17392/14330
+f 15631/17784/14718 15635/17785/14719 15636/17786/14720 15632/17787/14721
+f 15632/17787/14721 15636/17786/14720 25695/17783/14717 25694/17779/14713
+f 15635/17785/14719 24470/17403/14341 24469/17402/14340 15636/17786/14720
+f 15636/17786/14720 24469/17402/14340 30803/17393/14331 25695/17783/14717
+f 15631/17784/14718 15632/17787/14721 15637/17788/14722 15633/17789/14723
+f 15633/17789/14723 15637/17788/14722 24541/17790/14724 24542/17791/14725
+f 15632/17787/14721 25694/17779/14713 25693/17778/14712 15637/17788/14722
+f 15637/17788/14722 25693/17778/14712 30827/17781/14715 24541/17790/14724
+f 15631/17784/14718 15633/17789/14723 15638/17792/14726 15634/17793/14727
+f 15634/17793/14727 15638/17792/14726 25696/17794/14728 25697/17795/14729
+f 15633/17789/14723 24542/17791/14725 24543/17796/14730 15638/17792/14726
+f 15638/17792/14726 24543/17796/14730 30828/17797/14731 25696/17794/14728
+f 15631/17784/14718 15634/17793/14727 15639/17798/14732 15635/17785/14719
+f 15635/17785/14719 15639/17798/14732 24471/17408/14346 24470/17403/14341
+f 15634/17793/14727 25697/17795/14729 25698/17799/14733 15639/17798/14732
+f 15639/17798/14732 25698/17799/14733 30804/17409/14347 24471/17408/14346
+f 15640/17800/14734 15644/17801/14735 15645/17802/14736 15641/17803/14737
+f 15641/17803/14737 15645/17802/14736 25698/17799/14733 25697/17795/14729
+f 15644/17801/14735 24473/17419/14357 24472/17418/14356 15645/17802/14736
+f 15645/17802/14736 24472/17418/14356 30804/17409/14347 25698/17799/14733
+f 15640/17800/14734 15641/17803/14737 15646/17804/14738 15642/17805/14739
+f 15642/17805/14739 15646/17804/14738 24544/17806/14740 24545/17807/14741
+f 15641/17803/14737 25697/17795/14729 25696/17794/14728 15646/17804/14738
+f 15646/17804/14738 25696/17794/14728 30828/17797/14731 24544/17806/14740
+f 15640/17800/14734 15642/17805/14739 15647/17808/14742 15643/17809/14743
+f 15643/17809/14743 15647/17808/14742 25699/17810/14744 25700/17811/14745
+f 15642/17805/14739 24545/17807/14741 24546/17812/14746 15647/17808/14742
+f 15647/17808/14742 24546/17812/14746 30829/17813/14747 25699/17810/14744
+f 15640/17800/14734 15643/17809/14743 15648/17814/14748 15644/17801/14735
+f 15644/17801/14735 15648/17814/14748 24474/17424/14362 24473/17419/14357
+f 15643/17809/14743 25700/17811/14745 25701/17815/14749 15648/17814/14748
+f 15648/17814/14748 25701/17815/14749 30805/17425/14363 24474/17424/14362
+f 15649/17816/14750 15653/17817/14751 15654/17818/14752 15650/17819/14753
+f 15650/17819/14753 15654/17818/14752 25701/17815/14749 25700/17811/14745
+f 15653/17817/14751 24476/17435/14373 24475/17434/14372 15654/17818/14752
+f 15654/17818/14752 24475/17434/14372 30805/17425/14363 25701/17815/14749
+f 15649/17816/14750 15650/17819/14753 15655/17820/14754 15651/17821/14755
+f 15651/17821/14755 15655/17820/14754 24547/17822/14756 24548/17823/14757
+f 15650/17819/14753 25700/17811/14745 25699/17810/14744 15655/17820/14754
+f 15655/17820/14754 25699/17810/14744 30829/17813/14747 24547/17822/14756
+f 15649/17816/14750 15651/17821/14755 15656/17824/14758 15652/17825/14759
+f 15652/17825/14759 15656/17824/14758 25702/17826/14760 25703/17827/14761
+f 15651/17821/14755 24548/17823/14757 24549/17828/14762 15656/17824/14758
+f 15656/17824/14758 24549/17828/14762 30830/17829/14763 25702/17826/14760
+f 15649/17816/14750 15652/17825/14759 15657/17830/14764 15653/17817/14751
+f 15653/17817/14751 15657/17830/14764 24477/17440/14378 24476/17435/14373
+f 15652/17825/14759 25703/17827/14761 25704/17831/14765 15657/17830/14764
+f 15657/17830/14764 25704/17831/14765 30806/17441/14379 24477/17440/14378
+f 15658/17832/14766 15662/17833/14767 15663/17834/14768 15659/17835/14769
+f 15659/17835/14769 15663/17834/14768 25704/17836/14765 25703/17837/14761
+f 15662/17833/14767 24479/17453/14389 24478/17452/14388 15663/17834/14768
+f 15663/17834/14768 24478/17452/14388 30806/17455/14379 25704/17836/14765
+f 15658/17832/14766 15659/17835/14769 15664/17838/14770 15660/17839/14771
+f 15660/17839/14771 15664/17838/14770 24550/17840/14772 24551/17841/14773
+f 15659/17835/14769 25703/17837/14761 25702/17842/14760 15664/17838/14770
+f 15664/17838/14770 25702/17842/14760 30830/17843/14763 24550/17840/14772
+f 15658/17832/14766 15660/17839/14771 15665/17844/14774 15661/17845/14775
+f 15661/17845/14775 15665/17844/14774 25705/17846/14776 25706/17847/14777
+f 15660/17839/14771 24551/17841/14773 24552/17848/14778 15665/17844/14774
+f 15665/17844/14774 24552/17848/14778 30831/17849/14779 25705/17846/14776
+f 15658/17832/14766 15661/17845/14775 15666/17850/14780 15662/17833/14767
+f 15662/17833/14767 15666/17850/14780 24480/17460/14394 24479/17453/14389
+f 15661/17845/14775 25706/17847/14777 25707/17851/14781 15666/17850/14780
+f 15666/17850/14780 25707/17851/14781 30807/17461/14395 24480/17460/14394
+f 15667/17852/14782 15671/17853/14783 15672/17854/14784 15668/17855/14785
+f 15668/17855/14785 15672/17854/14784 25707/17851/14781 25706/17847/14777
+f 15671/17853/14783 24482/17471/14405 24481/17470/14404 15672/17854/14784
+f 15672/17854/14784 24481/17470/14404 30807/17461/14395 25707/17851/14781
+f 15667/17852/14782 15668/17855/14785 15673/17856/14786 15669/17857/14787
+f 15669/17857/14787 15673/17856/14786 24553/17858/14788 24554/17859/14789
+f 15668/17855/14785 25706/17847/14777 25705/17846/14776 15673/17856/14786
+f 15673/17856/14786 25705/17846/14776 30831/17849/14779 24553/17858/14788
+f 15667/17852/14782 15669/17857/14787 15674/17860/14790 15670/17861/14791
+f 15670/17861/14791 15674/17860/14790 25708/17862/14792 25709/17863/14793
+f 15669/17857/14787 24554/17859/14789 24555/17864/14794 15674/17860/14790
+f 15674/17860/14790 24555/17864/14794 30832/17865/14795 25708/17862/14792
+f 15667/17852/14782 15670/17861/14791 15675/17866/14796 15671/17853/14783
+f 15671/17853/14783 15675/17866/14796 24483/17476/14410 24482/17471/14405
+f 15670/17861/14791 25709/17863/14793 25710/17867/14797 15675/17866/14796
+f 15675/17866/14796 25710/17867/14797 30808/17477/14411 24483/17476/14410
+f 15676/17868/14798 15680/17869/14799 15681/17870/14800 15677/17871/14801
+f 15677/17871/14801 15681/17870/14800 25710/17867/14797 25709/17863/14793
+f 15680/17869/14799 24485/17487/14421 24484/17486/14420 15681/17870/14800
+f 15681/17870/14800 24484/17486/14420 30808/17477/14411 25710/17867/14797
+f 15676/17868/14798 15677/17871/14801 15682/17872/14802 15678/17873/14803
+f 15678/17873/14803 15682/17872/14802 24556/17874/14804 24557/17875/14805
+f 15677/17871/14801 25709/17863/14793 25708/17862/14792 15682/17872/14802
+f 15682/17872/14802 25708/17862/14792 30832/17865/14795 24556/17874/14804
+f 15676/17868/14798 15678/17873/14803 15683/17876/14806 15679/17877/14807
+f 15679/17877/14807 15683/17876/14806 25711/17878/14808 25712/17879/14809
+f 15678/17873/14803 24557/17875/14805 24558/17880/14810 15683/17876/14806
+f 15683/17876/14806 24558/17880/14810 30833/17881/14811 25711/17878/14808
+f 15676/17868/14798 15679/17877/14807 15684/17882/14812 15680/17869/14799
+f 15680/17869/14799 15684/17882/14812 24486/17492/14426 24485/17487/14421
+f 15679/17877/14807 25712/17879/14809 25713/17883/14813 15684/17882/14812
+f 15684/17882/14812 25713/17883/14813 30809/17493/14427 24486/17492/14426
+f 15685/17884/14814 15689/17885/14815 15690/17886/14816 15686/17887/14817
+f 15686/17887/14817 15690/17886/14816 25713/17883/14813 25712/17879/14809
+f 15689/17885/14815 24488/17503/14437 24487/17502/14436 15690/17886/14816
+f 15690/17886/14816 24487/17502/14436 30809/17493/14427 25713/17883/14813
+f 15685/17884/14814 15686/17887/14817 15691/17888/14818 15687/17889/14819
+f 15687/17889/14819 15691/17888/14818 24559/17890/14820 24560/17891/14821
+f 15686/17887/14817 25712/17879/14809 25711/17878/14808 15691/17888/14818
+f 15691/17888/14818 25711/17878/14808 30833/17881/14811 24559/17890/14820
+f 15685/17884/14814 15687/17889/14819 15692/17892/14822 15688/17893/14823
+f 15688/17893/14823 15692/17892/14822 25714/17894/14824 25715/17895/14825
+f 15687/17889/14819 24560/17891/14821 24561/17896/14826 15692/17892/14822
+f 15692/17892/14822 24561/17896/14826 30834/17897/14827 25714/17894/14824
+f 15685/17884/14814 15688/17893/14823 15693/17898/14828 15689/17885/14815
+f 15689/17885/14815 15693/17898/14828 24489/17508/14442 24488/17503/14437
+f 15688/17893/14823 25715/17895/14825 25716/17899/14829 15693/17898/14828
+f 15693/17898/14828 25716/17899/14829 30810/17509/14443 24489/17508/14442
+f 15694/17900/14830 15698/17901/14831 15699/17902/14832 15695/17903/14833
+f 15695/17903/14833 15699/17902/14832 25716/17899/14829 25715/17895/14825
+f 15698/17901/14831 24491/17519/14453 24490/17518/14452 15699/17902/14832
+f 15699/17902/14832 24490/17518/14452 30810/17509/14443 25716/17899/14829
+f 15694/17900/14830 15695/17903/14833 15700/17904/14834 15696/17905/14835
+f 15696/17905/14835 15700/17904/14834 24562/17906/14836 24563/17907/14837
+f 15695/17903/14833 25715/17895/14825 25714/17894/14824 15700/17904/14834
+f 15700/17904/14834 25714/17894/14824 30834/17897/14827 24562/17906/14836
+f 15694/17900/14830 15696/17905/14835 15701/17908/14838 15697/17909/14839
+f 15697/17909/14839 15701/17908/14838 25717/17910/14840 25718/17911/14841
+f 15696/17905/14835 24563/17907/14837 24564/17912/14842 15701/17908/14838
+f 15701/17908/14838 24564/17912/14842 30835/17913/14843 25717/17910/14840
+f 15694/17900/14830 15697/17909/14839 15702/17914/14844 15698/17901/14831
+f 15698/17901/14831 15702/17914/14844 24492/17524/14458 24491/17519/14453
+f 15697/17909/14839 25718/17911/14841 25719/17915/14845 15702/17914/14844
+f 15702/17914/14844 25719/17915/14845 30811/17525/14459 24492/17524/14458
+f 15703/17916/14846 15707/17917/14847 15708/17918/14848 15704/17919/14849
+f 15704/17919/14849 15708/17918/14848 25719/17915/14845 25718/17911/14841
+f 15707/17917/14847 24494/17535/14469 24493/17534/14468 15708/17918/14848
+f 15708/17918/14848 24493/17534/14468 30811/17525/14459 25719/17915/14845
+f 15703/17916/14846 15704/17919/14849 15709/17920/14850 15705/17921/14851
+f 15705/17921/14851 15709/17920/14850 24565/17922/14852 24566/17923/14853
+f 15704/17919/14849 25718/17911/14841 25717/17910/14840 15709/17920/14850
+f 15709/17920/14850 25717/17910/14840 30835/17913/14843 24565/17922/14852
+f 15703/17916/14846 15705/17921/14851 15710/17924/14854 15706/17925/14855
+f 15706/17925/14855 15710/17924/14854 25720/17926/14856 25721/17927/14857
+f 15705/17921/14851 24566/17923/14853 24567/17928/14858 15710/17924/14854
+f 15710/17924/14854 24567/17928/14858 30836/17929/14859 25720/17926/14856
+f 15703/17916/14846 15706/17925/14855 15711/17930/14860 15707/17917/14847
+f 15707/17917/14847 15711/17930/14860 24495/17540/14474 24494/17535/14469
+f 15706/17925/14855 25721/17927/14857 25722/17931/14861 15711/17930/14860
+f 15711/17930/14860 25722/17931/14861 30812/17541/14475 24495/17540/14474
+f 15712/17932/14862 15716/17933/14863 15717/17934/14864 15713/17935/14865
+f 15713/17935/14865 15717/17934/14864 25722/17931/14861 25721/17927/14857
+f 15716/17933/14863 24497/17551/14485 24496/17550/14484 15717/17934/14864
+f 15717/17934/14864 24496/17550/14484 30812/17541/14475 25722/17931/14861
+f 15712/17932/14862 15713/17935/14865 15718/17936/14866 15714/17937/14867
+f 15714/17937/14867 15718/17936/14866 24568/17938/14868 24569/17939/14869
+f 15713/17935/14865 25721/17927/14857 25720/17926/14856 15718/17936/14866
+f 15718/17936/14866 25720/17926/14856 30836/17929/14859 24568/17938/14868
+f 15712/17932/14862 15714/17937/14867 15719/17940/14870 15715/17941/14871
+f 15715/17941/14871 15719/17940/14870 25653/17566/14500 25652/17561/14495
+f 15714/17937/14867 24569/17939/14869 24570/17942/14872 15719/17940/14870
+f 15719/17940/14870 24570/17942/14872 30813/17567/14501 25653/17566/14500
+f 15712/17932/14862 15715/17941/14871 15720/17943/14873 15716/17933/14863
+f 15716/17933/14863 15720/17943/14873 24498/17554/14488 24497/17551/14485
+f 15715/17941/14871 25652/17561/14495 25651/17560/14494 15720/17943/14873
+f 15720/17943/14873 25651/17560/14494 30789/17179/14117 24498/17554/14488
+f 15721/17944/14874 15725/17945/14875 15726/17946/14876 15722/17947/14877
+f 15722/17947/14877 15726/17946/14876 25723/17948/14878 25724/17949/14879
+f 15725/17945/14875 24500/17565/14499 24499/17564/14498 15726/17946/14876
+f 15726/17946/14876 24499/17564/14498 30813/17567/14501 25723/17948/14878
+f 15721/17944/14874 15722/17947/14877 15727/17950/14880 15723/17951/14881
+f 15723/17951/14881 15727/17950/14880 24571/17952/14882 24572/17953/14883
+f 15722/17947/14877 25724/17949/14879 25725/17954/14884 15727/17950/14880
+f 15727/17950/14880 25725/17954/14884 30837/17955/14885 24571/17952/14882
+f 15721/17944/14874 15723/17951/14881 15728/17956/14886 15724/17957/14887
+f 15724/17957/14887 15728/17956/14886 25726/17958/14888 25727/17959/14889
+f 15723/17951/14881 24572/17953/14883 24573/17960/14890 15728/17956/14886
+f 15728/17956/14886 24573/17960/14890 30838/17961/14891 25726/17958/14888
+f 15721/17944/14874 15724/17957/14887 15729/17962/14892 15725/17945/14875
+f 15725/17945/14875 15729/17962/14892 24501/17572/14506 24500/17565/14499
+f 15724/17957/14887 25727/17959/14889 25728/17963/14893 15729/17962/14892
+f 15729/17962/14892 25728/17963/14893 30814/17573/14507 24501/17572/14506
+f 15730/17964/14894 15734/17965/14895 15735/17966/14896 15731/17967/14897
+f 15731/17967/14897 15735/17966/14896 25728/17963/14893 25727/17959/14889
+f 15734/17965/14895 24503/17583/14517 24502/17582/14516 15735/17966/14896
+f 15735/17966/14896 24502/17582/14516 30814/17573/14507 25728/17963/14893
+f 15730/17964/14894 15731/17967/14897 15736/17968/14898 15732/17969/14899
+f 15732/17969/14899 15736/17968/14898 24574/17970/14900 24575/17971/14901
+f 15731/17967/14897 25727/17959/14889 25726/17958/14888 15736/17968/14898
+f 15736/17968/14898 25726/17958/14888 30838/17961/14891 24574/17970/14900
+f 15730/17964/14894 15732/17969/14899 15737/17972/14902 15733/17973/14903
+f 15733/17973/14903 15737/17972/14902 25729/17974/14904 25730/17975/14905
+f 15732/17969/14899 24575/17971/14901 24576/17976/14906 15737/17972/14902
+f 15737/17972/14902 24576/17976/14906 30839/17977/14907 25729/17974/14904
+f 15730/17964/14894 15733/17973/14903 15738/17978/14908 15734/17965/14895
+f 15734/17965/14895 15738/17978/14908 24504/17588/14522 24503/17583/14517
+f 15733/17973/14903 25730/17975/14905 25731/17979/14909 15738/17978/14908
+f 15738/17978/14908 25731/17979/14909 30815/17589/14523 24504/17588/14522
+f 15739/17980/14910 15743/17981/14911 15744/17982/14912 15740/17983/14913
+f 15740/17983/14913 15744/17982/14912 25731/17979/14909 25730/17975/14905
+f 15743/17981/14911 24506/17599/14533 24505/17598/14532 15744/17982/14912
+f 15744/17982/14912 24505/17598/14532 30815/17589/14523 25731/17979/14909
+f 15739/17980/14910 15740/17983/14913 15745/17984/14914 15741/17985/14915
+f 15741/17985/14915 15745/17984/14914 24577/17986/14916 24578/17987/14917
+f 15740/17983/14913 25730/17975/14905 25729/17974/14904 15745/17984/14914
+f 15745/17984/14914 25729/17974/14904 30839/17977/14907 24577/17986/14916
+f 15739/17980/14910 15741/17985/14915 15746/17988/14918 15742/17989/14919
+f 15742/17989/14919 15746/17988/14918 25732/17990/14920 25733/17991/14921
+f 15741/17985/14915 24578/17987/14917 24579/17992/14922 15746/17988/14918
+f 15746/17988/14918 24579/17992/14922 30840/17993/14923 25732/17990/14920
+f 15739/17980/14910 15742/17989/14919 15747/17994/14924 15743/17981/14911
+f 15743/17981/14911 15747/17994/14924 24507/17604/14538 24506/17599/14533
+f 15742/17989/14919 25733/17991/14921 25734/17995/14925 15747/17994/14924
+f 15747/17994/14924 25734/17995/14925 30816/17605/14539 24507/17604/14538
+f 15748/17996/14926 15752/17997/14927 15753/17998/14928 15749/17999/14929
+f 15749/17999/14929 15753/17998/14928 25734/17995/14925 25733/17991/14921
+f 15752/17997/14927 24509/17615/14549 24508/17614/14548 15753/17998/14928
+f 15753/17998/14928 24508/17614/14548 30816/17605/14539 25734/17995/14925
+f 15748/17996/14926 15749/17999/14929 15754/18000/14930 15750/18001/14931
+f 15750/18001/14931 15754/18000/14930 24580/18002/14932 24581/18003/14933
+f 15749/17999/14929 25733/17991/14921 25732/17990/14920 15754/18000/14930
+f 15754/18000/14930 25732/17990/14920 30840/17993/14923 24580/18002/14932
+f 15748/17996/14926 15750/18001/14931 15755/18004/14934 15751/18005/14935
+f 15751/18005/14935 15755/18004/14934 25735/18006/14936 25736/18007/14937
+f 15750/18001/14931 24581/18003/14933 24582/18008/14938 15755/18004/14934
+f 15755/18004/14934 24582/18008/14938 30841/18009/14939 25735/18006/14936
+f 15748/17996/14926 15751/18005/14935 15756/18010/14940 15752/17997/14927
+f 15752/17997/14927 15756/18010/14940 24510/17620/14554 24509/17615/14549
+f 15751/18005/14935 25736/18007/14937 25737/18011/14941 15756/18010/14940
+f 15756/18010/14940 25737/18011/14941 30817/17621/14555 24510/17620/14554
+f 15757/18012/14942 15761/18013/14943 15762/18014/14944 15758/18015/14945
+f 15758/18015/14945 15762/18014/14944 25737/18011/14941 25736/18007/14937
+f 15761/18013/14943 24512/17631/14565 24511/17630/14564 15762/18014/14944
+f 15762/18014/14944 24511/17630/14564 30817/17621/14555 25737/18011/14941
+f 15757/18012/14942 15758/18015/14945 15763/18016/14946 15759/18017/14947
+f 15759/18017/14947 15763/18016/14946 24583/18018/14948 24584/18019/14949
+f 15758/18015/14945 25736/18007/14937 25735/18006/14936 15763/18016/14946
+f 15763/18016/14946 25735/18006/14936 30841/18009/14939 24583/18018/14948
+f 15757/18012/14942 15759/18017/14947 15764/18020/14950 15760/18021/14951
+f 15760/18021/14951 15764/18020/14950 25738/18022/14952 25739/18023/14953
+f 15759/18017/14947 24584/18019/14949 24585/18024/14954 15764/18020/14950
+f 15764/18020/14950 24585/18024/14954 30842/18025/14955 25738/18022/14952
+f 15757/18012/14942 15760/18021/14951 15765/18026/14956 15761/18013/14943
+f 15761/18013/14943 15765/18026/14956 24513/17636/14570 24512/17631/14565
+f 15760/18021/14951 25739/18023/14953 25740/18027/14957 15765/18026/14956
+f 15765/18026/14956 25740/18027/14957 30818/17637/14571 24513/17636/14570
+f 15766/18028/14958 15770/18029/14959 15771/18030/14960 15767/18031/14961
+f 15767/18031/14961 15771/18030/14960 25740/18027/14957 25739/18023/14953
+f 15770/18029/14959 24515/17647/14581 24514/17646/14580 15771/18030/14960
+f 15771/18030/14960 24514/17646/14580 30818/17637/14571 25740/18027/14957
+f 15766/18028/14958 15767/18031/14961 15772/18032/14962 15768/18033/14963
+f 15768/18033/14963 15772/18032/14962 24586/18034/14964 24587/18035/14965
+f 15767/18031/14961 25739/18023/14953 25738/18022/14952 15772/18032/14962
+f 15772/18032/14962 25738/18022/14952 30842/18025/14955 24586/18034/14964
+f 15766/18028/14958 15768/18033/14963 15773/18036/14966 15769/18037/14967
+f 15769/18037/14967 15773/18036/14966 25741/18038/14968 25742/18039/14969
+f 15768/18033/14963 24587/18035/14965 24588/18040/14970 15773/18036/14966
+f 15773/18036/14966 24588/18040/14970 30843/18041/14971 25741/18038/14968
+f 15766/18028/14958 15769/18037/14967 15774/18042/14972 15770/18029/14959
+f 15770/18029/14959 15774/18042/14972 24516/17652/14586 24515/17647/14581
+f 15769/18037/14967 25742/18039/14969 25743/18043/14973 15774/18042/14972
+f 15774/18042/14972 25743/18043/14973 30819/17653/14587 24516/17652/14586
+f 15775/18044/14974 15779/18045/14975 15780/18046/14976 15776/18047/14977
+f 15776/18047/14977 15780/18046/14976 25743/18043/14973 25742/18039/14969
+f 15779/18045/14975 24518/17663/14597 24517/17662/14596 15780/18046/14976
+f 15780/18046/14976 24517/17662/14596 30819/17653/14587 25743/18043/14973
+f 15775/18044/14974 15776/18047/14977 15781/18048/14978 15777/18049/14979
+f 15777/18049/14979 15781/18048/14978 24589/18050/14980 24590/18051/14981
+f 15776/18047/14977 25742/18039/14969 25741/18038/14968 15781/18048/14978
+f 15781/18048/14978 25741/18038/14968 30843/18041/14971 24589/18050/14980
+f 15775/18044/14974 15777/18049/14979 15782/18052/14982 15778/18053/14983
+f 15778/18053/14983 15782/18052/14982 25744/18054/14984 25745/18055/14985
+f 15777/18049/14979 24590/18051/14981 24591/18056/14986 15782/18052/14982
+f 15782/18052/14982 24591/18056/14986 30844/18057/14987 25744/18054/14984
+f 15775/18044/14974 15778/18053/14983 15783/18058/14988 15779/18045/14975
+f 15779/18045/14975 15783/18058/14988 24519/17668/14602 24518/17663/14597
+f 15778/18053/14983 25745/18055/14985 25746/18059/14989 15783/18058/14988
+f 15783/18058/14988 25746/18059/14989 30820/17669/14603 24519/17668/14602
+f 15784/18060/14990 15788/18061/14991 15789/18062/14992 15785/18063/14993
+f 15785/18063/14993 15789/18062/14992 25746/18059/14989 25745/18055/14985
+f 15788/18061/14991 24521/17679/14613 24520/17678/14612 15789/18062/14992
+f 15789/18062/14992 24520/17678/14612 30820/17669/14603 25746/18059/14989
+f 15784/18060/14990 15785/18063/14993 15790/18064/14994 15786/18065/14995
+f 15786/18065/14995 15790/18064/14994 24592/18066/14996 24593/18067/14997
+f 15785/18063/14993 25745/18055/14985 25744/18054/14984 15790/18064/14994
+f 15790/18064/14994 25744/18054/14984 30844/18057/14987 24592/18066/14996
+f 15784/18060/14990 15786/18065/14995 15791/18068/14998 15787/18069/14999
+f 15787/18069/14999 15791/18068/14998 25747/18070/15000 25748/18071/15001
+f 15786/18065/14995 24593/18067/14997 24594/18072/15002 15791/18068/14998
+f 15791/18068/14998 24594/18072/15002 30845/18073/15003 25747/18070/15000
+f 15784/18060/14990 15787/18069/14999 15792/18074/15004 15788/18061/14991
+f 15788/18061/14991 15792/18074/15004 24522/17684/14618 24521/17679/14613
+f 15787/18069/14999 25748/18071/15001 25749/18075/15005 15792/18074/15004
+f 15792/18074/15004 25749/18075/15005 30821/17685/14619 24522/17684/14618
+f 15793/18076/15006 15797/18077/15007 15798/18078/15008 15794/18079/15009
+f 15794/18079/15009 15798/18078/15008 25749/18075/15005 25748/18071/15001
+f 15797/18077/15007 24524/17695/14629 24523/17694/14628 15798/18078/15008
+f 15798/18078/15008 24523/17694/14628 30821/17685/14619 25749/18075/15005
+f 15793/18076/15006 15794/18079/15009 15799/18080/15010 15795/18081/15011
+f 15795/18081/15011 15799/18080/15010 24595/18082/15012 24596/18083/15013
+f 15794/18079/15009 25748/18071/15001 25747/18070/15000 15799/18080/15010
+f 15799/18080/15010 25747/18070/15000 30845/18073/15003 24595/18082/15012
+f 15793/18076/15006 15795/18081/15011 15800/18084/15014 15796/18085/15015
+f 15796/18085/15015 15800/18084/15014 25750/18086/15016 25751/18087/15017
+f 15795/18081/15011 24596/18083/15013 24597/18088/15018 15800/18084/15014
+f 15800/18084/15014 24597/18088/15018 30846/18089/15019 25750/18086/15016
+f 15793/18076/15006 15796/18085/15015 15801/18090/15020 15797/18077/15007
+f 15797/18077/15007 15801/18090/15020 24525/17700/14634 24524/17695/14629
+f 15796/18085/15015 25751/18087/15017 25752/18091/15021 15801/18090/15020
+f 15801/18090/15020 25752/18091/15021 30822/17701/14635 24525/17700/14634
+f 15802/18092/15022 15806/18093/15023 15807/18094/15024 15803/18095/15025
+f 15803/18095/15025 15807/18094/15024 25752/18091/15021 25751/18087/15017
+f 15806/18093/15023 24527/17711/14645 24526/17710/14644 15807/18094/15024
+f 15807/18094/15024 24526/17710/14644 30822/17701/14635 25752/18091/15021
+f 15802/18092/15022 15803/18095/15025 15808/18096/15026 15804/18097/15027
+f 15804/18097/15027 15808/18096/15026 24598/18098/15028 24599/18099/15029
+f 15803/18095/15025 25751/18087/15017 25750/18086/15016 15808/18096/15026
+f 15808/18096/15026 25750/18086/15016 30846/18089/15019 24598/18098/15028
+f 15802/18092/15022 15804/18097/15027 15809/18100/15030 15805/18101/15031
+f 15805/18101/15031 15809/18100/15030 25753/18102/15032 25754/18103/15033
+f 15804/18097/15027 24599/18099/15029 24600/18104/15034 15809/18100/15030
+f 15809/18100/15030 24600/18104/15034 30847/18105/15035 25753/18102/15032
+f 15802/18092/15022 15805/18101/15031 15810/18106/15036 15806/18093/15023
+f 15806/18093/15023 15810/18106/15036 24528/17716/14650 24527/17711/14645
+f 15805/18101/15031 25754/18103/15033 25755/18107/15037 15810/18106/15036
+f 15810/18106/15036 25755/18107/15037 30823/17717/14651 24528/17716/14650
+f 15811/18108/15038 15815/18109/15039 15816/18110/15040 15812/18111/15041
+f 15812/18111/15041 15816/18110/15040 25755/18107/15037 25754/18103/15033
+f 15815/18109/15039 24530/17727/14661 24529/17726/14660 15816/18110/15040
+f 15816/18110/15040 24529/17726/14660 30823/17717/14651 25755/18107/15037
+f 15811/18108/15038 15812/18111/15041 15817/18112/15042 15813/18113/15043
+f 15813/18113/15043 15817/18112/15042 24601/18114/15044 24602/18115/15045
+f 15812/18111/15041 25754/18103/15033 25753/18102/15032 15817/18112/15042
+f 15817/18112/15042 25753/18102/15032 30847/18105/15035 24601/18114/15044
+f 15811/18108/15038 15813/18113/15043 15818/18116/15046 15814/18117/15047
+f 15814/18117/15047 15818/18116/15046 25756/18118/15048 25757/18119/15049
+f 15813/18113/15043 24602/18115/15045 24603/18120/15050 15818/18116/15046
+f 15818/18116/15046 24603/18120/15050 30848/18121/170 25756/18118/15048
+f 15811/18108/15038 15814/18117/15047 15819/18122/15051 15815/18109/15039
+f 15815/18109/15039 15819/18122/15051 24531/17732/14666 24530/17727/14661
+f 15814/18117/15047 25757/18119/15049 25758/18123/15052 15819/18122/15051
+f 15819/18122/15051 25758/18123/15052 30824/17733/14667 24531/17732/14666
+f 15820/18124/15053 15824/18125/15054 15825/18126/15055 15821/18127/15056
+f 15821/18127/15056 15825/18126/15055 25758/18123/15052 25757/18119/15049
+f 15824/18125/15054 24533/17743/14677 24532/17742/14676 15825/18126/15055
+f 15825/18126/15055 24532/17742/14676 30824/17733/14667 25758/18123/15052
+f 15820/18124/15053 15821/18127/15056 15826/18128/15057 15822/18129/15058
+f 15822/18129/15058 15826/18128/15057 24604/18130/15059 24605/18131/15060
+f 15821/18127/15056 25757/18119/15049 25756/18118/15048 15826/18128/15057
+f 15826/18128/15057 25756/18118/15048 30848/18121/170 24604/18130/15059
+f 15820/18124/15053 15822/18129/15058 15827/18132/15061 15823/18133/15062
+f 15823/18133/15062 15827/18132/15061 25759/18134/15063 25760/18135/15064
+f 15822/18129/15058 24605/18131/15060 24606/18136/15065 15827/18132/15061
+f 15827/18132/15061 24606/18136/15065 30849/18137/15066 25759/18134/15063
+f 15820/18124/15053 15823/18133/15062 15828/18138/15067 15824/18125/15054
+f 15824/18125/15054 15828/18138/15067 24534/17748/14682 24533/17743/14677
+f 15823/18133/15062 25760/18135/15064 25761/18139/15068 15828/18138/15067
+f 15828/18138/15067 25761/18139/15068 30825/17749/14683 24534/17748/14682
+f 15829/18140/15069 15833/18141/15070 15834/18142/15071 15830/18143/15072
+f 15830/18143/15072 15834/18142/15071 25761/18139/15068 25760/18135/15064
+f 15833/18141/15070 24536/17759/14693 24535/17758/14692 15834/18142/15071
+f 15834/18142/15071 24535/17758/14692 30825/17749/14683 25761/18139/15068
+f 15829/18140/15069 15830/18143/15072 15835/18144/15073 15831/18145/15074
+f 15831/18145/15074 15835/18144/15073 24607/18146/15075 24608/18147/15076
+f 15830/18143/15072 25760/18135/15064 25759/18134/15063 15835/18144/15073
+f 15835/18144/15073 25759/18134/15063 30849/18137/15066 24607/18146/15075
+f 15829/18140/15069 15831/18145/15074 15836/18148/15077 15832/18149/15078
+f 15832/18149/15078 15836/18148/15077 25762/18150/15079 25763/18151/15080
+f 15831/18145/15074 24608/18147/15076 24609/18152/15081 15836/18148/15077
+f 15836/18148/15077 24609/18152/15081 30850/18153/15082 25762/18150/15079
+f 15829/18140/15069 15832/18149/15078 15837/18154/15083 15833/18141/15070
+f 15833/18141/15070 15837/18154/15083 24537/17764/14698 24536/17759/14693
+f 15832/18149/15078 25763/18151/15080 25764/18155/15084 15837/18154/15083
+f 15837/18154/15083 25764/18155/15084 30826/17765/14699 24537/17764/14698
+f 15838/18156/15085 15842/18157/15086 15843/18158/15087 15839/18159/15088
+f 15839/18159/15088 15843/18158/15087 25764/18155/15084 25763/18151/15080
+f 15842/18157/15086 24539/17775/14709 24538/17774/14708 15843/18158/15087
+f 15843/18158/15087 24538/17774/14708 30826/17765/14699 25764/18155/15084
+f 15838/18156/15085 15839/18159/15088 15844/18160/15089 15840/18161/15090
+f 15840/18161/15090 15844/18160/15089 24610/18162/15091 24611/18163/15092
+f 15839/18159/15088 25763/18151/15080 25762/18150/15079 15844/18160/15089
+f 15844/18160/15089 25762/18150/15079 30850/18153/15082 24610/18162/15091
+f 15838/18156/15085 15840/18161/15090 15845/18164/15093 15841/18165/15094
+f 15841/18165/15094 15845/18164/15093 25765/18166/15095 25766/18167/15096
+f 15840/18161/15090 24611/18163/15092 24612/18168/15097 15845/18164/15093
+f 15845/18164/15093 24612/18168/15097 30851/18169/15098 25765/18166/15095
+f 15838/18156/15085 15841/18165/15094 15846/18170/15099 15842/18157/15086
+f 15842/18157/15086 15846/18170/15099 24540/17780/14714 24539/17775/14709
+f 15841/18165/15094 25766/18167/15096 25767/18171/15100 15846/18170/15099
+f 15846/18170/15099 25767/18171/15100 30827/17781/14715 24540/17780/14714
+f 15847/18172/15101 15851/18173/15102 15852/18174/15103 15848/18175/15104
+f 15848/18175/15104 15852/18174/15103 25767/18171/15100 25766/18167/15096
+f 15851/18173/15102 24542/17791/14725 24541/17790/14724 15852/18174/15103
+f 15852/18174/15103 24541/17790/14724 30827/17781/14715 25767/18171/15100
+f 15847/18172/15101 15848/18175/15104 15853/18176/15105 15849/18177/15106
+f 15849/18177/15106 15853/18176/15105 24613/18178/15107 24614/18179/15108
+f 15848/18175/15104 25766/18167/15096 25765/18166/15095 15853/18176/15105
+f 15853/18176/15105 25765/18166/15095 30851/18169/15098 24613/18178/15107
+f 15847/18172/15101 15849/18177/15106 15854/18180/15109 15850/18181/15110
+f 15850/18181/15110 15854/18180/15109 25768/18182/15111 25769/18183/15112
+f 15849/18177/15106 24614/18179/15108 24615/18184/15113 15854/18180/15109
+f 15854/18180/15109 24615/18184/15113 30852/18185/15114 25768/18182/15111
+f 15847/18172/15101 15850/18181/15110 15855/18186/15115 15851/18173/15102
+f 15851/18173/15102 15855/18186/15115 24543/17796/14730 24542/17791/14725
+f 15850/18181/15110 25769/18183/15112 25770/18187/15116 15855/18186/15115
+f 15855/18186/15115 25770/18187/15116 30828/17797/14731 24543/17796/14730
+f 15856/18188/15117 15860/18189/15118 15861/18190/15119 15857/18191/15120
+f 15857/18191/15120 15861/18190/15119 25770/18187/15116 25769/18183/15112
+f 15860/18189/15118 24545/17807/14741 24544/17806/14740 15861/18190/15119
+f 15861/18190/15119 24544/17806/14740 30828/17797/14731 25770/18187/15116
+f 15856/18188/15117 15857/18191/15120 15862/18192/15121 15858/18193/15122
+f 15858/18193/15122 15862/18192/15121 24616/18194/15123 24617/18195/15124
+f 15857/18191/15120 25769/18183/15112 25768/18182/15111 15862/18192/15121
+f 15862/18192/15121 25768/18182/15111 30852/18185/15114 24616/18194/15123
+f 15856/18188/15117 15858/18193/15122 15863/18196/15125 15859/18197/15126
+f 15859/18197/15126 15863/18196/15125 25771/18198/15127 25772/18199/15128
+f 15858/18193/15122 24617/18195/15124 24618/18200/15129 15863/18196/15125
+f 15863/18196/15125 24618/18200/15129 30853/18201/15130 25771/18198/15127
+f 15856/18188/15117 15859/18197/15126 15864/18202/15131 15860/18189/15118
+f 15860/18189/15118 15864/18202/15131 24546/17812/14746 24545/17807/14741
+f 15859/18197/15126 25772/18199/15128 25773/18203/15132 15864/18202/15131
+f 15864/18202/15131 25773/18203/15132 30829/17813/14747 24546/17812/14746
+f 15865/18204/15133 15869/18205/15134 15870/18206/15135 15866/18207/15136
+f 15866/18207/15136 15870/18206/15135 25773/18203/15132 25772/18199/15128
+f 15869/18205/15134 24548/17823/14757 24547/17822/14756 15870/18206/15135
+f 15870/18206/15135 24547/17822/14756 30829/17813/14747 25773/18203/15132
+f 15865/18204/15133 15866/18207/15136 15871/18208/15137 15867/18209/15138
+f 15867/18209/15138 15871/18208/15137 24619/18210/15139 24620/18211/15140
+f 15866/18207/15136 25772/18199/15128 25771/18198/15127 15871/18208/15137
+f 15871/18208/15137 25771/18198/15127 30853/18201/15130 24619/18210/15139
+f 15865/18204/15133 15867/18209/15138 15872/18212/15141 15868/18213/15142
+f 15868/18213/15142 15872/18212/15141 25774/18214/15143 25775/18215/15144
+f 15867/18209/15138 24620/18211/15140 24621/18216/15145 15872/18212/15141
+f 15872/18212/15141 24621/18216/15145 30854/18217/15146 25774/18214/15143
+f 15865/18204/15133 15868/18213/15142 15873/18218/15147 15869/18205/15134
+f 15869/18205/15134 15873/18218/15147 24549/17828/14762 24548/17823/14757
+f 15868/18213/15142 25775/18215/15144 25776/18219/15148 15873/18218/15147
+f 15873/18218/15147 25776/18219/15148 30830/17829/14763 24549/17828/14762
+f 15874/18220/15149 15878/18221/15150 15879/18222/15151 15875/18223/15152
+f 15875/18223/15152 15879/18222/15151 25776/18224/15148 25775/18225/15144
+f 15878/18221/15150 24551/17841/14773 24550/17840/14772 15879/18222/15151
+f 15879/18222/15151 24550/17840/14772 30830/17843/14763 25776/18224/15148
+f 15874/18220/15149 15875/18223/15152 15880/18226/15153 15876/18227/15154
+f 15876/18227/15154 15880/18226/15153 24622/18228/15155 24623/18229/15156
+f 15875/18223/15152 25775/18225/15144 25774/18230/15143 15880/18226/15153
+f 15880/18226/15153 25774/18230/15143 30854/18231/15146 24622/18228/15155
+f 15874/18220/15149 15876/18227/15154 15881/18232/15157 15877/18233/15158
+f 15877/18233/15158 15881/18232/15157 25777/18234/15159 25778/18235/15160
+f 15876/18227/15154 24623/18229/15156 24624/18236/15161 15881/18232/15157
+f 15881/18232/15157 24624/18236/15161 30855/18237/15162 25777/18234/15159
+f 15874/18220/15149 15877/18233/15158 15882/18238/15163 15878/18221/15150
+f 15878/18221/15150 15882/18238/15163 24552/17848/14778 24551/17841/14773
+f 15877/18233/15158 25778/18235/15160 25779/18239/15164 15882/18238/15163
+f 15882/18238/15163 25779/18239/15164 30831/17849/14779 24552/17848/14778
+f 15883/18240/15165 15887/18241/15166 15888/18242/15167 15884/18243/15168
+f 15884/18243/15168 15888/18242/15167 25779/18239/15164 25778/18235/15160
+f 15887/18241/15166 24554/17859/14789 24553/17858/14788 15888/18242/15167
+f 15888/18242/15167 24553/17858/14788 30831/17849/14779 25779/18239/15164
+f 15883/18240/15165 15884/18243/15168 15889/18244/15169 15885/18245/15170
+f 15885/18245/15170 15889/18244/15169 24625/18246/15171 24626/18247/15172
+f 15884/18243/15168 25778/18235/15160 25777/18234/15159 15889/18244/15169
+f 15889/18244/15169 25777/18234/15159 30855/18237/15162 24625/18246/15171
+f 15883/18240/15165 15885/18245/15170 15890/18248/15173 15886/18249/15174
+f 15886/18249/15174 15890/18248/15173 25780/18250/15175 25781/18251/15176
+f 15885/18245/15170 24626/18247/15172 24627/18252/15177 15890/18248/15173
+f 15890/18248/15173 24627/18252/15177 30856/18253/15178 25780/18250/15175
+f 15883/18240/15165 15886/18249/15174 15891/18254/15179 15887/18241/15166
+f 15887/18241/15166 15891/18254/15179 24555/17864/14794 24554/17859/14789
+f 15886/18249/15174 25781/18251/15176 25782/18255/15180 15891/18254/15179
+f 15891/18254/15179 25782/18255/15180 30832/17865/14795 24555/17864/14794
+f 15892/18256/15181 15896/18257/15182 15897/18258/15183 15893/18259/15184
+f 15893/18259/15184 15897/18258/15183 25782/18255/15180 25781/18251/15176
+f 15896/18257/15182 24557/17875/14805 24556/17874/14804 15897/18258/15183
+f 15897/18258/15183 24556/17874/14804 30832/17865/14795 25782/18255/15180
+f 15892/18256/15181 15893/18259/15184 15898/18260/15185 15894/18261/15186
+f 15894/18261/15186 15898/18260/15185 24628/18262/15187 24629/18263/15188
+f 15893/18259/15184 25781/18251/15176 25780/18250/15175 15898/18260/15185
+f 15898/18260/15185 25780/18250/15175 30856/18253/15178 24628/18262/15187
+f 15892/18256/15181 15894/18261/15186 15899/18264/15189 15895/18265/15190
+f 15895/18265/15190 15899/18264/15189 25783/18266/15191 25784/18267/15192
+f 15894/18261/15186 24629/18263/15188 24630/18268/15193 15899/18264/15189
+f 15899/18264/15189 24630/18268/15193 30857/18269/15194 25783/18266/15191
+f 15892/18256/15181 15895/18265/15190 15900/18270/15195 15896/18257/15182
+f 15896/18257/15182 15900/18270/15195 24558/17880/14810 24557/17875/14805
+f 15895/18265/15190 25784/18267/15192 25785/18271/15196 15900/18270/15195
+f 15900/18270/15195 25785/18271/15196 30833/17881/14811 24558/17880/14810
+f 15901/18272/15197 15905/18273/15198 15906/18274/15199 15902/18275/15200
+f 15902/18275/15200 15906/18274/15199 25785/18271/15196 25784/18267/15192
+f 15905/18273/15198 24560/17891/14821 24559/17890/14820 15906/18274/15199
+f 15906/18274/15199 24559/17890/14820 30833/17881/14811 25785/18271/15196
+f 15901/18272/15197 15902/18275/15200 15907/18276/15201 15903/18277/15202
+f 15903/18277/15202 15907/18276/15201 24631/18278/15203 24632/18279/15204
+f 15902/18275/15200 25784/18267/15192 25783/18266/15191 15907/18276/15201
+f 15907/18276/15201 25783/18266/15191 30857/18269/15194 24631/18278/15203
+f 15901/18272/15197 15903/18277/15202 15908/18280/15205 15904/18281/15206
+f 15904/18281/15206 15908/18280/15205 25786/18282/15207 25787/18283/15208
+f 15903/18277/15202 24632/18279/15204 24633/18284/15209 15908/18280/15205
+f 15908/18280/15205 24633/18284/15209 30858/18285/15210 25786/18282/15207
+f 15901/18272/15197 15904/18281/15206 15909/18286/15211 15905/18273/15198
+f 15905/18273/15198 15909/18286/15211 24561/17896/14826 24560/17891/14821
+f 15904/18281/15206 25787/18283/15208 25788/18287/15212 15909/18286/15211
+f 15909/18286/15211 25788/18287/15212 30834/17897/14827 24561/17896/14826
+f 15910/18288/15213 15914/18289/15214 15915/18290/15215 15911/18291/15216
+f 15911/18291/15216 15915/18290/15215 25788/18287/15212 25787/18283/15208
+f 15914/18289/15214 24563/17907/14837 24562/17906/14836 15915/18290/15215
+f 15915/18290/15215 24562/17906/14836 30834/17897/14827 25788/18287/15212
+f 15910/18288/15213 15911/18291/15216 15916/18292/15217 15912/18293/15218
+f 15912/18293/15218 15916/18292/15217 24634/18294/15219 24635/18295/15220
+f 15911/18291/15216 25787/18283/15208 25786/18282/15207 15916/18292/15217
+f 15916/18292/15217 25786/18282/15207 30858/18285/15210 24634/18294/15219
+f 15910/18288/15213 15912/18293/15218 15917/18296/15221 15913/18297/15222
+f 15913/18297/15222 15917/18296/15221 25789/18298/15223 25790/18299/15224
+f 15912/18293/15218 24635/18295/15220 24636/18300/15225 15917/18296/15221
+f 15917/18296/15221 24636/18300/15225 30859/18301/15226 25789/18298/15223
+f 15910/18288/15213 15913/18297/15222 15918/18302/15227 15914/18289/15214
+f 15914/18289/15214 15918/18302/15227 24564/17912/14842 24563/17907/14837
+f 15913/18297/15222 25790/18299/15224 25791/18303/15228 15918/18302/15227
+f 15918/18302/15227 25791/18303/15228 30835/17913/14843 24564/17912/14842
+f 15919/18304/15229 15923/18305/15230 15924/18306/15231 15920/18307/15232
+f 15920/18307/15232 15924/18306/15231 25791/18303/15228 25790/18299/15224
+f 15923/18305/15230 24566/17923/14853 24565/17922/14852 15924/18306/15231
+f 15924/18306/15231 24565/17922/14852 30835/17913/14843 25791/18303/15228
+f 15919/18304/15229 15920/18307/15232 15925/18308/15233 15921/18309/15234
+f 15921/18309/15234 15925/18308/15233 24637/18310/15235 24638/18311/15236
+f 15920/18307/15232 25790/18299/15224 25789/18298/15223 15925/18308/15233
+f 15925/18308/15233 25789/18298/15223 30859/18301/15226 24637/18310/15235
+f 15919/18304/15229 15921/18309/15234 15926/18312/15237 15922/18313/15238
+f 15922/18313/15238 15926/18312/15237 25792/18314/15239 25793/18315/15240
+f 15921/18309/15234 24638/18311/15236 24639/18316/15241 15926/18312/15237
+f 15926/18312/15237 24639/18316/15241 30860/18317/1136 25792/18314/15239
+f 15919/18304/15229 15922/18313/15238 15927/18318/15242 15923/18305/15230
+f 15923/18305/15230 15927/18318/15242 24567/17928/14858 24566/17923/14853
+f 15922/18313/15238 25793/18315/15240 25794/18319/15243 15927/18318/15242
+f 15927/18318/15242 25794/18319/15243 30836/17929/14859 24567/17928/14858
+f 15928/18320/15244 15932/18321/15245 15933/18322/15246 15929/18323/15247
+f 15929/18323/15247 15933/18322/15246 25794/18319/15243 25793/18315/15240
+f 15932/18321/15245 24569/17939/14869 24568/17938/14868 15933/18322/15246
+f 15933/18322/15246 24568/17938/14868 30836/17929/14859 25794/18319/15243
+f 15928/18320/15244 15929/18323/15247 15934/18324/15248 15930/18325/15249
+f 15930/18325/15249 15934/18324/15248 24640/18326/15250 24641/18327/15251
+f 15929/18323/15247 25793/18315/15240 25792/18314/15239 15934/18324/15248
+f 15934/18324/15248 25792/18314/15239 30860/18317/1136 24640/18326/15250
+f 15928/18320/15244 15930/18325/15249 15935/18328/15252 15931/18329/15253
+f 15931/18329/15253 15935/18328/15252 25725/17954/14884 25724/17949/14879
+f 15930/18325/15249 24641/18327/15251 24642/18330/15254 15935/18328/15252
+f 15935/18328/15252 24642/18330/15254 30837/17955/14885 25725/17954/14884
+f 15928/18320/15244 15931/18329/15253 15936/18331/15255 15932/18321/15245
+f 15932/18321/15245 15936/18331/15255 24570/17942/14872 24569/17939/14869
+f 15931/18329/15253 25724/17949/14879 25723/17948/14878 15936/18331/15255
+f 15936/18331/15255 25723/17948/14878 30813/17567/14501 24570/17942/14872
+f 15937/18332/15256 15941/18333/15257 15942/18334/15258 15938/18335/15259
+f 15938/18335/15259 15942/18334/15258 25795/18336/15260 25796/18337/15261
+f 15941/18333/15257 24572/17953/14883 24571/17952/14882 15942/18334/15258
+f 15942/18334/15258 24571/17952/14882 30837/17955/14885 25795/18336/15260
+f 15937/18332/15256 15938/18335/15259 15943/18338/15262 15939/18339/15263
+f 15939/18339/15263 15943/18338/15262 24643/18340/15264 24644/18341/15265
+f 15938/18335/15259 25796/18337/15261 25797/18342/15266 15943/18338/15262
+f 15943/18338/15262 25797/18342/15266 30861/18343/15267 24643/18340/15264
+f 15937/18332/15256 15939/18339/15263 15944/18344/15268 15940/18345/15269
+f 15940/18345/15269 15944/18344/15268 25798/18346/15270 25799/18347/15271
+f 15939/18339/15263 24644/18341/15265 24645/18348/15272 15944/18344/15268
+f 15944/18344/15268 24645/18348/15272 30862/18349/15273 25798/18346/15270
+f 15937/18332/15256 15940/18345/15269 15945/18350/15274 15941/18333/15257
+f 15941/18333/15257 15945/18350/15274 24573/17960/14890 24572/17953/14883
+f 15940/18345/15269 25799/18347/15271 25800/18351/15275 15945/18350/15274
+f 15945/18350/15274 25800/18351/15275 30838/17961/14891 24573/17960/14890
+f 15946/18352/15276 15950/18353/15277 15951/18354/15278 15947/18355/15279
+f 15947/18355/15279 15951/18354/15278 25800/18351/15275 25799/18347/15271
+f 15950/18353/15277 24575/17971/14901 24574/17970/14900 15951/18354/15278
+f 15951/18354/15278 24574/17970/14900 30838/17961/14891 25800/18351/15275
+f 15946/18352/15276 15947/18355/15279 15952/18356/15280 15948/18357/15281
+f 15948/18357/15281 15952/18356/15280 24646/18358/15282 24647/18359/15283
+f 15947/18355/15279 25799/18347/15271 25798/18346/15270 15952/18356/15280
+f 15952/18356/15280 25798/18346/15270 30862/18349/15273 24646/18358/15282
+f 15946/18352/15276 15948/18357/15281 15953/18360/15284 15949/18361/15285
+f 15949/18361/15285 15953/18360/15284 25801/18362/15286 25802/18363/15287
+f 15948/18357/15281 24647/18359/15283 24648/18364/15288 15953/18360/15284
+f 15953/18360/15284 24648/18364/15288 30863/18365/15289 25801/18362/15286
+f 15946/18352/15276 15949/18361/15285 15954/18366/15290 15950/18353/15277
+f 15950/18353/15277 15954/18366/15290 24576/17976/14906 24575/17971/14901
+f 15949/18361/15285 25802/18363/15287 25803/18367/15291 15954/18366/15290
+f 15954/18366/15290 25803/18367/15291 30839/17977/14907 24576/17976/14906
+f 15955/18368/15292 15959/18369/15293 15960/18370/15294 15956/18371/15295
+f 15956/18371/15295 15960/18370/15294 25803/18367/15291 25802/18363/15287
+f 15959/18369/15293 24578/17987/14917 24577/17986/14916 15960/18370/15294
+f 15960/18370/15294 24577/17986/14916 30839/17977/14907 25803/18367/15291
+f 15955/18368/15292 15956/18371/15295 15961/18372/15296 15957/18373/15297
+f 15957/18373/15297 15961/18372/15296 24649/18374/15298 24650/18375/15299
+f 15956/18371/15295 25802/18363/15287 25801/18362/15286 15961/18372/15296
+f 15961/18372/15296 25801/18362/15286 30863/18365/15289 24649/18374/15298
+f 15955/18368/15292 15957/18373/15297 15962/18376/15300 15958/18377/15301
+f 15958/18377/15301 15962/18376/15300 25804/18378/15302 25805/18379/15303
+f 15957/18373/15297 24650/18375/15299 24651/18380/15304 15962/18376/15300
+f 15962/18376/15300 24651/18380/15304 30864/18381/15305 25804/18378/15302
+f 15955/18368/15292 15958/18377/15301 15963/18382/15306 15959/18369/15293
+f 15959/18369/15293 15963/18382/15306 24579/17992/14922 24578/17987/14917
+f 15958/18377/15301 25805/18379/15303 25806/18383/15307 15963/18382/15306
+f 15963/18382/15306 25806/18383/15307 30840/17993/14923 24579/17992/14922
+f 15964/18384/15308 15968/18385/15309 15969/18386/15310 15965/18387/15311
+f 15965/18387/15311 15969/18386/15310 25806/18383/15307 25805/18379/15303
+f 15968/18385/15309 24581/18003/14933 24580/18002/14932 15969/18386/15310
+f 15969/18386/15310 24580/18002/14932 30840/17993/14923 25806/18383/15307
+f 15964/18384/15308 15965/18387/15311 15970/18388/15312 15966/18389/15313
+f 15966/18389/15313 15970/18388/15312 24652/18390/15314 24653/18391/15315
+f 15965/18387/15311 25805/18379/15303 25804/18378/15302 15970/18388/15312
+f 15970/18388/15312 25804/18378/15302 30864/18381/15305 24652/18390/15314
+f 15964/18384/15308 15966/18389/15313 15971/18392/15316 15967/18393/15317
+f 15967/18393/15317 15971/18392/15316 25807/18394/15318 25808/18395/15319
+f 15966/18389/15313 24653/18391/15315 24654/18396/15320 15971/18392/15316
+f 15971/18392/15316 24654/18396/15320 30865/18397/15321 25807/18394/15318
+f 15964/18384/15308 15967/18393/15317 15972/18398/15322 15968/18385/15309
+f 15968/18385/15309 15972/18398/15322 24582/18008/14938 24581/18003/14933
+f 15967/18393/15317 25808/18395/15319 25809/18399/15323 15972/18398/15322
+f 15972/18398/15322 25809/18399/15323 30841/18009/14939 24582/18008/14938
+f 15973/18400/15324 15977/18401/15325 15978/18402/15326 15974/18403/15327
+f 15974/18403/15327 15978/18402/15326 25809/18399/15323 25808/18395/15319
+f 15977/18401/15325 24584/18019/14949 24583/18018/14948 15978/18402/15326
+f 15978/18402/15326 24583/18018/14948 30841/18009/14939 25809/18399/15323
+f 15973/18400/15324 15974/18403/15327 15979/18404/15328 15975/18405/15329
+f 15975/18405/15329 15979/18404/15328 24655/18406/15330 24656/18407/15331
+f 15974/18403/15327 25808/18395/15319 25807/18394/15318 15979/18404/15328
+f 15979/18404/15328 25807/18394/15318 30865/18397/15321 24655/18406/15330
+f 15973/18400/15324 15975/18405/15329 15980/18408/15332 15976/18409/15333
+f 15976/18409/15333 15980/18408/15332 25810/18410/15334 25811/18411/15335
+f 15975/18405/15329 24656/18407/15331 24657/18412/15336 15980/18408/15332
+f 15980/18408/15332 24657/18412/15336 30866/18413/15337 25810/18410/15334
+f 15973/18400/15324 15976/18409/15333 15981/18414/15338 15977/18401/15325
+f 15977/18401/15325 15981/18414/15338 24585/18024/14954 24584/18019/14949
+f 15976/18409/15333 25811/18411/15335 25812/18415/15339 15981/18414/15338
+f 15981/18414/15338 25812/18415/15339 30842/18025/14955 24585/18024/14954
+f 15982/18416/15340 15986/18417/15341 15987/18418/15342 15983/18419/15343
+f 15983/18419/15343 15987/18418/15342 25812/18415/15339 25811/18411/15335
+f 15986/18417/15341 24587/18035/14965 24586/18034/14964 15987/18418/15342
+f 15987/18418/15342 24586/18034/14964 30842/18025/14955 25812/18415/15339
+f 15982/18416/15340 15983/18419/15343 15988/18420/15344 15984/18421/15345
+f 15984/18421/15345 15988/18420/15344 24658/18422/15346 24659/18423/15347
+f 15983/18419/15343 25811/18411/15335 25810/18410/15334 15988/18420/15344
+f 15988/18420/15344 25810/18410/15334 30866/18413/15337 24658/18422/15346
+f 15982/18416/15340 15984/18421/15345 15989/18424/15348 15985/18425/15349
+f 15985/18425/15349 15989/18424/15348 25813/18426/15350 25814/18427/15351
+f 15984/18421/15345 24659/18423/15347 24660/18428/15352 15989/18424/15348
+f 15989/18424/15348 24660/18428/15352 30867/18429/15353 25813/18426/15350
+f 15982/18416/15340 15985/18425/15349 15990/18430/15354 15986/18417/15341
+f 15986/18417/15341 15990/18430/15354 24588/18040/14970 24587/18035/14965
+f 15985/18425/15349 25814/18427/15351 25815/18431/15355 15990/18430/15354
+f 15990/18430/15354 25815/18431/15355 30843/18041/14971 24588/18040/14970
+f 15991/18432/15356 15995/18433/15357 15996/18434/15358 15992/18435/15359
+f 15992/18435/15359 15996/18434/15358 25815/18431/15355 25814/18427/15351
+f 15995/18433/15357 24590/18051/14981 24589/18050/14980 15996/18434/15358
+f 15996/18434/15358 24589/18050/14980 30843/18041/14971 25815/18431/15355
+f 15991/18432/15356 15992/18435/15359 15997/18436/15360 15993/18437/15361
+f 15993/18437/15361 15997/18436/15360 24661/18438/15362 24662/18439/15363
+f 15992/18435/15359 25814/18427/15351 25813/18426/15350 15997/18436/15360
+f 15997/18436/15360 25813/18426/15350 30867/18429/15353 24661/18438/15362
+f 15991/18432/15356 15993/18437/15361 15998/18440/15364 15994/18441/15365
+f 15994/18441/15365 15998/18440/15364 25816/18442/15366 25817/18443/15367
+f 15993/18437/15361 24662/18439/15363 24663/18444/15368 15998/18440/15364
+f 15998/18440/15364 24663/18444/15368 30868/18445/15369 25816/18442/15366
+f 15991/18432/15356 15994/18441/15365 15999/18446/15370 15995/18433/15357
+f 15995/18433/15357 15999/18446/15370 24591/18056/14986 24590/18051/14981
+f 15994/18441/15365 25817/18443/15367 25818/18447/15371 15999/18446/15370
+f 15999/18446/15370 25818/18447/15371 30844/18057/14987 24591/18056/14986
+f 16000/18448/15372 16004/18449/15373 16005/18450/15374 16001/18451/15375
+f 16001/18451/15375 16005/18450/15374 25818/18447/15371 25817/18443/15367
+f 16004/18449/15373 24593/18067/14997 24592/18066/14996 16005/18450/15374
+f 16005/18450/15374 24592/18066/14996 30844/18057/14987 25818/18447/15371
+f 16000/18448/15372 16001/18451/15375 16006/18452/15376 16002/18453/15377
+f 16002/18453/15377 16006/18452/15376 24664/18454/15378 24665/18455/15379
+f 16001/18451/15375 25817/18443/15367 25816/18442/15366 16006/18452/15376
+f 16006/18452/15376 25816/18442/15366 30868/18445/15369 24664/18454/15378
+f 16000/18448/15372 16002/18453/15377 16007/18456/15380 16003/18457/15381
+f 16003/18457/15381 16007/18456/15380 25819/18458/15382 25820/18459/15383
+f 16002/18453/15377 24665/18455/15379 24666/18460/15384 16007/18456/15380
+f 16007/18456/15380 24666/18460/15384 30869/18461/15385 25819/18458/15382
+f 16000/18448/15372 16003/18457/15381 16008/18462/15386 16004/18449/15373
+f 16004/18449/15373 16008/18462/15386 24594/18072/15002 24593/18067/14997
+f 16003/18457/15381 25820/18459/15383 25821/18463/15387 16008/18462/15386
+f 16008/18462/15386 25821/18463/15387 30845/18073/15003 24594/18072/15002
+f 16009/18464/15388 16013/18465/15389 16014/18466/15390 16010/18467/15391
+f 16010/18467/15391 16014/18466/15390 25821/18463/15387 25820/18459/15383
+f 16013/18465/15389 24596/18083/15013 24595/18082/15012 16014/18466/15390
+f 16014/18466/15390 24595/18082/15012 30845/18073/15003 25821/18463/15387
+f 16009/18464/15388 16010/18467/15391 16015/18468/15392 16011/18469/15393
+f 16011/18469/15393 16015/18468/15392 24667/18470/15394 24668/18471/15395
+f 16010/18467/15391 25820/18459/15383 25819/18458/15382 16015/18468/15392
+f 16015/18468/15392 25819/18458/15382 30869/18461/15385 24667/18470/15394
+f 16009/18464/15388 16011/18469/15393 16016/18472/15396 16012/18473/15397
+f 16012/18473/15397 16016/18472/15396 25822/18474/15398 25823/18475/15399
+f 16011/18469/15393 24668/18471/15395 24669/18476/15400 16016/18472/15396
+f 16016/18472/15396 24669/18476/15400 30870/18477/15401 25822/18474/15398
+f 16009/18464/15388 16012/18473/15397 16017/18478/15402 16013/18465/15389
+f 16013/18465/15389 16017/18478/15402 24597/18088/15018 24596/18083/15013
+f 16012/18473/15397 25823/18475/15399 25824/18479/15403 16017/18478/15402
+f 16017/18478/15402 25824/18479/15403 30846/18089/15019 24597/18088/15018
+f 16018/18480/15404 16022/18481/15405 16023/18482/15406 16019/18483/15407
+f 16019/18483/15407 16023/18482/15406 25824/18479/15403 25823/18475/15399
+f 16022/18481/15405 24599/18099/15029 24598/18098/15028 16023/18482/15406
+f 16023/18482/15406 24598/18098/15028 30846/18089/15019 25824/18479/15403
+f 16018/18480/15404 16019/18483/15407 16024/18484/15408 16020/18485/15409
+f 16020/18485/15409 16024/18484/15408 24670/18486/15410 24671/18487/15411
+f 16019/18483/15407 25823/18475/15399 25822/18474/15398 16024/18484/15408
+f 16024/18484/15408 25822/18474/15398 30870/18477/15401 24670/18486/15410
+f 16018/18480/15404 16020/18485/15409 16025/18488/15412 16021/18489/15413
+f 16021/18489/15413 16025/18488/15412 25825/18490/15414 25826/18491/15415
+f 16020/18485/15409 24671/18487/15411 24672/18492/15416 16025/18488/15412
+f 16025/18488/15412 24672/18492/15416 30871/18493/15417 25825/18490/15414
+f 16018/18480/15404 16021/18489/15413 16026/18494/15418 16022/18481/15405
+f 16022/18481/15405 16026/18494/15418 24600/18104/15034 24599/18099/15029
+f 16021/18489/15413 25826/18491/15415 25827/18495/15419 16026/18494/15418
+f 16026/18494/15418 25827/18495/15419 30847/18105/15035 24600/18104/15034
+f 16027/18496/15420 16031/18497/15421 16032/18498/15422 16028/18499/15423
+f 16028/18499/15423 16032/18498/15422 25827/18495/15419 25826/18491/15415
+f 16031/18497/15421 24602/18115/15045 24601/18114/15044 16032/18498/15422
+f 16032/18498/15422 24601/18114/15044 30847/18105/15035 25827/18495/15419
+f 16027/18496/15420 16028/18499/15423 16033/18500/15424 16029/18501/15425
+f 16029/18501/15425 16033/18500/15424 24673/18502/15426 24674/18503/15427
+f 16028/18499/15423 25826/18491/15415 25825/18490/15414 16033/18500/15424
+f 16033/18500/15424 25825/18490/15414 30871/18493/15417 24673/18502/15426
+f 16027/18496/15420 16029/18501/15425 16034/18504/15428 16030/18505/15429
+f 16030/18505/15429 16034/18504/15428 25828/18506/15430 25829/18507/15431
+f 16029/18501/15425 24674/18503/15427 24675/18508/15432 16034/18504/15428
+f 16034/18504/15428 24675/18508/15432 30872/18509/15433 25828/18506/15430
+f 16027/18496/15420 16030/18505/15429 16035/18510/15434 16031/18497/15421
+f 16031/18497/15421 16035/18510/15434 24603/18120/15050 24602/18115/15045
+f 16030/18505/15429 25829/18507/15431 25830/18511/15435 16035/18510/15434
+f 16035/18510/15434 25830/18511/15435 30848/18121/170 24603/18120/15050
+f 16036/18512/15436 16040/18513/15437 16041/18514/15438 16037/18515/15439
+f 16037/18515/15439 16041/18514/15438 25830/18511/15435 25829/18507/15431
+f 16040/18513/15437 24605/18131/15060 24604/18130/15059 16041/18514/15438
+f 16041/18514/15438 24604/18130/15059 30848/18121/170 25830/18511/15435
+f 16036/18512/15436 16037/18515/15439 16042/18516/15440 16038/18517/15441
+f 16038/18517/15441 16042/18516/15440 24676/18518/15442 24677/18519/15443
+f 16037/18515/15439 25829/18507/15431 25828/18506/15430 16042/18516/15440
+f 16042/18516/15440 25828/18506/15430 30872/18509/15433 24676/18518/15442
+f 16036/18512/15436 16038/18517/15441 16043/18520/15444 16039/18521/15445
+f 16039/18521/15445 16043/18520/15444 25831/18522/15446 25832/18523/15447
+f 16038/18517/15441 24677/18519/15443 24678/18524/15448 16043/18520/15444
+f 16043/18520/15444 24678/18524/15448 30873/18525/15449 25831/18522/15446
+f 16036/18512/15436 16039/18521/15445 16044/18526/15450 16040/18513/15437
+f 16040/18513/15437 16044/18526/15450 24606/18136/15065 24605/18131/15060
+f 16039/18521/15445 25832/18523/15447 25833/18527/15451 16044/18526/15450
+f 16044/18526/15450 25833/18527/15451 30849/18137/15066 24606/18136/15065
+f 16045/18528/15452 16049/18529/15453 16050/18530/15454 16046/18531/15455
+f 16046/18531/15455 16050/18530/15454 25833/18527/15451 25832/18523/15447
+f 16049/18529/15453 24608/18147/15076 24607/18146/15075 16050/18530/15454
+f 16050/18530/15454 24607/18146/15075 30849/18137/15066 25833/18527/15451
+f 16045/18528/15452 16046/18531/15455 16051/18532/15456 16047/18533/15457
+f 16047/18533/15457 16051/18532/15456 24679/18534/15458 24680/18535/15459
+f 16046/18531/15455 25832/18523/15447 25831/18522/15446 16051/18532/15456
+f 16051/18532/15456 25831/18522/15446 30873/18525/15449 24679/18534/15458
+f 16045/18528/15452 16047/18533/15457 16052/18536/15460 16048/18537/15461
+f 16048/18537/15461 16052/18536/15460 25834/18538/15462 25835/18539/15463
+f 16047/18533/15457 24680/18535/15459 24681/18540/15464 16052/18536/15460
+f 16052/18536/15460 24681/18540/15464 30874/18541/15465 25834/18538/15462
+f 16045/18528/15452 16048/18537/15461 16053/18542/15466 16049/18529/15453
+f 16049/18529/15453 16053/18542/15466 24609/18152/15081 24608/18147/15076
+f 16048/18537/15461 25835/18539/15463 25836/18543/15467 16053/18542/15466
+f 16053/18542/15466 25836/18543/15467 30850/18153/15082 24609/18152/15081
+f 16054/18544/15468 16058/18545/15469 16059/18546/15470 16055/18547/15471
+f 16055/18547/15471 16059/18546/15470 25836/18543/15467 25835/18539/15463
+f 16058/18545/15469 24611/18163/15092 24610/18162/15091 16059/18546/15470
+f 16059/18546/15470 24610/18162/15091 30850/18153/15082 25836/18543/15467
+f 16054/18544/15468 16055/18547/15471 16060/18548/15472 16056/18549/15473
+f 16056/18549/15473 16060/18548/15472 24682/18550/15474 24683/18551/15475
+f 16055/18547/15471 25835/18539/15463 25834/18538/15462 16060/18548/15472
+f 16060/18548/15472 25834/18538/15462 30874/18541/15465 24682/18550/15474
+f 16054/18544/15468 16056/18549/15473 16061/18552/15476 16057/18553/15477
+f 16057/18553/15477 16061/18552/15476 25837/18554/15478 25838/18555/15479
+f 16056/18549/15473 24683/18551/15475 24684/18556/15480 16061/18552/15476
+f 16061/18552/15476 24684/18556/15480 30875/18557/15481 25837/18554/15478
+f 16054/18544/15468 16057/18553/15477 16062/18558/15482 16058/18545/15469
+f 16058/18545/15469 16062/18558/15482 24612/18168/15097 24611/18163/15092
+f 16057/18553/15477 25838/18555/15479 25839/18559/15483 16062/18558/15482
+f 16062/18558/15482 25839/18559/15483 30851/18169/15098 24612/18168/15097
+f 16063/18560/15484 16067/18561/15485 16068/18562/15486 16064/18563/15487
+f 16064/18563/15487 16068/18562/15486 25839/18559/15483 25838/18555/15479
+f 16067/18561/15485 24614/18179/15108 24613/18178/15107 16068/18562/15486
+f 16068/18562/15486 24613/18178/15107 30851/18169/15098 25839/18559/15483
+f 16063/18560/15484 16064/18563/15487 16069/18564/15488 16065/18565/15489
+f 16065/18565/15489 16069/18564/15488 24685/18566/15490 24686/18567/15491
+f 16064/18563/15487 25838/18555/15479 25837/18554/15478 16069/18564/15488
+f 16069/18564/15488 25837/18554/15478 30875/18557/15481 24685/18566/15490
+f 16063/18560/15484 16065/18565/15489 16070/18568/15492 16066/18569/15493
+f 16066/18569/15493 16070/18568/15492 25840/18570/15494 25841/18571/15495
+f 16065/18565/15489 24686/18567/15491 24687/18572/15496 16070/18568/15492
+f 16070/18568/15492 24687/18572/15496 30876/18573/15497 25840/18570/15494
+f 16063/18560/15484 16066/18569/15493 16071/18574/15498 16067/18561/15485
+f 16067/18561/15485 16071/18574/15498 24615/18184/15113 24614/18179/15108
+f 16066/18569/15493 25841/18571/15495 25842/18575/15499 16071/18574/15498
+f 16071/18574/15498 25842/18575/15499 30852/18185/15114 24615/18184/15113
+f 16072/18576/15500 16076/18577/15501 16077/18578/15502 16073/18579/15503
+f 16073/18579/15503 16077/18578/15502 25842/18575/15499 25841/18571/15495
+f 16076/18577/15501 24617/18195/15124 24616/18194/15123 16077/18578/15502
+f 16077/18578/15502 24616/18194/15123 30852/18185/15114 25842/18575/15499
+f 16072/18576/15500 16073/18579/15503 16078/18580/15504 16074/18581/15505
+f 16074/18581/15505 16078/18580/15504 24688/18582/15506 24689/18583/15507
+f 16073/18579/15503 25841/18571/15495 25840/18570/15494 16078/18580/15504
+f 16078/18580/15504 25840/18570/15494 30876/18573/15497 24688/18582/15506
+f 16072/18576/15500 16074/18581/15505 16079/18584/15508 16075/18585/15509
+f 16075/18585/15509 16079/18584/15508 25843/18586/15510 25844/18587/15511
+f 16074/18581/15505 24689/18583/15507 24690/18588/15512 16079/18584/15508
+f 16079/18584/15508 24690/18588/15512 30877/18589/15513 25843/18586/15510
+f 16072/18576/15500 16075/18585/15509 16080/18590/15514 16076/18577/15501
+f 16076/18577/15501 16080/18590/15514 24618/18200/15129 24617/18195/15124
+f 16075/18585/15509 25844/18587/15511 25845/18591/15515 16080/18590/15514
+f 16080/18590/15514 25845/18591/15515 30853/18201/15130 24618/18200/15129
+f 16081/18592/15516 16085/18593/15517 16086/18594/15518 16082/18595/15519
+f 16082/18595/15519 16086/18594/15518 25845/18591/15515 25844/18587/15511
+f 16085/18593/15517 24620/18211/15140 24619/18210/15139 16086/18594/15518
+f 16086/18594/15518 24619/18210/15139 30853/18201/15130 25845/18591/15515
+f 16081/18592/15516 16082/18595/15519 16087/18596/15520 16083/18597/15521
+f 16083/18597/15521 16087/18596/15520 24691/18598/15522 24692/18599/15523
+f 16082/18595/15519 25844/18587/15511 25843/18586/15510 16087/18596/15520
+f 16087/18596/15520 25843/18586/15510 30877/18589/15513 24691/18598/15522
+f 16081/18592/15516 16083/18597/15521 16088/18600/15524 16084/18601/15525
+f 16084/18601/15525 16088/18600/15524 25846/18602/15526 25847/18603/15527
+f 16083/18597/15521 24692/18599/15523 24693/18604/15528 16088/18600/15524
+f 16088/18600/15524 24693/18604/15528 30878/18605/15529 25846/18602/15526
+f 16081/18592/15516 16084/18601/15525 16089/18606/15530 16085/18593/15517
+f 16085/18593/15517 16089/18606/15530 24621/18216/15145 24620/18211/15140
+f 16084/18601/15525 25847/18603/15527 25848/18607/15531 16089/18606/15530
+f 16089/18606/15530 25848/18607/15531 30854/18217/15146 24621/18216/15145
+f 16090/18608/15532 16094/18609/15533 16095/18610/15534 16091/18611/15535
+f 16091/18611/15535 16095/18610/15534 25848/18612/15531 25847/18613/15527
+f 16094/18609/15533 24623/18229/15156 24622/18228/15155 16095/18610/15534
+f 16095/18610/15534 24622/18228/15155 30854/18231/15146 25848/18612/15531
+f 16090/18608/15532 16091/18611/15535 16096/18614/15536 16092/18615/15537
+f 16092/18615/15537 16096/18614/15536 24694/18616/15538 24695/18617/15539
+f 16091/18611/15535 25847/18613/15527 25846/18618/15526 16096/18614/15536
+f 16096/18614/15536 25846/18618/15526 30878/18619/15529 24694/18616/15538
+f 16090/18608/15532 16092/18615/15537 16097/18620/15540 16093/18621/15541
+f 16093/18621/15541 16097/18620/15540 25849/18622/15542 25850/18623/15543
+f 16092/18615/15537 24695/18617/15539 24696/18624/15544 16097/18620/15540
+f 16097/18620/15540 24696/18624/15544 30879/18625/15545 25849/18622/15542
+f 16090/18608/15532 16093/18621/15541 16098/18626/15546 16094/18609/15533
+f 16094/18609/15533 16098/18626/15546 24624/18236/15161 24623/18229/15156
+f 16093/18621/15541 25850/18623/15543 25851/18627/15547 16098/18626/15546
+f 16098/18626/15546 25851/18627/15547 30855/18237/15162 24624/18236/15161
+f 16099/18628/15548 16103/18629/15549 16104/18630/15550 16100/18631/15551
+f 16100/18631/15551 16104/18630/15550 25851/18627/15547 25850/18623/15543
+f 16103/18629/15549 24626/18247/15172 24625/18246/15171 16104/18630/15550
+f 16104/18630/15550 24625/18246/15171 30855/18237/15162 25851/18627/15547
+f 16099/18628/15548 16100/18631/15551 16105/18632/15552 16101/18633/15553
+f 16101/18633/15553 16105/18632/15552 24697/18634/15554 24698/18635/15555
+f 16100/18631/15551 25850/18623/15543 25849/18622/15542 16105/18632/15552
+f 16105/18632/15552 25849/18622/15542 30879/18625/15545 24697/18634/15554
+f 16099/18628/15548 16101/18633/15553 16106/18636/15556 16102/18637/15557
+f 16102/18637/15557 16106/18636/15556 25852/18638/15558 25853/18639/15559
+f 16101/18633/15553 24698/18635/15555 24699/18640/15560 16106/18636/15556
+f 16106/18636/15556 24699/18640/15560 30880/18641/15561 25852/18638/15558
+f 16099/18628/15548 16102/18637/15557 16107/18642/15562 16103/18629/15549
+f 16103/18629/15549 16107/18642/15562 24627/18252/15177 24626/18247/15172
+f 16102/18637/15557 25853/18639/15559 25854/18643/15563 16107/18642/15562
+f 16107/18642/15562 25854/18643/15563 30856/18253/15178 24627/18252/15177
+f 16108/18644/15564 16112/18645/15565 16113/18646/15566 16109/18647/15567
+f 16109/18647/15567 16113/18646/15566 25854/18643/15563 25853/18639/15559
+f 16112/18645/15565 24629/18263/15188 24628/18262/15187 16113/18646/15566
+f 16113/18646/15566 24628/18262/15187 30856/18253/15178 25854/18643/15563
+f 16108/18644/15564 16109/18647/15567 16114/18648/15568 16110/18649/15569
+f 16110/18649/15569 16114/18648/15568 24700/18650/15570 24701/18651/15571
+f 16109/18647/15567 25853/18639/15559 25852/18638/15558 16114/18648/15568
+f 16114/18648/15568 25852/18638/15558 30880/18641/15561 24700/18650/15570
+f 16108/18644/15564 16110/18649/15569 16115/18652/15572 16111/18653/15573
+f 16111/18653/15573 16115/18652/15572 25855/18654/15574 25856/18655/15575
+f 16110/18649/15569 24701/18651/15571 24702/18656/15576 16115/18652/15572
+f 16115/18652/15572 24702/18656/15576 30881/18657/15577 25855/18654/15574
+f 16108/18644/15564 16111/18653/15573 16116/18658/15578 16112/18645/15565
+f 16112/18645/15565 16116/18658/15578 24630/18268/15193 24629/18263/15188
+f 16111/18653/15573 25856/18655/15575 25857/18659/15579 16116/18658/15578
+f 16116/18658/15578 25857/18659/15579 30857/18269/15194 24630/18268/15193
+f 16117/18660/15580 16121/18661/15581 16122/18662/15582 16118/18663/15583
+f 16118/18663/15583 16122/18662/15582 25857/18659/15579 25856/18655/15575
+f 16121/18661/15581 24632/18279/15204 24631/18278/15203 16122/18662/15582
+f 16122/18662/15582 24631/18278/15203 30857/18269/15194 25857/18659/15579
+f 16117/18660/15580 16118/18663/15583 16123/18664/15584 16119/18665/15585
+f 16119/18665/15585 16123/18664/15584 24703/18666/15586 24704/18667/15587
+f 16118/18663/15583 25856/18655/15575 25855/18654/15574 16123/18664/15584
+f 16123/18664/15584 25855/18654/15574 30881/18657/15577 24703/18666/15586
+f 16117/18660/15580 16119/18665/15585 16124/18668/15588 16120/18669/15589
+f 16120/18669/15589 16124/18668/15588 25858/18670/15590 25859/18671/15591
+f 16119/18665/15585 24704/18667/15587 24705/18672/15592 16124/18668/15588
+f 16124/18668/15588 24705/18672/15592 30882/18673/15593 25858/18670/15590
+f 16117/18660/15580 16120/18669/15589 16125/18674/15594 16121/18661/15581
+f 16121/18661/15581 16125/18674/15594 24633/18284/15209 24632/18279/15204
+f 16120/18669/15589 25859/18671/15591 25860/18675/15595 16125/18674/15594
+f 16125/18674/15594 25860/18675/15595 30858/18285/15210 24633/18284/15209
+f 16126/18676/15596 16130/18677/15597 16131/18678/15598 16127/18679/15599
+f 16127/18679/15599 16131/18678/15598 25860/18675/15595 25859/18671/15591
+f 16130/18677/15597 24635/18295/15220 24634/18294/15219 16131/18678/15598
+f 16131/18678/15598 24634/18294/15219 30858/18285/15210 25860/18675/15595
+f 16126/18676/15596 16127/18679/15599 16132/18680/15600 16128/18681/15601
+f 16128/18681/15601 16132/18680/15600 24706/18682/15602 24707/18683/15603
+f 16127/18679/15599 25859/18671/15591 25858/18670/15590 16132/18680/15600
+f 16132/18680/15600 25858/18670/15590 30882/18673/15593 24706/18682/15602
+f 16126/18676/15596 16128/18681/15601 16133/18684/15604 16129/18685/15605
+f 16129/18685/15605 16133/18684/15604 25861/18686/15606 25862/18687/15607
+f 16128/18681/15601 24707/18683/15603 24708/18688/15608 16133/18684/15604
+f 16133/18684/15604 24708/18688/15608 30883/18689/15609 25861/18686/15606
+f 16126/18676/15596 16129/18685/15605 16134/18690/15610 16130/18677/15597
+f 16130/18677/15597 16134/18690/15610 24636/18300/15225 24635/18295/15220
+f 16129/18685/15605 25862/18687/15607 25863/18691/15611 16134/18690/15610
+f 16134/18690/15610 25863/18691/15611 30859/18301/15226 24636/18300/15225
+f 16135/18692/15612 16139/18693/15613 16140/18694/15614 16136/18695/15615
+f 16136/18695/15615 16140/18694/15614 25863/18691/15611 25862/18687/15607
+f 16139/18693/15613 24638/18311/15236 24637/18310/15235 16140/18694/15614
+f 16140/18694/15614 24637/18310/15235 30859/18301/15226 25863/18691/15611
+f 16135/18692/15612 16136/18695/15615 16141/18696/15616 16137/18697/15617
+f 16137/18697/15617 16141/18696/15616 24709/18698/15618 24710/18699/15619
+f 16136/18695/15615 25862/18687/15607 25861/18686/15606 16141/18696/15616
+f 16141/18696/15616 25861/18686/15606 30883/18689/15609 24709/18698/15618
+f 16135/18692/15612 16137/18697/15617 16142/18700/15620 16138/18701/15621
+f 16138/18701/15621 16142/18700/15620 25864/18702/15622 25865/18703/15623
+f 16137/18697/15617 24710/18699/15619 24711/18704/15624 16142/18700/15620
+f 16142/18700/15620 24711/18704/15624 30884/18705/15625 25864/18702/15622
+f 16135/18692/15612 16138/18701/15621 16143/18706/15626 16139/18693/15613
+f 16139/18693/15613 16143/18706/15626 24639/18316/15241 24638/18311/15236
+f 16138/18701/15621 25865/18703/15623 25866/18707/15627 16143/18706/15626
+f 16143/18706/15626 25866/18707/15627 30860/18317/1136 24639/18316/15241
+f 16144/18708/15628 16148/18709/15629 16149/18710/15630 16145/18711/15631
+f 16145/18711/15631 16149/18710/15630 25866/18707/15627 25865/18703/15623
+f 16148/18709/15629 24641/18327/15251 24640/18326/15250 16149/18710/15630
+f 16149/18710/15630 24640/18326/15250 30860/18317/1136 25866/18707/15627
+f 16144/18708/15628 16145/18711/15631 16150/18712/15632 16146/18713/15633
+f 16146/18713/15633 16150/18712/15632 24712/18714/15634 24713/18715/15635
+f 16145/18711/15631 25865/18703/15623 25864/18702/15622 16150/18712/15632
+f 16150/18712/15632 25864/18702/15622 30884/18705/15625 24712/18714/15634
+f 16144/18708/15628 16146/18713/15633 16151/18716/15636 16147/18717/15637
+f 16147/18717/15637 16151/18716/15636 25797/18342/15266 25796/18337/15261
+f 16146/18713/15633 24713/18715/15635 24714/18718/15638 16151/18716/15636
+f 16151/18716/15636 24714/18718/15638 30861/18343/15267 25797/18342/15266
+f 16144/18708/15628 16147/18717/15637 16152/18719/15639 16148/18709/15629
+f 16148/18709/15629 16152/18719/15639 24642/18330/15254 24641/18327/15251
+f 16147/18717/15637 25796/18337/15261 25795/18336/15260 16152/18719/15639
+f 16152/18719/15639 25795/18336/15260 30837/17955/14885 24642/18330/15254
+f 16153/18720/15640 16157/18721/15641 16158/18722/15642 16154/18723/15643
+f 16154/18723/15643 16158/18722/15642 25867/18724/15644 25868/18725/15645
+f 16157/18721/15641 24644/18341/15265 24643/18340/15264 16158/18722/15642
+f 16158/18722/15642 24643/18340/15264 30861/18343/15267 25867/18724/15644
+f 16153/18720/15640 16154/18723/15643 16159/18726/15646 16155/18727/15647
+f 16155/18727/15647 16159/18726/15646 24715/18728/15648 24716/18729/15649
+f 16154/18723/15643 25868/18725/15645 25869/18730/15650 16159/18726/15646
+f 16159/18726/15646 25869/18730/15650 30885/18731/15651 24715/18728/15648
+f 16153/18720/15640 16155/18727/15647 16160/18732/15652 16156/18733/15653
+f 16156/18733/15653 16160/18732/15652 25870/18734/15654 25871/18735/15655
+f 16155/18727/15647 24716/18729/15649 24717/18736/15656 16160/18732/15652
+f 16160/18732/15652 24717/18736/15656 30886/18737/15657 25870/18734/15654
+f 16153/18720/15640 16156/18733/15653 16161/18738/15658 16157/18721/15641
+f 16157/18721/15641 16161/18738/15658 24645/18348/15272 24644/18341/15265
+f 16156/18733/15653 25871/18735/15655 25872/18739/15659 16161/18738/15658
+f 16161/18738/15658 25872/18739/15659 30862/18349/15273 24645/18348/15272
+f 16162/18740/15660 16166/18741/15661 16167/18742/15662 16163/18743/15663
+f 16163/18743/15663 16167/18742/15662 25872/18739/15659 25871/18735/15655
+f 16166/18741/15661 24647/18359/15283 24646/18358/15282 16167/18742/15662
+f 16167/18742/15662 24646/18358/15282 30862/18349/15273 25872/18739/15659
+f 16162/18740/15660 16163/18743/15663 16168/18744/15664 16164/18745/15665
+f 16164/18745/15665 16168/18744/15664 24718/18746/15666 24719/18747/15667
+f 16163/18743/15663 25871/18735/15655 25870/18734/15654 16168/18744/15664
+f 16168/18744/15664 25870/18734/15654 30886/18737/15657 24718/18746/15666
+f 16162/18740/15660 16164/18745/15665 16169/18748/15668 16165/18749/15669
+f 16165/18749/15669 16169/18748/15668 25873/18750/15670 25874/18751/15671
+f 16164/18745/15665 24719/18747/15667 24720/18752/15672 16169/18748/15668
+f 16169/18748/15668 24720/18752/15672 30887/18753/15673 25873/18750/15670
+f 16162/18740/15660 16165/18749/15669 16170/18754/15674 16166/18741/15661
+f 16166/18741/15661 16170/18754/15674 24648/18364/15288 24647/18359/15283
+f 16165/18749/15669 25874/18751/15671 25875/18755/15675 16170/18754/15674
+f 16170/18754/15674 25875/18755/15675 30863/18365/15289 24648/18364/15288
+f 16171/18756/15676 16175/18757/15677 16176/18758/15678 16172/18759/15679
+f 16172/18759/15679 16176/18758/15678 25875/18755/15675 25874/18751/15671
+f 16175/18757/15677 24650/18375/15299 24649/18374/15298 16176/18758/15678
+f 16176/18758/15678 24649/18374/15298 30863/18365/15289 25875/18755/15675
+f 16171/18756/15676 16172/18759/15679 16177/18760/15680 16173/18761/15681
+f 16173/18761/15681 16177/18760/15680 24721/18762/15682 24722/18763/15683
+f 16172/18759/15679 25874/18751/15671 25873/18750/15670 16177/18760/15680
+f 16177/18760/15680 25873/18750/15670 30887/18753/15673 24721/18762/15682
+f 16171/18756/15676 16173/18761/15681 16178/18764/15684 16174/18765/15685
+f 16174/18765/15685 16178/18764/15684 25876/18766/15686 25877/18767/15687
+f 16173/18761/15681 24722/18763/15683 24723/18768/15688 16178/18764/15684
+f 16178/18764/15684 24723/18768/15688 30888/18769/15689 25876/18766/15686
+f 16171/18756/15676 16174/18765/15685 16179/18770/15690 16175/18757/15677
+f 16175/18757/15677 16179/18770/15690 24651/18380/15304 24650/18375/15299
+f 16174/18765/15685 25877/18767/15687 25878/18771/15691 16179/18770/15690
+f 16179/18770/15690 25878/18771/15691 30864/18381/15305 24651/18380/15304
+f 16180/18772/15692 16184/18773/15693 16185/18774/15694 16181/18775/15695
+f 16181/18775/15695 16185/18774/15694 25878/18771/15691 25877/18767/15687
+f 16184/18773/15693 24653/18391/15315 24652/18390/15314 16185/18774/15694
+f 16185/18774/15694 24652/18390/15314 30864/18381/15305 25878/18771/15691
+f 16180/18772/15692 16181/18775/15695 16186/18776/15696 16182/18777/15697
+f 16182/18777/15697 16186/18776/15696 24724/18778/15698 24725/18779/15699
+f 16181/18775/15695 25877/18767/15687 25876/18766/15686 16186/18776/15696
+f 16186/18776/15696 25876/18766/15686 30888/18769/15689 24724/18778/15698
+f 16180/18772/15692 16182/18777/15697 16187/18780/15700 16183/18781/15701
+f 16183/18781/15701 16187/18780/15700 25879/18782/15702 25880/18783/15703
+f 16182/18777/15697 24725/18779/15699 24726/18784/15704 16187/18780/15700
+f 16187/18780/15700 24726/18784/15704 30889/18785/15705 25879/18782/15702
+f 16180/18772/15692 16183/18781/15701 16188/18786/15706 16184/18773/15693
+f 16184/18773/15693 16188/18786/15706 24654/18396/15320 24653/18391/15315
+f 16183/18781/15701 25880/18783/15703 25881/18787/15707 16188/18786/15706
+f 16188/18786/15706 25881/18787/15707 30865/18397/15321 24654/18396/15320
+f 16189/18788/15708 16193/18789/15709 16194/18790/15710 16190/18791/15711
+f 16190/18791/15711 16194/18790/15710 25881/18787/15707 25880/18783/15703
+f 16193/18789/15709 24656/18407/15331 24655/18406/15330 16194/18790/15710
+f 16194/18790/15710 24655/18406/15330 30865/18397/15321 25881/18787/15707
+f 16189/18788/15708 16190/18791/15711 16195/18792/15712 16191/18793/15713
+f 16191/18793/15713 16195/18792/15712 24727/18794/15714 24728/18795/15715
+f 16190/18791/15711 25880/18783/15703 25879/18782/15702 16195/18792/15712
+f 16195/18792/15712 25879/18782/15702 30889/18785/15705 24727/18794/15714
+f 16189/18788/15708 16191/18793/15713 16196/18796/15716 16192/18797/15717
+f 16192/18797/15717 16196/18796/15716 25882/18798/15718 25883/18799/15719
+f 16191/18793/15713 24728/18795/15715 24729/18800/15720 16196/18796/15716
+f 16196/18796/15716 24729/18800/15720 30890/18801/15721 25882/18798/15718
+f 16189/18788/15708 16192/18797/15717 16197/18802/15722 16193/18789/15709
+f 16193/18789/15709 16197/18802/15722 24657/18412/15336 24656/18407/15331
+f 16192/18797/15717 25883/18799/15719 25884/18803/15723 16197/18802/15722
+f 16197/18802/15722 25884/18803/15723 30866/18413/15337 24657/18412/15336
+f 16198/18804/15724 16202/18805/15725 16203/18806/15726 16199/18807/15727
+f 16199/18807/15727 16203/18806/15726 25884/18803/15723 25883/18799/15719
+f 16202/18805/15725 24659/18423/15347 24658/18422/15346 16203/18806/15726
+f 16203/18806/15726 24658/18422/15346 30866/18413/15337 25884/18803/15723
+f 16198/18804/15724 16199/18807/15727 16204/18808/15728 16200/18809/15729
+f 16200/18809/15729 16204/18808/15728 24730/18810/15730 24731/18811/15731
+f 16199/18807/15727 25883/18799/15719 25882/18798/15718 16204/18808/15728
+f 16204/18808/15728 25882/18798/15718 30890/18801/15721 24730/18810/15730
+f 16198/18804/15724 16200/18809/15729 16205/18812/15732 16201/18813/15733
+f 16201/18813/15733 16205/18812/15732 25885/18814/15734 25886/18815/15735
+f 16200/18809/15729 24731/18811/15731 24732/18816/15736 16205/18812/15732
+f 16205/18812/15732 24732/18816/15736 30891/18817/15737 25885/18814/15734
+f 16198/18804/15724 16201/18813/15733 16206/18818/15738 16202/18805/15725
+f 16202/18805/15725 16206/18818/15738 24660/18428/15352 24659/18423/15347
+f 16201/18813/15733 25886/18815/15735 25887/18819/15739 16206/18818/15738
+f 16206/18818/15738 25887/18819/15739 30867/18429/15353 24660/18428/15352
+f 16207/18820/15740 16211/18821/15741 16212/18822/15742 16208/18823/15743
+f 16208/18823/15743 16212/18822/15742 25887/18819/15739 25886/18815/15735
+f 16211/18821/15741 24662/18439/15363 24661/18438/15362 16212/18822/15742
+f 16212/18822/15742 24661/18438/15362 30867/18429/15353 25887/18819/15739
+f 16207/18820/15740 16208/18823/15743 16213/18824/15744 16209/18825/15745
+f 16209/18825/15745 16213/18824/15744 24733/18826/15746 24734/18827/15747
+f 16208/18823/15743 25886/18815/15735 25885/18814/15734 16213/18824/15744
+f 16213/18824/15744 25885/18814/15734 30891/18817/15737 24733/18826/15746
+f 16207/18820/15740 16209/18825/15745 16214/18828/15748 16210/18829/15749
+f 16210/18829/15749 16214/18828/15748 25888/18830/15750 25889/18831/15751
+f 16209/18825/15745 24734/18827/15747 24735/18832/15752 16214/18828/15748
+f 16214/18828/15748 24735/18832/15752 30892/18833/15753 25888/18830/15750
+f 16207/18820/15740 16210/18829/15749 16215/18834/15754 16211/18821/15741
+f 16211/18821/15741 16215/18834/15754 24663/18444/15368 24662/18439/15363
+f 16210/18829/15749 25889/18831/15751 25890/18835/15755 16215/18834/15754
+f 16215/18834/15754 25890/18835/15755 30868/18445/15369 24663/18444/15368
+f 16216/18836/15756 16220/18837/15757 16221/18838/15758 16217/18839/15759
+f 16217/18839/15759 16221/18838/15758 25890/18835/15755 25889/18831/15751
+f 16220/18837/15757 24665/18455/15379 24664/18454/15378 16221/18838/15758
+f 16221/18838/15758 24664/18454/15378 30868/18445/15369 25890/18835/15755
+f 16216/18836/15756 16217/18839/15759 16222/18840/15760 16218/18841/15761
+f 16218/18841/15761 16222/18840/15760 24736/18842/15762 24737/18843/15763
+f 16217/18839/15759 25889/18831/15751 25888/18830/15750 16222/18840/15760
+f 16222/18840/15760 25888/18830/15750 30892/18833/15753 24736/18842/15762
+f 16216/18836/15756 16218/18841/15761 16223/18844/15764 16219/18845/15765
+f 16219/18845/15765 16223/18844/15764 25891/18846/15766 25892/18847/15767
+f 16218/18841/15761 24737/18843/15763 24738/18848/15768 16223/18844/15764
+f 16223/18844/15764 24738/18848/15768 30893/18849/15769 25891/18846/15766
+f 16216/18836/15756 16219/18845/15765 16224/18850/15770 16220/18837/15757
+f 16220/18837/15757 16224/18850/15770 24666/18460/15384 24665/18455/15379
+f 16219/18845/15765 25892/18847/15767 25893/18851/15771 16224/18850/15770
+f 16224/18850/15770 25893/18851/15771 30869/18461/15385 24666/18460/15384
+f 16225/18852/15772 16229/18853/15773 16230/18854/15774 16226/18855/15775
+f 16226/18855/15775 16230/18854/15774 25893/18851/15771 25892/18847/15767
+f 16229/18853/15773 24668/18471/15395 24667/18470/15394 16230/18854/15774
+f 16230/18854/15774 24667/18470/15394 30869/18461/15385 25893/18851/15771
+f 16225/18852/15772 16226/18855/15775 16231/18856/15776 16227/18857/15777
+f 16227/18857/15777 16231/18856/15776 24739/18858/15778 24740/18859/15779
+f 16226/18855/15775 25892/18847/15767 25891/18846/15766 16231/18856/15776
+f 16231/18856/15776 25891/18846/15766 30893/18849/15769 24739/18858/15778
+f 16225/18852/15772 16227/18857/15777 16232/18860/15780 16228/18861/15781
+f 16228/18861/15781 16232/18860/15780 25894/18862/15782 25895/18863/15783
+f 16227/18857/15777 24740/18859/15779 24741/18864/15784 16232/18860/15780
+f 16232/18860/15780 24741/18864/15784 30894/18865/15785 25894/18862/15782
+f 16225/18852/15772 16228/18861/15781 16233/18866/15786 16229/18853/15773
+f 16229/18853/15773 16233/18866/15786 24669/18476/15400 24668/18471/15395
+f 16228/18861/15781 25895/18863/15783 25896/18867/15787 16233/18866/15786
+f 16233/18866/15786 25896/18867/15787 30870/18477/15401 24669/18476/15400
+f 16234/18868/15788 16238/18869/15789 16239/18870/15790 16235/18871/15791
+f 16235/18871/15791 16239/18870/15790 25896/18867/15787 25895/18863/15783
+f 16238/18869/15789 24671/18487/15411 24670/18486/15410 16239/18870/15790
+f 16239/18870/15790 24670/18486/15410 30870/18477/15401 25896/18867/15787
+f 16234/18868/15788 16235/18871/15791 16240/18872/15792 16236/18873/15793
+f 16236/18873/15793 16240/18872/15792 24742/18874/15794 24743/18875/15795
+f 16235/18871/15791 25895/18863/15783 25894/18862/15782 16240/18872/15792
+f 16240/18872/15792 25894/18862/15782 30894/18865/15785 24742/18874/15794
+f 16234/18868/15788 16236/18873/15793 16241/18876/15796 16237/18877/15797
+f 16237/18877/15797 16241/18876/15796 25897/18878/15798 25898/18879/15799
+f 16236/18873/15793 24743/18875/15795 24744/18880/15800 16241/18876/15796
+f 16241/18876/15796 24744/18880/15800 30895/18881/15801 25897/18878/15798
+f 16234/18868/15788 16237/18877/15797 16242/18882/15802 16238/18869/15789
+f 16238/18869/15789 16242/18882/15802 24672/18492/15416 24671/18487/15411
+f 16237/18877/15797 25898/18879/15799 25899/18883/15803 16242/18882/15802
+f 16242/18882/15802 25899/18883/15803 30871/18493/15417 24672/18492/15416
+f 16243/18884/15804 16247/18885/15805 16248/18886/15806 16244/18887/15807
+f 16244/18887/15807 16248/18886/15806 25899/18883/15803 25898/18879/15799
+f 16247/18885/15805 24674/18503/15427 24673/18502/15426 16248/18886/15806
+f 16248/18886/15806 24673/18502/15426 30871/18493/15417 25899/18883/15803
+f 16243/18884/15804 16244/18887/15807 16249/18888/15808 16245/18889/15809
+f 16245/18889/15809 16249/18888/15808 24745/18890/15810 24746/18891/15811
+f 16244/18887/15807 25898/18879/15799 25897/18878/15798 16249/18888/15808
+f 16249/18888/15808 25897/18878/15798 30895/18881/15801 24745/18890/15810
+f 16243/18884/15804 16245/18889/15809 16250/18892/15812 16246/18893/15813
+f 16246/18893/15813 16250/18892/15812 25900/18894/15814 25901/18895/15815
+f 16245/18889/15809 24746/18891/15811 24747/18896/15816 16250/18892/15812
+f 16250/18892/15812 24747/18896/15816 30896/18897/15817 25900/18894/15814
+f 16243/18884/15804 16246/18893/15813 16251/18898/15818 16247/18885/15805
+f 16247/18885/15805 16251/18898/15818 24675/18508/15432 24674/18503/15427
+f 16246/18893/15813 25901/18895/15815 25902/18899/15819 16251/18898/15818
+f 16251/18898/15818 25902/18899/15819 30872/18509/15433 24675/18508/15432
+f 16252/18900/15820 16256/18901/15821 16257/18902/15822 16253/18903/15823
+f 16253/18903/15823 16257/18902/15822 25902/18899/15819 25901/18895/15815
+f 16256/18901/15821 24677/18519/15443 24676/18518/15442 16257/18902/15822
+f 16257/18902/15822 24676/18518/15442 30872/18509/15433 25902/18899/15819
+f 16252/18900/15820 16253/18903/15823 16258/18904/15824 16254/18905/15825
+f 16254/18905/15825 16258/18904/15824 24748/18906/15826 24749/18907/15827
+f 16253/18903/15823 25901/18895/15815 25900/18894/15814 16258/18904/15824
+f 16258/18904/15824 25900/18894/15814 30896/18897/15817 24748/18906/15826
+f 16252/18900/15820 16254/18905/15825 16259/18908/15828 16255/18909/15829
+f 16255/18909/15829 16259/18908/15828 25903/18910/15830 25904/18911/15831
+f 16254/18905/15825 24749/18907/15827 24750/18912/15832 16259/18908/15828
+f 16259/18908/15828 24750/18912/15832 30897/18913/15833 25903/18910/15830
+f 16252/18900/15820 16255/18909/15829 16260/18914/15834 16256/18901/15821
+f 16256/18901/15821 16260/18914/15834 24678/18524/15448 24677/18519/15443
+f 16255/18909/15829 25904/18911/15831 25905/18915/15835 16260/18914/15834
+f 16260/18914/15834 25905/18915/15835 30873/18525/15449 24678/18524/15448
+f 16261/18916/15836 16265/18917/15837 16266/18918/15838 16262/18919/15839
+f 16262/18919/15839 16266/18918/15838 25905/18915/15835 25904/18911/15831
+f 16265/18917/15837 24680/18535/15459 24679/18534/15458 16266/18918/15838
+f 16266/18918/15838 24679/18534/15458 30873/18525/15449 25905/18915/15835
+f 16261/18916/15836 16262/18919/15839 16267/18920/15840 16263/18921/15841
+f 16263/18921/15841 16267/18920/15840 24751/18922/15842 24752/18923/15843
+f 16262/18919/15839 25904/18911/15831 25903/18910/15830 16267/18920/15840
+f 16267/18920/15840 25903/18910/15830 30897/18913/15833 24751/18922/15842
+f 16261/18916/15836 16263/18921/15841 16268/18924/15844 16264/18925/15845
+f 16264/18925/15845 16268/18924/15844 25906/18926/15846 25907/18927/15847
+f 16263/18921/15841 24752/18923/15843 24753/18928/15848 16268/18924/15844
+f 16268/18924/15844 24753/18928/15848 30898/18929/15849 25906/18926/15846
+f 16261/18916/15836 16264/18925/15845 16269/18930/15850 16265/18917/15837
+f 16265/18917/15837 16269/18930/15850 24681/18540/15464 24680/18535/15459
+f 16264/18925/15845 25907/18927/15847 25908/18931/15851 16269/18930/15850
+f 16269/18930/15850 25908/18931/15851 30874/18541/15465 24681/18540/15464
+f 16270/18932/15852 16274/18933/15853 16275/18934/15854 16271/18935/15855
+f 16271/18935/15855 16275/18934/15854 25908/18931/15851 25907/18927/15847
+f 16274/18933/15853 24683/18551/15475 24682/18550/15474 16275/18934/15854
+f 16275/18934/15854 24682/18550/15474 30874/18541/15465 25908/18931/15851
+f 16270/18932/15852 16271/18935/15855 16276/18936/15856 16272/18937/15857
+f 16272/18937/15857 16276/18936/15856 24754/18938/15858 24755/18939/15859
+f 16271/18935/15855 25907/18927/15847 25906/18926/15846 16276/18936/15856
+f 16276/18936/15856 25906/18926/15846 30898/18929/15849 24754/18938/15858
+f 16270/18932/15852 16272/18937/15857 16277/18940/15860 16273/18941/15861
+f 16273/18941/15861 16277/18940/15860 25909/18942/15862 25910/18943/15863
+f 16272/18937/15857 24755/18939/15859 24756/18944/15864 16277/18940/15860
+f 16277/18940/15860 24756/18944/15864 30899/18945/15865 25909/18942/15862
+f 16270/18932/15852 16273/18941/15861 16278/18946/15866 16274/18933/15853
+f 16274/18933/15853 16278/18946/15866 24684/18556/15480 24683/18551/15475
+f 16273/18941/15861 25910/18943/15863 25911/18947/15867 16278/18946/15866
+f 16278/18946/15866 25911/18947/15867 30875/18557/15481 24684/18556/15480
+f 16279/18948/15868 16283/18949/15869 16284/18950/15870 16280/18951/15871
+f 16280/18951/15871 16284/18950/15870 25911/18947/15867 25910/18943/15863
+f 16283/18949/15869 24686/18567/15491 24685/18566/15490 16284/18950/15870
+f 16284/18950/15870 24685/18566/15490 30875/18557/15481 25911/18947/15867
+f 16279/18948/15868 16280/18951/15871 16285/18952/15872 16281/18953/15873
+f 16281/18953/15873 16285/18952/15872 24757/18954/15874 24758/18955/15875
+f 16280/18951/15871 25910/18943/15863 25909/18942/15862 16285/18952/15872
+f 16285/18952/15872 25909/18942/15862 30899/18945/15865 24757/18954/15874
+f 16279/18948/15868 16281/18953/15873 16286/18956/15876 16282/18957/15877
+f 16282/18957/15877 16286/18956/15876 25912/18958/15878 25913/18959/15879
+f 16281/18953/15873 24758/18955/15875 24759/18960/15880 16286/18956/15876
+f 16286/18956/15876 24759/18960/15880 30900/18961/15881 25912/18958/15878
+f 16279/18948/15868 16282/18957/15877 16287/18962/15882 16283/18949/15869
+f 16283/18949/15869 16287/18962/15882 24687/18572/15496 24686/18567/15491
+f 16282/18957/15877 25913/18959/15879 25914/18963/15883 16287/18962/15882
+f 16287/18962/15882 25914/18963/15883 30876/18573/15497 24687/18572/15496
+f 16288/18964/15884 16292/18965/15885 16293/18966/15886 16289/18967/15887
+f 16289/18967/15887 16293/18966/15886 25914/18963/15883 25913/18959/15879
+f 16292/18965/15885 24689/18583/15507 24688/18582/15506 16293/18966/15886
+f 16293/18966/15886 24688/18582/15506 30876/18573/15497 25914/18963/15883
+f 16288/18964/15884 16289/18967/15887 16294/18968/15888 16290/18969/15889
+f 16290/18969/15889 16294/18968/15888 24760/18970/15890 24761/18971/15891
+f 16289/18967/15887 25913/18959/15879 25912/18958/15878 16294/18968/15888
+f 16294/18968/15888 25912/18958/15878 30900/18961/15881 24760/18970/15890
+f 16288/18964/15884 16290/18969/15889 16295/18972/15892 16291/18973/15893
+f 16291/18973/15893 16295/18972/15892 25915/18974/15894 25916/18975/15895
+f 16290/18969/15889 24761/18971/15891 24762/18976/15896 16295/18972/15892
+f 16295/18972/15892 24762/18976/15896 30901/18977/15897 25915/18974/15894
+f 16288/18964/15884 16291/18973/15893 16296/18978/15898 16292/18965/15885
+f 16292/18965/15885 16296/18978/15898 24690/18588/15512 24689/18583/15507
+f 16291/18973/15893 25916/18975/15895 25917/18979/15899 16296/18978/15898
+f 16296/18978/15898 25917/18979/15899 30877/18589/15513 24690/18588/15512
+f 16297/18980/15900 16301/18981/15901 16302/18982/15902 16298/18983/15903
+f 16298/18983/15903 16302/18982/15902 25917/18979/15899 25916/18975/15895
+f 16301/18981/15901 24692/18599/15523 24691/18598/15522 16302/18982/15902
+f 16302/18982/15902 24691/18598/15522 30877/18589/15513 25917/18979/15899
+f 16297/18980/15900 16298/18983/15903 16303/18984/15904 16299/18985/15905
+f 16299/18985/15905 16303/18984/15904 24763/18986/15906 24764/18987/15907
+f 16298/18983/15903 25916/18975/15895 25915/18974/15894 16303/18984/15904
+f 16303/18984/15904 25915/18974/15894 30901/18977/15897 24763/18986/15906
+f 16297/18980/15900 16299/18985/15905 16304/18988/15908 16300/18989/15909
+f 16300/18989/15909 16304/18988/15908 25918/18990/15910 25919/18991/15911
+f 16299/18985/15905 24764/18987/15907 24765/18992/15912 16304/18988/15908
+f 16304/18988/15908 24765/18992/15912 30902/18993/15913 25918/18990/15910
+f 16297/18980/15900 16300/18989/15909 16305/18994/15914 16301/18981/15901
+f 16301/18981/15901 16305/18994/15914 24693/18604/15528 24692/18599/15523
+f 16300/18989/15909 25919/18991/15911 25920/18995/15915 16305/18994/15914
+f 16305/18994/15914 25920/18995/15915 30878/18605/15529 24693/18604/15528
+f 16306/18996/15916 16310/18997/15917 16311/18998/15918 16307/18999/15919
+f 16307/18999/15919 16311/18998/15918 25920/19000/15915 25919/19001/15911
+f 16310/18997/15917 24695/18617/15539 24694/18616/15538 16311/18998/15918
+f 16311/18998/15918 24694/18616/15538 30878/18619/15529 25920/19000/15915
+f 16306/18996/15916 16307/18999/15919 16312/19002/15920 16308/19003/15921
+f 16308/19003/15921 16312/19002/15920 24766/19004/15922 24767/19005/15923
+f 16307/18999/15919 25919/19001/15911 25918/19006/15910 16312/19002/15920
+f 16312/19002/15920 25918/19006/15910 30902/19007/15913 24766/19004/15922
+f 16306/18996/15916 16308/19003/15921 16313/19008/15924 16309/19009/15925
+f 16309/19009/15925 16313/19008/15924 25921/19010/15926 25922/19011/15927
+f 16308/19003/15921 24767/19005/15923 24768/19012/15928 16313/19008/15924
+f 16313/19008/15924 24768/19012/15928 30903/19013/15929 25921/19010/15926
+f 16306/18996/15916 16309/19009/15925 16314/19014/15930 16310/18997/15917
+f 16310/18997/15917 16314/19014/15930 24696/18624/15544 24695/18617/15539
+f 16309/19009/15925 25922/19011/15927 25923/19015/15931 16314/19014/15930
+f 16314/19014/15930 25923/19015/15931 30879/18625/15545 24696/18624/15544
+f 16315/19016/15932 16319/19017/15933 16320/19018/15934 16316/19019/15935
+f 16316/19019/15935 16320/19018/15934 25923/19015/15931 25922/19011/15927
+f 16319/19017/15933 24698/18635/15555 24697/18634/15554 16320/19018/15934
+f 16320/19018/15934 24697/18634/15554 30879/18625/15545 25923/19015/15931
+f 16315/19016/15932 16316/19019/15935 16321/19020/15936 16317/19021/15937
+f 16317/19021/15937 16321/19020/15936 24769/19022/15938 24770/19023/15939
+f 16316/19019/15935 25922/19011/15927 25921/19010/15926 16321/19020/15936
+f 16321/19020/15936 25921/19010/15926 30903/19013/15929 24769/19022/15938
+f 16315/19016/15932 16317/19021/15937 16322/19024/15940 16318/19025/15941
+f 16318/19025/15941 16322/19024/15940 25924/19026/15942 25925/19027/15943
+f 16317/19021/15937 24770/19023/15939 24771/19028/15944 16322/19024/15940
+f 16322/19024/15940 24771/19028/15944 30904/19029/15945 25924/19026/15942
+f 16315/19016/15932 16318/19025/15941 16323/19030/15946 16319/19017/15933
+f 16319/19017/15933 16323/19030/15946 24699/18640/15560 24698/18635/15555
+f 16318/19025/15941 25925/19027/15943 25926/19031/15947 16323/19030/15946
+f 16323/19030/15946 25926/19031/15947 30880/18641/15561 24699/18640/15560
+f 16324/19032/15948 16328/19033/15949 16329/19034/15950 16325/19035/15951
+f 16325/19035/15951 16329/19034/15950 25926/19031/15947 25925/19027/15943
+f 16328/19033/15949 24701/18651/15571 24700/18650/15570 16329/19034/15950
+f 16329/19034/15950 24700/18650/15570 30880/18641/15561 25926/19031/15947
+f 16324/19032/15948 16325/19035/15951 16330/19036/15952 16326/19037/15953
+f 16326/19037/15953 16330/19036/15952 24772/19038/15954 24773/19039/15955
+f 16325/19035/15951 25925/19027/15943 25924/19026/15942 16330/19036/15952
+f 16330/19036/15952 25924/19026/15942 30904/19029/15945 24772/19038/15954
+f 16324/19032/15948 16326/19037/15953 16331/19040/15956 16327/19041/15957
+f 16327/19041/15957 16331/19040/15956 25927/19042/15958 25928/19043/15959
+f 16326/19037/15953 24773/19039/15955 24774/19044/15960 16331/19040/15956
+f 16331/19040/15956 24774/19044/15960 30905/19045/15961 25927/19042/15958
+f 16324/19032/15948 16327/19041/15957 16332/19046/15962 16328/19033/15949
+f 16328/19033/15949 16332/19046/15962 24702/18656/15576 24701/18651/15571
+f 16327/19041/15957 25928/19043/15959 25929/19047/15963 16332/19046/15962
+f 16332/19046/15962 25929/19047/15963 30881/18657/15577 24702/18656/15576
+f 16333/19048/15964 16337/19049/15965 16338/19050/15966 16334/19051/15967
+f 16334/19051/15967 16338/19050/15966 25929/19047/15963 25928/19043/15959
+f 16337/19049/15965 24704/18667/15587 24703/18666/15586 16338/19050/15966
+f 16338/19050/15966 24703/18666/15586 30881/18657/15577 25929/19047/15963
+f 16333/19048/15964 16334/19051/15967 16339/19052/15968 16335/19053/15969
+f 16335/19053/15969 16339/19052/15968 24775/19054/15970 24776/19055/15971
+f 16334/19051/15967 25928/19043/15959 25927/19042/15958 16339/19052/15968
+f 16339/19052/15968 25927/19042/15958 30905/19045/15961 24775/19054/15970
+f 16333/19048/15964 16335/19053/15969 16340/19056/15972 16336/19057/15973
+f 16336/19057/15973 16340/19056/15972 25930/19058/15974 25931/19059/15975
+f 16335/19053/15969 24776/19055/15971 24777/19060/15976 16340/19056/15972
+f 16340/19056/15972 24777/19060/15976 30906/19061/15977 25930/19058/15974
+f 16333/19048/15964 16336/19057/15973 16341/19062/15978 16337/19049/15965
+f 16337/19049/15965 16341/19062/15978 24705/18672/15592 24704/18667/15587
+f 16336/19057/15973 25931/19059/15975 25932/19063/15979 16341/19062/15978
+f 16341/19062/15978 25932/19063/15979 30882/18673/15593 24705/18672/15592
+f 16342/19064/15980 16346/19065/15981 16347/19066/15982 16343/19067/15983
+f 16343/19067/15983 16347/19066/15982 25932/19063/15979 25931/19059/15975
+f 16346/19065/15981 24707/18683/15603 24706/18682/15602 16347/19066/15982
+f 16347/19066/15982 24706/18682/15602 30882/18673/15593 25932/19063/15979
+f 16342/19064/15980 16343/19067/15983 16348/19068/15984 16344/19069/15985
+f 16344/19069/15985 16348/19068/15984 24778/19070/15986 24779/19071/15987
+f 16343/19067/15983 25931/19059/15975 25930/19058/15974 16348/19068/15984
+f 16348/19068/15984 25930/19058/15974 30906/19061/15977 24778/19070/15986
+f 16342/19064/15980 16344/19069/15985 16349/19072/15988 16345/19073/15989
+f 16345/19073/15989 16349/19072/15988 25933/19074/15990 25934/19075/15991
+f 16344/19069/15985 24779/19071/15987 24780/19076/15992 16349/19072/15988
+f 16349/19072/15988 24780/19076/15992 30907/19077/15993 25933/19074/15990
+f 16342/19064/15980 16345/19073/15989 16350/19078/15994 16346/19065/15981
+f 16346/19065/15981 16350/19078/15994 24708/18688/15608 24707/18683/15603
+f 16345/19073/15989 25934/19075/15991 25935/19079/15995 16350/19078/15994
+f 16350/19078/15994 25935/19079/15995 30883/18689/15609 24708/18688/15608
+f 16351/19080/15996 16355/19081/15997 16356/19082/15998 16352/19083/15999
+f 16352/19083/15999 16356/19082/15998 25935/19079/15995 25934/19075/15991
+f 16355/19081/15997 24710/18699/15619 24709/18698/15618 16356/19082/15998
+f 16356/19082/15998 24709/18698/15618 30883/18689/15609 25935/19079/15995
+f 16351/19080/15996 16352/19083/15999 16357/19084/16000 16353/19085/16001
+f 16353/19085/16001 16357/19084/16000 24781/19086/16002 24782/19087/16003
+f 16352/19083/15999 25934/19075/15991 25933/19074/15990 16357/19084/16000
+f 16357/19084/16000 25933/19074/15990 30907/19077/15993 24781/19086/16002
+f 16351/19080/15996 16353/19085/16001 16358/19088/16004 16354/19089/16005
+f 16354/19089/16005 16358/19088/16004 25936/19090/16006 25937/19091/16007
+f 16353/19085/16001 24782/19087/16003 24783/19092/16008 16358/19088/16004
+f 16358/19088/16004 24783/19092/16008 30908/19093/16009 25936/19090/16006
+f 16351/19080/15996 16354/19089/16005 16359/19094/16010 16355/19081/15997
+f 16355/19081/15997 16359/19094/16010 24711/18704/15624 24710/18699/15619
+f 16354/19089/16005 25937/19091/16007 25938/19095/16011 16359/19094/16010
+f 16359/19094/16010 25938/19095/16011 30884/18705/15625 24711/18704/15624
+f 16360/19096/16012 16364/19097/16013 16365/19098/16014 16361/19099/16015
+f 16361/19099/16015 16365/19098/16014 25938/19095/16011 25937/19091/16007
+f 16364/19097/16013 24713/18715/15635 24712/18714/15634 16365/19098/16014
+f 16365/19098/16014 24712/18714/15634 30884/18705/15625 25938/19095/16011
+f 16360/19096/16012 16361/19099/16015 16366/19100/16016 16362/19101/16017
+f 16362/19101/16017 16366/19100/16016 24784/19102/16018 24785/19103/16019
+f 16361/19099/16015 25937/19091/16007 25936/19090/16006 16366/19100/16016
+f 16366/19100/16016 25936/19090/16006 30908/19093/16009 24784/19102/16018
+f 16360/19096/16012 16362/19101/16017 16367/19104/16020 16363/19105/16021
+f 16363/19105/16021 16367/19104/16020 25869/18730/15650 25868/18725/15645
+f 16362/19101/16017 24785/19103/16019 24786/19106/16022 16367/19104/16020
+f 16367/19104/16020 24786/19106/16022 30885/18731/15651 25869/18730/15650
+f 16360/19096/16012 16363/19105/16021 16368/19107/16023 16364/19097/16013
+f 16364/19097/16013 16368/19107/16023 24714/18718/15638 24713/18715/15635
+f 16363/19105/16021 25868/18725/15645 25867/18724/15644 16368/19107/16023
+f 16368/19107/16023 25867/18724/15644 30861/18343/15267 24714/18718/15638
+f 16369/19108/16024 16373/19109/16025 16374/19110/16026 16370/19111/16027
+f 16370/19111/16027 16374/19110/16026 25939/19112/16028 25940/19113/16029
+f 16373/19109/16025 24716/18729/15649 24715/18728/15648 16374/19110/16026
+f 16374/19110/16026 24715/18728/15648 30885/18731/15651 25939/19112/16028
+f 16369/19108/16024 16370/19111/16027 16375/19114/16030 16371/19115/16031
+f 16371/19115/16031 16375/19114/16030 24787/19116/16032 24788/19117/16033
+f 16370/19111/16027 25940/19113/16029 25941/19118/16034 16375/19114/16030
+f 16375/19114/16030 25941/19118/16034 30909/19119/16035 24787/19116/16032
+f 16369/19108/16024 16371/19115/16031 16376/19120/16036 16372/19121/16037
+f 16372/19121/16037 16376/19120/16036 25942/19122/16038 25943/19123/16039
+f 16371/19115/16031 24788/19117/16033 24789/19124/16040 16376/19120/16036
+f 16376/19120/16036 24789/19124/16040 30910/19125/16041 25942/19122/16038
+f 16369/19108/16024 16372/19121/16037 16377/19126/16042 16373/19109/16025
+f 16373/19109/16025 16377/19126/16042 24717/18736/15656 24716/18729/15649
+f 16372/19121/16037 25943/19123/16039 25944/19127/16043 16377/19126/16042
+f 16377/19126/16042 25944/19127/16043 30886/18737/15657 24717/18736/15656
+f 16378/19128/16044 16382/19129/16045 16383/19130/16046 16379/19131/16047
+f 16379/19131/16047 16383/19130/16046 25944/19127/16043 25943/19123/16039
+f 16382/19129/16045 24719/18747/15667 24718/18746/15666 16383/19130/16046
+f 16383/19130/16046 24718/18746/15666 30886/18737/15657 25944/19127/16043
+f 16378/19128/16044 16379/19131/16047 16384/19132/16048 16380/19133/16049
+f 16380/19133/16049 16384/19132/16048 24790/19134/16050 24791/19135/16051
+f 16379/19131/16047 25943/19123/16039 25942/19122/16038 16384/19132/16048
+f 16384/19132/16048 25942/19122/16038 30910/19125/16041 24790/19134/16050
+f 16378/19128/16044 16380/19133/16049 16385/19136/16052 16381/19137/16053
+f 16381/19137/16053 16385/19136/16052 25945/19138/16054 25946/19139/16055
+f 16380/19133/16049 24791/19135/16051 24792/19140/16056 16385/19136/16052
+f 16385/19136/16052 24792/19140/16056 30911/19141/16057 25945/19138/16054
+f 16378/19128/16044 16381/19137/16053 16386/19142/16058 16382/19129/16045
+f 16382/19129/16045 16386/19142/16058 24720/18752/15672 24719/18747/15667
+f 16381/19137/16053 25946/19139/16055 25947/19143/16059 16386/19142/16058
+f 16386/19142/16058 25947/19143/16059 30887/18753/15673 24720/18752/15672
+f 16387/19144/16060 16391/19145/16061 16392/19146/16062 16388/19147/16063
+f 16388/19147/16063 16392/19146/16062 25947/19143/16059 25946/19139/16055
+f 16391/19145/16061 24722/18763/15683 24721/18762/15682 16392/19146/16062
+f 16392/19146/16062 24721/18762/15682 30887/18753/15673 25947/19143/16059
+f 16387/19144/16060 16388/19147/16063 16393/19148/16064 16389/19149/16065
+f 16389/19149/16065 16393/19148/16064 24793/19150/16066 24794/19151/16067
+f 16388/19147/16063 25946/19139/16055 25945/19138/16054 16393/19148/16064
+f 16393/19148/16064 25945/19138/16054 30911/19141/16057 24793/19150/16066
+f 16387/19144/16060 16389/19149/16065 16394/19152/16068 16390/19153/16069
+f 16390/19153/16069 16394/19152/16068 25948/19154/16070 25949/19155/16071
+f 16389/19149/16065 24794/19151/16067 24795/19156/16072 16394/19152/16068
+f 16394/19152/16068 24795/19156/16072 30912/19157/16073 25948/19154/16070
+f 16387/19144/16060 16390/19153/16069 16395/19158/16074 16391/19145/16061
+f 16391/19145/16061 16395/19158/16074 24723/18768/15688 24722/18763/15683
+f 16390/19153/16069 25949/19155/16071 25950/19159/16075 16395/19158/16074
+f 16395/19158/16074 25950/19159/16075 30888/18769/15689 24723/18768/15688
+f 16396/19160/16076 16400/19161/16077 16401/19162/16078 16397/19163/16079
+f 16397/19163/16079 16401/19162/16078 25950/19159/16075 25949/19155/16071
+f 16400/19161/16077 24725/18779/15699 24724/18778/15698 16401/19162/16078
+f 16401/19162/16078 24724/18778/15698 30888/18769/15689 25950/19159/16075
+f 16396/19160/16076 16397/19163/16079 16402/19164/16080 16398/19165/16081
+f 16398/19165/16081 16402/19164/16080 24796/19166/16082 24797/19167/16083
+f 16397/19163/16079 25949/19155/16071 25948/19154/16070 16402/19164/16080
+f 16402/19164/16080 25948/19154/16070 30912/19157/16073 24796/19166/16082
+f 16396/19160/16076 16398/19165/16081 16403/19168/16084 16399/19169/16085
+f 16399/19169/16085 16403/19168/16084 25951/19170/16086 25952/19171/16087
+f 16398/19165/16081 24797/19167/16083 24798/19172/16088 16403/19168/16084
+f 16403/19168/16084 24798/19172/16088 30913/19173/16089 25951/19170/16086
+f 16396/19160/16076 16399/19169/16085 16404/19174/16090 16400/19161/16077
+f 16400/19161/16077 16404/19174/16090 24726/18784/15704 24725/18779/15699
+f 16399/19169/16085 25952/19171/16087 25953/19175/16091 16404/19174/16090
+f 16404/19174/16090 25953/19175/16091 30889/18785/15705 24726/18784/15704
+f 16405/19176/16092 16409/19177/16093 16410/19178/16094 16406/19179/16095
+f 16406/19179/16095 16410/19178/16094 25953/19175/16091 25952/19171/16087
+f 16409/19177/16093 24728/18795/15715 24727/18794/15714 16410/19178/16094
+f 16410/19178/16094 24727/18794/15714 30889/18785/15705 25953/19175/16091
+f 16405/19176/16092 16406/19179/16095 16411/19180/16096 16407/19181/16097
+f 16407/19181/16097 16411/19180/16096 24799/19182/16098 24800/19183/16099
+f 16406/19179/16095 25952/19171/16087 25951/19170/16086 16411/19180/16096
+f 16411/19180/16096 25951/19170/16086 30913/19173/16089 24799/19182/16098
+f 16405/19176/16092 16407/19181/16097 16412/19184/16100 16408/19185/16101
+f 16408/19185/16101 16412/19184/16100 25954/19186/16102 25955/19187/16103
+f 16407/19181/16097 24800/19183/16099 24801/19188/16104 16412/19184/16100
+f 16412/19184/16100 24801/19188/16104 30914/19189/16105 25954/19186/16102
+f 16405/19176/16092 16408/19185/16101 16413/19190/16106 16409/19177/16093
+f 16409/19177/16093 16413/19190/16106 24729/18800/15720 24728/18795/15715
+f 16408/19185/16101 25955/19187/16103 25956/19191/16107 16413/19190/16106
+f 16413/19190/16106 25956/19191/16107 30890/18801/15721 24729/18800/15720
+f 16414/19192/16108 16418/19193/16109 16419/19194/16110 16415/19195/16111
+f 16415/19195/16111 16419/19194/16110 25956/19191/16107 25955/19187/16103
+f 16418/19193/16109 24731/18811/15731 24730/18810/15730 16419/19194/16110
+f 16419/19194/16110 24730/18810/15730 30890/18801/15721 25956/19191/16107
+f 16414/19192/16108 16415/19195/16111 16420/19196/16112 16416/19197/16113
+f 16416/19197/16113 16420/19196/16112 24802/19198/16114 24803/19199/16115
+f 16415/19195/16111 25955/19187/16103 25954/19186/16102 16420/19196/16112
+f 16420/19196/16112 25954/19186/16102 30914/19189/16105 24802/19198/16114
+f 16414/19192/16108 16416/19197/16113 16421/19200/16116 16417/19201/16117
+f 16417/19201/16117 16421/19200/16116 25957/19202/16118 25958/19203/16119
+f 16416/19197/16113 24803/19199/16115 24804/19204/16120 16421/19200/16116
+f 16421/19200/16116 24804/19204/16120 30915/19205/16121 25957/19202/16118
+f 16414/19192/16108 16417/19201/16117 16422/19206/16122 16418/19193/16109
+f 16418/19193/16109 16422/19206/16122 24732/18816/15736 24731/18811/15731
+f 16417/19201/16117 25958/19203/16119 25959/19207/16123 16422/19206/16122
+f 16422/19206/16122 25959/19207/16123 30891/18817/15737 24732/18816/15736
+f 16423/19208/16124 16427/19209/16125 16428/19210/16126 16424/19211/16127
+f 16424/19211/16127 16428/19210/16126 25959/19207/16123 25958/19203/16119
+f 16427/19209/16125 24734/18827/15747 24733/18826/15746 16428/19210/16126
+f 16428/19210/16126 24733/18826/15746 30891/18817/15737 25959/19207/16123
+f 16423/19208/16124 16424/19211/16127 16429/19212/16128 16425/19213/16129
+f 16425/19213/16129 16429/19212/16128 24805/19214/16130 24806/19215/16131
+f 16424/19211/16127 25958/19203/16119 25957/19202/16118 16429/19212/16128
+f 16429/19212/16128 25957/19202/16118 30915/19205/16121 24805/19214/16130
+f 16423/19208/16124 16425/19213/16129 16430/19216/16132 16426/19217/16133
+f 16426/19217/16133 16430/19216/16132 25960/19218/16134 25961/19219/16135
+f 16425/19213/16129 24806/19215/16131 24807/19220/16136 16430/19216/16132
+f 16430/19216/16132 24807/19220/16136 30916/19221/16137 25960/19218/16134
+f 16423/19208/16124 16426/19217/16133 16431/19222/16138 16427/19209/16125
+f 16427/19209/16125 16431/19222/16138 24735/18832/15752 24734/18827/15747
+f 16426/19217/16133 25961/19219/16135 25962/19223/16139 16431/19222/16138
+f 16431/19222/16138 25962/19223/16139 30892/18833/15753 24735/18832/15752
+f 16432/19224/16140 16436/19225/16141 16437/19226/16142 16433/19227/16143
+f 16433/19227/16143 16437/19226/16142 25962/19223/16139 25961/19219/16135
+f 16436/19225/16141 24737/18843/15763 24736/18842/15762 16437/19226/16142
+f 16437/19226/16142 24736/18842/15762 30892/18833/15753 25962/19223/16139
+f 16432/19224/16140 16433/19227/16143 16438/19228/16144 16434/19229/16145
+f 16434/19229/16145 16438/19228/16144 24808/19230/16146 24809/19231/16147
+f 16433/19227/16143 25961/19219/16135 25960/19218/16134 16438/19228/16144
+f 16438/19228/16144 25960/19218/16134 30916/19221/16137 24808/19230/16146
+f 16432/19224/16140 16434/19229/16145 16439/19232/16148 16435/19233/16149
+f 16435/19233/16149 16439/19232/16148 25963/19234/16150 25964/19235/16151
+f 16434/19229/16145 24809/19231/16147 24810/19236/16152 16439/19232/16148
+f 16439/19232/16148 24810/19236/16152 30917/19237/16153 25963/19234/16150
+f 16432/19224/16140 16435/19233/16149 16440/19238/16154 16436/19225/16141
+f 16436/19225/16141 16440/19238/16154 24738/18848/15768 24737/18843/15763
+f 16435/19233/16149 25964/19235/16151 25965/19239/16155 16440/19238/16154
+f 16440/19238/16154 25965/19239/16155 30893/18849/15769 24738/18848/15768
+f 16441/19240/16156 16445/19241/16157 16446/19242/16158 16442/19243/16159
+f 16442/19243/16159 16446/19242/16158 25965/19239/16155 25964/19235/16151
+f 16445/19241/16157 24740/18859/15779 24739/18858/15778 16446/19242/16158
+f 16446/19242/16158 24739/18858/15778 30893/18849/15769 25965/19239/16155
+f 16441/19240/16156 16442/19243/16159 16447/19244/16160 16443/19245/16161
+f 16443/19245/16161 16447/19244/16160 24811/19246/16162 24812/19247/16163
+f 16442/19243/16159 25964/19235/16151 25963/19234/16150 16447/19244/16160
+f 16447/19244/16160 25963/19234/16150 30917/19237/16153 24811/19246/16162
+f 16441/19240/16156 16443/19245/16161 16448/19248/16164 16444/19249/16165
+f 16444/19249/16165 16448/19248/16164 25966/19250/16166 25967/19251/16167
+f 16443/19245/16161 24812/19247/16163 24813/19252/16168 16448/19248/16164
+f 16448/19248/16164 24813/19252/16168 30918/19253/16169 25966/19250/16166
+f 16441/19240/16156 16444/19249/16165 16449/19254/16170 16445/19241/16157
+f 16445/19241/16157 16449/19254/16170 24741/18864/15784 24740/18859/15779
+f 16444/19249/16165 25967/19251/16167 25968/19255/16171 16449/19254/16170
+f 16449/19254/16170 25968/19255/16171 30894/18865/15785 24741/18864/15784
+f 16450/19256/16172 16454/19257/16173 16455/19258/16174 16451/19259/16175
+f 16451/19259/16175 16455/19258/16174 25968/19255/16171 25967/19251/16167
+f 16454/19257/16173 24743/18875/15795 24742/18874/15794 16455/19258/16174
+f 16455/19258/16174 24742/18874/15794 30894/18865/15785 25968/19255/16171
+f 16450/19256/16172 16451/19259/16175 16456/19260/16176 16452/19261/16177
+f 16452/19261/16177 16456/19260/16176 24814/19262/16178 24815/19263/16179
+f 16451/19259/16175 25967/19251/16167 25966/19250/16166 16456/19260/16176
+f 16456/19260/16176 25966/19250/16166 30918/19253/16169 24814/19262/16178
+f 16450/19256/16172 16452/19261/16177 16457/19264/16180 16453/19265/16181
+f 16453/19265/16181 16457/19264/16180 25969/19266/16182 25970/19267/16183
+f 16452/19261/16177 24815/19263/16179 24816/19268/16184 16457/19264/16180
+f 16457/19264/16180 24816/19268/16184 30919/19269/16185 25969/19266/16182
+f 16450/19256/16172 16453/19265/16181 16458/19270/16186 16454/19257/16173
+f 16454/19257/16173 16458/19270/16186 24744/18880/15800 24743/18875/15795
+f 16453/19265/16181 25970/19267/16183 25971/19271/16187 16458/19270/16186
+f 16458/19270/16186 25971/19271/16187 30895/18881/15801 24744/18880/15800
+f 16459/19272/16188 16463/19273/16189 16464/19274/16190 16460/19275/16191
+f 16460/19275/16191 16464/19274/16190 25971/19271/16187 25970/19267/16183
+f 16463/19273/16189 24746/18891/15811 24745/18890/15810 16464/19274/16190
+f 16464/19274/16190 24745/18890/15810 30895/18881/15801 25971/19271/16187
+f 16459/19272/16188 16460/19275/16191 16465/19276/16192 16461/19277/16193
+f 16461/19277/16193 16465/19276/16192 24817/19278/16194 24818/19279/16195
+f 16460/19275/16191 25970/19267/16183 25969/19266/16182 16465/19276/16192
+f 16465/19276/16192 25969/19266/16182 30919/19269/16185 24817/19278/16194
+f 16459/19272/16188 16461/19277/16193 16466/19280/16196 16462/19281/16197
+f 16462/19281/16197 16466/19280/16196 25972/19282/16198 25973/19283/16199
+f 16461/19277/16193 24818/19279/16195 24819/19284/16200 16466/19280/16196
+f 16466/19280/16196 24819/19284/16200 30920/19285/16201 25972/19282/16198
+f 16459/19272/16188 16462/19281/16197 16467/19286/16202 16463/19273/16189
+f 16463/19273/16189 16467/19286/16202 24747/18896/15816 24746/18891/15811
+f 16462/19281/16197 25973/19283/16199 25974/19287/16203 16467/19286/16202
+f 16467/19286/16202 25974/19287/16203 30896/18897/15817 24747/18896/15816
+f 16468/19288/16204 16472/19289/16205 16473/19290/16206 16469/19291/16207
+f 16469/19291/16207 16473/19290/16206 25974/19287/16203 25973/19283/16199
+f 16472/19289/16205 24749/18907/15827 24748/18906/15826 16473/19290/16206
+f 16473/19290/16206 24748/18906/15826 30896/18897/15817 25974/19287/16203
+f 16468/19288/16204 16469/19291/16207 16474/19292/16208 16470/19293/16209
+f 16470/19293/16209 16474/19292/16208 24820/19294/16210 24821/19295/16211
+f 16469/19291/16207 25973/19283/16199 25972/19282/16198 16474/19292/16208
+f 16474/19292/16208 25972/19282/16198 30920/19285/16201 24820/19294/16210
+f 16468/19288/16204 16470/19293/16209 16475/19296/16212 16471/19297/16213
+f 16471/19297/16213 16475/19296/16212 25975/19298/16214 25976/19299/16215
+f 16470/19293/16209 24821/19295/16211 24822/19300/16216 16475/19296/16212
+f 16475/19296/16212 24822/19300/16216 30921/19301/16217 25975/19298/16214
+f 16468/19288/16204 16471/19297/16213 16476/19302/16218 16472/19289/16205
+f 16472/19289/16205 16476/19302/16218 24750/18912/15832 24749/18907/15827
+f 16471/19297/16213 25976/19299/16215 25977/19303/16219 16476/19302/16218
+f 16476/19302/16218 25977/19303/16219 30897/18913/15833 24750/18912/15832
+f 16477/19304/16220 16481/19305/16221 16482/19306/16222 16478/19307/16223
+f 16478/19307/16223 16482/19306/16222 25977/19303/16219 25976/19299/16215
+f 16481/19305/16221 24752/18923/15843 24751/18922/15842 16482/19306/16222
+f 16482/19306/16222 24751/18922/15842 30897/18913/15833 25977/19303/16219
+f 16477/19304/16220 16478/19307/16223 16483/19308/16224 16479/19309/16225
+f 16479/19309/16225 16483/19308/16224 24823/19310/16226 24824/19311/16227
+f 16478/19307/16223 25976/19299/16215 25975/19298/16214 16483/19308/16224
+f 16483/19308/16224 25975/19298/16214 30921/19301/16217 24823/19310/16226
+f 16477/19304/16220 16479/19309/16225 16484/19312/16228 16480/19313/16229
+f 16480/19313/16229 16484/19312/16228 25978/19314/16230 25979/19315/16231
+f 16479/19309/16225 24824/19311/16227 24825/19316/16232 16484/19312/16228
+f 16484/19312/16228 24825/19316/16232 30922/19317/16233 25978/19314/16230
+f 16477/19304/16220 16480/19313/16229 16485/19318/16234 16481/19305/16221
+f 16481/19305/16221 16485/19318/16234 24753/18928/15848 24752/18923/15843
+f 16480/19313/16229 25979/19315/16231 25980/19319/16235 16485/19318/16234
+f 16485/19318/16234 25980/19319/16235 30898/18929/15849 24753/18928/15848
+f 16486/19320/16236 16490/19321/16237 16491/19322/16238 16487/19323/16239
+f 16487/19323/16239 16491/19322/16238 25980/19319/16235 25979/19315/16231
+f 16490/19321/16237 24755/18939/15859 24754/18938/15858 16491/19322/16238
+f 16491/19322/16238 24754/18938/15858 30898/18929/15849 25980/19319/16235
+f 16486/19320/16236 16487/19323/16239 16492/19324/16240 16488/19325/16241
+f 16488/19325/16241 16492/19324/16240 24826/19326/16242 24827/19327/16243
+f 16487/19323/16239 25979/19315/16231 25978/19314/16230 16492/19324/16240
+f 16492/19324/16240 25978/19314/16230 30922/19317/16233 24826/19326/16242
+f 16486/19320/16236 16488/19325/16241 16493/19328/16244 16489/19329/16245
+f 16489/19329/16245 16493/19328/16244 25981/19330/16246 25982/19331/16247
+f 16488/19325/16241 24827/19327/16243 24828/19332/16248 16493/19328/16244
+f 16493/19328/16244 24828/19332/16248 30923/19333/16249 25981/19330/16246
+f 16486/19320/16236 16489/19329/16245 16494/19334/16250 16490/19321/16237
+f 16490/19321/16237 16494/19334/16250 24756/18944/15864 24755/18939/15859
+f 16489/19329/16245 25982/19331/16247 25983/19335/16251 16494/19334/16250
+f 16494/19334/16250 25983/19335/16251 30899/18945/15865 24756/18944/15864
+f 16495/19336/16252 16499/19337/16253 16500/19338/16254 16496/19339/16255
+f 16496/19339/16255 16500/19338/16254 25983/19335/16251 25982/19331/16247
+f 16499/19337/16253 24758/18955/15875 24757/18954/15874 16500/19338/16254
+f 16500/19338/16254 24757/18954/15874 30899/18945/15865 25983/19335/16251
+f 16495/19336/16252 16496/19339/16255 16501/19340/16256 16497/19341/16257
+f 16497/19341/16257 16501/19340/16256 24829/19342/16258 24830/19343/16259
+f 16496/19339/16255 25982/19331/16247 25981/19330/16246 16501/19340/16256
+f 16501/19340/16256 25981/19330/16246 30923/19333/16249 24829/19342/16258
+f 16495/19336/16252 16497/19341/16257 16502/19344/16260 16498/19345/16261
+f 16498/19345/16261 16502/19344/16260 25984/19346/16262 25985/19347/16263
+f 16497/19341/16257 24830/19343/16259 24831/19348/16264 16502/19344/16260
+f 16502/19344/16260 24831/19348/16264 30924/19349/16265 25984/19346/16262
+f 16495/19336/16252 16498/19345/16261 16503/19350/16266 16499/19337/16253
+f 16499/19337/16253 16503/19350/16266 24759/18960/15880 24758/18955/15875
+f 16498/19345/16261 25985/19347/16263 25986/19351/16267 16503/19350/16266
+f 16503/19350/16266 25986/19351/16267 30900/18961/15881 24759/18960/15880
+f 16504/19352/16268 16508/19353/16269 16509/19354/16270 16505/19355/16271
+f 16505/19355/16271 16509/19354/16270 25986/19351/16267 25985/19347/16263
+f 16508/19353/16269 24761/18971/15891 24760/18970/15890 16509/19354/16270
+f 16509/19354/16270 24760/18970/15890 30900/18961/15881 25986/19351/16267
+f 16504/19352/16268 16505/19355/16271 16510/19356/16272 16506/19357/16273
+f 16506/19357/16273 16510/19356/16272 24832/19358/16274 24833/19359/16275
+f 16505/19355/16271 25985/19347/16263 25984/19346/16262 16510/19356/16272
+f 16510/19356/16272 25984/19346/16262 30924/19349/16265 24832/19358/16274
+f 16504/19352/16268 16506/19357/16273 16511/19360/16276 16507/19361/16277
+f 16507/19361/16277 16511/19360/16276 25987/19362/16278 25988/19363/16279
+f 16506/19357/16273 24833/19359/16275 24834/19364/16280 16511/19360/16276
+f 16511/19360/16276 24834/19364/16280 30925/19365/16281 25987/19362/16278
+f 16504/19352/16268 16507/19361/16277 16512/19366/16282 16508/19353/16269
+f 16508/19353/16269 16512/19366/16282 24762/18976/15896 24761/18971/15891
+f 16507/19361/16277 25988/19363/16279 25989/19367/16283 16512/19366/16282
+f 16512/19366/16282 25989/19367/16283 30901/18977/15897 24762/18976/15896
+f 16513/19368/16284 16517/19369/16285 16518/19370/16286 16514/19371/16287
+f 16514/19371/16287 16518/19370/16286 25989/19367/16283 25988/19363/16279
+f 16517/19369/16285 24764/18987/15907 24763/18986/15906 16518/19370/16286
+f 16518/19370/16286 24763/18986/15906 30901/18977/15897 25989/19367/16283
+f 16513/19368/16284 16514/19371/16287 16519/19372/16288 16515/19373/16289
+f 16515/19373/16289 16519/19372/16288 24835/19374/16290 24836/19375/16291
+f 16514/19371/16287 25988/19363/16279 25987/19362/16278 16519/19372/16288
+f 16519/19372/16288 25987/19362/16278 30925/19365/16281 24835/19374/16290
+f 16513/19368/16284 16515/19373/16289 16520/19376/16292 16516/19377/16293
+f 16516/19377/16293 16520/19376/16292 25990/19378/16294 25991/19379/16295
+f 16515/19373/16289 24836/19375/16291 24837/19380/16296 16520/19376/16292
+f 16520/19376/16292 24837/19380/16296 30926/19381/16297 25990/19378/16294
+f 16513/19368/16284 16516/19377/16293 16521/19382/16298 16517/19369/16285
+f 16517/19369/16285 16521/19382/16298 24765/18992/15912 24764/18987/15907
+f 16516/19377/16293 25991/19379/16295 25992/19383/16299 16521/19382/16298
+f 16521/19382/16298 25992/19383/16299 30902/18993/15913 24765/18992/15912
+f 16522/19384/16300 16526/19385/16301 16527/19386/16302 16523/19387/16303
+f 16523/19387/16303 16527/19386/16302 25992/19388/16299 25991/19389/16295
+f 16526/19385/16301 24767/19005/15923 24766/19004/15922 16527/19386/16302
+f 16527/19386/16302 24766/19004/15922 30902/19007/15913 25992/19388/16299
+f 16522/19384/16300 16523/19387/16303 16528/19390/16304 16524/19391/16305
+f 16524/19391/16305 16528/19390/16304 24838/19392/16306 24839/19393/16307
+f 16523/19387/16303 25991/19389/16295 25990/19394/16294 16528/19390/16304
+f 16528/19390/16304 25990/19394/16294 30926/19395/16297 24838/19392/16306
+f 16522/19384/16300 16524/19391/16305 16529/19396/16308 16525/19397/16309
+f 16525/19397/16309 16529/19396/16308 25993/19398/16310 25994/19399/16311
+f 16524/19391/16305 24839/19393/16307 24840/19400/16312 16529/19396/16308
+f 16529/19396/16308 24840/19400/16312 30927/19401/16313 25993/19398/16310
+f 16522/19384/16300 16525/19397/16309 16530/19402/16314 16526/19385/16301
+f 16526/19385/16301 16530/19402/16314 24768/19012/15928 24767/19005/15923
+f 16525/19397/16309 25994/19399/16311 25995/19403/16315 16530/19402/16314
+f 16530/19402/16314 25995/19403/16315 30903/19013/15929 24768/19012/15928
+f 16531/19404/16316 16535/19405/16317 16536/19406/16318 16532/19407/16319
+f 16532/19407/16319 16536/19406/16318 25995/19403/16315 25994/19399/16311
+f 16535/19405/16317 24770/19023/15939 24769/19022/15938 16536/19406/16318
+f 16536/19406/16318 24769/19022/15938 30903/19013/15929 25995/19403/16315
+f 16531/19404/16316 16532/19407/16319 16537/19408/16320 16533/19409/16321
+f 16533/19409/16321 16537/19408/16320 24841/19410/16322 24842/19411/16323
+f 16532/19407/16319 25994/19399/16311 25993/19398/16310 16537/19408/16320
+f 16537/19408/16320 25993/19398/16310 30927/19401/16313 24841/19410/16322
+f 16531/19404/16316 16533/19409/16321 16538/19412/16324 16534/19413/16325
+f 16534/19413/16325 16538/19412/16324 25996/19414/16326 25997/19415/16327
+f 16533/19409/16321 24842/19411/16323 24843/19416/16328 16538/19412/16324
+f 16538/19412/16324 24843/19416/16328 30928/19417/16329 25996/19414/16326
+f 16531/19404/16316 16534/19413/16325 16539/19418/16330 16535/19405/16317
+f 16535/19405/16317 16539/19418/16330 24771/19028/15944 24770/19023/15939
+f 16534/19413/16325 25997/19415/16327 25998/19419/16331 16539/19418/16330
+f 16539/19418/16330 25998/19419/16331 30904/19029/15945 24771/19028/15944
+f 16540/19420/16332 16544/19421/16333 16545/19422/16334 16541/19423/16335
+f 16541/19423/16335 16545/19422/16334 25998/19419/16331 25997/19415/16327
+f 16544/19421/16333 24773/19039/15955 24772/19038/15954 16545/19422/16334
+f 16545/19422/16334 24772/19038/15954 30904/19029/15945 25998/19419/16331
+f 16540/19420/16332 16541/19423/16335 16546/19424/16336 16542/19425/16337
+f 16542/19425/16337 16546/19424/16336 24844/19426/16338 24845/19427/16339
+f 16541/19423/16335 25997/19415/16327 25996/19414/16326 16546/19424/16336
+f 16546/19424/16336 25996/19414/16326 30928/19417/16329 24844/19426/16338
+f 16540/19420/16332 16542/19425/16337 16547/19428/16340 16543/19429/16341
+f 16543/19429/16341 16547/19428/16340 25999/19430/16342 26000/19431/16343
+f 16542/19425/16337 24845/19427/16339 24846/19432/16344 16547/19428/16340
+f 16547/19428/16340 24846/19432/16344 30929/19433/16345 25999/19430/16342
+f 16540/19420/16332 16543/19429/16341 16548/19434/16346 16544/19421/16333
+f 16544/19421/16333 16548/19434/16346 24774/19044/15960 24773/19039/15955
+f 16543/19429/16341 26000/19431/16343 26001/19435/16347 16548/19434/16346
+f 16548/19434/16346 26001/19435/16347 30905/19045/15961 24774/19044/15960
+f 16549/19436/16348 16553/19437/16349 16554/19438/16350 16550/19439/16351
+f 16550/19439/16351 16554/19438/16350 26001/19435/16347 26000/19431/16343
+f 16553/19437/16349 24776/19055/15971 24775/19054/15970 16554/19438/16350
+f 16554/19438/16350 24775/19054/15970 30905/19045/15961 26001/19435/16347
+f 16549/19436/16348 16550/19439/16351 16555/19440/16352 16551/19441/16353
+f 16551/19441/16353 16555/19440/16352 24847/19442/16354 24848/19443/16355
+f 16550/19439/16351 26000/19431/16343 25999/19430/16342 16555/19440/16352
+f 16555/19440/16352 25999/19430/16342 30929/19433/16345 24847/19442/16354
+f 16549/19436/16348 16551/19441/16353 16556/19444/16356 16552/19445/16357
+f 16552/19445/16357 16556/19444/16356 26002/19446/16358 26003/19447/16359
+f 16551/19441/16353 24848/19443/16355 24849/19448/16360 16556/19444/16356
+f 16556/19444/16356 24849/19448/16360 30930/19449/16361 26002/19446/16358
+f 16549/19436/16348 16552/19445/16357 16557/19450/16362 16553/19437/16349
+f 16553/19437/16349 16557/19450/16362 24777/19060/15976 24776/19055/15971
+f 16552/19445/16357 26003/19447/16359 26004/19451/16363 16557/19450/16362
+f 16557/19450/16362 26004/19451/16363 30906/19061/15977 24777/19060/15976
+f 16558/19452/16364 16562/19453/16365 16563/19454/16366 16559/19455/16367
+f 16559/19455/16367 16563/19454/16366 26004/19451/16363 26003/19447/16359
+f 16562/19453/16365 24779/19071/15987 24778/19070/15986 16563/19454/16366
+f 16563/19454/16366 24778/19070/15986 30906/19061/15977 26004/19451/16363
+f 16558/19452/16364 16559/19455/16367 16564/19456/16368 16560/19457/16369
+f 16560/19457/16369 16564/19456/16368 24850/19458/16370 24851/19459/16371
+f 16559/19455/16367 26003/19447/16359 26002/19446/16358 16564/19456/16368
+f 16564/19456/16368 26002/19446/16358 30930/19449/16361 24850/19458/16370
+f 16558/19452/16364 16560/19457/16369 16565/19460/16372 16561/19461/16373
+f 16561/19461/16373 16565/19460/16372 26005/19462/16374 26006/19463/16375
+f 16560/19457/16369 24851/19459/16371 24852/19464/16376 16565/19460/16372
+f 16565/19460/16372 24852/19464/16376 30931/19465/16377 26005/19462/16374
+f 16558/19452/16364 16561/19461/16373 16566/19466/16378 16562/19453/16365
+f 16562/19453/16365 16566/19466/16378 24780/19076/15992 24779/19071/15987
+f 16561/19461/16373 26006/19463/16375 26007/19467/16379 16566/19466/16378
+f 16566/19466/16378 26007/19467/16379 30907/19077/15993 24780/19076/15992
+f 16567/19468/16380 16571/19469/16381 16572/19470/16382 16568/19471/16383
+f 16568/19471/16383 16572/19470/16382 26007/19467/16379 26006/19463/16375
+f 16571/19469/16381 24782/19087/16003 24781/19086/16002 16572/19470/16382
+f 16572/19470/16382 24781/19086/16002 30907/19077/15993 26007/19467/16379
+f 16567/19468/16380 16568/19471/16383 16573/19472/16384 16569/19473/16385
+f 16569/19473/16385 16573/19472/16384 24853/19474/16386 24854/19475/16387
+f 16568/19471/16383 26006/19463/16375 26005/19462/16374 16573/19472/16384
+f 16573/19472/16384 26005/19462/16374 30931/19465/16377 24853/19474/16386
+f 16567/19468/16380 16569/19473/16385 16574/19476/16388 16570/19477/16389
+f 16570/19477/16389 16574/19476/16388 26008/19478/16390 26009/19479/16391
+f 16569/19473/16385 24854/19475/16387 24855/19480/16392 16574/19476/16388
+f 16574/19476/16388 24855/19480/16392 30932/19481/16393 26008/19478/16390
+f 16567/19468/16380 16570/19477/16389 16575/19482/16394 16571/19469/16381
+f 16571/19469/16381 16575/19482/16394 24783/19092/16008 24782/19087/16003
+f 16570/19477/16389 26009/19479/16391 26010/19483/16395 16575/19482/16394
+f 16575/19482/16394 26010/19483/16395 30908/19093/16009 24783/19092/16008
+f 16576/19484/16396 16580/19485/16397 16581/19486/16398 16577/19487/16399
+f 16577/19487/16399 16581/19486/16398 26010/19483/16395 26009/19479/16391
+f 16580/19485/16397 24785/19103/16019 24784/19102/16018 16581/19486/16398
+f 16581/19486/16398 24784/19102/16018 30908/19093/16009 26010/19483/16395
+f 16576/19484/16396 16577/19487/16399 16582/19488/16400 16578/19489/16401
+f 16578/19489/16401 16582/19488/16400 24856/19490/16402 24857/19491/16403
+f 16577/19487/16399 26009/19479/16391 26008/19478/16390 16582/19488/16400
+f 16582/19488/16400 26008/19478/16390 30932/19481/16393 24856/19490/16402
+f 16576/19484/16396 16578/19489/16401 16583/19492/16404 16579/19493/16405
+f 16579/19493/16405 16583/19492/16404 25941/19118/16034 25940/19113/16029
+f 16578/19489/16401 24857/19491/16403 24858/19494/16406 16583/19492/16404
+f 16583/19492/16404 24858/19494/16406 30909/19119/16035 25941/19118/16034
+f 16576/19484/16396 16579/19493/16405 16584/19495/16407 16580/19485/16397
+f 16580/19485/16397 16584/19495/16407 24786/19106/16022 24785/19103/16019
+f 16579/19493/16405 25940/19113/16029 25939/19112/16028 16584/19495/16407
+f 16584/19495/16407 25939/19112/16028 30885/18731/15651 24786/19106/16022
+f 16585/19496/16408 16589/19497/16409 16590/19498/16410 16586/19499/16411
+f 16586/19499/16411 16590/19498/16410 26011/19500/16412 26012/19501/16413
+f 16589/19497/16409 24788/19117/16033 24787/19116/16032 16590/19498/16410
+f 16590/19498/16410 24787/19116/16032 30909/19119/16035 26011/19500/16412
+f 16585/19496/16408 16586/19499/16411 16591/19502/16414 16587/19503/16415
+f 16587/19503/16415 16591/19502/16414 26371/19504/16416 26372/19505/16417
+f 16586/19499/16411 26012/19501/16413 26013/19506/16418 16591/19502/16414
+f 16591/19502/16414 26013/19506/16418 31005/19507/16419 26371/19504/16416
+f 16585/19496/16408 16587/19503/16415 16592/19508/16420 16588/19509/16421
+f 16588/19509/16421 16592/19508/16420 26014/19510/16422 26015/19511/16423
+f 16587/19503/16415 26372/19505/16417 26373/19512/16424 16592/19508/16420
+f 16592/19508/16420 26373/19512/16424 31028/19513/16425 26014/19510/16422
+f 16585/19496/16408 16588/19509/16421 16593/19514/16426 16589/19497/16409
+f 16589/19497/16409 16593/19514/16426 24789/19124/16040 24788/19117/16033
+f 16588/19509/16421 26015/19511/16423 26016/19515/16427 16593/19514/16426
+f 16593/19514/16426 26016/19515/16427 30910/19125/16041 24789/19124/16040
+f 16594/19516/16428 16598/19517/16429 16599/19518/16430 16595/19519/16431
+f 16595/19519/16431 16599/19518/16430 26016/19515/16427 26015/19511/16423
+f 16598/19517/16429 24791/19135/16051 24790/19134/16050 16599/19518/16430
+f 16599/19518/16430 24790/19134/16050 30910/19125/16041 26016/19515/16427
+f 16594/19516/16428 16595/19519/16431 16600/19520/16432 16596/19521/16433
+f 16596/19521/16433 16600/19520/16432 26368/19522/16434 26369/19523/16435
+f 16595/19519/16431 26015/19511/16423 26014/19510/16422 16600/19520/16432
+f 16600/19520/16432 26014/19510/16422 31028/19513/16425 26368/19522/16434
+f 16594/19516/16428 16596/19521/16433 16601/19524/16436 16597/19525/16437
+f 16597/19525/16437 16601/19524/16436 26017/19526/16438 26018/19527/16439
+f 16596/19521/16433 26369/19523/16435 26370/19528/16440 16601/19524/16436
+f 16601/19524/16436 26370/19528/16440 31027/19529/16441 26017/19526/16438
+f 16594/19516/16428 16597/19525/16437 16602/19530/16442 16598/19517/16429
+f 16598/19517/16429 16602/19530/16442 24792/19140/16056 24791/19135/16051
+f 16597/19525/16437 26018/19527/16439 26019/19531/16443 16602/19530/16442
+f 16602/19530/16442 26019/19531/16443 30911/19141/16057 24792/19140/16056
+f 16603/19532/16444 16607/19533/16445 16608/19534/16446 16604/19535/16447
+f 16604/19535/16447 16608/19534/16446 26019/19531/16443 26018/19527/16439
+f 16607/19533/16445 24794/19151/16067 24793/19150/16066 16608/19534/16446
+f 16608/19534/16446 24793/19150/16066 30911/19141/16057 26019/19531/16443
+f 16603/19532/16444 16604/19535/16447 16609/19536/16448 16605/19537/16449
+f 16605/19537/16449 16609/19536/16448 26365/19538/16450 26366/19539/16451
+f 16604/19535/16447 26018/19527/16439 26017/19526/16438 16609/19536/16448
+f 16609/19536/16448 26017/19526/16438 31027/19529/16441 26365/19538/16450
+f 16603/19532/16444 16605/19537/16449 16610/19540/16452 16606/19541/16453
+f 16606/19541/16453 16610/19540/16452 26020/19542/16454 26021/19543/16455
+f 16605/19537/16449 26366/19539/16451 26367/19544/16456 16610/19540/16452
+f 16610/19540/16452 26367/19544/16456 31026/19545/16457 26020/19542/16454
+f 16603/19532/16444 16606/19541/16453 16611/19546/16458 16607/19533/16445
+f 16607/19533/16445 16611/19546/16458 24795/19156/16072 24794/19151/16067
+f 16606/19541/16453 26021/19543/16455 26022/19547/16459 16611/19546/16458
+f 16611/19546/16458 26022/19547/16459 30912/19157/16073 24795/19156/16072
+f 16612/19548/16460 16616/19549/16461 16617/19550/16462 16613/19551/16463
+f 16613/19551/16463 16617/19550/16462 26022/19547/16459 26021/19543/16455
+f 16616/19549/16461 24797/19167/16083 24796/19166/16082 16617/19550/16462
+f 16617/19550/16462 24796/19166/16082 30912/19157/16073 26022/19547/16459
+f 16612/19548/16460 16613/19551/16463 16618/19552/16464 16614/19553/16465
+f 16614/19553/16465 16618/19552/16464 26362/19554/16466 26363/19555/16467
+f 16613/19551/16463 26021/19543/16455 26020/19542/16454 16618/19552/16464
+f 16618/19552/16464 26020/19542/16454 31026/19545/16457 26362/19554/16466
+f 16612/19548/16460 16614/19553/16465 16619/19556/16468 16615/19557/16469
+f 16615/19557/16469 16619/19556/16468 26023/19558/16470 26024/19559/16471
+f 16614/19553/16465 26363/19555/16467 26364/19560/16472 16619/19556/16468
+f 16619/19556/16468 26364/19560/16472 31025/19561/16473 26023/19558/16470
+f 16612/19548/16460 16615/19557/16469 16620/19562/16474 16616/19549/16461
+f 16616/19549/16461 16620/19562/16474 24798/19172/16088 24797/19167/16083
+f 16615/19557/16469 26024/19559/16471 26025/19563/16475 16620/19562/16474
+f 16620/19562/16474 26025/19563/16475 30913/19173/16089 24798/19172/16088
+f 16621/19564/16476 16625/19565/16477 16626/19566/16478 16622/19567/16479
+f 16622/19567/16479 16626/19566/16478 26025/19563/16475 26024/19559/16471
+f 16625/19565/16477 24800/19183/16099 24799/19182/16098 16626/19566/16478
+f 16626/19566/16478 24799/19182/16098 30913/19173/16089 26025/19563/16475
+f 16621/19564/16476 16622/19567/16479 16627/19568/16480 16623/19569/16481
+f 16623/19569/16481 16627/19568/16480 26359/19570/16482 26360/19571/16483
+f 16622/19567/16479 26024/19559/16471 26023/19558/16470 16627/19568/16480
+f 16627/19568/16480 26023/19558/16470 31025/19561/16473 26359/19570/16482
+f 16621/19564/16476 16623/19569/16481 16628/19572/16484 16624/19573/16485
+f 16624/19573/16485 16628/19572/16484 26026/19574/16486 26027/19575/16487
+f 16623/19569/16481 26360/19571/16483 26361/19576/16488 16628/19572/16484
+f 16628/19572/16484 26361/19576/16488 31024/19577/16489 26026/19574/16486
+f 16621/19564/16476 16624/19573/16485 16629/19578/16490 16625/19565/16477
+f 16625/19565/16477 16629/19578/16490 24801/19188/16104 24800/19183/16099
+f 16624/19573/16485 26027/19575/16487 26028/19579/16491 16629/19578/16490
+f 16629/19578/16490 26028/19579/16491 30914/19189/16105 24801/19188/16104
+f 16630/19580/16492 16634/19581/16493 16635/19582/16494 16631/19583/16495
+f 16631/19583/16495 16635/19582/16494 26028/19579/16491 26027/19575/16487
+f 16634/19581/16493 24803/19199/16115 24802/19198/16114 16635/19582/16494
+f 16635/19582/16494 24802/19198/16114 30914/19189/16105 26028/19579/16491
+f 16630/19580/16492 16631/19583/16495 16636/19584/16496 16632/19585/16497
+f 16632/19585/16497 16636/19584/16496 26356/19586/16498 26357/19587/16499
+f 16631/19583/16495 26027/19575/16487 26026/19574/16486 16636/19584/16496
+f 16636/19584/16496 26026/19574/16486 31024/19577/16489 26356/19586/16498
+f 16630/19580/16492 16632/19585/16497 16637/19588/16500 16633/19589/16501
+f 16633/19589/16501 16637/19588/16500 26029/19590/16502 26030/19591/16503
+f 16632/19585/16497 26357/19587/16499 26358/19592/16504 16637/19588/16500
+f 16637/19588/16500 26358/19592/16504 31023/19593/16505 26029/19590/16502
+f 16630/19580/16492 16633/19589/16501 16638/19594/16506 16634/19581/16493
+f 16634/19581/16493 16638/19594/16506 24804/19204/16120 24803/19199/16115
+f 16633/19589/16501 26030/19591/16503 26031/19595/16507 16638/19594/16506
+f 16638/19594/16506 26031/19595/16507 30915/19205/16121 24804/19204/16120
+f 16639/19596/16508 16643/19597/16509 16644/19598/16510 16640/19599/16511
+f 16640/19599/16511 16644/19598/16510 26031/19595/16507 26030/19591/16503
+f 16643/19597/16509 24806/19215/16131 24805/19214/16130 16644/19598/16510
+f 16644/19598/16510 24805/19214/16130 30915/19205/16121 26031/19595/16507
+f 16639/19596/16508 16640/19599/16511 16645/19600/16512 16641/19601/16513
+f 16641/19601/16513 16645/19600/16512 26353/19602/16514 26354/19603/16515
+f 16640/19599/16511 26030/19591/16503 26029/19590/16502 16645/19600/16512
+f 16645/19600/16512 26029/19590/16502 31023/19593/16505 26353/19602/16514
+f 16639/19596/16508 16641/19601/16513 16646/19604/16516 16642/19605/16517
+f 16642/19605/16517 16646/19604/16516 26032/19606/16518 26033/19607/16519
+f 16641/19601/16513 26354/19603/16515 26355/19608/16520 16646/19604/16516
+f 16646/19604/16516 26355/19608/16520 31022/19609/16521 26032/19606/16518
+f 16639/19596/16508 16642/19605/16517 16647/19610/16522 16643/19597/16509
+f 16643/19597/16509 16647/19610/16522 24807/19220/16136 24806/19215/16131
+f 16642/19605/16517 26033/19607/16519 26034/19611/16523 16647/19610/16522
+f 16647/19610/16522 26034/19611/16523 30916/19221/16137 24807/19220/16136
+f 16648/19612/16524 16652/19613/16525 16653/19614/16526 16649/19615/16527
+f 16649/19615/16527 16653/19614/16526 26034/19611/16523 26033/19607/16519
+f 16652/19613/16525 24809/19231/16147 24808/19230/16146 16653/19614/16526
+f 16653/19614/16526 24808/19230/16146 30916/19221/16137 26034/19611/16523
+f 16648/19612/16524 16649/19615/16527 16654/19616/16528 16650/19617/16529
+f 16650/19617/16529 16654/19616/16528 26350/19618/16530 26351/19619/16531
+f 16649/19615/16527 26033/19607/16519 26032/19606/16518 16654/19616/16528
+f 16654/19616/16528 26032/19606/16518 31022/19609/16521 26350/19618/16530
+f 16648/19612/16524 16650/19617/16529 16655/19620/16532 16651/19621/16533
+f 16651/19621/16533 16655/19620/16532 26035/19622/16534 26036/19623/16535
+f 16650/19617/16529 26351/19619/16531 26352/19624/16536 16655/19620/16532
+f 16655/19620/16532 26352/19624/16536 31021/19625/16537 26035/19622/16534
+f 16648/19612/16524 16651/19621/16533 16656/19626/16538 16652/19613/16525
+f 16652/19613/16525 16656/19626/16538 24810/19236/16152 24809/19231/16147
+f 16651/19621/16533 26036/19623/16535 26037/19627/16539 16656/19626/16538
+f 16656/19626/16538 26037/19627/16539 30917/19237/16153 24810/19236/16152
+f 16657/19628/16540 16661/19629/16541 16662/19630/16542 16658/19631/16543
+f 16658/19631/16543 16662/19630/16542 26037/19627/16539 26036/19623/16535
+f 16661/19629/16541 24812/19247/16163 24811/19246/16162 16662/19630/16542
+f 16662/19630/16542 24811/19246/16162 30917/19237/16153 26037/19627/16539
+f 16657/19628/16540 16658/19631/16543 16663/19632/16544 16659/19633/16545
+f 16659/19633/16545 16663/19632/16544 26347/19634/16546 26348/19635/16547
+f 16658/19631/16543 26036/19623/16535 26035/19622/16534 16663/19632/16544
+f 16663/19632/16544 26035/19622/16534 31021/19625/16537 26347/19634/16546
+f 16657/19628/16540 16659/19633/16545 16664/19636/16548 16660/19637/16549
+f 16660/19637/16549 16664/19636/16548 26038/19638/16550 26039/19639/16551
+f 16659/19633/16545 26348/19635/16547 26349/19640/16552 16664/19636/16548
+f 16664/19636/16548 26349/19640/16552 31020/19641/16553 26038/19638/16550
+f 16657/19628/16540 16660/19637/16549 16665/19642/16554 16661/19629/16541
+f 16661/19629/16541 16665/19642/16554 24813/19252/16168 24812/19247/16163
+f 16660/19637/16549 26039/19639/16551 26040/19643/16555 16665/19642/16554
+f 16665/19642/16554 26040/19643/16555 30918/19253/16169 24813/19252/16168
+f 16666/19644/16556 16670/19645/16557 16671/19646/16558 16667/19647/16559
+f 16667/19647/16559 16671/19646/16558 26040/19643/16555 26039/19639/16551
+f 16670/19645/16557 24815/19263/16179 24814/19262/16178 16671/19646/16558
+f 16671/19646/16558 24814/19262/16178 30918/19253/16169 26040/19643/16555
+f 16666/19644/16556 16667/19647/16559 16672/19648/16560 16668/19649/16561
+f 16668/19649/16561 16672/19648/16560 26344/19650/16562 26345/19651/16563
+f 16667/19647/16559 26039/19639/16551 26038/19638/16550 16672/19648/16560
+f 16672/19648/16560 26038/19638/16550 31020/19641/16553 26344/19650/16562
+f 16666/19644/16556 16668/19649/16561 16673/19652/16564 16669/19653/16565
+f 16669/19653/16565 16673/19652/16564 26041/19654/16566 26042/19655/16567
+f 16668/19649/16561 26345/19651/16563 26346/19656/16568 16673/19652/16564
+f 16673/19652/16564 26346/19656/16568 31019/19657/16569 26041/19654/16566
+f 16666/19644/16556 16669/19653/16565 16674/19658/16570 16670/19645/16557
+f 16670/19645/16557 16674/19658/16570 24816/19268/16184 24815/19263/16179
+f 16669/19653/16565 26042/19655/16567 26043/19659/16571 16674/19658/16570
+f 16674/19658/16570 26043/19659/16571 30919/19269/16185 24816/19268/16184
+f 16675/19660/16572 16679/19661/16573 16680/19662/16574 16676/19663/16575
+f 16676/19663/16575 16680/19662/16574 26043/19659/16571 26042/19655/16567
+f 16679/19661/16573 24818/19279/16195 24817/19278/16194 16680/19662/16574
+f 16680/19662/16574 24817/19278/16194 30919/19269/16185 26043/19659/16571
+f 16675/19660/16572 16676/19663/16575 16681/19664/16576 16677/19665/16577
+f 16677/19665/16577 16681/19664/16576 26341/19666/16578 26342/19667/16579
+f 16676/19663/16575 26042/19655/16567 26041/19654/16566 16681/19664/16576
+f 16681/19664/16576 26041/19654/16566 31019/19657/16569 26341/19666/16578
+f 16675/19660/16572 16677/19665/16577 16682/19668/16580 16678/19669/16581
+f 16678/19669/16581 16682/19668/16580 26044/19670/16582 26045/19671/16583
+f 16677/19665/16577 26342/19667/16579 26343/19672/16584 16682/19668/16580
+f 16682/19668/16580 26343/19672/16584 31018/19673/16585 26044/19670/16582
+f 16675/19660/16572 16678/19669/16581 16683/19674/16586 16679/19661/16573
+f 16679/19661/16573 16683/19674/16586 24819/19284/16200 24818/19279/16195
+f 16678/19669/16581 26045/19671/16583 26046/19675/16587 16683/19674/16586
+f 16683/19674/16586 26046/19675/16587 30920/19285/16201 24819/19284/16200
+f 16684/19676/16588 16688/19677/16589 16689/19678/16590 16685/19679/16591
+f 16685/19679/16591 16689/19678/16590 26046/19675/16587 26045/19671/16583
+f 16688/19677/16589 24821/19295/16211 24820/19294/16210 16689/19678/16590
+f 16689/19678/16590 24820/19294/16210 30920/19285/16201 26046/19675/16587
+f 16684/19676/16588 16685/19679/16591 16690/19680/16592 16686/19681/16593
+f 16686/19681/16593 16690/19680/16592 26338/19682/16594 26339/19683/16595
+f 16685/19679/16591 26045/19671/16583 26044/19670/16582 16690/19680/16592
+f 16690/19680/16592 26044/19670/16582 31018/19673/16585 26338/19682/16594
+f 16684/19676/16588 16686/19681/16593 16691/19684/16596 16687/19685/16597
+f 16687/19685/16597 16691/19684/16596 26047/19686/16598 26048/19687/16599
+f 16686/19681/16593 26339/19683/16595 26340/19688/16600 16691/19684/16596
+f 16691/19684/16596 26340/19688/16600 31017/19689/16601 26047/19686/16598
+f 16684/19676/16588 16687/19685/16597 16692/19690/16602 16688/19677/16589
+f 16688/19677/16589 16692/19690/16602 24822/19300/16216 24821/19295/16211
+f 16687/19685/16597 26048/19687/16599 26049/19691/16603 16692/19690/16602
+f 16692/19690/16602 26049/19691/16603 30921/19301/16217 24822/19300/16216
+f 16693/19692/16604 16697/19693/16605 16698/19694/16606 16694/19695/16607
+f 16694/19695/16607 16698/19694/16606 26049/19691/16603 26048/19687/16599
+f 16697/19693/16605 24824/19311/16227 24823/19310/16226 16698/19694/16606
+f 16698/19694/16606 24823/19310/16226 30921/19301/16217 26049/19691/16603
+f 16693/19692/16604 16694/19695/16607 16699/19696/16608 16695/19697/16609
+f 16695/19697/16609 16699/19696/16608 26335/19698/16610 26336/19699/16611
+f 16694/19695/16607 26048/19687/16599 26047/19686/16598 16699/19696/16608
+f 16699/19696/16608 26047/19686/16598 31017/19689/16601 26335/19698/16610
+f 16693/19692/16604 16695/19697/16609 16700/19700/16612 16696/19701/16613
+f 16696/19701/16613 16700/19700/16612 26050/19702/16614 26051/19703/16615
+f 16695/19697/16609 26336/19699/16611 26337/19704/16616 16700/19700/16612
+f 16700/19700/16612 26337/19704/16616 31016/19705/16617 26050/19702/16614
+f 16693/19692/16604 16696/19701/16613 16701/19706/16618 16697/19693/16605
+f 16697/19693/16605 16701/19706/16618 24825/19316/16232 24824/19311/16227
+f 16696/19701/16613 26051/19703/16615 26052/19707/16619 16701/19706/16618
+f 16701/19706/16618 26052/19707/16619 30922/19317/16233 24825/19316/16232
+f 16702/19708/16620 16706/19709/16621 16707/19710/16622 16703/19711/16623
+f 16703/19711/16623 16707/19710/16622 26052/19707/16619 26051/19703/16615
+f 16706/19709/16621 24827/19327/16243 24826/19326/16242 16707/19710/16622
+f 16707/19710/16622 24826/19326/16242 30922/19317/16233 26052/19707/16619
+f 16702/19708/16620 16703/19711/16623 16708/19712/16624 16704/19713/16625
+f 16704/19713/16625 16708/19712/16624 26332/19714/16626 26333/19715/16627
+f 16703/19711/16623 26051/19703/16615 26050/19702/16614 16708/19712/16624
+f 16708/19712/16624 26050/19702/16614 31016/19705/16617 26332/19714/16626
+f 16702/19708/16620 16704/19713/16625 16709/19716/16628 16705/19717/16629
+f 16705/19717/16629 16709/19716/16628 26053/19718/16630 26054/19719/16631
+f 16704/19713/16625 26333/19715/16627 26334/19720/16632 16709/19716/16628
+f 16709/19716/16628 26334/19720/16632 31015/19721/16633 26053/19718/16630
+f 16702/19708/16620 16705/19717/16629 16710/19722/16634 16706/19709/16621
+f 16706/19709/16621 16710/19722/16634 24828/19332/16248 24827/19327/16243
+f 16705/19717/16629 26054/19719/16631 26055/19723/16635 16710/19722/16634
+f 16710/19722/16634 26055/19723/16635 30923/19333/16249 24828/19332/16248
+f 16711/19724/16636 16715/19725/16637 16716/19726/16638 16712/19727/16639
+f 16712/19727/16639 16716/19726/16638 26055/19723/16635 26054/19719/16631
+f 16715/19725/16637 24830/19343/16259 24829/19342/16258 16716/19726/16638
+f 16716/19726/16638 24829/19342/16258 30923/19333/16249 26055/19723/16635
+f 16711/19724/16636 16712/19727/16639 16717/19728/16640 16713/19729/16641
+f 16713/19729/16641 16717/19728/16640 26329/19730/16642 26330/19731/16643
+f 16712/19727/16639 26054/19719/16631 26053/19718/16630 16717/19728/16640
+f 16717/19728/16640 26053/19718/16630 31015/19721/16633 26329/19730/16642
+f 16711/19724/16636 16713/19729/16641 16718/19732/16644 16714/19733/16645
+f 16714/19733/16645 16718/19732/16644 26056/19734/16646 26057/19735/16647
+f 16713/19729/16641 26330/19731/16643 26331/19736/16648 16718/19732/16644
+f 16718/19732/16644 26331/19736/16648 31014/19737/16649 26056/19734/16646
+f 16711/19724/16636 16714/19733/16645 16719/19738/16650 16715/19725/16637
+f 16715/19725/16637 16719/19738/16650 24831/19348/16264 24830/19343/16259
+f 16714/19733/16645 26057/19735/16647 26058/19739/16651 16719/19738/16650
+f 16719/19738/16650 26058/19739/16651 30924/19349/16265 24831/19348/16264
+f 16720/19740/16652 16724/19741/16653 16725/19742/16654 16721/19743/16655
+f 16721/19743/16655 16725/19742/16654 26058/19739/16651 26057/19735/16647
+f 16724/19741/16653 24833/19359/16275 24832/19358/16274 16725/19742/16654
+f 16725/19742/16654 24832/19358/16274 30924/19349/16265 26058/19739/16651
+f 16720/19740/16652 16721/19743/16655 16726/19744/16656 16722/19745/16657
+f 16722/19745/16657 16726/19744/16656 26326/19746/16658 26327/19747/16659
+f 16721/19743/16655 26057/19735/16647 26056/19734/16646 16726/19744/16656
+f 16726/19744/16656 26056/19734/16646 31014/19737/16649 26326/19746/16658
+f 16720/19740/16652 16722/19745/16657 16727/19748/16660 16723/19749/16661
+f 16723/19749/16661 16727/19748/16660 26059/19750/16662 26060/19751/16663
+f 16722/19745/16657 26327/19747/16659 26328/19752/16664 16727/19748/16660
+f 16727/19748/16660 26328/19752/16664 31013/19753/16665 26059/19750/16662
+f 16720/19740/16652 16723/19749/16661 16728/19754/16666 16724/19741/16653
+f 16724/19741/16653 16728/19754/16666 24834/19364/16280 24833/19359/16275
+f 16723/19749/16661 26060/19751/16663 26061/19755/16667 16728/19754/16666
+f 16728/19754/16666 26061/19755/16667 30925/19365/16281 24834/19364/16280
+f 16729/19756/16668 16733/19757/16669 16734/19758/16670 16730/19759/16671
+f 16730/19759/16671 16734/19758/16670 26061/19755/16667 26060/19751/16663
+f 16733/19757/16669 24836/19375/16291 24835/19374/16290 16734/19758/16670
+f 16734/19758/16670 24835/19374/16290 30925/19365/16281 26061/19755/16667
+f 16729/19756/16668 16730/19759/16671 16735/19760/16672 16731/19761/16673
+f 16731/19761/16673 16735/19760/16672 26320/19762/16674 26321/19763/16675
+f 16730/19759/16671 26060/19751/16663 26059/19750/16662 16735/19760/16672
+f 16735/19760/16672 26059/19750/16662 31013/19753/16665 26320/19762/16674
+f 16729/19756/16668 16731/19761/16673 16736/19764/16676 16732/19765/16677
+f 16732/19765/16677 16736/19764/16676 26062/19766/16678 26063/19767/16679
+f 16731/19761/16673 26321/19763/16675 26322/19768/16680 16736/19764/16676
+f 16736/19764/16676 26322/19768/16680 31012/19769/16681 26062/19766/16678
+f 16729/19756/16668 16732/19765/16677 16737/19770/16682 16733/19757/16669
+f 16733/19757/16669 16737/19770/16682 24837/19380/16296 24836/19375/16291
+f 16732/19765/16677 26063/19767/16679 26064/19771/16683 16737/19770/16682
+f 16737/19770/16682 26064/19771/16683 30926/19381/16297 24837/19380/16296
+f 16738/19772/16684 16742/19773/16685 16743/19774/16686 16739/19775/16687
+f 16739/19775/16687 16743/19774/16686 26064/19776/16683 26063/19777/16679
+f 16742/19773/16685 24839/19393/16307 24838/19392/16306 16743/19774/16686
+f 16743/19774/16686 24838/19392/16306 30926/19395/16297 26064/19776/16683
+f 16738/19772/16684 16739/19775/16687 16744/19778/16688 16740/19779/16689
+f 16740/19779/16689 16744/19778/16688 26317/19780/16690 26318/19781/16691
+f 16739/19775/16687 26063/19777/16679 26062/19782/16678 16744/19778/16688
+f 16744/19778/16688 26062/19782/16678 31012/19783/16681 26317/19780/16690
+f 16738/19772/16684 16740/19779/16689 16745/19784/16692 16741/19785/16693
+f 16741/19785/16693 16745/19784/16692 26065/19786/16694 26066/19787/16695
+f 16740/19779/16689 26318/19781/16691 26319/19788/16696 16745/19784/16692
+f 16745/19784/16692 26319/19788/16696 31011/19789/16697 26065/19786/16694
+f 16738/19772/16684 16741/19785/16693 16746/19790/16698 16742/19773/16685
+f 16742/19773/16685 16746/19790/16698 24840/19400/16312 24839/19393/16307
+f 16741/19785/16693 26066/19787/16695 26067/19791/16699 16746/19790/16698
+f 16746/19790/16698 26067/19791/16699 30927/19401/16313 24840/19400/16312
+f 16747/19792/16700 16751/19793/16701 16752/19794/16702 16748/19795/16703
+f 16748/19795/16703 16752/19794/16702 26067/19791/16699 26066/19787/16695
+f 16751/19793/16701 24842/19411/16323 24841/19410/16322 16752/19794/16702
+f 16752/19794/16702 24841/19410/16322 30927/19401/16313 26067/19791/16699
+f 16747/19792/16700 16748/19795/16703 16753/19796/16704 16749/19797/16705
+f 16749/19797/16705 16753/19796/16704 26314/19798/16706 26315/19799/16707
+f 16748/19795/16703 26066/19787/16695 26065/19786/16694 16753/19796/16704
+f 16753/19796/16704 26065/19786/16694 31011/19789/16697 26314/19798/16706
+f 16747/19792/16700 16749/19797/16705 16754/19800/16708 16750/19801/16709
+f 16750/19801/16709 16754/19800/16708 26068/19802/16710 26069/19803/16711
+f 16749/19797/16705 26315/19799/16707 26316/19804/16712 16754/19800/16708
+f 16754/19800/16708 26316/19804/16712 31010/19805/16713 26068/19802/16710
+f 16747/19792/16700 16750/19801/16709 16755/19806/16714 16751/19793/16701
+f 16751/19793/16701 16755/19806/16714 24843/19416/16328 24842/19411/16323
+f 16750/19801/16709 26069/19803/16711 26070/19807/16715 16755/19806/16714
+f 16755/19806/16714 26070/19807/16715 30928/19417/16329 24843/19416/16328
+f 16756/19808/16716 16760/19809/16717 16761/19810/16718 16757/19811/16719
+f 16757/19811/16719 16761/19810/16718 26070/19807/16715 26069/19803/16711
+f 16760/19809/16717 24845/19427/16339 24844/19426/16338 16761/19810/16718
+f 16761/19810/16718 24844/19426/16338 30928/19417/16329 26070/19807/16715
+f 16756/19808/16716 16757/19811/16719 16762/19812/16720 16758/19813/16721
+f 16758/19813/16721 16762/19812/16720 26311/19814/16722 26312/19815/16723
+f 16757/19811/16719 26069/19803/16711 26068/19802/16710 16762/19812/16720
+f 16762/19812/16720 26068/19802/16710 31010/19805/16713 26311/19814/16722
+f 16756/19808/16716 16758/19813/16721 16763/19816/16724 16759/19817/16725
+f 16759/19817/16725 16763/19816/16724 26071/19818/16726 26072/19819/16727
+f 16758/19813/16721 26312/19815/16723 26313/19820/16728 16763/19816/16724
+f 16763/19816/16724 26313/19820/16728 31009/19821/16729 26071/19818/16726
+f 16756/19808/16716 16759/19817/16725 16764/19822/16730 16760/19809/16717
+f 16760/19809/16717 16764/19822/16730 24846/19432/16344 24845/19427/16339
+f 16759/19817/16725 26072/19819/16727 26073/19823/16731 16764/19822/16730
+f 16764/19822/16730 26073/19823/16731 30929/19433/16345 24846/19432/16344
+f 16765/19824/16732 16769/19825/16733 16770/19826/16734 16766/19827/16735
+f 16766/19827/16735 16770/19826/16734 26073/19823/16731 26072/19819/16727
+f 16769/19825/16733 24848/19443/16355 24847/19442/16354 16770/19826/16734
+f 16770/19826/16734 24847/19442/16354 30929/19433/16345 26073/19823/16731
+f 16765/19824/16732 16766/19827/16735 16771/19828/16736 16767/19829/16737
+f 16767/19829/16737 16771/19828/16736 26308/19830/16738 26309/19831/16739
+f 16766/19827/16735 26072/19819/16727 26071/19818/16726 16771/19828/16736
+f 16771/19828/16736 26071/19818/16726 31009/19821/16729 26308/19830/16738
+f 16765/19824/16732 16767/19829/16737 16772/19832/16740 16768/19833/16741
+f 16768/19833/16741 16772/19832/16740 26074/19834/16742 26075/19835/16743
+f 16767/19829/16737 26309/19831/16739 26310/19836/16744 16772/19832/16740
+f 16772/19832/16740 26310/19836/16744 31008/19837/16745 26074/19834/16742
+f 16765/19824/16732 16768/19833/16741 16773/19838/16746 16769/19825/16733
+f 16769/19825/16733 16773/19838/16746 24849/19448/16360 24848/19443/16355
+f 16768/19833/16741 26075/19835/16743 26076/19839/16747 16773/19838/16746
+f 16773/19838/16746 26076/19839/16747 30930/19449/16361 24849/19448/16360
+f 16774/19840/16748 16778/19841/16749 16779/19842/16750 16775/19843/16751
+f 16775/19843/16751 16779/19842/16750 26076/19839/16747 26075/19835/16743
+f 16778/19841/16749 24851/19459/16371 24850/19458/16370 16779/19842/16750
+f 16779/19842/16750 24850/19458/16370 30930/19449/16361 26076/19839/16747
+f 16774/19840/16748 16775/19843/16751 16780/19844/16752 16776/19845/16753
+f 16776/19845/16753 16780/19844/16752 26305/19846/16754 26306/19847/16755
+f 16775/19843/16751 26075/19835/16743 26074/19834/16742 16780/19844/16752
+f 16780/19844/16752 26074/19834/16742 31008/19837/16745 26305/19846/16754
+f 16774/19840/16748 16776/19845/16753 16781/19848/16756 16777/19849/16757
+f 16777/19849/16757 16781/19848/16756 26077/19850/16758 26078/19851/16759
+f 16776/19845/16753 26306/19847/16755 26307/19852/16760 16781/19848/16756
+f 16781/19848/16756 26307/19852/16760 31007/19853/16761 26077/19850/16758
+f 16774/19840/16748 16777/19849/16757 16782/19854/16762 16778/19841/16749
+f 16778/19841/16749 16782/19854/16762 24852/19464/16376 24851/19459/16371
+f 16777/19849/16757 26078/19851/16759 26079/19855/16763 16782/19854/16762
+f 16782/19854/16762 26079/19855/16763 30931/19465/16377 24852/19464/16376
+f 16783/19856/16764 16787/19857/16765 16788/19858/16766 16784/19859/16767
+f 16784/19859/16767 16788/19858/16766 26079/19855/16763 26078/19851/16759
+f 16787/19857/16765 24854/19475/16387 24853/19474/16386 16788/19858/16766
+f 16788/19858/16766 24853/19474/16386 30931/19465/16377 26079/19855/16763
+f 16783/19856/16764 16784/19859/16767 16789/19860/16768 16785/19861/16769
+f 16785/19861/16769 16789/19860/16768 26302/19862/16770 26303/19863/16771
+f 16784/19859/16767 26078/19851/16759 26077/19850/16758 16789/19860/16768
+f 16789/19860/16768 26077/19850/16758 31007/19853/16761 26302/19862/16770
+f 16783/19856/16764 16785/19861/16769 16790/19864/16772 16786/19865/16773
+f 16786/19865/16773 16790/19864/16772 26080/19866/16774 26081/19867/16775
+f 16785/19861/16769 26303/19863/16771 26304/19868/16776 16790/19864/16772
+f 16790/19864/16772 26304/19868/16776 31006/19869/16777 26080/19866/16774
+f 16783/19856/16764 16786/19865/16773 16791/19870/16778 16787/19857/16765
+f 16787/19857/16765 16791/19870/16778 24855/19480/16392 24854/19475/16387
+f 16786/19865/16773 26081/19867/16775 26082/19871/16779 16791/19870/16778
+f 16791/19870/16778 26082/19871/16779 30932/19481/16393 24855/19480/16392
+f 16792/19872/16780 16796/19873/16781 16797/19874/16782 16793/19875/16783
+f 16793/19875/16783 16797/19874/16782 26082/19871/16779 26081/19867/16775
+f 16796/19873/16781 24857/19491/16403 24856/19490/16402 16797/19874/16782
+f 16797/19874/16782 24856/19490/16402 30932/19481/16393 26082/19871/16779
+f 16792/19872/16780 16793/19875/16783 16798/19876/16784 16794/19877/16785
+f 16794/19877/16785 16798/19876/16784 26299/19878/16786 26300/19879/16787
+f 16793/19875/16783 26081/19867/16775 26080/19866/16774 16798/19876/16784
+f 16798/19876/16784 26080/19866/16774 31006/19869/16777 26299/19878/16786
+f 16792/19872/16780 16794/19877/16785 16799/19880/16788 16795/19881/16789
+f 16795/19881/16789 16799/19880/16788 26013/19506/16418 26012/19501/16413
+f 16794/19877/16785 26300/19879/16787 26301/19882/16790 16799/19880/16788
+f 16799/19880/16788 26301/19882/16790 31005/19507/16419 26013/19506/16418
+f 16792/19872/16780 16795/19881/16789 16800/19883/16791 16796/19873/16781
+f 16796/19873/16781 16800/19883/16791 24858/19494/16406 24857/19491/16403
+f 16795/19881/16789 26012/19501/16413 26011/19500/16412 16800/19883/16791
+f 16800/19883/16791 26011/19500/16412 30909/19119/16035 24858/19494/16406
+f 16801/19884/16792 16805/19885/16793 16806/19886/16794 16802/19887/16795
+f 16802/19887/16795 16806/19886/16794 26509/19888/16796 26510/19889/16797
+f 16805/19885/16793 26516/19890/16798 26517/19891/16799 16806/19886/16794
+f 16806/19886/16794 26517/19891/16799 31052/19892/16800 26509/19888/16796
+f 16801/19884/16792 16802/19887/16795 16807/19893/16801 16803/19894/16802
+f 16803/19894/16802 16807/19893/16801 24859/19895/16803 24860/19896/16804
+f 16802/19887/16795 26510/19889/16797 26511/19897/16805 16807/19893/16801
+f 16807/19893/16801 26511/19897/16805 30933/19898/16806 24859/19895/16803
+f 16801/19884/16792 16803/19894/16802 16808/19899/16807 16804/19900/16808
+f 16804/19900/16808 16808/19899/16807 26374/19901/16809 26375/19902/16810
+f 16803/19894/16802 24860/19896/16804 24861/19903/16811 16808/19899/16807
+f 16808/19899/16807 24861/19903/16811 30934/19904/16812 26374/19901/16809
+f 16801/19884/16792 16804/19900/16808 16809/19905/16813 16805/19885/16793
+f 16805/19885/16793 16809/19905/16813 26515/19906/16814 26516/19890/16798
+f 16804/19900/16808 26375/19902/16810 26376/19907/16815 16809/19905/16813
+f 16809/19905/16813 26376/19907/16815 31029/19908/16816 26515/19906/16814
+f 16810/19909/16817 16814/19910/16818 16815/19911/16819 16811/19912/16820
+f 16811/19912/16820 16815/19911/16819 26376/19907/16815 26375/19902/16810
+f 16814/19910/16818 26381/19913/16821 26382/19914/16822 16815/19911/16819
+f 16815/19911/16819 26382/19914/16822 31029/19908/16816 26376/19907/16815
+f 16810/19909/16817 16811/19912/16820 16816/19915/16823 16812/19916/16824
+f 16812/19916/16824 16816/19915/16823 24862/19917/16825 24863/19918/16826
+f 16811/19912/16820 26375/19902/16810 26374/19901/16809 16816/19915/16823
+f 16816/19915/16823 26374/19901/16809 30934/19904/16812 24862/19917/16825
+f 16810/19909/16817 16812/19916/16824 16817/19919/16827 16813/19920/16828
+f 16813/19920/16828 16817/19919/16827 26377/19921/16829 26378/19922/16830
+f 16812/19916/16824 24863/19918/16826 24864/19923/16831 16817/19919/16827
+f 16817/19919/16827 24864/19923/16831 30935/19924/16832 26377/19921/16829
+f 16810/19909/16817 16813/19920/16828 16818/19925/16833 16814/19910/16818
+f 16814/19910/16818 16818/19925/16833 26380/19926/16834 26381/19913/16821
+f 16813/19920/16828 26378/19922/16830 26379/19927/16835 16818/19925/16833
+f 16818/19925/16833 26379/19927/16835 31030/19928/16836 26380/19926/16834
+f 16819/19929/16837 16823/19930/16838 16824/19931/16839 16820/19932/16840
+f 16820/19932/16840 16824/19931/16839 26379/19927/16835 26378/19922/16830
+f 16823/19930/16838 26387/19933/16841 26388/19934/16842 16824/19931/16839
+f 16824/19931/16839 26388/19934/16842 31030/19928/16836 26379/19927/16835
+f 16819/19929/16837 16820/19932/16840 16825/19935/16843 16821/19936/16844
+f 16821/19936/16844 16825/19935/16843 24865/19937/16845 24866/19938/16846
+f 16820/19932/16840 26378/19922/16830 26377/19921/16829 16825/19935/16843
+f 16825/19935/16843 26377/19921/16829 30935/19924/16832 24865/19937/16845
+f 16819/19929/16837 16821/19936/16844 16826/19939/16847 16822/19940/16848
+f 16822/19940/16848 16826/19939/16847 26383/19941/16849 26384/19942/16850
+f 16821/19936/16844 24866/19938/16846 24867/19943/16851 16826/19939/16847
+f 16826/19939/16847 24867/19943/16851 30936/19944/16852 26383/19941/16849
+f 16819/19929/16837 16822/19940/16848 16827/19945/16853 16823/19930/16838
+f 16823/19930/16838 16827/19945/16853 26386/19946/16854 26387/19933/16841
+f 16822/19940/16848 26384/19942/16850 26385/19947/16855 16827/19945/16853
+f 16827/19945/16853 26385/19947/16855 31031/19948/16856 26386/19946/16854
+f 16828/19949/16857 16832/19950/16858 16833/19951/16859 16829/19952/16860
+f 16829/19952/16860 16833/19951/16859 26385/19947/16855 26384/19942/16850
+f 16832/19950/16858 26393/19953/16861 26394/19954/16862 16833/19951/16859
+f 16833/19951/16859 26394/19954/16862 31031/19948/16856 26385/19947/16855
+f 16828/19949/16857 16829/19952/16860 16834/19955/16863 16830/19956/16864
+f 16830/19956/16864 16834/19955/16863 24868/19957/16865 24869/19958/16866
+f 16829/19952/16860 26384/19942/16850 26383/19941/16849 16834/19955/16863
+f 16834/19955/16863 26383/19941/16849 30936/19944/16852 24868/19957/16865
+f 16828/19949/16857 16830/19956/16864 16835/19959/16867 16831/19960/16868
+f 16831/19960/16868 16835/19959/16867 26389/19961/16869 26390/19962/16870
+f 16830/19956/16864 24869/19958/16866 24870/19963/16871 16835/19959/16867
+f 16835/19959/16867 24870/19963/16871 30937/19964/16872 26389/19961/16869
+f 16828/19949/16857 16831/19960/16868 16836/19965/16873 16832/19950/16858
+f 16832/19950/16858 16836/19965/16873 26392/19966/16874 26393/19953/16861
+f 16831/19960/16868 26390/19962/16870 26391/19967/16875 16836/19965/16873
+f 16836/19965/16873 26391/19967/16875 31032/19968/16876 26392/19966/16874
+f 16837/19969/16877 16841/19970/16878 16842/19971/16879 16838/19972/16880
+f 16838/19972/16880 16842/19971/16879 26391/19967/16875 26390/19962/16870
+f 16841/19970/16878 26399/19973/16881 26400/19974/16882 16842/19971/16879
+f 16842/19971/16879 26400/19974/16882 31032/19968/16876 26391/19967/16875
+f 16837/19969/16877 16838/19972/16880 16843/19975/16883 16839/19976/16884
+f 16839/19976/16884 16843/19975/16883 24871/19977/16885 24872/19978/16886
+f 16838/19972/16880 26390/19962/16870 26389/19961/16869 16843/19975/16883
+f 16843/19975/16883 26389/19961/16869 30937/19964/16872 24871/19977/16885
+f 16837/19969/16877 16839/19976/16884 16844/19979/16887 16840/19980/16888
+f 16840/19980/16888 16844/19979/16887 26395/19981/16889 26396/19982/16890
+f 16839/19976/16884 24872/19978/16886 24873/19983/16891 16844/19979/16887
+f 16844/19979/16887 24873/19983/16891 30938/19984/16892 26395/19981/16889
+f 16837/19969/16877 16840/19980/16888 16845/19985/16893 16841/19970/16878
+f 16841/19970/16878 16845/19985/16893 26398/19986/16894 26399/19973/16881
+f 16840/19980/16888 26396/19982/16890 26397/19987/16895 16845/19985/16893
+f 16845/19985/16893 26397/19987/16895 31033/19988/16896 26398/19986/16894
+f 16846/19989/16897 16850/19990/16898 16851/19991/16899 16847/19992/16900
+f 16847/19992/16900 16851/19991/16899 26397/19987/16895 26396/19982/16890
+f 16850/19990/16898 26405/19993/16901 26406/19994/16902 16851/19991/16899
+f 16851/19991/16899 26406/19994/16902 31033/19988/16896 26397/19987/16895
+f 16846/19989/16897 16847/19992/16900 16852/19995/16903 16848/19996/16904
+f 16848/19996/16904 16852/19995/16903 24874/19997/16905 24875/19998/16906
+f 16847/19992/16900 26396/19982/16890 26395/19981/16889 16852/19995/16903
+f 16852/19995/16903 26395/19981/16889 30938/19984/16892 24874/19997/16905
+f 16846/19989/16897 16848/19996/16904 16853/19999/16907 16849/20000/16908
+f 16849/20000/16908 16853/19999/16907 26401/20001/16909 26402/20002/16910
+f 16848/19996/16904 24875/19998/16906 24876/20003/16911 16853/19999/16907
+f 16853/19999/16907 24876/20003/16911 30939/20004/16912 26401/20001/16909
+f 16846/19989/16897 16849/20000/16908 16854/20005/16913 16850/19990/16898
+f 16850/19990/16898 16854/20005/16913 26404/20006/16914 26405/19993/16901
+f 16849/20000/16908 26402/20002/16910 26403/20007/16915 16854/20005/16913
+f 16854/20005/16913 26403/20007/16915 31034/20008/16916 26404/20006/16914
+f 16855/20009/16917 16859/20010/16918 16860/20011/16919 16856/20012/16920
+f 16856/20012/16920 16860/20011/16919 26403/20007/16915 26402/20002/16910
+f 16859/20010/16918 26411/20013/16921 26412/20014/16922 16860/20011/16919
+f 16860/20011/16919 26412/20014/16922 31034/20008/16916 26403/20007/16915
+f 16855/20009/16917 16856/20012/16920 16861/20015/16923 16857/20016/16924
+f 16857/20016/16924 16861/20015/16923 24877/20017/16925 24878/20018/16926
+f 16856/20012/16920 26402/20002/16910 26401/20001/16909 16861/20015/16923
+f 16861/20015/16923 26401/20001/16909 30939/20004/16912 24877/20017/16925
+f 16855/20009/16917 16857/20016/16924 16862/20019/16927 16858/20020/16928
+f 16858/20020/16928 16862/20019/16927 26407/20021/16929 26408/20022/16930
+f 16857/20016/16924 24878/20018/16926 24879/20023/16931 16862/20019/16927
+f 16862/20019/16927 24879/20023/16931 30940/20024/16932 26407/20021/16929
+f 16855/20009/16917 16858/20020/16928 16863/20025/16933 16859/20010/16918
+f 16859/20010/16918 16863/20025/16933 26410/20026/16934 26411/20013/16921
+f 16858/20020/16928 26408/20022/16930 26409/20027/16935 16863/20025/16933
+f 16863/20025/16933 26409/20027/16935 31035/20028/16936 26410/20026/16934
+f 16864/20029/16937 16868/20030/16938 16869/20031/16939 16865/20032/16940
+f 16865/20032/16940 16869/20031/16939 26409/20027/16935 26408/20022/16930
+f 16868/20030/16938 26417/20033/16941 26418/20034/16942 16869/20031/16939
+f 16869/20031/16939 26418/20034/16942 31035/20028/16936 26409/20027/16935
+f 16864/20029/16937 16865/20032/16940 16870/20035/16943 16866/20036/16944
+f 16866/20036/16944 16870/20035/16943 24880/20037/16945 24881/20038/16946
+f 16865/20032/16940 26408/20022/16930 26407/20021/16929 16870/20035/16943
+f 16870/20035/16943 26407/20021/16929 30940/20024/16932 24880/20037/16945
+f 16864/20029/16937 16866/20036/16944 16871/20039/16947 16867/20040/16948
+f 16867/20040/16948 16871/20039/16947 26413/20041/16949 26414/20042/16950
+f 16866/20036/16944 24881/20038/16946 24882/20043/16951 16871/20039/16947
+f 16871/20039/16947 24882/20043/16951 30941/20044/16952 26413/20041/16949
+f 16864/20029/16937 16867/20040/16948 16872/20045/16953 16868/20030/16938
+f 16868/20030/16938 16872/20045/16953 26416/20046/16954 26417/20033/16941
+f 16867/20040/16948 26414/20042/16950 26415/20047/16955 16872/20045/16953
+f 16872/20045/16953 26415/20047/16955 31036/20048/16956 26416/20046/16954
+f 16873/20049/16957 16877/20050/16958 16878/20051/16959 16874/20052/16960
+f 16874/20052/16960 16878/20051/16959 26415/20047/16955 26414/20042/16950
+f 16877/20050/16958 26423/20053/16961 26424/20054/16962 16878/20051/16959
+f 16878/20051/16959 26424/20054/16962 31036/20048/16956 26415/20047/16955
+f 16873/20049/16957 16874/20052/16960 16879/20055/16963 16875/20056/16964
+f 16875/20056/16964 16879/20055/16963 24883/20057/16965 24884/20058/16966
+f 16874/20052/16960 26414/20042/16950 26413/20041/16949 16879/20055/16963
+f 16879/20055/16963 26413/20041/16949 30941/20044/16952 24883/20057/16965
+f 16873/20049/16957 16875/20056/16964 16880/20059/16967 16876/20060/16968
+f 16876/20060/16968 16880/20059/16967 26419/20061/16969 26420/20062/16970
+f 16875/20056/16964 24884/20058/16966 24885/20063/16971 16880/20059/16967
+f 16880/20059/16967 24885/20063/16971 30942/20064/16972 26419/20061/16969
+f 16873/20049/16957 16876/20060/16968 16881/20065/16973 16877/20050/16958
+f 16877/20050/16958 16881/20065/16973 26422/20066/16974 26423/20053/16961
+f 16876/20060/16968 26420/20062/16970 26421/20067/16975 16881/20065/16973
+f 16881/20065/16973 26421/20067/16975 31037/20068/16976 26422/20066/16974
+f 16882/20069/16977 16886/20070/16978 16887/20071/16979 16883/20072/16980
+f 16883/20072/16980 16887/20071/16979 26421/20067/16975 26420/20062/16970
+f 16886/20070/16978 26429/20073/16981 26430/20074/16982 16887/20071/16979
+f 16887/20071/16979 26430/20074/16982 31037/20068/16976 26421/20067/16975
+f 16882/20069/16977 16883/20072/16980 16888/20075/16983 16884/20076/16984
+f 16884/20076/16984 16888/20075/16983 24886/20077/16985 24887/20078/16986
+f 16883/20072/16980 26420/20062/16970 26419/20061/16969 16888/20075/16983
+f 16888/20075/16983 26419/20061/16969 30942/20064/16972 24886/20077/16985
+f 16882/20069/16977 16884/20076/16984 16889/20079/16987 16885/20080/16988
+f 16885/20080/16988 16889/20079/16987 26425/20081/16989 26426/20082/16990
+f 16884/20076/16984 24887/20078/16986 24888/20083/16991 16889/20079/16987
+f 16889/20079/16987 24888/20083/16991 30943/20084/16992 26425/20081/16989
+f 16882/20069/16977 16885/20080/16988 16890/20085/16993 16886/20070/16978
+f 16886/20070/16978 16890/20085/16993 26428/20086/16994 26429/20073/16981
+f 16885/20080/16988 26426/20082/16990 26427/20087/16995 16890/20085/16993
+f 16890/20085/16993 26427/20087/16995 31038/20088/16996 26428/20086/16994
+f 16891/20089/16997 16895/20090/16998 16896/20091/16999 16892/20092/17000
+f 16892/20092/17000 16896/20091/16999 26427/20087/16995 26426/20082/16990
+f 16895/20090/16998 26435/20093/17001 26436/20094/17002 16896/20091/16999
+f 16896/20091/16999 26436/20094/17002 31038/20088/16996 26427/20087/16995
+f 16891/20089/16997 16892/20092/17000 16897/20095/17003 16893/20096/17004
+f 16893/20096/17004 16897/20095/17003 24889/20097/17005 24890/20098/17006
+f 16892/20092/17000 26426/20082/16990 26425/20081/16989 16897/20095/17003
+f 16897/20095/17003 26425/20081/16989 30943/20084/16992 24889/20097/17005
+f 16891/20089/16997 16893/20096/17004 16898/20099/17007 16894/20100/17008
+f 16894/20100/17008 16898/20099/17007 26431/20101/17009 26432/20102/17010
+f 16893/20096/17004 24890/20098/17006 24891/20103/17011 16898/20099/17007
+f 16898/20099/17007 24891/20103/17011 30944/20104/17012 26431/20101/17009
+f 16891/20089/16997 16894/20100/17008 16899/20105/17013 16895/20090/16998
+f 16895/20090/16998 16899/20105/17013 26434/20106/17014 26435/20093/17001
+f 16894/20100/17008 26432/20102/17010 26433/20107/17015 16899/20105/17013
+f 16899/20105/17013 26433/20107/17015 31039/20108/17016 26434/20106/17014
+f 16900/20109/17017 16904/20110/17018 16905/20111/17019 16901/20112/17020
+f 16901/20112/17020 16905/20111/17019 26433/20107/17015 26432/20102/17010
+f 16904/20110/17018 26441/20113/17021 26442/20114/17022 16905/20111/17019
+f 16905/20111/17019 26442/20114/17022 31039/20108/17016 26433/20107/17015
+f 16900/20109/17017 16901/20112/17020 16906/20115/17023 16902/20116/17024
+f 16902/20116/17024 16906/20115/17023 24892/20117/17025 24893/20118/17026
+f 16901/20112/17020 26432/20102/17010 26431/20101/17009 16906/20115/17023
+f 16906/20115/17023 26431/20101/17009 30944/20104/17012 24892/20117/17025
+f 16900/20109/17017 16902/20116/17024 16907/20119/17027 16903/20120/17028
+f 16903/20120/17028 16907/20119/17027 26437/20121/17029 26438/20122/17030
+f 16902/20116/17024 24893/20118/17026 24894/20123/17031 16907/20119/17027
+f 16907/20119/17027 24894/20123/17031 30945/20124/17032 26437/20121/17029
+f 16900/20109/17017 16903/20120/17028 16908/20125/17033 16904/20110/17018
+f 16904/20110/17018 16908/20125/17033 26440/20126/17034 26441/20113/17021
+f 16903/20120/17028 26438/20122/17030 26439/20127/17035 16908/20125/17033
+f 16908/20125/17033 26439/20127/17035 31040/20128/17036 26440/20126/17034
+f 16909/20129/17037 16913/20130/17038 16914/20131/17039 16910/20132/17040
+f 16910/20132/17040 16914/20131/17039 26439/20127/17035 26438/20122/17030
+f 16913/20130/17038 26447/20133/17041 26448/20134/17042 16914/20131/17039
+f 16914/20131/17039 26448/20134/17042 31040/20128/17036 26439/20127/17035
+f 16909/20129/17037 16910/20132/17040 16915/20135/17043 16911/20136/17044
+f 16911/20136/17044 16915/20135/17043 24895/20137/17045 24896/20138/17046
+f 16910/20132/17040 26438/20122/17030 26437/20121/17029 16915/20135/17043
+f 16915/20135/17043 26437/20121/17029 30945/20124/17032 24895/20137/17045
+f 16909/20129/17037 16911/20136/17044 16916/20139/17047 16912/20140/17048
+f 16912/20140/17048 16916/20139/17047 26443/20141/17049 26444/20142/17050
+f 16911/20136/17044 24896/20138/17046 24897/20143/17051 16916/20139/17047
+f 16916/20139/17047 24897/20143/17051 30946/20144/17052 26443/20141/17049
+f 16909/20129/17037 16912/20140/17048 16917/20145/17053 16913/20130/17038
+f 16913/20130/17038 16917/20145/17053 26446/20146/17054 26447/20133/17041
+f 16912/20140/17048 26444/20142/17050 26445/20147/17055 16917/20145/17053
+f 16917/20145/17053 26445/20147/17055 31041/20148/17056 26446/20146/17054
+f 16918/20149/17057 16922/20150/17058 16923/20151/17059 16919/20152/17060
+f 16919/20152/17060 16923/20151/17059 26445/20147/17055 26444/20142/17050
+f 16922/20150/17058 26453/20153/17061 26454/20154/17062 16923/20151/17059
+f 16923/20151/17059 26454/20154/17062 31041/20148/17056 26445/20147/17055
+f 16918/20149/17057 16919/20152/17060 16924/20155/17063 16920/20156/17064
+f 16920/20156/17064 16924/20155/17063 24898/20157/17065 24899/20158/17066
+f 16919/20152/17060 26444/20142/17050 26443/20141/17049 16924/20155/17063
+f 16924/20155/17063 26443/20141/17049 30946/20144/17052 24898/20157/17065
+f 16918/20149/17057 16920/20156/17064 16925/20159/17067 16921/20160/17068
+f 16921/20160/17068 16925/20159/17067 26449/20161/17069 26450/20162/17070
+f 16920/20156/17064 24899/20158/17066 24900/20163/17071 16925/20159/17067
+f 16925/20159/17067 24900/20163/17071 30947/20164/17072 26449/20161/17069
+f 16918/20149/17057 16921/20160/17068 16926/20165/17073 16922/20150/17058
+f 16922/20150/17058 16926/20165/17073 26452/20166/17074 26453/20153/17061
+f 16921/20160/17068 26450/20162/17070 26451/20167/17075 16926/20165/17073
+f 16926/20165/17073 26451/20167/17075 31042/20168/17076 26452/20166/17074
+f 16927/20169/17077 16931/20170/17078 16932/20171/17079 16928/20172/17080
+f 16928/20172/17080 16932/20171/17079 26451/20167/17075 26450/20162/17070
+f 16931/20170/17078 26459/20173/17081 26460/20174/17082 16932/20171/17079
+f 16932/20171/17079 26460/20174/17082 31042/20168/17076 26451/20167/17075
+f 16927/20169/17077 16928/20172/17080 16933/20175/17083 16929/20176/17084
+f 16929/20176/17084 16933/20175/17083 24901/20177/17085 24902/20178/17086
+f 16928/20172/17080 26450/20162/17070 26449/20161/17069 16933/20175/17083
+f 16933/20175/17083 26449/20161/17069 30947/20164/17072 24901/20177/17085
+f 16927/20169/17077 16929/20176/17084 16934/20179/17087 16930/20180/17088
+f 16930/20180/17088 16934/20179/17087 26455/20181/17089 26456/20182/17090
+f 16929/20176/17084 24902/20178/17086 24903/20183/17091 16934/20179/17087
+f 16934/20179/17087 24903/20183/17091 30948/20184/17092 26455/20181/17089
+f 16927/20169/17077 16930/20180/17088 16935/20185/17093 16931/20170/17078
+f 16931/20170/17078 16935/20185/17093 26458/20186/17094 26459/20173/17081
+f 16930/20180/17088 26456/20182/17090 26457/20187/17095 16935/20185/17093
+f 16935/20185/17093 26457/20187/17095 31043/20188/17096 26458/20186/17094
+f 16936/20189/17097 16940/20190/17098 16941/20191/17099 16937/20192/17100
+f 16937/20192/17100 16941/20191/17099 26457/20187/17095 26456/20182/17090
+f 16940/20190/17098 26465/20193/17101 26466/20194/17102 16941/20191/17099
+f 16941/20191/17099 26466/20194/17102 31043/20188/17096 26457/20187/17095
+f 16936/20189/17097 16937/20192/17100 16942/20195/17103 16938/20196/17104
+f 16938/20196/17104 16942/20195/17103 24904/20197/17105 24905/20198/17106
+f 16937/20192/17100 26456/20182/17090 26455/20181/17089 16942/20195/17103
+f 16942/20195/17103 26455/20181/17089 30948/20184/17092 24904/20197/17105
+f 16936/20189/17097 16938/20196/17104 16943/20199/17107 16939/20200/17108
+f 16939/20200/17108 16943/20199/17107 26461/20201/17109 26462/20202/17110
+f 16938/20196/17104 24905/20198/17106 24906/20203/17111 16943/20199/17107
+f 16943/20199/17107 24906/20203/17111 30949/20204/17112 26461/20201/17109
+f 16936/20189/17097 16939/20200/17108 16944/20205/17113 16940/20190/17098
+f 16940/20190/17098 16944/20205/17113 26464/20206/17114 26465/20193/17101
+f 16939/20200/17108 26462/20202/17110 26463/20207/17115 16944/20205/17113
+f 16944/20205/17113 26463/20207/17115 31044/20208/17116 26464/20206/17114
+f 16945/20209/17117 16949/20210/17118 16950/20211/17119 16946/20212/17120
+f 16946/20212/17120 16950/20211/17119 26463/20207/17115 26462/20202/17110
+f 16949/20210/17118 26471/20213/17121 26472/20214/17122 16950/20211/17119
+f 16950/20211/17119 26472/20214/17122 31044/20208/17116 26463/20207/17115
+f 16945/20209/17117 16946/20212/17120 16951/20215/17123 16947/20216/17124
+f 16947/20216/17124 16951/20215/17123 24907/20217/17125 24908/20218/17126
+f 16946/20212/17120 26462/20202/17110 26461/20201/17109 16951/20215/17123
+f 16951/20215/17123 26461/20201/17109 30949/20204/17112 24907/20217/17125
+f 16945/20209/17117 16947/20216/17124 16952/20219/17127 16948/20220/17128
+f 16948/20220/17128 16952/20219/17127 26467/20221/17129 26468/20222/17130
+f 16947/20216/17124 24908/20218/17126 24909/20223/17131 16952/20219/17127
+f 16952/20219/17127 24909/20223/17131 30950/20224/17132 26467/20221/17129
+f 16945/20209/17117 16948/20220/17128 16953/20225/17133 16949/20210/17118
+f 16949/20210/17118 16953/20225/17133 26470/20226/17134 26471/20213/17121
+f 16948/20220/17128 26468/20222/17130 26469/20227/17135 16953/20225/17133
+f 16953/20225/17133 26469/20227/17135 31045/20228/17136 26470/20226/17134
+f 16954/20229/17137 16958/20230/17138 16959/20231/17139 16955/20232/17140
+f 16955/20232/17140 16959/20231/17139 26469/20233/17135 26468/20234/17130
+f 16958/20230/17138 26477/20235/17141 26478/20236/17142 16959/20231/17139
+f 16959/20231/17139 26478/20236/17142 31045/20237/17136 26469/20233/17135
+f 16954/20229/17137 16955/20232/17140 16960/20238/17143 16956/20239/17144
+f 16956/20239/17144 16960/20238/17143 24910/20240/17145 24911/20241/17146
+f 16955/20232/17140 26468/20234/17130 26467/20242/17129 16960/20238/17143
+f 16960/20238/17143 26467/20242/17129 30950/20243/17132 24910/20240/17145
+f 16954/20229/17137 16956/20239/17144 16961/20244/17147 16957/20245/17148
+f 16957/20245/17148 16961/20244/17147 26473/20246/17149 26474/20247/17150
+f 16956/20239/17144 24911/20241/17146 24912/20248/17151 16961/20244/17147
+f 16961/20244/17147 24912/20248/17151 30951/20249/17152 26473/20246/17149
+f 16954/20229/17137 16957/20245/17148 16962/20250/17153 16958/20230/17138
+f 16958/20230/17138 16962/20250/17153 26476/20251/17154 26477/20235/17141
+f 16957/20245/17148 26474/20247/17150 26475/20252/17155 16962/20250/17153
+f 16962/20250/17153 26475/20252/17155 31046/20253/17156 26476/20251/17154
+f 16963/20254/17157 16967/20255/17158 16968/20256/17159 16964/20257/17160
+f 16964/20257/17160 16968/20256/17159 26475/20252/17155 26474/20247/17150
+f 16967/20255/17158 26483/20258/17161 26484/20259/17162 16968/20256/17159
+f 16968/20256/17159 26484/20259/17162 31046/20253/17156 26475/20252/17155
+f 16963/20254/17157 16964/20257/17160 16969/20260/17163 16965/20261/17164
+f 16965/20261/17164 16969/20260/17163 24913/20262/17165 24914/20263/17166
+f 16964/20257/17160 26474/20247/17150 26473/20246/17149 16969/20260/17163
+f 16969/20260/17163 26473/20246/17149 30951/20249/17152 24913/20262/17165
+f 16963/20254/17157 16965/20261/17164 16970/20264/17167 16966/20265/17168
+f 16966/20265/17168 16970/20264/17167 26479/20266/17169 26480/20267/17170
+f 16965/20261/17164 24914/20263/17166 24915/20268/17171 16970/20264/17167
+f 16970/20264/17167 24915/20268/17171 30952/20269/17172 26479/20266/17169
+f 16963/20254/17157 16966/20265/17168 16971/20270/17173 16967/20255/17158
+f 16967/20255/17158 16971/20270/17173 26482/20271/17174 26483/20258/17161
+f 16966/20265/17168 26480/20267/17170 26481/20272/17175 16971/20270/17173
+f 16971/20270/17173 26481/20272/17175 31047/20273/17176 26482/20271/17174
+f 16972/20274/17177 16976/20275/17178 16977/20276/17179 16973/20277/17180
+f 16973/20277/17180 16977/20276/17179 26481/20272/17175 26480/20267/17170
+f 16976/20275/17178 26489/20278/17181 26490/20279/17182 16977/20276/17179
+f 16977/20276/17179 26490/20279/17182 31047/20273/17176 26481/20272/17175
+f 16972/20274/17177 16973/20277/17180 16978/20280/17183 16974/20281/17184
+f 16974/20281/17184 16978/20280/17183 24916/20282/17185 24917/20283/17186
+f 16973/20277/17180 26480/20267/17170 26479/20266/17169 16978/20280/17183
+f 16978/20280/17183 26479/20266/17169 30952/20269/17172 24916/20282/17185
+f 16972/20274/17177 16974/20281/17184 16979/20284/17187 16975/20285/17188
+f 16975/20285/17188 16979/20284/17187 26485/20286/17189 26486/20287/17190
+f 16974/20281/17184 24917/20283/17186 24918/20288/17191 16979/20284/17187
+f 16979/20284/17187 24918/20288/17191 30953/20289/17192 26485/20286/17189
+f 16972/20274/17177 16975/20285/17188 16980/20290/17193 16976/20275/17178
+f 16976/20275/17178 16980/20290/17193 26488/20291/17194 26489/20278/17181
+f 16975/20285/17188 26486/20287/17190 26487/20292/17195 16980/20290/17193
+f 16980/20290/17193 26487/20292/17195 31048/20293/17196 26488/20291/17194
+f 16981/20294/17197 16985/20295/17198 16986/20296/17199 16982/20297/17200
+f 16982/20297/17200 16986/20296/17199 26487/20292/17195 26486/20287/17190
+f 16985/20295/17198 26495/20298/17201 26496/20299/17202 16986/20296/17199
+f 16986/20296/17199 26496/20299/17202 31048/20293/17196 26487/20292/17195
+f 16981/20294/17197 16982/20297/17200 16987/20300/17203 16983/20301/17204
+f 16983/20301/17204 16987/20300/17203 24919/20302/17205 24920/20303/17206
+f 16982/20297/17200 26486/20287/17190 26485/20286/17189 16987/20300/17203
+f 16987/20300/17203 26485/20286/17189 30953/20289/17192 24919/20302/17205
+f 16981/20294/17197 16983/20301/17204 16988/20304/17207 16984/20305/17208
+f 16984/20305/17208 16988/20304/17207 26491/20306/17209 26492/20307/17210
+f 16983/20301/17204 24920/20303/17206 24921/20308/17211 16988/20304/17207
+f 16988/20304/17207 24921/20308/17211 30954/20309/17212 26491/20306/17209
+f 16981/20294/17197 16984/20305/17208 16989/20310/17213 16985/20295/17198
+f 16985/20295/17198 16989/20310/17213 26494/20311/17214 26495/20298/17201
+f 16984/20305/17208 26492/20307/17210 26493/20312/17215 16989/20310/17213
+f 16989/20310/17213 26493/20312/17215 31049/20313/17216 26494/20311/17214
+f 16990/20314/17217 16994/20315/17218 16995/20316/17219 16991/20317/17220
+f 16991/20317/17220 16995/20316/17219 26493/20312/17215 26492/20307/17210
+f 16994/20315/17218 26501/20318/17221 26502/20319/17222 16995/20316/17219
+f 16995/20316/17219 26502/20319/17222 31049/20313/17216 26493/20312/17215
+f 16990/20314/17217 16991/20317/17220 16996/20320/17223 16992/20321/17224
+f 16992/20321/17224 16996/20320/17223 24922/20322/17225 24923/20323/17226
+f 16991/20317/17220 26492/20307/17210 26491/20306/17209 16996/20320/17223
+f 16996/20320/17223 26491/20306/17209 30954/20309/17212 24922/20322/17225
+f 16990/20314/17217 16992/20321/17224 16997/20324/17227 16993/20325/17228
+f 16993/20325/17228 16997/20324/17227 26497/20326/17229 26498/20327/17230
+f 16992/20321/17224 24923/20323/17226 24924/20328/17231 16997/20324/17227
+f 16997/20324/17227 24924/20328/17231 30955/20329/17232 26497/20326/17229
+f 16990/20314/17217 16993/20325/17228 16998/20330/17233 16994/20315/17218
+f 16994/20315/17218 16998/20330/17233 26500/20331/17234 26501/20318/17221
+f 16993/20325/17228 26498/20327/17230 26499/20332/17235 16998/20330/17233
+f 16998/20330/17233 26499/20332/17235 31050/20333/17236 26500/20331/17234
+f 16999/20334/17237 17003/20335/17238 17004/20336/17239 17000/20337/17240
+f 17000/20337/17240 17004/20336/17239 26499/20332/17235 26498/20327/17230
+f 17003/20335/17238 26507/20338/17241 26508/20339/17242 17004/20336/17239
+f 17004/20336/17239 26508/20339/17242 31050/20333/17236 26499/20332/17235
+f 16999/20334/17237 17000/20337/17240 17005/20340/17243 17001/20341/17244
+f 17001/20341/17244 17005/20340/17243 24925/20342/17245 24926/20343/17246
+f 17000/20337/17240 26498/20327/17230 26497/20326/17229 17005/20340/17243
+f 17005/20340/17243 26497/20326/17229 30955/20329/17232 24925/20342/17245
+f 16999/20334/17237 17001/20341/17244 17006/20344/17247 17002/20345/17248
+f 17002/20345/17248 17006/20344/17247 26503/20346/17249 26504/20347/17250
+f 17001/20341/17244 24926/20343/17246 24927/20348/17251 17006/20344/17247
+f 17006/20344/17247 24927/20348/17251 30956/20349/17252 26503/20346/17249
+f 16999/20334/17237 17002/20345/17248 17007/20350/17253 17003/20335/17238
+f 17003/20335/17238 17007/20350/17253 26506/20351/17254 26507/20338/17241
+f 17002/20345/17248 26504/20347/17250 26505/20352/17255 17007/20350/17253
+f 17007/20350/17253 26505/20352/17255 31051/20353/17256 26506/20351/17254
+f 17008/20354/17257 17012/20355/17258 17013/20356/17259 17009/20357/17260
+f 17009/20357/17260 17013/20356/17259 26505/20352/17255 26504/20347/17250
+f 17012/20355/17258 26513/20358/17261 26514/20359/17262 17013/20356/17259
+f 17013/20356/17259 26514/20359/17262 31051/20353/17256 26505/20352/17255
+f 17008/20354/17257 17009/20357/17260 17014/20360/17263 17010/20361/17264
+f 17010/20361/17264 17014/20360/17263 24928/20362/17265 24929/20363/17266
+f 17009/20357/17260 26504/20347/17250 26503/20346/17249 17014/20360/17263
+f 17014/20360/17263 26503/20346/17249 30956/20349/17252 24928/20362/17265
+f 17008/20354/17257 17010/20361/17264 17015/20364/17267 17011/20365/17268
+f 17011/20365/17268 17015/20364/17267 26511/19897/16805 26510/19889/16797
+f 17010/20361/17264 24929/20363/17266 24930/20366/17269 17015/20364/17267
+f 17015/20364/17267 24930/20366/17269 30933/19898/16806 26511/19897/16805
+f 17008/20354/17257 17011/20365/17268 17016/20367/17270 17012/20355/17258
+f 17012/20355/17258 17016/20367/17270 26512/20368/17271 26513/20358/17261
+f 17011/20365/17268 26510/19889/16797 26509/19888/16796 17016/20367/17270
+f 17016/20367/17270 26509/19888/16796 31052/19892/16800 26512/20368/17271
+f 17017/20369/17272 17021/20370/17273 17022/20371/17274 17018/20372/17275
+f 17018/20372/17275 17022/20371/17274 26083/20373/17276 26084/20374/17277
+f 17021/20370/17273 24860/19896/16804 24859/19895/16803 17022/20371/17274
+f 17022/20371/17274 24859/19895/16803 30933/19898/16806 26083/20373/17276
+f 17017/20369/17272 17018/20372/17275 17023/20375/17278 17019/20376/17279
+f 17019/20376/17279 17023/20375/17278 24931/20377/17280 24932/20378/17281
+f 17018/20372/17275 26084/20374/17277 26085/20379/17282 17023/20375/17278
+f 17023/20375/17278 26085/20379/17282 30957/20380/17283 24931/20377/17280
+f 17017/20369/17272 17019/20376/17279 17024/20381/17284 17020/20382/17285
+f 17020/20382/17285 17024/20381/17284 26086/20383/17286 26087/20384/17287
+f 17019/20376/17279 24932/20378/17281 24933/20385/17288 17024/20381/17284
+f 17024/20381/17284 24933/20385/17288 30958/20386/17289 26086/20383/17286
+f 17017/20369/17272 17020/20382/17285 17025/20387/17290 17021/20370/17273
+f 17021/20370/17273 17025/20387/17290 24861/19903/16811 24860/19896/16804
+f 17020/20382/17285 26087/20384/17287 26088/20388/17291 17025/20387/17290
+f 17025/20387/17290 26088/20388/17291 30934/19904/16812 24861/19903/16811
+f 17026/20389/17292 17030/20390/17293 17031/20391/17294 17027/20392/17295
+f 17027/20392/17295 17031/20391/17294 26088/20388/17291 26087/20384/17287
+f 17030/20390/17293 24863/19918/16826 24862/19917/16825 17031/20391/17294
+f 17031/20391/17294 24862/19917/16825 30934/19904/16812 26088/20388/17291
+f 17026/20389/17292 17027/20392/17295 17032/20393/17296 17028/20394/17297
+f 17028/20394/17297 17032/20393/17296 24934/20395/17298 24935/20396/17299
+f 17027/20392/17295 26087/20384/17287 26086/20383/17286 17032/20393/17296
+f 17032/20393/17296 26086/20383/17286 30958/20386/17289 24934/20395/17298
+f 17026/20389/17292 17028/20394/17297 17033/20397/17300 17029/20398/17301
+f 17029/20398/17301 17033/20397/17300 26089/20399/17302 26090/20400/17303
+f 17028/20394/17297 24935/20396/17299 24936/20401/17304 17033/20397/17300
+f 17033/20397/17300 24936/20401/17304 30959/20402/17305 26089/20399/17302
+f 17026/20389/17292 17029/20398/17301 17034/20403/17306 17030/20390/17293
+f 17030/20390/17293 17034/20403/17306 24864/19923/16831 24863/19918/16826
+f 17029/20398/17301 26090/20400/17303 26091/20404/17307 17034/20403/17306
+f 17034/20403/17306 26091/20404/17307 30935/19924/16832 24864/19923/16831
+f 17035/20405/17308 17039/20406/17309 17040/20407/17310 17036/20408/17311
+f 17036/20408/17311 17040/20407/17310 26091/20404/17307 26090/20400/17303
+f 17039/20406/17309 24866/19938/16846 24865/19937/16845 17040/20407/17310
+f 17040/20407/17310 24865/19937/16845 30935/19924/16832 26091/20404/17307
+f 17035/20405/17308 17036/20408/17311 17041/20409/17312 17037/20410/17313
+f 17037/20410/17313 17041/20409/17312 24937/20411/17314 24938/20412/17315
+f 17036/20408/17311 26090/20400/17303 26089/20399/17302 17041/20409/17312
+f 17041/20409/17312 26089/20399/17302 30959/20402/17305 24937/20411/17314
+f 17035/20405/17308 17037/20410/17313 17042/20413/17316 17038/20414/17317
+f 17038/20414/17317 17042/20413/17316 26092/20415/17318 26093/20416/17319
+f 17037/20410/17313 24938/20412/17315 24939/20417/17320 17042/20413/17316
+f 17042/20413/17316 24939/20417/17320 30960/20418/17321 26092/20415/17318
+f 17035/20405/17308 17038/20414/17317 17043/20419/17322 17039/20406/17309
+f 17039/20406/17309 17043/20419/17322 24867/19943/16851 24866/19938/16846
+f 17038/20414/17317 26093/20416/17319 26094/20420/17323 17043/20419/17322
+f 17043/20419/17322 26094/20420/17323 30936/19944/16852 24867/19943/16851
+f 17044/20421/17324 17048/20422/17325 17049/20423/17326 17045/20424/17327
+f 17045/20424/17327 17049/20423/17326 26094/20420/17323 26093/20416/17319
+f 17048/20422/17325 24869/19958/16866 24868/19957/16865 17049/20423/17326
+f 17049/20423/17326 24868/19957/16865 30936/19944/16852 26094/20420/17323
+f 17044/20421/17324 17045/20424/17327 17050/20425/17328 17046/20426/17329
+f 17046/20426/17329 17050/20425/17328 24940/20427/17330 24941/20428/17331
+f 17045/20424/17327 26093/20416/17319 26092/20415/17318 17050/20425/17328
+f 17050/20425/17328 26092/20415/17318 30960/20418/17321 24940/20427/17330
+f 17044/20421/17324 17046/20426/17329 17051/20429/17332 17047/20430/17333
+f 17047/20430/17333 17051/20429/17332 26095/20431/17334 26096/20432/17335
+f 17046/20426/17329 24941/20428/17331 24942/20433/17336 17051/20429/17332
+f 17051/20429/17332 24942/20433/17336 30961/20434/17337 26095/20431/17334
+f 17044/20421/17324 17047/20430/17333 17052/20435/17338 17048/20422/17325
+f 17048/20422/17325 17052/20435/17338 24870/19963/16871 24869/19958/16866
+f 17047/20430/17333 26096/20432/17335 26097/20436/17339 17052/20435/17338
+f 17052/20435/17338 26097/20436/17339 30937/19964/16872 24870/19963/16871
+f 17053/20437/17340 17057/20438/17341 17058/20439/17342 17054/20440/17343
+f 17054/20440/17343 17058/20439/17342 26097/20436/17339 26096/20432/17335
+f 17057/20438/17341 24872/19978/16886 24871/19977/16885 17058/20439/17342
+f 17058/20439/17342 24871/19977/16885 30937/19964/16872 26097/20436/17339
+f 17053/20437/17340 17054/20440/17343 17059/20441/17344 17055/20442/17345
+f 17055/20442/17345 17059/20441/17344 24943/20443/17346 24944/20444/17347
+f 17054/20440/17343 26096/20432/17335 26095/20431/17334 17059/20441/17344
+f 17059/20441/17344 26095/20431/17334 30961/20434/17337 24943/20443/17346
+f 17053/20437/17340 17055/20442/17345 17060/20445/17348 17056/20446/17349
+f 17056/20446/17349 17060/20445/17348 26098/20447/17350 26099/20448/17351
+f 17055/20442/17345 24944/20444/17347 24945/20449/17352 17060/20445/17348
+f 17060/20445/17348 24945/20449/17352 30962/20450/17353 26098/20447/17350
+f 17053/20437/17340 17056/20446/17349 17061/20451/17354 17057/20438/17341
+f 17057/20438/17341 17061/20451/17354 24873/19983/16891 24872/19978/16886
+f 17056/20446/17349 26099/20448/17351 26100/20452/17355 17061/20451/17354
+f 17061/20451/17354 26100/20452/17355 30938/19984/16892 24873/19983/16891
+f 17062/20453/17356 17066/20454/17357 17067/20455/17358 17063/20456/17359
+f 17063/20456/17359 17067/20455/17358 26100/20452/17355 26099/20448/17351
+f 17066/20454/17357 24875/19998/16906 24874/19997/16905 17067/20455/17358
+f 17067/20455/17358 24874/19997/16905 30938/19984/16892 26100/20452/17355
+f 17062/20453/17356 17063/20456/17359 17068/20457/17360 17064/20458/17361
+f 17064/20458/17361 17068/20457/17360 24946/20459/17362 24947/20460/17363
+f 17063/20456/17359 26099/20448/17351 26098/20447/17350 17068/20457/17360
+f 17068/20457/17360 26098/20447/17350 30962/20450/17353 24946/20459/17362
+f 17062/20453/17356 17064/20458/17361 17069/20461/17364 17065/20462/17365
+f 17065/20462/17365 17069/20461/17364 26101/20463/17366 26102/20464/17367
+f 17064/20458/17361 24947/20460/17363 24948/20465/17368 17069/20461/17364
+f 17069/20461/17364 24948/20465/17368 30963/20466/17369 26101/20463/17366
+f 17062/20453/17356 17065/20462/17365 17070/20467/17370 17066/20454/17357
+f 17066/20454/17357 17070/20467/17370 24876/20003/16911 24875/19998/16906
+f 17065/20462/17365 26102/20464/17367 26103/20468/17371 17070/20467/17370
+f 17070/20467/17370 26103/20468/17371 30939/20004/16912 24876/20003/16911
+f 17071/20469/17372 17075/20470/17373 17076/20471/17374 17072/20472/17375
+f 17072/20472/17375 17076/20471/17374 26103/20468/17371 26102/20464/17367
+f 17075/20470/17373 24878/20018/16926 24877/20017/16925 17076/20471/17374
+f 17076/20471/17374 24877/20017/16925 30939/20004/16912 26103/20468/17371
+f 17071/20469/17372 17072/20472/17375 17077/20473/17376 17073/20474/17377
+f 17073/20474/17377 17077/20473/17376 24949/20475/17378 24950/20476/17379
+f 17072/20472/17375 26102/20464/17367 26101/20463/17366 17077/20473/17376
+f 17077/20473/17376 26101/20463/17366 30963/20466/17369 24949/20475/17378
+f 17071/20469/17372 17073/20474/17377 17078/20477/17380 17074/20478/17381
+f 17074/20478/17381 17078/20477/17380 26104/20479/17382 26105/20480/17383
+f 17073/20474/17377 24950/20476/17379 24951/20481/17384 17078/20477/17380
+f 17078/20477/17380 24951/20481/17384 30964/20482/17385 26104/20479/17382
+f 17071/20469/17372 17074/20478/17381 17079/20483/17386 17075/20470/17373
+f 17075/20470/17373 17079/20483/17386 24879/20023/16931 24878/20018/16926
+f 17074/20478/17381 26105/20480/17383 26106/20484/17387 17079/20483/17386
+f 17079/20483/17386 26106/20484/17387 30940/20024/16932 24879/20023/16931
+f 17080/20485/17388 17084/20486/17389 17085/20487/17390 17081/20488/17391
+f 17081/20488/17391 17085/20487/17390 26106/20484/17387 26105/20480/17383
+f 17084/20486/17389 24881/20038/16946 24880/20037/16945 17085/20487/17390
+f 17085/20487/17390 24880/20037/16945 30940/20024/16932 26106/20484/17387
+f 17080/20485/17388 17081/20488/17391 17086/20489/17392 17082/20490/17393
+f 17082/20490/17393 17086/20489/17392 24952/20491/17394 24953/20492/17395
+f 17081/20488/17391 26105/20480/17383 26104/20479/17382 17086/20489/17392
+f 17086/20489/17392 26104/20479/17382 30964/20482/17385 24952/20491/17394
+f 17080/20485/17388 17082/20490/17393 17087/20493/17396 17083/20494/17397
+f 17083/20494/17397 17087/20493/17396 26107/20495/17398 26108/20496/17399
+f 17082/20490/17393 24953/20492/17395 24954/20497/17400 17087/20493/17396
+f 17087/20493/17396 24954/20497/17400 30965/20498/17401 26107/20495/17398
+f 17080/20485/17388 17083/20494/17397 17088/20499/17402 17084/20486/17389
+f 17084/20486/17389 17088/20499/17402 24882/20043/16951 24881/20038/16946
+f 17083/20494/17397 26108/20496/17399 26109/20500/17403 17088/20499/17402
+f 17088/20499/17402 26109/20500/17403 30941/20044/16952 24882/20043/16951
+f 17089/20501/17404 17093/20502/17405 17094/20503/17406 17090/20504/17407
+f 17090/20504/17407 17094/20503/17406 26109/20500/17403 26108/20496/17399
+f 17093/20502/17405 24884/20058/16966 24883/20057/16965 17094/20503/17406
+f 17094/20503/17406 24883/20057/16965 30941/20044/16952 26109/20500/17403
+f 17089/20501/17404 17090/20504/17407 17095/20505/17408 17091/20506/17409
+f 17091/20506/17409 17095/20505/17408 24955/20507/17410 24956/20508/17411
+f 17090/20504/17407 26108/20496/17399 26107/20495/17398 17095/20505/17408
+f 17095/20505/17408 26107/20495/17398 30965/20498/17401 24955/20507/17410
+f 17089/20501/17404 17091/20506/17409 17096/20509/17412 17092/20510/17413
+f 17092/20510/17413 17096/20509/17412 26110/20511/17414 26111/20512/17415
+f 17091/20506/17409 24956/20508/17411 24957/20513/17416 17096/20509/17412
+f 17096/20509/17412 24957/20513/17416 30966/20514/17417 26110/20511/17414
+f 17089/20501/17404 17092/20510/17413 17097/20515/17418 17093/20502/17405
+f 17093/20502/17405 17097/20515/17418 24885/20063/16971 24884/20058/16966
+f 17092/20510/17413 26111/20512/17415 26112/20516/17419 17097/20515/17418
+f 17097/20515/17418 26112/20516/17419 30942/20064/16972 24885/20063/16971
+f 17098/20517/17420 17102/20518/17421 17103/20519/17422 17099/20520/17423
+f 17099/20520/17423 17103/20519/17422 26112/20516/17419 26111/20512/17415
+f 17102/20518/17421 24887/20078/16986 24886/20077/16985 17103/20519/17422
+f 17103/20519/17422 24886/20077/16985 30942/20064/16972 26112/20516/17419
+f 17098/20517/17420 17099/20520/17423 17104/20521/17424 17100/20522/17425
+f 17100/20522/17425 17104/20521/17424 24958/20523/17426 24959/20524/17427
+f 17099/20520/17423 26111/20512/17415 26110/20511/17414 17104/20521/17424
+f 17104/20521/17424 26110/20511/17414 30966/20514/17417 24958/20523/17426
+f 17098/20517/17420 17100/20522/17425 17105/20525/17428 17101/20526/17429
+f 17101/20526/17429 17105/20525/17428 26113/20527/17430 26114/20528/17431
+f 17100/20522/17425 24959/20524/17427 24960/20529/17432 17105/20525/17428
+f 17105/20525/17428 24960/20529/17432 30967/20530/17433 26113/20527/17430
+f 17098/20517/17420 17101/20526/17429 17106/20531/17434 17102/20518/17421
+f 17102/20518/17421 17106/20531/17434 24888/20083/16991 24887/20078/16986
+f 17101/20526/17429 26114/20528/17431 26115/20532/17435 17106/20531/17434
+f 17106/20531/17434 26115/20532/17435 30943/20084/16992 24888/20083/16991
+f 17107/20533/17436 17111/20534/17437 17112/20535/17438 17108/20536/17439
+f 17108/20536/17439 17112/20535/17438 26115/20532/17435 26114/20528/17431
+f 17111/20534/17437 24890/20098/17006 24889/20097/17005 17112/20535/17438
+f 17112/20535/17438 24889/20097/17005 30943/20084/16992 26115/20532/17435
+f 17107/20533/17436 17108/20536/17439 17113/20537/17440 17109/20538/17441
+f 17109/20538/17441 17113/20537/17440 24961/20539/17442 24962/20540/17443
+f 17108/20536/17439 26114/20528/17431 26113/20527/17430 17113/20537/17440
+f 17113/20537/17440 26113/20527/17430 30967/20530/17433 24961/20539/17442
+f 17107/20533/17436 17109/20538/17441 17114/20541/17444 17110/20542/17445
+f 17110/20542/17445 17114/20541/17444 26116/20543/17446 26117/20544/17447
+f 17109/20538/17441 24962/20540/17443 24963/20545/17448 17114/20541/17444
+f 17114/20541/17444 24963/20545/17448 30968/20546/17449 26116/20543/17446
+f 17107/20533/17436 17110/20542/17445 17115/20547/17450 17111/20534/17437
+f 17111/20534/17437 17115/20547/17450 24891/20103/17011 24890/20098/17006
+f 17110/20542/17445 26117/20544/17447 26118/20548/17451 17115/20547/17450
+f 17115/20547/17450 26118/20548/17451 30944/20104/17012 24891/20103/17011
+f 17116/20549/17452 17120/20550/17453 17121/20551/17454 17117/20552/17455
+f 17117/20552/17455 17121/20551/17454 26118/20548/17451 26117/20544/17447
+f 17120/20550/17453 24893/20118/17026 24892/20117/17025 17121/20551/17454
+f 17121/20551/17454 24892/20117/17025 30944/20104/17012 26118/20548/17451
+f 17116/20549/17452 17117/20552/17455 17122/20553/17456 17118/20554/17457
+f 17118/20554/17457 17122/20553/17456 24964/20555/17458 24965/20556/17459
+f 17117/20552/17455 26117/20544/17447 26116/20543/17446 17122/20553/17456
+f 17122/20553/17456 26116/20543/17446 30968/20546/17449 24964/20555/17458
+f 17116/20549/17452 17118/20554/17457 17123/20557/17460 17119/20558/17461
+f 17119/20558/17461 17123/20557/17460 26119/20559/17462 26120/20560/17463
+f 17118/20554/17457 24965/20556/17459 24966/20561/17464 17123/20557/17460
+f 17123/20557/17460 24966/20561/17464 30969/20562/17465 26119/20559/17462
+f 17116/20549/17452 17119/20558/17461 17124/20563/17466 17120/20550/17453
+f 17120/20550/17453 17124/20563/17466 24894/20123/17031 24893/20118/17026
+f 17119/20558/17461 26120/20560/17463 26121/20564/17467 17124/20563/17466
+f 17124/20563/17466 26121/20564/17467 30945/20124/17032 24894/20123/17031
+f 17125/20565/17468 17129/20566/17469 17130/20567/17470 17126/20568/17471
+f 17126/20568/17471 17130/20567/17470 26121/20564/17467 26120/20560/17463
+f 17129/20566/17469 24896/20138/17046 24895/20137/17045 17130/20567/17470
+f 17130/20567/17470 24895/20137/17045 30945/20124/17032 26121/20564/17467
+f 17125/20565/17468 17126/20568/17471 17131/20569/17472 17127/20570/17473
+f 17127/20570/17473 17131/20569/17472 24967/20571/17474 24968/20572/17475
+f 17126/20568/17471 26120/20560/17463 26119/20559/17462 17131/20569/17472
+f 17131/20569/17472 26119/20559/17462 30969/20562/17465 24967/20571/17474
+f 17125/20565/17468 17127/20570/17473 17132/20573/17476 17128/20574/17477
+f 17128/20574/17477 17132/20573/17476 26122/20575/17478 26123/20576/17479
+f 17127/20570/17473 24968/20572/17475 24969/20577/17480 17132/20573/17476
+f 17132/20573/17476 24969/20577/17480 30970/20578/17481 26122/20575/17478
+f 17125/20565/17468 17128/20574/17477 17133/20579/17482 17129/20566/17469
+f 17129/20566/17469 17133/20579/17482 24897/20143/17051 24896/20138/17046
+f 17128/20574/17477 26123/20576/17479 26124/20580/17483 17133/20579/17482
+f 17133/20579/17482 26124/20580/17483 30946/20144/17052 24897/20143/17051
+f 17134/20581/17484 17138/20582/17485 17139/20583/17486 17135/20584/17487
+f 17135/20584/17487 17139/20583/17486 26124/20580/17483 26123/20576/17479
+f 17138/20582/17485 24899/20158/17066 24898/20157/17065 17139/20583/17486
+f 17139/20583/17486 24898/20157/17065 30946/20144/17052 26124/20580/17483
+f 17134/20581/17484 17135/20584/17487 17140/20585/17488 17136/20586/17489
+f 17136/20586/17489 17140/20585/17488 24970/20587/17490 24971/20588/17491
+f 17135/20584/17487 26123/20576/17479 26122/20575/17478 17140/20585/17488
+f 17140/20585/17488 26122/20575/17478 30970/20578/17481 24970/20587/17490
+f 17134/20581/17484 17136/20586/17489 17141/20589/17492 17137/20590/17493
+f 17137/20590/17493 17141/20589/17492 26125/20591/17494 26126/20592/17495
+f 17136/20586/17489 24971/20588/17491 24972/20593/17496 17141/20589/17492
+f 17141/20589/17492 24972/20593/17496 30971/20594/17497 26125/20591/17494
+f 17134/20581/17484 17137/20590/17493 17142/20595/17498 17138/20582/17485
+f 17138/20582/17485 17142/20595/17498 24900/20163/17071 24899/20158/17066
+f 17137/20590/17493 26126/20592/17495 26127/20596/17499 17142/20595/17498
+f 17142/20595/17498 26127/20596/17499 30947/20164/17072 24900/20163/17071
+f 17143/20597/17500 17147/20598/17501 17148/20599/17502 17144/20600/17503
+f 17144/20600/17503 17148/20599/17502 26127/20596/17499 26126/20592/17495
+f 17147/20598/17501 24902/20178/17086 24901/20177/17085 17148/20599/17502
+f 17148/20599/17502 24901/20177/17085 30947/20164/17072 26127/20596/17499
+f 17143/20597/17500 17144/20600/17503 17149/20601/17504 17145/20602/17505
+f 17145/20602/17505 17149/20601/17504 24973/20603/17506 24974/20604/17507
+f 17144/20600/17503 26126/20592/17495 26125/20591/17494 17149/20601/17504
+f 17149/20601/17504 26125/20591/17494 30971/20594/17497 24973/20603/17506
+f 17143/20597/17500 17145/20602/17505 17150/20605/17508 17146/20606/17509
+f 17146/20606/17509 17150/20605/17508 26128/20607/17510 26129/20608/17511
+f 17145/20602/17505 24974/20604/17507 24975/20609/17512 17150/20605/17508
+f 17150/20605/17508 24975/20609/17512 30972/20610/17513 26128/20607/17510
+f 17143/20597/17500 17146/20606/17509 17151/20611/17514 17147/20598/17501
+f 17147/20598/17501 17151/20611/17514 24903/20183/17091 24902/20178/17086
+f 17146/20606/17509 26129/20608/17511 26130/20612/17515 17151/20611/17514
+f 17151/20611/17514 26130/20612/17515 30948/20184/17092 24903/20183/17091
+f 17152/20613/17516 17156/20614/17517 17157/20615/17518 17153/20616/17519
+f 17153/20616/17519 17157/20615/17518 26130/20612/17515 26129/20608/17511
+f 17156/20614/17517 24905/20198/17106 24904/20197/17105 17157/20615/17518
+f 17157/20615/17518 24904/20197/17105 30948/20184/17092 26130/20612/17515
+f 17152/20613/17516 17153/20616/17519 17158/20617/17520 17154/20618/17521
+f 17154/20618/17521 17158/20617/17520 24976/20619/17522 24977/20620/17523
+f 17153/20616/17519 26129/20608/17511 26128/20607/17510 17158/20617/17520
+f 17158/20617/17520 26128/20607/17510 30972/20610/17513 24976/20619/17522
+f 17152/20613/17516 17154/20618/17521 17159/20621/17524 17155/20622/17525
+f 17155/20622/17525 17159/20621/17524 26131/20623/17526 26132/20624/17527
+f 17154/20618/17521 24977/20620/17523 24978/20625/17528 17159/20621/17524
+f 17159/20621/17524 24978/20625/17528 30973/20626/17529 26131/20623/17526
+f 17152/20613/17516 17155/20622/17525 17160/20627/17530 17156/20614/17517
+f 17156/20614/17517 17160/20627/17530 24906/20203/17111 24905/20198/17106
+f 17155/20622/17525 26132/20624/17527 26133/20628/17531 17160/20627/17530
+f 17160/20627/17530 26133/20628/17531 30949/20204/17112 24906/20203/17111
+f 17161/20629/17532 17165/20630/17533 17166/20631/17534 17162/20632/17535
+f 17162/20632/17535 17166/20631/17534 26133/20628/17531 26132/20624/17527
+f 17165/20630/17533 24908/20218/17126 24907/20217/17125 17166/20631/17534
+f 17166/20631/17534 24907/20217/17125 30949/20204/17112 26133/20628/17531
+f 17161/20629/17532 17162/20632/17535 17167/20633/17536 17163/20634/17537
+f 17163/20634/17537 17167/20633/17536 24979/20635/17538 24980/20636/17539
+f 17162/20632/17535 26132/20624/17527 26131/20623/17526 17167/20633/17536
+f 17167/20633/17536 26131/20623/17526 30973/20626/17529 24979/20635/17538
+f 17161/20629/17532 17163/20634/17537 17168/20637/17540 17164/20638/17541
+f 17164/20638/17541 17168/20637/17540 26134/20639/17542 26135/20640/17543
+f 17163/20634/17537 24980/20636/17539 24981/20641/17544 17168/20637/17540
+f 17168/20637/17540 24981/20641/17544 30974/20642/17545 26134/20639/17542
+f 17161/20629/17532 17164/20638/17541 17169/20643/17546 17165/20630/17533
+f 17165/20630/17533 17169/20643/17546 24909/20223/17131 24908/20218/17126
+f 17164/20638/17541 26135/20640/17543 26136/20644/17547 17169/20643/17546
+f 17169/20643/17546 26136/20644/17547 30950/20224/17132 24909/20223/17131
+f 17170/20645/17548 17174/20646/17549 17175/20647/17550 17171/20648/17551
+f 17171/20648/17551 17175/20647/17550 26136/20649/17547 26135/20650/17543
+f 17174/20646/17549 24911/20241/17146 24910/20240/17145 17175/20647/17550
+f 17175/20647/17550 24910/20240/17145 30950/20243/17132 26136/20649/17547
+f 17170/20645/17548 17171/20648/17551 17176/20651/17552 17172/20652/17553
+f 17172/20652/17553 17176/20651/17552 24982/20653/17554 24983/20654/17555
+f 17171/20648/17551 26135/20650/17543 26134/20655/17542 17176/20651/17552
+f 17176/20651/17552 26134/20655/17542 30974/20656/17545 24982/20653/17554
+f 17170/20645/17548 17172/20652/17553 17177/20657/17556 17173/20658/17557
+f 17173/20658/17557 17177/20657/17556 26137/20659/17558 26138/20660/17559
+f 17172/20652/17553 24983/20654/17555 24984/20661/17560 17177/20657/17556
+f 17177/20657/17556 24984/20661/17560 30975/20662/17561 26137/20659/17558
+f 17170/20645/17548 17173/20658/17557 17178/20663/17562 17174/20646/17549
+f 17174/20646/17549 17178/20663/17562 24912/20248/17151 24911/20241/17146
+f 17173/20658/17557 26138/20660/17559 26139/20664/17563 17178/20663/17562
+f 17178/20663/17562 26139/20664/17563 30951/20249/17152 24912/20248/17151
+f 17179/20665/17564 17183/20666/17565 17184/20667/17566 17180/20668/17567
+f 17180/20668/17567 17184/20667/17566 26139/20664/17563 26138/20660/17559
+f 17183/20666/17565 24914/20263/17166 24913/20262/17165 17184/20667/17566
+f 17184/20667/17566 24913/20262/17165 30951/20249/17152 26139/20664/17563
+f 17179/20665/17564 17180/20668/17567 17185/20669/17568 17181/20670/17569
+f 17181/20670/17569 17185/20669/17568 24985/20671/17570 24986/20672/17571
+f 17180/20668/17567 26138/20660/17559 26137/20659/17558 17185/20669/17568
+f 17185/20669/17568 26137/20659/17558 30975/20662/17561 24985/20671/17570
+f 17179/20665/17564 17181/20670/17569 17186/20673/17572 17182/20674/17573
+f 17182/20674/17573 17186/20673/17572 26140/20675/17574 26141/20676/17575
+f 17181/20670/17569 24986/20672/17571 24987/20677/17576 17186/20673/17572
+f 17186/20673/17572 24987/20677/17576 30976/20678/17577 26140/20675/17574
+f 17179/20665/17564 17182/20674/17573 17187/20679/17578 17183/20666/17565
+f 17183/20666/17565 17187/20679/17578 24915/20268/17171 24914/20263/17166
+f 17182/20674/17573 26141/20676/17575 26142/20680/17579 17187/20679/17578
+f 17187/20679/17578 26142/20680/17579 30952/20269/17172 24915/20268/17171
+f 17188/20681/17580 17192/20682/17581 17193/20683/17582 17189/20684/17583
+f 17189/20684/17583 17193/20683/17582 26142/20680/17579 26141/20676/17575
+f 17192/20682/17581 24917/20283/17186 24916/20282/17185 17193/20683/17582
+f 17193/20683/17582 24916/20282/17185 30952/20269/17172 26142/20680/17579
+f 17188/20681/17580 17189/20684/17583 17194/20685/17584 17190/20686/17585
+f 17190/20686/17585 17194/20685/17584 24988/20687/17586 24989/20688/17587
+f 17189/20684/17583 26141/20676/17575 26140/20675/17574 17194/20685/17584
+f 17194/20685/17584 26140/20675/17574 30976/20678/17577 24988/20687/17586
+f 17188/20681/17580 17190/20686/17585 17195/20689/17588 17191/20690/17589
+f 17191/20690/17589 17195/20689/17588 26143/20691/17590 26144/20692/17591
+f 17190/20686/17585 24989/20688/17587 24990/20693/17592 17195/20689/17588
+f 17195/20689/17588 24990/20693/17592 30977/20694/17593 26143/20691/17590
+f 17188/20681/17580 17191/20690/17589 17196/20695/17594 17192/20682/17581
+f 17192/20682/17581 17196/20695/17594 24918/20288/17191 24917/20283/17186
+f 17191/20690/17589 26144/20692/17591 26145/20696/17595 17196/20695/17594
+f 17196/20695/17594 26145/20696/17595 30953/20289/17192 24918/20288/17191
+f 17197/20697/17596 17201/20698/17597 17202/20699/17598 17198/20700/17599
+f 17198/20700/17599 17202/20699/17598 26145/20696/17595 26144/20692/17591
+f 17201/20698/17597 24920/20303/17206 24919/20302/17205 17202/20699/17598
+f 17202/20699/17598 24919/20302/17205 30953/20289/17192 26145/20696/17595
+f 17197/20697/17596 17198/20700/17599 17203/20701/17600 17199/20702/17601
+f 17199/20702/17601 17203/20701/17600 24991/20703/17602 24992/20704/17603
+f 17198/20700/17599 26144/20692/17591 26143/20691/17590 17203/20701/17600
+f 17203/20701/17600 26143/20691/17590 30977/20694/17593 24991/20703/17602
+f 17197/20697/17596 17199/20702/17601 17204/20705/17604 17200/20706/17605
+f 17200/20706/17605 17204/20705/17604 26146/20707/17606 26147/20708/17607
+f 17199/20702/17601 24992/20704/17603 24993/20709/17608 17204/20705/17604
+f 17204/20705/17604 24993/20709/17608 30978/20710/17609 26146/20707/17606
+f 17197/20697/17596 17200/20706/17605 17205/20711/17610 17201/20698/17597
+f 17201/20698/17597 17205/20711/17610 24921/20308/17211 24920/20303/17206
+f 17200/20706/17605 26147/20708/17607 26148/20712/17611 17205/20711/17610
+f 17205/20711/17610 26148/20712/17611 30954/20309/17212 24921/20308/17211
+f 17206/20713/17612 17210/20714/17613 17211/20715/17614 17207/20716/17615
+f 17207/20716/17615 17211/20715/17614 26148/20712/17611 26147/20708/17607
+f 17210/20714/17613 24923/20323/17226 24922/20322/17225 17211/20715/17614
+f 17211/20715/17614 24922/20322/17225 30954/20309/17212 26148/20712/17611
+f 17206/20713/17612 17207/20716/17615 17212/20717/17616 17208/20718/17617
+f 17208/20718/17617 17212/20717/17616 24994/20719/17618 24995/20720/17619
+f 17207/20716/17615 26147/20708/17607 26146/20707/17606 17212/20717/17616
+f 17212/20717/17616 26146/20707/17606 30978/20710/17609 24994/20719/17618
+f 17206/20713/17612 17208/20718/17617 17213/20721/17620 17209/20722/17621
+f 17209/20722/17621 17213/20721/17620 26149/20723/17622 26150/20724/17623
+f 17208/20718/17617 24995/20720/17619 24996/20725/17624 17213/20721/17620
+f 17213/20721/17620 24996/20725/17624 30979/20726/17625 26149/20723/17622
+f 17206/20713/17612 17209/20722/17621 17214/20727/17626 17210/20714/17613
+f 17210/20714/17613 17214/20727/17626 24924/20328/17231 24923/20323/17226
+f 17209/20722/17621 26150/20724/17623 26151/20728/17627 17214/20727/17626
+f 17214/20727/17626 26151/20728/17627 30955/20329/17232 24924/20328/17231
+f 17215/20729/17628 17219/20730/17629 17220/20731/17630 17216/20732/17631
+f 17216/20732/17631 17220/20731/17630 26151/20728/17627 26150/20724/17623
+f 17219/20730/17629 24926/20343/17246 24925/20342/17245 17220/20731/17630
+f 17220/20731/17630 24925/20342/17245 30955/20329/17232 26151/20728/17627
+f 17215/20729/17628 17216/20732/17631 17221/20733/17632 17217/20734/17633
+f 17217/20734/17633 17221/20733/17632 24997/20735/17634 24998/20736/17635
+f 17216/20732/17631 26150/20724/17623 26149/20723/17622 17221/20733/17632
+f 17221/20733/17632 26149/20723/17622 30979/20726/17625 24997/20735/17634
+f 17215/20729/17628 17217/20734/17633 17222/20737/17636 17218/20738/17637
+f 17218/20738/17637 17222/20737/17636 26152/20739/17638 26153/20740/17639
+f 17217/20734/17633 24998/20736/17635 24999/20741/17640 17222/20737/17636
+f 17222/20737/17636 24999/20741/17640 30980/20742/17641 26152/20739/17638
+f 17215/20729/17628 17218/20738/17637 17223/20743/17642 17219/20730/17629
+f 17219/20730/17629 17223/20743/17642 24927/20348/17251 24926/20343/17246
+f 17218/20738/17637 26153/20740/17639 26154/20744/17643 17223/20743/17642
+f 17223/20743/17642 26154/20744/17643 30956/20349/17252 24927/20348/17251
+f 17224/20745/17644 17228/20746/17645 17229/20747/17646 17225/20748/17647
+f 17225/20748/17647 17229/20747/17646 26154/20744/17643 26153/20740/17639
+f 17228/20746/17645 24929/20363/17266 24928/20362/17265 17229/20747/17646
+f 17229/20747/17646 24928/20362/17265 30956/20349/17252 26154/20744/17643
+f 17224/20745/17644 17225/20748/17647 17230/20749/17648 17226/20750/17649
+f 17226/20750/17649 17230/20749/17648 25000/20751/17650 25001/20752/17651
+f 17225/20748/17647 26153/20740/17639 26152/20739/17638 17230/20749/17648
+f 17230/20749/17648 26152/20739/17638 30980/20742/17641 25000/20751/17650
+f 17224/20745/17644 17226/20750/17649 17231/20753/17652 17227/20754/17653
+f 17227/20754/17653 17231/20753/17652 26085/20379/17282 26084/20374/17277
+f 17226/20750/17649 25001/20752/17651 25002/20755/17654 17231/20753/17652
+f 17231/20753/17652 25002/20755/17654 30957/20380/17283 26085/20379/17282
+f 17224/20745/17644 17227/20754/17653 17232/20756/17655 17228/20746/17645
+f 17228/20746/17645 17232/20756/17655 24930/20366/17269 24929/20363/17266
+f 17227/20754/17653 26084/20374/17277 26083/20373/17276 17232/20756/17655
+f 17232/20756/17655 26083/20373/17276 30933/19898/16806 24930/20366/17269
+f 17233/20757/17656 17237/20758/17657 17238/20759/17658 17234/20760/17659
+f 17234/20760/17659 17238/20759/17658 24933/20385/17288 24932/20378/17281
+f 17237/20758/17657 26285/20761/17660 26286/20762/17661 17238/20759/17658
+f 17238/20759/17658 26286/20762/17661 30958/20386/17289 24933/20385/17288
+f 17233/20757/17656 17234/20760/17659 17239/20763/17662 17235/20764/17663
+f 17235/20764/17663 17239/20763/17662 26287/20765/17664 26288/20766/17665
+f 17234/20760/17659 24932/20378/17281 24931/20377/17280 17239/20763/17662
+f 17239/20763/17662 24931/20377/17280 30957/20380/17283 26287/20765/17664
+f 17233/20757/17656 17235/20764/17663 17240/20767/17666 17236/20768/17667
+f 17236/20768/17667 17240/20767/17666 26155/20769/17668 26156/20770/17669
+f 17235/20764/17663 26288/20766/17665 26289/20771/17670 17240/20767/17666
+f 17240/20767/17666 26289/20771/17670 30981/20772/17671 26155/20769/17668
+f 17233/20757/17656 17236/20768/17667 17241/20773/17672 17237/20758/17657
+f 17237/20758/17657 17241/20773/17672 26284/20774/17673 26285/20761/17660
+f 17236/20768/17667 26156/20770/17669 26157/20775/17674 17241/20773/17672
+f 17241/20773/17672 26157/20775/17674 30982/20776/17675 26284/20774/17673
+f 17242/20777/17676 17246/20778/17677 17247/20779/17678 17243/20780/17679
+f 17243/20780/17679 17247/20779/17678 24936/20401/17304 24935/20396/17299
+f 17246/20778/17677 26282/20781/17680 26283/20782/17681 17247/20779/17678
+f 17247/20779/17678 26283/20782/17681 30959/20402/17305 24936/20401/17304
+f 17242/20777/17676 17243/20780/17679 17248/20783/17682 17244/20784/17683
+f 17244/20784/17683 17248/20783/17682 26286/20762/17661 26285/20761/17660
+f 17243/20780/17679 24935/20396/17299 24934/20395/17298 17248/20783/17682
+f 17248/20783/17682 24934/20395/17298 30958/20386/17289 26286/20762/17661
+f 17242/20777/17676 17244/20784/17683 17249/20785/17684 17245/20786/17685
+f 17245/20786/17685 17249/20785/17684 26158/20787/17686 26159/20788/17687
+f 17244/20784/17683 26285/20761/17660 26284/20774/17673 17249/20785/17684
+f 17249/20785/17684 26284/20774/17673 30982/20776/17675 26158/20787/17686
+f 17242/20777/17676 17245/20786/17685 17250/20789/17688 17246/20778/17677
+f 17246/20778/17677 17250/20789/17688 26281/20790/17689 26282/20781/17680
+f 17245/20786/17685 26159/20788/17687 26160/20791/17690 17250/20789/17688
+f 17250/20789/17688 26160/20791/17690 30983/20792/17691 26281/20790/17689
+f 17251/20793/17692 17255/20794/17693 17256/20795/17694 17252/20796/17695
+f 17252/20796/17695 17256/20795/17694 24939/20417/17320 24938/20412/17315
+f 17255/20794/17693 26279/20797/17696 26280/20798/17697 17256/20795/17694
+f 17256/20795/17694 26280/20798/17697 30960/20418/17321 24939/20417/17320
+f 17251/20793/17692 17252/20796/17695 17257/20799/17698 17253/20800/17699
+f 17253/20800/17699 17257/20799/17698 26283/20782/17681 26282/20781/17680
+f 17252/20796/17695 24938/20412/17315 24937/20411/17314 17257/20799/17698
+f 17257/20799/17698 24937/20411/17314 30959/20402/17305 26283/20782/17681
+f 17251/20793/17692 17253/20800/17699 17258/20801/17700 17254/20802/17701
+f 17254/20802/17701 17258/20801/17700 26161/20803/17702 26162/20804/17703
+f 17253/20800/17699 26282/20781/17680 26281/20790/17689 17258/20801/17700
+f 17258/20801/17700 26281/20790/17689 30983/20792/17691 26161/20803/17702
+f 17251/20793/17692 17254/20802/17701 17259/20805/17704 17255/20794/17693
+f 17255/20794/17693 17259/20805/17704 26278/20806/17705 26279/20797/17696
+f 17254/20802/17701 26162/20804/17703 26163/20807/17706 17259/20805/17704
+f 17259/20805/17704 26163/20807/17706 30984/20808/17707 26278/20806/17705
+f 17260/20809/17708 17264/20810/17709 17265/20811/17710 17261/20812/17711
+f 17261/20812/17711 17265/20811/17710 24942/20433/17336 24941/20428/17331
+f 17264/20810/17709 26276/20813/17712 26277/20814/17713 17265/20811/17710
+f 17265/20811/17710 26277/20814/17713 30961/20434/17337 24942/20433/17336
+f 17260/20809/17708 17261/20812/17711 17266/20815/17714 17262/20816/17715
+f 17262/20816/17715 17266/20815/17714 26280/20798/17697 26279/20797/17696
+f 17261/20812/17711 24941/20428/17331 24940/20427/17330 17266/20815/17714
+f 17266/20815/17714 24940/20427/17330 30960/20418/17321 26280/20798/17697
+f 17260/20809/17708 17262/20816/17715 17267/20817/17716 17263/20818/17717
+f 17263/20818/17717 17267/20817/17716 26164/20819/17718 26165/20820/17719
+f 17262/20816/17715 26279/20797/17696 26278/20806/17705 17267/20817/17716
+f 17267/20817/17716 26278/20806/17705 30984/20808/17707 26164/20819/17718
+f 17260/20809/17708 17263/20818/17717 17268/20821/17720 17264/20810/17709
+f 17264/20810/17709 17268/20821/17720 26275/20822/17721 26276/20813/17712
+f 17263/20818/17717 26165/20820/17719 26166/20823/17722 17268/20821/17720
+f 17268/20821/17720 26166/20823/17722 30985/20824/17723 26275/20822/17721
+f 17269/20825/17724 17273/20826/17725 17274/20827/17726 17270/20828/17727
+f 17270/20828/17727 17274/20827/17726 24945/20449/17352 24944/20444/17347
+f 17273/20826/17725 26273/20829/17728 26274/20830/17729 17274/20827/17726
+f 17274/20827/17726 26274/20830/17729 30962/20450/17353 24945/20449/17352
+f 17269/20825/17724 17270/20828/17727 17275/20831/17730 17271/20832/17731
+f 17271/20832/17731 17275/20831/17730 26277/20814/17713 26276/20813/17712
+f 17270/20828/17727 24944/20444/17347 24943/20443/17346 17275/20831/17730
+f 17275/20831/17730 24943/20443/17346 30961/20434/17337 26277/20814/17713
+f 17269/20825/17724 17271/20832/17731 17276/20833/17732 17272/20834/17733
+f 17272/20834/17733 17276/20833/17732 26167/20835/17734 26168/20836/17735
+f 17271/20832/17731 26276/20813/17712 26275/20822/17721 17276/20833/17732
+f 17276/20833/17732 26275/20822/17721 30985/20824/17723 26167/20835/17734
+f 17269/20825/17724 17272/20834/17733 17277/20837/17736 17273/20826/17725
+f 17273/20826/17725 17277/20837/17736 26272/20838/17737 26273/20829/17728
+f 17272/20834/17733 26168/20836/17735 26169/20839/17738 17277/20837/17736
+f 17277/20837/17736 26169/20839/17738 30986/20840/17739 26272/20838/17737
+f 17278/20841/17740 17282/20842/17741 17283/20843/17742 17279/20844/17743
+f 17279/20844/17743 17283/20843/17742 24948/20465/17368 24947/20460/17363
+f 17282/20842/17741 26270/20845/17744 26271/20846/17745 17283/20843/17742
+f 17283/20843/17742 26271/20846/17745 30963/20466/17369 24948/20465/17368
+f 17278/20841/17740 17279/20844/17743 17284/20847/17746 17280/20848/17747
+f 17280/20848/17747 17284/20847/17746 26274/20830/17729 26273/20829/17728
+f 17279/20844/17743 24947/20460/17363 24946/20459/17362 17284/20847/17746
+f 17284/20847/17746 24946/20459/17362 30962/20450/17353 26274/20830/17729
+f 17278/20841/17740 17280/20848/17747 17285/20849/17748 17281/20850/17749
+f 17281/20850/17749 17285/20849/17748 26170/20851/17750 26171/20852/17751
+f 17280/20848/17747 26273/20829/17728 26272/20838/17737 17285/20849/17748
+f 17285/20849/17748 26272/20838/17737 30986/20840/17739 26170/20851/17750
+f 17278/20841/17740 17281/20850/17749 17286/20853/17752 17282/20842/17741
+f 17282/20842/17741 17286/20853/17752 26269/20854/17753 26270/20845/17744
+f 17281/20850/17749 26171/20852/17751 26172/20855/17754 17286/20853/17752
+f 17286/20853/17752 26172/20855/17754 30987/20856/17755 26269/20854/17753
+f 17287/20857/17756 17291/20858/17757 17292/20859/17758 17288/20860/17759
+f 17288/20860/17759 17292/20859/17758 24951/20481/17384 24950/20476/17379
+f 17291/20858/17757 26267/20861/17760 26268/20862/17761 17292/20859/17758
+f 17292/20859/17758 26268/20862/17761 30964/20482/17385 24951/20481/17384
+f 17287/20857/17756 17288/20860/17759 17293/20863/17762 17289/20864/17763
+f 17289/20864/17763 17293/20863/17762 26271/20846/17745 26270/20845/17744
+f 17288/20860/17759 24950/20476/17379 24949/20475/17378 17293/20863/17762
+f 17293/20863/17762 24949/20475/17378 30963/20466/17369 26271/20846/17745
+f 17287/20857/17756 17289/20864/17763 17294/20865/17764 17290/20866/17765
+f 17290/20866/17765 17294/20865/17764 26173/20867/17766 26174/20868/17767
+f 17289/20864/17763 26270/20845/17744 26269/20854/17753 17294/20865/17764
+f 17294/20865/17764 26269/20854/17753 30987/20856/17755 26173/20867/17766
+f 17287/20857/17756 17290/20866/17765 17295/20869/17768 17291/20858/17757
+f 17291/20858/17757 17295/20869/17768 26266/20870/17769 26267/20861/17760
+f 17290/20866/17765 26174/20868/17767 26175/20871/17770 17295/20869/17768
+f 17295/20869/17768 26175/20871/17770 30988/20872/17771 26266/20870/17769
+f 17296/20873/17772 17300/20874/17773 17301/20875/17774 17297/20876/17775
+f 17297/20876/17775 17301/20875/17774 24954/20497/17400 24953/20492/17395
+f 17300/20874/17773 26264/20877/17776 26265/20878/17777 17301/20875/17774
+f 17301/20875/17774 26265/20878/17777 30965/20498/17401 24954/20497/17400
+f 17296/20873/17772 17297/20876/17775 17302/20879/17778 17298/20880/17779
+f 17298/20880/17779 17302/20879/17778 26268/20862/17761 26267/20861/17760
+f 17297/20876/17775 24953/20492/17395 24952/20491/17394 17302/20879/17778
+f 17302/20879/17778 24952/20491/17394 30964/20482/17385 26268/20862/17761
+f 17296/20873/17772 17298/20880/17779 17303/20881/17780 17299/20882/17781
+f 17299/20882/17781 17303/20881/17780 26176/20883/17782 26177/20884/17783
+f 17298/20880/17779 26267/20861/17760 26266/20870/17769 17303/20881/17780
+f 17303/20881/17780 26266/20870/17769 30988/20872/17771 26176/20883/17782
+f 17296/20873/17772 17299/20882/17781 17304/20885/17784 17300/20874/17773
+f 17300/20874/17773 17304/20885/17784 26263/20886/17785 26264/20877/17776
+f 17299/20882/17781 26177/20884/17783 26178/20887/17786 17304/20885/17784
+f 17304/20885/17784 26178/20887/17786 30989/20888/17787 26263/20886/17785
+f 17305/20889/17788 17309/20890/17789 17310/20891/17790 17306/20892/17791
+f 17306/20892/17791 17310/20891/17790 24957/20513/17416 24956/20508/17411
+f 17309/20890/17789 26261/20893/17792 26262/20894/17793 17310/20891/17790
+f 17310/20891/17790 26262/20894/17793 30966/20514/17417 24957/20513/17416
+f 17305/20889/17788 17306/20892/17791 17311/20895/17794 17307/20896/17795
+f 17307/20896/17795 17311/20895/17794 26265/20878/17777 26264/20877/17776
+f 17306/20892/17791 24956/20508/17411 24955/20507/17410 17311/20895/17794
+f 17311/20895/17794 24955/20507/17410 30965/20498/17401 26265/20878/17777
+f 17305/20889/17788 17307/20896/17795 17312/20897/17796 17308/20898/17797
+f 17308/20898/17797 17312/20897/17796 26179/20899/17798 26180/20900/17799
+f 17307/20896/17795 26264/20877/17776 26263/20886/17785 17312/20897/17796
+f 17312/20897/17796 26263/20886/17785 30989/20888/17787 26179/20899/17798
+f 17305/20889/17788 17308/20898/17797 17313/20901/17800 17309/20890/17789
+f 17309/20890/17789 17313/20901/17800 26260/20902/17801 26261/20893/17792
+f 17308/20898/17797 26180/20900/17799 26181/20903/17802 17313/20901/17800
+f 17313/20901/17800 26181/20903/17802 30990/20904/17803 26260/20902/17801
+f 17314/20905/17804 17318/20906/17805 17319/20907/17806 17315/20908/17807
+f 17315/20908/17807 17319/20907/17806 24960/20529/17432 24959/20524/17427
+f 17318/20906/17805 26258/20909/17808 26259/20910/17809 17319/20907/17806
+f 17319/20907/17806 26259/20910/17809 30967/20530/17433 24960/20529/17432
+f 17314/20905/17804 17315/20908/17807 17320/20911/17810 17316/20912/17811
+f 17316/20912/17811 17320/20911/17810 26262/20894/17793 26261/20893/17792
+f 17315/20908/17807 24959/20524/17427 24958/20523/17426 17320/20911/17810
+f 17320/20911/17810 24958/20523/17426 30966/20514/17417 26262/20894/17793
+f 17314/20905/17804 17316/20912/17811 17321/20913/17812 17317/20914/17813
+f 17317/20914/17813 17321/20913/17812 26182/20915/17814 26183/20916/17815
+f 17316/20912/17811 26261/20893/17792 26260/20902/17801 17321/20913/17812
+f 17321/20913/17812 26260/20902/17801 30990/20904/17803 26182/20915/17814
+f 17314/20905/17804 17317/20914/17813 17322/20917/17816 17318/20906/17805
+f 17318/20906/17805 17322/20917/17816 26257/20918/17817 26258/20909/17808
+f 17317/20914/17813 26183/20916/17815 26184/20919/17818 17322/20917/17816
+f 17322/20917/17816 26184/20919/17818 30991/20920/17819 26257/20918/17817
+f 17323/20921/17820 17327/20922/17821 17328/20923/17822 17324/20924/17823
+f 17324/20924/17823 17328/20923/17822 24963/20545/17448 24962/20540/17443
+f 17327/20922/17821 26255/20925/17824 26256/20926/17825 17328/20923/17822
+f 17328/20923/17822 26256/20926/17825 30968/20546/17449 24963/20545/17448
+f 17323/20921/17820 17324/20924/17823 17329/20927/17826 17325/20928/17827
+f 17325/20928/17827 17329/20927/17826 26259/20910/17809 26258/20909/17808
+f 17324/20924/17823 24962/20540/17443 24961/20539/17442 17329/20927/17826
+f 17329/20927/17826 24961/20539/17442 30967/20530/17433 26259/20910/17809
+f 17323/20921/17820 17325/20928/17827 17330/20929/17828 17326/20930/17829
+f 17326/20930/17829 17330/20929/17828 26185/20931/17830 26186/20932/17831
+f 17325/20928/17827 26258/20909/17808 26257/20918/17817 17330/20929/17828
+f 17330/20929/17828 26257/20918/17817 30991/20920/17819 26185/20931/17830
+f 17323/20921/17820 17326/20930/17829 17331/20933/17832 17327/20922/17821
+f 17327/20922/17821 17331/20933/17832 26254/20934/17833 26255/20925/17824
+f 17326/20930/17829 26186/20932/17831 26187/20935/17834 17331/20933/17832
+f 17331/20933/17832 26187/20935/17834 30992/20936/17835 26254/20934/17833
+f 17332/20937/17836 17336/20938/17837 17337/20939/17838 17333/20940/17839
+f 17333/20940/17839 17337/20939/17838 24966/20561/17464 24965/20556/17459
+f 17336/20938/17837 26252/20941/17840 26253/20942/17841 17337/20939/17838
+f 17337/20939/17838 26253/20942/17841 30969/20562/17465 24966/20561/17464
+f 17332/20937/17836 17333/20940/17839 17338/20943/17842 17334/20944/17843
+f 17334/20944/17843 17338/20943/17842 26256/20926/17825 26255/20925/17824
+f 17333/20940/17839 24965/20556/17459 24964/20555/17458 17338/20943/17842
+f 17338/20943/17842 24964/20555/17458 30968/20546/17449 26256/20926/17825
+f 17332/20937/17836 17334/20944/17843 17339/20945/17844 17335/20946/17845
+f 17335/20946/17845 17339/20945/17844 26188/20947/17846 26189/20948/17847
+f 17334/20944/17843 26255/20925/17824 26254/20934/17833 17339/20945/17844
+f 17339/20945/17844 26254/20934/17833 30992/20936/17835 26188/20947/17846
+f 17332/20937/17836 17335/20946/17845 17340/20949/17848 17336/20938/17837
+f 17336/20938/17837 17340/20949/17848 26251/20950/17849 26252/20941/17840
+f 17335/20946/17845 26189/20948/17847 26190/20951/17850 17340/20949/17848
+f 17340/20949/17848 26190/20951/17850 30993/20952/17851 26251/20950/17849
+f 17341/20953/17852 17345/20954/17853 17346/20955/17854 17342/20956/17855
+f 17342/20956/17855 17346/20955/17854 24969/20577/17480 24968/20572/17475
+f 17345/20954/17853 26249/20957/17856 26250/20958/17857 17346/20955/17854
+f 17346/20955/17854 26250/20958/17857 30970/20578/17481 24969/20577/17480
+f 17341/20953/17852 17342/20956/17855 17347/20959/17858 17343/20960/17859
+f 17343/20960/17859 17347/20959/17858 26253/20942/17841 26252/20941/17840
+f 17342/20956/17855 24968/20572/17475 24967/20571/17474 17347/20959/17858
+f 17347/20959/17858 24967/20571/17474 30969/20562/17465 26253/20942/17841
+f 17341/20953/17852 17343/20960/17859 17348/20961/17860 17344/20962/17861
+f 17344/20962/17861 17348/20961/17860 26191/20963/17862 26192/20964/17863
+f 17343/20960/17859 26252/20941/17840 26251/20950/17849 17348/20961/17860
+f 17348/20961/17860 26251/20950/17849 30993/20952/17851 26191/20963/17862
+f 17341/20953/17852 17344/20962/17861 17349/20965/17864 17345/20954/17853
+f 17345/20954/17853 17349/20965/17864 26248/20966/17865 26249/20957/17856
+f 17344/20962/17861 26192/20964/17863 26193/20967/17866 17349/20965/17864
+f 17349/20965/17864 26193/20967/17866 30994/20968/17867 26248/20966/17865
+f 17350/20969/17868 17354/20970/17869 17355/20971/17870 17351/20972/17871
+f 17351/20972/17871 17355/20971/17870 24972/20593/17496 24971/20588/17491
+f 17354/20970/17869 26246/20973/17872 26247/20974/17873 17355/20971/17870
+f 17355/20971/17870 26247/20974/17873 30971/20594/17497 24972/20593/17496
+f 17350/20969/17868 17351/20972/17871 17356/20975/17874 17352/20976/17875
+f 17352/20976/17875 17356/20975/17874 26250/20958/17857 26249/20957/17856
+f 17351/20972/17871 24971/20588/17491 24970/20587/17490 17356/20975/17874
+f 17356/20975/17874 24970/20587/17490 30970/20578/17481 26250/20958/17857
+f 17350/20969/17868 17352/20976/17875 17357/20977/17876 17353/20978/17877
+f 17353/20978/17877 17357/20977/17876 26194/20979/17878 26195/20980/17879
+f 17352/20976/17875 26249/20957/17856 26248/20966/17865 17357/20977/17876
+f 17357/20977/17876 26248/20966/17865 30994/20968/17867 26194/20979/17878
+f 17350/20969/17868 17353/20978/17877 17358/20981/17880 17354/20970/17869
+f 17354/20970/17869 17358/20981/17880 26245/20982/17881 26246/20973/17872
+f 17353/20978/17877 26195/20980/17879 26196/20983/17882 17358/20981/17880
+f 17358/20981/17880 26196/20983/17882 30995/20984/17883 26245/20982/17881
+f 17359/20985/17884 17363/20986/17885 17364/20987/17886 17360/20988/17887
+f 17360/20988/17887 17364/20987/17886 24975/20609/17512 24974/20604/17507
+f 17363/20986/17885 26243/20989/17888 26244/20990/17889 17364/20987/17886
+f 17364/20987/17886 26244/20990/17889 30972/20610/17513 24975/20609/17512
+f 17359/20985/17884 17360/20988/17887 17365/20991/17890 17361/20992/17891
+f 17361/20992/17891 17365/20991/17890 26247/20974/17873 26246/20973/17872
+f 17360/20988/17887 24974/20604/17507 24973/20603/17506 17365/20991/17890
+f 17365/20991/17890 24973/20603/17506 30971/20594/17497 26247/20974/17873
+f 17359/20985/17884 17361/20992/17891 17366/20993/17892 17362/20994/17893
+f 17362/20994/17893 17366/20993/17892 26197/20995/17894 26198/20996/17895
+f 17361/20992/17891 26246/20973/17872 26245/20982/17881 17366/20993/17892
+f 17366/20993/17892 26245/20982/17881 30995/20984/17883 26197/20995/17894
+f 17359/20985/17884 17362/20994/17893 17367/20997/17896 17363/20986/17885
+f 17363/20986/17885 17367/20997/17896 26242/20998/17897 26243/20989/17888
+f 17362/20994/17893 26198/20996/17895 26199/20999/17898 17367/20997/17896
+f 17367/20997/17896 26199/20999/17898 30996/21000/17899 26242/20998/17897
+f 17368/21001/17900 17372/21002/17901 17373/21003/17902 17369/21004/17903
+f 17369/21004/17903 17373/21003/17902 24978/20625/17528 24977/20620/17523
+f 17372/21002/17901 26240/21005/17904 26241/21006/17905 17373/21003/17902
+f 17373/21003/17902 26241/21006/17905 30973/20626/17529 24978/20625/17528
+f 17368/21001/17900 17369/21004/17903 17374/21007/17906 17370/21008/17907
+f 17370/21008/17907 17374/21007/17906 26244/20990/17889 26243/20989/17888
+f 17369/21004/17903 24977/20620/17523 24976/20619/17522 17374/21007/17906
+f 17374/21007/17906 24976/20619/17522 30972/20610/17513 26244/20990/17889
+f 17368/21001/17900 17370/21008/17907 17375/21009/17908 17371/21010/17909
+f 17371/21010/17909 17375/21009/17908 26200/21011/17910 26201/21012/17911
+f 17370/21008/17907 26243/20989/17888 26242/20998/17897 17375/21009/17908
+f 17375/21009/17908 26242/20998/17897 30996/21000/17899 26200/21011/17910
+f 17368/21001/17900 17371/21010/17909 17376/21013/17912 17372/21002/17901
+f 17372/21002/17901 17376/21013/17912 26239/21014/17913 26240/21005/17904
+f 17371/21010/17909 26201/21012/17911 26202/21015/17914 17376/21013/17912
+f 17376/21013/17912 26202/21015/17914 30997/21016/17915 26239/21014/17913
+f 17377/21017/17916 17381/21018/17917 17382/21019/17918 17378/21020/17919
+f 17378/21020/17919 17382/21019/17918 24981/20641/17544 24980/20636/17539
+f 17381/21018/17917 26237/21021/17920 26238/21022/17921 17382/21019/17918
+f 17382/21019/17918 26238/21022/17921 30974/20642/17545 24981/20641/17544
+f 17377/21017/17916 17378/21020/17919 17383/21023/17922 17379/21024/17923
+f 17379/21024/17923 17383/21023/17922 26241/21006/17905 26240/21005/17904
+f 17378/21020/17919 24980/20636/17539 24979/20635/17538 17383/21023/17922
+f 17383/21023/17922 24979/20635/17538 30973/20626/17529 26241/21006/17905
+f 17377/21017/17916 17379/21024/17923 17384/21025/17924 17380/21026/17925
+f 17380/21026/17925 17384/21025/17924 26203/21027/17926 26204/21028/17927
+f 17379/21024/17923 26240/21005/17904 26239/21014/17913 17384/21025/17924
+f 17384/21025/17924 26239/21014/17913 30997/21016/17915 26203/21027/17926
+f 17377/21017/17916 17380/21026/17925 17385/21029/17928 17381/21018/17917
+f 17381/21018/17917 17385/21029/17928 26236/21030/17929 26237/21021/17920
+f 17380/21026/17925 26204/21028/17927 26205/21031/17930 17385/21029/17928
+f 17385/21029/17928 26205/21031/17930 30998/21032/17931 26236/21030/17929
+f 17386/21033/17932 17390/21034/17933 17391/21035/17934 17387/21036/17935
+f 17387/21036/17935 17391/21035/17934 24984/20661/17560 24983/20654/17555
+f 17390/21034/17933 26234/21037/17936 26235/21038/17937 17391/21035/17934
+f 17391/21035/17934 26235/21038/17937 30975/20662/17561 24984/20661/17560
+f 17386/21033/17932 17387/21036/17935 17392/21039/17938 17388/21040/17939
+f 17388/21040/17939 17392/21039/17938 26238/21041/17921 26237/21042/17920
+f 17387/21036/17935 24983/20654/17555 24982/20653/17554 17392/21039/17938
+f 17392/21039/17938 24982/20653/17554 30974/20656/17545 26238/21041/17921
+f 17386/21033/17932 17388/21040/17939 17393/21043/17940 17389/21044/17941
+f 17389/21044/17941 17393/21043/17940 26206/21045/17942 26207/21046/17943
+f 17388/21040/17939 26237/21042/17920 26236/21047/17929 17393/21043/17940
+f 17393/21043/17940 26236/21047/17929 30998/21048/17931 26206/21045/17942
+f 17386/21033/17932 17389/21044/17941 17394/21049/17944 17390/21034/17933
+f 17390/21034/17933 17394/21049/17944 26233/21050/17945 26234/21037/17936
+f 17389/21044/17941 26207/21046/17943 26208/21051/17946 17394/21049/17944
+f 17394/21049/17944 26208/21051/17946 30999/21052/17947 26233/21050/17945
+f 17395/21053/17948 17399/21054/17949 17400/21055/17950 17396/21056/17951
+f 17396/21056/17951 17400/21055/17950 24987/20677/17576 24986/20672/17571
+f 17399/21054/17949 26231/21057/17952 26232/21058/17953 17400/21055/17950
+f 17400/21055/17950 26232/21058/17953 30976/20678/17577 24987/20677/17576
+f 17395/21053/17948 17396/21056/17951 17401/21059/17954 17397/21060/17955
+f 17397/21060/17955 17401/21059/17954 26235/21038/17937 26234/21037/17936
+f 17396/21056/17951 24986/20672/17571 24985/20671/17570 17401/21059/17954
+f 17401/21059/17954 24985/20671/17570 30975/20662/17561 26235/21038/17937
+f 17395/21053/17948 17397/21060/17955 17402/21061/17956 17398/21062/17957
+f 17398/21062/17957 17402/21061/17956 26209/21063/17958 26210/21064/17959
+f 17397/21060/17955 26234/21037/17936 26233/21050/17945 17402/21061/17956
+f 17402/21061/17956 26233/21050/17945 30999/21052/17947 26209/21063/17958
+f 17395/21053/17948 17398/21062/17957 17403/21065/17960 17399/21054/17949
+f 17399/21054/17949 17403/21065/17960 26230/21066/17961 26231/21057/17952
+f 17398/21062/17957 26210/21064/17959 26211/21067/17962 17403/21065/17960
+f 17403/21065/17960 26211/21067/17962 31000/21068/17963 26230/21066/17961
+f 17404/21069/17964 17408/21070/17965 17409/21071/17966 17405/21072/17967
+f 17405/21072/17967 17409/21071/17966 24990/20693/17592 24989/20688/17587
+f 17408/21070/17965 26213/21073/17968 26214/21074/17969 17409/21071/17966
+f 17409/21071/17966 26214/21074/17969 30977/20694/17593 24990/20693/17592
+f 17404/21069/17964 17405/21072/17967 17410/21075/17970 17406/21076/17971
+f 17406/21076/17971 17410/21075/17970 26232/21058/17953 26231/21057/17952
+f 17405/21072/17967 24989/20688/17587 24988/20687/17586 17410/21075/17970
+f 17410/21075/17970 24988/20687/17586 30976/20678/17577 26232/21058/17953
+f 17404/21069/17964 17406/21076/17971 17411/21077/17972 17407/21078/17973
+f 17407/21078/17973 17411/21077/17972 26215/21079/17974 26216/21080/17975
+f 17406/21076/17971 26231/21057/17952 26230/21066/17961 17411/21077/17972
+f 17411/21077/17972 26230/21066/17961 31000/21068/17963 26215/21079/17974
+f 17404/21069/17964 17407/21078/17973 17412/21081/17976 17408/21070/17965
+f 17408/21070/17965 17412/21081/17976 26212/21082/17977 26213/21073/17968
+f 17407/21078/17973 26216/21080/17975 26217/21083/17978 17412/21081/17976
+f 17412/21081/17976 26217/21083/17978 31001/21084/17979 26212/21082/17977
+f 17413/21085/17980 17417/21086/17981 17418/21087/17982 17414/21088/17983
+f 17414/21088/17983 17418/21087/17982 24993/20709/17608 24992/20704/17603
+f 17417/21086/17981 26297/21089/17984 26298/21090/17985 17418/21087/17982
+f 17418/21087/17982 26298/21090/17985 30978/20710/17609 24993/20709/17608
+f 17413/21085/17980 17414/21088/17983 17419/21091/17986 17415/21092/17987
+f 17415/21092/17987 17419/21091/17986 26214/21074/17969 26213/21073/17968
+f 17414/21088/17983 24992/20704/17603 24991/20703/17602 17419/21091/17986
+f 17419/21091/17986 24991/20703/17602 30977/20694/17593 26214/21074/17969
+f 17413/21085/17980 17415/21092/17987 17420/21093/17988 17416/21094/17989
+f 17416/21094/17989 17420/21093/17988 26218/21095/17990 26219/21096/17991
+f 17415/21092/17987 26213/21073/17968 26212/21082/17977 17420/21093/17988
+f 17420/21093/17988 26212/21082/17977 31001/21084/17979 26218/21095/17990
+f 17413/21085/17980 17416/21094/17989 17421/21097/17992 17417/21086/17981
+f 17417/21086/17981 17421/21097/17992 26296/21098/17993 26297/21089/17984
+f 17416/21094/17989 26219/21096/17991 26220/21099/17994 17421/21097/17992
+f 17421/21097/17992 26220/21099/17994 31002/21100/17995 26296/21098/17993
+f 17422/21101/17996 17426/21102/17997 17427/21103/17998 17423/21104/17999
+f 17423/21104/17999 17427/21103/17998 24996/20725/17624 24995/20720/17619
+f 17426/21102/17997 26294/21105/18000 26295/21106/18001 17427/21103/17998
+f 17427/21103/17998 26295/21106/18001 30979/20726/17625 24996/20725/17624
+f 17422/21101/17996 17423/21104/17999 17428/21107/18002 17424/21108/18003
+f 17424/21108/18003 17428/21107/18002 26298/21090/17985 26297/21089/17984
+f 17423/21104/17999 24995/20720/17619 24994/20719/17618 17428/21107/18002
+f 17428/21107/18002 24994/20719/17618 30978/20710/17609 26298/21090/17985
+f 17422/21101/17996 17424/21108/18003 17429/21109/18004 17425/21110/18005
+f 17425/21110/18005 17429/21109/18004 26221/21111/18006 26222/21112/18007
+f 17424/21108/18003 26297/21089/17984 26296/21098/17993 17429/21109/18004
+f 17429/21109/18004 26296/21098/17993 31002/21100/17995 26221/21111/18006
+f 17422/21101/17996 17425/21110/18005 17430/21113/18008 17426/21102/17997
+f 17426/21102/17997 17430/21113/18008 26293/21114/18009 26294/21105/18000
+f 17425/21110/18005 26222/21112/18007 26223/21115/18010 17430/21113/18008
+f 17430/21113/18008 26223/21115/18010 31003/21116/18011 26293/21114/18009
+f 17431/21117/18012 17435/21118/18013 17436/21119/18014 17432/21120/18015
+f 17432/21120/18015 17436/21119/18014 24999/20741/17640 24998/20736/17635
+f 17435/21118/18013 26291/21121/18016 26292/21122/18017 17436/21119/18014
+f 17436/21119/18014 26292/21122/18017 30980/20742/17641 24999/20741/17640
+f 17431/21117/18012 17432/21120/18015 17437/21123/18018 17433/21124/18019
+f 17433/21124/18019 17437/21123/18018 26295/21106/18001 26294/21105/18000
+f 17432/21120/18015 24998/20736/17635 24997/20735/17634 17437/21123/18018
+f 17437/21123/18018 24997/20735/17634 30979/20726/17625 26295/21106/18001
+f 17431/21117/18012 17433/21124/18019 17438/21125/18020 17434/21126/18021
+f 17434/21126/18021 17438/21125/18020 26224/21127/18022 26225/21128/18023
+f 17433/21124/18019 26294/21105/18000 26293/21114/18009 17438/21125/18020
+f 17438/21125/18020 26293/21114/18009 31003/21116/18011 26224/21127/18022
+f 17431/21117/18012 17434/21126/18021 17439/21129/18024 17435/21118/18013
+f 17435/21118/18013 17439/21129/18024 26290/21130/18025 26291/21121/18016
+f 17434/21126/18021 26225/21128/18023 26226/21131/18026 17439/21129/18024
+f 17439/21129/18024 26226/21131/18026 31004/21132/18027 26290/21130/18025
+f 17440/21133/18028 17444/21134/18029 17445/21135/18030 17441/21136/18031
+f 17441/21136/18031 17445/21135/18030 25002/20755/17654 25001/20752/17651
+f 17444/21134/18029 26288/20766/17665 26287/20765/17664 17445/21135/18030
+f 17445/21135/18030 26287/20765/17664 30957/20380/17283 25002/20755/17654
+f 17440/21133/18028 17441/21136/18031 17446/21137/18032 17442/21138/18033
+f 17442/21138/18033 17446/21137/18032 26292/21122/18017 26291/21121/18016
+f 17441/21136/18031 25001/20752/17651 25000/20751/17650 17446/21137/18032
+f 17446/21137/18032 25000/20751/17650 30980/20742/17641 26292/21122/18017
+f 17440/21133/18028 17442/21138/18033 17447/21139/18034 17443/21140/18035
+f 17443/21140/18035 17447/21139/18034 26227/21141/18036 26228/21142/18037
+f 17442/21138/18033 26291/21121/18016 26290/21130/18025 17447/21139/18034
+f 17447/21139/18034 26290/21130/18025 31004/21132/18027 26227/21141/18036
+f 17440/21133/18028 17443/21140/18035 17448/21143/18038 17444/21134/18029
+f 17444/21134/18029 17448/21143/18038 26289/20771/17670 26288/20766/17665
+f 17443/21140/18035 26228/21142/18037 26229/21144/18039 17448/21143/18038
+f 17448/21143/18038 26229/21144/18039 30981/20772/17671 26289/20771/17670
+f 17449/21145/18040 17453/21146/18041 17454/21147/18042 17450/21148/18043
+f 17450/21148/18043 17454/21147/18042 30524/21149/18044 30525/21150/18045
+f 17453/21146/18041 30522/21151/18046 30523/21152/18047 17454/21147/18042
+f 17454/21147/18042 30523/21152/18047 31699/21153/18048 30524/21149/18044
+f 17449/21145/18040 17450/21148/18043 17455/21154/18049 17451/21155/18050
+f 17451/21155/18050 17455/21154/18049 30544/21156/18051 30545/21157/18052
+f 17450/21148/18043 30525/21150/18045 30526/21158/18053 17455/21154/18049
+f 17455/21154/18049 30526/21158/18053 31700/21159/18054 30544/21156/18051
+f 17449/21145/18040 17451/21155/18050 17456/21160/18055 17452/21161/18056
+f 17451/21155/18050 30545/21157/18052 30546/21162/18057 17456/21160/18055
+f 17449/21145/18040 17452/21161/18056 17457/21163/18058 17453/21146/18041
+f 17453/21146/18041 17457/21163/18058 30521/21164/18059 30522/21151/18046
+f 17457/21163/18058 30543/21165/18060 31698/21166/18061 30521/21164/18059
+f 17458/21167/18062 17462/21168/18063 17463/21169/18064 17459/21170/18065
+f 17459/21170/18065 17463/21169/18064 26563/21171/18066 26564/21172/18067
+f 17462/21168/18063 26300/19879/16787 26299/19878/16786 17463/21169/18064
+f 17463/21169/18064 26299/19878/16786 31006/19869/16777 26563/21171/18066
+f 17458/21167/18062 17459/21170/18065 17464/21173/18068 17460/21174/18069
+f 17460/21174/18069 17464/21173/18068 26514/20359/17262 26513/20358/17261
+f 17459/21170/18065 26564/21172/18067 26565/21175/18070 17464/21173/18068
+f 17464/21173/18068 26565/21175/18070 31051/20353/17256 26514/20359/17262
+f 17458/21167/18062 17460/21174/18069 17465/21176/18071 17461/21177/18072
+f 17461/21177/18072 17465/21176/18071 26560/21178/18073 26561/21179/18074
+f 17460/21174/18069 26513/20358/17261 26512/20368/17271 17465/21176/18071
+f 17465/21176/18071 26512/20368/17271 31052/19892/16800 26560/21178/18073
+f 17458/21167/18062 17461/21177/18072 17466/21180/18075 17462/21168/18063
+f 17462/21168/18063 17466/21180/18075 26301/19882/16790 26300/19879/16787
+f 17461/21177/18072 26561/21179/18074 26562/21181/18076 17466/21180/18075
+f 17466/21180/18075 26562/21181/18076 31005/19507/16419 26301/19882/16790
+f 17467/21182/18077 17471/21183/18078 17472/21184/18079 17468/21185/18080
+f 17468/21185/18080 17472/21184/18079 26566/21186/18081 26567/21187/18082
+f 17471/21183/18078 26303/19863/16771 26302/19862/16770 17472/21184/18079
+f 17472/21184/18079 26302/19862/16770 31007/19853/16761 26566/21186/18081
+f 17467/21182/18077 17468/21185/18080 17473/21188/18083 17469/21189/18084
+f 17469/21189/18084 17473/21188/18083 26508/20339/17242 26507/20338/17241
+f 17468/21185/18080 26567/21187/18082 26568/21190/18085 17473/21188/18083
+f 17473/21188/18083 26568/21190/18085 31050/20333/17236 26508/20339/17242
+f 17467/21182/18077 17469/21189/18084 17474/21191/18086 17470/21192/18087
+f 17470/21192/18087 17474/21191/18086 26565/21175/18070 26564/21172/18067
+f 17469/21189/18084 26507/20338/17241 26506/20351/17254 17474/21191/18086
+f 17474/21191/18086 26506/20351/17254 31051/20353/17256 26565/21175/18070
+f 17467/21182/18077 17470/21192/18087 17475/21193/18088 17471/21183/18078
+f 17471/21183/18078 17475/21193/18088 26304/19868/16776 26303/19863/16771
+f 17470/21192/18087 26564/21172/18067 26563/21171/18066 17475/21193/18088
+f 17475/21193/18088 26563/21171/18066 31006/19869/16777 26304/19868/16776
+f 17476/21194/18089 17480/21195/18090 17481/21196/18091 17477/21197/18092
+f 17477/21197/18092 17481/21196/18091 26569/21198/18093 26570/21199/18094
+f 17480/21195/18090 26306/19847/16755 26305/19846/16754 17481/21196/18091
+f 17481/21196/18091 26305/19846/16754 31008/19837/16745 26569/21198/18093
+f 17476/21194/18089 17477/21197/18092 17482/21200/18095 17478/21201/18096
+f 17478/21201/18096 17482/21200/18095 26502/20319/17222 26501/20318/17221
+f 17477/21197/18092 26570/21199/18094 26571/21202/18097 17482/21200/18095
+f 17482/21200/18095 26571/21202/18097 31049/20313/17216 26502/20319/17222
+f 17476/21194/18089 17478/21201/18096 17483/21203/18098 17479/21204/18099
+f 17479/21204/18099 17483/21203/18098 26568/21190/18085 26567/21187/18082
+f 17478/21201/18096 26501/20318/17221 26500/20331/17234 17483/21203/18098
+f 17483/21203/18098 26500/20331/17234 31050/20333/17236 26568/21190/18085
+f 17476/21194/18089 17479/21204/18099 17484/21205/18100 17480/21195/18090
+f 17480/21195/18090 17484/21205/18100 26307/19852/16760 26306/19847/16755
+f 17479/21204/18099 26567/21187/18082 26566/21186/18081 17484/21205/18100
+f 17484/21205/18100 26566/21186/18081 31007/19853/16761 26307/19852/16760
+f 17485/21206/18101 17489/21207/18102 17490/21208/18103 17486/21209/18104
+f 17486/21209/18104 17490/21208/18103 26572/21210/18105 26573/21211/18106
+f 17489/21207/18102 26309/19831/16739 26308/19830/16738 17490/21208/18103
+f 17490/21208/18103 26308/19830/16738 31009/19821/16729 26572/21210/18105
+f 17485/21206/18101 17486/21209/18104 17491/21212/18107 17487/21213/18108
+f 17487/21213/18108 17491/21212/18107 26496/20299/17202 26495/20298/17201
+f 17486/21209/18104 26573/21211/18106 26574/21214/18109 17491/21212/18107
+f 17491/21212/18107 26574/21214/18109 31048/20293/17196 26496/20299/17202
+f 17485/21206/18101 17487/21213/18108 17492/21215/18110 17488/21216/18111
+f 17488/21216/18111 17492/21215/18110 26571/21202/18097 26570/21199/18094
+f 17487/21213/18108 26495/20298/17201 26494/20311/17214 17492/21215/18110
+f 17492/21215/18110 26494/20311/17214 31049/20313/17216 26571/21202/18097
+f 17485/21206/18101 17488/21216/18111 17493/21217/18112 17489/21207/18102
+f 17489/21207/18102 17493/21217/18112 26310/19836/16744 26309/19831/16739
+f 17488/21216/18111 26570/21199/18094 26569/21198/18093 17493/21217/18112
+f 17493/21217/18112 26569/21198/18093 31008/19837/16745 26310/19836/16744
+f 17494/21218/18113 17498/21219/18114 17499/21220/18115 17495/21221/18116
+f 17495/21221/18116 17499/21220/18115 26575/21222/18117 26576/21223/18118
+f 17498/21219/18114 26312/19815/16723 26311/19814/16722 17499/21220/18115
+f 17499/21220/18115 26311/19814/16722 31010/19805/16713 26575/21222/18117
+f 17494/21218/18113 17495/21221/18116 17500/21224/18119 17496/21225/18120
+f 17496/21225/18120 17500/21224/18119 26490/20279/17182 26489/20278/17181
+f 17495/21221/18116 26576/21223/18118 26577/21226/18121 17500/21224/18119
+f 17500/21224/18119 26577/21226/18121 31047/20273/17176 26490/20279/17182
+f 17494/21218/18113 17496/21225/18120 17501/21227/18122 17497/21228/18123
+f 17497/21228/18123 17501/21227/18122 26574/21214/18109 26573/21211/18106
+f 17496/21225/18120 26489/20278/17181 26488/20291/17194 17501/21227/18122
+f 17501/21227/18122 26488/20291/17194 31048/20293/17196 26574/21214/18109
+f 17494/21218/18113 17497/21228/18123 17502/21229/18124 17498/21219/18114
+f 17498/21219/18114 17502/21229/18124 26313/19820/16728 26312/19815/16723
+f 17497/21228/18123 26573/21211/18106 26572/21210/18105 17502/21229/18124
+f 17502/21229/18124 26572/21210/18105 31009/19821/16729 26313/19820/16728
+f 17503/21230/18125 17507/21231/18126 17508/21232/18127 17504/21233/18128
+f 17504/21233/18128 17508/21232/18127 26578/21234/18129 26579/21235/18130
+f 17507/21231/18126 26315/19799/16707 26314/19798/16706 17508/21232/18127
+f 17508/21232/18127 26314/19798/16706 31011/19789/16697 26578/21234/18129
+f 17503/21230/18125 17504/21233/18128 17509/21236/18131 17505/21237/18132
+f 17505/21237/18132 17509/21236/18131 26484/20259/17162 26483/20258/17161
+f 17504/21233/18128 26579/21235/18130 26580/21238/18133 17509/21236/18131
+f 17509/21236/18131 26580/21238/18133 31046/20253/17156 26484/20259/17162
+f 17503/21230/18125 17505/21237/18132 17510/21239/18134 17506/21240/18135
+f 17506/21240/18135 17510/21239/18134 26577/21226/18121 26576/21223/18118
+f 17505/21237/18132 26483/20258/17161 26482/20271/17174 17510/21239/18134
+f 17510/21239/18134 26482/20271/17174 31047/20273/17176 26577/21226/18121
+f 17503/21230/18125 17506/21240/18135 17511/21241/18136 17507/21231/18126
+f 17507/21231/18126 17511/21241/18136 26316/19804/16712 26315/19799/16707
+f 17506/21240/18135 26576/21223/18118 26575/21222/18117 17511/21241/18136
+f 17511/21241/18136 26575/21222/18117 31010/19805/16713 26316/19804/16712
+f 17512/21242/18137 17516/21243/18138 17517/21244/18139 17513/21245/18140
+f 17513/21245/18140 17517/21244/18139 26581/21246/18141 26582/21247/18142
+f 17516/21243/18138 26318/19781/16691 26317/19780/16690 17517/21244/18139
+f 17517/21244/18139 26317/19780/16690 31012/19783/16681 26581/21246/18141
+f 17512/21242/18137 17513/21245/18140 17518/21248/18143 17514/21249/18144
+f 17514/21249/18144 17518/21248/18143 26478/20236/17142 26477/20235/17141
+f 17513/21245/18140 26582/21247/18142 26583/21250/18145 17518/21248/18143
+f 17518/21248/18143 26583/21250/18145 31045/20237/17136 26478/20236/17142
+f 17512/21242/18137 17514/21249/18144 17519/21251/18146 17515/21252/18147
+f 17515/21252/18147 17519/21251/18146 26580/21238/18133 26579/21235/18130
+f 17514/21249/18144 26477/20235/17141 26476/20251/17154 17519/21251/18146
+f 17519/21251/18146 26476/20251/17154 31046/20253/17156 26580/21238/18133
+f 17512/21242/18137 17515/21252/18147 17520/21253/18148 17516/21243/18138
+f 17516/21243/18138 17520/21253/18148 26319/19788/16696 26318/19781/16691
+f 17515/21252/18147 26579/21235/18130 26578/21234/18129 17520/21253/18148
+f 17520/21253/18148 26578/21234/18129 31011/19789/16697 26319/19788/16696
+f 17521/21254/18149 17525/21255/18150 17526/21256/18151 17522/21257/18152
+f 17522/21257/18152 17526/21256/18151 26584/21258/18153 26585/21259/18154
+f 17525/21255/18150 26321/19763/16675 26320/19762/16674 17526/21256/18151
+f 17526/21256/18151 26320/19762/16674 31013/19753/16665 26584/21258/18153
+f 17521/21254/18149 17522/21257/18152 17527/21260/18155 17523/21261/18156
+f 17523/21261/18156 17527/21260/18155 26472/20214/17122 26471/20213/17121
+f 17522/21257/18152 26585/21259/18154 26586/21262/18157 17527/21260/18155
+f 17527/21260/18155 26586/21262/18157 31044/20208/17116 26472/20214/17122
+f 17521/21254/18149 17523/21261/18156 17528/21263/18158 17524/21264/18159
+f 17524/21264/18159 17528/21263/18158 26583/21265/18145 26582/21266/18142
+f 17523/21261/18156 26471/20213/17121 26470/20226/17134 17528/21263/18158
+f 17528/21263/18158 26470/20226/17134 31045/20228/17136 26583/21265/18145
+f 17521/21254/18149 17524/21264/18159 17529/21267/18160 17525/21255/18150
+f 17525/21255/18150 17529/21267/18160 26322/19768/16680 26321/19763/16675
+f 17524/21264/18159 26582/21266/18142 26581/21268/18141 17529/21267/18160
+f 17529/21267/18160 26581/21268/18141 31012/19769/16681 26322/19768/16680
+f 17530/21269/18161 17534/21270/18162 17535/21271/18163 17531/21272/18164
+f 17531/21272/18164 17535/21271/18163 26466/20194/17102 26465/20193/17101
+f 17534/21270/18162 26324/21273/18165 26325/21274/18166 17535/21271/18163
+f 17535/21271/18163 26325/21274/18166 31043/20188/17096 26466/20194/17102
+f 17530/21269/18161 17531/21272/18164 17536/21275/18167 17532/21276/18168
+f 17532/21276/18168 17536/21275/18167 26586/21262/18157 26585/21259/18154
+f 17531/21272/18164 26465/20193/17101 26464/20206/17114 17536/21275/18167
+f 17536/21275/18167 26464/20206/17114 31044/20208/17116 26586/21262/18157
+f 17530/21269/18161 17532/21276/18168 17537/21277/18169 17533/21278/18170
+f 17533/21278/18170 17537/21277/18169 26328/19752/16664 26327/19747/16659
+f 17532/21276/18168 26585/21259/18154 26584/21258/18153 17537/21277/18169
+f 17537/21277/18169 26584/21258/18153 31013/19753/16665 26328/19752/16664
+f 17530/21269/18161 17533/21278/18170 17538/21279/18171 17534/21270/18162
+f 17534/21270/18162 17538/21279/18171 26323/21280/18172 26324/21273/18165
+f 17533/21278/18170 26327/19747/16659 26326/19746/16658 17538/21279/18171
+f 17538/21279/18171 26326/19746/16658 31014/19737/16649 26323/21280/18172
+f 17539/21281/18173 17543/21282/18174 17544/21283/18175 17540/21284/18176
+f 17540/21284/18176 17544/21283/18175 26518/21285/18177 26519/21286/18178
+f 17543/21282/18174 26330/19731/16643 26329/19730/16642 17544/21283/18175
+f 17544/21283/18175 26329/19730/16642 31015/19721/16633 26518/21285/18177
+f 17539/21281/18173 17540/21284/18176 17545/21287/18179 17541/21288/18180
+f 17541/21288/18180 17545/21287/18179 26460/20174/17082 26459/20173/17081
+f 17540/21284/18176 26519/21286/18178 26520/21289/18181 17545/21287/18179
+f 17545/21287/18179 26520/21289/18181 31042/20168/17076 26460/20174/17082
+f 17539/21281/18173 17541/21288/18180 17546/21290/18182 17542/21291/18183
+f 17542/21291/18183 17546/21290/18182 26325/21274/18166 26324/21273/18165
+f 17541/21288/18180 26459/20173/17081 26458/20186/17094 17546/21290/18182
+f 17546/21290/18182 26458/20186/17094 31043/20188/17096 26325/21274/18166
+f 17539/21281/18173 17542/21291/18183 17547/21292/18184 17543/21282/18174
+f 17543/21282/18174 17547/21292/18184 26331/19736/16648 26330/19731/16643
+f 17542/21291/18183 26324/21273/18165 26323/21280/18172 17547/21292/18184
+f 17547/21292/18184 26323/21280/18172 31014/19737/16649 26331/19736/16648
+f 17548/21293/18185 17552/21294/18186 17553/21295/18187 17549/21296/18188
+f 17549/21296/18188 17553/21295/18187 26521/21297/18189 26522/21298/18190
+f 17552/21294/18186 26333/19715/16627 26332/19714/16626 17553/21295/18187
+f 17553/21295/18187 26332/19714/16626 31016/19705/16617 26521/21297/18189
+f 17548/21293/18185 17549/21296/18188 17554/21299/18191 17550/21300/18192
+f 17550/21300/18192 17554/21299/18191 26454/20154/17062 26453/20153/17061
+f 17549/21296/18188 26522/21298/18190 26523/21301/18193 17554/21299/18191
+f 17554/21299/18191 26523/21301/18193 31041/20148/17056 26454/20154/17062
+f 17548/21293/18185 17550/21300/18192 17555/21302/18194 17551/21303/18195
+f 17551/21303/18195 17555/21302/18194 26520/21289/18181 26519/21286/18178
+f 17550/21300/18192 26453/20153/17061 26452/20166/17074 17555/21302/18194
+f 17555/21302/18194 26452/20166/17074 31042/20168/17076 26520/21289/18181
+f 17548/21293/18185 17551/21303/18195 17556/21304/18196 17552/21294/18186
+f 17552/21294/18186 17556/21304/18196 26334/19720/16632 26333/19715/16627
+f 17551/21303/18195 26519/21286/18178 26518/21285/18177 17556/21304/18196
+f 17556/21304/18196 26518/21285/18177 31015/19721/16633 26334/19720/16632
+f 17557/21305/18197 17561/21306/18198 17562/21307/18199 17558/21308/18200
+f 17558/21308/18200 17562/21307/18199 26524/21309/18201 26525/21310/18202
+f 17561/21306/18198 26336/19699/16611 26335/19698/16610 17562/21307/18199
+f 17562/21307/18199 26335/19698/16610 31017/19689/16601 26524/21309/18201
+f 17557/21305/18197 17558/21308/18200 17563/21311/18203 17559/21312/18204
+f 17559/21312/18204 17563/21311/18203 26448/20134/17042 26447/20133/17041
+f 17558/21308/18200 26525/21310/18202 26526/21313/18205 17563/21311/18203
+f 17563/21311/18203 26526/21313/18205 31040/20128/17036 26448/20134/17042
+f 17557/21305/18197 17559/21312/18204 17564/21314/18206 17560/21315/18207
+f 17560/21315/18207 17564/21314/18206 26523/21301/18193 26522/21298/18190
+f 17559/21312/18204 26447/20133/17041 26446/20146/17054 17564/21314/18206
+f 17564/21314/18206 26446/20146/17054 31041/20148/17056 26523/21301/18193
+f 17557/21305/18197 17560/21315/18207 17565/21316/18208 17561/21306/18198
+f 17561/21306/18198 17565/21316/18208 26337/19704/16616 26336/19699/16611
+f 17560/21315/18207 26522/21298/18190 26521/21297/18189 17565/21316/18208
+f 17565/21316/18208 26521/21297/18189 31016/19705/16617 26337/19704/16616
+f 17566/21317/18209 17570/21318/18210 17571/21319/18211 17567/21320/18212
+f 17567/21320/18212 17571/21319/18211 26527/21321/18213 26528/21322/18214
+f 17570/21318/18210 26339/19683/16595 26338/19682/16594 17571/21319/18211
+f 17571/21319/18211 26338/19682/16594 31018/19673/16585 26527/21321/18213
+f 17566/21317/18209 17567/21320/18212 17572/21323/18215 17568/21324/18216
+f 17568/21324/18216 17572/21323/18215 26442/20114/17022 26441/20113/17021
+f 17567/21320/18212 26528/21322/18214 26529/21325/18217 17572/21323/18215
+f 17572/21323/18215 26529/21325/18217 31039/20108/17016 26442/20114/17022
+f 17566/21317/18209 17568/21324/18216 17573/21326/18218 17569/21327/18219
+f 17569/21327/18219 17573/21326/18218 26526/21313/18205 26525/21310/18202
+f 17568/21324/18216 26441/20113/17021 26440/20126/17034 17573/21326/18218
+f 17573/21326/18218 26440/20126/17034 31040/20128/17036 26526/21313/18205
+f 17566/21317/18209 17569/21327/18219 17574/21328/18220 17570/21318/18210
+f 17570/21318/18210 17574/21328/18220 26340/19688/16600 26339/19683/16595
+f 17569/21327/18219 26525/21310/18202 26524/21309/18201 17574/21328/18220
+f 17574/21328/18220 26524/21309/18201 31017/19689/16601 26340/19688/16600
+f 17575/21329/18221 17579/21330/18222 17580/21331/18223 17576/21332/18224
+f 17576/21332/18224 17580/21331/18223 26530/21333/18225 26531/21334/18226
+f 17579/21330/18222 26342/19667/16579 26341/19666/16578 17580/21331/18223
+f 17580/21331/18223 26341/19666/16578 31019/19657/16569 26530/21333/18225
+f 17575/21329/18221 17576/21332/18224 17581/21335/18227 17577/21336/18228
+f 17577/21336/18228 17581/21335/18227 26436/20094/17002 26435/20093/17001
+f 17576/21332/18224 26531/21334/18226 26532/21337/18229 17581/21335/18227
+f 17581/21335/18227 26532/21337/18229 31038/20088/16996 26436/20094/17002
+f 17575/21329/18221 17577/21336/18228 17582/21338/18230 17578/21339/18231
+f 17578/21339/18231 17582/21338/18230 26529/21325/18217 26528/21322/18214
+f 17577/21336/18228 26435/20093/17001 26434/20106/17014 17582/21338/18230
+f 17582/21338/18230 26434/20106/17014 31039/20108/17016 26529/21325/18217
+f 17575/21329/18221 17578/21339/18231 17583/21340/18232 17579/21330/18222
+f 17579/21330/18222 17583/21340/18232 26343/19672/16584 26342/19667/16579
+f 17578/21339/18231 26528/21322/18214 26527/21321/18213 17583/21340/18232
+f 17583/21340/18232 26527/21321/18213 31018/19673/16585 26343/19672/16584
+f 17584/21341/18233 17588/21342/18234 17589/21343/18235 17585/21344/18236
+f 17585/21344/18236 17589/21343/18235 26533/21345/18237 26534/21346/18238
+f 17588/21342/18234 26345/19651/16563 26344/19650/16562 17589/21343/18235
+f 17589/21343/18235 26344/19650/16562 31020/19641/16553 26533/21345/18237
+f 17584/21341/18233 17585/21344/18236 17590/21347/18239 17586/21348/18240
+f 17586/21348/18240 17590/21347/18239 26430/20074/16982 26429/20073/16981
+f 17585/21344/18236 26534/21346/18238 26535/21349/18241 17590/21347/18239
+f 17590/21347/18239 26535/21349/18241 31037/20068/16976 26430/20074/16982
+f 17584/21341/18233 17586/21348/18240 17591/21350/18242 17587/21351/18243
+f 17587/21351/18243 17591/21350/18242 26532/21337/18229 26531/21334/18226
+f 17586/21348/18240 26429/20073/16981 26428/20086/16994 17591/21350/18242
+f 17591/21350/18242 26428/20086/16994 31038/20088/16996 26532/21337/18229
+f 17584/21341/18233 17587/21351/18243 17592/21352/18244 17588/21342/18234
+f 17588/21342/18234 17592/21352/18244 26346/19656/16568 26345/19651/16563
+f 17587/21351/18243 26531/21334/18226 26530/21333/18225 17592/21352/18244
+f 17592/21352/18244 26530/21333/18225 31019/19657/16569 26346/19656/16568
+f 17593/21353/18245 17597/21354/18246 17598/21355/18247 17594/21356/18248
+f 17594/21356/18248 17598/21355/18247 26536/21357/18249 26537/21358/18250
+f 17597/21354/18246 26348/19635/16547 26347/19634/16546 17598/21355/18247
+f 17598/21355/18247 26347/19634/16546 31021/19625/16537 26536/21357/18249
+f 17593/21353/18245 17594/21356/18248 17599/21359/18251 17595/21360/18252
+f 17595/21360/18252 17599/21359/18251 26424/20054/16962 26423/20053/16961
+f 17594/21356/18248 26537/21358/18250 26538/21361/18253 17599/21359/18251
+f 17599/21359/18251 26538/21361/18253 31036/20048/16956 26424/20054/16962
+f 17593/21353/18245 17595/21360/18252 17600/21362/18254 17596/21363/18255
+f 17596/21363/18255 17600/21362/18254 26535/21349/18241 26534/21346/18238
+f 17595/21360/18252 26423/20053/16961 26422/20066/16974 17600/21362/18254
+f 17600/21362/18254 26422/20066/16974 31037/20068/16976 26535/21349/18241
+f 17593/21353/18245 17596/21363/18255 17601/21364/18256 17597/21354/18246
+f 17597/21354/18246 17601/21364/18256 26349/19640/16552 26348/19635/16547
+f 17596/21363/18255 26534/21346/18238 26533/21345/18237 17601/21364/18256
+f 17601/21364/18256 26533/21345/18237 31020/19641/16553 26349/19640/16552
+f 17602/21365/18257 17606/21366/18258 17607/21367/18259 17603/21368/18260
+f 17603/21368/18260 17607/21367/18259 26539/21369/18261 26540/21370/18262
+f 17606/21366/18258 26351/19619/16531 26350/19618/16530 17607/21367/18259
+f 17607/21367/18259 26350/19618/16530 31022/19609/16521 26539/21369/18261
+f 17602/21365/18257 17603/21368/18260 17608/21371/18263 17604/21372/18264
+f 17604/21372/18264 17608/21371/18263 26418/20034/16942 26417/20033/16941
+f 17603/21368/18260 26540/21370/18262 26541/21373/18265 17608/21371/18263
+f 17608/21371/18263 26541/21373/18265 31035/20028/16936 26418/20034/16942
+f 17602/21365/18257 17604/21372/18264 17609/21374/18266 17605/21375/18267
+f 17605/21375/18267 17609/21374/18266 26538/21361/18253 26537/21358/18250
+f 17604/21372/18264 26417/20033/16941 26416/20046/16954 17609/21374/18266
+f 17609/21374/18266 26416/20046/16954 31036/20048/16956 26538/21361/18253
+f 17602/21365/18257 17605/21375/18267 17610/21376/18268 17606/21366/18258
+f 17606/21366/18258 17610/21376/18268 26352/19624/16536 26351/19619/16531
+f 17605/21375/18267 26537/21358/18250 26536/21357/18249 17610/21376/18268
+f 17610/21376/18268 26536/21357/18249 31021/19625/16537 26352/19624/16536
+f 17611/21377/18269 17615/21378/18270 17616/21379/18271 17612/21380/18272
+f 17612/21380/18272 17616/21379/18271 26542/21381/18273 26543/21382/18274
+f 17615/21378/18270 26354/19603/16515 26353/19602/16514 17616/21379/18271
+f 17616/21379/18271 26353/19602/16514 31023/19593/16505 26542/21381/18273
+f 17611/21377/18269 17612/21380/18272 17617/21383/18275 17613/21384/18276
+f 17613/21384/18276 17617/21383/18275 26412/20014/16922 26411/20013/16921
+f 17612/21380/18272 26543/21382/18274 26544/21385/18277 17617/21383/18275
+f 17617/21383/18275 26544/21385/18277 31034/20008/16916 26412/20014/16922
+f 17611/21377/18269 17613/21384/18276 17618/21386/18278 17614/21387/18279
+f 17614/21387/18279 17618/21386/18278 26541/21373/18265 26540/21370/18262
+f 17613/21384/18276 26411/20013/16921 26410/20026/16934 17618/21386/18278
+f 17618/21386/18278 26410/20026/16934 31035/20028/16936 26541/21373/18265
+f 17611/21377/18269 17614/21387/18279 17619/21388/18280 17615/21378/18270
+f 17615/21378/18270 17619/21388/18280 26355/19608/16520 26354/19603/16515
+f 17614/21387/18279 26540/21370/18262 26539/21369/18261 17619/21388/18280
+f 17619/21388/18280 26539/21369/18261 31022/19609/16521 26355/19608/16520
+f 17620/21389/18281 17624/21390/18282 17625/21391/18283 17621/21392/18284
+f 17621/21392/18284 17625/21391/18283 26545/21393/18285 26546/21394/18286
+f 17624/21390/18282 26357/19587/16499 26356/19586/16498 17625/21391/18283
+f 17625/21391/18283 26356/19586/16498 31024/19577/16489 26545/21393/18285
+f 17620/21389/18281 17621/21392/18284 17626/21395/18287 17622/21396/18288
+f 17622/21396/18288 17626/21395/18287 26406/19994/16902 26405/19993/16901
+f 17621/21392/18284 26546/21394/18286 26547/21397/18289 17626/21395/18287
+f 17626/21395/18287 26547/21397/18289 31033/19988/16896 26406/19994/16902
+f 17620/21389/18281 17622/21396/18288 17627/21398/18290 17623/21399/18291
+f 17623/21399/18291 17627/21398/18290 26544/21385/18277 26543/21382/18274
+f 17622/21396/18288 26405/19993/16901 26404/20006/16914 17627/21398/18290
+f 17627/21398/18290 26404/20006/16914 31034/20008/16916 26544/21385/18277
+f 17620/21389/18281 17623/21399/18291 17628/21400/18292 17624/21390/18282
+f 17624/21390/18282 17628/21400/18292 26358/19592/16504 26357/19587/16499
+f 17623/21399/18291 26543/21382/18274 26542/21381/18273 17628/21400/18292
+f 17628/21400/18292 26542/21381/18273 31023/19593/16505 26358/19592/16504
+f 17629/21401/18293 17633/21402/18294 17634/21403/18295 17630/21404/18296
+f 17630/21404/18296 17634/21403/18295 26548/21405/18297 26549/21406/18298
+f 17633/21402/18294 26360/19571/16483 26359/19570/16482 17634/21403/18295
+f 17634/21403/18295 26359/19570/16482 31025/19561/16473 26548/21405/18297
+f 17629/21401/18293 17630/21404/18296 17635/21407/18299 17631/21408/18300
+f 17631/21408/18300 17635/21407/18299 26400/19974/16882 26399/19973/16881
+f 17630/21404/18296 26549/21406/18298 26550/21409/18301 17635/21407/18299
+f 17635/21407/18299 26550/21409/18301 31032/19968/16876 26400/19974/16882
+f 17629/21401/18293 17631/21408/18300 17636/21410/18302 17632/21411/18303
+f 17632/21411/18303 17636/21410/18302 26547/21397/18289 26546/21394/18286
+f 17631/21408/18300 26399/19973/16881 26398/19986/16894 17636/21410/18302
+f 17636/21410/18302 26398/19986/16894 31033/19988/16896 26547/21397/18289
+f 17629/21401/18293 17632/21411/18303 17637/21412/18304 17633/21402/18294
+f 17633/21402/18294 17637/21412/18304 26361/19576/16488 26360/19571/16483
+f 17632/21411/18303 26546/21394/18286 26545/21393/18285 17637/21412/18304
+f 17637/21412/18304 26545/21393/18285 31024/19577/16489 26361/19576/16488
+f 17638/21413/18305 17642/21414/18306 17643/21415/18307 17639/21416/18308
+f 17639/21416/18308 17643/21415/18307 26551/21417/18309 26552/21418/18310
+f 17642/21414/18306 26363/19555/16467 26362/19554/16466 17643/21415/18307
+f 17643/21415/18307 26362/19554/16466 31026/19545/16457 26551/21417/18309
+f 17638/21413/18305 17639/21416/18308 17644/21419/18311 17640/21420/18312
+f 17640/21420/18312 17644/21419/18311 26394/19954/16862 26393/19953/16861
+f 17639/21416/18308 26552/21418/18310 26553/21421/18313 17644/21419/18311
+f 17644/21419/18311 26553/21421/18313 31031/19948/16856 26394/19954/16862
+f 17638/21413/18305 17640/21420/18312 17645/21422/18314 17641/21423/18315
+f 17641/21423/18315 17645/21422/18314 26550/21409/18301 26549/21406/18298
+f 17640/21420/18312 26393/19953/16861 26392/19966/16874 17645/21422/18314
+f 17645/21422/18314 26392/19966/16874 31032/19968/16876 26550/21409/18301
+f 17638/21413/18305 17641/21423/18315 17646/21424/18316 17642/21414/18306
+f 17642/21414/18306 17646/21424/18316 26364/19560/16472 26363/19555/16467
+f 17641/21423/18315 26549/21406/18298 26548/21405/18297 17646/21424/18316
+f 17646/21424/18316 26548/21405/18297 31025/19561/16473 26364/19560/16472
+f 17647/21425/18317 17651/21426/18318 17652/21427/18319 17648/21428/18320
+f 17648/21428/18320 17652/21427/18319 26554/21429/18321 26555/21430/18322
+f 17651/21426/18318 26366/19539/16451 26365/19538/16450 17652/21427/18319
+f 17652/21427/18319 26365/19538/16450 31027/19529/16441 26554/21429/18321
+f 17647/21425/18317 17648/21428/18320 17653/21431/18323 17649/21432/18324
+f 17649/21432/18324 17653/21431/18323 26388/19934/16842 26387/19933/16841
+f 17648/21428/18320 26555/21430/18322 26556/21433/18325 17653/21431/18323
+f 17653/21431/18323 26556/21433/18325 31030/19928/16836 26388/19934/16842
+f 17647/21425/18317 17649/21432/18324 17654/21434/18326 17650/21435/18327
+f 17650/21435/18327 17654/21434/18326 26553/21421/18313 26552/21418/18310
+f 17649/21432/18324 26387/19933/16841 26386/19946/16854 17654/21434/18326
+f 17654/21434/18326 26386/19946/16854 31031/19948/16856 26553/21421/18313
+f 17647/21425/18317 17650/21435/18327 17655/21436/18328 17651/21426/18318
+f 17651/21426/18318 17655/21436/18328 26367/19544/16456 26366/19539/16451
+f 17650/21435/18327 26552/21418/18310 26551/21417/18309 17655/21436/18328
+f 17655/21436/18328 26551/21417/18309 31026/19545/16457 26367/19544/16456
+f 17656/21437/18329 17660/21438/18330 17661/21439/18331 17657/21440/18332
+f 17657/21440/18332 17661/21439/18331 26557/21441/18333 26558/21442/18334
+f 17660/21438/18330 26369/19523/16435 26368/19522/16434 17661/21439/18331
+f 17661/21439/18331 26368/19522/16434 31028/19513/16425 26557/21441/18333
+f 17656/21437/18329 17657/21440/18332 17662/21443/18335 17658/21444/18336
+f 17658/21444/18336 17662/21443/18335 26382/19914/16822 26381/19913/16821
+f 17657/21440/18332 26558/21442/18334 26559/21445/18337 17662/21443/18335
+f 17662/21443/18335 26559/21445/18337 31029/19908/16816 26382/19914/16822
+f 17656/21437/18329 17658/21444/18336 17663/21446/18338 17659/21447/18339
+f 17659/21447/18339 17663/21446/18338 26556/21433/18325 26555/21430/18322
+f 17658/21444/18336 26381/19913/16821 26380/19926/16834 17663/21446/18338
+f 17663/21446/18338 26380/19926/16834 31030/19928/16836 26556/21433/18325
+f 17656/21437/18329 17659/21447/18339 17664/21448/18340 17660/21438/18330
+f 17660/21438/18330 17664/21448/18340 26370/19528/16440 26369/19523/16435
+f 17659/21447/18339 26555/21430/18322 26554/21429/18321 17664/21448/18340
+f 17664/21448/18340 26554/21429/18321 31027/19529/16441 26370/19528/16440
+f 17665/21449/18341 17669/21450/18342 17670/21451/18343 17666/21452/18344
+f 17666/21452/18344 17670/21451/18343 26562/21181/18076 26561/21179/18074
+f 17669/21450/18342 26372/19505/16417 26371/19504/16416 17670/21451/18343
+f 17670/21451/18343 26371/19504/16416 31005/19507/16419 26562/21181/18076
+f 17665/21449/18341 17666/21452/18344 17671/21453/18345 17667/21454/18346
+f 17667/21454/18346 17671/21453/18345 26517/19891/16799 26516/19890/16798
+f 17666/21452/18344 26561/21179/18074 26560/21178/18073 17671/21453/18345
+f 17671/21453/18345 26560/21178/18073 31052/19892/16800 26517/19891/16799
+f 17665/21449/18341 17667/21454/18346 17672/21455/18347 17668/21456/18348
+f 17668/21456/18348 17672/21455/18347 26559/21445/18337 26558/21442/18334
+f 17667/21454/18346 26516/19890/16798 26515/19906/16814 17672/21455/18347
+f 17672/21455/18347 26515/19906/16814 31029/19908/16816 26559/21445/18337
+f 17665/21449/18341 17668/21456/18348 17673/21457/18349 17669/21450/18342
+f 17669/21450/18342 17673/21457/18349 26373/19512/16424 26372/19505/16417
+f 17668/21456/18348 26558/21442/18334 26557/21441/18333 17673/21457/18349
+f 17673/21457/18349 26557/21441/18333 31028/19513/16425 26373/19512/16424
+f 17674/21458/18350 17678/21459/18351 17679/21460/18352 17675/21461/18353
+f 17675/21461/18353 17679/21460/18352 26587/21462/18354 26588/21463/18355
+f 17678/21459/18351 27956/21464/18356 27957/21465/18357 17679/21460/18352
+f 17679/21460/18352 27957/21465/18357 31053/21466/18358 26587/21462/18354
+f 17674/21458/18350 17675/21461/18353 17680/21467/18359 17676/21468/18360
+f 17676/21468/18360 17680/21467/18359 27958/21469/18361 27959/21470/18362
+f 17675/21461/18353 26588/21463/18355 26589/21471/18363 17680/21467/18359
+f 17680/21467/18359 26589/21471/18363 31054/21472/18364 27958/21469/18361
+f 17674/21458/18350 17676/21468/18360 17681/21473/18365 17677/21474/18366
+f 17677/21474/18366 17681/21473/18365 26659/21475/18367 26660/21476/18368
+f 17676/21468/18360 27959/21470/18362 27960/21477/18369 17681/21473/18365
+f 17681/21473/18365 27960/21477/18369 31078/21478/18370 26659/21475/18367
+f 17674/21458/18350 17677/21474/18366 17682/21479/18371 17678/21459/18351
+f 17678/21459/18351 17682/21479/18371 27955/21480/18372 27956/21464/18356
+f 17677/21474/18366 26660/21476/18368 26661/21481/18373 17682/21479/18371
+f 17682/21479/18371 26661/21481/18373 31077/21482/18374 27955/21480/18372
+f 17683/21483/18375 17687/21484/18376 17688/21485/18377 17684/21486/18378
+f 17684/21486/18378 17688/21485/18377 26590/21487/18379 26591/21488/18380
+f 17687/21484/18376 27959/21470/18362 27958/21469/18361 17688/21485/18377
+f 17688/21485/18377 27958/21469/18361 31054/21472/18364 26590/21487/18379
+f 17683/21483/18375 17684/21486/18378 17689/21489/18381 17685/21490/18382
+f 17685/21490/18382 17689/21489/18381 27961/21491/18383 27962/21492/18384
+f 17684/21486/18378 26591/21488/18380 26592/21493/18385 17689/21489/18381
+f 17689/21489/18381 26592/21493/18385 31055/21494/18386 27961/21491/18383
+f 17683/21483/18375 17685/21490/18382 17690/21495/18387 17686/21496/18388
+f 17686/21496/18388 17690/21495/18387 26662/21497/18389 26663/21498/18390
+f 17685/21490/18382 27962/21492/18384 27963/21499/18391 17690/21495/18387
+f 17690/21495/18387 27963/21499/18391 31079/21500/18392 26662/21497/18389
+f 17683/21483/18375 17686/21496/18388 17691/21501/18393 17687/21484/18376
+f 17687/21484/18376 17691/21501/18393 27960/21477/18369 27959/21470/18362
+f 17686/21496/18388 26663/21498/18390 26664/21502/18394 17691/21501/18393
+f 17691/21501/18393 26664/21502/18394 31078/21478/18370 27960/21477/18369
+f 17692/21503/18395 17696/21504/18396 17697/21505/18397 17693/21506/18398
+f 17693/21506/18398 17697/21505/18397 26593/21507/18399 26594/21508/18400
+f 17696/21504/18396 27962/21492/18384 27961/21491/18383 17697/21505/18397
+f 17697/21505/18397 27961/21491/18383 31055/21494/18386 26593/21507/18399
+f 17692/21503/18395 17693/21506/18398 17698/21509/18401 17694/21510/18402
+f 17694/21510/18402 17698/21509/18401 27964/21511/18403 27965/21512/18404
+f 17693/21506/18398 26594/21508/18400 26595/21513/18405 17698/21509/18401
+f 17698/21509/18401 26595/21513/18405 31056/21514/18406 27964/21511/18403
+f 17692/21503/18395 17694/21510/18402 17699/21515/18407 17695/21516/18408
+f 17695/21516/18408 17699/21515/18407 26665/21517/18409 26666/21518/18410
+f 17694/21510/18402 27965/21512/18404 27966/21519/18411 17699/21515/18407
+f 17699/21515/18407 27966/21519/18411 31080/21520/18412 26665/21517/18409
+f 17692/21503/18395 17695/21516/18408 17700/21521/18413 17696/21504/18396
+f 17696/21504/18396 17700/21521/18413 27963/21499/18391 27962/21492/18384
+f 17695/21516/18408 26666/21518/18410 26667/21522/18414 17700/21521/18413
+f 17700/21521/18413 26667/21522/18414 31079/21500/18392 27963/21499/18391
+f 17701/21523/18415 17705/21524/18416 17706/21525/18417 17702/21526/18418
+f 17702/21526/18418 17706/21525/18417 26596/21527/18419 26597/21528/18420
+f 17705/21524/18416 27965/21512/18404 27964/21511/18403 17706/21525/18417
+f 17706/21525/18417 27964/21511/18403 31056/21514/18406 26596/21527/18419
+f 17701/21523/18415 17702/21526/18418 17707/21529/18421 17703/21530/18422
+f 17703/21530/18422 17707/21529/18421 27967/21531/18423 27968/21532/18424
+f 17702/21526/18418 26597/21528/18420 26598/21533/18425 17707/21529/18421
+f 17707/21529/18421 26598/21533/18425 31057/21534/18426 27967/21531/18423
+f 17701/21523/18415 17703/21530/18422 17708/21535/18427 17704/21536/18428
+f 17704/21536/18428 17708/21535/18427 26668/21537/18429 26669/21538/18430
+f 17703/21530/18422 27968/21532/18424 27969/21539/18431 17708/21535/18427
+f 17708/21535/18427 27969/21539/18431 31081/21540/18432 26668/21537/18429
+f 17701/21523/18415 17704/21536/18428 17709/21541/18433 17705/21524/18416
+f 17705/21524/18416 17709/21541/18433 27966/21519/18411 27965/21512/18404
+f 17704/21536/18428 26669/21538/18430 26670/21542/18434 17709/21541/18433
+f 17709/21541/18433 26670/21542/18434 31080/21520/18412 27966/21519/18411
+f 17710/21543/18435 17714/21544/18436 17715/21545/18437 17711/21546/18438
+f 17711/21546/18438 17715/21545/18437 26599/21547/18439 26600/21548/18440
+f 17714/21544/18436 27968/21532/18424 27967/21531/18423 17715/21545/18437
+f 17715/21545/18437 27967/21531/18423 31057/21534/18426 26599/21547/18439
+f 17710/21543/18435 17711/21546/18438 17716/21549/18441 17712/21550/18442
+f 17712/21550/18442 17716/21549/18441 27970/21551/18443 27971/21552/18444
+f 17711/21546/18438 26600/21548/18440 26601/21553/18445 17716/21549/18441
+f 17716/21549/18441 26601/21553/18445 31058/21554/18446 27970/21551/18443
+f 17710/21543/18435 17712/21550/18442 17717/21555/18447 17713/21556/18448
+f 17713/21556/18448 17717/21555/18447 26671/21557/18449 26672/21558/18450
+f 17712/21550/18442 27971/21552/18444 27972/21559/18451 17717/21555/18447
+f 17717/21555/18447 27972/21559/18451 31082/21560/18452 26671/21557/18449
+f 17710/21543/18435 17713/21556/18448 17718/21561/18453 17714/21544/18436
+f 17714/21544/18436 17718/21561/18453 27969/21539/18431 27968/21532/18424
+f 17713/21556/18448 26672/21558/18450 26673/21562/18454 17718/21561/18453
+f 17718/21561/18453 26673/21562/18454 31081/21540/18432 27969/21539/18431
+f 17719/21563/18455 17723/21564/18456 17724/21565/18457 17720/21566/18458
+f 17720/21566/18458 17724/21565/18457 26602/21567/18459 26603/21568/18460
+f 17723/21564/18456 27971/21552/18444 27970/21551/18443 17724/21565/18457
+f 17724/21565/18457 27970/21551/18443 31058/21554/18446 26602/21567/18459
+f 17719/21563/18455 17720/21566/18458 17725/21569/18461 17721/21570/18462
+f 17721/21570/18462 17725/21569/18461 27973/21571/18463 27974/21572/18464
+f 17720/21566/18458 26603/21568/18460 26604/21573/18465 17725/21569/18461
+f 17725/21569/18461 26604/21573/18465 31059/21574/18466 27973/21571/18463
+f 17719/21563/18455 17721/21570/18462 17726/21575/18467 17722/21576/18468
+f 17722/21576/18468 17726/21575/18467 26674/21577/18469 26675/21578/18470
+f 17721/21570/18462 27974/21572/18464 27975/21579/18471 17726/21575/18467
+f 17726/21575/18467 27975/21579/18471 31083/21580/18472 26674/21577/18469
+f 17719/21563/18455 17722/21576/18468 17727/21581/18473 17723/21564/18456
+f 17723/21564/18456 17727/21581/18473 27972/21559/18451 27971/21552/18444
+f 17722/21576/18468 26675/21578/18470 26676/21582/18474 17727/21581/18473
+f 17727/21581/18473 26676/21582/18474 31082/21560/18452 27972/21559/18451
+f 17728/21583/18475 17732/21584/18476 17733/21585/18477 17729/21586/18478
+f 17729/21586/18478 17733/21585/18477 26605/21587/18479 26606/21588/18480
+f 17732/21584/18476 27974/21572/18464 27973/21571/18463 17733/21585/18477
+f 17733/21585/18477 27973/21571/18463 31059/21574/18466 26605/21587/18479
+f 17728/21583/18475 17729/21586/18478 17734/21589/18481 17730/21590/18482
+f 17730/21590/18482 17734/21589/18481 27976/21591/18483 27977/21592/18484
+f 17729/21586/18478 26606/21588/18480 26607/21593/18485 17734/21589/18481
+f 17734/21589/18481 26607/21593/18485 31060/21594/18486 27976/21591/18483
+f 17728/21583/18475 17730/21590/18482 17735/21595/18487 17731/21596/18488
+f 17731/21596/18488 17735/21595/18487 26677/21597/18489 26678/21598/18490
+f 17730/21590/18482 27977/21592/18484 27978/21599/18491 17735/21595/18487
+f 17735/21595/18487 27978/21599/18491 31084/21600/18492 26677/21597/18489
+f 17728/21583/18475 17731/21596/18488 17736/21601/18493 17732/21584/18476
+f 17732/21584/18476 17736/21601/18493 27975/21579/18471 27974/21572/18464
+f 17731/21596/18488 26678/21598/18490 26679/21602/18494 17736/21601/18493
+f 17736/21601/18493 26679/21602/18494 31083/21580/18472 27975/21579/18471
+f 17737/21603/18495 17741/21604/18496 17742/21605/18497 17738/21606/18498
+f 17738/21606/18498 17742/21605/18497 26608/21607/18499 26609/21608/18500
+f 17741/21604/18496 27977/21592/18484 27976/21591/18483 17742/21605/18497
+f 17742/21605/18497 27976/21591/18483 31060/21594/18486 26608/21607/18499
+f 17737/21603/18495 17738/21606/18498 17743/21609/18501 17739/21610/18502
+f 17739/21610/18502 17743/21609/18501 27979/21611/18503 27980/21612/18504
+f 17738/21606/18498 26609/21608/18500 26610/21613/18505 17743/21609/18501
+f 17743/21609/18501 26610/21613/18505 31061/21614/18506 27979/21611/18503
+f 17737/21603/18495 17739/21610/18502 17744/21615/18507 17740/21616/18508
+f 17740/21616/18508 17744/21615/18507 26680/21617/18509 26681/21618/18510
+f 17739/21610/18502 27980/21612/18504 27981/21619/18511 17744/21615/18507
+f 17744/21615/18507 27981/21619/18511 31085/21620/18512 26680/21617/18509
+f 17737/21603/18495 17740/21616/18508 17745/21621/18513 17741/21604/18496
+f 17741/21604/18496 17745/21621/18513 27978/21599/18491 27977/21592/18484
+f 17740/21616/18508 26681/21618/18510 26682/21622/18514 17745/21621/18513
+f 17745/21621/18513 26682/21622/18514 31084/21600/18492 27978/21599/18491
+f 17746/21623/18515 17750/21624/18516 17751/21625/18517 17747/21626/18518
+f 17747/21626/18518 17751/21625/18517 26611/21627/18519 26612/21628/18520
+f 17750/21624/18516 27980/21612/18504 27979/21611/18503 17751/21625/18517
+f 17751/21625/18517 27979/21611/18503 31061/21614/18506 26611/21627/18519
+f 17746/21623/18515 17747/21626/18518 17752/21629/18521 17748/21630/18522
+f 17748/21630/18522 17752/21629/18521 27982/21631/18523 27983/21632/18524
+f 17747/21626/18518 26612/21628/18520 26613/21633/18525 17752/21629/18521
+f 17752/21629/18521 26613/21633/18525 31062/21634/18526 27982/21631/18523
+f 17746/21623/18515 17748/21630/18522 17753/21635/18527 17749/21636/18528
+f 17749/21636/18528 17753/21635/18527 26683/21637/18529 26684/21638/18530
+f 17748/21630/18522 27983/21632/18524 27984/21639/18531 17753/21635/18527
+f 17753/21635/18527 27984/21639/18531 31086/21640/18532 26683/21637/18529
+f 17746/21623/18515 17749/21636/18528 17754/21641/18533 17750/21624/18516
+f 17750/21624/18516 17754/21641/18533 27981/21619/18511 27980/21612/18504
+f 17749/21636/18528 26684/21638/18530 26685/21642/18534 17754/21641/18533
+f 17754/21641/18533 26685/21642/18534 31085/21620/18512 27981/21619/18511
+f 17755/21643/18535 17759/21644/18536 17760/21645/18537 17756/21646/18538
+f 17756/21646/18538 17760/21645/18537 26614/21647/18539 26615/21648/18540
+f 17759/21644/18536 27983/21632/18524 27982/21631/18523 17760/21645/18537
+f 17760/21645/18537 27982/21631/18523 31062/21634/18526 26614/21647/18539
+f 17755/21643/18535 17756/21646/18538 17761/21649/18541 17757/21650/18542
+f 17757/21650/18542 17761/21649/18541 27985/21651/18543 27986/21652/18544
+f 17756/21646/18538 26615/21648/18540 26616/21653/18545 17761/21649/18541
+f 17761/21649/18541 26616/21653/18545 31063/21654/18546 27985/21651/18543
+f 17755/21643/18535 17757/21650/18542 17762/21655/18547 17758/21656/18548
+f 17758/21656/18548 17762/21655/18547 26686/21657/18549 26687/21658/18550
+f 17757/21650/18542 27986/21652/18544 27987/21659/18551 17762/21655/18547
+f 17762/21655/18547 27987/21659/18551 31087/21660/18552 26686/21657/18549
+f 17755/21643/18535 17758/21656/18548 17763/21661/18553 17759/21644/18536
+f 17759/21644/18536 17763/21661/18553 27984/21639/18531 27983/21632/18524
+f 17758/21656/18548 26687/21658/18550 26688/21662/18554 17763/21661/18553
+f 17763/21661/18553 26688/21662/18554 31086/21640/18532 27984/21639/18531
+f 17764/21663/18555 17768/21664/18556 17769/21665/18557 17765/21666/18558
+f 17765/21666/18558 17769/21665/18557 26617/21667/18559 26618/21668/18560
+f 17768/21664/18556 27986/21652/18544 27985/21651/18543 17769/21665/18557
+f 17769/21665/18557 27985/21651/18543 31063/21654/18546 26617/21667/18559
+f 17764/21663/18555 17765/21666/18558 17770/21669/18561 17766/21670/18562
+f 17766/21670/18562 17770/21669/18561 27988/21671/18563 27989/21672/18564
+f 17765/21666/18558 26618/21668/18560 26619/21673/18565 17770/21669/18561
+f 17770/21669/18561 26619/21673/18565 31064/21674/18566 27988/21671/18563
+f 17764/21663/18555 17766/21670/18562 17771/21675/18567 17767/21676/18568
+f 17767/21676/18568 17771/21675/18567 26689/21677/18569 26690/21678/18570
+f 17766/21670/18562 27989/21672/18564 27990/21679/18571 17771/21675/18567
+f 17771/21675/18567 27990/21679/18571 31088/21680/18572 26689/21677/18569
+f 17764/21663/18555 17767/21676/18568 17772/21681/18573 17768/21664/18556
+f 17768/21664/18556 17772/21681/18573 27987/21659/18551 27986/21652/18544
+f 17767/21676/18568 26690/21678/18570 26691/21682/18574 17772/21681/18573
+f 17772/21681/18573 26691/21682/18574 31087/21660/18552 27987/21659/18551
+f 17773/21683/18575 17777/21684/18576 17778/21685/18577 17774/21686/18578
+f 17774/21686/18578 17778/21685/18577 26620/21687/18579 26621/21688/18580
+f 17777/21684/18576 27989/21672/18564 27988/21671/18563 17778/21685/18577
+f 17778/21685/18577 27988/21671/18563 31064/21674/18566 26620/21687/18579
+f 17773/21683/18575 17774/21686/18578 17779/21689/18581 17775/21690/18582
+f 17775/21690/18582 17779/21689/18581 27991/21691/18583 27992/21692/18584
+f 17774/21686/18578 26621/21688/18580 26622/21693/18585 17779/21689/18581
+f 17779/21689/18581 26622/21693/18585 31065/21694/18586 27991/21691/18583
+f 17773/21683/18575 17775/21690/18582 17780/21695/18587 17776/21696/18588
+f 17776/21696/18588 17780/21695/18587 26692/21697/18589 26693/21698/18590
+f 17775/21690/18582 27992/21692/18584 27993/21699/18591 17780/21695/18587
+f 17780/21695/18587 27993/21699/18591 31089/21700/18592 26692/21697/18589
+f 17773/21683/18575 17776/21696/18588 17781/21701/18593 17777/21684/18576
+f 17777/21684/18576 17781/21701/18593 27990/21679/18571 27989/21672/18564
+f 17776/21696/18588 26693/21698/18590 26694/21702/18594 17781/21701/18593
+f 17781/21701/18593 26694/21702/18594 31088/21680/18572 27990/21679/18571
+f 17782/21703/18595 17786/21704/18596 17787/21705/18597 17783/21706/18598
+f 17783/21706/18598 17787/21705/18597 26623/21707/18599 26624/21708/18600
+f 17786/21704/18596 27992/21692/18584 27991/21691/18583 17787/21705/18597
+f 17787/21705/18597 27991/21691/18583 31065/21694/18586 26623/21707/18599
+f 17782/21703/18595 17783/21706/18598 17788/21709/18601 17784/21710/18602
+f 17784/21710/18602 17788/21709/18601 27994/21711/18603 27995/21712/18604
+f 17783/21706/18598 26624/21708/18600 26625/21713/18605 17788/21709/18601
+f 17788/21709/18601 26625/21713/18605 31066/21714/18606 27994/21711/18603
+f 17782/21703/18595 17784/21710/18602 17789/21715/18607 17785/21716/18608
+f 17785/21716/18608 17789/21715/18607 26695/21717/18609 26696/21718/18610
+f 17784/21710/18602 27995/21712/18604 27996/21719/18611 17789/21715/18607
+f 17789/21715/18607 27996/21719/18611 31090/21720/18612 26695/21717/18609
+f 17782/21703/18595 17785/21716/18608 17790/21721/18613 17786/21704/18596
+f 17786/21704/18596 17790/21721/18613 27993/21699/18591 27992/21692/18584
+f 17785/21716/18608 26696/21718/18610 26697/21722/18614 17790/21721/18613
+f 17790/21721/18613 26697/21722/18614 31089/21700/18592 27993/21699/18591
+f 17791/21723/18615 17795/21724/18616 17796/21725/18617 17792/21726/18618
+f 17792/21726/18618 17796/21725/18617 26626/21727/18619 26627/21728/18620
+f 17795/21724/18616 27995/21712/18604 27994/21711/18603 17796/21725/18617
+f 17796/21725/18617 27994/21711/18603 31066/21714/18606 26626/21727/18619
+f 17791/21723/18615 17792/21726/18618 17797/21729/18621 17793/21730/18622
+f 17793/21730/18622 17797/21729/18621 27997/21731/18623 27998/21732/18624
+f 17792/21726/18618 26627/21728/18620 26628/21733/18625 17797/21729/18621
+f 17797/21729/18621 26628/21733/18625 31067/21734/18626 27997/21731/18623
+f 17791/21723/18615 17793/21730/18622 17798/21735/18627 17794/21736/18628
+f 17794/21736/18628 17798/21735/18627 26698/21737/18629 26699/21738/18630
+f 17793/21730/18622 27998/21732/18624 27999/21739/18631 17798/21735/18627
+f 17798/21735/18627 27999/21739/18631 31091/21740/18632 26698/21737/18629
+f 17791/21723/18615 17794/21736/18628 17799/21741/18633 17795/21724/18616
+f 17795/21724/18616 17799/21741/18633 27996/21719/18611 27995/21712/18604
+f 17794/21736/18628 26699/21738/18630 26700/21742/18634 17799/21741/18633
+f 17799/21741/18633 26700/21742/18634 31090/21720/18612 27996/21719/18611
+f 17800/21743/18635 17804/21744/18636 17805/21745/18637 17801/21746/18638
+f 17801/21746/18638 17805/21745/18637 26629/21747/18639 26630/21748/18640
+f 17804/21744/18636 27998/21732/18624 27997/21731/18623 17805/21745/18637
+f 17805/21745/18637 27997/21731/18623 31067/21734/18626 26629/21747/18639
+f 17800/21743/18635 17801/21746/18638 17806/21749/18641 17802/21750/18642
+f 17802/21750/18642 17806/21749/18641 28000/21751/18643 28001/21752/18644
+f 17801/21746/18638 26630/21748/18640 26631/21753/18645 17806/21749/18641
+f 17806/21749/18641 26631/21753/18645 31068/21754/18646 28000/21751/18643
+f 17800/21743/18635 17802/21750/18642 17807/21755/18647 17803/21756/18648
+f 17803/21756/18648 17807/21755/18647 26701/21757/18649 26702/21758/18650
+f 17802/21750/18642 28001/21752/18644 28002/21759/18651 17807/21755/18647
+f 17807/21755/18647 28002/21759/18651 31092/21760/18652 26701/21757/18649
+f 17800/21743/18635 17803/21756/18648 17808/21761/18653 17804/21744/18636
+f 17804/21744/18636 17808/21761/18653 27999/21739/18631 27998/21732/18624
+f 17803/21756/18648 26702/21758/18650 26703/21762/18654 17808/21761/18653
+f 17808/21761/18653 26703/21762/18654 31091/21740/18632 27999/21739/18631
+f 17809/21763/18655 17813/21764/18656 17814/21765/18657 17810/21766/18658
+f 17810/21766/18658 17814/21765/18657 26632/21767/18659 26633/21768/18660
+f 17813/21764/18656 28001/21752/18644 28000/21751/18643 17814/21765/18657
+f 17814/21765/18657 28000/21751/18643 31068/21754/18646 26632/21767/18659
+f 17809/21763/18655 17810/21766/18658 17815/21769/18661 17811/21770/18662
+f 17811/21770/18662 17815/21769/18661 28003/21771/18663 28004/21772/18664
+f 17810/21766/18658 26633/21768/18660 26634/21773/18665 17815/21769/18661
+f 17815/21769/18661 26634/21773/18665 31069/21774/18666 28003/21771/18663
+f 17809/21763/18655 17811/21770/18662 17816/21775/18667 17812/21776/18668
+f 17812/21776/18668 17816/21775/18667 26704/21777/18669 26705/21778/18670
+f 17811/21770/18662 28004/21772/18664 28005/21779/18671 17816/21775/18667
+f 17816/21775/18667 28005/21779/18671 31093/21780/18672 26704/21777/18669
+f 17809/21763/18655 17812/21776/18668 17817/21781/18673 17813/21764/18656
+f 17813/21764/18656 17817/21781/18673 28002/21759/18651 28001/21752/18644
+f 17812/21776/18668 26705/21778/18670 26706/21782/18674 17817/21781/18673
+f 17817/21781/18673 26706/21782/18674 31092/21760/18652 28002/21759/18651
+f 17818/21783/18675 17822/21784/18676 17823/21785/18677 17819/21786/18678
+f 17819/21786/18678 17823/21785/18677 26635/21787/18679 26636/21788/18680
+f 17822/21784/18676 28004/21772/18664 28003/21771/18663 17823/21785/18677
+f 17823/21785/18677 28003/21771/18663 31069/21774/18666 26635/21787/18679
+f 17818/21783/18675 17819/21786/18678 17824/21789/18681 17820/21790/18682
+f 17820/21790/18682 17824/21789/18681 28006/21791/18683 28007/21792/18684
+f 17819/21786/18678 26636/21788/18680 26637/21793/18685 17824/21789/18681
+f 17824/21789/18681 26637/21793/18685 31070/21794/18686 28006/21791/18683
+f 17818/21783/18675 17820/21790/18682 17825/21795/18687 17821/21796/18688
+f 17821/21796/18688 17825/21795/18687 26707/21797/18689 26708/21798/18690
+f 17820/21790/18682 28007/21792/18684 28008/21799/18691 17825/21795/18687
+f 17825/21795/18687 28008/21799/18691 31094/21800/18692 26707/21797/18689
+f 17818/21783/18675 17821/21796/18688 17826/21801/18693 17822/21784/18676
+f 17822/21784/18676 17826/21801/18693 28005/21779/18671 28004/21772/18664
+f 17821/21796/18688 26708/21798/18690 26709/21802/18694 17826/21801/18693
+f 17826/21801/18693 26709/21802/18694 31093/21780/18672 28005/21779/18671
+f 17827/21803/18695 17831/21804/18696 17832/21805/18697 17828/21806/18698
+f 17828/21806/18698 17832/21805/18697 26638/21807/18699 26639/21808/18700
+f 17831/21804/18696 28007/21809/18684 28006/21810/18683 17832/21805/18697
+f 17832/21805/18697 28006/21810/18683 31070/21811/18686 26638/21807/18699
+f 17827/21803/18695 17828/21806/18698 17833/21812/18701 17829/21813/18702
+f 17829/21813/18702 17833/21812/18701 28009/21814/18703 28010/21815/18704
+f 17828/21806/18698 26639/21808/18700 26640/21816/18705 17833/21812/18701
+f 17833/21812/18701 26640/21816/18705 31071/21817/18706 28009/21814/18703
+f 17827/21803/18695 17829/21813/18702 17834/21818/18707 17830/21819/18708
+f 17830/21819/18708 17834/21818/18707 26710/21820/18709 26711/21821/18710
+f 17829/21813/18702 28010/21815/18704 28011/21822/18711 17834/21818/18707
+f 17834/21818/18707 28011/21822/18711 31095/21823/18712 26710/21820/18709
+f 17827/21803/18695 17830/21819/18708 17835/21824/18713 17831/21804/18696
+f 17831/21804/18696 17835/21824/18713 28008/21825/18691 28007/21809/18684
+f 17830/21819/18708 26711/21821/18710 26712/21826/18714 17835/21824/18713
+f 17835/21824/18713 26712/21826/18714 31094/21827/18692 28008/21825/18691
+f 17836/21828/18715 17840/21829/18716 17841/21830/18717 17837/21831/18718
+f 17837/21831/18718 17841/21830/18717 26641/21832/18719 26642/21833/18720
+f 17840/21829/18716 28010/21815/18704 28009/21814/18703 17841/21830/18717
+f 17841/21830/18717 28009/21814/18703 31071/21817/18706 26641/21832/18719
+f 17836/21828/18715 17837/21831/18718 17842/21834/18721 17838/21835/18722
+f 17838/21835/18722 17842/21834/18721 28012/21836/18723 28013/21837/18724
+f 17837/21831/18718 26642/21833/18720 26643/21838/18725 17842/21834/18721
+f 17842/21834/18721 26643/21838/18725 31072/21839/18726 28012/21836/18723
+f 17836/21828/18715 17838/21835/18722 17843/21840/18727 17839/21841/18728
+f 17839/21841/18728 17843/21840/18727 26713/21842/18729 26714/21843/18730
+f 17838/21835/18722 28013/21837/18724 28014/21844/18731 17843/21840/18727
+f 17843/21840/18727 28014/21844/18731 31096/21845/18732 26713/21842/18729
+f 17836/21828/18715 17839/21841/18728 17844/21846/18733 17840/21829/18716
+f 17840/21829/18716 17844/21846/18733 28011/21822/18711 28010/21815/18704
+f 17839/21841/18728 26714/21843/18730 26715/21847/18734 17844/21846/18733
+f 17844/21846/18733 26715/21847/18734 31095/21823/18712 28011/21822/18711
+f 17845/21848/18735 17849/21849/18736 17850/21850/18737 17846/21851/18738
+f 17846/21851/18738 17850/21850/18737 26644/21852/18739 26645/21853/18740
+f 17849/21849/18736 28013/21837/18724 28012/21836/18723 17850/21850/18737
+f 17850/21850/18737 28012/21836/18723 31072/21839/18726 26644/21852/18739
+f 17845/21848/18735 17846/21851/18738 17851/21854/18741 17847/21855/18742
+f 17847/21855/18742 17851/21854/18741 28015/21856/18743 28016/21857/18744
+f 17846/21851/18738 26645/21853/18740 26646/21858/18745 17851/21854/18741
+f 17851/21854/18741 26646/21858/18745 31073/21859/18746 28015/21856/18743
+f 17845/21848/18735 17847/21855/18742 17852/21860/18747 17848/21861/18748
+f 17848/21861/18748 17852/21860/18747 26716/21862/18749 26717/21863/18750
+f 17847/21855/18742 28016/21857/18744 28017/21864/18751 17852/21860/18747
+f 17852/21860/18747 28017/21864/18751 31097/21865/18752 26716/21862/18749
+f 17845/21848/18735 17848/21861/18748 17853/21866/18753 17849/21849/18736
+f 17849/21849/18736 17853/21866/18753 28014/21844/18731 28013/21837/18724
+f 17848/21861/18748 26717/21863/18750 26718/21867/18754 17853/21866/18753
+f 17853/21866/18753 26718/21867/18754 31096/21845/18732 28014/21844/18731
+f 17854/21868/18755 17858/21869/18756 17859/21870/18757 17855/21871/18758
+f 17855/21871/18758 17859/21870/18757 26647/21872/18759 26648/21873/18760
+f 17858/21869/18756 28016/21857/18744 28015/21856/18743 17859/21870/18757
+f 17859/21870/18757 28015/21856/18743 31073/21859/18746 26647/21872/18759
+f 17854/21868/18755 17855/21871/18758 17860/21874/18761 17856/21875/18762
+f 17856/21875/18762 17860/21874/18761 28018/21876/18763 28019/21877/18764
+f 17855/21871/18758 26648/21873/18760 26649/21878/18765 17860/21874/18761
+f 17860/21874/18761 26649/21878/18765 31074/21879/18766 28018/21876/18763
+f 17854/21868/18755 17856/21875/18762 17861/21880/18767 17857/21881/18768
+f 17857/21881/18768 17861/21880/18767 26719/21882/18769 26720/21883/18770
+f 17856/21875/18762 28019/21877/18764 28020/21884/18771 17861/21880/18767
+f 17861/21880/18767 28020/21884/18771 31098/21885/18772 26719/21882/18769
+f 17854/21868/18755 17857/21881/18768 17862/21886/18773 17858/21869/18756
+f 17858/21869/18756 17862/21886/18773 28017/21864/18751 28016/21857/18744
+f 17857/21881/18768 26720/21883/18770 26721/21887/18774 17862/21886/18773
+f 17862/21886/18773 26721/21887/18774 31097/21865/18752 28017/21864/18751
+f 17863/21888/18775 17867/21889/18776 17868/21890/18777 17864/21891/18778
+f 17864/21891/18778 17868/21890/18777 26650/21892/18779 26651/21893/18780
+f 17867/21889/18776 28019/21877/18764 28018/21876/18763 17868/21890/18777
+f 17868/21890/18777 28018/21876/18763 31074/21879/18766 26650/21892/18779
+f 17863/21888/18775 17864/21891/18778 17869/21894/18781 17865/21895/18782
+f 17865/21895/18782 17869/21894/18781 28021/21896/18783 28022/21897/18784
+f 17864/21891/18778 26651/21893/18780 26652/21898/18785 17869/21894/18781
+f 17869/21894/18781 26652/21898/18785 31075/21899/18786 28021/21896/18783
+f 17863/21888/18775 17865/21895/18782 17870/21900/18787 17866/21901/18788
+f 17866/21901/18788 17870/21900/18787 26722/21902/18789 26723/21903/18790
+f 17865/21895/18782 28022/21897/18784 28023/21904/18791 17870/21900/18787
+f 17870/21900/18787 28023/21904/18791 31099/21905/18792 26722/21902/18789
+f 17863/21888/18775 17866/21901/18788 17871/21906/18793 17867/21889/18776
+f 17867/21889/18776 17871/21906/18793 28020/21884/18771 28019/21877/18764
+f 17866/21901/18788 26723/21903/18790 26724/21907/18794 17871/21906/18793
+f 17871/21906/18793 26724/21907/18794 31098/21885/18772 28020/21884/18771
+f 17872/21908/18795 17876/21909/18796 17877/21910/18797 17873/21911/18798
+f 17873/21911/18798 17877/21910/18797 26653/21912/18799 26654/21913/18800
+f 17876/21909/18796 28022/21897/18784 28021/21896/18783 17877/21910/18797
+f 17877/21910/18797 28021/21896/18783 31075/21899/18786 26653/21912/18799
+f 17872/21908/18795 17873/21911/18798 17878/21914/18801 17874/21915/18802
+f 17874/21915/18802 17878/21914/18801 28024/21916/18803 28025/21917/18804
+f 17873/21911/18798 26654/21913/18800 26655/21918/18805 17878/21914/18801
+f 17878/21914/18801 26655/21918/18805 31076/21919/18806 28024/21916/18803
+f 17872/21908/18795 17874/21915/18802 17879/21920/18807 17875/21921/18808
+f 17875/21921/18808 17879/21920/18807 26725/21922/18809 26726/21923/18810
+f 17874/21915/18802 28025/21917/18804 28026/21924/18811 17879/21920/18807
+f 17879/21920/18807 28026/21924/18811 31100/21925/18812 26725/21922/18809
+f 17872/21908/18795 17875/21921/18808 17880/21926/18813 17876/21909/18796
+f 17876/21909/18796 17880/21926/18813 28023/21904/18791 28022/21897/18784
+f 17875/21921/18808 26726/21923/18810 26727/21927/18814 17880/21926/18813
+f 17880/21926/18813 26727/21927/18814 31099/21905/18792 28023/21904/18791
+f 17881/21928/18815 17885/21929/18816 17886/21930/18817 17882/21931/18818
+f 17882/21931/18818 17886/21930/18817 26656/21932/18819 26657/21933/18820
+f 17885/21929/18816 28025/21917/18804 28024/21916/18803 17886/21930/18817
+f 17886/21930/18817 28024/21916/18803 31076/21919/18806 26656/21932/18819
+f 17881/21928/18815 17882/21931/18818 17887/21934/18821 17883/21935/18822
+f 17883/21935/18822 17887/21934/18821 27957/21465/18357 27956/21464/18356
+f 17882/21931/18818 26657/21933/18820 26658/21936/18823 17887/21934/18821
+f 17887/21934/18821 26658/21936/18823 31053/21466/18358 27957/21465/18357
+f 17881/21928/18815 17883/21935/18822 17888/21937/18824 17884/21938/18825
+f 17884/21938/18825 17888/21937/18824 26728/21939/18826 26729/21940/18827
+f 17883/21935/18822 27956/21464/18356 27955/21480/18372 17888/21937/18824
+f 17888/21937/18824 27955/21480/18372 31077/21482/18374 26728/21939/18826
+f 17881/21928/18815 17884/21938/18825 17889/21941/18828 17885/21929/18816
+f 17885/21929/18816 17889/21941/18828 28026/21924/18811 28025/21917/18804
+f 17884/21938/18825 26729/21940/18827 26730/21942/18829 17889/21941/18828
+f 17889/21941/18828 26730/21942/18829 31100/21925/18812 28026/21924/18811
+f 17890/21943/18830 17894/21944/18831 17895/21945/18832 17891/21946/18833
+f 17891/21946/18833 17895/21945/18832 26661/21481/18373 26660/21476/18368
+f 17894/21944/18831 28028/21947/18834 28029/21948/18835 17895/21945/18832
+f 17895/21945/18832 28029/21948/18835 31077/21482/18374 26661/21481/18373
+f 17890/21943/18830 17891/21946/18833 17896/21949/18836 17892/21950/18837
+f 17892/21950/18837 17896/21949/18836 28030/21951/18838 28031/21952/18839
+f 17891/21946/18833 26660/21476/18368 26659/21475/18367 17896/21949/18836
+f 17896/21949/18836 26659/21475/18367 31078/21478/18370 28030/21951/18838
+f 17890/21943/18830 17892/21950/18837 17897/21953/18840 17893/21954/18841
+f 17893/21954/18841 17897/21953/18840 26731/21955/18842 26732/21956/18843
+f 17892/21950/18837 28031/21952/18839 28032/21957/18844 17897/21953/18840
+f 17897/21953/18840 28032/21957/18844 31102/21958/18845 26731/21955/18842
+f 17890/21943/18830 17893/21954/18841 17898/21959/18846 17894/21944/18831
+f 17894/21944/18831 17898/21959/18846 28027/21960/18847 28028/21947/18834
+f 17893/21954/18841 26732/21956/18843 26733/21961/18848 17898/21959/18846
+f 17898/21959/18846 26733/21961/18848 31101/21962/18849 28027/21960/18847
+f 17899/21963/18850 17903/21964/18851 17904/21965/18852 17900/21966/18853
+f 17900/21966/18853 17904/21965/18852 26664/21502/18394 26663/21498/18390
+f 17903/21964/18851 28031/21952/18839 28030/21951/18838 17904/21965/18852
+f 17904/21965/18852 28030/21951/18838 31078/21478/18370 26664/21502/18394
+f 17899/21963/18850 17900/21966/18853 17905/21967/18854 17901/21968/18855
+f 17901/21968/18855 17905/21967/18854 28033/21969/18856 28034/21970/18857
+f 17900/21966/18853 26663/21498/18390 26662/21497/18389 17905/21967/18854
+f 17905/21967/18854 26662/21497/18389 31079/21500/18392 28033/21969/18856
+f 17899/21963/18850 17901/21968/18855 17906/21971/18858 17902/21972/18859
+f 17902/21972/18859 17906/21971/18858 26734/21973/18860 26735/21974/18861
+f 17901/21968/18855 28034/21970/18857 28035/21975/18862 17906/21971/18858
+f 17906/21971/18858 28035/21975/18862 31103/21976/18863 26734/21973/18860
+f 17899/21963/18850 17902/21972/18859 17907/21977/18864 17903/21964/18851
+f 17903/21964/18851 17907/21977/18864 28032/21957/18844 28031/21952/18839
+f 17902/21972/18859 26735/21974/18861 26736/21978/18865 17907/21977/18864
+f 17907/21977/18864 26736/21978/18865 31102/21958/18845 28032/21957/18844
+f 17908/21979/18866 17912/21980/18867 17913/21981/18868 17909/21982/18869
+f 17909/21982/18869 17913/21981/18868 26667/21522/18414 26666/21518/18410
+f 17912/21980/18867 28034/21970/18857 28033/21969/18856 17913/21981/18868
+f 17913/21981/18868 28033/21969/18856 31079/21500/18392 26667/21522/18414
+f 17908/21979/18866 17909/21982/18869 17914/21983/18870 17910/21984/18871
+f 17910/21984/18871 17914/21983/18870 28036/21985/18872 28037/21986/18873
+f 17909/21982/18869 26666/21518/18410 26665/21517/18409 17914/21983/18870
+f 17914/21983/18870 26665/21517/18409 31080/21520/18412 28036/21985/18872
+f 17908/21979/18866 17910/21984/18871 17915/21987/18874 17911/21988/18875
+f 17911/21988/18875 17915/21987/18874 26737/21989/18876 26738/21990/18877
+f 17910/21984/18871 28037/21986/18873 28038/21991/18878 17915/21987/18874
+f 17915/21987/18874 28038/21991/18878 31104/21992/18879 26737/21989/18876
+f 17908/21979/18866 17911/21988/18875 17916/21993/18880 17912/21980/18867
+f 17912/21980/18867 17916/21993/18880 28035/21975/18862 28034/21970/18857
+f 17911/21988/18875 26738/21990/18877 26739/21994/18881 17916/21993/18880
+f 17916/21993/18880 26739/21994/18881 31103/21976/18863 28035/21975/18862
+f 17917/21995/18882 17921/21996/18883 17922/21997/18884 17918/21998/18885
+f 17918/21998/18885 17922/21997/18884 26670/21542/18434 26669/21538/18430
+f 17921/21996/18883 28037/21986/18873 28036/21985/18872 17922/21997/18884
+f 17922/21997/18884 28036/21985/18872 31080/21520/18412 26670/21542/18434
+f 17917/21995/18882 17918/21998/18885 17923/21999/18886 17919/22000/18887
+f 17919/22000/18887 17923/21999/18886 28039/22001/18888 28040/22002/18889
+f 17918/21998/18885 26669/21538/18430 26668/21537/18429 17923/21999/18886
+f 17923/21999/18886 26668/21537/18429 31081/21540/18432 28039/22001/18888
+f 17917/21995/18882 17919/22000/18887 17924/22003/18890 17920/22004/18891
+f 17920/22004/18891 17924/22003/18890 26740/22005/18892 26741/22006/18893
+f 17919/22000/18887 28040/22002/18889 28041/22007/18894 17924/22003/18890
+f 17924/22003/18890 28041/22007/18894 31105/22008/18895 26740/22005/18892
+f 17917/21995/18882 17920/22004/18891 17925/22009/18896 17921/21996/18883
+f 17921/21996/18883 17925/22009/18896 28038/21991/18878 28037/21986/18873
+f 17920/22004/18891 26741/22006/18893 26742/22010/18897 17925/22009/18896
+f 17925/22009/18896 26742/22010/18897 31104/21992/18879 28038/21991/18878
+f 17926/22011/18898 17930/22012/18899 17931/22013/18900 17927/22014/18901
+f 17927/22014/18901 17931/22013/18900 26673/21562/18454 26672/21558/18450
+f 17930/22012/18899 28040/22002/18889 28039/22001/18888 17931/22013/18900
+f 17931/22013/18900 28039/22001/18888 31081/21540/18432 26673/21562/18454
+f 17926/22011/18898 17927/22014/18901 17932/22015/18902 17928/22016/18903
+f 17928/22016/18903 17932/22015/18902 28042/22017/18904 28043/22018/18905
+f 17927/22014/18901 26672/21558/18450 26671/21557/18449 17932/22015/18902
+f 17932/22015/18902 26671/21557/18449 31082/21560/18452 28042/22017/18904
+f 17926/22011/18898 17928/22016/18903 17933/22019/18906 17929/22020/18907
+f 17929/22020/18907 17933/22019/18906 26743/22021/18908 26744/22022/18909
+f 17928/22016/18903 28043/22018/18905 28044/22023/18910 17933/22019/18906
+f 17933/22019/18906 28044/22023/18910 31106/22024/18911 26743/22021/18908
+f 17926/22011/18898 17929/22020/18907 17934/22025/18912 17930/22012/18899
+f 17930/22012/18899 17934/22025/18912 28041/22007/18894 28040/22002/18889
+f 17929/22020/18907 26744/22022/18909 26745/22026/18913 17934/22025/18912
+f 17934/22025/18912 26745/22026/18913 31105/22008/18895 28041/22007/18894
+f 17935/22027/18914 17939/22028/18915 17940/22029/18916 17936/22030/18917
+f 17936/22030/18917 17940/22029/18916 26676/21582/18474 26675/21578/18470
+f 17939/22028/18915 28043/22018/18905 28042/22017/18904 17940/22029/18916
+f 17940/22029/18916 28042/22017/18904 31082/21560/18452 26676/21582/18474
+f 17935/22027/18914 17936/22030/18917 17941/22031/18918 17937/22032/18919
+f 17937/22032/18919 17941/22031/18918 28045/22033/18920 28046/22034/18921
+f 17936/22030/18917 26675/21578/18470 26674/21577/18469 17941/22031/18918
+f 17941/22031/18918 26674/21577/18469 31083/21580/18472 28045/22033/18920
+f 17935/22027/18914 17937/22032/18919 17942/22035/18922 17938/22036/18923
+f 17938/22036/18923 17942/22035/18922 26746/22037/18924 26747/22038/18925
+f 17937/22032/18919 28046/22034/18921 28047/22039/18926 17942/22035/18922
+f 17942/22035/18922 28047/22039/18926 31107/22040/18927 26746/22037/18924
+f 17935/22027/18914 17938/22036/18923 17943/22041/18928 17939/22028/18915
+f 17939/22028/18915 17943/22041/18928 28044/22023/18910 28043/22018/18905
+f 17938/22036/18923 26747/22038/18925 26748/22042/18929 17943/22041/18928
+f 17943/22041/18928 26748/22042/18929 31106/22024/18911 28044/22023/18910
+f 17944/22043/18930 17948/22044/18931 17949/22045/18932 17945/22046/18933
+f 17945/22046/18933 17949/22045/18932 26679/21602/18494 26678/21598/18490
+f 17948/22044/18931 28046/22034/18921 28045/22033/18920 17949/22045/18932
+f 17949/22045/18932 28045/22033/18920 31083/21580/18472 26679/21602/18494
+f 17944/22043/18930 17945/22046/18933 17950/22047/18934 17946/22048/18935
+f 17946/22048/18935 17950/22047/18934 28048/22049/18936 28049/22050/18937
+f 17945/22046/18933 26678/21598/18490 26677/21597/18489 17950/22047/18934
+f 17950/22047/18934 26677/21597/18489 31084/21600/18492 28048/22049/18936
+f 17944/22043/18930 17946/22048/18935 17951/22051/18938 17947/22052/18939
+f 17947/22052/18939 17951/22051/18938 26749/22053/18940 26750/22054/18941
+f 17946/22048/18935 28049/22050/18937 28050/22055/18942 17951/22051/18938
+f 17951/22051/18938 28050/22055/18942 31108/22056/18943 26749/22053/18940
+f 17944/22043/18930 17947/22052/18939 17952/22057/18944 17948/22044/18931
+f 17948/22044/18931 17952/22057/18944 28047/22039/18926 28046/22034/18921
+f 17947/22052/18939 26750/22054/18941 26751/22058/18945 17952/22057/18944
+f 17952/22057/18944 26751/22058/18945 31107/22040/18927 28047/22039/18926
+f 17953/22059/18946 17957/22060/18947 17958/22061/18948 17954/22062/18949
+f 17954/22062/18949 17958/22061/18948 26682/21622/18514 26681/21618/18510
+f 17957/22060/18947 28049/22050/18937 28048/22049/18936 17958/22061/18948
+f 17958/22061/18948 28048/22049/18936 31084/21600/18492 26682/21622/18514
+f 17953/22059/18946 17954/22062/18949 17959/22063/18950 17955/22064/18951
+f 17955/22064/18951 17959/22063/18950 28051/22065/18952 28052/22066/18953
+f 17954/22062/18949 26681/21618/18510 26680/21617/18509 17959/22063/18950
+f 17959/22063/18950 26680/21617/18509 31085/21620/18512 28051/22065/18952
+f 17953/22059/18946 17955/22064/18951 17960/22067/18954 17956/22068/18955
+f 17956/22068/18955 17960/22067/18954 26752/22069/18956 26753/22070/18957
+f 17955/22064/18951 28052/22066/18953 28053/22071/18958 17960/22067/18954
+f 17960/22067/18954 28053/22071/18958 31109/22072/18959 26752/22069/18956
+f 17953/22059/18946 17956/22068/18955 17961/22073/18960 17957/22060/18947
+f 17957/22060/18947 17961/22073/18960 28050/22055/18942 28049/22050/18937
+f 17956/22068/18955 26753/22070/18957 26754/22074/18961 17961/22073/18960
+f 17961/22073/18960 26754/22074/18961 31108/22056/18943 28050/22055/18942
+f 17962/22075/18962 17966/22076/18963 17967/22077/18964 17963/22078/18965
+f 17963/22078/18965 17967/22077/18964 26685/21642/18534 26684/21638/18530
+f 17966/22076/18963 28052/22066/18953 28051/22065/18952 17967/22077/18964
+f 17967/22077/18964 28051/22065/18952 31085/21620/18512 26685/21642/18534
+f 17962/22075/18962 17963/22078/18965 17968/22079/18966 17964/22080/18967
+f 17964/22080/18967 17968/22079/18966 28054/22081/18968 28055/22082/18969
+f 17963/22078/18965 26684/21638/18530 26683/21637/18529 17968/22079/18966
+f 17968/22079/18966 26683/21637/18529 31086/21640/18532 28054/22081/18968
+f 17962/22075/18962 17964/22080/18967 17969/22083/18970 17965/22084/18971
+f 17965/22084/18971 17969/22083/18970 26755/22085/18972 26756/22086/18973
+f 17964/22080/18967 28055/22082/18969 28056/22087/18974 17969/22083/18970
+f 17969/22083/18970 28056/22087/18974 31110/22088/18975 26755/22085/18972
+f 17962/22075/18962 17965/22084/18971 17970/22089/18976 17966/22076/18963
+f 17966/22076/18963 17970/22089/18976 28053/22071/18958 28052/22066/18953
+f 17965/22084/18971 26756/22086/18973 26757/22090/18977 17970/22089/18976
+f 17970/22089/18976 26757/22090/18977 31109/22072/18959 28053/22071/18958
+f 17971/22091/18978 17975/22092/18979 17976/22093/18980 17972/22094/18981
+f 17972/22094/18981 17976/22093/18980 26688/21662/18554 26687/21658/18550
+f 17975/22092/18979 28055/22082/18969 28054/22081/18968 17976/22093/18980
+f 17976/22093/18980 28054/22081/18968 31086/21640/18532 26688/21662/18554
+f 17971/22091/18978 17972/22094/18981 17977/22095/18982 17973/22096/18983
+f 17973/22096/18983 17977/22095/18982 28057/22097/18984 28058/22098/18985
+f 17972/22094/18981 26687/21658/18550 26686/21657/18549 17977/22095/18982
+f 17977/22095/18982 26686/21657/18549 31087/21660/18552 28057/22097/18984
+f 17971/22091/18978 17973/22096/18983 17978/22099/18986 17974/22100/18987
+f 17974/22100/18987 17978/22099/18986 26758/22101/18988 26759/22102/18989
+f 17973/22096/18983 28058/22098/18985 28059/22103/18990 17978/22099/18986
+f 17978/22099/18986 28059/22103/18990 31111/22104/18991 26758/22101/18988
+f 17971/22091/18978 17974/22100/18987 17979/22105/18992 17975/22092/18979
+f 17975/22092/18979 17979/22105/18992 28056/22087/18974 28055/22082/18969
+f 17974/22100/18987 26759/22102/18989 26760/22106/18993 17979/22105/18992
+f 17979/22105/18992 26760/22106/18993 31110/22088/18975 28056/22087/18974
+f 17980/22107/18994 17984/22108/18995 17985/22109/18996 17981/22110/18997
+f 17981/22110/18997 17985/22109/18996 26691/21682/18574 26690/21678/18570
+f 17984/22108/18995 28058/22098/18985 28057/22097/18984 17985/22109/18996
+f 17985/22109/18996 28057/22097/18984 31087/21660/18552 26691/21682/18574
+f 17980/22107/18994 17981/22110/18997 17986/22111/18998 17982/22112/18999
+f 17982/22112/18999 17986/22111/18998 28060/22113/19000 28061/22114/19001
+f 17981/22110/18997 26690/21678/18570 26689/21677/18569 17986/22111/18998
+f 17986/22111/18998 26689/21677/18569 31088/21680/18572 28060/22113/19000
+f 17980/22107/18994 17982/22112/18999 17987/22115/19002 17983/22116/19003
+f 17983/22116/19003 17987/22115/19002 26761/22117/19004 26762/22118/19005
+f 17982/22112/18999 28061/22114/19001 28062/22119/19006 17987/22115/19002
+f 17987/22115/19002 28062/22119/19006 31112/22120/19007 26761/22117/19004
+f 17980/22107/18994 17983/22116/19003 17988/22121/19008 17984/22108/18995
+f 17984/22108/18995 17988/22121/19008 28059/22103/18990 28058/22098/18985
+f 17983/22116/19003 26762/22118/19005 26763/22122/19009 17988/22121/19008
+f 17988/22121/19008 26763/22122/19009 31111/22104/18991 28059/22103/18990
+f 17989/22123/19010 17993/22124/19011 17994/22125/19012 17990/22126/19013
+f 17990/22126/19013 17994/22125/19012 26694/21702/18594 26693/21698/18590
+f 17993/22124/19011 28061/22114/19001 28060/22113/19000 17994/22125/19012
+f 17994/22125/19012 28060/22113/19000 31088/21680/18572 26694/21702/18594
+f 17989/22123/19010 17990/22126/19013 17995/22127/19014 17991/22128/19015
+f 17991/22128/19015 17995/22127/19014 28063/22129/19016 28064/22130/19017
+f 17990/22126/19013 26693/21698/18590 26692/21697/18589 17995/22127/19014
+f 17995/22127/19014 26692/21697/18589 31089/21700/18592 28063/22129/19016
+f 17989/22123/19010 17991/22128/19015 17996/22131/19018 17992/22132/19019
+f 17992/22132/19019 17996/22131/19018 26764/22133/19020 26765/22134/19021
+f 17991/22128/19015 28064/22130/19017 28065/22135/19022 17996/22131/19018
+f 17996/22131/19018 28065/22135/19022 31113/22136/19023 26764/22133/19020
+f 17989/22123/19010 17992/22132/19019 17997/22137/19024 17993/22124/19011
+f 17993/22124/19011 17997/22137/19024 28062/22119/19006 28061/22114/19001
+f 17992/22132/19019 26765/22134/19021 26766/22138/19025 17997/22137/19024
+f 17997/22137/19024 26766/22138/19025 31112/22120/19007 28062/22119/19006
+f 17998/22139/19026 18002/22140/19027 18003/22141/19028 17999/22142/19029
+f 17999/22142/19029 18003/22141/19028 26697/21722/18614 26696/21718/18610
+f 18002/22140/19027 28064/22130/19017 28063/22129/19016 18003/22141/19028
+f 18003/22141/19028 28063/22129/19016 31089/21700/18592 26697/21722/18614
+f 17998/22139/19026 17999/22142/19029 18004/22143/19030 18000/22144/19031
+f 18000/22144/19031 18004/22143/19030 28066/22145/19032 28067/22146/19033
+f 17999/22142/19029 26696/21718/18610 26695/21717/18609 18004/22143/19030
+f 18004/22143/19030 26695/21717/18609 31090/21720/18612 28066/22145/19032
+f 17998/22139/19026 18000/22144/19031 18005/22147/19034 18001/22148/19035
+f 18001/22148/19035 18005/22147/19034 26767/22149/19036 26768/22150/19037
+f 18000/22144/19031 28067/22146/19033 28068/22151/19038 18005/22147/19034
+f 18005/22147/19034 28068/22151/19038 31114/22152/19039 26767/22149/19036
+f 17998/22139/19026 18001/22148/19035 18006/22153/19040 18002/22140/19027
+f 18002/22140/19027 18006/22153/19040 28065/22135/19022 28064/22130/19017
+f 18001/22148/19035 26768/22150/19037 26769/22154/19041 18006/22153/19040
+f 18006/22153/19040 26769/22154/19041 31113/22136/19023 28065/22135/19022
+f 18007/22155/19042 18011/22156/19043 18012/22157/19044 18008/22158/19045
+f 18008/22158/19045 18012/22157/19044 26700/21742/18634 26699/21738/18630
+f 18011/22156/19043 28067/22146/19033 28066/22145/19032 18012/22157/19044
+f 18012/22157/19044 28066/22145/19032 31090/21720/18612 26700/21742/18634
+f 18007/22155/19042 18008/22158/19045 18013/22159/19046 18009/22160/19047
+f 18009/22160/19047 18013/22159/19046 28069/22161/19048 28070/22162/19049
+f 18008/22158/19045 26699/21738/18630 26698/21737/18629 18013/22159/19046
+f 18013/22159/19046 26698/21737/18629 31091/21740/18632 28069/22161/19048
+f 18007/22155/19042 18009/22160/19047 18014/22163/19050 18010/22164/19051
+f 18010/22164/19051 18014/22163/19050 26770/22165/19052 26771/22166/19053
+f 18009/22160/19047 28070/22162/19049 28071/22167/19054 18014/22163/19050
+f 18014/22163/19050 28071/22167/19054 31115/22168/19055 26770/22165/19052
+f 18007/22155/19042 18010/22164/19051 18015/22169/19056 18011/22156/19043
+f 18011/22156/19043 18015/22169/19056 28068/22151/19038 28067/22146/19033
+f 18010/22164/19051 26771/22166/19053 26772/22170/19057 18015/22169/19056
+f 18015/22169/19056 26772/22170/19057 31114/22152/19039 28068/22151/19038
+f 18016/22171/19058 18020/22172/19059 18021/22173/19060 18017/22174/19061
+f 18017/22174/19061 18021/22173/19060 26703/21762/18654 26702/21758/18650
+f 18020/22172/19059 28070/22162/19049 28069/22161/19048 18021/22173/19060
+f 18021/22173/19060 28069/22161/19048 31091/21740/18632 26703/21762/18654
+f 18016/22171/19058 18017/22174/19061 18022/22175/19062 18018/22176/19063
+f 18018/22176/19063 18022/22175/19062 28072/22177/19064 28073/22178/19065
+f 18017/22174/19061 26702/21758/18650 26701/21757/18649 18022/22175/19062
+f 18022/22175/19062 26701/21757/18649 31092/21760/18652 28072/22177/19064
+f 18016/22171/19058 18018/22176/19063 18023/22179/19066 18019/22180/19067
+f 18019/22180/19067 18023/22179/19066 26773/22181/19068 26774/22182/19069
+f 18018/22176/19063 28073/22178/19065 28074/22183/19070 18023/22179/19066
+f 18023/22179/19066 28074/22183/19070 31116/22184/19071 26773/22181/19068
+f 18016/22171/19058 18019/22180/19067 18024/22185/19072 18020/22172/19059
+f 18020/22172/19059 18024/22185/19072 28071/22167/19054 28070/22162/19049
+f 18019/22180/19067 26774/22182/19069 26775/22186/19073 18024/22185/19072
+f 18024/22185/19072 26775/22186/19073 31115/22168/19055 28071/22167/19054
+f 18025/22187/19074 18029/22188/19075 18030/22189/19076 18026/22190/19077
+f 18026/22190/19077 18030/22189/19076 26706/21782/18674 26705/21778/18670
+f 18029/22188/19075 28073/22178/19065 28072/22177/19064 18030/22189/19076
+f 18030/22189/19076 28072/22177/19064 31092/21760/18652 26706/21782/18674
+f 18025/22187/19074 18026/22190/19077 18031/22191/19078 18027/22192/19079
+f 18027/22192/19079 18031/22191/19078 28075/22193/19080 28076/22194/19081
+f 18026/22190/19077 26705/21778/18670 26704/21777/18669 18031/22191/19078
+f 18031/22191/19078 26704/21777/18669 31093/21780/18672 28075/22193/19080
+f 18025/22187/19074 18027/22192/19079 18032/22195/19082 18028/22196/19083
+f 18028/22196/19083 18032/22195/19082 26776/22197/19084 26777/22198/19085
+f 18027/22192/19079 28076/22194/19081 28077/22199/19086 18032/22195/19082
+f 18032/22195/19082 28077/22199/19086 31117/22200/19087 26776/22197/19084
+f 18025/22187/19074 18028/22196/19083 18033/22201/19088 18029/22188/19075
+f 18029/22188/19075 18033/22201/19088 28074/22183/19070 28073/22178/19065
+f 18028/22196/19083 26777/22198/19085 26778/22202/19089 18033/22201/19088
+f 18033/22201/19088 26778/22202/19089 31116/22184/19071 28074/22183/19070
+f 18034/22203/19090 18038/22204/19091 18039/22205/19092 18035/22206/19093
+f 18035/22206/19093 18039/22205/19092 26709/21802/18694 26708/21798/18690
+f 18038/22204/19091 28076/22194/19081 28075/22193/19080 18039/22205/19092
+f 18039/22205/19092 28075/22193/19080 31093/21780/18672 26709/21802/18694
+f 18034/22203/19090 18035/22206/19093 18040/22207/19094 18036/22208/19095
+f 18036/22208/19095 18040/22207/19094 28078/22209/19096 28079/22210/19097
+f 18035/22206/19093 26708/21798/18690 26707/21797/18689 18040/22207/19094
+f 18040/22207/19094 26707/21797/18689 31094/21800/18692 28078/22209/19096
+f 18034/22203/19090 18036/22208/19095 18041/22211/19098 18037/22212/19099
+f 18037/22212/19099 18041/22211/19098 26779/22213/19100 26780/22214/19101
+f 18036/22208/19095 28079/22210/19097 28080/22215/19102 18041/22211/19098
+f 18041/22211/19098 28080/22215/19102 31118/22216/19103 26779/22213/19100
+f 18034/22203/19090 18037/22212/19099 18042/22217/19104 18038/22204/19091
+f 18038/22204/19091 18042/22217/19104 28077/22199/19086 28076/22194/19081
+f 18037/22212/19099 26780/22214/19101 26781/22218/19105 18042/22217/19104
+f 18042/22217/19104 26781/22218/19105 31117/22200/19087 28077/22199/19086
+f 18043/22219/19106 18047/22220/19107 18048/22221/19108 18044/22222/19109
+f 18044/22222/19109 18048/22221/19108 26712/21826/18714 26711/21821/18710
+f 18047/22220/19107 28079/22223/19097 28078/22224/19096 18048/22221/19108
+f 18048/22221/19108 28078/22224/19096 31094/21827/18692 26712/21826/18714
+f 18043/22219/19106 18044/22222/19109 18049/22225/19110 18045/22226/19111
+f 18045/22226/19111 18049/22225/19110 28081/22227/19112 28082/22228/19113
+f 18044/22222/19109 26711/21821/18710 26710/21820/18709 18049/22225/19110
+f 18049/22225/19110 26710/21820/18709 31095/21823/18712 28081/22227/19112
+f 18043/22219/19106 18045/22226/19111 18050/22229/19114 18046/22230/19115
+f 18046/22230/19115 18050/22229/19114 26782/22231/19116 26783/22232/19117
+f 18045/22226/19111 28082/22228/19113 28083/22233/19118 18050/22229/19114
+f 18050/22229/19114 28083/22233/19118 31119/22234/19119 26782/22231/19116
+f 18043/22219/19106 18046/22230/19115 18051/22235/19120 18047/22220/19107
+f 18047/22220/19107 18051/22235/19120 28080/22236/19102 28079/22223/19097
+f 18046/22230/19115 26783/22232/19117 26784/22237/19121 18051/22235/19120
+f 18051/22235/19120 26784/22237/19121 31118/22238/19103 28080/22236/19102
+f 18052/22239/19122 18056/22240/19123 18057/22241/19124 18053/22242/19125
+f 18053/22242/19125 18057/22241/19124 26715/21847/18734 26714/21843/18730
+f 18056/22240/19123 28082/22228/19113 28081/22227/19112 18057/22241/19124
+f 18057/22241/19124 28081/22227/19112 31095/21823/18712 26715/21847/18734
+f 18052/22239/19122 18053/22242/19125 18058/22243/19126 18054/22244/19127
+f 18054/22244/19127 18058/22243/19126 28084/22245/19128 28085/22246/19129
+f 18053/22242/19125 26714/21843/18730 26713/21842/18729 18058/22243/19126
+f 18058/22243/19126 26713/21842/18729 31096/21845/18732 28084/22245/19128
+f 18052/22239/19122 18054/22244/19127 18059/22247/19130 18055/22248/19131
+f 18055/22248/19131 18059/22247/19130 26785/22249/19132 26786/22250/19133
+f 18054/22244/19127 28085/22246/19129 28086/22251/19134 18059/22247/19130
+f 18059/22247/19130 28086/22251/19134 31120/22252/19135 26785/22249/19132
+f 18052/22239/19122 18055/22248/19131 18060/22253/19136 18056/22240/19123
+f 18056/22240/19123 18060/22253/19136 28083/22233/19118 28082/22228/19113
+f 18055/22248/19131 26786/22250/19133 26787/22254/19137 18060/22253/19136
+f 18060/22253/19136 26787/22254/19137 31119/22234/19119 28083/22233/19118
+f 18061/22255/19138 18065/22256/19139 18066/22257/19140 18062/22258/19141
+f 18062/22258/19141 18066/22257/19140 26718/21867/18754 26717/21863/18750
+f 18065/22256/19139 28085/22246/19129 28084/22245/19128 18066/22257/19140
+f 18066/22257/19140 28084/22245/19128 31096/21845/18732 26718/21867/18754
+f 18061/22255/19138 18062/22258/19141 18067/22259/19142 18063/22260/19143
+f 18063/22260/19143 18067/22259/19142 28087/22261/19144 28088/22262/19145
+f 18062/22258/19141 26717/21863/18750 26716/21862/18749 18067/22259/19142
+f 18067/22259/19142 26716/21862/18749 31097/21865/18752 28087/22261/19144
+f 18061/22255/19138 18063/22260/19143 18068/22263/19146 18064/22264/19147
+f 18064/22264/19147 18068/22263/19146 26788/22265/19148 26789/22266/19149
+f 18063/22260/19143 28088/22262/19145 28089/22267/19150 18068/22263/19146
+f 18068/22263/19146 28089/22267/19150 31121/22268/19151 26788/22265/19148
+f 18061/22255/19138 18064/22264/19147 18069/22269/19152 18065/22256/19139
+f 18065/22256/19139 18069/22269/19152 28086/22251/19134 28085/22246/19129
+f 18064/22264/19147 26789/22266/19149 26790/22270/19153 18069/22269/19152
+f 18069/22269/19152 26790/22270/19153 31120/22252/19135 28086/22251/19134
+f 18070/22271/19154 18074/22272/19155 18075/22273/19156 18071/22274/19157
+f 18071/22274/19157 18075/22273/19156 26721/21887/18774 26720/21883/18770
+f 18074/22272/19155 28088/22262/19145 28087/22261/19144 18075/22273/19156
+f 18075/22273/19156 28087/22261/19144 31097/21865/18752 26721/21887/18774
+f 18070/22271/19154 18071/22274/19157 18076/22275/19158 18072/22276/19159
+f 18072/22276/19159 18076/22275/19158 28090/22277/19160 28091/22278/19161
+f 18071/22274/19157 26720/21883/18770 26719/21882/18769 18076/22275/19158
+f 18076/22275/19158 26719/21882/18769 31098/21885/18772 28090/22277/19160
+f 18070/22271/19154 18072/22276/19159 18077/22279/19162 18073/22280/19163
+f 18073/22280/19163 18077/22279/19162 26791/22281/19164 26792/22282/19165
+f 18072/22276/19159 28091/22278/19161 28092/22283/19166 18077/22279/19162
+f 18077/22279/19162 28092/22283/19166 31122/22284/19167 26791/22281/19164
+f 18070/22271/19154 18073/22280/19163 18078/22285/19168 18074/22272/19155
+f 18074/22272/19155 18078/22285/19168 28089/22267/19150 28088/22262/19145
+f 18073/22280/19163 26792/22282/19165 26793/22286/19169 18078/22285/19168
+f 18078/22285/19168 26793/22286/19169 31121/22268/19151 28089/22267/19150
+f 18079/22287/19170 18083/22288/19171 18084/22289/19172 18080/22290/19173
+f 18080/22290/19173 18084/22289/19172 26724/21907/18794 26723/21903/18790
+f 18083/22288/19171 28091/22278/19161 28090/22277/19160 18084/22289/19172
+f 18084/22289/19172 28090/22277/19160 31098/21885/18772 26724/21907/18794
+f 18079/22287/19170 18080/22290/19173 18085/22291/19174 18081/22292/19175
+f 18081/22292/19175 18085/22291/19174 28093/22293/19176 28094/22294/19177
+f 18080/22290/19173 26723/21903/18790 26722/21902/18789 18085/22291/19174
+f 18085/22291/19174 26722/21902/18789 31099/21905/18792 28093/22293/19176
+f 18079/22287/19170 18081/22292/19175 18086/22295/19178 18082/22296/19179
+f 18082/22296/19179 18086/22295/19178 26794/22297/19180 26795/22298/19181
+f 18081/22292/19175 28094/22294/19177 28095/22299/19182 18086/22295/19178
+f 18086/22295/19178 28095/22299/19182 31123/22300/19183 26794/22297/19180
+f 18079/22287/19170 18082/22296/19179 18087/22301/19184 18083/22288/19171
+f 18083/22288/19171 18087/22301/19184 28092/22283/19166 28091/22278/19161
+f 18082/22296/19179 26795/22298/19181 26796/22302/19185 18087/22301/19184
+f 18087/22301/19184 26796/22302/19185 31122/22284/19167 28092/22283/19166
+f 18088/22303/19186 18092/22304/19187 18093/22305/19188 18089/22306/19189
+f 18089/22306/19189 18093/22305/19188 26727/21927/18814 26726/21923/18810
+f 18092/22304/19187 28094/22294/19177 28093/22293/19176 18093/22305/19188
+f 18093/22305/19188 28093/22293/19176 31099/21905/18792 26727/21927/18814
+f 18088/22303/19186 18089/22306/19189 18094/22307/19190 18090/22308/19191
+f 18090/22308/19191 18094/22307/19190 28096/22309/19192 28097/22310/19193
+f 18089/22306/19189 26726/21923/18810 26725/21922/18809 18094/22307/19190
+f 18094/22307/19190 26725/21922/18809 31100/21925/18812 28096/22309/19192
+f 18088/22303/19186 18090/22308/19191 18095/22311/19194 18091/22312/19195
+f 18091/22312/19195 18095/22311/19194 26797/22313/19196 26798/22314/19197
+f 18090/22308/19191 28097/22310/19193 28098/22315/19198 18095/22311/19194
+f 18095/22311/19194 28098/22315/19198 31124/22316/19199 26797/22313/19196
+f 18088/22303/19186 18091/22312/19195 18096/22317/19200 18092/22304/19187
+f 18092/22304/19187 18096/22317/19200 28095/22299/19182 28094/22294/19177
+f 18091/22312/19195 26798/22314/19197 26799/22318/19201 18096/22317/19200
+f 18096/22317/19200 26799/22318/19201 31123/22300/19183 28095/22299/19182
+f 18097/22319/19202 18101/22320/19203 18102/22321/19204 18098/22322/19205
+f 18098/22322/19205 18102/22321/19204 26730/21942/18829 26729/21940/18827
+f 18101/22320/19203 28097/22310/19193 28096/22309/19192 18102/22321/19204
+f 18102/22321/19204 28096/22309/19192 31100/21925/18812 26730/21942/18829
+f 18097/22319/19202 18098/22322/19205 18103/22323/19206 18099/22324/19207
+f 18099/22324/19207 18103/22323/19206 28029/21948/18835 28028/21947/18834
+f 18098/22322/19205 26729/21940/18827 26728/21939/18826 18103/22323/19206
+f 18103/22323/19206 26728/21939/18826 31077/21482/18374 28029/21948/18835
+f 18097/22319/19202 18099/22324/19207 18104/22325/19208 18100/22326/19209
+f 18100/22326/19209 18104/22325/19208 26800/22327/19210 26801/22328/19211
+f 18099/22324/19207 28028/21947/18834 28027/21960/18847 18104/22325/19208
+f 18104/22325/19208 28027/21960/18847 31101/21962/18849 26800/22327/19210
+f 18097/22319/19202 18100/22326/19209 18105/22329/19212 18101/22320/19203
+f 18101/22320/19203 18105/22329/19212 28098/22315/19198 28097/22310/19193
+f 18100/22326/19209 26801/22328/19211 26802/22330/19213 18105/22329/19212
+f 18105/22329/19212 26802/22330/19213 31124/22316/19199 28098/22315/19198
+f 18106/22331/19214 18110/22332/19215 18111/22333/19216 18107/22334/19217
+f 18107/22334/19217 18111/22333/19216 26733/21961/18848 26732/21956/18843
+f 18110/22332/19215 28100/22335/19218 28101/22336/19219 18111/22333/19216
+f 18111/22333/19216 28101/22336/19219 31101/21962/18849 26733/21961/18848
+f 18106/22331/19214 18107/22334/19217 18112/22337/19220 18108/22338/19221
+f 18108/22338/19221 18112/22337/19220 28102/22339/19222 28103/22340/19223
+f 18107/22334/19217 26732/21956/18843 26731/21955/18842 18112/22337/19220
+f 18112/22337/19220 26731/21955/18842 31102/21958/18845 28102/22339/19222
+f 18106/22331/19214 18108/22338/19221 18113/22341/19224 18109/22342/19225
+f 18109/22342/19225 18113/22341/19224 26803/22343/19226 26804/22344/19227
+f 18108/22338/19221 28103/22340/19223 28104/22345/19228 18113/22341/19224
+f 18113/22341/19224 28104/22345/19228 31126/22346/19229 26803/22343/19226
+f 18106/22331/19214 18109/22342/19225 18114/22347/19230 18110/22332/19215
+f 18110/22332/19215 18114/22347/19230 28099/22348/19231 28100/22335/19218
+f 18109/22342/19225 26804/22344/19227 26805/22349/19232 18114/22347/19230
+f 18114/22347/19230 26805/22349/19232 31125/22350/19233 28099/22348/19231
+f 18115/22351/19234 18119/22352/19235 18120/22353/19236 18116/22354/19237
+f 18116/22354/19237 18120/22353/19236 26736/21978/18865 26735/21974/18861
+f 18119/22352/19235 28103/22340/19223 28102/22339/19222 18120/22353/19236
+f 18120/22353/19236 28102/22339/19222 31102/21958/18845 26736/21978/18865
+f 18115/22351/19234 18116/22354/19237 18121/22355/19238 18117/22356/19239
+f 18117/22356/19239 18121/22355/19238 28105/22357/19240 28106/22358/19241
+f 18116/22354/19237 26735/21974/18861 26734/21973/18860 18121/22355/19238
+f 18121/22355/19238 26734/21973/18860 31103/21976/18863 28105/22357/19240
+f 18115/22351/19234 18117/22356/19239 18122/22359/19242 18118/22360/19243
+f 18118/22360/19243 18122/22359/19242 26806/22361/19244 26807/22362/19245
+f 18117/22356/19239 28106/22358/19241 28107/22363/19246 18122/22359/19242
+f 18122/22359/19242 28107/22363/19246 31127/22364/19247 26806/22361/19244
+f 18115/22351/19234 18118/22360/19243 18123/22365/19248 18119/22352/19235
+f 18119/22352/19235 18123/22365/19248 28104/22345/19228 28103/22340/19223
+f 18118/22360/19243 26807/22362/19245 26808/22366/19249 18123/22365/19248
+f 18123/22365/19248 26808/22366/19249 31126/22346/19229 28104/22345/19228
+f 18124/22367/19250 18128/22368/19251 18129/22369/19252 18125/22370/19253
+f 18125/22370/19253 18129/22369/19252 26739/21994/18881 26738/21990/18877
+f 18128/22368/19251 28106/22358/19241 28105/22357/19240 18129/22369/19252
+f 18129/22369/19252 28105/22357/19240 31103/21976/18863 26739/21994/18881
+f 18124/22367/19250 18125/22370/19253 18130/22371/19254 18126/22372/19255
+f 18126/22372/19255 18130/22371/19254 28108/22373/19256 28109/22374/19257
+f 18125/22370/19253 26738/21990/18877 26737/21989/18876 18130/22371/19254
+f 18130/22371/19254 26737/21989/18876 31104/21992/18879 28108/22373/19256
+f 18124/22367/19250 18126/22372/19255 18131/22375/19258 18127/22376/19259
+f 18127/22376/19259 18131/22375/19258 26809/22377/19260 26810/22378/19261
+f 18126/22372/19255 28109/22374/19257 28110/22379/19262 18131/22375/19258
+f 18131/22375/19258 28110/22379/19262 31128/22380/19263 26809/22377/19260
+f 18124/22367/19250 18127/22376/19259 18132/22381/19264 18128/22368/19251
+f 18128/22368/19251 18132/22381/19264 28107/22363/19246 28106/22358/19241
+f 18127/22376/19259 26810/22378/19261 26811/22382/19265 18132/22381/19264
+f 18132/22381/19264 26811/22382/19265 31127/22364/19247 28107/22363/19246
+f 18133/22383/19266 18137/22384/19267 18138/22385/19268 18134/22386/19269
+f 18134/22386/19269 18138/22385/19268 26742/22010/18897 26741/22006/18893
+f 18137/22384/19267 28109/22374/19257 28108/22373/19256 18138/22385/19268
+f 18138/22385/19268 28108/22373/19256 31104/21992/18879 26742/22010/18897
+f 18133/22383/19266 18134/22386/19269 18139/22387/19270 18135/22388/19271
+f 18135/22388/19271 18139/22387/19270 28111/22389/19272 28112/22390/19273
+f 18134/22386/19269 26741/22006/18893 26740/22005/18892 18139/22387/19270
+f 18139/22387/19270 26740/22005/18892 31105/22008/18895 28111/22389/19272
+f 18133/22383/19266 18135/22388/19271 18140/22391/19274 18136/22392/19275
+f 18136/22392/19275 18140/22391/19274 26812/22393/19276 26813/22394/19277
+f 18135/22388/19271 28112/22390/19273 28113/22395/19278 18140/22391/19274
+f 18140/22391/19274 28113/22395/19278 31129/22396/19279 26812/22393/19276
+f 18133/22383/19266 18136/22392/19275 18141/22397/19280 18137/22384/19267
+f 18137/22384/19267 18141/22397/19280 28110/22379/19262 28109/22374/19257
+f 18136/22392/19275 26813/22394/19277 26814/22398/19281 18141/22397/19280
+f 18141/22397/19280 26814/22398/19281 31128/22380/19263 28110/22379/19262
+f 18142/22399/19282 18146/22400/19283 18147/22401/19284 18143/22402/19285
+f 18143/22402/19285 18147/22401/19284 26745/22026/18913 26744/22022/18909
+f 18146/22400/19283 28112/22390/19273 28111/22389/19272 18147/22401/19284
+f 18147/22401/19284 28111/22389/19272 31105/22008/18895 26745/22026/18913
+f 18142/22399/19282 18143/22402/19285 18148/22403/19286 18144/22404/19287
+f 18144/22404/19287 18148/22403/19286 28114/22405/19288 28115/22406/19289
+f 18143/22402/19285 26744/22022/18909 26743/22021/18908 18148/22403/19286
+f 18148/22403/19286 26743/22021/18908 31106/22024/18911 28114/22405/19288
+f 18142/22399/19282 18144/22404/19287 18149/22407/19290 18145/22408/19291
+f 18145/22408/19291 18149/22407/19290 26815/22409/19292 26816/22410/19293
+f 18144/22404/19287 28115/22406/19289 28116/22411/19294 18149/22407/19290
+f 18149/22407/19290 28116/22411/19294 31130/22412/19295 26815/22409/19292
+f 18142/22399/19282 18145/22408/19291 18150/22413/19296 18146/22400/19283
+f 18146/22400/19283 18150/22413/19296 28113/22395/19278 28112/22390/19273
+f 18145/22408/19291 26816/22410/19293 26817/22414/19297 18150/22413/19296
+f 18150/22413/19296 26817/22414/19297 31129/22396/19279 28113/22395/19278
+f 18151/22415/19298 18155/22416/19299 18156/22417/19300 18152/22418/19301
+f 18152/22418/19301 18156/22417/19300 26748/22042/18929 26747/22038/18925
+f 18155/22416/19299 28115/22406/19289 28114/22405/19288 18156/22417/19300
+f 18156/22417/19300 28114/22405/19288 31106/22024/18911 26748/22042/18929
+f 18151/22415/19298 18152/22418/19301 18157/22419/19302 18153/22420/19303
+f 18153/22420/19303 18157/22419/19302 28117/22421/19304 28118/22422/19305
+f 18152/22418/19301 26747/22038/18925 26746/22037/18924 18157/22419/19302
+f 18157/22419/19302 26746/22037/18924 31107/22040/18927 28117/22421/19304
+f 18151/22415/19298 18153/22420/19303 18158/22423/19306 18154/22424/19307
+f 18154/22424/19307 18158/22423/19306 26818/22425/19308 26819/22426/19309
+f 18153/22420/19303 28118/22422/19305 28119/22427/19310 18158/22423/19306
+f 18158/22423/19306 28119/22427/19310 31131/22428/19311 26818/22425/19308
+f 18151/22415/19298 18154/22424/19307 18159/22429/19312 18155/22416/19299
+f 18155/22416/19299 18159/22429/19312 28116/22411/19294 28115/22406/19289
+f 18154/22424/19307 26819/22426/19309 26820/22430/19313 18159/22429/19312
+f 18159/22429/19312 26820/22430/19313 31130/22412/19295 28116/22411/19294
+f 18160/22431/19314 18164/22432/19315 18165/22433/19316 18161/22434/19317
+f 18161/22434/19317 18165/22433/19316 26751/22058/18945 26750/22054/18941
+f 18164/22432/19315 28118/22422/19305 28117/22421/19304 18165/22433/19316
+f 18165/22433/19316 28117/22421/19304 31107/22040/18927 26751/22058/18945
+f 18160/22431/19314 18161/22434/19317 18166/22435/19318 18162/22436/19319
+f 18162/22436/19319 18166/22435/19318 28120/22437/19320 28121/22438/19321
+f 18161/22434/19317 26750/22054/18941 26749/22053/18940 18166/22435/19318
+f 18166/22435/19318 26749/22053/18940 31108/22056/18943 28120/22437/19320
+f 18160/22431/19314 18162/22436/19319 18167/22439/19322 18163/22440/19323
+f 18163/22440/19323 18167/22439/19322 26821/22441/19324 26822/22442/19325
+f 18162/22436/19319 28121/22438/19321 28122/22443/19326 18167/22439/19322
+f 18167/22439/19322 28122/22443/19326 31132/22444/19327 26821/22441/19324
+f 18160/22431/19314 18163/22440/19323 18168/22445/19328 18164/22432/19315
+f 18164/22432/19315 18168/22445/19328 28119/22427/19310 28118/22422/19305
+f 18163/22440/19323 26822/22442/19325 26823/22446/19329 18168/22445/19328
+f 18168/22445/19328 26823/22446/19329 31131/22428/19311 28119/22427/19310
+f 18169/22447/19330 18173/22448/19331 18174/22449/19332 18170/22450/19333
+f 18170/22450/19333 18174/22449/19332 26754/22074/18961 26753/22070/18957
+f 18173/22448/19331 28121/22438/19321 28120/22437/19320 18174/22449/19332
+f 18174/22449/19332 28120/22437/19320 31108/22056/18943 26754/22074/18961
+f 18169/22447/19330 18170/22450/19333 18175/22451/19334 18171/22452/19335
+f 18171/22452/19335 18175/22451/19334 28123/22453/19336 28124/22454/19337
+f 18170/22450/19333 26753/22070/18957 26752/22069/18956 18175/22451/19334
+f 18175/22451/19334 26752/22069/18956 31109/22072/18959 28123/22453/19336
+f 18169/22447/19330 18171/22452/19335 18176/22455/19338 18172/22456/19339
+f 18172/22456/19339 18176/22455/19338 26824/22457/19340 26825/22458/19341
+f 18171/22452/19335 28124/22454/19337 28125/22459/19342 18176/22455/19338
+f 18176/22455/19338 28125/22459/19342 31133/22460/19343 26824/22457/19340
+f 18169/22447/19330 18172/22456/19339 18177/22461/19344 18173/22448/19331
+f 18173/22448/19331 18177/22461/19344 28122/22443/19326 28121/22438/19321
+f 18172/22456/19339 26825/22458/19341 26826/22462/19345 18177/22461/19344
+f 18177/22461/19344 26826/22462/19345 31132/22444/19327 28122/22443/19326
+f 18178/22463/19346 18182/22464/19347 18183/22465/19348 18179/22466/19349
+f 18179/22466/19349 18183/22465/19348 26757/22090/18977 26756/22086/18973
+f 18182/22464/19347 28124/22454/19337 28123/22453/19336 18183/22465/19348
+f 18183/22465/19348 28123/22453/19336 31109/22072/18959 26757/22090/18977
+f 18178/22463/19346 18179/22466/19349 18184/22467/19350 18180/22468/19351
+f 18180/22468/19351 18184/22467/19350 28126/22469/19352 28127/22470/19353
+f 18179/22466/19349 26756/22086/18973 26755/22085/18972 18184/22467/19350
+f 18184/22467/19350 26755/22085/18972 31110/22088/18975 28126/22469/19352
+f 18178/22463/19346 18180/22468/19351 18185/22471/19354 18181/22472/19355
+f 18181/22472/19355 18185/22471/19354 26827/22473/19356 26828/22474/19357
+f 18180/22468/19351 28127/22470/19353 28128/22475/19358 18185/22471/19354
+f 18185/22471/19354 28128/22475/19358 31134/22476/19359 26827/22473/19356
+f 18178/22463/19346 18181/22472/19355 18186/22477/19360 18182/22464/19347
+f 18182/22464/19347 18186/22477/19360 28125/22459/19342 28124/22454/19337
+f 18181/22472/19355 26828/22474/19357 26829/22478/19361 18186/22477/19360
+f 18186/22477/19360 26829/22478/19361 31133/22460/19343 28125/22459/19342
+f 18187/22479/19362 18191/22480/19363 18192/22481/19364 18188/22482/19365
+f 18188/22482/19365 18192/22481/19364 26760/22106/18993 26759/22102/18989
+f 18191/22480/19363 28127/22470/19353 28126/22469/19352 18192/22481/19364
+f 18192/22481/19364 28126/22469/19352 31110/22088/18975 26760/22106/18993
+f 18187/22479/19362 18188/22482/19365 18193/22483/19366 18189/22484/19367
+f 18189/22484/19367 18193/22483/19366 28129/22485/19368 28130/22486/19369
+f 18188/22482/19365 26759/22102/18989 26758/22101/18988 18193/22483/19366
+f 18193/22483/19366 26758/22101/18988 31111/22104/18991 28129/22485/19368
+f 18187/22479/19362 18189/22484/19367 18194/22487/19370 18190/22488/19371
+f 18190/22488/19371 18194/22487/19370 26830/22489/19372 26831/22490/19373
+f 18189/22484/19367 28130/22486/19369 28131/22491/19374 18194/22487/19370
+f 18194/22487/19370 28131/22491/19374 31135/22492/19375 26830/22489/19372
+f 18187/22479/19362 18190/22488/19371 18195/22493/19376 18191/22480/19363
+f 18191/22480/19363 18195/22493/19376 28128/22475/19358 28127/22470/19353
+f 18190/22488/19371 26831/22490/19373 26832/22494/19377 18195/22493/19376
+f 18195/22493/19376 26832/22494/19377 31134/22476/19359 28128/22475/19358
+f 18196/22495/19378 18200/22496/19379 18201/22497/19380 18197/22498/19381
+f 18197/22498/19381 18201/22497/19380 26763/22122/19009 26762/22118/19005
+f 18200/22496/19379 28130/22486/19369 28129/22485/19368 18201/22497/19380
+f 18201/22497/19380 28129/22485/19368 31111/22104/18991 26763/22122/19009
+f 18196/22495/19378 18197/22498/19381 18202/22499/19382 18198/22500/19383
+f 18198/22500/19383 18202/22499/19382 28132/22501/19384 28133/22502/19385
+f 18197/22498/19381 26762/22118/19005 26761/22117/19004 18202/22499/19382
+f 18202/22499/19382 26761/22117/19004 31112/22120/19007 28132/22501/19384
+f 18196/22495/19378 18198/22500/19383 18203/22503/19386 18199/22504/19387
+f 18199/22504/19387 18203/22503/19386 26833/22505/19388 26834/22506/19389
+f 18198/22500/19383 28133/22502/19385 28134/22507/19390 18203/22503/19386
+f 18203/22503/19386 28134/22507/19390 31136/22508/19391 26833/22505/19388
+f 18196/22495/19378 18199/22504/19387 18204/22509/19392 18200/22496/19379
+f 18200/22496/19379 18204/22509/19392 28131/22491/19374 28130/22486/19369
+f 18199/22504/19387 26834/22506/19389 26835/22510/19393 18204/22509/19392
+f 18204/22509/19392 26835/22510/19393 31135/22492/19375 28131/22491/19374
+f 18205/22511/19394 18209/22512/19395 18210/22513/19396 18206/22514/19397
+f 18206/22514/19397 18210/22513/19396 26766/22138/19025 26765/22134/19021
+f 18209/22512/19395 28133/22502/19385 28132/22501/19384 18210/22513/19396
+f 18210/22513/19396 28132/22501/19384 31112/22120/19007 26766/22138/19025
+f 18205/22511/19394 18206/22514/19397 18211/22515/19398 18207/22516/19399
+f 18207/22516/19399 18211/22515/19398 28135/22517/19400 28136/22518/19401
+f 18206/22514/19397 26765/22134/19021 26764/22133/19020 18211/22515/19398
+f 18211/22515/19398 26764/22133/19020 31113/22136/19023 28135/22517/19400
+f 18205/22511/19394 18207/22516/19399 18212/22519/19402 18208/22520/19403
+f 18208/22520/19403 18212/22519/19402 26836/22521/19404 26837/22522/19405
+f 18207/22516/19399 28136/22518/19401 28137/22523/19406 18212/22519/19402
+f 18212/22519/19402 28137/22523/19406 31137/22524/19407 26836/22521/19404
+f 18205/22511/19394 18208/22520/19403 18213/22525/19408 18209/22512/19395
+f 18209/22512/19395 18213/22525/19408 28134/22507/19390 28133/22502/19385
+f 18208/22520/19403 26837/22522/19405 26838/22526/19409 18213/22525/19408
+f 18213/22525/19408 26838/22526/19409 31136/22508/19391 28134/22507/19390
+f 18214/22527/19410 18218/22528/19411 18219/22529/19412 18215/22530/19413
+f 18215/22530/19413 18219/22529/19412 26769/22154/19041 26768/22150/19037
+f 18218/22528/19411 28136/22518/19401 28135/22517/19400 18219/22529/19412
+f 18219/22529/19412 28135/22517/19400 31113/22136/19023 26769/22154/19041
+f 18214/22527/19410 18215/22530/19413 18220/22531/19414 18216/22532/19415
+f 18216/22532/19415 18220/22531/19414 28138/22533/19416 28139/22534/19417
+f 18215/22530/19413 26768/22150/19037 26767/22149/19036 18220/22531/19414
+f 18220/22531/19414 26767/22149/19036 31114/22152/19039 28138/22533/19416
+f 18214/22527/19410 18216/22532/19415 18221/22535/19418 18217/22536/19419
+f 18217/22536/19419 18221/22535/19418 26839/22537/19420 26840/22538/19421
+f 18216/22532/19415 28139/22534/19417 28140/22539/19422 18221/22535/19418
+f 18221/22535/19418 28140/22539/19422 31138/22540/19423 26839/22537/19420
+f 18214/22527/19410 18217/22536/19419 18222/22541/19424 18218/22528/19411
+f 18218/22528/19411 18222/22541/19424 28137/22523/19406 28136/22518/19401
+f 18217/22536/19419 26840/22538/19421 26841/22542/19425 18222/22541/19424
+f 18222/22541/19424 26841/22542/19425 31137/22524/19407 28137/22523/19406
+f 18223/22543/19426 18227/22544/19427 18228/22545/19428 18224/22546/19429
+f 18224/22546/19429 18228/22545/19428 26772/22170/19057 26771/22166/19053
+f 18227/22544/19427 28139/22534/19417 28138/22533/19416 18228/22545/19428
+f 18228/22545/19428 28138/22533/19416 31114/22152/19039 26772/22170/19057
+f 18223/22543/19426 18224/22546/19429 18229/22547/19430 18225/22548/19431
+f 18225/22548/19431 18229/22547/19430 28141/22549/19432 28142/22550/19433
+f 18224/22546/19429 26771/22166/19053 26770/22165/19052 18229/22547/19430
+f 18229/22547/19430 26770/22165/19052 31115/22168/19055 28141/22549/19432
+f 18223/22543/19426 18225/22548/19431 18230/22551/19434 18226/22552/19435
+f 18226/22552/19435 18230/22551/19434 26842/22553/19436 26843/22554/19437
+f 18225/22548/19431 28142/22550/19433 28143/22555/19438 18230/22551/19434
+f 18230/22551/19434 28143/22555/19438 31139/22556/19439 26842/22553/19436
+f 18223/22543/19426 18226/22552/19435 18231/22557/19440 18227/22544/19427
+f 18227/22544/19427 18231/22557/19440 28140/22539/19422 28139/22534/19417
+f 18226/22552/19435 26843/22554/19437 26844/22558/19441 18231/22557/19440
+f 18231/22557/19440 26844/22558/19441 31138/22540/19423 28140/22539/19422
+f 18232/22559/19442 18236/22560/19443 18237/22561/19444 18233/22562/19445
+f 18233/22562/19445 18237/22561/19444 26775/22186/19073 26774/22182/19069
+f 18236/22560/19443 28142/22550/19433 28141/22549/19432 18237/22561/19444
+f 18237/22561/19444 28141/22549/19432 31115/22168/19055 26775/22186/19073
+f 18232/22559/19442 18233/22562/19445 18238/22563/19446 18234/22564/19447
+f 18234/22564/19447 18238/22563/19446 28144/22565/19448 28145/22566/19449
+f 18233/22562/19445 26774/22182/19069 26773/22181/19068 18238/22563/19446
+f 18238/22563/19446 26773/22181/19068 31116/22184/19071 28144/22565/19448
+f 18232/22559/19442 18234/22564/19447 18239/22567/19450 18235/22568/19451
+f 18235/22568/19451 18239/22567/19450 26845/22569/19452 26846/22570/19453
+f 18234/22564/19447 28145/22566/19449 28146/22571/19454 18239/22567/19450
+f 18239/22567/19450 28146/22571/19454 31140/22572/19455 26845/22569/19452
+f 18232/22559/19442 18235/22568/19451 18240/22573/19456 18236/22560/19443
+f 18236/22560/19443 18240/22573/19456 28143/22555/19438 28142/22550/19433
+f 18235/22568/19451 26846/22570/19453 26847/22574/19457 18240/22573/19456
+f 18240/22573/19456 26847/22574/19457 31139/22556/19439 28143/22555/19438
+f 18241/22575/19458 18245/22576/19459 18246/22577/19460 18242/22578/19461
+f 18242/22578/19461 18246/22577/19460 26778/22202/19089 26777/22198/19085
+f 18245/22576/19459 28145/22566/19449 28144/22565/19448 18246/22577/19460
+f 18246/22577/19460 28144/22565/19448 31116/22184/19071 26778/22202/19089
+f 18241/22575/19458 18242/22578/19461 18247/22579/19462 18243/22580/19463
+f 18243/22580/19463 18247/22579/19462 28147/22581/19464 28148/22582/19465
+f 18242/22578/19461 26777/22198/19085 26776/22197/19084 18247/22579/19462
+f 18247/22579/19462 26776/22197/19084 31117/22200/19087 28147/22581/19464
+f 18241/22575/19458 18243/22580/19463 18248/22583/19466 18244/22584/19467
+f 18244/22584/19467 18248/22583/19466 26848/22585/19468 26849/22586/19469
+f 18243/22580/19463 28148/22582/19465 28149/22587/19470 18248/22583/19466
+f 18248/22583/19466 28149/22587/19470 31141/22588/19471 26848/22585/19468
+f 18241/22575/19458 18244/22584/19467 18249/22589/19472 18245/22576/19459
+f 18245/22576/19459 18249/22589/19472 28146/22571/19454 28145/22566/19449
+f 18244/22584/19467 26849/22586/19469 26850/22590/19473 18249/22589/19472
+f 18249/22589/19472 26850/22590/19473 31140/22572/19455 28146/22571/19454
+f 18250/22591/19474 18254/22592/19475 18255/22593/19476 18251/22594/19477
+f 18251/22594/19477 18255/22593/19476 26781/22218/19105 26780/22214/19101
+f 18254/22592/19475 28148/22582/19465 28147/22581/19464 18255/22593/19476
+f 18255/22593/19476 28147/22581/19464 31117/22200/19087 26781/22218/19105
+f 18250/22591/19474 18251/22594/19477 18256/22595/19478 18252/22596/19479
+f 18252/22596/19479 18256/22595/19478 28150/22597/19480 28151/22598/19481
+f 18251/22594/19477 26780/22214/19101 26779/22213/19100 18256/22595/19478
+f 18256/22595/19478 26779/22213/19100 31118/22216/19103 28150/22597/19480
+f 18250/22591/19474 18252/22596/19479 18257/22599/19482 18253/22600/19483
+f 18253/22600/19483 18257/22599/19482 26851/22601/19484 26852/22602/19485
+f 18252/22596/19479 28151/22598/19481 28152/22603/19486 18257/22599/19482
+f 18257/22599/19482 28152/22603/19486 31142/22604/19487 26851/22601/19484
+f 18250/22591/19474 18253/22600/19483 18258/22605/19488 18254/22592/19475
+f 18254/22592/19475 18258/22605/19488 28149/22587/19470 28148/22582/19465
+f 18253/22600/19483 26852/22602/19485 26853/22606/19489 18258/22605/19488
+f 18258/22605/19488 26853/22606/19489 31141/22588/19471 28149/22587/19470
+f 18259/22607/19490 18263/22608/19491 18264/22609/19492 18260/22610/19493
+f 18260/22610/19493 18264/22609/19492 26784/22237/19121 26783/22232/19117
+f 18263/22608/19491 28151/22611/19481 28150/22612/19480 18264/22609/19492
+f 18264/22609/19492 28150/22612/19480 31118/22238/19103 26784/22237/19121
+f 18259/22607/19490 18260/22610/19493 18265/22613/19494 18261/22614/19495
+f 18261/22614/19495 18265/22613/19494 28153/22615/19496 28154/22616/19497
+f 18260/22610/19493 26783/22232/19117 26782/22231/19116 18265/22613/19494
+f 18265/22613/19494 26782/22231/19116 31119/22234/19119 28153/22615/19496
+f 18259/22607/19490 18261/22614/19495 18266/22617/19498 18262/22618/19499
+f 18262/22618/19499 18266/22617/19498 26854/22619/19500 26855/22620/19501
+f 18261/22614/19495 28154/22616/19497 28155/22621/19502 18266/22617/19498
+f 18266/22617/19498 28155/22621/19502 31143/22622/19503 26854/22619/19500
+f 18259/22607/19490 18262/22618/19499 18267/22623/19504 18263/22608/19491
+f 18263/22608/19491 18267/22623/19504 28152/22624/19486 28151/22611/19481
+f 18262/22618/19499 26855/22620/19501 26856/22625/19505 18267/22623/19504
+f 18267/22623/19504 26856/22625/19505 31142/22626/19487 28152/22624/19486
+f 18268/22627/19506 18272/22628/19507 18273/22629/19508 18269/22630/19509
+f 18269/22630/19509 18273/22629/19508 26787/22254/19137 26786/22250/19133
+f 18272/22628/19507 28154/22616/19497 28153/22615/19496 18273/22629/19508
+f 18273/22629/19508 28153/22615/19496 31119/22234/19119 26787/22254/19137
+f 18268/22627/19506 18269/22630/19509 18274/22631/19510 18270/22632/19511
+f 18270/22632/19511 18274/22631/19510 28156/22633/19512 28157/22634/19513
+f 18269/22630/19509 26786/22250/19133 26785/22249/19132 18274/22631/19510
+f 18274/22631/19510 26785/22249/19132 31120/22252/19135 28156/22633/19512
+f 18268/22627/19506 18270/22632/19511 18275/22635/19514 18271/22636/19515
+f 18271/22636/19515 18275/22635/19514 26857/22637/19516 26858/22638/19517
+f 18270/22632/19511 28157/22634/19513 28158/22639/19518 18275/22635/19514
+f 18275/22635/19514 28158/22639/19518 31144/22640/19519 26857/22637/19516
+f 18268/22627/19506 18271/22636/19515 18276/22641/19520 18272/22628/19507
+f 18272/22628/19507 18276/22641/19520 28155/22621/19502 28154/22616/19497
+f 18271/22636/19515 26858/22638/19517 26859/22642/19521 18276/22641/19520
+f 18276/22641/19520 26859/22642/19521 31143/22622/19503 28155/22621/19502
+f 18277/22643/19522 18281/22644/19523 18282/22645/19524 18278/22646/19525
+f 18278/22646/19525 18282/22645/19524 26790/22270/19153 26789/22266/19149
+f 18281/22644/19523 28157/22634/19513 28156/22633/19512 18282/22645/19524
+f 18282/22645/19524 28156/22633/19512 31120/22252/19135 26790/22270/19153
+f 18277/22643/19522 18278/22646/19525 18283/22647/19526 18279/22648/19527
+f 18279/22648/19527 18283/22647/19526 28159/22649/19528 28160/22650/19529
+f 18278/22646/19525 26789/22266/19149 26788/22265/19148 18283/22647/19526
+f 18283/22647/19526 26788/22265/19148 31121/22268/19151 28159/22649/19528
+f 18277/22643/19522 18279/22648/19527 18284/22651/19530 18280/22652/19531
+f 18280/22652/19531 18284/22651/19530 26860/22653/19532 26861/22654/19533
+f 18279/22648/19527 28160/22650/19529 28161/22655/19534 18284/22651/19530
+f 18284/22651/19530 28161/22655/19534 31145/22656/19535 26860/22653/19532
+f 18277/22643/19522 18280/22652/19531 18285/22657/19536 18281/22644/19523
+f 18281/22644/19523 18285/22657/19536 28158/22639/19518 28157/22634/19513
+f 18280/22652/19531 26861/22654/19533 26862/22658/19537 18285/22657/19536
+f 18285/22657/19536 26862/22658/19537 31144/22640/19519 28158/22639/19518
+f 18286/22659/19538 18290/22660/19539 18291/22661/19540 18287/22662/19541
+f 18287/22662/19541 18291/22661/19540 26793/22286/19169 26792/22282/19165
+f 18290/22660/19539 28160/22650/19529 28159/22649/19528 18291/22661/19540
+f 18291/22661/19540 28159/22649/19528 31121/22268/19151 26793/22286/19169
+f 18286/22659/19538 18287/22662/19541 18292/22663/19542 18288/22664/19543
+f 18288/22664/19543 18292/22663/19542 28162/22665/19544 28163/22666/19545
+f 18287/22662/19541 26792/22282/19165 26791/22281/19164 18292/22663/19542
+f 18292/22663/19542 26791/22281/19164 31122/22284/19167 28162/22665/19544
+f 18286/22659/19538 18288/22664/19543 18293/22667/19546 18289/22668/19547
+f 18289/22668/19547 18293/22667/19546 26863/22669/19548 26864/22670/19549
+f 18288/22664/19543 28163/22666/19545 28164/22671/19550 18293/22667/19546
+f 18293/22667/19546 28164/22671/19550 31146/22672/19551 26863/22669/19548
+f 18286/22659/19538 18289/22668/19547 18294/22673/19552 18290/22660/19539
+f 18290/22660/19539 18294/22673/19552 28161/22655/19534 28160/22650/19529
+f 18289/22668/19547 26864/22670/19549 26865/22674/19553 18294/22673/19552
+f 18294/22673/19552 26865/22674/19553 31145/22656/19535 28161/22655/19534
+f 18295/22675/19554 18299/22676/19555 18300/22677/19556 18296/22678/19557
+f 18296/22678/19557 18300/22677/19556 26796/22302/19185 26795/22298/19181
+f 18299/22676/19555 28163/22666/19545 28162/22665/19544 18300/22677/19556
+f 18300/22677/19556 28162/22665/19544 31122/22284/19167 26796/22302/19185
+f 18295/22675/19554 18296/22678/19557 18301/22679/19558 18297/22680/19559
+f 18297/22680/19559 18301/22679/19558 28165/22681/19560 28166/22682/19561
+f 18296/22678/19557 26795/22298/19181 26794/22297/19180 18301/22679/19558
+f 18301/22679/19558 26794/22297/19180 31123/22300/19183 28165/22681/19560
+f 18295/22675/19554 18297/22680/19559 18302/22683/19562 18298/22684/19563
+f 18298/22684/19563 18302/22683/19562 26866/22685/19564 26867/22686/19565
+f 18297/22680/19559 28166/22682/19561 28167/22687/19566 18302/22683/19562
+f 18302/22683/19562 28167/22687/19566 31147/22688/19567 26866/22685/19564
+f 18295/22675/19554 18298/22684/19563 18303/22689/19568 18299/22676/19555
+f 18299/22676/19555 18303/22689/19568 28164/22671/19550 28163/22666/19545
+f 18298/22684/19563 26867/22686/19565 26868/22690/19569 18303/22689/19568
+f 18303/22689/19568 26868/22690/19569 31146/22672/19551 28164/22671/19550
+f 18304/22691/19570 18308/22692/19571 18309/22693/19572 18305/22694/19573
+f 18305/22694/19573 18309/22693/19572 26799/22318/19201 26798/22314/19197
+f 18308/22692/19571 28166/22682/19561 28165/22681/19560 18309/22693/19572
+f 18309/22693/19572 28165/22681/19560 31123/22300/19183 26799/22318/19201
+f 18304/22691/19570 18305/22694/19573 18310/22695/19574 18306/22696/19575
+f 18306/22696/19575 18310/22695/19574 28168/22697/19576 28169/22698/19577
+f 18305/22694/19573 26798/22314/19197 26797/22313/19196 18310/22695/19574
+f 18310/22695/19574 26797/22313/19196 31124/22316/19199 28168/22697/19576
+f 18304/22691/19570 18306/22696/19575 18311/22699/19578 18307/22700/19579
+f 18307/22700/19579 18311/22699/19578 26869/22701/19580 26870/22702/19581
+f 18306/22696/19575 28169/22698/19577 28170/22703/19582 18311/22699/19578
+f 18311/22699/19578 28170/22703/19582 31148/22704/19583 26869/22701/19580
+f 18304/22691/19570 18307/22700/19579 18312/22705/19584 18308/22692/19571
+f 18308/22692/19571 18312/22705/19584 28167/22687/19566 28166/22682/19561
+f 18307/22700/19579 26870/22702/19581 26871/22706/19585 18312/22705/19584
+f 18312/22705/19584 26871/22706/19585 31147/22688/19567 28167/22687/19566
+f 18313/22707/19586 18317/22708/19587 18318/22709/19588 18314/22710/19589
+f 18314/22710/19589 18318/22709/19588 26802/22330/19213 26801/22328/19211
+f 18317/22708/19587 28169/22698/19577 28168/22697/19576 18318/22709/19588
+f 18318/22709/19588 28168/22697/19576 31124/22316/19199 26802/22330/19213
+f 18313/22707/19586 18314/22710/19589 18319/22711/19590 18315/22712/19591
+f 18315/22712/19591 18319/22711/19590 28101/22336/19219 28100/22335/19218
+f 18314/22710/19589 26801/22328/19211 26800/22327/19210 18319/22711/19590
+f 18319/22711/19590 26800/22327/19210 31101/21962/18849 28101/22336/19219
+f 18313/22707/19586 18315/22712/19591 18320/22713/19592 18316/22714/19593
+f 18316/22714/19593 18320/22713/19592 26872/22715/19594 26873/22716/19595
+f 18315/22712/19591 28100/22335/19218 28099/22348/19231 18320/22713/19592
+f 18320/22713/19592 28099/22348/19231 31125/22350/19233 26872/22715/19594
+f 18313/22707/19586 18316/22714/19593 18321/22717/19596 18317/22708/19587
+f 18317/22708/19587 18321/22717/19596 28170/22703/19582 28169/22698/19577
+f 18316/22714/19593 26873/22716/19595 26874/22718/19597 18321/22717/19596
+f 18321/22717/19596 26874/22718/19597 31148/22704/19583 28170/22703/19582
+f 18322/22719/19598 18326/22720/19599 18327/22721/19600 18323/22722/19601
+f 18323/22722/19601 18327/22721/19600 26805/22349/19232 26804/22344/19227
+f 18326/22720/19599 28172/22723/19602 28173/22724/19603 18327/22721/19600
+f 18327/22721/19600 28173/22724/19603 31125/22350/19233 26805/22349/19232
+f 18322/22719/19598 18323/22722/19601 18328/22725/19604 18324/22726/19605
+f 18324/22726/19605 18328/22725/19604 28174/22727/19606 28175/22728/19607
+f 18323/22722/19601 26804/22344/19227 26803/22343/19226 18328/22725/19604
+f 18328/22725/19604 26803/22343/19226 31126/22346/19229 28174/22727/19606
+f 18322/22719/19598 18324/22726/19605 18329/22729/19608 18325/22730/19609
+f 18325/22730/19609 18329/22729/19608 26875/22731/19610 26876/22732/19611
+f 18324/22726/19605 28175/22728/19607 28176/22733/19612 18329/22729/19608
+f 18329/22729/19608 28176/22733/19612 31150/22734/19613 26875/22731/19610
+f 18322/22719/19598 18325/22730/19609 18330/22735/19614 18326/22720/19599
+f 18326/22720/19599 18330/22735/19614 28171/22736/19615 28172/22723/19602
+f 18325/22730/19609 26876/22732/19611 26877/22737/19616 18330/22735/19614
+f 18330/22735/19614 26877/22737/19616 31149/22738/19617 28171/22736/19615
+f 18331/22739/19618 18335/22740/19619 18336/22741/19620 18332/22742/19621
+f 18332/22742/19621 18336/22741/19620 26808/22366/19249 26807/22362/19245
+f 18335/22740/19619 28175/22728/19607 28174/22727/19606 18336/22741/19620
+f 18336/22741/19620 28174/22727/19606 31126/22346/19229 26808/22366/19249
+f 18331/22739/19618 18332/22742/19621 18337/22743/19622 18333/22744/19623
+f 18333/22744/19623 18337/22743/19622 28177/22745/19624 28178/22746/19625
+f 18332/22742/19621 26807/22362/19245 26806/22361/19244 18337/22743/19622
+f 18337/22743/19622 26806/22361/19244 31127/22364/19247 28177/22745/19624
+f 18331/22739/19618 18333/22744/19623 18338/22747/19626 18334/22748/19627
+f 18334/22748/19627 18338/22747/19626 26878/22749/19628 26879/22750/19629
+f 18333/22744/19623 28178/22746/19625 28179/22751/19630 18338/22747/19626
+f 18338/22747/19626 28179/22751/19630 31151/22752/19631 26878/22749/19628
+f 18331/22739/19618 18334/22748/19627 18339/22753/19632 18335/22740/19619
+f 18335/22740/19619 18339/22753/19632 28176/22733/19612 28175/22728/19607
+f 18334/22748/19627 26879/22750/19629 26880/22754/19633 18339/22753/19632
+f 18339/22753/19632 26880/22754/19633 31150/22734/19613 28176/22733/19612
+f 18340/22755/19634 18344/22756/19635 18345/22757/19636 18341/22758/19637
+f 18341/22758/19637 18345/22757/19636 26811/22382/19265 26810/22378/19261
+f 18344/22756/19635 28178/22746/19625 28177/22745/19624 18345/22757/19636
+f 18345/22757/19636 28177/22745/19624 31127/22364/19247 26811/22382/19265
+f 18340/22755/19634 18341/22758/19637 18346/22759/19638 18342/22760/19639
+f 18342/22760/19639 18346/22759/19638 28180/22761/19640 28181/22762/19641
+f 18341/22758/19637 26810/22378/19261 26809/22377/19260 18346/22759/19638
+f 18346/22759/19638 26809/22377/19260 31128/22380/19263 28180/22761/19640
+f 18340/22755/19634 18342/22760/19639 18347/22763/19642 18343/22764/19643
+f 18343/22764/19643 18347/22763/19642 26881/22765/19644 26882/22766/19645
+f 18342/22760/19639 28181/22762/19641 28182/22767/19646 18347/22763/19642
+f 18347/22763/19642 28182/22767/19646 31152/22768/19647 26881/22765/19644
+f 18340/22755/19634 18343/22764/19643 18348/22769/19648 18344/22756/19635
+f 18344/22756/19635 18348/22769/19648 28179/22751/19630 28178/22746/19625
+f 18343/22764/19643 26882/22766/19645 26883/22770/19649 18348/22769/19648
+f 18348/22769/19648 26883/22770/19649 31151/22752/19631 28179/22751/19630
+f 18349/22771/19650 18353/22772/19651 18354/22773/19652 18350/22774/19653
+f 18350/22774/19653 18354/22773/19652 26814/22398/19281 26813/22394/19277
+f 18353/22772/19651 28181/22762/19641 28180/22761/19640 18354/22773/19652
+f 18354/22773/19652 28180/22761/19640 31128/22380/19263 26814/22398/19281
+f 18349/22771/19650 18350/22774/19653 18355/22775/19654 18351/22776/19655
+f 18351/22776/19655 18355/22775/19654 28183/22777/19656 28184/22778/19657
+f 18350/22774/19653 26813/22394/19277 26812/22393/19276 18355/22775/19654
+f 18355/22775/19654 26812/22393/19276 31129/22396/19279 28183/22777/19656
+f 18349/22771/19650 18351/22776/19655 18356/22779/19658 18352/22780/19659
+f 18352/22780/19659 18356/22779/19658 26884/22781/19660 26885/22782/19661
+f 18351/22776/19655 28184/22778/19657 28185/22783/19662 18356/22779/19658
+f 18356/22779/19658 28185/22783/19662 31153/22784/19663 26884/22781/19660
+f 18349/22771/19650 18352/22780/19659 18357/22785/19664 18353/22772/19651
+f 18353/22772/19651 18357/22785/19664 28182/22767/19646 28181/22762/19641
+f 18352/22780/19659 26885/22782/19661 26886/22786/19665 18357/22785/19664
+f 18357/22785/19664 26886/22786/19665 31152/22768/19647 28182/22767/19646
+f 18358/22787/19666 18362/22788/19667 18363/22789/19668 18359/22790/19669
+f 18359/22790/19669 18363/22789/19668 26817/22414/19297 26816/22410/19293
+f 18362/22788/19667 28184/22778/19657 28183/22777/19656 18363/22789/19668
+f 18363/22789/19668 28183/22777/19656 31129/22396/19279 26817/22414/19297
+f 18358/22787/19666 18359/22790/19669 18364/22791/19670 18360/22792/19671
+f 18360/22792/19671 18364/22791/19670 28186/22793/19672 28187/22794/19673
+f 18359/22790/19669 26816/22410/19293 26815/22409/19292 18364/22791/19670
+f 18364/22791/19670 26815/22409/19292 31130/22412/19295 28186/22793/19672
+f 18358/22787/19666 18360/22792/19671 18365/22795/19674 18361/22796/19675
+f 18361/22796/19675 18365/22795/19674 26887/22797/19676 26888/22798/19677
+f 18360/22792/19671 28187/22794/19673 28188/22799/19678 18365/22795/19674
+f 18365/22795/19674 28188/22799/19678 31154/22800/19679 26887/22797/19676
+f 18358/22787/19666 18361/22796/19675 18366/22801/19680 18362/22788/19667
+f 18362/22788/19667 18366/22801/19680 28185/22783/19662 28184/22778/19657
+f 18361/22796/19675 26888/22798/19677 26889/22802/19681 18366/22801/19680
+f 18366/22801/19680 26889/22802/19681 31153/22784/19663 28185/22783/19662
+f 18367/22803/19682 18371/22804/19683 18372/22805/19684 18368/22806/19685
+f 18368/22806/19685 18372/22805/19684 26820/22430/19313 26819/22426/19309
+f 18371/22804/19683 28187/22794/19673 28186/22793/19672 18372/22805/19684
+f 18372/22805/19684 28186/22793/19672 31130/22412/19295 26820/22430/19313
+f 18367/22803/19682 18368/22806/19685 18373/22807/19686 18369/22808/19687
+f 18369/22808/19687 18373/22807/19686 28189/22809/19688 28190/22810/19689
+f 18368/22806/19685 26819/22426/19309 26818/22425/19308 18373/22807/19686
+f 18373/22807/19686 26818/22425/19308 31131/22428/19311 28189/22809/19688
+f 18367/22803/19682 18369/22808/19687 18374/22811/19690 18370/22812/19691
+f 18370/22812/19691 18374/22811/19690 26890/22813/19692 26891/22814/19693
+f 18369/22808/19687 28190/22810/19689 28191/22815/19694 18374/22811/19690
+f 18374/22811/19690 28191/22815/19694 31155/22816/19695 26890/22813/19692
+f 18367/22803/19682 18370/22812/19691 18375/22817/19696 18371/22804/19683
+f 18371/22804/19683 18375/22817/19696 28188/22799/19678 28187/22794/19673
+f 18370/22812/19691 26891/22814/19693 26892/22818/19697 18375/22817/19696
+f 18375/22817/19696 26892/22818/19697 31154/22800/19679 28188/22799/19678
+f 18376/22819/19698 18380/22820/19699 18381/22821/19700 18377/22822/19701
+f 18377/22822/19701 18381/22821/19700 26823/22446/19329 26822/22442/19325
+f 18380/22820/19699 28190/22810/19689 28189/22809/19688 18381/22821/19700
+f 18381/22821/19700 28189/22809/19688 31131/22428/19311 26823/22446/19329
+f 18376/22819/19698 18377/22822/19701 18382/22823/19702 18378/22824/19703
+f 18378/22824/19703 18382/22823/19702 28192/22825/19704 28193/22826/19705
+f 18377/22822/19701 26822/22442/19325 26821/22441/19324 18382/22823/19702
+f 18382/22823/19702 26821/22441/19324 31132/22444/19327 28192/22825/19704
+f 18376/22819/19698 18378/22824/19703 18383/22827/19706 18379/22828/19707
+f 18379/22828/19707 18383/22827/19706 26893/22829/19708 26894/22830/19709
+f 18378/22824/19703 28193/22826/19705 28194/22831/19710 18383/22827/19706
+f 18383/22827/19706 28194/22831/19710 31156/22832/19711 26893/22829/19708
+f 18376/22819/19698 18379/22828/19707 18384/22833/19712 18380/22820/19699
+f 18380/22820/19699 18384/22833/19712 28191/22815/19694 28190/22810/19689
+f 18379/22828/19707 26894/22830/19709 26895/22834/19713 18384/22833/19712
+f 18384/22833/19712 26895/22834/19713 31155/22816/19695 28191/22815/19694
+f 18385/22835/19714 18389/22836/19715 18390/22837/19716 18386/22838/19717
+f 18386/22838/19717 18390/22837/19716 26826/22462/19345 26825/22458/19341
+f 18389/22836/19715 28193/22826/19705 28192/22825/19704 18390/22837/19716
+f 18390/22837/19716 28192/22825/19704 31132/22444/19327 26826/22462/19345
+f 18385/22835/19714 18386/22838/19717 18391/22839/19718 18387/22840/19719
+f 18387/22840/19719 18391/22839/19718 28195/22841/19720 28196/22842/19721
+f 18386/22838/19717 26825/22458/19341 26824/22457/19340 18391/22839/19718
+f 18391/22839/19718 26824/22457/19340 31133/22460/19343 28195/22841/19720
+f 18385/22835/19714 18387/22840/19719 18392/22843/19722 18388/22844/19723
+f 18388/22844/19723 18392/22843/19722 26896/22845/19724 26897/22846/19725
+f 18387/22840/19719 28196/22842/19721 28197/22847/19726 18392/22843/19722
+f 18392/22843/19722 28197/22847/19726 31157/22848/19727 26896/22845/19724
+f 18385/22835/19714 18388/22844/19723 18393/22849/19728 18389/22836/19715
+f 18389/22836/19715 18393/22849/19728 28194/22831/19710 28193/22826/19705
+f 18388/22844/19723 26897/22846/19725 26898/22850/19729 18393/22849/19728
+f 18393/22849/19728 26898/22850/19729 31156/22832/19711 28194/22831/19710
+f 18394/22851/19730 18398/22852/19731 18399/22853/19732 18395/22854/19733
+f 18395/22854/19733 18399/22853/19732 26829/22478/19361 26828/22474/19357
+f 18398/22852/19731 28196/22842/19721 28195/22841/19720 18399/22853/19732
+f 18399/22853/19732 28195/22841/19720 31133/22460/19343 26829/22478/19361
+f 18394/22851/19730 18395/22854/19733 18400/22855/19734 18396/22856/19735
+f 18396/22856/19735 18400/22855/19734 28198/22857/19736 28199/22858/19737
+f 18395/22854/19733 26828/22474/19357 26827/22473/19356 18400/22855/19734
+f 18400/22855/19734 26827/22473/19356 31134/22476/19359 28198/22857/19736
+f 18394/22851/19730 18396/22856/19735 18401/22859/19738 18397/22860/19739
+f 18397/22860/19739 18401/22859/19738 26899/22861/19740 26900/22862/19741
+f 18396/22856/19735 28199/22858/19737 28200/22863/19742 18401/22859/19738
+f 18401/22859/19738 28200/22863/19742 31158/22864/19743 26899/22861/19740
+f 18394/22851/19730 18397/22860/19739 18402/22865/19744 18398/22852/19731
+f 18398/22852/19731 18402/22865/19744 28197/22847/19726 28196/22842/19721
+f 18397/22860/19739 26900/22862/19741 26901/22866/19745 18402/22865/19744
+f 18402/22865/19744 26901/22866/19745 31157/22848/19727 28197/22847/19726
+f 18403/22867/19746 18407/22868/19747 18408/22869/19748 18404/22870/19749
+f 18404/22870/19749 18408/22869/19748 26832/22494/19377 26831/22490/19373
+f 18407/22868/19747 28199/22858/19737 28198/22857/19736 18408/22869/19748
+f 18408/22869/19748 28198/22857/19736 31134/22476/19359 26832/22494/19377
+f 18403/22867/19746 18404/22870/19749 18409/22871/19750 18405/22872/19751
+f 18405/22872/19751 18409/22871/19750 28201/22873/19752 28202/22874/19753
+f 18404/22870/19749 26831/22490/19373 26830/22489/19372 18409/22871/19750
+f 18409/22871/19750 26830/22489/19372 31135/22492/19375 28201/22873/19752
+f 18403/22867/19746 18405/22872/19751 18410/22875/19754 18406/22876/19755
+f 18406/22876/19755 18410/22875/19754 26902/22877/19756 26903/22878/19757
+f 18405/22872/19751 28202/22874/19753 28203/22879/19758 18410/22875/19754
+f 18410/22875/19754 28203/22879/19758 31159/22880/19759 26902/22877/19756
+f 18403/22867/19746 18406/22876/19755 18411/22881/19760 18407/22868/19747
+f 18407/22868/19747 18411/22881/19760 28200/22863/19742 28199/22858/19737
+f 18406/22876/19755 26903/22878/19757 26904/22882/19761 18411/22881/19760
+f 18411/22881/19760 26904/22882/19761 31158/22864/19743 28200/22863/19742
+f 18412/22883/19762 18416/22884/19763 18417/22885/19764 18413/22886/19765
+f 18413/22886/19765 18417/22885/19764 26835/22510/19393 26834/22506/19389
+f 18416/22884/19763 28202/22874/19753 28201/22873/19752 18417/22885/19764
+f 18417/22885/19764 28201/22873/19752 31135/22492/19375 26835/22510/19393
+f 18412/22883/19762 18413/22886/19765 18418/22887/19766 18414/22888/19767
+f 18414/22888/19767 18418/22887/19766 28204/22889/19768 28205/22890/19769
+f 18413/22886/19765 26834/22506/19389 26833/22505/19388 18418/22887/19766
+f 18418/22887/19766 26833/22505/19388 31136/22508/19391 28204/22889/19768
+f 18412/22883/19762 18414/22888/19767 18419/22891/19770 18415/22892/19771
+f 18415/22892/19771 18419/22891/19770 26905/22893/19772 26906/22894/19773
+f 18414/22888/19767 28205/22890/19769 28206/22895/19774 18419/22891/19770
+f 18419/22891/19770 28206/22895/19774 31160/22896/19775 26905/22893/19772
+f 18412/22883/19762 18415/22892/19771 18420/22897/19776 18416/22884/19763
+f 18416/22884/19763 18420/22897/19776 28203/22879/19758 28202/22874/19753
+f 18415/22892/19771 26906/22894/19773 26907/22898/19777 18420/22897/19776
+f 18420/22897/19776 26907/22898/19777 31159/22880/19759 28203/22879/19758
+f 18421/22899/19778 18425/22900/19779 18426/22901/19780 18422/22902/19781
+f 18422/22902/19781 18426/22901/19780 26838/22526/19409 26837/22522/19405
+f 18425/22900/19779 28205/22890/19769 28204/22889/19768 18426/22901/19780
+f 18426/22901/19780 28204/22889/19768 31136/22508/19391 26838/22526/19409
+f 18421/22899/19778 18422/22902/19781 18427/22903/19782 18423/22904/19783
+f 18423/22904/19783 18427/22903/19782 28207/22905/19784 28208/22906/19785
+f 18422/22902/19781 26837/22522/19405 26836/22521/19404 18427/22903/19782
+f 18427/22903/19782 26836/22521/19404 31137/22524/19407 28207/22905/19784
+f 18421/22899/19778 18423/22904/19783 18428/22907/19786 18424/22908/19787
+f 18424/22908/19787 18428/22907/19786 26908/22909/19788 26909/22910/19789
+f 18423/22904/19783 28208/22906/19785 28209/22911/19790 18428/22907/19786
+f 18428/22907/19786 28209/22911/19790 31161/22912/19791 26908/22909/19788
+f 18421/22899/19778 18424/22908/19787 18429/22913/19792 18425/22900/19779
+f 18425/22900/19779 18429/22913/19792 28206/22895/19774 28205/22890/19769
+f 18424/22908/19787 26909/22910/19789 26910/22914/19793 18429/22913/19792
+f 18429/22913/19792 26910/22914/19793 31160/22896/19775 28206/22895/19774
+f 18430/22915/19794 18434/22916/19795 18435/22917/19796 18431/22918/19797
+f 18431/22918/19797 18435/22917/19796 26841/22542/19425 26840/22538/19421
+f 18434/22916/19795 28208/22906/19785 28207/22905/19784 18435/22917/19796
+f 18435/22917/19796 28207/22905/19784 31137/22524/19407 26841/22542/19425
+f 18430/22915/19794 18431/22918/19797 18436/22919/19798 18432/22920/19799
+f 18432/22920/19799 18436/22919/19798 28210/22921/19800 28211/22922/19801
+f 18431/22918/19797 26840/22538/19421 26839/22537/19420 18436/22919/19798
+f 18436/22919/19798 26839/22537/19420 31138/22540/19423 28210/22921/19800
+f 18430/22915/19794 18432/22920/19799 18437/22923/19802 18433/22924/19803
+f 18433/22924/19803 18437/22923/19802 26911/22925/19804 26912/22926/19805
+f 18432/22920/19799 28211/22922/19801 28212/22927/19806 18437/22923/19802
+f 18437/22923/19802 28212/22927/19806 31162/22928/19807 26911/22925/19804
+f 18430/22915/19794 18433/22924/19803 18438/22929/19808 18434/22916/19795
+f 18434/22916/19795 18438/22929/19808 28209/22911/19790 28208/22906/19785
+f 18433/22924/19803 26912/22926/19805 26913/22930/19809 18438/22929/19808
+f 18438/22929/19808 26913/22930/19809 31161/22912/19791 28209/22911/19790
+f 18439/22931/19810 18443/22932/19811 18444/22933/19812 18440/22934/19813
+f 18440/22934/19813 18444/22933/19812 26844/22558/19441 26843/22554/19437
+f 18443/22932/19811 28211/22922/19801 28210/22921/19800 18444/22933/19812
+f 18444/22933/19812 28210/22921/19800 31138/22540/19423 26844/22558/19441
+f 18439/22931/19810 18440/22934/19813 18445/22935/19814 18441/22936/19815
+f 18441/22936/19815 18445/22935/19814 28213/22937/19816 28214/22938/19817
+f 18440/22934/19813 26843/22554/19437 26842/22553/19436 18445/22935/19814
+f 18445/22935/19814 26842/22553/19436 31139/22556/19439 28213/22937/19816
+f 18439/22931/19810 18441/22936/19815 18446/22939/19818 18442/22940/19819
+f 18442/22940/19819 18446/22939/19818 26914/22941/19820 26915/22942/19821
+f 18441/22936/19815 28214/22938/19817 28215/22943/19822 18446/22939/19818
+f 18446/22939/19818 28215/22943/19822 31163/22944/19823 26914/22941/19820
+f 18439/22931/19810 18442/22940/19819 18447/22945/19824 18443/22932/19811
+f 18443/22932/19811 18447/22945/19824 28212/22927/19806 28211/22922/19801
+f 18442/22940/19819 26915/22942/19821 26916/22946/19825 18447/22945/19824
+f 18447/22945/19824 26916/22946/19825 31162/22928/19807 28212/22927/19806
+f 18448/22947/19826 18452/22948/19827 18453/22949/19828 18449/22950/19829
+f 18449/22950/19829 18453/22949/19828 26847/22574/19457 26846/22570/19453
+f 18452/22948/19827 28214/22938/19817 28213/22937/19816 18453/22949/19828
+f 18453/22949/19828 28213/22937/19816 31139/22556/19439 26847/22574/19457
+f 18448/22947/19826 18449/22950/19829 18454/22951/19830 18450/22952/19831
+f 18450/22952/19831 18454/22951/19830 28216/22953/19832 28217/22954/19833
+f 18449/22950/19829 26846/22570/19453 26845/22569/19452 18454/22951/19830
+f 18454/22951/19830 26845/22569/19452 31140/22572/19455 28216/22953/19832
+f 18448/22947/19826 18450/22952/19831 18455/22955/19834 18451/22956/19835
+f 18451/22956/19835 18455/22955/19834 26917/22957/19836 26918/22958/19837
+f 18450/22952/19831 28217/22954/19833 28218/22959/19838 18455/22955/19834
+f 18455/22955/19834 28218/22959/19838 31164/22960/19839 26917/22957/19836
+f 18448/22947/19826 18451/22956/19835 18456/22961/19840 18452/22948/19827
+f 18452/22948/19827 18456/22961/19840 28215/22943/19822 28214/22938/19817
+f 18451/22956/19835 26918/22958/19837 26919/22962/19841 18456/22961/19840
+f 18456/22961/19840 26919/22962/19841 31163/22944/19823 28215/22943/19822
+f 18457/22963/19842 18461/22964/19843 18462/22965/19844 18458/22966/19845
+f 18458/22966/19845 18462/22965/19844 26850/22590/19473 26849/22586/19469
+f 18461/22964/19843 28217/22954/19833 28216/22953/19832 18462/22965/19844
+f 18462/22965/19844 28216/22953/19832 31140/22572/19455 26850/22590/19473
+f 18457/22963/19842 18458/22966/19845 18463/22967/19846 18459/22968/19847
+f 18459/22968/19847 18463/22967/19846 28219/22969/19848 28220/22970/19849
+f 18458/22966/19845 26849/22586/19469 26848/22585/19468 18463/22967/19846
+f 18463/22967/19846 26848/22585/19468 31141/22588/19471 28219/22969/19848
+f 18457/22963/19842 18459/22968/19847 18464/22971/19850 18460/22972/19851
+f 18460/22972/19851 18464/22971/19850 26920/22973/19852 26921/22974/19853
+f 18459/22968/19847 28220/22970/19849 28221/22975/19854 18464/22971/19850
+f 18464/22971/19850 28221/22975/19854 31165/22976/19855 26920/22973/19852
+f 18457/22963/19842 18460/22972/19851 18465/22977/19856 18461/22964/19843
+f 18461/22964/19843 18465/22977/19856 28218/22959/19838 28217/22954/19833
+f 18460/22972/19851 26921/22974/19853 26922/22978/19857 18465/22977/19856
+f 18465/22977/19856 26922/22978/19857 31164/22960/19839 28218/22959/19838
+f 18466/22979/19858 18470/22980/19859 18471/22981/19860 18467/22982/19861
+f 18467/22982/19861 18471/22981/19860 26853/22606/19489 26852/22602/19485
+f 18470/22980/19859 28220/22970/19849 28219/22969/19848 18471/22981/19860
+f 18471/22981/19860 28219/22969/19848 31141/22588/19471 26853/22606/19489
+f 18466/22979/19858 18467/22982/19861 18472/22983/19862 18468/22984/19863
+f 18468/22984/19863 18472/22983/19862 28222/22985/19864 28223/22986/19865
+f 18467/22982/19861 26852/22602/19485 26851/22601/19484 18472/22983/19862
+f 18472/22983/19862 26851/22601/19484 31142/22604/19487 28222/22985/19864
+f 18466/22979/19858 18468/22984/19863 18473/22987/19866 18469/22988/19867
+f 18469/22988/19867 18473/22987/19866 26923/22989/19868 26924/22990/19869
+f 18468/22984/19863 28223/22986/19865 28224/22991/19870 18473/22987/19866
+f 18473/22987/19866 28224/22991/19870 31166/22992/19871 26923/22989/19868
+f 18466/22979/19858 18469/22988/19867 18474/22993/19872 18470/22980/19859
+f 18470/22980/19859 18474/22993/19872 28221/22975/19854 28220/22970/19849
+f 18469/22988/19867 26924/22990/19869 26925/22994/19873 18474/22993/19872
+f 18474/22993/19872 26925/22994/19873 31165/22976/19855 28221/22975/19854
+f 18475/22995/19874 18479/22996/19875 18480/22997/19876 18476/22998/19877
+f 18476/22998/19877 18480/22997/19876 26856/22625/19505 26855/22620/19501
+f 18479/22996/19875 28223/22999/19865 28222/23000/19864 18480/22997/19876
+f 18480/22997/19876 28222/23000/19864 31142/22626/19487 26856/22625/19505
+f 18475/22995/19874 18476/22998/19877 18481/23001/19878 18477/23002/19879
+f 18477/23002/19879 18481/23001/19878 28225/23003/19880 28226/23004/19881
+f 18476/22998/19877 26855/22620/19501 26854/22619/19500 18481/23001/19878
+f 18481/23001/19878 26854/22619/19500 31143/22622/19503 28225/23003/19880
+f 18475/22995/19874 18477/23002/19879 18482/23005/19882 18478/23006/19883
+f 18478/23006/19883 18482/23005/19882 26926/23007/19884 26927/23008/19885
+f 18477/23002/19879 28226/23004/19881 28227/23009/19886 18482/23005/19882
+f 18482/23005/19882 28227/23009/19886 31167/23010/19887 26926/23007/19884
+f 18475/22995/19874 18478/23006/19883 18483/23011/19888 18479/22996/19875
+f 18479/22996/19875 18483/23011/19888 28224/23012/19870 28223/22999/19865
+f 18478/23006/19883 26927/23008/19885 26928/23013/19889 18483/23011/19888
+f 18483/23011/19888 26928/23013/19889 31166/23014/19871 28224/23012/19870
+f 18484/23015/19890 18488/23016/19891 18489/23017/19892 18485/23018/19893
+f 18485/23018/19893 18489/23017/19892 26859/22642/19521 26858/22638/19517
+f 18488/23016/19891 28226/23004/19881 28225/23003/19880 18489/23017/19892
+f 18489/23017/19892 28225/23003/19880 31143/22622/19503 26859/22642/19521
+f 18484/23015/19890 18485/23018/19893 18490/23019/19894 18486/23020/19895
+f 18486/23020/19895 18490/23019/19894 28228/23021/19896 28229/23022/19897
+f 18485/23018/19893 26858/22638/19517 26857/22637/19516 18490/23019/19894
+f 18490/23019/19894 26857/22637/19516 31144/22640/19519 28228/23021/19896
+f 18484/23015/19890 18486/23020/19895 18491/23023/19898 18487/23024/19899
+f 18487/23024/19899 18491/23023/19898 26929/23025/19900 26930/23026/19901
+f 18486/23020/19895 28229/23022/19897 28230/23027/19902 18491/23023/19898
+f 18491/23023/19898 28230/23027/19902 31168/23028/19903 26929/23025/19900
+f 18484/23015/19890 18487/23024/19899 18492/23029/19904 18488/23016/19891
+f 18488/23016/19891 18492/23029/19904 28227/23009/19886 28226/23004/19881
+f 18487/23024/19899 26930/23026/19901 26931/23030/19905 18492/23029/19904
+f 18492/23029/19904 26931/23030/19905 31167/23010/19887 28227/23009/19886
+f 18493/23031/19906 18497/23032/19907 18498/23033/19908 18494/23034/19909
+f 18494/23034/19909 18498/23033/19908 26862/22658/19537 26861/22654/19533
+f 18497/23032/19907 28229/23022/19897 28228/23021/19896 18498/23033/19908
+f 18498/23033/19908 28228/23021/19896 31144/22640/19519 26862/22658/19537
+f 18493/23031/19906 18494/23034/19909 18499/23035/19910 18495/23036/19911
+f 18495/23036/19911 18499/23035/19910 28231/23037/19912 28232/23038/19913
+f 18494/23034/19909 26861/22654/19533 26860/22653/19532 18499/23035/19910
+f 18499/23035/19910 26860/22653/19532 31145/22656/19535 28231/23037/19912
+f 18493/23031/19906 18495/23036/19911 18500/23039/19914 18496/23040/19915
+f 18496/23040/19915 18500/23039/19914 26932/23041/19916 26933/23042/19917
+f 18495/23036/19911 28232/23038/19913 28233/23043/19918 18500/23039/19914
+f 18500/23039/19914 28233/23043/19918 31169/23044/19919 26932/23041/19916
+f 18493/23031/19906 18496/23040/19915 18501/23045/19920 18497/23032/19907
+f 18497/23032/19907 18501/23045/19920 28230/23027/19902 28229/23022/19897
+f 18496/23040/19915 26933/23042/19917 26934/23046/19921 18501/23045/19920
+f 18501/23045/19920 26934/23046/19921 31168/23028/19903 28230/23027/19902
+f 18502/23047/19922 18506/23048/19923 18507/23049/19924 18503/23050/19925
+f 18503/23050/19925 18507/23049/19924 26865/22674/19553 26864/22670/19549
+f 18506/23048/19923 28232/23038/19913 28231/23037/19912 18507/23049/19924
+f 18507/23049/19924 28231/23037/19912 31145/22656/19535 26865/22674/19553
+f 18502/23047/19922 18503/23050/19925 18508/23051/19926 18504/23052/19927
+f 18504/23052/19927 18508/23051/19926 28234/23053/19928 28235/23054/19929
+f 18503/23050/19925 26864/22670/19549 26863/22669/19548 18508/23051/19926
+f 18508/23051/19926 26863/22669/19548 31146/22672/19551 28234/23053/19928
+f 18502/23047/19922 18504/23052/19927 18509/23055/19930 18505/23056/19931
+f 18505/23056/19931 18509/23055/19930 26935/23057/19932 26936/23058/19933
+f 18504/23052/19927 28235/23054/19929 28236/23059/19934 18509/23055/19930
+f 18509/23055/19930 28236/23059/19934 31170/23060/19935 26935/23057/19932
+f 18502/23047/19922 18505/23056/19931 18510/23061/19936 18506/23048/19923
+f 18506/23048/19923 18510/23061/19936 28233/23043/19918 28232/23038/19913
+f 18505/23056/19931 26936/23058/19933 26937/23062/19937 18510/23061/19936
+f 18510/23061/19936 26937/23062/19937 31169/23044/19919 28233/23043/19918
+f 18511/23063/19938 18515/23064/19939 18516/23065/19940 18512/23066/19941
+f 18512/23066/19941 18516/23065/19940 26868/22690/19569 26867/22686/19565
+f 18515/23064/19939 28235/23054/19929 28234/23053/19928 18516/23065/19940
+f 18516/23065/19940 28234/23053/19928 31146/22672/19551 26868/22690/19569
+f 18511/23063/19938 18512/23066/19941 18517/23067/19942 18513/23068/19943
+f 18513/23068/19943 18517/23067/19942 28237/23069/19944 28238/23070/19945
+f 18512/23066/19941 26867/22686/19565 26866/22685/19564 18517/23067/19942
+f 18517/23067/19942 26866/22685/19564 31147/22688/19567 28237/23069/19944
+f 18511/23063/19938 18513/23068/19943 18518/23071/19946 18514/23072/19947
+f 18514/23072/19947 18518/23071/19946 26938/23073/19948 26939/23074/19949
+f 18513/23068/19943 28238/23070/19945 28239/23075/19950 18518/23071/19946
+f 18518/23071/19946 28239/23075/19950 31171/23076/19951 26938/23073/19948
+f 18511/23063/19938 18514/23072/19947 18519/23077/19952 18515/23064/19939
+f 18515/23064/19939 18519/23077/19952 28236/23059/19934 28235/23054/19929
+f 18514/23072/19947 26939/23074/19949 26940/23078/19953 18519/23077/19952
+f 18519/23077/19952 26940/23078/19953 31170/23060/19935 28236/23059/19934
+f 18520/23079/19954 18524/23080/19955 18525/23081/19956 18521/23082/19957
+f 18521/23082/19957 18525/23081/19956 26871/22706/19585 26870/22702/19581
+f 18524/23080/19955 28238/23070/19945 28237/23069/19944 18525/23081/19956
+f 18525/23081/19956 28237/23069/19944 31147/22688/19567 26871/22706/19585
+f 18520/23079/19954 18521/23082/19957 18526/23083/19958 18522/23084/19959
+f 18522/23084/19959 18526/23083/19958 28240/23085/19960 28241/23086/19961
+f 18521/23082/19957 26870/22702/19581 26869/22701/19580 18526/23083/19958
+f 18526/23083/19958 26869/22701/19580 31148/22704/19583 28240/23085/19960
+f 18520/23079/19954 18522/23084/19959 18527/23087/19962 18523/23088/19963
+f 18523/23088/19963 18527/23087/19962 26941/23089/19964 26942/23090/19965
+f 18522/23084/19959 28241/23086/19961 28242/23091/19966 18527/23087/19962
+f 18527/23087/19962 28242/23091/19966 31172/23092/19967 26941/23089/19964
+f 18520/23079/19954 18523/23088/19963 18528/23093/19968 18524/23080/19955
+f 18524/23080/19955 18528/23093/19968 28239/23075/19950 28238/23070/19945
+f 18523/23088/19963 26942/23090/19965 26943/23094/19969 18528/23093/19968
+f 18528/23093/19968 26943/23094/19969 31171/23076/19951 28239/23075/19950
+f 18529/23095/19970 18533/23096/19971 18534/23097/19972 18530/23098/19973
+f 18530/23098/19973 18534/23097/19972 26874/22718/19597 26873/22716/19595
+f 18533/23096/19971 28241/23086/19961 28240/23085/19960 18534/23097/19972
+f 18534/23097/19972 28240/23085/19960 31148/22704/19583 26874/22718/19597
+f 18529/23095/19970 18530/23098/19973 18535/23099/19974 18531/23100/19975
+f 18531/23100/19975 18535/23099/19974 28173/22724/19603 28172/22723/19602
+f 18530/23098/19973 26873/22716/19595 26872/22715/19594 18535/23099/19974
+f 18535/23099/19974 26872/22715/19594 31125/22350/19233 28173/22724/19603
+f 18529/23095/19970 18531/23100/19975 18536/23101/19976 18532/23102/19977
+f 18532/23102/19977 18536/23101/19976 26944/23103/19978 26945/23104/19979
+f 18531/23100/19975 28172/22723/19602 28171/22736/19615 18536/23101/19976
+f 18536/23101/19976 28171/22736/19615 31149/22738/19617 26944/23103/19978
+f 18529/23095/19970 18532/23102/19977 18537/23105/19980 18533/23096/19971
+f 18533/23096/19971 18537/23105/19980 28242/23091/19966 28241/23086/19961
+f 18532/23102/19977 26945/23104/19979 26946/23106/19981 18537/23105/19980
+f 18537/23105/19980 26946/23106/19981 31172/23092/19967 28242/23091/19966
+f 18538/23107/19982 18542/23108/19983 18543/23109/19984 18539/23110/19985
+f 18539/23110/19985 18543/23109/19984 26877/22737/19616 26876/22732/19611
+f 18542/23108/19983 28244/23111/19986 28245/23112/19987 18543/23109/19984
+f 18543/23109/19984 28245/23112/19987 31149/22738/19617 26877/22737/19616
+f 18538/23107/19982 18539/23110/19985 18544/23113/19988 18540/23114/19989
+f 18540/23114/19989 18544/23113/19988 28246/23115/19990 28247/23116/19991
+f 18539/23110/19985 26876/22732/19611 26875/22731/19610 18544/23113/19988
+f 18544/23113/19988 26875/22731/19610 31150/22734/19613 28246/23115/19990
+f 18538/23107/19982 18540/23114/19989 18545/23117/19992 18541/23118/19993
+f 18541/23118/19993 18545/23117/19992 26947/23119/19994 26948/23120/19995
+f 18540/23114/19989 28247/23116/19991 28248/23121/19996 18545/23117/19992
+f 18545/23117/19992 28248/23121/19996 31174/23122/19997 26947/23119/19994
+f 18538/23107/19982 18541/23118/19993 18546/23123/19998 18542/23108/19983
+f 18542/23108/19983 18546/23123/19998 28243/23124/19999 28244/23111/19986
+f 18541/23118/19993 26948/23120/19995 26949/23125/20000 18546/23123/19998
+f 18546/23123/19998 26949/23125/20000 31173/23126/20001 28243/23124/19999
+f 18547/23127/20002 18551/23128/20003 18552/23129/20004 18548/23130/20005
+f 18548/23130/20005 18552/23129/20004 26880/22754/19633 26879/22750/19629
+f 18551/23128/20003 28247/23116/19991 28246/23115/19990 18552/23129/20004
+f 18552/23129/20004 28246/23115/19990 31150/22734/19613 26880/22754/19633
+f 18547/23127/20002 18548/23130/20005 18553/23131/20006 18549/23132/20007
+f 18549/23132/20007 18553/23131/20006 28249/23133/20008 28250/23134/20009
+f 18548/23130/20005 26879/22750/19629 26878/22749/19628 18553/23131/20006
+f 18553/23131/20006 26878/22749/19628 31151/22752/19631 28249/23133/20008
+f 18547/23127/20002 18549/23132/20007 18554/23135/20010 18550/23136/20011
+f 18550/23136/20011 18554/23135/20010 26950/23137/20012 26951/23138/20013
+f 18549/23132/20007 28250/23134/20009 28251/23139/20014 18554/23135/20010
+f 18554/23135/20010 28251/23139/20014 31175/23140/20015 26950/23137/20012
+f 18547/23127/20002 18550/23136/20011 18555/23141/20016 18551/23128/20003
+f 18551/23128/20003 18555/23141/20016 28248/23121/19996 28247/23116/19991
+f 18550/23136/20011 26951/23138/20013 26952/23142/20017 18555/23141/20016
+f 18555/23141/20016 26952/23142/20017 31174/23122/19997 28248/23121/19996
+f 18556/23143/20018 18560/23144/20019 18561/23145/20020 18557/23146/20021
+f 18557/23146/20021 18561/23145/20020 26883/22770/19649 26882/22766/19645
+f 18560/23144/20019 28250/23134/20009 28249/23133/20008 18561/23145/20020
+f 18561/23145/20020 28249/23133/20008 31151/22752/19631 26883/22770/19649
+f 18556/23143/20018 18557/23146/20021 18562/23147/20022 18558/23148/20023
+f 18558/23148/20023 18562/23147/20022 28252/23149/20024 28253/23150/20025
+f 18557/23146/20021 26882/22766/19645 26881/22765/19644 18562/23147/20022
+f 18562/23147/20022 26881/22765/19644 31152/22768/19647 28252/23149/20024
+f 18556/23143/20018 18558/23148/20023 18563/23151/20026 18559/23152/20027
+f 18559/23152/20027 18563/23151/20026 26953/23153/20028 26954/23154/20029
+f 18558/23148/20023 28253/23150/20025 28254/23155/20030 18563/23151/20026
+f 18563/23151/20026 28254/23155/20030 31176/23156/20031 26953/23153/20028
+f 18556/23143/20018 18559/23152/20027 18564/23157/20032 18560/23144/20019
+f 18560/23144/20019 18564/23157/20032 28251/23139/20014 28250/23134/20009
+f 18559/23152/20027 26954/23154/20029 26955/23158/20033 18564/23157/20032
+f 18564/23157/20032 26955/23158/20033 31175/23140/20015 28251/23139/20014
+f 18565/23159/20034 18569/23160/20035 18570/23161/20036 18566/23162/20037
+f 18566/23162/20037 18570/23161/20036 26886/22786/19665 26885/22782/19661
+f 18569/23160/20035 28253/23150/20025 28252/23149/20024 18570/23161/20036
+f 18570/23161/20036 28252/23149/20024 31152/22768/19647 26886/22786/19665
+f 18565/23159/20034 18566/23162/20037 18571/23163/20038 18567/23164/20039
+f 18567/23164/20039 18571/23163/20038 28255/23165/20040 28256/23166/20041
+f 18566/23162/20037 26885/22782/19661 26884/22781/19660 18571/23163/20038
+f 18571/23163/20038 26884/22781/19660 31153/22784/19663 28255/23165/20040
+f 18565/23159/20034 18567/23164/20039 18572/23167/20042 18568/23168/20043
+f 18568/23168/20043 18572/23167/20042 26956/23169/20044 26957/23170/20045
+f 18567/23164/20039 28256/23166/20041 28257/23171/20046 18572/23167/20042
+f 18572/23167/20042 28257/23171/20046 31177/23172/20047 26956/23169/20044
+f 18565/23159/20034 18568/23168/20043 18573/23173/20048 18569/23160/20035
+f 18569/23160/20035 18573/23173/20048 28254/23155/20030 28253/23150/20025
+f 18568/23168/20043 26957/23170/20045 26958/23174/20049 18573/23173/20048
+f 18573/23173/20048 26958/23174/20049 31176/23156/20031 28254/23155/20030
+f 18574/23175/20050 18578/23176/20051 18579/23177/20052 18575/23178/20053
+f 18575/23178/20053 18579/23177/20052 26889/22802/19681 26888/22798/19677
+f 18578/23176/20051 28256/23166/20041 28255/23165/20040 18579/23177/20052
+f 18579/23177/20052 28255/23165/20040 31153/22784/19663 26889/22802/19681
+f 18574/23175/20050 18575/23178/20053 18580/23179/20054 18576/23180/20055
+f 18576/23180/20055 18580/23179/20054 28258/23181/20056 28259/23182/20057
+f 18575/23178/20053 26888/22798/19677 26887/22797/19676 18580/23179/20054
+f 18580/23179/20054 26887/22797/19676 31154/22800/19679 28258/23181/20056
+f 18574/23175/20050 18576/23180/20055 18581/23183/20058 18577/23184/20059
+f 18577/23184/20059 18581/23183/20058 26959/23185/20060 26960/23186/20061
+f 18576/23180/20055 28259/23182/20057 28260/23187/20062 18581/23183/20058
+f 18581/23183/20058 28260/23187/20062 31178/23188/20063 26959/23185/20060
+f 18574/23175/20050 18577/23184/20059 18582/23189/20064 18578/23176/20051
+f 18578/23176/20051 18582/23189/20064 28257/23171/20046 28256/23166/20041
+f 18577/23184/20059 26960/23186/20061 26961/23190/20065 18582/23189/20064
+f 18582/23189/20064 26961/23190/20065 31177/23172/20047 28257/23171/20046
+f 18583/23191/20066 18587/23192/20067 18588/23193/20068 18584/23194/20069
+f 18584/23194/20069 18588/23193/20068 26892/22818/19697 26891/22814/19693
+f 18587/23192/20067 28259/23182/20057 28258/23181/20056 18588/23193/20068
+f 18588/23193/20068 28258/23181/20056 31154/22800/19679 26892/22818/19697
+f 18583/23191/20066 18584/23194/20069 18589/23195/20070 18585/23196/20071
+f 18585/23196/20071 18589/23195/20070 28261/23197/20072 28262/23198/20073
+f 18584/23194/20069 26891/22814/19693 26890/22813/19692 18589/23195/20070
+f 18589/23195/20070 26890/22813/19692 31155/22816/19695 28261/23197/20072
+f 18583/23191/20066 18585/23196/20071 18590/23199/20074 18586/23200/20075
+f 18586/23200/20075 18590/23199/20074 26962/23201/20076 26963/23202/20077
+f 18585/23196/20071 28262/23198/20073 28263/23203/20078 18590/23199/20074
+f 18590/23199/20074 28263/23203/20078 31179/23204/20079 26962/23201/20076
+f 18583/23191/20066 18586/23200/20075 18591/23205/20080 18587/23192/20067
+f 18587/23192/20067 18591/23205/20080 28260/23187/20062 28259/23182/20057
+f 18586/23200/20075 26963/23202/20077 26964/23206/20081 18591/23205/20080
+f 18591/23205/20080 26964/23206/20081 31178/23188/20063 28260/23187/20062
+f 18592/23207/20082 18596/23208/20083 18597/23209/20084 18593/23210/20085
+f 18593/23210/20085 18597/23209/20084 26895/22834/19713 26894/22830/19709
+f 18596/23208/20083 28262/23198/20073 28261/23197/20072 18597/23209/20084
+f 18597/23209/20084 28261/23197/20072 31155/22816/19695 26895/22834/19713
+f 18592/23207/20082 18593/23210/20085 18598/23211/20086 18594/23212/20087
+f 18594/23212/20087 18598/23211/20086 28264/23213/20088 28265/23214/20089
+f 18593/23210/20085 26894/22830/19709 26893/22829/19708 18598/23211/20086
+f 18598/23211/20086 26893/22829/19708 31156/22832/19711 28264/23213/20088
+f 18592/23207/20082 18594/23212/20087 18599/23215/20090 18595/23216/20091
+f 18595/23216/20091 18599/23215/20090 26965/23217/20092 26966/23218/20093
+f 18594/23212/20087 28265/23214/20089 28266/23219/20094 18599/23215/20090
+f 18599/23215/20090 28266/23219/20094 31180/23220/20095 26965/23217/20092
+f 18592/23207/20082 18595/23216/20091 18600/23221/20096 18596/23208/20083
+f 18596/23208/20083 18600/23221/20096 28263/23203/20078 28262/23198/20073
+f 18595/23216/20091 26966/23218/20093 26967/23222/20097 18600/23221/20096
+f 18600/23221/20096 26967/23222/20097 31179/23204/20079 28263/23203/20078
+f 18601/23223/20098 18605/23224/20099 18606/23225/20100 18602/23226/20101
+f 18602/23226/20101 18606/23225/20100 26898/22850/19729 26897/22846/19725
+f 18605/23224/20099 28265/23214/20089 28264/23213/20088 18606/23225/20100
+f 18606/23225/20100 28264/23213/20088 31156/22832/19711 26898/22850/19729
+f 18601/23223/20098 18602/23226/20101 18607/23227/20102 18603/23228/20103
+f 18603/23228/20103 18607/23227/20102 28267/23229/20104 28268/23230/20105
+f 18602/23226/20101 26897/22846/19725 26896/22845/19724 18607/23227/20102
+f 18607/23227/20102 26896/22845/19724 31157/22848/19727 28267/23229/20104
+f 18601/23223/20098 18603/23228/20103 18608/23231/20106 18604/23232/20107
+f 18604/23232/20107 18608/23231/20106 26968/23233/20108 26969/23234/20109
+f 18603/23228/20103 28268/23230/20105 28269/23235/20110 18608/23231/20106
+f 18608/23231/20106 28269/23235/20110 31181/23236/20111 26968/23233/20108
+f 18601/23223/20098 18604/23232/20107 18609/23237/20112 18605/23224/20099
+f 18605/23224/20099 18609/23237/20112 28266/23219/20094 28265/23214/20089
+f 18604/23232/20107 26969/23234/20109 26970/23238/20113 18609/23237/20112
+f 18609/23237/20112 26970/23238/20113 31180/23220/20095 28266/23219/20094
+f 18610/23239/20114 18614/23240/20115 18615/23241/20116 18611/23242/20117
+f 18611/23242/20117 18615/23241/20116 26901/22866/19745 26900/22862/19741
+f 18614/23240/20115 28268/23230/20105 28267/23229/20104 18615/23241/20116
+f 18615/23241/20116 28267/23229/20104 31157/22848/19727 26901/22866/19745
+f 18610/23239/20114 18611/23242/20117 18616/23243/20118 18612/23244/20119
+f 18612/23244/20119 18616/23243/20118 28270/23245/20120 28271/23246/20121
+f 18611/23242/20117 26900/22862/19741 26899/22861/19740 18616/23243/20118
+f 18616/23243/20118 26899/22861/19740 31158/22864/19743 28270/23245/20120
+f 18610/23239/20114 18612/23244/20119 18617/23247/20122 18613/23248/20123
+f 18613/23248/20123 18617/23247/20122 26971/23249/20124 26972/23250/20125
+f 18612/23244/20119 28271/23246/20121 28272/23251/20126 18617/23247/20122
+f 18617/23247/20122 28272/23251/20126 31182/23252/20127 26971/23249/20124
+f 18610/23239/20114 18613/23248/20123 18618/23253/20128 18614/23240/20115
+f 18614/23240/20115 18618/23253/20128 28269/23235/20110 28268/23230/20105
+f 18613/23248/20123 26972/23250/20125 26973/23254/20129 18618/23253/20128
+f 18618/23253/20128 26973/23254/20129 31181/23236/20111 28269/23235/20110
+f 18619/23255/20130 18623/23256/20131 18624/23257/20132 18620/23258/20133
+f 18620/23258/20133 18624/23257/20132 26904/22882/19761 26903/22878/19757
+f 18623/23256/20131 28271/23246/20121 28270/23245/20120 18624/23257/20132
+f 18624/23257/20132 28270/23245/20120 31158/22864/19743 26904/22882/19761
+f 18619/23255/20130 18620/23258/20133 18625/23259/20134 18621/23260/20135
+f 18621/23260/20135 18625/23259/20134 28273/23261/20136 28274/23262/20137
+f 18620/23258/20133 26903/22878/19757 26902/22877/19756 18625/23259/20134
+f 18625/23259/20134 26902/22877/19756 31159/22880/19759 28273/23261/20136
+f 18619/23255/20130 18621/23260/20135 18626/23263/20138 18622/23264/20139
+f 18622/23264/20139 18626/23263/20138 26974/23265/20140 26975/23266/20141
+f 18621/23260/20135 28274/23262/20137 28275/23267/20142 18626/23263/20138
+f 18626/23263/20138 28275/23267/20142 31183/23268/20143 26974/23265/20140
+f 18619/23255/20130 18622/23264/20139 18627/23269/20144 18623/23256/20131
+f 18623/23256/20131 18627/23269/20144 28272/23251/20126 28271/23246/20121
+f 18622/23264/20139 26975/23266/20141 26976/23270/20145 18627/23269/20144
+f 18627/23269/20144 26976/23270/20145 31182/23252/20127 28272/23251/20126
+f 18628/23271/20146 18632/23272/20147 18633/23273/20148 18629/23274/20149
+f 18629/23274/20149 18633/23273/20148 26907/22898/19777 26906/22894/19773
+f 18632/23272/20147 28274/23262/20137 28273/23261/20136 18633/23273/20148
+f 18633/23273/20148 28273/23261/20136 31159/22880/19759 26907/22898/19777
+f 18628/23271/20146 18629/23274/20149 18634/23275/20150 18630/23276/20151
+f 18630/23276/20151 18634/23275/20150 28276/23277/20152 28277/23278/20153
+f 18629/23274/20149 26906/22894/19773 26905/22893/19772 18634/23275/20150
+f 18634/23275/20150 26905/22893/19772 31160/22896/19775 28276/23277/20152
+f 18628/23271/20146 18630/23276/20151 18635/23279/20154 18631/23280/20155
+f 18631/23280/20155 18635/23279/20154 26977/23281/20156 26978/23282/20157
+f 18630/23276/20151 28277/23278/20153 28278/23283/20158 18635/23279/20154
+f 18635/23279/20154 28278/23283/20158 31184/23284/20159 26977/23281/20156
+f 18628/23271/20146 18631/23280/20155 18636/23285/20160 18632/23272/20147
+f 18632/23272/20147 18636/23285/20160 28275/23267/20142 28274/23262/20137
+f 18631/23280/20155 26978/23282/20157 26979/23286/20161 18636/23285/20160
+f 18636/23285/20160 26979/23286/20161 31183/23268/20143 28275/23267/20142
+f 18637/23287/20162 18641/23288/20163 18642/23289/20164 18638/23290/20165
+f 18638/23290/20165 18642/23289/20164 26910/22914/19793 26909/22910/19789
+f 18641/23288/20163 28277/23278/20153 28276/23277/20152 18642/23289/20164
+f 18642/23289/20164 28276/23277/20152 31160/22896/19775 26910/22914/19793
+f 18637/23287/20162 18638/23290/20165 18643/23291/20166 18639/23292/20167
+f 18639/23292/20167 18643/23291/20166 28279/23293/20168 28280/23294/20169
+f 18638/23290/20165 26909/22910/19789 26908/22909/19788 18643/23291/20166
+f 18643/23291/20166 26908/22909/19788 31161/22912/19791 28279/23293/20168
+f 18637/23287/20162 18639/23292/20167 18644/23295/20170 18640/23296/20171
+f 18640/23296/20171 18644/23295/20170 26980/23297/20172 26981/23298/20173
+f 18639/23292/20167 28280/23294/20169 28281/23299/20174 18644/23295/20170
+f 18644/23295/20170 28281/23299/20174 31185/23300/20175 26980/23297/20172
+f 18637/23287/20162 18640/23296/20171 18645/23301/20176 18641/23288/20163
+f 18641/23288/20163 18645/23301/20176 28278/23283/20158 28277/23278/20153
+f 18640/23296/20171 26981/23298/20173 26982/23302/20177 18645/23301/20176
+f 18645/23301/20176 26982/23302/20177 31184/23284/20159 28278/23283/20158
+f 18646/23303/20178 18650/23304/20179 18651/23305/20180 18647/23306/20181
+f 18647/23306/20181 18651/23305/20180 26913/22930/19809 26912/22926/19805
+f 18650/23304/20179 28280/23294/20169 28279/23293/20168 18651/23305/20180
+f 18651/23305/20180 28279/23293/20168 31161/22912/19791 26913/22930/19809
+f 18646/23303/20178 18647/23306/20181 18652/23307/20182 18648/23308/20183
+f 18648/23308/20183 18652/23307/20182 28282/23309/20184 28283/23310/20185
+f 18647/23306/20181 26912/22926/19805 26911/22925/19804 18652/23307/20182
+f 18652/23307/20182 26911/22925/19804 31162/22928/19807 28282/23309/20184
+f 18646/23303/20178 18648/23308/20183 18653/23311/20186 18649/23312/20187
+f 18649/23312/20187 18653/23311/20186 26983/23313/20188 26984/23314/20189
+f 18648/23308/20183 28283/23310/20185 28284/23315/20190 18653/23311/20186
+f 18653/23311/20186 28284/23315/20190 31186/23316/20191 26983/23313/20188
+f 18646/23303/20178 18649/23312/20187 18654/23317/20192 18650/23304/20179
+f 18650/23304/20179 18654/23317/20192 28281/23299/20174 28280/23294/20169
+f 18649/23312/20187 26984/23314/20189 26985/23318/20193 18654/23317/20192
+f 18654/23317/20192 26985/23318/20193 31185/23300/20175 28281/23299/20174
+f 18655/23319/20194 18659/23320/20195 18660/23321/20196 18656/23322/20197
+f 18656/23322/20197 18660/23321/20196 26916/22946/19825 26915/22942/19821
+f 18659/23320/20195 28283/23310/20185 28282/23309/20184 18660/23321/20196
+f 18660/23321/20196 28282/23309/20184 31162/22928/19807 26916/22946/19825
+f 18655/23319/20194 18656/23322/20197 18661/23323/20198 18657/23324/20199
+f 18657/23324/20199 18661/23323/20198 28285/23325/20200 28286/23326/20201
+f 18656/23322/20197 26915/22942/19821 26914/22941/19820 18661/23323/20198
+f 18661/23323/20198 26914/22941/19820 31163/22944/19823 28285/23325/20200
+f 18655/23319/20194 18657/23324/20199 18662/23327/20202 18658/23328/20203
+f 18658/23328/20203 18662/23327/20202 26986/23329/20204 26987/23330/20205
+f 18657/23324/20199 28286/23326/20201 28287/23331/20206 18662/23327/20202
+f 18662/23327/20202 28287/23331/20206 31187/23332/20207 26986/23329/20204
+f 18655/23319/20194 18658/23328/20203 18663/23333/20208 18659/23320/20195
+f 18659/23320/20195 18663/23333/20208 28284/23315/20190 28283/23310/20185
+f 18658/23328/20203 26987/23330/20205 26988/23334/20209 18663/23333/20208
+f 18663/23333/20208 26988/23334/20209 31186/23316/20191 28284/23315/20190
+f 18664/23335/20210 18668/23336/20211 18669/23337/20212 18665/23338/20213
+f 18665/23338/20213 18669/23337/20212 26919/22962/19841 26918/22958/19837
+f 18668/23336/20211 28286/23326/20201 28285/23325/20200 18669/23337/20212
+f 18669/23337/20212 28285/23325/20200 31163/22944/19823 26919/22962/19841
+f 18664/23335/20210 18665/23338/20213 18670/23339/20214 18666/23340/20215
+f 18666/23340/20215 18670/23339/20214 28288/23341/20216 28289/23342/20217
+f 18665/23338/20213 26918/22958/19837 26917/22957/19836 18670/23339/20214
+f 18670/23339/20214 26917/22957/19836 31164/22960/19839 28288/23341/20216
+f 18664/23335/20210 18666/23340/20215 18671/23343/20218 18667/23344/20219
+f 18667/23344/20219 18671/23343/20218 26989/23345/20220 26990/23346/20221
+f 18666/23340/20215 28289/23342/20217 28290/23347/20222 18671/23343/20218
+f 18671/23343/20218 28290/23347/20222 31188/23348/20223 26989/23345/20220
+f 18664/23335/20210 18667/23344/20219 18672/23349/20224 18668/23336/20211
+f 18668/23336/20211 18672/23349/20224 28287/23331/20206 28286/23326/20201
+f 18667/23344/20219 26990/23346/20221 26991/23350/20225 18672/23349/20224
+f 18672/23349/20224 26991/23350/20225 31187/23332/20207 28287/23331/20206
+f 18673/23351/20226 18677/23352/20227 18678/23353/20228 18674/23354/20229
+f 18674/23354/20229 18678/23353/20228 26922/22978/19857 26921/22974/19853
+f 18677/23352/20227 28289/23342/20217 28288/23341/20216 18678/23353/20228
+f 18678/23353/20228 28288/23341/20216 31164/22960/19839 26922/22978/19857
+f 18673/23351/20226 18674/23354/20229 18679/23355/20230 18675/23356/20231
+f 18675/23356/20231 18679/23355/20230 28291/23357/20232 28292/23358/20233
+f 18674/23354/20229 26921/22974/19853 26920/22973/19852 18679/23355/20230
+f 18679/23355/20230 26920/22973/19852 31165/22976/19855 28291/23357/20232
+f 18673/23351/20226 18675/23356/20231 18680/23359/20234 18676/23360/20235
+f 18676/23360/20235 18680/23359/20234 26992/23361/20236 26993/23362/20237
+f 18675/23356/20231 28292/23358/20233 28293/23363/20238 18680/23359/20234
+f 18680/23359/20234 28293/23363/20238 31189/23364/20239 26992/23361/20236
+f 18673/23351/20226 18676/23360/20235 18681/23365/20240 18677/23352/20227
+f 18677/23352/20227 18681/23365/20240 28290/23347/20222 28289/23342/20217
+f 18676/23360/20235 26993/23362/20237 26994/23366/20241 18681/23365/20240
+f 18681/23365/20240 26994/23366/20241 31188/23348/20223 28290/23347/20222
+f 18682/23367/20242 18686/23368/20243 18687/23369/20244 18683/23370/20245
+f 18683/23370/20245 18687/23369/20244 26925/22994/19873 26924/22990/19869
+f 18686/23368/20243 28292/23358/20233 28291/23357/20232 18687/23369/20244
+f 18687/23369/20244 28291/23357/20232 31165/22976/19855 26925/22994/19873
+f 18682/23367/20242 18683/23370/20245 18688/23371/20246 18684/23372/20247
+f 18684/23372/20247 18688/23371/20246 28294/23373/20248 28295/23374/20249
+f 18683/23370/20245 26924/22990/19869 26923/22989/19868 18688/23371/20246
+f 18688/23371/20246 26923/22989/19868 31166/22992/19871 28294/23373/20248
+f 18682/23367/20242 18684/23372/20247 18689/23375/20250 18685/23376/20251
+f 18685/23376/20251 18689/23375/20250 26995/23377/20252 26996/23378/20253
+f 18684/23372/20247 28295/23374/20249 28296/23379/20254 18689/23375/20250
+f 18689/23375/20250 28296/23379/20254 31190/23380/20255 26995/23377/20252
+f 18682/23367/20242 18685/23376/20251 18690/23381/20256 18686/23368/20243
+f 18686/23368/20243 18690/23381/20256 28293/23363/20238 28292/23358/20233
+f 18685/23376/20251 26996/23378/20253 26997/23382/20257 18690/23381/20256
+f 18690/23381/20256 26997/23382/20257 31189/23364/20239 28293/23363/20238
+f 18691/23383/20258 18695/23384/20259 18696/23385/20260 18692/23386/20261
+f 18692/23386/20261 18696/23385/20260 26928/23013/19889 26927/23008/19885
+f 18695/23384/20259 28295/23387/20249 28294/23388/20248 18696/23385/20260
+f 18696/23385/20260 28294/23388/20248 31166/23014/19871 26928/23013/19889
+f 18691/23383/20258 18692/23386/20261 18697/23389/20262 18693/23390/20263
+f 18693/23390/20263 18697/23389/20262 28297/23391/20264 28298/23392/20265
+f 18692/23386/20261 26927/23008/19885 26926/23007/19884 18697/23389/20262
+f 18697/23389/20262 26926/23007/19884 31167/23010/19887 28297/23391/20264
+f 18691/23383/20258 18693/23390/20263 18698/23393/20266 18694/23394/20267
+f 18694/23394/20267 18698/23393/20266 26998/23395/20268 26999/23396/20269
+f 18693/23390/20263 28298/23392/20265 28299/23397/20270 18698/23393/20266
+f 18698/23393/20266 28299/23397/20270 31191/23398/20271 26998/23395/20268
+f 18691/23383/20258 18694/23394/20267 18699/23399/20272 18695/23384/20259
+f 18695/23384/20259 18699/23399/20272 28296/23400/20254 28295/23387/20249
+f 18694/23394/20267 26999/23396/20269 27000/23401/20273 18699/23399/20272
+f 18699/23399/20272 27000/23401/20273 31190/23402/20255 28296/23400/20254
+f 18700/23403/20274 18704/23404/20275 18705/23405/20276 18701/23406/20277
+f 18701/23406/20277 18705/23405/20276 26931/23030/19905 26930/23026/19901
+f 18704/23404/20275 28298/23392/20265 28297/23391/20264 18705/23405/20276
+f 18705/23405/20276 28297/23391/20264 31167/23010/19887 26931/23030/19905
+f 18700/23403/20274 18701/23406/20277 18706/23407/20278 18702/23408/20279
+f 18702/23408/20279 18706/23407/20278 28300/23409/20280 28301/23410/20281
+f 18701/23406/20277 26930/23026/19901 26929/23025/19900 18706/23407/20278
+f 18706/23407/20278 26929/23025/19900 31168/23028/19903 28300/23409/20280
+f 18700/23403/20274 18702/23408/20279 18707/23411/20282 18703/23412/20283
+f 18703/23412/20283 18707/23411/20282 27001/23413/20284 27002/23414/20285
+f 18702/23408/20279 28301/23410/20281 28302/23415/20286 18707/23411/20282
+f 18707/23411/20282 28302/23415/20286 31192/23416/20287 27001/23413/20284
+f 18700/23403/20274 18703/23412/20283 18708/23417/20288 18704/23404/20275
+f 18704/23404/20275 18708/23417/20288 28299/23397/20270 28298/23392/20265
+f 18703/23412/20283 27002/23414/20285 27003/23418/20289 18708/23417/20288
+f 18708/23417/20288 27003/23418/20289 31191/23398/20271 28299/23397/20270
+f 18709/23419/20290 18713/23420/20291 18714/23421/20292 18710/23422/20293
+f 18710/23422/20293 18714/23421/20292 26934/23046/19921 26933/23042/19917
+f 18713/23420/20291 28301/23410/20281 28300/23409/20280 18714/23421/20292
+f 18714/23421/20292 28300/23409/20280 31168/23028/19903 26934/23046/19921
+f 18709/23419/20290 18710/23422/20293 18715/23423/20294 18711/23424/20295
+f 18711/23424/20295 18715/23423/20294 28303/23425/20296 28304/23426/20297
+f 18710/23422/20293 26933/23042/19917 26932/23041/19916 18715/23423/20294
+f 18715/23423/20294 26932/23041/19916 31169/23044/19919 28303/23425/20296
+f 18709/23419/20290 18711/23424/20295 18716/23427/20298 18712/23428/20299
+f 18712/23428/20299 18716/23427/20298 27004/23429/20300 27005/23430/20301
+f 18711/23424/20295 28304/23426/20297 28305/23431/20302 18716/23427/20298
+f 18716/23427/20298 28305/23431/20302 31193/23432/20303 27004/23429/20300
+f 18709/23419/20290 18712/23428/20299 18717/23433/20304 18713/23420/20291
+f 18713/23420/20291 18717/23433/20304 28302/23415/20286 28301/23410/20281
+f 18712/23428/20299 27005/23430/20301 27006/23434/20305 18717/23433/20304
+f 18717/23433/20304 27006/23434/20305 31192/23416/20287 28302/23415/20286
+f 18718/23435/20306 18722/23436/20307 18723/23437/20308 18719/23438/20309
+f 18719/23438/20309 18723/23437/20308 26937/23062/19937 26936/23058/19933
+f 18722/23436/20307 28304/23426/20297 28303/23425/20296 18723/23437/20308
+f 18723/23437/20308 28303/23425/20296 31169/23044/19919 26937/23062/19937
+f 18718/23435/20306 18719/23438/20309 18724/23439/20310 18720/23440/20311
+f 18720/23440/20311 18724/23439/20310 28306/23441/20312 28307/23442/20313
+f 18719/23438/20309 26936/23058/19933 26935/23057/19932 18724/23439/20310
+f 18724/23439/20310 26935/23057/19932 31170/23060/19935 28306/23441/20312
+f 18718/23435/20306 18720/23440/20311 18725/23443/20314 18721/23444/20315
+f 18721/23444/20315 18725/23443/20314 27007/23445/20316 27008/23446/20317
+f 18720/23440/20311 28307/23442/20313 28308/23447/20318 18725/23443/20314
+f 18725/23443/20314 28308/23447/20318 31194/23448/20319 27007/23445/20316
+f 18718/23435/20306 18721/23444/20315 18726/23449/20320 18722/23436/20307
+f 18722/23436/20307 18726/23449/20320 28305/23431/20302 28304/23426/20297
+f 18721/23444/20315 27008/23446/20317 27009/23450/20321 18726/23449/20320
+f 18726/23449/20320 27009/23450/20321 31193/23432/20303 28305/23431/20302
+f 18727/23451/20322 18731/23452/20323 18732/23453/20324 18728/23454/20325
+f 18728/23454/20325 18732/23453/20324 26940/23078/19953 26939/23074/19949
+f 18731/23452/20323 28307/23442/20313 28306/23441/20312 18732/23453/20324
+f 18732/23453/20324 28306/23441/20312 31170/23060/19935 26940/23078/19953
+f 18727/23451/20322 18728/23454/20325 18733/23455/20326 18729/23456/20327
+f 18729/23456/20327 18733/23455/20326 28309/23457/20328 28310/23458/20329
+f 18728/23454/20325 26939/23074/19949 26938/23073/19948 18733/23455/20326
+f 18733/23455/20326 26938/23073/19948 31171/23076/19951 28309/23457/20328
+f 18727/23451/20322 18729/23456/20327 18734/23459/20330 18730/23460/20331
+f 18730/23460/20331 18734/23459/20330 27010/23461/20332 27011/23462/20333
+f 18729/23456/20327 28310/23458/20329 28311/23463/20334 18734/23459/20330
+f 18734/23459/20330 28311/23463/20334 31195/23464/20335 27010/23461/20332
+f 18727/23451/20322 18730/23460/20331 18735/23465/20336 18731/23452/20323
+f 18731/23452/20323 18735/23465/20336 28308/23447/20318 28307/23442/20313
+f 18730/23460/20331 27011/23462/20333 27012/23466/20337 18735/23465/20336
+f 18735/23465/20336 27012/23466/20337 31194/23448/20319 28308/23447/20318
+f 18736/23467/20338 18740/23468/20339 18741/23469/20340 18737/23470/20341
+f 18737/23470/20341 18741/23469/20340 26943/23094/19969 26942/23090/19965
+f 18740/23468/20339 28310/23458/20329 28309/23457/20328 18741/23469/20340
+f 18741/23469/20340 28309/23457/20328 31171/23076/19951 26943/23094/19969
+f 18736/23467/20338 18737/23470/20341 18742/23471/20342 18738/23472/20343
+f 18738/23472/20343 18742/23471/20342 28312/23473/20344 28313/23474/20345
+f 18737/23470/20341 26942/23090/19965 26941/23089/19964 18742/23471/20342
+f 18742/23471/20342 26941/23089/19964 31172/23092/19967 28312/23473/20344
+f 18736/23467/20338 18738/23472/20343 18743/23475/20346 18739/23476/20347
+f 18739/23476/20347 18743/23475/20346 27013/23477/20348 27014/23478/20349
+f 18738/23472/20343 28313/23474/20345 28314/23479/20350 18743/23475/20346
+f 18743/23475/20346 28314/23479/20350 31196/23480/20351 27013/23477/20348
+f 18736/23467/20338 18739/23476/20347 18744/23481/20352 18740/23468/20339
+f 18740/23468/20339 18744/23481/20352 28311/23463/20334 28310/23458/20329
+f 18739/23476/20347 27014/23478/20349 27015/23482/20353 18744/23481/20352
+f 18744/23481/20352 27015/23482/20353 31195/23464/20335 28311/23463/20334
+f 18745/23483/20354 18749/23484/20355 18750/23485/20356 18746/23486/20357
+f 18746/23486/20357 18750/23485/20356 26946/23106/19981 26945/23104/19979
+f 18749/23484/20355 28313/23474/20345 28312/23473/20344 18750/23485/20356
+f 18750/23485/20356 28312/23473/20344 31172/23092/19967 26946/23106/19981
+f 18745/23483/20354 18746/23486/20357 18751/23487/20358 18747/23488/20359
+f 18747/23488/20359 18751/23487/20358 28245/23112/19987 28244/23111/19986
+f 18746/23486/20357 26945/23104/19979 26944/23103/19978 18751/23487/20358
+f 18751/23487/20358 26944/23103/19978 31149/22738/19617 28245/23112/19987
+f 18745/23483/20354 18747/23488/20359 18752/23489/20360 18748/23490/20361
+f 18748/23490/20361 18752/23489/20360 27016/23491/20362 27017/23492/20363
+f 18747/23488/20359 28244/23111/19986 28243/23124/19999 18752/23489/20360
+f 18752/23489/20360 28243/23124/19999 31173/23126/20001 27016/23491/20362
+f 18745/23483/20354 18748/23490/20361 18753/23493/20364 18749/23484/20355
+f 18749/23484/20355 18753/23493/20364 28314/23479/20350 28313/23474/20345
+f 18748/23490/20361 27017/23492/20363 27018/23494/20365 18753/23493/20364
+f 18753/23493/20364 27018/23494/20365 31196/23480/20351 28314/23479/20350
+f 18754/23495/20366 18758/23496/20367 18759/23497/20368 18755/23498/20369
+f 18755/23498/20369 18759/23497/20368 26949/23125/20000 26948/23120/19995
+f 18758/23496/20367 28316/23499/20370 28317/23500/20371 18759/23497/20368
+f 18759/23497/20368 28317/23500/20371 31173/23126/20001 26949/23125/20000
+f 18754/23495/20366 18755/23498/20369 18760/23501/20372 18756/23502/20373
+f 18756/23502/20373 18760/23501/20372 28318/23503/20374 28319/23504/20375
+f 18755/23498/20369 26948/23120/19995 26947/23119/19994 18760/23501/20372
+f 18760/23501/20372 26947/23119/19994 31174/23122/19997 28318/23503/20374
+f 18754/23495/20366 18756/23502/20373 18761/23505/20376 18757/23506/20377
+f 18757/23506/20377 18761/23505/20376 27019/23507/20378 27020/23508/20379
+f 18756/23502/20373 28319/23504/20375 28320/23509/20380 18761/23505/20376
+f 18761/23505/20376 28320/23509/20380 31198/23510/20381 27019/23507/20378
+f 18754/23495/20366 18757/23506/20377 18762/23511/20382 18758/23496/20367
+f 18758/23496/20367 18762/23511/20382 28315/23512/20383 28316/23499/20370
+f 18757/23506/20377 27020/23508/20379 27021/23513/20384 18762/23511/20382
+f 18762/23511/20382 27021/23513/20384 31197/23514/20385 28315/23512/20383
+f 18763/23515/20386 18767/23516/20387 18768/23517/20388 18764/23518/20389
+f 18764/23518/20389 18768/23517/20388 26952/23142/20017 26951/23138/20013
+f 18767/23516/20387 28319/23504/20375 28318/23503/20374 18768/23517/20388
+f 18768/23517/20388 28318/23503/20374 31174/23122/19997 26952/23142/20017
+f 18763/23515/20386 18764/23518/20389 18769/23519/20390 18765/23520/20391
+f 18765/23520/20391 18769/23519/20390 28321/23521/20392 28322/23522/20393
+f 18764/23518/20389 26951/23138/20013 26950/23137/20012 18769/23519/20390
+f 18769/23519/20390 26950/23137/20012 31175/23140/20015 28321/23521/20392
+f 18763/23515/20386 18765/23520/20391 18770/23523/20394 18766/23524/20395
+f 18766/23524/20395 18770/23523/20394 27022/23525/20396 27023/23526/20397
+f 18765/23520/20391 28322/23522/20393 28323/23527/20398 18770/23523/20394
+f 18770/23523/20394 28323/23527/20398 31199/23528/20399 27022/23525/20396
+f 18763/23515/20386 18766/23524/20395 18771/23529/20400 18767/23516/20387
+f 18767/23516/20387 18771/23529/20400 28320/23509/20380 28319/23504/20375
+f 18766/23524/20395 27023/23526/20397 27024/23530/20401 18771/23529/20400
+f 18771/23529/20400 27024/23530/20401 31198/23510/20381 28320/23509/20380
+f 18772/23531/20402 18776/23532/20403 18777/23533/20404 18773/23534/20405
+f 18773/23534/20405 18777/23533/20404 26955/23158/20033 26954/23154/20029
+f 18776/23532/20403 28322/23522/20393 28321/23521/20392 18777/23533/20404
+f 18777/23533/20404 28321/23521/20392 31175/23140/20015 26955/23158/20033
+f 18772/23531/20402 18773/23534/20405 18778/23535/20406 18774/23536/20407
+f 18774/23536/20407 18778/23535/20406 28324/23537/20408 28325/23538/20409
+f 18773/23534/20405 26954/23154/20029 26953/23153/20028 18778/23535/20406
+f 18778/23535/20406 26953/23153/20028 31176/23156/20031 28324/23537/20408
+f 18772/23531/20402 18774/23536/20407 18779/23539/20410 18775/23540/20411
+f 18775/23540/20411 18779/23539/20410 27025/23541/20412 27026/23542/20413
+f 18774/23536/20407 28325/23538/20409 28326/23543/20414 18779/23539/20410
+f 18779/23539/20410 28326/23543/20414 31200/23544/20415 27025/23541/20412
+f 18772/23531/20402 18775/23540/20411 18780/23545/20416 18776/23532/20403
+f 18776/23532/20403 18780/23545/20416 28323/23527/20398 28322/23522/20393
+f 18775/23540/20411 27026/23542/20413 27027/23546/20417 18780/23545/20416
+f 18780/23545/20416 27027/23546/20417 31199/23528/20399 28323/23527/20398
+f 18781/23547/20418 18785/23548/20419 18786/23549/20420 18782/23550/20421
+f 18782/23550/20421 18786/23549/20420 26958/23174/20049 26957/23170/20045
+f 18785/23548/20419 28325/23538/20409 28324/23537/20408 18786/23549/20420
+f 18786/23549/20420 28324/23537/20408 31176/23156/20031 26958/23174/20049
+f 18781/23547/20418 18782/23550/20421 18787/23551/20422 18783/23552/20423
+f 18783/23552/20423 18787/23551/20422 28327/23553/20424 28328/23554/20425
+f 18782/23550/20421 26957/23170/20045 26956/23169/20044 18787/23551/20422
+f 18787/23551/20422 26956/23169/20044 31177/23172/20047 28327/23553/20424
+f 18781/23547/20418 18783/23552/20423 18788/23555/20426 18784/23556/20427
+f 18784/23556/20427 18788/23555/20426 27028/23557/20428 27029/23558/20429
+f 18783/23552/20423 28328/23554/20425 28329/23559/20430 18788/23555/20426
+f 18788/23555/20426 28329/23559/20430 31201/23560/20431 27028/23557/20428
+f 18781/23547/20418 18784/23556/20427 18789/23561/20432 18785/23548/20419
+f 18785/23548/20419 18789/23561/20432 28326/23543/20414 28325/23538/20409
+f 18784/23556/20427 27029/23558/20429 27030/23562/20433 18789/23561/20432
+f 18789/23561/20432 27030/23562/20433 31200/23544/20415 28326/23543/20414
+f 18790/23563/20434 18794/23564/20435 18795/23565/20436 18791/23566/20437
+f 18791/23566/20437 18795/23565/20436 26961/23190/20065 26960/23186/20061
+f 18794/23564/20435 28328/23554/20425 28327/23553/20424 18795/23565/20436
+f 18795/23565/20436 28327/23553/20424 31177/23172/20047 26961/23190/20065
+f 18790/23563/20434 18791/23566/20437 18796/23567/20438 18792/23568/20439
+f 18792/23568/20439 18796/23567/20438 28330/23569/20440 28331/23570/20441
+f 18791/23566/20437 26960/23186/20061 26959/23185/20060 18796/23567/20438
+f 18796/23567/20438 26959/23185/20060 31178/23188/20063 28330/23569/20440
+f 18790/23563/20434 18792/23568/20439 18797/23571/20442 18793/23572/20443
+f 18793/23572/20443 18797/23571/20442 27031/23573/20444 27032/23574/20445
+f 18792/23568/20439 28331/23570/20441 28332/23575/20446 18797/23571/20442
+f 18797/23571/20442 28332/23575/20446 31202/23576/20447 27031/23573/20444
+f 18790/23563/20434 18793/23572/20443 18798/23577/20448 18794/23564/20435
+f 18794/23564/20435 18798/23577/20448 28329/23559/20430 28328/23554/20425
+f 18793/23572/20443 27032/23574/20445 27033/23578/20449 18798/23577/20448
+f 18798/23577/20448 27033/23578/20449 31201/23560/20431 28329/23559/20430
+f 18799/23579/20450 18803/23580/20451 18804/23581/20452 18800/23582/20453
+f 18800/23582/20453 18804/23581/20452 26964/23206/20081 26963/23202/20077
+f 18803/23580/20451 28331/23570/20441 28330/23569/20440 18804/23581/20452
+f 18804/23581/20452 28330/23569/20440 31178/23188/20063 26964/23206/20081
+f 18799/23579/20450 18800/23582/20453 18805/23583/20454 18801/23584/20455
+f 18801/23584/20455 18805/23583/20454 28333/23585/20456 28334/23586/20457
+f 18800/23582/20453 26963/23202/20077 26962/23201/20076 18805/23583/20454
+f 18805/23583/20454 26962/23201/20076 31179/23204/20079 28333/23585/20456
+f 18799/23579/20450 18801/23584/20455 18806/23587/20458 18802/23588/20459
+f 18802/23588/20459 18806/23587/20458 27034/23589/20460 27035/23590/20461
+f 18801/23584/20455 28334/23586/20457 28335/23591/20462 18806/23587/20458
+f 18806/23587/20458 28335/23591/20462 31203/23592/20463 27034/23589/20460
+f 18799/23579/20450 18802/23588/20459 18807/23593/20464 18803/23580/20451
+f 18803/23580/20451 18807/23593/20464 28332/23575/20446 28331/23570/20441
+f 18802/23588/20459 27035/23590/20461 27036/23594/20465 18807/23593/20464
+f 18807/23593/20464 27036/23594/20465 31202/23576/20447 28332/23575/20446
+f 18808/23595/20466 18812/23596/20467 18813/23597/20468 18809/23598/20469
+f 18809/23598/20469 18813/23597/20468 26967/23222/20097 26966/23218/20093
+f 18812/23596/20467 28334/23586/20457 28333/23585/20456 18813/23597/20468
+f 18813/23597/20468 28333/23585/20456 31179/23204/20079 26967/23222/20097
+f 18808/23595/20466 18809/23598/20469 18814/23599/20470 18810/23600/20471
+f 18810/23600/20471 18814/23599/20470 28336/23601/20472 28337/23602/20473
+f 18809/23598/20469 26966/23218/20093 26965/23217/20092 18814/23599/20470
+f 18814/23599/20470 26965/23217/20092 31180/23220/20095 28336/23601/20472
+f 18808/23595/20466 18810/23600/20471 18815/23603/20474 18811/23604/20475
+f 18811/23604/20475 18815/23603/20474 27037/23605/20476 27038/23606/20477
+f 18810/23600/20471 28337/23602/20473 28338/23607/20478 18815/23603/20474
+f 18815/23603/20474 28338/23607/20478 31204/23608/20479 27037/23605/20476
+f 18808/23595/20466 18811/23604/20475 18816/23609/20480 18812/23596/20467
+f 18812/23596/20467 18816/23609/20480 28335/23591/20462 28334/23586/20457
+f 18811/23604/20475 27038/23606/20477 27039/23610/20481 18816/23609/20480
+f 18816/23609/20480 27039/23610/20481 31203/23592/20463 28335/23591/20462
+f 18817/23611/20482 18821/23612/20483 18822/23613/20484 18818/23614/20485
+f 18818/23614/20485 18822/23613/20484 26970/23238/20113 26969/23234/20109
+f 18821/23612/20483 28337/23602/20473 28336/23601/20472 18822/23613/20484
+f 18822/23613/20484 28336/23601/20472 31180/23220/20095 26970/23238/20113
+f 18817/23611/20482 18818/23614/20485 18823/23615/20486 18819/23616/20487
+f 18819/23616/20487 18823/23615/20486 28339/23617/20488 28340/23618/20489
+f 18818/23614/20485 26969/23234/20109 26968/23233/20108 18823/23615/20486
+f 18823/23615/20486 26968/23233/20108 31181/23236/20111 28339/23617/20488
+f 18817/23611/20482 18819/23616/20487 18824/23619/20490 18820/23620/20491
+f 18820/23620/20491 18824/23619/20490 27040/23621/20492 27041/23622/20493
+f 18819/23616/20487 28340/23618/20489 28341/23623/20494 18824/23619/20490
+f 18824/23619/20490 28341/23623/20494 31205/23624/20495 27040/23621/20492
+f 18817/23611/20482 18820/23620/20491 18825/23625/20496 18821/23612/20483
+f 18821/23612/20483 18825/23625/20496 28338/23607/20478 28337/23602/20473
+f 18820/23620/20491 27041/23622/20493 27042/23626/20497 18825/23625/20496
+f 18825/23625/20496 27042/23626/20497 31204/23608/20479 28338/23607/20478
+f 18826/23627/20498 18830/23628/20499 18831/23629/20500 18827/23630/20501
+f 18827/23630/20501 18831/23629/20500 26973/23254/20129 26972/23250/20125
+f 18830/23628/20499 28340/23618/20489 28339/23617/20488 18831/23629/20500
+f 18831/23629/20500 28339/23617/20488 31181/23236/20111 26973/23254/20129
+f 18826/23627/20498 18827/23630/20501 18832/23631/20502 18828/23632/20503
+f 18828/23632/20503 18832/23631/20502 28342/23633/20504 28343/23634/20505
+f 18827/23630/20501 26972/23250/20125 26971/23249/20124 18832/23631/20502
+f 18832/23631/20502 26971/23249/20124 31182/23252/20127 28342/23633/20504
+f 18826/23627/20498 18828/23632/20503 18833/23635/20506 18829/23636/20507
+f 18829/23636/20507 18833/23635/20506 27043/23637/20508 27044/23638/20509
+f 18828/23632/20503 28343/23634/20505 28344/23639/20510 18833/23635/20506
+f 18833/23635/20506 28344/23639/20510 31206/23640/20511 27043/23637/20508
+f 18826/23627/20498 18829/23636/20507 18834/23641/20512 18830/23628/20499
+f 18830/23628/20499 18834/23641/20512 28341/23623/20494 28340/23618/20489
+f 18829/23636/20507 27044/23638/20509 27045/23642/20513 18834/23641/20512
+f 18834/23641/20512 27045/23642/20513 31205/23624/20495 28341/23623/20494
+f 18835/23643/20514 18839/23644/20515 18840/23645/20516 18836/23646/20517
+f 18836/23646/20517 18840/23645/20516 26976/23270/20145 26975/23266/20141
+f 18839/23644/20515 28343/23634/20505 28342/23633/20504 18840/23645/20516
+f 18840/23645/20516 28342/23633/20504 31182/23252/20127 26976/23270/20145
+f 18835/23643/20514 18836/23646/20517 18841/23647/20518 18837/23648/20519
+f 18837/23648/20519 18841/23647/20518 28345/23649/20520 28346/23650/20521
+f 18836/23646/20517 26975/23266/20141 26974/23265/20140 18841/23647/20518
+f 18841/23647/20518 26974/23265/20140 31183/23268/20143 28345/23649/20520
+f 18835/23643/20514 18837/23648/20519 18842/23651/20522 18838/23652/20523
+f 18838/23652/20523 18842/23651/20522 27046/23653/20524 27047/23654/20525
+f 18837/23648/20519 28346/23650/20521 28347/23655/20526 18842/23651/20522
+f 18842/23651/20522 28347/23655/20526 31207/23656/20527 27046/23653/20524
+f 18835/23643/20514 18838/23652/20523 18843/23657/20528 18839/23644/20515
+f 18839/23644/20515 18843/23657/20528 28344/23639/20510 28343/23634/20505
+f 18838/23652/20523 27047/23654/20525 27048/23658/20529 18843/23657/20528
+f 18843/23657/20528 27048/23658/20529 31206/23640/20511 28344/23639/20510
+f 18844/23659/20530 18848/23660/20531 18849/23661/20532 18845/23662/20533
+f 18845/23662/20533 18849/23661/20532 26979/23286/20161 26978/23282/20157
+f 18848/23660/20531 28346/23650/20521 28345/23649/20520 18849/23661/20532
+f 18849/23661/20532 28345/23649/20520 31183/23268/20143 26979/23286/20161
+f 18844/23659/20530 18845/23662/20533 18850/23663/20534 18846/23664/20535
+f 18846/23664/20535 18850/23663/20534 28348/23665/20536 28349/23666/20537
+f 18845/23662/20533 26978/23282/20157 26977/23281/20156 18850/23663/20534
+f 18850/23663/20534 26977/23281/20156 31184/23284/20159 28348/23665/20536
+f 18844/23659/20530 18846/23664/20535 18851/23667/20538 18847/23668/20539
+f 18847/23668/20539 18851/23667/20538 27049/23669/20540 27050/23670/20541
+f 18846/23664/20535 28349/23666/20537 28350/23671/20542 18851/23667/20538
+f 18851/23667/20538 28350/23671/20542 31208/23672/20543 27049/23669/20540
+f 18844/23659/20530 18847/23668/20539 18852/23673/20544 18848/23660/20531
+f 18848/23660/20531 18852/23673/20544 28347/23655/20526 28346/23650/20521
+f 18847/23668/20539 27050/23670/20541 27051/23674/20545 18852/23673/20544
+f 18852/23673/20544 27051/23674/20545 31207/23656/20527 28347/23655/20526
+f 18853/23675/20546 18857/23676/20547 18858/23677/20548 18854/23678/20549
+f 18854/23678/20549 18858/23677/20548 26982/23302/20177 26981/23298/20173
+f 18857/23676/20547 28349/23666/20537 28348/23665/20536 18858/23677/20548
+f 18858/23677/20548 28348/23665/20536 31184/23284/20159 26982/23302/20177
+f 18853/23675/20546 18854/23678/20549 18859/23679/20550 18855/23680/20551
+f 18855/23680/20551 18859/23679/20550 28351/23681/20552 28352/23682/20553
+f 18854/23678/20549 26981/23298/20173 26980/23297/20172 18859/23679/20550
+f 18859/23679/20550 26980/23297/20172 31185/23300/20175 28351/23681/20552
+f 18853/23675/20546 18855/23680/20551 18860/23683/20554 18856/23684/20555
+f 18856/23684/20555 18860/23683/20554 27052/23685/20556 27053/23686/20557
+f 18855/23680/20551 28352/23682/20553 28353/23687/20558 18860/23683/20554
+f 18860/23683/20554 28353/23687/20558 31209/23688/20559 27052/23685/20556
+f 18853/23675/20546 18856/23684/20555 18861/23689/20560 18857/23676/20547
+f 18857/23676/20547 18861/23689/20560 28350/23671/20542 28349/23666/20537
+f 18856/23684/20555 27053/23686/20557 27054/23690/20561 18861/23689/20560
+f 18861/23689/20560 27054/23690/20561 31208/23672/20543 28350/23671/20542
+f 18862/23691/20562 18866/23692/20563 18867/23693/20564 18863/23694/20565
+f 18863/23694/20565 18867/23693/20564 26985/23318/20193 26984/23314/20189
+f 18866/23692/20563 28352/23682/20553 28351/23681/20552 18867/23693/20564
+f 18867/23693/20564 28351/23681/20552 31185/23300/20175 26985/23318/20193
+f 18862/23691/20562 18863/23694/20565 18868/23695/20566 18864/23696/20567
+f 18864/23696/20567 18868/23695/20566 28354/23697/20568 28355/23698/20569
+f 18863/23694/20565 26984/23314/20189 26983/23313/20188 18868/23695/20566
+f 18868/23695/20566 26983/23313/20188 31186/23316/20191 28354/23697/20568
+f 18862/23691/20562 18864/23696/20567 18869/23699/20570 18865/23700/20571
+f 18865/23700/20571 18869/23699/20570 27055/23701/20572 27056/23702/20573
+f 18864/23696/20567 28355/23698/20569 28356/23703/20574 18869/23699/20570
+f 18869/23699/20570 28356/23703/20574 31210/23704/20575 27055/23701/20572
+f 18862/23691/20562 18865/23700/20571 18870/23705/20576 18866/23692/20563
+f 18866/23692/20563 18870/23705/20576 28353/23687/20558 28352/23682/20553
+f 18865/23700/20571 27056/23702/20573 27057/23706/20577 18870/23705/20576
+f 18870/23705/20576 27057/23706/20577 31209/23688/20559 28353/23687/20558
+f 18871/23707/20578 18875/23708/20579 18876/23709/20580 18872/23710/20581
+f 18872/23710/20581 18876/23709/20580 26988/23334/20209 26987/23330/20205
+f 18875/23708/20579 28355/23698/20569 28354/23697/20568 18876/23709/20580
+f 18876/23709/20580 28354/23697/20568 31186/23316/20191 26988/23334/20209
+f 18871/23707/20578 18872/23710/20581 18877/23711/20582 18873/23712/20583
+f 18873/23712/20583 18877/23711/20582 28357/23713/20584 28358/23714/20585
+f 18872/23710/20581 26987/23330/20205 26986/23329/20204 18877/23711/20582
+f 18877/23711/20582 26986/23329/20204 31187/23332/20207 28357/23713/20584
+f 18871/23707/20578 18873/23712/20583 18878/23715/20586 18874/23716/20587
+f 18874/23716/20587 18878/23715/20586 27058/23717/20588 27059/23718/20589
+f 18873/23712/20583 28358/23714/20585 28359/23719/20590 18878/23715/20586
+f 18878/23715/20586 28359/23719/20590 31211/23720/20591 27058/23717/20588
+f 18871/23707/20578 18874/23716/20587 18879/23721/20592 18875/23708/20579
+f 18875/23708/20579 18879/23721/20592 28356/23703/20574 28355/23698/20569
+f 18874/23716/20587 27059/23718/20589 27060/23722/20593 18879/23721/20592
+f 18879/23721/20592 27060/23722/20593 31210/23704/20575 28356/23703/20574
+f 18880/23723/20594 18884/23724/20595 18885/23725/20596 18881/23726/20597
+f 18881/23726/20597 18885/23725/20596 26991/23350/20225 26990/23346/20221
+f 18884/23724/20595 28358/23714/20585 28357/23713/20584 18885/23725/20596
+f 18885/23725/20596 28357/23713/20584 31187/23332/20207 26991/23350/20225
+f 18880/23723/20594 18881/23726/20597 18886/23727/20598 18882/23728/20599
+f 18882/23728/20599 18886/23727/20598 28360/23729/20600 28361/23730/20601
+f 18881/23726/20597 26990/23346/20221 26989/23345/20220 18886/23727/20598
+f 18886/23727/20598 26989/23345/20220 31188/23348/20223 28360/23729/20600
+f 18880/23723/20594 18882/23728/20599 18887/23731/20602 18883/23732/20603
+f 18883/23732/20603 18887/23731/20602 27061/23733/20604 27062/23734/20605
+f 18882/23728/20599 28361/23730/20601 28362/23735/20606 18887/23731/20602
+f 18887/23731/20602 28362/23735/20606 31212/23736/20607 27061/23733/20604
+f 18880/23723/20594 18883/23732/20603 18888/23737/20608 18884/23724/20595
+f 18884/23724/20595 18888/23737/20608 28359/23719/20590 28358/23714/20585
+f 18883/23732/20603 27062/23734/20605 27063/23738/20609 18888/23737/20608
+f 18888/23737/20608 27063/23738/20609 31211/23720/20591 28359/23719/20590
+f 18889/23739/20610 18893/23740/20611 18894/23741/20612 18890/23742/20613
+f 18890/23742/20613 18894/23741/20612 26994/23366/20241 26993/23362/20237
+f 18893/23740/20611 28361/23730/20601 28360/23729/20600 18894/23741/20612
+f 18894/23741/20612 28360/23729/20600 31188/23348/20223 26994/23366/20241
+f 18889/23739/20610 18890/23742/20613 18895/23743/20614 18891/23744/20615
+f 18891/23744/20615 18895/23743/20614 28363/23745/20616 28364/23746/20617
+f 18890/23742/20613 26993/23362/20237 26992/23361/20236 18895/23743/20614
+f 18895/23743/20614 26992/23361/20236 31189/23364/20239 28363/23745/20616
+f 18889/23739/20610 18891/23744/20615 18896/23747/20618 18892/23748/20619
+f 18892/23748/20619 18896/23747/20618 27064/23749/20620 27065/23750/20621
+f 18891/23744/20615 28364/23746/20617 28365/23751/20622 18896/23747/20618
+f 18896/23747/20618 28365/23751/20622 31213/23752/20623 27064/23749/20620
+f 18889/23739/20610 18892/23748/20619 18897/23753/20624 18893/23740/20611
+f 18893/23740/20611 18897/23753/20624 28362/23735/20606 28361/23730/20601
+f 18892/23748/20619 27065/23750/20621 27066/23754/20625 18897/23753/20624
+f 18897/23753/20624 27066/23754/20625 31212/23736/20607 28362/23735/20606
+f 18898/23755/20626 18902/23756/20627 18903/23757/20628 18899/23758/20629
+f 18899/23758/20629 18903/23757/20628 26997/23382/20257 26996/23378/20253
+f 18902/23756/20627 28364/23746/20617 28363/23745/20616 18903/23757/20628
+f 18903/23757/20628 28363/23745/20616 31189/23364/20239 26997/23382/20257
+f 18898/23755/20626 18899/23758/20629 18904/23759/20630 18900/23760/20631
+f 18900/23760/20631 18904/23759/20630 28366/23761/20632 28367/23762/20633
+f 18899/23758/20629 26996/23378/20253 26995/23377/20252 18904/23759/20630
+f 18904/23759/20630 26995/23377/20252 31190/23380/20255 28366/23761/20632
+f 18898/23755/20626 18900/23760/20631 18905/23763/20634 18901/23764/20635
+f 18901/23764/20635 18905/23763/20634 27067/23765/20636 27068/23766/20637
+f 18900/23760/20631 28367/23762/20633 28368/23767/20638 18905/23763/20634
+f 18905/23763/20634 28368/23767/20638 31214/23768/20639 27067/23765/20636
+f 18898/23755/20626 18901/23764/20635 18906/23769/20640 18902/23756/20627
+f 18902/23756/20627 18906/23769/20640 28365/23751/20622 28364/23746/20617
+f 18901/23764/20635 27068/23766/20637 27069/23770/20641 18906/23769/20640
+f 18906/23769/20640 27069/23770/20641 31213/23752/20623 28365/23751/20622
+f 18907/23771/20642 18911/23772/20643 18912/23773/20644 18908/23774/20645
+f 18908/23774/20645 18912/23773/20644 27000/23401/20273 26999/23396/20269
+f 18911/23772/20643 28367/23775/20633 28366/23776/20632 18912/23773/20644
+f 18912/23773/20644 28366/23776/20632 31190/23402/20255 27000/23401/20273
+f 18907/23771/20642 18908/23774/20645 18913/23777/20646 18909/23778/20647
+f 18909/23778/20647 18913/23777/20646 28369/23779/20648 28370/23780/20649
+f 18908/23774/20645 26999/23396/20269 26998/23395/20268 18913/23777/20646
+f 18913/23777/20646 26998/23395/20268 31191/23398/20271 28369/23779/20648
+f 18907/23771/20642 18909/23778/20647 18914/23781/20650 18910/23782/20651
+f 18910/23782/20651 18914/23781/20650 27070/23783/20652 27071/23784/20653
+f 18909/23778/20647 28370/23780/20649 28371/23785/20654 18914/23781/20650
+f 18914/23781/20650 28371/23785/20654 31215/23786/20655 27070/23783/20652
+f 18907/23771/20642 18910/23782/20651 18915/23787/20656 18911/23772/20643
+f 18911/23772/20643 18915/23787/20656 28368/23788/20638 28367/23775/20633
+f 18910/23782/20651 27071/23784/20653 27072/23789/20657 18915/23787/20656
+f 18915/23787/20656 27072/23789/20657 31214/23790/20639 28368/23788/20638
+f 18916/23791/20658 18920/23792/20659 18921/23793/20660 18917/23794/20661
+f 18917/23794/20661 18921/23793/20660 27003/23418/20289 27002/23414/20285
+f 18920/23792/20659 28370/23780/20649 28369/23779/20648 18921/23793/20660
+f 18921/23793/20660 28369/23779/20648 31191/23398/20271 27003/23418/20289
+f 18916/23791/20658 18917/23794/20661 18922/23795/20662 18918/23796/20663
+f 18918/23796/20663 18922/23795/20662 28372/23797/20664 28373/23798/20665
+f 18917/23794/20661 27002/23414/20285 27001/23413/20284 18922/23795/20662
+f 18922/23795/20662 27001/23413/20284 31192/23416/20287 28372/23797/20664
+f 18916/23791/20658 18918/23796/20663 18923/23799/20666 18919/23800/20667
+f 18919/23800/20667 18923/23799/20666 27073/23801/20668 27074/23802/20669
+f 18918/23796/20663 28373/23798/20665 28374/23803/20670 18923/23799/20666
+f 18923/23799/20666 28374/23803/20670 31216/23804/20671 27073/23801/20668
+f 18916/23791/20658 18919/23800/20667 18924/23805/20672 18920/23792/20659
+f 18920/23792/20659 18924/23805/20672 28371/23785/20654 28370/23780/20649
+f 18919/23800/20667 27074/23802/20669 27075/23806/20673 18924/23805/20672
+f 18924/23805/20672 27075/23806/20673 31215/23786/20655 28371/23785/20654
+f 18925/23807/20674 18929/23808/20675 18930/23809/20676 18926/23810/20677
+f 18926/23810/20677 18930/23809/20676 27006/23434/20305 27005/23430/20301
+f 18929/23808/20675 28373/23798/20665 28372/23797/20664 18930/23809/20676
+f 18930/23809/20676 28372/23797/20664 31192/23416/20287 27006/23434/20305
+f 18925/23807/20674 18926/23810/20677 18931/23811/20678 18927/23812/20679
+f 18927/23812/20679 18931/23811/20678 28375/23813/20680 28376/23814/20681
+f 18926/23810/20677 27005/23430/20301 27004/23429/20300 18931/23811/20678
+f 18931/23811/20678 27004/23429/20300 31193/23432/20303 28375/23813/20680
+f 18925/23807/20674 18927/23812/20679 18932/23815/20682 18928/23816/20683
+f 18928/23816/20683 18932/23815/20682 27076/23817/20684 27077/23818/20685
+f 18927/23812/20679 28376/23814/20681 28377/23819/20686 18932/23815/20682
+f 18932/23815/20682 28377/23819/20686 31217/23820/20687 27076/23817/20684
+f 18925/23807/20674 18928/23816/20683 18933/23821/20688 18929/23808/20675
+f 18929/23808/20675 18933/23821/20688 28374/23803/20670 28373/23798/20665
+f 18928/23816/20683 27077/23818/20685 27078/23822/20689 18933/23821/20688
+f 18933/23821/20688 27078/23822/20689 31216/23804/20671 28374/23803/20670
+f 18934/23823/20690 18938/23824/20691 18939/23825/20692 18935/23826/20693
+f 18935/23826/20693 18939/23825/20692 27009/23450/20321 27008/23446/20317
+f 18938/23824/20691 28376/23814/20681 28375/23813/20680 18939/23825/20692
+f 18939/23825/20692 28375/23813/20680 31193/23432/20303 27009/23450/20321
+f 18934/23823/20690 18935/23826/20693 18940/23827/20694 18936/23828/20695
+f 18936/23828/20695 18940/23827/20694 28378/23829/20696 28379/23830/20697
+f 18935/23826/20693 27008/23446/20317 27007/23445/20316 18940/23827/20694
+f 18940/23827/20694 27007/23445/20316 31194/23448/20319 28378/23829/20696
+f 18934/23823/20690 18936/23828/20695 18941/23831/20698 18937/23832/20699
+f 18937/23832/20699 18941/23831/20698 27079/23833/20700 27080/23834/20701
+f 18936/23828/20695 28379/23830/20697 28380/23835/20702 18941/23831/20698
+f 18941/23831/20698 28380/23835/20702 31218/23836/20703 27079/23833/20700
+f 18934/23823/20690 18937/23832/20699 18942/23837/20704 18938/23824/20691
+f 18938/23824/20691 18942/23837/20704 28377/23819/20686 28376/23814/20681
+f 18937/23832/20699 27080/23834/20701 27081/23838/20705 18942/23837/20704
+f 18942/23837/20704 27081/23838/20705 31217/23820/20687 28377/23819/20686
+f 18943/23839/20706 18947/23840/20707 18948/23841/20708 18944/23842/20709
+f 18944/23842/20709 18948/23841/20708 27012/23466/20337 27011/23462/20333
+f 18947/23840/20707 28379/23830/20697 28378/23829/20696 18948/23841/20708
+f 18948/23841/20708 28378/23829/20696 31194/23448/20319 27012/23466/20337
+f 18943/23839/20706 18944/23842/20709 18949/23843/20710 18945/23844/20711
+f 18945/23844/20711 18949/23843/20710 28381/23845/20712 28382/23846/20713
+f 18944/23842/20709 27011/23462/20333 27010/23461/20332 18949/23843/20710
+f 18949/23843/20710 27010/23461/20332 31195/23464/20335 28381/23845/20712
+f 18943/23839/20706 18945/23844/20711 18950/23847/20714 18946/23848/20715
+f 18946/23848/20715 18950/23847/20714 27082/23849/20716 27083/23850/20717
+f 18945/23844/20711 28382/23846/20713 28383/23851/20718 18950/23847/20714
+f 18950/23847/20714 28383/23851/20718 31219/23852/20719 27082/23849/20716
+f 18943/23839/20706 18946/23848/20715 18951/23853/20720 18947/23840/20707
+f 18947/23840/20707 18951/23853/20720 28380/23835/20702 28379/23830/20697
+f 18946/23848/20715 27083/23850/20717 27084/23854/20721 18951/23853/20720
+f 18951/23853/20720 27084/23854/20721 31218/23836/20703 28380/23835/20702
+f 18952/23855/20722 18956/23856/20723 18957/23857/20724 18953/23858/20725
+f 18953/23858/20725 18957/23857/20724 27015/23482/20353 27014/23478/20349
+f 18956/23856/20723 28382/23846/20713 28381/23845/20712 18957/23857/20724
+f 18957/23857/20724 28381/23845/20712 31195/23464/20335 27015/23482/20353
+f 18952/23855/20722 18953/23858/20725 18958/23859/20726 18954/23860/20727
+f 18954/23860/20727 18958/23859/20726 28384/23861/20728 28385/23862/20729
+f 18953/23858/20725 27014/23478/20349 27013/23477/20348 18958/23859/20726
+f 18958/23859/20726 27013/23477/20348 31196/23480/20351 28384/23861/20728
+f 18952/23855/20722 18954/23860/20727 18959/23863/20730 18955/23864/20731
+f 18955/23864/20731 18959/23863/20730 27085/23865/20732 27086/23866/20733
+f 18954/23860/20727 28385/23862/20729 28386/23867/20734 18959/23863/20730
+f 18959/23863/20730 28386/23867/20734 31220/23868/20735 27085/23865/20732
+f 18952/23855/20722 18955/23864/20731 18960/23869/20736 18956/23856/20723
+f 18956/23856/20723 18960/23869/20736 28383/23851/20718 28382/23846/20713
+f 18955/23864/20731 27086/23866/20733 27087/23870/20737 18960/23869/20736
+f 18960/23869/20736 27087/23870/20737 31219/23852/20719 28383/23851/20718
+f 18961/23871/20738 18965/23872/20739 18966/23873/20740 18962/23874/20741
+f 18962/23874/20741 18966/23873/20740 27018/23494/20365 27017/23492/20363
+f 18965/23872/20739 28385/23862/20729 28384/23861/20728 18966/23873/20740
+f 18966/23873/20740 28384/23861/20728 31196/23480/20351 27018/23494/20365
+f 18961/23871/20738 18962/23874/20741 18967/23875/20742 18963/23876/20743
+f 18963/23876/20743 18967/23875/20742 28317/23500/20371 28316/23499/20370
+f 18962/23874/20741 27017/23492/20363 27016/23491/20362 18967/23875/20742
+f 18967/23875/20742 27016/23491/20362 31173/23126/20001 28317/23500/20371
+f 18961/23871/20738 18963/23876/20743 18968/23877/20744 18964/23878/20745
+f 18964/23878/20745 18968/23877/20744 27088/23879/20746 27089/23880/20747
+f 18963/23876/20743 28316/23499/20370 28315/23512/20383 18968/23877/20744
+f 18968/23877/20744 28315/23512/20383 31197/23514/20385 27088/23879/20746
+f 18961/23871/20738 18964/23878/20745 18969/23881/20748 18965/23872/20739
+f 18965/23872/20739 18969/23881/20748 28386/23867/20734 28385/23862/20729
+f 18964/23878/20745 27089/23880/20747 27090/23882/20749 18969/23881/20748
+f 18969/23881/20748 27090/23882/20749 31220/23868/20735 28386/23867/20734
+f 18970/23883/20750 18974/23884/20751 18975/23885/20752 18971/23886/20753
+f 18971/23886/20753 18975/23885/20752 27021/23513/20384 27020/23508/20379
+f 18974/23884/20751 28388/23887/20754 28389/23888/20755 18975/23885/20752
+f 18975/23885/20752 28389/23888/20755 31197/23514/20385 27021/23513/20384
+f 18970/23883/20750 18971/23886/20753 18976/23889/20756 18972/23890/20757
+f 18972/23890/20757 18976/23889/20756 28390/23891/20758 28391/23892/20759
+f 18971/23886/20753 27020/23508/20379 27019/23507/20378 18976/23889/20756
+f 18976/23889/20756 27019/23507/20378 31198/23510/20381 28390/23891/20758
+f 18970/23883/20750 18972/23890/20757 18977/23893/20760 18973/23894/20761
+f 18973/23894/20761 18977/23893/20760 27091/23895/20762 27092/23896/20763
+f 18972/23890/20757 28391/23892/20759 28392/23897/20764 18977/23893/20760
+f 18977/23893/20760 28392/23897/20764 31222/23898/20765 27091/23895/20762
+f 18970/23883/20750 18973/23894/20761 18978/23899/20766 18974/23884/20751
+f 18974/23884/20751 18978/23899/20766 28387/23900/20767 28388/23887/20754
+f 18973/23894/20761 27092/23896/20763 27093/23901/20768 18978/23899/20766
+f 18978/23899/20766 27093/23901/20768 31221/23902/20769 28387/23900/20767
+f 18979/23903/20770 18983/23904/20771 18984/23905/20772 18980/23906/20773
+f 18980/23906/20773 18984/23905/20772 27024/23530/20401 27023/23526/20397
+f 18983/23904/20771 28391/23892/20759 28390/23891/20758 18984/23905/20772
+f 18984/23905/20772 28390/23891/20758 31198/23510/20381 27024/23530/20401
+f 18979/23903/20770 18980/23906/20773 18985/23907/20774 18981/23908/20775
+f 18981/23908/20775 18985/23907/20774 28393/23909/20776 28394/23910/20777
+f 18980/23906/20773 27023/23526/20397 27022/23525/20396 18985/23907/20774
+f 18985/23907/20774 27022/23525/20396 31199/23528/20399 28393/23909/20776
+f 18979/23903/20770 18981/23908/20775 18986/23911/20778 18982/23912/20779
+f 18982/23912/20779 18986/23911/20778 27094/23913/20780 27095/23914/20781
+f 18981/23908/20775 28394/23910/20777 28395/23915/20782 18986/23911/20778
+f 18986/23911/20778 28395/23915/20782 31223/23916/20783 27094/23913/20780
+f 18979/23903/20770 18982/23912/20779 18987/23917/20784 18983/23904/20771
+f 18983/23904/20771 18987/23917/20784 28392/23897/20764 28391/23892/20759
+f 18982/23912/20779 27095/23914/20781 27096/23918/20785 18987/23917/20784
+f 18987/23917/20784 27096/23918/20785 31222/23898/20765 28392/23897/20764
+f 18988/23919/20786 18992/23920/20787 18993/23921/20788 18989/23922/20789
+f 18989/23922/20789 18993/23921/20788 27027/23546/20417 27026/23542/20413
+f 18992/23920/20787 28394/23910/20777 28393/23909/20776 18993/23921/20788
+f 18993/23921/20788 28393/23909/20776 31199/23528/20399 27027/23546/20417
+f 18988/23919/20786 18989/23922/20789 18994/23923/20790 18990/23924/20791
+f 18990/23924/20791 18994/23923/20790 28396/23925/20792 28397/23926/20793
+f 18989/23922/20789 27026/23542/20413 27025/23541/20412 18994/23923/20790
+f 18994/23923/20790 27025/23541/20412 31200/23544/20415 28396/23925/20792
+f 18988/23919/20786 18990/23924/20791 18995/23927/20794 18991/23928/20795
+f 18991/23928/20795 18995/23927/20794 27097/23929/20796 27098/23930/20797
+f 18990/23924/20791 28397/23926/20793 28398/23931/20798 18995/23927/20794
+f 18995/23927/20794 28398/23931/20798 31224/23932/20799 27097/23929/20796
+f 18988/23919/20786 18991/23928/20795 18996/23933/20800 18992/23920/20787
+f 18992/23920/20787 18996/23933/20800 28395/23915/20782 28394/23910/20777
+f 18991/23928/20795 27098/23930/20797 27099/23934/20801 18996/23933/20800
+f 18996/23933/20800 27099/23934/20801 31223/23916/20783 28395/23915/20782
+f 18997/23935/20802 19001/23936/20803 19002/23937/20804 18998/23938/20805
+f 18998/23938/20805 19002/23937/20804 27030/23562/20433 27029/23558/20429
+f 19001/23936/20803 28397/23926/20793 28396/23925/20792 19002/23937/20804
+f 19002/23937/20804 28396/23925/20792 31200/23544/20415 27030/23562/20433
+f 18997/23935/20802 18998/23938/20805 19003/23939/20806 18999/23940/20807
+f 18999/23940/20807 19003/23939/20806 28399/23941/20808 28400/23942/20809
+f 18998/23938/20805 27029/23558/20429 27028/23557/20428 19003/23939/20806
+f 19003/23939/20806 27028/23557/20428 31201/23560/20431 28399/23941/20808
+f 18997/23935/20802 18999/23940/20807 19004/23943/20810 19000/23944/20811
+f 19000/23944/20811 19004/23943/20810 27100/23945/20812 27101/23946/20813
+f 18999/23940/20807 28400/23942/20809 28401/23947/20814 19004/23943/20810
+f 19004/23943/20810 28401/23947/20814 31225/23948/20815 27100/23945/20812
+f 18997/23935/20802 19000/23944/20811 19005/23949/20816 19001/23936/20803
+f 19001/23936/20803 19005/23949/20816 28398/23931/20798 28397/23926/20793
+f 19000/23944/20811 27101/23946/20813 27102/23950/20817 19005/23949/20816
+f 19005/23949/20816 27102/23950/20817 31224/23932/20799 28398/23931/20798
+f 19006/23951/20818 19010/23952/20819 19011/23953/20820 19007/23954/20821
+f 19007/23954/20821 19011/23953/20820 27033/23578/20449 27032/23574/20445
+f 19010/23952/20819 28400/23942/20809 28399/23941/20808 19011/23953/20820
+f 19011/23953/20820 28399/23941/20808 31201/23560/20431 27033/23578/20449
+f 19006/23951/20818 19007/23954/20821 19012/23955/20822 19008/23956/20823
+f 19008/23956/20823 19012/23955/20822 28402/23957/20824 28403/23958/20825
+f 19007/23954/20821 27032/23574/20445 27031/23573/20444 19012/23955/20822
+f 19012/23955/20822 27031/23573/20444 31202/23576/20447 28402/23957/20824
+f 19006/23951/20818 19008/23956/20823 19013/23959/20826 19009/23960/20827
+f 19009/23960/20827 19013/23959/20826 27103/23961/20828 27104/23962/20829
+f 19008/23956/20823 28403/23958/20825 28404/23963/20830 19013/23959/20826
+f 19013/23959/20826 28404/23963/20830 31226/23964/20831 27103/23961/20828
+f 19006/23951/20818 19009/23960/20827 19014/23965/20832 19010/23952/20819
+f 19010/23952/20819 19014/23965/20832 28401/23947/20814 28400/23942/20809
+f 19009/23960/20827 27104/23962/20829 27105/23966/20833 19014/23965/20832
+f 19014/23965/20832 27105/23966/20833 31225/23948/20815 28401/23947/20814
+f 19015/23967/20834 19019/23968/20835 19020/23969/20836 19016/23970/20837
+f 19016/23970/20837 19020/23969/20836 27036/23594/20465 27035/23590/20461
+f 19019/23968/20835 28403/23958/20825 28402/23957/20824 19020/23969/20836
+f 19020/23969/20836 28402/23957/20824 31202/23576/20447 27036/23594/20465
+f 19015/23967/20834 19016/23970/20837 19021/23971/20838 19017/23972/20839
+f 19017/23972/20839 19021/23971/20838 28405/23973/20840 28406/23974/20841
+f 19016/23970/20837 27035/23590/20461 27034/23589/20460 19021/23971/20838
+f 19021/23971/20838 27034/23589/20460 31203/23592/20463 28405/23973/20840
+f 19015/23967/20834 19017/23972/20839 19022/23975/20842 19018/23976/20843
+f 19018/23976/20843 19022/23975/20842 27106/23977/20844 27107/23978/20845
+f 19017/23972/20839 28406/23974/20841 28407/23979/20846 19022/23975/20842
+f 19022/23975/20842 28407/23979/20846 31227/23980/20847 27106/23977/20844
+f 19015/23967/20834 19018/23976/20843 19023/23981/20848 19019/23968/20835
+f 19019/23968/20835 19023/23981/20848 28404/23963/20830 28403/23958/20825
+f 19018/23976/20843 27107/23978/20845 27108/23982/20849 19023/23981/20848
+f 19023/23981/20848 27108/23982/20849 31226/23964/20831 28404/23963/20830
+f 19024/23983/20850 19028/23984/20851 19029/23985/20852 19025/23986/20853
+f 19025/23986/20853 19029/23985/20852 27039/23610/20481 27038/23606/20477
+f 19028/23984/20851 28406/23974/20841 28405/23973/20840 19029/23985/20852
+f 19029/23985/20852 28405/23973/20840 31203/23592/20463 27039/23610/20481
+f 19024/23983/20850 19025/23986/20853 19030/23987/20854 19026/23988/20855
+f 19026/23988/20855 19030/23987/20854 28408/23989/20856 28409/23990/20857
+f 19025/23986/20853 27038/23606/20477 27037/23605/20476 19030/23987/20854
+f 19030/23987/20854 27037/23605/20476 31204/23608/20479 28408/23989/20856
+f 19024/23983/20850 19026/23988/20855 19031/23991/20858 19027/23992/20859
+f 19027/23992/20859 19031/23991/20858 27109/23993/20860 27110/23994/20861
+f 19026/23988/20855 28409/23990/20857 28410/23995/20862 19031/23991/20858
+f 19031/23991/20858 28410/23995/20862 31228/23996/20863 27109/23993/20860
+f 19024/23983/20850 19027/23992/20859 19032/23997/20864 19028/23984/20851
+f 19028/23984/20851 19032/23997/20864 28407/23979/20846 28406/23974/20841
+f 19027/23992/20859 27110/23994/20861 27111/23998/20865 19032/23997/20864
+f 19032/23997/20864 27111/23998/20865 31227/23980/20847 28407/23979/20846
+f 19033/23999/20866 19037/24000/20867 19038/24001/20868 19034/24002/20869
+f 19034/24002/20869 19038/24001/20868 27042/23626/20497 27041/23622/20493
+f 19037/24000/20867 28409/23990/20857 28408/23989/20856 19038/24001/20868
+f 19038/24001/20868 28408/23989/20856 31204/23608/20479 27042/23626/20497
+f 19033/23999/20866 19034/24002/20869 19039/24003/20870 19035/24004/20871
+f 19035/24004/20871 19039/24003/20870 28411/24005/20872 28412/24006/20873
+f 19034/24002/20869 27041/23622/20493 27040/23621/20492 19039/24003/20870
+f 19039/24003/20870 27040/23621/20492 31205/23624/20495 28411/24005/20872
+f 19033/23999/20866 19035/24004/20871 19040/24007/20874 19036/24008/20875
+f 19036/24008/20875 19040/24007/20874 27112/24009/20876 27113/24010/20877
+f 19035/24004/20871 28412/24006/20873 28413/24011/20878 19040/24007/20874
+f 19040/24007/20874 28413/24011/20878 31229/24012/20879 27112/24009/20876
+f 19033/23999/20866 19036/24008/20875 19041/24013/20880 19037/24000/20867
+f 19037/24000/20867 19041/24013/20880 28410/23995/20862 28409/23990/20857
+f 19036/24008/20875 27113/24010/20877 27114/24014/20881 19041/24013/20880
+f 19041/24013/20880 27114/24014/20881 31228/23996/20863 28410/23995/20862
+f 19042/24015/20882 19046/24016/20883 19047/24017/20884 19043/24018/20885
+f 19043/24018/20885 19047/24017/20884 27045/23642/20513 27044/23638/20509
+f 19046/24016/20883 28412/24006/20873 28411/24005/20872 19047/24017/20884
+f 19047/24017/20884 28411/24005/20872 31205/23624/20495 27045/23642/20513
+f 19042/24015/20882 19043/24018/20885 19048/24019/20886 19044/24020/20887
+f 19044/24020/20887 19048/24019/20886 28414/24021/20888 28415/24022/20889
+f 19043/24018/20885 27044/23638/20509 27043/23637/20508 19048/24019/20886
+f 19048/24019/20886 27043/23637/20508 31206/23640/20511 28414/24021/20888
+f 19042/24015/20882 19044/24020/20887 19049/24023/20890 19045/24024/20891
+f 19045/24024/20891 19049/24023/20890 27115/24025/20892 27116/24026/20893
+f 19044/24020/20887 28415/24022/20889 28416/24027/20894 19049/24023/20890
+f 19049/24023/20890 28416/24027/20894 31230/24028/20895 27115/24025/20892
+f 19042/24015/20882 19045/24024/20891 19050/24029/20896 19046/24016/20883
+f 19046/24016/20883 19050/24029/20896 28413/24011/20878 28412/24006/20873
+f 19045/24024/20891 27116/24026/20893 27117/24030/20897 19050/24029/20896
+f 19050/24029/20896 27117/24030/20897 31229/24012/20879 28413/24011/20878
+f 19051/24031/20898 19055/24032/20899 19056/24033/20900 19052/24034/20901
+f 19052/24034/20901 19056/24033/20900 27048/23658/20529 27047/23654/20525
+f 19055/24032/20899 28415/24022/20889 28414/24021/20888 19056/24033/20900
+f 19056/24033/20900 28414/24021/20888 31206/23640/20511 27048/23658/20529
+f 19051/24031/20898 19052/24034/20901 19057/24035/20902 19053/24036/20903
+f 19053/24036/20903 19057/24035/20902 28417/24037/20904 28418/24038/20905
+f 19052/24034/20901 27047/23654/20525 27046/23653/20524 19057/24035/20902
+f 19057/24035/20902 27046/23653/20524 31207/23656/20527 28417/24037/20904
+f 19051/24031/20898 19053/24036/20903 19058/24039/20906 19054/24040/20907
+f 19054/24040/20907 19058/24039/20906 27118/24041/20908 27119/24042/20909
+f 19053/24036/20903 28418/24038/20905 28419/24043/20910 19058/24039/20906
+f 19058/24039/20906 28419/24043/20910 31231/24044/20911 27118/24041/20908
+f 19051/24031/20898 19054/24040/20907 19059/24045/20912 19055/24032/20899
+f 19055/24032/20899 19059/24045/20912 28416/24027/20894 28415/24022/20889
+f 19054/24040/20907 27119/24042/20909 27120/24046/20913 19059/24045/20912
+f 19059/24045/20912 27120/24046/20913 31230/24028/20895 28416/24027/20894
+f 19060/24047/20914 19064/24048/20915 19065/24049/20916 19061/24050/20917
+f 19061/24050/20917 19065/24049/20916 27051/23674/20545 27050/23670/20541
+f 19064/24048/20915 28418/24038/20905 28417/24037/20904 19065/24049/20916
+f 19065/24049/20916 28417/24037/20904 31207/23656/20527 27051/23674/20545
+f 19060/24047/20914 19061/24050/20917 19066/24051/20918 19062/24052/20919
+f 19062/24052/20919 19066/24051/20918 28420/24053/20920 28421/24054/20921
+f 19061/24050/20917 27050/23670/20541 27049/23669/20540 19066/24051/20918
+f 19066/24051/20918 27049/23669/20540 31208/23672/20543 28420/24053/20920
+f 19060/24047/20914 19062/24052/20919 19067/24055/20922 19063/24056/20923
+f 19063/24056/20923 19067/24055/20922 27121/24057/20924 27122/24058/20925
+f 19062/24052/20919 28421/24054/20921 28422/24059/20926 19067/24055/20922
+f 19067/24055/20922 28422/24059/20926 31232/24060/18067 27121/24057/20924
+f 19060/24047/20914 19063/24056/20923 19068/24061/20927 19064/24048/20915
+f 19064/24048/20915 19068/24061/20927 28419/24043/20910 28418/24038/20905
+f 19063/24056/20923 27122/24058/20925 27123/24062/20928 19068/24061/20927
+f 19068/24061/20927 27123/24062/20928 31231/24044/20911 28419/24043/20910
+f 19069/24063/20929 19073/24064/20930 19074/24065/20931 19070/24066/20932
+f 19070/24066/20932 19074/24065/20931 27054/23690/20561 27053/23686/20557
+f 19073/24064/20930 28421/24054/20921 28420/24053/20920 19074/24065/20931
+f 19074/24065/20931 28420/24053/20920 31208/23672/20543 27054/23690/20561
+f 19069/24063/20929 19070/24066/20932 19075/24067/20933 19071/24068/20934
+f 19071/24068/20934 19075/24067/20933 28423/24069/20935 28424/24070/20936
+f 19070/24066/20932 27053/23686/20557 27052/23685/20556 19075/24067/20933
+f 19075/24067/20933 27052/23685/20556 31209/23688/20559 28423/24069/20935
+f 19069/24063/20929 19071/24068/20934 19076/24071/20937 19072/24072/20938
+f 19072/24072/20938 19076/24071/20937 27124/24073/20939 27125/24074/20940
+f 19071/24068/20934 28424/24070/20936 28425/24075/20941 19076/24071/20937
+f 19076/24071/20937 28425/24075/20941 31233/24076/20942 27124/24073/20939
+f 19069/24063/20929 19072/24072/20938 19077/24077/20943 19073/24064/20930
+f 19073/24064/20930 19077/24077/20943 28422/24059/20926 28421/24054/20921
+f 19072/24072/20938 27125/24074/20940 27126/24078/20944 19077/24077/20943
+f 19077/24077/20943 27126/24078/20944 31232/24060/18067 28422/24059/20926
+f 19078/24079/20945 19082/24080/20946 19083/24081/20947 19079/24082/20948
+f 19079/24082/20948 19083/24081/20947 27057/23706/20577 27056/23702/20573
+f 19082/24080/20946 28424/24070/20936 28423/24069/20935 19083/24081/20947
+f 19083/24081/20947 28423/24069/20935 31209/23688/20559 27057/23706/20577
+f 19078/24079/20945 19079/24082/20948 19084/24083/20949 19080/24084/20950
+f 19080/24084/20950 19084/24083/20949 28426/24085/20951 28427/24086/20952
+f 19079/24082/20948 27056/23702/20573 27055/23701/20572 19084/24083/20949
+f 19084/24083/20949 27055/23701/20572 31210/23704/20575 28426/24085/20951
+f 19078/24079/20945 19080/24084/20950 19085/24087/20953 19081/24088/20954
+f 19081/24088/20954 19085/24087/20953 27127/24089/20955 27128/24090/20956
+f 19080/24084/20950 28427/24086/20952 28428/24091/20957 19085/24087/20953
+f 19085/24087/20953 28428/24091/20957 31234/24092/20958 27127/24089/20955
+f 19078/24079/20945 19081/24088/20954 19086/24093/20959 19082/24080/20946
+f 19082/24080/20946 19086/24093/20959 28425/24075/20941 28424/24070/20936
+f 19081/24088/20954 27128/24090/20956 27129/24094/20960 19086/24093/20959
+f 19086/24093/20959 27129/24094/20960 31233/24076/20942 28425/24075/20941
+f 19087/24095/20961 19091/24096/20962 19092/24097/20963 19088/24098/20964
+f 19088/24098/20964 19092/24097/20963 27060/23722/20593 27059/23718/20589
+f 19091/24096/20962 28427/24086/20952 28426/24085/20951 19092/24097/20963
+f 19092/24097/20963 28426/24085/20951 31210/23704/20575 27060/23722/20593
+f 19087/24095/20961 19088/24098/20964 19093/24099/20965 19089/24100/20966
+f 19089/24100/20966 19093/24099/20965 28429/24101/20967 28430/24102/20968
+f 19088/24098/20964 27059/23718/20589 27058/23717/20588 19093/24099/20965
+f 19093/24099/20965 27058/23717/20588 31211/23720/20591 28429/24101/20967
+f 19087/24095/20961 19089/24100/20966 19094/24103/20969 19090/24104/20970
+f 19090/24104/20970 19094/24103/20969 27130/24105/20971 27131/24106/20972
+f 19089/24100/20966 28430/24102/20968 28431/24107/20973 19094/24103/20969
+f 19094/24103/20969 28431/24107/20973 31235/24108/20974 27130/24105/20971
+f 19087/24095/20961 19090/24104/20970 19095/24109/20975 19091/24096/20962
+f 19091/24096/20962 19095/24109/20975 28428/24091/20957 28427/24086/20952
+f 19090/24104/20970 27131/24106/20972 27132/24110/20976 19095/24109/20975
+f 19095/24109/20975 27132/24110/20976 31234/24092/20958 28428/24091/20957
+f 19096/24111/20977 19100/24112/20978 19101/24113/20979 19097/24114/20980
+f 19097/24114/20980 19101/24113/20979 27063/23738/20609 27062/23734/20605
+f 19100/24112/20978 28430/24102/20968 28429/24101/20967 19101/24113/20979
+f 19101/24113/20979 28429/24101/20967 31211/23720/20591 27063/23738/20609
+f 19096/24111/20977 19097/24114/20980 19102/24115/20981 19098/24116/20982
+f 19098/24116/20982 19102/24115/20981 28432/24117/20983 28433/24118/20984
+f 19097/24114/20980 27062/23734/20605 27061/23733/20604 19102/24115/20981
+f 19102/24115/20981 27061/23733/20604 31212/23736/20607 28432/24117/20983
+f 19096/24111/20977 19098/24116/20982 19103/24119/20985 19099/24120/20986
+f 19099/24120/20986 19103/24119/20985 27133/24121/20987 27134/24122/20988
+f 19098/24116/20982 28433/24118/20984 28434/24123/20989 19103/24119/20985
+f 19103/24119/20985 28434/24123/20989 31236/24124/20990 27133/24121/20987
+f 19096/24111/20977 19099/24120/20986 19104/24125/20991 19100/24112/20978
+f 19100/24112/20978 19104/24125/20991 28431/24107/20973 28430/24102/20968
+f 19099/24120/20986 27134/24122/20988 27135/24126/20992 19104/24125/20991
+f 19104/24125/20991 27135/24126/20992 31235/24108/20974 28431/24107/20973
+f 19105/24127/20993 19109/24128/20994 19110/24129/20995 19106/24130/20996
+f 19106/24130/20996 19110/24129/20995 27066/23754/20625 27065/23750/20621
+f 19109/24128/20994 28433/24118/20984 28432/24117/20983 19110/24129/20995
+f 19110/24129/20995 28432/24117/20983 31212/23736/20607 27066/23754/20625
+f 19105/24127/20993 19106/24130/20996 19111/24131/20997 19107/24132/20998
+f 19107/24132/20998 19111/24131/20997 28435/24133/20999 28436/24134/21000
+f 19106/24130/20996 27065/23750/20621 27064/23749/20620 19111/24131/20997
+f 19111/24131/20997 27064/23749/20620 31213/23752/20623 28435/24133/20999
+f 19105/24127/20993 19107/24132/20998 19112/24135/21001 19108/24136/21002
+f 19108/24136/21002 19112/24135/21001 27136/24137/21003 27137/24138/21004
+f 19107/24132/20998 28436/24134/21000 28437/24139/21005 19112/24135/21001
+f 19112/24135/21001 28437/24139/21005 31237/24140/21006 27136/24137/21003
+f 19105/24127/20993 19108/24136/21002 19113/24141/21007 19109/24128/20994
+f 19109/24128/20994 19113/24141/21007 28434/24123/20989 28433/24118/20984
+f 19108/24136/21002 27137/24138/21004 27138/24142/21008 19113/24141/21007
+f 19113/24141/21007 27138/24142/21008 31236/24124/20990 28434/24123/20989
+f 19114/24143/21009 19118/24144/21010 19119/24145/21011 19115/24146/21012
+f 19115/24146/21012 19119/24145/21011 27069/23770/20641 27068/23766/20637
+f 19118/24144/21010 28436/24134/21000 28435/24133/20999 19119/24145/21011
+f 19119/24145/21011 28435/24133/20999 31213/23752/20623 27069/23770/20641
+f 19114/24143/21009 19115/24146/21012 19120/24147/21013 19116/24148/21014
+f 19116/24148/21014 19120/24147/21013 28438/24149/21015 28439/24150/21016
+f 19115/24146/21012 27068/23766/20637 27067/23765/20636 19120/24147/21013
+f 19120/24147/21013 27067/23765/20636 31214/23768/20639 28438/24149/21015
+f 19114/24143/21009 19116/24148/21014 19121/24151/21017 19117/24152/21018
+f 19117/24152/21018 19121/24151/21017 27139/24153/21019 27140/24154/21020
+f 19116/24148/21014 28439/24150/21016 28440/24155/21021 19121/24151/21017
+f 19121/24151/21017 28440/24155/21021 31238/24156/21022 27139/24153/21019
+f 19114/24143/21009 19117/24152/21018 19122/24157/21023 19118/24144/21010
+f 19118/24144/21010 19122/24157/21023 28437/24139/21005 28436/24134/21000
+f 19117/24152/21018 27140/24154/21020 27141/24158/21024 19122/24157/21023
+f 19122/24157/21023 27141/24158/21024 31237/24140/21006 28437/24139/21005
+f 19123/24159/21025 19127/24160/21026 19128/24161/21027 19124/24162/21028
+f 19124/24162/21028 19128/24161/21027 27072/23789/20657 27071/23784/20653
+f 19127/24160/21026 28439/24163/21016 28438/24164/21015 19128/24161/21027
+f 19128/24161/21027 28438/24164/21015 31214/23790/20639 27072/23789/20657
+f 19123/24159/21025 19124/24162/21028 19129/24165/21029 19125/24166/21030
+f 19125/24166/21030 19129/24165/21029 28441/24167/21031 28442/24168/21032
+f 19124/24162/21028 27071/23784/20653 27070/23783/20652 19129/24165/21029
+f 19129/24165/21029 27070/23783/20652 31215/23786/20655 28441/24167/21031
+f 19123/24159/21025 19125/24166/21030 19130/24169/21033 19126/24170/21034
+f 19126/24170/21034 19130/24169/21033 27142/24171/21035 27143/24172/21036
+f 19125/24166/21030 28442/24168/21032 28443/24173/21037 19130/24169/21033
+f 19130/24169/21033 28443/24173/21037 31239/24174/21038 27142/24171/21035
+f 19123/24159/21025 19126/24170/21034 19131/24175/21039 19127/24160/21026
+f 19127/24160/21026 19131/24175/21039 28440/24176/21021 28439/24163/21016
+f 19126/24170/21034 27143/24172/21036 27144/24177/21040 19131/24175/21039
+f 19131/24175/21039 27144/24177/21040 31238/24178/21022 28440/24176/21021
+f 19132/24179/21041 19136/24180/21042 19137/24181/21043 19133/24182/21044
+f 19133/24182/21044 19137/24181/21043 27075/23806/20673 27074/23802/20669
+f 19136/24180/21042 28442/24168/21032 28441/24167/21031 19137/24181/21043
+f 19137/24181/21043 28441/24167/21031 31215/23786/20655 27075/23806/20673
+f 19132/24179/21041 19133/24182/21044 19138/24183/21045 19134/24184/21046
+f 19134/24184/21046 19138/24183/21045 28444/24185/21047 28445/24186/21048
+f 19133/24182/21044 27074/23802/20669 27073/23801/20668 19138/24183/21045
+f 19138/24183/21045 27073/23801/20668 31216/23804/20671 28444/24185/21047
+f 19132/24179/21041 19134/24184/21046 19139/24187/21049 19135/24188/21050
+f 19135/24188/21050 19139/24187/21049 27145/24189/21051 27146/24190/21052
+f 19134/24184/21046 28445/24186/21048 28446/24191/21053 19139/24187/21049
+f 19139/24187/21049 28446/24191/21053 31240/24192/21054 27145/24189/21051
+f 19132/24179/21041 19135/24188/21050 19140/24193/21055 19136/24180/21042
+f 19136/24180/21042 19140/24193/21055 28443/24173/21037 28442/24168/21032
+f 19135/24188/21050 27146/24190/21052 27147/24194/21056 19140/24193/21055
+f 19140/24193/21055 27147/24194/21056 31239/24174/21038 28443/24173/21037
+f 19141/24195/21057 19145/24196/21058 19146/24197/21059 19142/24198/21060
+f 19142/24198/21060 19146/24197/21059 27078/23822/20689 27077/23818/20685
+f 19145/24196/21058 28445/24186/21048 28444/24185/21047 19146/24197/21059
+f 19146/24197/21059 28444/24185/21047 31216/23804/20671 27078/23822/20689
+f 19141/24195/21057 19142/24198/21060 19147/24199/21061 19143/24200/21062
+f 19143/24200/21062 19147/24199/21061 28447/24201/21063 28448/24202/21064
+f 19142/24198/21060 27077/23818/20685 27076/23817/20684 19147/24199/21061
+f 19147/24199/21061 27076/23817/20684 31217/23820/20687 28447/24201/21063
+f 19141/24195/21057 19143/24200/21062 19148/24203/21065 19144/24204/21066
+f 19144/24204/21066 19148/24203/21065 27148/24205/21067 27149/24206/21068
+f 19143/24200/21062 28448/24202/21064 28449/24207/21069 19148/24203/21065
+f 19148/24203/21065 28449/24207/21069 31241/24208/21070 27148/24205/21067
+f 19141/24195/21057 19144/24204/21066 19149/24209/21071 19145/24196/21058
+f 19145/24196/21058 19149/24209/21071 28446/24191/21053 28445/24186/21048
+f 19144/24204/21066 27149/24206/21068 27150/24210/21072 19149/24209/21071
+f 19149/24209/21071 27150/24210/21072 31240/24192/21054 28446/24191/21053
+f 19150/24211/21073 19154/24212/21074 19155/24213/21075 19151/24214/21076
+f 19151/24214/21076 19155/24213/21075 27081/23838/20705 27080/23834/20701
+f 19154/24212/21074 28448/24202/21064 28447/24201/21063 19155/24213/21075
+f 19155/24213/21075 28447/24201/21063 31217/23820/20687 27081/23838/20705
+f 19150/24211/21073 19151/24214/21076 19156/24215/21077 19152/24216/21078
+f 19152/24216/21078 19156/24215/21077 28450/24217/21079 28451/24218/21080
+f 19151/24214/21076 27080/23834/20701 27079/23833/20700 19156/24215/21077
+f 19156/24215/21077 27079/23833/20700 31218/23836/20703 28450/24217/21079
+f 19150/24211/21073 19152/24216/21078 19157/24219/21081 19153/24220/21082
+f 19153/24220/21082 19157/24219/21081 27151/24221/21083 27152/24222/21084
+f 19152/24216/21078 28451/24218/21080 28452/24223/21085 19157/24219/21081
+f 19157/24219/21081 28452/24223/21085 31242/24224/21086 27151/24221/21083
+f 19150/24211/21073 19153/24220/21082 19158/24225/21087 19154/24212/21074
+f 19154/24212/21074 19158/24225/21087 28449/24207/21069 28448/24202/21064
+f 19153/24220/21082 27152/24222/21084 27153/24226/21088 19158/24225/21087
+f 19158/24225/21087 27153/24226/21088 31241/24208/21070 28449/24207/21069
+f 19159/24227/21089 19163/24228/21090 19164/24229/21091 19160/24230/21092
+f 19160/24230/21092 19164/24229/21091 27084/23854/20721 27083/23850/20717
+f 19163/24228/21090 28451/24218/21080 28450/24217/21079 19164/24229/21091
+f 19164/24229/21091 28450/24217/21079 31218/23836/20703 27084/23854/20721
+f 19159/24227/21089 19160/24230/21092 19165/24231/21093 19161/24232/21094
+f 19161/24232/21094 19165/24231/21093 28453/24233/21095 28454/24234/21096
+f 19160/24230/21092 27083/23850/20717 27082/23849/20716 19165/24231/21093
+f 19165/24231/21093 27082/23849/20716 31219/23852/20719 28453/24233/21095
+f 19159/24227/21089 19161/24232/21094 19166/24235/21097 19162/24236/21098
+f 19162/24236/21098 19166/24235/21097 27154/24237/21099 27155/24238/21100
+f 19161/24232/21094 28454/24234/21096 28455/24239/21101 19166/24235/21097
+f 19166/24235/21097 28455/24239/21101 31243/24240/21102 27154/24237/21099
+f 19159/24227/21089 19162/24236/21098 19167/24241/21103 19163/24228/21090
+f 19163/24228/21090 19167/24241/21103 28452/24223/21085 28451/24218/21080
+f 19162/24236/21098 27155/24238/21100 27156/24242/21104 19167/24241/21103
+f 19167/24241/21103 27156/24242/21104 31242/24224/21086 28452/24223/21085
+f 19168/24243/21105 19172/24244/21106 19173/24245/21107 19169/24246/21108
+f 19169/24246/21108 19173/24245/21107 27087/23870/20737 27086/23866/20733
+f 19172/24244/21106 28454/24234/21096 28453/24233/21095 19173/24245/21107
+f 19173/24245/21107 28453/24233/21095 31219/23852/20719 27087/23870/20737
+f 19168/24243/21105 19169/24246/21108 19174/24247/21109 19170/24248/21110
+f 19170/24248/21110 19174/24247/21109 28456/24249/21111 28457/24250/21112
+f 19169/24246/21108 27086/23866/20733 27085/23865/20732 19174/24247/21109
+f 19174/24247/21109 27085/23865/20732 31220/23868/20735 28456/24249/21111
+f 19168/24243/21105 19170/24248/21110 19175/24251/21113 19171/24252/21114
+f 19171/24252/21114 19175/24251/21113 27157/24253/21115 27158/24254/21116
+f 19170/24248/21110 28457/24250/21112 28458/24255/21117 19175/24251/21113
+f 19175/24251/21113 28458/24255/21117 31244/24256/18214 27157/24253/21115
+f 19168/24243/21105 19171/24252/21114 19176/24257/21118 19172/24244/21106
+f 19172/24244/21106 19176/24257/21118 28455/24239/21101 28454/24234/21096
+f 19171/24252/21114 27158/24254/21116 27159/24258/21119 19176/24257/21118
+f 19176/24257/21118 27159/24258/21119 31243/24240/21102 28455/24239/21101
+f 19177/24259/21120 19181/24260/21121 19182/24261/21122 19178/24262/21123
+f 19178/24262/21123 19182/24261/21122 27090/23882/20749 27089/23880/20747
+f 19181/24260/21121 28457/24250/21112 28456/24249/21111 19182/24261/21122
+f 19182/24261/21122 28456/24249/21111 31220/23868/20735 27090/23882/20749
+f 19177/24259/21120 19178/24262/21123 19183/24263/21124 19179/24264/21125
+f 19179/24264/21125 19183/24263/21124 28389/23888/20755 28388/23887/20754
+f 19178/24262/21123 27089/23880/20747 27088/23879/20746 19183/24263/21124
+f 19183/24263/21124 27088/23879/20746 31197/23514/20385 28389/23888/20755
+f 19177/24259/21120 19179/24264/21125 19184/24265/21126 19180/24266/21127
+f 19180/24266/21127 19184/24265/21126 27160/24267/21128 27161/24268/21129
+f 19179/24264/21125 28388/23887/20754 28387/23900/20767 19184/24265/21126
+f 19184/24265/21126 28387/23900/20767 31221/23902/20769 27160/24267/21128
+f 19177/24259/21120 19180/24266/21127 19185/24269/21130 19181/24260/21121
+f 19181/24260/21121 19185/24269/21130 28458/24255/21117 28457/24250/21112
+f 19180/24266/21127 27161/24268/21129 27162/24270/21131 19185/24269/21130
+f 19185/24269/21130 27162/24270/21131 31244/24256/18214 28458/24255/21117
+f 19186/24271/21132 19190/24272/21133 19191/24273/21134 19187/24274/21135
+f 19187/24274/21135 19191/24273/21134 27093/23901/20768 27092/23896/20763
+f 19190/24272/21133 28460/24275/21136 28461/24276/21137 19191/24273/21134
+f 19191/24273/21134 28461/24276/21137 31221/23902/20769 27093/23901/20768
+f 19186/24271/21132 19187/24274/21135 19192/24277/21138 19188/24278/21139
+f 19188/24278/21139 19192/24277/21138 28462/24279/21140 28463/24280/21141
+f 19187/24274/21135 27092/23896/20763 27091/23895/20762 19192/24277/21138
+f 19192/24277/21138 27091/23895/20762 31222/23898/20765 28462/24279/21140
+f 19186/24271/21132 19188/24278/21139 19193/24281/21142 19189/24282/21143
+f 19189/24282/21143 19193/24281/21142 27163/24283/21144 27164/24284/21145
+f 19188/24278/21139 28463/24280/21141 28464/24285/21146 19193/24281/21142
+f 19193/24281/21142 28464/24285/21146 31246/24286/21147 27163/24283/21144
+f 19186/24271/21132 19189/24282/21143 19194/24287/21148 19190/24272/21133
+f 19190/24272/21133 19194/24287/21148 28459/24288/21149 28460/24275/21136
+f 19189/24282/21143 27164/24284/21145 27165/24289/21150 19194/24287/21148
+f 19194/24287/21148 27165/24289/21150 31245/24290/21151 28459/24288/21149
+f 19195/24291/21152 19199/24292/21153 19200/24293/21154 19196/24294/21155
+f 19196/24294/21155 19200/24293/21154 27096/23918/20785 27095/23914/20781
+f 19199/24292/21153 28463/24280/21141 28462/24279/21140 19200/24293/21154
+f 19200/24293/21154 28462/24279/21140 31222/23898/20765 27096/23918/20785
+f 19195/24291/21152 19196/24294/21155 19201/24295/21156 19197/24296/21157
+f 19197/24296/21157 19201/24295/21156 28465/24297/21158 28466/24298/21159
+f 19196/24294/21155 27095/23914/20781 27094/23913/20780 19201/24295/21156
+f 19201/24295/21156 27094/23913/20780 31223/23916/20783 28465/24297/21158
+f 19195/24291/21152 19197/24296/21157 19202/24299/21160 19198/24300/21161
+f 19198/24300/21161 19202/24299/21160 27166/24301/21162 27167/24302/21163
+f 19197/24296/21157 28466/24298/21159 28467/24303/21164 19202/24299/21160
+f 19202/24299/21160 28467/24303/21164 31247/24304/21165 27166/24301/21162
+f 19195/24291/21152 19198/24300/21161 19203/24305/21166 19199/24292/21153
+f 19199/24292/21153 19203/24305/21166 28464/24285/21146 28463/24280/21141
+f 19198/24300/21161 27167/24302/21163 27168/24306/21167 19203/24305/21166
+f 19203/24305/21166 27168/24306/21167 31246/24286/21147 28464/24285/21146
+f 19204/24307/21168 19208/24308/21169 19209/24309/21170 19205/24310/21171
+f 19205/24310/21171 19209/24309/21170 27099/23934/20801 27098/23930/20797
+f 19208/24308/21169 28466/24298/21159 28465/24297/21158 19209/24309/21170
+f 19209/24309/21170 28465/24297/21158 31223/23916/20783 27099/23934/20801
+f 19204/24307/21168 19205/24310/21171 19210/24311/21172 19206/24312/21173
+f 19206/24312/21173 19210/24311/21172 28468/24313/21174 28469/24314/21175
+f 19205/24310/21171 27098/23930/20797 27097/23929/20796 19210/24311/21172
+f 19210/24311/21172 27097/23929/20796 31224/23932/20799 28468/24313/21174
+f 19204/24307/21168 19206/24312/21173 19211/24315/21176 19207/24316/21177
+f 19207/24316/21177 19211/24315/21176 27169/24317/21178 27170/24318/21179
+f 19206/24312/21173 28469/24314/21175 28470/24319/21180 19211/24315/21176
+f 19211/24315/21176 28470/24319/21180 31248/24320/21181 27169/24317/21178
+f 19204/24307/21168 19207/24316/21177 19212/24321/21182 19208/24308/21169
+f 19208/24308/21169 19212/24321/21182 28467/24303/21164 28466/24298/21159
+f 19207/24316/21177 27170/24318/21179 27171/24322/21183 19212/24321/21182
+f 19212/24321/21182 27171/24322/21183 31247/24304/21165 28467/24303/21164
+f 19213/24323/21184 19217/24324/21185 19218/24325/21186 19214/24326/21187
+f 19214/24326/21187 19218/24325/21186 27102/23950/20817 27101/23946/20813
+f 19217/24324/21185 28469/24314/21175 28468/24313/21174 19218/24325/21186
+f 19218/24325/21186 28468/24313/21174 31224/23932/20799 27102/23950/20817
+f 19213/24323/21184 19214/24326/21187 19219/24327/21188 19215/24328/21189
+f 19215/24328/21189 19219/24327/21188 28471/24329/21190 28472/24330/21191
+f 19214/24326/21187 27101/23946/20813 27100/23945/20812 19219/24327/21188
+f 19219/24327/21188 27100/23945/20812 31225/23948/20815 28471/24329/21190
+f 19213/24323/21184 19215/24328/21189 19220/24331/21192 19216/24332/21193
+f 19216/24332/21193 19220/24331/21192 27172/24333/21194 27173/24334/21195
+f 19215/24328/21189 28472/24330/21191 28473/24335/21196 19220/24331/21192
+f 19220/24331/21192 28473/24335/21196 31249/24336/21197 27172/24333/21194
+f 19213/24323/21184 19216/24332/21193 19221/24337/21198 19217/24324/21185
+f 19217/24324/21185 19221/24337/21198 28470/24319/21180 28469/24314/21175
+f 19216/24332/21193 27173/24334/21195 27174/24338/21199 19221/24337/21198
+f 19221/24337/21198 27174/24338/21199 31248/24320/21181 28470/24319/21180
+f 19222/24339/21200 19226/24340/21201 19227/24341/21202 19223/24342/21203
+f 19223/24342/21203 19227/24341/21202 27105/23966/20833 27104/23962/20829
+f 19226/24340/21201 28472/24330/21191 28471/24329/21190 19227/24341/21202
+f 19227/24341/21202 28471/24329/21190 31225/23948/20815 27105/23966/20833
+f 19222/24339/21200 19223/24342/21203 19228/24343/21204 19224/24344/21205
+f 19224/24344/21205 19228/24343/21204 28474/24345/21206 28475/24346/21207
+f 19223/24342/21203 27104/23962/20829 27103/23961/20828 19228/24343/21204
+f 19228/24343/21204 27103/23961/20828 31226/23964/20831 28474/24345/21206
+f 19222/24339/21200 19224/24344/21205 19229/24347/21208 19225/24348/21209
+f 19225/24348/21209 19229/24347/21208 27175/24349/21210 27176/24350/21211
+f 19224/24344/21205 28475/24346/21207 28476/24351/21212 19229/24347/21208
+f 19229/24347/21208 28476/24351/21212 31250/24352/21213 27175/24349/21210
+f 19222/24339/21200 19225/24348/21209 19230/24353/21214 19226/24340/21201
+f 19226/24340/21201 19230/24353/21214 28473/24335/21196 28472/24330/21191
+f 19225/24348/21209 27176/24350/21211 27177/24354/21215 19230/24353/21214
+f 19230/24353/21214 27177/24354/21215 31249/24336/21197 28473/24335/21196
+f 19231/24355/21216 19235/24356/21217 19236/24357/21218 19232/24358/21219
+f 19232/24358/21219 19236/24357/21218 27108/23982/20849 27107/23978/20845
+f 19235/24356/21217 28475/24346/21207 28474/24345/21206 19236/24357/21218
+f 19236/24357/21218 28474/24345/21206 31226/23964/20831 27108/23982/20849
+f 19231/24355/21216 19232/24358/21219 19237/24359/21220 19233/24360/21221
+f 19233/24360/21221 19237/24359/21220 28477/24361/21222 28478/24362/21223
+f 19232/24358/21219 27107/23978/20845 27106/23977/20844 19237/24359/21220
+f 19237/24359/21220 27106/23977/20844 31227/23980/20847 28477/24361/21222
+f 19231/24355/21216 19233/24360/21221 19238/24363/21224 19234/24364/21225
+f 19234/24364/21225 19238/24363/21224 27178/24365/21226 27179/24366/21227
+f 19233/24360/21221 28478/24362/21223 28479/24367/21228 19238/24363/21224
+f 19238/24363/21224 28479/24367/21228 31251/24368/21229 27178/24365/21226
+f 19231/24355/21216 19234/24364/21225 19239/24369/21230 19235/24356/21217
+f 19235/24356/21217 19239/24369/21230 28476/24351/21212 28475/24346/21207
+f 19234/24364/21225 27179/24366/21227 27180/24370/21231 19239/24369/21230
+f 19239/24369/21230 27180/24370/21231 31250/24352/21213 28476/24351/21212
+f 19240/24371/21232 19244/24372/21233 19245/24373/21234 19241/24374/21235
+f 19241/24374/21235 19245/24373/21234 27111/23998/20865 27110/23994/20861
+f 19244/24372/21233 28478/24362/21223 28477/24361/21222 19245/24373/21234
+f 19245/24373/21234 28477/24361/21222 31227/23980/20847 27111/23998/20865
+f 19240/24371/21232 19241/24374/21235 19246/24375/21236 19242/24376/21237
+f 19242/24376/21237 19246/24375/21236 28480/24377/21238 28481/24378/21239
+f 19241/24374/21235 27110/23994/20861 27109/23993/20860 19246/24375/21236
+f 19246/24375/21236 27109/23993/20860 31228/23996/20863 28480/24377/21238
+f 19240/24371/21232 19242/24376/21237 19247/24379/21240 19243/24380/21241
+f 19243/24380/21241 19247/24379/21240 27181/24381/21242 27182/24382/21243
+f 19242/24376/21237 28481/24378/21239 28482/24383/21244 19247/24379/21240
+f 19247/24379/21240 28482/24383/21244 31252/24384/21245 27181/24381/21242
+f 19240/24371/21232 19243/24380/21241 19248/24385/21246 19244/24372/21233
+f 19244/24372/21233 19248/24385/21246 28479/24367/21228 28478/24362/21223
+f 19243/24380/21241 27182/24382/21243 27183/24386/21247 19248/24385/21246
+f 19248/24385/21246 27183/24386/21247 31251/24368/21229 28479/24367/21228
+f 19249/24387/21248 19253/24388/21249 19254/24389/21250 19250/24390/21251
+f 19250/24390/21251 19254/24389/21250 27114/24014/20881 27113/24010/20877
+f 19253/24388/21249 28481/24378/21239 28480/24377/21238 19254/24389/21250
+f 19254/24389/21250 28480/24377/21238 31228/23996/20863 27114/24014/20881
+f 19249/24387/21248 19250/24390/21251 19255/24391/21252 19251/24392/21253
+f 19251/24392/21253 19255/24391/21252 28483/24393/21254 28484/24394/21255
+f 19250/24390/21251 27113/24010/20877 27112/24009/20876 19255/24391/21252
+f 19255/24391/21252 27112/24009/20876 31229/24012/20879 28483/24393/21254
+f 19249/24387/21248 19251/24392/21253 19256/24395/21256 19252/24396/21257
+f 19252/24396/21257 19256/24395/21256 27184/24397/21258 27185/24398/21259
+f 19251/24392/21253 28484/24394/21255 28485/24399/21260 19256/24395/21256
+f 19256/24395/21256 28485/24399/21260 31253/24400/21261 27184/24397/21258
+f 19249/24387/21248 19252/24396/21257 19257/24401/21262 19253/24388/21249
+f 19253/24388/21249 19257/24401/21262 28482/24383/21244 28481/24378/21239
+f 19252/24396/21257 27185/24398/21259 27186/24402/21263 19257/24401/21262
+f 19257/24401/21262 27186/24402/21263 31252/24384/21245 28482/24383/21244
+f 19258/24403/21264 19262/24404/21265 19263/24405/21266 19259/24406/21267
+f 19259/24406/21267 19263/24405/21266 27117/24030/20897 27116/24026/20893
+f 19262/24404/21265 28484/24394/21255 28483/24393/21254 19263/24405/21266
+f 19263/24405/21266 28483/24393/21254 31229/24012/20879 27117/24030/20897
+f 19258/24403/21264 19259/24406/21267 19264/24407/21268 19260/24408/21269
+f 19260/24408/21269 19264/24407/21268 28486/24409/21270 28487/24410/21271
+f 19259/24406/21267 27116/24026/20893 27115/24025/20892 19264/24407/21268
+f 19264/24407/21268 27115/24025/20892 31230/24028/20895 28486/24409/21270
+f 19258/24403/21264 19260/24408/21269 19265/24411/21272 19261/24412/21273
+f 19261/24412/21273 19265/24411/21272 27187/24413/21274 27188/24414/21275
+f 19260/24408/21269 28487/24410/21271 28488/24415/21276 19265/24411/21272
+f 19265/24411/21272 28488/24415/21276 31254/24416/21277 27187/24413/21274
+f 19258/24403/21264 19261/24412/21273 19266/24417/21278 19262/24404/21265
+f 19262/24404/21265 19266/24417/21278 28485/24399/21260 28484/24394/21255
+f 19261/24412/21273 27188/24414/21275 27189/24418/21279 19266/24417/21278
+f 19266/24417/21278 27189/24418/21279 31253/24400/21261 28485/24399/21260
+f 19267/24419/21280 19271/24420/21281 19272/24421/21282 19268/24422/21283
+f 19268/24422/21283 19272/24421/21282 27120/24046/20913 27119/24042/20909
+f 19271/24420/21281 28487/24410/21271 28486/24409/21270 19272/24421/21282
+f 19272/24421/21282 28486/24409/21270 31230/24028/20895 27120/24046/20913
+f 19267/24419/21280 19268/24422/21283 19273/24423/21284 19269/24424/21285
+f 19269/24424/21285 19273/24423/21284 28489/24425/21286 28490/24426/21287
+f 19268/24422/21283 27119/24042/20909 27118/24041/20908 19273/24423/21284
+f 19273/24423/21284 27118/24041/20908 31231/24044/20911 28489/24425/21286
+f 19267/24419/21280 19269/24424/21285 19274/24427/21288 19270/24428/21289
+f 19270/24428/21289 19274/24427/21288 27190/24429/21290 27191/24430/21291
+f 19269/24424/21285 28490/24426/21287 28491/24431/21292 19274/24427/21288
+f 19274/24427/21288 28491/24431/21292 31255/24432/21293 27190/24429/21290
+f 19267/24419/21280 19270/24428/21289 19275/24433/21294 19271/24420/21281
+f 19271/24420/21281 19275/24433/21294 28488/24415/21276 28487/24410/21271
+f 19270/24428/21289 27191/24430/21291 27192/24434/21295 19275/24433/21294
+f 19275/24433/21294 27192/24434/21295 31254/24416/21277 28488/24415/21276
+f 19276/24435/21296 19280/24436/21297 19281/24437/21298 19277/24438/21299
+f 19277/24438/21299 19281/24437/21298 27123/24062/20928 27122/24058/20925
+f 19280/24436/21297 28490/24426/21287 28489/24425/21286 19281/24437/21298
+f 19281/24437/21298 28489/24425/21286 31231/24044/20911 27123/24062/20928
+f 19276/24435/21296 19277/24438/21299 19282/24439/21300 19278/24440/21301
+f 19278/24440/21301 19282/24439/21300 28492/24441/21302 28493/24442/16774
+f 19277/24438/21299 27122/24058/20925 27121/24057/20924 19282/24439/21300
+f 19282/24439/21300 27121/24057/20924 31232/24060/18067 28492/24441/21302
+f 19276/24435/21296 19278/24440/21301 19283/24443/21303 19279/24444/21304
+f 19279/24444/21304 19283/24443/21303 27193/24445/21305 27194/24446/21306
+f 19278/24440/21301 28493/24442/16774 28494/24447/21307 19283/24443/21303
+f 19283/24443/21303 28494/24447/21307 31256/24448/21308 27193/24445/21305
+f 19276/24435/21296 19279/24444/21304 19284/24449/21309 19280/24436/21297
+f 19280/24436/21297 19284/24449/21309 28491/24431/21292 28490/24426/21287
+f 19279/24444/21304 27194/24446/21306 27195/24450/21310 19284/24449/21309
+f 19284/24449/21309 27195/24450/21310 31255/24432/21293 28491/24431/21292
+f 19285/24451/21311 19289/24452/21312 19290/24453/21313 19286/24454/21314
+f 19286/24454/21314 19290/24453/21313 27126/24078/20944 27125/24074/20940
+f 19289/24452/21312 28493/24442/16774 28492/24441/21302 19290/24453/21313
+f 19290/24453/21313 28492/24441/21302 31232/24060/18067 27126/24078/20944
+f 19285/24451/21311 19286/24454/21314 19291/24455/21315 19287/24456/21316
+f 19287/24456/21316 19291/24455/21315 28495/24457/21317 28496/24458/21318
+f 19286/24454/21314 27125/24074/20940 27124/24073/20939 19291/24455/21315
+f 19291/24455/21315 27124/24073/20939 31233/24076/20942 28495/24457/21317
+f 19285/24451/21311 19287/24456/21316 19292/24459/21319 19288/24460/21320
+f 19288/24460/21320 19292/24459/21319 27196/24461/21321 27197/24462/21322
+f 19287/24456/21316 28496/24458/21318 28497/24463/21323 19292/24459/21319
+f 19292/24459/21319 28497/24463/21323 31257/24464/21324 27196/24461/21321
+f 19285/24451/21311 19288/24460/21320 19293/24465/21325 19289/24452/21312
+f 19289/24452/21312 19293/24465/21325 28494/24447/21307 28493/24442/16774
+f 19288/24460/21320 27197/24462/21322 27198/24466/21326 19293/24465/21325
+f 19293/24465/21325 27198/24466/21326 31256/24448/21308 28494/24447/21307
+f 19294/24467/21327 19298/24468/21328 19299/24469/21329 19295/24470/21330
+f 19295/24470/21330 19299/24469/21329 27129/24094/20960 27128/24090/20956
+f 19298/24468/21328 28496/24458/21318 28495/24457/21317 19299/24469/21329
+f 19299/24469/21329 28495/24457/21317 31233/24076/20942 27129/24094/20960
+f 19294/24467/21327 19295/24470/21330 19300/24471/21331 19296/24472/21332
+f 19296/24472/21332 19300/24471/21331 28498/24473/21333 28499/24474/21334
+f 19295/24470/21330 27128/24090/20956 27127/24089/20955 19300/24471/21331
+f 19300/24471/21331 27127/24089/20955 31234/24092/20958 28498/24473/21333
+f 19294/24467/21327 19296/24472/21332 19301/24475/21335 19297/24476/21336
+f 19297/24476/21336 19301/24475/21335 27199/24477/21337 27200/24478/21338
+f 19296/24472/21332 28499/24474/21334 28500/24479/21339 19301/24475/21335
+f 19301/24475/21335 28500/24479/21339 31258/24480/21340 27199/24477/21337
+f 19294/24467/21327 19297/24476/21336 19302/24481/21341 19298/24468/21328
+f 19298/24468/21328 19302/24481/21341 28497/24463/21323 28496/24458/21318
+f 19297/24476/21336 27200/24478/21338 27201/24482/21342 19302/24481/21341
+f 19302/24481/21341 27201/24482/21342 31257/24464/21324 28497/24463/21323
+f 19303/24483/21343 19307/24484/21344 19308/24485/21345 19304/24486/21346
+f 19304/24486/21346 19308/24485/21345 27132/24110/20976 27131/24106/20972
+f 19307/24484/21344 28499/24474/21334 28498/24473/21333 19308/24485/21345
+f 19308/24485/21345 28498/24473/21333 31234/24092/20958 27132/24110/20976
+f 19303/24483/21343 19304/24486/21346 19309/24487/21347 19305/24488/21348
+f 19305/24488/21348 19309/24487/21347 28501/24489/21349 28502/24490/21350
+f 19304/24486/21346 27131/24106/20972 27130/24105/20971 19309/24487/21347
+f 19309/24487/21347 27130/24105/20971 31235/24108/20974 28501/24489/21349
+f 19303/24483/21343 19305/24488/21348 19310/24491/21351 19306/24492/21352
+f 19306/24492/21352 19310/24491/21351 27202/24493/21353 27203/24494/21354
+f 19305/24488/21348 28502/24490/21350 28503/24495/21355 19310/24491/21351
+f 19310/24491/21351 28503/24495/21355 31259/24496/21356 27202/24493/21353
+f 19303/24483/21343 19306/24492/21352 19311/24497/21357 19307/24484/21344
+f 19307/24484/21344 19311/24497/21357 28500/24479/21339 28499/24474/21334
+f 19306/24492/21352 27203/24494/21354 27204/24498/21358 19311/24497/21357
+f 19311/24497/21357 27204/24498/21358 31258/24480/21340 28500/24479/21339
+f 19312/24499/21359 19316/24500/21360 19317/24501/21361 19313/24502/21362
+f 19313/24502/21362 19317/24501/21361 27135/24126/20992 27134/24122/20988
+f 19316/24500/21360 28502/24490/21350 28501/24489/21349 19317/24501/21361
+f 19317/24501/21361 28501/24489/21349 31235/24108/20974 27135/24126/20992
+f 19312/24499/21359 19313/24502/21362 19318/24503/21363 19314/24504/21364
+f 19314/24504/21364 19318/24503/21363 28504/24505/21365 28505/24506/21366
+f 19313/24502/21362 27134/24122/20988 27133/24121/20987 19318/24503/21363
+f 19318/24503/21363 27133/24121/20987 31236/24124/20990 28504/24505/21365
+f 19312/24499/21359 19314/24504/21364 19319/24507/21367 19315/24508/21368
+f 19315/24508/21368 19319/24507/21367 27205/24509/21369 27206/24510/21370
+f 19314/24504/21364 28505/24506/21366 28506/24511/21371 19319/24507/21367
+f 19319/24507/21367 28506/24511/21371 31260/24512/21372 27205/24509/21369
+f 19312/24499/21359 19315/24508/21368 19320/24513/21373 19316/24500/21360
+f 19316/24500/21360 19320/24513/21373 28503/24495/21355 28502/24490/21350
+f 19315/24508/21368 27206/24510/21370 27207/24514/21374 19320/24513/21373
+f 19320/24513/21373 27207/24514/21374 31259/24496/21356 28503/24495/21355
+f 19321/24515/21375 19325/24516/21376 19326/24517/21377 19322/24518/21378
+f 19322/24518/21378 19326/24517/21377 27138/24142/21008 27137/24138/21004
+f 19325/24516/21376 28505/24506/21366 28504/24505/21365 19326/24517/21377
+f 19326/24517/21377 28504/24505/21365 31236/24124/20990 27138/24142/21008
+f 19321/24515/21375 19322/24518/21378 19327/24519/21379 19323/24520/21380
+f 19323/24520/21380 19327/24519/21379 28507/24521/21381 28508/24522/21382
+f 19322/24518/21378 27137/24138/21004 27136/24137/21003 19327/24519/21379
+f 19327/24519/21379 27136/24137/21003 31237/24140/21006 28507/24521/21381
+f 19321/24515/21375 19323/24520/21380 19328/24523/21383 19324/24524/21384
+f 19324/24524/21384 19328/24523/21383 27208/24525/21385 27209/24526/21386
+f 19323/24520/21380 28508/24522/21382 28509/24527/21387 19328/24523/21383
+f 19328/24523/21383 28509/24527/21387 31261/24528/21388 27208/24525/21385
+f 19321/24515/21375 19324/24524/21384 19329/24529/21389 19325/24516/21376
+f 19325/24516/21376 19329/24529/21389 28506/24511/21371 28505/24506/21366
+f 19324/24524/21384 27209/24526/21386 27210/24530/21390 19329/24529/21389
+f 19329/24529/21389 27210/24530/21390 31260/24512/21372 28506/24511/21371
+f 19330/24531/21391 19334/24532/21392 19335/24533/21393 19331/24534/21394
+f 19331/24534/21394 19335/24533/21393 27141/24158/21024 27140/24154/21020
+f 19334/24532/21392 28508/24522/21382 28507/24521/21381 19335/24533/21393
+f 19335/24533/21393 28507/24521/21381 31237/24140/21006 27141/24158/21024
+f 19330/24531/21391 19331/24534/21394 19336/24535/21395 19332/24536/21396
+f 19332/24536/21396 19336/24535/21395 28510/24537/21397 28511/24538/21398
+f 19331/24534/21394 27140/24154/21020 27139/24153/21019 19336/24535/21395
+f 19336/24535/21395 27139/24153/21019 31238/24156/21022 28510/24537/21397
+f 19330/24531/21391 19332/24536/21396 19337/24539/21399 19333/24540/21400
+f 19333/24540/21400 19337/24539/21399 27211/24541/21401 27212/24542/21402
+f 19332/24536/21396 28511/24538/21398 28512/24543/21403 19337/24539/21399
+f 19337/24539/21399 28512/24543/21403 31262/24544/21404 27211/24541/21401
+f 19330/24531/21391 19333/24540/21400 19338/24545/21405 19334/24532/21392
+f 19334/24532/21392 19338/24545/21405 28509/24527/21387 28508/24522/21382
+f 19333/24540/21400 27212/24542/21402 27213/24546/21406 19338/24545/21405
+f 19338/24545/21405 27213/24546/21406 31261/24528/21388 28509/24527/21387
+f 19339/24547/21407 19343/24548/21408 19344/24549/21409 19340/24550/21410
+f 19340/24550/21410 19344/24549/21409 27144/24177/21040 27143/24172/21036
+f 19343/24548/21408 28511/24551/21398 28510/24552/21397 19344/24549/21409
+f 19344/24549/21409 28510/24552/21397 31238/24178/21022 27144/24177/21040
+f 19339/24547/21407 19340/24550/21410 19345/24553/21411 19341/24554/21412
+f 19341/24554/21412 19345/24553/21411 28513/24555/21413 28514/24556/21414
+f 19340/24550/21410 27143/24172/21036 27142/24171/21035 19345/24553/21411
+f 19345/24553/21411 27142/24171/21035 31239/24174/21038 28513/24555/21413
+f 19339/24547/21407 19341/24554/21412 19346/24557/21415 19342/24558/21416
+f 19342/24558/21416 19346/24557/21415 27214/24559/21417 27215/24560/21418
+f 19341/24554/21412 28514/24556/21414 28515/24561/21419 19346/24557/21415
+f 19346/24557/21415 28515/24561/21419 31263/24562/21420 27214/24559/21417
+f 19339/24547/21407 19342/24558/21416 19347/24563/21421 19343/24548/21408
+f 19343/24548/21408 19347/24563/21421 28512/24564/21403 28511/24551/21398
+f 19342/24558/21416 27215/24560/21418 27216/24565/21422 19347/24563/21421
+f 19347/24563/21421 27216/24565/21422 31262/24566/21404 28512/24564/21403
+f 19348/24567/21423 19352/24568/21424 19353/24569/21425 19349/24570/21426
+f 19349/24570/21426 19353/24569/21425 27147/24194/21056 27146/24190/21052
+f 19352/24568/21424 28514/24556/21414 28513/24555/21413 19353/24569/21425
+f 19353/24569/21425 28513/24555/21413 31239/24174/21038 27147/24194/21056
+f 19348/24567/21423 19349/24570/21426 19354/24571/21427 19350/24572/21428
+f 19350/24572/21428 19354/24571/21427 28516/24573/21429 28517/24574/21430
+f 19349/24570/21426 27146/24190/21052 27145/24189/21051 19354/24571/21427
+f 19354/24571/21427 27145/24189/21051 31240/24192/21054 28516/24573/21429
+f 19348/24567/21423 19350/24572/21428 19355/24575/21431 19351/24576/21432
+f 19351/24576/21432 19355/24575/21431 27217/24577/21433 27218/24578/21434
+f 19350/24572/21428 28517/24574/21430 28518/24579/21435 19355/24575/21431
+f 19355/24575/21431 28518/24579/21435 31264/24580/21436 27217/24577/21433
+f 19348/24567/21423 19351/24576/21432 19356/24581/21437 19352/24568/21424
+f 19352/24568/21424 19356/24581/21437 28515/24561/21419 28514/24556/21414
+f 19351/24576/21432 27218/24578/21434 27219/24582/21438 19356/24581/21437
+f 19356/24581/21437 27219/24582/21438 31263/24562/21420 28515/24561/21419
+f 19357/24583/21439 19361/24584/21440 19362/24585/21441 19358/24586/21442
+f 19358/24586/21442 19362/24585/21441 27150/24210/21072 27149/24206/21068
+f 19361/24584/21440 28517/24574/21430 28516/24573/21429 19362/24585/21441
+f 19362/24585/21441 28516/24573/21429 31240/24192/21054 27150/24210/21072
+f 19357/24583/21439 19358/24586/21442 19363/24587/21443 19359/24588/21444
+f 19359/24588/21444 19363/24587/21443 28519/24589/21445 28520/24590/21446
+f 19358/24586/21442 27149/24206/21068 27148/24205/21067 19363/24587/21443
+f 19363/24587/21443 27148/24205/21067 31241/24208/21070 28519/24589/21445
+f 19357/24583/21439 19359/24588/21444 19364/24591/21447 19360/24592/21448
+f 19360/24592/21448 19364/24591/21447 27220/24593/21449 27221/24594/21450
+f 19359/24588/21444 28520/24590/21446 28521/24595/21451 19364/24591/21447
+f 19364/24591/21447 28521/24595/21451 31265/24596/21452 27220/24593/21449
+f 19357/24583/21439 19360/24592/21448 19365/24597/21453 19361/24584/21440
+f 19361/24584/21440 19365/24597/21453 28518/24579/21435 28517/24574/21430
+f 19360/24592/21448 27221/24594/21450 27222/24598/21454 19365/24597/21453
+f 19365/24597/21453 27222/24598/21454 31264/24580/21436 28518/24579/21435
+f 19366/24599/21455 19370/24600/21456 19371/24601/21457 19367/24602/21458
+f 19367/24602/21458 19371/24601/21457 27153/24226/21088 27152/24222/21084
+f 19370/24600/21456 28520/24590/21446 28519/24589/21445 19371/24601/21457
+f 19371/24601/21457 28519/24589/21445 31241/24208/21070 27153/24226/21088
+f 19366/24599/21455 19367/24602/21458 19372/24603/21459 19368/24604/21460
+f 19368/24604/21460 19372/24603/21459 28522/24605/21461 28523/24606/21462
+f 19367/24602/21458 27152/24222/21084 27151/24221/21083 19372/24603/21459
+f 19372/24603/21459 27151/24221/21083 31242/24224/21086 28522/24605/21461
+f 19366/24599/21455 19368/24604/21460 19373/24607/21463 19369/24608/21464
+f 19369/24608/21464 19373/24607/21463 27223/24609/21465 27224/24610/21466
+f 19368/24604/21460 28523/24606/21462 28524/24611/21467 19373/24607/21463
+f 19373/24607/21463 28524/24611/21467 31266/24612/21468 27223/24609/21465
+f 19366/24599/21455 19369/24608/21464 19374/24613/21469 19370/24600/21456
+f 19370/24600/21456 19374/24613/21469 28521/24595/21451 28520/24590/21446
+f 19369/24608/21464 27224/24610/21466 27225/24614/21470 19374/24613/21469
+f 19374/24613/21469 27225/24614/21470 31265/24596/21452 28521/24595/21451
+f 19375/24615/21471 19379/24616/21472 19380/24617/21473 19376/24618/21474
+f 19376/24618/21474 19380/24617/21473 27156/24242/21104 27155/24238/21100
+f 19379/24616/21472 28523/24606/21462 28522/24605/21461 19380/24617/21473
+f 19380/24617/21473 28522/24605/21461 31242/24224/21086 27156/24242/21104
+f 19375/24615/21471 19376/24618/21474 19381/24619/21475 19377/24620/21476
+f 19377/24620/21476 19381/24619/21475 28525/24621/21477 28526/24622/21478
+f 19376/24618/21474 27155/24238/21100 27154/24237/21099 19381/24619/21475
+f 19381/24619/21475 27154/24237/21099 31243/24240/21102 28525/24621/21477
+f 19375/24615/21471 19377/24620/21476 19382/24623/21479 19378/24624/21480
+f 19378/24624/21480 19382/24623/21479 27226/24625/21481 27227/24626/21482
+f 19377/24620/21476 28526/24622/21478 28527/24627/21483 19382/24623/21479
+f 19382/24623/21479 28527/24627/21483 31267/24628/21484 27226/24625/21481
+f 19375/24615/21471 19378/24624/21480 19383/24629/21485 19379/24616/21472
+f 19379/24616/21472 19383/24629/21485 28524/24611/21467 28523/24606/21462
+f 19378/24624/21480 27227/24626/21482 27228/24630/21486 19383/24629/21485
+f 19383/24629/21485 27228/24630/21486 31266/24612/21468 28524/24611/21467
+f 19384/24631/21487 19388/24632/21488 19389/24633/21489 19385/24634/21490
+f 19385/24634/21490 19389/24633/21489 27159/24258/21119 27158/24254/21116
+f 19388/24632/21488 28526/24622/21478 28525/24621/21477 19389/24633/21489
+f 19389/24633/21489 28525/24621/21477 31243/24240/21102 27159/24258/21119
+f 19384/24631/21487 19385/24634/21490 19390/24635/21491 19386/24636/21492
+f 19386/24636/21492 19390/24635/21491 28528/24637/21493 28529/24638/16582
+f 19385/24634/21490 27158/24254/21116 27157/24253/21115 19390/24635/21491
+f 19390/24635/21491 27157/24253/21115 31244/24256/18214 28528/24637/21493
+f 19384/24631/21487 19386/24636/21492 19391/24639/21494 19387/24640/21495
+f 19387/24640/21495 19391/24639/21494 27229/24641/21496 27230/24642/21497
+f 19386/24636/21492 28529/24638/16582 28530/24643/21498 19391/24639/21494
+f 19391/24639/21494 28530/24643/21498 31268/24644/21499 27229/24641/21496
+f 19384/24631/21487 19387/24640/21495 19392/24645/21500 19388/24632/21488
+f 19388/24632/21488 19392/24645/21500 28527/24627/21483 28526/24622/21478
+f 19387/24640/21495 27230/24642/21497 27231/24646/21501 19392/24645/21500
+f 19392/24645/21500 27231/24646/21501 31267/24628/21484 28527/24627/21483
+f 19393/24647/21502 19397/24648/21503 19398/24649/21504 19394/24650/21505
+f 19394/24650/21505 19398/24649/21504 27162/24270/21131 27161/24268/21129
+f 19397/24648/21503 28529/24638/16582 28528/24637/21493 19398/24649/21504
+f 19398/24649/21504 28528/24637/21493 31244/24256/18214 27162/24270/21131
+f 19393/24647/21502 19394/24650/21505 19399/24651/21506 19395/24652/21507
+f 19395/24652/21507 19399/24651/21506 28461/24276/21137 28460/24275/21136
+f 19394/24650/21505 27161/24268/21129 27160/24267/21128 19399/24651/21506
+f 19399/24651/21506 27160/24267/21128 31221/23902/20769 28461/24276/21137
+f 19393/24647/21502 19395/24652/21507 19400/24653/21508 19396/24654/21509
+f 19396/24654/21509 19400/24653/21508 27232/24655/21510 27233/24656/21511
+f 19395/24652/21507 28460/24275/21136 28459/24288/21149 19400/24653/21508
+f 19400/24653/21508 28459/24288/21149 31245/24290/21151 27232/24655/21510
+f 19393/24647/21502 19396/24654/21509 19401/24657/21512 19397/24648/21503
+f 19397/24648/21503 19401/24657/21512 28530/24643/21498 28529/24638/16582
+f 19396/24654/21509 27233/24656/21511 27234/24658/21513 19401/24657/21512
+f 19401/24657/21512 27234/24658/21513 31268/24644/21499 28530/24643/21498
+f 19402/24659/21514 19406/24660/21515 19407/24661/21516 19403/24662/21517
+f 19403/24662/21517 19407/24661/21516 27165/24289/21150 27164/24284/21145
+f 19406/24660/21515 28532/24663/21518 28533/24664/21519 19407/24661/21516
+f 19407/24661/21516 28533/24664/21519 31245/24290/21151 27165/24289/21150
+f 19402/24659/21514 19403/24662/21517 19408/24665/21520 19404/24666/21521
+f 19404/24666/21521 19408/24665/21520 28534/24667/21522 28535/24668/21523
+f 19403/24662/21517 27164/24284/21145 27163/24283/21144 19408/24665/21520
+f 19408/24665/21520 27163/24283/21144 31246/24286/21147 28534/24667/21522
+f 19402/24659/21514 19404/24666/21521 19409/24669/21524 19405/24670/21525
+f 19405/24670/21525 19409/24669/21524 27235/24671/21526 27236/24672/21527
+f 19404/24666/21521 28535/24668/21523 28536/24673/21528 19409/24669/21524
+f 19409/24669/21524 28536/24673/21528 31270/24674/21529 27235/24671/21526
+f 19402/24659/21514 19405/24670/21525 19410/24675/21530 19406/24660/21515
+f 19406/24660/21515 19410/24675/21530 28531/24676/21531 28532/24663/21518
+f 19405/24670/21525 27236/24672/21527 27237/24677/21532 19410/24675/21530
+f 19410/24675/21530 27237/24677/21532 31269/24678/21533 28531/24676/21531
+f 19411/24679/21534 19415/24680/21535 19416/24681/21536 19412/24682/21537
+f 19412/24682/21537 19416/24681/21536 27168/24306/21167 27167/24302/21163
+f 19415/24680/21535 28535/24668/21523 28534/24667/21522 19416/24681/21536
+f 19416/24681/21536 28534/24667/21522 31246/24286/21147 27168/24306/21167
+f 19411/24679/21534 19412/24682/21537 19417/24683/21538 19413/24684/21539
+f 19413/24684/21539 19417/24683/21538 28537/24685/21540 28538/24686/21541
+f 19412/24682/21537 27167/24302/21163 27166/24301/21162 19417/24683/21538
+f 19417/24683/21538 27166/24301/21162 31247/24304/21165 28537/24685/21540
+f 19411/24679/21534 19413/24684/21539 19418/24687/21542 19414/24688/21543
+f 19414/24688/21543 19418/24687/21542 27238/24689/21544 27239/24690/21545
+f 19413/24684/21539 28538/24686/21541 28539/24691/21546 19418/24687/21542
+f 19418/24687/21542 28539/24691/21546 31271/24692/21547 27238/24689/21544
+f 19411/24679/21534 19414/24688/21543 19419/24693/21548 19415/24680/21535
+f 19415/24680/21535 19419/24693/21548 28536/24673/21528 28535/24668/21523
+f 19414/24688/21543 27239/24690/21545 27240/24694/21549 19419/24693/21548
+f 19419/24693/21548 27240/24694/21549 31270/24674/21529 28536/24673/21528
+f 19420/24695/21550 19424/24696/21551 19425/24697/21552 19421/24698/21553
+f 19421/24698/21553 19425/24697/21552 27171/24322/21183 27170/24318/21179
+f 19424/24696/21551 28538/24686/21541 28537/24685/21540 19425/24697/21552
+f 19425/24697/21552 28537/24685/21540 31247/24304/21165 27171/24322/21183
+f 19420/24695/21550 19421/24698/21553 19426/24699/21554 19422/24700/21555
+f 19422/24700/21555 19426/24699/21554 28540/24701/21556 28541/24702/21557
+f 19421/24698/21553 27170/24318/21179 27169/24317/21178 19426/24699/21554
+f 19426/24699/21554 27169/24317/21178 31248/24320/21181 28540/24701/21556
+f 19420/24695/21550 19422/24700/21555 19427/24703/21558 19423/24704/21559
+f 19423/24704/21559 19427/24703/21558 27241/24705/21560 27242/24706/21561
+f 19422/24700/21555 28541/24702/21557 28542/24707/21562 19427/24703/21558
+f 19427/24703/21558 28542/24707/21562 31272/24708/21563 27241/24705/21560
+f 19420/24695/21550 19423/24704/21559 19428/24709/21564 19424/24696/21551
+f 19424/24696/21551 19428/24709/21564 28539/24691/21546 28538/24686/21541
+f 19423/24704/21559 27242/24706/21561 27243/24710/21565 19428/24709/21564
+f 19428/24709/21564 27243/24710/21565 31271/24692/21547 28539/24691/21546
+f 19429/24711/21566 19433/24712/21567 19434/24713/21568 19430/24714/21569
+f 19430/24714/21569 19434/24713/21568 27174/24338/21199 27173/24334/21195
+f 19433/24712/21567 28541/24702/21557 28540/24701/21556 19434/24713/21568
+f 19434/24713/21568 28540/24701/21556 31248/24320/21181 27174/24338/21199
+f 19429/24711/21566 19430/24714/21569 19435/24715/21570 19431/24716/21571
+f 19431/24716/21571 19435/24715/21570 28543/24717/21572 28544/24718/21573
+f 19430/24714/21569 27173/24334/21195 27172/24333/21194 19435/24715/21570
+f 19435/24715/21570 27172/24333/21194 31249/24336/21197 28543/24717/21572
+f 19429/24711/21566 19431/24716/21571 19436/24719/21574 19432/24720/21575
+f 19432/24720/21575 19436/24719/21574 27244/24721/21576 27245/24722/21577
+f 19431/24716/21571 28544/24718/21573 28545/24723/21578 19436/24719/21574
+f 19436/24719/21574 28545/24723/21578 31273/24724/21579 27244/24721/21576
+f 19429/24711/21566 19432/24720/21575 19437/24725/21580 19433/24712/21567
+f 19433/24712/21567 19437/24725/21580 28542/24707/21562 28541/24702/21557
+f 19432/24720/21575 27245/24722/21577 27246/24726/21581 19437/24725/21580
+f 19437/24725/21580 27246/24726/21581 31272/24708/21563 28542/24707/21562
+f 19438/24727/21582 19442/24728/21583 19443/24729/21584 19439/24730/21585
+f 19439/24730/21585 19443/24729/21584 27177/24354/21215 27176/24350/21211
+f 19442/24728/21583 28544/24718/21573 28543/24717/21572 19443/24729/21584
+f 19443/24729/21584 28543/24717/21572 31249/24336/21197 27177/24354/21215
+f 19438/24727/21582 19439/24730/21585 19444/24731/21586 19440/24732/21587
+f 19440/24732/21587 19444/24731/21586 28546/24733/21588 28547/24734/21589
+f 19439/24730/21585 27176/24350/21211 27175/24349/21210 19444/24731/21586
+f 19444/24731/21586 27175/24349/21210 31250/24352/21213 28546/24733/21588
+f 19438/24727/21582 19440/24732/21587 19445/24735/21590 19441/24736/21591
+f 19441/24736/21591 19445/24735/21590 27247/24737/21592 27248/24738/21593
+f 19440/24732/21587 28547/24734/21589 28548/24739/21594 19445/24735/21590
+f 19445/24735/21590 28548/24739/21594 31274/24740/21595 27247/24737/21592
+f 19438/24727/21582 19441/24736/21591 19446/24741/21596 19442/24728/21583
+f 19442/24728/21583 19446/24741/21596 28545/24723/21578 28544/24718/21573
+f 19441/24736/21591 27248/24738/21593 27249/24742/21597 19446/24741/21596
+f 19446/24741/21596 27249/24742/21597 31273/24724/21579 28545/24723/21578
+f 19447/24743/21598 19451/24744/21599 19452/24745/21600 19448/24746/21601
+f 19448/24746/21601 19452/24745/21600 27180/24370/21231 27179/24366/21227
+f 19451/24744/21599 28547/24734/21589 28546/24733/21588 19452/24745/21600
+f 19452/24745/21600 28546/24733/21588 31250/24352/21213 27180/24370/21231
+f 19447/24743/21598 19448/24746/21601 19453/24747/21602 19449/24748/21603
+f 19449/24748/21603 19453/24747/21602 28549/24749/21604 28550/24750/21605
+f 19448/24746/21601 27179/24366/21227 27178/24365/21226 19453/24747/21602
+f 19453/24747/21602 27178/24365/21226 31251/24368/21229 28549/24749/21604
+f 19447/24743/21598 19449/24748/21603 19454/24751/21606 19450/24752/21607
+f 19450/24752/21607 19454/24751/21606 27250/24753/21608 27251/24754/21609
+f 19449/24748/21603 28550/24750/21605 28551/24755/21610 19454/24751/21606
+f 19454/24751/21606 28551/24755/21610 31275/24756/21611 27250/24753/21608
+f 19447/24743/21598 19450/24752/21607 19455/24757/21612 19451/24744/21599
+f 19451/24744/21599 19455/24757/21612 28548/24739/21594 28547/24734/21589
+f 19450/24752/21607 27251/24754/21609 27252/24758/21613 19455/24757/21612
+f 19455/24757/21612 27252/24758/21613 31274/24740/21595 28548/24739/21594
+f 19456/24759/21614 19460/24760/21615 19461/24761/21616 19457/24762/21617
+f 19457/24762/21617 19461/24761/21616 27183/24386/21247 27182/24382/21243
+f 19460/24760/21615 28550/24750/21605 28549/24749/21604 19461/24761/21616
+f 19461/24761/21616 28549/24749/21604 31251/24368/21229 27183/24386/21247
+f 19456/24759/21614 19457/24762/21617 19462/24763/21618 19458/24764/21619
+f 19458/24764/21619 19462/24763/21618 28552/24765/21620 28553/24766/21621
+f 19457/24762/21617 27182/24382/21243 27181/24381/21242 19462/24763/21618
+f 19462/24763/21618 27181/24381/21242 31252/24384/21245 28552/24765/21620
+f 19456/24759/21614 19458/24764/21619 19463/24767/21622 19459/24768/21623
+f 19459/24768/21623 19463/24767/21622 27253/24769/21624 27254/24770/21625
+f 19458/24764/21619 28553/24766/21621 28554/24771/21626 19463/24767/21622
+f 19463/24767/21622 28554/24771/21626 31276/24772/21627 27253/24769/21624
+f 19456/24759/21614 19459/24768/21623 19464/24773/21628 19460/24760/21615
+f 19460/24760/21615 19464/24773/21628 28551/24755/21610 28550/24750/21605
+f 19459/24768/21623 27254/24770/21625 27255/24774/21629 19464/24773/21628
+f 19464/24773/21628 27255/24774/21629 31275/24756/21611 28551/24755/21610
+f 19465/24775/21630 19469/24776/21631 19470/24777/21632 19466/24778/21633
+f 19466/24778/21633 19470/24777/21632 27186/24402/21263 27185/24398/21259
+f 19469/24776/21631 28553/24766/21621 28552/24765/21620 19470/24777/21632
+f 19470/24777/21632 28552/24765/21620 31252/24384/21245 27186/24402/21263
+f 19465/24775/21630 19466/24778/21633 19471/24779/21634 19467/24780/21635
+f 19467/24780/21635 19471/24779/21634 28555/24781/21636 28556/24782/21637
+f 19466/24778/21633 27185/24398/21259 27184/24397/21258 19471/24779/21634
+f 19471/24779/21634 27184/24397/21258 31253/24400/21261 28555/24781/21636
+f 19465/24775/21630 19467/24780/21635 19472/24783/21638 19468/24784/21639
+f 19468/24784/21639 19472/24783/21638 27256/24785/21640 27257/24786/21641
+f 19467/24780/21635 28556/24782/21637 28557/24787/21642 19472/24783/21638
+f 19472/24783/21638 28557/24787/21642 31277/24788/21643 27256/24785/21640
+f 19465/24775/21630 19468/24784/21639 19473/24789/21644 19469/24776/21631
+f 19469/24776/21631 19473/24789/21644 28554/24771/21626 28553/24766/21621
+f 19468/24784/21639 27257/24786/21641 27258/24790/21645 19473/24789/21644
+f 19473/24789/21644 27258/24790/21645 31276/24772/21627 28554/24771/21626
+f 19474/24791/21646 19478/24792/21647 19479/24793/21648 19475/24794/21649
+f 19475/24794/21649 19479/24793/21648 27189/24418/21279 27188/24414/21275
+f 19478/24792/21647 28556/24782/21637 28555/24781/21636 19479/24793/21648
+f 19479/24793/21648 28555/24781/21636 31253/24400/21261 27189/24418/21279
+f 19474/24791/21646 19475/24794/21649 19480/24795/21650 19476/24796/21651
+f 19476/24796/21651 19480/24795/21650 28558/24797/21652 28559/24798/21653
+f 19475/24794/21649 27188/24414/21275 27187/24413/21274 19480/24795/21650
+f 19480/24795/21650 27187/24413/21274 31254/24416/21277 28558/24797/21652
+f 19474/24791/21646 19476/24796/21651 19481/24799/21654 19477/24800/21655
+f 19477/24800/21655 19481/24799/21654 27259/24801/21656 27260/24802/21657
+f 19476/24796/21651 28559/24798/21653 28560/24803/21658 19481/24799/21654
+f 19481/24799/21654 28560/24803/21658 31278/24804/21659 27259/24801/21656
+f 19474/24791/21646 19477/24800/21655 19482/24805/21660 19478/24792/21647
+f 19478/24792/21647 19482/24805/21660 28557/24787/21642 28556/24782/21637
+f 19477/24800/21655 27260/24802/21657 27261/24806/21661 19482/24805/21660
+f 19482/24805/21660 27261/24806/21661 31277/24788/21643 28557/24787/21642
+f 19483/24807/21662 19487/24808/21663 19488/24809/21664 19484/24810/21665
+f 19484/24810/21665 19488/24809/21664 27192/24434/21295 27191/24430/21291
+f 19487/24808/21663 28559/24798/21653 28558/24797/21652 19488/24809/21664
+f 19488/24809/21664 28558/24797/21652 31254/24416/21277 27192/24434/21295
+f 19483/24807/21662 19484/24810/21665 19489/24811/21666 19485/24812/21667
+f 19485/24812/21667 19489/24811/21666 28561/24813/21668 28562/24814/21669
+f 19484/24810/21665 27191/24430/21291 27190/24429/21290 19489/24811/21666
+f 19489/24811/21666 27190/24429/21290 31255/24432/21293 28561/24813/21668
+f 19483/24807/21662 19485/24812/21667 19490/24815/21670 19486/24816/21671
+f 19486/24816/21671 19490/24815/21670 27262/24817/21672 27263/24818/21673
+f 19485/24812/21667 28562/24814/21669 28563/24819/21674 19490/24815/21670
+f 19490/24815/21670 28563/24819/21674 31279/24820/21675 27262/24817/21672
+f 19483/24807/21662 19486/24816/21671 19491/24821/21676 19487/24808/21663
+f 19487/24808/21663 19491/24821/21676 28560/24803/21658 28559/24798/21653
+f 19486/24816/21671 27263/24818/21673 27264/24822/21677 19491/24821/21676
+f 19491/24821/21676 27264/24822/21677 31278/24804/21659 28560/24803/21658
+f 19492/24823/21678 19496/24824/21679 19497/24825/21680 19493/24826/21681
+f 19493/24826/21681 19497/24825/21680 27195/24450/21310 27194/24446/21306
+f 19496/24824/21679 28562/24814/21669 28561/24813/21668 19497/24825/21680
+f 19497/24825/21680 28561/24813/21668 31255/24432/21293 27195/24450/21310
+f 19492/24823/21678 19493/24826/21681 19498/24827/21682 19494/24828/21683
+f 19494/24828/21683 19498/24827/21682 28564/24829/21684 28565/24830/21685
+f 19493/24826/21681 27194/24446/21306 27193/24445/21305 19498/24827/21682
+f 19498/24827/21682 27193/24445/21305 31256/24448/21308 28564/24829/21684
+f 19492/24823/21678 19494/24828/21683 19499/24831/21686 19495/24832/21687
+f 19495/24832/21687 19499/24831/21686 27265/24833/21688 27266/24834/21689
+f 19494/24828/21683 28565/24830/21685 28566/24835/21690 19499/24831/21686
+f 19499/24831/21686 28566/24835/21690 31280/24836/16009 27265/24833/21688
+f 19492/24823/21678 19495/24832/21687 19500/24837/21691 19496/24824/21679
+f 19496/24824/21679 19500/24837/21691 28563/24819/21674 28562/24814/21669
+f 19495/24832/21687 27266/24834/21689 27267/24838/21692 19500/24837/21691
+f 19500/24837/21691 27267/24838/21692 31279/24820/21675 28563/24819/21674
+f 19501/24839/21693 19505/24840/21694 19506/24841/21695 19502/24842/21696
+f 19502/24842/21696 19506/24841/21695 27198/24466/21326 27197/24462/21322
+f 19505/24840/21694 28565/24830/21685 28564/24829/21684 19506/24841/21695
+f 19506/24841/21695 28564/24829/21684 31256/24448/21308 27198/24466/21326
+f 19501/24839/21693 19502/24842/21696 19507/24843/21697 19503/24844/21698
+f 19503/24844/21698 19507/24843/21697 28567/24845/21699 28568/24846/21700
+f 19502/24842/21696 27197/24462/21322 27196/24461/21321 19507/24843/21697
+f 19507/24843/21697 27196/24461/21321 31257/24464/21324 28567/24845/21699
+f 19501/24839/21693 19503/24844/21698 19508/24847/21701 19504/24848/21702
+f 19504/24848/21702 19508/24847/21701 27268/24849/21703 27269/24850/21704
+f 19503/24844/21698 28568/24846/21700 28569/24851/21705 19508/24847/21701
+f 19508/24847/21701 28569/24851/21705 31281/24852/21706 27268/24849/21703
+f 19501/24839/21693 19504/24848/21702 19509/24853/21707 19505/24840/21694
+f 19505/24840/21694 19509/24853/21707 28566/24835/21690 28565/24830/21685
+f 19504/24848/21702 27269/24850/21704 27270/24854/21708 19509/24853/21707
+f 19509/24853/21707 27270/24854/21708 31280/24836/16009 28566/24835/21690
+f 19510/24855/21709 19514/24856/21710 19515/24857/21711 19511/24858/21712
+f 19511/24858/21712 19515/24857/21711 27201/24482/21342 27200/24478/21338
+f 19514/24856/21710 28568/24846/21700 28567/24845/21699 19515/24857/21711
+f 19515/24857/21711 28567/24845/21699 31257/24464/21324 27201/24482/21342
+f 19510/24855/21709 19511/24858/21712 19516/24859/21713 19512/24860/21714
+f 19512/24860/21714 19516/24859/21713 28570/24861/21715 28571/24862/21716
+f 19511/24858/21712 27200/24478/21338 27199/24477/21337 19516/24859/21713
+f 19516/24859/21713 27199/24477/21337 31258/24480/21340 28570/24861/21715
+f 19510/24855/21709 19512/24860/21714 19517/24863/21717 19513/24864/21718
+f 19513/24864/21718 19517/24863/21717 27271/24865/21719 27272/24866/21720
+f 19512/24860/21714 28571/24862/21716 28572/24867/21721 19517/24863/21717
+f 19517/24863/21717 28572/24867/21721 31282/24868/21722 27271/24865/21719
+f 19510/24855/21709 19513/24864/21718 19518/24869/21723 19514/24856/21710
+f 19514/24856/21710 19518/24869/21723 28569/24851/21705 28568/24846/21700
+f 19513/24864/21718 27272/24866/21720 27273/24870/21724 19518/24869/21723
+f 19518/24869/21723 27273/24870/21724 31281/24852/21706 28569/24851/21705
+f 19519/24871/21725 19523/24872/21726 19524/24873/21727 19520/24874/21728
+f 19520/24874/21728 19524/24873/21727 27204/24498/21358 27203/24494/21354
+f 19523/24872/21726 28571/24862/21716 28570/24861/21715 19524/24873/21727
+f 19524/24873/21727 28570/24861/21715 31258/24480/21340 27204/24498/21358
+f 19519/24871/21725 19520/24874/21728 19525/24875/21729 19521/24876/21730
+f 19521/24876/21730 19525/24875/21729 28573/24877/21731 28574/24878/21732
+f 19520/24874/21728 27203/24494/21354 27202/24493/21353 19525/24875/21729
+f 19525/24875/21729 27202/24493/21353 31259/24496/21356 28573/24877/21731
+f 19519/24871/21725 19521/24876/21730 19526/24879/21733 19522/24880/21734
+f 19522/24880/21734 19526/24879/21733 27274/24881/21735 27275/24882/21736
+f 19521/24876/21730 28574/24878/21732 28575/24883/21737 19526/24879/21733
+f 19526/24879/21733 28575/24883/21737 31283/24884/21738 27274/24881/21735
+f 19519/24871/21725 19522/24880/21734 19527/24885/21739 19523/24872/21726
+f 19523/24872/21726 19527/24885/21739 28572/24867/21721 28571/24862/21716
+f 19522/24880/21734 27275/24882/21736 27276/24886/21740 19527/24885/21739
+f 19527/24885/21739 27276/24886/21740 31282/24868/21722 28572/24867/21721
+f 19528/24887/21741 19532/24888/21742 19533/24889/21743 19529/24890/21744
+f 19529/24890/21744 19533/24889/21743 27207/24514/21374 27206/24510/21370
+f 19532/24888/21742 28574/24878/21732 28573/24877/21731 19533/24889/21743
+f 19533/24889/21743 28573/24877/21731 31259/24496/21356 27207/24514/21374
+f 19528/24887/21741 19529/24890/21744 19534/24891/21745 19530/24892/21746
+f 19530/24892/21746 19534/24891/21745 28576/24893/21747 28577/24894/21748
+f 19529/24890/21744 27206/24510/21370 27205/24509/21369 19534/24891/21745
+f 19534/24891/21745 27205/24509/21369 31260/24512/21372 28576/24893/21747
+f 19528/24887/21741 19530/24892/21746 19535/24895/21749 19531/24896/21750
+f 19531/24896/21750 19535/24895/21749 27277/24897/21751 27278/24898/21752
+f 19530/24892/21746 28577/24894/21748 28578/24899/21753 19535/24895/21749
+f 19535/24895/21749 28578/24899/21753 31284/24900/21754 27277/24897/21751
+f 19528/24887/21741 19531/24896/21750 19536/24901/21755 19532/24888/21742
+f 19532/24888/21742 19536/24901/21755 28575/24883/21737 28574/24878/21732
+f 19531/24896/21750 27278/24898/21752 27279/24902/21756 19536/24901/21755
+f 19536/24901/21755 27279/24902/21756 31283/24884/21738 28575/24883/21737
+f 19537/24903/21757 19541/24904/21758 19542/24905/21759 19538/24906/21760
+f 19538/24906/21760 19542/24905/21759 27210/24530/21390 27209/24526/21386
+f 19541/24904/21758 28577/24894/21748 28576/24893/21747 19542/24905/21759
+f 19542/24905/21759 28576/24893/21747 31260/24512/21372 27210/24530/21390
+f 19537/24903/21757 19538/24906/21760 19543/24907/21761 19539/24908/21762
+f 19539/24908/21762 19543/24907/21761 28579/24909/21763 28580/24910/21764
+f 19538/24906/21760 27209/24526/21386 27208/24525/21385 19543/24907/21761
+f 19543/24907/21761 27208/24525/21385 31261/24528/21388 28579/24909/21763
+f 19537/24903/21757 19539/24908/21762 19544/24911/21765 19540/24912/21766
+f 19540/24912/21766 19544/24911/21765 27280/24913/21767 27281/24914/21768
+f 19539/24908/21762 28580/24910/21764 28581/24915/21769 19544/24911/21765
+f 19544/24911/21765 28581/24915/21769 31285/24916/21770 27280/24913/21767
+f 19537/24903/21757 19540/24912/21766 19545/24917/21771 19541/24904/21758
+f 19541/24904/21758 19545/24917/21771 28578/24899/21753 28577/24894/21748
+f 19540/24912/21766 27281/24914/21768 27282/24918/21772 19545/24917/21771
+f 19545/24917/21771 27282/24918/21772 31284/24900/21754 28578/24899/21753
+f 19546/24919/21773 19550/24920/21774 19551/24921/21775 19547/24922/21776
+f 19547/24922/21776 19551/24921/21775 27213/24546/21406 27212/24542/21402
+f 19550/24920/21774 28580/24910/21764 28579/24909/21763 19551/24921/21775
+f 19551/24921/21775 28579/24909/21763 31261/24528/21388 27213/24546/21406
+f 19546/24919/21773 19547/24922/21776 19552/24923/21777 19548/24924/21778
+f 19548/24924/21778 19552/24923/21777 28582/24925/21779 28583/24926/21780
+f 19547/24922/21776 27212/24542/21402 27211/24541/21401 19552/24923/21777
+f 19552/24923/21777 27211/24541/21401 31262/24544/21404 28582/24925/21779
+f 19546/24919/21773 19548/24924/21778 19553/24927/21781 19549/24928/21782
+f 19549/24928/21782 19553/24927/21781 27283/24929/21783 27284/24930/21784
+f 19548/24924/21778 28583/24926/21780 28584/24931/21785 19553/24927/21781
+f 19553/24927/21781 28584/24931/21785 31286/24932/21786 27283/24929/21783
+f 19546/24919/21773 19549/24928/21782 19554/24933/21787 19550/24920/21774
+f 19550/24920/21774 19554/24933/21787 28581/24915/21769 28580/24910/21764
+f 19549/24928/21782 27284/24930/21784 27285/24934/21788 19554/24933/21787
+f 19554/24933/21787 27285/24934/21788 31285/24916/21770 28581/24915/21769
+f 19555/24935/21789 19559/24936/21790 19560/24937/21791 19556/24938/21792
+f 19556/24938/21792 19560/24937/21791 27216/24565/21422 27215/24560/21418
+f 19559/24936/21790 28583/24939/21780 28582/24940/21779 19560/24937/21791
+f 19560/24937/21791 28582/24940/21779 31262/24566/21404 27216/24565/21422
+f 19555/24935/21789 19556/24938/21792 19561/24941/21793 19557/24942/21794
+f 19557/24942/21794 19561/24941/21793 28585/24943/21795 28586/24944/21796
+f 19556/24938/21792 27215/24560/21418 27214/24559/21417 19561/24941/21793
+f 19561/24941/21793 27214/24559/21417 31263/24562/21420 28585/24943/21795
+f 19555/24935/21789 19557/24942/21794 19562/24945/21797 19558/24946/21798
+f 19558/24946/21798 19562/24945/21797 27286/24947/21799 27287/24948/21800
+f 19557/24942/21794 28586/24944/21796 28587/24949/21801 19562/24945/21797
+f 19562/24945/21797 28587/24949/21801 31287/24950/21802 27286/24947/21799
+f 19555/24935/21789 19558/24946/21798 19563/24951/21803 19559/24936/21790
+f 19559/24936/21790 19563/24951/21803 28584/24952/21785 28583/24939/21780
+f 19558/24946/21798 27287/24948/21800 27288/24953/21804 19563/24951/21803
+f 19563/24951/21803 27288/24953/21804 31286/24954/21786 28584/24952/21785
+f 19564/24955/21805 19568/24956/21806 19569/24957/21807 19565/24958/21808
+f 19565/24958/21808 19569/24957/21807 27219/24582/21438 27218/24578/21434
+f 19568/24956/21806 28586/24944/21796 28585/24943/21795 19569/24957/21807
+f 19569/24957/21807 28585/24943/21795 31263/24562/21420 27219/24582/21438
+f 19564/24955/21805 19565/24958/21808 19570/24959/21809 19566/24960/21810
+f 19566/24960/21810 19570/24959/21809 28588/24961/21811 28589/24962/21812
+f 19565/24958/21808 27218/24578/21434 27217/24577/21433 19570/24959/21809
+f 19570/24959/21809 27217/24577/21433 31264/24580/21436 28588/24961/21811
+f 19564/24955/21805 19566/24960/21810 19571/24963/21813 19567/24964/21814
+f 19567/24964/21814 19571/24963/21813 27289/24965/21815 27290/24966/21816
+f 19566/24960/21810 28589/24962/21812 28590/24967/21817 19571/24963/21813
+f 19571/24963/21813 28590/24967/21817 31288/24968/21818 27289/24965/21815
+f 19564/24955/21805 19567/24964/21814 19572/24969/21819 19568/24956/21806
+f 19568/24956/21806 19572/24969/21819 28587/24949/21801 28586/24944/21796
+f 19567/24964/21814 27290/24966/21816 27291/24970/21820 19572/24969/21819
+f 19572/24969/21819 27291/24970/21820 31287/24950/21802 28587/24949/21801
+f 19573/24971/21821 19577/24972/21822 19578/24973/21823 19574/24974/21824
+f 19574/24974/21824 19578/24973/21823 27222/24598/21454 27221/24594/21450
+f 19577/24972/21822 28589/24962/21812 28588/24961/21811 19578/24973/21823
+f 19578/24973/21823 28588/24961/21811 31264/24580/21436 27222/24598/21454
+f 19573/24971/21821 19574/24974/21824 19579/24975/21825 19575/24976/21826
+f 19575/24976/21826 19579/24975/21825 28591/24977/21827 28592/24978/21828
+f 19574/24974/21824 27221/24594/21450 27220/24593/21449 19579/24975/21825
+f 19579/24975/21825 27220/24593/21449 31265/24596/21452 28591/24977/21827
+f 19573/24971/21821 19575/24976/21826 19580/24979/21829 19576/24980/21830
+f 19576/24980/21830 19580/24979/21829 27292/24981/21831 27293/24982/21832
+f 19575/24976/21826 28592/24978/21828 28593/24983/21833 19580/24979/21829
+f 19580/24979/21829 28593/24983/21833 31289/24984/21834 27292/24981/21831
+f 19573/24971/21821 19576/24980/21830 19581/24985/21835 19577/24972/21822
+f 19577/24972/21822 19581/24985/21835 28590/24967/21817 28589/24962/21812
+f 19576/24980/21830 27293/24982/21832 27294/24986/21836 19581/24985/21835
+f 19581/24985/21835 27294/24986/21836 31288/24968/21818 28590/24967/21817
+f 19582/24987/21837 19586/24988/21838 19587/24989/21839 19583/24990/21840
+f 19583/24990/21840 19587/24989/21839 27225/24614/21470 27224/24610/21466
+f 19586/24988/21838 28592/24978/21828 28591/24977/21827 19587/24989/21839
+f 19587/24989/21839 28591/24977/21827 31265/24596/21452 27225/24614/21470
+f 19582/24987/21837 19583/24990/21840 19588/24991/21841 19584/24992/21842
+f 19584/24992/21842 19588/24991/21841 28594/24993/21843 28595/24994/21844
+f 19583/24990/21840 27224/24610/21466 27223/24609/21465 19588/24991/21841
+f 19588/24991/21841 27223/24609/21465 31266/24612/21468 28594/24993/21843
+f 19582/24987/21837 19584/24992/21842 19589/24995/21845 19585/24996/21846
+f 19585/24996/21846 19589/24995/21845 27295/24997/21847 27296/24998/21848
+f 19584/24992/21842 28595/24994/21844 28596/24999/21849 19589/24995/21845
+f 19589/24995/21845 28596/24999/21849 31290/25000/21850 27295/24997/21847
+f 19582/24987/21837 19585/24996/21846 19590/25001/21851 19586/24988/21838
+f 19586/24988/21838 19590/25001/21851 28593/24983/21833 28592/24978/21828
+f 19585/24996/21846 27296/24998/21848 27297/25002/21852 19590/25001/21851
+f 19590/25001/21851 27297/25002/21852 31289/24984/21834 28593/24983/21833
+f 19591/25003/21853 19595/25004/21854 19596/25005/21855 19592/25006/21856
+f 19592/25006/21856 19596/25005/21855 27228/24630/21486 27227/24626/21482
+f 19595/25004/21854 28595/24994/21844 28594/24993/21843 19596/25005/21855
+f 19596/25005/21855 28594/24993/21843 31266/24612/21468 27228/24630/21486
+f 19591/25003/21853 19592/25006/21856 19597/25007/21857 19593/25008/21858
+f 19593/25008/21858 19597/25007/21857 28597/25009/21859 28598/25010/21860
+f 19592/25006/21856 27227/24626/21482 27226/24625/21481 19597/25007/21857
+f 19597/25007/21857 27226/24625/21481 31267/24628/21484 28597/25009/21859
+f 19591/25003/21853 19593/25008/21858 19598/25011/21861 19594/25012/21862
+f 19594/25012/21862 19598/25011/21861 27298/25013/21863 27299/25014/21864
+f 19593/25008/21858 28598/25010/21860 28599/25015/21865 19598/25011/21861
+f 19598/25011/21861 28599/25015/21865 31291/25016/21866 27298/25013/21863
+f 19591/25003/21853 19594/25012/21862 19599/25017/21867 19595/25004/21854
+f 19595/25004/21854 19599/25017/21867 28596/24999/21849 28595/24994/21844
+f 19594/25012/21862 27299/25014/21864 27300/25018/21868 19599/25017/21867
+f 19599/25017/21867 27300/25018/21868 31290/25000/21850 28596/24999/21849
+f 19600/25019/21869 19604/25020/21870 19605/25021/21871 19601/25022/21872
+f 19601/25022/21872 19605/25021/21871 27231/24646/21501 27230/24642/21497
+f 19604/25020/21870 28598/25010/21860 28597/25009/21859 19605/25021/21871
+f 19605/25021/21871 28597/25009/21859 31267/24628/21484 27231/24646/21501
+f 19600/25019/21869 19601/25022/21872 19606/25023/21873 19602/25024/21874
+f 19602/25024/21874 19606/25023/21873 28600/25025/21875 28601/25026/21876
+f 19601/25022/21872 27230/24642/21497 27229/24641/21496 19606/25023/21873
+f 19606/25023/21873 27229/24641/21496 31268/24644/21499 28600/25025/21875
+f 19600/25019/21869 19602/25024/21874 19607/25027/21877 19603/25028/21878
+f 19603/25028/21878 19607/25027/21877 27301/25029/21879 27302/25030/21880
+f 19602/25024/21874 28601/25026/21876 28602/25031/21881 19607/25027/21877
+f 19607/25027/21877 28602/25031/21881 31292/25032/15817 27301/25029/21879
+f 19600/25019/21869 19603/25028/21878 19608/25033/21882 19604/25020/21870
+f 19604/25020/21870 19608/25033/21882 28599/25015/21865 28598/25010/21860
+f 19603/25028/21878 27302/25030/21880 27303/25034/21883 19608/25033/21882
+f 19608/25033/21882 27303/25034/21883 31291/25016/21866 28599/25015/21865
+f 19609/25035/21884 19613/25036/21885 19614/25037/21886 19610/25038/21887
+f 19610/25038/21887 19614/25037/21886 27234/24658/21513 27233/24656/21511
+f 19613/25036/21885 28601/25026/21876 28600/25025/21875 19614/25037/21886
+f 19614/25037/21886 28600/25025/21875 31268/24644/21499 27234/24658/21513
+f 19609/25035/21884 19610/25038/21887 19615/25039/21888 19611/25040/21889
+f 19611/25040/21889 19615/25039/21888 28533/24664/21519 28532/24663/21518
+f 19610/25038/21887 27233/24656/21511 27232/24655/21510 19615/25039/21888
+f 19615/25039/21888 27232/24655/21510 31245/24290/21151 28533/24664/21519
+f 19609/25035/21884 19611/25040/21889 19616/25041/21890 19612/25042/21891
+f 19612/25042/21891 19616/25041/21890 27304/25043/21892 27305/25044/21893
+f 19611/25040/21889 28532/24663/21518 28531/24676/21531 19616/25041/21890
+f 19616/25041/21890 28531/24676/21531 31269/24678/21533 27304/25043/21892
+f 19609/25035/21884 19612/25042/21891 19617/25045/21894 19613/25036/21885
+f 19613/25036/21885 19617/25045/21894 28602/25031/21881 28601/25026/21876
+f 19612/25042/21891 27305/25044/21893 27306/25046/21895 19617/25045/21894
+f 19617/25045/21894 27306/25046/21895 31292/25032/15817 28602/25031/21881
+f 19618/25047/21896 19622/25048/21897 19623/25049/21898 19619/25050/21899
+f 19619/25050/21899 19623/25049/21898 27237/24677/21532 27236/24672/21527
+f 19622/25048/21897 28604/25051/21900 28605/25052/21901 19623/25049/21898
+f 19623/25049/21898 28605/25052/21901 31269/24678/21533 27237/24677/21532
+f 19618/25047/21896 19619/25050/21899 19624/25053/21902 19620/25054/21903
+f 19620/25054/21903 19624/25053/21902 28606/25055/21904 28607/25056/21905
+f 19619/25050/21899 27236/24672/21527 27235/24671/21526 19624/25053/21902
+f 19624/25053/21902 27235/24671/21526 31270/24674/21529 28606/25055/21904
+f 19618/25047/21896 19620/25054/21903 19625/25057/21906 19621/25058/21907
+f 19621/25058/21907 19625/25057/21906 27307/25059/21908 27308/25060/21909
+f 19620/25054/21903 28607/25056/21905 28608/25061/21910 19625/25057/21906
+f 19625/25057/21906 28608/25061/21910 31294/25062/21911 27307/25059/21908
+f 19618/25047/21896 19621/25058/21907 19626/25063/21912 19622/25048/21897
+f 19622/25048/21897 19626/25063/21912 28603/25064/21913 28604/25051/21900
+f 19621/25058/21907 27308/25060/21909 27309/25065/21914 19626/25063/21912
+f 19626/25063/21912 27309/25065/21914 31293/25066/21915 28603/25064/21913
+f 19627/25067/21916 19631/25068/21917 19632/25069/21918 19628/25070/21919
+f 19628/25070/21919 19632/25069/21918 27240/24694/21549 27239/24690/21545
+f 19631/25068/21917 28607/25056/21905 28606/25055/21904 19632/25069/21918
+f 19632/25069/21918 28606/25055/21904 31270/24674/21529 27240/24694/21549
+f 19627/25067/21916 19628/25070/21919 19633/25071/21920 19629/25072/21921
+f 19629/25072/21921 19633/25071/21920 28609/25073/21922 28610/25074/21923
+f 19628/25070/21919 27239/24690/21545 27238/24689/21544 19633/25071/21920
+f 19633/25071/21920 27238/24689/21544 31271/24692/21547 28609/25073/21922
+f 19627/25067/21916 19629/25072/21921 19634/25075/21924 19630/25076/21925
+f 19630/25076/21925 19634/25075/21924 27310/25077/21926 27311/25078/21927
+f 19629/25072/21921 28610/25074/21923 28611/25079/21928 19634/25075/21924
+f 19634/25075/21924 28611/25079/21928 31295/25080/21929 27310/25077/21926
+f 19627/25067/21916 19630/25076/21925 19635/25081/21930 19631/25068/21917
+f 19631/25068/21917 19635/25081/21930 28608/25061/21910 28607/25056/21905
+f 19630/25076/21925 27311/25078/21927 27312/25082/21931 19635/25081/21930
+f 19635/25081/21930 27312/25082/21931 31294/25062/21911 28608/25061/21910
+f 19636/25083/21932 19640/25084/21933 19641/25085/21934 19637/25086/21935
+f 19637/25086/21935 19641/25085/21934 27243/24710/21565 27242/24706/21561
+f 19640/25084/21933 28610/25074/21923 28609/25073/21922 19641/25085/21934
+f 19641/25085/21934 28609/25073/21922 31271/24692/21547 27243/24710/21565
+f 19636/25083/21932 19637/25086/21935 19642/25087/21936 19638/25088/21937
+f 19638/25088/21937 19642/25087/21936 28612/25089/21938 28613/25090/21939
+f 19637/25086/21935 27242/24706/21561 27241/24705/21560 19642/25087/21936
+f 19642/25087/21936 27241/24705/21560 31272/24708/21563 28612/25089/21938
+f 19636/25083/21932 19638/25088/21937 19643/25091/21940 19639/25092/21941
+f 19639/25092/21941 19643/25091/21940 27313/25093/21942 27314/25094/21943
+f 19638/25088/21937 28613/25090/21939 28614/25095/21944 19643/25091/21940
+f 19643/25091/21940 28614/25095/21944 31296/25096/21945 27313/25093/21942
+f 19636/25083/21932 19639/25092/21941 19644/25097/21946 19640/25084/21933
+f 19640/25084/21933 19644/25097/21946 28611/25079/21928 28610/25074/21923
+f 19639/25092/21941 27314/25094/21943 27315/25098/21947 19644/25097/21946
+f 19644/25097/21946 27315/25098/21947 31295/25080/21929 28611/25079/21928
+f 19645/25099/21948 19649/25100/21949 19650/25101/21950 19646/25102/21951
+f 19646/25102/21951 19650/25101/21950 27246/24726/21581 27245/24722/21577
+f 19649/25100/21949 28613/25090/21939 28612/25089/21938 19650/25101/21950
+f 19650/25101/21950 28612/25089/21938 31272/24708/21563 27246/24726/21581
+f 19645/25099/21948 19646/25102/21951 19651/25103/21952 19647/25104/21953
+f 19647/25104/21953 19651/25103/21952 28615/25105/21954 28616/25106/21955
+f 19646/25102/21951 27245/24722/21577 27244/24721/21576 19651/25103/21952
+f 19651/25103/21952 27244/24721/21576 31273/24724/21579 28615/25105/21954
+f 19645/25099/21948 19647/25104/21953 19652/25107/21956 19648/25108/21957
+f 19648/25108/21957 19652/25107/21956 27316/25109/21958 27317/25110/21959
+f 19647/25104/21953 28616/25106/21955 28617/25111/21960 19652/25107/21956
+f 19652/25107/21956 28617/25111/21960 31297/25112/21961 27316/25109/21958
+f 19645/25099/21948 19648/25108/21957 19653/25113/21962 19649/25100/21949
+f 19649/25100/21949 19653/25113/21962 28614/25095/21944 28613/25090/21939
+f 19648/25108/21957 27317/25110/21959 27318/25114/21963 19653/25113/21962
+f 19653/25113/21962 27318/25114/21963 31296/25096/21945 28614/25095/21944
+f 19654/25115/21964 19658/25116/21965 19659/25117/21966 19655/25118/21967
+f 19655/25118/21967 19659/25117/21966 27249/24742/21597 27248/24738/21593
+f 19658/25116/21965 28616/25106/21955 28615/25105/21954 19659/25117/21966
+f 19659/25117/21966 28615/25105/21954 31273/24724/21579 27249/24742/21597
+f 19654/25115/21964 19655/25118/21967 19660/25119/21968 19656/25120/21969
+f 19656/25120/21969 19660/25119/21968 28618/25121/21970 28619/25122/21971
+f 19655/25118/21967 27248/24738/21593 27247/24737/21592 19660/25119/21968
+f 19660/25119/21968 27247/24737/21592 31274/24740/21595 28618/25121/21970
+f 19654/25115/21964 19656/25120/21969 19661/25123/21972 19657/25124/21973
+f 19657/25124/21973 19661/25123/21972 27319/25125/21974 27320/25126/21975
+f 19656/25120/21969 28619/25122/21971 28620/25127/21976 19661/25123/21972
+f 19661/25123/21972 28620/25127/21976 31298/25128/21977 27319/25125/21974
+f 19654/25115/21964 19657/25124/21973 19662/25129/21978 19658/25116/21965
+f 19658/25116/21965 19662/25129/21978 28617/25111/21960 28616/25106/21955
+f 19657/25124/21973 27320/25126/21975 27321/25130/21979 19662/25129/21978
+f 19662/25129/21978 27321/25130/21979 31297/25112/21961 28617/25111/21960
+f 19663/25131/21980 19667/25132/21981 19668/25133/21982 19664/25134/21983
+f 19664/25134/21983 19668/25133/21982 27252/24758/21613 27251/24754/21609
+f 19667/25132/21981 28619/25122/21971 28618/25121/21970 19668/25133/21982
+f 19668/25133/21982 28618/25121/21970 31274/24740/21595 27252/24758/21613
+f 19663/25131/21980 19664/25134/21983 19669/25135/21984 19665/25136/21985
+f 19665/25136/21985 19669/25135/21984 28621/25137/21986 28622/25138/21987
+f 19664/25134/21983 27251/24754/21609 27250/24753/21608 19669/25135/21984
+f 19669/25135/21984 27250/24753/21608 31275/24756/21611 28621/25137/21986
+f 19663/25131/21980 19665/25136/21985 19670/25139/21988 19666/25140/21989
+f 19666/25140/21989 19670/25139/21988 27322/25141/21990 27323/25142/21991
+f 19665/25136/21985 28622/25138/21987 28623/25143/21992 19670/25139/21988
+f 19670/25139/21988 28623/25143/21992 31299/25144/21993 27322/25141/21990
+f 19663/25131/21980 19666/25140/21989 19671/25145/21994 19667/25132/21981
+f 19667/25132/21981 19671/25145/21994 28620/25127/21976 28619/25122/21971
+f 19666/25140/21989 27323/25142/21991 27324/25146/21995 19671/25145/21994
+f 19671/25145/21994 27324/25146/21995 31298/25128/21977 28620/25127/21976
+f 19672/25147/21996 19676/25148/21997 19677/25149/21998 19673/25150/21999
+f 19673/25150/21999 19677/25149/21998 27255/24774/21629 27254/24770/21625
+f 19676/25148/21997 28622/25138/21987 28621/25137/21986 19677/25149/21998
+f 19677/25149/21998 28621/25137/21986 31275/24756/21611 27255/24774/21629
+f 19672/25147/21996 19673/25150/21999 19678/25151/22000 19674/25152/22001
+f 19674/25152/22001 19678/25151/22000 28624/25153/22002 28625/25154/22003
+f 19673/25150/21999 27254/24770/21625 27253/24769/21624 19678/25151/22000
+f 19678/25151/22000 27253/24769/21624 31276/24772/21627 28624/25153/22002
+f 19672/25147/21996 19674/25152/22001 19679/25155/22004 19675/25156/22005
+f 19675/25156/22005 19679/25155/22004 27325/25157/22006 27326/25158/22007
+f 19674/25152/22001 28625/25154/22003 28626/25159/22008 19679/25155/22004
+f 19679/25155/22004 28626/25159/22008 31300/25160/22009 27325/25157/22006
+f 19672/25147/21996 19675/25156/22005 19680/25161/22010 19676/25148/21997
+f 19676/25148/21997 19680/25161/22010 28623/25143/21992 28622/25138/21987
+f 19675/25156/22005 27326/25158/22007 27327/25162/22011 19680/25161/22010
+f 19680/25161/22010 27327/25162/22011 31299/25144/21993 28623/25143/21992
+f 19681/25163/22012 19685/25164/22013 19686/25165/22014 19682/25166/22015
+f 19682/25166/22015 19686/25165/22014 27258/24790/21645 27257/24786/21641
+f 19685/25164/22013 28625/25154/22003 28624/25153/22002 19686/25165/22014
+f 19686/25165/22014 28624/25153/22002 31276/24772/21627 27258/24790/21645
+f 19681/25163/22012 19682/25166/22015 19687/25167/22016 19683/25168/22017
+f 19683/25168/22017 19687/25167/22016 28627/25169/22018 28628/25170/22019
+f 19682/25166/22015 27257/24786/21641 27256/24785/21640 19687/25167/22016
+f 19687/25167/22016 27256/24785/21640 31277/24788/21643 28627/25169/22018
+f 19681/25163/22012 19683/25168/22017 19688/25171/22020 19684/25172/22021
+f 19684/25172/22021 19688/25171/22020 27328/25173/22022 27329/25174/22023
+f 19683/25168/22017 28628/25170/22019 28629/25175/22024 19688/25171/22020
+f 19688/25171/22020 28629/25175/22024 31301/25176/22025 27328/25173/22022
+f 19681/25163/22012 19684/25172/22021 19689/25177/22026 19685/25164/22013
+f 19685/25164/22013 19689/25177/22026 28626/25159/22008 28625/25154/22003
+f 19684/25172/22021 27329/25174/22023 27330/25178/22027 19689/25177/22026
+f 19689/25177/22026 27330/25178/22027 31300/25160/22009 28626/25159/22008
+f 19690/25179/22028 19694/25180/22029 19695/25181/22030 19691/25182/22031
+f 19691/25182/22031 19695/25181/22030 27261/24806/21661 27260/24802/21657
+f 19694/25180/22029 28628/25170/22019 28627/25169/22018 19695/25181/22030
+f 19695/25181/22030 28627/25169/22018 31277/24788/21643 27261/24806/21661
+f 19690/25179/22028 19691/25182/22031 19696/25183/22032 19692/25184/22033
+f 19692/25184/22033 19696/25183/22032 28630/25185/22034 28631/25186/22035
+f 19691/25182/22031 27260/24802/21657 27259/24801/21656 19696/25183/22032
+f 19696/25183/22032 27259/24801/21656 31278/24804/21659 28630/25185/22034
+f 19690/25179/22028 19692/25184/22033 19697/25187/22036 19693/25188/22037
+f 19693/25188/22037 19697/25187/22036 27331/25189/22038 27332/25190/22039
+f 19692/25184/22033 28631/25186/22035 28632/25191/22040 19697/25187/22036
+f 19697/25187/22036 28632/25191/22040 31302/25192/22041 27331/25189/22038
+f 19690/25179/22028 19693/25188/22037 19698/25193/22042 19694/25180/22029
+f 19694/25180/22029 19698/25193/22042 28629/25175/22024 28628/25170/22019
+f 19693/25188/22037 27332/25190/22039 27333/25194/22043 19698/25193/22042
+f 19698/25193/22042 27333/25194/22043 31301/25176/22025 28629/25175/22024
+f 19699/25195/22044 19703/25196/22045 19704/25197/22046 19700/25198/22047
+f 19700/25198/22047 19704/25197/22046 27264/24822/21677 27263/24818/21673
+f 19703/25196/22045 28631/25186/22035 28630/25185/22034 19704/25197/22046
+f 19704/25197/22046 28630/25185/22034 31278/24804/21659 27264/24822/21677
+f 19699/25195/22044 19700/25198/22047 19705/25199/22048 19701/25200/22049
+f 19701/25200/22049 19705/25199/22048 28633/25201/22050 28634/25202/22051
+f 19700/25198/22047 27263/24818/21673 27262/24817/21672 19705/25199/22048
+f 19705/25199/22048 27262/24817/21672 31279/24820/21675 28633/25201/22050
+f 19699/25195/22044 19701/25200/22049 19706/25203/22052 19702/25204/22053
+f 19702/25204/22053 19706/25203/22052 27334/25205/22054 27335/25206/22055
+f 19701/25200/22049 28634/25202/22051 28635/25207/22056 19706/25203/22052
+f 19706/25203/22052 28635/25207/22056 31303/25208/22057 27334/25205/22054
+f 19699/25195/22044 19702/25204/22053 19707/25209/22058 19703/25196/22045
+f 19703/25196/22045 19707/25209/22058 28632/25191/22040 28631/25186/22035
+f 19702/25204/22053 27335/25206/22055 27336/25210/22059 19707/25209/22058
+f 19707/25209/22058 27336/25210/22059 31302/25192/22041 28632/25191/22040
+f 19708/25211/22060 19712/25212/22061 19713/25213/22062 19709/25214/22063
+f 19709/25214/22063 19713/25213/22062 27267/24838/21692 27266/24834/21689
+f 19712/25212/22061 28634/25202/22051 28633/25201/22050 19713/25213/22062
+f 19713/25213/22062 28633/25201/22050 31279/24820/21675 27267/24838/21692
+f 19708/25211/22060 19709/25214/22063 19714/25215/22064 19710/25216/22065
+f 19710/25216/22065 19714/25215/22064 28636/25217/16006 28637/25218/16007
+f 19709/25214/22063 27266/24834/21689 27265/24833/21688 19714/25215/22064
+f 19714/25215/22064 27265/24833/21688 31280/24836/16009 28636/25217/16006
+f 19708/25211/22060 19710/25216/22065 19715/25219/22066 19711/25220/22067
+f 19711/25220/22067 19715/25219/22066 27337/25221/22068 27338/25222/22069
+f 19710/25216/22065 28637/25218/16007 28638/25223/16011 19715/25219/22066
+f 19715/25219/22066 28638/25223/16011 31304/25224/15625 27337/25221/22068
+f 19708/25211/22060 19711/25220/22067 19716/25225/22070 19712/25212/22061
+f 19712/25212/22061 19716/25225/22070 28635/25207/22056 28634/25202/22051
+f 19711/25220/22067 27338/25222/22069 27339/25226/22071 19716/25225/22070
+f 19716/25225/22070 27339/25226/22071 31303/25208/22057 28635/25207/22056
+f 19717/25227/22072 19721/25228/22073 19722/25229/22074 19718/25230/22075
+f 19718/25230/22075 19722/25229/22074 27270/24854/21708 27269/24850/21704
+f 19721/25228/22073 28637/25218/16007 28636/25217/16006 19722/25229/22074
+f 19722/25229/22074 28636/25217/16006 31280/24836/16009 27270/24854/21708
+f 19717/25227/22072 19718/25230/22075 19723/25231/22076 19719/25232/22077
+f 19719/25232/22077 19723/25231/22076 28639/25233/22078 28640/25234/22079
+f 19718/25230/22075 27269/24850/21704 27268/24849/21703 19723/25231/22076
+f 19723/25231/22076 27268/24849/21703 31281/24852/21706 28639/25233/22078
+f 19717/25227/22072 19719/25232/22077 19724/25235/22080 19720/25236/22081
+f 19720/25236/22081 19724/25235/22080 27340/25237/22082 27341/25238/22083
+f 19719/25232/22077 28640/25234/22079 28641/25239/22084 19724/25235/22080
+f 19724/25235/22080 28641/25239/22084 31305/25240/22085 27340/25237/22082
+f 19717/25227/22072 19720/25236/22081 19725/25241/22086 19721/25228/22073
+f 19721/25228/22073 19725/25241/22086 28638/25223/16011 28637/25218/16007
+f 19720/25236/22081 27341/25238/22083 27342/25242/22087 19725/25241/22086
+f 19725/25241/22086 27342/25242/22087 31304/25224/15625 28638/25223/16011
+f 19726/25243/22088 19730/25244/22089 19731/25245/22090 19727/25246/22091
+f 19727/25246/22091 19731/25245/22090 27273/24870/21724 27272/24866/21720
+f 19730/25244/22089 28640/25234/22079 28639/25233/22078 19731/25245/22090
+f 19731/25245/22090 28639/25233/22078 31281/24852/21706 27273/24870/21724
+f 19726/25243/22088 19727/25246/22091 19732/25247/22092 19728/25248/22093
+f 19728/25248/22093 19732/25247/22092 28642/25249/22094 28643/25250/22095
+f 19727/25246/22091 27272/24866/21720 27271/24865/21719 19732/25247/22092
+f 19732/25247/22092 27271/24865/21719 31282/24868/21722 28642/25249/22094
+f 19726/25243/22088 19728/25248/22093 19733/25251/22096 19729/25252/22097
+f 19729/25252/22097 19733/25251/22096 27343/25253/22098 27344/25254/22099
+f 19728/25248/22093 28643/25250/22095 28644/25255/22100 19733/25251/22096
+f 19733/25251/22096 28644/25255/22100 31306/25256/22101 27343/25253/22098
+f 19726/25243/22088 19729/25252/22097 19734/25257/22102 19730/25244/22089
+f 19730/25244/22089 19734/25257/22102 28641/25239/22084 28640/25234/22079
+f 19729/25252/22097 27344/25254/22099 27345/25258/22103 19734/25257/22102
+f 19734/25257/22102 27345/25258/22103 31305/25240/22085 28641/25239/22084
+f 19735/25259/22104 19739/25260/22105 19740/25261/22106 19736/25262/22107
+f 19736/25262/22107 19740/25261/22106 27276/24886/21740 27275/24882/21736
+f 19739/25260/22105 28643/25250/22095 28642/25249/22094 19740/25261/22106
+f 19740/25261/22106 28642/25249/22094 31282/24868/21722 27276/24886/21740
+f 19735/25259/22104 19736/25262/22107 19741/25263/22108 19737/25264/22109
+f 19737/25264/22109 19741/25263/22108 28645/25265/22110 28646/25266/22111
+f 19736/25262/22107 27275/24882/21736 27274/24881/21735 19741/25263/22108
+f 19741/25263/22108 27274/24881/21735 31283/24884/21738 28645/25265/22110
+f 19735/25259/22104 19737/25264/22109 19742/25267/22112 19738/25268/22113
+f 19738/25268/22113 19742/25267/22112 27346/25269/22114 27347/25270/22115
+f 19737/25264/22109 28646/25266/22111 28647/25271/22116 19742/25267/22112
+f 19742/25267/22112 28647/25271/22116 31307/25272/22117 27346/25269/22114
+f 19735/25259/22104 19738/25268/22113 19743/25273/22118 19739/25260/22105
+f 19739/25260/22105 19743/25273/22118 28644/25255/22100 28643/25250/22095
+f 19738/25268/22113 27347/25270/22115 27348/25274/22119 19743/25273/22118
+f 19743/25273/22118 27348/25274/22119 31306/25256/22101 28644/25255/22100
+f 19744/25275/22120 19748/25276/22121 19749/25277/22122 19745/25278/22123
+f 19745/25278/22123 19749/25277/22122 27279/24902/21756 27278/24898/21752
+f 19748/25276/22121 28646/25266/22111 28645/25265/22110 19749/25277/22122
+f 19749/25277/22122 28645/25265/22110 31283/24884/21738 27279/24902/21756
+f 19744/25275/22120 19745/25278/22123 19750/25279/22124 19746/25280/22125
+f 19746/25280/22125 19750/25279/22124 28648/25281/22126 28649/25282/22127
+f 19745/25278/22123 27278/24898/21752 27277/24897/21751 19750/25279/22124
+f 19750/25279/22124 27277/24897/21751 31284/24900/21754 28648/25281/22126
+f 19744/25275/22120 19746/25280/22125 19751/25283/22128 19747/25284/22129
+f 19747/25284/22129 19751/25283/22128 27349/25285/22130 27350/25286/22131
+f 19746/25280/22125 28649/25282/22127 28650/25287/22132 19751/25283/22128
+f 19751/25283/22128 28650/25287/22132 31308/25288/22133 27349/25285/22130
+f 19744/25275/22120 19747/25284/22129 19752/25289/22134 19748/25276/22121
+f 19748/25276/22121 19752/25289/22134 28647/25271/22116 28646/25266/22111
+f 19747/25284/22129 27350/25286/22131 27351/25290/22135 19752/25289/22134
+f 19752/25289/22134 27351/25290/22135 31307/25272/22117 28647/25271/22116
+f 19753/25291/22136 19757/25292/22137 19758/25293/22138 19754/25294/22139
+f 19754/25294/22139 19758/25293/22138 27282/24918/21772 27281/24914/21768
+f 19757/25292/22137 28649/25282/22127 28648/25281/22126 19758/25293/22138
+f 19758/25293/22138 28648/25281/22126 31284/24900/21754 27282/24918/21772
+f 19753/25291/22136 19754/25294/22139 19759/25295/22140 19755/25296/22141
+f 19755/25296/22141 19759/25295/22140 28651/25297/22142 28652/25298/22143
+f 19754/25294/22139 27281/24914/21768 27280/24913/21767 19759/25295/22140
+f 19759/25295/22140 27280/24913/21767 31285/24916/21770 28651/25297/22142
+f 19753/25291/22136 19755/25296/22141 19760/25299/22144 19756/25300/22145
+f 19756/25300/22145 19760/25299/22144 27352/25301/22146 27353/25302/22147
+f 19755/25296/22141 28652/25298/22143 28653/25303/22148 19760/25299/22144
+f 19760/25299/22144 28653/25303/22148 31309/25304/22149 27352/25301/22146
+f 19753/25291/22136 19756/25300/22145 19761/25305/22150 19757/25292/22137
+f 19757/25292/22137 19761/25305/22150 28650/25287/22132 28649/25282/22127
+f 19756/25300/22145 27353/25302/22147 27354/25306/22151 19761/25305/22150
+f 19761/25305/22150 27354/25306/22151 31308/25288/22133 28650/25287/22132
+f 19762/25307/22152 19766/25308/22153 19767/25309/22154 19763/25310/22155
+f 19763/25310/22155 19767/25309/22154 27285/24934/21788 27284/24930/21784
+f 19766/25308/22153 28652/25298/22143 28651/25297/22142 19767/25309/22154
+f 19767/25309/22154 28651/25297/22142 31285/24916/21770 27285/24934/21788
+f 19762/25307/22152 19763/25310/22155 19768/25311/22156 19764/25312/22157
+f 19764/25312/22157 19768/25311/22156 28654/25313/22158 28655/25314/22159
+f 19763/25310/22155 27284/24930/21784 27283/24929/21783 19768/25311/22156
+f 19768/25311/22156 27283/24929/21783 31286/24932/21786 28654/25313/22158
+f 19762/25307/22152 19764/25312/22157 19769/25315/22160 19765/25316/22161
+f 19765/25316/22161 19769/25315/22160 27355/25317/22162 27356/25318/22163
+f 19764/25312/22157 28655/25314/22159 28656/25319/22164 19769/25315/22160
+f 19769/25315/22160 28656/25319/22164 31310/25320/22165 27355/25317/22162
+f 19762/25307/22152 19765/25316/22161 19770/25321/22166 19766/25308/22153
+f 19766/25308/22153 19770/25321/22166 28653/25303/22148 28652/25298/22143
+f 19765/25316/22161 27356/25318/22163 27357/25322/22167 19770/25321/22166
+f 19770/25321/22166 27357/25322/22167 31309/25304/22149 28653/25303/22148
+f 19771/25323/22168 19775/25324/22169 19776/25325/22170 19772/25326/22171
+f 19772/25326/22171 19776/25325/22170 27288/24953/21804 27287/24948/21800
+f 19775/25324/22169 28655/25327/22159 28654/25328/22158 19776/25325/22170
+f 19776/25325/22170 28654/25328/22158 31286/24954/21786 27288/24953/21804
+f 19771/25323/22168 19772/25326/22171 19777/25329/22172 19773/25330/22173
+f 19773/25330/22173 19777/25329/22172 28657/25331/22174 28658/25332/22175
+f 19772/25326/22171 27287/24948/21800 27286/24947/21799 19777/25329/22172
+f 19777/25329/22172 27286/24947/21799 31287/24950/21802 28657/25331/22174
+f 19771/25323/22168 19773/25330/22173 19778/25333/22176 19774/25334/22177
+f 19774/25334/22177 19778/25333/22176 27358/25335/22178 27359/25336/22179
+f 19773/25330/22173 28658/25332/22175 28659/25337/22180 19778/25333/22176
+f 19778/25333/22176 28659/25337/22180 31311/25338/22181 27358/25335/22178
+f 19771/25323/22168 19774/25334/22177 19779/25339/22182 19775/25324/22169
+f 19775/25324/22169 19779/25339/22182 28656/25340/22164 28655/25327/22159
+f 19774/25334/22177 27359/25336/22179 27360/25341/22183 19779/25339/22182
+f 19779/25339/22182 27360/25341/22183 31310/25342/22165 28656/25340/22164
+f 19780/25343/22184 19784/25344/22185 19785/25345/22186 19781/25346/22187
+f 19781/25346/22187 19785/25345/22186 27291/24970/21820 27290/24966/21816
+f 19784/25344/22185 28658/25332/22175 28657/25331/22174 19785/25345/22186
+f 19785/25345/22186 28657/25331/22174 31287/24950/21802 27291/24970/21820
+f 19780/25343/22184 19781/25346/22187 19786/25347/22188 19782/25348/22189
+f 19782/25348/22189 19786/25347/22188 28660/25349/22190 28661/25350/22191
+f 19781/25346/22187 27290/24966/21816 27289/24965/21815 19786/25347/22188
+f 19786/25347/22188 27289/24965/21815 31288/24968/21818 28660/25349/22190
+f 19780/25343/22184 19782/25348/22189 19787/25351/22192 19783/25352/22193
+f 19783/25352/22193 19787/25351/22192 27361/25353/22194 27362/25354/22195
+f 19782/25348/22189 28661/25350/22191 28662/25355/22196 19787/25351/22192
+f 19787/25351/22192 28662/25355/22196 31312/25356/22197 27361/25353/22194
+f 19780/25343/22184 19783/25352/22193 19788/25357/22198 19784/25344/22185
+f 19784/25344/22185 19788/25357/22198 28659/25337/22180 28658/25332/22175
+f 19783/25352/22193 27362/25354/22195 27363/25358/22199 19788/25357/22198
+f 19788/25357/22198 27363/25358/22199 31311/25338/22181 28659/25337/22180
+f 19789/25359/22200 19793/25360/22201 19794/25361/22202 19790/25362/22203
+f 19790/25362/22203 19794/25361/22202 27294/24986/21836 27293/24982/21832
+f 19793/25360/22201 28661/25350/22191 28660/25349/22190 19794/25361/22202
+f 19794/25361/22202 28660/25349/22190 31288/24968/21818 27294/24986/21836
+f 19789/25359/22200 19790/25362/22203 19795/25363/22204 19791/25364/22205
+f 19791/25364/22205 19795/25363/22204 28663/25365/22206 28664/25366/22207
+f 19790/25362/22203 27293/24982/21832 27292/24981/21831 19795/25363/22204
+f 19795/25363/22204 27292/24981/21831 31289/24984/21834 28663/25365/22206
+f 19789/25359/22200 19791/25364/22205 19796/25367/22208 19792/25368/22209
+f 19792/25368/22209 19796/25367/22208 27364/25369/22210 27365/25370/22211
+f 19791/25364/22205 28664/25366/22207 28665/25371/22212 19796/25367/22208
+f 19796/25367/22208 28665/25371/22212 31313/25372/22213 27364/25369/22210
+f 19789/25359/22200 19792/25368/22209 19797/25373/22214 19793/25360/22201
+f 19793/25360/22201 19797/25373/22214 28662/25355/22196 28661/25350/22191
+f 19792/25368/22209 27365/25370/22211 27366/25374/22215 19797/25373/22214
+f 19797/25373/22214 27366/25374/22215 31312/25356/22197 28662/25355/22196
+f 19798/25375/22216 19802/25376/22217 19803/25377/22218 19799/25378/22219
+f 19799/25378/22219 19803/25377/22218 27297/25002/21852 27296/24998/21848
+f 19802/25376/22217 28664/25366/22207 28663/25365/22206 19803/25377/22218
+f 19803/25377/22218 28663/25365/22206 31289/24984/21834 27297/25002/21852
+f 19798/25375/22216 19799/25378/22219 19804/25379/22220 19800/25380/22221
+f 19800/25380/22221 19804/25379/22220 28666/25381/22222 28667/25382/22223
+f 19799/25378/22219 27296/24998/21848 27295/24997/21847 19804/25379/22220
+f 19804/25379/22220 27295/24997/21847 31290/25000/21850 28666/25381/22222
+f 19798/25375/22216 19800/25380/22221 19805/25383/22224 19801/25384/22225
+f 19801/25384/22225 19805/25383/22224 27367/25385/22226 27368/25386/22227
+f 19800/25380/22221 28667/25382/22223 28668/25387/22228 19805/25383/22224
+f 19805/25383/22224 28668/25387/22228 31314/25388/22229 27367/25385/22226
+f 19798/25375/22216 19801/25384/22225 19806/25389/22230 19802/25376/22217
+f 19802/25376/22217 19806/25389/22230 28665/25371/22212 28664/25366/22207
+f 19801/25384/22225 27368/25386/22227 27369/25390/22231 19806/25389/22230
+f 19806/25389/22230 27369/25390/22231 31313/25372/22213 28665/25371/22212
+f 19807/25391/22232 19811/25392/22233 19812/25393/22234 19808/25394/22235
+f 19808/25394/22235 19812/25393/22234 27300/25018/21868 27299/25014/21864
+f 19811/25392/22233 28667/25382/22223 28666/25381/22222 19812/25393/22234
+f 19812/25393/22234 28666/25381/22222 31290/25000/21850 27300/25018/21868
+f 19807/25391/22232 19808/25394/22235 19813/25395/22236 19809/25396/22237
+f 19809/25396/22237 19813/25395/22236 28669/25397/22238 28670/25398/22239
+f 19808/25394/22235 27299/25014/21864 27298/25013/21863 19813/25395/22236
+f 19813/25395/22236 27298/25013/21863 31291/25016/21866 28669/25397/22238
+f 19807/25391/22232 19809/25396/22237 19814/25399/22240 19810/25400/22241
+f 19810/25400/22241 19814/25399/22240 27370/25401/22242 27371/25402/22243
+f 19809/25396/22237 28670/25398/22239 28671/25403/22244 19814/25399/22240
+f 19814/25399/22240 28671/25403/22244 31315/25404/22245 27370/25401/22242
+f 19807/25391/22232 19810/25400/22241 19815/25405/22246 19811/25392/22233
+f 19811/25392/22233 19815/25405/22246 28668/25387/22228 28667/25382/22223
+f 19810/25400/22241 27371/25402/22243 27372/25406/22247 19815/25405/22246
+f 19815/25405/22246 27372/25406/22247 31314/25388/22229 28668/25387/22228
+f 19816/25407/22248 19820/25408/22249 19821/25409/22250 19817/25410/22251
+f 19817/25410/22251 19821/25409/22250 27303/25034/21883 27302/25030/21880
+f 19820/25408/22249 28670/25398/22239 28669/25397/22238 19821/25409/22250
+f 19821/25409/22250 28669/25397/22238 31291/25016/21866 27303/25034/21883
+f 19816/25407/22248 19817/25410/22251 19822/25411/22252 19818/25412/22253
+f 19818/25412/22253 19822/25411/22252 28672/25413/22254 28673/25414/15815
+f 19817/25410/22251 27302/25030/21880 27301/25029/21879 19822/25411/22252
+f 19822/25411/22252 27301/25029/21879 31292/25032/15817 28672/25413/22254
+f 19816/25407/22248 19818/25412/22253 19823/25415/22255 19819/25416/22256
+f 19819/25416/22256 19823/25415/22255 27373/25417/22257 27374/25418/22258
+f 19818/25412/22253 28673/25414/15815 28674/25419/15819 19823/25415/22255
+f 19823/25415/22255 28674/25419/15819 31316/25420/15433 27373/25417/22257
+f 19816/25407/22248 19819/25416/22256 19824/25421/22259 19820/25408/22249
+f 19820/25408/22249 19824/25421/22259 28671/25403/22244 28670/25398/22239
+f 19819/25416/22256 27374/25418/22258 27375/25422/22260 19824/25421/22259
+f 19824/25421/22259 27375/25422/22260 31315/25404/22245 28671/25403/22244
+f 19825/25423/22261 19829/25424/22262 19830/25425/22263 19826/25426/22264
+f 19826/25426/22264 19830/25425/22263 27306/25046/21895 27305/25044/21893
+f 19829/25424/22262 28673/25414/15815 28672/25413/22254 19830/25425/22263
+f 19830/25425/22263 28672/25413/22254 31292/25032/15817 27306/25046/21895
+f 19825/25423/22261 19826/25426/22264 19831/25427/22265 19827/25428/22266
+f 19827/25428/22266 19831/25427/22265 28605/25052/21901 28604/25051/21900
+f 19826/25426/22264 27305/25044/21893 27304/25043/21892 19831/25427/22265
+f 19831/25427/22265 27304/25043/21892 31269/24678/21533 28605/25052/21901
+f 19825/25423/22261 19827/25428/22266 19832/25429/22267 19828/25430/22268
+f 19828/25430/22268 19832/25429/22267 27376/25431/22269 27377/25432/22270
+f 19827/25428/22266 28604/25051/21900 28603/25064/21913 19832/25429/22267
+f 19832/25429/22267 28603/25064/21913 31293/25066/21915 27376/25431/22269
+f 19825/25423/22261 19828/25430/22268 19833/25433/22271 19829/25424/22262
+f 19829/25424/22262 19833/25433/22271 28674/25419/15819 28673/25414/15815
+f 19828/25430/22268 27377/25432/22270 27378/25434/22272 19833/25433/22271
+f 19833/25433/22271 27378/25434/22272 31316/25420/15433 28674/25419/15819
+f 19834/25435/22273 19838/25436/22274 19839/25437/22275 19835/25438/22276
+f 19835/25438/22276 19839/25437/22275 27309/25065/21914 27308/25060/21909
+f 19838/25436/22274 28676/25439/22277 28677/25440/22278 19839/25437/22275
+f 19839/25437/22275 28677/25440/22278 31293/25066/21915 27309/25065/21914
+f 19834/25435/22273 19835/25438/22276 19840/25441/22279 19836/25442/22280
+f 19836/25442/22280 19840/25441/22279 28678/25443/22281 28679/25444/22282
+f 19835/25438/22276 27308/25060/21909 27307/25059/21908 19840/25441/22279
+f 19840/25441/22279 27307/25059/21908 31294/25062/21911 28678/25443/22281
+f 19834/25435/22273 19836/25442/22280 19841/25445/22283 19837/25446/22284
+f 19837/25446/22284 19841/25445/22283 27379/25447/22285 27380/25448/22286
+f 19836/25442/22280 28679/25444/22282 28680/25449/22287 19841/25445/22283
+f 19841/25445/22283 28680/25449/22287 31318/25450/22288 27379/25447/22285
+f 19834/25435/22273 19837/25446/22284 19842/25451/22289 19838/25436/22274
+f 19838/25436/22274 19842/25451/22289 28675/25452/22290 28676/25439/22277
+f 19837/25446/22284 27380/25448/22286 27381/25453/22291 19842/25451/22289
+f 19842/25451/22289 27381/25453/22291 31317/25454/22292 28675/25452/22290
+f 19843/25455/22293 19847/25456/22294 19848/25457/22295 19844/25458/22296
+f 19844/25458/22296 19848/25457/22295 27312/25082/21931 27311/25078/21927
+f 19847/25456/22294 28679/25444/22282 28678/25443/22281 19848/25457/22295
+f 19848/25457/22295 28678/25443/22281 31294/25062/21911 27312/25082/21931
+f 19843/25455/22293 19844/25458/22296 19849/25459/22297 19845/25460/22298
+f 19845/25460/22298 19849/25459/22297 28681/25461/22299 28682/25462/22300
+f 19844/25458/22296 27311/25078/21927 27310/25077/21926 19849/25459/22297
+f 19849/25459/22297 27310/25077/21926 31295/25080/21929 28681/25461/22299
+f 19843/25455/22293 19845/25460/22298 19850/25463/22301 19846/25464/22302
+f 19846/25464/22302 19850/25463/22301 27382/25465/22303 27383/25466/22304
+f 19845/25460/22298 28682/25462/22300 28683/25467/22305 19850/25463/22301
+f 19850/25463/22301 28683/25467/22305 31319/25468/22306 27382/25465/22303
+f 19843/25455/22293 19846/25464/22302 19851/25469/22307 19847/25456/22294
+f 19847/25456/22294 19851/25469/22307 28680/25449/22287 28679/25444/22282
+f 19846/25464/22302 27383/25466/22304 27384/25470/22308 19851/25469/22307
+f 19851/25469/22307 27384/25470/22308 31318/25450/22288 28680/25449/22287
+f 19852/25471/22309 19856/25472/22310 19857/25473/22311 19853/25474/22312
+f 19853/25474/22312 19857/25473/22311 27315/25098/21947 27314/25094/21943
+f 19856/25472/22310 28682/25462/22300 28681/25461/22299 19857/25473/22311
+f 19857/25473/22311 28681/25461/22299 31295/25080/21929 27315/25098/21947
+f 19852/25471/22309 19853/25474/22312 19858/25475/22313 19854/25476/22314
+f 19854/25476/22314 19858/25475/22313 28684/25477/22315 28685/25478/22316
+f 19853/25474/22312 27314/25094/21943 27313/25093/21942 19858/25475/22313
+f 19858/25475/22313 27313/25093/21942 31296/25096/21945 28684/25477/22315
+f 19852/25471/22309 19854/25476/22314 19859/25479/22317 19855/25480/22318
+f 19855/25480/22318 19859/25479/22317 27385/25481/22319 27386/25482/22320
+f 19854/25476/22314 28685/25478/22316 28686/25483/22321 19859/25479/22317
+f 19859/25479/22317 28686/25483/22321 31320/25484/22322 27385/25481/22319
+f 19852/25471/22309 19855/25480/22318 19860/25485/22323 19856/25472/22310
+f 19856/25472/22310 19860/25485/22323 28683/25467/22305 28682/25462/22300
+f 19855/25480/22318 27386/25482/22320 27387/25486/22324 19860/25485/22323
+f 19860/25485/22323 27387/25486/22324 31319/25468/22306 28683/25467/22305
+f 19861/25487/22325 19865/25488/22326 19866/25489/22327 19862/25490/22328
+f 19862/25490/22328 19866/25489/22327 27318/25114/21963 27317/25110/21959
+f 19865/25488/22326 28685/25478/22316 28684/25477/22315 19866/25489/22327
+f 19866/25489/22327 28684/25477/22315 31296/25096/21945 27318/25114/21963
+f 19861/25487/22325 19862/25490/22328 19867/25491/22329 19863/25492/22330
+f 19863/25492/22330 19867/25491/22329 28687/25493/22331 28688/25494/22332
+f 19862/25490/22328 27317/25110/21959 27316/25109/21958 19867/25491/22329
+f 19867/25491/22329 27316/25109/21958 31297/25112/21961 28687/25493/22331
+f 19861/25487/22325 19863/25492/22330 19868/25495/22333 19864/25496/22334
+f 19864/25496/22334 19868/25495/22333 27388/25497/22335 27389/25498/22336
+f 19863/25492/22330 28688/25494/22332 28689/25499/22337 19868/25495/22333
+f 19868/25495/22333 28689/25499/22337 31321/25500/22338 27388/25497/22335
+f 19861/25487/22325 19864/25496/22334 19869/25501/22339 19865/25488/22326
+f 19865/25488/22326 19869/25501/22339 28686/25483/22321 28685/25478/22316
+f 19864/25496/22334 27389/25498/22336 27390/25502/22340 19869/25501/22339
+f 19869/25501/22339 27390/25502/22340 31320/25484/22322 28686/25483/22321
+f 19870/25503/22341 19874/25504/22342 19875/25505/22343 19871/25506/22344
+f 19871/25506/22344 19875/25505/22343 27321/25130/21979 27320/25126/21975
+f 19874/25504/22342 28688/25494/22332 28687/25493/22331 19875/25505/22343
+f 19875/25505/22343 28687/25493/22331 31297/25112/21961 27321/25130/21979
+f 19870/25503/22341 19871/25506/22344 19876/25507/22345 19872/25508/22346
+f 19872/25508/22346 19876/25507/22345 28690/25509/22347 28691/25510/22348
+f 19871/25506/22344 27320/25126/21975 27319/25125/21974 19876/25507/22345
+f 19876/25507/22345 27319/25125/21974 31298/25128/21977 28690/25509/22347
+f 19870/25503/22341 19872/25508/22346 19877/25511/22349 19873/25512/22350
+f 19873/25512/22350 19877/25511/22349 27391/25513/22351 27392/25514/22352
+f 19872/25508/22346 28691/25510/22348 28692/25515/22353 19877/25511/22349
+f 19877/25511/22349 28692/25515/22353 31322/25516/15146 27391/25513/22351
+f 19870/25503/22341 19873/25512/22350 19878/25517/22354 19874/25504/22342
+f 19874/25504/22342 19878/25517/22354 28689/25499/22337 28688/25494/22332
+f 19873/25512/22350 27392/25514/22352 27393/25518/22355 19878/25517/22354
+f 19878/25517/22354 27393/25518/22355 31321/25500/22338 28689/25499/22337
+f 19879/25519/22356 19883/25520/22357 19884/25521/22358 19880/25522/22359
+f 19880/25522/22359 19884/25521/22358 27324/25146/21995 27323/25142/21991
+f 19883/25520/22357 28691/25510/22348 28690/25509/22347 19884/25521/22358
+f 19884/25521/22358 28690/25509/22347 31298/25128/21977 27324/25146/21995
+f 19879/25519/22356 19880/25522/22359 19885/25523/22360 19881/25524/22361
+f 19881/25524/22361 19885/25523/22360 28693/25525/22362 28694/25526/22363
+f 19880/25522/22359 27323/25142/21991 27322/25141/21990 19885/25523/22360
+f 19885/25523/22360 27322/25141/21990 31299/25144/21993 28693/25525/22362
+f 19879/25519/22356 19881/25524/22361 19886/25527/22364 19882/25528/22365
+f 19882/25528/22365 19886/25527/22364 27394/25529/22366 27395/25530/22367
+f 19881/25524/22361 28694/25526/22363 28695/25531/22368 19886/25527/22364
+f 19886/25527/22364 28695/25531/22368 31323/25532/22369 27394/25529/22366
+f 19879/25519/22356 19882/25528/22365 19887/25533/22370 19883/25520/22357
+f 19883/25520/22357 19887/25533/22370 28692/25515/22353 28691/25510/22348
+f 19882/25528/22365 27395/25530/22367 27396/25534/22371 19887/25533/22370
+f 19887/25533/22370 27396/25534/22371 31322/25516/15146 28692/25515/22353
+f 19888/25535/22372 19892/25536/22373 19893/25537/22374 19889/25538/22375
+f 19889/25538/22375 19893/25537/22374 27327/25162/22011 27326/25158/22007
+f 19892/25536/22373 28694/25526/22363 28693/25525/22362 19893/25537/22374
+f 19893/25537/22374 28693/25525/22362 31299/25144/21993 27327/25162/22011
+f 19888/25535/22372 19889/25538/22375 19894/25539/22376 19890/25540/22377
+f 19890/25540/22377 19894/25539/22376 28696/25541/22378 28697/25542/22379
+f 19889/25538/22375 27326/25158/22007 27325/25157/22006 19894/25539/22376
+f 19894/25539/22376 27325/25157/22006 31300/25160/22009 28696/25541/22378
+f 19888/25535/22372 19890/25540/22377 19895/25543/22380 19891/25544/22381
+f 19891/25544/22381 19895/25543/22380 27397/25545/22382 27398/25546/22383
+f 19890/25540/22377 28697/25542/22379 28698/25547/22384 19895/25543/22380
+f 19895/25543/22380 28698/25547/22384 31324/25548/22385 27397/25545/22382
+f 19888/25535/22372 19891/25544/22381 19896/25549/22386 19892/25536/22373
+f 19892/25536/22373 19896/25549/22386 28695/25531/22368 28694/25526/22363
+f 19891/25544/22381 27398/25546/22383 27399/25550/22387 19896/25549/22386
+f 19896/25549/22386 27399/25550/22387 31323/25532/22369 28695/25531/22368
+f 19897/25551/22388 19901/25552/22389 19902/25553/22390 19898/25554/22391
+f 19898/25554/22391 19902/25553/22390 27330/25178/22027 27329/25174/22023
+f 19901/25552/22389 28697/25542/22379 28696/25541/22378 19902/25553/22390
+f 19902/25553/22390 28696/25541/22378 31300/25160/22009 27330/25178/22027
+f 19897/25551/22388 19898/25554/22391 19903/25555/22392 19899/25556/22393
+f 19899/25556/22393 19903/25555/22392 28699/25557/22394 28700/25558/22395
+f 19898/25554/22391 27329/25174/22023 27328/25173/22022 19903/25555/22392
+f 19903/25555/22392 27328/25173/22022 31301/25176/22025 28699/25557/22394
+f 19897/25551/22388 19899/25556/22393 19904/25559/22396 19900/25560/22397
+f 19900/25560/22397 19904/25559/22396 27400/25561/22398 27401/25562/22399
+f 19899/25556/22393 28700/25558/22395 28701/25563/22400 19904/25559/22396
+f 19904/25559/22396 28701/25563/22400 31325/25564/22401 27400/25561/22398
+f 19897/25551/22388 19900/25560/22397 19905/25565/22402 19901/25552/22389
+f 19901/25552/22389 19905/25565/22402 28698/25547/22384 28697/25542/22379
+f 19900/25560/22397 27401/25562/22399 27402/25566/22403 19905/25565/22402
+f 19905/25565/22402 27402/25566/22403 31324/25548/22385 28698/25547/22384
+f 19906/25567/22404 19910/25568/22405 19911/25569/22406 19907/25570/22407
+f 19907/25570/22407 19911/25569/22406 27333/25194/22043 27332/25190/22039
+f 19910/25568/22405 28700/25558/22395 28699/25557/22394 19911/25569/22406
+f 19911/25569/22406 28699/25557/22394 31301/25176/22025 27333/25194/22043
+f 19906/25567/22404 19907/25570/22407 19912/25571/22408 19908/25572/22409
+f 19908/25572/22409 19912/25571/22408 28702/25573/22410 28703/25574/22411
+f 19907/25570/22407 27332/25190/22039 27331/25189/22038 19912/25571/22408
+f 19912/25571/22408 27331/25189/22038 31302/25192/22041 28702/25573/22410
+f 19906/25567/22404 19908/25572/22409 19913/25575/22412 19909/25576/22413
+f 19909/25576/22413 19913/25575/22412 27403/25577/22414 27404/25578/22415
+f 19908/25572/22409 28703/25574/22411 28704/25579/22416 19913/25575/22412
+f 19913/25575/22412 28704/25579/22416 31326/25580/22417 27403/25577/22414
+f 19906/25567/22404 19909/25576/22413 19914/25581/22418 19910/25568/22405
+f 19910/25568/22405 19914/25581/22418 28701/25563/22400 28700/25558/22395
+f 19909/25576/22413 27404/25578/22415 27405/25582/22419 19914/25581/22418
+f 19914/25581/22418 27405/25582/22419 31325/25564/22401 28701/25563/22400
+f 19915/25583/22420 19919/25584/22421 19920/25585/22422 19916/25586/22423
+f 19916/25586/22423 19920/25585/22422 27336/25210/22059 27335/25206/22055
+f 19919/25584/22421 28703/25574/22411 28702/25573/22410 19920/25585/22422
+f 19920/25585/22422 28702/25573/22410 31302/25192/22041 27336/25210/22059
+f 19915/25583/22420 19916/25586/22423 19921/25587/22424 19917/25588/22425
+f 19917/25588/22425 19921/25587/22424 28705/25589/22426 28706/25590/22427
+f 19916/25586/22423 27335/25206/22055 27334/25205/22054 19921/25587/22424
+f 19921/25587/22424 27334/25205/22054 31303/25208/22057 28705/25589/22426
+f 19915/25583/22420 19917/25588/22425 19922/25591/22428 19918/25592/22429
+f 19918/25592/22429 19922/25591/22428 27406/25593/22430 27407/25594/22431
+f 19917/25588/22425 28706/25590/22427 28707/25595/22432 19922/25591/22428
+f 19922/25591/22428 28707/25595/22432 31327/25596/22433 27406/25593/22430
+f 19915/25583/22420 19918/25592/22429 19923/25597/22434 19919/25584/22421
+f 19919/25584/22421 19923/25597/22434 28704/25579/22416 28703/25574/22411
+f 19918/25592/22429 27407/25594/22431 27408/25598/22435 19923/25597/22434
+f 19923/25597/22434 27408/25598/22435 31326/25580/22417 28704/25579/22416
+f 19924/25599/22436 19928/25600/22437 19929/25601/22438 19925/25602/22439
+f 19925/25602/22439 19929/25601/22438 27339/25226/22071 27338/25222/22069
+f 19928/25600/22437 28706/25590/22427 28705/25589/22426 19929/25601/22438
+f 19929/25601/22438 28705/25589/22426 31303/25208/22057 27339/25226/22071
+f 19924/25599/22436 19925/25602/22439 19930/25603/22440 19926/25604/22441
+f 19926/25604/22441 19930/25603/22440 28708/25605/15622 28709/25606/15623
+f 19925/25602/22439 27338/25222/22069 27337/25221/22068 19930/25603/22440
+f 19930/25603/22440 27337/25221/22068 31304/25224/15625 28708/25605/15622
+f 19924/25599/22436 19926/25604/22441 19931/25607/22442 19927/25608/22443
+f 19927/25608/22443 19931/25607/22442 27409/25609/22444 27410/25610/22445
+f 19926/25604/22441 28709/25606/15623 28710/25611/15627 19931/25607/22442
+f 19931/25607/22442 28710/25611/15627 31328/25612/1136 27409/25609/22444
+f 19924/25599/22436 19927/25608/22443 19932/25613/22446 19928/25600/22437
+f 19928/25600/22437 19932/25613/22446 28707/25595/22432 28706/25590/22427
+f 19927/25608/22443 27410/25610/22445 27411/25614/22447 19932/25613/22446
+f 19932/25613/22446 27411/25614/22447 31327/25596/22433 28707/25595/22432
+f 19933/25615/22448 19937/25616/22449 19938/25617/22450 19934/25618/22451
+f 19934/25618/22451 19938/25617/22450 27342/25242/22087 27341/25238/22083
+f 19937/25616/22449 28709/25606/15623 28708/25605/15622 19938/25617/22450
+f 19938/25617/22450 28708/25605/15622 31304/25224/15625 27342/25242/22087
+f 19933/25615/22448 19934/25618/22451 19939/25619/22452 19935/25620/22453
+f 19935/25620/22453 19939/25619/22452 28711/25621/22454 28712/25622/22455
+f 19934/25618/22451 27341/25238/22083 27340/25237/22082 19939/25619/22452
+f 19939/25619/22452 27340/25237/22082 31305/25240/22085 28711/25621/22454
+f 19933/25615/22448 19935/25620/22453 19940/25623/22456 19936/25624/22457
+f 19936/25624/22457 19940/25623/22456 27412/25625/22458 27413/25626/22459
+f 19935/25620/22453 28712/25622/22455 28713/25627/22460 19940/25623/22456
+f 19940/25623/22456 28713/25627/22460 31329/25628/22461 27412/25625/22458
+f 19933/25615/22448 19936/25624/22457 19941/25629/22462 19937/25616/22449
+f 19937/25616/22449 19941/25629/22462 28710/25611/15627 28709/25606/15623
+f 19936/25624/22457 27413/25626/22459 27414/25630/22463 19941/25629/22462
+f 19941/25629/22462 27414/25630/22463 31328/25612/1136 28710/25611/15627
+f 19942/25631/22464 19946/25632/22465 19947/25633/22466 19943/25634/22467
+f 19943/25634/22467 19947/25633/22466 27345/25258/22103 27344/25254/22099
+f 19946/25632/22465 28712/25622/22455 28711/25621/22454 19947/25633/22466
+f 19947/25633/22466 28711/25621/22454 31305/25240/22085 27345/25258/22103
+f 19942/25631/22464 19943/25634/22467 19948/25635/22468 19944/25636/22469
+f 19944/25636/22469 19948/25635/22468 28714/25637/22470 28715/25638/22471
+f 19943/25634/22467 27344/25254/22099 27343/25253/22098 19948/25635/22468
+f 19948/25635/22468 27343/25253/22098 31306/25256/22101 28714/25637/22470
+f 19942/25631/22464 19944/25636/22469 19949/25639/22472 19945/25640/22473
+f 19945/25640/22473 19949/25639/22472 27415/25641/22474 27416/25642/22475
+f 19944/25636/22469 28715/25638/22471 28716/25643/22476 19949/25639/22472
+f 19949/25639/22472 28716/25643/22476 31330/25644/22477 27415/25641/22474
+f 19942/25631/22464 19945/25640/22473 19950/25645/22478 19946/25632/22465
+f 19946/25632/22465 19950/25645/22478 28713/25627/22460 28712/25622/22455
+f 19945/25640/22473 27416/25642/22475 27417/25646/22479 19950/25645/22478
+f 19950/25645/22478 27417/25646/22479 31329/25628/22461 28713/25627/22460
+f 19951/25647/22480 19955/25648/22481 19956/25649/22482 19952/25650/22483
+f 19952/25650/22483 19956/25649/22482 27348/25274/22119 27347/25270/22115
+f 19955/25648/22481 28715/25638/22471 28714/25637/22470 19956/25649/22482
+f 19956/25649/22482 28714/25637/22470 31306/25256/22101 27348/25274/22119
+f 19951/25647/22480 19952/25650/22483 19957/25651/22484 19953/25652/22485
+f 19953/25652/22485 19957/25651/22484 28717/25653/22486 28718/25654/22487
+f 19952/25650/22483 27347/25270/22115 27346/25269/22114 19957/25651/22484
+f 19957/25651/22484 27346/25269/22114 31307/25272/22117 28717/25653/22486
+f 19951/25647/22480 19953/25652/22485 19958/25655/22488 19954/25656/22489
+f 19954/25656/22489 19958/25655/22488 27418/25657/22490 27419/25658/22491
+f 19953/25652/22485 28718/25654/22487 28719/25659/22492 19958/25655/22488
+f 19958/25655/22488 28719/25659/22492 31331/25660/22493 27418/25657/22490
+f 19951/25647/22480 19954/25656/22489 19959/25661/22494 19955/25648/22481
+f 19955/25648/22481 19959/25661/22494 28716/25643/22476 28715/25638/22471
+f 19954/25656/22489 27419/25658/22491 27420/25662/22495 19959/25661/22494
+f 19959/25661/22494 27420/25662/22495 31330/25644/22477 28716/25643/22476
+f 19960/25663/22496 19964/25664/22497 19965/25665/22498 19961/25666/22499
+f 19961/25666/22499 19965/25665/22498 27351/25290/22135 27350/25286/22131
+f 19964/25664/22497 28718/25654/22487 28717/25653/22486 19965/25665/22498
+f 19965/25665/22498 28717/25653/22486 31307/25272/22117 27351/25290/22135
+f 19960/25663/22496 19961/25666/22499 19966/25667/22500 19962/25668/22501
+f 19962/25668/22501 19966/25667/22500 28720/25669/22502 28721/25670/22503
+f 19961/25666/22499 27350/25286/22131 27349/25285/22130 19966/25667/22500
+f 19966/25667/22500 27349/25285/22130 31308/25288/22133 28720/25669/22502
+f 19960/25663/22496 19962/25668/22501 19967/25671/22504 19963/25672/22505
+f 19963/25672/22505 19967/25671/22504 27421/25673/22506 27422/25674/22507
+f 19962/25668/22501 28721/25670/22503 28722/25675/22508 19967/25671/22504
+f 19967/25671/22504 28722/25675/22508 31332/25676/22509 27421/25673/22506
+f 19960/25663/22496 19963/25672/22505 19968/25677/22510 19964/25664/22497
+f 19964/25664/22497 19968/25677/22510 28719/25659/22492 28718/25654/22487
+f 19963/25672/22505 27422/25674/22507 27423/25678/22511 19968/25677/22510
+f 19968/25677/22510 27423/25678/22511 31331/25660/22493 28719/25659/22492
+f 19969/25679/22512 19973/25680/22513 19974/25681/22514 19970/25682/22515
+f 19970/25682/22515 19974/25681/22514 27354/25306/22151 27353/25302/22147
+f 19973/25680/22513 28721/25670/22503 28720/25669/22502 19974/25681/22514
+f 19974/25681/22514 28720/25669/22502 31308/25288/22133 27354/25306/22151
+f 19969/25679/22512 19970/25682/22515 19975/25683/22516 19971/25684/22517
+f 19971/25684/22517 19975/25683/22516 28723/25685/22518 28724/25686/22519
+f 19970/25682/22515 27353/25302/22147 27352/25301/22146 19975/25683/22516
+f 19975/25683/22516 27352/25301/22146 31309/25304/22149 28723/25685/22518
+f 19969/25679/22512 19971/25684/22517 19976/25687/22520 19972/25688/22521
+f 19972/25688/22521 19976/25687/22520 27424/25689/22522 27425/25690/22523
+f 19971/25684/22517 28724/25686/22519 28725/25691/22524 19976/25687/22520
+f 19976/25687/22520 28725/25691/22524 31333/25692/22525 27424/25689/22522
+f 19969/25679/22512 19972/25688/22521 19977/25693/22526 19973/25680/22513
+f 19973/25680/22513 19977/25693/22526 28722/25675/22508 28721/25670/22503
+f 19972/25688/22521 27425/25690/22523 27426/25694/22527 19977/25693/22526
+f 19977/25693/22526 27426/25694/22527 31332/25676/22509 28722/25675/22508
+f 19978/25695/22528 19982/25696/22529 19983/25697/22530 19979/25698/22531
+f 19979/25698/22531 19983/25697/22530 27357/25322/22167 27356/25318/22163
+f 19982/25696/22529 28724/25686/22519 28723/25685/22518 19983/25697/22530
+f 19983/25697/22530 28723/25685/22518 31309/25304/22149 27357/25322/22167
+f 19978/25695/22528 19979/25698/22531 19984/25699/22532 19980/25700/22533
+f 19980/25700/22533 19984/25699/22532 28726/25701/22534 28727/25702/22535
+f 19979/25698/22531 27356/25318/22163 27355/25317/22162 19984/25699/22532
+f 19984/25699/22532 27355/25317/22162 31310/25320/22165 28726/25701/22534
+f 19978/25695/22528 19980/25700/22533 19985/25703/22536 19981/25704/22537
+f 19981/25704/22537 19985/25703/22536 27427/25705/22538 27428/25706/22539
+f 19980/25700/22533 28727/25702/22535 28728/25707/22540 19985/25703/22536
+f 19985/25703/22536 28728/25707/22540 31334/25708/14955 27427/25705/22538
+f 19978/25695/22528 19981/25704/22537 19986/25709/22541 19982/25696/22529
+f 19982/25696/22529 19986/25709/22541 28725/25691/22524 28724/25686/22519
+f 19981/25704/22537 27428/25706/22539 27429/25710/22542 19986/25709/22541
+f 19986/25709/22541 27429/25710/22542 31333/25692/22525 28725/25691/22524
+f 19987/25711/22543 19991/25712/22544 19992/25713/22545 19988/25714/22546
+f 19988/25714/22546 19992/25713/22545 27360/25341/22183 27359/25336/22179
+f 19991/25712/22544 28727/25715/22535 28726/25716/22534 19992/25713/22545
+f 19992/25713/22545 28726/25716/22534 31310/25342/22165 27360/25341/22183
+f 19987/25711/22543 19988/25714/22546 19993/25717/22547 19989/25718/22548
+f 19989/25718/22548 19993/25717/22547 28729/25719/22549 28730/25720/22550
+f 19988/25714/22546 27359/25336/22179 27358/25335/22178 19993/25717/22547
+f 19993/25717/22547 27358/25335/22178 31311/25338/22181 28729/25719/22549
+f 19987/25711/22543 19989/25718/22548 19994/25721/22551 19990/25722/22552
+f 19990/25722/22552 19994/25721/22551 27430/25723/22553 27431/25724/22554
+f 19989/25718/22548 28730/25720/22550 28731/25725/22555 19994/25721/22551
+f 19994/25721/22551 28731/25725/22555 31335/25726/22556 27430/25723/22553
+f 19987/25711/22543 19990/25722/22552 19995/25727/22557 19991/25712/22544
+f 19991/25712/22544 19995/25727/22557 28728/25728/22540 28727/25715/22535
+f 19990/25722/22552 27431/25724/22554 27432/25729/22558 19995/25727/22557
+f 19995/25727/22557 27432/25729/22558 31334/25730/14955 28728/25728/22540
+f 19996/25731/22559 20000/25732/22560 20001/25733/22561 19997/25734/22562
+f 19997/25734/22562 20001/25733/22561 27363/25358/22199 27362/25354/22195
+f 20000/25732/22560 28730/25720/22550 28729/25719/22549 20001/25733/22561
+f 20001/25733/22561 28729/25719/22549 31311/25338/22181 27363/25358/22199
+f 19996/25731/22559 19997/25734/22562 20002/25735/22563 19998/25736/22564
+f 19998/25736/22564 20002/25735/22563 28732/25737/22565 28733/25738/22566
+f 19997/25734/22562 27362/25354/22195 27361/25353/22194 20002/25735/22563
+f 20002/25735/22563 27361/25353/22194 31312/25356/22197 28732/25737/22565
+f 19996/25731/22559 19998/25736/22564 20003/25739/22567 19999/25740/22568
+f 19999/25740/22568 20003/25739/22567 27433/25741/22569 27434/25742/22570
+f 19998/25736/22564 28733/25738/22566 28734/25743/22571 20003/25739/22567
+f 20003/25739/22567 28734/25743/22571 31336/25744/22572 27433/25741/22569
+f 19996/25731/22559 19999/25740/22568 20004/25745/22573 20000/25732/22560
+f 20000/25732/22560 20004/25745/22573 28731/25725/22555 28730/25720/22550
+f 19999/25740/22568 27434/25742/22570 27435/25746/22574 20004/25745/22573
+f 20004/25745/22573 27435/25746/22574 31335/25726/22556 28731/25725/22555
+f 20005/25747/22575 20009/25748/22576 20010/25749/22577 20006/25750/22578
+f 20006/25750/22578 20010/25749/22577 27366/25374/22215 27365/25370/22211
+f 20009/25748/22576 28733/25738/22566 28732/25737/22565 20010/25749/22577
+f 20010/25749/22577 28732/25737/22565 31312/25356/22197 27366/25374/22215
+f 20005/25747/22575 20006/25750/22578 20011/25751/22579 20007/25752/22580
+f 20007/25752/22580 20011/25751/22579 28735/25753/22581 28736/25754/22582
+f 20006/25750/22578 27365/25370/22211 27364/25369/22210 20011/25751/22579
+f 20011/25751/22579 27364/25369/22210 31313/25372/22213 28735/25753/22581
+f 20005/25747/22575 20007/25752/22580 20012/25755/22583 20008/25756/22584
+f 20008/25756/22584 20012/25755/22583 27436/25757/22585 27437/25758/22586
+f 20007/25752/22580 28736/25754/22582 28737/25759/22587 20012/25755/22583
+f 20012/25755/22583 28737/25759/22587 31337/25760/22588 27436/25757/22585
+f 20005/25747/22575 20008/25756/22584 20013/25761/22589 20009/25748/22576
+f 20009/25748/22576 20013/25761/22589 28734/25743/22571 28733/25738/22566
+f 20008/25756/22584 27437/25758/22586 27438/25762/22590 20013/25761/22589
+f 20013/25761/22589 27438/25762/22590 31336/25744/22572 28734/25743/22571
+f 20014/25763/22591 20018/25764/22592 20019/25765/22593 20015/25766/22594
+f 20015/25766/22594 20019/25765/22593 27369/25390/22231 27368/25386/22227
+f 20018/25764/22592 28736/25754/22582 28735/25753/22581 20019/25765/22593
+f 20019/25765/22593 28735/25753/22581 31313/25372/22213 27369/25390/22231
+f 20014/25763/22591 20015/25766/22594 20020/25767/22595 20016/25768/22596
+f 20016/25768/22596 20020/25767/22595 28738/25769/22597 28739/25770/22598
+f 20015/25766/22594 27368/25386/22227 27367/25385/22226 20020/25767/22595
+f 20020/25767/22595 27367/25385/22226 31314/25388/22229 28738/25769/22597
+f 20014/25763/22591 20016/25768/22596 20021/25771/22599 20017/25772/22600
+f 20017/25772/22600 20021/25771/22599 27439/25773/22601 27440/25774/22602
+f 20016/25768/22596 28739/25770/22598 28740/25775/22603 20021/25771/22599
+f 20021/25771/22599 28740/25775/22603 31338/25776/22604 27439/25773/22601
+f 20014/25763/22591 20017/25772/22600 20022/25777/22605 20018/25764/22592
+f 20018/25764/22592 20022/25777/22605 28737/25759/22587 28736/25754/22582
+f 20017/25772/22600 27440/25774/22602 27441/25778/22606 20022/25777/22605
+f 20022/25777/22605 27441/25778/22606 31337/25760/22588 28737/25759/22587
+f 20023/25779/22607 20027/25780/22608 20028/25781/22609 20024/25782/22610
+f 20024/25782/22610 20028/25781/22609 27372/25406/22247 27371/25402/22243
+f 20027/25780/22608 28739/25770/22598 28738/25769/22597 20028/25781/22609
+f 20028/25781/22609 28738/25769/22597 31314/25388/22229 27372/25406/22247
+f 20023/25779/22607 20024/25782/22610 20029/25783/22611 20025/25784/22612
+f 20025/25784/22612 20029/25783/22611 28741/25785/22613 28742/25786/22614
+f 20024/25782/22610 27371/25402/22243 27370/25401/22242 20029/25783/22611
+f 20029/25783/22611 27370/25401/22242 31315/25404/22245 28741/25785/22613
+f 20023/25779/22607 20025/25784/22612 20030/25787/22615 20026/25788/22616
+f 20026/25788/22616 20030/25787/22615 27442/25789/22617 27443/25790/22618
+f 20025/25784/22612 28742/25786/22614 28743/25791/22619 20030/25787/22615
+f 20030/25787/22615 28743/25791/22619 31339/25792/22620 27442/25789/22617
+f 20023/25779/22607 20026/25788/22616 20031/25793/22621 20027/25780/22608
+f 20027/25780/22608 20031/25793/22621 28740/25775/22603 28739/25770/22598
+f 20026/25788/22616 27443/25790/22618 27444/25794/22622 20031/25793/22621
+f 20031/25793/22621 27444/25794/22622 31338/25776/22604 28740/25775/22603
+f 20032/25795/22623 20036/25796/22624 20037/25797/22625 20033/25798/22626
+f 20033/25798/22626 20037/25797/22625 27375/25422/22260 27374/25418/22258
+f 20036/25796/22624 28742/25786/22614 28741/25785/22613 20037/25797/22625
+f 20037/25797/22625 28741/25785/22613 31315/25404/22245 27375/25422/22260
+f 20032/25795/22623 20033/25798/22626 20038/25799/22627 20034/25800/22628
+f 20034/25800/22628 20038/25799/22627 28744/25801/15430 28745/25802/15431
+f 20033/25798/22626 27374/25418/22258 27373/25417/22257 20038/25799/22627
+f 20038/25799/22627 27373/25417/22257 31316/25420/15433 28744/25801/15430
+f 20032/25795/22623 20034/25800/22628 20039/25803/22629 20035/25804/22630
+f 20035/25804/22630 20039/25803/22629 27445/25805/22631 27446/25806/22632
+f 20034/25800/22628 28745/25802/15431 28746/25807/15435 20039/25803/22629
+f 20039/25803/22629 28746/25807/15435 31340/25808/170 27445/25805/22631
+f 20032/25795/22623 20035/25804/22630 20040/25809/22633 20036/25796/22624
+f 20036/25796/22624 20040/25809/22633 28743/25791/22619 28742/25786/22614
+f 20035/25804/22630 27446/25806/22632 27447/25810/22634 20040/25809/22633
+f 20040/25809/22633 27447/25810/22634 31339/25792/22620 28743/25791/22619
+f 20041/25811/22635 20045/25812/22636 20046/25813/22637 20042/25814/22638
+f 20042/25814/22638 20046/25813/22637 27378/25434/22272 27377/25432/22270
+f 20045/25812/22636 28745/25802/15431 28744/25801/15430 20046/25813/22637
+f 20046/25813/22637 28744/25801/15430 31316/25420/15433 27378/25434/22272
+f 20041/25811/22635 20042/25814/22638 20047/25815/22639 20043/25816/22640
+f 20043/25816/22640 20047/25815/22639 28677/25440/22278 28676/25439/22277
+f 20042/25814/22638 27377/25432/22270 27376/25431/22269 20047/25815/22639
+f 20047/25815/22639 27376/25431/22269 31293/25066/21915 28677/25440/22278
+f 20041/25811/22635 20043/25816/22640 20048/25817/22641 20044/25818/22642
+f 20044/25818/22642 20048/25817/22641 27448/25819/22643 27449/25820/22644
+f 20043/25816/22640 28676/25439/22277 28675/25452/22290 20048/25817/22641
+f 20048/25817/22641 28675/25452/22290 31317/25454/22292 27448/25819/22643
+f 20041/25811/22635 20044/25818/22642 20049/25821/22645 20045/25812/22636
+f 20045/25812/22636 20049/25821/22645 28746/25807/15435 28745/25802/15431
+f 20044/25818/22642 27449/25820/22644 27450/25822/22646 20049/25821/22645
+f 20049/25821/22645 27450/25822/22646 31340/25808/170 28746/25807/15435
+f 20050/25823/22647 20054/25824/22648 20055/25825/22649 20051/25826/22650
+f 20051/25826/22650 20055/25825/22649 27381/25453/22291 27380/25448/22286
+f 20054/25824/22648 28748/25827/22651 28749/25828/22652 20055/25825/22649
+f 20055/25825/22649 28749/25828/22652 31317/25454/22292 27381/25453/22291
+f 20050/25823/22647 20051/25826/22650 20056/25829/22653 20052/25830/22654
+f 20052/25830/22654 20056/25829/22653 28750/25831/22655 28751/25832/22656
+f 20051/25826/22650 27380/25448/22286 27379/25447/22285 20056/25829/22653
+f 20056/25829/22653 27379/25447/22285 31318/25450/22288 28750/25831/22655
+f 20050/25823/22647 20052/25830/22654 20057/25833/22657 20053/25834/22658
+f 20053/25834/22658 20057/25833/22657 27451/25835/22659 27452/25836/22660
+f 20052/25830/22654 28751/25832/22656 28752/25837/22661 20057/25833/22657
+f 20057/25833/22657 28752/25837/22661 31342/25838/22662 27451/25835/22659
+f 20050/25823/22647 20053/25834/22658 20058/25839/22663 20054/25824/22648
+f 20054/25824/22648 20058/25839/22663 28747/25840/22664 28748/25827/22651
+f 20053/25834/22658 27452/25836/22660 27453/25841/22665 20058/25839/22663
+f 20058/25839/22663 27453/25841/22665 31341/25842/22666 28747/25840/22664
+f 20059/25843/22667 20063/25844/22668 20064/25845/22669 20060/25846/22670
+f 20060/25846/22670 20064/25845/22669 27384/25470/22308 27383/25466/22304
+f 20063/25844/22668 28751/25832/22656 28750/25831/22655 20064/25845/22669
+f 20064/25845/22669 28750/25831/22655 31318/25450/22288 27384/25470/22308
+f 20059/25843/22667 20060/25846/22670 20065/25847/22671 20061/25848/22672
+f 20061/25848/22672 20065/25847/22671 28753/25849/22673 28754/25850/22674
+f 20060/25846/22670 27383/25466/22304 27382/25465/22303 20065/25847/22671
+f 20065/25847/22671 27382/25465/22303 31319/25468/22306 28753/25849/22673
+f 20059/25843/22667 20061/25848/22672 20066/25851/22675 20062/25852/22676
+f 20062/25852/22676 20066/25851/22675 27454/25853/22677 27455/25854/22678
+f 20061/25848/22672 28754/25850/22674 28755/25855/22679 20066/25851/22675
+f 20066/25851/22675 28755/25855/22679 31343/25856/22680 27454/25853/22677
+f 20059/25843/22667 20062/25852/22676 20067/25857/22681 20063/25844/22668
+f 20063/25844/22668 20067/25857/22681 28752/25837/22661 28751/25832/22656
+f 20062/25852/22676 27455/25854/22678 27456/25858/22682 20067/25857/22681
+f 20067/25857/22681 27456/25858/22682 31342/25838/22662 28752/25837/22661
+f 20068/25859/22683 20072/25860/22684 20073/25861/22685 20069/25862/22686
+f 20069/25862/22686 20073/25861/22685 27387/25486/22324 27386/25482/22320
+f 20072/25860/22684 28754/25850/22674 28753/25849/22673 20073/25861/22685
+f 20073/25861/22685 28753/25849/22673 31319/25468/22306 27387/25486/22324
+f 20068/25859/22683 20069/25862/22686 20074/25863/22687 20070/25864/22688
+f 20070/25864/22688 20074/25863/22687 28756/25865/22689 28757/25866/22690
+f 20069/25862/22686 27386/25482/22320 27385/25481/22319 20074/25863/22687
+f 20074/25863/22687 27385/25481/22319 31320/25484/22322 28756/25865/22689
+f 20068/25859/22683 20070/25864/22688 20075/25867/22691 20071/25868/22692
+f 20071/25868/22692 20075/25867/22691 27457/25869/22693 27458/25870/22694
+f 20070/25864/22688 28757/25866/22690 28758/25871/22695 20075/25867/22691
+f 20075/25867/22691 28758/25871/22695 31344/25872/22696 27457/25869/22693
+f 20068/25859/22683 20071/25868/22692 20076/25873/22697 20072/25860/22684
+f 20072/25860/22684 20076/25873/22697 28755/25855/22679 28754/25850/22674
+f 20071/25868/22692 27458/25870/22694 27459/25874/22698 20076/25873/22697
+f 20076/25873/22697 27459/25874/22698 31343/25856/22680 28755/25855/22679
+f 20077/25875/22699 20081/25876/22700 20082/25877/22701 20078/25878/22702
+f 20078/25878/22702 20082/25877/22701 27390/25502/22340 27389/25498/22336
+f 20081/25876/22700 28757/25866/22690 28756/25865/22689 20082/25877/22701
+f 20082/25877/22701 28756/25865/22689 31320/25484/22322 27390/25502/22340
+f 20077/25875/22699 20078/25878/22702 20083/25879/22703 20079/25880/22704
+f 20079/25880/22704 20083/25879/22703 28759/25881/22705 28760/25882/22706
+f 20078/25878/22702 27389/25498/22336 27388/25497/22335 20083/25879/22703
+f 20083/25879/22703 27388/25497/22335 31321/25500/22338 28759/25881/22705
+f 20077/25875/22699 20079/25880/22704 20084/25883/22707 20080/25884/22708
+f 20080/25884/22708 20084/25883/22707 27460/25885/22709 27461/25886/22710
+f 20079/25880/22704 28760/25882/22706 28761/25887/22711 20084/25883/22707
+f 20084/25883/22707 28761/25887/22711 31345/25888/22712 27460/25885/22709
+f 20077/25875/22699 20080/25884/22708 20085/25889/22713 20081/25876/22700
+f 20081/25876/22700 20085/25889/22713 28758/25871/22695 28757/25866/22690
+f 20080/25884/22708 27461/25886/22710 27462/25890/22714 20085/25889/22713
+f 20085/25889/22713 27462/25890/22714 31344/25872/22696 28758/25871/22695
+f 20086/25891/22715 20090/25892/22716 20091/25893/22717 20087/25894/22718
+f 20087/25894/22718 20091/25893/22717 27393/25518/22355 27392/25514/22352
+f 20090/25892/22716 28760/25882/22706 28759/25881/22705 20091/25893/22717
+f 20091/25893/22717 28759/25881/22705 31321/25500/22338 27393/25518/22355
+f 20086/25891/22715 20087/25894/22718 20092/25895/22719 20088/25896/22720
+f 20088/25896/22720 20092/25895/22719 28762/25897/22721 28763/25898/22722
+f 20087/25894/22718 27392/25514/22352 27391/25513/22351 20092/25895/22719
+f 20092/25895/22719 27391/25513/22351 31322/25516/15146 28762/25897/22721
+f 20086/25891/22715 20088/25896/22720 20093/25899/22723 20089/25900/22724
+f 20089/25900/22724 20093/25899/22723 27463/25901/22725 27464/25902/22726
+f 20088/25896/22720 28763/25898/22722 28764/25903/22727 20093/25899/22723
+f 20093/25899/22723 28764/25903/22727 31346/25904/22728 27463/25901/22725
+f 20086/25891/22715 20089/25900/22724 20094/25905/22729 20090/25892/22716
+f 20090/25892/22716 20094/25905/22729 28761/25887/22711 28760/25882/22706
+f 20089/25900/22724 27464/25902/22726 27465/25906/22730 20094/25905/22729
+f 20094/25905/22729 27465/25906/22730 31345/25888/22712 28761/25887/22711
+f 20095/25907/22731 20099/25908/22732 20100/25909/22733 20096/25910/22734
+f 20096/25910/22734 20100/25909/22733 27396/25534/22371 27395/25530/22367
+f 20099/25908/22732 28763/25898/22722 28762/25897/22721 20100/25909/22733
+f 20100/25909/22733 28762/25897/22721 31322/25516/15146 27396/25534/22371
+f 20095/25907/22731 20096/25910/22734 20101/25911/22735 20097/25912/22736
+f 20097/25912/22736 20101/25911/22735 28765/25913/22737 28766/25914/22738
+f 20096/25910/22734 27395/25530/22367 27394/25529/22366 20101/25911/22735
+f 20101/25911/22735 27394/25529/22366 31323/25532/22369 28765/25913/22737
+f 20095/25907/22731 20097/25912/22736 20102/25915/22739 20098/25916/22740
+f 20098/25916/22740 20102/25915/22739 27466/25917/22741 27467/25918/22742
+f 20097/25912/22736 28766/25914/22738 28767/25919/22743 20102/25915/22739
+f 20102/25915/22739 28767/25919/22743 31347/25920/22744 27466/25917/22741
+f 20095/25907/22731 20098/25916/22740 20103/25921/22745 20099/25908/22732
+f 20099/25908/22732 20103/25921/22745 28764/25903/22727 28763/25898/22722
+f 20098/25916/22740 27467/25918/22742 27468/25922/22746 20103/25921/22745
+f 20103/25921/22745 27468/25922/22746 31346/25904/22728 28764/25903/22727
+f 20104/25923/22747 20108/25924/22748 20109/25925/22749 20105/25926/22750
+f 20105/25926/22750 20109/25925/22749 27399/25550/22387 27398/25546/22383
+f 20108/25924/22748 28766/25914/22738 28765/25913/22737 20109/25925/22749
+f 20109/25925/22749 28765/25913/22737 31323/25532/22369 27399/25550/22387
+f 20104/25923/22747 20105/25926/22750 20110/25927/22751 20106/25928/22752
+f 20106/25928/22752 20110/25927/22751 28768/25929/22753 28769/25930/22754
+f 20105/25926/22750 27398/25546/22383 27397/25545/22382 20110/25927/22751
+f 20110/25927/22751 27397/25545/22382 31324/25548/22385 28768/25929/22753
+f 20104/25923/22747 20106/25928/22752 20111/25931/22755 20107/25932/22756
+f 20107/25932/22756 20111/25931/22755 27469/25933/22757 27470/25934/22758
+f 20106/25928/22752 28769/25930/22754 28770/25935/22759 20111/25931/22755
+f 20111/25931/22755 28770/25935/22759 31348/25936/22760 27469/25933/22757
+f 20104/25923/22747 20107/25932/22756 20112/25937/22761 20108/25924/22748
+f 20108/25924/22748 20112/25937/22761 28767/25919/22743 28766/25914/22738
+f 20107/25932/22756 27470/25934/22758 27471/25938/22762 20112/25937/22761
+f 20112/25937/22761 27471/25938/22762 31347/25920/22744 28767/25919/22743
+f 20113/25939/22763 20117/25940/22764 20118/25941/22765 20114/25942/22766
+f 20114/25942/22766 20118/25941/22765 27402/25566/22403 27401/25562/22399
+f 20117/25940/22764 28769/25930/22754 28768/25929/22753 20118/25941/22765
+f 20118/25941/22765 28768/25929/22753 31324/25548/22385 27402/25566/22403
+f 20113/25939/22763 20114/25942/22766 20119/25943/22767 20115/25944/22768
+f 20115/25944/22768 20119/25943/22767 28771/25945/22769 28772/25946/22770
+f 20114/25942/22766 27401/25562/22399 27400/25561/22398 20119/25943/22767
+f 20119/25943/22767 27400/25561/22398 31325/25564/22401 28771/25945/22769
+f 20113/25939/22763 20115/25944/22768 20120/25947/22771 20116/25948/22772
+f 20116/25948/22772 20120/25947/22771 27472/25949/22773 27473/25950/22774
+f 20115/25944/22768 28772/25946/22770 28773/25951/22775 20120/25947/22771
+f 20120/25947/22771 28773/25951/22775 31349/25952/22776 27472/25949/22773
+f 20113/25939/22763 20116/25948/22772 20121/25953/22777 20117/25940/22764
+f 20117/25940/22764 20121/25953/22777 28770/25935/22759 28769/25930/22754
+f 20116/25948/22772 27473/25950/22774 27474/25954/22778 20121/25953/22777
+f 20121/25953/22777 27474/25954/22778 31348/25936/22760 28770/25935/22759
+f 20122/25955/22779 20126/25956/22780 20127/25957/22781 20123/25958/22782
+f 20123/25958/22782 20127/25957/22781 27405/25582/22419 27404/25578/22415
+f 20126/25956/22780 28772/25946/22770 28771/25945/22769 20127/25957/22781
+f 20127/25957/22781 28771/25945/22769 31325/25564/22401 27405/25582/22419
+f 20122/25955/22779 20123/25958/22782 20128/25959/22783 20124/25960/22784
+f 20124/25960/22784 20128/25959/22783 28774/25961/22785 28775/25962/22786
+f 20123/25958/22782 27404/25578/22415 27403/25577/22414 20128/25959/22783
+f 20128/25959/22783 27403/25577/22414 31326/25580/22417 28774/25961/22785
+f 20122/25955/22779 20124/25960/22784 20129/25963/22787 20125/25964/22788
+f 20125/25964/22788 20129/25963/22787 27475/25965/22789 27476/25966/22790
+f 20124/25960/22784 28775/25962/22786 28776/25967/22791 20129/25963/22787
+f 20129/25963/22787 28776/25967/22791 31350/25968/22792 27475/25965/22789
+f 20122/25955/22779 20125/25964/22788 20130/25969/22793 20126/25956/22780
+f 20126/25956/22780 20130/25969/22793 28773/25951/22775 28772/25946/22770
+f 20125/25964/22788 27476/25966/22790 27477/25970/22794 20130/25969/22793
+f 20130/25969/22793 27477/25970/22794 31349/25952/22776 28773/25951/22775
+f 20131/25971/22795 20135/25972/22796 20136/25973/22797 20132/25974/22798
+f 20132/25974/22798 20136/25973/22797 27408/25598/22435 27407/25594/22431
+f 20135/25972/22796 28775/25962/22786 28774/25961/22785 20136/25973/22797
+f 20136/25973/22797 28774/25961/22785 31326/25580/22417 27408/25598/22435
+f 20131/25971/22795 20132/25974/22798 20137/25975/22799 20133/25976/22800
+f 20133/25976/22800 20137/25975/22799 28777/25977/22801 28778/25978/22802
+f 20132/25974/22798 27407/25594/22431 27406/25593/22430 20137/25975/22799
+f 20137/25975/22799 27406/25593/22430 31327/25596/22433 28777/25977/22801
+f 20131/25971/22795 20133/25976/22800 20138/25979/22803 20134/25980/22804
+f 20134/25980/22804 20138/25979/22803 27478/25981/22805 27479/25982/22806
+f 20133/25976/22800 28778/25978/22802 28779/25983/22807 20138/25979/22803
+f 20138/25979/22803 28779/25983/22807 31351/25984/22808 27478/25981/22805
+f 20131/25971/22795 20134/25980/22804 20139/25985/22809 20135/25972/22796
+f 20135/25972/22796 20139/25985/22809 28776/25967/22791 28775/25962/22786
+f 20134/25980/22804 27479/25982/22806 27480/25986/22810 20139/25985/22809
+f 20139/25985/22809 27480/25986/22810 31350/25968/22792 28776/25967/22791
+f 20140/25987/22811 20144/25988/22812 20145/25989/22813 20141/25990/22814
+f 20141/25990/22814 20145/25989/22813 27411/25614/22447 27410/25610/22445
+f 20144/25988/22812 28778/25978/22802 28777/25977/22801 20145/25989/22813
+f 20145/25989/22813 28777/25977/22801 31327/25596/22433 27411/25614/22447
+f 20140/25987/22811 20141/25990/22814 20146/25991/22815 20142/25992/22816
+f 20142/25992/22816 20146/25991/22815 28780/25993/15239 28781/25994/15240
+f 20141/25990/22814 27410/25610/22445 27409/25609/22444 20146/25991/22815
+f 20146/25991/22815 27409/25609/22444 31328/25612/1136 28780/25993/15239
+f 20140/25987/22811 20142/25992/22816 20147/25995/22817 20143/25996/22818
+f 20143/25996/22818 20147/25995/22817 27481/25997/22819 27482/25998/22820
+f 20142/25992/22816 28781/25994/15240 28782/25999/15243 20147/25995/22817
+f 20147/25995/22817 28782/25999/15243 31352/26000/14859 27481/25997/22819
+f 20140/25987/22811 20143/25996/22818 20148/26001/22821 20144/25988/22812
+f 20144/25988/22812 20148/26001/22821 28779/25983/22807 28778/25978/22802
+f 20143/25996/22818 27482/25998/22820 27483/26002/22822 20148/26001/22821
+f 20148/26001/22821 27483/26002/22822 31351/25984/22808 28779/25983/22807
+f 20149/26003/22823 20153/26004/22824 20154/26005/22825 20150/26006/22826
+f 20150/26006/22826 20154/26005/22825 27414/25630/22463 27413/25626/22459
+f 20153/26004/22824 28781/25994/15240 28780/25993/15239 20154/26005/22825
+f 20154/26005/22825 28780/25993/15239 31328/25612/1136 27414/25630/22463
+f 20149/26003/22823 20150/26006/22826 20155/26007/22827 20151/26008/22828
+f 20151/26008/22828 20155/26007/22827 28783/26009/22829 28784/26010/22830
+f 20150/26006/22826 27413/25626/22459 27412/25625/22458 20155/26007/22827
+f 20155/26007/22827 27412/25625/22458 31329/25628/22461 28783/26009/22829
+f 20149/26003/22823 20151/26008/22828 20156/26011/22831 20152/26012/22832
+f 20152/26012/22832 20156/26011/22831 27484/26013/22833 27485/26014/22834
+f 20151/26008/22828 28784/26010/22830 28785/26015/22835 20156/26011/22831
+f 20156/26011/22831 28785/26015/22835 31353/26016/22836 27484/26013/22833
+f 20149/26003/22823 20152/26012/22832 20157/26017/22837 20153/26004/22824
+f 20153/26004/22824 20157/26017/22837 28782/25999/15243 28781/25994/15240
+f 20152/26012/22832 27485/26014/22834 27486/26018/22838 20157/26017/22837
+f 20157/26017/22837 27486/26018/22838 31352/26000/14859 28782/25999/15243
+f 20158/26019/22839 20162/26020/22840 20163/26021/22841 20159/26022/22842
+f 20159/26022/22842 20163/26021/22841 27417/25646/22479 27416/25642/22475
+f 20162/26020/22840 28784/26010/22830 28783/26009/22829 20163/26021/22841
+f 20163/26021/22841 28783/26009/22829 31329/25628/22461 27417/25646/22479
+f 20158/26019/22839 20159/26022/22842 20164/26023/22843 20160/26024/22844
+f 20160/26024/22844 20164/26023/22843 28786/26025/22845 28787/26026/22846
+f 20159/26022/22842 27416/25642/22475 27415/25641/22474 20164/26023/22843
+f 20164/26023/22843 27415/25641/22474 31330/25644/22477 28786/26025/22845
+f 20158/26019/22839 20160/26024/22844 20165/26027/22847 20161/26028/22848
+f 20161/26028/22848 20165/26027/22847 27487/26029/22849 27488/26030/22850
+f 20160/26024/22844 28787/26026/22846 28788/26031/22851 20165/26027/22847
+f 20165/26027/22847 28788/26031/22851 31354/26032/22852 27487/26029/22849
+f 20158/26019/22839 20161/26028/22848 20166/26033/22853 20162/26020/22840
+f 20162/26020/22840 20166/26033/22853 28785/26015/22835 28784/26010/22830
+f 20161/26028/22848 27488/26030/22850 27489/26034/22854 20166/26033/22853
+f 20166/26033/22853 27489/26034/22854 31353/26016/22836 28785/26015/22835
+f 20167/26035/22855 20171/26036/22856 20172/26037/22857 20168/26038/22858
+f 20168/26038/22858 20172/26037/22857 27420/25662/22495 27419/25658/22491
+f 20171/26036/22856 28787/26026/22846 28786/26025/22845 20172/26037/22857
+f 20172/26037/22857 28786/26025/22845 31330/25644/22477 27420/25662/22495
+f 20167/26035/22855 20168/26038/22858 20173/26039/22859 20169/26040/22860
+f 20169/26040/22860 20173/26039/22859 28789/26041/22861 28790/26042/22862
+f 20168/26038/22858 27419/25658/22491 27418/25657/22490 20173/26039/22859
+f 20173/26039/22859 27418/25657/22490 31331/25660/22493 28789/26041/22861
+f 20167/26035/22855 20169/26040/22860 20174/26043/22863 20170/26044/22864
+f 20170/26044/22864 20174/26043/22863 27490/26045/22865 27491/26046/22866
+f 20169/26040/22860 28790/26042/22862 28791/26047/22867 20174/26043/22863
+f 20174/26043/22863 28791/26047/22867 31355/26048/22868 27490/26045/22865
+f 20167/26035/22855 20170/26044/22864 20175/26049/22869 20171/26036/22856
+f 20171/26036/22856 20175/26049/22869 28788/26031/22851 28787/26026/22846
+f 20170/26044/22864 27491/26046/22866 27492/26050/22870 20175/26049/22869
+f 20175/26049/22869 27492/26050/22870 31354/26032/22852 28788/26031/22851
+f 20176/26051/22871 20180/26052/22872 20181/26053/22873 20177/26054/22874
+f 20177/26054/22874 20181/26053/22873 27423/25678/22511 27422/25674/22507
+f 20180/26052/22872 28790/26042/22862 28789/26041/22861 20181/26053/22873
+f 20181/26053/22873 28789/26041/22861 31331/25660/22493 27423/25678/22511
+f 20176/26051/22871 20177/26054/22874 20182/26055/22875 20178/26056/22876
+f 20178/26056/22876 20182/26055/22875 28792/26057/22877 28793/26058/22878
+f 20177/26054/22874 27422/25674/22507 27421/25673/22506 20182/26055/22875
+f 20182/26055/22875 27421/25673/22506 31332/25676/22509 28792/26057/22877
+f 20176/26051/22871 20178/26056/22876 20183/26059/22879 20179/26060/22880
+f 20179/26060/22880 20183/26059/22879 27493/26061/22881 27494/26062/22882
+f 20178/26056/22876 28793/26058/22878 28794/26063/22883 20183/26059/22879
+f 20183/26059/22879 28794/26063/22883 31356/26064/22884 27493/26061/22881
+f 20176/26051/22871 20179/26060/22880 20184/26065/22885 20180/26052/22872
+f 20180/26052/22872 20184/26065/22885 28791/26047/22867 28790/26042/22862
+f 20179/26060/22880 27494/26062/22882 27495/26066/22886 20184/26065/22885
+f 20184/26065/22885 27495/26066/22886 31355/26048/22868 28791/26047/22867
+f 20185/26067/22887 20189/26068/22888 20190/26069/22889 20186/26070/22890
+f 20186/26070/22890 20190/26069/22889 27426/25694/22527 27425/25690/22523
+f 20189/26068/22888 28793/26058/22878 28792/26057/22877 20190/26069/22889
+f 20190/26069/22889 28792/26057/22877 31332/25676/22509 27426/25694/22527
+f 20185/26067/22887 20186/26070/22890 20191/26071/22891 20187/26072/22892
+f 20187/26072/22892 20191/26071/22891 28795/26073/22893 28796/26074/22894
+f 20186/26070/22890 27425/25690/22523 27424/25689/22522 20191/26071/22891
+f 20191/26071/22891 27424/25689/22522 31333/25692/22525 28795/26073/22893
+f 20185/26067/22887 20187/26072/22892 20192/26075/22895 20188/26076/22896
+f 20188/26076/22896 20192/26075/22895 27496/26077/22897 27497/26078/22898
+f 20187/26072/22892 28796/26074/22894 28797/26079/22899 20192/26075/22895
+f 20192/26075/22895 28797/26079/22899 31357/26080/22900 27496/26077/22897
+f 20185/26067/22887 20188/26076/22896 20193/26081/22901 20189/26068/22888
+f 20189/26068/22888 20193/26081/22901 28794/26063/22883 28793/26058/22878
+f 20188/26076/22896 27497/26078/22898 27498/26082/22902 20193/26081/22901
+f 20193/26081/22901 27498/26082/22902 31356/26064/22884 28794/26063/22883
+f 20194/26083/22903 20198/26084/22904 20199/26085/22905 20195/26086/22906
+f 20195/26086/22906 20199/26085/22905 27429/25710/22542 27428/25706/22539
+f 20198/26084/22904 28796/26074/22894 28795/26073/22893 20199/26085/22905
+f 20199/26085/22905 28795/26073/22893 31333/25692/22525 27429/25710/22542
+f 20194/26083/22903 20195/26086/22906 20200/26087/22907 20196/26088/22908
+f 20196/26088/22908 20200/26087/22907 28798/26089/22909 28799/26090/22910
+f 20195/26086/22906 27428/25706/22539 27427/25705/22538 20200/26087/22907
+f 20200/26087/22907 27427/25705/22538 31334/25708/14955 28798/26089/22909
+f 20194/26083/22903 20196/26088/22908 20201/26091/22911 20197/26092/22912
+f 20197/26092/22912 20201/26091/22911 27499/26093/22913 27500/26094/22914
+f 20196/26088/22908 28799/26090/22910 28800/26095/22915 20201/26091/22911
+f 20201/26091/22911 28800/26095/22915 31358/26096/22916 27499/26093/22913
+f 20194/26083/22903 20197/26092/22912 20202/26097/22917 20198/26084/22904
+f 20198/26084/22904 20202/26097/22917 28797/26079/22899 28796/26074/22894
+f 20197/26092/22912 27500/26094/22914 27501/26098/22918 20202/26097/22917
+f 20202/26097/22917 27501/26098/22918 31357/26080/22900 28797/26079/22899
+f 20203/26099/22919 20207/26100/22920 20208/26101/22921 20204/26102/22922
+f 20204/26102/22922 20208/26101/22921 27432/25729/22558 27431/25724/22554
+f 20207/26100/22920 28799/26103/22910 28798/26104/22909 20208/26101/22921
+f 20208/26101/22921 28798/26104/22909 31334/25730/14955 27432/25729/22558
+f 20203/26099/22919 20204/26102/22922 20209/26105/22923 20205/26106/22924
+f 20205/26106/22924 20209/26105/22923 28801/26107/22925 28802/26108/22926
+f 20204/26102/22922 27431/25724/22554 27430/25723/22553 20209/26105/22923
+f 20209/26105/22923 27430/25723/22553 31335/25726/22556 28801/26107/22925
+f 20203/26099/22919 20205/26106/22924 20210/26109/22927 20206/26110/22928
+f 20206/26110/22928 20210/26109/22927 27502/26111/22929 27503/26112/22930
+f 20205/26106/22924 28802/26108/22926 28803/26113/22931 20210/26109/22927
+f 20210/26109/22927 28803/26113/22931 31359/26114/22932 27502/26111/22929
+f 20203/26099/22919 20206/26110/22928 20211/26115/22933 20207/26100/22920
+f 20207/26100/22920 20211/26115/22933 28800/26116/22915 28799/26103/22910
+f 20206/26110/22928 27503/26112/22930 27504/26117/22934 20211/26115/22933
+f 20211/26115/22933 27504/26117/22934 31358/26118/22916 28800/26116/22915
+f 20212/26119/22935 20216/26120/22936 20217/26121/22937 20213/26122/22938
+f 20213/26122/22938 20217/26121/22937 27435/25746/22574 27434/25742/22570
+f 20216/26120/22936 28802/26108/22926 28801/26107/22925 20217/26121/22937
+f 20217/26121/22937 28801/26107/22925 31335/25726/22556 27435/25746/22574
+f 20212/26119/22935 20213/26122/22938 20218/26123/22939 20214/26124/22940
+f 20214/26124/22940 20218/26123/22939 28804/26125/22941 28805/26126/22942
+f 20213/26122/22938 27434/25742/22570 27433/25741/22569 20218/26123/22939
+f 20218/26123/22939 27433/25741/22569 31336/25744/22572 28804/26125/22941
+f 20212/26119/22935 20214/26124/22940 20219/26127/22943 20215/26128/22944
+f 20215/26128/22944 20219/26127/22943 27505/26129/22945 27506/26130/22946
+f 20214/26124/22940 28805/26126/22942 28806/26131/22947 20219/26127/22943
+f 20219/26127/22943 28806/26131/22947 31360/26132/22948 27505/26129/22945
+f 20212/26119/22935 20215/26128/22944 20220/26133/22949 20216/26120/22936
+f 20216/26120/22936 20220/26133/22949 28803/26113/22931 28802/26108/22926
+f 20215/26128/22944 27506/26130/22946 27507/26134/22950 20220/26133/22949
+f 20220/26133/22949 27507/26134/22950 31359/26114/22932 28803/26113/22931
+f 20221/26135/22951 20225/26136/22952 20226/26137/22953 20222/26138/22954
+f 20222/26138/22954 20226/26137/22953 27438/25762/22590 27437/25758/22586
+f 20225/26136/22952 28805/26126/22942 28804/26125/22941 20226/26137/22953
+f 20226/26137/22953 28804/26125/22941 31336/25744/22572 27438/25762/22590
+f 20221/26135/22951 20222/26138/22954 20227/26139/22955 20223/26140/22956
+f 20223/26140/22956 20227/26139/22955 28807/26141/22957 28808/26142/22958
+f 20222/26138/22954 27437/25758/22586 27436/25757/22585 20227/26139/22955
+f 20227/26139/22955 27436/25757/22585 31337/25760/22588 28807/26141/22957
+f 20221/26135/22951 20223/26140/22956 20228/26143/22959 20224/26144/22960
+f 20224/26144/22960 20228/26143/22959 27508/26145/22961 27509/26146/22962
+f 20223/26140/22956 28808/26142/22958 28809/26147/22963 20228/26143/22959
+f 20228/26143/22959 28809/26147/22963 31361/26148/22964 27508/26145/22961
+f 20221/26135/22951 20224/26144/22960 20229/26149/22965 20225/26136/22952
+f 20225/26136/22952 20229/26149/22965 28806/26131/22947 28805/26126/22942
+f 20224/26144/22960 27509/26146/22962 27510/26150/22966 20229/26149/22965
+f 20229/26149/22965 27510/26150/22966 31360/26132/22948 28806/26131/22947
+f 20230/26151/22967 20234/26152/22968 20235/26153/22969 20231/26154/22970
+f 20231/26154/22970 20235/26153/22969 27441/25778/22606 27440/25774/22602
+f 20234/26152/22968 28808/26142/22958 28807/26141/22957 20235/26153/22969
+f 20235/26153/22969 28807/26141/22957 31337/25760/22588 27441/25778/22606
+f 20230/26151/22967 20231/26154/22970 20236/26155/22971 20232/26156/22972
+f 20232/26156/22972 20236/26155/22971 28810/26157/22973 28811/26158/22974
+f 20231/26154/22970 27440/25774/22602 27439/25773/22601 20236/26155/22971
+f 20236/26155/22971 27439/25773/22601 31338/25776/22604 28810/26157/22973
+f 20230/26151/22967 20232/26156/22972 20237/26159/22975 20233/26160/22976
+f 20233/26160/22976 20237/26159/22975 27511/26161/22977 27512/26162/22978
+f 20232/26156/22972 28811/26158/22974 28812/26163/22979 20237/26159/22975
+f 20237/26159/22975 28812/26163/22979 31362/26164/22980 27511/26161/22977
+f 20230/26151/22967 20233/26160/22976 20238/26165/22981 20234/26152/22968
+f 20234/26152/22968 20238/26165/22981 28809/26147/22963 28808/26142/22958
+f 20233/26160/22976 27512/26162/22978 27513/26166/22982 20238/26165/22981
+f 20238/26165/22981 27513/26166/22982 31361/26148/22964 28809/26147/22963
+f 20239/26167/22983 20243/26168/22984 20244/26169/22985 20240/26170/22986
+f 20240/26170/22986 20244/26169/22985 27444/25794/22622 27443/25790/22618
+f 20243/26168/22984 28811/26158/22974 28810/26157/22973 20244/26169/22985
+f 20244/26169/22985 28810/26157/22973 31338/25776/22604 27444/25794/22622
+f 20239/26167/22983 20240/26170/22986 20245/26171/22987 20241/26172/22988
+f 20241/26172/22988 20245/26171/22987 28813/26173/22989 28814/26174/22990
+f 20240/26170/22986 27443/25790/22618 27442/25789/22617 20245/26171/22987
+f 20245/26171/22987 27442/25789/22617 31339/25792/22620 28813/26173/22989
+f 20239/26167/22983 20241/26172/22988 20246/26175/22991 20242/26176/22992
+f 20242/26176/22992 20246/26175/22991 27514/26177/22993 27515/26178/22994
+f 20241/26172/22988 28814/26174/22990 28815/26179/22995 20246/26175/22991
+f 20246/26175/22991 28815/26179/22995 31363/26180/22996 27514/26177/22993
+f 20239/26167/22983 20242/26176/22992 20247/26181/22997 20243/26168/22984
+f 20243/26168/22984 20247/26181/22997 28812/26163/22979 28811/26158/22974
+f 20242/26176/22992 27515/26178/22994 27516/26182/22998 20247/26181/22997
+f 20247/26181/22997 27516/26182/22998 31362/26164/22980 28812/26163/22979
+f 20248/26183/22999 20252/26184/23000 20253/26185/23001 20249/26186/23002
+f 20249/26186/23002 20253/26185/23001 27447/25810/22634 27446/25806/22632
+f 20252/26184/23000 28814/26174/22990 28813/26173/22989 20253/26185/23001
+f 20253/26185/23001 28813/26173/22989 31339/25792/22620 27447/25810/22634
+f 20248/26183/22999 20249/26186/23002 20254/26187/23003 20250/26188/23004
+f 20250/26188/23004 20254/26187/23003 28816/26189/15048 28817/26190/15049
+f 20249/26186/23002 27446/25806/22632 27445/25805/22631 20254/26187/23003
+f 20254/26187/23003 27445/25805/22631 31340/25808/170 28816/26189/15048
+f 20248/26183/22999 20250/26188/23004 20255/26191/23005 20251/26192/23006
+f 20251/26192/23006 20255/26191/23005 27517/26193/23007 27518/26194/23008
+f 20250/26188/23004 28817/26190/15049 28818/26195/15052 20255/26191/23005
+f 20255/26191/23005 28818/26195/15052 31364/26196/14667 27517/26193/23007
+f 20248/26183/22999 20251/26192/23006 20256/26197/23009 20252/26184/23000
+f 20252/26184/23000 20256/26197/23009 28815/26179/22995 28814/26174/22990
+f 20251/26192/23006 27518/26194/23008 27519/26198/23010 20256/26197/23009
+f 20256/26197/23009 27519/26198/23010 31363/26180/22996 28815/26179/22995
+f 20257/26199/23011 20261/26200/23012 20262/26201/23013 20258/26202/23014
+f 20258/26202/23014 20262/26201/23013 27450/25822/22646 27449/25820/22644
+f 20261/26200/23012 28817/26190/15049 28816/26189/15048 20262/26201/23013
+f 20262/26201/23013 28816/26189/15048 31340/25808/170 27450/25822/22646
+f 20257/26199/23011 20258/26202/23014 20263/26203/23015 20259/26204/23016
+f 20259/26204/23016 20263/26203/23015 28749/25828/22652 28748/25827/22651
+f 20258/26202/23014 27449/25820/22644 27448/25819/22643 20263/26203/23015
+f 20263/26203/23015 27448/25819/22643 31317/25454/22292 28749/25828/22652
+f 20257/26199/23011 20259/26204/23016 20264/26205/23017 20260/26206/23018
+f 20260/26206/23018 20264/26205/23017 27520/26207/23019 27521/26208/23020
+f 20259/26204/23016 28748/25827/22651 28747/25840/22664 20264/26205/23017
+f 20264/26205/23017 28747/25840/22664 31341/25842/22666 27520/26207/23019
+f 20257/26199/23011 20260/26206/23018 20265/26209/23021 20261/26200/23012
+f 20261/26200/23012 20265/26209/23021 28818/26195/15052 28817/26190/15049
+f 20260/26206/23018 27521/26208/23020 27522/26210/23022 20265/26209/23021
+f 20265/26209/23021 27522/26210/23022 31364/26196/14667 28818/26195/15052
+f 20266/26211/23023 20270/26212/23024 20271/26213/23025 20267/26214/23026
+f 20267/26214/23026 20271/26213/23025 27453/25841/22665 27452/25836/22660
+f 20270/26212/23024 28820/26215/23027 28821/26216/23028 20271/26213/23025
+f 20271/26213/23025 28821/26216/23028 31341/25842/22666 27453/25841/22665
+f 20266/26211/23023 20267/26214/23026 20272/26217/23029 20268/26218/23030
+f 20268/26218/23030 20272/26217/23029 28822/26219/23031 28823/26220/23032
+f 20267/26214/23026 27452/25836/22660 27451/25835/22659 20272/26217/23029
+f 20272/26217/23029 27451/25835/22659 31342/25838/22662 28822/26219/23031
+f 20266/26211/23023 20268/26218/23030 20273/26221/23033 20269/26222/23034
+f 20269/26222/23034 20273/26221/23033 27523/26223/23035 27524/26224/23036
+f 20268/26218/23030 28823/26220/23032 28824/26225/23037 20273/26221/23033
+f 20273/26221/23033 28824/26225/23037 31366/26226/23038 27523/26223/23035
+f 20266/26211/23023 20269/26222/23034 20274/26227/23039 20270/26212/23024
+f 20270/26212/23024 20274/26227/23039 28819/26228/23040 28820/26215/23027
+f 20269/26222/23034 27524/26224/23036 27525/26229/23041 20274/26227/23039
+f 20274/26227/23039 27525/26229/23041 31365/26230/23042 28819/26228/23040
+f 20275/26231/23043 20279/26232/23044 20280/26233/23045 20276/26234/23046
+f 20276/26234/23046 20280/26233/23045 27456/25858/22682 27455/25854/22678
+f 20279/26232/23044 28823/26220/23032 28822/26219/23031 20280/26233/23045
+f 20280/26233/23045 28822/26219/23031 31342/25838/22662 27456/25858/22682
+f 20275/26231/23043 20276/26234/23046 20281/26235/23047 20277/26236/23048
+f 20277/26236/23048 20281/26235/23047 28825/26237/23049 28826/26238/23050
+f 20276/26234/23046 27455/25854/22678 27454/25853/22677 20281/26235/23047
+f 20281/26235/23047 27454/25853/22677 31343/25856/22680 28825/26237/23049
+f 20275/26231/23043 20277/26236/23048 20282/26239/23051 20278/26240/23052
+f 20278/26240/23052 20282/26239/23051 27526/26241/23053 27527/26242/23054
+f 20277/26236/23048 28826/26238/23050 28827/26243/23055 20282/26239/23051
+f 20282/26239/23051 28827/26243/23055 31367/26244/23056 27526/26241/23053
+f 20275/26231/23043 20278/26240/23052 20283/26245/23057 20279/26232/23044
+f 20279/26232/23044 20283/26245/23057 28824/26225/23037 28823/26220/23032
+f 20278/26240/23052 27527/26242/23054 27528/26246/23058 20283/26245/23057
+f 20283/26245/23057 27528/26246/23058 31366/26226/23038 28824/26225/23037
+f 20284/26247/23059 20288/26248/23060 20289/26249/23061 20285/26250/23062
+f 20285/26250/23062 20289/26249/23061 27459/25874/22698 27458/25870/22694
+f 20288/26248/23060 28826/26238/23050 28825/26237/23049 20289/26249/23061
+f 20289/26249/23061 28825/26237/23049 31343/25856/22680 27459/25874/22698
+f 20284/26247/23059 20285/26250/23062 20290/26251/23063 20286/26252/23064
+f 20286/26252/23064 20290/26251/23063 28828/26253/23065 28829/26254/23066
+f 20285/26250/23062 27458/25870/22694 27457/25869/22693 20290/26251/23063
+f 20290/26251/23063 27457/25869/22693 31344/25872/22696 28828/26253/23065
+f 20284/26247/23059 20286/26252/23064 20291/26255/23067 20287/26256/23068
+f 20287/26256/23068 20291/26255/23067 27529/26257/23069 27530/26258/23070
+f 20286/26252/23064 28829/26254/23066 28830/26259/23071 20291/26255/23067
+f 20291/26255/23067 28830/26259/23071 31368/26260/23072 27529/26257/23069
+f 20284/26247/23059 20287/26256/23068 20292/26261/23073 20288/26248/23060
+f 20288/26248/23060 20292/26261/23073 28827/26243/23055 28826/26238/23050
+f 20287/26256/23068 27530/26258/23070 27531/26262/23074 20292/26261/23073
+f 20292/26261/23073 27531/26262/23074 31367/26244/23056 28827/26243/23055
+f 20293/26263/23075 20297/26264/23076 20298/26265/23077 20294/26266/23078
+f 20294/26266/23078 20298/26265/23077 27462/25890/22714 27461/25886/22710
+f 20297/26264/23076 28829/26254/23066 28828/26253/23065 20298/26265/23077
+f 20298/26265/23077 28828/26253/23065 31344/25872/22696 27462/25890/22714
+f 20293/26263/23075 20294/26266/23078 20299/26267/23079 20295/26268/23080
+f 20295/26268/23080 20299/26267/23079 28831/26269/23081 28832/26270/23082
+f 20294/26266/23078 27461/25886/22710 27460/25885/22709 20299/26267/23079
+f 20299/26267/23079 27460/25885/22709 31345/25888/22712 28831/26269/23081
+f 20293/26263/23075 20295/26268/23080 20300/26271/23083 20296/26272/23084
+f 20296/26272/23084 20300/26271/23083 27532/26273/23085 27533/26274/23086
+f 20295/26268/23080 28832/26270/23082 28833/26275/23087 20300/26271/23083
+f 20300/26271/23083 28833/26275/23087 31369/26276/23088 27532/26273/23085
+f 20293/26263/23075 20296/26272/23084 20301/26277/23089 20297/26264/23076
+f 20297/26264/23076 20301/26277/23089 28830/26259/23071 28829/26254/23066
+f 20296/26272/23084 27533/26274/23086 27534/26278/23090 20301/26277/23089
+f 20301/26277/23089 27534/26278/23090 31368/26260/23072 28830/26259/23071
+f 20302/26279/23091 20306/26280/23092 20307/26281/23093 20303/26282/23094
+f 20303/26282/23094 20307/26281/23093 27465/25906/22730 27464/25902/22726
+f 20306/26280/23092 28832/26270/23082 28831/26269/23081 20307/26281/23093
+f 20307/26281/23093 28831/26269/23081 31345/25888/22712 27465/25906/22730
+f 20302/26279/23091 20303/26282/23094 20308/26283/23095 20304/26284/23096
+f 20304/26284/23096 20308/26283/23095 28834/26285/23097 28835/26286/23098
+f 20303/26282/23094 27464/25902/22726 27463/25901/22725 20308/26283/23095
+f 20308/26283/23095 27463/25901/22725 31346/25904/22728 28834/26285/23097
+f 20302/26279/23091 20304/26284/23096 20309/26287/23099 20305/26288/23100
+f 20305/26288/23100 20309/26287/23099 27535/26289/23101 27536/26290/23102
+f 20304/26284/23096 28835/26286/23098 28836/26291/23103 20309/26287/23099
+f 20309/26287/23099 28836/26291/23103 31370/26292/23104 27535/26289/23101
+f 20302/26279/23091 20305/26288/23100 20310/26293/23105 20306/26280/23092
+f 20306/26280/23092 20310/26293/23105 28833/26275/23087 28832/26270/23082
+f 20305/26288/23100 27536/26290/23102 27537/26294/23106 20310/26293/23105
+f 20310/26293/23105 27537/26294/23106 31369/26276/23088 28833/26275/23087
+f 20311/26295/23107 20315/26296/23108 20316/26297/23109 20312/26298/23110
+f 20312/26298/23110 20316/26297/23109 27468/25922/22746 27467/25918/22742
+f 20315/26296/23108 28835/26286/23098 28834/26285/23097 20316/26297/23109
+f 20316/26297/23109 28834/26285/23097 31346/25904/22728 27468/25922/22746
+f 20311/26295/23107 20312/26298/23110 20317/26299/23111 20313/26300/23112
+f 20313/26300/23112 20317/26299/23111 28837/26301/23113 28838/26302/23114
+f 20312/26298/23110 27467/25918/22742 27466/25917/22741 20317/26299/23111
+f 20317/26299/23111 27466/25917/22741 31347/25920/22744 28837/26301/23113
+f 20311/26295/23107 20313/26300/23112 20318/26303/23115 20314/26304/23116
+f 20314/26304/23116 20318/26303/23115 27538/26305/23117 27539/26306/23118
+f 20313/26300/23112 28838/26302/23114 28839/26307/23119 20318/26303/23115
+f 20318/26303/23115 28839/26307/23119 31371/26308/23120 27538/26305/23117
+f 20311/26295/23107 20314/26304/23116 20319/26309/23121 20315/26296/23108
+f 20315/26296/23108 20319/26309/23121 28836/26291/23103 28835/26286/23098
+f 20314/26304/23116 27539/26306/23118 27540/26310/23122 20319/26309/23121
+f 20319/26309/23121 27540/26310/23122 31370/26292/23104 28836/26291/23103
+f 20320/26311/23123 20324/26312/23124 20325/26313/23125 20321/26314/23126
+f 20321/26314/23126 20325/26313/23125 27471/25938/22762 27470/25934/22758
+f 20324/26312/23124 28838/26302/23114 28837/26301/23113 20325/26313/23125
+f 20325/26313/23125 28837/26301/23113 31347/25920/22744 27471/25938/22762
+f 20320/26311/23123 20321/26314/23126 20326/26315/23127 20322/26316/23128
+f 20322/26316/23128 20326/26315/23127 28840/26317/23129 28841/26318/23130
+f 20321/26314/23126 27470/25934/22758 27469/25933/22757 20326/26315/23127
+f 20326/26315/23127 27469/25933/22757 31348/25936/22760 28840/26317/23129
+f 20320/26311/23123 20322/26316/23128 20327/26319/23131 20323/26320/23132
+f 20323/26320/23132 20327/26319/23131 27541/26321/23133 27542/26322/23134
+f 20322/26316/23128 28841/26318/23130 28842/26323/23135 20327/26319/23131
+f 20327/26319/23131 28842/26323/23135 31372/26324/23136 27541/26321/23133
+f 20320/26311/23123 20323/26320/23132 20328/26325/23137 20324/26312/23124
+f 20324/26312/23124 20328/26325/23137 28839/26307/23119 28838/26302/23114
+f 20323/26320/23132 27542/26322/23134 27543/26326/23138 20328/26325/23137
+f 20328/26325/23137 27543/26326/23138 31371/26308/23120 28839/26307/23119
+f 20329/26327/23139 20333/26328/23140 20334/26329/23141 20330/26330/23142
+f 20330/26330/23142 20334/26329/23141 27474/25954/22778 27473/25950/22774
+f 20333/26328/23140 28841/26318/23130 28840/26317/23129 20334/26329/23141
+f 20334/26329/23141 28840/26317/23129 31348/25936/22760 27474/25954/22778
+f 20329/26327/23139 20330/26330/23142 20335/26331/23143 20331/26332/23144
+f 20331/26332/23144 20335/26331/23143 28843/26333/23145 28844/26334/23146
+f 20330/26330/23142 27473/25950/22774 27472/25949/22773 20335/26331/23143
+f 20335/26331/23143 27472/25949/22773 31349/25952/22776 28843/26333/23145
+f 20329/26327/23139 20331/26332/23144 20336/26335/23147 20332/26336/23148
+f 20332/26336/23148 20336/26335/23147 27544/26337/23149 27545/26338/23150
+f 20331/26332/23144 28844/26334/23146 28845/26339/23151 20336/26335/23147
+f 20336/26335/23147 28845/26339/23151 31373/26340/23152 27544/26337/23149
+f 20329/26327/23139 20332/26336/23148 20337/26341/23153 20333/26328/23140
+f 20333/26328/23140 20337/26341/23153 28842/26323/23135 28841/26318/23130
+f 20332/26336/23148 27545/26338/23150 27546/26342/23154 20337/26341/23153
+f 20337/26341/23153 27546/26342/23154 31372/26324/23136 28842/26323/23135
+f 20338/26343/23155 20342/26344/23156 20343/26345/23157 20339/26346/23158
+f 20339/26346/23158 20343/26345/23157 27477/25970/22794 27476/25966/22790
+f 20342/26344/23156 28844/26334/23146 28843/26333/23145 20343/26345/23157
+f 20343/26345/23157 28843/26333/23145 31349/25952/22776 27477/25970/22794
+f 20338/26343/23155 20339/26346/23158 20344/26347/23159 20340/26348/23160
+f 20340/26348/23160 20344/26347/23159 28846/26349/23161 28847/26350/23162
+f 20339/26346/23158 27476/25966/22790 27475/25965/22789 20344/26347/23159
+f 20344/26347/23159 27475/25965/22789 31350/25968/22792 28846/26349/23161
+f 20338/26343/23155 20340/26348/23160 20345/26351/23163 20341/26352/23164
+f 20341/26352/23164 20345/26351/23163 27547/26353/23165 27548/26354/23166
+f 20340/26348/23160 28847/26350/23162 28848/26355/23167 20345/26351/23163
+f 20345/26351/23163 28848/26355/23167 31374/26356/23168 27547/26353/23165
+f 20338/26343/23155 20341/26352/23164 20346/26357/23169 20342/26344/23156
+f 20342/26344/23156 20346/26357/23169 28845/26339/23151 28844/26334/23146
+f 20341/26352/23164 27548/26354/23166 27549/26358/23170 20346/26357/23169
+f 20346/26357/23169 27549/26358/23170 31373/26340/23152 28845/26339/23151
+f 20347/26359/23171 20351/26360/23172 20352/26361/23173 20348/26362/23174
+f 20348/26362/23174 20352/26361/23173 27480/25986/22810 27479/25982/22806
+f 20351/26360/23172 28847/26350/23162 28846/26349/23161 20352/26361/23173
+f 20352/26361/23173 28846/26349/23161 31350/25968/22792 27480/25986/22810
+f 20347/26359/23171 20348/26362/23174 20353/26363/23175 20349/26364/23176
+f 20349/26364/23176 20353/26363/23175 28849/26365/23177 28850/26366/23178
+f 20348/26362/23174 27479/25982/22806 27478/25981/22805 20353/26363/23175
+f 20353/26363/23175 27478/25981/22805 31351/25984/22808 28849/26365/23177
+f 20347/26359/23171 20349/26364/23176 20354/26367/23179 20350/26368/23180
+f 20350/26368/23180 20354/26367/23179 27550/26369/23181 27551/26370/23182
+f 20349/26364/23176 28850/26366/23178 28851/26371/23183 20354/26367/23179
+f 20354/26367/23179 28851/26371/23183 31375/26372/23184 27550/26369/23181
+f 20347/26359/23171 20350/26368/23180 20355/26373/23185 20351/26360/23172
+f 20351/26360/23172 20355/26373/23185 28848/26355/23167 28847/26350/23162
+f 20350/26368/23180 27551/26370/23182 27552/26374/23186 20355/26373/23185
+f 20355/26373/23185 27552/26374/23186 31374/26356/23168 28848/26355/23167
+f 20356/26375/23187 20360/26376/23188 20361/26377/23189 20357/26378/23190
+f 20357/26378/23190 20361/26377/23189 27483/26002/22822 27482/25998/22820
+f 20360/26376/23188 28850/26366/23178 28849/26365/23177 20361/26377/23189
+f 20361/26377/23189 28849/26365/23177 31351/25984/22808 27483/26002/22822
+f 20356/26375/23187 20357/26378/23190 20362/26379/23191 20358/26380/23192
+f 20358/26380/23192 20362/26379/23191 28852/26381/14856 28853/26382/14857
+f 20357/26378/23190 27482/25998/22820 27481/25997/22819 20362/26379/23191
+f 20362/26379/23191 27481/25997/22819 31352/26000/14859 28852/26381/14856
+f 20356/26375/23187 20358/26380/23192 20363/26383/23193 20359/26384/23194
+f 20359/26384/23194 20363/26383/23193 27553/26385/23195 27554/26386/23196
+f 20358/26380/23192 28853/26382/14857 28854/26387/14861 20363/26383/23193
+f 20363/26383/23193 28854/26387/14861 31376/26388/14475 27553/26385/23195
+f 20356/26375/23187 20359/26384/23194 20364/26389/23197 20360/26376/23188
+f 20360/26376/23188 20364/26389/23197 28851/26371/23183 28850/26366/23178
+f 20359/26384/23194 27554/26386/23196 27555/26390/23198 20364/26389/23197
+f 20364/26389/23197 27555/26390/23198 31375/26372/23184 28851/26371/23183
+f 20365/26391/23199 20369/26392/23200 20370/26393/23201 20366/26394/23202
+f 20366/26394/23202 20370/26393/23201 27486/26018/22838 27485/26014/22834
+f 20369/26392/23200 28853/26382/14857 28852/26381/14856 20370/26393/23201
+f 20370/26393/23201 28852/26381/14856 31352/26000/14859 27486/26018/22838
+f 20365/26391/23199 20366/26394/23202 20371/26395/23203 20367/26396/23204
+f 20367/26396/23204 20371/26395/23203 28855/26397/23205 28856/26398/23206
+f 20366/26394/23202 27485/26014/22834 27484/26013/22833 20371/26395/23203
+f 20371/26395/23203 27484/26013/22833 31353/26016/22836 28855/26397/23205
+f 20365/26391/23199 20367/26396/23204 20372/26399/23207 20368/26400/23208
+f 20368/26400/23208 20372/26399/23207 27556/26401/23209 27557/26402/23210
+f 20367/26396/23204 28856/26398/23206 28857/26403/23211 20372/26399/23207
+f 20372/26399/23207 28857/26403/23211 31377/26404/23212 27556/26401/23209
+f 20365/26391/23199 20368/26400/23208 20373/26405/23213 20369/26392/23200
+f 20369/26392/23200 20373/26405/23213 28854/26387/14861 28853/26382/14857
+f 20368/26400/23208 27557/26402/23210 27558/26406/23214 20373/26405/23213
+f 20373/26405/23213 27558/26406/23214 31376/26388/14475 28854/26387/14861
+f 20374/26407/23215 20378/26408/23216 20379/26409/23217 20375/26410/23218
+f 20375/26410/23218 20379/26409/23217 27489/26034/22854 27488/26030/22850
+f 20378/26408/23216 28856/26398/23206 28855/26397/23205 20379/26409/23217
+f 20379/26409/23217 28855/26397/23205 31353/26016/22836 27489/26034/22854
+f 20374/26407/23215 20375/26410/23218 20380/26411/23219 20376/26412/23220
+f 20376/26412/23220 20380/26411/23219 28858/26413/23221 28859/26414/23222
+f 20375/26410/23218 27488/26030/22850 27487/26029/22849 20380/26411/23219
+f 20380/26411/23219 27487/26029/22849 31354/26032/22852 28858/26413/23221
+f 20374/26407/23215 20376/26412/23220 20381/26415/23223 20377/26416/23224
+f 20377/26416/23224 20381/26415/23223 27559/26417/23225 27560/26418/23226
+f 20376/26412/23220 28859/26414/23222 28860/26419/23227 20381/26415/23223
+f 20381/26415/23223 28860/26419/23227 31378/26420/23228 27559/26417/23225
+f 20374/26407/23215 20377/26416/23224 20382/26421/23229 20378/26408/23216
+f 20378/26408/23216 20382/26421/23229 28857/26403/23211 28856/26398/23206
+f 20377/26416/23224 27560/26418/23226 27561/26422/23230 20382/26421/23229
+f 20382/26421/23229 27561/26422/23230 31377/26404/23212 28857/26403/23211
+f 20383/26423/23231 20387/26424/23232 20388/26425/23233 20384/26426/23234
+f 20384/26426/23234 20388/26425/23233 27492/26050/22870 27491/26046/22866
+f 20387/26424/23232 28859/26414/23222 28858/26413/23221 20388/26425/23233
+f 20388/26425/23233 28858/26413/23221 31354/26032/22852 27492/26050/22870
+f 20383/26423/23231 20384/26426/23234 20389/26427/23235 20385/26428/23236
+f 20385/26428/23236 20389/26427/23235 28861/26429/23237 28862/26430/23238
+f 20384/26426/23234 27491/26046/22866 27490/26045/22865 20389/26427/23235
+f 20389/26427/23235 27490/26045/22865 31355/26048/22868 28861/26429/23237
+f 20383/26423/23231 20385/26428/23236 20390/26431/23239 20386/26432/23240
+f 20386/26432/23240 20390/26431/23239 27562/26433/23241 27563/26434/23242
+f 20385/26428/23236 28862/26430/23238 28863/26435/23243 20390/26431/23239
+f 20390/26431/23239 28863/26435/23243 31379/26436/23244 27562/26433/23241
+f 20383/26423/23231 20386/26432/23240 20391/26437/23245 20387/26424/23232
+f 20387/26424/23232 20391/26437/23245 28860/26419/23227 28859/26414/23222
+f 20386/26432/23240 27563/26434/23242 27564/26438/23246 20391/26437/23245
+f 20391/26437/23245 27564/26438/23246 31378/26420/23228 28860/26419/23227
+f 20392/26439/23247 20396/26440/23248 20397/26441/23249 20393/26442/23250
+f 20393/26442/23250 20397/26441/23249 27495/26066/22886 27494/26062/22882
+f 20396/26440/23248 28862/26430/23238 28861/26429/23237 20397/26441/23249
+f 20397/26441/23249 28861/26429/23237 31355/26048/22868 27495/26066/22886
+f 20392/26439/23247 20393/26442/23250 20398/26443/23251 20394/26444/23252
+f 20394/26444/23252 20398/26443/23251 28864/26445/23253 28865/26446/23254
+f 20393/26442/23250 27494/26062/22882 27493/26061/22881 20398/26443/23251
+f 20398/26443/23251 27493/26061/22881 31356/26064/22884 28864/26445/23253
+f 20392/26439/23247 20394/26444/23252 20399/26447/23255 20395/26448/23256
+f 20395/26448/23256 20399/26447/23255 27565/26449/23257 27566/26450/23258
+f 20394/26444/23252 28865/26446/23254 28866/26451/23259 20399/26447/23255
+f 20399/26447/23255 28866/26451/23259 31380/26452/23260 27565/26449/23257
+f 20392/26439/23247 20395/26448/23256 20400/26453/23261 20396/26440/23248
+f 20396/26440/23248 20400/26453/23261 28863/26435/23243 28862/26430/23238
+f 20395/26448/23256 27566/26450/23258 27567/26454/23262 20400/26453/23261
+f 20400/26453/23261 27567/26454/23262 31379/26436/23244 28863/26435/23243
+f 20401/26455/23263 20405/26456/23264 20406/26457/23265 20402/26458/23266
+f 20402/26458/23266 20406/26457/23265 27498/26082/22902 27497/26078/22898
+f 20405/26456/23264 28865/26446/23254 28864/26445/23253 20406/26457/23265
+f 20406/26457/23265 28864/26445/23253 31356/26064/22884 27498/26082/22902
+f 20401/26455/23263 20402/26458/23266 20407/26459/23267 20403/26460/23268
+f 20403/26460/23268 20407/26459/23267 28867/26461/23269 28868/26462/23270
+f 20402/26458/23266 27497/26078/22898 27496/26077/22897 20407/26459/23267
+f 20407/26459/23267 27496/26077/22897 31357/26080/22900 28867/26461/23269
+f 20401/26455/23263 20403/26460/23268 20408/26463/23271 20404/26464/23272
+f 20404/26464/23272 20408/26463/23271 27568/26465/23273 27569/26466/23274
+f 20403/26460/23268 28868/26462/23270 28869/26467/23275 20408/26463/23271
+f 20408/26463/23271 28869/26467/23275 31381/26468/23276 27568/26465/23273
+f 20401/26455/23263 20404/26464/23272 20409/26469/23277 20405/26456/23264
+f 20405/26456/23264 20409/26469/23277 28866/26451/23259 28865/26446/23254
+f 20404/26464/23272 27569/26466/23274 27570/26470/23278 20409/26469/23277
+f 20409/26469/23277 27570/26470/23278 31380/26452/23260 28866/26451/23259
+f 20410/26471/23279 20414/26472/23280 20415/26473/23281 20411/26474/23282
+f 20411/26474/23282 20415/26473/23281 27501/26098/22918 27500/26094/22914
+f 20414/26472/23280 28868/26462/23270 28867/26461/23269 20415/26473/23281
+f 20415/26473/23281 28867/26461/23269 31357/26080/22900 27501/26098/22918
+f 20410/26471/23279 20411/26474/23282 20416/26475/23283 20412/26476/23284
+f 20412/26476/23284 20416/26475/23283 28870/26477/23285 28871/26478/23286
+f 20411/26474/23282 27500/26094/22914 27499/26093/22913 20416/26475/23283
+f 20416/26475/23283 27499/26093/22913 31358/26096/22916 28870/26477/23285
+f 20410/26471/23279 20412/26476/23284 20417/26479/23287 20413/26480/23288
+f 20413/26480/23288 20417/26479/23287 27571/26481/23289 27572/26482/23290
+f 20412/26476/23284 28871/26478/23286 28872/26483/23291 20417/26479/23287
+f 20417/26479/23287 28872/26483/23291 31382/26484/23292 27571/26481/23289
+f 20410/26471/23279 20413/26480/23288 20418/26485/23293 20414/26472/23280
+f 20414/26472/23280 20418/26485/23293 28869/26467/23275 28868/26462/23270
+f 20413/26480/23288 27572/26482/23290 27573/26486/23294 20418/26485/23293
+f 20418/26485/23293 27573/26486/23294 31381/26468/23276 28869/26467/23275
+f 20419/26487/23295 20423/26488/23296 20424/26489/23297 20420/26490/23298
+f 20420/26490/23298 20424/26489/23297 27504/26117/22934 27503/26112/22930
+f 20423/26488/23296 28871/26491/23286 28870/26492/23285 20424/26489/23297
+f 20424/26489/23297 28870/26492/23285 31358/26118/22916 27504/26117/22934
+f 20419/26487/23295 20420/26490/23298 20425/26493/23299 20421/26494/23300
+f 20421/26494/23300 20425/26493/23299 28873/26495/23301 28874/26496/23302
+f 20420/26490/23298 27503/26112/22930 27502/26111/22929 20425/26493/23299
+f 20425/26493/23299 27502/26111/22929 31359/26114/22932 28873/26495/23301
+f 20419/26487/23295 20421/26494/23300 20426/26497/23303 20422/26498/23304
+f 20422/26498/23304 20426/26497/23303 27574/26499/23305 27575/26500/23306
+f 20421/26494/23300 28874/26496/23302 28875/26501/23307 20426/26497/23303
+f 20426/26497/23303 28875/26501/23307 31383/26502/23308 27574/26499/23305
+f 20419/26487/23295 20422/26498/23304 20427/26503/23309 20423/26488/23296
+f 20423/26488/23296 20427/26503/23309 28872/26504/23291 28871/26491/23286
+f 20422/26498/23304 27575/26500/23306 27576/26505/23310 20427/26503/23309
+f 20427/26503/23309 27576/26505/23310 31382/26506/23292 28872/26504/23291
+f 20428/26507/23311 20432/26508/23312 20433/26509/23313 20429/26510/23314
+f 20429/26510/23314 20433/26509/23313 27507/26134/22950 27506/26130/22946
+f 20432/26508/23312 28874/26496/23302 28873/26495/23301 20433/26509/23313
+f 20433/26509/23313 28873/26495/23301 31359/26114/22932 27507/26134/22950
+f 20428/26507/23311 20429/26510/23314 20434/26511/23315 20430/26512/23316
+f 20430/26512/23316 20434/26511/23315 28876/26513/23317 28877/26514/23318
+f 20429/26510/23314 27506/26130/22946 27505/26129/22945 20434/26511/23315
+f 20434/26511/23315 27505/26129/22945 31360/26132/22948 28876/26513/23317
+f 20428/26507/23311 20430/26512/23316 20435/26515/23319 20431/26516/23320
+f 20431/26516/23320 20435/26515/23319 27577/26517/23321 27578/26518/23322
+f 20430/26512/23316 28877/26514/23318 28878/26519/23323 20435/26515/23319
+f 20435/26515/23319 28878/26519/23323 31384/26520/23324 27577/26517/23321
+f 20428/26507/23311 20431/26516/23320 20436/26521/23325 20432/26508/23312
+f 20432/26508/23312 20436/26521/23325 28875/26501/23307 28874/26496/23302
+f 20431/26516/23320 27578/26518/23322 27579/26522/23326 20436/26521/23325
+f 20436/26521/23325 27579/26522/23326 31383/26502/23308 28875/26501/23307
+f 20437/26523/23327 20441/26524/23328 20442/26525/23329 20438/26526/23330
+f 20438/26526/23330 20442/26525/23329 27510/26150/22966 27509/26146/22962
+f 20441/26524/23328 28877/26514/23318 28876/26513/23317 20442/26525/23329
+f 20442/26525/23329 28876/26513/23317 31360/26132/22948 27510/26150/22966
+f 20437/26523/23327 20438/26526/23330 20443/26527/23331 20439/26528/23332
+f 20439/26528/23332 20443/26527/23331 28879/26529/23333 28880/26530/23334
+f 20438/26526/23330 27509/26146/22962 27508/26145/22961 20443/26527/23331
+f 20443/26527/23331 27508/26145/22961 31361/26148/22964 28879/26529/23333
+f 20437/26523/23327 20439/26528/23332 20444/26531/23335 20440/26532/23336
+f 20440/26532/23336 20444/26531/23335 27580/26533/23337 27581/26534/23338
+f 20439/26528/23332 28880/26530/23334 28881/26535/23339 20444/26531/23335
+f 20444/26531/23335 28881/26535/23339 31385/26536/23340 27580/26533/23337
+f 20437/26523/23327 20440/26532/23336 20445/26537/23341 20441/26524/23328
+f 20441/26524/23328 20445/26537/23341 28878/26519/23323 28877/26514/23318
+f 20440/26532/23336 27581/26534/23338 27582/26538/23342 20445/26537/23341
+f 20445/26537/23341 27582/26538/23342 31384/26520/23324 28878/26519/23323
+f 20446/26539/23343 20450/26540/23344 20451/26541/23345 20447/26542/23346
+f 20447/26542/23346 20451/26541/23345 27513/26166/22982 27512/26162/22978
+f 20450/26540/23344 28880/26530/23334 28879/26529/23333 20451/26541/23345
+f 20451/26541/23345 28879/26529/23333 31361/26148/22964 27513/26166/22982
+f 20446/26539/23343 20447/26542/23346 20452/26543/23347 20448/26544/23348
+f 20448/26544/23348 20452/26543/23347 28882/26545/23349 28883/26546/23350
+f 20447/26542/23346 27512/26162/22978 27511/26161/22977 20452/26543/23347
+f 20452/26543/23347 27511/26161/22977 31362/26164/22980 28882/26545/23349
+f 20446/26539/23343 20448/26544/23348 20453/26547/23351 20449/26548/23352
+f 20449/26548/23352 20453/26547/23351 27583/26549/23353 27584/26550/23354
+f 20448/26544/23348 28883/26546/23350 28884/26551/23355 20453/26547/23351
+f 20453/26547/23351 28884/26551/23355 31386/26552/23356 27583/26549/23353
+f 20446/26539/23343 20449/26548/23352 20454/26553/23357 20450/26540/23344
+f 20450/26540/23344 20454/26553/23357 28881/26535/23339 28880/26530/23334
+f 20449/26548/23352 27584/26550/23354 27585/26554/23358 20454/26553/23357
+f 20454/26553/23357 27585/26554/23358 31385/26536/23340 28881/26535/23339
+f 20455/26555/23359 20459/26556/23360 20460/26557/23361 20456/26558/23362
+f 20456/26558/23362 20460/26557/23361 27516/26182/22998 27515/26178/22994
+f 20459/26556/23360 28883/26546/23350 28882/26545/23349 20460/26557/23361
+f 20460/26557/23361 28882/26545/23349 31362/26164/22980 27516/26182/22998
+f 20455/26555/23359 20456/26558/23362 20461/26559/23363 20457/26560/23364
+f 20457/26560/23364 20461/26559/23363 28885/26561/23365 28886/26562/23366
+f 20456/26558/23362 27515/26178/22994 27514/26177/22993 20461/26559/23363
+f 20461/26559/23363 27514/26177/22993 31363/26180/22996 28885/26561/23365
+f 20455/26555/23359 20457/26560/23364 20462/26563/23367 20458/26564/23368
+f 20458/26564/23368 20462/26563/23367 27586/26565/23369 27587/26566/23370
+f 20457/26560/23364 28886/26562/23366 28887/26567/23371 20462/26563/23367
+f 20462/26563/23367 28887/26567/23371 31387/26568/23372 27586/26565/23369
+f 20455/26555/23359 20458/26564/23368 20463/26569/23373 20459/26556/23360
+f 20459/26556/23360 20463/26569/23373 28884/26551/23355 28883/26546/23350
+f 20458/26564/23368 27587/26566/23370 27588/26570/23374 20463/26569/23373
+f 20463/26569/23373 27588/26570/23374 31386/26552/23356 28884/26551/23355
+f 20464/26571/23375 20468/26572/23376 20469/26573/23377 20465/26574/23378
+f 20465/26574/23378 20469/26573/23377 27519/26198/23010 27518/26194/23008
+f 20468/26572/23376 28886/26562/23366 28885/26561/23365 20469/26573/23377
+f 20469/26573/23377 28885/26561/23365 31363/26180/22996 27519/26198/23010
+f 20464/26571/23375 20465/26574/23378 20470/26575/23379 20466/26576/23380
+f 20466/26576/23380 20470/26575/23379 28888/26577/14664 28889/26578/14665
+f 20465/26574/23378 27518/26194/23008 27517/26193/23007 20470/26575/23379
+f 20470/26575/23379 27517/26193/23007 31364/26196/14667 28888/26577/14664
+f 20464/26571/23375 20466/26576/23380 20471/26579/23381 20467/26580/23382
+f 20467/26580/23382 20471/26579/23381 27589/26581/23383 27590/26582/23384
+f 20466/26576/23380 28889/26578/14665 28890/26583/14669 20471/26579/23381
+f 20471/26579/23381 28890/26583/14669 31388/26584/14283 27589/26581/23383
+f 20464/26571/23375 20467/26580/23382 20472/26585/23385 20468/26572/23376
+f 20468/26572/23376 20472/26585/23385 28887/26567/23371 28886/26562/23366
+f 20467/26580/23382 27590/26582/23384 27591/26586/23386 20472/26585/23385
+f 20472/26585/23385 27591/26586/23386 31387/26568/23372 28887/26567/23371
+f 20473/26587/23387 20477/26588/23388 20478/26589/23389 20474/26590/23390
+f 20474/26590/23390 20478/26589/23389 27522/26210/23022 27521/26208/23020
+f 20477/26588/23388 28889/26578/14665 28888/26577/14664 20478/26589/23389
+f 20478/26589/23389 28888/26577/14664 31364/26196/14667 27522/26210/23022
+f 20473/26587/23387 20474/26590/23390 20479/26591/23391 20475/26592/23392
+f 20475/26592/23392 20479/26591/23391 28821/26216/23028 28820/26215/23027
+f 20474/26590/23390 27521/26208/23020 27520/26207/23019 20479/26591/23391
+f 20479/26591/23391 27520/26207/23019 31341/25842/22666 28821/26216/23028
+f 20473/26587/23387 20475/26592/23392 20480/26593/23393 20476/26594/23394
+f 20476/26594/23394 20480/26593/23393 27592/26595/23395 27593/26596/23396
+f 20475/26592/23392 28820/26215/23027 28819/26228/23040 20480/26593/23393
+f 20480/26593/23393 28819/26228/23040 31365/26230/23042 27592/26595/23395
+f 20473/26587/23387 20476/26594/23394 20481/26597/23397 20477/26588/23388
+f 20477/26588/23388 20481/26597/23397 28890/26583/14669 28889/26578/14665
+f 20476/26594/23394 27593/26596/23396 27594/26598/23398 20481/26597/23397
+f 20481/26597/23397 27594/26598/23398 31388/26584/14283 28890/26583/14669
+f 20482/26599/23399 20486/26600/23400 20487/26601/23401 20483/26602/23402
+f 20483/26602/23402 20487/26601/23401 27525/26229/23041 27524/26224/23036
+f 20486/26600/23400 28892/26603/23403 28893/26604/23404 20487/26601/23401
+f 20487/26601/23401 28893/26604/23404 31365/26230/23042 27525/26229/23041
+f 20482/26599/23399 20483/26602/23402 20488/26605/23405 20484/26606/23406
+f 20484/26606/23406 20488/26605/23405 28894/26607/23407 28895/26608/23408
+f 20483/26602/23402 27524/26224/23036 27523/26223/23035 20488/26605/23405
+f 20488/26605/23405 27523/26223/23035 31366/26226/23038 28894/26607/23407
+f 20482/26599/23399 20484/26606/23406 20489/26609/23409 20485/26610/23410
+f 20485/26610/23410 20489/26609/23409 27595/26611/23411 27596/26612/23412
+f 20484/26606/23406 28895/26608/23408 28896/26613/23413 20489/26609/23409
+f 20489/26609/23409 28896/26613/23413 31390/26614/23414 27595/26611/23411
+f 20482/26599/23399 20485/26610/23410 20490/26615/23415 20486/26600/23400
+f 20486/26600/23400 20490/26615/23415 28891/26616/23416 28892/26603/23403
+f 20485/26610/23410 27596/26612/23412 27597/26617/23417 20490/26615/23415
+f 20490/26615/23415 27597/26617/23417 31389/26618/23418 28891/26616/23416
+f 20491/26619/23419 20495/26620/23420 20496/26621/23421 20492/26622/23422
+f 20492/26622/23422 20496/26621/23421 27528/26246/23058 27527/26242/23054
+f 20495/26620/23420 28895/26608/23408 28894/26607/23407 20496/26621/23421
+f 20496/26621/23421 28894/26607/23407 31366/26226/23038 27528/26246/23058
+f 20491/26619/23419 20492/26622/23422 20497/26623/23423 20493/26624/23424
+f 20493/26624/23424 20497/26623/23423 28897/26625/23425 28898/26626/23426
+f 20492/26622/23422 27527/26242/23054 27526/26241/23053 20497/26623/23423
+f 20497/26623/23423 27526/26241/23053 31367/26244/23056 28897/26625/23425
+f 20491/26619/23419 20493/26624/23424 20498/26627/23427 20494/26628/23428
+f 20494/26628/23428 20498/26627/23427 27598/26629/23429 27599/26630/23430
+f 20493/26624/23424 28898/26626/23426 28899/26631/23431 20498/26627/23427
+f 20498/26627/23427 28899/26631/23431 31391/26632/23432 27598/26629/23429
+f 20491/26619/23419 20494/26628/23428 20499/26633/23433 20495/26620/23420
+f 20495/26620/23420 20499/26633/23433 28896/26613/23413 28895/26608/23408
+f 20494/26628/23428 27599/26630/23430 27600/26634/23434 20499/26633/23433
+f 20499/26633/23433 27600/26634/23434 31390/26614/23414 28896/26613/23413
+f 20500/26635/23435 20504/26636/23436 20505/26637/23437 20501/26638/23438
+f 20501/26638/23438 20505/26637/23437 27531/26262/23074 27530/26258/23070
+f 20504/26636/23436 28898/26626/23426 28897/26625/23425 20505/26637/23437
+f 20505/26637/23437 28897/26625/23425 31367/26244/23056 27531/26262/23074
+f 20500/26635/23435 20501/26638/23438 20506/26639/23439 20502/26640/23440
+f 20502/26640/23440 20506/26639/23439 28900/26641/23441 28901/26642/23442
+f 20501/26638/23438 27530/26258/23070 27529/26257/23069 20506/26639/23439
+f 20506/26639/23439 27529/26257/23069 31368/26260/23072 28900/26641/23441
+f 20500/26635/23435 20502/26640/23440 20507/26643/23443 20503/26644/23444
+f 20503/26644/23444 20507/26643/23443 27601/26645/23445 27602/26646/23446
+f 20502/26640/23440 28901/26642/23442 28902/26647/23447 20507/26643/23443
+f 20507/26643/23443 28902/26647/23447 31392/26648/23448 27601/26645/23445
+f 20500/26635/23435 20503/26644/23444 20508/26649/23449 20504/26636/23436
+f 20504/26636/23436 20508/26649/23449 28899/26631/23431 28898/26626/23426
+f 20503/26644/23444 27602/26646/23446 27603/26650/23450 20508/26649/23449
+f 20508/26649/23449 27603/26650/23450 31391/26632/23432 28899/26631/23431
+f 20509/26651/23451 20513/26652/23452 20514/26653/23453 20510/26654/23454
+f 20510/26654/23454 20514/26653/23453 27534/26278/23090 27533/26274/23086
+f 20513/26652/23452 28901/26642/23442 28900/26641/23441 20514/26653/23453
+f 20514/26653/23453 28900/26641/23441 31368/26260/23072 27534/26278/23090
+f 20509/26651/23451 20510/26654/23454 20515/26655/23455 20511/26656/23456
+f 20511/26656/23456 20515/26655/23455 28903/26657/23457 28904/26658/23458
+f 20510/26654/23454 27533/26274/23086 27532/26273/23085 20515/26655/23455
+f 20515/26655/23455 27532/26273/23085 31369/26276/23088 28903/26657/23457
+f 20509/26651/23451 20511/26656/23456 20516/26659/23459 20512/26660/23460
+f 20512/26660/23460 20516/26659/23459 27604/26661/23461 27605/26662/23462
+f 20511/26656/23456 28904/26658/23458 28905/26663/23463 20516/26659/23459
+f 20516/26659/23459 28905/26663/23463 31393/26664/23464 27604/26661/23461
+f 20509/26651/23451 20512/26660/23460 20517/26665/23465 20513/26652/23452
+f 20513/26652/23452 20517/26665/23465 28902/26647/23447 28901/26642/23442
+f 20512/26660/23460 27605/26662/23462 27606/26666/23466 20517/26665/23465
+f 20517/26665/23465 27606/26666/23466 31392/26648/23448 28902/26647/23447
+f 20518/26667/23467 20522/26668/23468 20523/26669/23469 20519/26670/23470
+f 20519/26670/23470 20523/26669/23469 27537/26294/23106 27536/26290/23102
+f 20522/26668/23468 28904/26658/23458 28903/26657/23457 20523/26669/23469
+f 20523/26669/23469 28903/26657/23457 31369/26276/23088 27537/26294/23106
+f 20518/26667/23467 20519/26670/23470 20524/26671/23471 20520/26672/23472
+f 20520/26672/23472 20524/26671/23471 28906/26673/23473 28907/26674/23474
+f 20519/26670/23470 27536/26290/23102 27535/26289/23101 20524/26671/23471
+f 20524/26671/23471 27535/26289/23101 31370/26292/23104 28906/26673/23473
+f 20518/26667/23467 20520/26672/23472 20525/26675/23475 20521/26676/23476
+f 20521/26676/23476 20525/26675/23475 27607/26677/23477 27608/26678/23478
+f 20520/26672/23472 28907/26674/23474 28908/26679/23479 20525/26675/23475
+f 20525/26675/23475 28908/26679/23479 31394/26680/23480 27607/26677/23477
+f 20518/26667/23467 20521/26676/23476 20526/26681/23481 20522/26668/23468
+f 20522/26668/23468 20526/26681/23481 28905/26663/23463 28904/26658/23458
+f 20521/26676/23476 27608/26678/23478 27609/26682/23482 20526/26681/23481
+f 20526/26681/23481 27609/26682/23482 31393/26664/23464 28905/26663/23463
+f 20527/26683/23483 20531/26684/23484 20532/26685/23485 20528/26686/23486
+f 20528/26686/23486 20532/26685/23485 27540/26310/23122 27539/26306/23118
+f 20531/26684/23484 28907/26674/23474 28906/26673/23473 20532/26685/23485
+f 20532/26685/23485 28906/26673/23473 31370/26292/23104 27540/26310/23122
+f 20527/26683/23483 20528/26686/23486 20533/26687/23487 20529/26688/23488
+f 20529/26688/23488 20533/26687/23487 28909/26689/23489 28910/26690/23490
+f 20528/26686/23486 27539/26306/23118 27538/26305/23117 20533/26687/23487
+f 20533/26687/23487 27538/26305/23117 31371/26308/23120 28909/26689/23489
+f 20527/26683/23483 20529/26688/23488 20534/26691/23491 20530/26692/23492
+f 20530/26692/23492 20534/26691/23491 27610/26693/23493 27611/26694/23494
+f 20529/26688/23488 28910/26690/23490 28911/26695/23495 20534/26691/23491
+f 20534/26691/23491 28911/26695/23495 31395/26696/23496 27610/26693/23493
+f 20527/26683/23483 20530/26692/23492 20535/26697/23497 20531/26684/23484
+f 20531/26684/23484 20535/26697/23497 28908/26679/23479 28907/26674/23474
+f 20530/26692/23492 27611/26694/23494 27612/26698/23498 20535/26697/23497
+f 20535/26697/23497 27612/26698/23498 31394/26680/23480 28908/26679/23479
+f 20536/26699/23499 20540/26700/23500 20541/26701/23501 20537/26702/23502
+f 20537/26702/23502 20541/26701/23501 27543/26326/23138 27542/26322/23134
+f 20540/26700/23500 28910/26690/23490 28909/26689/23489 20541/26701/23501
+f 20541/26701/23501 28909/26689/23489 31371/26308/23120 27543/26326/23138
+f 20536/26699/23499 20537/26702/23502 20542/26703/23503 20538/26704/23504
+f 20538/26704/23504 20542/26703/23503 28912/26705/23505 28913/26706/23506
+f 20537/26702/23502 27542/26322/23134 27541/26321/23133 20542/26703/23503
+f 20542/26703/23503 27541/26321/23133 31372/26324/23136 28912/26705/23505
+f 20536/26699/23499 20538/26704/23504 20543/26707/23507 20539/26708/23508
+f 20539/26708/23508 20543/26707/23507 27613/26709/23509 27614/26710/23510
+f 20538/26704/23504 28913/26706/23506 28914/26711/23511 20543/26707/23507
+f 20543/26707/23507 28914/26711/23511 31396/26712/23512 27613/26709/23509
+f 20536/26699/23499 20539/26708/23508 20544/26713/23513 20540/26700/23500
+f 20540/26700/23500 20544/26713/23513 28911/26695/23495 28910/26690/23490
+f 20539/26708/23508 27614/26710/23510 27615/26714/23514 20544/26713/23513
+f 20544/26713/23513 27615/26714/23514 31395/26696/23496 28911/26695/23495
+f 20545/26715/23515 20549/26716/23516 20550/26717/23517 20546/26718/23518
+f 20546/26718/23518 20550/26717/23517 27546/26342/23154 27545/26338/23150
+f 20549/26716/23516 28913/26706/23506 28912/26705/23505 20550/26717/23517
+f 20550/26717/23517 28912/26705/23505 31372/26324/23136 27546/26342/23154
+f 20545/26715/23515 20546/26718/23518 20551/26719/23519 20547/26720/23520
+f 20547/26720/23520 20551/26719/23519 28915/26721/23521 28916/26722/23522
+f 20546/26718/23518 27545/26338/23150 27544/26337/23149 20551/26719/23519
+f 20551/26719/23519 27544/26337/23149 31373/26340/23152 28915/26721/23521
+f 20545/26715/23515 20547/26720/23520 20552/26723/23523 20548/26724/23524
+f 20548/26724/23524 20552/26723/23523 27616/26725/23525 27617/26726/23526
+f 20547/26720/23520 28916/26722/23522 28917/26727/23527 20552/26723/23523
+f 20552/26723/23523 28917/26727/23527 31397/26728/23528 27616/26725/23525
+f 20545/26715/23515 20548/26724/23524 20553/26729/23529 20549/26716/23516
+f 20549/26716/23516 20553/26729/23529 28914/26711/23511 28913/26706/23506
+f 20548/26724/23524 27617/26726/23526 27618/26730/23530 20553/26729/23529
+f 20553/26729/23529 27618/26730/23530 31396/26712/23512 28914/26711/23511
+f 20554/26731/23531 20558/26732/23532 20559/26733/23533 20555/26734/23534
+f 20555/26734/23534 20559/26733/23533 27549/26358/23170 27548/26354/23166
+f 20558/26732/23532 28916/26722/23522 28915/26721/23521 20559/26733/23533
+f 20559/26733/23533 28915/26721/23521 31373/26340/23152 27549/26358/23170
+f 20554/26731/23531 20555/26734/23534 20560/26735/23535 20556/26736/23536
+f 20556/26736/23536 20560/26735/23535 28918/26737/23537 28919/26738/23538
+f 20555/26734/23534 27548/26354/23166 27547/26353/23165 20560/26735/23535
+f 20560/26735/23535 27547/26353/23165 31374/26356/23168 28918/26737/23537
+f 20554/26731/23531 20556/26736/23536 20561/26739/23539 20557/26740/23540
+f 20557/26740/23540 20561/26739/23539 27619/26741/23541 27620/26742/23542
+f 20556/26736/23536 28919/26738/23538 28920/26743/23543 20561/26739/23539
+f 20561/26739/23539 28920/26743/23543 31398/26744/23544 27619/26741/23541
+f 20554/26731/23531 20557/26740/23540 20562/26745/23545 20558/26732/23532
+f 20558/26732/23532 20562/26745/23545 28917/26727/23527 28916/26722/23522
+f 20557/26740/23540 27620/26742/23542 27621/26746/23546 20562/26745/23545
+f 20562/26745/23545 27621/26746/23546 31397/26728/23528 28917/26727/23527
+f 20563/26747/23547 20567/26748/23548 20568/26749/23549 20564/26750/23550
+f 20564/26750/23550 20568/26749/23549 27552/26374/23186 27551/26370/23182
+f 20567/26748/23548 28919/26738/23538 28918/26737/23537 20568/26749/23549
+f 20568/26749/23549 28918/26737/23537 31374/26356/23168 27552/26374/23186
+f 20563/26747/23547 20564/26750/23550 20569/26751/23551 20565/26752/23552
+f 20565/26752/23552 20569/26751/23551 28921/26753/23553 28922/26754/23554
+f 20564/26750/23550 27551/26370/23182 27550/26369/23181 20569/26751/23551
+f 20569/26751/23551 27550/26369/23181 31375/26372/23184 28921/26753/23553
+f 20563/26747/23547 20565/26752/23552 20570/26755/23555 20566/26756/23556
+f 20566/26756/23556 20570/26755/23555 27622/26757/23557 27623/26758/23558
+f 20565/26752/23552 28922/26754/23554 28923/26759/23559 20570/26755/23555
+f 20570/26755/23555 28923/26759/23559 31399/26760/23560 27622/26757/23557
+f 20563/26747/23547 20566/26756/23556 20571/26761/23561 20567/26748/23548
+f 20567/26748/23548 20571/26761/23561 28920/26743/23543 28919/26738/23538
+f 20566/26756/23556 27623/26758/23558 27624/26762/23562 20571/26761/23561
+f 20571/26761/23561 27624/26762/23562 31398/26744/23544 28920/26743/23543
+f 20572/26763/23563 20576/26764/23564 20577/26765/23565 20573/26766/23566
+f 20573/26766/23566 20577/26765/23565 27555/26390/23198 27554/26386/23196
+f 20576/26764/23564 28922/26754/23554 28921/26753/23553 20577/26765/23565
+f 20577/26765/23565 28921/26753/23553 31375/26372/23184 27555/26390/23198
+f 20572/26763/23563 20573/26766/23566 20578/26767/23567 20574/26768/23568
+f 20574/26768/23568 20578/26767/23567 28924/26769/23569 28925/26770/23570
+f 20573/26766/23566 27554/26386/23196 27553/26385/23195 20578/26767/23567
+f 20578/26767/23567 27553/26385/23195 31376/26388/14475 28924/26769/23569
+f 20572/26763/23563 20574/26768/23568 20579/26771/23571 20575/26772/23572
+f 20575/26772/23572 20579/26771/23571 27625/26773/23573 27626/26774/23574
+f 20574/26768/23568 28925/26770/23570 28926/26775/23575 20579/26771/23571
+f 20579/26771/23571 28926/26775/23575 31400/26776/23576 27625/26773/23573
+f 20572/26763/23563 20575/26772/23572 20580/26777/23577 20576/26764/23564
+f 20576/26764/23564 20580/26777/23577 28923/26759/23559 28922/26754/23554
+f 20575/26772/23572 27626/26774/23574 27627/26778/23578 20580/26777/23577
+f 20580/26777/23577 27627/26778/23578 31399/26760/23560 28923/26759/23559
+f 20581/26779/23579 20585/26780/23580 20586/26781/23581 20582/26782/23582
+f 20582/26782/23582 20586/26781/23581 27558/26406/23214 27557/26402/23210
+f 20585/26780/23580 28925/26770/23570 28924/26769/23569 20586/26781/23581
+f 20586/26781/23581 28924/26769/23569 31376/26388/14475 27558/26406/23214
+f 20581/26779/23579 20582/26782/23582 20587/26783/23583 20583/26784/23584
+f 20583/26784/23584 20587/26783/23583 28927/26785/23585 28928/26786/23586
+f 20582/26782/23582 27557/26402/23210 27556/26401/23209 20587/26783/23583
+f 20587/26783/23583 27556/26401/23209 31377/26404/23212 28927/26785/23585
+f 20581/26779/23579 20583/26784/23584 20588/26787/23587 20584/26788/23588
+f 20584/26788/23588 20588/26787/23587 27628/26789/23589 27629/26790/23590
+f 20583/26784/23584 28928/26786/23586 28929/26791/23591 20588/26787/23587
+f 20588/26787/23587 28929/26791/23591 31401/26792/23592 27628/26789/23589
+f 20581/26779/23579 20584/26788/23588 20589/26793/23593 20585/26780/23580
+f 20585/26780/23580 20589/26793/23593 28926/26775/23575 28925/26770/23570
+f 20584/26788/23588 27629/26790/23590 27630/26794/23594 20589/26793/23593
+f 20589/26793/23593 27630/26794/23594 31400/26776/23576 28926/26775/23575
+f 20590/26795/23595 20594/26796/23596 20595/26797/23597 20591/26798/23598
+f 20591/26798/23598 20595/26797/23597 27561/26422/23230 27560/26418/23226
+f 20594/26796/23596 28928/26786/23586 28927/26785/23585 20595/26797/23597
+f 20595/26797/23597 28927/26785/23585 31377/26404/23212 27561/26422/23230
+f 20590/26795/23595 20591/26798/23598 20596/26799/23599 20592/26800/23600
+f 20592/26800/23600 20596/26799/23599 28930/26801/23601 28931/26802/23602
+f 20591/26798/23598 27560/26418/23226 27559/26417/23225 20596/26799/23599
+f 20596/26799/23599 27559/26417/23225 31378/26420/23228 28930/26801/23601
+f 20590/26795/23595 20592/26800/23600 20597/26803/23603 20593/26804/23604
+f 20593/26804/23604 20597/26803/23603 27631/26805/23605 27632/26806/23606
+f 20592/26800/23600 28931/26802/23602 28932/26807/23607 20597/26803/23603
+f 20597/26803/23603 28932/26807/23607 31402/26808/23608 27631/26805/23605
+f 20590/26795/23595 20593/26804/23604 20598/26809/23609 20594/26796/23596
+f 20594/26796/23596 20598/26809/23609 28929/26791/23591 28928/26786/23586
+f 20593/26804/23604 27632/26806/23606 27633/26810/23610 20598/26809/23609
+f 20598/26809/23609 27633/26810/23610 31401/26792/23592 28929/26791/23591
+f 20599/26811/23611 20603/26812/23612 20604/26813/23613 20600/26814/23614
+f 20600/26814/23614 20604/26813/23613 27564/26438/23246 27563/26434/23242
+f 20603/26812/23612 28931/26802/23602 28930/26801/23601 20604/26813/23613
+f 20604/26813/23613 28930/26801/23601 31378/26420/23228 27564/26438/23246
+f 20599/26811/23611 20600/26814/23614 20605/26815/23615 20601/26816/23616
+f 20601/26816/23616 20605/26815/23615 28933/26817/23617 28934/26818/23618
+f 20600/26814/23614 27563/26434/23242 27562/26433/23241 20605/26815/23615
+f 20605/26815/23615 27562/26433/23241 31379/26436/23244 28933/26817/23617
+f 20599/26811/23611 20601/26816/23616 20606/26819/23619 20602/26820/23620
+f 20602/26820/23620 20606/26819/23619 27634/26821/23621 27635/26822/23622
+f 20601/26816/23616 28934/26818/23618 28935/26823/23623 20606/26819/23619
+f 20606/26819/23619 28935/26823/23623 31403/26824/23624 27634/26821/23621
+f 20599/26811/23611 20602/26820/23620 20607/26825/23625 20603/26812/23612
+f 20603/26812/23612 20607/26825/23625 28932/26807/23607 28931/26802/23602
+f 20602/26820/23620 27635/26822/23622 27636/26826/23626 20607/26825/23625
+f 20607/26825/23625 27636/26826/23626 31402/26808/23608 28932/26807/23607
+f 20608/26827/23627 20612/26828/23628 20613/26829/23629 20609/26830/23630
+f 20609/26830/23630 20613/26829/23629 27567/26454/23262 27566/26450/23258
+f 20612/26828/23628 28934/26818/23618 28933/26817/23617 20613/26829/23629
+f 20613/26829/23629 28933/26817/23617 31379/26436/23244 27567/26454/23262
+f 20608/26827/23627 20609/26830/23630 20614/26831/23631 20610/26832/23632
+f 20610/26832/23632 20614/26831/23631 28936/26833/23633 28937/26834/23634
+f 20609/26830/23630 27566/26450/23258 27565/26449/23257 20614/26831/23631
+f 20614/26831/23631 27565/26449/23257 31380/26452/23260 28936/26833/23633
+f 20608/26827/23627 20610/26832/23632 20615/26835/23635 20611/26836/23636
+f 20611/26836/23636 20615/26835/23635 27637/26837/23637 27638/26838/23638
+f 20610/26832/23632 28937/26834/23634 28938/26839/23639 20615/26835/23635
+f 20615/26835/23635 28938/26839/23639 31404/26840/23640 27637/26837/23637
+f 20608/26827/23627 20611/26836/23636 20616/26841/23641 20612/26828/23628
+f 20612/26828/23628 20616/26841/23641 28935/26823/23623 28934/26818/23618
+f 20611/26836/23636 27638/26838/23638 27639/26842/23642 20616/26841/23641
+f 20616/26841/23641 27639/26842/23642 31403/26824/23624 28935/26823/23623
+f 20617/26843/23643 20621/26844/23644 20622/26845/23645 20618/26846/23646
+f 20618/26846/23646 20622/26845/23645 27570/26470/23278 27569/26466/23274
+f 20621/26844/23644 28937/26834/23634 28936/26833/23633 20622/26845/23645
+f 20622/26845/23645 28936/26833/23633 31380/26452/23260 27570/26470/23278
+f 20617/26843/23643 20618/26846/23646 20623/26847/23647 20619/26848/23648
+f 20619/26848/23648 20623/26847/23647 28939/26849/23649 28940/26850/23650
+f 20618/26846/23646 27569/26466/23274 27568/26465/23273 20623/26847/23647
+f 20623/26847/23647 27568/26465/23273 31381/26468/23276 28939/26849/23649
+f 20617/26843/23643 20619/26848/23648 20624/26851/23651 20620/26852/23652
+f 20620/26852/23652 20624/26851/23651 27640/26853/23653 27641/26854/23654
+f 20619/26848/23648 28940/26850/23650 28941/26855/23655 20624/26851/23651
+f 20624/26851/23651 28941/26855/23655 31405/26856/23656 27640/26853/23653
+f 20617/26843/23643 20620/26852/23652 20625/26857/23657 20621/26844/23644
+f 20621/26844/23644 20625/26857/23657 28938/26839/23639 28937/26834/23634
+f 20620/26852/23652 27641/26854/23654 27642/26858/23658 20625/26857/23657
+f 20625/26857/23657 27642/26858/23658 31404/26840/23640 28938/26839/23639
+f 20626/26859/23659 20630/26860/23660 20631/26861/23661 20627/26862/23662
+f 20627/26862/23662 20631/26861/23661 27573/26486/23294 27572/26482/23290
+f 20630/26860/23660 28940/26850/23650 28939/26849/23649 20631/26861/23661
+f 20631/26861/23661 28939/26849/23649 31381/26468/23276 27573/26486/23294
+f 20626/26859/23659 20627/26862/23662 20632/26863/23663 20628/26864/23664
+f 20628/26864/23664 20632/26863/23663 28942/26865/23665 28943/26866/23666
+f 20627/26862/23662 27572/26482/23290 27571/26481/23289 20632/26863/23663
+f 20632/26863/23663 27571/26481/23289 31382/26484/23292 28942/26865/23665
+f 20626/26859/23659 20628/26864/23664 20633/26867/23667 20629/26868/23668
+f 20629/26868/23668 20633/26867/23667 27643/26869/23669 27644/26870/23670
+f 20628/26864/23664 28943/26866/23666 28944/26871/23671 20633/26867/23667
+f 20633/26867/23667 28944/26871/23671 31406/26872/23672 27643/26869/23669
+f 20626/26859/23659 20629/26868/23668 20634/26873/23673 20630/26860/23660
+f 20630/26860/23660 20634/26873/23673 28941/26855/23655 28940/26850/23650
+f 20629/26868/23668 27644/26870/23670 27645/26874/23674 20634/26873/23673
+f 20634/26873/23673 27645/26874/23674 31405/26856/23656 28941/26855/23655
+f 20635/26875/23675 20639/26876/23676 20640/26877/23677 20636/26878/23678
+f 20636/26878/23678 20640/26877/23677 27576/26505/23310 27575/26500/23306
+f 20639/26876/23676 28943/26879/23666 28942/26880/23665 20640/26877/23677
+f 20640/26877/23677 28942/26880/23665 31382/26506/23292 27576/26505/23310
+f 20635/26875/23675 20636/26878/23678 20641/26881/23679 20637/26882/23680
+f 20637/26882/23680 20641/26881/23679 28945/26883/23681 28946/26884/23682
+f 20636/26878/23678 27575/26500/23306 27574/26499/23305 20641/26881/23679
+f 20641/26881/23679 27574/26499/23305 31383/26502/23308 28945/26883/23681
+f 20635/26875/23675 20637/26882/23680 20642/26885/23683 20638/26886/23684
+f 20638/26886/23684 20642/26885/23683 27646/26887/23685 27647/26888/23686
+f 20637/26882/23680 28946/26884/23682 28947/26889/23687 20642/26885/23683
+f 20642/26885/23683 28947/26889/23687 31407/26890/23688 27646/26887/23685
+f 20635/26875/23675 20638/26886/23684 20643/26891/23689 20639/26876/23676
+f 20639/26876/23676 20643/26891/23689 28944/26892/23671 28943/26879/23666
+f 20638/26886/23684 27647/26888/23686 27648/26893/23690 20643/26891/23689
+f 20643/26891/23689 27648/26893/23690 31406/26894/23672 28944/26892/23671
+f 20644/26895/23691 20648/26896/23692 20649/26897/23693 20645/26898/23694
+f 20645/26898/23694 20649/26897/23693 27579/26522/23326 27578/26518/23322
+f 20648/26896/23692 28946/26884/23682 28945/26883/23681 20649/26897/23693
+f 20649/26897/23693 28945/26883/23681 31383/26502/23308 27579/26522/23326
+f 20644/26895/23691 20645/26898/23694 20650/26899/23695 20646/26900/23696
+f 20646/26900/23696 20650/26899/23695 28948/26901/23697 28949/26902/23698
+f 20645/26898/23694 27578/26518/23322 27577/26517/23321 20650/26899/23695
+f 20650/26899/23695 27577/26517/23321 31384/26520/23324 28948/26901/23697
+f 20644/26895/23691 20646/26900/23696 20651/26903/23699 20647/26904/23700
+f 20647/26904/23700 20651/26903/23699 27649/26905/23701 27650/26906/23702
+f 20646/26900/23696 28949/26902/23698 28950/26907/23703 20651/26903/23699
+f 20651/26903/23699 28950/26907/23703 31408/26908/23704 27649/26905/23701
+f 20644/26895/23691 20647/26904/23700 20652/26909/23705 20648/26896/23692
+f 20648/26896/23692 20652/26909/23705 28947/26889/23687 28946/26884/23682
+f 20647/26904/23700 27650/26906/23702 27651/26910/23706 20652/26909/23705
+f 20652/26909/23705 27651/26910/23706 31407/26890/23688 28947/26889/23687
+f 20653/26911/23707 20657/26912/23708 20658/26913/23709 20654/26914/23710
+f 20654/26914/23710 20658/26913/23709 27582/26538/23342 27581/26534/23338
+f 20657/26912/23708 28949/26902/23698 28948/26901/23697 20658/26913/23709
+f 20658/26913/23709 28948/26901/23697 31384/26520/23324 27582/26538/23342
+f 20653/26911/23707 20654/26914/23710 20659/26915/23711 20655/26916/23712
+f 20655/26916/23712 20659/26915/23711 28951/26917/23713 28952/26918/23714
+f 20654/26914/23710 27581/26534/23338 27580/26533/23337 20659/26915/23711
+f 20659/26915/23711 27580/26533/23337 31385/26536/23340 28951/26917/23713
+f 20653/26911/23707 20655/26916/23712 20660/26919/23715 20656/26920/23716
+f 20656/26920/23716 20660/26919/23715 27652/26921/23717 27653/26922/23718
+f 20655/26916/23712 28952/26918/23714 28953/26923/23719 20660/26919/23715
+f 20660/26919/23715 28953/26923/23719 31409/26924/23720 27652/26921/23717
+f 20653/26911/23707 20656/26920/23716 20661/26925/23721 20657/26912/23708
+f 20657/26912/23708 20661/26925/23721 28950/26907/23703 28949/26902/23698
+f 20656/26920/23716 27653/26922/23718 27654/26926/23722 20661/26925/23721
+f 20661/26925/23721 27654/26926/23722 31408/26908/23704 28950/26907/23703
+f 20662/26927/23723 20666/26928/23724 20667/26929/23725 20663/26930/23726
+f 20663/26930/23726 20667/26929/23725 27585/26554/23358 27584/26550/23354
+f 20666/26928/23724 28952/26918/23714 28951/26917/23713 20667/26929/23725
+f 20667/26929/23725 28951/26917/23713 31385/26536/23340 27585/26554/23358
+f 20662/26927/23723 20663/26930/23726 20668/26931/23727 20664/26932/23728
+f 20664/26932/23728 20668/26931/23727 28954/26933/23729 28955/26934/23730
+f 20663/26930/23726 27584/26550/23354 27583/26549/23353 20668/26931/23727
+f 20668/26931/23727 27583/26549/23353 31386/26552/23356 28954/26933/23729
+f 20662/26927/23723 20664/26932/23728 20669/26935/23731 20665/26936/23732
+f 20665/26936/23732 20669/26935/23731 27655/26937/23733 27656/26938/23734
+f 20664/26932/23728 28955/26934/23730 28956/26939/23735 20669/26935/23731
+f 20669/26935/23731 28956/26939/23735 31410/26940/23736 27655/26937/23733
+f 20662/26927/23723 20665/26936/23732 20670/26941/23737 20666/26928/23724
+f 20666/26928/23724 20670/26941/23737 28953/26923/23719 28952/26918/23714
+f 20665/26936/23732 27656/26938/23734 27657/26942/23738 20670/26941/23737
+f 20670/26941/23737 27657/26942/23738 31409/26924/23720 28953/26923/23719
+f 20671/26943/23739 20675/26944/23740 20676/26945/23741 20672/26946/23742
+f 20672/26946/23742 20676/26945/23741 27588/26570/23374 27587/26566/23370
+f 20675/26944/23740 28955/26934/23730 28954/26933/23729 20676/26945/23741
+f 20676/26945/23741 28954/26933/23729 31386/26552/23356 27588/26570/23374
+f 20671/26943/23739 20672/26946/23742 20677/26947/23743 20673/26948/23744
+f 20673/26948/23744 20677/26947/23743 28957/26949/23745 28958/26950/23746
+f 20672/26946/23742 27587/26566/23370 27586/26565/23369 20677/26947/23743
+f 20677/26947/23743 27586/26565/23369 31387/26568/23372 28957/26949/23745
+f 20671/26943/23739 20673/26948/23744 20678/26951/23747 20674/26952/23748
+f 20674/26952/23748 20678/26951/23747 27658/26953/23749 27659/26954/23750
+f 20673/26948/23744 28958/26950/23746 28959/26955/23751 20678/26951/23747
+f 20678/26951/23747 28959/26955/23751 31411/26956/23752 27658/26953/23749
+f 20671/26943/23739 20674/26952/23748 20679/26957/23753 20675/26944/23740
+f 20675/26944/23740 20679/26957/23753 28956/26939/23735 28955/26934/23730
+f 20674/26952/23748 27659/26954/23750 27660/26958/23754 20679/26957/23753
+f 20679/26957/23753 27660/26958/23754 31410/26940/23736 28956/26939/23735
+f 20680/26959/23755 20684/26960/23756 20685/26961/23757 20681/26962/23758
+f 20681/26962/23758 20685/26961/23757 27591/26586/23386 27590/26582/23384
+f 20684/26960/23756 28958/26950/23746 28957/26949/23745 20685/26961/23757
+f 20685/26961/23757 28957/26949/23745 31387/26568/23372 27591/26586/23386
+f 20680/26959/23755 20681/26962/23758 20686/26963/23759 20682/26964/23760
+f 20682/26964/23760 20686/26963/23759 28960/26965/23761 28961/26966/23762
+f 20681/26962/23758 27590/26582/23384 27589/26581/23383 20686/26963/23759
+f 20686/26963/23759 27589/26581/23383 31388/26584/14283 28960/26965/23761
+f 20680/26959/23755 20682/26964/23760 20687/26967/23763 20683/26968/23764
+f 20683/26968/23764 20687/26967/23763 27661/26969/23765 27662/26970/23766
+f 20682/26964/23760 28961/26966/23762 28962/26971/23767 20687/26967/23763
+f 20687/26967/23763 28962/26971/23767 31412/26972/23768 27661/26969/23765
+f 20680/26959/23755 20683/26968/23764 20688/26973/23769 20684/26960/23756
+f 20684/26960/23756 20688/26973/23769 28959/26955/23751 28958/26950/23746
+f 20683/26968/23764 27662/26970/23766 27663/26974/23770 20688/26973/23769
+f 20688/26973/23769 27663/26974/23770 31411/26956/23752 28959/26955/23751
+f 20689/26975/23771 20693/26976/23772 20694/26977/23773 20690/26978/23774
+f 20690/26978/23774 20694/26977/23773 27594/26598/23398 27593/26596/23396
+f 20693/26976/23772 28961/26966/23762 28960/26965/23761 20694/26977/23773
+f 20694/26977/23773 28960/26965/23761 31388/26584/14283 27594/26598/23398
+f 20689/26975/23771 20690/26978/23774 20695/26979/23775 20691/26980/23776
+f 20691/26980/23776 20695/26979/23775 28893/26604/23404 28892/26603/23403
+f 20690/26978/23774 27593/26596/23396 27592/26595/23395 20695/26979/23775
+f 20695/26979/23775 27592/26595/23395 31365/26230/23042 28893/26604/23404
+f 20689/26975/23771 20691/26980/23776 20696/26981/23777 20692/26982/23778
+f 20692/26982/23778 20696/26981/23777 27664/26983/23779 27665/26984/23780
+f 20691/26980/23776 28892/26603/23403 28891/26616/23416 20696/26981/23777
+f 20696/26981/23777 28891/26616/23416 31389/26618/23418 27664/26983/23779
+f 20689/26975/23771 20692/26982/23778 20697/26985/23781 20693/26976/23772
+f 20693/26976/23772 20697/26985/23781 28962/26971/23767 28961/26966/23762
+f 20692/26982/23778 27665/26984/23780 27666/26986/23782 20697/26985/23781
+f 20697/26985/23781 27666/26986/23782 31412/26972/23768 28962/26971/23767
+f 20698/26987/23783 20702/26988/23784 20703/26989/23785 20699/26990/23786
+f 20699/26990/23786 20703/26989/23785 27597/26617/23417 27596/26612/23412
+f 20702/26988/23784 28964/26991/23787 28965/26992/23788 20703/26989/23785
+f 20703/26989/23785 28965/26992/23788 31389/26618/23418 27597/26617/23417
+f 20698/26987/23783 20699/26990/23786 20704/26993/23789 20700/26994/23790
+f 20700/26994/23790 20704/26993/23789 28966/26995/23791 28967/26996/23792
+f 20699/26990/23786 27596/26612/23412 27595/26611/23411 20704/26993/23789
+f 20704/26993/23789 27595/26611/23411 31390/26614/23414 28966/26995/23791
+f 20698/26987/23783 20700/26994/23790 20705/26997/23793 20701/26998/23794
+f 20701/26998/23794 20705/26997/23793 29680/26999/23795 29681/27000/23796
+f 20700/26994/23790 28967/26996/23792 28968/27001/23797 20705/26997/23793
+f 20705/26997/23793 28968/27001/23797 31580/27002/23798 29680/26999/23795
+f 20698/26987/23783 20701/26998/23794 20706/27003/23799 20702/26988/23784
+f 20702/26988/23784 20706/27003/23799 28963/27004/23800 28964/26991/23787
+f 20701/26998/23794 29681/27000/23796 29682/27005/23801 20706/27003/23799
+f 20706/27003/23799 29682/27005/23801 31557/27006/23802 28963/27004/23800
+f 20707/27007/23803 20711/27008/23804 20712/27009/23805 20708/27010/23806
+f 20708/27010/23806 20712/27009/23805 27600/26634/23434 27599/26630/23430
+f 20711/27008/23804 28967/26996/23792 28966/26995/23791 20712/27009/23805
+f 20712/27009/23805 28966/26995/23791 31390/26614/23414 27600/26634/23434
+f 20707/27007/23803 20708/27010/23806 20713/27011/23807 20709/27012/23808
+f 20709/27012/23808 20713/27011/23807 28969/27013/23809 28970/27014/23810
+f 20708/27010/23806 27599/26630/23430 27598/26629/23429 20713/27011/23807
+f 20713/27011/23807 27598/26629/23429 31391/26632/23432 28969/27013/23809
+f 20707/27007/23803 20709/27012/23808 20714/27015/23811 20710/27016/23812
+f 20710/27016/23812 20714/27015/23811 29677/27017/23813 29678/27018/23814
+f 20709/27012/23808 28970/27014/23810 28971/27019/23815 20714/27015/23811
+f 20714/27015/23811 28971/27019/23815 31579/27020/23816 29677/27017/23813
+f 20707/27007/23803 20710/27016/23812 20715/27021/23817 20711/27008/23804
+f 20711/27008/23804 20715/27021/23817 28968/27001/23797 28967/26996/23792
+f 20710/27016/23812 29678/27018/23814 29679/27022/23818 20715/27021/23817
+f 20715/27021/23817 29679/27022/23818 31580/27002/23798 28968/27001/23797
+f 20716/27023/23819 20720/27024/23820 20721/27025/23821 20717/27026/23822
+f 20717/27026/23822 20721/27025/23821 27603/26650/23450 27602/26646/23446
+f 20720/27024/23820 28970/27014/23810 28969/27013/23809 20721/27025/23821
+f 20721/27025/23821 28969/27013/23809 31391/26632/23432 27603/26650/23450
+f 20716/27023/23819 20717/27026/23822 20722/27027/23823 20718/27028/23824
+f 20718/27028/23824 20722/27027/23823 28972/27029/23825 28973/27030/23826
+f 20717/27026/23822 27602/26646/23446 27601/26645/23445 20722/27027/23823
+f 20722/27027/23823 27601/26645/23445 31392/26648/23448 28972/27029/23825
+f 20716/27023/23819 20718/27028/23824 20723/27031/23827 20719/27032/23828
+f 20719/27032/23828 20723/27031/23827 29671/27033/23829 29672/27034/23830
+f 20718/27028/23824 28973/27030/23826 28974/27035/23831 20723/27031/23827
+f 20723/27031/23827 28974/27035/23831 31578/27036/23832 29671/27033/23829
+f 20716/27023/23819 20719/27032/23828 20724/27037/23833 20720/27024/23820
+f 20720/27024/23820 20724/27037/23833 28971/27019/23815 28970/27014/23810
+f 20719/27032/23828 29672/27034/23830 29673/27038/23834 20724/27037/23833
+f 20724/27037/23833 29673/27038/23834 31579/27020/23816 28971/27019/23815
+f 20725/27039/23835 20729/27040/23836 20730/27041/23837 20726/27042/23838
+f 20726/27042/23838 20730/27041/23837 27606/26666/23466 27605/26662/23462
+f 20729/27040/23836 28973/27030/23826 28972/27029/23825 20730/27041/23837
+f 20730/27041/23837 28972/27029/23825 31392/26648/23448 27606/26666/23466
+f 20725/27039/23835 20726/27042/23838 20731/27043/23839 20727/27044/23840
+f 20727/27044/23840 20731/27043/23839 28975/27045/23841 28976/27046/23842
+f 20726/27042/23838 27605/26662/23462 27604/26661/23461 20731/27043/23839
+f 20731/27043/23839 27604/26661/23461 31393/26664/23464 28975/27045/23841
+f 20725/27039/23835 20727/27044/23840 20732/27047/23843 20728/27048/23844
+f 20728/27048/23844 20732/27047/23843 29665/27049/23845 29666/27050/23846
+f 20727/27044/23840 28976/27046/23842 28977/27051/23847 20732/27047/23843
+f 20732/27047/23843 28977/27051/23847 31577/27052/23848 29665/27049/23845
+f 20725/27039/23835 20728/27048/23844 20733/27053/23849 20729/27040/23836
+f 20729/27040/23836 20733/27053/23849 28974/27035/23831 28973/27030/23826
+f 20728/27048/23844 29666/27050/23846 29667/27054/23850 20733/27053/23849
+f 20733/27053/23849 29667/27054/23850 31578/27036/23832 28974/27035/23831
+f 20734/27055/23851 20738/27056/23852 20739/27057/23853 20735/27058/23854
+f 20735/27058/23854 20739/27057/23853 27609/26682/23482 27608/26678/23478
+f 20738/27056/23852 28976/27046/23842 28975/27045/23841 20739/27057/23853
+f 20739/27057/23853 28975/27045/23841 31393/26664/23464 27609/26682/23482
+f 20734/27055/23851 20735/27058/23854 20740/27059/23855 20736/27060/23856
+f 20736/27060/23856 20740/27059/23855 28978/27061/23857 28979/27062/23858
+f 20735/27058/23854 27608/26678/23478 27607/26677/23477 20740/27059/23855
+f 20740/27059/23855 27607/26677/23477 31394/26680/23480 28978/27061/23857
+f 20734/27055/23851 20736/27060/23856 20741/27063/23859 20737/27064/23860
+f 20737/27064/23860 20741/27063/23859 29659/27065/23861 29660/27066/23862
+f 20736/27060/23856 28979/27062/23858 28980/27067/23863 20741/27063/23859
+f 20741/27063/23859 28980/27067/23863 31576/27068/23864 29659/27065/23861
+f 20734/27055/23851 20737/27064/23860 20742/27069/23865 20738/27056/23852
+f 20738/27056/23852 20742/27069/23865 28977/27051/23847 28976/27046/23842
+f 20737/27064/23860 29660/27066/23862 29661/27070/23866 20742/27069/23865
+f 20742/27069/23865 29661/27070/23866 31577/27052/23848 28977/27051/23847
+f 20743/27071/23867 20747/27072/23868 20748/27073/23869 20744/27074/23870
+f 20744/27074/23870 20748/27073/23869 27612/26698/23498 27611/26694/23494
+f 20747/27072/23868 28979/27062/23858 28978/27061/23857 20748/27073/23869
+f 20748/27073/23869 28978/27061/23857 31394/26680/23480 27612/26698/23498
+f 20743/27071/23867 20744/27074/23870 20749/27075/23871 20745/27076/23872
+f 20745/27076/23872 20749/27075/23871 28981/27077/23873 28982/27078/23874
+f 20744/27074/23870 27611/26694/23494 27610/26693/23493 20749/27075/23871
+f 20749/27075/23871 27610/26693/23493 31395/26696/23496 28981/27077/23873
+f 20743/27071/23867 20745/27076/23872 20750/27079/23875 20746/27080/23876
+f 20746/27080/23876 20750/27079/23875 29653/27081/23877 29654/27082/23878
+f 20745/27076/23872 28982/27078/23874 28983/27083/23879 20750/27079/23875
+f 20750/27079/23875 28983/27083/23879 31575/27084/23880 29653/27081/23877
+f 20743/27071/23867 20746/27080/23876 20751/27085/23881 20747/27072/23868
+f 20747/27072/23868 20751/27085/23881 28980/27067/23863 28979/27062/23858
+f 20746/27080/23876 29654/27082/23878 29655/27086/23882 20751/27085/23881
+f 20751/27085/23881 29655/27086/23882 31576/27068/23864 28980/27067/23863
+f 20752/27087/23883 20756/27088/23884 20757/27089/23885 20753/27090/23886
+f 20753/27090/23886 20757/27089/23885 27615/26714/23514 27614/26710/23510
+f 20756/27088/23884 28982/27078/23874 28981/27077/23873 20757/27089/23885
+f 20757/27089/23885 28981/27077/23873 31395/26696/23496 27615/26714/23514
+f 20752/27087/23883 20753/27090/23886 20758/27091/23887 20754/27092/23888
+f 20754/27092/23888 20758/27091/23887 28984/27093/23889 28985/27094/23890
+f 20753/27090/23886 27614/26710/23510 27613/26709/23509 20758/27091/23887
+f 20758/27091/23887 27613/26709/23509 31396/26712/23512 28984/27093/23889
+f 20752/27087/23883 20754/27092/23888 20759/27095/23891 20755/27096/23892
+f 20755/27096/23892 20759/27095/23891 29647/27097/23893 29648/27098/23894
+f 20754/27092/23888 28985/27094/23890 28986/27099/23895 20759/27095/23891
+f 20759/27095/23891 28986/27099/23895 31574/27100/23896 29647/27097/23893
+f 20752/27087/23883 20755/27096/23892 20760/27101/23897 20756/27088/23884
+f 20756/27088/23884 20760/27101/23897 28983/27083/23879 28982/27078/23874
+f 20755/27096/23892 29648/27098/23894 29649/27102/23898 20760/27101/23897
+f 20760/27101/23897 29649/27102/23898 31575/27084/23880 28983/27083/23879
+f 20761/27103/23899 20765/27104/23900 20766/27105/23901 20762/27106/23902
+f 20762/27106/23902 20766/27105/23901 27618/26730/23530 27617/26726/23526
+f 20765/27104/23900 28985/27094/23890 28984/27093/23889 20766/27105/23901
+f 20766/27105/23901 28984/27093/23889 31396/26712/23512 27618/26730/23530
+f 20761/27103/23899 20762/27106/23902 20767/27107/23903 20763/27108/23904
+f 20763/27108/23904 20767/27107/23903 28987/27109/23905 28988/27110/23906
+f 20762/27106/23902 27617/26726/23526 27616/26725/23525 20767/27107/23903
+f 20767/27107/23903 27616/26725/23525 31397/26728/23528 28987/27109/23905
+f 20761/27103/23899 20763/27108/23904 20768/27111/23907 20764/27112/23908
+f 20764/27112/23908 20768/27111/23907 29641/27113/23909 29642/27114/23910
+f 20763/27108/23904 28988/27110/23906 28989/27115/23911 20768/27111/23907
+f 20768/27111/23907 28989/27115/23911 31573/27116/23912 29641/27113/23909
+f 20761/27103/23899 20764/27112/23908 20769/27117/23913 20765/27104/23900
+f 20765/27104/23900 20769/27117/23913 28986/27099/23895 28985/27094/23890
+f 20764/27112/23908 29642/27114/23910 29643/27118/23914 20769/27117/23913
+f 20769/27117/23913 29643/27118/23914 31574/27100/23896 28986/27099/23895
+f 20770/27119/23915 20774/27120/23916 20775/27121/23917 20771/27122/23918
+f 20771/27122/23918 20775/27121/23917 27621/26746/23546 27620/26742/23542
+f 20774/27120/23916 28988/27110/23906 28987/27109/23905 20775/27121/23917
+f 20775/27121/23917 28987/27109/23905 31397/26728/23528 27621/26746/23546
+f 20770/27119/23915 20771/27122/23918 20776/27123/23919 20772/27124/23920
+f 20772/27124/23920 20776/27123/23919 28990/27125/23921 28991/27126/23922
+f 20771/27122/23918 27620/26742/23542 27619/26741/23541 20776/27123/23919
+f 20776/27123/23919 27619/26741/23541 31398/26744/23544 28990/27125/23921
+f 20770/27119/23915 20772/27124/23920 20777/27127/23923 20773/27128/23924
+f 20773/27128/23924 20777/27127/23923 29635/27129/23925 29636/27130/23926
+f 20772/27124/23920 28991/27126/23922 28992/27131/23927 20777/27127/23923
+f 20777/27127/23923 28992/27131/23927 31572/27132/23928 29635/27129/23925
+f 20770/27119/23915 20773/27128/23924 20778/27133/23929 20774/27120/23916
+f 20774/27120/23916 20778/27133/23929 28989/27115/23911 28988/27110/23906
+f 20773/27128/23924 29636/27130/23926 29637/27134/23930 20778/27133/23929
+f 20778/27133/23929 29637/27134/23930 31573/27116/23912 28989/27115/23911
+f 20779/27135/23931 20783/27136/23932 20784/27137/23933 20780/27138/23934
+f 20780/27138/23934 20784/27137/23933 27624/26762/23562 27623/26758/23558
+f 20783/27136/23932 28991/27126/23922 28990/27125/23921 20784/27137/23933
+f 20784/27137/23933 28990/27125/23921 31398/26744/23544 27624/26762/23562
+f 20779/27135/23931 20780/27138/23934 20785/27139/23935 20781/27140/23936
+f 20781/27140/23936 20785/27139/23935 28993/27141/23937 28994/27142/23938
+f 20780/27138/23934 27623/26758/23558 27622/26757/23557 20785/27139/23935
+f 20785/27139/23935 27622/26757/23557 31399/26760/23560 28993/27141/23937
+f 20779/27135/23931 20781/27140/23936 20786/27143/23939 20782/27144/23940
+f 20782/27144/23940 20786/27143/23939 29629/27145/23941 29630/27146/23942
+f 20781/27140/23936 28994/27142/23938 28995/27147/23943 20786/27143/23939
+f 20786/27143/23939 28995/27147/23943 31571/27148/23944 29629/27145/23941
+f 20779/27135/23931 20782/27144/23940 20787/27149/23945 20783/27136/23932
+f 20783/27136/23932 20787/27149/23945 28992/27131/23927 28991/27126/23922
+f 20782/27144/23940 29630/27146/23942 29631/27150/23946 20787/27149/23945
+f 20787/27149/23945 29631/27150/23946 31572/27132/23928 28992/27131/23927
+f 20788/27151/23947 20792/27152/23948 20793/27153/23949 20789/27154/23950
+f 20789/27154/23950 20793/27153/23949 27627/26778/23578 27626/26774/23574
+f 20792/27152/23948 28994/27142/23938 28993/27141/23937 20793/27153/23949
+f 20793/27153/23949 28993/27141/23937 31399/26760/23560 27627/26778/23578
+f 20788/27151/23947 20789/27154/23950 20794/27155/23951 20790/27156/23952
+f 20790/27156/23952 20794/27155/23951 28996/27157/23953 28997/27158/23954
+f 20789/27154/23950 27626/26774/23574 27625/26773/23573 20794/27155/23951
+f 20794/27155/23951 27625/26773/23573 31400/26776/23576 28996/27157/23953
+f 20788/27151/23947 20790/27156/23952 20795/27159/23955 20791/27160/23956
+f 20791/27160/23956 20795/27159/23955 29623/27161/23957 29624/27162/23958
+f 20790/27156/23952 28997/27158/23954 28998/27163/23959 20795/27159/23955
+f 20795/27159/23955 28998/27163/23959 31570/27164/23960 29623/27161/23957
+f 20788/27151/23947 20791/27160/23956 20796/27165/23961 20792/27152/23948
+f 20792/27152/23948 20796/27165/23961 28995/27147/23943 28994/27142/23938
+f 20791/27160/23956 29624/27162/23958 29625/27166/23962 20796/27165/23961
+f 20796/27165/23961 29625/27166/23962 31571/27148/23944 28995/27147/23943
+f 20797/27167/23963 20801/27168/23964 20802/27169/23965 20798/27170/23966
+f 20798/27170/23966 20802/27169/23965 27630/26794/23594 27629/26790/23590
+f 20801/27168/23964 28997/27158/23954 28996/27157/23953 20802/27169/23965
+f 20802/27169/23965 28996/27157/23953 31400/26776/23576 27630/26794/23594
+f 20797/27167/23963 20798/27170/23966 20803/27171/23967 20799/27172/23968
+f 20799/27172/23968 20803/27171/23967 28999/27173/23969 29000/27174/23970
+f 20798/27170/23966 27629/26790/23590 27628/26789/23589 20803/27171/23967
+f 20803/27171/23967 27628/26789/23589 31401/26792/23592 28999/27173/23969
+f 20797/27167/23963 20799/27172/23968 20804/27175/23971 20800/27176/23972
+f 20800/27176/23972 20804/27175/23971 29617/27177/23973 29618/27178/23974
+f 20799/27172/23968 29000/27174/23970 29001/27179/23975 20804/27175/23971
+f 20804/27175/23971 29001/27179/23975 31569/27180/23976 29617/27177/23973
+f 20797/27167/23963 20800/27176/23972 20805/27181/23977 20801/27168/23964
+f 20801/27168/23964 20805/27181/23977 28998/27163/23959 28997/27158/23954
+f 20800/27176/23972 29618/27178/23974 29619/27182/23978 20805/27181/23977
+f 20805/27181/23977 29619/27182/23978 31570/27164/23960 28998/27163/23959
+f 20806/27183/23979 20810/27184/23980 20811/27185/23981 20807/27186/23982
+f 20807/27186/23982 20811/27185/23981 27633/26810/23610 27632/26806/23606
+f 20810/27184/23980 29000/27174/23970 28999/27173/23969 20811/27185/23981
+f 20811/27185/23981 28999/27173/23969 31401/26792/23592 27633/26810/23610
+f 20806/27183/23979 20807/27186/23982 20812/27187/23983 20808/27188/23984
+f 20808/27188/23984 20812/27187/23983 29002/27189/23985 29003/27190/23986
+f 20807/27186/23982 27632/26806/23606 27631/26805/23605 20812/27187/23983
+f 20812/27187/23983 27631/26805/23605 31402/26808/23608 29002/27189/23985
+f 20806/27183/23979 20808/27188/23984 20813/27191/23987 20809/27192/23988
+f 20809/27192/23988 20813/27191/23987 29611/27193/23989 29612/27194/23990
+f 20808/27188/23984 29003/27190/23986 29004/27195/23991 20813/27191/23987
+f 20813/27191/23987 29004/27195/23991 31568/27196/23992 29611/27193/23989
+f 20806/27183/23979 20809/27192/23988 20814/27197/23993 20810/27184/23980
+f 20810/27184/23980 20814/27197/23993 29001/27179/23975 29000/27174/23970
+f 20809/27192/23988 29612/27194/23990 29613/27198/23994 20814/27197/23993
+f 20814/27197/23993 29613/27198/23994 31569/27180/23976 29001/27179/23975
+f 20815/27199/23995 20819/27200/23996 20820/27201/23997 20816/27202/23998
+f 20816/27202/23998 20820/27201/23997 27636/26826/23626 27635/26822/23622
+f 20819/27200/23996 29003/27190/23986 29002/27189/23985 20820/27201/23997
+f 20820/27201/23997 29002/27189/23985 31402/26808/23608 27636/26826/23626
+f 20815/27199/23995 20816/27202/23998 20821/27203/23999 20817/27204/24000
+f 20817/27204/24000 20821/27203/23999 29005/27205/24001 29006/27206/24002
+f 20816/27202/23998 27635/26822/23622 27634/26821/23621 20821/27203/23999
+f 20821/27203/23999 27634/26821/23621 31403/26824/23624 29005/27205/24001
+f 20815/27199/23995 20817/27204/24000 20822/27207/24003 20818/27208/24004
+f 20818/27208/24004 20822/27207/24003 29605/27209/24005 29606/27210/24006
+f 20817/27204/24000 29006/27206/24002 29007/27211/24007 20822/27207/24003
+f 20822/27207/24003 29007/27211/24007 31567/27212/24008 29605/27209/24005
+f 20815/27199/23995 20818/27208/24004 20823/27213/24009 20819/27200/23996
+f 20819/27200/23996 20823/27213/24009 29004/27195/23991 29003/27190/23986
+f 20818/27208/24004 29606/27210/24006 29607/27214/24010 20823/27213/24009
+f 20823/27213/24009 29607/27214/24010 31568/27196/23992 29004/27195/23991
+f 20824/27215/24011 20828/27216/24012 20829/27217/24013 20825/27218/24014
+f 20825/27218/24014 20829/27217/24013 27639/26842/23642 27638/26838/23638
+f 20828/27216/24012 29006/27206/24002 29005/27205/24001 20829/27217/24013
+f 20829/27217/24013 29005/27205/24001 31403/26824/23624 27639/26842/23642
+f 20824/27215/24011 20825/27218/24014 20830/27219/24015 20826/27220/24016
+f 20826/27220/24016 20830/27219/24015 29008/27221/24017 29009/27222/24018
+f 20825/27218/24014 27638/26838/23638 27637/26837/23637 20830/27219/24015
+f 20830/27219/24015 27637/26837/23637 31404/26840/23640 29008/27221/24017
+f 20824/27215/24011 20826/27220/24016 20831/27223/24019 20827/27224/24020
+f 20827/27224/24020 20831/27223/24019 29599/27225/24021 29600/27226/24022
+f 20826/27220/24016 29009/27222/24018 29010/27227/24023 20831/27223/24019
+f 20831/27223/24019 29010/27227/24023 31566/27228/24024 29599/27225/24021
+f 20824/27215/24011 20827/27224/24020 20832/27229/24025 20828/27216/24012
+f 20828/27216/24012 20832/27229/24025 29007/27211/24007 29006/27206/24002
+f 20827/27224/24020 29600/27226/24022 29601/27230/24026 20832/27229/24025
+f 20832/27229/24025 29601/27230/24026 31567/27212/24008 29007/27211/24007
+f 20833/27231/24027 20837/27232/24028 20838/27233/24029 20834/27234/24030
+f 20834/27234/24030 20838/27233/24029 27642/26858/23658 27641/26854/23654
+f 20837/27232/24028 29009/27222/24018 29008/27221/24017 20838/27233/24029
+f 20838/27233/24029 29008/27221/24017 31404/26840/23640 27642/26858/23658
+f 20833/27231/24027 20834/27234/24030 20839/27235/24031 20835/27236/24032
+f 20835/27236/24032 20839/27235/24031 29011/27237/24033 29012/27238/24034
+f 20834/27234/24030 27641/26854/23654 27640/26853/23653 20839/27235/24031
+f 20839/27235/24031 27640/26853/23653 31405/26856/23656 29011/27237/24033
+f 20833/27231/24027 20835/27236/24032 20840/27239/24035 20836/27240/24036
+f 20836/27240/24036 20840/27239/24035 29593/27241/24037 29594/27242/24038
+f 20835/27236/24032 29012/27238/24034 29013/27243/24039 20840/27239/24035
+f 20840/27239/24035 29013/27243/24039 31565/27244/24040 29593/27241/24037
+f 20833/27231/24027 20836/27240/24036 20841/27245/24041 20837/27232/24028
+f 20837/27232/24028 20841/27245/24041 29010/27227/24023 29009/27222/24018
+f 20836/27240/24036 29594/27242/24038 29595/27246/24042 20841/27245/24041
+f 20841/27245/24041 29595/27246/24042 31566/27228/24024 29010/27227/24023
+f 20842/27247/24043 20846/27248/24044 20847/27249/24045 20843/27250/24046
+f 20843/27250/24046 20847/27249/24045 27645/26874/23674 27644/26870/23670
+f 20846/27248/24044 29012/27238/24034 29011/27237/24033 20847/27249/24045
+f 20847/27249/24045 29011/27237/24033 31405/26856/23656 27645/26874/23674
+f 20842/27247/24043 20843/27250/24046 20848/27251/24047 20844/27252/24048
+f 20844/27252/24048 20848/27251/24047 29014/27253/24049 29015/27254/24050
+f 20843/27250/24046 27644/26870/23670 27643/26869/23669 20848/27251/24047
+f 20848/27251/24047 27643/26869/23669 31406/26872/23672 29014/27253/24049
+f 20842/27247/24043 20844/27252/24048 20849/27255/24051 20845/27256/24052
+f 20845/27256/24052 20849/27255/24051 29587/27257/24053 29588/27258/24054
+f 20844/27252/24048 29015/27254/24050 29016/27259/24055 20849/27255/24051
+f 20849/27255/24051 29016/27259/24055 31564/27260/24056 29587/27257/24053
+f 20842/27247/24043 20845/27256/24052 20850/27261/24057 20846/27248/24044
+f 20846/27248/24044 20850/27261/24057 29013/27243/24039 29012/27238/24034
+f 20845/27256/24052 29588/27258/24054 29589/27262/24058 20850/27261/24057
+f 20850/27261/24057 29589/27262/24058 31565/27244/24040 29013/27243/24039
+f 20851/27263/24059 20855/27264/24060 20856/27265/24061 20852/27266/24062
+f 20852/27266/24062 20856/27265/24061 27648/26893/23690 27647/26888/23686
+f 20855/27264/24060 29015/27267/24050 29014/27268/24049 20856/27265/24061
+f 20856/27265/24061 29014/27268/24049 31406/26894/23672 27648/26893/23690
+f 20851/27263/24059 20852/27266/24062 20857/27269/24063 20853/27270/24064
+f 20853/27270/24064 20857/27269/24063 29017/27271/24065 29018/27272/24066
+f 20852/27266/24062 27647/26888/23686 27646/26887/23685 20857/27269/24063
+f 20857/27269/24063 27646/26887/23685 31407/26890/23688 29017/27271/24065
+f 20851/27263/24059 20853/27270/24064 20858/27273/24067 20854/27274/24068
+f 20854/27274/24068 20858/27273/24067 29581/27275/24069 29582/27276/24070
+f 20853/27270/24064 29018/27272/24066 29019/27277/24071 20858/27273/24067
+f 20858/27273/24067 29019/27277/24071 31563/27278/24072 29581/27275/24069
+f 20851/27263/24059 20854/27274/24068 20859/27279/24073 20855/27264/24060
+f 20855/27264/24060 20859/27279/24073 29016/27280/24055 29015/27267/24050
+f 20854/27274/24068 29582/27276/24070 29583/27281/24074 20859/27279/24073
+f 20859/27279/24073 29583/27281/24074 31564/27282/24056 29016/27280/24055
+f 20860/27283/24075 20864/27284/24076 20865/27285/24077 20861/27286/24078
+f 20861/27286/24078 20865/27285/24077 27651/26910/23706 27650/26906/23702
+f 20864/27284/24076 29018/27272/24066 29017/27271/24065 20865/27285/24077
+f 20865/27285/24077 29017/27271/24065 31407/26890/23688 27651/26910/23706
+f 20860/27283/24075 20861/27286/24078 20866/27287/24079 20862/27288/24080
+f 20862/27288/24080 20866/27287/24079 29020/27289/24081 29021/27290/24082
+f 20861/27286/24078 27650/26906/23702 27649/26905/23701 20866/27287/24079
+f 20866/27287/24079 27649/26905/23701 31408/26908/23704 29020/27289/24081
+f 20860/27283/24075 20862/27288/24080 20867/27291/24083 20863/27292/24084
+f 20863/27292/24084 20867/27291/24083 29575/27293/24085 29576/27294/24086
+f 20862/27288/24080 29021/27290/24082 29022/27295/24087 20867/27291/24083
+f 20867/27291/24083 29022/27295/24087 31562/27296/24088 29575/27293/24085
+f 20860/27283/24075 20863/27292/24084 20868/27297/24089 20864/27284/24076
+f 20864/27284/24076 20868/27297/24089 29019/27277/24071 29018/27272/24066
+f 20863/27292/24084 29576/27294/24086 29577/27298/24090 20868/27297/24089
+f 20868/27297/24089 29577/27298/24090 31563/27278/24072 29019/27277/24071
+f 20869/27299/24091 20873/27300/24092 20874/27301/24093 20870/27302/24094
+f 20870/27302/24094 20874/27301/24093 27654/26926/23722 27653/26922/23718
+f 20873/27300/24092 29021/27290/24082 29020/27289/24081 20874/27301/24093
+f 20874/27301/24093 29020/27289/24081 31408/26908/23704 27654/26926/23722
+f 20869/27299/24091 20870/27302/24094 20875/27303/24095 20871/27304/24096
+f 20871/27304/24096 20875/27303/24095 29023/27305/24097 29024/27306/24098
+f 20870/27302/24094 27653/26922/23718 27652/26921/23717 20875/27303/24095
+f 20875/27303/24095 27652/26921/23717 31409/26924/23720 29023/27305/24097
+f 20869/27299/24091 20871/27304/24096 20876/27307/24099 20872/27308/24100
+f 20872/27308/24100 20876/27307/24099 29569/27309/24101 29570/27310/24102
+f 20871/27304/24096 29024/27306/24098 29025/27311/24103 20876/27307/24099
+f 20876/27307/24099 29025/27311/24103 31561/27312/24104 29569/27309/24101
+f 20869/27299/24091 20872/27308/24100 20877/27313/24105 20873/27300/24092
+f 20873/27300/24092 20877/27313/24105 29022/27295/24087 29021/27290/24082
+f 20872/27308/24100 29570/27310/24102 29571/27314/24106 20877/27313/24105
+f 20877/27313/24105 29571/27314/24106 31562/27296/24088 29022/27295/24087
+f 20878/27315/24107 20882/27316/24108 20883/27317/24109 20879/27318/24110
+f 20879/27318/24110 20883/27317/24109 27657/26942/23738 27656/26938/23734
+f 20882/27316/24108 29024/27306/24098 29023/27305/24097 20883/27317/24109
+f 20883/27317/24109 29023/27305/24097 31409/26924/23720 27657/26942/23738
+f 20878/27315/24107 20879/27318/24110 20884/27319/24111 20880/27320/24112
+f 20880/27320/24112 20884/27319/24111 29026/27321/24113 29027/27322/24114
+f 20879/27318/24110 27656/26938/23734 27655/26937/23733 20884/27319/24111
+f 20884/27319/24111 27655/26937/23733 31410/26940/23736 29026/27321/24113
+f 20878/27315/24107 20880/27320/24112 20885/27323/24115 20881/27324/24116
+f 20881/27324/24116 20885/27323/24115 29563/27325/24117 29564/27326/24118
+f 20880/27320/24112 29027/27322/24114 29028/27327/24119 20885/27323/24115
+f 20885/27323/24115 29028/27327/24119 31560/27328/24120 29563/27325/24117
+f 20878/27315/24107 20881/27324/24116 20886/27329/24121 20882/27316/24108
+f 20882/27316/24108 20886/27329/24121 29025/27311/24103 29024/27306/24098
+f 20881/27324/24116 29564/27326/24118 29565/27330/24122 20886/27329/24121
+f 20886/27329/24121 29565/27330/24122 31561/27312/24104 29025/27311/24103
+f 20887/27331/24123 20891/27332/24124 20892/27333/24125 20888/27334/24126
+f 20888/27334/24126 20892/27333/24125 27660/26958/23754 27659/26954/23750
+f 20891/27332/24124 29027/27322/24114 29026/27321/24113 20892/27333/24125
+f 20892/27333/24125 29026/27321/24113 31410/26940/23736 27660/26958/23754
+f 20887/27331/24123 20888/27334/24126 20893/27335/24127 20889/27336/24128
+f 20889/27336/24128 20893/27335/24127 29029/27337/24129 29030/27338/24130
+f 20888/27334/24126 27659/26954/23750 27658/26953/23749 20893/27335/24127
+f 20893/27335/24127 27658/26953/23749 31411/26956/23752 29029/27337/24129
+f 20887/27331/24123 20889/27336/24128 20894/27339/24131 20890/27340/24132
+f 20890/27340/24132 20894/27339/24131 29557/27341/24133 29558/27342/24134
+f 20889/27336/24128 29030/27338/24130 29031/27343/24135 20894/27339/24131
+f 20894/27339/24131 29031/27343/24135 31559/27344/24136 29557/27341/24133
+f 20887/27331/24123 20890/27340/24132 20895/27345/24137 20891/27332/24124
+f 20891/27332/24124 20895/27345/24137 29028/27327/24119 29027/27322/24114
+f 20890/27340/24132 29558/27342/24134 29559/27346/24138 20895/27345/24137
+f 20895/27345/24137 29559/27346/24138 31560/27328/24120 29028/27327/24119
+f 20896/27347/24139 20900/27348/24140 20901/27349/24141 20897/27350/24142
+f 20897/27350/24142 20901/27349/24141 27663/26974/23770 27662/26970/23766
+f 20900/27348/24140 29030/27338/24130 29029/27337/24129 20901/27349/24141
+f 20901/27349/24141 29029/27337/24129 31411/26956/23752 27663/26974/23770
+f 20896/27347/24139 20897/27350/24142 20902/27351/24143 20898/27352/24144
+f 20898/27352/24144 20902/27351/24143 29032/27353/24145 29033/27354/24146
+f 20897/27350/24142 27662/26970/23766 27661/26969/23765 20902/27351/24143
+f 20902/27351/24143 27661/26969/23765 31412/26972/23768 29032/27353/24145
+f 20896/27347/24139 20898/27352/24144 20903/27355/24147 20899/27356/24148
+f 20899/27356/24148 20903/27355/24147 29551/27357/24149 29552/27358/24150
+f 20898/27352/24144 29033/27354/24146 29034/27359/24151 20903/27355/24147
+f 20903/27355/24147 29034/27359/24151 31558/27360/24152 29551/27357/24149
+f 20896/27347/24139 20899/27356/24148 20904/27361/24153 20900/27348/24140
+f 20900/27348/24140 20904/27361/24153 29031/27343/24135 29030/27338/24130
+f 20899/27356/24148 29552/27358/24150 29553/27362/24154 20904/27361/24153
+f 20904/27361/24153 29553/27362/24154 31559/27344/24136 29031/27343/24135
+f 20905/27363/24155 20909/27364/24156 20910/27365/24157 20906/27366/24158
+f 20906/27366/24158 20910/27365/24157 27666/26986/23782 27665/26984/23780
+f 20909/27364/24156 29033/27354/24146 29032/27353/24145 20910/27365/24157
+f 20910/27365/24157 29032/27353/24145 31412/26972/23768 27666/26986/23782
+f 20905/27363/24155 20906/27366/24158 20911/27367/24159 20907/27368/24160
+f 20907/27368/24160 20911/27367/24159 28965/26992/23788 28964/26991/23787
+f 20906/27366/24158 27665/26984/23780 27664/26983/23779 20911/27367/24159
+f 20911/27367/24159 27664/26983/23779 31389/26618/23418 28965/26992/23788
+f 20905/27363/24155 20907/27368/24160 20912/27369/24161 20908/27370/24162
+f 20908/27370/24162 20912/27369/24161 29545/27371/24163 29546/27372/24164
+f 20907/27368/24160 28964/26991/23787 28963/27004/23800 20912/27369/24161
+f 20912/27369/24161 28963/27004/23800 31557/27006/23802 29545/27371/24163
+f 20905/27363/24155 20908/27370/24162 20913/27373/24165 20909/27364/24156
+f 20909/27364/24156 20913/27373/24165 29034/27359/24151 29033/27354/24146
+f 20908/27370/24162 29546/27372/24164 29547/27374/24166 20913/27373/24165
+f 20913/27373/24165 29547/27374/24166 31558/27360/24152 29034/27359/24151
+f 20914/27375/24167 20918/27376/24168 20919/27377/24169 20915/27378/24170
+f 20915/27378/24170 20919/27377/24169 29824/27379/24171 29825/27380/24172
+f 20918/27376/24168 29819/27381/24173 29820/27382/24174 20919/27377/24169
+f 20919/27377/24169 29820/27382/24174 31604/27383/24175 29824/27379/24171
+f 20914/27375/24167 20915/27378/24170 20920/27384/24176 20916/27385/24177
+f 20916/27385/24177 20920/27384/24176 29683/27386/24178 29684/27387/24179
+f 20915/27378/24170 29825/27380/24172 29826/27388/24180 20920/27384/24176
+f 20920/27384/24176 29826/27388/24180 31581/27389/24181 29683/27386/24178
+f 20914/27375/24167 20916/27385/24177 20921/27390/24182 20917/27391/24183
+f 20917/27391/24183 20921/27390/24182 27739/27392/24184 27740/27393/24185
+f 20916/27385/24177 29684/27387/24179 29685/27394/24186 20921/27390/24182
+f 20921/27390/24182 29685/27394/24186 31438/27395/24187 27739/27392/24184
+f 20914/27375/24167 20917/27391/24183 20922/27396/24188 20918/27376/24168
+f 20918/27376/24168 20922/27396/24188 29818/27397/24189 29819/27381/24173
+f 20917/27391/24183 27740/27393/24185 27741/27398/24190 20922/27396/24188
+f 20922/27396/24188 27741/27398/24190 31437/27399/24191 29818/27397/24189
+f 20923/27400/24192 20927/27401/24193 20928/27402/24194 20924/27403/24195
+f 20924/27403/24195 20928/27402/24194 29689/27404/24196 29690/27405/24197
+f 20927/27401/24193 29684/27387/24179 29683/27386/24178 20928/27402/24194
+f 20928/27402/24194 29683/27386/24178 31581/27389/24181 29689/27404/24196
+f 20923/27400/24192 20924/27403/24195 20929/27406/24198 20925/27407/24199
+f 20925/27407/24199 20929/27406/24198 29686/27408/24200 29687/27409/24201
+f 20924/27403/24195 29690/27405/24197 29691/27410/24202 20929/27406/24198
+f 20929/27406/24198 29691/27410/24202 31582/27411/24203 29686/27408/24200
+f 20923/27400/24192 20925/27407/24199 20930/27412/24204 20926/27413/24205
+f 20926/27413/24205 20930/27412/24204 27742/27414/24206 27743/27415/24207
+f 20925/27407/24199 29687/27409/24201 29688/27416/24208 20930/27412/24204
+f 20930/27412/24204 29688/27416/24208 31439/27417/24209 27742/27414/24206
+f 20923/27400/24192 20926/27413/24205 20931/27418/24210 20927/27401/24193
+f 20927/27401/24193 20931/27418/24210 29685/27394/24186 29684/27387/24179
+f 20926/27413/24205 27743/27415/24207 27744/27419/24211 20931/27418/24210
+f 20931/27418/24210 27744/27419/24211 31438/27395/24187 29685/27394/24186
+f 20932/27420/24212 20936/27421/24213 20937/27422/24214 20933/27423/24215
+f 20933/27423/24215 20937/27422/24214 29695/27424/24216 29696/27425/24217
+f 20936/27421/24213 29687/27409/24201 29686/27408/24200 20937/27422/24214
+f 20937/27422/24214 29686/27408/24200 31582/27411/24203 29695/27424/24216
+f 20932/27420/24212 20933/27423/24215 20938/27426/24218 20934/27427/24219
+f 20934/27427/24219 20938/27426/24218 29692/27428/24220 29693/27429/24221
+f 20933/27423/24215 29696/27425/24217 29697/27430/24222 20938/27426/24218
+f 20938/27426/24218 29697/27430/24222 31583/27431/24223 29692/27428/24220
+f 20932/27420/24212 20934/27427/24219 20939/27432/24224 20935/27433/24225
+f 20935/27433/24225 20939/27432/24224 27745/27434/24226 27746/27435/24227
+f 20934/27427/24219 29693/27429/24221 29694/27436/24228 20939/27432/24224
+f 20939/27432/24224 29694/27436/24228 31440/27437/24229 27745/27434/24226
+f 20932/27420/24212 20935/27433/24225 20940/27438/24230 20936/27421/24213
+f 20936/27421/24213 20940/27438/24230 29688/27416/24208 29687/27409/24201
+f 20935/27433/24225 27746/27435/24227 27747/27439/24231 20940/27438/24230
+f 20940/27438/24230 27747/27439/24231 31439/27417/24209 29688/27416/24208
+f 20941/27440/24232 20945/27441/24233 20946/27442/24234 20942/27443/24235
+f 20942/27443/24235 20946/27442/24234 29701/27444/24236 29702/27445/24237
+f 20945/27441/24233 29693/27429/24221 29692/27428/24220 20946/27442/24234
+f 20946/27442/24234 29692/27428/24220 31583/27431/24223 29701/27444/24236
+f 20941/27440/24232 20942/27443/24235 20947/27446/24238 20943/27447/24239
+f 20943/27447/24239 20947/27446/24238 29698/27448/24240 29699/27449/24241
+f 20942/27443/24235 29702/27445/24237 29703/27450/24242 20947/27446/24238
+f 20947/27446/24238 29703/27450/24242 31584/27451/24243 29698/27448/24240
+f 20941/27440/24232 20943/27447/24239 20948/27452/24244 20944/27453/24245
+f 20944/27453/24245 20948/27452/24244 27748/27454/24246 27749/27455/24247
+f 20943/27447/24239 29699/27449/24241 29700/27456/24248 20948/27452/24244
+f 20948/27452/24244 29700/27456/24248 31441/27457/24249 27748/27454/24246
+f 20941/27440/24232 20944/27453/24245 20949/27458/24250 20945/27441/24233
+f 20945/27441/24233 20949/27458/24250 29694/27436/24228 29693/27429/24221
+f 20944/27453/24245 27749/27455/24247 27750/27459/24251 20949/27458/24250
+f 20949/27458/24250 27750/27459/24251 31440/27437/24229 29694/27436/24228
+f 20950/27460/24252 20954/27461/24253 20955/27462/24254 20951/27463/24255
+f 20951/27463/24255 20955/27462/24254 29707/27464/24256 29708/27465/24257
+f 20954/27461/24253 29699/27449/24241 29698/27448/24240 20955/27462/24254
+f 20955/27462/24254 29698/27448/24240 31584/27451/24243 29707/27464/24256
+f 20950/27460/24252 20951/27463/24255 20956/27466/24258 20952/27467/24259
+f 20952/27467/24259 20956/27466/24258 29704/27468/24260 29705/27469/24261
+f 20951/27463/24255 29708/27465/24257 29709/27470/24262 20956/27466/24258
+f 20956/27466/24258 29709/27470/24262 31585/27471/24263 29704/27468/24260
+f 20950/27460/24252 20952/27467/24259 20957/27472/24264 20953/27473/24265
+f 20953/27473/24265 20957/27472/24264 27751/27474/24266 27752/27475/24267
+f 20952/27467/24259 29705/27469/24261 29706/27476/24268 20957/27472/24264
+f 20957/27472/24264 29706/27476/24268 31442/27477/24269 27751/27474/24266
+f 20950/27460/24252 20953/27473/24265 20958/27478/24270 20954/27461/24253
+f 20954/27461/24253 20958/27478/24270 29700/27456/24248 29699/27449/24241
+f 20953/27473/24265 27752/27475/24267 27753/27479/24271 20958/27478/24270
+f 20958/27478/24270 27753/27479/24271 31441/27457/24249 29700/27456/24248
+f 20959/27480/24272 20963/27481/24273 20964/27482/24274 20960/27483/24275
+f 20960/27483/24275 20964/27482/24274 29713/27484/24276 29714/27485/24277
+f 20963/27481/24273 29705/27469/24261 29704/27468/24260 20964/27482/24274
+f 20964/27482/24274 29704/27468/24260 31585/27471/24263 29713/27484/24276
+f 20959/27480/24272 20960/27483/24275 20965/27486/24278 20961/27487/24279
+f 20961/27487/24279 20965/27486/24278 29710/27488/24280 29711/27489/24281
+f 20960/27483/24275 29714/27485/24277 29715/27490/24282 20965/27486/24278
+f 20965/27486/24278 29715/27490/24282 31586/27491/24283 29710/27488/24280
+f 20959/27480/24272 20961/27487/24279 20966/27492/24284 20962/27493/24285
+f 20962/27493/24285 20966/27492/24284 27754/27494/24286 27755/27495/24287
+f 20961/27487/24279 29711/27489/24281 29712/27496/24288 20966/27492/24284
+f 20966/27492/24284 29712/27496/24288 31443/27497/24289 27754/27494/24286
+f 20959/27480/24272 20962/27493/24285 20967/27498/24290 20963/27481/24273
+f 20963/27481/24273 20967/27498/24290 29706/27476/24268 29705/27469/24261
+f 20962/27493/24285 27755/27495/24287 27756/27499/24291 20967/27498/24290
+f 20967/27498/24290 27756/27499/24291 31442/27477/24269 29706/27476/24268
+f 20968/27500/24292 20972/27501/24293 20973/27502/24294 20969/27503/24295
+f 20969/27503/24295 20973/27502/24294 29719/27504/24296 29720/27505/24297
+f 20972/27501/24293 29711/27489/24281 29710/27488/24280 20973/27502/24294
+f 20973/27502/24294 29710/27488/24280 31586/27491/24283 29719/27504/24296
+f 20968/27500/24292 20969/27503/24295 20974/27506/24298 20970/27507/24299
+f 20970/27507/24299 20974/27506/24298 29716/27508/24300 29717/27509/24301
+f 20969/27503/24295 29720/27505/24297 29721/27510/24302 20974/27506/24298
+f 20974/27506/24298 29721/27510/24302 31587/27511/24303 29716/27508/24300
+f 20968/27500/24292 20970/27507/24299 20975/27512/24304 20971/27513/24305
+f 20971/27513/24305 20975/27512/24304 27757/27514/24306 27758/27515/24307
+f 20970/27507/24299 29717/27509/24301 29718/27516/24308 20975/27512/24304
+f 20975/27512/24304 29718/27516/24308 31444/27517/24309 27757/27514/24306
+f 20968/27500/24292 20971/27513/24305 20976/27518/24310 20972/27501/24293
+f 20972/27501/24293 20976/27518/24310 29712/27496/24288 29711/27489/24281
+f 20971/27513/24305 27758/27515/24307 27759/27519/24311 20976/27518/24310
+f 20976/27518/24310 27759/27519/24311 31443/27497/24289 29712/27496/24288
+f 20977/27520/24312 20981/27521/24313 20982/27522/24314 20978/27523/24315
+f 20978/27523/24315 20982/27522/24314 29725/27524/24316 29726/27525/24317
+f 20981/27521/24313 29717/27509/24301 29716/27508/24300 20982/27522/24314
+f 20982/27522/24314 29716/27508/24300 31587/27511/24303 29725/27524/24316
+f 20977/27520/24312 20978/27523/24315 20983/27526/24318 20979/27527/24319
+f 20979/27527/24319 20983/27526/24318 29722/27528/24320 29723/27529/24321
+f 20978/27523/24315 29726/27525/24317 29727/27530/24322 20983/27526/24318
+f 20983/27526/24318 29727/27530/24322 31588/27531/24323 29722/27528/24320
+f 20977/27520/24312 20979/27527/24319 20984/27532/24324 20980/27533/24325
+f 20980/27533/24325 20984/27532/24324 27760/27534/24326 27761/27535/24327
+f 20979/27527/24319 29723/27529/24321 29724/27536/24328 20984/27532/24324
+f 20984/27532/24324 29724/27536/24328 31445/27537/24329 27760/27534/24326
+f 20977/27520/24312 20980/27533/24325 20985/27538/24330 20981/27521/24313
+f 20981/27521/24313 20985/27538/24330 29718/27516/24308 29717/27509/24301
+f 20980/27533/24325 27761/27535/24327 27762/27539/24331 20985/27538/24330
+f 20985/27538/24330 27762/27539/24331 31444/27517/24309 29718/27516/24308
+f 20986/27540/24332 20990/27541/24333 20991/27542/24334 20987/27543/24335
+f 20987/27543/24335 20991/27542/24334 29731/27544/24336 29732/27545/24337
+f 20990/27541/24333 29723/27529/24321 29722/27528/24320 20991/27542/24334
+f 20991/27542/24334 29722/27528/24320 31588/27531/24323 29731/27544/24336
+f 20986/27540/24332 20987/27543/24335 20992/27546/24338 20988/27547/24339
+f 20988/27547/24339 20992/27546/24338 29728/27548/24340 29729/27549/24341
+f 20987/27543/24335 29732/27545/24337 29733/27550/24342 20992/27546/24338
+f 20992/27546/24338 29733/27550/24342 31589/27551/24343 29728/27548/24340
+f 20986/27540/24332 20988/27547/24339 20993/27552/24344 20989/27553/24345
+f 20989/27553/24345 20993/27552/24344 27763/27554/24346 27764/27555/24347
+f 20988/27547/24339 29729/27549/24341 29730/27556/24348 20993/27552/24344
+f 20993/27552/24344 29730/27556/24348 31446/27557/24349 27763/27554/24346
+f 20986/27540/24332 20989/27553/24345 20994/27558/24350 20990/27541/24333
+f 20990/27541/24333 20994/27558/24350 29724/27536/24328 29723/27529/24321
+f 20989/27553/24345 27764/27555/24347 27765/27559/24351 20994/27558/24350
+f 20994/27558/24350 27765/27559/24351 31445/27537/24329 29724/27536/24328
+f 20995/27560/24352 20999/27561/24353 21000/27562/24354 20996/27563/24355
+f 20996/27563/24355 21000/27562/24354 29737/27564/24356 29738/27565/24357
+f 20999/27561/24353 29729/27549/24341 29728/27548/24340 21000/27562/24354
+f 21000/27562/24354 29728/27548/24340 31589/27551/24343 29737/27564/24356
+f 20995/27560/24352 20996/27563/24355 21001/27566/24358 20997/27567/24359
+f 20997/27567/24359 21001/27566/24358 29734/27568/24360 29735/27569/24361
+f 20996/27563/24355 29738/27565/24357 29739/27570/24362 21001/27566/24358
+f 21001/27566/24358 29739/27570/24362 31590/27571/24363 29734/27568/24360
+f 20995/27560/24352 20997/27567/24359 21002/27572/24364 20998/27573/24365
+f 20998/27573/24365 21002/27572/24364 27766/27574/24366 27767/27575/24367
+f 20997/27567/24359 29735/27569/24361 29736/27576/24368 21002/27572/24364
+f 21002/27572/24364 29736/27576/24368 31447/27577/24369 27766/27574/24366
+f 20995/27560/24352 20998/27573/24365 21003/27578/24370 20999/27561/24353
+f 20999/27561/24353 21003/27578/24370 29730/27556/24348 29729/27549/24341
+f 20998/27573/24365 27767/27575/24367 27768/27579/24371 21003/27578/24370
+f 21003/27578/24370 27768/27579/24371 31446/27557/24349 29730/27556/24348
+f 21004/27580/24372 21008/27581/24373 21009/27582/24374 21005/27583/24375
+f 21005/27583/24375 21009/27582/24374 29743/27584/24376 29744/27585/24377
+f 21008/27581/24373 29735/27569/24361 29734/27568/24360 21009/27582/24374
+f 21009/27582/24374 29734/27568/24360 31590/27571/24363 29743/27584/24376
+f 21004/27580/24372 21005/27583/24375 21010/27586/24378 21006/27587/24379
+f 21006/27587/24379 21010/27586/24378 29740/27588/24380 29741/27589/24381
+f 21005/27583/24375 29744/27585/24377 29745/27590/24382 21010/27586/24378
+f 21010/27586/24378 29745/27590/24382 31591/27591/24383 29740/27588/24380
+f 21004/27580/24372 21006/27587/24379 21011/27592/24384 21007/27593/24385
+f 21007/27593/24385 21011/27592/24384 27769/27594/24386 27770/27595/24387
+f 21006/27587/24379 29741/27589/24381 29742/27596/24388 21011/27592/24384
+f 21011/27592/24384 29742/27596/24388 31448/27597/24389 27769/27594/24386
+f 21004/27580/24372 21007/27593/24385 21012/27598/24390 21008/27581/24373
+f 21008/27581/24373 21012/27598/24390 29736/27576/24368 29735/27569/24361
+f 21007/27593/24385 27770/27595/24387 27771/27599/24391 21012/27598/24390
+f 21012/27598/24390 27771/27599/24391 31447/27577/24369 29736/27576/24368
+f 21013/27600/24392 21017/27601/24393 21018/27602/24394 21014/27603/24395
+f 21014/27603/24395 21018/27602/24394 29749/27604/24396 29750/27605/24397
+f 21017/27601/24393 29741/27589/24381 29740/27588/24380 21018/27602/24394
+f 21018/27602/24394 29740/27588/24380 31591/27591/24383 29749/27604/24396
+f 21013/27600/24392 21014/27603/24395 21019/27606/24398 21015/27607/24399
+f 21015/27607/24399 21019/27606/24398 29746/27608/24400 29747/27609/24401
+f 21014/27603/24395 29750/27605/24397 29751/27610/24402 21019/27606/24398
+f 21019/27606/24398 29751/27610/24402 31592/27611/24403 29746/27608/24400
+f 21013/27600/24392 21015/27607/24399 21020/27612/24404 21016/27613/24405
+f 21016/27613/24405 21020/27612/24404 27772/27614/24406 27773/27615/24407
+f 21015/27607/24399 29747/27609/24401 29748/27616/24408 21020/27612/24404
+f 21020/27612/24404 29748/27616/24408 31449/27617/24409 27772/27614/24406
+f 21013/27600/24392 21016/27613/24405 21021/27618/24410 21017/27601/24393
+f 21017/27601/24393 21021/27618/24410 29742/27596/24388 29741/27589/24381
+f 21016/27613/24405 27773/27615/24407 27774/27619/24411 21021/27618/24410
+f 21021/27618/24410 27774/27619/24411 31448/27597/24389 29742/27596/24388
+f 21022/27620/24412 21026/27621/24413 21027/27622/24414 21023/27623/24415
+f 21023/27623/24415 21027/27622/24414 29755/27624/24416 29756/27625/24417
+f 21026/27621/24413 29747/27609/24401 29746/27608/24400 21027/27622/24414
+f 21027/27622/24414 29746/27608/24400 31592/27611/24403 29755/27624/24416
+f 21022/27620/24412 21023/27623/24415 21028/27626/24418 21024/27627/24419
+f 21024/27627/24419 21028/27626/24418 29752/27628/24420 29753/27629/24421
+f 21023/27623/24415 29756/27625/24417 29757/27630/24422 21028/27626/24418
+f 21028/27626/24418 29757/27630/24422 31593/27631/24423 29752/27628/24420
+f 21022/27620/24412 21024/27627/24419 21029/27632/24424 21025/27633/24425
+f 21025/27633/24425 21029/27632/24424 27775/27634/24426 27776/27635/24427
+f 21024/27627/24419 29753/27629/24421 29754/27636/24428 21029/27632/24424
+f 21029/27632/24424 29754/27636/24428 31450/27637/24429 27775/27634/24426
+f 21022/27620/24412 21025/27633/24425 21030/27638/24430 21026/27621/24413
+f 21026/27621/24413 21030/27638/24430 29748/27616/24408 29747/27609/24401
+f 21025/27633/24425 27776/27635/24427 27777/27639/24431 21030/27638/24430
+f 21030/27638/24430 27777/27639/24431 31449/27617/24409 29748/27616/24408
+f 21031/27640/24432 21035/27641/24433 21036/27642/24434 21032/27643/24435
+f 21032/27643/24435 21036/27642/24434 29761/27644/24436 29762/27645/24437
+f 21035/27641/24433 29753/27629/24421 29752/27628/24420 21036/27642/24434
+f 21036/27642/24434 29752/27628/24420 31593/27631/24423 29761/27644/24436
+f 21031/27640/24432 21032/27643/24435 21037/27646/24438 21033/27647/24439
+f 21033/27647/24439 21037/27646/24438 29758/27648/24440 29759/27649/24441
+f 21032/27643/24435 29762/27645/24437 29763/27650/24442 21037/27646/24438
+f 21037/27646/24438 29763/27650/24442 31594/27651/24443 29758/27648/24440
+f 21031/27640/24432 21033/27647/24439 21038/27652/24444 21034/27653/24445
+f 21034/27653/24445 21038/27652/24444 27778/27654/24446 27779/27655/24447
+f 21033/27647/24439 29759/27649/24441 29760/27656/24448 21038/27652/24444
+f 21038/27652/24444 29760/27656/24448 31451/27657/24449 27778/27654/24446
+f 21031/27640/24432 21034/27653/24445 21039/27658/24450 21035/27641/24433
+f 21035/27641/24433 21039/27658/24450 29754/27636/24428 29753/27629/24421
+f 21034/27653/24445 27779/27655/24447 27780/27659/24451 21039/27658/24450
+f 21039/27658/24450 27780/27659/24451 31450/27637/24429 29754/27636/24428
+f 21040/27660/24452 21044/27661/24453 21045/27662/24454 21041/27663/24455
+f 21041/27663/24455 21045/27662/24454 29767/27664/24456 29768/27665/24457
+f 21044/27661/24453 29759/27649/24441 29758/27648/24440 21045/27662/24454
+f 21045/27662/24454 29758/27648/24440 31594/27651/24443 29767/27664/24456
+f 21040/27660/24452 21041/27663/24455 21046/27666/24458 21042/27667/24459
+f 21042/27667/24459 21046/27666/24458 29764/27668/24460 29765/27669/24461
+f 21041/27663/24455 29768/27665/24457 29769/27670/24462 21046/27666/24458
+f 21046/27666/24458 29769/27670/24462 31595/27671/24463 29764/27668/24460
+f 21040/27660/24452 21042/27667/24459 21047/27672/24464 21043/27673/24465
+f 21043/27673/24465 21047/27672/24464 27781/27674/24466 27782/27675/24467
+f 21042/27667/24459 29765/27669/24461 29766/27676/24468 21047/27672/24464
+f 21047/27672/24464 29766/27676/24468 31452/27677/24469 27781/27674/24466
+f 21040/27660/24452 21043/27673/24465 21048/27678/24470 21044/27661/24453
+f 21044/27661/24453 21048/27678/24470 29760/27656/24448 29759/27649/24441
+f 21043/27673/24465 27782/27675/24467 27783/27679/24471 21048/27678/24470
+f 21048/27678/24470 27783/27679/24471 31451/27657/24449 29760/27656/24448
+f 21049/27680/24472 21053/27681/24473 21054/27682/24474 21050/27683/24475
+f 21050/27683/24475 21054/27682/24474 29773/27684/24476 29774/27685/24477
+f 21053/27681/24473 29765/27669/24461 29764/27668/24460 21054/27682/24474
+f 21054/27682/24474 29764/27668/24460 31595/27671/24463 29773/27684/24476
+f 21049/27680/24472 21050/27683/24475 21055/27686/24478 21051/27687/24479
+f 21051/27687/24479 21055/27686/24478 29770/27688/24480 29771/27689/24481
+f 21050/27683/24475 29774/27685/24477 29775/27690/24482 21055/27686/24478
+f 21055/27686/24478 29775/27690/24482 31596/27691/24483 29770/27688/24480
+f 21049/27680/24472 21051/27687/24479 21056/27692/24484 21052/27693/24485
+f 21052/27693/24485 21056/27692/24484 27784/27694/24486 27785/27695/24487
+f 21051/27687/24479 29771/27689/24481 29772/27696/24488 21056/27692/24484
+f 21056/27692/24484 29772/27696/24488 31453/27697/24489 27784/27694/24486
+f 21049/27680/24472 21052/27693/24485 21057/27698/24490 21053/27681/24473
+f 21053/27681/24473 21057/27698/24490 29766/27676/24468 29765/27669/24461
+f 21052/27693/24485 27785/27695/24487 27786/27699/24491 21057/27698/24490
+f 21057/27698/24490 27786/27699/24491 31452/27677/24469 29766/27676/24468
+f 21058/27700/24492 21062/27701/24493 21063/27702/24494 21059/27703/24495
+f 21059/27703/24495 21063/27702/24494 29779/27704/24496 29780/27705/24497
+f 21062/27701/24493 29771/27689/24481 29770/27688/24480 21063/27702/24494
+f 21063/27702/24494 29770/27688/24480 31596/27691/24483 29779/27704/24496
+f 21058/27700/24492 21059/27703/24495 21064/27706/24498 21060/27707/24499
+f 21060/27707/24499 21064/27706/24498 29776/27708/24500 29777/27709/24501
+f 21059/27703/24495 29780/27705/24497 29781/27710/24502 21064/27706/24498
+f 21064/27706/24498 29781/27710/24502 31597/27711/24503 29776/27708/24500
+f 21058/27700/24492 21060/27707/24499 21065/27712/24504 21061/27713/24505
+f 21061/27713/24505 21065/27712/24504 27787/27714/24506 27788/27715/24507
+f 21060/27707/24499 29777/27709/24501 29778/27716/24508 21065/27712/24504
+f 21065/27712/24504 29778/27716/24508 31454/27717/24509 27787/27714/24506
+f 21058/27700/24492 21061/27713/24505 21066/27718/24510 21062/27701/24493
+f 21062/27701/24493 21066/27718/24510 29772/27696/24488 29771/27689/24481
+f 21061/27713/24505 27788/27715/24507 27789/27719/24511 21066/27718/24510
+f 21066/27718/24510 27789/27719/24511 31453/27697/24489 29772/27696/24488
+f 21067/27720/24512 21071/27721/24513 21072/27722/24514 21068/27723/24515
+f 21068/27723/24515 21072/27722/24514 29785/27724/24516 29786/27725/24517
+f 21071/27721/24513 29777/27726/24501 29776/27727/24500 21072/27722/24514
+f 21072/27722/24514 29776/27727/24500 31597/27728/24503 29785/27724/24516
+f 21067/27720/24512 21068/27723/24515 21073/27729/24518 21069/27730/24519
+f 21069/27730/24519 21073/27729/24518 29782/27731/24520 29783/27732/24521
+f 21068/27723/24515 29786/27725/24517 29787/27733/24522 21073/27729/24518
+f 21073/27729/24518 29787/27733/24522 31598/27734/24523 29782/27731/24520
+f 21067/27720/24512 21069/27730/24519 21074/27735/24524 21070/27736/24525
+f 21070/27736/24525 21074/27735/24524 27790/27737/24526 27791/27738/24527
+f 21069/27730/24519 29783/27732/24521 29784/27739/24528 21074/27735/24524
+f 21074/27735/24524 29784/27739/24528 31455/27740/24529 27790/27737/24526
+f 21067/27720/24512 21070/27736/24525 21075/27741/24530 21071/27721/24513
+f 21071/27721/24513 21075/27741/24530 29778/27742/24508 29777/27726/24501
+f 21070/27736/24525 27791/27738/24527 27792/27743/24531 21075/27741/24530
+f 21075/27741/24530 27792/27743/24531 31454/27744/24509 29778/27742/24508
+f 21076/27745/24532 21080/27746/24533 21081/27747/24534 21077/27748/24535
+f 21077/27748/24535 21081/27747/24534 29791/27749/24536 29792/27750/24537
+f 21080/27746/24533 29783/27732/24521 29782/27731/24520 21081/27747/24534
+f 21081/27747/24534 29782/27731/24520 31598/27734/24523 29791/27749/24536
+f 21076/27745/24532 21077/27748/24535 21082/27751/24538 21078/27752/24539
+f 21078/27752/24539 21082/27751/24538 29788/27753/24540 29789/27754/24541
+f 21077/27748/24535 29792/27750/24537 29793/27755/24542 21082/27751/24538
+f 21082/27751/24538 29793/27755/24542 31599/27756/24543 29788/27753/24540
+f 21076/27745/24532 21078/27752/24539 21083/27757/24544 21079/27758/24545
+f 21079/27758/24545 21083/27757/24544 27793/27759/24546 27794/27760/24547
+f 21078/27752/24539 29789/27754/24541 29790/27761/24548 21083/27757/24544
+f 21083/27757/24544 29790/27761/24548 31456/27762/24549 27793/27759/24546
+f 21076/27745/24532 21079/27758/24545 21084/27763/24550 21080/27746/24533
+f 21080/27746/24533 21084/27763/24550 29784/27739/24528 29783/27732/24521
+f 21079/27758/24545 27794/27760/24547 27795/27764/24551 21084/27763/24550
+f 21084/27763/24550 27795/27764/24551 31455/27740/24529 29784/27739/24528
+f 21085/27765/24552 21089/27766/24553 21090/27767/24554 21086/27768/24555
+f 21086/27768/24555 21090/27767/24554 29797/27769/24556 29798/27770/24557
+f 21089/27766/24553 29789/27754/24541 29788/27753/24540 21090/27767/24554
+f 21090/27767/24554 29788/27753/24540 31599/27756/24543 29797/27769/24556
+f 21085/27765/24552 21086/27768/24555 21091/27771/24558 21087/27772/24559
+f 21087/27772/24559 21091/27771/24558 29794/27773/24560 29795/27774/24561
+f 21086/27768/24555 29798/27770/24557 29799/27775/24562 21091/27771/24558
+f 21091/27771/24558 29799/27775/24562 31600/27776/24563 29794/27773/24560
+f 21085/27765/24552 21087/27772/24559 21092/27777/24564 21088/27778/24565
+f 21088/27778/24565 21092/27777/24564 27796/27779/24566 27797/27780/24567
+f 21087/27772/24559 29795/27774/24561 29796/27781/24568 21092/27777/24564
+f 21092/27777/24564 29796/27781/24568 31457/27782/24569 27796/27779/24566
+f 21085/27765/24552 21088/27778/24565 21093/27783/24570 21089/27766/24553
+f 21089/27766/24553 21093/27783/24570 29790/27761/24548 29789/27754/24541
+f 21088/27778/24565 27797/27780/24567 27798/27784/24571 21093/27783/24570
+f 21093/27783/24570 27798/27784/24571 31456/27762/24549 29790/27761/24548
+f 21094/27785/24572 21098/27786/24573 21099/27787/24574 21095/27788/24575
+f 21095/27788/24575 21099/27787/24574 29803/27789/24576 29804/27790/24577
+f 21098/27786/24573 29795/27774/24561 29794/27773/24560 21099/27787/24574
+f 21099/27787/24574 29794/27773/24560 31600/27776/24563 29803/27789/24576
+f 21094/27785/24572 21095/27788/24575 21100/27791/24578 21096/27792/24579
+f 21096/27792/24579 21100/27791/24578 29800/27793/24580 29801/27794/24581
+f 21095/27788/24575 29804/27790/24577 29805/27795/24582 21100/27791/24578
+f 21100/27791/24578 29805/27795/24582 31601/27796/24583 29800/27793/24580
+f 21094/27785/24572 21096/27792/24579 21101/27797/24584 21097/27798/24585
+f 21097/27798/24585 21101/27797/24584 27799/27799/24586 27800/27800/24587
+f 21096/27792/24579 29801/27794/24581 29802/27801/24588 21101/27797/24584
+f 21101/27797/24584 29802/27801/24588 31458/27802/24589 27799/27799/24586
+f 21094/27785/24572 21097/27798/24585 21102/27803/24590 21098/27786/24573
+f 21098/27786/24573 21102/27803/24590 29796/27781/24568 29795/27774/24561
+f 21097/27798/24585 27800/27800/24587 27801/27804/24591 21102/27803/24590
+f 21102/27803/24590 27801/27804/24591 31457/27782/24569 29796/27781/24568
+f 21103/27805/24592 21107/27806/24593 21108/27807/24594 21104/27808/24595
+f 21104/27808/24595 21108/27807/24594 29809/27809/24596 29810/27810/24597
+f 21107/27806/24593 29801/27794/24581 29800/27793/24580 21108/27807/24594
+f 21108/27807/24594 29800/27793/24580 31601/27796/24583 29809/27809/24596
+f 21103/27805/24592 21104/27808/24595 21109/27811/24598 21105/27812/24599
+f 21105/27812/24599 21109/27811/24598 29806/27813/24600 29807/27814/24601
+f 21104/27808/24595 29810/27810/24597 29811/27815/24602 21109/27811/24598
+f 21109/27811/24598 29811/27815/24602 31602/27816/24603 29806/27813/24600
+f 21103/27805/24592 21105/27812/24599 21110/27817/24604 21106/27818/24605
+f 21106/27818/24605 21110/27817/24604 27802/27819/24606 27803/27820/24607
+f 21105/27812/24599 29807/27814/24601 29808/27821/24608 21110/27817/24604
+f 21110/27817/24604 29808/27821/24608 31459/27822/24609 27802/27819/24606
+f 21103/27805/24592 21106/27818/24605 21111/27823/24610 21107/27806/24593
+f 21107/27806/24593 21111/27823/24610 29802/27801/24588 29801/27794/24581
+f 21106/27818/24605 27803/27820/24607 27804/27824/24611 21111/27823/24610
+f 21111/27823/24610 27804/27824/24611 31458/27802/24589 29802/27801/24588
+f 21112/27825/24612 21116/27826/24613 21117/27827/24614 21113/27828/24615
+f 21113/27828/24615 21117/27827/24614 29815/27829/24616 29816/27830/24617
+f 21116/27826/24613 29807/27814/24601 29806/27813/24600 21117/27827/24614
+f 21117/27827/24614 29806/27813/24600 31602/27816/24603 29815/27829/24616
+f 21112/27825/24612 21113/27828/24615 21118/27831/24618 21114/27832/24619
+f 21114/27832/24619 21118/27831/24618 29812/27833/24620 29813/27834/24621
+f 21113/27828/24615 29816/27830/24617 29817/27835/24622 21118/27831/24618
+f 21118/27831/24618 29817/27835/24622 31603/27836/24623 29812/27833/24620
+f 21112/27825/24612 21114/27832/24619 21119/27837/24624 21115/27838/24625
+f 21115/27838/24625 21119/27837/24624 27805/27839/24626 27806/27840/24627
+f 21114/27832/24619 29813/27834/24621 29814/27841/24628 21119/27837/24624
+f 21119/27837/24624 29814/27841/24628 31460/27842/24629 27805/27839/24626
+f 21112/27825/24612 21115/27838/24625 21120/27843/24630 21116/27826/24613
+f 21116/27826/24613 21120/27843/24630 29808/27821/24608 29807/27814/24601
+f 21115/27838/24625 27806/27840/24627 27807/27844/24631 21120/27843/24630
+f 21120/27843/24630 27807/27844/24631 31459/27822/24609 29808/27821/24608
+f 21121/27845/24632 21125/27846/24633 21126/27847/24634 21122/27848/24635
+f 21122/27848/24635 21126/27847/24634 29821/27849/24636 29822/27850/24637
+f 21125/27846/24633 29813/27834/24621 29812/27833/24620 21126/27847/24634
+f 21126/27847/24634 29812/27833/24620 31603/27836/24623 29821/27849/24636
+f 21121/27845/24632 21122/27848/24635 21127/27851/24638 21123/27852/24639
+f 21123/27852/24639 21127/27851/24638 29820/27382/24174 29819/27381/24173
+f 21122/27848/24635 29822/27850/24637 29823/27853/24640 21127/27851/24638
+f 21127/27851/24638 29823/27853/24640 31604/27383/24175 29820/27382/24174
+f 21121/27845/24632 21123/27852/24639 21128/27854/24641 21124/27855/24642
+f 21124/27855/24642 21128/27854/24641 27808/27856/24643 27809/27857/24644
+f 21123/27852/24639 29819/27381/24173 29818/27397/24189 21128/27854/24641
+f 21128/27854/24641 29818/27397/24189 31437/27399/24191 27808/27856/24643
+f 21121/27845/24632 21124/27855/24642 21129/27858/24645 21125/27846/24633
+f 21125/27846/24633 21129/27858/24645 29814/27841/24628 29813/27834/24621
+f 21124/27855/24642 27809/27857/24644 27810/27859/24646 21129/27858/24645
+f 21129/27858/24645 27810/27859/24646 31460/27842/24629 29814/27841/24628
+f 21130/27860/24647 21134/27861/24648 21135/27862/24649 21131/27863/24650
+f 21131/27863/24650 21135/27862/24649 27741/27398/24190 27740/27393/24185
+f 21134/27861/24648 29108/27864/24651 29109/27865/24652 21135/27862/24649
+f 21135/27862/24649 29109/27865/24652 31437/27399/24191 27741/27398/24190
+f 21130/27860/24647 21131/27863/24650 21136/27866/24653 21132/27867/24654
+f 21132/27867/24654 21136/27866/24653 29110/27868/24655 29111/27869/24656
+f 21131/27863/24650 27740/27393/24185 27739/27392/24184 21136/27866/24653
+f 21136/27866/24653 27739/27392/24184 31438/27395/24187 29110/27868/24655
+f 21130/27860/24647 21132/27867/24654 21137/27870/24657 21133/27871/24658
+f 21133/27871/24658 21137/27870/24657 27811/27872/24659 27812/27873/24660
+f 21132/27867/24654 29111/27869/24656 29112/27874/24661 21137/27870/24657
+f 21137/27870/24657 29112/27874/24661 31462/27875/24662 27811/27872/24659
+f 21130/27860/24647 21133/27871/24658 21138/27876/24663 21134/27861/24648
+f 21134/27861/24648 21138/27876/24663 29107/27877/24664 29108/27864/24651
+f 21133/27871/24658 27812/27873/24660 27813/27878/24665 21138/27876/24663
+f 21138/27876/24663 27813/27878/24665 31461/27879/24666 29107/27877/24664
+f 21139/27880/24667 21143/27881/24668 21144/27882/24669 21140/27883/24670
+f 21140/27883/24670 21144/27882/24669 27744/27419/24211 27743/27415/24207
+f 21143/27881/24668 29111/27869/24656 29110/27868/24655 21144/27882/24669
+f 21144/27882/24669 29110/27868/24655 31438/27395/24187 27744/27419/24211
+f 21139/27880/24667 21140/27883/24670 21145/27884/24671 21141/27885/24672
+f 21141/27885/24672 21145/27884/24671 29113/27886/24673 29114/27887/24674
+f 21140/27883/24670 27743/27415/24207 27742/27414/24206 21145/27884/24671
+f 21145/27884/24671 27742/27414/24206 31439/27417/24209 29113/27886/24673
+f 21139/27880/24667 21141/27885/24672 21146/27888/24675 21142/27889/24676
+f 21142/27889/24676 21146/27888/24675 27814/27890/24677 27815/27891/24678
+f 21141/27885/24672 29114/27887/24674 29115/27892/24679 21146/27888/24675
+f 21146/27888/24675 29115/27892/24679 31463/27893/24680 27814/27890/24677
+f 21139/27880/24667 21142/27889/24676 21147/27894/24681 21143/27881/24668
+f 21143/27881/24668 21147/27894/24681 29112/27874/24661 29111/27869/24656
+f 21142/27889/24676 27815/27891/24678 27816/27895/24682 21147/27894/24681
+f 21147/27894/24681 27816/27895/24682 31462/27875/24662 29112/27874/24661
+f 21148/27896/24683 21152/27897/24684 21153/27898/24685 21149/27899/24686
+f 21149/27899/24686 21153/27898/24685 27747/27439/24231 27746/27435/24227
+f 21152/27897/24684 29114/27887/24674 29113/27886/24673 21153/27898/24685
+f 21153/27898/24685 29113/27886/24673 31439/27417/24209 27747/27439/24231
+f 21148/27896/24683 21149/27899/24686 21154/27900/24687 21150/27901/24688
+f 21150/27901/24688 21154/27900/24687 29116/27902/24689 29117/27903/24690
+f 21149/27899/24686 27746/27435/24227 27745/27434/24226 21154/27900/24687
+f 21154/27900/24687 27745/27434/24226 31440/27437/24229 29116/27902/24689
+f 21148/27896/24683 21150/27901/24688 21155/27904/24691 21151/27905/24692
+f 21151/27905/24692 21155/27904/24691 27817/27906/24693 27818/27907/24694
+f 21150/27901/24688 29117/27903/24690 29118/27908/24695 21155/27904/24691
+f 21155/27904/24691 29118/27908/24695 31464/27909/24696 27817/27906/24693
+f 21148/27896/24683 21151/27905/24692 21156/27910/24697 21152/27897/24684
+f 21152/27897/24684 21156/27910/24697 29115/27892/24679 29114/27887/24674
+f 21151/27905/24692 27818/27907/24694 27819/27911/24698 21156/27910/24697
+f 21156/27910/24697 27819/27911/24698 31463/27893/24680 29115/27892/24679
+f 21157/27912/24699 21161/27913/24700 21162/27914/24701 21158/27915/24702
+f 21158/27915/24702 21162/27914/24701 27750/27459/24251 27749/27455/24247
+f 21161/27913/24700 29117/27903/24690 29116/27902/24689 21162/27914/24701
+f 21162/27914/24701 29116/27902/24689 31440/27437/24229 27750/27459/24251
+f 21157/27912/24699 21158/27915/24702 21163/27916/24703 21159/27917/24704
+f 21159/27917/24704 21163/27916/24703 29119/27918/24705 29120/27919/24706
+f 21158/27915/24702 27749/27455/24247 27748/27454/24246 21163/27916/24703
+f 21163/27916/24703 27748/27454/24246 31441/27457/24249 29119/27918/24705
+f 21157/27912/24699 21159/27917/24704 21164/27920/24707 21160/27921/24708
+f 21160/27921/24708 21164/27920/24707 27820/27922/24709 27821/27923/24710
+f 21159/27917/24704 29120/27919/24706 29121/27924/24711 21164/27920/24707
+f 21164/27920/24707 29121/27924/24711 31465/27925/24712 27820/27922/24709
+f 21157/27912/24699 21160/27921/24708 21165/27926/24713 21161/27913/24700
+f 21161/27913/24700 21165/27926/24713 29118/27908/24695 29117/27903/24690
+f 21160/27921/24708 27821/27923/24710 27822/27927/24714 21165/27926/24713
+f 21165/27926/24713 27822/27927/24714 31464/27909/24696 29118/27908/24695
+f 21166/27928/24715 21170/27929/24716 21171/27930/24717 21167/27931/24718
+f 21167/27931/24718 21171/27930/24717 27753/27479/24271 27752/27475/24267
+f 21170/27929/24716 29120/27919/24706 29119/27918/24705 21171/27930/24717
+f 21171/27930/24717 29119/27918/24705 31441/27457/24249 27753/27479/24271
+f 21166/27928/24715 21167/27931/24718 21172/27932/24719 21168/27933/24720
+f 21168/27933/24720 21172/27932/24719 29122/27934/24721 29123/27935/24722
+f 21167/27931/24718 27752/27475/24267 27751/27474/24266 21172/27932/24719
+f 21172/27932/24719 27751/27474/24266 31442/27477/24269 29122/27934/24721
+f 21166/27928/24715 21168/27933/24720 21173/27936/24723 21169/27937/24724
+f 21169/27937/24724 21173/27936/24723 27823/27938/24725 27824/27939/24726
+f 21168/27933/24720 29123/27935/24722 29124/27940/24727 21173/27936/24723
+f 21173/27936/24723 29124/27940/24727 31466/27941/24728 27823/27938/24725
+f 21166/27928/24715 21169/27937/24724 21174/27942/24729 21170/27929/24716
+f 21170/27929/24716 21174/27942/24729 29121/27924/24711 29120/27919/24706
+f 21169/27937/24724 27824/27939/24726 27825/27943/24730 21174/27942/24729
+f 21174/27942/24729 27825/27943/24730 31465/27925/24712 29121/27924/24711
+f 21175/27944/24731 21179/27945/24732 21180/27946/24733 21176/27947/24734
+f 21176/27947/24734 21180/27946/24733 27756/27499/24291 27755/27495/24287
+f 21179/27945/24732 29123/27935/24722 29122/27934/24721 21180/27946/24733
+f 21180/27946/24733 29122/27934/24721 31442/27477/24269 27756/27499/24291
+f 21175/27944/24731 21176/27947/24734 21181/27948/24735 21177/27949/24736
+f 21177/27949/24736 21181/27948/24735 29125/27950/24737 29126/27951/24738
+f 21176/27947/24734 27755/27495/24287 27754/27494/24286 21181/27948/24735
+f 21181/27948/24735 27754/27494/24286 31443/27497/24289 29125/27950/24737
+f 21175/27944/24731 21177/27949/24736 21182/27952/24739 21178/27953/24740
+f 21178/27953/24740 21182/27952/24739 27826/27954/24741 27827/27955/24742
+f 21177/27949/24736 29126/27951/24738 29127/27956/24743 21182/27952/24739
+f 21182/27952/24739 29127/27956/24743 31467/27957/24744 27826/27954/24741
+f 21175/27944/24731 21178/27953/24740 21183/27958/24745 21179/27945/24732
+f 21179/27945/24732 21183/27958/24745 29124/27940/24727 29123/27935/24722
+f 21178/27953/24740 27827/27955/24742 27828/27959/24746 21183/27958/24745
+f 21183/27958/24745 27828/27959/24746 31466/27941/24728 29124/27940/24727
+f 21184/27960/24747 21188/27961/24748 21189/27962/24749 21185/27963/24750
+f 21185/27963/24750 21189/27962/24749 27759/27519/24311 27758/27515/24307
+f 21188/27961/24748 29126/27951/24738 29125/27950/24737 21189/27962/24749
+f 21189/27962/24749 29125/27950/24737 31443/27497/24289 27759/27519/24311
+f 21184/27960/24747 21185/27963/24750 21190/27964/24751 21186/27965/24752
+f 21186/27965/24752 21190/27964/24751 29128/27966/24753 29129/27967/24754
+f 21185/27963/24750 27758/27515/24307 27757/27514/24306 21190/27964/24751
+f 21190/27964/24751 27757/27514/24306 31444/27517/24309 29128/27966/24753
+f 21184/27960/24747 21186/27965/24752 21191/27968/24755 21187/27969/24756
+f 21187/27969/24756 21191/27968/24755 27829/27970/24757 27830/27971/24758
+f 21186/27965/24752 29129/27967/24754 29130/27972/24759 21191/27968/24755
+f 21191/27968/24755 29130/27972/24759 31468/27973/24760 27829/27970/24757
+f 21184/27960/24747 21187/27969/24756 21192/27974/24761 21188/27961/24748
+f 21188/27961/24748 21192/27974/24761 29127/27956/24743 29126/27951/24738
+f 21187/27969/24756 27830/27971/24758 27831/27975/24762 21192/27974/24761
+f 21192/27974/24761 27831/27975/24762 31467/27957/24744 29127/27956/24743
+f 21193/27976/24763 21197/27977/24764 21198/27978/24765 21194/27979/24766
+f 21194/27979/24766 21198/27978/24765 27762/27539/24331 27761/27535/24327
+f 21197/27977/24764 29129/27967/24754 29128/27966/24753 21198/27978/24765
+f 21198/27978/24765 29128/27966/24753 31444/27517/24309 27762/27539/24331
+f 21193/27976/24763 21194/27979/24766 21199/27980/24767 21195/27981/24768
+f 21195/27981/24768 21199/27980/24767 29131/27982/24769 29132/27983/24770
+f 21194/27979/24766 27761/27535/24327 27760/27534/24326 21199/27980/24767
+f 21199/27980/24767 27760/27534/24326 31445/27537/24329 29131/27982/24769
+f 21193/27976/24763 21195/27981/24768 21200/27984/24771 21196/27985/24772
+f 21196/27985/24772 21200/27984/24771 27832/27986/24773 27833/27987/24774
+f 21195/27981/24768 29132/27983/24770 29133/27988/24775 21200/27984/24771
+f 21200/27984/24771 29133/27988/24775 31469/27989/24776 27832/27986/24773
+f 21193/27976/24763 21196/27985/24772 21201/27990/24777 21197/27977/24764
+f 21197/27977/24764 21201/27990/24777 29130/27972/24759 29129/27967/24754
+f 21196/27985/24772 27833/27987/24774 27834/27991/24778 21201/27990/24777
+f 21201/27990/24777 27834/27991/24778 31468/27973/24760 29130/27972/24759
+f 21202/27992/24779 21206/27993/24780 21207/27994/24781 21203/27995/24782
+f 21203/27995/24782 21207/27994/24781 27765/27559/24351 27764/27555/24347
+f 21206/27993/24780 29132/27983/24770 29131/27982/24769 21207/27994/24781
+f 21207/27994/24781 29131/27982/24769 31445/27537/24329 27765/27559/24351
+f 21202/27992/24779 21203/27995/24782 21208/27996/24783 21204/27997/24784
+f 21204/27997/24784 21208/27996/24783 29134/27998/24785 29135/27999/24786
+f 21203/27995/24782 27764/27555/24347 27763/27554/24346 21208/27996/24783
+f 21208/27996/24783 27763/27554/24346 31446/27557/24349 29134/27998/24785
+f 21202/27992/24779 21204/27997/24784 21209/28000/24787 21205/28001/24788
+f 21205/28001/24788 21209/28000/24787 27835/28002/24789 27836/28003/24790
+f 21204/27997/24784 29135/27999/24786 29136/28004/24791 21209/28000/24787
+f 21209/28000/24787 29136/28004/24791 31470/28005/24792 27835/28002/24789
+f 21202/27992/24779 21205/28001/24788 21210/28006/24793 21206/27993/24780
+f 21206/27993/24780 21210/28006/24793 29133/27988/24775 29132/27983/24770
+f 21205/28001/24788 27836/28003/24790 27837/28007/24794 21210/28006/24793
+f 21210/28006/24793 27837/28007/24794 31469/27989/24776 29133/27988/24775
+f 21211/28008/24795 21215/28009/24796 21216/28010/24797 21212/28011/24798
+f 21212/28011/24798 21216/28010/24797 27768/27579/24371 27767/27575/24367
+f 21215/28009/24796 29135/27999/24786 29134/27998/24785 21216/28010/24797
+f 21216/28010/24797 29134/27998/24785 31446/27557/24349 27768/27579/24371
+f 21211/28008/24795 21212/28011/24798 21217/28012/24799 21213/28013/24800
+f 21213/28013/24800 21217/28012/24799 29137/28014/24801 29138/28015/24802
+f 21212/28011/24798 27767/27575/24367 27766/27574/24366 21217/28012/24799
+f 21217/28012/24799 27766/27574/24366 31447/27577/24369 29137/28014/24801
+f 21211/28008/24795 21213/28013/24800 21218/28016/24803 21214/28017/24804
+f 21214/28017/24804 21218/28016/24803 27838/28018/24805 27839/28019/24806
+f 21213/28013/24800 29138/28015/24802 29139/28020/24807 21218/28016/24803
+f 21218/28016/24803 29139/28020/24807 31471/28021/24808 27838/28018/24805
+f 21211/28008/24795 21214/28017/24804 21219/28022/24809 21215/28009/24796
+f 21215/28009/24796 21219/28022/24809 29136/28004/24791 29135/27999/24786
+f 21214/28017/24804 27839/28019/24806 27840/28023/24810 21219/28022/24809
+f 21219/28022/24809 27840/28023/24810 31470/28005/24792 29136/28004/24791
+f 21220/28024/24811 21224/28025/24812 21225/28026/24813 21221/28027/24814
+f 21221/28027/24814 21225/28026/24813 27771/27599/24391 27770/27595/24387
+f 21224/28025/24812 29138/28015/24802 29137/28014/24801 21225/28026/24813
+f 21225/28026/24813 29137/28014/24801 31447/27577/24369 27771/27599/24391
+f 21220/28024/24811 21221/28027/24814 21226/28028/24815 21222/28029/24816
+f 21222/28029/24816 21226/28028/24815 29140/28030/24817 29141/28031/24818
+f 21221/28027/24814 27770/27595/24387 27769/27594/24386 21226/28028/24815
+f 21226/28028/24815 27769/27594/24386 31448/27597/24389 29140/28030/24817
+f 21220/28024/24811 21222/28029/24816 21227/28032/24819 21223/28033/24820
+f 21223/28033/24820 21227/28032/24819 27841/28034/24821 27842/28035/24822
+f 21222/28029/24816 29141/28031/24818 29142/28036/24823 21227/28032/24819
+f 21227/28032/24819 29142/28036/24823 31472/28037/12939 27841/28034/24821
+f 21220/28024/24811 21223/28033/24820 21228/28038/24824 21224/28025/24812
+f 21224/28025/24812 21228/28038/24824 29139/28020/24807 29138/28015/24802
+f 21223/28033/24820 27842/28035/24822 27843/28039/24825 21228/28038/24824
+f 21228/28038/24824 27843/28039/24825 31471/28021/24808 29139/28020/24807
+f 21229/28040/24826 21233/28041/24827 21234/28042/24828 21230/28043/24829
+f 21230/28043/24829 21234/28042/24828 27774/27619/24411 27773/27615/24407
+f 21233/28041/24827 29141/28031/24818 29140/28030/24817 21234/28042/24828
+f 21234/28042/24828 29140/28030/24817 31448/27597/24389 27774/27619/24411
+f 21229/28040/24826 21230/28043/24829 21235/28044/24830 21231/28045/24831
+f 21231/28045/24831 21235/28044/24830 29143/28046/24832 29144/28047/24833
+f 21230/28043/24829 27773/27615/24407 27772/27614/24406 21235/28044/24830
+f 21235/28044/24830 27772/27614/24406 31449/27617/24409 29143/28046/24832
+f 21229/28040/24826 21231/28045/24831 21236/28048/24834 21232/28049/24835
+f 21232/28049/24835 21236/28048/24834 27844/28050/24836 27845/28051/24837
+f 21231/28045/24831 29144/28047/24833 29145/28052/24838 21236/28048/24834
+f 21236/28048/24834 29145/28052/24838 31473/28053/24839 27844/28050/24836
+f 21229/28040/24826 21232/28049/24835 21237/28054/24840 21233/28041/24827
+f 21233/28041/24827 21237/28054/24840 29142/28036/24823 29141/28031/24818
+f 21232/28049/24835 27845/28051/24837 27846/28055/24841 21237/28054/24840
+f 21237/28054/24840 27846/28055/24841 31472/28037/12939 29142/28036/24823
+f 21238/28056/24842 21242/28057/24843 21243/28058/24844 21239/28059/24845
+f 21239/28059/24845 21243/28058/24844 27777/27639/24431 27776/27635/24427
+f 21242/28057/24843 29144/28047/24833 29143/28046/24832 21243/28058/24844
+f 21243/28058/24844 29143/28046/24832 31449/27617/24409 27777/27639/24431
+f 21238/28056/24842 21239/28059/24845 21244/28060/24846 21240/28061/24847
+f 21240/28061/24847 21244/28060/24846 29146/28062/24848 29147/28063/24849
+f 21239/28059/24845 27776/27635/24427 27775/27634/24426 21244/28060/24846
+f 21244/28060/24846 27775/27634/24426 31450/27637/24429 29146/28062/24848
+f 21238/28056/24842 21240/28061/24847 21245/28064/24850 21241/28065/24851
+f 21241/28065/24851 21245/28064/24850 27847/28066/24852 27848/28067/24853
+f 21240/28061/24847 29147/28063/24849 29148/28068/24854 21245/28064/24850
+f 21245/28064/24850 29148/28068/24854 31474/28069/24855 27847/28066/24852
+f 21238/28056/24842 21241/28065/24851 21246/28070/24856 21242/28057/24843
+f 21242/28057/24843 21246/28070/24856 29145/28052/24838 29144/28047/24833
+f 21241/28065/24851 27848/28067/24853 27849/28071/24857 21246/28070/24856
+f 21246/28070/24856 27849/28071/24857 31473/28053/24839 29145/28052/24838
+f 21247/28072/24858 21251/28073/24859 21252/28074/24860 21248/28075/24861
+f 21248/28075/24861 21252/28074/24860 27780/27659/24451 27779/27655/24447
+f 21251/28073/24859 29147/28063/24849 29146/28062/24848 21252/28074/24860
+f 21252/28074/24860 29146/28062/24848 31450/27637/24429 27780/27659/24451
+f 21247/28072/24858 21248/28075/24861 21253/28076/24862 21249/28077/24863
+f 21249/28077/24863 21253/28076/24862 29149/28078/24864 29150/28079/24865
+f 21248/28075/24861 27779/27655/24447 27778/27654/24446 21253/28076/24862
+f 21253/28076/24862 27778/27654/24446 31451/27657/24449 29149/28078/24864
+f 21247/28072/24858 21249/28077/24863 21254/28080/24866 21250/28081/24867
+f 21250/28081/24867 21254/28080/24866 27850/28082/24868 27851/28083/24869
+f 21249/28077/24863 29150/28079/24865 29151/28084/24870 21254/28080/24866
+f 21254/28080/24866 29151/28084/24870 31475/28085/24871 27850/28082/24868
+f 21247/28072/24858 21250/28081/24867 21255/28086/24872 21251/28073/24859
+f 21251/28073/24859 21255/28086/24872 29148/28068/24854 29147/28063/24849
+f 21250/28081/24867 27851/28083/24869 27852/28087/24873 21255/28086/24872
+f 21255/28086/24872 27852/28087/24873 31474/28069/24855 29148/28068/24854
+f 21256/28088/24874 21260/28089/24875 21261/28090/24876 21257/28091/24877
+f 21257/28091/24877 21261/28090/24876 27783/27679/24471 27782/27675/24467
+f 21260/28089/24875 29150/28079/24865 29149/28078/24864 21261/28090/24876
+f 21261/28090/24876 29149/28078/24864 31451/27657/24449 27783/27679/24471
+f 21256/28088/24874 21257/28091/24877 21262/28092/24878 21258/28093/24879
+f 21258/28093/24879 21262/28092/24878 29152/28094/24880 29153/28095/24881
+f 21257/28091/24877 27782/27675/24467 27781/27674/24466 21262/28092/24878
+f 21262/28092/24878 27781/27674/24466 31452/27677/24469 29152/28094/24880
+f 21256/28088/24874 21258/28093/24879 21263/28096/24882 21259/28097/24883
+f 21259/28097/24883 21263/28096/24882 27853/28098/24884 27854/28099/24885
+f 21258/28093/24879 29153/28095/24881 29154/28100/24886 21263/28096/24882
+f 21263/28096/24882 29154/28100/24886 31476/28101/24887 27853/28098/24884
+f 21256/28088/24874 21259/28097/24883 21264/28102/24888 21260/28089/24875
+f 21260/28089/24875 21264/28102/24888 29151/28084/24870 29150/28079/24865
+f 21259/28097/24883 27854/28099/24885 27855/28103/24889 21264/28102/24888
+f 21264/28102/24888 27855/28103/24889 31475/28085/24871 29151/28084/24870
+f 21265/28104/24890 21269/28105/24891 21270/28106/24892 21266/28107/24893
+f 21266/28107/24893 21270/28106/24892 27786/27699/24491 27785/27695/24487
+f 21269/28105/24891 29153/28095/24881 29152/28094/24880 21270/28106/24892
+f 21270/28106/24892 29152/28094/24880 31452/27677/24469 27786/27699/24491
+f 21265/28104/24890 21266/28107/24893 21271/28108/24894 21267/28109/24895
+f 21267/28109/24895 21271/28108/24894 29155/28110/24896 29156/28111/24897
+f 21266/28107/24893 27785/27695/24487 27784/27694/24486 21271/28108/24894
+f 21271/28108/24894 27784/27694/24486 31453/27697/24489 29155/28110/24896
+f 21265/28104/24890 21267/28109/24895 21272/28112/24898 21268/28113/24899
+f 21268/28113/24899 21272/28112/24898 27856/28114/24900 27857/28115/24901
+f 21267/28109/24895 29156/28111/24897 29157/28116/24902 21272/28112/24898
+f 21272/28112/24898 29157/28116/24902 31477/28117/24903 27856/28114/24900
+f 21265/28104/24890 21268/28113/24899 21273/28118/24904 21269/28105/24891
+f 21269/28105/24891 21273/28118/24904 29154/28100/24886 29153/28095/24881
+f 21268/28113/24899 27857/28115/24901 27858/28119/24905 21273/28118/24904
+f 21273/28118/24904 27858/28119/24905 31476/28101/24887 29154/28100/24886
+f 21274/28120/24906 21278/28121/24907 21279/28122/24908 21275/28123/24909
+f 21275/28123/24909 21279/28122/24908 27789/27719/24511 27788/27715/24507
+f 21278/28121/24907 29156/28111/24897 29155/28110/24896 21279/28122/24908
+f 21279/28122/24908 29155/28110/24896 31453/27697/24489 27789/27719/24511
+f 21274/28120/24906 21275/28123/24909 21280/28124/24910 21276/28125/24911
+f 21276/28125/24911 21280/28124/24910 29158/28126/24912 29159/28127/24913
+f 21275/28123/24909 27788/27715/24507 27787/27714/24506 21280/28124/24910
+f 21280/28124/24910 27787/27714/24506 31454/27717/24509 29158/28126/24912
+f 21274/28120/24906 21276/28125/24911 21281/28128/24914 21277/28129/24915
+f 21277/28129/24915 21281/28128/24914 27859/28130/24916 27860/28131/24917
+f 21276/28125/24911 29159/28127/24913 29160/28132/24918 21281/28128/24914
+f 21281/28128/24914 29160/28132/24918 31478/28133/24919 27859/28130/24916
+f 21274/28120/24906 21277/28129/24915 21282/28134/24920 21278/28121/24907
+f 21278/28121/24907 21282/28134/24920 29157/28116/24902 29156/28111/24897
+f 21277/28129/24915 27860/28131/24917 27861/28135/24921 21282/28134/24920
+f 21282/28134/24920 27861/28135/24921 31477/28117/24903 29157/28116/24902
+f 21283/28136/24922 21287/28137/24923 21288/28138/24924 21284/28139/24925
+f 21284/28139/24925 21288/28138/24924 27792/27743/24531 27791/27738/24527
+f 21287/28137/24923 29159/28140/24913 29158/28141/24912 21288/28138/24924
+f 21288/28138/24924 29158/28141/24912 31454/27744/24509 27792/27743/24531
+f 21283/28136/24922 21284/28139/24925 21289/28142/24926 21285/28143/24927
+f 21285/28143/24927 21289/28142/24926 29161/28144/24928 29162/28145/24929
+f 21284/28139/24925 27791/27738/24527 27790/27737/24526 21289/28142/24926
+f 21289/28142/24926 27790/27737/24526 31455/27740/24529 29161/28144/24928
+f 21283/28136/24922 21285/28143/24927 21290/28146/24930 21286/28147/24931
+f 21286/28147/24931 21290/28146/24930 27862/28148/24932 27863/28149/24933
+f 21285/28143/24927 29162/28145/24929 29163/28150/24934 21290/28146/24930
+f 21290/28146/24930 29163/28150/24934 31479/28151/24935 27862/28148/24932
+f 21283/28136/24922 21286/28147/24931 21291/28152/24936 21287/28137/24923
+f 21287/28137/24923 21291/28152/24936 29160/28153/24918 29159/28140/24913
+f 21286/28147/24931 27863/28149/24933 27864/28154/24937 21291/28152/24936
+f 21291/28152/24936 27864/28154/24937 31478/28155/24919 29160/28153/24918
+f 21292/28156/24938 21296/28157/24939 21297/28158/24940 21293/28159/24941
+f 21293/28159/24941 21297/28158/24940 27795/27764/24551 27794/27760/24547
+f 21296/28157/24939 29162/28145/24929 29161/28144/24928 21297/28158/24940
+f 21297/28158/24940 29161/28144/24928 31455/27740/24529 27795/27764/24551
+f 21292/28156/24938 21293/28159/24941 21298/28160/24942 21294/28161/24943
+f 21294/28161/24943 21298/28160/24942 29164/28162/24944 29165/28163/24945
+f 21293/28159/24941 27794/27760/24547 27793/27759/24546 21298/28160/24942
+f 21298/28160/24942 27793/27759/24546 31456/27762/24549 29164/28162/24944
+f 21292/28156/24938 21294/28161/24943 21299/28164/24946 21295/28165/24947
+f 21295/28165/24947 21299/28164/24946 27865/28166/24948 27866/28167/24949
+f 21294/28161/24943 29165/28163/24945 29166/28168/24950 21299/28164/24946
+f 21299/28164/24946 29166/28168/24950 31480/28169/24951 27865/28166/24948
+f 21292/28156/24938 21295/28165/24947 21300/28170/24952 21296/28157/24939
+f 21296/28157/24939 21300/28170/24952 29163/28150/24934 29162/28145/24929
+f 21295/28165/24947 27866/28167/24949 27867/28171/24953 21300/28170/24952
+f 21300/28170/24952 27867/28171/24953 31479/28151/24935 29163/28150/24934
+f 21301/28172/24954 21305/28173/24955 21306/28174/24956 21302/28175/24957
+f 21302/28175/24957 21306/28174/24956 27798/27784/24571 27797/27780/24567
+f 21305/28173/24955 29165/28163/24945 29164/28162/24944 21306/28174/24956
+f 21306/28174/24956 29164/28162/24944 31456/27762/24549 27798/27784/24571
+f 21301/28172/24954 21302/28175/24957 21307/28176/24958 21303/28177/24959
+f 21303/28177/24959 21307/28176/24958 29167/28178/24960 29168/28179/24961
+f 21302/28175/24957 27797/27780/24567 27796/27779/24566 21307/28176/24958
+f 21307/28176/24958 27796/27779/24566 31457/27782/24569 29167/28178/24960
+f 21301/28172/24954 21303/28177/24959 21308/28180/24962 21304/28181/24963
+f 21304/28181/24963 21308/28180/24962 27868/28182/24964 27869/28183/24965
+f 21303/28177/24959 29168/28179/24961 29169/28184/24966 21308/28180/24962
+f 21308/28180/24962 29169/28184/24966 31481/28185/24967 27868/28182/24964
+f 21301/28172/24954 21304/28181/24963 21309/28186/24968 21305/28173/24955
+f 21305/28173/24955 21309/28186/24968 29166/28168/24950 29165/28163/24945
+f 21304/28181/24963 27869/28183/24965 27870/28187/24969 21309/28186/24968
+f 21309/28186/24968 27870/28187/24969 31480/28169/24951 29166/28168/24950
+f 21310/28188/24970 21314/28189/24971 21315/28190/24972 21311/28191/24973
+f 21311/28191/24973 21315/28190/24972 27801/27804/24591 27800/27800/24587
+f 21314/28189/24971 29168/28179/24961 29167/28178/24960 21315/28190/24972
+f 21315/28190/24972 29167/28178/24960 31457/27782/24569 27801/27804/24591
+f 21310/28188/24970 21311/28191/24973 21316/28192/24974 21312/28193/24975
+f 21312/28193/24975 21316/28192/24974 29170/28194/24976 29171/28195/24977
+f 21311/28191/24973 27800/27800/24587 27799/27799/24586 21316/28192/24974
+f 21316/28192/24974 27799/27799/24586 31458/27802/24589 29170/28194/24976
+f 21310/28188/24970 21312/28193/24975 21317/28196/24978 21313/28197/24979
+f 21313/28197/24979 21317/28196/24978 27871/28198/24980 27872/28199/24981
+f 21312/28193/24975 29171/28195/24977 29172/28200/24982 21317/28196/24978
+f 21317/28196/24978 29172/28200/24982 31482/28201/24983 27871/28198/24980
+f 21310/28188/24970 21313/28197/24979 21318/28202/24984 21314/28189/24971
+f 21314/28189/24971 21318/28202/24984 29169/28184/24966 29168/28179/24961
+f 21313/28197/24979 27872/28199/24981 27873/28203/24985 21318/28202/24984
+f 21318/28202/24984 27873/28203/24985 31481/28185/24967 29169/28184/24966
+f 21319/28204/24986 21323/28205/24987 21324/28206/24988 21320/28207/24989
+f 21320/28207/24989 21324/28206/24988 27804/27824/24611 27803/27820/24607
+f 21323/28205/24987 29171/28195/24977 29170/28194/24976 21324/28206/24988
+f 21324/28206/24988 29170/28194/24976 31458/27802/24589 27804/27824/24611
+f 21319/28204/24986 21320/28207/24989 21325/28208/24990 21321/28209/24991
+f 21321/28209/24991 21325/28208/24990 29173/28210/24992 29174/28211/24993
+f 21320/28207/24989 27803/27820/24607 27802/27819/24606 21325/28208/24990
+f 21325/28208/24990 27802/27819/24606 31459/27822/24609 29173/28210/24992
+f 21319/28204/24986 21321/28209/24991 21326/28212/24994 21322/28213/24995
+f 21322/28213/24995 21326/28212/24994 27874/28214/24996 27875/28215/24997
+f 21321/28209/24991 29174/28211/24993 29175/28216/24998 21326/28212/24994
+f 21326/28212/24994 29175/28216/24998 31483/28217/24999 27874/28214/24996
+f 21319/28204/24986 21322/28213/24995 21327/28218/25000 21323/28205/24987
+f 21323/28205/24987 21327/28218/25000 29172/28200/24982 29171/28195/24977
+f 21322/28213/24995 27875/28215/24997 27876/28219/25001 21327/28218/25000
+f 21327/28218/25000 27876/28219/25001 31482/28201/24983 29172/28200/24982
+f 21328/28220/25002 21332/28221/25003 21333/28222/25004 21329/28223/25005
+f 21329/28223/25005 21333/28222/25004 27807/27844/24631 27806/27840/24627
+f 21332/28221/25003 29174/28211/24993 29173/28210/24992 21333/28222/25004
+f 21333/28222/25004 29173/28210/24992 31459/27822/24609 27807/27844/24631
+f 21328/28220/25002 21329/28223/25005 21334/28224/25006 21330/28225/25007
+f 21330/28225/25007 21334/28224/25006 29176/28226/25008 29177/28227/25009
+f 21329/28223/25005 27806/27840/24627 27805/27839/24626 21334/28224/25006
+f 21334/28224/25006 27805/27839/24626 31460/27842/24629 29176/28226/25008
+f 21328/28220/25002 21330/28225/25007 21335/28228/25010 21331/28229/25011
+f 21331/28229/25011 21335/28228/25010 27877/28230/25012 27878/28231/25013
+f 21330/28225/25007 29177/28227/25009 29178/28232/25014 21335/28228/25010
+f 21335/28228/25010 29178/28232/25014 31484/28233/12747 27877/28230/25012
+f 21328/28220/25002 21331/28229/25011 21336/28234/25015 21332/28221/25003
+f 21332/28221/25003 21336/28234/25015 29175/28216/24998 29174/28211/24993
+f 21331/28229/25011 27878/28231/25013 27879/28235/25016 21336/28234/25015
+f 21336/28234/25015 27879/28235/25016 31483/28217/24999 29175/28216/24998
+f 21337/28236/25017 21341/28237/25018 21342/28238/25019 21338/28239/25020
+f 21338/28239/25020 21342/28238/25019 27810/27859/24646 27809/27857/24644
+f 21341/28237/25018 29177/28227/25009 29176/28226/25008 21342/28238/25019
+f 21342/28238/25019 29176/28226/25008 31460/27842/24629 27810/27859/24646
+f 21337/28236/25017 21338/28239/25020 21343/28240/25021 21339/28241/25022
+f 21339/28241/25022 21343/28240/25021 29109/27865/24652 29108/27864/24651
+f 21338/28239/25020 27809/27857/24644 27808/27856/24643 21343/28240/25021
+f 21343/28240/25021 27808/27856/24643 31437/27399/24191 29109/27865/24652
+f 21337/28236/25017 21339/28241/25022 21344/28242/25023 21340/28243/25024
+f 21340/28243/25024 21344/28242/25023 27880/28244/25025 27881/28245/25026
+f 21339/28241/25022 29108/27864/24651 29107/27877/24664 21344/28242/25023
+f 21344/28242/25023 29107/27877/24664 31461/27879/24666 27880/28244/25025
+f 21337/28236/25017 21340/28243/25024 21345/28246/25027 21341/28237/25018
+f 21341/28237/25018 21345/28246/25027 29178/28232/25014 29177/28227/25009
+f 21340/28243/25024 27881/28245/25026 27882/28247/25028 21345/28246/25027
+f 21345/28246/25027 27882/28247/25028 31484/28233/12747 29178/28232/25014
+f 21346/28248/25029 21350/28249/25030 21351/28250/25031 21347/28251/25032
+f 21347/28251/25032 21351/28250/25031 27813/27878/24665 27812/27873/24660
+f 21350/28249/25030 29180/28252/25033 29181/28253/25034 21351/28250/25031
+f 21351/28250/25031 29181/28253/25034 31461/27879/24666 27813/27878/24665
+f 21346/28248/25029 21347/28251/25032 21352/28254/25035 21348/28255/25036
+f 21348/28255/25036 21352/28254/25035 29182/28256/25037 29183/28257/25038
+f 21347/28251/25032 27812/27873/24660 27811/27872/24659 21352/28254/25035
+f 21352/28254/25035 27811/27872/24659 31462/27875/24662 29182/28256/25037
+f 21346/28248/25029 21348/28255/25036 21353/28258/25039 21349/28259/25040
+f 21349/28259/25040 21353/28258/25039 27883/28260/25041 27884/28261/25042
+f 21348/28255/25036 29183/28257/25038 29184/28262/25043 21353/28258/25039
+f 21353/28258/25039 29184/28262/25043 31486/28263/25044 27883/28260/25041
+f 21346/28248/25029 21349/28259/25040 21354/28264/25045 21350/28249/25030
+f 21350/28249/25030 21354/28264/25045 29179/28265/25046 29180/28252/25033
+f 21349/28259/25040 27884/28261/25042 27885/28266/25047 21354/28264/25045
+f 21354/28264/25045 27885/28266/25047 31485/28267/25048 29179/28265/25046
+f 21355/28268/25049 21359/28269/25050 21360/28270/25051 21356/28271/25052
+f 21356/28271/25052 21360/28270/25051 27816/27895/24682 27815/27891/24678
+f 21359/28269/25050 29183/28257/25038 29182/28256/25037 21360/28270/25051
+f 21360/28270/25051 29182/28256/25037 31462/27875/24662 27816/27895/24682
+f 21355/28268/25049 21356/28271/25052 21361/28272/25053 21357/28273/25054
+f 21357/28273/25054 21361/28272/25053 29185/28274/25055 29186/28275/25056
+f 21356/28271/25052 27815/27891/24678 27814/27890/24677 21361/28272/25053
+f 21361/28272/25053 27814/27890/24677 31463/27893/24680 29185/28274/25055
+f 21355/28268/25049 21357/28273/25054 21362/28276/25057 21358/28277/25058
+f 21358/28277/25058 21362/28276/25057 27886/28278/25059 27887/28279/25060
+f 21357/28273/25054 29186/28275/25056 29187/28280/25061 21362/28276/25057
+f 21362/28276/25057 29187/28280/25061 31487/28281/25062 27886/28278/25059
+f 21355/28268/25049 21358/28277/25058 21363/28282/25063 21359/28269/25050
+f 21359/28269/25050 21363/28282/25063 29184/28262/25043 29183/28257/25038
+f 21358/28277/25058 27887/28279/25060 27888/28283/25064 21363/28282/25063
+f 21363/28282/25063 27888/28283/25064 31486/28263/25044 29184/28262/25043
+f 21364/28284/25065 21368/28285/25066 21369/28286/25067 21365/28287/25068
+f 21365/28287/25068 21369/28286/25067 27819/27911/24698 27818/27907/24694
+f 21368/28285/25066 29186/28275/25056 29185/28274/25055 21369/28286/25067
+f 21369/28286/25067 29185/28274/25055 31463/27893/24680 27819/27911/24698
+f 21364/28284/25065 21365/28287/25068 21370/28288/25069 21366/28289/25070
+f 21366/28289/25070 21370/28288/25069 29188/28290/25071 29189/28291/25072
+f 21365/28287/25068 27818/27907/24694 27817/27906/24693 21370/28288/25069
+f 21370/28288/25069 27817/27906/24693 31464/27909/24696 29188/28290/25071
+f 21364/28284/25065 21366/28289/25070 21371/28292/25073 21367/28293/25074
+f 21367/28293/25074 21371/28292/25073 27889/28294/25075 27890/28295/25076
+f 21366/28289/25070 29189/28291/25072 29190/28296/25077 21371/28292/25073
+f 21371/28292/25073 29190/28296/25077 31488/28297/25078 27889/28294/25075
+f 21364/28284/25065 21367/28293/25074 21372/28298/25079 21368/28285/25066
+f 21368/28285/25066 21372/28298/25079 29187/28280/25061 29186/28275/25056
+f 21367/28293/25074 27890/28295/25076 27891/28299/25080 21372/28298/25079
+f 21372/28298/25079 27891/28299/25080 31487/28281/25062 29187/28280/25061
+f 21373/28300/25081 21377/28301/25082 21378/28302/25083 21374/28303/25084
+f 21374/28303/25084 21378/28302/25083 27822/27927/24714 27821/27923/24710
+f 21377/28301/25082 29189/28291/25072 29188/28290/25071 21378/28302/25083
+f 21378/28302/25083 29188/28290/25071 31464/27909/24696 27822/27927/24714
+f 21373/28300/25081 21374/28303/25084 21379/28304/25085 21375/28305/25086
+f 21375/28305/25086 21379/28304/25085 29191/28306/25087 29192/28307/25088
+f 21374/28303/25084 27821/27923/24710 27820/27922/24709 21379/28304/25085
+f 21379/28304/25085 27820/27922/24709 31465/27925/24712 29191/28306/25087
+f 21373/28300/25081 21375/28305/25086 21380/28308/25089 21376/28309/25090
+f 21376/28309/25090 21380/28308/25089 27892/28310/25091 27893/28311/25092
+f 21375/28305/25086 29192/28307/25088 29193/28312/25093 21380/28308/25089
+f 21380/28308/25089 29193/28312/25093 31489/28313/25094 27892/28310/25091
+f 21373/28300/25081 21376/28309/25090 21381/28314/25095 21377/28301/25082
+f 21377/28301/25082 21381/28314/25095 29190/28296/25077 29189/28291/25072
+f 21376/28309/25090 27893/28311/25092 27894/28315/25096 21381/28314/25095
+f 21381/28314/25095 27894/28315/25096 31488/28297/25078 29190/28296/25077
+f 21382/28316/25097 21386/28317/25098 21387/28318/25099 21383/28319/25100
+f 21383/28319/25100 21387/28318/25099 27825/27943/24730 27824/27939/24726
+f 21386/28317/25098 29192/28307/25088 29191/28306/25087 21387/28318/25099
+f 21387/28318/25099 29191/28306/25087 31465/27925/24712 27825/27943/24730
+f 21382/28316/25097 21383/28319/25100 21388/28320/25101 21384/28321/25102
+f 21384/28321/25102 21388/28320/25101 29194/28322/25103 29195/28323/25104
+f 21383/28319/25100 27824/27939/24726 27823/27938/24725 21388/28320/25101
+f 21388/28320/25101 27823/27938/24725 31466/27941/24728 29194/28322/25103
+f 21382/28316/25097 21384/28321/25102 21389/28324/25105 21385/28325/25106
+f 21385/28325/25106 21389/28324/25105 27895/28326/25107 27896/28327/25108
+f 21384/28321/25102 29195/28323/25104 29196/28328/25109 21389/28324/25105
+f 21389/28324/25105 29196/28328/25109 31490/28329/25110 27895/28326/25107
+f 21382/28316/25097 21385/28325/25106 21390/28330/25111 21386/28317/25098
+f 21386/28317/25098 21390/28330/25111 29193/28312/25093 29192/28307/25088
+f 21385/28325/25106 27896/28327/25108 27897/28331/25112 21390/28330/25111
+f 21390/28330/25111 27897/28331/25112 31489/28313/25094 29193/28312/25093
+f 21391/28332/25113 21395/28333/25114 21396/28334/25115 21392/28335/25116
+f 21392/28335/25116 21396/28334/25115 27828/27959/24746 27827/27955/24742
+f 21395/28333/25114 29195/28323/25104 29194/28322/25103 21396/28334/25115
+f 21396/28334/25115 29194/28322/25103 31466/27941/24728 27828/27959/24746
+f 21391/28332/25113 21392/28335/25116 21397/28336/25117 21393/28337/25118
+f 21393/28337/25118 21397/28336/25117 29197/28338/25119 29198/28339/25120
+f 21392/28335/25116 27827/27955/24742 27826/27954/24741 21397/28336/25117
+f 21397/28336/25117 27826/27954/24741 31467/27957/24744 29197/28338/25119
+f 21391/28332/25113 21393/28337/25118 21398/28340/25121 21394/28341/25122
+f 21394/28341/25122 21398/28340/25121 27898/28342/25123 27899/28343/25124
+f 21393/28337/25118 29198/28339/25120 29199/28344/25125 21398/28340/25121
+f 21398/28340/25121 29199/28344/25125 31491/28345/25126 27898/28342/25123
+f 21391/28332/25113 21394/28341/25122 21399/28346/25127 21395/28333/25114
+f 21395/28333/25114 21399/28346/25127 29196/28328/25109 29195/28323/25104
+f 21394/28341/25122 27899/28343/25124 27900/28347/25128 21399/28346/25127
+f 21399/28346/25127 27900/28347/25128 31490/28329/25110 29196/28328/25109
+f 21400/28348/25129 21404/28349/25130 21405/28350/25131 21401/28351/25132
+f 21401/28351/25132 21405/28350/25131 27831/27975/24762 27830/27971/24758
+f 21404/28349/25130 29198/28339/25120 29197/28338/25119 21405/28350/25131
+f 21405/28350/25131 29197/28338/25119 31467/27957/24744 27831/27975/24762
+f 21400/28348/25129 21401/28351/25132 21406/28352/25133 21402/28353/25134
+f 21402/28353/25134 21406/28352/25133 29200/28354/25135 29201/28355/25136
+f 21401/28351/25132 27830/27971/24758 27829/27970/24757 21406/28352/25133
+f 21406/28352/25133 27829/27970/24757 31468/27973/24760 29200/28354/25135
+f 21400/28348/25129 21402/28353/25134 21407/28356/25137 21403/28357/25138
+f 21403/28357/25138 21407/28356/25137 27901/28358/25139 27902/28359/25140
+f 21402/28353/25134 29201/28355/25136 29202/28360/25141 21407/28356/25137
+f 21407/28356/25137 29202/28360/25141 31492/28361/25142 27901/28358/25139
+f 21400/28348/25129 21403/28357/25138 21408/28362/25143 21404/28349/25130
+f 21404/28349/25130 21408/28362/25143 29199/28344/25125 29198/28339/25120
+f 21403/28357/25138 27902/28359/25140 27903/28363/25144 21408/28362/25143
+f 21408/28362/25143 27903/28363/25144 31491/28345/25126 29199/28344/25125
+f 21409/28364/25145 21413/28365/25146 21414/28366/25147 21410/28367/25148
+f 21410/28367/25148 21414/28366/25147 27834/27991/24778 27833/27987/24774
+f 21413/28365/25146 29201/28355/25136 29200/28354/25135 21414/28366/25147
+f 21414/28366/25147 29200/28354/25135 31468/27973/24760 27834/27991/24778
+f 21409/28364/25145 21410/28367/25148 21415/28368/25149 21411/28369/25150
+f 21411/28369/25150 21415/28368/25149 29203/28370/25151 29204/28371/25152
+f 21410/28367/25148 27833/27987/24774 27832/27986/24773 21415/28368/25149
+f 21415/28368/25149 27832/27986/24773 31469/27989/24776 29203/28370/25151
+f 21409/28364/25145 21411/28369/25150 21416/28372/25153 21412/28373/25154
+f 21412/28373/25154 21416/28372/25153 27904/28374/25155 27905/28375/25156
+f 21411/28369/25150 29204/28371/25152 29205/28376/25157 21416/28372/25153
+f 21416/28372/25153 29205/28376/25157 31493/28377/25158 27904/28374/25155
+f 21409/28364/25145 21412/28373/25154 21417/28378/25159 21413/28365/25146
+f 21413/28365/25146 21417/28378/25159 29202/28360/25141 29201/28355/25136
+f 21412/28373/25154 27905/28375/25156 27906/28379/25160 21417/28378/25159
+f 21417/28378/25159 27906/28379/25160 31492/28361/25142 29202/28360/25141
+f 21418/28380/25161 21422/28381/25162 21423/28382/25163 21419/28383/25164
+f 21419/28383/25164 21423/28382/25163 27837/28007/24794 27836/28003/24790
+f 21422/28381/25162 29204/28371/25152 29203/28370/25151 21423/28382/25163
+f 21423/28382/25163 29203/28370/25151 31469/27989/24776 27837/28007/24794
+f 21418/28380/25161 21419/28383/25164 21424/28384/25165 21420/28385/25166
+f 21420/28385/25166 21424/28384/25165 29206/28386/25167 29207/28387/25168
+f 21419/28383/25164 27836/28003/24790 27835/28002/24789 21424/28384/25165
+f 21424/28384/25165 27835/28002/24789 31470/28005/24792 29206/28386/25167
+f 21418/28380/25161 21420/28385/25166 21425/28388/25169 21421/28389/25170
+f 21421/28389/25170 21425/28388/25169 27907/28390/25171 27908/28391/25172
+f 21420/28385/25166 29207/28387/25168 29208/28392/25173 21425/28388/25169
+f 21425/28388/25169 29208/28392/25173 31494/28393/25174 27907/28390/25171
+f 21418/28380/25161 21421/28389/25170 21426/28394/25175 21422/28381/25162
+f 21422/28381/25162 21426/28394/25175 29205/28376/25157 29204/28371/25152
+f 21421/28389/25170 27908/28391/25172 27909/28395/25176 21426/28394/25175
+f 21426/28394/25175 27909/28395/25176 31493/28377/25158 29205/28376/25157
+f 21427/28396/25177 21431/28397/25178 21432/28398/25179 21428/28399/25180
+f 21428/28399/25180 21432/28398/25179 27840/28023/24810 27839/28019/24806
+f 21431/28397/25178 29207/28387/25168 29206/28386/25167 21432/28398/25179
+f 21432/28398/25179 29206/28386/25167 31470/28005/24792 27840/28023/24810
+f 21427/28396/25177 21428/28399/25180 21433/28400/25181 21429/28401/25182
+f 21429/28401/25182 21433/28400/25181 29209/28402/25183 29210/28403/25184
+f 21428/28399/25180 27839/28019/24806 27838/28018/24805 21433/28400/25181
+f 21433/28400/25181 27838/28018/24805 31471/28021/24808 29209/28402/25183
+f 21427/28396/25177 21429/28401/25182 21434/28404/25185 21430/28405/25186
+f 21430/28405/25186 21434/28404/25185 27910/28406/25187 27911/28407/25188
+f 21429/28401/25182 29210/28403/25184 29211/28408/25189 21434/28404/25185
+f 21434/28404/25185 29211/28408/25189 31495/28409/25190 27910/28406/25187
+f 21427/28396/25177 21430/28405/25186 21435/28410/25191 21431/28397/25178
+f 21431/28397/25178 21435/28410/25191 29208/28392/25173 29207/28387/25168
+f 21430/28405/25186 27911/28407/25188 27912/28411/25192 21435/28410/25191
+f 21435/28410/25191 27912/28411/25192 31494/28393/25174 29208/28392/25173
+f 21436/28412/25193 21440/28413/25194 21441/28414/25195 21437/28415/25196
+f 21437/28415/25196 21441/28414/25195 27843/28039/24825 27842/28035/24822
+f 21440/28413/25194 29210/28403/25184 29209/28402/25183 21441/28414/25195
+f 21441/28414/25195 29209/28402/25183 31471/28021/24808 27843/28039/24825
+f 21436/28412/25193 21437/28415/25196 21442/28416/25197 21438/28417/25198
+f 21438/28417/25198 21442/28416/25197 29212/28418/25199 29213/28419/25200
+f 21437/28415/25196 27842/28035/24822 27841/28034/24821 21442/28416/25197
+f 21442/28416/25197 27841/28034/24821 31472/28037/12939 29212/28418/25199
+f 21436/28412/25193 21438/28417/25198 21443/28420/25201 21439/28421/25202
+f 21439/28421/25202 21443/28420/25201 27913/28422/25203 27914/28423/25204
+f 21438/28417/25198 29213/28419/25200 29214/28424/25205 21443/28420/25201
+f 21443/28420/25201 29214/28424/25205 31496/28425/25206 27913/28422/25203
+f 21436/28412/25193 21439/28421/25202 21444/28426/25207 21440/28413/25194
+f 21440/28413/25194 21444/28426/25207 29211/28408/25189 29210/28403/25184
+f 21439/28421/25202 27914/28423/25204 27915/28427/25208 21444/28426/25207
+f 21444/28426/25207 27915/28427/25208 31495/28409/25190 29211/28408/25189
+f 21445/28428/25209 21449/28429/25210 21450/28430/25211 21446/28431/25212
+f 21446/28431/25212 21450/28430/25211 27846/28055/24841 27845/28051/24837
+f 21449/28429/25210 29213/28419/25200 29212/28418/25199 21450/28430/25211
+f 21450/28430/25211 29212/28418/25199 31472/28037/12939 27846/28055/24841
+f 21445/28428/25209 21446/28431/25212 21451/28432/25213 21447/28433/25214
+f 21447/28433/25214 21451/28432/25213 29215/28434/25215 29216/28435/25216
+f 21446/28431/25212 27845/28051/24837 27844/28050/24836 21451/28432/25213
+f 21451/28432/25213 27844/28050/24836 31473/28053/24839 29215/28434/25215
+f 21445/28428/25209 21447/28433/25214 21452/28436/25217 21448/28437/25218
+f 21448/28437/25218 21452/28436/25217 27916/28438/25219 27917/28439/25220
+f 21447/28433/25214 29216/28435/25216 29217/28440/25221 21452/28436/25217
+f 21452/28436/25217 29217/28440/25221 31497/28441/25222 27916/28438/25219
+f 21445/28428/25209 21448/28437/25218 21453/28442/25223 21449/28429/25210
+f 21449/28429/25210 21453/28442/25223 29214/28424/25205 29213/28419/25200
+f 21448/28437/25218 27917/28439/25220 27918/28443/25224 21453/28442/25223
+f 21453/28442/25223 27918/28443/25224 31496/28425/25206 29214/28424/25205
+f 21454/28444/25225 21458/28445/25226 21459/28446/25227 21455/28447/25228
+f 21455/28447/25228 21459/28446/25227 27849/28071/24857 27848/28067/24853
+f 21458/28445/25226 29216/28435/25216 29215/28434/25215 21459/28446/25227
+f 21459/28446/25227 29215/28434/25215 31473/28053/24839 27849/28071/24857
+f 21454/28444/25225 21455/28447/25228 21460/28448/25229 21456/28449/25230
+f 21456/28449/25230 21460/28448/25229 29218/28450/25231 29219/28451/25232
+f 21455/28447/25228 27848/28067/24853 27847/28066/24852 21460/28448/25229
+f 21460/28448/25229 27847/28066/24852 31474/28069/24855 29218/28450/25231
+f 21454/28444/25225 21456/28449/25230 21461/28452/25233 21457/28453/25234
+f 21457/28453/25234 21461/28452/25233 27919/28454/25235 27920/28455/25236
+f 21456/28449/25230 29219/28451/25232 29220/28456/25237 21461/28452/25233
+f 21461/28452/25233 29220/28456/25237 31498/28457/25238 27919/28454/25235
+f 21454/28444/25225 21457/28453/25234 21462/28458/25239 21458/28445/25226
+f 21458/28445/25226 21462/28458/25239 29217/28440/25221 29216/28435/25216
+f 21457/28453/25234 27920/28455/25236 27921/28459/25240 21462/28458/25239
+f 21462/28458/25239 27921/28459/25240 31497/28441/25222 29217/28440/25221
+f 21463/28460/25241 21467/28461/25242 21468/28462/25243 21464/28463/25244
+f 21464/28463/25244 21468/28462/25243 27852/28087/24873 27851/28083/24869
+f 21467/28461/25242 29219/28451/25232 29218/28450/25231 21468/28462/25243
+f 21468/28462/25243 29218/28450/25231 31474/28069/24855 27852/28087/24873
+f 21463/28460/25241 21464/28463/25244 21469/28464/25245 21465/28465/25246
+f 21465/28465/25246 21469/28464/25245 29221/28466/25247 29222/28467/25248
+f 21464/28463/25244 27851/28083/24869 27850/28082/24868 21469/28464/25245
+f 21469/28464/25245 27850/28082/24868 31475/28085/24871 29221/28466/25247
+f 21463/28460/25241 21465/28465/25246 21470/28468/25249 21466/28469/25250
+f 21466/28469/25250 21470/28468/25249 27922/28470/25251 27923/28471/25252
+f 21465/28465/25246 29222/28467/25248 29223/28472/25253 21470/28468/25249
+f 21470/28468/25249 29223/28472/25253 31499/28473/25254 27922/28470/25251
+f 21463/28460/25241 21466/28469/25250 21471/28474/25255 21467/28461/25242
+f 21467/28461/25242 21471/28474/25255 29220/28456/25237 29219/28451/25232
+f 21466/28469/25250 27923/28471/25252 27924/28475/25256 21471/28474/25255
+f 21471/28474/25255 27924/28475/25256 31498/28457/25238 29220/28456/25237
+f 21472/28476/25257 21476/28477/25258 21477/28478/25259 21473/28479/25260
+f 21473/28479/25260 21477/28478/25259 27855/28103/24889 27854/28099/24885
+f 21476/28477/25258 29222/28467/25248 29221/28466/25247 21477/28478/25259
+f 21477/28478/25259 29221/28466/25247 31475/28085/24871 27855/28103/24889
+f 21472/28476/25257 21473/28479/25260 21478/28480/25261 21474/28481/25262
+f 21474/28481/25262 21478/28480/25261 29224/28482/25263 29225/28483/25264
+f 21473/28479/25260 27854/28099/24885 27853/28098/24884 21478/28480/25261
+f 21478/28480/25261 27853/28098/24884 31476/28101/24887 29224/28482/25263
+f 21472/28476/25257 21474/28481/25262 21479/28484/25265 21475/28485/25266
+f 21475/28485/25266 21479/28484/25265 27925/28486/25267 27926/28487/25268
+f 21474/28481/25262 29225/28483/25264 29226/28488/25269 21479/28484/25265
+f 21479/28484/25265 29226/28488/25269 31500/28489/25270 27925/28486/25267
+f 21472/28476/25257 21475/28485/25266 21480/28490/25271 21476/28477/25258
+f 21476/28477/25258 21480/28490/25271 29223/28472/25253 29222/28467/25248
+f 21475/28485/25266 27926/28487/25268 27927/28491/25272 21480/28490/25271
+f 21480/28490/25271 27927/28491/25272 31499/28473/25254 29223/28472/25253
+f 21481/28492/25273 21485/28493/25274 21486/28494/25275 21482/28495/25276
+f 21482/28495/25276 21486/28494/25275 27858/28119/24905 27857/28115/24901
+f 21485/28493/25274 29225/28483/25264 29224/28482/25263 21486/28494/25275
+f 21486/28494/25275 29224/28482/25263 31476/28101/24887 27858/28119/24905
+f 21481/28492/25273 21482/28495/25276 21487/28496/25277 21483/28497/25278
+f 21483/28497/25278 21487/28496/25277 29227/28498/25279 29228/28499/25280
+f 21482/28495/25276 27857/28115/24901 27856/28114/24900 21487/28496/25277
+f 21487/28496/25277 27856/28114/24900 31477/28117/24903 29227/28498/25279
+f 21481/28492/25273 21483/28497/25278 21488/28500/25281 21484/28501/25282
+f 21484/28501/25282 21488/28500/25281 27928/28502/25283 27929/28503/25284
+f 21483/28497/25278 29228/28499/25280 29229/28504/25285 21488/28500/25281
+f 21488/28500/25281 29229/28504/25285 31501/28505/25286 27928/28502/25283
+f 21481/28492/25273 21484/28501/25282 21489/28506/25287 21485/28493/25274
+f 21485/28493/25274 21489/28506/25287 29226/28488/25269 29225/28483/25264
+f 21484/28501/25282 27929/28503/25284 27930/28507/25288 21489/28506/25287
+f 21489/28506/25287 27930/28507/25288 31500/28489/25270 29226/28488/25269
+f 21490/28508/25289 21494/28509/25290 21495/28510/25291 21491/28511/25292
+f 21491/28511/25292 21495/28510/25291 27861/28135/24921 27860/28131/24917
+f 21494/28509/25290 29228/28499/25280 29227/28498/25279 21495/28510/25291
+f 21495/28510/25291 29227/28498/25279 31477/28117/24903 27861/28135/24921
+f 21490/28508/25289 21491/28511/25292 21496/28512/25293 21492/28513/25294
+f 21492/28513/25294 21496/28512/25293 29230/28514/25295 29231/28515/25296
+f 21491/28511/25292 27860/28131/24917 27859/28130/24916 21496/28512/25293
+f 21496/28512/25293 27859/28130/24916 31478/28133/24919 29230/28514/25295
+f 21490/28508/25289 21492/28513/25294 21497/28516/25297 21493/28517/25298
+f 21493/28517/25298 21497/28516/25297 27931/28518/25299 27932/28519/25300
+f 21492/28513/25294 29231/28515/25296 29232/28520/25301 21497/28516/25297
+f 21497/28516/25297 29232/28520/25301 31502/28521/25302 27931/28518/25299
+f 21490/28508/25289 21493/28517/25298 21498/28522/25303 21494/28509/25290
+f 21494/28509/25290 21498/28522/25303 29229/28504/25285 29228/28499/25280
+f 21493/28517/25298 27932/28519/25300 27933/28523/25304 21498/28522/25303
+f 21498/28522/25303 27933/28523/25304 31501/28505/25286 29229/28504/25285
+f 21499/28524/25305 21503/28525/25306 21504/28526/25307 21500/28527/25308
+f 21500/28527/25308 21504/28526/25307 27864/28154/24937 27863/28149/24933
+f 21503/28525/25306 29231/28528/25296 29230/28529/25295 21504/28526/25307
+f 21504/28526/25307 29230/28529/25295 31478/28155/24919 27864/28154/24937
+f 21499/28524/25305 21500/28527/25308 21505/28530/25309 21501/28531/25310
+f 21501/28531/25310 21505/28530/25309 29233/28532/25311 29234/28533/25312
+f 21500/28527/25308 27863/28149/24933 27862/28148/24932 21505/28530/25309
+f 21505/28530/25309 27862/28148/24932 31479/28151/24935 29233/28532/25311
+f 21499/28524/25305 21501/28531/25310 21506/28534/25313 21502/28535/25314
+f 21502/28535/25314 21506/28534/25313 27934/28536/25315 27935/28537/25316
+f 21501/28531/25310 29234/28533/25312 29235/28538/25317 21506/28534/25313
+f 21506/28534/25313 29235/28538/25317 31503/28539/25318 27934/28536/25315
+f 21499/28524/25305 21502/28535/25314 21507/28540/25319 21503/28525/25306
+f 21503/28525/25306 21507/28540/25319 29232/28541/25301 29231/28528/25296
+f 21502/28535/25314 27935/28537/25316 27936/28542/25320 21507/28540/25319
+f 21507/28540/25319 27936/28542/25320 31502/28543/25302 29232/28541/25301
+f 21508/28544/25321 21512/28545/25322 21513/28546/25323 21509/28547/25324
+f 21509/28547/25324 21513/28546/25323 27867/28171/24953 27866/28167/24949
+f 21512/28545/25322 29234/28533/25312 29233/28532/25311 21513/28546/25323
+f 21513/28546/25323 29233/28532/25311 31479/28151/24935 27867/28171/24953
+f 21508/28544/25321 21509/28547/25324 21514/28548/25325 21510/28549/25326
+f 21510/28549/25326 21514/28548/25325 29236/28550/25327 29237/28551/25328
+f 21509/28547/25324 27866/28167/24949 27865/28166/24948 21514/28548/25325
+f 21514/28548/25325 27865/28166/24948 31480/28169/24951 29236/28550/25327
+f 21508/28544/25321 21510/28549/25326 21515/28552/25329 21511/28553/25330
+f 21511/28553/25330 21515/28552/25329 27937/28554/25331 27938/28555/25332
+f 21510/28549/25326 29237/28551/25328 29238/28556/25333 21515/28552/25329
+f 21515/28552/25329 29238/28556/25333 31504/28557/25334 27937/28554/25331
+f 21508/28544/25321 21511/28553/25330 21516/28558/25335 21512/28545/25322
+f 21512/28545/25322 21516/28558/25335 29235/28538/25317 29234/28533/25312
+f 21511/28553/25330 27938/28555/25332 27939/28559/25336 21516/28558/25335
+f 21516/28558/25335 27939/28559/25336 31503/28539/25318 29235/28538/25317
+f 21517/28560/25337 21521/28561/25338 21522/28562/25339 21518/28563/25340
+f 21518/28563/25340 21522/28562/25339 27870/28187/24969 27869/28183/24965
+f 21521/28561/25338 29237/28551/25328 29236/28550/25327 21522/28562/25339
+f 21522/28562/25339 29236/28550/25327 31480/28169/24951 27870/28187/24969
+f 21517/28560/25337 21518/28563/25340 21523/28564/25341 21519/28565/25342
+f 21519/28565/25342 21523/28564/25341 29239/28566/25343 29240/28567/25344
+f 21518/28563/25340 27869/28183/24965 27868/28182/24964 21523/28564/25341
+f 21523/28564/25341 27868/28182/24964 31481/28185/24967 29239/28566/25343
+f 21517/28560/25337 21519/28565/25342 21524/28568/25345 21520/28569/25346
+f 21520/28569/25346 21524/28568/25345 27940/28570/25347 27941/28571/25348
+f 21519/28565/25342 29240/28567/25344 29241/28572/25349 21524/28568/25345
+f 21524/28568/25345 29241/28572/25349 31505/28573/25350 27940/28570/25347
+f 21517/28560/25337 21520/28569/25346 21525/28574/25351 21521/28561/25338
+f 21521/28561/25338 21525/28574/25351 29238/28556/25333 29237/28551/25328
+f 21520/28569/25346 27941/28571/25348 27942/28575/25352 21525/28574/25351
+f 21525/28574/25351 27942/28575/25352 31504/28557/25334 29238/28556/25333
+f 21526/28576/25353 21530/28577/25354 21531/28578/25355 21527/28579/25356
+f 21527/28579/25356 21531/28578/25355 27873/28203/24985 27872/28199/24981
+f 21530/28577/25354 29240/28567/25344 29239/28566/25343 21531/28578/25355
+f 21531/28578/25355 29239/28566/25343 31481/28185/24967 27873/28203/24985
+f 21526/28576/25353 21527/28579/25356 21532/28580/25357 21528/28581/25358
+f 21528/28581/25358 21532/28580/25357 29242/28582/25359 29243/28583/25360
+f 21527/28579/25356 27872/28199/24981 27871/28198/24980 21532/28580/25357
+f 21532/28580/25357 27871/28198/24980 31482/28201/24983 29242/28582/25359
+f 21526/28576/25353 21528/28581/25358 21533/28584/25361 21529/28585/25362
+f 21529/28585/25362 21533/28584/25361 27943/28586/25363 27944/28587/25364
+f 21528/28581/25358 29243/28583/25360 29244/28588/25365 21533/28584/25361
+f 21533/28584/25361 29244/28588/25365 31506/28589/25366 27943/28586/25363
+f 21526/28576/25353 21529/28585/25362 21534/28590/25367 21530/28577/25354
+f 21530/28577/25354 21534/28590/25367 29241/28572/25349 29240/28567/25344
+f 21529/28585/25362 27944/28587/25364 27945/28591/25368 21534/28590/25367
+f 21534/28590/25367 27945/28591/25368 31505/28573/25350 29241/28572/25349
+f 21535/28592/25369 21539/28593/25370 21540/28594/25371 21536/28595/25372
+f 21536/28595/25372 21540/28594/25371 27876/28219/25001 27875/28215/24997
+f 21539/28593/25370 29243/28583/25360 29242/28582/25359 21540/28594/25371
+f 21540/28594/25371 29242/28582/25359 31482/28201/24983 27876/28219/25001
+f 21535/28592/25369 21536/28595/25372 21541/28596/25373 21537/28597/25374
+f 21537/28597/25374 21541/28596/25373 29245/28598/25375 29246/28599/25376
+f 21536/28595/25372 27875/28215/24997 27874/28214/24996 21541/28596/25373
+f 21541/28596/25373 27874/28214/24996 31483/28217/24999 29245/28598/25375
+f 21535/28592/25369 21537/28597/25374 21542/28600/25377 21538/28601/25378
+f 21538/28601/25378 21542/28600/25377 27946/28602/25379 27947/28603/25380
+f 21537/28597/25374 29246/28599/25376 29247/28604/25381 21542/28600/25377
+f 21542/28600/25377 29247/28604/25381 31507/28605/25382 27946/28602/25379
+f 21535/28592/25369 21538/28601/25378 21543/28606/25383 21539/28593/25370
+f 21539/28593/25370 21543/28606/25383 29244/28588/25365 29243/28583/25360
+f 21538/28601/25378 27947/28603/25380 27948/28607/25384 21543/28606/25383
+f 21543/28606/25383 27948/28607/25384 31506/28589/25366 29244/28588/25365
+f 21544/28608/25385 21548/28609/25386 21549/28610/25387 21545/28611/25388
+f 21545/28611/25388 21549/28610/25387 27879/28235/25016 27878/28231/25013
+f 21548/28609/25386 29246/28599/25376 29245/28598/25375 21549/28610/25387
+f 21549/28610/25387 29245/28598/25375 31483/28217/24999 27879/28235/25016
+f 21544/28608/25385 21545/28611/25388 21550/28612/25389 21546/28613/25390
+f 21546/28613/25390 21550/28612/25389 29248/28614/25391 29249/28615/25392
+f 21545/28611/25388 27878/28231/25013 27877/28230/25012 21550/28612/25389
+f 21550/28612/25389 27877/28230/25012 31484/28233/12747 29248/28614/25391
+f 21544/28608/25385 21546/28613/25390 21551/28616/25393 21547/28617/25394
+f 21547/28617/25394 21551/28616/25393 27949/28618/25395 27950/28619/25396
+f 21546/28613/25390 29249/28615/25392 29250/28620/25397 21551/28616/25393
+f 21551/28616/25393 29250/28620/25397 31508/28621/25398 27949/28618/25395
+f 21544/28608/25385 21547/28617/25394 21552/28622/25399 21548/28609/25386
+f 21548/28609/25386 21552/28622/25399 29247/28604/25381 29246/28599/25376
+f 21547/28617/25394 27950/28619/25396 27951/28623/25400 21552/28622/25399
+f 21552/28622/25399 27951/28623/25400 31507/28605/25382 29247/28604/25381
+f 21553/28624/25401 21557/28625/25402 21558/28626/25403 21554/28627/25404
+f 21554/28627/25404 21558/28626/25403 27882/28247/25028 27881/28245/25026
+f 21557/28625/25402 29249/28615/25392 29248/28614/25391 21558/28626/25403
+f 21558/28626/25403 29248/28614/25391 31484/28233/12747 27882/28247/25028
+f 21553/28624/25401 21554/28627/25404 21559/28628/25405 21555/28629/25406
+f 21555/28629/25406 21559/28628/25405 29181/28253/25034 29180/28252/25033
+f 21554/28627/25404 27881/28245/25026 27880/28244/25025 21559/28628/25405
+f 21559/28628/25405 27880/28244/25025 31461/27879/24666 29181/28253/25034
+f 21553/28624/25401 21555/28629/25406 21560/28630/25407 21556/28631/25408
+f 21556/28631/25408 21560/28630/25407 27952/28632/25409 27953/28633/25410
+f 21555/28629/25406 29180/28252/25033 29179/28265/25046 21560/28630/25407
+f 21560/28630/25407 29179/28265/25046 31485/28267/25048 27952/28632/25409
+f 21553/28624/25401 21556/28631/25408 21561/28634/25411 21557/28625/25402
+f 21557/28625/25402 21561/28634/25411 29250/28620/25397 29249/28615/25392
+f 21556/28631/25408 27953/28633/25410 27954/28635/25412 21561/28634/25411
+f 21561/28634/25411 27954/28635/25412 31508/28621/25398 29250/28620/25397
+f 21565/28636/25413 30299/28637/25414 30300/28638/25415 21566/28639/25416
+f 21566/28639/25416 30300/28638/25415 31662/28640/25417 30344/28641/25418
+f 21563/28642/25419 21567/28643/25420 30380/28644/25421 30381/28645/25422
+f 21562/28646/25423 21563/28642/25419 21568/28647/25424 21564/28648/25425
+f 21564/28648/25425 21568/28647/25424 30295/28649/25426 30296/28650/25427
+f 21563/28642/25419 30381/28645/25422 30382/28651/25428 21568/28647/25424
+f 21568/28647/25424 30382/28651/25428 31664/28652/25429 30295/28649/25426
+f 21562/28646/25423 21564/28648/25425 21569/28653/25430 21565/28636/25413
+f 21565/28636/25413 21569/28653/25430 30298/28654/25431 30299/28637/25414
+f 21564/28648/25425 30296/28650/25427 30297/28655/25432 21569/28653/25430
+f 21569/28653/25430 30297/28655/25432 31663/28656/25433 30298/28654/25431
+f 21570/28657/25434 21574/28658/25435 21575/28659/25436 21571/28660/25437
+f 21571/28660/25437 21575/28659/25436 27885/28266/25047 27884/28261/25042
+f 21574/28658/25435 29252/28661/25438 29253/28662/25439 21575/28659/25436
+f 21575/28659/25436 29253/28662/25439 31485/28267/25048 27885/28266/25047
+f 21570/28657/25434 21571/28660/25437 21576/28663/25440 21572/28664/25441
+f 21572/28664/25441 21576/28663/25440 29254/28665/25442 29255/28666/25443
+f 21571/28660/25437 27884/28261/25042 27883/28260/25041 21576/28663/25440
+f 21576/28663/25440 27883/28260/25041 31486/28263/25044 29254/28665/25442
+f 21570/28657/25434 21572/28664/25441 21577/28667/25444 21573/28668/25445
+f 21573/28668/25445 21577/28667/25444 29515/28669/25446 29516/28670/25447
+f 21572/28664/25441 29255/28666/25443 29256/28671/25448 21577/28667/25444
+f 21577/28667/25444 29256/28671/25448 31552/28672/25449 29515/28669/25446
+f 21570/28657/25434 21573/28668/25445 21578/28673/25450 21574/28658/25435
+f 21574/28658/25435 21578/28673/25450 29251/28674/25451 29252/28661/25438
+f 21573/28668/25445 29516/28670/25447 29517/28675/25452 21578/28673/25450
+f 21578/28673/25450 29517/28675/25452 31553/28676/25453 29251/28674/25451
+f 21579/28677/25454 21583/28678/25455 21584/28679/25456 21580/28680/25457
+f 21580/28680/25457 21584/28679/25456 27888/28283/25064 27887/28279/25060
+f 21583/28678/25455 29255/28666/25443 29254/28665/25442 21584/28679/25456
+f 21584/28679/25456 29254/28665/25442 31486/28263/25044 27888/28283/25064
+f 21579/28677/25454 21580/28680/25457 21585/28681/25458 21581/28682/25459
+f 21581/28682/25459 21585/28681/25458 29260/28683/25460 29261/28684/25461
+f 21580/28680/25457 27887/28279/25060 27886/28278/25059 21585/28681/25458
+f 21585/28681/25458 27886/28278/25059 31487/28281/25062 29260/28683/25460
+f 21579/28677/25454 21581/28682/25459 21586/28685/25462 21582/28686/25463
+f 21582/28686/25463 21586/28685/25462 29509/28687/25464 29510/28688/25465
+f 21581/28682/25459 29261/28684/25461 29262/28689/25466 21586/28685/25462
+f 21586/28685/25462 29262/28689/25466 31551/28690/25467 29509/28687/25464
+f 21579/28677/25454 21582/28686/25463 21587/28691/25468 21583/28678/25455
+f 21583/28678/25455 21587/28691/25468 29256/28671/25448 29255/28666/25443
+f 21582/28686/25463 29510/28688/25465 29511/28692/25469 21587/28691/25468
+f 21587/28691/25468 29511/28692/25469 31552/28672/25449 29256/28671/25448
+f 21588/28693/25470 21592/28694/25471 21593/28695/25472 21589/28696/25473
+f 21589/28696/25473 21593/28695/25472 27891/28299/25080 27890/28295/25076
+f 21592/28694/25471 29261/28684/25461 29260/28683/25460 21593/28695/25472
+f 21593/28695/25472 29260/28683/25460 31487/28281/25062 27891/28299/25080
+f 21588/28693/25470 21589/28696/25473 21594/28697/25474 21590/28698/25475
+f 21590/28698/25475 21594/28697/25474 29266/28699/25476 29267/28700/25477
+f 21589/28696/25473 27890/28295/25076 27889/28294/25075 21594/28697/25474
+f 21594/28697/25474 27889/28294/25075 31488/28297/25078 29266/28699/25476
+f 21588/28693/25470 21590/28698/25475 21595/28701/25478 21591/28702/25479
+f 21591/28702/25479 21595/28701/25478 29503/28703/25480 29504/28704/25481
+f 21590/28698/25475 29267/28700/25477 29268/28705/25482 21595/28701/25478
+f 21595/28701/25478 29268/28705/25482 31550/28706/25483 29503/28703/25480
+f 21588/28693/25470 21591/28702/25479 21596/28707/25484 21592/28694/25471
+f 21592/28694/25471 21596/28707/25484 29262/28689/25466 29261/28684/25461
+f 21591/28702/25479 29504/28704/25481 29505/28708/25485 21596/28707/25484
+f 21596/28707/25484 29505/28708/25485 31551/28690/25467 29262/28689/25466
+f 21597/28709/25486 21601/28710/25487 21602/28711/25488 21598/28712/25489
+f 21598/28712/25489 21602/28711/25488 27894/28315/25096 27893/28311/25092
+f 21601/28710/25487 29267/28700/25477 29266/28699/25476 21602/28711/25488
+f 21602/28711/25488 29266/28699/25476 31488/28297/25078 27894/28315/25096
+f 21597/28709/25486 21598/28712/25489 21603/28713/25490 21599/28714/25491
+f 21599/28714/25491 21603/28713/25490 29272/28715/25492 29273/28716/25493
+f 21598/28712/25489 27893/28311/25092 27892/28310/25091 21603/28713/25490
+f 21603/28713/25490 27892/28310/25091 31489/28313/25094 29272/28715/25492
+f 21597/28709/25486 21599/28714/25491 21604/28717/25494 21600/28718/25495
+f 21600/28718/25495 21604/28717/25494 29497/28719/25496 29498/28720/25497
+f 21599/28714/25491 29273/28716/25493 29274/28721/25498 21604/28717/25494
+f 21604/28717/25494 29274/28721/25498 31549/28722/25499 29497/28719/25496
+f 21597/28709/25486 21600/28718/25495 21605/28723/25500 21601/28710/25487
+f 21601/28710/25487 21605/28723/25500 29268/28705/25482 29267/28700/25477
+f 21600/28718/25495 29498/28720/25497 29499/28724/25501 21605/28723/25500
+f 21605/28723/25500 29499/28724/25501 31550/28706/25483 29268/28705/25482
+f 21606/28725/25502 21610/28726/25503 21611/28727/25504 21607/28728/25505
+f 21607/28728/25505 21611/28727/25504 27897/28331/25112 27896/28327/25108
+f 21610/28726/25503 29273/28716/25493 29272/28715/25492 21611/28727/25504
+f 21611/28727/25504 29272/28715/25492 31489/28313/25094 27897/28331/25112
+f 21606/28725/25502 21607/28728/25505 21612/28729/25506 21608/28730/25507
+f 21608/28730/25507 21612/28729/25506 29278/28731/25508 29279/28732/25509
+f 21607/28728/25505 27896/28327/25108 27895/28326/25107 21612/28729/25506
+f 21612/28729/25506 27895/28326/25107 31490/28329/25110 29278/28731/25508
+f 21606/28725/25502 21608/28730/25507 21613/28733/25510 21609/28734/25511
+f 21609/28734/25511 21613/28733/25510 29491/28735/25512 29492/28736/25513
+f 21608/28730/25507 29279/28732/25509 29280/28737/25514 21613/28733/25510
+f 21613/28733/25510 29280/28737/25514 31548/28738/25515 29491/28735/25512
+f 21606/28725/25502 21609/28734/25511 21614/28739/25516 21610/28726/25503
+f 21610/28726/25503 21614/28739/25516 29274/28721/25498 29273/28716/25493
+f 21609/28734/25511 29492/28736/25513 29493/28740/25517 21614/28739/25516
+f 21614/28739/25516 29493/28740/25517 31549/28722/25499 29274/28721/25498
+f 21615/28741/25518 21619/28742/25519 21620/28743/25520 21616/28744/25521
+f 21616/28744/25521 21620/28743/25520 27900/28347/25128 27899/28343/25124
+f 21619/28742/25519 29279/28732/25509 29278/28731/25508 21620/28743/25520
+f 21620/28743/25520 29278/28731/25508 31490/28329/25110 27900/28347/25128
+f 21615/28741/25518 21616/28744/25521 21621/28745/25522 21617/28746/25523
+f 21617/28746/25523 21621/28745/25522 29284/28747/25524 29285/28748/25525
+f 21616/28744/25521 27899/28343/25124 27898/28342/25123 21621/28745/25522
+f 21621/28745/25522 27898/28342/25123 31491/28345/25126 29284/28747/25524
+f 21615/28741/25518 21617/28746/25523 21622/28749/25526 21618/28750/25527
+f 21618/28750/25527 21622/28749/25526 29485/28751/25528 29486/28752/25529
+f 21617/28746/25523 29285/28748/25525 29286/28753/25530 21622/28749/25526
+f 21622/28749/25526 29286/28753/25530 31547/28754/25531 29485/28751/25528
+f 21615/28741/25518 21618/28750/25527 21623/28755/25532 21619/28742/25519
+f 21619/28742/25519 21623/28755/25532 29280/28737/25514 29279/28732/25509
+f 21618/28750/25527 29486/28752/25529 29487/28756/25533 21623/28755/25532
+f 21623/28755/25532 29487/28756/25533 31548/28738/25515 29280/28737/25514
+f 21624/28757/25534 21628/28758/25535 21629/28759/25536 21625/28760/25537
+f 21625/28760/25537 21629/28759/25536 27903/28363/25144 27902/28359/25140
+f 21628/28758/25535 29285/28748/25525 29284/28747/25524 21629/28759/25536
+f 21629/28759/25536 29284/28747/25524 31491/28345/25126 27903/28363/25144
+f 21624/28757/25534 21625/28760/25537 21630/28761/25538 21626/28762/25539
+f 21626/28762/25539 21630/28761/25538 29290/28763/25540 29291/28764/25541
+f 21625/28760/25537 27902/28359/25140 27901/28358/25139 21630/28761/25538
+f 21630/28761/25538 27901/28358/25139 31492/28361/25142 29290/28763/25540
+f 21624/28757/25534 21626/28762/25539 21631/28765/25542 21627/28766/25543
+f 21627/28766/25543 21631/28765/25542 29479/28767/25544 29480/28768/25545
+f 21626/28762/25539 29291/28764/25541 29292/28769/25546 21631/28765/25542
+f 21631/28765/25542 29292/28769/25546 31546/28770/25547 29479/28767/25544
+f 21624/28757/25534 21627/28766/25543 21632/28771/25548 21628/28758/25535
+f 21628/28758/25535 21632/28771/25548 29286/28753/25530 29285/28748/25525
+f 21627/28766/25543 29480/28768/25545 29481/28772/25549 21632/28771/25548
+f 21632/28771/25548 29481/28772/25549 31547/28754/25531 29286/28753/25530
+f 21633/28773/25550 21637/28774/25551 21638/28775/25552 21634/28776/25553
+f 21634/28776/25553 21638/28775/25552 27906/28379/25160 27905/28375/25156
+f 21637/28774/25551 29291/28764/25541 29290/28763/25540 21638/28775/25552
+f 21638/28775/25552 29290/28763/25540 31492/28361/25142 27906/28379/25160
+f 21633/28773/25550 21634/28776/25553 21639/28777/25554 21635/28778/25555
+f 21635/28778/25555 21639/28777/25554 29296/28779/25556 29297/28780/25557
+f 21634/28776/25553 27905/28375/25156 27904/28374/25155 21639/28777/25554
+f 21639/28777/25554 27904/28374/25155 31493/28377/25158 29296/28779/25556
+f 21633/28773/25550 21635/28778/25555 21640/28781/25558 21636/28782/25559
+f 21636/28782/25559 21640/28781/25558 29473/28783/25560 29474/28784/25561
+f 21635/28778/25555 29297/28780/25557 29298/28785/25562 21640/28781/25558
+f 21640/28781/25558 29298/28785/25562 31545/28786/25563 29473/28783/25560
+f 21633/28773/25550 21636/28782/25559 21641/28787/25564 21637/28774/25551
+f 21637/28774/25551 21641/28787/25564 29292/28769/25546 29291/28764/25541
+f 21636/28782/25559 29474/28784/25561 29475/28788/25565 21641/28787/25564
+f 21641/28787/25564 29475/28788/25565 31546/28770/25547 29292/28769/25546
+f 21642/28789/25566 21646/28790/25567 21647/28791/25568 21643/28792/25569
+f 21643/28792/25569 21647/28791/25568 27909/28395/25176 27908/28391/25172
+f 21646/28790/25567 29297/28780/25557 29296/28779/25556 21647/28791/25568
+f 21647/28791/25568 29296/28779/25556 31493/28377/25158 27909/28395/25176
+f 21642/28789/25566 21643/28792/25569 21648/28793/25570 21644/28794/25571
+f 21644/28794/25571 21648/28793/25570 29302/28795/25572 29303/28796/25573
+f 21643/28792/25569 27908/28391/25172 27907/28390/25171 21648/28793/25570
+f 21648/28793/25570 27907/28390/25171 31494/28393/25174 29302/28795/25572
+f 21642/28789/25566 21644/28794/25571 21649/28797/25574 21645/28798/25575
+f 21645/28798/25575 21649/28797/25574 29467/28799/25576 29468/28800/25577
+f 21644/28794/25571 29303/28796/25573 29304/28801/25578 21649/28797/25574
+f 21649/28797/25574 29304/28801/25578 31544/28802/25579 29467/28799/25576
+f 21642/28789/25566 21645/28798/25575 21650/28803/25580 21646/28790/25567
+f 21646/28790/25567 21650/28803/25580 29298/28785/25562 29297/28780/25557
+f 21645/28798/25575 29468/28800/25577 29469/28804/25581 21650/28803/25580
+f 21650/28803/25580 29469/28804/25581 31545/28786/25563 29298/28785/25562
+f 21651/28805/25582 21655/28806/25583 21656/28807/25584 21652/28808/25585
+f 21652/28808/25585 21656/28807/25584 27912/28411/25192 27911/28407/25188
+f 21655/28806/25583 29303/28796/25573 29302/28795/25572 21656/28807/25584
+f 21656/28807/25584 29302/28795/25572 31494/28393/25174 27912/28411/25192
+f 21651/28805/25582 21652/28808/25585 21657/28809/25586 21653/28810/25587
+f 21653/28810/25587 21657/28809/25586 29308/28811/25588 29309/28812/25589
+f 21652/28808/25585 27911/28407/25188 27910/28406/25187 21657/28809/25586
+f 21657/28809/25586 27910/28406/25187 31495/28409/25190 29308/28811/25588
+f 21651/28805/25582 21653/28810/25587 21658/28813/25590 21654/28814/25591
+f 21654/28814/25591 21658/28813/25590 29461/28815/25592 29462/28816/25593
+f 21653/28810/25587 29309/28812/25589 29310/28817/25594 21658/28813/25590
+f 21658/28813/25590 29310/28817/25594 31543/28818/25595 29461/28815/25592
+f 21651/28805/25582 21654/28814/25591 21659/28819/25596 21655/28806/25583
+f 21655/28806/25583 21659/28819/25596 29304/28801/25578 29303/28796/25573
+f 21654/28814/25591 29462/28816/25593 29463/28820/25597 21659/28819/25596
+f 21659/28819/25596 29463/28820/25597 31544/28802/25579 29304/28801/25578
+f 21660/28821/25598 21664/28822/25599 21665/28823/25600 21661/28824/25601
+f 21661/28824/25601 21665/28823/25600 27915/28427/25208 27914/28423/25204
+f 21664/28822/25599 29309/28812/25589 29308/28811/25588 21665/28823/25600
+f 21665/28823/25600 29308/28811/25588 31495/28409/25190 27915/28427/25208
+f 21660/28821/25598 21661/28824/25601 21666/28825/25602 21662/28826/25603
+f 21662/28826/25603 21666/28825/25602 29314/28827/25604 29315/28828/25605
+f 21661/28824/25601 27914/28423/25204 27913/28422/25203 21666/28825/25602
+f 21666/28825/25602 27913/28422/25203 31496/28425/25206 29314/28827/25604
+f 21660/28821/25598 21662/28826/25603 21667/28829/25606 21663/28830/25607
+f 21663/28830/25607 21667/28829/25606 29455/28831/25608 29456/28832/25609
+f 21662/28826/25603 29315/28828/25605 29316/28833/25610 21667/28829/25606
+f 21667/28829/25606 29316/28833/25610 31542/28834/25611 29455/28831/25608
+f 21660/28821/25598 21663/28830/25607 21668/28835/25612 21664/28822/25599
+f 21664/28822/25599 21668/28835/25612 29310/28817/25594 29309/28812/25589
+f 21663/28830/25607 29456/28832/25609 29457/28836/25613 21668/28835/25612
+f 21668/28835/25612 29457/28836/25613 31543/28818/25595 29310/28817/25594
+f 21669/28837/25614 21673/28838/25615 21674/28839/25616 21670/28840/25617
+f 21670/28840/25617 21674/28839/25616 27918/28443/25224 27917/28439/25220
+f 21673/28838/25615 29315/28828/25605 29314/28827/25604 21674/28839/25616
+f 21674/28839/25616 29314/28827/25604 31496/28425/25206 27918/28443/25224
+f 21669/28837/25614 21670/28840/25617 21675/28841/25618 21671/28842/25619
+f 21671/28842/25619 21675/28841/25618 29320/28843/25620 29321/28844/25621
+f 21670/28840/25617 27917/28439/25220 27916/28438/25219 21675/28841/25618
+f 21675/28841/25618 27916/28438/25219 31497/28441/25222 29320/28843/25620
+f 21669/28837/25614 21671/28842/25619 21676/28845/25622 21672/28846/25623
+f 21672/28846/25623 21676/28845/25622 29449/28847/25624 29450/28848/25625
+f 21671/28842/25619 29321/28844/25621 29322/28849/25626 21676/28845/25622
+f 21676/28845/25622 29322/28849/25626 31541/28850/25627 29449/28847/25624
+f 21669/28837/25614 21672/28846/25623 21677/28851/25628 21673/28838/25615
+f 21673/28838/25615 21677/28851/25628 29316/28833/25610 29315/28828/25605
+f 21672/28846/25623 29450/28848/25625 29451/28852/25629 21677/28851/25628
+f 21677/28851/25628 29451/28852/25629 31542/28834/25611 29316/28833/25610
+f 21678/28853/25630 21682/28854/25631 21683/28855/25632 21679/28856/25633
+f 21679/28856/25633 21683/28855/25632 27921/28459/25240 27920/28455/25236
+f 21682/28854/25631 29321/28844/25621 29320/28843/25620 21683/28855/25632
+f 21683/28855/25632 29320/28843/25620 31497/28441/25222 27921/28459/25240
+f 21678/28853/25630 21679/28856/25633 21684/28857/25634 21680/28858/25635
+f 21680/28858/25635 21684/28857/25634 29326/28859/25636 29327/28860/25637
+f 21679/28856/25633 27920/28455/25236 27919/28454/25235 21684/28857/25634
+f 21684/28857/25634 27919/28454/25235 31498/28457/25238 29326/28859/25636
+f 21678/28853/25630 21680/28858/25635 21685/28861/25638 21681/28862/25639
+f 21681/28862/25639 21685/28861/25638 29443/28863/25640 29444/28864/25641
+f 21680/28858/25635 29327/28860/25637 29328/28865/25642 21685/28861/25638
+f 21685/28861/25638 29328/28865/25642 31540/28866/25643 29443/28863/25640
+f 21678/28853/25630 21681/28862/25639 21686/28867/25644 21682/28854/25631
+f 21682/28854/25631 21686/28867/25644 29322/28849/25626 29321/28844/25621
+f 21681/28862/25639 29444/28864/25641 29445/28868/25645 21686/28867/25644
+f 21686/28867/25644 29445/28868/25645 31541/28850/25627 29322/28849/25626
+f 21687/28869/25646 21691/28870/25647 21692/28871/25648 21688/28872/25649
+f 21688/28872/25649 21692/28871/25648 27924/28475/25256 27923/28471/25252
+f 21691/28870/25647 29327/28860/25637 29326/28859/25636 21692/28871/25648
+f 21692/28871/25648 29326/28859/25636 31498/28457/25238 27924/28475/25256
+f 21687/28869/25646 21688/28872/25649 21693/28873/25650 21689/28874/25651
+f 21689/28874/25651 21693/28873/25650 29332/28875/25652 29333/28876/25653
+f 21688/28872/25649 27923/28471/25252 27922/28470/25251 21693/28873/25650
+f 21693/28873/25650 27922/28470/25251 31499/28473/25254 29332/28875/25652
+f 21687/28869/25646 21689/28874/25651 21694/28877/25654 21690/28878/25655
+f 21690/28878/25655 21694/28877/25654 29437/28879/25656 29438/28880/25657
+f 21689/28874/25651 29333/28876/25653 29334/28881/25658 21694/28877/25654
+f 21694/28877/25654 29334/28881/25658 31539/28882/25659 29437/28879/25656
+f 21687/28869/25646 21690/28878/25655 21695/28883/25660 21691/28870/25647
+f 21691/28870/25647 21695/28883/25660 29328/28865/25642 29327/28860/25637
+f 21690/28878/25655 29438/28880/25657 29439/28884/25661 21695/28883/25660
+f 21695/28883/25660 29439/28884/25661 31540/28866/25643 29328/28865/25642
+f 21696/28885/25662 21700/28886/25663 21701/28887/25664 21697/28888/25665
+f 21697/28888/25665 21701/28887/25664 27927/28491/25272 27926/28487/25268
+f 21700/28886/25663 29333/28876/25653 29332/28875/25652 21701/28887/25664
+f 21701/28887/25664 29332/28875/25652 31499/28473/25254 27927/28491/25272
+f 21696/28885/25662 21697/28888/25665 21702/28889/25666 21698/28890/25667
+f 21698/28890/25667 21702/28889/25666 29338/28891/25668 29339/28892/25669
+f 21697/28888/25665 27926/28487/25268 27925/28486/25267 21702/28889/25666
+f 21702/28889/25666 27925/28486/25267 31500/28489/25270 29338/28891/25668
+f 21696/28885/25662 21698/28890/25667 21703/28893/25670 21699/28894/25671
+f 21699/28894/25671 21703/28893/25670 29431/28895/25672 29432/28896/25673
+f 21698/28890/25667 29339/28892/25669 29340/28897/25674 21703/28893/25670
+f 21703/28893/25670 29340/28897/25674 31538/28898/25675 29431/28895/25672
+f 21696/28885/25662 21699/28894/25671 21704/28899/25676 21700/28886/25663
+f 21700/28886/25663 21704/28899/25676 29334/28881/25658 29333/28876/25653
+f 21699/28894/25671 29432/28896/25673 29433/28900/25677 21704/28899/25676
+f 21704/28899/25676 29433/28900/25677 31539/28882/25659 29334/28881/25658
+f 21705/28901/25678 21709/28902/25679 21710/28903/25680 21706/28904/25681
+f 21706/28904/25681 21710/28903/25680 27930/28507/25288 27929/28503/25284
+f 21709/28902/25679 29339/28892/25669 29338/28891/25668 21710/28903/25680
+f 21710/28903/25680 29338/28891/25668 31500/28489/25270 27930/28507/25288
+f 21705/28901/25678 21706/28904/25681 21711/28905/25682 21707/28906/25683
+f 21707/28906/25683 21711/28905/25682 29344/28907/25684 29345/28908/25685
+f 21706/28904/25681 27929/28503/25284 27928/28502/25283 21711/28905/25682
+f 21711/28905/25682 27928/28502/25283 31501/28505/25286 29344/28907/25684
+f 21705/28901/25678 21707/28906/25683 21712/28909/25686 21708/28910/25687
+f 21708/28910/25687 21712/28909/25686 29425/28911/25688 29426/28912/25689
+f 21707/28906/25683 29345/28908/25685 29346/28913/25690 21712/28909/25686
+f 21712/28909/25686 29346/28913/25690 31537/28914/25691 29425/28911/25688
+f 21705/28901/25678 21708/28910/25687 21713/28915/25692 21709/28902/25679
+f 21709/28902/25679 21713/28915/25692 29340/28897/25674 29339/28892/25669
+f 21708/28910/25687 29426/28912/25689 29427/28916/25693 21713/28915/25692
+f 21713/28915/25692 29427/28916/25693 31538/28898/25675 29340/28897/25674
+f 21714/28917/25694 21718/28918/25695 21719/28919/25696 21715/28920/25697
+f 21715/28920/25697 21719/28919/25696 27933/28523/25304 27932/28519/25300
+f 21718/28918/25695 29345/28908/25685 29344/28907/25684 21719/28919/25696
+f 21719/28919/25696 29344/28907/25684 31501/28505/25286 27933/28523/25304
+f 21714/28917/25694 21715/28920/25697 21720/28921/25698 21716/28922/25699
+f 21716/28922/25699 21720/28921/25698 29350/28923/25700 29351/28924/25701
+f 21715/28920/25697 27932/28519/25300 27931/28518/25299 21720/28921/25698
+f 21720/28921/25698 27931/28518/25299 31502/28521/25302 29350/28923/25700
+f 21714/28917/25694 21716/28922/25699 21721/28925/25702 21717/28926/25703
+f 21717/28926/25703 21721/28925/25702 29419/28927/25704 29420/28928/25705
+f 21716/28922/25699 29351/28924/25701 29352/28929/25706 21721/28925/25702
+f 21721/28925/25702 29352/28929/25706 31536/28930/25707 29419/28927/25704
+f 21714/28917/25694 21717/28926/25703 21722/28931/25708 21718/28918/25695
+f 21718/28918/25695 21722/28931/25708 29346/28913/25690 29345/28908/25685
+f 21717/28926/25703 29420/28928/25705 29421/28932/25709 21722/28931/25708
+f 21722/28931/25708 29421/28932/25709 31537/28914/25691 29346/28913/25690
+f 21723/28933/25710 21727/28934/25711 21728/28935/25712 21724/28936/25713
+f 21724/28936/25713 21728/28935/25712 27936/28542/25320 27935/28537/25316
+f 21727/28934/25711 29351/28937/25701 29350/28938/25700 21728/28935/25712
+f 21728/28935/25712 29350/28938/25700 31502/28543/25302 27936/28542/25320
+f 21723/28933/25710 21724/28936/25713 21729/28939/25714 21725/28940/25715
+f 21725/28940/25715 21729/28939/25714 29356/28941/25716 29357/28942/25717
+f 21724/28936/25713 27935/28537/25316 27934/28536/25315 21729/28939/25714
+f 21729/28939/25714 27934/28536/25315 31503/28539/25318 29356/28941/25716
+f 21723/28933/25710 21725/28940/25715 21730/28943/25718 21726/28944/25719
+f 21726/28944/25719 21730/28943/25718 29413/28945/25720 29414/28946/25721
+f 21725/28940/25715 29357/28942/25717 29358/28947/25722 21730/28943/25718
+f 21730/28943/25718 29358/28947/25722 31535/28948/25723 29413/28945/25720
+f 21723/28933/25710 21726/28944/25719 21731/28949/25724 21727/28934/25711
+f 21727/28934/25711 21731/28949/25724 29352/28950/25706 29351/28937/25701
+f 21726/28944/25719 29414/28946/25721 29415/28951/25725 21731/28949/25724
+f 21731/28949/25724 29415/28951/25725 31536/28952/25707 29352/28950/25706
+f 21732/28953/25726 21736/28954/25727 21737/28955/25728 21733/28956/25729
+f 21733/28956/25729 21737/28955/25728 27939/28559/25336 27938/28555/25332
+f 21736/28954/25727 29357/28942/25717 29356/28941/25716 21737/28955/25728
+f 21737/28955/25728 29356/28941/25716 31503/28539/25318 27939/28559/25336
+f 21732/28953/25726 21733/28956/25729 21738/28957/25730 21734/28958/25731
+f 21734/28958/25731 21738/28957/25730 29362/28959/25732 29363/28960/25733
+f 21733/28956/25729 27938/28555/25332 27937/28554/25331 21738/28957/25730
+f 21738/28957/25730 27937/28554/25331 31504/28557/25334 29362/28959/25732
+f 21732/28953/25726 21734/28958/25731 21739/28961/25734 21735/28962/25735
+f 21735/28962/25735 21739/28961/25734 29407/28963/25736 29408/28964/25737
+f 21734/28958/25731 29363/28960/25733 29364/28965/25738 21739/28961/25734
+f 21739/28961/25734 29364/28965/25738 31534/28966/25739 29407/28963/25736
+f 21732/28953/25726 21735/28962/25735 21740/28967/25740 21736/28954/25727
+f 21736/28954/25727 21740/28967/25740 29358/28947/25722 29357/28942/25717
+f 21735/28962/25735 29408/28964/25737 29409/28968/25741 21740/28967/25740
+f 21740/28967/25740 29409/28968/25741 31535/28948/25723 29358/28947/25722
+f 21741/28969/25742 21745/28970/25743 21746/28971/25744 21742/28972/25745
+f 21742/28972/25745 21746/28971/25744 27942/28575/25352 27941/28571/25348
+f 21745/28970/25743 29363/28960/25733 29362/28959/25732 21746/28971/25744
+f 21746/28971/25744 29362/28959/25732 31504/28557/25334 27942/28575/25352
+f 21741/28969/25742 21742/28972/25745 21747/28973/25746 21743/28974/25747
+f 21743/28974/25747 21747/28973/25746 29368/28975/25748 29369/28976/25749
+f 21742/28972/25745 27941/28571/25348 27940/28570/25347 21747/28973/25746
+f 21747/28973/25746 27940/28570/25347 31505/28573/25350 29368/28975/25748
+f 21741/28969/25742 21743/28974/25747 21748/28977/25750 21744/28978/25751
+f 21744/28978/25751 21748/28977/25750 29401/28979/25752 29402/28980/25753
+f 21743/28974/25747 29369/28976/25749 29370/28981/25754 21748/28977/25750
+f 21748/28977/25750 29370/28981/25754 31533/28982/25755 29401/28979/25752
+f 21741/28969/25742 21744/28978/25751 21749/28983/25756 21745/28970/25743
+f 21745/28970/25743 21749/28983/25756 29364/28965/25738 29363/28960/25733
+f 21744/28978/25751 29402/28980/25753 29403/28984/25757 21749/28983/25756
+f 21749/28983/25756 29403/28984/25757 31534/28966/25739 29364/28965/25738
+f 21750/28985/25758 21754/28986/25759 21755/28987/25760 21751/28988/25761
+f 21751/28988/25761 21755/28987/25760 27945/28591/25368 27944/28587/25364
+f 21754/28986/25759 29369/28976/25749 29368/28975/25748 21755/28987/25760
+f 21755/28987/25760 29368/28975/25748 31505/28573/25350 27945/28591/25368
+f 21750/28985/25758 21751/28988/25761 21756/28989/25762 21752/28990/25763
+f 21752/28990/25763 21756/28989/25762 29374/28991/25764 29375/28992/25765
+f 21751/28988/25761 27944/28587/25364 27943/28586/25363 21756/28989/25762
+f 21756/28989/25762 27943/28586/25363 31506/28589/25366 29374/28991/25764
+f 21750/28985/25758 21752/28990/25763 21757/28993/25766 21753/28994/25767
+f 21753/28994/25767 21757/28993/25766 29536/28995/25768 29537/28996/25769
+f 21752/28990/25763 29375/28992/25765 29376/28997/25770 21757/28993/25766
+f 21757/28993/25766 29376/28997/25770 31556/28998/25771 29536/28995/25768
+f 21750/28985/25758 21753/28994/25767 21758/28999/25772 21754/28986/25759
+f 21754/28986/25759 21758/28999/25772 29370/28981/25754 29369/28976/25749
+f 21753/28994/25767 29537/28996/25769 29538/29000/25773 21758/28999/25772
+f 21758/28999/25772 29538/29000/25773 31533/28982/25755 29370/28981/25754
+f 21759/29001/25774 21763/29002/25775 21764/29003/25776 21760/29004/25777
+f 21760/29004/25777 21764/29003/25776 27948/28607/25384 27947/28603/25380
+f 21763/29002/25775 29375/28992/25765 29374/28991/25764 21764/29003/25776
+f 21764/29003/25776 29374/28991/25764 31506/28589/25366 27948/28607/25384
+f 21759/29001/25774 21760/29004/25777 21765/29005/25778 21761/29006/25779
+f 21761/29006/25779 21765/29005/25778 29380/29007/25780 29381/29008/25781
+f 21760/29004/25777 27947/28603/25380 27946/28602/25379 21765/29005/25778
+f 21765/29005/25778 27946/28602/25379 31507/28605/25382 29380/29007/25780
+f 21759/29001/25774 21761/29006/25779 21766/29009/25782 21762/29010/25783
+f 21762/29010/25783 21766/29009/25782 29533/29011/25784 29534/29012/25785
+f 21761/29006/25779 29381/29008/25781 29382/29013/25786 21766/29009/25782
+f 21766/29009/25782 29382/29013/25786 31555/29014/25787 29533/29011/25784
+f 21759/29001/25774 21762/29010/25783 21767/29015/25788 21763/29002/25775
+f 21763/29002/25775 21767/29015/25788 29376/28997/25770 29375/28992/25765
+f 21762/29010/25783 29534/29012/25785 29535/29016/25789 21767/29015/25788
+f 21767/29015/25788 29535/29016/25789 31556/28998/25771 29376/28997/25770
+f 21768/29017/25790 21772/29018/25791 21773/29019/25792 21769/29020/25793
+f 21769/29020/25793 21773/29019/25792 27951/28623/25400 27950/28619/25396
+f 21772/29018/25791 29381/29008/25781 29380/29007/25780 21773/29019/25792
+f 21773/29019/25792 29380/29007/25780 31507/28605/25382 27951/28623/25400
+f 21768/29017/25790 21769/29020/25793 21774/29021/25794 21770/29022/25795
+f 21770/29022/25795 21774/29021/25794 29386/29023/25796 29387/29024/25797
+f 21769/29020/25793 27950/28619/25396 27949/28618/25395 21774/29021/25794
+f 21774/29021/25794 27949/28618/25395 31508/28621/25398 29386/29023/25796
+f 21768/29017/25790 21770/29022/25795 21775/29025/25798 21771/29026/25799
+f 21771/29026/25799 21775/29025/25798 29527/29027/25800 29528/29028/25801
+f 21770/29022/25795 29387/29024/25797 29388/29029/25802 21775/29025/25798
+f 21775/29025/25798 29388/29029/25802 31554/29030/25803 29527/29027/25800
+f 21768/29017/25790 21771/29026/25799 21776/29031/25804 21772/29018/25791
+f 21772/29018/25791 21776/29031/25804 29382/29013/25786 29381/29008/25781
+f 21771/29026/25799 29528/29028/25801 29529/29032/25805 21776/29031/25804
+f 21776/29031/25804 29529/29032/25805 31555/29014/25787 29382/29013/25786
+f 21777/29033/25806 21781/29034/25807 21782/29035/25808 21778/29036/25809
+f 21778/29036/25809 21782/29035/25808 27954/28635/25412 27953/28633/25410
+f 21781/29034/25807 29387/29024/25797 29386/29023/25796 21782/29035/25808
+f 21782/29035/25808 29386/29023/25796 31508/28621/25398 27954/28635/25412
+f 21777/29033/25806 21778/29036/25809 21783/29037/25810 21779/29038/25811
+f 21779/29038/25811 21783/29037/25810 29253/28662/25439 29252/28661/25438
+f 21778/29036/25809 27953/28633/25410 27952/28632/25409 21783/29037/25810
+f 21783/29037/25810 27952/28632/25409 31485/28267/25048 29253/28662/25439
+f 21777/29033/25806 21779/29038/25811 21784/29039/25812 21780/29040/25813
+f 21780/29040/25813 21784/29039/25812 29521/29041/25814 29522/29042/25815
+f 21779/29038/25811 29252/28661/25438 29251/28674/25451 21784/29039/25812
+f 21784/29039/25812 29251/28674/25451 31553/28676/25453 29521/29041/25814
+f 21777/29033/25806 21780/29040/25813 21785/29043/25816 21781/29034/25807
+f 21781/29034/25807 21785/29043/25816 29388/29029/25802 29387/29024/25797
+f 21780/29040/25813 29522/29042/25815 29523/29044/25817 21785/29043/25816
+f 21785/29043/25816 29523/29044/25817 31554/29030/25803 29388/29029/25802
+f 21786/29045/25818 21790/29046/25819 21791/29047/25820 21787/29048/25821
+f 21787/29048/25821 21791/29047/25820 29403/28984/25757 29402/28980/25753
+f 21790/29046/25819 29399/29049/25822 29400/29050/25823 21791/29047/25820
+f 21791/29047/25820 29400/29050/25823 31534/28966/25739 29403/28984/25757
+f 21786/29045/25818 21787/29048/25821 21792/29051/25824 21788/29052/25825
+f 21788/29052/25825 21792/29051/25824 29395/29053/25826 29396/29054/25827
+f 21787/29048/25821 29402/28980/25753 29401/28979/25752 21792/29051/25824
+f 21792/29051/25824 29401/28979/25752 31533/28982/25755 29395/29053/25826
+f 21786/29045/25818 21788/29052/25825 21793/29055/25828 21789/29056/25829
+f 21789/29056/25829 21793/29055/25828 29371/29057/25830 29372/29058/25831
+f 21788/29052/25825 29396/29054/25827 29397/29059/25832 21793/29055/25828
+f 21793/29055/25828 29397/29059/25832 31529/29060/25833 29371/29057/25830
+f 21786/29045/25818 21789/29056/25829 21794/29061/25834 21790/29046/25819
+f 21790/29046/25819 21794/29061/25834 29398/29062/25835 29399/29049/25822
+f 21789/29056/25829 29372/29058/25831 29373/29063/25836 21794/29061/25834
+f 21794/29061/25834 29373/29063/25836 31528/29064/25837 29398/29062/25835
+f 21795/29065/25838 21799/29066/25839 21800/29067/25840 21796/29068/25841
+f 21796/29068/25841 21800/29067/25840 29409/28968/25741 29408/28964/25737
+f 21799/29066/25839 29405/29069/25842 29406/29070/25843 21800/29067/25840
+f 21800/29067/25840 29406/29070/25843 31535/28948/25723 29409/28968/25741
+f 21795/29065/25838 21796/29068/25841 21801/29071/25844 21797/29072/25845
+f 21797/29072/25845 21801/29071/25844 29400/29050/25823 29399/29049/25822
+f 21796/29068/25841 29408/28964/25737 29407/28963/25736 21801/29071/25844
+f 21801/29071/25844 29407/28963/25736 31534/28966/25739 29400/29050/25823
+f 21795/29065/25838 21797/29072/25845 21802/29073/25846 21798/29074/25847
+f 21798/29074/25847 21802/29073/25846 29365/29075/25848 29366/29076/25849
+f 21797/29072/25845 29399/29049/25822 29398/29062/25835 21802/29073/25846
+f 21802/29073/25846 29398/29062/25835 31528/29064/25837 29365/29075/25848
+f 21795/29065/25838 21798/29074/25847 21803/29077/25850 21799/29066/25839
+f 21799/29066/25839 21803/29077/25850 29404/29078/25851 29405/29069/25842
+f 21798/29074/25847 29366/29076/25849 29367/29079/25852 21803/29077/25850
+f 21803/29077/25850 29367/29079/25852 31527/29080/25853 29404/29078/25851
+f 21804/29081/25854 21808/29082/25855 21809/29083/25856 21805/29084/25857
+f 21805/29084/25857 21809/29083/25856 29415/28951/25725 29414/28946/25721
+f 21808/29082/25855 29411/29085/25858 29412/29086/25859 21809/29083/25856
+f 21809/29083/25856 29412/29086/25859 31536/28952/25707 29415/28951/25725
+f 21804/29081/25854 21805/29084/25857 21810/29087/25860 21806/29088/25861
+f 21806/29088/25861 21810/29087/25860 29406/29070/25843 29405/29069/25842
+f 21805/29084/25857 29414/28946/25721 29413/28945/25720 21810/29087/25860
+f 21810/29087/25860 29413/28945/25720 31535/28948/25723 29406/29070/25843
+f 21804/29081/25854 21806/29088/25861 21811/29089/25862 21807/29090/25863
+f 21807/29090/25863 21811/29089/25862 29359/29091/25864 29360/29092/25865
+f 21806/29088/25861 29405/29069/25842 29404/29078/25851 21811/29089/25862
+f 21811/29089/25862 29404/29078/25851 31527/29080/25853 29359/29091/25864
+f 21804/29081/25854 21807/29090/25863 21812/29093/25866 21808/29082/25855
+f 21808/29082/25855 21812/29093/25866 29410/29094/25867 29411/29085/25858
+f 21807/29090/25863 29360/29092/25865 29361/29095/25868 21812/29093/25866
+f 21812/29093/25866 29361/29095/25868 31526/29096/25869 29410/29094/25867
+f 21813/29097/25870 21817/29098/25871 21818/29099/25872 21814/29100/25873
+f 21814/29100/25873 21818/29099/25872 29421/28932/25709 29420/28928/25705
+f 21817/29098/25871 29417/29101/25874 29418/29102/25875 21818/29099/25872
+f 21818/29099/25872 29418/29102/25875 31537/28914/25691 29421/28932/25709
+f 21813/29097/25870 21814/29100/25873 21819/29103/25876 21815/29104/25877
+f 21815/29104/25877 21819/29103/25876 29412/29105/25859 29411/29106/25858
+f 21814/29100/25873 29420/28928/25705 29419/28927/25704 21819/29103/25876
+f 21819/29103/25876 29419/28927/25704 31536/28930/25707 29412/29105/25859
+f 21813/29097/25870 21815/29104/25877 21820/29107/25878 21816/29108/25879
+f 21816/29108/25879 21820/29107/25878 29353/29109/25880 29354/29110/25881
+f 21815/29104/25877 29411/29106/25858 29410/29111/25867 21820/29107/25878
+f 21820/29107/25878 29410/29111/25867 31526/29112/25869 29353/29109/25880
+f 21813/29097/25870 21816/29108/25879 21821/29113/25882 21817/29098/25871
+f 21817/29098/25871 21821/29113/25882 29416/29114/25883 29417/29101/25874
+f 21816/29108/25879 29354/29110/25881 29355/29115/25884 21821/29113/25882
+f 21821/29113/25882 29355/29115/25884 31525/29116/25885 29416/29114/25883
+f 21822/29117/25886 21826/29118/25887 21827/29119/25888 21823/29120/25889
+f 21823/29120/25889 21827/29119/25888 29427/28916/25693 29426/28912/25689
+f 21826/29118/25887 29423/29121/25890 29424/29122/25891 21827/29119/25888
+f 21827/29119/25888 29424/29122/25891 31538/28898/25675 29427/28916/25693
+f 21822/29117/25886 21823/29120/25889 21828/29123/25892 21824/29124/25893
+f 21824/29124/25893 21828/29123/25892 29418/29102/25875 29417/29101/25874
+f 21823/29120/25889 29426/28912/25689 29425/28911/25688 21828/29123/25892
+f 21828/29123/25892 29425/28911/25688 31537/28914/25691 29418/29102/25875
+f 21822/29117/25886 21824/29124/25893 21829/29125/25894 21825/29126/25895
+f 21825/29126/25895 21829/29125/25894 29347/29127/25896 29348/29128/25897
+f 21824/29124/25893 29417/29101/25874 29416/29114/25883 21829/29125/25894
+f 21829/29125/25894 29416/29114/25883 31525/29116/25885 29347/29127/25896
+f 21822/29117/25886 21825/29126/25895 21830/29129/25898 21826/29118/25887
+f 21826/29118/25887 21830/29129/25898 29422/29130/25899 29423/29121/25890
+f 21825/29126/25895 29348/29128/25897 29349/29131/25900 21830/29129/25898
+f 21830/29129/25898 29349/29131/25900 31524/29132/25901 29422/29130/25899
+f 21831/29133/25902 21835/29134/25903 21836/29135/25904 21832/29136/25905
+f 21832/29136/25905 21836/29135/25904 29433/28900/25677 29432/28896/25673
+f 21835/29134/25903 29429/29137/25906 29430/29138/25907 21836/29135/25904
+f 21836/29135/25904 29430/29138/25907 31539/28882/25659 29433/28900/25677
+f 21831/29133/25902 21832/29136/25905 21837/29139/25908 21833/29140/25909
+f 21833/29140/25909 21837/29139/25908 29424/29122/25891 29423/29121/25890
+f 21832/29136/25905 29432/28896/25673 29431/28895/25672 21837/29139/25908
+f 21837/29139/25908 29431/28895/25672 31538/28898/25675 29424/29122/25891
+f 21831/29133/25902 21833/29140/25909 21838/29141/25910 21834/29142/25911
+f 21834/29142/25911 21838/29141/25910 29341/29143/25912 29342/29144/25913
+f 21833/29140/25909 29423/29121/25890 29422/29130/25899 21838/29141/25910
+f 21838/29141/25910 29422/29130/25899 31524/29132/25901 29341/29143/25912
+f 21831/29133/25902 21834/29142/25911 21839/29145/25914 21835/29134/25903
+f 21835/29134/25903 21839/29145/25914 29428/29146/25915 29429/29137/25906
+f 21834/29142/25911 29342/29144/25913 29343/29147/25916 21839/29145/25914
+f 21839/29145/25914 29343/29147/25916 31523/29148/25917 29428/29146/25915
+f 21840/29149/25918 21844/29150/25919 21845/29151/25920 21841/29152/25921
+f 21841/29152/25921 21845/29151/25920 29439/28884/25661 29438/28880/25657
+f 21844/29150/25919 29435/29153/25922 29436/29154/25923 21845/29151/25920
+f 21845/29151/25920 29436/29154/25923 31540/28866/25643 29439/28884/25661
+f 21840/29149/25918 21841/29152/25921 21846/29155/25924 21842/29156/25925
+f 21842/29156/25925 21846/29155/25924 29430/29138/25907 29429/29137/25906
+f 21841/29152/25921 29438/28880/25657 29437/28879/25656 21846/29155/25924
+f 21846/29155/25924 29437/28879/25656 31539/28882/25659 29430/29138/25907
+f 21840/29149/25918 21842/29156/25925 21847/29157/25926 21843/29158/25927
+f 21843/29158/25927 21847/29157/25926 29335/29159/25928 29336/29160/25929
+f 21842/29156/25925 29429/29137/25906 29428/29146/25915 21847/29157/25926
+f 21847/29157/25926 29428/29146/25915 31523/29148/25917 29335/29159/25928
+f 21840/29149/25918 21843/29158/25927 21848/29161/25930 21844/29150/25919
+f 21844/29150/25919 21848/29161/25930 29434/29162/25931 29435/29153/25922
+f 21843/29158/25927 29336/29160/25929 29337/29163/25932 21848/29161/25930
+f 21848/29161/25930 29337/29163/25932 31522/29164/25933 29434/29162/25931
+f 21849/29165/25934 21853/29166/25935 21854/29167/25936 21850/29168/25937
+f 21850/29168/25937 21854/29167/25936 29445/28868/25645 29444/28864/25641
+f 21853/29166/25935 29441/29169/25938 29442/29170/25939 21854/29167/25936
+f 21854/29167/25936 29442/29170/25939 31541/28850/25627 29445/28868/25645
+f 21849/29165/25934 21850/29168/25937 21855/29171/25940 21851/29172/25941
+f 21851/29172/25941 21855/29171/25940 29436/29154/25923 29435/29153/25922
+f 21850/29168/25937 29444/28864/25641 29443/28863/25640 21855/29171/25940
+f 21855/29171/25940 29443/28863/25640 31540/28866/25643 29436/29154/25923
+f 21849/29165/25934 21851/29172/25941 21856/29173/25942 21852/29174/25943
+f 21852/29174/25943 21856/29173/25942 29329/29175/25944 29330/29176/25945
+f 21851/29172/25941 29435/29153/25922 29434/29162/25931 21856/29173/25942
+f 21856/29173/25942 29434/29162/25931 31522/29164/25933 29329/29175/25944
+f 21849/29165/25934 21852/29174/25943 21857/29177/25946 21853/29166/25935
+f 21853/29166/25935 21857/29177/25946 29440/29178/25947 29441/29169/25938
+f 21852/29174/25943 29330/29176/25945 29331/29179/25948 21857/29177/25946
+f 21857/29177/25946 29331/29179/25948 31521/29180/25949 29440/29178/25947
+f 21858/29181/25950 21862/29182/25951 21863/29183/25952 21859/29184/25953
+f 21859/29184/25953 21863/29183/25952 29451/28852/25629 29450/28848/25625
+f 21862/29182/25951 29447/29185/25954 29448/29186/25955 21863/29183/25952
+f 21863/29183/25952 29448/29186/25955 31542/28834/25611 29451/28852/25629
+f 21858/29181/25950 21859/29184/25953 21864/29187/25956 21860/29188/25957
+f 21860/29188/25957 21864/29187/25956 29442/29170/25939 29441/29169/25938
+f 21859/29184/25953 29450/28848/25625 29449/28847/25624 21864/29187/25956
+f 21864/29187/25956 29449/28847/25624 31541/28850/25627 29442/29170/25939
+f 21858/29181/25950 21860/29188/25957 21865/29189/25958 21861/29190/25959
+f 21861/29190/25959 21865/29189/25958 29323/29191/25960 29324/29192/25961
+f 21860/29188/25957 29441/29169/25938 29440/29178/25947 21865/29189/25958
+f 21865/29189/25958 29440/29178/25947 31521/29180/25949 29323/29191/25960
+f 21858/29181/25950 21861/29190/25959 21866/29193/25962 21862/29182/25951
+f 21862/29182/25951 21866/29193/25962 29446/29194/25963 29447/29185/25954
+f 21861/29190/25959 29324/29192/25961 29325/29195/25964 21866/29193/25962
+f 21866/29193/25962 29325/29195/25964 31520/29196/25965 29446/29194/25963
+f 21867/29197/25966 21871/29198/25967 21872/29199/25968 21868/29200/25969
+f 21868/29200/25969 21872/29199/25968 29457/28836/25613 29456/28832/25609
+f 21871/29198/25967 29453/29201/25970 29454/29202/25971 21872/29199/25968
+f 21872/29199/25968 29454/29202/25971 31543/28818/25595 29457/28836/25613
+f 21867/29197/25966 21868/29200/25969 21873/29203/25972 21869/29204/25973
+f 21869/29204/25973 21873/29203/25972 29448/29186/25955 29447/29185/25954
+f 21868/29200/25969 29456/28832/25609 29455/28831/25608 21873/29203/25972
+f 21873/29203/25972 29455/28831/25608 31542/28834/25611 29448/29186/25955
+f 21867/29197/25966 21869/29204/25973 21874/29205/25974 21870/29206/25975
+f 21870/29206/25975 21874/29205/25974 29317/29207/25976 29318/29208/25977
+f 21869/29204/25973 29447/29185/25954 29446/29194/25963 21874/29205/25974
+f 21874/29205/25974 29446/29194/25963 31520/29196/25965 29317/29207/25976
+f 21867/29197/25966 21870/29206/25975 21875/29209/25978 21871/29198/25967
+f 21871/29198/25967 21875/29209/25978 29452/29210/25979 29453/29201/25970
+f 21870/29206/25975 29318/29208/25977 29319/29211/25980 21875/29209/25978
+f 21875/29209/25978 29319/29211/25980 31519/29212/25981 29452/29210/25979
+f 21876/29213/25982 21880/29214/25983 21881/29215/25984 21877/29216/25985
+f 21877/29216/25985 21881/29215/25984 29463/28820/25597 29462/28816/25593
+f 21880/29214/25983 29459/29217/25986 29460/29218/25987 21881/29215/25984
+f 21881/29215/25984 29460/29218/25987 31544/28802/25579 29463/28820/25597
+f 21876/29213/25982 21877/29216/25985 21882/29219/25988 21878/29220/25989
+f 21878/29220/25989 21882/29219/25988 29454/29202/25971 29453/29201/25970
+f 21877/29216/25985 29462/28816/25593 29461/28815/25592 21882/29219/25988
+f 21882/29219/25988 29461/28815/25592 31543/28818/25595 29454/29202/25971
+f 21876/29213/25982 21878/29220/25989 21883/29221/25990 21879/29222/25991
+f 21879/29222/25991 21883/29221/25990 29311/29223/25992 29312/29224/25993
+f 21878/29220/25989 29453/29201/25970 29452/29210/25979 21883/29221/25990
+f 21883/29221/25990 29452/29210/25979 31519/29212/25981 29311/29223/25992
+f 21876/29213/25982 21879/29222/25991 21884/29225/25994 21880/29214/25983
+f 21880/29214/25983 21884/29225/25994 29458/29226/25995 29459/29217/25986
+f 21879/29222/25991 29312/29224/25993 29313/29227/25996 21884/29225/25994
+f 21884/29225/25994 29313/29227/25996 31518/29228/25997 29458/29226/25995
+f 21885/29229/25998 21889/29230/25999 21890/29231/26000 21886/29232/26001
+f 21886/29232/26001 21890/29231/26000 29469/28804/25581 29468/28800/25577
+f 21889/29230/25999 29465/29233/26002 29466/29234/26003 21890/29231/26000
+f 21890/29231/26000 29466/29234/26003 31545/28786/25563 29469/28804/25581
+f 21885/29229/25998 21886/29232/26001 21891/29235/26004 21887/29236/26005
+f 21887/29236/26005 21891/29235/26004 29460/29218/25987 29459/29217/25986
+f 21886/29232/26001 29468/28800/25577 29467/28799/25576 21891/29235/26004
+f 21891/29235/26004 29467/28799/25576 31544/28802/25579 29460/29218/25987
+f 21885/29229/25998 21887/29236/26005 21892/29237/26006 21888/29238/26007
+f 21888/29238/26007 21892/29237/26006 29305/29239/26008 29306/29240/26009
+f 21887/29236/26005 29459/29217/25986 29458/29226/25995 21892/29237/26006
+f 21892/29237/26006 29458/29226/25995 31518/29228/25997 29305/29239/26008
+f 21885/29229/25998 21888/29238/26007 21893/29241/26010 21889/29230/25999
+f 21889/29230/25999 21893/29241/26010 29464/29242/26011 29465/29233/26002
+f 21888/29238/26007 29306/29240/26009 29307/29243/26012 21893/29241/26010
+f 21893/29241/26010 29307/29243/26012 31517/29244/26013 29464/29242/26011
+f 21894/29245/26014 21898/29246/26015 21899/29247/26016 21895/29248/26017
+f 21895/29248/26017 21899/29247/26016 29475/28788/25565 29474/28784/25561
+f 21898/29246/26015 29471/29249/26018 29472/29250/26019 21899/29247/26016
+f 21899/29247/26016 29472/29250/26019 31546/28770/25547 29475/28788/25565
+f 21894/29245/26014 21895/29248/26017 21900/29251/26020 21896/29252/26021
+f 21896/29252/26021 21900/29251/26020 29466/29234/26003 29465/29233/26002
+f 21895/29248/26017 29474/28784/25561 29473/28783/25560 21900/29251/26020
+f 21900/29251/26020 29473/28783/25560 31545/28786/25563 29466/29234/26003
+f 21894/29245/26014 21896/29252/26021 21901/29253/26022 21897/29254/26023
+f 21897/29254/26023 21901/29253/26022 29299/29255/26024 29300/29256/26025
+f 21896/29252/26021 29465/29233/26002 29464/29242/26011 21901/29253/26022
+f 21901/29253/26022 29464/29242/26011 31517/29244/26013 29299/29255/26024
+f 21894/29245/26014 21897/29254/26023 21902/29257/26026 21898/29246/26015
+f 21898/29246/26015 21902/29257/26026 29470/29258/26027 29471/29249/26018
+f 21897/29254/26023 29300/29256/26025 29301/29259/26028 21902/29257/26026
+f 21902/29257/26026 29301/29259/26028 31516/29260/26029 29470/29258/26027
+f 21903/29261/26030 21907/29262/26031 21908/29263/26032 21904/29264/26033
+f 21904/29264/26033 21908/29263/26032 29481/28772/25549 29480/28768/25545
+f 21907/29262/26031 29477/29265/26034 29478/29266/26035 21908/29263/26032
+f 21908/29263/26032 29478/29266/26035 31547/28754/25531 29481/28772/25549
+f 21903/29261/26030 21904/29264/26033 21909/29267/26036 21905/29268/26037
+f 21905/29268/26037 21909/29267/26036 29472/29250/26019 29471/29249/26018
+f 21904/29264/26033 29480/28768/25545 29479/28767/25544 21909/29267/26036
+f 21909/29267/26036 29479/28767/25544 31546/28770/25547 29472/29250/26019
+f 21903/29261/26030 21905/29268/26037 21910/29269/26038 21906/29270/26039
+f 21906/29270/26039 21910/29269/26038 29293/29271/26040 29294/29272/26041
+f 21905/29268/26037 29471/29249/26018 29470/29258/26027 21910/29269/26038
+f 21910/29269/26038 29470/29258/26027 31516/29260/26029 29293/29271/26040
+f 21903/29261/26030 21906/29270/26039 21911/29273/26042 21907/29262/26031
+f 21907/29262/26031 21911/29273/26042 29476/29274/26043 29477/29265/26034
+f 21906/29270/26039 29294/29272/26041 29295/29275/26044 21911/29273/26042
+f 21911/29273/26042 29295/29275/26044 31515/29276/26045 29476/29274/26043
+f 21912/29277/26046 21916/29278/26047 21917/29279/26048 21913/29280/26049
+f 21913/29280/26049 21917/29279/26048 29487/28756/25533 29486/28752/25529
+f 21916/29278/26047 29483/29281/26050 29484/29282/26051 21917/29279/26048
+f 21917/29279/26048 29484/29282/26051 31548/28738/25515 29487/28756/25533
+f 21912/29277/26046 21913/29280/26049 21918/29283/26052 21914/29284/26053
+f 21914/29284/26053 21918/29283/26052 29478/29266/26035 29477/29265/26034
+f 21913/29280/26049 29486/28752/25529 29485/28751/25528 21918/29283/26052
+f 21918/29283/26052 29485/28751/25528 31547/28754/25531 29478/29266/26035
+f 21912/29277/26046 21914/29284/26053 21919/29285/26054 21915/29286/26055
+f 21915/29286/26055 21919/29285/26054 29287/29287/26056 29288/29288/26057
+f 21914/29284/26053 29477/29265/26034 29476/29274/26043 21919/29285/26054
+f 21919/29285/26054 29476/29274/26043 31515/29276/26045 29287/29287/26056
+f 21912/29277/26046 21915/29286/26055 21920/29289/26058 21916/29278/26047
+f 21916/29278/26047 21920/29289/26058 29482/29290/26059 29483/29281/26050
+f 21915/29286/26055 29288/29288/26057 29289/29291/26060 21920/29289/26058
+f 21920/29289/26058 29289/29291/26060 31514/29292/26061 29482/29290/26059
+f 21921/29293/26062 21925/29294/26063 21926/29295/26064 21922/29296/26065
+f 21922/29296/26065 21926/29295/26064 29493/28740/25517 29492/28736/25513
+f 21925/29294/26063 29489/29297/26066 29490/29298/26067 21926/29295/26064
+f 21926/29295/26064 29490/29298/26067 31549/28722/25499 29493/28740/25517
+f 21921/29293/26062 21922/29296/26065 21927/29299/26068 21923/29300/26069
+f 21923/29300/26069 21927/29299/26068 29484/29282/26051 29483/29281/26050
+f 21922/29296/26065 29492/28736/25513 29491/28735/25512 21927/29299/26068
+f 21927/29299/26068 29491/28735/25512 31548/28738/25515 29484/29282/26051
+f 21921/29293/26062 21923/29300/26069 21928/29301/26070 21924/29302/26071
+f 21924/29302/26071 21928/29301/26070 29281/29303/26072 29282/29304/26073
+f 21923/29300/26069 29483/29281/26050 29482/29290/26059 21928/29301/26070
+f 21928/29301/26070 29482/29290/26059 31514/29292/26061 29281/29303/26072
+f 21921/29293/26062 21924/29302/26071 21929/29305/26074 21925/29294/26063
+f 21925/29294/26063 21929/29305/26074 29488/29306/26075 29489/29297/26066
+f 21924/29302/26071 29282/29304/26073 29283/29307/26076 21929/29305/26074
+f 21929/29305/26074 29283/29307/26076 31513/29308/26077 29488/29306/26075
+f 21930/29309/26078 21934/29310/26079 21935/29311/26080 21931/29312/26081
+f 21931/29312/26081 21935/29311/26080 29499/28724/25501 29498/28720/25497
+f 21934/29310/26079 29495/29313/26082 29496/29314/26083 21935/29311/26080
+f 21935/29311/26080 29496/29314/26083 31550/28706/25483 29499/28724/25501
+f 21930/29309/26078 21931/29312/26081 21936/29315/26084 21932/29316/26085
+f 21932/29316/26085 21936/29315/26084 29490/29298/26067 29489/29297/26066
+f 21931/29312/26081 29498/28720/25497 29497/28719/25496 21936/29315/26084
+f 21936/29315/26084 29497/28719/25496 31549/28722/25499 29490/29298/26067
+f 21930/29309/26078 21932/29316/26085 21937/29317/26086 21933/29318/26087
+f 21933/29318/26087 21937/29317/26086 29275/29319/26088 29276/29320/26089
+f 21932/29316/26085 29489/29297/26066 29488/29306/26075 21937/29317/26086
+f 21937/29317/26086 29488/29306/26075 31513/29308/26077 29275/29319/26088
+f 21930/29309/26078 21933/29318/26087 21938/29321/26090 21934/29310/26079
+f 21934/29310/26079 21938/29321/26090 29494/29322/26091 29495/29313/26082
+f 21933/29318/26087 29276/29320/26089 29277/29323/26092 21938/29321/26090
+f 21938/29321/26090 29277/29323/26092 31512/29324/26093 29494/29322/26091
+f 21939/29325/26094 21943/29326/26095 21944/29327/26096 21940/29328/26097
+f 21940/29328/26097 21944/29327/26096 29505/28708/25485 29504/28704/25481
+f 21943/29326/26095 29501/29329/26098 29502/29330/26099 21944/29327/26096
+f 21944/29327/26096 29502/29330/26099 31551/28690/25467 29505/28708/25485
+f 21939/29325/26094 21940/29328/26097 21945/29331/26100 21941/29332/26101
+f 21941/29332/26101 21945/29331/26100 29496/29314/26083 29495/29313/26082
+f 21940/29328/26097 29504/28704/25481 29503/28703/25480 21945/29331/26100
+f 21945/29331/26100 29503/28703/25480 31550/28706/25483 29496/29314/26083
+f 21939/29325/26094 21941/29332/26101 21946/29333/26102 21942/29334/26103
+f 21942/29334/26103 21946/29333/26102 29269/29335/26104 29270/29336/26105
+f 21941/29332/26101 29495/29313/26082 29494/29322/26091 21946/29333/26102
+f 21946/29333/26102 29494/29322/26091 31512/29324/26093 29269/29335/26104
+f 21939/29325/26094 21942/29334/26103 21947/29337/26106 21943/29326/26095
+f 21943/29326/26095 21947/29337/26106 29500/29338/26107 29501/29329/26098
+f 21942/29334/26103 29270/29336/26105 29271/29339/26108 21947/29337/26106
+f 21947/29337/26106 29271/29339/26108 31511/29340/26109 29500/29338/26107
+f 21948/29341/26110 21952/29342/26111 21953/29343/26112 21949/29344/26113
+f 21949/29344/26113 21953/29343/26112 29511/28692/25469 29510/28688/25465
+f 21952/29342/26111 29507/29345/26114 29508/29346/26115 21953/29343/26112
+f 21953/29343/26112 29508/29346/26115 31552/28672/25449 29511/28692/25469
+f 21948/29341/26110 21949/29344/26113 21954/29347/26116 21950/29348/26117
+f 21950/29348/26117 21954/29347/26116 29502/29330/26099 29501/29329/26098
+f 21949/29344/26113 29510/28688/25465 29509/28687/25464 21954/29347/26116
+f 21954/29347/26116 29509/28687/25464 31551/28690/25467 29502/29330/26099
+f 21948/29341/26110 21950/29348/26117 21955/29349/26118 21951/29350/26119
+f 21951/29350/26119 21955/29349/26118 29263/29351/26120 29264/29352/26121
+f 21950/29348/26117 29501/29329/26098 29500/29338/26107 21955/29349/26118
+f 21955/29349/26118 29500/29338/26107 31511/29340/26109 29263/29351/26120
+f 21948/29341/26110 21951/29350/26119 21956/29353/26122 21952/29342/26111
+f 21952/29342/26111 21956/29353/26122 29506/29354/26123 29507/29345/26114
+f 21951/29350/26119 29264/29352/26121 29265/29355/26124 21956/29353/26122
+f 21956/29353/26122 29265/29355/26124 31510/29356/26125 29506/29354/26123
+f 21957/29357/26126 21961/29358/26127 21962/29359/26128 21958/29360/26129
+f 21958/29360/26129 21962/29359/26128 29517/28675/25452 29516/28670/25447
+f 21961/29358/26127 29513/29361/26130 29514/29362/26131 21962/29359/26128
+f 21962/29359/26128 29514/29362/26131 31553/28676/25453 29517/28675/25452
+f 21957/29357/26126 21958/29360/26129 21963/29363/26132 21959/29364/26133
+f 21959/29364/26133 21963/29363/26132 29508/29346/26115 29507/29345/26114
+f 21958/29360/26129 29516/28670/25447 29515/28669/25446 21963/29363/26132
+f 21963/29363/26132 29515/28669/25446 31552/28672/25449 29508/29346/26115
+f 21957/29357/26126 21959/29364/26133 21964/29365/26134 21960/29366/26135
+f 21960/29366/26135 21964/29365/26134 29257/29367/26136 29258/29368/26137
+f 21959/29364/26133 29507/29345/26114 29506/29354/26123 21964/29365/26134
+f 21964/29365/26134 29506/29354/26123 31510/29356/26125 29257/29367/26136
+f 21957/29357/26126 21960/29366/26135 21965/29369/26138 21961/29358/26127
+f 21961/29358/26127 21965/29369/26138 29512/29370/26139 29513/29361/26130
+f 21960/29366/26135 29258/29368/26137 29259/29371/26140 21965/29369/26138
+f 21965/29369/26138 29259/29371/26140 31509/29372/26141 29512/29370/26139
+f 21966/29373/26142 21970/29374/26143 21971/29375/26144 21967/29376/26145
+f 21967/29376/26145 21971/29375/26144 29523/29044/25817 29522/29042/25815
+f 21970/29374/26143 29519/29377/26146 29520/29378/26147 21971/29375/26144
+f 21971/29375/26144 29520/29378/26147 31554/29030/25803 29523/29044/25817
+f 21966/29373/26142 21967/29376/26145 21972/29379/26148 21968/29380/26149
+f 21968/29380/26149 21972/29379/26148 29514/29362/26131 29513/29361/26130
+f 21967/29376/26145 29522/29042/25815 29521/29041/25814 21972/29379/26148
+f 21972/29379/26148 29521/29041/25814 31553/28676/25453 29514/29362/26131
+f 21966/29373/26142 21968/29380/26149 21973/29381/26150 21969/29382/26151
+f 21969/29382/26151 21973/29381/26150 29392/29383/26152 29393/29384/26153
+f 21968/29380/26149 29513/29361/26130 29512/29370/26139 21973/29381/26150
+f 21973/29381/26150 29512/29370/26139 31509/29372/26141 29392/29383/26152
+f 21966/29373/26142 21969/29382/26151 21974/29385/26154 21970/29374/26143
+f 21970/29374/26143 21974/29385/26154 29518/29386/26155 29519/29377/26146
+f 21969/29382/26151 29393/29384/26153 29394/29387/26156 21974/29385/26154
+f 21974/29385/26154 29394/29387/26156 31532/29388/26157 29518/29386/26155
+f 21975/29389/26158 21979/29390/26159 21980/29391/26160 21976/29392/26161
+f 21976/29392/26161 21980/29391/26160 29529/29032/25805 29528/29028/25801
+f 21979/29390/26159 29525/29393/26162 29526/29394/26163 21980/29391/26160
+f 21980/29391/26160 29526/29394/26163 31555/29014/25787 29529/29032/25805
+f 21975/29389/26158 21976/29392/26161 21981/29395/26164 21977/29396/26165
+f 21977/29396/26165 21981/29395/26164 29520/29378/26147 29519/29377/26146
+f 21976/29392/26161 29528/29028/25801 29527/29027/25800 21981/29395/26164
+f 21981/29395/26164 29527/29027/25800 31554/29030/25803 29520/29378/26147
+f 21975/29389/26158 21977/29396/26165 21982/29397/26166 21978/29398/26167
+f 21978/29398/26167 21982/29397/26166 29389/29399/26168 29390/29400/26169
+f 21977/29396/26165 29519/29377/26146 29518/29386/26155 21982/29397/26166
+f 21982/29397/26166 29518/29386/26155 31532/29388/26157 29389/29399/26168
+f 21975/29389/26158 21978/29398/26167 21983/29401/26170 21979/29390/26159
+f 21979/29390/26159 21983/29401/26170 29524/29402/26171 29525/29393/26162
+f 21978/29398/26167 29390/29400/26169 29391/29403/26172 21983/29401/26170
+f 21983/29401/26170 29391/29403/26172 31531/29404/26173 29524/29402/26171
+f 21984/29405/26174 21988/29406/26175 21989/29407/26176 21985/29408/26177
+f 21985/29408/26177 21989/29407/26176 29535/29016/25789 29534/29012/25785
+f 21988/29406/26175 29531/29409/26178 29532/29410/26179 21989/29407/26176
+f 21989/29407/26176 29532/29410/26179 31556/28998/25771 29535/29016/25789
+f 21984/29405/26174 21985/29408/26177 21990/29411/26180 21986/29412/26181
+f 21986/29412/26181 21990/29411/26180 29526/29394/26163 29525/29393/26162
+f 21985/29408/26177 29534/29012/25785 29533/29011/25784 21990/29411/26180
+f 21990/29411/26180 29533/29011/25784 31555/29014/25787 29526/29394/26163
+f 21984/29405/26174 21986/29412/26181 21991/29413/26182 21987/29414/26183
+f 21987/29414/26183 21991/29413/26182 29383/29415/26184 29384/29416/26185
+f 21986/29412/26181 29525/29393/26162 29524/29402/26171 21991/29413/26182
+f 21991/29413/26182 29524/29402/26171 31531/29404/26173 29383/29415/26184
+f 21984/29405/26174 21987/29414/26183 21992/29417/26186 21988/29406/26175
+f 21988/29406/26175 21992/29417/26186 29530/29418/26187 29531/29409/26178
+f 21987/29414/26183 29384/29416/26185 29385/29419/26188 21992/29417/26186
+f 21992/29417/26186 29385/29419/26188 31530/29420/26189 29530/29418/26187
+f 21993/29421/26190 21997/29422/26191 21998/29423/26192 21994/29424/26193
+f 21994/29424/26193 21998/29423/26192 29538/29000/25773 29537/28996/25769
+f 21997/29422/26191 29396/29054/25827 29395/29053/25826 21998/29423/26192
+f 21998/29423/26192 29395/29053/25826 31533/28982/25755 29538/29000/25773
+f 21993/29421/26190 21994/29424/26193 21999/29425/26194 21995/29426/26195
+f 21995/29426/26195 21999/29425/26194 29532/29410/26179 29531/29409/26178
+f 21994/29424/26193 29537/28996/25769 29536/28995/25768 21999/29425/26194
+f 21999/29425/26194 29536/28995/25768 31556/28998/25771 29532/29410/26179
+f 21993/29421/26190 21995/29426/26195 22000/29427/26196 21996/29428/26197
+f 21996/29428/26197 22000/29427/26196 29377/29429/26198 29378/29430/26199
+f 21995/29426/26195 29531/29409/26178 29530/29418/26187 22000/29427/26196
+f 22000/29427/26196 29530/29418/26187 31530/29420/26189 29377/29429/26198
+f 21993/29421/26190 21996/29428/26197 22001/29431/26200 21997/29422/26191
+f 21997/29422/26191 22001/29431/26200 29397/29059/25832 29396/29054/25827
+f 21996/29428/26197 29378/29430/26199 29379/29432/26201 22001/29431/26200
+f 22001/29431/26200 29379/29432/26201 31529/29060/25833 29397/29059/25832
+f 22002/29433/26202 22006/29434/26203 22007/29435/26204 22003/29436/26205
+f 22003/29436/26205 22007/29435/26204 29547/27374/24166 29546/27372/24164
+f 22006/29434/26203 29543/29437/26206 29544/29438/26207 22007/29435/26204
+f 22007/29435/26204 29544/29438/26207 31558/27360/24152 29547/27374/24166
+f 22002/29433/26202 22003/29436/26205 22008/29439/26208 22004/29440/26209
+f 22004/29440/26209 22008/29439/26208 29539/29441/26210 29540/29442/26211
+f 22003/29436/26205 29546/27372/24164 29545/27371/24163 22008/29439/26208
+f 22008/29439/26208 29545/27371/24163 31557/27006/23802 29539/29441/26210
+f 22002/29433/26202 22004/29440/26209 22009/29443/26212 22005/29444/26213
+f 22005/29444/26213 22009/29443/26212 29923/29445/26214 29924/29446/26215
+f 22004/29440/26209 29540/29442/26211 29541/29447/26216 22009/29443/26212
+f 22009/29443/26212 29541/29447/26216 31620/29448/26217 29923/29445/26214
+f 22002/29433/26202 22005/29444/26213 22010/29449/26218 22006/29434/26203
+f 22006/29434/26203 22010/29449/26218 29542/29450/26219 29543/29437/26206
+f 22005/29444/26213 29924/29446/26215 29925/29451/26220 22010/29449/26218
+f 22010/29449/26218 29925/29451/26220 31621/29452/26221 29542/29450/26219
+f 22011/29453/26222 22015/29454/26223 22016/29455/26224 22012/29456/26225
+f 22012/29456/26225 22016/29455/26224 29553/27362/24154 29552/27358/24150
+f 22015/29454/26223 29549/29457/26226 29550/29458/26227 22016/29455/26224
+f 22016/29455/26224 29550/29458/26227 31559/27344/24136 29553/27362/24154
+f 22011/29453/26222 22012/29456/26225 22017/29459/26228 22013/29460/26229
+f 22013/29460/26229 22017/29459/26228 29544/29438/26207 29543/29437/26206
+f 22012/29456/26225 29552/27358/24150 29551/27357/24149 22017/29459/26228
+f 22017/29459/26228 29551/27357/24149 31558/27360/24152 29544/29438/26207
+f 22011/29453/26222 22013/29460/26229 22018/29461/26230 22014/29462/26231
+f 22014/29462/26231 22018/29461/26230 29929/29463/26232 29930/29464/26233
+f 22013/29460/26229 29543/29437/26206 29542/29450/26219 22018/29461/26230
+f 22018/29461/26230 29542/29450/26219 31621/29452/26221 29929/29463/26232
+f 22011/29453/26222 22014/29462/26231 22019/29465/26234 22015/29454/26223
+f 22015/29454/26223 22019/29465/26234 29548/29466/26235 29549/29457/26226
+f 22014/29462/26231 29930/29464/26233 29931/29467/26236 22019/29465/26234
+f 22019/29465/26234 29931/29467/26236 31622/29468/26237 29548/29466/26235
+f 22020/29469/26238 22024/29470/26239 22025/29471/26240 22021/29472/26241
+f 22021/29472/26241 22025/29471/26240 29559/27346/24138 29558/27342/24134
+f 22024/29470/26239 29555/29473/26242 29556/29474/26243 22025/29471/26240
+f 22025/29471/26240 29556/29474/26243 31560/27328/24120 29559/27346/24138
+f 22020/29469/26238 22021/29472/26241 22026/29475/26244 22022/29476/26245
+f 22022/29476/26245 22026/29475/26244 29550/29458/26227 29549/29457/26226
+f 22021/29472/26241 29558/27342/24134 29557/27341/24133 22026/29475/26244
+f 22026/29475/26244 29557/27341/24133 31559/27344/24136 29550/29458/26227
+f 22020/29469/26238 22022/29476/26245 22027/29477/26246 22023/29478/26247
+f 22023/29478/26247 22027/29477/26246 29935/29479/26248 29936/29480/26249
+f 22022/29476/26245 29549/29457/26226 29548/29466/26235 22027/29477/26246
+f 22027/29477/26246 29548/29466/26235 31622/29468/26237 29935/29479/26248
+f 22020/29469/26238 22023/29478/26247 22028/29481/26250 22024/29470/26239
+f 22024/29470/26239 22028/29481/26250 29554/29482/26251 29555/29473/26242
+f 22023/29478/26247 29936/29480/26249 29937/29483/26252 22028/29481/26250
+f 22028/29481/26250 29937/29483/26252 31623/29484/26253 29554/29482/26251
+f 22029/29485/26254 22033/29486/26255 22034/29487/26256 22030/29488/26257
+f 22030/29488/26257 22034/29487/26256 29565/27330/24122 29564/27326/24118
+f 22033/29486/26255 29561/29489/26258 29562/29490/26259 22034/29487/26256
+f 22034/29487/26256 29562/29490/26259 31561/27312/24104 29565/27330/24122
+f 22029/29485/26254 22030/29488/26257 22035/29491/26260 22031/29492/26261
+f 22031/29492/26261 22035/29491/26260 29556/29474/26243 29555/29473/26242
+f 22030/29488/26257 29564/27326/24118 29563/27325/24117 22035/29491/26260
+f 22035/29491/26260 29563/27325/24117 31560/27328/24120 29556/29474/26243
+f 22029/29485/26254 22031/29492/26261 22036/29493/26262 22032/29494/26263
+f 22032/29494/26263 22036/29493/26262 29941/29495/26264 29942/29496/26265
+f 22031/29492/26261 29555/29473/26242 29554/29482/26251 22036/29493/26262
+f 22036/29493/26262 29554/29482/26251 31623/29484/26253 29941/29495/26264
+f 22029/29485/26254 22032/29494/26263 22037/29497/26266 22033/29486/26255
+f 22033/29486/26255 22037/29497/26266 29560/29498/26267 29561/29489/26258
+f 22032/29494/26263 29942/29496/26265 29943/29499/26268 22037/29497/26266
+f 22037/29497/26266 29943/29499/26268 31624/29500/26269 29560/29498/26267
+f 22038/29501/26270 22042/29502/26271 22043/29503/26272 22039/29504/26273
+f 22039/29504/26273 22043/29503/26272 29571/27314/24106 29570/27310/24102
+f 22042/29502/26271 29567/29505/26274 29568/29506/26275 22043/29503/26272
+f 22043/29503/26272 29568/29506/26275 31562/27296/24088 29571/27314/24106
+f 22038/29501/26270 22039/29504/26273 22044/29507/26276 22040/29508/26277
+f 22040/29508/26277 22044/29507/26276 29562/29490/26259 29561/29489/26258
+f 22039/29504/26273 29570/27310/24102 29569/27309/24101 22044/29507/26276
+f 22044/29507/26276 29569/27309/24101 31561/27312/24104 29562/29490/26259
+f 22038/29501/26270 22040/29508/26277 22045/29509/26278 22041/29510/26279
+f 22041/29510/26279 22045/29509/26278 29947/29511/26280 29948/29512/26281
+f 22040/29508/26277 29561/29489/26258 29560/29498/26267 22045/29509/26278
+f 22045/29509/26278 29560/29498/26267 31624/29500/26269 29947/29511/26280
+f 22038/29501/26270 22041/29510/26279 22046/29513/26282 22042/29502/26271
+f 22042/29502/26271 22046/29513/26282 29566/29514/26283 29567/29505/26274
+f 22041/29510/26279 29948/29512/26281 29949/29515/26284 22046/29513/26282
+f 22046/29513/26282 29949/29515/26284 31625/29516/26285 29566/29514/26283
+f 22047/29517/26286 22051/29518/26287 22052/29519/26288 22048/29520/26289
+f 22048/29520/26289 22052/29519/26288 29577/27298/24090 29576/27294/24086
+f 22051/29518/26287 29573/29521/26290 29574/29522/26291 22052/29519/26288
+f 22052/29519/26288 29574/29522/26291 31563/27278/24072 29577/27298/24090
+f 22047/29517/26286 22048/29520/26289 22053/29523/26292 22049/29524/26293
+f 22049/29524/26293 22053/29523/26292 29568/29506/26275 29567/29505/26274
+f 22048/29520/26289 29576/27294/24086 29575/27293/24085 22053/29523/26292
+f 22053/29523/26292 29575/27293/24085 31562/27296/24088 29568/29506/26275
+f 22047/29517/26286 22049/29524/26293 22054/29525/26294 22050/29526/26295
+f 22050/29526/26295 22054/29525/26294 29953/29527/26296 29954/29528/26297
+f 22049/29524/26293 29567/29505/26274 29566/29514/26283 22054/29525/26294
+f 22054/29525/26294 29566/29514/26283 31625/29516/26285 29953/29527/26296
+f 22047/29517/26286 22050/29526/26295 22055/29529/26298 22051/29518/26287
+f 22051/29518/26287 22055/29529/26298 29572/29530/26299 29573/29521/26290
+f 22050/29526/26295 29954/29528/26297 29955/29531/26300 22055/29529/26298
+f 22055/29529/26298 29955/29531/26300 31626/29532/26301 29572/29530/26299
+f 22056/29533/26302 22060/29534/26303 22061/29535/26304 22057/29536/26305
+f 22057/29536/26305 22061/29535/26304 29583/27281/24074 29582/27276/24070
+f 22060/29534/26303 29579/29537/26306 29580/29538/26307 22061/29535/26304
+f 22061/29535/26304 29580/29538/26307 31564/27282/24056 29583/27281/24074
+f 22056/29533/26302 22057/29536/26305 22062/29539/26308 22058/29540/26309
+f 22058/29540/26309 22062/29539/26308 29574/29522/26291 29573/29521/26290
+f 22057/29536/26305 29582/27276/24070 29581/27275/24069 22062/29539/26308
+f 22062/29539/26308 29581/27275/24069 31563/27278/24072 29574/29522/26291
+f 22056/29533/26302 22058/29540/26309 22063/29541/26310 22059/29542/26311
+f 22059/29542/26311 22063/29541/26310 29959/29543/26312 29960/29544/26313
+f 22058/29540/26309 29573/29521/26290 29572/29530/26299 22063/29541/26310
+f 22063/29541/26310 29572/29530/26299 31626/29532/26301 29959/29543/26312
+f 22056/29533/26302 22059/29542/26311 22064/29545/26314 22060/29534/26303
+f 22060/29534/26303 22064/29545/26314 29578/29546/26315 29579/29537/26306
+f 22059/29542/26311 29960/29544/26313 29961/29547/26316 22064/29545/26314
+f 22064/29545/26314 29961/29547/26316 31627/29548/26317 29578/29546/26315
+f 22065/29549/26318 22069/29550/26319 22070/29551/26320 22066/29552/26321
+f 22066/29552/26321 22070/29551/26320 29589/27262/24058 29588/27258/24054
+f 22069/29550/26319 29585/29553/26322 29586/29554/26323 22070/29551/26320
+f 22070/29551/26320 29586/29554/26323 31565/27244/24040 29589/27262/24058
+f 22065/29549/26318 22066/29552/26321 22071/29555/26324 22067/29556/26325
+f 22067/29556/26325 22071/29555/26324 29580/29557/26307 29579/29558/26306
+f 22066/29552/26321 29588/27258/24054 29587/27257/24053 22071/29555/26324
+f 22071/29555/26324 29587/27257/24053 31564/27260/24056 29580/29557/26307
+f 22065/29549/26318 22067/29556/26325 22072/29559/26326 22068/29560/26327
+f 22068/29560/26327 22072/29559/26326 29965/29561/26328 29966/29562/26329
+f 22067/29556/26325 29579/29558/26306 29578/29563/26315 22072/29559/26326
+f 22072/29559/26326 29578/29563/26315 31627/29564/26317 29965/29561/26328
+f 22065/29549/26318 22068/29560/26327 22073/29565/26330 22069/29550/26319
+f 22069/29550/26319 22073/29565/26330 29584/29566/26331 29585/29553/26322
+f 22068/29560/26327 29966/29562/26329 29967/29567/26332 22073/29565/26330
+f 22073/29565/26330 29967/29567/26332 31628/29568/26333 29584/29566/26331
+f 22074/29569/26334 22078/29570/26335 22079/29571/26336 22075/29572/26337
+f 22075/29572/26337 22079/29571/26336 29595/27246/24042 29594/27242/24038
+f 22078/29570/26335 29591/29573/26338 29592/29574/26339 22079/29571/26336
+f 22079/29571/26336 29592/29574/26339 31566/27228/24024 29595/27246/24042
+f 22074/29569/26334 22075/29572/26337 22080/29575/26340 22076/29576/26341
+f 22076/29576/26341 22080/29575/26340 29586/29554/26323 29585/29553/26322
+f 22075/29572/26337 29594/27242/24038 29593/27241/24037 22080/29575/26340
+f 22080/29575/26340 29593/27241/24037 31565/27244/24040 29586/29554/26323
+f 22074/29569/26334 22076/29576/26341 22081/29577/26342 22077/29578/26343
+f 22077/29578/26343 22081/29577/26342 29968/29579/26344 29969/29580/26345
+f 22076/29576/26341 29585/29553/26322 29584/29566/26331 22081/29577/26342
+f 22081/29577/26342 29584/29566/26331 31628/29568/26333 29968/29579/26344
+f 22074/29569/26334 22077/29578/26343 22082/29581/26346 22078/29570/26335
+f 22078/29570/26335 22082/29581/26346 29590/29582/26347 29591/29573/26338
+f 22077/29578/26343 29969/29580/26345 29970/29583/26348 22082/29581/26346
+f 22082/29581/26346 29970/29583/26348 31605/29584/26349 29590/29582/26347
+f 22083/29585/26350 22087/29586/26351 22088/29587/26352 22084/29588/26353
+f 22084/29588/26353 22088/29587/26352 29601/27230/24026 29600/27226/24022
+f 22087/29586/26351 29597/29589/26354 29598/29590/26355 22088/29587/26352
+f 22088/29587/26352 29598/29590/26355 31567/27212/24008 29601/27230/24026
+f 22083/29585/26350 22084/29588/26353 22089/29591/26356 22085/29592/26357
+f 22085/29592/26357 22089/29591/26356 29592/29574/26339 29591/29573/26338
+f 22084/29588/26353 29600/27226/24022 29599/27225/24021 22089/29591/26356
+f 22089/29591/26356 29599/27225/24021 31566/27228/24024 29592/29574/26339
+f 22083/29585/26350 22085/29592/26357 22090/29593/26358 22086/29594/26359
+f 22086/29594/26359 22090/29593/26358 29833/29595/26360 29834/29596/26361
+f 22085/29592/26357 29591/29573/26338 29590/29582/26347 22090/29593/26358
+f 22090/29593/26358 29590/29582/26347 31605/29584/26349 29833/29595/26360
+f 22083/29585/26350 22086/29594/26359 22091/29597/26362 22087/29586/26351
+f 22087/29586/26351 22091/29597/26362 29596/29598/26363 29597/29589/26354
+f 22086/29594/26359 29834/29596/26361 29835/29599/26364 22091/29597/26362
+f 22091/29597/26362 29835/29599/26364 31606/29600/26365 29596/29598/26363
+f 22092/29601/26366 22096/29602/26367 22097/29603/26368 22093/29604/26369
+f 22093/29604/26369 22097/29603/26368 29607/27214/24010 29606/27210/24006
+f 22096/29602/26367 29603/29605/26370 29604/29606/26371 22097/29603/26368
+f 22097/29603/26368 29604/29606/26371 31568/27196/23992 29607/27214/24010
+f 22092/29601/26366 22093/29604/26369 22098/29607/26372 22094/29608/26373
+f 22094/29608/26373 22098/29607/26372 29598/29590/26355 29597/29589/26354
+f 22093/29604/26369 29606/27210/24006 29605/27209/24005 22098/29607/26372
+f 22098/29607/26372 29605/27209/24005 31567/27212/24008 29598/29590/26355
+f 22092/29601/26366 22094/29608/26373 22099/29609/26374 22095/29610/26375
+f 22095/29610/26375 22099/29609/26374 29839/29611/26376 29840/29612/26377
+f 22094/29608/26373 29597/29589/26354 29596/29598/26363 22099/29609/26374
+f 22099/29609/26374 29596/29598/26363 31606/29600/26365 29839/29611/26376
+f 22092/29601/26366 22095/29610/26375 22100/29613/26378 22096/29602/26367
+f 22096/29602/26367 22100/29613/26378 29602/29614/26379 29603/29605/26370
+f 22095/29610/26375 29840/29612/26377 29841/29615/26380 22100/29613/26378
+f 22100/29613/26378 29841/29615/26380 31607/29616/26381 29602/29614/26379
+f 22101/29617/26382 22105/29618/26383 22106/29619/26384 22102/29620/26385
+f 22102/29620/26385 22106/29619/26384 29613/27198/23994 29612/27194/23990
+f 22105/29618/26383 29609/29621/26386 29610/29622/26387 22106/29619/26384
+f 22106/29619/26384 29610/29622/26387 31569/27180/23976 29613/27198/23994
+f 22101/29617/26382 22102/29620/26385 22107/29623/26388 22103/29624/26389
+f 22103/29624/26389 22107/29623/26388 29604/29606/26371 29603/29605/26370
+f 22102/29620/26385 29612/27194/23990 29611/27193/23989 22107/29623/26388
+f 22107/29623/26388 29611/27193/23989 31568/27196/23992 29604/29606/26371
+f 22101/29617/26382 22103/29624/26389 22108/29625/26390 22104/29626/26391
+f 22104/29626/26391 22108/29625/26390 29845/29627/26392 29846/29628/26393
+f 22103/29624/26389 29603/29605/26370 29602/29614/26379 22108/29625/26390
+f 22108/29625/26390 29602/29614/26379 31607/29616/26381 29845/29627/26392
+f 22101/29617/26382 22104/29626/26391 22109/29629/26394 22105/29618/26383
+f 22105/29618/26383 22109/29629/26394 29608/29630/26395 29609/29621/26386
+f 22104/29626/26391 29846/29628/26393 29847/29631/26396 22109/29629/26394
+f 22109/29629/26394 29847/29631/26396 31608/29632/26397 29608/29630/26395
+f 22110/29633/26398 22114/29634/26399 22115/29635/26400 22111/29636/26401
+f 22111/29636/26401 22115/29635/26400 29619/27182/23978 29618/27178/23974
+f 22114/29634/26399 29615/29637/26402 29616/29638/26403 22115/29635/26400
+f 22115/29635/26400 29616/29638/26403 31570/27164/23960 29619/27182/23978
+f 22110/29633/26398 22111/29636/26401 22116/29639/26404 22112/29640/26405
+f 22112/29640/26405 22116/29639/26404 29610/29622/26387 29609/29621/26386
+f 22111/29636/26401 29618/27178/23974 29617/27177/23973 22116/29639/26404
+f 22116/29639/26404 29617/27177/23973 31569/27180/23976 29610/29622/26387
+f 22110/29633/26398 22112/29640/26405 22117/29641/26406 22113/29642/26407
+f 22113/29642/26407 22117/29641/26406 29851/29643/26408 29852/29644/26409
+f 22112/29640/26405 29609/29621/26386 29608/29630/26395 22117/29641/26406
+f 22117/29641/26406 29608/29630/26395 31608/29632/26397 29851/29643/26408
+f 22110/29633/26398 22113/29642/26407 22118/29645/26410 22114/29634/26399
+f 22114/29634/26399 22118/29645/26410 29614/29646/26411 29615/29637/26402
+f 22113/29642/26407 29852/29644/26409 29853/29647/26412 22118/29645/26410
+f 22118/29645/26410 29853/29647/26412 31609/29648/26413 29614/29646/26411
+f 22119/29649/26414 22123/29650/26415 22124/29651/26416 22120/29652/26417
+f 22120/29652/26417 22124/29651/26416 29625/27166/23962 29624/27162/23958
+f 22123/29650/26415 29621/29653/26418 29622/29654/26419 22124/29651/26416
+f 22124/29651/26416 29622/29654/26419 31571/27148/23944 29625/27166/23962
+f 22119/29649/26414 22120/29652/26417 22125/29655/26420 22121/29656/26421
+f 22121/29656/26421 22125/29655/26420 29616/29638/26403 29615/29637/26402
+f 22120/29652/26417 29624/27162/23958 29623/27161/23957 22125/29655/26420
+f 22125/29655/26420 29623/27161/23957 31570/27164/23960 29616/29638/26403
+f 22119/29649/26414 22121/29656/26421 22126/29657/26422 22122/29658/26423
+f 22122/29658/26423 22126/29657/26422 29857/29659/26424 29858/29660/26425
+f 22121/29656/26421 29615/29637/26402 29614/29646/26411 22126/29657/26422
+f 22126/29657/26422 29614/29646/26411 31609/29648/26413 29857/29659/26424
+f 22119/29649/26414 22122/29658/26423 22127/29661/26426 22123/29650/26415
+f 22123/29650/26415 22127/29661/26426 29620/29662/26427 29621/29653/26418
+f 22122/29658/26423 29858/29660/26425 29859/29663/26428 22127/29661/26426
+f 22127/29661/26426 29859/29663/26428 31610/29664/26429 29620/29662/26427
+f 22128/29665/26430 22132/29666/26431 22133/29667/26432 22129/29668/26433
+f 22129/29668/26433 22133/29667/26432 29631/27150/23946 29630/27146/23942
+f 22132/29666/26431 29627/29669/26434 29628/29670/26435 22133/29667/26432
+f 22133/29667/26432 29628/29670/26435 31572/27132/23928 29631/27150/23946
+f 22128/29665/26430 22129/29668/26433 22134/29671/26436 22130/29672/26437
+f 22130/29672/26437 22134/29671/26436 29622/29654/26419 29621/29653/26418
+f 22129/29668/26433 29630/27146/23942 29629/27145/23941 22134/29671/26436
+f 22134/29671/26436 29629/27145/23941 31571/27148/23944 29622/29654/26419
+f 22128/29665/26430 22130/29672/26437 22135/29673/26438 22131/29674/26439
+f 22131/29674/26439 22135/29673/26438 29863/29675/26440 29864/29676/26441
+f 22130/29672/26437 29621/29653/26418 29620/29662/26427 22135/29673/26438
+f 22135/29673/26438 29620/29662/26427 31610/29664/26429 29863/29675/26440
+f 22128/29665/26430 22131/29674/26439 22136/29677/26442 22132/29666/26431
+f 22132/29666/26431 22136/29677/26442 29626/29678/26443 29627/29669/26434
+f 22131/29674/26439 29864/29676/26441 29865/29679/26444 22136/29677/26442
+f 22136/29677/26442 29865/29679/26444 31611/29680/26445 29626/29678/26443
+f 22137/29681/26446 22141/29682/26447 22142/29683/26448 22138/29684/26449
+f 22138/29684/26449 22142/29683/26448 29637/27134/23930 29636/27130/23926
+f 22141/29682/26447 29633/29685/26450 29634/29686/26451 22142/29683/26448
+f 22142/29683/26448 29634/29686/26451 31573/27116/23912 29637/27134/23930
+f 22137/29681/26446 22138/29684/26449 22143/29687/26452 22139/29688/26453
+f 22139/29688/26453 22143/29687/26452 29628/29670/26435 29627/29669/26434
+f 22138/29684/26449 29636/27130/23926 29635/27129/23925 22143/29687/26452
+f 22143/29687/26452 29635/27129/23925 31572/27132/23928 29628/29670/26435
+f 22137/29681/26446 22139/29688/26453 22144/29689/26454 22140/29690/26455
+f 22140/29690/26455 22144/29689/26454 29869/29691/26456 29870/29692/26457
+f 22139/29688/26453 29627/29669/26434 29626/29678/26443 22144/29689/26454
+f 22144/29689/26454 29626/29678/26443 31611/29680/26445 29869/29691/26456
+f 22137/29681/26446 22140/29690/26455 22145/29693/26458 22141/29682/26447
+f 22141/29682/26447 22145/29693/26458 29632/29694/26459 29633/29685/26450
+f 22140/29690/26455 29870/29692/26457 29871/29695/26460 22145/29693/26458
+f 22145/29693/26458 29871/29695/26460 31612/29696/26461 29632/29694/26459
+f 22146/29697/26462 22150/29698/26463 22151/29699/26464 22147/29700/26465
+f 22147/29700/26465 22151/29699/26464 29643/27118/23914 29642/27114/23910
+f 22150/29698/26463 29639/29701/26466 29640/29702/26467 22151/29699/26464
+f 22151/29699/26464 29640/29702/26467 31574/27100/23896 29643/27118/23914
+f 22146/29697/26462 22147/29700/26465 22152/29703/26468 22148/29704/26469
+f 22148/29704/26469 22152/29703/26468 29634/29686/26451 29633/29685/26450
+f 22147/29700/26465 29642/27114/23910 29641/27113/23909 22152/29703/26468
+f 22152/29703/26468 29641/27113/23909 31573/27116/23912 29634/29686/26451
+f 22146/29697/26462 22148/29704/26469 22153/29705/26470 22149/29706/26471
+f 22149/29706/26471 22153/29705/26470 29875/29707/26472 29876/29708/26473
+f 22148/29704/26469 29633/29685/26450 29632/29694/26459 22153/29705/26470
+f 22153/29705/26470 29632/29694/26459 31612/29696/26461 29875/29707/26472
+f 22146/29697/26462 22149/29706/26471 22154/29709/26474 22150/29698/26463
+f 22150/29698/26463 22154/29709/26474 29638/29710/26475 29639/29701/26466
+f 22149/29706/26471 29876/29708/26473 29877/29711/26476 22154/29709/26474
+f 22154/29709/26474 29877/29711/26476 31613/29712/26477 29638/29710/26475
+f 22155/29713/26478 22159/29714/26479 22160/29715/26480 22156/29716/26481
+f 22156/29716/26481 22160/29715/26480 29649/27102/23898 29648/27098/23894
+f 22159/29714/26479 29645/29717/26482 29646/29718/26483 22160/29715/26480
+f 22160/29715/26480 29646/29718/26483 31575/27084/23880 29649/27102/23898
+f 22155/29713/26478 22156/29716/26481 22161/29719/26484 22157/29720/26485
+f 22157/29720/26485 22161/29719/26484 29640/29702/26467 29639/29701/26466
+f 22156/29716/26481 29648/27098/23894 29647/27097/23893 22161/29719/26484
+f 22161/29719/26484 29647/27097/23893 31574/27100/23896 29640/29702/26467
+f 22155/29713/26478 22157/29720/26485 22162/29721/26486 22158/29722/26487
+f 22158/29722/26487 22162/29721/26486 29881/29723/26488 29882/29724/26489
+f 22157/29720/26485 29639/29701/26466 29638/29710/26475 22162/29721/26486
+f 22162/29721/26486 29638/29710/26475 31613/29712/26477 29881/29723/26488
+f 22155/29713/26478 22158/29722/26487 22163/29725/26490 22159/29714/26479
+f 22159/29714/26479 22163/29725/26490 29644/29726/26491 29645/29717/26482
+f 22158/29722/26487 29882/29724/26489 29883/29727/26492 22163/29725/26490
+f 22163/29725/26490 29883/29727/26492 31614/29728/26493 29644/29726/26491
+f 22164/29729/26494 22168/29730/26495 22169/29731/26496 22165/29732/26497
+f 22165/29732/26497 22169/29731/26496 29655/27086/23882 29654/27082/23878
+f 22168/29730/26495 29651/29733/26498 29652/29734/26499 22169/29731/26496
+f 22169/29731/26496 29652/29734/26499 31576/27068/23864 29655/27086/23882
+f 22164/29729/26494 22165/29732/26497 22170/29735/26500 22166/29736/26501
+f 22166/29736/26501 22170/29735/26500 29646/29718/26483 29645/29717/26482
+f 22165/29732/26497 29654/27082/23878 29653/27081/23877 22170/29735/26500
+f 22170/29735/26500 29653/27081/23877 31575/27084/23880 29646/29718/26483
+f 22164/29729/26494 22166/29736/26501 22171/29737/26502 22167/29738/26503
+f 22167/29738/26503 22171/29737/26502 29887/29739/26504 29888/29740/26505
+f 22166/29736/26501 29645/29717/26482 29644/29726/26491 22171/29737/26502
+f 22171/29737/26502 29644/29726/26491 31614/29728/26493 29887/29739/26504
+f 22164/29729/26494 22167/29738/26503 22172/29741/26506 22168/29730/26495
+f 22168/29730/26495 22172/29741/26506 29650/29742/26507 29651/29733/26498
+f 22167/29738/26503 29888/29740/26505 29889/29743/26508 22172/29741/26506
+f 22172/29741/26506 29889/29743/26508 31615/29744/26509 29650/29742/26507
+f 22173/29745/26510 22177/29746/26511 22178/29747/26512 22174/29748/26513
+f 22174/29748/26513 22178/29747/26512 29661/27070/23866 29660/27066/23862
+f 22177/29746/26511 29657/29749/26514 29658/29750/26515 22178/29747/26512
+f 22178/29747/26512 29658/29750/26515 31577/27052/23848 29661/27070/23866
+f 22173/29745/26510 22174/29748/26513 22179/29751/26516 22175/29752/26517
+f 22175/29752/26517 22179/29751/26516 29652/29734/26499 29651/29733/26498
+f 22174/29748/26513 29660/27066/23862 29659/27065/23861 22179/29751/26516
+f 22179/29751/26516 29659/27065/23861 31576/27068/23864 29652/29734/26499
+f 22173/29745/26510 22175/29752/26517 22180/29753/26518 22176/29754/26519
+f 22176/29754/26519 22180/29753/26518 29893/29755/26520 29894/29756/26521
+f 22175/29752/26517 29651/29733/26498 29650/29742/26507 22180/29753/26518
+f 22180/29753/26518 29650/29742/26507 31615/29744/26509 29893/29755/26520
+f 22173/29745/26510 22176/29754/26519 22181/29757/26522 22177/29746/26511
+f 22177/29746/26511 22181/29757/26522 29656/29758/26523 29657/29749/26514
+f 22176/29754/26519 29894/29756/26521 29895/29759/26524 22181/29757/26522
+f 22181/29757/26522 29895/29759/26524 31616/29760/26525 29656/29758/26523
+f 22182/29761/26526 22186/29762/26527 22187/29763/26528 22183/29764/26529
+f 22183/29764/26529 22187/29763/26528 29667/27054/23850 29666/27050/23846
+f 22186/29762/26527 29663/29765/26530 29664/29766/26531 22187/29763/26528
+f 22187/29763/26528 29664/29766/26531 31578/27036/23832 29667/27054/23850
+f 22182/29761/26526 22183/29764/26529 22188/29767/26532 22184/29768/26533
+f 22184/29768/26533 22188/29767/26532 29658/29750/26515 29657/29749/26514
+f 22183/29764/26529 29666/27050/23846 29665/27049/23845 22188/29767/26532
+f 22188/29767/26532 29665/27049/23845 31577/27052/23848 29658/29750/26515
+f 22182/29761/26526 22184/29768/26533 22189/29769/26534 22185/29770/26535
+f 22185/29770/26535 22189/29769/26534 29899/29771/26536 29900/29772/26537
+f 22184/29768/26533 29657/29749/26514 29656/29758/26523 22189/29769/26534
+f 22189/29769/26534 29656/29758/26523 31616/29760/26525 29899/29771/26536
+f 22182/29761/26526 22185/29770/26535 22190/29773/26538 22186/29762/26527
+f 22186/29762/26527 22190/29773/26538 29662/29774/26539 29663/29765/26530
+f 22185/29770/26535 29900/29772/26537 29901/29775/26540 22190/29773/26538
+f 22190/29773/26538 29901/29775/26540 31617/29776/26541 29662/29774/26539
+f 22191/29777/26542 22195/29778/26543 22196/29779/26544 22192/29780/26545
+f 22192/29780/26545 22196/29779/26544 29673/27038/23834 29672/27034/23830
+f 22195/29778/26543 29669/29781/26546 29670/29782/26547 22196/29779/26544
+f 22196/29779/26544 29670/29782/26547 31579/27020/23816 29673/27038/23834
+f 22191/29777/26542 22192/29780/26545 22197/29783/26548 22193/29784/26549
+f 22193/29784/26549 22197/29783/26548 29664/29766/26531 29663/29765/26530
+f 22192/29780/26545 29672/27034/23830 29671/27033/23829 22197/29783/26548
+f 22197/29783/26548 29671/27033/23829 31578/27036/23832 29664/29766/26531
+f 22191/29777/26542 22193/29784/26549 22198/29785/26550 22194/29786/26551
+f 22194/29786/26551 22198/29785/26550 29905/29787/26552 29906/29788/26553
+f 22193/29784/26549 29663/29765/26530 29662/29774/26539 22198/29785/26550
+f 22198/29785/26550 29662/29774/26539 31617/29776/26541 29905/29787/26552
+f 22191/29777/26542 22194/29786/26551 22199/29789/26554 22195/29778/26543
+f 22195/29778/26543 22199/29789/26554 29668/29790/26555 29669/29781/26546
+f 22194/29786/26551 29906/29788/26553 29907/29791/26556 22199/29789/26554
+f 22199/29789/26554 29907/29791/26556 31618/29792/26557 29668/29790/26555
+f 22200/29793/26558 22204/29794/26559 22205/29795/26560 22201/29796/26561
+f 22201/29796/26561 22205/29795/26560 29679/27022/23818 29678/27018/23814
+f 22204/29794/26559 29675/29797/26562 29676/29798/26563 22205/29795/26560
+f 22205/29795/26560 29676/29798/26563 31580/27002/23798 29679/27022/23818
+f 22200/29793/26558 22201/29796/26561 22206/29799/26564 22202/29800/26565
+f 22202/29800/26565 22206/29799/26564 29670/29782/26547 29669/29781/26546
+f 22201/29796/26561 29678/27018/23814 29677/27017/23813 22206/29799/26564
+f 22206/29799/26564 29677/27017/23813 31579/27020/23816 29670/29782/26547
+f 22200/29793/26558 22202/29800/26565 22207/29801/26566 22203/29802/26567
+f 22203/29802/26567 22207/29801/26566 29911/29803/26568 29912/29804/26569
+f 22202/29800/26565 29669/29781/26546 29668/29790/26555 22207/29801/26566
+f 22207/29801/26566 29668/29790/26555 31618/29792/26557 29911/29803/26568
+f 22200/29793/26558 22203/29802/26567 22208/29805/26570 22204/29794/26559
+f 22204/29794/26559 22208/29805/26570 29674/29806/26571 29675/29797/26562
+f 22203/29802/26567 29912/29804/26569 29913/29807/26572 22208/29805/26570
+f 22208/29805/26570 29913/29807/26572 31619/29808/26573 29674/29806/26571
+f 22209/29809/26574 22213/29810/26575 22214/29811/26576 22210/29812/26577
+f 22210/29812/26577 22214/29811/26576 29682/27005/23801 29681/27000/23796
+f 22213/29810/26575 29540/29442/26211 29539/29441/26210 22214/29811/26576
+f 22214/29811/26576 29539/29441/26210 31557/27006/23802 29682/27005/23801
+f 22209/29809/26574 22210/29812/26577 22215/29813/26578 22211/29814/26579
+f 22211/29814/26579 22215/29813/26578 29676/29798/26563 29675/29797/26562
+f 22210/29812/26577 29681/27000/23796 29680/26999/23795 22215/29813/26578
+f 22215/29813/26578 29680/26999/23795 31580/27002/23798 29676/29798/26563
+f 22209/29809/26574 22211/29814/26579 22216/29815/26580 22212/29816/26581
+f 22212/29816/26581 22216/29815/26580 29917/29817/26582 29918/29818/26583
+f 22211/29814/26579 29675/29797/26562 29674/29806/26571 22216/29815/26580
+f 22216/29815/26580 29674/29806/26571 31619/29808/26573 29917/29817/26582
+f 22209/29809/26574 22212/29816/26581 22217/29819/26584 22213/29810/26575
+f 22213/29810/26575 22217/29819/26584 29541/29447/26216 29540/29442/26211
+f 22212/29816/26581 29918/29818/26583 29919/29820/26585 22217/29819/26584
+f 22217/29819/26584 29919/29820/26585 31620/29448/26217 29541/29447/26216
+f 22218/29821/26586 22222/29822/26587 22223/29823/26588 22219/29824/26589
+f 22219/29824/26589 22223/29823/26588 27670/29825/26590 27671/29826/26591
+f 22222/29822/26587 29039/29827/26592 29040/29828/26593 22223/29823/26588
+f 22223/29823/26588 29040/29828/26593 31414/29829/26594 27670/29825/26590
+f 22218/29821/26586 22219/29824/26589 22224/29830/26595 22220/29831/26596
+f 22220/29831/26596 22224/29830/26595 29041/29832/26597 29042/29833/26598
+f 22219/29824/26589 27671/29826/26591 27672/29834/26599 22224/29830/26595
+f 22224/29830/26595 27672/29834/26599 31415/29835/26600 29041/29832/26597
+f 22218/29821/26586 22220/29831/26596 22225/29836/26601 22221/29837/26602
+f 22221/29837/26602 22225/29836/26601 30055/29831/26603 30056/29821/26604
+f 22220/29831/26596 29042/29833/26598 29043/29838/26605 22225/29836/26601
+f 22225/29836/26601 29043/29838/26605 31642/29833/26606 30055/29831/26603
+f 22218/29821/26586 22221/29837/26602 22226/29839/26607 22222/29822/26587
+f 22222/29822/26587 22226/29839/26607 29038/29840/26608 29039/29827/26592
+f 22221/29837/26602 30056/29821/26604 30057/29822/26609 22226/29839/26607
+f 22226/29839/26607 30057/29822/26609 31643/29827/26610 29038/29840/26608
+f 22227/29841/26611 22231/29842/26612 22232/29843/26613 22228/29844/26614
+f 22228/29844/26614 22232/29843/26613 27673/29845/26615 27674/29846/26616
+f 22231/29842/26612 29042/29833/26598 29041/29832/26597 22232/29843/26613
+f 22232/29843/26613 29041/29832/26597 31415/29835/26600 27673/29845/26615
+f 22227/29841/26611 22228/29844/26614 22233/29847/26617 22229/29848/26618
+f 22229/29848/26618 22233/29847/26617 29044/29849/26619 29045/29850/26620
+f 22228/29844/26614 27674/29846/26616 27675/29851/26621 22233/29847/26617
+f 22233/29847/26617 27675/29851/26621 31416/29852/26622 29044/29849/26619
+f 22227/29841/26611 22229/29848/26618 22234/29853/26623 22230/29854/26624
+f 22230/29854/26624 22234/29853/26623 30049/29848/26625 30050/29841/26626
+f 22229/29848/26618 29045/29850/26620 29046/29855/26627 22234/29853/26623
+f 22234/29853/26623 29046/29855/26627 31641/29850/26628 30049/29848/26625
+f 22227/29841/26611 22230/29854/26624 22235/29856/26629 22231/29842/26612
+f 22231/29842/26612 22235/29856/26629 29043/29838/26605 29042/29833/26598
+f 22230/29854/26624 30050/29841/26626 30051/29842/26630 22235/29856/26629
+f 22235/29856/26629 30051/29842/26630 31642/29833/26606 29043/29838/26605
+f 22236/29857/26631 22240/29858/26632 22241/29858/26633 22237/29857/26634
+f 22237/29857/26634 22241/29858/26633 27676/29859/26635 27677/29860/26636
+f 22240/29858/26632 29045/29850/26620 29044/29849/26619 22241/29858/26633
+f 22241/29858/26633 29044/29849/26619 31416/29852/26622 27676/29859/26635
+f 22236/29857/26631 22237/29857/26634 22242/29861/26637 22238/29861/26638
+f 22238/29861/26638 22242/29861/26637 29047/29862/26639 29048/29862/26640
+f 22237/29857/26634 27677/29860/26636 27678/29863/26641 22242/29861/26637
+f 22242/29861/26637 27678/29863/26641 31417/29864/26642 29047/29862/26639
+f 22236/29857/26631 22238/29861/26638 22243/29865/26643 22239/29866/26644
+f 22239/29866/26644 22243/29865/26643 30043/29861/26645 30044/29857/26646
+f 22238/29861/26638 29048/29862/26640 29049/29867/26647 22243/29865/26643
+f 22243/29865/26643 29049/29867/26647 31640/29862/26648 30043/29861/26645
+f 22236/29857/26631 22239/29866/26644 22244/29868/26649 22240/29858/26632
+f 22240/29858/26632 22244/29868/26649 29046/29855/26627 29045/29850/26620
+f 22239/29866/26644 30044/29857/26646 30045/29858/26650 22244/29868/26649
+f 22244/29868/26649 30045/29858/26650 31641/29850/26628 29046/29855/26627
+f 22245/29869/26651 22249/29870/26652 22250/29870/26653 22246/29869/26654
+f 22246/29869/26654 22250/29870/26653 27679/29871/26655 27680/29872/26656
+f 22249/29870/26652 29048/29862/26640 29047/29862/26639 22250/29870/26653
+f 22250/29870/26653 29047/29862/26639 31417/29864/26642 27679/29871/26655
+f 22245/29869/26651 22246/29869/26654 22251/29873/26657 22247/29873/26658
+f 22247/29873/26658 22251/29873/26657 29050/29874/26659 29051/29874/26660
+f 22246/29869/26654 27680/29872/26656 27681/29875/26661 22251/29873/26657
+f 22251/29873/26657 27681/29875/26661 31418/29876/26662 29050/29874/26659
+f 22245/29869/26651 22247/29873/26658 22252/29877/26663 22248/29878/26664
+f 22248/29878/26664 22252/29877/26663 30037/29873/26665 30038/29869/26666
+f 22247/29873/26658 29051/29874/26660 29052/29879/26667 22252/29877/26663
+f 22252/29877/26663 29052/29879/26667 31639/29874/26668 30037/29873/26665
+f 22245/29869/26651 22248/29878/26664 22253/29880/26669 22249/29870/26652
+f 22249/29870/26652 22253/29880/26669 29049/29867/26647 29048/29862/26640
+f 22248/29878/26664 30038/29869/26666 30039/29870/26670 22253/29880/26669
+f 22253/29880/26669 30039/29870/26670 31640/29862/26648 29049/29867/26647
+f 22254/29881/26671 22258/29882/26672 22259/29882/26673 22255/29883/26674
+f 22255/29883/26674 22259/29882/26673 27682/29884/26675 27683/29885/26676
+f 22258/29882/26672 29051/29874/26660 29050/29874/26659 22259/29882/26673
+f 22259/29882/26673 29050/29874/26659 31418/29876/26662 27682/29884/26675
+f 22254/29881/26671 22255/29883/26674 22260/29886/26677 22256/29887/26678
+f 22256/29887/26678 22260/29886/26677 29053/29888/26679 29054/29889/26680
+f 22255/29883/26674 27683/29885/26676 27684/29890/26681 22260/29886/26677
+f 22260/29886/26677 27684/29890/26681 31419/29891/26682 29053/29888/26679
+f 22254/29881/26671 22256/29887/26678 22261/29887/26683 22257/29881/26684
+f 22257/29881/26684 22261/29887/26683 30031/29886/26685 30032/29883/26686
+f 22256/29887/26678 29054/29889/26680 29055/29889/26687 22261/29887/26683
+f 22261/29887/26683 29055/29889/26687 31638/29888/26688 30031/29886/26685
+f 22254/29881/26671 22257/29881/26684 22262/29892/26689 22258/29882/26672
+f 22258/29882/26672 22262/29892/26689 29052/29879/26667 29051/29874/26660
+f 22257/29881/26684 30032/29883/26686 30033/29882/26690 22262/29892/26689
+f 22262/29892/26689 30033/29882/26690 31639/29874/26668 29052/29879/26667
+f 22263/29893/26691 22267/29894/26692 22268/29895/26693 22264/29896/26694
+f 22264/29896/26694 22268/29895/26693 27685/29897/26695 27686/29898/26696
+f 22267/29894/26692 29054/29889/26680 29053/29888/26679 22268/29895/26693
+f 22268/29895/26693 29053/29888/26679 31419/29891/26682 27685/29897/26695
+f 22263/29893/26691 22264/29896/26694 22269/29899/26697 22265/29900/26698
+f 22265/29900/26698 22269/29899/26697 29056/29901/26699 29057/29902/26700
+f 22264/29896/26694 27686/29898/26696 27687/29903/26701 22269/29899/26697
+f 22269/29899/26697 27687/29903/26701 31420/29904/26702 29056/29901/26699
+f 22263/29893/26691 22265/29900/26698 22270/29900/26703 22266/29893/26704
+f 22266/29893/26704 22270/29900/26703 30025/29899/26705 30026/29896/26706
+f 22265/29900/26698 29057/29902/26700 29058/29902/26707 22270/29900/26703
+f 22270/29900/26703 29058/29902/26707 31637/29901/26708 30025/29899/26705
+f 22263/29893/26691 22266/29893/26704 22271/29894/26709 22267/29894/26692
+f 22267/29894/26692 22271/29894/26709 29055/29889/26687 29054/29889/26680
+f 22266/29893/26704 30026/29896/26706 30027/29895/26710 22271/29894/26709
+f 22271/29894/26709 30027/29895/26710 31638/29888/26688 29055/29889/26687
+f 22272/29905/26711 22276/29906/26712 22277/29907/26713 22273/29908/26714
+f 22273/29908/26714 22277/29907/26713 27688/29909/26715 27689/29910/26716
+f 22276/29906/26712 29057/29902/26700 29056/29901/26699 22277/29907/26713
+f 22277/29907/26713 29056/29901/26699 31420/29904/26702 27688/29909/26715
+f 22272/29905/26711 22273/29908/26714 22278/29911/26717 22274/29912/26718
+f 22274/29912/26718 22278/29911/26717 29059/29913/26719 29060/29914/26720
+f 22273/29908/26714 27689/29910/26716 27690/29915/26721 22278/29911/26717
+f 22278/29911/26717 27690/29915/26721 31421/29916/26722 29059/29913/26719
+f 22272/29905/26711 22274/29912/26718 22279/29912/26723 22275/29905/26724
+f 22275/29905/26724 22279/29912/26723 30019/29911/26725 30020/29908/26726
+f 22274/29912/26718 29060/29914/26720 29061/29914/26727 22279/29912/26723
+f 22279/29912/26723 29061/29914/26727 31636/29913/26728 30019/29911/26725
+f 22272/29905/26711 22275/29905/26724 22280/29906/26729 22276/29906/26712
+f 22276/29906/26712 22280/29906/26729 29058/29902/26707 29057/29902/26700
+f 22275/29905/26724 30020/29908/26726 30021/29907/26730 22280/29906/26729
+f 22280/29906/26729 30021/29907/26730 31637/29901/26708 29058/29902/26707
+f 22281/29917/26731 22285/29918/26732 22286/29919/26733 22282/29920/26734
+f 22282/29920/26734 22286/29919/26733 27691/29921/26735 27692/29922/26736
+f 22285/29918/26732 29060/29914/26720 29059/29913/26719 22286/29919/26733
+f 22286/29919/26733 29059/29913/26719 31421/29916/26722 27691/29921/26735
+f 22281/29917/26731 22282/29920/26734 22287/29923/26737 22283/29924/26738
+f 22283/29924/26738 22287/29923/26737 29062/29925/26739 29063/29926/26740
+f 22282/29920/26734 27692/29922/26736 27693/29927/26741 22287/29923/26737
+f 22287/29923/26737 27693/29927/26741 31422/29928/26742 29062/29925/26739
+f 22281/29917/26731 22283/29924/26738 22288/29924/26743 22284/29917/26744
+f 22284/29917/26744 22288/29924/26743 30013/29923/26745 30014/29920/26746
+f 22283/29924/26738 29063/29926/26740 29064/29926/26747 22288/29924/26743
+f 22288/29924/26743 29064/29926/26747 31635/29925/26748 30013/29923/26745
+f 22281/29917/26731 22284/29917/26744 22289/29918/26749 22285/29918/26732
+f 22285/29918/26732 22289/29918/26749 29061/29914/26727 29060/29914/26720
+f 22284/29917/26744 30014/29920/26746 30015/29919/26750 22289/29918/26749
+f 22289/29918/26749 30015/29919/26750 31636/29913/26728 29061/29914/26727
+f 22290/29929/26751 22294/29930/26752 22295/29931/26753 22291/29932/26754
+f 22291/29932/26754 22295/29931/26753 27694/29933/26755 27695/29934/26756
+f 22294/29930/26752 29063/29926/26740 29062/29925/26739 22295/29931/26753
+f 22295/29931/26753 29062/29925/26739 31422/29928/26742 27694/29933/26755
+f 22290/29929/26751 22291/29932/26754 22296/29935/26757 22292/29936/26758
+f 22292/29936/26758 22296/29935/26757 29065/29937/26759 29066/29938/26760
+f 22291/29932/26754 27695/29934/26756 27696/29939/26761 22296/29935/26757
+f 22296/29935/26757 27696/29939/26761 31423/29940/26762 29065/29937/26759
+f 22290/29929/26751 22292/29936/26758 22297/29936/26763 22293/29929/26764
+f 22293/29929/26764 22297/29936/26763 30007/29935/26765 30008/29932/26766
+f 22292/29936/26758 29066/29938/26760 29067/29938/26767 22297/29936/26763
+f 22297/29936/26763 29067/29938/26767 31634/29937/26768 30007/29935/26765
+f 22290/29929/26751 22293/29929/26764 22298/29930/26769 22294/29930/26752
+f 22294/29930/26752 22298/29930/26769 29064/29926/26747 29063/29926/26740
+f 22293/29929/26764 30008/29932/26766 30009/29931/26770 22298/29930/26769
+f 22298/29930/26769 30009/29931/26770 31635/29925/26748 29064/29926/26747
+f 22299/29941/26771 22303/29942/26772 22304/29943/26773 22300/29944/26774
+f 22300/29944/26774 22304/29943/26773 27697/29945/26775 27698/29946/26776
+f 22303/29942/26772 29066/29938/26760 29065/29937/26759 22304/29943/26773
+f 22304/29943/26773 29065/29937/26759 31423/29940/26762 27697/29945/26775
+f 22299/29941/26771 22300/29944/26774 22305/29947/26777 22301/29948/26778
+f 22301/29948/26778 22305/29947/26777 29068/29949/26779 29069/29950/26780
+f 22300/29944/26774 27698/29946/26776 27699/29951/26781 22305/29947/26777
+f 22305/29947/26777 27699/29951/26781 31424/29952/26782 29068/29949/26779
+f 22299/29941/26771 22301/29948/26778 22306/29948/26783 22302/29941/26784
+f 22302/29941/26784 22306/29948/26783 30001/29947/26785 30002/29944/26786
+f 22301/29948/26778 29069/29950/26780 29070/29950/26787 22306/29948/26783
+f 22306/29948/26783 29070/29950/26787 31633/29949/26788 30001/29947/26785
+f 22299/29941/26771 22302/29941/26784 22307/29942/26789 22303/29942/26772
+f 22303/29942/26772 22307/29942/26789 29067/29938/26767 29066/29938/26760
+f 22302/29941/26784 30002/29944/26786 30003/29943/26790 22307/29942/26789
+f 22307/29942/26789 30003/29943/26790 31634/29937/26768 29067/29938/26767
+f 22308/29953/26791 22312/29954/26792 22313/29955/26793 22309/29956/26794
+f 22309/29956/26794 22313/29955/26793 27700/29957/26795 27701/29958/26796
+f 22312/29954/26792 29069/29950/26780 29068/29949/26779 22313/29955/26793
+f 22313/29955/26793 29068/29949/26779 31424/29952/26782 27700/29957/26795
+f 22308/29953/26791 22309/29956/26794 22314/29959/26797 22310/29960/26798
+f 22310/29960/26798 22314/29959/26797 29071/29961/26799 29072/29962/26800
+f 22309/29956/26794 27701/29958/26796 27702/29963/26801 22314/29959/26797
+f 22314/29959/26797 27702/29963/26801 31425/29964/26802 29071/29961/26799
+f 22308/29953/26791 22310/29960/26798 22315/29960/26803 22311/29953/26804
+f 22311/29953/26804 22315/29960/26803 29995/29959/26805 29996/29956/26806
+f 22310/29960/26798 29072/29962/26800 29073/29962/26807 22315/29960/26803
+f 22315/29960/26803 29073/29962/26807 31632/29961/26808 29995/29959/26805
+f 22308/29953/26791 22311/29953/26804 22316/29954/26809 22312/29954/26792
+f 22312/29954/26792 22316/29954/26809 29070/29950/26787 29069/29950/26780
+f 22311/29953/26804 29996/29956/26806 29997/29955/26810 22316/29954/26809
+f 22316/29954/26809 29997/29955/26810 31633/29949/26788 29070/29950/26787
+f 22317/29965/26811 22321/29966/26812 22322/29967/26813 22318/29968/26814
+f 22318/29968/26814 22322/29967/26813 27703/29969/26815 27704/29970/26816
+f 22321/29966/26812 29072/29962/26800 29071/29961/26799 22322/29967/26813
+f 22322/29967/26813 29071/29961/26799 31425/29964/26802 27703/29969/26815
+f 22317/29965/26811 22318/29968/26814 22323/29971/26817 22319/29972/26818
+f 22319/29972/26818 22323/29971/26817 29074/29973/26819 29075/29974/26820
+f 22318/29968/26814 27704/29970/26816 27705/29975/26821 22323/29971/26817
+f 22323/29971/26817 27705/29975/26821 31426/29976/26822 29074/29973/26819
+f 22317/29965/26811 22319/29972/26818 22324/29972/26823 22320/29965/26824
+f 22320/29965/26824 22324/29972/26823 29989/29971/26825 29990/29968/26826
+f 22319/29972/26818 29075/29974/26820 29076/29974/26827 22324/29972/26823
+f 22324/29972/26823 29076/29974/26827 31631/29973/26828 29989/29971/26825
+f 22317/29965/26811 22320/29965/26824 22325/29966/26829 22321/29966/26812
+f 22321/29966/26812 22325/29966/26829 29073/29962/26807 29072/29962/26800
+f 22320/29965/26824 29990/29968/26826 29991/29967/26830 22325/29966/26829
+f 22325/29966/26829 29991/29967/26830 31632/29961/26808 29073/29962/26807
+f 22326/29977/26831 22330/29978/26832 22331/29979/26833 22327/29980/26834
+f 22327/29980/26834 22331/29979/26833 27706/29981/26835 27707/29982/26836
+f 22330/29978/26832 29075/29974/26820 29074/29973/26819 22331/29979/26833
+f 22331/29979/26833 29074/29973/26819 31426/29976/26822 27706/29981/26835
+f 22326/29977/26831 22327/29980/26834 22332/29983/26837 22328/29984/26838
+f 22328/29984/26838 22332/29983/26837 29077/29985/26839 29078/29986/26840
+f 22327/29980/26834 27707/29982/26836 27708/29987/26841 22332/29983/26837
+f 22332/29983/26837 27708/29987/26841 31427/29988/26842 29077/29985/26839
+f 22326/29977/26831 22328/29984/26838 22333/29984/26843 22329/29977/26844
+f 22329/29977/26844 22333/29984/26843 29983/29983/26845 29984/29980/26846
+f 22328/29984/26838 29078/29986/26840 29079/29986/26847 22333/29984/26843
+f 22333/29984/26843 29079/29986/26847 31630/29985/26848 29983/29983/26845
+f 22326/29977/26831 22329/29977/26844 22334/29978/26849 22330/29978/26832
+f 22330/29978/26832 22334/29978/26849 29076/29974/26827 29075/29974/26820
+f 22329/29977/26844 29984/29980/26846 29985/29979/26850 22334/29978/26849
+f 22334/29978/26849 29985/29979/26850 31631/29973/26828 29076/29974/26827
+f 22335/29989/26851 22339/29990/26852 22340/29991/26853 22336/29992/26854
+f 22336/29992/26854 22340/29991/26853 27709/29993/26855 27710/29994/26856
+f 22339/29990/26852 29078/29986/26840 29077/29985/26839 22340/29991/26853
+f 22340/29991/26853 29077/29985/26839 31427/29988/26842 27709/29993/26855
+f 22335/29989/26851 22336/29992/26854 22341/29995/26857 22337/29996/26858
+f 22337/29996/26858 22341/29995/26857 29080/29997/26859 29081/29998/26860
+f 22336/29992/26854 27710/29994/26856 27711/29999/26861 22341/29995/26857
+f 22341/29995/26857 27711/29999/26861 31428/30000/26862 29080/29997/26859
+f 22335/29989/26851 22337/29996/26858 22342/29996/26863 22338/29989/26864
+f 22338/29989/26864 22342/29996/26863 29977/29995/26865 29978/29992/26866
+f 22337/29996/26858 29081/29998/26860 29082/29998/26867 22342/29996/26863
+f 22342/29996/26863 29082/29998/26867 31629/29997/26868 29977/29995/26865
+f 22335/29989/26851 22338/29989/26864 22343/29990/26869 22339/29990/26852
+f 22339/29990/26852 22343/29990/26869 29079/29986/26847 29078/29986/26840
+f 22338/29989/26864 29978/29992/26866 29979/29991/26870 22343/29990/26869
+f 22343/29990/26869 29979/29991/26870 31630/29985/26848 29079/29986/26847
+f 22344/30001/26871 22348/30002/26872 22349/30003/26873 22345/30004/26874
+f 22345/30004/26874 22349/30003/26873 27712/30005/26875 27713/30006/26876
+f 22348/30002/26872 29081/29998/26860 29080/29997/26859 22349/30003/26873
+f 22349/30003/26873 29080/29997/26859 31428/30000/26862 27712/30005/26875
+f 22344/30001/26871 22345/30004/26874 22350/30007/26877 22346/30008/26878
+f 22346/30008/26878 22350/30007/26877 29083/30009/26879 29084/30010/26880
+f 22345/30004/26874 27713/30006/26876 27714/30011/26881 22350/30007/26877
+f 22350/30007/26877 27714/30011/26881 31429/30012/26882 29083/30009/26879
+f 22344/30001/26871 22346/30008/26878 22351/30008/26883 22347/30001/26884
+f 22347/30001/26884 22351/30008/26883 30112/30007/26885 30113/30004/26886
+f 22346/30008/26878 29084/30010/26880 29085/30010/26887 22351/30008/26883
+f 22351/30008/26883 29085/30010/26887 31652/30009/26888 30112/30007/26885
+f 22344/30001/26871 22347/30001/26884 22352/30002/26889 22348/30002/26872
+f 22348/30002/26872 22352/30002/26889 29082/29998/26867 29081/29998/26860
+f 22347/30001/26884 30113/30004/26886 30114/30003/26890 22352/30002/26889
+f 22352/30002/26889 30114/30003/26890 31629/29997/26868 29082/29998/26867
+f 22353/30013/26891 22357/30014/26892 22358/30015/26893 22354/30016/26894
+f 22354/30016/26894 22358/30015/26893 27715/30017/26895 27716/30018/26896
+f 22357/30014/26892 29084/30010/26880 29083/30009/26879 22358/30015/26893
+f 22358/30015/26893 29083/30009/26879 31429/30012/26882 27715/30017/26895
+f 22353/30013/26891 22354/30016/26894 22359/30019/26897 22355/30019/26898
+f 22355/30019/26898 22359/30019/26897 29086/30020/26899 29087/30020/26900
+f 22354/30016/26894 27716/30018/26896 27717/30021/26901 22359/30019/26897
+f 22359/30019/26897 27717/30021/26901 31430/30022/26902 29086/30020/26899
+f 22353/30013/26891 22355/30019/26898 22360/30023/26903 22356/30013/26904
+f 22356/30013/26904 22360/30023/26903 30109/30019/26905 30110/30016/26906
+f 22355/30019/26898 29087/30020/26900 29088/30024/26907 22360/30023/26903
+f 22360/30023/26903 29088/30024/26907 31651/30020/26908 30109/30019/26905
+f 22353/30013/26891 22356/30013/26904 22361/30014/26909 22357/30014/26892
+f 22357/30014/26892 22361/30014/26909 29085/30010/26887 29084/30010/26880
+f 22356/30013/26904 30110/30016/26906 30111/30015/26910 22361/30014/26909
+f 22361/30014/26909 30111/30015/26910 31652/30009/26888 29085/30010/26887
+f 22362/30025/26911 22366/30026/26912 22367/30026/26913 22363/30025/26914
+f 22363/30025/26914 22367/30026/26913 27718/30027/26915 27719/30028/26916
+f 22366/30026/26912 29087/30029/26900 29086/30029/26899 22367/30026/26913
+f 22367/30026/26913 29086/30029/26899 31430/30030/26902 27718/30027/26915
+f 22362/30025/26911 22363/30025/26914 22368/30031/26917 22364/30031/26918
+f 22364/30031/26918 22368/30031/26917 29089/30032/26919 29090/30032/26920
+f 22363/30025/26914 27719/30028/26916 27720/30033/26921 22368/30031/26917
+f 22368/30031/26917 27720/30033/26921 31431/30034/26922 29089/30032/26919
+f 22362/30025/26911 22364/30031/26918 22369/30035/26923 22365/30036/26924
+f 22365/30036/26924 22369/30035/26923 30103/30031/26925 30104/30025/26926
+f 22364/30031/26918 29090/30032/26920 29091/30037/26927 22369/30035/26923
+f 22369/30035/26923 29091/30037/26927 31650/30032/26928 30103/30031/26925
+f 22362/30025/26911 22365/30036/26924 22370/30038/26929 22366/30026/26912
+f 22366/30026/26912 22370/30038/26929 29088/30039/26907 29087/30029/26900
+f 22365/30036/26924 30104/30025/26926 30105/30026/26930 22370/30038/26929
+f 22370/30038/26929 30105/30026/26930 31651/30029/26908 29088/30039/26907
+f 22371/30040/26931 22375/30041/26932 22376/30041/26933 22372/30040/26934
+f 22372/30040/26934 22376/30041/26933 27721/30042/26935 27722/30043/26936
+f 22375/30041/26932 29090/30032/26920 29089/30032/26919 22376/30041/26933
+f 22376/30041/26933 29089/30032/26919 31431/30034/26922 27721/30042/26935
+f 22371/30040/26931 22372/30040/26934 22377/30044/26937 22373/30045/26938
+f 22373/30045/26938 22377/30044/26937 29092/30046/26939 29093/30047/26940
+f 22372/30040/26934 27722/30043/26936 27723/30048/26941 22377/30044/26937
+f 22377/30044/26937 27723/30048/26941 31432/30049/26942 29092/30046/26939
+f 22371/30040/26931 22373/30045/26938 22378/30050/26943 22374/30051/26944
+f 22374/30051/26944 22378/30050/26943 30097/30045/26945 30098/30040/26946
+f 22373/30045/26938 29093/30047/26940 29094/30052/26947 22378/30050/26943
+f 22378/30050/26943 29094/30052/26947 31649/30047/26948 30097/30045/26945
+f 22371/30040/26931 22374/30051/26944 22379/30053/26949 22375/30041/26932
+f 22375/30041/26932 22379/30053/26949 29091/30037/26927 29090/30032/26920
+f 22374/30051/26944 30098/30040/26946 30099/30041/26950 22379/30053/26949
+f 22379/30053/26949 30099/30041/26950 31650/30032/26928 29091/30037/26927
+f 22380/30054/26951 22384/30055/26952 22385/30056/26953 22381/30057/26954
+f 22381/30057/26954 22385/30056/26953 27724/30058/26955 27725/30059/26956
+f 22384/30055/26952 29093/30047/26940 29092/30046/26939 22385/30056/26953
+f 22385/30056/26953 29092/30046/26939 31432/30049/26942 27724/30058/26955
+f 22380/30054/26951 22381/30057/26954 22386/30060/26957 22382/30061/26958
+f 22382/30061/26958 22386/30060/26957 29095/30062/26959 29096/30063/26960
+f 22381/30057/26954 27725/30059/26956 27726/30064/26961 22386/30060/26957
+f 22386/30060/26957 27726/30064/26961 31433/30065/26962 29095/30062/26959
+f 22380/30054/26951 22382/30061/26958 22387/30066/26963 22383/30067/26964
+f 22383/30067/26964 22387/30066/26963 30091/30061/26965 30092/30054/26966
+f 22382/30061/26958 29096/30063/26960 29097/30068/26967 22387/30066/26963
+f 22387/30066/26963 29097/30068/26967 31648/30063/26968 30091/30061/26965
+f 22380/30054/26951 22383/30067/26964 22388/30069/26969 22384/30055/26952
+f 22384/30055/26952 22388/30069/26969 29094/30052/26947 29093/30047/26940
+f 22383/30067/26964 30092/30054/26966 30093/30055/26970 22388/30069/26969
+f 22388/30069/26969 30093/30055/26970 31649/30047/26948 29094/30052/26947
+f 22389/30070/26971 22393/30071/26972 22394/30072/26973 22390/30073/26974
+f 22390/30073/26974 22394/30072/26973 27727/30074/26975 27728/30075/26976
+f 22393/30071/26972 29096/30063/26960 29095/30062/26959 22394/30072/26973
+f 22394/30072/26973 29095/30062/26959 31433/30065/26962 27727/30074/26975
+f 22389/30070/26971 22390/30073/26974 22395/30076/26977 22391/30077/26978
+f 22391/30077/26978 22395/30076/26977 29098/30078/26979 29099/30079/26980
+f 22390/30073/26974 27728/30075/26976 27729/30080/26981 22395/30076/26977
+f 22395/30076/26977 27729/30080/26981 31434/30081/26982 29098/30078/26979
+f 22389/30070/26971 22391/30077/26978 22396/30082/26983 22392/30083/26984
+f 22392/30083/26984 22396/30082/26983 30085/30077/26985 30086/30070/26986
+f 22391/30077/26978 29099/30079/26980 29100/30084/26987 22396/30082/26983
+f 22396/30082/26983 29100/30084/26987 31647/30079/26988 30085/30077/26985
+f 22389/30070/26971 22392/30083/26984 22397/30085/26989 22393/30071/26972
+f 22393/30071/26972 22397/30085/26989 29097/30068/26967 29096/30063/26960
+f 22392/30083/26984 30086/30070/26986 30087/30071/26990 22397/30085/26989
+f 22397/30085/26989 30087/30071/26990 31648/30063/26968 29097/30068/26967
+f 22398/30086/26991 22402/30087/26992 22403/30088/26993 22399/30089/26994
+f 22399/30089/26994 22403/30088/26993 27730/30090/26995 27731/30091/26996
+f 22402/30087/26992 29099/30079/26980 29098/30078/26979 22403/30088/26993
+f 22403/30088/26993 29098/30078/26979 31434/30081/26982 27730/30090/26995
+f 22398/30086/26991 22399/30089/26994 22404/30092/26997 22400/30093/26998
+f 22400/30093/26998 22404/30092/26997 29101/30094/26999 29102/30095/27000
+f 22399/30089/26994 27731/30091/26996 27732/30096/27001 22404/30092/26997
+f 22404/30092/26997 27732/30096/27001 31435/30097/27002 29101/30094/26999
+f 22398/30086/26991 22400/30093/26998 22405/30098/27003 22401/30099/27004
+f 22401/30099/27004 22405/30098/27003 30079/30093/27005 30080/30086/27006
+f 22400/30093/26998 29102/30095/27000 29103/30100/27007 22405/30098/27003
+f 22405/30098/27003 29103/30100/27007 31646/30095/27008 30079/30093/27005
+f 22398/30086/26991 22401/30099/27004 22406/30101/27009 22402/30087/26992
+f 22402/30087/26992 22406/30101/27009 29100/30084/26987 29099/30079/26980
+f 22401/30099/27004 30080/30086/27006 30081/30087/27010 22406/30101/27009
+f 22406/30101/27009 30081/30087/27010 31647/30079/26988 29100/30084/26987
+f 22407/30102/27011 22411/30103/27012 22412/30104/27013 22408/30105/27014
+f 22408/30105/27014 22412/30104/27013 27733/30106/27015 27734/30107/27016
+f 22411/30103/27012 29102/30095/27000 29101/30094/26999 22412/30104/27013
+f 22412/30104/27013 29101/30094/26999 31435/30097/27002 27733/30106/27015
+f 22407/30102/27011 22408/30105/27014 22413/30108/27017 22409/30109/27018
+f 22409/30109/27018 22413/30108/27017 29104/30110/27019 29105/30111/27020
+f 22408/30105/27014 27734/30107/27016 27735/30112/27021 22413/30108/27017
+f 22413/30108/27017 27735/30112/27021 31436/30113/27022 29104/30110/27019
+f 22407/30102/27011 22409/30109/27018 22414/30114/27023 22410/30115/27024
+f 22410/30115/27024 22414/30114/27023 30073/30109/27025 30074/30102/27026
+f 22409/30109/27018 29105/30111/27020 29106/30116/27027 22414/30114/27023
+f 22414/30114/27023 29106/30116/27027 31645/30111/27028 30073/30109/27025
+f 22407/30102/27011 22410/30115/27024 22415/30117/27029 22411/30103/27012
+f 22411/30103/27012 22415/30117/27029 29103/30100/27007 29102/30095/27000
+f 22410/30115/27024 30074/30102/27026 30075/30103/27030 22415/30117/27029
+f 22415/30117/27029 30075/30103/27030 31646/30095/27008 29103/30100/27007
+f 22416/30118/27031 22420/30119/27032 22421/30120/27033 22417/30121/27034
+f 22417/30121/27034 22421/30120/27033 27736/30122/27035 27737/30123/27036
+f 22420/30119/27032 29105/30111/27020 29104/30110/27019 22421/30120/27033
+f 22421/30120/27033 29104/30110/27019 31436/30113/27022 27736/30122/27035
+f 22416/30118/27031 22417/30121/27034 22422/30124/27037 22418/30125/27038
+f 22418/30125/27038 22422/30124/27037 29035/30126/27039 29036/30127/27040
+f 22417/30121/27034 27737/30123/27036 27738/30128/27041 22422/30124/27037
+f 22422/30124/27037 27738/30128/27041 31413/30129/27042 29035/30126/27039
+f 22416/30118/27031 22418/30125/27038 22423/30130/27043 22419/30131/27044
+f 22419/30131/27044 22423/30130/27043 30067/30125/27045 30068/30118/27046
+f 22418/30125/27038 29036/30127/27040 29037/30132/27047 22423/30130/27043
+f 22423/30130/27043 29037/30132/27047 31644/30127/27048 30067/30125/27045
+f 22416/30118/27031 22419/30131/27044 22424/30133/27049 22420/30119/27032
+f 22420/30119/27032 22424/30133/27049 29106/30116/27027 29105/30111/27020
+f 22419/30131/27044 30068/30118/27046 30069/30119/27050 22424/30133/27049
+f 22424/30133/27049 30069/30119/27050 31645/30111/27028 29106/30116/27027
+f 22425/30134/27051 22429/30135/27052 22430/30136/27053 22426/30137/27054
+f 22426/30137/27054 22430/30136/27053 27667/30138/27055 27668/30139/27056
+f 22429/30135/27052 29036/30127/27040 29035/30126/27039 22430/30136/27053
+f 22430/30136/27053 29035/30126/27039 31413/30129/27042 27667/30138/27055
+f 22425/30134/27051 22426/30137/27054 22431/30140/27057 22427/30141/27058
+f 22427/30141/27058 22431/30140/27057 29040/29828/26593 29039/29827/26592
+f 22426/30137/27054 27668/30139/27056 27669/30142/27059 22431/30140/27057
+f 22431/30140/27057 27669/30142/27059 31414/29829/26594 29040/29828/26593
+f 22425/30134/27051 22427/30141/27058 22432/30143/27060 22428/30144/27061
+f 22428/30144/27061 22432/30143/27060 30061/30141/27062 30062/30134/27063
+f 22427/30141/27058 29039/29827/26592 29038/29840/26608 22432/30143/27060
+f 22432/30143/27060 29038/29840/26608 31643/29827/26610 30061/30141/27062
+f 22425/30134/27051 22428/30144/27061 22433/30145/27064 22429/30135/27052
+f 22429/30135/27052 22433/30145/27064 29037/30132/27047 29036/30127/27040
+f 22428/30144/27061 30062/30134/27063 30063/30135/27065 22433/30145/27064
+f 22433/30145/27064 30063/30135/27065 31644/30127/27048 29037/30132/27047
+f 22434/30146/27066 22438/30147/27067 22439/30148/27068 22435/30149/27069
+f 22435/30149/27069 22439/30148/27068 29835/29599/26364 29834/29596/26361
+f 22438/30147/27067 29831/30150/27070 29832/30151/27071 22439/30148/27068
+f 22439/30148/27068 29832/30151/27071 31606/29600/26365 29835/29599/26364
+f 22434/30146/27066 22435/30149/27069 22440/30152/27072 22436/30153/27073
+f 22436/30153/27073 22440/30152/27072 29827/30154/27074 29828/30155/27075
+f 22435/30149/27069 29834/29596/26361 29833/29595/26360 22440/30152/27072
+f 22440/30152/27072 29833/29595/26360 31605/29584/26349 29827/30154/27074
+f 22434/30146/27066 22436/30153/27073 22441/30156/27076 22437/30157/27077
+f 22437/30157/27077 22441/30156/27076 27711/29999/26861 27710/29994/26856
+f 22436/30153/27073 29828/30155/27075 29829/30158/27078 22441/30156/27076
+f 22441/30156/27076 29829/30158/27078 31428/30000/26862 27711/29999/26861
+f 22434/30146/27066 22437/30157/27077 22442/30159/27079 22438/30147/27067
+f 22438/30147/27067 22442/30159/27079 29830/30160/27080 29831/30150/27070
+f 22437/30157/27077 27710/29994/26856 27709/29993/26855 22442/30159/27079
+f 22442/30159/27079 27709/29993/26855 31427/29988/26842 29830/30160/27080
+f 22443/30161/27081 22447/30162/27082 22448/30163/27083 22444/30164/27084
+f 22444/30164/27084 22448/30163/27083 29841/29615/26380 29840/29612/26377
+f 22447/30162/27082 29837/30165/27085 29838/30166/27086 22448/30163/27083
+f 22448/30163/27083 29838/30166/27086 31607/29616/26381 29841/29615/26380
+f 22443/30161/27081 22444/30164/27084 22449/30167/27087 22445/30168/27088
+f 22445/30168/27088 22449/30167/27087 29832/30151/27071 29831/30150/27070
+f 22444/30164/27084 29840/29612/26377 29839/29611/26376 22449/30167/27087
+f 22449/30167/27087 29839/29611/26376 31606/29600/26365 29832/30151/27071
+f 22443/30161/27081 22445/30168/27088 22450/30169/27089 22446/30170/27090
+f 22446/30170/27090 22450/30169/27089 27708/29987/26841 27707/29982/26836
+f 22445/30168/27088 29831/30150/27070 29830/30160/27080 22450/30169/27089
+f 22450/30169/27089 29830/30160/27080 31427/29988/26842 27708/29987/26841
+f 22443/30161/27081 22446/30170/27090 22451/30171/27091 22447/30162/27082
+f 22447/30162/27082 22451/30171/27091 29836/30172/27092 29837/30165/27085
+f 22446/30170/27090 27707/29982/26836 27706/29981/26835 22451/30171/27091
+f 22451/30171/27091 27706/29981/26835 31426/29976/26822 29836/30172/27092
+f 22452/30173/27093 22456/30174/27094 22457/30175/27095 22453/30176/27096
+f 22453/30176/27096 22457/30175/27095 29847/29631/26396 29846/29628/26393
+f 22456/30174/27094 29843/30177/27097 29844/30178/27098 22457/30175/27095
+f 22457/30175/27095 29844/30178/27098 31608/29632/26397 29847/29631/26396
+f 22452/30173/27093 22453/30176/27096 22458/30179/27099 22454/30180/27100
+f 22454/30180/27100 22458/30179/27099 29838/30166/27086 29837/30165/27085
+f 22453/30176/27096 29846/29628/26393 29845/29627/26392 22458/30179/27099
+f 22458/30179/27099 29845/29627/26392 31607/29616/26381 29838/30166/27086
+f 22452/30173/27093 22454/30180/27100 22459/30181/27101 22455/30182/27102
+f 22455/30182/27102 22459/30181/27101 27705/29975/26821 27704/29970/26816
+f 22454/30180/27100 29837/30165/27085 29836/30172/27092 22459/30181/27101
+f 22459/30181/27101 29836/30172/27092 31426/29976/26822 27705/29975/26821
+f 22452/30173/27093 22455/30182/27102 22460/30183/27103 22456/30174/27094
+f 22456/30174/27094 22460/30183/27103 29842/30184/27104 29843/30177/27097
+f 22455/30182/27102 27704/29970/26816 27703/29969/26815 22460/30183/27103
+f 22460/30183/27103 27703/29969/26815 31425/29964/26802 29842/30184/27104
+f 22461/30185/27105 22465/30186/27106 22466/30187/27107 22462/30188/27108
+f 22462/30188/27108 22466/30187/27107 29853/29647/26412 29852/29644/26409
+f 22465/30186/27106 29849/30189/27109 29850/30190/27110 22466/30187/27107
+f 22466/30187/27107 29850/30190/27110 31609/29648/26413 29853/29647/26412
+f 22461/30185/27105 22462/30188/27108 22467/30191/27111 22463/30192/27112
+f 22463/30192/27112 22467/30191/27111 29844/30178/27098 29843/30177/27097
+f 22462/30188/27108 29852/29644/26409 29851/29643/26408 22467/30191/27111
+f 22467/30191/27111 29851/29643/26408 31608/29632/26397 29844/30178/27098
+f 22461/30185/27105 22463/30192/27112 22468/30193/27113 22464/30194/27114
+f 22464/30194/27114 22468/30193/27113 27702/29963/26801 27701/29958/26796
+f 22463/30192/27112 29843/30177/27097 29842/30184/27104 22468/30193/27113
+f 22468/30193/27113 29842/30184/27104 31425/29964/26802 27702/29963/26801
+f 22461/30185/27105 22464/30194/27114 22469/30195/27115 22465/30186/27106
+f 22465/30186/27106 22469/30195/27115 29848/30196/27116 29849/30189/27109
+f 22464/30194/27114 27701/29958/26796 27700/29957/26795 22469/30195/27115
+f 22469/30195/27115 27700/29957/26795 31424/29952/26782 29848/30196/27116
+f 22470/30197/27117 22474/30198/27118 22475/30199/27119 22471/30200/27120
+f 22471/30200/27120 22475/30199/27119 29859/29663/26428 29858/29660/26425
+f 22474/30198/27118 29855/30201/27121 29856/30202/27122 22475/30199/27119
+f 22475/30199/27119 29856/30202/27122 31610/29664/26429 29859/29663/26428
+f 22470/30197/27117 22471/30200/27120 22476/30203/27123 22472/30204/27124
+f 22472/30204/27124 22476/30203/27123 29850/30190/27110 29849/30189/27109
+f 22471/30200/27120 29858/29660/26425 29857/29659/26424 22476/30203/27123
+f 22476/30203/27123 29857/29659/26424 31609/29648/26413 29850/30190/27110
+f 22470/30197/27117 22472/30204/27124 22477/30205/27125 22473/30206/27126
+f 22473/30206/27126 22477/30205/27125 27699/29951/26781 27698/29946/26776
+f 22472/30204/27124 29849/30189/27109 29848/30196/27116 22477/30205/27125
+f 22477/30205/27125 29848/30196/27116 31424/29952/26782 27699/29951/26781
+f 22470/30197/27117 22473/30206/27126 22478/30207/27127 22474/30198/27118
+f 22474/30198/27118 22478/30207/27127 29854/30208/27128 29855/30201/27121
+f 22473/30206/27126 27698/29946/26776 27697/29945/26775 22478/30207/27127
+f 22478/30207/27127 27697/29945/26775 31423/29940/26762 29854/30208/27128
+f 22479/30209/27129 22483/30210/27130 22484/30211/27131 22480/30212/27132
+f 22480/30212/27132 22484/30211/27131 29865/29679/26444 29864/29676/26441
+f 22483/30210/27130 29861/30213/27133 29862/30214/27134 22484/30211/27131
+f 22484/30211/27131 29862/30214/27134 31611/29680/26445 29865/29679/26444
+f 22479/30209/27129 22480/30212/27132 22485/30215/27135 22481/30216/27136
+f 22481/30216/27136 22485/30215/27135 29856/30202/27122 29855/30201/27121
+f 22480/30212/27132 29864/29676/26441 29863/29675/26440 22485/30215/27135
+f 22485/30215/27135 29863/29675/26440 31610/29664/26429 29856/30202/27122
+f 22479/30209/27129 22481/30216/27136 22486/30217/27137 22482/30218/27138
+f 22482/30218/27138 22486/30217/27137 27696/29939/26761 27695/29934/26756
+f 22481/30216/27136 29855/30201/27121 29854/30208/27128 22486/30217/27137
+f 22486/30217/27137 29854/30208/27128 31423/29940/26762 27696/29939/26761
+f 22479/30209/27129 22482/30218/27138 22487/30219/27139 22483/30210/27130
+f 22483/30210/27130 22487/30219/27139 29860/30220/27140 29861/30213/27133
+f 22482/30218/27138 27695/29934/26756 27694/29933/26755 22487/30219/27139
+f 22487/30219/27139 27694/29933/26755 31422/29928/26742 29860/30220/27140
+f 22488/30221/27141 22492/30222/27142 22493/30223/27143 22489/30224/27144
+f 22489/30224/27144 22493/30223/27143 29871/29695/26460 29870/29692/26457
+f 22492/30222/27142 29867/30225/27145 29868/30226/27146 22493/30223/27143
+f 22493/30223/27143 29868/30226/27146 31612/29696/26461 29871/29695/26460
+f 22488/30221/27141 22489/30224/27144 22494/30227/27147 22490/30228/27148
+f 22490/30228/27148 22494/30227/27147 29862/30214/27134 29861/30213/27133
+f 22489/30224/27144 29870/29692/26457 29869/29691/26456 22494/30227/27147
+f 22494/30227/27147 29869/29691/26456 31611/29680/26445 29862/30214/27134
+f 22488/30221/27141 22490/30228/27148 22495/30229/27149 22491/30230/27150
+f 22491/30230/27150 22495/30229/27149 27693/29927/26741 27692/29922/26736
+f 22490/30228/27148 29861/30213/27133 29860/30220/27140 22495/30229/27149
+f 22495/30229/27149 29860/30220/27140 31422/29928/26742 27693/29927/26741
+f 22488/30221/27141 22491/30230/27150 22496/30231/27151 22492/30222/27142
+f 22492/30222/27142 22496/30231/27151 29866/30232/27152 29867/30225/27145
+f 22491/30230/27150 27692/29922/26736 27691/29921/26735 22496/30231/27151
+f 22496/30231/27151 27691/29921/26735 31421/29916/26722 29866/30232/27152
+f 22497/30233/27153 22501/30234/27154 22502/30235/27155 22498/30236/27156
+f 22498/30236/27156 22502/30235/27155 29877/29711/26476 29876/29708/26473
+f 22501/30234/27154 29873/30237/27157 29874/30238/27158 22502/30235/27155
+f 22502/30235/27155 29874/30238/27158 31613/29712/26477 29877/29711/26476
+f 22497/30233/27153 22498/30236/27156 22503/30239/27159 22499/30240/27160
+f 22499/30240/27160 22503/30239/27159 29868/30226/27146 29867/30225/27145
+f 22498/30236/27156 29876/29708/26473 29875/29707/26472 22503/30239/27159
+f 22503/30239/27159 29875/29707/26472 31612/29696/26461 29868/30226/27146
+f 22497/30233/27153 22499/30240/27160 22504/30241/27161 22500/30242/27162
+f 22500/30242/27162 22504/30241/27161 27690/29915/26721 27689/29910/26716
+f 22499/30240/27160 29867/30225/27145 29866/30232/27152 22504/30241/27161
+f 22504/30241/27161 29866/30232/27152 31421/29916/26722 27690/29915/26721
+f 22497/30233/27153 22500/30242/27162 22505/30243/27163 22501/30234/27154
+f 22501/30234/27154 22505/30243/27163 29872/30244/27164 29873/30237/27157
+f 22500/30242/27162 27689/29910/26716 27688/29909/26715 22505/30243/27163
+f 22505/30243/27163 27688/29909/26715 31420/29904/26702 29872/30244/27164
+f 22506/30245/27165 22510/30246/27166 22511/30247/27167 22507/30248/27168
+f 22507/30248/27168 22511/30247/27167 29883/29727/26492 29882/29724/26489
+f 22510/30246/27166 29879/30249/27169 29880/30250/27170 22511/30247/27167
+f 22511/30247/27167 29880/30250/27170 31614/29728/26493 29883/29727/26492
+f 22506/30245/27165 22507/30248/27168 22512/30251/27171 22508/30252/27172
+f 22508/30252/27172 22512/30251/27171 29874/30238/27158 29873/30237/27157
+f 22507/30248/27168 29882/29724/26489 29881/29723/26488 22512/30251/27171
+f 22512/30251/27171 29881/29723/26488 31613/29712/26477 29874/30238/27158
+f 22506/30245/27165 22508/30252/27172 22513/30253/27173 22509/30254/27174
+f 22509/30254/27174 22513/30253/27173 27687/29903/26701 27686/29898/26696
+f 22508/30252/27172 29873/30237/27157 29872/30244/27164 22513/30253/27173
+f 22513/30253/27173 29872/30244/27164 31420/29904/26702 27687/29903/26701
+f 22506/30245/27165 22509/30254/27174 22514/30255/27175 22510/30246/27166
+f 22510/30246/27166 22514/30255/27175 29878/30256/27176 29879/30249/27169
+f 22509/30254/27174 27686/29898/26696 27685/29897/26695 22514/30255/27175
+f 22514/30255/27175 27685/29897/26695 31419/29891/26682 29878/30256/27176
+f 22515/30257/27177 22519/30258/27178 22520/30259/27179 22516/30260/27180
+f 22516/30260/27180 22520/30259/27179 29889/29743/26508 29888/29740/26505
+f 22519/30258/27178 29885/30261/27181 29886/30262/27182 22520/30259/27179
+f 22520/30259/27179 29886/30262/27182 31615/29744/26509 29889/29743/26508
+f 22515/30257/27177 22516/30260/27180 22521/30263/27183 22517/30264/27184
+f 22517/30264/27184 22521/30263/27183 29880/30250/27170 29879/30249/27169
+f 22516/30260/27180 29888/29740/26505 29887/29739/26504 22521/30263/27183
+f 22521/30263/27183 29887/29739/26504 31614/29728/26493 29880/30250/27170
+f 22515/30257/27177 22517/30264/27184 22522/30265/27185 22518/30266/27186
+f 22518/30266/27186 22522/30265/27185 27684/29890/26681 27683/29885/26676
+f 22517/30264/27184 29879/30249/27169 29878/30256/27176 22522/30265/27185
+f 22522/30265/27185 29878/30256/27176 31419/29891/26682 27684/29890/26681
+f 22515/30257/27177 22518/30266/27186 22523/30267/27187 22519/30258/27178
+f 22519/30258/27178 22523/30267/27187 29884/30268/27188 29885/30261/27181
+f 22518/30266/27186 27683/29885/26676 27682/29884/26675 22523/30267/27187
+f 22523/30267/27187 27682/29884/26675 31418/29876/26662 29884/30268/27188
+f 22524/30269/27189 22528/30270/27190 22529/30271/27191 22525/30272/27192
+f 22525/30272/27192 22529/30271/27191 29895/29759/26524 29894/29756/26521
+f 22528/30270/27190 29891/30273/27193 29892/30274/27194 22529/30271/27191
+f 22529/30271/27191 29892/30274/27194 31616/29760/26525 29895/29759/26524
+f 22524/30269/27189 22525/30272/27192 22530/30275/27195 22526/30276/27196
+f 22526/30276/27196 22530/30275/27195 29886/30262/27182 29885/30261/27181
+f 22525/30272/27192 29894/29756/26521 29893/29755/26520 22530/30275/27195
+f 22530/30275/27195 29893/29755/26520 31615/29744/26509 29886/30262/27182
+f 22524/30269/27189 22526/30276/27196 22531/30277/27197 22527/30278/27198
+f 22527/30278/27198 22531/30277/27197 27681/29875/26661 27680/29872/26656
+f 22526/30276/27196 29885/30261/27181 29884/30268/27188 22531/30277/27197
+f 22531/30277/27197 29884/30268/27188 31418/29876/26662 27681/29875/26661
+f 22524/30269/27189 22527/30278/27198 22532/30279/27199 22528/30270/27190
+f 22528/30270/27190 22532/30279/27199 29890/30280/27200 29891/30273/27193
+f 22527/30278/27198 27680/29872/26656 27679/29871/26655 22532/30279/27199
+f 22532/30279/27199 27679/29871/26655 31417/29864/26642 29890/30280/27200
+f 22533/30281/27201 22537/30282/27202 22538/30283/27203 22534/30284/27204
+f 22534/30284/27204 22538/30283/27203 29901/29775/26540 29900/29772/26537
+f 22537/30282/27202 29897/30285/27205 29898/30286/27206 22538/30283/27203
+f 22538/30283/27203 29898/30286/27206 31617/29776/26541 29901/29775/26540
+f 22533/30281/27201 22534/30284/27204 22539/30287/27207 22535/30288/27208
+f 22535/30288/27208 22539/30287/27207 29892/30274/27194 29891/30273/27193
+f 22534/30284/27204 29900/29772/26537 29899/29771/26536 22539/30287/27207
+f 22539/30287/27207 29899/29771/26536 31616/29760/26525 29892/30274/27194
+f 22533/30281/27201 22535/30288/27208 22540/30289/27209 22536/30290/27210
+f 22536/30290/27210 22540/30289/27209 27678/29863/26641 27677/29860/26636
+f 22535/30288/27208 29891/30273/27193 29890/30280/27200 22540/30289/27209
+f 22540/30289/27209 29890/30280/27200 31417/29864/26642 27678/29863/26641
+f 22533/30281/27201 22536/30290/27210 22541/30291/27211 22537/30282/27202
+f 22537/30282/27202 22541/30291/27211 29896/30292/27212 29897/30285/27205
+f 22536/30290/27210 27677/29860/26636 27676/29859/26635 22541/30291/27211
+f 22541/30291/27211 27676/29859/26635 31416/29852/26622 29896/30292/27212
+f 22542/30293/27213 22546/30294/27214 22547/30295/27215 22543/30296/27216
+f 22543/30296/27216 22547/30295/27215 29907/29791/26556 29906/29788/26553
+f 22546/30294/27214 29903/30297/27217 29904/30298/27218 22547/30295/27215
+f 22547/30295/27215 29904/30298/27218 31618/29792/26557 29907/29791/26556
+f 22542/30293/27213 22543/30296/27216 22548/30299/27219 22544/30300/27220
+f 22544/30300/27220 22548/30299/27219 29898/30286/27206 29897/30285/27205
+f 22543/30296/27216 29906/29788/26553 29905/29787/26552 22548/30299/27219
+f 22548/30299/27219 29905/29787/26552 31617/29776/26541 29898/30286/27206
+f 22542/30293/27213 22544/30300/27220 22549/30301/27221 22545/30302/27222
+f 22545/30302/27222 22549/30301/27221 27675/29851/26621 27674/29846/26616
+f 22544/30300/27220 29897/30285/27205 29896/30292/27212 22549/30301/27221
+f 22549/30301/27221 29896/30292/27212 31416/29852/26622 27675/29851/26621
+f 22542/30293/27213 22545/30302/27222 22550/30303/27223 22546/30294/27214
+f 22546/30294/27214 22550/30303/27223 29902/30304/27224 29903/30297/27217
+f 22545/30302/27222 27674/29846/26616 27673/29845/26615 22550/30303/27223
+f 22550/30303/27223 27673/29845/26615 31415/29835/26600 29902/30304/27224
+f 22551/30305/27225 22555/30306/27226 22556/30307/27227 22552/30308/27228
+f 22552/30308/27228 22556/30307/27227 29913/29807/26572 29912/29804/26569
+f 22555/30306/27226 29909/30309/27229 29910/30310/27230 22556/30307/27227
+f 22556/30307/27227 29910/30310/27230 31619/29808/26573 29913/29807/26572
+f 22551/30305/27225 22552/30308/27228 22557/30311/27231 22553/30312/27232
+f 22553/30312/27232 22557/30311/27231 29904/30298/27218 29903/30297/27217
+f 22552/30308/27228 29912/29804/26569 29911/29803/26568 22557/30311/27231
+f 22557/30311/27231 29911/29803/26568 31618/29792/26557 29904/30298/27218
+f 22551/30305/27225 22553/30312/27232 22558/30313/27233 22554/30314/27234
+f 22554/30314/27234 22558/30313/27233 27672/29834/26599 27671/29826/26591
+f 22553/30312/27232 29903/30297/27217 29902/30304/27224 22558/30313/27233
+f 22558/30313/27233 29902/30304/27224 31415/29835/26600 27672/29834/26599
+f 22551/30305/27225 22554/30314/27234 22559/30315/27235 22555/30306/27226
+f 22555/30306/27226 22559/30315/27235 29908/30316/27236 29909/30309/27229
+f 22554/30314/27234 27671/29826/26591 27670/29825/26590 22559/30315/27235
+f 22559/30315/27235 27670/29825/26590 31414/29829/26594 29908/30316/27236
+f 22560/30317/27237 22564/30318/27238 22565/30319/27239 22561/30320/27240
+f 22561/30320/27240 22565/30319/27239 29919/29820/26585 29918/29818/26583
+f 22564/30318/27238 29915/30321/27241 29916/30322/27242 22565/30319/27239
+f 22565/30319/27239 29916/30322/27242 31620/29448/26217 29919/29820/26585
+f 22560/30317/27237 22561/30320/27240 22566/30323/27243 22562/30324/27244
+f 22562/30324/27244 22566/30323/27243 29910/30310/27230 29909/30309/27229
+f 22561/30320/27240 29918/29818/26583 29917/29817/26582 22566/30323/27243
+f 22566/30323/27243 29917/29817/26582 31619/29808/26573 29910/30310/27230
+f 22560/30317/27237 22562/30324/27244 22567/30325/27245 22563/30326/27246
+f 22563/30326/27246 22567/30325/27245 27669/30142/27059 27668/30139/27056
+f 22562/30324/27244 29909/30309/27229 29908/30316/27236 22567/30325/27245
+f 22567/30325/27245 29908/30316/27236 31414/29829/26594 27669/30142/27059
+f 22560/30317/27237 22563/30326/27246 22568/30327/27247 22564/30318/27238
+f 22564/30318/27238 22568/30327/27247 29914/30328/27248 29915/30321/27241
+f 22563/30326/27246 27668/30139/27056 27667/30138/27055 22568/30327/27247
+f 22568/30327/27247 27667/30138/27055 31413/30129/27042 29914/30328/27248
+f 22569/30329/27249 22573/30330/27250 22574/30331/27251 22570/30332/27252
+f 22570/30332/27252 22574/30331/27251 29925/29451/26220 29924/29446/26215
+f 22573/30330/27250 29921/30333/27253 29922/30334/27254 22574/30331/27251
+f 22574/30331/27251 29922/30334/27254 31621/29452/26221 29925/29451/26220
+f 22569/30329/27249 22570/30332/27252 22575/30335/27255 22571/30336/27256
+f 22571/30336/27256 22575/30335/27255 29916/30322/27242 29915/30321/27241
+f 22570/30332/27252 29924/29446/26215 29923/29445/26214 22575/30335/27255
+f 22575/30335/27255 29923/29445/26214 31620/29448/26217 29916/30322/27242
+f 22569/30329/27249 22571/30336/27256 22576/30337/27257 22572/30338/27258
+f 22572/30338/27258 22576/30337/27257 27738/30128/27041 27737/30123/27036
+f 22571/30336/27256 29915/30321/27241 29914/30328/27248 22576/30337/27257
+f 22576/30337/27257 29914/30328/27248 31413/30129/27042 27738/30128/27041
+f 22569/30329/27249 22572/30338/27258 22577/30339/27259 22573/30330/27250
+f 22573/30330/27250 22577/30339/27259 29920/30340/27260 29921/30333/27253
+f 22572/30338/27258 27737/30123/27036 27736/30122/27035 22577/30339/27259
+f 22577/30339/27259 27736/30122/27035 31436/30113/27022 29920/30340/27260
+f 22578/30341/27261 22582/30342/27262 22583/30343/27263 22579/30344/27264
+f 22579/30344/27264 22583/30343/27263 29931/29467/26236 29930/29464/26233
+f 22582/30342/27262 29927/30345/27265 29928/30346/27266 22583/30343/27263
+f 22583/30343/27263 29928/30346/27266 31622/29468/26237 29931/29467/26236
+f 22578/30341/27261 22579/30344/27264 22584/30347/27267 22580/30348/27268
+f 22580/30348/27268 22584/30347/27267 29922/30334/27254 29921/30333/27253
+f 22579/30344/27264 29930/29464/26233 29929/29463/26232 22584/30347/27267
+f 22584/30347/27267 29929/29463/26232 31621/29452/26221 29922/30334/27254
+f 22578/30341/27261 22580/30348/27268 22585/30349/27269 22581/30350/27270
+f 22581/30350/27270 22585/30349/27269 27735/30112/27021 27734/30107/27016
+f 22580/30348/27268 29921/30333/27253 29920/30340/27260 22585/30349/27269
+f 22585/30349/27269 29920/30340/27260 31436/30113/27022 27735/30112/27021
+f 22578/30341/27261 22581/30350/27270 22586/30351/27271 22582/30342/27262
+f 22582/30342/27262 22586/30351/27271 29926/30352/27272 29927/30345/27265
+f 22581/30350/27270 27734/30107/27016 27733/30106/27015 22586/30351/27271
+f 22586/30351/27271 27733/30106/27015 31435/30097/27002 29926/30352/27272
+f 22587/30353/27273 22591/30354/27274 22592/30355/27275 22588/30356/27276
+f 22588/30356/27276 22592/30355/27275 29937/29483/26252 29936/29480/26249
+f 22591/30354/27274 29933/30357/27277 29934/30358/27278 22592/30355/27275
+f 22592/30355/27275 29934/30358/27278 31623/29484/26253 29937/29483/26252
+f 22587/30353/27273 22588/30356/27276 22593/30359/27279 22589/30360/27280
+f 22589/30360/27280 22593/30359/27279 29928/30346/27266 29927/30345/27265
+f 22588/30356/27276 29936/29480/26249 29935/29479/26248 22593/30359/27279
+f 22593/30359/27279 29935/29479/26248 31622/29468/26237 29928/30346/27266
+f 22587/30353/27273 22589/30360/27280 22594/30361/27281 22590/30362/27282
+f 22590/30362/27282 22594/30361/27281 27732/30096/27001 27731/30091/26996
+f 22589/30360/27280 29927/30345/27265 29926/30352/27272 22594/30361/27281
+f 22594/30361/27281 29926/30352/27272 31435/30097/27002 27732/30096/27001
+f 22587/30353/27273 22590/30362/27282 22595/30363/27283 22591/30354/27274
+f 22591/30354/27274 22595/30363/27283 29932/30364/27284 29933/30357/27277
+f 22590/30362/27282 27731/30091/26996 27730/30090/26995 22595/30363/27283
+f 22595/30363/27283 27730/30090/26995 31434/30081/26982 29932/30364/27284
+f 22596/30365/27285 22600/30366/27286 22601/30367/27287 22597/30368/27288
+f 22597/30368/27288 22601/30367/27287 29943/29499/26268 29942/29496/26265
+f 22600/30366/27286 29939/30369/27289 29940/30370/27290 22601/30367/27287
+f 22601/30367/27287 29940/30370/27290 31624/29500/26269 29943/29499/26268
+f 22596/30365/27285 22597/30368/27288 22602/30371/27291 22598/30372/27292
+f 22598/30372/27292 22602/30371/27291 29934/30358/27278 29933/30357/27277
+f 22597/30368/27288 29942/29496/26265 29941/29495/26264 22602/30371/27291
+f 22602/30371/27291 29941/29495/26264 31623/29484/26253 29934/30358/27278
+f 22596/30365/27285 22598/30372/27292 22603/30373/27293 22599/30374/27294
+f 22599/30374/27294 22603/30373/27293 27729/30080/26981 27728/30075/26976
+f 22598/30372/27292 29933/30357/27277 29932/30364/27284 22603/30373/27293
+f 22603/30373/27293 29932/30364/27284 31434/30081/26982 27729/30080/26981
+f 22596/30365/27285 22599/30374/27294 22604/30375/27295 22600/30366/27286
+f 22600/30366/27286 22604/30375/27295 29938/30376/27296 29939/30369/27289
+f 22599/30374/27294 27728/30075/26976 27727/30074/26975 22604/30375/27295
+f 22604/30375/27295 27727/30074/26975 31433/30065/26962 29938/30376/27296
+f 22605/30377/27297 22609/30378/27298 22610/30379/27299 22606/30380/27300
+f 22606/30380/27300 22610/30379/27299 29949/29515/26284 29948/29512/26281
+f 22609/30378/27298 29945/30381/27301 29946/30382/27302 22610/30379/27299
+f 22610/30379/27299 29946/30382/27302 31625/29516/26285 29949/29515/26284
+f 22605/30377/27297 22606/30380/27300 22611/30383/27303 22607/30384/27304
+f 22607/30384/27304 22611/30383/27303 29940/30370/27290 29939/30369/27289
+f 22606/30380/27300 29948/29512/26281 29947/29511/26280 22611/30383/27303
+f 22611/30383/27303 29947/29511/26280 31624/29500/26269 29940/30370/27290
+f 22605/30377/27297 22607/30384/27304 22612/30385/27305 22608/30386/27306
+f 22608/30386/27306 22612/30385/27305 27726/30064/26961 27725/30059/26956
+f 22607/30384/27304 29939/30369/27289 29938/30376/27296 22612/30385/27305
+f 22612/30385/27305 29938/30376/27296 31433/30065/26962 27726/30064/26961
+f 22605/30377/27297 22608/30386/27306 22613/30387/27307 22609/30378/27298
+f 22609/30378/27298 22613/30387/27307 29944/30388/27308 29945/30381/27301
+f 22608/30386/27306 27725/30059/26956 27724/30058/26955 22613/30387/27307
+f 22613/30387/27307 27724/30058/26955 31432/30049/26942 29944/30388/27308
+f 22614/30389/27309 22618/30390/27310 22619/30391/27311 22615/30392/27312
+f 22615/30392/27312 22619/30391/27311 29955/29531/26300 29954/29528/26297
+f 22618/30390/27310 29951/30393/27313 29952/30394/27314 22619/30391/27311
+f 22619/30391/27311 29952/30394/27314 31626/29532/26301 29955/29531/26300
+f 22614/30389/27309 22615/30392/27312 22620/30395/27315 22616/30396/27316
+f 22616/30396/27316 22620/30395/27315 29946/30382/27302 29945/30381/27301
+f 22615/30392/27312 29954/29528/26297 29953/29527/26296 22620/30395/27315
+f 22620/30395/27315 29953/29527/26296 31625/29516/26285 29946/30382/27302
+f 22614/30389/27309 22616/30396/27316 22621/30397/27317 22617/30398/27318
+f 22617/30398/27318 22621/30397/27317 27723/30048/26941 27722/30043/26936
+f 22616/30396/27316 29945/30381/27301 29944/30388/27308 22621/30397/27317
+f 22621/30397/27317 29944/30388/27308 31432/30049/26942 27723/30048/26941
+f 22614/30389/27309 22617/30398/27318 22622/30399/27319 22618/30390/27310
+f 22618/30390/27310 22622/30399/27319 29950/30400/27320 29951/30393/27313
+f 22617/30398/27318 27722/30043/26936 27721/30042/26935 22622/30399/27319
+f 22622/30399/27319 27721/30042/26935 31431/30034/26922 29950/30400/27320
+f 22623/30401/27321 22627/30402/27322 22628/30403/27323 22624/30404/27324
+f 22624/30404/27324 22628/30403/27323 29961/29547/26316 29960/29544/26313
+f 22627/30402/27322 29957/30405/27325 29958/30406/27326 22628/30403/27323
+f 22628/30403/27323 29958/30406/27326 31627/29548/26317 29961/29547/26316
+f 22623/30401/27321 22624/30404/27324 22629/30407/27327 22625/30408/27328
+f 22625/30408/27328 22629/30407/27327 29952/30394/27314 29951/30393/27313
+f 22624/30404/27324 29960/29544/26313 29959/29543/26312 22629/30407/27327
+f 22629/30407/27327 29959/29543/26312 31626/29532/26301 29952/30394/27314
+f 22623/30401/27321 22625/30408/27328 22630/30409/27329 22626/30410/27330
+f 22626/30410/27330 22630/30409/27329 27720/30033/26921 27719/30028/26916
+f 22625/30408/27328 29951/30393/27313 29950/30400/27320 22630/30409/27329
+f 22630/30409/27329 29950/30400/27320 31431/30034/26922 27720/30033/26921
+f 22623/30401/27321 22626/30410/27330 22631/30411/27331 22627/30402/27322
+f 22627/30402/27322 22631/30411/27331 29956/30412/27332 29957/30405/27325
+f 22626/30410/27330 27719/30028/26916 27718/30027/26915 22631/30411/27331
+f 22631/30411/27331 27718/30027/26915 31430/30030/26902 29956/30412/27332
+f 22632/30413/27333 22636/30414/27334 22637/30415/27335 22633/30416/27336
+f 22633/30416/27336 22637/30415/27335 29967/29567/26332 29966/29562/26329
+f 22636/30414/27334 29963/30417/27337 29964/30418/27338 22637/30415/27335
+f 22637/30415/27335 29964/30418/27338 31628/29568/26333 29967/29567/26332
+f 22632/30413/27333 22633/30416/27336 22638/30419/27339 22634/30420/27340
+f 22634/30420/27340 22638/30419/27339 29958/30421/27326 29957/30422/27325
+f 22633/30416/27336 29966/29562/26329 29965/29561/26328 22638/30419/27339
+f 22638/30419/27339 29965/29561/26328 31627/29564/26317 29958/30421/27326
+f 22632/30413/27333 22634/30420/27340 22639/30423/27341 22635/30424/27342
+f 22635/30424/27342 22639/30423/27341 27717/30021/26901 27716/30018/26896
+f 22634/30420/27340 29957/30422/27325 29956/30425/27332 22639/30423/27341
+f 22639/30423/27341 29956/30425/27332 31430/30022/26902 27717/30021/26901
+f 22632/30413/27333 22635/30424/27342 22640/30426/27343 22636/30414/27334
+f 22636/30414/27334 22640/30426/27343 29962/30427/27344 29963/30417/27337
+f 22635/30424/27342 27716/30018/26896 27715/30017/26895 22640/30426/27343
+f 22640/30426/27343 27715/30017/26895 31429/30012/26882 29962/30427/27344
+f 22641/30428/27345 22645/30429/27346 22646/30430/27347 22642/30431/27348
+f 22642/30431/27348 22646/30430/27347 29970/29583/26348 29969/29580/26345
+f 22645/30429/27346 29828/30155/27075 29827/30154/27074 22646/30430/27347
+f 22646/30430/27347 29827/30154/27074 31605/29584/26349 29970/29583/26348
+f 22641/30428/27345 22642/30431/27348 22647/30432/27349 22643/30433/27350
+f 22643/30433/27350 22647/30432/27349 29964/30418/27338 29963/30417/27337
+f 22642/30431/27348 29969/29580/26345 29968/29579/26344 22647/30432/27349
+f 22647/30432/27349 29968/29579/26344 31628/29568/26333 29964/30418/27338
+f 22641/30428/27345 22643/30433/27350 22648/30434/27351 22644/30435/27352
+f 22644/30435/27352 22648/30434/27351 27714/30011/26881 27713/30006/26876
+f 22643/30433/27350 29963/30417/27337 29962/30427/27344 22648/30434/27351
+f 22648/30434/27351 29962/30427/27344 31429/30012/26882 27714/30011/26881
+f 22641/30428/27345 22644/30435/27352 22649/30436/27353 22645/30429/27346
+f 22645/30429/27346 22649/30436/27353 29829/30158/27078 29828/30155/27075
+f 22644/30435/27352 27713/30006/26876 27712/30005/26875 22649/30436/27353
+f 22649/30436/27353 27712/30005/26875 31428/30000/26862 29829/30158/27078
+f 22650/30437/27354 22654/30438/27355 22655/29991/27356 22651/29992/27357
+f 22651/29992/27357 22655/29991/27356 29979/29991/26870 29978/29992/26866
+f 22654/30438/27355 29975/30439/27358 29976/29985/27359 22655/29991/27356
+f 22655/29991/27356 29976/29985/27359 31630/29985/26848 29979/29991/26870
+f 22650/30437/27354 22651/29992/27357 22656/29995/27360 22652/30440/27361
+f 22652/30440/27361 22656/29995/27360 29971/29997/27362 29972/30441/27363
+f 22651/29992/27357 29978/29992/26866 29977/29995/26865 22656/29995/27360
+f 22656/29995/27360 29977/29995/26865 31629/29997/26868 29971/29997/27362
+f 22650/30437/27354 22652/30440/27361 22657/30442/27364 22653/30443/27365
+f 22653/30443/27365 22657/30442/27364 29769/27670/24462 29768/27665/24457
+f 22652/30440/27361 29972/30441/27363 29973/30444/27366 22657/30442/27364
+f 22657/30442/27364 29973/30444/27366 31595/27671/24463 29769/27670/24462
+f 22650/30437/27354 22653/30443/27365 22658/30445/27367 22654/30438/27355
+f 22654/30438/27355 22658/30445/27367 29974/30446/27368 29975/30439/27358
+f 22653/30443/27365 29768/27665/24457 29767/27664/24456 22658/30445/27367
+f 22658/30445/27367 29767/27664/24456 31594/27651/24443 29974/30446/27368
+f 22659/30447/27369 22663/30448/27370 22664/29979/27371 22660/29980/27372
+f 22660/29980/27372 22664/29979/27371 29985/29979/26850 29984/29980/26846
+f 22663/30448/27370 29981/30449/27373 29982/29973/27374 22664/29979/27371
+f 22664/29979/27371 29982/29973/27374 31631/29973/26828 29985/29979/26850
+f 22659/30447/27369 22660/29980/27372 22665/29983/27375 22661/30450/27376
+f 22661/30450/27376 22665/29983/27375 29976/29985/27359 29975/30439/27358
+f 22660/29980/27372 29984/29980/26846 29983/29983/26845 22665/29983/27375
+f 22665/29983/27375 29983/29983/26845 31630/29985/26848 29976/29985/27359
+f 22659/30447/27369 22661/30450/27376 22666/30451/27377 22662/30452/27378
+f 22662/30452/27378 22666/30451/27377 29763/27650/24442 29762/27645/24437
+f 22661/30450/27376 29975/30439/27358 29974/30446/27368 22666/30451/27377
+f 22666/30451/27377 29974/30446/27368 31594/27651/24443 29763/27650/24442
+f 22659/30447/27369 22662/30452/27378 22667/30453/27379 22663/30448/27370
+f 22663/30448/27370 22667/30453/27379 29980/30454/27380 29981/30449/27373
+f 22662/30452/27378 29762/27645/24437 29761/27644/24436 22667/30453/27379
+f 22667/30453/27379 29761/27644/24436 31593/27631/24423 29980/30454/27380
+f 22668/30455/27381 22672/30456/27382 22673/29967/27383 22669/29968/27384
+f 22669/29968/27384 22673/29967/27383 29991/29967/26830 29990/29968/26826
+f 22672/30456/27382 29987/30457/27385 29988/29961/27386 22673/29967/27383
+f 22673/29967/27383 29988/29961/27386 31632/29961/26808 29991/29967/26830
+f 22668/30455/27381 22669/29968/27384 22674/29971/27387 22670/30458/27388
+f 22670/30458/27388 22674/29971/27387 29982/29973/27374 29981/30449/27373
+f 22669/29968/27384 29990/29968/26826 29989/29971/26825 22674/29971/27387
+f 22674/29971/27387 29989/29971/26825 31631/29973/26828 29982/29973/27374
+f 22668/30455/27381 22670/30458/27388 22675/30459/27389 22671/30460/27390
+f 22671/30460/27390 22675/30459/27389 29757/27630/24422 29756/27625/24417
+f 22670/30458/27388 29981/30449/27373 29980/30454/27380 22675/30459/27389
+f 22675/30459/27389 29980/30454/27380 31593/27631/24423 29757/27630/24422
+f 22668/30455/27381 22671/30460/27390 22676/30461/27391 22672/30456/27382
+f 22672/30456/27382 22676/30461/27391 29986/30462/27392 29987/30457/27385
+f 22671/30460/27390 29756/27625/24417 29755/27624/24416 22676/30461/27391
+f 22676/30461/27391 29755/27624/24416 31592/27611/24403 29986/30462/27392
+f 22677/30463/27393 22681/30464/27394 22682/29955/27395 22678/29956/27396
+f 22678/29956/27396 22682/29955/27395 29997/29955/26810 29996/29956/26806
+f 22681/30464/27394 29993/30465/27397 29994/29949/27398 22682/29955/27395
+f 22682/29955/27395 29994/29949/27398 31633/29949/26788 29997/29955/26810
+f 22677/30463/27393 22678/29956/27396 22683/29959/27399 22679/30466/27400
+f 22679/30466/27400 22683/29959/27399 29988/29961/27386 29987/30457/27385
+f 22678/29956/27396 29996/29956/26806 29995/29959/26805 22683/29959/27399
+f 22683/29959/27399 29995/29959/26805 31632/29961/26808 29988/29961/27386
+f 22677/30463/27393 22679/30466/27400 22684/30467/27401 22680/30468/27402
+f 22680/30468/27402 22684/30467/27401 29751/27610/24402 29750/27605/24397
+f 22679/30466/27400 29987/30457/27385 29986/30462/27392 22684/30467/27401
+f 22684/30467/27401 29986/30462/27392 31592/27611/24403 29751/27610/24402
+f 22677/30463/27393 22680/30468/27402 22685/30469/27403 22681/30464/27394
+f 22681/30464/27394 22685/30469/27403 29992/30470/27404 29993/30465/27397
+f 22680/30468/27402 29750/27605/24397 29749/27604/24396 22685/30469/27403
+f 22685/30469/27403 29749/27604/24396 31591/27591/24383 29992/30470/27404
+f 22686/30471/27405 22690/30472/27406 22691/29943/27407 22687/29944/27408
+f 22687/29944/27408 22691/29943/27407 30003/29943/26790 30002/29944/26786
+f 22690/30472/27406 29999/30473/27409 30000/29937/27410 22691/29943/27407
+f 22691/29943/27407 30000/29937/27410 31634/29937/26768 30003/29943/26790
+f 22686/30471/27405 22687/29944/27408 22692/29947/27411 22688/30474/27412
+f 22688/30474/27412 22692/29947/27411 29994/29949/27398 29993/30465/27397
+f 22687/29944/27408 30002/29944/26786 30001/29947/26785 22692/29947/27411
+f 22692/29947/27411 30001/29947/26785 31633/29949/26788 29994/29949/27398
+f 22686/30471/27405 22688/30474/27412 22693/30475/27413 22689/30476/27414
+f 22689/30476/27414 22693/30475/27413 29745/27590/24382 29744/27585/24377
+f 22688/30474/27412 29993/30465/27397 29992/30470/27404 22693/30475/27413
+f 22693/30475/27413 29992/30470/27404 31591/27591/24383 29745/27590/24382
+f 22686/30471/27405 22689/30476/27414 22694/30477/27415 22690/30472/27406
+f 22690/30472/27406 22694/30477/27415 29998/30478/27416 29999/30473/27409
+f 22689/30476/27414 29744/27585/24377 29743/27584/24376 22694/30477/27415
+f 22694/30477/27415 29743/27584/24376 31590/27571/24363 29998/30478/27416
+f 22695/30479/27417 22699/30480/27418 22700/29931/27419 22696/29932/27420
+f 22696/29932/27420 22700/29931/27419 30009/29931/26770 30008/29932/26766
+f 22699/30480/27418 30005/30481/27421 30006/29925/27422 22700/29931/27419
+f 22700/29931/27419 30006/29925/27422 31635/29925/26748 30009/29931/26770
+f 22695/30479/27417 22696/29932/27420 22701/29935/27423 22697/30482/27424
+f 22697/30482/27424 22701/29935/27423 30000/29937/27410 29999/30473/27409
+f 22696/29932/27420 30008/29932/26766 30007/29935/26765 22701/29935/27423
+f 22701/29935/27423 30007/29935/26765 31634/29937/26768 30000/29937/27410
+f 22695/30479/27417 22697/30482/27424 22702/30483/27425 22698/30484/27426
+f 22698/30484/27426 22702/30483/27425 29739/27570/24362 29738/27565/24357
+f 22697/30482/27424 29999/30473/27409 29998/30478/27416 22702/30483/27425
+f 22702/30483/27425 29998/30478/27416 31590/27571/24363 29739/27570/24362
+f 22695/30479/27417 22698/30484/27426 22703/30485/27427 22699/30480/27418
+f 22699/30480/27418 22703/30485/27427 30004/30486/27428 30005/30481/27421
+f 22698/30484/27426 29738/27565/24357 29737/27564/24356 22703/30485/27427
+f 22703/30485/27427 29737/27564/24356 31589/27551/24343 30004/30486/27428
+f 22704/30487/27429 22708/30488/27430 22709/29919/27431 22705/29920/27432
+f 22705/29920/27432 22709/29919/27431 30015/29919/26750 30014/29920/26746
+f 22708/30488/27430 30011/30489/27433 30012/29913/27434 22709/29919/27431
+f 22709/29919/27431 30012/29913/27434 31636/29913/26728 30015/29919/26750
+f 22704/30487/27429 22705/29920/27432 22710/29923/27435 22706/30490/27436
+f 22706/30490/27436 22710/29923/27435 30006/29925/27422 30005/30481/27421
+f 22705/29920/27432 30014/29920/26746 30013/29923/26745 22710/29923/27435
+f 22710/29923/27435 30013/29923/26745 31635/29925/26748 30006/29925/27422
+f 22704/30487/27429 22706/30490/27436 22711/30491/27437 22707/30492/27438
+f 22707/30492/27438 22711/30491/27437 29733/27550/24342 29732/27545/24337
+f 22706/30490/27436 30005/30481/27421 30004/30486/27428 22711/30491/27437
+f 22711/30491/27437 30004/30486/27428 31589/27551/24343 29733/27550/24342
+f 22704/30487/27429 22707/30492/27438 22712/30493/27439 22708/30488/27430
+f 22708/30488/27430 22712/30493/27439 30010/30494/27440 30011/30489/27433
+f 22707/30492/27438 29732/27545/24337 29731/27544/24336 22712/30493/27439
+f 22712/30493/27439 29731/27544/24336 31588/27531/24323 30010/30494/27440
+f 22713/30495/27441 22717/30496/27442 22718/29907/27443 22714/29908/27444
+f 22714/29908/27444 22718/29907/27443 30021/29907/26730 30020/29908/26726
+f 22717/30496/27442 30017/30497/27445 30018/29901/27446 22718/29907/27443
+f 22718/29907/27443 30018/29901/27446 31637/29901/26708 30021/29907/26730
+f 22713/30495/27441 22714/29908/27444 22719/29911/27447 22715/30498/27448
+f 22715/30498/27448 22719/29911/27447 30012/29913/27434 30011/30489/27433
+f 22714/29908/27444 30020/29908/26726 30019/29911/26725 22719/29911/27447
+f 22719/29911/27447 30019/29911/26725 31636/29913/26728 30012/29913/27434
+f 22713/30495/27441 22715/30498/27448 22720/30499/27449 22716/30500/27450
+f 22716/30500/27450 22720/30499/27449 29727/27530/24322 29726/27525/24317
+f 22715/30498/27448 30011/30489/27433 30010/30494/27440 22720/30499/27449
+f 22720/30499/27449 30010/30494/27440 31588/27531/24323 29727/27530/24322
+f 22713/30495/27441 22716/30500/27450 22721/30501/27451 22717/30496/27442
+f 22717/30496/27442 22721/30501/27451 30016/30502/27452 30017/30497/27445
+f 22716/30500/27450 29726/27525/24317 29725/27524/24316 22721/30501/27451
+f 22721/30501/27451 29725/27524/24316 31587/27511/24303 30016/30502/27452
+f 22722/30503/27453 22726/30504/27454 22727/29895/27455 22723/29896/27456
+f 22723/29896/27456 22727/29895/27455 30027/29895/26710 30026/29896/26706
+f 22726/30504/27454 30023/30505/27457 30024/29888/27458 22727/29895/27455
+f 22727/29895/27455 30024/29888/27458 31638/29888/26688 30027/29895/26710
+f 22722/30503/27453 22723/29896/27456 22728/29899/27459 22724/30506/27460
+f 22724/30506/27460 22728/29899/27459 30018/29901/27446 30017/30497/27445
+f 22723/29896/27456 30026/29896/26706 30025/29899/26705 22728/29899/27459
+f 22728/29899/27459 30025/29899/26705 31637/29901/26708 30018/29901/27446
+f 22722/30503/27453 22724/30506/27460 22729/30507/27461 22725/30508/27462
+f 22725/30508/27462 22729/30507/27461 29721/27510/24302 29720/27505/24297
+f 22724/30506/27460 30017/30497/27445 30016/30502/27452 22729/30507/27461
+f 22729/30507/27461 30016/30502/27452 31587/27511/24303 29721/27510/24302
+f 22722/30503/27453 22725/30508/27462 22730/30509/27463 22726/30504/27454
+f 22726/30504/27454 22730/30509/27463 30022/30510/27464 30023/30505/27457
+f 22725/30508/27462 29720/27505/24297 29719/27504/24296 22730/30509/27463
+f 22730/30509/27463 29719/27504/24296 31586/27491/24283 30022/30510/27464
+f 22731/30511/27465 22735/30512/27466 22736/29882/27467 22732/29883/27468
+f 22732/29883/27468 22736/29882/27467 30033/29882/26690 30032/29883/26686
+f 22735/30512/27466 30029/30513/27469 30030/29874/27470 22736/29882/27467
+f 22736/29882/27467 30030/29874/27470 31639/29874/26668 30033/29882/26690
+f 22731/30511/27465 22732/29883/27468 22737/29886/27471 22733/30514/27472
+f 22733/30514/27472 22737/29886/27471 30024/29888/27458 30023/30505/27457
+f 22732/29883/27468 30032/29883/26686 30031/29886/26685 22737/29886/27471
+f 22737/29886/27471 30031/29886/26685 31638/29888/26688 30024/29888/27458
+f 22731/30511/27465 22733/30514/27472 22738/30515/27473 22734/30516/27474
+f 22734/30516/27474 22738/30515/27473 29715/27490/24282 29714/27485/24277
+f 22733/30514/27472 30023/30505/27457 30022/30510/27464 22738/30515/27473
+f 22738/30515/27473 30022/30510/27464 31586/27491/24283 29715/27490/24282
+f 22731/30511/27465 22734/30516/27474 22739/30517/27475 22735/30512/27466
+f 22735/30512/27466 22739/30517/27475 30028/30518/27476 30029/30513/27469
+f 22734/30516/27474 29714/27485/24277 29713/27484/24276 22739/30517/27475
+f 22739/30517/27475 29713/27484/24276 31585/27471/24263 30028/30518/27476
+f 22740/30519/27477 22744/30520/27478 22745/29870/27479 22741/29869/27480
+f 22741/29869/27480 22745/29870/27479 30039/29870/26670 30038/29869/26666
+f 22744/30520/27478 30035/30521/27481 30036/29862/27482 22745/29870/27479
+f 22745/29870/27479 30036/29862/27482 31640/29862/26648 30039/29870/26670
+f 22740/30519/27477 22741/29869/27480 22746/29873/27483 22742/30522/27484
+f 22742/30522/27484 22746/29873/27483 30030/29874/27470 30029/30513/27469
+f 22741/29869/27480 30038/29869/26666 30037/29873/26665 22746/29873/27483
+f 22746/29873/27483 30037/29873/26665 31639/29874/26668 30030/29874/27470
+f 22740/30519/27477 22742/30522/27484 22747/30523/27485 22743/30524/27486
+f 22743/30524/27486 22747/30523/27485 29709/27470/24262 29708/27465/24257
+f 22742/30522/27484 30029/30513/27469 30028/30518/27476 22747/30523/27485
+f 22747/30523/27485 30028/30518/27476 31585/27471/24263 29709/27470/24262
+f 22740/30519/27477 22743/30524/27486 22748/30525/27487 22744/30520/27478
+f 22744/30520/27478 22748/30525/27487 30034/30526/27488 30035/30521/27481
+f 22743/30524/27486 29708/27465/24257 29707/27464/24256 22748/30525/27487
+f 22748/30525/27487 29707/27464/24256 31584/27451/24243 30034/30526/27488
+f 22749/30527/27489 22753/30528/27490 22754/29858/27491 22750/29857/27492
+f 22750/29857/27492 22754/29858/27491 30045/29858/26650 30044/29857/26646
+f 22753/30528/27490 30041/30529/27493 30042/29850/27494 22754/29858/27491
+f 22754/29858/27491 30042/29850/27494 31641/29850/26628 30045/29858/26650
+f 22749/30527/27489 22750/29857/27492 22755/29861/27495 22751/30530/27496
+f 22751/30530/27496 22755/29861/27495 30036/29862/27482 30035/30521/27481
+f 22750/29857/27492 30044/29857/26646 30043/29861/26645 22755/29861/27495
+f 22755/29861/27495 30043/29861/26645 31640/29862/26648 30036/29862/27482
+f 22749/30527/27489 22751/30530/27496 22756/30531/27497 22752/30532/27498
+f 22752/30532/27498 22756/30531/27497 29703/27450/24242 29702/27445/24237
+f 22751/30530/27496 30035/30521/27481 30034/30526/27488 22756/30531/27497
+f 22756/30531/27497 30034/30526/27488 31584/27451/24243 29703/27450/24242
+f 22749/30527/27489 22752/30532/27498 22757/30533/27499 22753/30528/27490
+f 22753/30528/27490 22757/30533/27499 30040/30534/27500 30041/30529/27493
+f 22752/30532/27498 29702/27445/24237 29701/27444/24236 22757/30533/27499
+f 22757/30533/27499 29701/27444/24236 31583/27431/24223 30040/30534/27500
+f 22758/30535/27501 22762/30536/27502 22763/29842/27503 22759/29841/27504
+f 22759/29841/27504 22763/29842/27503 30051/29842/26630 30050/29841/26626
+f 22762/30536/27502 30047/30537/27505 30048/29833/27506 22763/29842/27503
+f 22763/29842/27503 30048/29833/27506 31642/29833/26606 30051/29842/26630
+f 22758/30535/27501 22759/29841/27504 22764/29848/27507 22760/30538/27508
+f 22760/30538/27508 22764/29848/27507 30042/29850/27494 30041/30529/27493
+f 22759/29841/27504 30050/29841/26626 30049/29848/26625 22764/29848/27507
+f 22764/29848/27507 30049/29848/26625 31641/29850/26628 30042/29850/27494
+f 22758/30535/27501 22760/30538/27508 22765/30539/27509 22761/30540/27510
+f 22761/30540/27510 22765/30539/27509 29697/27430/24222 29696/27425/24217
+f 22760/30538/27508 30041/30529/27493 30040/30534/27500 22765/30539/27509
+f 22765/30539/27509 30040/30534/27500 31583/27431/24223 29697/27430/24222
+f 22758/30535/27501 22761/30540/27510 22766/30541/27511 22762/30536/27502
+f 22762/30536/27502 22766/30541/27511 30046/30542/27512 30047/30537/27505
+f 22761/30540/27510 29696/27425/24217 29695/27424/24216 22766/30541/27511
+f 22766/30541/27511 29695/27424/24216 31582/27411/24203 30046/30542/27512
+f 22767/30543/27513 22771/30544/27514 22772/29822/27515 22768/29821/27516
+f 22768/29821/27516 22772/29822/27515 30057/29822/26609 30056/29821/26604
+f 22771/30544/27514 30053/30545/27517 30054/29827/27518 22772/29822/27515
+f 22772/29822/27515 30054/29827/27518 31643/29827/26610 30057/29822/26609
+f 22767/30543/27513 22768/29821/27516 22773/29831/27519 22769/30546/27520
+f 22769/30546/27520 22773/29831/27519 30048/29833/27506 30047/30537/27505
+f 22768/29821/27516 30056/29821/26604 30055/29831/26603 22773/29831/27519
+f 22773/29831/27519 30055/29831/26603 31642/29833/26606 30048/29833/27506
+f 22767/30543/27513 22769/30546/27520 22774/30547/27521 22770/30548/27522
+f 22770/30548/27522 22774/30547/27521 29691/27410/24202 29690/27405/24197
+f 22769/30546/27520 30047/30537/27505 30046/30542/27512 22774/30547/27521
+f 22774/30547/27521 30046/30542/27512 31582/27411/24203 29691/27410/24202
+f 22767/30543/27513 22770/30548/27522 22775/30549/27523 22771/30544/27514
+f 22771/30544/27514 22775/30549/27523 30052/30550/27524 30053/30545/27517
+f 22770/30548/27522 29690/27405/24197 29689/27404/24196 22775/30549/27523
+f 22775/30549/27523 29689/27404/24196 31581/27389/24181 30052/30550/27524
+f 22776/30551/27525 22780/30552/27526 22781/30135/27527 22777/30134/27528
+f 22777/30134/27528 22781/30135/27527 30063/30135/27065 30062/30134/27063
+f 22780/30552/27526 30059/30553/27529 30060/30127/27530 22781/30135/27527
+f 22781/30135/27527 30060/30127/27530 31644/30127/27048 30063/30135/27065
+f 22776/30551/27525 22777/30134/27528 22782/30141/27531 22778/30554/27532
+f 22778/30554/27532 22782/30141/27531 30054/29827/27518 30053/30545/27517
+f 22777/30134/27528 30062/30134/27063 30061/30141/27062 22782/30141/27531
+f 22782/30141/27531 30061/30141/27062 31643/29827/26610 30054/29827/27518
+f 22776/30551/27525 22778/30554/27532 22783/30555/27533 22779/30556/27534
+f 22779/30556/27534 22783/30555/27533 29826/27388/24180 29825/27380/24172
+f 22778/30554/27532 30053/30545/27517 30052/30550/27524 22783/30555/27533
+f 22783/30555/27533 30052/30550/27524 31581/27389/24181 29826/27388/24180
+f 22776/30551/27525 22779/30556/27534 22784/30557/27535 22780/30552/27526
+f 22780/30552/27526 22784/30557/27535 30058/30558/27536 30059/30553/27529
+f 22779/30556/27534 29825/27380/24172 29824/27379/24171 22784/30557/27535
+f 22784/30557/27535 29824/27379/24171 31604/27383/24175 30058/30558/27536
+f 22785/30559/27537 22789/30560/27538 22790/30119/27539 22786/30118/27540
+f 22786/30118/27540 22790/30119/27539 30069/30119/27050 30068/30118/27046
+f 22789/30560/27538 30065/30561/27541 30066/30111/27542 22790/30119/27539
+f 22790/30119/27539 30066/30111/27542 31645/30111/27028 30069/30119/27050
+f 22785/30559/27537 22786/30118/27540 22791/30125/27543 22787/30562/27544
+f 22787/30562/27544 22791/30125/27543 30060/30127/27530 30059/30553/27529
+f 22786/30118/27540 30068/30118/27046 30067/30125/27045 22791/30125/27543
+f 22791/30125/27543 30067/30125/27045 31644/30127/27048 30060/30127/27530
+f 22785/30559/27537 22787/30562/27544 22792/30563/27545 22788/30564/27546
+f 22788/30564/27546 22792/30563/27545 29823/27853/24640 29822/27850/24637
+f 22787/30562/27544 30059/30553/27529 30058/30558/27536 22792/30563/27545
+f 22792/30563/27545 30058/30558/27536 31604/27383/24175 29823/27853/24640
+f 22785/30559/27537 22788/30564/27546 22793/30565/27547 22789/30560/27538
+f 22789/30560/27538 22793/30565/27547 30064/30566/27548 30065/30561/27541
+f 22788/30564/27546 29822/27850/24637 29821/27849/24636 22793/30565/27547
+f 22793/30565/27547 29821/27849/24636 31603/27836/24623 30064/30566/27548
+f 22794/30567/27549 22798/30568/27550 22799/30103/27551 22795/30102/27552
+f 22795/30102/27552 22799/30103/27551 30075/30103/27030 30074/30102/27026
+f 22798/30568/27550 30071/30569/27553 30072/30095/27554 22799/30103/27551
+f 22799/30103/27551 30072/30095/27554 31646/30095/27008 30075/30103/27030
+f 22794/30567/27549 22795/30102/27552 22800/30109/27555 22796/30570/27556
+f 22796/30570/27556 22800/30109/27555 30066/30111/27542 30065/30561/27541
+f 22795/30102/27552 30074/30102/27026 30073/30109/27025 22800/30109/27555
+f 22800/30109/27555 30073/30109/27025 31645/30111/27028 30066/30111/27542
+f 22794/30567/27549 22796/30570/27556 22801/30571/27557 22797/30572/27558
+f 22797/30572/27558 22801/30571/27557 29817/27835/24622 29816/27830/24617
+f 22796/30570/27556 30065/30561/27541 30064/30566/27548 22801/30571/27557
+f 22801/30571/27557 30064/30566/27548 31603/27836/24623 29817/27835/24622
+f 22794/30567/27549 22797/30572/27558 22802/30573/27559 22798/30568/27550
+f 22798/30568/27550 22802/30573/27559 30070/30574/27560 30071/30569/27553
+f 22797/30572/27558 29816/27830/24617 29815/27829/24616 22802/30573/27559
+f 22802/30573/27559 29815/27829/24616 31602/27816/24603 30070/30574/27560
+f 22803/30575/27561 22807/30576/27562 22808/30087/27563 22804/30086/27564
+f 22804/30086/27564 22808/30087/27563 30081/30087/27010 30080/30086/27006
+f 22807/30576/27562 30077/30577/27565 30078/30079/27566 22808/30087/27563
+f 22808/30087/27563 30078/30079/27566 31647/30079/26988 30081/30087/27010
+f 22803/30575/27561 22804/30086/27564 22809/30093/27567 22805/30578/27568
+f 22805/30578/27568 22809/30093/27567 30072/30095/27554 30071/30569/27553
+f 22804/30086/27564 30080/30086/27006 30079/30093/27005 22809/30093/27567
+f 22809/30093/27567 30079/30093/27005 31646/30095/27008 30072/30095/27554
+f 22803/30575/27561 22805/30578/27568 22810/30579/27569 22806/30580/27570
+f 22806/30580/27570 22810/30579/27569 29811/27815/24602 29810/27810/24597
+f 22805/30578/27568 30071/30569/27553 30070/30574/27560 22810/30579/27569
+f 22810/30579/27569 30070/30574/27560 31602/27816/24603 29811/27815/24602
+f 22803/30575/27561 22806/30580/27570 22811/30581/27571 22807/30576/27562
+f 22807/30576/27562 22811/30581/27571 30076/30582/27572 30077/30577/27565
+f 22806/30580/27570 29810/27810/24597 29809/27809/24596 22811/30581/27571
+f 22811/30581/27571 29809/27809/24596 31601/27796/24583 30076/30582/27572
+f 22812/30583/27573 22816/30584/27574 22817/30071/27575 22813/30070/27576
+f 22813/30070/27576 22817/30071/27575 30087/30071/26990 30086/30070/26986
+f 22816/30584/27574 30083/30585/27577 30084/30063/27578 22817/30071/27575
+f 22817/30071/27575 30084/30063/27578 31648/30063/26968 30087/30071/26990
+f 22812/30583/27573 22813/30070/27576 22818/30077/27579 22814/30586/27580
+f 22814/30586/27580 22818/30077/27579 30078/30079/27566 30077/30577/27565
+f 22813/30070/27576 30086/30070/26986 30085/30077/26985 22818/30077/27579
+f 22818/30077/27579 30085/30077/26985 31647/30079/26988 30078/30079/27566
+f 22812/30583/27573 22814/30586/27580 22819/30587/27581 22815/30588/27582
+f 22815/30588/27582 22819/30587/27581 29805/27795/24582 29804/27790/24577
+f 22814/30586/27580 30077/30577/27565 30076/30582/27572 22819/30587/27581
+f 22819/30587/27581 30076/30582/27572 31601/27796/24583 29805/27795/24582
+f 22812/30583/27573 22815/30588/27582 22820/30589/27583 22816/30584/27574
+f 22816/30584/27574 22820/30589/27583 30082/30590/27584 30083/30585/27577
+f 22815/30588/27582 29804/27790/24577 29803/27789/24576 22820/30589/27583
+f 22820/30589/27583 29803/27789/24576 31600/27776/24563 30082/30590/27584
+f 22821/30591/27585 22825/30592/27586 22826/30055/27587 22822/30054/27588
+f 22822/30054/27588 22826/30055/27587 30093/30055/26970 30092/30054/26966
+f 22825/30592/27586 30089/30593/27589 30090/30047/27590 22826/30055/27587
+f 22826/30055/27587 30090/30047/27590 31649/30047/26948 30093/30055/26970
+f 22821/30591/27585 22822/30054/27588 22827/30061/27591 22823/30594/27592
+f 22823/30594/27592 22827/30061/27591 30084/30063/27578 30083/30585/27577
+f 22822/30054/27588 30092/30054/26966 30091/30061/26965 22827/30061/27591
+f 22827/30061/27591 30091/30061/26965 31648/30063/26968 30084/30063/27578
+f 22821/30591/27585 22823/30594/27592 22828/30595/27593 22824/30596/27594
+f 22824/30596/27594 22828/30595/27593 29799/27775/24562 29798/27770/24557
+f 22823/30594/27592 30083/30585/27577 30082/30590/27584 22828/30595/27593
+f 22828/30595/27593 30082/30590/27584 31600/27776/24563 29799/27775/24562
+f 22821/30591/27585 22824/30596/27594 22829/30597/27595 22825/30592/27586
+f 22825/30592/27586 22829/30597/27595 30088/30598/27596 30089/30593/27589
+f 22824/30596/27594 29798/27770/24557 29797/27769/24556 22829/30597/27595
+f 22829/30597/27595 29797/27769/24556 31599/27756/24543 30088/30598/27596
+f 22830/30599/27597 22834/30600/27598 22835/30041/27599 22831/30040/27600
+f 22831/30040/27600 22835/30041/27599 30099/30041/26950 30098/30040/26946
+f 22834/30600/27598 30095/30601/27601 30096/30032/27602 22835/30041/27599
+f 22835/30041/27599 30096/30032/27602 31650/30032/26928 30099/30041/26950
+f 22830/30599/27597 22831/30040/27600 22836/30045/27603 22832/30602/27604
+f 22832/30602/27604 22836/30045/27603 30090/30047/27590 30089/30593/27589
+f 22831/30040/27600 30098/30040/26946 30097/30045/26945 22836/30045/27603
+f 22836/30045/27603 30097/30045/26945 31649/30047/26948 30090/30047/27590
+f 22830/30599/27597 22832/30602/27604 22837/30603/27605 22833/30604/27606
+f 22833/30604/27606 22837/30603/27605 29793/27755/24542 29792/27750/24537
+f 22832/30602/27604 30089/30593/27589 30088/30598/27596 22837/30603/27605
+f 22837/30603/27605 30088/30598/27596 31599/27756/24543 29793/27755/24542
+f 22830/30599/27597 22833/30604/27606 22838/30605/27607 22834/30600/27598
+f 22834/30600/27598 22838/30605/27607 30094/30606/27608 30095/30601/27601
+f 22833/30604/27606 29792/27750/24537 29791/27749/24536 22838/30605/27607
+f 22838/30605/27607 29791/27749/24536 31598/27734/24523 30094/30606/27608
+f 22839/30607/27609 22843/30608/27610 22844/30026/27611 22840/30025/27612
+f 22840/30025/27612 22844/30026/27611 30105/30026/26930 30104/30025/26926
+f 22843/30608/27610 30101/30609/27613 30102/30029/27614 22844/30026/27611
+f 22844/30026/27611 30102/30029/27614 31651/30029/26908 30105/30026/26930
+f 22839/30607/27609 22840/30025/27612 22845/30031/27615 22841/30610/27616
+f 22841/30610/27616 22845/30031/27615 30096/30032/27602 30095/30601/27601
+f 22840/30025/27612 30104/30025/26926 30103/30031/26925 22845/30031/27615
+f 22845/30031/27615 30103/30031/26925 31650/30032/26928 30096/30032/27602
+f 22839/30607/27609 22841/30610/27616 22846/30611/27617 22842/30612/27618
+f 22842/30612/27618 22846/30611/27617 29787/27733/24522 29786/27725/24517
+f 22841/30610/27616 30095/30601/27601 30094/30606/27608 22846/30611/27617
+f 22846/30611/27617 30094/30606/27608 31598/27734/24523 29787/27733/24522
+f 22839/30607/27609 22842/30612/27618 22847/30613/27619 22843/30608/27610
+f 22843/30608/27610 22847/30613/27619 30100/30614/27620 30101/30609/27613
+f 22842/30612/27618 29786/27725/24517 29785/27724/24516 22847/30613/27619
+f 22847/30613/27619 29785/27724/24516 31597/27728/24503 30100/30614/27620
+f 22848/30615/27621 22852/30616/27622 22853/30015/27623 22849/30016/27624
+f 22849/30016/27624 22853/30015/27623 30111/30015/26910 30110/30016/26906
+f 22852/30616/27622 30107/30617/27625 30108/30009/27626 22853/30015/27623
+f 22853/30015/27623 30108/30009/27626 31652/30009/26888 30111/30015/26910
+f 22848/30615/27621 22849/30016/27624 22854/30019/27627 22850/30618/27628
+f 22850/30618/27628 22854/30019/27627 30102/30020/27614 30101/30619/27613
+f 22849/30016/27624 30110/30016/26906 30109/30019/26905 22854/30019/27627
+f 22854/30019/27627 30109/30019/26905 31651/30020/26908 30102/30020/27614
+f 22848/30615/27621 22850/30618/27628 22855/30620/27629 22851/30621/27630
+f 22851/30621/27630 22855/30620/27629 29781/27710/24502 29780/27705/24497
+f 22850/30618/27628 30101/30619/27613 30100/30622/27620 22855/30620/27629
+f 22855/30620/27629 30100/30622/27620 31597/27711/24503 29781/27710/24502
+f 22848/30615/27621 22851/30621/27630 22856/30623/27631 22852/30616/27622
+f 22852/30616/27622 22856/30623/27631 30106/30624/27632 30107/30617/27625
+f 22851/30621/27630 29780/27705/24497 29779/27704/24496 22856/30623/27631
+f 22856/30623/27631 29779/27704/24496 31596/27691/24483 30106/30624/27632
+f 22857/30625/27633 22861/30626/27634 22862/30003/27635 22858/30004/27636
+f 22858/30004/27636 22862/30003/27635 30114/30003/26890 30113/30004/26886
+f 22861/30626/27634 29972/30441/27363 29971/29997/27362 22862/30003/27635
+f 22862/30003/27635 29971/29997/27362 31629/29997/26868 30114/30003/26890
+f 22857/30625/27633 22858/30004/27636 22863/30007/27637 22859/30627/27638
+f 22859/30627/27638 22863/30007/27637 30108/30009/27626 30107/30617/27625
+f 22858/30004/27636 30113/30004/26886 30112/30007/26885 22863/30007/27637
+f 22863/30007/27637 30112/30007/26885 31652/30009/26888 30108/30009/27626
+f 22857/30625/27633 22859/30627/27638 22864/30628/27639 22860/30629/27640
+f 22860/30629/27640 22864/30628/27639 29775/27690/24482 29774/27685/24477
+f 22859/30627/27638 30107/30617/27625 30106/30624/27632 22864/30628/27639
+f 22864/30628/27639 30106/30624/27632 31596/27691/24483 29775/27690/24482
+f 22857/30625/27633 22860/30629/27640 22865/30630/27641 22861/30626/27634
+f 22861/30626/27634 22865/30630/27641 29973/30444/27366 29972/30441/27363
+f 22860/30629/27640 29774/27685/24477 29773/27684/24476 22865/30630/27641
+f 22865/30630/27641 29773/27684/24476 31595/27671/24463 29973/30444/27366
+f 22866/30631/27642 22870/30632/27643 22871/30633/27644 22867/30634/27645
+f 22867/30634/27645 22871/30633/27644 26199/20999/17898 26198/20996/17895
+f 22870/30632/27643 30119/30635/27646 30120/30636/27647 22871/30633/27644
+f 22871/30633/27644 30120/30636/27647 30996/21000/17899 26199/20999/17898
+f 22866/30631/27642 22867/30634/27645 22872/30637/27648 22868/30638/27649
+f 22868/30638/27649 22872/30637/27648 30115/30639/27650 30116/30640/27651
+f 22867/30634/27645 26198/20996/17895 26197/20995/17894 22872/30637/27648
+f 22872/30637/27648 26197/20995/17894 30995/20984/17883 30115/30639/27650
+f 22866/30631/27642 22868/30638/27649 22873/30641/27652 22869/30642/27653
+f 22869/30642/27653 22873/30641/27652 29343/29147/25916 29342/29144/25913
+f 22868/30638/27649 30116/30640/27651 30117/30643/27654 22873/30641/27652
+f 22873/30641/27652 30117/30643/27654 31523/29148/25917 29343/29147/25916
+f 22866/30631/27642 22869/30642/27653 22874/30644/27655 22870/30632/27643
+f 22870/30632/27643 22874/30644/27655 30118/30645/27656 30119/30635/27646
+f 22869/30642/27653 29342/29144/25913 29341/29143/25912 22874/30644/27655
+f 22874/30644/27655 29341/29143/25912 31524/29132/25901 30118/30645/27656
+f 22875/30646/27657 22879/30647/27658 22880/30648/27659 22876/30649/27660
+f 22876/30649/27660 22880/30648/27659 26196/20983/17882 26195/20980/17879
+f 22879/30647/27658 30116/30640/27651 30115/30639/27650 22880/30648/27659
+f 22880/30648/27659 30115/30639/27650 30995/20984/17883 26196/20983/17882
+f 22875/30646/27657 22876/30649/27660 22881/30650/27661 22877/30651/27662
+f 22877/30651/27662 22881/30650/27661 30121/30652/27663 30122/30653/27664
+f 22876/30649/27660 26195/20980/17879 26194/20979/17878 22881/30650/27661
+f 22881/30650/27661 26194/20979/17878 30994/20968/17867 30121/30652/27663
+f 22875/30646/27657 22877/30651/27662 22882/30654/27665 22878/30655/27666
+f 22878/30655/27666 22882/30654/27665 29337/29163/25932 29336/29160/25929
+f 22877/30651/27662 30122/30653/27664 30123/30656/27667 22882/30654/27665
+f 22882/30654/27665 30123/30656/27667 31522/29164/25933 29337/29163/25932
+f 22875/30646/27657 22878/30655/27666 22883/30657/27668 22879/30647/27658
+f 22879/30647/27658 22883/30657/27668 30117/30643/27654 30116/30640/27651
+f 22878/30655/27666 29336/29160/25929 29335/29159/25928 22883/30657/27668
+f 22883/30657/27668 29335/29159/25928 31523/29148/25917 30117/30643/27654
+f 22884/30658/27669 22888/30659/27670 22889/30660/27671 22885/30661/27672
+f 22885/30661/27672 22889/30660/27671 26193/20967/17866 26192/20964/17863
+f 22888/30659/27670 30122/30653/27664 30121/30652/27663 22889/30660/27671
+f 22889/30660/27671 30121/30652/27663 30994/20968/17867 26193/20967/17866
+f 22884/30658/27669 22885/30661/27672 22890/30662/27673 22886/30663/27674
+f 22886/30663/27674 22890/30662/27673 30124/30664/27675 30125/30665/27676
+f 22885/30661/27672 26192/20964/17863 26191/20963/17862 22890/30662/27673
+f 22890/30662/27673 26191/20963/17862 30993/20952/17851 30124/30664/27675
+f 22884/30658/27669 22886/30663/27674 22891/30666/27677 22887/30667/27678
+f 22887/30667/27678 22891/30666/27677 29331/29179/25948 29330/29176/25945
+f 22886/30663/27674 30125/30665/27676 30126/30668/27679 22891/30666/27677
+f 22891/30666/27677 30126/30668/27679 31521/29180/25949 29331/29179/25948
+f 22884/30658/27669 22887/30667/27678 22892/30669/27680 22888/30659/27670
+f 22888/30659/27670 22892/30669/27680 30123/30656/27667 30122/30653/27664
+f 22887/30667/27678 29330/29176/25945 29329/29175/25944 22892/30669/27680
+f 22892/30669/27680 29329/29175/25944 31522/29164/25933 30123/30656/27667
+f 22893/30670/27681 22897/30671/27682 22898/30672/27683 22894/30673/27684
+f 22894/30673/27684 22898/30672/27683 26190/20951/17850 26189/20948/17847
+f 22897/30671/27682 30125/30665/27676 30124/30664/27675 22898/30672/27683
+f 22898/30672/27683 30124/30664/27675 30993/20952/17851 26190/20951/17850
+f 22893/30670/27681 22894/30673/27684 22899/30674/27685 22895/30675/27686
+f 22895/30675/27686 22899/30674/27685 30127/30676/27687 30128/30677/27688
+f 22894/30673/27684 26189/20948/17847 26188/20947/17846 22899/30674/27685
+f 22899/30674/27685 26188/20947/17846 30992/20936/17835 30127/30676/27687
+f 22893/30670/27681 22895/30675/27686 22900/30678/27689 22896/30679/27690
+f 22896/30679/27690 22900/30678/27689 29325/29195/25964 29324/29192/25961
+f 22895/30675/27686 30128/30677/27688 30129/30680/27691 22900/30678/27689
+f 22900/30678/27689 30129/30680/27691 31520/29196/25965 29325/29195/25964
+f 22893/30670/27681 22896/30679/27690 22901/30681/27692 22897/30671/27682
+f 22897/30671/27682 22901/30681/27692 30126/30668/27679 30125/30665/27676
+f 22896/30679/27690 29324/29192/25961 29323/29191/25960 22901/30681/27692
+f 22901/30681/27692 29323/29191/25960 31521/29180/25949 30126/30668/27679
+f 22902/30682/27693 22906/30683/27694 22907/30684/27695 22903/30685/27696
+f 22903/30685/27696 22907/30684/27695 26187/20935/17834 26186/20932/17831
+f 22906/30683/27694 30128/30677/27688 30127/30676/27687 22907/30684/27695
+f 22907/30684/27695 30127/30676/27687 30992/20936/17835 26187/20935/17834
+f 22902/30682/27693 22903/30685/27696 22908/30686/27697 22904/30687/27698
+f 22904/30687/27698 22908/30686/27697 30130/30688/27699 30131/30689/27700
+f 22903/30685/27696 26186/20932/17831 26185/20931/17830 22908/30686/27697
+f 22908/30686/27697 26185/20931/17830 30991/20920/17819 30130/30688/27699
+f 22902/30682/27693 22904/30687/27698 22909/30690/27701 22905/30691/27702
+f 22905/30691/27702 22909/30690/27701 29319/29211/25980 29318/29208/25977
+f 22904/30687/27698 30131/30689/27700 30132/30692/27703 22909/30690/27701
+f 22909/30690/27701 30132/30692/27703 31519/29212/25981 29319/29211/25980
+f 22902/30682/27693 22905/30691/27702 22910/30693/27704 22906/30683/27694
+f 22906/30683/27694 22910/30693/27704 30129/30680/27691 30128/30677/27688
+f 22905/30691/27702 29318/29208/25977 29317/29207/25976 22910/30693/27704
+f 22910/30693/27704 29317/29207/25976 31520/29196/25965 30129/30680/27691
+f 22911/30694/27705 22915/30695/27706 22916/30696/27707 22912/30697/27708
+f 22912/30697/27708 22916/30696/27707 26184/20919/17818 26183/20916/17815
+f 22915/30695/27706 30131/30689/27700 30130/30688/27699 22916/30696/27707
+f 22916/30696/27707 30130/30688/27699 30991/20920/17819 26184/20919/17818
+f 22911/30694/27705 22912/30697/27708 22917/30698/27709 22913/30699/27710
+f 22913/30699/27710 22917/30698/27709 30133/30700/27711 30134/30701/27712
+f 22912/30697/27708 26183/20916/17815 26182/20915/17814 22917/30698/27709
+f 22917/30698/27709 26182/20915/17814 30990/20904/17803 30133/30700/27711
+f 22911/30694/27705 22913/30699/27710 22918/30702/27713 22914/30703/27714
+f 22914/30703/27714 22918/30702/27713 29313/29227/25996 29312/29224/25993
+f 22913/30699/27710 30134/30701/27712 30135/30704/27715 22918/30702/27713
+f 22918/30702/27713 30135/30704/27715 31518/29228/25997 29313/29227/25996
+f 22911/30694/27705 22914/30703/27714 22919/30705/27716 22915/30695/27706
+f 22915/30695/27706 22919/30705/27716 30132/30692/27703 30131/30689/27700
+f 22914/30703/27714 29312/29224/25993 29311/29223/25992 22919/30705/27716
+f 22919/30705/27716 29311/29223/25992 31519/29212/25981 30132/30692/27703
+f 22920/30706/27717 22924/30707/27718 22925/30708/27719 22921/30709/27720
+f 22921/30709/27720 22925/30708/27719 26181/20903/17802 26180/20900/17799
+f 22924/30707/27718 30134/30701/27712 30133/30700/27711 22925/30708/27719
+f 22925/30708/27719 30133/30700/27711 30990/20904/17803 26181/20903/17802
+f 22920/30706/27717 22921/30709/27720 22926/30710/27721 22922/30711/27722
+f 22922/30711/27722 22926/30710/27721 30136/30712/27723 30137/30713/27724
+f 22921/30709/27720 26180/20900/17799 26179/20899/17798 22926/30710/27721
+f 22926/30710/27721 26179/20899/17798 30989/20888/17787 30136/30712/27723
+f 22920/30706/27717 22922/30711/27722 22927/30714/27725 22923/30715/27726
+f 22923/30715/27726 22927/30714/27725 29307/29243/26012 29306/29240/26009
+f 22922/30711/27722 30137/30713/27724 30138/30716/27727 22927/30714/27725
+f 22927/30714/27725 30138/30716/27727 31517/29244/26013 29307/29243/26012
+f 22920/30706/27717 22923/30715/27726 22928/30717/27728 22924/30707/27718
+f 22924/30707/27718 22928/30717/27728 30135/30704/27715 30134/30701/27712
+f 22923/30715/27726 29306/29240/26009 29305/29239/26008 22928/30717/27728
+f 22928/30717/27728 29305/29239/26008 31518/29228/25997 30135/30704/27715
+f 22929/30718/27729 22933/30719/27730 22934/30720/27731 22930/30721/27732
+f 22930/30721/27732 22934/30720/27731 26178/20887/17786 26177/20884/17783
+f 22933/30719/27730 30137/30713/27724 30136/30712/27723 22934/30720/27731
+f 22934/30720/27731 30136/30712/27723 30989/20888/17787 26178/20887/17786
+f 22929/30718/27729 22930/30721/27732 22935/30722/27733 22931/30723/27734
+f 22931/30723/27734 22935/30722/27733 30139/30724/27735 30140/30725/27736
+f 22930/30721/27732 26177/20884/17783 26176/20883/17782 22935/30722/27733
+f 22935/30722/27733 26176/20883/17782 30988/20872/17771 30139/30724/27735
+f 22929/30718/27729 22931/30723/27734 22936/30726/27737 22932/30727/27738
+f 22932/30727/27738 22936/30726/27737 29301/29259/26028 29300/29256/26025
+f 22931/30723/27734 30140/30725/27736 30141/30728/27739 22936/30726/27737
+f 22936/30726/27737 30141/30728/27739 31516/29260/26029 29301/29259/26028
+f 22929/30718/27729 22932/30727/27738 22937/30729/27740 22933/30719/27730
+f 22933/30719/27730 22937/30729/27740 30138/30716/27727 30137/30713/27724
+f 22932/30727/27738 29300/29256/26025 29299/29255/26024 22937/30729/27740
+f 22937/30729/27740 29299/29255/26024 31517/29244/26013 30138/30716/27727
+f 22938/30730/27741 22942/30731/27742 22943/30732/27743 22939/30733/27744
+f 22939/30733/27744 22943/30732/27743 26175/20871/17770 26174/20868/17767
+f 22942/30731/27742 30140/30725/27736 30139/30724/27735 22943/30732/27743
+f 22943/30732/27743 30139/30724/27735 30988/20872/17771 26175/20871/17770
+f 22938/30730/27741 22939/30733/27744 22944/30734/27745 22940/30735/27746
+f 22940/30735/27746 22944/30734/27745 30142/30736/27747 30143/30737/27748
+f 22939/30733/27744 26174/20868/17767 26173/20867/17766 22944/30734/27745
+f 22944/30734/27745 26173/20867/17766 30987/20856/17755 30142/30736/27747
+f 22938/30730/27741 22940/30735/27746 22945/30738/27749 22941/30739/27750
+f 22941/30739/27750 22945/30738/27749 29295/29275/26044 29294/29272/26041
+f 22940/30735/27746 30143/30737/27748 30144/30740/27751 22945/30738/27749
+f 22945/30738/27749 30144/30740/27751 31515/29276/26045 29295/29275/26044
+f 22938/30730/27741 22941/30739/27750 22946/30741/27752 22942/30731/27742
+f 22942/30731/27742 22946/30741/27752 30141/30728/27739 30140/30725/27736
+f 22941/30739/27750 29294/29272/26041 29293/29271/26040 22946/30741/27752
+f 22946/30741/27752 29293/29271/26040 31516/29260/26029 30141/30728/27739
+f 22947/30742/27753 22951/30743/27754 22952/30744/27755 22948/30745/27756
+f 22948/30745/27756 22952/30744/27755 26172/20855/17754 26171/20852/17751
+f 22951/30743/27754 30143/30737/27748 30142/30736/27747 22952/30744/27755
+f 22952/30744/27755 30142/30736/27747 30987/20856/17755 26172/20855/17754
+f 22947/30742/27753 22948/30745/27756 22953/30746/27757 22949/30747/27758
+f 22949/30747/27758 22953/30746/27757 30145/30748/27759 30146/30749/27760
+f 22948/30745/27756 26171/20852/17751 26170/20851/17750 22953/30746/27757
+f 22953/30746/27757 26170/20851/17750 30986/20840/17739 30145/30748/27759
+f 22947/30742/27753 22949/30747/27758 22954/30750/27761 22950/30751/27762
+f 22950/30751/27762 22954/30750/27761 29289/29291/26060 29288/29288/26057
+f 22949/30747/27758 30146/30749/27760 30147/30752/27763 22954/30750/27761
+f 22954/30750/27761 30147/30752/27763 31514/29292/26061 29289/29291/26060
+f 22947/30742/27753 22950/30751/27762 22955/30753/27764 22951/30743/27754
+f 22951/30743/27754 22955/30753/27764 30144/30740/27751 30143/30737/27748
+f 22950/30751/27762 29288/29288/26057 29287/29287/26056 22955/30753/27764
+f 22955/30753/27764 29287/29287/26056 31515/29276/26045 30144/30740/27751
+f 22956/30754/27765 22960/30755/27766 22961/30756/27767 22957/30757/27768
+f 22957/30757/27768 22961/30756/27767 26169/20839/17738 26168/20836/17735
+f 22960/30755/27766 30146/30749/27760 30145/30748/27759 22961/30756/27767
+f 22961/30756/27767 30145/30748/27759 30986/20840/17739 26169/20839/17738
+f 22956/30754/27765 22957/30757/27768 22962/30758/27769 22958/30759/27770
+f 22958/30759/27770 22962/30758/27769 30148/30760/27771 30149/30761/27772
+f 22957/30757/27768 26168/20836/17735 26167/20835/17734 22962/30758/27769
+f 22962/30758/27769 26167/20835/17734 30985/20824/17723 30148/30760/27771
+f 22956/30754/27765 22958/30759/27770 22963/30762/27773 22959/30763/27774
+f 22959/30763/27774 22963/30762/27773 29283/29307/26076 29282/29304/26073
+f 22958/30759/27770 30149/30761/27772 30150/30764/27775 22963/30762/27773
+f 22963/30762/27773 30150/30764/27775 31513/29308/26077 29283/29307/26076
+f 22956/30754/27765 22959/30763/27774 22964/30765/27776 22960/30755/27766
+f 22960/30755/27766 22964/30765/27776 30147/30752/27763 30146/30749/27760
+f 22959/30763/27774 29282/29304/26073 29281/29303/26072 22964/30765/27776
+f 22964/30765/27776 29281/29303/26072 31514/29292/26061 30147/30752/27763
+f 22965/30766/27777 22969/30767/27778 22970/30768/27779 22966/30769/27780
+f 22966/30769/27780 22970/30768/27779 26166/20823/17722 26165/20820/17719
+f 22969/30767/27778 30149/30761/27772 30148/30760/27771 22970/30768/27779
+f 22970/30768/27779 30148/30760/27771 30985/20824/17723 26166/20823/17722
+f 22965/30766/27777 22966/30769/27780 22971/30770/27781 22967/30771/27782
+f 22967/30771/27782 22971/30770/27781 30151/30772/27783 30152/30773/27784
+f 22966/30769/27780 26165/20820/17719 26164/20819/17718 22971/30770/27781
+f 22971/30770/27781 26164/20819/17718 30984/20808/17707 30151/30772/27783
+f 22965/30766/27777 22967/30771/27782 22972/30774/27785 22968/30775/27786
+f 22968/30775/27786 22972/30774/27785 29277/29323/26092 29276/29320/26089
+f 22967/30771/27782 30152/30773/27784 30153/30776/27787 22972/30774/27785
+f 22972/30774/27785 30153/30776/27787 31512/29324/26093 29277/29323/26092
+f 22965/30766/27777 22968/30775/27786 22973/30777/27788 22969/30767/27778
+f 22969/30767/27778 22973/30777/27788 30150/30764/27775 30149/30761/27772
+f 22968/30775/27786 29276/29320/26089 29275/29319/26088 22973/30777/27788
+f 22973/30777/27788 29275/29319/26088 31513/29308/26077 30150/30764/27775
+f 22974/30778/27789 22978/30779/27790 22979/30780/27791 22975/30781/27792
+f 22975/30781/27792 22979/30780/27791 26163/20807/17706 26162/20804/17703
+f 22978/30779/27790 30152/30773/27784 30151/30772/27783 22979/30780/27791
+f 22979/30780/27791 30151/30772/27783 30984/20808/17707 26163/20807/17706
+f 22974/30778/27789 22975/30781/27792 22980/30782/27793 22976/30783/27794
+f 22976/30783/27794 22980/30782/27793 30154/30784/27795 30155/30785/27796
+f 22975/30781/27792 26162/20804/17703 26161/20803/17702 22980/30782/27793
+f 22980/30782/27793 26161/20803/17702 30983/20792/17691 30154/30784/27795
+f 22974/30778/27789 22976/30783/27794 22981/30786/27797 22977/30787/27798
+f 22977/30787/27798 22981/30786/27797 29271/29339/26108 29270/29336/26105
+f 22976/30783/27794 30155/30785/27796 30156/30788/27799 22981/30786/27797
+f 22981/30786/27797 30156/30788/27799 31511/29340/26109 29271/29339/26108
+f 22974/30778/27789 22977/30787/27798 22982/30789/27800 22978/30779/27790
+f 22978/30779/27790 22982/30789/27800 30153/30776/27787 30152/30773/27784
+f 22977/30787/27798 29270/29336/26105 29269/29335/26104 22982/30789/27800
+f 22982/30789/27800 29269/29335/26104 31512/29324/26093 30153/30776/27787
+f 22983/30790/27801 22987/30791/27802 22988/30792/27803 22984/30793/27804
+f 22984/30793/27804 22988/30792/27803 26160/20791/17690 26159/20788/17687
+f 22987/30791/27802 30155/30785/27796 30154/30784/27795 22988/30792/27803
+f 22988/30792/27803 30154/30784/27795 30983/20792/17691 26160/20791/17690
+f 22983/30790/27801 22984/30793/27804 22989/30794/27805 22985/30795/27806
+f 22985/30795/27806 22989/30794/27805 30157/30796/27807 30158/30797/27808
+f 22984/30793/27804 26159/20788/17687 26158/20787/17686 22989/30794/27805
+f 22989/30794/27805 26158/20787/17686 30982/20776/17675 30157/30796/27807
+f 22983/30790/27801 22985/30795/27806 22990/30798/27809 22986/30799/27810
+f 22986/30799/27810 22990/30798/27809 29265/29355/26124 29264/29352/26121
+f 22985/30795/27806 30158/30797/27808 30159/30800/27811 22990/30798/27809
+f 22990/30798/27809 30159/30800/27811 31510/29356/26125 29265/29355/26124
+f 22983/30790/27801 22986/30799/27810 22991/30801/27812 22987/30791/27802
+f 22987/30791/27802 22991/30801/27812 30156/30788/27799 30155/30785/27796
+f 22986/30799/27810 29264/29352/26121 29263/29351/26120 22991/30801/27812
+f 22991/30801/27812 29263/29351/26120 31511/29340/26109 30156/30788/27799
+f 22992/30802/27813 22996/30803/27814 22997/30804/27815 22993/30805/27816
+f 22993/30805/27816 22997/30804/27815 26157/20775/17674 26156/20770/17669
+f 22996/30803/27814 30158/30797/27808 30157/30796/27807 22997/30804/27815
+f 22997/30804/27815 30157/30796/27807 30982/20776/17675 26157/20775/17674
+f 22992/30802/27813 22993/30805/27816 22998/30806/27817 22994/30807/27818
+f 22994/30807/27818 22998/30806/27817 30160/30808/27819 30161/30809/27820
+f 22993/30805/27816 26156/20770/17669 26155/20769/17668 22998/30806/27817
+f 22998/30806/27817 26155/20769/17668 30981/20772/17671 30160/30808/27819
+f 22992/30802/27813 22994/30807/27818 22999/30810/27821 22995/30811/27822
+f 22995/30811/27822 22999/30810/27821 29259/29371/26140 29258/29368/26137
+f 22994/30807/27818 30161/30809/27820 30162/30812/27823 22999/30810/27821
+f 22999/30810/27821 30162/30812/27823 31509/29372/26141 29259/29371/26140
+f 22992/30802/27813 22995/30811/27822 23000/30813/27824 22996/30803/27814
+f 22996/30803/27814 23000/30813/27824 30159/30800/27811 30158/30797/27808
+f 22995/30811/27822 29258/29368/26137 29257/29367/26136 23000/30813/27824
+f 23000/30813/27824 29257/29367/26136 31510/29356/26125 30159/30800/27811
+f 23001/30814/27825 23005/30815/27826 23006/30816/27827 23002/30817/27828
+f 23002/30817/27828 23006/30816/27827 26229/21144/18039 26228/21142/18037
+f 23005/30815/27826 30161/30809/27820 30160/30808/27819 23006/30816/27827
+f 23006/30816/27827 30160/30808/27819 30981/20772/17671 26229/21144/18039
+f 23001/30814/27825 23002/30817/27828 23007/30818/27829 23003/30819/27830
+f 23003/30819/27830 23007/30818/27829 30163/30820/27831 30164/30821/27832
+f 23002/30817/27828 26228/21142/18037 26227/21141/18036 23007/30818/27829
+f 23007/30818/27829 26227/21141/18036 31004/21132/18027 30163/30820/27831
+f 23001/30814/27825 23003/30819/27830 23008/30822/27833 23004/30823/27834
+f 23004/30823/27834 23008/30822/27833 29394/29387/26156 29393/29384/26153
+f 23003/30819/27830 30164/30821/27832 30165/30824/27835 23008/30822/27833
+f 23008/30822/27833 30165/30824/27835 31532/29388/26157 29394/29387/26156
+f 23001/30814/27825 23004/30823/27834 23009/30825/27836 23005/30815/27826
+f 23005/30815/27826 23009/30825/27836 30162/30812/27823 30161/30809/27820
+f 23004/30823/27834 29393/29384/26153 29392/29383/26152 23009/30825/27836
+f 23009/30825/27836 29392/29383/26152 31509/29372/26141 30162/30812/27823
+f 23010/30826/27837 23014/30827/27838 23015/30828/27839 23011/30829/27840
+f 23011/30829/27840 23015/30828/27839 26226/21131/18026 26225/21128/18023
+f 23014/30827/27838 30164/30821/27832 30163/30820/27831 23015/30828/27839
+f 23015/30828/27839 30163/30820/27831 31004/21132/18027 26226/21131/18026
+f 23010/30826/27837 23011/30829/27840 23016/30830/27841 23012/30831/27842
+f 23012/30831/27842 23016/30830/27841 30166/30832/27843 30167/30833/27844
+f 23011/30829/27840 26225/21128/18023 26224/21127/18022 23016/30830/27841
+f 23016/30830/27841 26224/21127/18022 31003/21116/18011 30166/30832/27843
+f 23010/30826/27837 23012/30831/27842 23017/30834/27845 23013/30835/27846
+f 23013/30835/27846 23017/30834/27845 29391/29403/26172 29390/29400/26169
+f 23012/30831/27842 30167/30833/27844 30168/30836/27847 23017/30834/27845
+f 23017/30834/27845 30168/30836/27847 31531/29404/26173 29391/29403/26172
+f 23010/30826/27837 23013/30835/27846 23018/30837/27848 23014/30827/27838
+f 23014/30827/27838 23018/30837/27848 30165/30824/27835 30164/30821/27832
+f 23013/30835/27846 29390/29400/26169 29389/29399/26168 23018/30837/27848
+f 23018/30837/27848 29389/29399/26168 31532/29388/26157 30165/30824/27835
+f 23019/30838/27849 23023/30839/27850 23024/30840/27851 23020/30841/27852
+f 23020/30841/27852 23024/30840/27851 26223/21115/18010 26222/21112/18007
+f 23023/30839/27850 30167/30833/27844 30166/30832/27843 23024/30840/27851
+f 23024/30840/27851 30166/30832/27843 31003/21116/18011 26223/21115/18010
+f 23019/30838/27849 23020/30841/27852 23025/30842/27853 23021/30843/27854
+f 23021/30843/27854 23025/30842/27853 30169/30844/27855 30170/30845/27856
+f 23020/30841/27852 26222/21112/18007 26221/21111/18006 23025/30842/27853
+f 23025/30842/27853 26221/21111/18006 31002/21100/17995 30169/30844/27855
+f 23019/30838/27849 23021/30843/27854 23026/30846/27857 23022/30847/27858
+f 23022/30847/27858 23026/30846/27857 29385/29419/26188 29384/29416/26185
+f 23021/30843/27854 30170/30845/27856 30171/30848/27859 23026/30846/27857
+f 23026/30846/27857 30171/30848/27859 31530/29420/26189 29385/29419/26188
+f 23019/30838/27849 23022/30847/27858 23027/30849/27860 23023/30839/27850
+f 23023/30839/27850 23027/30849/27860 30168/30836/27847 30167/30833/27844
+f 23022/30847/27858 29384/29416/26185 29383/29415/26184 23027/30849/27860
+f 23027/30849/27860 29383/29415/26184 31531/29404/26173 30168/30836/27847
+f 23028/30850/27861 23032/30851/27862 23033/30852/27863 23029/30853/27864
+f 23029/30853/27864 23033/30852/27863 26220/21099/17994 26219/21096/17991
+f 23032/30851/27862 30170/30845/27856 30169/30844/27855 23033/30852/27863
+f 23033/30852/27863 30169/30844/27855 31002/21100/17995 26220/21099/17994
+f 23028/30850/27861 23029/30853/27864 23034/30854/27865 23030/30855/27866
+f 23030/30855/27866 23034/30854/27865 30172/30856/27867 30173/30857/27868
+f 23029/30853/27864 26219/21096/17991 26218/21095/17990 23034/30854/27865
+f 23034/30854/27865 26218/21095/17990 31001/21084/17979 30172/30856/27867
+f 23028/30850/27861 23030/30855/27866 23035/30858/27869 23031/30859/27870
+f 23031/30859/27870 23035/30858/27869 29379/29432/26201 29378/29430/26199
+f 23030/30855/27866 30173/30857/27868 30174/30860/27871 23035/30858/27869
+f 23035/30858/27869 30174/30860/27871 31529/29060/25833 29379/29432/26201
+f 23028/30850/27861 23031/30859/27870 23036/30861/27872 23032/30851/27862
+f 23032/30851/27862 23036/30861/27872 30171/30848/27859 30170/30845/27856
+f 23031/30859/27870 29378/29430/26199 29377/29429/26198 23036/30861/27872
+f 23036/30861/27872 29377/29429/26198 31530/29420/26189 30171/30848/27859
+f 23037/30862/27873 23041/30863/27874 23042/30864/27875 23038/30865/27876
+f 23038/30865/27876 23042/30864/27875 26217/21083/17978 26216/21080/17975
+f 23041/30863/27874 30173/30857/27868 30172/30856/27867 23042/30864/27875
+f 23042/30864/27875 30172/30856/27867 31001/21084/17979 26217/21083/17978
+f 23037/30862/27873 23038/30865/27876 23043/30866/27877 23039/30867/27878
+f 23039/30867/27878 23043/30866/27877 30175/30868/27879 30176/30869/27880
+f 23038/30865/27876 26216/21080/17975 26215/21079/17974 23043/30866/27877
+f 23043/30866/27877 26215/21079/17974 31000/21068/17963 30175/30868/27879
+f 23037/30862/27873 23039/30867/27878 23044/30870/27881 23040/30871/27882
+f 23040/30871/27882 23044/30870/27881 29373/29063/25836 29372/29058/25831
+f 23039/30867/27878 30176/30869/27880 30177/30872/27883 23044/30870/27881
+f 23044/30870/27881 30177/30872/27883 31528/29064/25837 29373/29063/25836
+f 23037/30862/27873 23040/30871/27882 23045/30873/27884 23041/30863/27874
+f 23041/30863/27874 23045/30873/27884 30174/30860/27871 30173/30857/27868
+f 23040/30871/27882 29372/29058/25831 29371/29057/25830 23045/30873/27884
+f 23045/30873/27884 29371/29057/25830 31529/29060/25833 30174/30860/27871
+f 23046/30874/27885 23050/30875/27886 23051/30876/27887 23047/30877/27888
+f 23047/30877/27888 23051/30876/27887 26211/21067/17962 26210/21064/17959
+f 23050/30875/27886 30176/30869/27880 30175/30868/27879 23051/30876/27887
+f 23051/30876/27887 30175/30868/27879 31000/21068/17963 26211/21067/17962
+f 23046/30874/27885 23047/30877/27888 23052/30878/27889 23048/30879/27890
+f 23048/30879/27890 23052/30878/27889 30178/30880/27891 30179/30881/27892
+f 23047/30877/27888 26210/21064/17959 26209/21063/17958 23052/30878/27889
+f 23052/30878/27889 26209/21063/17958 30999/21052/17947 30178/30880/27891
+f 23046/30874/27885 23048/30879/27890 23053/30882/27893 23049/30883/27894
+f 23049/30883/27894 23053/30882/27893 29367/29079/25852 29366/29076/25849
+f 23048/30879/27890 30179/30881/27892 30180/30884/27895 23053/30882/27893
+f 23053/30882/27893 30180/30884/27895 31527/29080/25853 29367/29079/25852
+f 23046/30874/27885 23049/30883/27894 23054/30885/27896 23050/30875/27886
+f 23050/30875/27886 23054/30885/27896 30177/30872/27883 30176/30869/27880
+f 23049/30883/27894 29366/29076/25849 29365/29075/25848 23054/30885/27896
+f 23054/30885/27896 29365/29075/25848 31528/29064/25837 30177/30872/27883
+f 23055/30886/27897 23059/30887/27898 23060/30888/27899 23056/30889/27900
+f 23056/30889/27900 23060/30888/27899 26208/21051/17946 26207/21046/17943
+f 23059/30887/27898 30179/30881/27892 30178/30880/27891 23060/30888/27899
+f 23060/30888/27899 30178/30880/27891 30999/21052/17947 26208/21051/17946
+f 23055/30886/27897 23056/30889/27900 23061/30890/27901 23057/30891/27902
+f 23057/30891/27902 23061/30890/27901 30181/30892/27903 30182/30893/27904
+f 23056/30889/27900 26207/21046/17943 26206/21045/17942 23061/30890/27901
+f 23061/30890/27901 26206/21045/17942 30998/21048/17931 30181/30892/27903
+f 23055/30886/27897 23057/30891/27902 23062/30894/27905 23058/30895/27906
+f 23058/30895/27906 23062/30894/27905 29361/29095/25868 29360/29092/25865
+f 23057/30891/27902 30182/30893/27904 30183/30896/27907 23062/30894/27905
+f 23062/30894/27905 30183/30896/27907 31526/29096/25869 29361/29095/25868
+f 23055/30886/27897 23058/30895/27906 23063/30897/27908 23059/30887/27898
+f 23059/30887/27898 23063/30897/27908 30180/30884/27895 30179/30881/27892
+f 23058/30895/27906 29360/29092/25865 29359/29091/25864 23063/30897/27908
+f 23063/30897/27908 29359/29091/25864 31527/29080/25853 30180/30884/27895
+f 23064/30898/27909 23068/30899/27910 23069/30900/27911 23065/30901/27912
+f 23065/30901/27912 23069/30900/27911 26205/21031/17930 26204/21028/17927
+f 23068/30899/27910 30182/30902/27904 30181/30903/27903 23069/30900/27911
+f 23069/30900/27911 30181/30903/27903 30998/21032/17931 26205/21031/17930
+f 23064/30898/27909 23065/30901/27912 23070/30904/27913 23066/30905/27914
+f 23066/30905/27914 23070/30904/27913 30184/30906/27915 30185/30907/27916
+f 23065/30901/27912 26204/21028/17927 26203/21027/17926 23070/30904/27913
+f 23070/30904/27913 26203/21027/17926 30997/21016/17915 30184/30906/27915
+f 23064/30898/27909 23066/30905/27914 23071/30908/27917 23067/30909/27918
+f 23067/30909/27918 23071/30908/27917 29355/29115/25884 29354/29110/25881
+f 23066/30905/27914 30185/30907/27916 30186/30910/27919 23071/30908/27917
+f 23071/30908/27917 30186/30910/27919 31525/29116/25885 29355/29115/25884
+f 23064/30898/27909 23067/30909/27918 23072/30911/27920 23068/30899/27910
+f 23068/30899/27910 23072/30911/27920 30183/30912/27907 30182/30902/27904
+f 23067/30909/27918 29354/29110/25881 29353/29109/25880 23072/30911/27920
+f 23072/30911/27920 29353/29109/25880 31526/29112/25869 30183/30912/27907
+f 23073/30913/27921 23077/30914/27922 23078/30915/27923 23074/30916/27924
+f 23074/30916/27924 23078/30915/27923 26202/21015/17914 26201/21012/17911
+f 23077/30914/27922 30185/30907/27916 30184/30906/27915 23078/30915/27923
+f 23078/30915/27923 30184/30906/27915 30997/21016/17915 26202/21015/17914
+f 23073/30913/27921 23074/30916/27924 23079/30917/27925 23075/30918/27926
+f 23075/30918/27926 23079/30917/27925 30120/30636/27647 30119/30635/27646
+f 23074/30916/27924 26201/21012/17911 26200/21011/17910 23079/30917/27925
+f 23079/30917/27925 26200/21011/17910 30996/21000/17899 30120/30636/27647
+f 23073/30913/27921 23075/30918/27926 23080/30919/27927 23076/30920/27928
+f 23076/30920/27928 23080/30919/27927 29349/29131/25900 29348/29128/25897
+f 23075/30918/27926 30119/30635/27646 30118/30645/27656 23080/30919/27927
+f 23080/30919/27927 30118/30645/27656 31524/29132/25901 29349/29131/25900
+f 23073/30913/27921 23076/30920/27928 23081/30921/27929 23077/30914/27922
+f 23077/30914/27922 23081/30921/27929 30186/30910/27919 30185/30907/27916
+f 23076/30920/27928 29348/29128/25897 29347/29127/25896 23081/30921/27929
+f 23081/30921/27929 29347/29127/25896 31525/29116/25885 30186/30910/27919
+f 23082/30922/27930 23086/30923/27931 23087/30924/27932 23083/30925/27933
+f 23083/30925/27933 23087/30924/27932 26655/21918/18805 26654/21913/18800
+f 23086/30923/27931 30257/30926/27934 30258/30927/27935 23087/30924/27932
+f 23087/30924/27932 30258/30927/27935 31076/21919/18806 26655/21918/18805
+f 23082/30922/27930 23083/30925/27933 23088/30928/27936 23084/30929/27937
+f 23084/30929/27937 23088/30928/27936 30253/30930/27938 30254/30931/27939
+f 23083/30925/27933 26654/21913/18800 26653/21912/18799 23088/30928/27936
+f 23088/30928/27936 26653/21912/18799 31075/21899/18786 30253/30930/27938
+f 23082/30922/27930 23084/30929/27937 23089/30932/27940 23085/30933/27941
+f 23085/30933/27941 23089/30932/27940 30259/30934/27942 30260/30935/27943
+f 23084/30929/27937 30254/30931/27939 30255/30936/27944 23089/30932/27940
+f 23089/30932/27940 30255/30936/27944 31675/30937/27945 30259/30934/27942
+f 23082/30922/27930 23085/30933/27941 23090/30938/27946 23086/30923/27931
+f 23086/30923/27931 23090/30938/27946 30256/30939/27947 30257/30926/27934
+f 23085/30933/27941 30260/30935/27943 30261/30940/27948 23090/30938/27946
+f 23090/30938/27946 30261/30940/27948 31676/30941/27949 30256/30939/27947
+f 23091/30942/27950 23095/30943/27951 23096/30944/27952 23092/30945/27953
+f 23092/30945/27953 23096/30944/27952 26652/21898/18785 26651/21893/18780
+f 23095/30943/27951 30254/30931/27939 30253/30930/27938 23096/30944/27952
+f 23096/30944/27952 30253/30930/27938 31075/21899/18786 26652/21898/18785
+f 23091/30942/27950 23092/30945/27953 23097/30946/27954 23093/30947/27955
+f 23093/30947/27955 23097/30946/27954 30250/30948/27956 30251/30949/27957
+f 23092/30945/27953 26651/21893/18780 26650/21892/18779 23097/30946/27954
+f 23097/30946/27954 26650/21892/18779 31074/21879/18766 30250/30948/27956
+f 23091/30942/27950 23093/30947/27955 23098/30950/27958 23094/30951/27959
+f 23094/30951/27959 23098/30950/27958 30262/30952/27960 30263/30953/27961
+f 23093/30947/27955 30251/30949/27957 30252/30954/27962 23098/30950/27958
+f 23098/30950/27958 30252/30954/27962 31674/30955/27963 30262/30952/27960
+f 23091/30942/27950 23094/30951/27959 23099/30956/27964 23095/30943/27951
+f 23095/30943/27951 23099/30956/27964 30255/30936/27944 30254/30931/27939
+f 23094/30951/27959 30263/30953/27961 30264/30957/27965 23099/30956/27964
+f 23099/30956/27964 30264/30957/27965 31675/30937/27945 30255/30936/27944
+f 23100/30958/27966 23104/30959/27967 23105/30960/27968 23101/30961/27969
+f 23101/30961/27969 23105/30960/27968 26649/21878/18765 26648/21873/18760
+f 23104/30959/27967 30251/30949/27957 30250/30948/27956 23105/30960/27968
+f 23105/30960/27968 30250/30948/27956 31074/21879/18766 26649/21878/18765
+f 23100/30958/27966 23101/30961/27969 23106/30962/27970 23102/30963/27971
+f 23102/30963/27971 23106/30962/27970 30247/30964/27972 30248/30965/27973
+f 23101/30961/27969 26648/21873/18760 26647/21872/18759 23106/30962/27970
+f 23106/30962/27970 26647/21872/18759 31073/21859/18746 30247/30964/27972
+f 23100/30958/27966 23102/30963/27971 23107/30966/27974 23103/30967/27975
+f 23103/30967/27975 23107/30966/27974 30265/30968/27976 30266/30969/27977
+f 23102/30963/27971 30248/30965/27973 30249/30970/27978 23107/30966/27974
+f 23107/30966/27974 30249/30970/27978 31673/30971/27979 30265/30968/27976
+f 23100/30958/27966 23103/30967/27975 23108/30972/27980 23104/30959/27967
+f 23104/30959/27967 23108/30972/27980 30252/30954/27962 30251/30949/27957
+f 23103/30967/27975 30266/30969/27977 30267/30973/27981 23108/30972/27980
+f 23108/30972/27980 30267/30973/27981 31674/30955/27963 30252/30954/27962
+f 23109/30974/27982 23113/30975/27983 23114/30976/27984 23110/30977/27985
+f 23110/30977/27985 23114/30976/27984 26646/21858/18745 26645/21853/18740
+f 23113/30975/27983 30248/30965/27973 30247/30964/27972 23114/30976/27984
+f 23114/30976/27984 30247/30964/27972 31073/21859/18746 26646/21858/18745
+f 23109/30974/27982 23110/30977/27985 23115/30978/27986 23111/30979/27987
+f 23111/30979/27987 23115/30978/27986 30244/30980/27988 30245/30981/27989
+f 23110/30977/27985 26645/21853/18740 26644/21852/18739 23115/30978/27986
+f 23115/30978/27986 26644/21852/18739 31072/21839/18726 30244/30980/27988
+f 23109/30974/27982 23111/30979/27987 23116/30982/27990 23112/30983/27991
+f 23112/30983/27991 23116/30982/27990 30268/30984/27992 30269/30985/27993
+f 23111/30979/27987 30245/30981/27989 30246/30986/27994 23116/30982/27990
+f 23116/30982/27990 30246/30986/27994 31672/30987/27995 30268/30984/27992
+f 23109/30974/27982 23112/30983/27991 23117/30988/27996 23113/30975/27983
+f 23113/30975/27983 23117/30988/27996 30249/30970/27978 30248/30965/27973
+f 23112/30983/27991 30269/30985/27993 30270/30989/27997 23117/30988/27996
+f 23117/30988/27996 30270/30989/27997 31673/30971/27979 30249/30970/27978
+f 23118/30990/27998 23122/30991/27999 23123/30992/28000 23119/30993/28001
+f 23119/30993/28001 23123/30992/28000 26643/21838/18725 26642/21833/18720
+f 23122/30991/27999 30245/30981/27989 30244/30980/27988 23123/30992/28000
+f 23123/30992/28000 30244/30980/27988 31072/21839/18726 26643/21838/18725
+f 23118/30990/27998 23119/30993/28001 23124/30994/28002 23120/30995/28003
+f 23120/30995/28003 23124/30994/28002 30241/30996/28004 30242/30997/28005
+f 23119/30993/28001 26642/21833/18720 26641/21832/18719 23124/30994/28002
+f 23124/30994/28002 26641/21832/18719 31071/21817/18706 30241/30996/28004
+f 23118/30990/27998 23120/30995/28003 23125/30998/28006 23121/30999/28007
+f 23121/30999/28007 23125/30998/28006 30271/31000/28008 30272/31001/28009
+f 23120/30995/28003 30242/30997/28005 30243/31002/28010 23125/30998/28006
+f 23125/30998/28006 30243/31002/28010 31671/31003/28011 30271/31000/28008
+f 23118/30990/27998 23121/30999/28007 23126/31004/28012 23122/30991/27999
+f 23122/30991/27999 23126/31004/28012 30246/30986/27994 30245/30981/27989
+f 23121/30999/28007 30272/31001/28009 30273/31005/28013 23126/31004/28012
+f 23126/31004/28012 30273/31005/28013 31672/30987/27995 30246/30986/27994
+f 23127/31006/28014 23131/31007/28015 23132/31008/28016 23128/31009/28017
+f 23128/31009/28017 23132/31008/28016 26640/21816/18705 26639/21808/18700
+f 23131/31007/28015 30242/30997/28005 30241/30996/28004 23132/31008/28016
+f 23132/31008/28016 30241/30996/28004 31071/21817/18706 26640/21816/18705
+f 23127/31006/28014 23128/31009/28017 23133/31010/28018 23129/31011/28019
+f 23129/31011/28019 23133/31010/28018 30238/31012/28020 30239/31013/28021
+f 23128/31009/28017 26639/21808/18700 26638/21807/18699 23133/31010/28018
+f 23133/31010/28018 26638/21807/18699 31070/21811/18686 30238/31012/28020
+f 23127/31006/28014 23129/31011/28019 23134/31014/28022 23130/31015/28023
+f 23130/31015/28023 23134/31014/28022 30274/31016/28024 30275/31017/28025
+f 23129/31011/28019 30239/31013/28021 30240/31018/28026 23134/31014/28022
+f 23134/31014/28022 30240/31018/28026 31670/31019/28027 30274/31016/28024
+f 23127/31006/28014 23130/31015/28023 23135/31020/28028 23131/31007/28015
+f 23131/31007/28015 23135/31020/28028 30243/31002/28010 30242/30997/28005
+f 23130/31015/28023 30275/31017/28025 30276/31021/28029 23135/31020/28028
+f 23135/31020/28028 30276/31021/28029 31671/31003/28011 30243/31002/28010
+f 23136/31022/28030 23140/31023/28031 23141/31024/28032 23137/31025/28033
+f 23137/31025/28033 23141/31024/28032 26637/21793/18685 26636/21788/18680
+f 23140/31023/28031 30239/31026/28021 30238/31027/28020 23141/31024/28032
+f 23141/31024/28032 30238/31027/28020 31070/21794/18686 26637/21793/18685
+f 23136/31022/28030 23137/31025/28033 23142/31028/28034 23138/31029/28035
+f 23138/31029/28035 23142/31028/28034 30235/31030/28036 30236/31031/28037
+f 23137/31025/28033 26636/21788/18680 26635/21787/18679 23142/31028/28034
+f 23142/31028/28034 26635/21787/18679 31069/21774/18666 30235/31030/28036
+f 23136/31022/28030 23138/31029/28035 23143/31032/28038 23139/31033/28039
+f 23139/31033/28039 23143/31032/28038 30277/31034/28040 30278/31035/28041
+f 23138/31029/28035 30236/31031/28037 30237/31036/28042 23143/31032/28038
+f 23143/31032/28038 30237/31036/28042 31669/31037/28043 30277/31034/28040
+f 23136/31022/28030 23139/31033/28039 23144/31038/28044 23140/31023/28031
+f 23140/31023/28031 23144/31038/28044 30240/31039/28026 30239/31026/28021
+f 23139/31033/28039 30278/31035/28041 30279/31040/28045 23144/31038/28044
+f 23144/31038/28044 30279/31040/28045 31670/31041/28027 30240/31039/28026
+f 23145/31042/28046 23149/31043/28047 23150/31044/28048 23146/31045/28049
+f 23146/31045/28049 23150/31044/28048 26634/21773/18665 26633/21768/18660
+f 23149/31043/28047 30236/31031/28037 30235/31030/28036 23150/31044/28048
+f 23150/31044/28048 30235/31030/28036 31069/21774/18666 26634/21773/18665
+f 23145/31042/28046 23146/31045/28049 23151/31046/28050 23147/31047/28051
+f 23147/31047/28051 23151/31046/28050 30232/31048/28052 30233/31049/28053
+f 23146/31045/28049 26633/21768/18660 26632/21767/18659 23151/31046/28050
+f 23151/31046/28050 26632/21767/18659 31068/21754/18646 30232/31048/28052
+f 23145/31042/28046 23147/31047/28051 23152/31050/28054 23148/31051/28055
+f 23148/31051/28055 23152/31050/28054 30280/31052/28056 30281/31053/28057
+f 23147/31047/28051 30233/31049/28053 30234/31054/28058 23152/31050/28054
+f 23152/31050/28054 30234/31054/28058 31668/31055/28059 30280/31052/28056
+f 23145/31042/28046 23148/31051/28055 23153/31056/28060 23149/31043/28047
+f 23149/31043/28047 23153/31056/28060 30237/31036/28042 30236/31031/28037
+f 23148/31051/28055 30281/31053/28057 30282/31057/28061 23153/31056/28060
+f 23153/31056/28060 30282/31057/28061 31669/31037/28043 30237/31036/28042
+f 23154/31058/28062 23158/31059/28063 23159/31060/28064 23155/31061/28065
+f 23155/31061/28065 23159/31060/28064 26631/21753/18645 26630/21748/18640
+f 23158/31059/28063 30233/31049/28053 30232/31048/28052 23159/31060/28064
+f 23159/31060/28064 30232/31048/28052 31068/21754/18646 26631/21753/18645
+f 23154/31058/28062 23155/31061/28065 23160/31062/28066 23156/31063/28067
+f 23156/31063/28067 23160/31062/28066 30229/31064/28068 30230/31065/28069
+f 23155/31061/28065 26630/21748/18640 26629/21747/18639 23160/31062/28066
+f 23160/31062/28066 26629/21747/18639 31067/21734/18626 30229/31064/28068
+f 23154/31058/28062 23156/31063/28067 23161/31066/28070 23157/31067/28071
+f 23157/31067/28071 23161/31066/28070 30283/31068/28072 30284/31069/28073
+f 23156/31063/28067 30230/31065/28069 30231/31070/28074 23161/31066/28070
+f 23161/31066/28070 30231/31070/28074 31667/31071/28075 30283/31068/28072
+f 23154/31058/28062 23157/31067/28071 23162/31072/28076 23158/31059/28063
+f 23158/31059/28063 23162/31072/28076 30234/31054/28058 30233/31049/28053
+f 23157/31067/28071 30284/31069/28073 30285/31073/28077 23162/31072/28076
+f 23162/31072/28076 30285/31073/28077 31668/31055/28059 30234/31054/28058
+f 23163/31074/28078 23167/31075/28079 23168/31076/28080 23164/31077/28081
+f 23164/31077/28081 23168/31076/28080 26628/21733/18625 26627/21728/18620
+f 23167/31075/28079 30230/31065/28069 30229/31064/28068 23168/31076/28080
+f 23168/31076/28080 30229/31064/28068 31067/21734/18626 26628/21733/18625
+f 23163/31074/28078 23164/31077/28081 23169/31078/28082 23165/31079/28083
+f 23165/31079/28083 23169/31078/28082 30226/31080/28084 30227/31081/28085
+f 23164/31077/28081 26627/21728/18620 26626/21727/18619 23169/31078/28082
+f 23169/31078/28082 26626/21727/18619 31066/21714/18606 30226/31080/28084
+f 23163/31074/28078 23165/31079/28083 23170/31082/28086 23166/31083/28087
+f 23166/31083/28087 23170/31082/28086 30286/31084/28088 30287/31085/28089
+f 23165/31079/28083 30227/31081/28085 30228/31086/28090 23170/31082/28086
+f 23170/31082/28086 30228/31086/28090 31666/31087/28091 30286/31084/28088
+f 23163/31074/28078 23166/31083/28087 23171/31088/28092 23167/31075/28079
+f 23167/31075/28079 23171/31088/28092 30231/31070/28074 30230/31065/28069
+f 23166/31083/28087 30287/31085/28089 30288/31089/28093 23171/31088/28092
+f 23171/31088/28092 30288/31089/28093 31667/31071/28075 30231/31070/28074
+f 23172/31090/28094 23176/31091/28095 23177/31092/28096 23173/31093/28097
+f 23173/31093/28097 23177/31092/28096 26625/21713/18605 26624/21708/18600
+f 23176/31091/28095 30227/31081/28085 30226/31080/28084 23177/31092/28096
+f 23177/31092/28096 30226/31080/28084 31066/21714/18606 26625/21713/18605
+f 23172/31090/28094 23173/31093/28097 23178/31094/28098 23174/31095/28099
+f 23174/31095/28099 23178/31094/28098 30223/31096/28100 30224/31097/28101
+f 23173/31093/28097 26624/21708/18600 26623/21707/18599 23178/31094/28098
+f 23178/31094/28098 26623/21707/18599 31065/21694/18586 30223/31096/28100
+f 23172/31090/28094 23174/31095/28099 23179/31098/28102 23175/31099/28103
+f 23175/31099/28103 23179/31098/28102 30289/31100/28104 30290/31101/28105
+f 23174/31095/28099 30224/31097/28101 30225/31102/28106 23179/31098/28102
+f 23179/31098/28102 30225/31102/28106 31665/31103/28107 30289/31100/28104
+f 23172/31090/28094 23175/31099/28103 23180/31104/28108 23176/31091/28095
+f 23176/31091/28095 23180/31104/28108 30228/31086/28090 30227/31081/28085
+f 23175/31099/28103 30290/31101/28105 30291/31105/28109 23180/31104/28108
+f 23180/31104/28108 30291/31105/28109 31666/31087/28091 30228/31086/28090
+f 23181/31106/28110 23185/31107/28111 23186/31108/28112 23182/31109/28113
+f 23182/31109/28113 23186/31108/28112 26622/21693/18585 26621/21688/18580
+f 23185/31107/28111 30224/31097/28101 30223/31096/28100 23186/31108/28112
+f 23186/31108/28112 30223/31096/28100 31065/21694/18586 26622/21693/18585
+f 23181/31106/28110 23182/31109/28113 23187/31110/28114 23183/31111/28115
+f 23183/31111/28115 23187/31110/28114 30220/31112/28116 30221/31113/28117
+f 23182/31109/28113 26621/21688/18580 26620/21687/18579 23187/31110/28114
+f 23187/31110/28114 26620/21687/18579 31064/21674/18566 30220/31112/28116
+f 23181/31106/28110 23183/31111/28115 23188/31114/28118 23184/31115/28119
+f 23184/31115/28119 23188/31114/28118 30292/31116/28120 30293/31117/28121
+f 23183/31111/28115 30221/31113/28117 30222/31118/28122 23188/31114/28118
+f 23188/31114/28118 30222/31118/28122 31664/28652/25429 30292/31116/28120
+f 23181/31106/28110 23184/31115/28119 23189/31119/28123 23185/31107/28111
+f 23185/31107/28111 23189/31119/28123 30225/31102/28106 30224/31097/28101
+f 23184/31115/28119 30293/31117/28121 30294/31120/28124 23189/31119/28123
+f 23189/31119/28123 30294/31120/28124 31665/31103/28107 30225/31102/28106
+f 23190/31121/28125 23194/31122/28126 23195/31123/28127 23191/31124/28128
+f 23191/31124/28128 23195/31123/28127 26619/21673/18565 26618/21668/18560
+f 23194/31122/28126 30221/31113/28117 30220/31112/28116 23195/31123/28127
+f 23195/31123/28127 30220/31112/28116 31064/21674/18566 26619/21673/18565
+f 23190/31121/28125 23191/31124/28128 23196/31125/28129 23192/31126/28130
+f 23192/31126/28130 23196/31125/28129 30217/31127/28131 30218/31128/28132
+f 23191/31124/28128 26618/21668/18560 26617/21667/18559 23196/31125/28129
+f 23196/31125/28129 26617/21667/18559 31063/21654/18546 30217/31127/28131
+f 23190/31121/28125 23192/31126/28130 23197/31129/28133 23193/31130/28134
+f 23193/31130/28134 23197/31129/28133 30297/28655/25432 30296/28650/25427
+f 23192/31126/28130 30218/31128/28132 30219/31131/28135 23197/31129/28133
+f 23197/31129/28133 30219/31131/28135 31663/28656/25433 30297/28655/25432
+f 23190/31121/28125 23193/31130/28134 23198/31132/28136 23194/31122/28126
+f 23194/31122/28126 23198/31132/28136 30222/31118/28122 30221/31113/28117
+f 23193/31130/28134 30296/28650/25427 30295/28649/25426 23198/31132/28136
+f 23198/31132/28136 30295/28649/25426 31664/28652/25429 30222/31118/28122
+f 23199/31133/28137 23203/31134/28138 23204/31135/28139 23200/31136/28140
+f 23200/31136/28140 23204/31135/28139 26616/21653/18545 26615/21648/18540
+f 23203/31134/28138 30218/31128/28132 30217/31127/28131 23204/31135/28139
+f 23204/31135/28139 30217/31127/28131 31063/21654/18546 26616/21653/18545
+f 23199/31133/28137 23200/31136/28140 23205/31137/28141 23201/31138/28142
+f 23201/31138/28142 23205/31137/28141 30214/31139/28143 30215/31140/28144
+f 23200/31136/28140 26615/21648/18540 26614/21647/18539 23205/31137/28141
+f 23205/31137/28141 26614/21647/18539 31062/21634/18526 30214/31139/28143
+f 23199/31133/28137 23201/31138/28142 23206/31141/28145 23202/31142/28146
+f 23202/31142/28146 23206/31141/28145 30300/28638/25415 30299/28637/25414
+f 23201/31138/28142 30215/31140/28144 30216/31143/28147 23206/31141/28145
+f 23206/31141/28145 30216/31143/28147 31662/28640/25417 30300/28638/25415
+f 23199/31133/28137 23202/31142/28146 23207/31144/28148 23203/31134/28138
+f 23203/31134/28138 23207/31144/28148 30219/31131/28135 30218/31128/28132
+f 23202/31142/28146 30299/28637/25414 30298/28654/25431 23207/31144/28148
+f 23207/31144/28148 30298/28654/25431 31663/28656/25433 30219/31131/28135
+f 23208/31145/28149 23212/31146/28150 23213/31147/28151 23209/31148/28152
+f 23209/31148/28152 23213/31147/28151 26613/21633/18525 26612/21628/18520
+f 23212/31146/28150 30215/31140/28144 30214/31139/28143 23213/31147/28151
+f 23213/31147/28151 30214/31139/28143 31062/21634/18526 26613/21633/18525
+f 23208/31145/28149 23209/31148/28152 23214/31149/28153 23210/31150/28154
+f 23210/31150/28154 23214/31149/28153 30211/31151/28155 30212/31152/28156
+f 23209/31148/28152 26612/21628/18520 26611/21627/18519 23214/31149/28153
+f 23214/31149/28153 26611/21627/18519 31061/21614/18506 30211/31151/28155
+f 23208/31145/28149 23210/31150/28154 23215/31153/28157 23211/31154/28158
+f 23211/31154/28158 23215/31153/28157 30301/31155/28159 30302/31156/28160
+f 23210/31150/28154 30212/31152/28156 30213/31157/28161 23215/31153/28157
+f 23215/31153/28157 30213/31157/28161 31661/31158/28162 30301/31155/28159
+f 23208/31145/28149 23211/31154/28158 23216/31159/28163 23212/31146/28150
+f 23212/31146/28150 23216/31159/28163 30216/31143/28147 30215/31140/28144
+f 23211/31154/28158 30302/31156/28160 30303/31160/28164 23216/31159/28163
+f 23216/31159/28163 30303/31160/28164 31662/28640/25417 30216/31143/28147
+f 23217/31161/28165 23221/31162/28166 23222/31163/28167 23218/31164/28168
+f 23218/31164/28168 23222/31163/28167 26610/21613/18505 26609/21608/18500
+f 23221/31162/28166 30212/31152/28156 30211/31151/28155 23222/31163/28167
+f 23222/31163/28167 30211/31151/28155 31061/21614/18506 26610/21613/18505
+f 23217/31161/28165 23218/31164/28168 23223/31165/28169 23219/31166/28170
+f 23219/31166/28170 23223/31165/28169 30208/31167/28171 30209/31168/28172
+f 23218/31164/28168 26609/21608/18500 26608/21607/18499 23223/31165/28169
+f 23223/31165/28169 26608/21607/18499 31060/21594/18486 30208/31167/28171
+f 23217/31161/28165 23219/31166/28170 23224/31169/28173 23220/31170/28174
+f 23220/31170/28174 23224/31169/28173 30304/31171/28175 30305/31172/28176
+f 23219/31166/28170 30209/31168/28172 30210/31173/28177 23224/31169/28173
+f 23224/31169/28173 30210/31173/28177 31660/31174/28178 30304/31171/28175
+f 23217/31161/28165 23220/31170/28174 23225/31175/28179 23221/31162/28166
+f 23221/31162/28166 23225/31175/28179 30213/31157/28161 30212/31152/28156
+f 23220/31170/28174 30305/31172/28176 30306/31176/28180 23225/31175/28179
+f 23225/31175/28179 30306/31176/28180 31661/31158/28162 30213/31157/28161
+f 23226/31177/28181 23230/31178/28182 23231/31179/28183 23227/31180/28184
+f 23227/31180/28184 23231/31179/28183 26607/21593/18485 26606/21588/18480
+f 23230/31178/28182 30209/31168/28172 30208/31167/28171 23231/31179/28183
+f 23231/31179/28183 30208/31167/28171 31060/21594/18486 26607/21593/18485
+f 23226/31177/28181 23227/31180/28184 23232/31181/28185 23228/31182/28186
+f 23228/31182/28186 23232/31181/28185 30205/31183/28187 30206/31184/28188
+f 23227/31180/28184 26606/21588/18480 26605/21587/18479 23232/31181/28185
+f 23232/31181/28185 26605/21587/18479 31059/21574/18466 30205/31183/28187
+f 23226/31177/28181 23228/31182/28186 23233/31185/28189 23229/31186/28190
+f 23229/31186/28190 23233/31185/28189 30307/31187/28191 30308/31188/28192
+f 23228/31182/28186 30206/31184/28188 30207/31189/28193 23233/31185/28189
+f 23233/31185/28189 30207/31189/28193 31659/31190/28194 30307/31187/28191
+f 23226/31177/28181 23229/31186/28190 23234/31191/28195 23230/31178/28182
+f 23230/31178/28182 23234/31191/28195 30210/31173/28177 30209/31168/28172
+f 23229/31186/28190 30308/31188/28192 30309/31192/28196 23234/31191/28195
+f 23234/31191/28195 30309/31192/28196 31660/31174/28178 30210/31173/28177
+f 23235/31193/28197 23239/31194/28198 23240/31195/28199 23236/31196/28200
+f 23236/31196/28200 23240/31195/28199 26604/21573/18465 26603/21568/18460
+f 23239/31194/28198 30206/31184/28188 30205/31183/28187 23240/31195/28199
+f 23240/31195/28199 30205/31183/28187 31059/21574/18466 26604/21573/18465
+f 23235/31193/28197 23236/31196/28200 23241/31197/28201 23237/31198/28202
+f 23237/31198/28202 23241/31197/28201 30202/31199/28203 30203/31200/28204
+f 23236/31196/28200 26603/21568/18460 26602/21567/18459 23241/31197/28201
+f 23241/31197/28201 26602/21567/18459 31058/21554/18446 30202/31199/28203
+f 23235/31193/28197 23237/31198/28202 23242/31201/28205 23238/31202/28206
+f 23238/31202/28206 23242/31201/28205 30310/31203/28207 30311/31204/28208
+f 23237/31198/28202 30203/31200/28204 30204/31205/28209 23242/31201/28205
+f 23242/31201/28205 30204/31205/28209 31658/31206/28210 30310/31203/28207
+f 23235/31193/28197 23238/31202/28206 23243/31207/28211 23239/31194/28198
+f 23239/31194/28198 23243/31207/28211 30207/31189/28193 30206/31184/28188
+f 23238/31202/28206 30311/31204/28208 30312/31208/28212 23243/31207/28211
+f 23243/31207/28211 30312/31208/28212 31659/31190/28194 30207/31189/28193
+f 23244/31209/28213 23248/31210/28214 23249/31211/28215 23245/31212/28216
+f 23245/31212/28216 23249/31211/28215 26601/21553/18445 26600/21548/18440
+f 23248/31210/28214 30203/31200/28204 30202/31199/28203 23249/31211/28215
+f 23249/31211/28215 30202/31199/28203 31058/21554/18446 26601/21553/18445
+f 23244/31209/28213 23245/31212/28216 23250/31213/28217 23246/31214/28218
+f 23246/31214/28218 23250/31213/28217 30199/31215/28219 30200/31216/28220
+f 23245/31212/28216 26600/21548/18440 26599/21547/18439 23250/31213/28217
+f 23250/31213/28217 26599/21547/18439 31057/21534/18426 30199/31215/28219
+f 23244/31209/28213 23246/31214/28218 23251/31217/28221 23247/31218/28222
+f 23247/31218/28222 23251/31217/28221 30313/31219/28223 30314/31220/28224
+f 23246/31214/28218 30200/31216/28220 30201/31221/28225 23251/31217/28221
+f 23251/31217/28221 30201/31221/28225 31657/31222/28226 30313/31219/28223
+f 23244/31209/28213 23247/31218/28222 23252/31223/28227 23248/31210/28214
+f 23248/31210/28214 23252/31223/28227 30204/31205/28209 30203/31200/28204
+f 23247/31218/28222 30314/31220/28224 30315/31224/28228 23252/31223/28227
+f 23252/31223/28227 30315/31224/28228 31658/31206/28210 30204/31205/28209
+f 23253/31225/28229 23257/31226/28230 23258/31227/28231 23254/31228/28232
+f 23254/31228/28232 23258/31227/28231 26598/21533/18425 26597/21528/18420
+f 23257/31226/28230 30200/31216/28220 30199/31215/28219 23258/31227/28231
+f 23258/31227/28231 30199/31215/28219 31057/21534/18426 26598/21533/18425
+f 23253/31225/28229 23254/31228/28232 23259/31229/28233 23255/31230/28234
+f 23255/31230/28234 23259/31229/28233 30196/31231/28235 30197/31232/28236
+f 23254/31228/28232 26597/21528/18420 26596/21527/18419 23259/31229/28233
+f 23259/31229/28233 26596/21527/18419 31056/21514/18406 30196/31231/28235
+f 23253/31225/28229 23255/31230/28234 23260/31233/28237 23256/31234/28238
+f 23256/31234/28238 23260/31233/28237 30316/31235/28239 30317/31236/28240
+f 23255/31230/28234 30197/31232/28236 30198/31237/28241 23260/31233/28237
+f 23260/31233/28237 30198/31237/28241 31656/31238/28242 30316/31235/28239
+f 23253/31225/28229 23256/31234/28238 23261/31239/28243 23257/31226/28230
+f 23257/31226/28230 23261/31239/28243 30201/31221/28225 30200/31216/28220
+f 23256/31234/28238 30317/31236/28240 30318/31240/28244 23261/31239/28243
+f 23261/31239/28243 30318/31240/28244 31657/31222/28226 30201/31221/28225
+f 23262/31241/28245 23266/31242/28246 23267/31243/28247 23263/31244/28248
+f 23263/31244/28248 23267/31243/28247 26595/21513/18405 26594/21508/18400
+f 23266/31242/28246 30197/31232/28236 30196/31231/28235 23267/31243/28247
+f 23267/31243/28247 30196/31231/28235 31056/21514/18406 26595/21513/18405
+f 23262/31241/28245 23263/31244/28248 23268/31245/28249 23264/31246/28250
+f 23264/31246/28250 23268/31245/28249 30193/31247/28251 30194/31248/28252
+f 23263/31244/28248 26594/21508/18400 26593/21507/18399 23268/31245/28249
+f 23268/31245/28249 26593/21507/18399 31055/21494/18386 30193/31247/28251
+f 23262/31241/28245 23264/31246/28250 23269/31249/28253 23265/31250/28254
+f 23265/31250/28254 23269/31249/28253 30319/31251/28255 30320/31252/28256
+f 23264/31246/28250 30194/31248/28252 30195/31253/28257 23269/31249/28253
+f 23269/31249/28253 30195/31253/28257 31655/31254/28258 30319/31251/28255
+f 23262/31241/28245 23265/31250/28254 23270/31255/28259 23266/31242/28246
+f 23266/31242/28246 23270/31255/28259 30198/31237/28241 30197/31232/28236
+f 23265/31250/28254 30320/31252/28256 30321/31256/28260 23270/31255/28259
+f 23270/31255/28259 30321/31256/28260 31656/31238/28242 30198/31237/28241
+f 23271/31257/28261 23275/31258/28262 23276/31259/28263 23272/31260/28264
+f 23272/31260/28264 23276/31259/28263 26592/21493/18385 26591/21488/18380
+f 23275/31258/28262 30194/31248/28252 30193/31247/28251 23276/31259/28263
+f 23276/31259/28263 30193/31247/28251 31055/21494/18386 26592/21493/18385
+f 23271/31257/28261 23272/31260/28264 23277/31261/28265 23273/31262/28266
+f 23273/31262/28266 23277/31261/28265 30190/31263/28267 30191/31264/28268
+f 23272/31260/28264 26591/21488/18380 26590/21487/18379 23277/31261/28265
+f 23277/31261/28265 26590/21487/18379 31054/21472/18364 30190/31263/28267
+f 23271/31257/28261 23273/31262/28266 23278/31265/28269 23274/31266/28270
+f 23274/31266/28270 23278/31265/28269 30322/31267/28271 30323/31268/28272
+f 23273/31262/28266 30191/31264/28268 30192/31269/28273 23278/31265/28269
+f 23278/31265/28269 30192/31269/28273 31654/31270/28274 30322/31267/28271
+f 23271/31257/28261 23274/31266/28270 23279/31271/28275 23275/31258/28262
+f 23275/31258/28262 23279/31271/28275 30195/31253/28257 30194/31248/28252
+f 23274/31266/28270 30323/31268/28272 30324/31272/28276 23279/31271/28275
+f 23279/31271/28275 30324/31272/28276 31655/31254/28258 30195/31253/28257
+f 23280/31273/28277 23284/31274/28278 23285/31275/28279 23281/31276/28280
+f 23281/31276/28280 23285/31275/28279 26589/21471/18363 26588/21463/18355
+f 23284/31274/28278 30191/31264/28268 30190/31263/28267 23285/31275/28279
+f 23285/31275/28279 30190/31263/28267 31054/21472/18364 26589/21471/18363
+f 23280/31273/28277 23281/31276/28280 23286/31277/28281 23282/31278/28282
+f 23282/31278/28282 23286/31277/28281 30187/31279/28283 30188/31280/28284
+f 23281/31276/28280 26588/21463/18355 26587/21462/18354 23286/31277/28281
+f 23286/31277/28281 26587/21462/18354 31053/21466/18358 30187/31279/28283
+f 23280/31273/28277 23282/31278/28282 23287/31281/28285 23283/31282/28286
+f 23283/31282/28286 23287/31281/28285 30325/31283/28287 30326/31284/28288
+f 23282/31278/28282 30188/31280/28284 30189/31285/28289 23287/31281/28285
+f 23287/31281/28285 30189/31285/28289 31653/31286/28290 30325/31283/28287
+f 23280/31273/28277 23283/31282/28286 23288/31287/28291 23284/31274/28278
+f 23284/31274/28278 23288/31287/28291 30192/31269/28273 30191/31264/28268
+f 23283/31282/28286 30326/31284/28288 30327/31288/28292 23288/31287/28291
+f 23288/31287/28291 30327/31288/28292 31654/31270/28274 30192/31269/28273
+f 23289/31289/28293 23293/31290/28294 23294/31291/28295 23290/31292/28296
+f 23290/31292/28296 23294/31291/28295 26658/21936/18823 26657/21933/18820
+f 23293/31290/28294 30188/31280/28284 30187/31279/28283 23294/31291/28295
+f 23294/31291/28295 30187/31279/28283 31053/21466/18358 26658/21936/18823
+f 23289/31289/28293 23290/31292/28296 23295/31293/28297 23291/31294/28298
+f 23291/31294/28298 23295/31293/28297 30258/30927/27935 30257/30926/27934
+f 23290/31292/28296 26657/21933/18820 26656/21932/18819 23295/31293/28297
+f 23295/31293/28297 26656/21932/18819 31076/21919/18806 30258/30927/27935
+f 23289/31289/28293 23291/31294/28298 23296/31295/28299 23292/31296/28300
+f 23292/31296/28300 23296/31295/28299 30328/31297/28301 30329/31298/28302
+f 23291/31294/28298 30257/30926/27934 30256/30939/27947 23296/31295/28299
+f 23296/31295/28299 30256/30939/27947 31676/30941/27949 30328/31297/28301
+f 23289/31289/28293 23292/31296/28300 23297/31299/28303 23293/31290/28294
+f 23293/31290/28294 23297/31299/28303 30189/31285/28289 30188/31280/28284
+f 23292/31296/28300 30329/31298/28302 30330/31300/28304 23297/31299/28303
+f 23297/31299/28303 30330/31300/28304 31653/31286/28290 30189/31285/28289
+f 23298/31301/28305 23301/31302/28306 23302/31303/28307 23299/31304/28308
+f 23299/31304/28308 23302/31303/28307 30333/31305/28309 30334/31306/28310
+f 23301/31302/28306 30314/31220/28224 30313/31219/28223 23302/31303/28307
+f 23302/31303/28307 30313/31219/28223 31657/31222/28226 30333/31305/28309
+f 23298/31301/28305 23300/31307/28311 23305/31308/28312 23301/31302/28306
+f 23301/31302/28306 23305/31308/28312 30315/31224/28228 30314/31220/28224
+f 23300/31307/28311 30331/31309/28313 30332/31310/28314 23305/31308/28312
+f 23305/31308/28312 30332/31310/28314 31658/31206/28210 30315/31224/28228
+f 23306/31311/28315 23309/31312/28316 23310/31313/28317 23307/31314/28318
+f 23309/31312/28316 30317/31236/28240 30316/31235/28239 23310/31313/28317
+f 23310/31313/28317 30316/31235/28239 31656/31238/28242 30335/31315/28319
+f 23306/31311/28315 23308/31316/28320 23313/31317/28321 23309/31312/28316
+f 23309/31312/28316 23313/31317/28321 30318/31240/28244 30317/31236/28240
+f 23308/31316/28320 30334/31306/28310 30333/31305/28309 23313/31317/28321
+f 23313/31317/28321 30333/31305/28309 31657/31222/28226 30318/31240/28244
+f 23316/31318/28322 30320/31252/28256 30319/31251/28255 23317/31319/28323
+f 23317/31319/28323 30319/31251/28255 31655/31254/28258 30336/31320/28324
+f 23316/31318/28322 23320/31321/28325 30321/31256/28260 30320/31252/28256
+f 23320/31321/28325 30335/31315/28319 31656/31238/28242 30321/31256/28260
+f 23323/31322/28326 30323/31268/28272 30322/31267/28271 23324/31323/28327
+f 23324/31323/28327 30322/31267/28271 31654/31270/28274 30337/31324/28328
+f 23323/31322/28326 23327/31325/28329 30324/31272/28276 30323/31268/28272
+f 23327/31325/28329 30336/31320/28324 31655/31254/28258 30324/31272/28276
+f 23328/31326/28330 23332/31327/28331 23333/31328/28332 23329/31329/28333
+f 23329/31329/28333 23333/31328/28332 30347/31330/28334 30348/31331/28335
+f 23332/31327/28331 30329/31298/28302 30328/31297/28301 23333/31328/28332
+f 23333/31328/28332 30328/31297/28301 31676/30941/27949 30347/31330/28334
+f 23328/31326/28330 23329/31329/28333 23334/31332/28336 23330/31333/28337
+f 23329/31329/28333 30348/31331/28335 30349/31334/28338 23334/31332/28336
+f 23328/31326/28330 23330/31333/28337 23335/31335/28339 23331/31336/28340
+f 23331/31336/28340 23335/31335/28339 30327/31288/28292 30326/31284/28288
+f 23335/31335/28339 30337/31324/28328 31654/31270/28274 30327/31288/28292
+f 23328/31326/28330 23331/31336/28340 23336/31337/28341 23332/31327/28331
+f 23332/31327/28331 23336/31337/28341 30330/31300/28304 30329/31298/28302
+f 23331/31336/28340 30326/31284/28288 30325/31283/28287 23336/31337/28341
+f 23336/31337/28341 30325/31283/28287 31653/31286/28290 30330/31300/28304
+f 23337/31338/28342 23340/31339/28343 23341/31340/28344 23338/31341/28345
+f 23338/31341/28345 23341/31340/28344 30332/31310/28314 30331/31309/28313
+f 23340/31339/28343 30311/31204/28208 30310/31203/28207 23341/31340/28344
+f 23341/31340/28344 30310/31203/28207 31658/31206/28210 30332/31310/28314
+f 23337/31338/28342 23339/31342/28346 23344/31343/28347 23340/31339/28343
+f 23340/31339/28343 23344/31343/28347 30312/31208/28212 30311/31204/28208
+f 23339/31342/28346 30338/31344/28348 30339/31345/28349 23344/31343/28347
+f 23344/31343/28347 30339/31345/28349 31659/31190/28194 30312/31208/28212
+f 23345/31346/28350 23348/31347/28351 23349/31348/28352 23346/31349/28353
+f 23346/31349/28353 23349/31348/28352 30339/31345/28349 30338/31344/28348
+f 23348/31347/28351 30308/31188/28192 30307/31187/28191 23349/31348/28352
+f 23349/31348/28352 30307/31187/28191 31659/31190/28194 30339/31345/28349
+f 23345/31346/28350 23347/31350/28354 23352/31351/28355 23348/31347/28351
+f 23348/31347/28351 23352/31351/28355 30309/31192/28196 30308/31188/28192
+f 23347/31350/28354 30340/31352/28356 30341/31353/28357 23352/31351/28355
+f 23352/31351/28355 30341/31353/28357 31660/31174/28178 30309/31192/28196
+f 23354/31354/28358 30305/31172/28176 30304/31171/28175 23355/31355/28359
+f 23355/31355/28359 30304/31171/28175 31660/31174/28178 30341/31353/28357
+f 23354/31354/28358 23358/31356/28360 30306/31176/28180 30305/31172/28176
+f 23358/31356/28360 30343/31357/28361 31661/31158/28162 30306/31176/28180
+f 23360/31358/28362 30302/31156/28160 30301/31155/28159 23361/31359/28363
+f 23361/31359/28363 30301/31155/28159 31661/31158/28162 30343/31357/28361
+f 23360/31358/28362 23364/31360/28364 30303/31160/28164 30302/31156/28160
+f 23364/31360/28364 30344/28641/25418 31662/28640/25417 30303/31160/28164
+f 23365/31361/28365 23369/31362/28366 23370/31363/28367 23366/31364/28368
+f 23366/31364/28368 23370/31363/28367 30264/30957/27965 30263/30953/27961
+f 23369/31362/28366 30260/30935/27943 30259/30934/27942 23370/31363/28367
+f 23370/31363/28367 30259/30934/27942 31675/30937/27945 30264/30957/27965
+f 23365/31361/28365 23366/31364/28368 23371/31365/28369 23367/31366/28370
+f 23366/31364/28368 30263/30953/27961 30262/30952/27960 23371/31365/28369
+f 23371/31365/28369 30262/30952/27960 31674/30955/27963 30346/31367/28371
+f 23365/31361/28365 23367/31366/28370 23372/31368/28372 23368/31369/28373
+f 23368/31369/28373 23372/31368/28372 30349/31334/28338 30348/31331/28335
+f 23365/31361/28365 23368/31369/28373 23373/31370/28374 23369/31362/28366
+f 23369/31362/28366 23373/31370/28374 30261/30940/27948 30260/30935/27943
+f 23368/31369/28373 30348/31331/28335 30347/31330/28334 23373/31370/28374
+f 23373/31370/28374 30347/31330/28334 31676/30941/27949 30261/30940/27948
+f 23375/31371/28375 23379/31372/28376 30267/30973/27981 30266/30969/27977
+f 23379/31372/28376 30346/31367/28371 31674/30955/27963 30267/30973/27981
+f 23375/31371/28375 30266/30969/27977 30265/30968/27976 23380/31373/28377
+f 23380/31373/28377 30265/30968/27976 31673/30971/27979 30350/31374/28378
+f 23382/31375/28379 23386/31376/28380 30270/30989/27997 30269/30985/27993
+f 23386/31376/28380 30350/31374/28378 31673/30971/27979 30270/30989/27997
+f 23382/31375/28379 30269/30985/27993 30268/30984/27992 23387/31377/28381
+f 23387/31377/28381 30268/30984/27992 31672/30987/27995 30353/31378/28382
+f 23388/31379/28383 23389/31380/28384 23394/31381/28385 23390/31382/28386
+f 23390/31382/28386 23394/31381/28385 30273/31005/28013 30272/31001/28009
+f 23394/31381/28385 30353/31378/28382 31672/30987/27995 30273/31005/28013
+f 23388/31379/28383 23390/31382/28386 23395/31383/28387 23391/31384/28388
+f 23391/31384/28388 23395/31383/28387 30356/31385/28389 30357/31386/28390
+f 23390/31382/28386 30272/31001/28009 30271/31000/28008 23395/31383/28387
+f 23395/31383/28387 30271/31000/28008 31671/31003/28011 30356/31385/28389
+f 23396/31387/28391 23397/31388/28392 23402/31389/28393 23398/31390/28394
+f 23398/31390/28394 23402/31389/28393 30276/31391/28029 30275/31392/28025
+f 23397/31388/28392 30357/31386/28390 30356/31385/28389 23402/31389/28393
+f 23402/31389/28393 30356/31385/28389 31671/31003/28011 30276/31391/28029
+f 23396/31387/28391 23398/31390/28394 23403/31393/28395 23399/31394/28396
+f 23399/31394/28396 23403/31393/28395 30360/31395/28397 30361/31396/28398
+f 23398/31390/28394 30275/31392/28025 30274/31397/28024 23403/31393/28395
+f 23403/31393/28395 30274/31397/28024 31670/31041/28027 30360/31395/28397
+f 23404/31398/28399 23405/31399/28400 23410/31400/28401 23406/31401/28402
+f 23406/31401/28402 23410/31400/28401 30279/31040/28045 30278/31035/28041
+f 23405/31399/28400 30361/31396/28398 30360/31395/28397 23410/31400/28401
+f 23410/31400/28401 30360/31395/28397 31670/31041/28027 30279/31040/28045
+f 23404/31398/28399 23406/31401/28402 23411/31402/28403 23407/31403/28404
+f 23407/31403/28404 23411/31402/28403 30364/31404/28405 30365/31405/28406
+f 23406/31401/28402 30278/31035/28041 30277/31034/28040 23411/31402/28403
+f 23411/31402/28403 30277/31034/28040 31669/31037/28043 30364/31404/28405
+f 23412/31406/28407 23413/31407/28408 23418/31408/28409 23414/31409/28410
+f 23414/31409/28410 23418/31408/28409 30282/31057/28061 30281/31053/28057
+f 23413/31407/28408 30365/31405/28406 30364/31404/28405 23418/31408/28409
+f 23418/31408/28409 30364/31404/28405 31669/31037/28043 30282/31057/28061
+f 23412/31406/28407 23414/31409/28410 23419/31410/28411 23415/31411/28412
+f 23415/31411/28412 23419/31410/28411 30368/31412/28413 30369/31413/28414
+f 23414/31409/28410 30281/31053/28057 30280/31052/28056 23419/31410/28411
+f 23419/31410/28411 30280/31052/28056 31668/31055/28059 30368/31412/28413
+f 23421/31414/28415 23424/31415/28416 30285/31073/28077 30284/31069/28073
+f 23424/31415/28416 30368/31412/28413 31668/31055/28059 30285/31073/28077
+f 23421/31414/28415 30284/31069/28073 30283/31068/28072 23425/31416/28417
+f 23425/31416/28417 30283/31068/28072 31667/31071/28075 30372/31417/28418
+f 23427/31418/28419 23430/31419/28420 30288/31089/28093 30287/31085/28089
+f 23430/31419/28420 30372/31417/28418 31667/31071/28075 30288/31089/28093
+f 23427/31418/28419 30287/31085/28089 30286/31084/28088 23431/31420/28421
+f 23431/31420/28421 30286/31084/28088 31666/31087/28091 30376/31421/28422
+f 23432/31422/28423 23435/31423/28424 23436/31424/28425 23433/31425/28426
+f 23433/31425/28426 23436/31424/28425 30382/28651/25428 30381/28645/25422
+f 23435/31423/28424 30293/31117/28121 30292/31116/28120 23436/31424/28425
+f 23436/31424/28425 30292/31116/28120 31664/28652/25429 30382/28651/25428
+f 23433/31425/28426 30381/28645/25422 30380/28644/25421 23437/31426/28427
+f 23434/31427/28428 23438/31428/28429 30291/31105/28109 30290/31101/28105
+f 23438/31428/28429 30376/31421/28422 31666/31087/28091 30291/31105/28109
+f 23432/31422/28423 23434/31427/28428 23439/31429/28430 23435/31423/28424
+f 23435/31423/28424 23439/31429/28430 30294/31120/28124 30293/31117/28121
+f 23434/31427/28428 30290/31101/28105 30289/31100/28104 23439/31429/28430
+f 23439/31429/28430 30289/31100/28104 31665/31103/28107 30294/31120/28124
+f 23440/31430/28431 23444/31431/28432 23445/31432/28433 23441/31433/28434
+f 23441/31433/28434 23445/31432/28433 30383/31434/28435 30384/31435/28436
+f 23444/31431/28432 23849/14441/11407 23848/14451/11417 23445/31432/28433
+f 23445/31432/28433 23848/14451/11417 30573/13975/10946 30383/31434/28435
+f 23440/31430/28431 23441/31433/28434 23446/31436/28437 23442/31437/28438
+f 23442/31437/28438 23446/31436/28437 30455/31438/28439 30456/31439/28440
+f 23441/31433/28434 30384/31435/28436 30385/31440/28441 23446/31436/28437
+f 23446/31436/28437 30385/31440/28441 31677/31441/28442 30455/31438/28439
+f 23440/31430/28431 23442/31437/28438 23447/31442/28443 23443/31443/28444
+f 23443/31443/28444 23447/31442/28443 30452/31444/28445 30453/31445/28446
+f 23442/31437/28438 30456/31439/28440 30457/31446/28447 23447/31442/28443
+f 23447/31442/28443 30457/31446/28447 31700/21159/18054 30452/31444/28445
+f 23440/31430/28431 23443/31443/28444 23448/31447/28448 23444/31431/28432
+f 23444/31431/28432 23448/31447/28448 23850/14442/11408 23849/14441/11407
+f 23443/31443/28444 30453/31445/28446 30454/31448/28449 23448/31447/28448
+f 23448/31447/28448 30454/31448/28449 30596/14436/11402 23850/14442/11408
+f 23449/31449/28450 23453/31450/28451 23454/31451/28452 23450/31452/28453
+f 23450/31452/28453 23454/31451/28452 30386/31453/28454 30387/31454/28455
+f 23453/31450/28451 23780/13973/10944 23779/13989/10960 23454/31451/28452
+f 23454/31451/28452 23779/13989/10960 30574/13991/10962 30386/31453/28454
+f 23449/31449/28450 23450/31452/28453 23455/31455/28456 23451/31456/28457
+f 23451/31456/28457 23455/31455/28456 30458/31457/28458 30459/31458/28459
+f 23450/31452/28453 30387/31454/28455 30388/31459/28460 23455/31455/28456
+f 23455/31455/28456 30388/31459/28460 31678/31460/28461 30458/31457/28458
+f 23449/31449/28450 23451/31456/28457 23456/31461/28462 23452/31462/28463
+f 23452/31462/28463 23456/31461/28462 30385/31440/28441 30384/31435/28436
+f 23451/31456/28457 30459/31458/28459 30460/31463/28464 23456/31461/28462
+f 23456/31461/28462 30460/31463/28464 31677/31441/28442 30385/31440/28441
+f 23449/31449/28450 23452/31462/28463 23457/31464/28465 23453/31450/28451
+f 23453/31450/28451 23457/31464/28465 23781/13974/10945 23780/13973/10944
+f 23452/31462/28463 30384/31435/28436 30383/31434/28435 23457/31464/28465
+f 23457/31464/28465 30383/31434/28435 30573/13975/10946 23781/13974/10945
+f 23458/31465/28466 23462/31466/28467 23463/31467/28468 23459/31468/28469
+f 23459/31468/28469 23463/31467/28468 30389/31469/28470 30390/31470/28471
+f 23462/31466/28467 23783/13996/10967 23782/14009/10980 23463/31467/28468
+f 23463/31467/28468 23782/14009/10980 30575/14011/10982 30389/31469/28470
+f 23458/31465/28466 23459/31468/28469 23464/31471/28472 23460/31472/28473
+f 23460/31472/28473 23464/31471/28472 30461/31473/28474 30462/31474/28475
+f 23459/31468/28469 30390/31470/28471 30391/31475/28476 23464/31471/28472
+f 23464/31471/28472 30391/31475/28476 31679/31476/28477 30461/31473/28474
+f 23458/31465/28466 23460/31472/28473 23465/31477/28478 23461/31478/28479
+f 23461/31478/28479 23465/31477/28478 30388/31459/28460 30387/31454/28455
+f 23460/31472/28473 30462/31474/28475 30463/31479/28480 23465/31477/28478
+f 23465/31477/28478 30463/31479/28480 31678/31460/28461 30388/31459/28460
+f 23458/31465/28466 23461/31478/28479 23466/31480/28481 23462/31466/28467
+f 23462/31466/28467 23466/31480/28481 23784/13997/10968 23783/13996/10967
+f 23461/31478/28479 30387/31454/28455 30386/31453/28454 23466/31480/28481
+f 23466/31480/28481 30386/31453/28454 30574/13991/10962 23784/13997/10968
+f 23467/31481/28482 23471/31482/28483 23472/31483/28484 23468/31484/28485
+f 23468/31484/28485 23472/31483/28484 30392/31485/28486 30393/31486/28487
+f 23471/31482/28483 23786/14016/10987 23785/14029/11000 23472/31483/28484
+f 23472/31483/28484 23785/14029/11000 30576/14031/11002 30392/31485/28486
+f 23467/31481/28482 23468/31484/28485 23473/31487/28488 23469/31488/28489
+f 23469/31488/28489 23473/31487/28488 30464/31489/28490 30465/31490/28491
+f 23468/31484/28485 30393/31486/28487 30394/31491/28492 23473/31487/28488
+f 23473/31487/28488 30394/31491/28492 31680/31492/28493 30464/31489/28490
+f 23467/31481/28482 23469/31488/28489 23474/31493/28494 23470/31494/28495
+f 23470/31494/28495 23474/31493/28494 30391/31475/28476 30390/31470/28471
+f 23469/31488/28489 30465/31490/28491 30466/31495/28496 23474/31493/28494
+f 23474/31493/28494 30466/31495/28496 31679/31476/28477 30391/31475/28476
+f 23467/31481/28482 23470/31494/28495 23475/31496/28497 23471/31482/28483
+f 23471/31482/28483 23475/31496/28497 23787/14017/10988 23786/14016/10987
+f 23470/31494/28495 30390/31470/28471 30389/31469/28470 23475/31496/28497
+f 23475/31496/28497 30389/31469/28470 30575/14011/10982 23787/14017/10988
+f 23476/31497/28498 23480/31498/28499 23481/31499/28500 23477/31500/28501
+f 23477/31500/28501 23481/31499/28500 30395/31501/28502 30396/31502/28503
+f 23480/31498/28499 23789/14036/11007 23788/14049/11020 23481/31499/28500
+f 23481/31499/28500 23788/14049/11020 30577/14051/11022 30395/31501/28502
+f 23476/31497/28498 23477/31500/28501 23482/31503/28504 23478/31504/28505
+f 23478/31504/28505 23482/31503/28504 30467/31505/28506 30468/31506/28507
+f 23477/31500/28501 30396/31502/28503 30397/31507/28508 23482/31503/28504
+f 23482/31503/28504 30397/31507/28508 31681/31508/28509 30467/31505/28506
+f 23476/31497/28498 23478/31504/28505 23483/31509/28510 23479/31510/28511
+f 23479/31510/28511 23483/31509/28510 30394/31491/28492 30393/31486/28487
+f 23478/31504/28505 30468/31506/28507 30469/31511/28512 23483/31509/28510
+f 23483/31509/28510 30469/31511/28512 31680/31492/28493 30394/31491/28492
+f 23476/31497/28498 23479/31510/28511 23484/31512/28513 23480/31498/28499
+f 23480/31498/28499 23484/31512/28513 23790/14037/11008 23789/14036/11007
+f 23479/31510/28511 30393/31486/28487 30392/31485/28486 23484/31512/28513
+f 23484/31512/28513 30392/31485/28486 30576/14031/11002 23790/14037/11008
+f 23485/31513/28514 23489/31514/28515 23490/31515/28516 23486/31516/28517
+f 23486/31516/28517 23490/31515/28516 30398/31517/28518 30399/31518/28519
+f 23489/31514/28515 23792/14056/11027 23791/14069/11040 23490/31515/28516
+f 23490/31515/28516 23791/14069/11040 30578/14071/11042 30398/31517/28518
+f 23485/31513/28514 23486/31516/28517 23491/31519/28520 23487/31520/28521
+f 23487/31520/28521 23491/31519/28520 30470/31521/28522 30471/31522/28523
+f 23486/31516/28517 30399/31518/28519 30400/31523/28524 23491/31519/28520
+f 23491/31519/28520 30400/31523/28524 31682/31524/28525 30470/31521/28522
+f 23485/31513/28514 23487/31520/28521 23492/31525/28526 23488/31526/28527
+f 23488/31526/28527 23492/31525/28526 30397/31507/28508 30396/31502/28503
+f 23487/31520/28521 30471/31522/28523 30472/31527/28528 23492/31525/28526
+f 23492/31525/28526 30472/31527/28528 31681/31508/28509 30397/31507/28508
+f 23485/31513/28514 23488/31526/28527 23493/31528/28529 23489/31514/28515
+f 23489/31514/28515 23493/31528/28529 23793/14057/11028 23792/14056/11027
+f 23488/31526/28527 30396/31502/28503 30395/31501/28502 23493/31528/28529
+f 23493/31528/28529 30395/31501/28502 30577/14051/11022 23793/14057/11028
+f 23494/31529/28530 23498/31530/28531 23499/31531/28532 23495/31532/28533
+f 23495/31532/28533 23499/31531/28532 30401/31533/28534 30402/31534/28535
+f 23498/31530/28531 23795/14076/11047 23794/14089/11060 23499/31531/28532
+f 23499/31531/28532 23794/14089/11060 30579/14091/11062 30401/31533/28534
+f 23494/31529/28530 23495/31532/28533 23500/31535/28536 23496/31536/28537
+f 23496/31536/28537 23500/31535/28536 30473/31537/28538 30474/31538/28539
+f 23495/31532/28533 30402/31534/28535 30403/31539/28540 23500/31535/28536
+f 23500/31535/28536 30403/31539/28540 31683/31540/28541 30473/31537/28538
+f 23494/31529/28530 23496/31536/28537 23501/31541/28542 23497/31542/28543
+f 23497/31542/28543 23501/31541/28542 30400/31523/28524 30399/31518/28519
+f 23496/31536/28537 30474/31538/28539 30475/31543/28544 23501/31541/28542
+f 23501/31541/28542 30475/31543/28544 31682/31524/28525 30400/31523/28524
+f 23494/31529/28530 23497/31542/28543 23502/31544/28545 23498/31530/28531
+f 23498/31530/28531 23502/31544/28545 23796/14077/11048 23795/14076/11047
+f 23497/31542/28543 30399/31518/28519 30398/31517/28518 23502/31544/28545
+f 23502/31544/28545 30398/31517/28518 30578/14071/11042 23796/14077/11048
+f 23503/31545/28546 23507/31546/28547 23508/31547/28548 23504/31548/28549
+f 23504/31548/28549 23508/31547/28548 30404/31549/28550 30405/31550/28551
+f 23507/31546/28547 23798/14096/11067 23797/14109/11080 23508/31547/28548
+f 23508/31547/28548 23797/14109/11080 30580/14111/11082 30404/31549/28550
+f 23503/31545/28546 23504/31548/28549 23509/31551/28552 23505/31552/28553
+f 23505/31552/28553 23509/31551/28552 30476/31553/28554 30477/31554/28555
+f 23504/31548/28549 30405/31550/28551 30406/31555/28556 23509/31551/28552
+f 23509/31551/28552 30406/31555/28556 31684/31556/28557 30476/31553/28554
+f 23503/31545/28546 23505/31552/28553 23510/31557/28558 23506/31558/28559
+f 23506/31558/28559 23510/31557/28558 30403/31539/28540 30402/31534/28535
+f 23505/31552/28553 30477/31554/28555 30478/31559/28560 23510/31557/28558
+f 23510/31557/28558 30478/31559/28560 31683/31540/28541 30403/31539/28540
+f 23503/31545/28546 23506/31558/28559 23511/31560/28561 23507/31546/28547
+f 23507/31546/28547 23511/31560/28561 23799/14097/11068 23798/14096/11067
+f 23506/31558/28559 30402/31534/28535 30401/31533/28534 23511/31560/28561
+f 23511/31560/28561 30401/31533/28534 30579/14091/11062 23799/14097/11068
+f 23512/31561/28562 23516/31562/28563 23517/31563/28564 23513/31564/28565
+f 23513/31564/28565 23517/31563/28564 30407/31565/28566 30408/31566/28567
+f 23516/31562/28563 23801/14116/11087 23800/14129/11100 23517/31563/28564
+f 23517/31563/28564 23800/14129/11100 30581/14131/11102 30407/31565/28566
+f 23512/31561/28562 23513/31564/28565 23518/31567/28568 23514/31568/28569
+f 23514/31568/28569 23518/31567/28568 30479/31569/28570 30480/31570/28571
+f 23513/31564/28565 30408/31566/28567 30409/31571/28572 23518/31567/28568
+f 23518/31567/28568 30409/31571/28572 31685/31572/28573 30479/31569/28570
+f 23512/31561/28562 23514/31568/28569 23519/31573/28574 23515/31574/28575
+f 23515/31574/28575 23519/31573/28574 30406/31555/28556 30405/31550/28551
+f 23514/31568/28569 30480/31570/28571 30481/31575/28576 23519/31573/28574
+f 23519/31573/28574 30481/31575/28576 31684/31556/28557 30406/31555/28556
+f 23512/31561/28562 23515/31574/28575 23520/31576/28577 23516/31562/28563
+f 23516/31562/28563 23520/31576/28577 23802/14117/11088 23801/14116/11087
+f 23515/31574/28575 30405/31550/28551 30404/31549/28550 23520/31576/28577
+f 23520/31576/28577 30404/31549/28550 30580/14111/11082 23802/14117/11088
+f 23521/31577/28578 23525/31578/28579 23526/31579/28580 23522/31580/28581
+f 23522/31580/28581 23526/31579/28580 30410/31581/28582 30411/31582/28583
+f 23525/31578/28579 23804/14136/11107 23803/14149/11120 23526/31579/28580
+f 23526/31579/28580 23803/14149/11120 30582/14151/11122 30410/31581/28582
+f 23521/31577/28578 23522/31580/28581 23527/31583/28584 23523/31584/28585
+f 23523/31584/28585 23527/31583/28584 30482/31585/28586 30483/31586/28587
+f 23522/31580/28581 30411/31582/28583 30412/31587/28588 23527/31583/28584
+f 23527/31583/28584 30412/31587/28588 31686/31588/28589 30482/31585/28586
+f 23521/31577/28578 23523/31584/28585 23528/31589/28590 23524/31590/28591
+f 23524/31590/28591 23528/31589/28590 30409/31571/28572 30408/31566/28567
+f 23523/31584/28585 30483/31586/28587 30484/31591/28592 23528/31589/28590
+f 23528/31589/28590 30484/31591/28592 31685/31572/28573 30409/31571/28572
+f 23521/31577/28578 23524/31590/28591 23529/31592/28593 23525/31578/28579
+f 23525/31578/28579 23529/31592/28593 23805/14137/11108 23804/14136/11107
+f 23524/31590/28591 30408/31566/28567 30407/31565/28566 23529/31592/28593
+f 23529/31592/28593 30407/31565/28566 30581/14131/11102 23805/14137/11108
+f 23530/31593/28594 23534/31594/28595 23535/31595/28596 23531/31596/28597
+f 23531/31596/28597 23535/31595/28596 30413/31597/28598 30414/31598/28599
+f 23534/31594/28595 23807/14156/11127 23806/14169/11140 23535/31595/28596
+f 23535/31595/28596 23806/14169/11140 30583/14171/11142 30413/31597/28598
+f 23530/31593/28594 23531/31596/28597 23536/31599/28600 23532/31600/28601
+f 23532/31600/28601 23536/31599/28600 30485/31601/28602 30486/31602/28603
+f 23531/31596/28597 30414/31598/28599 30415/31603/28604 23536/31599/28600
+f 23536/31599/28600 30415/31603/28604 31687/31604/28605 30485/31601/28602
+f 23530/31593/28594 23532/31600/28601 23537/31605/28606 23533/31606/28607
+f 23533/31606/28607 23537/31605/28606 30412/31587/28588 30411/31582/28583
+f 23532/31600/28601 30486/31602/28603 30487/31607/28608 23537/31605/28606
+f 23537/31605/28606 30487/31607/28608 31686/31588/28589 30412/31587/28588
+f 23530/31593/28594 23533/31606/28607 23538/31608/28609 23534/31594/28595
+f 23534/31594/28595 23538/31608/28609 23808/14157/11128 23807/14156/11127
+f 23533/31606/28607 30411/31582/28583 30410/31581/28582 23538/31608/28609
+f 23538/31608/28609 30410/31581/28582 30582/14151/11122 23808/14157/11128
+f 23539/31609/28610 23543/31610/28611 23544/31611/28612 23540/31612/28613
+f 23540/31612/28613 23544/31611/28612 30416/31613/28614 30417/31614/28615
+f 23543/31610/28611 23810/14176/11147 23809/14189/11160 23544/31611/28612
+f 23544/31611/28612 23809/14189/11160 30584/14191/11162 30416/31613/28614
+f 23539/31609/28610 23540/31612/28613 23545/31615/28616 23541/31616/28617
+f 23541/31616/28617 23545/31615/28616 30488/31617/28618 30489/31618/28619
+f 23540/31612/28613 30417/31614/28615 30418/31619/28620 23545/31615/28616
+f 23545/31615/28616 30418/31619/28620 31688/31620/28621 30488/31617/28618
+f 23539/31609/28610 23541/31616/28617 23546/31621/28622 23542/31622/28623
+f 23542/31622/28623 23546/31621/28622 30415/31603/28604 30414/31598/28599
+f 23541/31616/28617 30489/31618/28619 30490/31623/28624 23546/31621/28622
+f 23546/31621/28622 30490/31623/28624 31687/31604/28605 30415/31603/28604
+f 23539/31609/28610 23542/31622/28623 23547/31624/28625 23543/31610/28611
+f 23543/31610/28611 23547/31624/28625 23811/14177/11148 23810/14176/11147
+f 23542/31622/28623 30414/31598/28599 30413/31597/28598 23547/31624/28625
+f 23547/31624/28625 30413/31597/28598 30583/14171/11142 23811/14177/11148
+f 23548/31625/28626 23552/31626/28627 23553/31627/28628 23549/31628/28629
+f 23549/31628/28629 23553/31627/28628 30419/31629/28630 30420/31630/28631
+f 23552/31626/28627 23813/14196/11167 23812/14209/11180 23553/31627/28628
+f 23553/31627/28628 23812/14209/11180 30585/14211/11182 30419/31629/28630
+f 23548/31625/28626 23549/31628/28629 23554/31631/28632 23550/31632/28633
+f 23550/31632/28633 23554/31631/28632 30491/31633/28634 30492/31634/28635
+f 23549/31628/28629 30420/31630/28631 30421/31635/28636 23554/31631/28632
+f 23554/31631/28632 30421/31635/28636 31689/31636/28637 30491/31633/28634
+f 23548/31625/28626 23550/31632/28633 23555/31637/28638 23551/31638/28639
+f 23551/31638/28639 23555/31637/28638 30418/31619/28620 30417/31614/28615
+f 23550/31632/28633 30492/31634/28635 30493/31639/28640 23555/31637/28638
+f 23555/31637/28638 30493/31639/28640 31688/31620/28621 30418/31619/28620
+f 23548/31625/28626 23551/31638/28639 23556/31640/28641 23552/31626/28627
+f 23552/31626/28627 23556/31640/28641 23814/14197/11168 23813/14196/11167
+f 23551/31638/28639 30417/31614/28615 30416/31613/28614 23556/31640/28641
+f 23556/31640/28641 30416/31613/28614 30584/14191/11162 23814/14197/11168
+f 23557/31641/28642 23561/31642/28643 23562/31643/28644 23558/31644/28645
+f 23558/31644/28645 23562/31643/28644 30422/31645/28646 30423/31646/28647
+f 23561/31642/28643 23816/14216/11187 23815/14229/11200 23562/31643/28644
+f 23562/31643/28644 23815/14229/11200 30586/14231/11202 30422/31645/28646
+f 23557/31641/28642 23558/31644/28645 23563/31647/28648 23559/31648/28649
+f 23559/31648/28649 23563/31647/28648 30494/31649/28650 30495/31650/28651
+f 23558/31644/28645 30423/31646/28647 30424/31651/28652 23563/31647/28648
+f 23563/31647/28648 30424/31651/28652 31690/31652/28653 30494/31649/28650
+f 23557/31641/28642 23559/31648/28649 23564/31653/28654 23560/31654/28655
+f 23560/31654/28655 23564/31653/28654 30421/31635/28636 30420/31630/28631
+f 23559/31648/28649 30495/31650/28651 30496/31655/28656 23564/31653/28654
+f 23564/31653/28654 30496/31655/28656 31689/31636/28637 30421/31635/28636
+f 23557/31641/28642 23560/31654/28655 23565/31656/28657 23561/31642/28643
+f 23561/31642/28643 23565/31656/28657 23817/14217/11188 23816/14216/11187
+f 23560/31654/28655 30420/31630/28631 30419/31629/28630 23565/31656/28657
+f 23565/31656/28657 30419/31629/28630 30585/14211/11182 23817/14217/11188
+f 23566/31657/28658 23570/31658/28659 23571/31659/28660 23567/31660/28661
+f 23567/31660/28661 23571/31659/28660 30425/31661/28662 30426/31662/28663
+f 23570/31658/28659 23819/14236/11207 23818/14249/11220 23571/31659/28660
+f 23571/31659/28660 23818/14249/11220 30587/14251/11222 30425/31661/28662
+f 23566/31657/28658 23567/31660/28661 23572/31663/28664 23568/31664/28665
+f 23568/31664/28665 23572/31663/28664 30497/31665/28666 30498/31666/28667
+f 23567/31660/28661 30426/31662/28663 30427/31667/28668 23572/31663/28664
+f 23572/31663/28664 30427/31667/28668 31691/31668/28669 30497/31665/28666
+f 23566/31657/28658 23568/31664/28665 23573/31669/28670 23569/31670/28671
+f 23569/31670/28671 23573/31669/28670 30424/31651/28652 30423/31646/28647
+f 23568/31664/28665 30498/31666/28667 30499/31671/28672 23573/31669/28670
+f 23573/31669/28670 30499/31671/28672 31690/31652/28653 30424/31651/28652
+f 23566/31657/28658 23569/31670/28671 23574/31672/28673 23570/31658/28659
+f 23570/31658/28659 23574/31672/28673 23820/14237/11208 23819/14236/11207
+f 23569/31670/28671 30423/31646/28647 30422/31645/28646 23574/31672/28673
+f 23574/31672/28673 30422/31645/28646 30586/14231/11202 23820/14237/11208
+f 23575/31673/28674 23579/31674/28675 23580/31675/28676 23576/31676/28677
+f 23576/31676/28677 23580/31675/28676 30428/31677/28678 30429/31678/28679
+f 23579/31674/28675 23822/14256/11227 23821/14269/11240 23580/31675/28676
+f 23580/31675/28676 23821/14269/11240 30588/14271/11242 30428/31677/28678
+f 23575/31673/28674 23576/31676/28677 23581/31679/28680 23577/31680/28681
+f 23577/31680/28681 23581/31679/28680 30500/31681/28682 30501/31682/28683
+f 23576/31676/28677 30429/31678/28679 30430/31683/28684 23581/31679/28680
+f 23581/31679/28680 30430/31683/28684 31692/31684/28685 30500/31681/28682
+f 23575/31673/28674 23577/31680/28681 23582/31685/28686 23578/31686/28687
+f 23578/31686/28687 23582/31685/28686 30427/31667/28668 30426/31662/28663
+f 23577/31680/28681 30501/31682/28683 30502/31687/28688 23582/31685/28686
+f 23582/31685/28686 30502/31687/28688 31691/31668/28669 30427/31667/28668
+f 23575/31673/28674 23578/31686/28687 23583/31688/28689 23579/31674/28675
+f 23579/31674/28675 23583/31688/28689 23823/14257/11228 23822/14256/11227
+f 23578/31686/28687 30426/31662/28663 30425/31661/28662 23583/31688/28689
+f 23583/31688/28689 30425/31661/28662 30587/14251/11222 23823/14257/11228
+f 23584/31689/28690 23588/31690/28691 23589/31691/28692 23585/31692/28693
+f 23585/31692/28693 23589/31691/28692 30431/31693/28694 30432/31694/28695
+f 23588/31690/28691 23825/14276/11247 23824/14289/11260 23589/31691/28692
+f 23589/31691/28692 23824/14289/11260 30589/14291/11262 30431/31693/28694
+f 23584/31689/28690 23585/31692/28693 23590/31695/28696 23586/31696/28697
+f 23586/31696/28697 23590/31695/28696 30503/31697/28698 30504/31698/28699
+f 23585/31692/28693 30432/31694/28695 30433/31699/28700 23590/31695/28696
+f 23590/31695/28696 30433/31699/28700 31693/31700/28701 30503/31697/28698
+f 23584/31689/28690 23586/31696/28697 23591/31701/28702 23587/31702/28703
+f 23587/31702/28703 23591/31701/28702 30430/31683/28684 30429/31678/28679
+f 23586/31696/28697 30504/31698/28699 30505/31703/28704 23591/31701/28702
+f 23591/31701/28702 30505/31703/28704 31692/31684/28685 30430/31683/28684
+f 23584/31689/28690 23587/31702/28703 23592/31704/28705 23588/31690/28691
+f 23588/31690/28691 23592/31704/28705 23826/14277/11248 23825/14276/11247
+f 23587/31702/28703 30429/31678/28679 30428/31677/28678 23592/31704/28705
+f 23592/31704/28705 30428/31677/28678 30588/14271/11242 23826/14277/11248
+f 23593/31705/28706 23597/31706/28707 23598/31707/28708 23594/31708/28709
+f 23594/31708/28709 23598/31707/28708 30434/31709/28710 30435/31710/28711
+f 23597/31706/28707 23828/14296/11267 23827/14309/11280 23598/31707/28708
+f 23598/31707/28708 23827/14309/11280 30590/14311/11282 30434/31709/28710
+f 23593/31705/28706 23594/31708/28709 23599/31711/28712 23595/31712/28713
+f 23595/31712/28713 23599/31711/28712 30506/31713/28714 30507/31714/28715
+f 23594/31708/28709 30435/31710/28711 30436/31715/28716 23599/31711/28712
+f 23599/31711/28712 30436/31715/28716 31694/31716/28717 30506/31713/28714
+f 23593/31705/28706 23595/31712/28713 23600/31717/28718 23596/31718/28719
+f 23596/31718/28719 23600/31717/28718 30433/31699/28700 30432/31694/28695
+f 23595/31712/28713 30507/31714/28715 30508/31719/28720 23600/31717/28718
+f 23600/31717/28718 30508/31719/28720 31693/31700/28701 30433/31699/28700
+f 23593/31705/28706 23596/31718/28719 23601/31720/28721 23597/31706/28707
+f 23597/31706/28707 23601/31720/28721 23829/14297/11268 23828/14296/11267
+f 23596/31718/28719 30432/31694/28695 30431/31693/28694 23601/31720/28721
+f 23601/31720/28721 30431/31693/28694 30589/14291/11262 23829/14297/11268
+f 23602/31721/28722 23606/31722/28723 23607/31723/28724 23603/31724/28725
+f 23603/31724/28725 23607/31723/28724 30437/31725/28726 30438/31726/28727
+f 23606/31722/28723 23831/14318/11287 23830/14334/11300 23607/31723/28724
+f 23607/31723/28724 23830/14334/11300 30591/14336/11302 30437/31725/28726
+f 23602/31721/28722 23603/31724/28725 23608/31727/28728 23604/31728/28729
+f 23604/31728/28729 23608/31727/28728 30509/31729/28730 30510/31730/28731
+f 23603/31724/28725 30438/31726/28727 30439/31731/28732 23608/31727/28728
+f 23608/31727/28728 30439/31731/28732 31695/31732/28733 30509/31729/28730
+f 23602/31721/28722 23604/31728/28729 23609/31733/28734 23605/31734/28735
+f 23605/31734/28735 23609/31733/28734 30436/31735/28716 30435/31736/28711
+f 23604/31728/28729 30510/31730/28731 30511/31737/28736 23609/31733/28734
+f 23609/31733/28734 30511/31737/28736 31694/31738/28717 30436/31735/28716
+f 23602/31721/28722 23605/31734/28735 23610/31739/28737 23606/31722/28723
+f 23606/31722/28723 23610/31739/28737 23832/14319/11288 23831/14318/11287
+f 23605/31734/28735 30435/31736/28711 30434/31740/28710 23610/31739/28737
+f 23610/31739/28737 30434/31740/28710 30590/14320/11282 23832/14319/11288
+f 23611/31741/28738 23615/31742/28739 23616/31743/28740 23612/31744/28741
+f 23612/31744/28741 23616/31743/28740 30440/31745/28742 30441/31746/28743
+f 23615/31742/28739 23834/14341/11307 23833/14354/11320 23616/31743/28740
+f 23616/31743/28740 23833/14354/11320 30592/14356/11322 30440/31745/28742
+f 23611/31741/28738 23612/31744/28741 23617/31747/28744 23613/31748/28745
+f 23613/31748/28745 23617/31747/28744 30512/31749/28746 30513/31750/28747
+f 23612/31744/28741 30441/31746/28743 30442/31751/28748 23617/31747/28744
+f 23617/31747/28744 30442/31751/28748 31696/31752/28749 30512/31749/28746
+f 23611/31741/28738 23613/31748/28745 23618/31753/28750 23614/31754/28751
+f 23614/31754/28751 23618/31753/28750 30439/31731/28732 30438/31726/28727
+f 23613/31748/28745 30513/31750/28747 30514/31755/28752 23618/31753/28750
+f 23618/31753/28750 30514/31755/28752 31695/31732/28733 30439/31731/28732
+f 23611/31741/28738 23614/31754/28751 23619/31756/28753 23615/31742/28739
+f 23615/31742/28739 23619/31756/28753 23835/14342/11308 23834/14341/11307
+f 23614/31754/28751 30438/31726/28727 30437/31725/28726 23619/31756/28753
+f 23619/31756/28753 30437/31725/28726 30591/14336/11302 23835/14342/11308
+f 23620/31757/28754 23624/31758/28755 23625/31759/28756 23621/31760/28757
+f 23621/31760/28757 23625/31759/28756 30443/31761/28758 30444/31762/28759
+f 23624/31758/28755 23837/14361/11327 23836/14374/11340 23625/31759/28756
+f 23625/31759/28756 23836/14374/11340 30593/14376/11342 30443/31761/28758
+f 23620/31757/28754 23621/31760/28757 23626/31763/28760 23622/31764/28761
+f 23622/31764/28761 23626/31763/28760 30515/31765/28762 30516/31766/28763
+f 23621/31760/28757 30444/31762/28759 30445/31767/28764 23626/31763/28760
+f 23626/31763/28760 30445/31767/28764 31697/31768/28765 30515/31765/28762
+f 23620/31757/28754 23622/31764/28761 23627/31769/28766 23623/31770/28767
+f 23623/31770/28767 23627/31769/28766 30442/31751/28748 30441/31746/28743
+f 23622/31764/28761 30516/31766/28763 30517/31771/28768 23627/31769/28766
+f 23627/31769/28766 30517/31771/28768 31696/31752/28749 30442/31751/28748
+f 23620/31757/28754 23623/31770/28767 23628/31772/28769 23624/31758/28755
+f 23624/31758/28755 23628/31772/28769 23838/14362/11328 23837/14361/11327
+f 23623/31770/28767 30441/31746/28743 30440/31745/28742 23628/31772/28769
+f 23628/31772/28769 30440/31745/28742 30592/14356/11322 23838/14362/11328
+f 23629/31773/28770 23633/31774/28771 23634/31775/28772 23630/31776/28773
+f 23630/31776/28773 23634/31775/28772 30446/31777/28774 30447/31778/28775
+f 23633/31774/28771 23840/14381/11347 23839/14394/11360 23634/31775/28772
+f 23634/31775/28772 23839/14394/11360 30594/14396/11362 30446/31777/28774
+f 23629/31773/28770 23630/31776/28773 23635/31779/28776 23631/31780/28777
+f 23631/31780/28777 23635/31779/28776 30518/31781/28778 30519/31782/28779
+f 23630/31776/28773 30447/31778/28775 30448/31783/28780 23635/31779/28776
+f 23635/31779/28776 30448/31783/28780 31698/21166/18061 30518/31781/28778
+f 23629/31773/28770 23631/31780/28777 23636/31784/28781 23632/31785/28782
+f 23632/31785/28782 23636/31784/28781 30445/31767/28764 30444/31762/28759
+f 23631/31780/28777 30519/31782/28779 30520/31786/28783 23636/31784/28781
+f 23636/31784/28781 30520/31786/28783 31697/31768/28765 30445/31767/28764
+f 23629/31773/28770 23632/31785/28782 23637/31787/28784 23633/31774/28771
+f 23633/31774/28771 23637/31787/28784 23841/14382/11348 23840/14381/11347
+f 23632/31785/28782 30444/31762/28759 30443/31761/28758 23637/31787/28784
+f 23637/31787/28784 30443/31761/28758 30593/14376/11342 23841/14382/11348
+f 23638/31788/28785 23642/31789/28786 23643/31790/28787 23639/31791/28788
+f 23639/31791/28788 23643/31790/28787 30449/31792/28789 30450/31793/28790
+f 23642/31789/28786 23843/14401/11367 23842/14414/11380 23643/31790/28787
+f 23643/31790/28787 23842/14414/11380 30595/14416/11382 30449/31792/28789
+f 23638/31788/28785 23639/31791/28788 23644/31794/28791 23640/31795/28792
+f 23640/31795/28792 23644/31794/28791 30523/21152/18047 30522/21151/18046
+f 23639/31791/28788 30450/31793/28790 30451/31796/28793 23644/31794/28791
+f 23644/31794/28791 30451/31796/28793 31699/21153/18048 30523/21152/18047
+f 23638/31788/28785 23640/31795/28792 23645/31797/28794 23641/31798/28795
+f 23641/31798/28795 23645/31797/28794 30448/31783/28780 30447/31778/28775
+f 23640/31795/28792 30522/21151/18046 30521/21164/18059 23645/31797/28794
+f 23645/31797/28794 30521/21164/18059 31698/21166/18061 30448/31783/28780
+f 23638/31788/28785 23641/31798/28795 23646/31799/28796 23642/31789/28786
+f 23642/31789/28786 23646/31799/28796 23844/14402/11368 23843/14401/11367
+f 23641/31798/28795 30447/31778/28775 30446/31777/28774 23646/31799/28796
+f 23646/31799/28796 30446/31777/28774 30594/14396/11362 23844/14402/11368
+f 23647/31800/28797 23651/31801/28798 23652/31802/28799 23648/31803/28800
+f 23648/31803/28800 23652/31802/28799 30454/31448/28449 30453/31445/28446
+f 23651/31801/28798 23846/14421/11387 23845/14434/11400 23652/31802/28799
+f 23652/31802/28799 23845/14434/11400 30596/14436/11402 30454/31448/28449
+f 23647/31800/28797 23648/31803/28800 23653/31804/28801 23649/31805/28802
+f 23649/31805/28802 23653/31804/28801 30526/21158/18053 30525/21150/18045
+f 23648/31803/28800 30453/31445/28446 30452/31444/28445 23653/31804/28801
+f 23653/31804/28801 30452/31444/28445 31700/21159/18054 30526/21158/18053
+f 23647/31800/28797 23649/31805/28802 23654/31806/28803 23650/31807/28804
+f 23650/31807/28804 23654/31806/28803 30451/31796/28793 30450/31793/28790
+f 23649/31805/28802 30525/21150/18045 30524/21149/18044 23654/31806/28803
+f 23654/31806/28803 30524/21149/18044 31699/21153/18048 30451/31796/28793
+f 23647/31800/28797 23650/31807/28804 23655/31808/28805 23651/31801/28798
+f 23651/31801/28798 23655/31808/28805 23847/14422/11388 23846/14421/11387
+f 23650/31807/28804 30450/31793/28790 30449/31792/28789 23655/31808/28805
+f 23655/31808/28805 30449/31792/28789 30595/14416/11382 23847/14422/11388
+f 23659/31809/28806 30507/31714/28715 30506/31713/28714 23660/31810/28807
+f 23660/31810/28807 30506/31713/28714 31694/31716/28717 30556/31811/28808
+f 23659/31809/28806 23661/31812/28809 30508/31719/28720 30507/31714/28715
+f 23661/31812/28809 30560/31813/28810 31693/31700/28701 30508/31719/28720
+f 23665/31814/28811 30504/31698/28699 30503/31697/28698 23666/31815/28812
+f 23666/31815/28812 30503/31697/28698 31693/31700/28701 30560/31813/28810
+f 23665/31814/28811 23667/31816/28813 30505/31703/28704 30504/31698/28699
+f 23667/31816/28813 30563/31817/28814 31692/31684/28685 30505/31703/28704
+f 23671/31818/28815 30501/31682/28683 30500/31681/28682 23672/31819/28816
+f 23672/31819/28816 30500/31681/28682 31692/31684/28685 30563/31817/28814
+f 23671/31818/28815 23673/31820/28817 30502/31687/28688 30501/31682/28683
+f 23673/31820/28817 30566/31821/28818 31691/31668/28669 30502/31687/28688
+f 23677/31822/28819 30498/31666/28667 30497/31665/28666 23678/31823/28820
+f 23678/31823/28820 30497/31665/28666 31691/31668/28669 30566/31821/28818
+f 23677/31822/28819 23679/31824/28821 30499/31671/28672 30498/31666/28667
+f 23679/31824/28821 30568/31825/28822 31690/31652/28653 30499/31671/28672
+f 23680/31826/28823 23684/31827/28824 23685/31828/28825 23681/31829/28826
+f 23684/31827/28824 30495/31650/28651 30494/31649/28650 23685/31828/28825
+f 23685/31828/28825 30494/31649/28650 31690/31652/28653 30568/31825/28822
+f 23680/31826/28823 23681/31829/28826 23686/31830/28827 23682/31831/28828
+f 23682/31831/28828 23686/31830/28827 30570/31832/28829 30571/31833/28830
+f 23680/31826/28823 23682/31831/28828 23687/31834/28831 23683/31835/28832
+f 23683/31835/28832 23687/31834/28831 30493/31639/28640 30492/31634/28635
+f 23682/31831/28828 30571/31833/28830 30572/31836/28833 23687/31834/28831
+f 23687/31834/28831 30572/31836/28833 31688/31620/28621 30493/31639/28640
+f 23680/31826/28823 23683/31835/28832 23688/31837/28834 23684/31827/28824
+f 23684/31827/28824 23688/31837/28834 30496/31655/28656 30495/31650/28651
+f 23683/31835/28832 30492/31634/28635 30491/31633/28634 23688/31837/28834
+f 23688/31837/28834 30491/31633/28634 31689/31636/28637 30496/31655/28656
+f 23692/31838/28835 30510/31839/28731 30509/31840/28730 23693/31841/28836
+f 23693/31841/28836 30509/31840/28730 31695/31842/28733 30553/31843/28837
+f 23692/31838/28835 23694/31844/28838 30511/31845/28736 30510/31839/28731
+f 23694/31844/28838 30556/31811/28808 31694/31716/28717 30511/31845/28736
+f 23698/31846/28839 30513/31750/28747 30512/31749/28746 23699/31847/28840
+f 23699/31847/28840 30512/31749/28746 31696/31752/28749 30550/31848/28841
+f 23698/31846/28839 23700/31849/28842 30514/31755/28752 30513/31750/28747
+f 23700/31849/28842 30553/31850/28837 31695/31732/28733 30514/31755/28752
+f 23704/31851/28843 30516/31766/28763 30515/31765/28762 23705/31852/28844
+f 23705/31852/28844 30515/31765/28762 31697/31768/28765 30547/31853/28845
+f 23704/31851/28843 23706/31854/28846 30517/31771/28768 30516/31766/28763
+f 23706/31854/28846 30550/31848/28841 31696/31752/28749 30517/31771/28768
+f 23710/31855/28847 30519/31782/28779 30518/31781/28778 23711/31856/28848
+f 23711/31856/28848 30518/31781/28778 31698/21166/18061 30543/21165/18060
+f 23710/31855/28847 23712/31857/28849 30520/31786/28783 30519/31782/28779
+f 23712/31857/28849 30547/31853/28845 31697/31768/28765 30520/31786/28783
+f 23713/31858/28850 23717/31859/28851 23718/31860/28852 23714/31861/28853
+f 23714/31861/28853 23718/31860/28852 30546/21162/18057 30545/21157/18052
+f 23713/31858/28850 23714/31861/28853 23719/31862/28854 23715/31863/28855
+f 23715/31863/28855 23719/31862/28854 30457/31446/28447 30456/31439/28440
+f 23714/31861/28853 30545/21157/18052 30544/21156/18051 23719/31862/28854
+f 23719/31862/28854 30544/21156/18051 31700/21159/18054 30457/31446/28447
+f 23713/31858/28850 23715/31863/28855 23720/31864/28856 23716/31865/28857
+f 23716/31865/28857 23720/31864/28856 30460/31463/28464 30459/31458/28459
+f 23715/31863/28855 30456/31439/28440 30455/31438/28439 23720/31864/28856
+f 23720/31864/28856 30455/31438/28439 31677/31441/28442 30460/31463/28464
+f 23713/31858/28850 23716/31865/28857 23721/31866/28858 23717/31859/28851
+f 23716/31865/28857 30459/31458/28459 30458/31457/28458 23721/31866/28858
+f 23721/31866/28858 30458/31457/28458 31678/31460/28461 30542/31867/28859
+f 23724/31868/28860 23726/31869/28861 30463/31479/28480 30462/31474/28475
+f 23726/31869/28861 30542/31867/28859 31678/31460/28461 30463/31479/28480
+f 23724/31868/28860 30462/31474/28475 30461/31473/28474 23727/31870/28862
+f 23727/31870/28862 30461/31473/28474 31679/31476/28477 30540/31871/28863
+f 23730/31872/28864 23732/31873/28865 30466/31495/28496 30465/31490/28491
+f 23732/31873/28865 30540/31871/28863 31679/31476/28477 30466/31495/28496
+f 23730/31872/28864 30465/31490/28491 30464/31489/28490 23733/31874/28866
+f 23733/31874/28866 30464/31489/28490 31680/31492/28493 30538/31875/28867
+f 23736/31876/28868 23738/31877/28869 30469/31511/28512 30468/31506/28507
+f 23738/31877/28869 30538/31875/28867 31680/31492/28493 30469/31511/28512
+f 23736/31876/28868 30468/31506/28507 30467/31505/28506 23739/31878/28870
+f 23739/31878/28870 30467/31505/28506 31681/31508/28509 30536/31879/28871
+f 23742/31880/28872 23744/31881/28873 30472/31527/28528 30471/31522/28523
+f 23744/31881/28873 30536/31879/28871 31681/31508/28509 30472/31527/28528
+f 23742/31880/28872 30471/31522/28523 30470/31521/28522 23745/31882/28874
+f 23745/31882/28874 30470/31521/28522 31682/31524/28525 30527/31883/28875
+f 23748/31884/28876 23750/31885/28877 30475/31543/28544 30474/31538/28539
+f 23750/31885/28877 30527/31883/28875 31682/31524/28525 30475/31543/28544
+f 23748/31884/28876 30474/31538/28539 30473/31537/28538 23751/31886/28878
+f 23751/31886/28878 30473/31537/28538 31683/31540/28541 30529/31887/28879
+f 23754/31888/28880 23756/31889/28881 30478/31559/28560 30477/31554/28555
+f 23756/31889/28881 30529/31887/28879 31683/31540/28541 30478/31559/28560
+f 23754/31888/28880 30477/31554/28555 30476/31553/28554 23757/31890/28882
+f 23757/31890/28882 30476/31553/28554 31684/31556/28557 30531/31891/28883
+f 23760/31892/28884 23762/31893/28885 30481/31575/28576 30480/31570/28571
+f 23762/31893/28885 30531/31891/28883 31684/31556/28557 30481/31575/28576
+f 23760/31892/28884 30480/31570/28571 30479/31569/28570 23763/31894/28886
+f 23763/31894/28886 30479/31569/28570 31685/31572/28573 30533/31895/28887
+f 23766/31896/28888 23768/31897/28889 30484/31591/28592 30483/31586/28587
+f 23768/31897/28889 30533/31895/28887 31685/31572/28573 30484/31591/28592
+f 23766/31896/28888 30483/31586/28587 30482/31585/28586 23769/31898/28890
+f 23769/31898/28890 30482/31585/28586 31686/31588/28589 30535/31899/28891
+f 23770/31900/28892 23774/31901/28893 23775/31902/28894 23771/31903/28895
+f 23771/31903/28895 23775/31902/28894 30572/31836/28833 30571/31833/28830
+f 23774/31901/28893 30489/31618/28619 30488/31617/28618 23775/31902/28894
+f 23775/31902/28894 30488/31617/28618 31688/31620/28621 30572/31836/28833
+f 23770/31900/28892 23771/31903/28895 23776/31904/28896 23772/31905/28897
+f 23771/31903/28895 30571/31833/28830 30570/31832/28829 23776/31904/28896
+f 23770/31900/28892 23772/31905/28897 23777/31906/28898 23773/31907/28899
+f 23773/31907/28899 23777/31906/28898 30487/31607/28608 30486/31602/28603
+f 23777/31906/28898 30535/31899/28891 31686/31588/28589 30487/31607/28608
+f 23770/31900/28892 23773/31907/28899 23778/31908/28900 23774/31901/28893
+f 23774/31901/28893 23778/31908/28900 30490/31623/28624 30489/31618/28619
+f 23773/31907/28899 30486/31602/28603 30485/31601/28602 23778/31908/28900
+f 23778/31908/28900 30485/31601/28602 31687/31604/28605 30490/31623/28624
+f 1514/3041/2627 8627/3043/2629 1519/3044/2630
+f 1847/31909/3282 8889/3701/3287 1852/3697/3283
+f 2136/4129/3684 2140/4128/3683 1519/31910/2630 8627/4133/2629
+f 2140/4128/3683 8898/4130/3685 9016/31911/2632 1519/31910/2630
+f 2143/4136/3689 2144/4139/3692 8889/31912/3287 2145/4142/3695
+f 2145/4142/3695 8889/31913/3287 1847/31914/3282
+f 2144/4139/3692 9092/4141/3694 9093/31915/3707 8889/31912/3287
+f 8889/31912/3287 9093/31915/3707 12903/31916/3288
+f 2145/4142/3695 1847/31914/3282 1851/31917/3281 2149/4143/3696
+f 2149/4143/3696 1851/31917/3281 9016/31911/2632 8898/4130/3685
+f 4680/8866/7694 4683/8877/7705 10786/31918/8805 4684/8867/7695
+f 4684/8867/7695 10786/31919/8805 10787/8870/7698
+f 4683/8877/7705 11190/8879/7707 13309/31920/8806 10786/31918/8805
+f 5040/9561/8389 5044/9560/8388 13309/31920/8806 11190/8879/7707
+f 5043/9559/8387 5348/31921/8816 5352/31922/8815 5044/9560/8388
+f 5044/9560/8388 5352/31922/8815 13309/31920/8806
+f 5043/9559/8387 5047/9572/8400 11059/9575/8403 5348/31921/8816
+f 5352/10020/8815 11066/10009/8804 13309/10011/8806
+f 5345/10012/8807 5348/10021/8816 11059/31923/8403 5349/10013/8808
+f 5349/10013/8808 11059/31923/8403 11263/31924/8829 11264/10016/8811
+f 11059/31925/8403 13271/31926/8402 11263/31924/8829
+f 17452/31927/18056 30543/21165/18060 17457/21163/18058
+f 21562/28646/25423 21565/28636/25413 21566/28639/25416 30345/31928/28901
+f 30345/31928/28901 21566/28639/25416 30344/28641/25418
+f 21562/28646/25423 30345/31928/28901 21567/28643/25420 21563/28642/25419
+f 30345/31929/28901 23363/31930/28902 21567/28643/25420
+f 21567/28643/25420 23363/31930/28902 30379/28644/28903 30380/28644/25421
+f 23298/31301/28305 23299/31304/28308 23303/31931/28904
+f 23299/31304/28308 30334/31306/28310 23312/31932/28905 23303/31933/28904
+f 23303/31933/28904 23312/31932/28905 30359/31934/28903 30362/31935/28903
+f 23298/31301/28305 23303/31931/28904 23304/31936/28906 23300/31307/28311
+f 23300/31307/28311 23304/31937/28906 30331/31309/28313
+f 23303/31931/28904 30362/31938/28903 30363/31939/28903 23304/31936/28906
+f 23307/31314/28318 23310/31313/28317 30335/31315/28319 23315/31940/28907
+f 23306/31311/28315 23307/31314/28318 23311/31941/28908
+f 23307/31314/28318 23315/31940/28907 23319/31942/28909 23311/31943/28908
+f 23311/31943/28908 23319/31942/28909 30355/31944/28903 30358/31944/28903
+f 23306/31311/28315 23311/31941/28908 23312/31945/28905 23308/31316/28320
+f 23308/31316/28320 23312/31932/28905 30334/31306/28310
+f 23311/31941/28908 30358/31946/28903 30359/31947/28903 23312/31945/28905
+f 23314/31948/28910 23316/31318/28322 23317/31319/28323
+f 23314/31949/28910 23317/31319/28323 30336/31320/28324 23322/31950/28911
+f 23314/31949/28910 23322/31950/28911 23326/31951/28912 23318/31952/28913
+f 23318/31952/28913 23326/31951/28912 30352/31953/28903 30354/31954/28903
+f 23314/31948/28910 23318/31955/28913 23319/31956/28909 23315/31957/28907
+f 23318/31955/28913 30354/31954/28903 30355/31954/28903 23319/31956/28909
+f 23314/31948/28910 23315/31957/28907 23320/31321/28325 23316/31318/28322
+f 23315/31940/28907 30335/31315/28319 23320/31321/28325
+f 23321/31958/28914 23323/31322/28326 23324/31323/28327
+f 23321/31959/28914 23324/31323/28327 30337/31324/28328 23330/31960/28337
+f 23321/31959/28914 23330/31960/28337 23334/31961/28336 23325/31962/28915
+f 23325/31962/28915 23334/31961/28336 30349/31334/28338 30351/31963/28903
+f 23321/31958/28914 23325/31964/28915 23326/31965/28912 23322/31966/28911
+f 23325/31964/28915 30351/31963/28903 30352/31953/28903 23326/31965/28912
+f 23321/31958/28914 23322/31966/28911 23327/31325/28329 23323/31322/28326
+f 23322/31950/28911 30336/31320/28324 23327/31325/28329
+f 23330/31960/28337 30337/31324/28328 23335/31335/28339
+f 23337/31338/28342 23338/31341/28345 23342/31967/28916
+f 23338/31341/28345 30331/31309/28313 23304/31937/28906 23342/31968/28916
+f 23342/31968/28916 23304/31937/28906 30363/31969/28903 30366/31970/28903
+f 23337/31338/28342 23342/31967/28916 23343/31971/28917 23339/31342/28346
+f 23339/31342/28346 23343/31972/28917 30338/31344/28348
+f 23342/31967/28916 30366/31973/28903 30367/31974/28903 23343/31971/28917
+f 23345/31346/28350 23346/31349/28353 23350/31975/28918
+f 23346/31349/28353 30338/31344/28348 23343/31972/28917 23350/31976/28918
+f 23350/31976/28918 23343/31972/28917 30367/31977/28903 30370/31978/28903
+f 23345/31346/28350 23350/31975/28918 23351/31979/28919 23347/31350/28354
+f 23347/31350/28354 23351/31980/28919 30340/31352/28356
+f 23350/31975/28918 30370/31981/28903 30371/31981/28903 23351/31979/28919
+f 23353/31982/28920 23354/31354/28358 23355/31355/28359 30340/31983/28356
+f 30340/31983/28356 23355/31355/28359 30341/31353/28357
+f 23353/31982/28920 30340/31983/28356 23356/31984/28921
+f 30340/31352/28356 23351/31980/28919 23356/31985/28921
+f 23356/31985/28921 23351/31980/28919 30371/31986/28903 30374/31987/28903
+f 23353/31982/28920 23356/31984/28921 23357/31988/28922
+f 23353/31989/28920 23357/31990/28922 30342/31991/28923
+f 23356/31984/28921 30374/31987/28903 30375/31992/28903 23357/31988/28922
+f 23353/31989/28920 23358/31356/28360 23354/31354/28358
+f 23353/31989/28920 30342/31991/28923 30343/31357/28361 23358/31356/28360
+f 23359/31993/28924 23360/31358/28362 23361/31359/28363 30342/31994/28923
+f 30342/31994/28923 23361/31359/28363 30343/31357/28361
+f 23359/31993/28924 30342/31994/28923 23362/31995/28925
+f 30342/31991/28923 23357/31990/28922 23362/31996/28925
+f 23362/31996/28925 23357/31990/28922 30375/31992/28903 30378/31997/28903
+f 23359/31993/28924 23362/31995/28925 23363/31998/28902
+f 23359/31999/28924 23363/31930/28902 30345/31929/28901
+f 23362/31995/28925 30378/31997/28903 30379/31997/28903 23363/31998/28902
+f 23359/31999/28924 23364/31360/28364 23360/31358/28362
+f 23359/31999/28924 30345/31929/28901 30344/28641/25418 23364/31360/28364
+f 23367/31366/28370 23371/31365/28369 30346/31367/28371
+f 23374/32000/28926 23376/32001/28927 23377/32002/28928 23378/32003/28929
+f 23378/32003/28929 23377/32002/28928 30352/31953/28903 30351/31963/28903
+f 23374/32004/28926 23378/32005/28929 23372/32006/28372 23367/32007/28370
+f 23378/32005/28929 30351/31963/28903 30349/31334/28338 23372/32006/28372
+f 23374/32004/28926 23379/31372/28376 23375/31371/28375
+f 23374/32004/28926 23367/32007/28370 30346/31367/28371 23379/31372/28376
+f 23374/32000/28926 23375/31371/28375 23380/31373/28377 23376/32001/28927
+f 23376/32001/28927 23380/31373/28377 30350/31374/28378
+f 23381/32008/28930 23383/32009/28931 23384/32010/28932 23385/32011/28933
+f 23385/32011/28933 23384/32010/28932 30355/31954/28903 30354/31954/28903
+f 23381/32012/28930 23385/32013/28933 23377/32014/28928 23376/32015/28927
+f 23385/32013/28933 30354/31954/28903 30352/31953/28903 23377/32014/28928
+f 23381/32012/28930 23386/31376/28380 23382/31375/28379
+f 23381/32012/28930 23376/32015/28927 30350/31374/28378 23386/31376/28380
+f 23381/32008/28930 23382/31375/28379 23387/31377/28381 23383/32009/28931
+f 23383/32009/28931 23387/31377/28381 30353/31378/28382
+f 23388/31379/28383 23391/31384/28388 23392/32016/28934 23393/32017/28935
+f 23393/32017/28935 23392/32016/28934 30359/31947/28903 30358/31946/28903
+f 23391/31384/28388 30357/31386/28390 23392/32016/28934
+f 23388/31379/28383 23393/32018/28935 23389/31380/28384
+f 23389/31380/28384 23393/32018/28935 23384/32019/28932 23383/32020/28931
+f 23393/32018/28935 30358/31944/28903 30355/31944/28903 23384/32019/28932
+f 23389/31380/28384 23383/32020/28931 30353/31378/28382 23394/31381/28385
+f 23396/31387/28391 23399/31394/28396 23400/32021/28936 23401/32022/28937
+f 23401/32022/28937 23400/32021/28936 30363/31939/28903 30362/31938/28903
+f 23399/31394/28396 30361/31396/28398 23400/32021/28936
+f 23396/31387/28391 23401/32023/28937 23397/31388/28392
+f 23397/31388/28392 23401/32023/28937 23392/32024/28934 30357/31386/28390
+f 23401/32023/28937 30362/31935/28903 30359/31934/28903 23392/32024/28934
+f 23404/31398/28399 23407/31403/28404 23408/32025/28938 23409/32026/28939
+f 23409/32026/28939 23408/32025/28938 30367/31974/28903 30366/31973/28903
+f 23407/31403/28404 30365/31405/28406 23408/32025/28938
+f 23404/31398/28399 23409/32027/28939 23405/31399/28400
+f 23405/31399/28400 23409/32027/28939 23400/32028/28936 30361/31396/28398
+f 23409/32027/28939 30366/31970/28903 30363/31969/28903 23400/32028/28936
+f 23412/31406/28407 23415/31411/28412 23416/32029/28940 23417/32030/28941
+f 23417/32030/28941 23416/32029/28940 30371/31981/28903 30370/31981/28903
+f 23415/31411/28412 30369/31413/28414 23416/32029/28940
+f 23412/31406/28407 23417/32031/28941 23413/31407/28408
+f 23413/31407/28408 23417/32031/28941 23408/32032/28938 30365/31405/28406
+f 23417/32031/28941 30370/31978/28903 30367/31977/28903 23408/32032/28938
+f 23420/32033/28942 23422/32034/28943 23423/32035/28944
+f 23423/32035/28944 23422/32034/28943 30375/31992/28903 30374/31987/28903
+f 23420/32033/28942 30373/32036/28945 23422/32034/28943
+f 23420/31399/28942 23423/32037/28944 30369/32038/28414
+f 30369/32038/28414 23423/32037/28944 23416/32039/28940
+f 23423/32037/28944 30374/31987/28903 30371/31986/28903 23416/32039/28940
+f 23420/31399/28942 30369/32038/28414 23424/31415/28416 23421/31414/28415
+f 30369/31413/28414 30368/31412/28413 23424/31415/28416
+f 23420/31399/28942 23421/31414/28415 23425/31416/28417
+f 23420/32033/28942 23425/31416/28417 30372/31417/28418 30373/32036/28945
+f 23426/32040/28946 23428/32041/28947 23429/32042/28948
+f 23429/32042/28948 23428/32041/28947 30379/31997/28903 30378/31997/28903
+f 23426/32040/28946 30377/32043/28949 23428/32041/28947
+f 23426/32044/28946 23429/32045/28948 30373/32046/28945
+f 30373/32046/28945 23429/32045/28948 23422/32047/28943
+f 23429/32045/28948 30378/31997/28903 30375/31992/28903 23422/32047/28943
+f 23426/32044/28946 30373/32046/28945 23430/31419/28420 23427/31418/28419
+f 30373/32036/28945 30372/31417/28418 23430/31419/28420
+f 23426/32044/28946 23427/31418/28419 23431/31420/28421
+f 23426/32040/28946 23431/31420/28421 30376/31421/28422 30377/32043/28949
+f 23432/31422/28423 23433/31425/28426 23437/31426/28427 30377/32048/28949
+f 30377/32048/28949 23437/31426/28427 23428/32049/28947
+f 23437/31426/28427 30380/28644/25421 30379/28644/28903 23428/32049/28947
+f 23432/31422/28423 30377/32048/28949 23438/31428/28429 23434/31427/28428
+f 30377/32043/28949 30376/31421/28422 23438/31428/28429
+f 23656/32050/28950 23659/31809/28806 23660/31810/28807
+f 23656/32051/28950 23660/31810/28807 30556/31811/28808 23691/32052/28951
+f 23656/32051/28950 30557/32053/28952 23657/32054/28953
+f 23657/32054/28953 30557/32053/28952 31704/32055/28954 30561/32056/28954
+f 23656/32051/28950 23691/32052/28951 30557/32053/28952
+f 23656/32050/28950 23657/32057/28953 23658/32058/28955
+f 23658/32058/28955 23657/32057/28953 30559/32059/28956
+f 23657/32057/28953 30561/32060/28954 31705/32061/28954 30559/32059/28956
+f 23656/32050/28950 23658/32058/28955 23661/31812/28809 23659/31809/28806
+f 23658/32062/28955 30560/31813/28810 23661/31812/28809
+f 23662/32063/28957 23665/31814/28811 23666/31815/28812
+f 23662/32064/28957 23666/31815/28812 30560/31813/28810 23658/32062/28955
+f 23662/32064/28957 30559/32065/28956 23663/32066/28958
+f 23663/32066/28958 30559/32065/28956 31705/32067/28954 30564/32068/28954
+f 23662/32064/28957 23658/32062/28955 30559/32065/28956
+f 23662/32063/28957 23663/32069/28958 23664/32070/28959
+f 23664/32070/28959 23663/32069/28958 30562/32071/28960
+f 23663/32069/28958 30564/32068/28954 31706/32072/28954 30562/32071/28960
+f 23662/32063/28957 23664/32070/28959 23667/31816/28813 23665/31814/28811
+f 23664/32073/28959 30563/31817/28814 23667/31816/28813
+f 23668/32074/28961 23671/31818/28815 23672/31819/28816
+f 23668/32075/28961 23672/31819/28816 30563/31817/28814 23664/32073/28959
+f 23668/32075/28961 30562/32076/28960 23669/32077/28962
+f 23669/32077/28962 30562/32076/28960 31706/32072/28954 30567/32078/28954
+f 23668/32075/28961 23664/32073/28959 30562/32076/28960
+f 23668/32074/28961 23669/32079/28962 23670/32080/28963
+f 23670/32080/28963 23669/32079/28962 30565/32081/28964
+f 23669/32079/28962 30567/32082/28954 31707/32082/28954 30565/32081/28964
+f 23668/32074/28961 23670/32080/28963 23673/31820/28817 23671/31818/28815
+f 23670/32083/28963 30566/31821/28818 23673/31820/28817
+f 23674/32084/28965 23677/31822/28819 23678/31823/28820
+f 23674/32085/28965 23678/31823/28820 30566/31821/28818 23670/32083/28963
+f 23674/32085/28965 30565/32086/28964 23675/32087/28966
+f 23675/32087/28966 30565/32086/28964 31707/32088/28954 30569/32088/28954
+f 23674/32085/28965 23670/32083/28963 30565/32086/28964
+f 23674/32084/28965 23675/32089/28966 23676/32090/28967
+f 23674/32084/28965 23676/32090/28967 23679/31824/28821 23677/31822/28819
+f 23676/32091/28967 30568/31825/28822 23679/31824/28821
+f 23681/31829/28826 23685/31828/28825 30568/31825/28822 23676/32091/28967
+f 23681/31829/28826 23676/32091/28967 23675/32092/28966 23686/31830/28827
+f 23686/31830/28827 23675/32092/28966 30569/31832/28954 30570/31832/28829
+f 23689/32093/28968 23692/31838/28835 23693/31841/28836
+f 23689/32094/28968 23693/31841/28836 30553/31843/28837 23697/32095/28969
+f 23689/32094/28968 30554/32096/28970 23690/32097/28971
+f 23690/32097/28971 30554/32096/28970 31703/32098/28954 30558/32099/28954
+f 23689/32094/28968 23697/32095/28969 30554/32096/28970
+f 23689/32093/28968 23690/32100/28971 23691/32101/28951
+f 23691/32101/28951 23690/32100/28971 30557/32102/28952
+f 23690/32100/28971 30558/32103/28954 31704/32104/28954 30557/32102/28952
+f 23689/32093/28968 23691/32101/28951 23694/31844/28838 23692/31838/28835
+f 23691/32052/28951 30556/31811/28808 23694/31844/28838
+f 23695/32105/28972 23698/31846/28839 23699/31847/28840
+f 23695/32106/28972 23699/31847/28840 30550/31848/28841 23703/32107/28973
+f 23695/32106/28972 30551/32108/28974 23696/32109/28975
+f 23696/32109/28975 30551/32108/28974 31702/32110/28954 30555/32111/28954
+f 23695/32106/28972 23703/32107/28973 30551/32108/28974
+f 23695/32105/28972 23696/32112/28975 23697/32113/28969
+f 23697/32113/28969 23696/32112/28975 30554/32114/28970
+f 23696/32112/28975 30555/32115/28954 31703/32116/28954 30554/32114/28970
+f 23695/32105/28972 23697/32113/28969 23700/31849/28842 23698/31846/28839
+f 23697/32117/28969 30553/31850/28837 23700/31849/28842
+f 23701/32118/28976 23704/31851/28843 23705/31852/28844
+f 23701/32119/28976 23705/31852/28844 30547/31853/28845 23709/32120/28977
+f 23701/32119/28976 30548/32121/28978 23702/32122/28979
+f 23702/32122/28979 30548/32121/28978 31701/32123/28954 30552/32123/28954
+f 23701/32119/28976 23709/32120/28977 30548/32121/28978
+f 23701/32118/28976 23702/32124/28979 23703/32125/28973
+f 23703/32125/28973 23702/32124/28979 30551/32126/28974
+f 23702/32124/28979 30552/32127/28954 31702/32127/28954 30551/32126/28974
+f 23701/32118/28976 23703/32125/28973 23706/31854/28846 23704/31851/28843
+f 23703/32107/28973 30550/31848/28841 23706/31854/28846
+f 23707/32128/28980 23710/31855/28847 23711/31856/28848
+f 23707/32129/28980 23711/31856/28848 30543/21165/18060 17452/31927/18056
+f 23707/32129/28980 17456/32130/18055 23708/32131/28981
+f 23708/32131/28981 17456/32130/18055 30546/32132/18057 30549/32132/28954
+f 23707/32129/28980 17452/31927/18056 17456/32130/18055
+f 23707/32128/28980 23708/32133/28981 23709/32134/28977
+f 23709/32134/28977 23708/32133/28981 30548/32135/28978
+f 23708/32133/28981 30549/32136/28954 31701/32136/28954 30548/32135/28978
+f 23707/32128/28980 23709/32134/28977 23712/31857/28849 23710/31855/28847
+f 23709/32120/28977 30547/31853/28845 23712/31857/28849
+f 23717/31859/28851 23721/31866/28858 30542/31867/28859
+f 23723/32137/28982 23725/32138/28983 23722/32139/28984
+f 23725/32140/28983 30541/32141/28985 23722/32142/28984
+f 23722/32142/28984 30541/32141/28985 31701/32136/28954 30549/32136/28954
+f 23723/32137/28982 23722/32139/28984 23718/32143/28852
+f 23723/32144/28982 23718/32145/28852 23717/32146/28851
+f 23722/32139/28984 30549/32132/28954 30546/32132/18057 23718/32143/28852
+f 23723/32144/28982 23726/31869/28861 23724/31868/28860
+f 23723/32144/28982 23717/32146/28851 30542/31867/28859 23726/31869/28861
+f 23723/32137/28982 23724/31868/28860 23727/31870/28862 23725/32138/28983
+f 23725/32138/28983 23727/31870/28862 30540/31871/28863
+f 23729/32147/28986 23731/32148/28987 23728/32149/28988
+f 23731/32150/28987 30539/32151/28989 23728/32152/28988
+f 23728/32152/28988 30539/32151/28989 31702/32127/28954 30552/32127/28954
+f 23729/32147/28986 23728/32149/28988 30541/32153/28985
+f 23729/32154/28986 30541/32141/28985 23725/32140/28983
+f 23728/32149/28988 30552/32123/28954 31701/32123/28954 30541/32153/28985
+f 23729/32154/28986 23732/31873/28865 23730/31872/28864
+f 23729/32154/28986 23725/32140/28983 30540/31871/28863 23732/31873/28865
+f 23729/32147/28986 23730/31872/28864 23733/31874/28866 23731/32148/28987
+f 23731/32148/28987 23733/31874/28866 30538/31875/28867
+f 23735/32155/28990 23737/32156/28991 23734/32157/28992
+f 23737/32158/28991 30537/32159/28993 23734/32160/28992
+f 23734/32160/28992 30537/32159/28993 31703/32116/28954 30555/32115/28954
+f 23735/32155/28990 23734/32157/28992 30539/32161/28989
+f 23735/32162/28990 30539/32151/28989 23731/32150/28987
+f 23734/32157/28992 30555/32111/28954 31702/32110/28954 30539/32161/28989
+f 23735/32162/28990 23738/31877/28869 23736/31876/28868
+f 23735/32162/28990 23731/32150/28987 30538/31875/28867 23738/31877/28869
+f 23735/32155/28990 23736/31876/28868 23739/31878/28870 23737/32156/28991
+f 23737/32156/28991 23739/31878/28870 30536/31879/28871
+f 23741/32163/28994 23743/32164/28995 23740/32165/28996
+f 23743/32166/28995 30528/32167/28997 23740/32168/28996
+f 23740/32168/28996 30528/32167/28997 31704/32104/28954 30558/32169/28954
+f 23741/32163/28994 23740/32165/28996 30537/32170/28993
+f 23741/32171/28994 30537/32159/28993 23737/32158/28991
+f 23740/32165/28996 30558/32172/28954 31703/32173/28954 30537/32170/28993
+f 23741/32171/28994 23744/31881/28873 23742/31880/28872
+f 23741/32171/28994 23737/32158/28991 30536/31879/28871 23744/31881/28873
+f 23741/32163/28994 23742/31880/28872 23745/31882/28874 23743/32164/28995
+f 23743/32164/28995 23745/31882/28874 30527/31883/28875
+f 23747/32174/28998 23749/32175/28999 23746/32176/29000
+f 23749/32177/28999 30530/32178/29001 23746/32179/29000
+f 23746/32179/29000 30530/32178/29001 31705/32061/28954 30561/32060/28954
+f 23747/32174/28998 23746/32176/29000 30528/32180/28997
+f 23747/32181/28998 30528/32167/28997 23743/32166/28995
+f 23746/32176/29000 30561/32056/28954 31704/32055/28954 30528/32180/28997
+f 23747/32181/28998 23750/31885/28877 23748/31884/28876
+f 23747/32181/28998 23743/32166/28995 30527/31883/28875 23750/31885/28877
+f 23747/32174/28998 23748/31884/28876 23751/31886/28878 23749/32175/28999
+f 23749/32175/28999 23751/31886/28878 30529/31887/28879
+f 23753/32182/29002 23755/32183/29003 23752/32184/29004
+f 23755/32185/29003 30532/32186/29005 23752/32187/29004
+f 23752/32187/29004 30532/32186/29005 31706/32072/28954 30564/32068/28954
+f 23753/32182/29002 23752/32184/29004 30530/32188/29001
+f 23753/32189/29002 30530/32178/29001 23749/32177/28999
+f 23752/32184/29004 30564/32068/28954 31705/32067/28954 30530/32188/29001
+f 23753/32189/29002 23756/31889/28881 23754/31888/28880
+f 23753/32189/29002 23749/32177/28999 30529/31887/28879 23756/31889/28881
+f 23753/32182/29002 23754/31888/28880 23757/31890/28882 23755/32183/29003
+f 23755/32183/29003 23757/31890/28882 30531/31891/28883
+f 23759/32190/29006 23761/32191/29007 23758/32192/29008
+f 23761/32193/29007 30534/32194/29009 23758/32195/29008
+f 23758/32195/29008 30534/32194/29009 31707/32082/28954 30567/32082/28954
+f 23759/32190/29006 23758/32192/29008 30532/32196/29005
+f 23759/32197/29006 30532/32186/29005 23755/32185/29003
+f 23758/32192/29008 30567/32078/28954 31706/32072/28954 30532/32196/29005
+f 23759/32197/29006 23762/31893/28885 23760/31892/28884
+f 23759/32197/29006 23755/32185/29003 30531/31891/28883 23762/31893/28885
+f 23759/32190/29006 23760/31892/28884 23763/31894/28886 23761/32191/29007
+f 23761/32191/29007 23763/31894/28886 30533/31895/28887
+f 23765/32198/29010 23767/32199/29011 23764/32200/29012
+f 23765/32198/29010 23764/32200/29012 30534/32201/29009
+f 23765/32202/29010 30534/32194/29009 23761/32193/29007
+f 23764/32200/29012 30569/32088/28954 31707/32088/28954 30534/32201/29009
+f 23765/32202/29010 23768/31897/28889 23766/31896/28888
+f 23765/32202/29010 23761/32193/29007 30533/31895/28887 23768/31897/28889
+f 23765/32198/29010 23766/31896/28888 23769/31898/28890 23767/32199/29011
+f 23767/32199/29011 23769/31898/28890 30535/31899/28891
+f 23772/31905/28897 23776/31904/28896 23764/32203/29012 23767/32204/29011
+f 23776/31904/28896 30570/31832/28829 30569/31832/28954 23764/32203/29012
+f 23772/31905/28897 23767/32204/29011 30535/31899/28891 23777/31906/28898
+usemtl InnerMat
+f 31708/32205/29013 31712/32206/29014 31713/32207/29015 31709/32208/29016
+f 31709/32208/29016 31713/32207/29015 36796/32209/29017 36797/32210/29018
+f 31712/32206/29014 38453/32211/29019 38454/32212/29020 31713/32207/29015
+f 31713/32207/29015 38454/32212/29020 40180/32213/29021 36796/32209/29017
+f 31708/32205/29013 31709/32208/29016 31714/32214/29022 31710/32215/29023
+f 31710/32215/29023 31714/32214/29022 38455/32216/29024 38456/32217/29025
+f 31709/32208/29016 36797/32210/29018 36798/32218/29026 31714/32214/29022
+f 31714/32214/29022 36798/32218/29026 40181/32219/29027 38455/32216/29024
+f 31708/32205/29013 31710/32215/29023 31715/32220/29028 31711/32221/29029
+f 31711/32221/29029 31715/32220/29028 36868/32222/29030 36869/32223/29031
+f 31710/32215/29023 38456/32217/29025 38457/32224/29032 31715/32220/29028
+f 31715/32220/29028 38457/32224/29032 40205/32225/29033 36868/32222/29030
+f 31708/32205/29013 31711/32221/29029 31716/32226/29034 31712/32206/29014
+f 31712/32206/29014 31716/32226/29034 38452/32227/29035 38453/32211/29019
+f 31711/32221/29029 36869/32223/29031 36870/32228/29036 31716/32226/29034
+f 31716/32226/29034 36870/32228/29036 40204/32229/29037 38452/32227/29035
+f 31717/32230/29038 31721/32231/29039 31722/32232/29040 31718/32233/29041
+f 31718/32233/29041 31722/32232/29040 36799/32234/29042 36800/32235/29043
+f 31721/32231/29039 38456/32217/29025 38455/32216/29024 31722/32232/29040
+f 31722/32232/29040 38455/32216/29024 40181/32219/29027 36799/32234/29042
+f 31717/32230/29038 31718/32233/29041 31723/32236/29044 31719/32237/29045
+f 31719/32237/29045 31723/32236/29044 38458/32238/29046 38459/32239/29047
+f 31718/32233/29041 36800/32235/29043 36801/32240/29048 31723/32236/29044
+f 31723/32236/29044 36801/32240/29048 40182/32241/29049 38458/32238/29046
+f 31717/32230/29038 31719/32237/29045 31724/32242/29050 31720/32243/29051
+f 31720/32243/29051 31724/32242/29050 36871/32244/29052 36872/32245/29053
+f 31719/32237/29045 38459/32239/29047 38460/32246/29054 31724/32242/29050
+f 31724/32242/29050 38460/32246/29054 40206/32247/29055 36871/32244/29052
+f 31717/32230/29038 31720/32243/29051 31725/32248/29056 31721/32231/29039
+f 31721/32231/29039 31725/32248/29056 38457/32224/29032 38456/32217/29025
+f 31720/32243/29051 36872/32245/29053 36873/32249/29057 31725/32248/29056
+f 31725/32248/29056 36873/32249/29057 40205/32225/29033 38457/32224/29032
+f 31726/32250/29058 31730/32251/29059 31731/32252/29060 31727/32253/29061
+f 31727/32253/29061 31731/32252/29060 36802/32254/29062 36803/32255/29063
+f 31730/32251/29059 38459/32239/29047 38458/32238/29046 31731/32252/29060
+f 31731/32252/29060 38458/32238/29046 40182/32241/29049 36802/32254/29062
+f 31726/32250/29058 31727/32253/29061 31732/32256/29064 31728/32257/29065
+f 31728/32257/29065 31732/32256/29064 38461/32258/29066 38462/32259/29067
+f 31727/32253/29061 36803/32255/29063 36804/32260/29068 31732/32256/29064
+f 31732/32256/29064 36804/32260/29068 40183/32261/29069 38461/32258/29066
+f 31726/32250/29058 31728/32257/29065 31733/32262/29070 31729/32263/29071
+f 31729/32263/29071 31733/32262/29070 36874/32264/29072 36875/32265/29073
+f 31728/32257/29065 38462/32259/29067 38463/32266/29074 31733/32262/29070
+f 31733/32262/29070 38463/32266/29074 40207/32267/29075 36874/32264/29072
+f 31726/32250/29058 31729/32263/29071 31734/32268/29076 31730/32251/29059
+f 31730/32251/29059 31734/32268/29076 38460/32246/29054 38459/32239/29047
+f 31729/32263/29071 36875/32265/29073 36876/32269/29077 31734/32268/29076
+f 31734/32268/29076 36876/32269/29077 40206/32247/29055 38460/32246/29054
+f 31735/32270/29078 31739/32271/29079 31740/32272/29080 31736/32273/29081
+f 31736/32273/29081 31740/32272/29080 36805/32274/29082 36806/32275/29083
+f 31739/32271/29079 38462/32259/29067 38461/32258/29066 31740/32272/29080
+f 31740/32272/29080 38461/32258/29066 40183/32261/29069 36805/32274/29082
+f 31735/32270/29078 31736/32273/29081 31741/32276/29084 31737/32277/29085
+f 31737/32277/29085 31741/32276/29084 38464/32278/29086 38465/32279/29087
+f 31736/32273/29081 36806/32275/29083 36807/32280/29088 31741/32276/29084
+f 31741/32276/29084 36807/32280/29088 40184/32281/29089 38464/32278/29086
+f 31735/32270/29078 31737/32277/29085 31742/32282/29090 31738/32283/29091
+f 31738/32283/29091 31742/32282/29090 36877/32284/29092 36878/32285/29093
+f 31737/32277/29085 38465/32279/29087 38466/32286/29094 31742/32282/29090
+f 31742/32282/29090 38466/32286/29094 40208/32287/29095 36877/32284/29092
+f 31735/32270/29078 31738/32283/29091 31743/32288/29096 31739/32271/29079
+f 31739/32271/29079 31743/32288/29096 38463/32266/29074 38462/32259/29067
+f 31738/32283/29091 36878/32285/29093 36879/32289/29097 31743/32288/29096
+f 31743/32288/29096 36879/32289/29097 40207/32267/29075 38463/32266/29074
+f 31744/32290/29098 31748/32291/29099 31749/32292/29100 31745/32293/29101
+f 31745/32293/29101 31749/32292/29100 36808/32294/29102 36809/32295/29103
+f 31748/32291/29099 38465/32279/29087 38464/32278/29086 31749/32292/29100
+f 31749/32292/29100 38464/32278/29086 40184/32281/29089 36808/32294/29102
+f 31744/32290/29098 31745/32293/29101 31750/32296/29104 31746/32297/29105
+f 31746/32297/29105 31750/32296/29104 38467/32298/29106 38468/32299/29107
+f 31745/32293/29101 36809/32295/29103 36810/32300/29108 31750/32296/29104
+f 31750/32296/29104 36810/32300/29108 40185/32301/29109 38467/32298/29106
+f 31744/32290/29098 31746/32297/29105 31751/32302/29110 31747/32303/29111
+f 31747/32303/29111 31751/32302/29110 36880/32304/29112 36881/32305/29113
+f 31746/32297/29105 38468/32299/29107 38469/32306/29114 31751/32302/29110
+f 31751/32302/29110 38469/32306/29114 40209/32307/29115 36880/32304/29112
+f 31744/32290/29098 31747/32303/29111 31752/32308/29116 31748/32291/29099
+f 31748/32291/29099 31752/32308/29116 38466/32286/29094 38465/32279/29087
+f 31747/32303/29111 36881/32305/29113 36882/32309/29117 31752/32308/29116
+f 31752/32308/29116 36882/32309/29117 40208/32287/29095 38466/32286/29094
+f 31753/32310/29118 31757/32311/29119 31758/32312/29120 31754/32313/29121
+f 31754/32313/29121 31758/32312/29120 36811/32314/29122 36812/32315/29123
+f 31757/32311/29119 38468/32299/29107 38467/32298/29106 31758/32312/29120
+f 31758/32312/29120 38467/32298/29106 40185/32301/29109 36811/32314/29122
+f 31753/32310/29118 31754/32313/29121 31759/32316/29124 31755/32317/29125
+f 31755/32317/29125 31759/32316/29124 38470/32318/29126 38471/32319/29127
+f 31754/32313/29121 36812/32315/29123 36813/32320/29128 31759/32316/29124
+f 31759/32316/29124 36813/32320/29128 40186/32321/29129 38470/32318/29126
+f 31753/32310/29118 31755/32317/29125 31760/32322/29130 31756/32323/29131
+f 31756/32323/29131 31760/32322/29130 36883/32324/29132 36884/32325/29133
+f 31755/32317/29125 38471/32319/29127 38472/32326/29134 31760/32322/29130
+f 31760/32322/29130 38472/32326/29134 40210/32327/29135 36883/32324/29132
+f 31753/32310/29118 31756/32323/29131 31761/32328/29136 31757/32311/29119
+f 31757/32311/29119 31761/32328/29136 38469/32306/29114 38468/32299/29107
+f 31756/32323/29131 36884/32325/29133 36885/32329/29137 31761/32328/29136
+f 31761/32328/29136 36885/32329/29137 40209/32307/29115 38469/32306/29114
+f 31762/32330/29138 31766/32331/29139 31767/32332/29140 31763/32333/29141
+f 31763/32333/29141 31767/32332/29140 36814/32334/29142 36815/32335/29143
+f 31766/32331/29139 38471/32319/29127 38470/32318/29126 31767/32332/29140
+f 31767/32332/29140 38470/32318/29126 40186/32321/29129 36814/32334/29142
+f 31762/32330/29138 31763/32333/29141 31768/32336/29144 31764/32337/29145
+f 31764/32337/29145 31768/32336/29144 38473/32338/29146 38474/32339/29147
+f 31763/32333/29141 36815/32335/29143 36816/32340/29148 31768/32336/29144
+f 31768/32336/29144 36816/32340/29148 40187/32341/29149 38473/32338/29146
+f 31762/32330/29138 31764/32337/29145 31769/32342/29150 31765/32343/29151
+f 31765/32343/29151 31769/32342/29150 36886/32344/29152 36887/32345/29153
+f 31764/32337/29145 38474/32339/29147 38475/32346/29154 31769/32342/29150
+f 31769/32342/29150 38475/32346/29154 40211/32347/29155 36886/32344/29152
+f 31762/32330/29138 31765/32343/29151 31770/32348/29156 31766/32331/29139
+f 31766/32331/29139 31770/32348/29156 38472/32326/29134 38471/32319/29127
+f 31765/32343/29151 36887/32345/29153 36888/32349/29157 31770/32348/29156
+f 31770/32348/29156 36888/32349/29157 40210/32327/29135 38472/32326/29134
+f 31771/32350/29158 31775/32351/29159 31776/32352/29160 31772/32353/29161
+f 31772/32353/29161 31776/32352/29160 36817/32354/29162 36818/32355/29163
+f 31775/32351/29159 38474/32339/29147 38473/32338/29146 31776/32352/29160
+f 31776/32352/29160 38473/32338/29146 40187/32341/29149 36817/32354/29162
+f 31771/32350/29158 31772/32353/29161 31777/32356/29164 31773/32357/29165
+f 31773/32357/29165 31777/32356/29164 38476/32358/29166 38477/32359/29167
+f 31772/32353/29161 36818/32355/29163 36819/32360/29168 31777/32356/29164
+f 31777/32356/29164 36819/32360/29168 40188/32361/29169 38476/32358/29166
+f 31771/32350/29158 31773/32357/29165 31778/32362/29170 31774/32363/29171
+f 31774/32363/29171 31778/32362/29170 36889/32364/29172 36890/32365/29173
+f 31773/32357/29165 38477/32359/29167 38478/32366/29174 31778/32362/29170
+f 31778/32362/29170 38478/32366/29174 40212/32367/29175 36889/32364/29172
+f 31771/32350/29158 31774/32363/29171 31779/32368/29176 31775/32351/29159
+f 31775/32351/29159 31779/32368/29176 38475/32346/29154 38474/32339/29147
+f 31774/32363/29171 36890/32365/29173 36891/32369/29177 31779/32368/29176
+f 31779/32368/29176 36891/32369/29177 40211/32347/29155 38475/32346/29154
+f 31780/32370/29178 31784/32371/29179 31785/32372/29180 31781/32373/29181
+f 31781/32373/29181 31785/32372/29180 36820/32374/29182 36821/32375/29183
+f 31784/32371/29179 38477/32359/29167 38476/32358/29166 31785/32372/29180
+f 31785/32372/29180 38476/32358/29166 40188/32361/29169 36820/32374/29182
+f 31780/32370/29178 31781/32373/29181 31786/32376/29184 31782/32377/29185
+f 31782/32377/29185 31786/32376/29184 38479/32378/29186 38480/32379/29187
+f 31781/32373/29181 36821/32375/29183 36822/32380/29188 31786/32376/29184
+f 31786/32376/29184 36822/32380/29188 40189/32381/29189 38479/32378/29186
+f 31780/32370/29178 31782/32377/29185 31787/32382/29190 31783/32383/29191
+f 31783/32383/29191 31787/32382/29190 36892/32384/29192 36893/32385/29193
+f 31782/32377/29185 38480/32379/29187 38481/32386/29194 31787/32382/29190
+f 31787/32382/29190 38481/32386/29194 40213/32387/29195 36892/32384/29192
+f 31780/32370/29178 31783/32383/29191 31788/32388/29196 31784/32371/29179
+f 31784/32371/29179 31788/32388/29196 38478/32366/29174 38477/32359/29167
+f 31783/32383/29191 36893/32385/29193 36894/32389/29197 31788/32388/29196
+f 31788/32388/29196 36894/32389/29197 40212/32367/29175 38478/32366/29174
+f 31789/32390/29198 31793/32391/29199 31794/32392/29200 31790/32393/29201
+f 31790/32393/29201 31794/32392/29200 36823/32394/29202 36824/32395/29203
+f 31793/32391/29199 38480/32379/29187 38479/32378/29186 31794/32392/29200
+f 31794/32392/29200 38479/32378/29186 40189/32381/29189 36823/32394/29202
+f 31789/32390/29198 31790/32393/29201 31795/32396/29204 31791/32397/29205
+f 31791/32397/29205 31795/32396/29204 38482/32398/29206 38483/32399/29207
+f 31790/32393/29201 36824/32395/29203 36825/32400/29208 31795/32396/29204
+f 31795/32396/29204 36825/32400/29208 40190/32401/29209 38482/32398/29206
+f 31789/32390/29198 31791/32397/29205 31796/32402/29210 31792/32403/29211
+f 31792/32403/29211 31796/32402/29210 36895/32404/29212 36896/32405/29213
+f 31791/32397/29205 38483/32399/29207 38484/32406/29214 31796/32402/29210
+f 31796/32402/29210 38484/32406/29214 40214/32407/29215 36895/32404/29212
+f 31789/32390/29198 31792/32403/29211 31797/32408/29216 31793/32391/29199
+f 31793/32391/29199 31797/32408/29216 38481/32386/29194 38480/32379/29187
+f 31792/32403/29211 36896/32405/29213 36897/32409/29217 31797/32408/29216
+f 31797/32408/29216 36897/32409/29217 40213/32387/29195 38481/32386/29194
+f 31798/32410/29218 31802/32411/29219 31803/32412/29220 31799/32413/29221
+f 31799/32413/29221 31803/32412/29220 36826/32414/29222 36827/32415/29223
+f 31802/32411/29219 38483/32399/29207 38482/32398/29206 31803/32412/29220
+f 31803/32412/29220 38482/32398/29206 40190/32401/29209 36826/32414/29222
+f 31798/32410/29218 31799/32413/29221 31804/32416/29224 31800/32417/29225
+f 31800/32417/29225 31804/32416/29224 38485/32418/29226 38486/32419/29227
+f 31799/32413/29221 36827/32415/29223 36828/32420/29228 31804/32416/29224
+f 31804/32416/29224 36828/32420/29228 40191/32421/29229 38485/32418/29226
+f 31798/32410/29218 31800/32417/29225 31805/32422/29230 31801/32423/29231
+f 31801/32423/29231 31805/32422/29230 36898/32424/29232 36899/32425/29233
+f 31800/32417/29225 38486/32419/29227 38487/32426/29234 31805/32422/29230
+f 31805/32422/29230 38487/32426/29234 40215/32427/29235 36898/32424/29232
+f 31798/32410/29218 31801/32423/29231 31806/32428/29236 31802/32411/29219
+f 31802/32411/29219 31806/32428/29236 38484/32406/29214 38483/32399/29207
+f 31801/32423/29231 36899/32425/29233 36900/32429/29237 31806/32428/29236
+f 31806/32428/29236 36900/32429/29237 40214/32407/29215 38484/32406/29214
+f 31807/32430/29238 31811/32431/29239 31812/32432/29240 31808/32433/29241
+f 31808/32433/29241 31812/32432/29240 36829/32434/29242 36830/32435/29243
+f 31811/32431/29239 38486/32419/29227 38485/32418/29226 31812/32432/29240
+f 31812/32432/29240 38485/32418/29226 40191/32421/29229 36829/32434/29242
+f 31807/32430/29238 31808/32433/29241 31813/32436/29244 31809/32437/29245
+f 31809/32437/29245 31813/32436/29244 38488/32438/29246 38489/32439/29247
+f 31808/32433/29241 36830/32435/29243 36831/32440/29248 31813/32436/29244
+f 31813/32436/29244 36831/32440/29248 40192/32441/29249 38488/32438/29246
+f 31807/32430/29238 31809/32437/29245 31814/32442/29250 31810/32443/29251
+f 31810/32443/29251 31814/32442/29250 36901/32444/29252 36902/32445/29253
+f 31809/32437/29245 38489/32439/29247 38490/32446/29254 31814/32442/29250
+f 31814/32442/29250 38490/32446/29254 40216/32447/29255 36901/32444/29252
+f 31807/32430/29238 31810/32443/29251 31815/32448/29256 31811/32431/29239
+f 31811/32431/29239 31815/32448/29256 38487/32426/29234 38486/32419/29227
+f 31810/32443/29251 36902/32445/29253 36903/32449/29257 31815/32448/29256
+f 31815/32448/29256 36903/32449/29257 40215/32427/29235 38487/32426/29234
+f 31816/32450/29258 31820/32451/29259 31821/32452/29260 31817/32453/29261
+f 31817/32453/29261 31821/32452/29260 36832/32454/29262 36833/32455/29263
+f 31820/32451/29259 38489/32439/29247 38488/32438/29246 31821/32452/29260
+f 31821/32452/29260 38488/32438/29246 40192/32441/29249 36832/32454/29262
+f 31816/32450/29258 31817/32453/29261 31822/32456/29264 31818/32457/29265
+f 31818/32457/29265 31822/32456/29264 38491/32458/29266 38492/32459/29267
+f 31817/32453/29261 36833/32455/29263 36834/32460/29268 31822/32456/29264
+f 31822/32456/29264 36834/32460/29268 40193/32461/29269 38491/32458/29266
+f 31816/32450/29258 31818/32457/29265 31823/32462/29270 31819/32463/29271
+f 31819/32463/29271 31823/32462/29270 36904/32464/29272 36905/32465/29273
+f 31818/32457/29265 38492/32459/29267 38493/32466/29274 31823/32462/29270
+f 31823/32462/29270 38493/32466/29274 40217/32467/29275 36904/32464/29272
+f 31816/32450/29258 31819/32463/29271 31824/32468/29276 31820/32451/29259
+f 31820/32451/29259 31824/32468/29276 38490/32446/29254 38489/32439/29247
+f 31819/32463/29271 36905/32465/29273 36906/32469/29277 31824/32468/29276
+f 31824/32468/29276 36906/32469/29277 40216/32447/29255 38490/32446/29254
+f 31825/32470/29278 31829/32471/29279 31830/32472/29280 31826/32473/29281
+f 31826/32473/29281 31830/32472/29280 36835/32474/29282 36836/32475/29283
+f 31829/32471/29279 38492/32459/29267 38491/32458/29266 31830/32472/29280
+f 31830/32472/29280 38491/32458/29266 40193/32461/29269 36835/32474/29282
+f 31825/32470/29278 31826/32473/29281 31831/32476/29284 31827/32477/29285
+f 31827/32477/29285 31831/32476/29284 38494/32478/29286 38495/32479/29287
+f 31826/32473/29281 36836/32475/29283 36837/32480/29288 31831/32476/29284
+f 31831/32476/29284 36837/32480/29288 40194/32481/29289 38494/32478/29286
+f 31825/32470/29278 31827/32477/29285 31832/32482/29290 31828/32483/29291
+f 31828/32483/29291 31832/32482/29290 36907/32484/29292 36908/32485/29293
+f 31827/32477/29285 38495/32479/29287 38496/32486/29294 31832/32482/29290
+f 31832/32482/29290 38496/32486/29294 40218/32487/29295 36907/32484/29292
+f 31825/32470/29278 31828/32483/29291 31833/32488/29296 31829/32471/29279
+f 31829/32471/29279 31833/32488/29296 38493/32466/29274 38492/32459/29267
+f 31828/32483/29291 36908/32485/29293 36909/32489/29297 31833/32488/29296
+f 31833/32488/29296 36909/32489/29297 40217/32467/29275 38493/32466/29274
+f 31834/32490/29298 31838/32491/29299 31839/32492/29300 31835/32493/29301
+f 31835/32493/29301 31839/32492/29300 36838/32494/29302 36839/32495/29303
+f 31838/32491/29299 38495/32479/29287 38494/32478/29286 31839/32492/29300
+f 31839/32492/29300 38494/32478/29286 40194/32481/29289 36838/32494/29302
+f 31834/32490/29298 31835/32493/29301 31840/32496/29304 31836/32497/29305
+f 31836/32497/29305 31840/32496/29304 38497/32498/29306 38498/32499/29307
+f 31835/32493/29301 36839/32495/29303 36840/32500/29308 31840/32496/29304
+f 31840/32496/29304 36840/32500/29308 40195/32501/29309 38497/32498/29306
+f 31834/32490/29298 31836/32497/29305 31841/32502/29310 31837/32503/29311
+f 31837/32503/29311 31841/32502/29310 36910/32504/29312 36911/32505/29313
+f 31836/32497/29305 38498/32499/29307 38499/32506/29314 31841/32502/29310
+f 31841/32502/29310 38499/32506/29314 40219/32507/29315 36910/32504/29312
+f 31834/32490/29298 31837/32503/29311 31842/32508/29316 31838/32491/29299
+f 31838/32491/29299 31842/32508/29316 38496/32486/29294 38495/32479/29287
+f 31837/32503/29311 36911/32505/29313 36912/32509/29317 31842/32508/29316
+f 31842/32508/29316 36912/32509/29317 40218/32487/29295 38496/32486/29294
+f 31843/32510/29318 31847/32511/29319 31848/32512/29320 31844/32513/29321
+f 31844/32513/29321 31848/32512/29320 36841/32514/29322 36842/32515/29323
+f 31847/32511/29319 38498/32499/29307 38497/32498/29306 31848/32512/29320
+f 31848/32512/29320 38497/32498/29306 40195/32501/29309 36841/32514/29322
+f 31843/32510/29318 31844/32513/29321 31849/32516/29324 31845/32517/29325
+f 31845/32517/29325 31849/32516/29324 38500/32518/29326 38501/32519/29327
+f 31844/32513/29321 36842/32515/29323 36843/32520/29328 31849/32516/29324
+f 31849/32516/29324 36843/32520/29328 40196/32521/29329 38500/32518/29326
+f 31843/32510/29318 31845/32517/29325 31850/32522/29330 31846/32523/29331
+f 31846/32523/29331 31850/32522/29330 36913/32524/29332 36914/32525/29333
+f 31845/32517/29325 38501/32519/29327 38502/32526/29334 31850/32522/29330
+f 31850/32522/29330 38502/32526/29334 40220/32527/29335 36913/32524/29332
+f 31843/32510/29318 31846/32523/29331 31851/32528/29336 31847/32511/29319
+f 31847/32511/29319 31851/32528/29336 38499/32506/29314 38498/32499/29307
+f 31846/32523/29331 36914/32525/29333 36915/32529/29337 31851/32528/29336
+f 31851/32528/29336 36915/32529/29337 40219/32507/29315 38499/32506/29314
+f 31852/32530/29338 31856/32531/29339 31857/32532/29340 31853/32533/29341
+f 31853/32533/29341 31857/32532/29340 36844/32534/29342 36845/32535/29343
+f 31856/32531/29339 38501/32519/29327 38500/32518/29326 31857/32532/29340
+f 31857/32532/29340 38500/32518/29326 40196/32521/29329 36844/32534/29342
+f 31852/32530/29338 31853/32533/29341 31858/32536/29344 31854/32537/29345
+f 31854/32537/29345 31858/32536/29344 38503/32538/29346 38504/32539/29347
+f 31853/32533/29341 36845/32535/29343 36846/32540/29348 31858/32536/29344
+f 31858/32536/29344 36846/32540/29348 40197/32541/29349 38503/32538/29346
+f 31852/32530/29338 31854/32537/29345 31859/32542/29350 31855/32543/29351
+f 31855/32543/29351 31859/32542/29350 36916/32544/29352 36917/32545/29353
+f 31854/32537/29345 38504/32539/29347 38505/32546/29354 31859/32542/29350
+f 31859/32542/29350 38505/32546/29354 40221/32547/29355 36916/32544/29352
+f 31852/32530/29338 31855/32543/29351 31860/32548/29356 31856/32531/29339
+f 31856/32531/29339 31860/32548/29356 38502/32526/29334 38501/32519/29327
+f 31855/32543/29351 36917/32545/29353 36918/32549/29357 31860/32548/29356
+f 31860/32548/29356 36918/32549/29357 40220/32527/29335 38502/32526/29334
+f 31861/32550/29358 31865/32551/29359 31866/32552/29360 31862/32553/29361
+f 31862/32553/29361 31866/32552/29360 36847/32554/29362 36848/32555/29363
+f 31865/32551/29359 38504/32539/29347 38503/32538/29346 31866/32552/29360
+f 31866/32552/29360 38503/32538/29346 40197/32541/29349 36847/32554/29362
+f 31861/32550/29358 31862/32553/29361 31867/32556/29364 31863/32557/29365
+f 31863/32557/29365 31867/32556/29364 38506/32558/29366 38507/32559/29367
+f 31862/32553/29361 36848/32555/29363 36849/32560/29368 31867/32556/29364
+f 31867/32556/29364 36849/32560/29368 40198/32561/29369 38506/32558/29366
+f 31861/32550/29358 31863/32557/29365 31868/32562/29370 31864/32563/29371
+f 31864/32563/29371 31868/32562/29370 36919/32564/29372 36920/32565/29373
+f 31863/32557/29365 38507/32559/29367 38508/32566/29374 31868/32562/29370
+f 31868/32562/29370 38508/32566/29374 40222/32567/29375 36919/32564/29372
+f 31861/32550/29358 31864/32563/29371 31869/32568/29376 31865/32551/29359
+f 31865/32551/29359 31869/32568/29376 38505/32546/29354 38504/32539/29347
+f 31864/32563/29371 36920/32565/29373 36921/32569/29377 31869/32568/29376
+f 31869/32568/29376 36921/32569/29377 40221/32547/29355 38505/32546/29354
+f 31870/32570/29378 31874/32571/29379 31875/32572/29380 31871/32573/29381
+f 31871/32573/29381 31875/32572/29380 36850/32574/29382 36851/32575/29383
+f 31874/32571/29379 38507/32559/29367 38506/32558/29366 31875/32572/29380
+f 31875/32572/29380 38506/32558/29366 40198/32561/29369 36850/32574/29382
+f 31870/32570/29378 31871/32573/29381 31876/32576/29384 31872/32577/29385
+f 31872/32577/29385 31876/32576/29384 38509/32578/29386 38510/32579/29387
+f 31871/32573/29381 36851/32575/29383 36852/32580/29388 31876/32576/29384
+f 31876/32576/29384 36852/32580/29388 40199/32581/29389 38509/32578/29386
+f 31870/32570/29378 31872/32577/29385 31877/32582/29390 31873/32583/29391
+f 31873/32583/29391 31877/32582/29390 36922/32584/29392 36923/32585/29393
+f 31872/32577/29385 38510/32579/29387 38511/32586/29394 31877/32582/29390
+f 31877/32582/29390 38511/32586/29394 40223/32587/29395 36922/32584/29392
+f 31870/32570/29378 31873/32583/29391 31878/32588/29396 31874/32571/29379
+f 31874/32571/29379 31878/32588/29396 38508/32566/29374 38507/32559/29367
+f 31873/32583/29391 36923/32585/29393 36924/32589/29397 31878/32588/29396
+f 31878/32588/29396 36924/32589/29397 40222/32567/29375 38508/32566/29374
+f 31879/32590/29398 31883/32591/29399 31884/32592/29400 31880/32593/29401
+f 31880/32593/29401 31884/32592/29400 36853/32594/29402 36854/32595/29403
+f 31883/32591/29399 38510/32579/29387 38509/32578/29386 31884/32592/29400
+f 31884/32592/29400 38509/32578/29386 40199/32581/29389 36853/32594/29402
+f 31879/32590/29398 31880/32593/29401 31885/32596/29404 31881/32597/29405
+f 31881/32597/29405 31885/32596/29404 38512/32598/29406 38513/32599/29407
+f 31880/32593/29401 36854/32595/29403 36855/32600/29408 31885/32596/29404
+f 31885/32596/29404 36855/32600/29408 40200/32601/29409 38512/32598/29406
+f 31879/32590/29398 31881/32597/29405 31886/32602/29410 31882/32603/29411
+f 31882/32603/29411 31886/32602/29410 36925/32604/29412 36926/32605/29413
+f 31881/32597/29405 38513/32599/29407 38514/32606/29414 31886/32602/29410
+f 31886/32602/29410 38514/32606/29414 40224/32607/29415 36925/32604/29412
+f 31879/32590/29398 31882/32603/29411 31887/32608/29416 31883/32591/29399
+f 31883/32591/29399 31887/32608/29416 38511/32586/29394 38510/32579/29387
+f 31882/32603/29411 36926/32605/29413 36927/32609/29417 31887/32608/29416
+f 31887/32608/29416 36927/32609/29417 40223/32587/29395 38511/32586/29394
+f 31888/32610/29418 31892/32611/29419 31893/32612/29420 31889/32613/29421
+f 31889/32613/29421 31893/32612/29420 36856/32614/29422 36857/32615/29423
+f 31892/32611/29419 38513/32599/29407 38512/32598/29406 31893/32612/29420
+f 31893/32612/29420 38512/32598/29406 40200/32601/29409 36856/32614/29422
+f 31888/32610/29418 31889/32613/29421 31894/32616/29424 31890/32617/29425
+f 31890/32617/29425 31894/32616/29424 38515/32618/29426 38516/32619/29427
+f 31889/32613/29421 36857/32615/29423 36858/32620/29428 31894/32616/29424
+f 31894/32616/29424 36858/32620/29428 40201/32621/29429 38515/32618/29426
+f 31888/32610/29418 31890/32617/29425 31895/32622/29430 31891/32623/29431
+f 31891/32623/29431 31895/32622/29430 36928/32624/29432 36929/32625/29433
+f 31890/32617/29425 38516/32619/29427 38517/32626/29434 31895/32622/29430
+f 31895/32622/29430 38517/32626/29434 40225/32627/29435 36928/32624/29432
+f 31888/32610/29418 31891/32623/29431 31896/32628/29436 31892/32611/29419
+f 31892/32611/29419 31896/32628/29436 38514/32606/29414 38513/32599/29407
+f 31891/32623/29431 36929/32625/29433 36930/32629/29437 31896/32628/29436
+f 31896/32628/29436 36930/32629/29437 40224/32607/29415 38514/32606/29414
+f 31897/32630/29438 31901/32631/29439 31902/32632/29440 31898/32633/29441
+f 31898/32633/29441 31902/32632/29440 36859/32634/29442 36860/32635/29443
+f 31901/32631/29439 38516/32619/29427 38515/32618/29426 31902/32632/29440
+f 31902/32632/29440 38515/32618/29426 40201/32621/29429 36859/32634/29442
+f 31897/32630/29438 31898/32633/29441 31903/32636/29444 31899/32637/29445
+f 31899/32637/29445 31903/32636/29444 38518/32638/29446 38519/32639/29447
+f 31898/32633/29441 36860/32635/29443 36861/32640/29448 31903/32636/29444
+f 31903/32636/29444 36861/32640/29448 40202/32641/29449 38518/32638/29446
+f 31897/32630/29438 31899/32637/29445 31904/32642/29450 31900/32643/29451
+f 31900/32643/29451 31904/32642/29450 36931/32644/29452 36932/32645/29453
+f 31899/32637/29445 38519/32639/29447 38520/32646/29454 31904/32642/29450
+f 31904/32642/29450 38520/32646/29454 40226/32647/29455 36931/32644/29452
+f 31897/32630/29438 31900/32643/29451 31905/32648/29456 31901/32631/29439
+f 31901/32631/29439 31905/32648/29456 38517/32626/29434 38516/32619/29427
+f 31900/32643/29451 36932/32645/29453 36933/32649/29457 31905/32648/29456
+f 31905/32648/29456 36933/32649/29457 40225/32627/29435 38517/32626/29434
+f 31906/32650/29458 31910/32651/29459 31911/32652/29460 31907/32653/29461
+f 31907/32653/29461 31911/32652/29460 36862/32654/29462 36863/32655/29463
+f 31910/32651/29459 38519/32639/29447 38518/32638/29446 31911/32652/29460
+f 31911/32652/29460 38518/32638/29446 40202/32641/29449 36862/32654/29462
+f 31906/32650/29458 31907/32653/29461 31912/32656/29464 31908/32657/29465
+f 31908/32657/29465 31912/32656/29464 38521/32658/29466 38522/32659/29467
+f 31907/32653/29461 36863/32655/29463 36864/32660/29468 31912/32656/29464
+f 31912/32656/29464 36864/32660/29468 40203/32661/29469 38521/32658/29466
+f 31906/32650/29458 31908/32657/29465 31913/32662/29470 31909/32663/29471
+f 31909/32663/29471 31913/32662/29470 36934/32664/29472 36935/32665/29473
+f 31908/32657/29465 38522/32659/29467 38523/32666/29474 31913/32662/29470
+f 31913/32662/29470 38523/32666/29474 40227/32667/29475 36934/32664/29472
+f 31906/32650/29458 31909/32663/29471 31914/32668/29476 31910/32651/29459
+f 31910/32651/29459 31914/32668/29476 38520/32646/29454 38519/32639/29447
+f 31909/32663/29471 36935/32665/29473 36936/32669/29477 31914/32668/29476
+f 31914/32668/29476 36936/32669/29477 40226/32647/29455 38520/32646/29454
+f 31915/32670/29478 31919/32671/29479 31920/32672/29480 31916/32673/29481
+f 31916/32673/29481 31920/32672/29480 36865/32674/29482 36866/32675/29483
+f 31919/32671/29479 38522/32659/29467 38521/32658/29466 31920/32672/29480
+f 31920/32672/29480 38521/32658/29466 40203/32661/29469 36865/32674/29482
+f 31915/32670/29478 31916/32673/29481 31921/32676/29484 31917/32677/29485
+f 31917/32677/29485 31921/32676/29484 38454/32678/29020 38453/32679/29019
+f 31916/32673/29481 36866/32675/29483 36867/32680/29486 31921/32676/29484
+f 31921/32676/29484 36867/32680/29486 40180/32681/29021 38454/32678/29020
+f 31915/32670/29478 31917/32677/29485 31922/32682/29487 31918/32683/29488
+f 31918/32683/29488 31922/32682/29487 36937/32684/29489 36938/32685/29490
+f 31917/32677/29485 38453/32679/29019 38452/32686/29035 31922/32682/29487
+f 31922/32682/29487 38452/32686/29035 40204/32687/29037 36937/32684/29489
+f 31915/32670/29478 31918/32683/29488 31923/32688/29491 31919/32671/29479
+f 31919/32671/29479 31923/32688/29491 38523/32666/29474 38522/32659/29467
+f 31918/32683/29488 36938/32685/29490 36939/32689/29492 31923/32688/29491
+f 31923/32688/29491 36939/32689/29492 40227/32667/29475 38523/32666/29474
+f 31924/32690/29493 31928/32691/29494 31929/32692/29495 31925/32693/29496
+f 31925/32693/29496 31929/32692/29495 36870/32228/29036 36869/32223/29031
+f 31928/32691/29494 38525/32694/29497 38526/32695/29498 31929/32692/29495
+f 31929/32692/29495 38526/32695/29498 40204/32229/29037 36870/32228/29036
+f 31924/32690/29493 31925/32693/29496 31930/32696/29499 31926/32697/29500
+f 31926/32697/29500 31930/32696/29499 38527/32698/29501 38528/32699/29502
+f 31925/32693/29496 36869/32223/29031 36868/32222/29030 31930/32696/29499
+f 31930/32696/29499 36868/32222/29030 40205/32225/29033 38527/32698/29501
+f 31924/32690/29493 31926/32697/29500 31931/32700/29503 31927/32701/29504
+f 31927/32701/29504 31931/32700/29503 36940/32702/29505 36941/32703/29506
+f 31926/32697/29500 38528/32699/29502 38529/32704/29507 31931/32700/29503
+f 31931/32700/29503 38529/32704/29507 40229/32705/29508 36940/32702/29505
+f 31924/32690/29493 31927/32701/29504 31932/32706/29509 31928/32691/29494
+f 31928/32691/29494 31932/32706/29509 38524/32707/29510 38525/32694/29497
+f 31927/32701/29504 36941/32703/29506 36942/32708/29511 31932/32706/29509
+f 31932/32706/29509 36942/32708/29511 40228/32709/29512 38524/32707/29510
+f 31933/32710/29513 31937/32711/29514 31938/32712/29515 31934/32713/29516
+f 31934/32713/29516 31938/32712/29515 36873/32249/29057 36872/32245/29053
+f 31937/32711/29514 38528/32699/29502 38527/32698/29501 31938/32712/29515
+f 31938/32712/29515 38527/32698/29501 40205/32225/29033 36873/32249/29057
+f 31933/32710/29513 31934/32713/29516 31939/32714/29517 31935/32715/29518
+f 31935/32715/29518 31939/32714/29517 38530/32716/29519 38531/32717/29520
+f 31934/32713/29516 36872/32245/29053 36871/32244/29052 31939/32714/29517
+f 31939/32714/29517 36871/32244/29052 40206/32247/29055 38530/32716/29519
+f 31933/32710/29513 31935/32715/29518 31940/32718/29521 31936/32719/29522
+f 31936/32719/29522 31940/32718/29521 36943/32720/29523 36944/32721/29524
+f 31935/32715/29518 38531/32717/29520 38532/32722/29525 31940/32718/29521
+f 31940/32718/29521 38532/32722/29525 40230/32723/29526 36943/32720/29523
+f 31933/32710/29513 31936/32719/29522 31941/32724/29527 31937/32711/29514
+f 31937/32711/29514 31941/32724/29527 38529/32704/29507 38528/32699/29502
+f 31936/32719/29522 36944/32721/29524 36945/32725/29528 31941/32724/29527
+f 31941/32724/29527 36945/32725/29528 40229/32705/29508 38529/32704/29507
+f 31942/32726/29529 31946/32727/29530 31947/32728/29531 31943/32729/29532
+f 31943/32729/29532 31947/32728/29531 36876/32269/29077 36875/32265/29073
+f 31946/32727/29530 38531/32717/29520 38530/32716/29519 31947/32728/29531
+f 31947/32728/29531 38530/32716/29519 40206/32247/29055 36876/32269/29077
+f 31942/32726/29529 31943/32729/29532 31948/32730/29533 31944/32731/29534
+f 31944/32731/29534 31948/32730/29533 38533/32732/29535 38534/32733/29536
+f 31943/32729/29532 36875/32265/29073 36874/32264/29072 31948/32730/29533
+f 31948/32730/29533 36874/32264/29072 40207/32267/29075 38533/32732/29535
+f 31942/32726/29529 31944/32731/29534 31949/32734/29537 31945/32735/29538
+f 31945/32735/29538 31949/32734/29537 36946/32736/29539 36947/32737/29540
+f 31944/32731/29534 38534/32733/29536 38535/32738/29541 31949/32734/29537
+f 31949/32734/29537 38535/32738/29541 40231/32739/29542 36946/32736/29539
+f 31942/32726/29529 31945/32735/29538 31950/32740/29543 31946/32727/29530
+f 31946/32727/29530 31950/32740/29543 38532/32722/29525 38531/32717/29520
+f 31945/32735/29538 36947/32737/29540 36948/32741/29544 31950/32740/29543
+f 31950/32740/29543 36948/32741/29544 40230/32723/29526 38532/32722/29525
+f 31951/32742/29545 31955/32743/29546 31956/32744/29547 31952/32745/29548
+f 31952/32745/29548 31956/32744/29547 36879/32289/29097 36878/32285/29093
+f 31955/32743/29546 38534/32733/29536 38533/32732/29535 31956/32744/29547
+f 31956/32744/29547 38533/32732/29535 40207/32267/29075 36879/32289/29097
+f 31951/32742/29545 31952/32745/29548 31957/32746/29549 31953/32747/29550
+f 31953/32747/29550 31957/32746/29549 38536/32748/29551 38537/32749/29552
+f 31952/32745/29548 36878/32285/29093 36877/32284/29092 31957/32746/29549
+f 31957/32746/29549 36877/32284/29092 40208/32287/29095 38536/32748/29551
+f 31951/32742/29545 31953/32747/29550 31958/32750/29553 31954/32751/29554
+f 31954/32751/29554 31958/32750/29553 36949/32752/29555 36950/32753/29556
+f 31953/32747/29550 38537/32749/29552 38538/32754/29557 31958/32750/29553
+f 31958/32750/29553 38538/32754/29557 40232/32755/29558 36949/32752/29555
+f 31951/32742/29545 31954/32751/29554 31959/32756/29559 31955/32743/29546
+f 31955/32743/29546 31959/32756/29559 38535/32738/29541 38534/32733/29536
+f 31954/32751/29554 36950/32753/29556 36951/32757/29560 31959/32756/29559
+f 31959/32756/29559 36951/32757/29560 40231/32739/29542 38535/32738/29541
+f 31960/32758/29561 31964/32759/29562 31965/32760/29563 31961/32761/29564
+f 31961/32761/29564 31965/32760/29563 36882/32309/29117 36881/32305/29113
+f 31964/32759/29562 38537/32749/29552 38536/32748/29551 31965/32760/29563
+f 31965/32760/29563 38536/32748/29551 40208/32287/29095 36882/32309/29117
+f 31960/32758/29561 31961/32761/29564 31966/32762/29565 31962/32763/29566
+f 31962/32763/29566 31966/32762/29565 38539/32764/29567 38540/32765/29568
+f 31961/32761/29564 36881/32305/29113 36880/32304/29112 31966/32762/29565
+f 31966/32762/29565 36880/32304/29112 40209/32307/29115 38539/32764/29567
+f 31960/32758/29561 31962/32763/29566 31967/32766/29569 31963/32767/29570
+f 31963/32767/29570 31967/32766/29569 36952/32768/29571 36953/32769/29572
+f 31962/32763/29566 38540/32765/29568 38541/32770/29573 31967/32766/29569
+f 31967/32766/29569 38541/32770/29573 40233/32771/29574 36952/32768/29571
+f 31960/32758/29561 31963/32767/29570 31968/32772/29575 31964/32759/29562
+f 31964/32759/29562 31968/32772/29575 38538/32754/29557 38537/32749/29552
+f 31963/32767/29570 36953/32769/29572 36954/32773/29576 31968/32772/29575
+f 31968/32772/29575 36954/32773/29576 40232/32755/29558 38538/32754/29557
+f 31969/32774/29577 31973/32775/29578 31974/32776/29579 31970/32777/29580
+f 31970/32777/29580 31974/32776/29579 36885/32329/29137 36884/32325/29133
+f 31973/32775/29578 38540/32765/29568 38539/32764/29567 31974/32776/29579
+f 31974/32776/29579 38539/32764/29567 40209/32307/29115 36885/32329/29137
+f 31969/32774/29577 31970/32777/29580 31975/32778/29581 31971/32779/29582
+f 31971/32779/29582 31975/32778/29581 38542/32780/29583 38543/32781/29584
+f 31970/32777/29580 36884/32325/29133 36883/32324/29132 31975/32778/29581
+f 31975/32778/29581 36883/32324/29132 40210/32327/29135 38542/32780/29583
+f 31969/32774/29577 31971/32779/29582 31976/32782/29585 31972/32783/29586
+f 31972/32783/29586 31976/32782/29585 36955/32784/29587 36956/32785/29588
+f 31971/32779/29582 38543/32781/29584 38544/32786/29589 31976/32782/29585
+f 31976/32782/29585 38544/32786/29589 40234/32787/29590 36955/32784/29587
+f 31969/32774/29577 31972/32783/29586 31977/32788/29591 31973/32775/29578
+f 31973/32775/29578 31977/32788/29591 38541/32770/29573 38540/32765/29568
+f 31972/32783/29586 36956/32785/29588 36957/32789/29592 31977/32788/29591
+f 31977/32788/29591 36957/32789/29592 40233/32771/29574 38541/32770/29573
+f 31978/32790/29593 31982/32791/29594 31983/32792/29595 31979/32793/29596
+f 31979/32793/29596 31983/32792/29595 36888/32349/29157 36887/32345/29153
+f 31982/32791/29594 38543/32781/29584 38542/32780/29583 31983/32792/29595
+f 31983/32792/29595 38542/32780/29583 40210/32327/29135 36888/32349/29157
+f 31978/32790/29593 31979/32793/29596 31984/32794/29597 31980/32795/29598
+f 31980/32795/29598 31984/32794/29597 38545/32796/29599 38546/32797/29600
+f 31979/32793/29596 36887/32345/29153 36886/32344/29152 31984/32794/29597
+f 31984/32794/29597 36886/32344/29152 40211/32347/29155 38545/32796/29599
+f 31978/32790/29593 31980/32795/29598 31985/32798/29601 31981/32799/29602
+f 31981/32799/29602 31985/32798/29601 36958/32800/29603 36959/32801/29604
+f 31980/32795/29598 38546/32797/29600 38547/32802/29605 31985/32798/29601
+f 31985/32798/29601 38547/32802/29605 40235/32803/29606 36958/32800/29603
+f 31978/32790/29593 31981/32799/29602 31986/32804/29607 31982/32791/29594
+f 31982/32791/29594 31986/32804/29607 38544/32786/29589 38543/32781/29584
+f 31981/32799/29602 36959/32801/29604 36960/32805/29608 31986/32804/29607
+f 31986/32804/29607 36960/32805/29608 40234/32787/29590 38544/32786/29589
+f 31987/32806/29609 31991/32807/29610 31992/32808/29611 31988/32809/29612
+f 31988/32809/29612 31992/32808/29611 36891/32369/29177 36890/32365/29173
+f 31991/32807/29610 38546/32797/29600 38545/32796/29599 31992/32808/29611
+f 31992/32808/29611 38545/32796/29599 40211/32347/29155 36891/32369/29177
+f 31987/32806/29609 31988/32809/29612 31993/32810/29613 31989/32811/29614
+f 31989/32811/29614 31993/32810/29613 38548/32812/29615 38549/32813/29616
+f 31988/32809/29612 36890/32365/29173 36889/32364/29172 31993/32810/29613
+f 31993/32810/29613 36889/32364/29172 40212/32367/29175 38548/32812/29615
+f 31987/32806/29609 31989/32811/29614 31994/32814/29617 31990/32815/29618
+f 31990/32815/29618 31994/32814/29617 36961/32816/29619 36962/32817/29620
+f 31989/32811/29614 38549/32813/29616 38550/32818/29621 31994/32814/29617
+f 31994/32814/29617 38550/32818/29621 40236/32819/29622 36961/32816/29619
+f 31987/32806/29609 31990/32815/29618 31995/32820/29623 31991/32807/29610
+f 31991/32807/29610 31995/32820/29623 38547/32802/29605 38546/32797/29600
+f 31990/32815/29618 36962/32817/29620 36963/32821/29624 31995/32820/29623
+f 31995/32820/29623 36963/32821/29624 40235/32803/29606 38547/32802/29605
+f 31996/32822/29625 32000/32823/29626 32001/32824/29627 31997/32825/29628
+f 31997/32825/29628 32001/32824/29627 36894/32389/29197 36893/32385/29193
+f 32000/32823/29626 38549/32813/29616 38548/32812/29615 32001/32824/29627
+f 32001/32824/29627 38548/32812/29615 40212/32367/29175 36894/32389/29197
+f 31996/32822/29625 31997/32825/29628 32002/32826/29629 31998/32827/29630
+f 31998/32827/29630 32002/32826/29629 38551/32828/29631 38552/32829/29632
+f 31997/32825/29628 36893/32385/29193 36892/32384/29192 32002/32826/29629
+f 32002/32826/29629 36892/32384/29192 40213/32387/29195 38551/32828/29631
+f 31996/32822/29625 31998/32827/29630 32003/32830/29633 31999/32831/29634
+f 31999/32831/29634 32003/32830/29633 36964/32832/29635 36965/32833/29636
+f 31998/32827/29630 38552/32829/29632 38553/32834/29637 32003/32830/29633
+f 32003/32830/29633 38553/32834/29637 40237/32835/29638 36964/32832/29635
+f 31996/32822/29625 31999/32831/29634 32004/32836/29639 32000/32823/29626
+f 32000/32823/29626 32004/32836/29639 38550/32818/29621 38549/32813/29616
+f 31999/32831/29634 36965/32833/29636 36966/32837/29640 32004/32836/29639
+f 32004/32836/29639 36966/32837/29640 40236/32819/29622 38550/32818/29621
+f 32005/32838/29641 32009/32839/29642 32010/32840/29643 32006/32841/29644
+f 32006/32841/29644 32010/32840/29643 36897/32409/29217 36896/32405/29213
+f 32009/32839/29642 38552/32829/29632 38551/32828/29631 32010/32840/29643
+f 32010/32840/29643 38551/32828/29631 40213/32387/29195 36897/32409/29217
+f 32005/32838/29641 32006/32841/29644 32011/32842/29645 32007/32843/29646
+f 32007/32843/29646 32011/32842/29645 38554/32844/29647 38555/32845/29648
+f 32006/32841/29644 36896/32405/29213 36895/32404/29212 32011/32842/29645
+f 32011/32842/29645 36895/32404/29212 40214/32407/29215 38554/32844/29647
+f 32005/32838/29641 32007/32843/29646 32012/32846/29649 32008/32847/29650
+f 32008/32847/29650 32012/32846/29649 36967/32848/29651 36968/32849/29652
+f 32007/32843/29646 38555/32845/29648 38556/32850/29653 32012/32846/29649
+f 32012/32846/29649 38556/32850/29653 40238/32851/29654 36967/32848/29651
+f 32005/32838/29641 32008/32847/29650 32013/32852/29655 32009/32839/29642
+f 32009/32839/29642 32013/32852/29655 38553/32834/29637 38552/32829/29632
+f 32008/32847/29650 36968/32849/29652 36969/32853/29656 32013/32852/29655
+f 32013/32852/29655 36969/32853/29656 40237/32835/29638 38553/32834/29637
+f 32014/32854/29657 32018/32855/29658 32019/32856/29659 32015/32857/29660
+f 32015/32857/29660 32019/32856/29659 36900/32429/29237 36899/32425/29233
+f 32018/32855/29658 38555/32845/29648 38554/32844/29647 32019/32856/29659
+f 32019/32856/29659 38554/32844/29647 40214/32407/29215 36900/32429/29237
+f 32014/32854/29657 32015/32857/29660 32020/32858/29661 32016/32859/29662
+f 32016/32859/29662 32020/32858/29661 38557/32860/29663 38558/32861/29664
+f 32015/32857/29660 36899/32425/29233 36898/32424/29232 32020/32858/29661
+f 32020/32858/29661 36898/32424/29232 40215/32427/29235 38557/32860/29663
+f 32014/32854/29657 32016/32859/29662 32021/32862/29665 32017/32863/29666
+f 32017/32863/29666 32021/32862/29665 36970/32864/29667 36971/32865/29668
+f 32016/32859/29662 38558/32861/29664 38559/32866/29669 32021/32862/29665
+f 32021/32862/29665 38559/32866/29669 40239/32867/29670 36970/32864/29667
+f 32014/32854/29657 32017/32863/29666 32022/32868/29671 32018/32855/29658
+f 32018/32855/29658 32022/32868/29671 38556/32850/29653 38555/32845/29648
+f 32017/32863/29666 36971/32865/29668 36972/32869/29672 32022/32868/29671
+f 32022/32868/29671 36972/32869/29672 40238/32851/29654 38556/32850/29653
+f 32023/32870/29673 32027/32871/29674 32028/32872/29675 32024/32873/29676
+f 32024/32873/29676 32028/32872/29675 36903/32449/29257 36902/32445/29253
+f 32027/32871/29674 38558/32861/29664 38557/32860/29663 32028/32872/29675
+f 32028/32872/29675 38557/32860/29663 40215/32427/29235 36903/32449/29257
+f 32023/32870/29673 32024/32873/29676 32029/32874/29677 32025/32875/29678
+f 32025/32875/29678 32029/32874/29677 38560/32876/29679 38561/32877/29680
+f 32024/32873/29676 36902/32445/29253 36901/32444/29252 32029/32874/29677
+f 32029/32874/29677 36901/32444/29252 40216/32447/29255 38560/32876/29679
+f 32023/32870/29673 32025/32875/29678 32030/32878/29681 32026/32879/29682
+f 32026/32879/29682 32030/32878/29681 36973/32880/29683 36974/32881/29684
+f 32025/32875/29678 38561/32877/29680 38562/32882/29685 32030/32878/29681
+f 32030/32878/29681 38562/32882/29685 40240/32883/29686 36973/32880/29683
+f 32023/32870/29673 32026/32879/29682 32031/32884/29687 32027/32871/29674
+f 32027/32871/29674 32031/32884/29687 38559/32866/29669 38558/32861/29664
+f 32026/32879/29682 36974/32881/29684 36975/32885/29688 32031/32884/29687
+f 32031/32884/29687 36975/32885/29688 40239/32867/29670 38559/32866/29669
+f 32032/32886/29689 32036/32887/29690 32037/32888/29691 32033/32889/29692
+f 32033/32889/29692 32037/32888/29691 36906/32469/29277 36905/32465/29273
+f 32036/32887/29690 38561/32877/29680 38560/32876/29679 32037/32888/29691
+f 32037/32888/29691 38560/32876/29679 40216/32447/29255 36906/32469/29277
+f 32032/32886/29689 32033/32889/29692 32038/32890/29693 32034/32891/29694
+f 32034/32891/29694 32038/32890/29693 38563/32892/29695 38564/32893/29696
+f 32033/32889/29692 36905/32465/29273 36904/32464/29272 32038/32890/29693
+f 32038/32890/29693 36904/32464/29272 40217/32467/29275 38563/32892/29695
+f 32032/32886/29689 32034/32891/29694 32039/32894/29697 32035/32895/29698
+f 32035/32895/29698 32039/32894/29697 36976/32896/29699 36977/32897/29700
+f 32034/32891/29694 38564/32893/29696 38565/32898/29701 32039/32894/29697
+f 32039/32894/29697 38565/32898/29701 40241/32899/29702 36976/32896/29699
+f 32032/32886/29689 32035/32895/29698 32040/32900/29703 32036/32887/29690
+f 32036/32887/29690 32040/32900/29703 38562/32882/29685 38561/32877/29680
+f 32035/32895/29698 36977/32897/29700 36978/32901/29704 32040/32900/29703
+f 32040/32900/29703 36978/32901/29704 40240/32883/29686 38562/32882/29685
+f 32041/32902/29705 32045/32903/29706 32046/32904/29707 32042/32905/29708
+f 32042/32905/29708 32046/32904/29707 36909/32489/29297 36908/32485/29293
+f 32045/32903/29706 38564/32893/29696 38563/32892/29695 32046/32904/29707
+f 32046/32904/29707 38563/32892/29695 40217/32467/29275 36909/32489/29297
+f 32041/32902/29705 32042/32905/29708 32047/32906/29709 32043/32907/29710
+f 32043/32907/29710 32047/32906/29709 38566/32908/29711 38567/32909/29712
+f 32042/32905/29708 36908/32485/29293 36907/32484/29292 32047/32906/29709
+f 32047/32906/29709 36907/32484/29292 40218/32487/29295 38566/32908/29711
+f 32041/32902/29705 32043/32907/29710 32048/32910/29713 32044/32911/29714
+f 32044/32911/29714 32048/32910/29713 36979/32912/29715 36980/32913/29716
+f 32043/32907/29710 38567/32909/29712 38568/32914/29717 32048/32910/29713
+f 32048/32910/29713 38568/32914/29717 40242/32915/29718 36979/32912/29715
+f 32041/32902/29705 32044/32911/29714 32049/32916/29719 32045/32903/29706
+f 32045/32903/29706 32049/32916/29719 38565/32898/29701 38564/32893/29696
+f 32044/32911/29714 36980/32913/29716 36981/32917/29720 32049/32916/29719
+f 32049/32916/29719 36981/32917/29720 40241/32899/29702 38565/32898/29701
+f 32050/32918/29721 32054/32919/29722 32055/32920/29723 32051/32921/29724
+f 32051/32921/29724 32055/32920/29723 36912/32509/29317 36911/32505/29313
+f 32054/32919/29722 38567/32909/29712 38566/32908/29711 32055/32920/29723
+f 32055/32920/29723 38566/32908/29711 40218/32487/29295 36912/32509/29317
+f 32050/32918/29721 32051/32921/29724 32056/32922/29725 32052/32923/29726
+f 32052/32923/29726 32056/32922/29725 38569/32924/29727 38570/32925/29728
+f 32051/32921/29724 36911/32505/29313 36910/32504/29312 32056/32922/29725
+f 32056/32922/29725 36910/32504/29312 40219/32507/29315 38569/32924/29727
+f 32050/32918/29721 32052/32923/29726 32057/32926/29729 32053/32927/29730
+f 32053/32927/29730 32057/32926/29729 36982/32928/29731 36983/32929/29732
+f 32052/32923/29726 38570/32925/29728 38571/32930/29733 32057/32926/29729
+f 32057/32926/29729 38571/32930/29733 40243/32931/29734 36982/32928/29731
+f 32050/32918/29721 32053/32927/29730 32058/32932/29735 32054/32919/29722
+f 32054/32919/29722 32058/32932/29735 38568/32914/29717 38567/32909/29712
+f 32053/32927/29730 36983/32929/29732 36984/32933/29736 32058/32932/29735
+f 32058/32932/29735 36984/32933/29736 40242/32915/29718 38568/32914/29717
+f 32059/32934/29737 32063/32935/29738 32064/32936/29739 32060/32937/29740
+f 32060/32937/29740 32064/32936/29739 36915/32529/29337 36914/32525/29333
+f 32063/32935/29738 38570/32925/29728 38569/32924/29727 32064/32936/29739
+f 32064/32936/29739 38569/32924/29727 40219/32507/29315 36915/32529/29337
+f 32059/32934/29737 32060/32937/29740 32065/32938/29741 32061/32939/29742
+f 32061/32939/29742 32065/32938/29741 38572/32940/29743 38573/32941/29744
+f 32060/32937/29740 36914/32525/29333 36913/32524/29332 32065/32938/29741
+f 32065/32938/29741 36913/32524/29332 40220/32527/29335 38572/32940/29743
+f 32059/32934/29737 32061/32939/29742 32066/32942/29745 32062/32943/29746
+f 32062/32943/29746 32066/32942/29745 36985/32944/29747 36986/32945/29748
+f 32061/32939/29742 38573/32941/29744 38574/32946/29749 32066/32942/29745
+f 32066/32942/29745 38574/32946/29749 40244/32947/29750 36985/32944/29747
+f 32059/32934/29737 32062/32943/29746 32067/32948/29751 32063/32935/29738
+f 32063/32935/29738 32067/32948/29751 38571/32930/29733 38570/32925/29728
+f 32062/32943/29746 36986/32945/29748 36987/32949/29752 32067/32948/29751
+f 32067/32948/29751 36987/32949/29752 40243/32931/29734 38571/32930/29733
+f 32068/32950/29753 32072/32951/29754 32073/32952/29755 32069/32953/29756
+f 32069/32953/29756 32073/32952/29755 36918/32549/29357 36917/32545/29353
+f 32072/32951/29754 38573/32941/29744 38572/32940/29743 32073/32952/29755
+f 32073/32952/29755 38572/32940/29743 40220/32527/29335 36918/32549/29357
+f 32068/32950/29753 32069/32953/29756 32074/32954/29757 32070/32955/29758
+f 32070/32955/29758 32074/32954/29757 38575/32956/29759 38576/32957/29760
+f 32069/32953/29756 36917/32545/29353 36916/32544/29352 32074/32954/29757
+f 32074/32954/29757 36916/32544/29352 40221/32547/29355 38575/32956/29759
+f 32068/32950/29753 32070/32955/29758 32075/32958/29761 32071/32959/29762
+f 32071/32959/29762 32075/32958/29761 36988/32960/29763 36989/32961/29764
+f 32070/32955/29758 38576/32957/29760 38577/32962/29765 32075/32958/29761
+f 32075/32958/29761 38577/32962/29765 40245/32963/29766 36988/32960/29763
+f 32068/32950/29753 32071/32959/29762 32076/32964/29767 32072/32951/29754
+f 32072/32951/29754 32076/32964/29767 38574/32946/29749 38573/32941/29744
+f 32071/32959/29762 36989/32961/29764 36990/32965/29768 32076/32964/29767
+f 32076/32964/29767 36990/32965/29768 40244/32947/29750 38574/32946/29749
+f 32077/32966/29769 32081/32967/29770 32082/32968/29771 32078/32969/29772
+f 32078/32969/29772 32082/32968/29771 36921/32569/29377 36920/32565/29373
+f 32081/32967/29770 38576/32957/29760 38575/32956/29759 32082/32968/29771
+f 32082/32968/29771 38575/32956/29759 40221/32547/29355 36921/32569/29377
+f 32077/32966/29769 32078/32969/29772 32083/32970/29773 32079/32971/29774
+f 32079/32971/29774 32083/32970/29773 38578/32972/29775 38579/32973/29776
+f 32078/32969/29772 36920/32565/29373 36919/32564/29372 32083/32970/29773
+f 32083/32970/29773 36919/32564/29372 40222/32567/29375 38578/32972/29775
+f 32077/32966/29769 32079/32971/29774 32084/32974/29777 32080/32975/29778
+f 32080/32975/29778 32084/32974/29777 36991/32976/29779 36992/32977/29780
+f 32079/32971/29774 38579/32973/29776 38580/32978/29781 32084/32974/29777
+f 32084/32974/29777 38580/32978/29781 40246/32979/29782 36991/32976/29779
+f 32077/32966/29769 32080/32975/29778 32085/32980/29783 32081/32967/29770
+f 32081/32967/29770 32085/32980/29783 38577/32962/29765 38576/32957/29760
+f 32080/32975/29778 36992/32977/29780 36993/32981/29784 32085/32980/29783
+f 32085/32980/29783 36993/32981/29784 40245/32963/29766 38577/32962/29765
+f 32086/32982/29785 32090/32983/29786 32091/32984/29787 32087/32985/29788
+f 32087/32985/29788 32091/32984/29787 36924/32589/29397 36923/32585/29393
+f 32090/32983/29786 38579/32973/29776 38578/32972/29775 32091/32984/29787
+f 32091/32984/29787 38578/32972/29775 40222/32567/29375 36924/32589/29397
+f 32086/32982/29785 32087/32985/29788 32092/32986/29789 32088/32987/29790
+f 32088/32987/29790 32092/32986/29789 38581/32988/29791 38582/32989/29792
+f 32087/32985/29788 36923/32585/29393 36922/32584/29392 32092/32986/29789
+f 32092/32986/29789 36922/32584/29392 40223/32587/29395 38581/32988/29791
+f 32086/32982/29785 32088/32987/29790 32093/32990/29793 32089/32991/29794
+f 32089/32991/29794 32093/32990/29793 36994/32992/29795 36995/32993/29796
+f 32088/32987/29790 38582/32989/29792 38583/32994/29797 32093/32990/29793
+f 32093/32990/29793 38583/32994/29797 40247/32995/29798 36994/32992/29795
+f 32086/32982/29785 32089/32991/29794 32094/32996/29799 32090/32983/29786
+f 32090/32983/29786 32094/32996/29799 38580/32978/29781 38579/32973/29776
+f 32089/32991/29794 36995/32993/29796 36996/32997/29800 32094/32996/29799
+f 32094/32996/29799 36996/32997/29800 40246/32979/29782 38580/32978/29781
+f 32095/32998/29801 32099/32999/29802 32100/33000/29803 32096/33001/29804
+f 32096/33001/29804 32100/33000/29803 36927/32609/29417 36926/32605/29413
+f 32099/32999/29802 38582/32989/29792 38581/32988/29791 32100/33000/29803
+f 32100/33000/29803 38581/32988/29791 40223/32587/29395 36927/32609/29417
+f 32095/32998/29801 32096/33001/29804 32101/33002/29805 32097/33003/29806
+f 32097/33003/29806 32101/33002/29805 38584/33004/29807 38585/33005/29808
+f 32096/33001/29804 36926/32605/29413 36925/32604/29412 32101/33002/29805
+f 32101/33002/29805 36925/32604/29412 40224/32607/29415 38584/33004/29807
+f 32095/32998/29801 32097/33003/29806 32102/33006/29809 32098/33007/29810
+f 32098/33007/29810 32102/33006/29809 36997/33008/29811 36998/33009/29812
+f 32097/33003/29806 38585/33005/29808 38586/33010/29813 32102/33006/29809
+f 32102/33006/29809 38586/33010/29813 40248/33011/29814 36997/33008/29811
+f 32095/32998/29801 32098/33007/29810 32103/33012/29815 32099/32999/29802
+f 32099/32999/29802 32103/33012/29815 38583/32994/29797 38582/32989/29792
+f 32098/33007/29810 36998/33009/29812 36999/33013/29816 32103/33012/29815
+f 32103/33012/29815 36999/33013/29816 40247/32995/29798 38583/32994/29797
+f 32104/33014/29817 32108/33015/29818 32109/33016/29819 32105/33017/29820
+f 32105/33017/29820 32109/33016/29819 36930/32629/29437 36929/32625/29433
+f 32108/33015/29818 38585/33005/29808 38584/33004/29807 32109/33016/29819
+f 32109/33016/29819 38584/33004/29807 40224/32607/29415 36930/32629/29437
+f 32104/33014/29817 32105/33017/29820 32110/33018/29821 32106/33019/29822
+f 32106/33019/29822 32110/33018/29821 38587/33020/29823 38588/33021/29824
+f 32105/33017/29820 36929/32625/29433 36928/32624/29432 32110/33018/29821
+f 32110/33018/29821 36928/32624/29432 40225/32627/29435 38587/33020/29823
+f 32104/33014/29817 32106/33019/29822 32111/33022/29825 32107/33023/29826
+f 32107/33023/29826 32111/33022/29825 37000/33024/29827 37001/33025/29828
+f 32106/33019/29822 38588/33021/29824 38589/33026/29829 32111/33022/29825
+f 32111/33022/29825 38589/33026/29829 40249/33027/29830 37000/33024/29827
+f 32104/33014/29817 32107/33023/29826 32112/33028/29831 32108/33015/29818
+f 32108/33015/29818 32112/33028/29831 38586/33010/29813 38585/33005/29808
+f 32107/33023/29826 37001/33025/29828 37002/33029/29832 32112/33028/29831
+f 32112/33028/29831 37002/33029/29832 40248/33011/29814 38586/33010/29813
+f 32113/33030/29833 32117/33031/29834 32118/33032/29835 32114/33033/29836
+f 32114/33033/29836 32118/33032/29835 36933/32649/29457 36932/32645/29453
+f 32117/33031/29834 38588/33021/29824 38587/33020/29823 32118/33032/29835
+f 32118/33032/29835 38587/33020/29823 40225/32627/29435 36933/32649/29457
+f 32113/33030/29833 32114/33033/29836 32119/33034/29837 32115/33035/29838
+f 32115/33035/29838 32119/33034/29837 38590/33036/29839 38591/33037/29840
+f 32114/33033/29836 36932/32645/29453 36931/32644/29452 32119/33034/29837
+f 32119/33034/29837 36931/32644/29452 40226/32647/29455 38590/33036/29839
+f 32113/33030/29833 32115/33035/29838 32120/33038/29841 32116/33039/29842
+f 32116/33039/29842 32120/33038/29841 37003/33040/29843 37004/33041/29844
+f 32115/33035/29838 38591/33037/29840 38592/33042/29845 32120/33038/29841
+f 32120/33038/29841 38592/33042/29845 40250/33043/29846 37003/33040/29843
+f 32113/33030/29833 32116/33039/29842 32121/33044/29847 32117/33031/29834
+f 32117/33031/29834 32121/33044/29847 38589/33026/29829 38588/33021/29824
+f 32116/33039/29842 37004/33041/29844 37005/33045/29848 32121/33044/29847
+f 32121/33044/29847 37005/33045/29848 40249/33027/29830 38589/33026/29829
+f 32122/33046/29849 32126/33047/29850 32127/33048/29851 32123/33049/29852
+f 32123/33049/29852 32127/33048/29851 36936/32669/29477 36935/32665/29473
+f 32126/33047/29850 38591/33037/29840 38590/33036/29839 32127/33048/29851
+f 32127/33048/29851 38590/33036/29839 40226/32647/29455 36936/32669/29477
+f 32122/33046/29849 32123/33049/29852 32128/33050/29853 32124/33051/29854
+f 32124/33051/29854 32128/33050/29853 38593/33052/29855 38594/33053/29856
+f 32123/33049/29852 36935/32665/29473 36934/32664/29472 32128/33050/29853
+f 32128/33050/29853 36934/32664/29472 40227/32667/29475 38593/33052/29855
+f 32122/33046/29849 32124/33051/29854 32129/33054/29857 32125/33055/29858
+f 32125/33055/29858 32129/33054/29857 37006/33056/29859 37007/33057/29860
+f 32124/33051/29854 38594/33053/29856 38595/33058/29861 32129/33054/29857
+f 32129/33054/29857 38595/33058/29861 40251/33059/29862 37006/33056/29859
+f 32122/33046/29849 32125/33055/29858 32130/33060/29863 32126/33047/29850
+f 32126/33047/29850 32130/33060/29863 38592/33042/29845 38591/33037/29840
+f 32125/33055/29858 37007/33057/29860 37008/33061/29864 32130/33060/29863
+f 32130/33060/29863 37008/33061/29864 40250/33043/29846 38592/33042/29845
+f 32131/33062/29865 32135/33063/29866 32136/33064/29867 32132/33065/29868
+f 32132/33065/29868 32136/33064/29867 36939/32689/29492 36938/32685/29490
+f 32135/33063/29866 38594/33053/29856 38593/33052/29855 32136/33064/29867
+f 32136/33064/29867 38593/33052/29855 40227/32667/29475 36939/32689/29492
+f 32131/33062/29865 32132/33065/29868 32137/33066/29869 32133/33067/29870
+f 32133/33067/29870 32137/33066/29869 38526/33068/29498 38525/33069/29497
+f 32132/33065/29868 36938/32685/29490 36937/32684/29489 32137/33066/29869
+f 32137/33066/29869 36937/32684/29489 40204/32687/29037 38526/33068/29498
+f 32131/33062/29865 32133/33067/29870 32138/33070/29871 32134/33071/29872
+f 32134/33071/29872 32138/33070/29871 37009/33072/29873 37010/33073/29874
+f 32133/33067/29870 38525/33069/29497 38524/33074/29510 32138/33070/29871
+f 32138/33070/29871 38524/33074/29510 40228/33075/29512 37009/33072/29873
+f 32131/33062/29865 32134/33071/29872 32139/33076/29875 32135/33063/29866
+f 32135/33063/29866 32139/33076/29875 38595/33058/29861 38594/33053/29856
+f 32134/33071/29872 37010/33073/29874 37011/33077/29876 32139/33076/29875
+f 32139/33076/29875 37011/33077/29876 40251/33059/29862 38595/33058/29861
+f 32140/33078/29877 32144/33079/29878 32145/33080/29879 32141/33081/29880
+f 32141/33081/29880 32145/33080/29879 36942/32708/29511 36941/32703/29506
+f 32144/33079/29878 38597/33082/29881 38598/33083/29882 32145/33080/29879
+f 32145/33080/29879 38598/33083/29882 40228/32709/29512 36942/32708/29511
+f 32140/33078/29877 32141/33081/29880 32146/33084/29883 32142/33085/29884
+f 32142/33085/29884 32146/33084/29883 38599/33086/29885 38600/33087/29886
+f 32141/33081/29880 36941/32703/29506 36940/32702/29505 32146/33084/29883
+f 32146/33084/29883 36940/32702/29505 40229/32705/29508 38599/33086/29885
+f 32140/33078/29877 32142/33085/29884 32147/33088/29887 32143/33089/29888
+f 32143/33089/29888 32147/33088/29887 37012/33090/29889 37013/33091/29890
+f 32142/33085/29884 38600/33087/29886 38601/33092/29891 32147/33088/29887
+f 32147/33088/29887 38601/33092/29891 40253/33093/29892 37012/33090/29889
+f 32140/33078/29877 32143/33089/29888 32148/33094/29893 32144/33079/29878
+f 32144/33079/29878 32148/33094/29893 38596/33095/29894 38597/33082/29881
+f 32143/33089/29888 37013/33091/29890 37014/33096/29895 32148/33094/29893
+f 32148/33094/29893 37014/33096/29895 40252/33097/29896 38596/33095/29894
+f 32149/33098/29897 32153/33099/29898 32154/33100/29899 32150/33101/29900
+f 32150/33101/29900 32154/33100/29899 36945/32725/29528 36944/32721/29524
+f 32153/33099/29898 38600/33087/29886 38599/33086/29885 32154/33100/29899
+f 32154/33100/29899 38599/33086/29885 40229/32705/29508 36945/32725/29528
+f 32149/33098/29897 32150/33101/29900 32155/33102/29901 32151/33103/29902
+f 32151/33103/29902 32155/33102/29901 38602/33104/29903 38603/33105/29904
+f 32150/33101/29900 36944/32721/29524 36943/32720/29523 32155/33102/29901
+f 32155/33102/29901 36943/32720/29523 40230/32723/29526 38602/33104/29903
+f 32149/33098/29897 32151/33103/29902 32156/33106/29905 32152/33107/29906
+f 32152/33107/29906 32156/33106/29905 37015/33108/29907 37016/33109/29908
+f 32151/33103/29902 38603/33105/29904 38604/33110/29909 32156/33106/29905
+f 32156/33106/29905 38604/33110/29909 40254/33111/29910 37015/33108/29907
+f 32149/33098/29897 32152/33107/29906 32157/33112/29911 32153/33099/29898
+f 32153/33099/29898 32157/33112/29911 38601/33092/29891 38600/33087/29886
+f 32152/33107/29906 37016/33109/29908 37017/33113/29912 32157/33112/29911
+f 32157/33112/29911 37017/33113/29912 40253/33093/29892 38601/33092/29891
+f 32158/33114/29913 32162/33115/29914 32163/33116/29915 32159/33117/29916
+f 32159/33117/29916 32163/33116/29915 36948/32741/29544 36947/32737/29540
+f 32162/33115/29914 38603/33105/29904 38602/33104/29903 32163/33116/29915
+f 32163/33116/29915 38602/33104/29903 40230/32723/29526 36948/32741/29544
+f 32158/33114/29913 32159/33117/29916 32164/33118/29917 32160/33119/29918
+f 32160/33119/29918 32164/33118/29917 38605/33120/29919 38606/33121/29920
+f 32159/33117/29916 36947/32737/29540 36946/32736/29539 32164/33118/29917
+f 32164/33118/29917 36946/32736/29539 40231/32739/29542 38605/33120/29919
+f 32158/33114/29913 32160/33119/29918 32165/33122/29921 32161/33123/29922
+f 32161/33123/29922 32165/33122/29921 37018/33124/29923 37019/33125/29924
+f 32160/33119/29918 38606/33121/29920 38607/33126/29925 32165/33122/29921
+f 32165/33122/29921 38607/33126/29925 40255/33127/29926 37018/33124/29923
+f 32158/33114/29913 32161/33123/29922 32166/33128/29927 32162/33115/29914
+f 32162/33115/29914 32166/33128/29927 38604/33110/29909 38603/33105/29904
+f 32161/33123/29922 37019/33125/29924 37020/33129/29928 32166/33128/29927
+f 32166/33128/29927 37020/33129/29928 40254/33111/29910 38604/33110/29909
+f 32167/33130/29929 32171/33131/29930 32172/33132/29931 32168/33133/29932
+f 32168/33133/29932 32172/33132/29931 36951/32757/29560 36950/32753/29556
+f 32171/33131/29930 38606/33121/29920 38605/33120/29919 32172/33132/29931
+f 32172/33132/29931 38605/33120/29919 40231/32739/29542 36951/32757/29560
+f 32167/33130/29929 32168/33133/29932 32173/33134/29933 32169/33135/29934
+f 32169/33135/29934 32173/33134/29933 38608/33136/29935 38609/33137/29936
+f 32168/33133/29932 36950/32753/29556 36949/32752/29555 32173/33134/29933
+f 32173/33134/29933 36949/32752/29555 40232/32755/29558 38608/33136/29935
+f 32167/33130/29929 32169/33135/29934 32174/33138/29937 32170/33139/29938
+f 32170/33139/29938 32174/33138/29937 37021/33140/29939 37022/33141/29940
+f 32169/33135/29934 38609/33137/29936 38610/33142/29941 32174/33138/29937
+f 32174/33138/29937 38610/33142/29941 40256/33143/29942 37021/33140/29939
+f 32167/33130/29929 32170/33139/29938 32175/33144/29943 32171/33131/29930
+f 32171/33131/29930 32175/33144/29943 38607/33126/29925 38606/33121/29920
+f 32170/33139/29938 37022/33141/29940 37023/33145/29944 32175/33144/29943
+f 32175/33144/29943 37023/33145/29944 40255/33127/29926 38607/33126/29925
+f 32176/33146/29945 32180/33147/29946 32181/33148/29947 32177/33149/29948
+f 32177/33149/29948 32181/33148/29947 36954/32773/29576 36953/32769/29572
+f 32180/33147/29946 38609/33137/29936 38608/33136/29935 32181/33148/29947
+f 32181/33148/29947 38608/33136/29935 40232/32755/29558 36954/32773/29576
+f 32176/33146/29945 32177/33149/29948 32182/33150/29949 32178/33151/29950
+f 32178/33151/29950 32182/33150/29949 38611/33152/29951 38612/33153/29952
+f 32177/33149/29948 36953/32769/29572 36952/32768/29571 32182/33150/29949
+f 32182/33150/29949 36952/32768/29571 40233/32771/29574 38611/33152/29951
+f 32176/33146/29945 32178/33151/29950 32183/33154/29953 32179/33155/29954
+f 32179/33155/29954 32183/33154/29953 37024/33156/29955 37025/33157/29956
+f 32178/33151/29950 38612/33153/29952 38613/33158/29957 32183/33154/29953
+f 32183/33154/29953 38613/33158/29957 40257/33159/29958 37024/33156/29955
+f 32176/33146/29945 32179/33155/29954 32184/33160/29959 32180/33147/29946
+f 32180/33147/29946 32184/33160/29959 38610/33142/29941 38609/33137/29936
+f 32179/33155/29954 37025/33157/29956 37026/33161/29960 32184/33160/29959
+f 32184/33160/29959 37026/33161/29960 40256/33143/29942 38610/33142/29941
+f 32185/33162/29961 32189/33163/29962 32190/33164/29963 32186/33165/29964
+f 32186/33165/29964 32190/33164/29963 36957/32789/29592 36956/32785/29588
+f 32189/33163/29962 38612/33153/29952 38611/33152/29951 32190/33164/29963
+f 32190/33164/29963 38611/33152/29951 40233/32771/29574 36957/32789/29592
+f 32185/33162/29961 32186/33165/29964 32191/33166/29965 32187/33167/29966
+f 32187/33167/29966 32191/33166/29965 38614/33168/29967 38615/33169/29968
+f 32186/33165/29964 36956/32785/29588 36955/32784/29587 32191/33166/29965
+f 32191/33166/29965 36955/32784/29587 40234/32787/29590 38614/33168/29967
+f 32185/33162/29961 32187/33167/29966 32192/33170/29969 32188/33171/29970
+f 32188/33171/29970 32192/33170/29969 37027/33172/29971 37028/33173/29972
+f 32187/33167/29966 38615/33169/29968 38616/33174/29973 32192/33170/29969
+f 32192/33170/29969 38616/33174/29973 40258/33175/29974 37027/33172/29971
+f 32185/33162/29961 32188/33171/29970 32193/33176/29975 32189/33163/29962
+f 32189/33163/29962 32193/33176/29975 38613/33158/29957 38612/33153/29952
+f 32188/33171/29970 37028/33173/29972 37029/33177/29976 32193/33176/29975
+f 32193/33176/29975 37029/33177/29976 40257/33159/29958 38613/33158/29957
+f 32194/33178/29977 32198/33179/29978 32199/33180/29979 32195/33181/29980
+f 32195/33181/29980 32199/33180/29979 36960/32805/29608 36959/32801/29604
+f 32198/33179/29978 38615/33169/29968 38614/33168/29967 32199/33180/29979
+f 32199/33180/29979 38614/33168/29967 40234/32787/29590 36960/32805/29608
+f 32194/33178/29977 32195/33181/29980 32200/33182/29981 32196/33183/29982
+f 32196/33183/29982 32200/33182/29981 38617/33184/29983 38618/33185/29984
+f 32195/33181/29980 36959/32801/29604 36958/32800/29603 32200/33182/29981
+f 32200/33182/29981 36958/32800/29603 40235/32803/29606 38617/33184/29983
+f 32194/33178/29977 32196/33183/29982 32201/33186/29985 32197/33187/29986
+f 32197/33187/29986 32201/33186/29985 37030/33188/29987 37031/33189/29988
+f 32196/33183/29982 38618/33185/29984 38619/33190/29989 32201/33186/29985
+f 32201/33186/29985 38619/33190/29989 40259/33191/29990 37030/33188/29987
+f 32194/33178/29977 32197/33187/29986 32202/33192/29991 32198/33179/29978
+f 32198/33179/29978 32202/33192/29991 38616/33174/29973 38615/33169/29968
+f 32197/33187/29986 37031/33189/29988 37032/33193/29992 32202/33192/29991
+f 32202/33192/29991 37032/33193/29992 40258/33175/29974 38616/33174/29973
+f 32203/33194/29993 32207/33195/29994 32208/33196/29995 32204/33197/29996
+f 32204/33197/29996 32208/33196/29995 36963/32821/29624 36962/32817/29620
+f 32207/33195/29994 38618/33185/29984 38617/33184/29983 32208/33196/29995
+f 32208/33196/29995 38617/33184/29983 40235/32803/29606 36963/32821/29624
+f 32203/33194/29993 32204/33197/29996 32209/33198/29997 32205/33199/29998
+f 32205/33199/29998 32209/33198/29997 38620/33200/29999 38621/33201/30000
+f 32204/33197/29996 36962/32817/29620 36961/32816/29619 32209/33198/29997
+f 32209/33198/29997 36961/32816/29619 40236/32819/29622 38620/33200/29999
+f 32203/33194/29993 32205/33199/29998 32210/33202/30001 32206/33203/30002
+f 32206/33203/30002 32210/33202/30001 37033/33204/30003 37034/33205/30004
+f 32205/33199/29998 38621/33201/30000 38622/33206/30005 32210/33202/30001
+f 32210/33202/30001 38622/33206/30005 40260/33207/30006 37033/33204/30003
+f 32203/33194/29993 32206/33203/30002 32211/33208/30007 32207/33195/29994
+f 32207/33195/29994 32211/33208/30007 38619/33190/29989 38618/33185/29984
+f 32206/33203/30002 37034/33205/30004 37035/33209/30008 32211/33208/30007
+f 32211/33208/30007 37035/33209/30008 40259/33191/29990 38619/33190/29989
+f 32212/33210/30009 32216/33211/30010 32217/33212/30011 32213/33213/30012
+f 32213/33213/30012 32217/33212/30011 36966/32837/29640 36965/32833/29636
+f 32216/33211/30010 38621/33201/30000 38620/33200/29999 32217/33212/30011
+f 32217/33212/30011 38620/33200/29999 40236/32819/29622 36966/32837/29640
+f 32212/33210/30009 32213/33213/30012 32218/33214/30013 32214/33215/30014
+f 32214/33215/30014 32218/33214/30013 38623/33216/30015 38624/33217/30016
+f 32213/33213/30012 36965/32833/29636 36964/32832/29635 32218/33214/30013
+f 32218/33214/30013 36964/32832/29635 40237/32835/29638 38623/33216/30015
+f 32212/33210/30009 32214/33215/30014 32219/33218/30017 32215/33219/30018
+f 32215/33219/30018 32219/33218/30017 37036/33220/30019 37037/33221/30020
+f 32214/33215/30014 38624/33217/30016 38625/33222/30021 32219/33218/30017
+f 32219/33218/30017 38625/33222/30021 40261/33223/30022 37036/33220/30019
+f 32212/33210/30009 32215/33219/30018 32220/33224/30023 32216/33211/30010
+f 32216/33211/30010 32220/33224/30023 38622/33206/30005 38621/33201/30000
+f 32215/33219/30018 37037/33221/30020 37038/3569/30024 32220/33224/30023
+f 32220/33224/30023 37038/3569/30024 40260/33207/30006 38622/33206/30005
+f 32221/33225/30025 32225/33226/30026 32226/33227/30027 32222/33228/30028
+f 32222/33228/30028 32226/33227/30027 36969/32853/29656 36968/32849/29652
+f 32225/33226/30026 38624/33217/30016 38623/33216/30015 32226/33227/30027
+f 32226/33227/30027 38623/33216/30015 40237/32835/29638 36969/32853/29656
+f 32221/33225/30025 32222/33228/30028 32227/33229/30029 32223/33230/30030
+f 32223/33230/30030 32227/33229/30029 38626/33231/30031 38627/33232/30032
+f 32222/33228/30028 36968/32849/29652 36967/32848/29651 32227/33229/30029
+f 32227/33229/30029 36967/32848/29651 40238/32851/29654 38626/33231/30031
+f 32221/33225/30025 32223/33230/30030 32228/33233/30033 32224/33234/30034
+f 32224/33234/30034 32228/33233/30033 37039/33235/30035 37040/33236/30036
+f 32223/33230/30030 38627/33232/30032 38628/33237/30037 32228/33233/30033
+f 32228/33233/30033 38628/33237/30037 40262/33238/30038 37039/33235/30035
+f 32221/33225/30025 32224/33234/30034 32229/33239/30039 32225/33226/30026
+f 32225/33226/30026 32229/33239/30039 38625/33222/30021 38624/33217/30016
+f 32224/33234/30034 37040/33236/30036 37041/33240/30040 32229/33239/30039
+f 32229/33239/30039 37041/33240/30040 40261/33223/30022 38625/33222/30021
+f 32230/33241/30041 32234/33242/30042 32235/33243/30043 32231/33244/30044
+f 32231/33244/30044 32235/33243/30043 36972/32869/29672 36971/32865/29668
+f 32234/33242/30042 38627/33232/30032 38626/33231/30031 32235/33243/30043
+f 32235/33243/30043 38626/33231/30031 40238/32851/29654 36972/32869/29672
+f 32230/33241/30041 32231/33244/30044 32236/33245/30045 32232/33246/30046
+f 32232/33246/30046 32236/33245/30045 38629/33247/30047 38630/33248/30048
+f 32231/33244/30044 36971/32865/29668 36970/32864/29667 32236/33245/30045
+f 32236/33245/30045 36970/32864/29667 40239/32867/29670 38629/33247/30047
+f 32230/33241/30041 32232/33246/30046 32237/33249/30049 32233/33250/30050
+f 32233/33250/30050 32237/33249/30049 37042/33251/30051 37043/33252/30052
+f 32232/33246/30046 38630/33248/30048 38631/33253/30053 32237/33249/30049
+f 32237/33249/30049 38631/33253/30053 40263/33254/30054 37042/33251/30051
+f 32230/33241/30041 32233/33250/30050 32238/33255/30055 32234/33242/30042
+f 32234/33242/30042 32238/33255/30055 38628/33237/30037 38627/33232/30032
+f 32233/33250/30050 37043/33252/30052 37044/3521/30056 32238/33255/30055
+f 32238/33255/30055 37044/3521/30056 40262/33238/30038 38628/33237/30037
+f 32239/33256/30057 32243/33257/30058 32244/33258/30059 32240/33259/30060
+f 32240/33259/30060 32244/33258/30059 36975/32885/29688 36974/32881/29684
+f 32243/33257/30058 38630/33248/30048 38629/33247/30047 32244/33258/30059
+f 32244/33258/30059 38629/33247/30047 40239/32867/29670 36975/32885/29688
+f 32239/33256/30057 32240/33259/30060 32245/33260/30061 32241/33261/30062
+f 32241/33261/30062 32245/33260/30061 38632/33262/30063 38633/33263/30064
+f 32240/33259/30060 36974/32881/29684 36973/32880/29683 32245/33260/30061
+f 32245/33260/30061 36973/32880/29683 40240/32883/29686 38632/33262/30063
+f 32239/33256/30057 32241/33261/30062 32246/33264/30065 32242/33265/30066
+f 32242/33265/30066 32246/33264/30065 37045/33266/30067 37046/33267/30068
+f 32241/33261/30062 38633/33263/30064 38634/33268/30069 32246/33264/30065
+f 32246/33264/30065 38634/33268/30069 40264/33269/30070 37045/33266/30067
+f 32239/33256/30057 32242/33265/30066 32247/33270/30071 32243/33257/30058
+f 32243/33257/30058 32247/33270/30071 38631/33253/30053 38630/33248/30048
+f 32242/33265/30066 37046/33267/30068 37047/33271/30072 32247/33270/30071
+f 32247/33270/30071 37047/33271/30072 40263/33254/30054 38631/33253/30053
+f 32248/33272/30073 32252/33273/30074 32253/33274/30075 32249/33275/30076
+f 32249/33275/30076 32253/33274/30075 36978/32901/29704 36977/32897/29700
+f 32252/33273/30074 38633/33263/30064 38632/33262/30063 32253/33274/30075
+f 32253/33274/30075 38632/33262/30063 40240/32883/29686 36978/32901/29704
+f 32248/33272/30073 32249/33275/30076 32254/33276/30077 32250/33277/30078
+f 32250/33277/30078 32254/33276/30077 38635/33278/30079 38636/33279/30080
+f 32249/33275/30076 36977/32897/29700 36976/32896/29699 32254/33276/30077
+f 32254/33276/30077 36976/32896/29699 40241/32899/29702 38635/33278/30079
+f 32248/33272/30073 32250/33277/30078 32255/33280/30081 32251/33281/30082
+f 32251/33281/30082 32255/33280/30081 37048/33282/30083 37049/33283/30084
+f 32250/33277/30078 38636/33279/30080 38637/33284/30085 32255/33280/30081
+f 32255/33280/30081 38637/33284/30085 40265/33285/30086 37048/33282/30083
+f 32248/33272/30073 32251/33281/30082 32256/33286/30087 32252/33273/30074
+f 32252/33273/30074 32256/33286/30087 38634/33268/30069 38633/33263/30064
+f 32251/33281/30082 37049/33283/30084 37050/33287/30088 32256/33286/30087
+f 32256/33286/30087 37050/33287/30088 40264/33269/30070 38634/33268/30069
+f 32257/33288/30089 32261/33289/30090 32262/33290/30091 32258/33291/30092
+f 32258/33291/30092 32262/33290/30091 36981/32917/29720 36980/32913/29716
+f 32261/33289/30090 38636/33279/30080 38635/33278/30079 32262/33290/30091
+f 32262/33290/30091 38635/33278/30079 40241/32899/29702 36981/32917/29720
+f 32257/33288/30089 32258/33291/30092 32263/33292/30093 32259/33293/30094
+f 32259/33293/30094 32263/33292/30093 38638/33294/30095 38639/33295/30096
+f 32258/33291/30092 36980/32913/29716 36979/32912/29715 32263/33292/30093
+f 32263/33292/30093 36979/32912/29715 40242/32915/29718 38638/33294/30095
+f 32257/33288/30089 32259/33293/30094 32264/33296/30097 32260/33297/30098
+f 32260/33297/30098 32264/33296/30097 37051/33298/30099 37052/33299/30100
+f 32259/33293/30094 38639/33295/30096 38640/33300/30101 32264/33296/30097
+f 32264/33296/30097 38640/33300/30101 40266/33301/30102 37051/33298/30099
+f 32257/33288/30089 32260/33297/30098 32265/33302/30103 32261/33289/30090
+f 32261/33289/30090 32265/33302/30103 38637/33284/30085 38636/33279/30080
+f 32260/33297/30098 37052/33299/30100 37053/33303/30104 32265/33302/30103
+f 32265/33302/30103 37053/33303/30104 40265/33285/30086 38637/33284/30085
+f 32266/33304/30105 32270/33305/30106 32271/33306/30107 32267/33307/30108
+f 32267/33307/30108 32271/33306/30107 36984/32933/29736 36983/32929/29732
+f 32270/33305/30106 38639/33295/30096 38638/33294/30095 32271/33306/30107
+f 32271/33306/30107 38638/33294/30095 40242/32915/29718 36984/32933/29736
+f 32266/33304/30105 32267/33307/30108 32272/33308/30109 32268/33309/30110
+f 32268/33309/30110 32272/33308/30109 38641/33310/30111 38642/33311/30112
+f 32267/33307/30108 36983/32929/29732 36982/32928/29731 32272/33308/30109
+f 32272/33308/30109 36982/32928/29731 40243/32931/29734 38641/33310/30111
+f 32266/33304/30105 32268/33309/30110 32273/33312/30113 32269/33313/30114
+f 32269/33313/30114 32273/33312/30113 37054/33314/30115 37055/33315/30116
+f 32268/33309/30110 38642/33311/30112 38643/33316/30117 32273/33312/30113
+f 32273/33312/30113 38643/33316/30117 40267/33317/30118 37054/33314/30115
+f 32266/33304/30105 32269/33313/30114 32274/33318/30119 32270/33305/30106
+f 32270/33305/30106 32274/33318/30119 38640/33300/30101 38639/33295/30096
+f 32269/33313/30114 37055/33315/30116 37056/33319/30120 32274/33318/30119
+f 32274/33318/30119 37056/33319/30120 40266/33301/30102 38640/33300/30101
+f 32275/33320/30121 32279/33321/30122 32280/33322/30123 32276/33323/30124
+f 32276/33323/30124 32280/33322/30123 36987/32949/29752 36986/32945/29748
+f 32279/33321/30122 38642/33311/30112 38641/33310/30111 32280/33322/30123
+f 32280/33322/30123 38641/33310/30111 40243/32931/29734 36987/32949/29752
+f 32275/33320/30121 32276/33323/30124 32281/33324/30125 32277/33325/30126
+f 32277/33325/30126 32281/33324/30125 38644/33326/30127 38645/33327/30128
+f 32276/33323/30124 36986/32945/29748 36985/32944/29747 32281/33324/30125
+f 32281/33324/30125 36985/32944/29747 40244/32947/29750 38644/33326/30127
+f 32275/33320/30121 32277/33325/30126 32282/33328/30129 32278/33329/30130
+f 32278/33329/30130 32282/33328/30129 37057/33330/30131 37058/33331/30132
+f 32277/33325/30126 38645/33327/30128 38646/33332/30133 32282/33328/30129
+f 32282/33328/30129 38646/33332/30133 40268/33333/30134 37057/33330/30131
+f 32275/33320/30121 32278/33329/30130 32283/33334/30135 32279/33321/30122
+f 32279/33321/30122 32283/33334/30135 38643/33316/30117 38642/33311/30112
+f 32278/33329/30130 37058/33331/30132 37059/33335/30136 32283/33334/30135
+f 32283/33334/30135 37059/33335/30136 40267/33317/30118 38643/33316/30117
+f 32284/33336/30137 32288/33337/30138 32289/33338/30139 32285/33339/30140
+f 32285/33339/30140 32289/33338/30139 36990/32965/29768 36989/32961/29764
+f 32288/33337/30138 38645/33327/30128 38644/33326/30127 32289/33338/30139
+f 32289/33338/30139 38644/33326/30127 40244/32947/29750 36990/32965/29768
+f 32284/33336/30137 32285/33339/30140 32290/33340/30141 32286/33341/30142
+f 32286/33341/30142 32290/33340/30141 38647/33342/30143 38648/33343/30144
+f 32285/33339/30140 36989/32961/29764 36988/32960/29763 32290/33340/30141
+f 32290/33340/30141 36988/32960/29763 40245/32963/29766 38647/33342/30143
+f 32284/33336/30137 32286/33341/30142 32291/33344/30145 32287/33345/30146
+f 32287/33345/30146 32291/33344/30145 37060/33346/30147 37061/33347/30148
+f 32286/33341/30142 38648/33343/30144 38649/33348/30149 32291/33344/30145
+f 32291/33344/30145 38649/33348/30149 40269/33349/30150 37060/33346/30147
+f 32284/33336/30137 32287/33345/30146 32292/33350/30151 32288/33337/30138
+f 32288/33337/30138 32292/33350/30151 38646/33332/30133 38645/33327/30128
+f 32287/33345/30146 37061/33347/30148 37062/33351/30152 32292/33350/30151
+f 32292/33350/30151 37062/33351/30152 40268/33333/30134 38646/33332/30133
+f 32293/33352/30153 32297/33353/30154 32298/33354/30155 32294/33355/30156
+f 32294/33355/30156 32298/33354/30155 36993/32981/29784 36992/32977/29780
+f 32297/33353/30154 38648/33343/30144 38647/33342/30143 32298/33354/30155
+f 32298/33354/30155 38647/33342/30143 40245/32963/29766 36993/32981/29784
+f 32293/33352/30153 32294/33355/30156 32299/33356/30157 32295/33357/30158
+f 32295/33357/30158 32299/33356/30157 38650/33358/30159 38651/33359/30160
+f 32294/33355/30156 36992/32977/29780 36991/32976/29779 32299/33356/30157
+f 32299/33356/30157 36991/32976/29779 40246/32979/29782 38650/33358/30159
+f 32293/33352/30153 32295/33357/30158 32300/33360/30161 32296/33361/30162
+f 32296/33361/30162 32300/33360/30161 37063/33362/30163 37064/33363/30164
+f 32295/33357/30158 38651/33359/30160 38652/33364/30165 32300/33360/30161
+f 32300/33360/30161 38652/33364/30165 40270/33365/30166 37063/33362/30163
+f 32293/33352/30153 32296/33361/30162 32301/33366/30167 32297/33353/30154
+f 32297/33353/30154 32301/33366/30167 38649/33348/30149 38648/33343/30144
+f 32296/33361/30162 37064/33363/30164 37065/33367/30168 32301/33366/30167
+f 32301/33366/30167 37065/33367/30168 40269/33349/30150 38649/33348/30149
+f 32302/33368/30169 32306/33369/30170 32307/33370/30171 32303/33371/30172
+f 32303/33371/30172 32307/33370/30171 36996/32997/29800 36995/32993/29796
+f 32306/33369/30170 38651/33359/30160 38650/33358/30159 32307/33370/30171
+f 32307/33370/30171 38650/33358/30159 40246/32979/29782 36996/32997/29800
+f 32302/33368/30169 32303/33371/30172 32308/33372/30173 32304/33373/30174
+f 32304/33373/30174 32308/33372/30173 38653/33374/30175 38654/33375/30176
+f 32303/33371/30172 36995/32993/29796 36994/32992/29795 32308/33372/30173
+f 32308/33372/30173 36994/32992/29795 40247/32995/29798 38653/33374/30175
+f 32302/33368/30169 32304/33373/30174 32309/33376/30177 32305/33377/30178
+f 32305/33377/30178 32309/33376/30177 37066/33378/30179 37067/33379/30180
+f 32304/33373/30174 38654/33375/30176 38655/33380/30181 32309/33376/30177
+f 32309/33376/30177 38655/33380/30181 40271/33381/30182 37066/33378/30179
+f 32302/33368/30169 32305/33377/30178 32310/33382/30183 32306/33369/30170
+f 32306/33369/30170 32310/33382/30183 38652/33364/30165 38651/33359/30160
+f 32305/33377/30178 37067/33379/30180 37068/33383/30184 32310/33382/30183
+f 32310/33382/30183 37068/33383/30184 40270/33365/30166 38652/33364/30165
+f 32311/33384/30185 32315/33385/30186 32316/33386/30187 32312/33387/30188
+f 32312/33387/30188 32316/33386/30187 36999/33013/29816 36998/33009/29812
+f 32315/33385/30186 38654/33375/30176 38653/33374/30175 32316/33386/30187
+f 32316/33386/30187 38653/33374/30175 40247/32995/29798 36999/33013/29816
+f 32311/33384/30185 32312/33387/30188 32317/33388/30189 32313/33389/30190
+f 32313/33389/30190 32317/33388/30189 38656/33390/30191 38657/33391/30192
+f 32312/33387/30188 36998/33009/29812 36997/33008/29811 32317/33388/30189
+f 32317/33388/30189 36997/33008/29811 40248/33011/29814 38656/33390/30191
+f 32311/33384/30185 32313/33389/30190 32318/33392/30193 32314/33393/30194
+f 32314/33393/30194 32318/33392/30193 37069/33394/30195 37070/33395/30196
+f 32313/33389/30190 38657/33391/30192 38658/33396/30197 32318/33392/30193
+f 32318/33392/30193 38658/33396/30197 40272/33397/30198 37069/33394/30195
+f 32311/33384/30185 32314/33393/30194 32319/33398/30199 32315/33385/30186
+f 32315/33385/30186 32319/33398/30199 38655/33380/30181 38654/33375/30176
+f 32314/33393/30194 37070/33395/30196 37071/33399/30200 32319/33398/30199
+f 32319/33398/30199 37071/33399/30200 40271/33381/30182 38655/33380/30181
+f 32320/33400/30201 32324/33401/30202 32325/33402/30203 32321/33403/30204
+f 32321/33403/30204 32325/33402/30203 37002/33029/29832 37001/33025/29828
+f 32324/33401/30202 38657/33391/30192 38656/33390/30191 32325/33402/30203
+f 32325/33402/30203 38656/33390/30191 40248/33011/29814 37002/33029/29832
+f 32320/33400/30201 32321/33403/30204 32326/33404/30205 32322/33405/30206
+f 32322/33405/30206 32326/33404/30205 38659/33406/30207 38660/33407/30208
+f 32321/33403/30204 37001/33025/29828 37000/33024/29827 32326/33404/30205
+f 32326/33404/30205 37000/33024/29827 40249/33027/29830 38659/33406/30207
+f 32320/33400/30201 32322/33405/30206 32327/33408/30209 32323/33409/30210
+f 32323/33409/30210 32327/33408/30209 37072/33410/30211 37073/33411/30212
+f 32322/33405/30206 38660/33407/30208 38661/33412/30213 32327/33408/30209
+f 32327/33408/30209 38661/33412/30213 40273/33413/30214 37072/33410/30211
+f 32320/33400/30201 32323/33409/30210 32328/33414/30215 32324/33401/30202
+f 32324/33401/30202 32328/33414/30215 38658/33396/30197 38657/33391/30192
+f 32323/33409/30210 37073/33411/30212 37074/9564/30216 32328/33414/30215
+f 32328/33414/30215 37074/9564/30216 40272/33397/30198 38658/33396/30197
+f 32329/33415/30217 32333/33416/30218 32334/33417/30219 32330/33418/30220
+f 32330/33418/30220 32334/33417/30219 37005/33045/29848 37004/33041/29844
+f 32333/33416/30218 38660/33407/30208 38659/33406/30207 32334/33417/30219
+f 32334/33417/30219 38659/33406/30207 40249/33027/29830 37005/33045/29848
+f 32329/33415/30217 32330/33418/30220 32335/33419/30221 32331/33420/30222
+f 32331/33420/30222 32335/33419/30221 38662/33421/30223 38663/33422/30224
+f 32330/33418/30220 37004/33041/29844 37003/33040/29843 32335/33419/30221
+f 32335/33419/30221 37003/33040/29843 40250/33043/29846 38662/33421/30223
+f 32329/33415/30217 32331/33420/30222 32336/33423/30225 32332/33424/30226
+f 32332/33424/30226 32336/33423/30225 37075/33425/30227 37076/33426/30228
+f 32331/33420/30222 38663/33422/30224 38664/33427/30229 32336/33423/30225
+f 32336/33423/30225 38664/33427/30229 40274/33428/30230 37075/33425/30227
+f 32329/33415/30217 32332/33424/30226 32337/33429/30231 32333/33416/30218
+f 32333/33416/30218 32337/33429/30231 38661/33412/30213 38660/33407/30208
+f 32332/33424/30226 37076/33426/30228 37077/33430/30232 32337/33429/30231
+f 32337/33429/30231 37077/33430/30232 40273/33413/30214 38661/33412/30213
+f 32338/33431/30233 32342/33432/30234 32343/33433/30235 32339/33434/30236
+f 32339/33434/30236 32343/33433/30235 37008/33061/29864 37007/33057/29860
+f 32342/33432/30234 38663/33422/30224 38662/33421/30223 32343/33433/30235
+f 32343/33433/30235 38662/33421/30223 40250/33043/29846 37008/33061/29864
+f 32338/33431/30233 32339/33434/30236 32344/33435/30237 32340/33436/30238
+f 32340/33436/30238 32344/33435/30237 38665/33437/30239 38666/33438/30240
+f 32339/33434/30236 37007/33057/29860 37006/33056/29859 32344/33435/30237
+f 32344/33435/30237 37006/33056/29859 40251/33059/29862 38665/33437/30239
+f 32338/33431/30233 32340/33436/30238 32345/33439/30241 32341/33440/30242
+f 32341/33440/30242 32345/33439/30241 37078/33441/30243 37079/33442/30244
+f 32340/33436/30238 38666/33438/30240 38667/33443/30245 32345/33439/30241
+f 32345/33439/30241 38667/33443/30245 40275/33444/30246 37078/33441/30243
+f 32338/33431/30233 32341/33440/30242 32346/33445/30247 32342/33432/30234
+f 32342/33432/30234 32346/33445/30247 38664/33427/30229 38663/33422/30224
+f 32341/33440/30242 37079/33442/30244 37080/33446/30248 32346/33445/30247
+f 32346/33445/30247 37080/33446/30248 40274/33428/30230 38664/33427/30229
+f 32347/33447/30249 32351/33448/30250 32352/33449/30251 32348/33450/30252
+f 32348/33450/30252 32352/33449/30251 37011/33077/29876 37010/33073/29874
+f 32351/33448/30250 38666/33438/30240 38665/33437/30239 32352/33449/30251
+f 32352/33449/30251 38665/33437/30239 40251/33059/29862 37011/33077/29876
+f 32347/33447/30249 32348/33450/30252 32353/33451/30253 32349/33452/30254
+f 32349/33452/30254 32353/33451/30253 38598/33453/29882 38597/33454/29881
+f 32348/33450/30252 37010/33073/29874 37009/33072/29873 32353/33451/30253
+f 32353/33451/30253 37009/33072/29873 40228/33075/29512 38598/33453/29882
+f 32347/33447/30249 32349/33452/30254 32354/33455/30255 32350/33456/30256
+f 32350/33456/30256 32354/33455/30255 37081/33457/30257 37082/33458/30258
+f 32349/33452/30254 38597/33454/29881 38596/33459/29894 32354/33455/30255
+f 32354/33455/30255 38596/33459/29894 40252/33460/29896 37081/33457/30257
+f 32347/33447/30249 32350/33456/30256 32355/33461/30259 32351/33448/30250
+f 32351/33448/30250 32355/33461/30259 38667/33443/30245 38666/33438/30240
+f 32350/33456/30256 37082/33458/30258 37083/33462/30260 32355/33461/30259
+f 32355/33461/30259 37083/33462/30260 40275/33444/30246 38667/33443/30245
+f 32356/33463/30261 32360/33464/30262 32361/33465/30263 32357/33466/30264
+f 32357/33466/30264 32361/33465/30263 37014/33096/29895 37013/33091/29890
+f 32360/33464/30262 38669/33467/30265 38670/33468/30266 32361/33465/30263
+f 32361/33465/30263 38670/33468/30266 40252/33097/29896 37014/33096/29895
+f 32356/33463/30261 32357/33466/30264 32362/33469/30267 32358/33470/30268
+f 32358/33470/30268 32362/33469/30267 38671/33471/30269 38672/33472/30270
+f 32357/33466/30264 37013/33091/29890 37012/33090/29889 32362/33469/30267
+f 32362/33469/30267 37012/33090/29889 40253/33093/29892 38671/33471/30269
+f 32356/33463/30261 32358/33470/30268 32363/33473/30271 32359/33474/30272
+f 32359/33474/30272 32363/33473/30271 37084/33475/30273 37085/33476/30274
+f 32358/33470/30268 38672/33472/30270 38673/33477/30275 32363/33473/30271
+f 32363/33473/30271 38673/33477/30275 40277/33478/30276 37084/33475/30273
+f 32356/33463/30261 32359/33474/30272 32364/33479/30277 32360/33464/30262
+f 32360/33464/30262 32364/33479/30277 38668/33480/30278 38669/33467/30265
+f 32359/33474/30272 37085/33476/30274 37086/33481/30279 32364/33479/30277
+f 32364/33479/30277 37086/33481/30279 40276/33482/30280 38668/33480/30278
+f 32365/33483/30281 32369/33484/30282 32370/33485/30283 32366/33486/30284
+f 32366/33486/30284 32370/33485/30283 37017/33113/29912 37016/33109/29908
+f 32369/33484/30282 38672/33472/30270 38671/33471/30269 32370/33485/30283
+f 32370/33485/30283 38671/33471/30269 40253/33093/29892 37017/33113/29912
+f 32365/33483/30281 32366/33486/30284 32371/33487/30285 32367/33488/30286
+f 32367/33488/30286 32371/33487/30285 38674/33489/30287 38675/33490/30288
+f 32366/33486/30284 37016/33109/29908 37015/33108/29907 32371/33487/30285
+f 32371/33487/30285 37015/33108/29907 40254/33111/29910 38674/33489/30287
+f 32365/33483/30281 32367/33488/30286 32372/33491/30289 32368/33492/30290
+f 32368/33492/30290 32372/33491/30289 37087/33493/30291 37088/33494/30292
+f 32367/33488/30286 38675/33490/30288 38676/33495/30293 32372/33491/30289
+f 32372/33491/30289 38676/33495/30293 40278/33496/30294 37087/33493/30291
+f 32365/33483/30281 32368/33492/30290 32373/33497/30295 32369/33484/30282
+f 32369/33484/30282 32373/33497/30295 38673/33477/30275 38672/33472/30270
+f 32368/33492/30290 37088/33494/30292 37089/33498/30296 32373/33497/30295
+f 32373/33497/30295 37089/33498/30296 40277/33478/30276 38673/33477/30275
+f 32374/33499/30297 32378/33500/30298 32379/33501/30299 32375/33502/30300
+f 32375/33502/30300 32379/33501/30299 37020/33129/29928 37019/33125/29924
+f 32378/33500/30298 38675/33490/30288 38674/33489/30287 32379/33501/30299
+f 32379/33501/30299 38674/33489/30287 40254/33111/29910 37020/33129/29928
+f 32374/33499/30297 32375/33502/30300 32380/33503/30301 32376/33504/30302
+f 32376/33504/30302 32380/33503/30301 38677/33505/30303 38678/33506/30304
+f 32375/33502/30300 37019/33125/29924 37018/33124/29923 32380/33503/30301
+f 32380/33503/30301 37018/33124/29923 40255/33127/29926 38677/33505/30303
+f 32374/33499/30297 32376/33504/30302 32381/33507/30305 32377/33508/30306
+f 32377/33508/30306 32381/33507/30305 37090/33509/30307 37091/33510/30308
+f 32376/33504/30302 38678/33506/30304 38679/33511/30309 32381/33507/30305
+f 32381/33507/30305 38679/33511/30309 40279/33512/30310 37090/33509/30307
+f 32374/33499/30297 32377/33508/30306 32382/33513/30311 32378/33500/30298
+f 32378/33500/30298 32382/33513/30311 38676/33495/30293 38675/33490/30288
+f 32377/33508/30306 37091/33510/30308 37092/33514/30312 32382/33513/30311
+f 32382/33513/30311 37092/33514/30312 40278/33496/30294 38676/33495/30293
+f 32383/33515/30313 32387/33516/30314 32388/33517/30315 32384/33518/30316
+f 32384/33518/30316 32388/33517/30315 37023/33145/29944 37022/33141/29940
+f 32387/33516/30314 38678/33506/30304 38677/33505/30303 32388/33517/30315
+f 32388/33517/30315 38677/33505/30303 40255/33127/29926 37023/33145/29944
+f 32383/33515/30313 32384/33518/30316 32389/33519/30317 32385/33520/30318
+f 32385/33520/30318 32389/33519/30317 38680/33521/30319 38681/33522/30320
+f 32384/33518/30316 37022/33141/29940 37021/33140/29939 32389/33519/30317
+f 32389/33519/30317 37021/33140/29939 40256/33143/29942 38680/33521/30319
+f 32383/33515/30313 32385/33520/30318 32390/33523/30321 32386/33524/30322
+f 32386/33524/30322 32390/33523/30321 37093/33525/30323 37094/33526/30324
+f 32385/33520/30318 38681/33522/30320 38682/33527/30325 32390/33523/30321
+f 32390/33523/30321 38682/33527/30325 40280/33528/30326 37093/33525/30323
+f 32383/33515/30313 32386/33524/30322 32391/33529/30327 32387/33516/30314
+f 32387/33516/30314 32391/33529/30327 38679/33511/30309 38678/33506/30304
+f 32386/33524/30322 37094/33526/30324 37095/33530/30328 32391/33529/30327
+f 32391/33529/30327 37095/33530/30328 40279/33512/30310 38679/33511/30309
+f 32392/33531/30329 32396/33532/30330 32397/33533/30331 32393/33534/30332
+f 32393/33534/30332 32397/33533/30331 37026/33161/29960 37025/33157/29956
+f 32396/33532/30330 38681/33522/30320 38680/33521/30319 32397/33533/30331
+f 32397/33533/30331 38680/33521/30319 40256/33143/29942 37026/33161/29960
+f 32392/33531/30329 32393/33534/30332 32398/33535/30333 32394/33536/30334
+f 32394/33536/30334 32398/33535/30333 38683/33537/30335 38684/33538/30336
+f 32393/33534/30332 37025/33157/29956 37024/33156/29955 32398/33535/30333
+f 32398/33535/30333 37024/33156/29955 40257/33159/29958 38683/33537/30335
+f 32392/33531/30329 32394/33536/30334 32399/33539/30337 32395/33540/30338
+f 32395/33540/30338 32399/33539/30337 37096/33541/30339 37097/33542/30340
+f 32394/33536/30334 38684/33538/30336 38685/33543/30341 32399/33539/30337
+f 32399/33539/30337 38685/33543/30341 40281/33544/30342 37096/33541/30339
+f 32392/33531/30329 32395/33540/30338 32400/33545/30343 32396/33532/30330
+f 32396/33532/30330 32400/33545/30343 38682/33527/30325 38681/33522/30320
+f 32395/33540/30338 37097/33542/30340 37098/33546/30344 32400/33545/30343
+f 32400/33545/30343 37098/33546/30344 40280/33528/30326 38682/33527/30325
+f 32401/33547/30345 32405/33548/30346 32406/33549/30347 32402/33550/30348
+f 32402/33550/30348 32406/33549/30347 37029/33177/29976 37028/33173/29972
+f 32405/33548/30346 38684/33538/30336 38683/33537/30335 32406/33549/30347
+f 32406/33549/30347 38683/33537/30335 40257/33159/29958 37029/33177/29976
+f 32401/33547/30345 32402/33550/30348 32407/33551/30349 32403/33552/30350
+f 32403/33552/30350 32407/33551/30349 38686/33553/30351 38687/33554/30352
+f 32402/33550/30348 37028/33173/29972 37027/33172/29971 32407/33551/30349
+f 32407/33551/30349 37027/33172/29971 40258/33175/29974 38686/33553/30351
+f 32401/33547/30345 32403/33552/30350 32408/33555/30353 32404/33556/30354
+f 32404/33556/30354 32408/33555/30353 37099/33557/30355 37100/33558/30356
+f 32403/33552/30350 38687/33554/30352 38688/33559/30357 32408/33555/30353
+f 32408/33555/30353 38688/33559/30357 40282/33560/30358 37099/33557/30355
+f 32401/33547/30345 32404/33556/30354 32409/33561/30359 32405/33548/30346
+f 32405/33548/30346 32409/33561/30359 38685/33543/30341 38684/33538/30336
+f 32404/33556/30354 37100/33558/30356 37101/33562/30360 32409/33561/30359
+f 32409/33561/30359 37101/33562/30360 40281/33544/30342 38685/33543/30341
+f 32410/33563/30361 32414/33564/30362 32415/33565/30363 32411/33566/30364
+f 32411/33566/30364 32415/33565/30363 37032/33193/29992 37031/33189/29988
+f 32414/33564/30362 38687/33554/30352 38686/33553/30351 32415/33565/30363
+f 32415/33565/30363 38686/33553/30351 40258/33175/29974 37032/33193/29992
+f 32410/33563/30361 32411/33566/30364 32416/33567/30365 32412/33568/30366
+f 32412/33568/30366 32416/33567/30365 38689/33569/30367 38690/33570/30368
+f 32411/33566/30364 37031/33189/29988 37030/33188/29987 32416/33567/30365
+f 32416/33567/30365 37030/33188/29987 40259/33191/29990 38689/33569/30367
+f 32410/33563/30361 32412/33568/30366 32417/33571/30369 32413/33572/30370
+f 32413/33572/30370 32417/33571/30369 37102/33573/30371 37103/33574/30372
+f 32412/33568/30366 38690/33570/30368 38691/33575/30373 32417/33571/30369
+f 32417/33571/30369 38691/33575/30373 40283/33576/30374 37102/33573/30371
+f 32410/33563/30361 32413/33572/30370 32418/33577/30375 32414/33564/30362
+f 32414/33564/30362 32418/33577/30375 38688/33559/30357 38687/33554/30352
+f 32413/33572/30370 37103/33574/30372 37104/33578/30376 32418/33577/30375
+f 32418/33577/30375 37104/33578/30376 40282/33560/30358 38688/33559/30357
+f 32419/33579/30377 32423/33580/30378 32424/33581/30379 32420/33582/30380
+f 32420/33582/30380 32424/33581/30379 37035/33209/30008 37034/33205/30004
+f 32423/33580/30378 38690/33570/30368 38689/33569/30367 32424/33581/30379
+f 32424/33581/30379 38689/33569/30367 40259/33191/29990 37035/33209/30008
+f 32419/33579/30377 32420/33582/30380 32425/33583/30381 32421/33584/30382
+f 32421/33584/30382 32425/33583/30381 38692/33585/30383 38693/33586/30384
+f 32420/33582/30380 37034/33205/30004 37033/33204/30003 32425/33583/30381
+f 32425/33583/30381 37033/33204/30003 40260/33207/30006 38692/33585/30383
+f 32419/33579/30377 32421/33584/30382 32426/33587/30385 32422/33588/30386
+f 32422/33588/30386 32426/33587/30385 37105/33589/30387 37106/33590/30388
+f 32421/33584/30382 38693/33586/30384 38694/33591/30389 32426/33587/30385
+f 32426/33587/30385 38694/33591/30389 40284/33592/30390 37105/33589/30387
+f 32419/33579/30377 32422/33588/30386 32427/33593/30391 32423/33580/30378
+f 32423/33580/30378 32427/33593/30391 38691/33575/30373 38690/33570/30368
+f 32422/33588/30386 37106/33590/30388 37107/33594/30392 32427/33593/30391
+f 32427/33593/30391 37107/33594/30392 40283/33576/30374 38691/33575/30373
+f 32428/33595/30393 32432/33596/30394 32433/33597/30395 32429/33598/30396
+f 32429/33598/30396 32433/33597/30395 37038/3569/30024 37037/33221/30020
+f 32432/33596/30394 38693/33586/30384 38692/33585/30383 32433/33597/30395
+f 32433/33597/30395 38692/33585/30383 40260/33207/30006 37038/3569/30024
+f 32428/33595/30393 32429/33598/30396 32434/33599/30397 32430/33600/30398
+f 32430/33600/30398 32434/33599/30397 38695/33601/30399 38696/33602/30400
+f 32429/33598/30396 37037/33221/30020 37036/33220/30019 32434/33599/30397
+f 32434/33599/30397 37036/33220/30019 40261/33223/30022 38695/33601/30399
+f 32428/33595/30393 32430/33600/30398 32435/33603/30401 32431/33604/30402
+f 32431/33604/30402 32435/33603/30401 37108/33605/30403 37109/33606/30404
+f 32430/33600/30398 38696/33602/30400 38697/33607/30405 32435/33603/30401
+f 32435/33603/30401 38697/33607/30405 40285/33608/30406 37108/33605/30403
+f 32428/33595/30393 32431/33604/30402 32436/33609/30407 32432/33596/30394
+f 32432/33596/30394 32436/33609/30407 38694/33591/30389 38693/33586/30384
+f 32431/33604/30402 37109/33606/30404 37110/33610/30408 32436/33609/30407
+f 32436/33609/30407 37110/33610/30408 40284/33592/30390 38694/33591/30389
+f 32437/33611/30409 32441/33612/30410 32442/33613/30411 32438/33614/30412
+f 32438/33614/30412 32442/33613/30411 37041/33240/30040 37040/33236/30036
+f 32441/33612/30410 38696/33602/30400 38695/33601/30399 32442/33613/30411
+f 32442/33613/30411 38695/33601/30399 40261/33223/30022 37041/33240/30040
+f 32437/33611/30409 32438/33614/30412 32443/33615/30413 32439/33616/30414
+f 32439/33616/30414 32443/33615/30413 38698/33617/30415 38699/33618/30416
+f 32438/33614/30412 37040/33236/30036 37039/33235/30035 32443/33615/30413
+f 32443/33615/30413 37039/33235/30035 40262/33238/30038 38698/33617/30415
+f 32437/33611/30409 32439/33616/30414 32444/33619/30417 32440/33620/30418
+f 32440/33620/30418 32444/33619/30417 37111/33621/30419 37112/33622/30420
+f 32439/33616/30414 38699/33618/30416 38700/33623/30421 32444/33619/30417
+f 32444/33619/30417 38700/33623/30421 40286/33624/30422 37111/33621/30419
+f 32437/33611/30409 32440/33620/30418 32445/33625/30423 32441/33612/30410
+f 32441/33612/30410 32445/33625/30423 38697/33607/30405 38696/33602/30400
+f 32440/33620/30418 37112/33622/30420 37113/33626/30424 32445/33625/30423
+f 32445/33625/30423 37113/33626/30424 40285/33608/30406 38697/33607/30405
+f 32446/33627/30425 32450/33628/30426 32451/33629/30427 32447/33630/30428
+f 32447/33630/30428 32451/33629/30427 37044/3521/30056 37043/33252/30052
+f 32450/33628/30426 38699/33618/30416 38698/33617/30415 32451/33629/30427
+f 32451/33629/30427 38698/33617/30415 40262/33238/30038 37044/3521/30056
+f 32446/33627/30425 32447/33630/30428 32452/33631/30429 32448/33632/30430
+f 32448/33632/30430 32452/33631/30429 38701/33633/30431 38702/33634/30432
+f 32447/33630/30428 37043/33252/30052 37042/33251/30051 32452/33631/30429
+f 32452/33631/30429 37042/33251/30051 40263/33254/30054 38701/33633/30431
+f 32446/33627/30425 32448/33632/30430 32453/33635/30433 32449/33636/30434
+f 32449/33636/30434 32453/33635/30433 37114/33637/30435 37115/33638/30436
+f 32448/33632/30430 38702/33634/30432 38703/33639/30437 32453/33635/30433
+f 32453/33635/30433 38703/33639/30437 40287/33640/30438 37114/33637/30435
+f 32446/33627/30425 32449/33636/30434 32454/33641/30439 32450/33628/30426
+f 32450/33628/30426 32454/33641/30439 38700/33623/30421 38699/33618/30416
+f 32449/33636/30434 37115/33638/30436 37116/33642/30440 32454/33641/30439
+f 32454/33641/30439 37116/33642/30440 40286/33624/30422 38700/33623/30421
+f 32455/33643/30441 32459/33644/30442 32460/33645/30443 32456/33646/30444
+f 32456/33646/30444 32460/33645/30443 37047/33271/30072 37046/33267/30068
+f 32459/33644/30442 38702/33634/30432 38701/33633/30431 32460/33645/30443
+f 32460/33645/30443 38701/33633/30431 40263/33254/30054 37047/33271/30072
+f 32455/33643/30441 32456/33646/30444 32461/33647/30445 32457/33648/30446
+f 32457/33648/30446 32461/33647/30445 38704/33649/30447 38705/33650/30448
+f 32456/33646/30444 37046/33267/30068 37045/33266/30067 32461/33647/30445
+f 32461/33647/30445 37045/33266/30067 40264/33269/30070 38704/33649/30447
+f 32455/33643/30441 32457/33648/30446 32462/33651/30449 32458/33652/30450
+f 32458/33652/30450 32462/33651/30449 37117/33653/30451 37118/33654/30452
+f 32457/33648/30446 38705/33650/30448 38706/33655/30453 32462/33651/30449
+f 32462/33651/30449 38706/33655/30453 40288/33656/30454 37117/33653/30451
+f 32455/33643/30441 32458/33652/30450 32463/33657/30455 32459/33644/30442
+f 32459/33644/30442 32463/33657/30455 38703/33639/30437 38702/33634/30432
+f 32458/33652/30450 37118/33654/30452 37119/33658/30456 32463/33657/30455
+f 32463/33657/30455 37119/33658/30456 40287/33640/30438 38703/33639/30437
+f 32464/33659/30457 32468/33660/30458 32469/33661/30459 32465/33662/30460
+f 32465/33662/30460 32469/33661/30459 37050/33287/30088 37049/33283/30084
+f 32468/33660/30458 38705/33650/30448 38704/33649/30447 32469/33661/30459
+f 32469/33661/30459 38704/33649/30447 40264/33269/30070 37050/33287/30088
+f 32464/33659/30457 32465/33662/30460 32470/33663/30461 32466/33664/30462
+f 32466/33664/30462 32470/33663/30461 38707/33665/30463 38708/33666/30464
+f 32465/33662/30460 37049/33283/30084 37048/33282/30083 32470/33663/30461
+f 32470/33663/30461 37048/33282/30083 40265/33285/30086 38707/33665/30463
+f 32464/33659/30457 32466/33664/30462 32471/33667/30465 32467/33668/30466
+f 32467/33668/30466 32471/33667/30465 37120/33669/30467 37121/33670/30468
+f 32466/33664/30462 38708/33666/30464 38709/33671/30469 32471/33667/30465
+f 32471/33667/30465 38709/33671/30469 40289/33672/30470 37120/33669/30467
+f 32464/33659/30457 32467/33668/30466 32472/33673/30471 32468/33660/30458
+f 32468/33660/30458 32472/33673/30471 38706/33655/30453 38705/33650/30448
+f 32467/33668/30466 37121/33670/30468 37122/33674/30472 32472/33673/30471
+f 32472/33673/30471 37122/33674/30472 40288/33656/30454 38706/33655/30453
+f 32473/33675/30473 32477/33676/30474 32478/33677/30475 32474/33678/30476
+f 32474/33678/30476 32478/33677/30475 37053/33303/30104 37052/33299/30100
+f 32477/33676/30474 38708/33666/30464 38707/33665/30463 32478/33677/30475
+f 32478/33677/30475 38707/33665/30463 40265/33285/30086 37053/33303/30104
+f 32473/33675/30473 32474/33678/30476 32479/33679/30477 32475/33680/30478
+f 32475/33680/30478 32479/33679/30477 38710/33681/30479 38711/33682/30480
+f 32474/33678/30476 37052/33299/30100 37051/33298/30099 32479/33679/30477
+f 32479/33679/30477 37051/33298/30099 40266/33301/30102 38710/33681/30479
+f 32473/33675/30473 32475/33680/30478 32480/33683/30481 32476/33684/30482
+f 32476/33684/30482 32480/33683/30481 37123/33685/30483 37124/33686/30484
+f 32475/33680/30478 38711/33682/30480 38712/33687/30485 32480/33683/30481
+f 32480/33683/30481 38712/33687/30485 40290/33688/30486 37123/33685/30483
+f 32473/33675/30473 32476/33684/30482 32481/33689/30487 32477/33676/30474
+f 32477/33676/30474 32481/33689/30487 38709/33671/30469 38708/33666/30464
+f 32476/33684/30482 37124/33686/30484 37125/33690/30488 32481/33689/30487
+f 32481/33689/30487 37125/33690/30488 40289/33672/30470 38709/33671/30469
+f 32482/33691/30489 32486/33692/30490 32487/33693/30491 32483/33694/30492
+f 32483/33694/30492 32487/33693/30491 37056/33319/30120 37055/33315/30116
+f 32486/33692/30490 38711/33682/30480 38710/33681/30479 32487/33693/30491
+f 32487/33693/30491 38710/33681/30479 40266/33301/30102 37056/33319/30120
+f 32482/33691/30489 32483/33694/30492 32488/33695/30493 32484/33696/30494
+f 32484/33696/30494 32488/33695/30493 38713/33697/30495 38714/33698/30496
+f 32483/33694/30492 37055/33315/30116 37054/33314/30115 32488/33695/30493
+f 32488/33695/30493 37054/33314/30115 40267/33317/30118 38713/33697/30495
+f 32482/33691/30489 32484/33696/30494 32489/33699/30497 32485/33700/30498
+f 32485/33700/30498 32489/33699/30497 37126/33701/30499 37127/33702/30500
+f 32484/33696/30494 38714/33698/30496 38715/33703/30501 32489/33699/30497
+f 32489/33699/30497 38715/33703/30501 40291/33704/30502 37126/33701/30499
+f 32482/33691/30489 32485/33700/30498 32490/33705/30503 32486/33692/30490
+f 32486/33692/30490 32490/33705/30503 38712/33687/30485 38711/33682/30480
+f 32485/33700/30498 37127/33702/30500 37128/33706/30504 32490/33705/30503
+f 32490/33705/30503 37128/33706/30504 40290/33688/30486 38712/33687/30485
+f 32491/33707/30505 32495/33708/30506 32496/33709/30507 32492/33710/30508
+f 32492/33710/30508 32496/33709/30507 37059/33335/30136 37058/33331/30132
+f 32495/33708/30506 38714/33698/30496 38713/33697/30495 32496/33709/30507
+f 32496/33709/30507 38713/33697/30495 40267/33317/30118 37059/33335/30136
+f 32491/33707/30505 32492/33710/30508 32497/33711/30509 32493/33712/30510
+f 32493/33712/30510 32497/33711/30509 38716/33713/30511 38717/33714/30512
+f 32492/33710/30508 37058/33331/30132 37057/33330/30131 32497/33711/30509
+f 32497/33711/30509 37057/33330/30131 40268/33333/30134 38716/33713/30511
+f 32491/33707/30505 32493/33712/30510 32498/33715/30513 32494/33716/30514
+f 32494/33716/30514 32498/33715/30513 37129/33717/30515 37130/33718/30516
+f 32493/33712/30510 38717/33714/30512 38718/33719/30517 32498/33715/30513
+f 32498/33715/30513 38718/33719/30517 40292/33720/30518 37129/33717/30515
+f 32491/33707/30505 32494/33716/30514 32499/33721/30519 32495/33708/30506
+f 32495/33708/30506 32499/33721/30519 38715/33703/30501 38714/33698/30496
+f 32494/33716/30514 37130/33718/30516 37131/33722/30520 32499/33721/30519
+f 32499/33721/30519 37131/33722/30520 40291/33704/30502 38715/33703/30501
+f 32500/33723/30521 32504/33724/30522 32505/33725/30523 32501/33726/30524
+f 32501/33726/30524 32505/33725/30523 37062/33351/30152 37061/33347/30148
+f 32504/33724/30522 38717/33714/30512 38716/33713/30511 32505/33725/30523
+f 32505/33725/30523 38716/33713/30511 40268/33333/30134 37062/33351/30152
+f 32500/33723/30521 32501/33726/30524 32506/33727/30525 32502/33728/30526
+f 32502/33728/30526 32506/33727/30525 38719/33729/30527 38720/33730/30528
+f 32501/33726/30524 37061/33347/30148 37060/33346/30147 32506/33727/30525
+f 32506/33727/30525 37060/33346/30147 40269/33349/30150 38719/33729/30527
+f 32500/33723/30521 32502/33728/30526 32507/33731/30529 32503/33732/30530
+f 32503/33732/30530 32507/33731/30529 37132/33733/30531 37133/33734/30532
+f 32502/33728/30526 38720/33730/30528 38721/33735/30533 32507/33731/30529
+f 32507/33731/30529 38721/33735/30533 40293/33736/30534 37132/33733/30531
+f 32500/33723/30521 32503/33732/30530 32508/33737/30535 32504/33724/30522
+f 32504/33724/30522 32508/33737/30535 38718/33719/30517 38717/33714/30512
+f 32503/33732/30530 37133/33734/30532 37134/33738/30536 32508/33737/30535
+f 32508/33737/30535 37134/33738/30536 40292/33720/30518 38718/33719/30517
+f 32509/33739/30537 32513/33740/30538 32514/33741/30539 32510/33742/30540
+f 32510/33742/30540 32514/33741/30539 37065/33367/30168 37064/33363/30164
+f 32513/33740/30538 38720/33730/30528 38719/33729/30527 32514/33741/30539
+f 32514/33741/30539 38719/33729/30527 40269/33349/30150 37065/33367/30168
+f 32509/33739/30537 32510/33742/30540 32515/33743/30541 32511/33744/30542
+f 32511/33744/30542 32515/33743/30541 38722/33745/30543 38723/33746/30544
+f 32510/33742/30540 37064/33363/30164 37063/33362/30163 32515/33743/30541
+f 32515/33743/30541 37063/33362/30163 40270/33365/30166 38722/33745/30543
+f 32509/33739/30537 32511/33744/30542 32516/33747/30545 32512/33748/30546
+f 32512/33748/30546 32516/33747/30545 37135/33749/30547 37136/33750/30548
+f 32511/33744/30542 38723/33746/30544 38724/33751/30549 32516/33747/30545
+f 32516/33747/30545 38724/33751/30549 40294/33752/30550 37135/33749/30547
+f 32509/33739/30537 32512/33748/30546 32517/33753/30551 32513/33740/30538
+f 32513/33740/30538 32517/33753/30551 38721/33735/30533 38720/33730/30528
+f 32512/33748/30546 37136/33750/30548 37137/33754/30552 32517/33753/30551
+f 32517/33753/30551 37137/33754/30552 40293/33736/30534 38721/33735/30533
+f 32518/33755/30553 32522/33756/30554 32523/33757/30555 32519/33758/30556
+f 32519/33758/30556 32523/33757/30555 37068/33383/30184 37067/33379/30180
+f 32522/33756/30554 38723/33746/30544 38722/33745/30543 32523/33757/30555
+f 32523/33757/30555 38722/33745/30543 40270/33365/30166 37068/33383/30184
+f 32518/33755/30553 32519/33758/30556 32524/33759/30557 32520/33760/30558
+f 32520/33760/30558 32524/33759/30557 38725/33761/30559 38726/33762/30560
+f 32519/33758/30556 37067/33379/30180 37066/33378/30179 32524/33759/30557
+f 32524/33759/30557 37066/33378/30179 40271/33381/30182 38725/33761/30559
+f 32518/33755/30553 32520/33760/30558 32525/33763/30561 32521/33764/30562
+f 32521/33764/30562 32525/33763/30561 37138/33765/30563 37139/33766/30564
+f 32520/33760/30558 38726/33762/30560 38727/33767/30565 32525/33763/30561
+f 32525/33763/30561 38727/33767/30565 40295/33768/30566 37138/33765/30563
+f 32518/33755/30553 32521/33764/30562 32526/33769/30567 32522/33756/30554
+f 32522/33756/30554 32526/33769/30567 38724/33751/30549 38723/33746/30544
+f 32521/33764/30562 37139/33766/30564 37140/33770/30568 32526/33769/30567
+f 32526/33769/30567 37140/33770/30568 40294/33752/30550 38724/33751/30549
+f 32527/33771/30569 32531/33772/30570 32532/33773/30571 32528/33774/30572
+f 32528/33774/30572 32532/33773/30571 37071/33399/30200 37070/33395/30196
+f 32531/33772/30570 38726/33762/30560 38725/33761/30559 32532/33773/30571
+f 32532/33773/30571 38725/33761/30559 40271/33381/30182 37071/33399/30200
+f 32527/33771/30569 32528/33774/30572 32533/33775/30573 32529/33776/30574
+f 32529/33776/30574 32533/33775/30573 38728/33777/30575 38729/33778/30576
+f 32528/33774/30572 37070/33395/30196 37069/33394/30195 32533/33775/30573
+f 32533/33775/30573 37069/33394/30195 40272/33397/30198 38728/33777/30575
+f 32527/33771/30569 32529/33776/30574 32534/33779/30577 32530/33780/30578
+f 32530/33780/30578 32534/33779/30577 37141/33781/30579 37142/33782/30580
+f 32529/33776/30574 38729/33778/30576 38730/33783/30581 32534/33779/30577
+f 32534/33779/30577 38730/33783/30581 40296/33784/30582 37141/33781/30579
+f 32527/33771/30569 32530/33780/30578 32535/33785/30583 32531/33772/30570
+f 32531/33772/30570 32535/33785/30583 38727/33767/30565 38726/33762/30560
+f 32530/33780/30578 37142/33782/30580 37143/33786/30584 32535/33785/30583
+f 32535/33785/30583 37143/33786/30584 40295/33768/30566 38727/33767/30565
+f 32536/33787/30585 32540/33788/30586 32541/33789/30587 32537/33790/30588
+f 32537/33790/30588 32541/33789/30587 37074/9564/30216 37073/33411/30212
+f 32540/33788/30586 38729/33778/30576 38728/33777/30575 32541/33789/30587
+f 32541/33789/30587 38728/33777/30575 40272/33397/30198 37074/9564/30216
+f 32536/33787/30585 32537/33790/30588 32542/33791/30589 32538/33792/30590
+f 32538/33792/30590 32542/33791/30589 38731/33793/30591 38732/33794/30592
+f 32537/33790/30588 37073/33411/30212 37072/33410/30211 32542/33791/30589
+f 32542/33791/30589 37072/33410/30211 40273/33413/30214 38731/33793/30591
+f 32536/33787/30585 32538/33792/30590 32543/33795/30593 32539/33796/30594
+f 32539/33796/30594 32543/33795/30593 37144/33797/30595 37145/33798/30596
+f 32538/33792/30590 38732/33794/30592 38733/33799/30597 32543/33795/30593
+f 32543/33795/30593 38733/33799/30597 40297/33800/30598 37144/33797/30595
+f 32536/33787/30585 32539/33796/30594 32544/33801/30599 32540/33788/30586
+f 32540/33788/30586 32544/33801/30599 38730/33783/30581 38729/33778/30576
+f 32539/33796/30594 37145/33798/30596 37146/33802/30600 32544/33801/30599
+f 32544/33801/30599 37146/33802/30600 40296/33784/30582 38730/33783/30581
+f 32545/33803/30601 32549/33804/30602 32550/33805/30603 32546/33806/30604
+f 32546/33806/30604 32550/33805/30603 37077/33430/30232 37076/33426/30228
+f 32549/33804/30602 38732/33794/30592 38731/33793/30591 32550/33805/30603
+f 32550/33805/30603 38731/33793/30591 40273/33413/30214 37077/33430/30232
+f 32545/33803/30601 32546/33806/30604 32551/33807/30605 32547/33808/30606
+f 32547/33808/30606 32551/33807/30605 38734/33809/30607 38735/33810/30608
+f 32546/33806/30604 37076/33426/30228 37075/33425/30227 32551/33807/30605
+f 32551/33807/30605 37075/33425/30227 40274/33428/30230 38734/33809/30607
+f 32545/33803/30601 32547/33808/30606 32552/33811/30609 32548/33812/30610
+f 32548/33812/30610 32552/33811/30609 37147/33813/30611 37148/33814/30612
+f 32547/33808/30606 38735/33810/30608 38736/33815/30613 32552/33811/30609
+f 32552/33811/30609 38736/33815/30613 40298/33816/30614 37147/33813/30611
+f 32545/33803/30601 32548/33812/30610 32553/33817/30615 32549/33804/30602
+f 32549/33804/30602 32553/33817/30615 38733/33799/30597 38732/33794/30592
+f 32548/33812/30610 37148/33814/30612 37149/33818/30616 32553/33817/30615
+f 32553/33817/30615 37149/33818/30616 40297/33800/30598 38733/33799/30597
+f 32554/33819/30617 32558/33820/30618 32559/33821/30619 32555/33822/30620
+f 32555/33822/30620 32559/33821/30619 37080/33446/30248 37079/33442/30244
+f 32558/33820/30618 38735/33810/30608 38734/33809/30607 32559/33821/30619
+f 32559/33821/30619 38734/33809/30607 40274/33428/30230 37080/33446/30248
+f 32554/33819/30617 32555/33822/30620 32560/33823/30621 32556/33824/30622
+f 32556/33824/30622 32560/33823/30621 38737/33825/30623 38738/33826/30624
+f 32555/33822/30620 37079/33442/30244 37078/33441/30243 32560/33823/30621
+f 32560/33823/30621 37078/33441/30243 40275/33444/30246 38737/33825/30623
+f 32554/33819/30617 32556/33824/30622 32561/33827/30625 32557/33828/30626
+f 32557/33828/30626 32561/33827/30625 37150/33829/30627 37151/33830/30628
+f 32556/33824/30622 38738/33826/30624 38739/33831/30629 32561/33827/30625
+f 32561/33827/30625 38739/33831/30629 40299/33832/30630 37150/33829/30627
+f 32554/33819/30617 32557/33828/30626 32562/33833/30631 32558/33820/30618
+f 32558/33820/30618 32562/33833/30631 38736/33815/30613 38735/33810/30608
+f 32557/33828/30626 37151/33830/30628 37152/33834/30632 32562/33833/30631
+f 32562/33833/30631 37152/33834/30632 40298/33816/30614 38736/33815/30613
+f 32563/33835/30633 32567/33836/30634 32568/33837/30635 32564/33838/30636
+f 32564/33838/30636 32568/33837/30635 37083/33462/30260 37082/33458/30258
+f 32567/33836/30634 38738/33826/30624 38737/33825/30623 32568/33837/30635
+f 32568/33837/30635 38737/33825/30623 40275/33444/30246 37083/33462/30260
+f 32563/33835/30633 32564/33838/30636 32569/33839/30637 32565/33840/30638
+f 32565/33840/30638 32569/33839/30637 38670/33841/30266 38669/33842/30265
+f 32564/33838/30636 37082/33458/30258 37081/33457/30257 32569/33839/30637
+f 32569/33839/30637 37081/33457/30257 40252/33460/29896 38670/33841/30266
+f 32563/33835/30633 32565/33840/30638 32570/33843/30639 32566/33844/30640
+f 32566/33844/30640 32570/33843/30639 37153/33845/30641 37154/33846/30642
+f 32565/33840/30638 38669/33842/30265 38668/33847/30278 32570/33843/30639
+f 32570/33843/30639 38668/33847/30278 40276/33848/30280 37153/33845/30641
+f 32563/33835/30633 32566/33844/30640 32571/33849/30643 32567/33836/30634
+f 32567/33836/30634 32571/33849/30643 38739/33831/30629 38738/33826/30624
+f 32566/33844/30640 37154/33846/30642 37155/33850/30644 32571/33849/30643
+f 32571/33849/30643 37155/33850/30644 40299/33832/30630 38739/33831/30629
+f 32572/33851/30645 32576/33852/30646 32577/33853/30647 32573/33854/30648
+f 32573/33854/30648 32577/33853/30647 37086/33481/30279 37085/33476/30274
+f 32576/33852/30646 38741/33855/30649 38742/33856/30650 32577/33853/30647
+f 32577/33853/30647 38742/33856/30650 40276/33482/30280 37086/33481/30279
+f 32572/33851/30645 32573/33854/30648 32578/33857/30651 32574/33858/30652
+f 32574/33858/30652 32578/33857/30651 38743/33859/30653 38744/33860/30654
+f 32573/33854/30648 37085/33476/30274 37084/33475/30273 32578/33857/30651
+f 32578/33857/30651 37084/33475/30273 40277/33478/30276 38743/33859/30653
+f 32572/33851/30645 32574/33858/30652 32579/33861/30655 32575/33862/30656
+f 32575/33862/30656 32579/33861/30655 37156/33863/30657 37157/33864/30658
+f 32574/33858/30652 38744/33860/30654 38745/33865/30659 32579/33861/30655
+f 32579/33861/30655 38745/33865/30659 40301/33866/30660 37156/33863/30657
+f 32572/33851/30645 32575/33862/30656 32580/33867/30661 32576/33852/30646
+f 32576/33852/30646 32580/33867/30661 38740/33868/30662 38741/33855/30649
+f 32575/33862/30656 37157/33864/30658 37158/33869/30663 32580/33867/30661
+f 32580/33867/30661 37158/33869/30663 40300/33870/30664 38740/33868/30662
+f 32581/33871/30665 32585/33872/30666 32586/33873/30667 32582/33874/30668
+f 32582/33874/30668 32586/33873/30667 37089/33498/30296 37088/33494/30292
+f 32585/33872/30666 38744/33860/30654 38743/33859/30653 32586/33873/30667
+f 32586/33873/30667 38743/33859/30653 40277/33478/30276 37089/33498/30296
+f 32581/33871/30665 32582/33874/30668 32587/33875/30669 32583/33876/30670
+f 32583/33876/30670 32587/33875/30669 38746/33877/30671 38747/33878/30672
+f 32582/33874/30668 37088/33494/30292 37087/33493/30291 32587/33875/30669
+f 32587/33875/30669 37087/33493/30291 40278/33496/30294 38746/33877/30671
+f 32581/33871/30665 32583/33876/30670 32588/33879/30673 32584/33880/30674
+f 32584/33880/30674 32588/33879/30673 37159/33881/30675 37160/33882/30676
+f 32583/33876/30670 38747/33878/30672 38748/33883/30677 32588/33879/30673
+f 32588/33879/30673 38748/33883/30677 40302/33884/30678 37159/33881/30675
+f 32581/33871/30665 32584/33880/30674 32589/33885/30679 32585/33872/30666
+f 32585/33872/30666 32589/33885/30679 38745/33865/30659 38744/33860/30654
+f 32584/33880/30674 37160/33882/30676 37161/33886/30680 32589/33885/30679
+f 32589/33885/30679 37161/33886/30680 40301/33866/30660 38745/33865/30659
+f 32590/33887/30681 32594/33888/30682 32595/33889/30683 32591/33890/30684
+f 32591/33890/30684 32595/33889/30683 37092/33514/30312 37091/33510/30308
+f 32594/33888/30682 38747/33878/30672 38746/33877/30671 32595/33889/30683
+f 32595/33889/30683 38746/33877/30671 40278/33496/30294 37092/33514/30312
+f 32590/33887/30681 32591/33890/30684 32596/33891/30685 32592/33892/30686
+f 32592/33892/30686 32596/33891/30685 38749/33893/30687 38750/33894/30688
+f 32591/33890/30684 37091/33510/30308 37090/33509/30307 32596/33891/30685
+f 32596/33891/30685 37090/33509/30307 40279/33512/30310 38749/33893/30687
+f 32590/33887/30681 32592/33892/30686 32597/33895/30689 32593/33896/30690
+f 32593/33896/30690 32597/33895/30689 37162/33897/30691 37163/33898/30692
+f 32592/33892/30686 38750/33894/30688 38751/33899/30693 32597/33895/30689
+f 32597/33895/30689 38751/33899/30693 40303/33900/30694 37162/33897/30691
+f 32590/33887/30681 32593/33896/30690 32598/33901/30695 32594/33888/30682
+f 32594/33888/30682 32598/33901/30695 38748/33883/30677 38747/33878/30672
+f 32593/33896/30690 37163/33898/30692 37164/33902/30696 32598/33901/30695
+f 32598/33901/30695 37164/33902/30696 40302/33884/30678 38748/33883/30677
+f 32599/33903/30697 32603/33904/30698 32604/33905/30699 32600/33906/30700
+f 32600/33906/30700 32604/33905/30699 37095/33530/30328 37094/33526/30324
+f 32603/33904/30698 38750/33894/30688 38749/33893/30687 32604/33905/30699
+f 32604/33905/30699 38749/33893/30687 40279/33512/30310 37095/33530/30328
+f 32599/33903/30697 32600/33906/30700 32605/33907/30701 32601/33908/30702
+f 32601/33908/30702 32605/33907/30701 38752/33909/30703 38753/33910/30704
+f 32600/33906/30700 37094/33526/30324 37093/33525/30323 32605/33907/30701
+f 32605/33907/30701 37093/33525/30323 40280/33528/30326 38752/33909/30703
+f 32599/33903/30697 32601/33908/30702 32606/33911/30705 32602/33912/30706
+f 32602/33912/30706 32606/33911/30705 37165/33913/30707 37166/33914/30708
+f 32601/33908/30702 38753/33910/30704 38754/33915/30709 32606/33911/30705
+f 32606/33911/30705 38754/33915/30709 40304/33916/30710 37165/33913/30707
+f 32599/33903/30697 32602/33912/30706 32607/33917/30711 32603/33904/30698
+f 32603/33904/30698 32607/33917/30711 38751/33899/30693 38750/33894/30688
+f 32602/33912/30706 37166/33914/30708 37167/33918/30712 32607/33917/30711
+f 32607/33917/30711 37167/33918/30712 40303/33900/30694 38751/33899/30693
+f 32608/33919/30713 32612/33920/30714 32613/33921/30715 32609/33922/30716
+f 32609/33922/30716 32613/33921/30715 37098/33546/30344 37097/33542/30340
+f 32612/33920/30714 38753/33910/30704 38752/33909/30703 32613/33921/30715
+f 32613/33921/30715 38752/33909/30703 40280/33528/30326 37098/33546/30344
+f 32608/33919/30713 32609/33922/30716 32614/33923/30717 32610/33924/30718
+f 32610/33924/30718 32614/33923/30717 38755/33925/30719 38756/33926/30720
+f 32609/33922/30716 37097/33542/30340 37096/33541/30339 32614/33923/30717
+f 32614/33923/30717 37096/33541/30339 40281/33544/30342 38755/33925/30719
+f 32608/33919/30713 32610/33924/30718 32615/33927/30721 32611/33928/30722
+f 32611/33928/30722 32615/33927/30721 37168/33929/30723 37169/33930/30724
+f 32610/33924/30718 38756/33926/30720 38757/33931/30725 32615/33927/30721
+f 32615/33927/30721 38757/33931/30725 40305/33932/30726 37168/33929/30723
+f 32608/33919/30713 32611/33928/30722 32616/33933/30727 32612/33920/30714
+f 32612/33920/30714 32616/33933/30727 38754/33915/30709 38753/33910/30704
+f 32611/33928/30722 37169/33930/30724 37170/33934/30728 32616/33933/30727
+f 32616/33933/30727 37170/33934/30728 40304/33916/30710 38754/33915/30709
+f 32617/33935/30729 32621/33936/30730 32622/33937/30731 32618/33938/30732
+f 32618/33938/30732 32622/33937/30731 37101/33562/30360 37100/33558/30356
+f 32621/33936/30730 38756/33926/30720 38755/33925/30719 32622/33937/30731
+f 32622/33937/30731 38755/33925/30719 40281/33544/30342 37101/33562/30360
+f 32617/33935/30729 32618/33938/30732 32623/33939/30733 32619/33940/30734
+f 32619/33940/30734 32623/33939/30733 38758/33941/30735 38759/33942/30736
+f 32618/33938/30732 37100/33558/30356 37099/33557/30355 32623/33939/30733
+f 32623/33939/30733 37099/33557/30355 40282/33560/30358 38758/33941/30735
+f 32617/33935/30729 32619/33940/30734 32624/33943/30737 32620/33944/30738
+f 32620/33944/30738 32624/33943/30737 37171/33945/30739 37172/33946/30740
+f 32619/33940/30734 38759/33942/30736 38760/33947/30741 32624/33943/30737
+f 32624/33943/30737 38760/33947/30741 40306/33948/30742 37171/33945/30739
+f 32617/33935/30729 32620/33944/30738 32625/33949/30743 32621/33936/30730
+f 32621/33936/30730 32625/33949/30743 38757/33931/30725 38756/33926/30720
+f 32620/33944/30738 37172/33946/30740 37173/33950/30744 32625/33949/30743
+f 32625/33949/30743 37173/33950/30744 40305/33932/30726 38757/33931/30725
+f 32626/33951/30745 32630/33952/30746 32631/33953/30747 32627/33954/30748
+f 32627/33954/30748 32631/33953/30747 37104/33578/30376 37103/33574/30372
+f 32630/33952/30746 38759/33942/30736 38758/33941/30735 32631/33953/30747
+f 32631/33953/30747 38758/33941/30735 40282/33560/30358 37104/33578/30376
+f 32626/33951/30745 32627/33954/30748 32632/33955/30749 32628/33956/30750
+f 32628/33956/30750 32632/33955/30749 38761/33957/30751 38762/33958/30752
+f 32627/33954/30748 37103/33574/30372 37102/33573/30371 32632/33955/30749
+f 32632/33955/30749 37102/33573/30371 40283/33576/30374 38761/33957/30751
+f 32626/33951/30745 32628/33956/30750 32633/33959/30753 32629/33960/30754
+f 32629/33960/30754 32633/33959/30753 37174/33961/30755 37175/33962/30756
+f 32628/33956/30750 38762/33958/30752 38763/33963/30757 32633/33959/30753
+f 32633/33959/30753 38763/33963/30757 40307/33964/30758 37174/33961/30755
+f 32626/33951/30745 32629/33960/30754 32634/33965/30759 32630/33952/30746
+f 32630/33952/30746 32634/33965/30759 38760/33947/30741 38759/33942/30736
+f 32629/33960/30754 37175/33962/30756 37176/33966/30760 32634/33965/30759
+f 32634/33965/30759 37176/33966/30760 40306/33948/30742 38760/33947/30741
+f 32635/33967/30761 32639/33968/30762 32640/33969/30763 32636/33970/30764
+f 32636/33970/30764 32640/33969/30763 37107/33594/30392 37106/33590/30388
+f 32639/33968/30762 38762/33958/30752 38761/33957/30751 32640/33969/30763
+f 32640/33969/30763 38761/33957/30751 40283/33576/30374 37107/33594/30392
+f 32635/33967/30761 32636/33970/30764 32641/33971/30765 32637/33972/30766
+f 32637/33972/30766 32641/33971/30765 38764/33973/30767 38765/33974/30768
+f 32636/33970/30764 37106/33590/30388 37105/33589/30387 32641/33971/30765
+f 32641/33971/30765 37105/33589/30387 40284/33592/30390 38764/33973/30767
+f 32635/33967/30761 32637/33972/30766 32642/33975/30769 32638/33976/30770
+f 32638/33976/30770 32642/33975/30769 37177/33977/30771 37178/33978/30772
+f 32637/33972/30766 38765/33974/30768 38766/33979/30773 32642/33975/30769
+f 32642/33975/30769 38766/33979/30773 40308/33980/30774 37177/33977/30771
+f 32635/33967/30761 32638/33976/30770 32643/33981/30775 32639/33968/30762
+f 32639/33968/30762 32643/33981/30775 38763/33963/30757 38762/33958/30752
+f 32638/33976/30770 37178/33978/30772 37179/33982/30776 32643/33981/30775
+f 32643/33981/30775 37179/33982/30776 40307/33964/30758 38763/33963/30757
+f 32644/33983/30777 32648/33984/30778 32649/33985/30779 32645/33986/30780
+f 32645/33986/30780 32649/33985/30779 37110/33610/30408 37109/33606/30404
+f 32648/33984/30778 38765/33974/30768 38764/33973/30767 32649/33985/30779
+f 32649/33985/30779 38764/33973/30767 40284/33592/30390 37110/33610/30408
+f 32644/33983/30777 32645/33986/30780 32650/33987/30781 32646/33988/30782
+f 32646/33988/30782 32650/33987/30781 38767/33989/30783 38768/33990/30784
+f 32645/33986/30780 37109/33606/30404 37108/33605/30403 32650/33987/30781
+f 32650/33987/30781 37108/33605/30403 40285/33608/30406 38767/33989/30783
+f 32644/33983/30777 32646/33988/30782 32651/33991/30785 32647/33992/30786
+f 32647/33992/30786 32651/33991/30785 37180/33993/30787 37181/33994/30788
+f 32646/33988/30782 38768/33990/30784 38769/33995/30789 32651/33991/30785
+f 32651/33991/30785 38769/33995/30789 40309/33996/30790 37180/33993/30787
+f 32644/33983/30777 32647/33992/30786 32652/33997/30791 32648/33984/30778
+f 32648/33984/30778 32652/33997/30791 38766/33979/30773 38765/33974/30768
+f 32647/33992/30786 37181/33994/30788 37182/33998/30792 32652/33997/30791
+f 32652/33997/30791 37182/33998/30792 40308/33980/30774 38766/33979/30773
+f 32653/33999/30793 32657/34000/30794 32658/34001/30795 32654/34002/30796
+f 32654/34002/30796 32658/34001/30795 37113/33626/30424 37112/33622/30420
+f 32657/34000/30794 38768/33990/30784 38767/33989/30783 32658/34001/30795
+f 32658/34001/30795 38767/33989/30783 40285/33608/30406 37113/33626/30424
+f 32653/33999/30793 32654/34002/30796 32659/34003/30797 32655/34004/30798
+f 32655/34004/30798 32659/34003/30797 38770/34005/30799 38771/34006/30800
+f 32654/34002/30796 37112/33622/30420 37111/33621/30419 32659/34003/30797
+f 32659/34003/30797 37111/33621/30419 40286/33624/30422 38770/34005/30799
+f 32653/33999/30793 32655/34004/30798 32660/34007/30801 32656/34008/30802
+f 32656/34008/30802 32660/34007/30801 37183/34009/30803 37184/34010/30804
+f 32655/34004/30798 38771/34006/30800 38772/34011/30805 32660/34007/30801
+f 32660/34007/30801 38772/34011/30805 40310/34012/30806 37183/34009/30803
+f 32653/33999/30793 32656/34008/30802 32661/34013/30807 32657/34000/30794
+f 32657/34000/30794 32661/34013/30807 38769/33995/30789 38768/33990/30784
+f 32656/34008/30802 37184/34010/30804 37185/34014/30808 32661/34013/30807
+f 32661/34013/30807 37185/34014/30808 40309/33996/30790 38769/33995/30789
+f 32662/34015/30809 32666/34016/30810 32667/34017/30811 32663/34018/30812
+f 32663/34018/30812 32667/34017/30811 37116/33642/30440 37115/33638/30436
+f 32666/34016/30810 38771/34006/30800 38770/34005/30799 32667/34017/30811
+f 32667/34017/30811 38770/34005/30799 40286/33624/30422 37116/33642/30440
+f 32662/34015/30809 32663/34018/30812 32668/34019/30813 32664/34020/30814
+f 32664/34020/30814 32668/34019/30813 38773/34021/30815 38774/34022/30816
+f 32663/34018/30812 37115/33638/30436 37114/33637/30435 32668/34019/30813
+f 32668/34019/30813 37114/33637/30435 40287/33640/30438 38773/34021/30815
+f 32662/34015/30809 32664/34020/30814 32669/34023/30817 32665/34024/30818
+f 32665/34024/30818 32669/34023/30817 37186/34025/30819 37187/34026/30820
+f 32664/34020/30814 38774/34022/30816 38775/34027/30821 32669/34023/30817
+f 32669/34023/30817 38775/34027/30821 40311/34028/30822 37186/34025/30819
+f 32662/34015/30809 32665/34024/30818 32670/34029/30823 32666/34016/30810
+f 32666/34016/30810 32670/34029/30823 38772/34011/30805 38771/34006/30800
+f 32665/34024/30818 37187/34026/30820 37188/34030/30824 32670/34029/30823
+f 32670/34029/30823 37188/34030/30824 40310/34012/30806 38772/34011/30805
+f 32671/34031/30825 32675/34032/30826 32676/34033/30827 32672/34034/30828
+f 32672/34034/30828 32676/34033/30827 37119/33658/30456 37118/33654/30452
+f 32675/34032/30826 38774/34022/30816 38773/34021/30815 32676/34033/30827
+f 32676/34033/30827 38773/34021/30815 40287/33640/30438 37119/33658/30456
+f 32671/34031/30825 32672/34034/30828 32677/34035/30829 32673/34036/30830
+f 32673/34036/30830 32677/34035/30829 38776/34037/30831 38777/34038/30832
+f 32672/34034/30828 37118/33654/30452 37117/33653/30451 32677/34035/30829
+f 32677/34035/30829 37117/33653/30451 40288/33656/30454 38776/34037/30831
+f 32671/34031/30825 32673/34036/30830 32678/34039/30833 32674/34040/30834
+f 32674/34040/30834 32678/34039/30833 37189/34041/30835 37190/34042/30836
+f 32673/34036/30830 38777/34038/30832 38778/34043/30837 32678/34039/30833
+f 32678/34039/30833 38778/34043/30837 40312/34044/30838 37189/34041/30835
+f 32671/34031/30825 32674/34040/30834 32679/34045/30839 32675/34032/30826
+f 32675/34032/30826 32679/34045/30839 38775/34027/30821 38774/34022/30816
+f 32674/34040/30834 37190/34042/30836 37191/34046/30840 32679/34045/30839
+f 32679/34045/30839 37191/34046/30840 40311/34028/30822 38775/34027/30821
+f 32680/34047/30841 32684/34048/30842 32685/34049/30843 32681/34050/30844
+f 32681/34050/30844 32685/34049/30843 37122/33674/30472 37121/33670/30468
+f 32684/34048/30842 38777/34038/30832 38776/34037/30831 32685/34049/30843
+f 32685/34049/30843 38776/34037/30831 40288/33656/30454 37122/33674/30472
+f 32680/34047/30841 32681/34050/30844 32686/34051/30845 32682/34052/30846
+f 32682/34052/30846 32686/34051/30845 38779/34053/30847 38780/34054/30848
+f 32681/34050/30844 37121/33670/30468 37120/33669/30467 32686/34051/30845
+f 32686/34051/30845 37120/33669/30467 40289/33672/30470 38779/34053/30847
+f 32680/34047/30841 32682/34052/30846 32687/34055/30849 32683/34056/30850
+f 32683/34056/30850 32687/34055/30849 37192/34057/30851 37193/34058/30852
+f 32682/34052/30846 38780/34054/30848 38781/34059/30853 32687/34055/30849
+f 32687/34055/30849 38781/34059/30853 40313/34060/30854 37192/34057/30851
+f 32680/34047/30841 32683/34056/30850 32688/34061/30855 32684/34048/30842
+f 32684/34048/30842 32688/34061/30855 38778/34043/30837 38777/34038/30832
+f 32683/34056/30850 37193/34058/30852 37194/34062/30856 32688/34061/30855
+f 32688/34061/30855 37194/34062/30856 40312/34044/30838 38778/34043/30837
+f 32689/34063/30857 32693/34064/30858 32694/34065/30859 32690/34066/30860
+f 32690/34066/30860 32694/34065/30859 37125/33690/30488 37124/33686/30484
+f 32693/34064/30858 38780/34054/30848 38779/34053/30847 32694/34065/30859
+f 32694/34065/30859 38779/34053/30847 40289/33672/30470 37125/33690/30488
+f 32689/34063/30857 32690/34066/30860 32695/34067/30861 32691/34068/30862
+f 32691/34068/30862 32695/34067/30861 38782/34069/30863 38783/34070/30864
+f 32690/34066/30860 37124/33686/30484 37123/33685/30483 32695/34067/30861
+f 32695/34067/30861 37123/33685/30483 40290/33688/30486 38782/34069/30863
+f 32689/34063/30857 32691/34068/30862 32696/34071/30865 32692/34072/30866
+f 32692/34072/30866 32696/34071/30865 37195/34073/30867 37196/34074/30868
+f 32691/34068/30862 38783/34070/30864 38784/34075/30869 32696/34071/30865
+f 32696/34071/30865 38784/34075/30869 40314/34076/30870 37195/34073/30867
+f 32689/34063/30857 32692/34072/30866 32697/34077/30871 32693/34064/30858
+f 32693/34064/30858 32697/34077/30871 38781/34059/30853 38780/34054/30848
+f 32692/34072/30866 37196/34074/30868 37197/34078/30872 32697/34077/30871
+f 32697/34077/30871 37197/34078/30872 40313/34060/30854 38781/34059/30853
+f 32698/34079/30873 32702/34080/30874 32703/34081/30875 32699/34082/30876
+f 32699/34082/30876 32703/34081/30875 37128/33706/30504 37127/33702/30500
+f 32702/34080/30874 38783/34070/30864 38782/34069/30863 32703/34081/30875
+f 32703/34081/30875 38782/34069/30863 40290/33688/30486 37128/33706/30504
+f 32698/34079/30873 32699/34082/30876 32704/34083/30877 32700/34084/30878
+f 32700/34084/30878 32704/34083/30877 38785/34085/30879 38786/34086/30880
+f 32699/34082/30876 37127/33702/30500 37126/33701/30499 32704/34083/30877
+f 32704/34083/30877 37126/33701/30499 40291/33704/30502 38785/34085/30879
+f 32698/34079/30873 32700/34084/30878 32705/34087/30881 32701/34088/30882
+f 32701/34088/30882 32705/34087/30881 37198/34089/30883 37199/34090/30884
+f 32700/34084/30878 38786/34086/30880 38787/34091/30885 32705/34087/30881
+f 32705/34087/30881 38787/34091/30885 40315/34092/30886 37198/34089/30883
+f 32698/34079/30873 32701/34088/30882 32706/34093/30887 32702/34080/30874
+f 32702/34080/30874 32706/34093/30887 38784/34075/30869 38783/34070/30864
+f 32701/34088/30882 37199/34090/30884 37200/34094/30888 32706/34093/30887
+f 32706/34093/30887 37200/34094/30888 40314/34076/30870 38784/34075/30869
+f 32707/34095/30889 32711/34096/30890 32712/34097/30891 32708/34098/30892
+f 32708/34098/30892 32712/34097/30891 37131/33722/30520 37130/33718/30516
+f 32711/34096/30890 38786/34086/30880 38785/34085/30879 32712/34097/30891
+f 32712/34097/30891 38785/34085/30879 40291/33704/30502 37131/33722/30520
+f 32707/34095/30889 32708/34098/30892 32713/34099/30893 32709/34100/30894
+f 32709/34100/30894 32713/34099/30893 38788/34101/30895 38789/34102/30896
+f 32708/34098/30892 37130/33718/30516 37129/33717/30515 32713/34099/30893
+f 32713/34099/30893 37129/33717/30515 40292/33720/30518 38788/34101/30895
+f 32707/34095/30889 32709/34100/30894 32714/34103/30897 32710/34104/30898
+f 32710/34104/30898 32714/34103/30897 37201/34105/30899 37202/34106/30900
+f 32709/34100/30894 38789/34102/30896 38790/34107/30901 32714/34103/30897
+f 32714/34103/30897 38790/34107/30901 40316/34108/30902 37201/34105/30899
+f 32707/34095/30889 32710/34104/30898 32715/34109/30903 32711/34096/30890
+f 32711/34096/30890 32715/34109/30903 38787/34091/30885 38786/34086/30880
+f 32710/34104/30898 37202/34106/30900 37203/34110/30904 32715/34109/30903
+f 32715/34109/30903 37203/34110/30904 40315/34092/30886 38787/34091/30885
+f 32716/34111/30905 32720/34112/30906 32721/34113/30907 32717/34114/30908
+f 32717/34114/30908 32721/34113/30907 37134/33738/30536 37133/33734/30532
+f 32720/34112/30906 38789/34102/30896 38788/34101/30895 32721/34113/30907
+f 32721/34113/30907 38788/34101/30895 40292/33720/30518 37134/33738/30536
+f 32716/34111/30905 32717/34114/30908 32722/34115/30909 32718/34116/30910
+f 32718/34116/30910 32722/34115/30909 38791/34117/30911 38792/34118/30912
+f 32717/34114/30908 37133/33734/30532 37132/33733/30531 32722/34115/30909
+f 32722/34115/30909 37132/33733/30531 40293/33736/30534 38791/34117/30911
+f 32716/34111/30905 32718/34116/30910 32723/34119/30913 32719/34120/30914
+f 32719/34120/30914 32723/34119/30913 37204/34121/30915 37205/34122/30916
+f 32718/34116/30910 38792/34118/30912 38793/34123/30917 32723/34119/30913
+f 32723/34119/30913 38793/34123/30917 40317/34124/30918 37204/34121/30915
+f 32716/34111/30905 32719/34120/30914 32724/34125/30919 32720/34112/30906
+f 32720/34112/30906 32724/34125/30919 38790/34107/30901 38789/34102/30896
+f 32719/34120/30914 37205/34122/30916 37206/34126/30920 32724/34125/30919
+f 32724/34125/30919 37206/34126/30920 40316/34108/30902 38790/34107/30901
+f 32725/34127/30921 32729/34128/30922 32730/34129/30923 32726/34130/30924
+f 32726/34130/30924 32730/34129/30923 37137/33754/30552 37136/33750/30548
+f 32729/34128/30922 38792/34118/30912 38791/34117/30911 32730/34129/30923
+f 32730/34129/30923 38791/34117/30911 40293/33736/30534 37137/33754/30552
+f 32725/34127/30921 32726/34130/30924 32731/34131/30925 32727/34132/30926
+f 32727/34132/30926 32731/34131/30925 38794/34133/30927 38795/34134/30928
+f 32726/34130/30924 37136/33750/30548 37135/33749/30547 32731/34131/30925
+f 32731/34131/30925 37135/33749/30547 40294/33752/30550 38794/34133/30927
+f 32725/34127/30921 32727/34132/30926 32732/34135/30929 32728/34136/30930
+f 32728/34136/30930 32732/34135/30929 37207/34137/30931 37208/34138/30932
+f 32727/34132/30926 38795/34134/30928 38796/34139/30933 32732/34135/30929
+f 32732/34135/30929 38796/34139/30933 40318/34140/30934 37207/34137/30931
+f 32725/34127/30921 32728/34136/30930 32733/34141/30935 32729/34128/30922
+f 32729/34128/30922 32733/34141/30935 38793/34123/30917 38792/34118/30912
+f 32728/34136/30930 37208/34138/30932 37209/34142/30936 32733/34141/30935
+f 32733/34141/30935 37209/34142/30936 40317/34124/30918 38793/34123/30917
+f 32734/34143/30937 32738/34144/30938 32739/34145/30939 32735/34146/30940
+f 32735/34146/30940 32739/34145/30939 37140/33770/30568 37139/33766/30564
+f 32738/34144/30938 38795/34134/30928 38794/34133/30927 32739/34145/30939
+f 32739/34145/30939 38794/34133/30927 40294/33752/30550 37140/33770/30568
+f 32734/34143/30937 32735/34146/30940 32740/34147/30941 32736/34148/30942
+f 32736/34148/30942 32740/34147/30941 38797/34149/30943 38798/34150/30944
+f 32735/34146/30940 37139/33766/30564 37138/33765/30563 32740/34147/30941
+f 32740/34147/30941 37138/33765/30563 40295/33768/30566 38797/34149/30943
+f 32734/34143/30937 32736/34148/30942 32741/34151/30945 32737/34152/30946
+f 32737/34152/30946 32741/34151/30945 37210/34153/30947 37211/34154/30948
+f 32736/34148/30942 38798/34150/30944 38799/34155/30949 32741/34151/30945
+f 32741/34151/30945 38799/34155/30949 40319/34156/30950 37210/34153/30947
+f 32734/34143/30937 32737/34152/30946 32742/34157/30951 32738/34144/30938
+f 32738/34144/30938 32742/34157/30951 38796/34139/30933 38795/34134/30928
+f 32737/34152/30946 37211/34154/30948 37212/34158/30952 32742/34157/30951
+f 32742/34157/30951 37212/34158/30952 40318/34140/30934 38796/34139/30933
+f 32743/34159/30953 32747/34160/30954 32748/34161/30955 32744/34162/30956
+f 32744/34162/30956 32748/34161/30955 37143/33786/30584 37142/33782/30580
+f 32747/34160/30954 38798/34150/30944 38797/34149/30943 32748/34161/30955
+f 32748/34161/30955 38797/34149/30943 40295/33768/30566 37143/33786/30584
+f 32743/34159/30953 32744/34162/30956 32749/34163/30957 32745/34164/30958
+f 32745/34164/30958 32749/34163/30957 38800/34165/30959 38801/34166/30960
+f 32744/34162/30956 37142/33782/30580 37141/33781/30579 32749/34163/30957
+f 32749/34163/30957 37141/33781/30579 40296/33784/30582 38800/34165/30959
+f 32743/34159/30953 32745/34164/30958 32750/34167/30961 32746/34168/30962
+f 32746/34168/30962 32750/34167/30961 37213/34169/30963 37214/34170/30964
+f 32745/34164/30958 38801/34166/30960 38802/34171/30965 32750/34167/30961
+f 32750/34167/30961 38802/34171/30965 40320/34172/30966 37213/34169/30963
+f 32743/34159/30953 32746/34168/30962 32751/34173/30967 32747/34160/30954
+f 32747/34160/30954 32751/34173/30967 38799/34155/30949 38798/34150/30944
+f 32746/34168/30962 37214/34170/30964 37215/34174/30968 32751/34173/30967
+f 32751/34173/30967 37215/34174/30968 40319/34156/30950 38799/34155/30949
+f 32752/34175/30969 32756/34176/30970 32757/34177/30971 32753/34178/30972
+f 32753/34178/30972 32757/34177/30971 37146/33802/30600 37145/33798/30596
+f 32756/34176/30970 38801/34166/30960 38800/34165/30959 32757/34177/30971
+f 32757/34177/30971 38800/34165/30959 40296/33784/30582 37146/33802/30600
+f 32752/34175/30969 32753/34178/30972 32758/34179/30973 32754/34180/30974
+f 32754/34180/30974 32758/34179/30973 38803/34181/30975 38804/34182/30976
+f 32753/34178/30972 37145/33798/30596 37144/33797/30595 32758/34179/30973
+f 32758/34179/30973 37144/33797/30595 40297/33800/30598 38803/34181/30975
+f 32752/34175/30969 32754/34180/30974 32759/34183/30977 32755/34184/30978
+f 32755/34184/30978 32759/34183/30977 37216/34185/30979 37217/34186/30980
+f 32754/34180/30974 38804/34182/30976 38805/34187/30981 32759/34183/30977
+f 32759/34183/30977 38805/34187/30981 40321/34188/30982 37216/34185/30979
+f 32752/34175/30969 32755/34184/30978 32760/34189/30983 32756/34176/30970
+f 32756/34176/30970 32760/34189/30983 38802/34171/30965 38801/34166/30960
+f 32755/34184/30978 37217/34186/30980 37218/34190/30984 32760/34189/30983
+f 32760/34189/30983 37218/34190/30984 40320/34172/30966 38802/34171/30965
+f 32761/34191/30985 32765/34192/30986 32766/34193/30987 32762/34194/30988
+f 32762/34194/30988 32766/34193/30987 37149/33818/30616 37148/33814/30612
+f 32765/34192/30986 38804/34182/30976 38803/34181/30975 32766/34193/30987
+f 32766/34193/30987 38803/34181/30975 40297/33800/30598 37149/33818/30616
+f 32761/34191/30985 32762/34194/30988 32767/34195/30989 32763/34196/30990
+f 32763/34196/30990 32767/34195/30989 38806/34197/30991 38807/34198/30992
+f 32762/34194/30988 37148/33814/30612 37147/33813/30611 32767/34195/30989
+f 32767/34195/30989 37147/33813/30611 40298/33816/30614 38806/34197/30991
+f 32761/34191/30985 32763/34196/30990 32768/34199/30993 32764/34200/30994
+f 32764/34200/30994 32768/34199/30993 37219/34201/30995 37220/34202/30996
+f 32763/34196/30990 38807/34198/30992 38808/34203/30997 32768/34199/30993
+f 32768/34199/30993 38808/34203/30997 40322/34204/30998 37219/34201/30995
+f 32761/34191/30985 32764/34200/30994 32769/34205/30999 32765/34192/30986
+f 32765/34192/30986 32769/34205/30999 38805/34187/30981 38804/34182/30976
+f 32764/34200/30994 37220/34202/30996 37221/34206/31000 32769/34205/30999
+f 32769/34205/30999 37221/34206/31000 40321/34188/30982 38805/34187/30981
+f 32770/34207/31001 32774/34208/31002 32775/34209/31003 32771/34210/31004
+f 32771/34210/31004 32775/34209/31003 37152/33834/30632 37151/33830/30628
+f 32774/34208/31002 38807/34198/30992 38806/34197/30991 32775/34209/31003
+f 32775/34209/31003 38806/34197/30991 40298/33816/30614 37152/33834/30632
+f 32770/34207/31001 32771/34210/31004 32776/34211/31005 32772/34212/31006
+f 32772/34212/31006 32776/34211/31005 38809/34213/31007 38810/34214/31008
+f 32771/34210/31004 37151/33830/30628 37150/33829/30627 32776/34211/31005
+f 32776/34211/31005 37150/33829/30627 40299/33832/30630 38809/34213/31007
+f 32770/34207/31001 32772/34212/31006 32777/34215/31009 32773/34216/31010
+f 32773/34216/31010 32777/34215/31009 37222/34217/31011 37223/34218/31012
+f 32772/34212/31006 38810/34214/31008 38811/34219/31013 32777/34215/31009
+f 32777/34215/31009 38811/34219/31013 40323/34220/31014 37222/34217/31011
+f 32770/34207/31001 32773/34216/31010 32778/34221/31015 32774/34208/31002
+f 32774/34208/31002 32778/34221/31015 38808/34203/30997 38807/34198/30992
+f 32773/34216/31010 37223/34218/31012 37224/34222/31016 32778/34221/31015
+f 32778/34221/31015 37224/34222/31016 40322/34204/30998 38808/34203/30997
+f 32779/34223/31017 32783/34224/31018 32784/34225/31019 32780/34226/31020
+f 32780/34226/31020 32784/34225/31019 37155/33850/30644 37154/33846/30642
+f 32783/34224/31018 38810/34214/31008 38809/34213/31007 32784/34225/31019
+f 32784/34225/31019 38809/34213/31007 40299/33832/30630 37155/33850/30644
+f 32779/34223/31017 32780/34226/31020 32785/34227/31021 32781/34228/31022
+f 32781/34228/31022 32785/34227/31021 38742/34229/30650 38741/34230/30649
+f 32780/34226/31020 37154/33846/30642 37153/33845/30641 32785/34227/31021
+f 32785/34227/31021 37153/33845/30641 40276/33848/30280 38742/34229/30650
+f 32779/34223/31017 32781/34228/31022 32786/34231/31023 32782/34232/31024
+f 32782/34232/31024 32786/34231/31023 37225/34233/31025 37226/34234/31026
+f 32781/34228/31022 38741/34230/30649 38740/34235/30662 32786/34231/31023
+f 32786/34231/31023 38740/34235/30662 40300/34236/30664 37225/34233/31025
+f 32779/34223/31017 32782/34232/31024 32787/34237/31027 32783/34224/31018
+f 32783/34224/31018 32787/34237/31027 38811/34219/31013 38810/34214/31008
+f 32782/34232/31024 37226/34234/31026 37227/34238/31028 32787/34237/31027
+f 32787/34237/31027 37227/34238/31028 40323/34220/31014 38811/34219/31013
+f 32788/34239/31029 32792/34240/31030 32793/34241/31031 32789/34242/31032
+f 32789/34242/31032 32793/34241/31031 37158/33869/30663 37157/33864/30658
+f 32792/34240/31030 38813/34243/31033 38814/34244/31034 32793/34241/31031
+f 32793/34241/31031 38814/34244/31034 40300/33870/30664 37158/33869/30663
+f 32788/34239/31029 32789/34242/31032 32794/34245/31035 32790/34246/31036
+f 32790/34246/31036 32794/34245/31035 38815/34247/31037 38816/34248/31038
+f 32789/34242/31032 37157/33864/30658 37156/33863/30657 32794/34245/31035
+f 32794/34245/31035 37156/33863/30657 40301/33866/30660 38815/34247/31037
+f 32788/34239/31029 32790/34246/31036 32795/34249/31039 32791/34250/31040
+f 32791/34250/31040 32795/34249/31039 37228/34251/31041 37229/34252/31042
+f 32790/34246/31036 38816/34248/31038 38817/34253/31043 32795/34249/31039
+f 32795/34249/31039 38817/34253/31043 40325/34254/31044 37228/34251/31041
+f 32788/34239/31029 32791/34250/31040 32796/34255/31045 32792/34240/31030
+f 32792/34240/31030 32796/34255/31045 38812/34256/31046 38813/34243/31033
+f 32791/34250/31040 37229/34252/31042 37230/34257/31047 32796/34255/31045
+f 32796/34255/31045 37230/34257/31047 40324/34258/31048 38812/34256/31046
+f 32797/34259/31049 32801/34260/31050 32802/34261/31051 32798/34262/31052
+f 32798/34262/31052 32802/34261/31051 37161/33886/30680 37160/33882/30676
+f 32801/34260/31050 38816/34248/31038 38815/34247/31037 32802/34261/31051
+f 32802/34261/31051 38815/34247/31037 40301/33866/30660 37161/33886/30680
+f 32797/34259/31049 32798/34262/31052 32803/34263/31053 32799/34264/31054
+f 32799/34264/31054 32803/34263/31053 38818/34265/31055 38819/34266/31056
+f 32798/34262/31052 37160/33882/30676 37159/33881/30675 32803/34263/31053
+f 32803/34263/31053 37159/33881/30675 40302/33884/30678 38818/34265/31055
+f 32797/34259/31049 32799/34264/31054 32804/34267/31057 32800/34268/31058
+f 32800/34268/31058 32804/34267/31057 37231/34269/31059 37232/34270/31060
+f 32799/34264/31054 38819/34266/31056 38820/34271/31061 32804/34267/31057
+f 32804/34267/31057 38820/34271/31061 40326/34272/31062 37231/34269/31059
+f 32797/34259/31049 32800/34268/31058 32805/34273/31063 32801/34260/31050
+f 32801/34260/31050 32805/34273/31063 38817/34253/31043 38816/34248/31038
+f 32800/34268/31058 37232/34270/31060 37233/34274/31064 32805/34273/31063
+f 32805/34273/31063 37233/34274/31064 40325/34254/31044 38817/34253/31043
+f 32806/34275/31065 32810/34276/31066 32811/34277/31067 32807/34278/31068
+f 32807/34278/31068 32811/34277/31067 37164/33902/30696 37163/33898/30692
+f 32810/34276/31066 38819/34266/31056 38818/34265/31055 32811/34277/31067
+f 32811/34277/31067 38818/34265/31055 40302/33884/30678 37164/33902/30696
+f 32806/34275/31065 32807/34278/31068 32812/34279/31069 32808/34280/31070
+f 32808/34280/31070 32812/34279/31069 38821/34281/31071 38822/34282/31072
+f 32807/34278/31068 37163/33898/30692 37162/33897/30691 32812/34279/31069
+f 32812/34279/31069 37162/33897/30691 40303/33900/30694 38821/34281/31071
+f 32806/34275/31065 32808/34280/31070 32813/34283/31073 32809/34284/31074
+f 32809/34284/31074 32813/34283/31073 37234/34285/31075 37235/34286/31076
+f 32808/34280/31070 38822/34282/31072 38823/34287/31077 32813/34283/31073
+f 32813/34283/31073 38823/34287/31077 40327/34288/31078 37234/34285/31075
+f 32806/34275/31065 32809/34284/31074 32814/34289/31079 32810/34276/31066
+f 32810/34276/31066 32814/34289/31079 38820/34271/31061 38819/34266/31056
+f 32809/34284/31074 37235/34286/31076 37236/34290/31080 32814/34289/31079
+f 32814/34289/31079 37236/34290/31080 40326/34272/31062 38820/34271/31061
+f 32815/34291/31081 32819/34292/31082 32820/34293/31083 32816/34294/31084
+f 32816/34294/31084 32820/34293/31083 37167/33918/30712 37166/33914/30708
+f 32819/34292/31082 38822/34282/31072 38821/34281/31071 32820/34293/31083
+f 32820/34293/31083 38821/34281/31071 40303/33900/30694 37167/33918/30712
+f 32815/34291/31081 32816/34294/31084 32821/34295/31085 32817/34296/31086
+f 32817/34296/31086 32821/34295/31085 38824/34297/31087 38825/34298/31088
+f 32816/34294/31084 37166/33914/30708 37165/33913/30707 32821/34295/31085
+f 32821/34295/31085 37165/33913/30707 40304/33916/30710 38824/34297/31087
+f 32815/34291/31081 32817/34296/31086 32822/34299/31089 32818/34300/31090
+f 32818/34300/31090 32822/34299/31089 37237/34301/31091 37238/34302/31092
+f 32817/34296/31086 38825/34298/31088 38826/34303/31093 32822/34299/31089
+f 32822/34299/31089 38826/34303/31093 40328/34304/31094 37237/34301/31091
+f 32815/34291/31081 32818/34300/31090 32823/34305/31095 32819/34292/31082
+f 32819/34292/31082 32823/34305/31095 38823/34287/31077 38822/34282/31072
+f 32818/34300/31090 37238/34302/31092 37239/34306/31096 32823/34305/31095
+f 32823/34305/31095 37239/34306/31096 40327/34288/31078 38823/34287/31077
+f 32824/34307/31097 32828/34308/31098 32829/34309/31099 32825/34310/31100
+f 32825/34310/31100 32829/34309/31099 37170/33934/30728 37169/33930/30724
+f 32828/34308/31098 38825/34298/31088 38824/34297/31087 32829/34309/31099
+f 32829/34309/31099 38824/34297/31087 40304/33916/30710 37170/33934/30728
+f 32824/34307/31097 32825/34310/31100 32830/34311/31101 32826/34312/31102
+f 32826/34312/31102 32830/34311/31101 38827/34313/31103 38828/34314/31104
+f 32825/34310/31100 37169/33930/30724 37168/33929/30723 32830/34311/31101
+f 32830/34311/31101 37168/33929/30723 40305/33932/30726 38827/34313/31103
+f 32824/34307/31097 32826/34312/31102 32831/34315/31105 32827/34316/31106
+f 32827/34316/31106 32831/34315/31105 37240/34317/31107 37241/34318/31108
+f 32826/34312/31102 38828/34314/31104 38829/34319/31109 32831/34315/31105
+f 32831/34315/31105 38829/34319/31109 40329/34320/31110 37240/34317/31107
+f 32824/34307/31097 32827/34316/31106 32832/34321/31111 32828/34308/31098
+f 32828/34308/31098 32832/34321/31111 38826/34303/31093 38825/34298/31088
+f 32827/34316/31106 37241/34318/31108 37242/34322/31112 32832/34321/31111
+f 32832/34321/31111 37242/34322/31112 40328/34304/31094 38826/34303/31093
+f 32833/34323/31113 32837/34324/31114 32838/34325/31115 32834/34326/31116
+f 32834/34326/31116 32838/34325/31115 37173/33950/30744 37172/33946/30740
+f 32837/34324/31114 38828/34314/31104 38827/34313/31103 32838/34325/31115
+f 32838/34325/31115 38827/34313/31103 40305/33932/30726 37173/33950/30744
+f 32833/34323/31113 32834/34326/31116 32839/34327/31117 32835/34328/31118
+f 32835/34328/31118 32839/34327/31117 38830/34329/31119 38831/34330/31120
+f 32834/34326/31116 37172/33946/30740 37171/33945/30739 32839/34327/31117
+f 32839/34327/31117 37171/33945/30739 40306/33948/30742 38830/34329/31119
+f 32833/34323/31113 32835/34328/31118 32840/34331/31121 32836/34332/31122
+f 32836/34332/31122 32840/34331/31121 37243/34333/31123 37244/34334/31124
+f 32835/34328/31118 38831/34330/31120 38832/34335/31125 32840/34331/31121
+f 32840/34331/31121 38832/34335/31125 40330/34336/31126 37243/34333/31123
+f 32833/34323/31113 32836/34332/31122 32841/34337/31127 32837/34324/31114
+f 32837/34324/31114 32841/34337/31127 38829/34319/31109 38828/34314/31104
+f 32836/34332/31122 37244/34334/31124 37245/34338/31128 32841/34337/31127
+f 32841/34337/31127 37245/34338/31128 40329/34320/31110 38829/34319/31109
+f 32842/34339/31129 32846/34340/31130 32847/34341/31131 32843/34342/31132
+f 32843/34342/31132 32847/34341/31131 37176/33966/30760 37175/33962/30756
+f 32846/34340/31130 38831/34330/31120 38830/34329/31119 32847/34341/31131
+f 32847/34341/31131 38830/34329/31119 40306/33948/30742 37176/33966/30760
+f 32842/34339/31129 32843/34342/31132 32848/34343/31133 32844/34344/31134
+f 32844/34344/31134 32848/34343/31133 38833/34345/31135 38834/34346/31136
+f 32843/34342/31132 37175/33962/30756 37174/33961/30755 32848/34343/31133
+f 32848/34343/31133 37174/33961/30755 40307/33964/30758 38833/34345/31135
+f 32842/34339/31129 32844/34344/31134 32849/34347/31137 32845/34348/31138
+f 32845/34348/31138 32849/34347/31137 37246/34349/31139 37247/34350/31140
+f 32844/34344/31134 38834/34346/31136 38835/34351/31141 32849/34347/31137
+f 32849/34347/31137 38835/34351/31141 40331/34352/31142 37246/34349/31139
+f 32842/34339/31129 32845/34348/31138 32850/34353/31143 32846/34340/31130
+f 32846/34340/31130 32850/34353/31143 38832/34335/31125 38831/34330/31120
+f 32845/34348/31138 37247/34350/31140 37248/34354/31144 32850/34353/31143
+f 32850/34353/31143 37248/34354/31144 40330/34336/31126 38832/34335/31125
+f 32851/34355/31145 32855/34356/31146 32856/34357/31147 32852/34358/31148
+f 32852/34358/31148 32856/34357/31147 37179/33982/30776 37178/33978/30772
+f 32855/34356/31146 38834/34346/31136 38833/34345/31135 32856/34357/31147
+f 32856/34357/31147 38833/34345/31135 40307/33964/30758 37179/33982/30776
+f 32851/34355/31145 32852/34358/31148 32857/34359/31149 32853/34360/31150
+f 32853/34360/31150 32857/34359/31149 38836/34361/31151 38837/34362/31152
+f 32852/34358/31148 37178/33978/30772 37177/33977/30771 32857/34359/31149
+f 32857/34359/31149 37177/33977/30771 40308/33980/30774 38836/34361/31151
+f 32851/34355/31145 32853/34360/31150 32858/34363/31153 32854/34364/31154
+f 32854/34364/31154 32858/34363/31153 37249/34365/31155 37250/34366/31156
+f 32853/34360/31150 38837/34362/31152 38838/34367/31157 32858/34363/31153
+f 32858/34363/31153 38838/34367/31157 40332/34368/31158 37249/34365/31155
+f 32851/34355/31145 32854/34364/31154 32859/34369/31159 32855/34356/31146
+f 32855/34356/31146 32859/34369/31159 38835/34351/31141 38834/34346/31136
+f 32854/34364/31154 37250/34366/31156 37251/34370/31160 32859/34369/31159
+f 32859/34369/31159 37251/34370/31160 40331/34352/31142 38835/34351/31141
+f 32860/34371/31161 32864/34372/31162 32865/34373/31163 32861/34374/31164
+f 32861/34374/31164 32865/34373/31163 37182/33998/30792 37181/33994/30788
+f 32864/34372/31162 38837/34362/31152 38836/34361/31151 32865/34373/31163
+f 32865/34373/31163 38836/34361/31151 40308/33980/30774 37182/33998/30792
+f 32860/34371/31161 32861/34374/31164 32866/34375/31165 32862/34376/31166
+f 32862/34376/31166 32866/34375/31165 38839/34377/31167 38840/34378/31168
+f 32861/34374/31164 37181/33994/30788 37180/33993/30787 32866/34375/31165
+f 32866/34375/31165 37180/33993/30787 40309/33996/30790 38839/34377/31167
+f 32860/34371/31161 32862/34376/31166 32867/34379/31169 32863/34380/31170
+f 32863/34380/31170 32867/34379/31169 37252/34381/31171 37253/34382/31172
+f 32862/34376/31166 38840/34378/31168 38841/34383/31173 32867/34379/31169
+f 32867/34379/31169 38841/34383/31173 40333/34384/31174 37252/34381/31171
+f 32860/34371/31161 32863/34380/31170 32868/34385/31175 32864/34372/31162
+f 32864/34372/31162 32868/34385/31175 38838/34367/31157 38837/34362/31152
+f 32863/34380/31170 37253/34382/31172 37254/34386/31176 32868/34385/31175
+f 32868/34385/31175 37254/34386/31176 40332/34368/31158 38838/34367/31157
+f 32869/34387/31177 32873/34388/31178 32874/34389/31179 32870/34390/31180
+f 32870/34390/31180 32874/34389/31179 37185/34014/30808 37184/34010/30804
+f 32873/34388/31178 38840/34378/31168 38839/34377/31167 32874/34389/31179
+f 32874/34389/31179 38839/34377/31167 40309/33996/30790 37185/34014/30808
+f 32869/34387/31177 32870/34390/31180 32875/34391/31181 32871/34392/31182
+f 32871/34392/31182 32875/34391/31181 38842/34393/31183 38843/34394/31184
+f 32870/34390/31180 37184/34010/30804 37183/34009/30803 32875/34391/31181
+f 32875/34391/31181 37183/34009/30803 40310/34012/30806 38842/34393/31183
+f 32869/34387/31177 32871/34392/31182 32876/34395/31185 32872/34396/31186
+f 32872/34396/31186 32876/34395/31185 37255/34397/31187 37256/34398/31188
+f 32871/34392/31182 38843/34394/31184 38844/34399/31189 32876/34395/31185
+f 32876/34395/31185 38844/34399/31189 40334/34400/31190 37255/34397/31187
+f 32869/34387/31177 32872/34396/31186 32877/34401/31191 32873/34388/31178
+f 32873/34388/31178 32877/34401/31191 38841/34383/31173 38840/34378/31168
+f 32872/34396/31186 37256/34398/31188 37257/34402/31192 32877/34401/31191
+f 32877/34401/31191 37257/34402/31192 40333/34384/31174 38841/34383/31173
+f 32878/34403/31193 32882/34404/31194 32883/34405/31195 32879/34406/31196
+f 32879/34406/31196 32883/34405/31195 37188/34030/30824 37187/34026/30820
+f 32882/34404/31194 38843/34394/31184 38842/34393/31183 32883/34405/31195
+f 32883/34405/31195 38842/34393/31183 40310/34012/30806 37188/34030/30824
+f 32878/34403/31193 32879/34406/31196 32884/34407/31197 32880/34408/31198
+f 32880/34408/31198 32884/34407/31197 38845/34409/31199 38846/34410/31200
+f 32879/34406/31196 37187/34026/30820 37186/34025/30819 32884/34407/31197
+f 32884/34407/31197 37186/34025/30819 40311/34028/30822 38845/34409/31199
+f 32878/34403/31193 32880/34408/31198 32885/34411/31201 32881/34412/31202
+f 32881/34412/31202 32885/34411/31201 37258/34413/31203 37259/34414/31204
+f 32880/34408/31198 38846/34410/31200 38847/34415/31205 32885/34411/31201
+f 32885/34411/31201 38847/34415/31205 40335/34416/31206 37258/34413/31203
+f 32878/34403/31193 32881/34412/31202 32886/34417/31207 32882/34404/31194
+f 32882/34404/31194 32886/34417/31207 38844/34399/31189 38843/34394/31184
+f 32881/34412/31202 37259/34414/31204 37260/34418/31208 32886/34417/31207
+f 32886/34417/31207 37260/34418/31208 40334/34400/31190 38844/34399/31189
+f 32887/34419/31209 32891/34420/31210 32892/34421/31211 32888/34422/31212
+f 32888/34422/31212 32892/34421/31211 37191/34046/30840 37190/34042/30836
+f 32891/34420/31210 38846/34410/31200 38845/34409/31199 32892/34421/31211
+f 32892/34421/31211 38845/34409/31199 40311/34028/30822 37191/34046/30840
+f 32887/34419/31209 32888/34422/31212 32893/34423/31213 32889/34424/31214
+f 32889/34424/31214 32893/34423/31213 38848/34425/31215 38849/34426/31216
+f 32888/34422/31212 37190/34042/30836 37189/34041/30835 32893/34423/31213
+f 32893/34423/31213 37189/34041/30835 40312/34044/30838 38848/34425/31215
+f 32887/34419/31209 32889/34424/31214 32894/34427/31217 32890/34428/31218
+f 32890/34428/31218 32894/34427/31217 37261/34429/31219 37262/34430/31220
+f 32889/34424/31214 38849/34426/31216 38850/34431/31221 32894/34427/31217
+f 32894/34427/31217 38850/34431/31221 40336/34432/31222 37261/34429/31219
+f 32887/34419/31209 32890/34428/31218 32895/34433/31223 32891/34420/31210
+f 32891/34420/31210 32895/34433/31223 38847/34415/31205 38846/34410/31200
+f 32890/34428/31218 37262/34430/31220 37263/34434/31224 32895/34433/31223
+f 32895/34433/31223 37263/34434/31224 40335/34416/31206 38847/34415/31205
+f 32896/34435/31225 32900/34436/31226 32901/34437/31227 32897/34438/31228
+f 32897/34438/31228 32901/34437/31227 37194/34062/30856 37193/34058/30852
+f 32900/34436/31226 38849/34426/31216 38848/34425/31215 32901/34437/31227
+f 32901/34437/31227 38848/34425/31215 40312/34044/30838 37194/34062/30856
+f 32896/34435/31225 32897/34438/31228 32902/34439/31229 32898/34440/31230
+f 32898/34440/31230 32902/34439/31229 38851/34441/31231 38852/34442/31232
+f 32897/34438/31228 37193/34058/30852 37192/34057/30851 32902/34439/31229
+f 32902/34439/31229 37192/34057/30851 40313/34060/30854 38851/34441/31231
+f 32896/34435/31225 32898/34440/31230 32903/34443/31233 32899/34444/31234
+f 32899/34444/31234 32903/34443/31233 37264/34445/31235 37265/34446/31236
+f 32898/34440/31230 38852/34442/31232 38853/34447/31237 32903/34443/31233
+f 32903/34443/31233 38853/34447/31237 40337/34448/31238 37264/34445/31235
+f 32896/34435/31225 32899/34444/31234 32904/34449/31239 32900/34436/31226
+f 32900/34436/31226 32904/34449/31239 38850/34431/31221 38849/34426/31216
+f 32899/34444/31234 37265/34446/31236 37266/34450/31240 32904/34449/31239
+f 32904/34449/31239 37266/34450/31240 40336/34432/31222 38850/34431/31221
+f 32905/34451/31241 32909/34452/31242 32910/34453/31243 32906/34454/31244
+f 32906/34454/31244 32910/34453/31243 37197/34078/30872 37196/34074/30868
+f 32909/34452/31242 38852/34442/31232 38851/34441/31231 32910/34453/31243
+f 32910/34453/31243 38851/34441/31231 40313/34060/30854 37197/34078/30872
+f 32905/34451/31241 32906/34454/31244 32911/34455/31245 32907/34456/31246
+f 32907/34456/31246 32911/34455/31245 38854/34457/31247 38855/34458/31248
+f 32906/34454/31244 37196/34074/30868 37195/34073/30867 32911/34455/31245
+f 32911/34455/31245 37195/34073/30867 40314/34076/30870 38854/34457/31247
+f 32905/34451/31241 32907/34456/31246 32912/34459/31249 32908/34460/31250
+f 32908/34460/31250 32912/34459/31249 37267/34461/31251 37268/34462/31252
+f 32907/34456/31246 38855/34458/31248 38856/34463/31253 32912/34459/31249
+f 32912/34459/31249 38856/34463/31253 40338/34464/31254 37267/34461/31251
+f 32905/34451/31241 32908/34460/31250 32913/34465/31255 32909/34452/31242
+f 32909/34452/31242 32913/34465/31255 38853/34447/31237 38852/34442/31232
+f 32908/34460/31250 37268/34462/31252 37269/34466/31256 32913/34465/31255
+f 32913/34465/31255 37269/34466/31256 40337/34448/31238 38853/34447/31237
+f 32914/34467/31257 32918/34468/31258 32919/34469/31259 32915/34470/31260
+f 32915/34470/31260 32919/34469/31259 37200/34094/30888 37199/34090/30884
+f 32918/34468/31258 38855/34458/31248 38854/34457/31247 32919/34469/31259
+f 32919/34469/31259 38854/34457/31247 40314/34076/30870 37200/34094/30888
+f 32914/34467/31257 32915/34470/31260 32920/34471/31261 32916/34472/31262
+f 32916/34472/31262 32920/34471/31261 38857/34473/31263 38858/34474/31264
+f 32915/34470/31260 37199/34090/30884 37198/34089/30883 32920/34471/31261
+f 32920/34471/31261 37198/34089/30883 40315/34092/30886 38857/34473/31263
+f 32914/34467/31257 32916/34472/31262 32921/34475/31265 32917/34476/31266
+f 32917/34476/31266 32921/34475/31265 37270/34477/31267 37271/34478/31268
+f 32916/34472/31262 38858/34474/31264 38859/34479/31269 32921/34475/31265
+f 32921/34475/31265 38859/34479/31269 40339/34480/31270 37270/34477/31267
+f 32914/34467/31257 32917/34476/31266 32922/34481/31271 32918/34468/31258
+f 32918/34468/31258 32922/34481/31271 38856/34463/31253 38855/34458/31248
+f 32917/34476/31266 37271/34478/31268 37272/34482/31272 32922/34481/31271
+f 32922/34481/31271 37272/34482/31272 40338/34464/31254 38856/34463/31253
+f 32923/34483/31273 32927/34484/31274 32928/34485/31275 32924/34486/31276
+f 32924/34486/31276 32928/34485/31275 37203/34110/30904 37202/34106/30900
+f 32927/34484/31274 38858/34474/31264 38857/34473/31263 32928/34485/31275
+f 32928/34485/31275 38857/34473/31263 40315/34092/30886 37203/34110/30904
+f 32923/34483/31273 32924/34486/31276 32929/34487/31277 32925/34488/31278
+f 32925/34488/31278 32929/34487/31277 38860/34489/31279 38861/34490/31280
+f 32924/34486/31276 37202/34106/30900 37201/34105/30899 32929/34487/31277
+f 32929/34487/31277 37201/34105/30899 40316/34108/30902 38860/34489/31279
+f 32923/34483/31273 32925/34488/31278 32930/34491/31281 32926/34492/31282
+f 32926/34492/31282 32930/34491/31281 37273/34493/31283 37274/34494/31284
+f 32925/34488/31278 38861/34490/31280 38862/34495/31285 32930/34491/31281
+f 32930/34491/31281 38862/34495/31285 40340/34496/31286 37273/34493/31283
+f 32923/34483/31273 32926/34492/31282 32931/34497/31287 32927/34484/31274
+f 32927/34484/31274 32931/34497/31287 38859/34479/31269 38858/34474/31264
+f 32926/34492/31282 37274/34494/31284 37275/34498/31288 32931/34497/31287
+f 32931/34497/31287 37275/34498/31288 40339/34480/31270 38859/34479/31269
+f 32932/34499/31289 32936/34500/31290 32937/34501/31291 32933/34502/31292
+f 32933/34502/31292 32937/34501/31291 37206/34126/30920 37205/34122/30916
+f 32936/34500/31290 38861/34490/31280 38860/34489/31279 32937/34501/31291
+f 32937/34501/31291 38860/34489/31279 40316/34108/30902 37206/34126/30920
+f 32932/34499/31289 32933/34502/31292 32938/34503/31293 32934/34504/31294
+f 32934/34504/31294 32938/34503/31293 38863/34505/31295 38864/34506/31296
+f 32933/34502/31292 37205/34122/30916 37204/34121/30915 32938/34503/31293
+f 32938/34503/31293 37204/34121/30915 40317/34124/30918 38863/34505/31295
+f 32932/34499/31289 32934/34504/31294 32939/34507/31297 32935/34508/31298
+f 32935/34508/31298 32939/34507/31297 37276/34509/31299 37277/34510/31300
+f 32934/34504/31294 38864/34506/31296 38865/34511/31301 32939/34507/31297
+f 32939/34507/31297 38865/34511/31301 40341/34512/31302 37276/34509/31299
+f 32932/34499/31289 32935/34508/31298 32940/34513/31303 32936/34500/31290
+f 32936/34500/31290 32940/34513/31303 38862/34495/31285 38861/34490/31280
+f 32935/34508/31298 37277/34510/31300 37278/34514/31304 32940/34513/31303
+f 32940/34513/31303 37278/34514/31304 40340/34496/31286 38862/34495/31285
+f 32941/34515/31305 32945/34516/31306 32946/34517/31307 32942/34518/31308
+f 32942/34518/31308 32946/34517/31307 37209/34142/30936 37208/34138/30932
+f 32945/34516/31306 38864/34506/31296 38863/34505/31295 32946/34517/31307
+f 32946/34517/31307 38863/34505/31295 40317/34124/30918 37209/34142/30936
+f 32941/34515/31305 32942/34518/31308 32947/34519/31309 32943/34520/31310
+f 32943/34520/31310 32947/34519/31309 38866/34521/31311 38867/34522/31312
+f 32942/34518/31308 37208/34138/30932 37207/34137/30931 32947/34519/31309
+f 32947/34519/31309 37207/34137/30931 40318/34140/30934 38866/34521/31311
+f 32941/34515/31305 32943/34520/31310 32948/34523/31313 32944/34524/31314
+f 32944/34524/31314 32948/34523/31313 37279/34525/31315 37280/34526/31316
+f 32943/34520/31310 38867/34522/31312 38868/34527/31317 32948/34523/31313
+f 32948/34523/31313 38868/34527/31317 40342/34528/31318 37279/34525/31315
+f 32941/34515/31305 32944/34524/31314 32949/34529/31319 32945/34516/31306
+f 32945/34516/31306 32949/34529/31319 38865/34511/31301 38864/34506/31296
+f 32944/34524/31314 37280/34526/31316 37281/34530/31320 32949/34529/31319
+f 32949/34529/31319 37281/34530/31320 40341/34512/31302 38865/34511/31301
+f 32950/34531/31321 32954/34532/31322 32955/34533/31323 32951/34534/31324
+f 32951/34534/31324 32955/34533/31323 37212/34158/30952 37211/34154/30948
+f 32954/34532/31322 38867/34522/31312 38866/34521/31311 32955/34533/31323
+f 32955/34533/31323 38866/34521/31311 40318/34140/30934 37212/34158/30952
+f 32950/34531/31321 32951/34534/31324 32956/34535/31325 32952/34536/31326
+f 32952/34536/31326 32956/34535/31325 38869/34537/31327 38870/34538/31328
+f 32951/34534/31324 37211/34154/30948 37210/34153/30947 32956/34535/31325
+f 32956/34535/31325 37210/34153/30947 40319/34156/30950 38869/34537/31327
+f 32950/34531/31321 32952/34536/31326 32957/34539/31329 32953/34540/31330
+f 32953/34540/31330 32957/34539/31329 37282/34541/31331 37283/34542/31332
+f 32952/34536/31326 38870/34538/31328 38871/34543/31333 32957/34539/31329
+f 32957/34539/31329 38871/34543/31333 40343/34544/31334 37282/34541/31331
+f 32950/34531/31321 32953/34540/31330 32958/34545/31335 32954/34532/31322
+f 32954/34532/31322 32958/34545/31335 38868/34527/31317 38867/34522/31312
+f 32953/34540/31330 37283/34542/31332 37284/34546/31336 32958/34545/31335
+f 32958/34545/31335 37284/34546/31336 40342/34528/31318 38868/34527/31317
+f 32959/34547/31337 32963/34548/31338 32964/34549/31339 32960/34550/31340
+f 32960/34550/31340 32964/34549/31339 37215/34174/30968 37214/34170/30964
+f 32963/34548/31338 38870/34538/31328 38869/34537/31327 32964/34549/31339
+f 32964/34549/31339 38869/34537/31327 40319/34156/30950 37215/34174/30968
+f 32959/34547/31337 32960/34550/31340 32965/34551/31341 32961/34552/31342
+f 32961/34552/31342 32965/34551/31341 38872/34553/31343 38873/34554/31344
+f 32960/34550/31340 37214/34170/30964 37213/34169/30963 32965/34551/31341
+f 32965/34551/31341 37213/34169/30963 40320/34172/30966 38872/34553/31343
+f 32959/34547/31337 32961/34552/31342 32966/34555/31345 32962/34556/31346
+f 32962/34556/31346 32966/34555/31345 37285/34557/31347 37286/34558/31348
+f 32961/34552/31342 38873/34554/31344 38874/34559/31349 32966/34555/31345
+f 32966/34555/31345 38874/34559/31349 40344/34560/31350 37285/34557/31347
+f 32959/34547/31337 32962/34556/31346 32967/34561/31351 32963/34548/31338
+f 32963/34548/31338 32967/34561/31351 38871/34543/31333 38870/34538/31328
+f 32962/34556/31346 37286/34558/31348 37287/34562/31352 32967/34561/31351
+f 32967/34561/31351 37287/34562/31352 40343/34544/31334 38871/34543/31333
+f 32968/34563/31353 32972/34564/31354 32973/34565/31355 32969/34566/31356
+f 32969/34566/31356 32973/34565/31355 37218/34190/30984 37217/34186/30980
+f 32972/34564/31354 38873/34554/31344 38872/34553/31343 32973/34565/31355
+f 32973/34565/31355 38872/34553/31343 40320/34172/30966 37218/34190/30984
+f 32968/34563/31353 32969/34566/31356 32974/34567/31357 32970/34568/31358
+f 32970/34568/31358 32974/34567/31357 38875/34569/31359 38876/34570/31360
+f 32969/34566/31356 37217/34186/30980 37216/34185/30979 32974/34567/31357
+f 32974/34567/31357 37216/34185/30979 40321/34188/30982 38875/34569/31359
+f 32968/34563/31353 32970/34568/31358 32975/34571/31361 32971/34572/31362
+f 32971/34572/31362 32975/34571/31361 37288/34573/31363 37289/34574/31364
+f 32970/34568/31358 38876/34570/31360 38877/34575/31365 32975/34571/31361
+f 32975/34571/31361 38877/34575/31365 40345/34576/31366 37288/34573/31363
+f 32968/34563/31353 32971/34572/31362 32976/34577/31367 32972/34564/31354
+f 32972/34564/31354 32976/34577/31367 38874/34559/31349 38873/34554/31344
+f 32971/34572/31362 37289/34574/31364 37290/34578/31368 32976/34577/31367
+f 32976/34577/31367 37290/34578/31368 40344/34560/31350 38874/34559/31349
+f 32977/34579/31369 32981/34580/31370 32982/34581/31371 32978/34582/31372
+f 32978/34582/31372 32982/34581/31371 37221/34206/31000 37220/34202/30996
+f 32981/34580/31370 38876/34570/31360 38875/34569/31359 32982/34581/31371
+f 32982/34581/31371 38875/34569/31359 40321/34188/30982 37221/34206/31000
+f 32977/34579/31369 32978/34582/31372 32983/34583/31373 32979/34584/31374
+f 32979/34584/31374 32983/34583/31373 38878/34585/31375 38879/34586/31376
+f 32978/34582/31372 37220/34202/30996 37219/34201/30995 32983/34583/31373
+f 32983/34583/31373 37219/34201/30995 40322/34204/30998 38878/34585/31375
+f 32977/34579/31369 32979/34584/31374 32984/34587/31377 32980/34588/31378
+f 32980/34588/31378 32984/34587/31377 37291/34589/31379 37292/34590/31380
+f 32979/34584/31374 38879/34586/31376 38880/34591/31381 32984/34587/31377
+f 32984/34587/31377 38880/34591/31381 40346/34592/31382 37291/34589/31379
+f 32977/34579/31369 32980/34588/31378 32985/34593/31383 32981/34580/31370
+f 32981/34580/31370 32985/34593/31383 38877/34575/31365 38876/34570/31360
+f 32980/34588/31378 37292/34590/31380 37293/34594/31384 32985/34593/31383
+f 32985/34593/31383 37293/34594/31384 40345/34576/31366 38877/34575/31365
+f 32986/34595/31385 32990/34596/31386 32991/34597/31387 32987/34598/31388
+f 32987/34598/31388 32991/34597/31387 37224/34222/31016 37223/34218/31012
+f 32990/34596/31386 38879/34586/31376 38878/34585/31375 32991/34597/31387
+f 32991/34597/31387 38878/34585/31375 40322/34204/30998 37224/34222/31016
+f 32986/34595/31385 32987/34598/31388 32992/34599/31389 32988/34600/31390
+f 32988/34600/31390 32992/34599/31389 38881/34601/31391 38882/34602/31392
+f 32987/34598/31388 37223/34218/31012 37222/34217/31011 32992/34599/31389
+f 32992/34599/31389 37222/34217/31011 40323/34220/31014 38881/34601/31391
+f 32986/34595/31385 32988/34600/31390 32993/34603/31393 32989/34604/31394
+f 32989/34604/31394 32993/34603/31393 37294/34605/31395 37295/34606/31396
+f 32988/34600/31390 38882/34602/31392 38883/34607/31397 32993/34603/31393
+f 32993/34603/31393 38883/34607/31397 40347/34608/31398 37294/34605/31395
+f 32986/34595/31385 32989/34604/31394 32994/34609/31399 32990/34596/31386
+f 32990/34596/31386 32994/34609/31399 38880/34591/31381 38879/34586/31376
+f 32989/34604/31394 37295/34606/31396 37296/34610/31400 32994/34609/31399
+f 32994/34609/31399 37296/34610/31400 40346/34592/31382 38880/34591/31381
+f 32995/34611/31401 32999/34612/31402 33000/34613/31403 32996/34614/31404
+f 32996/34614/31404 33000/34613/31403 37227/34238/31028 37226/34234/31026
+f 32999/34612/31402 38882/34602/31392 38881/34601/31391 33000/34613/31403
+f 33000/34613/31403 38881/34601/31391 40323/34220/31014 37227/34238/31028
+f 32995/34611/31401 32996/34614/31404 33001/34615/31405 32997/34616/31406
+f 32997/34616/31406 33001/34615/31405 38814/34617/31034 38813/34618/31033
+f 32996/34614/31404 37226/34234/31026 37225/34233/31025 33001/34615/31405
+f 33001/34615/31405 37225/34233/31025 40300/34236/30664 38814/34617/31034
+f 32995/34611/31401 32997/34616/31406 33002/34619/31407 32998/34620/31408
+f 32998/34620/31408 33002/34619/31407 37297/34621/31409 37298/34622/31410
+f 32997/34616/31406 38813/34618/31033 38812/34623/31046 33002/34619/31407
+f 33002/34619/31407 38812/34623/31046 40324/34624/31048 37297/34621/31409
+f 32995/34611/31401 32998/34620/31408 33003/34625/31411 32999/34612/31402
+f 32999/34612/31402 33003/34625/31411 38883/34607/31397 38882/34602/31392
+f 32998/34620/31408 37298/34622/31410 37299/34626/31412 33003/34625/31411
+f 33003/34625/31411 37299/34626/31412 40347/34608/31398 38883/34607/31397
+f 33004/34627/31413 33008/34628/31414 33009/34629/31415 33005/34630/31416
+f 33005/34630/31416 33009/34629/31415 37230/34257/31047 37229/34252/31042
+f 33008/34628/31414 38885/34631/31417 38886/34632/31418 33009/34629/31415
+f 33009/34629/31415 38886/34632/31418 40324/34258/31048 37230/34257/31047
+f 33004/34627/31413 33005/34630/31416 33010/34633/31419 33006/34634/31420
+f 33006/34634/31420 33010/34633/31419 38887/34635/31421 38888/34636/31422
+f 33005/34630/31416 37229/34252/31042 37228/34251/31041 33010/34633/31419
+f 33010/34633/31419 37228/34251/31041 40325/34254/31044 38887/34635/31421
+f 33004/34627/31413 33006/34634/31420 33011/34637/31423 33007/34638/31424
+f 33007/34638/31424 33011/34637/31423 37300/34639/31425 37301/34640/31426
+f 33006/34634/31420 38888/34636/31422 38889/34641/31427 33011/34637/31423
+f 33011/34637/31423 38889/34641/31427 40349/34642/31428 37300/34639/31425
+f 33004/34627/31413 33007/34638/31424 33012/34643/31429 33008/34628/31414
+f 33008/34628/31414 33012/34643/31429 38884/34644/31430 38885/34631/31417
+f 33007/34638/31424 37301/34640/31426 37302/34645/31431 33012/34643/31429
+f 33012/34643/31429 37302/34645/31431 40348/34646/31432 38884/34644/31430
+f 33013/34647/31433 33017/34648/31434 33018/34649/31435 33014/34650/31436
+f 33014/34650/31436 33018/34649/31435 37233/34274/31064 37232/34270/31060
+f 33017/34648/31434 38888/34636/31422 38887/34635/31421 33018/34649/31435
+f 33018/34649/31435 38887/34635/31421 40325/34254/31044 37233/34274/31064
+f 33013/34647/31433 33014/34650/31436 33019/34651/31437 33015/34652/31438
+f 33015/34652/31438 33019/34651/31437 38890/34653/31439 38891/34654/31440
+f 33014/34650/31436 37232/34270/31060 37231/34269/31059 33019/34651/31437
+f 33019/34651/31437 37231/34269/31059 40326/34272/31062 38890/34653/31439
+f 33013/34647/31433 33015/34652/31438 33020/34655/31441 33016/34656/31442
+f 33016/34656/31442 33020/34655/31441 37303/34657/31443 37304/34658/31444
+f 33015/34652/31438 38891/34654/31440 38892/34659/31445 33020/34655/31441
+f 33020/34655/31441 38892/34659/31445 40350/34660/31446 37303/34657/31443
+f 33013/34647/31433 33016/34656/31442 33021/34661/31447 33017/34648/31434
+f 33017/34648/31434 33021/34661/31447 38889/34641/31427 38888/34636/31422
+f 33016/34656/31442 37304/34658/31444 37305/34662/31448 33021/34661/31447
+f 33021/34661/31447 37305/34662/31448 40349/34642/31428 38889/34641/31427
+f 33022/34663/31449 33026/34664/31450 33027/34665/31451 33023/34666/31452
+f 33023/34666/31452 33027/34665/31451 37236/34290/31080 37235/34286/31076
+f 33026/34664/31450 38891/34654/31440 38890/34653/31439 33027/34665/31451
+f 33027/34665/31451 38890/34653/31439 40326/34272/31062 37236/34290/31080
+f 33022/34663/31449 33023/34666/31452 33028/34667/31453 33024/34668/31454
+f 33024/34668/31454 33028/34667/31453 38893/34669/31455 38894/34670/31456
+f 33023/34666/31452 37235/34286/31076 37234/34285/31075 33028/34667/31453
+f 33028/34667/31453 37234/34285/31075 40327/34288/31078 38893/34669/31455
+f 33022/34663/31449 33024/34668/31454 33029/34671/31457 33025/34672/31458
+f 33025/34672/31458 33029/34671/31457 37306/34673/31459 37307/34674/31460
+f 33024/34668/31454 38894/34670/31456 38895/34675/31461 33029/34671/31457
+f 33029/34671/31457 38895/34675/31461 40351/34676/31462 37306/34673/31459
+f 33022/34663/31449 33025/34672/31458 33030/34677/31463 33026/34664/31450
+f 33026/34664/31450 33030/34677/31463 38892/34659/31445 38891/34654/31440
+f 33025/34672/31458 37307/34674/31460 37308/34678/31464 33030/34677/31463
+f 33030/34677/31463 37308/34678/31464 40350/34660/31446 38892/34659/31445
+f 33031/34679/31465 33035/34680/31466 33036/34681/31467 33032/34682/31468
+f 33032/34682/31468 33036/34681/31467 37239/34306/31096 37238/34302/31092
+f 33035/34680/31466 38894/34670/31456 38893/34669/31455 33036/34681/31467
+f 33036/34681/31467 38893/34669/31455 40327/34288/31078 37239/34306/31096
+f 33031/34679/31465 33032/34682/31468 33037/34683/31469 33033/34684/31470
+f 33033/34684/31470 33037/34683/31469 38896/34685/31471 38897/34686/31472
+f 33032/34682/31468 37238/34302/31092 37237/34301/31091 33037/34683/31469
+f 33037/34683/31469 37237/34301/31091 40328/34304/31094 38896/34685/31471
+f 33031/34679/31465 33033/34684/31470 33038/34687/31473 33034/34688/31474
+f 33034/34688/31474 33038/34687/31473 37309/34689/31475 37310/34690/31476
+f 33033/34684/31470 38897/34686/31472 38898/34691/31477 33038/34687/31473
+f 33038/34687/31473 38898/34691/31477 40352/34692/31478 37309/34689/31475
+f 33031/34679/31465 33034/34688/31474 33039/34693/31479 33035/34680/31466
+f 33035/34680/31466 33039/34693/31479 38895/34675/31461 38894/34670/31456
+f 33034/34688/31474 37310/34690/31476 37311/34694/31480 33039/34693/31479
+f 33039/34693/31479 37311/34694/31480 40351/34676/31462 38895/34675/31461
+f 33040/34695/31481 33044/34696/31482 33045/34697/31483 33041/34698/31484
+f 33041/34698/31484 33045/34697/31483 37242/34322/31112 37241/34318/31108
+f 33044/34696/31482 38897/34686/31472 38896/34685/31471 33045/34697/31483
+f 33045/34697/31483 38896/34685/31471 40328/34304/31094 37242/34322/31112
+f 33040/34695/31481 33041/34698/31484 33046/34699/31485 33042/34700/31486
+f 33042/34700/31486 33046/34699/31485 38899/34701/31487 38900/34702/31488
+f 33041/34698/31484 37241/34318/31108 37240/34317/31107 33046/34699/31485
+f 33046/34699/31485 37240/34317/31107 40329/34320/31110 38899/34701/31487
+f 33040/34695/31481 33042/34700/31486 33047/34703/31489 33043/34704/31490
+f 33043/34704/31490 33047/34703/31489 37312/34705/31491 37313/34706/31492
+f 33042/34700/31486 38900/34702/31488 38901/34707/31493 33047/34703/31489
+f 33047/34703/31489 38901/34707/31493 40353/34708/31494 37312/34705/31491
+f 33040/34695/31481 33043/34704/31490 33048/34709/31495 33044/34696/31482
+f 33044/34696/31482 33048/34709/31495 38898/34691/31477 38897/34686/31472
+f 33043/34704/31490 37313/34706/31492 37314/34710/31496 33048/34709/31495
+f 33048/34709/31495 37314/34710/31496 40352/34692/31478 38898/34691/31477
+f 33049/34711/31497 33053/34712/31498 33054/34713/31499 33050/34714/31500
+f 33050/34714/31500 33054/34713/31499 37245/34338/31128 37244/34334/31124
+f 33053/34712/31498 38900/34702/31488 38899/34701/31487 33054/34713/31499
+f 33054/34713/31499 38899/34701/31487 40329/34320/31110 37245/34338/31128
+f 33049/34711/31497 33050/34714/31500 33055/34715/31501 33051/34716/31502
+f 33051/34716/31502 33055/34715/31501 38902/34717/31503 38903/34718/31504
+f 33050/34714/31500 37244/34334/31124 37243/34333/31123 33055/34715/31501
+f 33055/34715/31501 37243/34333/31123 40330/34336/31126 38902/34717/31503
+f 33049/34711/31497 33051/34716/31502 33056/34719/31505 33052/34720/31506
+f 33052/34720/31506 33056/34719/31505 37315/34721/31507 37316/34722/31508
+f 33051/34716/31502 38903/34718/31504 38904/34723/31509 33056/34719/31505
+f 33056/34719/31505 38904/34723/31509 40354/34724/31510 37315/34721/31507
+f 33049/34711/31497 33052/34720/31506 33057/34725/31511 33053/34712/31498
+f 33053/34712/31498 33057/34725/31511 38901/34707/31493 38900/34702/31488
+f 33052/34720/31506 37316/34722/31508 37317/34726/31512 33057/34725/31511
+f 33057/34725/31511 37317/34726/31512 40353/34708/31494 38901/34707/31493
+f 33058/34727/31513 33062/34728/31514 33063/34729/31515 33059/34730/31516
+f 33059/34730/31516 33063/34729/31515 37248/34354/31144 37247/34350/31140
+f 33062/34728/31514 38903/34718/31504 38902/34717/31503 33063/34729/31515
+f 33063/34729/31515 38902/34717/31503 40330/34336/31126 37248/34354/31144
+f 33058/34727/31513 33059/34730/31516 33064/34731/31517 33060/34732/31518
+f 33060/34732/31518 33064/34731/31517 38905/34733/31519 38906/34734/31520
+f 33059/34730/31516 37247/34350/31140 37246/34349/31139 33064/34731/31517
+f 33064/34731/31517 37246/34349/31139 40331/34352/31142 38905/34733/31519
+f 33058/34727/31513 33060/34732/31518 33065/34735/31521 33061/34736/31522
+f 33061/34736/31522 33065/34735/31521 37318/34737/31523 37319/34738/31524
+f 33060/34732/31518 38906/34734/31520 38907/34739/31525 33065/34735/31521
+f 33065/34735/31521 38907/34739/31525 40355/34740/31526 37318/34737/31523
+f 33058/34727/31513 33061/34736/31522 33066/34741/31527 33062/34728/31514
+f 33062/34728/31514 33066/34741/31527 38904/34723/31509 38903/34718/31504
+f 33061/34736/31522 37319/34738/31524 37320/34742/31528 33066/34741/31527
+f 33066/34741/31527 37320/34742/31528 40354/34724/31510 38904/34723/31509
+f 33067/34743/31529 33071/34744/31530 33072/34745/31531 33068/34746/31532
+f 33068/34746/31532 33072/34745/31531 37251/34370/31160 37250/34366/31156
+f 33071/34744/31530 38906/34734/31520 38905/34733/31519 33072/34745/31531
+f 33072/34745/31531 38905/34733/31519 40331/34352/31142 37251/34370/31160
+f 33067/34743/31529 33068/34746/31532 33073/34747/31533 33069/34748/31534
+f 33069/34748/31534 33073/34747/31533 38908/34749/31535 38909/34750/31536
+f 33068/34746/31532 37250/34366/31156 37249/34365/31155 33073/34747/31533
+f 33073/34747/31533 37249/34365/31155 40332/34368/31158 38908/34749/31535
+f 33067/34743/31529 33069/34748/31534 33074/34751/31537 33070/34752/31538
+f 33070/34752/31538 33074/34751/31537 37321/34753/31539 37322/34754/31540
+f 33069/34748/31534 38909/34750/31536 38910/34755/31541 33074/34751/31537
+f 33074/34751/31537 38910/34755/31541 40356/34756/31542 37321/34753/31539
+f 33067/34743/31529 33070/34752/31538 33075/34757/31543 33071/34744/31530
+f 33071/34744/31530 33075/34757/31543 38907/34739/31525 38906/34734/31520
+f 33070/34752/31538 37322/34754/31540 37323/34758/31544 33075/34757/31543
+f 33075/34757/31543 37323/34758/31544 40355/34740/31526 38907/34739/31525
+f 33076/34759/31545 33080/34760/31546 33081/34761/31547 33077/34762/31548
+f 33077/34762/31548 33081/34761/31547 37254/34386/31176 37253/34382/31172
+f 33080/34760/31546 38909/34750/31536 38908/34749/31535 33081/34761/31547
+f 33081/34761/31547 38908/34749/31535 40332/34368/31158 37254/34386/31176
+f 33076/34759/31545 33077/34762/31548 33082/34763/31549 33078/34764/31550
+f 33078/34764/31550 33082/34763/31549 38911/34765/31551 38912/34766/31552
+f 33077/34762/31548 37253/34382/31172 37252/34381/31171 33082/34763/31549
+f 33082/34763/31549 37252/34381/31171 40333/34384/31174 38911/34765/31551
+f 33076/34759/31545 33078/34764/31550 33083/34767/31553 33079/34768/31554
+f 33079/34768/31554 33083/34767/31553 37324/34769/31555 37325/34770/31556
+f 33078/34764/31550 38912/34766/31552 38913/34771/31557 33083/34767/31553
+f 33083/34767/31553 38913/34771/31557 40357/31268/31558 37324/34769/31555
+f 33076/34759/31545 33079/34768/31554 33084/34772/31559 33080/34760/31546
+f 33080/34760/31546 33084/34772/31559 38910/34755/31541 38909/34750/31536
+f 33079/34768/31554 37325/34770/31556 37326/34773/31560 33084/34772/31559
+f 33084/34772/31559 37326/34773/31560 40356/34756/31542 38910/34755/31541
+f 33085/34774/31561 33089/34775/31562 33090/34776/31563 33086/34777/31564
+f 33086/34777/31564 33090/34776/31563 37257/34402/31192 37256/34398/31188
+f 33089/34775/31562 38912/34766/31552 38911/34765/31551 33090/34776/31563
+f 33090/34776/31563 38911/34765/31551 40333/34384/31174 37257/34402/31192
+f 33085/34774/31561 33086/34777/31564 33091/34778/31565 33087/34779/31566
+f 33087/34779/31566 33091/34778/31565 38914/34780/31567 38915/34781/31568
+f 33086/34777/31564 37256/34398/31188 37255/34397/31187 33091/34778/31565
+f 33091/34778/31565 37255/34397/31187 40334/34400/31190 38914/34780/31567
+f 33085/34774/31561 33087/34779/31566 33092/34782/31569 33088/34783/31570
+f 33088/34783/31570 33092/34782/31569 37327/34784/31571 37328/34785/31572
+f 33087/34779/31566 38915/34781/31568 38916/34786/31573 33092/34782/31569
+f 33092/34782/31569 38916/34786/31573 40358/34787/31574 37327/34784/31571
+f 33085/34774/31561 33088/34783/31570 33093/34788/31575 33089/34775/31562
+f 33089/34775/31562 33093/34788/31575 38913/34771/31557 38912/34766/31552
+f 33088/34783/31570 37328/34785/31572 37329/34789/31576 33093/34788/31575
+f 33093/34788/31575 37329/34789/31576 40357/31268/31558 38913/34771/31557
+f 33094/34790/31577 33098/34791/31578 33099/34792/31579 33095/34793/31580
+f 33095/34793/31580 33099/34792/31579 37260/34418/31208 37259/34414/31204
+f 33098/34791/31578 38915/34781/31568 38914/34780/31567 33099/34792/31579
+f 33099/34792/31579 38914/34780/31567 40334/34400/31190 37260/34418/31208
+f 33094/34790/31577 33095/34793/31580 33100/34794/31581 33096/34795/31582
+f 33096/34795/31582 33100/34794/31581 38917/34796/31583 38918/34797/31584
+f 33095/34793/31580 37259/34414/31204 37258/34413/31203 33100/34794/31581
+f 33100/34794/31581 37258/34413/31203 40335/34416/31206 38917/34796/31583
+f 33094/34790/31577 33096/34795/31582 33101/34798/31585 33097/34799/31586
+f 33097/34799/31586 33101/34798/31585 37330/34800/31587 37331/34801/31588
+f 33096/34795/31582 38918/34797/31584 38919/34802/31589 33101/34798/31585
+f 33101/34798/31585 38919/34802/31589 40359/34803/31590 37330/34800/31587
+f 33094/34790/31577 33097/34799/31586 33102/34804/31591 33098/34791/31578
+f 33098/34791/31578 33102/34804/31591 38916/34786/31573 38915/34781/31568
+f 33097/34799/31586 37331/34801/31588 37332/34805/31592 33102/34804/31591
+f 33102/34804/31591 37332/34805/31592 40358/34787/31574 38916/34786/31573
+f 33103/34806/31593 33107/34807/31594 33108/34808/31595 33104/34809/31596
+f 33104/34809/31596 33108/34808/31595 37263/34434/31224 37262/34430/31220
+f 33107/34807/31594 38918/34797/31584 38917/34796/31583 33108/34808/31595
+f 33108/34808/31595 38917/34796/31583 40335/34416/31206 37263/34434/31224
+f 33103/34806/31593 33104/34809/31596 33109/34810/31597 33105/34811/31598
+f 33105/34811/31598 33109/34810/31597 38920/34812/31599 38921/34813/31600
+f 33104/34809/31596 37262/34430/31220 37261/34429/31219 33109/34810/31597
+f 33109/34810/31597 37261/34429/31219 40336/34432/31222 38920/34812/31599
+f 33103/34806/31593 33105/34811/31598 33110/34814/31601 33106/34815/31602
+f 33106/34815/31602 33110/34814/31601 37333/34816/31603 37334/34817/31604
+f 33105/34811/31598 38921/34813/31600 38922/34818/31605 33110/34814/31601
+f 33110/34814/31601 38922/34818/31605 40360/34819/31606 37333/34816/31603
+f 33103/34806/31593 33106/34815/31602 33111/34820/31607 33107/34807/31594
+f 33107/34807/31594 33111/34820/31607 38919/34802/31589 38918/34797/31584
+f 33106/34815/31602 37334/34817/31604 37335/34821/31608 33111/34820/31607
+f 33111/34820/31607 37335/34821/31608 40359/34803/31590 38919/34802/31589
+f 33112/34822/31609 33116/34823/31610 33117/34824/31611 33113/34825/31612
+f 33113/34825/31612 33117/34824/31611 37266/34450/31240 37265/34446/31236
+f 33116/34823/31610 38921/34813/31600 38920/34812/31599 33117/34824/31611
+f 33117/34824/31611 38920/34812/31599 40336/34432/31222 37266/34450/31240
+f 33112/34822/31609 33113/34825/31612 33118/34826/31613 33114/34827/31614
+f 33114/34827/31614 33118/34826/31613 38923/34828/31615 38924/34829/31616
+f 33113/34825/31612 37265/34446/31236 37264/34445/31235 33118/34826/31613
+f 33118/34826/31613 37264/34445/31235 40337/34448/31238 38923/34828/31615
+f 33112/34822/31609 33114/34827/31614 33119/34830/31617 33115/34831/31618
+f 33115/34831/31618 33119/34830/31617 37336/34832/31619 37337/34833/31620
+f 33114/34827/31614 38924/34829/31616 38925/34834/31621 33119/34830/31617
+f 33119/34830/31617 38925/34834/31621 40361/34835/31622 37336/34832/31619
+f 33112/34822/31609 33115/34831/31618 33120/34836/31623 33116/34823/31610
+f 33116/34823/31610 33120/34836/31623 38922/34818/31605 38921/34813/31600
+f 33115/34831/31618 37337/34833/31620 37338/34837/31624 33120/34836/31623
+f 33120/34836/31623 37338/34837/31624 40360/34819/31606 38922/34818/31605
+f 33121/34838/31625 33125/34839/31626 33126/34840/31627 33122/34841/31628
+f 33122/34841/31628 33126/34840/31627 37269/34466/31256 37268/34462/31252
+f 33125/34839/31626 38924/34829/31616 38923/34828/31615 33126/34840/31627
+f 33126/34840/31627 38923/34828/31615 40337/34448/31238 37269/34466/31256
+f 33121/34838/31625 33122/34841/31628 33127/34842/31629 33123/34843/31630
+f 33123/34843/31630 33127/34842/31629 38926/34844/31631 38927/34845/31632
+f 33122/34841/31628 37268/34462/31252 37267/34461/31251 33127/34842/31629
+f 33127/34842/31629 37267/34461/31251 40338/34464/31254 38926/34844/31631
+f 33121/34838/31625 33123/34843/31630 33128/34846/31633 33124/34847/31634
+f 33124/34847/31634 33128/34846/31633 37339/34848/31635 37340/34849/31636
+f 33123/34843/31630 38927/34845/31632 38928/34850/31637 33128/34846/31633
+f 33128/34846/31633 38928/34850/31637 40362/34851/31638 37339/34848/31635
+f 33121/34838/31625 33124/34847/31634 33129/34852/31639 33125/34839/31626
+f 33125/34839/31626 33129/34852/31639 38925/34834/31621 38924/34829/31616
+f 33124/34847/31634 37340/34849/31636 37341/34853/31640 33129/34852/31639
+f 33129/34852/31639 37341/34853/31640 40361/34835/31622 38925/34834/31621
+f 33130/34854/31641 33134/34855/31642 33135/34856/31643 33131/34857/31644
+f 33131/34857/31644 33135/34856/31643 37272/34482/31272 37271/34478/31268
+f 33134/34855/31642 38927/34845/31632 38926/34844/31631 33135/34856/31643
+f 33135/34856/31643 38926/34844/31631 40338/34464/31254 37272/34482/31272
+f 33130/34854/31641 33131/34857/31644 33136/34858/31645 33132/34859/31646
+f 33132/34859/31646 33136/34858/31645 38929/34860/31647 38930/34861/31648
+f 33131/34857/31644 37271/34478/31268 37270/34477/31267 33136/34858/31645
+f 33136/34858/31645 37270/34477/31267 40339/34480/31270 38929/34860/31647
+f 33130/34854/31641 33132/34859/31646 33137/34862/31649 33133/34863/31650
+f 33133/34863/31650 33137/34862/31649 37342/34864/31651 37343/34865/31652
+f 33132/34859/31646 38930/34861/31648 38931/34866/31653 33137/34862/31649
+f 33137/34862/31649 38931/34866/31653 40363/34867/31654 37342/34864/31651
+f 33130/34854/31641 33133/34863/31650 33138/34868/31655 33134/34855/31642
+f 33134/34855/31642 33138/34868/31655 38928/34850/31637 38927/34845/31632
+f 33133/34863/31650 37343/34865/31652 37344/34869/31656 33138/34868/31655
+f 33138/34868/31655 37344/34869/31656 40362/34851/31638 38928/34850/31637
+f 33139/34870/31657 33143/34871/31658 33144/34872/31659 33140/34873/31660
+f 33140/34873/31660 33144/34872/31659 37275/34498/31288 37274/34494/31284
+f 33143/34871/31658 38930/34861/31648 38929/34860/31647 33144/34872/31659
+f 33144/34872/31659 38929/34860/31647 40339/34480/31270 37275/34498/31288
+f 33139/34870/31657 33140/34873/31660 33145/34874/31661 33141/34875/31662
+f 33141/34875/31662 33145/34874/31661 38932/34876/31663 38933/34877/31664
+f 33140/34873/31660 37274/34494/31284 37273/34493/31283 33145/34874/31661
+f 33145/34874/31661 37273/34493/31283 40340/34496/31286 38932/34876/31663
+f 33139/34870/31657 33141/34875/31662 33146/34878/31665 33142/34879/31666
+f 33142/34879/31666 33146/34878/31665 37345/34880/31667 37346/34881/31668
+f 33141/34875/31662 38933/34877/31664 38934/34882/31669 33146/34878/31665
+f 33146/34878/31665 38934/34882/31669 40364/34883/31670 37345/34880/31667
+f 33139/34870/31657 33142/34879/31666 33147/34884/31671 33143/34871/31658
+f 33143/34871/31658 33147/34884/31671 38931/34866/31653 38930/34861/31648
+f 33142/34879/31666 37346/34881/31668 37347/34885/31672 33147/34884/31671
+f 33147/34884/31671 37347/34885/31672 40363/34867/31654 38931/34866/31653
+f 33148/34886/31673 33152/34887/31674 33153/34888/31675 33149/34889/31676
+f 33149/34889/31676 33153/34888/31675 37278/34514/31304 37277/34510/31300
+f 33152/34887/31674 38933/34877/31664 38932/34876/31663 33153/34888/31675
+f 33153/34888/31675 38932/34876/31663 40340/34496/31286 37278/34514/31304
+f 33148/34886/31673 33149/34889/31676 33154/34890/31677 33150/34891/31678
+f 33150/34891/31678 33154/34890/31677 38935/34892/31679 38936/34893/31680
+f 33149/34889/31676 37277/34510/31300 37276/34509/31299 33154/34890/31677
+f 33154/34890/31677 37276/34509/31299 40341/34512/31302 38935/34892/31679
+f 33148/34886/31673 33150/34891/31678 33155/34894/31681 33151/34895/31682
+f 33151/34895/31682 33155/34894/31681 37348/34896/31683 37349/34897/31684
+f 33150/34891/31678 38936/34893/31680 38937/34898/31685 33155/34894/31681
+f 33155/34894/31681 38937/34898/31685 40365/34899/31686 37348/34896/31683
+f 33148/34886/31673 33151/34895/31682 33156/34900/31687 33152/34887/31674
+f 33152/34887/31674 33156/34900/31687 38934/34882/31669 38933/34877/31664
+f 33151/34895/31682 37349/34897/31684 37350/34901/31688 33156/34900/31687
+f 33156/34900/31687 37350/34901/31688 40364/34883/31670 38934/34882/31669
+f 33157/34902/31689 33161/34903/31690 33162/34904/31691 33158/34905/31692
+f 33158/34905/31692 33162/34904/31691 37281/34530/31320 37280/34526/31316
+f 33161/34903/31690 38936/34893/31680 38935/34892/31679 33162/34904/31691
+f 33162/34904/31691 38935/34892/31679 40341/34512/31302 37281/34530/31320
+f 33157/34902/31689 33158/34905/31692 33163/34906/31693 33159/34907/31694
+f 33159/34907/31694 33163/34906/31693 38938/34908/31695 38939/34909/31696
+f 33158/34905/31692 37280/34526/31316 37279/34525/31315 33163/34906/31693
+f 33163/34906/31693 37279/34525/31315 40342/34528/31318 38938/34908/31695
+f 33157/34902/31689 33159/34907/31694 33164/34910/31697 33160/34911/31698
+f 33160/34911/31698 33164/34910/31697 37351/34912/31699 37352/34913/31700
+f 33159/34907/31694 38939/34909/31696 38940/34914/31701 33164/34910/31697
+f 33164/34910/31697 38940/34914/31701 40366/34915/31702 37351/34912/31699
+f 33157/34902/31689 33160/34911/31698 33165/34916/31703 33161/34903/31690
+f 33161/34903/31690 33165/34916/31703 38937/34898/31685 38936/34893/31680
+f 33160/34911/31698 37352/34913/31700 37353/34917/31704 33165/34916/31703
+f 33165/34916/31703 37353/34917/31704 40365/34899/31686 38937/34898/31685
+f 33166/34918/31705 33170/34919/31706 33171/34920/31707 33167/34921/31708
+f 33167/34921/31708 33171/34920/31707 37284/34546/31336 37283/34542/31332
+f 33170/34919/31706 38939/34909/31696 38938/34908/31695 33171/34920/31707
+f 33171/34920/31707 38938/34908/31695 40342/34528/31318 37284/34546/31336
+f 33166/34918/31705 33167/34921/31708 33172/34922/31709 33168/34923/31710
+f 33168/34923/31710 33172/34922/31709 38941/34924/31711 38942/34925/31712
+f 33167/34921/31708 37283/34542/31332 37282/34541/31331 33172/34922/31709
+f 33172/34922/31709 37282/34541/31331 40343/34544/31334 38941/34924/31711
+f 33166/34918/31705 33168/34923/31710 33173/34926/31713 33169/34927/31714
+f 33169/34927/31714 33173/34926/31713 37354/34928/31715 37355/34929/31716
+f 33168/34923/31710 38942/34925/31712 38943/34930/31717 33173/34926/31713
+f 33173/34926/31713 38943/34930/31717 40367/34931/31718 37354/34928/31715
+f 33166/34918/31705 33169/34927/31714 33174/34932/31719 33170/34919/31706
+f 33170/34919/31706 33174/34932/31719 38940/34914/31701 38939/34909/31696
+f 33169/34927/31714 37355/34929/31716 37356/34933/31720 33174/34932/31719
+f 33174/34932/31719 37356/34933/31720 40366/34915/31702 38940/34914/31701
+f 33175/34934/31721 33179/34935/31722 33180/34936/31723 33176/34937/31724
+f 33176/34937/31724 33180/34936/31723 37287/34562/31352 37286/34558/31348
+f 33179/34935/31722 38942/34925/31712 38941/34924/31711 33180/34936/31723
+f 33180/34936/31723 38941/34924/31711 40343/34544/31334 37287/34562/31352
+f 33175/34934/31721 33176/34937/31724 33181/34938/31725 33177/34939/31726
+f 33177/34939/31726 33181/34938/31725 38944/34940/31727 38945/34941/31728
+f 33176/34937/31724 37286/34558/31348 37285/34557/31347 33181/34938/31725
+f 33181/34938/31725 37285/34557/31347 40344/34560/31350 38944/34940/31727
+f 33175/34934/31721 33177/34939/31726 33182/34942/31729 33178/34943/31730
+f 33178/34943/31730 33182/34942/31729 37357/34944/31731 37358/34945/31732
+f 33177/34939/31726 38945/34941/31728 38946/34946/31733 33182/34942/31729
+f 33182/34942/31729 38946/34946/31733 40368/34947/31734 37357/34944/31731
+f 33175/34934/31721 33178/34943/31730 33183/34948/31735 33179/34935/31722
+f 33179/34935/31722 33183/34948/31735 38943/34930/31717 38942/34925/31712
+f 33178/34943/31730 37358/34945/31732 37359/34949/31736 33183/34948/31735
+f 33183/34948/31735 37359/34949/31736 40367/34931/31718 38943/34930/31717
+f 33184/34950/31737 33188/34951/31738 33189/34952/31739 33185/34953/31740
+f 33185/34953/31740 33189/34952/31739 37290/34578/31368 37289/34574/31364
+f 33188/34951/31738 38945/34941/31728 38944/34940/31727 33189/34952/31739
+f 33189/34952/31739 38944/34940/31727 40344/34560/31350 37290/34578/31368
+f 33184/34950/31737 33185/34953/31740 33190/34954/31741 33186/34955/31742
+f 33186/34955/31742 33190/34954/31741 38947/34956/31743 38948/34957/31744
+f 33185/34953/31740 37289/34574/31364 37288/34573/31363 33190/34954/31741
+f 33190/34954/31741 37288/34573/31363 40345/34576/31366 38947/34956/31743
+f 33184/34950/31737 33186/34955/31742 33191/34958/31745 33187/34959/31746
+f 33187/34959/31746 33191/34958/31745 37360/34960/31747 37361/34961/31748
+f 33186/34955/31742 38948/34957/31744 38949/34962/31749 33191/34958/31745
+f 33191/34958/31745 38949/34962/31749 40369/34963/31750 37360/34960/31747
+f 33184/34950/31737 33187/34959/31746 33192/34964/31751 33188/34951/31738
+f 33188/34951/31738 33192/34964/31751 38946/34946/31733 38945/34941/31728
+f 33187/34959/31746 37361/34961/31748 37362/34965/31752 33192/34964/31751
+f 33192/34964/31751 37362/34965/31752 40368/34947/31734 38946/34946/31733
+f 33193/34966/31753 33197/34967/31754 33198/34968/31755 33194/34969/31756
+f 33194/34969/31756 33198/34968/31755 37293/34594/31384 37292/34590/31380
+f 33197/34967/31754 38948/34957/31744 38947/34956/31743 33198/34968/31755
+f 33198/34968/31755 38947/34956/31743 40345/34576/31366 37293/34594/31384
+f 33193/34966/31753 33194/34969/31756 33199/34970/31757 33195/34971/31758
+f 33195/34971/31758 33199/34970/31757 38950/34972/31759 38951/34973/31760
+f 33194/34969/31756 37292/34590/31380 37291/34589/31379 33199/34970/31757
+f 33199/34970/31757 37291/34589/31379 40346/34592/31382 38950/34972/31759
+f 33193/34966/31753 33195/34971/31758 33200/34974/31761 33196/34975/31762
+f 33196/34975/31762 33200/34974/31761 37363/34976/31763 37364/34977/31764
+f 33195/34971/31758 38951/34973/31760 38952/34978/31765 33200/34974/31761
+f 33200/34974/31761 38952/34978/31765 40370/34979/31766 37363/34976/31763
+f 33193/34966/31753 33196/34975/31762 33201/34980/31767 33197/34967/31754
+f 33197/34967/31754 33201/34980/31767 38949/34962/31749 38948/34957/31744
+f 33196/34975/31762 37364/34977/31764 37365/34981/31768 33201/34980/31767
+f 33201/34980/31767 37365/34981/31768 40369/34963/31750 38949/34962/31749
+f 33202/34982/31769 33206/34983/31770 33207/34984/31771 33203/34985/31772
+f 33203/34985/31772 33207/34984/31771 37296/34610/31400 37295/34606/31396
+f 33206/34983/31770 38951/34973/31760 38950/34972/31759 33207/34984/31771
+f 33207/34984/31771 38950/34972/31759 40346/34592/31382 37296/34610/31400
+f 33202/34982/31769 33203/34985/31772 33208/34986/31773 33204/34987/31774
+f 33204/34987/31774 33208/34986/31773 38953/34988/31775 38954/34989/31776
+f 33203/34985/31772 37295/34606/31396 37294/34605/31395 33208/34986/31773
+f 33208/34986/31773 37294/34605/31395 40347/34608/31398 38953/34988/31775
+f 33202/34982/31769 33204/34987/31774 33209/34990/31777 33205/34991/31778
+f 33205/34991/31778 33209/34990/31777 37366/34992/31779 37367/34993/31780
+f 33204/34987/31774 38954/34989/31776 38955/34994/31781 33209/34990/31777
+f 33209/34990/31777 38955/34994/31781 40371/34995/31782 37366/34992/31779
+f 33202/34982/31769 33205/34991/31778 33210/34996/31783 33206/34983/31770
+f 33206/34983/31770 33210/34996/31783 38952/34978/31765 38951/34973/31760
+f 33205/34991/31778 37367/34993/31780 37368/34997/31784 33210/34996/31783
+f 33210/34996/31783 37368/34997/31784 40370/34979/31766 38952/34978/31765
+f 33211/34998/31785 33215/34999/31786 33216/35000/31787 33212/35001/31788
+f 33212/35001/31788 33216/35000/31787 37299/34626/31412 37298/34622/31410
+f 33215/34999/31786 38954/34989/31776 38953/34988/31775 33216/35000/31787
+f 33216/35000/31787 38953/34988/31775 40347/34608/31398 37299/34626/31412
+f 33211/34998/31785 33212/35001/31788 33217/35002/31789 33213/35003/31790
+f 33213/35003/31790 33217/35002/31789 38886/35004/31418 38885/35005/31417
+f 33212/35001/31788 37298/34622/31410 37297/34621/31409 33217/35002/31789
+f 33217/35002/31789 37297/34621/31409 40324/34624/31048 38886/35004/31418
+f 33211/34998/31785 33213/35003/31790 33218/35006/31791 33214/35007/31792
+f 33214/35007/31792 33218/35006/31791 37369/35008/31793 37370/35009/31794
+f 33213/35003/31790 38885/35005/31417 38884/35010/31430 33218/35006/31791
+f 33218/35006/31791 38884/35010/31430 40348/35011/31432 37369/35008/31793
+f 33211/34998/31785 33214/35007/31792 33219/35012/31795 33215/34999/31786
+f 33215/34999/31786 33219/35012/31795 38955/34994/31781 38954/34989/31776
+f 33214/35007/31792 37370/35009/31794 37371/35013/31796 33219/35012/31795
+f 33219/35012/31795 37371/35013/31796 40371/34995/31782 38955/34994/31781
+f 33220/35014/31797 33224/35015/31798 33225/35016/31799 33221/35017/31800
+f 33221/35017/31800 33225/35016/31799 37302/34645/31431 37301/34640/31426
+f 33224/35015/31798 38957/35018/31801 38958/35019/31802 33225/35016/31799
+f 33225/35016/31799 38958/35019/31802 40348/34646/31432 37302/34645/31431
+f 33220/35014/31797 33221/35017/31800 33226/35020/31803 33222/35021/31804
+f 33222/35021/31804 33226/35020/31803 38959/35022/31805 38960/35023/31806
+f 33221/35017/31800 37301/34640/31426 37300/34639/31425 33226/35020/31803
+f 33226/35020/31803 37300/34639/31425 40349/34642/31428 38959/35022/31805
+f 33220/35014/31797 33222/35021/31804 33227/35024/31807 33223/35025/31808
+f 33223/35025/31808 33227/35024/31807 37372/35026/31809 37373/35027/31810
+f 33222/35021/31804 38960/35023/31806 38961/35028/31811 33227/35024/31807
+f 33227/35024/31807 38961/35028/31811 40373/35029/31812 37372/35026/31809
+f 33220/35014/31797 33223/35025/31808 33228/35030/31813 33224/35015/31798
+f 33224/35015/31798 33228/35030/31813 38956/35031/31814 38957/35018/31801
+f 33223/35025/31808 37373/35027/31810 37374/35032/31815 33228/35030/31813
+f 33228/35030/31813 37374/35032/31815 40372/35033/31816 38956/35031/31814
+f 33229/35034/31817 33233/35035/31818 33234/35036/31819 33230/35037/31820
+f 33230/35037/31820 33234/35036/31819 37305/34662/31448 37304/34658/31444
+f 33233/35035/31818 38960/35023/31806 38959/35022/31805 33234/35036/31819
+f 33234/35036/31819 38959/35022/31805 40349/34642/31428 37305/34662/31448
+f 33229/35034/31817 33230/35037/31820 33235/35038/31821 33231/35039/31822
+f 33231/35039/31822 33235/35038/31821 38962/35040/31823 38963/35041/31824
+f 33230/35037/31820 37304/34658/31444 37303/34657/31443 33235/35038/31821
+f 33235/35038/31821 37303/34657/31443 40350/34660/31446 38962/35040/31823
+f 33229/35034/31817 33231/35039/31822 33236/35042/31825 33232/35043/31826
+f 33232/35043/31826 33236/35042/31825 37375/35044/31827 37376/35045/31828
+f 33231/35039/31822 38963/35041/31824 38964/35046/31829 33236/35042/31825
+f 33236/35042/31825 38964/35046/31829 40374/35047/31830 37375/35044/31827
+f 33229/35034/31817 33232/35043/31826 33237/35048/31831 33233/35035/31818
+f 33233/35035/31818 33237/35048/31831 38961/35028/31811 38960/35023/31806
+f 33232/35043/31826 37376/35045/31828 37377/35049/31832 33237/35048/31831
+f 33237/35048/31831 37377/35049/31832 40373/35029/31812 38961/35028/31811
+f 33238/35050/31833 33242/35051/31834 33243/35052/31835 33239/35053/31836
+f 33239/35053/31836 33243/35052/31835 37308/34678/31464 37307/34674/31460
+f 33242/35051/31834 38963/35041/31824 38962/35040/31823 33243/35052/31835
+f 33243/35052/31835 38962/35040/31823 40350/34660/31446 37308/34678/31464
+f 33238/35050/31833 33239/35053/31836 33244/35054/31837 33240/35055/31838
+f 33240/35055/31838 33244/35054/31837 38965/35056/31839 38966/35057/31840
+f 33239/35053/31836 37307/34674/31460 37306/34673/31459 33244/35054/31837
+f 33244/35054/31837 37306/34673/31459 40351/34676/31462 38965/35056/31839
+f 33238/35050/31833 33240/35055/31838 33245/35058/31841 33241/35059/31842
+f 33241/35059/31842 33245/35058/31841 37378/35060/31843 37379/35061/31844
+f 33240/35055/31838 38966/35057/31840 38967/35062/31845 33245/35058/31841
+f 33245/35058/31841 38967/35062/31845 40375/35063/31846 37378/35060/31843
+f 33238/35050/31833 33241/35059/31842 33246/35064/31847 33242/35051/31834
+f 33242/35051/31834 33246/35064/31847 38964/35046/31829 38963/35041/31824
+f 33241/35059/31842 37379/35061/31844 37380/35065/31848 33246/35064/31847
+f 33246/35064/31847 37380/35065/31848 40374/35047/31830 38964/35046/31829
+f 33247/35066/31849 33251/35067/31850 33252/35068/31851 33248/35069/31852
+f 33248/35069/31852 33252/35068/31851 37311/34694/31480 37310/34690/31476
+f 33251/35067/31850 38966/35057/31840 38965/35056/31839 33252/35068/31851
+f 33252/35068/31851 38965/35056/31839 40351/34676/31462 37311/34694/31480
+f 33247/35066/31849 33248/35069/31852 33253/35070/31853 33249/35071/31854
+f 33249/35071/31854 33253/35070/31853 38968/35072/31855 38969/35073/31856
+f 33248/35069/31852 37310/34690/31476 37309/34689/31475 33253/35070/31853
+f 33253/35070/31853 37309/34689/31475 40352/34692/31478 38968/35072/31855
+f 33247/35066/31849 33249/35071/31854 33254/35074/31857 33250/35075/31858
+f 33250/35075/31858 33254/35074/31857 37381/35076/31859 37382/35077/31860
+f 33249/35071/31854 38969/35073/31856 38970/35078/31861 33254/35074/31857
+f 33254/35074/31857 38970/35078/31861 40376/35079/31862 37381/35076/31859
+f 33247/35066/31849 33250/35075/31858 33255/35080/31863 33251/35067/31850
+f 33251/35067/31850 33255/35080/31863 38967/35062/31845 38966/35057/31840
+f 33250/35075/31858 37382/35077/31860 37383/35081/31864 33255/35080/31863
+f 33255/35080/31863 37383/35081/31864 40375/35063/31846 38967/35062/31845
+f 33256/35082/31865 33260/35083/31866 33261/35084/31867 33257/35085/31868
+f 33257/35085/31868 33261/35084/31867 37314/34710/31496 37313/34706/31492
+f 33260/35083/31866 38969/35073/31856 38968/35072/31855 33261/35084/31867
+f 33261/35084/31867 38968/35072/31855 40352/34692/31478 37314/34710/31496
+f 33256/35082/31865 33257/35085/31868 33262/35086/31869 33258/35087/31870
+f 33258/35087/31870 33262/35086/31869 38971/35088/31871 38972/35089/31872
+f 33257/35085/31868 37313/34706/31492 37312/34705/31491 33262/35086/31869
+f 33262/35086/31869 37312/34705/31491 40353/34708/31494 38971/35088/31871
+f 33256/35082/31865 33258/35087/31870 33263/35090/31873 33259/35091/31874
+f 33259/35091/31874 33263/35090/31873 37384/35092/31875 37385/35093/31876
+f 33258/35087/31870 38972/35089/31872 38973/35094/31877 33263/35090/31873
+f 33263/35090/31873 38973/35094/31877 40377/35095/31878 37384/35092/31875
+f 33256/35082/31865 33259/35091/31874 33264/35096/31879 33260/35083/31866
+f 33260/35083/31866 33264/35096/31879 38970/35078/31861 38969/35073/31856
+f 33259/35091/31874 37385/35093/31876 37386/35097/31880 33264/35096/31879
+f 33264/35096/31879 37386/35097/31880 40376/35079/31862 38970/35078/31861
+f 33265/35098/31881 33269/35099/31882 33270/35100/31883 33266/35101/31884
+f 33266/35101/31884 33270/35100/31883 37317/34726/31512 37316/34722/31508
+f 33269/35099/31882 38972/35089/31872 38971/35088/31871 33270/35100/31883
+f 33270/35100/31883 38971/35088/31871 40353/34708/31494 37317/34726/31512
+f 33265/35098/31881 33266/35101/31884 33271/35102/31885 33267/35103/31886
+f 33267/35103/31886 33271/35102/31885 38974/35104/31887 38975/35105/31888
+f 33266/35101/31884 37316/34722/31508 37315/34721/31507 33271/35102/31885
+f 33271/35102/31885 37315/34721/31507 40354/34724/31510 38974/35104/31887
+f 33265/35098/31881 33267/35103/31886 33272/35106/31889 33268/35107/31890
+f 33268/35107/31890 33272/35106/31889 37387/35108/31891 37388/35109/31892
+f 33267/35103/31886 38975/35105/31888 38976/35110/31893 33272/35106/31889
+f 33272/35106/31889 38976/35110/31893 40378/35111/31894 37387/35108/31891
+f 33265/35098/31881 33268/35107/31890 33273/35112/31895 33269/35099/31882
+f 33269/35099/31882 33273/35112/31895 38973/35094/31877 38972/35089/31872
+f 33268/35107/31890 37388/35109/31892 37389/35113/31896 33273/35112/31895
+f 33273/35112/31895 37389/35113/31896 40377/35095/31878 38973/35094/31877
+f 33274/35114/31897 33278/35115/31898 33279/35116/31899 33275/35117/31900
+f 33275/35117/31900 33279/35116/31899 37320/34742/31528 37319/34738/31524
+f 33278/35115/31898 38975/35105/31888 38974/35104/31887 33279/35116/31899
+f 33279/35116/31899 38974/35104/31887 40354/34724/31510 37320/34742/31528
+f 33274/35114/31897 33275/35117/31900 33280/35118/31901 33276/35119/31902
+f 33276/35119/31902 33280/35118/31901 38977/35120/31903 38978/35121/31904
+f 33275/35117/31900 37319/34738/31524 37318/34737/31523 33280/35118/31901
+f 33280/35118/31901 37318/34737/31523 40355/34740/31526 38977/35120/31903
+f 33274/35114/31897 33276/35119/31902 33281/35122/31905 33277/35123/31906
+f 33277/35123/31906 33281/35122/31905 37390/35124/31907 37391/35125/31908
+f 33276/35119/31902 38978/35121/31904 38979/35126/31909 33281/35122/31905
+f 33281/35122/31905 38979/35126/31909 40379/35127/31910 37390/35124/31907
+f 33274/35114/31897 33277/35123/31906 33282/35128/31911 33278/35115/31898
+f 33278/35115/31898 33282/35128/31911 38976/35110/31893 38975/35105/31888
+f 33277/35123/31906 37391/35125/31908 37392/35129/31912 33282/35128/31911
+f 33282/35128/31911 37392/35129/31912 40378/35111/31894 38976/35110/31893
+f 33283/35130/31913 33287/35131/31914 33288/35132/31915 33284/35133/31916
+f 33284/35133/31916 33288/35132/31915 37323/34758/31544 37322/34754/31540
+f 33287/35131/31914 38978/35121/31904 38977/35120/31903 33288/35132/31915
+f 33288/35132/31915 38977/35120/31903 40355/34740/31526 37323/34758/31544
+f 33283/35130/31913 33284/35133/31916 33289/35134/31917 33285/35135/31918
+f 33285/35135/31918 33289/35134/31917 38980/35136/31919 38981/35137/31920
+f 33284/35133/31916 37322/34754/31540 37321/34753/31539 33289/35134/31917
+f 33289/35134/31917 37321/34753/31539 40356/34756/31542 38980/35136/31919
+f 33283/35130/31913 33285/35135/31918 33290/35138/31921 33286/35139/31922
+f 33286/35139/31922 33290/35138/31921 37393/35140/31923 37394/35141/31924
+f 33285/35135/31918 38981/35137/31920 38982/35142/31925 33290/35138/31921
+f 33290/35138/31921 38982/35142/31925 40380/35143/31926 37393/35140/31923
+f 33283/35130/31913 33286/35139/31922 33291/35144/31927 33287/35131/31914
+f 33287/35131/31914 33291/35144/31927 38979/35126/31909 38978/35121/31904
+f 33286/35139/31922 37394/35141/31924 37395/35145/31928 33291/35144/31927
+f 33291/35144/31927 37395/35145/31928 40379/35127/31910 38979/35126/31909
+f 33292/35146/31929 33296/35147/31930 33297/35148/31931 33293/35149/31932
+f 33293/35149/31932 33297/35148/31931 37326/34773/31560 37325/34770/31556
+f 33296/35147/31930 38981/35137/31920 38980/35136/31919 33297/35148/31931
+f 33297/35148/31931 38980/35136/31919 40356/34756/31542 37326/34773/31560
+f 33292/35146/31929 33293/35149/31932 33298/35150/31933 33294/35151/31934
+f 33294/35151/31934 33298/35150/31933 38983/35152/31935 38984/35153/31936
+f 33293/35149/31932 37325/34770/31556 37324/34769/31555 33298/35150/31933
+f 33298/35150/31933 37324/34769/31555 40357/31268/31558 38983/35152/31935
+f 33292/35146/31929 33294/35151/31934 33299/35154/31937 33295/35155/31938
+f 33295/35155/31938 33299/35154/31937 37396/35156/31939 37397/35157/31940
+f 33294/35151/31934 38984/35153/31936 38985/35158/31941 33299/35154/31937
+f 33299/35154/31937 38985/35158/31941 40381/35159/31942 37396/35156/31939
+f 33292/35146/31929 33295/35155/31938 33300/35160/31943 33296/35147/31930
+f 33296/35147/31930 33300/35160/31943 38982/35142/31925 38981/35137/31920
+f 33295/35155/31938 37397/35157/31940 37398/35161/31944 33300/35160/31943
+f 33300/35160/31943 37398/35161/31944 40380/35143/31926 38982/35142/31925
+f 33301/35162/31945 33305/35163/31946 33306/35164/31947 33302/35165/31948
+f 33302/35165/31948 33306/35164/31947 37329/34789/31576 37328/34785/31572
+f 33305/35163/31946 38984/35153/31936 38983/35152/31935 33306/35164/31947
+f 33306/35164/31947 38983/35152/31935 40357/31268/31558 37329/34789/31576
+f 33301/35162/31945 33302/35165/31948 33307/35166/31949 33303/35167/31950
+f 33303/35167/31950 33307/35166/31949 38986/35168/31951 38987/35169/31952
+f 33302/35165/31948 37328/34785/31572 37327/34784/31571 33307/35166/31949
+f 33307/35166/31949 37327/34784/31571 40358/34787/31574 38986/35168/31951
+f 33301/35162/31945 33303/35167/31950 33308/35170/31953 33304/35171/31954
+f 33304/35171/31954 33308/35170/31953 37399/35172/31955 37400/35173/31956
+f 33303/35167/31950 38987/35169/31952 38988/35174/31957 33308/35170/31953
+f 33308/35170/31953 38988/35174/31957 40382/35175/31958 37399/35172/31955
+f 33301/35162/31945 33304/35171/31954 33309/35176/31959 33305/35163/31946
+f 33305/35163/31946 33309/35176/31959 38985/35158/31941 38984/35153/31936
+f 33304/35171/31954 37400/35173/31956 37401/35177/31960 33309/35176/31959
+f 33309/35176/31959 37401/35177/31960 40381/35159/31942 38985/35158/31941
+f 33310/35178/31961 33314/35179/31962 33315/35180/31963 33311/35181/31964
+f 33311/35181/31964 33315/35180/31963 37332/34805/31592 37331/34801/31588
+f 33314/35179/31962 38987/35169/31952 38986/35168/31951 33315/35180/31963
+f 33315/35180/31963 38986/35168/31951 40358/34787/31574 37332/34805/31592
+f 33310/35178/31961 33311/35181/31964 33316/35182/31965 33312/35183/31966
+f 33312/35183/31966 33316/35182/31965 38989/35184/31967 38990/35185/31968
+f 33311/35181/31964 37331/34801/31588 37330/34800/31587 33316/35182/31965
+f 33316/35182/31965 37330/34800/31587 40359/34803/31590 38989/35184/31967
+f 33310/35178/31961 33312/35183/31966 33317/35186/31969 33313/35187/31970
+f 33313/35187/31970 33317/35186/31969 37402/35188/31971 37403/35189/31972
+f 33312/35183/31966 38990/35185/31968 38991/35190/31973 33317/35186/31969
+f 33317/35186/31969 38991/35190/31973 40383/35191/31974 37402/35188/31971
+f 33310/35178/31961 33313/35187/31970 33318/35192/31975 33314/35179/31962
+f 33314/35179/31962 33318/35192/31975 38988/35174/31957 38987/35169/31952
+f 33313/35187/31970 37403/35189/31972 37404/35193/31976 33318/35192/31975
+f 33318/35192/31975 37404/35193/31976 40382/35175/31958 38988/35174/31957
+f 33319/35194/31977 33323/35195/31978 33324/35196/31979 33320/35197/31980
+f 33320/35197/31980 33324/35196/31979 37335/34821/31608 37334/34817/31604
+f 33323/35195/31978 38990/35185/31968 38989/35184/31967 33324/35196/31979
+f 33324/35196/31979 38989/35184/31967 40359/34803/31590 37335/34821/31608
+f 33319/35194/31977 33320/35197/31980 33325/35198/31981 33321/35199/31982
+f 33321/35199/31982 33325/35198/31981 38992/35200/31983 38993/35201/31984
+f 33320/35197/31980 37334/34817/31604 37333/34816/31603 33325/35198/31981
+f 33325/35198/31981 37333/34816/31603 40360/34819/31606 38992/35200/31983
+f 33319/35194/31977 33321/35199/31982 33326/35202/31985 33322/35203/31986
+f 33322/35203/31986 33326/35202/31985 37405/35204/31987 37406/35205/31988
+f 33321/35199/31982 38993/35201/31984 38994/35206/31989 33326/35202/31985
+f 33326/35202/31985 38994/35206/31989 40384/35207/31990 37405/35204/31987
+f 33319/35194/31977 33322/35203/31986 33327/35208/31991 33323/35195/31978
+f 33323/35195/31978 33327/35208/31991 38991/35190/31973 38990/35185/31968
+f 33322/35203/31986 37406/35205/31988 37407/35209/31992 33327/35208/31991
+f 33327/35208/31991 37407/35209/31992 40383/35191/31974 38991/35190/31973
+f 33328/35210/31993 33332/35211/31994 33333/35212/31995 33329/35213/31996
+f 33329/35213/31996 33333/35212/31995 37338/34837/31624 37337/34833/31620
+f 33332/35211/31994 38993/35201/31984 38992/35200/31983 33333/35212/31995
+f 33333/35212/31995 38992/35200/31983 40360/34819/31606 37338/34837/31624
+f 33328/35210/31993 33329/35213/31996 33334/35214/31997 33330/35215/31998
+f 33330/35215/31998 33334/35214/31997 38995/35216/31999 38996/35217/32000
+f 33329/35213/31996 37337/34833/31620 37336/34832/31619 33334/35214/31997
+f 33334/35214/31997 37336/34832/31619 40361/34835/31622 38995/35216/31999
+f 33328/35210/31993 33330/35215/31998 33335/35218/32001 33331/35219/32002
+f 33331/35219/32002 33335/35218/32001 37408/35220/32003 37409/35221/32004
+f 33330/35215/31998 38996/35217/32000 38997/35222/32005 33335/35218/32001
+f 33335/35218/32001 38997/35222/32005 40385/35223/32006 37408/35220/32003
+f 33328/35210/31993 33331/35219/32002 33336/35224/32007 33332/35211/31994
+f 33332/35211/31994 33336/35224/32007 38994/35206/31989 38993/35201/31984
+f 33331/35219/32002 37409/35221/32004 37410/35225/32008 33336/35224/32007
+f 33336/35224/32007 37410/35225/32008 40384/35207/31990 38994/35206/31989
+f 33337/35226/32009 33341/35227/32010 33342/35228/32011 33338/35229/32012
+f 33338/35229/32012 33342/35228/32011 37341/34853/31640 37340/34849/31636
+f 33341/35227/32010 38996/35217/32000 38995/35216/31999 33342/35228/32011
+f 33342/35228/32011 38995/35216/31999 40361/34835/31622 37341/34853/31640
+f 33337/35226/32009 33338/35229/32012 33343/35230/32013 33339/35231/32014
+f 33339/35231/32014 33343/35230/32013 38998/35232/32015 38999/35233/32016
+f 33338/35229/32012 37340/34849/31636 37339/34848/31635 33343/35230/32013
+f 33343/35230/32013 37339/34848/31635 40362/34851/31638 38998/35232/32015
+f 33337/35226/32009 33339/35231/32014 33344/35234/32017 33340/35235/32018
+f 33340/35235/32018 33344/35234/32017 37411/35236/32019 37412/35237/32020
+f 33339/35231/32014 38999/35233/32016 39000/35238/32021 33344/35234/32017
+f 33344/35234/32017 39000/35238/32021 40386/35239/32022 37411/35236/32019
+f 33337/35226/32009 33340/35235/32018 33345/35240/32023 33341/35227/32010
+f 33341/35227/32010 33345/35240/32023 38997/35222/32005 38996/35217/32000
+f 33340/35235/32018 37412/35237/32020 37413/35241/32024 33345/35240/32023
+f 33345/35240/32023 37413/35241/32024 40385/35223/32006 38997/35222/32005
+f 33346/35242/32025 33350/35243/32026 33351/35244/32027 33347/35245/32028
+f 33347/35245/32028 33351/35244/32027 37344/34869/31656 37343/34865/31652
+f 33350/35243/32026 38999/35233/32016 38998/35232/32015 33351/35244/32027
+f 33351/35244/32027 38998/35232/32015 40362/34851/31638 37344/34869/31656
+f 33346/35242/32025 33347/35245/32028 33352/35246/32029 33348/35247/32030
+f 33348/35247/32030 33352/35246/32029 39001/35248/32031 39002/35249/32032
+f 33347/35245/32028 37343/34865/31652 37342/34864/31651 33352/35246/32029
+f 33352/35246/32029 37342/34864/31651 40363/34867/31654 39001/35248/32031
+f 33346/35242/32025 33348/35247/32030 33353/35250/32033 33349/35251/32034
+f 33349/35251/32034 33353/35250/32033 37414/35252/32035 37415/35253/32036
+f 33348/35247/32030 39002/35249/32032 39003/35254/32037 33353/35250/32033
+f 33353/35250/32033 39003/35254/32037 40387/35255/32038 37414/35252/32035
+f 33346/35242/32025 33349/35251/32034 33354/35256/32039 33350/35243/32026
+f 33350/35243/32026 33354/35256/32039 39000/35238/32021 38999/35233/32016
+f 33349/35251/32034 37415/35253/32036 37416/35257/32040 33354/35256/32039
+f 33354/35256/32039 37416/35257/32040 40386/35239/32022 39000/35238/32021
+f 33355/35258/32041 33359/35259/32042 33360/35260/32043 33356/35261/32044
+f 33356/35261/32044 33360/35260/32043 37347/34885/31672 37346/34881/31668
+f 33359/35259/32042 39002/35249/32032 39001/35248/32031 33360/35260/32043
+f 33360/35260/32043 39001/35248/32031 40363/34867/31654 37347/34885/31672
+f 33355/35258/32041 33356/35261/32044 33361/35262/32045 33357/35263/32046
+f 33357/35263/32046 33361/35262/32045 39004/35264/32047 39005/35265/32048
+f 33356/35261/32044 37346/34881/31668 37345/34880/31667 33361/35262/32045
+f 33361/35262/32045 37345/34880/31667 40364/34883/31670 39004/35264/32047
+f 33355/35258/32041 33357/35263/32046 33362/35266/32049 33358/35267/32050
+f 33358/35267/32050 33362/35266/32049 37417/35268/32051 37418/35269/32052
+f 33357/35263/32046 39005/35265/32048 39006/35270/32053 33362/35266/32049
+f 33362/35266/32049 39006/35270/32053 40388/35271/32054 37417/35268/32051
+f 33355/35258/32041 33358/35267/32050 33363/35272/32055 33359/35259/32042
+f 33359/35259/32042 33363/35272/32055 39003/35254/32037 39002/35249/32032
+f 33358/35267/32050 37418/35269/32052 37419/35273/32056 33363/35272/32055
+f 33363/35272/32055 37419/35273/32056 40387/35255/32038 39003/35254/32037
+f 33364/35274/32057 33368/35275/32058 33369/35276/32059 33365/35277/32060
+f 33365/35277/32060 33369/35276/32059 37350/34901/31688 37349/34897/31684
+f 33368/35275/32058 39005/35265/32048 39004/35264/32047 33369/35276/32059
+f 33369/35276/32059 39004/35264/32047 40364/34883/31670 37350/34901/31688
+f 33364/35274/32057 33365/35277/32060 33370/35278/32061 33366/35279/32062
+f 33366/35279/32062 33370/35278/32061 39007/35280/32063 39008/35281/32064
+f 33365/35277/32060 37349/34897/31684 37348/34896/31683 33370/35278/32061
+f 33370/35278/32061 37348/34896/31683 40365/34899/31686 39007/35280/32063
+f 33364/35274/32057 33366/35279/32062 33371/35282/32065 33367/35283/32066
+f 33367/35283/32066 33371/35282/32065 37420/35284/32067 37421/35285/32068
+f 33366/35279/32062 39008/35281/32064 39009/35286/32069 33371/35282/32065
+f 33371/35282/32065 39009/35286/32069 40389/35287/32070 37420/35284/32067
+f 33364/35274/32057 33367/35283/32066 33372/35288/32071 33368/35275/32058
+f 33368/35275/32058 33372/35288/32071 39006/35270/32053 39005/35265/32048
+f 33367/35283/32066 37421/35285/32068 37422/35289/32072 33372/35288/32071
+f 33372/35288/32071 37422/35289/32072 40388/35271/32054 39006/35270/32053
+f 33373/35290/32073 33377/35291/32074 33378/35292/32075 33374/35293/32076
+f 33374/35293/32076 33378/35292/32075 37353/34917/31704 37352/34913/31700
+f 33377/35291/32074 39008/35281/32064 39007/35280/32063 33378/35292/32075
+f 33378/35292/32075 39007/35280/32063 40365/34899/31686 37353/34917/31704
+f 33373/35290/32073 33374/35293/32076 33379/35294/32077 33375/35295/32078
+f 33375/35295/32078 33379/35294/32077 39010/35296/32079 39011/35297/32080
+f 33374/35293/32076 37352/34913/31700 37351/34912/31699 33379/35294/32077
+f 33379/35294/32077 37351/34912/31699 40366/34915/31702 39010/35296/32079
+f 33373/35290/32073 33375/35295/32078 33380/35298/32081 33376/35299/32082
+f 33376/35299/32082 33380/35298/32081 37423/35300/32083 37424/35301/32084
+f 33375/35295/32078 39011/35297/32080 39012/35302/32085 33380/35298/32081
+f 33380/35298/32081 39012/35302/32085 40390/35303/32086 37423/35300/32083
+f 33373/35290/32073 33376/35299/32082 33381/35304/32087 33377/35291/32074
+f 33377/35291/32074 33381/35304/32087 39009/35286/32069 39008/35281/32064
+f 33376/35299/32082 37424/35301/32084 37425/35305/32088 33381/35304/32087
+f 33381/35304/32087 37425/35305/32088 40389/35287/32070 39009/35286/32069
+f 33382/35306/32089 33386/35307/32090 33387/35308/32091 33383/35309/32092
+f 33383/35309/32092 33387/35308/32091 37356/34933/31720 37355/34929/31716
+f 33386/35307/32090 39011/35297/32080 39010/35296/32079 33387/35308/32091
+f 33387/35308/32091 39010/35296/32079 40366/34915/31702 37356/34933/31720
+f 33382/35306/32089 33383/35309/32092 33388/35310/32093 33384/35311/32094
+f 33384/35311/32094 33388/35310/32093 39013/35312/32095 39014/35313/32096
+f 33383/35309/32092 37355/34929/31716 37354/34928/31715 33388/35310/32093
+f 33388/35310/32093 37354/34928/31715 40367/34931/31718 39013/35312/32095
+f 33382/35306/32089 33384/35311/32094 33389/35314/32097 33385/35315/32098
+f 33385/35315/32098 33389/35314/32097 37426/35316/32099 37427/35317/32100
+f 33384/35311/32094 39014/35313/32096 39015/35318/32101 33389/35314/32097
+f 33389/35314/32097 39015/35318/32101 40391/35319/32102 37426/35316/32099
+f 33382/35306/32089 33385/35315/32098 33390/35320/32103 33386/35307/32090
+f 33386/35307/32090 33390/35320/32103 39012/35302/32085 39011/35297/32080
+f 33385/35315/32098 37427/35317/32100 37428/35321/32104 33390/35320/32103
+f 33390/35320/32103 37428/35321/32104 40390/35303/32086 39012/35302/32085
+f 33391/35322/32105 33395/35323/32106 33396/35324/32107 33392/35325/32108
+f 33392/35325/32108 33396/35324/32107 37359/34949/31736 37358/34945/31732
+f 33395/35323/32106 39014/35313/32096 39013/35312/32095 33396/35324/32107
+f 33396/35324/32107 39013/35312/32095 40367/34931/31718 37359/34949/31736
+f 33391/35322/32105 33392/35325/32108 33397/35326/32109 33393/35327/32110
+f 33393/35327/32110 33397/35326/32109 39016/35328/32111 39017/35329/32112
+f 33392/35325/32108 37358/34945/31732 37357/34944/31731 33397/35326/32109
+f 33397/35326/32109 37357/34944/31731 40368/34947/31734 39016/35328/32111
+f 33391/35322/32105 33393/35327/32110 33398/35330/32113 33394/35331/32114
+f 33394/35331/32114 33398/35330/32113 37429/35332/32115 37430/35333/32116
+f 33393/35327/32110 39017/35329/32112 39018/35334/32117 33398/35330/32113
+f 33398/35330/32113 39018/35334/32117 40392/35335/32118 37429/35332/32115
+f 33391/35322/32105 33394/35331/32114 33399/35336/32119 33395/35323/32106
+f 33395/35323/32106 33399/35336/32119 39015/35318/32101 39014/35313/32096
+f 33394/35331/32114 37430/35333/32116 37431/35337/32120 33399/35336/32119
+f 33399/35336/32119 37431/35337/32120 40391/35319/32102 39015/35318/32101
+f 33400/35338/32121 33404/35339/32122 33405/35340/32123 33401/35341/32124
+f 33401/35341/32124 33405/35340/32123 37362/34965/31752 37361/34961/31748
+f 33404/35339/32122 39017/35329/32112 39016/35328/32111 33405/35340/32123
+f 33405/35340/32123 39016/35328/32111 40368/34947/31734 37362/34965/31752
+f 33400/35338/32121 33401/35341/32124 33406/35342/32125 33402/35343/32126
+f 33402/35343/32126 33406/35342/32125 39019/35344/32127 39020/35345/32128
+f 33401/35341/32124 37361/34961/31748 37360/34960/31747 33406/35342/32125
+f 33406/35342/32125 37360/34960/31747 40369/34963/31750 39019/35344/32127
+f 33400/35338/32121 33402/35343/32126 33407/35346/32129 33403/35347/32130
+f 33403/35347/32130 33407/35346/32129 37432/35348/32131 37433/35349/32132
+f 33402/35343/32126 39020/35345/32128 39021/35350/32133 33407/35346/32129
+f 33407/35346/32129 39021/35350/32133 40393/35351/32134 37432/35348/32131
+f 33400/35338/32121 33403/35347/32130 33408/35352/32135 33404/35339/32122
+f 33404/35339/32122 33408/35352/32135 39018/35334/32117 39017/35329/32112
+f 33403/35347/32130 37433/35349/32132 37434/35353/32136 33408/35352/32135
+f 33408/35352/32135 37434/35353/32136 40392/35335/32118 39018/35334/32117
+f 33409/35354/32137 33413/35355/32138 33414/35356/32139 33410/35357/32140
+f 33410/35357/32140 33414/35356/32139 37365/34981/31768 37364/34977/31764
+f 33413/35355/32138 39020/35345/32128 39019/35344/32127 33414/35356/32139
+f 33414/35356/32139 39019/35344/32127 40369/34963/31750 37365/34981/31768
+f 33409/35354/32137 33410/35357/32140 33415/35358/32141 33411/35359/32142
+f 33411/35359/32142 33415/35358/32141 39022/35360/32143 39023/35361/32144
+f 33410/35357/32140 37364/34977/31764 37363/34976/31763 33415/35358/32141
+f 33415/35358/32141 37363/34976/31763 40370/34979/31766 39022/35360/32143
+f 33409/35354/32137 33411/35359/32142 33416/35362/32145 33412/35363/32146
+f 33412/35363/32146 33416/35362/32145 37435/35364/32147 37436/35365/32148
+f 33411/35359/32142 39023/35361/32144 39024/35366/32149 33416/35362/32145
+f 33416/35362/32145 39024/35366/32149 40394/35367/32150 37435/35364/32147
+f 33409/35354/32137 33412/35363/32146 33417/35368/32151 33413/35355/32138
+f 33413/35355/32138 33417/35368/32151 39021/35350/32133 39020/35345/32128
+f 33412/35363/32146 37436/35365/32148 37437/35369/32152 33417/35368/32151
+f 33417/35368/32151 37437/35369/32152 40393/35351/32134 39021/35350/32133
+f 33418/35370/32153 33422/35371/32154 33423/35372/32155 33419/35373/32156
+f 33419/35373/32156 33423/35372/32155 37368/34997/31784 37367/34993/31780
+f 33422/35371/32154 39023/35361/32144 39022/35360/32143 33423/35372/32155
+f 33423/35372/32155 39022/35360/32143 40370/34979/31766 37368/34997/31784
+f 33418/35370/32153 33419/35373/32156 33424/35374/32157 33420/35375/32158
+f 33420/35375/32158 33424/35374/32157 39025/35376/32159 39026/35377/32160
+f 33419/35373/32156 37367/34993/31780 37366/34992/31779 33424/35374/32157
+f 33424/35374/32157 37366/34992/31779 40371/34995/31782 39025/35376/32159
+f 33418/35370/32153 33420/35375/32158 33425/35378/32161 33421/35379/32162
+f 33421/35379/32162 33425/35378/32161 37438/35380/32163 37439/35381/32164
+f 33420/35375/32158 39026/35377/32160 39027/35382/32165 33425/35378/32161
+f 33425/35378/32161 39027/35382/32165 40395/35383/32166 37438/35380/32163
+f 33418/35370/32153 33421/35379/32162 33426/35384/32167 33422/35371/32154
+f 33422/35371/32154 33426/35384/32167 39024/35366/32149 39023/35361/32144
+f 33421/35379/32162 37439/35381/32164 37440/35385/32168 33426/35384/32167
+f 33426/35384/32167 37440/35385/32168 40394/35367/32150 39024/35366/32149
+f 33427/35386/32169 33431/35387/32170 33432/35388/32171 33428/35389/32172
+f 33428/35389/32172 33432/35388/32171 37371/35013/31796 37370/35009/31794
+f 33431/35387/32170 39026/35377/32160 39025/35376/32159 33432/35388/32171
+f 33432/35388/32171 39025/35376/32159 40371/34995/31782 37371/35013/31796
+f 33427/35386/32169 33428/35389/32172 33433/35390/32173 33429/35391/32174
+f 33429/35391/32174 33433/35390/32173 38958/35392/31802 38957/35393/31801
+f 33428/35389/32172 37370/35009/31794 37369/35008/31793 33433/35390/32173
+f 33433/35390/32173 37369/35008/31793 40348/35011/31432 38958/35392/31802
+f 33427/35386/32169 33429/35391/32174 33434/35394/32175 33430/35395/32176
+f 33430/35395/32176 33434/35394/32175 37441/35396/32177 37442/35397/32178
+f 33429/35391/32174 38957/35393/31801 38956/35398/31814 33434/35394/32175
+f 33434/35394/32175 38956/35398/31814 40372/35399/31816 37441/35396/32177
+f 33427/35386/32169 33430/35395/32176 33435/35400/32179 33431/35387/32170
+f 33431/35387/32170 33435/35400/32179 39027/35382/32165 39026/35377/32160
+f 33430/35395/32176 37442/35397/32178 37443/35401/32180 33435/35400/32179
+f 33435/35400/32179 37443/35401/32180 40395/35383/32166 39027/35382/32165
+f 33436/35402/32181 33440/35403/32182 33441/35404/32183 33437/35405/32184
+f 33437/35405/32184 33441/35404/32183 37374/35032/31815 37373/35027/31810
+f 33440/35403/32182 39029/35406/32185 39030/35407/32186 33441/35404/32183
+f 33441/35404/32183 39030/35407/32186 40372/35033/31816 37374/35032/31815
+f 33436/35402/32181 33437/35405/32184 33442/35408/32187 33438/35409/32188
+f 33438/35409/32188 33442/35408/32187 39031/35410/32189 39032/35411/32190
+f 33437/35405/32184 37373/35027/31810 37372/35026/31809 33442/35408/32187
+f 33442/35408/32187 37372/35026/31809 40373/35029/31812 39031/35410/32189
+f 33436/35402/32181 33438/35409/32188 33443/35412/32191 33439/35413/32192
+f 33439/35413/32192 33443/35412/32191 37444/35414/32193 37445/35415/32194
+f 33438/35409/32188 39032/35411/32190 39033/35416/32195 33443/35412/32191
+f 33443/35412/32191 39033/35416/32195 40397/35417/32196 37444/35414/32193
+f 33436/35402/32181 33439/35413/32192 33444/35418/32197 33440/35403/32182
+f 33440/35403/32182 33444/35418/32197 39028/35419/32198 39029/35406/32185
+f 33439/35413/32192 37445/35415/32194 37446/35420/32199 33444/35418/32197
+f 33444/35418/32197 37446/35420/32199 40396/35421/32200 39028/35419/32198
+f 33445/35422/32201 33449/35423/32202 33450/35424/32203 33446/35425/32204
+f 33446/35425/32204 33450/35424/32203 37377/35049/31832 37376/35045/31828
+f 33449/35423/32202 39032/35411/32190 39031/35410/32189 33450/35424/32203
+f 33450/35424/32203 39031/35410/32189 40373/35029/31812 37377/35049/31832
+f 33445/35422/32201 33446/35425/32204 33451/35426/32205 33447/35427/32206
+f 33447/35427/32206 33451/35426/32205 39034/35428/32207 39035/35429/32208
+f 33446/35425/32204 37376/35045/31828 37375/35044/31827 33451/35426/32205
+f 33451/35426/32205 37375/35044/31827 40374/35047/31830 39034/35428/32207
+f 33445/35422/32201 33447/35427/32206 33452/35430/32209 33448/35431/32210
+f 33448/35431/32210 33452/35430/32209 37447/35432/32211 37448/35433/32212
+f 33447/35427/32206 39035/35429/32208 39036/35434/32213 33452/35430/32209
+f 33452/35430/32209 39036/35434/32213 40398/35435/32214 37447/35432/32211
+f 33445/35422/32201 33448/35431/32210 33453/35436/32215 33449/35423/32202
+f 33449/35423/32202 33453/35436/32215 39033/35416/32195 39032/35411/32190
+f 33448/35431/32210 37448/35433/32212 37449/35437/32216 33453/35436/32215
+f 33453/35436/32215 37449/35437/32216 40397/35417/32196 39033/35416/32195
+f 33454/35438/32217 33458/35439/32218 33459/35440/32219 33455/35441/32220
+f 33455/35441/32220 33459/35440/32219 37380/35065/31848 37379/35061/31844
+f 33458/35439/32218 39035/35429/32208 39034/35428/32207 33459/35440/32219
+f 33459/35440/32219 39034/35428/32207 40374/35047/31830 37380/35065/31848
+f 33454/35438/32217 33455/35441/32220 33460/35442/32221 33456/35443/32222
+f 33456/35443/32222 33460/35442/32221 39037/35444/32223 39038/35445/32224
+f 33455/35441/32220 37379/35061/31844 37378/35060/31843 33460/35442/32221
+f 33460/35442/32221 37378/35060/31843 40375/35063/31846 39037/35444/32223
+f 33454/35438/32217 33456/35443/32222 33461/35446/32225 33457/35447/32226
+f 33457/35447/32226 33461/35446/32225 37450/35448/32227 37451/35449/32228
+f 33456/35443/32222 39038/35445/32224 39039/35450/32229 33461/35446/32225
+f 33461/35446/32225 39039/35450/32229 40399/35451/32230 37450/35448/32227
+f 33454/35438/32217 33457/35447/32226 33462/35452/32231 33458/35439/32218
+f 33458/35439/32218 33462/35452/32231 39036/35434/32213 39035/35429/32208
+f 33457/35447/32226 37451/35449/32228 37452/35453/32232 33462/35452/32231
+f 33462/35452/32231 37452/35453/32232 40398/35435/32214 39036/35434/32213
+f 33463/35454/32233 33467/35455/32234 33468/35456/32235 33464/35457/32236
+f 33464/35457/32236 33468/35456/32235 37383/35081/31864 37382/35077/31860
+f 33467/35455/32234 39038/35445/32224 39037/35444/32223 33468/35456/32235
+f 33468/35456/32235 39037/35444/32223 40375/35063/31846 37383/35081/31864
+f 33463/35454/32233 33464/35457/32236 33469/35458/32237 33465/35459/32238
+f 33465/35459/32238 33469/35458/32237 39040/35460/32239 39041/35461/32240
+f 33464/35457/32236 37382/35077/31860 37381/35076/31859 33469/35458/32237
+f 33469/35458/32237 37381/35076/31859 40376/35079/31862 39040/35460/32239
+f 33463/35454/32233 33465/35459/32238 33470/35462/32241 33466/35463/32242
+f 33466/35463/32242 33470/35462/32241 37453/35464/32243 37454/35465/32244
+f 33465/35459/32238 39041/35461/32240 39042/35466/32245 33470/35462/32241
+f 33470/35462/32241 39042/35466/32245 40400/35467/32246 37453/35464/32243
+f 33463/35454/32233 33466/35463/32242 33471/35468/32247 33467/35455/32234
+f 33467/35455/32234 33471/35468/32247 39039/35450/32229 39038/35445/32224
+f 33466/35463/32242 37454/35465/32244 37455/35469/32248 33471/35468/32247
+f 33471/35468/32247 37455/35469/32248 40399/35451/32230 39039/35450/32229
+f 33472/35470/32249 33476/35471/32250 33477/35472/32251 33473/35473/32252
+f 33473/35473/32252 33477/35472/32251 37386/35097/31880 37385/35093/31876
+f 33476/35471/32250 39041/35461/32240 39040/35460/32239 33477/35472/32251
+f 33477/35472/32251 39040/35460/32239 40376/35079/31862 37386/35097/31880
+f 33472/35470/32249 33473/35473/32252 33478/35474/32253 33474/35475/32254
+f 33474/35475/32254 33478/35474/32253 39043/35476/32255 39044/35477/32256
+f 33473/35473/32252 37385/35093/31876 37384/35092/31875 33478/35474/32253
+f 33478/35474/32253 37384/35092/31875 40377/35095/31878 39043/35476/32255
+f 33472/35470/32249 33474/35475/32254 33479/35478/32257 33475/35479/32258
+f 33475/35479/32258 33479/35478/32257 37456/35480/32259 37457/35481/32260
+f 33474/35475/32254 39044/35477/32256 39045/35482/32261 33479/35478/32257
+f 33479/35478/32257 39045/35482/32261 40401/35483/32262 37456/35480/32259
+f 33472/35470/32249 33475/35479/32258 33480/35484/32263 33476/35471/32250
+f 33476/35471/32250 33480/35484/32263 39042/35466/32245 39041/35461/32240
+f 33475/35479/32258 37457/35481/32260 37458/35485/32264 33480/35484/32263
+f 33480/35484/32263 37458/35485/32264 40400/35467/32246 39042/35466/32245
+f 33481/35486/32265 33485/35487/32266 33486/35488/32267 33482/35489/32268
+f 33482/35489/32268 33486/35488/32267 37389/35113/31896 37388/35109/31892
+f 33485/35487/32266 39044/35477/32256 39043/35476/32255 33486/35488/32267
+f 33486/35488/32267 39043/35476/32255 40377/35095/31878 37389/35113/31896
+f 33481/35486/32265 33482/35489/32268 33487/35490/32269 33483/35491/32270
+f 33483/35491/32270 33487/35490/32269 39046/35492/32271 39047/35493/32272
+f 33482/35489/32268 37388/35109/31892 37387/35108/31891 33487/35490/32269
+f 33487/35490/32269 37387/35108/31891 40378/35111/31894 39046/35492/32271
+f 33481/35486/32265 33483/35491/32270 33488/35494/32273 33484/35495/32274
+f 33484/35495/32274 33488/35494/32273 37459/35496/32275 37460/35497/32276
+f 33483/35491/32270 39047/35493/32272 39048/35498/32277 33488/35494/32273
+f 33488/35494/32273 39048/35498/32277 40402/35499/32278 37459/35496/32275
+f 33481/35486/32265 33484/35495/32274 33489/35500/32279 33485/35487/32266
+f 33485/35487/32266 33489/35500/32279 39045/35482/32261 39044/35477/32256
+f 33484/35495/32274 37460/35497/32276 37461/35501/32280 33489/35500/32279
+f 33489/35500/32279 37461/35501/32280 40401/35483/32262 39045/35482/32261
+f 33490/35502/32281 33494/35503/32282 33495/35504/32283 33491/35505/32284
+f 33491/35505/32284 33495/35504/32283 37392/35129/31912 37391/35125/31908
+f 33494/35503/32282 39047/35493/32272 39046/35492/32271 33495/35504/32283
+f 33495/35504/32283 39046/35492/32271 40378/35111/31894 37392/35129/31912
+f 33490/35502/32281 33491/35505/32284 33496/35506/32285 33492/35507/32286
+f 33492/35507/32286 33496/35506/32285 39049/35508/32287 39050/35509/32288
+f 33491/35505/32284 37391/35125/31908 37390/35124/31907 33496/35506/32285
+f 33496/35506/32285 37390/35124/31907 40379/35127/31910 39049/35508/32287
+f 33490/35502/32281 33492/35507/32286 33497/35510/32289 33493/35511/32290
+f 33493/35511/32290 33497/35510/32289 37462/35512/32291 37463/35513/32292
+f 33492/35507/32286 39050/35509/32288 39051/35514/32293 33497/35510/32289
+f 33497/35510/32289 39051/35514/32293 40403/35515/32294 37462/35512/32291
+f 33490/35502/32281 33493/35511/32290 33498/35516/32295 33494/35503/32282
+f 33494/35503/32282 33498/35516/32295 39048/35498/32277 39047/35493/32272
+f 33493/35511/32290 37463/35513/32292 37464/35517/32296 33498/35516/32295
+f 33498/35516/32295 37464/35517/32296 40402/35499/32278 39048/35498/32277
+f 33499/35518/32297 33503/35519/32298 33504/35520/32299 33500/35521/32300
+f 33500/35521/32300 33504/35520/32299 37395/35145/31928 37394/35141/31924
+f 33503/35519/32298 39050/35509/32288 39049/35508/32287 33504/35520/32299
+f 33504/35520/32299 39049/35508/32287 40379/35127/31910 37395/35145/31928
+f 33499/35518/32297 33500/35521/32300 33505/35522/32301 33501/35523/32302
+f 33501/35523/32302 33505/35522/32301 39052/35524/32303 39053/35525/32304
+f 33500/35521/32300 37394/35141/31924 37393/35140/31923 33505/35522/32301
+f 33505/35522/32301 37393/35140/31923 40380/35143/31926 39052/35524/32303
+f 33499/35518/32297 33501/35523/32302 33506/35526/32305 33502/35527/32306
+f 33502/35527/32306 33506/35526/32305 37465/35528/32307 37466/35529/32308
+f 33501/35523/32302 39053/35525/32304 39054/35530/32309 33506/35526/32305
+f 33506/35526/32305 39054/35530/32309 40404/35531/32310 37465/35528/32307
+f 33499/35518/32297 33502/35527/32306 33507/35532/32311 33503/35519/32298
+f 33503/35519/32298 33507/35532/32311 39051/35514/32293 39050/35509/32288
+f 33502/35527/32306 37466/35529/32308 37467/35533/32312 33507/35532/32311
+f 33507/35532/32311 37467/35533/32312 40403/35515/32294 39051/35514/32293
+f 33508/35534/32313 33512/35535/32314 33513/35536/32315 33509/35537/32316
+f 33509/35537/32316 33513/35536/32315 37398/35161/31944 37397/35157/31940
+f 33512/35535/32314 39053/35525/32304 39052/35524/32303 33513/35536/32315
+f 33513/35536/32315 39052/35524/32303 40380/35143/31926 37398/35161/31944
+f 33508/35534/32313 33509/35537/32316 33514/35538/32317 33510/35539/32318
+f 33510/35539/32318 33514/35538/32317 39055/35540/32319 39056/35541/32320
+f 33509/35537/32316 37397/35157/31940 37396/35156/31939 33514/35538/32317
+f 33514/35538/32317 37396/35156/31939 40381/35159/31942 39055/35540/32319
+f 33508/35534/32313 33510/35539/32318 33515/35542/32321 33511/35543/32322
+f 33511/35543/32322 33515/35542/32321 37468/35544/32323 37469/35545/32324
+f 33510/35539/32318 39056/35541/32320 39057/35546/32325 33515/35542/32321
+f 33515/35542/32321 39057/35546/32325 40405/35547/32326 37468/35544/32323
+f 33508/35534/32313 33511/35543/32322 33516/35548/32327 33512/35535/32314
+f 33512/35535/32314 33516/35548/32327 39054/35530/32309 39053/35525/32304
+f 33511/35543/32322 37469/35545/32324 37470/35549/32328 33516/35548/32327
+f 33516/35548/32327 37470/35549/32328 40404/35531/32310 39054/35530/32309
+f 33517/35550/32329 33521/35551/32330 33522/35552/32331 33518/35553/32332
+f 33518/35553/32332 33522/35552/32331 37401/35177/31960 37400/35173/31956
+f 33521/35551/32330 39056/35541/32320 39055/35540/32319 33522/35552/32331
+f 33522/35552/32331 39055/35540/32319 40381/35159/31942 37401/35177/31960
+f 33517/35550/32329 33518/35553/32332 33523/35554/32333 33519/35555/32334
+f 33519/35555/32334 33523/35554/32333 39058/35556/32335 39059/35557/32336
+f 33518/35553/32332 37400/35173/31956 37399/35172/31955 33523/35554/32333
+f 33523/35554/32333 37399/35172/31955 40382/35175/31958 39058/35556/32335
+f 33517/35550/32329 33519/35555/32334 33524/35558/32337 33520/35559/32338
+f 33520/35559/32338 33524/35558/32337 37471/35560/32339 37472/35561/32340
+f 33519/35555/32334 39059/35557/32336 39060/35562/32341 33524/35558/32337
+f 33524/35558/32337 39060/35562/32341 40406/35563/32342 37471/35560/32339
+f 33517/35550/32329 33520/35559/32338 33525/35564/32343 33521/35551/32330
+f 33521/35551/32330 33525/35564/32343 39057/35546/32325 39056/35541/32320
+f 33520/35559/32338 37472/35561/32340 37473/35565/32344 33525/35564/32343
+f 33525/35564/32343 37473/35565/32344 40405/35547/32326 39057/35546/32325
+f 33526/35566/32345 33530/35567/32346 33531/35568/32347 33527/35569/32348
+f 33527/35569/32348 33531/35568/32347 37404/35193/31976 37403/35189/31972
+f 33530/35567/32346 39059/35557/32336 39058/35556/32335 33531/35568/32347
+f 33531/35568/32347 39058/35556/32335 40382/35175/31958 37404/35193/31976
+f 33526/35566/32345 33527/35569/32348 33532/35570/32349 33528/35571/32350
+f 33528/35571/32350 33532/35570/32349 39061/35572/32351 39062/35573/32352
+f 33527/35569/32348 37403/35189/31972 37402/35188/31971 33532/35570/32349
+f 33532/35570/32349 37402/35188/31971 40383/35191/31974 39061/35572/32351
+f 33526/35566/32345 33528/35571/32350 33533/35574/32353 33529/35575/32354
+f 33529/35575/32354 33533/35574/32353 37474/35576/32355 37475/35577/32356
+f 33528/35571/32350 39062/35573/32352 39063/35578/32357 33533/35574/32353
+f 33533/35574/32353 39063/35578/32357 40407/35579/32358 37474/35576/32355
+f 33526/35566/32345 33529/35575/32354 33534/35580/32359 33530/35567/32346
+f 33530/35567/32346 33534/35580/32359 39060/35562/32341 39059/35557/32336
+f 33529/35575/32354 37475/35577/32356 37476/35581/32360 33534/35580/32359
+f 33534/35580/32359 37476/35581/32360 40406/35563/32342 39060/35562/32341
+f 33535/35582/32361 33539/35583/32362 33540/35584/32363 33536/35585/32364
+f 33536/35585/32364 33540/35584/32363 37407/35209/31992 37406/35205/31988
+f 33539/35583/32362 39062/35573/32352 39061/35572/32351 33540/35584/32363
+f 33540/35584/32363 39061/35572/32351 40383/35191/31974 37407/35209/31992
+f 33535/35582/32361 33536/35585/32364 33541/35586/32365 33537/35587/32366
+f 33537/35587/32366 33541/35586/32365 39064/35588/32367 39065/35589/32368
+f 33536/35585/32364 37406/35205/31988 37405/35204/31987 33541/35586/32365
+f 33541/35586/32365 37405/35204/31987 40384/35207/31990 39064/35588/32367
+f 33535/35582/32361 33537/35587/32366 33542/35590/32369 33538/35591/32370
+f 33538/35591/32370 33542/35590/32369 37477/35592/32371 37478/35593/32372
+f 33537/35587/32366 39065/35589/32368 39066/35594/32373 33542/35590/32369
+f 33542/35590/32369 39066/35594/32373 40408/35595/32374 37477/35592/32371
+f 33535/35582/32361 33538/35591/32370 33543/35596/32375 33539/35583/32362
+f 33539/35583/32362 33543/35596/32375 39063/35578/32357 39062/35573/32352
+f 33538/35591/32370 37478/35593/32372 37479/35597/32376 33543/35596/32375
+f 33543/35596/32375 37479/35597/32376 40407/35579/32358 39063/35578/32357
+f 33544/35598/32377 33548/35599/32378 33549/35600/32379 33545/35601/32380
+f 33545/35601/32380 33549/35600/32379 37410/35225/32008 37409/35221/32004
+f 33548/35599/32378 39065/35589/32368 39064/35588/32367 33549/35600/32379
+f 33549/35600/32379 39064/35588/32367 40384/35207/31990 37410/35225/32008
+f 33544/35598/32377 33545/35601/32380 33550/35602/32381 33546/35603/32382
+f 33546/35603/32382 33550/35602/32381 39067/35604/32383 39068/35605/32384
+f 33545/35601/32380 37409/35221/32004 37408/35220/32003 33550/35602/32381
+f 33550/35602/32381 37408/35220/32003 40385/35223/32006 39067/35604/32383
+f 33544/35598/32377 33546/35603/32382 33551/35606/32385 33547/35607/32386
+f 33547/35607/32386 33551/35606/32385 37480/35608/32387 37481/35609/32388
+f 33546/35603/32382 39068/35605/32384 39069/35610/32389 33551/35606/32385
+f 33551/35606/32385 39069/35610/32389 40409/35611/32390 37480/35608/32387
+f 33544/35598/32377 33547/35607/32386 33552/35612/32391 33548/35599/32378
+f 33548/35599/32378 33552/35612/32391 39066/35594/32373 39065/35589/32368
+f 33547/35607/32386 37481/35609/32388 37482/35613/32392 33552/35612/32391
+f 33552/35612/32391 37482/35613/32392 40408/35595/32374 39066/35594/32373
+f 33553/35614/32393 33557/35615/32394 33558/35616/32395 33554/35617/32396
+f 33554/35617/32396 33558/35616/32395 37413/35241/32024 37412/35237/32020
+f 33557/35615/32394 39068/35605/32384 39067/35604/32383 33558/35616/32395
+f 33558/35616/32395 39067/35604/32383 40385/35223/32006 37413/35241/32024
+f 33553/35614/32393 33554/35617/32396 33559/35618/32397 33555/35619/32398
+f 33555/35619/32398 33559/35618/32397 39070/35620/32399 39071/35621/32400
+f 33554/35617/32396 37412/35237/32020 37411/35236/32019 33559/35618/32397
+f 33559/35618/32397 37411/35236/32019 40386/35239/32022 39070/35620/32399
+f 33553/35614/32393 33555/35619/32398 33560/35622/32401 33556/35623/32402
+f 33556/35623/32402 33560/35622/32401 37483/35624/32403 37484/35625/32404
+f 33555/35619/32398 39071/35621/32400 39072/35626/32405 33560/35622/32401
+f 33560/35622/32401 39072/35626/32405 40410/35627/32406 37483/35624/32403
+f 33553/35614/32393 33556/35623/32402 33561/35628/32407 33557/35615/32394
+f 33557/35615/32394 33561/35628/32407 39069/35610/32389 39068/35605/32384
+f 33556/35623/32402 37484/35625/32404 37485/35629/32408 33561/35628/32407
+f 33561/35628/32407 37485/35629/32408 40409/35611/32390 39069/35610/32389
+f 33562/35630/32409 33566/35631/32410 33567/35632/32411 33563/35633/32412
+f 33563/35633/32412 33567/35632/32411 37416/35257/32040 37415/35253/32036
+f 33566/35631/32410 39071/35621/32400 39070/35620/32399 33567/35632/32411
+f 33567/35632/32411 39070/35620/32399 40386/35239/32022 37416/35257/32040
+f 33562/35630/32409 33563/35633/32412 33568/35634/32413 33564/35635/32414
+f 33564/35635/32414 33568/35634/32413 39073/35636/32415 39074/35637/32416
+f 33563/35633/32412 37415/35253/32036 37414/35252/32035 33568/35634/32413
+f 33568/35634/32413 37414/35252/32035 40387/35255/32038 39073/35636/32415
+f 33562/35630/32409 33564/35635/32414 33569/35638/32417 33565/35639/32418
+f 33565/35639/32418 33569/35638/32417 37486/35640/32419 37487/35641/32420
+f 33564/35635/32414 39074/35637/32416 39075/35642/32421 33569/35638/32417
+f 33569/35638/32417 39075/35642/32421 40411/35643/32422 37486/35640/32419
+f 33562/35630/32409 33565/35639/32418 33570/35644/32423 33566/35631/32410
+f 33566/35631/32410 33570/35644/32423 39072/35626/32405 39071/35621/32400
+f 33565/35639/32418 37487/35641/32420 37488/35645/32424 33570/35644/32423
+f 33570/35644/32423 37488/35645/32424 40410/35627/32406 39072/35626/32405
+f 33571/35646/32425 33575/35647/32426 33576/35648/32427 33572/35649/32428
+f 33572/35649/32428 33576/35648/32427 37419/35273/32056 37418/35269/32052
+f 33575/35647/32426 39074/35637/32416 39073/35636/32415 33576/35648/32427
+f 33576/35648/32427 39073/35636/32415 40387/35255/32038 37419/35273/32056
+f 33571/35646/32425 33572/35649/32428 33577/35650/32429 33573/35651/32430
+f 33573/35651/32430 33577/35650/32429 39076/35652/32431 39077/35653/32432
+f 33572/35649/32428 37418/35269/32052 37417/35268/32051 33577/35650/32429
+f 33577/35650/32429 37417/35268/32051 40388/35271/32054 39076/35652/32431
+f 33571/35646/32425 33573/35651/32430 33578/35654/32433 33574/35655/32434
+f 33574/35655/32434 33578/35654/32433 37489/35656/32435 37490/35657/32436
+f 33573/35651/32430 39077/35653/32432 39078/35658/32437 33578/35654/32433
+f 33578/35654/32433 39078/35658/32437 40412/35659/32438 37489/35656/32435
+f 33571/35646/32425 33574/35655/32434 33579/35660/32439 33575/35647/32426
+f 33575/35647/32426 33579/35660/32439 39075/35642/32421 39074/35637/32416
+f 33574/35655/32434 37490/35657/32436 37491/35661/32440 33579/35660/32439
+f 33579/35660/32439 37491/35661/32440 40411/35643/32422 39075/35642/32421
+f 33580/35662/32441 33584/35663/32442 33585/35664/32443 33581/35665/32444
+f 33581/35665/32444 33585/35664/32443 37422/35289/32072 37421/35285/32068
+f 33584/35663/32442 39077/35653/32432 39076/35652/32431 33585/35664/32443
+f 33585/35664/32443 39076/35652/32431 40388/35271/32054 37422/35289/32072
+f 33580/35662/32441 33581/35665/32444 33586/35666/32445 33582/35667/32446
+f 33582/35667/32446 33586/35666/32445 39079/35668/32447 39080/35669/32448
+f 33581/35665/32444 37421/35285/32068 37420/35284/32067 33586/35666/32445
+f 33586/35666/32445 37420/35284/32067 40389/35287/32070 39079/35668/32447
+f 33580/35662/32441 33582/35667/32446 33587/35670/32449 33583/35671/32450
+f 33583/35671/32450 33587/35670/32449 37492/35672/32451 37493/35673/32452
+f 33582/35667/32446 39080/35669/32448 39081/35674/32453 33587/35670/32449
+f 33587/35670/32449 39081/35674/32453 40413/35675/32454 37492/35672/32451
+f 33580/35662/32441 33583/35671/32450 33588/35676/32455 33584/35663/32442
+f 33584/35663/32442 33588/35676/32455 39078/35658/32437 39077/35653/32432
+f 33583/35671/32450 37493/35673/32452 37494/35677/32456 33588/35676/32455
+f 33588/35676/32455 37494/35677/32456 40412/35659/32438 39078/35658/32437
+f 33589/35678/32457 33593/35679/32458 33594/35680/32459 33590/35681/32460
+f 33590/35681/32460 33594/35680/32459 37425/35305/32088 37424/35301/32084
+f 33593/35679/32458 39080/35669/32448 39079/35668/32447 33594/35680/32459
+f 33594/35680/32459 39079/35668/32447 40389/35287/32070 37425/35305/32088
+f 33589/35678/32457 33590/35681/32460 33595/35682/32461 33591/35683/32462
+f 33591/35683/32462 33595/35682/32461 39082/35684/32463 39083/35685/32464
+f 33590/35681/32460 37424/35301/32084 37423/35300/32083 33595/35682/32461
+f 33595/35682/32461 37423/35300/32083 40390/35303/32086 39082/35684/32463
+f 33589/35678/32457 33591/35683/32462 33596/35686/32465 33592/35687/32466
+f 33592/35687/32466 33596/35686/32465 37495/35688/32467 37496/35689/32468
+f 33591/35683/32462 39083/35685/32464 39084/35690/32469 33596/35686/32465
+f 33596/35686/32465 39084/35690/32469 40414/35691/32470 37495/35688/32467
+f 33589/35678/32457 33592/35687/32466 33597/35692/32471 33593/35679/32458
+f 33593/35679/32458 33597/35692/32471 39081/35674/32453 39080/35669/32448
+f 33592/35687/32466 37496/35689/32468 37497/35693/32472 33597/35692/32471
+f 33597/35692/32471 37497/35693/32472 40413/35675/32454 39081/35674/32453
+f 33598/35694/32473 33602/35695/32474 33603/35696/32475 33599/35697/32476
+f 33599/35697/32476 33603/35696/32475 37428/35321/32104 37427/35317/32100
+f 33602/35695/32474 39083/35685/32464 39082/35684/32463 33603/35696/32475
+f 33603/35696/32475 39082/35684/32463 40390/35303/32086 37428/35321/32104
+f 33598/35694/32473 33599/35697/32476 33604/35698/32477 33600/35699/32478
+f 33600/35699/32478 33604/35698/32477 39085/35700/32479 39086/35701/32480
+f 33599/35697/32476 37427/35317/32100 37426/35316/32099 33604/35698/32477
+f 33604/35698/32477 37426/35316/32099 40391/35319/32102 39085/35700/32479
+f 33598/35694/32473 33600/35699/32478 33605/35702/32481 33601/35703/32482
+f 33601/35703/32482 33605/35702/32481 37498/35704/32483 37499/35705/32484
+f 33600/35699/32478 39086/35701/32480 39087/35706/32485 33605/35702/32481
+f 33605/35702/32481 39087/35706/32485 40415/35707/32486 37498/35704/32483
+f 33598/35694/32473 33601/35703/32482 33606/35708/32487 33602/35695/32474
+f 33602/35695/32474 33606/35708/32487 39084/35690/32469 39083/35685/32464
+f 33601/35703/32482 37499/35705/32484 37500/35709/32488 33606/35708/32487
+f 33606/35708/32487 37500/35709/32488 40414/35691/32470 39084/35690/32469
+f 33607/35710/32489 33611/35711/32490 33612/35712/32491 33608/35713/32492
+f 33608/35713/32492 33612/35712/32491 37431/35337/32120 37430/35333/32116
+f 33611/35711/32490 39086/35701/32480 39085/35700/32479 33612/35712/32491
+f 33612/35712/32491 39085/35700/32479 40391/35319/32102 37431/35337/32120
+f 33607/35710/32489 33608/35713/32492 33613/35714/32493 33609/35715/32494
+f 33609/35715/32494 33613/35714/32493 39088/35716/32495 39089/35717/32496
+f 33608/35713/32492 37430/35333/32116 37429/35332/32115 33613/35714/32493
+f 33613/35714/32493 37429/35332/32115 40392/35335/32118 39088/35716/32495
+f 33607/35710/32489 33609/35715/32494 33614/35718/32497 33610/35719/32498
+f 33610/35719/32498 33614/35718/32497 37501/35720/32499 37502/35721/32500
+f 33609/35715/32494 39089/35717/32496 39090/35722/32501 33614/35718/32497
+f 33614/35718/32497 39090/35722/32501 40416/35723/32502 37501/35720/32499
+f 33607/35710/32489 33610/35719/32498 33615/35724/32503 33611/35711/32490
+f 33611/35711/32490 33615/35724/32503 39087/35706/32485 39086/35701/32480
+f 33610/35719/32498 37502/35721/32500 37503/35725/32504 33615/35724/32503
+f 33615/35724/32503 37503/35725/32504 40415/35707/32486 39087/35706/32485
+f 33616/35726/32505 33620/35727/32506 33621/35728/32507 33617/35729/32508
+f 33617/35729/32508 33621/35728/32507 37434/35353/32136 37433/35349/32132
+f 33620/35727/32506 39089/35717/32496 39088/35716/32495 33621/35728/32507
+f 33621/35728/32507 39088/35716/32495 40392/35335/32118 37434/35353/32136
+f 33616/35726/32505 33617/35729/32508 33622/35730/32509 33618/35731/32510
+f 33618/35731/32510 33622/35730/32509 39091/35732/32511 39092/35733/32512
+f 33617/35729/32508 37433/35349/32132 37432/35348/32131 33622/35730/32509
+f 33622/35730/32509 37432/35348/32131 40393/35351/32134 39091/35732/32511
+f 33616/35726/32505 33618/35731/32510 33623/35734/32513 33619/35735/32514
+f 33619/35735/32514 33623/35734/32513 37504/35736/32515 37505/35737/32516
+f 33618/35731/32510 39092/35733/32512 39093/35738/32517 33623/35734/32513
+f 33623/35734/32513 39093/35738/32517 40417/35739/32518 37504/35736/32515
+f 33616/35726/32505 33619/35735/32514 33624/35740/32519 33620/35727/32506
+f 33620/35727/32506 33624/35740/32519 39090/35722/32501 39089/35717/32496
+f 33619/35735/32514 37505/35737/32516 37506/35741/32520 33624/35740/32519
+f 33624/35740/32519 37506/35741/32520 40416/35723/32502 39090/35722/32501
+f 33625/35742/32521 33629/35743/32522 33630/35744/32523 33626/35745/32524
+f 33626/35745/32524 33630/35744/32523 37437/35369/32152 37436/35365/32148
+f 33629/35743/32522 39092/35733/32512 39091/35732/32511 33630/35744/32523
+f 33630/35744/32523 39091/35732/32511 40393/35351/32134 37437/35369/32152
+f 33625/35742/32521 33626/35745/32524 33631/35746/32525 33627/35747/32526
+f 33627/35747/32526 33631/35746/32525 39094/35748/32527 39095/35749/32528
+f 33626/35745/32524 37436/35365/32148 37435/35364/32147 33631/35746/32525
+f 33631/35746/32525 37435/35364/32147 40394/35367/32150 39094/35748/32527
+f 33625/35742/32521 33627/35747/32526 33632/35750/32529 33628/35751/32530
+f 33628/35751/32530 33632/35750/32529 37507/35752/32531 37508/35753/32532
+f 33627/35747/32526 39095/35749/32528 39096/35754/32533 33632/35750/32529
+f 33632/35750/32529 39096/35754/32533 40418/35755/32534 37507/35752/32531
+f 33625/35742/32521 33628/35751/32530 33633/35756/32535 33629/35743/32522
+f 33629/35743/32522 33633/35756/32535 39093/35738/32517 39092/35733/32512
+f 33628/35751/32530 37508/35753/32532 37509/35757/32536 33633/35756/32535
+f 33633/35756/32535 37509/35757/32536 40417/35739/32518 39093/35738/32517
+f 33634/35758/32537 33638/35759/32538 33639/35760/32539 33635/35761/32540
+f 33635/35761/32540 33639/35760/32539 37440/35385/32168 37439/35381/32164
+f 33638/35759/32538 39095/35749/32528 39094/35748/32527 33639/35760/32539
+f 33639/35760/32539 39094/35748/32527 40394/35367/32150 37440/35385/32168
+f 33634/35758/32537 33635/35761/32540 33640/35762/32541 33636/35763/32542
+f 33636/35763/32542 33640/35762/32541 39097/35764/32543 39098/35765/32544
+f 33635/35761/32540 37439/35381/32164 37438/35380/32163 33640/35762/32541
+f 33640/35762/32541 37438/35380/32163 40395/35383/32166 39097/35764/32543
+f 33634/35758/32537 33636/35763/32542 33641/35766/32545 33637/35767/32546
+f 33637/35767/32546 33641/35766/32545 37510/35768/32547 37511/35769/32548
+f 33636/35763/32542 39098/35765/32544 39099/35770/32549 33641/35766/32545
+f 33641/35766/32545 39099/35770/32549 40419/35771/32550 37510/35768/32547
+f 33634/35758/32537 33637/35767/32546 33642/35772/32551 33638/35759/32538
+f 33638/35759/32538 33642/35772/32551 39096/35754/32533 39095/35749/32528
+f 33637/35767/32546 37511/35769/32548 37512/35773/32552 33642/35772/32551
+f 33642/35772/32551 37512/35773/32552 40418/35755/32534 39096/35754/32533
+f 33643/35774/32553 33647/35775/32554 33648/35776/32555 33644/35777/32556
+f 33644/35777/32556 33648/35776/32555 37443/35401/32180 37442/35397/32178
+f 33647/35775/32554 39098/35765/32544 39097/35764/32543 33648/35776/32555
+f 33648/35776/32555 39097/35764/32543 40395/35383/32166 37443/35401/32180
+f 33643/35774/32553 33644/35777/32556 33649/35778/32557 33645/35779/32558
+f 33645/35779/32558 33649/35778/32557 39030/35780/32186 39029/35781/32185
+f 33644/35777/32556 37442/35397/32178 37441/35396/32177 33649/35778/32557
+f 33649/35778/32557 37441/35396/32177 40372/35399/31816 39030/35780/32186
+f 33643/35774/32553 33645/35779/32558 33650/35782/32559 33646/35783/32560
+f 33646/35783/32560 33650/35782/32559 37513/35784/32561 37514/35785/32562
+f 33645/35779/32558 39029/35781/32185 39028/35786/32198 33650/35782/32559
+f 33650/35782/32559 39028/35786/32198 40396/35787/32200 37513/35784/32561
+f 33643/35774/32553 33646/35783/32560 33651/35788/32563 33647/35775/32554
+f 33647/35775/32554 33651/35788/32563 39099/35770/32549 39098/35765/32544
+f 33646/35783/32560 37514/35785/32562 37515/35789/32564 33651/35788/32563
+f 33651/35788/32563 37515/35789/32564 40419/35771/32550 39099/35770/32549
+f 33652/35790/32565 33656/35791/32566 33657/35792/32567 33653/35793/32568
+f 33653/35793/32568 33657/35792/32567 37446/35420/32199 37445/35415/32194
+f 33656/35791/32566 39101/35794/32569 39102/35795/32570 33657/35792/32567
+f 33657/35792/32567 39102/35795/32570 40396/35421/32200 37446/35420/32199
+f 33652/35790/32565 33653/35793/32568 33658/35796/32571 33654/35797/32572
+f 33654/35797/32572 33658/35796/32571 39103/35798/32573 39104/35799/32574
+f 33653/35793/32568 37445/35415/32194 37444/35414/32193 33658/35796/32571
+f 33658/35796/32571 37444/35414/32193 40397/35417/32196 39103/35798/32573
+f 33652/35790/32565 33654/35797/32572 33659/35800/32575 33655/35801/32576
+f 33655/35801/32576 33659/35800/32575 37516/35802/32577 37517/35803/32578
+f 33654/35797/32572 39104/35799/32574 39105/35804/32579 33659/35800/32575
+f 33659/35800/32575 39105/35804/32579 40421/35805/32580 37516/35802/32577
+f 33652/35790/32565 33655/35801/32576 33660/35806/32581 33656/35791/32566
+f 33656/35791/32566 33660/35806/32581 39100/35807/32582 39101/35794/32569
+f 33655/35801/32576 37517/35803/32578 37518/35808/32583 33660/35806/32581
+f 33660/35806/32581 37518/35808/32583 40420/35809/32584 39100/35807/32582
+f 33661/35810/32585 33665/35811/32586 33666/35812/32587 33662/35813/32588
+f 33662/35813/32588 33666/35812/32587 37449/35437/32216 37448/35433/32212
+f 33665/35811/32586 39104/35799/32574 39103/35798/32573 33666/35812/32587
+f 33666/35812/32587 39103/35798/32573 40397/35417/32196 37449/35437/32216
+f 33661/35810/32585 33662/35813/32588 33667/35814/32589 33663/35815/32590
+f 33663/35815/32590 33667/35814/32589 39106/35816/32591 39107/35817/32592
+f 33662/35813/32588 37448/35433/32212 37447/35432/32211 33667/35814/32589
+f 33667/35814/32589 37447/35432/32211 40398/35435/32214 39106/35816/32591
+f 33661/35810/32585 33663/35815/32590 33668/35818/32593 33664/35819/32594
+f 33664/35819/32594 33668/35818/32593 37519/35820/32595 37520/35821/32596
+f 33663/35815/32590 39107/35817/32592 39108/35822/32597 33668/35818/32593
+f 33668/35818/32593 39108/35822/32597 40422/35823/32598 37519/35820/32595
+f 33661/35810/32585 33664/35819/32594 33669/35824/32599 33665/35811/32586
+f 33665/35811/32586 33669/35824/32599 39105/35804/32579 39104/35799/32574
+f 33664/35819/32594 37520/35821/32596 37521/35825/32600 33669/35824/32599
+f 33669/35824/32599 37521/35825/32600 40421/35805/32580 39105/35804/32579
+f 33670/35826/32601 33674/35827/32602 33675/35828/32603 33671/35829/32604
+f 33671/35829/32604 33675/35828/32603 37452/35453/32232 37451/35449/32228
+f 33674/35827/32602 39107/35817/32592 39106/35816/32591 33675/35828/32603
+f 33675/35828/32603 39106/35816/32591 40398/35435/32214 37452/35453/32232
+f 33670/35826/32601 33671/35829/32604 33676/35830/32605 33672/35831/32606
+f 33672/35831/32606 33676/35830/32605 39109/35832/32607 39110/35833/32608
+f 33671/35829/32604 37451/35449/32228 37450/35448/32227 33676/35830/32605
+f 33676/35830/32605 37450/35448/32227 40399/35451/32230 39109/35832/32607
+f 33670/35826/32601 33672/35831/32606 33677/35834/32609 33673/35835/32610
+f 33673/35835/32610 33677/35834/32609 37522/35836/32611 37523/35837/32612
+f 33672/35831/32606 39110/35833/32608 39111/35838/32613 33677/35834/32609
+f 33677/35834/32609 39111/35838/32613 40423/35839/32614 37522/35836/32611
+f 33670/35826/32601 33673/35835/32610 33678/35840/32615 33674/35827/32602
+f 33674/35827/32602 33678/35840/32615 39108/35822/32597 39107/35817/32592
+f 33673/35835/32610 37523/35837/32612 37524/35841/32616 33678/35840/32615
+f 33678/35840/32615 37524/35841/32616 40422/35823/32598 39108/35822/32597
+f 33679/35842/32617 33683/35843/32618 33684/35844/32619 33680/35845/32620
+f 33680/35845/32620 33684/35844/32619 37455/35469/32248 37454/35465/32244
+f 33683/35843/32618 39110/35833/32608 39109/35832/32607 33684/35844/32619
+f 33684/35844/32619 39109/35832/32607 40399/35451/32230 37455/35469/32248
+f 33679/35842/32617 33680/35845/32620 33685/35846/32621 33681/35847/32622
+f 33681/35847/32622 33685/35846/32621 39112/35848/32623 39113/35849/32624
+f 33680/35845/32620 37454/35465/32244 37453/35464/32243 33685/35846/32621
+f 33685/35846/32621 37453/35464/32243 40400/35467/32246 39112/35848/32623
+f 33679/35842/32617 33681/35847/32622 33686/35850/32625 33682/35851/32626
+f 33682/35851/32626 33686/35850/32625 37525/35852/32627 37526/35853/32628
+f 33681/35847/32622 39113/35849/32624 39114/35854/32629 33686/35850/32625
+f 33686/35850/32625 39114/35854/32629 40424/35855/32630 37525/35852/32627
+f 33679/35842/32617 33682/35851/32626 33687/35856/32631 33683/35843/32618
+f 33683/35843/32618 33687/35856/32631 39111/35838/32613 39110/35833/32608
+f 33682/35851/32626 37526/35853/32628 37527/35857/32632 33687/35856/32631
+f 33687/35856/32631 37527/35857/32632 40423/35839/32614 39111/35838/32613
+f 33688/35858/32633 33692/35859/32634 33693/35860/32635 33689/35861/32636
+f 33689/35861/32636 33693/35860/32635 37458/35485/32264 37457/35481/32260
+f 33692/35859/32634 39113/35849/32624 39112/35848/32623 33693/35860/32635
+f 33693/35860/32635 39112/35848/32623 40400/35467/32246 37458/35485/32264
+f 33688/35858/32633 33689/35861/32636 33694/35862/32637 33690/35863/32638
+f 33690/35863/32638 33694/35862/32637 39115/35864/32639 39116/35865/32640
+f 33689/35861/32636 37457/35481/32260 37456/35480/32259 33694/35862/32637
+f 33694/35862/32637 37456/35480/32259 40401/35483/32262 39115/35864/32639
+f 33688/35858/32633 33690/35863/32638 33695/35866/32641 33691/35867/32642
+f 33691/35867/32642 33695/35866/32641 37528/35868/32643 37529/35869/32644
+f 33690/35863/32638 39116/35865/32640 39117/35870/32645 33695/35866/32641
+f 33695/35866/32641 39117/35870/32645 40425/35871/32646 37528/35868/32643
+f 33688/35858/32633 33691/35867/32642 33696/35872/32647 33692/35859/32634
+f 33692/35859/32634 33696/35872/32647 39114/35854/32629 39113/35849/32624
+f 33691/35867/32642 37529/35869/32644 37530/35873/32648 33696/35872/32647
+f 33696/35872/32647 37530/35873/32648 40424/35855/32630 39114/35854/32629
+f 33697/35874/32649 33701/35875/32650 33702/35876/32651 33698/35877/32652
+f 33698/35877/32652 33702/35876/32651 37461/35501/32280 37460/35497/32276
+f 33701/35875/32650 39116/35865/32640 39115/35864/32639 33702/35876/32651
+f 33702/35876/32651 39115/35864/32639 40401/35483/32262 37461/35501/32280
+f 33697/35874/32649 33698/35877/32652 33703/35878/32653 33699/35879/32654
+f 33699/35879/32654 33703/35878/32653 39118/35880/32655 39119/35881/32656
+f 33698/35877/32652 37460/35497/32276 37459/35496/32275 33703/35878/32653
+f 33703/35878/32653 37459/35496/32275 40402/35499/32278 39118/35880/32655
+f 33697/35874/32649 33699/35879/32654 33704/35882/32657 33700/35883/32658
+f 33700/35883/32658 33704/35882/32657 37531/35884/32659 37532/35885/32660
+f 33699/35879/32654 39119/35881/32656 39120/35886/32661 33704/35882/32657
+f 33704/35882/32657 39120/35886/32661 40426/35887/32662 37531/35884/32659
+f 33697/35874/32649 33700/35883/32658 33705/35888/32663 33701/35875/32650
+f 33701/35875/32650 33705/35888/32663 39117/35870/32645 39116/35865/32640
+f 33700/35883/32658 37532/35885/32660 37533/35889/32664 33705/35888/32663
+f 33705/35888/32663 37533/35889/32664 40425/35871/32646 39117/35870/32645
+f 33706/35890/32665 33710/35891/32666 33711/35892/32667 33707/35893/32668
+f 33707/35893/32668 33711/35892/32667 37464/35517/32296 37463/35513/32292
+f 33710/35891/32666 39119/35881/32656 39118/35880/32655 33711/35892/32667
+f 33711/35892/32667 39118/35880/32655 40402/35499/32278 37464/35517/32296
+f 33706/35890/32665 33707/35893/32668 33712/35894/32669 33708/35895/32670
+f 33708/35895/32670 33712/35894/32669 39121/35896/32671 39122/35897/32672
+f 33707/35893/32668 37463/35513/32292 37462/35512/32291 33712/35894/32669
+f 33712/35894/32669 37462/35512/32291 40403/35515/32294 39121/35896/32671
+f 33706/35890/32665 33708/35895/32670 33713/35898/32673 33709/35899/32674
+f 33709/35899/32674 33713/35898/32673 37534/35900/32675 37535/35901/32676
+f 33708/35895/32670 39122/35897/32672 39123/35902/32677 33713/35898/32673
+f 33713/35898/32673 39123/35902/32677 40427/35903/32678 37534/35900/32675
+f 33706/35890/32665 33709/35899/32674 33714/35904/32679 33710/35891/32666
+f 33710/35891/32666 33714/35904/32679 39120/35886/32661 39119/35881/32656
+f 33709/35899/32674 37535/35901/32676 37536/35905/32680 33714/35904/32679
+f 33714/35904/32679 37536/35905/32680 40426/35887/32662 39120/35886/32661
+f 33715/35906/32681 33719/35907/32682 33720/35908/32683 33716/35909/32684
+f 33716/35909/32684 33720/35908/32683 37467/35533/32312 37466/35529/32308
+f 33719/35907/32682 39122/35897/32672 39121/35896/32671 33720/35908/32683
+f 33720/35908/32683 39121/35896/32671 40403/35515/32294 37467/35533/32312
+f 33715/35906/32681 33716/35909/32684 33721/35910/32685 33717/35911/32686
+f 33717/35911/32686 33721/35910/32685 39124/35912/32687 39125/35913/32688
+f 33716/35909/32684 37466/35529/32308 37465/35528/32307 33721/35910/32685
+f 33721/35910/32685 37465/35528/32307 40404/35531/32310 39124/35912/32687
+f 33715/35906/32681 33717/35911/32686 33722/35914/32689 33718/35915/32690
+f 33718/35915/32690 33722/35914/32689 37537/35916/32691 37538/35917/32692
+f 33717/35911/32686 39125/35913/32688 39126/35918/32693 33722/35914/32689
+f 33722/35914/32689 39126/35918/32693 40428/35919/32694 37537/35916/32691
+f 33715/35906/32681 33718/35915/32690 33723/35920/32695 33719/35907/32682
+f 33719/35907/32682 33723/35920/32695 39123/35902/32677 39122/35897/32672
+f 33718/35915/32690 37538/35917/32692 37539/35921/32696 33723/35920/32695
+f 33723/35920/32695 37539/35921/32696 40427/35903/32678 39123/35902/32677
+f 33724/35922/32697 33728/35923/32698 33729/35924/32699 33725/35925/32700
+f 33725/35925/32700 33729/35924/32699 37470/35549/32328 37469/35545/32324
+f 33728/35923/32698 39125/35913/32688 39124/35912/32687 33729/35924/32699
+f 33729/35924/32699 39124/35912/32687 40404/35531/32310 37470/35549/32328
+f 33724/35922/32697 33725/35925/32700 33730/35926/32701 33726/35927/32702
+f 33726/35927/32702 33730/35926/32701 39127/35928/32703 39128/35929/32704
+f 33725/35925/32700 37469/35545/32324 37468/35544/32323 33730/35926/32701
+f 33730/35926/32701 37468/35544/32323 40405/35547/32326 39127/35928/32703
+f 33724/35922/32697 33726/35927/32702 33731/35930/32705 33727/35931/32706
+f 33727/35931/32706 33731/35930/32705 37540/35932/32707 37541/35933/32708
+f 33726/35927/32702 39128/35929/32704 39129/35934/32709 33731/35930/32705
+f 33731/35930/32705 39129/35934/32709 40429/35935/32710 37540/35932/32707
+f 33724/35922/32697 33727/35931/32706 33732/35936/32711 33728/35923/32698
+f 33728/35923/32698 33732/35936/32711 39126/35918/32693 39125/35913/32688
+f 33727/35931/32706 37541/35933/32708 37542/35937/32712 33732/35936/32711
+f 33732/35936/32711 37542/35937/32712 40428/35919/32694 39126/35918/32693
+f 33733/35938/32713 33737/35939/32714 33738/35940/32715 33734/35941/32716
+f 33734/35941/32716 33738/35940/32715 37473/35565/32344 37472/35561/32340
+f 33737/35939/32714 39128/35929/32704 39127/35928/32703 33738/35940/32715
+f 33738/35940/32715 39127/35928/32703 40405/35547/32326 37473/35565/32344
+f 33733/35938/32713 33734/35941/32716 33739/35942/32717 33735/35943/32718
+f 33735/35943/32718 33739/35942/32717 39130/35944/32719 39131/35945/32720
+f 33734/35941/32716 37472/35561/32340 37471/35560/32339 33739/35942/32717
+f 33739/35942/32717 37471/35560/32339 40406/35563/32342 39130/35944/32719
+f 33733/35938/32713 33735/35943/32718 33740/35946/32721 33736/35947/32722
+f 33736/35947/32722 33740/35946/32721 37543/35948/32723 37544/35949/32724
+f 33735/35943/32718 39131/35945/32720 39132/35950/32725 33740/35946/32721
+f 33740/35946/32721 39132/35950/32725 40430/35951/32726 37543/35948/32723
+f 33733/35938/32713 33736/35947/32722 33741/35952/32727 33737/35939/32714
+f 33737/35939/32714 33741/35952/32727 39129/35934/32709 39128/35929/32704
+f 33736/35947/32722 37544/35949/32724 37545/35953/32728 33741/35952/32727
+f 33741/35952/32727 37545/35953/32728 40429/35935/32710 39129/35934/32709
+f 33742/35954/32729 33746/35955/32730 33747/35956/32731 33743/35957/32732
+f 33743/35957/32732 33747/35956/32731 37476/35581/32360 37475/35577/32356
+f 33746/35955/32730 39131/35945/32720 39130/35944/32719 33747/35956/32731
+f 33747/35956/32731 39130/35944/32719 40406/35563/32342 37476/35581/32360
+f 33742/35954/32729 33743/35957/32732 33748/35958/32733 33744/35959/32734
+f 33744/35959/32734 33748/35958/32733 39133/35960/32735 39134/35961/32736
+f 33743/35957/32732 37475/35577/32356 37474/35576/32355 33748/35958/32733
+f 33748/35958/32733 37474/35576/32355 40407/35579/32358 39133/35960/32735
+f 33742/35954/32729 33744/35959/32734 33749/35962/32737 33745/35963/32738
+f 33745/35963/32738 33749/35962/32737 37546/35964/32739 37547/35965/32740
+f 33744/35959/32734 39134/35961/32736 39135/35966/32741 33749/35962/32737
+f 33749/35962/32737 39135/35966/32741 40431/35967/32742 37546/35964/32739
+f 33742/35954/32729 33745/35963/32738 33750/35968/32743 33746/35955/32730
+f 33746/35955/32730 33750/35968/32743 39132/35950/32725 39131/35945/32720
+f 33745/35963/32738 37547/35965/32740 37548/35969/32744 33750/35968/32743
+f 33750/35968/32743 37548/35969/32744 40430/35951/32726 39132/35950/32725
+f 33751/35970/32745 33755/35971/32746 33756/35972/32747 33752/35973/32748
+f 33752/35973/32748 33756/35972/32747 37479/35597/32376 37478/35593/32372
+f 33755/35971/32746 39134/35961/32736 39133/35960/32735 33756/35972/32747
+f 33756/35972/32747 39133/35960/32735 40407/35579/32358 37479/35597/32376
+f 33751/35970/32745 33752/35973/32748 33757/35974/32749 33753/35975/32750
+f 33753/35975/32750 33757/35974/32749 39136/35976/32751 39137/35977/32752
+f 33752/35973/32748 37478/35593/32372 37477/35592/32371 33757/35974/32749
+f 33757/35974/32749 37477/35592/32371 40408/35595/32374 39136/35976/32751
+f 33751/35970/32745 33753/35975/32750 33758/35978/32753 33754/35979/32754
+f 33754/35979/32754 33758/35978/32753 37549/35980/32755 37550/35981/32756
+f 33753/35975/32750 39137/35977/32752 39138/35982/32757 33758/35978/32753
+f 33758/35978/32753 39138/35982/32757 40432/35983/32758 37549/35980/32755
+f 33751/35970/32745 33754/35979/32754 33759/35984/32759 33755/35971/32746
+f 33755/35971/32746 33759/35984/32759 39135/35966/32741 39134/35961/32736
+f 33754/35979/32754 37550/35981/32756 37551/35985/32760 33759/35984/32759
+f 33759/35984/32759 37551/35985/32760 40431/35967/32742 39135/35966/32741
+f 33760/35986/32761 33764/35987/32762 33765/35988/32763 33761/35989/32764
+f 33761/35989/32764 33765/35988/32763 37482/35613/32392 37481/35609/32388
+f 33764/35987/32762 39137/35977/32752 39136/35976/32751 33765/35988/32763
+f 33765/35988/32763 39136/35976/32751 40408/35595/32374 37482/35613/32392
+f 33760/35986/32761 33761/35989/32764 33766/35990/32765 33762/35991/32766
+f 33762/35991/32766 33766/35990/32765 39139/35992/32767 39140/35993/32768
+f 33761/35989/32764 37481/35609/32388 37480/35608/32387 33766/35990/32765
+f 33766/35990/32765 37480/35608/32387 40409/35611/32390 39139/35992/32767
+f 33760/35986/32761 33762/35991/32766 33767/35994/32769 33763/35995/32770
+f 33763/35995/32770 33767/35994/32769 37552/35996/32771 37553/35997/32772
+f 33762/35991/32766 39140/35993/32768 39141/35998/32773 33767/35994/32769
+f 33767/35994/32769 39141/35998/32773 40433/35999/32774 37552/35996/32771
+f 33760/35986/32761 33763/35995/32770 33768/36000/32775 33764/35987/32762
+f 33764/35987/32762 33768/36000/32775 39138/35982/32757 39137/35977/32752
+f 33763/35995/32770 37553/35997/32772 37554/36001/32776 33768/36000/32775
+f 33768/36000/32775 37554/36001/32776 40432/35983/32758 39138/35982/32757
+f 33769/36002/32777 33773/36003/32778 33774/36004/32779 33770/36005/32780
+f 33770/36005/32780 33774/36004/32779 37485/35629/32408 37484/35625/32404
+f 33773/36003/32778 39140/35993/32768 39139/35992/32767 33774/36004/32779
+f 33774/36004/32779 39139/35992/32767 40409/35611/32390 37485/35629/32408
+f 33769/36002/32777 33770/36005/32780 33775/36006/32781 33771/36007/32782
+f 33771/36007/32782 33775/36006/32781 39142/36008/32783 39143/36009/32784
+f 33770/36005/32780 37484/35625/32404 37483/35624/32403 33775/36006/32781
+f 33775/36006/32781 37483/35624/32403 40410/35627/32406 39142/36008/32783
+f 33769/36002/32777 33771/36007/32782 33776/36010/32785 33772/36011/32786
+f 33772/36011/32786 33776/36010/32785 37555/36012/32787 37556/36013/32788
+f 33771/36007/32782 39143/36009/32784 39144/36014/32789 33776/36010/32785
+f 33776/36010/32785 39144/36014/32789 40434/36015/32790 37555/36012/32787
+f 33769/36002/32777 33772/36011/32786 33777/36016/32791 33773/36003/32778
+f 33773/36003/32778 33777/36016/32791 39141/35998/32773 39140/35993/32768
+f 33772/36011/32786 37556/36013/32788 37557/36017/32792 33777/36016/32791
+f 33777/36016/32791 37557/36017/32792 40433/35999/32774 39141/35998/32773
+f 33778/36018/32793 33782/36019/32794 33783/36020/32795 33779/36021/32796
+f 33779/36021/32796 33783/36020/32795 37488/35645/32424 37487/35641/32420
+f 33782/36019/32794 39143/36009/32784 39142/36008/32783 33783/36020/32795
+f 33783/36020/32795 39142/36008/32783 40410/35627/32406 37488/35645/32424
+f 33778/36018/32793 33779/36021/32796 33784/36022/32797 33780/36023/32798
+f 33780/36023/32798 33784/36022/32797 39145/36024/32799 39146/36025/32800
+f 33779/36021/32796 37487/35641/32420 37486/35640/32419 33784/36022/32797
+f 33784/36022/32797 37486/35640/32419 40411/35643/32422 39145/36024/32799
+f 33778/36018/32793 33780/36023/32798 33785/36026/32801 33781/36027/32802
+f 33781/36027/32802 33785/36026/32801 37558/36028/32803 37559/36029/32804
+f 33780/36023/32798 39146/36025/32800 39147/36030/32805 33785/36026/32801
+f 33785/36026/32801 39147/36030/32805 40435/36031/32806 37558/36028/32803
+f 33778/36018/32793 33781/36027/32802 33786/36032/32807 33782/36019/32794
+f 33782/36019/32794 33786/36032/32807 39144/36014/32789 39143/36009/32784
+f 33781/36027/32802 37559/36029/32804 37560/36033/32808 33786/36032/32807
+f 33786/36032/32807 37560/36033/32808 40434/36015/32790 39144/36014/32789
+f 33787/36034/32809 33791/36035/32810 33792/36036/32811 33788/36037/32812
+f 33788/36037/32812 33792/36036/32811 37491/35661/32440 37490/35657/32436
+f 33791/36035/32810 39146/36025/32800 39145/36024/32799 33792/36036/32811
+f 33792/36036/32811 39145/36024/32799 40411/35643/32422 37491/35661/32440
+f 33787/36034/32809 33788/36037/32812 33793/36038/32813 33789/36039/32814
+f 33789/36039/32814 33793/36038/32813 39148/36040/32815 39149/36041/32816
+f 33788/36037/32812 37490/35657/32436 37489/35656/32435 33793/36038/32813
+f 33793/36038/32813 37489/35656/32435 40412/35659/32438 39148/36040/32815
+f 33787/36034/32809 33789/36039/32814 33794/36042/32817 33790/36043/32818
+f 33790/36043/32818 33794/36042/32817 37561/36044/32819 37562/36045/32820
+f 33789/36039/32814 39149/36041/32816 39150/36046/32821 33794/36042/32817
+f 33794/36042/32817 39150/36046/32821 40436/36047/32822 37561/36044/32819
+f 33787/36034/32809 33790/36043/32818 33795/36048/32823 33791/36035/32810
+f 33791/36035/32810 33795/36048/32823 39147/36030/32805 39146/36025/32800
+f 33790/36043/32818 37562/36045/32820 37563/36049/32824 33795/36048/32823
+f 33795/36048/32823 37563/36049/32824 40435/36031/32806 39147/36030/32805
+f 33796/36050/32825 33800/36051/32826 33801/36052/32827 33797/36053/32828
+f 33797/36053/32828 33801/36052/32827 37494/35677/32456 37493/35673/32452
+f 33800/36051/32826 39149/36041/32816 39148/36040/32815 33801/36052/32827
+f 33801/36052/32827 39148/36040/32815 40412/35659/32438 37494/35677/32456
+f 33796/36050/32825 33797/36053/32828 33802/36054/32829 33798/36055/32830
+f 33798/36055/32830 33802/36054/32829 39151/36056/32831 39152/36057/32832
+f 33797/36053/32828 37493/35673/32452 37492/35672/32451 33802/36054/32829
+f 33802/36054/32829 37492/35672/32451 40413/35675/32454 39151/36056/32831
+f 33796/36050/32825 33798/36055/32830 33803/36058/32833 33799/36059/32834
+f 33799/36059/32834 33803/36058/32833 37564/36060/32835 37565/36061/32836
+f 33798/36055/32830 39152/36057/32832 39153/36062/32837 33803/36058/32833
+f 33803/36058/32833 39153/36062/32837 40437/36063/32838 37564/36060/32835
+f 33796/36050/32825 33799/36059/32834 33804/36064/32839 33800/36051/32826
+f 33800/36051/32826 33804/36064/32839 39150/36046/32821 39149/36041/32816
+f 33799/36059/32834 37565/36061/32836 37566/36065/32840 33804/36064/32839
+f 33804/36064/32839 37566/36065/32840 40436/36047/32822 39150/36046/32821
+f 33805/36066/32841 33809/36067/32842 33810/36068/32843 33806/36069/32844
+f 33806/36069/32844 33810/36068/32843 37497/35693/32472 37496/35689/32468
+f 33809/36067/32842 39152/36057/32832 39151/36056/32831 33810/36068/32843
+f 33810/36068/32843 39151/36056/32831 40413/35675/32454 37497/35693/32472
+f 33805/36066/32841 33806/36069/32844 33811/36070/32845 33807/36071/32846
+f 33807/36071/32846 33811/36070/32845 39154/36072/32847 39155/36073/32848
+f 33806/36069/32844 37496/35689/32468 37495/35688/32467 33811/36070/32845
+f 33811/36070/32845 37495/35688/32467 40414/35691/32470 39154/36072/32847
+f 33805/36066/32841 33807/36071/32846 33812/36074/32849 33808/36075/32850
+f 33808/36075/32850 33812/36074/32849 37567/36076/32851 37568/36077/32852
+f 33807/36071/32846 39155/36073/32848 39156/36078/32853 33812/36074/32849
+f 33812/36074/32849 39156/36078/32853 40438/36079/32854 37567/36076/32851
+f 33805/36066/32841 33808/36075/32850 33813/36080/32855 33809/36067/32842
+f 33809/36067/32842 33813/36080/32855 39153/36062/32837 39152/36057/32832
+f 33808/36075/32850 37568/36077/32852 37569/36081/32856 33813/36080/32855
+f 33813/36080/32855 37569/36081/32856 40437/36063/32838 39153/36062/32837
+f 33814/36082/32857 33818/36083/32858 33819/36084/32859 33815/36085/32860
+f 33815/36085/32860 33819/36084/32859 37500/35709/32488 37499/35705/32484
+f 33818/36083/32858 39155/36073/32848 39154/36072/32847 33819/36084/32859
+f 33819/36084/32859 39154/36072/32847 40414/35691/32470 37500/35709/32488
+f 33814/36082/32857 33815/36085/32860 33820/36086/32861 33816/36087/32862
+f 33816/36087/32862 33820/36086/32861 39157/36088/32863 39158/36089/32864
+f 33815/36085/32860 37499/35705/32484 37498/35704/32483 33820/36086/32861
+f 33820/36086/32861 37498/35704/32483 40415/35707/32486 39157/36088/32863
+f 33814/36082/32857 33816/36087/32862 33821/36090/32865 33817/36091/32866
+f 33817/36091/32866 33821/36090/32865 37570/36092/32867 37571/36093/32868
+f 33816/36087/32862 39158/36089/32864 39159/36094/32869 33821/36090/32865
+f 33821/36090/32865 39159/36094/32869 40439/36095/32870 37570/36092/32867
+f 33814/36082/32857 33817/36091/32866 33822/36096/32871 33818/36083/32858
+f 33818/36083/32858 33822/36096/32871 39156/36078/32853 39155/36073/32848
+f 33817/36091/32866 37571/36093/32868 37572/36097/32872 33822/36096/32871
+f 33822/36096/32871 37572/36097/32872 40438/36079/32854 39156/36078/32853
+f 33823/36098/32873 33827/36099/32874 33828/36100/32875 33824/36101/32876
+f 33824/36101/32876 33828/36100/32875 37503/35725/32504 37502/35721/32500
+f 33827/36099/32874 39158/36089/32864 39157/36088/32863 33828/36100/32875
+f 33828/36100/32875 39157/36088/32863 40415/35707/32486 37503/35725/32504
+f 33823/36098/32873 33824/36101/32876 33829/36102/32877 33825/36103/32878
+f 33825/36103/32878 33829/36102/32877 39160/36104/32879 39161/36105/32880
+f 33824/36101/32876 37502/35721/32500 37501/35720/32499 33829/36102/32877
+f 33829/36102/32877 37501/35720/32499 40416/35723/32502 39160/36104/32879
+f 33823/36098/32873 33825/36103/32878 33830/36106/32881 33826/36107/32882
+f 33826/36107/32882 33830/36106/32881 37573/36108/32883 37574/36109/32884
+f 33825/36103/32878 39161/36105/32880 39162/36110/32885 33830/36106/32881
+f 33830/36106/32881 39162/36110/32885 40440/36111/32886 37573/36108/32883
+f 33823/36098/32873 33826/36107/32882 33831/36112/32887 33827/36099/32874
+f 33827/36099/32874 33831/36112/32887 39159/36094/32869 39158/36089/32864
+f 33826/36107/32882 37574/36109/32884 37575/36113/32888 33831/36112/32887
+f 33831/36112/32887 37575/36113/32888 40439/36095/32870 39159/36094/32869
+f 33832/36114/32889 33836/36115/32890 33837/36116/32891 33833/36117/32892
+f 33833/36117/32892 33837/36116/32891 37506/35741/32520 37505/35737/32516
+f 33836/36115/32890 39161/36105/32880 39160/36104/32879 33837/36116/32891
+f 33837/36116/32891 39160/36104/32879 40416/35723/32502 37506/35741/32520
+f 33832/36114/32889 33833/36117/32892 33838/36118/32893 33834/36119/32894
+f 33834/36119/32894 33838/36118/32893 39163/36120/32895 39164/36121/32896
+f 33833/36117/32892 37505/35737/32516 37504/35736/32515 33838/36118/32893
+f 33838/36118/32893 37504/35736/32515 40417/35739/32518 39163/36120/32895
+f 33832/36114/32889 33834/36119/32894 33839/36122/32897 33835/36123/32898
+f 33835/36123/32898 33839/36122/32897 37576/36124/32899 37577/36125/32900
+f 33834/36119/32894 39164/36121/32896 39165/36126/32901 33839/36122/32897
+f 33839/36122/32897 39165/36126/32901 40441/36127/32902 37576/36124/32899
+f 33832/36114/32889 33835/36123/32898 33840/36128/32903 33836/36115/32890
+f 33836/36115/32890 33840/36128/32903 39162/36110/32885 39161/36105/32880
+f 33835/36123/32898 37577/36125/32900 37578/36129/32904 33840/36128/32903
+f 33840/36128/32903 37578/36129/32904 40440/36111/32886 39162/36110/32885
+f 33841/36130/32905 33845/36131/32906 33846/36132/32907 33842/36133/32908
+f 33842/36133/32908 33846/36132/32907 37509/35757/32536 37508/35753/32532
+f 33845/36131/32906 39164/36121/32896 39163/36120/32895 33846/36132/32907
+f 33846/36132/32907 39163/36120/32895 40417/35739/32518 37509/35757/32536
+f 33841/36130/32905 33842/36133/32908 33847/36134/32909 33843/36135/32910
+f 33843/36135/32910 33847/36134/32909 39166/36136/32911 39167/36137/32912
+f 33842/36133/32908 37508/35753/32532 37507/35752/32531 33847/36134/32909
+f 33847/36134/32909 37507/35752/32531 40418/35755/32534 39166/36136/32911
+f 33841/36130/32905 33843/36135/32910 33848/36138/32913 33844/36139/32914
+f 33844/36139/32914 33848/36138/32913 37579/36140/32915 37580/36141/32916
+f 33843/36135/32910 39167/36137/32912 39168/36142/32917 33848/36138/32913
+f 33848/36138/32913 39168/36142/32917 40442/36143/32918 37579/36140/32915
+f 33841/36130/32905 33844/36139/32914 33849/36144/32919 33845/36131/32906
+f 33845/36131/32906 33849/36144/32919 39165/36126/32901 39164/36121/32896
+f 33844/36139/32914 37580/36141/32916 37581/36145/32920 33849/36144/32919
+f 33849/36144/32919 37581/36145/32920 40441/36127/32902 39165/36126/32901
+f 33850/36146/32921 33854/36147/32922 33855/36148/32923 33851/36149/32924
+f 33851/36149/32924 33855/36148/32923 37512/35773/32552 37511/35769/32548
+f 33854/36147/32922 39167/36137/32912 39166/36136/32911 33855/36148/32923
+f 33855/36148/32923 39166/36136/32911 40418/35755/32534 37512/35773/32552
+f 33850/36146/32921 33851/36149/32924 33856/36150/32925 33852/36151/32926
+f 33852/36151/32926 33856/36150/32925 39169/36152/32927 39170/36153/32928
+f 33851/36149/32924 37511/35769/32548 37510/35768/32547 33856/36150/32925
+f 33856/36150/32925 37510/35768/32547 40419/35771/32550 39169/36152/32927
+f 33850/36146/32921 33852/36151/32926 33857/36154/32929 33853/36155/32930
+f 33853/36155/32930 33857/36154/32929 37582/36156/32931 37583/36157/32932
+f 33852/36151/32926 39170/36153/32928 39171/36158/32933 33857/36154/32929
+f 33857/36154/32929 39171/36158/32933 40443/36159/32934 37582/36156/32931
+f 33850/36146/32921 33853/36155/32930 33858/36160/32935 33854/36147/32922
+f 33854/36147/32922 33858/36160/32935 39168/36142/32917 39167/36137/32912
+f 33853/36155/32930 37583/36157/32932 37584/36161/32936 33858/36160/32935
+f 33858/36160/32935 37584/36161/32936 40442/36143/32918 39168/36142/32917
+f 33859/36162/32937 33863/36163/32938 33864/36164/32939 33860/36165/32940
+f 33860/36165/32940 33864/36164/32939 37515/35789/32564 37514/35785/32562
+f 33863/36163/32938 39170/36153/32928 39169/36152/32927 33864/36164/32939
+f 33864/36164/32939 39169/36152/32927 40419/35771/32550 37515/35789/32564
+f 33859/36162/32937 33860/36165/32940 33865/36166/32941 33861/36167/32942
+f 33861/36167/32942 33865/36166/32941 39102/36168/32570 39101/36169/32569
+f 33860/36165/32940 37514/35785/32562 37513/35784/32561 33865/36166/32941
+f 33865/36166/32941 37513/35784/32561 40396/35787/32200 39102/36168/32570
+f 33859/36162/32937 33861/36167/32942 33866/36170/32943 33862/36171/32944
+f 33862/36171/32944 33866/36170/32943 37585/36172/32945 37586/36173/32946
+f 33861/36167/32942 39101/36169/32569 39100/36174/32582 33866/36170/32943
+f 33866/36170/32943 39100/36174/32582 40420/36175/32584 37585/36172/32945
+f 33859/36162/32937 33862/36171/32944 33867/36176/32947 33863/36163/32938
+f 33863/36163/32938 33867/36176/32947 39171/36158/32933 39170/36153/32928
+f 33862/36171/32944 37586/36173/32946 37587/36177/32948 33867/36176/32947
+f 33867/36176/32947 37587/36177/32948 40443/36159/32934 39171/36158/32933
+f 33868/36178/32949 33872/36179/32950 33873/36180/32951 33869/36181/32952
+f 33869/36181/32952 33873/36180/32951 37518/35808/32583 37517/35803/32578
+f 33872/36179/32950 39173/36182/32953 39174/36183/32954 33873/36180/32951
+f 33873/36180/32951 39174/36183/32954 40420/35809/32584 37518/35808/32583
+f 33868/36178/32949 33869/36181/32952 33874/36184/32955 33870/36185/32956
+f 33870/36185/32956 33874/36184/32955 39175/36186/32957 39176/36187/32958
+f 33869/36181/32952 37517/35803/32578 37516/35802/32577 33874/36184/32955
+f 33874/36184/32955 37516/35802/32577 40421/35805/32580 39175/36186/32957
+f 33868/36178/32949 33870/36185/32956 33875/36188/32959 33871/36189/32960
+f 33871/36189/32960 33875/36188/32959 37588/36190/32961 37589/36191/32962
+f 33870/36185/32956 39176/36187/32958 39177/36192/32963 33875/36188/32959
+f 33875/36188/32959 39177/36192/32963 40445/36193/32964 37588/36190/32961
+f 33868/36178/32949 33871/36189/32960 33876/36194/32965 33872/36179/32950
+f 33872/36179/32950 33876/36194/32965 39172/36195/32966 39173/36182/32953
+f 33871/36189/32960 37589/36191/32962 37590/36196/32967 33876/36194/32965
+f 33876/36194/32965 37590/36196/32967 40444/36197/32968 39172/36195/32966
+f 33877/36198/32969 33881/36199/32970 33882/36200/32971 33878/36201/32972
+f 33878/36201/32972 33882/36200/32971 37521/35825/32600 37520/35821/32596
+f 33881/36199/32970 39176/36187/32958 39175/36186/32957 33882/36200/32971
+f 33882/36200/32971 39175/36186/32957 40421/35805/32580 37521/35825/32600
+f 33877/36198/32969 33878/36201/32972 33883/36202/32973 33879/36203/32974
+f 33879/36203/32974 33883/36202/32973 39178/36204/32975 39179/36205/32976
+f 33878/36201/32972 37520/35821/32596 37519/35820/32595 33883/36202/32973
+f 33883/36202/32973 37519/35820/32595 40422/35823/32598 39178/36204/32975
+f 33877/36198/32969 33879/36203/32974 33884/36206/32977 33880/36207/32978
+f 33880/36207/32978 33884/36206/32977 37591/36208/32979 37592/36209/32980
+f 33879/36203/32974 39179/36205/32976 39180/36210/32981 33884/36206/32977
+f 33884/36206/32977 39180/36210/32981 40446/36211/32982 37591/36208/32979
+f 33877/36198/32969 33880/36207/32978 33885/36212/32983 33881/36199/32970
+f 33881/36199/32970 33885/36212/32983 39177/36192/32963 39176/36187/32958
+f 33880/36207/32978 37592/36209/32980 37593/36213/32984 33885/36212/32983
+f 33885/36212/32983 37593/36213/32984 40445/36193/32964 39177/36192/32963
+f 33886/36214/32985 33890/36215/32986 33891/36216/32987 33887/36217/32988
+f 33887/36217/32988 33891/36216/32987 37524/35841/32616 37523/35837/32612
+f 33890/36215/32986 39179/36205/32976 39178/36204/32975 33891/36216/32987
+f 33891/36216/32987 39178/36204/32975 40422/35823/32598 37524/35841/32616
+f 33886/36214/32985 33887/36217/32988 33892/36218/32989 33888/36219/32990
+f 33888/36219/32990 33892/36218/32989 39181/36220/32991 39182/36221/32992
+f 33887/36217/32988 37523/35837/32612 37522/35836/32611 33892/36218/32989
+f 33892/36218/32989 37522/35836/32611 40423/35839/32614 39181/36220/32991
+f 33886/36214/32985 33888/36219/32990 33893/36222/32993 33889/36223/32994
+f 33889/36223/32994 33893/36222/32993 37594/36224/32995 37595/36225/32996
+f 33888/36219/32990 39182/36221/32992 39183/36226/32997 33893/36222/32993
+f 33893/36222/32993 39183/36226/32997 40447/36227/32998 37594/36224/32995
+f 33886/36214/32985 33889/36223/32994 33894/36228/32999 33890/36215/32986
+f 33890/36215/32986 33894/36228/32999 39180/36210/32981 39179/36205/32976
+f 33889/36223/32994 37595/36225/32996 37596/36229/33000 33894/36228/32999
+f 33894/36228/32999 37596/36229/33000 40446/36211/32982 39180/36210/32981
+f 33895/36230/33001 33899/36231/33002 33900/36232/33003 33896/36233/33004
+f 33896/36233/33004 33900/36232/33003 37527/35857/32632 37526/35853/32628
+f 33899/36231/33002 39182/36221/32992 39181/36220/32991 33900/36232/33003
+f 33900/36232/33003 39181/36220/32991 40423/35839/32614 37527/35857/32632
+f 33895/36230/33001 33896/36233/33004 33901/36234/33005 33897/36235/33006
+f 33897/36235/33006 33901/36234/33005 39184/36236/33007 39185/36237/33008
+f 33896/36233/33004 37526/35853/32628 37525/35852/32627 33901/36234/33005
+f 33901/36234/33005 37525/35852/32627 40424/35855/32630 39184/36236/33007
+f 33895/36230/33001 33897/36235/33006 33902/36238/33009 33898/36239/33010
+f 33898/36239/33010 33902/36238/33009 37597/36240/33011 37598/36241/33012
+f 33897/36235/33006 39185/36237/33008 39186/36242/33013 33902/36238/33009
+f 33902/36238/33009 39186/36242/33013 40448/36243/33014 37597/36240/33011
+f 33895/36230/33001 33898/36239/33010 33903/36244/33015 33899/36231/33002
+f 33899/36231/33002 33903/36244/33015 39183/36226/32997 39182/36221/32992
+f 33898/36239/33010 37598/36241/33012 37599/36245/33016 33903/36244/33015
+f 33903/36244/33015 37599/36245/33016 40447/36227/32998 39183/36226/32997
+f 33904/36246/33017 33908/36247/33018 33909/36248/33019 33905/36249/33020
+f 33905/36249/33020 33909/36248/33019 37530/35873/32648 37529/35869/32644
+f 33908/36247/33018 39185/36237/33008 39184/36236/33007 33909/36248/33019
+f 33909/36248/33019 39184/36236/33007 40424/35855/32630 37530/35873/32648
+f 33904/36246/33017 33905/36249/33020 33910/36250/33021 33906/36251/33022
+f 33906/36251/33022 33910/36250/33021 39187/36252/33023 39188/36253/33024
+f 33905/36249/33020 37529/35869/32644 37528/35868/32643 33910/36250/33021
+f 33910/36250/33021 37528/35868/32643 40425/35871/32646 39187/36252/33023
+f 33904/36246/33017 33906/36251/33022 33911/36254/33025 33907/36255/33026
+f 33907/36255/33026 33911/36254/33025 37600/36256/33027 37601/36257/33028
+f 33906/36251/33022 39188/36253/33024 39189/36258/33029 33911/36254/33025
+f 33911/36254/33025 39189/36258/33029 40449/36259/28903 37600/36256/33027
+f 33904/36246/33017 33907/36255/33026 33912/36260/33030 33908/36247/33018
+f 33908/36247/33018 33912/36260/33030 39186/36242/33013 39185/36237/33008
+f 33907/36255/33026 37601/36257/33028 37602/36261/33031 33912/36260/33030
+f 33912/36260/33030 37602/36261/33031 40448/36243/33014 39186/36242/33013
+f 33913/36262/33032 33917/36263/33033 33918/36264/33034 33914/36265/33035
+f 33914/36265/33035 33918/36264/33034 37533/35889/32664 37532/35885/32660
+f 33917/36263/33033 39188/36253/33024 39187/36252/33023 33918/36264/33034
+f 33918/36264/33034 39187/36252/33023 40425/35871/32646 37533/35889/32664
+f 33913/36262/33032 33914/36265/33035 33919/36266/33036 33915/36267/33037
+f 33915/36267/33037 33919/36266/33036 39190/36268/33038 39191/36269/33039
+f 33914/36265/33035 37532/35885/32660 37531/35884/32659 33919/36266/33036
+f 33919/36266/33036 37531/35884/32659 40426/35887/32662 39190/36268/33038
+f 33913/36262/33032 33915/36267/33037 33920/36270/33040 33916/36271/33041
+f 33916/36271/33041 33920/36270/33040 37603/36272/33042 37604/36273/33043
+f 33915/36267/33037 39191/36269/33039 39192/36274/33044 33920/36270/33040
+f 33920/36270/33040 39192/36274/33044 40450/36275/33045 37603/36272/33042
+f 33913/36262/33032 33916/36271/33041 33921/36276/33046 33917/36263/33033
+f 33917/36263/33033 33921/36276/33046 39189/36258/33029 39188/36253/33024
+f 33916/36271/33041 37604/36273/33043 37605/36277/33047 33921/36276/33046
+f 33921/36276/33046 37605/36277/33047 40449/36259/28903 39189/36258/33029
+f 33922/36278/33048 33926/36279/33049 33927/36280/33050 33923/36281/33051
+f 33923/36281/33051 33927/36280/33050 37536/35905/32680 37535/35901/32676
+f 33926/36279/33049 39191/36269/33039 39190/36268/33038 33927/36280/33050
+f 33927/36280/33050 39190/36268/33038 40426/35887/32662 37536/35905/32680
+f 33922/36278/33048 33923/36281/33051 33928/36282/33052 33924/36283/33053
+f 33924/36283/33053 33928/36282/33052 39193/36284/33054 39194/36285/33055
+f 33923/36281/33051 37535/35901/32676 37534/35900/32675 33928/36282/33052
+f 33928/36282/33052 37534/35900/32675 40427/35903/32678 39193/36284/33054
+f 33922/36278/33048 33924/36283/33053 33929/36286/33056 33925/36287/33057
+f 33925/36287/33057 33929/36286/33056 37606/36288/33058 37607/36289/33059
+f 33924/36283/33053 39194/36285/33055 39195/36290/33060 33929/36286/33056
+f 33929/36286/33056 39195/36290/33060 40451/36291/33061 37606/36288/33058
+f 33922/36278/33048 33925/36287/33057 33930/36292/33062 33926/36279/33049
+f 33926/36279/33049 33930/36292/33062 39192/36274/33044 39191/36269/33039
+f 33925/36287/33057 37607/36289/33059 37608/36293/33063 33930/36292/33062
+f 33930/36292/33062 37608/36293/33063 40450/36275/33045 39192/36274/33044
+f 33931/36294/33064 33935/36295/33065 33936/36296/33066 33932/36297/33067
+f 33932/36297/33067 33936/36296/33066 37539/35921/32696 37538/35917/32692
+f 33935/36295/33065 39194/36285/33055 39193/36284/33054 33936/36296/33066
+f 33936/36296/33066 39193/36284/33054 40427/35903/32678 37539/35921/32696
+f 33931/36294/33064 33932/36297/33067 33937/36298/33068 33933/36299/33069
+f 33933/36299/33069 33937/36298/33068 39196/36300/33070 39197/36301/33071
+f 33932/36297/33067 37538/35917/32692 37537/35916/32691 33937/36298/33068
+f 33937/36298/33068 37537/35916/32691 40428/35919/32694 39196/36300/33070
+f 33931/36294/33064 33933/36299/33069 33938/36302/33072 33934/36303/33073
+f 33934/36303/33073 33938/36302/33072 37609/36304/33074 37610/36305/33075
+f 33933/36299/33069 39197/36301/33071 39198/36306/33076 33938/36302/33072
+f 33938/36302/33072 39198/36306/33076 40452/36307/33077 37609/36304/33074
+f 33931/36294/33064 33934/36303/33073 33939/36308/33078 33935/36295/33065
+f 33935/36295/33065 33939/36308/33078 39195/36290/33060 39194/36285/33055
+f 33934/36303/33073 37610/36305/33075 37611/36309/33079 33939/36308/33078
+f 33939/36308/33078 37611/36309/33079 40451/36291/33061 39195/36290/33060
+f 33940/36310/33080 33944/36311/33081 33945/36312/33082 33941/36313/33083
+f 33941/36313/33083 33945/36312/33082 37542/35937/32712 37541/35933/32708
+f 33944/36311/33081 39197/36301/33071 39196/36300/33070 33945/36312/33082
+f 33945/36312/33082 39196/36300/33070 40428/35919/32694 37542/35937/32712
+f 33940/36310/33080 33941/36313/33083 33946/36314/33084 33942/36315/33085
+f 33942/36315/33085 33946/36314/33084 39199/36316/33086 39200/36317/33087
+f 33941/36313/33083 37541/35933/32708 37540/35932/32707 33946/36314/33084
+f 33946/36314/33084 37540/35932/32707 40429/35935/32710 39199/36316/33086
+f 33940/36310/33080 33942/36315/33085 33947/36318/33088 33943/36319/33089
+f 33943/36319/33089 33947/36318/33088 37612/36320/33090 37613/36321/33091
+f 33942/36315/33085 39200/36317/33087 39201/36322/33092 33947/36318/33088
+f 33947/36318/33088 39201/36322/33092 40453/36323/33093 37612/36320/33090
+f 33940/36310/33080 33943/36319/33089 33948/36324/33094 33944/36311/33081
+f 33944/36311/33081 33948/36324/33094 39198/36306/33076 39197/36301/33071
+f 33943/36319/33089 37613/36321/33091 37614/36325/33095 33948/36324/33094
+f 33948/36324/33094 37614/36325/33095 40452/36307/33077 39198/36306/33076
+f 33949/36326/33096 33953/36327/33097 33954/36328/33098 33950/36329/33099
+f 33950/36329/33099 33954/36328/33098 37545/35953/32728 37544/35949/32724
+f 33953/36327/33097 39200/36317/33087 39199/36316/33086 33954/36328/33098
+f 33954/36328/33098 39199/36316/33086 40429/35935/32710 37545/35953/32728
+f 33949/36326/33096 33950/36329/33099 33955/36330/33100 33951/36331/33101
+f 33951/36331/33101 33955/36330/33100 39202/36332/33102 39203/36333/33103
+f 33950/36329/33099 37544/35949/32724 37543/35948/32723 33955/36330/33100
+f 33955/36330/33100 37543/35948/32723 40430/35951/32726 39202/36332/33102
+f 33949/36326/33096 33951/36331/33101 33956/36334/33104 33952/36335/33105
+f 33952/36335/33105 33956/36334/33104 37615/36336/33106 37616/36337/33107
+f 33951/36331/33101 39203/36333/33103 39204/36338/33108 33956/36334/33104
+f 33956/36334/33104 39204/36338/33108 40454/36339/33109 37615/36336/33106
+f 33949/36326/33096 33952/36335/33105 33957/36340/33110 33953/36327/33097
+f 33953/36327/33097 33957/36340/33110 39201/36322/33092 39200/36317/33087
+f 33952/36335/33105 37616/36337/33107 37617/36341/33111 33957/36340/33110
+f 33957/36340/33110 37617/36341/33111 40453/36323/33093 39201/36322/33092
+f 33958/36342/33112 33962/36343/33113 33963/36344/33114 33959/36345/33115
+f 33959/36345/33115 33963/36344/33114 37548/35969/32744 37547/35965/32740
+f 33962/36343/33113 39203/36333/33103 39202/36332/33102 33963/36344/33114
+f 33963/36344/33114 39202/36332/33102 40430/35951/32726 37548/35969/32744
+f 33958/36342/33112 33959/36345/33115 33964/36346/33116 33960/36347/33117
+f 33960/36347/33117 33964/36346/33116 39205/36348/33118 39206/36349/33119
+f 33959/36345/33115 37547/35965/32740 37546/35964/32739 33964/36346/33116
+f 33964/36346/33116 37546/35964/32739 40431/35967/32742 39205/36348/33118
+f 33958/36342/33112 33960/36347/33117 33965/36350/33120 33961/36351/33121
+f 33961/36351/33121 33965/36350/33120 37618/36352/33122 37619/36353/33123
+f 33960/36347/33117 39206/36349/33119 39207/36354/33124 33965/36350/33120
+f 33965/36350/33120 39207/36354/33124 40455/36355/1136 37618/36352/33122
+f 33958/36342/33112 33961/36351/33121 33966/36356/33125 33962/36343/33113
+f 33962/36343/33113 33966/36356/33125 39204/36338/33108 39203/36333/33103
+f 33961/36351/33121 37619/36353/33123 37620/36357/33126 33966/36356/33125
+f 33966/36356/33125 37620/36357/33126 40454/36339/33109 39204/36338/33108
+f 33967/36358/33127 33971/36359/33128 33972/36360/33129 33968/36361/33130
+f 33968/36361/33130 33972/36360/33129 37551/35985/32760 37550/35981/32756
+f 33971/36359/33128 39206/36349/33119 39205/36348/33118 33972/36360/33129
+f 33972/36360/33129 39205/36348/33118 40431/35967/32742 37551/35985/32760
+f 33967/36358/33127 33968/36361/33130 33973/36362/33131 33969/36363/33132
+f 33969/36363/33132 33973/36362/33131 39208/36364/33133 39209/36365/33134
+f 33968/36361/33130 37550/35981/32756 37549/35980/32755 33973/36362/33131
+f 33973/36362/33131 37549/35980/32755 40432/35983/32758 39208/36364/33133
+f 33967/36358/33127 33969/36363/33132 33974/36366/33135 33970/36367/33136
+f 33970/36367/33136 33974/36366/33135 37621/36368/33137 37622/36369/33138
+f 33969/36363/33132 39209/36365/33134 39210/36370/33139 33974/36366/33135
+f 33974/36366/33135 39210/36370/33139 40456/36371/33140 37621/36368/33137
+f 33967/36358/33127 33970/36367/33136 33975/36372/33141 33971/36359/33128
+f 33971/36359/33128 33975/36372/33141 39207/36354/33124 39206/36349/33119
+f 33970/36367/33136 37622/36369/33138 37623/36373/33142 33975/36372/33141
+f 33975/36372/33141 37623/36373/33142 40455/36355/1136 39207/36354/33124
+f 33976/36374/33143 33980/36375/33144 33981/36376/33145 33977/36377/33146
+f 33977/36377/33146 33981/36376/33145 37554/36001/32776 37553/35997/32772
+f 33980/36375/33144 39209/36365/33134 39208/36364/33133 33981/36376/33145
+f 33981/36376/33145 39208/36364/33133 40432/35983/32758 37554/36001/32776
+f 33976/36374/33143 33977/36377/33146 33982/36378/33147 33978/36379/33148
+f 33978/36379/33148 33982/36378/33147 39211/36380/33149 39212/36381/33150
+f 33977/36377/33146 37553/35997/32772 37552/35996/32771 33982/36378/33147
+f 33982/36378/33147 37552/35996/32771 40433/35999/32774 39211/36380/33149
+f 33976/36374/33143 33978/36379/33148 33983/36382/33151 33979/36383/33152
+f 33979/36383/33152 33983/36382/33151 37624/36384/33153 37625/36385/33154
+f 33978/36379/33148 39212/36381/33150 39213/36386/33155 33983/36382/33151
+f 33983/36382/33151 39213/36386/33155 40457/36387/33156 37624/36384/33153
+f 33976/36374/33143 33979/36383/33152 33984/36388/33157 33980/36375/33144
+f 33980/36375/33144 33984/36388/33157 39210/36370/33139 39209/36365/33134
+f 33979/36383/33152 37625/36385/33154 37626/36389/33158 33984/36388/33157
+f 33984/36388/33157 37626/36389/33158 40456/36371/33140 39210/36370/33139
+f 33985/36390/33159 33989/36391/33160 33990/36392/33161 33986/36393/33162
+f 33986/36393/33162 33990/36392/33161 37557/36017/32792 37556/36013/32788
+f 33989/36391/33160 39212/36381/33150 39211/36380/33149 33990/36392/33161
+f 33990/36392/33161 39211/36380/33149 40433/35999/32774 37557/36017/32792
+f 33985/36390/33159 33986/36393/33162 33991/36394/33163 33987/36395/33164
+f 33987/36395/33164 33991/36394/33163 39214/36396/33165 39215/36397/33166
+f 33986/36393/33162 37556/36013/32788 37555/36012/32787 33991/36394/33163
+f 33991/36394/33163 37555/36012/32787 40434/36015/32790 39214/36396/33165
+f 33985/36390/33159 33987/36395/33164 33992/36398/33167 33988/36399/33168
+f 33988/36399/33168 33992/36398/33167 37627/36400/33169 37628/36401/33170
+f 33987/36395/33164 39215/36397/33166 39216/36402/33171 33992/36398/33167
+f 33992/36398/33167 39216/36402/33171 40458/36403/33172 37627/36400/33169
+f 33985/36390/33159 33988/36399/33168 33993/36404/33173 33989/36391/33160
+f 33989/36391/33160 33993/36404/33173 39213/36386/33155 39212/36381/33150
+f 33988/36399/33168 37628/36401/33170 37629/36405/33174 33993/36404/33173
+f 33993/36404/33173 37629/36405/33174 40457/36387/33156 39213/36386/33155
+f 33994/36406/33175 33998/36407/33176 33999/36408/33177 33995/36409/33178
+f 33995/36409/33178 33999/36408/33177 37560/36033/32808 37559/36029/32804
+f 33998/36407/33176 39215/36397/33166 39214/36396/33165 33999/36408/33177
+f 33999/36408/33177 39214/36396/33165 40434/36015/32790 37560/36033/32808
+f 33994/36406/33175 33995/36409/33178 34000/36410/33179 33996/36411/33180
+f 33996/36411/33180 34000/36410/33179 39217/36412/33181 39218/36413/33182
+f 33995/36409/33178 37559/36029/32804 37558/36028/32803 34000/36410/33179
+f 34000/36410/33179 37558/36028/32803 40435/36031/32806 39217/36412/33181
+f 33994/36406/33175 33996/36411/33180 34001/36414/33183 33997/36415/33184
+f 33997/36415/33184 34001/36414/33183 37630/36416/33185 37631/36417/33186
+f 33996/36411/33180 39218/36413/33182 39219/36418/33187 34001/36414/33183
+f 34001/36414/33183 39219/36418/33187 40459/36419/33188 37630/36416/33185
+f 33994/36406/33175 33997/36415/33184 34002/36420/33189 33998/36407/33176
+f 33998/36407/33176 34002/36420/33189 39216/36402/33171 39215/36397/33166
+f 33997/36415/33184 37631/36417/33186 37632/36421/33190 34002/36420/33189
+f 34002/36420/33189 37632/36421/33190 40458/36403/33172 39216/36402/33171
+f 34003/36422/33191 34007/36423/33192 34008/36424/33193 34004/36425/33194
+f 34004/36425/33194 34008/36424/33193 37563/36049/32824 37562/36045/32820
+f 34007/36423/33192 39218/36413/33182 39217/36412/33181 34008/36424/33193
+f 34008/36424/33193 39217/36412/33181 40435/36031/32806 37563/36049/32824
+f 34003/36422/33191 34004/36425/33194 34009/36426/33195 34005/36427/33196
+f 34005/36427/33196 34009/36426/33195 39220/36428/33197 39221/36429/33198
+f 34004/36425/33194 37562/36045/32820 37561/36044/32819 34009/36426/33195
+f 34009/36426/33195 37561/36044/32819 40436/36047/32822 39220/36428/33197
+f 34003/36422/33191 34005/36427/33196 34010/36430/33199 34006/36431/33200
+f 34006/36431/33200 34010/36430/33199 37633/36432/33201 37634/36433/33202
+f 34005/36427/33196 39221/36429/33198 39222/36434/33203 34010/36430/33199
+f 34010/36430/33199 39222/36434/33203 40460/36435/33204 37633/36432/33201
+f 34003/36422/33191 34006/36431/33200 34011/36436/33205 34007/36423/33192
+f 34007/36423/33192 34011/36436/33205 39219/36418/33187 39218/36413/33182
+f 34006/36431/33200 37634/36433/33202 37635/36437/33206 34011/36436/33205
+f 34011/36436/33205 37635/36437/33206 40459/36419/33188 39219/36418/33187
+f 34012/36438/33207 34016/36439/33208 34017/36440/33209 34013/36441/33210
+f 34013/36441/33210 34017/36440/33209 37566/36065/32840 37565/36061/32836
+f 34016/36439/33208 39221/36429/33198 39220/36428/33197 34017/36440/33209
+f 34017/36440/33209 39220/36428/33197 40436/36047/32822 37566/36065/32840
+f 34012/36438/33207 34013/36441/33210 34018/36442/33211 34014/36443/33212
+f 34014/36443/33212 34018/36442/33211 39223/36444/33213 39224/36445/33214
+f 34013/36441/33210 37565/36061/32836 37564/36060/32835 34018/36442/33211
+f 34018/36442/33211 37564/36060/32835 40437/36063/32838 39223/36444/33213
+f 34012/36438/33207 34014/36443/33212 34019/36446/33215 34015/36447/33216
+f 34015/36447/33216 34019/36446/33215 37636/36448/33217 37637/36449/33218
+f 34014/36443/33212 39224/36445/33214 39225/36450/33219 34019/36446/33215
+f 34019/36446/33215 39225/36450/33219 40461/36451/28954 37636/36448/33217
+f 34012/36438/33207 34015/36447/33216 34020/36452/33220 34016/36439/33208
+f 34016/36439/33208 34020/36452/33220 39222/36434/33203 39221/36429/33198
+f 34015/36447/33216 37637/36449/33218 37638/36453/33221 34020/36452/33220
+f 34020/36452/33220 37638/36453/33221 40460/36435/33204 39222/36434/33203
+f 34021/36454/33222 34025/36455/33223 34026/36456/33224 34022/36457/33225
+f 34022/36457/33225 34026/36456/33224 37569/36081/32856 37568/36077/32852
+f 34025/36455/33223 39224/36445/33214 39223/36444/33213 34026/36456/33224
+f 34026/36456/33224 39223/36444/33213 40437/36063/32838 37569/36081/32856
+f 34021/36454/33222 34022/36457/33225 34027/36458/33226 34023/36459/33227
+f 34023/36459/33227 34027/36458/33226 39226/36460/33228 39227/36461/33229
+f 34022/36457/33225 37568/36077/32852 37567/36076/32851 34027/36458/33226
+f 34027/36458/33226 37567/36076/32851 40438/36079/32854 39226/36460/33228
+f 34021/36454/33222 34023/36459/33227 34028/36462/33230 34024/36463/33231
+f 34024/36463/33231 34028/36462/33230 37639/36464/33232 37640/36465/33233
+f 34023/36459/33227 39227/36461/33229 39228/36466/33234 34028/36462/33230
+f 34028/36462/33230 39228/36466/33234 40462/36467/33235 37639/36464/33232
+f 34021/36454/33222 34024/36463/33231 34029/36468/33236 34025/36455/33223
+f 34025/36455/33223 34029/36468/33236 39225/36450/33219 39224/36445/33214
+f 34024/36463/33231 37640/36465/33233 37641/36469/33237 34029/36468/33236
+f 34029/36468/33236 37641/36469/33237 40461/36451/28954 39225/36450/33219
+f 34030/36470/33238 34034/36471/33239 34035/36472/33240 34031/36473/33241
+f 34031/36473/33241 34035/36472/33240 37572/36097/32872 37571/36093/32868
+f 34034/36471/33239 39227/36461/33229 39226/36460/33228 34035/36472/33240
+f 34035/36472/33240 39226/36460/33228 40438/36079/32854 37572/36097/32872
+f 34030/36470/33238 34031/36473/33241 34036/36474/33242 34032/36475/33243
+f 34032/36475/33243 34036/36474/33242 39229/36476/33244 39230/36477/33245
+f 34031/36473/33241 37571/36093/32868 37570/36092/32867 34036/36474/33242
+f 34036/36474/33242 37570/36092/32867 40439/36095/32870 39229/36476/33244
+f 34030/36470/33238 34032/36475/33243 34037/36478/33246 34033/36479/33247
+f 34033/36479/33247 34037/36478/33246 37642/36480/33248 37643/36481/33249
+f 34032/36475/33243 39230/36477/33245 39231/36482/33250 34037/36478/33246
+f 34037/36478/33246 39231/36482/33250 40463/36483/33251 37642/36480/33248
+f 34030/36470/33238 34033/36479/33247 34038/36484/33252 34034/36471/33239
+f 34034/36471/33239 34038/36484/33252 39228/36466/33234 39227/36461/33229
+f 34033/36479/33247 37643/36481/33249 37644/36485/33253 34038/36484/33252
+f 34038/36484/33252 37644/36485/33253 40462/36467/33235 39228/36466/33234
+f 34039/36486/33254 34043/36487/33255 34044/36488/33256 34040/36489/33257
+f 34040/36489/33257 34044/36488/33256 37575/36113/32888 37574/36109/32884
+f 34043/36487/33255 39230/36477/33245 39229/36476/33244 34044/36488/33256
+f 34044/36488/33256 39229/36476/33244 40439/36095/32870 37575/36113/32888
+f 34039/36486/33254 34040/36489/33257 34045/36490/33258 34041/36491/33259
+f 34041/36491/33259 34045/36490/33258 39232/36492/33260 39233/36493/33261
+f 34040/36489/33257 37574/36109/32884 37573/36108/32883 34045/36490/33258
+f 34045/36490/33258 37573/36108/32883 40440/36111/32886 39232/36492/33260
+f 34039/36486/33254 34041/36491/33259 34046/36494/33262 34042/36495/33263
+f 34042/36495/33263 34046/36494/33262 37645/36496/33264 37646/36497/33265
+f 34041/36491/33259 39233/36493/33261 39234/36498/33266 34046/36494/33262
+f 34046/36494/33262 39234/36498/33266 40464/36499/33267 37645/36496/33264
+f 34039/36486/33254 34042/36495/33263 34047/36500/33268 34043/36487/33255
+f 34043/36487/33255 34047/36500/33268 39231/36482/33250 39230/36477/33245
+f 34042/36495/33263 37646/36497/33265 37647/36501/33269 34047/36500/33268
+f 34047/36500/33268 37647/36501/33269 40463/36483/33251 39231/36482/33250
+f 34048/36502/33270 34052/36503/33271 34053/36504/33272 34049/36505/33273
+f 34049/36505/33273 34053/36504/33272 37578/36129/32904 37577/36125/32900
+f 34052/36503/33271 39233/36493/33261 39232/36492/33260 34053/36504/33272
+f 34053/36504/33272 39232/36492/33260 40440/36111/32886 37578/36129/32904
+f 34048/36502/33270 34049/36505/33273 34054/36506/33274 34050/36507/33275
+f 34050/36507/33275 34054/36506/33274 39235/36508/33276 39236/36509/33277
+f 34049/36505/33273 37577/36125/32900 37576/36124/32899 34054/36506/33274
+f 34054/36506/33274 37576/36124/32899 40441/36127/32902 39235/36508/33276
+f 34048/36502/33270 34050/36507/33275 34055/36510/33278 34051/36511/33279
+f 34051/36511/33279 34055/36510/33278 37648/36512/33280 37649/36513/33281
+f 34050/36507/33275 39236/36509/33277 39237/36514/33282 34055/36510/33278
+f 34055/36510/33278 39237/36514/33282 40465/36515/33283 37648/36512/33280
+f 34048/36502/33270 34051/36511/33279 34056/36516/33284 34052/36503/33271
+f 34052/36503/33271 34056/36516/33284 39234/36498/33266 39233/36493/33261
+f 34051/36511/33279 37649/36513/33281 37650/36517/33285 34056/36516/33284
+f 34056/36516/33284 37650/36517/33285 40464/36499/33267 39234/36498/33266
+f 34057/36518/33286 34061/36519/33287 34062/36520/33288 34058/36521/33289
+f 34058/36521/33289 34062/36520/33288 37581/36145/32920 37580/36141/32916
+f 34061/36519/33287 39236/36509/33277 39235/36508/33276 34062/36520/33288
+f 34062/36520/33288 39235/36508/33276 40441/36127/32902 37581/36145/32920
+f 34057/36518/33286 34058/36521/33289 34063/36522/33290 34059/36523/33291
+f 34059/36523/33291 34063/36522/33290 39238/36524/33292 39239/36525/33293
+f 34058/36521/33289 37580/36141/32916 37579/36140/32915 34063/36522/33290
+f 34063/36522/33290 37579/36140/32915 40442/36143/32918 39238/36524/33292
+f 34057/36518/33286 34059/36523/33291 34064/36526/33294 34060/36527/33295
+f 34060/36527/33295 34064/36526/33294 37651/36528/33296 37652/36529/33297
+f 34059/36523/33291 39239/36525/33293 39240/36530/33298 34064/36526/33294
+f 34064/36526/33294 39240/36530/33298 40466/36531/33299 37651/36528/33296
+f 34057/36518/33286 34060/36527/33295 34065/36532/33300 34061/36519/33287
+f 34061/36519/33287 34065/36532/33300 39237/36514/33282 39236/36509/33277
+f 34060/36527/33295 37652/36529/33297 37653/36533/33301 34065/36532/33300
+f 34065/36532/33300 37653/36533/33301 40465/36515/33283 39237/36514/33282
+f 34066/36534/33302 34070/36535/33303 34071/36536/33304 34067/36537/33305
+f 34067/36537/33305 34071/36536/33304 37584/36161/32936 37583/36157/32932
+f 34070/36535/33303 39239/36525/33293 39238/36524/33292 34071/36536/33304
+f 34071/36536/33304 39238/36524/33292 40442/36143/32918 37584/36161/32936
+f 34066/36534/33302 34067/36537/33305 34072/36538/33306 34068/36539/33307
+f 34068/36539/33307 34072/36538/33306 39241/36540/33308 39242/36541/33309
+f 34067/36537/33305 37583/36157/32932 37582/36156/32931 34072/36538/33306
+f 34072/36538/33306 37582/36156/32931 40443/36159/32934 39241/36540/33308
+f 34066/36534/33302 34068/36539/33307 34073/36542/33310 34069/36543/33311
+f 34069/36543/33311 34073/36542/33310 37654/36544/33312 37655/36545/33313
+f 34068/36539/33307 39242/36541/33309 39243/36546/33314 34073/36542/33310
+f 34073/36542/33310 39243/36546/33314 40467/36547/170 37654/36544/33312
+f 34066/36534/33302 34069/36543/33311 34074/36548/33315 34070/36535/33303
+f 34070/36535/33303 34074/36548/33315 39240/36530/33298 39239/36525/33293
+f 34069/36543/33311 37655/36545/33313 37656/36549/33316 34074/36548/33315
+f 34074/36548/33315 37656/36549/33316 40466/36531/33299 39240/36530/33298
+f 34075/36550/33317 34079/36551/33318 34080/36552/33319 34076/36553/33320
+f 34076/36553/33320 34080/36552/33319 37587/36177/32948 37586/36173/32946
+f 34079/36551/33318 39242/36541/33309 39241/36540/33308 34080/36552/33319
+f 34080/36552/33319 39241/36540/33308 40443/36159/32934 37587/36177/32948
+f 34075/36550/33317 34076/36553/33320 34081/36554/33321 34077/36555/33322
+f 34077/36555/33322 34081/36554/33321 39174/36556/32954 39173/36557/32953
+f 34076/36553/33320 37586/36173/32946 37585/36172/32945 34081/36554/33321
+f 34081/36554/33321 37585/36172/32945 40420/36175/32584 39174/36556/32954
+f 34075/36550/33317 34077/36555/33322 34082/36558/33323 34078/36559/33324
+f 34078/36559/33324 34082/36558/33323 37657/36560/33325 37658/36561/33326
+f 34077/36555/33322 39173/36557/32953 39172/36562/32966 34082/36558/33323
+f 34082/36558/33323 39172/36562/32966 40444/36563/32968 37657/36560/33325
+f 34075/36550/33317 34078/36559/33324 34083/36564/33327 34079/36551/33318
+f 34079/36551/33318 34083/36564/33327 39243/36546/33314 39242/36541/33309
+f 34078/36559/33324 37658/36561/33326 37659/36565/33328 34083/36564/33327
+f 34083/36564/33327 37659/36565/33328 40467/36547/170 39243/36546/33314
+f 34084/36566/33329 34088/36567/33330 34089/36568/33331 34085/36569/33332
+f 34085/36569/33332 34089/36568/33331 37590/36196/32967 37589/36191/32962
+f 34088/36567/33330 39245/36570/33333 39246/36571/33334 34089/36568/33331
+f 34089/36568/33331 39246/36571/33334 40444/36197/32968 37590/36196/32967
+f 34084/36566/33329 34085/36569/33332 34090/36572/33335 34086/36573/33336
+f 34086/36573/33336 34090/36572/33335 39247/36574/33337 39248/36575/33338
+f 34085/36569/33332 37589/36191/32962 37588/36190/32961 34090/36572/33335
+f 34090/36572/33335 37588/36190/32961 40445/36193/32964 39247/36574/33337
+f 34084/36566/33329 34086/36573/33336 34091/36576/33339 34087/36577/33340
+f 34087/36577/33340 34091/36576/33339 37660/36578/33341 37661/36579/33342
+f 34086/36573/33336 39248/36575/33338 39249/36580/33343 34091/36576/33339
+f 34091/36576/33339 39249/36580/33343 40469/36581/33344 37660/36578/33341
+f 34084/36566/33329 34087/36577/33340 34092/36582/33345 34088/36567/33330
+f 34088/36567/33330 34092/36582/33345 39244/36583/33346 39245/36570/33333
+f 34087/36577/33340 37661/36579/33342 37662/36584/33347 34092/36582/33345
+f 34092/36582/33345 37662/36584/33347 40468/36585/33348 39244/36583/33346
+f 34093/36586/33349 34097/36587/33350 34098/36588/33351 34094/36589/33352
+f 34094/36589/33352 34098/36588/33351 37593/36213/32984 37592/36209/32980
+f 34097/36587/33350 39248/36575/33338 39247/36574/33337 34098/36588/33351
+f 34098/36588/33351 39247/36574/33337 40445/36193/32964 37593/36213/32984
+f 34093/36586/33349 34094/36589/33352 34099/36590/33353 34095/36591/33354
+f 34095/36591/33354 34099/36590/33353 39250/36592/33355 39251/36593/33356
+f 34094/36589/33352 37592/36209/32980 37591/36208/32979 34099/36590/33353
+f 34099/36590/33353 37591/36208/32979 40446/36211/32982 39250/36592/33355
+f 34093/36586/33349 34095/36591/33354 34100/36594/33357 34096/36595/33358
+f 34096/36595/33358 34100/36594/33357 37663/36596/33359 37664/36597/33360
+f 34095/36591/33354 39251/36593/33356 39252/36598/33361 34100/36594/33357
+f 34100/36594/33357 39252/36598/33361 40470/36599/33362 37663/36596/33359
+f 34093/36586/33349 34096/36595/33358 34101/36600/33363 34097/36587/33350
+f 34097/36587/33350 34101/36600/33363 39249/36580/33343 39248/36575/33338
+f 34096/36595/33358 37664/36597/33360 37665/36601/33364 34101/36600/33363
+f 34101/36600/33363 37665/36601/33364 40469/36581/33344 39249/36580/33343
+f 34102/36602/33365 34106/36603/33366 34107/36604/33367 34103/36605/33368
+f 34103/36605/33368 34107/36604/33367 37596/36229/33000 37595/36225/32996
+f 34106/36603/33366 39251/36593/33356 39250/36592/33355 34107/36604/33367
+f 34107/36604/33367 39250/36592/33355 40446/36211/32982 37596/36229/33000
+f 34102/36602/33365 34103/36605/33368 34108/36606/33369 34104/36607/33370
+f 34104/36607/33370 34108/36606/33369 39253/36608/33371 39254/36609/33372
+f 34103/36605/33368 37595/36225/32996 37594/36224/32995 34108/36606/33369
+f 34108/36606/33369 37594/36224/32995 40447/36227/32998 39253/36608/33371
+f 34102/36602/33365 34104/36607/33370 34109/36610/33373 34105/36611/33374
+f 34105/36611/33374 34109/36610/33373 37666/36612/33375 37667/36613/33376
+f 34104/36607/33370 39254/36609/33372 39255/36614/33377 34109/36610/33373
+f 34109/36610/33373 39255/36614/33377 40471/36615/33378 37666/36612/33375
+f 34102/36602/33365 34105/36611/33374 34110/36616/33379 34106/36603/33366
+f 34106/36603/33366 34110/36616/33379 39252/36598/33361 39251/36593/33356
+f 34105/36611/33374 37667/36613/33376 37668/36617/33380 34110/36616/33379
+f 34110/36616/33379 37668/36617/33380 40470/36599/33362 39252/36598/33361
+f 34111/36618/33381 34115/36619/33382 34116/36620/33383 34112/36621/33384
+f 34112/36621/33384 34116/36620/33383 37599/36245/33016 37598/36241/33012
+f 34115/36619/33382 39254/36609/33372 39253/36608/33371 34116/36620/33383
+f 34116/36620/33383 39253/36608/33371 40447/36227/32998 37599/36245/33016
+f 34111/36618/33381 34112/36621/33384 34117/36622/33385 34113/36623/33386
+f 34113/36623/33386 34117/36622/33385 39256/36624/33387 39257/36625/33388
+f 34112/36621/33384 37598/36241/33012 37597/36240/33011 34117/36622/33385
+f 34117/36622/33385 37597/36240/33011 40448/36243/33014 39256/36624/33387
+f 34111/36618/33381 34113/36623/33386 34118/36626/33389 34114/36627/33390
+f 34114/36627/33390 34118/36626/33389 37669/36628/33391 37670/36629/33392
+f 34113/36623/33386 39257/36625/33388 39258/36630/33393 34118/36626/33389
+f 34118/36626/33389 39258/36630/33393 40472/36631/33394 37669/36628/33391
+f 34111/36618/33381 34114/36627/33390 34119/36632/33395 34115/36619/33382
+f 34115/36619/33382 34119/36632/33395 39255/36614/33377 39254/36609/33372
+f 34114/36627/33390 37670/36629/33392 37671/36633/33396 34119/36632/33395
+f 34119/36632/33395 37671/36633/33396 40471/36615/33378 39255/36614/33377
+f 34120/36634/33397 34124/36635/33398 34125/36636/33399 34121/36637/33400
+f 34121/36637/33400 34125/36636/33399 37602/36261/33031 37601/36257/33028
+f 34124/36635/33398 39257/36625/33388 39256/36624/33387 34125/36636/33399
+f 34125/36636/33399 39256/36624/33387 40448/36243/33014 37602/36261/33031
+f 34120/36634/33397 34121/36637/33400 34126/36638/33401 34122/36639/33402
+f 34122/36639/33402 34126/36638/33401 39259/36640/33403 39260/36641/33404
+f 34121/36637/33400 37601/36257/33028 37600/36256/33027 34126/36638/33401
+f 34126/36638/33401 37600/36256/33027 40449/36259/28903 39259/36640/33403
+f 34120/36634/33397 34122/36639/33402 34127/36642/33405 34123/36643/33406
+f 34123/36643/33406 34127/36642/33405 37672/36644/33407 37673/36645/33408
+f 34122/36639/33402 39260/36641/33404 39261/36646/33409 34127/36642/33405
+f 34127/36642/33405 39261/36646/33409 40473/36647/33410 37672/36644/33407
+f 34120/36634/33397 34123/36643/33406 34128/36648/33411 34124/36635/33398
+f 34124/36635/33398 34128/36648/33411 39258/36630/33393 39257/36625/33388
+f 34123/36643/33406 37673/36645/33408 37674/36649/33412 34128/36648/33411
+f 34128/36648/33411 37674/36649/33412 40472/36631/33394 39258/36630/33393
+f 34129/36650/33413 34133/36651/33414 34134/36652/33415 34130/36653/33416
+f 34130/36653/33416 34134/36652/33415 37605/36277/33047 37604/36273/33043
+f 34133/36651/33414 39260/36641/33404 39259/36640/33403 34134/36652/33415
+f 34134/36652/33415 39259/36640/33403 40449/36259/28903 37605/36277/33047
+f 34129/36650/33413 34130/36653/33416 34135/36654/33417 34131/36655/33418
+f 34131/36655/33418 34135/36654/33417 39262/36656/33419 39263/36657/33420
+f 34130/36653/33416 37604/36273/33043 37603/36272/33042 34135/36654/33417
+f 34135/36654/33417 37603/36272/33042 40450/36275/33045 39262/36656/33419
+f 34129/36650/33413 34131/36655/33418 34136/36658/33421 34132/36659/33422
+f 34132/36659/33422 34136/36658/33421 37675/36660/33423 37676/36661/33424
+f 34131/36655/33418 39263/36657/33420 39264/36662/33425 34136/36658/33421
+f 34136/36658/33421 39264/36662/33425 40474/36663/33426 37675/36660/33423
+f 34129/36650/33413 34132/36659/33422 34137/36664/33427 34133/36651/33414
+f 34133/36651/33414 34137/36664/33427 39261/36646/33409 39260/36641/33404
+f 34132/36659/33422 37676/36661/33424 37677/36665/33428 34137/36664/33427
+f 34137/36664/33427 37677/36665/33428 40473/36647/33410 39261/36646/33409
+f 34138/36666/33429 34142/36667/33430 34143/36668/33431 34139/36669/33432
+f 34139/36669/33432 34143/36668/33431 37608/36293/33063 37607/36289/33059
+f 34142/36667/33430 39263/36657/33420 39262/36656/33419 34143/36668/33431
+f 34143/36668/33431 39262/36656/33419 40450/36275/33045 37608/36293/33063
+f 34138/36666/33429 34139/36669/33432 34144/36670/33433 34140/36671/33434
+f 34140/36671/33434 34144/36670/33433 39265/36672/33435 39266/36673/33436
+f 34139/36669/33432 37607/36289/33059 37606/36288/33058 34144/36670/33433
+f 34144/36670/33433 37606/36288/33058 40451/36291/33061 39265/36672/33435
+f 34138/36666/33429 34140/36671/33434 34145/36674/33437 34141/36675/33438
+f 34141/36675/33438 34145/36674/33437 37678/36676/33439 37679/36677/33440
+f 34140/36671/33434 39266/36673/33436 39267/36678/33441 34145/36674/33437
+f 34145/36674/33437 39267/36678/33441 40475/36679/33442 37678/36676/33439
+f 34138/36666/33429 34141/36675/33438 34146/36680/33443 34142/36667/33430
+f 34142/36667/33430 34146/36680/33443 39264/36662/33425 39263/36657/33420
+f 34141/36675/33438 37679/36677/33440 37680/36681/33444 34146/36680/33443
+f 34146/36680/33443 37680/36681/33444 40474/36663/33426 39264/36662/33425
+f 34147/36682/33445 34151/36683/33446 34152/36684/33447 34148/36685/33448
+f 34148/36685/33448 34152/36684/33447 37611/36309/33079 37610/36305/33075
+f 34151/36683/33446 39266/36673/33436 39265/36672/33435 34152/36684/33447
+f 34152/36684/33447 39265/36672/33435 40451/36291/33061 37611/36309/33079
+f 34147/36682/33445 34148/36685/33448 34153/36686/33449 34149/36687/33450
+f 34149/36687/33450 34153/36686/33449 39268/36688/33451 39269/36689/33452
+f 34148/36685/33448 37610/36305/33075 37609/36304/33074 34153/36686/33449
+f 34153/36686/33449 37609/36304/33074 40452/36307/33077 39268/36688/33451
+f 34147/36682/33445 34149/36687/33450 34154/36690/33453 34150/36691/33454
+f 34150/36691/33454 34154/36690/33453 37681/36692/33455 37682/36693/33456
+f 34149/36687/33450 39269/36689/33452 39270/36694/33457 34154/36690/33453
+f 34154/36690/33453 39270/36694/33457 40476/36695/33458 37681/36692/33455
+f 34147/36682/33445 34150/36691/33454 34155/36696/33459 34151/36683/33446
+f 34151/36683/33446 34155/36696/33459 39267/36678/33441 39266/36673/33436
+f 34150/36691/33454 37682/36693/33456 37683/36697/33460 34155/36696/33459
+f 34155/36696/33459 37683/36697/33460 40475/36679/33442 39267/36678/33441
+f 34156/36698/33461 34160/36699/33462 34161/36700/33463 34157/36701/33464
+f 34157/36701/33464 34161/36700/33463 37614/36325/33095 37613/36321/33091
+f 34160/36699/33462 39269/36689/33452 39268/36688/33451 34161/36700/33463
+f 34161/36700/33463 39268/36688/33451 40452/36307/33077 37614/36325/33095
+f 34156/36698/33461 34157/36701/33464 34162/36702/33465 34158/36703/33466
+f 34158/36703/33466 34162/36702/33465 39271/36704/33467 39272/36705/33468
+f 34157/36701/33464 37613/36321/33091 37612/36320/33090 34162/36702/33465
+f 34162/36702/33465 37612/36320/33090 40453/36323/33093 39271/36704/33467
+f 34156/36698/33461 34158/36703/33466 34163/36706/33469 34159/36707/33470
+f 34159/36707/33470 34163/36706/33469 37684/36708/33471 37685/36709/33472
+f 34158/36703/33466 39272/36705/33468 39273/36710/33473 34163/36706/33469
+f 34163/36706/33469 39273/36710/33473 40477/36711/33474 37684/36708/33471
+f 34156/36698/33461 34159/36707/33470 34164/36712/33475 34160/36699/33462
+f 34160/36699/33462 34164/36712/33475 39270/36694/33457 39269/36689/33452
+f 34159/36707/33470 37685/36709/33472 37686/36713/33476 34164/36712/33475
+f 34164/36712/33475 37686/36713/33476 40476/36695/33458 39270/36694/33457
+f 34165/36714/33477 34169/36715/33478 34170/36716/33479 34166/36717/33480
+f 34166/36717/33480 34170/36716/33479 37617/36341/33111 37616/36337/33107
+f 34169/36715/33478 39272/36705/33468 39271/36704/33467 34170/36716/33479
+f 34170/36716/33479 39271/36704/33467 40453/36323/33093 37617/36341/33111
+f 34165/36714/33477 34166/36717/33480 34171/36718/33481 34167/36719/33482
+f 34167/36719/33482 34171/36718/33481 39274/36720/33483 39275/36721/33484
+f 34166/36717/33480 37616/36337/33107 37615/36336/33106 34171/36718/33481
+f 34171/36718/33481 37615/36336/33106 40454/36339/33109 39274/36720/33483
+f 34165/36714/33477 34167/36719/33482 34172/36722/33485 34168/36723/33486
+f 34168/36723/33486 34172/36722/33485 37687/36724/33487 37688/36725/33488
+f 34167/36719/33482 39275/36721/33484 39276/36726/33489 34172/36722/33485
+f 34172/36722/33485 39276/36726/33489 40478/36727/33490 37687/36724/33487
+f 34165/36714/33477 34168/36723/33486 34173/36728/33491 34169/36715/33478
+f 34169/36715/33478 34173/36728/33491 39273/36710/33473 39272/36705/33468
+f 34168/36723/33486 37688/36725/33488 37689/36729/33492 34173/36728/33491
+f 34173/36728/33491 37689/36729/33492 40477/36711/33474 39273/36710/33473
+f 34174/36730/33493 34178/36731/33494 34179/36732/33495 34175/36733/33496
+f 34175/36733/33496 34179/36732/33495 37620/36357/33126 37619/36353/33123
+f 34178/36731/33494 39275/36721/33484 39274/36720/33483 34179/36732/33495
+f 34179/36732/33495 39274/36720/33483 40454/36339/33109 37620/36357/33126
+f 34174/36730/33493 34175/36733/33496 34180/36734/33497 34176/36735/33498
+f 34176/36735/33498 34180/36734/33497 39277/36736/33499 39278/36737/33500
+f 34175/36733/33496 37619/36353/33123 37618/36352/33122 34180/36734/33497
+f 34180/36734/33497 37618/36352/33122 40455/36355/1136 39277/36736/33499
+f 34174/36730/33493 34176/36735/33498 34181/36738/33501 34177/36739/33502
+f 34177/36739/33502 34181/36738/33501 37690/36740/33503 37691/36741/33504
+f 34176/36735/33498 39278/36737/33500 39279/36742/33505 34181/36738/33501
+f 34181/36738/33501 39279/36742/33505 40479/36743/33506 37690/36740/33503
+f 34174/36730/33493 34177/36739/33502 34182/36744/33507 34178/36731/33494
+f 34178/36731/33494 34182/36744/33507 39276/36726/33489 39275/36721/33484
+f 34177/36739/33502 37691/36741/33504 37692/36745/33508 34182/36744/33507
+f 34182/36744/33507 37692/36745/33508 40478/36727/33490 39276/36726/33489
+f 34183/36746/33509 34187/36747/33510 34188/36748/33511 34184/36749/33512
+f 34184/36749/33512 34188/36748/33511 37623/36373/33142 37622/36369/33138
+f 34187/36747/33510 39278/36737/33500 39277/36736/33499 34188/36748/33511
+f 34188/36748/33511 39277/36736/33499 40455/36355/1136 37623/36373/33142
+f 34183/36746/33509 34184/36749/33512 34189/36750/33513 34185/36751/33514
+f 34185/36751/33514 34189/36750/33513 39280/36752/33515 39281/36753/33516
+f 34184/36749/33512 37622/36369/33138 37621/36368/33137 34189/36750/33513
+f 34189/36750/33513 37621/36368/33137 40456/36371/33140 39280/36752/33515
+f 34183/36746/33509 34185/36751/33514 34190/36754/33517 34186/36755/33518
+f 34186/36755/33518 34190/36754/33517 37693/36756/33519 37694/36757/33520
+f 34185/36751/33514 39281/36753/33516 39282/36758/33521 34190/36754/33517
+f 34190/36754/33517 39282/36758/33521 40480/36759/33522 37693/36756/33519
+f 34183/36746/33509 34186/36755/33518 34191/36760/33523 34187/36747/33510
+f 34187/36747/33510 34191/36760/33523 39279/36742/33505 39278/36737/33500
+f 34186/36755/33518 37694/36757/33520 37695/36761/33524 34191/36760/33523
+f 34191/36760/33523 37695/36761/33524 40479/36743/33506 39279/36742/33505
+f 34192/36762/33525 34196/36763/33526 34197/36764/33527 34193/36765/33528
+f 34193/36765/33528 34197/36764/33527 37626/36389/33158 37625/36385/33154
+f 34196/36763/33526 39281/36753/33516 39280/36752/33515 34197/36764/33527
+f 34197/36764/33527 39280/36752/33515 40456/36371/33140 37626/36389/33158
+f 34192/36762/33525 34193/36765/33528 34198/36766/33529 34194/36767/33530
+f 34194/36767/33530 34198/36766/33529 39283/36768/33531 39284/36769/33532
+f 34193/36765/33528 37625/36385/33154 37624/36384/33153 34198/36766/33529
+f 34198/36766/33529 37624/36384/33153 40457/36387/33156 39283/36768/33531
+f 34192/36762/33525 34194/36767/33530 34199/36770/33533 34195/36771/33534
+f 34195/36771/33534 34199/36770/33533 37696/36772/33535 37697/36773/33536
+f 34194/36767/33530 39284/36769/33532 39285/36774/33537 34199/36770/33533
+f 34199/36770/33533 39285/36774/33537 40481/36775/33538 37696/36772/33535
+f 34192/36762/33525 34195/36771/33534 34200/36776/33539 34196/36763/33526
+f 34196/36763/33526 34200/36776/33539 39282/36758/33521 39281/36753/33516
+f 34195/36771/33534 37697/36773/33536 37698/36777/33540 34200/36776/33539
+f 34200/36776/33539 37698/36777/33540 40480/36759/33522 39282/36758/33521
+f 34201/36778/33541 34205/36779/33542 34206/36780/33543 34202/36781/33544
+f 34202/36781/33544 34206/36780/33543 37629/36405/33174 37628/36401/33170
+f 34205/36779/33542 39284/36769/33532 39283/36768/33531 34206/36780/33543
+f 34206/36780/33543 39283/36768/33531 40457/36387/33156 37629/36405/33174
+f 34201/36778/33541 34202/36781/33544 34207/36782/33545 34203/36783/33546
+f 34203/36783/33546 34207/36782/33545 39286/36784/33547 39287/36785/33548
+f 34202/36781/33544 37628/36401/33170 37627/36400/33169 34207/36782/33545
+f 34207/36782/33545 37627/36400/33169 40458/36403/33172 39286/36784/33547
+f 34201/36778/33541 34203/36783/33546 34208/36786/33549 34204/36787/33550
+f 34204/36787/33550 34208/36786/33549 37699/36788/33551 37700/36789/33552
+f 34203/36783/33546 39287/36785/33548 39288/36790/33553 34208/36786/33549
+f 34208/36786/33549 39288/36790/33553 40482/36791/33554 37699/36788/33551
+f 34201/36778/33541 34204/36787/33550 34209/36792/33555 34205/36779/33542
+f 34205/36779/33542 34209/36792/33555 39285/36774/33537 39284/36769/33532
+f 34204/36787/33550 37700/36789/33552 37701/36793/33556 34209/36792/33555
+f 34209/36792/33555 37701/36793/33556 40481/36775/33538 39285/36774/33537
+f 34210/36794/33557 34214/36795/33558 34215/36796/33559 34211/36797/33560
+f 34211/36797/33560 34215/36796/33559 37632/36421/33190 37631/36417/33186
+f 34214/36795/33558 39287/36785/33548 39286/36784/33547 34215/36796/33559
+f 34215/36796/33559 39286/36784/33547 40458/36403/33172 37632/36421/33190
+f 34210/36794/33557 34211/36797/33560 34216/36798/33561 34212/36799/33562
+f 34212/36799/33562 34216/36798/33561 39289/36800/33563 39290/36801/33564
+f 34211/36797/33560 37631/36417/33186 37630/36416/33185 34216/36798/33561
+f 34216/36798/33561 37630/36416/33185 40459/36419/33188 39289/36800/33563
+f 34210/36794/33557 34212/36799/33562 34217/36802/33565 34213/36803/33566
+f 34213/36803/33566 34217/36802/33565 37702/36804/33567 37703/36805/33568
+f 34212/36799/33562 39290/36801/33564 39291/36806/33569 34217/36802/33565
+f 34217/36802/33565 39291/36806/33569 40483/36807/33570 37702/36804/33567
+f 34210/36794/33557 34213/36803/33566 34218/36808/33571 34214/36795/33558
+f 34214/36795/33558 34218/36808/33571 39288/36790/33553 39287/36785/33548
+f 34213/36803/33566 37703/36805/33568 37704/36809/33572 34218/36808/33571
+f 34218/36808/33571 37704/36809/33572 40482/36791/33554 39288/36790/33553
+f 34219/36810/33573 34223/36811/33574 34224/36812/33575 34220/36813/33576
+f 34220/36813/33576 34224/36812/33575 37635/36437/33206 37634/36433/33202
+f 34223/36811/33574 39290/36801/33564 39289/36800/33563 34224/36812/33575
+f 34224/36812/33575 39289/36800/33563 40459/36419/33188 37635/36437/33206
+f 34219/36810/33573 34220/36813/33576 34225/36814/33577 34221/36815/33578
+f 34221/36815/33578 34225/36814/33577 39292/36816/33579 39293/36817/33580
+f 34220/36813/33576 37634/36433/33202 37633/36432/33201 34225/36814/33577
+f 34225/36814/33577 37633/36432/33201 40460/36435/33204 39292/36816/33579
+f 34219/36810/33573 34221/36815/33578 34226/36818/33581 34222/36819/33582
+f 34222/36819/33582 34226/36818/33581 37705/36820/33583 37706/36821/33584
+f 34221/36815/33578 39293/36817/33580 39294/36822/33585 34226/36818/33581
+f 34226/36818/33581 39294/36822/33585 40484/36823/33586 37705/36820/33583
+f 34219/36810/33573 34222/36819/33582 34227/36824/33587 34223/36811/33574
+f 34223/36811/33574 34227/36824/33587 39291/36806/33569 39290/36801/33564
+f 34222/36819/33582 37706/36821/33584 37707/36825/33588 34227/36824/33587
+f 34227/36824/33587 37707/36825/33588 40483/36807/33570 39291/36806/33569
+f 34228/36826/33589 34232/36827/33590 34233/36828/33591 34229/36829/33592
+f 34229/36829/33592 34233/36828/33591 37638/36453/33221 37637/36449/33218
+f 34232/36827/33590 39293/36817/33580 39292/36816/33579 34233/36828/33591
+f 34233/36828/33591 39292/36816/33579 40460/36435/33204 37638/36453/33221
+f 34228/36826/33589 34229/36829/33592 34234/36830/33593 34230/36831/33594
+f 34230/36831/33594 34234/36830/33593 39295/36832/33595 39296/36833/33596
+f 34229/36829/33592 37637/36449/33218 37636/36448/33217 34234/36830/33593
+f 34234/36830/33593 37636/36448/33217 40461/36451/28954 39295/36832/33595
+f 34228/36826/33589 34230/36831/33594 34235/36834/33597 34231/36835/33598
+f 34231/36835/33598 34235/36834/33597 37708/36836/33599 37709/36837/33600
+f 34230/36831/33594 39296/36833/33596 39297/36838/33601 34235/36834/33597
+f 34235/36834/33597 39297/36838/33601 40485/36839/33602 37708/36836/33599
+f 34228/36826/33589 34231/36835/33598 34236/36840/33603 34232/36827/33590
+f 34232/36827/33590 34236/36840/33603 39294/36822/33585 39293/36817/33580
+f 34231/36835/33598 37709/36837/33600 37710/36841/33604 34236/36840/33603
+f 34236/36840/33603 37710/36841/33604 40484/36823/33586 39294/36822/33585
+f 34237/36842/33605 34241/36843/33606 34242/36844/33607 34238/36845/33608
+f 34238/36845/33608 34242/36844/33607 37641/36469/33237 37640/36465/33233
+f 34241/36843/33606 39296/36833/33596 39295/36832/33595 34242/36844/33607
+f 34242/36844/33607 39295/36832/33595 40461/36451/28954 37641/36469/33237
+f 34237/36842/33605 34238/36845/33608 34243/36846/33609 34239/36847/33610
+f 34239/36847/33610 34243/36846/33609 39298/36848/33611 39299/36849/33612
+f 34238/36845/33608 37640/36465/33233 37639/36464/33232 34243/36846/33609
+f 34243/36846/33609 37639/36464/33232 40462/36467/33235 39298/36848/33611
+f 34237/36842/33605 34239/36847/33610 34244/36850/33613 34240/36851/33614
+f 34240/36851/33614 34244/36850/33613 37711/36852/33615 37712/36853/33616
+f 34239/36847/33610 39299/36849/33612 39300/36854/33617 34244/36850/33613
+f 34244/36850/33613 39300/36854/33617 40486/36855/33618 37711/36852/33615
+f 34237/36842/33605 34240/36851/33614 34245/36856/33619 34241/36843/33606
+f 34241/36843/33606 34245/36856/33619 39297/36838/33601 39296/36833/33596
+f 34240/36851/33614 37712/36853/33616 37713/36857/33620 34245/36856/33619
+f 34245/36856/33619 37713/36857/33620 40485/36839/33602 39297/36838/33601
+f 34246/36858/33621 34250/36859/33622 34251/36860/33623 34247/36861/33624
+f 34247/36861/33624 34251/36860/33623 37644/36485/33253 37643/36481/33249
+f 34250/36859/33622 39299/36849/33612 39298/36848/33611 34251/36860/33623
+f 34251/36860/33623 39298/36848/33611 40462/36467/33235 37644/36485/33253
+f 34246/36858/33621 34247/36861/33624 34252/36862/33625 34248/36863/33626
+f 34248/36863/33626 34252/36862/33625 39301/36864/33627 39302/36865/33628
+f 34247/36861/33624 37643/36481/33249 37642/36480/33248 34252/36862/33625
+f 34252/36862/33625 37642/36480/33248 40463/36483/33251 39301/36864/33627
+f 34246/36858/33621 34248/36863/33626 34253/36866/33629 34249/36867/33630
+f 34249/36867/33630 34253/36866/33629 37714/36868/33631 37715/36869/33632
+f 34248/36863/33626 39302/36865/33628 39303/36870/33633 34253/36866/33629
+f 34253/36866/33629 39303/36870/33633 40487/36871/33634 37714/36868/33631
+f 34246/36858/33621 34249/36867/33630 34254/36872/33635 34250/36859/33622
+f 34250/36859/33622 34254/36872/33635 39300/36854/33617 39299/36849/33612
+f 34249/36867/33630 37715/36869/33632 37716/36873/33636 34254/36872/33635
+f 34254/36872/33635 37716/36873/33636 40486/36855/33618 39300/36854/33617
+f 34255/36874/33637 34259/36875/33638 34260/36876/33639 34256/36877/33640
+f 34256/36877/33640 34260/36876/33639 37647/36501/33269 37646/36497/33265
+f 34259/36875/33638 39302/36865/33628 39301/36864/33627 34260/36876/33639
+f 34260/36876/33639 39301/36864/33627 40463/36483/33251 37647/36501/33269
+f 34255/36874/33637 34256/36877/33640 34261/36878/33641 34257/36879/33642
+f 34257/36879/33642 34261/36878/33641 39304/36880/33643 39305/36881/33644
+f 34256/36877/33640 37646/36497/33265 37645/36496/33264 34261/36878/33641
+f 34261/36878/33641 37645/36496/33264 40464/36499/33267 39304/36880/33643
+f 34255/36874/33637 34257/36879/33642 34262/36882/33645 34258/36883/33646
+f 34258/36883/33646 34262/36882/33645 37717/36884/33647 37718/36885/33648
+f 34257/36879/33642 39305/36881/33644 39306/36886/33649 34262/36882/33645
+f 34262/36882/33645 39306/36886/33649 40488/36887/33650 37717/36884/33647
+f 34255/36874/33637 34258/36883/33646 34263/36888/33651 34259/36875/33638
+f 34259/36875/33638 34263/36888/33651 39303/36870/33633 39302/36865/33628
+f 34258/36883/33646 37718/36885/33648 37719/36889/33652 34263/36888/33651
+f 34263/36888/33651 37719/36889/33652 40487/36871/33634 39303/36870/33633
+f 34264/36890/33653 34268/36891/33654 34269/36892/33655 34265/36893/33656
+f 34265/36893/33656 34269/36892/33655 37650/36517/33285 37649/36513/33281
+f 34268/36891/33654 39305/36881/33644 39304/36880/33643 34269/36892/33655
+f 34269/36892/33655 39304/36880/33643 40464/36499/33267 37650/36517/33285
+f 34264/36890/33653 34265/36893/33656 34270/36894/33657 34266/36895/33658
+f 34266/36895/33658 34270/36894/33657 39307/36896/33659 39308/36897/33660
+f 34265/36893/33656 37649/36513/33281 37648/36512/33280 34270/36894/33657
+f 34270/36894/33657 37648/36512/33280 40465/36515/33283 39307/36896/33659
+f 34264/36890/33653 34266/36895/33658 34271/36898/33661 34267/36899/33662
+f 34267/36899/33662 34271/36898/33661 37720/36900/33663 37721/36901/33664
+f 34266/36895/33658 39308/36897/33660 39309/36902/33665 34271/36898/33661
+f 34271/36898/33661 39309/36902/33665 40489/36903/33666 37720/36900/33663
+f 34264/36890/33653 34267/36899/33662 34272/36904/33667 34268/36891/33654
+f 34268/36891/33654 34272/36904/33667 39306/36886/33649 39305/36881/33644
+f 34267/36899/33662 37721/36901/33664 37722/36905/33668 34272/36904/33667
+f 34272/36904/33667 37722/36905/33668 40488/36887/33650 39306/36886/33649
+f 34273/36906/33669 34277/36907/33670 34278/36908/33671 34274/36909/33672
+f 34274/36909/33672 34278/36908/33671 37653/36533/33301 37652/36529/33297
+f 34277/36907/33670 39308/36897/33660 39307/36896/33659 34278/36908/33671
+f 34278/36908/33671 39307/36896/33659 40465/36515/33283 37653/36533/33301
+f 34273/36906/33669 34274/36909/33672 34279/36910/33673 34275/36911/33674
+f 34275/36911/33674 34279/36910/33673 39310/36912/33675 39311/36913/33676
+f 34274/36909/33672 37652/36529/33297 37651/36528/33296 34279/36910/33673
+f 34279/36910/33673 37651/36528/33296 40466/36531/33299 39310/36912/33675
+f 34273/36906/33669 34275/36911/33674 34280/36914/33677 34276/36915/33678
+f 34276/36915/33678 34280/36914/33677 37723/36916/33679 37724/36917/33680
+f 34275/36911/33674 39311/36913/33676 39312/36918/33681 34280/36914/33677
+f 34280/36914/33677 39312/36918/33681 40490/36919/33682 37723/36916/33679
+f 34273/36906/33669 34276/36915/33678 34281/36920/33683 34277/36907/33670
+f 34277/36907/33670 34281/36920/33683 39309/36902/33665 39308/36897/33660
+f 34276/36915/33678 37724/36917/33680 37725/36921/33684 34281/36920/33683
+f 34281/36920/33683 37725/36921/33684 40489/36903/33666 39309/36902/33665
+f 34282/36922/33685 34286/36923/33686 34287/36924/33687 34283/36925/33688
+f 34283/36925/33688 34287/36924/33687 37656/36549/33316 37655/36545/33313
+f 34286/36923/33686 39311/36913/33676 39310/36912/33675 34287/36924/33687
+f 34287/36924/33687 39310/36912/33675 40466/36531/33299 37656/36549/33316
+f 34282/36922/33685 34283/36925/33688 34288/36926/33689 34284/36927/33690
+f 34284/36927/33690 34288/36926/33689 39313/36928/33691 39314/36929/33692
+f 34283/36925/33688 37655/36545/33313 37654/36544/33312 34288/36926/33689
+f 34288/36926/33689 37654/36544/33312 40467/36547/170 39313/36928/33691
+f 34282/36922/33685 34284/36927/33690 34289/36930/33693 34285/36931/33694
+f 34285/36931/33694 34289/36930/33693 37726/36932/33695 37727/36933/33696
+f 34284/36927/33690 39314/36929/33692 39315/36934/33697 34289/36930/33693
+f 34289/36930/33693 39315/36934/33697 40491/36935/33698 37726/36932/33695
+f 34282/36922/33685 34285/36931/33694 34290/36936/33699 34286/36923/33686
+f 34286/36923/33686 34290/36936/33699 39312/36918/33681 39311/36913/33676
+f 34285/36931/33694 37727/36933/33696 37728/36937/33700 34290/36936/33699
+f 34290/36936/33699 37728/36937/33700 40490/36919/33682 39312/36918/33681
+f 34291/36938/33701 34295/36939/33702 34296/36940/33703 34292/36941/33704
+f 34292/36941/33704 34296/36940/33703 37659/36565/33328 37658/36561/33326
+f 34295/36939/33702 39314/36929/33692 39313/36928/33691 34296/36940/33703
+f 34296/36940/33703 39313/36928/33691 40467/36547/170 37659/36565/33328
+f 34291/36938/33701 34292/36941/33704 34297/36942/33705 34293/36943/33706
+f 34293/36943/33706 34297/36942/33705 39246/36944/33334 39245/36945/33333
+f 34292/36941/33704 37658/36561/33326 37657/36560/33325 34297/36942/33705
+f 34297/36942/33705 37657/36560/33325 40444/36563/32968 39246/36944/33334
+f 34291/36938/33701 34293/36943/33706 34298/36946/33707 34294/36947/33708
+f 34294/36947/33708 34298/36946/33707 37729/36948/33709 37730/36949/33710
+f 34293/36943/33706 39245/36945/33333 39244/36950/33346 34298/36946/33707
+f 34298/36946/33707 39244/36950/33346 40468/36951/33348 37729/36948/33709
+f 34291/36938/33701 34294/36947/33708 34299/36952/33711 34295/36939/33702
+f 34295/36939/33702 34299/36952/33711 39315/36934/33697 39314/36929/33692
+f 34294/36947/33708 37730/36949/33710 37731/36953/33712 34299/36952/33711
+f 34299/36952/33711 37731/36953/33712 40491/36935/33698 39315/36934/33697
+f 34300/36954/33713 34304/36955/33714 34305/36956/33715 34301/36957/33716
+f 34301/36957/33716 34305/36956/33715 37662/36584/33347 37661/36579/33342
+f 34304/36955/33714 39317/36958/33717 39318/36959/33718 34305/36956/33715
+f 34305/36956/33715 39318/36959/33718 40468/36585/33348 37662/36584/33347
+f 34300/36954/33713 34301/36957/33716 34306/36960/33719 34302/36961/33720
+f 34302/36961/33720 34306/36960/33719 39319/36962/33721 39320/36963/33722
+f 34301/36957/33716 37661/36579/33342 37660/36578/33341 34306/36960/33719
+f 34306/36960/33719 37660/36578/33341 40469/36581/33344 39319/36962/33721
+f 34300/36954/33713 34302/36961/33720 34307/36964/33723 34303/36965/33724
+f 34303/36965/33724 34307/36964/33723 37732/36966/33725 37733/36967/33726
+f 34302/36961/33720 39320/36963/33722 39321/36968/33727 34307/36964/33723
+f 34307/36964/33723 39321/36968/33727 40493/36969/33728 37732/36966/33725
+f 34300/36954/33713 34303/36965/33724 34308/36970/33729 34304/36955/33714
+f 34304/36955/33714 34308/36970/33729 39316/36971/33730 39317/36958/33717
+f 34303/36965/33724 37733/36967/33726 37734/36972/33731 34308/36970/33729
+f 34308/36970/33729 37734/36972/33731 40492/36973/33732 39316/36971/33730
+f 34309/36974/33733 34313/36975/33734 34314/36976/33735 34310/36977/33736
+f 34310/36977/33736 34314/36976/33735 37665/36601/33364 37664/36597/33360
+f 34313/36975/33734 39320/36963/33722 39319/36962/33721 34314/36976/33735
+f 34314/36976/33735 39319/36962/33721 40469/36581/33344 37665/36601/33364
+f 34309/36974/33733 34310/36977/33736 34315/36978/33737 34311/36979/33738
+f 34311/36979/33738 34315/36978/33737 39322/36980/33739 39323/36981/33740
+f 34310/36977/33736 37664/36597/33360 37663/36596/33359 34315/36978/33737
+f 34315/36978/33737 37663/36596/33359 40470/36599/33362 39322/36980/33739
+f 34309/36974/33733 34311/36979/33738 34316/36982/33741 34312/36983/33742
+f 34312/36983/33742 34316/36982/33741 37735/36984/33743 37736/36985/33744
+f 34311/36979/33738 39323/36981/33740 39324/36986/33745 34316/36982/33741
+f 34316/36982/33741 39324/36986/33745 40494/36987/33746 37735/36984/33743
+f 34309/36974/33733 34312/36983/33742 34317/36988/33747 34313/36975/33734
+f 34313/36975/33734 34317/36988/33747 39321/36968/33727 39320/36963/33722
+f 34312/36983/33742 37736/36985/33744 37737/36989/33748 34317/36988/33747
+f 34317/36988/33747 37737/36989/33748 40493/36969/33728 39321/36968/33727
+f 34318/36990/33749 34322/36991/33750 34323/36992/33751 34319/36993/33752
+f 34319/36993/33752 34323/36992/33751 37668/36617/33380 37667/36613/33376
+f 34322/36991/33750 39323/36981/33740 39322/36980/33739 34323/36992/33751
+f 34323/36992/33751 39322/36980/33739 40470/36599/33362 37668/36617/33380
+f 34318/36990/33749 34319/36993/33752 34324/36994/33753 34320/36995/33754
+f 34320/36995/33754 34324/36994/33753 39325/36996/33755 39326/36997/33756
+f 34319/36993/33752 37667/36613/33376 37666/36612/33375 34324/36994/33753
+f 34324/36994/33753 37666/36612/33375 40471/36615/33378 39325/36996/33755
+f 34318/36990/33749 34320/36995/33754 34325/36998/33757 34321/36999/33758
+f 34321/36999/33758 34325/36998/33757 37738/37000/33759 37739/37001/33760
+f 34320/36995/33754 39326/36997/33756 39327/37002/33761 34325/36998/33757
+f 34325/36998/33757 39327/37002/33761 40495/37003/33762 37738/37000/33759
+f 34318/36990/33749 34321/36999/33758 34326/37004/33763 34322/36991/33750
+f 34322/36991/33750 34326/37004/33763 39324/36986/33745 39323/36981/33740
+f 34321/36999/33758 37739/37001/33760 37740/37005/33764 34326/37004/33763
+f 34326/37004/33763 37740/37005/33764 40494/36987/33746 39324/36986/33745
+f 34327/37006/33765 34331/37007/33766 34332/37008/33767 34328/37009/33768
+f 34328/37009/33768 34332/37008/33767 37671/36633/33396 37670/36629/33392
+f 34331/37007/33766 39326/36997/33756 39325/36996/33755 34332/37008/33767
+f 34332/37008/33767 39325/36996/33755 40471/36615/33378 37671/36633/33396
+f 34327/37006/33765 34328/37009/33768 34333/37010/33769 34329/37011/33770
+f 34329/37011/33770 34333/37010/33769 39328/37012/33771 39329/37013/33772
+f 34328/37009/33768 37670/36629/33392 37669/36628/33391 34333/37010/33769
+f 34333/37010/33769 37669/36628/33391 40472/36631/33394 39328/37012/33771
+f 34327/37006/33765 34329/37011/33770 34334/37014/33773 34330/37015/33774
+f 34330/37015/33774 34334/37014/33773 37741/37016/33775 37742/37017/33776
+f 34329/37011/33770 39329/37013/33772 39330/37018/33777 34334/37014/33773
+f 34334/37014/33773 39330/37018/33777 40496/37019/33778 37741/37016/33775
+f 34327/37006/33765 34330/37015/33774 34335/37020/33779 34331/37007/33766
+f 34331/37007/33766 34335/37020/33779 39327/37002/33761 39326/36997/33756
+f 34330/37015/33774 37742/37017/33776 37743/37021/33780 34335/37020/33779
+f 34335/37020/33779 37743/37021/33780 40495/37003/33762 39327/37002/33761
+f 34336/37022/33781 34340/37023/33782 34341/37024/33783 34337/37025/33784
+f 34337/37025/33784 34341/37024/33783 37674/36649/33412 37673/36645/33408
+f 34340/37023/33782 39329/37013/33772 39328/37012/33771 34341/37024/33783
+f 34341/37024/33783 39328/37012/33771 40472/36631/33394 37674/36649/33412
+f 34336/37022/33781 34337/37025/33784 34342/37026/33785 34338/37027/33786
+f 34338/37027/33786 34342/37026/33785 39331/37028/33787 39332/37029/33788
+f 34337/37025/33784 37673/36645/33408 37672/36644/33407 34342/37026/33785
+f 34342/37026/33785 37672/36644/33407 40473/36647/33410 39331/37028/33787
+f 34336/37022/33781 34338/37027/33786 34343/37030/33789 34339/37031/33790
+f 34339/37031/33790 34343/37030/33789 37744/37032/33791 37745/37033/33792
+f 34338/37027/33786 39332/37029/33788 39333/37034/33793 34343/37030/33789
+f 34343/37030/33789 39333/37034/33793 40497/37035/33794 37744/37032/33791
+f 34336/37022/33781 34339/37031/33790 34344/37036/33795 34340/37023/33782
+f 34340/37023/33782 34344/37036/33795 39330/37018/33777 39329/37013/33772
+f 34339/37031/33790 37745/37033/33792 37746/37037/33796 34344/37036/33795
+f 34344/37036/33795 37746/37037/33796 40496/37019/33778 39330/37018/33777
+f 34345/37038/33797 34349/37039/33798 34350/37040/33799 34346/37041/33800
+f 34346/37041/33800 34350/37040/33799 37677/36665/33428 37676/36661/33424
+f 34349/37039/33798 39332/37029/33788 39331/37028/33787 34350/37040/33799
+f 34350/37040/33799 39331/37028/33787 40473/36647/33410 37677/36665/33428
+f 34345/37038/33797 34346/37041/33800 34351/37042/33801 34347/37043/33802
+f 34347/37043/33802 34351/37042/33801 39334/37044/33803 39335/37045/33804
+f 34346/37041/33800 37676/36661/33424 37675/36660/33423 34351/37042/33801
+f 34351/37042/33801 37675/36660/33423 40474/36663/33426 39334/37044/33803
+f 34345/37038/33797 34347/37043/33802 34352/37046/33805 34348/37047/33806
+f 34348/37047/33806 34352/37046/33805 37747/37048/33807 37748/37049/33808
+f 34347/37043/33802 39335/37045/33804 39336/37050/33809 34352/37046/33805
+f 34352/37046/33805 39336/37050/33809 40498/37051/33810 37747/37048/33807
+f 34345/37038/33797 34348/37047/33806 34353/37052/33811 34349/37039/33798
+f 34349/37039/33798 34353/37052/33811 39333/37034/33793 39332/37029/33788
+f 34348/37047/33806 37748/37049/33808 37749/37053/33812 34353/37052/33811
+f 34353/37052/33811 37749/37053/33812 40497/37035/33794 39333/37034/33793
+f 34354/37054/33813 34358/37055/33814 34359/37056/33815 34355/37057/33816
+f 34355/37057/33816 34359/37056/33815 37680/36681/33444 37679/36677/33440
+f 34358/37055/33814 39335/37045/33804 39334/37044/33803 34359/37056/33815
+f 34359/37056/33815 39334/37044/33803 40474/36663/33426 37680/36681/33444
+f 34354/37054/33813 34355/37057/33816 34360/37058/33817 34356/37059/33818
+f 34356/37059/33818 34360/37058/33817 39337/37060/33819 39338/37061/33820
+f 34355/37057/33816 37679/36677/33440 37678/36676/33439 34360/37058/33817
+f 34360/37058/33817 37678/36676/33439 40475/36679/33442 39337/37060/33819
+f 34354/37054/33813 34356/37059/33818 34361/37062/33821 34357/37063/33822
+f 34357/37063/33822 34361/37062/33821 37750/37064/33823 37751/37065/33824
+f 34356/37059/33818 39338/37061/33820 39339/37066/33825 34361/37062/33821
+f 34361/37062/33821 39339/37066/33825 40499/37067/33826 37750/37064/33823
+f 34354/37054/33813 34357/37063/33822 34362/37068/33827 34358/37055/33814
+f 34358/37055/33814 34362/37068/33827 39336/37050/33809 39335/37045/33804
+f 34357/37063/33822 37751/37065/33824 37752/37069/33828 34362/37068/33827
+f 34362/37068/33827 37752/37069/33828 40498/37051/33810 39336/37050/33809
+f 34363/37070/33829 34367/37071/33830 34368/37072/33831 34364/37073/33832
+f 34364/37073/33832 34368/37072/33831 37683/36697/33460 37682/36693/33456
+f 34367/37071/33830 39338/37061/33820 39337/37060/33819 34368/37072/33831
+f 34368/37072/33831 39337/37060/33819 40475/36679/33442 37683/36697/33460
+f 34363/37070/33829 34364/37073/33832 34369/37074/33833 34365/37075/33834
+f 34365/37075/33834 34369/37074/33833 39340/37076/33835 39341/37077/33836
+f 34364/37073/33832 37682/36693/33456 37681/36692/33455 34369/37074/33833
+f 34369/37074/33833 37681/36692/33455 40476/36695/33458 39340/37076/33835
+f 34363/37070/33829 34365/37075/33834 34370/37078/33837 34366/37079/33838
+f 34366/37079/33838 34370/37078/33837 37753/37080/33839 37754/37081/33840
+f 34365/37075/33834 39341/37077/33836 39342/37082/33841 34370/37078/33837
+f 34370/37078/33837 39342/37082/33841 40500/37083/33842 37753/37080/33839
+f 34363/37070/33829 34366/37079/33838 34371/37084/33843 34367/37071/33830
+f 34367/37071/33830 34371/37084/33843 39339/37066/33825 39338/37061/33820
+f 34366/37079/33838 37754/37081/33840 37755/37085/33844 34371/37084/33843
+f 34371/37084/33843 37755/37085/33844 40499/37067/33826 39339/37066/33825
+f 34372/37086/33845 34376/37087/33846 34377/37088/33847 34373/37089/33848
+f 34373/37089/33848 34377/37088/33847 37686/36713/33476 37685/36709/33472
+f 34376/37087/33846 39341/37077/33836 39340/37076/33835 34377/37088/33847
+f 34377/37088/33847 39340/37076/33835 40476/36695/33458 37686/36713/33476
+f 34372/37086/33845 34373/37089/33848 34378/37090/33849 34374/37091/33850
+f 34374/37091/33850 34378/37090/33849 39343/37092/33851 39344/37093/33852
+f 34373/37089/33848 37685/36709/33472 37684/36708/33471 34378/37090/33849
+f 34378/37090/33849 37684/36708/33471 40477/36711/33474 39343/37092/33851
+f 34372/37086/33845 34374/37091/33850 34379/37094/33853 34375/37095/33854
+f 34375/37095/33854 34379/37094/33853 37756/37096/33855 37757/37097/33856
+f 34374/37091/33850 39344/37093/33852 39345/37098/33857 34379/37094/33853
+f 34379/37094/33853 39345/37098/33857 40501/37099/33858 37756/37096/33855
+f 34372/37086/33845 34375/37095/33854 34380/37100/33859 34376/37087/33846
+f 34376/37087/33846 34380/37100/33859 39342/37082/33841 39341/37077/33836
+f 34375/37095/33854 37757/37097/33856 37758/37101/33860 34380/37100/33859
+f 34380/37100/33859 37758/37101/33860 40500/37083/33842 39342/37082/33841
+f 34381/37102/33861 34385/37103/33862 34386/37104/33863 34382/37105/33864
+f 34382/37105/33864 34386/37104/33863 37689/36729/33492 37688/36725/33488
+f 34385/37103/33862 39344/37093/33852 39343/37092/33851 34386/37104/33863
+f 34386/37104/33863 39343/37092/33851 40477/36711/33474 37689/36729/33492
+f 34381/37102/33861 34382/37105/33864 34387/37106/33865 34383/37107/33866
+f 34383/37107/33866 34387/37106/33865 39346/37108/33867 39347/37109/33868
+f 34382/37105/33864 37688/36725/33488 37687/36724/33487 34387/37106/33865
+f 34387/37106/33865 37687/36724/33487 40478/36727/33490 39346/37108/33867
+f 34381/37102/33861 34383/37107/33866 34388/37110/33869 34384/37111/33870
+f 34384/37111/33870 34388/37110/33869 37759/37112/33871 37760/37113/33872
+f 34383/37107/33866 39347/37109/33868 39348/37114/33873 34388/37110/33869
+f 34388/37110/33869 39348/37114/33873 40502/37115/33874 37759/37112/33871
+f 34381/37102/33861 34384/37111/33870 34389/37116/33875 34385/37103/33862
+f 34385/37103/33862 34389/37116/33875 39345/37098/33857 39344/37093/33852
+f 34384/37111/33870 37760/37113/33872 37761/37117/33876 34389/37116/33875
+f 34389/37116/33875 37761/37117/33876 40501/37099/33858 39345/37098/33857
+f 34390/37118/33877 34394/37119/33878 34395/37120/33879 34391/37121/33880
+f 34391/37121/33880 34395/37120/33879 37692/36745/33508 37691/36741/33504
+f 34394/37119/33878 39347/37109/33868 39346/37108/33867 34395/37120/33879
+f 34395/37120/33879 39346/37108/33867 40478/36727/33490 37692/36745/33508
+f 34390/37118/33877 34391/37121/33880 34396/37122/33881 34392/37123/33882
+f 34392/37123/33882 34396/37122/33881 39349/37124/33883 39350/37125/33884
+f 34391/37121/33880 37691/36741/33504 37690/36740/33503 34396/37122/33881
+f 34396/37122/33881 37690/36740/33503 40479/36743/33506 39349/37124/33883
+f 34390/37118/33877 34392/37123/33882 34397/37126/33885 34393/37127/33886
+f 34393/37127/33886 34397/37126/33885 37762/37128/33887 37763/37129/33888
+f 34392/37123/33882 39350/37125/33884 39351/37130/33889 34397/37126/33885
+f 34397/37126/33885 39351/37130/33889 40503/37131/33890 37762/37128/33887
+f 34390/37118/33877 34393/37127/33886 34398/37132/33891 34394/37119/33878
+f 34394/37119/33878 34398/37132/33891 39348/37114/33873 39347/37109/33868
+f 34393/37127/33886 37763/37129/33888 37764/37133/33892 34398/37132/33891
+f 34398/37132/33891 37764/37133/33892 40502/37115/33874 39348/37114/33873
+f 34399/37134/33893 34403/37135/33894 34404/37136/33895 34400/37137/33896
+f 34400/37137/33896 34404/37136/33895 37695/36761/33524 37694/36757/33520
+f 34403/37135/33894 39350/37125/33884 39349/37124/33883 34404/37136/33895
+f 34404/37136/33895 39349/37124/33883 40479/36743/33506 37695/36761/33524
+f 34399/37134/33893 34400/37137/33896 34405/37138/33897 34401/37139/33898
+f 34401/37139/33898 34405/37138/33897 39352/37140/33899 39353/37141/33900
+f 34400/37137/33896 37694/36757/33520 37693/36756/33519 34405/37138/33897
+f 34405/37138/33897 37693/36756/33519 40480/36759/33522 39352/37140/33899
+f 34399/37134/33893 34401/37139/33898 34406/37142/33901 34402/37143/33902
+f 34402/37143/33902 34406/37142/33901 37765/37144/33903 37766/37145/33904
+f 34401/37139/33898 39353/37141/33900 39354/37146/33905 34406/37142/33901
+f 34406/37142/33901 39354/37146/33905 40504/37147/33906 37765/37144/33903
+f 34399/37134/33893 34402/37143/33902 34407/37148/33907 34403/37135/33894
+f 34403/37135/33894 34407/37148/33907 39351/37130/33889 39350/37125/33884
+f 34402/37143/33902 37766/37145/33904 37767/37149/33908 34407/37148/33907
+f 34407/37148/33907 37767/37149/33908 40503/37131/33890 39351/37130/33889
+f 34408/37150/33909 34412/37151/33910 34413/37152/33911 34409/37153/33912
+f 34409/37153/33912 34413/37152/33911 37698/36777/33540 37697/36773/33536
+f 34412/37151/33910 39353/37141/33900 39352/37140/33899 34413/37152/33911
+f 34413/37152/33911 39352/37140/33899 40480/36759/33522 37698/36777/33540
+f 34408/37150/33909 34409/37153/33912 34414/37154/33913 34410/37155/33914
+f 34410/37155/33914 34414/37154/33913 39355/37156/33915 39356/37157/33916
+f 34409/37153/33912 37697/36773/33536 37696/36772/33535 34414/37154/33913
+f 34414/37154/33913 37696/36772/33535 40481/36775/33538 39355/37156/33915
+f 34408/37150/33909 34410/37155/33914 34415/37158/33917 34411/37159/33918
+f 34411/37159/33918 34415/37158/33917 37768/37160/33919 37769/37161/33920
+f 34410/37155/33914 39356/37157/33916 39357/37162/33921 34415/37158/33917
+f 34415/37158/33917 39357/37162/33921 40505/37163/33922 37768/37160/33919
+f 34408/37150/33909 34411/37159/33918 34416/37164/33923 34412/37151/33910
+f 34412/37151/33910 34416/37164/33923 39354/37146/33905 39353/37141/33900
+f 34411/37159/33918 37769/37161/33920 37770/37165/33924 34416/37164/33923
+f 34416/37164/33923 37770/37165/33924 40504/37147/33906 39354/37146/33905
+f 34417/37166/33925 34421/37167/33926 34422/37168/33927 34418/37169/33928
+f 34418/37169/33928 34422/37168/33927 37701/36793/33556 37700/36789/33552
+f 34421/37167/33926 39356/37157/33916 39355/37156/33915 34422/37168/33927
+f 34422/37168/33927 39355/37156/33915 40481/36775/33538 37701/36793/33556
+f 34417/37166/33925 34418/37169/33928 34423/37170/33929 34419/37171/33930
+f 34419/37171/33930 34423/37170/33929 39358/37172/33931 39359/37173/33932
+f 34418/37169/33928 37700/36789/33552 37699/36788/33551 34423/37170/33929
+f 34423/37170/33929 37699/36788/33551 40482/36791/33554 39358/37172/33931
+f 34417/37166/33925 34419/37171/33930 34424/37174/33933 34420/37175/33934
+f 34420/37175/33934 34424/37174/33933 37771/37176/33935 37772/37177/33936
+f 34419/37171/33930 39359/37173/33932 39360/37178/33937 34424/37174/33933
+f 34424/37174/33933 39360/37178/33937 40506/37179/33938 37771/37176/33935
+f 34417/37166/33925 34420/37175/33934 34425/37180/33939 34421/37167/33926
+f 34421/37167/33926 34425/37180/33939 39357/37162/33921 39356/37157/33916
+f 34420/37175/33934 37772/37177/33936 37773/37181/33940 34425/37180/33939
+f 34425/37180/33939 37773/37181/33940 40505/37163/33922 39357/37162/33921
+f 34426/37182/33941 34430/37183/33942 34431/37184/33943 34427/37185/33944
+f 34427/37185/33944 34431/37184/33943 37704/36809/33572 37703/36805/33568
+f 34430/37183/33942 39359/37173/33932 39358/37172/33931 34431/37184/33943
+f 34431/37184/33943 39358/37172/33931 40482/36791/33554 37704/36809/33572
+f 34426/37182/33941 34427/37185/33944 34432/37186/33945 34428/37187/33946
+f 34428/37187/33946 34432/37186/33945 39361/37188/33947 39362/37189/33948
+f 34427/37185/33944 37703/36805/33568 37702/36804/33567 34432/37186/33945
+f 34432/37186/33945 37702/36804/33567 40483/36807/33570 39361/37188/33947
+f 34426/37182/33941 34428/37187/33946 34433/37190/33949 34429/37191/33950
+f 34429/37191/33950 34433/37190/33949 37774/37192/33951 37775/37193/33952
+f 34428/37187/33946 39362/37189/33948 39363/37194/33953 34433/37190/33949
+f 34433/37190/33949 39363/37194/33953 40507/37195/33954 37774/37192/33951
+f 34426/37182/33941 34429/37191/33950 34434/37196/33955 34430/37183/33942
+f 34430/37183/33942 34434/37196/33955 39360/37178/33937 39359/37173/33932
+f 34429/37191/33950 37775/37193/33952 37776/37197/33956 34434/37196/33955
+f 34434/37196/33955 37776/37197/33956 40506/37179/33938 39360/37178/33937
+f 34435/37198/33957 34439/37199/33958 34440/37200/33959 34436/37201/33960
+f 34436/37201/33960 34440/37200/33959 37707/36825/33588 37706/36821/33584
+f 34439/37199/33958 39362/37189/33948 39361/37188/33947 34440/37200/33959
+f 34440/37200/33959 39361/37188/33947 40483/36807/33570 37707/36825/33588
+f 34435/37198/33957 34436/37201/33960 34441/37202/33961 34437/37203/33962
+f 34437/37203/33962 34441/37202/33961 39364/37204/33963 39365/37205/33964
+f 34436/37201/33960 37706/36821/33584 37705/36820/33583 34441/37202/33961
+f 34441/37202/33961 37705/36820/33583 40484/36823/33586 39364/37204/33963
+f 34435/37198/33957 34437/37203/33962 34442/37206/33965 34438/37207/33966
+f 34438/37207/33966 34442/37206/33965 37777/37208/33967 37778/37209/33968
+f 34437/37203/33962 39365/37205/33964 39366/37210/33969 34442/37206/33965
+f 34442/37206/33965 39366/37210/33969 40508/37211/33970 37777/37208/33967
+f 34435/37198/33957 34438/37207/33966 34443/37212/33971 34439/37199/33958
+f 34439/37199/33958 34443/37212/33971 39363/37194/33953 39362/37189/33948
+f 34438/37207/33966 37778/37209/33968 37779/37213/33972 34443/37212/33971
+f 34443/37212/33971 37779/37213/33972 40507/37195/33954 39363/37194/33953
+f 34444/37214/33973 34448/37215/33974 34449/37216/33975 34445/37217/33976
+f 34445/37217/33976 34449/37216/33975 37710/36841/33604 37709/36837/33600
+f 34448/37215/33974 39365/37205/33964 39364/37204/33963 34449/37216/33975
+f 34449/37216/33975 39364/37204/33963 40484/36823/33586 37710/36841/33604
+f 34444/37214/33973 34445/37217/33976 34450/37218/33977 34446/37219/33978
+f 34446/37219/33978 34450/37218/33977 39367/37220/33979 39368/37221/33980
+f 34445/37217/33976 37709/36837/33600 37708/36836/33599 34450/37218/33977
+f 34450/37218/33977 37708/36836/33599 40485/36839/33602 39367/37220/33979
+f 34444/37214/33973 34446/37219/33978 34451/37222/33981 34447/37223/33982
+f 34447/37223/33982 34451/37222/33981 37780/37224/33983 37781/37225/33984
+f 34446/37219/33978 39368/37221/33980 39369/37226/33985 34451/37222/33981
+f 34451/37222/33981 39369/37226/33985 40509/37227/33986 37780/37224/33983
+f 34444/37214/33973 34447/37223/33982 34452/37228/33987 34448/37215/33974
+f 34448/37215/33974 34452/37228/33987 39366/37210/33969 39365/37205/33964
+f 34447/37223/33982 37781/37225/33984 37782/37229/33988 34452/37228/33987
+f 34452/37228/33987 37782/37229/33988 40508/37211/33970 39366/37210/33969
+f 34453/37230/33989 34457/37231/33990 34458/37232/33991 34454/37233/33992
+f 34454/37233/33992 34458/37232/33991 37713/36857/33620 37712/36853/33616
+f 34457/37231/33990 39368/37221/33980 39367/37220/33979 34458/37232/33991
+f 34458/37232/33991 39367/37220/33979 40485/36839/33602 37713/36857/33620
+f 34453/37230/33989 34454/37233/33992 34459/37234/33993 34455/37235/33994
+f 34455/37235/33994 34459/37234/33993 39370/37236/33995 39371/37237/33996
+f 34454/37233/33992 37712/36853/33616 37711/36852/33615 34459/37234/33993
+f 34459/37234/33993 37711/36852/33615 40486/36855/33618 39370/37236/33995
+f 34453/37230/33989 34455/37235/33994 34460/37238/33997 34456/37239/33998
+f 34456/37239/33998 34460/37238/33997 37783/37240/33999 37784/37241/34000
+f 34455/37235/33994 39371/37237/33996 39372/37242/34001 34460/37238/33997
+f 34460/37238/33997 39372/37242/34001 40510/37243/34002 37783/37240/33999
+f 34453/37230/33989 34456/37239/33998 34461/37244/34003 34457/37231/33990
+f 34457/37231/33990 34461/37244/34003 39369/37226/33985 39368/37221/33980
+f 34456/37239/33998 37784/37241/34000 37785/37245/34004 34461/37244/34003
+f 34461/37244/34003 37785/37245/34004 40509/37227/33986 39369/37226/33985
+f 34462/37246/34005 34466/37247/34006 34467/37248/34007 34463/37249/34008
+f 34463/37249/34008 34467/37248/34007 37716/36873/33636 37715/36869/33632
+f 34466/37247/34006 39371/37237/33996 39370/37236/33995 34467/37248/34007
+f 34467/37248/34007 39370/37236/33995 40486/36855/33618 37716/36873/33636
+f 34462/37246/34005 34463/37249/34008 34468/37250/34009 34464/37251/34010
+f 34464/37251/34010 34468/37250/34009 39373/37252/34011 39374/37253/34012
+f 34463/37249/34008 37715/36869/33632 37714/36868/33631 34468/37250/34009
+f 34468/37250/34009 37714/36868/33631 40487/36871/33634 39373/37252/34011
+f 34462/37246/34005 34464/37251/34010 34469/37254/34013 34465/37255/34014
+f 34465/37255/34014 34469/37254/34013 37786/37256/34015 37787/37257/34016
+f 34464/37251/34010 39374/37253/34012 39375/37258/34017 34469/37254/34013
+f 34469/37254/34013 39375/37258/34017 40511/37259/34018 37786/37256/34015
+f 34462/37246/34005 34465/37255/34014 34470/37260/34019 34466/37247/34006
+f 34466/37247/34006 34470/37260/34019 39372/37242/34001 39371/37237/33996
+f 34465/37255/34014 37787/37257/34016 37788/37261/34020 34470/37260/34019
+f 34470/37260/34019 37788/37261/34020 40510/37243/34002 39372/37242/34001
+f 34471/37262/34021 34475/37263/34022 34476/37264/34023 34472/37265/34024
+f 34472/37265/34024 34476/37264/34023 37719/36889/33652 37718/36885/33648
+f 34475/37263/34022 39374/37253/34012 39373/37252/34011 34476/37264/34023
+f 34476/37264/34023 39373/37252/34011 40487/36871/33634 37719/36889/33652
+f 34471/37262/34021 34472/37265/34024 34477/37266/34025 34473/37267/34026
+f 34473/37267/34026 34477/37266/34025 39376/37268/34027 39377/37269/34028
+f 34472/37265/34024 37718/36885/33648 37717/36884/33647 34477/37266/34025
+f 34477/37266/34025 37717/36884/33647 40488/36887/33650 39376/37268/34027
+f 34471/37262/34021 34473/37267/34026 34478/37270/34029 34474/37271/34030
+f 34474/37271/34030 34478/37270/34029 37789/37272/34031 37790/37273/34032
+f 34473/37267/34026 39377/37269/34028 39378/37274/34033 34478/37270/34029
+f 34478/37270/34029 39378/37274/34033 40512/37275/34034 37789/37272/34031
+f 34471/37262/34021 34474/37271/34030 34479/37276/34035 34475/37263/34022
+f 34475/37263/34022 34479/37276/34035 39375/37258/34017 39374/37253/34012
+f 34474/37271/34030 37790/37273/34032 37791/37277/34036 34479/37276/34035
+f 34479/37276/34035 37791/37277/34036 40511/37259/34018 39375/37258/34017
+f 34480/37278/34037 34484/37279/34038 34485/37280/34039 34481/37281/34040
+f 34481/37281/34040 34485/37280/34039 37722/36905/33668 37721/36901/33664
+f 34484/37279/34038 39377/37269/34028 39376/37268/34027 34485/37280/34039
+f 34485/37280/34039 39376/37268/34027 40488/36887/33650 37722/36905/33668
+f 34480/37278/34037 34481/37281/34040 34486/37282/34041 34482/37283/34042
+f 34482/37283/34042 34486/37282/34041 39379/37284/34043 39380/37285/34044
+f 34481/37281/34040 37721/36901/33664 37720/36900/33663 34486/37282/34041
+f 34486/37282/34041 37720/36900/33663 40489/36903/33666 39379/37284/34043
+f 34480/37278/34037 34482/37283/34042 34487/37286/34045 34483/37287/34046
+f 34483/37287/34046 34487/37286/34045 37792/37288/34047 37793/37289/34048
+f 34482/37283/34042 39380/37285/34044 39381/37290/34049 34487/37286/34045
+f 34487/37286/34045 39381/37290/34049 40513/37291/34050 37792/37288/34047
+f 34480/37278/34037 34483/37287/34046 34488/37292/34051 34484/37279/34038
+f 34484/37279/34038 34488/37292/34051 39378/37274/34033 39377/37269/34028
+f 34483/37287/34046 37793/37289/34048 37794/37293/34052 34488/37292/34051
+f 34488/37292/34051 37794/37293/34052 40512/37275/34034 39378/37274/34033
+f 34489/37294/34053 34493/37295/34054 34494/37296/34055 34490/37297/34056
+f 34490/37297/34056 34494/37296/34055 37725/36921/33684 37724/36917/33680
+f 34493/37295/34054 39380/37285/34044 39379/37284/34043 34494/37296/34055
+f 34494/37296/34055 39379/37284/34043 40489/36903/33666 37725/36921/33684
+f 34489/37294/34053 34490/37297/34056 34495/37298/34057 34491/37299/34058
+f 34491/37299/34058 34495/37298/34057 39382/37300/34059 39383/37301/34060
+f 34490/37297/34056 37724/36917/33680 37723/36916/33679 34495/37298/34057
+f 34495/37298/34057 37723/36916/33679 40490/36919/33682 39382/37300/34059
+f 34489/37294/34053 34491/37299/34058 34496/37302/34061 34492/37303/34062
+f 34492/37303/34062 34496/37302/34061 37795/37304/34063 37796/37305/34064
+f 34491/37299/34058 39383/37301/34060 39384/37306/34065 34496/37302/34061
+f 34496/37302/34061 39384/37306/34065 40514/37307/34066 37795/37304/34063
+f 34489/37294/34053 34492/37303/34062 34497/37308/34067 34493/37295/34054
+f 34493/37295/34054 34497/37308/34067 39381/37290/34049 39380/37285/34044
+f 34492/37303/34062 37796/37305/34064 37797/37309/34068 34497/37308/34067
+f 34497/37308/34067 37797/37309/34068 40513/37291/34050 39381/37290/34049
+f 34498/37310/34069 34502/37311/34070 34503/37312/34071 34499/37313/34072
+f 34499/37313/34072 34503/37312/34071 37728/36937/33700 37727/36933/33696
+f 34502/37311/34070 39383/37301/34060 39382/37300/34059 34503/37312/34071
+f 34503/37312/34071 39382/37300/34059 40490/36919/33682 37728/36937/33700
+f 34498/37310/34069 34499/37313/34072 34504/37314/34073 34500/37315/34074
+f 34500/37315/34074 34504/37314/34073 39385/37316/34075 39386/37317/34076
+f 34499/37313/34072 37727/36933/33696 37726/36932/33695 34504/37314/34073
+f 34504/37314/34073 37726/36932/33695 40491/36935/33698 39385/37316/34075
+f 34498/37310/34069 34500/37315/34074 34505/37318/34077 34501/37319/34078
+f 34501/37319/34078 34505/37318/34077 37798/37320/34079 37799/37321/34080
+f 34500/37315/34074 39386/37317/34076 39387/37322/34081 34505/37318/34077
+f 34505/37318/34077 39387/37322/34081 40515/37323/34082 37798/37320/34079
+f 34498/37310/34069 34501/37319/34078 34506/37324/34083 34502/37311/34070
+f 34502/37311/34070 34506/37324/34083 39384/37306/34065 39383/37301/34060
+f 34501/37319/34078 37799/37321/34080 37800/37325/34084 34506/37324/34083
+f 34506/37324/34083 37800/37325/34084 40514/37307/34066 39384/37306/34065
+f 34507/37326/34085 34511/37327/34086 34512/37328/34087 34508/37329/34088
+f 34508/37329/34088 34512/37328/34087 37731/36953/33712 37730/36949/33710
+f 34511/37327/34086 39386/37317/34076 39385/37316/34075 34512/37328/34087
+f 34512/37328/34087 39385/37316/34075 40491/36935/33698 37731/36953/33712
+f 34507/37326/34085 34508/37329/34088 34513/37330/34089 34509/37331/34090
+f 34509/37331/34090 34513/37330/34089 39318/37332/33718 39317/37333/33717
+f 34508/37329/34088 37730/36949/33710 37729/36948/33709 34513/37330/34089
+f 34513/37330/34089 37729/36948/33709 40468/36951/33348 39318/37332/33718
+f 34507/37326/34085 34509/37331/34090 34514/37334/34091 34510/37335/34092
+f 34510/37335/34092 34514/37334/34091 37801/37336/34093 37802/37337/34094
+f 34509/37331/34090 39317/37333/33717 39316/37338/33730 34514/37334/34091
+f 34514/37334/34091 39316/37338/33730 40492/37339/33732 37801/37336/34093
+f 34507/37326/34085 34510/37335/34092 34515/37340/34095 34511/37327/34086
+f 34511/37327/34086 34515/37340/34095 39387/37322/34081 39386/37317/34076
+f 34510/37335/34092 37802/37337/34094 37803/37341/34096 34515/37340/34095
+f 34515/37340/34095 37803/37341/34096 40515/37323/34082 39387/37322/34081
+f 34516/37342/34097 34520/37343/34098 34521/37344/34099 34517/37345/34100
+f 34517/37345/34100 34521/37344/34099 37734/36972/33731 37733/36967/33726
+f 34520/37343/34098 39389/37346/34101 39390/37347/34102 34521/37344/34099
+f 34521/37344/34099 39390/37347/34102 40492/36973/33732 37734/36972/33731
+f 34516/37342/34097 34517/37345/34100 34522/37348/34103 34518/37349/34104
+f 34518/37349/34104 34522/37348/34103 39391/37350/34105 39392/37351/34106
+f 34517/37345/34100 37733/36967/33726 37732/36966/33725 34522/37348/34103
+f 34522/37348/34103 37732/36966/33725 40493/36969/33728 39391/37350/34105
+f 34516/37342/34097 34518/37349/34104 34523/37352/34107 34519/37353/34108
+f 34519/37353/34108 34523/37352/34107 37804/37354/34109 37805/37355/34110
+f 34518/37349/34104 39392/37351/34106 39393/37356/34111 34523/37352/34107
+f 34523/37352/34107 39393/37356/34111 40517/37357/34112 37804/37354/34109
+f 34516/37342/34097 34519/37353/34108 34524/37358/34113 34520/37343/34098
+f 34520/37343/34098 34524/37358/34113 39388/37359/34114 39389/37346/34101
+f 34519/37353/34108 37805/37355/34110 37806/37360/34115 34524/37358/34113
+f 34524/37358/34113 37806/37360/34115 40516/37361/34116 39388/37359/34114
+f 34525/37362/34117 34529/37363/34118 34530/37364/34119 34526/37365/34120
+f 34526/37365/34120 34530/37364/34119 37737/36989/33748 37736/36985/33744
+f 34529/37363/34118 39392/37351/34106 39391/37350/34105 34530/37364/34119
+f 34530/37364/34119 39391/37350/34105 40493/36969/33728 37737/36989/33748
+f 34525/37362/34117 34526/37365/34120 34531/37366/34121 34527/37367/34122
+f 34527/37367/34122 34531/37366/34121 39394/37368/34123 39395/37369/34124
+f 34526/37365/34120 37736/36985/33744 37735/36984/33743 34531/37366/34121
+f 34531/37366/34121 37735/36984/33743 40494/36987/33746 39394/37368/34123
+f 34525/37362/34117 34527/37367/34122 34532/37370/34125 34528/37371/34126
+f 34528/37371/34126 34532/37370/34125 37807/37372/34127 37808/37373/34128
+f 34527/37367/34122 39395/37369/34124 39396/37374/34129 34532/37370/34125
+f 34532/37370/34125 39396/37374/34129 40518/37375/34130 37807/37372/34127
+f 34525/37362/34117 34528/37371/34126 34533/37376/34131 34529/37363/34118
+f 34529/37363/34118 34533/37376/34131 39393/37356/34111 39392/37351/34106
+f 34528/37371/34126 37808/37373/34128 37809/37377/34132 34533/37376/34131
+f 34533/37376/34131 37809/37377/34132 40517/37357/34112 39393/37356/34111
+f 34534/37378/34133 34538/37379/34134 34539/37380/34135 34535/37381/34136
+f 34535/37381/34136 34539/37380/34135 37740/37005/33764 37739/37001/33760
+f 34538/37379/34134 39395/37369/34124 39394/37368/34123 34539/37380/34135
+f 34539/37380/34135 39394/37368/34123 40494/36987/33746 37740/37005/33764
+f 34534/37378/34133 34535/37381/34136 34540/37382/34137 34536/37383/34138
+f 34536/37383/34138 34540/37382/34137 39397/37384/34139 39398/37385/34140
+f 34535/37381/34136 37739/37001/33760 37738/37000/33759 34540/37382/34137
+f 34540/37382/34137 37738/37000/33759 40495/37003/33762 39397/37384/34139
+f 34534/37378/34133 34536/37383/34138 34541/37386/34141 34537/37387/34142
+f 34537/37387/34142 34541/37386/34141 37810/37388/34143 37811/37389/34144
+f 34536/37383/34138 39398/37385/34140 39399/37390/34145 34541/37386/34141
+f 34541/37386/34141 39399/37390/34145 40519/37391/34146 37810/37388/34143
+f 34534/37378/34133 34537/37387/34142 34542/37392/34147 34538/37379/34134
+f 34538/37379/34134 34542/37392/34147 39396/37374/34129 39395/37369/34124
+f 34537/37387/34142 37811/37389/34144 37812/37393/34148 34542/37392/34147
+f 34542/37392/34147 37812/37393/34148 40518/37375/34130 39396/37374/34129
+f 34543/37394/34149 34547/37395/34150 34548/37396/34151 34544/37397/34152
+f 34544/37397/34152 34548/37396/34151 37743/37021/33780 37742/37017/33776
+f 34547/37395/34150 39398/37385/34140 39397/37384/34139 34548/37396/34151
+f 34548/37396/34151 39397/37384/34139 40495/37003/33762 37743/37021/33780
+f 34543/37394/34149 34544/37397/34152 34549/37398/34153 34545/37399/34154
+f 34545/37399/34154 34549/37398/34153 39400/37400/34155 39401/37401/34156
+f 34544/37397/34152 37742/37017/33776 37741/37016/33775 34549/37398/34153
+f 34549/37398/34153 37741/37016/33775 40496/37019/33778 39400/37400/34155
+f 34543/37394/34149 34545/37399/34154 34550/37402/34157 34546/37403/34158
+f 34546/37403/34158 34550/37402/34157 37813/37404/34159 37814/37405/34160
+f 34545/37399/34154 39401/37401/34156 39402/37406/34161 34550/37402/34157
+f 34550/37402/34157 39402/37406/34161 40520/37407/34162 37813/37404/34159
+f 34543/37394/34149 34546/37403/34158 34551/37408/34163 34547/37395/34150
+f 34547/37395/34150 34551/37408/34163 39399/37390/34145 39398/37385/34140
+f 34546/37403/34158 37814/37405/34160 37815/37409/34164 34551/37408/34163
+f 34551/37408/34163 37815/37409/34164 40519/37391/34146 39399/37390/34145
+f 34552/37410/34165 34556/37411/34166 34557/37412/34167 34553/37413/34168
+f 34553/37413/34168 34557/37412/34167 37746/37037/33796 37745/37033/33792
+f 34556/37411/34166 39401/37401/34156 39400/37400/34155 34557/37412/34167
+f 34557/37412/34167 39400/37400/34155 40496/37019/33778 37746/37037/33796
+f 34552/37410/34165 34553/37413/34168 34558/37414/34169 34554/37415/34170
+f 34554/37415/34170 34558/37414/34169 39403/37416/34171 39404/37417/34172
+f 34553/37413/34168 37745/37033/33792 37744/37032/33791 34558/37414/34169
+f 34558/37414/34169 37744/37032/33791 40497/37035/33794 39403/37416/34171
+f 34552/37410/34165 34554/37415/34170 34559/37418/34173 34555/37419/34174
+f 34555/37419/34174 34559/37418/34173 37816/37420/34175 37817/37421/34176
+f 34554/37415/34170 39404/37417/34172 39405/37422/34177 34559/37418/34173
+f 34559/37418/34173 39405/37422/34177 40521/37423/34178 37816/37420/34175
+f 34552/37410/34165 34555/37419/34174 34560/37424/34179 34556/37411/34166
+f 34556/37411/34166 34560/37424/34179 39402/37406/34161 39401/37401/34156
+f 34555/37419/34174 37817/37421/34176 37818/37425/34180 34560/37424/34179
+f 34560/37424/34179 37818/37425/34180 40520/37407/34162 39402/37406/34161
+f 34561/37426/34181 34565/37427/34182 34566/37428/34183 34562/37429/34184
+f 34562/37429/34184 34566/37428/34183 37749/37053/33812 37748/37049/33808
+f 34565/37427/34182 39404/37417/34172 39403/37416/34171 34566/37428/34183
+f 34566/37428/34183 39403/37416/34171 40497/37035/33794 37749/37053/33812
+f 34561/37426/34181 34562/37429/34184 34567/37430/34185 34563/37431/34186
+f 34563/37431/34186 34567/37430/34185 39406/37432/34187 39407/37433/34188
+f 34562/37429/34184 37748/37049/33808 37747/37048/33807 34567/37430/34185
+f 34567/37430/34185 37747/37048/33807 40498/37051/33810 39406/37432/34187
+f 34561/37426/34181 34563/37431/34186 34568/37434/34189 34564/37435/34190
+f 34564/37435/34190 34568/37434/34189 37819/37436/34191 37820/37437/34192
+f 34563/37431/34186 39407/37433/34188 39408/37438/34193 34568/37434/34189
+f 34568/37434/34189 39408/37438/34193 40522/37439/34194 37819/37436/34191
+f 34561/37426/34181 34564/37435/34190 34569/37440/34195 34565/37427/34182
+f 34565/37427/34182 34569/37440/34195 39405/37422/34177 39404/37417/34172
+f 34564/37435/34190 37820/37437/34192 37821/37441/34196 34569/37440/34195
+f 34569/37440/34195 37821/37441/34196 40521/37423/34178 39405/37422/34177
+f 34570/37442/34197 34574/37443/34198 34575/37444/34199 34571/37445/34200
+f 34571/37445/34200 34575/37444/34199 37752/37069/33828 37751/37065/33824
+f 34574/37443/34198 39407/37433/34188 39406/37432/34187 34575/37444/34199
+f 34575/37444/34199 39406/37432/34187 40498/37051/33810 37752/37069/33828
+f 34570/37442/34197 34571/37445/34200 34576/37446/34201 34572/37447/34202
+f 34572/37447/34202 34576/37446/34201 39409/37448/34203 39410/37449/34204
+f 34571/37445/34200 37751/37065/33824 37750/37064/33823 34576/37446/34201
+f 34576/37446/34201 37750/37064/33823 40499/37067/33826 39409/37448/34203
+f 34570/37442/34197 34572/37447/34202 34577/37450/34205 34573/37451/34206
+f 34573/37451/34206 34577/37450/34205 37822/37452/34207 37823/37453/34208
+f 34572/37447/34202 39410/37449/34204 39411/37454/34209 34577/37450/34205
+f 34577/37450/34205 39411/37454/34209 40523/37455/34210 37822/37452/34207
+f 34570/37442/34197 34573/37451/34206 34578/37456/34211 34574/37443/34198
+f 34574/37443/34198 34578/37456/34211 39408/37438/34193 39407/37433/34188
+f 34573/37451/34206 37823/37453/34208 37824/37457/34212 34578/37456/34211
+f 34578/37456/34211 37824/37457/34212 40522/37439/34194 39408/37438/34193
+f 34579/37458/34213 34583/37459/34214 34584/37460/34215 34580/37461/34216
+f 34580/37461/34216 34584/37460/34215 37755/37085/33844 37754/37081/33840
+f 34583/37459/34214 39410/37449/34204 39409/37448/34203 34584/37460/34215
+f 34584/37460/34215 39409/37448/34203 40499/37067/33826 37755/37085/33844
+f 34579/37458/34213 34580/37461/34216 34585/37462/34217 34581/37463/34218
+f 34581/37463/34218 34585/37462/34217 39412/37464/34219 39413/37465/34220
+f 34580/37461/34216 37754/37081/33840 37753/37080/33839 34585/37462/34217
+f 34585/37462/34217 37753/37080/33839 40500/37083/33842 39412/37464/34219
+f 34579/37458/34213 34581/37463/34218 34586/37466/34221 34582/37467/34222
+f 34582/37467/34222 34586/37466/34221 37825/37468/34223 37826/37469/34224
+f 34581/37463/34218 39413/37465/34220 39414/37470/34225 34586/37466/34221
+f 34586/37466/34221 39414/37470/34225 40524/37471/34226 37825/37468/34223
+f 34579/37458/34213 34582/37467/34222 34587/37472/34227 34583/37459/34214
+f 34583/37459/34214 34587/37472/34227 39411/37454/34209 39410/37449/34204
+f 34582/37467/34222 37826/37469/34224 37827/37473/34228 34587/37472/34227
+f 34587/37472/34227 37827/37473/34228 40523/37455/34210 39411/37454/34209
+f 34588/37474/34229 34592/37475/34230 34593/37476/34231 34589/37477/34232
+f 34589/37477/34232 34593/37476/34231 37758/37101/33860 37757/37097/33856
+f 34592/37475/34230 39413/37465/34220 39412/37464/34219 34593/37476/34231
+f 34593/37476/34231 39412/37464/34219 40500/37083/33842 37758/37101/33860
+f 34588/37474/34229 34589/37477/34232 34594/37478/34233 34590/37479/34234
+f 34590/37479/34234 34594/37478/34233 39415/37480/34235 39416/37481/34236
+f 34589/37477/34232 37757/37097/33856 37756/37096/33855 34594/37478/34233
+f 34594/37478/34233 37756/37096/33855 40501/37099/33858 39415/37480/34235
+f 34588/37474/34229 34590/37479/34234 34595/37482/34237 34591/37483/34238
+f 34591/37483/34238 34595/37482/34237 37828/37484/34239 37829/37485/34240
+f 34590/37479/34234 39416/37481/34236 39417/37486/34241 34595/37482/34237
+f 34595/37482/34237 39417/37486/34241 40525/37487/34242 37828/37484/34239
+f 34588/37474/34229 34591/37483/34238 34596/37488/34243 34592/37475/34230
+f 34592/37475/34230 34596/37488/34243 39414/37470/34225 39413/37465/34220
+f 34591/37483/34238 37829/37485/34240 37830/37489/34244 34596/37488/34243
+f 34596/37488/34243 37830/37489/34244 40524/37471/34226 39414/37470/34225
+f 34597/37490/34245 34601/37491/34246 34602/37492/34247 34598/37493/34248
+f 34598/37493/34248 34602/37492/34247 37761/37117/33876 37760/37113/33872
+f 34601/37491/34246 39416/37481/34236 39415/37480/34235 34602/37492/34247
+f 34602/37492/34247 39415/37480/34235 40501/37099/33858 37761/37117/33876
+f 34597/37490/34245 34598/37493/34248 34603/37494/34249 34599/37495/34250
+f 34599/37495/34250 34603/37494/34249 39418/37496/34251 39419/37497/34252
+f 34598/37493/34248 37760/37113/33872 37759/37112/33871 34603/37494/34249
+f 34603/37494/34249 37759/37112/33871 40502/37115/33874 39418/37496/34251
+f 34597/37490/34245 34599/37495/34250 34604/37498/34253 34600/37499/34254
+f 34600/37499/34254 34604/37498/34253 37831/37500/34255 37832/37501/34256
+f 34599/37495/34250 39419/37497/34252 39420/37502/34257 34604/37498/34253
+f 34604/37498/34253 39420/37502/34257 40526/37503/34258 37831/37500/34255
+f 34597/37490/34245 34600/37499/34254 34605/37504/34259 34601/37491/34246
+f 34601/37491/34246 34605/37504/34259 39417/37486/34241 39416/37481/34236
+f 34600/37499/34254 37832/37501/34256 37833/37505/34260 34605/37504/34259
+f 34605/37504/34259 37833/37505/34260 40525/37487/34242 39417/37486/34241
+f 34606/37506/34261 34610/37507/34262 34611/37508/34263 34607/37509/34264
+f 34607/37509/34264 34611/37508/34263 37764/37133/33892 37763/37129/33888
+f 34610/37507/34262 39419/37497/34252 39418/37496/34251 34611/37508/34263
+f 34611/37508/34263 39418/37496/34251 40502/37115/33874 37764/37133/33892
+f 34606/37506/34261 34607/37509/34264 34612/37510/34265 34608/37511/34266
+f 34608/37511/34266 34612/37510/34265 39421/37512/34267 39422/37513/34268
+f 34607/37509/34264 37763/37129/33888 37762/37128/33887 34612/37510/34265
+f 34612/37510/34265 37762/37128/33887 40503/37131/33890 39421/37512/34267
+f 34606/37506/34261 34608/37511/34266 34613/37514/34269 34609/37515/34270
+f 34609/37515/34270 34613/37514/34269 37834/37516/34271 37835/37517/34272
+f 34608/37511/34266 39422/37513/34268 39423/37518/34273 34613/37514/34269
+f 34613/37514/34269 39423/37518/34273 40527/37519/34274 37834/37516/34271
+f 34606/37506/34261 34609/37515/34270 34614/37520/34275 34610/37507/34262
+f 34610/37507/34262 34614/37520/34275 39420/37502/34257 39419/37497/34252
+f 34609/37515/34270 37835/37517/34272 37836/37521/34276 34614/37520/34275
+f 34614/37520/34275 37836/37521/34276 40526/37503/34258 39420/37502/34257
+f 34615/37522/34277 34619/37523/34278 34620/37524/34279 34616/37525/34280
+f 34616/37525/34280 34620/37524/34279 37767/37149/33908 37766/37145/33904
+f 34619/37523/34278 39422/37513/34268 39421/37512/34267 34620/37524/34279
+f 34620/37524/34279 39421/37512/34267 40503/37131/33890 37767/37149/33908
+f 34615/37522/34277 34616/37525/34280 34621/37526/34281 34617/37527/34282
+f 34617/37527/34282 34621/37526/34281 39424/37528/34283 39425/37529/34284
+f 34616/37525/34280 37766/37145/33904 37765/37144/33903 34621/37526/34281
+f 34621/37526/34281 37765/37144/33903 40504/37147/33906 39424/37528/34283
+f 34615/37522/34277 34617/37527/34282 34622/37530/34285 34618/37531/34286
+f 34618/37531/34286 34622/37530/34285 37837/37532/34287 37838/37533/34288
+f 34617/37527/34282 39425/37529/34284 39426/37534/34289 34622/37530/34285
+f 34622/37530/34285 39426/37534/34289 40528/37535/34290 37837/37532/34287
+f 34615/37522/34277 34618/37531/34286 34623/37536/34291 34619/37523/34278
+f 34619/37523/34278 34623/37536/34291 39423/37518/34273 39422/37513/34268
+f 34618/37531/34286 37838/37533/34288 37839/37537/34292 34623/37536/34291
+f 34623/37536/34291 37839/37537/34292 40527/37519/34274 39423/37518/34273
+f 34624/37538/34293 34628/37539/34294 34629/37540/34295 34625/37541/34296
+f 34625/37541/34296 34629/37540/34295 37770/37165/33924 37769/37161/33920
+f 34628/37539/34294 39425/37529/34284 39424/37528/34283 34629/37540/34295
+f 34629/37540/34295 39424/37528/34283 40504/37147/33906 37770/37165/33924
+f 34624/37538/34293 34625/37541/34296 34630/37542/34297 34626/37543/34298
+f 34626/37543/34298 34630/37542/34297 39427/37544/34299 39428/37545/34300
+f 34625/37541/34296 37769/37161/33920 37768/37160/33919 34630/37542/34297
+f 34630/37542/34297 37768/37160/33919 40505/37163/33922 39427/37544/34299
+f 34624/37538/34293 34626/37543/34298 34631/37546/34301 34627/37547/34302
+f 34627/37547/34302 34631/37546/34301 37840/37548/34303 37841/37549/34304
+f 34626/37543/34298 39428/37545/34300 39429/37550/34305 34631/37546/34301
+f 34631/37546/34301 39429/37550/34305 40529/37551/34306 37840/37548/34303
+f 34624/37538/34293 34627/37547/34302 34632/37552/34307 34628/37539/34294
+f 34628/37539/34294 34632/37552/34307 39426/37534/34289 39425/37529/34284
+f 34627/37547/34302 37841/37549/34304 37842/37553/34308 34632/37552/34307
+f 34632/37552/34307 37842/37553/34308 40528/37535/34290 39426/37534/34289
+f 34633/37554/34309 34637/37555/34310 34638/37556/34311 34634/37557/34312
+f 34634/37557/34312 34638/37556/34311 37773/37181/33940 37772/37177/33936
+f 34637/37555/34310 39428/37545/34300 39427/37544/34299 34638/37556/34311
+f 34638/37556/34311 39427/37544/34299 40505/37163/33922 37773/37181/33940
+f 34633/37554/34309 34634/37557/34312 34639/37558/34313 34635/37559/34314
+f 34635/37559/34314 34639/37558/34313 39430/37560/34315 39431/37561/34316
+f 34634/37557/34312 37772/37177/33936 37771/37176/33935 34639/37558/34313
+f 34639/37558/34313 37771/37176/33935 40506/37179/33938 39430/37560/34315
+f 34633/37554/34309 34635/37559/34314 34640/37562/34317 34636/37563/34318
+f 34636/37563/34318 34640/37562/34317 37843/37564/34319 37844/37565/34320
+f 34635/37559/34314 39431/37561/34316 39432/37566/34321 34640/37562/34317
+f 34640/37562/34317 39432/37566/34321 40530/37567/34322 37843/37564/34319
+f 34633/37554/34309 34636/37563/34318 34641/37568/34323 34637/37555/34310
+f 34637/37555/34310 34641/37568/34323 39429/37550/34305 39428/37545/34300
+f 34636/37563/34318 37844/37565/34320 37845/37569/34324 34641/37568/34323
+f 34641/37568/34323 37845/37569/34324 40529/37551/34306 39429/37550/34305
+f 34642/37570/34325 34646/37571/34326 34647/37572/34327 34643/37573/34328
+f 34643/37573/34328 34647/37572/34327 37776/37197/33956 37775/37193/33952
+f 34646/37571/34326 39431/37561/34316 39430/37560/34315 34647/37572/34327
+f 34647/37572/34327 39430/37560/34315 40506/37179/33938 37776/37197/33956
+f 34642/37570/34325 34643/37573/34328 34648/37574/34329 34644/37575/34330
+f 34644/37575/34330 34648/37574/34329 39433/37576/34331 39434/37577/34332
+f 34643/37573/34328 37775/37193/33952 37774/37192/33951 34648/37574/34329
+f 34648/37574/34329 37774/37192/33951 40507/37195/33954 39433/37576/34331
+f 34642/37570/34325 34644/37575/34330 34649/37578/34333 34645/37579/34334
+f 34645/37579/34334 34649/37578/34333 37846/37580/34335 37847/37581/34336
+f 34644/37575/34330 39434/37577/34332 39435/37582/34337 34649/37578/34333
+f 34649/37578/34333 39435/37582/34337 40531/37583/34338 37846/37580/34335
+f 34642/37570/34325 34645/37579/34334 34650/37584/34339 34646/37571/34326
+f 34646/37571/34326 34650/37584/34339 39432/37566/34321 39431/37561/34316
+f 34645/37579/34334 37847/37581/34336 37848/37585/34340 34650/37584/34339
+f 34650/37584/34339 37848/37585/34340 40530/37567/34322 39432/37566/34321
+f 34651/37586/34341 34655/37587/34342 34656/37588/34343 34652/37589/34344
+f 34652/37589/34344 34656/37588/34343 37779/37213/33972 37778/37209/33968
+f 34655/37587/34342 39434/37577/34332 39433/37576/34331 34656/37588/34343
+f 34656/37588/34343 39433/37576/34331 40507/37195/33954 37779/37213/33972
+f 34651/37586/34341 34652/37589/34344 34657/37590/34345 34653/37591/34346
+f 34653/37591/34346 34657/37590/34345 39436/37592/34347 39437/37593/34348
+f 34652/37589/34344 37778/37209/33968 37777/37208/33967 34657/37590/34345
+f 34657/37590/34345 37777/37208/33967 40508/37211/33970 39436/37592/34347
+f 34651/37586/34341 34653/37591/34346 34658/37594/34349 34654/37595/34350
+f 34654/37595/34350 34658/37594/34349 37849/37596/34351 37850/37597/34352
+f 34653/37591/34346 39437/37593/34348 39438/37598/34353 34658/37594/34349
+f 34658/37594/34349 39438/37598/34353 40532/37599/34354 37849/37596/34351
+f 34651/37586/34341 34654/37595/34350 34659/37600/34355 34655/37587/34342
+f 34655/37587/34342 34659/37600/34355 39435/37582/34337 39434/37577/34332
+f 34654/37595/34350 37850/37597/34352 37851/37601/34356 34659/37600/34355
+f 34659/37600/34355 37851/37601/34356 40531/37583/34338 39435/37582/34337
+f 34660/37602/34357 34664/37603/34358 34665/37604/34359 34661/37605/34360
+f 34661/37605/34360 34665/37604/34359 37782/37229/33988 37781/37225/33984
+f 34664/37603/34358 39437/37593/34348 39436/37592/34347 34665/37604/34359
+f 34665/37604/34359 39436/37592/34347 40508/37211/33970 37782/37229/33988
+f 34660/37602/34357 34661/37605/34360 34666/37606/34361 34662/37607/34362
+f 34662/37607/34362 34666/37606/34361 39439/37608/34363 39440/37609/34364
+f 34661/37605/34360 37781/37225/33984 37780/37224/33983 34666/37606/34361
+f 34666/37606/34361 37780/37224/33983 40509/37227/33986 39439/37608/34363
+f 34660/37602/34357 34662/37607/34362 34667/37610/34365 34663/37611/34366
+f 34663/37611/34366 34667/37610/34365 37852/37612/34367 37853/37613/34368
+f 34662/37607/34362 39440/37609/34364 39441/37614/34369 34667/37610/34365
+f 34667/37610/34365 39441/37614/34369 40533/37615/34370 37852/37612/34367
+f 34660/37602/34357 34663/37611/34366 34668/37616/34371 34664/37603/34358
+f 34664/37603/34358 34668/37616/34371 39438/37598/34353 39437/37593/34348
+f 34663/37611/34366 37853/37613/34368 37854/37617/34372 34668/37616/34371
+f 34668/37616/34371 37854/37617/34372 40532/37599/34354 39438/37598/34353
+f 34669/37618/34373 34673/37619/34374 34674/37620/34375 34670/37621/34376
+f 34670/37621/34376 34674/37620/34375 37785/37245/34004 37784/37241/34000
+f 34673/37619/34374 39440/37609/34364 39439/37608/34363 34674/37620/34375
+f 34674/37620/34375 39439/37608/34363 40509/37227/33986 37785/37245/34004
+f 34669/37618/34373 34670/37621/34376 34675/37622/34377 34671/37623/34378
+f 34671/37623/34378 34675/37622/34377 39442/37624/34379 39443/37625/34380
+f 34670/37621/34376 37784/37241/34000 37783/37240/33999 34675/37622/34377
+f 34675/37622/34377 37783/37240/33999 40510/37243/34002 39442/37624/34379
+f 34669/37618/34373 34671/37623/34378 34676/37626/34381 34672/37627/34382
+f 34672/37627/34382 34676/37626/34381 37855/37628/34383 37856/37629/34384
+f 34671/37623/34378 39443/37625/34380 39444/37630/34385 34676/37626/34381
+f 34676/37626/34381 39444/37630/34385 40534/37631/34386 37855/37628/34383
+f 34669/37618/34373 34672/37627/34382 34677/37632/34387 34673/37619/34374
+f 34673/37619/34374 34677/37632/34387 39441/37614/34369 39440/37609/34364
+f 34672/37627/34382 37856/37629/34384 37857/37633/34388 34677/37632/34387
+f 34677/37632/34387 37857/37633/34388 40533/37615/34370 39441/37614/34369
+f 34678/37634/34389 34682/37635/34390 34683/37636/34391 34679/37637/34392
+f 34679/37637/34392 34683/37636/34391 37788/37261/34020 37787/37257/34016
+f 34682/37635/34390 39443/37625/34380 39442/37624/34379 34683/37636/34391
+f 34683/37636/34391 39442/37624/34379 40510/37243/34002 37788/37261/34020
+f 34678/37634/34389 34679/37637/34392 34684/37638/34393 34680/37639/34394
+f 34680/37639/34394 34684/37638/34393 39445/37640/34395 39446/37641/34396
+f 34679/37637/34392 37787/37257/34016 37786/37256/34015 34684/37638/34393
+f 34684/37638/34393 37786/37256/34015 40511/37259/34018 39445/37640/34395
+f 34678/37634/34389 34680/37639/34394 34685/37642/34397 34681/37643/34398
+f 34681/37643/34398 34685/37642/34397 37858/37644/34399 37859/37645/34400
+f 34680/37639/34394 39446/37641/34396 39447/37646/34401 34685/37642/34397
+f 34685/37642/34397 39447/37646/34401 40535/37647/34402 37858/37644/34399
+f 34678/37634/34389 34681/37643/34398 34686/37648/34403 34682/37635/34390
+f 34682/37635/34390 34686/37648/34403 39444/37630/34385 39443/37625/34380
+f 34681/37643/34398 37859/37645/34400 37860/37649/34404 34686/37648/34403
+f 34686/37648/34403 37860/37649/34404 40534/37631/34386 39444/37630/34385
+f 34687/37650/34405 34691/37651/34406 34692/37652/34407 34688/37653/34408
+f 34688/37653/34408 34692/37652/34407 37791/37277/34036 37790/37273/34032
+f 34691/37651/34406 39446/37641/34396 39445/37640/34395 34692/37652/34407
+f 34692/37652/34407 39445/37640/34395 40511/37259/34018 37791/37277/34036
+f 34687/37650/34405 34688/37653/34408 34693/37654/34409 34689/37655/34410
+f 34689/37655/34410 34693/37654/34409 39448/37656/34411 39449/37657/34412
+f 34688/37653/34408 37790/37273/34032 37789/37272/34031 34693/37654/34409
+f 34693/37654/34409 37789/37272/34031 40512/37275/34034 39448/37656/34411
+f 34687/37650/34405 34689/37655/34410 34694/37658/34413 34690/37659/34414
+f 34690/37659/34414 34694/37658/34413 37861/37660/34415 37862/37661/34416
+f 34689/37655/34410 39449/37657/34412 39450/37662/34417 34694/37658/34413
+f 34694/37658/34413 39450/37662/34417 40536/37663/34418 37861/37660/34415
+f 34687/37650/34405 34690/37659/34414 34695/37664/34419 34691/37651/34406
+f 34691/37651/34406 34695/37664/34419 39447/37646/34401 39446/37641/34396
+f 34690/37659/34414 37862/37661/34416 37863/37665/34420 34695/37664/34419
+f 34695/37664/34419 37863/37665/34420 40535/37647/34402 39447/37646/34401
+f 34696/37666/34421 34700/37667/34422 34701/37668/34423 34697/37669/34424
+f 34697/37669/34424 34701/37668/34423 37794/37293/34052 37793/37289/34048
+f 34700/37667/34422 39449/37657/34412 39448/37656/34411 34701/37668/34423
+f 34701/37668/34423 39448/37656/34411 40512/37275/34034 37794/37293/34052
+f 34696/37666/34421 34697/37669/34424 34702/37670/34425 34698/37671/34426
+f 34698/37671/34426 34702/37670/34425 39451/37672/34427 39452/37673/34428
+f 34697/37669/34424 37793/37289/34048 37792/37288/34047 34702/37670/34425
+f 34702/37670/34425 37792/37288/34047 40513/37291/34050 39451/37672/34427
+f 34696/37666/34421 34698/37671/34426 34703/37674/34429 34699/37675/34430
+f 34699/37675/34430 34703/37674/34429 37864/37676/34431 37865/37677/34432
+f 34698/37671/34426 39452/37673/34428 39453/37678/34433 34703/37674/34429
+f 34703/37674/34429 39453/37678/34433 40537/37679/34434 37864/37676/34431
+f 34696/37666/34421 34699/37675/34430 34704/37680/34435 34700/37667/34422
+f 34700/37667/34422 34704/37680/34435 39450/37662/34417 39449/37657/34412
+f 34699/37675/34430 37865/37677/34432 37866/37681/34436 34704/37680/34435
+f 34704/37680/34435 37866/37681/34436 40536/37663/34418 39450/37662/34417
+f 34705/37682/34437 34709/37683/34438 34710/37684/34439 34706/37685/34440
+f 34706/37685/34440 34710/37684/34439 37797/37309/34068 37796/37305/34064
+f 34709/37683/34438 39452/37673/34428 39451/37672/34427 34710/37684/34439
+f 34710/37684/34439 39451/37672/34427 40513/37291/34050 37797/37309/34068
+f 34705/37682/34437 34706/37685/34440 34711/37686/34441 34707/37687/34442
+f 34707/37687/34442 34711/37686/34441 39454/37688/34443 39455/37689/34444
+f 34706/37685/34440 37796/37305/34064 37795/37304/34063 34711/37686/34441
+f 34711/37686/34441 37795/37304/34063 40514/37307/34066 39454/37688/34443
+f 34705/37682/34437 34707/37687/34442 34712/37690/34445 34708/37691/34446
+f 34708/37691/34446 34712/37690/34445 37867/37692/34447 37868/37693/34448
+f 34707/37687/34442 39455/37689/34444 39456/37694/34449 34712/37690/34445
+f 34712/37690/34445 39456/37694/34449 40538/37695/34450 37867/37692/34447
+f 34705/37682/34437 34708/37691/34446 34713/37696/34451 34709/37683/34438
+f 34709/37683/34438 34713/37696/34451 39453/37678/34433 39452/37673/34428
+f 34708/37691/34446 37868/37693/34448 37869/37697/34452 34713/37696/34451
+f 34713/37696/34451 37869/37697/34452 40537/37679/34434 39453/37678/34433
+f 34714/37698/34453 34718/37699/34454 34719/37700/34455 34715/37701/34456
+f 34715/37701/34456 34719/37700/34455 37800/37325/34084 37799/37321/34080
+f 34718/37699/34454 39455/37689/34444 39454/37688/34443 34719/37700/34455
+f 34719/37700/34455 39454/37688/34443 40514/37307/34066 37800/37325/34084
+f 34714/37698/34453 34715/37701/34456 34720/37702/34457 34716/37703/34458
+f 34716/37703/34458 34720/37702/34457 39457/37704/34459 39458/37705/34460
+f 34715/37701/34456 37799/37321/34080 37798/37320/34079 34720/37702/34457
+f 34720/37702/34457 37798/37320/34079 40515/37323/34082 39457/37704/34459
+f 34714/37698/34453 34716/37703/34458 34721/37706/34461 34717/37707/34462
+f 34717/37707/34462 34721/37706/34461 37870/37708/34463 37871/37709/34464
+f 34716/37703/34458 39458/37705/34460 39459/37710/34465 34721/37706/34461
+f 34721/37706/34461 39459/37710/34465 40539/37711/34466 37870/37708/34463
+f 34714/37698/34453 34717/37707/34462 34722/37712/34467 34718/37699/34454
+f 34718/37699/34454 34722/37712/34467 39456/37694/34449 39455/37689/34444
+f 34717/37707/34462 37871/37709/34464 37872/37713/34468 34722/37712/34467
+f 34722/37712/34467 37872/37713/34468 40538/37695/34450 39456/37694/34449
+f 34723/37714/34469 34727/37715/34470 34728/37716/34471 34724/37717/34472
+f 34724/37717/34472 34728/37716/34471 37803/37341/34096 37802/37337/34094
+f 34727/37715/34470 39458/37705/34460 39457/37704/34459 34728/37716/34471
+f 34728/37716/34471 39457/37704/34459 40515/37323/34082 37803/37341/34096
+f 34723/37714/34469 34724/37717/34472 34729/37718/34473 34725/37719/34474
+f 34725/37719/34474 34729/37718/34473 39390/37720/34102 39389/37721/34101
+f 34724/37717/34472 37802/37337/34094 37801/37336/34093 34729/37718/34473
+f 34729/37718/34473 37801/37336/34093 40492/37339/33732 39390/37720/34102
+f 34723/37714/34469 34725/37719/34474 34730/37722/34475 34726/37723/34476
+f 34726/37723/34476 34730/37722/34475 37873/37724/34477 37874/37725/34478
+f 34725/37719/34474 39389/37721/34101 39388/37726/34114 34730/37722/34475
+f 34730/37722/34475 39388/37726/34114 40516/37727/34116 37873/37724/34477
+f 34723/37714/34469 34726/37723/34476 34731/37728/34479 34727/37715/34470
+f 34727/37715/34470 34731/37728/34479 39459/37710/34465 39458/37705/34460
+f 34726/37723/34476 37874/37725/34478 37875/37729/34480 34731/37728/34479
+f 34731/37728/34479 37875/37729/34480 40539/37711/34466 39459/37710/34465
+f 34732/37730/34481 34736/37731/34482 34737/37732/34483 34733/37733/34484
+f 34733/37733/34484 34737/37732/34483 37806/37360/34115 37805/37355/34110
+f 34736/37731/34482 39461/37734/34485 39462/37735/34486 34737/37732/34483
+f 34737/37732/34483 39462/37735/34486 40516/37361/34116 37806/37360/34115
+f 34732/37730/34481 34733/37733/34484 34738/37736/34487 34734/37737/34488
+f 34734/37737/34488 34738/37736/34487 39463/37738/34489 39464/37739/34490
+f 34733/37733/34484 37805/37355/34110 37804/37354/34109 34738/37736/34487
+f 34738/37736/34487 37804/37354/34109 40517/37357/34112 39463/37738/34489
+f 34732/37730/34481 34734/37737/34488 34739/37740/34491 34735/37741/34492
+f 34735/37741/34492 34739/37740/34491 37876/37742/34493 37877/37743/34494
+f 34734/37737/34488 39464/37739/34490 39465/37744/34495 34739/37740/34491
+f 34739/37740/34491 39465/37744/34495 40541/37745/34496 37876/37742/34493
+f 34732/37730/34481 34735/37741/34492 34740/37746/34497 34736/37731/34482
+f 34736/37731/34482 34740/37746/34497 39460/37747/34498 39461/37734/34485
+f 34735/37741/34492 37877/37743/34494 37878/37748/34499 34740/37746/34497
+f 34740/37746/34497 37878/37748/34499 40540/37749/34500 39460/37747/34498
+f 34741/37750/34501 34745/37751/34502 34746/37752/34503 34742/37753/34504
+f 34742/37753/34504 34746/37752/34503 37809/37377/34132 37808/37373/34128
+f 34745/37751/34502 39464/37739/34490 39463/37738/34489 34746/37752/34503
+f 34746/37752/34503 39463/37738/34489 40517/37357/34112 37809/37377/34132
+f 34741/37750/34501 34742/37753/34504 34747/37754/34505 34743/37755/34506
+f 34743/37755/34506 34747/37754/34505 39466/37756/34507 39467/37757/34508
+f 34742/37753/34504 37808/37373/34128 37807/37372/34127 34747/37754/34505
+f 34747/37754/34505 37807/37372/34127 40518/37375/34130 39466/37756/34507
+f 34741/37750/34501 34743/37755/34506 34748/37758/34509 34744/37759/34510
+f 34744/37759/34510 34748/37758/34509 37879/37760/34511 37880/37761/34512
+f 34743/37755/34506 39467/37757/34508 39468/37762/34513 34748/37758/34509
+f 34748/37758/34509 39468/37762/34513 40542/37763/34514 37879/37760/34511
+f 34741/37750/34501 34744/37759/34510 34749/37764/34515 34745/37751/34502
+f 34745/37751/34502 34749/37764/34515 39465/37744/34495 39464/37739/34490
+f 34744/37759/34510 37880/37761/34512 37881/37765/34516 34749/37764/34515
+f 34749/37764/34515 37881/37765/34516 40541/37745/34496 39465/37744/34495
+f 34750/37766/34517 34754/37767/34518 34755/37768/34519 34751/37769/34520
+f 34751/37769/34520 34755/37768/34519 37812/37393/34148 37811/37389/34144
+f 34754/37767/34518 39467/37757/34508 39466/37756/34507 34755/37768/34519
+f 34755/37768/34519 39466/37756/34507 40518/37375/34130 37812/37393/34148
+f 34750/37766/34517 34751/37769/34520 34756/37770/34521 34752/37771/34522
+f 34752/37771/34522 34756/37770/34521 39469/37772/34523 39470/37773/34524
+f 34751/37769/34520 37811/37389/34144 37810/37388/34143 34756/37770/34521
+f 34756/37770/34521 37810/37388/34143 40519/37391/34146 39469/37772/34523
+f 34750/37766/34517 34752/37771/34522 34757/37774/34525 34753/37775/34526
+f 34753/37775/34526 34757/37774/34525 37882/37776/34527 37883/37777/34528
+f 34752/37771/34522 39470/37773/34524 39471/37778/34529 34757/37774/34525
+f 34757/37774/34525 39471/37778/34529 40543/37779/34530 37882/37776/34527
+f 34750/37766/34517 34753/37775/34526 34758/37780/34531 34754/37767/34518
+f 34754/37767/34518 34758/37780/34531 39468/37762/34513 39467/37757/34508
+f 34753/37775/34526 37883/37777/34528 37884/37781/34532 34758/37780/34531
+f 34758/37780/34531 37884/37781/34532 40542/37763/34514 39468/37762/34513
+f 34759/37782/34533 34763/37783/34534 34764/37784/34535 34760/37785/34536
+f 34760/37785/34536 34764/37784/34535 37815/37409/34164 37814/37405/34160
+f 34763/37783/34534 39470/37773/34524 39469/37772/34523 34764/37784/34535
+f 34764/37784/34535 39469/37772/34523 40519/37391/34146 37815/37409/34164
+f 34759/37782/34533 34760/37785/34536 34765/37786/34537 34761/37787/34538
+f 34761/37787/34538 34765/37786/34537 39472/37788/34539 39473/37789/34540
+f 34760/37785/34536 37814/37405/34160 37813/37404/34159 34765/37786/34537
+f 34765/37786/34537 37813/37404/34159 40520/37407/34162 39472/37788/34539
+f 34759/37782/34533 34761/37787/34538 34766/37790/34541 34762/37791/34542
+f 34762/37791/34542 34766/37790/34541 37885/37792/34543 37886/37793/34544
+f 34761/37787/34538 39473/37789/34540 39474/37794/34545 34766/37790/34541
+f 34766/37790/34541 39474/37794/34545 40544/37795/34546 37885/37792/34543
+f 34759/37782/34533 34762/37791/34542 34767/37796/34547 34763/37783/34534
+f 34763/37783/34534 34767/37796/34547 39471/37778/34529 39470/37773/34524
+f 34762/37791/34542 37886/37793/34544 37887/37797/34548 34767/37796/34547
+f 34767/37796/34547 37887/37797/34548 40543/37779/34530 39471/37778/34529
+f 34768/37798/34549 34772/37799/34550 34773/37800/34551 34769/37801/34552
+f 34769/37801/34552 34773/37800/34551 37818/37425/34180 37817/37421/34176
+f 34772/37799/34550 39473/37789/34540 39472/37788/34539 34773/37800/34551
+f 34773/37800/34551 39472/37788/34539 40520/37407/34162 37818/37425/34180
+f 34768/37798/34549 34769/37801/34552 34774/37802/34553 34770/37803/34554
+f 34770/37803/34554 34774/37802/34553 39475/37804/34555 39476/37805/34556
+f 34769/37801/34552 37817/37421/34176 37816/37420/34175 34774/37802/34553
+f 34774/37802/34553 37816/37420/34175 40521/37423/34178 39475/37804/34555
+f 34768/37798/34549 34770/37803/34554 34775/37806/34557 34771/37807/34558
+f 34771/37807/34558 34775/37806/34557 37888/37808/34559 37889/37809/34560
+f 34770/37803/34554 39476/37805/34556 39477/37810/34561 34775/37806/34557
+f 34775/37806/34557 39477/37810/34561 40545/37811/34562 37888/37808/34559
+f 34768/37798/34549 34771/37807/34558 34776/37812/34563 34772/37799/34550
+f 34772/37799/34550 34776/37812/34563 39474/37794/34545 39473/37789/34540
+f 34771/37807/34558 37889/37809/34560 37890/37813/34564 34776/37812/34563
+f 34776/37812/34563 37890/37813/34564 40544/37795/34546 39474/37794/34545
+f 34777/37814/34565 34781/37815/34566 34782/37816/34567 34778/37817/34568
+f 34778/37817/34568 34782/37816/34567 37821/37441/34196 37820/37437/34192
+f 34781/37815/34566 39476/37805/34556 39475/37804/34555 34782/37816/34567
+f 34782/37816/34567 39475/37804/34555 40521/37423/34178 37821/37441/34196
+f 34777/37814/34565 34778/37817/34568 34783/37818/34569 34779/37819/34570
+f 34779/37819/34570 34783/37818/34569 39478/37820/34571 39479/37821/34572
+f 34778/37817/34568 37820/37437/34192 37819/37436/34191 34783/37818/34569
+f 34783/37818/34569 37819/37436/34191 40522/37439/34194 39478/37820/34571
+f 34777/37814/34565 34779/37819/34570 34784/37822/34573 34780/37823/34574
+f 34780/37823/34574 34784/37822/34573 37891/37824/34575 37892/37825/34576
+f 34779/37819/34570 39479/37821/34572 39480/37826/34577 34784/37822/34573
+f 34784/37822/34573 39480/37826/34577 40546/37827/34578 37891/37824/34575
+f 34777/37814/34565 34780/37823/34574 34785/37828/34579 34781/37815/34566
+f 34781/37815/34566 34785/37828/34579 39477/37810/34561 39476/37805/34556
+f 34780/37823/34574 37892/37825/34576 37893/37829/34580 34785/37828/34579
+f 34785/37828/34579 37893/37829/34580 40545/37811/34562 39477/37810/34561
+f 34786/37830/34581 34790/37831/34582 34791/37832/34583 34787/37833/34584
+f 34787/37833/34584 34791/37832/34583 37824/37457/34212 37823/37453/34208
+f 34790/37831/34582 39479/37821/34572 39478/37820/34571 34791/37832/34583
+f 34791/37832/34583 39478/37820/34571 40522/37439/34194 37824/37457/34212
+f 34786/37830/34581 34787/37833/34584 34792/37834/34585 34788/37835/34586
+f 34788/37835/34586 34792/37834/34585 39481/37836/34587 39482/37837/34588
+f 34787/37833/34584 37823/37453/34208 37822/37452/34207 34792/37834/34585
+f 34792/37834/34585 37822/37452/34207 40523/37455/34210 39481/37836/34587
+f 34786/37830/34581 34788/37835/34586 34793/37838/34589 34789/37839/34590
+f 34789/37839/34590 34793/37838/34589 37894/37840/34591 37895/37841/34592
+f 34788/37835/34586 39482/37837/34588 39483/37842/34593 34793/37838/34589
+f 34793/37838/34589 39483/37842/34593 40547/37843/34594 37894/37840/34591
+f 34786/37830/34581 34789/37839/34590 34794/37844/34595 34790/37831/34582
+f 34790/37831/34582 34794/37844/34595 39480/37826/34577 39479/37821/34572
+f 34789/37839/34590 37895/37841/34592 37896/37845/34596 34794/37844/34595
+f 34794/37844/34595 37896/37845/34596 40546/37827/34578 39480/37826/34577
+f 34795/37846/34597 34799/37847/34598 34800/37848/34599 34796/37849/34600
+f 34796/37849/34600 34800/37848/34599 37827/37473/34228 37826/37469/34224
+f 34799/37847/34598 39482/37837/34588 39481/37836/34587 34800/37848/34599
+f 34800/37848/34599 39481/37836/34587 40523/37455/34210 37827/37473/34228
+f 34795/37846/34597 34796/37849/34600 34801/37850/34601 34797/37851/34602
+f 34797/37851/34602 34801/37850/34601 39484/37852/34603 39485/37853/34604
+f 34796/37849/34600 37826/37469/34224 37825/37468/34223 34801/37850/34601
+f 34801/37850/34601 37825/37468/34223 40524/37471/34226 39484/37852/34603
+f 34795/37846/34597 34797/37851/34602 34802/37854/34605 34798/37855/34606
+f 34798/37855/34606 34802/37854/34605 37897/37856/34607 37898/37857/34608
+f 34797/37851/34602 39485/37853/34604 39486/37858/34609 34802/37854/34605
+f 34802/37854/34605 39486/37858/34609 40548/37859/34610 37897/37856/34607
+f 34795/37846/34597 34798/37855/34606 34803/37860/34611 34799/37847/34598
+f 34799/37847/34598 34803/37860/34611 39483/37842/34593 39482/37837/34588
+f 34798/37855/34606 37898/37857/34608 37899/37861/34612 34803/37860/34611
+f 34803/37860/34611 37899/37861/34612 40547/37843/34594 39483/37842/34593
+f 34804/37862/34613 34808/37863/34614 34809/37864/34615 34805/37865/34616
+f 34805/37865/34616 34809/37864/34615 37830/37489/34244 37829/37485/34240
+f 34808/37863/34614 39485/37853/34604 39484/37852/34603 34809/37864/34615
+f 34809/37864/34615 39484/37852/34603 40524/37471/34226 37830/37489/34244
+f 34804/37862/34613 34805/37865/34616 34810/37866/34617 34806/37867/34618
+f 34806/37867/34618 34810/37866/34617 39487/37868/34619 39488/37869/34620
+f 34805/37865/34616 37829/37485/34240 37828/37484/34239 34810/37866/34617
+f 34810/37866/34617 37828/37484/34239 40525/37487/34242 39487/37868/34619
+f 34804/37862/34613 34806/37867/34618 34811/37870/34621 34807/37871/34622
+f 34807/37871/34622 34811/37870/34621 37900/37872/34623 37901/37873/34624
+f 34806/37867/34618 39488/37869/34620 39489/37874/34625 34811/37870/34621
+f 34811/37870/34621 39489/37874/34625 40549/37875/34626 37900/37872/34623
+f 34804/37862/34613 34807/37871/34622 34812/37876/34627 34808/37863/34614
+f 34808/37863/34614 34812/37876/34627 39486/37858/34609 39485/37853/34604
+f 34807/37871/34622 37901/37873/34624 37902/37877/34628 34812/37876/34627
+f 34812/37876/34627 37902/37877/34628 40548/37859/34610 39486/37858/34609
+f 34813/37878/34629 34817/37879/34630 34818/37880/34631 34814/37881/34632
+f 34814/37881/34632 34818/37880/34631 37833/37505/34260 37832/37501/34256
+f 34817/37879/34630 39488/37869/34620 39487/37868/34619 34818/37880/34631
+f 34818/37880/34631 39487/37868/34619 40525/37487/34242 37833/37505/34260
+f 34813/37878/34629 34814/37881/34632 34819/37882/34633 34815/37883/34634
+f 34815/37883/34634 34819/37882/34633 39490/37884/34635 39491/37885/34636
+f 34814/37881/34632 37832/37501/34256 37831/37500/34255 34819/37882/34633
+f 34819/37882/34633 37831/37500/34255 40526/37503/34258 39490/37884/34635
+f 34813/37878/34629 34815/37883/34634 34820/37886/34637 34816/37887/34638
+f 34816/37887/34638 34820/37886/34637 37903/37888/34639 37904/37889/34640
+f 34815/37883/34634 39491/37885/34636 39492/37890/34641 34820/37886/34637
+f 34820/37886/34637 39492/37890/34641 40550/37891/34642 37903/37888/34639
+f 34813/37878/34629 34816/37887/34638 34821/37892/34643 34817/37879/34630
+f 34817/37879/34630 34821/37892/34643 39489/37874/34625 39488/37869/34620
+f 34816/37887/34638 37904/37889/34640 37905/37893/34644 34821/37892/34643
+f 34821/37892/34643 37905/37893/34644 40549/37875/34626 39489/37874/34625
+f 34822/37894/34645 34826/37895/34646 34827/37896/34647 34823/37897/34648
+f 34823/37897/34648 34827/37896/34647 37836/37521/34276 37835/37517/34272
+f 34826/37895/34646 39491/37885/34636 39490/37884/34635 34827/37896/34647
+f 34827/37896/34647 39490/37884/34635 40526/37503/34258 37836/37521/34276
+f 34822/37894/34645 34823/37897/34648 34828/37898/34649 34824/37899/34650
+f 34824/37899/34650 34828/37898/34649 39493/37900/34651 39494/37901/34652
+f 34823/37897/34648 37835/37517/34272 37834/37516/34271 34828/37898/34649
+f 34828/37898/34649 37834/37516/34271 40527/37519/34274 39493/37900/34651
+f 34822/37894/34645 34824/37899/34650 34829/37902/34653 34825/37903/34654
+f 34825/37903/34654 34829/37902/34653 37906/37904/34655 37907/37905/34656
+f 34824/37899/34650 39494/37901/34652 39495/37906/34657 34829/37902/34653
+f 34829/37902/34653 39495/37906/34657 40551/37907/34658 37906/37904/34655
+f 34822/37894/34645 34825/37903/34654 34830/37908/34659 34826/37895/34646
+f 34826/37895/34646 34830/37908/34659 39492/37890/34641 39491/37885/34636
+f 34825/37903/34654 37907/37905/34656 37908/37909/34660 34830/37908/34659
+f 34830/37908/34659 37908/37909/34660 40550/37891/34642 39492/37890/34641
+f 34831/37910/34661 34835/37911/34662 34836/37912/34663 34832/37913/34664
+f 34832/37913/34664 34836/37912/34663 37839/37537/34292 37838/37533/34288
+f 34835/37911/34662 39494/37901/34652 39493/37900/34651 34836/37912/34663
+f 34836/37912/34663 39493/37900/34651 40527/37519/34274 37839/37537/34292
+f 34831/37910/34661 34832/37913/34664 34837/37914/34665 34833/37915/34666
+f 34833/37915/34666 34837/37914/34665 39496/37916/34667 39497/37917/34668
+f 34832/37913/34664 37838/37533/34288 37837/37532/34287 34837/37914/34665
+f 34837/37914/34665 37837/37532/34287 40528/37535/34290 39496/37916/34667
+f 34831/37910/34661 34833/37915/34666 34838/37918/34669 34834/37919/34670
+f 34834/37919/34670 34838/37918/34669 37909/37920/34671 37910/37921/34672
+f 34833/37915/34666 39497/37917/34668 39498/37922/34673 34838/37918/34669
+f 34838/37918/34669 39498/37922/34673 40552/37923/34674 37909/37920/34671
+f 34831/37910/34661 34834/37919/34670 34839/37924/34675 34835/37911/34662
+f 34835/37911/34662 34839/37924/34675 39495/37906/34657 39494/37901/34652
+f 34834/37919/34670 37910/37921/34672 37911/37925/34676 34839/37924/34675
+f 34839/37924/34675 37911/37925/34676 40551/37907/34658 39495/37906/34657
+f 34840/37926/34677 34844/37927/34678 34845/37928/34679 34841/37929/34680
+f 34841/37929/34680 34845/37928/34679 37842/37553/34308 37841/37549/34304
+f 34844/37927/34678 39497/37917/34668 39496/37916/34667 34845/37928/34679
+f 34845/37928/34679 39496/37916/34667 40528/37535/34290 37842/37553/34308
+f 34840/37926/34677 34841/37929/34680 34846/37930/34681 34842/37931/34682
+f 34842/37931/34682 34846/37930/34681 39499/37932/34683 39500/37933/34684
+f 34841/37929/34680 37841/37549/34304 37840/37548/34303 34846/37930/34681
+f 34846/37930/34681 37840/37548/34303 40529/37551/34306 39499/37932/34683
+f 34840/37926/34677 34842/37931/34682 34847/37934/34685 34843/37935/34686
+f 34843/37935/34686 34847/37934/34685 37912/37936/34687 37913/37937/34688
+f 34842/37931/34682 39500/37933/34684 39501/37938/34689 34847/37934/34685
+f 34847/37934/34685 39501/37938/34689 40553/37939/34690 37912/37936/34687
+f 34840/37926/34677 34843/37935/34686 34848/37940/34691 34844/37927/34678
+f 34844/37927/34678 34848/37940/34691 39498/37922/34673 39497/37917/34668
+f 34843/37935/34686 37913/37937/34688 37914/37941/34692 34848/37940/34691
+f 34848/37940/34691 37914/37941/34692 40552/37923/34674 39498/37922/34673
+f 34849/37942/34693 34853/37943/34694 34854/37944/34695 34850/37945/34696
+f 34850/37945/34696 34854/37944/34695 37845/37569/34324 37844/37565/34320
+f 34853/37943/34694 39500/37933/34684 39499/37932/34683 34854/37944/34695
+f 34854/37944/34695 39499/37932/34683 40529/37551/34306 37845/37569/34324
+f 34849/37942/34693 34850/37945/34696 34855/37946/34697 34851/37947/34698
+f 34851/37947/34698 34855/37946/34697 39502/37948/34699 39503/37949/34700
+f 34850/37945/34696 37844/37565/34320 37843/37564/34319 34855/37946/34697
+f 34855/37946/34697 37843/37564/34319 40530/37567/34322 39502/37948/34699
+f 34849/37942/34693 34851/37947/34698 34856/37950/34701 34852/37951/34702
+f 34852/37951/34702 34856/37950/34701 37915/37952/34703 37916/37953/34704
+f 34851/37947/34698 39503/37949/34700 39504/37954/34705 34856/37950/34701
+f 34856/37950/34701 39504/37954/34705 40554/37955/34706 37915/37952/34703
+f 34849/37942/34693 34852/37951/34702 34857/37956/34707 34853/37943/34694
+f 34853/37943/34694 34857/37956/34707 39501/37938/34689 39500/37933/34684
+f 34852/37951/34702 37916/37953/34704 37917/37957/34708 34857/37956/34707
+f 34857/37956/34707 37917/37957/34708 40553/37939/34690 39501/37938/34689
+f 34858/37958/34709 34862/37959/34710 34863/37960/34711 34859/37961/34712
+f 34859/37961/34712 34863/37960/34711 37848/37585/34340 37847/37581/34336
+f 34862/37959/34710 39503/37949/34700 39502/37948/34699 34863/37960/34711
+f 34863/37960/34711 39502/37948/34699 40530/37567/34322 37848/37585/34340
+f 34858/37958/34709 34859/37961/34712 34864/37962/34713 34860/37963/34714
+f 34860/37963/34714 34864/37962/34713 39505/37964/34715 39506/37965/34716
+f 34859/37961/34712 37847/37581/34336 37846/37580/34335 34864/37962/34713
+f 34864/37962/34713 37846/37580/34335 40531/37583/34338 39505/37964/34715
+f 34858/37958/34709 34860/37963/34714 34865/37966/34717 34861/37967/34718
+f 34861/37967/34718 34865/37966/34717 37918/37968/34719 37919/37969/34720
+f 34860/37963/34714 39506/37965/34716 39507/37970/34721 34865/37966/34717
+f 34865/37966/34717 39507/37970/34721 40555/37971/34722 37918/37968/34719
+f 34858/37958/34709 34861/37967/34718 34866/37972/34723 34862/37959/34710
+f 34862/37959/34710 34866/37972/34723 39504/37954/34705 39503/37949/34700
+f 34861/37967/34718 37919/37969/34720 37920/37973/34724 34866/37972/34723
+f 34866/37972/34723 37920/37973/34724 40554/37955/34706 39504/37954/34705
+f 34867/37974/34725 34871/37975/34726 34872/37976/34727 34868/37977/34728
+f 34868/37977/34728 34872/37976/34727 37851/37601/34356 37850/37597/34352
+f 34871/37975/34726 39506/37965/34716 39505/37964/34715 34872/37976/34727
+f 34872/37976/34727 39505/37964/34715 40531/37583/34338 37851/37601/34356
+f 34867/37974/34725 34868/37977/34728 34873/37978/34729 34869/37979/34730
+f 34869/37979/34730 34873/37978/34729 39508/37980/34731 39509/37981/34732
+f 34868/37977/34728 37850/37597/34352 37849/37596/34351 34873/37978/34729
+f 34873/37978/34729 37849/37596/34351 40532/37599/34354 39508/37980/34731
+f 34867/37974/34725 34869/37979/34730 34874/37982/34733 34870/37983/34734
+f 34870/37983/34734 34874/37982/34733 37921/37984/34735 37922/37985/34736
+f 34869/37979/34730 39509/37981/34732 39510/37986/34737 34874/37982/34733
+f 34874/37982/34733 39510/37986/34737 40556/37987/34738 37921/37984/34735
+f 34867/37974/34725 34870/37983/34734 34875/37988/34739 34871/37975/34726
+f 34871/37975/34726 34875/37988/34739 39507/37970/34721 39506/37965/34716
+f 34870/37983/34734 37922/37985/34736 37923/37989/34740 34875/37988/34739
+f 34875/37988/34739 37923/37989/34740 40555/37971/34722 39507/37970/34721
+f 34876/37990/34741 34880/37991/34742 34881/37992/34743 34877/37993/34744
+f 34877/37993/34744 34881/37992/34743 37854/37617/34372 37853/37613/34368
+f 34880/37991/34742 39509/37981/34732 39508/37980/34731 34881/37992/34743
+f 34881/37992/34743 39508/37980/34731 40532/37599/34354 37854/37617/34372
+f 34876/37990/34741 34877/37993/34744 34882/37994/34745 34878/37995/34746
+f 34878/37995/34746 34882/37994/34745 39511/37996/34747 39512/37997/34748
+f 34877/37993/34744 37853/37613/34368 37852/37612/34367 34882/37994/34745
+f 34882/37994/34745 37852/37612/34367 40533/37615/34370 39511/37996/34747
+f 34876/37990/34741 34878/37995/34746 34883/37998/34749 34879/37999/34750
+f 34879/37999/34750 34883/37998/34749 37924/38000/34751 37925/38001/34752
+f 34878/37995/34746 39512/37997/34748 39513/38002/34753 34883/37998/34749
+f 34883/37998/34749 39513/38002/34753 40557/38003/34754 37924/38000/34751
+f 34876/37990/34741 34879/37999/34750 34884/38004/34755 34880/37991/34742
+f 34880/37991/34742 34884/38004/34755 39510/37986/34737 39509/37981/34732
+f 34879/37999/34750 37925/38001/34752 37926/38005/34756 34884/38004/34755
+f 34884/38004/34755 37926/38005/34756 40556/37987/34738 39510/37986/34737
+f 34885/38006/34757 34889/38007/34758 34890/38008/34759 34886/38009/34760
+f 34886/38009/34760 34890/38008/34759 37857/37633/34388 37856/37629/34384
+f 34889/38007/34758 39512/37997/34748 39511/37996/34747 34890/38008/34759
+f 34890/38008/34759 39511/37996/34747 40533/37615/34370 37857/37633/34388
+f 34885/38006/34757 34886/38009/34760 34891/38010/34761 34887/38011/34762
+f 34887/38011/34762 34891/38010/34761 39514/38012/34763 39515/38013/34764
+f 34886/38009/34760 37856/37629/34384 37855/37628/34383 34891/38010/34761
+f 34891/38010/34761 37855/37628/34383 40534/37631/34386 39514/38012/34763
+f 34885/38006/34757 34887/38011/34762 34892/38014/34765 34888/38015/34766
+f 34888/38015/34766 34892/38014/34765 37927/38016/34767 37928/38017/34768
+f 34887/38011/34762 39515/38013/34764 39516/38018/34769 34892/38014/34765
+f 34892/38014/34765 39516/38018/34769 40558/38019/34770 37927/38016/34767
+f 34885/38006/34757 34888/38015/34766 34893/38020/34771 34889/38007/34758
+f 34889/38007/34758 34893/38020/34771 39513/38002/34753 39512/37997/34748
+f 34888/38015/34766 37928/38017/34768 37929/38021/34772 34893/38020/34771
+f 34893/38020/34771 37929/38021/34772 40557/38003/34754 39513/38002/34753
+f 34894/38022/34773 34898/38023/34774 34899/38024/34775 34895/38025/34776
+f 34895/38025/34776 34899/38024/34775 37860/37649/34404 37859/37645/34400
+f 34898/38023/34774 39515/38013/34764 39514/38012/34763 34899/38024/34775
+f 34899/38024/34775 39514/38012/34763 40534/37631/34386 37860/37649/34404
+f 34894/38022/34773 34895/38025/34776 34900/38026/34777 34896/38027/34778
+f 34896/38027/34778 34900/38026/34777 39517/38028/34779 39518/38029/34780
+f 34895/38025/34776 37859/37645/34400 37858/37644/34399 34900/38026/34777
+f 34900/38026/34777 37858/37644/34399 40535/37647/34402 39517/38028/34779
+f 34894/38022/34773 34896/38027/34778 34901/38030/34781 34897/38031/34782
+f 34897/38031/34782 34901/38030/34781 37930/38032/34783 37931/38033/34784
+f 34896/38027/34778 39518/38029/34780 39519/38034/34785 34901/38030/34781
+f 34901/38030/34781 39519/38034/34785 40559/38035/34786 37930/38032/34783
+f 34894/38022/34773 34897/38031/34782 34902/38036/34787 34898/38023/34774
+f 34898/38023/34774 34902/38036/34787 39516/38018/34769 39515/38013/34764
+f 34897/38031/34782 37931/38033/34784 37932/38037/34788 34902/38036/34787
+f 34902/38036/34787 37932/38037/34788 40558/38019/34770 39516/38018/34769
+f 34903/38038/34789 34907/38039/34790 34908/38040/34791 34904/38041/34792
+f 34904/38041/34792 34908/38040/34791 37863/37665/34420 37862/37661/34416
+f 34907/38039/34790 39518/38029/34780 39517/38028/34779 34908/38040/34791
+f 34908/38040/34791 39517/38028/34779 40535/37647/34402 37863/37665/34420
+f 34903/38038/34789 34904/38041/34792 34909/38042/34793 34905/38043/34794
+f 34905/38043/34794 34909/38042/34793 39520/38044/34795 39521/38045/34796
+f 34904/38041/34792 37862/37661/34416 37861/37660/34415 34909/38042/34793
+f 34909/38042/34793 37861/37660/34415 40536/37663/34418 39520/38044/34795
+f 34903/38038/34789 34905/38043/34794 34910/38046/34797 34906/38047/34798
+f 34906/38047/34798 34910/38046/34797 37933/38048/34799 37934/38049/34800
+f 34905/38043/34794 39521/38045/34796 39522/38050/34801 34910/38046/34797
+f 34910/38046/34797 39522/38050/34801 40560/38051/34802 37933/38048/34799
+f 34903/38038/34789 34906/38047/34798 34911/38052/34803 34907/38039/34790
+f 34907/38039/34790 34911/38052/34803 39519/38034/34785 39518/38029/34780
+f 34906/38047/34798 37934/38049/34800 37935/38053/34804 34911/38052/34803
+f 34911/38052/34803 37935/38053/34804 40559/38035/34786 39519/38034/34785
+f 34912/38054/34805 34916/38055/34806 34917/38056/34807 34913/38057/34808
+f 34913/38057/34808 34917/38056/34807 37866/37681/34436 37865/37677/34432
+f 34916/38055/34806 39521/38045/34796 39520/38044/34795 34917/38056/34807
+f 34917/38056/34807 39520/38044/34795 40536/37663/34418 37866/37681/34436
+f 34912/38054/34805 34913/38057/34808 34918/38058/34809 34914/38059/34810
+f 34914/38059/34810 34918/38058/34809 39523/38060/34811 39524/38061/34812
+f 34913/38057/34808 37865/37677/34432 37864/37676/34431 34918/38058/34809
+f 34918/38058/34809 37864/37676/34431 40537/37679/34434 39523/38060/34811
+f 34912/38054/34805 34914/38059/34810 34919/38062/34813 34915/38063/34814
+f 34915/38063/34814 34919/38062/34813 37936/38064/34815 37937/38065/34816
+f 34914/38059/34810 39524/38061/34812 39525/38066/34817 34919/38062/34813
+f 34919/38062/34813 39525/38066/34817 40561/38067/34818 37936/38064/34815
+f 34912/38054/34805 34915/38063/34814 34920/38068/34819 34916/38055/34806
+f 34916/38055/34806 34920/38068/34819 39522/38050/34801 39521/38045/34796
+f 34915/38063/34814 37937/38065/34816 37938/38069/34820 34920/38068/34819
+f 34920/38068/34819 37938/38069/34820 40560/38051/34802 39522/38050/34801
+f 34921/38070/34821 34925/38071/34822 34926/38072/34823 34922/38073/34824
+f 34922/38073/34824 34926/38072/34823 37869/37697/34452 37868/37693/34448
+f 34925/38071/34822 39524/38061/34812 39523/38060/34811 34926/38072/34823
+f 34926/38072/34823 39523/38060/34811 40537/37679/34434 37869/37697/34452
+f 34921/38070/34821 34922/38073/34824 34927/38074/34825 34923/38075/34826
+f 34923/38075/34826 34927/38074/34825 39526/38076/34827 39527/38077/34828
+f 34922/38073/34824 37868/37693/34448 37867/37692/34447 34927/38074/34825
+f 34927/38074/34825 37867/37692/34447 40538/37695/34450 39526/38076/34827
+f 34921/38070/34821 34923/38075/34826 34928/38078/34829 34924/38079/34830
+f 34924/38079/34830 34928/38078/34829 37939/38080/34831 37940/38081/34832
+f 34923/38075/34826 39527/38077/34828 39528/38082/34833 34928/38078/34829
+f 34928/38078/34829 39528/38082/34833 40562/38083/34834 37939/38080/34831
+f 34921/38070/34821 34924/38079/34830 34929/38084/34835 34925/38071/34822
+f 34925/38071/34822 34929/38084/34835 39525/38066/34817 39524/38061/34812
+f 34924/38079/34830 37940/38081/34832 37941/38085/34836 34929/38084/34835
+f 34929/38084/34835 37941/38085/34836 40561/38067/34818 39525/38066/34817
+f 34930/38086/34837 34934/38087/34838 34935/38088/34839 34931/38089/34840
+f 34931/38089/34840 34935/38088/34839 37872/37713/34468 37871/37709/34464
+f 34934/38087/34838 39527/38077/34828 39526/38076/34827 34935/38088/34839
+f 34935/38088/34839 39526/38076/34827 40538/37695/34450 37872/37713/34468
+f 34930/38086/34837 34931/38089/34840 34936/38090/34841 34932/38091/34842
+f 34932/38091/34842 34936/38090/34841 39529/38092/34843 39530/38093/34844
+f 34931/38089/34840 37871/37709/34464 37870/37708/34463 34936/38090/34841
+f 34936/38090/34841 37870/37708/34463 40539/37711/34466 39529/38092/34843
+f 34930/38086/34837 34932/38091/34842 34937/38094/34845 34933/38095/34846
+f 34933/38095/34846 34937/38094/34845 37942/38096/34847 37943/38097/34848
+f 34932/38091/34842 39530/38093/34844 39531/38098/34849 34937/38094/34845
+f 34937/38094/34845 39531/38098/34849 40563/38099/34850 37942/38096/34847
+f 34930/38086/34837 34933/38095/34846 34938/38100/34851 34934/38087/34838
+f 34934/38087/34838 34938/38100/34851 39528/38082/34833 39527/38077/34828
+f 34933/38095/34846 37943/38097/34848 37944/38101/34852 34938/38100/34851
+f 34938/38100/34851 37944/38101/34852 40562/38083/34834 39528/38082/34833
+f 34939/38102/34853 34943/38103/34854 34944/38104/34855 34940/38105/34856
+f 34940/38105/34856 34944/38104/34855 37875/37729/34480 37874/37725/34478
+f 34943/38103/34854 39530/38093/34844 39529/38092/34843 34944/38104/34855
+f 34944/38104/34855 39529/38092/34843 40539/37711/34466 37875/37729/34480
+f 34939/38102/34853 34940/38105/34856 34945/38106/34857 34941/38107/34858
+f 34941/38107/34858 34945/38106/34857 39462/38108/34486 39461/38109/34485
+f 34940/38105/34856 37874/37725/34478 37873/37724/34477 34945/38106/34857
+f 34945/38106/34857 37873/37724/34477 40516/37727/34116 39462/38108/34486
+f 34939/38102/34853 34941/38107/34858 34946/38110/34859 34942/38111/34860
+f 34942/38111/34860 34946/38110/34859 37945/38112/34861 37946/38113/34862
+f 34941/38107/34858 39461/38109/34485 39460/38114/34498 34946/38110/34859
+f 34946/38110/34859 39460/38114/34498 40540/38115/34500 37945/38112/34861
+f 34939/38102/34853 34942/38111/34860 34947/38116/34863 34943/38103/34854
+f 34943/38103/34854 34947/38116/34863 39531/38098/34849 39530/38093/34844
+f 34942/38111/34860 37946/38113/34862 37947/38117/34864 34947/38116/34863
+f 34947/38116/34863 37947/38117/34864 40563/38099/34850 39531/38098/34849
+f 34948/38118/34865 34952/38119/34866 34953/38120/34867 34949/38121/34868
+f 34949/38121/34868 34953/38120/34867 37878/37748/34499 37877/37743/34494
+f 34952/38119/34866 39533/38122/34869 39534/38123/34870 34953/38120/34867
+f 34953/38120/34867 39534/38123/34870 40540/37749/34500 37878/37748/34499
+f 34948/38118/34865 34949/38121/34868 34954/38124/34871 34950/38125/34872
+f 34950/38125/34872 34954/38124/34871 39535/38126/34873 39536/38127/34874
+f 34949/38121/34868 37877/37743/34494 37876/37742/34493 34954/38124/34871
+f 34954/38124/34871 37876/37742/34493 40541/37745/34496 39535/38126/34873
+f 34948/38118/34865 34950/38125/34872 34955/38128/34875 34951/38129/34876
+f 34951/38129/34876 34955/38128/34875 37948/38130/34877 37949/38131/34878
+f 34950/38125/34872 39536/38127/34874 39537/38132/34879 34955/38128/34875
+f 34955/38128/34875 39537/38132/34879 40565/38133/34880 37948/38130/34877
+f 34948/38118/34865 34951/38129/34876 34956/38134/34881 34952/38119/34866
+f 34952/38119/34866 34956/38134/34881 39532/38135/34882 39533/38122/34869
+f 34951/38129/34876 37949/38131/34878 37950/38136/34883 34956/38134/34881
+f 34956/38134/34881 37950/38136/34883 40564/38137/34884 39532/38135/34882
+f 34957/38138/34885 34961/38139/34886 34962/38140/34887 34958/38141/34888
+f 34958/38141/34888 34962/38140/34887 37881/37765/34516 37880/37761/34512
+f 34961/38139/34886 39536/38127/34874 39535/38126/34873 34962/38140/34887
+f 34962/38140/34887 39535/38126/34873 40541/37745/34496 37881/37765/34516
+f 34957/38138/34885 34958/38141/34888 34963/38142/34889 34959/38143/34890
+f 34959/38143/34890 34963/38142/34889 39538/38144/34891 39539/38145/34892
+f 34958/38141/34888 37880/37761/34512 37879/37760/34511 34963/38142/34889
+f 34963/38142/34889 37879/37760/34511 40542/37763/34514 39538/38144/34891
+f 34957/38138/34885 34959/38143/34890 34964/38146/34893 34960/38147/34894
+f 34960/38147/34894 34964/38146/34893 37951/38148/34895 37952/38149/34896
+f 34959/38143/34890 39539/38145/34892 39540/38150/34897 34964/38146/34893
+f 34964/38146/34893 39540/38150/34897 40566/38151/34898 37951/38148/34895
+f 34957/38138/34885 34960/38147/34894 34965/38152/34899 34961/38139/34886
+f 34961/38139/34886 34965/38152/34899 39537/38132/34879 39536/38127/34874
+f 34960/38147/34894 37952/38149/34896 37953/38153/34900 34965/38152/34899
+f 34965/38152/34899 37953/38153/34900 40565/38133/34880 39537/38132/34879
+f 34966/38154/34901 34970/38155/34902 34971/38156/34903 34967/38157/34904
+f 34967/38157/34904 34971/38156/34903 37884/37781/34532 37883/37777/34528
+f 34970/38155/34902 39539/38145/34892 39538/38144/34891 34971/38156/34903
+f 34971/38156/34903 39538/38144/34891 40542/37763/34514 37884/37781/34532
+f 34966/38154/34901 34967/38157/34904 34972/38158/34905 34968/38159/34906
+f 34968/38159/34906 34972/38158/34905 39541/38160/34907 39542/38161/34908
+f 34967/38157/34904 37883/37777/34528 37882/37776/34527 34972/38158/34905
+f 34972/38158/34905 37882/37776/34527 40543/37779/34530 39541/38160/34907
+f 34966/38154/34901 34968/38159/34906 34973/38162/34909 34969/38163/34910
+f 34969/38163/34910 34973/38162/34909 37954/38164/34911 37955/38165/34912
+f 34968/38159/34906 39542/38161/34908 39543/38166/34913 34973/38162/34909
+f 34973/38162/34909 39543/38166/34913 40567/38167/34914 37954/38164/34911
+f 34966/38154/34901 34969/38163/34910 34974/38168/34915 34970/38155/34902
+f 34970/38155/34902 34974/38168/34915 39540/38150/34897 39539/38145/34892
+f 34969/38163/34910 37955/38165/34912 37956/38169/34916 34974/38168/34915
+f 34974/38168/34915 37956/38169/34916 40566/38151/34898 39540/38150/34897
+f 34975/38170/34917 34979/38171/34918 34980/38172/34919 34976/38173/34920
+f 34976/38173/34920 34980/38172/34919 37887/37797/34548 37886/37793/34544
+f 34979/38171/34918 39542/38161/34908 39541/38160/34907 34980/38172/34919
+f 34980/38172/34919 39541/38160/34907 40543/37779/34530 37887/37797/34548
+f 34975/38170/34917 34976/38173/34920 34981/38174/34921 34977/38175/34922
+f 34977/38175/34922 34981/38174/34921 39544/38176/34923 39545/38177/34924
+f 34976/38173/34920 37886/37793/34544 37885/37792/34543 34981/38174/34921
+f 34981/38174/34921 37885/37792/34543 40544/37795/34546 39544/38176/34923
+f 34975/38170/34917 34977/38175/34922 34982/38178/34925 34978/38179/34926
+f 34978/38179/34926 34982/38178/34925 37957/38180/34927 37958/38181/34928
+f 34977/38175/34922 39545/38177/34924 39546/38182/34929 34982/38178/34925
+f 34982/38178/34925 39546/38182/34929 40568/38183/34930 37957/38180/34927
+f 34975/38170/34917 34978/38179/34926 34983/38184/34931 34979/38171/34918
+f 34979/38171/34918 34983/38184/34931 39543/38166/34913 39542/38161/34908
+f 34978/38179/34926 37958/38181/34928 37959/38185/34932 34983/38184/34931
+f 34983/38184/34931 37959/38185/34932 40567/38167/34914 39543/38166/34913
+f 34984/38186/34933 34988/38187/34934 34989/38188/34935 34985/38189/34936
+f 34985/38189/34936 34989/38188/34935 37890/37813/34564 37889/37809/34560
+f 34988/38187/34934 39545/38177/34924 39544/38176/34923 34989/38188/34935
+f 34989/38188/34935 39544/38176/34923 40544/37795/34546 37890/37813/34564
+f 34984/38186/34933 34985/38189/34936 34990/38190/34937 34986/38191/34938
+f 34986/38191/34938 34990/38190/34937 39547/38192/34939 39548/38193/34940
+f 34985/38189/34936 37889/37809/34560 37888/37808/34559 34990/38190/34937
+f 34990/38190/34937 37888/37808/34559 40545/37811/34562 39547/38192/34939
+f 34984/38186/34933 34986/38191/34938 34991/38194/34941 34987/38195/34942
+f 34987/38195/34942 34991/38194/34941 37960/38196/34943 37961/38197/34944
+f 34986/38191/34938 39548/38193/34940 39549/38198/34945 34991/38194/34941
+f 34991/38194/34941 39549/38198/34945 40569/38199/34946 37960/38196/34943
+f 34984/38186/34933 34987/38195/34942 34992/38200/34947 34988/38187/34934
+f 34988/38187/34934 34992/38200/34947 39546/38182/34929 39545/38177/34924
+f 34987/38195/34942 37961/38197/34944 37962/38201/34948 34992/38200/34947
+f 34992/38200/34947 37962/38201/34948 40568/38183/34930 39546/38182/34929
+f 34993/38202/34949 34997/38203/34950 34998/38204/34951 34994/38205/34952
+f 34994/38205/34952 34998/38204/34951 37893/37829/34580 37892/37825/34576
+f 34997/38203/34950 39548/38193/34940 39547/38192/34939 34998/38204/34951
+f 34998/38204/34951 39547/38192/34939 40545/37811/34562 37893/37829/34580
+f 34993/38202/34949 34994/38205/34952 34999/38206/34953 34995/38207/34954
+f 34995/38207/34954 34999/38206/34953 39550/38208/34955 39551/38209/34956
+f 34994/38205/34952 37892/37825/34576 37891/37824/34575 34999/38206/34953
+f 34999/38206/34953 37891/37824/34575 40546/37827/34578 39550/38208/34955
+f 34993/38202/34949 34995/38207/34954 35000/38210/34957 34996/38211/34958
+f 34996/38211/34958 35000/38210/34957 37963/38212/34959 37964/38213/34960
+f 34995/38207/34954 39551/38209/34956 39552/38214/34961 35000/38210/34957
+f 35000/38210/34957 39552/38214/34961 40570/38215/34962 37963/38212/34959
+f 34993/38202/34949 34996/38211/34958 35001/38216/34963 34997/38203/34950
+f 34997/38203/34950 35001/38216/34963 39549/38198/34945 39548/38193/34940
+f 34996/38211/34958 37964/38213/34960 37965/38217/34964 35001/38216/34963
+f 35001/38216/34963 37965/38217/34964 40569/38199/34946 39549/38198/34945
+f 35002/38218/34965 35006/38219/34966 35007/38220/34967 35003/38221/34968
+f 35003/38221/34968 35007/38220/34967 37896/37845/34596 37895/37841/34592
+f 35006/38219/34966 39551/38209/34956 39550/38208/34955 35007/38220/34967
+f 35007/38220/34967 39550/38208/34955 40546/37827/34578 37896/37845/34596
+f 35002/38218/34965 35003/38221/34968 35008/38222/34969 35004/38223/34970
+f 35004/38223/34970 35008/38222/34969 39553/38224/34971 39554/38225/34972
+f 35003/38221/34968 37895/37841/34592 37894/37840/34591 35008/38222/34969
+f 35008/38222/34969 37894/37840/34591 40547/37843/34594 39553/38224/34971
+f 35002/38218/34965 35004/38223/34970 35009/38226/34973 35005/38227/34974
+f 35005/38227/34974 35009/38226/34973 37966/38228/34975 37967/38229/34976
+f 35004/38223/34970 39554/38225/34972 39555/38230/34977 35009/38226/34973
+f 35009/38226/34973 39555/38230/34977 40571/38231/34978 37966/38228/34975
+f 35002/38218/34965 35005/38227/34974 35010/38232/34979 35006/38219/34966
+f 35006/38219/34966 35010/38232/34979 39552/38214/34961 39551/38209/34956
+f 35005/38227/34974 37967/38229/34976 37968/38233/34980 35010/38232/34979
+f 35010/38232/34979 37968/38233/34980 40570/38215/34962 39552/38214/34961
+f 35011/38234/34981 35015/38235/34982 35016/38236/34983 35012/38237/34984
+f 35012/38237/34984 35016/38236/34983 37899/37861/34612 37898/37857/34608
+f 35015/38235/34982 39554/38225/34972 39553/38224/34971 35016/38236/34983
+f 35016/38236/34983 39553/38224/34971 40547/37843/34594 37899/37861/34612
+f 35011/38234/34981 35012/38237/34984 35017/38238/34985 35013/38239/34986
+f 35013/38239/34986 35017/38238/34985 39556/38240/34987 39557/38241/34988
+f 35012/38237/34984 37898/37857/34608 37897/37856/34607 35017/38238/34985
+f 35017/38238/34985 37897/37856/34607 40548/37859/34610 39556/38240/34987
+f 35011/38234/34981 35013/38239/34986 35018/38242/34989 35014/38243/34990
+f 35014/38243/34990 35018/38242/34989 37969/38244/34991 37970/38245/34992
+f 35013/38239/34986 39557/38241/34988 39558/38246/34993 35018/38242/34989
+f 35018/38242/34989 39558/38246/34993 40572/38247/34994 37969/38244/34991
+f 35011/38234/34981 35014/38243/34990 35019/38248/34995 35015/38235/34982
+f 35015/38235/34982 35019/38248/34995 39555/38230/34977 39554/38225/34972
+f 35014/38243/34990 37970/38245/34992 37971/38249/34996 35019/38248/34995
+f 35019/38248/34995 37971/38249/34996 40571/38231/34978 39555/38230/34977
+f 35020/38250/34997 35024/38251/34998 35025/38252/34999 35021/38253/35000
+f 35021/38253/35000 35025/38252/34999 37902/37877/34628 37901/37873/34624
+f 35024/38251/34998 39557/38241/34988 39556/38240/34987 35025/38252/34999
+f 35025/38252/34999 39556/38240/34987 40548/37859/34610 37902/37877/34628
+f 35020/38250/34997 35021/38253/35000 35026/38254/35001 35022/38255/35002
+f 35022/38255/35002 35026/38254/35001 39559/38256/35003 39560/38257/35004
+f 35021/38253/35000 37901/37873/34624 37900/37872/34623 35026/38254/35001
+f 35026/38254/35001 37900/37872/34623 40549/37875/34626 39559/38256/35003
+f 35020/38250/34997 35022/38255/35002 35027/38258/35005 35023/38259/35006
+f 35023/38259/35006 35027/38258/35005 37972/38260/35007 37973/38261/35008
+f 35022/38255/35002 39560/38257/35004 39561/38262/35009 35027/38258/35005
+f 35027/38258/35005 39561/38262/35009 40573/38263/35010 37972/38260/35007
+f 35020/38250/34997 35023/38259/35006 35028/38264/35011 35024/38251/34998
+f 35024/38251/34998 35028/38264/35011 39558/38246/34993 39557/38241/34988
+f 35023/38259/35006 37973/38261/35008 37974/38265/35012 35028/38264/35011
+f 35028/38264/35011 37974/38265/35012 40572/38247/34994 39558/38246/34993
+f 35029/38266/35013 35033/38267/35014 35034/38268/35015 35030/38269/35016
+f 35030/38269/35016 35034/38268/35015 37905/37893/34644 37904/37889/34640
+f 35033/38267/35014 39560/38257/35004 39559/38256/35003 35034/38268/35015
+f 35034/38268/35015 39559/38256/35003 40549/37875/34626 37905/37893/34644
+f 35029/38266/35013 35030/38269/35016 35035/38270/35017 35031/38271/35018
+f 35031/38271/35018 35035/38270/35017 39562/38272/35019 39563/38273/35020
+f 35030/38269/35016 37904/37889/34640 37903/37888/34639 35035/38270/35017
+f 35035/38270/35017 37903/37888/34639 40550/37891/34642 39562/38272/35019
+f 35029/38266/35013 35031/38271/35018 35036/38274/35021 35032/38275/35022
+f 35032/38275/35022 35036/38274/35021 37975/38276/35023 37976/38277/35024
+f 35031/38271/35018 39563/38273/35020 39564/38278/35025 35036/38274/35021
+f 35036/38274/35021 39564/38278/35025 40574/38279/35026 37975/38276/35023
+f 35029/38266/35013 35032/38275/35022 35037/38280/35027 35033/38267/35014
+f 35033/38267/35014 35037/38280/35027 39561/38262/35009 39560/38257/35004
+f 35032/38275/35022 37976/38277/35024 37977/38281/35028 35037/38280/35027
+f 35037/38280/35027 37977/38281/35028 40573/38263/35010 39561/38262/35009
+f 35038/38282/35029 35042/38283/35030 35043/38284/35031 35039/38285/35032
+f 35039/38285/35032 35043/38284/35031 37908/37909/34660 37907/37905/34656
+f 35042/38283/35030 39563/38273/35020 39562/38272/35019 35043/38284/35031
+f 35043/38284/35031 39562/38272/35019 40550/37891/34642 37908/37909/34660
+f 35038/38282/35029 35039/38285/35032 35044/38286/35033 35040/38287/35034
+f 35040/38287/35034 35044/38286/35033 39565/38288/35035 39566/38289/35036
+f 35039/38285/35032 37907/37905/34656 37906/37904/34655 35044/38286/35033
+f 35044/38286/35033 37906/37904/34655 40551/37907/34658 39565/38288/35035
+f 35038/38282/35029 35040/38287/35034 35045/38290/35037 35041/38291/35038
+f 35041/38291/35038 35045/38290/35037 37978/38292/35039 37979/38293/35040
+f 35040/38287/35034 39566/38289/35036 39567/38294/35041 35045/38290/35037
+f 35045/38290/35037 39567/38294/35041 40575/38295/35042 37978/38292/35039
+f 35038/38282/35029 35041/38291/35038 35046/38296/35043 35042/38283/35030
+f 35042/38283/35030 35046/38296/35043 39564/38278/35025 39563/38273/35020
+f 35041/38291/35038 37979/38293/35040 37980/38297/35044 35046/38296/35043
+f 35046/38296/35043 37980/38297/35044 40574/38279/35026 39564/38278/35025
+f 35047/38298/35045 35051/38299/35046 35052/38300/35047 35048/38301/35048
+f 35048/38301/35048 35052/38300/35047 37911/37925/34676 37910/37921/34672
+f 35051/38299/35046 39566/38289/35036 39565/38288/35035 35052/38300/35047
+f 35052/38300/35047 39565/38288/35035 40551/37907/34658 37911/37925/34676
+f 35047/38298/35045 35048/38301/35048 35053/38302/35049 35049/38303/35050
+f 35049/38303/35050 35053/38302/35049 39568/38304/35051 39569/38305/35052
+f 35048/38301/35048 37910/37921/34672 37909/37920/34671 35053/38302/35049
+f 35053/38302/35049 37909/37920/34671 40552/37923/34674 39568/38304/35051
+f 35047/38298/35045 35049/38303/35050 35054/38306/35053 35050/38307/35054
+f 35050/38307/35054 35054/38306/35053 37981/38308/35055 37982/38309/35056
+f 35049/38303/35050 39569/38305/35052 39570/38310/35057 35054/38306/35053
+f 35054/38306/35053 39570/38310/35057 40576/38311/35058 37981/38308/35055
+f 35047/38298/35045 35050/38307/35054 35055/38312/35059 35051/38299/35046
+f 35051/38299/35046 35055/38312/35059 39567/38294/35041 39566/38289/35036
+f 35050/38307/35054 37982/38309/35056 37983/38313/35060 35055/38312/35059
+f 35055/38312/35059 37983/38313/35060 40575/38295/35042 39567/38294/35041
+f 35056/38314/35061 35060/38315/35062 35061/38316/35063 35057/38317/35064
+f 35057/38317/35064 35061/38316/35063 37914/37941/34692 37913/37937/34688
+f 35060/38315/35062 39569/38305/35052 39568/38304/35051 35061/38316/35063
+f 35061/38316/35063 39568/38304/35051 40552/37923/34674 37914/37941/34692
+f 35056/38314/35061 35057/38317/35064 35062/38318/35065 35058/38319/35066
+f 35058/38319/35066 35062/38318/35065 39571/38320/35067 39572/38321/35068
+f 35057/38317/35064 37913/37937/34688 37912/37936/34687 35062/38318/35065
+f 35062/38318/35065 37912/37936/34687 40553/37939/34690 39571/38320/35067
+f 35056/38314/35061 35058/38319/35066 35063/38322/35069 35059/38323/35070
+f 35059/38323/35070 35063/38322/35069 37984/38324/35071 37985/38325/35072
+f 35058/38319/35066 39572/38321/35068 39573/38326/35073 35063/38322/35069
+f 35063/38322/35069 39573/38326/35073 40577/38327/35074 37984/38324/35071
+f 35056/38314/35061 35059/38323/35070 35064/38328/35075 35060/38315/35062
+f 35060/38315/35062 35064/38328/35075 39570/38310/35057 39569/38305/35052
+f 35059/38323/35070 37985/38325/35072 37986/38329/35076 35064/38328/35075
+f 35064/38328/35075 37986/38329/35076 40576/38311/35058 39570/38310/35057
+f 35065/38330/35077 35069/38331/35078 35070/38332/35079 35066/38333/35080
+f 35066/38333/35080 35070/38332/35079 37917/37957/34708 37916/37953/34704
+f 35069/38331/35078 39572/38321/35068 39571/38320/35067 35070/38332/35079
+f 35070/38332/35079 39571/38320/35067 40553/37939/34690 37917/37957/34708
+f 35065/38330/35077 35066/38333/35080 35071/38334/35081 35067/38335/35082
+f 35067/38335/35082 35071/38334/35081 39574/38336/35083 39575/38337/35084
+f 35066/38333/35080 37916/37953/34704 37915/37952/34703 35071/38334/35081
+f 35071/38334/35081 37915/37952/34703 40554/37955/34706 39574/38336/35083
+f 35065/38330/35077 35067/38335/35082 35072/38338/35085 35068/38339/35086
+f 35068/38339/35086 35072/38338/35085 37987/38340/35087 37988/38341/35088
+f 35067/38335/35082 39575/38337/35084 39576/38342/35089 35072/38338/35085
+f 35072/38338/35085 39576/38342/35089 40578/38343/35090 37987/38340/35087
+f 35065/38330/35077 35068/38339/35086 35073/38344/35091 35069/38331/35078
+f 35069/38331/35078 35073/38344/35091 39573/38326/35073 39572/38321/35068
+f 35068/38339/35086 37988/38341/35088 37989/38345/35092 35073/38344/35091
+f 35073/38344/35091 37989/38345/35092 40577/38327/35074 39573/38326/35073
+f 35074/38346/35093 35078/38347/35094 35079/38348/35095 35075/38349/35096
+f 35075/38349/35096 35079/38348/35095 37920/37973/34724 37919/37969/34720
+f 35078/38347/35094 39575/38337/35084 39574/38336/35083 35079/38348/35095
+f 35079/38348/35095 39574/38336/35083 40554/37955/34706 37920/37973/34724
+f 35074/38346/35093 35075/38349/35096 35080/38350/35097 35076/38351/35098
+f 35076/38351/35098 35080/38350/35097 39577/38352/35099 39578/38353/35100
+f 35075/38349/35096 37919/37969/34720 37918/37968/34719 35080/38350/35097
+f 35080/38350/35097 37918/37968/34719 40555/37971/34722 39577/38352/35099
+f 35074/38346/35093 35076/38351/35098 35081/38354/35101 35077/38355/35102
+f 35077/38355/35102 35081/38354/35101 37990/38356/35103 37991/38357/35104
+f 35076/38351/35098 39578/38353/35100 39579/38358/35105 35081/38354/35101
+f 35081/38354/35101 39579/38358/35105 40579/38359/35106 37990/38356/35103
+f 35074/38346/35093 35077/38355/35102 35082/38360/35107 35078/38347/35094
+f 35078/38347/35094 35082/38360/35107 39576/38342/35089 39575/38337/35084
+f 35077/38355/35102 37991/38357/35104 37992/38361/35108 35082/38360/35107
+f 35082/38360/35107 37992/38361/35108 40578/38343/35090 39576/38342/35089
+f 35083/38362/35109 35087/38363/35110 35088/38364/35111 35084/38365/35112
+f 35084/38365/35112 35088/38364/35111 37923/37989/34740 37922/37985/34736
+f 35087/38363/35110 39578/38353/35100 39577/38352/35099 35088/38364/35111
+f 35088/38364/35111 39577/38352/35099 40555/37971/34722 37923/37989/34740
+f 35083/38362/35109 35084/38365/35112 35089/38366/35113 35085/38367/35114
+f 35085/38367/35114 35089/38366/35113 39580/38368/35115 39581/38369/35116
+f 35084/38365/35112 37922/37985/34736 37921/37984/34735 35089/38366/35113
+f 35089/38366/35113 37921/37984/34735 40556/37987/34738 39580/38368/35115
+f 35083/38362/35109 35085/38367/35114 35090/38370/35117 35086/38371/35118
+f 35086/38371/35118 35090/38370/35117 37993/38372/35119 37994/38373/35120
+f 35085/38367/35114 39581/38369/35116 39582/38374/35121 35090/38370/35117
+f 35090/38370/35117 39582/38374/35121 40580/38375/35122 37993/38372/35119
+f 35083/38362/35109 35086/38371/35118 35091/38376/35123 35087/38363/35110
+f 35087/38363/35110 35091/38376/35123 39579/38358/35105 39578/38353/35100
+f 35086/38371/35118 37994/38373/35120 37995/38377/35124 35091/38376/35123
+f 35091/38376/35123 37995/38377/35124 40579/38359/35106 39579/38358/35105
+f 35092/38378/35125 35096/38379/35126 35097/38380/35127 35093/38381/35128
+f 35093/38381/35128 35097/38380/35127 37926/38005/34756 37925/38001/34752
+f 35096/38379/35126 39581/38369/35116 39580/38368/35115 35097/38380/35127
+f 35097/38380/35127 39580/38368/35115 40556/37987/34738 37926/38005/34756
+f 35092/38378/35125 35093/38381/35128 35098/38382/35129 35094/38383/35130
+f 35094/38383/35130 35098/38382/35129 39583/38384/35131 39584/38385/35132
+f 35093/38381/35128 37925/38001/34752 37924/38000/34751 35098/38382/35129
+f 35098/38382/35129 37924/38000/34751 40557/38003/34754 39583/38384/35131
+f 35092/38378/35125 35094/38383/35130 35099/38386/35133 35095/38387/35134
+f 35095/38387/35134 35099/38386/35133 37996/38388/35135 37997/38389/35136
+f 35094/38383/35130 39584/38385/35132 39585/38390/35137 35099/38386/35133
+f 35099/38386/35133 39585/38390/35137 40581/38391/35138 37996/38388/35135
+f 35092/38378/35125 35095/38387/35134 35100/38392/35139 35096/38379/35126
+f 35096/38379/35126 35100/38392/35139 39582/38374/35121 39581/38369/35116
+f 35095/38387/35134 37997/38389/35136 37998/38393/35140 35100/38392/35139
+f 35100/38392/35139 37998/38393/35140 40580/38375/35122 39582/38374/35121
+f 35101/38394/35141 35105/38395/35142 35106/38396/35143 35102/38397/35144
+f 35102/38397/35144 35106/38396/35143 37929/38021/34772 37928/38017/34768
+f 35105/38395/35142 39584/38385/35132 39583/38384/35131 35106/38396/35143
+f 35106/38396/35143 39583/38384/35131 40557/38003/34754 37929/38021/34772
+f 35101/38394/35141 35102/38397/35144 35107/38398/35145 35103/38399/35146
+f 35103/38399/35146 35107/38398/35145 39586/38400/35147 39587/38401/35148
+f 35102/38397/35144 37928/38017/34768 37927/38016/34767 35107/38398/35145
+f 35107/38398/35145 37927/38016/34767 40558/38019/34770 39586/38400/35147
+f 35101/38394/35141 35103/38399/35146 35108/38402/35149 35104/38403/35150
+f 35104/38403/35150 35108/38402/35149 37999/38404/35151 38000/38405/35152
+f 35103/38399/35146 39587/38401/35148 39588/38406/35153 35108/38402/35149
+f 35108/38402/35149 39588/38406/35153 40582/38407/35154 37999/38404/35151
+f 35101/38394/35141 35104/38403/35150 35109/38408/35155 35105/38395/35142
+f 35105/38395/35142 35109/38408/35155 39585/38390/35137 39584/38385/35132
+f 35104/38403/35150 38000/38405/35152 38001/38409/35156 35109/38408/35155
+f 35109/38408/35155 38001/38409/35156 40581/38391/35138 39585/38390/35137
+f 35110/38410/35157 35114/38411/35158 35115/38412/35159 35111/38413/35160
+f 35111/38413/35160 35115/38412/35159 37932/38037/34788 37931/38033/34784
+f 35114/38411/35158 39587/38401/35148 39586/38400/35147 35115/38412/35159
+f 35115/38412/35159 39586/38400/35147 40558/38019/34770 37932/38037/34788
+f 35110/38410/35157 35111/38413/35160 35116/38414/35161 35112/38415/35162
+f 35112/38415/35162 35116/38414/35161 39589/38416/35163 39590/38417/35164
+f 35111/38413/35160 37931/38033/34784 37930/38032/34783 35116/38414/35161
+f 35116/38414/35161 37930/38032/34783 40559/38035/34786 39589/38416/35163
+f 35110/38410/35157 35112/38415/35162 35117/38418/35165 35113/38419/35166
+f 35113/38419/35166 35117/38418/35165 38002/38420/35167 38003/38421/35168
+f 35112/38415/35162 39590/38417/35164 39591/38422/35169 35117/38418/35165
+f 35117/38418/35165 39591/38422/35169 40583/38423/35170 38002/38420/35167
+f 35110/38410/35157 35113/38419/35166 35118/38424/35171 35114/38411/35158
+f 35114/38411/35158 35118/38424/35171 39588/38406/35153 39587/38401/35148
+f 35113/38419/35166 38003/38421/35168 38004/38425/35172 35118/38424/35171
+f 35118/38424/35171 38004/38425/35172 40582/38407/35154 39588/38406/35153
+f 35119/38426/35173 35123/38427/35174 35124/38428/35175 35120/38429/35176
+f 35120/38429/35176 35124/38428/35175 37935/38053/34804 37934/38049/34800
+f 35123/38427/35174 39590/38417/35164 39589/38416/35163 35124/38428/35175
+f 35124/38428/35175 39589/38416/35163 40559/38035/34786 37935/38053/34804
+f 35119/38426/35173 35120/38429/35176 35125/38430/35177 35121/38431/35178
+f 35121/38431/35178 35125/38430/35177 39592/38432/35179 39593/38433/35180
+f 35120/38429/35176 37934/38049/34800 37933/38048/34799 35125/38430/35177
+f 35125/38430/35177 37933/38048/34799 40560/38051/34802 39592/38432/35179
+f 35119/38426/35173 35121/38431/35178 35126/38434/35181 35122/38435/35182
+f 35122/38435/35182 35126/38434/35181 38005/38436/35183 38006/38437/35184
+f 35121/38431/35178 39593/38433/35180 39594/38438/35185 35126/38434/35181
+f 35126/38434/35181 39594/38438/35185 40584/38439/35186 38005/38436/35183
+f 35119/38426/35173 35122/38435/35182 35127/38440/35187 35123/38427/35174
+f 35123/38427/35174 35127/38440/35187 39591/38422/35169 39590/38417/35164
+f 35122/38435/35182 38006/38437/35184 38007/38441/35188 35127/38440/35187
+f 35127/38440/35187 38007/38441/35188 40583/38423/35170 39591/38422/35169
+f 35128/38442/35189 35132/38443/35190 35133/38444/35191 35129/38445/35192
+f 35129/38445/35192 35133/38444/35191 37938/38069/34820 37937/38065/34816
+f 35132/38443/35190 39593/38433/35180 39592/38432/35179 35133/38444/35191
+f 35133/38444/35191 39592/38432/35179 40560/38051/34802 37938/38069/34820
+f 35128/38442/35189 35129/38445/35192 35134/38446/35193 35130/38447/35194
+f 35130/38447/35194 35134/38446/35193 39595/38448/35195 39596/38449/35196
+f 35129/38445/35192 37937/38065/34816 37936/38064/34815 35134/38446/35193
+f 35134/38446/35193 37936/38064/34815 40561/38067/34818 39595/38448/35195
+f 35128/38442/35189 35130/38447/35194 35135/38450/35197 35131/38451/35198
+f 35131/38451/35198 35135/38450/35197 38008/38452/35199 38009/38453/35200
+f 35130/38447/35194 39596/38449/35196 39597/38454/35201 35135/38450/35197
+f 35135/38450/35197 39597/38454/35201 40585/38455/35202 38008/38452/35199
+f 35128/38442/35189 35131/38451/35198 35136/38456/35203 35132/38443/35190
+f 35132/38443/35190 35136/38456/35203 39594/38438/35185 39593/38433/35180
+f 35131/38451/35198 38009/38453/35200 38010/38457/35204 35136/38456/35203
+f 35136/38456/35203 38010/38457/35204 40584/38439/35186 39594/38438/35185
+f 35137/38458/35205 35141/38459/35206 35142/38460/35207 35138/38461/35208
+f 35138/38461/35208 35142/38460/35207 37941/38085/34836 37940/38081/34832
+f 35141/38459/35206 39596/38449/35196 39595/38448/35195 35142/38460/35207
+f 35142/38460/35207 39595/38448/35195 40561/38067/34818 37941/38085/34836
+f 35137/38458/35205 35138/38461/35208 35143/38462/35209 35139/38463/35210
+f 35139/38463/35210 35143/38462/35209 39598/38464/35211 39599/38465/35212
+f 35138/38461/35208 37940/38081/34832 37939/38080/34831 35143/38462/35209
+f 35143/38462/35209 37939/38080/34831 40562/38083/34834 39598/38464/35211
+f 35137/38458/35205 35139/38463/35210 35144/38466/35213 35140/38467/35214
+f 35140/38467/35214 35144/38466/35213 38011/38468/35215 38012/38469/35216
+f 35139/38463/35210 39599/38465/35212 39600/38470/35217 35144/38466/35213
+f 35144/38466/35213 39600/38470/35217 40586/38471/35218 38011/38468/35215
+f 35137/38458/35205 35140/38467/35214 35145/38472/35219 35141/38459/35206
+f 35141/38459/35206 35145/38472/35219 39597/38454/35201 39596/38449/35196
+f 35140/38467/35214 38012/38469/35216 38013/38473/35220 35145/38472/35219
+f 35145/38472/35219 38013/38473/35220 40585/38455/35202 39597/38454/35201
+f 35146/38474/35221 35150/38475/35222 35151/38476/35223 35147/38477/35224
+f 35147/38477/35224 35151/38476/35223 37944/38101/34852 37943/38097/34848
+f 35150/38475/35222 39599/38465/35212 39598/38464/35211 35151/38476/35223
+f 35151/38476/35223 39598/38464/35211 40562/38083/34834 37944/38101/34852
+f 35146/38474/35221 35147/38477/35224 35152/38478/35225 35148/38479/35226
+f 35148/38479/35226 35152/38478/35225 39601/38480/35227 39602/38481/35228
+f 35147/38477/35224 37943/38097/34848 37942/38096/34847 35152/38478/35225
+f 35152/38478/35225 37942/38096/34847 40563/38099/34850 39601/38480/35227
+f 35146/38474/35221 35148/38479/35226 35153/38482/35229 35149/38483/35230
+f 35149/38483/35230 35153/38482/35229 38014/38484/35231 38015/38485/35232
+f 35148/38479/35226 39602/38481/35228 39603/38486/35233 35153/38482/35229
+f 35153/38482/35229 39603/38486/35233 40587/38487/35234 38014/38484/35231
+f 35146/38474/35221 35149/38483/35230 35154/38488/35235 35150/38475/35222
+f 35150/38475/35222 35154/38488/35235 39600/38470/35217 39599/38465/35212
+f 35149/38483/35230 38015/38485/35232 38016/38489/35236 35154/38488/35235
+f 35154/38488/35235 38016/38489/35236 40586/38471/35218 39600/38470/35217
+f 35155/38490/35237 35159/38491/35238 35160/38492/35239 35156/38493/35240
+f 35156/38493/35240 35160/38492/35239 37947/38117/34864 37946/38113/34862
+f 35159/38491/35238 39602/38481/35228 39601/38480/35227 35160/38492/35239
+f 35160/38492/35239 39601/38480/35227 40563/38099/34850 37947/38117/34864
+f 35155/38490/35237 35156/38493/35240 35161/38494/35241 35157/38495/35242
+f 35157/38495/35242 35161/38494/35241 39534/38496/34870 39533/38497/34869
+f 35156/38493/35240 37946/38113/34862 37945/38112/34861 35161/38494/35241
+f 35161/38494/35241 37945/38112/34861 40540/38115/34500 39534/38496/34870
+f 35155/38490/35237 35157/38495/35242 35162/38498/35243 35158/38499/35244
+f 35158/38499/35244 35162/38498/35243 38017/38500/35245 38018/38501/35246
+f 35157/38495/35242 39533/38497/34869 39532/38502/34882 35162/38498/35243
+f 35162/38498/35243 39532/38502/34882 40564/38503/34884 38017/38500/35245
+f 35155/38490/35237 35158/38499/35244 35163/38504/35247 35159/38491/35238
+f 35159/38491/35238 35163/38504/35247 39603/38486/35233 39602/38481/35228
+f 35158/38499/35244 38018/38501/35246 38019/38505/35248 35163/38504/35247
+f 35163/38504/35247 38019/38505/35248 40587/38487/35234 39603/38486/35233
+f 35164/38506/35249 35168/38507/35250 35169/38508/35251 35165/38509/35252
+f 35165/38509/35252 35169/38508/35251 37950/38136/34883 37949/38131/34878
+f 35168/38507/35250 39605/38510/35253 39606/38511/35254 35169/38508/35251
+f 35169/38508/35251 39606/38511/35254 40564/38137/34884 37950/38136/34883
+f 35164/38506/35249 35165/38509/35252 35170/38512/35255 35166/38513/35256
+f 35166/38513/35256 35170/38512/35255 39607/38514/35257 39608/38515/35258
+f 35165/38509/35252 37949/38131/34878 37948/38130/34877 35170/38512/35255
+f 35170/38512/35255 37948/38130/34877 40565/38133/34880 39607/38514/35257
+f 35164/38506/35249 35166/38513/35256 35171/38516/35259 35167/38517/35260
+f 35167/38517/35260 35171/38516/35259 38020/38518/35261 38021/38519/35262
+f 35166/38513/35256 39608/38515/35258 39609/38520/35263 35171/38516/35259
+f 35171/38516/35259 39609/38520/35263 40589/38521/35264 38020/38518/35261
+f 35164/38506/35249 35167/38517/35260 35172/38522/35265 35168/38507/35250
+f 35168/38507/35250 35172/38522/35265 39604/38523/35266 39605/38510/35253
+f 35167/38517/35260 38021/38519/35262 38022/38524/35267 35172/38522/35265
+f 35172/38522/35265 38022/38524/35267 40588/38525/35268 39604/38523/35266
+f 35173/38526/35269 35177/38527/35270 35178/38528/35271 35174/38529/35272
+f 35174/38529/35272 35178/38528/35271 37953/38153/34900 37952/38149/34896
+f 35177/38527/35270 39608/38515/35258 39607/38514/35257 35178/38528/35271
+f 35178/38528/35271 39607/38514/35257 40565/38133/34880 37953/38153/34900
+f 35173/38526/35269 35174/38529/35272 35179/38530/35273 35175/38531/35274
+f 35175/38531/35274 35179/38530/35273 39610/38532/35275 39611/38533/35276
+f 35174/38529/35272 37952/38149/34896 37951/38148/34895 35179/38530/35273
+f 35179/38530/35273 37951/38148/34895 40566/38151/34898 39610/38532/35275
+f 35173/38526/35269 35175/38531/35274 35180/38534/35277 35176/38535/35278
+f 35176/38535/35278 35180/38534/35277 38023/38536/35279 38024/38537/35280
+f 35175/38531/35274 39611/38533/35276 39612/38538/35281 35180/38534/35277
+f 35180/38534/35277 39612/38538/35281 40590/38539/35282 38023/38536/35279
+f 35173/38526/35269 35176/38535/35278 35181/38540/35283 35177/38527/35270
+f 35177/38527/35270 35181/38540/35283 39609/38520/35263 39608/38515/35258
+f 35176/38535/35278 38024/38537/35280 38025/38541/35284 35181/38540/35283
+f 35181/38540/35283 38025/38541/35284 40589/38521/35264 39609/38520/35263
+f 35182/38542/35285 35186/38543/35286 35187/38544/35287 35183/38545/35288
+f 35183/38545/35288 35187/38544/35287 37956/38169/34916 37955/38165/34912
+f 35186/38543/35286 39611/38533/35276 39610/38532/35275 35187/38544/35287
+f 35187/38544/35287 39610/38532/35275 40566/38151/34898 37956/38169/34916
+f 35182/38542/35285 35183/38545/35288 35188/38546/35289 35184/38547/35290
+f 35184/38547/35290 35188/38546/35289 39613/38548/35291 39614/38549/35292
+f 35183/38545/35288 37955/38165/34912 37954/38164/34911 35188/38546/35289
+f 35188/38546/35289 37954/38164/34911 40567/38167/34914 39613/38548/35291
+f 35182/38542/35285 35184/38547/35290 35189/19778/35293 35185/38550/35294
+f 35185/38550/35294 35189/19778/35293 38026/38551/35295 38027/38552/35296
+f 35184/38547/35290 39614/38549/35292 39615/38553/35297 35189/19778/35293
+f 35189/19778/35293 39615/38553/35297 40591/38554/35298 38026/38551/35295
+f 35182/38542/35285 35185/38550/35294 35190/38555/35299 35186/38543/35286
+f 35186/38543/35286 35190/38555/35299 39612/38538/35281 39611/38533/35276
+f 35185/38550/35294 38027/38552/35296 38028/38556/35300 35190/38555/35299
+f 35190/38555/35299 38028/38556/35300 40590/38539/35282 39612/38538/35281
+f 35191/38557/35301 35195/38558/35302 35196/38559/35303 35192/38560/35304
+f 35192/38560/35304 35196/38559/35303 37959/38185/34932 37958/38181/34928
+f 35195/38558/35302 39614/38549/35292 39613/38548/35291 35196/38559/35303
+f 35196/38559/35303 39613/38548/35291 40567/38167/34914 37959/38185/34932
+f 35191/38557/35301 35192/38560/35304 35197/38561/35305 35193/38562/35306
+f 35193/38562/35306 35197/38561/35305 39616/38563/35307 39617/38564/35308
+f 35192/38560/35304 37958/38181/34928 37957/38180/34927 35197/38561/35305
+f 35197/38561/35305 37957/38180/34927 40568/38183/34930 39616/38563/35307
+f 35191/38557/35301 35193/38562/35306 35198/38565/35309 35194/38566/35310
+f 35194/38566/35310 35198/38565/35309 38029/38567/35311 38030/38568/35312
+f 35193/38562/35306 39617/38564/35308 39618/38569/35313 35198/38565/35309
+f 35198/38565/35309 39618/38569/35313 40592/38570/35314 38029/38567/35311
+f 35191/38557/35301 35194/38566/35310 35199/38571/35315 35195/38558/35302
+f 35195/38558/35302 35199/38571/35315 39615/38553/35297 39614/38549/35292
+f 35194/38566/35310 38030/38568/35312 38031/38572/35316 35199/38571/35315
+f 35199/38571/35315 38031/38572/35316 40591/38554/35298 39615/38553/35297
+f 35200/38573/35317 35204/38574/35318 35205/38575/35319 35201/38576/35320
+f 35201/38576/35320 35205/38575/35319 37962/38201/34948 37961/38197/34944
+f 35204/38574/35318 39617/38564/35308 39616/38563/35307 35205/38575/35319
+f 35205/38575/35319 39616/38563/35307 40568/38183/34930 37962/38201/34948
+f 35200/38573/35317 35201/38576/35320 35206/38577/35321 35202/38578/35322
+f 35202/38578/35322 35206/38577/35321 39619/38579/35323 39620/38580/35324
+f 35201/38576/35320 37961/38197/34944 37960/38196/34943 35206/38577/35321
+f 35206/38577/35321 37960/38196/34943 40569/38199/34946 39619/38579/35323
+f 35200/38573/35317 35202/38578/35322 35207/38581/35325 35203/38582/35326
+f 35203/38582/35326 35207/38581/35325 38032/38583/35327 38033/38584/35328
+f 35202/38578/35322 39620/38580/35324 39621/38585/35329 35207/38581/35325
+f 35207/38581/35325 39621/38585/35329 40593/38586/35330 38032/38583/35327
+f 35200/38573/35317 35203/38582/35326 35208/38587/35331 35204/38574/35318
+f 35204/38574/35318 35208/38587/35331 39618/38569/35313 39617/38564/35308
+f 35203/38582/35326 38033/38584/35328 38034/38588/35332 35208/38587/35331
+f 35208/38587/35331 38034/38588/35332 40592/38570/35314 39618/38569/35313
+f 35209/38589/35333 35213/38590/35334 35214/38591/35335 35210/38592/35336
+f 35210/38592/35336 35214/38591/35335 37965/38217/34964 37964/38213/34960
+f 35213/38590/35334 39620/38580/35324 39619/38579/35323 35214/38591/35335
+f 35214/38591/35335 39619/38579/35323 40569/38199/34946 37965/38217/34964
+f 35209/38589/35333 35210/38592/35336 35215/38593/35337 35211/38594/35338
+f 35211/38594/35338 35215/38593/35337 39622/38595/35339 39623/38596/35340
+f 35210/38592/35336 37964/38213/34960 37963/38212/34959 35215/38593/35337
+f 35215/38593/35337 37963/38212/34959 40570/38215/34962 39622/38595/35339
+f 35209/38589/35333 35211/38594/35338 35216/38597/35341 35212/38598/35342
+f 35212/38598/35342 35216/38597/35341 38035/38599/35343 38036/38600/35344
+f 35211/38594/35338 39623/38596/35340 39624/38601/35345 35216/38597/35341
+f 35216/38597/35341 39624/38601/35345 40594/38602/35346 38035/38599/35343
+f 35209/38589/35333 35212/38598/35342 35217/38603/35347 35213/38590/35334
+f 35213/38590/35334 35217/38603/35347 39621/38585/35329 39620/38580/35324
+f 35212/38598/35342 38036/38600/35344 38037/38604/35348 35217/38603/35347
+f 35217/38603/35347 38037/38604/35348 40593/38586/35330 39621/38585/35329
+f 35218/38605/35349 35222/38606/35350 35223/38607/35351 35219/38608/35352
+f 35219/38608/35352 35223/38607/35351 37968/38233/34980 37967/38229/34976
+f 35222/38606/35350 39623/38596/35340 39622/38595/35339 35223/38607/35351
+f 35223/38607/35351 39622/38595/35339 40570/38215/34962 37968/38233/34980
+f 35218/38605/35349 35219/38608/35352 35224/38609/35353 35220/38610/35354
+f 35220/38610/35354 35224/38609/35353 39625/38611/35355 39626/38612/35356
+f 35219/38608/35352 37967/38229/34976 37966/38228/34975 35224/38609/35353
+f 35224/38609/35353 37966/38228/34975 40571/38231/34978 39625/38611/35355
+f 35218/38605/35349 35220/38610/35354 35225/38613/35357 35221/38614/35358
+f 35221/38614/35358 35225/38613/35357 38038/38615/35359 38039/38616/35360
+f 35220/38610/35354 39626/38612/35356 39627/38617/35361 35225/38613/35357
+f 35225/38613/35357 39627/38617/35361 40595/38618/35362 38038/38615/35359
+f 35218/38605/35349 35221/38614/35358 35226/38619/35363 35222/38606/35350
+f 35222/38606/35350 35226/38619/35363 39624/38601/35345 39623/38596/35340
+f 35221/38614/35358 38039/38616/35360 38040/38620/35364 35226/38619/35363
+f 35226/38619/35363 38040/38620/35364 40594/38602/35346 39624/38601/35345
+f 35227/38621/35365 35231/38622/35366 35232/38623/35367 35228/38624/35368
+f 35228/38624/35368 35232/38623/35367 37971/38249/34996 37970/38245/34992
+f 35231/38622/35366 39626/38612/35356 39625/38611/35355 35232/38623/35367
+f 35232/38623/35367 39625/38611/35355 40571/38231/34978 37971/38249/34996
+f 35227/38621/35365 35228/38624/35368 35233/38625/35369 35229/38626/35370
+f 35229/38626/35370 35233/38625/35369 39628/38627/35371 39629/38628/35372
+f 35228/38624/35368 37970/38245/34992 37969/38244/34991 35233/38625/35369
+f 35233/38625/35369 37969/38244/34991 40572/38247/34994 39628/38627/35371
+f 35227/38621/35365 35229/38626/35370 35234/38629/35373 35230/38630/35374
+f 35230/38630/35374 35234/38629/35373 38041/38631/35375 38042/38632/35376
+f 35229/38626/35370 39629/38628/35372 39630/38633/35377 35234/38629/35373
+f 35234/38629/35373 39630/38633/35377 40596/38634/35378 38041/38631/35375
+f 35227/38621/35365 35230/38630/35374 35235/38635/35379 35231/38622/35366
+f 35231/38622/35366 35235/38635/35379 39627/38617/35361 39626/38612/35356
+f 35230/38630/35374 38042/38632/35376 38043/38636/35380 35235/38635/35379
+f 35235/38635/35379 38043/38636/35380 40595/38618/35362 39627/38617/35361
+f 35236/38637/35381 35240/38638/35382 35241/38639/35383 35237/38640/35384
+f 35237/38640/35384 35241/38639/35383 37974/38265/35012 37973/38261/35008
+f 35240/38638/35382 39629/38628/35372 39628/38627/35371 35241/38639/35383
+f 35241/38639/35383 39628/38627/35371 40572/38247/34994 37974/38265/35012
+f 35236/38637/35381 35237/38640/35384 35242/38641/35385 35238/38642/35386
+f 35238/38642/35386 35242/38641/35385 39631/38643/35387 39632/38644/35388
+f 35237/38640/35384 37973/38261/35008 37972/38260/35007 35242/38641/35385
+f 35242/38641/35385 37972/38260/35007 40573/38263/35010 39631/38643/35387
+f 35236/38637/35381 35238/38642/35386 35243/38645/35389 35239/38646/35390
+f 35239/38646/35390 35243/38645/35389 38044/38647/35391 38045/38648/35392
+f 35238/38642/35386 39632/38644/35388 39633/38649/35393 35243/38645/35389
+f 35243/38645/35389 39633/38649/35393 40597/38650/35394 38044/38647/35391
+f 35236/38637/35381 35239/38646/35390 35244/38651/35395 35240/38638/35382
+f 35240/38638/35382 35244/38651/35395 39630/38633/35377 39629/38628/35372
+f 35239/38646/35390 38045/38648/35392 38046/38652/35396 35244/38651/35395
+f 35244/38651/35395 38046/38652/35396 40596/38634/35378 39630/38633/35377
+f 35245/38653/35397 35249/38654/35398 35250/38655/35399 35246/38656/35400
+f 35246/38656/35400 35250/38655/35399 37977/38281/35028 37976/38277/35024
+f 35249/38654/35398 39632/38644/35388 39631/38643/35387 35250/38655/35399
+f 35250/38655/35399 39631/38643/35387 40573/38263/35010 37977/38281/35028
+f 35245/38653/35397 35246/38656/35400 35251/38657/35401 35247/38658/35402
+f 35247/38658/35402 35251/38657/35401 39634/38659/35403 39635/38660/35404
+f 35246/38656/35400 37976/38277/35024 37975/38276/35023 35251/38657/35401
+f 35251/38657/35401 37975/38276/35023 40574/38279/35026 39634/38659/35403
+f 35245/38653/35397 35247/38658/35402 35252/38661/35405 35248/38662/35406
+f 35248/38662/35406 35252/38661/35405 38047/38663/35407 38048/38664/35408
+f 35247/38658/35402 39635/38660/35404 39636/38665/35409 35252/38661/35405
+f 35252/38661/35405 39636/38665/35409 40598/38666/35410 38047/38663/35407
+f 35245/38653/35397 35248/38662/35406 35253/38667/35411 35249/38654/35398
+f 35249/38654/35398 35253/38667/35411 39633/38649/35393 39632/38644/35388
+f 35248/38662/35406 38048/38664/35408 38049/38668/35412 35253/38667/35411
+f 35253/38667/35411 38049/38668/35412 40597/38650/35394 39633/38649/35393
+f 35254/38669/35413 35258/38670/35414 35259/38671/35415 35255/38672/35416
+f 35255/38672/35416 35259/38671/35415 37980/38297/35044 37979/38293/35040
+f 35258/38670/35414 39635/38660/35404 39634/38659/35403 35259/38671/35415
+f 35259/38671/35415 39634/38659/35403 40574/38279/35026 37980/38297/35044
+f 35254/38669/35413 35255/38672/35416 35260/38673/35417 35256/38674/35418
+f 35256/38674/35418 35260/38673/35417 39637/38675/35419 39638/38676/35420
+f 35255/38672/35416 37979/38293/35040 37978/38292/35039 35260/38673/35417
+f 35260/38673/35417 37978/38292/35039 40575/38295/35042 39637/38675/35419
+f 35254/38669/35413 35256/38674/35418 35261/38677/35421 35257/38678/35422
+f 35257/38678/35422 35261/38677/35421 38050/38679/35423 38051/38680/35424
+f 35256/38674/35418 39638/38676/35420 39639/38681/35425 35261/38677/35421
+f 35261/38677/35421 39639/38681/35425 40599/38682/35426 38050/38679/35423
+f 35254/38669/35413 35257/38678/35422 35262/38683/35427 35258/38670/35414
+f 35258/38670/35414 35262/38683/35427 39636/38665/35409 39635/38660/35404
+f 35257/38678/35422 38051/38680/35424 38052/38684/35428 35262/38683/35427
+f 35262/38683/35427 38052/38684/35428 40598/38666/35410 39636/38665/35409
+f 35263/38685/35429 35267/38686/35430 35268/38687/35431 35264/38688/35432
+f 35264/38688/35432 35268/38687/35431 37983/38313/35060 37982/38309/35056
+f 35267/38686/35430 39638/38676/35420 39637/38675/35419 35268/38687/35431
+f 35268/38687/35431 39637/38675/35419 40575/38295/35042 37983/38313/35060
+f 35263/38685/35429 35264/38688/35432 35269/38689/35433 35265/38690/35434
+f 35265/38690/35434 35269/38689/35433 39640/38691/35435 39641/38692/35436
+f 35264/38688/35432 37982/38309/35056 37981/38308/35055 35269/38689/35433
+f 35269/38689/35433 37981/38308/35055 40576/38311/35058 39640/38691/35435
+f 35263/38685/35429 35265/38690/35434 35270/38693/35437 35266/38694/35438
+f 35266/38694/35438 35270/38693/35437 38053/38695/35439 38054/38696/35440
+f 35265/38690/35434 39641/38692/35436 39642/38697/35441 35270/38693/35437
+f 35270/38693/35437 39642/38697/35441 40600/38698/35442 38053/38695/35439
+f 35263/38685/35429 35266/38694/35438 35271/38699/35443 35267/38686/35430
+f 35267/38686/35430 35271/38699/35443 39639/38681/35425 39638/38676/35420
+f 35266/38694/35438 38054/38696/35440 38055/38700/35444 35271/38699/35443
+f 35271/38699/35443 38055/38700/35444 40599/38682/35426 39639/38681/35425
+f 35272/38701/35445 35276/38702/35446 35277/38703/35447 35273/38704/35448
+f 35273/38704/35448 35277/38703/35447 37986/38329/35076 37985/38325/35072
+f 35276/38702/35446 39641/38692/35436 39640/38691/35435 35277/38703/35447
+f 35277/38703/35447 39640/38691/35435 40576/38311/35058 37986/38329/35076
+f 35272/38701/35445 35273/38704/35448 35278/38705/35449 35274/38706/35450
+f 35274/38706/35450 35278/38705/35449 39643/38707/35451 39644/38708/35452
+f 35273/38704/35448 37985/38325/35072 37984/38324/35071 35278/38705/35449
+f 35278/38705/35449 37984/38324/35071 40577/38327/35074 39643/38707/35451
+f 35272/38701/35445 35274/38706/35450 35279/38709/35453 35275/38710/35454
+f 35275/38710/35454 35279/38709/35453 38056/38711/35455 38057/38712/35456
+f 35274/38706/35450 39644/38708/35452 39645/38713/35457 35279/38709/35453
+f 35279/38709/35453 39645/38713/35457 40601/38714/35458 38056/38711/35455
+f 35272/38701/35445 35275/38710/35454 35280/38715/35459 35276/38702/35446
+f 35276/38702/35446 35280/38715/35459 39642/38697/35441 39641/38692/35436
+f 35275/38710/35454 38057/38712/35456 38058/38716/35460 35280/38715/35459
+f 35280/38715/35459 38058/38716/35460 40600/38698/35442 39642/38697/35441
+f 35281/38717/35461 35285/38718/35462 35286/38719/35463 35282/38720/35464
+f 35282/38720/35464 35286/38719/35463 37989/38345/35092 37988/38341/35088
+f 35285/38718/35462 39644/38708/35452 39643/38707/35451 35286/38719/35463
+f 35286/38719/35463 39643/38707/35451 40577/38327/35074 37989/38345/35092
+f 35281/38717/35461 35282/38720/35464 35287/38721/35465 35283/38722/35466
+f 35283/38722/35466 35287/38721/35465 39646/38723/35467 39647/38724/35468
+f 35282/38720/35464 37988/38341/35088 37987/38340/35087 35287/38721/35465
+f 35287/38721/35465 37987/38340/35087 40578/38343/35090 39646/38723/35467
+f 35281/38717/35461 35283/38722/35466 35288/38725/35469 35284/38726/35470
+f 35284/38726/35470 35288/38725/35469 38059/38727/35471 38060/38728/35472
+f 35283/38722/35466 39647/38724/35468 39648/38729/35473 35288/38725/35469
+f 35288/38725/35469 39648/38729/35473 40602/38730/35474 38059/38727/35471
+f 35281/38717/35461 35284/38726/35470 35289/38731/35475 35285/38718/35462
+f 35285/38718/35462 35289/38731/35475 39645/38713/35457 39644/38708/35452
+f 35284/38726/35470 38060/38728/35472 38061/38732/35476 35289/38731/35475
+f 35289/38731/35475 38061/38732/35476 40601/38714/35458 39645/38713/35457
+f 35290/38733/35477 35294/38734/35478 35295/38735/35479 35291/38736/35480
+f 35291/38736/35480 35295/38735/35479 37992/38361/35108 37991/38357/35104
+f 35294/38734/35478 39647/38724/35468 39646/38723/35467 35295/38735/35479
+f 35295/38735/35479 39646/38723/35467 40578/38343/35090 37992/38361/35108
+f 35290/38733/35477 35291/38736/35480 35296/38737/35481 35292/38738/35482
+f 35292/38738/35482 35296/38737/35481 39649/38739/35483 39650/38740/35484
+f 35291/38736/35480 37991/38357/35104 37990/38356/35103 35296/38737/35481
+f 35296/38737/35481 37990/38356/35103 40579/38359/35106 39649/38739/35483
+f 35290/38733/35477 35292/38738/35482 35297/38741/35485 35293/38742/35486
+f 35293/38742/35486 35297/38741/35485 38062/38743/35487 38063/38744/35488
+f 35292/38738/35482 39650/38740/35484 39651/38745/35489 35297/38741/35485
+f 35297/38741/35485 39651/38745/35489 40603/38746/35490 38062/38743/35487
+f 35290/38733/35477 35293/38742/35486 35298/38747/35491 35294/38734/35478
+f 35294/38734/35478 35298/38747/35491 39648/38729/35473 39647/38724/35468
+f 35293/38742/35486 38063/38744/35488 38064/38748/35492 35298/38747/35491
+f 35298/38747/35491 38064/38748/35492 40602/38730/35474 39648/38729/35473
+f 35299/38749/35493 35303/38750/35494 35304/38751/35495 35300/38752/35496
+f 35300/38752/35496 35304/38751/35495 37995/38377/35124 37994/38373/35120
+f 35303/38750/35494 39650/38740/35484 39649/38739/35483 35304/38751/35495
+f 35304/38751/35495 39649/38739/35483 40579/38359/35106 37995/38377/35124
+f 35299/38749/35493 35300/38752/35496 35305/38753/35497 35301/38754/35498
+f 35301/38754/35498 35305/38753/35497 39652/38755/35499 39653/38756/35500
+f 35300/38752/35496 37994/38373/35120 37993/38372/35119 35305/38753/35497
+f 35305/38753/35497 37993/38372/35119 40580/38375/35122 39652/38755/35499
+f 35299/38749/35493 35301/38754/35498 35306/38757/35501 35302/38758/35502
+f 35302/38758/35502 35306/38757/35501 38065/38759/35503 38066/38760/35504
+f 35301/38754/35498 39653/38756/35500 39654/38761/35505 35306/38757/35501
+f 35306/38757/35501 39654/38761/35505 40604/38762/35506 38065/38759/35503
+f 35299/38749/35493 35302/38758/35502 35307/38763/35507 35303/38750/35494
+f 35303/38750/35494 35307/38763/35507 39651/38745/35489 39650/38740/35484
+f 35302/38758/35502 38066/38760/35504 38067/38764/35508 35307/38763/35507
+f 35307/38763/35507 38067/38764/35508 40603/38746/35490 39651/38745/35489
+f 35308/38765/35509 35312/38766/35510 35313/38767/35511 35309/38768/35512
+f 35309/38768/35512 35313/38767/35511 37998/38393/35140 37997/38389/35136
+f 35312/38766/35510 39653/38756/35500 39652/38755/35499 35313/38767/35511
+f 35313/38767/35511 39652/38755/35499 40580/38375/35122 37998/38393/35140
+f 35308/38765/35509 35309/38768/35512 35314/38769/35513 35310/38770/35514
+f 35310/38770/35514 35314/38769/35513 39655/38771/35515 39656/38772/35516
+f 35309/38768/35512 37997/38389/35136 37996/38388/35135 35314/38769/35513
+f 35314/38769/35513 37996/38388/35135 40581/38391/35138 39655/38771/35515
+f 35308/38765/35509 35310/38770/35514 35315/38773/35517 35311/38774/35518
+f 35311/38774/35518 35315/38773/35517 38068/38775/35519 38069/38776/35520
+f 35310/38770/35514 39656/38772/35516 39657/38777/35521 35315/38773/35517
+f 35315/38773/35517 39657/38777/35521 40605/38778/35522 38068/38775/35519
+f 35308/38765/35509 35311/38774/35518 35316/38779/35523 35312/38766/35510
+f 35312/38766/35510 35316/38779/35523 39654/38761/35505 39653/38756/35500
+f 35311/38774/35518 38069/38776/35520 38070/38780/35524 35316/38779/35523
+f 35316/38779/35523 38070/38780/35524 40604/38762/35506 39654/38761/35505
+f 35317/38781/35525 35321/38782/35526 35322/38783/35527 35318/38784/35528
+f 35318/38784/35528 35322/38783/35527 38001/38409/35156 38000/38405/35152
+f 35321/38782/35526 39656/38772/35516 39655/38771/35515 35322/38783/35527
+f 35322/38783/35527 39655/38771/35515 40581/38391/35138 38001/38409/35156
+f 35317/38781/35525 35318/38784/35528 35323/38785/35529 35319/38786/35530
+f 35319/38786/35530 35323/38785/35529 39658/38787/35531 39659/38788/35532
+f 35318/38784/35528 38000/38405/35152 37999/38404/35151 35323/38785/35529
+f 35323/38785/35529 37999/38404/35151 40582/38407/35154 39658/38787/35531
+f 35317/38781/35525 35319/38786/35530 35324/38789/35533 35320/38790/35534
+f 35320/38790/35534 35324/38789/35533 38071/38791/35535 38072/38792/35536
+f 35319/38786/35530 39659/38788/35532 39660/38793/35537 35324/38789/35533
+f 35324/38789/35533 39660/38793/35537 40606/38794/35538 38071/38791/35535
+f 35317/38781/35525 35320/38790/35534 35325/38795/35539 35321/38782/35526
+f 35321/38782/35526 35325/38795/35539 39657/38777/35521 39656/38772/35516
+f 35320/38790/35534 38072/38792/35536 38073/38796/35540 35325/38795/35539
+f 35325/38795/35539 38073/38796/35540 40605/38778/35522 39657/38777/35521
+f 35326/38797/35541 35330/38798/35542 35331/38799/35543 35327/38800/35544
+f 35327/38800/35544 35331/38799/35543 38004/38425/35172 38003/38421/35168
+f 35330/38798/35542 39659/38788/35532 39658/38787/35531 35331/38799/35543
+f 35331/38799/35543 39658/38787/35531 40582/38407/35154 38004/38425/35172
+f 35326/38797/35541 35327/38800/35544 35332/38801/35545 35328/38802/35546
+f 35328/38802/35546 35332/38801/35545 39661/38803/35547 39662/38804/35548
+f 35327/38800/35544 38003/38421/35168 38002/38420/35167 35332/38801/35545
+f 35332/38801/35545 38002/38420/35167 40583/38423/35170 39661/38803/35547
+f 35326/38797/35541 35328/38802/35546 35333/38805/35549 35329/38806/35550
+f 35329/38806/35550 35333/38805/35549 38074/38807/35551 38075/38808/35552
+f 35328/38802/35546 39662/38804/35548 39663/38809/35553 35333/38805/35549
+f 35333/38805/35549 39663/38809/35553 40607/38810/35554 38074/38807/35551
+f 35326/38797/35541 35329/38806/35550 35334/38811/35555 35330/38798/35542
+f 35330/38798/35542 35334/38811/35555 39660/38793/35537 39659/38788/35532
+f 35329/38806/35550 38075/38808/35552 38076/38812/35556 35334/38811/35555
+f 35334/38811/35555 38076/38812/35556 40606/38794/35538 39660/38793/35537
+f 35335/38813/35557 35339/38814/35558 35340/38815/35559 35336/38816/35560
+f 35336/38816/35560 35340/38815/35559 38007/38441/35188 38006/38437/35184
+f 35339/38814/35558 39662/38804/35548 39661/38803/35547 35340/38815/35559
+f 35340/38815/35559 39661/38803/35547 40583/38423/35170 38007/38441/35188
+f 35335/38813/35557 35336/38816/35560 35341/38817/35561 35337/38818/35562
+f 35337/38818/35562 35341/38817/35561 39664/38819/35563 39665/38820/35564
+f 35336/38816/35560 38006/38437/35184 38005/38436/35183 35341/38817/35561
+f 35341/38817/35561 38005/38436/35183 40584/38439/35186 39664/38819/35563
+f 35335/38813/35557 35337/38818/35562 35342/38821/35565 35338/38822/35566
+f 35338/38822/35566 35342/38821/35565 38077/38823/35567 38078/38824/35568
+f 35337/38818/35562 39665/38820/35564 39666/38825/35569 35342/38821/35565
+f 35342/38821/35565 39666/38825/35569 40608/38826/35570 38077/38823/35567
+f 35335/38813/35557 35338/38822/35566 35343/38827/35571 35339/38814/35558
+f 35339/38814/35558 35343/38827/35571 39663/38809/35553 39662/38804/35548
+f 35338/38822/35566 38078/38824/35568 38079/38828/35572 35343/38827/35571
+f 35343/38827/35571 38079/38828/35572 40607/38810/35554 39663/38809/35553
+f 35344/38829/35573 35348/38830/35574 35349/38831/35575 35345/38832/35576
+f 35345/38832/35576 35349/38831/35575 38010/38457/35204 38009/38453/35200
+f 35348/38830/35574 39665/38820/35564 39664/38819/35563 35349/38831/35575
+f 35349/38831/35575 39664/38819/35563 40584/38439/35186 38010/38457/35204
+f 35344/38829/35573 35345/38832/35576 35350/38833/35577 35346/38834/35578
+f 35346/38834/35578 35350/38833/35577 39667/38835/35579 39668/38836/35580
+f 35345/38832/35576 38009/38453/35200 38008/38452/35199 35350/38833/35577
+f 35350/38833/35577 38008/38452/35199 40585/38455/35202 39667/38835/35579
+f 35344/38829/35573 35346/38834/35578 35351/38837/35581 35347/38838/35582
+f 35347/38838/35582 35351/38837/35581 38080/38839/35583 38081/38840/35584
+f 35346/38834/35578 39668/38836/35580 39669/38841/35585 35351/38837/35581
+f 35351/38837/35581 39669/38841/35585 40609/38842/35586 38080/38839/35583
+f 35344/38829/35573 35347/38838/35582 35352/38843/35587 35348/38830/35574
+f 35348/38830/35574 35352/38843/35587 39666/38825/35569 39665/38820/35564
+f 35347/38838/35582 38081/38840/35584 38082/38844/35588 35352/38843/35587
+f 35352/38843/35587 38082/38844/35588 40608/38826/35570 39666/38825/35569
+f 35353/38845/35589 35357/38846/35590 35358/38847/35591 35354/38848/35592
+f 35354/38848/35592 35358/38847/35591 38013/38473/35220 38012/38469/35216
+f 35357/38846/35590 39668/38836/35580 39667/38835/35579 35358/38847/35591
+f 35358/38847/35591 39667/38835/35579 40585/38455/35202 38013/38473/35220
+f 35353/38845/35589 35354/38848/35592 35359/38849/35593 35355/38850/35594
+f 35355/38850/35594 35359/38849/35593 39670/38851/35595 39671/38852/35596
+f 35354/38848/35592 38012/38469/35216 38011/38468/35215 35359/38849/35593
+f 35359/38849/35593 38011/38468/35215 40586/38471/35218 39670/38851/35595
+f 35353/38845/35589 35355/38850/35594 35360/38853/35597 35356/38854/35598
+f 35356/38854/35598 35360/38853/35597 38083/38855/35599 38084/38856/35600
+f 35355/38850/35594 39671/38852/35596 39672/38857/35601 35360/38853/35597
+f 35360/38853/35597 39672/38857/35601 40610/38858/35602 38083/38855/35599
+f 35353/38845/35589 35356/38854/35598 35361/38859/35603 35357/38846/35590
+f 35357/38846/35590 35361/38859/35603 39669/38841/35585 39668/38836/35580
+f 35356/38854/35598 38084/38856/35600 38085/38860/35604 35361/38859/35603
+f 35361/38859/35603 38085/38860/35604 40609/38842/35586 39669/38841/35585
+f 35362/38861/35605 35366/38862/35606 35367/38863/35607 35363/38864/35608
+f 35363/38864/35608 35367/38863/35607 38016/38489/35236 38015/38485/35232
+f 35366/38862/35606 39671/38852/35596 39670/38851/35595 35367/38863/35607
+f 35367/38863/35607 39670/38851/35595 40586/38471/35218 38016/38489/35236
+f 35362/38861/35605 35363/38864/35608 35368/38865/35609 35364/38866/35610
+f 35364/38866/35610 35368/38865/35609 39673/38867/35611 39674/38868/35612
+f 35363/38864/35608 38015/38485/35232 38014/38484/35231 35368/38865/35609
+f 35368/38865/35609 38014/38484/35231 40587/38487/35234 39673/38867/35611
+f 35362/38861/35605 35364/38866/35610 35369/38869/35613 35365/38870/35614
+f 35365/38870/35614 35369/38869/35613 38086/38871/35615 38087/38872/35616
+f 35364/38866/35610 39674/38868/35612 39675/38873/35617 35369/38869/35613
+f 35369/38869/35613 39675/38873/35617 40611/38874/35618 38086/38871/35615
+f 35362/38861/35605 35365/38870/35614 35370/38875/35619 35366/38862/35606
+f 35366/38862/35606 35370/38875/35619 39672/38857/35601 39671/38852/35596
+f 35365/38870/35614 38087/38872/35616 38088/38876/35620 35370/38875/35619
+f 35370/38875/35619 38088/38876/35620 40610/38858/35602 39672/38857/35601
+f 35371/38877/35621 35375/38878/35622 35376/38879/35623 35372/38880/35624
+f 35372/38880/35624 35376/38879/35623 38019/38505/35248 38018/38501/35246
+f 35375/38878/35622 39674/38868/35612 39673/38867/35611 35376/38879/35623
+f 35376/38879/35623 39673/38867/35611 40587/38487/35234 38019/38505/35248
+f 35371/38877/35621 35372/38880/35624 35377/38881/35625 35373/38882/35626
+f 35373/38882/35626 35377/38881/35625 39606/38883/35254 39605/38884/35253
+f 35372/38880/35624 38018/38501/35246 38017/38500/35245 35377/38881/35625
+f 35377/38881/35625 38017/38500/35245 40564/38503/34884 39606/38883/35254
+f 35371/38877/35621 35373/38882/35626 35378/38885/35627 35374/38886/35628
+f 35374/38886/35628 35378/38885/35627 38089/38887/35629 38090/38888/35630
+f 35373/38882/35626 39605/38884/35253 39604/38889/35266 35378/38885/35627
+f 35378/38885/35627 39604/38889/35266 40588/38890/35268 38089/38887/35629
+f 35371/38877/35621 35374/38886/35628 35379/38891/35631 35375/38878/35622
+f 35375/38878/35622 35379/38891/35631 39675/38873/35617 39674/38868/35612
+f 35374/38886/35628 38090/38888/35630 38091/38892/35632 35379/38891/35631
+f 35379/38891/35631 38091/38892/35632 40611/38874/35618 39675/38873/35617
+f 35380/38893/35633 35384/38894/35634 35385/38895/35635 35381/38896/35636
+f 35381/38896/35636 35385/38895/35635 38022/38524/35267 38021/38519/35262
+f 35384/38894/35634 39677/38897/35637 39678/38898/35638 35385/38895/35635
+f 35385/38895/35635 39678/38898/35638 40588/38525/35268 38022/38524/35267
+f 35380/38893/35633 35381/38896/35636 35386/38899/35639 35382/38900/35640
+f 35382/38900/35640 35386/38899/35639 39679/38901/35641 39680/38902/35642
+f 35381/38896/35636 38021/38519/35262 38020/38518/35261 35386/38899/35639
+f 35386/38899/35639 38020/38518/35261 40589/38521/35264 39679/38901/35641
+f 35380/38893/35633 35382/38900/35640 35387/38903/35643 35383/38904/35644
+f 35383/38904/35644 35387/38903/35643 38092/38905/35645 38093/38906/35646
+f 35382/38900/35640 39680/38902/35642 39681/38907/35647 35387/38903/35643
+f 35387/38903/35643 39681/38907/35647 40613/38908/35648 38092/38905/35645
+f 35380/38893/35633 35383/38904/35644 35388/38909/35649 35384/38894/35634
+f 35384/38894/35634 35388/38909/35649 39676/38910/35650 39677/38897/35637
+f 35383/38904/35644 38093/38906/35646 38094/38911/35651 35388/38909/35649
+f 35388/38909/35649 38094/38911/35651 40612/38912/35652 39676/38910/35650
+f 35389/38913/35653 35393/38914/35654 35394/38915/35655 35390/38916/35656
+f 35390/38916/35656 35394/38915/35655 38025/38541/35284 38024/38537/35280
+f 35393/38914/35654 39680/38902/35642 39679/38901/35641 35394/38915/35655
+f 35394/38915/35655 39679/38901/35641 40589/38521/35264 38025/38541/35284
+f 35389/38913/35653 35390/38916/35656 35395/38917/35657 35391/38918/35658
+f 35391/38918/35658 35395/38917/35657 39682/38919/35659 39683/38920/35660
+f 35390/38916/35656 38024/38537/35280 38023/38536/35279 35395/38917/35657
+f 35395/38917/35657 38023/38536/35279 40590/38539/35282 39682/38919/35659
+f 35389/38913/35653 35391/38918/35658 35396/38921/35661 35392/38922/35662
+f 35392/38922/35662 35396/38921/35661 38095/38923/35663 38096/38924/35664
+f 35391/38918/35658 39683/38920/35660 39684/38925/35665 35396/38921/35661
+f 35396/38921/35661 39684/38925/35665 40614/38926/35666 38095/38923/35663
+f 35389/38913/35653 35392/38922/35662 35397/38927/35667 35393/38914/35654
+f 35393/38914/35654 35397/38927/35667 39681/38907/35647 39680/38902/35642
+f 35392/38922/35662 38096/38924/35664 38097/38928/35668 35397/38927/35667
+f 35397/38927/35667 38097/38928/35668 40613/38908/35648 39681/38907/35647
+f 35398/38929/35669 35402/38930/35670 35403/38931/35671 35399/38932/35672
+f 35399/38932/35672 35403/38931/35671 38028/38556/35300 38027/38552/35296
+f 35402/38930/35670 39683/38920/35660 39682/38919/35659 35403/38931/35671
+f 35403/38931/35671 39682/38919/35659 40590/38539/35282 38028/38556/35300
+f 35398/38929/35669 35399/38932/35672 35404/38933/35673 35400/38934/35674
+f 35400/38934/35674 35404/38933/35673 39685/38935/35675 39686/38936/35676
+f 35399/38932/35672 38027/38552/35296 38026/38551/35295 35404/38933/35673
+f 35404/38933/35673 38026/38551/35295 40591/38554/35298 39685/38935/35675
+f 35398/38929/35669 35400/38934/35674 35405/38937/35677 35401/38938/35678
+f 35401/38938/35678 35405/38937/35677 38098/38939/35679 38099/38940/35680
+f 35400/38934/35674 39686/38936/35676 39687/38941/35681 35405/38937/35677
+f 35405/38937/35677 39687/38941/35681 40615/38942/35682 38098/38939/35679
+f 35398/38929/35669 35401/38938/35678 35406/38943/35683 35402/38930/35670
+f 35402/38930/35670 35406/38943/35683 39684/38925/35665 39683/38920/35660
+f 35401/38938/35678 38099/38940/35680 38100/38944/35684 35406/38943/35683
+f 35406/38943/35683 38100/38944/35684 40614/38926/35666 39684/38925/35665
+f 35407/38945/35685 35411/38946/35686 35412/38947/35687 35408/38948/35688
+f 35408/38948/35688 35412/38947/35687 38031/38572/35316 38030/38568/35312
+f 35411/38946/35686 39686/38936/35676 39685/38935/35675 35412/38947/35687
+f 35412/38947/35687 39685/38935/35675 40591/38554/35298 38031/38572/35316
+f 35407/38945/35685 35408/38948/35688 35413/38949/35689 35409/38950/35690
+f 35409/38950/35690 35413/38949/35689 39688/38951/35691 39689/38952/35692
+f 35408/38948/35688 38030/38568/35312 38029/38567/35311 35413/38949/35689
+f 35413/38949/35689 38029/38567/35311 40592/38570/35314 39688/38951/35691
+f 35407/38945/35685 35409/38950/35690 35414/38953/35693 35410/38954/35694
+f 35410/38954/35694 35414/38953/35693 38101/38955/35695 38102/38956/35696
+f 35409/38950/35690 39689/38952/35692 39690/38957/35697 35414/38953/35693
+f 35414/38953/35693 39690/38957/35697 40616/38958/35698 38101/38955/35695
+f 35407/38945/35685 35410/38954/35694 35415/38959/35699 35411/38946/35686
+f 35411/38946/35686 35415/38959/35699 39687/38941/35681 39686/38936/35676
+f 35410/38954/35694 38102/38956/35696 38103/38960/35700 35415/38959/35699
+f 35415/38959/35699 38103/38960/35700 40615/38942/35682 39687/38941/35681
+f 35416/38961/35701 35420/38962/35702 35421/38963/35703 35417/38964/35704
+f 35417/38964/35704 35421/38963/35703 38034/38588/35332 38033/38584/35328
+f 35420/38962/35702 39689/38952/35692 39688/38951/35691 35421/38963/35703
+f 35421/38963/35703 39688/38951/35691 40592/38570/35314 38034/38588/35332
+f 35416/38961/35701 35417/38964/35704 35422/38965/35705 35418/38966/35706
+f 35418/38966/35706 35422/38965/35705 39691/38967/35707 39692/38968/35708
+f 35417/38964/35704 38033/38584/35328 38032/38583/35327 35422/38965/35705
+f 35422/38965/35705 38032/38583/35327 40593/38586/35330 39691/38967/35707
+f 35416/38961/35701 35418/38966/35706 35423/38969/35709 35419/38970/35710
+f 35419/38970/35710 35423/38969/35709 38104/38971/35711 38105/38972/35712
+f 35418/38966/35706 39692/38968/35708 39693/38973/35713 35423/38969/35709
+f 35423/38969/35709 39693/38973/35713 40617/38974/35714 38104/38971/35711
+f 35416/38961/35701 35419/38970/35710 35424/38975/35715 35420/38962/35702
+f 35420/38962/35702 35424/38975/35715 39690/38957/35697 39689/38952/35692
+f 35419/38970/35710 38105/38972/35712 38106/38976/35716 35424/38975/35715
+f 35424/38975/35715 38106/38976/35716 40616/38958/35698 39690/38957/35697
+f 35425/38977/35717 35429/38978/35718 35430/38979/35719 35426/38980/35720
+f 35426/38980/35720 35430/38979/35719 38037/38604/35348 38036/38600/35344
+f 35429/38978/35718 39692/38968/35708 39691/38967/35707 35430/38979/35719
+f 35430/38979/35719 39691/38967/35707 40593/38586/35330 38037/38604/35348
+f 35425/38977/35717 35426/38980/35720 35431/38981/35721 35427/38982/35722
+f 35427/38982/35722 35431/38981/35721 39694/38983/35723 39695/38984/35724
+f 35426/38980/35720 38036/38600/35344 38035/38599/35343 35431/38981/35721
+f 35431/38981/35721 38035/38599/35343 40594/38602/35346 39694/38983/35723
+f 35425/38977/35717 35427/38982/35722 35432/38985/35725 35428/38986/35726
+f 35428/38986/35726 35432/38985/35725 38107/38987/35727 38108/38988/35728
+f 35427/38982/35722 39695/38984/35724 39696/38989/35729 35432/38985/35725
+f 35432/38985/35725 39696/38989/35729 40618/38990/35730 38107/38987/35727
+f 35425/38977/35717 35428/38986/35726 35433/38991/35731 35429/38978/35718
+f 35429/38978/35718 35433/38991/35731 39693/38973/35713 39692/38968/35708
+f 35428/38986/35726 38108/38988/35728 38109/38992/35732 35433/38991/35731
+f 35433/38991/35731 38109/38992/35732 40617/38974/35714 39693/38973/35713
+f 35434/38993/35733 35438/38994/35734 35439/38995/35735 35435/38996/35736
+f 35435/38996/35736 35439/38995/35735 38040/38620/35364 38039/38616/35360
+f 35438/38994/35734 39695/38984/35724 39694/38983/35723 35439/38995/35735
+f 35439/38995/35735 39694/38983/35723 40594/38602/35346 38040/38620/35364
+f 35434/38993/35733 35435/38996/35736 35440/38997/35737 35436/38998/35738
+f 35436/38998/35738 35440/38997/35737 39697/38999/35739 39698/39000/35740
+f 35435/38996/35736 38039/38616/35360 38038/38615/35359 35440/38997/35737
+f 35440/38997/35737 38038/38615/35359 40595/38618/35362 39697/38999/35739
+f 35434/38993/35733 35436/38998/35738 35441/39001/35741 35437/39002/35742
+f 35437/39002/35742 35441/39001/35741 38110/39003/35743 38111/39004/35744
+f 35436/38998/35738 39698/39000/35740 39699/39005/35745 35441/39001/35741
+f 35441/39001/35741 39699/39005/35745 40619/39006/35746 38110/39003/35743
+f 35434/38993/35733 35437/39002/35742 35442/39007/35747 35438/38994/35734
+f 35438/38994/35734 35442/39007/35747 39696/38989/35729 39695/38984/35724
+f 35437/39002/35742 38111/39004/35744 38112/39008/35748 35442/39007/35747
+f 35442/39007/35747 38112/39008/35748 40618/38990/35730 39696/38989/35729
+f 35443/39009/35749 35447/39010/35750 35448/39011/35751 35444/39012/35752
+f 35444/39012/35752 35448/39011/35751 38043/38636/35380 38042/38632/35376
+f 35447/39010/35750 39698/39000/35740 39697/38999/35739 35448/39011/35751
+f 35448/39011/35751 39697/38999/35739 40595/38618/35362 38043/38636/35380
+f 35443/39009/35749 35444/39012/35752 35449/39013/35753 35445/39014/35754
+f 35445/39014/35754 35449/39013/35753 39700/39015/35755 39701/39016/35756
+f 35444/39012/35752 38042/38632/35376 38041/38631/35375 35449/39013/35753
+f 35449/39013/35753 38041/38631/35375 40596/38634/35378 39700/39015/35755
+f 35443/39009/35749 35445/39014/35754 35450/39017/35757 35446/39018/35758
+f 35446/39018/35758 35450/39017/35757 38113/39019/35759 38114/39020/35760
+f 35445/39014/35754 39701/39016/35756 39702/39021/35761 35450/39017/35757
+f 35450/39017/35757 39702/39021/35761 40620/39022/35762 38113/39019/35759
+f 35443/39009/35749 35446/39018/35758 35451/39023/35763 35447/39010/35750
+f 35447/39010/35750 35451/39023/35763 39699/39005/35745 39698/39000/35740
+f 35446/39018/35758 38114/39020/35760 38115/39024/35764 35451/39023/35763
+f 35451/39023/35763 38115/39024/35764 40619/39006/35746 39699/39005/35745
+f 35452/39025/35765 35456/39026/35766 35457/39027/35767 35453/39028/35768
+f 35453/39028/35768 35457/39027/35767 38046/38652/35396 38045/38648/35392
+f 35456/39026/35766 39701/39016/35756 39700/39015/35755 35457/39027/35767
+f 35457/39027/35767 39700/39015/35755 40596/38634/35378 38046/38652/35396
+f 35452/39025/35765 35453/39028/35768 35458/39029/35769 35454/39030/35770
+f 35454/39030/35770 35458/39029/35769 39703/39031/35771 39704/39032/35772
+f 35453/39028/35768 38045/38648/35392 38044/38647/35391 35458/39029/35769
+f 35458/39029/35769 38044/38647/35391 40597/38650/35394 39703/39031/35771
+f 35452/39025/35765 35454/39030/35770 35459/39033/35773 35455/39034/35774
+f 35455/39034/35774 35459/39033/35773 38116/39035/35775 38117/39036/35776
+f 35454/39030/35770 39704/39032/35772 39705/39037/35777 35459/39033/35773
+f 35459/39033/35773 39705/39037/35777 40621/39038/35778 38116/39035/35775
+f 35452/39025/35765 35455/39034/35774 35460/39039/35779 35456/39026/35766
+f 35456/39026/35766 35460/39039/35779 39702/39021/35761 39701/39016/35756
+f 35455/39034/35774 38117/39036/35776 38118/39040/35780 35460/39039/35779
+f 35460/39039/35779 38118/39040/35780 40620/39022/35762 39702/39021/35761
+f 35461/39041/35781 35465/39042/35782 35466/39043/35783 35462/39044/35784
+f 35462/39044/35784 35466/39043/35783 38049/38668/35412 38048/38664/35408
+f 35465/39042/35782 39704/39032/35772 39703/39031/35771 35466/39043/35783
+f 35466/39043/35783 39703/39031/35771 40597/38650/35394 38049/38668/35412
+f 35461/39041/35781 35462/39044/35784 35467/39045/35785 35463/39046/35786
+f 35463/39046/35786 35467/39045/35785 39706/39047/35787 39707/39048/35788
+f 35462/39044/35784 38048/38664/35408 38047/38663/35407 35467/39045/35785
+f 35467/39045/35785 38047/38663/35407 40598/38666/35410 39706/39047/35787
+f 35461/39041/35781 35463/39046/35786 35468/39049/35789 35464/39050/35790
+f 35464/39050/35790 35468/39049/35789 38119/39051/35791 38120/39052/35792
+f 35463/39046/35786 39707/39048/35788 39708/39053/35793 35468/39049/35789
+f 35468/39049/35789 39708/39053/35793 40622/39054/35794 38119/39051/35791
+f 35461/39041/35781 35464/39050/35790 35469/39055/35795 35465/39042/35782
+f 35465/39042/35782 35469/39055/35795 39705/39037/35777 39704/39032/35772
+f 35464/39050/35790 38120/39052/35792 38121/39056/35796 35469/39055/35795
+f 35469/39055/35795 38121/39056/35796 40621/39038/35778 39705/39037/35777
+f 35470/39057/35797 35474/39058/35798 35475/39059/35799 35471/39060/35800
+f 35471/39060/35800 35475/39059/35799 38052/38684/35428 38051/38680/35424
+f 35474/39058/35798 39707/39048/35788 39706/39047/35787 35475/39059/35799
+f 35475/39059/35799 39706/39047/35787 40598/38666/35410 38052/38684/35428
+f 35470/39057/35797 35471/39060/35800 35476/39061/35801 35472/39062/35802
+f 35472/39062/35802 35476/39061/35801 39709/39063/35803 39710/39064/35804
+f 35471/39060/35800 38051/38680/35424 38050/38679/35423 35476/39061/35801
+f 35476/39061/35801 38050/38679/35423 40599/38682/35426 39709/39063/35803
+f 35470/39057/35797 35472/39062/35802 35477/39065/35805 35473/39066/35806
+f 35473/39066/35806 35477/39065/35805 38122/39067/35807 38123/39068/35808
+f 35472/39062/35802 39710/39064/35804 39711/39069/35809 35477/39065/35805
+f 35477/39065/35805 39711/39069/35809 40623/39070/35810 38122/39067/35807
+f 35470/39057/35797 35473/39066/35806 35478/39071/35811 35474/39058/35798
+f 35474/39058/35798 35478/39071/35811 39708/39053/35793 39707/39048/35788
+f 35473/39066/35806 38123/39068/35808 38124/39072/35812 35478/39071/35811
+f 35478/39071/35811 38124/39072/35812 40622/39054/35794 39708/39053/35793
+f 35479/39073/35813 35483/39074/35814 35484/39075/35815 35480/39076/35816
+f 35480/39076/35816 35484/39075/35815 38055/38700/35444 38054/38696/35440
+f 35483/39074/35814 39710/39064/35804 39709/39063/35803 35484/39075/35815
+f 35484/39075/35815 39709/39063/35803 40599/38682/35426 38055/38700/35444
+f 35479/39073/35813 35480/39076/35816 35485/39077/35817 35481/39078/35818
+f 35481/39078/35818 35485/39077/35817 39712/39079/35819 39713/39080/35820
+f 35480/39076/35816 38054/38696/35440 38053/38695/35439 35485/39077/35817
+f 35485/39077/35817 38053/38695/35439 40600/38698/35442 39712/39079/35819
+f 35479/39073/35813 35481/39078/35818 35486/39081/35821 35482/39082/35822
+f 35482/39082/35822 35486/39081/35821 38125/39083/35823 38126/39084/35824
+f 35481/39078/35818 39713/39080/35820 39714/39085/35825 35486/39081/35821
+f 35486/39081/35821 39714/39085/35825 40624/39086/35826 38125/39083/35823
+f 35479/39073/35813 35482/39082/35822 35487/39087/35827 35483/39074/35814
+f 35483/39074/35814 35487/39087/35827 39711/39069/35809 39710/39064/35804
+f 35482/39082/35822 38126/39084/35824 38127/39088/35828 35487/39087/35827
+f 35487/39087/35827 38127/39088/35828 40623/39070/35810 39711/39069/35809
+f 35488/39089/35829 35492/39090/35830 35493/39091/35831 35489/39092/35832
+f 35489/39092/35832 35493/39091/35831 38058/38716/35460 38057/38712/35456
+f 35492/39090/35830 39713/39080/35820 39712/39079/35819 35493/39091/35831
+f 35493/39091/35831 39712/39079/35819 40600/38698/35442 38058/38716/35460
+f 35488/39089/35829 35489/39092/35832 35494/39093/35833 35490/39094/35834
+f 35490/39094/35834 35494/39093/35833 39715/39095/35835 39716/39096/35836
+f 35489/39092/35832 38057/38712/35456 38056/38711/35455 35494/39093/35833
+f 35494/39093/35833 38056/38711/35455 40601/38714/35458 39715/39095/35835
+f 35488/39089/35829 35490/39094/35834 35495/39097/35837 35491/39098/35838
+f 35491/39098/35838 35495/39097/35837 38128/39099/35839 38129/39100/35840
+f 35490/39094/35834 39716/39096/35836 39717/39101/35841 35495/39097/35837
+f 35495/39097/35837 39717/39101/35841 40625/39102/35842 38128/39099/35839
+f 35488/39089/35829 35491/39098/35838 35496/39103/35843 35492/39090/35830
+f 35492/39090/35830 35496/39103/35843 39714/39085/35825 39713/39080/35820
+f 35491/39098/35838 38129/39100/35840 38130/39104/35844 35496/39103/35843
+f 35496/39103/35843 38130/39104/35844 40624/39086/35826 39714/39085/35825
+f 35497/39105/35845 35501/39106/35846 35502/39107/35847 35498/39108/35848
+f 35498/39108/35848 35502/39107/35847 38061/38732/35476 38060/38728/35472
+f 35501/39106/35846 39716/39096/35836 39715/39095/35835 35502/39107/35847
+f 35502/39107/35847 39715/39095/35835 40601/38714/35458 38061/38732/35476
+f 35497/39105/35845 35498/39108/35848 35503/39109/35849 35499/39110/35850
+f 35499/39110/35850 35503/39109/35849 39718/39111/35851 39719/39112/35852
+f 35498/39108/35848 38060/38728/35472 38059/38727/35471 35503/39109/35849
+f 35503/39109/35849 38059/38727/35471 40602/38730/35474 39718/39111/35851
+f 35497/39105/35845 35499/39110/35850 35504/39113/35853 35500/39114/35854
+f 35500/39114/35854 35504/39113/35853 38131/39115/35855 38132/39116/35856
+f 35499/39110/35850 39719/39112/35852 39720/39117/35857 35504/39113/35853
+f 35504/39113/35853 39720/39117/35857 40626/39118/35858 38131/39115/35855
+f 35497/39105/35845 35500/39114/35854 35505/39119/35859 35501/39106/35846
+f 35501/39106/35846 35505/39119/35859 39717/39101/35841 39716/39096/35836
+f 35500/39114/35854 38132/39116/35856 38133/39120/35860 35505/39119/35859
+f 35505/39119/35859 38133/39120/35860 40625/39102/35842 39717/39101/35841
+f 35506/39121/35861 35510/39122/35862 35511/39123/35863 35507/39124/35864
+f 35507/39124/35864 35511/39123/35863 38064/38748/35492 38063/38744/35488
+f 35510/39122/35862 39719/39112/35852 39718/39111/35851 35511/39123/35863
+f 35511/39123/35863 39718/39111/35851 40602/38730/35474 38064/38748/35492
+f 35506/39121/35861 35507/39124/35864 35512/39125/35865 35508/39126/35866
+f 35508/39126/35866 35512/39125/35865 39721/39127/35867 39722/39128/35868
+f 35507/39124/35864 38063/38744/35488 38062/38743/35487 35512/39125/35865
+f 35512/39125/35865 38062/38743/35487 40603/38746/35490 39721/39127/35867
+f 35506/39121/35861 35508/39126/35866 35513/39129/35869 35509/39130/35870
+f 35509/39130/35870 35513/39129/35869 38134/39131/35871 38135/39132/35872
+f 35508/39126/35866 39722/39128/35868 39723/39133/35873 35513/39129/35869
+f 35513/39129/35869 39723/39133/35873 40627/39134/35874 38134/39131/35871
+f 35506/39121/35861 35509/39130/35870 35514/39135/35875 35510/39122/35862
+f 35510/39122/35862 35514/39135/35875 39720/39117/35857 39719/39112/35852
+f 35509/39130/35870 38135/39132/35872 38136/39136/35876 35514/39135/35875
+f 35514/39135/35875 38136/39136/35876 40626/39118/35858 39720/39117/35857
+f 35515/39137/35877 35519/39138/35878 35520/39139/35879 35516/39140/35880
+f 35516/39140/35880 35520/39139/35879 38067/38764/35508 38066/38760/35504
+f 35519/39138/35878 39722/39128/35868 39721/39127/35867 35520/39139/35879
+f 35520/39139/35879 39721/39127/35867 40603/38746/35490 38067/38764/35508
+f 35515/39137/35877 35516/39140/35880 35521/39141/35881 35517/39142/35882
+f 35517/39142/35882 35521/39141/35881 39724/39143/35883 39725/39144/35884
+f 35516/39140/35880 38066/38760/35504 38065/38759/35503 35521/39141/35881
+f 35521/39141/35881 38065/38759/35503 40604/38762/35506 39724/39143/35883
+f 35515/39137/35877 35517/39142/35882 35522/39145/35885 35518/39146/35886
+f 35518/39146/35886 35522/39145/35885 38137/39147/35887 38138/39148/35888
+f 35517/39142/35882 39725/39144/35884 39726/39149/35889 35522/39145/35885
+f 35522/39145/35885 39726/39149/35889 40628/39150/35890 38137/39147/35887
+f 35515/39137/35877 35518/39146/35886 35523/39151/35891 35519/39138/35878
+f 35519/39138/35878 35523/39151/35891 39723/39133/35873 39722/39128/35868
+f 35518/39146/35886 38138/39148/35888 38139/39152/35892 35523/39151/35891
+f 35523/39151/35891 38139/39152/35892 40627/39134/35874 39723/39133/35873
+f 35524/39153/35893 35528/39154/35894 35529/39155/35895 35525/39156/35896
+f 35525/39156/35896 35529/39155/35895 38070/38780/35524 38069/38776/35520
+f 35528/39154/35894 39725/39144/35884 39724/39143/35883 35529/39155/35895
+f 35529/39155/35895 39724/39143/35883 40604/38762/35506 38070/38780/35524
+f 35524/39153/35893 35525/39156/35896 35530/39157/35897 35526/39158/35898
+f 35526/39158/35898 35530/39157/35897 39727/39159/35899 39728/39160/35900
+f 35525/39156/35896 38069/38776/35520 38068/38775/35519 35530/39157/35897
+f 35530/39157/35897 38068/38775/35519 40605/38778/35522 39727/39159/35899
+f 35524/39153/35893 35526/39158/35898 35531/39161/35901 35527/39162/35902
+f 35527/39162/35902 35531/39161/35901 38140/39163/35903 38141/39164/35904
+f 35526/39158/35898 39728/39160/35900 39729/39165/35905 35531/39161/35901
+f 35531/39161/35901 39729/39165/35905 40629/39166/35906 38140/39163/35903
+f 35524/39153/35893 35527/39162/35902 35532/39167/35907 35528/39154/35894
+f 35528/39154/35894 35532/39167/35907 39726/39149/35889 39725/39144/35884
+f 35527/39162/35902 38141/39164/35904 38142/39168/35908 35532/39167/35907
+f 35532/39167/35907 38142/39168/35908 40628/39150/35890 39726/39149/35889
+f 35533/39169/35909 35537/39170/35910 35538/39171/35911 35534/39172/35912
+f 35534/39172/35912 35538/39171/35911 38073/38796/35540 38072/38792/35536
+f 35537/39170/35910 39728/39160/35900 39727/39159/35899 35538/39171/35911
+f 35538/39171/35911 39727/39159/35899 40605/38778/35522 38073/38796/35540
+f 35533/39169/35909 35534/39172/35912 35539/39173/35913 35535/39174/35914
+f 35535/39174/35914 35539/39173/35913 39730/39175/35915 39731/39176/35916
+f 35534/39172/35912 38072/38792/35536 38071/38791/35535 35539/39173/35913
+f 35539/39173/35913 38071/38791/35535 40606/38794/35538 39730/39175/35915
+f 35533/39169/35909 35535/39174/35914 35540/39177/35917 35536/39178/35918
+f 35536/39178/35918 35540/39177/35917 38143/39179/35919 38144/39180/35920
+f 35535/39174/35914 39731/39176/35916 39732/39181/35921 35540/39177/35917
+f 35540/39177/35917 39732/39181/35921 40630/39182/35922 38143/39179/35919
+f 35533/39169/35909 35536/39178/35918 35541/39183/35923 35537/39170/35910
+f 35537/39170/35910 35541/39183/35923 39729/39165/35905 39728/39160/35900
+f 35536/39178/35918 38144/39180/35920 38145/39184/35924 35541/39183/35923
+f 35541/39183/35923 38145/39184/35924 40629/39166/35906 39729/39165/35905
+f 35542/39185/35925 35546/39186/35926 35547/39187/35927 35543/39188/35928
+f 35543/39188/35928 35547/39187/35927 38076/38812/35556 38075/38808/35552
+f 35546/39186/35926 39731/39176/35916 39730/39175/35915 35547/39187/35927
+f 35547/39187/35927 39730/39175/35915 40606/38794/35538 38076/38812/35556
+f 35542/39185/35925 35543/39188/35928 35548/39189/35929 35544/39190/35930
+f 35544/39190/35930 35548/39189/35929 39733/39191/35931 39734/39192/35932
+f 35543/39188/35928 38075/38808/35552 38074/38807/35551 35548/39189/35929
+f 35548/39189/35929 38074/38807/35551 40607/38810/35554 39733/39191/35931
+f 35542/39185/35925 35544/39190/35930 35549/39193/35933 35545/39194/35934
+f 35545/39194/35934 35549/39193/35933 38146/39195/35935 38147/39196/35936
+f 35544/39190/35930 39734/39192/35932 39735/39197/35937 35549/39193/35933
+f 35549/39193/35933 39735/39197/35937 40631/39198/35938 38146/39195/35935
+f 35542/39185/35925 35545/39194/35934 35550/39199/35939 35546/39186/35926
+f 35546/39186/35926 35550/39199/35939 39732/39181/35921 39731/39176/35916
+f 35545/39194/35934 38147/39196/35936 38148/39200/35940 35550/39199/35939
+f 35550/39199/35939 38148/39200/35940 40630/39182/35922 39732/39181/35921
+f 35551/39201/35941 35555/39202/35942 35556/39203/35943 35552/39204/35944
+f 35552/39204/35944 35556/39203/35943 38079/38828/35572 38078/38824/35568
+f 35555/39202/35942 39734/39192/35932 39733/39191/35931 35556/39203/35943
+f 35556/39203/35943 39733/39191/35931 40607/38810/35554 38079/38828/35572
+f 35551/39201/35941 35552/39204/35944 35557/39205/35945 35553/39206/35946
+f 35553/39206/35946 35557/39205/35945 39736/39207/35947 39737/39208/35948
+f 35552/39204/35944 38078/38824/35568 38077/38823/35567 35557/39205/35945
+f 35557/39205/35945 38077/38823/35567 40608/38826/35570 39736/39207/35947
+f 35551/39201/35941 35553/39206/35946 35558/39209/35949 35554/39210/35950
+f 35554/39210/35950 35558/39209/35949 38149/39211/35951 38150/39212/35952
+f 35553/39206/35946 39737/39208/35948 39738/39213/35953 35558/39209/35949
+f 35558/39209/35949 39738/39213/35953 40632/39214/35954 38149/39211/35951
+f 35551/39201/35941 35554/39210/35950 35559/39215/35955 35555/39202/35942
+f 35555/39202/35942 35559/39215/35955 39735/39197/35937 39734/39192/35932
+f 35554/39210/35950 38150/39212/35952 38151/39216/35956 35559/39215/35955
+f 35559/39215/35955 38151/39216/35956 40631/39198/35938 39735/39197/35937
+f 35560/39217/35957 35564/39218/35958 35565/39219/35959 35561/39220/35960
+f 35561/39220/35960 35565/39219/35959 38082/38844/35588 38081/38840/35584
+f 35564/39218/35958 39737/39208/35948 39736/39207/35947 35565/39219/35959
+f 35565/39219/35959 39736/39207/35947 40608/38826/35570 38082/38844/35588
+f 35560/39217/35957 35561/39220/35960 35566/39221/35961 35562/39222/35962
+f 35562/39222/35962 35566/39221/35961 39739/39223/35963 39740/39224/35964
+f 35561/39220/35960 38081/38840/35584 38080/38839/35583 35566/39221/35961
+f 35566/39221/35961 38080/38839/35583 40609/38842/35586 39739/39223/35963
+f 35560/39217/35957 35562/39222/35962 35567/39225/35965 35563/39226/35966
+f 35563/39226/35966 35567/39225/35965 38152/39227/35967 38153/39228/35968
+f 35562/39222/35962 39740/39224/35964 39741/39229/35969 35567/39225/35965
+f 35567/39225/35965 39741/39229/35969 40633/39230/35970 38152/39227/35967
+f 35560/39217/35957 35563/39226/35966 35568/39231/35971 35564/39218/35958
+f 35564/39218/35958 35568/39231/35971 39738/39213/35953 39737/39208/35948
+f 35563/39226/35966 38153/39228/35968 38154/39232/35972 35568/39231/35971
+f 35568/39231/35971 38154/39232/35972 40632/39214/35954 39738/39213/35953
+f 35569/39233/35973 35573/39234/35974 35574/39235/35975 35570/39236/35976
+f 35570/39236/35976 35574/39235/35975 38085/38860/35604 38084/38856/35600
+f 35573/39234/35974 39740/39224/35964 39739/39223/35963 35574/39235/35975
+f 35574/39235/35975 39739/39223/35963 40609/38842/35586 38085/38860/35604
+f 35569/39233/35973 35570/39236/35976 35575/39237/35977 35571/39238/35978
+f 35571/39238/35978 35575/39237/35977 39742/39239/35979 39743/39240/35980
+f 35570/39236/35976 38084/38856/35600 38083/38855/35599 35575/39237/35977
+f 35575/39237/35977 38083/38855/35599 40610/38858/35602 39742/39239/35979
+f 35569/39233/35973 35571/39238/35978 35576/39241/35981 35572/39242/35982
+f 35572/39242/35982 35576/39241/35981 38155/39243/35983 38156/39244/35984
+f 35571/39238/35978 39743/39240/35980 39744/39245/35985 35576/39241/35981
+f 35576/39241/35981 39744/39245/35985 40634/39246/35986 38155/39243/35983
+f 35569/39233/35973 35572/39242/35982 35577/39247/35987 35573/39234/35974
+f 35573/39234/35974 35577/39247/35987 39741/39229/35969 39740/39224/35964
+f 35572/39242/35982 38156/39244/35984 38157/39248/35988 35577/39247/35987
+f 35577/39247/35987 38157/39248/35988 40633/39230/35970 39741/39229/35969
+f 35578/39249/35989 35582/39250/35990 35583/39251/35991 35579/39252/35992
+f 35579/39252/35992 35583/39251/35991 38088/38876/35620 38087/38872/35616
+f 35582/39250/35990 39743/39240/35980 39742/39239/35979 35583/39251/35991
+f 35583/39251/35991 39742/39239/35979 40610/38858/35602 38088/38876/35620
+f 35578/39249/35989 35579/39252/35992 35584/39253/35993 35580/39254/35994
+f 35580/39254/35994 35584/39253/35993 39745/39255/35995 39746/39256/35996
+f 35579/39252/35992 38087/38872/35616 38086/38871/35615 35584/39253/35993
+f 35584/39253/35993 38086/38871/35615 40611/38874/35618 39745/39255/35995
+f 35578/39249/35989 35580/39254/35994 35585/39257/35997 35581/39258/35998
+f 35581/39258/35998 35585/39257/35997 38158/39259/35999 38159/39260/36000
+f 35580/39254/35994 39746/39256/35996 39747/39261/36001 35585/39257/35997
+f 35585/39257/35997 39747/39261/36001 40635/39262/36002 38158/39259/35999
+f 35578/39249/35989 35581/39258/35998 35586/39263/36003 35582/39250/35990
+f 35582/39250/35990 35586/39263/36003 39744/39245/35985 39743/39240/35980
+f 35581/39258/35998 38159/39260/36000 38160/39264/36004 35586/39263/36003
+f 35586/39263/36003 38160/39264/36004 40634/39246/35986 39744/39245/35985
+f 35587/39265/36005 35591/39266/36006 35592/39267/36007 35588/39268/36008
+f 35588/39268/36008 35592/39267/36007 38091/38892/35632 38090/38888/35630
+f 35591/39266/36006 39746/39256/35996 39745/39255/35995 35592/39267/36007
+f 35592/39267/36007 39745/39255/35995 40611/38874/35618 38091/38892/35632
+f 35587/39265/36005 35588/39268/36008 35593/39269/36009 35589/39270/36010
+f 35589/39270/36010 35593/39269/36009 39678/39271/35638 39677/39272/35637
+f 35588/39268/36008 38090/38888/35630 38089/38887/35629 35593/39269/36009
+f 35593/39269/36009 38089/38887/35629 40588/38890/35268 39678/39271/35638
+f 35587/39265/36005 35589/39270/36010 35594/39273/36011 35590/39274/36012
+f 35590/39274/36012 35594/39273/36011 38161/39275/36013 38162/39276/36014
+f 35589/39270/36010 39677/39272/35637 39676/39277/35650 35594/39273/36011
+f 35594/39273/36011 39676/39277/35650 40612/39278/35652 38161/39275/36013
+f 35587/39265/36005 35590/39274/36012 35595/39279/36015 35591/39266/36006
+f 35591/39266/36006 35595/39279/36015 39747/39261/36001 39746/39256/35996
+f 35590/39274/36012 38162/39276/36014 38163/39280/36016 35595/39279/36015
+f 35595/39279/36015 38163/39280/36016 40635/39262/36002 39747/39261/36001
+f 35596/39281/36017 35600/39282/36018 35601/39283/36019 35597/39284/36020
+f 35597/39284/36020 35601/39283/36019 38094/38911/35651 38093/38906/35646
+f 35600/39282/36018 39749/39285/36021 39750/39286/36022 35601/39283/36019
+f 35601/39283/36019 39750/39286/36022 40612/38912/35652 38094/38911/35651
+f 35596/39281/36017 35597/39284/36020 35602/39287/36023 35598/39288/36024
+f 35598/39288/36024 35602/39287/36023 39751/39289/36025 39752/39290/36026
+f 35597/39284/36020 38093/38906/35646 38092/38905/35645 35602/39287/36023
+f 35602/39287/36023 38092/38905/35645 40613/38908/35648 39751/39289/36025
+f 35596/39281/36017 35598/39288/36024 35603/39291/36027 35599/39292/36028
+f 35599/39292/36028 35603/39291/36027 38164/39293/36029 38165/39294/36030
+f 35598/39288/36024 39752/39290/36026 39753/39295/36031 35603/39291/36027
+f 35603/39291/36027 39753/39295/36031 40637/39296/36032 38164/39293/36029
+f 35596/39281/36017 35599/39292/36028 35604/39297/36033 35600/39282/36018
+f 35600/39282/36018 35604/39297/36033 39748/39298/36034 39749/39285/36021
+f 35599/39292/36028 38165/39294/36030 38166/39299/36035 35604/39297/36033
+f 35604/39297/36033 38166/39299/36035 40636/39300/36036 39748/39298/36034
+f 35605/39301/36037 35609/39302/36038 35610/39303/36039 35606/39304/36040
+f 35606/39304/36040 35610/39303/36039 38097/38928/35668 38096/38924/35664
+f 35609/39302/36038 39752/39290/36026 39751/39289/36025 35610/39303/36039
+f 35610/39303/36039 39751/39289/36025 40613/38908/35648 38097/38928/35668
+f 35605/39301/36037 35606/39304/36040 35611/39305/36041 35607/39306/36042
+f 35607/39306/36042 35611/39305/36041 39754/39307/36043 39755/39308/36044
+f 35606/39304/36040 38096/38924/35664 38095/38923/35663 35611/39305/36041
+f 35611/39305/36041 38095/38923/35663 40614/38926/35666 39754/39307/36043
+f 35605/39301/36037 35607/39306/36042 35612/39309/36045 35608/39310/36046
+f 35608/39310/36046 35612/39309/36045 38167/39311/36047 38168/39312/36048
+f 35607/39306/36042 39755/39308/36044 39756/39313/36049 35612/39309/36045
+f 35612/39309/36045 39756/39313/36049 40638/39314/36050 38167/39311/36047
+f 35605/39301/36037 35608/39310/36046 35613/39315/36051 35609/39302/36038
+f 35609/39302/36038 35613/39315/36051 39753/39295/36031 39752/39290/36026
+f 35608/39310/36046 38168/39312/36048 38169/39316/36052 35613/39315/36051
+f 35613/39315/36051 38169/39316/36052 40637/39296/36032 39753/39295/36031
+f 35614/39317/36053 35618/39318/36054 35619/39319/36055 35615/39320/36056
+f 35615/39320/36056 35619/39319/36055 38100/38944/35684 38099/38940/35680
+f 35618/39318/36054 39755/39308/36044 39754/39307/36043 35619/39319/36055
+f 35619/39319/36055 39754/39307/36043 40614/38926/35666 38100/38944/35684
+f 35614/39317/36053 35615/39320/36056 35620/39321/36057 35616/39322/36058
+f 35616/39322/36058 35620/39321/36057 39757/39323/36059 39758/39324/36060
+f 35615/39320/36056 38099/38940/35680 38098/38939/35679 35620/39321/36057
+f 35620/39321/36057 38098/38939/35679 40615/38942/35682 39757/39323/36059
+f 35614/39317/36053 35616/39322/36058 35621/39325/36061 35617/39326/36062
+f 35617/39326/36062 35621/39325/36061 38170/39327/36063 38171/39328/36064
+f 35616/39322/36058 39758/39324/36060 39759/39329/36065 35621/39325/36061
+f 35621/39325/36061 39759/39329/36065 40639/39330/36066 38170/39327/36063
+f 35614/39317/36053 35617/39326/36062 35622/39331/36067 35618/39318/36054
+f 35618/39318/36054 35622/39331/36067 39756/39313/36049 39755/39308/36044
+f 35617/39326/36062 38171/39328/36064 38172/39332/36068 35622/39331/36067
+f 35622/39331/36067 38172/39332/36068 40638/39314/36050 39756/39313/36049
+f 35623/39333/36069 35627/39334/36070 35628/39335/36071 35624/39336/36072
+f 35624/39336/36072 35628/39335/36071 38103/38960/35700 38102/38956/35696
+f 35627/39334/36070 39758/39324/36060 39757/39323/36059 35628/39335/36071
+f 35628/39335/36071 39757/39323/36059 40615/38942/35682 38103/38960/35700
+f 35623/39333/36069 35624/39336/36072 35629/39337/36073 35625/39338/36074
+f 35625/39338/36074 35629/39337/36073 39760/39339/36075 39761/39340/36076
+f 35624/39336/36072 38102/38956/35696 38101/38955/35695 35629/39337/36073
+f 35629/39337/36073 38101/38955/35695 40616/38958/35698 39760/39339/36075
+f 35623/39333/36069 35625/39338/36074 35630/39341/36077 35626/39342/36078
+f 35626/39342/36078 35630/39341/36077 38173/39343/36079 38174/39344/36080
+f 35625/39338/36074 39761/39340/36076 39762/39345/36081 35630/39341/36077
+f 35630/39341/36077 39762/39345/36081 40640/39346/36082 38173/39343/36079
+f 35623/39333/36069 35626/39342/36078 35631/39347/36083 35627/39334/36070
+f 35627/39334/36070 35631/39347/36083 39759/39329/36065 39758/39324/36060
+f 35626/39342/36078 38174/39344/36080 38175/39348/36084 35631/39347/36083
+f 35631/39347/36083 38175/39348/36084 40639/39330/36066 39759/39329/36065
+f 35632/39349/36085 35636/39350/36086 35637/39351/36087 35633/39352/36088
+f 35633/39352/36088 35637/39351/36087 38106/38976/35716 38105/38972/35712
+f 35636/39350/36086 39761/39340/36076 39760/39339/36075 35637/39351/36087
+f 35637/39351/36087 39760/39339/36075 40616/38958/35698 38106/38976/35716
+f 35632/39349/36085 35633/39352/36088 35638/39353/36089 35634/39354/36090
+f 35634/39354/36090 35638/39353/36089 39763/39355/36091 39764/39356/36092
+f 35633/39352/36088 38105/38972/35712 38104/38971/35711 35638/39353/36089
+f 35638/39353/36089 38104/38971/35711 40617/38974/35714 39763/39355/36091
+f 35632/39349/36085 35634/39354/36090 35639/39357/36093 35635/39358/36094
+f 35635/39358/36094 35639/39357/36093 38176/39359/36095 38177/39360/36096
+f 35634/39354/36090 39764/39356/36092 39765/39361/36097 35639/39357/36093
+f 35639/39357/36093 39765/39361/36097 40641/39362/36098 38176/39359/36095
+f 35632/39349/36085 35635/39358/36094 35640/39363/36099 35636/39350/36086
+f 35636/39350/36086 35640/39363/36099 39762/39345/36081 39761/39340/36076
+f 35635/39358/36094 38177/39360/36096 38178/39364/36100 35640/39363/36099
+f 35640/39363/36099 38178/39364/36100 40640/39346/36082 39762/39345/36081
+f 35641/39365/36101 35645/39366/36102 35646/39367/36103 35642/39368/36104
+f 35642/39368/36104 35646/39367/36103 38109/38992/35732 38108/38988/35728
+f 35645/39366/36102 39764/39356/36092 39763/39355/36091 35646/39367/36103
+f 35646/39367/36103 39763/39355/36091 40617/38974/35714 38109/38992/35732
+f 35641/39365/36101 35642/39368/36104 35647/39369/36105 35643/39370/36106
+f 35643/39370/36106 35647/39369/36105 39766/39371/36107 39767/39372/36108
+f 35642/39368/36104 38108/38988/35728 38107/38987/35727 35647/39369/36105
+f 35647/39369/36105 38107/38987/35727 40618/38990/35730 39766/39371/36107
+f 35641/39365/36101 35643/39370/36106 35648/39373/36109 35644/39374/36110
+f 35644/39374/36110 35648/39373/36109 38179/39375/36111 38180/39376/36112
+f 35643/39370/36106 39767/39372/36108 39768/39377/36113 35648/39373/36109
+f 35648/39373/36109 39768/39377/36113 40642/39378/36114 38179/39375/36111
+f 35641/39365/36101 35644/39374/36110 35649/39379/36115 35645/39366/36102
+f 35645/39366/36102 35649/39379/36115 39765/39361/36097 39764/39356/36092
+f 35644/39374/36110 38180/39376/36112 38181/39380/36116 35649/39379/36115
+f 35649/39379/36115 38181/39380/36116 40641/39362/36098 39765/39361/36097
+f 35650/39381/36117 35654/39382/36118 35655/39383/36119 35651/39384/36120
+f 35651/39384/36120 35655/39383/36119 38112/39008/35748 38111/39004/35744
+f 35654/39382/36118 39767/39372/36108 39766/39371/36107 35655/39383/36119
+f 35655/39383/36119 39766/39371/36107 40618/38990/35730 38112/39008/35748
+f 35650/39381/36117 35651/39384/36120 35656/39385/36121 35652/39386/36122
+f 35652/39386/36122 35656/39385/36121 39769/39387/36123 39770/39388/36124
+f 35651/39384/36120 38111/39004/35744 38110/39003/35743 35656/39385/36121
+f 35656/39385/36121 38110/39003/35743 40619/39006/35746 39769/39387/36123
+f 35650/39381/36117 35652/39386/36122 35657/39389/36125 35653/39390/36126
+f 35653/39390/36126 35657/39389/36125 38182/39391/36127 38183/39392/36128
+f 35652/39386/36122 39770/39388/36124 39771/39393/36129 35657/39389/36125
+f 35657/39389/36125 39771/39393/36129 40643/39394/36130 38182/39391/36127
+f 35650/39381/36117 35653/39390/36126 35658/39395/36131 35654/39382/36118
+f 35654/39382/36118 35658/39395/36131 39768/39377/36113 39767/39372/36108
+f 35653/39390/36126 38183/39392/36128 38184/39396/36132 35658/39395/36131
+f 35658/39395/36131 38184/39396/36132 40642/39378/36114 39768/39377/36113
+f 35659/39397/36133 35663/39398/36134 35664/39399/36135 35660/39400/36136
+f 35660/39400/36136 35664/39399/36135 38115/39024/35764 38114/39020/35760
+f 35663/39398/36134 39770/39388/36124 39769/39387/36123 35664/39399/36135
+f 35664/39399/36135 39769/39387/36123 40619/39006/35746 38115/39024/35764
+f 35659/39397/36133 35660/39400/36136 35665/39401/36137 35661/39402/36138
+f 35661/39402/36138 35665/39401/36137 39772/39403/36139 39773/39404/36140
+f 35660/39400/36136 38114/39020/35760 38113/39019/35759 35665/39401/36137
+f 35665/39401/36137 38113/39019/35759 40620/39022/35762 39772/39403/36139
+f 35659/39397/36133 35661/39402/36138 35666/39405/36141 35662/39406/36142
+f 35662/39406/36142 35666/39405/36141 38185/39407/36143 38186/39408/36144
+f 35661/39402/36138 39773/39404/36140 39774/39409/36145 35666/39405/36141
+f 35666/39405/36141 39774/39409/36145 40644/39410/36146 38185/39407/36143
+f 35659/39397/36133 35662/39406/36142 35667/39411/36147 35663/39398/36134
+f 35663/39398/36134 35667/39411/36147 39771/39393/36129 39770/39388/36124
+f 35662/39406/36142 38186/39408/36144 38187/39412/36148 35667/39411/36147
+f 35667/39411/36147 38187/39412/36148 40643/39394/36130 39771/39393/36129
+f 35668/39413/36149 35672/39414/36150 35673/39415/36151 35669/39416/36152
+f 35669/39416/36152 35673/39415/36151 38118/39040/35780 38117/39036/35776
+f 35672/39414/36150 39773/39404/36140 39772/39403/36139 35673/39415/36151
+f 35673/39415/36151 39772/39403/36139 40620/39022/35762 38118/39040/35780
+f 35668/39413/36149 35669/39416/36152 35674/39417/36153 35670/39418/36154
+f 35670/39418/36154 35674/39417/36153 39775/39419/36155 39776/39420/36156
+f 35669/39416/36152 38117/39036/35776 38116/39035/35775 35674/39417/36153
+f 35674/39417/36153 38116/39035/35775 40621/39038/35778 39775/39419/36155
+f 35668/39413/36149 35670/39418/36154 35675/39421/36157 35671/39422/36158
+f 35671/39422/36158 35675/39421/36157 38188/39423/36159 38189/39424/36160
+f 35670/39418/36154 39776/39420/36156 39777/39425/36161 35675/39421/36157
+f 35675/39421/36157 39777/39425/36161 40645/39426/36162 38188/39423/36159
+f 35668/39413/36149 35671/39422/36158 35676/39427/36163 35672/39414/36150
+f 35672/39414/36150 35676/39427/36163 39774/39409/36145 39773/39404/36140
+f 35671/39422/36158 38189/39424/36160 38190/39428/36164 35676/39427/36163
+f 35676/39427/36163 38190/39428/36164 40644/39410/36146 39774/39409/36145
+f 35677/39429/36165 35681/39430/36166 35682/39431/36167 35678/39432/36168
+f 35678/39432/36168 35682/39431/36167 38121/39056/35796 38120/39052/35792
+f 35681/39430/36166 39776/39420/36156 39775/39419/36155 35682/39431/36167
+f 35682/39431/36167 39775/39419/36155 40621/39038/35778 38121/39056/35796
+f 35677/39429/36165 35678/39432/36168 35683/39433/36169 35679/39434/36170
+f 35679/39434/36170 35683/39433/36169 39778/39435/36171 39779/39436/36172
+f 35678/39432/36168 38120/39052/35792 38119/39051/35791 35683/39433/36169
+f 35683/39433/36169 38119/39051/35791 40622/39054/35794 39778/39435/36171
+f 35677/39429/36165 35679/39434/36170 35684/39437/36173 35680/39438/36174
+f 35680/39438/36174 35684/39437/36173 38191/39439/36175 38192/39440/36176
+f 35679/39434/36170 39779/39436/36172 39780/39441/36177 35684/39437/36173
+f 35684/39437/36173 39780/39441/36177 40646/39442/36178 38191/39439/36175
+f 35677/39429/36165 35680/39438/36174 35685/39443/36179 35681/39430/36166
+f 35681/39430/36166 35685/39443/36179 39777/39425/36161 39776/39420/36156
+f 35680/39438/36174 38192/39440/36176 38193/39444/36180 35685/39443/36179
+f 35685/39443/36179 38193/39444/36180 40645/39426/36162 39777/39425/36161
+f 35686/39445/36181 35690/39446/36182 35691/39447/36183 35687/39448/36184
+f 35687/39448/36184 35691/39447/36183 38124/39072/35812 38123/39068/35808
+f 35690/39446/36182 39779/39436/36172 39778/39435/36171 35691/39447/36183
+f 35691/39447/36183 39778/39435/36171 40622/39054/35794 38124/39072/35812
+f 35686/39445/36181 35687/39448/36184 35692/39449/36185 35688/39450/36186
+f 35688/39450/36186 35692/39449/36185 39781/39451/36187 39782/39452/36188
+f 35687/39448/36184 38123/39068/35808 38122/39067/35807 35692/39449/36185
+f 35692/39449/36185 38122/39067/35807 40623/39070/35810 39781/39451/36187
+f 35686/39445/36181 35688/39450/36186 35693/39453/36189 35689/39454/36190
+f 35689/39454/36190 35693/39453/36189 38194/39455/36191 38195/39456/36192
+f 35688/39450/36186 39782/39452/36188 39783/39457/36193 35693/39453/36189
+f 35693/39453/36189 39783/39457/36193 40647/39458/36194 38194/39455/36191
+f 35686/39445/36181 35689/39454/36190 35694/39459/36195 35690/39446/36182
+f 35690/39446/36182 35694/39459/36195 39780/39441/36177 39779/39436/36172
+f 35689/39454/36190 38195/39456/36192 38196/39460/36196 35694/39459/36195
+f 35694/39459/36195 38196/39460/36196 40646/39442/36178 39780/39441/36177
+f 35695/39461/36197 35699/39462/36198 35700/39463/36199 35696/39464/36200
+f 35696/39464/36200 35700/39463/36199 38127/39088/35828 38126/39084/35824
+f 35699/39462/36198 39782/39452/36188 39781/39451/36187 35700/39463/36199
+f 35700/39463/36199 39781/39451/36187 40623/39070/35810 38127/39088/35828
+f 35695/39461/36197 35696/39464/36200 35701/39465/36201 35697/39466/36202
+f 35697/39466/36202 35701/39465/36201 39784/39467/36203 39785/39468/36204
+f 35696/39464/36200 38126/39084/35824 38125/39083/35823 35701/39465/36201
+f 35701/39465/36201 38125/39083/35823 40624/39086/35826 39784/39467/36203
+f 35695/39461/36197 35697/39466/36202 35702/39469/36205 35698/39470/36206
+f 35698/39470/36206 35702/39469/36205 38197/39471/36207 38198/39472/36208
+f 35697/39466/36202 39785/39468/36204 39786/39473/36209 35702/39469/36205
+f 35702/39469/36205 39786/39473/36209 40648/39474/36210 38197/39471/36207
+f 35695/39461/36197 35698/39470/36206 35703/39475/36211 35699/39462/36198
+f 35699/39462/36198 35703/39475/36211 39783/39457/36193 39782/39452/36188
+f 35698/39470/36206 38198/39472/36208 38199/39476/36212 35703/39475/36211
+f 35703/39475/36211 38199/39476/36212 40647/39458/36194 39783/39457/36193
+f 35704/39477/36213 35708/39478/36214 35709/39479/36215 35705/39480/36216
+f 35705/39480/36216 35709/39479/36215 38130/39104/35844 38129/39100/35840
+f 35708/39478/36214 39785/39468/36204 39784/39467/36203 35709/39479/36215
+f 35709/39479/36215 39784/39467/36203 40624/39086/35826 38130/39104/35844
+f 35704/39477/36213 35705/39480/36216 35710/39481/36217 35706/39482/36218
+f 35706/39482/36218 35710/39481/36217 39787/39483/36219 39788/39484/36220
+f 35705/39480/36216 38129/39100/35840 38128/39099/35839 35710/39481/36217
+f 35710/39481/36217 38128/39099/35839 40625/39102/35842 39787/39483/36219
+f 35704/39477/36213 35706/39482/36218 35711/39485/36221 35707/39486/36222
+f 35707/39486/36222 35711/39485/36221 38200/39487/36223 38201/39488/36224
+f 35706/39482/36218 39788/39484/36220 39789/39489/36225 35711/39485/36221
+f 35711/39485/36221 39789/39489/36225 40649/39490/36226 38200/39487/36223
+f 35704/39477/36213 35707/39486/36222 35712/39491/36227 35708/39478/36214
+f 35708/39478/36214 35712/39491/36227 39786/39473/36209 39785/39468/36204
+f 35707/39486/36222 38201/39488/36224 38202/39492/36228 35712/39491/36227
+f 35712/39491/36227 38202/39492/36228 40648/39474/36210 39786/39473/36209
+f 35713/39493/36229 35717/39494/36230 35718/39495/36231 35714/39496/36232
+f 35714/39496/36232 35718/39495/36231 38133/39120/35860 38132/39116/35856
+f 35717/39494/36230 39788/39484/36220 39787/39483/36219 35718/39495/36231
+f 35718/39495/36231 39787/39483/36219 40625/39102/35842 38133/39120/35860
+f 35713/39493/36229 35714/39496/36232 35719/39497/36233 35715/39498/36234
+f 35715/39498/36234 35719/39497/36233 39790/39499/36235 39791/39500/36236
+f 35714/39496/36232 38132/39116/35856 38131/39115/35855 35719/39497/36233
+f 35719/39497/36233 38131/39115/35855 40626/39118/35858 39790/39499/36235
+f 35713/39493/36229 35715/39498/36234 35720/39501/36237 35716/39502/36238
+f 35716/39502/36238 35720/39501/36237 38203/39503/36239 38204/39504/36240
+f 35715/39498/36234 39791/39500/36236 39792/39505/36241 35720/39501/36237
+f 35720/39501/36237 39792/39505/36241 40650/39506/36242 38203/39503/36239
+f 35713/39493/36229 35716/39502/36238 35721/39507/36243 35717/39494/36230
+f 35717/39494/36230 35721/39507/36243 39789/39489/36225 39788/39484/36220
+f 35716/39502/36238 38204/39504/36240 38205/39508/36244 35721/39507/36243
+f 35721/39507/36243 38205/39508/36244 40649/39490/36226 39789/39489/36225
+f 35722/39509/36245 35726/39510/36246 35727/39511/36247 35723/39512/36248
+f 35723/39512/36248 35727/39511/36247 38136/39136/35876 38135/39132/35872
+f 35726/39510/36246 39791/39500/36236 39790/39499/36235 35727/39511/36247
+f 35727/39511/36247 39790/39499/36235 40626/39118/35858 38136/39136/35876
+f 35722/39509/36245 35723/39512/36248 35728/39513/36249 35724/39514/36250
+f 35724/39514/36250 35728/39513/36249 39793/39515/36251 39794/39516/36252
+f 35723/39512/36248 38135/39132/35872 38134/39131/35871 35728/39513/36249
+f 35728/39513/36249 38134/39131/35871 40627/39134/35874 39793/39515/36251
+f 35722/39509/36245 35724/39514/36250 35729/39517/36253 35725/39518/36254
+f 35725/39518/36254 35729/39517/36253 38206/39519/36255 38207/39520/36256
+f 35724/39514/36250 39794/39516/36252 39795/39521/36257 35729/39517/36253
+f 35729/39517/36253 39795/39521/36257 40651/39522/36258 38206/39519/36255
+f 35722/39509/36245 35725/39518/36254 35730/39523/36259 35726/39510/36246
+f 35726/39510/36246 35730/39523/36259 39792/39505/36241 39791/39500/36236
+f 35725/39518/36254 38207/39520/36256 38208/39524/36260 35730/39523/36259
+f 35730/39523/36259 38208/39524/36260 40650/39506/36242 39792/39505/36241
+f 35731/39525/36261 35735/39526/36262 35736/39527/36263 35732/39528/36264
+f 35732/39528/36264 35736/39527/36263 38139/39152/35892 38138/39148/35888
+f 35735/39526/36262 39794/39516/36252 39793/39515/36251 35736/39527/36263
+f 35736/39527/36263 39793/39515/36251 40627/39134/35874 38139/39152/35892
+f 35731/39525/36261 35732/39528/36264 35737/39529/36265 35733/39530/36266
+f 35733/39530/36266 35737/39529/36265 39796/39531/36267 39797/39532/36268
+f 35732/39528/36264 38138/39148/35888 38137/39147/35887 35737/39529/36265
+f 35737/39529/36265 38137/39147/35887 40628/39150/35890 39796/39531/36267
+f 35731/39525/36261 35733/39530/36266 35738/39533/36269 35734/39534/36270
+f 35734/39534/36270 35738/39533/36269 38209/39535/36271 38210/39536/36272
+f 35733/39530/36266 39797/39532/36268 39798/39537/36273 35738/39533/36269
+f 35738/39533/36269 39798/39537/36273 40652/39538/36274 38209/39535/36271
+f 35731/39525/36261 35734/39534/36270 35739/39539/36275 35735/39526/36262
+f 35735/39526/36262 35739/39539/36275 39795/39521/36257 39794/39516/36252
+f 35734/39534/36270 38210/39536/36272 38211/39540/36276 35739/39539/36275
+f 35739/39539/36275 38211/39540/36276 40651/39522/36258 39795/39521/36257
+f 35740/39541/36277 35744/39542/36278 35745/39543/36279 35741/39544/36280
+f 35741/39544/36280 35745/39543/36279 38142/39168/35908 38141/39164/35904
+f 35744/39542/36278 39797/39532/36268 39796/39531/36267 35745/39543/36279
+f 35745/39543/36279 39796/39531/36267 40628/39150/35890 38142/39168/35908
+f 35740/39541/36277 35741/39544/36280 35746/39545/36281 35742/39546/36282
+f 35742/39546/36282 35746/39545/36281 39799/39547/36283 39800/39548/36284
+f 35741/39544/36280 38141/39164/35904 38140/39163/35903 35746/39545/36281
+f 35746/39545/36281 38140/39163/35903 40629/39166/35906 39799/39547/36283
+f 35740/39541/36277 35742/39546/36282 35747/39549/36285 35743/39550/36286
+f 35743/39550/36286 35747/39549/36285 38212/39551/36287 38213/39552/36288
+f 35742/39546/36282 39800/39548/36284 39801/39553/36289 35747/39549/36285
+f 35747/39549/36285 39801/39553/36289 40653/39554/36290 38212/39551/36287
+f 35740/39541/36277 35743/39550/36286 35748/39555/36291 35744/39542/36278
+f 35744/39542/36278 35748/39555/36291 39798/39537/36273 39797/39532/36268
+f 35743/39550/36286 38213/39552/36288 38214/39556/36292 35748/39555/36291
+f 35748/39555/36291 38214/39556/36292 40652/39538/36274 39798/39537/36273
+f 35749/39557/36293 35753/39558/36294 35754/39559/36295 35750/39560/36296
+f 35750/39560/36296 35754/39559/36295 38145/39184/35924 38144/39180/35920
+f 35753/39558/36294 39800/39548/36284 39799/39547/36283 35754/39559/36295
+f 35754/39559/36295 39799/39547/36283 40629/39166/35906 38145/39184/35924
+f 35749/39557/36293 35750/39560/36296 35755/39561/36297 35751/39562/36298
+f 35751/39562/36298 35755/39561/36297 39802/39563/36299 39803/39564/36300
+f 35750/39560/36296 38144/39180/35920 38143/39179/35919 35755/39561/36297
+f 35755/39561/36297 38143/39179/35919 40630/39182/35922 39802/39563/36299
+f 35749/39557/36293 35751/39562/36298 35756/39565/36301 35752/39566/36302
+f 35752/39566/36302 35756/39565/36301 38215/39567/36303 38216/39568/36304
+f 35751/39562/36298 39803/39564/36300 39804/39569/36305 35756/39565/36301
+f 35756/39565/36301 39804/39569/36305 40654/39570/36306 38215/39567/36303
+f 35749/39557/36293 35752/39566/36302 35757/39571/36307 35753/39558/36294
+f 35753/39558/36294 35757/39571/36307 39801/39553/36289 39800/39548/36284
+f 35752/39566/36302 38216/39568/36304 38217/39572/36308 35757/39571/36307
+f 35757/39571/36307 38217/39572/36308 40653/39554/36290 39801/39553/36289
+f 35758/39573/36309 35762/39574/36310 35763/39575/36311 35759/39576/36312
+f 35759/39576/36312 35763/39575/36311 38148/39200/35940 38147/39196/35936
+f 35762/39574/36310 39803/39564/36300 39802/39563/36299 35763/39575/36311
+f 35763/39575/36311 39802/39563/36299 40630/39182/35922 38148/39200/35940
+f 35758/39573/36309 35759/39576/36312 35764/39577/36313 35760/39578/36314
+f 35760/39578/36314 35764/39577/36313 39805/39579/36315 39806/39580/36316
+f 35759/39576/36312 38147/39196/35936 38146/39195/35935 35764/39577/36313
+f 35764/39577/36313 38146/39195/35935 40631/39198/35938 39805/39579/36315
+f 35758/39573/36309 35760/39578/36314 35765/39581/36317 35761/39582/36318
+f 35761/39582/36318 35765/39581/36317 38218/39583/36319 38219/39584/36320
+f 35760/39578/36314 39806/39580/36316 39807/39585/36321 35765/39581/36317
+f 35765/39581/36317 39807/39585/36321 40655/39586/36322 38218/39583/36319
+f 35758/39573/36309 35761/39582/36318 35766/39587/36323 35762/39574/36310
+f 35762/39574/36310 35766/39587/36323 39804/39569/36305 39803/39564/36300
+f 35761/39582/36318 38219/39584/36320 38220/39588/36324 35766/39587/36323
+f 35766/39587/36323 38220/39588/36324 40654/39570/36306 39804/39569/36305
+f 35767/39589/36325 35771/39590/36326 35772/39591/36327 35768/39592/36328
+f 35768/39592/36328 35772/39591/36327 38151/39216/35956 38150/39212/35952
+f 35771/39590/36326 39806/39580/36316 39805/39579/36315 35772/39591/36327
+f 35772/39591/36327 39805/39579/36315 40631/39198/35938 38151/39216/35956
+f 35767/39589/36325 35768/39592/36328 35773/39593/36329 35769/39594/36330
+f 35769/39594/36330 35773/39593/36329 39808/39595/36331 39809/39596/36332
+f 35768/39592/36328 38150/39212/35952 38149/39211/35951 35773/39593/36329
+f 35773/39593/36329 38149/39211/35951 40632/39214/35954 39808/39595/36331
+f 35767/39589/36325 35769/39594/36330 35774/39597/36333 35770/39598/36334
+f 35770/39598/36334 35774/39597/36333 38221/39599/36335 38222/39600/36336
+f 35769/39594/36330 39809/39596/36332 39810/39601/36337 35774/39597/36333
+f 35774/39597/36333 39810/39601/36337 40656/39602/36338 38221/39599/36335
+f 35767/39589/36325 35770/39598/36334 35775/39603/36339 35771/39590/36326
+f 35771/39590/36326 35775/39603/36339 39807/39585/36321 39806/39580/36316
+f 35770/39598/36334 38222/39600/36336 38223/39604/36340 35775/39603/36339
+f 35775/39603/36339 38223/39604/36340 40655/39586/36322 39807/39585/36321
+f 35776/39605/36341 35780/39606/36342 35781/39607/36343 35777/39608/36344
+f 35777/39608/36344 35781/39607/36343 38154/39232/35972 38153/39228/35968
+f 35780/39606/36342 39809/39596/36332 39808/39595/36331 35781/39607/36343
+f 35781/39607/36343 39808/39595/36331 40632/39214/35954 38154/39232/35972
+f 35776/39605/36341 35777/39608/36344 35782/39609/36345 35778/39610/36346
+f 35778/39610/36346 35782/39609/36345 39811/39611/36347 39812/39612/36348
+f 35777/39608/36344 38153/39228/35968 38152/39227/35967 35782/39609/36345
+f 35782/39609/36345 38152/39227/35967 40633/39230/35970 39811/39611/36347
+f 35776/39605/36341 35778/39610/36346 35783/39613/36349 35779/39614/36350
+f 35779/39614/36350 35783/39613/36349 38224/39615/36351 38225/39616/36352
+f 35778/39610/36346 39812/39612/36348 39813/39617/36353 35783/39613/36349
+f 35783/39613/36349 39813/39617/36353 40657/39618/36354 38224/39615/36351
+f 35776/39605/36341 35779/39614/36350 35784/39619/36355 35780/39606/36342
+f 35780/39606/36342 35784/39619/36355 39810/39601/36337 39809/39596/36332
+f 35779/39614/36350 38225/39616/36352 38226/39620/36356 35784/39619/36355
+f 35784/39619/36355 38226/39620/36356 40656/39602/36338 39810/39601/36337
+f 35785/39621/36357 35789/39622/36358 35790/39623/36359 35786/39624/36360
+f 35786/39624/36360 35790/39623/36359 38157/39248/35988 38156/39244/35984
+f 35789/39622/36358 39812/39612/36348 39811/39611/36347 35790/39623/36359
+f 35790/39623/36359 39811/39611/36347 40633/39230/35970 38157/39248/35988
+f 35785/39621/36357 35786/39624/36360 35791/39625/36361 35787/39626/36362
+f 35787/39626/36362 35791/39625/36361 39814/39627/36363 39815/39628/36364
+f 35786/39624/36360 38156/39244/35984 38155/39243/35983 35791/39625/36361
+f 35791/39625/36361 38155/39243/35983 40634/39246/35986 39814/39627/36363
+f 35785/39621/36357 35787/39626/36362 35792/39629/36365 35788/39630/36366
+f 35788/39630/36366 35792/39629/36365 38227/39631/36367 38228/39632/36368
+f 35787/39626/36362 39815/39628/36364 39816/39633/36369 35792/39629/36365
+f 35792/39629/36365 39816/39633/36369 40658/39634/36370 38227/39631/36367
+f 35785/39621/36357 35788/39630/36366 35793/39635/36371 35789/39622/36358
+f 35789/39622/36358 35793/39635/36371 39813/39617/36353 39812/39612/36348
+f 35788/39630/36366 38228/39632/36368 38229/39636/36372 35793/39635/36371
+f 35793/39635/36371 38229/39636/36372 40657/39618/36354 39813/39617/36353
+f 35794/39637/36373 35798/39638/36374 35799/39639/36375 35795/39640/36376
+f 35795/39640/36376 35799/39639/36375 38160/39264/36004 38159/39260/36000
+f 35798/39638/36374 39815/39628/36364 39814/39627/36363 35799/39639/36375
+f 35799/39639/36375 39814/39627/36363 40634/39246/35986 38160/39264/36004
+f 35794/39637/36373 35795/39640/36376 35800/39641/36377 35796/39642/36378
+f 35796/39642/36378 35800/39641/36377 39817/39643/36379 39818/39644/36380
+f 35795/39640/36376 38159/39260/36000 38158/39259/35999 35800/39641/36377
+f 35800/39641/36377 38158/39259/35999 40635/39262/36002 39817/39643/36379
+f 35794/39637/36373 35796/39642/36378 35801/39645/36381 35797/39646/36382
+f 35797/39646/36382 35801/39645/36381 38230/39647/36383 38231/39648/36384
+f 35796/39642/36378 39818/39644/36380 39819/39649/36385 35801/39645/36381
+f 35801/39645/36381 39819/39649/36385 40659/39650/36386 38230/39647/36383
+f 35794/39637/36373 35797/39646/36382 35802/39651/36387 35798/39638/36374
+f 35798/39638/36374 35802/39651/36387 39816/39633/36369 39815/39628/36364
+f 35797/39646/36382 38231/39648/36384 38232/39652/36388 35802/39651/36387
+f 35802/39651/36387 38232/39652/36388 40658/39634/36370 39816/39633/36369
+f 35803/39653/36389 35807/39654/36390 35808/39655/36391 35804/39656/36392
+f 35804/39656/36392 35808/39655/36391 38163/39280/36016 38162/39276/36014
+f 35807/39654/36390 39818/39644/36380 39817/39643/36379 35808/39655/36391
+f 35808/39655/36391 39817/39643/36379 40635/39262/36002 38163/39280/36016
+f 35803/39653/36389 35804/39656/36392 35809/39657/36393 35805/39658/36394
+f 35805/39658/36394 35809/39657/36393 39750/39659/36022 39749/39660/36021
+f 35804/39656/36392 38162/39276/36014 38161/39275/36013 35809/39657/36393
+f 35809/39657/36393 38161/39275/36013 40612/39278/35652 39750/39659/36022
+f 35803/39653/36389 35805/39658/36394 35810/39661/36395 35806/39662/36396
+f 35806/39662/36396 35810/39661/36395 38233/39663/36397 38234/39664/36398
+f 35805/39658/36394 39749/39660/36021 39748/39665/36034 35810/39661/36395
+f 35810/39661/36395 39748/39665/36034 40636/39666/36036 38233/39663/36397
+f 35803/39653/36389 35806/39662/36396 35811/39667/36399 35807/39654/36390
+f 35807/39654/36390 35811/39667/36399 39819/39649/36385 39818/39644/36380
+f 35806/39662/36396 38234/39664/36398 38235/39668/36400 35811/39667/36399
+f 35811/39667/36399 38235/39668/36400 40659/39650/36386 39819/39649/36385
+f 35812/39669/36401 35816/39670/36402 35817/39671/36403 35813/39672/36404
+f 35813/39672/36404 35817/39671/36403 38166/39299/36035 38165/39294/36030
+f 35816/39670/36402 39821/39673/36405 39822/39674/36406 35817/39671/36403
+f 35817/39671/36403 39822/39674/36406 40636/39300/36036 38166/39299/36035
+f 35812/39669/36401 35813/39672/36404 35818/39675/36407 35814/39676/36408
+f 35814/39676/36408 35818/39675/36407 39823/39677/36409 39824/39678/36410
+f 35813/39672/36404 38165/39294/36030 38164/39293/36029 35818/39675/36407
+f 35818/39675/36407 38164/39293/36029 40637/39296/36032 39823/39677/36409
+f 35812/39669/36401 35814/39676/36408 35819/39679/36411 35815/39680/36412
+f 35815/39680/36412 35819/39679/36411 38236/39681/36413 38237/39682/36414
+f 35814/39676/36408 39824/39678/36410 39825/39683/36415 35819/39679/36411
+f 35819/39679/36411 39825/39683/36415 40661/39684/36416 38236/39681/36413
+f 35812/39669/36401 35815/39680/36412 35820/39685/36417 35816/39670/36402
+f 35816/39670/36402 35820/39685/36417 39820/39686/36418 39821/39673/36405
+f 35815/39680/36412 38237/39682/36414 38238/39687/36419 35820/39685/36417
+f 35820/39685/36417 38238/39687/36419 40660/39688/36420 39820/39686/36418
+f 35821/39689/36421 35825/39690/36422 35826/39691/36423 35822/39692/36424
+f 35822/39692/36424 35826/39691/36423 38169/39316/36052 38168/39312/36048
+f 35825/39690/36422 39824/39678/36410 39823/39677/36409 35826/39691/36423
+f 35826/39691/36423 39823/39677/36409 40637/39296/36032 38169/39316/36052
+f 35821/39689/36421 35822/39692/36424 35827/39693/36425 35823/39694/36426
+f 35823/39694/36426 35827/39693/36425 39826/39695/36427 39827/39696/36428
+f 35822/39692/36424 38168/39312/36048 38167/39311/36047 35827/39693/36425
+f 35827/39693/36425 38167/39311/36047 40638/39314/36050 39826/39695/36427
+f 35821/39689/36421 35823/39694/36426 35828/39697/36429 35824/39698/36430
+f 35824/39698/36430 35828/39697/36429 38239/39699/36431 38240/39700/36432
+f 35823/39694/36426 39827/39696/36428 39828/39701/36433 35828/39697/36429
+f 35828/39697/36429 39828/39701/36433 40662/39702/36434 38239/39699/36431
+f 35821/39689/36421 35824/39698/36430 35829/39703/36435 35825/39690/36422
+f 35825/39690/36422 35829/39703/36435 39825/39683/36415 39824/39678/36410
+f 35824/39698/36430 38240/39700/36432 38241/39704/36436 35829/39703/36435
+f 35829/39703/36435 38241/39704/36436 40661/39684/36416 39825/39683/36415
+f 35830/39705/36437 35834/39706/36438 35835/39707/36439 35831/39708/36440
+f 35831/39708/36440 35835/39707/36439 38172/39332/36068 38171/39328/36064
+f 35834/39706/36438 39827/39696/36428 39826/39695/36427 35835/39707/36439
+f 35835/39707/36439 39826/39695/36427 40638/39314/36050 38172/39332/36068
+f 35830/39705/36437 35831/39708/36440 35836/39709/36441 35832/39710/36442
+f 35832/39710/36442 35836/39709/36441 39829/39711/36443 39830/39712/36444
+f 35831/39708/36440 38171/39328/36064 38170/39327/36063 35836/39709/36441
+f 35836/39709/36441 38170/39327/36063 40639/39330/36066 39829/39711/36443
+f 35830/39705/36437 35832/39710/36442 35837/39713/36445 35833/39714/36446
+f 35833/39714/36446 35837/39713/36445 38242/39715/36447 38243/39716/36448
+f 35832/39710/36442 39830/39712/36444 39831/39717/36449 35837/39713/36445
+f 35837/39713/36445 39831/39717/36449 40663/39718/36450 38242/39715/36447
+f 35830/39705/36437 35833/39714/36446 35838/39719/36451 35834/39706/36438
+f 35834/39706/36438 35838/39719/36451 39828/39701/36433 39827/39696/36428
+f 35833/39714/36446 38243/39716/36448 38244/39720/36452 35838/39719/36451
+f 35838/39719/36451 38244/39720/36452 40662/39702/36434 39828/39701/36433
+f 35839/39721/36453 35843/39722/36454 35844/39723/36455 35840/39724/36456
+f 35840/39724/36456 35844/39723/36455 38175/39348/36084 38174/39344/36080
+f 35843/39722/36454 39830/39712/36444 39829/39711/36443 35844/39723/36455
+f 35844/39723/36455 39829/39711/36443 40639/39330/36066 38175/39348/36084
+f 35839/39721/36453 35840/39724/36456 35845/39725/36457 35841/39726/36458
+f 35841/39726/36458 35845/39725/36457 39832/39727/36459 39833/39728/36460
+f 35840/39724/36456 38174/39344/36080 38173/39343/36079 35845/39725/36457
+f 35845/39725/36457 38173/39343/36079 40640/39346/36082 39832/39727/36459
+f 35839/39721/36453 35841/39726/36458 35846/39729/36461 35842/39730/36462
+f 35842/39730/36462 35846/39729/36461 38245/39731/36463 38246/39732/36464
+f 35841/39726/36458 39833/39728/36460 39834/39733/36465 35846/39729/36461
+f 35846/39729/36461 39834/39733/36465 40664/39734/36466 38245/39731/36463
+f 35839/39721/36453 35842/39730/36462 35847/39735/36467 35843/39722/36454
+f 35843/39722/36454 35847/39735/36467 39831/39717/36449 39830/39712/36444
+f 35842/39730/36462 38246/39732/36464 38247/39736/36468 35847/39735/36467
+f 35847/39735/36467 38247/39736/36468 40663/39718/36450 39831/39717/36449
+f 35848/39737/36469 35852/39738/36470 35853/39739/36471 35849/39740/36472
+f 35849/39740/36472 35853/39739/36471 38178/39364/36100 38177/39360/36096
+f 35852/39738/36470 39833/39728/36460 39832/39727/36459 35853/39739/36471
+f 35853/39739/36471 39832/39727/36459 40640/39346/36082 38178/39364/36100
+f 35848/39737/36469 35849/39740/36472 35854/39741/36473 35850/39742/36474
+f 35850/39742/36474 35854/39741/36473 39835/39743/36475 39836/39744/36476
+f 35849/39740/36472 38177/39360/36096 38176/39359/36095 35854/39741/36473
+f 35854/39741/36473 38176/39359/36095 40641/39362/36098 39835/39743/36475
+f 35848/39737/36469 35850/39742/36474 35855/39745/36477 35851/39746/36478
+f 35851/39746/36478 35855/39745/36477 38248/39747/36479 38249/39748/36480
+f 35850/39742/36474 39836/39744/36476 39837/39749/36481 35855/39745/36477
+f 35855/39745/36477 39837/39749/36481 40665/39750/36482 38248/39747/36479
+f 35848/39737/36469 35851/39746/36478 35856/39751/36483 35852/39738/36470
+f 35852/39738/36470 35856/39751/36483 39834/39733/36465 39833/39728/36460
+f 35851/39746/36478 38249/39748/36480 38250/39752/36484 35856/39751/36483
+f 35856/39751/36483 38250/39752/36484 40664/39734/36466 39834/39733/36465
+f 35857/39753/36485 35861/39754/36486 35862/39755/36487 35858/39756/36488
+f 35858/39756/36488 35862/39755/36487 38181/39380/36116 38180/39376/36112
+f 35861/39754/36486 39836/39744/36476 39835/39743/36475 35862/39755/36487
+f 35862/39755/36487 39835/39743/36475 40641/39362/36098 38181/39380/36116
+f 35857/39753/36485 35858/39756/36488 35863/39757/36489 35859/39758/36490
+f 35859/39758/36490 35863/39757/36489 39838/39759/36491 39839/39760/36492
+f 35858/39756/36488 38180/39376/36112 38179/39375/36111 35863/39757/36489
+f 35863/39757/36489 38179/39375/36111 40642/39378/36114 39838/39759/36491
+f 35857/39753/36485 35859/39758/36490 35864/39761/36493 35860/39762/36494
+f 35860/39762/36494 35864/39761/36493 38251/39763/36495 38252/39764/36496
+f 35859/39758/36490 39839/39760/36492 39840/39765/36497 35864/39761/36493
+f 35864/39761/36493 39840/39765/36497 40666/39766/36498 38251/39763/36495
+f 35857/39753/36485 35860/39762/36494 35865/39767/36499 35861/39754/36486
+f 35861/39754/36486 35865/39767/36499 39837/39749/36481 39836/39744/36476
+f 35860/39762/36494 38252/39764/36496 38253/39768/36500 35865/39767/36499
+f 35865/39767/36499 38253/39768/36500 40665/39750/36482 39837/39749/36481
+f 35866/39769/36501 35870/39770/36502 35871/39771/36503 35867/39772/36504
+f 35867/39772/36504 35871/39771/36503 38184/39396/36132 38183/39392/36128
+f 35870/39770/36502 39839/39760/36492 39838/39759/36491 35871/39771/36503
+f 35871/39771/36503 39838/39759/36491 40642/39378/36114 38184/39396/36132
+f 35866/39769/36501 35867/39772/36504 35872/39773/36505 35868/39774/36506
+f 35868/39774/36506 35872/39773/36505 39841/39775/36507 39842/39776/36508
+f 35867/39772/36504 38183/39392/36128 38182/39391/36127 35872/39773/36505
+f 35872/39773/36505 38182/39391/36127 40643/39394/36130 39841/39775/36507
+f 35866/39769/36501 35868/39774/36506 35873/39777/36509 35869/39778/36510
+f 35869/39778/36510 35873/39777/36509 38254/39779/36511 38255/39780/36512
+f 35868/39774/36506 39842/39776/36508 39843/39781/36513 35873/39777/36509
+f 35873/39777/36509 39843/39781/36513 40667/39782/36514 38254/39779/36511
+f 35866/39769/36501 35869/39778/36510 35874/39783/36515 35870/39770/36502
+f 35870/39770/36502 35874/39783/36515 39840/39765/36497 39839/39760/36492
+f 35869/39778/36510 38255/39780/36512 38256/39784/36516 35874/39783/36515
+f 35874/39783/36515 38256/39784/36516 40666/39766/36498 39840/39765/36497
+f 35875/39785/36517 35879/39786/36518 35880/39787/36519 35876/39788/36520
+f 35876/39788/36520 35880/39787/36519 38187/39412/36148 38186/39408/36144
+f 35879/39786/36518 39842/39776/36508 39841/39775/36507 35880/39787/36519
+f 35880/39787/36519 39841/39775/36507 40643/39394/36130 38187/39412/36148
+f 35875/39785/36517 35876/39788/36520 35881/39789/36521 35877/39790/36522
+f 35877/39790/36522 35881/39789/36521 39844/39791/36523 39845/39792/36524
+f 35876/39788/36520 38186/39408/36144 38185/39407/36143 35881/39789/36521
+f 35881/39789/36521 38185/39407/36143 40644/39410/36146 39844/39791/36523
+f 35875/39785/36517 35877/39790/36522 35882/39793/36525 35878/39794/36526
+f 35878/39794/36526 35882/39793/36525 38257/39795/36527 38258/39796/36528
+f 35877/39790/36522 39845/39792/36524 39846/39797/36529 35882/39793/36525
+f 35882/39793/36525 39846/39797/36529 40668/39798/36530 38257/39795/36527
+f 35875/39785/36517 35878/39794/36526 35883/39799/36531 35879/39786/36518
+f 35879/39786/36518 35883/39799/36531 39843/39781/36513 39842/39776/36508
+f 35878/39794/36526 38258/39796/36528 38259/39800/36532 35883/39799/36531
+f 35883/39799/36531 38259/39800/36532 40667/39782/36514 39843/39781/36513
+f 35884/39801/36533 35888/39802/36534 35889/39803/36535 35885/39804/36536
+f 35885/39804/36536 35889/39803/36535 38190/39428/36164 38189/39424/36160
+f 35888/39802/36534 39845/39792/36524 39844/39791/36523 35889/39803/36535
+f 35889/39803/36535 39844/39791/36523 40644/39410/36146 38190/39428/36164
+f 35884/39801/36533 35885/39804/36536 35890/39805/36537 35886/39806/36538
+f 35886/39806/36538 35890/39805/36537 39847/39807/36539 39848/39808/36540
+f 35885/39804/36536 38189/39424/36160 38188/39423/36159 35890/39805/36537
+f 35890/39805/36537 38188/39423/36159 40645/39426/36162 39847/39807/36539
+f 35884/39801/36533 35886/39806/36538 35891/39809/36541 35887/39810/36542
+f 35887/39810/36542 35891/39809/36541 38260/39811/36543 38261/39812/36544
+f 35886/39806/36538 39848/39808/36540 39849/39813/36545 35891/39809/36541
+f 35891/39809/36541 39849/39813/36545 40669/39814/36546 38260/39811/36543
+f 35884/39801/36533 35887/39810/36542 35892/39815/36547 35888/39802/36534
+f 35888/39802/36534 35892/39815/36547 39846/39797/36529 39845/39792/36524
+f 35887/39810/36542 38261/39812/36544 38262/39816/36548 35892/39815/36547
+f 35892/39815/36547 38262/39816/36548 40668/39798/36530 39846/39797/36529
+f 35893/39817/36549 35897/39818/36550 35898/39819/36551 35894/39820/36552
+f 35894/39820/36552 35898/39819/36551 38193/39444/36180 38192/39440/36176
+f 35897/39818/36550 39848/39808/36540 39847/39807/36539 35898/39819/36551
+f 35898/39819/36551 39847/39807/36539 40645/39426/36162 38193/39444/36180
+f 35893/39817/36549 35894/39820/36552 35899/39821/36553 35895/39822/36554
+f 35895/39822/36554 35899/39821/36553 39850/39823/36555 39851/39824/36556
+f 35894/39820/36552 38192/39440/36176 38191/39439/36175 35899/39821/36553
+f 35899/39821/36553 38191/39439/36175 40646/39442/36178 39850/39823/36555
+f 35893/39817/36549 35895/39822/36554 35900/39825/36557 35896/39826/36558
+f 35896/39826/36558 35900/39825/36557 38263/39827/36559 38264/39828/36560
+f 35895/39822/36554 39851/39824/36556 39852/39829/36561 35900/39825/36557
+f 35900/39825/36557 39852/39829/36561 40670/39830/36562 38263/39827/36559
+f 35893/39817/36549 35896/39826/36558 35901/39831/36563 35897/39818/36550
+f 35897/39818/36550 35901/39831/36563 39849/39813/36545 39848/39808/36540
+f 35896/39826/36558 38264/39828/36560 38265/39832/36564 35901/39831/36563
+f 35901/39831/36563 38265/39832/36564 40669/39814/36546 39849/39813/36545
+f 35902/39833/36565 35906/39834/36566 35907/39835/36567 35903/39836/36568
+f 35903/39836/36568 35907/39835/36567 38196/39460/36196 38195/39456/36192
+f 35906/39834/36566 39851/39824/36556 39850/39823/36555 35907/39835/36567
+f 35907/39835/36567 39850/39823/36555 40646/39442/36178 38196/39460/36196
+f 35902/39833/36565 35903/39836/36568 35908/39837/36569 35904/39838/36570
+f 35904/39838/36570 35908/39837/36569 39853/39839/36571 39854/39840/36572
+f 35903/39836/36568 38195/39456/36192 38194/39455/36191 35908/39837/36569
+f 35908/39837/36569 38194/39455/36191 40647/39458/36194 39853/39839/36571
+f 35902/39833/36565 35904/39838/36570 35909/39841/36573 35905/39842/36574
+f 35905/39842/36574 35909/39841/36573 38266/39843/36575 38267/39844/36576
+f 35904/39838/36570 39854/39840/36572 39855/39845/36577 35909/39841/36573
+f 35909/39841/36573 39855/39845/36577 40671/39846/36578 38266/39843/36575
+f 35902/39833/36565 35905/39842/36574 35910/39847/36579 35906/39834/36566
+f 35906/39834/36566 35910/39847/36579 39852/39829/36561 39851/39824/36556
+f 35905/39842/36574 38267/39844/36576 38268/39848/36580 35910/39847/36579
+f 35910/39847/36579 38268/39848/36580 40670/39830/36562 39852/39829/36561
+f 35911/39849/36581 35915/39850/36582 35916/39851/36583 35912/39852/36584
+f 35912/39852/36584 35916/39851/36583 38199/39476/36212 38198/39472/36208
+f 35915/39850/36582 39854/39840/36572 39853/39839/36571 35916/39851/36583
+f 35916/39851/36583 39853/39839/36571 40647/39458/36194 38199/39476/36212
+f 35911/39849/36581 35912/39852/36584 35917/39853/36585 35913/39854/36586
+f 35913/39854/36586 35917/39853/36585 39856/39855/36587 39857/39856/36588
+f 35912/39852/36584 38198/39472/36208 38197/39471/36207 35917/39853/36585
+f 35917/39853/36585 38197/39471/36207 40648/39474/36210 39856/39855/36587
+f 35911/39849/36581 35913/39854/36586 35918/39857/36589 35914/39858/36590
+f 35914/39858/36590 35918/39857/36589 38269/39859/36591 38270/39860/36592
+f 35913/39854/36586 39857/39856/36588 39858/39861/36593 35918/39857/36589
+f 35918/39857/36589 39858/39861/36593 40672/39862/36594 38269/39859/36591
+f 35911/39849/36581 35914/39858/36590 35919/39863/36595 35915/39850/36582
+f 35915/39850/36582 35919/39863/36595 39855/39845/36577 39854/39840/36572
+f 35914/39858/36590 38270/39860/36592 38271/39864/36596 35919/39863/36595
+f 35919/39863/36595 38271/39864/36596 40671/39846/36578 39855/39845/36577
+f 35920/39865/36597 35924/39866/36598 35925/39867/36599 35921/39868/36600
+f 35921/39868/36600 35925/39867/36599 38202/39492/36228 38201/39488/36224
+f 35924/39866/36598 39857/39856/36588 39856/39855/36587 35925/39867/36599
+f 35925/39867/36599 39856/39855/36587 40648/39474/36210 38202/39492/36228
+f 35920/39865/36597 35921/39868/36600 35926/39869/36601 35922/39870/36602
+f 35922/39870/36602 35926/39869/36601 39859/39871/36603 39860/39872/36604
+f 35921/39868/36600 38201/39488/36224 38200/39487/36223 35926/39869/36601
+f 35926/39869/36601 38200/39487/36223 40649/39490/36226 39859/39871/36603
+f 35920/39865/36597 35922/39870/36602 35927/39873/36605 35923/39874/36606
+f 35923/39874/36606 35927/39873/36605 38272/39875/36607 38273/39876/36608
+f 35922/39870/36602 39860/39872/36604 39861/39877/36609 35927/39873/36605
+f 35927/39873/36605 39861/39877/36609 40673/39878/36610 38272/39875/36607
+f 35920/39865/36597 35923/39874/36606 35928/39879/36611 35924/39866/36598
+f 35924/39866/36598 35928/39879/36611 39858/39861/36593 39857/39856/36588
+f 35923/39874/36606 38273/39876/36608 38274/39880/36612 35928/39879/36611
+f 35928/39879/36611 38274/39880/36612 40672/39862/36594 39858/39861/36593
+f 35929/39881/36613 35933/39882/36614 35934/39883/36615 35930/39884/36616
+f 35930/39884/36616 35934/39883/36615 38205/39508/36244 38204/39504/36240
+f 35933/39882/36614 39860/39872/36604 39859/39871/36603 35934/39883/36615
+f 35934/39883/36615 39859/39871/36603 40649/39490/36226 38205/39508/36244
+f 35929/39881/36613 35930/39884/36616 35935/39885/36617 35931/39886/36618
+f 35931/39886/36618 35935/39885/36617 39862/39887/36619 39863/39888/36620
+f 35930/39884/36616 38204/39504/36240 38203/39503/36239 35935/39885/36617
+f 35935/39885/36617 38203/39503/36239 40650/39506/36242 39862/39887/36619
+f 35929/39881/36613 35931/39886/36618 35936/39889/36621 35932/39890/36622
+f 35932/39890/36622 35936/39889/36621 38275/39891/36623 38276/39892/36624
+f 35931/39886/36618 39863/39888/36620 39864/39893/36625 35936/39889/36621
+f 35936/39889/36621 39864/39893/36625 40674/39894/36626 38275/39891/36623
+f 35929/39881/36613 35932/39890/36622 35937/39895/36627 35933/39882/36614
+f 35933/39882/36614 35937/39895/36627 39861/39877/36609 39860/39872/36604
+f 35932/39890/36622 38276/39892/36624 38277/39896/36628 35937/39895/36627
+f 35937/39895/36627 38277/39896/36628 40673/39878/36610 39861/39877/36609
+f 35938/39897/36629 35942/39898/36630 35943/39899/36631 35939/39900/36632
+f 35939/39900/36632 35943/39899/36631 38208/39524/36260 38207/39520/36256
+f 35942/39898/36630 39863/39888/36620 39862/39887/36619 35943/39899/36631
+f 35943/39899/36631 39862/39887/36619 40650/39506/36242 38208/39524/36260
+f 35938/39897/36629 35939/39900/36632 35944/39901/36633 35940/39902/36634
+f 35940/39902/36634 35944/39901/36633 39865/39903/36635 39866/39904/36636
+f 35939/39900/36632 38207/39520/36256 38206/39519/36255 35944/39901/36633
+f 35944/39901/36633 38206/39519/36255 40651/39522/36258 39865/39903/36635
+f 35938/39897/36629 35940/39902/36634 35945/39905/36637 35941/39906/36638
+f 35941/39906/36638 35945/39905/36637 38278/39907/36639 38279/39908/36640
+f 35940/39902/36634 39866/39904/36636 39867/39909/36641 35945/39905/36637
+f 35945/39905/36637 39867/39909/36641 40675/39910/36642 38278/39907/36639
+f 35938/39897/36629 35941/39906/36638 35946/39911/36643 35942/39898/36630
+f 35942/39898/36630 35946/39911/36643 39864/39893/36625 39863/39888/36620
+f 35941/39906/36638 38279/39908/36640 38280/39912/36644 35946/39911/36643
+f 35946/39911/36643 38280/39912/36644 40674/39894/36626 39864/39893/36625
+f 35947/39913/36645 35951/39914/36646 35952/39915/36647 35948/39916/36648
+f 35948/39916/36648 35952/39915/36647 38211/39540/36276 38210/39536/36272
+f 35951/39914/36646 39866/39904/36636 39865/39903/36635 35952/39915/36647
+f 35952/39915/36647 39865/39903/36635 40651/39522/36258 38211/39540/36276
+f 35947/39913/36645 35948/39916/36648 35953/39917/36649 35949/39918/36650
+f 35949/39918/36650 35953/39917/36649 39868/39919/36651 39869/39920/36652
+f 35948/39916/36648 38210/39536/36272 38209/39535/36271 35953/39917/36649
+f 35953/39917/36649 38209/39535/36271 40652/39538/36274 39868/39919/36651
+f 35947/39913/36645 35949/39918/36650 35954/39921/36653 35950/39922/36654
+f 35950/39922/36654 35954/39921/36653 38281/39923/36655 38282/39924/36656
+f 35949/39918/36650 39869/39920/36652 39870/39925/36657 35954/39921/36653
+f 35954/39921/36653 39870/39925/36657 40676/39926/36658 38281/39923/36655
+f 35947/39913/36645 35950/39922/36654 35955/39927/36659 35951/39914/36646
+f 35951/39914/36646 35955/39927/36659 39867/39909/36641 39866/39904/36636
+f 35950/39922/36654 38282/39924/36656 38283/39928/36660 35955/39927/36659
+f 35955/39927/36659 38283/39928/36660 40675/39910/36642 39867/39909/36641
+f 35956/39929/36661 35960/39930/36662 35961/39931/36663 35957/39932/36664
+f 35957/39932/36664 35961/39931/36663 38214/39556/36292 38213/39552/36288
+f 35960/39930/36662 39869/39920/36652 39868/39919/36651 35961/39931/36663
+f 35961/39931/36663 39868/39919/36651 40652/39538/36274 38214/39556/36292
+f 35956/39929/36661 35957/39932/36664 35962/39933/36665 35958/39934/36666
+f 35958/39934/36666 35962/39933/36665 39871/39935/36667 39872/39936/36668
+f 35957/39932/36664 38213/39552/36288 38212/39551/36287 35962/39933/36665
+f 35962/39933/36665 38212/39551/36287 40653/39554/36290 39871/39935/36667
+f 35956/39929/36661 35958/39934/36666 35963/39937/36669 35959/39938/36670
+f 35959/39938/36670 35963/39937/36669 38284/39939/36671 38285/39940/36672
+f 35958/39934/36666 39872/39936/36668 39873/39941/36673 35963/39937/36669
+f 35963/39937/36669 39873/39941/36673 40677/39942/36674 38284/39939/36671
+f 35956/39929/36661 35959/39938/36670 35964/39943/36675 35960/39930/36662
+f 35960/39930/36662 35964/39943/36675 39870/39925/36657 39869/39920/36652
+f 35959/39938/36670 38285/39940/36672 38286/39944/36676 35964/39943/36675
+f 35964/39943/36675 38286/39944/36676 40676/39926/36658 39870/39925/36657
+f 35965/39945/36677 35969/39946/36678 35970/39947/36679 35966/39948/36680
+f 35966/39948/36680 35970/39947/36679 38217/39572/36308 38216/39568/36304
+f 35969/39946/36678 39872/39936/36668 39871/39935/36667 35970/39947/36679
+f 35970/39947/36679 39871/39935/36667 40653/39554/36290 38217/39572/36308
+f 35965/39945/36677 35966/39948/36680 35971/39949/36681 35967/39950/36682
+f 35967/39950/36682 35971/39949/36681 39874/39951/36683 39875/39952/36684
+f 35966/39948/36680 38216/39568/36304 38215/39567/36303 35971/39949/36681
+f 35971/39949/36681 38215/39567/36303 40654/39570/36306 39874/39951/36683
+f 35965/39945/36677 35967/39950/36682 35972/39953/36685 35968/39954/36686
+f 35968/39954/36686 35972/39953/36685 38287/39955/36687 38288/39956/36688
+f 35967/39950/36682 39875/39952/36684 39876/39957/36689 35972/39953/36685
+f 35972/39953/36685 39876/39957/36689 40678/39958/36690 38287/39955/36687
+f 35965/39945/36677 35968/39954/36686 35973/39959/36691 35969/39946/36678
+f 35969/39946/36678 35973/39959/36691 39873/39941/36673 39872/39936/36668
+f 35968/39954/36686 38288/39956/36688 38289/39960/36692 35973/39959/36691
+f 35973/39959/36691 38289/39960/36692 40677/39942/36674 39873/39941/36673
+f 35974/39961/36693 35978/39962/36694 35979/39963/36695 35975/39964/36696
+f 35975/39964/36696 35979/39963/36695 38220/39588/36324 38219/39584/36320
+f 35978/39962/36694 39875/39952/36684 39874/39951/36683 35979/39963/36695
+f 35979/39963/36695 39874/39951/36683 40654/39570/36306 38220/39588/36324
+f 35974/39961/36693 35975/39964/36696 35980/39965/36697 35976/39966/36698
+f 35976/39966/36698 35980/39965/36697 39877/39967/36699 39878/39968/36700
+f 35975/39964/36696 38219/39584/36320 38218/39583/36319 35980/39965/36697
+f 35980/39965/36697 38218/39583/36319 40655/39586/36322 39877/39967/36699
+f 35974/39961/36693 35976/39966/36698 35981/39969/36701 35977/39970/36702
+f 35977/39970/36702 35981/39969/36701 38290/39971/36703 38291/39972/36704
+f 35976/39966/36698 39878/39968/36700 39879/39973/36705 35981/39969/36701
+f 35981/39969/36701 39879/39973/36705 40679/39974/36706 38290/39971/36703
+f 35974/39961/36693 35977/39970/36702 35982/39975/36707 35978/39962/36694
+f 35978/39962/36694 35982/39975/36707 39876/39957/36689 39875/39952/36684
+f 35977/39970/36702 38291/39972/36704 38292/39976/36708 35982/39975/36707
+f 35982/39975/36707 38292/39976/36708 40678/39958/36690 39876/39957/36689
+f 35983/39977/36709 35987/39978/36710 35988/39979/36711 35984/39980/36712
+f 35984/39980/36712 35988/39979/36711 38223/39604/36340 38222/39600/36336
+f 35987/39978/36710 39878/39968/36700 39877/39967/36699 35988/39979/36711
+f 35988/39979/36711 39877/39967/36699 40655/39586/36322 38223/39604/36340
+f 35983/39977/36709 35984/39980/36712 35989/39981/36713 35985/39982/36714
+f 35985/39982/36714 35989/39981/36713 39880/39983/36715 39881/39984/36716
+f 35984/39980/36712 38222/39600/36336 38221/39599/36335 35989/39981/36713
+f 35989/39981/36713 38221/39599/36335 40656/39602/36338 39880/39983/36715
+f 35983/39977/36709 35985/39982/36714 35990/39985/36717 35986/39986/36718
+f 35986/39986/36718 35990/39985/36717 38293/39987/36719 38294/39988/36720
+f 35985/39982/36714 39881/39984/36716 39882/39989/36721 35990/39985/36717
+f 35990/39985/36717 39882/39989/36721 40680/39990/36722 38293/39987/36719
+f 35983/39977/36709 35986/39986/36718 35991/39991/36723 35987/39978/36710
+f 35987/39978/36710 35991/39991/36723 39879/39973/36705 39878/39968/36700
+f 35986/39986/36718 38294/39988/36720 38295/39992/36724 35991/39991/36723
+f 35991/39991/36723 38295/39992/36724 40679/39974/36706 39879/39973/36705
+f 35992/39993/36725 35996/39994/36726 35997/39995/36727 35993/39996/36728
+f 35993/39996/36728 35997/39995/36727 38226/39620/36356 38225/39616/36352
+f 35996/39994/36726 39881/39984/36716 39880/39983/36715 35997/39995/36727
+f 35997/39995/36727 39880/39983/36715 40656/39602/36338 38226/39620/36356
+f 35992/39993/36725 35993/39996/36728 35998/39997/36729 35994/39998/36730
+f 35994/39998/36730 35998/39997/36729 39883/39999/36731 39884/40000/36732
+f 35993/39996/36728 38225/39616/36352 38224/39615/36351 35998/39997/36729
+f 35998/39997/36729 38224/39615/36351 40657/39618/36354 39883/39999/36731
+f 35992/39993/36725 35994/39998/36730 35999/40001/36733 35995/40002/36734
+f 35995/40002/36734 35999/40001/36733 38296/40003/36735 38297/40004/36736
+f 35994/39998/36730 39884/40000/36732 39885/40005/36737 35999/40001/36733
+f 35999/40001/36733 39885/40005/36737 40681/40006/36738 38296/40003/36735
+f 35992/39993/36725 35995/40002/36734 36000/40007/36739 35996/39994/36726
+f 35996/39994/36726 36000/40007/36739 39882/39989/36721 39881/39984/36716
+f 35995/40002/36734 38297/40004/36736 38298/40008/36740 36000/40007/36739
+f 36000/40007/36739 38298/40008/36740 40680/39990/36722 39882/39989/36721
+f 36001/40009/36741 36005/40010/36742 36006/40011/36743 36002/40012/36744
+f 36002/40012/36744 36006/40011/36743 38229/39636/36372 38228/39632/36368
+f 36005/40010/36742 39884/40000/36732 39883/39999/36731 36006/40011/36743
+f 36006/40011/36743 39883/39999/36731 40657/39618/36354 38229/39636/36372
+f 36001/40009/36741 36002/40012/36744 36007/40013/36745 36003/40014/36746
+f 36003/40014/36746 36007/40013/36745 39886/40015/36747 39887/40016/36748
+f 36002/40012/36744 38228/39632/36368 38227/39631/36367 36007/40013/36745
+f 36007/40013/36745 38227/39631/36367 40658/39634/36370 39886/40015/36747
+f 36001/40009/36741 36003/40014/36746 36008/40017/36749 36004/40018/36750
+f 36004/40018/36750 36008/40017/36749 38299/40019/36751 38300/40020/36752
+f 36003/40014/36746 39887/40016/36748 39888/40021/36753 36008/40017/36749
+f 36008/40017/36749 39888/40021/36753 40682/40022/36754 38299/40019/36751
+f 36001/40009/36741 36004/40018/36750 36009/40023/36755 36005/40010/36742
+f 36005/40010/36742 36009/40023/36755 39885/40005/36737 39884/40000/36732
+f 36004/40018/36750 38300/40020/36752 38301/40024/36756 36009/40023/36755
+f 36009/40023/36755 38301/40024/36756 40681/40006/36738 39885/40005/36737
+f 36010/40025/36757 36014/40026/36758 36015/40027/36759 36011/40028/36760
+f 36011/40028/36760 36015/40027/36759 38232/39652/36388 38231/39648/36384
+f 36014/40026/36758 39887/40016/36748 39886/40015/36747 36015/40027/36759
+f 36015/40027/36759 39886/40015/36747 40658/39634/36370 38232/39652/36388
+f 36010/40025/36757 36011/40028/36760 36016/40029/36761 36012/40030/36762
+f 36012/40030/36762 36016/40029/36761 39889/40031/36763 39890/40032/36764
+f 36011/40028/36760 38231/39648/36384 38230/39647/36383 36016/40029/36761
+f 36016/40029/36761 38230/39647/36383 40659/39650/36386 39889/40031/36763
+f 36010/40025/36757 36012/40030/36762 36017/40033/36765 36013/40034/36766
+f 36013/40034/36766 36017/40033/36765 38302/40035/36767 38303/40036/36768
+f 36012/40030/36762 39890/40032/36764 39891/40037/36769 36017/40033/36765
+f 36017/40033/36765 39891/40037/36769 40683/40038/36770 38302/40035/36767
+f 36010/40025/36757 36013/40034/36766 36018/40039/36771 36014/40026/36758
+f 36014/40026/36758 36018/40039/36771 39888/40021/36753 39887/40016/36748
+f 36013/40034/36766 38303/40036/36768 38304/40040/36772 36018/40039/36771
+f 36018/40039/36771 38304/40040/36772 40682/40022/36754 39888/40021/36753
+f 36019/40041/36773 36023/40042/36774 36024/40043/36775 36020/40044/36776
+f 36020/40044/36776 36024/40043/36775 38235/39668/36400 38234/39664/36398
+f 36023/40042/36774 39890/40032/36764 39889/40031/36763 36024/40043/36775
+f 36024/40043/36775 39889/40031/36763 40659/39650/36386 38235/39668/36400
+f 36019/40041/36773 36020/40044/36776 36025/40045/36777 36021/40046/36778
+f 36021/40046/36778 36025/40045/36777 39822/40047/36406 39821/40048/36405
+f 36020/40044/36776 38234/39664/36398 38233/39663/36397 36025/40045/36777
+f 36025/40045/36777 38233/39663/36397 40636/39666/36036 39822/40047/36406
+f 36019/40041/36773 36021/40046/36778 36026/40049/36779 36022/40050/36780
+f 36022/40050/36780 36026/40049/36779 38305/40051/36781 38306/40052/36782
+f 36021/40046/36778 39821/40048/36405 39820/40053/36418 36026/40049/36779
+f 36026/40049/36779 39820/40053/36418 40660/40054/36420 38305/40051/36781
+f 36019/40041/36773 36022/40050/36780 36027/40055/36783 36023/40042/36774
+f 36023/40042/36774 36027/40055/36783 39891/40037/36769 39890/40032/36764
+f 36022/40050/36780 38306/40052/36782 38307/40056/36784 36027/40055/36783
+f 36027/40055/36783 38307/40056/36784 40683/40038/36770 39891/40037/36769
+f 36028/40057/36785 36032/40058/36786 36033/40059/36787 36029/40060/36788
+f 36029/40060/36788 36033/40059/36787 38238/39687/36419 38237/39682/36414
+f 36032/40058/36786 39893/40061/36789 39894/40062/36790 36033/40059/36787
+f 36033/40059/36787 39894/40062/36790 40660/39688/36420 38238/39687/36419
+f 36028/40057/36785 36029/40060/36788 36034/40063/36791 36030/40064/36792
+f 36030/40064/36792 36034/40063/36791 39895/40065/36793 39896/40066/36794
+f 36029/40060/36788 38237/39682/36414 38236/39681/36413 36034/40063/36791
+f 36034/40063/36791 38236/39681/36413 40661/39684/36416 39895/40065/36793
+f 36028/40057/36785 36030/40064/36792 36035/40067/36795 36031/40068/36796
+f 36031/40068/36796 36035/40067/36795 38308/40069/36797 38309/40070/36798
+f 36030/40064/36792 39896/40066/36794 39897/40071/36799 36035/40067/36795
+f 36035/40067/36795 39897/40071/36799 40685/40072/36800 38308/40069/36797
+f 36028/40057/36785 36031/40068/36796 36036/40073/36801 36032/40058/36786
+f 36032/40058/36786 36036/40073/36801 39892/40074/36802 39893/40061/36789
+f 36031/40068/36796 38309/40070/36798 38310/40075/36803 36036/40073/36801
+f 36036/40073/36801 38310/40075/36803 40684/40076/36804 39892/40074/36802
+f 36037/40077/36805 36041/40078/36806 36042/40079/36807 36038/40080/36808
+f 36038/40080/36808 36042/40079/36807 38241/39704/36436 38240/39700/36432
+f 36041/40078/36806 39896/40066/36794 39895/40065/36793 36042/40079/36807
+f 36042/40079/36807 39895/40065/36793 40661/39684/36416 38241/39704/36436
+f 36037/40077/36805 36038/40080/36808 36043/40081/36809 36039/40082/36810
+f 36039/40082/36810 36043/40081/36809 39898/40083/36811 39899/40084/36812
+f 36038/40080/36808 38240/39700/36432 38239/39699/36431 36043/40081/36809
+f 36043/40081/36809 38239/39699/36431 40662/39702/36434 39898/40083/36811
+f 36037/40077/36805 36039/40082/36810 36044/40085/36813 36040/40086/36814
+f 36040/40086/36814 36044/40085/36813 38311/40087/36815 38312/40088/36816
+f 36039/40082/36810 39899/40084/36812 39900/40089/36817 36044/40085/36813
+f 36044/40085/36813 39900/40089/36817 40686/40090/36818 38311/40087/36815
+f 36037/40077/36805 36040/40086/36814 36045/40091/36819 36041/40078/36806
+f 36041/40078/36806 36045/40091/36819 39897/40071/36799 39896/40066/36794
+f 36040/40086/36814 38312/40088/36816 38313/40092/36820 36045/40091/36819
+f 36045/40091/36819 38313/40092/36820 40685/40072/36800 39897/40071/36799
+f 36046/40093/36821 36050/40094/36822 36051/40095/36823 36047/40096/36824
+f 36047/40096/36824 36051/40095/36823 38244/39720/36452 38243/39716/36448
+f 36050/40094/36822 39899/40084/36812 39898/40083/36811 36051/40095/36823
+f 36051/40095/36823 39898/40083/36811 40662/39702/36434 38244/39720/36452
+f 36046/40093/36821 36047/40096/36824 36052/40097/36825 36048/40098/36826
+f 36048/40098/36826 36052/40097/36825 39901/40099/36827 39902/40100/36828
+f 36047/40096/36824 38243/39716/36448 38242/39715/36447 36052/40097/36825
+f 36052/40097/36825 38242/39715/36447 40663/39718/36450 39901/40099/36827
+f 36046/40093/36821 36048/40098/36826 36053/40101/36829 36049/40102/36830
+f 36049/40102/36830 36053/40101/36829 38314/40103/36831 38315/40104/36832
+f 36048/40098/36826 39902/40100/36828 39903/40105/36833 36053/40101/36829
+f 36053/40101/36829 39903/40105/36833 40687/40106/36834 38314/40103/36831
+f 36046/40093/36821 36049/40102/36830 36054/40107/36835 36050/40094/36822
+f 36050/40094/36822 36054/40107/36835 39900/40089/36817 39899/40084/36812
+f 36049/40102/36830 38315/40104/36832 38316/40108/36836 36054/40107/36835
+f 36054/40107/36835 38316/40108/36836 40686/40090/36818 39900/40089/36817
+f 36055/40109/36837 36059/40110/36838 36060/40111/36839 36056/40112/36840
+f 36056/40112/36840 36060/40111/36839 38247/39736/36468 38246/39732/36464
+f 36059/40110/36838 39902/40100/36828 39901/40099/36827 36060/40111/36839
+f 36060/40111/36839 39901/40099/36827 40663/39718/36450 38247/39736/36468
+f 36055/40109/36837 36056/40112/36840 36061/40113/36841 36057/40114/36842
+f 36057/40114/36842 36061/40113/36841 39904/40115/36843 39905/40116/36844
+f 36056/40112/36840 38246/39732/36464 38245/39731/36463 36061/40113/36841
+f 36061/40113/36841 38245/39731/36463 40664/39734/36466 39904/40115/36843
+f 36055/40109/36837 36057/40114/36842 36062/40117/36845 36058/40118/36846
+f 36058/40118/36846 36062/40117/36845 38317/40119/36847 38318/40120/36848
+f 36057/40114/36842 39905/40116/36844 39906/40121/36849 36062/40117/36845
+f 36062/40117/36845 39906/40121/36849 40688/40122/36850 38317/40119/36847
+f 36055/40109/36837 36058/40118/36846 36063/40123/36851 36059/40110/36838
+f 36059/40110/36838 36063/40123/36851 39903/40105/36833 39902/40100/36828
+f 36058/40118/36846 38318/40120/36848 38319/40124/36852 36063/40123/36851
+f 36063/40123/36851 38319/40124/36852 40687/40106/36834 39903/40105/36833
+f 36064/40125/36853 36068/40126/36854 36069/40127/36855 36065/40128/36856
+f 36065/40128/36856 36069/40127/36855 38250/39752/36484 38249/39748/36480
+f 36068/40126/36854 39905/40116/36844 39904/40115/36843 36069/40127/36855
+f 36069/40127/36855 39904/40115/36843 40664/39734/36466 38250/39752/36484
+f 36064/40125/36853 36065/40128/36856 36070/40129/36857 36066/40130/36858
+f 36066/40130/36858 36070/40129/36857 39907/40131/36859 39908/40132/36860
+f 36065/40128/36856 38249/39748/36480 38248/39747/36479 36070/40129/36857
+f 36070/40129/36857 38248/39747/36479 40665/39750/36482 39907/40131/36859
+f 36064/40125/36853 36066/40130/36858 36071/40133/36861 36067/40134/36862
+f 36067/40134/36862 36071/40133/36861 38320/40135/36863 38321/40136/36864
+f 36066/40130/36858 39908/40132/36860 39909/40137/36865 36071/40133/36861
+f 36071/40133/36861 39909/40137/36865 40689/40138/36866 38320/40135/36863
+f 36064/40125/36853 36067/40134/36862 36072/40139/36867 36068/40126/36854
+f 36068/40126/36854 36072/40139/36867 39906/40121/36849 39905/40116/36844
+f 36067/40134/36862 38321/40136/36864 38322/40140/36868 36072/40139/36867
+f 36072/40139/36867 38322/40140/36868 40688/40122/36850 39906/40121/36849
+f 36073/40141/36869 36077/40142/36870 36078/40143/36871 36074/40144/36872
+f 36074/40144/36872 36078/40143/36871 38253/39768/36500 38252/39764/36496
+f 36077/40142/36870 39908/40132/36860 39907/40131/36859 36078/40143/36871
+f 36078/40143/36871 39907/40131/36859 40665/39750/36482 38253/39768/36500
+f 36073/40141/36869 36074/40144/36872 36079/40145/36873 36075/40146/36874
+f 36075/40146/36874 36079/40145/36873 39910/40147/36875 39911/40148/36876
+f 36074/40144/36872 38252/39764/36496 38251/39763/36495 36079/40145/36873
+f 36079/40145/36873 38251/39763/36495 40666/39766/36498 39910/40147/36875
+f 36073/40141/36869 36075/40146/36874 36080/40149/36877 36076/40150/36878
+f 36076/40150/36878 36080/40149/36877 38323/40151/36879 38324/40152/36880
+f 36075/40146/36874 39911/40148/36876 39912/40153/36881 36080/40149/36877
+f 36080/40149/36877 39912/40153/36881 40690/40154/36882 38323/40151/36879
+f 36073/40141/36869 36076/40150/36878 36081/40155/36883 36077/40142/36870
+f 36077/40142/36870 36081/40155/36883 39909/40137/36865 39908/40132/36860
+f 36076/40150/36878 38324/40152/36880 38325/40156/36884 36081/40155/36883
+f 36081/40155/36883 38325/40156/36884 40689/40138/36866 39909/40137/36865
+f 36082/40157/36885 36086/40158/36886 36087/40159/36887 36083/40160/36888
+f 36083/40160/36888 36087/40159/36887 38256/39784/36516 38255/39780/36512
+f 36086/40158/36886 39911/40148/36876 39910/40147/36875 36087/40159/36887
+f 36087/40159/36887 39910/40147/36875 40666/39766/36498 38256/39784/36516
+f 36082/40157/36885 36083/40160/36888 36088/40161/36889 36084/40162/36890
+f 36084/40162/36890 36088/40161/36889 39913/40163/36891 39914/40164/36892
+f 36083/40160/36888 38255/39780/36512 38254/39779/36511 36088/40161/36889
+f 36088/40161/36889 38254/39779/36511 40667/39782/36514 39913/40163/36891
+f 36082/40157/36885 36084/40162/36890 36089/40165/36893 36085/40166/36894
+f 36085/40166/36894 36089/40165/36893 38326/40167/36895 38327/40168/36896
+f 36084/40162/36890 39914/40164/36892 39915/40169/36897 36089/40165/36893
+f 36089/40165/36893 39915/40169/36897 40691/40170/36898 38326/40167/36895
+f 36082/40157/36885 36085/40166/36894 36090/40171/36899 36086/40158/36886
+f 36086/40158/36886 36090/40171/36899 39912/40153/36881 39911/40148/36876
+f 36085/40166/36894 38327/40168/36896 38328/40172/36900 36090/40171/36899
+f 36090/40171/36899 38328/40172/36900 40690/40154/36882 39912/40153/36881
+f 36091/40173/36901 36095/40174/36902 36096/40175/36903 36092/40176/36904
+f 36092/40176/36904 36096/40175/36903 38259/39800/36532 38258/39796/36528
+f 36095/40174/36902 39914/40164/36892 39913/40163/36891 36096/40175/36903
+f 36096/40175/36903 39913/40163/36891 40667/39782/36514 38259/39800/36532
+f 36091/40173/36901 36092/40176/36904 36097/40177/36905 36093/40178/36906
+f 36093/40178/36906 36097/40177/36905 39916/40179/36907 39917/40180/36908
+f 36092/40176/36904 38258/39796/36528 38257/39795/36527 36097/40177/36905
+f 36097/40177/36905 38257/39795/36527 40668/39798/36530 39916/40179/36907
+f 36091/40173/36901 36093/40178/36906 36098/40181/36909 36094/40182/36910
+f 36094/40182/36910 36098/40181/36909 38329/40183/36911 38330/40184/36912
+f 36093/40178/36906 39917/40180/36908 39918/40185/36913 36098/40181/36909
+f 36098/40181/36909 39918/40185/36913 40692/40186/36914 38329/40183/36911
+f 36091/40173/36901 36094/40182/36910 36099/40187/36915 36095/40174/36902
+f 36095/40174/36902 36099/40187/36915 39915/40169/36897 39914/40164/36892
+f 36094/40182/36910 38330/40184/36912 38331/40188/36916 36099/40187/36915
+f 36099/40187/36915 38331/40188/36916 40691/40170/36898 39915/40169/36897
+f 36100/40189/36917 36104/40190/36918 36105/40191/36919 36101/40192/36920
+f 36101/40192/36920 36105/40191/36919 38262/39816/36548 38261/39812/36544
+f 36104/40190/36918 39917/40180/36908 39916/40179/36907 36105/40191/36919
+f 36105/40191/36919 39916/40179/36907 40668/39798/36530 38262/39816/36548
+f 36100/40189/36917 36101/40192/36920 36106/40193/36921 36102/40194/36922
+f 36102/40194/36922 36106/40193/36921 39919/40195/36923 39920/40196/36924
+f 36101/40192/36920 38261/39812/36544 38260/39811/36543 36106/40193/36921
+f 36106/40193/36921 38260/39811/36543 40669/39814/36546 39919/40195/36923
+f 36100/40189/36917 36102/40194/36922 36107/40197/36925 36103/40198/36926
+f 36103/40198/36926 36107/40197/36925 38332/40199/36927 38333/40200/36928
+f 36102/40194/36922 39920/40196/36924 39921/40201/36929 36107/40197/36925
+f 36107/40197/36925 39921/40201/36929 40693/40202/36930 38332/40199/36927
+f 36100/40189/36917 36103/40198/36926 36108/40203/36931 36104/40190/36918
+f 36104/40190/36918 36108/40203/36931 39918/40185/36913 39917/40180/36908
+f 36103/40198/36926 38333/40200/36928 38334/40204/36932 36108/40203/36931
+f 36108/40203/36931 38334/40204/36932 40692/40186/36914 39918/40185/36913
+f 36109/40205/36933 36113/40206/36934 36114/40207/36935 36110/40208/36936
+f 36110/40208/36936 36114/40207/36935 38265/39832/36564 38264/39828/36560
+f 36113/40206/36934 39920/40196/36924 39919/40195/36923 36114/40207/36935
+f 36114/40207/36935 39919/40195/36923 40669/39814/36546 38265/39832/36564
+f 36109/40205/36933 36110/40208/36936 36115/40209/36937 36111/40210/36938
+f 36111/40210/36938 36115/40209/36937 39922/40211/36939 39923/40212/36940
+f 36110/40208/36936 38264/39828/36560 38263/39827/36559 36115/40209/36937
+f 36115/40209/36937 38263/39827/36559 40670/39830/36562 39922/40211/36939
+f 36109/40205/36933 36111/40210/36938 36116/40213/36941 36112/40214/36942
+f 36112/40214/36942 36116/40213/36941 38335/40215/36943 38336/40216/36944
+f 36111/40210/36938 39923/40212/36940 39924/40217/36945 36116/40213/36941
+f 36116/40213/36941 39924/40217/36945 40694/40218/36946 38335/40215/36943
+f 36109/40205/36933 36112/40214/36942 36117/40219/36947 36113/40206/36934
+f 36113/40206/36934 36117/40219/36947 39921/40201/36929 39920/40196/36924
+f 36112/40214/36942 38336/40216/36944 38337/40220/36948 36117/40219/36947
+f 36117/40219/36947 38337/40220/36948 40693/40202/36930 39921/40201/36929
+f 36118/40221/36949 36122/40222/36950 36123/40223/36951 36119/40224/36952
+f 36119/40224/36952 36123/40223/36951 38268/39848/36580 38267/39844/36576
+f 36122/40222/36950 39923/40212/36940 39922/40211/36939 36123/40223/36951
+f 36123/40223/36951 39922/40211/36939 40670/39830/36562 38268/39848/36580
+f 36118/40221/36949 36119/40224/36952 36124/40225/36953 36120/40226/36954
+f 36120/40226/36954 36124/40225/36953 39925/40227/36955 39926/40228/36956
+f 36119/40224/36952 38267/39844/36576 38266/39843/36575 36124/40225/36953
+f 36124/40225/36953 38266/39843/36575 40671/39846/36578 39925/40227/36955
+f 36118/40221/36949 36120/40226/36954 36125/40229/36957 36121/40230/36958
+f 36121/40230/36958 36125/40229/36957 38338/40231/36959 38339/40232/36960
+f 36120/40226/36954 39926/40228/36956 39927/40233/36961 36125/40229/36957
+f 36125/40229/36957 39927/40233/36961 40695/40234/36962 38338/40231/36959
+f 36118/40221/36949 36121/40230/36958 36126/40235/36963 36122/40222/36950
+f 36122/40222/36950 36126/40235/36963 39924/40217/36945 39923/40212/36940
+f 36121/40230/36958 38339/40232/36960 38340/40236/36964 36126/40235/36963
+f 36126/40235/36963 38340/40236/36964 40694/40218/36946 39924/40217/36945
+f 36127/40237/36965 36131/40238/36966 36132/40239/36967 36128/40240/36968
+f 36128/40240/36968 36132/40239/36967 38271/39864/36596 38270/39860/36592
+f 36131/40238/36966 39926/40228/36956 39925/40227/36955 36132/40239/36967
+f 36132/40239/36967 39925/40227/36955 40671/39846/36578 38271/39864/36596
+f 36127/40237/36965 36128/40240/36968 36133/40241/36969 36129/40242/36970
+f 36129/40242/36970 36133/40241/36969 39928/40243/36971 39929/40244/36972
+f 36128/40240/36968 38270/39860/36592 38269/39859/36591 36133/40241/36969
+f 36133/40241/36969 38269/39859/36591 40672/39862/36594 39928/40243/36971
+f 36127/40237/36965 36129/40242/36970 36134/40245/36973 36130/40246/36974
+f 36130/40246/36974 36134/40245/36973 38341/40247/36975 38342/40248/36976
+f 36129/40242/36970 39929/40244/36972 39930/40249/36977 36134/40245/36973
+f 36134/40245/36973 39930/40249/36977 40696/40250/36978 38341/40247/36975
+f 36127/40237/36965 36130/40246/36974 36135/40251/36979 36131/40238/36966
+f 36131/40238/36966 36135/40251/36979 39927/40233/36961 39926/40228/36956
+f 36130/40246/36974 38342/40248/36976 38343/40252/36980 36135/40251/36979
+f 36135/40251/36979 38343/40252/36980 40695/40234/36962 39927/40233/36961
+f 36136/40253/36981 36140/40254/36982 36141/40255/36983 36137/40256/36984
+f 36137/40256/36984 36141/40255/36983 38274/39880/36612 38273/39876/36608
+f 36140/40254/36982 39929/40244/36972 39928/40243/36971 36141/40255/36983
+f 36141/40255/36983 39928/40243/36971 40672/39862/36594 38274/39880/36612
+f 36136/40253/36981 36137/40256/36984 36142/40257/36985 36138/40258/36986
+f 36138/40258/36986 36142/40257/36985 39931/40259/36987 39932/40260/36988
+f 36137/40256/36984 38273/39876/36608 38272/39875/36607 36142/40257/36985
+f 36142/40257/36985 38272/39875/36607 40673/39878/36610 39931/40259/36987
+f 36136/40253/36981 36138/40258/36986 36143/40261/36989 36139/40262/36990
+f 36139/40262/36990 36143/40261/36989 38344/40263/36991 38345/40264/36992
+f 36138/40258/36986 39932/40260/36988 39933/40265/36993 36143/40261/36989
+f 36143/40261/36989 39933/40265/36993 40697/40266/36994 38344/40263/36991
+f 36136/40253/36981 36139/40262/36990 36144/40267/36995 36140/40254/36982
+f 36140/40254/36982 36144/40267/36995 39930/40249/36977 39929/40244/36972
+f 36139/40262/36990 38345/40264/36992 38346/40268/36996 36144/40267/36995
+f 36144/40267/36995 38346/40268/36996 40696/40250/36978 39930/40249/36977
+f 36145/40269/36997 36149/40270/36998 36150/40271/36999 36146/40272/37000
+f 36146/40272/37000 36150/40271/36999 38277/39896/36628 38276/39892/36624
+f 36149/40270/36998 39932/40260/36988 39931/40259/36987 36150/40271/36999
+f 36150/40271/36999 39931/40259/36987 40673/39878/36610 38277/39896/36628
+f 36145/40269/36997 36146/40272/37000 36151/40273/37001 36147/40274/37002
+f 36147/40274/37002 36151/40273/37001 39934/40275/37003 39935/40276/37004
+f 36146/40272/37000 38276/39892/36624 38275/39891/36623 36151/40273/37001
+f 36151/40273/37001 38275/39891/36623 40674/39894/36626 39934/40275/37003
+f 36145/40269/36997 36147/40274/37002 36152/40277/37005 36148/40278/37006
+f 36148/40278/37006 36152/40277/37005 38347/40279/37007 38348/40280/37008
+f 36147/40274/37002 39935/40276/37004 39936/40281/37009 36152/40277/37005
+f 36152/40277/37005 39936/40281/37009 40698/40282/37010 38347/40279/37007
+f 36145/40269/36997 36148/40278/37006 36153/40283/37011 36149/40270/36998
+f 36149/40270/36998 36153/40283/37011 39933/40265/36993 39932/40260/36988
+f 36148/40278/37006 38348/40280/37008 38349/40284/37012 36153/40283/37011
+f 36153/40283/37011 38349/40284/37012 40697/40266/36994 39933/40265/36993
+f 36154/40285/37013 36158/40286/37014 36159/40287/37015 36155/40288/37016
+f 36155/40288/37016 36159/40287/37015 38280/39912/36644 38279/39908/36640
+f 36158/40286/37014 39935/40276/37004 39934/40275/37003 36159/40287/37015
+f 36159/40287/37015 39934/40275/37003 40674/39894/36626 38280/39912/36644
+f 36154/40285/37013 36155/40288/37016 36160/40289/37017 36156/40290/37018
+f 36156/40290/37018 36160/40289/37017 39937/40291/37019 39938/40292/37020
+f 36155/40288/37016 38279/39908/36640 38278/39907/36639 36160/40289/37017
+f 36160/40289/37017 38278/39907/36639 40675/39910/36642 39937/40291/37019
+f 36154/40285/37013 36156/40290/37018 36161/40293/37021 36157/40294/37022
+f 36157/40294/37022 36161/40293/37021 38350/40295/37023 38351/40296/37024
+f 36156/40290/37018 39938/40292/37020 39939/40297/37025 36161/40293/37021
+f 36161/40293/37021 39939/40297/37025 40699/40298/37026 38350/40295/37023
+f 36154/40285/37013 36157/40294/37022 36162/40299/37027 36158/40286/37014
+f 36158/40286/37014 36162/40299/37027 39936/40281/37009 39935/40276/37004
+f 36157/40294/37022 38351/40296/37024 38352/40300/37028 36162/40299/37027
+f 36162/40299/37027 38352/40300/37028 40698/40282/37010 39936/40281/37009
+f 36163/40301/37029 36167/40302/37030 36168/40303/37031 36164/40304/37032
+f 36164/40304/37032 36168/40303/37031 38283/39928/36660 38282/39924/36656
+f 36167/40302/37030 39938/40292/37020 39937/40291/37019 36168/40303/37031
+f 36168/40303/37031 39937/40291/37019 40675/39910/36642 38283/39928/36660
+f 36163/40301/37029 36164/40304/37032 36169/40305/37033 36165/40306/37034
+f 36165/40306/37034 36169/40305/37033 39940/40307/37035 39941/40308/37036
+f 36164/40304/37032 38282/39924/36656 38281/39923/36655 36169/40305/37033
+f 36169/40305/37033 38281/39923/36655 40676/39926/36658 39940/40307/37035
+f 36163/40301/37029 36165/40306/37034 36170/40309/37037 36166/40310/37038
+f 36166/40310/37038 36170/40309/37037 38353/40311/37039 38354/40312/37040
+f 36165/40306/37034 39941/40308/37036 39942/40313/37041 36170/40309/37037
+f 36170/40309/37037 39942/40313/37041 40700/40314/37042 38353/40311/37039
+f 36163/40301/37029 36166/40310/37038 36171/40315/37043 36167/40302/37030
+f 36167/40302/37030 36171/40315/37043 39939/40297/37025 39938/40292/37020
+f 36166/40310/37038 38354/40312/37040 38355/40316/37044 36171/40315/37043
+f 36171/40315/37043 38355/40316/37044 40699/40298/37026 39939/40297/37025
+f 36172/40317/37045 36176/40318/37046 36177/40319/37047 36173/40320/37048
+f 36173/40320/37048 36177/40319/37047 38286/39944/36676 38285/39940/36672
+f 36176/40318/37046 39941/40308/37036 39940/40307/37035 36177/40319/37047
+f 36177/40319/37047 39940/40307/37035 40676/39926/36658 38286/39944/36676
+f 36172/40317/37045 36173/40320/37048 36178/40321/37049 36174/40322/37050
+f 36174/40322/37050 36178/40321/37049 39943/40323/37051 39944/40324/37052
+f 36173/40320/37048 38285/39940/36672 38284/39939/36671 36178/40321/37049
+f 36178/40321/37049 38284/39939/36671 40677/39942/36674 39943/40323/37051
+f 36172/40317/37045 36174/40322/37050 36179/40325/37053 36175/40326/37054
+f 36175/40326/37054 36179/40325/37053 38356/40327/37055 38357/40328/37056
+f 36174/40322/37050 39944/40324/37052 39945/40329/37057 36179/40325/37053
+f 36179/40325/37053 39945/40329/37057 40701/40330/37058 38356/40327/37055
+f 36172/40317/37045 36175/40326/37054 36180/40331/37059 36176/40318/37046
+f 36176/40318/37046 36180/40331/37059 39942/40313/37041 39941/40308/37036
+f 36175/40326/37054 38357/40328/37056 38358/40332/37060 36180/40331/37059
+f 36180/40331/37059 38358/40332/37060 40700/40314/37042 39942/40313/37041
+f 36181/40333/37061 36185/40334/37062 36186/40335/37063 36182/40336/37064
+f 36182/40336/37064 36186/40335/37063 38289/39960/36692 38288/39956/36688
+f 36185/40334/37062 39944/40324/37052 39943/40323/37051 36186/40335/37063
+f 36186/40335/37063 39943/40323/37051 40677/39942/36674 38289/39960/36692
+f 36181/40333/37061 36182/40336/37064 36187/40337/37065 36183/40338/37066
+f 36183/40338/37066 36187/40337/37065 39946/40339/37067 39947/40340/37068
+f 36182/40336/37064 38288/39956/36688 38287/39955/36687 36187/40337/37065
+f 36187/40337/37065 38287/39955/36687 40678/39958/36690 39946/40339/37067
+f 36181/40333/37061 36183/40338/37066 36188/40341/37069 36184/40342/37070
+f 36184/40342/37070 36188/40341/37069 38359/40343/37071 38360/40344/37072
+f 36183/40338/37066 39947/40340/37068 39948/40345/37073 36188/40341/37069
+f 36188/40341/37069 39948/40345/37073 40702/40346/37074 38359/40343/37071
+f 36181/40333/37061 36184/40342/37070 36189/40347/37075 36185/40334/37062
+f 36185/40334/37062 36189/40347/37075 39945/40329/37057 39944/40324/37052
+f 36184/40342/37070 38360/40344/37072 38361/40348/37076 36189/40347/37075
+f 36189/40347/37075 38361/40348/37076 40701/40330/37058 39945/40329/37057
+f 36190/40349/37077 36194/40350/37078 36195/40351/37079 36191/40352/37080
+f 36191/40352/37080 36195/40351/37079 38292/39976/36708 38291/39972/36704
+f 36194/40350/37078 39947/40340/37068 39946/40339/37067 36195/40351/37079
+f 36195/40351/37079 39946/40339/37067 40678/39958/36690 38292/39976/36708
+f 36190/40349/37077 36191/40352/37080 36196/40353/37081 36192/40354/37082
+f 36192/40354/37082 36196/40353/37081 39949/40355/37083 39950/40356/37084
+f 36191/40352/37080 38291/39972/36704 38290/39971/36703 36196/40353/37081
+f 36196/40353/37081 38290/39971/36703 40679/39974/36706 39949/40355/37083
+f 36190/40349/37077 36192/40354/37082 36197/40357/37085 36193/40358/37086
+f 36193/40358/37086 36197/40357/37085 38362/40359/37087 38363/40360/37088
+f 36192/40354/37082 39950/40356/37084 39951/40361/37089 36197/40357/37085
+f 36197/40357/37085 39951/40361/37089 40703/40362/37090 38362/40359/37087
+f 36190/40349/37077 36193/40358/37086 36198/40363/37091 36194/40350/37078
+f 36194/40350/37078 36198/40363/37091 39948/40345/37073 39947/40340/37068
+f 36193/40358/37086 38363/40360/37088 38364/40364/37092 36198/40363/37091
+f 36198/40363/37091 38364/40364/37092 40702/40346/37074 39948/40345/37073
+f 36199/40365/37093 36203/40366/37094 36204/40367/37095 36200/40368/37096
+f 36200/40368/37096 36204/40367/37095 38295/39992/36724 38294/39988/36720
+f 36203/40366/37094 39950/40356/37084 39949/40355/37083 36204/40367/37095
+f 36204/40367/37095 39949/40355/37083 40679/39974/36706 38295/39992/36724
+f 36199/40365/37093 36200/40368/37096 36205/40369/37097 36201/40370/37098
+f 36201/40370/37098 36205/40369/37097 39952/40371/37099 39953/40372/37100
+f 36200/40368/37096 38294/39988/36720 38293/39987/36719 36205/40369/37097
+f 36205/40369/37097 38293/39987/36719 40680/39990/36722 39952/40371/37099
+f 36199/40365/37093 36201/40370/37098 36206/40373/37101 36202/40374/37102
+f 36202/40374/37102 36206/40373/37101 38365/40375/37103 38366/40376/37104
+f 36201/40370/37098 39953/40372/37100 39954/40377/37105 36206/40373/37101
+f 36206/40373/37101 39954/40377/37105 40704/40378/37106 38365/40375/37103
+f 36199/40365/37093 36202/40374/37102 36207/40379/37107 36203/40366/37094
+f 36203/40366/37094 36207/40379/37107 39951/40361/37089 39950/40356/37084
+f 36202/40374/37102 38366/40376/37104 38367/40380/37108 36207/40379/37107
+f 36207/40379/37107 38367/40380/37108 40703/40362/37090 39951/40361/37089
+f 36208/40381/37109 36212/40382/37110 36213/40383/37111 36209/40384/37112
+f 36209/40384/37112 36213/40383/37111 38298/40008/36740 38297/40004/36736
+f 36212/40382/37110 39953/40372/37100 39952/40371/37099 36213/40383/37111
+f 36213/40383/37111 39952/40371/37099 40680/39990/36722 38298/40008/36740
+f 36208/40381/37109 36209/40384/37112 36214/40385/37113 36210/40386/37114
+f 36210/40386/37114 36214/40385/37113 39955/40387/37115 39956/40388/37116
+f 36209/40384/37112 38297/40004/36736 38296/40003/36735 36214/40385/37113
+f 36214/40385/37113 38296/40003/36735 40681/40006/36738 39955/40387/37115
+f 36208/40381/37109 36210/40386/37114 36215/40389/37117 36211/40390/37118
+f 36211/40390/37118 36215/40389/37117 38368/40391/37119 38369/40392/37120
+f 36210/40386/37114 39956/40388/37116 39957/40393/37121 36215/40389/37117
+f 36215/40389/37117 39957/40393/37121 40705/40394/37122 38368/40391/37119
+f 36208/40381/37109 36211/40390/37118 36216/40395/37123 36212/40382/37110
+f 36212/40382/37110 36216/40395/37123 39954/40377/37105 39953/40372/37100
+f 36211/40390/37118 38369/40392/37120 38370/40396/37124 36216/40395/37123
+f 36216/40395/37123 38370/40396/37124 40704/40378/37106 39954/40377/37105
+f 36217/40397/37125 36221/40398/37126 36222/40399/37127 36218/40400/37128
+f 36218/40400/37128 36222/40399/37127 38301/40024/36756 38300/40020/36752
+f 36221/40398/37126 39956/40388/37116 39955/40387/37115 36222/40399/37127
+f 36222/40399/37127 39955/40387/37115 40681/40006/36738 38301/40024/36756
+f 36217/40397/37125 36218/40400/37128 36223/40401/37129 36219/40402/37130
+f 36219/40402/37130 36223/40401/37129 39958/40403/37131 39959/40404/37132
+f 36218/40400/37128 38300/40020/36752 38299/40019/36751 36223/40401/37129
+f 36223/40401/37129 38299/40019/36751 40682/40022/36754 39958/40403/37131
+f 36217/40397/37125 36219/40402/37130 36224/40405/37133 36220/40406/37134
+f 36220/40406/37134 36224/40405/37133 38371/40407/37135 38372/40408/37136
+f 36219/40402/37130 39959/40404/37132 39960/40409/37137 36224/40405/37133
+f 36224/40405/37133 39960/40409/37137 40706/40410/37138 38371/40407/37135
+f 36217/40397/37125 36220/40406/37134 36225/40411/37139 36221/40398/37126
+f 36221/40398/37126 36225/40411/37139 39957/40393/37121 39956/40388/37116
+f 36220/40406/37134 38372/40408/37136 38373/40412/37140 36225/40411/37139
+f 36225/40411/37139 38373/40412/37140 40705/40394/37122 39957/40393/37121
+f 36226/40413/37141 36230/40414/37142 36231/40415/37143 36227/40416/37144
+f 36227/40416/37144 36231/40415/37143 38304/40040/36772 38303/40036/36768
+f 36230/40414/37142 39959/40404/37132 39958/40403/37131 36231/40415/37143
+f 36231/40415/37143 39958/40403/37131 40682/40022/36754 38304/40040/36772
+f 36226/40413/37141 36227/40416/37144 36232/40417/37145 36228/40418/37146
+f 36228/40418/37146 36232/40417/37145 39961/40419/37147 39962/40420/37148
+f 36227/40416/37144 38303/40036/36768 38302/40035/36767 36232/40417/37145
+f 36232/40417/37145 38302/40035/36767 40683/40038/36770 39961/40419/37147
+f 36226/40413/37141 36228/40418/37146 36233/40421/37149 36229/40422/37150
+f 36229/40422/37150 36233/40421/37149 38374/40423/37151 38375/40424/37152
+f 36228/40418/37146 39962/40420/37148 39963/40425/37153 36233/40421/37149
+f 36233/40421/37149 39963/40425/37153 40707/40426/37154 38374/40423/37151
+f 36226/40413/37141 36229/40422/37150 36234/40427/37155 36230/40414/37142
+f 36230/40414/37142 36234/40427/37155 39960/40409/37137 39959/40404/37132
+f 36229/40422/37150 38375/40424/37152 38376/40428/37156 36234/40427/37155
+f 36234/40427/37155 38376/40428/37156 40706/40410/37138 39960/40409/37137
+f 36235/40429/37157 36239/40430/37158 36240/40431/37159 36236/40432/37160
+f 36236/40432/37160 36240/40431/37159 38307/40056/36784 38306/40052/36782
+f 36239/40430/37158 39962/40420/37148 39961/40419/37147 36240/40431/37159
+f 36240/40431/37159 39961/40419/37147 40683/40038/36770 38307/40056/36784
+f 36235/40429/37157 36236/40432/37160 36241/40433/37161 36237/40434/37162
+f 36237/40434/37162 36241/40433/37161 39894/40435/36790 39893/40436/36789
+f 36236/40432/37160 38306/40052/36782 38305/40051/36781 36241/40433/37161
+f 36241/40433/37161 38305/40051/36781 40660/40054/36420 39894/40435/36790
+f 36235/40429/37157 36237/40434/37162 36242/40437/37163 36238/40438/37164
+f 36238/40438/37164 36242/40437/37163 38377/40439/37165 38378/40440/37166
+f 36237/40434/37162 39893/40436/36789 39892/40441/36802 36242/40437/37163
+f 36242/40437/37163 39892/40441/36802 40684/40442/36804 38377/40439/37165
+f 36235/40429/37157 36238/40438/37164 36243/40443/37167 36239/40430/37158
+f 36239/40430/37158 36243/40443/37167 39963/40425/37153 39962/40420/37148
+f 36238/40438/37164 38378/40440/37166 38379/40444/37168 36243/40443/37167
+f 36243/40443/37167 38379/40444/37168 40707/40426/37154 39963/40425/37153
+f 36244/40445/37169 36248/40446/37170 36249/40447/37171 36245/40448/37172
+f 36245/40448/37172 36249/40447/37171 38310/40075/36803 38309/40070/36798
+f 36248/40446/37170 39965/40449/37173 39966/40450/37174 36249/40447/37171
+f 36249/40447/37171 39966/40450/37174 40684/40076/36804 38310/40075/36803
+f 36244/40445/37169 36245/40448/37172 36250/40451/37175 36246/40452/37176
+f 36246/40452/37176 36250/40451/37175 39967/40453/37177 39968/40454/37178
+f 36245/40448/37172 38309/40070/36798 38308/40069/36797 36250/40451/37175
+f 36250/40451/37175 38308/40069/36797 40685/40072/36800 39967/40453/37177
+f 36244/40445/37169 36246/40452/37176 36251/40455/37179 36247/40456/37180
+f 36247/40456/37180 36251/40455/37179 38380/40457/37181 38381/40458/37182
+f 36246/40452/37176 39968/40454/37178 39969/40459/37183 36251/40455/37179
+f 36251/40455/37179 39969/40459/37183 40709/40460/37184 38380/40457/37181
+f 36244/40445/37169 36247/40456/37180 36252/40461/37185 36248/40446/37170
+f 36248/40446/37170 36252/40461/37185 39964/40462/37186 39965/40449/37173
+f 36247/40456/37180 38381/40458/37182 38382/40463/37187 36252/40461/37185
+f 36252/40461/37185 38382/40463/37187 40708/40464/37188 39964/40462/37186
+f 36253/40465/37189 36257/40466/37190 36258/40467/37191 36254/40468/37192
+f 36254/40468/37192 36258/40467/37191 38313/40092/36820 38312/40088/36816
+f 36257/40466/37190 39968/40454/37178 39967/40453/37177 36258/40467/37191
+f 36258/40467/37191 39967/40453/37177 40685/40072/36800 38313/40092/36820
+f 36253/40465/37189 36254/40468/37192 36259/40469/37193 36255/40470/37194
+f 36255/40470/37194 36259/40469/37193 39970/40471/37195 39971/40472/37196
+f 36254/40468/37192 38312/40088/36816 38311/40087/36815 36259/40469/37193
+f 36259/40469/37193 38311/40087/36815 40686/40090/36818 39970/40471/37195
+f 36253/40465/37189 36255/40470/37194 36260/40473/37197 36256/40474/37198
+f 36256/40474/37198 36260/40473/37197 38383/40475/37199 38384/40476/37200
+f 36255/40470/37194 39971/40472/37196 39972/40477/37201 36260/40473/37197
+f 36260/40473/37197 39972/40477/37201 40710/40478/37202 38383/40475/37199
+f 36253/40465/37189 36256/40474/37198 36261/40479/37203 36257/40466/37190
+f 36257/40466/37190 36261/40479/37203 39969/40459/37183 39968/40454/37178
+f 36256/40474/37198 38384/40476/37200 38385/40480/37204 36261/40479/37203
+f 36261/40479/37203 38385/40480/37204 40709/40460/37184 39969/40459/37183
+f 36262/40481/37205 36266/40482/37206 36267/40483/37207 36263/40484/37208
+f 36263/40484/37208 36267/40483/37207 38316/40108/36836 38315/40104/36832
+f 36266/40482/37206 39971/40472/37196 39970/40471/37195 36267/40483/37207
+f 36267/40483/37207 39970/40471/37195 40686/40090/36818 38316/40108/36836
+f 36262/40481/37205 36263/40484/37208 36268/40485/37209 36264/40486/37210
+f 36264/40486/37210 36268/40485/37209 39973/40487/37211 39974/40488/37212
+f 36263/40484/37208 38315/40104/36832 38314/40103/36831 36268/40485/37209
+f 36268/40485/37209 38314/40103/36831 40687/40106/36834 39973/40487/37211
+f 36262/40481/37205 36264/40486/37210 36269/40489/37213 36265/40490/37214
+f 36265/40490/37214 36269/40489/37213 38386/40491/37215 38387/40492/37216
+f 36264/40486/37210 39974/40488/37212 39975/40493/37217 36269/40489/37213
+f 36269/40489/37213 39975/40493/37217 40711/40494/37218 38386/40491/37215
+f 36262/40481/37205 36265/40490/37214 36270/40495/37219 36266/40482/37206
+f 36266/40482/37206 36270/40495/37219 39972/40477/37201 39971/40472/37196
+f 36265/40490/37214 38387/40492/37216 38388/40496/37220 36270/40495/37219
+f 36270/40495/37219 38388/40496/37220 40710/40478/37202 39972/40477/37201
+f 36271/40497/37221 36275/40498/37222 36276/40499/37223 36272/40500/37224
+f 36272/40500/37224 36276/40499/37223 38319/40124/36852 38318/40120/36848
+f 36275/40498/37222 39974/40488/37212 39973/40487/37211 36276/40499/37223
+f 36276/40499/37223 39973/40487/37211 40687/40106/36834 38319/40124/36852
+f 36271/40497/37221 36272/40500/37224 36277/40501/37225 36273/40502/37226
+f 36273/40502/37226 36277/40501/37225 39976/40503/37227 39977/40504/37228
+f 36272/40500/37224 38318/40120/36848 38317/40119/36847 36277/40501/37225
+f 36277/40501/37225 38317/40119/36847 40688/40122/36850 39976/40503/37227
+f 36271/40497/37221 36273/40502/37226 36278/40505/37229 36274/40506/37230
+f 36274/40506/37230 36278/40505/37229 38389/40507/37231 38390/40508/37232
+f 36273/40502/37226 39977/40504/37228 39978/40509/37233 36278/40505/37229
+f 36278/40505/37229 39978/40509/37233 40712/40510/37234 38389/40507/37231
+f 36271/40497/37221 36274/40506/37230 36279/40511/37235 36275/40498/37222
+f 36275/40498/37222 36279/40511/37235 39975/40493/37217 39974/40488/37212
+f 36274/40506/37230 38390/40508/37232 38391/40512/37236 36279/40511/37235
+f 36279/40511/37235 38391/40512/37236 40711/40494/37218 39975/40493/37217
+f 36280/40513/37237 36284/40514/37238 36285/40515/37239 36281/40516/37240
+f 36281/40516/37240 36285/40515/37239 38322/40140/36868 38321/40136/36864
+f 36284/40514/37238 39977/40504/37228 39976/40503/37227 36285/40515/37239
+f 36285/40515/37239 39976/40503/37227 40688/40122/36850 38322/40140/36868
+f 36280/40513/37237 36281/40516/37240 36286/40517/37241 36282/40518/37242
+f 36282/40518/37242 36286/40517/37241 39979/40519/37243 39980/40520/37244
+f 36281/40516/37240 38321/40136/36864 38320/40135/36863 36286/40517/37241
+f 36286/40517/37241 38320/40135/36863 40689/40138/36866 39979/40519/37243
+f 36280/40513/37237 36282/40518/37242 36287/40521/37245 36283/40522/37246
+f 36283/40522/37246 36287/40521/37245 38392/40523/37247 38393/40524/37248
+f 36282/40518/37242 39980/40520/37244 39981/40525/37249 36287/40521/37245
+f 36287/40521/37245 39981/40525/37249 40713/40526/37250 38392/40523/37247
+f 36280/40513/37237 36283/40522/37246 36288/40527/37251 36284/40514/37238
+f 36284/40514/37238 36288/40527/37251 39978/40509/37233 39977/40504/37228
+f 36283/40522/37246 38393/40524/37248 38394/40528/37252 36288/40527/37251
+f 36288/40527/37251 38394/40528/37252 40712/40510/37234 39978/40509/37233
+f 36289/40529/37253 36293/40530/37254 36294/40531/37255 36290/40532/37256
+f 36290/40532/37256 36294/40531/37255 38325/40156/36884 38324/40152/36880
+f 36293/40530/37254 39980/40520/37244 39979/40519/37243 36294/40531/37255
+f 36294/40531/37255 39979/40519/37243 40689/40138/36866 38325/40156/36884
+f 36289/40529/37253 36290/40532/37256 36295/40533/37257 36291/40534/37258
+f 36291/40534/37258 36295/40533/37257 39982/40535/37259 39983/40536/37260
+f 36290/40532/37256 38324/40152/36880 38323/40151/36879 36295/40533/37257
+f 36295/40533/37257 38323/40151/36879 40690/40154/36882 39982/40535/37259
+f 36289/40529/37253 36291/40534/37258 36296/40537/37261 36292/40538/37262
+f 36292/40538/37262 36296/40537/37261 38395/40539/37263 38396/40540/37264
+f 36291/40534/37258 39983/40536/37260 39984/40541/37265 36296/40537/37261
+f 36296/40537/37261 39984/40541/37265 40714/40542/37266 38395/40539/37263
+f 36289/40529/37253 36292/40538/37262 36297/40543/37267 36293/40530/37254
+f 36293/40530/37254 36297/40543/37267 39981/40525/37249 39980/40520/37244
+f 36292/40538/37262 38396/40540/37264 38397/40544/37268 36297/40543/37267
+f 36297/40543/37267 38397/40544/37268 40713/40526/37250 39981/40525/37249
+f 36298/40545/37269 36302/40546/37270 36303/40547/37271 36299/40548/37272
+f 36299/40548/37272 36303/40547/37271 38328/40172/36900 38327/40168/36896
+f 36302/40546/37270 39983/40536/37260 39982/40535/37259 36303/40547/37271
+f 36303/40547/37271 39982/40535/37259 40690/40154/36882 38328/40172/36900
+f 36298/40545/37269 36299/40548/37272 36304/40549/37273 36300/40550/37274
+f 36300/40550/37274 36304/40549/37273 39985/40551/37275 39986/40552/37276
+f 36299/40548/37272 38327/40168/36896 38326/40167/36895 36304/40549/37273
+f 36304/40549/37273 38326/40167/36895 40691/40170/36898 39985/40551/37275
+f 36298/40545/37269 36300/40550/37274 36305/40553/37277 36301/40554/37278
+f 36301/40554/37278 36305/40553/37277 38398/40555/37279 38399/40556/37280
+f 36300/40550/37274 39986/40552/37276 39987/40557/37281 36305/40553/37277
+f 36305/40553/37277 39987/40557/37281 40715/40558/37282 38398/40555/37279
+f 36298/40545/37269 36301/40554/37278 36306/40559/37283 36302/40546/37270
+f 36302/40546/37270 36306/40559/37283 39984/40541/37265 39983/40536/37260
+f 36301/40554/37278 38399/40556/37280 38400/40560/37284 36306/40559/37283
+f 36306/40559/37283 38400/40560/37284 40714/40542/37266 39984/40541/37265
+f 36307/40561/37285 36311/40562/37286 36312/40563/37287 36308/40564/37288
+f 36308/40564/37288 36312/40563/37287 38331/40188/36916 38330/40184/36912
+f 36311/40562/37286 39986/40552/37276 39985/40551/37275 36312/40563/37287
+f 36312/40563/37287 39985/40551/37275 40691/40170/36898 38331/40188/36916
+f 36307/40561/37285 36308/40564/37288 36313/40565/37289 36309/40566/37290
+f 36309/40566/37290 36313/40565/37289 39988/40567/37291 39989/40568/37292
+f 36308/40564/37288 38330/40184/36912 38329/40183/36911 36313/40565/37289
+f 36313/40565/37289 38329/40183/36911 40692/40186/36914 39988/40567/37291
+f 36307/40561/37285 36309/40566/37290 36314/40569/37293 36310/40570/37294
+f 36310/40570/37294 36314/40569/37293 38401/40571/37295 38402/40572/37296
+f 36309/40566/37290 39989/40568/37292 39990/40573/37297 36314/40569/37293
+f 36314/40569/37293 39990/40573/37297 40716/40574/37298 38401/40571/37295
+f 36307/40561/37285 36310/40570/37294 36315/40575/37299 36311/40562/37286
+f 36311/40562/37286 36315/40575/37299 39987/40557/37281 39986/40552/37276
+f 36310/40570/37294 38402/40572/37296 38403/40576/37300 36315/40575/37299
+f 36315/40575/37299 38403/40576/37300 40715/40558/37282 39987/40557/37281
+f 36316/40577/37301 36320/40578/37302 36321/40579/37303 36317/40580/37304
+f 36317/40580/37304 36321/40579/37303 38334/40204/36932 38333/40200/36928
+f 36320/40578/37302 39989/40568/37292 39988/40567/37291 36321/40579/37303
+f 36321/40579/37303 39988/40567/37291 40692/40186/36914 38334/40204/36932
+f 36316/40577/37301 36317/40580/37304 36322/40581/37305 36318/40582/37306
+f 36318/40582/37306 36322/40581/37305 39991/40583/37307 39992/40584/37308
+f 36317/40580/37304 38333/40200/36928 38332/40199/36927 36322/40581/37305
+f 36322/40581/37305 38332/40199/36927 40693/40202/36930 39991/40583/37307
+f 36316/40577/37301 36318/40582/37306 36323/40585/37309 36319/40586/37310
+f 36319/40586/37310 36323/40585/37309 38404/40587/37311 38405/40588/37312
+f 36318/40582/37306 39992/40584/37308 39993/40589/37313 36323/40585/37309
+f 36323/40585/37309 39993/40589/37313 40717/40590/37314 38404/40587/37311
+f 36316/40577/37301 36319/40586/37310 36324/40591/37315 36320/40578/37302
+f 36320/40578/37302 36324/40591/37315 39990/40573/37297 39989/40568/37292
+f 36319/40586/37310 38405/40588/37312 38406/40592/37316 36324/40591/37315
+f 36324/40591/37315 38406/40592/37316 40716/40574/37298 39990/40573/37297
+f 36325/40593/37317 36329/40594/37318 36330/40595/37319 36326/40596/37320
+f 36326/40596/37320 36330/40595/37319 38337/40220/36948 38336/40216/36944
+f 36329/40594/37318 39992/40584/37308 39991/40583/37307 36330/40595/37319
+f 36330/40595/37319 39991/40583/37307 40693/40202/36930 38337/40220/36948
+f 36325/40593/37317 36326/40596/37320 36331/40597/37321 36327/40598/37322
+f 36327/40598/37322 36331/40597/37321 39994/40599/37323 39995/40600/37324
+f 36326/40596/37320 38336/40216/36944 38335/40215/36943 36331/40597/37321
+f 36331/40597/37321 38335/40215/36943 40694/40218/36946 39994/40599/37323
+f 36325/40593/37317 36327/40598/37322 36332/40601/37325 36328/40602/37326
+f 36328/40602/37326 36332/40601/37325 38407/40603/37327 38408/40604/37328
+f 36327/40598/37322 39995/40600/37324 39996/40605/37329 36332/40601/37325
+f 36332/40601/37325 39996/40605/37329 40718/40606/37330 38407/40603/37327
+f 36325/40593/37317 36328/40602/37326 36333/40607/37331 36329/40594/37318
+f 36329/40594/37318 36333/40607/37331 39993/40589/37313 39992/40584/37308
+f 36328/40602/37326 38408/40604/37328 38409/40608/37332 36333/40607/37331
+f 36333/40607/37331 38409/40608/37332 40717/40590/37314 39993/40589/37313
+f 36334/40609/37333 36338/40610/37334 36339/40611/37335 36335/40612/37336
+f 36335/40612/37336 36339/40611/37335 38340/40236/36964 38339/40232/36960
+f 36338/40610/37334 39995/40600/37324 39994/40599/37323 36339/40611/37335
+f 36339/40611/37335 39994/40599/37323 40694/40218/36946 38340/40236/36964
+f 36334/40609/37333 36335/40612/37336 36340/40613/37337 36336/40614/37338
+f 36336/40614/37338 36340/40613/37337 39997/40615/37339 39998/40616/37340
+f 36335/40612/37336 38339/40232/36960 38338/40231/36959 36340/40613/37337
+f 36340/40613/37337 38338/40231/36959 40695/40234/36962 39997/40615/37339
+f 36334/40609/37333 36336/40614/37338 36341/40617/37341 36337/40618/37342
+f 36337/40618/37342 36341/40617/37341 38410/40619/37343 38411/40620/37344
+f 36336/40614/37338 39998/40616/37340 39999/40621/37345 36341/40617/37341
+f 36341/40617/37341 39999/40621/37345 40719/40622/37346 38410/40619/37343
+f 36334/40609/37333 36337/40618/37342 36342/40623/37347 36338/40610/37334
+f 36338/40610/37334 36342/40623/37347 39996/40605/37329 39995/40600/37324
+f 36337/40618/37342 38411/40620/37344 38412/40624/37348 36342/40623/37347
+f 36342/40623/37347 38412/40624/37348 40718/40606/37330 39996/40605/37329
+f 36343/40625/37349 36347/40626/37350 36348/40627/37351 36344/40628/37352
+f 36344/40628/37352 36348/40627/37351 38343/40252/36980 38342/40248/36976
+f 36347/40626/37350 39998/40616/37340 39997/40615/37339 36348/40627/37351
+f 36348/40627/37351 39997/40615/37339 40695/40234/36962 38343/40252/36980
+f 36343/40625/37349 36344/40628/37352 36349/40629/37353 36345/40630/37354
+f 36345/40630/37354 36349/40629/37353 40000/40631/37355 40001/40632/37356
+f 36344/40628/37352 38342/40248/36976 38341/40247/36975 36349/40629/37353
+f 36349/40629/37353 38341/40247/36975 40696/40250/36978 40000/40631/37355
+f 36343/40625/37349 36345/40630/37354 36350/40633/37357 36346/40634/37358
+f 36346/40634/37358 36350/40633/37357 38413/40635/37359 38414/40636/37360
+f 36345/40630/37354 40001/40632/37356 40002/40637/37361 36350/40633/37357
+f 36350/40633/37357 40002/40637/37361 40720/40638/37362 38413/40635/37359
+f 36343/40625/37349 36346/40634/37358 36351/40639/37363 36347/40626/37350
+f 36347/40626/37350 36351/40639/37363 39999/40621/37345 39998/40616/37340
+f 36346/40634/37358 38414/40636/37360 38415/40640/37364 36351/40639/37363
+f 36351/40639/37363 38415/40640/37364 40719/40622/37346 39999/40621/37345
+f 36352/40641/37365 36356/40642/37366 36357/40643/37367 36353/40644/37368
+f 36353/40644/37368 36357/40643/37367 38346/40268/36996 38345/40264/36992
+f 36356/40642/37366 40001/40632/37356 40000/40631/37355 36357/40643/37367
+f 36357/40643/37367 40000/40631/37355 40696/40250/36978 38346/40268/36996
+f 36352/40641/37365 36353/40644/37368 36358/40645/37369 36354/40646/37370
+f 36354/40646/37370 36358/40645/37369 40003/40647/37371 40004/40648/37372
+f 36353/40644/37368 38345/40264/36992 38344/40263/36991 36358/40645/37369
+f 36358/40645/37369 38344/40263/36991 40697/40266/36994 40003/40647/37371
+f 36352/40641/37365 36354/40646/37370 36359/40649/37373 36355/40650/37374
+f 36355/40650/37374 36359/40649/37373 38416/40651/37375 38417/40652/37376
+f 36354/40646/37370 40004/40648/37372 40005/40653/37377 36359/40649/37373
+f 36359/40649/37373 40005/40653/37377 40721/40654/37378 38416/40651/37375
+f 36352/40641/37365 36355/40650/37374 36360/40655/37379 36356/40642/37366
+f 36356/40642/37366 36360/40655/37379 40002/40637/37361 40001/40632/37356
+f 36355/40650/37374 38417/40652/37376 38418/40656/37380 36360/40655/37379
+f 36360/40655/37379 38418/40656/37380 40720/40638/37362 40002/40637/37361
+f 36361/40657/37381 36365/40658/37382 36366/40659/37383 36362/40660/37384
+f 36362/40660/37384 36366/40659/37383 38349/40284/37012 38348/40280/37008
+f 36365/40658/37382 40004/40648/37372 40003/40647/37371 36366/40659/37383
+f 36366/40659/37383 40003/40647/37371 40697/40266/36994 38349/40284/37012
+f 36361/40657/37381 36362/40660/37384 36367/40661/37385 36363/40662/37386
+f 36363/40662/37386 36367/40661/37385 40006/40663/37387 40007/40664/37388
+f 36362/40660/37384 38348/40280/37008 38347/40279/37007 36367/40661/37385
+f 36367/40661/37385 38347/40279/37007 40698/40282/37010 40006/40663/37387
+f 36361/40657/37381 36363/40662/37386 36368/40665/37389 36364/40666/37390
+f 36364/40666/37390 36368/40665/37389 38419/40667/37391 38420/40668/37392
+f 36363/40662/37386 40007/40664/37388 40008/40669/37393 36368/40665/37389
+f 36368/40665/37389 40008/40669/37393 40722/40670/37394 38419/40667/37391
+f 36361/40657/37381 36364/40666/37390 36369/40671/37395 36365/40658/37382
+f 36365/40658/37382 36369/40671/37395 40005/40653/37377 40004/40648/37372
+f 36364/40666/37390 38420/40668/37392 38421/40672/37396 36369/40671/37395
+f 36369/40671/37395 38421/40672/37396 40721/40654/37378 40005/40653/37377
+f 36370/40673/37397 36374/40674/37398 36375/40675/37399 36371/40676/37400
+f 36371/40676/37400 36375/40675/37399 38352/40300/37028 38351/40296/37024
+f 36374/40674/37398 40007/40664/37388 40006/40663/37387 36375/40675/37399
+f 36375/40675/37399 40006/40663/37387 40698/40282/37010 38352/40300/37028
+f 36370/40673/37397 36371/40676/37400 36376/40677/37401 36372/40678/37402
+f 36372/40678/37402 36376/40677/37401 40009/40679/37403 40010/40680/37404
+f 36371/40676/37400 38351/40296/37024 38350/40295/37023 36376/40677/37401
+f 36376/40677/37401 38350/40295/37023 40699/40298/37026 40009/40679/37403
+f 36370/40673/37397 36372/40678/37402 36377/40681/37405 36373/40682/37406
+f 36373/40682/37406 36377/40681/37405 38422/40683/37407 38423/40684/37408
+f 36372/40678/37402 40010/40680/37404 40011/40685/37409 36377/40681/37405
+f 36377/40681/37405 40011/40685/37409 40723/40686/37410 38422/40683/37407
+f 36370/40673/37397 36373/40682/37406 36378/40687/37411 36374/40674/37398
+f 36374/40674/37398 36378/40687/37411 40008/40669/37393 40007/40664/37388
+f 36373/40682/37406 38423/40684/37408 38424/40688/37412 36378/40687/37411
+f 36378/40687/37411 38424/40688/37412 40722/40670/37394 40008/40669/37393
+f 36379/40689/37413 36383/40690/37414 36384/40691/37415 36380/40692/37416
+f 36380/40692/37416 36384/40691/37415 38355/40316/37044 38354/40312/37040
+f 36383/40690/37414 40010/40680/37404 40009/40679/37403 36384/40691/37415
+f 36384/40691/37415 40009/40679/37403 40699/40298/37026 38355/40316/37044
+f 36379/40689/37413 36380/40692/37416 36385/40693/37417 36381/40694/37418
+f 36381/40694/37418 36385/40693/37417 40012/40695/37419 40013/40696/37420
+f 36380/40692/37416 38354/40312/37040 38353/40311/37039 36385/40693/37417
+f 36385/40693/37417 38353/40311/37039 40700/40314/37042 40012/40695/37419
+f 36379/40689/37413 36381/40694/37418 36386/40697/37421 36382/40698/37422
+f 36382/40698/37422 36386/40697/37421 38425/40699/37423 38426/40700/37424
+f 36381/40694/37418 40013/40696/37420 40014/40701/37425 36386/40697/37421
+f 36386/40697/37421 40014/40701/37425 40724/40702/37426 38425/40699/37423
+f 36379/40689/37413 36382/40698/37422 36387/40703/37427 36383/40690/37414
+f 36383/40690/37414 36387/40703/37427 40011/40685/37409 40010/40680/37404
+f 36382/40698/37422 38426/40700/37424 38427/40704/37428 36387/40703/37427
+f 36387/40703/37427 38427/40704/37428 40723/40686/37410 40011/40685/37409
+f 36388/40705/37429 36392/40706/37430 36393/40707/37431 36389/40708/37432
+f 36389/40708/37432 36393/40707/37431 38358/40332/37060 38357/40328/37056
+f 36392/40706/37430 40013/40696/37420 40012/40695/37419 36393/40707/37431
+f 36393/40707/37431 40012/40695/37419 40700/40314/37042 38358/40332/37060
+f 36388/40705/37429 36389/40708/37432 36394/40709/37433 36390/40710/37434
+f 36390/40710/37434 36394/40709/37433 40015/40711/37435 40016/40712/37436
+f 36389/40708/37432 38357/40328/37056 38356/40327/37055 36394/40709/37433
+f 36394/40709/37433 38356/40327/37055 40701/40330/37058 40015/40711/37435
+f 36388/40705/37429 36390/40710/37434 36395/40713/37437 36391/40714/37438
+f 36391/40714/37438 36395/40713/37437 38428/40715/37439 38429/40716/37440
+f 36390/40710/37434 40016/40712/37436 40017/40717/37441 36395/40713/37437
+f 36395/40713/37437 40017/40717/37441 40725/40718/37442 38428/40715/37439
+f 36388/40705/37429 36391/40714/37438 36396/40719/37443 36392/40706/37430
+f 36392/40706/37430 36396/40719/37443 40014/40701/37425 40013/40696/37420
+f 36391/40714/37438 38429/40716/37440 38430/40720/37444 36396/40719/37443
+f 36396/40719/37443 38430/40720/37444 40724/40702/37426 40014/40701/37425
+f 36397/40721/37445 36401/40722/37446 36402/40723/37447 36398/40724/37448
+f 36398/40724/37448 36402/40723/37447 38361/40348/37076 38360/40344/37072
+f 36401/40722/37446 40016/40712/37436 40015/40711/37435 36402/40723/37447
+f 36402/40723/37447 40015/40711/37435 40701/40330/37058 38361/40348/37076
+f 36397/40721/37445 36398/40724/37448 36403/40725/37449 36399/40726/37450
+f 36399/40726/37450 36403/40725/37449 40018/40727/37451 40019/40728/37452
+f 36398/40724/37448 38360/40344/37072 38359/40343/37071 36403/40725/37449
+f 36403/40725/37449 38359/40343/37071 40702/40346/37074 40018/40727/37451
+f 36397/40721/37445 36399/40726/37450 36404/40729/37453 36400/40730/37454
+f 36400/40730/37454 36404/40729/37453 38431/40731/37455 38432/40732/37456
+f 36399/40726/37450 40019/40728/37452 40020/40733/37457 36404/40729/37453
+f 36404/40729/37453 40020/40733/37457 40726/40734/37458 38431/40731/37455
+f 36397/40721/37445 36400/40730/37454 36405/40735/37459 36401/40722/37446
+f 36401/40722/37446 36405/40735/37459 40017/40717/37441 40016/40712/37436
+f 36400/40730/37454 38432/40732/37456 38433/40736/37460 36405/40735/37459
+f 36405/40735/37459 38433/40736/37460 40725/40718/37442 40017/40717/37441
+f 36406/40737/37461 36410/40738/37462 36411/40739/37463 36407/40740/37464
+f 36407/40740/37464 36411/40739/37463 38364/40364/37092 38363/40360/37088
+f 36410/40738/37462 40019/40728/37452 40018/40727/37451 36411/40739/37463
+f 36411/40739/37463 40018/40727/37451 40702/40346/37074 38364/40364/37092
+f 36406/40737/37461 36407/40740/37464 36412/40741/37465 36408/40742/37466
+f 36408/40742/37466 36412/40741/37465 40021/40743/37467 40022/40744/37468
+f 36407/40740/37464 38363/40360/37088 38362/40359/37087 36412/40741/37465
+f 36412/40741/37465 38362/40359/37087 40703/40362/37090 40021/40743/37467
+f 36406/40737/37461 36408/40742/37466 36413/40745/37469 36409/40746/37470
+f 36409/40746/37470 36413/40745/37469 38434/40747/37471 38435/40748/37472
+f 36408/40742/37466 40022/40744/37468 40023/40749/37473 36413/40745/37469
+f 36413/40745/37469 40023/40749/37473 40727/40750/37474 38434/40747/37471
+f 36406/40737/37461 36409/40746/37470 36414/40751/37475 36410/40738/37462
+f 36410/40738/37462 36414/40751/37475 40020/40733/37457 40019/40728/37452
+f 36409/40746/37470 38435/40748/37472 38436/40752/37476 36414/40751/37475
+f 36414/40751/37475 38436/40752/37476 40726/40734/37458 40020/40733/37457
+f 36415/40753/37477 36419/40754/37478 36420/40755/37479 36416/40756/37480
+f 36416/40756/37480 36420/40755/37479 38367/40380/37108 38366/40376/37104
+f 36419/40754/37478 40022/40744/37468 40021/40743/37467 36420/40755/37479
+f 36420/40755/37479 40021/40743/37467 40703/40362/37090 38367/40380/37108
+f 36415/40753/37477 36416/40756/37480 36421/40757/37481 36417/40758/37482
+f 36417/40758/37482 36421/40757/37481 40024/40759/37483 40025/40760/37484
+f 36416/40756/37480 38366/40376/37104 38365/40375/37103 36421/40757/37481
+f 36421/40757/37481 38365/40375/37103 40704/40378/37106 40024/40759/37483
+f 36415/40753/37477 36417/40758/37482 36422/40761/37485 36418/40762/37486
+f 36418/40762/37486 36422/40761/37485 38437/40763/37487 38438/40764/37488
+f 36417/40758/37482 40025/40760/37484 40026/40765/37489 36422/40761/37485
+f 36422/40761/37485 40026/40765/37489 40728/40766/37490 38437/40763/37487
+f 36415/40753/37477 36418/40762/37486 36423/40767/37491 36419/40754/37478
+f 36419/40754/37478 36423/40767/37491 40023/40749/37473 40022/40744/37468
+f 36418/40762/37486 38438/40764/37488 38439/40768/37492 36423/40767/37491
+f 36423/40767/37491 38439/40768/37492 40727/40750/37474 40023/40749/37473
+f 36424/40769/37493 36428/40770/37494 36429/40771/37495 36425/40772/37496
+f 36425/40772/37496 36429/40771/37495 38370/40396/37124 38369/40392/37120
+f 36428/40770/37494 40025/40760/37484 40024/40759/37483 36429/40771/37495
+f 36429/40771/37495 40024/40759/37483 40704/40378/37106 38370/40396/37124
+f 36424/40769/37493 36425/40772/37496 36430/40773/37497 36426/40774/37498
+f 36426/40774/37498 36430/40773/37497 40027/40775/37499 40028/40776/37500
+f 36425/40772/37496 38369/40392/37120 38368/40391/37119 36430/40773/37497
+f 36430/40773/37497 38368/40391/37119 40705/40394/37122 40027/40775/37499
+f 36424/40769/37493 36426/40774/37498 36431/40777/37501 36427/40778/37502
+f 36427/40778/37502 36431/40777/37501 38440/40779/37503 38441/40780/37504
+f 36426/40774/37498 40028/40776/37500 40029/40781/37505 36431/40777/37501
+f 36431/40777/37501 40029/40781/37505 40729/40782/37506 38440/40779/37503
+f 36424/40769/37493 36427/40778/37502 36432/40783/37507 36428/40770/37494
+f 36428/40770/37494 36432/40783/37507 40026/40765/37489 40025/40760/37484
+f 36427/40778/37502 38441/40780/37504 38442/40784/37508 36432/40783/37507
+f 36432/40783/37507 38442/40784/37508 40728/40766/37490 40026/40765/37489
+f 36433/40785/37509 36437/40786/37510 36438/40787/37511 36434/40788/37512
+f 36434/40788/37512 36438/40787/37511 38373/40412/37140 38372/40408/37136
+f 36437/40786/37510 40028/40776/37500 40027/40775/37499 36438/40787/37511
+f 36438/40787/37511 40027/40775/37499 40705/40394/37122 38373/40412/37140
+f 36433/40785/37509 36434/40788/37512 36439/40789/37513 36435/40790/37514
+f 36435/40790/37514 36439/40789/37513 40030/40791/37515 40031/40792/37516
+f 36434/40788/37512 38372/40408/37136 38371/40407/37135 36439/40789/37513
+f 36439/40789/37513 38371/40407/37135 40706/40410/37138 40030/40791/37515
+f 36433/40785/37509 36435/40790/37514 36440/40793/37517 36436/40794/37518
+f 36436/40794/37518 36440/40793/37517 38443/40795/37519 38444/40796/37520
+f 36435/40790/37514 40031/40792/37516 40032/40797/37521 36440/40793/37517
+f 36440/40793/37517 40032/40797/37521 40730/40798/37522 38443/40795/37519
+f 36433/40785/37509 36436/40794/37518 36441/40799/37523 36437/40786/37510
+f 36437/40786/37510 36441/40799/37523 40029/40781/37505 40028/40776/37500
+f 36436/40794/37518 38444/40796/37520 38445/40800/37524 36441/40799/37523
+f 36441/40799/37523 38445/40800/37524 40729/40782/37506 40029/40781/37505
+f 36442/40801/37525 36446/40802/37526 36447/40803/37527 36443/40804/37528
+f 36443/40804/37528 36447/40803/37527 38376/40428/37156 38375/40424/37152
+f 36446/40802/37526 40031/40792/37516 40030/40791/37515 36447/40803/37527
+f 36447/40803/37527 40030/40791/37515 40706/40410/37138 38376/40428/37156
+f 36442/40801/37525 36443/40804/37528 36448/40805/37529 36444/40806/37530
+f 36444/40806/37530 36448/40805/37529 40033/40807/37531 40034/40808/37532
+f 36443/40804/37528 38375/40424/37152 38374/40423/37151 36448/40805/37529
+f 36448/40805/37529 38374/40423/37151 40707/40426/37154 40033/40807/37531
+f 36442/40801/37525 36444/40806/37530 36449/40809/37533 36445/40810/37534
+f 36445/40810/37534 36449/40809/37533 38446/40811/37535 38447/40812/37536
+f 36444/40806/37530 40034/40808/37532 40035/40813/37537 36449/40809/37533
+f 36449/40809/37533 40035/40813/37537 40731/40814/37538 38446/40811/37535
+f 36442/40801/37525 36445/40810/37534 36450/40815/37539 36446/40802/37526
+f 36446/40802/37526 36450/40815/37539 40032/40797/37521 40031/40792/37516
+f 36445/40810/37534 38447/40812/37536 38448/40816/37540 36450/40815/37539
+f 36450/40815/37539 38448/40816/37540 40730/40798/37522 40032/40797/37521
+f 36451/40817/37541 36455/40818/37542 36456/40819/37543 36452/40820/37544
+f 36452/40820/37544 36456/40819/37543 38379/40444/37168 38378/40440/37166
+f 36455/40818/37542 40034/40808/37532 40033/40807/37531 36456/40819/37543
+f 36456/40819/37543 40033/40807/37531 40707/40426/37154 38379/40444/37168
+f 36451/40817/37541 36452/40820/37544 36457/40821/37545 36453/40822/37546
+f 36453/40822/37546 36457/40821/37545 39966/40823/37174 39965/40824/37173
+f 36452/40820/37544 38378/40440/37166 38377/40439/37165 36457/40821/37545
+f 36457/40821/37545 38377/40439/37165 40684/40442/36804 39966/40823/37174
+f 36451/40817/37541 36453/40822/37546 36458/40825/37547 36454/40826/37548
+f 36454/40826/37548 36458/40825/37547 38449/40827/37549 38450/40828/37550
+f 36453/40822/37546 39965/40824/37173 39964/40829/37186 36458/40825/37547
+f 36458/40825/37547 39964/40829/37186 40708/40830/37188 38449/40827/37549
+f 36451/40817/37541 36454/40826/37548 36459/40831/37551 36455/40818/37542
+f 36455/40818/37542 36459/40831/37551 40035/40813/37537 40034/40808/37532
+f 36454/40826/37548 38450/40828/37550 38451/40832/37552 36459/40831/37551
+f 36459/40831/37551 38451/40832/37552 40731/40814/37538 40035/40813/37537
+f 36460/40833/37553 36463/40834/37554 36464/40835/37555 36461/40836/37556
+f 36461/40836/37556 36464/40835/37555 36798/32218/29026 36797/32210/29018
+f 36463/40834/37554 40040/40837/37557 40041/40838/37558 36464/40835/37555
+f 36464/40835/37555 40041/40838/37558 40181/32219/29027 36798/32218/29026
+f 36460/40833/37553 36461/40836/37556 36465/40839/37559 36462/40840/37560
+f 36462/40840/37560 36465/40839/37559 40036/40841/37561 40037/40842/37562
+f 36461/40836/37556 36797/32210/29018 36796/32209/29017 36465/40839/37559
+f 36465/40839/37559 36796/32209/29017 40180/32213/29021 40036/40841/37561
+f 36460/40833/37553 36462/40840/37560 36466/40843/37563 36463/40834/37554
+f 36463/40834/37554 36466/40843/37563 40039/40844/37564 40040/40837/37557
+f 36462/40840/37560 40037/40842/37562 40038/40845/37565 36466/40843/37563
+f 36466/40843/37563 40038/40845/37565 40732/40846/14955 40039/40844/37564
+f 36467/40847/37566 36470/40848/37567 36471/40849/37568 36468/40850/37569
+f 36468/40850/37569 36471/40849/37568 36801/32240/29048 36800/32235/29043
+f 36470/40848/37567 40043/40851/37570 40044/40852/37571 36471/40849/37568
+f 36471/40849/37568 40044/40852/37571 40182/32241/29049 36801/32240/29048
+f 36467/40847/37566 36468/40850/37569 36472/40853/37572 36469/40854/37573
+f 36469/40854/37573 36472/40853/37572 40041/40855/37558 40040/40856/37557
+f 36468/40850/37569 36800/32235/29043 36799/32234/29042 36472/40853/37572
+f 36472/40853/37572 36799/32234/29042 40181/32219/29027 40041/40855/37558
+f 36467/40847/37566 36469/40854/37573 36473/40857/37574 36470/40848/37567
+f 36470/40848/37567 36473/40857/37574 40042/40858/37575 40043/40851/37570
+f 36469/40854/37573 40040/40856/37557 40039/40859/37564 36473/40857/37574
+f 36473/40857/37574 40039/40859/37564 40732/40860/14955 40042/40858/37575
+f 36474/40861/37576 36477/40862/37577 36478/40863/37578 36475/40864/37579
+f 36475/40864/37579 36478/40863/37578 36804/32260/29068 36803/32255/29063
+f 36477/40862/37577 40046/40865/37580 40047/40866/37581 36478/40863/37578
+f 36478/40863/37578 40047/40866/37581 40183/32261/29069 36804/32260/29068
+f 36474/40861/37576 36475/40864/37579 36479/40867/37582 36476/40868/37583
+f 36476/40868/37583 36479/40867/37582 40044/40869/37571 40043/40870/37570
+f 36475/40864/37579 36803/32255/29063 36802/32254/29062 36479/40867/37582
+f 36479/40867/37582 36802/32254/29062 40182/32241/29049 40044/40869/37571
+f 36474/40861/37576 36476/40868/37583 36480/40871/37584 36477/40862/37577
+f 36477/40862/37577 36480/40871/37584 40045/40872/37585 40046/40865/37580
+f 36476/40868/37583 40043/40870/37570 40042/40873/37575 36480/40871/37584
+f 36480/40871/37584 40042/40873/37575 40732/40874/14955 40045/40872/37585
+f 36481/40875/37586 36484/40876/37587 36485/40877/37588 36482/40878/37589
+f 36482/40878/37589 36485/40877/37588 36807/32280/29088 36806/32275/29083
+f 36484/40876/37587 40049/40879/37590 40050/40880/37591 36485/40877/37588
+f 36485/40877/37588 40050/40880/37591 40184/32281/29089 36807/32280/29088
+f 36481/40875/37586 36482/40878/37589 36486/40881/37592 36483/40882/37593
+f 36483/40882/37593 36486/40881/37592 40047/40883/37581 40046/40884/37580
+f 36482/40878/37589 36806/32275/29083 36805/32274/29082 36486/40881/37592
+f 36486/40881/37592 36805/32274/29082 40183/32261/29069 40047/40883/37581
+f 36481/40875/37586 36483/40882/37593 36487/40885/37594 36484/40876/37587
+f 36484/40876/37587 36487/40885/37594 40048/40886/37595 40049/40879/37590
+f 36483/40882/37593 40046/40884/37580 40045/40887/37585 36487/40885/37594
+f 36487/40885/37594 40045/40887/37585 40732/40888/14955 40048/40886/37595
+f 36488/40889/37596 36491/40890/37597 36492/40891/37598 36489/40892/37599
+f 36489/40892/37599 36492/40891/37598 36810/32300/29108 36809/32295/29103
+f 36491/40890/37597 40052/40893/37600 40053/40894/37601 36492/40891/37598
+f 36492/40891/37598 40053/40894/37601 40185/32301/29109 36810/32300/29108
+f 36488/40889/37596 36489/40892/37599 36493/40895/37602 36490/40896/37603
+f 36490/40896/37603 36493/40895/37602 40050/40897/37591 40049/40898/37590
+f 36489/40892/37599 36809/32295/29103 36808/32294/29102 36493/40895/37602
+f 36493/40895/37602 36808/32294/29102 40184/32281/29089 40050/40897/37591
+f 36488/40889/37596 36490/40896/37603 36494/40899/37604 36491/40890/37597
+f 36491/40890/37597 36494/40899/37604 40051/40900/37605 40052/40893/37600
+f 36490/40896/37603 40049/40898/37590 40048/40901/37595 36494/40899/37604
+f 36494/40899/37604 40048/40901/37595 40732/40902/14955 40051/40900/37605
+f 36495/40903/37606 36498/40904/37607 36499/40905/37608 36496/40906/37609
+f 36496/40906/37609 36499/40905/37608 36813/32320/29128 36812/32315/29123
+f 36498/40904/37607 40055/40907/37610 40056/40908/37611 36499/40905/37608
+f 36499/40905/37608 40056/40908/37611 40186/32321/29129 36813/32320/29128
+f 36495/40903/37606 36496/40906/37609 36500/40909/37612 36497/40910/37613
+f 36497/40910/37613 36500/40909/37612 40053/40911/37601 40052/40912/37600
+f 36496/40906/37609 36812/32315/29123 36811/32314/29122 36500/40909/37612
+f 36500/40909/37612 36811/32314/29122 40185/32301/29109 40053/40911/37601
+f 36495/40903/37606 36497/40910/37613 36501/40913/37614 36498/40904/37607
+f 36498/40904/37607 36501/40913/37614 40054/40914/37615 40055/40907/37610
+f 36497/40910/37613 40052/40912/37600 40051/40915/37605 36501/40913/37614
+f 36501/40913/37614 40051/40915/37605 40732/40916/14955 40054/40914/37615
+f 36502/40917/37616 36505/40918/37617 36506/40919/37618 36503/40920/37619
+f 36503/40920/37619 36506/40919/37618 36816/32340/29148 36815/32335/29143
+f 36505/40918/37617 40058/40921/37620 40059/40922/37621 36506/40919/37618
+f 36506/40919/37618 40059/40922/37621 40187/32341/29149 36816/32340/29148
+f 36502/40917/37616 36503/40920/37619 36507/40923/37622 36504/40924/37623
+f 36504/40924/37623 36507/40923/37622 40056/40925/37611 40055/40926/37610
+f 36503/40920/37619 36815/32335/29143 36814/32334/29142 36507/40923/37622
+f 36507/40923/37622 36814/32334/29142 40186/32321/29129 40056/40925/37611
+f 36502/40917/37616 36504/40924/37623 36508/40927/37624 36505/40918/37617
+f 36505/40918/37617 36508/40927/37624 40057/40928/37625 40058/40921/37620
+f 36504/40924/37623 40055/40926/37610 40054/40929/37615 36508/40927/37624
+f 36508/40927/37624 40054/40929/37615 40732/40930/14955 40057/40928/37625
+f 36509/40931/37626 36512/40932/37627 36513/40933/37628 36510/40934/37629
+f 36510/40934/37629 36513/40933/37628 36819/32360/29168 36818/32355/29163
+f 36512/40932/37627 40061/40935/37630 40062/40936/37631 36513/40933/37628
+f 36513/40933/37628 40062/40936/37631 40188/32361/29169 36819/32360/29168
+f 36509/40931/37626 36510/40934/37629 36514/40937/37632 36511/40938/37633
+f 36511/40938/37633 36514/40937/37632 40059/40939/37621 40058/40940/37620
+f 36510/40934/37629 36818/32355/29163 36817/32354/29162 36514/40937/37632
+f 36514/40937/37632 36817/32354/29162 40187/32341/29149 40059/40939/37621
+f 36509/40931/37626 36511/40938/37633 36515/40941/37634 36512/40932/37627
+f 36512/40932/37627 36515/40941/37634 40060/40942/37635 40061/40935/37630
+f 36511/40938/37633 40058/40940/37620 40057/40943/37625 36515/40941/37634
+f 36515/40941/37634 40057/40943/37625 40732/40944/14955 40060/40942/37635
+f 36516/40945/37636 36519/40946/37637 36520/40947/37638 36517/40948/37639
+f 36517/40948/37639 36520/40947/37638 36822/32380/29188 36821/32375/29183
+f 36519/40946/37637 40064/40949/37640 40065/40950/37641 36520/40947/37638
+f 36520/40947/37638 40065/40950/37641 40189/32381/29189 36822/32380/29188
+f 36516/40945/37636 36517/40948/37639 36521/40951/37642 36518/40952/37643
+f 36518/40952/37643 36521/40951/37642 40062/40953/37631 40061/40954/37630
+f 36517/40948/37639 36821/32375/29183 36820/32374/29182 36521/40951/37642
+f 36521/40951/37642 36820/32374/29182 40188/32361/29169 40062/40953/37631
+f 36516/40945/37636 36518/40952/37643 36522/40955/37644 36519/40946/37637
+f 36519/40946/37637 36522/40955/37644 40063/40956/37645 40064/40949/37640
+f 36518/40952/37643 40061/40954/37630 40060/40957/37635 36522/40955/37644
+f 36522/40955/37644 40060/40957/37635 40732/40958/14955 40063/40956/37645
+f 36523/40959/37646 36526/40960/37647 36527/40961/37648 36524/40962/37649
+f 36524/40962/37649 36527/40961/37648 36825/32400/29208 36824/32395/29203
+f 36526/40960/37647 40067/40963/37650 40068/40964/37651 36527/40961/37648
+f 36527/40961/37648 40068/40964/37651 40190/32401/29209 36825/32400/29208
+f 36523/40959/37646 36524/40962/37649 36528/40965/37652 36525/40966/37653
+f 36525/40966/37653 36528/40965/37652 40065/40967/37641 40064/40968/37640
+f 36524/40962/37649 36824/32395/29203 36823/32394/29202 36528/40965/37652
+f 36528/40965/37652 36823/32394/29202 40189/32381/29189 40065/40967/37641
+f 36523/40959/37646 36525/40966/37653 36529/40969/37654 36526/40960/37647
+f 36526/40960/37647 36529/40969/37654 40066/40970/37655 40067/40963/37650
+f 36525/40966/37653 40064/40968/37640 40063/40971/37645 36529/40969/37654
+f 36529/40969/37654 40063/40971/37645 40732/40972/14955 40066/40970/37655
+f 36530/40973/37656 36533/40974/37657 36534/40975/37658 36531/40976/37659
+f 36531/40976/37659 36534/40975/37658 36828/32420/29228 36827/32415/29223
+f 36533/40974/37657 40070/40977/37660 40071/40978/37661 36534/40975/37658
+f 36534/40975/37658 40071/40978/37661 40191/32421/29229 36828/32420/29228
+f 36530/40973/37656 36531/40976/37659 36535/40979/37662 36532/40980/37663
+f 36532/40980/37663 36535/40979/37662 40068/40981/37651 40067/40982/37650
+f 36531/40976/37659 36827/32415/29223 36826/32414/29222 36535/40979/37662
+f 36535/40979/37662 36826/32414/29222 40190/32401/29209 40068/40981/37651
+f 36530/40973/37656 36532/40980/37663 36536/40983/37664 36533/40974/37657
+f 36533/40974/37657 36536/40983/37664 40069/40984/37665 40070/40977/37660
+f 36532/40980/37663 40067/40982/37650 40066/40985/37655 36536/40983/37664
+f 36536/40983/37664 40066/40985/37655 40732/40986/14955 40069/40984/37665
+f 36537/40987/37666 36540/40988/37667 36541/40989/37668 36538/40990/37669
+f 36538/40990/37669 36541/40989/37668 36831/32440/29248 36830/32435/29243
+f 36540/40988/37667 40073/40991/37670 40074/40992/37671 36541/40989/37668
+f 36541/40989/37668 40074/40992/37671 40192/32441/29249 36831/32440/29248
+f 36537/40987/37666 36538/40990/37669 36542/40993/37672 36539/40994/37673
+f 36539/40994/37673 36542/40993/37672 40071/40995/37661 40070/40996/37660
+f 36538/40990/37669 36830/32435/29243 36829/32434/29242 36542/40993/37672
+f 36542/40993/37672 36829/32434/29242 40191/32421/29229 40071/40995/37661
+f 36537/40987/37666 36539/40994/37673 36543/40997/37674 36540/40988/37667
+f 36540/40988/37667 36543/40997/37674 40072/40998/37675 40073/40991/37670
+f 36539/40994/37673 40070/40996/37660 40069/40999/37665 36543/40997/37674
+f 36543/40997/37674 40069/40999/37665 40732/41000/14955 40072/40998/37675
+f 36544/41001/37676 36547/41002/37677 36548/41003/37678 36545/41004/37679
+f 36545/41004/37679 36548/41003/37678 36834/32460/29268 36833/32455/29263
+f 36547/41002/37677 40076/41005/37680 40077/41006/37681 36548/41003/37678
+f 36548/41003/37678 40077/41006/37681 40193/32461/29269 36834/32460/29268
+f 36544/41001/37676 36545/41004/37679 36549/41007/37682 36546/41008/37683
+f 36546/41008/37683 36549/41007/37682 40074/41009/37671 40073/41010/37670
+f 36545/41004/37679 36833/32455/29263 36832/32454/29262 36549/41007/37682
+f 36549/41007/37682 36832/32454/29262 40192/32441/29249 40074/41009/37671
+f 36544/41001/37676 36546/41008/37683 36550/41011/37684 36547/41002/37677
+f 36547/41002/37677 36550/41011/37684 40075/41012/37685 40076/41005/37680
+f 36546/41008/37683 40073/41010/37670 40072/41013/37675 36550/41011/37684
+f 36550/41011/37684 40072/41013/37675 40732/41014/14955 40075/41012/37685
+f 36551/41015/37686 36554/41016/37687 36555/41017/37688 36552/41018/37689
+f 36552/41018/37689 36555/41017/37688 36837/32480/29288 36836/32475/29283
+f 36554/41016/37687 40079/41019/37690 40080/41020/37691 36555/41017/37688
+f 36555/41017/37688 40080/41020/37691 40194/32481/29289 36837/32480/29288
+f 36551/41015/37686 36552/41018/37689 36556/41021/37692 36553/41022/37693
+f 36553/41022/37693 36556/41021/37692 40077/41023/37681 40076/41024/37680
+f 36552/41018/37689 36836/32475/29283 36835/32474/29282 36556/41021/37692
+f 36556/41021/37692 36835/32474/29282 40193/32461/29269 40077/41023/37681
+f 36551/41015/37686 36553/41022/37693 36557/41025/37694 36554/41016/37687
+f 36554/41016/37687 36557/41025/37694 40078/41026/37695 40079/41019/37690
+f 36553/41022/37693 40076/41024/37680 40075/41027/37685 36557/41025/37694
+f 36557/41025/37694 40075/41027/37685 40732/41028/14955 40078/41026/37695
+f 36558/41029/37696 36561/41030/37697 36562/41031/37698 36559/41032/37699
+f 36559/41032/37699 36562/41031/37698 36840/32500/29308 36839/32495/29303
+f 36561/41030/37697 40082/41033/37700 40083/41034/37701 36562/41031/37698
+f 36562/41031/37698 40083/41034/37701 40195/32501/29309 36840/32500/29308
+f 36558/41029/37696 36559/41032/37699 36563/41035/37702 36560/41036/37703
+f 36560/41036/37703 36563/41035/37702 40080/41037/37691 40079/41038/37690
+f 36559/41032/37699 36839/32495/29303 36838/32494/29302 36563/41035/37702
+f 36563/41035/37702 36838/32494/29302 40194/32481/29289 40080/41037/37691
+f 36558/41029/37696 36560/41036/37703 36564/41039/37704 36561/41030/37697
+f 36561/41030/37697 36564/41039/37704 40081/41040/37705 40082/41033/37700
+f 36560/41036/37703 40079/41038/37690 40078/41041/37695 36564/41039/37704
+f 36564/41039/37704 40078/41041/37695 40732/41042/14955 40081/41040/37705
+f 36565/41043/37706 36568/41044/37707 36569/41045/37708 36566/41046/37709
+f 36566/41046/37709 36569/41045/37708 36843/32520/29328 36842/32515/29323
+f 36568/41044/37707 40085/41047/37710 40086/41048/37711 36569/41045/37708
+f 36569/41045/37708 40086/41048/37711 40196/32521/29329 36843/32520/29328
+f 36565/41043/37706 36566/41046/37709 36570/41049/37712 36567/41050/37713
+f 36567/41050/37713 36570/41049/37712 40083/41051/37701 40082/41052/37700
+f 36566/41046/37709 36842/32515/29323 36841/32514/29322 36570/41049/37712
+f 36570/41049/37712 36841/32514/29322 40195/32501/29309 40083/41051/37701
+f 36565/41043/37706 36567/41050/37713 36571/41053/37714 36568/41044/37707
+f 36568/41044/37707 36571/41053/37714 40084/41054/37715 40085/41047/37710
+f 36567/41050/37713 40082/41052/37700 40081/41055/37705 36571/41053/37714
+f 36571/41053/37714 40081/41055/37705 40732/41056/14955 40084/41054/37715
+f 36572/41057/37716 36575/41058/37717 36576/41059/37718 36573/41060/37719
+f 36573/41060/37719 36576/41059/37718 36846/32540/29348 36845/32535/29343
+f 36575/41058/37717 40088/41061/37720 40089/41062/37721 36576/41059/37718
+f 36576/41059/37718 40089/41062/37721 40197/32541/29349 36846/32540/29348
+f 36572/41057/37716 36573/41060/37719 36577/41063/37722 36574/41064/37723
+f 36574/41064/37723 36577/41063/37722 40086/41065/37711 40085/41066/37710
+f 36573/41060/37719 36845/32535/29343 36844/32534/29342 36577/41063/37722
+f 36577/41063/37722 36844/32534/29342 40196/32521/29329 40086/41065/37711
+f 36572/41057/37716 36574/41064/37723 36578/41067/37724 36575/41058/37717
+f 36575/41058/37717 36578/41067/37724 40087/41068/37725 40088/41061/37720
+f 36574/41064/37723 40085/41066/37710 40084/41069/37715 36578/41067/37724
+f 36578/41067/37724 40084/41069/37715 40732/41070/14955 40087/41068/37725
+f 36579/41071/37726 36582/41072/37727 36583/41073/37728 36580/41074/37729
+f 36580/41074/37729 36583/41073/37728 36849/32560/29368 36848/32555/29363
+f 36582/41072/37727 40091/41075/37730 40092/41076/37731 36583/41073/37728
+f 36583/41073/37728 40092/41076/37731 40198/32561/29369 36849/32560/29368
+f 36579/41071/37726 36580/41074/37729 36584/41077/37732 36581/41078/37733
+f 36581/41078/37733 36584/41077/37732 40089/41079/37721 40088/41080/37720
+f 36580/41074/37729 36848/32555/29363 36847/32554/29362 36584/41077/37732
+f 36584/41077/37732 36847/32554/29362 40197/32541/29349 40089/41079/37721
+f 36579/41071/37726 36581/41078/37733 36585/41081/37734 36582/41072/37727
+f 36582/41072/37727 36585/41081/37734 40090/41082/37735 40091/41075/37730
+f 36581/41078/37733 40088/41080/37720 40087/41083/37725 36585/41081/37734
+f 36585/41081/37734 40087/41083/37725 40732/41084/14955 40090/41082/37735
+f 36586/41085/37736 36589/41086/37737 36590/41087/37738 36587/41088/37739
+f 36587/41088/37739 36590/41087/37738 36852/32580/29388 36851/32575/29383
+f 36589/41086/37737 40094/41089/37740 40095/41090/37741 36590/41087/37738
+f 36590/41087/37738 40095/41090/37741 40199/32581/29389 36852/32580/29388
+f 36586/41085/37736 36587/41088/37739 36591/41091/37742 36588/41092/37743
+f 36588/41092/37743 36591/41091/37742 40092/41093/37731 40091/41094/37730
+f 36587/41088/37739 36851/32575/29383 36850/32574/29382 36591/41091/37742
+f 36591/41091/37742 36850/32574/29382 40198/32561/29369 40092/41093/37731
+f 36586/41085/37736 36588/41092/37743 36592/41095/37744 36589/41086/37737
+f 36589/41086/37737 36592/41095/37744 40093/41096/37745 40094/41089/37740
+f 36588/41092/37743 40091/41094/37730 40090/41097/37735 36592/41095/37744
+f 36592/41095/37744 40090/41097/37735 40732/41098/14955 40093/41096/37745
+f 36593/41099/37746 36596/41100/37747 36597/41101/37748 36594/41102/37749
+f 36594/41102/37749 36597/41101/37748 36855/32600/29408 36854/32595/29403
+f 36596/41100/37747 40097/41103/37750 40098/41104/37751 36597/41101/37748
+f 36597/41101/37748 40098/41104/37751 40200/32601/29409 36855/32600/29408
+f 36593/41099/37746 36594/41102/37749 36598/41105/37752 36595/41106/37753
+f 36595/41106/37753 36598/41105/37752 40095/41107/37741 40094/41108/37740
+f 36594/41102/37749 36854/32595/29403 36853/32594/29402 36598/41105/37752
+f 36598/41105/37752 36853/32594/29402 40199/32581/29389 40095/41107/37741
+f 36593/41099/37746 36595/41106/37753 36599/41109/37754 36596/41100/37747
+f 36596/41100/37747 36599/41109/37754 40096/41110/37755 40097/41103/37750
+f 36595/41106/37753 40094/41108/37740 40093/41111/37745 36599/41109/37754
+f 36599/41109/37754 40093/41111/37745 40732/41112/14955 40096/41110/37755
+f 36600/41113/37756 36603/41114/37757 36604/41115/37758 36601/41116/37759
+f 36601/41116/37759 36604/41115/37758 36858/32620/29428 36857/32615/29423
+f 36603/41114/37757 40100/41117/37760 40101/41118/37761 36604/41115/37758
+f 36604/41115/37758 40101/41118/37761 40201/32621/29429 36858/32620/29428
+f 36600/41113/37756 36601/41116/37759 36605/41119/37762 36602/41120/37763
+f 36602/41120/37763 36605/41119/37762 40098/41121/37751 40097/41122/37750
+f 36601/41116/37759 36857/32615/29423 36856/32614/29422 36605/41119/37762
+f 36605/41119/37762 36856/32614/29422 40200/32601/29409 40098/41121/37751
+f 36600/41113/37756 36602/41120/37763 36606/41123/37764 36603/41114/37757
+f 36603/41114/37757 36606/41123/37764 40099/41124/37765 40100/41117/37760
+f 36602/41120/37763 40097/41122/37750 40096/41125/37755 36606/41123/37764
+f 36606/41123/37764 40096/41125/37755 40732/41126/14955 40099/41124/37765
+f 36607/41127/37766 36610/41128/37767 36611/41129/37768 36608/41130/37769
+f 36608/41130/37769 36611/41129/37768 36861/32640/29448 36860/32635/29443
+f 36610/41128/37767 40103/41131/37770 40104/41132/37771 36611/41129/37768
+f 36611/41129/37768 40104/41132/37771 40202/32641/29449 36861/32640/29448
+f 36607/41127/37766 36608/41130/37769 36612/41133/37772 36609/41134/37773
+f 36609/41134/37773 36612/41133/37772 40101/41135/37761 40100/41136/37760
+f 36608/41130/37769 36860/32635/29443 36859/32634/29442 36612/41133/37772
+f 36612/41133/37772 36859/32634/29442 40201/32621/29429 40101/41135/37761
+f 36607/41127/37766 36609/41134/37773 36613/41137/37774 36610/41128/37767
+f 36610/41128/37767 36613/41137/37774 40102/41138/37775 40103/41131/37770
+f 36609/41134/37773 40100/41136/37760 40099/41139/37765 36613/41137/37774
+f 36613/41137/37774 40099/41139/37765 40732/41140/14955 40102/41138/37775
+f 36614/41141/37776 36617/41142/37777 36618/41143/37778 36615/41144/37779
+f 36615/41144/37779 36618/41143/37778 36864/32660/29468 36863/32655/29463
+f 36617/41142/37777 40106/41145/37780 40107/41146/37781 36618/41143/37778
+f 36618/41143/37778 40107/41146/37781 40203/32661/29469 36864/32660/29468
+f 36614/41141/37776 36615/41144/37779 36619/41147/37782 36616/41148/37783
+f 36616/41148/37783 36619/41147/37782 40104/41149/37771 40103/41150/37770
+f 36615/41144/37779 36863/32655/29463 36862/32654/29462 36619/41147/37782
+f 36619/41147/37782 36862/32654/29462 40202/32641/29449 40104/41149/37771
+f 36614/41141/37776 36616/41148/37783 36620/41151/37784 36617/41142/37777
+f 36617/41142/37777 36620/41151/37784 40105/41152/37785 40106/41145/37780
+f 36616/41148/37783 40103/41150/37770 40102/41153/37775 36620/41151/37784
+f 36620/41151/37784 40102/41153/37775 40732/41154/14955 40105/41152/37785
+f 36621/41155/37786 36624/41156/37787 36625/41157/37788 36622/41158/37789
+f 36622/41158/37789 36625/41157/37788 36867/32680/29486 36866/32675/29483
+f 36624/41156/37787 40037/41159/37562 40036/41160/37561 36625/41157/37788
+f 36625/41157/37788 40036/41160/37561 40180/32681/29021 36867/32680/29486
+f 36621/41155/37786 36622/41158/37789 36626/41161/37790 36623/41162/37791
+f 36623/41162/37791 36626/41161/37790 40107/41163/37781 40106/41164/37780
+f 36622/41158/37789 36866/32675/29483 36865/32674/29482 36626/41161/37790
+f 36626/41161/37790 36865/32674/29482 40203/32661/29469 40107/41163/37781
+f 36621/41155/37786 36623/41162/37791 36627/41165/37792 36624/41156/37787
+f 36624/41156/37787 36627/41165/37792 40038/41166/37565 40037/41159/37562
+f 36623/41162/37791 40106/41164/37780 40105/41167/37785 36627/41165/37792
+f 36627/41165/37792 40105/41167/37785 40732/41168/14955 40038/41166/37565
+f 36628/41169/37793 36631/41170/37794 36632/41171/37795 36629/41172/37796
+f 36629/41172/37796 36632/41171/37795 38382/40463/37187 38381/40458/37182
+f 36631/41170/37794 40109/41173/37797 40110/41174/37798 36632/41171/37795
+f 36632/41171/37795 40110/41174/37798 40708/40464/37188 38382/40463/37187
+f 36628/41169/37793 36629/41172/37796 36633/41175/37799 36630/41176/37800
+f 36630/41176/37800 36633/41175/37799 40111/41177/37801 40112/41178/37802
+f 36629/41172/37796 38381/40458/37182 38380/40457/37181 36633/41175/37799
+f 36633/41175/37799 38380/40457/37181 40709/40460/37184 40111/41177/37801
+f 36628/41169/37793 36630/41176/37800 36634/41179/37803 36631/41170/37794
+f 36631/41170/37794 36634/41179/37803 40108/41180/37804 40109/41173/37797
+f 36630/41176/37800 40112/41178/37802 40113/41181/37805 36634/41179/37803
+f 36634/41179/37803 40113/41181/37805 40733/41182/15146 40108/41180/37804
+f 36635/41183/37806 36638/41184/37807 36639/41185/37808 36636/41186/37809
+f 36636/41186/37809 36639/41185/37808 38385/40480/37204 38384/40476/37200
+f 36638/41184/37807 40112/41187/37802 40111/41188/37801 36639/41185/37808
+f 36639/41185/37808 40111/41188/37801 40709/40460/37184 38385/40480/37204
+f 36635/41183/37806 36636/41186/37809 36640/41189/37810 36637/41190/37811
+f 36637/41190/37811 36640/41189/37810 40114/41191/37812 40115/41192/37813
+f 36636/41186/37809 38384/40476/37200 38383/40475/37199 36640/41189/37810
+f 36640/41189/37810 38383/40475/37199 40710/40478/37202 40114/41191/37812
+f 36635/41183/37806 36637/41190/37811 36641/41193/37814 36638/41184/37807
+f 36638/41184/37807 36641/41193/37814 40113/41194/37805 40112/41187/37802
+f 36637/41190/37811 40115/41192/37813 40116/41195/37815 36641/41193/37814
+f 36641/41193/37814 40116/41195/37815 40733/41196/15146 40113/41194/37805
+f 36642/41197/37816 36645/41198/37817 36646/41199/37818 36643/41200/37819
+f 36643/41200/37819 36646/41199/37818 38388/40496/37220 38387/40492/37216
+f 36645/41198/37817 40115/41201/37813 40114/41202/37812 36646/41199/37818
+f 36646/41199/37818 40114/41202/37812 40710/40478/37202 38388/40496/37220
+f 36642/41197/37816 36643/41200/37819 36647/41203/37820 36644/41204/37821
+f 36644/41204/37821 36647/41203/37820 40117/41205/37822 40118/41206/37823
+f 36643/41200/37819 38387/40492/37216 38386/40491/37215 36647/41203/37820
+f 36647/41203/37820 38386/40491/37215 40711/40494/37218 40117/41205/37822
+f 36642/41197/37816 36644/41204/37821 36648/41207/37824 36645/41198/37817
+f 36645/41198/37817 36648/41207/37824 40116/41208/37815 40115/41201/37813
+f 36644/41204/37821 40118/41206/37823 40119/41209/37825 36648/41207/37824
+f 36648/41207/37824 40119/41209/37825 40733/41210/15146 40116/41208/37815
+f 36649/41211/37826 36652/41212/37827 36653/41213/37828 36650/41214/37829
+f 36650/41214/37829 36653/41213/37828 38391/40512/37236 38390/40508/37232
+f 36652/41212/37827 40118/41215/37823 40117/41216/37822 36653/41213/37828
+f 36653/41213/37828 40117/41216/37822 40711/40494/37218 38391/40512/37236
+f 36649/41211/37826 36650/41214/37829 36654/41217/37830 36651/41218/37831
+f 36651/41218/37831 36654/41217/37830 40120/41219/37832 40121/41220/37833
+f 36650/41214/37829 38390/40508/37232 38389/40507/37231 36654/41217/37830
+f 36654/41217/37830 38389/40507/37231 40712/40510/37234 40120/41219/37832
+f 36649/41211/37826 36651/41218/37831 36655/41221/37834 36652/41212/37827
+f 36652/41212/37827 36655/41221/37834 40119/41222/37825 40118/41215/37823
+f 36651/41218/37831 40121/41220/37833 40122/41223/37835 36655/41221/37834
+f 36655/41221/37834 40122/41223/37835 40733/41224/15146 40119/41222/37825
+f 36656/41225/37836 36659/41226/37837 36660/41227/37838 36657/41228/37839
+f 36657/41228/37839 36660/41227/37838 38394/40528/37252 38393/40524/37248
+f 36659/41226/37837 40121/41229/37833 40120/41230/37832 36660/41227/37838
+f 36660/41227/37838 40120/41230/37832 40712/40510/37234 38394/40528/37252
+f 36656/41225/37836 36657/41228/37839 36661/41231/37840 36658/41232/37841
+f 36658/41232/37841 36661/41231/37840 40123/41233/37842 40124/41234/37843
+f 36657/41228/37839 38393/40524/37248 38392/40523/37247 36661/41231/37840
+f 36661/41231/37840 38392/40523/37247 40713/40526/37250 40123/41233/37842
+f 36656/41225/37836 36658/41232/37841 36662/41235/37844 36659/41226/37837
+f 36659/41226/37837 36662/41235/37844 40122/41236/37835 40121/41229/37833
+f 36658/41232/37841 40124/41234/37843 40125/41237/37845 36662/41235/37844
+f 36662/41235/37844 40125/41237/37845 40733/41238/15146 40122/41236/37835
+f 36663/41239/37846 36666/41240/37847 36667/41241/37848 36664/41242/37849
+f 36664/41242/37849 36667/41241/37848 38397/40544/37268 38396/40540/37264
+f 36666/41240/37847 40124/41243/37843 40123/41244/37842 36667/41241/37848
+f 36667/41241/37848 40123/41244/37842 40713/40526/37250 38397/40544/37268
+f 36663/41239/37846 36664/41242/37849 36668/41245/37850 36665/41246/37851
+f 36665/41246/37851 36668/41245/37850 40126/41247/37852 40127/41248/37853
+f 36664/41242/37849 38396/40540/37264 38395/40539/37263 36668/41245/37850
+f 36668/41245/37850 38395/40539/37263 40714/40542/37266 40126/41247/37852
+f 36663/41239/37846 36665/41246/37851 36669/41249/37854 36666/41240/37847
+f 36666/41240/37847 36669/41249/37854 40125/41250/37845 40124/41243/37843
+f 36665/41246/37851 40127/41248/37853 40128/41251/37855 36669/41249/37854
+f 36669/41249/37854 40128/41251/37855 40733/41252/15146 40125/41250/37845
+f 36670/41253/37856 36673/41254/37857 36674/41255/37858 36671/41256/37859
+f 36671/41256/37859 36674/41255/37858 38400/40560/37284 38399/40556/37280
+f 36673/41254/37857 40127/41257/37853 40126/41258/37852 36674/41255/37858
+f 36674/41255/37858 40126/41258/37852 40714/40542/37266 38400/40560/37284
+f 36670/41253/37856 36671/41256/37859 36675/41259/37860 36672/41260/37861
+f 36672/41260/37861 36675/41259/37860 40129/41261/37862 40130/41262/37863
+f 36671/41256/37859 38399/40556/37280 38398/40555/37279 36675/41259/37860
+f 36675/41259/37860 38398/40555/37279 40715/40558/37282 40129/41261/37862
+f 36670/41253/37856 36672/41260/37861 36676/41263/37864 36673/41254/37857
+f 36673/41254/37857 36676/41263/37864 40128/41264/37855 40127/41257/37853
+f 36672/41260/37861 40130/41262/37863 40131/41265/37865 36676/41263/37864
+f 36676/41263/37864 40131/41265/37865 40733/41266/15146 40128/41264/37855
+f 36677/41267/37866 36680/41268/37867 36681/41269/37868 36678/41270/37869
+f 36678/41270/37869 36681/41269/37868 38403/40576/37300 38402/40572/37296
+f 36680/41268/37867 40130/41271/37863 40129/41272/37862 36681/41269/37868
+f 36681/41269/37868 40129/41272/37862 40715/40558/37282 38403/40576/37300
+f 36677/41267/37866 36678/41270/37869 36682/41273/37870 36679/41274/37871
+f 36679/41274/37871 36682/41273/37870 40132/41275/37872 40133/41276/37873
+f 36678/41270/37869 38402/40572/37296 38401/40571/37295 36682/41273/37870
+f 36682/41273/37870 38401/40571/37295 40716/40574/37298 40132/41275/37872
+f 36677/41267/37866 36679/41274/37871 36683/41277/37874 36680/41268/37867
+f 36680/41268/37867 36683/41277/37874 40131/41278/37865 40130/41271/37863
+f 36679/41274/37871 40133/41276/37873 40134/41279/37875 36683/41277/37874
+f 36683/41277/37874 40134/41279/37875 40733/41280/15146 40131/41278/37865
+f 36684/41281/37876 36687/41282/37877 36688/41283/37878 36685/41284/37879
+f 36685/41284/37879 36688/41283/37878 38406/40592/37316 38405/40588/37312
+f 36687/41282/37877 40133/41285/37873 40132/41286/37872 36688/41283/37878
+f 36688/41283/37878 40132/41286/37872 40716/40574/37298 38406/40592/37316
+f 36684/41281/37876 36685/41284/37879 36689/41287/37880 36686/41288/37881
+f 36686/41288/37881 36689/41287/37880 40135/41289/37882 40136/41290/37883
+f 36685/41284/37879 38405/40588/37312 38404/40587/37311 36689/41287/37880
+f 36689/41287/37880 38404/40587/37311 40717/40590/37314 40135/41289/37882
+f 36684/41281/37876 36686/41288/37881 36690/41291/37884 36687/41282/37877
+f 36687/41282/37877 36690/41291/37884 40134/41292/37875 40133/41285/37873
+f 36686/41288/37881 40136/41290/37883 40137/41293/37885 36690/41291/37884
+f 36690/41291/37884 40137/41293/37885 40733/41294/15146 40134/41292/37875
+f 36691/41295/37886 36694/41296/37887 36695/41297/37888 36692/41298/37889
+f 36692/41298/37889 36695/41297/37888 38409/40608/37332 38408/40604/37328
+f 36694/41296/37887 40136/41299/37883 40135/41300/37882 36695/41297/37888
+f 36695/41297/37888 40135/41300/37882 40717/40590/37314 38409/40608/37332
+f 36691/41295/37886 36692/41298/37889 36696/41301/37890 36693/41302/37891
+f 36693/41302/37891 36696/41301/37890 40138/41303/37892 40139/41304/37893
+f 36692/41298/37889 38408/40604/37328 38407/40603/37327 36696/41301/37890
+f 36696/41301/37890 38407/40603/37327 40718/40606/37330 40138/41303/37892
+f 36691/41295/37886 36693/41302/37891 36697/41305/37894 36694/41296/37887
+f 36694/41296/37887 36697/41305/37894 40137/41306/37885 40136/41299/37883
+f 36693/41302/37891 40139/41304/37893 40140/41307/37895 36697/41305/37894
+f 36697/41305/37894 40140/41307/37895 40733/41308/15146 40137/41306/37885
+f 36698/41309/37896 36701/41310/37897 36702/41311/37898 36699/41312/37899
+f 36699/41312/37899 36702/41311/37898 38412/40624/37348 38411/40620/37344
+f 36701/41310/37897 40139/41313/37893 40138/41314/37892 36702/41311/37898
+f 36702/41311/37898 40138/41314/37892 40718/40606/37330 38412/40624/37348
+f 36698/41309/37896 36699/41312/37899 36703/41315/37900 36700/41316/37901
+f 36700/41316/37901 36703/41315/37900 40141/41317/37902 40142/41318/37903
+f 36699/41312/37899 38411/40620/37344 38410/40619/37343 36703/41315/37900
+f 36703/41315/37900 38410/40619/37343 40719/40622/37346 40141/41317/37902
+f 36698/41309/37896 36700/41316/37901 36704/41319/37904 36701/41310/37897
+f 36701/41310/37897 36704/41319/37904 40140/41320/37895 40139/41313/37893
+f 36700/41316/37901 40142/41318/37903 40143/41321/37905 36704/41319/37904
+f 36704/41319/37904 40143/41321/37905 40733/41322/15146 40140/41320/37895
+f 36705/41323/37906 36708/41324/37907 36709/41325/37908 36706/41326/37909
+f 36706/41326/37909 36709/41325/37908 38415/40640/37364 38414/40636/37360
+f 36708/41324/37907 40142/41327/37903 40141/41328/37902 36709/41325/37908
+f 36709/41325/37908 40141/41328/37902 40719/40622/37346 38415/40640/37364
+f 36705/41323/37906 36706/41326/37909 36710/41329/37910 36707/41330/37911
+f 36707/41330/37911 36710/41329/37910 40144/41331/37912 40145/41332/37913
+f 36706/41326/37909 38414/40636/37360 38413/40635/37359 36710/41329/37910
+f 36710/41329/37910 38413/40635/37359 40720/40638/37362 40144/41331/37912
+f 36705/41323/37906 36707/41330/37911 36711/41333/37914 36708/41324/37907
+f 36708/41324/37907 36711/41333/37914 40143/41334/37905 40142/41327/37903
+f 36707/41330/37911 40145/41332/37913 40146/41335/37915 36711/41333/37914
+f 36711/41333/37914 40146/41335/37915 40733/41336/15146 40143/41334/37905
+f 36712/41337/37916 36715/41338/37917 36716/41339/37918 36713/41340/37919
+f 36713/41340/37919 36716/41339/37918 38418/40656/37380 38417/40652/37376
+f 36715/41338/37917 40145/41341/37913 40144/41342/37912 36716/41339/37918
+f 36716/41339/37918 40144/41342/37912 40720/40638/37362 38418/40656/37380
+f 36712/41337/37916 36713/41340/37919 36717/41343/37920 36714/41344/37921
+f 36714/41344/37921 36717/41343/37920 40147/41345/37922 40148/41346/37923
+f 36713/41340/37919 38417/40652/37376 38416/40651/37375 36717/41343/37920
+f 36717/41343/37920 38416/40651/37375 40721/40654/37378 40147/41345/37922
+f 36712/41337/37916 36714/41344/37921 36718/41347/37924 36715/41338/37917
+f 36715/41338/37917 36718/41347/37924 40146/41348/37915 40145/41341/37913
+f 36714/41344/37921 40148/41346/37923 40149/41349/37925 36718/41347/37924
+f 36718/41347/37924 40149/41349/37925 40733/41350/15146 40146/41348/37915
+f 36719/41351/37926 36722/41352/37927 36723/41353/37928 36720/41354/37929
+f 36720/41354/37929 36723/41353/37928 38421/40672/37396 38420/40668/37392
+f 36722/41352/37927 40148/41355/37923 40147/41356/37922 36723/41353/37928
+f 36723/41353/37928 40147/41356/37922 40721/40654/37378 38421/40672/37396
+f 36719/41351/37926 36720/41354/37929 36724/41357/37930 36721/41358/37931
+f 36721/41358/37931 36724/41357/37930 40150/41359/37932 40151/41360/37933
+f 36720/41354/37929 38420/40668/37392 38419/40667/37391 36724/41357/37930
+f 36724/41357/37930 38419/40667/37391 40722/40670/37394 40150/41359/37932
+f 36719/41351/37926 36721/41358/37931 36725/41361/37934 36722/41352/37927
+f 36722/41352/37927 36725/41361/37934 40149/41362/37925 40148/41355/37923
+f 36721/41358/37931 40151/41360/37933 40152/41363/37935 36725/41361/37934
+f 36725/41361/37934 40152/41363/37935 40733/41364/15146 40149/41362/37925
+f 36726/41365/37936 36729/41366/37937 36730/41367/37938 36727/41368/37939
+f 36727/41368/37939 36730/41367/37938 38424/40688/37412 38423/40684/37408
+f 36729/41366/37937 40151/41369/37933 40150/41370/37932 36730/41367/37938
+f 36730/41367/37938 40150/41370/37932 40722/40670/37394 38424/40688/37412
+f 36726/41365/37936 36727/41368/37939 36731/41371/37940 36728/41372/37941
+f 36728/41372/37941 36731/41371/37940 40153/41373/37942 40154/41374/37943
+f 36727/41368/37939 38423/40684/37408 38422/40683/37407 36731/41371/37940
+f 36731/41371/37940 38422/40683/37407 40723/40686/37410 40153/41373/37942
+f 36726/41365/37936 36728/41372/37941 36732/41375/37944 36729/41366/37937
+f 36729/41366/37937 36732/41375/37944 40152/41376/37935 40151/41369/37933
+f 36728/41372/37941 40154/41374/37943 40155/41377/37945 36732/41375/37944
+f 36732/41375/37944 40155/41377/37945 40733/41378/15146 40152/41376/37935
+f 36733/41379/37946 36736/41380/37947 36737/41381/37948 36734/41382/37949
+f 36734/41382/37949 36737/41381/37948 38427/40704/37428 38426/40700/37424
+f 36736/41380/37947 40154/14151/37943 40153/41383/37942 36737/41381/37948
+f 36737/41381/37948 40153/41383/37942 40723/40686/37410 38427/40704/37428
+f 36733/41379/37946 36734/41382/37949 36738/41384/37950 36735/41385/37951
+f 36735/41385/37951 36738/41384/37950 40156/41386/37952 40157/41387/37953
+f 36734/41382/37949 38426/40700/37424 38425/40699/37423 36738/41384/37950
+f 36738/41384/37950 38425/40699/37423 40724/40702/37426 40156/41386/37952
+f 36733/41379/37946 36735/41385/37951 36739/41388/37954 36736/41380/37947
+f 36736/41380/37947 36739/41388/37954 40155/41389/37945 40154/14151/37943
+f 36735/41385/37951 40157/41387/37953 40158/41390/37955 36739/41388/37954
+f 36739/41388/37954 40158/41390/37955 40733/41391/15146 40155/41389/37945
+f 36740/41392/37956 36743/41393/37957 36744/41394/37958 36741/41395/37959
+f 36741/41395/37959 36744/41394/37958 38430/40720/37444 38429/40716/37440
+f 36743/41393/37957 40157/41396/37953 40156/41397/37952 36744/41394/37958
+f 36744/41394/37958 40156/41397/37952 40724/40702/37426 38430/40720/37444
+f 36740/41392/37956 36741/41395/37959 36745/41398/37960 36742/41399/37961
+f 36742/41399/37961 36745/41398/37960 40159/41400/37962 40160/41401/37963
+f 36741/41395/37959 38429/40716/37440 38428/40715/37439 36745/41398/37960
+f 36745/41398/37960 38428/40715/37439 40725/40718/37442 40159/41400/37962
+f 36740/41392/37956 36742/41399/37961 36746/41402/37964 36743/41393/37957
+f 36743/41393/37957 36746/41402/37964 40158/41403/37955 40157/41396/37953
+f 36742/41399/37961 40160/41401/37963 40161/41404/37965 36746/41402/37964
+f 36746/41402/37964 40161/41404/37965 40733/41405/15146 40158/41403/37955
+f 36747/41406/37966 36750/41407/37967 36751/41408/37968 36748/41409/37969
+f 36748/41409/37969 36751/41408/37968 38433/40736/37460 38432/40732/37456
+f 36750/41407/37967 40160/41410/37963 40159/41411/37962 36751/41408/37968
+f 36751/41408/37968 40159/41411/37962 40725/40718/37442 38433/40736/37460
+f 36747/41406/37966 36748/41409/37969 36752/41412/37970 36749/41413/37971
+f 36749/41413/37971 36752/41412/37970 40162/41414/37972 40163/41415/37973
+f 36748/41409/37969 38432/40732/37456 38431/40731/37455 36752/41412/37970
+f 36752/41412/37970 38431/40731/37455 40726/40734/37458 40162/41414/37972
+f 36747/41406/37966 36749/41413/37971 36753/41416/37974 36750/41407/37967
+f 36750/41407/37967 36753/41416/37974 40161/41417/37965 40160/41410/37963
+f 36749/41413/37971 40163/41415/37973 40164/41418/37975 36753/41416/37974
+f 36753/41416/37974 40164/41418/37975 40733/41419/15146 40161/41417/37965
+f 36754/41420/37976 36757/41421/37977 36758/41422/37978 36755/41423/37979
+f 36755/41423/37979 36758/41422/37978 38436/40752/37476 38435/40748/37472
+f 36757/41421/37977 40163/41424/37973 40162/41425/37972 36758/41422/37978
+f 36758/41422/37978 40162/41425/37972 40726/40734/37458 38436/40752/37476
+f 36754/41420/37976 36755/41423/37979 36759/41426/37980 36756/41427/37981
+f 36756/41427/37981 36759/41426/37980 40165/41428/37982 40166/41429/37983
+f 36755/41423/37979 38435/40748/37472 38434/40747/37471 36759/41426/37980
+f 36759/41426/37980 38434/40747/37471 40727/40750/37474 40165/41428/37982
+f 36754/41420/37976 36756/41427/37981 36760/41430/37984 36757/41421/37977
+f 36757/41421/37977 36760/41430/37984 40164/41431/37975 40163/41424/37973
+f 36756/41427/37981 40166/41429/37983 40167/41432/37985 36760/41430/37984
+f 36760/41430/37984 40167/41432/37985 40733/41433/15146 40164/41431/37975
+f 36761/41434/37986 36764/41435/37987 36765/41436/37988 36762/41437/37989
+f 36762/41437/37989 36765/41436/37988 38439/40768/37492 38438/40764/37488
+f 36764/41435/37987 40166/41438/37983 40165/41439/37982 36765/41436/37988
+f 36765/41436/37988 40165/41439/37982 40727/40750/37474 38439/40768/37492
+f 36761/41434/37986 36762/41437/37989 36766/41440/37990 36763/41441/37991
+f 36763/41441/37991 36766/41440/37990 40168/41442/37992 40169/41443/37993
+f 36762/41437/37989 38438/40764/37488 38437/40763/37487 36766/41440/37990
+f 36766/41440/37990 38437/40763/37487 40728/40766/37490 40168/41442/37992
+f 36761/41434/37986 36763/41441/37991 36767/41444/37994 36764/41435/37987
+f 36764/41435/37987 36767/41444/37994 40167/41445/37985 40166/41438/37983
+f 36763/41441/37991 40169/41443/37993 40170/41446/37995 36767/41444/37994
+f 36767/41444/37994 40170/41446/37995 40733/41447/15146 40167/41445/37985
+f 36768/41448/37996 36771/41449/37997 36772/41450/37998 36769/41451/37999
+f 36769/41451/37999 36772/41450/37998 38442/40784/37508 38441/40780/37504
+f 36771/41449/37997 40169/41452/37993 40168/41453/37992 36772/41450/37998
+f 36772/41450/37998 40168/41453/37992 40728/40766/37490 38442/40784/37508
+f 36768/41448/37996 36769/41451/37999 36773/41454/38000 36770/41455/38001
+f 36770/41455/38001 36773/41454/38000 40171/41456/38002 40172/41457/38003
+f 36769/41451/37999 38441/40780/37504 38440/40779/37503 36773/41454/38000
+f 36773/41454/38000 38440/40779/37503 40729/40782/37506 40171/41456/38002
+f 36768/41448/37996 36770/41455/38001 36774/41458/38004 36771/41449/37997
+f 36771/41449/37997 36774/41458/38004 40170/41459/37995 40169/41452/37993
+f 36770/41455/38001 40172/41457/38003 40173/41460/38005 36774/41458/38004
+f 36774/41458/38004 40173/41460/38005 40733/41461/15146 40170/41459/37995
+f 36775/41462/38006 36778/41463/38007 36779/41464/38008 36776/41465/38009
+f 36776/41465/38009 36779/41464/38008 38445/40800/37524 38444/40796/37520
+f 36778/41463/38007 40172/41466/38003 40171/41467/38002 36779/41464/38008
+f 36779/41464/38008 40171/41467/38002 40729/40782/37506 38445/40800/37524
+f 36775/41462/38006 36776/41465/38009 36780/41468/38010 36777/41469/38011
+f 36777/41469/38011 36780/41468/38010 40174/41470/38012 40175/41471/38013
+f 36776/41465/38009 38444/40796/37520 38443/40795/37519 36780/41468/38010
+f 36780/41468/38010 38443/40795/37519 40730/40798/37522 40174/41470/38012
+f 36775/41462/38006 36777/41469/38011 36781/41472/38014 36778/41463/38007
+f 36778/41463/38007 36781/41472/38014 40173/41473/38005 40172/41466/38003
+f 36777/41469/38011 40175/41471/38013 40176/41474/38015 36781/41472/38014
+f 36781/41472/38014 40176/41474/38015 40733/41475/15146 40173/41473/38005
+f 36782/41476/38016 36785/41477/38017 36786/41478/38018 36783/41479/38019
+f 36783/41479/38019 36786/41478/38018 38448/40816/37540 38447/40812/37536
+f 36785/41477/38017 40175/41480/38013 40174/41481/38012 36786/41478/38018
+f 36786/41478/38018 40174/41481/38012 40730/40798/37522 38448/40816/37540
+f 36782/41476/38016 36783/41479/38019 36787/41482/38020 36784/41483/38021
+f 36784/41483/38021 36787/41482/38020 40177/41484/38022 40178/41485/38023
+f 36783/41479/38019 38447/40812/37536 38446/40811/37535 36787/41482/38020
+f 36787/41482/38020 38446/40811/37535 40731/40814/37538 40177/41484/38022
+f 36782/41476/38016 36784/41483/38021 36788/41486/38024 36785/41477/38017
+f 36785/41477/38017 36788/41486/38024 40176/41487/38015 40175/41480/38013
+f 36784/41483/38021 40178/41485/38023 40179/41488/38025 36788/41486/38024
+f 36788/41486/38024 40179/41488/38025 40733/41489/15146 40176/41487/38015
+f 36789/41490/38026 36792/41491/38027 36793/41492/38028 36790/41493/38029
+f 36790/41493/38029 36793/41492/38028 38451/40832/37552 38450/40828/37550
+f 36792/41491/38027 40178/41494/38023 40177/41495/38022 36793/41492/38028
+f 36793/41492/38028 40177/41495/38022 40731/40814/37538 38451/40832/37552
+f 36789/41490/38026 36790/41493/38029 36794/41496/38030 36791/41497/38031
+f 36791/41497/38031 36794/41496/38030 40110/41498/37798 40109/41499/37797
+f 36790/41493/38029 38450/40828/37550 38449/40827/37549 36794/41496/38030
+f 36794/41496/38030 38449/40827/37549 40708/40830/37188 40110/41498/37798
+f 36789/41490/38026 36791/41497/38031 36795/41500/38032 36792/41491/38027
+f 36792/41491/38027 36795/41500/38032 40179/41501/38025 40178/41494/38023
+f 36791/41497/38031 40109/41499/37797 40108/41502/37804 36795/41500/38032
+f 36795/41500/38032 40108/41502/37804 40733/41503/15146 40179/41501/38025
diff --git a/3rdparty/bgfx/examples/common/aviwriter.h b/3rdparty/bgfx/examples/common/aviwriter.h
index 1737544a0f3..79acd7e4df9 100644
--- a/3rdparty/bgfx/examples/common/aviwriter.h
+++ b/3rdparty/bgfx/examples/common/aviwriter.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#ifndef AVIWRITER_H_HEADER_GUARD
@@ -63,7 +63,7 @@ struct AviWriter
bx::write(m_writer, UINT32_C(0) ); // dwMicroSecPerFrame
bx::write(m_writer, UINT32_C(0) ); // dwMaxBytesPerSec
bx::write(m_writer, UINT32_C(0) ); // dwPaddingGranularity
- bx::write(m_writer, UINT32_C(0x101) ); // dwFlags
+ bx::write(m_writer, UINT32_C(0x110) ); // dwFlags
m_totalFramesOffset = m_writer->seek();
bx::write(m_writer, UINT32_C(0) ); // dwTotalFrames
@@ -89,8 +89,8 @@ struct AviWriter
bx::write(m_writer, BX_MAKEFOURCC('v', 'i', 'd', 's') ); // fccType
bx::write(m_writer, BX_MAKEFOURCC('D', 'I', 'B', ' ') ); // fccHandler
bx::write(m_writer, UINT32_C(0) ); // dwFlags
- bx::write(m_writer, UINT16_C(0) ); // wPriority
- bx::write(m_writer, UINT16_C(0) ); // wLanguage
+ bx::write(m_writer, uint16_t(0) ); // wPriority
+ bx::write(m_writer, uint16_t(0) ); // wLanguage
bx::write(m_writer, UINT32_C(0) ); // dwInitialFrames
bx::write(m_writer, UINT32_C(1) ); // dwScale
bx::write(m_writer, _fps); // dwRate
@@ -102,8 +102,8 @@ struct AviWriter
bx::write(m_writer, m_frameSize); // dwSuggestedBufferSize
bx::write(m_writer, UINT32_MAX); // dwQuality
bx::write(m_writer, UINT32_C(0) ); // dwSampleSize
- bx::write(m_writer, INT16_C(0) ); // rcFrame.left
- bx::write(m_writer, INT16_C(0) ); // rcFrame.top
+ bx::write(m_writer, int16_t(0) ); // rcFrame.left
+ bx::write(m_writer, int16_t(0) ); // rcFrame.top
bx::write(m_writer, uint16_t(_width) ); // rcFrame.right
bx::write(m_writer, uint16_t(_height) );// rcFrame.bottom
@@ -114,8 +114,8 @@ struct AviWriter
bx::write(m_writer, UINT32_C(40) ); // biSize
bx::write(m_writer, _width); // biWidth
bx::write(m_writer, _height); // biHeight
- bx::write(m_writer, UINT16_C(1) ); // biPlanes
- bx::write(m_writer, UINT16_C(24) ); // biBitCount
+ bx::write(m_writer, uint16_t(1) ); // biPlanes
+ bx::write(m_writer, uint16_t(24) ); // biBitCount
bx::write(m_writer, UINT32_C(0) ); // biCompression
bx::write(m_writer, m_frameSize); // biSizeImage
bx::write(m_writer, UINT32_C(0) ); // biXPelsPerMeter
diff --git a/3rdparty/bgfx/examples/common/bgfx_utils.cpp b/3rdparty/bgfx/examples/common/bgfx_utils.cpp
index b1897c8f592..cdec2abbdfc 100644
--- a/3rdparty/bgfx/examples/common/bgfx_utils.cpp
+++ b/3rdparty/bgfx/examples/common/bgfx_utils.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include <string.h> // strlen
@@ -22,7 +22,7 @@ namespace stl = tinystl;
#include "bgfx_utils.h"
-void* load(bx::FileReaderI* _reader, bx::ReallocatorI* _allocator, const char* _filePath, uint32_t* _size)
+void* load(bx::FileReaderI* _reader, bx::AllocatorI* _allocator, const char* _filePath, uint32_t* _size)
{
if (0 == bx::open(_reader, _filePath) )
{
@@ -36,6 +36,10 @@ void* load(bx::FileReaderI* _reader, bx::ReallocatorI* _allocator, const char* _
}
return data;
}
+ else
+ {
+ DBG("Failed to open: %s.", _filePath);
+ }
if (NULL != _size)
{
@@ -66,10 +70,11 @@ static const bgfx::Memory* loadMem(bx::FileReaderI* _reader, const char* _filePa
return mem;
}
+ DBG("Failed to load %s.", _filePath);
return NULL;
}
-static void* loadMem(bx::FileReaderI* _reader, bx::ReallocatorI* _allocator, const char* _filePath, uint32_t* _size)
+static void* loadMem(bx::FileReaderI* _reader, bx::AllocatorI* _allocator, const char* _filePath, uint32_t* _size)
{
if (0 == bx::open(_reader, _filePath) )
{
@@ -85,6 +90,7 @@ static void* loadMem(bx::FileReaderI* _reader, bx::ReallocatorI* _allocator, con
return data;
}
+ DBG("Failed to load %s.", _filePath);
return NULL;
}
@@ -175,7 +181,7 @@ bgfx::TextureHandle loadTexture(bx::FileReaderI* _reader, const char* _name, uin
}
bgfx::TextureHandle handle = BGFX_INVALID_HANDLE;
- bx::ReallocatorI* allocator = entry::getAllocator();
+ bx::AllocatorI* allocator = entry::getAllocator();
uint32_t size = 0;
void* data = loadMem(_reader, allocator, filePath, &size);
@@ -399,7 +405,7 @@ struct Mesh
Group group;
- bx::ReallocatorI* allocator = entry::getAllocator();
+ bx::AllocatorI* allocator = entry::getAllocator();
uint32_t chunk;
while (4 == bx::read(_reader, chunk) )
diff --git a/3rdparty/bgfx/examples/common/bgfx_utils.h b/3rdparty/bgfx/examples/common/bgfx_utils.h
index a2427e51182..f9037da53ac 100644
--- a/3rdparty/bgfx/examples/common/bgfx_utils.h
+++ b/3rdparty/bgfx/examples/common/bgfx_utils.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#ifndef BGFX_UTILS_H_HEADER_GUARD
diff --git a/3rdparty/bgfx/examples/common/bounds.cpp b/3rdparty/bgfx/examples/common/bounds.cpp
index 8fc91b63e99..d2228e7eb63 100644
--- a/3rdparty/bgfx/examples/common/bounds.cpp
+++ b/3rdparty/bgfx/examples/common/bounds.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include <bx/rng.h>
@@ -21,16 +21,9 @@ void aabbToObb(Obb& _obb, const Aabb& _aabb)
void sphereToAabb(Aabb& _aabb, const Sphere& _sphere)
{
- float xx = _sphere.m_center[0];
- float yy = _sphere.m_center[1];
- float zz = _sphere.m_center[2];
float radius = _sphere.m_radius;
- _aabb.m_min[0] = xx - radius;
- _aabb.m_min[1] = yy - radius;
- _aabb.m_min[2] = zz - radius;
- _aabb.m_max[0] = xx + radius;
- _aabb.m_max[1] = yy + radius;
- _aabb.m_max[2] = zz + radius;
+ bx::vec3Sub(_aabb.m_min, _sphere.m_center, radius);
+ bx::vec3Add(_aabb.m_max, _sphere.m_center, radius);
}
void aabbTransformToObb(Obb& _obb, const Aabb& _aabb, const float* _mtx)
@@ -129,7 +122,7 @@ void aabbExpand(Aabb& _aabb, float _factor)
_aabb.m_max[2] += _factor;
}
-uint32_t aabbOverlapTest(Aabb& _aabb0, Aabb& _aabb1)
+uint32_t aabbOverlapTest(const Aabb& _aabb0, const Aabb& _aabb1)
{
const uint32_t ltMinX = _aabb0.m_max[0] < _aabb1.m_min[0];
const uint32_t gtMaxX = _aabb0.m_min[0] > _aabb1.m_max[0];
@@ -222,9 +215,7 @@ void calcMaxBoundingSphere(Sphere& _sphere, const void* _vertices, uint32_t _num
maxDistSq = bx::fmax(distSq, maxDistSq);
}
- _sphere.m_center[0] = center[0];
- _sphere.m_center[1] = center[1];
- _sphere.m_center[2] = center[2];
+ bx::vec3Move(_sphere.m_center, center);
_sphere.m_radius = sqrtf(maxDistSq);
}
@@ -236,9 +227,7 @@ void calcMinBoundingSphere(Sphere& _sphere, const void* _vertices, uint32_t _num
float center[3];
float* position = (float*)&vertex[0];
- center[0] = position[0];
- center[1] = position[1];
- center[2] = position[2];
+ bx::vec3Move(center, position);
position = (float*)&vertex[1*_stride];
center[0] += position[0];
@@ -257,7 +246,7 @@ void calcMinBoundingSphere(Sphere& _sphere, const void* _vertices, uint32_t _num
float radiusStep = _step * 0.37f;
bool done;
- do
+ do
{
done = true;
for (uint32_t ii = 0, index = rng.gen()%_numVertices; ii < _numVertices; ++ii, index = (index + 1)%_numVertices)
@@ -284,8 +273,329 @@ void calcMinBoundingSphere(Sphere& _sphere, const void* _vertices, uint32_t _num
} while (!done);
- _sphere.m_center[0] = center[0];
- _sphere.m_center[1] = center[1];
- _sphere.m_center[2] = center[2];
- _sphere.m_radius = sqrtf(maxDistSq);
+ bx::vec3Move(_sphere.m_center, center);
+ _sphere.m_radius = bx::fsqrt(maxDistSq);
+}
+
+Ray makeRay(float _x, float _y, const float* _invVp)
+{
+ Ray ray;
+
+ const float near[3] = { _x, _y, 0.0f };
+ bx::vec3MulMtxH(ray.m_pos, near, _invVp);
+
+ float tmp[3];
+ const float far[3] = { _x, _y, 1.0f };
+ bx::vec3MulMtxH(tmp, far, _invVp);
+
+ float dir[3];
+ bx::vec3Sub(dir, tmp, ray.m_pos);
+ bx::vec3Norm(ray.m_dir, dir);
+
+ return ray;
+}
+
+inline void getPointAt(float* _result, const Ray& _ray, float _t)
+{
+ float tmp[3];
+ bx::vec3Mul(tmp, _ray.m_dir, _t);
+ bx::vec3Add(_result, _ray.m_pos, tmp);
+}
+
+bool intersect(const Ray& _ray, const Aabb& _aabb, Intersection* _intersection)
+{
+ float invDir[3];
+ bx::vec3Rcp(invDir, _ray.m_dir);
+
+ float tmp[3];
+
+ float t0[3];
+ bx::vec3Sub(tmp, _aabb.m_min, _ray.m_pos);
+ bx::vec3Mul(t0, tmp, invDir);
+
+ float t1[3];
+ bx::vec3Sub(tmp, _aabb.m_max, _ray.m_pos);
+ bx::vec3Mul(t1, tmp, invDir);
+
+ float min[3];
+ bx::vec3Min(min, t0, t1);
+
+ float max[3];
+ bx::vec3Max(max, t0, t1);
+
+ const float tmin = bx::fmax3(min[0], min[1], min[2]);
+ const float tmax = bx::fmin3(max[0], max[1], max[2]);
+
+ if (tmax < 0.0f
+ || tmin > tmax)
+ {
+ return false;
+ }
+
+ if (NULL != _intersection)
+ {
+ _intersection->m_normal[0] = float( (min[0] == tmin) - (max[0] == tmin) );
+ _intersection->m_normal[1] = float( (min[1] == tmin) - (max[1] == tmin) );
+ _intersection->m_normal[2] = float( (min[2] == tmin) - (max[2] == tmin) );
+
+ _intersection->m_dist = tmin;
+ getPointAt(_intersection->m_pos, _ray, tmin);
+ }
+
+ return true;
+}
+
+bool intersect(const Ray& _ray, const Disk& _disk, Intersection* _intersection)
+{
+ Plane plane;
+ bx::vec3Move(plane.m_normal, _disk.m_normal);
+ plane.m_dist = -bx::vec3Dot(_disk.m_center, _disk.m_normal);
+
+ Intersection tmpIntersection;
+ _intersection = NULL != _intersection ? _intersection : &tmpIntersection;
+
+ if (intersect(_ray, plane, _intersection) )
+ {
+ float tmp[3];
+ bx::vec3Sub(tmp, _disk.m_center, _intersection->m_pos);
+ return bx::vec3Dot(tmp, tmp) <= bx::fsq(_disk.m_radius);
+ }
+
+ return false;
+}
+
+bool intersect(const Ray& _ray, const Cylinder& _cylinder, bool _capsule, Intersection* _intersection)
+{
+ float axis[3];
+ bx::vec3Sub(axis, _cylinder.m_end, _cylinder.m_pos);
+
+ float rc[3];
+ bx::vec3Sub(rc, _ray.m_pos, _cylinder.m_pos);
+
+ float normal[3];
+ bx::vec3Cross(normal, _ray.m_dir, axis);
+
+ const float len = bx::vec3Norm(normal, normal);
+ const float dist = bx::fabsolute(bx::vec3Dot(rc, normal) );
+
+ if (dist > _cylinder.m_radius)
+ {
+ return false;
+ }
+
+ float vo[3];
+ bx::vec3Cross(vo, rc, axis);
+ const float t0 = -bx::vec3Dot(vo, normal) / len;
+
+ bx::vec3Cross(vo, normal, axis);
+ bx::vec3Norm(vo, vo);
+
+ const float rsq = bx::fsq(_cylinder.m_radius);
+ const float ddoto = bx::vec3Dot(_ray.m_dir, vo);
+ const float ss = t0 - bx::fabsolute(bx::fsqrt(rsq - bx::fsq(dist) ) / ddoto);
+
+ float point[3];
+ getPointAt(point, _ray, ss);
+
+ const float axisLen = bx::vec3Norm(axis, axis);
+ const float pdota = bx::vec3Dot(_cylinder.m_pos, axis);
+ const float height = bx::vec3Dot(point, axis) - pdota;
+
+ if (height > 0.0f
+ && height < axisLen)
+ {
+ if (NULL != _intersection)
+ {
+ const float t1 = height / axisLen;
+ float pointOnAxis[3];
+ bx::vec3Lerp(pointOnAxis, _cylinder.m_pos, _cylinder.m_end, t1);
+
+ bx::vec3Move(_intersection->m_pos, point);
+
+ float tmp[3];
+ bx::vec3Sub(tmp, point, pointOnAxis);
+ bx::vec3Norm(_intersection->m_normal, tmp);
+
+ _intersection->m_dist = ss;
+ }
+
+ return true;
+ }
+
+ if (_capsule)
+ {
+ const float rdota = bx::vec3Dot(_ray.m_pos, axis);
+ const float pp = rdota - pdota;
+ const float t1 = pp / axisLen;
+
+ float pointOnAxis[3];
+ bx::vec3Lerp(pointOnAxis, _cylinder.m_pos, _cylinder.m_end, t1);
+
+ float axisToRay[3];
+ bx::vec3Sub(axisToRay, _ray.m_pos, pointOnAxis);
+
+ if (_cylinder.m_radius < bx::vec3Length(axisToRay)
+ && 0.0f > ss)
+ {
+ return false;
+ }
+
+ Sphere sphere;
+ sphere.m_radius = _cylinder.m_radius;
+
+ bx::vec3Move(sphere.m_center, 0.0f >= height
+ ? _cylinder.m_pos
+ : _cylinder.m_end
+ );
+
+ return intersect(_ray, sphere, _intersection);
+ }
+
+ Plane plane;
+ float pos[3];
+
+ if (0.0f >= height)
+ {
+ bx::vec3Neg(plane.m_normal, axis);
+ bx::vec3Move(pos, _cylinder.m_pos);
+ }
+ else
+ {
+ bx::vec3Move(plane.m_normal, axis);
+ bx::vec3Move(pos, _cylinder.m_end);
+ }
+
+ plane.m_dist = -bx::vec3Dot(pos, plane.m_normal);
+
+ Intersection tmpIntersection;
+ _intersection = NULL != _intersection ? _intersection : &tmpIntersection;
+
+ if (intersect(_ray, plane, _intersection) )
+ {
+ float tmp[3];
+ bx::vec3Sub(tmp, pos, _intersection->m_pos);
+ return bx::vec3Dot(tmp, tmp) <= rsq;
+ }
+
+ return false;
+}
+
+bool intersect(const Ray& _ray, const Plane& _plane, Intersection* _intersection)
+{
+ float equation = bx::vec3Dot(_ray.m_pos, _plane.m_normal) + _plane.m_dist;
+ if (0.0f > equation)
+ {
+ return false;
+ }
+
+ float ndotd = bx::vec3Dot(_ray.m_dir, _plane.m_normal);
+ if (0.0f < ndotd)
+ {
+ return false;
+ }
+
+ if (NULL != _intersection)
+ {
+ bx::vec3Move(_intersection->m_normal, _plane.m_normal);
+
+ float tt = -equation/ndotd;
+ _intersection->m_dist = tt;
+
+ getPointAt(_intersection->m_pos, _ray, tt);
+ }
+
+ return true;
+}
+
+bool intersect(const Ray& _ray, const Sphere& _sphere, Intersection* _intersection)
+{
+ float rs[3];
+ bx::vec3Sub(rs, _ray.m_pos, _sphere.m_center);
+
+ const float bb = bx::vec3Dot(rs, _ray.m_dir);
+ if (0.0f < bb)
+ {
+ return false;
+ }
+
+ const float aa = bx::vec3Dot(_ray.m_dir, _ray.m_dir);
+ const float cc = bx::vec3Dot(rs, rs) - bx::fsq(_sphere.m_radius);
+
+ const float discriminant = bb*bb - aa*cc;
+
+ if (0.0f >= discriminant)
+ {
+ return false;
+ }
+
+ const float sqrtDiscriminant = bx::fsqrt(discriminant);
+ const float invA = 1.0f / aa;
+ const float tt = -(bb + sqrtDiscriminant)*invA;
+
+ if (0.0f >= tt)
+ {
+ return false;
+ }
+
+ if (NULL != _intersection)
+ {
+ _intersection->m_dist = tt;
+
+ float point[3];
+ getPointAt(point, _ray, tt);
+ bx::vec3Move(_intersection->m_pos, point);
+
+ float tmp[3];
+ bx::vec3Sub(tmp, point, _sphere.m_center);
+ bx::vec3Norm(_intersection->m_normal, tmp);
+ }
+
+ return true;
+}
+
+bool intersect(const Ray& _ray, const Tris& _triangle, Intersection* _intersection)
+{
+ float edge10[3];
+ bx::vec3Sub(edge10, _triangle.m_v1, _triangle.m_v0);
+
+ float edge02[3];
+ bx::vec3Sub(edge02, _triangle.m_v0, _triangle.m_v2);
+
+ float normal[3];
+ bx::vec3Cross(normal, edge02, edge10);
+
+ float vo[3];
+ bx::vec3Sub(vo, _triangle.m_v0, _ray.m_pos);
+
+ float dxo[3];
+ bx::vec3Cross(dxo, _ray.m_dir, vo);
+
+ const float det = bx::vec3Dot(normal, _ray.m_dir);
+
+ if (det > 0.0f)
+ {
+ return false;
+ }
+
+ const float invDet = 1.0f/det;
+ const float bz = bx::vec3Dot(dxo, edge02) * invDet;
+ const float by = bx::vec3Dot(dxo, edge10) * invDet;
+ const float bx = 1.0f - by - bz;
+
+ if (bx < 0.0f || by < 0.0f || bz < 0.0f)
+ {
+ return false;
+ }
+
+ if (NULL != _intersection)
+ {
+ bx::vec3Norm(_intersection->m_normal, normal);
+
+ const float tt = bx::vec3Dot(normal, vo) * invDet;
+ _intersection->m_dist = tt;
+
+ getPointAt(_intersection->m_pos, _ray, tt);
+ }
+
+ return true;
}
diff --git a/3rdparty/bgfx/examples/common/bounds.h b/3rdparty/bgfx/examples/common/bounds.h
index 572e635b1ca..f59c2b2230f 100644
--- a/3rdparty/bgfx/examples/common/bounds.h
+++ b/3rdparty/bgfx/examples/common/bounds.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#ifndef BOUNDS_H_HEADER_GUARD
@@ -12,17 +12,57 @@ struct Aabb
float m_max[3];
};
+struct Cylinder
+{
+ float m_pos[3];
+ float m_end[3];
+ float m_radius;
+};
+
+struct Disk
+{
+ float m_center[3];
+ float m_normal[3];
+ float m_radius;
+};
+
struct Obb
{
float m_mtx[16];
};
+struct Plane
+{
+ float m_normal[3];
+ float m_dist;
+};
+
+struct Ray
+{
+ float m_pos[3];
+ float m_dir[3];
+};
+
struct Sphere
{
float m_center[3];
float m_radius;
};
+struct Tris
+{
+ float m_v0[3];
+ float m_v1[3];
+ float m_v2[3];
+};
+
+struct Intersection
+{
+ float m_pos[3];
+ float m_normal[3];
+ float m_dist;
+};
+
/// Convert axis aligned bounding box to oriented bounding box.
void aabbToObb(Obb& _obb, const Aabb& _aabb);
@@ -43,7 +83,7 @@ void aabbExpand(Aabb& _aabb, float _factor);
/// Returns 0 is two AABB don't overlap, otherwise returns flags of overlap
/// test.
-uint32_t aabbOverlapTest(Aabb& _aabb0, Aabb& _aabb1);
+uint32_t aabbOverlapTest(const Aabb& _aabb0, const Aabb& _aabb1);
/// Calculate oriented bounding box.
void calcObb(Obb& _obb, const void* _vertices, uint32_t _numVertices, uint32_t _stride, uint32_t _steps = 17);
@@ -54,4 +94,25 @@ void calcMaxBoundingSphere(Sphere& _sphere, const void* _vertices, uint32_t _num
/// Calculate minimum bounding sphere.
void calcMinBoundingSphere(Sphere& _sphere, const void* _vertices, uint32_t _numVertices, uint32_t _stride, float _step = 0.01f);
+/// Make screen space ray from x, y coordinate and inverse view-projection matrix.
+Ray makeRay(float _x, float _y, const float* _invVp);
+
+/// Intersect ray / aabb.
+bool intersect(const Ray& _ray, const Aabb& _aabb, Intersection* _intersection = NULL);
+
+/// Intersect ray / cylinder.
+bool intersect(const Ray& _ray, const Cylinder& _cylinder, bool _capsule, Intersection* _intersection = NULL);
+
+/// Intersect ray / disk.
+bool intersect(const Ray& _ray, const Disk& _disk, Intersection* _intersection = NULL);
+
+/// Intersect ray / plane.
+bool intersect(const Ray& _ray, const Plane& _plane, Intersection* _intersection = NULL);
+
+/// Intersect ray / sphere.
+bool intersect(const Ray& _ray, const Sphere& _sphere, Intersection* _intersection = NULL);
+
+/// Intersect ray / triangle.
+bool intersect(const Ray& _ray, const Tris& _triangle, Intersection* _intersection = NULL);
+
#endif // BOUNDS_H_HEADER_GUARD
diff --git a/3rdparty/bgfx/examples/common/camera.cpp b/3rdparty/bgfx/examples/common/camera.cpp
index 4d0a47166ea..e721bd2e2fd 100644
--- a/3rdparty/bgfx/examples/common/camera.cpp
+++ b/3rdparty/bgfx/examples/common/camera.cpp
@@ -1,13 +1,15 @@
/*
* Copyright 2013 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include <bx/timer.h>
#include <bx/fpumath.h>
#include "camera.h"
+#include "entry/entry.h"
#include "entry/cmd.h"
#include "entry/input.h"
+#include <bx/allocator.h>
int cmdMove(CmdContext* /*_context*/, void* /*_userData*/, int _argc, char const* const* _argv)
{
@@ -63,7 +65,9 @@ static const InputBinding s_camBindings[] =
{ entry::Key::GamepadDown, entry::Modifier::None, 0, cmd, "move backward" },
{ entry::Key::KeyD, entry::Modifier::None, 0, cmd, "move right" },
{ entry::Key::GamepadRight, entry::Modifier::None, 0, cmd, "move right" },
+ { entry::Key::KeyQ, entry::Modifier::None, 0, cmd, "move down" },
{ entry::Key::GamepadShoulderL, entry::Modifier::None, 0, cmd, "move down" },
+ { entry::Key::KeyE, entry::Modifier::None, 0, cmd, "move up" },
{ entry::Key::GamepadShoulderR, entry::Modifier::None, 0, cmd, "move up" },
INPUT_BINDING_END
@@ -294,12 +298,12 @@ static Camera* s_camera = NULL;
void cameraCreate()
{
- s_camera = new Camera;
+ s_camera = BX_NEW(entry::getAllocator(), Camera);
}
void cameraDestroy()
{
- delete s_camera;
+ BX_DELETE(entry::getAllocator(), s_camera);
s_camera = NULL;
}
diff --git a/3rdparty/bgfx/examples/common/camera.h b/3rdparty/bgfx/examples/common/camera.h
index 2619d1bad60..ba1c0cc1f96 100644
--- a/3rdparty/bgfx/examples/common/camera.h
+++ b/3rdparty/bgfx/examples/common/camera.h
@@ -1,6 +1,6 @@
/*
* Copyright 2013 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#ifndef CAMERA_H_HEADER_GUARD
diff --git a/3rdparty/bgfx/examples/common/common.h b/3rdparty/bgfx/examples/common/common.h
index 3e80ee67ff2..209cfc18801 100644
--- a/3rdparty/bgfx/examples/common/common.h
+++ b/3rdparty/bgfx/examples/common/common.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#ifndef COMMON_H_HEADER_GUARD
diff --git a/3rdparty/bgfx/examples/common/common.sh b/3rdparty/bgfx/examples/common/common.sh
index e42c20e60d9..c3f50267d4e 100644
--- a/3rdparty/bgfx/examples/common/common.sh
+++ b/3rdparty/bgfx/examples/common/common.sh
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include <bgfx_shader.sh>
diff --git a/3rdparty/bgfx/examples/common/cube_atlas.cpp b/3rdparty/bgfx/examples/common/cube_atlas.cpp
index 1d762b6544d..ac7343b9b21 100644
--- a/3rdparty/bgfx/examples/common/cube_atlas.cpp
+++ b/3rdparty/bgfx/examples/common/cube_atlas.cpp
@@ -1,6 +1,6 @@
/*
* Copyright 2013 Jeremie Roy. All rights reserved.
-* License: http://www.opensource.org/licenses/BSD-2-Clause
+* License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "common.h"
diff --git a/3rdparty/bgfx/examples/common/cube_atlas.h b/3rdparty/bgfx/examples/common/cube_atlas.h
index 5efde04858d..9a33a7611a6 100644
--- a/3rdparty/bgfx/examples/common/cube_atlas.h
+++ b/3rdparty/bgfx/examples/common/cube_atlas.h
@@ -1,6 +1,6 @@
/*
* Copyright 2013 Jeremie Roy. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#ifndef CUBE_ATLAS_H_HEADER_GUARD
diff --git a/3rdparty/bgfx/examples/common/entry/cmd.cpp b/3rdparty/bgfx/examples/common/entry/cmd.cpp
index 6d58aebf077..eaae44f526a 100644
--- a/3rdparty/bgfx/examples/common/entry/cmd.cpp
+++ b/3rdparty/bgfx/examples/common/entry/cmd.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2010-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include <ctype.h> // isspace
diff --git a/3rdparty/bgfx/examples/common/entry/cmd.h b/3rdparty/bgfx/examples/common/entry/cmd.h
index 7873d1aedc6..4976c7979ed 100644
--- a/3rdparty/bgfx/examples/common/entry/cmd.h
+++ b/3rdparty/bgfx/examples/common/entry/cmd.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2010-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#ifndef CMD_H_HEADER_GUARD
diff --git a/3rdparty/bgfx/examples/common/entry/dbg.cpp b/3rdparty/bgfx/examples/common/entry/dbg.cpp
index 2622259ca18..edefcae41c3 100644
--- a/3rdparty/bgfx/examples/common/entry/dbg.cpp
+++ b/3rdparty/bgfx/examples/common/entry/dbg.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include <stdio.h>
diff --git a/3rdparty/bgfx/examples/common/entry/dbg.h b/3rdparty/bgfx/examples/common/entry/dbg.h
index 191ea21bfa8..7a4bb16bd58 100644
--- a/3rdparty/bgfx/examples/common/entry/dbg.h
+++ b/3rdparty/bgfx/examples/common/entry/dbg.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#ifndef DBG_H_HEADER_GUARD
diff --git a/3rdparty/bgfx/examples/common/entry/entry.cpp b/3rdparty/bgfx/examples/common/entry/entry.cpp
index 08ac26e4e66..1fb0497be85 100644
--- a/3rdparty/bgfx/examples/common/entry/entry.cpp
+++ b/3rdparty/bgfx/examples/common/entry/entry.cpp
@@ -1,8 +1,9 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
+#include <bx/bx.h>
#include <bgfx/bgfx.h>
#include <bx/string.h>
#include <bx/readerwriter.h>
@@ -17,6 +18,9 @@
#include "cmd.h"
#include "input.h"
+#define RMT_ENABLED ENTRY_CONFIG_PROFILER
+#include <remotery/lib/Remotery.h>
+
extern "C" int _main_(int _argc, char** _argv);
namespace entry
@@ -24,14 +28,32 @@ namespace entry
static uint32_t s_debug = BGFX_DEBUG_NONE;
static uint32_t s_reset = BGFX_RESET_NONE;
static bool s_exit = false;
+
+ static Remotery* s_rmt = NULL;
+
static bx::FileReaderI* s_fileReader = NULL;
static bx::FileWriterI* s_fileWriter = NULL;
- extern bx::ReallocatorI* getDefaultAllocator();
- static bx::ReallocatorI* s_allocator = getDefaultAllocator();
+ extern bx::AllocatorI* getDefaultAllocator();
+ static bx::AllocatorI* s_allocator = getDefaultAllocator();
+
+ void* rmtMalloc(void* /*_context*/, rmtU32 _size)
+ {
+ return BX_ALLOC(s_allocator, _size);
+ }
+
+ void* rmtRealloc(void* /*_context*/, void* _ptr, rmtU32 _size)
+ {
+ return BX_REALLOC(s_allocator, _ptr, _size);
+ }
+
+ void rmtFree(void* /*_context*/, void* _ptr)
+ {
+ BX_FREE(s_allocator, _ptr);
+ }
#if ENTRY_CONFIG_IMPLEMENT_DEFAULT_ALLOCATOR
- bx::ReallocatorI* getDefaultAllocator()
+ bx::AllocatorI* getDefaultAllocator()
{
BX_PRAGMA_DIAGNOSTIC_PUSH();
BX_PRAGMA_DIAGNOSTIC_IGNORED_MSVC(4459); // warning C4459: declaration of 's_allocator' hides global declaration
@@ -238,6 +260,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
|| setOrToggle(s_reset, "flush", BGFX_RESET_FLUSH_AFTER_RENDER, 1, _argc, _argv)
|| setOrToggle(s_reset, "flip", BGFX_RESET_FLIP_AFTER_RENDER, 1, _argc, _argv)
|| setOrToggle(s_reset, "hidpi", BGFX_RESET_HIDPI, 1, _argc, _argv)
+ || setOrToggle(s_reset, "depthclamp", BGFX_RESET_DEPTH_CLAMP, 1, _argc, _argv)
)
{
return 0;
@@ -338,6 +361,29 @@ BX_PRAGMA_DIAGNOSTIC_POP();
{
//DBG(BX_COMPILER_NAME " / " BX_CPU_NAME " / " BX_ARCH_NAME " / " BX_PLATFORM_NAME);
+ if (BX_ENABLED(ENTRY_CONFIG_PROFILER) )
+ {
+ rmtSettings* settings = rmt_Settings();
+ BX_WARN(NULL != settings, "Remotery is not enabled.");
+ if (NULL != settings)
+ {
+ settings->malloc = rmtMalloc;
+ settings->realloc = rmtRealloc;
+ settings->free = rmtFree;
+
+ rmtError err = rmt_CreateGlobalInstance(&s_rmt);
+ BX_WARN(RMT_ERROR_NONE != err, "Remotery failed to create global instance.");
+ if (RMT_ERROR_NONE == err)
+ {
+ rmt_SetCurrentThreadName("Main");
+ }
+ else
+ {
+ s_rmt = NULL;
+ }
+ }
+ }
+
#if BX_CONFIG_CRT_FILE_READER_WRITER
s_fileReader = new bx::CrtFileReader;
s_fileWriter = new bx::CrtFileWriter;
@@ -370,6 +416,12 @@ BX_PRAGMA_DIAGNOSTIC_POP();
s_fileWriter = NULL;
#endif // BX_CONFIG_CRT_FILE_READER_WRITER
+ if (BX_ENABLED(ENTRY_CONFIG_PROFILER)
+ && NULL != s_rmt)
+ {
+ rmt_DestroyGlobalInstance(s_rmt);
+ }
+
return result;
}
@@ -666,7 +718,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
return s_fileWriter;
}
- bx::ReallocatorI* getAllocator()
+ bx::AllocatorI* getAllocator()
{
return s_allocator;
}
diff --git a/3rdparty/bgfx/examples/common/entry/entry.h b/3rdparty/bgfx/examples/common/entry/entry.h
index 13b85262067..54c79d1ccd9 100644
--- a/3rdparty/bgfx/examples/common/entry/entry.h
+++ b/3rdparty/bgfx/examples/common/entry/entry.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#ifndef ENTRY_H_HEADER_GUARD
@@ -10,7 +10,7 @@
#include <string.h> // memset
#include <bx/bx.h>
-namespace bx { struct FileReaderI; struct FileWriterI; struct ReallocatorI; }
+namespace bx { struct FileReaderI; struct FileWriterI; struct AllocatorI; }
extern "C" int _main_(int _argc, char** _argv);
@@ -236,7 +236,7 @@ namespace entry
bx::FileReaderI* getFileReader();
bx::FileWriterI* getFileWriter();
- bx::ReallocatorI* getAllocator();
+ bx::AllocatorI* getAllocator();
WindowHandle createWindow(int32_t _x, int32_t _y, uint32_t _width, uint32_t _height, uint32_t _flags = ENTRY_WINDOW_FLAG_NONE, const char* _title = "");
void destroyWindow(WindowHandle _handle);
@@ -250,7 +250,9 @@ namespace entry
struct WindowState
{
WindowState()
- : m_nwh(NULL)
+ : m_width(0)
+ , m_height(0)
+ , m_nwh(NULL)
{
m_handle.idx = UINT16_MAX;
}
diff --git a/3rdparty/bgfx/examples/common/entry/entry_android.cpp b/3rdparty/bgfx/examples/common/entry/entry_android.cpp
index aef9fee938a..b1e7266b623 100644
--- a/3rdparty/bgfx/examples/common/entry/entry_android.cpp
+++ b/3rdparty/bgfx/examples/common/entry/entry_android.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "entry_p.h"
diff --git a/3rdparty/bgfx/examples/common/entry/entry_asmjs.cpp b/3rdparty/bgfx/examples/common/entry/entry_asmjs.cpp
index f5c3dc62c4d..030992ab693 100644
--- a/3rdparty/bgfx/examples/common/entry/entry_asmjs.cpp
+++ b/3rdparty/bgfx/examples/common/entry/entry_asmjs.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "entry_p.h"
diff --git a/3rdparty/bgfx/examples/common/entry/entry_glfw.cpp b/3rdparty/bgfx/examples/common/entry/entry_glfw.cpp
index 615d828cea9..0900e8347bf 100644
--- a/3rdparty/bgfx/examples/common/entry/entry_glfw.cpp
+++ b/3rdparty/bgfx/examples/common/entry/entry_glfw.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "entry_p.h"
diff --git a/3rdparty/bgfx/examples/common/entry/entry_ios.mm b/3rdparty/bgfx/examples/common/entry/entry_ios.mm
index 1a10d26f765..e12c224e623 100644
--- a/3rdparty/bgfx/examples/common/entry/entry_ios.mm
+++ b/3rdparty/bgfx/examples/common/entry/entry_ios.mm
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "entry_p.h"
diff --git a/3rdparty/bgfx/examples/common/entry/entry_nacl.cpp b/3rdparty/bgfx/examples/common/entry/entry_nacl.cpp
index bc476290db0..7ce93756e82 100644
--- a/3rdparty/bgfx/examples/common/entry/entry_nacl.cpp
+++ b/3rdparty/bgfx/examples/common/entry/entry_nacl.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "entry_p.h"
diff --git a/3rdparty/bgfx/examples/common/entry/entry_osx.mm b/3rdparty/bgfx/examples/common/entry/entry_osx.mm
index 14ddf60418a..b5e722cfa74 100644
--- a/3rdparty/bgfx/examples/common/entry/entry_osx.mm
+++ b/3rdparty/bgfx/examples/common/entry/entry_osx.mm
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "entry_p.h"
@@ -469,6 +469,9 @@ namespace entry
bx::Thread thread;
thread.init(mte.threadFunc, &mte);
+ WindowHandle handle = { 0 };
+ m_eventQueue.postSizeEvent(handle, ENTRY_DEFAULT_WIDTH, ENTRY_DEFAULT_HEIGHT);
+
while (!(m_exit = [dg applicationHasTerminated]) )
{
if (bgfx::RenderFrame::Exiting == bgfx::renderFrame() )
diff --git a/3rdparty/bgfx/examples/common/entry/entry_p.h b/3rdparty/bgfx/examples/common/entry/entry_p.h
index e1a1a514855..880f44123e4 100644
--- a/3rdparty/bgfx/examples/common/entry/entry_p.h
+++ b/3rdparty/bgfx/examples/common/entry/entry_p.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#ifndef ENTRY_PRIVATE_H_HEADER_GUARD
@@ -48,6 +48,10 @@
# define ENTRY_CONFIG_IMPLEMENT_DEFAULT_ALLOCATOR 1
#endif // ENTRY_CONFIG_IMPLEMENT_DEFAULT_ALLOCATOR
+#ifndef ENTRY_CONFIG_PROFILER
+# define ENTRY_CONFIG_PROFILER 0
+#endif // ENTRY_CONFIG_PROFILER
+
#define ENTRY_IMPLEMENT_EVENT(_class, _type) \
_class(WindowHandle _handle) : Event(_type, _handle) {}
diff --git a/3rdparty/bgfx/examples/common/entry/entry_qnx.cpp b/3rdparty/bgfx/examples/common/entry/entry_qnx.cpp
index c99393bb3ca..af91ca7db40 100644
--- a/3rdparty/bgfx/examples/common/entry/entry_qnx.cpp
+++ b/3rdparty/bgfx/examples/common/entry/entry_qnx.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "entry_p.h"
diff --git a/3rdparty/bgfx/examples/common/entry/entry_sdl.cpp b/3rdparty/bgfx/examples/common/entry/entry_sdl.cpp
index a9faec69e47..c5ab2c7d57a 100644
--- a/3rdparty/bgfx/examples/common/entry/entry_sdl.cpp
+++ b/3rdparty/bgfx/examples/common/entry/entry_sdl.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "entry_p.h"
@@ -142,7 +142,7 @@ namespace entry
return NULL;
}
-# if BX_PLATFORM_LINUX || BX_PLATFORM_FREEBSD
+# if BX_PLATFORM_LINUX || BX_PLATFORM_BSD
return (void*)wmi.info.x11.window;
# elif BX_PLATFORM_OSX
return wmi.info.cocoa.window;
diff --git a/3rdparty/bgfx/examples/common/entry/entry_windows.cpp b/3rdparty/bgfx/examples/common/entry/entry_windows.cpp
index c61450c9ab9..247bed44385 100644
--- a/3rdparty/bgfx/examples/common/entry/entry_windows.cpp
+++ b/3rdparty/bgfx/examples/common/entry/entry_windows.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "entry_p.h"
@@ -368,6 +368,7 @@ namespace entry
s_translateKey[VK_OEM_7] = Key::Quote;
s_translateKey[VK_OEM_COMMA] = Key::Comma;
s_translateKey[VK_OEM_PERIOD] = Key::Period;
+ s_translateKey[VK_DECIMAL] = Key::Period;
s_translateKey[VK_OEM_2] = Key::Slash;
s_translateKey[VK_OEM_5] = Key::Backslash;
s_translateKey[VK_OEM_3] = Key::Tilde;
diff --git a/3rdparty/bgfx/examples/common/entry/entry_winrt.cpp b/3rdparty/bgfx/examples/common/entry/entry_winrt.cpp
index 042c032d609..caf4f235ad2 100644
--- a/3rdparty/bgfx/examples/common/entry/entry_winrt.cpp
+++ b/3rdparty/bgfx/examples/common/entry/entry_winrt.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "entry_p.h"
diff --git a/3rdparty/bgfx/examples/common/entry/entry_x11.cpp b/3rdparty/bgfx/examples/common/entry/entry_x11.cpp
index 9dd0919cb14..a058479fabb 100644
--- a/3rdparty/bgfx/examples/common/entry/entry_x11.cpp
+++ b/3rdparty/bgfx/examples/common/entry/entry_x11.cpp
@@ -1,11 +1,11 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "entry_p.h"
-#if ENTRY_CONFIG_USE_NATIVE && (BX_PLATFORM_FREEBSD || BX_PLATFORM_LINUX || BX_PLATFORM_RPI)
+#if ENTRY_CONFIG_USE_NATIVE && (BX_PLATFORM_BSD || BX_PLATFORM_LINUX || BX_PLATFORM_RPI)
#define XK_MISCELLANY
#define XK_LATIN1
@@ -713,4 +713,4 @@ int main(int _argc, char** _argv)
return s_ctx.run(_argc, _argv);
}
-#endif // ENTRY_CONFIG_USE_NATIVE && (BX_PLATFORM_FREEBSD || BX_PLATFORM_LINUX || BX_PLATFORM_RPI)
+#endif // ENTRY_CONFIG_USE_NATIVE && (BX_PLATFORM_BSD || BX_PLATFORM_LINUX || BX_PLATFORM_RPI)
diff --git a/3rdparty/bgfx/examples/common/entry/input.cpp b/3rdparty/bgfx/examples/common/entry/input.cpp
index a0618f86c9c..c0d2686d293 100644
--- a/3rdparty/bgfx/examples/common/entry/input.cpp
+++ b/3rdparty/bgfx/examples/common/entry/input.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2010-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include <memory.h>
diff --git a/3rdparty/bgfx/examples/common/entry/input.h b/3rdparty/bgfx/examples/common/entry/input.h
index 2dcbbdb74f6..66c60c091e2 100644
--- a/3rdparty/bgfx/examples/common/entry/input.h
+++ b/3rdparty/bgfx/examples/common/entry/input.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2010-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#ifndef INPUT_H_HEADER_GUARD
diff --git a/3rdparty/bgfx/examples/common/font/font_manager.cpp b/3rdparty/bgfx/examples/common/font/font_manager.cpp
index 053f7c95f93..1d688a81503 100644
--- a/3rdparty/bgfx/examples/common/font/font_manager.cpp
+++ b/3rdparty/bgfx/examples/common/font/font_manager.cpp
@@ -1,6 +1,6 @@
/*
* Copyright 2013 Jeremie Roy. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#define USE_EDTAA3 0
diff --git a/3rdparty/bgfx/examples/common/font/font_manager.h b/3rdparty/bgfx/examples/common/font/font_manager.h
index 978440a8f73..886c5835093 100644
--- a/3rdparty/bgfx/examples/common/font/font_manager.h
+++ b/3rdparty/bgfx/examples/common/font/font_manager.h
@@ -1,6 +1,6 @@
/*
* Copyright 2013 Jeremie Roy. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#ifndef FONT_MANAGER_H_HEADER_GUARD
diff --git a/3rdparty/bgfx/examples/common/font/fs_font_basic.bin.h b/3rdparty/bgfx/examples/common/font/fs_font_basic.bin.h
index 4bf319a2ecf..69a3484dc65 100644
--- a/3rdparty/bgfx/examples/common/font/fs_font_basic.bin.h
+++ b/3rdparty/bgfx/examples/common/font/fs_font_basic.bin.h
@@ -36,38 +36,37 @@ static const uint8_t fs_font_basic_glsl[553] =
0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // ragColor = tmpva
0x72, 0x5f, 0x34, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // r_4;.}...
};
-static const uint8_t fs_font_basic_dx9[466] =
+static const uint8_t fs_font_basic_dx9[462] =
{
0x46, 0x53, 0x48, 0x04, 0x01, 0x83, 0xf2, 0xe1, 0x01, 0x00, 0x0a, 0x73, 0x5f, 0x74, 0x65, 0x78, // FSH........s_tex
- 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x01, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x01, 0x00, 0x03, 0xff, // Color0..........
- 0xff, 0xfe, 0xff, 0x23, 0x00, 0x43, 0x54, 0x41, 0x42, 0x1c, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, // ...#.CTAB....S..
+ 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x01, 0x00, 0x00, 0x01, 0x00, 0xb0, 0x01, 0x00, 0x03, 0xff, // Color0..........
+ 0xff, 0xfe, 0xff, 0x22, 0x00, 0x43, 0x54, 0x41, 0x42, 0x1c, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, // ...".CTAB....S..
0x00, 0x00, 0x03, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x91, 0x00, // ................
0x00, 0x4c, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, // .L...0..........
0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, // .<.......s_texCo
0x6c, 0x6f, 0x72, 0x00, 0xab, 0x04, 0x00, 0x0e, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, // lor.............
0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x73, 0x5f, 0x33, 0x5f, 0x30, 0x00, 0x4d, 0x69, 0x63, 0x72, // .....ps_3_0.Micr
0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, // osoft (R) HLSL S
- 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x31, // hader Compiler 1
- 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x30, 0x30, 0x31, 0x31, 0x2e, 0x31, 0x36, 0x33, 0x38, 0x34, 0x00, // 0.0.10011.16384.
- 0xab, 0x51, 0x00, 0x00, 0x05, 0x00, 0x00, 0x0f, 0xa0, 0x00, 0x00, 0x80, 0x40, 0x00, 0x00, 0x00, // .Q..........@...
- 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x51, 0x00, 0x00, 0x05, 0x01, 0x00, 0x0f, // ?.......?Q......
- 0xa0, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0xbf, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x40, // ...............@
- 0xc0, 0x1f, 0x00, 0x00, 0x02, 0x0a, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, // ................
- 0x02, 0x05, 0x00, 0x00, 0x80, 0x01, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, // ................
- 0x98, 0x00, 0x08, 0x0f, 0xa0, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0x80, 0x01, 0x00, 0xff, // ................
- 0x90, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x55, 0xa0, 0x13, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, // .......U........
- 0x80, 0x00, 0x00, 0x00, 0x80, 0x58, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x80, 0x00, 0x00, 0x55, // .....X.........U
- 0x81, 0x00, 0x00, 0xaa, 0xa0, 0x00, 0x00, 0xff, 0xa0, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x02, // ................
- 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x55, 0x81, 0x58, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, // .......U.X......
- 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xaa, 0xa0, 0x00, 0x00, 0xaa, 0x80, 0x02, 0x00, 0x00, // ................
- 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x55, 0x80, 0x02, 0x00, 0x00, // ...........U....
- 0x03, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xe4, 0xa0, 0x58, 0x00, 0x00, // .............X..
- 0x04, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0xe4, 0x8c, 0x00, 0x00, 0xff, 0xa0, 0x00, 0x00, 0xaa, // ................
- 0xa0, 0x42, 0x00, 0x00, 0x03, 0x01, 0x00, 0x0f, 0x80, 0x01, 0x00, 0xe4, 0x90, 0x00, 0x08, 0xe4, // .B..............
- 0xa0, 0x09, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x01, 0x00, 0xc6, 0x80, 0x00, 0x00, 0xe4, // ................
- 0x80, 0x05, 0x00, 0x00, 0x03, 0x00, 0x08, 0x08, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xff, // ................
- 0x90, 0x01, 0x00, 0x00, 0x02, 0x00, 0x08, 0x07, 0x80, 0x00, 0x00, 0xe4, 0x90, 0xff, 0xff, 0x00, // ................
- 0x00, 0x00, // ..
+ 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x39, // hader Compiler 9
+ 0x2e, 0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, 0x2e, 0x33, 0x31, 0x31, 0x31, 0x00, 0x51, 0x00, 0x00, // .29.952.3111.Q..
+ 0x05, 0x00, 0x00, 0x0f, 0xa0, 0x00, 0x00, 0x80, 0x40, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, // ........@...?...
+ 0x00, 0x00, 0x00, 0x80, 0x3f, 0x51, 0x00, 0x00, 0x05, 0x01, 0x00, 0x0f, 0xa0, 0x00, 0x00, 0x00, // ....?Q..........
+ 0x80, 0x00, 0x00, 0x80, 0xbf, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x40, 0xc0, 0x1f, 0x00, 0x00, // ...........@....
+ 0x02, 0x0a, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, // ................
+ 0x80, 0x01, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x98, 0x00, 0x08, 0x0f, // ................
+ 0xa0, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0x80, 0x01, 0x00, 0xff, 0x90, 0x00, 0x00, 0x00, // ................
+ 0xa0, 0x00, 0x00, 0x55, 0xa0, 0x13, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0x00, // ...U............
+ 0x80, 0x58, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x80, 0x00, 0x00, 0x55, 0x81, 0x00, 0x00, 0xaa, // .X.........U....
+ 0xa0, 0x00, 0x00, 0xff, 0xa0, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0x00, // ................
+ 0x80, 0x00, 0x00, 0x55, 0x81, 0x58, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, // ...U.X..........
+ 0x80, 0x00, 0x00, 0xaa, 0xa0, 0x00, 0x00, 0xaa, 0x80, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, // ................
+ 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x55, 0x80, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, // .......U........
+ 0x80, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xe4, 0xa0, 0x58, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0f, // .........X......
+ 0x80, 0x00, 0x00, 0xe4, 0x8c, 0x00, 0x00, 0xff, 0xa0, 0x00, 0x00, 0xaa, 0xa0, 0x42, 0x00, 0x00, // .............B..
+ 0x03, 0x01, 0x00, 0x0f, 0x80, 0x01, 0x00, 0xe4, 0x90, 0x00, 0x08, 0xe4, 0xa0, 0x09, 0x00, 0x00, // ................
+ 0x03, 0x00, 0x00, 0x01, 0x80, 0x01, 0x00, 0xc6, 0x80, 0x00, 0x00, 0xe4, 0x80, 0x05, 0x00, 0x00, // ................
+ 0x03, 0x00, 0x08, 0x08, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xff, 0x90, 0x01, 0x00, 0x00, // ................
+ 0x02, 0x00, 0x08, 0x07, 0x80, 0x00, 0x00, 0xe4, 0x90, 0xff, 0xff, 0x00, 0x00, 0x00, // ..............
};
static const uint8_t fs_font_basic_dx11[617] =
{
diff --git a/3rdparty/bgfx/examples/common/font/fs_font_distance_field.bin.h b/3rdparty/bgfx/examples/common/font/fs_font_distance_field.bin.h
index 9bd34a78a05..030ec333753 100644
--- a/3rdparty/bgfx/examples/common/font/fs_font_distance_field.bin.h
+++ b/3rdparty/bgfx/examples/common/font/fs_font_distance_field.bin.h
@@ -65,56 +65,56 @@ static const uint8_t fs_font_distance_field_glsl[1019] =
0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, // _FragColor = tmp
0x76, 0x61, 0x72, 0x5f, 0x39, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // var_9;.}...
};
-static const uint8_t fs_font_distance_field_dx9[758] =
+static const uint8_t fs_font_distance_field_dx9[754] =
{
0x46, 0x53, 0x48, 0x04, 0x01, 0x83, 0xf2, 0xe1, 0x01, 0x00, 0x0a, 0x73, 0x5f, 0x74, 0x65, 0x78, // FSH........s_tex
- 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x01, 0x00, 0x00, 0x01, 0x00, 0xd8, 0x02, 0x00, 0x03, 0xff, // Color0..........
- 0xff, 0xfe, 0xff, 0x23, 0x00, 0x43, 0x54, 0x41, 0x42, 0x1c, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, // ...#.CTAB....S..
+ 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x01, 0x00, 0x00, 0x01, 0x00, 0xd4, 0x02, 0x00, 0x03, 0xff, // Color0..........
+ 0xff, 0xfe, 0xff, 0x22, 0x00, 0x43, 0x54, 0x41, 0x42, 0x1c, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, // ...".CTAB....S..
0x00, 0x00, 0x03, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x91, 0x00, // ................
0x00, 0x4c, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, // .L...0..........
0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, // .<.......s_texCo
0x6c, 0x6f, 0x72, 0x00, 0xab, 0x04, 0x00, 0x0e, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, // lor.............
0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x73, 0x5f, 0x33, 0x5f, 0x30, 0x00, 0x4d, 0x69, 0x63, 0x72, // .....ps_3_0.Micr
0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, // osoft (R) HLSL S
- 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x31, // hader Compiler 1
- 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x30, 0x30, 0x31, 0x31, 0x2e, 0x31, 0x36, 0x33, 0x38, 0x34, 0x00, // 0.0.10011.16384.
- 0xab, 0x51, 0x00, 0x00, 0x05, 0x00, 0x00, 0x0f, 0xa0, 0x00, 0x00, 0x80, 0x40, 0x00, 0x00, 0x00, // .Q..........@...
- 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x51, 0x00, 0x00, 0x05, 0x01, 0x00, 0x0f, // ?.......?Q......
- 0xa0, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0xbf, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x40, // ...............@
- 0xc0, 0x51, 0x00, 0x00, 0x05, 0x02, 0x00, 0x0f, 0xa0, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, // .Q..........A...
- 0x3f, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x40, 0x40, 0x1f, 0x00, 0x00, 0x02, 0x0a, 0x00, 0x00, // ?......@@.......
- 0x80, 0x00, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x80, 0x01, 0x00, 0x0f, // ................
- 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x98, 0x00, 0x08, 0x0f, 0xa0, 0x04, 0x00, 0x00, // ................
- 0x04, 0x00, 0x00, 0x01, 0x80, 0x01, 0x00, 0xff, 0x90, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x55, // ...............U
- 0xa0, 0x13, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0x00, 0x80, 0x58, 0x00, 0x00, // .............X..
- 0x04, 0x00, 0x00, 0x04, 0x80, 0x00, 0x00, 0x55, 0x81, 0x00, 0x00, 0xaa, 0xa0, 0x00, 0x00, 0xff, // .......U........
- 0xa0, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x55, // ...............U
- 0x81, 0x58, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xaa, // .X..............
- 0xa0, 0x00, 0x00, 0xaa, 0x80, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, // ................
- 0x80, 0x00, 0x00, 0x55, 0x80, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0x00, // ...U............
- 0x80, 0x01, 0x00, 0xe4, 0xa0, 0x58, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0xe4, // .....X..........
- 0x8c, 0x00, 0x00, 0xff, 0xa0, 0x00, 0x00, 0xaa, 0xa0, 0x42, 0x00, 0x00, 0x03, 0x01, 0x00, 0x0f, // .........B......
- 0x80, 0x01, 0x00, 0xe4, 0x90, 0x00, 0x08, 0xe4, 0xa0, 0x09, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, // ................
- 0x80, 0x01, 0x00, 0xc6, 0x80, 0x00, 0x00, 0xe4, 0x80, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0e, // ................
- 0x80, 0x01, 0x00, 0x90, 0x91, 0x5c, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0e, 0x80, 0x00, 0x00, 0xe4, // ................
- 0x80, 0x08, 0x00, 0x00, 0x03, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0xf9, 0x80, 0x00, 0x00, 0xf9, // ................
- 0x80, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0x55, 0x80, 0x06, 0x00, 0x00, // ...........U....
- 0x02, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0x55, 0x80, 0x5b, 0x00, 0x00, 0x02, 0x01, 0x00, 0x07, // .......U.[......
- 0x80, 0x01, 0x00, 0xe4, 0x90, 0x08, 0x00, 0x00, 0x03, 0x00, 0x00, 0x04, 0x80, 0x01, 0x00, 0xe4, // ................
- 0x80, 0x01, 0x00, 0xe4, 0x80, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x80, 0x00, 0x00, 0xaa, // ................
- 0x80, 0x06, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x80, 0x00, 0x00, 0xaa, 0x80, 0x02, 0x00, 0x00, // ................
- 0x03, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0x55, 0x80, 0x00, 0x00, 0xaa, 0x80, 0x04, 0x00, 0x00, // .......U........
- 0x04, 0x00, 0x00, 0x04, 0x80, 0x00, 0x00, 0x55, 0x80, 0x02, 0x00, 0x00, 0xa1, 0x02, 0x00, 0x55, // .......U.......U
- 0xa0, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0x55, 0x80, 0x02, 0x00, 0x00, // ...........U....
- 0xa0, 0x02, 0x00, 0x55, 0xa0, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0xaa, // ...U............
- 0x81, 0x00, 0x00, 0xe4, 0x80, 0x06, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0x55, // ...............U
- 0x80, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x11, 0x80, 0x00, 0x00, 0x55, 0x80, 0x00, 0x00, 0x00, // ...........U....
- 0x80, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0xaa, // ................
- 0xa0, 0x02, 0x00, 0xff, 0xa0, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, // ................
- 0x80, 0x00, 0x00, 0x00, 0x80, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, // ................
- 0x80, 0x00, 0x00, 0x55, 0x80, 0x05, 0x00, 0x00, 0x03, 0x00, 0x08, 0x08, 0x80, 0x00, 0x00, 0x00, // ...U............
- 0x80, 0x00, 0x00, 0xff, 0x90, 0x01, 0x00, 0x00, 0x02, 0x00, 0x08, 0x07, 0x80, 0x00, 0x00, 0xe4, // ................
- 0x90, 0xff, 0xff, 0x00, 0x00, 0x00, // ......
+ 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x39, // hader Compiler 9
+ 0x2e, 0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, 0x2e, 0x33, 0x31, 0x31, 0x31, 0x00, 0x51, 0x00, 0x00, // .29.952.3111.Q..
+ 0x05, 0x00, 0x00, 0x0f, 0xa0, 0x00, 0x00, 0x80, 0x40, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, // ........@...?...
+ 0x00, 0x00, 0x00, 0x80, 0x3f, 0x51, 0x00, 0x00, 0x05, 0x01, 0x00, 0x0f, 0xa0, 0x00, 0x00, 0x00, // ....?Q..........
+ 0x80, 0x00, 0x00, 0x80, 0xbf, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x40, 0xc0, 0x51, 0x00, 0x00, // ...........@.Q..
+ 0x05, 0x02, 0x00, 0x0f, 0xa0, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, // ........A...?...
+ 0xc0, 0x00, 0x00, 0x40, 0x40, 0x1f, 0x00, 0x00, 0x02, 0x0a, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f, // ...@@...........
+ 0x90, 0x1f, 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x80, 0x01, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, // ................
+ 0x02, 0x00, 0x00, 0x00, 0x98, 0x00, 0x08, 0x0f, 0xa0, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, // ................
+ 0x80, 0x01, 0x00, 0xff, 0x90, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x55, 0xa0, 0x13, 0x00, 0x00, // ...........U....
+ 0x02, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0x00, 0x80, 0x58, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, // .........X......
+ 0x80, 0x00, 0x00, 0x55, 0x81, 0x00, 0x00, 0xaa, 0xa0, 0x00, 0x00, 0xff, 0xa0, 0x02, 0x00, 0x00, // ...U............
+ 0x03, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x55, 0x81, 0x58, 0x00, 0x00, // ...........U.X..
+ 0x04, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xaa, 0xa0, 0x00, 0x00, 0xaa, // ................
+ 0x80, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x55, // ...............U
+ 0x80, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xe4, // ................
+ 0xa0, 0x58, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0xe4, 0x8c, 0x00, 0x00, 0xff, // .X..............
+ 0xa0, 0x00, 0x00, 0xaa, 0xa0, 0x42, 0x00, 0x00, 0x03, 0x01, 0x00, 0x0f, 0x80, 0x01, 0x00, 0xe4, // .....B..........
+ 0x90, 0x00, 0x08, 0xe4, 0xa0, 0x09, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x01, 0x00, 0xc6, // ................
+ 0x80, 0x00, 0x00, 0xe4, 0x80, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0e, 0x80, 0x01, 0x00, 0x90, // ................
+ 0x91, 0x5c, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0e, 0x80, 0x00, 0x00, 0xe4, 0x80, 0x08, 0x00, 0x00, // ................
+ 0x03, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0xf9, 0x80, 0x00, 0x00, 0xf9, 0x80, 0x07, 0x00, 0x00, // ................
+ 0x02, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0x55, 0x80, 0x06, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, // .......U........
+ 0x80, 0x00, 0x00, 0x55, 0x80, 0x5b, 0x00, 0x00, 0x02, 0x01, 0x00, 0x07, 0x80, 0x01, 0x00, 0xe4, // ...U.[..........
+ 0x90, 0x08, 0x00, 0x00, 0x03, 0x00, 0x00, 0x04, 0x80, 0x01, 0x00, 0xe4, 0x80, 0x01, 0x00, 0xe4, // ................
+ 0x80, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x80, 0x00, 0x00, 0xaa, 0x80, 0x06, 0x00, 0x00, // ................
+ 0x02, 0x00, 0x00, 0x04, 0x80, 0x00, 0x00, 0xaa, 0x80, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x02, // ................
+ 0x80, 0x00, 0x00, 0x55, 0x80, 0x00, 0x00, 0xaa, 0x80, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, // ...U............
+ 0x80, 0x00, 0x00, 0x55, 0x80, 0x02, 0x00, 0x00, 0xa1, 0x02, 0x00, 0x55, 0xa0, 0x04, 0x00, 0x00, // ...U.......U....
+ 0x04, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0x55, 0x80, 0x02, 0x00, 0x00, 0xa0, 0x02, 0x00, 0x55, // .......U.......U
+ 0xa0, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0xaa, 0x81, 0x00, 0x00, 0xe4, // ................
+ 0x80, 0x06, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0x55, 0x80, 0x05, 0x00, 0x00, // ...........U....
+ 0x03, 0x00, 0x00, 0x11, 0x80, 0x00, 0x00, 0x55, 0x80, 0x00, 0x00, 0x00, 0x80, 0x04, 0x00, 0x00, // .......U........
+ 0x04, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0xaa, 0xa0, 0x02, 0x00, 0xff, // ................
+ 0xa0, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, // ................
+ 0x80, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x55, // ...............U
+ 0x80, 0x05, 0x00, 0x00, 0x03, 0x00, 0x08, 0x08, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xff, // ................
+ 0x90, 0x01, 0x00, 0x00, 0x02, 0x00, 0x08, 0x07, 0x80, 0x00, 0x00, 0xe4, 0x90, 0xff, 0xff, 0x00, // ................
+ 0x00, 0x00, // ..
};
static const uint8_t fs_font_distance_field_dx11[1053] =
{
diff --git a/3rdparty/bgfx/examples/common/font/fs_font_distance_field_subpixel.bin.h b/3rdparty/bgfx/examples/common/font/fs_font_distance_field_subpixel.bin.h
index 154481dc393..46bdf5ab710 100644
--- a/3rdparty/bgfx/examples/common/font/fs_font_distance_field_subpixel.bin.h
+++ b/3rdparty/bgfx/examples/common/font/fs_font_distance_field_subpixel.bin.h
@@ -81,65 +81,65 @@ static const uint8_t fs_font_distance_field_subpixel_glsl[1268] =
0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x77, 0x29, 0x3b, 0x0a, // * v_color0.w);.
0x7d, 0x0a, 0x0a, 0x00, // }...
};
-static const uint8_t fs_font_distance_field_subpixel_dx9[906] =
+static const uint8_t fs_font_distance_field_subpixel_dx9[902] =
{
0x46, 0x53, 0x48, 0x04, 0x01, 0x83, 0xf2, 0xe1, 0x01, 0x00, 0x0a, 0x73, 0x5f, 0x74, 0x65, 0x78, // FSH........s_tex
- 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x01, 0x00, 0x00, 0x01, 0x00, 0x6c, 0x03, 0x00, 0x03, 0xff, // Color0.....l....
- 0xff, 0xfe, 0xff, 0x23, 0x00, 0x43, 0x54, 0x41, 0x42, 0x1c, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, // ...#.CTAB....S..
+ 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x01, 0x00, 0x00, 0x01, 0x00, 0x68, 0x03, 0x00, 0x03, 0xff, // Color0.....h....
+ 0xff, 0xfe, 0xff, 0x22, 0x00, 0x43, 0x54, 0x41, 0x42, 0x1c, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, // ...".CTAB....S..
0x00, 0x00, 0x03, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x91, 0x00, // ................
0x00, 0x4c, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, // .L...0..........
0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, // .<.......s_texCo
0x6c, 0x6f, 0x72, 0x00, 0xab, 0x04, 0x00, 0x0e, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, // lor.............
0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x73, 0x5f, 0x33, 0x5f, 0x30, 0x00, 0x4d, 0x69, 0x63, 0x72, // .....ps_3_0.Micr
0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, // osoft (R) HLSL S
- 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x31, // hader Compiler 1
- 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x30, 0x30, 0x31, 0x31, 0x2e, 0x31, 0x36, 0x33, 0x38, 0x34, 0x00, // 0.0.10011.16384.
- 0xab, 0x51, 0x00, 0x00, 0x05, 0x00, 0x00, 0x0f, 0xa0, 0x00, 0x00, 0x80, 0x40, 0x00, 0x00, 0x00, // .Q..........@...
- 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x51, 0x00, 0x00, 0x05, 0x01, 0x00, 0x0f, // ?.......?Q......
- 0xa0, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0xbf, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x40, // ...............@
- 0xc0, 0x51, 0x00, 0x00, 0x05, 0x02, 0x00, 0x0f, 0xa0, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x40, // .Q.............@
- 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0x00, 0x00, 0x05, 0x03, 0x00, 0x0f, // @........Q......
- 0xa0, 0xc1, 0xaa, 0x2a, 0x3e, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, // ...*>...A...?...
- 0x00, 0x1f, 0x00, 0x00, 0x02, 0x0a, 0x00, 0x00, 0x80, 0x00, 0x00, 0x08, 0x90, 0x1f, 0x00, 0x00, // ................
- 0x02, 0x05, 0x00, 0x00, 0x80, 0x01, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, // ................
- 0x98, 0x00, 0x08, 0x0f, 0xa0, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0x80, 0x01, 0x00, 0xff, // ................
- 0x90, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x55, 0xa0, 0x13, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, // .......U........
- 0x80, 0x00, 0x00, 0x00, 0x80, 0x58, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x80, 0x00, 0x00, 0x55, // .....X.........U
- 0x81, 0x00, 0x00, 0xaa, 0xa0, 0x00, 0x00, 0xff, 0xa0, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x02, // ................
- 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x55, 0x81, 0x58, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, // .......U.X......
- 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xaa, 0xa0, 0x00, 0x00, 0xaa, 0x80, 0x02, 0x00, 0x00, // ................
- 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x55, 0x80, 0x02, 0x00, 0x00, // ...........U....
- 0x03, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xe4, 0xa0, 0x58, 0x00, 0x00, // .............X..
- 0x04, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0xe4, 0x8c, 0x00, 0x00, 0xff, 0xa0, 0x00, 0x00, 0xaa, // ................
- 0xa0, 0x5b, 0x00, 0x00, 0x02, 0x01, 0x00, 0x07, 0x80, 0x01, 0x00, 0xe4, 0x90, 0x04, 0x00, 0x00, // .[..............
- 0x04, 0x02, 0x00, 0x07, 0x80, 0x01, 0x00, 0xe4, 0x80, 0x03, 0x00, 0x00, 0xa1, 0x01, 0x00, 0xe4, // ................
- 0x90, 0x42, 0x00, 0x00, 0x03, 0x02, 0x00, 0x0f, 0x80, 0x02, 0x00, 0xe4, 0x80, 0x00, 0x08, 0xe4, // .B..............
- 0xa0, 0x09, 0x00, 0x00, 0x03, 0x02, 0x00, 0x01, 0x80, 0x02, 0x00, 0xc6, 0x80, 0x00, 0x00, 0xe4, // ................
- 0x80, 0x04, 0x00, 0x00, 0x04, 0x03, 0x00, 0x07, 0x80, 0x01, 0x00, 0xe4, 0x80, 0x03, 0x00, 0x00, // ................
- 0xa0, 0x01, 0x00, 0xe4, 0x90, 0x08, 0x00, 0x00, 0x03, 0x01, 0x00, 0x01, 0x80, 0x01, 0x00, 0xe4, // ................
- 0x80, 0x01, 0x00, 0xe4, 0x80, 0x07, 0x00, 0x00, 0x02, 0x01, 0x00, 0x01, 0x80, 0x01, 0x00, 0x00, // ................
- 0x80, 0x06, 0x00, 0x00, 0x02, 0x01, 0x00, 0x01, 0x80, 0x01, 0x00, 0x00, 0x80, 0x42, 0x00, 0x00, // .............B..
- 0x03, 0x03, 0x00, 0x0f, 0x80, 0x03, 0x00, 0xe4, 0x80, 0x00, 0x08, 0xe4, 0xa0, 0x09, 0x00, 0x00, // ................
- 0x03, 0x02, 0x00, 0x04, 0x80, 0x03, 0x00, 0xc6, 0x80, 0x00, 0x00, 0xe4, 0x80, 0x02, 0x00, 0x00, // ................
- 0x03, 0x00, 0x00, 0x01, 0x80, 0x02, 0x00, 0xaa, 0x80, 0x02, 0x00, 0x00, 0x80, 0x05, 0x00, 0x00, // ................
- 0x03, 0x02, 0x00, 0x02, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x55, 0xa0, 0x01, 0x00, 0x00, // ...........U....
- 0x02, 0x00, 0x00, 0x07, 0x80, 0x01, 0x00, 0xe4, 0x91, 0x5c, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, // ................
- 0x80, 0x00, 0x00, 0xe4, 0x80, 0x08, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0xe4, // ................
- 0x80, 0x00, 0x00, 0xe4, 0x80, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, // ................
- 0x80, 0x06, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, // ................
- 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x04, 0x00, 0x00, // ................
- 0x04, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0x55, 0xa1, 0x03, 0x00, 0xaa, // ...........U....
- 0xa0, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0x55, // ...............U
- 0xa0, 0x03, 0x00, 0xaa, 0xa0, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x55, // ...............U
- 0x81, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0e, 0x80, 0x00, 0x00, 0x55, // ...............U
- 0x81, 0x02, 0x00, 0x90, 0x80, 0x05, 0x00, 0x00, 0x03, 0x00, 0x08, 0x08, 0x80, 0x02, 0x00, 0x55, // ...............U
- 0x80, 0x00, 0x00, 0xff, 0x90, 0x06, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, // ................
- 0x80, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x17, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xf9, // ................
- 0x80, 0x04, 0x00, 0x00, 0x04, 0x01, 0x00, 0x07, 0x80, 0x00, 0x00, 0xe4, 0x80, 0x02, 0x00, 0x00, // ................
- 0xa0, 0x02, 0x00, 0x55, 0xa0, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0xe4, // ...U............
- 0x80, 0x00, 0x00, 0xe4, 0x80, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0xe4, // ................
- 0x80, 0x01, 0x00, 0xe4, 0x80, 0x05, 0x00, 0x00, 0x03, 0x00, 0x08, 0x07, 0x80, 0x00, 0x00, 0xe4, // ................
- 0x80, 0x00, 0x00, 0xff, 0x90, 0xff, 0xff, 0x00, 0x00, 0x00, // ..........
+ 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x39, // hader Compiler 9
+ 0x2e, 0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, 0x2e, 0x33, 0x31, 0x31, 0x31, 0x00, 0x51, 0x00, 0x00, // .29.952.3111.Q..
+ 0x05, 0x00, 0x00, 0x0f, 0xa0, 0x00, 0x00, 0x80, 0x40, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, // ........@...?...
+ 0x00, 0x00, 0x00, 0x80, 0x3f, 0x51, 0x00, 0x00, 0x05, 0x01, 0x00, 0x0f, 0xa0, 0x00, 0x00, 0x00, // ....?Q..........
+ 0x80, 0x00, 0x00, 0x80, 0xbf, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x40, 0xc0, 0x51, 0x00, 0x00, // ...........@.Q..
+ 0x05, 0x02, 0x00, 0x0f, 0xa0, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x00, // ...........@@...
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0x00, 0x00, 0x05, 0x03, 0x00, 0x0f, 0xa0, 0xc1, 0xaa, 0x2a, // .....Q.........*
+ 0x3e, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, // >...A...?.......
+ 0x02, 0x0a, 0x00, 0x00, 0x80, 0x00, 0x00, 0x08, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, // ................
+ 0x80, 0x01, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x98, 0x00, 0x08, 0x0f, // ................
+ 0xa0, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0x80, 0x01, 0x00, 0xff, 0x90, 0x00, 0x00, 0x00, // ................
+ 0xa0, 0x00, 0x00, 0x55, 0xa0, 0x13, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0x00, // ...U............
+ 0x80, 0x58, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x80, 0x00, 0x00, 0x55, 0x81, 0x00, 0x00, 0xaa, // .X.........U....
+ 0xa0, 0x00, 0x00, 0xff, 0xa0, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0x00, // ................
+ 0x80, 0x00, 0x00, 0x55, 0x81, 0x58, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, // ...U.X..........
+ 0x80, 0x00, 0x00, 0xaa, 0xa0, 0x00, 0x00, 0xaa, 0x80, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, // ................
+ 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x55, 0x80, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, // .......U........
+ 0x80, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xe4, 0xa0, 0x58, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0f, // .........X......
+ 0x80, 0x00, 0x00, 0xe4, 0x8c, 0x00, 0x00, 0xff, 0xa0, 0x00, 0x00, 0xaa, 0xa0, 0x5b, 0x00, 0x00, // .............[..
+ 0x02, 0x01, 0x00, 0x07, 0x80, 0x01, 0x00, 0xe4, 0x90, 0x04, 0x00, 0x00, 0x04, 0x02, 0x00, 0x07, // ................
+ 0x80, 0x01, 0x00, 0xe4, 0x80, 0x03, 0x00, 0x00, 0xa1, 0x01, 0x00, 0xe4, 0x90, 0x42, 0x00, 0x00, // .............B..
+ 0x03, 0x02, 0x00, 0x0f, 0x80, 0x02, 0x00, 0xe4, 0x80, 0x00, 0x08, 0xe4, 0xa0, 0x09, 0x00, 0x00, // ................
+ 0x03, 0x02, 0x00, 0x01, 0x80, 0x02, 0x00, 0xc6, 0x80, 0x00, 0x00, 0xe4, 0x80, 0x04, 0x00, 0x00, // ................
+ 0x04, 0x03, 0x00, 0x07, 0x80, 0x01, 0x00, 0xe4, 0x80, 0x03, 0x00, 0x00, 0xa0, 0x01, 0x00, 0xe4, // ................
+ 0x90, 0x08, 0x00, 0x00, 0x03, 0x01, 0x00, 0x01, 0x80, 0x01, 0x00, 0xe4, 0x80, 0x01, 0x00, 0xe4, // ................
+ 0x80, 0x07, 0x00, 0x00, 0x02, 0x01, 0x00, 0x01, 0x80, 0x01, 0x00, 0x00, 0x80, 0x06, 0x00, 0x00, // ................
+ 0x02, 0x01, 0x00, 0x01, 0x80, 0x01, 0x00, 0x00, 0x80, 0x42, 0x00, 0x00, 0x03, 0x03, 0x00, 0x0f, // .........B......
+ 0x80, 0x03, 0x00, 0xe4, 0x80, 0x00, 0x08, 0xe4, 0xa0, 0x09, 0x00, 0x00, 0x03, 0x02, 0x00, 0x04, // ................
+ 0x80, 0x03, 0x00, 0xc6, 0x80, 0x00, 0x00, 0xe4, 0x80, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, // ................
+ 0x80, 0x02, 0x00, 0xaa, 0x80, 0x02, 0x00, 0x00, 0x80, 0x05, 0x00, 0x00, 0x03, 0x02, 0x00, 0x02, // ................
+ 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x55, 0xa0, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, // .......U........
+ 0x80, 0x01, 0x00, 0xe4, 0x91, 0x5c, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0xe4, // ................
+ 0x80, 0x08, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0xe4, 0x80, 0x00, 0x00, 0xe4, // ................
+ 0x80, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x80, 0x06, 0x00, 0x00, // ................
+ 0x02, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, // ................
+ 0x80, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, // ................
+ 0x80, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0x55, 0xa1, 0x03, 0x00, 0xaa, 0xa0, 0x04, 0x00, 0x00, // .......U........
+ 0x04, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0x55, 0xa0, 0x03, 0x00, 0xaa, // ...........U....
+ 0xa0, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x55, 0x81, 0x00, 0x00, 0x00, // ...........U....
+ 0x80, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0e, 0x80, 0x00, 0x00, 0x55, 0x81, 0x02, 0x00, 0x90, // ...........U....
+ 0x80, 0x05, 0x00, 0x00, 0x03, 0x00, 0x08, 0x08, 0x80, 0x02, 0x00, 0x55, 0x80, 0x00, 0x00, 0xff, // ...........U....
+ 0x90, 0x06, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x80, 0x05, 0x00, 0x00, // ................
+ 0x03, 0x00, 0x00, 0x17, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xf9, 0x80, 0x04, 0x00, 0x00, // ................
+ 0x04, 0x01, 0x00, 0x07, 0x80, 0x00, 0x00, 0xe4, 0x80, 0x02, 0x00, 0x00, 0xa0, 0x02, 0x00, 0x55, // ...............U
+ 0xa0, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0xe4, 0x80, 0x00, 0x00, 0xe4, // ................
+ 0x80, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0xe4, 0x80, 0x01, 0x00, 0xe4, // ................
+ 0x80, 0x05, 0x00, 0x00, 0x03, 0x00, 0x08, 0x07, 0x80, 0x00, 0x00, 0xe4, 0x80, 0x00, 0x00, 0xff, // ................
+ 0x90, 0xff, 0xff, 0x00, 0x00, 0x00, // ......
};
static const uint8_t fs_font_distance_field_subpixel_dx11[1305] =
{
diff --git a/3rdparty/bgfx/examples/common/font/text_buffer_manager.cpp b/3rdparty/bgfx/examples/common/font/text_buffer_manager.cpp
index 540a0ea3869..230eb97e164 100644
--- a/3rdparty/bgfx/examples/common/font/text_buffer_manager.cpp
+++ b/3rdparty/bgfx/examples/common/font/text_buffer_manager.cpp
@@ -1,6 +1,6 @@
/*
* Copyright 2013 Jeremie Roy. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "../common.h"
diff --git a/3rdparty/bgfx/examples/common/font/text_buffer_manager.h b/3rdparty/bgfx/examples/common/font/text_buffer_manager.h
index bdffe7b035c..0183b39ee07 100644
--- a/3rdparty/bgfx/examples/common/font/text_buffer_manager.h
+++ b/3rdparty/bgfx/examples/common/font/text_buffer_manager.h
@@ -1,6 +1,6 @@
/*
* Copyright 2013 Jeremie Roy. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#ifndef TEXT_BUFFER_MANAGER_H_HEADER_GUARD
diff --git a/3rdparty/bgfx/examples/common/font/text_metrics.cpp b/3rdparty/bgfx/examples/common/font/text_metrics.cpp
index 677a3585e9c..768ebbdac4c 100644
--- a/3rdparty/bgfx/examples/common/font/text_metrics.cpp
+++ b/3rdparty/bgfx/examples/common/font/text_metrics.cpp
@@ -1,6 +1,6 @@
/*
* Copyright 2013 Jeremie Roy. All rights reserved.
-* License: http://www.opensource.org/licenses/BSD-2-Clause
+* License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include <wchar.h> // wcslen
diff --git a/3rdparty/bgfx/examples/common/font/text_metrics.h b/3rdparty/bgfx/examples/common/font/text_metrics.h
index 80d9a5c80d2..ec373c7eb60 100644
--- a/3rdparty/bgfx/examples/common/font/text_metrics.h
+++ b/3rdparty/bgfx/examples/common/font/text_metrics.h
@@ -1,6 +1,6 @@
/*
* Copyright 2013 Jeremie Roy. All rights reserved.
-* License: http://www.opensource.org/licenses/BSD-2-Clause
+* License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#ifndef TEXT_METRICS_H_HEADER_GUARD
diff --git a/3rdparty/bgfx/examples/common/font/vs_font_basic.bin.h b/3rdparty/bgfx/examples/common/font/vs_font_basic.bin.h
index 884743b9973..5df95fa7cce 100644
--- a/3rdparty/bgfx/examples/common/font/vs_font_basic.bin.h
+++ b/3rdparty/bgfx/examples/common/font/vs_font_basic.bin.h
@@ -28,11 +28,11 @@ static const uint8_t vs_font_basic_glsl[431] =
0x64, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x20, 0x3d, // d0;. v_color0 =
0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // a_color0;.}...
};
-static const uint8_t vs_font_basic_dx9[339] =
+static const uint8_t vs_font_basic_dx9[335] =
{
0x56, 0x53, 0x48, 0x04, 0x01, 0x83, 0xf2, 0xe1, 0x01, 0x00, 0x0f, 0x75, 0x5f, 0x6d, 0x6f, 0x64, // VSH........u_mod
0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, 0x00, 0x00, 0x04, 0x00, // elViewProj......
- 0x30, 0x01, 0x00, 0x03, 0xfe, 0xff, 0xfe, 0xff, 0x24, 0x00, 0x43, 0x54, 0x41, 0x42, 0x1c, 0x00, // 0.......$.CTAB..
+ 0x2c, 0x01, 0x00, 0x03, 0xfe, 0xff, 0xfe, 0xff, 0x23, 0x00, 0x43, 0x54, 0x41, 0x42, 0x1c, 0x00, // ,.......#.CTAB..
0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x00, 0x03, 0xfe, 0xff, 0x01, 0x00, 0x00, 0x00, 0x1c, 0x00, // ..W.............
0x00, 0x00, 0x00, 0x91, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x02, 0x00, // ......P...0.....
0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x5f, // ......@.......u_
@@ -40,18 +40,17 @@ static const uint8_t vs_font_basic_dx9[339] =
0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x73, // ..............vs
0x5f, 0x33, 0x5f, 0x30, 0x00, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, // _3_0.Microsoft (
0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, // R) HLSL Shader C
- 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x31, 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x30, 0x30, // ompiler 10.0.100
- 0x31, 0x31, 0x2e, 0x31, 0x36, 0x33, 0x38, 0x34, 0x00, 0xab, 0x1f, 0x00, 0x00, 0x02, 0x0a, 0x00, // 11.16384........
- 0x00, 0x80, 0x00, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, // ................
- 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x80, 0x02, 0x00, 0x0f, 0x90, 0x1f, 0x00, // ................
- 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f, 0xe0, 0x1f, 0x00, 0x00, 0x02, 0x0a, 0x00, // ................
- 0x00, 0x80, 0x01, 0x00, 0x0f, 0xe0, 0x1f, 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x80, 0x02, 0x00, // ................
- 0x0f, 0xe0, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0x80, 0x01, 0x00, 0xe4, 0xa0, 0x01, 0x00, // ................
- 0x55, 0x90, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0xe4, 0xa0, 0x01, 0x00, // U...............
- 0x00, 0x90, 0x00, 0x00, 0xe4, 0x80, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, // ................
- 0xe4, 0x80, 0x03, 0x00, 0xe4, 0xa0, 0x01, 0x00, 0x00, 0x02, 0x01, 0x00, 0x0f, 0xe0, 0x00, 0x00, // ................
- 0xe4, 0x90, 0x01, 0x00, 0x00, 0x02, 0x02, 0x00, 0x0f, 0xe0, 0x02, 0x00, 0xe4, 0x90, 0xff, 0xff, // ................
- 0x00, 0x00, 0x00, // ...
+ 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x39, 0x2e, 0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, // ompiler 9.29.952
+ 0x2e, 0x33, 0x31, 0x31, 0x31, 0x00, 0x1f, 0x00, 0x00, 0x02, 0x0a, 0x00, 0x00, 0x80, 0x00, 0x00, // .3111...........
+ 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x0f, 0x90, 0x1f, 0x00, // ................
+ 0x00, 0x02, 0x05, 0x00, 0x00, 0x80, 0x02, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, // ................
+ 0x00, 0x80, 0x00, 0x00, 0x0f, 0xe0, 0x1f, 0x00, 0x00, 0x02, 0x0a, 0x00, 0x00, 0x80, 0x01, 0x00, // ................
+ 0x0f, 0xe0, 0x1f, 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x80, 0x02, 0x00, 0x0f, 0xe0, 0x05, 0x00, // ................
+ 0x00, 0x03, 0x00, 0x00, 0x0f, 0x80, 0x01, 0x00, 0xe4, 0xa0, 0x01, 0x00, 0x55, 0x90, 0x04, 0x00, // ............U...
+ 0x00, 0x04, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0xe4, 0xa0, 0x01, 0x00, 0x00, 0x90, 0x00, 0x00, // ................
+ 0xe4, 0x80, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, 0xe4, 0x80, 0x03, 0x00, // ................
+ 0xe4, 0xa0, 0x01, 0x00, 0x00, 0x02, 0x01, 0x00, 0x0f, 0xe0, 0x00, 0x00, 0xe4, 0x90, 0x01, 0x00, // ................
+ 0x00, 0x02, 0x02, 0x00, 0x0f, 0xe0, 0x02, 0x00, 0xe4, 0x90, 0xff, 0xff, 0x00, 0x00, 0x00, // ...............
};
static const uint8_t vs_font_basic_dx11[580] =
{
diff --git a/3rdparty/bgfx/examples/common/font/vs_font_distance_field.bin.h b/3rdparty/bgfx/examples/common/font/vs_font_distance_field.bin.h
index ebc7589c408..6fea18b931a 100644
--- a/3rdparty/bgfx/examples/common/font/vs_font_distance_field.bin.h
+++ b/3rdparty/bgfx/examples/common/font/vs_font_distance_field.bin.h
@@ -28,11 +28,11 @@ static const uint8_t vs_font_distance_field_glsl[431] =
0x64, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x20, 0x3d, // d0;. v_color0 =
0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // a_color0;.}...
};
-static const uint8_t vs_font_distance_field_dx9[339] =
+static const uint8_t vs_font_distance_field_dx9[335] =
{
0x56, 0x53, 0x48, 0x04, 0x01, 0x83, 0xf2, 0xe1, 0x01, 0x00, 0x0f, 0x75, 0x5f, 0x6d, 0x6f, 0x64, // VSH........u_mod
0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, 0x00, 0x00, 0x04, 0x00, // elViewProj......
- 0x30, 0x01, 0x00, 0x03, 0xfe, 0xff, 0xfe, 0xff, 0x24, 0x00, 0x43, 0x54, 0x41, 0x42, 0x1c, 0x00, // 0.......$.CTAB..
+ 0x2c, 0x01, 0x00, 0x03, 0xfe, 0xff, 0xfe, 0xff, 0x23, 0x00, 0x43, 0x54, 0x41, 0x42, 0x1c, 0x00, // ,.......#.CTAB..
0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x00, 0x03, 0xfe, 0xff, 0x01, 0x00, 0x00, 0x00, 0x1c, 0x00, // ..W.............
0x00, 0x00, 0x00, 0x91, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x02, 0x00, // ......P...0.....
0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x5f, // ......@.......u_
@@ -40,18 +40,17 @@ static const uint8_t vs_font_distance_field_dx9[339] =
0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x73, // ..............vs
0x5f, 0x33, 0x5f, 0x30, 0x00, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, // _3_0.Microsoft (
0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, // R) HLSL Shader C
- 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x31, 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x30, 0x30, // ompiler 10.0.100
- 0x31, 0x31, 0x2e, 0x31, 0x36, 0x33, 0x38, 0x34, 0x00, 0xab, 0x1f, 0x00, 0x00, 0x02, 0x0a, 0x00, // 11.16384........
- 0x00, 0x80, 0x00, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, // ................
- 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x80, 0x02, 0x00, 0x0f, 0x90, 0x1f, 0x00, // ................
- 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f, 0xe0, 0x1f, 0x00, 0x00, 0x02, 0x0a, 0x00, // ................
- 0x00, 0x80, 0x01, 0x00, 0x0f, 0xe0, 0x1f, 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x80, 0x02, 0x00, // ................
- 0x0f, 0xe0, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0x80, 0x01, 0x00, 0xe4, 0xa0, 0x01, 0x00, // ................
- 0x55, 0x90, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0xe4, 0xa0, 0x01, 0x00, // U...............
- 0x00, 0x90, 0x00, 0x00, 0xe4, 0x80, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, // ................
- 0xe4, 0x80, 0x03, 0x00, 0xe4, 0xa0, 0x01, 0x00, 0x00, 0x02, 0x01, 0x00, 0x0f, 0xe0, 0x00, 0x00, // ................
- 0xe4, 0x90, 0x01, 0x00, 0x00, 0x02, 0x02, 0x00, 0x0f, 0xe0, 0x02, 0x00, 0xe4, 0x90, 0xff, 0xff, // ................
- 0x00, 0x00, 0x00, // ...
+ 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x39, 0x2e, 0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, // ompiler 9.29.952
+ 0x2e, 0x33, 0x31, 0x31, 0x31, 0x00, 0x1f, 0x00, 0x00, 0x02, 0x0a, 0x00, 0x00, 0x80, 0x00, 0x00, // .3111...........
+ 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x0f, 0x90, 0x1f, 0x00, // ................
+ 0x00, 0x02, 0x05, 0x00, 0x00, 0x80, 0x02, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, // ................
+ 0x00, 0x80, 0x00, 0x00, 0x0f, 0xe0, 0x1f, 0x00, 0x00, 0x02, 0x0a, 0x00, 0x00, 0x80, 0x01, 0x00, // ................
+ 0x0f, 0xe0, 0x1f, 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x80, 0x02, 0x00, 0x0f, 0xe0, 0x05, 0x00, // ................
+ 0x00, 0x03, 0x00, 0x00, 0x0f, 0x80, 0x01, 0x00, 0xe4, 0xa0, 0x01, 0x00, 0x55, 0x90, 0x04, 0x00, // ............U...
+ 0x00, 0x04, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0xe4, 0xa0, 0x01, 0x00, 0x00, 0x90, 0x00, 0x00, // ................
+ 0xe4, 0x80, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, 0xe4, 0x80, 0x03, 0x00, // ................
+ 0xe4, 0xa0, 0x01, 0x00, 0x00, 0x02, 0x01, 0x00, 0x0f, 0xe0, 0x00, 0x00, 0xe4, 0x90, 0x01, 0x00, // ................
+ 0x00, 0x02, 0x02, 0x00, 0x0f, 0xe0, 0x02, 0x00, 0xe4, 0x90, 0xff, 0xff, 0x00, 0x00, 0x00, // ...............
};
static const uint8_t vs_font_distance_field_dx11[580] =
{
diff --git a/3rdparty/bgfx/examples/common/font/vs_font_distance_field_subpixel.bin.h b/3rdparty/bgfx/examples/common/font/vs_font_distance_field_subpixel.bin.h
index 6b0d75236d6..bd885e453e3 100644
--- a/3rdparty/bgfx/examples/common/font/vs_font_distance_field_subpixel.bin.h
+++ b/3rdparty/bgfx/examples/common/font/vs_font_distance_field_subpixel.bin.h
@@ -28,11 +28,11 @@ static const uint8_t vs_font_distance_field_subpixel_glsl[431] =
0x64, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x20, 0x3d, // d0;. v_color0 =
0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // a_color0;.}...
};
-static const uint8_t vs_font_distance_field_subpixel_dx9[339] =
+static const uint8_t vs_font_distance_field_subpixel_dx9[335] =
{
0x56, 0x53, 0x48, 0x04, 0x01, 0x83, 0xf2, 0xe1, 0x01, 0x00, 0x0f, 0x75, 0x5f, 0x6d, 0x6f, 0x64, // VSH........u_mod
0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, 0x00, 0x00, 0x04, 0x00, // elViewProj......
- 0x30, 0x01, 0x00, 0x03, 0xfe, 0xff, 0xfe, 0xff, 0x24, 0x00, 0x43, 0x54, 0x41, 0x42, 0x1c, 0x00, // 0.......$.CTAB..
+ 0x2c, 0x01, 0x00, 0x03, 0xfe, 0xff, 0xfe, 0xff, 0x23, 0x00, 0x43, 0x54, 0x41, 0x42, 0x1c, 0x00, // ,.......#.CTAB..
0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x00, 0x03, 0xfe, 0xff, 0x01, 0x00, 0x00, 0x00, 0x1c, 0x00, // ..W.............
0x00, 0x00, 0x00, 0x91, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x02, 0x00, // ......P...0.....
0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x5f, // ......@.......u_
@@ -40,18 +40,17 @@ static const uint8_t vs_font_distance_field_subpixel_dx9[339] =
0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x73, // ..............vs
0x5f, 0x33, 0x5f, 0x30, 0x00, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, // _3_0.Microsoft (
0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, // R) HLSL Shader C
- 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x31, 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x30, 0x30, // ompiler 10.0.100
- 0x31, 0x31, 0x2e, 0x31, 0x36, 0x33, 0x38, 0x34, 0x00, 0xab, 0x1f, 0x00, 0x00, 0x02, 0x0a, 0x00, // 11.16384........
- 0x00, 0x80, 0x00, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, // ................
- 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x80, 0x02, 0x00, 0x0f, 0x90, 0x1f, 0x00, // ................
- 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f, 0xe0, 0x1f, 0x00, 0x00, 0x02, 0x0a, 0x00, // ................
- 0x00, 0x80, 0x01, 0x00, 0x0f, 0xe0, 0x1f, 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x80, 0x02, 0x00, // ................
- 0x0f, 0xe0, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0x80, 0x01, 0x00, 0xe4, 0xa0, 0x01, 0x00, // ................
- 0x55, 0x90, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0xe4, 0xa0, 0x01, 0x00, // U...............
- 0x00, 0x90, 0x00, 0x00, 0xe4, 0x80, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, // ................
- 0xe4, 0x80, 0x03, 0x00, 0xe4, 0xa0, 0x01, 0x00, 0x00, 0x02, 0x01, 0x00, 0x0f, 0xe0, 0x00, 0x00, // ................
- 0xe4, 0x90, 0x01, 0x00, 0x00, 0x02, 0x02, 0x00, 0x0f, 0xe0, 0x02, 0x00, 0xe4, 0x90, 0xff, 0xff, // ................
- 0x00, 0x00, 0x00, // ...
+ 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x39, 0x2e, 0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, // ompiler 9.29.952
+ 0x2e, 0x33, 0x31, 0x31, 0x31, 0x00, 0x1f, 0x00, 0x00, 0x02, 0x0a, 0x00, 0x00, 0x80, 0x00, 0x00, // .3111...........
+ 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x0f, 0x90, 0x1f, 0x00, // ................
+ 0x00, 0x02, 0x05, 0x00, 0x00, 0x80, 0x02, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, // ................
+ 0x00, 0x80, 0x00, 0x00, 0x0f, 0xe0, 0x1f, 0x00, 0x00, 0x02, 0x0a, 0x00, 0x00, 0x80, 0x01, 0x00, // ................
+ 0x0f, 0xe0, 0x1f, 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x80, 0x02, 0x00, 0x0f, 0xe0, 0x05, 0x00, // ................
+ 0x00, 0x03, 0x00, 0x00, 0x0f, 0x80, 0x01, 0x00, 0xe4, 0xa0, 0x01, 0x00, 0x55, 0x90, 0x04, 0x00, // ............U...
+ 0x00, 0x04, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0xe4, 0xa0, 0x01, 0x00, 0x00, 0x90, 0x00, 0x00, // ................
+ 0xe4, 0x80, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, 0xe4, 0x80, 0x03, 0x00, // ................
+ 0xe4, 0xa0, 0x01, 0x00, 0x00, 0x02, 0x01, 0x00, 0x0f, 0xe0, 0x00, 0x00, 0xe4, 0x90, 0x01, 0x00, // ................
+ 0x00, 0x02, 0x02, 0x00, 0x0f, 0xe0, 0x02, 0x00, 0xe4, 0x90, 0xff, 0xff, 0x00, 0x00, 0x00, // ...............
};
static const uint8_t vs_font_distance_field_subpixel_dx11[580] =
{
diff --git a/3rdparty/bgfx/examples/common/imgui/fs_imgui_color.bin.h b/3rdparty/bgfx/examples/common/imgui/fs_imgui_color.bin.h
index d64b2bdf7ca..611a46bc560 100644
--- a/3rdparty/bgfx/examples/common/imgui/fs_imgui_color.bin.h
+++ b/3rdparty/bgfx/examples/common/imgui/fs_imgui_color.bin.h
@@ -7,17 +7,17 @@ static const uint8_t fs_imgui_color_glsl[89] =
0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, // ragColor = v_col
0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // or0;.}...
};
-static const uint8_t fs_imgui_color_dx9[141] =
+static const uint8_t fs_imgui_color_dx9[137] =
{
- 0x46, 0x53, 0x48, 0x04, 0xa4, 0x8b, 0xef, 0x49, 0x00, 0x00, 0x80, 0x00, 0x00, 0x03, 0xff, 0xff, // FSH....I........
- 0xfe, 0xff, 0x17, 0x00, 0x43, 0x54, 0x41, 0x42, 0x1c, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, // ....CTAB....#...
+ 0x46, 0x53, 0x48, 0x04, 0xa4, 0x8b, 0xef, 0x49, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x03, 0xff, 0xff, // FSH....I..|.....
+ 0xfe, 0xff, 0x16, 0x00, 0x43, 0x54, 0x41, 0x42, 0x1c, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, // ....CTAB....#...
0x00, 0x03, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x91, 0x00, 0x00, // ................
0x1c, 0x00, 0x00, 0x00, 0x70, 0x73, 0x5f, 0x33, 0x5f, 0x30, 0x00, 0x4d, 0x69, 0x63, 0x72, 0x6f, // ....ps_3_0.Micro
0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, 0x68, // soft (R) HLSL Sh
- 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x31, 0x30, // ader Compiler 10
- 0x2e, 0x30, 0x2e, 0x31, 0x30, 0x30, 0x31, 0x31, 0x2e, 0x31, 0x36, 0x33, 0x38, 0x34, 0x00, 0xab, // .0.10011.16384..
- 0x1f, 0x00, 0x00, 0x02, 0x0a, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f, 0x90, 0x01, 0x00, 0x00, 0x02, // ................
- 0x00, 0x08, 0x0f, 0x80, 0x00, 0x00, 0xe4, 0x90, 0xff, 0xff, 0x00, 0x00, 0x00, // .............
+ 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x39, 0x2e, // ader Compiler 9.
+ 0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, 0x2e, 0x33, 0x31, 0x31, 0x31, 0x00, 0x1f, 0x00, 0x00, 0x02, // 29.952.3111.....
+ 0x0a, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f, 0x90, 0x01, 0x00, 0x00, 0x02, 0x00, 0x08, 0x0f, 0x80, // ................
+ 0x00, 0x00, 0xe4, 0x90, 0xff, 0xff, 0x00, 0x00, 0x00, // .........
};
static const uint8_t fs_imgui_color_dx11[260] =
{
diff --git a/3rdparty/bgfx/examples/common/imgui/fs_imgui_color.sc b/3rdparty/bgfx/examples/common/imgui/fs_imgui_color.sc
index c1b51ac3104..e1b4bd89184 100644
--- a/3rdparty/bgfx/examples/common/imgui/fs_imgui_color.sc
+++ b/3rdparty/bgfx/examples/common/imgui/fs_imgui_color.sc
@@ -1,8 +1,8 @@
$input v_color0
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include <bgfx_shader.sh>
diff --git a/3rdparty/bgfx/examples/common/imgui/fs_imgui_cubemap.bin.h b/3rdparty/bgfx/examples/common/imgui/fs_imgui_cubemap.bin.h
index f274ada3d9c..265aef506c1 100644
--- a/3rdparty/bgfx/examples/common/imgui/fs_imgui_cubemap.bin.h
+++ b/3rdparty/bgfx/examples/common/imgui/fs_imgui_cubemap.bin.h
@@ -24,12 +24,12 @@ static const uint8_t fs_imgui_cubemap_glsl[363] =
0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, // _FragColor = tmp
0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // var_1;.}...
};
-static const uint8_t fs_imgui_cubemap_dx9[394] =
+static const uint8_t fs_imgui_cubemap_dx9[390] =
{
0x46, 0x53, 0x48, 0x04, 0xe3, 0xc2, 0x5c, 0x65, 0x02, 0x00, 0x0a, 0x73, 0x5f, 0x74, 0x65, 0x78, // FSH....e...s_tex
0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x01, 0x00, 0x00, 0x01, 0x00, 0x11, 0x75, 0x5f, 0x69, 0x6d, // Color0......u_im
0x61, 0x67, 0x65, 0x4c, 0x6f, 0x64, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x01, 0x00, // ageLodEnabled...
- 0x00, 0x01, 0x00, 0x54, 0x01, 0x00, 0x03, 0xff, 0xff, 0xfe, 0xff, 0x31, 0x00, 0x43, 0x54, 0x41, // ...T.......1.CTA
+ 0x00, 0x01, 0x00, 0x50, 0x01, 0x00, 0x03, 0xff, 0xff, 0xfe, 0xff, 0x30, 0x00, 0x43, 0x54, 0x41, // ...P.......0.CTA
0x42, 0x1c, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0x02, 0x00, 0x00, // B...............
0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x91, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, // .............D..
0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // .........P......
@@ -40,17 +40,17 @@ static const uint8_t fs_imgui_cubemap_dx9[394] =
0x65, 0x64, 0x00, 0xab, 0xab, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, // ed..............
0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x73, 0x5f, 0x33, 0x5f, 0x30, 0x00, 0x4d, 0x69, 0x63, 0x72, // .....ps_3_0.Micr
0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, // osoft (R) HLSL S
- 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x31, // hader Compiler 1
- 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x30, 0x30, 0x31, 0x31, 0x2e, 0x31, 0x36, 0x33, 0x38, 0x34, 0x00, // 0.0.10011.16384.
- 0xab, 0x51, 0x00, 0x00, 0x05, 0x01, 0x00, 0x0f, 0xa0, 0xcd, 0xcc, 0x4c, 0x3f, 0xcd, 0xcc, 0x4c, // .Q.........L?..L
- 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x02, 0x03, 0x00, 0x00, // >...............
- 0x80, 0x00, 0x00, 0x07, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x98, 0x00, 0x08, 0x0f, // ................
- 0xa0, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0xe4, 0x90, 0x01, 0x00, 0x00, // ................
- 0x02, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x00, 0xa0, 0x5f, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, // ........._......
- 0x80, 0x00, 0x00, 0xe4, 0x80, 0x00, 0x08, 0xe4, 0xa0, 0x01, 0x00, 0x00, 0x02, 0x00, 0x08, 0x07, // ................
- 0x80, 0x00, 0x00, 0xe4, 0x80, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0x55, // ...............U
- 0xa0, 0x04, 0x00, 0x00, 0x04, 0x00, 0x08, 0x08, 0x80, 0x00, 0x00, 0x55, 0x80, 0x01, 0x00, 0x00, // ...........U....
- 0xa0, 0x01, 0x00, 0x55, 0xa0, 0xff, 0xff, 0x00, 0x00, 0x00, // ...U......
+ 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x39, // hader Compiler 9
+ 0x2e, 0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, 0x2e, 0x33, 0x31, 0x31, 0x31, 0x00, 0x51, 0x00, 0x00, // .29.952.3111.Q..
+ 0x05, 0x01, 0x00, 0x0f, 0xa0, 0xcd, 0xcc, 0x4c, 0x3f, 0xcd, 0xcc, 0x4c, 0x3e, 0x00, 0x00, 0x00, // .......L?..L>...
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x02, 0x03, 0x00, 0x00, 0x80, 0x00, 0x00, 0x07, // ................
+ 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x98, 0x00, 0x08, 0x0f, 0xa0, 0x01, 0x00, 0x00, // ................
+ 0x02, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0xe4, 0x90, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, // ................
+ 0x80, 0x00, 0x00, 0x00, 0xa0, 0x5f, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0xe4, // ....._..........
+ 0x80, 0x00, 0x08, 0xe4, 0xa0, 0x01, 0x00, 0x00, 0x02, 0x00, 0x08, 0x07, 0x80, 0x00, 0x00, 0xe4, // ................
+ 0x80, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0x55, 0xa0, 0x04, 0x00, 0x00, // ...........U....
+ 0x04, 0x00, 0x08, 0x08, 0x80, 0x00, 0x00, 0x55, 0x80, 0x01, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x55, // .......U.......U
+ 0xa0, 0xff, 0xff, 0x00, 0x00, 0x00, // ......
};
static const uint8_t fs_imgui_cubemap_dx11[441] =
{
diff --git a/3rdparty/bgfx/examples/common/imgui/fs_imgui_cubemap.sc b/3rdparty/bgfx/examples/common/imgui/fs_imgui_cubemap.sc
index 8a20f9210eb..95ca630eccb 100644
--- a/3rdparty/bgfx/examples/common/imgui/fs_imgui_cubemap.sc
+++ b/3rdparty/bgfx/examples/common/imgui/fs_imgui_cubemap.sc
@@ -1,8 +1,8 @@
$input v_normal
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include <bgfx_shader.sh>
diff --git a/3rdparty/bgfx/examples/common/imgui/fs_imgui_image.bin.h b/3rdparty/bgfx/examples/common/imgui/fs_imgui_image.bin.h
index 618848fa5a1..8496e53c794 100644
--- a/3rdparty/bgfx/examples/common/imgui/fs_imgui_image.bin.h
+++ b/3rdparty/bgfx/examples/common/imgui/fs_imgui_image.bin.h
@@ -24,12 +24,12 @@ static const uint8_t fs_imgui_image_glsl[360] =
0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // agColor = tmpvar
0x5f, 0x31, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // _1;.}...
};
-static const uint8_t fs_imgui_image_dx9[398] =
+static const uint8_t fs_imgui_image_dx9[394] =
{
0x46, 0x53, 0x48, 0x04, 0x6f, 0x1e, 0x3e, 0x3c, 0x02, 0x00, 0x0a, 0x73, 0x5f, 0x74, 0x65, 0x78, // FSH.o.><...s_tex
0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x01, 0x00, 0x00, 0x01, 0x00, 0x11, 0x75, 0x5f, 0x69, 0x6d, // Color0......u_im
0x61, 0x67, 0x65, 0x4c, 0x6f, 0x64, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x01, 0x00, // ageLodEnabled...
- 0x00, 0x01, 0x00, 0x58, 0x01, 0x00, 0x03, 0xff, 0xff, 0xfe, 0xff, 0x31, 0x00, 0x43, 0x54, 0x41, // ...X.......1.CTA
+ 0x00, 0x01, 0x00, 0x54, 0x01, 0x00, 0x03, 0xff, 0xff, 0xfe, 0xff, 0x30, 0x00, 0x43, 0x54, 0x41, // ...T.......0.CTA
0x42, 0x1c, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0x02, 0x00, 0x00, // B...............
0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x91, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, // .............D..
0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // .........P......
@@ -40,17 +40,17 @@ static const uint8_t fs_imgui_image_dx9[398] =
0x65, 0x64, 0x00, 0xab, 0xab, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, // ed..............
0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x73, 0x5f, 0x33, 0x5f, 0x30, 0x00, 0x4d, 0x69, 0x63, 0x72, // .....ps_3_0.Micr
0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, // osoft (R) HLSL S
- 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x31, // hader Compiler 1
- 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x30, 0x30, 0x31, 0x31, 0x2e, 0x31, 0x36, 0x33, 0x38, 0x34, 0x00, // 0.0.10011.16384.
- 0xab, 0x51, 0x00, 0x00, 0x05, 0x01, 0x00, 0x0f, 0xa0, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, // .Q..........?...
- 0x00, 0xcd, 0xcc, 0x4c, 0x3f, 0xcd, 0xcc, 0x4c, 0x3e, 0x1f, 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, // ...L?..L>.......
- 0x80, 0x00, 0x00, 0x03, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x90, 0x00, 0x08, 0x0f, // ................
- 0xa0, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x07, 0x80, 0x01, 0x00, 0xd0, 0xa0, 0x00, 0x00, 0xc4, // ................
- 0x90, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x00, 0xa0, 0x5f, 0x00, 0x00, // ............._..
- 0x03, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0xe4, 0x80, 0x00, 0x08, 0xe4, 0xa0, 0x01, 0x00, 0x00, // ................
- 0x02, 0x00, 0x08, 0x07, 0x80, 0x00, 0x00, 0xe4, 0x80, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0c, // ................
- 0x80, 0x01, 0x00, 0xe4, 0xa0, 0x04, 0x00, 0x00, 0x04, 0x00, 0x08, 0x08, 0x80, 0x00, 0x00, 0x55, // ...............U
- 0xa0, 0x00, 0x00, 0xaa, 0x80, 0x00, 0x00, 0xff, 0x80, 0xff, 0xff, 0x00, 0x00, 0x00, // ..............
+ 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x39, // hader Compiler 9
+ 0x2e, 0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, 0x2e, 0x33, 0x31, 0x31, 0x31, 0x00, 0x51, 0x00, 0x00, // .29.952.3111.Q..
+ 0x05, 0x01, 0x00, 0x0f, 0xa0, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xcd, 0xcc, 0x4c, // ........?......L
+ 0x3f, 0xcd, 0xcc, 0x4c, 0x3e, 0x1f, 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x80, 0x00, 0x00, 0x03, // ?..L>...........
+ 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x90, 0x00, 0x08, 0x0f, 0xa0, 0x05, 0x00, 0x00, // ................
+ 0x03, 0x00, 0x00, 0x07, 0x80, 0x01, 0x00, 0xd0, 0xa0, 0x00, 0x00, 0xc4, 0x90, 0x01, 0x00, 0x00, // ................
+ 0x02, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x00, 0xa0, 0x5f, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, // ........._......
+ 0x80, 0x00, 0x00, 0xe4, 0x80, 0x00, 0x08, 0xe4, 0xa0, 0x01, 0x00, 0x00, 0x02, 0x00, 0x08, 0x07, // ................
+ 0x80, 0x00, 0x00, 0xe4, 0x80, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0c, 0x80, 0x01, 0x00, 0xe4, // ................
+ 0xa0, 0x04, 0x00, 0x00, 0x04, 0x00, 0x08, 0x08, 0x80, 0x00, 0x00, 0x55, 0xa0, 0x00, 0x00, 0xaa, // ...........U....
+ 0x80, 0x00, 0x00, 0xff, 0x80, 0xff, 0xff, 0x00, 0x00, 0x00, // ..........
};
static const uint8_t fs_imgui_image_dx11[445] =
{
diff --git a/3rdparty/bgfx/examples/common/imgui/fs_imgui_image.sc b/3rdparty/bgfx/examples/common/imgui/fs_imgui_image.sc
index 0641be8d975..c7ee13d956d 100644
--- a/3rdparty/bgfx/examples/common/imgui/fs_imgui_image.sc
+++ b/3rdparty/bgfx/examples/common/imgui/fs_imgui_image.sc
@@ -2,7 +2,7 @@ $input v_texcoord0
/*
* Copyright 2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include <bgfx_shader.sh>
diff --git a/3rdparty/bgfx/examples/common/imgui/fs_imgui_image_swizz.bin.h b/3rdparty/bgfx/examples/common/imgui/fs_imgui_image_swizz.bin.h
index 593de84d168..237bdb1e10c 100644
--- a/3rdparty/bgfx/examples/common/imgui/fs_imgui_image_swizz.bin.h
+++ b/3rdparty/bgfx/examples/common/imgui/fs_imgui_image_swizz.bin.h
@@ -28,13 +28,13 @@ static const uint8_t fs_imgui_image_swizz_glsl[425] =
0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // ragColor = tmpva
0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // r_1;.}...
};
-static const uint8_t fs_imgui_image_swizz_dx9[462] =
+static const uint8_t fs_imgui_image_swizz_dx9[458] =
{
0x46, 0x53, 0x48, 0x04, 0x6f, 0x1e, 0x3e, 0x3c, 0x03, 0x00, 0x0a, 0x73, 0x5f, 0x74, 0x65, 0x78, // FSH.o.><...s_tex
0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x01, 0x00, 0x00, 0x01, 0x00, 0x11, 0x75, 0x5f, 0x69, 0x6d, // Color0......u_im
0x61, 0x67, 0x65, 0x4c, 0x6f, 0x64, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x01, 0x00, // ageLodEnabled...
0x00, 0x01, 0x00, 0x09, 0x75, 0x5f, 0x73, 0x77, 0x69, 0x7a, 0x7a, 0x6c, 0x65, 0x12, 0x01, 0x01, // ....u_swizzle...
- 0x00, 0x01, 0x00, 0x88, 0x01, 0x00, 0x03, 0xff, 0xff, 0xfe, 0xff, 0x39, 0x00, 0x43, 0x54, 0x41, // ...........9.CTA
+ 0x00, 0x01, 0x00, 0x84, 0x01, 0x00, 0x03, 0xff, 0xff, 0xfe, 0xff, 0x38, 0x00, 0x43, 0x54, 0x41, // ...........8.CTA
0x42, 0x1c, 0x00, 0x00, 0x00, 0xa9, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0x03, 0x00, 0x00, // B...............
0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x91, 0x00, 0x00, 0xa2, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, // .............X..
0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // .........d......
@@ -47,18 +47,18 @@ static const uint8_t fs_imgui_image_swizz_dx9[462] =
0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x5f, 0x73, 0x77, 0x69, 0x7a, 0x7a, // .........u_swizz
0x6c, 0x65, 0x00, 0x70, 0x73, 0x5f, 0x33, 0x5f, 0x30, 0x00, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, // le.ps_3_0.Micros
0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, 0x68, 0x61, // oft (R) HLSL Sha
- 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x31, 0x30, 0x2e, // der Compiler 10.
- 0x30, 0x2e, 0x31, 0x30, 0x30, 0x31, 0x31, 0x2e, 0x31, 0x36, 0x33, 0x38, 0x34, 0x00, 0xab, 0xab, // 0.10011.16384...
- 0xab, 0x51, 0x00, 0x00, 0x05, 0x02, 0x00, 0x0f, 0xa0, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, // .Q..........?...
- 0x00, 0xcd, 0xcc, 0x4c, 0x3f, 0xcd, 0xcc, 0x4c, 0x3e, 0x1f, 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, // ...L?..L>.......
- 0x80, 0x00, 0x00, 0x03, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x90, 0x00, 0x08, 0x0f, // ................
- 0xa0, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x07, 0x80, 0x02, 0x00, 0xd0, 0xa0, 0x00, 0x00, 0xc4, // ................
- 0x90, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x00, 0xa0, 0x5f, 0x00, 0x00, // ............._..
- 0x03, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0xe4, 0x80, 0x00, 0x08, 0xe4, 0xa0, 0x09, 0x00, 0x00, // ................
- 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0xe4, 0x80, 0x01, 0x00, 0xe4, 0xa0, 0x01, 0x00, 0x00, // ................
- 0x02, 0x00, 0x00, 0x0c, 0x80, 0x02, 0x00, 0xe4, 0xa0, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, // ................
- 0x80, 0x00, 0x00, 0x55, 0xa0, 0x00, 0x00, 0xaa, 0x80, 0x00, 0x00, 0xff, 0x80, 0x01, 0x00, 0x00, // ...U............
- 0x02, 0x00, 0x08, 0x0f, 0x80, 0x00, 0x00, 0x40, 0x80, 0xff, 0xff, 0x00, 0x00, 0x00, // .......@......
+ 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x39, 0x2e, 0x32, // der Compiler 9.2
+ 0x39, 0x2e, 0x39, 0x35, 0x32, 0x2e, 0x33, 0x31, 0x31, 0x31, 0x00, 0xab, 0xab, 0x51, 0x00, 0x00, // 9.952.3111...Q..
+ 0x05, 0x02, 0x00, 0x0f, 0xa0, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xcd, 0xcc, 0x4c, // ........?......L
+ 0x3f, 0xcd, 0xcc, 0x4c, 0x3e, 0x1f, 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x80, 0x00, 0x00, 0x03, // ?..L>...........
+ 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x90, 0x00, 0x08, 0x0f, 0xa0, 0x05, 0x00, 0x00, // ................
+ 0x03, 0x00, 0x00, 0x07, 0x80, 0x02, 0x00, 0xd0, 0xa0, 0x00, 0x00, 0xc4, 0x90, 0x01, 0x00, 0x00, // ................
+ 0x02, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x00, 0xa0, 0x5f, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, // ........._......
+ 0x80, 0x00, 0x00, 0xe4, 0x80, 0x00, 0x08, 0xe4, 0xa0, 0x09, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, // ................
+ 0x80, 0x00, 0x00, 0xe4, 0x80, 0x01, 0x00, 0xe4, 0xa0, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0c, // ................
+ 0x80, 0x02, 0x00, 0xe4, 0xa0, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0x55, // ...............U
+ 0xa0, 0x00, 0x00, 0xaa, 0x80, 0x00, 0x00, 0xff, 0x80, 0x01, 0x00, 0x00, 0x02, 0x00, 0x08, 0x0f, // ................
+ 0x80, 0x00, 0x00, 0x40, 0x80, 0xff, 0xff, 0x00, 0x00, 0x00, // ...@......
};
static const uint8_t fs_imgui_image_swizz_dx11[493] =
{
diff --git a/3rdparty/bgfx/examples/common/imgui/fs_imgui_image_swizz.sc b/3rdparty/bgfx/examples/common/imgui/fs_imgui_image_swizz.sc
index f19d06bf385..def45674774 100644
--- a/3rdparty/bgfx/examples/common/imgui/fs_imgui_image_swizz.sc
+++ b/3rdparty/bgfx/examples/common/imgui/fs_imgui_image_swizz.sc
@@ -2,7 +2,7 @@ $input v_texcoord0
/*
* Copyright 2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include <bgfx_shader.sh>
diff --git a/3rdparty/bgfx/examples/common/imgui/fs_imgui_latlong.bin.h b/3rdparty/bgfx/examples/common/imgui/fs_imgui_latlong.bin.h
index 14d7aef3e0b..5a54b079fe2 100644
--- a/3rdparty/bgfx/examples/common/imgui/fs_imgui_latlong.bin.h
+++ b/3rdparty/bgfx/examples/common/imgui/fs_imgui_latlong.bin.h
@@ -42,12 +42,12 @@ static const uint8_t fs_imgui_latlong_glsl[651] =
0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, // _FragColor = tmp
0x76, 0x61, 0x72, 0x5f, 0x34, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // var_4;.}...
};
-static const uint8_t fs_imgui_latlong_dx9[558] =
+static const uint8_t fs_imgui_latlong_dx9[554] =
{
0x46, 0x53, 0x48, 0x04, 0x6f, 0x1e, 0x3e, 0x3c, 0x02, 0x00, 0x0a, 0x73, 0x5f, 0x74, 0x65, 0x78, // FSH.o.><...s_tex
0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x01, 0x00, 0x00, 0x01, 0x00, 0x11, 0x75, 0x5f, 0x69, 0x6d, // Color0......u_im
0x61, 0x67, 0x65, 0x4c, 0x6f, 0x64, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x01, 0x00, // ageLodEnabled...
- 0x00, 0x01, 0x00, 0xf8, 0x01, 0x00, 0x03, 0xff, 0xff, 0xfe, 0xff, 0x31, 0x00, 0x43, 0x54, 0x41, // ...........1.CTA
+ 0x00, 0x01, 0x00, 0xf4, 0x01, 0x00, 0x03, 0xff, 0xff, 0xfe, 0xff, 0x30, 0x00, 0x43, 0x54, 0x41, // ...........0.CTA
0x42, 0x1c, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0x02, 0x00, 0x00, // B...............
0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x91, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, // .............D..
0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // .........P......
@@ -58,27 +58,27 @@ static const uint8_t fs_imgui_latlong_dx9[558] =
0x65, 0x64, 0x00, 0xab, 0xab, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, // ed..............
0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x73, 0x5f, 0x33, 0x5f, 0x30, 0x00, 0x4d, 0x69, 0x63, 0x72, // .....ps_3_0.Micr
0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, // osoft (R) HLSL S
- 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x31, // hader Compiler 1
- 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x30, 0x30, 0x31, 0x31, 0x2e, 0x31, 0x36, 0x33, 0x38, 0x34, 0x00, // 0.0.10011.16384.
- 0xab, 0x51, 0x00, 0x00, 0x05, 0x01, 0x00, 0x0f, 0xa0, 0x00, 0x00, 0x00, 0x3f, 0xdb, 0x0f, 0xc9, // .Q..........?...
- 0x40, 0xdb, 0x0f, 0x49, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x51, 0x00, 0x00, 0x05, 0x02, 0x00, 0x0f, // @..I.....Q......
- 0xa0, 0xcd, 0xcc, 0x4c, 0x3f, 0xcd, 0xcc, 0x4c, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ...L?..L>.......
- 0x00, 0x1f, 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x80, 0x00, 0x00, 0x03, 0x90, 0x1f, 0x00, 0x00, // ................
- 0x02, 0x00, 0x00, 0x00, 0x98, 0x00, 0x08, 0x0f, 0xa0, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, // ................
- 0x80, 0x01, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x90, 0x13, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, // ................
- 0x80, 0x00, 0x00, 0x00, 0x80, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, // ................
- 0x80, 0x01, 0x00, 0x55, 0xa0, 0x01, 0x00, 0xaa, 0xa0, 0x25, 0x00, 0x00, 0x02, 0x01, 0x00, 0x03, // ...U.....%......
- 0x80, 0x00, 0x00, 0x00, 0x80, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x55, // ...............U
- 0x90, 0x01, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x00, 0xa0, 0x13, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, // ................
- 0x80, 0x00, 0x00, 0x00, 0x80, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, // ................
- 0x80, 0x01, 0x00, 0x55, 0xa0, 0x01, 0x00, 0xaa, 0xa0, 0x25, 0x00, 0x00, 0x02, 0x02, 0x00, 0x03, // ...U.....%......
- 0x80, 0x00, 0x00, 0x00, 0x80, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x05, 0x80, 0x01, 0x00, 0xc5, // ................
- 0x80, 0x02, 0x00, 0x55, 0x81, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x80, 0x02, 0x00, 0x00, // ...U............
- 0x80, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x00, 0xa0, 0x5f, 0x00, 0x00, // ............._..
- 0x03, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0xe4, 0x80, 0x00, 0x08, 0xe4, 0xa0, 0x01, 0x00, 0x00, // ................
- 0x02, 0x00, 0x08, 0x07, 0x80, 0x00, 0x00, 0xe4, 0x80, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, // ................
- 0x80, 0x00, 0x00, 0x55, 0xa0, 0x04, 0x00, 0x00, 0x04, 0x00, 0x08, 0x08, 0x80, 0x00, 0x00, 0x55, // ...U...........U
- 0x80, 0x02, 0x00, 0x00, 0xa0, 0x02, 0x00, 0x55, 0xa0, 0xff, 0xff, 0x00, 0x00, 0x00, // .......U......
+ 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x39, // hader Compiler 9
+ 0x2e, 0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, 0x2e, 0x33, 0x31, 0x31, 0x31, 0x00, 0x51, 0x00, 0x00, // .29.952.3111.Q..
+ 0x05, 0x01, 0x00, 0x0f, 0xa0, 0x00, 0x00, 0x00, 0x3f, 0xdb, 0x0f, 0xc9, 0x40, 0xdb, 0x0f, 0x49, // ........?...@..I
+ 0xc0, 0x00, 0x00, 0x00, 0x00, 0x51, 0x00, 0x00, 0x05, 0x02, 0x00, 0x0f, 0xa0, 0xcd, 0xcc, 0x4c, // .....Q.........L
+ 0x3f, 0xcd, 0xcc, 0x4c, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, // ?..L>...........
+ 0x02, 0x05, 0x00, 0x00, 0x80, 0x00, 0x00, 0x03, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, // ................
+ 0x98, 0x00, 0x08, 0x0f, 0xa0, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x01, 0x00, 0x00, // ................
+ 0xa0, 0x00, 0x00, 0x00, 0x90, 0x13, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, // ................
+ 0x80, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x55, // ...............U
+ 0xa0, 0x01, 0x00, 0xaa, 0xa0, 0x25, 0x00, 0x00, 0x02, 0x01, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, // .....%..........
+ 0x80, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x55, 0x90, 0x01, 0x00, 0x00, // ...........U....
+ 0xa0, 0x01, 0x00, 0x00, 0xa0, 0x13, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, // ................
+ 0x80, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x55, // ...............U
+ 0xa0, 0x01, 0x00, 0xaa, 0xa0, 0x25, 0x00, 0x00, 0x02, 0x02, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, // .....%..........
+ 0x80, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x05, 0x80, 0x01, 0x00, 0xc5, 0x80, 0x02, 0x00, 0x55, // ...............U
+ 0x81, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x80, 0x02, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, // ................
+ 0x02, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x00, 0xa0, 0x5f, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, // ........._......
+ 0x80, 0x00, 0x00, 0xe4, 0x80, 0x00, 0x08, 0xe4, 0xa0, 0x01, 0x00, 0x00, 0x02, 0x00, 0x08, 0x07, // ................
+ 0x80, 0x00, 0x00, 0xe4, 0x80, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0x55, // ...............U
+ 0xa0, 0x04, 0x00, 0x00, 0x04, 0x00, 0x08, 0x08, 0x80, 0x00, 0x00, 0x55, 0x80, 0x02, 0x00, 0x00, // ...........U....
+ 0xa0, 0x02, 0x00, 0x55, 0xa0, 0xff, 0xff, 0x00, 0x00, 0x00, // ...U......
};
static const uint8_t fs_imgui_latlong_dx11[617] =
{
diff --git a/3rdparty/bgfx/examples/common/imgui/fs_imgui_latlong.sc b/3rdparty/bgfx/examples/common/imgui/fs_imgui_latlong.sc
index a370f12f176..97fd66eeaf1 100644
--- a/3rdparty/bgfx/examples/common/imgui/fs_imgui_latlong.sc
+++ b/3rdparty/bgfx/examples/common/imgui/fs_imgui_latlong.sc
@@ -2,7 +2,7 @@ $input v_texcoord0
/*
* Copyright 2014-2015 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include <bgfx_shader.sh>
diff --git a/3rdparty/bgfx/examples/common/imgui/fs_imgui_texture.bin.h b/3rdparty/bgfx/examples/common/imgui/fs_imgui_texture.bin.h
index 5fc0768dd13..08d722db698 100644
--- a/3rdparty/bgfx/examples/common/imgui/fs_imgui_texture.bin.h
+++ b/3rdparty/bgfx/examples/common/imgui/fs_imgui_texture.bin.h
@@ -20,25 +20,25 @@ static const uint8_t fs_imgui_texture_glsl[290] =
0x72, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x7d, 0x0a, // r = tmpvar_1;.}.
0x0a, 0x00, // ..
};
-static const uint8_t fs_imgui_texture_dx9[262] =
+static const uint8_t fs_imgui_texture_dx9[258] =
{
0x46, 0x53, 0x48, 0x04, 0x01, 0x83, 0xf2, 0xe1, 0x01, 0x00, 0x0a, 0x73, 0x5f, 0x74, 0x65, 0x78, // FSH........s_tex
- 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x01, 0x00, 0x00, 0x01, 0x00, 0xe8, 0x00, 0x00, 0x03, 0xff, // Color0..........
- 0xff, 0xfe, 0xff, 0x23, 0x00, 0x43, 0x54, 0x41, 0x42, 0x1c, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, // ...#.CTAB....S..
+ 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x01, 0x00, 0x00, 0x01, 0x00, 0xe4, 0x00, 0x00, 0x03, 0xff, // Color0..........
+ 0xff, 0xfe, 0xff, 0x22, 0x00, 0x43, 0x54, 0x41, 0x42, 0x1c, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, // ...".CTAB....S..
0x00, 0x00, 0x03, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x91, 0x00, // ................
0x00, 0x4c, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, // .L...0..........
0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, // .<.......s_texCo
0x6c, 0x6f, 0x72, 0x00, 0xab, 0x04, 0x00, 0x0c, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, // lor.............
0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x73, 0x5f, 0x33, 0x5f, 0x30, 0x00, 0x4d, 0x69, 0x63, 0x72, // .....ps_3_0.Micr
0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, // osoft (R) HLSL S
- 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x31, // hader Compiler 1
- 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x30, 0x30, 0x31, 0x31, 0x2e, 0x31, 0x36, 0x33, 0x38, 0x34, 0x00, // 0.0.10011.16384.
- 0xab, 0x1f, 0x00, 0x00, 0x02, 0x0a, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, // ................
- 0x02, 0x05, 0x00, 0x00, 0x80, 0x01, 0x00, 0x03, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, // ................
- 0x90, 0x00, 0x08, 0x0f, 0xa0, 0x42, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0x80, 0x01, 0x00, 0xe4, // .....B..........
- 0x90, 0x00, 0x08, 0xe4, 0xa0, 0x05, 0x00, 0x00, 0x03, 0x00, 0x08, 0x08, 0x80, 0x00, 0x00, 0x00, // ................
- 0x80, 0x00, 0x00, 0xff, 0x90, 0x01, 0x00, 0x00, 0x02, 0x00, 0x08, 0x07, 0x80, 0x00, 0x00, 0xe4, // ................
- 0x90, 0xff, 0xff, 0x00, 0x00, 0x00, // ......
+ 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x39, // hader Compiler 9
+ 0x2e, 0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, 0x2e, 0x33, 0x31, 0x31, 0x31, 0x00, 0x1f, 0x00, 0x00, // .29.952.3111....
+ 0x02, 0x0a, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, // ................
+ 0x80, 0x01, 0x00, 0x03, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x90, 0x00, 0x08, 0x0f, // ................
+ 0xa0, 0x42, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0x80, 0x01, 0x00, 0xe4, 0x90, 0x00, 0x08, 0xe4, // .B..............
+ 0xa0, 0x05, 0x00, 0x00, 0x03, 0x00, 0x08, 0x08, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xff, // ................
+ 0x90, 0x01, 0x00, 0x00, 0x02, 0x00, 0x08, 0x07, 0x80, 0x00, 0x00, 0xe4, 0x90, 0xff, 0xff, 0x00, // ................
+ 0x00, 0x00, // ..
};
static const uint8_t fs_imgui_texture_dx11[421] =
{
diff --git a/3rdparty/bgfx/examples/common/imgui/fs_imgui_texture.sc b/3rdparty/bgfx/examples/common/imgui/fs_imgui_texture.sc
index f6b935b1305..8e12fe0c86a 100644
--- a/3rdparty/bgfx/examples/common/imgui/fs_imgui_texture.sc
+++ b/3rdparty/bgfx/examples/common/imgui/fs_imgui_texture.sc
@@ -1,8 +1,8 @@
$input v_texcoord0, v_color0
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include <bgfx_shader.sh>
diff --git a/3rdparty/bgfx/examples/common/imgui/fs_ocornut_imgui.bin.h b/3rdparty/bgfx/examples/common/imgui/fs_ocornut_imgui.bin.h
index bbfafdf88d5..ed79a9399c5 100644
--- a/3rdparty/bgfx/examples/common/imgui/fs_ocornut_imgui.bin.h
+++ b/3rdparty/bgfx/examples/common/imgui/fs_ocornut_imgui.bin.h
@@ -16,10 +16,10 @@ static const uint8_t fs_ocornut_imgui_glsl[238] =
0x20, 0x3d, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x20, 0x2a, 0x20, 0x76, // = (tmpvar_1 * v
0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // _color0);.}...
};
-static const uint8_t fs_ocornut_imgui_dx9[241] =
+static const uint8_t fs_ocornut_imgui_dx9[237] =
{
0x46, 0x53, 0x48, 0x04, 0x01, 0x83, 0xf2, 0xe1, 0x01, 0x00, 0x05, 0x73, 0x5f, 0x74, 0x65, 0x78, // FSH........s_tex
- 0x30, 0x01, 0x00, 0x00, 0x01, 0x00, 0xd8, 0x00, 0x00, 0x03, 0xff, 0xff, 0xfe, 0xff, 0x22, 0x00, // 0.............".
+ 0x30, 0x01, 0x00, 0x00, 0x01, 0x00, 0xd4, 0x00, 0x00, 0x03, 0xff, 0xff, 0xfe, 0xff, 0x21, 0x00, // 0.............!.
0x43, 0x54, 0x41, 0x42, 0x1c, 0x00, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, // CTAB....O.......
0x01, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x91, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, // ............H...
0x30, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x38, 0x00, 0x00, 0x00, // 0...........8...
@@ -27,13 +27,12 @@ static const uint8_t fs_ocornut_imgui_dx9[241] =
0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x73, 0x5f, 0x33, // ............ps_3
0x5f, 0x30, 0x00, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, // _0.Microsoft (R)
0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, // HLSL Shader Com
- 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x31, 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x30, 0x30, 0x31, 0x31, // piler 10.0.10011
- 0x2e, 0x31, 0x36, 0x33, 0x38, 0x34, 0x00, 0xab, 0x1f, 0x00, 0x00, 0x02, 0x0a, 0x00, 0x00, 0x80, // .16384..........
- 0x00, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x80, 0x01, 0x00, 0x03, 0x90, // ................
- 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x90, 0x00, 0x08, 0x0f, 0xa0, 0x42, 0x00, 0x00, 0x03, // ............B...
- 0x00, 0x00, 0x0f, 0x80, 0x01, 0x00, 0xe4, 0x90, 0x00, 0x08, 0xe4, 0xa0, 0x05, 0x00, 0x00, 0x03, // ................
- 0x00, 0x08, 0x0f, 0x80, 0x00, 0x00, 0xe4, 0x80, 0x00, 0x00, 0xe4, 0x90, 0xff, 0xff, 0x00, 0x00, // ................
- 0x00, // .
+ 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x39, 0x2e, 0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, 0x2e, 0x33, // piler 9.29.952.3
+ 0x31, 0x31, 0x31, 0x00, 0x1f, 0x00, 0x00, 0x02, 0x0a, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f, 0x90, // 111.............
+ 0x1f, 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x80, 0x01, 0x00, 0x03, 0x90, 0x1f, 0x00, 0x00, 0x02, // ................
+ 0x00, 0x00, 0x00, 0x90, 0x00, 0x08, 0x0f, 0xa0, 0x42, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0x80, // ........B.......
+ 0x01, 0x00, 0xe4, 0x90, 0x00, 0x08, 0xe4, 0xa0, 0x05, 0x00, 0x00, 0x03, 0x00, 0x08, 0x0f, 0x80, // ................
+ 0x00, 0x00, 0xe4, 0x80, 0x00, 0x00, 0xe4, 0x90, 0xff, 0xff, 0x00, 0x00, 0x00, // .............
};
static const uint8_t fs_ocornut_imgui_dx11[396] =
{
diff --git a/3rdparty/bgfx/examples/common/imgui/imgui.cpp b/3rdparty/bgfx/examples/common/imgui/imgui.cpp
index 073191fde57..3bc68d3d61d 100644
--- a/3rdparty/bgfx/examples/common/imgui/imgui.cpp
+++ b/3rdparty/bgfx/examples/common/imgui/imgui.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
// This code is based on:
@@ -532,7 +532,7 @@ struct Imgui
fs_imgui_image = bgfx::makeRef(fs_imgui_image_dx11, sizeof(fs_imgui_image_dx11) );
fs_imgui_image_swizz = bgfx::makeRef(fs_imgui_image_swizz_dx11, sizeof(fs_imgui_image_swizz_dx11) );
break;
-
+
case bgfx::RendererType::Metal:
vs_imgui_color = bgfx::makeRef(vs_imgui_color_mtl, sizeof(vs_imgui_color_mtl) );
fs_imgui_color = bgfx::makeRef(fs_imgui_color_mtl, sizeof(fs_imgui_color_mtl) );
@@ -838,7 +838,7 @@ struct Imgui
const int32_t my = int32_t(float(_my)*yscale);
IMGUI_beginFrame(mx, my, _button, _scroll, _width, _height, _inputChar, _view);
- nvgBeginFrameScaled(m_nvg, m_viewWidth, m_viewHeight, m_surfaceWidth, m_surfaceHeight, 1.0f);
+ nvgBeginFrame(m_nvg, m_viewWidth, m_viewHeight, 1.0f);
nvgViewId(m_nvg, _view);
bgfx::setViewName(_view, "IMGUI");
@@ -3415,12 +3415,14 @@ bool imguiCheck(const char* _text, bool _checked, bool _enabled)
return s_imgui.check(_text, _checked, _enabled);
}
-void imguiBool(const char* _text, bool& _flag, bool _enabled)
+bool imguiBool(const char* _text, bool& _flag, bool _enabled)
{
- if (imguiCheck(_text, _flag, _enabled) )
+ bool result = imguiCheck(_text, _flag, _enabled);
+ if (result)
{
_flag = !_flag;
}
+ return result;
}
bool imguiCollapse(const char* _text, const char* _subtext, bool _checked, bool _enabled)
diff --git a/3rdparty/bgfx/examples/common/imgui/imgui.h b/3rdparty/bgfx/examples/common/imgui/imgui.h
index e85b9d3a16a..75269500c85 100644
--- a/3rdparty/bgfx/examples/common/imgui/imgui.h
+++ b/3rdparty/bgfx/examples/common/imgui/imgui.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
// This code is based on:
@@ -173,7 +173,7 @@ void imguiSetCurrentScissor(); // Call before drawing custom widgets over imgui
bool imguiButton(const char* _text, bool _enabled = true, ImguiAlign::Enum _align = ImguiAlign::LeftIndented, uint32_t _rgb0 = IMGUI_BUTTON_RGB0, int32_t _r = IMGUI_BUTTON_R);
bool imguiItem(const char* _text, bool _enabled = true);
bool imguiCheck(const char* _text, bool _checked, bool _enabled = true);
-void imguiBool(const char* _text, bool& _flag, bool _enabled = true);
+bool imguiBool(const char* _text, bool& _flag, bool _enabled = true);
bool imguiCollapse(const char* _text, const char* _subtext, bool _checked, bool _enabled = true);
void imguiLabel(const char* _format, ...);
void imguiLabel(uint32_t _rgba, const char* _format, ...);
diff --git a/3rdparty/bgfx/examples/common/imgui/ocornut_imgui.cpp b/3rdparty/bgfx/examples/common/imgui/ocornut_imgui.cpp
index 7c49ec06ea2..4545bb998a0 100644
--- a/3rdparty/bgfx/examples/common/imgui/ocornut_imgui.cpp
+++ b/3rdparty/bgfx/examples/common/imgui/ocornut_imgui.cpp
@@ -1,6 +1,6 @@
/*
* Copyright 2014-2015 Daniel Collin. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include <bgfx/bgfx.h>
@@ -14,7 +14,11 @@
#include <stb/stb_image.c>
#ifndef USE_ENTRY
-# define USE_ENTRY defined(SCI_NAMESPACE)
+# if defined(SCI_NAMESPACE)
+# define USE_ENTRY 1
+# else
+# define USE_ENTRY 0
+# endif // defined(SCI_NAMESPACE)
#endif // USE_ENTRY
#if USE_ENTRY
@@ -29,8 +33,6 @@
#include "vs_ocornut_imgui.bin.h"
#include "fs_ocornut_imgui.bin.h"
-void viewCallback(const ImDrawList* _parentList, const ImDrawCmd* _cmd);
-
class PlatformWindow : public ImGuiWM::PlatformWindow
{
typedef ImGuiWM::PlatformWindow Super;
@@ -47,7 +49,7 @@ public:
&& !_isDragWindow)
{
m_window = entry::createWindow(0, 0, 640, 380);
- extern void pwToWindow(entry::WindowHandle _handle, PlatformWindow* _pw);
+ extern void pwToWindow(entry::WindowHandle _handle, class PlatformWindow* _pw);
pwToWindow(m_window, this);
}
else
@@ -59,6 +61,12 @@ public:
virtual ~PlatformWindow()
{
+#if USE_ENTRY
+ if (0 != m_window.idx)
+ {
+ entry::destroyWindow(m_window);
+ }
+#endif // USE_ENTRY
}
virtual bool Init(ImGuiWM::PlatformWindow* /*_parent*/) BX_OVERRIDE
@@ -100,7 +108,6 @@ public:
virtual void SetPosition(const ImVec2& _pos) BX_OVERRIDE
{
-
#if USE_ENTRY
if (0 != m_window.idx
&& m_pos.x != _pos.x
@@ -126,38 +133,9 @@ public:
{
}
- virtual void PaintBegin()
- {
-#if USE_ENTRY
- if (!m_bIsDragWindow)
- {
- ImDrawList* drawList = ImGui::GetWindowDrawList();
- union { entry::WindowHandle handle; void* ptr; } cast = { m_window };
- drawList->AddCallback(viewCallback, cast.ptr);
- drawList->PushClipRect(ImVec4(0.0f, 0.0f, m_size.x, m_size.y) );
- }
-#endif // USE_ENTRY
- }
-
- virtual void Paint() BX_OVERRIDE
- {
- if (!m_bIsDragWindow)
- {
- Super::Paint();
- }
- }
-
- virtual void PaintEnd()
- {
-#if USE_ENTRY
- if (!m_bIsDragWindow)
- {
- ImDrawList* drawList = ImGui::GetWindowDrawList();
- drawList->PopClipRect();
- drawList->AddCallback(viewCallback, NULL);
- }
-#endif // USE_ENTRY
- }
+ virtual void PaintBegin() BX_OVERRIDE;
+ virtual void Paint() BX_OVERRIDE;
+ virtual void PaintEnd() BX_OVERRIDE;
virtual void Destroy() BX_OVERRIDE
{
@@ -257,7 +235,7 @@ struct OcornutImguiContext
const uint8_t viewId = window.m_viewId;
bgfx::setViewClear(viewId
, BGFX_CLEAR_COLOR|BGFX_CLEAR_DEPTH
- , 0x303030ff + rand()
+ , 0x303030ff
, 1.0f
, 0
);
@@ -353,7 +331,7 @@ struct OcornutImguiContext
bgfx::setTexture(0, s_tex, th);
bgfx::setVertexBuffer(&tvb, 0, numVertices);
bgfx::setIndexBuffer(&tib, offset, cmd->ElemCount);
- bgfx::submit(m_viewId, m_program);
+ bgfx::submit(cmd->ViewId, m_program);
}
offset += cmd->ElemCount;
@@ -443,9 +421,11 @@ struct OcornutImguiContext
uint8_t* data;
int32_t width;
int32_t height;
- void* font = ImGui::MemAlloc(_size);
- memcpy(font, _data, _size);
- io.Fonts->AddFontFromMemoryTTF(font, _size, _fontSize);
+ {
+ void* font = ImGui::MemAlloc(_size);
+ memcpy(font, _data, _size);
+ io.Fonts->AddFontFromMemoryTTF(font, _size, _fontSize);
+ }
io.Fonts->GetTexDataAsRGBA32(&data, &width, &height);
@@ -498,14 +478,14 @@ struct OcornutImguiContext
};
Window* w0 = new Window("test");
- WindowX* w1 = new WindowX("abcd");
+ WindowX* w1 = new WindowX("Scintilla");
Window* w2 = new Window("xyzw");
Window* w3 = new Window("0123");
- m_wm->Dock(w0);
- m_wm->DockWith(w1, w0, ImGuiWM::E_DOCK_ORIENTATION_RIGHT);
- m_wm->DockWith(w2, w1, ImGuiWM::E_DOCK_ORIENTATION_BOTTOM);
- m_wm->DockWith(w3, w0, ImGuiWM::E_DOCK_ORIENTATION_BOTTOM);
+ m_wm->Dock(w0);
+ m_wm->DockWith(w1, w0, ImGuiWM::E_DOCK_ORIENTATION_RIGHT);
+ m_wm->DockWith(w2, w1, ImGuiWM::E_DOCK_ORIENTATION_BOTTOM);
+ m_wm->DockWith(w3, w0, ImGuiWM::E_DOCK_ORIENTATION_BOTTOM);
}
#endif // 0
}
@@ -525,8 +505,7 @@ struct OcornutImguiContext
void beginFrame(int32_t _mx, int32_t _my, uint8_t _button, int32_t _scroll, int _width, int _height, char _inputChar, uint8_t _viewId)
{
- m_viewId = _viewId;
- m_defaultViewId = _viewId;
+ m_viewId = _viewId;
ImGuiIO& io = ImGui::GetIO();
if (_inputChar < 0x7f)
@@ -561,6 +540,7 @@ struct OcornutImguiContext
#endif // defined(SCI_NAMESPACE)
ImGui::NewFrame();
+ ImGui::PushStyleVar(ImGuiStyleVar_ViewId, (float)_viewId);
#if 0
ImGui::ShowTestWindow(); //Debug only.
@@ -576,6 +556,7 @@ struct OcornutImguiContext
void endFrame()
{
m_wm->Run();
+ ImGui::PopStyleVar(1);
ImGui::Render();
}
@@ -588,7 +569,6 @@ struct OcornutImguiContext
int64_t m_last;
int32_t m_lastScroll;
uint8_t m_viewId;
- uint8_t m_defaultViewId;
#if USE_ENTRY
struct Window
@@ -610,22 +590,53 @@ struct OcornutImguiContext
static OcornutImguiContext s_ctx;
+void PlatformWindow::PaintBegin()
+{
#if USE_ENTRY
+ if (!m_bIsDragWindow)
+ {
+ OcornutImguiContext::Window& win = s_ctx.m_window[m_window.idx];
+ entry::WindowState& state = win.m_state;
+ ImGuiIO& io = ImGui::GetIO();
+ io.MousePos = ImVec2((float)state.m_mouse.m_mx, (float)state.m_mouse.m_my);
+ io.MouseDown[0] = !!state.m_mouse.m_buttons[entry::MouseButton::Left];
+ io.MouseDown[1] = !!state.m_mouse.m_buttons[entry::MouseButton::Right];
+ io.MouseDown[2] = !!state.m_mouse.m_buttons[entry::MouseButton::Middle];
+ io.MouseWheel = float(state.m_mouse.m_mz);
-void viewCallback(const ImDrawList* /*_parentList*/, const ImDrawCmd* _cmd)
-{
- union { void* ptr; entry::WindowHandle handle; } cast = { _cmd->UserCallbackData };
+ ImGui::PushStyleVar(ImGuiStyleVar_ViewId, (float)win.m_viewId);
+ }
+#endif // USE_ENTRY
+}
- if (0 != cast.handle.idx)
+void PlatformWindow::Paint()
+{
+ if (!m_bIsDragWindow)
{
- s_ctx.m_viewId = s_ctx.m_window[cast.handle.idx].m_viewId;
+ Super::Paint();
}
- else
+}
+
+void PlatformWindow::PaintEnd()
+{
+#if USE_ENTRY
+ if (!m_bIsDragWindow)
{
- s_ctx.m_viewId = s_ctx.m_defaultViewId;
+ ImGui::PopStyleVar(1);
+
+ entry::WindowState& state = s_ctx.m_window[0].m_state;
+ ImGuiIO& io = ImGui::GetIO();
+ io.MousePos = ImVec2((float)state.m_mouse.m_mx, (float)state.m_mouse.m_my);
+ io.MouseDown[0] = !!state.m_mouse.m_buttons[entry::MouseButton::Left];
+ io.MouseDown[1] = !!state.m_mouse.m_buttons[entry::MouseButton::Right];
+ io.MouseDown[2] = !!state.m_mouse.m_buttons[entry::MouseButton::Middle];
+ io.MouseWheel = float(state.m_mouse.m_mz);
}
+#endif // USE_ENTRY
}
+#if USE_ENTRY
+
void pwToWindow(entry::WindowHandle _handle, PlatformWindow* _pw)
{
s_ctx.m_window[_handle.idx].m_pw = _pw;
@@ -654,7 +665,7 @@ void imguiUpdateWindow(const entry::WindowState& _state)
}
else
{
- window.m_viewId = s_ctx.m_defaultViewId;
+ window.m_viewId = s_ctx.m_viewId;
}
}
@@ -672,9 +683,9 @@ void OcornutImguiContext::memFree(void* _ptr)
BX_FREE(s_ctx.m_allocator, _ptr);
}
-void OcornutImguiContext::renderDrawLists(ImDrawData* draw_data)
+void OcornutImguiContext::renderDrawLists(ImDrawData* _drawData)
{
- s_ctx.render(draw_data);
+ s_ctx.render(_drawData);
}
void IMGUI_create(const void* _data, uint32_t _size, float _fontSize, bx::AllocatorI* _allocator)
diff --git a/3rdparty/bgfx/examples/common/imgui/ocornut_imgui.h b/3rdparty/bgfx/examples/common/imgui/ocornut_imgui.h
index 450b281767f..5cad5c22879 100644
--- a/3rdparty/bgfx/examples/common/imgui/ocornut_imgui.h
+++ b/3rdparty/bgfx/examples/common/imgui/ocornut_imgui.h
@@ -1,6 +1,6 @@
/*
* Copyright 2014-2015 Daniel Collin. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#ifndef OCORNUT_IMGUI_H_HEADER_GUARD
diff --git a/3rdparty/bgfx/examples/common/imgui/scintilla.cpp b/3rdparty/bgfx/examples/common/imgui/scintilla.cpp
index f9f0d06ea22..7c8e4cd157a 100644
--- a/3rdparty/bgfx/examples/common/imgui/scintilla.cpp
+++ b/3rdparty/bgfx/examples/common/imgui/scintilla.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
* License: https://github.com/bkaradzic/bgfx/blob/master/LICENSE
*/
@@ -1101,7 +1101,7 @@ namespace Scintilla
} // namespace Scintilla
-ScintillaEditor* ImGuiScintilla(const char* _name, bool* _opened, const ImVec2& _size)
+ScintillaEditor* ImGuiScintilla(const char* _name, bool* /*_opened*/, const ImVec2& /*_size*/)
{
ScintillaEditor* sci = NULL;
diff --git a/3rdparty/bgfx/examples/common/imgui/scintilla.h b/3rdparty/bgfx/examples/common/imgui/scintilla.h
index d57362e941f..2bc546fd29a 100644
--- a/3rdparty/bgfx/examples/common/imgui/scintilla.h
+++ b/3rdparty/bgfx/examples/common/imgui/scintilla.h
@@ -1,5 +1,5 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
* License: https://github.com/bkaradzic/bgfx/blob/master/LICENSE
*/
diff --git a/3rdparty/bgfx/examples/common/imgui/vs_imgui_color.bin.h b/3rdparty/bgfx/examples/common/imgui/vs_imgui_color.bin.h
index 1b8aa95fb28..4867ea1a86c 100644
--- a/3rdparty/bgfx/examples/common/imgui/vs_imgui_color.bin.h
+++ b/3rdparty/bgfx/examples/common/imgui/vs_imgui_color.bin.h
@@ -22,27 +22,27 @@ static const uint8_t vs_imgui_color_glsl[324] =
0x6f, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, // or0 = a_color0;.
0x7d, 0x0a, 0x0a, 0x00, // }...
};
-static const uint8_t vs_imgui_color_dx9[294] =
+static const uint8_t vs_imgui_color_dx9[290] =
{
0x56, 0x53, 0x48, 0x04, 0xa4, 0x8b, 0xef, 0x49, 0x01, 0x00, 0x0a, 0x75, 0x5f, 0x76, 0x69, 0x65, // VSH....I...u_vie
- 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, 0x00, 0x00, 0x04, 0x00, 0x08, 0x01, 0x00, 0x03, 0xfe, // wProj...........
- 0xff, 0xfe, 0xff, 0x23, 0x00, 0x43, 0x54, 0x41, 0x42, 0x1c, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, // ...#.CTAB....S..
+ 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, 0x00, 0x00, 0x04, 0x00, 0x04, 0x01, 0x00, 0x03, 0xfe, // wProj...........
+ 0xff, 0xfe, 0xff, 0x22, 0x00, 0x43, 0x54, 0x41, 0x42, 0x1c, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, // ...".CTAB....S..
0x00, 0x00, 0x03, 0xfe, 0xff, 0x01, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x91, 0x00, // ................
0x00, 0x4c, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, // .L...0..........
0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, // .<.......u_viewP
0x72, 0x6f, 0x6a, 0x00, 0xab, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, // roj.............
0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x73, 0x5f, 0x33, 0x5f, 0x30, 0x00, 0x4d, 0x69, 0x63, 0x72, // .....vs_3_0.Micr
0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, // osoft (R) HLSL S
- 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x31, // hader Compiler 1
- 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x30, 0x30, 0x31, 0x31, 0x2e, 0x31, 0x36, 0x33, 0x38, 0x34, 0x00, // 0.0.10011.16384.
- 0xab, 0x1f, 0x00, 0x00, 0x02, 0x0a, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, // ................
- 0x02, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, // ................
- 0x80, 0x00, 0x00, 0x0f, 0xe0, 0x1f, 0x00, 0x00, 0x02, 0x0a, 0x00, 0x00, 0x80, 0x01, 0x00, 0x0f, // ................
- 0xe0, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0x80, 0x01, 0x00, 0xe4, 0xa0, 0x01, 0x00, 0x55, // ...............U
- 0x90, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0xe4, 0xa0, 0x01, 0x00, 0x00, // ................
- 0x90, 0x00, 0x00, 0xe4, 0x80, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, 0xe4, // ................
- 0x80, 0x03, 0x00, 0xe4, 0xa0, 0x01, 0x00, 0x00, 0x02, 0x01, 0x00, 0x0f, 0xe0, 0x00, 0x00, 0xe4, // ................
- 0x90, 0xff, 0xff, 0x00, 0x00, 0x00, // ......
+ 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x39, // hader Compiler 9
+ 0x2e, 0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, 0x2e, 0x33, 0x31, 0x31, 0x31, 0x00, 0x1f, 0x00, 0x00, // .29.952.3111....
+ 0x02, 0x0a, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, // ................
+ 0x80, 0x01, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f, // ................
+ 0xe0, 0x1f, 0x00, 0x00, 0x02, 0x0a, 0x00, 0x00, 0x80, 0x01, 0x00, 0x0f, 0xe0, 0x05, 0x00, 0x00, // ................
+ 0x03, 0x00, 0x00, 0x0f, 0x80, 0x01, 0x00, 0xe4, 0xa0, 0x01, 0x00, 0x55, 0x90, 0x04, 0x00, 0x00, // ...........U....
+ 0x04, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0xe4, 0xa0, 0x01, 0x00, 0x00, 0x90, 0x00, 0x00, 0xe4, // ................
+ 0x80, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, 0xe4, 0x80, 0x03, 0x00, 0xe4, // ................
+ 0xa0, 0x01, 0x00, 0x00, 0x02, 0x01, 0x00, 0x0f, 0xe0, 0x00, 0x00, 0xe4, 0x90, 0xff, 0xff, 0x00, // ................
+ 0x00, 0x00, // ..
};
static const uint8_t vs_imgui_color_dx11[465] =
{
diff --git a/3rdparty/bgfx/examples/common/imgui/vs_imgui_color.sc b/3rdparty/bgfx/examples/common/imgui/vs_imgui_color.sc
index 37ba6546ed9..f0886f64f4f 100644
--- a/3rdparty/bgfx/examples/common/imgui/vs_imgui_color.sc
+++ b/3rdparty/bgfx/examples/common/imgui/vs_imgui_color.sc
@@ -2,8 +2,8 @@ $input a_position, a_color0
$output v_color0
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include <bgfx_shader.sh>
diff --git a/3rdparty/bgfx/examples/common/imgui/vs_imgui_cubemap.bin.h b/3rdparty/bgfx/examples/common/imgui/vs_imgui_cubemap.bin.h
index 154c4e416e3..6467376b5a7 100644
--- a/3rdparty/bgfx/examples/common/imgui/vs_imgui_cubemap.bin.h
+++ b/3rdparty/bgfx/examples/common/imgui/vs_imgui_cubemap.bin.h
@@ -22,11 +22,11 @@ static const uint8_t vs_imgui_cubemap_glsl[329] =
0x72, 0x6d, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x2e, // rmal = a_normal.
0x78, 0x79, 0x7a, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // xyz;.}...
};
-static const uint8_t vs_imgui_cubemap_dx9[323] =
+static const uint8_t vs_imgui_cubemap_dx9[319] =
{
0x56, 0x53, 0x48, 0x04, 0xe3, 0xc2, 0x5c, 0x65, 0x01, 0x00, 0x0f, 0x75, 0x5f, 0x6d, 0x6f, 0x64, // VSH....e...u_mod
0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, 0x00, 0x00, 0x04, 0x00, // elViewProj......
- 0x20, 0x01, 0x00, 0x03, 0xfe, 0xff, 0xfe, 0xff, 0x24, 0x00, 0x43, 0x54, 0x41, 0x42, 0x1c, 0x00, // .......$.CTAB..
+ 0x1c, 0x01, 0x00, 0x03, 0xfe, 0xff, 0xfe, 0xff, 0x23, 0x00, 0x43, 0x54, 0x41, 0x42, 0x1c, 0x00, // ........#.CTAB..
0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x00, 0x03, 0xfe, 0xff, 0x01, 0x00, 0x00, 0x00, 0x1c, 0x00, // ..W.............
0x00, 0x00, 0x00, 0x91, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x02, 0x00, // ......P...0.....
0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x5f, // ......@.......u_
@@ -34,17 +34,16 @@ static const uint8_t vs_imgui_cubemap_dx9[323] =
0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x73, // ..............vs
0x5f, 0x33, 0x5f, 0x30, 0x00, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, // _3_0.Microsoft (
0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, // R) HLSL Shader C
- 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x31, 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x30, 0x30, // ompiler 10.0.100
- 0x31, 0x31, 0x2e, 0x31, 0x36, 0x33, 0x38, 0x34, 0x00, 0xab, 0x1f, 0x00, 0x00, 0x02, 0x03, 0x00, // 11.16384........
- 0x00, 0x80, 0x00, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, // ................
- 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f, 0xe0, 0x1f, 0x00, // ................
- 0x00, 0x02, 0x03, 0x00, 0x00, 0x80, 0x01, 0x00, 0x07, 0xe0, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, // ................
- 0x0f, 0x80, 0x01, 0x00, 0xe4, 0xa0, 0x01, 0x00, 0x55, 0x90, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, // ........U.......
- 0x0f, 0x80, 0x00, 0x00, 0xe4, 0xa0, 0x01, 0x00, 0x00, 0x90, 0x00, 0x00, 0xe4, 0x80, 0x04, 0x00, // ................
- 0x00, 0x04, 0x00, 0x00, 0x0f, 0x80, 0x02, 0x00, 0xe4, 0xa0, 0x01, 0x00, 0xaa, 0x90, 0x00, 0x00, // ................
- 0xe4, 0x80, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, 0xe4, 0x80, 0x03, 0x00, // ................
- 0xe4, 0xa0, 0x01, 0x00, 0x00, 0x02, 0x01, 0x00, 0x07, 0xe0, 0x00, 0x00, 0xe4, 0x90, 0xff, 0xff, // ................
- 0x00, 0x00, 0x00, // ...
+ 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x39, 0x2e, 0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, // ompiler 9.29.952
+ 0x2e, 0x33, 0x31, 0x31, 0x31, 0x00, 0x1f, 0x00, 0x00, 0x02, 0x03, 0x00, 0x00, 0x80, 0x00, 0x00, // .3111...........
+ 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x0f, 0x90, 0x1f, 0x00, // ................
+ 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f, 0xe0, 0x1f, 0x00, 0x00, 0x02, 0x03, 0x00, // ................
+ 0x00, 0x80, 0x01, 0x00, 0x07, 0xe0, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0x80, 0x01, 0x00, // ................
+ 0xe4, 0xa0, 0x01, 0x00, 0x55, 0x90, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, // ....U...........
+ 0xe4, 0xa0, 0x01, 0x00, 0x00, 0x90, 0x00, 0x00, 0xe4, 0x80, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, // ................
+ 0x0f, 0x80, 0x02, 0x00, 0xe4, 0xa0, 0x01, 0x00, 0xaa, 0x90, 0x00, 0x00, 0xe4, 0x80, 0x02, 0x00, // ................
+ 0x00, 0x03, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, 0xe4, 0x80, 0x03, 0x00, 0xe4, 0xa0, 0x01, 0x00, // ................
+ 0x00, 0x02, 0x01, 0x00, 0x07, 0xe0, 0x00, 0x00, 0xe4, 0x90, 0xff, 0xff, 0x00, 0x00, 0x00, // ...............
};
static const uint8_t vs_imgui_cubemap_dx11[510] =
{
diff --git a/3rdparty/bgfx/examples/common/imgui/vs_imgui_cubemap.sc b/3rdparty/bgfx/examples/common/imgui/vs_imgui_cubemap.sc
index 80adffca0f7..d270071ac64 100644
--- a/3rdparty/bgfx/examples/common/imgui/vs_imgui_cubemap.sc
+++ b/3rdparty/bgfx/examples/common/imgui/vs_imgui_cubemap.sc
@@ -2,8 +2,8 @@ $input a_position, a_normal
$output v_normal
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include <bgfx_shader.sh>
diff --git a/3rdparty/bgfx/examples/common/imgui/vs_imgui_image.bin.h b/3rdparty/bgfx/examples/common/imgui/vs_imgui_image.bin.h
index f3711052b08..b34b38c4122 100644
--- a/3rdparty/bgfx/examples/common/imgui/vs_imgui_image.bin.h
+++ b/3rdparty/bgfx/examples/common/imgui/vs_imgui_image.bin.h
@@ -22,27 +22,27 @@ static const uint8_t vs_imgui_image_glsl[336] =
0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, 0x3d, 0x20, 0x61, // v_texcoord0 = a
0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // _texcoord0;.}...
};
-static const uint8_t vs_imgui_image_dx9[294] =
+static const uint8_t vs_imgui_image_dx9[290] =
{
0x56, 0x53, 0x48, 0x04, 0x6f, 0x1e, 0x3e, 0x3c, 0x01, 0x00, 0x0a, 0x75, 0x5f, 0x76, 0x69, 0x65, // VSH.o.><...u_vie
- 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, 0x00, 0x00, 0x04, 0x00, 0x08, 0x01, 0x00, 0x03, 0xfe, // wProj...........
- 0xff, 0xfe, 0xff, 0x23, 0x00, 0x43, 0x54, 0x41, 0x42, 0x1c, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, // ...#.CTAB....S..
+ 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, 0x00, 0x00, 0x04, 0x00, 0x04, 0x01, 0x00, 0x03, 0xfe, // wProj...........
+ 0xff, 0xfe, 0xff, 0x22, 0x00, 0x43, 0x54, 0x41, 0x42, 0x1c, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, // ...".CTAB....S..
0x00, 0x00, 0x03, 0xfe, 0xff, 0x01, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x91, 0x00, // ................
0x00, 0x4c, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, // .L...0..........
0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, // .<.......u_viewP
0x72, 0x6f, 0x6a, 0x00, 0xab, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, // roj.............
0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x73, 0x5f, 0x33, 0x5f, 0x30, 0x00, 0x4d, 0x69, 0x63, 0x72, // .....vs_3_0.Micr
0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, // osoft (R) HLSL S
- 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x31, // hader Compiler 1
- 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x30, 0x30, 0x31, 0x31, 0x2e, 0x31, 0x36, 0x33, 0x38, 0x34, 0x00, // 0.0.10011.16384.
- 0xab, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, // ................
- 0x02, 0x05, 0x00, 0x00, 0x80, 0x01, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, // ................
- 0x80, 0x00, 0x00, 0x0f, 0xe0, 0x1f, 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x80, 0x01, 0x00, 0x03, // ................
- 0xe0, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0x80, 0x01, 0x00, 0xe4, 0xa0, 0x00, 0x00, 0x55, // ...............U
- 0x90, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0xe4, 0xa0, 0x00, 0x00, 0x00, // ................
- 0x90, 0x00, 0x00, 0xe4, 0x80, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, 0xe4, // ................
- 0x80, 0x03, 0x00, 0xe4, 0xa0, 0x01, 0x00, 0x00, 0x02, 0x01, 0x00, 0x03, 0xe0, 0x01, 0x00, 0xe4, // ................
- 0x90, 0xff, 0xff, 0x00, 0x00, 0x00, // ......
+ 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x39, // hader Compiler 9
+ 0x2e, 0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, 0x2e, 0x33, 0x31, 0x31, 0x31, 0x00, 0x1f, 0x00, 0x00, // .29.952.3111....
+ 0x02, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, // ................
+ 0x80, 0x01, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f, // ................
+ 0xe0, 0x1f, 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x80, 0x01, 0x00, 0x03, 0xe0, 0x05, 0x00, 0x00, // ................
+ 0x03, 0x00, 0x00, 0x0f, 0x80, 0x01, 0x00, 0xe4, 0xa0, 0x00, 0x00, 0x55, 0x90, 0x04, 0x00, 0x00, // ...........U....
+ 0x04, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0xe4, 0xa0, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0xe4, // ................
+ 0x80, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, 0xe4, 0x80, 0x03, 0x00, 0xe4, // ................
+ 0xa0, 0x01, 0x00, 0x00, 0x02, 0x01, 0x00, 0x03, 0xe0, 0x01, 0x00, 0xe4, 0x90, 0xff, 0xff, 0x00, // ................
+ 0x00, 0x00, // ..
};
static const uint8_t vs_imgui_image_dx11[473] =
{
diff --git a/3rdparty/bgfx/examples/common/imgui/vs_imgui_image.sc b/3rdparty/bgfx/examples/common/imgui/vs_imgui_image.sc
index 1bc92a440c0..f1ae37c107d 100644
--- a/3rdparty/bgfx/examples/common/imgui/vs_imgui_image.sc
+++ b/3rdparty/bgfx/examples/common/imgui/vs_imgui_image.sc
@@ -3,7 +3,7 @@ $output v_texcoord0
/*
* Copyright 2014 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include <bgfx_shader.sh>
diff --git a/3rdparty/bgfx/examples/common/imgui/vs_imgui_latlong.bin.h b/3rdparty/bgfx/examples/common/imgui/vs_imgui_latlong.bin.h
index 4cf8bb28af7..8b84198ba33 100644
--- a/3rdparty/bgfx/examples/common/imgui/vs_imgui_latlong.bin.h
+++ b/3rdparty/bgfx/examples/common/imgui/vs_imgui_latlong.bin.h
@@ -23,11 +23,11 @@ static const uint8_t vs_imgui_latlong_glsl[337] =
0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, // a_texcoord0;.}..
0x00, // .
};
-static const uint8_t vs_imgui_latlong_dx9[323] =
+static const uint8_t vs_imgui_latlong_dx9[319] =
{
0x56, 0x53, 0x48, 0x04, 0x6f, 0x1e, 0x3e, 0x3c, 0x01, 0x00, 0x0f, 0x75, 0x5f, 0x6d, 0x6f, 0x64, // VSH.o.><...u_mod
0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, 0x00, 0x00, 0x04, 0x00, // elViewProj......
- 0x20, 0x01, 0x00, 0x03, 0xfe, 0xff, 0xfe, 0xff, 0x24, 0x00, 0x43, 0x54, 0x41, 0x42, 0x1c, 0x00, // .......$.CTAB..
+ 0x1c, 0x01, 0x00, 0x03, 0xfe, 0xff, 0xfe, 0xff, 0x23, 0x00, 0x43, 0x54, 0x41, 0x42, 0x1c, 0x00, // ........#.CTAB..
0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x00, 0x03, 0xfe, 0xff, 0x01, 0x00, 0x00, 0x00, 0x1c, 0x00, // ..W.............
0x00, 0x00, 0x00, 0x91, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x02, 0x00, // ......P...0.....
0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x5f, // ......@.......u_
@@ -35,17 +35,16 @@ static const uint8_t vs_imgui_latlong_dx9[323] =
0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x73, // ..............vs
0x5f, 0x33, 0x5f, 0x30, 0x00, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, // _3_0.Microsoft (
0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, // R) HLSL Shader C
- 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x31, 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x30, 0x30, // ompiler 10.0.100
- 0x31, 0x31, 0x2e, 0x31, 0x36, 0x33, 0x38, 0x34, 0x00, 0xab, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, // 11.16384........
- 0x00, 0x80, 0x00, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x80, 0x01, 0x00, // ................
- 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f, 0xe0, 0x1f, 0x00, // ................
- 0x00, 0x02, 0x05, 0x00, 0x00, 0x80, 0x01, 0x00, 0x03, 0xe0, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, // ................
- 0x0f, 0x80, 0x01, 0x00, 0xe4, 0xa0, 0x00, 0x00, 0x55, 0x90, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, // ........U.......
- 0x0f, 0x80, 0x00, 0x00, 0xe4, 0xa0, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0xe4, 0x80, 0x04, 0x00, // ................
- 0x00, 0x04, 0x00, 0x00, 0x0f, 0x80, 0x02, 0x00, 0xe4, 0xa0, 0x00, 0x00, 0xaa, 0x90, 0x00, 0x00, // ................
- 0xe4, 0x80, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, 0xe4, 0x80, 0x03, 0x00, // ................
- 0xe4, 0xa0, 0x01, 0x00, 0x00, 0x02, 0x01, 0x00, 0x03, 0xe0, 0x01, 0x00, 0xe4, 0x90, 0xff, 0xff, // ................
- 0x00, 0x00, 0x00, // ...
+ 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x39, 0x2e, 0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, // ompiler 9.29.952
+ 0x2e, 0x33, 0x31, 0x31, 0x31, 0x00, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, // .3111...........
+ 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x80, 0x01, 0x00, 0x0f, 0x90, 0x1f, 0x00, // ................
+ 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f, 0xe0, 0x1f, 0x00, 0x00, 0x02, 0x05, 0x00, // ................
+ 0x00, 0x80, 0x01, 0x00, 0x03, 0xe0, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0x80, 0x01, 0x00, // ................
+ 0xe4, 0xa0, 0x00, 0x00, 0x55, 0x90, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, // ....U...........
+ 0xe4, 0xa0, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0xe4, 0x80, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, // ................
+ 0x0f, 0x80, 0x02, 0x00, 0xe4, 0xa0, 0x00, 0x00, 0xaa, 0x90, 0x00, 0x00, 0xe4, 0x80, 0x02, 0x00, // ................
+ 0x00, 0x03, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, 0xe4, 0x80, 0x03, 0x00, 0xe4, 0xa0, 0x01, 0x00, // ................
+ 0x00, 0x02, 0x01, 0x00, 0x03, 0xe0, 0x01, 0x00, 0xe4, 0x90, 0xff, 0xff, 0x00, 0x00, 0x00, // ...............
};
static const uint8_t vs_imgui_latlong_dx11[518] =
{
diff --git a/3rdparty/bgfx/examples/common/imgui/vs_imgui_latlong.sc b/3rdparty/bgfx/examples/common/imgui/vs_imgui_latlong.sc
index 667fc3dc97a..098bdeb24ee 100644
--- a/3rdparty/bgfx/examples/common/imgui/vs_imgui_latlong.sc
+++ b/3rdparty/bgfx/examples/common/imgui/vs_imgui_latlong.sc
@@ -3,7 +3,7 @@ $output v_texcoord0
/*
* Copyright 2015 Dario Manesku. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include <bgfx_shader.sh>
diff --git a/3rdparty/bgfx/examples/common/imgui/vs_imgui_texture.bin.h b/3rdparty/bgfx/examples/common/imgui/vs_imgui_texture.bin.h
index 34ab3e2da96..a5c839c5c08 100644
--- a/3rdparty/bgfx/examples/common/imgui/vs_imgui_texture.bin.h
+++ b/3rdparty/bgfx/examples/common/imgui/vs_imgui_texture.bin.h
@@ -28,29 +28,29 @@ static const uint8_t vs_imgui_texture_glsl[419] =
0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x7d, // r0 = a_color0;.}
0x0a, 0x0a, 0x00, // ...
};
-static const uint8_t vs_imgui_texture_dx9[330] =
+static const uint8_t vs_imgui_texture_dx9[326] =
{
0x56, 0x53, 0x48, 0x04, 0x01, 0x83, 0xf2, 0xe1, 0x01, 0x00, 0x0a, 0x75, 0x5f, 0x76, 0x69, 0x65, // VSH........u_vie
- 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, 0x00, 0x00, 0x04, 0x00, 0x2c, 0x01, 0x00, 0x03, 0xfe, // wProj......,....
- 0xff, 0xfe, 0xff, 0x23, 0x00, 0x43, 0x54, 0x41, 0x42, 0x1c, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, // ...#.CTAB....S..
+ 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, 0x00, 0x00, 0x04, 0x00, 0x28, 0x01, 0x00, 0x03, 0xfe, // wProj......(....
+ 0xff, 0xfe, 0xff, 0x22, 0x00, 0x43, 0x54, 0x41, 0x42, 0x1c, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, // ...".CTAB....S..
0x00, 0x00, 0x03, 0xfe, 0xff, 0x01, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x91, 0x00, // ................
0x00, 0x4c, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, // .L...0..........
0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, // .<.......u_viewP
0x72, 0x6f, 0x6a, 0x00, 0xab, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, // roj.............
0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x73, 0x5f, 0x33, 0x5f, 0x30, 0x00, 0x4d, 0x69, 0x63, 0x72, // .....vs_3_0.Micr
0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, // osoft (R) HLSL S
- 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x31, // hader Compiler 1
- 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x30, 0x30, 0x31, 0x31, 0x2e, 0x31, 0x36, 0x33, 0x38, 0x34, 0x00, // 0.0.10011.16384.
- 0xab, 0x1f, 0x00, 0x00, 0x02, 0x0a, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, // ................
- 0x02, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, // ................
- 0x80, 0x02, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f, // ................
- 0xe0, 0x1f, 0x00, 0x00, 0x02, 0x0a, 0x00, 0x00, 0x80, 0x01, 0x00, 0x0f, 0xe0, 0x1f, 0x00, 0x00, // ................
- 0x02, 0x05, 0x00, 0x00, 0x80, 0x02, 0x00, 0x03, 0xe0, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, // ................
- 0x80, 0x01, 0x00, 0xe4, 0xa0, 0x01, 0x00, 0x55, 0x90, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0f, // .......U........
- 0x80, 0x00, 0x00, 0xe4, 0xa0, 0x01, 0x00, 0x00, 0x90, 0x00, 0x00, 0xe4, 0x80, 0x02, 0x00, 0x00, // ................
- 0x03, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, 0xe4, 0x80, 0x03, 0x00, 0xe4, 0xa0, 0x01, 0x00, 0x00, // ................
- 0x02, 0x01, 0x00, 0x0f, 0xe0, 0x00, 0x00, 0xe4, 0x90, 0x01, 0x00, 0x00, 0x02, 0x02, 0x00, 0x03, // ................
- 0xe0, 0x02, 0x00, 0xe4, 0x90, 0xff, 0xff, 0x00, 0x00, 0x00, // ..........
+ 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x39, // hader Compiler 9
+ 0x2e, 0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, 0x2e, 0x33, 0x31, 0x31, 0x31, 0x00, 0x1f, 0x00, 0x00, // .29.952.3111....
+ 0x02, 0x0a, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, // ................
+ 0x80, 0x01, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x80, 0x02, 0x00, 0x0f, // ................
+ 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f, 0xe0, 0x1f, 0x00, 0x00, // ................
+ 0x02, 0x0a, 0x00, 0x00, 0x80, 0x01, 0x00, 0x0f, 0xe0, 0x1f, 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, // ................
+ 0x80, 0x02, 0x00, 0x03, 0xe0, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0x80, 0x01, 0x00, 0xe4, // ................
+ 0xa0, 0x01, 0x00, 0x55, 0x90, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0xe4, // ...U............
+ 0xa0, 0x01, 0x00, 0x00, 0x90, 0x00, 0x00, 0xe4, 0x80, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, // ................
+ 0xe0, 0x00, 0x00, 0xe4, 0x80, 0x03, 0x00, 0xe4, 0xa0, 0x01, 0x00, 0x00, 0x02, 0x01, 0x00, 0x0f, // ................
+ 0xe0, 0x00, 0x00, 0xe4, 0x90, 0x01, 0x00, 0x00, 0x02, 0x02, 0x00, 0x03, 0xe0, 0x02, 0x00, 0xe4, // ................
+ 0x90, 0xff, 0xff, 0x00, 0x00, 0x00, // ......
};
static const uint8_t vs_imgui_texture_dx11[575] =
{
diff --git a/3rdparty/bgfx/examples/common/imgui/vs_imgui_texture.sc b/3rdparty/bgfx/examples/common/imgui/vs_imgui_texture.sc
index b81edeaa400..f6a3f24cef1 100644
--- a/3rdparty/bgfx/examples/common/imgui/vs_imgui_texture.sc
+++ b/3rdparty/bgfx/examples/common/imgui/vs_imgui_texture.sc
@@ -2,8 +2,8 @@ $input a_position, a_texcoord0, a_color0
$output v_texcoord0, v_color0
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include <bgfx_shader.sh>
diff --git a/3rdparty/bgfx/examples/common/imgui/vs_ocornut_imgui.bin.h b/3rdparty/bgfx/examples/common/imgui/vs_ocornut_imgui.bin.h
index 81ed318597a..ba968aaa2a6 100644
--- a/3rdparty/bgfx/examples/common/imgui/vs_ocornut_imgui.bin.h
+++ b/3rdparty/bgfx/examples/common/imgui/vs_ocornut_imgui.bin.h
@@ -34,11 +34,11 @@ static const uint8_t vs_ocornut_imgui_glsl[523] =
0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, // v_color0 = a_c
0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // olor0;.}...
};
-static const uint8_t vs_ocornut_imgui_dx9[371] =
+static const uint8_t vs_ocornut_imgui_dx9[367] =
{
0x56, 0x53, 0x48, 0x04, 0x01, 0x83, 0xf2, 0xe1, 0x01, 0x00, 0x0b, 0x75, 0x5f, 0x76, 0x69, 0x65, // VSH........u_vie
- 0x77, 0x54, 0x65, 0x78, 0x65, 0x6c, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0x54, 0x01, 0x00, 0x03, // wTexel......T...
- 0xfe, 0xff, 0xfe, 0xff, 0x23, 0x00, 0x43, 0x54, 0x41, 0x42, 0x1c, 0x00, 0x00, 0x00, 0x53, 0x00, // ....#.CTAB....S.
+ 0x77, 0x54, 0x65, 0x78, 0x65, 0x6c, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0x50, 0x01, 0x00, 0x03, // wTexel......P...
+ 0xfe, 0xff, 0xfe, 0xff, 0x22, 0x00, 0x43, 0x54, 0x41, 0x42, 0x1c, 0x00, 0x00, 0x00, 0x53, 0x00, // ....".CTAB....S.
0x00, 0x00, 0x00, 0x03, 0xfe, 0xff, 0x01, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x91, // ................
0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, // ..L...0.........
0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, // ..<.......u_view
@@ -46,20 +46,19 @@ static const uint8_t vs_ocornut_imgui_dx9[371] =
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x73, 0x5f, 0x33, 0x5f, 0x30, 0x00, 0x4d, 0x69, 0x63, // ......vs_3_0.Mic
0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, // rosoft (R) HLSL
0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, // Shader Compiler
- 0x31, 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x30, 0x30, 0x31, 0x31, 0x2e, 0x31, 0x36, 0x33, 0x38, 0x34, // 10.0.10011.16384
- 0x00, 0xab, 0x51, 0x00, 0x00, 0x05, 0x01, 0x00, 0x0f, 0xa0, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, // ..Q..........@..
- 0x80, 0xbf, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x02, 0x0a, 0x00, // .....?..........
- 0x00, 0x80, 0x00, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, // ................
- 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x80, 0x02, 0x00, 0x0f, 0x90, 0x1f, 0x00, // ................
- 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f, 0xe0, 0x1f, 0x00, 0x00, 0x02, 0x0a, 0x00, // ................
- 0x00, 0x80, 0x01, 0x00, 0x0f, 0xe0, 0x1f, 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x80, 0x02, 0x00, // ................
- 0x03, 0xe0, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0xe4, 0xa0, 0x01, 0x00, // ................
- 0xe4, 0x90, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, // ................
- 0x00, 0xa0, 0x01, 0x00, 0x55, 0xa0, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0xe0, 0x00, 0x00, // ....U...........
- 0x55, 0x80, 0x01, 0x00, 0x00, 0xa1, 0x01, 0x00, 0xaa, 0xa0, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, // U...............
- 0x0c, 0xe0, 0x01, 0x00, 0xb4, 0xa0, 0x01, 0x00, 0x00, 0x02, 0x01, 0x00, 0x0f, 0xe0, 0x00, 0x00, // ................
- 0xe4, 0x90, 0x01, 0x00, 0x00, 0x02, 0x02, 0x00, 0x03, 0xe0, 0x02, 0x00, 0xe4, 0x90, 0xff, 0xff, // ................
- 0x00, 0x00, 0x00, // ...
+ 0x39, 0x2e, 0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, 0x2e, 0x33, 0x31, 0x31, 0x31, 0x00, 0x51, 0x00, // 9.29.952.3111.Q.
+ 0x00, 0x05, 0x01, 0x00, 0x0f, 0xa0, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0xbf, 0x00, 0x00, // .........@......
+ 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x02, 0x0a, 0x00, 0x00, 0x80, 0x00, 0x00, // .?..............
+ 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x0f, 0x90, 0x1f, 0x00, // ................
+ 0x00, 0x02, 0x05, 0x00, 0x00, 0x80, 0x02, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, // ................
+ 0x00, 0x80, 0x00, 0x00, 0x0f, 0xe0, 0x1f, 0x00, 0x00, 0x02, 0x0a, 0x00, 0x00, 0x80, 0x01, 0x00, // ................
+ 0x0f, 0xe0, 0x1f, 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x80, 0x02, 0x00, 0x03, 0xe0, 0x05, 0x00, // ................
+ 0x00, 0x03, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0xe4, 0xa0, 0x01, 0x00, 0xe4, 0x90, 0x04, 0x00, // ................
+ 0x00, 0x04, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0xa0, 0x01, 0x00, // ................
+ 0x55, 0xa0, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0xe0, 0x00, 0x00, 0x55, 0x80, 0x01, 0x00, // U...........U...
+ 0x00, 0xa1, 0x01, 0x00, 0xaa, 0xa0, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0c, 0xe0, 0x01, 0x00, // ................
+ 0xb4, 0xa0, 0x01, 0x00, 0x00, 0x02, 0x01, 0x00, 0x0f, 0xe0, 0x00, 0x00, 0xe4, 0x90, 0x01, 0x00, // ................
+ 0x00, 0x02, 0x02, 0x00, 0x03, 0xe0, 0x02, 0x00, 0xe4, 0x90, 0xff, 0xff, 0x00, 0x00, 0x00, // ...............
};
static const uint8_t vs_ocornut_imgui_dx11[612] =
{
diff --git a/3rdparty/bgfx/examples/common/nanovg/fontstash.h b/3rdparty/bgfx/examples/common/nanovg/fontstash.h
index 411b1a87fce..6fdb664e906 100644
--- a/3rdparty/bgfx/examples/common/nanovg/fontstash.h
+++ b/3rdparty/bgfx/examples/common/nanovg/fontstash.h
@@ -41,9 +41,9 @@ enum FONSalign {
enum FONSerrorCode {
// Font atlas is full.
FONS_ATLAS_FULL = 1,
- // Scratch memory used to render glyphs is full, requested size reported in 'val', you may need to bump up FONS_SCRATCH_BUF_SIZE.
+ // Scratch memory used to render glyphs is full, requested size reported in 'val', you may need to bump up FONS_SCRATCH_BUF_SIZE.
FONS_SCRATCH_FULL = 2,
- // Calls to fonsPushState has craeted too large stack, if you need deep state stack bump up FONS_MAX_STATES.
+ // Calls to fonsPushState has created too large stack, if you need deep state stack bump up FONS_MAX_STATES.
FONS_STATES_OVERFLOW = 3,
// Trying to pop too many states fonsPopState().
FONS_STATES_UNDERFLOW = 4,
@@ -594,7 +594,7 @@ static int fons__atlasAddSkylineLevel(FONSatlas* atlas, int idx, int x, int y, i
if (fons__atlasInsertNode(atlas, idx, x, y+h, w) == 0)
return 0;
- // Delete skyline segments that fall under the shaodw of the new segment.
+ // Delete skyline segments that fall under the shadow of the new segment.
for (i = idx+1; i < atlas->nnodes; i++) {
if (atlas->nodes[i].x < atlas->nodes[i-1].x + atlas->nodes[i-1].width) {
int shrink = atlas->nodes[i-1].x + atlas->nodes[i-1].width - atlas->nodes[i].x;
@@ -1131,7 +1131,7 @@ static void fons__getQuad(FONScontext* stash, FONSfont* font,
// Each glyph has 2px border to allow good interpolation,
// one pixel to prevent leaking, and one to allow good interpolation for rendering.
- // Inset the texture region by one pixel for corret interpolation.
+ // Inset the texture region by one pixel for correct interpolation.
xoff = (short)(glyph->xoff+1);
yoff = (short)(glyph->yoff+1);
x0 = (float)(glyph->x0+1);
@@ -1630,7 +1630,7 @@ int fonsExpandAtlas(FONScontext* stash, int width, int height)
// Increase atlas size
fons__atlasExpand(stash->atlas, width, height);
- // Add axisting data as dirty.
+ // Add existing data as dirty.
for (i = 0; i < stash->atlas->nnodes; i++)
maxy = fons__maxi(maxy, stash->atlas->nodes[i].y);
stash->dirtyRect[0] = 0;
diff --git a/3rdparty/bgfx/examples/common/nanovg/fs_nanovg_fill.bin.h b/3rdparty/bgfx/examples/common/nanovg/fs_nanovg_fill.bin.h
index c7ed6294e86..f2de36d49ad 100644
--- a/3rdparty/bgfx/examples/common/nanovg/fs_nanovg_fill.bin.h
+++ b/3rdparty/bgfx/examples/common/nanovg/fs_nanovg_fill.bin.h
@@ -195,7 +195,7 @@ static const uint8_t fs_nanovg_fill_glsl[3095] =
0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, // gColor = result_
0x31, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // 1;.}...
};
-static const uint8_t fs_nanovg_fill_dx9[1547] =
+static const uint8_t fs_nanovg_fill_dx9[1543] =
{
0x46, 0x53, 0x48, 0x04, 0xcf, 0xda, 0x1b, 0x94, 0x08, 0x00, 0x05, 0x73, 0x5f, 0x74, 0x65, 0x78, // FSH........s_tex
0x30, 0x01, 0x00, 0x00, 0x01, 0x00, 0x0e, 0x75, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x52, // 0......u_extentR
@@ -206,8 +206,8 @@ static const uint8_t fs_nanovg_fill_dx9[1547] =
0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x01, 0x0a, 0x00, 0x01, 0x00, 0x11, 0x75, 0x5f, // _params.......u_
0x73, 0x63, 0x69, 0x73, 0x73, 0x6f, 0x72, 0x45, 0x78, 0x74, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x12, // scissorExtScale.
0x01, 0x08, 0x00, 0x01, 0x00, 0x0c, 0x75, 0x5f, 0x73, 0x63, 0x69, 0x73, 0x73, 0x6f, 0x72, 0x4d, // ......u_scissorM
- 0x61, 0x74, 0x13, 0x01, 0x00, 0x00, 0x03, 0x00, 0x70, 0x05, 0x00, 0x03, 0xff, 0xff, 0xfe, 0xff, // at......p.......
- 0x64, 0x00, 0x43, 0x54, 0x41, 0x42, 0x1c, 0x00, 0x00, 0x00, 0x57, 0x01, 0x00, 0x00, 0x00, 0x03, // d.CTAB....W.....
+ 0x61, 0x74, 0x13, 0x01, 0x00, 0x00, 0x03, 0x00, 0x6c, 0x05, 0x00, 0x03, 0xff, 0xff, 0xfe, 0xff, // at......l.......
+ 0x63, 0x00, 0x43, 0x54, 0x41, 0x42, 0x1c, 0x00, 0x00, 0x00, 0x57, 0x01, 0x00, 0x00, 0x00, 0x03, // c.CTAB....W.....
0xff, 0xff, 0x08, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x91, 0x00, 0x00, 0x50, 0x01, // ..............P.
0x00, 0x00, 0xbc, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0xc4, 0x00, // ................
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd4, 0x00, 0x00, 0x00, 0x02, 0x00, 0x09, 0x00, 0x01, 0x00, // ................
@@ -231,69 +231,69 @@ static const uint8_t fs_nanovg_fill_dx9[1547] =
0x6f, 0x72, 0x4d, 0x61, 0x74, 0x00, 0x70, 0x73, 0x5f, 0x33, 0x5f, 0x30, 0x00, 0x4d, 0x69, 0x63, // orMat.ps_3_0.Mic
0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, // rosoft (R) HLSL
0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, // Shader Compiler
- 0x31, 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x30, 0x30, 0x31, 0x31, 0x2e, 0x31, 0x36, 0x33, 0x38, 0x34, // 10.0.10011.16384
- 0x00, 0xab, 0x51, 0x00, 0x00, 0x05, 0x0b, 0x00, 0x0f, 0xa0, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, // ..Q..........?..
- 0x00, 0x40, 0x00, 0x00, 0x80, 0xbf, 0x00, 0x00, 0x80, 0x3f, 0x51, 0x00, 0x00, 0x05, 0x0c, 0x00, // .@.......?Q.....
- 0x0f, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, // .........?..@@..
- 0x00, 0x00, 0x1f, 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x80, 0x00, 0x00, 0x03, 0x90, 0x1f, 0x00, // ................
- 0x00, 0x02, 0x05, 0x00, 0x01, 0x80, 0x01, 0x00, 0x03, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, // ................
- 0x00, 0x90, 0x00, 0x08, 0x0f, 0xa0, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0x80, 0x01, 0x00, // ................
- 0x00, 0x90, 0x0b, 0x00, 0x55, 0xa0, 0x0b, 0x00, 0xaa, 0xa0, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, // ....U...........
- 0x01, 0x80, 0x00, 0x00, 0x00, 0x8c, 0x0b, 0x00, 0xff, 0xa0, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, // ................
- 0x01, 0x80, 0x00, 0x00, 0x00, 0x80, 0x0a, 0x00, 0x55, 0xa0, 0x0a, 0x00, 0x00, 0x03, 0x01, 0x00, // ........U.......
- 0x01, 0x80, 0x00, 0x00, 0x00, 0x80, 0x0b, 0x00, 0xff, 0xa0, 0x0a, 0x00, 0x00, 0x03, 0x00, 0x00, // ................
- 0x01, 0x80, 0x01, 0x00, 0x55, 0x90, 0x0b, 0x00, 0xff, 0xa0, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, // ....U...........
- 0x01, 0x80, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, // ................
- 0x06, 0x80, 0x04, 0x00, 0xd0, 0xa0, 0x00, 0x00, 0x55, 0x90, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, // ........U.......
- 0x06, 0x80, 0x03, 0x00, 0xd0, 0xa0, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0xe4, 0x80, 0x02, 0x00, // ................
- 0x00, 0x03, 0x00, 0x00, 0x06, 0x80, 0x00, 0x00, 0xe4, 0x80, 0x05, 0x00, 0xd0, 0xa0, 0x06, 0x00, // ................
- 0x00, 0x02, 0x01, 0x00, 0x01, 0x80, 0x09, 0x00, 0x00, 0xa0, 0x06, 0x00, 0x00, 0x02, 0x01, 0x00, // ................
- 0x02, 0x80, 0x09, 0x00, 0x55, 0xa0, 0x05, 0x00, 0x00, 0x03, 0x01, 0x00, 0x03, 0x80, 0x00, 0x00, // ....U...........
- 0xe9, 0x80, 0x01, 0x00, 0xe4, 0x80, 0x05, 0x00, 0x00, 0x03, 0x01, 0x00, 0x0c, 0x80, 0x01, 0x00, // ................
- 0x44, 0xa0, 0x00, 0x00, 0x55, 0x90, 0x04, 0x00, 0x00, 0x04, 0x01, 0x00, 0x0c, 0x80, 0x00, 0x00, // D...U...........
- 0x44, 0xa0, 0x00, 0x00, 0x00, 0x90, 0x01, 0x00, 0xe4, 0x80, 0x02, 0x00, 0x00, 0x03, 0x01, 0x00, // D...............
- 0x0c, 0x80, 0x01, 0x00, 0xe4, 0x80, 0x02, 0x00, 0x44, 0xa0, 0x02, 0x00, 0x00, 0x03, 0x01, 0x00, // ........D.......
- 0x0c, 0x80, 0x01, 0x00, 0xe4, 0x8b, 0x08, 0x00, 0x44, 0xa1, 0x01, 0x00, 0x00, 0x02, 0x02, 0x00, // ........D.......
- 0x07, 0x80, 0x0b, 0x00, 0xe4, 0xa0, 0x04, 0x00, 0x00, 0x04, 0x01, 0x00, 0x1c, 0x80, 0x01, 0x00, // ................
- 0xe4, 0x80, 0x08, 0x00, 0xe4, 0xa1, 0x02, 0x00, 0x00, 0x80, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, // ................
- 0x08, 0x80, 0x01, 0x00, 0xff, 0x80, 0x01, 0x00, 0xaa, 0x80, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, // ................
- 0x01, 0x80, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x03, 0x01, 0x00, // ................
- 0x04, 0x80, 0x02, 0x00, 0xaa, 0x80, 0x0a, 0x00, 0xff, 0xa0, 0x23, 0x00, 0x00, 0x02, 0x02, 0x00, // ..........#.....
- 0x0c, 0x80, 0x0a, 0x00, 0xb4, 0xa0, 0x42, 0x00, 0x00, 0x03, 0x03, 0x00, 0x0f, 0x80, 0x01, 0x00, // ......B.........
- 0xe4, 0x80, 0x00, 0x08, 0xe4, 0xa0, 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x0f, 0x80, 0x03, 0x00, // ................
- 0x00, 0x80, 0x0c, 0x00, 0x40, 0xa0, 0x0c, 0x00, 0x15, 0xa0, 0x58, 0x00, 0x00, 0x04, 0x03, 0x00, // ....@.....X.....
- 0x0f, 0x80, 0x02, 0x00, 0xff, 0x81, 0x03, 0x00, 0xe4, 0x80, 0x04, 0x00, 0xe4, 0x80, 0x05, 0x00, // ................
- 0x00, 0x03, 0x03, 0x00, 0x08, 0x80, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0xff, 0x80, 0x29, 0x00, // ..............).
- 0x02, 0x02, 0x0a, 0x00, 0xff, 0xa0, 0x02, 0x00, 0x55, 0x80, 0x01, 0x00, 0x00, 0x02, 0x04, 0x00, // ........U.......
- 0x0f, 0x80, 0x0b, 0x00, 0xff, 0xa0, 0x2a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x05, 0x00, // ......*.........
- 0x04, 0x80, 0x0c, 0x00, 0xaa, 0xa0, 0x29, 0x00, 0x02, 0x02, 0x0a, 0x00, 0xff, 0xa0, 0x05, 0x00, // ......).........
- 0xaa, 0x80, 0x42, 0x00, 0x00, 0x03, 0x05, 0x00, 0x0f, 0x80, 0x01, 0x00, 0xe4, 0x90, 0x00, 0x08, // ..B.............
- 0xe4, 0xa0, 0x04, 0x00, 0x00, 0x04, 0x06, 0x00, 0x0f, 0x80, 0x05, 0x00, 0x00, 0x80, 0x0c, 0x00, // ................
- 0x40, 0xa0, 0x0c, 0x00, 0x15, 0xa0, 0x58, 0x00, 0x00, 0x04, 0x05, 0x00, 0x0f, 0x80, 0x02, 0x00, // @.....X.........
- 0xff, 0x81, 0x05, 0x00, 0xe4, 0x80, 0x06, 0x00, 0xe4, 0x80, 0x05, 0x00, 0x00, 0x03, 0x05, 0x00, // ................
- 0x08, 0x80, 0x00, 0x00, 0xff, 0x80, 0x05, 0x00, 0xff, 0x80, 0x05, 0x00, 0x00, 0x03, 0x04, 0x00, // ................
- 0x0f, 0x80, 0x05, 0x00, 0xe4, 0x80, 0x06, 0x00, 0xe4, 0xa0, 0x2a, 0x00, 0x00, 0x00, 0x01, 0x00, // ..........*.....
- 0x00, 0x02, 0x04, 0x00, 0x0f, 0x80, 0x0c, 0x00, 0x00, 0xa0, 0x2b, 0x00, 0x00, 0x00, 0x2b, 0x00, // ..........+...+.
- 0x00, 0x00, 0x58, 0x00, 0x00, 0x04, 0x01, 0x00, 0x0f, 0x80, 0x01, 0x00, 0xaa, 0x8c, 0x03, 0x00, // ..X.............
- 0xe4, 0x80, 0x04, 0x00, 0xe4, 0x80, 0x02, 0x00, 0x00, 0x03, 0x02, 0x00, 0x0a, 0x80, 0x09, 0x00, // ................
- 0xaa, 0xa1, 0x09, 0x00, 0x60, 0xa0, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x06, 0x80, 0x00, 0x00, // ....`...........
- 0xe4, 0x8b, 0x02, 0x00, 0xf4, 0x81, 0x0b, 0x00, 0x00, 0x03, 0x02, 0x00, 0x0a, 0x80, 0x00, 0x00, // ................
- 0xa4, 0x80, 0x0c, 0x00, 0x00, 0xa0, 0x5a, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x80, 0x02, 0x00, // ......Z.........
- 0xed, 0x80, 0x02, 0x00, 0xed, 0x80, 0x0c, 0x00, 0x00, 0xa0, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, // ................
- 0x08, 0x80, 0x00, 0x00, 0xff, 0x80, 0x06, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, // ................
- 0xff, 0x80, 0x0b, 0x00, 0x00, 0x03, 0x02, 0x00, 0x02, 0x80, 0x00, 0x00, 0x55, 0x80, 0x00, 0x00, // ............U...
- 0xaa, 0x80, 0x0a, 0x00, 0x00, 0x03, 0x00, 0x00, 0x02, 0x80, 0x02, 0x00, 0x55, 0x80, 0x0c, 0x00, // ............U...
- 0x00, 0xa0, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, // ................
- 0x55, 0x80, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0x55, 0x80, 0x09, 0x00, // U...........U...
- 0xaa, 0xa1, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x80, 0x0a, 0x00, 0x00, 0xa0, 0x02, 0x00, // ................
- 0x00, 0x80, 0x00, 0x00, 0x55, 0x80, 0x06, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x80, 0x0a, 0x00, // ....U...........
- 0x00, 0xa0, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x12, 0x80, 0x00, 0x00, 0xaa, 0x80, 0x00, 0x00, // ................
- 0x55, 0x80, 0x01, 0x00, 0x00, 0x02, 0x03, 0x00, 0x0f, 0x80, 0x06, 0x00, 0xe4, 0xa0, 0x02, 0x00, // U...............
- 0x00, 0x03, 0x03, 0x00, 0x0f, 0x80, 0x03, 0x00, 0xe4, 0x81, 0x07, 0x00, 0xe4, 0xa0, 0x04, 0x00, // ................
- 0x00, 0x04, 0x03, 0x00, 0x0f, 0x80, 0x00, 0x00, 0x55, 0x80, 0x03, 0x00, 0xe4, 0x80, 0x06, 0x00, // ........U.......
- 0xe4, 0xa0, 0x05, 0x00, 0x00, 0x03, 0x03, 0x00, 0x08, 0x80, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, // ................
- 0xff, 0x80, 0x58, 0x00, 0x00, 0x04, 0x00, 0x08, 0x0f, 0x80, 0x02, 0x00, 0xaa, 0x81, 0x03, 0x00, // ..X.............
- 0xe4, 0x80, 0x01, 0x00, 0xe4, 0x80, 0xff, 0xff, 0x00, 0x00, 0x00, // ...........
+ 0x39, 0x2e, 0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, 0x2e, 0x33, 0x31, 0x31, 0x31, 0x00, 0x51, 0x00, // 9.29.952.3111.Q.
+ 0x00, 0x05, 0x0b, 0x00, 0x0f, 0xa0, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, // .........?...@..
+ 0x80, 0xbf, 0x00, 0x00, 0x80, 0x3f, 0x51, 0x00, 0x00, 0x05, 0x0c, 0x00, 0x0f, 0xa0, 0x00, 0x00, // .....?Q.........
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, // .....?..@@......
+ 0x00, 0x02, 0x05, 0x00, 0x00, 0x80, 0x00, 0x00, 0x03, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x05, 0x00, // ................
+ 0x01, 0x80, 0x01, 0x00, 0x03, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x90, 0x00, 0x08, // ................
+ 0x0f, 0xa0, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0x80, 0x01, 0x00, 0x00, 0x90, 0x0b, 0x00, // ................
+ 0x55, 0xa0, 0x0b, 0x00, 0xaa, 0xa0, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, // U...............
+ 0x00, 0x8c, 0x0b, 0x00, 0xff, 0xa0, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, // ................
+ 0x00, 0x80, 0x0a, 0x00, 0x55, 0xa0, 0x0a, 0x00, 0x00, 0x03, 0x01, 0x00, 0x01, 0x80, 0x00, 0x00, // ....U...........
+ 0x00, 0x80, 0x0b, 0x00, 0xff, 0xa0, 0x0a, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x01, 0x00, // ................
+ 0x55, 0x90, 0x0b, 0x00, 0xff, 0xa0, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, // U...............
+ 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x06, 0x80, 0x04, 0x00, // ................
+ 0xd0, 0xa0, 0x00, 0x00, 0x55, 0x90, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x06, 0x80, 0x03, 0x00, // ....U...........
+ 0xd0, 0xa0, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0xe4, 0x80, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, // ................
+ 0x06, 0x80, 0x00, 0x00, 0xe4, 0x80, 0x05, 0x00, 0xd0, 0xa0, 0x06, 0x00, 0x00, 0x02, 0x01, 0x00, // ................
+ 0x01, 0x80, 0x09, 0x00, 0x00, 0xa0, 0x06, 0x00, 0x00, 0x02, 0x01, 0x00, 0x02, 0x80, 0x09, 0x00, // ................
+ 0x55, 0xa0, 0x05, 0x00, 0x00, 0x03, 0x01, 0x00, 0x03, 0x80, 0x00, 0x00, 0xe9, 0x80, 0x01, 0x00, // U...............
+ 0xe4, 0x80, 0x05, 0x00, 0x00, 0x03, 0x01, 0x00, 0x0c, 0x80, 0x01, 0x00, 0x44, 0xa0, 0x00, 0x00, // ............D...
+ 0x55, 0x90, 0x04, 0x00, 0x00, 0x04, 0x01, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x44, 0xa0, 0x00, 0x00, // U...........D...
+ 0x00, 0x90, 0x01, 0x00, 0xe4, 0x80, 0x02, 0x00, 0x00, 0x03, 0x01, 0x00, 0x0c, 0x80, 0x01, 0x00, // ................
+ 0xe4, 0x80, 0x02, 0x00, 0x44, 0xa0, 0x02, 0x00, 0x00, 0x03, 0x01, 0x00, 0x0c, 0x80, 0x01, 0x00, // ....D...........
+ 0xe4, 0x8b, 0x08, 0x00, 0x44, 0xa1, 0x01, 0x00, 0x00, 0x02, 0x02, 0x00, 0x07, 0x80, 0x0b, 0x00, // ....D...........
+ 0xe4, 0xa0, 0x04, 0x00, 0x00, 0x04, 0x01, 0x00, 0x1c, 0x80, 0x01, 0x00, 0xe4, 0x80, 0x08, 0x00, // ................
+ 0xe4, 0xa1, 0x02, 0x00, 0x00, 0x80, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x08, 0x80, 0x01, 0x00, // ................
+ 0xff, 0x80, 0x01, 0x00, 0xaa, 0x80, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, // ................
+ 0xff, 0x80, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x03, 0x01, 0x00, 0x04, 0x80, 0x02, 0x00, // ................
+ 0xaa, 0x80, 0x0a, 0x00, 0xff, 0xa0, 0x23, 0x00, 0x00, 0x02, 0x02, 0x00, 0x0c, 0x80, 0x0a, 0x00, // ......#.........
+ 0xb4, 0xa0, 0x42, 0x00, 0x00, 0x03, 0x03, 0x00, 0x0f, 0x80, 0x01, 0x00, 0xe4, 0x80, 0x00, 0x08, // ..B.............
+ 0xe4, 0xa0, 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x0f, 0x80, 0x03, 0x00, 0x00, 0x80, 0x0c, 0x00, // ................
+ 0x40, 0xa0, 0x0c, 0x00, 0x15, 0xa0, 0x58, 0x00, 0x00, 0x04, 0x03, 0x00, 0x0f, 0x80, 0x02, 0x00, // @.....X.........
+ 0xff, 0x81, 0x03, 0x00, 0xe4, 0x80, 0x04, 0x00, 0xe4, 0x80, 0x05, 0x00, 0x00, 0x03, 0x03, 0x00, // ................
+ 0x08, 0x80, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0xff, 0x80, 0x29, 0x00, 0x02, 0x02, 0x0a, 0x00, // ..........).....
+ 0xff, 0xa0, 0x02, 0x00, 0x55, 0x80, 0x01, 0x00, 0x00, 0x02, 0x04, 0x00, 0x0f, 0x80, 0x0b, 0x00, // ....U...........
+ 0xff, 0xa0, 0x2a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x05, 0x00, 0x04, 0x80, 0x0c, 0x00, // ..*.............
+ 0xaa, 0xa0, 0x29, 0x00, 0x02, 0x02, 0x0a, 0x00, 0xff, 0xa0, 0x05, 0x00, 0xaa, 0x80, 0x42, 0x00, // ..)...........B.
+ 0x00, 0x03, 0x05, 0x00, 0x0f, 0x80, 0x01, 0x00, 0xe4, 0x90, 0x00, 0x08, 0xe4, 0xa0, 0x04, 0x00, // ................
+ 0x00, 0x04, 0x06, 0x00, 0x0f, 0x80, 0x05, 0x00, 0x00, 0x80, 0x0c, 0x00, 0x40, 0xa0, 0x0c, 0x00, // ............@...
+ 0x15, 0xa0, 0x58, 0x00, 0x00, 0x04, 0x05, 0x00, 0x0f, 0x80, 0x02, 0x00, 0xff, 0x81, 0x05, 0x00, // ..X.............
+ 0xe4, 0x80, 0x06, 0x00, 0xe4, 0x80, 0x05, 0x00, 0x00, 0x03, 0x05, 0x00, 0x08, 0x80, 0x00, 0x00, // ................
+ 0xff, 0x80, 0x05, 0x00, 0xff, 0x80, 0x05, 0x00, 0x00, 0x03, 0x04, 0x00, 0x0f, 0x80, 0x05, 0x00, // ................
+ 0xe4, 0x80, 0x06, 0x00, 0xe4, 0xa0, 0x2a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x04, 0x00, // ......*.........
+ 0x0f, 0x80, 0x0c, 0x00, 0x00, 0xa0, 0x2b, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x58, 0x00, // ......+...+...X.
+ 0x00, 0x04, 0x01, 0x00, 0x0f, 0x80, 0x01, 0x00, 0xaa, 0x8c, 0x03, 0x00, 0xe4, 0x80, 0x04, 0x00, // ................
+ 0xe4, 0x80, 0x02, 0x00, 0x00, 0x03, 0x02, 0x00, 0x0a, 0x80, 0x09, 0x00, 0xaa, 0xa1, 0x09, 0x00, // ................
+ 0x60, 0xa0, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x06, 0x80, 0x00, 0x00, 0xe4, 0x8b, 0x02, 0x00, // `...............
+ 0xf4, 0x81, 0x0b, 0x00, 0x00, 0x03, 0x02, 0x00, 0x0a, 0x80, 0x00, 0x00, 0xa4, 0x80, 0x0c, 0x00, // ................
+ 0x00, 0xa0, 0x5a, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x80, 0x02, 0x00, 0xed, 0x80, 0x02, 0x00, // ..Z.............
+ 0xed, 0x80, 0x0c, 0x00, 0x00, 0xa0, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, // ................
+ 0xff, 0x80, 0x06, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0xff, 0x80, 0x0b, 0x00, // ................
+ 0x00, 0x03, 0x02, 0x00, 0x02, 0x80, 0x00, 0x00, 0x55, 0x80, 0x00, 0x00, 0xaa, 0x80, 0x0a, 0x00, // ........U.......
+ 0x00, 0x03, 0x00, 0x00, 0x02, 0x80, 0x02, 0x00, 0x55, 0x80, 0x0c, 0x00, 0x00, 0xa0, 0x02, 0x00, // ........U.......
+ 0x00, 0x03, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0x55, 0x80, 0x02, 0x00, // ............U...
+ 0x00, 0x03, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0x55, 0x80, 0x09, 0x00, 0xaa, 0xa1, 0x04, 0x00, // ........U.......
+ 0x00, 0x04, 0x00, 0x00, 0x02, 0x80, 0x0a, 0x00, 0x00, 0xa0, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, // ................
+ 0x55, 0x80, 0x06, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x80, 0x0a, 0x00, 0x00, 0xa0, 0x05, 0x00, // U...............
+ 0x00, 0x03, 0x00, 0x00, 0x12, 0x80, 0x00, 0x00, 0xaa, 0x80, 0x00, 0x00, 0x55, 0x80, 0x01, 0x00, // ............U...
+ 0x00, 0x02, 0x03, 0x00, 0x0f, 0x80, 0x06, 0x00, 0xe4, 0xa0, 0x02, 0x00, 0x00, 0x03, 0x03, 0x00, // ................
+ 0x0f, 0x80, 0x03, 0x00, 0xe4, 0x81, 0x07, 0x00, 0xe4, 0xa0, 0x04, 0x00, 0x00, 0x04, 0x03, 0x00, // ................
+ 0x0f, 0x80, 0x00, 0x00, 0x55, 0x80, 0x03, 0x00, 0xe4, 0x80, 0x06, 0x00, 0xe4, 0xa0, 0x05, 0x00, // ....U...........
+ 0x00, 0x03, 0x03, 0x00, 0x08, 0x80, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0xff, 0x80, 0x58, 0x00, // ..............X.
+ 0x00, 0x04, 0x00, 0x08, 0x0f, 0x80, 0x02, 0x00, 0xaa, 0x81, 0x03, 0x00, 0xe4, 0x80, 0x01, 0x00, // ................
+ 0xe4, 0x80, 0xff, 0xff, 0x00, 0x00, 0x00, // .......
};
static const uint8_t fs_nanovg_fill_dx11[2298] =
{
diff --git a/3rdparty/bgfx/examples/common/nanovg/nanovg.cpp b/3rdparty/bgfx/examples/common/nanovg/nanovg.cpp
index 2f0106dc4f3..62a1ce539cb 100644
--- a/3rdparty/bgfx/examples/common/nanovg/nanovg.cpp
+++ b/3rdparty/bgfx/examples/common/nanovg/nanovg.cpp
@@ -37,6 +37,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
BX_PRAGMA_DIAGNOSTIC_PUSH();
BX_PRAGMA_DIAGNOSTIC_IGNORED_CLANG_GCC("-Wmissing-field-initializers");
BX_PRAGMA_DIAGNOSTIC_IGNORED_CLANG_GCC("-Wshadow");
+BX_PRAGMA_DIAGNOSTIC_IGNORED_CLANG_GCC("-Wint-to-pointer-cast")
#define STB_IMAGE_IMPLEMENTATION
#include <stb/stb_image.c>
BX_PRAGMA_DIAGNOSTIC_POP();
@@ -58,7 +59,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
#define NVG_INIT_VERTS_SIZE 256
#define NVG_MAX_STATES 32
-#define NVG_KAPPA90 0.5522847493f // Lenght proportional to radius of a cubic bezier handle for 90deg arcs.
+#define NVG_KAPPA90 0.5522847493f // Length proportional to radius of a cubic bezier handle for 90deg arcs.
#define NVG_COUNTOF(arr) (sizeof(arr) / sizeof(0[arr]))
@@ -297,7 +298,7 @@ void nvgDeleteInternal(NVGcontext* ctx)
free(ctx);
}
-void nvgBeginFrameScaled(NVGcontext* ctx, int windowWidth, int windowHeight, int surfaceWidth, int surfaceHeight, float devicePixelRatio)
+void nvgBeginFrame(NVGcontext* ctx, int windowWidth, int windowHeight, float devicePixelRatio)
{
/* printf("Tris: draws:%d fill:%d stroke:%d text:%d TOT:%d\n",
ctx->drawCallCount, ctx->fillTriCount, ctx->strokeTriCount, ctx->textTriCount,
@@ -309,7 +310,7 @@ void nvgBeginFrameScaled(NVGcontext* ctx, int windowWidth, int windowHeight, int
nvg__setDevicePixelRatio(ctx, devicePixelRatio);
- ctx->params.renderViewport(ctx->params.userPtr, windowWidth, windowHeight, surfaceWidth, surfaceHeight);
+ ctx->params.renderViewport(ctx->params.userPtr, windowWidth, windowHeight);
ctx->drawCallCount = 0;
ctx->fillTriCount = 0;
@@ -317,11 +318,6 @@ void nvgBeginFrameScaled(NVGcontext* ctx, int windowWidth, int windowHeight, int
ctx->textTriCount = 0;
}
-void nvgBeginFrame(NVGcontext* ctx, int windowWidth, int windowHeight, float devicePixelRatio)
-{
- nvgBeginFrameScaled(ctx, windowWidth, windowHeight, windowWidth, windowHeight, devicePixelRatio);
-}
-
void nvgCancelFrame(NVGcontext* ctx)
{
ctx->params.renderCancel(ctx->params.userPtr);
@@ -1641,7 +1637,7 @@ static int nvg__expandStroke(NVGcontext* ctx, float w, int lineCap, int lineJoin
for (i = 0; i < cache->npaths; i++) {
NVGpath* path = &cache->paths[i];
int loop = (path->closed == 0) ? 0 : 1;
- if (lineCap == NVG_ROUND)
+ if (lineJoin == NVG_ROUND)
cverts += (path->count + path->nbevel*(ncap+2) + 1) * 2; // plus one for loop
else
cverts += (path->count + path->nbevel*5 + 1) * 2; // plus one for loop
@@ -2349,7 +2345,7 @@ float nvgText(NVGcontext* ctx, float x, float y, const char* string, const char*
break;
}
prevIter = iter;
- // Trasnform corners.
+ // Transform corners.
nvgTransformPoint(&c[0],&c[1], state->xform, q.x0*invscale, q.y0*invscale);
nvgTransformPoint(&c[2],&c[3], state->xform, q.x1*invscale, q.y0*invscale);
nvgTransformPoint(&c[4],&c[5], state->xform, q.x1*invscale, q.y1*invscale);
@@ -2609,7 +2605,7 @@ int nvgTextBreakLines(NVGcontext* ctx, const char* string, const char* end, floa
wordStartX = iter.x;
wordMinX = q.x0 - rowStartX;
} else {
- // Break the line from the end of the last word, and start new line from the begining of the new.
+ // Break the line from the end of the last word, and start new line from the beginning of the new.
rows[nrows].start = rowStart;
rows[nrows].end = breakEnd;
rows[nrows].width = breakWidth * invscale;
@@ -2639,7 +2635,7 @@ int nvgTextBreakLines(NVGcontext* ctx, const char* string, const char* end, floa
ptype = type;
}
- // Break the line from the end of the last word, and start new line from the begining of the new.
+ // Break the line from the end of the last word, and start new line from the beginning of the new.
if (rowStart != NULL) {
rows[nrows].start = rowStart;
rows[nrows].end = rowEnd;
diff --git a/3rdparty/bgfx/examples/common/nanovg/nanovg.h b/3rdparty/bgfx/examples/common/nanovg/nanovg.h
index f43f90f4651..1f55dcd3f70 100644
--- a/3rdparty/bgfx/examples/common/nanovg/nanovg.h
+++ b/3rdparty/bgfx/examples/common/nanovg/nanovg.h
@@ -116,7 +116,6 @@ enum NVGimageFlags {
// frame buffer size. In that case you would set windowWidth/Height to the window size
// devicePixelRatio to: frameBufferWidth / windowWidth.
void nvgBeginFrame(NVGcontext* ctx, int windowWidth, int windowHeight, float devicePixelRatio);
-void nvgBeginFrameScaled(NVGcontext* ctx, int windowWidth, int windowHeight, int surfaceWidth, int surfaceHeight, float devicePixelRatio);
// Cancels drawing the current frame.
void nvgCancelFrame(NVGcontext* ctx);
@@ -143,7 +142,7 @@ NVGcolor nvgRGBA(unsigned char r, unsigned char g, unsigned char b, unsigned cha
NVGcolor nvgRGBAf(float r, float g, float b, float a);
-// Linearly interpoaltes from color c0 to c1, and returns resulting color value.
+// Linearly interpolates from color c0 to c1, and returns resulting color value.
NVGcolor nvgLerpRGBA(NVGcolor c0, NVGcolor c1, float u);
// Sets transparency of a color value.
@@ -192,7 +191,7 @@ void nvgStrokeColor(NVGcontext* ctx, NVGcolor color);
// Sets current stroke style to a paint, which can be a one of the gradients or a pattern.
void nvgStrokePaint(NVGcontext* ctx, NVGpaint paint);
-// Sets current fill cstyle to a solid color.
+// Sets current fill style to a solid color.
void nvgFillColor(NVGcontext* ctx, NVGcolor color);
// Sets current fill style to a paint, which can be a one of the gradients or a pattern.
@@ -202,7 +201,7 @@ void nvgFillPaint(NVGcontext* ctx, NVGpaint paint);
// Miter limit controls when a sharp corner is beveled.
void nvgMiterLimit(NVGcontext* ctx, float limit);
-// Sets the stroke witdth of the stroke style.
+// Sets the stroke width of the stroke style.
void nvgStrokeWidth(NVGcontext* ctx, float size);
// Sets how the end of the line (cap) is drawn,
@@ -247,16 +246,16 @@ void nvgTransform(NVGcontext* ctx, float a, float b, float c, float d, float e,
// Translates current coordinate system.
void nvgTranslate(NVGcontext* ctx, float x, float y);
-// Rotates current coordinate system. Angle is specifid in radians.
+// Rotates current coordinate system. Angle is specified in radians.
void nvgRotate(NVGcontext* ctx, float angle);
-// Skews the current coordinate system along X axis. Angle is specifid in radians.
+// Skews the current coordinate system along X axis. Angle is specified in radians.
void nvgSkewX(NVGcontext* ctx, float angle);
-// Skews the current coordinate system along Y axis. Angle is specifid in radians.
+// Skews the current coordinate system along Y axis. Angle is specified in radians.
void nvgSkewY(NVGcontext* ctx, float angle);
-// Scales the current coordinat system.
+// Scales the current coordinate system.
void nvgScale(NVGcontext* ctx, float x, float y);
// Stores the top part (a-f) of the current transformation matrix in to the specified buffer.
@@ -268,7 +267,7 @@ void nvgCurrentTransform(NVGcontext* ctx, float* xform);
// The following functions can be used to make calculations on 2x3 transformation matrices.
-// A 2x3 matrix is representated as float[6].
+// A 2x3 matrix is represented as float[6].
// Sets the transform to identity matrix.
void nvgTransformIdentity(float* dst);
@@ -279,13 +278,13 @@ void nvgTransformTranslate(float* dst, float tx, float ty);
// Sets the transform to scale matrix.
void nvgTransformScale(float* dst, float sx, float sy);
-// Sets the transform to rotate matrix. Angle is specifid in radians.
+// Sets the transform to rotate matrix. Angle is specified in radians.
void nvgTransformRotate(float* dst, float a);
-// Sets the transform to skew-x matrix. Angle is specifid in radians.
+// Sets the transform to skew-x matrix. Angle is specified in radians.
void nvgTransformSkewX(float* dst, float a);
-// Sets the transform to skew-y matrix. Angle is specifid in radians.
+// Sets the transform to skew-y matrix. Angle is specified in radians.
void nvgTransformSkewY(float* dst, float a);
// Sets the transform to the result of multiplication of two transforms, of A = A*B.
@@ -301,7 +300,7 @@ int nvgTransformInverse(float* dst, const float* src);
// Transform a point by given transform.
void nvgTransformPoint(float* dstx, float* dsty, const float* xform, float srcx, float srcy);
-// Converts degress to radians and vice versa.
+// Converts degrees to radians and vice versa.
float nvgDegToRad(float deg);
float nvgRadToDeg(float rad);
@@ -327,7 +326,7 @@ int nvgCreateImageRGBA(NVGcontext* ctx, int w, int h, int imageFlags, const unsi
// Updates image data specified by image handle.
void nvgUpdateImage(NVGcontext* ctx, int image, const unsigned char* data);
-// Returns the domensions of a created image.
+// Returns the dimensions of a created image.
void nvgImageSize(NVGcontext* ctx, int image, int* w, int* h);
// Deletes created image.
@@ -507,7 +506,7 @@ void nvgTextLetterSpacing(NVGcontext* ctx, float spacing);
// Sets the proportional line height of current text style. The line height is specified as multiple of font size.
void nvgTextLineHeight(NVGcontext* ctx, float lineHeight);
-// Sets the text align of current text style, see NVGaling for options.
+// Sets the text align of current text style, see NVGalign for options.
void nvgTextAlign(NVGcontext* ctx, int align);
// Sets the font face based on specified id of current text style.
@@ -589,7 +588,7 @@ struct NVGparams {
int (*renderDeleteTexture)(void* uptr, int image);
int (*renderUpdateTexture)(void* uptr, int image, int x, int y, int w, int h, const unsigned char* data);
int (*renderGetTextureSize)(void* uptr, int image, int* w, int* h);
- void (*renderViewport)(void* uptr, int width, int height, int surfaceWidth, int surfaceHeight);
+ void (*renderViewport)(void* uptr, int width, int height);
void (*renderCancel)(void* uptr);
void (*renderFlush)(void* uptr);
void (*renderFill)(void* uptr, NVGpaint* paint, NVGscissor* scissor, float fringe, const float* bounds, const NVGpath* paths, int npaths);
@@ -603,7 +602,7 @@ NVGcontext* nvgCreate(int edgeaa, unsigned char viewid);
void nvgViewId(struct NVGcontext* ctx, unsigned char viewid);
void nvgDelete(struct NVGcontext* ctx);
-// Contructor and destructor, called by the render back-end.
+// Constructor and destructor, called by the render back-end.
NVGcontext* nvgCreateInternal(NVGparams* params);
void nvgDeleteInternal(NVGcontext* ctx);
diff --git a/3rdparty/bgfx/examples/common/nanovg/nanovg_bgfx.cpp b/3rdparty/bgfx/examples/common/nanovg/nanovg_bgfx.cpp
index 5891dc546e2..3fd944178d0 100644
--- a/3rdparty/bgfx/examples/common/nanovg/nanovg_bgfx.cpp
+++ b/3rdparty/bgfx/examples/common/nanovg/nanovg_bgfx.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
//
@@ -134,7 +134,6 @@ namespace
struct GLNVGtexture* textures;
float view[2];
- float surface[2];
int ntextures;
int ctextures;
int textureId;
@@ -327,7 +326,7 @@ namespace
, mem
);
- return tex->id.idx;
+ return bgfx::isValid(tex->id) ? tex->id.idx : 0;
}
static int nvgRenderDeleteTexture(void* _userPtr, int image)
@@ -349,7 +348,7 @@ namespace
uint32_t pitch = tex->width * bytesPerPixel;
bgfx::updateTexture2D(tex->id, 0, x, y, w, h
- , bgfx::makeRef(data + y*pitch + x*bytesPerPixel, h*pitch)
+ , bgfx::copy(data + y*pitch + x*bytesPerPixel, h*pitch)
, pitch
);
@@ -523,13 +522,11 @@ namespace
gl->th = handle;
}
- static void nvgRenderViewport(void* _userPtr, int width, int height, int surfaceWidth, int surfaceHeight)
+ static void nvgRenderViewport(void* _userPtr, int width, int height)
{
struct GLNVGcontext* gl = (struct GLNVGcontext*)_userPtr;
gl->view[0] = (float)width;
gl->view[1] = (float)height;
- gl->surface[0] = (float)surfaceWidth;
- gl->surface[1] = (float)surfaceHeight;
bgfx::setViewRect(gl->viewid, 0, 0, width, height);
}
@@ -721,7 +718,7 @@ namespace
);
}
- bgfx::setUniform(gl->u_viewSize, gl->surface);
+ bgfx::setUniform(gl->u_viewSize, gl->view);
for (uint32_t ii = 0, num = gl->ncalls; ii < num; ++ii)
{
diff --git a/3rdparty/bgfx/examples/common/nanovg/vs_nanovg_fill.bin.h b/3rdparty/bgfx/examples/common/nanovg/vs_nanovg_fill.bin.h
index e744417898c..aeac0d14115 100644
--- a/3rdparty/bgfx/examples/common/nanovg/vs_nanovg_fill.bin.h
+++ b/3rdparty/bgfx/examples/common/nanovg/vs_nanovg_fill.bin.h
@@ -35,12 +35,12 @@ static const uint8_t vs_nanovg_fill_glsl[541] =
0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x74, // gl_Position = t
0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // mpvar_1;.}...
};
-static const uint8_t vs_nanovg_fill_dx9[436] =
+static const uint8_t vs_nanovg_fill_dx9[432] =
{
0x56, 0x53, 0x48, 0x04, 0xcf, 0xda, 0x1b, 0x94, 0x02, 0x00, 0x0b, 0x75, 0x5f, 0x68, 0x61, 0x6c, // VSH........u_hal
0x66, 0x54, 0x65, 0x78, 0x65, 0x6c, 0x02, 0x01, 0x01, 0x00, 0x01, 0x00, 0x0a, 0x75, 0x5f, 0x76, // fTexel.......u_v
- 0x69, 0x65, 0x77, 0x53, 0x69, 0x7a, 0x65, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0x84, 0x01, 0x00, // iewSize.........
- 0x03, 0xfe, 0xff, 0xfe, 0xff, 0x2b, 0x00, 0x43, 0x54, 0x41, 0x42, 0x1c, 0x00, 0x00, 0x00, 0x72, // .....+.CTAB....r
+ 0x69, 0x65, 0x77, 0x53, 0x69, 0x7a, 0x65, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0x80, 0x01, 0x00, // iewSize.........
+ 0x03, 0xfe, 0xff, 0xfe, 0xff, 0x2a, 0x00, 0x43, 0x54, 0x41, 0x42, 0x1c, 0x00, 0x00, 0x00, 0x72, // .....*.CTAB....r
0x00, 0x00, 0x00, 0x00, 0x03, 0xfe, 0xff, 0x02, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, // ................
0x91, 0x00, 0x00, 0x6b, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, // ...k...D........
0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x02, // ...P.......`....
@@ -50,21 +50,20 @@ static const uint8_t vs_nanovg_fill_dx9[436] =
0x77, 0x53, 0x69, 0x7a, 0x65, 0x00, 0x76, 0x73, 0x5f, 0x33, 0x5f, 0x30, 0x00, 0x4d, 0x69, 0x63, // wSize.vs_3_0.Mic
0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, // rosoft (R) HLSL
0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, // Shader Compiler
- 0x31, 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x30, 0x30, 0x31, 0x31, 0x2e, 0x31, 0x36, 0x33, 0x38, 0x34, // 10.0.10011.16384
- 0x00, 0xab, 0xab, 0x51, 0x00, 0x00, 0x05, 0x02, 0x00, 0x0f, 0xa0, 0x00, 0x00, 0x80, 0xbf, 0x00, // ...Q............
- 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x02, 0x00, // ..?.............
- 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x80, 0x01, // ................
- 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f, 0xe0, 0x1f, // ................
- 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x80, 0x01, 0x00, 0x03, 0xe0, 0x1f, 0x00, 0x00, 0x02, 0x05, // ................
- 0x00, 0x01, 0x80, 0x02, 0x00, 0x03, 0xe0, 0x02, 0x00, 0x00, 0x03, 0x02, 0x00, 0x03, 0xe0, 0x01, // ................
- 0x00, 0xe4, 0xa0, 0x01, 0x00, 0xe4, 0x90, 0x06, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x80, 0x00, // ................
- 0x00, 0x00, 0xa0, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x06, 0x80, 0x00, 0x00, 0xd0, 0x90, 0x00, // ................
- 0x00, 0xd0, 0x90, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x55, 0x80, 0x00, // .............U..
- 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0xa0, 0x06, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x80, 0x00, // ................
- 0x00, 0x55, 0xa0, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0xe0, 0x00, 0x00, 0xaa, 0x80, 0x00, // .U..............
- 0x00, 0x00, 0x81, 0x02, 0x00, 0x55, 0xa0, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0c, 0xe0, 0x02, // .....U..........
- 0x00, 0x64, 0xa0, 0x01, 0x00, 0x00, 0x02, 0x01, 0x00, 0x03, 0xe0, 0x00, 0x00, 0xe4, 0x90, 0xff, // .d..............
- 0xff, 0x00, 0x00, 0x00, // ....
+ 0x39, 0x2e, 0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, 0x2e, 0x33, 0x31, 0x31, 0x31, 0x00, 0xab, 0x51, // 9.29.952.3111..Q
+ 0x00, 0x00, 0x05, 0x02, 0x00, 0x0f, 0xa0, 0x00, 0x00, 0x80, 0xbf, 0x00, 0x00, 0x80, 0x3f, 0x00, // ..............?.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x00, // ................
+ 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x80, 0x01, 0x00, 0x0f, 0x90, 0x1f, // ................
+ 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f, 0xe0, 0x1f, 0x00, 0x00, 0x02, 0x05, // ................
+ 0x00, 0x00, 0x80, 0x01, 0x00, 0x03, 0xe0, 0x1f, 0x00, 0x00, 0x02, 0x05, 0x00, 0x01, 0x80, 0x02, // ................
+ 0x00, 0x03, 0xe0, 0x02, 0x00, 0x00, 0x03, 0x02, 0x00, 0x03, 0xe0, 0x01, 0x00, 0xe4, 0xa0, 0x01, // ................
+ 0x00, 0xe4, 0x90, 0x06, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0xa0, 0x02, // ................
+ 0x00, 0x00, 0x03, 0x00, 0x00, 0x06, 0x80, 0x00, 0x00, 0xd0, 0x90, 0x00, 0x00, 0xd0, 0x90, 0x04, // ................
+ 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x55, 0x80, 0x00, 0x00, 0x00, 0x80, 0x02, // .........U......
+ 0x00, 0x00, 0xa0, 0x06, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x55, 0xa0, 0x04, // .............U..
+ 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0xe0, 0x00, 0x00, 0xaa, 0x80, 0x00, 0x00, 0x00, 0x81, 0x02, // ................
+ 0x00, 0x55, 0xa0, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0c, 0xe0, 0x02, 0x00, 0x64, 0xa0, 0x01, // .U...........d..
+ 0x00, 0x00, 0x02, 0x01, 0x00, 0x03, 0xe0, 0x00, 0x00, 0xe4, 0x90, 0xff, 0xff, 0x00, 0x00, 0x00, // ................
};
static const uint8_t vs_nanovg_fill_dx11[577] =
{
diff --git a/3rdparty/bgfx/examples/common/packrect.h b/3rdparty/bgfx/examples/common/packrect.h
index d335bee8404..5650ec74f81 100644
--- a/3rdparty/bgfx/examples/common/packrect.h
+++ b/3rdparty/bgfx/examples/common/packrect.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#ifndef RECTPACK_H_HEADER_GUARD
diff --git a/3rdparty/bgfx/examples/common/shaderlib.sh b/3rdparty/bgfx/examples/common/shaderlib.sh
index b8915d16c5a..da7bad784cb 100644
--- a/3rdparty/bgfx/examples/common/shaderlib.sh
+++ b/3rdparty/bgfx/examples/common/shaderlib.sh
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#ifndef __SHADERLIB_SH__
diff --git a/3rdparty/bgfx/examples/makefile b/3rdparty/bgfx/examples/makefile
index 56ad944b750..9e53c42cd5e 100644
--- a/3rdparty/bgfx/examples/makefile
+++ b/3rdparty/bgfx/examples/makefile
@@ -27,6 +27,9 @@ rebuild:
@make -s --no-print-directory rebuild -C 21-deferred
@make -s --no-print-directory rebuild -C 23-vectordisplay
@make -s --no-print-directory rebuild -C 24-nbody
+# @make -s --no-print-directory rebuild -C 25-c99
+# @make -s --no-print-directory rebuild -C 26-occlusion
+ @make -s --no-print-directory rebuild -C 27-terrain
@make -s --no-print-directory rebuild -C common/font
@make -s --no-print-directory rebuild -C common/imgui
@make -s --no-print-directory rebuild -C common/nanovg
@@ -50,3 +53,4 @@ metal:
@make -s --no-print-directory TARGET=5 -C 21-deferred
@make -s --no-print-directory TARGET=5 -C 23-vectordisplay
@make -s --no-print-directory TARGET=5 -C 24-nbody
+ @make -s --no-print-directory TARGET=5 -C 27-terrain
diff --git a/3rdparty/bgfx/examples/runtime/meshes/orb.bin b/3rdparty/bgfx/examples/runtime/meshes/orb.bin
new file mode 100644
index 00000000000..336f3680565
--- /dev/null
+++ b/3rdparty/bgfx/examples/runtime/meshes/orb.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_particle.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_particle.bin
index e9ac1a71c49..0b6b5ca926c 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_particle.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_particle.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_esm.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_esm.bin
index e599c4ec016..91bf18c2ea8 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_esm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_esm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_esm_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_esm_csm.bin
new file mode 100644
index 00000000000..c928ae4e8f1
--- /dev/null
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_esm_csm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_esm_linear.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_esm_linear.bin
index acb5c01247e..c97ca5675b0 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_esm_linear.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_esm_linear.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_esm_linear_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_esm_linear_csm.bin
new file mode 100644
index 00000000000..720d6b8dc55
--- /dev/null
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_esm_linear_csm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_esm_linear_omni.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_esm_linear_omni.bin
index 6c4859be087..9f95aece5c2 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_esm_linear_omni.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_esm_linear_omni.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_esm_omni.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_esm_omni.bin
new file mode 100644
index 00000000000..f925d7d809b
--- /dev/null
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_esm_omni.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_hard.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_hard.bin
index d1612f8ca11..d4834651b14 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_hard.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_hard.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_hard_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_hard_csm.bin
new file mode 100644
index 00000000000..c4eacfeab5f
--- /dev/null
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_hard_csm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_vsm_linear.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_hard_linear.bin
index 5129fdb6b0b..0d561a3cc8c 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_vsm_linear.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_hard_linear.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_hard_linear_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_hard_linear_csm.bin
new file mode 100644
index 00000000000..28db96648ca
--- /dev/null
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_hard_linear_csm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_hard_linear_omni.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_hard_linear_omni.bin
index 03b37762125..871b1ffeeeb 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_hard_linear_omni.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_hard_linear_omni.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_hard_omni.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_hard_omni.bin
index 11f1c23b014..245584b6255 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_hard_omni.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_hard_omni.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_pcf.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_pcf.bin
index 19d9bba4d4a..77396aed05d 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_pcf.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_pcf.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_pcf_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_pcf_csm.bin
new file mode 100644
index 00000000000..1ee9d986f8e
--- /dev/null
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_pcf_csm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_pcf_linear.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_pcf_linear.bin
index 8746b286f44..b45bb02343e 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_pcf_linear.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_pcf_linear.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_pcf_linear_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_pcf_linear_csm.bin
new file mode 100644
index 00000000000..74dbfb1da69
--- /dev/null
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_pcf_linear_csm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_pcf_linear_omni.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_pcf_linear_omni.bin
index 3c72697a9d3..a46422934f3 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_pcf_linear_omni.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_pcf_linear_omni.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_pcf_omni.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_pcf_omni.bin
index 834b235eebe..7f9f9ea632d 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_pcf_omni.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_pcf_omni.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_vsm.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_vsm.bin
new file mode 100644
index 00000000000..546505bb112
--- /dev/null
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_vsm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_vsm_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_vsm_csm.bin
new file mode 100644
index 00000000000..5b77da87cc3
--- /dev/null
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_vsm_csm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_vsm.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_vsm_linear.bin
index 0ae83c419f1..faad3b63666 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_vsm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_vsm_linear.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_vsm_linear_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_vsm_linear_csm.bin
new file mode 100644
index 00000000000..4cdde93ea09
--- /dev/null
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_vsm_linear_csm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_esm_omni.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_vsm_linear_omni.bin
index 95467349adc..99228d720c5 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_esm_omni.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_vsm_linear_omni.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_vsm_linear_omni.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_vsm_omni.bin
index 39d3bff0226..25fddf2151b 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_vsm_linear_omni.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_vsm_omni.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_esm_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_esm_csm.bin
deleted file mode 100644
index c2ac4161f46..00000000000
--- a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_esm_csm.bin
+++ /dev/null
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_esm_linear_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_esm_linear_csm.bin
deleted file mode 100644
index 3430e96d811..00000000000
--- a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_esm_linear_csm.bin
+++ /dev/null
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_hard_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_hard_csm.bin
deleted file mode 100644
index f6b2ac6587d..00000000000
--- a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_hard_csm.bin
+++ /dev/null
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_hard_linear.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_hard_linear.bin
deleted file mode 100644
index 52ac4285db6..00000000000
--- a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_hard_linear.bin
+++ /dev/null
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_hard_linear_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_hard_linear_csm.bin
deleted file mode 100644
index 221a4278dd8..00000000000
--- a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_hard_linear_csm.bin
+++ /dev/null
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_pcf_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_pcf_csm.bin
deleted file mode 100644
index 9581dddcd64..00000000000
--- a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_pcf_csm.bin
+++ /dev/null
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_pcf_linear_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_pcf_linear_csm.bin
deleted file mode 100644
index 9957e3b8588..00000000000
--- a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_pcf_linear_csm.bin
+++ /dev/null
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_vsm_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_vsm_csm.bin
deleted file mode 100644
index 87536cda4d4..00000000000
--- a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_vsm_csm.bin
+++ /dev/null
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_vsm_linear_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_vsm_linear_csm.bin
deleted file mode 100644
index 08a5970da44..00000000000
--- a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_vsm_linear_csm.bin
+++ /dev/null
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_vsm_omni.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_vsm_omni.bin
deleted file mode 100644
index 0991b66851f..00000000000
--- a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_vsm_omni.bin
+++ /dev/null
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowvolume_color_lightning.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowvolume_color_lighting.bin
index 6a27c7300f7..6a27c7300f7 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowvolume_color_lightning.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowvolume_color_lighting.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowvolume_texture_lightning.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowvolume_texture_lighting.bin
index 2bac69eb29e..2bac69eb29e 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowvolume_texture_lightning.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowvolume_texture_lighting.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_sms_mesh.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_sms_mesh.bin
index 4207c645f2f..44fd0cfd999 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_sms_mesh.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_sms_mesh.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_sms_mesh_pd.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_sms_mesh_pd.bin
index 5f675f24a27..071e3a6f3a4 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_sms_mesh_pd.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_sms_mesh_pd.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_stencil_color_lightning.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_stencil_color_lighting.bin
index b7bb1b79867..b7bb1b79867 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_stencil_color_lightning.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_stencil_color_lighting.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_stencil_texture_lightning.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_stencil_texture_lighting.bin
index 05648ed06ea..05648ed06ea 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_stencil_texture_lightning.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_stencil_texture_lighting.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_terrain.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_terrain.bin
new file mode 100644
index 00000000000..a0a7362a6f1
--- /dev/null
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_terrain.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_color_lightning.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_color_lighting.bin
index 9db9b5cf657..9db9b5cf657 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_color_lightning.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_color_lighting.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_color_lightning_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_color_lighting_csm.bin
index fa34dbe5903..fa34dbe5903 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_color_lightning_csm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_color_lighting_csm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_color_lightning_linear.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_color_lighting_linear.bin
index 33294bc60f7..33294bc60f7 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_color_lightning_linear.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_color_lighting_linear.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_color_lightning_linear_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_color_lighting_linear_csm.bin
index 1d1a9cb4336..1d1a9cb4336 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_color_lightning_linear_csm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_color_lighting_linear_csm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_color_lightning_linear_omni.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_color_lighting_linear_omni.bin
index 2f77d700594..2f77d700594 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_color_lightning_linear_omni.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_color_lighting_linear_omni.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_color_lightning_omni.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_color_lighting_omni.bin
index 5f1c27c88c3..5f1c27c88c3 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_color_lightning_omni.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_color_lighting_omni.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_texture_lightning.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_texture_lighting.bin
index aee7ea99961..aee7ea99961 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_texture_lightning.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_texture_lighting.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowvolume_color_lightning.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowvolume_color_lighting.bin
index 22ca9af2f5f..22ca9af2f5f 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowvolume_color_lightning.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowvolume_color_lighting.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowvolume_texture_lightning.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowvolume_texture_lighting.bin
index 643a962a1ce..643a962a1ce 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowvolume_texture_lightning.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowvolume_texture_lighting.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/vs_stencil_color_lightning.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/vs_stencil_color_lighting.bin
index 74709d7dddd..74709d7dddd 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx11/vs_stencil_color_lightning.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx11/vs_stencil_color_lighting.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/vs_stencil_texture_lightning.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/vs_stencil_texture_lighting.bin
index 0503e565ef7..0503e565ef7 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx11/vs_stencil_texture_lightning.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx11/vs_stencil_texture_lighting.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/vs_terrain.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/vs_terrain.bin
new file mode 100644
index 00000000000..2e6d5ee7036
--- /dev/null
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx11/vs_terrain.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/vs_terrain_height_texture.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/vs_terrain_height_texture.bin
new file mode 100644
index 00000000000..46b5c60864e
--- /dev/null
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx11/vs_terrain_height_texture.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_bump.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_bump.bin
index 2cc6dbea34d..a074cd8a3e2 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_bump.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_bump.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_callback.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_callback.bin
index 9dadf5e9261..57876856254 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_callback.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_callback.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_cubes.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_cubes.bin
index 5bfd5497f0b..bdffeb9c076 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_cubes.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_cubes.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_deferred_combine.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_deferred_combine.bin
index fc355b76371..cc13a509ba8 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_deferred_combine.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_deferred_combine.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_deferred_debug.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_deferred_debug.bin
index 33a85bb2955..4cac33773e7 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_deferred_debug.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_deferred_debug.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_deferred_debug_line.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_deferred_debug_line.bin
index 5bfd5497f0b..bdffeb9c076 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_deferred_debug_line.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_deferred_debug_line.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_deferred_geom.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_deferred_geom.bin
index f9f1020c1e6..c8cbf705ea2 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_deferred_geom.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_deferred_geom.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_deferred_light.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_deferred_light.bin
index 78cbbc32f25..5c16613bad5 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_deferred_light.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_deferred_light.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_hdr_blur.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_hdr_blur.bin
index 4d331a3cab1..f426518b036 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_hdr_blur.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_hdr_blur.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_hdr_bright.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_hdr_bright.bin
index 1670d6734f8..38c67736508 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_hdr_bright.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_hdr_bright.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_hdr_lum.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_hdr_lum.bin
index e5ca082614c..f2be253e8b7 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_hdr_lum.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_hdr_lum.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_hdr_lumavg.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_hdr_lumavg.bin
index b73df0e1d7f..0fe106a0adb 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_hdr_lumavg.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_hdr_lumavg.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_hdr_mesh.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_hdr_mesh.bin
index 7553b3acc94..7c2c50723bd 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_hdr_mesh.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_hdr_mesh.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_hdr_skybox.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_hdr_skybox.bin
index d02ad5de9e4..0598ce6cc4f 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_hdr_skybox.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_hdr_skybox.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_hdr_tonemap.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_hdr_tonemap.bin
index 993845cb75b..f9c5bdf5f56 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_hdr_tonemap.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_hdr_tonemap.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_ibl_mesh.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_ibl_mesh.bin
index 3a3ecaba313..873b11cf560 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_ibl_mesh.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_ibl_mesh.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_ibl_skybox.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_ibl_skybox.bin
index 2e49131b0a3..a68ed6cf51d 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_ibl_skybox.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_ibl_skybox.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_instancing.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_instancing.bin
index 5bfd5497f0b..bdffeb9c076 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_instancing.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_instancing.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_mesh.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_mesh.bin
index ac5cc0d0512..09e8453a1d6 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_mesh.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_mesh.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_oit.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_oit.bin
index 05269c3a821..38475da682f 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_oit.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_oit.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_oit_wb.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_oit_wb.bin
index 29c0b1608bd..b041df0bda7 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_oit_wb.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_oit_wb.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_oit_wb_blit.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_oit_wb_blit.bin
index b209ea65d9d..6e7587839de 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_oit_wb_blit.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_oit_wb_blit.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_oit_wb_separate.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_oit_wb_separate.bin
index 4c5d7f1b374..332cd07bc4a 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_oit_wb_separate.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_oit_wb_separate.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_oit_wb_separate_blit.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_oit_wb_separate_blit.bin
index ff4c6e01b17..082338cd294 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_oit_wb_separate_blit.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_oit_wb_separate_blit.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_particle.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_particle.bin
index c20337adffc..c52033f7e3b 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_particle.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_particle.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_raymarching.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_raymarching.bin
index 64a2ea353d2..d3cd94464fb 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_raymarching.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_raymarching.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_black.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_black.bin
index b48ca9a9d75..1759b12105b 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_black.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_black.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_esm.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_esm.bin
index 99f5564ce4d..d0c8760806a 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_esm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_esm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_esm_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_esm_csm.bin
index 420080db2fd..20951048b0c 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_esm_csm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_esm_csm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_esm_linear.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_esm_linear.bin
index 2b80ccad6c3..af417ecab7a 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_esm_linear.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_esm_linear.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_esm_linear_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_esm_linear_csm.bin
index 3bbfea99ae7..4e7732f4fca 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_esm_linear_csm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_esm_linear_csm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_esm_omni.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_esm_linear_omni.bin
index 308f93ef2e3..cf1fc2e04a7 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_esm_omni.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_esm_linear_omni.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_esm_linear_omni.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_esm_omni.bin
index c9d81f6fa64..292a4b08b79 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_esm_linear_omni.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_esm_omni.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_hard.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_hard.bin
index 3de4dcbce87..77938acdc89 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_hard.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_hard.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_hard_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_hard_csm.bin
index c53e8814a34..975f1e5efed 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_hard_csm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_hard_csm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_hard_linear.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_hard_linear.bin
index d29c6e8c1ed..72026a33e4c 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_hard_linear.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_hard_linear.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_hard_linear_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_hard_linear_csm.bin
index ca069354ca4..5617f4386b0 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_hard_linear_csm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_hard_linear_csm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_hard_linear_omni.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_hard_linear_omni.bin
index c316724a908..5cea5e1128a 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_hard_linear_omni.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_hard_linear_omni.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_hard_omni.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_hard_omni.bin
index bef6549d95b..d033bd26429 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_hard_omni.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_hard_omni.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_pcf.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_pcf.bin
index 55bce42f02a..4ed6a979733 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_pcf.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_pcf.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_pcf_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_pcf_csm.bin
index 7427157c5fa..0a87a3d68dc 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_pcf_csm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_pcf_csm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_pcf_linear.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_pcf_linear.bin
index a8c173e3c39..c5c2fe28bd4 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_pcf_linear.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_pcf_linear.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_pcf_linear_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_pcf_linear_csm.bin
index 984458101ee..695b9378a8d 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_pcf_linear_csm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_pcf_linear_csm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_pcf_linear_omni.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_pcf_linear_omni.bin
new file mode 100644
index 00000000000..c226b1e4713
--- /dev/null
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_pcf_linear_omni.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_pcf_omni.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_pcf_omni.bin
index bf00e8523f3..cdc2cf41abb 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_pcf_omni.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_pcf_omni.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_vsm.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_vsm.bin
index ac96c99da43..d969966ce64 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_vsm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_vsm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_vsm_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_vsm_csm.bin
index 0e69a3950ac..9ef4d3962f9 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_vsm_csm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_vsm_csm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_vsm_linear.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_vsm_linear.bin
index a1ce662b545..87e13f45af2 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_vsm_linear.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_vsm_linear.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_vsm_linear_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_vsm_linear_csm.bin
index 80befb85a01..aeaa4e73b9e 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_vsm_linear_csm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_vsm_linear_csm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_vsm_linear_omni.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_vsm_linear_omni.bin
new file mode 100644
index 00000000000..8866fbbb2d6
--- /dev/null
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_vsm_linear_omni.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_vsm_omni.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_vsm_omni.bin
new file mode 100644
index 00000000000..bb19f6244d2
--- /dev/null
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_vsm_omni.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_pcf_linear_omni.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_pcf_linear_omni.bin
deleted file mode 100644
index e96824aae10..00000000000
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_pcf_linear_omni.bin
+++ /dev/null
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_vsm_linear_omni.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_vsm_linear_omni.bin
deleted file mode 100644
index f0bdfd66f7b..00000000000
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_vsm_linear_omni.bin
+++ /dev/null
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_vsm_omni.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_vsm_omni.bin
deleted file mode 100644
index 856c659ffe6..00000000000
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_vsm_omni.bin
+++ /dev/null
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_texture.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_texture.bin
index 769c938165e..3b34c1191f9 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_texture.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_texture.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_hblur.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_hblur.bin
index 35f6b45a29d..e9210b80d52 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_hblur.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_hblur.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_hblur_vsm.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_hblur_vsm.bin
index 4a9dd81714e..8eeb1b3e105 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_hblur_vsm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_hblur_vsm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_packdepth.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_packdepth.bin
index 605ede3bb29..4a693345ca4 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_packdepth.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_packdepth.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_packdepth_linear.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_packdepth_linear.bin
index e73a81647e3..1c98ebebaa9 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_packdepth_linear.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_packdepth_linear.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_packdepth_vsm.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_packdepth_vsm.bin
index 227ada1b7b9..f146f09bfc0 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_packdepth_vsm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_packdepth_vsm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_packdepth_vsm_linear.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_packdepth_vsm_linear.bin
index a83254c5e89..89745b960ce 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_packdepth_vsm_linear.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_packdepth_vsm_linear.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_texture.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_texture.bin
index 33a85bb2955..4cac33773e7 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_texture.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_texture.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_unpackdepth.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_unpackdepth.bin
index 6fa413cd90c..b4f15210552 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_unpackdepth.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_unpackdepth.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_unpackdepth_vsm.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_unpackdepth_vsm.bin
index 23cba5789f1..f2b3c657c04 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_unpackdepth_vsm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_unpackdepth_vsm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_vblur.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_vblur.bin
index 35f6b45a29d..e9210b80d52 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_vblur.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_vblur.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_vblur_vsm.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_vblur_vsm.bin
index 4a9dd81714e..8eeb1b3e105 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_vblur_vsm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_vblur_vsm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_color_lightning.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_color_lighting.bin
index 3502c300df9..d2b3c50f5ec 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_color_lightning.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_color_lighting.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_color_texture.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_color_texture.bin
index 769c938165e..3b34c1191f9 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_color_texture.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_color_texture.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svbackblank.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svbackblank.bin
index 7528dcbf854..f35fe6e1dfd 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svbackblank.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svbackblank.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svbackcolor.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svbackcolor.bin
index e240cc56e5f..57089f27fe2 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svbackcolor.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svbackcolor.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svbacktex1.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svbacktex1.bin
index 19ca642da9a..49110e0ed14 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svbacktex1.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svbacktex1.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svbacktex2.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svbacktex2.bin
index e4fa04e2975..7752be6658d 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svbacktex2.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svbacktex2.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svfrontblank.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svfrontblank.bin
index a3163370c84..b201b42a274 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svfrontblank.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svfrontblank.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svfrontcolor.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svfrontcolor.bin
index e240cc56e5f..57089f27fe2 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svfrontcolor.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svfrontcolor.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svfronttex1.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svfronttex1.bin
index 19ca642da9a..49110e0ed14 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svfronttex1.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svfronttex1.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svfronttex2.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svfronttex2.bin
index e4fa04e2975..7752be6658d 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svfronttex2.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svfronttex2.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svside.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svside.bin
index 29eab256097..4ba5d987404 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svside.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svside.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svsideblank.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svsideblank.bin
index 3b5a8f31a62..95a432fd6e7 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svsideblank.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svsideblank.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svsidecolor.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svsidecolor.bin
index 40f240d9f77..6e349468748 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svsidecolor.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svsidecolor.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svsidetex.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svsidetex.bin
index fe9b49ff047..a299cf2199c 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svsidetex.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svsidetex.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_texture.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_texture.bin
index 33a85bb2955..4cac33773e7 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_texture.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_texture.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_texture_lighting.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_texture_lighting.bin
new file mode 100644
index 00000000000..216041c92be
--- /dev/null
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_texture_lighting.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_texture_lightning.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_texture_lightning.bin
deleted file mode 100644
index 1c09e0732be..00000000000
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_texture_lightning.bin
+++ /dev/null
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_sms_mesh.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_sms_mesh.bin
index c5373130f6f..4ea4fa1d0b6 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_sms_mesh.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_sms_mesh.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_sms_mesh_pd.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_sms_mesh_pd.bin
index e244ed7a481..764e661c6e9 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_sms_mesh_pd.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_sms_mesh_pd.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_sms_shadow.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_sms_shadow.bin
index b48ca9a9d75..1759b12105b 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_sms_shadow.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_sms_shadow.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_sms_shadow_pd.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_sms_shadow_pd.bin
index d4454c07a1f..5c8c5a455f5 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_sms_shadow_pd.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_sms_shadow_pd.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_stencil_color_black.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_stencil_color_black.bin
index b48ca9a9d75..1759b12105b 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_stencil_color_black.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_stencil_color_black.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_stencil_color_lightning.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_stencil_color_lighting.bin
index c11e9833063..812a7288250 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_stencil_color_lightning.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_stencil_color_lighting.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_stencil_color_texture.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_stencil_color_texture.bin
index 769c938165e..3b34c1191f9 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_stencil_color_texture.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_stencil_color_texture.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_stencil_texture.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_stencil_texture.bin
index 33a85bb2955..4cac33773e7 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_stencil_texture.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_stencil_texture.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_stencil_texture_lightning.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_stencil_texture_lighting.bin
index c2d78611cd0..00b56862be3 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_stencil_texture_lightning.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_stencil_texture_lighting.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_terrain.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_terrain.bin
new file mode 100644
index 00000000000..ac718f0e1c5
--- /dev/null
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_terrain.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_tree.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_tree.bin
index f2e470f0574..a40cefb711a 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_tree.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_tree.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_update.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_update.bin
index c67c50a41d1..9b583ab3ef4 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_update.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_update.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_update_3d.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_update_3d.bin
index d489147527a..abc86d23a09 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_update_3d.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_update_3d.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_update_cmp.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_update_cmp.bin
index 77ee54087de..97e41b8eee1 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_update_cmp.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_update_cmp.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_vectordisplay_blit.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_vectordisplay_blit.bin
index 2ca54ab6730..8793fcf84de 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_vectordisplay_blit.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_vectordisplay_blit.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_vectordisplay_blur.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_vectordisplay_blur.bin
index f6316a80f0e..905e8dd5d7a 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_vectordisplay_blur.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_vectordisplay_blur.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_vectordisplay_fb.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_vectordisplay_fb.bin
index c3e8cd2f156..8b22edabe2b 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_vectordisplay_fb.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_vectordisplay_fb.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_bump.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_bump.bin
index 4c80f4cad6d..ae10af6fa40 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_bump.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_bump.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_bump_instanced.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_bump_instanced.bin
index fc28518a841..19f743864cb 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_bump_instanced.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_bump_instanced.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_callback.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_callback.bin
index 91c7a717fe5..5b24007c6dc 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_callback.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_callback.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_cubes.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_cubes.bin
index fcfb16e0d0d..6bed4a49eb9 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_cubes.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_cubes.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_deferred_combine.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_deferred_combine.bin
index fe8592c138d..a299604962c 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_deferred_combine.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_deferred_combine.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_deferred_debug.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_deferred_debug.bin
index fe8592c138d..a299604962c 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_deferred_debug.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_deferred_debug.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_deferred_debug_line.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_deferred_debug_line.bin
index fcfb16e0d0d..6bed4a49eb9 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_deferred_debug_line.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_deferred_debug_line.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_deferred_geom.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_deferred_geom.bin
index 4c80f4cad6d..ae10af6fa40 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_deferred_geom.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_deferred_geom.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_deferred_light.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_deferred_light.bin
index fe8592c138d..a299604962c 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_deferred_light.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_deferred_light.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_hdr_blur.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_hdr_blur.bin
index db3143a6259..aafc58d61d7 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_hdr_blur.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_hdr_blur.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_hdr_bright.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_hdr_bright.bin
index fe8592c138d..a299604962c 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_hdr_bright.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_hdr_bright.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_hdr_lum.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_hdr_lum.bin
index fe8592c138d..a299604962c 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_hdr_lum.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_hdr_lum.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_hdr_lumavg.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_hdr_lumavg.bin
index fe8592c138d..a299604962c 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_hdr_lumavg.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_hdr_lumavg.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_hdr_mesh.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_hdr_mesh.bin
index 7bafd238112..f8a154140aa 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_hdr_mesh.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_hdr_mesh.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_hdr_skybox.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_hdr_skybox.bin
index fe8592c138d..a299604962c 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_hdr_skybox.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_hdr_skybox.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_hdr_tonemap.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_hdr_tonemap.bin
index 56f1ecb2e44..c1734e3e3fc 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_hdr_tonemap.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_hdr_tonemap.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_ibl_mesh.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_ibl_mesh.bin
index 4218e8ab377..a4e8c3d11e9 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_ibl_mesh.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_ibl_mesh.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_ibl_skybox.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_ibl_skybox.bin
index c0e84000a3a..92fb53dd59b 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_ibl_skybox.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_ibl_skybox.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_instancing.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_instancing.bin
index 1334941f88a..9cc463534d9 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_instancing.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_instancing.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_mesh.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_mesh.bin
index 242f27e7b1f..62f5bd31dae 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_mesh.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_mesh.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_oit.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_oit.bin
index 9f612d35860..0bd10c7a53f 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_oit.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_oit.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_oit_blit.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_oit_blit.bin
index fe8592c138d..a299604962c 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_oit_blit.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_oit_blit.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_particle.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_particle.bin
index d727140eef3..fa1d3b9a442 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_particle.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_particle.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_raymarching.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_raymarching.bin
index 9db127f1b78..63ec02a3531 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_raymarching.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_raymarching.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color.bin
index 63a27d6a014..4550c08d137 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color_lighting.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color_lighting.bin
new file mode 100644
index 00000000000..93a692801b5
--- /dev/null
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color_lighting.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color_lightning_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color_lighting_csm.bin
index 5b190835b30..6b819879e75 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color_lightning_csm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color_lighting_csm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color_lighting_linear.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color_lighting_linear.bin
new file mode 100644
index 00000000000..3bc8a261ee5
--- /dev/null
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color_lighting_linear.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color_lightning_linear_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color_lighting_linear_csm.bin
index 3fe61829886..9e7c86f7bb1 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color_lightning_linear_csm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color_lighting_linear_csm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color_lightning_linear_omni.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color_lighting_linear_omni.bin
index fb516014651..2c6c09c36c8 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color_lightning_linear_omni.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color_lighting_linear_omni.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color_lightning_omni.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color_lighting_omni.bin
index 37de03aa63e..7a0105a308d 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color_lightning_omni.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color_lighting_omni.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color_lightning.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color_lightning.bin
deleted file mode 100644
index afd241b6c2e..00000000000
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color_lightning.bin
+++ /dev/null
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color_lightning_linear.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color_lightning_linear.bin
deleted file mode 100644
index 4953a46cb26..00000000000
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color_lightning_linear.bin
+++ /dev/null
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color_texture.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color_texture.bin
index fe8592c138d..a299604962c 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color_texture.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color_texture.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_depth.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_depth.bin
index 63a27d6a014..4550c08d137 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_depth.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_depth.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_hblur.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_hblur.bin
index 056267dd34d..17606423b6c 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_hblur.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_hblur.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_packdepth.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_packdepth.bin
index 46332ef6918..3e5827745c0 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_packdepth.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_packdepth.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_packdepth_linear.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_packdepth_linear.bin
index 0d28593e06a..329980ae388 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_packdepth_linear.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_packdepth_linear.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_texture.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_texture.bin
index fe8592c138d..a299604962c 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_texture.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_texture.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_texture_lighting.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_texture_lighting.bin
new file mode 100644
index 00000000000..a04a6320173
--- /dev/null
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_texture_lighting.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_texture_lightning.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_texture_lightning.bin
deleted file mode 100644
index 96799c4e15d..00000000000
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_texture_lightning.bin
+++ /dev/null
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_unpackdepth.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_unpackdepth.bin
index fe8592c138d..a299604962c 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_unpackdepth.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_unpackdepth.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_vblur.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_vblur.bin
index c2695fe4a16..347b4ed021b 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_vblur.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_vblur.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowvolume_color_lighting.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowvolume_color_lighting.bin
new file mode 100644
index 00000000000..f948ab9105f
--- /dev/null
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowvolume_color_lighting.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowvolume_color_lightning.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowvolume_color_lightning.bin
deleted file mode 100644
index 305be162e1d..00000000000
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowvolume_color_lightning.bin
+++ /dev/null
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowvolume_color_texture.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowvolume_color_texture.bin
index fe8592c138d..a299604962c 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowvolume_color_texture.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowvolume_color_texture.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowvolume_svback.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowvolume_svback.bin
index 5875aa635d7..ff9efe36483 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowvolume_svback.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowvolume_svback.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowvolume_svfront.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowvolume_svfront.bin
index 63a27d6a014..4550c08d137 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowvolume_svfront.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowvolume_svfront.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowvolume_svside.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowvolume_svside.bin
index 2b3dd0ebae0..7571a1e53fa 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowvolume_svside.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowvolume_svside.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowvolume_texture.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowvolume_texture.bin
index fe8592c138d..a299604962c 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowvolume_texture.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowvolume_texture.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowvolume_texture_lighting.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowvolume_texture_lighting.bin
new file mode 100644
index 00000000000..e632b911c39
--- /dev/null
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowvolume_texture_lighting.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowvolume_texture_lightning.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowvolume_texture_lightning.bin
deleted file mode 100644
index c97d58d5a67..00000000000
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowvolume_texture_lightning.bin
+++ /dev/null
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_sms_mesh.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_sms_mesh.bin
index d33c32f16d0..f5b0d896104 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_sms_mesh.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_sms_mesh.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_sms_shadow.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_sms_shadow.bin
index 63a27d6a014..4550c08d137 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_sms_shadow.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_sms_shadow.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_sms_shadow_pd.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_sms_shadow_pd.bin
index 94b26f0a41d..3bd185477f5 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_sms_shadow_pd.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_sms_shadow_pd.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_stencil_color.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_stencil_color.bin
index 63a27d6a014..4550c08d137 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_stencil_color.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_stencil_color.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_stencil_color_lighting.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_stencil_color_lighting.bin
new file mode 100644
index 00000000000..bedf096177e
--- /dev/null
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_stencil_color_lighting.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_stencil_color_lightning.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_stencil_color_lightning.bin
deleted file mode 100644
index 0c0fe9fffee..00000000000
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_stencil_color_lightning.bin
+++ /dev/null
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_stencil_color_texture.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_stencil_color_texture.bin
index fe8592c138d..a299604962c 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_stencil_color_texture.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_stencil_color_texture.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_stencil_texture.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_stencil_texture.bin
index fe8592c138d..a299604962c 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_stencil_texture.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_stencil_texture.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_stencil_texture_lighting.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_stencil_texture_lighting.bin
new file mode 100644
index 00000000000..7257af2e87f
--- /dev/null
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_stencil_texture_lighting.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_stencil_texture_lightning.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_stencil_texture_lightning.bin
deleted file mode 100644
index fcdfc2e180c..00000000000
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_stencil_texture_lightning.bin
+++ /dev/null
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_terrain.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_terrain.bin
new file mode 100644
index 00000000000..7562851f4a5
--- /dev/null
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_terrain.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_terrain_height_texture.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_terrain_height_texture.bin
new file mode 100644
index 00000000000..db7de7ad399
--- /dev/null
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_terrain_height_texture.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_tree.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_tree.bin
index 71f4167608c..9e69b0bb4a4 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_tree.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_tree.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_update.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_update.bin
index 155eea03f6c..1c043f0ad5c 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_update.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_update.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_vectordisplay_fb.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_vectordisplay_fb.bin
index 9db127f1b78..63ec02a3531 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_vectordisplay_fb.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/dx9/vs_vectordisplay_fb.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_oit_wb.bin b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_oit_wb.bin
index df53debb5b1..e594526cf19 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_oit_wb.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_oit_wb.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_oit_wb_separate.bin b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_oit_wb_separate.bin
index 2ae88a47fff..51ae8f2dbaf 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_oit_wb_separate.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_oit_wb_separate.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_esm.bin b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_esm.bin
index 700694d399e..72ed5111aee 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_esm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_esm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_esm_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_esm_csm.bin
index 525a27cdd51..7c77f0cbbfe 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_esm_csm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_esm_csm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_esm_linear.bin b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_esm_linear.bin
index 04c38666671..789141dcccc 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_esm_linear.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_esm_linear.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_esm_linear_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_esm_linear_csm.bin
index 27d8231f863..3c1d07e15f6 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_esm_linear_csm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_esm_linear_csm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_esm_linear_omni.bin b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_esm_linear_omni.bin
index 4ca43066c34..1503d413ab3 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_esm_linear_omni.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_esm_linear_omni.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_esm_omni.bin b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_esm_omni.bin
index 4b3fea74139..f79e214b2da 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_esm_omni.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_esm_omni.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_hard.bin b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_hard.bin
index 7c5095f0e29..c6f6593ea1e 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_hard.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_hard.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_hard_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_hard_csm.bin
index b77c2c824c4..74c0c1cf2a9 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_hard_csm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_hard_csm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_hard_linear.bin b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_hard_linear.bin
index 3988caee216..c0e05951bdd 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_hard_linear.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_hard_linear.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_hard_linear_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_hard_linear_csm.bin
index 9a8ae99224e..19062f01b8c 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_hard_linear_csm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_hard_linear_csm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_hard_linear_omni.bin b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_hard_linear_omni.bin
index 1965c493afa..6187725d9f2 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_hard_linear_omni.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_hard_linear_omni.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_hard_omni.bin b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_hard_omni.bin
index 31b8e22ba35..133e398538c 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_hard_omni.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_hard_omni.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_pcf.bin b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_pcf.bin
index c867113fd8c..422bf35ec8e 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_pcf.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_pcf.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_pcf_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_pcf_csm.bin
index c78a27741db..9f78cbeee15 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_pcf_csm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_pcf_csm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_pcf_linear.bin b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_pcf_linear.bin
index 85cebb56f07..5ee79f73a28 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_pcf_linear.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_pcf_linear.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_pcf_linear_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_pcf_linear_csm.bin
index 93c5b80ef33..4bb6fa06e51 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_pcf_linear_csm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_pcf_linear_csm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_pcf_linear_omni.bin b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_pcf_linear_omni.bin
index 4769169ac7f..d0be094575a 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_pcf_linear_omni.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_pcf_linear_omni.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_pcf_omni.bin b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_pcf_omni.bin
index 18a43e1ea27..44a131f69ad 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_pcf_omni.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_pcf_omni.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_vsm.bin b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_vsm.bin
index f42d12496d6..ccababe2e1b 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_vsm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_vsm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_vsm_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_vsm_csm.bin
index 50e5c4f14cb..74ff8b8dd26 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_vsm_csm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_vsm_csm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_vsm_linear.bin b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_vsm_linear.bin
index 3e96ec50a4c..754e424ea12 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_vsm_linear.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_vsm_linear.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_vsm_linear_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_vsm_linear_csm.bin
index df85bd9510c..53f2ea31f22 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_vsm_linear_csm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_vsm_linear_csm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_vsm_linear_omni.bin b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_vsm_linear_omni.bin
index 2d63ad15e45..0b0a1bbbf16 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_vsm_linear_omni.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_vsm_linear_omni.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_vsm_omni.bin b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_vsm_omni.bin
index 772ec28f6ed..ad331bd4ffd 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_vsm_omni.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_color_lighting_vsm_omni.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_hblur.bin b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_hblur.bin
index d8509532b15..c50ce9cc452 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_hblur.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_hblur.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_packdepth.bin b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_packdepth.bin
index 3997cd62a98..d6bdeb0b6c9 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_packdepth.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_packdepth.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_packdepth_linear.bin b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_packdepth_linear.bin
index a366ac46963..c1c6b516290 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_packdepth_linear.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_packdepth_linear.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_unpackdepth.bin b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_unpackdepth.bin
index 0fd472eda28..db9d665275d 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_unpackdepth.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_unpackdepth.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_vblur.bin b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_vblur.bin
index d8509532b15..c50ce9cc452 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_vblur.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowmaps_vblur.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowvolume_color_lightning.bin b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowvolume_color_lighting.bin
index a96ffde0b40..a96ffde0b40 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowvolume_color_lightning.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowvolume_color_lighting.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowvolume_texture_lightning.bin b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowvolume_texture_lighting.bin
index 5e59912aba7..5e59912aba7 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowvolume_texture_lightning.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_shadowvolume_texture_lighting.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_sms_mesh_pd.bin b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_sms_mesh_pd.bin
index 5844d74493e..227b76c4fa2 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_sms_mesh_pd.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_sms_mesh_pd.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_sms_shadow_pd.bin b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_sms_shadow_pd.bin
index 3997cd62a98..d6bdeb0b6c9 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_sms_shadow_pd.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_sms_shadow_pd.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_stencil_color_lightning.bin b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_stencil_color_lighting.bin
index 776c24867fd..776c24867fd 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_stencil_color_lightning.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_stencil_color_lighting.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_stencil_texture_lightning.bin b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_stencil_texture_lighting.bin
index 3ceba55ea2f..3ceba55ea2f 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_stencil_texture_lightning.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_stencil_texture_lighting.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_terrain.bin b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_terrain.bin
new file mode 100644
index 00000000000..4a73d9a9985
--- /dev/null
+++ b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_terrain.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/gles/vs_shadowmaps_color_lightning.bin b/3rdparty/bgfx/examples/runtime/shaders/gles/vs_shadowmaps_color_lighting.bin
index f94a6d8164a..f94a6d8164a 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/gles/vs_shadowmaps_color_lightning.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/gles/vs_shadowmaps_color_lighting.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/gles/vs_shadowmaps_color_lightning_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/gles/vs_shadowmaps_color_lighting_csm.bin
index 2b37ce8c997..2b37ce8c997 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/gles/vs_shadowmaps_color_lightning_csm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/gles/vs_shadowmaps_color_lighting_csm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/gles/vs_shadowmaps_color_lightning_linear.bin b/3rdparty/bgfx/examples/runtime/shaders/gles/vs_shadowmaps_color_lighting_linear.bin
index 72c9d7f909f..72c9d7f909f 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/gles/vs_shadowmaps_color_lightning_linear.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/gles/vs_shadowmaps_color_lighting_linear.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/gles/vs_shadowmaps_color_lightning_linear_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/gles/vs_shadowmaps_color_lighting_linear_csm.bin
index 203531db55f..203531db55f 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/gles/vs_shadowmaps_color_lightning_linear_csm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/gles/vs_shadowmaps_color_lighting_linear_csm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/gles/vs_shadowmaps_color_lightning_linear_omni.bin b/3rdparty/bgfx/examples/runtime/shaders/gles/vs_shadowmaps_color_lighting_linear_omni.bin
index 9a969e29c97..9a969e29c97 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/gles/vs_shadowmaps_color_lightning_linear_omni.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/gles/vs_shadowmaps_color_lighting_linear_omni.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/gles/vs_shadowmaps_color_lightning_omni.bin b/3rdparty/bgfx/examples/runtime/shaders/gles/vs_shadowmaps_color_lighting_omni.bin
index 7dc9beebe9e..7dc9beebe9e 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/gles/vs_shadowmaps_color_lightning_omni.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/gles/vs_shadowmaps_color_lighting_omni.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/gles/vs_shadowmaps_texture_lightning.bin b/3rdparty/bgfx/examples/runtime/shaders/gles/vs_shadowmaps_texture_lighting.bin
index b79e5f767a5..b79e5f767a5 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/gles/vs_shadowmaps_texture_lightning.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/gles/vs_shadowmaps_texture_lighting.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/gles/vs_shadowvolume_color_lightning.bin b/3rdparty/bgfx/examples/runtime/shaders/gles/vs_shadowvolume_color_lighting.bin
index 9e99653dd37..9e99653dd37 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/gles/vs_shadowvolume_color_lightning.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/gles/vs_shadowvolume_color_lighting.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/gles/vs_shadowvolume_texture_lightning.bin b/3rdparty/bgfx/examples/runtime/shaders/gles/vs_shadowvolume_texture_lighting.bin
index b79e5f767a5..b79e5f767a5 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/gles/vs_shadowvolume_texture_lightning.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/gles/vs_shadowvolume_texture_lighting.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/gles/vs_stencil_color_lightning.bin b/3rdparty/bgfx/examples/runtime/shaders/gles/vs_stencil_color_lighting.bin
index 9e99653dd37..9e99653dd37 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/gles/vs_stencil_color_lightning.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/gles/vs_stencil_color_lighting.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/gles/vs_stencil_texture_lightning.bin b/3rdparty/bgfx/examples/runtime/shaders/gles/vs_stencil_texture_lighting.bin
index b79e5f767a5..b79e5f767a5 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/gles/vs_stencil_texture_lightning.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/gles/vs_stencil_texture_lighting.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/gles/vs_terrain.bin b/3rdparty/bgfx/examples/runtime/shaders/gles/vs_terrain.bin
new file mode 100644
index 00000000000..4376fd3aecf
--- /dev/null
+++ b/3rdparty/bgfx/examples/runtime/shaders/gles/vs_terrain.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/gles/vs_terrain_height_texture.bin b/3rdparty/bgfx/examples/runtime/shaders/gles/vs_terrain_height_texture.bin
new file mode 100644
index 00000000000..2d84f6c487b
--- /dev/null
+++ b/3rdparty/bgfx/examples/runtime/shaders/gles/vs_terrain_height_texture.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_oit_wb.bin b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_oit_wb.bin
index 1bfc2361d5c..32f69e5aed2 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_oit_wb.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_oit_wb.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_oit_wb_separate.bin b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_oit_wb_separate.bin
index f8ae5bc9b81..d77b34792fa 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_oit_wb_separate.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_oit_wb_separate.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning.bin b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting.bin
index 59c31058dd1..59c31058dd1 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_esm.bin b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_esm.bin
index f5a580f1289..4f66a07bb0f 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_esm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_esm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_esm_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_esm_csm.bin
index 1e7a4d25acd..7249ac3fc01 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_esm_csm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_esm_csm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_esm_linear.bin b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_esm_linear.bin
index 3c41f4ed3f7..57a0637840f 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_esm_linear.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_esm_linear.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_esm_linear_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_esm_linear_csm.bin
index b930d047c81..daa9d7bc412 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_esm_linear_csm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_esm_linear_csm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_esm_linear_omni.bin b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_esm_linear_omni.bin
index 5b5e123eaec..5213127e2b3 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_esm_linear_omni.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_esm_linear_omni.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_esm_omni.bin b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_esm_omni.bin
index 9e5441e5839..0728fd38ac9 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_esm_omni.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_esm_omni.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_hard.bin b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_hard.bin
index 62a4fab7411..40a6fe35f34 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_hard.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_hard.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_hard_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_hard_csm.bin
index 7ae79a1339c..27694944113 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_hard_csm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_hard_csm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_hard_linear.bin b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_hard_linear.bin
index 52a0b821316..68de56248ff 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_hard_linear.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_hard_linear.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_hard_linear_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_hard_linear_csm.bin
index 08808de87a7..e9d07c376e4 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_hard_linear_csm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_hard_linear_csm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_hard_linear_omni.bin b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_hard_linear_omni.bin
index 3218ab5f3cc..eceb44fdf0f 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_hard_linear_omni.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_hard_linear_omni.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_hard_omni.bin b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_hard_omni.bin
index 0f8e094c7e9..d7893ba4369 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_hard_omni.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_hard_omni.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_omni.bin b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_omni.bin
index e7e5a789d92..e7e5a789d92 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_omni.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_omni.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_pcf.bin b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_pcf.bin
index 797ec0bcdbe..3638832c180 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_pcf.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_pcf.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_pcf_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_pcf_csm.bin
index c649bf07a24..957f309bc5e 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_pcf_csm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_pcf_csm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_pcf_linear.bin b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_pcf_linear.bin
index 5f0c1c7c365..03143cba754 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_pcf_linear.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_pcf_linear.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_pcf_linear_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_pcf_linear_csm.bin
index 5b07162b001..202b3b76236 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_pcf_linear_csm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_pcf_linear_csm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_pcf_linear_omni.bin b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_pcf_linear_omni.bin
index 34d5c091ce2..492e6e805b1 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_pcf_linear_omni.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_pcf_linear_omni.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_pcf_omni.bin b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_pcf_omni.bin
index 53f13abd5c8..81ea89086ae 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_pcf_omni.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_pcf_omni.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_pfc.bin b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_pfc.bin
index e23f13ea467..e23f13ea467 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_pfc.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_pfc.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_vsm.bin b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_vsm.bin
index 3ba96599cd4..46a9e14444f 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_vsm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_vsm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_vsm_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_vsm_csm.bin
index d1d4d641bdb..5af575e1be6 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_vsm_csm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_vsm_csm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_vsm_linear.bin b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_vsm_linear.bin
index 5b675445db3..17290531064 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_vsm_linear.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_vsm_linear.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_vsm_linear_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_vsm_linear_csm.bin
index cbcecf1feb4..79058cad0d7 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_vsm_linear_csm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_vsm_linear_csm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_vsm_linear_omni.bin b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_vsm_linear_omni.bin
index a2aeda4ead7..5915c930f4e 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_vsm_linear_omni.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_vsm_linear_omni.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_vsm_omni.bin b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_vsm_omni.bin
index fd9d3902609..93b5a2a0bb2 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_vsm_omni.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_vsm_omni.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_hblur.bin b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_hblur.bin
index f1180dceb51..f8fa7a5d8b6 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_hblur.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_hblur.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_packdepth.bin b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_packdepth.bin
index 960eba1e085..6148b430945 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_packdepth.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_packdepth.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_packdepth_linear.bin b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_packdepth_linear.bin
index a592392cdd6..d59593b94a3 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_packdepth_linear.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_packdepth_linear.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_unpackdepth.bin b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_unpackdepth.bin
index acda8d5f64f..6602f5e43e0 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_unpackdepth.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_unpackdepth.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_vblur.bin b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_vblur.bin
index f1180dceb51..f8fa7a5d8b6 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_vblur.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_vblur.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowvolume_color_lightning.bin b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowvolume_color_lighting.bin
index 1dd99786c68..1dd99786c68 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowvolume_color_lightning.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowvolume_color_lighting.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowvolume_texture_lightning.bin b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowvolume_texture_lighting.bin
index 4d517df717d..4d517df717d 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowvolume_texture_lightning.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowvolume_texture_lighting.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_sms_mesh_pd.bin b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_sms_mesh_pd.bin
index a036a3a6254..8e0fb26cd2b 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_sms_mesh_pd.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_sms_mesh_pd.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_sms_shadow_pd.bin b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_sms_shadow_pd.bin
index 960eba1e085..6148b430945 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_sms_shadow_pd.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_sms_shadow_pd.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_stencil_color_lightning.bin b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_stencil_color_lighting.bin
index 4135af924d1..4135af924d1 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_stencil_color_lightning.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_stencil_color_lighting.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_stencil_texture_lightning.bin b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_stencil_texture_lighting.bin
index aa333ccb02c..aa333ccb02c 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_stencil_texture_lightning.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_stencil_texture_lighting.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_terrain.bin b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_terrain.bin
new file mode 100644
index 00000000000..ca6d2b57c90
--- /dev/null
+++ b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_terrain.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_color_lightning.bin b/3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_color_lighting.bin
index 22a1174e4fd..22a1174e4fd 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_color_lightning.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_color_lighting.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_color_lightning_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_color_lighting_csm.bin
index 88275faa666..88275faa666 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_color_lightning_csm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_color_lighting_csm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_color_lightning_linear.bin b/3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_color_lighting_linear.bin
index 9be46ed63a3..9be46ed63a3 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_color_lightning_linear.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_color_lighting_linear.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_color_lightning_linear_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_color_lighting_linear_csm.bin
index f7dd09c0b22..f7dd09c0b22 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_color_lightning_linear_csm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_color_lighting_linear_csm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_color_lightning_linear_omni.bin b/3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_color_lighting_linear_omni.bin
index ab2b5f800da..ab2b5f800da 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_color_lightning_linear_omni.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_color_lighting_linear_omni.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_color_lightning_omni.bin b/3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_color_lighting_omni.bin
index 791d2d8f7a8..791d2d8f7a8 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_color_lightning_omni.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_color_lighting_omni.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_texture_lightning.bin b/3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_texture_lighting.bin
index aa79e920ad2..aa79e920ad2 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_texture_lightning.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_texture_lighting.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowvolume_color_lightning.bin b/3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowvolume_color_lighting.bin
index 851bba285e4..851bba285e4 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowvolume_color_lightning.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowvolume_color_lighting.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowvolume_texture_lightning.bin b/3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowvolume_texture_lighting.bin
index aa79e920ad2..aa79e920ad2 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowvolume_texture_lightning.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowvolume_texture_lighting.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/glsl/vs_stencil_color_lightning.bin b/3rdparty/bgfx/examples/runtime/shaders/glsl/vs_stencil_color_lighting.bin
index 851bba285e4..851bba285e4 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/glsl/vs_stencil_color_lightning.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/glsl/vs_stencil_color_lighting.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/glsl/vs_stencil_texture_lightning.bin b/3rdparty/bgfx/examples/runtime/shaders/glsl/vs_stencil_texture_lighting.bin
index aa79e920ad2..aa79e920ad2 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/glsl/vs_stencil_texture_lightning.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/glsl/vs_stencil_texture_lighting.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/glsl/vs_terrain.bin b/3rdparty/bgfx/examples/runtime/shaders/glsl/vs_terrain.bin
new file mode 100644
index 00000000000..e4612f7cfc6
--- /dev/null
+++ b/3rdparty/bgfx/examples/runtime/shaders/glsl/vs_terrain.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/glsl/vs_terrain_height_texture.bin b/3rdparty/bgfx/examples/runtime/shaders/glsl/vs_terrain_height_texture.bin
new file mode 100644
index 00000000000..7b2a872eca2
--- /dev/null
+++ b/3rdparty/bgfx/examples/runtime/shaders/glsl/vs_terrain_height_texture.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_esm.bin b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_esm.bin
index 5b9813e8595..5b9813e8595 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_esm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_esm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_esm_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_esm_csm.bin
index c5a8b4b215c..c5a8b4b215c 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_esm_csm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_esm_csm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_esm_linear.bin b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_esm_linear.bin
index c4d87c03987..c4d87c03987 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_esm_linear.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_esm_linear.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_esm_linear_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_esm_linear_csm.bin
index 2eeed8cde91..2eeed8cde91 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_esm_linear_csm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_esm_linear_csm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_esm_linear_omni.bin b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_esm_linear_omni.bin
index 4ce8af71a63..4ce8af71a63 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_esm_linear_omni.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_esm_linear_omni.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_esm_omni.bin b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_esm_omni.bin
index ca3449ca4d2..ca3449ca4d2 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_esm_omni.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_esm_omni.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_hard.bin b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_hard.bin
index d8fe2fc1ae9..d8fe2fc1ae9 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_hard.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_hard.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_hard_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_hard_csm.bin
index 5089c8f1d23..5089c8f1d23 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_hard_csm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_hard_csm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_hard_linear.bin b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_hard_linear.bin
index 1884107d6bc..1884107d6bc 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_hard_linear.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_hard_linear.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_hard_linear_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_hard_linear_csm.bin
index 2fa958d85bd..2fa958d85bd 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_hard_linear_csm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_hard_linear_csm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_hard_linear_omni.bin b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_hard_linear_omni.bin
index 6e7bffc7959..6e7bffc7959 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_hard_linear_omni.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_hard_linear_omni.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_hard_omni.bin b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_hard_omni.bin
index af048da8a6f..af048da8a6f 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_hard_omni.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_hard_omni.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_pcf.bin b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_pcf.bin
index 467c47d243e..467c47d243e 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_pcf.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_pcf.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_pcf_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_pcf_csm.bin
index 6faad277fd6..6faad277fd6 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_pcf_csm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_pcf_csm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_pcf_linear.bin b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_pcf_linear.bin
index 3e0fbb37abc..3e0fbb37abc 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_pcf_linear.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_pcf_linear.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_pcf_linear_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_pcf_linear_csm.bin
index 31dd9f7c420..31dd9f7c420 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_pcf_linear_csm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_pcf_linear_csm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_pcf_linear_omni.bin b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_pcf_linear_omni.bin
index 3a5f285cf37..3a5f285cf37 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_pcf_linear_omni.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_pcf_linear_omni.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_pcf_omni.bin b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_pcf_omni.bin
index e7c3ad1fa1a..e7c3ad1fa1a 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_pcf_omni.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_pcf_omni.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_vsm.bin b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_vsm.bin
index a76c572dc2a..a76c572dc2a 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_vsm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_vsm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_vsm_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_vsm_csm.bin
index 8915dd6c718..8915dd6c718 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_vsm_csm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_vsm_csm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_vsm_linear.bin b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_vsm_linear.bin
index 79ddb6551c8..79ddb6551c8 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_vsm_linear.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_vsm_linear.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_vsm_linear_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_vsm_linear_csm.bin
index 392fceccbd3..392fceccbd3 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_vsm_linear_csm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_vsm_linear_csm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_vsm_linear_omni.bin b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_vsm_linear_omni.bin
index b377bf7db6a..b377bf7db6a 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_vsm_linear_omni.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_vsm_linear_omni.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_vsm_omni.bin b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_vsm_omni.bin
index 953b60d9b18..953b60d9b18 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lightning_vsm_omni.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_vsm_omni.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowvolume_color_lightning.bin b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowvolume_color_lighting.bin
index 5f7d4490bb7..5f7d4490bb7 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowvolume_color_lightning.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowvolume_color_lighting.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowvolume_texture_lightning.bin b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowvolume_texture_lighting.bin
index 7e7bbab26e3..7e7bbab26e3 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowvolume_texture_lightning.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowvolume_texture_lighting.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_stencil_color_lightning.bin b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_stencil_color_lighting.bin
index ec312f8a3d8..ec312f8a3d8 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_stencil_color_lightning.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_stencil_color_lighting.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_stencil_texture_lightning.bin b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_stencil_texture_lighting.bin
index b0f45e5b5b6..b0f45e5b5b6 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/metal/fs_stencil_texture_lightning.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/metal/fs_stencil_texture_lighting.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_color_lightning.bin b/3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_color_lighting.bin
index 9dcdb61b4ee..9dcdb61b4ee 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_color_lightning.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_color_lighting.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_color_lightning_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_color_lighting_csm.bin
index a143cfc02b8..a143cfc02b8 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_color_lightning_csm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_color_lighting_csm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_color_lightning_linear.bin b/3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_color_lighting_linear.bin
index 02994d2b8b6..02994d2b8b6 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_color_lightning_linear.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_color_lighting_linear.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_color_lightning_linear_csm.bin b/3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_color_lighting_linear_csm.bin
index 8b833673081..8b833673081 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_color_lightning_linear_csm.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_color_lighting_linear_csm.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_color_lightning_linear_omni.bin b/3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_color_lighting_linear_omni.bin
index 54785f92d0e..54785f92d0e 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_color_lightning_linear_omni.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_color_lighting_linear_omni.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_color_lightning_omni.bin b/3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_color_lighting_omni.bin
index ac6332a27f3..ac6332a27f3 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_color_lightning_omni.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_color_lighting_omni.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_texture_lightning.bin b/3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_texture_lighting.bin
index 2e7362934bb..2e7362934bb 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_texture_lightning.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_texture_lighting.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowvolume_color_lightning.bin b/3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowvolume_color_lighting.bin
index 2e782b0cb4c..2e782b0cb4c 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowvolume_color_lightning.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowvolume_color_lighting.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowvolume_texture_lightning.bin b/3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowvolume_texture_lighting.bin
index 2e7362934bb..2e7362934bb 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowvolume_texture_lightning.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowvolume_texture_lighting.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/metal/vs_stencil_color_lightning.bin b/3rdparty/bgfx/examples/runtime/shaders/metal/vs_stencil_color_lighting.bin
index 2e782b0cb4c..2e782b0cb4c 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/metal/vs_stencil_color_lightning.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/metal/vs_stencil_color_lighting.bin
Binary files differ
diff --git a/3rdparty/bgfx/examples/runtime/shaders/metal/vs_stencil_texture_lightning.bin b/3rdparty/bgfx/examples/runtime/shaders/metal/vs_stencil_texture_lighting.bin
index 2e7362934bb..2e7362934bb 100644
--- a/3rdparty/bgfx/examples/runtime/shaders/metal/vs_stencil_texture_lightning.bin
+++ b/3rdparty/bgfx/examples/runtime/shaders/metal/vs_stencil_texture_lighting.bin
Binary files differ
diff --git a/3rdparty/bgfx/include/bgfx/bgfx.h b/3rdparty/bgfx/include/bgfx/bgfx.h
index 64cd158c487..16c5e46a6e7 100644
--- a/3rdparty/bgfx/include/bgfx/bgfx.h
+++ b/3rdparty/bgfx/include/bgfx/bgfx.h
@@ -1,5 +1,5 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
* License: https://github.com/bkaradzic/bgfx/blob/master/LICENSE
*/
@@ -19,7 +19,7 @@
#define BGFX_INVALID_HANDLE { bgfx::invalidHandle }
-namespace bx { struct ReallocatorI; }
+namespace bx { struct AllocatorI; }
/// BGFX
namespace bgfx
@@ -275,6 +275,18 @@ namespace bgfx
};
};
+ struct OcclusionQueryResult
+ {
+ enum Enum
+ {
+ Invisible,
+ Visible,
+ NoResult,
+
+ Count
+ };
+ };
+
static const uint16_t invalidHandle = UINT16_MAX;
BGFX_HANDLE(DynamicIndexBufferHandle);
@@ -282,6 +294,7 @@ namespace bgfx
BGFX_HANDLE(FrameBufferHandle);
BGFX_HANDLE(IndexBufferHandle);
BGFX_HANDLE(IndirectBufferHandle);
+ BGFX_HANDLE(OcclusionQueryHandle);
BGFX_HANDLE(ProgramHandle);
BGFX_HANDLE(ShaderHandle);
BGFX_HANDLE(TextureHandle);
@@ -431,21 +444,7 @@ namespace bgfx
/// Supported functionality.
///
- /// - `BGFX_CAPS_TEXTURE_COMPARE_LEQUAL` - Less equal texture
- /// compare mode.
- /// - `BGFX_CAPS_TEXTURE_COMPARE_ALL` - All texture compare modes.
- /// - `BGFX_CAPS_TEXTURE_3D` - 3D textures.
- /// - `BGFX_CAPS_VERTEX_ATTRIB_HALF` - AttribType::Half.
- /// - `BGFX_CAPS_INSTANCING` - Vertex instancing.
- /// - `BGFX_CAPS_RENDERER_MULTITHREADED` - Renderer on separate
- /// thread.
- /// - `BGFX_CAPS_FRAGMENT_DEPTH` - Fragment shader can modify depth
- /// buffer value (gl_FragDepth).
- /// - `BGFX_CAPS_BLEND_INDEPENDENT` - Multiple render targets can
- /// have different blend mode set individually.
- /// - `BGFX_CAPS_COMPUTE` - Renderer has compute shaders.
- /// - `BGFX_CAPS_FRAGMENT_ORDERING` - Intel's pixel sync.
- /// - `BGFX_CAPS_SWAP_CHAIN` - Multiple windows.
+ /// @attention See BGFX_CAPS_* flags at https://bkaradzic.github.io/bgfx/bgfx.html#available-caps
///
uint64_t supported;
@@ -576,10 +575,12 @@ namespace bgfx
///
struct Stats
{
- uint64_t cpuTime; //!< CPU frame time.
+ uint64_t cpuTimeBegin; //!< CPU frame begin time.
+ uint64_t cpuTimeEnd; //!< CPU frame end time.
uint64_t cpuTimerFreq; //!< CPU timer frequency.
- uint64_t gpuTime; //!< GPU frame time.
+ uint64_t gpuTimeBegin; //!< GPU frame begin time.
+ uint64_t gpuTimeEnd; //!< GPU frame end time.
uint64_t gpuTimerFreq; //!< GPU timer frequency.
};
@@ -737,7 +738,7 @@ namespace bgfx
///
/// @param[in] _vendorId Vendor PCI id. If set to `BGFX_PCI_ID_NONE` it will select the first
/// device.
- /// - `BGFX_PCI_ID_NONE` - autoselect.
+ /// - `BGFX_PCI_ID_NONE` - auto-select.
/// - `BGFX_PCI_ID_AMD` - AMD.
/// - `BGFX_PCI_ID_INTEL` - Intel.
/// - `BGFX_PCI_ID_NVIDIA` - nVidia.
@@ -750,13 +751,13 @@ namespace bgfx
///
/// @param[in] _reallocator Custom allocator. When custom allocator is not
/// specified, library uses default CRT allocator. The library assumes
- /// icustom allocator is thread safe.
+ /// custom allocator is thread safe.
///
- /// @returns `true` if initialization is sucessful.
+ /// @returns `true` if initialization is successful.
///
/// @attention C99 equivalent is `bgfx_init`.
///
- bool init(RendererType::Enum _type = RendererType::Count, uint16_t _vendorId = BGFX_PCI_ID_NONE, uint16_t _deviceId = 0, CallbackI* _callback = NULL, bx::ReallocatorI* _reallocator = NULL);
+ bool init(RendererType::Enum _type = RendererType::Count, uint16_t _vendorId = BGFX_PCI_ID_NONE, uint16_t _deviceId = 0, CallbackI* _callback = NULL, bx::AllocatorI* _reallocator = NULL);
/// Shutdown bgfx library.
///
@@ -1413,7 +1414,7 @@ namespace bgfx
///
/// @attention Texture must be created with `BGFX_TEXTURE_READ_BACK` flag.
/// @attention Availability depends on: `BGFX_CAPS_TEXTURE_READ_BACK`.
- /// @attention C99 equivalent is `bgfx_read_texture`.
+ /// @attention C99 equivalent is `bgfx_read_frame_buffer`.
///
void readTexture(FrameBufferHandle _handle, uint8_t _attachment, void* _data);
@@ -1479,7 +1480,7 @@ namespace bgfx
/// @returns Handle to frame buffer object.
///
/// @remarks
- /// Frame buffer cannnot be used for sampling.
+ /// Frame buffer cannot be used for sampling.
///
/// @attention C99 equivalent is `bgfx_create_frame_buffer_from_nwh`.
///
@@ -1529,6 +1530,31 @@ namespace bgfx
///
void destroyUniform(UniformHandle _handle);
+ /// Create occlusion query.
+ ///
+ /// @returns Handle to occlusion query object.
+ ///
+ /// @attention C99 equivalent is `bgfx_create_occlusion_query`.
+ ///
+ OcclusionQueryHandle createOcclusionQuery();
+
+ /// Retrieve occlusion query result from previous frame.
+ ///
+ /// @param[in] _handle Handle to occlusion query object.
+ /// @returns Occlusion query result.
+ ///
+ /// @attention C99 equivalent is `bgfx_get_result`.
+ ///
+ OcclusionQueryResult::Enum getResult(OcclusionQueryHandle _handle);
+
+ /// Destroy occlusion query.
+ ///
+ /// @param[in] _handle Handle to occlusion query object.
+ ///
+ /// @attention C99 equivalent is `bgfx_destroy_occlusion_query`.
+ ///
+ void destroyOcclusionQuery(OcclusionQueryHandle _handle);
+
/// Set palette color value.
///
/// @param[in] _index Index into palette.
@@ -1566,11 +1592,11 @@ namespace bgfx
///
/// In graphics debugger view name will appear as:
///
- /// "nnnce <view name>"
- /// ^ ^^ ^
- /// | |+-- eye (L/R)
- /// | +-- compute (C)
- /// +-- view id
+ /// "nnnce <view name>"
+ /// ^ ^^ ^
+ /// | |+-- eye (L/R)
+ /// | +--- compute (C)
+ /// +------ view id
///
/// @attention C99 equivalent is `bgfx_set_view_name`.
///
@@ -1588,6 +1614,7 @@ namespace bgfx
///
void setViewRect(uint8_t _id, uint16_t _x, uint16_t _y, uint16_t _width, uint16_t _height);
+ /// @attention C99 equivalent is `bgfx_set_view_rect_auto`.
///
void setViewRect(uint8_t _id, uint16_t _x, uint16_t _y, BackbufferRatio::Enum _ratio);
@@ -1729,6 +1756,15 @@ namespace bgfx
///
void setState(uint64_t _state, uint32_t _rgba = 0);
+ /// Set condition for rendering.
+ ///
+ /// @param[in] _handle Occlusion query handle.
+ /// @param[in] _visible Render if occlusion query is visible.
+ ///
+ /// @attention C99 equivalent is `bgfx_set_condition`.
+ ///
+ void setCondition(OcclusionQueryHandle _handle, bool _visible);
+
/// Set stencil test state.
///
/// @param[in] _fstencil Front stencil state.
@@ -1946,19 +1982,31 @@ namespace bgfx
/// Submit primitive for rendering.
///
/// @param[in] _id View id.
- /// @param[in] _handle Program.
+ /// @param[in] _program Program.
/// @param[in] _depth Depth for sorting.
/// @returns Number of draw calls.
///
/// @attention C99 equivalent is `bgfx_submit`.
///
- uint32_t submit(uint8_t _id, ProgramHandle _handle, int32_t _depth = 0);
+ uint32_t submit(uint8_t _id, ProgramHandle _program, int32_t _depth = 0);
+
+ /// Submit primitive with occlusion query for rendering.
+ ///
+ /// @param[in] _id View id.
+ /// @param[in] _program Program.
+ /// @param[in] _occlusionQuery Occlusion query.
+ /// @param[in] _depth Depth for sorting.
+ /// @returns Number of draw calls.
+ ///
+ /// @attention C99 equivalent is `bgfx_submit_occlusion_query.
+ ///
+ uint32_t submit(uint8_t _id, ProgramHandle _program, OcclusionQueryHandle _occlusionQuery, int32_t _depth = 0);
/// Submit primitive for rendering with index and instance data info from
/// indirect buffer.
///
/// @param[in] _id View id.
- /// @param[in] _handle Program.
+ /// @param[in] _program Program.
/// @param[in] _indirectHandle Indirect buffer.
/// @param[in] _start First element in indirect buffer.
/// @param[in] _num Number of dispatches.
@@ -1966,7 +2014,7 @@ namespace bgfx
///
/// @attention C99 equivalent is `bgfx_submit_indirect`.
///
- uint32_t submit(uint8_t _id, ProgramHandle _handle, IndirectBufferHandle _indirectHandle, uint16_t _start = 0, uint16_t _num = 1, int32_t _depth = 0);
+ uint32_t submit(uint8_t _id, ProgramHandle _program, IndirectBufferHandle _indirectHandle, uint16_t _start = 0, uint16_t _num = 1, int32_t _depth = 0);
/// Set compute index buffer.
///
diff --git a/3rdparty/bgfx/include/bgfx/bgfxdefines.h b/3rdparty/bgfx/include/bgfx/bgfxdefines.h
index 5ca5e7d02c1..d0e4db91bce 100644
--- a/3rdparty/bgfx/include/bgfx/bgfxdefines.h
+++ b/3rdparty/bgfx/include/bgfx/bgfxdefines.h
@@ -1,11 +1,13 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#ifndef BGFX_DEFINES_H_HEADER_GUARD
#define BGFX_DEFINES_H_HEADER_GUARD
+#define BGFX_API_VERSION UINT32_C(2)
+
///
#define BGFX_STATE_RGB_WRITE UINT64_C(0x0000000000000001) //!< Enable RGB write.
#define BGFX_STATE_ALPHA_WRITE UINT64_C(0x0000000000000002) //!< Enable alpha write.
@@ -71,7 +73,9 @@
/// MSAA frame buffer.
#define BGFX_STATE_MSAA UINT64_C(0x1000000000000000) //!< Enable MSAA rasterization.
-#define BGFX_STATE_RESERVED_MASK UINT64_C(0xe000000000000000) //!< Internal bits, do not use!
+/// Do not use!
+#define BGFX_STATE_RESERVED_SHIFT 61 //!< Internal bits shift.
+#define BGFX_STATE_RESERVED_MASK UINT64_C(0xe000000000000000) //!< Internal bits mask.
/// See BGFX_STATE_POINT_SIZE(_size) helper macro.
#define BGFX_STATE_NONE UINT64_C(0x0000000000000000) //!< No state.
@@ -350,6 +354,10 @@
#define BGFX_RESET_FLIP_AFTER_RENDER UINT32_C(0x00004000) //!< This flag specifies where flip occurs. Default behavior is that flip occurs before rendering new frame. This flag only has effect when `BGFX_CONFIG_MULTITHREADED=0`.
#define BGFX_RESET_SRGB_BACKBUFFER UINT32_C(0x00008000) //!< Enable sRGB backbuffer.
#define BGFX_RESET_HIDPI UINT32_C(0x00010000) //!< Enable HiDPI rendering.
+#define BGFX_RESET_DEPTH_CLAMP UINT32_C(0x00020000) //!< Enable depth clamp.
+
+#define BGFX_RESET_RESERVED_SHIFT 31 //!< Internal bits shift.
+#define BGFX_RESET_RESERVED_MASK UINT32_C(0x80000000) //!< Internal bits mask.
///
#define BGFX_CAPS_TEXTURE_COMPARE_LEQUAL UINT64_C(0x0000000000000001) //!< Texture compare less equal mode is supported.
@@ -370,6 +378,7 @@
#define BGFX_CAPS_HIDPI UINT64_C(0x0000000000008000) //!< HiDPI rendering is supported.
#define BGFX_CAPS_TEXTURE_BLIT UINT64_C(0x0000000000010000) //!< Texture blit is supported.
#define BGFX_CAPS_TEXTURE_READ_BACK UINT64_C(0x0000000000020000) //!< Read-back texture is supported.
+#define BGFX_CAPS_OCCLUSION_QUERY UINT64_C(0x0000000000040000) //!< Occlusion query is supported.
///
#define BGFX_CAPS_FORMAT_TEXTURE_NONE UINT16_C(0x0000) //!< Texture format is not supported.
@@ -393,10 +402,13 @@
#define BGFX_VIEW_STEREO UINT8_C(0x01) //!< View will be rendered in stereo mode.
///
-#define BGFX_SUBMIT_EYE_LEFT UINT8_C(0x01) //!< Submit to left eye.
-#define BGFX_SUBMIT_EYE_RIGHT UINT8_C(0x02) //!< Submit to right eye.
-#define BGFX_SUBMIT_EYE_MASK UINT8_C(0x03) //!<
-#define BGFX_SUBMIT_EYE_FIRST BGFX_SUBMIT_EYE_LEFT
+#define BGFX_SUBMIT_EYE_LEFT UINT8_C(0x01) //!< Submit to left eye.
+#define BGFX_SUBMIT_EYE_RIGHT UINT8_C(0x02) //!< Submit to right eye.
+#define BGFX_SUBMIT_EYE_MASK UINT8_C(0x03) //!<
+#define BGFX_SUBMIT_EYE_FIRST BGFX_SUBMIT_EYE_LEFT
+
+#define BGFX_SUBMIT_RESERVED_SHIFT 7 //!< Internal bits shift.
+#define BGFX_SUBMIT_RESERVED_MASK UINT8_C(0x80) //!< Internal bits mask.
///
#define BGFX_PCI_ID_NONE UINT16_C(0x0000) //!< Autoselect adapter.
diff --git a/3rdparty/bgfx/include/bgfx/bgfxplatform.h b/3rdparty/bgfx/include/bgfx/bgfxplatform.h
index 920904aa9fc..b9107a26e39 100644
--- a/3rdparty/bgfx/include/bgfx/bgfxplatform.h
+++ b/3rdparty/bgfx/include/bgfx/bgfxplatform.h
@@ -1,5 +1,5 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
* License: https://github.com/bkaradzic/bgfx/blob/master/LICENSE
*/
@@ -98,7 +98,7 @@ namespace bgfx
} // namespace bgfx
-#elif BX_PLATFORM_FREEBSD || BX_PLATFORM_LINUX || BX_PLATFORM_RPI
+#elif BX_PLATFORM_BSD || BX_PLATFORM_LINUX || BX_PLATFORM_RPI
namespace bgfx
{
@@ -203,7 +203,7 @@ namespace bgfx
}
PlatformData pd;
-# if BX_PLATFORM_LINUX || BX_PLATFORM_FREEBSD
+# if BX_PLATFORM_LINUX || BX_PLATFORM_BSD
pd.ndt = wmi.info.x11.display;
pd.nwh = (void*)(uintptr_t)wmi.info.x11.window;
# elif BX_PLATFORM_OSX
@@ -227,7 +227,7 @@ namespace bgfx
// If GLFW/glfw3.h is included before bgfxplatform.h we can enable GLFW3
// window interop convenience code.
-# if BX_PLATFORM_LINUX || BX_PLATFORM_FREEBSD
+# if BX_PLATFORM_LINUX || BX_PLATFORM_BSD
# define GLFW_EXPOSE_NATIVE_X11
# define GLFW_EXPOSE_NATIVE_GLX
# elif BX_PLATFORM_OSX
@@ -244,7 +244,7 @@ namespace bgfx
inline void glfwSetWindow(GLFWwindow* _window)
{
PlatformData pd;
-# if BX_PLATFORM_LINUX || BX_PLATFORM_FREEBSD
+# if BX_PLATFORM_LINUX || BX_PLATFORM_BSD
pd.ndt = glfwGetX11Display();
pd.nwh = (void*)(uintptr_t)glfwGetX11Window(_window);
pd.context = glfwGetGLXContext(_window);
diff --git a/3rdparty/bgfx/include/bgfx/c99/bgfx.h b/3rdparty/bgfx/include/bgfx/c99/bgfx.h
index 534c13f1f50..a3b31ee9ed3 100644
--- a/3rdparty/bgfx/include/bgfx/c99/bgfx.h
+++ b/3rdparty/bgfx/include/bgfx/c99/bgfx.h
@@ -1,5 +1,5 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
* License: https://github.com/bkaradzic/bgfx/blob/master/LICENSE
*
* vim: set tabstop=4 expandtab:
@@ -13,7 +13,34 @@
#include <stdint.h> // uint32_t
#include <stdlib.h> // size_t
+#ifndef BGFX_SHARED_LIB_BUILD
+# define BGFX_SHARED_LIB_BUILD 0
+#endif // BGFX_SHARED_LIB_BUILD
+
+#ifndef BGFX_SHARED_LIB_USE
+# define BGFX_SHARED_LIB_USE 0
+#endif // BGFX_SHARED_LIB_USE
+
+#if defined(_MSC_VER)
+# if BGFX_SHARED_LIB_BUILD
+# define BGFX_SHARED_LIB_API __declspec(dllexport)
+# elif BGFX_SHARED_LIB_USE
+# define BGFX_SHARED_LIB_API __declspec(dllimport)
+# else
+# define BGFX_SHARED_LIB_API
+# endif // BGFX_SHARED_LIB_*
+#else
+# define BGFX_SHARED_LIB_API
+#endif // defined(_MSC_VER)
+
+#if defined(__cplusplus)
+# define BGFX_C_API extern "C" BGFX_SHARED_LIB_API
+#else
+# define BGFX_C_API BGFX_SHARED_LIB_API
+#endif // defined(__cplusplus)
+
#include <bgfx/bgfxdefines.h>
+#include <bgfx/c99/bgfxplatform.h>
typedef enum bgfx_renderer_type
{
@@ -184,6 +211,16 @@ typedef enum bgfx_backbuffer_ratio
} bgfx_backbuffer_ratio_t;
+typedef enum bgfx_occlusion_query_result
+{
+ BGFX_OCCLUSION_QUERY_RESULT_INVISIBLE,
+ BGFX_OCCLUSION_QUERY_RESULT_VISIBLE,
+ BGFX_OCCLUSION_QUERY_RESULT_NORESULT,
+
+ BGFX_OCCLUSION_QUERY_RESULT_COUNT
+
+} bgfx_occlusion_query_result_t;
+
#define BGFX_HANDLE_T(_name) \
typedef struct _name { uint16_t idx; } _name##_t
@@ -192,6 +229,7 @@ BGFX_HANDLE_T(bgfx_dynamic_index_buffer_handle);
BGFX_HANDLE_T(bgfx_dynamic_vertex_buffer_handle);
BGFX_HANDLE_T(bgfx_frame_buffer_handle);
BGFX_HANDLE_T(bgfx_index_buffer_handle);
+BGFX_HANDLE_T(bgfx_occlusion_query_handle);
BGFX_HANDLE_T(bgfx_program_handle);
BGFX_HANDLE_T(bgfx_shader_handle);
BGFX_HANDLE_T(bgfx_texture_handle);
@@ -355,32 +393,6 @@ typedef enum bgfx_fatal
} bgfx_fatal_t;
-#ifndef BGFX_SHARED_LIB_BUILD
-# define BGFX_SHARED_LIB_BUILD 0
-#endif // BGFX_SHARED_LIB_BUILD
-
-#ifndef BGFX_SHARED_LIB_USE
-# define BGFX_SHARED_LIB_USE 0
-#endif // BGFX_SHARED_LIB_USE
-
-#if defined(_MSC_VER)
-# if BGFX_SHARED_LIB_BUILD
-# define BGFX_SHARED_LIB_API __declspec(dllexport)
-# elif BGFX_SHARED_LIB_USE
-# define BGFX_SHARED_LIB_API __declspec(dllimport)
-# else
-# define BGFX_SHARED_LIB_API
-# endif // BGFX_SHARED_LIB_*
-#else
-# define BGFX_SHARED_LIB_API
-#endif // defined(_MSC_VER)
-
-#if defined(__cplusplus)
-# define BGFX_C_API extern "C" BGFX_SHARED_LIB_API
-#else
-# define BGFX_C_API BGFX_SHARED_LIB_API
-#endif // defined(__cplusplus)
-
/**/
typedef struct bgfx_callback_interface
{
@@ -404,20 +416,152 @@ typedef struct bgfx_callback_vtbl
} bgfx_callback_vtbl_t;
/**/
-typedef struct bgfx_reallocator_interface
+typedef struct bgfx_allocator_interface
{
- const struct bgfx_reallocator_vtbl* vtbl;
+ const struct bgfx_allocator_vtbl* vtbl;
-} bgfx_reallocator_interface_t;
+} bgfx_allocator_interface_t;
/**/
-typedef struct bgfx_reallocator_vtbl
+typedef struct bgfx_allocator_vtbl
{
- void* (*alloc)(bgfx_reallocator_interface_t* _this, size_t _size, size_t _align, const char* _file, uint32_t _line);
- void (*free)(bgfx_reallocator_interface_t* _this, void* _ptr, size_t _align, const char* _file, uint32_t _line);
- void* (*realloc)(bgfx_reallocator_interface_t* _this, void* _ptr, size_t _size, size_t _align, const char* _file, uint32_t _line);
+ void* (*realloc)(bgfx_allocator_interface_t* _this, void* _ptr, size_t _size, size_t _align, const char* _file, uint32_t _line);
-} bgfx_reallocator_vtbl_t;
+} bgfx_allocator_vtbl_t;
+
+/**/
+typedef struct bgfx_interface_vtbl
+{
+ bgfx_render_frame_t (*render_frame)();
+ void (*set_platform_data)(bgfx_platform_data_t* _pd);
+ void (*vertex_decl_begin)(bgfx_vertex_decl_t* _decl, bgfx_renderer_type_t _renderer);
+ void (*vertex_decl_add)(bgfx_vertex_decl_t* _decl, bgfx_attrib_t _attrib, uint8_t _num, bgfx_attrib_type_t _type, bool _normalized, bool _asInt);
+ void (*vertex_decl_skip)(bgfx_vertex_decl_t* _decl, uint8_t _num);
+ void (*vertex_decl_end)(bgfx_vertex_decl_t* _decl);
+ void (*vertex_pack)(const float _input[4], bool _inputNormalized, bgfx_attrib_t _attr, const bgfx_vertex_decl_t* _decl, void* _data, uint32_t _index);
+ void (*vertex_unpack)(float _output[4], bgfx_attrib_t _attr, const bgfx_vertex_decl_t* _decl, const void* _data, uint32_t _index);
+ void (*vertex_convert)(const bgfx_vertex_decl_t* _destDecl, void* _destData, const bgfx_vertex_decl_t* _srcDecl, const void* _srcData, uint32_t _num);
+ uint16_t (*weld_vertices)(uint16_t* _output, const bgfx_vertex_decl_t* _decl, const void* _data, uint16_t _num, float _epsilon);
+ void (*image_swizzle_bgra8)(uint32_t _width, uint32_t _height, uint32_t _pitch, const void* _src, void* _dst);
+ void (*image_rgba8_downsample_2x2)(uint32_t _width, uint32_t _height, uint32_t _pitch, const void* _src, void* _dst);
+ uint8_t (*get_supported_renderers)(bgfx_renderer_type_t _enum[BGFX_RENDERER_TYPE_COUNT]);
+ const char* (*get_renderer_name)(bgfx_renderer_type_t _type);
+ bool (*init)(bgfx_renderer_type_t _type, uint16_t _vendorId, uint16_t _deviceId, bgfx_callback_interface_t* _callback, bgfx_allocator_interface_t* _allocator);
+ void (*shutdown)();
+ void (*reset)(uint32_t _width, uint32_t _height, uint32_t _flags);
+ uint32_t (*frame)();
+ bgfx_renderer_type_t (*get_renderer_type)();
+ const bgfx_caps_t* (*get_caps)();
+ const bgfx_hmd_t* (*get_hmd)();
+ const bgfx_stats_t* (*get_stats)();
+ const bgfx_memory_t* (*alloc)(uint32_t _size);
+ const bgfx_memory_t* (*copy)(const void* _data, uint32_t _size);
+ const bgfx_memory_t* (*make_ref)(const void* _data, uint32_t _size);
+ const bgfx_memory_t* (*make_ref_release)(const void* _data, uint32_t _size, bgfx_release_fn_t _releaseFn, void* _userData);
+ void (*set_debug)(uint32_t _debug);
+ void (*dbg_text_clear)(uint8_t _attr, bool _small);
+ void (*dbg_text_printf)(uint16_t _x, uint16_t _y, uint8_t _attr, const char* _format, ...);
+ void (*dbg_text_image)(uint16_t _x, uint16_t _y, uint16_t _width, uint16_t _height, const void* _data, uint16_t _pitch);
+ bgfx_index_buffer_handle_t (*create_index_buffer)(const bgfx_memory_t* _mem, uint16_t _flags);
+ void (*destroy_index_buffer)(bgfx_index_buffer_handle_t _handle);
+ bgfx_vertex_buffer_handle_t (*create_vertex_buffer)(const bgfx_memory_t* _mem, const bgfx_vertex_decl_t* _decl, uint16_t _flags);
+ void (*destroy_vertex_buffer)(bgfx_vertex_buffer_handle_t _handle);
+ bgfx_dynamic_index_buffer_handle_t (*create_dynamic_index_buffer)(uint32_t _num, uint16_t _flags);
+ bgfx_dynamic_index_buffer_handle_t (*create_dynamic_index_buffer_mem)(const bgfx_memory_t* _mem, uint16_t _flags);
+ void (*update_dynamic_index_buffer)(bgfx_dynamic_index_buffer_handle_t _handle, uint32_t _startIndex, const bgfx_memory_t* _mem);
+ void (*destroy_dynamic_index_buffer)(bgfx_dynamic_index_buffer_handle_t _handle);
+ bgfx_dynamic_vertex_buffer_handle_t (*create_dynamic_vertex_buffer)(uint32_t _num, const bgfx_vertex_decl_t* _decl, uint16_t _flags);
+ bgfx_dynamic_vertex_buffer_handle_t (*create_dynamic_vertex_buffer_mem)(const bgfx_memory_t* _mem, const bgfx_vertex_decl_t* _decl, uint16_t _flags);
+ void (*update_dynamic_vertex_buffer)(bgfx_dynamic_vertex_buffer_handle_t _handle, uint32_t _startVertex, const bgfx_memory_t* _mem);
+ void (*destroy_dynamic_vertex_buffer)(bgfx_dynamic_vertex_buffer_handle_t _handle);
+ bool (*check_avail_transient_index_buffer)(uint32_t _num);
+ bool (*check_avail_transient_vertex_buffer)(uint32_t _num, const bgfx_vertex_decl_t* _decl);
+ bool (*check_avail_instance_data_buffer)(uint32_t _num, uint16_t _stride);
+ bool (*check_avail_transient_buffers)(uint32_t _numVertices, const bgfx_vertex_decl_t* _decl, uint32_t _numIndices);
+ void (*alloc_transient_index_buffer)(bgfx_transient_index_buffer_t* _tib, uint32_t _num);
+ void (*alloc_transient_vertex_buffer)(bgfx_transient_vertex_buffer_t* _tvb, uint32_t _num, const bgfx_vertex_decl_t* _decl);
+ bool (*alloc_transient_buffers)(bgfx_transient_vertex_buffer_t* _tvb, const bgfx_vertex_decl_t* _decl, uint32_t _numVertices, bgfx_transient_index_buffer_t* _tib, uint32_t _numIndices);
+ const bgfx_instance_data_buffer_t* (*alloc_instance_data_buffer)(uint32_t _num, uint16_t _stride);
+ bgfx_indirect_buffer_handle_t (*create_indirect_buffer)(uint32_t _num);
+ void (*destroy_indirect_buffer)(bgfx_indirect_buffer_handle_t _handle);
+ bgfx_shader_handle_t (*create_shader)(const bgfx_memory_t* _mem);
+ uint16_t (*get_shader_uniforms)(bgfx_shader_handle_t _handle, bgfx_uniform_handle_t* _uniforms, uint16_t _max);
+ void (*destroy_shader)(bgfx_shader_handle_t _handle);
+ bgfx_program_handle_t (*create_program)(bgfx_shader_handle_t _vsh, bgfx_shader_handle_t _fsh, bool _destroyShaders);
+ bgfx_program_handle_t (*create_compute_program)(bgfx_shader_handle_t _csh, bool _destroyShaders);
+ void (*destroy_program)(bgfx_program_handle_t _handle);
+ void (*calc_texture_size)(bgfx_texture_info_t* _info, uint16_t _width, uint16_t _height, uint16_t _depth, bool _cubeMap, uint8_t _numMips, bgfx_texture_format_t _format);
+ bgfx_texture_handle_t (*create_texture)(const bgfx_memory_t* _mem, uint32_t _flags, uint8_t _skip, bgfx_texture_info_t* _info);
+ bgfx_texture_handle_t (*create_texture_2d)(uint16_t _width, uint16_t _height, uint8_t _numMips, bgfx_texture_format_t _format, uint32_t _flags, const bgfx_memory_t* _mem);
+ bgfx_texture_handle_t (*create_texture_2d_scaled)(bgfx_backbuffer_ratio_t _ratio, uint8_t _numMips, bgfx_texture_format_t _format, uint32_t _flags);
+ bgfx_texture_handle_t (*create_texture_3d)(uint16_t _width, uint16_t _height, uint16_t _depth, uint8_t _numMips, bgfx_texture_format_t _format, uint32_t _flags, const bgfx_memory_t* _mem);
+ bgfx_texture_handle_t (*create_texture_cube)(uint16_t _size, uint8_t _numMips, bgfx_texture_format_t _format, uint32_t _flags, const bgfx_memory_t* _mem);
+ void (*update_texture_2d)(bgfx_texture_handle_t _handle, uint8_t _mip, uint16_t _x, uint16_t _y, uint16_t _width, uint16_t _height, const bgfx_memory_t* _mem, uint16_t _pitch);
+ void (*update_texture_3d)(bgfx_texture_handle_t _handle, uint8_t _mip, uint16_t _x, uint16_t _y, uint16_t _z, uint16_t _width, uint16_t _height, uint16_t _depth, const bgfx_memory_t* _mem);
+ void (*update_texture_cube)(bgfx_texture_handle_t _handle, uint8_t _side, uint8_t _mip, uint16_t _x, uint16_t _y, uint16_t _width, uint16_t _height, const bgfx_memory_t* _mem, uint16_t _pitch);
+ void (*destroy_texture)(bgfx_texture_handle_t _handle);
+ bgfx_frame_buffer_handle_t (*create_frame_buffer)(uint16_t _width, uint16_t _height, bgfx_texture_format_t _format, uint32_t _textureFlags);
+ bgfx_frame_buffer_handle_t (*create_frame_buffer_scaled)(bgfx_backbuffer_ratio_t _ratio, bgfx_texture_format_t _format, uint32_t _textureFlags);
+ bgfx_frame_buffer_handle_t (*create_frame_buffer_from_handles)(uint8_t _num, const bgfx_texture_handle_t* _handles, bool _destroyTextures);
+ bgfx_frame_buffer_handle_t (*create_frame_buffer_from_nwh)(void* _nwh, uint16_t _width, uint16_t _height, bgfx_texture_format_t _depthFormat);
+ void (*destroy_frame_buffer)(bgfx_frame_buffer_handle_t _handle);
+ bgfx_uniform_handle_t (*create_uniform)(const char* _name, bgfx_uniform_type_t _type, uint16_t _num);
+ void (*destroy_uniform)(bgfx_uniform_handle_t _handle);
+ bgfx_occlusion_query_handle_t (*create_occlusion_query)();
+ bgfx_occlusion_query_result_t (*get_result)(bgfx_occlusion_query_handle_t _handle);
+ void (*destroy_occlusion_query)(bgfx_occlusion_query_handle_t _handle);
+ void (*set_palette_color)(uint8_t _index, const float _rgba[4]);
+ void (*set_view_name)(uint8_t _id, const char* _name);
+ void (*set_view_rect)(uint8_t _id, uint16_t _x, uint16_t _y, uint16_t _width, uint16_t _height);
+ void (*set_view_scissor)(uint8_t _id, uint16_t _x, uint16_t _y, uint16_t _width, uint16_t _height);
+ void (*set_view_clear)(uint8_t _id, uint16_t _flags, uint32_t _rgba, float _depth, uint8_t _stencil);
+ void (*set_view_clear_mrt)(uint8_t _id, uint16_t _flags, float _depth, uint8_t _stencil, uint8_t _0, uint8_t _1, uint8_t _2, uint8_t _3, uint8_t _4, uint8_t _5, uint8_t _6, uint8_t _7);
+ void (*set_view_seq)(uint8_t _id, bool _enabled);
+ void (*set_view_frame_buffer)(uint8_t _id, bgfx_frame_buffer_handle_t _handle);
+ void (*set_view_transform)(uint8_t _id, const void* _view, const void* _proj);
+ void (*set_view_transform_stereo)(uint8_t _id, const void* _view, const void* _projL, uint8_t _flags, const void* _projR);
+ void (*set_view_remap)(uint8_t _id, uint8_t _num, const void* _remap);
+ void (*set_marker)(const char* _marker);
+ void (*set_state)(uint64_t _state, uint32_t _rgba);
+ void (*set_condition)(bgfx_occlusion_query_handle_t _handle, bool _visible);
+ void (*set_stencil)(uint32_t _fstencil, uint32_t _bstencil);
+ uint16_t (*set_scissor)(uint16_t _x, uint16_t _y, uint16_t _width, uint16_t _height);
+ void (*set_scissor_cached)(uint16_t _cache);
+ uint32_t (*set_transform)(const void* _mtx, uint16_t _num);
+ uint32_t (*alloc_transform)(bgfx_transform_t* _transform, uint16_t _num);
+ void (*set_transform_cached)(uint32_t _cache, uint16_t _num);
+ void (*set_uniform)(bgfx_uniform_handle_t _handle, const void* _value, uint16_t _num);
+ void (*set_index_buffer)(bgfx_index_buffer_handle_t _handle, uint32_t _firstIndex, uint32_t _numIndices);
+ void (*set_dynamic_index_buffer)(bgfx_dynamic_index_buffer_handle_t _handle, uint32_t _firstIndex, uint32_t _numIndices);
+ void (*set_transient_index_buffer)(const bgfx_transient_index_buffer_t* _tib, uint32_t _firstIndex, uint32_t _numIndices);
+ void (*set_vertex_buffer)(bgfx_vertex_buffer_handle_t _handle, uint32_t _startVertex, uint32_t _numVertices);
+ void (*set_dynamic_vertex_buffer)(bgfx_dynamic_vertex_buffer_handle_t _handle, uint32_t _numVertices);
+ void (*set_transient_vertex_buffer)(const bgfx_transient_vertex_buffer_t* _tvb, uint32_t _startVertex, uint32_t _numVertices);
+ void (*set_instance_data_buffer)(const bgfx_instance_data_buffer_t* _idb, uint32_t _num);
+ void (*set_instance_data_from_vertex_buffer)(bgfx_vertex_buffer_handle_t _handle, uint32_t _startVertex, uint32_t _num);
+ void (*set_instance_data_from_dynamic_vertex_buffer)(bgfx_dynamic_vertex_buffer_handle_t _handle, uint32_t _startVertex, uint32_t _num);
+ void (*set_texture)(uint8_t _stage, bgfx_uniform_handle_t _sampler, bgfx_texture_handle_t _handle, uint32_t _flags);
+ void (*set_texture_from_frame_buffer)(uint8_t _stage, bgfx_uniform_handle_t _sampler, bgfx_frame_buffer_handle_t _handle, uint8_t _attachment, uint32_t _flags);
+ uint32_t (*touch)(uint8_t _id);
+ uint32_t (*submit)(uint8_t _id, bgfx_program_handle_t _handle, int32_t _depth);
+ uint32_t (*submit_occlusion_query)(uint8_t _id, bgfx_program_handle_t _program, bgfx_occlusion_query_handle_t _occlusionQuery, int32_t _depth);
+ uint32_t (*submit_indirect)(uint8_t _id, bgfx_program_handle_t _handle, bgfx_indirect_buffer_handle_t _indirectHandle, uint16_t _start, uint16_t _num, int32_t _depth);
+ void (*set_image)(uint8_t _stage, bgfx_uniform_handle_t _sampler, bgfx_texture_handle_t _handle, uint8_t _mip, bgfx_access_t _access, bgfx_texture_format_t _format);
+ void (*set_image_from_frame_buffer)(uint8_t _stage, bgfx_uniform_handle_t _sampler, bgfx_frame_buffer_handle_t _handle, uint8_t _attachment, bgfx_access_t _access, bgfx_texture_format_t _format);
+ void (*set_compute_index_buffer)(uint8_t _stage, bgfx_index_buffer_handle_t _handle, bgfx_access_t _access);
+ void (*set_compute_vertex_buffer)(uint8_t _stage, bgfx_vertex_buffer_handle_t _handle, bgfx_access_t _access);
+ void (*set_compute_dynamic_index_buffer)(uint8_t _stage, bgfx_dynamic_index_buffer_handle_t _handle, bgfx_access_t _access);
+ void (*set_compute_dynamic_vertex_buffer)(uint8_t _stage, bgfx_dynamic_vertex_buffer_handle_t _handle, bgfx_access_t _access);
+ void (*set_compute_indirect_buffer)(uint8_t _stage, bgfx_indirect_buffer_handle_t _handle, bgfx_access_t _access);
+ uint32_t (*dispatch)(uint8_t _id, bgfx_program_handle_t _handle, uint16_t _numX, uint16_t _numY, uint16_t _numZ, uint8_t _flags);
+ uint32_t (*dispatch_indirect)(uint8_t _id, bgfx_program_handle_t _handle, bgfx_indirect_buffer_handle_t _indirectHandle, uint16_t _start, uint16_t _num, uint8_t _flags);
+ void (*discard)();
+ void (*blit)(uint8_t _id, bgfx_texture_handle_t _dst, uint8_t _dstMip, uint16_t _dstX, uint16_t _dstY, uint16_t _dstZ, bgfx_texture_handle_t _src, uint8_t _srcMip, uint16_t _srcX, uint16_t _srcY, uint16_t _srcZ, uint16_t _width, uint16_t _height, uint16_t _depth);
+ void (*save_screen_shot)(const char* _filePath);
+
+} bgfx_interface_vtbl_t;
+
+typedef bgfx_interface_vtbl_t* (*PFN_BGFX_GET_INTERFACE)(uint32_t _version);
/**/
BGFX_C_API void bgfx_vertex_decl_begin(bgfx_vertex_decl_t* _decl, bgfx_renderer_type_t _renderer);
@@ -456,7 +600,7 @@ BGFX_C_API uint8_t bgfx_get_supported_renderers(bgfx_renderer_type_t _enum[BGFX_
BGFX_C_API const char* bgfx_get_renderer_name(bgfx_renderer_type_t _type);
/**/
-BGFX_C_API bool bgfx_init(bgfx_renderer_type_t _type, uint16_t _vendorId, uint16_t _deviceId, bgfx_callback_interface_t* _callback, bgfx_reallocator_interface_t* _allocator);
+BGFX_C_API bool bgfx_init(bgfx_renderer_type_t _type, uint16_t _vendorId, uint16_t _deviceId, bgfx_callback_interface_t* _callback, bgfx_allocator_interface_t* _allocator);
/**/
BGFX_C_API void bgfx_shutdown();
@@ -615,6 +759,12 @@ BGFX_C_API void bgfx_update_texture_3d(bgfx_texture_handle_t _handle, uint8_t _m
BGFX_C_API void bgfx_update_texture_cube(bgfx_texture_handle_t _handle, uint8_t _side, uint8_t _mip, uint16_t _x, uint16_t _y, uint16_t _width, uint16_t _height, const bgfx_memory_t* _mem, uint16_t _pitch);
/**/
+BGFX_C_API void bgfx_read_texture(bgfx_texture_handle_t _handle, void* _data);
+
+/**/
+BGFX_C_API void bgfx_read_frame_buffer(bgfx_frame_buffer_handle_t _handle, uint8_t _attachment, void* _data);
+
+/**/
BGFX_C_API void bgfx_destroy_texture(bgfx_texture_handle_t _handle);
/**/
@@ -639,6 +789,15 @@ BGFX_C_API bgfx_uniform_handle_t bgfx_create_uniform(const char* _name, bgfx_uni
BGFX_C_API void bgfx_destroy_uniform(bgfx_uniform_handle_t _handle);
/**/
+BGFX_C_API bgfx_occlusion_query_handle_t bgfx_create_occlusion_query();
+
+/**/
+BGFX_C_API bgfx_occlusion_query_result_t bgfx_get_result(bgfx_occlusion_query_handle_t _handle);
+
+/**/
+BGFX_C_API void bgfx_destroy_occlusion_query(bgfx_occlusion_query_handle_t _handle);
+
+/**/
BGFX_C_API void bgfx_set_palette_color(uint8_t _index, const float _rgba[4]);
/**/
@@ -648,6 +807,9 @@ BGFX_C_API void bgfx_set_view_name(uint8_t _id, const char* _name);
BGFX_C_API void bgfx_set_view_rect(uint8_t _id, uint16_t _x, uint16_t _y, uint16_t _width, uint16_t _height);
/**/
+BGFX_C_API void bgfx_set_view_rect_auto(uint8_t _id, uint16_t _x, uint16_t _y, bgfx_backbuffer_ratio_t _ratio);
+
+/**/
BGFX_C_API void bgfx_set_view_scissor(uint8_t _id, uint16_t _x, uint16_t _y, uint16_t _width, uint16_t _height);
/**/
@@ -672,12 +834,18 @@ BGFX_C_API void bgfx_set_view_transform_stereo(uint8_t _id, const void* _view, c
BGFX_C_API void bgfx_set_view_remap(uint8_t _id, uint8_t _num, const void* _remap);
/**/
+BGFX_C_API void bgfx_reset_view(uint8_t _id);
+
+/**/
BGFX_C_API void bgfx_set_marker(const char* _marker);
/**/
BGFX_C_API void bgfx_set_state(uint64_t _state, uint32_t _rgba);
/**/
+BGFX_C_API void bgfx_set_condition(bgfx_occlusion_query_handle_t _handle, bool _visible);
+
+/**/
BGFX_C_API void bgfx_set_stencil(uint32_t _fstencil, uint32_t _bstencil);
/**/
@@ -738,6 +906,9 @@ BGFX_C_API uint32_t bgfx_touch(uint8_t _id);
BGFX_C_API uint32_t bgfx_submit(uint8_t _id, bgfx_program_handle_t _handle, int32_t _depth);
/**/
+BGFX_C_API uint32_t bgfx_submit_occlusion_query(uint8_t _id, bgfx_program_handle_t _program, bgfx_occlusion_query_handle_t _occlusionQuery, int32_t _depth);
+
+/**/
BGFX_C_API uint32_t bgfx_submit_indirect(uint8_t _id, bgfx_program_handle_t _handle, bgfx_indirect_buffer_handle_t _indirectHandle, uint16_t _start, uint16_t _num, int32_t _depth);
/**/
@@ -774,6 +945,9 @@ BGFX_C_API void bgfx_discard();
BGFX_C_API void bgfx_blit(uint8_t _id, bgfx_texture_handle_t _dst, uint8_t _dstMip, uint16_t _dstX, uint16_t _dstY, uint16_t _dstZ, bgfx_texture_handle_t _src, uint8_t _srcMip, uint16_t _srcX, uint16_t _srcY, uint16_t _srcZ, uint16_t _width, uint16_t _height, uint16_t _depth);
/**/
+BGFX_C_API void bgfx_blit_frame_buffer(uint8_t _id, bgfx_texture_handle_t _dst, uint8_t _dstMip, uint16_t _dstX, uint16_t _dstY, uint16_t _dstZ, bgfx_frame_buffer_handle_t _src, uint8_t _attachment, uint8_t _srcMip, uint16_t _srcX, uint16_t _srcY, uint16_t _srcZ, uint16_t _width, uint16_t _height, uint16_t _depth);
+
+/**/
BGFX_C_API void bgfx_save_screen_shot(const char* _filePath);
#endif // BGFX_C99_H_HEADER_GUARD
diff --git a/3rdparty/bgfx/include/bgfx/c99/bgfxplatform.h b/3rdparty/bgfx/include/bgfx/c99/bgfxplatform.h
index 31c65bd6fd0..ff2125f18c4 100644
--- a/3rdparty/bgfx/include/bgfx/c99/bgfxplatform.h
+++ b/3rdparty/bgfx/include/bgfx/c99/bgfxplatform.h
@@ -1,5 +1,5 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
* License: https://github.com/bkaradzic/bgfx/blob/master/LICENSE
*
* vim: set tabstop=4 expandtab:
diff --git a/3rdparty/bgfx/makefile b/3rdparty/bgfx/makefile
index cfd80cbd4ef..f583e7891db 100644
--- a/3rdparty/bgfx/makefile
+++ b/3rdparty/bgfx/makefile
@@ -276,4 +276,8 @@ tools/bin/$(OS)/geometryc$(EXE): .build/projects/$(BUILD_PROJECT_DIR)
$(SILENT) $(MAKE) -C .build/projects/$(BUILD_PROJECT_DIR) -f geometryc.make config=$(BUILD_TOOLS_CONFIG)
$(SILENT) cp .build/$(BUILD_OUTPUT_DIR)/bin/geometryc$(BUILD_TOOLS_SUFFIX)$(EXE) $(@)
-tools: tools/bin/$(OS)/shaderc$(EXE) tools/bin/$(OS)/geometryc$(EXE)
+tools/bin/$(OS)/texturec$(EXE): .build/projects/$(BUILD_PROJECT_DIR)
+ $(SILENT) $(MAKE) -C .build/projects/$(BUILD_PROJECT_DIR) -f texturec.make config=$(BUILD_TOOLS_CONFIG)
+ $(SILENT) cp .build/$(BUILD_OUTPUT_DIR)/bin/texturec$(BUILD_TOOLS_SUFFIX)$(EXE) $(@)
+
+tools: tools/bin/$(OS)/shaderc$(EXE) tools/bin/$(OS)/geometryc$(EXE) tools/bin/$(OS)/texturec$(EXE)
diff --git a/3rdparty/bgfx/scripts/bgfx.lua b/3rdparty/bgfx/scripts/bgfx.lua
index a946155bdc8..ce2effb0f88 100644
--- a/3rdparty/bgfx/scripts/bgfx.lua
+++ b/3rdparty/bgfx/scripts/bgfx.lua
@@ -1,6 +1,6 @@
--
--- Copyright 2010-2015 Branimir Karadzic. All rights reserved.
--- License: http://www.opensource.org/licenses/BSD-2-Clause
+-- Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+-- License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
--
function bgfxProject(_name, _kind, _defines)
@@ -83,9 +83,9 @@ function bgfxProject(_name, _kind, _defines)
configuration { "osx" }
linkoptions {
"-framework Cocoa",
- "-framework Metal",
"-framework QuartzCore",
"-framework OpenGL",
+ "-weak_framework Metal",
}
configuration { "not nacl" }
diff --git a/3rdparty/bgfx/scripts/bgfx.pc b/3rdparty/bgfx/scripts/bgfx.pc
new file mode 100644
index 00000000000..f9cc3a0525f
--- /dev/null
+++ b/3rdparty/bgfx/scripts/bgfx.pc
@@ -0,0 +1,11 @@
+prefix=/usr/local
+exec_prefix=${prefix}
+includedir=${prefix}/include
+libdir=${exec_prefix}/lib
+
+Cflags: -I${includedir}
+Libs: -L${libdir} -lX11 -lGL -pthread -lrt -ldl
+
+Name: bgfx
+Description: Cross-platform, graphics API agnostic, "Bring Your Own Engine/Framework" style rendering library.
+Version: 1.0.0
diff --git a/3rdparty/bgfx/scripts/example-common.lua b/3rdparty/bgfx/scripts/example-common.lua
index 98dad9afc31..1832f9836ac 100644
--- a/3rdparty/bgfx/scripts/example-common.lua
+++ b/3rdparty/bgfx/scripts/example-common.lua
@@ -1,6 +1,6 @@
--
--- Copyright 2010-2015 Branimir Karadzic. All rights reserved.
--- License: http://www.opensource.org/licenses/BSD-2-Clause
+-- Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+-- License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
--
project ("example-common")
diff --git a/3rdparty/bgfx/scripts/genie.lua b/3rdparty/bgfx/scripts/genie.lua
index ce3e8d8e6d2..0696469ca1c 100644
--- a/3rdparty/bgfx/scripts/genie.lua
+++ b/3rdparty/bgfx/scripts/genie.lua
@@ -1,6 +1,6 @@
--
--- Copyright 2010-2015 Branimir Karadzic. All rights reserved.
--- License: http://www.opensource.org/licenses/BSD-2-Clause
+-- Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+-- License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
--
newoption {
@@ -24,6 +24,11 @@ newoption {
}
newoption {
+ trigger = "with-profiler",
+ description = "Enable build with intrusive profiler.",
+}
+
+newoption {
trigger = "with-scintilla",
description = "Enable building with Scintilla editor.",
}
@@ -65,6 +70,12 @@ local BGFX_BUILD_DIR = path.join(BGFX_DIR, ".build")
local BGFX_THIRD_PARTY_DIR = path.join(BGFX_DIR, "3rdparty")
BX_DIR = path.getabsolute(path.join(BGFX_DIR, "../bx"))
+if not os.isdir(BX_DIR) then
+ print("bx not found at " .. BX_DIR)
+ print("For more info see: https://bkaradzic.github.io/bgfx/build.html")
+ os.exit()
+end
+
defines {
"BX_CONFIG_ENABLE_MSVC_LEVEL4_WARNINGS=1"
}
@@ -85,6 +96,14 @@ if _OPTIONS["with-sdl"] then
end
end
+if _OPTIONS["with-profiler"] then
+ defines {
+ "ENTRY_CONFIG_PROFILER=1",
+ "BGFX_CONFIG_PROFILER_REMOTERY=1",
+ "_WINSOCKAPI_"
+ }
+end
+
function exampleProject(_name)
project ("example-" .. _name)
@@ -307,9 +326,9 @@ function exampleProject(_name)
configuration { "osx" }
linkoptions {
"-framework Cocoa",
- "-framework Metal",
"-framework QuartzCore",
"-framework OpenGL",
+ "-weak_framework Metal",
}
configuration { "ios* or tvos*" }
@@ -317,10 +336,10 @@ function exampleProject(_name)
linkoptions {
"-framework CoreFoundation",
"-framework Foundation",
- "-framework Metal",
"-framework OpenGLES",
"-framework UIKit",
"-framework QuartzCore",
+ "-weak_framework Metal",
}
configuration { "xcode4", "ios" }
@@ -381,6 +400,8 @@ exampleProject("21-deferred")
exampleProject("22-windows")
exampleProject("23-vectordisplay")
exampleProject("24-nbody")
+exampleProject("26-occlusion")
+exampleProject("27-terrain")
-- C99 source doesn't compile under WinRT settings
if not premake.vstudio.iswinrt() then
diff --git a/3rdparty/bgfx/scripts/geometryc.lua b/3rdparty/bgfx/scripts/geometryc.lua
index f83c95ba845..9caecd29da1 100644
--- a/3rdparty/bgfx/scripts/geometryc.lua
+++ b/3rdparty/bgfx/scripts/geometryc.lua
@@ -1,6 +1,6 @@
--
--- Copyright 2010-2015 Branimir Karadzic. All rights reserved.
--- License: http://www.opensource.org/licenses/BSD-2-Clause
+-- Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+-- License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
--
project "geometryc"
diff --git a/3rdparty/bgfx/scripts/makedisttex.lua b/3rdparty/bgfx/scripts/makedisttex.lua
index b208acdb32d..01705a08262 100644
--- a/3rdparty/bgfx/scripts/makedisttex.lua
+++ b/3rdparty/bgfx/scripts/makedisttex.lua
@@ -1,6 +1,6 @@
--
--- Copyright 2010-2015 Branimir Karadzic. All rights reserved.
--- License: http://www.opensource.org/licenses/BSD-2-Clause
+-- Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+-- License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
--
project "makedisttex"
diff --git a/3rdparty/bgfx/scripts/shaderc.lua b/3rdparty/bgfx/scripts/shaderc.lua
index 2824477afff..b2a5b5c54a0 100644
--- a/3rdparty/bgfx/scripts/shaderc.lua
+++ b/3rdparty/bgfx/scripts/shaderc.lua
@@ -1,6 +1,6 @@
--
--- Copyright 2010-2015 Branimir Karadzic. All rights reserved.
--- License: http://www.opensource.org/licenses/BSD-2-Clause
+-- Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+-- License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
--
project "shaderc"
diff --git a/3rdparty/bgfx/scripts/texturec.lua b/3rdparty/bgfx/scripts/texturec.lua
index 729e545dd91..8b9beed609e 100644
--- a/3rdparty/bgfx/scripts/texturec.lua
+++ b/3rdparty/bgfx/scripts/texturec.lua
@@ -1,6 +1,6 @@
--
--- Copyright 2010-2015 Branimir Karadzic. All rights reserved.
--- License: http://www.opensource.org/licenses/BSD-2-Clause
+-- Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+-- License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
--
project "texturec"
@@ -11,10 +11,22 @@ project "texturec"
path.join(BX_DIR, "include"),
path.join(BGFX_DIR, "include"),
path.join(BGFX_DIR, "src"),
+ path.join(BGFX_DIR, "3rdparty"),
+ path.join(BGFX_DIR, "3rdparty/nvtt"),
}
files {
path.join(BGFX_DIR, "src/image.*"),
+ path.join(BGFX_DIR, "3rdparty/libsquish/**.cpp"),
+ path.join(BGFX_DIR, "3rdparty/libsquish/**.h"),
+ path.join(BGFX_DIR, "3rdparty/etc1/**.cpp"),
+ path.join(BGFX_DIR, "3rdparty/etc1/**.h"),
+ path.join(BGFX_DIR, "3rdparty/nvtt/**.cpp"),
+ path.join(BGFX_DIR, "3rdparty/nvtt/**.h"),
+ path.join(BGFX_DIR, "3rdparty/pvrtc/**.cpp"),
+ path.join(BGFX_DIR, "3rdparty/pvrtc/**.h"),
+ path.join(BGFX_DIR, "3rdparty/tinyexr/**.cc"),
+ path.join(BGFX_DIR, "3rdparty/tinyexr/**.h"),
path.join(BGFX_DIR, "tools/texturec/**.cpp"),
path.join(BGFX_DIR, "tools/texturec/**.h"),
}
diff --git a/3rdparty/bgfx/scripts/tools.mk b/3rdparty/bgfx/scripts/tools.mk
index 749cb742eca..fec2885b7be 100644
--- a/3rdparty/bgfx/scripts/tools.mk
+++ b/3rdparty/bgfx/scripts/tools.mk
@@ -24,3 +24,4 @@ endif
SHADERC:="$(THISDIR)../tools/bin/$(OS)/shaderc"
GEOMETRYC:="$(THISDIR)../tools/bin/$(OS)/geometryc"
+TEXTUREC:="$(THISDIR)../tools/bin/$(OS)/texturec"
diff --git a/3rdparty/bgfx/src/amalgamated.cpp b/3rdparty/bgfx/src/amalgamated.cpp
index 042475d8151..d98dd37ddab 100644
--- a/3rdparty/bgfx/src/amalgamated.cpp
+++ b/3rdparty/bgfx/src/amalgamated.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "bgfx.cpp"
diff --git a/3rdparty/bgfx/src/amalgamated.mm b/3rdparty/bgfx/src/amalgamated.mm
index 6781cf9f843..7e0534b5e4e 100644
--- a/3rdparty/bgfx/src/amalgamated.mm
+++ b/3rdparty/bgfx/src/amalgamated.mm
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "amalgamated.cpp"
diff --git a/3rdparty/bgfx/src/bgfx.cpp b/3rdparty/bgfx/src/bgfx.cpp
index 51b52b03720..a6882850ba9 100644
--- a/3rdparty/bgfx/src/bgfx.cpp
+++ b/3rdparty/bgfx/src/bgfx.cpp
@@ -1,10 +1,23 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
+#include <bx/platform.h>
+#if BX_PLATFORM_WINDOWS
+// BK - Remotery needs WinSock, but on VS2015/Win10 build
+// fails if WinSock2 is included after Windows.h?!
+# include <winsock2.h>
+#endif // BX_PLATFORM_WINDOWS
+
#include "bgfx_p.h"
+#if BGFX_CONFIG_PROFILER_REMOTERY_BUILD_LIB
+# define RMT_USE_D3D11 BGFX_CONFIG_RENDERER_DIRECT3D11
+# define RMT_USE_OPENGL BGFX_CONFIG_RENDERER_OPENGL
+# include <remotery/lib/Remotery.c>
+#endif // BGFX_CONFIG_PROFILER_REMOTERY_BUILD_LIB
+
namespace bgfx
{
#define BGFX_MAIN_THREAD_MAGIC UINT32_C(0x78666762)
@@ -19,6 +32,11 @@ namespace bgfx
# define BGFX_CHECK_RENDER_THREAD()
#endif // BGFX_CONFIG_MULTITHREADED
+#define BGFX_CHECK_CAPS(_caps, _msg) \
+ BX_CHECK(0 != (g_caps.supported & (_caps) ) \
+ , _msg " Use bgfx::getCaps to check " #_caps " backend renderer capabilities." \
+ );
+
#if BGFX_CONFIG_USE_TINYSTL
void* TinyStlAllocator::static_allocate(size_t _bytes)
{
@@ -120,7 +138,7 @@ namespace bgfx
# define BGFX_CONFIG_MEMORY_TRACKING (BGFX_CONFIG_DEBUG && BX_CONFIG_SUPPORTS_THREADING)
#endif // BGFX_CONFIG_MEMORY_TRACKING
- class AllocatorStub : public bx::ReallocatorI
+ class AllocatorStub : public bx::AllocatorI
{
public:
AllocatorStub()
@@ -131,49 +149,50 @@ namespace bgfx
{
}
- virtual void* alloc(size_t _size, size_t _align, const char* _file, uint32_t _line) BX_OVERRIDE
+ virtual void* realloc(void* _ptr, size_t _size, size_t _align, const char* _file, uint32_t _line) BX_OVERRIDE
{
- if (BX_CONFIG_ALLOCATOR_NATURAL_ALIGNMENT >= _align)
+ if (0 == _size)
{
-#if BGFX_CONFIG_MEMORY_TRACKING
+ if (NULL != _ptr)
{
- bx::LwMutexScope scope(m_mutex);
- ++m_numBlocks;
- m_maxBlocks = bx::uint32_max(m_maxBlocks, m_numBlocks);
- }
+ if (BX_CONFIG_ALLOCATOR_NATURAL_ALIGNMENT >= _align)
+ {
+#if BGFX_CONFIG_MEMORY_TRACKING
+ {
+ bx::LwMutexScope scope(m_mutex);
+ BX_CHECK(m_numBlocks > 0, "Number of blocks is 0. Possible alloc/free mismatch?");
+ --m_numBlocks;
+ }
#endif // BGFX_CONFIG_MEMORY_TRACKING
- return ::malloc(_size);
- }
-
- return bx::alignedAlloc(this, _size, _align, _file, _line);
- }
+ ::free(_ptr);
+ }
+ else
+ {
+ bx::alignedFree(this, _ptr, _align, _file, _line);
+ }
+ }
- virtual void free(void* _ptr, size_t _align, const char* _file, uint32_t _line) BX_OVERRIDE
- {
- if (NULL != _ptr)
+ return NULL;
+ }
+ else if (NULL == _ptr)
{
if (BX_CONFIG_ALLOCATOR_NATURAL_ALIGNMENT >= _align)
{
#if BGFX_CONFIG_MEMORY_TRACKING
{
bx::LwMutexScope scope(m_mutex);
- BX_CHECK(m_numBlocks > 0, "Number of blocks is 0. Possible alloc/free mismatch?");
- --m_numBlocks;
+ ++m_numBlocks;
+ m_maxBlocks = bx::uint32_max(m_maxBlocks, m_numBlocks);
}
#endif // BGFX_CONFIG_MEMORY_TRACKING
- ::free(_ptr);
- }
- else
- {
- bx::alignedFree(this, _ptr, _align, _file, _line);
+ return ::malloc(_size);
}
+
+ return bx::alignedAlloc(this, _size, _align, _file, _line);
}
- }
- virtual void* realloc(void* _ptr, size_t _size, size_t _align, const char* _file, uint32_t _line) BX_OVERRIDE
- {
if (BX_CONFIG_ALLOCATOR_NATURAL_ALIGNMENT >= _align)
{
#if BGFX_CONFIG_MEMORY_TRACKING
@@ -206,7 +225,7 @@ namespace bgfx
static bool s_graphicsDebuggerPresent = false;
CallbackI* g_callback = NULL;
- bx::ReallocatorI* g_allocator = NULL;
+ bx::AllocatorI* g_allocator = NULL;
Caps g_caps;
@@ -322,9 +341,15 @@ namespace bgfx
{
va_list argList;
va_start(argList, _format);
- g_callback->traceVargs(_filePath, _line, _format, argList);
+ if (NULL == g_callback)
+ {
+ dbgPrintfVargs(_format, argList);
+ }
+ else
+ {
+ g_callback->traceVargs(_filePath, _line, _format, argList);
+ }
va_end(argList);
-
}
#include "charset.h"
@@ -349,7 +374,7 @@ namespace bgfx
static const uint32_t numCharsPerBatch = 1024;
static const uint32_t numBatchVertices = numCharsPerBatch*4;
- static const uint32_t numBatchIndices = numCharsPerBatch*6;
+ static const uint32_t numBatchIndices = numCharsPerBatch*6;
void TextVideoMemBlitter::init()
{
@@ -762,7 +787,7 @@ namespace bgfx
return PredefinedUniform::Count;
}
- uint32_t Frame::submit(uint8_t _id, ProgramHandle _handle, int32_t _depth)
+ uint32_t Frame::submit(uint8_t _id, ProgramHandle _program, OcclusionQueryHandle _occlusionQuery, int32_t _depth)
{
if (m_discard)
{
@@ -779,9 +804,9 @@ namespace bgfx
m_uniformEnd = m_uniformBuffer->getPos();
- m_key.m_program = invalidHandle == _handle.idx
+ m_key.m_program = invalidHandle == _program.idx
? 0
- : _handle.idx
+ : _program.idx
;
m_key.m_depth = (uint32_t)_depth;
@@ -796,13 +821,22 @@ namespace bgfx
m_draw.m_constBegin = m_uniformBegin;
m_draw.m_constEnd = m_uniformEnd;
- m_draw.m_flags |= m_flags;
+ m_draw.m_stateFlags |= m_stateFlags;
+
+ if (isValid(_occlusionQuery) )
+ {
+ BX_CHECK(!isValid(m_draw.m_occlusionQuery), "");
+
+ m_draw.m_stateFlags |= BGFX_STATE_INTERNAL_OCCLUSION_QUERY;
+ m_draw.m_occlusionQuery = _occlusionQuery;
+ }
+
m_renderItem[m_numRenderItems].draw = m_draw;
++m_numRenderItems;
m_draw.clear();
m_uniformBegin = m_uniformEnd;
- m_flags = BGFX_STATE_NONE;
+ m_stateFlags = BGFX_STATE_NONE;
return m_num;
}
@@ -854,27 +888,34 @@ namespace bgfx
void Frame::blit(uint8_t _id, TextureHandle _dst, uint8_t _dstMip, uint16_t _dstX, uint16_t _dstY, uint16_t _dstZ, TextureHandle _src, uint8_t _srcMip, uint16_t _srcX, uint16_t _srcY, uint16_t _srcZ, uint16_t _width, uint16_t _height, uint16_t _depth)
{
- uint16_t item = m_numBlitItems++;
-
- BlitItem& bi = m_blitItem[item];
- bi.m_srcX = _srcX;
- bi.m_srcY = _srcY;
- bi.m_srcZ = _srcZ;
- bi.m_dstX = _dstX;
- bi.m_dstY = _dstY;
- bi.m_dstZ = _dstZ;
- bi.m_width = _width;
- bi.m_height = _height;
- bi.m_depth = _depth;
- bi.m_srcMip = _srcMip;
- bi.m_dstMip = _dstMip;
- bi.m_src = _src;
- bi.m_dst = _dst;
-
- BlitKey key;
- key.m_view = _id;
- key.m_item = item;
- m_blitKeys[item] = key.encode();
+ BX_WARN(m_numBlitItems < BGFX_CONFIG_MAX_BLIT_ITEMS
+ , "Exceed number of available blit items per frame. BGFX_CONFIG_MAX_BLIT_ITEMS is %d. Skipping blit."
+ , BGFX_CONFIG_MAX_BLIT_ITEMS
+ );
+ if (m_numBlitItems < BGFX_CONFIG_MAX_BLIT_ITEMS)
+ {
+ uint16_t item = m_numBlitItems++;
+
+ BlitItem& bi = m_blitItem[item];
+ bi.m_srcX = _srcX;
+ bi.m_srcY = _srcY;
+ bi.m_srcZ = _srcZ;
+ bi.m_dstX = _dstX;
+ bi.m_dstY = _dstY;
+ bi.m_dstZ = _dstZ;
+ bi.m_width = _width;
+ bi.m_height = _height;
+ bi.m_depth = _depth;
+ bi.m_srcMip = _srcMip;
+ bi.m_dstMip = _dstMip;
+ bi.m_src = _src;
+ bi.m_dst = _dst;
+
+ BlitKey key;
+ key.m_view = _id;
+ key.m_item = item;
+ m_blitKeys[item] = key.encode();
+ }
}
void Frame::sort()
@@ -979,6 +1020,7 @@ namespace bgfx
CAPS_FLAGS(BGFX_CAPS_HIDPI),
CAPS_FLAGS(BGFX_CAPS_TEXTURE_BLIT),
CAPS_FLAGS(BGFX_CAPS_TEXTURE_READ_BACK),
+ CAPS_FLAGS(BGFX_CAPS_OCCLUSION_QUERY),
#undef CAPS_FLAGS
};
@@ -1246,6 +1288,7 @@ namespace bgfx
CHECK_HANDLE_LEAK(m_textureHandle);
CHECK_HANDLE_LEAK(m_frameBufferHandle);
CHECK_HANDLE_LEAK(m_uniformHandle);
+ CHECK_HANDLE_LEAK(m_occlusionQueryHandle);
#undef CHECK_HANDLE_LEAK
}
}
@@ -1312,6 +1355,12 @@ namespace bgfx
{
BX_CHECK(0 == m_instBufferCount, "Instance buffer allocated, but not used. This is incorrect, and causes memory leak.");
+ if (BX_ENABLED(BGFX_CONFIG_DEBUG_OCCLUSION) )
+ {
+ m_occlusionQuerySet.clear();
+ }
+
+ BGFX_PROFILER_SCOPE(bgfx, main_thread_frame, 0xff2040ff);
// wait for render thread to finish
renderSemWait();
frameNoRenderWait();
@@ -1331,7 +1380,7 @@ namespace bgfx
{
freeDynamicBuffers();
m_submit->m_resolution = m_resolution;
- m_resolution.m_flags &= ~BGFX_RESET_FORCE;
+ m_resolution.m_flags &= ~BGFX_RESET_INTERNAL_FORCE;
m_submit->m_debug = m_debug;
memcpy(m_submit->m_viewRemap, m_viewRemap, sizeof(m_viewRemap) );
@@ -1351,6 +1400,8 @@ namespace bgfx
bx::xchg(m_render, m_submit);
+ memcpy(m_render->m_occlusion, m_submit->m_occlusion, sizeof(m_submit->m_occlusion) );
+
if (!BX_ENABLED(BGFX_CONFIG_MULTITHREADED)
|| m_singleThreaded)
{
@@ -1385,8 +1436,10 @@ namespace bgfx
bool Context::renderFrame()
{
+ BGFX_PROFILER_SCOPE(bgfx, render_frame, 0xff2040ff);
+
if (m_rendererInitialized
- && !m_flipAfterRender)
+ && !m_flipAfterRender)
{
m_renderCtx->flip(m_render->m_hmd);
}
@@ -1396,6 +1449,7 @@ namespace bgfx
rendererExecCommands(m_render->m_cmdPre);
if (m_rendererInitialized)
{
+ BGFX_PROFILER_SCOPE(bgfx, render_submit, 0xff2040ff);
m_renderCtx->submit(m_render, m_clearQuad, m_textVideoMemBlitter);
}
rendererExecCommands(m_render->m_cmdPost);
@@ -2245,7 +2299,7 @@ again:
return s_rendererCreator[_type].name;
}
- bool init(RendererType::Enum _type, uint16_t _vendorId, uint16_t _deviceId, CallbackI* _callback, bx::ReallocatorI* _allocator)
+ bool init(RendererType::Enum _type, uint16_t _vendorId, uint16_t _deviceId, CallbackI* _callback, bx::AllocatorI* _allocator)
{
BX_CHECK(NULL == s_ctx, "bgfx is already initialized.");
@@ -2349,6 +2403,7 @@ again:
void reset(uint32_t _width, uint32_t _height, uint32_t _flags)
{
BGFX_CHECK_MAIN_THREAD();
+ BX_CHECK(0 == (_flags&BGFX_RESET_RESERVED_MASK), "Do not set reset reserved flags!");
s_ctx->reset(_width, _height, _flags);
}
@@ -2580,7 +2635,11 @@ again:
BGFX_CHECK_MAIN_THREAD();
BX_CHECK(NULL != _tib, "_tib can't be NULL");
BX_CHECK(0 < _num, "Requesting 0 indices.");
- return s_ctx->allocTransientIndexBuffer(_tib, _num);
+ s_ctx->allocTransientIndexBuffer(_tib, _num);
+ BX_CHECK(_num == _tib->size/2, "Failed to allocate transient index buffer (requested %d, available %d). Use bgfx::checkAvailTransient* functions to ensure availability."
+ , _num
+ , _tib->size/2
+ );
}
void allocTransientVertexBuffer(TransientVertexBuffer* _tvb, uint32_t _num, const VertexDecl& _decl)
@@ -2590,7 +2649,11 @@ again:
BX_CHECK(0 < _num, "Requesting 0 vertices.");
BX_CHECK(UINT16_MAX >= _num, "Requesting %d vertices (max: %d).", _num, UINT16_MAX);
BX_CHECK(0 != _decl.m_stride, "Invalid VertexDecl.");
- return s_ctx->allocTransientVertexBuffer(_tvb, _num, _decl);
+ s_ctx->allocTransientVertexBuffer(_tvb, _num, _decl);
+ BX_CHECK(_num == _tvb->size / _decl.m_stride, "Failed to allocate transient vertex buffer (requested %d, available %d). Use bgfx::checkAvailTransient* functions to ensure availability."
+ , _num
+ , _tvb->size / _decl.m_stride
+ );
}
bool allocTransientBuffers(bgfx::TransientVertexBuffer* _tvb, const bgfx::VertexDecl& _decl, uint32_t _numVertices, bgfx::TransientIndexBuffer* _tib, uint32_t _numIndices)
@@ -2608,9 +2671,14 @@ again:
const InstanceDataBuffer* allocInstanceDataBuffer(uint32_t _num, uint16_t _stride)
{
BGFX_CHECK_MAIN_THREAD();
- BX_CHECK(0 != (g_caps.supported & BGFX_CAPS_INSTANCING), "Instancing is not supported! Use bgfx::getCaps to check backend renderer capabilities.");
+ BGFX_CHECK_CAPS(BGFX_CAPS_INSTANCING, "Instancing is not supported!");
BX_CHECK(0 < _num, "Requesting 0 instanced data vertices.");
- return s_ctx->allocInstanceDataBuffer(_num, _stride);
+ const InstanceDataBuffer* idb = s_ctx->allocInstanceDataBuffer(_num, _stride);
+ BX_CHECK(_num == idb->size / _stride, "Failed to allocate instance data buffer (requested %d, available %d). Use bgfx::checkAvailTransient* functions to ensure availability."
+ , _num
+ , idb->size / _stride
+ );
+ return idb;
}
IndirectBufferHandle createIndirectBuffer(uint32_t _num)
@@ -2738,6 +2806,10 @@ again:
TextureHandle createTexture2D(BackbufferRatio::Enum _ratio, uint16_t _width, uint16_t _height, uint8_t _numMips, TextureFormat::Enum _format, uint32_t _flags, const Memory* _mem)
{
BGFX_CHECK_MAIN_THREAD();
+ BX_CHECK(0 != (g_caps.formats[_format] & (BGFX_CAPS_FORMAT_TEXTURE_2D|BGFX_CAPS_FORMAT_TEXTURE_2D_EMULATED|BGFX_CAPS_FORMAT_TEXTURE_2D_SRGB) )
+ , "Format %s is not supported for 2D texture. Use bgfx::getCaps to check available texture formats."
+ , getName(_format)
+ );
_numMips = uint8_t(bx::uint32_max(1, _numMips) );
@@ -2797,8 +2869,10 @@ again:
TextureHandle createTexture3D(uint16_t _width, uint16_t _height, uint16_t _depth, uint8_t _numMips, TextureFormat::Enum _format, uint32_t _flags, const Memory* _mem)
{
BGFX_CHECK_MAIN_THREAD();
- BX_CHECK(0 != (g_caps.supported & BGFX_CAPS_TEXTURE_3D)
- , "Texture3D is not supported! Use bgfx::getCaps to check BGFX_CAPS_TEXTURE_3D backend renderer capabilities."
+ BGFX_CHECK_CAPS(BGFX_CAPS_TEXTURE_3D, "Texture3D is not supported!");
+ BX_CHECK(0 != (g_caps.formats[_format] & (BGFX_CAPS_FORMAT_TEXTURE_3D|BGFX_CAPS_FORMAT_TEXTURE_3D_EMULATED|BGFX_CAPS_FORMAT_TEXTURE_3D_SRGB) )
+ , "Format %s is not supported for 3D texture. Use bgfx::getCaps to check available texture formats."
+ , getName(_format)
);
_numMips = uint8_t(bx::uint32_max(1, _numMips) );
@@ -2840,6 +2914,10 @@ again:
TextureHandle createTextureCube(uint16_t _size, uint8_t _numMips, TextureFormat::Enum _format, uint32_t _flags, const Memory* _mem)
{
BGFX_CHECK_MAIN_THREAD();
+ BX_CHECK(0 != (g_caps.formats[_format] & (BGFX_CAPS_FORMAT_TEXTURE_CUBE|BGFX_CAPS_FORMAT_TEXTURE_CUBE_EMULATED|BGFX_CAPS_FORMAT_TEXTURE_CUBE_SRGB) )
+ , "Format %s is not supported for cube texture. Use bgfx::getCaps to check available texture formats."
+ , getName(_format)
+ );
_numMips = uint8_t(bx::uint32_max(1, _numMips) );
@@ -2902,12 +2980,11 @@ again:
{
BGFX_CHECK_MAIN_THREAD();
BX_CHECK(NULL != _mem, "_mem can't be NULL");
- BX_CHECK(0 != (g_caps.supported & BGFX_CAPS_TEXTURE_3D)
- , "Texture3D is not supported! Use bgfx::getCaps to check BGFX_CAPS_TEXTURE_3D backend renderer capabilities."
- );
- if (_width == 0
- || _height == 0
- || _depth == 0)
+ BGFX_CHECK_CAPS(BGFX_CAPS_TEXTURE_3D, "Texture3D is not supported!");
+
+ if (0 == _width
+ || 0 == _height
+ || 0 == _depth)
{
release(_mem);
}
@@ -2922,8 +2999,8 @@ again:
BGFX_CHECK_MAIN_THREAD();
BX_CHECK(NULL != _mem, "_mem can't be NULL");
BX_CHECK(_side <= 5, "Invalid side %d.", _side);
- if (_width == 0
- || _height == 0)
+ if (0 == _width
+ || 0 == _height)
{
release(_mem);
}
@@ -2937,9 +3014,7 @@ again:
{
BGFX_CHECK_MAIN_THREAD();
BX_CHECK(NULL != _data, "_data can't be NULL");
- BX_CHECK(0 != (g_caps.supported & BGFX_CAPS_TEXTURE_READ_BACK)
- , "Texture read-back is not supported! Use bgfx::getCaps to check BGFX_CAPS_TEXTURE_READ_BACK backend renderer capabilities."
- );
+ BGFX_CHECK_CAPS(BGFX_CAPS_TEXTURE_READ_BACK, "Texture read-back is not supported!");
s_ctx->readTexture(_handle, _data);
}
@@ -2947,9 +3022,7 @@ again:
{
BGFX_CHECK_MAIN_THREAD();
BX_CHECK(NULL != _data, "_data can't be NULL");
- BX_CHECK(0 != (g_caps.supported & BGFX_CAPS_TEXTURE_READ_BACK)
- , "Texture read-back is not supported! Use bgfx::getCaps to check BGFX_CAPS_TEXTURE_READ_BACK backend renderer capabilities."
- );
+ BGFX_CHECK_CAPS(BGFX_CAPS_TEXTURE_READ_BACK, "Texture read-back is not supported!");
s_ctx->readTexture(_handle, _attachment, _data);
}
@@ -3004,6 +3077,27 @@ again:
s_ctx->destroyUniform(_handle);
}
+ OcclusionQueryHandle createOcclusionQuery()
+ {
+ BGFX_CHECK_MAIN_THREAD();
+ BGFX_CHECK_CAPS(BGFX_CAPS_OCCLUSION_QUERY, "Occlusion query is not supported!");
+ return s_ctx->createOcclusionQuery();
+ }
+
+ OcclusionQueryResult::Enum getResult(OcclusionQueryHandle _handle)
+ {
+ BGFX_CHECK_MAIN_THREAD();
+ BGFX_CHECK_CAPS(BGFX_CAPS_OCCLUSION_QUERY, "Occlusion query is not supported!");
+ return s_ctx->getResult(_handle);
+ }
+
+ void destroyOcclusionQuery(OcclusionQueryHandle _handle)
+ {
+ BGFX_CHECK_MAIN_THREAD();
+ BGFX_CHECK_CAPS(BGFX_CAPS_OCCLUSION_QUERY, "Occlusion query is not supported!");
+ s_ctx->destroyOcclusionQuery(_handle);
+ }
+
void setPaletteColor(uint8_t _index, uint32_t _rgba)
{
BGFX_CHECK_MAIN_THREAD();
@@ -3133,9 +3227,17 @@ again:
void setState(uint64_t _state, uint32_t _rgba)
{
BGFX_CHECK_MAIN_THREAD();
+ BX_CHECK(0 == (_state&BGFX_STATE_RESERVED_MASK), "Do not set state reserved flags!");
s_ctx->setState(_state, _rgba);
}
+ void setCondition(OcclusionQueryHandle _handle, bool _visible)
+ {
+ BGFX_CHECK_MAIN_THREAD();
+ BGFX_CHECK_CAPS(BGFX_CAPS_OCCLUSION_QUERY, "Occlusion query is not supported!");
+ s_ctx->setCondition(_handle, _visible);
+ }
+
void setStencil(uint32_t _fstencil, uint32_t _bstencil)
{
BGFX_CHECK_MAIN_THREAD();
@@ -3269,16 +3371,27 @@ again:
return submit(_id, handle);
}
- uint32_t submit(uint8_t _id, ProgramHandle _handle, int32_t _depth)
+ uint32_t submit(uint8_t _id, ProgramHandle _program, int32_t _depth)
+ {
+ OcclusionQueryHandle handle = BGFX_INVALID_HANDLE;
+ return submit(_id, _program, handle, _depth);
+ }
+
+ uint32_t submit(uint8_t _id, ProgramHandle _program, OcclusionQueryHandle _occlusionQuery, int32_t _depth)
{
BGFX_CHECK_MAIN_THREAD();
- return s_ctx->submit(_id, _handle, _depth);
+ BX_CHECK(false
+ || !isValid(_occlusionQuery)
+ || 0 != (g_caps.supported & BGFX_CAPS_OCCLUSION_QUERY)
+ , "Occlusion query is not supported! Use bgfx::getCaps to check BGFX_CAPS_OCCLUSION_QUERY backend renderer capabilities."
+ );
+ return s_ctx->submit(_id, _program, _occlusionQuery, _depth);
}
- uint32_t submit(uint8_t _id, ProgramHandle _handle, IndirectBufferHandle _indirectHandle, uint16_t _start, uint16_t _num, int32_t _depth)
+ uint32_t submit(uint8_t _id, ProgramHandle _program, IndirectBufferHandle _indirectHandle, uint16_t _start, uint16_t _num, int32_t _depth)
{
BGFX_CHECK_MAIN_THREAD();
- return s_ctx->submit(_id, _handle, _indirectHandle, _start, _num, _depth);
+ return s_ctx->submit(_id, _program, _indirectHandle, _start, _num, _depth);
}
void setBuffer(uint8_t _stage, IndexBufferHandle _handle, Access::Enum _access)
@@ -3354,18 +3467,14 @@ again:
void blit(uint8_t _id, TextureHandle _dst, uint8_t _dstMip, uint16_t _dstX, uint16_t _dstY, uint16_t _dstZ, TextureHandle _src, uint8_t _srcMip, uint16_t _srcX, uint16_t _srcY, uint16_t _srcZ, uint16_t _width, uint16_t _height, uint16_t _depth)
{
BGFX_CHECK_MAIN_THREAD();
- BX_CHECK(0 != (g_caps.supported & BGFX_CAPS_TEXTURE_BLIT)
- , "Texture blit is not supported, use bgfx::getCaps to test BGFX_CAPS_TEXTURE_BLIT feature availability"
- );
+ BGFX_CHECK_CAPS(BGFX_CAPS_TEXTURE_BLIT, "Texture blit is not supported!");
s_ctx->blit(_id, _dst, _dstMip, _dstX, _dstY, _dstZ, _src, _srcMip, _srcX, _srcY, _srcZ, _width, _height, _depth);
}
void blit(uint8_t _id, TextureHandle _dst, uint8_t _dstMip, uint16_t _dstX, uint16_t _dstY, uint16_t _dstZ, FrameBufferHandle _src, uint8_t _attachment, uint8_t _srcMip, uint16_t _srcX, uint16_t _srcY, uint16_t _srcZ, uint16_t _width, uint16_t _height, uint16_t _depth)
{
BGFX_CHECK_MAIN_THREAD();
- BX_CHECK(0 != (g_caps.supported & BGFX_CAPS_TEXTURE_BLIT)
- , "Texture blit is not supported! Use bgfx::getCaps to check BGFX_CAPS_TEXTURE_BLIT backend renderer capabilities."
- );
+ BGFX_CHECK_CAPS(BGFX_CAPS_TEXTURE_BLIT, "Texture blit is not supported!");
s_ctx->blit(_id, _dst, _dstMip, _dstX, _dstY, _dstZ, _src, _attachment, _srcMip, _srcX, _srcY, _srcZ, _width, _height, _depth);
}
@@ -3452,29 +3561,19 @@ namespace bgfx
bgfx_callback_interface_t* m_interface;
};
- class AllocatorC99 : public bx::ReallocatorI
+ class AllocatorC99 : public bx::AllocatorI
{
public:
virtual ~AllocatorC99()
{
}
- virtual void* alloc(size_t _size, size_t _align, const char* _file, uint32_t _line) BX_OVERRIDE
- {
- return m_interface->vtbl->alloc(m_interface, _size, _align, _file, _line);
- }
-
- virtual void free(void* _ptr, size_t _align, const char* _file, uint32_t _line) BX_OVERRIDE
- {
- m_interface->vtbl->free(m_interface, _ptr, _align, _file, _line);
- }
-
virtual void* realloc(void* _ptr, size_t _size, size_t _align, const char* _file, uint32_t _line) BX_OVERRIDE
{
return m_interface->vtbl->realloc(m_interface, _ptr, _size, _align, _file, _line);
}
- bgfx_reallocator_interface_t* m_interface;
+ bgfx_allocator_interface_t* m_interface;
};
} // namespace bgfx
@@ -3553,7 +3652,7 @@ BGFX_C_API const char* bgfx_get_renderer_name(bgfx_renderer_type_t _type)
return bgfx::getRendererName(bgfx::RendererType::Enum(_type) );
}
-BGFX_C_API bool bgfx_init(bgfx_renderer_type_t _type, uint16_t _vendorId, uint16_t _deviceId, bgfx_callback_interface_t* _callback, bgfx_reallocator_interface_t* _allocator)
+BGFX_C_API bool bgfx_init(bgfx_renderer_type_t _type, uint16_t _vendorId, uint16_t _deviceId, bgfx_callback_interface_t* _callback, bgfx_allocator_interface_t* _allocator)
{
static bgfx::CallbackC99 s_callback;
s_callback.m_interface = _callback;
@@ -3887,6 +3986,18 @@ BGFX_C_API void bgfx_update_texture_cube(bgfx_texture_handle_t _handle, uint8_t
bgfx::updateTextureCube(handle.cpp, _side, _mip, _x, _y, _width, _height, (const bgfx::Memory*)_mem, _pitch);
}
+BGFX_C_API void bgfx_read_texture(bgfx_texture_handle_t _handle, void* _data)
+{
+ union { bgfx_texture_handle_t c; bgfx::TextureHandle cpp; } handle = { _handle };
+ bgfx::readTexture(handle.cpp, _data);
+}
+
+BGFX_C_API void bgfx_read_frame_buffer(bgfx_frame_buffer_handle_t _handle, uint8_t _attachment, void* _data)
+{
+ union { bgfx_frame_buffer_handle_t c; bgfx::FrameBufferHandle cpp; } handle = { _handle };
+ bgfx::readTexture(handle.cpp, _attachment, _data);
+}
+
BGFX_C_API void bgfx_destroy_texture(bgfx_texture_handle_t _handle)
{
union { bgfx_texture_handle_t c; bgfx::TextureHandle cpp; } handle = { _handle };
@@ -3940,6 +4051,25 @@ BGFX_C_API void bgfx_destroy_uniform(bgfx_uniform_handle_t _handle)
bgfx::destroyUniform(handle.cpp);
}
+BGFX_C_API bgfx_occlusion_query_handle_t bgfx_create_occlusion_query()
+{
+ union { bgfx_occlusion_query_handle_t c; bgfx::OcclusionQueryHandle cpp; } handle;
+ handle.cpp = bgfx::createOcclusionQuery();
+ return handle.c;
+}
+
+BGFX_C_API bgfx_occlusion_query_result_t bgfx_get_result(bgfx_occlusion_query_handle_t _handle)
+{
+ union { bgfx_occlusion_query_handle_t c; bgfx::OcclusionQueryHandle cpp; } handle = { _handle };
+ return bgfx_occlusion_query_result_t(bgfx::getResult(handle.cpp) );
+}
+
+BGFX_C_API void bgfx_destroy_occlusion_query(bgfx_occlusion_query_handle_t _handle)
+{
+ union { bgfx_occlusion_query_handle_t c; bgfx::OcclusionQueryHandle cpp; } handle = { _handle };
+ bgfx::destroyOcclusionQuery(handle.cpp);
+}
+
BGFX_C_API void bgfx_set_palette_color(uint8_t _index, const float _rgba[4])
{
bgfx::setPaletteColor(_index, _rgba);
@@ -3955,6 +4085,11 @@ BGFX_C_API void bgfx_set_view_rect(uint8_t _id, uint16_t _x, uint16_t _y, uint16
bgfx::setViewRect(_id, _x, _y, _width, _height);
}
+BGFX_C_API void bgfx_set_view_rect_auto(uint8_t _id, uint16_t _x, uint16_t _y, bgfx_backbuffer_ratio_t _ratio)
+{
+ bgfx::setViewRect(_id, _x, _y, bgfx::BackbufferRatio::Enum(_ratio));
+}
+
BGFX_C_API void bgfx_set_view_scissor(uint8_t _id, uint16_t _x, uint16_t _y, uint16_t _width, uint16_t _height)
{
bgfx::setViewScissor(_id, _x, _y, _width, _height);
@@ -4011,6 +4146,12 @@ BGFX_C_API void bgfx_set_state(uint64_t _state, uint32_t _rgba)
bgfx::setState(_state, _rgba);
}
+BGFX_C_API void bgfx_set_condition(bgfx_occlusion_query_handle_t _handle, bool _visible)
+{
+ union { bgfx_occlusion_query_handle_t c; bgfx::OcclusionQueryHandle cpp; } handle = { _handle };
+ bgfx::setCondition(handle.cpp, _visible);
+}
+
BGFX_C_API void bgfx_set_stencil(uint32_t _fstencil, uint32_t _bstencil)
{
bgfx::setStencil(_fstencil, _bstencil);
@@ -4123,6 +4264,13 @@ BGFX_C_API uint32_t bgfx_submit(uint8_t _id, bgfx_program_handle_t _handle, int3
return bgfx::submit(_id, handle.cpp, _depth);
}
+BGFX_C_API uint32_t bgfx_submit_occlusion_query(uint8_t _id, bgfx_program_handle_t _program, bgfx_occlusion_query_handle_t _occlusionQuery, int32_t _depth)
+{
+ union { bgfx_program_handle_t c; bgfx::ProgramHandle cpp; } program = { _program };
+ union { bgfx_occlusion_query_handle c; bgfx::OcclusionQueryHandle cpp; } occlusionQuery = { _occlusionQuery };
+ return bgfx::submit(_id, program.cpp, occlusionQuery.cpp, _depth);
+}
+
BGFX_C_API uint32_t bgfx_submit_indirect(uint8_t _id, bgfx_program_handle_t _handle, bgfx_indirect_buffer_handle_t _indirectHandle, uint16_t _start, uint16_t _num, int32_t _depth)
{
union { bgfx_program_handle_t c; bgfx::ProgramHandle cpp; } handle = { _handle };
@@ -4199,6 +4347,13 @@ BGFX_C_API void bgfx_blit(uint8_t _id, bgfx_texture_handle_t _dst, uint8_t _dstM
bgfx::blit(_id, dst.cpp, _dstMip, _dstX, _dstY, _dstZ, src.cpp, _srcMip, _srcX, _srcY, _srcZ, _width, _height, _depth);
}
+BGFX_C_API void bgfx_blit_frame_buffer(uint8_t _id, bgfx_texture_handle_t _dst, uint8_t _dstMip, uint16_t _dstX, uint16_t _dstY, uint16_t _dstZ, bgfx_frame_buffer_handle_t _src, uint8_t _attachment, uint8_t _srcMip, uint16_t _srcX, uint16_t _srcY, uint16_t _srcZ, uint16_t _width, uint16_t _height, uint16_t _depth)
+{
+ union { bgfx_texture_handle_t c; bgfx::TextureHandle cpp; } dst = { _dst };
+ union { bgfx_frame_buffer_handle_t c; bgfx::FrameBufferHandle cpp; } src = { _src };
+ bgfx::blit(_id, dst.cpp, _dstMip, _dstX, _dstY, _dstZ, src.cpp, _attachment, _srcMip, _srcX, _srcY, _srcZ, _width, _height, _depth);
+}
+
BGFX_C_API void bgfx_save_screen_shot(const char* _filePath)
{
bgfx::saveScreenShot(_filePath);
@@ -4213,3 +4368,148 @@ BGFX_C_API void bgfx_set_platform_data(bgfx_platform_data_t* _pd)
{
bgfx::setPlatformData(*(bgfx::PlatformData*)_pd);
}
+
+BGFX_C_API bgfx_interface_vtbl_t* bgfx_get_interface(uint32_t _version)
+{
+ if (_version == BGFX_API_VERSION)
+ {
+#define BGFX_IMPORT \
+ BGFX_IMPORT_FUNC(render_frame) \
+ BGFX_IMPORT_FUNC(set_platform_data) \
+ BGFX_IMPORT_FUNC(vertex_decl_begin) \
+ BGFX_IMPORT_FUNC(vertex_decl_add) \
+ BGFX_IMPORT_FUNC(vertex_decl_skip) \
+ BGFX_IMPORT_FUNC(vertex_decl_end) \
+ BGFX_IMPORT_FUNC(vertex_pack) \
+ BGFX_IMPORT_FUNC(vertex_unpack) \
+ BGFX_IMPORT_FUNC(vertex_convert) \
+ BGFX_IMPORT_FUNC(weld_vertices) \
+ BGFX_IMPORT_FUNC(image_swizzle_bgra8) \
+ BGFX_IMPORT_FUNC(image_rgba8_downsample_2x2) \
+ BGFX_IMPORT_FUNC(get_supported_renderers) \
+ BGFX_IMPORT_FUNC(get_renderer_name) \
+ BGFX_IMPORT_FUNC(init) \
+ BGFX_IMPORT_FUNC(shutdown) \
+ BGFX_IMPORT_FUNC(reset) \
+ BGFX_IMPORT_FUNC(frame) \
+ BGFX_IMPORT_FUNC(get_renderer_type) \
+ BGFX_IMPORT_FUNC(get_caps) \
+ BGFX_IMPORT_FUNC(get_hmd) \
+ BGFX_IMPORT_FUNC(get_stats) \
+ BGFX_IMPORT_FUNC(alloc) \
+ BGFX_IMPORT_FUNC(copy) \
+ BGFX_IMPORT_FUNC(make_ref) \
+ BGFX_IMPORT_FUNC(make_ref_release) \
+ BGFX_IMPORT_FUNC(set_debug) \
+ BGFX_IMPORT_FUNC(dbg_text_clear) \
+ BGFX_IMPORT_FUNC(dbg_text_printf) \
+ BGFX_IMPORT_FUNC(dbg_text_image) \
+ BGFX_IMPORT_FUNC(create_index_buffer) \
+ BGFX_IMPORT_FUNC(destroy_index_buffer) \
+ BGFX_IMPORT_FUNC(create_vertex_buffer) \
+ BGFX_IMPORT_FUNC(destroy_vertex_buffer) \
+ BGFX_IMPORT_FUNC(create_dynamic_index_buffer) \
+ BGFX_IMPORT_FUNC(create_dynamic_index_buffer_mem) \
+ BGFX_IMPORT_FUNC(update_dynamic_index_buffer) \
+ BGFX_IMPORT_FUNC(destroy_dynamic_index_buffer) \
+ BGFX_IMPORT_FUNC(create_dynamic_vertex_buffer) \
+ BGFX_IMPORT_FUNC(create_dynamic_vertex_buffer_mem) \
+ BGFX_IMPORT_FUNC(update_dynamic_vertex_buffer) \
+ BGFX_IMPORT_FUNC(destroy_dynamic_vertex_buffer) \
+ BGFX_IMPORT_FUNC(check_avail_transient_index_buffer) \
+ BGFX_IMPORT_FUNC(check_avail_transient_vertex_buffer) \
+ BGFX_IMPORT_FUNC(check_avail_instance_data_buffer) \
+ BGFX_IMPORT_FUNC(check_avail_transient_buffers) \
+ BGFX_IMPORT_FUNC(alloc_transient_index_buffer) \
+ BGFX_IMPORT_FUNC(alloc_transient_vertex_buffer) \
+ BGFX_IMPORT_FUNC(alloc_transient_buffers) \
+ BGFX_IMPORT_FUNC(alloc_instance_data_buffer) \
+ BGFX_IMPORT_FUNC(create_indirect_buffer) \
+ BGFX_IMPORT_FUNC(destroy_indirect_buffer) \
+ BGFX_IMPORT_FUNC(create_shader) \
+ BGFX_IMPORT_FUNC(get_shader_uniforms) \
+ BGFX_IMPORT_FUNC(destroy_shader) \
+ BGFX_IMPORT_FUNC(create_program) \
+ BGFX_IMPORT_FUNC(create_compute_program) \
+ BGFX_IMPORT_FUNC(destroy_program) \
+ BGFX_IMPORT_FUNC(calc_texture_size) \
+ BGFX_IMPORT_FUNC(create_texture) \
+ BGFX_IMPORT_FUNC(create_texture_2d) \
+ BGFX_IMPORT_FUNC(create_texture_2d_scaled) \
+ BGFX_IMPORT_FUNC(create_texture_3d) \
+ BGFX_IMPORT_FUNC(create_texture_cube) \
+ BGFX_IMPORT_FUNC(update_texture_2d) \
+ BGFX_IMPORT_FUNC(update_texture_3d) \
+ BGFX_IMPORT_FUNC(update_texture_cube) \
+ BGFX_IMPORT_FUNC(destroy_texture) \
+ BGFX_IMPORT_FUNC(create_frame_buffer) \
+ BGFX_IMPORT_FUNC(create_frame_buffer_scaled) \
+ BGFX_IMPORT_FUNC(create_frame_buffer_from_handles) \
+ BGFX_IMPORT_FUNC(create_frame_buffer_from_nwh) \
+ BGFX_IMPORT_FUNC(destroy_frame_buffer) \
+ BGFX_IMPORT_FUNC(create_uniform) \
+ BGFX_IMPORT_FUNC(destroy_uniform) \
+ BGFX_IMPORT_FUNC(create_occlusion_query) \
+ BGFX_IMPORT_FUNC(get_result) \
+ BGFX_IMPORT_FUNC(destroy_occlusion_query) \
+ BGFX_IMPORT_FUNC(set_palette_color) \
+ BGFX_IMPORT_FUNC(set_view_name) \
+ BGFX_IMPORT_FUNC(set_view_rect) \
+ BGFX_IMPORT_FUNC(set_view_scissor) \
+ BGFX_IMPORT_FUNC(set_view_clear) \
+ BGFX_IMPORT_FUNC(set_view_clear_mrt) \
+ BGFX_IMPORT_FUNC(set_view_seq) \
+ BGFX_IMPORT_FUNC(set_view_frame_buffer) \
+ BGFX_IMPORT_FUNC(set_view_transform) \
+ BGFX_IMPORT_FUNC(set_view_transform_stereo) \
+ BGFX_IMPORT_FUNC(set_view_remap) \
+ BGFX_IMPORT_FUNC(set_marker) \
+ BGFX_IMPORT_FUNC(set_state) \
+ BGFX_IMPORT_FUNC(set_condition) \
+ BGFX_IMPORT_FUNC(set_stencil) \
+ BGFX_IMPORT_FUNC(set_scissor) \
+ BGFX_IMPORT_FUNC(set_scissor_cached) \
+ BGFX_IMPORT_FUNC(set_transform) \
+ BGFX_IMPORT_FUNC(alloc_transform) \
+ BGFX_IMPORT_FUNC(set_transform_cached) \
+ BGFX_IMPORT_FUNC(set_uniform) \
+ BGFX_IMPORT_FUNC(set_index_buffer) \
+ BGFX_IMPORT_FUNC(set_dynamic_index_buffer) \
+ BGFX_IMPORT_FUNC(set_transient_index_buffer) \
+ BGFX_IMPORT_FUNC(set_vertex_buffer) \
+ BGFX_IMPORT_FUNC(set_dynamic_vertex_buffer) \
+ BGFX_IMPORT_FUNC(set_transient_vertex_buffer) \
+ BGFX_IMPORT_FUNC(set_instance_data_buffer) \
+ BGFX_IMPORT_FUNC(set_instance_data_from_vertex_buffer) \
+ BGFX_IMPORT_FUNC(set_instance_data_from_dynamic_vertex_buffer) \
+ BGFX_IMPORT_FUNC(set_texture) \
+ BGFX_IMPORT_FUNC(set_texture_from_frame_buffer) \
+ BGFX_IMPORT_FUNC(touch) \
+ BGFX_IMPORT_FUNC(submit) \
+ BGFX_IMPORT_FUNC(submit_occlusion_query) \
+ BGFX_IMPORT_FUNC(submit_indirect) \
+ BGFX_IMPORT_FUNC(set_image) \
+ BGFX_IMPORT_FUNC(set_image_from_frame_buffer) \
+ BGFX_IMPORT_FUNC(set_compute_index_buffer) \
+ BGFX_IMPORT_FUNC(set_compute_vertex_buffer) \
+ BGFX_IMPORT_FUNC(set_compute_dynamic_index_buffer) \
+ BGFX_IMPORT_FUNC(set_compute_dynamic_vertex_buffer) \
+ BGFX_IMPORT_FUNC(set_compute_indirect_buffer) \
+ BGFX_IMPORT_FUNC(dispatch) \
+ BGFX_IMPORT_FUNC(dispatch_indirect) \
+ BGFX_IMPORT_FUNC(discard) \
+ BGFX_IMPORT_FUNC(blit) \
+ BGFX_IMPORT_FUNC(save_screen_shot)
+
+ static bgfx_interface_vtbl_t s_bgfx_interface =
+ {
+#define BGFX_IMPORT_FUNC(_name) bgfx_##_name,
+ BGFX_IMPORT
+#undef BGFX_IMPORT_FUNC
+ };
+
+ return &s_bgfx_interface;
+ }
+
+ return NULL;
+}
diff --git a/3rdparty/bgfx/src/bgfx_compute.sh b/3rdparty/bgfx/src/bgfx_compute.sh
index af8dd3e3242..04419d41352 100644
--- a/3rdparty/bgfx/src/bgfx_compute.sh
+++ b/3rdparty/bgfx/src/bgfx_compute.sh
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#ifndef BGFX_COMPUTE_H_HEADER_GUARD
diff --git a/3rdparty/bgfx/src/bgfx_p.h b/3rdparty/bgfx/src/bgfx_p.h
index fe9f89d916d..fc13eeb06b7 100644
--- a/3rdparty/bgfx/src/bgfx_p.h
+++ b/3rdparty/bgfx/src/bgfx_p.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#ifndef BGFX_P_H_HEADER_GUARD
@@ -49,6 +49,33 @@
, _handleAlloc.getMaxHandles() \
)
+#ifndef BGFX_PROFILER_SCOPE
+# if BGFX_CONFIG_PROFILER_MICROPROFILE
+# include <microprofile.h>
+# define BGFX_PROFILER_SCOPE(_group, _name, _color) MICROPROFILE_SCOPEI(#_group, #_name, _color)
+# define BGFX_PROFILER_BEGIN(_group, _name, _color) BX_NOOP()
+# define BGFX_PROFILER_BEGIN_DYNAMIC(_namestr) BX_NOOP()
+# define BGFX_PROFILER_END() BX_NOOP()
+# define BGFX_PROFILER_SET_CURRENT_THREAD_NAME(_name) BX_NOOP()
+# elif BGFX_CONFIG_PROFILER_REMOTERY
+# define RMT_ENABLED BGFX_CONFIG_PROFILER_REMOTERY
+# define RMT_USE_D3D11 BGFX_CONFIG_RENDERER_DIRECT3D11
+# define RMT_USE_OPENGL BGFX_CONFIG_RENDERER_OPENGL
+# include <remotery/lib/Remotery.h>
+# define BGFX_PROFILER_SCOPE(_group, _name, _color) rmt_ScopedCPUSample(_group##_##_name)
+# define BGFX_PROFILER_BEGIN(_group, _name, _color) rmt_BeginCPUSample(_group##_##_name)
+# define BGFX_PROFILER_BEGIN_DYNAMIC(_namestr) rmt_BeginCPUSampleDynamic(_namestr)
+# define BGFX_PROFILER_END() rmt_EndCPUSample()
+# define BGFX_PROFILER_SET_CURRENT_THREAD_NAME(_name) rmt_SetCurrentThreadName(_name)
+# else
+# define BGFX_PROFILER_SCOPE(_group, _name, _color) BX_NOOP()
+# define BGFX_PROFILER_BEGIN(_group, _name, _color) BX_NOOP()
+# define BGFX_PROFILER_BEGIN_DYNAMIC(_namestr) BX_NOOP()
+# define BGFX_PROFILER_END() BX_NOOP()
+# define BGFX_PROFILER_SET_CURRENT_THREAD_NAME(_name) BX_NOOP()
+# endif // BGFX_CONFIG_PROFILER_*
+#endif // BGFX_PROFILER_SCOPE
+
namespace bgfx
{
#if BX_COMPILER_CLANG_ANALYZER
@@ -173,8 +200,14 @@ namespace stl
#define BGFX_MAX_COMPUTE_BINDINGS 8
-#define BGFX_SAMPLER_DEFAULT_FLAGS UINT32_C(0x10000000)
-#define BGFX_RESET_FORCE UINT32_C(0x80000000)
+#define BGFX_TEXTURE_INTERNAL_DEFAULT_SAMPLER UINT32_C(0x10000000)
+
+#define BGFX_RESET_INTERNAL_FORCE UINT32_C(0x80000000)
+
+#define BGFX_STATE_INTERNAL_SCISSOR UINT64_C(0x2000000000000000)
+#define BGFX_STATE_INTERNAL_OCCLUSION_QUERY UINT64_C(0x4000000000000000)
+
+#define BGFX_SUBMIT_INTERNAL_OCCLUSION_VISIBLE UINT8_C(0x80)
#define BGFX_RENDERER_DIRECT3D9_NAME "Direct3D 9"
#define BGFX_RENDERER_DIRECT3D11_NAME "Direct3D 11"
@@ -289,7 +322,7 @@ namespace bgfx
extern const uint32_t g_uniformTypeSize[UniformType::Count+1];
extern CallbackI* g_callback;
- extern bx::ReallocatorI* g_allocator;
+ extern bx::AllocatorI* g_allocator;
extern Caps g_caps;
void setGraphicsDebuggerPresent(bool _present);
@@ -667,12 +700,54 @@ namespace bgfx
void operator=(const CommandBuffer&);
};
-#define SORT_KEY_RENDER_DRAW (UINT64_C(1)<<0x36)
-#define SORT_KEY_VIEW_SHIFT UINT8_C(0x37)
-#define SORT_KEY_VIEW_MASK ( (uint64_t(BGFX_CONFIG_MAX_VIEWS-1) )<<SORT_KEY_VIEW_SHIFT)
+#define SORT_KEY_DRAW_BIT (UINT64_C(1)<<0x36)
+
+#define SORT_KEY_SEQ_SHIFT 0x2b
+#define SORT_KEY_SEQ_MASK (UINT64_C(0x7ff)<<SORT_KEY_SEQ_SHIFT)
+
+#define SORT_KEY_VIEW_SHIFT 0x37
+#define SORT_KEY_VIEW_MASK ( (uint64_t(BGFX_CONFIG_MAX_VIEWS-1) )<<SORT_KEY_VIEW_SHIFT)
+
+#define SORT_KEY_DRAW_TRANS_SHIFT 0x29
+#define SORT_KEY_DRAW_TRANS_MASK (UINT64_C(0x3)<<SORT_KEY_DRAW_TRANS_SHIFT)
+
+#define SORT_KEY_DRAW_PROGRAM_SHIFT 0x20
+#define SORT_KEY_DRAW_PROGRAM_MASK ( (uint64_t(BGFX_CONFIG_MAX_PROGRAMS-1) )<<SORT_KEY_DRAW_PROGRAM_SHIFT)
+
+#define SORT_KEY_DRAW_DEPTH_SHIFT 0
+#define SORT_KEY_DRAW_DEPTH_MASK ( (uint64_t(UINT32_MAX) )<<SORT_KEY_DRAW_DEPTH_SHIFT)
+
+#define SORT_KEY_COMPUTE_PROGRAM_SHIFT 0x22
+#define SORT_KEY_COMPUTE_PROGRAM_MASK ( (uint64_t(BGFX_CONFIG_MAX_PROGRAMS-1) )<<SORT_KEY_COMPUTE_PROGRAM_SHIFT)
BX_STATIC_ASSERT(BGFX_CONFIG_MAX_VIEWS <= 256);
- BX_STATIC_ASSERT( (BGFX_CONFIG_MAX_PROGRAMS & (BGFX_CONFIG_MAX_PROGRAMS-1) ) == 0); // must be power of 2
+ BX_STATIC_ASSERT( (BGFX_CONFIG_MAX_PROGRAMS & (BGFX_CONFIG_MAX_PROGRAMS-1) ) == 0); // Must be power of 2.
+ BX_STATIC_ASSERT( (0 // Render key mask shouldn't overlap.
+ | SORT_KEY_DRAW_BIT
+ | SORT_KEY_SEQ_MASK
+ | SORT_KEY_VIEW_MASK
+ | SORT_KEY_DRAW_TRANS_MASK
+ | SORT_KEY_DRAW_PROGRAM_MASK
+ | SORT_KEY_DRAW_DEPTH_MASK
+ ) == (0
+ ^ SORT_KEY_DRAW_BIT
+ ^ SORT_KEY_SEQ_MASK
+ ^ SORT_KEY_VIEW_MASK
+ ^ SORT_KEY_DRAW_TRANS_MASK
+ ^ SORT_KEY_DRAW_PROGRAM_MASK
+ ^ SORT_KEY_DRAW_DEPTH_MASK
+ ) );
+ BX_STATIC_ASSERT( (0 // Compute key mask shouldn't overlap.
+ | SORT_KEY_DRAW_BIT
+ | SORT_KEY_SEQ_MASK
+ | SORT_KEY_VIEW_MASK
+ | SORT_KEY_COMPUTE_PROGRAM_MASK
+ ) == (0
+ ^ SORT_KEY_DRAW_BIT
+ ^ SORT_KEY_SEQ_MASK
+ ^ SORT_KEY_VIEW_MASK
+ ^ SORT_KEY_COMPUTE_PROGRAM_MASK
+ ) );
struct SortKey
{
@@ -686,12 +761,17 @@ namespace bgfx
// | view-+| seq-+ +-trans +-program depth-+|
// | +-draw |
- const uint64_t depth = m_depth;
- const uint64_t program = uint64_t(m_program)<<0x20;
- const uint64_t trans = uint64_t(m_trans )<<0x29;
- const uint64_t seq = uint64_t(m_seq )<<0x2b;
- const uint64_t view = uint64_t(m_view )<<SORT_KEY_VIEW_SHIFT;
- const uint64_t key = depth|program|trans|SORT_KEY_RENDER_DRAW|seq|view;
+ const uint64_t depth = (uint64_t(m_depth ) << SORT_KEY_DRAW_DEPTH_SHIFT ) & SORT_KEY_DRAW_DEPTH_MASK;
+ const uint64_t program = (uint64_t(m_program) << SORT_KEY_DRAW_PROGRAM_SHIFT) & SORT_KEY_DRAW_PROGRAM_MASK;
+ const uint64_t trans = (uint64_t(m_trans ) << SORT_KEY_DRAW_TRANS_SHIFT ) & SORT_KEY_DRAW_TRANS_MASK;
+ const uint64_t seq = (uint64_t(m_seq ) << SORT_KEY_SEQ_SHIFT ) & SORT_KEY_SEQ_MASK;
+ const uint64_t view = (uint64_t(m_view ) << SORT_KEY_VIEW_SHIFT ) & SORT_KEY_VIEW_MASK;
+ const uint64_t key = depth|program|trans|SORT_KEY_DRAW_BIT|seq|view;
+
+ BX_CHECK(seq == (uint64_t(m_seq) << SORT_KEY_SEQ_SHIFT), "SortKey error, sequence is truncated (m_seq: %d)."
+ , m_seq
+ );
+
return key;
}
@@ -705,27 +785,32 @@ namespace bgfx
// | view-+| seq-+ +-program |
// | +-draw |
- const uint64_t program = uint64_t(m_program)<<0x22;
- const uint64_t seq = uint64_t(m_seq )<<0x2b;
- const uint64_t view = uint64_t(m_view )<<SORT_KEY_VIEW_SHIFT;
+ const uint64_t program = (uint64_t(m_program) << SORT_KEY_COMPUTE_PROGRAM_SHIFT) & SORT_KEY_COMPUTE_PROGRAM_MASK;
+ const uint64_t seq = (uint64_t(m_seq ) << SORT_KEY_SEQ_SHIFT ) & SORT_KEY_SEQ_MASK;
+ const uint64_t view = (uint64_t(m_view ) << SORT_KEY_VIEW_SHIFT ) & SORT_KEY_VIEW_MASK;
const uint64_t key = program|seq|view;
+
+ BX_CHECK(seq == (uint64_t(m_seq) << SORT_KEY_SEQ_SHIFT), "SortKey error, sequence is truncated (m_seq: %d)."
+ , m_seq
+ );
+
return key;
}
/// Returns true if item is command.
bool decode(uint64_t _key)
{
- m_seq = (_key>>0x2c)& 0x7ff;
- m_view = uint8_t( (_key&SORT_KEY_VIEW_MASK)>>SORT_KEY_VIEW_SHIFT);
- if (_key & SORT_KEY_RENDER_DRAW)
+ m_seq = uint16_t( (_key & SORT_KEY_SEQ_MASK ) >> SORT_KEY_SEQ_SHIFT);
+ m_view = uint8_t( (_key & SORT_KEY_VIEW_MASK) >> SORT_KEY_VIEW_SHIFT);
+ if (_key & SORT_KEY_DRAW_BIT)
{
- m_depth = _key & 0xffffffff;
- m_program = (_key>>0x20)&(BGFX_CONFIG_MAX_PROGRAMS-1);
- m_trans = (_key>>0x29)& 0x3;
+ m_depth = uint32_t( (_key & SORT_KEY_DRAW_DEPTH_MASK ) >> SORT_KEY_DRAW_DEPTH_SHIFT);
+ m_program = uint16_t( (_key & SORT_KEY_DRAW_PROGRAM_MASK) >> SORT_KEY_DRAW_PROGRAM_SHIFT);
+ m_trans = uint8_t( (_key & SORT_KEY_DRAW_TRANS_MASK ) >> SORT_KEY_DRAW_TRANS_SHIFT);
return false; // draw
}
- m_program = (_key>>0x22)&(BGFX_CONFIG_MAX_PROGRAMS-1);
+ m_program = uint16_t( (_key & SORT_KEY_COMPUTE_PROGRAM_MASK) >> SORT_KEY_COMPUTE_PROGRAM_SHIFT);
return true; // compute
}
@@ -820,7 +905,7 @@ namespace bgfx
uint32_t reserve(uint16_t* _num)
{
uint32_t num = *_num;
- BX_CHECK(m_num+num < BGFX_CONFIG_MAX_MATRIX_CACHE, "Matrix cache overflow. %d (max: %d)", m_num+num, BGFX_CONFIG_MAX_MATRIX_CACHE);
+ BX_WARN(m_num+num < BGFX_CONFIG_MAX_MATRIX_CACHE, "Matrix cache overflow. %d (max: %d)", m_num+num, BGFX_CONFIG_MAX_MATRIX_CACHE);
num = bx::uint32_min(num, BGFX_CONFIG_MAX_MATRIX_CACHE-m_num);
uint32_t first = m_num;
m_num += num;
@@ -1093,7 +1178,7 @@ namespace bgfx
{
struct
{
- uint32_t m_flags;
+ uint32_t m_textureFlags;
} m_draw;
struct
@@ -1112,7 +1197,7 @@ namespace bgfx
{
m_constBegin = 0;
m_constEnd = 0;
- m_flags = BGFX_STATE_DEFAULT;
+ m_stateFlags = BGFX_STATE_DEFAULT;
m_stencil = packStencil(BGFX_STENCIL_DEFAULT, BGFX_STENCIL_DEFAULT);
m_rgba = 0;
m_matrix = 0;
@@ -1123,28 +1208,29 @@ namespace bgfx
m_instanceDataOffset = 0;
m_instanceDataStride = 0;
m_numInstances = 1;
- m_startIndirect = 0;
- m_numIndirect = UINT16_MAX;
- m_num = 1;
- m_flags = BGFX_SUBMIT_EYE_FIRST;
- m_scissor = UINT16_MAX;
+ m_startIndirect = 0;
+ m_numIndirect = UINT16_MAX;
+ m_num = 1;
+ m_submitFlags = BGFX_SUBMIT_EYE_FIRST;
+ m_scissor = UINT16_MAX;
m_vertexBuffer.idx = invalidHandle;
m_vertexDecl.idx = invalidHandle;
m_indexBuffer.idx = invalidHandle;
m_instanceDataBuffer.idx = invalidHandle;
- m_indirectBuffer.idx = invalidHandle;
+ m_indirectBuffer.idx = invalidHandle;
+ m_occlusionQuery.idx = invalidHandle;
for (uint32_t ii = 0; ii < BGFX_CONFIG_MAX_TEXTURE_SAMPLERS; ++ii)
{
Binding& bind = m_bind[ii];
bind.m_idx = invalidHandle;
bind.m_type = 0;
- bind.m_un.m_draw.m_flags = 0;
+ bind.m_un.m_draw.m_textureFlags = 0;
}
}
Binding m_bind[BGFX_CONFIG_MAX_TEXTURE_SAMPLERS];
- uint64_t m_flags;
+ uint64_t m_stateFlags;
uint64_t m_stencil;
uint32_t m_rgba;
uint32_t m_constBegin;
@@ -1163,11 +1249,12 @@ namespace bgfx
uint16_t m_scissor;
uint8_t m_submitFlags;
- VertexBufferHandle m_vertexBuffer;
- VertexDeclHandle m_vertexDecl;
- IndexBufferHandle m_indexBuffer;
- VertexBufferHandle m_instanceDataBuffer;
+ VertexBufferHandle m_vertexBuffer;
+ VertexDeclHandle m_vertexDecl;
+ IndexBufferHandle m_indexBuffer;
+ VertexBufferHandle m_instanceDataBuffer;
IndirectBufferHandle m_indirectBuffer;
+ OcclusionQueryHandle m_occlusionQuery;
};
struct RenderCompute
@@ -1284,6 +1371,7 @@ namespace bgfx
term.m_program = invalidHandle;
m_sortKeys[BGFX_CONFIG_MAX_DRAW_CALLS] = term.encodeDraw();
m_sortValues[BGFX_CONFIG_MAX_DRAW_CALLS] = BGFX_CONFIG_MAX_DRAW_CALLS;
+ memset(m_occlusion, 0xff, sizeof(m_occlusion) );
}
~Frame()
@@ -1313,7 +1401,7 @@ namespace bgfx
void start()
{
- m_flags = BGFX_STATE_NONE;
+ m_stateFlags = BGFX_STATE_NONE;
m_uniformBegin = 0;
m_uniformEnd = 0;
m_draw.clear();
@@ -1361,10 +1449,16 @@ namespace bgfx
uint8_t blend = ( (_state&BGFX_STATE_BLEND_MASK)>>BGFX_STATE_BLEND_SHIFT)&0xff;
// transparency sort order table
m_key.m_trans = "\x0\x1\x1\x2\x2\x1\x2\x1\x2\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1"[( (blend)&0xf) + (!!blend)];
- m_draw.m_flags = _state;
+ m_draw.m_stateFlags = _state;
m_draw.m_rgba = _rgba;
}
+ void setCondition(OcclusionQueryHandle _handle, bool _visible)
+ {
+ m_draw.m_occlusionQuery = _handle;
+ m_draw.m_submitFlags |= _visible ? BGFX_SUBMIT_INTERNAL_OCCLUSION_VISIBLE : 0;
+ }
+
void setStencil(uint32_t _fstencil, uint32_t _bstencil)
{
m_draw.m_stencil = packStencil(_fstencil, _bstencil);
@@ -1473,8 +1567,8 @@ namespace bgfx
Binding& bind = m_draw.m_bind[_stage];
bind.m_idx = _handle.idx;
bind.m_type = uint8_t(Binding::Texture);
- bind.m_un.m_draw.m_flags = (_flags&BGFX_SAMPLER_DEFAULT_FLAGS)
- ? BGFX_SAMPLER_DEFAULT_FLAGS
+ bind.m_un.m_draw.m_textureFlags = (_flags&BGFX_TEXTURE_INTERNAL_DEFAULT_SAMPLER)
+ ? BGFX_TEXTURE_INTERNAL_DEFAULT_SAMPLER
: _flags
;
@@ -1526,17 +1620,18 @@ namespace bgfx
m_discard = false;
m_draw.clear();
m_compute.clear();
- m_flags = BGFX_STATE_NONE;
+ m_stateFlags = BGFX_STATE_NONE;
}
- uint32_t submit(uint8_t _id, ProgramHandle _handle, int32_t _depth);
+ uint32_t submit(uint8_t _id, ProgramHandle _program, OcclusionQueryHandle _occlusionQuery, int32_t _depth);
- uint32_t submit(uint8_t _id, ProgramHandle _handle, IndirectBufferHandle _indirectHandle, uint16_t _start, uint16_t _num, int32_t _depth)
+ uint32_t submit(uint8_t _id, ProgramHandle _program, IndirectBufferHandle _indirectHandle, uint16_t _start, uint16_t _num, int32_t _depth)
{
m_draw.m_startIndirect = _start;
m_draw.m_numIndirect = _num;
m_draw.m_indirectBuffer = _indirectHandle;
- return submit(_id, _handle, _depth);
+ OcclusionQueryHandle handle = BGFX_INVALID_HANDLE;
+ return submit(_id, _program, handle, _depth);
}
uint32_t dispatch(uint8_t _id, ProgramHandle _handle, uint16_t _ngx, uint16_t _ngy, uint16_t _ngz, uint8_t _flags);
@@ -1666,6 +1761,7 @@ namespace bgfx
Matrix4 m_view[BGFX_CONFIG_MAX_VIEWS];
Matrix4 m_proj[2][BGFX_CONFIG_MAX_VIEWS];
uint8_t m_viewFlags[BGFX_CONFIG_MAX_VIEWS];
+ uint8_t m_occlusion[BGFX_CONFIG_MAX_OCCUSION_QUERIES];
uint64_t m_sortKeys[BGFX_CONFIG_MAX_DRAW_CALLS+1];
RenderItemCount m_sortValues[BGFX_CONFIG_MAX_DRAW_CALLS+1];
@@ -1674,7 +1770,7 @@ namespace bgfx
RenderCompute m_compute;
uint32_t m_blitKeys[BGFX_CONFIG_MAX_BLIT_ITEMS+1];
BlitItem m_blitItem[BGFX_CONFIG_MAX_BLIT_ITEMS+1];
- uint64_t m_flags;
+ uint64_t m_stateFlags;
uint32_t m_uniformBegin;
uint32_t m_uniformEnd;
uint32_t m_uniformMax;
@@ -1998,6 +2094,7 @@ namespace bgfx
static int32_t renderThread(void* /*_userData*/)
{
BX_TRACE("render thread start");
+ BGFX_PROFILER_SET_CURRENT_THREAD_NAME("bgfx - Render Thread");
while (RenderFrame::Exiting != bgfx::renderFrame() ) {};
BX_TRACE("render thread exit");
return EXIT_SUCCESS;
@@ -2037,7 +2134,7 @@ namespace bgfx
, uint16_t(m_resolution.m_width)
, uint16_t(m_resolution.m_height)
);
- m_resolution.m_flags |= BGFX_RESET_FORCE;
+ m_resolution.m_flags |= BGFX_RESET_INTERNAL_FORCE;
}
}
}
@@ -2227,7 +2324,7 @@ namespace bgfx
DynamicIndexBuffer& dib = m_dynamicIndexBuffers[handle.idx];
dib.m_handle.idx = uint16_t(ptr>>32);
dib.m_offset = uint32_t(ptr);
- dib.m_size = size;
+ dib.m_size = _num * indexSize;
dib.m_startIndex = bx::strideAlign(dib.m_offset, indexSize)/indexSize;
dib.m_flags = _flags;
@@ -2372,9 +2469,9 @@ namespace bgfx
DynamicVertexBuffer& dvb = m_dynamicVertexBuffers[handle.idx];
dvb.m_handle.idx = uint16_t(ptr>>32);
dvb.m_offset = uint32_t(ptr);
- dvb.m_size = size;
+ dvb.m_size = _num * _decl.m_stride;
dvb.m_startVertex = bx::strideAlign(dvb.m_offset, _decl.m_stride)/_decl.m_stride;
- dvb.m_numVertices = dvb.m_size/_decl.m_stride;
+ dvb.m_numVertices = _num;
dvb.m_stride = _decl.m_stride;
dvb.m_decl = declHandle;
dvb.m_flags = _flags;
@@ -2412,6 +2509,7 @@ namespace bgfx
dvb.m_handle.idx = uint16_t(ptr>>32);
dvb.m_offset = uint32_t(ptr);
dvb.m_size = _mem->size;
+ dvb.m_numVertices = dvb.m_size / dvb.m_stride;
dvb.m_startVertex = bx::strideAlign(dvb.m_offset, dvb.m_stride)/dvb.m_stride;
}
@@ -3279,6 +3377,36 @@ namespace bgfx
}
}
+ BGFX_API_FUNC(OcclusionQueryHandle createOcclusionQuery() )
+ {
+ OcclusionQueryHandle handle = { m_occlusionQueryHandle.alloc() };
+ if (isValid(handle) )
+ {
+ m_submit->m_occlusion[handle.idx] = UINT8_MAX;
+ }
+ return handle;
+ }
+
+ BGFX_API_FUNC(OcclusionQueryResult::Enum getResult(OcclusionQueryHandle _handle) )
+ {
+ BGFX_CHECK_HANDLE("destroyOcclusionQuery", m_occlusionQueryHandle, _handle);
+
+ switch (m_submit->m_occlusion[_handle.idx])
+ {
+ case 0: return OcclusionQueryResult::Invisible;
+ case UINT8_MAX: return OcclusionQueryResult::NoResult;
+ default:;
+ }
+
+ return OcclusionQueryResult::Visible;
+ }
+
+ BGFX_API_FUNC(void destroyOcclusionQuery(OcclusionQueryHandle _handle) )
+ {
+ BGFX_CHECK_HANDLE("destroyOcclusionQuery", m_occlusionQueryHandle, _handle);
+ m_occlusionQueryHandle.free(_handle.idx);
+ }
+
BGFX_API_FUNC(void saveScreenShot(const char* _filePath) )
{
CommandBuffer& cmdbuf = getCommandBuffer(CommandBuffer::SaveScreenShot);
@@ -3435,6 +3563,11 @@ namespace bgfx
m_submit->setState(_state, _rgba);
}
+ BGFX_API_FUNC(void setCondition(OcclusionQueryHandle _handle, bool _visible) )
+ {
+ m_submit->setCondition(_handle, _visible);
+ }
+
BGFX_API_FUNC(void setStencil(uint32_t _fstencil, uint32_t _bstencil) )
{
m_submit->setStencil(_fstencil, _bstencil);
@@ -3565,14 +3698,26 @@ namespace bgfx
m_submit->setTexture(_stage, _sampler, textureHandle, _flags);
}
- BGFX_API_FUNC(uint32_t submit(uint8_t _id, ProgramHandle _handle, int32_t _depth) )
+ BGFX_API_FUNC(uint32_t submit(uint8_t _id, ProgramHandle _program, OcclusionQueryHandle _occlusionQuery, int32_t _depth) )
{
- BGFX_CHECK_HANDLE_INVALID_OK("submit", m_programHandle, _handle);
+ BGFX_CHECK_HANDLE_INVALID_OK("submit", m_programHandle, _program);
+ BGFX_CHECK_HANDLE_INVALID_OK("submit", m_occlusionQueryHandle, _occlusionQuery);
if (BX_ENABLED(BGFX_CONFIG_DEBUG_UNIFORM) )
{
m_uniformSet.clear();
}
- return m_submit->submit(_id, _handle, _depth);
+
+ if (BX_ENABLED(BGFX_CONFIG_DEBUG_OCCLUSION)
+ && isValid(_occlusionQuery) )
+ {
+ BX_CHECK(m_occlusionQuerySet.end() == m_occlusionQuerySet.find(_occlusionQuery.idx)
+ , "OcclusionQuery %d was already used for this frame."
+ , _occlusionQuery.idx
+ );
+ m_occlusionQuerySet.insert(_occlusionQuery.idx);
+ }
+
+ return m_submit->submit(_id, _program, _occlusionQuery, _depth);
}
BGFX_API_FUNC(uint32_t submit(uint8_t _id, ProgramHandle _handle, IndirectBufferHandle _indirectHandle, uint16_t _start, uint16_t _num, int32_t _depth) )
@@ -3719,6 +3864,7 @@ namespace bgfx
{
if (!m_singleThreaded)
{
+ BGFX_PROFILER_SCOPE(bgfx, main_thread_wait, 0xff2040ff);
int64_t start = bx::getHPCounter();
bool ok = m_gameSem.wait();
BX_CHECK(ok, "Semaphore wait failed."); BX_UNUSED(ok);
@@ -3738,6 +3884,7 @@ namespace bgfx
{
if (!m_singleThreaded)
{
+ BGFX_PROFILER_SCOPE(bgfx, render_thread_wait, 0xff2040ff);
int64_t start = bx::getHPCounter();
bool ok = m_renderSem.wait();
BX_CHECK(ok, "Semaphore wait failed."); BX_UNUSED(ok);
@@ -3797,6 +3944,7 @@ namespace bgfx
bx::HandleAllocT<BGFX_CONFIG_MAX_TEXTURES> m_textureHandle;
bx::HandleAllocT<BGFX_CONFIG_MAX_FRAME_BUFFERS> m_frameBufferHandle;
bx::HandleAllocT<BGFX_CONFIG_MAX_UNIFORMS> m_uniformHandle;
+ bx::HandleAllocT<BGFX_CONFIG_MAX_OCCUSION_QUERIES> m_occlusionQueryHandle;
struct ShaderRef
{
@@ -3839,10 +3987,12 @@ namespace bgfx
bool m_window;
};
+ typedef stl::unordered_set<uint16_t> HandleSet;
+ HandleSet m_uniformSet;
+ HandleSet m_occlusionQuerySet;
+
typedef stl::unordered_map<stl::string, UniformHandle> UniformHashMap;
UniformHashMap m_uniformHashMap;
- typedef stl::unordered_set<uint16_t> UniformSet;
- UniformSet m_uniformSet;
UniformRef m_uniformRef[BGFX_CONFIG_MAX_UNIFORMS];
ShaderRef m_shaderRef[BGFX_CONFIG_MAX_SHADERS];
diff --git a/3rdparty/bgfx/src/bgfx_shader.sh b/3rdparty/bgfx/src/bgfx_shader.sh
index 8b8948ce065..a82a03e2fbb 100644
--- a/3rdparty/bgfx/src/bgfx_shader.sh
+++ b/3rdparty/bgfx/src/bgfx_shader.sh
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#ifndef BGFX_SHADER_H_HEADER_GUARD
diff --git a/3rdparty/bgfx/src/charset.h b/3rdparty/bgfx/src/charset.h
index cfcbf7a8828..15b3f81b645 100644
--- a/3rdparty/bgfx/src/charset.h
+++ b/3rdparty/bgfx/src/charset.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
static const uint8_t vga8x8[256*8] =
diff --git a/3rdparty/bgfx/src/config.h b/3rdparty/bgfx/src/config.h
index 1afea5cd9d4..5966105ea15 100644
--- a/3rdparty/bgfx/src/config.h
+++ b/3rdparty/bgfx/src/config.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#ifndef BGFX_CONFIG_H_HEADER_GUARD
@@ -42,19 +42,15 @@
# endif // BGFX_CONFIG_RENDERER_DIRECT3D12
# ifndef BGFX_CONFIG_RENDERER_METAL
-# if BX_PLATFORM_IOS \
- || (BX_PLATFORM_OSX \
- && defined(MAC_OS_X_VERSION_MAX_ALLOWED) \
- && (MAC_OS_X_VERSION_MAX_ALLOWED >= 101100))
-# define BGFX_CONFIG_RENDERER_METAL 1
-# else
-# define BGFX_CONFIG_RENDERER_METAL 0
-# endif
+# define BGFX_CONFIG_RENDERER_METAL (0 \
+ || BX_PLATFORM_IOS \
+ || (BX_PLATFORM_OSX >= 101100) \
+ ? 1 : 0)
# endif // BGFX_CONFIG_RENDERER_METAL
# ifndef BGFX_CONFIG_RENDERER_OPENGL
# define BGFX_CONFIG_RENDERER_OPENGL (0 \
- || BX_PLATFORM_FREEBSD \
+ || BX_PLATFORM_BSD \
|| BX_PLATFORM_LINUX \
|| BX_PLATFORM_OSX \
|| BX_PLATFORM_WINDOWS \
@@ -168,15 +164,20 @@
# define BGFX_CONFIG_DEBUG_MTL BGFX_CONFIG_DEBUG
#endif // BGFX_CONFIG_DEBUG_MTL
-///
+/// Enable uniform debug checks.
#ifndef BGFX_CONFIG_DEBUG_UNIFORM
# define BGFX_CONFIG_DEBUG_UNIFORM BGFX_CONFIG_DEBUG
#endif // BGFX_CONFIG_DEBUG_UNIFORM
+/// Enable occlusion debug checks.
+#ifndef BGFX_CONFIG_DEBUG_OCCLUSION
+# define BGFX_CONFIG_DEBUG_OCCLUSION BGFX_CONFIG_DEBUG
+#endif // BGFX_CONFIG_DEBUG_OCCLUSION
+
#ifndef BGFX_CONFIG_MULTITHREADED
# define BGFX_CONFIG_MULTITHREADED ( (!BGFX_CONFIG_RENDERER_NULL)&&(0 \
|| BX_PLATFORM_ANDROID \
- || BX_PLATFORM_FREEBSD \
+ || BX_PLATFORM_BSD \
|| BX_PLATFORM_LINUX \
|| BX_PLATFORM_IOS \
|| BX_PLATFORM_NACL \
@@ -194,7 +195,7 @@
#endif // BGFX_CONFIG_MAX_DRAW_CALLS
#ifndef BGFX_CONFIG_MAX_BLIT_ITEMS
-# define BGFX_CONFIG_MAX_BLIT_ITEMS 256
+# define BGFX_CONFIG_MAX_BLIT_ITEMS (1<<10)
#endif // BGFX_CONFIG_MAX_BLIT_ITEMS
#ifndef BGFX_CONFIG_MAX_MATRIX_CACHE
@@ -273,6 +274,10 @@
# define BGFX_CONFIG_MAX_UNIFORMS 512
#endif // BGFX_CONFIG_MAX_UNIFORMS
+#ifndef BGFX_CONFIG_MAX_OCCUSION_QUERIES
+# define BGFX_CONFIG_MAX_OCCUSION_QUERIES 256
+#endif // BGFX_CONFIG_MAX_OCCUSION_QUERIES
+
#ifndef BGFX_CONFIG_MAX_COMMAND_BUFFER_SIZE
# define BGFX_CONFIG_MAX_COMMAND_BUFFER_SIZE (64<<10)
#endif // BGFX_CONFIG_MAX_COMMAND_BUFFER_SIZE
@@ -295,4 +300,16 @@
#define BGFX_CONFIG_DRAW_INDIRECT_STRIDE 32
+#ifndef BGFX_CONFIG_PROFILER_MICROPROFILE
+# define BGFX_CONFIG_PROFILER_MICROPROFILE 0
+#endif // BGFX_CONFIG_PROFILER_MICROPROFILE
+
+#ifndef BGFX_CONFIG_PROFILER_REMOTERY
+# define BGFX_CONFIG_PROFILER_REMOTERY 0
+#endif // BGFX_CONFIG_PROFILER_REMOTERY
+
+#ifndef BGFX_CONFIG_PROFILER_REMOTERY_BUILD_LIB
+# define BGFX_CONFIG_PROFILER_REMOTERY_BUILD_LIB BGFX_CONFIG_PROFILER_REMOTERY
+#endif // BGFX_CONFIG_PROFILER_REMOTERY_BUILD_LIB
+
#endif // BGFX_CONFIG_H_HEADER_GUARD
diff --git a/3rdparty/bgfx/src/fs_clear0.sc b/3rdparty/bgfx/src/fs_clear0.sc
index f6eb6a18c28..07131b43823 100644
--- a/3rdparty/bgfx/src/fs_clear0.sc
+++ b/3rdparty/bgfx/src/fs_clear0.sc
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
uniform vec4 bgfx_clear_color[8];
diff --git a/3rdparty/bgfx/src/fs_clear1.sc b/3rdparty/bgfx/src/fs_clear1.sc
index 31b2053bd36..160c1a83193 100644
--- a/3rdparty/bgfx/src/fs_clear1.sc
+++ b/3rdparty/bgfx/src/fs_clear1.sc
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
uniform vec4 bgfx_clear_color[8];
diff --git a/3rdparty/bgfx/src/fs_clear2.sc b/3rdparty/bgfx/src/fs_clear2.sc
index 1e7b2d49620..f0a849efae2 100644
--- a/3rdparty/bgfx/src/fs_clear2.sc
+++ b/3rdparty/bgfx/src/fs_clear2.sc
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
uniform vec4 bgfx_clear_color[8];
diff --git a/3rdparty/bgfx/src/fs_clear3.sc b/3rdparty/bgfx/src/fs_clear3.sc
index a1af2e627a0..529faaadbfa 100644
--- a/3rdparty/bgfx/src/fs_clear3.sc
+++ b/3rdparty/bgfx/src/fs_clear3.sc
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
uniform vec4 bgfx_clear_color[8];
diff --git a/3rdparty/bgfx/src/fs_clear4.sc b/3rdparty/bgfx/src/fs_clear4.sc
index 15a03eb0275..efc69e23776 100644
--- a/3rdparty/bgfx/src/fs_clear4.sc
+++ b/3rdparty/bgfx/src/fs_clear4.sc
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
uniform vec4 bgfx_clear_color[8];
diff --git a/3rdparty/bgfx/src/fs_clear5.sc b/3rdparty/bgfx/src/fs_clear5.sc
index e720cb5dff0..625dcc42493 100644
--- a/3rdparty/bgfx/src/fs_clear5.sc
+++ b/3rdparty/bgfx/src/fs_clear5.sc
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
uniform vec4 bgfx_clear_color[8];
diff --git a/3rdparty/bgfx/src/fs_clear6.sc b/3rdparty/bgfx/src/fs_clear6.sc
index e041bd44e38..c7ae56a3e14 100644
--- a/3rdparty/bgfx/src/fs_clear6.sc
+++ b/3rdparty/bgfx/src/fs_clear6.sc
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
uniform vec4 bgfx_clear_color[8];
diff --git a/3rdparty/bgfx/src/fs_clear7.sc b/3rdparty/bgfx/src/fs_clear7.sc
index 68a55b54016..fc8a11e4b94 100644
--- a/3rdparty/bgfx/src/fs_clear7.sc
+++ b/3rdparty/bgfx/src/fs_clear7.sc
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
uniform vec4 bgfx_clear_color[8];
diff --git a/3rdparty/bgfx/src/fs_debugfont.sc b/3rdparty/bgfx/src/fs_debugfont.sc
index 05de3fbce4d..5a765db9364 100644
--- a/3rdparty/bgfx/src/fs_debugfont.sc
+++ b/3rdparty/bgfx/src/fs_debugfont.sc
@@ -1,8 +1,8 @@
$input v_color0, v_color1, v_texcoord0
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "bgfx_shader.sh"
diff --git a/3rdparty/bgfx/src/glcontext_eagl.h b/3rdparty/bgfx/src/glcontext_eagl.h
index fcc1088c9c2..a4786c4983a 100644
--- a/3rdparty/bgfx/src/glcontext_eagl.h
+++ b/3rdparty/bgfx/src/glcontext_eagl.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#ifndef BGFX_GLCONTEXT_EAGL_H_HEADER_GUARD
diff --git a/3rdparty/bgfx/src/glcontext_eagl.mm b/3rdparty/bgfx/src/glcontext_eagl.mm
index 86c1967816c..253a31226c0 100644
--- a/3rdparty/bgfx/src/glcontext_eagl.mm
+++ b/3rdparty/bgfx/src/glcontext_eagl.mm
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "bgfx_p.h"
diff --git a/3rdparty/bgfx/src/glcontext_egl.cpp b/3rdparty/bgfx/src/glcontext_egl.cpp
index 8e901486b91..d29a3422795 100644
--- a/3rdparty/bgfx/src/glcontext_egl.cpp
+++ b/3rdparty/bgfx/src/glcontext_egl.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "bgfx_p.h"
@@ -11,6 +11,7 @@
# if BGFX_USE_EGL
# if BX_PLATFORM_RPI
+# include <X11/Xlib.h>
# include <bcm_host.h>
# endif // BX_PLATFORM_RPI
@@ -145,12 +146,6 @@ EGL_IMPORT
# if BX_PLATFORM_RPI
static EGL_DISPMANX_WINDOW_T s_dispmanWindow;
-
- void x11SetDisplayWindow(::Display* _display, ::Window _window)
- {
- // Noop for now...
- BX_UNUSED(_display, _window);
- }
# endif // BX_PLATFORM_RPI
void GlContext::create(uint32_t _width, uint32_t _height)
@@ -163,6 +158,10 @@ EGL_IMPORT
if (NULL == g_platformData.context)
{
+# if BX_PLATFORM_RPI
+ g_platformData.ndt = EGL_DEFAULT_DISPLAY;
+# endif // BX_PLATFORM_RPI
+
BX_UNUSED(_width, _height);
EGLNativeDisplayType ndt = (EGLNativeDisplayType)g_platformData.ndt;
EGLNativeWindowType nwh = (EGLNativeWindowType )g_platformData.nwh;
@@ -224,8 +223,8 @@ EGL_IMPORT
DISPMANX_DISPLAY_HANDLE_T dispmanDisplay = vc_dispmanx_display_open(0);
DISPMANX_UPDATE_HANDLE_T dispmanUpdate = vc_dispmanx_update_start(0);
- VC_RECT_T dstRect = { 0, 0, _width, _height };
- VC_RECT_T srcRect = { 0, 0, _width << 16, _height << 16 };
+ VC_RECT_T dstRect = { 0, 0, int32_t(_width), int32_t(_height) };
+ VC_RECT_T srcRect = { 0, 0, int32_t(_width) << 16, int32_t(_height) << 16 };
DISPMANX_ELEMENT_HANDLE_T dispmanElement = vc_dispmanx_element_add(dispmanUpdate
, dispmanDisplay
@@ -259,6 +258,9 @@ EGL_IMPORT
EGLint flags = 0;
+# if BX_PLATFORM_RPI
+ BX_UNUSED(hasEglKhrCreateContext, hasEglKhrNoError);
+#else
if (hasEglKhrCreateContext)
{
bx::write(&writer, EGLint(EGL_CONTEXT_MAJOR_VERSION_KHR) );
@@ -285,6 +287,7 @@ EGL_IMPORT
}
}
else
+# endif // BX_PLATFORM_RPI
{
bx::write(&writer, EGLint(EGL_CONTEXT_CLIENT_VERSION) );
bx::write(&writer, 2);
diff --git a/3rdparty/bgfx/src/glcontext_egl.h b/3rdparty/bgfx/src/glcontext_egl.h
index 5c263c2a598..95323fe419a 100644
--- a/3rdparty/bgfx/src/glcontext_egl.h
+++ b/3rdparty/bgfx/src/glcontext_egl.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#ifndef BGFX_GLCONTEXT_EGL_H_HEADER_GUARD
diff --git a/3rdparty/bgfx/src/glcontext_glx.cpp b/3rdparty/bgfx/src/glcontext_glx.cpp
index 547c7588687..4e7e38f3bbe 100644
--- a/3rdparty/bgfx/src/glcontext_glx.cpp
+++ b/3rdparty/bgfx/src/glcontext_glx.cpp
@@ -1,11 +1,11 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "bgfx_p.h"
-#if (BX_PLATFORM_FREEBSD || BX_PLATFORM_LINUX) && (BGFX_CONFIG_RENDERER_OPENGLES || BGFX_CONFIG_RENDERER_OPENGL)
+#if (BX_PLATFORM_BSD || BX_PLATFORM_LINUX) && (BGFX_CONFIG_RENDERER_OPENGLES || BGFX_CONFIG_RENDERER_OPENGL)
# include "renderer_gl.h"
# if BGFX_USE_GLX
@@ -308,4 +308,4 @@ namespace bgfx { namespace gl
# endif // BGFX_USE_GLX
-#endif // (BX_PLATFORM_FREEBSD || BX_PLATFORM_LINUX) && (BGFX_CONFIG_RENDERER_OPENGLES || BGFX_CONFIG_RENDERER_OPENGL)
+#endif // (BX_PLATFORM_BSD || BX_PLATFORM_LINUX) && (BGFX_CONFIG_RENDERER_OPENGLES || BGFX_CONFIG_RENDERER_OPENGL)
diff --git a/3rdparty/bgfx/src/glcontext_glx.h b/3rdparty/bgfx/src/glcontext_glx.h
index c88ce56400f..97cfc6d5b3f 100644
--- a/3rdparty/bgfx/src/glcontext_glx.h
+++ b/3rdparty/bgfx/src/glcontext_glx.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#ifndef BGFX_GLCONTEXT_GLX_H_HEADER_GUARD
diff --git a/3rdparty/bgfx/src/glcontext_nsgl.h b/3rdparty/bgfx/src/glcontext_nsgl.h
index d7d9886bdde..8271a782896 100644
--- a/3rdparty/bgfx/src/glcontext_nsgl.h
+++ b/3rdparty/bgfx/src/glcontext_nsgl.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#ifndef BGFX_GLCONTEXT_NSGL_H_HEADER_GUARD
diff --git a/3rdparty/bgfx/src/glcontext_nsgl.mm b/3rdparty/bgfx/src/glcontext_nsgl.mm
index e8ff5164d80..e7acb814cab 100644
--- a/3rdparty/bgfx/src/glcontext_nsgl.mm
+++ b/3rdparty/bgfx/src/glcontext_nsgl.mm
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "bgfx_p.h"
@@ -207,11 +207,21 @@ namespace bgfx { namespace gl
_func = (_proto)bx::dlsym(s_opengl, #_import); \
BX_TRACE("%p " #_func " (" #_import ")", _func); \
} \
- BGFX_FATAL(_optional || NULL != _func, Fatal::UnableToInitialize, "Failed to create OpenGL context. NSGLGetProcAddress(\"%s\")", #_import); \
+ BGFX_FATAL(_optional || NULL != _func, Fatal::UnableToInitialize, "Failed to create OpenGL context. GetProcAddress(\"%s\")", #_import); \
}
# include "glimports.h"
}
} /* namespace gl */ } // namespace bgfx
+void* nsglGetProcAddress(const GLubyte* _name)
+{
+ using namespace bgfx::gl;
+ if (NULL == s_opengl)
+ {
+ s_opengl = bx::dlopen("/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL");
+ }
+ return bx::dlsym(s_opengl, (const char*)_name);
+}
+
#endif // BX_PLATFORM_OSX && (BGFX_CONFIG_RENDERER_OPENGLES2|BGFX_CONFIG_RENDERER_OPENGLES3|BGFX_CONFIG_RENDERER_OPENGL)
diff --git a/3rdparty/bgfx/src/glcontext_ppapi.cpp b/3rdparty/bgfx/src/glcontext_ppapi.cpp
index fb17a11ff5c..977cd6c96da 100644
--- a/3rdparty/bgfx/src/glcontext_ppapi.cpp
+++ b/3rdparty/bgfx/src/glcontext_ppapi.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "bgfx_p.h"
@@ -31,6 +31,7 @@ namespace bgfx { namespace gl
, m_instInterface(NULL)
, m_graphicsInterface(NULL)
, m_instancedArrays(NULL)
+ , m_query(NULL)
, m_postSwapBuffers(NULL)
, m_forceSwap(true)
{
@@ -59,6 +60,7 @@ namespace bgfx { namespace gl
const PPB_Instance* m_instInterface;
const PPB_Graphics3D* m_graphicsInterface;
const PPB_OpenGLES2InstancedArrays* m_instancedArrays;
+ const PPB_OpenGLES2Query* m_query;
PostSwapBuffersFn m_postSwapBuffers;
bool m_forceSwap;
};
@@ -95,6 +97,40 @@ namespace bgfx { namespace gl
s_ppapi.m_instancedArrays->DrawElementsInstancedANGLE(s_ppapi.m_context, _mode, _count, _type, _indices, _primcount);
}
+ static void GL_APIENTRY naclGenQueries(GLsizei _n, GLuint* _queries)
+ {
+ s_ppapi.m_query->GenQueriesEXT(s_ppapi.m_context, _n, _queries);
+ }
+
+ static void GL_APIENTRY naclDeleteQueries(GLsizei _n, const GLuint* _queries)
+ {
+ s_ppapi.m_query->DeleteQueriesEXT(s_ppapi.m_context, _n, _queries);
+ }
+
+ static void GL_APIENTRY naclBeginQuery(GLenum _target, GLuint _id)
+ {
+ BX_UNUSED(_target);
+ s_ppapi.m_query->BeginQueryEXT(s_ppapi.m_context, GL_ANY_SAMPLES_PASSED_EXT, _id);
+ }
+
+ static void GL_APIENTRY naclEndQuery(GLenum _target)
+ {
+ BX_UNUSED(_target);
+ s_ppapi.m_query->EndQueryEXT(s_ppapi.m_context, GL_ANY_SAMPLES_PASSED_EXT);
+ }
+
+ static void GL_APIENTRY naclGetQueryObjectiv(GLuint _id, GLenum _pname, GLint* _params)
+ {
+ s_ppapi.m_query->GetQueryivEXT(s_ppapi.m_context, GL_ANY_SAMPLES_PASSED_EXT, GL_CURRENT_QUERY_EXT, _params);
+ }
+
+ static void GL_APIENTRY naclGetQueryObjectui64v(GLuint _id, GLenum _pname, GLuint64* _params)
+ {
+ GLint params;
+ s_ppapi.m_query->GetQueryivEXT(s_ppapi.m_context, GL_ANY_SAMPLES_PASSED_EXT, GL_CURRENT_QUERY_EXT, &params);
+ *_params = params;
+ }
+
bool Ppapi::setInterfaces(PP_Instance _instance, const PPB_Instance* _instInterface, const PPB_Graphics3D* _graphicsInterface, PostSwapBuffersFn _postSwapBuffers)
{
BX_TRACE("PPAPI Interfaces");
@@ -103,6 +139,7 @@ namespace bgfx { namespace gl
m_instInterface = _instInterface;
m_graphicsInterface = _graphicsInterface;
m_instancedArrays = glGetInstancedArraysInterfacePPAPI();
+ m_query = glGetQueryInterfacePPAPI();
m_postSwapBuffers = _postSwapBuffers;
int32_t attribs[] =
@@ -128,9 +165,22 @@ namespace bgfx { namespace gl
glSetCurrentContextPPAPI(m_context);
m_graphicsInterface->SwapBuffers(m_context, naclSwapComplete);
- glVertexAttribDivisor = naclVertexAttribDivisor;
- glDrawArraysInstanced = naclDrawArraysInstanced;
- glDrawElementsInstanced = naclDrawElementsInstanced;
+ if (NULL != m_instancedArrays)
+ {
+ glVertexAttribDivisor = naclVertexAttribDivisor;
+ glDrawArraysInstanced = naclDrawArraysInstanced;
+ glDrawElementsInstanced = naclDrawElementsInstanced;
+ }
+
+ if (NULL != m_query)
+ {
+ glGenQueries = naclGenQueries;
+ glDeleteQueries = naclDeleteQueries;
+ glBeginQuery = naclBeginQuery;
+ glEndQuery = naclEndQuery;
+ glGetQueryObjectiv = naclGetQueryObjectiv;
+ glGetQueryObjectui64v = naclGetQueryObjectui64v;
+ }
// Prevent render thread creation.
RenderFrame::Enum result = renderFrame();
diff --git a/3rdparty/bgfx/src/glcontext_ppapi.h b/3rdparty/bgfx/src/glcontext_ppapi.h
index b67f19dfbe2..0ff767458ac 100644
--- a/3rdparty/bgfx/src/glcontext_ppapi.h
+++ b/3rdparty/bgfx/src/glcontext_ppapi.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#ifndef BGFX_GLCONTEXT_PPAPI_H_HEADER_GUARD
diff --git a/3rdparty/bgfx/src/glcontext_wgl.cpp b/3rdparty/bgfx/src/glcontext_wgl.cpp
index 2105efda2f7..3c52702a6e5 100644
--- a/3rdparty/bgfx/src/glcontext_wgl.cpp
+++ b/3rdparty/bgfx/src/glcontext_wgl.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "bgfx_p.h"
diff --git a/3rdparty/bgfx/src/glcontext_wgl.h b/3rdparty/bgfx/src/glcontext_wgl.h
index 4665951b717..c7e51511157 100644
--- a/3rdparty/bgfx/src/glcontext_wgl.h
+++ b/3rdparty/bgfx/src/glcontext_wgl.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#ifndef BGFX_GLCONTEXT_WGL_H_HEADER_GUARD
diff --git a/3rdparty/bgfx/src/glimports.h b/3rdparty/bgfx/src/glimports.h
index 0209f0b5f7d..5891bd55ec9 100644
--- a/3rdparty/bgfx/src/glimports.h
+++ b/3rdparty/bgfx/src/glimports.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#if !defined(GL_IMPORT) && !defined(GL_EXTENSION)
@@ -533,6 +533,7 @@ GL_IMPORT_NV___(true, PFNGLBEGINQUERYPROC, glBeginQuery)
GL_IMPORT_NV___(true, PFNGLENDQUERYPROC, glEndQuery);
GL_IMPORT_NV___(true, PFNGLGETQUERYOBJECTIVPROC, glGetQueryObjectiv);
GL_IMPORT_NV___(true, PFNGLGETQUERYOBJECTUI64VPROC, glGetQueryObjectui64v);
+GL_IMPORT_NV___(true, PFNGLQUERYCOUNTERPROC, glQueryCounter);
GL_IMPORT (true, PFNGLINVALIDATEFRAMEBUFFERPROC, glInvalidateFramebuffer, glDiscardFramebufferEXT);
@@ -597,6 +598,7 @@ GL_IMPORT______(true, PFNGLBEGINQUERYPROC, glBeginQuery)
GL_IMPORT______(true, PFNGLENDQUERYPROC, glEndQuery);
GL_IMPORT______(true, PFNGLGETQUERYOBJECTIVPROC, glGetQueryObjectiv);
GL_IMPORT______(true, PFNGLGETQUERYOBJECTUI64VPROC, glGetQueryObjectui64v);
+GL_IMPORT______(true, PFNGLQUERYCOUNTERPROC, glQueryCounter);
GL_IMPORT______(true, PFNGLDRAWARRAYSINDIRECTPROC, glDrawArraysIndirect);
GL_IMPORT______(true, PFNGLDRAWELEMENTSINDIRECTPROC, glDrawElementsIndirect);
diff --git a/3rdparty/bgfx/src/image.cpp b/3rdparty/bgfx/src/image.cpp
index 8a9ea639336..69bad82e943 100644
--- a/3rdparty/bgfx/src/image.cpp
+++ b/3rdparty/bgfx/src/image.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "bgfx_p.h"
@@ -193,6 +193,14 @@ namespace bgfx
;
}
+ bool isValid(TextureFormat::Enum _format)
+ {
+ return _format != TextureFormat::Unknown
+ && _format != TextureFormat::UnknownDepth
+ && _format != TextureFormat::Count
+ ;
+ }
+
uint8_t getBitsPerPixel(TextureFormat::Enum _format)
{
return s_imageBlockInfo[_format].bitsPerPixel;
@@ -213,6 +221,89 @@ namespace bgfx
return s_textureFormatName[_format];
}
+ TextureFormat::Enum getFormat(const char* _name)
+ {
+ for (uint32_t ii = 0; ii < TextureFormat::Count; ++ii)
+ {
+ const TextureFormat::Enum fmt = TextureFormat::Enum(ii);
+ if (isValid(fmt) )
+ {
+ if (0 == bx::stricmp(s_textureFormatName[ii], _name) )
+ {
+ return fmt;
+ }
+ }
+ }
+
+ return TextureFormat::Unknown;
+ }
+
+ uint8_t imageGetNumMips(TextureFormat::Enum _format, uint16_t _width, uint16_t _height, uint16_t _depth)
+ {
+ const ImageBlockInfo& blockInfo = getBlockInfo(_format);
+ const uint16_t blockWidth = blockInfo.blockWidth;
+ const uint16_t blockHeight = blockInfo.blockHeight;
+ const uint16_t minBlockX = blockInfo.minBlockX;
+ const uint16_t minBlockY = blockInfo.minBlockY;
+
+ _width = bx::uint16_max(blockWidth * minBlockX, ( (_width + blockWidth - 1) / blockWidth)*blockWidth);
+ _height = bx::uint16_max(blockHeight * minBlockY, ( (_height + blockHeight - 1) / blockHeight)*blockHeight);
+ _depth = bx::uint16_max(1, _depth);
+
+ uint8_t numMips = 0;
+
+ for (uint32_t width = _width, height = _height, depth = _depth
+ ; blockWidth < width && blockHeight < height && 1 < depth
+ ; ++numMips)
+ {
+ width = bx::uint32_max(blockWidth * minBlockX, ( (width + blockWidth - 1) / blockWidth )*blockWidth);
+ height = bx::uint32_max(blockHeight * minBlockY, ( (height + blockHeight - 1) / blockHeight)*blockHeight);
+ depth = bx::uint32_max(1, depth);
+
+ width >>= 1;
+ height >>= 1;
+ depth >>= 1;
+ }
+
+ return numMips;
+ }
+
+ uint32_t imageGetSize(TextureFormat::Enum _format, uint16_t _width, uint16_t _height, uint16_t _depth, bool _cubeMap, uint8_t _numMips)
+ {
+ const ImageBlockInfo& blockInfo = getBlockInfo(_format);
+ const uint8_t bpp = blockInfo.bitsPerPixel;
+ const uint16_t blockWidth = blockInfo.blockWidth;
+ const uint16_t blockHeight = blockInfo.blockHeight;
+ const uint16_t minBlockX = blockInfo.minBlockX;
+ const uint16_t minBlockY = blockInfo.minBlockY;
+
+ _width = bx::uint16_max(blockWidth * minBlockX, ( (_width + blockWidth - 1) / blockWidth)*blockWidth);
+ _height = bx::uint16_max(blockHeight * minBlockY, ( (_height + blockHeight - 1) / blockHeight)*blockHeight);
+ _depth = bx::uint16_max(1, _depth);
+ _numMips = uint8_t(bx::uint16_max(1, _numMips) );
+
+ uint32_t width = _width;
+ uint32_t height = _height;
+ uint32_t depth = _depth;
+ uint32_t sides = _cubeMap ? 6 : 1;
+ uint32_t size = 0;
+
+ for (uint32_t lod = 0; lod < _numMips; ++lod)
+ {
+ width = bx::uint32_max(blockWidth * minBlockX, ( (width + blockWidth - 1) / blockWidth )*blockWidth);
+ height = bx::uint32_max(blockHeight * minBlockY, ( (height + blockHeight - 1) / blockHeight)*blockHeight);
+ depth = bx::uint32_max(1, depth);
+
+ size += width*height*depth*bpp/8 * sides;
+
+ width >>= 1;
+ height >>= 1;
+ depth >>= 1;
+ }
+
+ return size;
+ }
+
void imageSolid(uint32_t _width, uint32_t _height, uint32_t _solid, void* _dst)
{
uint32_t* dst = (uint32_t*)_dst;
@@ -449,47 +540,6 @@ namespace bgfx
imageCopy(_height, _srcPitch, _src, dstPitch, _dst);
}
- void imageWriteTga(bx::WriterI* _writer, uint32_t _width, uint32_t _height, uint32_t _srcPitch, const void* _src, bool _grayscale, bool _yflip)
- {
- uint8_t type = _grayscale ? 3 : 2;
- uint8_t bpp = _grayscale ? 8 : 32;
-
- uint8_t header[18] = {};
- header[2] = type;
- header[12] = _width&0xff;
- header[13] = (_width>>8)&0xff;
- header[14] = _height&0xff;
- header[15] = (_height>>8)&0xff;
- header[16] = bpp;
- header[17] = 32;
-
- bx::write(_writer, header, sizeof(header) );
-
- uint32_t dstPitch = _width*bpp/8;
- if (_yflip)
- {
- uint8_t* data = (uint8_t*)_src + _srcPitch*_height - _srcPitch;
- for (uint32_t yy = 0; yy < _height; ++yy)
- {
- bx::write(_writer, data, dstPitch);
- data -= _srcPitch;
- }
- }
- else if (_srcPitch == dstPitch)
- {
- bx::write(_writer, _src, _height*_srcPitch);
- }
- else
- {
- uint8_t* data = (uint8_t*)_src;
- for (uint32_t yy = 0; yy < _height; ++yy)
- {
- bx::write(_writer, data, dstPitch);
- data += _srcPitch;
- }
- }
- }
-
uint8_t bitRangeConvert(uint32_t _in, uint32_t _from, uint32_t _to)
{
using namespace bx;
@@ -1614,18 +1664,19 @@ namespace bgfx
}
}
- _imageContainer.m_data = NULL;
- _imageContainer.m_size = 0;
- _imageContainer.m_offset = (uint32_t)bx::seek(_reader);
- _imageContainer.m_width = width;
- _imageContainer.m_height = height;
- _imageContainer.m_depth = depth;
+ _imageContainer.m_data = NULL;
+ _imageContainer.m_size = 0;
+ _imageContainer.m_offset = (uint32_t)bx::seek(_reader);
+ _imageContainer.m_width = width;
+ _imageContainer.m_height = height;
+ _imageContainer.m_depth = depth;
_imageContainer.m_format = uint8_t(format);
_imageContainer.m_numMips = uint8_t( (caps[0] & DDSCAPS_MIPMAP) ? mips : 1);
_imageContainer.m_hasAlpha = hasAlpha;
_imageContainer.m_cubeMap = cubeMap;
- _imageContainer.m_ktx = false;
- _imageContainer.m_srgb = srgb;
+ _imageContainer.m_ktx = false;
+ _imageContainer.m_ktxLE = false;
+ _imageContainer.m_srgb = srgb;
return TextureFormat::Unknown != format;
}
@@ -1654,12 +1705,20 @@ namespace bgfx
#define KTX_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1
#define KTX_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2
#define KTX_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3
+#define KTX_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D
+#define KTX_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E
+#define KTX_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F
#define KTX_COMPRESSED_LUMINANCE_LATC1_EXT 0x8C70
#define KTX_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT 0x8C72
#define KTX_COMPRESSED_RGBA_BPTC_UNORM_ARB 0x8E8C
#define KTX_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB 0x8E8D
#define KTX_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB 0x8E8E
#define KTX_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB 0x8E8F
+#define KTX_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT 0x8A54
+#define KTX_COMPRESSED_SRGB_PVRTC_4BPPV1_EXT 0x8A55
+#define KTX_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT 0x8A56
+#define KTX_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT 0x8A57
+
#define KTX_R8 0x8229
#define KTX_R16 0x822A
#define KTX_RG8 0x822B
@@ -1668,62 +1727,151 @@ namespace bgfx
#define KTX_R32F 0x822E
#define KTX_RG16F 0x822F
#define KTX_RG32F 0x8230
+#define KTX_RGBA8 0x8058
#define KTX_RGBA16 0x805B
#define KTX_RGBA16F 0x881A
#define KTX_R32UI 0x8236
#define KTX_RG32UI 0x823C
#define KTX_RGBA32UI 0x8D70
-#define KTX_BGRA 0x80E1
#define KTX_RGBA32F 0x8814
#define KTX_RGB565 0x8D62
#define KTX_RGBA4 0x8056
#define KTX_RGB5_A1 0x8057
#define KTX_RGB10_A2 0x8059
-
- static struct TranslateKtxFormat
+#define KTX_R8I 0x8231
+#define KTX_R8UI 0x8232
+#define KTX_R16I 0x8233
+#define KTX_R16UI 0x8234
+#define KTX_R32I 0x8235
+#define KTX_R32UI 0x8236
+#define KTX_RG8I 0x8237
+#define KTX_RG8UI 0x8238
+#define KTX_RG16I 0x8239
+#define KTX_RG16UI 0x823A
+#define KTX_RG32I 0x823B
+#define KTX_RG32UI 0x823C
+#define KTX_R8_SNORM 0x8F94
+#define KTX_RG8_SNORM 0x8F95
+#define KTX_RGB8_SNORM 0x8F96
+#define KTX_RGBA8_SNORM 0x8F97
+#define KTX_R16_SNORM 0x8F98
+#define KTX_RG16_SNORM 0x8F99
+#define KTX_RGB16_SNORM 0x8F9A
+#define KTX_RGBA16_SNORM 0x8F9B
+#define KTX_SRGB8_ALPHA8 0x8C43
+#define KTX_RGBA32UI 0x8D70
+#define KTX_RGB32UI 0x8D71
+#define KTX_RGBA16UI 0x8D76
+#define KTX_RGB16UI 0x8D77
+#define KTX_RGBA8UI 0x8D7C
+#define KTX_RGB8UI 0x8D7D
+#define KTX_RGBA32I 0x8D82
+#define KTX_RGB32I 0x8D83
+#define KTX_RGBA16I 0x8D88
+#define KTX_RGB16I 0x8D89
+#define KTX_RGBA8I 0x8D8E
+#define KTX_RGB8I 0x8D8F
+#define KTX_RGB9_E5 0x8C3D
+#define KTX_R11F_G11F_B10F 0x8C3A
+
+#define KTX_ZERO 0
+#define KTX_RED 0x1903
+#define KTX_ALPHA 0x1906
+#define KTX_RGB 0x1907
+#define KTX_RGBA 0x1908
+#define KTX_BGRA 0x80E1
+#define KTX_RG 0x8227
+
+#define KTX_BYTE 0x1400
+#define KTX_UNSIGNED_BYTE 0x1401
+#define KTX_SHORT 0x1402
+#define KTX_UNSIGNED_SHORT 0x1403
+#define KTX_INT 0x1404
+#define KTX_UNSIGNED_INT 0x1405
+#define KTX_FLOAT 0x1406
+#define KTX_HALF_FLOAT 0x140B
+#define KTX_UNSIGNED_INT_5_9_9_9_REV 0x8C3E
+#define KTX_UNSIGNED_SHORT_5_6_5 0x8363
+#define KTX_UNSIGNED_SHORT_4_4_4_4 0x8033
+#define KTX_UNSIGNED_SHORT_5_5_5_1 0x8034
+#define KTX_UNSIGNED_INT_2_10_10_10_REV 0x8368
+#define KTX_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B
+
+ struct KtxFormatInfo
{
- uint32_t m_format;
- TextureFormat::Enum m_textureFormat;
+ uint32_t m_internalFmt;
+ uint32_t m_internalFmtSrgb;
+ uint32_t m_fmt;
+ uint32_t m_type;
+ };
- } s_translateKtxFormat[] =
- {
- { KTX_COMPRESSED_RGBA_S3TC_DXT1_EXT, TextureFormat::BC1 },
- { KTX_COMPRESSED_RGBA_S3TC_DXT3_EXT, TextureFormat::BC2 },
- { KTX_COMPRESSED_RGBA_S3TC_DXT5_EXT, TextureFormat::BC3 },
- { KTX_COMPRESSED_LUMINANCE_LATC1_EXT, TextureFormat::BC4 },
- { KTX_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT, TextureFormat::BC5 },
- { KTX_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB, TextureFormat::BC6H },
- { KTX_COMPRESSED_RGBA_BPTC_UNORM_ARB, TextureFormat::BC7 },
- { KTX_ETC1_RGB8_OES, TextureFormat::ETC1 },
- { KTX_COMPRESSED_RGB8_ETC2, TextureFormat::ETC2 },
- { KTX_COMPRESSED_RGBA8_ETC2_EAC, TextureFormat::ETC2A },
- { KTX_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, TextureFormat::ETC2A1 },
- { KTX_COMPRESSED_RGB_PVRTC_2BPPV1_IMG, TextureFormat::PTC12 },
- { KTX_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG, TextureFormat::PTC12A },
- { KTX_COMPRESSED_RGB_PVRTC_4BPPV1_IMG, TextureFormat::PTC14 },
- { KTX_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG, TextureFormat::PTC14A },
- { KTX_COMPRESSED_RGBA_PVRTC_2BPPV2_IMG, TextureFormat::PTC22 },
- { KTX_COMPRESSED_RGBA_PVRTC_4BPPV2_IMG, TextureFormat::PTC24 },
- { KTX_R8, TextureFormat::R8 },
- { KTX_RGBA16, TextureFormat::RGBA16 },
- { KTX_RGBA16F, TextureFormat::RGBA16F },
- { KTX_R32UI, TextureFormat::R32U },
- { KTX_R32F, TextureFormat::R32F },
- { KTX_RG8, TextureFormat::RG8 },
- { KTX_RG16, TextureFormat::RG16 },
- { KTX_RG16F, TextureFormat::RG16F },
- { KTX_RG32UI, TextureFormat::RG32U },
- { KTX_RG32F, TextureFormat::RG32F },
- { KTX_BGRA, TextureFormat::BGRA8 },
- { KTX_RGBA16, TextureFormat::RGBA16 },
- { KTX_RGBA16F, TextureFormat::RGBA16F },
- { KTX_RGBA32UI, TextureFormat::RGBA32U },
- { KTX_RGBA32F, TextureFormat::RGBA32F },
- { KTX_RGB565, TextureFormat::R5G6B5 },
- { KTX_RGBA4, TextureFormat::RGBA4 },
- { KTX_RGB5_A1, TextureFormat::RGB5A1 },
- { KTX_RGB10_A2, TextureFormat::RGB10A2 },
+ static KtxFormatInfo s_translateKtxFormat[] =
+ {
+ { KTX_COMPRESSED_RGBA_S3TC_DXT1_EXT, KTX_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, KTX_COMPRESSED_RGBA_S3TC_DXT1_EXT, KTX_ZERO, }, // BC1
+ { KTX_COMPRESSED_RGBA_S3TC_DXT3_EXT, KTX_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, KTX_COMPRESSED_RGBA_S3TC_DXT3_EXT, KTX_ZERO, }, // BC2
+ { KTX_COMPRESSED_RGBA_S3TC_DXT5_EXT, KTX_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, KTX_COMPRESSED_RGBA_S3TC_DXT5_EXT, KTX_ZERO, }, // BC3
+ { KTX_COMPRESSED_LUMINANCE_LATC1_EXT, KTX_ZERO, KTX_COMPRESSED_LUMINANCE_LATC1_EXT, KTX_ZERO, }, // BC4
+ { KTX_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT, KTX_ZERO, KTX_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT, KTX_ZERO, }, // BC5
+ { KTX_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB, KTX_ZERO, KTX_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB, KTX_ZERO, }, // BC6H
+ { KTX_COMPRESSED_RGBA_BPTC_UNORM_ARB, KTX_ZERO, KTX_COMPRESSED_RGBA_BPTC_UNORM_ARB, KTX_ZERO, }, // BC7
+ { KTX_ETC1_RGB8_OES, KTX_ZERO, KTX_ETC1_RGB8_OES, KTX_ZERO, }, // ETC1
+ { KTX_COMPRESSED_RGB8_ETC2, KTX_ZERO, KTX_COMPRESSED_RGB8_ETC2, KTX_ZERO, }, // ETC2
+ { KTX_COMPRESSED_RGBA8_ETC2_EAC, KTX_COMPRESSED_SRGB8_ETC2, KTX_COMPRESSED_RGBA8_ETC2_EAC, KTX_ZERO, }, // ETC2A
+ { KTX_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, KTX_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, KTX_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, KTX_ZERO, }, // ETC2A1
+ { KTX_COMPRESSED_RGB_PVRTC_2BPPV1_IMG, KTX_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT, KTX_COMPRESSED_RGB_PVRTC_2BPPV1_IMG, KTX_ZERO, }, // PTC12
+ { KTX_COMPRESSED_RGB_PVRTC_4BPPV1_IMG, KTX_COMPRESSED_SRGB_PVRTC_4BPPV1_EXT, KTX_COMPRESSED_RGB_PVRTC_4BPPV1_IMG, KTX_ZERO, }, // PTC14
+ { KTX_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG, KTX_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT, KTX_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG, KTX_ZERO, }, // PTC12A
+ { KTX_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG, KTX_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT, KTX_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG, KTX_ZERO, }, // PTC14A
+ { KTX_COMPRESSED_RGBA_PVRTC_2BPPV2_IMG, KTX_ZERO, KTX_COMPRESSED_RGBA_PVRTC_2BPPV2_IMG, KTX_ZERO, }, // PTC22
+ { KTX_COMPRESSED_RGBA_PVRTC_4BPPV2_IMG, KTX_ZERO, KTX_COMPRESSED_RGBA_PVRTC_4BPPV2_IMG, KTX_ZERO, }, // PTC24
+ { KTX_ZERO, KTX_ZERO, KTX_ZERO, KTX_ZERO, }, // Unknown
+ { KTX_ZERO, KTX_ZERO, KTX_ZERO, KTX_ZERO, }, // R1
+ { KTX_ALPHA, KTX_ZERO, KTX_ALPHA, KTX_UNSIGNED_BYTE, }, // A8
+ { KTX_R8, KTX_ZERO, KTX_RED, KTX_UNSIGNED_BYTE, }, // R8
+ { KTX_R8I, KTX_ZERO, KTX_RED, KTX_BYTE, }, // R8S
+ { KTX_R8UI, KTX_ZERO, KTX_RED, KTX_UNSIGNED_BYTE, }, // R8S
+ { KTX_R8_SNORM, KTX_ZERO, KTX_RED, KTX_BYTE, }, // R8S
+ { KTX_R16, KTX_ZERO, KTX_RED, KTX_UNSIGNED_SHORT, }, // R16
+ { KTX_R16I, KTX_ZERO, KTX_RED, KTX_SHORT, }, // R16I
+ { KTX_R16UI, KTX_ZERO, KTX_RED, KTX_UNSIGNED_SHORT, }, // R16U
+ { KTX_R16F, KTX_ZERO, KTX_RED, KTX_HALF_FLOAT, }, // R16F
+ { KTX_R16_SNORM, KTX_ZERO, KTX_RED, KTX_SHORT, }, // R16S
+ { KTX_R32I, KTX_ZERO, KTX_RED, KTX_INT, }, // R32I
+ { KTX_R32UI, KTX_ZERO, KTX_RED, KTX_UNSIGNED_INT, }, // R32U
+ { KTX_R32F, KTX_ZERO, KTX_RED, KTX_FLOAT, }, // R32F
+ { KTX_RG8, KTX_ZERO, KTX_RG, KTX_UNSIGNED_BYTE, }, // RG8
+ { KTX_RG8I, KTX_ZERO, KTX_RG, KTX_BYTE, }, // RG8I
+ { KTX_RG8UI, KTX_ZERO, KTX_RG, KTX_UNSIGNED_BYTE, }, // RG8U
+ { KTX_RG8_SNORM, KTX_ZERO, KTX_RG, KTX_BYTE, }, // RG8S
+ { KTX_RG16, KTX_ZERO, KTX_RG, KTX_UNSIGNED_SHORT, }, // RG16
+ { KTX_RG16I, KTX_ZERO, KTX_RG, KTX_SHORT, }, // RG16
+ { KTX_RG16UI, KTX_ZERO, KTX_RG, KTX_UNSIGNED_SHORT, }, // RG16
+ { KTX_RG16F, KTX_ZERO, KTX_RG, KTX_FLOAT, }, // RG16F
+ { KTX_RG16_SNORM, KTX_ZERO, KTX_RG, KTX_SHORT, }, // RG16S
+ { KTX_RG32I, KTX_ZERO, KTX_RG, KTX_INT, }, // RG32I
+ { KTX_RG32UI, KTX_ZERO, KTX_RG, KTX_UNSIGNED_INT, }, // RG32U
+ { KTX_RG32F, KTX_ZERO, KTX_RG, KTX_FLOAT, }, // RG32F
+ { KTX_RGB9_E5, KTX_ZERO, KTX_RGB, KTX_UNSIGNED_INT_5_9_9_9_REV, }, // RGB9E5F
+ { KTX_RGBA8, KTX_SRGB8_ALPHA8, KTX_BGRA, KTX_UNSIGNED_BYTE, }, // BGRA8
+ { KTX_RGBA8, KTX_SRGB8_ALPHA8, KTX_RGBA, KTX_UNSIGNED_BYTE, }, // RGBA8
+ { KTX_RGBA8I, KTX_ZERO, KTX_RGBA, KTX_BYTE, }, // RGBA8I
+ { KTX_RGBA8UI, KTX_ZERO, KTX_RGBA, KTX_UNSIGNED_BYTE, }, // RGBA8U
+ { KTX_RGBA8_SNORM, KTX_ZERO, KTX_RGBA, KTX_BYTE, }, // RGBA8S
+ { KTX_RGBA16, KTX_ZERO, KTX_RGBA, KTX_UNSIGNED_SHORT, }, // RGBA16
+ { KTX_RGBA16I, KTX_ZERO, KTX_RGBA, KTX_SHORT, }, // RGBA16I
+ { KTX_RGBA16UI, KTX_ZERO, KTX_RGBA, KTX_UNSIGNED_SHORT, }, // RGBA16U
+ { KTX_RGBA16F, KTX_ZERO, KTX_RGBA, KTX_HALF_FLOAT, }, // RGBA16F
+ { KTX_RGBA16_SNORM, KTX_ZERO, KTX_RGBA, KTX_SHORT, }, // RGBA16S
+ { KTX_RGBA32I, KTX_ZERO, KTX_RGBA, KTX_INT, }, // RGBA32I
+ { KTX_RGBA32UI, KTX_ZERO, KTX_RGBA, KTX_UNSIGNED_INT, }, // RGBA32U
+ { KTX_RGBA32F, KTX_ZERO, KTX_RGBA, KTX_FLOAT, }, // RGBA32F
+ { KTX_RGB565, KTX_ZERO, KTX_RGB, KTX_UNSIGNED_SHORT_5_6_5, }, // R5G6B5
+ { KTX_RGBA4, KTX_ZERO, KTX_RGBA, KTX_UNSIGNED_SHORT_4_4_4_4, }, // RGBA4
+ { KTX_RGB5_A1, KTX_ZERO, KTX_RGBA, KTX_UNSIGNED_SHORT_5_5_5_1, }, // RGB5A1
+ { KTX_RGB10_A2, KTX_ZERO, KTX_RGBA, KTX_UNSIGNED_INT_2_10_10_10_REV, }, // RGB10A2
+ { KTX_R11F_G11F_B10F, KTX_ZERO, KTX_RGB, KTX_UNSIGNED_INT_10F_11F_11F_REV, }, // R11G11B10F
};
+ BX_STATIC_ASSERT(TextureFormat::UnknownDepth == BX_COUNTOF(s_translateKtxFormat) );
bool imageParseKtx(ImageContainer& _imageContainer, bx::ReaderSeekerI* _reader)
{
@@ -1785,24 +1933,26 @@ namespace bgfx
for (uint32_t ii = 0; ii < BX_COUNTOF(s_translateKtxFormat); ++ii)
{
- if (s_translateKtxFormat[ii].m_format == glInternalFormat)
+ if (s_translateKtxFormat[ii].m_internalFmt == glInternalFormat)
{
- format = s_translateKtxFormat[ii].m_textureFormat;
+ format = TextureFormat::Enum(ii);
break;
}
}
- _imageContainer.m_data = NULL;
- _imageContainer.m_size = 0;
- _imageContainer.m_offset = (uint32_t)offset;
- _imageContainer.m_width = width;
- _imageContainer.m_height = height;
- _imageContainer.m_depth = depth;
- _imageContainer.m_format = uint8_t(format);
+ _imageContainer.m_data = NULL;
+ _imageContainer.m_size = 0;
+ _imageContainer.m_offset = (uint32_t)offset;
+ _imageContainer.m_width = width;
+ _imageContainer.m_height = height;
+ _imageContainer.m_depth = depth;
+ _imageContainer.m_format = uint8_t(format);
_imageContainer.m_numMips = uint8_t(numMips);
_imageContainer.m_hasAlpha = hasAlpha;
_imageContainer.m_cubeMap = numFaces > 1;
- _imageContainer.m_ktx = true;
+ _imageContainer.m_ktx = true;
+ _imageContainer.m_ktxLE = fromLittleEndian;
+ _imageContainer.m_srgb = false;
return TextureFormat::Unknown != format;
}
@@ -1938,18 +2088,19 @@ namespace bgfx
}
}
- _imageContainer.m_data = NULL;
- _imageContainer.m_size = 0;
- _imageContainer.m_offset = (uint32_t)offset;
- _imageContainer.m_width = width;
- _imageContainer.m_height = height;
- _imageContainer.m_depth = depth;
- _imageContainer.m_format = uint8_t(format);
+ _imageContainer.m_data = NULL;
+ _imageContainer.m_size = 0;
+ _imageContainer.m_offset = (uint32_t)offset;
+ _imageContainer.m_width = width;
+ _imageContainer.m_height = height;
+ _imageContainer.m_depth = depth;
+ _imageContainer.m_format = uint8_t(format);
_imageContainer.m_numMips = uint8_t(numMips);
_imageContainer.m_hasAlpha = hasAlpha;
_imageContainer.m_cubeMap = numFaces > 1;
- _imageContainer.m_ktx = false;
- _imageContainer.m_srgb = colorSpace > 0;
+ _imageContainer.m_ktx = false;
+ _imageContainer.m_ktxLE = false;
+ _imageContainer.m_srgb = colorSpace > 0;
return TextureFormat::Unknown != format;
}
@@ -1988,14 +2139,15 @@ namespace bgfx
_imageContainer.m_data = tc.m_mem->data;
_imageContainer.m_size = tc.m_mem->size;
}
- _imageContainer.m_width = tc.m_width;
- _imageContainer.m_height = tc.m_height;
- _imageContainer.m_depth = tc.m_depth;
- _imageContainer.m_numMips = tc.m_numMips;
+ _imageContainer.m_width = tc.m_width;
+ _imageContainer.m_height = tc.m_height;
+ _imageContainer.m_depth = tc.m_depth;
+ _imageContainer.m_numMips = tc.m_numMips;
_imageContainer.m_hasAlpha = false;
- _imageContainer.m_cubeMap = tc.m_cubeMap;
- _imageContainer.m_ktx = false;
- _imageContainer.m_srgb = false;
+ _imageContainer.m_cubeMap = tc.m_cubeMap;
+ _imageContainer.m_ktx = false;
+ _imageContainer.m_ktxLE = false;
+ _imageContainer.m_srgb = false;
return true;
}
@@ -2237,10 +2389,10 @@ namespace bgfx
bool imageGetRawData(const ImageContainer& _imageContainer, uint8_t _side, uint8_t _lod, const void* _data, uint32_t _size, ImageMip& _mip)
{
uint32_t offset = _imageContainer.m_offset;
- TextureFormat::Enum type = TextureFormat::Enum(_imageContainer.m_format);
+ TextureFormat::Enum format = TextureFormat::Enum(_imageContainer.m_format);
bool hasAlpha = _imageContainer.m_hasAlpha;
- const ImageBlockInfo& blockInfo = s_imageBlockInfo[type];
+ const ImageBlockInfo& blockInfo = s_imageBlockInfo[format];
const uint8_t bpp = blockInfo.bitsPerPixel;
const uint32_t blockSize = blockInfo.blockSize;
const uint32_t blockWidth = blockInfo.blockWidth;
@@ -2260,7 +2412,9 @@ namespace bgfx
_size = _imageContainer.m_size;
}
- for (uint8_t side = 0, numSides = _imageContainer.m_cubeMap ? 6 : 1; side < numSides; ++side)
+ const uint8_t* data = (const uint8_t*)_data;
+
+ if (_imageContainer.m_ktx)
{
uint32_t width = _imageContainer.m_width;
uint32_t height = _imageContainer.m_height;
@@ -2268,41 +2422,215 @@ namespace bgfx
for (uint8_t lod = 0, num = _imageContainer.m_numMips; lod < num; ++lod)
{
- // skip imageSize in KTX format.
- offset += _imageContainer.m_ktx ? sizeof(uint32_t) : 0;
+ uint32_t imageSize = bx::toHostEndian(*(const uint32_t*)&data[offset], _imageContainer.m_ktxLE);
+ offset += sizeof(uint32_t);
width = bx::uint32_max(blockWidth * minBlockX, ( (width + blockWidth - 1) / blockWidth )*blockWidth);
height = bx::uint32_max(blockHeight * minBlockY, ( (height + blockHeight - 1) / blockHeight)*blockHeight);
depth = bx::uint32_max(1, depth);
uint32_t size = width*height*depth*bpp/8;
+ BX_CHECK(size == imageSize, "KTX: Image size mismatch %d (expected %d).", size, imageSize);
- if (side == _side
- && lod == _lod)
+ for (uint8_t side = 0, numSides = _imageContainer.m_cubeMap ? 6 : 1; side < numSides; ++side)
{
- _mip.m_width = width;
- _mip.m_height = height;
- _mip.m_blockSize = blockSize;
- _mip.m_size = size;
- _mip.m_data = (const uint8_t*)_data + offset;
- _mip.m_bpp = bpp;
- _mip.m_format = uint8_t(type);
- _mip.m_hasAlpha = hasAlpha;
- return true;
- }
+ if (side == _side
+ && lod == _lod)
+ {
+ _mip.m_width = width;
+ _mip.m_height = height;
+ _mip.m_blockSize = blockSize;
+ _mip.m_size = size;
+ _mip.m_data = &data[offset];
+ _mip.m_bpp = bpp;
+ _mip.m_format = uint8_t(format);
+ _mip.m_hasAlpha = hasAlpha;
+ return true;
+ }
- offset += size;
+ offset += imageSize;
- BX_CHECK(offset <= _size, "Reading past size of data buffer! (offset %d, size %d)", offset, _size);
- BX_UNUSED(_size);
+ BX_CHECK(offset <= _size, "Reading past size of data buffer! (offset %d, size %d)", offset, _size);
+ BX_UNUSED(_size);
+ }
width >>= 1;
height >>= 1;
depth >>= 1;
}
}
+ else
+ {
+ for (uint8_t side = 0, numSides = _imageContainer.m_cubeMap ? 6 : 1; side < numSides; ++side)
+ {
+ uint32_t width = _imageContainer.m_width;
+ uint32_t height = _imageContainer.m_height;
+ uint32_t depth = _imageContainer.m_depth;
+
+ for (uint8_t lod = 0, num = _imageContainer.m_numMips; lod < num; ++lod)
+ {
+ width = bx::uint32_max(blockWidth * minBlockX, ( (width + blockWidth - 1) / blockWidth )*blockWidth);
+ height = bx::uint32_max(blockHeight * minBlockY, ( (height + blockHeight - 1) / blockHeight)*blockHeight);
+ depth = bx::uint32_max(1, depth);
+
+ uint32_t size = width*height*depth*bpp/8;
+
+ if (side == _side
+ && lod == _lod)
+ {
+ _mip.m_width = width;
+ _mip.m_height = height;
+ _mip.m_blockSize = blockSize;
+ _mip.m_size = size;
+ _mip.m_data = &data[offset];
+ _mip.m_bpp = bpp;
+ _mip.m_format = uint8_t(format);
+ _mip.m_hasAlpha = hasAlpha;
+ return true;
+ }
+
+ offset += size;
+
+ BX_CHECK(offset <= _size, "Reading past size of data buffer! (offset %d, size %d)", offset, _size);
+ BX_UNUSED(_size);
+
+ width >>= 1;
+ height >>= 1;
+ depth >>= 1;
+ }
+ }
+ }
return false;
}
+ void imageWriteTga(bx::WriterI* _writer, uint32_t _width, uint32_t _height, uint32_t _srcPitch, const void* _src, bool _grayscale, bool _yflip)
+ {
+ uint8_t type = _grayscale ? 3 : 2;
+ uint8_t bpp = _grayscale ? 8 : 32;
+
+ uint8_t header[18] = {};
+ header[ 2] = type;
+ header[12] = _width &0xff;
+ header[13] = (_width >>8)&0xff;
+ header[14] = _height &0xff;
+ header[15] = (_height>>8)&0xff;
+ header[16] = bpp;
+ header[17] = 32;
+
+ bx::write(_writer, header, sizeof(header) );
+
+ uint32_t dstPitch = _width*bpp/8;
+ if (_yflip)
+ {
+ uint8_t* data = (uint8_t*)_src + _srcPitch*_height - _srcPitch;
+ for (uint32_t yy = 0; yy < _height; ++yy)
+ {
+ bx::write(_writer, data, dstPitch);
+ data -= _srcPitch;
+ }
+ }
+ else if (_srcPitch == dstPitch)
+ {
+ bx::write(_writer, _src, _height*_srcPitch);
+ }
+ else
+ {
+ uint8_t* data = (uint8_t*)_src;
+ for (uint32_t yy = 0; yy < _height; ++yy)
+ {
+ bx::write(_writer, data, dstPitch);
+ data += _srcPitch;
+ }
+ }
+ }
+
+ static int32_t imageWriteKtxHeader(bx::WriterI* _writer, TextureFormat::Enum _format, bool _cubeMap, uint32_t _width, uint32_t _height, uint32_t _depth, uint8_t _numMips)
+ {
+ const KtxFormatInfo& tfi = s_translateKtxFormat[_format];
+
+ int32_t size = 0;
+ size += bx::write(_writer, "\xabKTX 11\xbb\r\n\x1a\n", 12);
+ size += bx::write(_writer, UINT32_C(0x04030201) );
+ size += bx::write(_writer, UINT32_C(0) ); // glType
+ size += bx::write(_writer, UINT32_C(1) ); // glTypeSize
+ size += bx::write(_writer, UINT32_C(0) ); // glFormat
+ size += bx::write(_writer, tfi.m_internalFmt); // glInternalFormat
+ size += bx::write(_writer, tfi.m_fmt); // glBaseInternalFormat
+ size += bx::write(_writer, _width);
+ size += bx::write(_writer, _height);
+ size += bx::write(_writer, _depth);
+ size += bx::write(_writer, UINT32_C(0) ); // numberOfArrayElements
+ size += bx::write(_writer, _cubeMap ? UINT32_C(6) : UINT32_C(0) );
+ size += bx::write(_writer, uint32_t(_numMips) );
+ size += bx::write(_writer, UINT32_C(0) ); // Meta-data size.
+
+ BX_CHECK(size == 64, "KTX: Failed to write header size %d (expected: %d).", size, 64);
+ return size;
+ }
+
+ void imageWriteKtx(bx::WriterI* _writer, TextureFormat::Enum _format, bool _cubeMap, uint32_t _width, uint32_t _height, uint32_t _depth, uint8_t _numMips, const void* _src)
+ {
+ imageWriteKtxHeader(_writer, _format, _cubeMap, _width, _height, _depth, _numMips);
+
+ const ImageBlockInfo& blockInfo = s_imageBlockInfo[_format];
+ const uint8_t bpp = blockInfo.bitsPerPixel;
+ const uint32_t blockWidth = blockInfo.blockWidth;
+ const uint32_t blockHeight = blockInfo.blockHeight;
+ const uint32_t minBlockX = blockInfo.minBlockX;
+ const uint32_t minBlockY = blockInfo.minBlockY;
+
+ const uint8_t* src = (const uint8_t*)_src;
+ uint32_t width = _width;
+ uint32_t height = _height;
+ uint32_t depth = _depth;
+
+ for (uint8_t lod = 0, num = _numMips; lod < num; ++lod)
+ {
+ width = bx::uint32_max(blockWidth * minBlockX, ( (width + blockWidth - 1) / blockWidth )*blockWidth);
+ height = bx::uint32_max(blockHeight * minBlockY, ( (height + blockHeight - 1) / blockHeight)*blockHeight);
+ depth = bx::uint32_max(1, depth);
+
+ uint32_t size = width*height*depth*bpp/8;
+ bx::write(_writer, size);
+
+ for (uint8_t side = 0, numSides = _cubeMap ? 6 : 1; side < numSides; ++side)
+ {
+ bx::write(_writer, src, size);
+ src += size;
+ }
+
+ width >>= 1;
+ height >>= 1;
+ depth >>= 1;
+ }
+ }
+
+ void imageWriteKtx(bx::WriterI* _writer, ImageContainer& _imageContainer, const void* _data, uint32_t _size)
+ {
+ imageWriteKtxHeader(_writer
+ , TextureFormat::Enum(_imageContainer.m_format)
+ , _imageContainer.m_cubeMap
+ , _imageContainer.m_width
+ , _imageContainer.m_height
+ , _imageContainer.m_depth
+ , _imageContainer.m_numMips
+ );
+
+ for (uint8_t lod = 0, num = _imageContainer.m_numMips; lod < num; ++lod)
+ {
+ ImageMip mip;
+ imageGetRawData(_imageContainer, 0, lod, _data, _size, mip);
+ bx::write(_writer, mip.m_size);
+
+ for (uint8_t side = 0, numSides = _imageContainer.m_cubeMap ? 6 : 1; side < numSides; ++side)
+ {
+ if (imageGetRawData(_imageContainer, side, lod, _data, _size, mip) )
+ {
+ bx::write(_writer, mip.m_data, mip.m_size);
+ }
+ }
+ }
+ }
+
} // namespace bgfx
diff --git a/3rdparty/bgfx/src/image.h b/3rdparty/bgfx/src/image.h
index 5c24ac046e2..50824e5fd9e 100644
--- a/3rdparty/bgfx/src/image.h
+++ b/3rdparty/bgfx/src/image.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#ifndef BGFX_IMAGE_H_HEADER_GUARD
@@ -12,18 +12,19 @@ namespace bgfx
{
struct ImageContainer
{
- void* m_data;
+ void* m_data;
uint32_t m_size;
uint32_t m_offset;
uint32_t m_width;
uint32_t m_height;
uint32_t m_depth;
- uint8_t m_format;
- uint8_t m_numMips;
- bool m_hasAlpha;
- bool m_cubeMap;
- bool m_ktx;
- bool m_srgb;
+ uint8_t m_format;
+ uint8_t m_numMips;
+ bool m_hasAlpha;
+ bool m_cubeMap;
+ bool m_ktx;
+ bool m_ktxLE;
+ bool m_srgb;
};
struct ImageMip
@@ -32,9 +33,9 @@ namespace bgfx
uint32_t m_height;
uint32_t m_blockSize;
uint32_t m_size;
- uint8_t m_bpp;
- uint8_t m_format;
- bool m_hasAlpha;
+ uint8_t m_bpp;
+ uint8_t m_format;
+ bool m_hasAlpha;
const uint8_t* m_data;
};
@@ -65,24 +66,36 @@ namespace bgfx
uint8_t encoding;
};
- ///
+ /// Returns true if texture format is compressed.
bool isCompressed(TextureFormat::Enum _format);
- ///
+ /// Returns true if texture format is uncompressed.
bool isColor(TextureFormat::Enum _format);
- ///
+ /// Returns true if texture format is depth.
bool isDepth(TextureFormat::Enum _format);
- ///
+ /// Returns true if texture format is valid.
+ bool isValid(TextureFormat::Enum _format);
+
+ /// Returns bits per pixel.
uint8_t getBitsPerPixel(TextureFormat::Enum _format);
- ///
+ /// Returns texture block info.
const ImageBlockInfo& getBlockInfo(TextureFormat::Enum _format);
- ///
+ /// Converts format to string.
const char* getName(TextureFormat::Enum _format);
+ /// Converts string to format.
+ TextureFormat::Enum getFormat(const char* _name);
+
+ /// Returns number of mip-maps required for complete mip-map chain.
+ uint8_t imageGetNumMips(TextureFormat::Enum _format, uint16_t _width, uint16_t _height, uint16_t _depth = 0);
+
+ /// Returns image size.
+ uint32_t imageGetSize(TextureFormat::Enum _format, uint16_t _width, uint16_t _height, uint16_t _depth = 0, bool _cubeMap = false, uint8_t _numMips = 0);
+
///
void imageSolid(uint32_t _width, uint32_t _height, uint32_t _solid, void* _dst);
@@ -105,6 +118,12 @@ namespace bgfx
void imageWriteTga(bx::WriterI* _writer, uint32_t _width, uint32_t _height, uint32_t _srcPitch, const void* _src, bool _grayscale, bool _yflip);
///
+ void imageWriteKtx(bx::WriterI* _writer, TextureFormat::Enum _format, bool _cubeMap, uint32_t _width, uint32_t _height, uint32_t _depth, uint8_t _numMips, const void* _src);
+
+ ///
+ void imageWriteKtx(bx::WriterI* _writer, ImageContainer& _imageContainer, const void* _data, uint32_t _size);
+
+ ///
bool imageParse(ImageContainer& _imageContainer, bx::ReaderSeekerI* _reader);
///
@@ -117,7 +136,7 @@ namespace bgfx
void imageDecodeToRgba8(uint8_t* _dst, const uint8_t* _src, uint32_t _width, uint32_t _height, uint32_t _pitch, uint8_t _type);
///
- bool imageGetRawData(const ImageContainer& _dds, uint8_t _side, uint8_t _index, const void* _data, uint32_t _size, ImageMip& _mip);
+ bool imageGetRawData(const ImageContainer& _imageContainer, uint8_t _side, uint8_t _index, const void* _data, uint32_t _size, ImageMip& _mip);
} // namespace bgfx
diff --git a/3rdparty/bgfx/src/ovr.cpp b/3rdparty/bgfx/src/ovr.cpp
index 1e34c8ba9c0..5cd62ef3956 100644
--- a/3rdparty/bgfx/src/ovr.cpp
+++ b/3rdparty/bgfx/src/ovr.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "ovr.h"
diff --git a/3rdparty/bgfx/src/ovr.h b/3rdparty/bgfx/src/ovr.h
index 62c81d78ccc..b717d0d47a8 100644
--- a/3rdparty/bgfx/src/ovr.h
+++ b/3rdparty/bgfx/src/ovr.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#ifndef BGFX_OVR_H_HEADER_GUARD
diff --git a/3rdparty/bgfx/src/renderdoc.cpp b/3rdparty/bgfx/src/renderdoc.cpp
index ac2e2917fa6..0cb7be99d64 100644
--- a/3rdparty/bgfx/src/renderdoc.cpp
+++ b/3rdparty/bgfx/src/renderdoc.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "bgfx_p.h"
diff --git a/3rdparty/bgfx/src/renderdoc.h b/3rdparty/bgfx/src/renderdoc.h
index 9a7e6eb0225..803805ea581 100644
--- a/3rdparty/bgfx/src/renderdoc.h
+++ b/3rdparty/bgfx/src/renderdoc.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#ifndef BGFX_RENDERDOC_H_HEADER_GUARD
diff --git a/3rdparty/bgfx/src/renderer.h b/3rdparty/bgfx/src/renderer.h
index 68f9ce34712..a85cc9bc75c 100644
--- a/3rdparty/bgfx/src/renderer.h
+++ b/3rdparty/bgfx/src/renderer.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#ifndef BGFX_RENDERER_H_HEADER_GUARD
diff --git a/3rdparty/bgfx/src/renderer_d3d.h b/3rdparty/bgfx/src/renderer_d3d.h
index 56cb88c6388..314fbaa0f89 100644
--- a/3rdparty/bgfx/src/renderer_d3d.h
+++ b/3rdparty/bgfx/src/renderer_d3d.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#ifndef BGFX_RENDERER_D3D_H_HEADER_GUARD
@@ -104,6 +104,11 @@ namespace bgfx
{
invalidate(_key);
m_hashMap.insert(stl::make_pair(_key, _value) );
+ BX_CHECK(isGraphicsDebuggerPresent()
+ || 1 == getRefCount(_value), "Interface ref count %d, hash %" PRIx64 "."
+ , getRefCount(_value)
+ , _key
+ );
}
Ty* find(uint64_t _key)
diff --git a/3rdparty/bgfx/src/renderer_d3d11.cpp b/3rdparty/bgfx/src/renderer_d3d11.cpp
index e2ec495a34f..9fc75a8c452 100644
--- a/3rdparty/bgfx/src/renderer_d3d11.cpp
+++ b/3rdparty/bgfx/src/renderer_d3d11.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "bgfx_p.h"
@@ -13,9 +13,24 @@
# include <windows.ui.xaml.media.dxinterop.h>
#endif // BX_PLATFORM_WINRT
+#if BGFX_CONFIG_PROFILER_REMOTERY
+# define BGFX_GPU_PROFILER_BIND(_device, _context) rmt_BindD3D11(_device, _context)
+# define BGFX_GPU_PROFILER_UNBIND() rmt_UnbindD3D11()
+# define BGFX_GPU_PROFILER_BEGIN(_group, _name, _color) rmt_BeginD3D11Sample(_group##_##_name)
+# define BGFX_GPU_PROFILER_BEGIN_DYNAMIC(_namestr) rmt_BeginD3D11SampleDynamic(_namestr)
+# define BGFX_GPU_PROFILER_END() rmt_EndD3D11Sample()
+#else
+# define BGFX_GPU_PROFILER_BIND(_device, _context) BX_NOOP()
+# define BGFX_GPU_PROFILER_UNBIND() BX_NOOP()
+# define BGFX_GPU_PROFILER_BEGIN(_group, _name, _color) BX_NOOP()
+# define BGFX_GPU_PROFILER_BEGIN_DYNAMIC(_namestr) BX_NOOP()
+# define BGFX_GPU_PROFILER_END() BX_NOOP()
+#endif
+
namespace bgfx { namespace d3d11
{
static wchar_t s_viewNameW[BGFX_CONFIG_MAX_VIEWS][BGFX_CONFIG_MAX_VIEW_NAME];
+ static char s_viewName[BGFX_CONFIG_MAX_VIEWS][BGFX_CONFIG_MAX_VIEW_NAME];
struct PrimInfo
{
@@ -571,6 +586,7 @@ namespace bgfx { namespace d3d11
, m_captureResolve(NULL)
, m_wireframe(false)
, m_maxAnisotropy(1)
+ , m_depthClamp(false)
, m_currentProgram(NULL)
, m_vsChanges(0)
, m_fsChanges(0)
@@ -1158,6 +1174,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
| BGFX_CAPS_DRAW_INDIRECT
| BGFX_CAPS_TEXTURE_BLIT
| BGFX_CAPS_TEXTURE_READ_BACK
+ | BGFX_CAPS_OCCLUSION_QUERY
);
if (m_featureLevel <= D3D_FEATURE_LEVEL_9_2)
@@ -1404,9 +1421,8 @@ BX_PRAGMA_DIAGNOSTIC_POP();
// Init reserved part of view name.
for (uint32_t ii = 0; ii < BGFX_CONFIG_MAX_VIEWS; ++ii)
{
- char name[BGFX_CONFIG_MAX_VIEW_NAME_RESERVED+1];
- bx::snprintf(name, sizeof(name), "%3d ", ii);
- mbstowcs(s_viewNameW[ii], name, BGFX_CONFIG_MAX_VIEW_NAME_RESERVED);
+ bx::snprintf(s_viewName[ii], BGFX_CONFIG_MAX_VIEW_NAME_RESERVED + 1, "%3d ", ii);
+ mbstowcs(s_viewNameW[ii], s_viewName[ii], BGFX_CONFIG_MAX_VIEW_NAME_RESERVED);
}
if (BX_ENABLED(BGFX_CONFIG_DEBUG)
@@ -1448,6 +1464,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
postReset();
}
+ BGFX_GPU_PROFILER_BIND(m_device, m_deviceCtx);
return true;
error:
@@ -1500,6 +1517,8 @@ BX_PRAGMA_DIAGNOSTIC_POP();
void shutdown()
{
+ BGFX_GPU_PROFILER_UNBIND();
+
preReset();
m_ovr.shutdown();
@@ -1863,6 +1882,11 @@ BX_PRAGMA_DIAGNOSTIC_POP();
, BX_COUNTOF(s_viewNameW[0])-BGFX_CONFIG_MAX_VIEW_NAME_RESERVED
);
}
+
+ bx::strlcpy(&s_viewName[_id][BGFX_CONFIG_MAX_VIEW_NAME_RESERVED]
+ , _name
+ , BX_COUNTOF(s_viewName[0]) - BGFX_CONFIG_MAX_VIEW_NAME_RESERVED
+ );
}
void updateUniform(uint16_t _loc, const void* _data, uint32_t _size) BX_OVERRIDE
@@ -1940,7 +1964,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
setShaderUniform(flags, predefined.m_loc, proj, 4);
commitShaderConstants();
- m_textures[_blitter.m_texture.idx].commit(0, BGFX_SAMPLER_DEFAULT_FLAGS, NULL);
+ m_textures[_blitter.m_texture.idx].commit(0, BGFX_TEXTURE_INTERNAL_DEFAULT_SAMPLER, NULL);
commitTextureStage();
}
@@ -1951,7 +1975,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
{
ID3D11DeviceContext* deviceCtx = m_deviceCtx;
- m_indexBuffers [_blitter.m_ib->handle.idx].update(0, _numIndices*2, _blitter.m_ib->data);
+ m_indexBuffers [_blitter.m_ib->handle.idx].update(0, _numIndices*2, _blitter.m_ib->data, true);
m_vertexBuffers[_blitter.m_vb->handle.idx].update(0, numVertices*_blitter.m_decl.m_stride, _blitter.m_vb->data, true);
deviceCtx->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
@@ -1964,6 +1988,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
ovrPreReset();
m_gpuTimer.preReset();
+ m_occlusionQuery.preReset();
if (NULL == g_platformData.backBufferDS)
{
@@ -2008,6 +2033,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
}
m_gpuTimer.postReset();
+ m_occlusionQuery.postReset();
ovrPostReset();
@@ -2141,25 +2167,39 @@ BX_PRAGMA_DIAGNOSTIC_POP();
{
bool recenter = !!(_resolution.m_flags & BGFX_RESET_HMD_RECENTER);
+ uint32_t maxAnisotropy = 1;
if (!!(_resolution.m_flags & BGFX_RESET_MAXANISOTROPY) )
{
- m_maxAnisotropy = (m_featureLevel == D3D_FEATURE_LEVEL_9_1)
+ maxAnisotropy = (m_featureLevel == D3D_FEATURE_LEVEL_9_1)
? D3D_FL9_1_DEFAULT_MAX_ANISOTROPY
: D3D11_REQ_MAXANISOTROPY
;
}
- else
+
+ if (m_maxAnisotropy != maxAnisotropy)
{
- m_maxAnisotropy = 1;
+ m_maxAnisotropy = maxAnisotropy;
+ m_samplerStateCache.invalidate();
}
- uint32_t flags = _resolution.m_flags & ~(BGFX_RESET_HMD_RECENTER | BGFX_RESET_MAXANISOTROPY);
+ bool depthClamp = true
+ && !!(_resolution.m_flags & BGFX_RESET_DEPTH_CLAMP)
+ && m_featureLevel > D3D_FEATURE_LEVEL_9_3 // disabling depth clamp is only supported on 10_0+
+ ;
+
+ if (m_depthClamp != depthClamp)
+ {
+ m_depthClamp = depthClamp;
+ m_rasterizerStateCache.invalidate();
+ }
+
+ uint32_t flags = _resolution.m_flags & ~(BGFX_RESET_HMD_RECENTER | BGFX_RESET_MAXANISOTROPY | BGFX_RESET_DEPTH_CLAMP);
if (m_resolution.m_width != _resolution.m_width
|| m_resolution.m_height != _resolution.m_height
|| m_resolution.m_flags != flags)
{
- flags &= ~BGFX_RESET_FORCE;
+ flags &= ~BGFX_RESET_INTERNAL_FORCE;
bool resize = true
&& !BX_ENABLED(BX_PLATFORM_WINRT) // can't use ResizeBuffers on Windows Phone
@@ -2460,31 +2500,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
{
_state &= BGFX_D3D11_BLEND_STATE_MASK;
- bx::HashMurmur2A murmur;
- murmur.begin();
- murmur.add(_state);
-
- const uint64_t f0 = BGFX_STATE_BLEND_FUNC(BGFX_STATE_BLEND_FACTOR, BGFX_STATE_BLEND_FACTOR);
- const uint64_t f1 = BGFX_STATE_BLEND_FUNC(BGFX_STATE_BLEND_INV_FACTOR, BGFX_STATE_BLEND_INV_FACTOR);
- bool hasFactor = f0 == (_state & f0)
- || f1 == (_state & f1)
- ;
-
- float blendFactor[4] = { 1.0f, 1.0f, 1.0f, 1.0f };
- if (hasFactor)
- {
- blendFactor[0] = ( (_rgba>>24) )/255.0f;
- blendFactor[1] = ( (_rgba>>16)&0xff)/255.0f;
- blendFactor[2] = ( (_rgba>> 8)&0xff)/255.0f;
- blendFactor[3] = ( (_rgba )&0xff)/255.0f;
- }
- else
- {
- murmur.add(_rgba);
- }
-
- uint32_t hash = murmur.end();
-
+ const uint64_t hash = _state;
ID3D11BlendState* bs = m_blendStateCache.find(hash);
if (NULL == bs)
{
@@ -2562,12 +2578,29 @@ BX_PRAGMA_DIAGNOSTIC_POP();
m_blendStateCache.add(hash, bs);
}
+ const uint64_t f0 = BGFX_STATE_BLEND_FUNC(BGFX_STATE_BLEND_FACTOR, BGFX_STATE_BLEND_FACTOR);
+ const uint64_t f1 = BGFX_STATE_BLEND_FUNC(BGFX_STATE_BLEND_INV_FACTOR, BGFX_STATE_BLEND_INV_FACTOR);
+ bool hasFactor = false
+ || f0 == (_state & f0)
+ || f1 == (_state & f1)
+ ;
+
+ float blendFactor[4] = { 1.0f, 1.0f, 1.0f, 1.0f };
+ if (hasFactor)
+ {
+ blendFactor[0] = ( (_rgba>>24) )/255.0f;
+ blendFactor[1] = ( (_rgba>>16)&0xff)/255.0f;
+ blendFactor[2] = ( (_rgba>> 8)&0xff)/255.0f;
+ blendFactor[3] = ( (_rgba )&0xff)/255.0f;
+ }
+
m_deviceCtx->OMSetBlendState(bs, blendFactor, 0xffffffff);
}
void setDepthStencilState(uint64_t _state, uint64_t _stencil = 0)
{
- _state &= BGFX_D3D11_DEPTH_STENCIL_MASK;
+ uint32_t func = (_state&BGFX_STATE_DEPTH_TEST_MASK)>>BGFX_STATE_DEPTH_TEST_SHIFT;
+ _state &= 0 == func ? 0 : BGFX_D3D11_DEPTH_STENCIL_MASK;
uint32_t fstencil = unpackStencil(0, _stencil);
uint32_t ref = (fstencil&BGFX_STENCIL_FUNC_REF_MASK)>>BGFX_STENCIL_FUNC_REF_SHIFT;
@@ -2584,17 +2617,16 @@ BX_PRAGMA_DIAGNOSTIC_POP();
{
D3D11_DEPTH_STENCIL_DESC desc;
memset(&desc, 0, sizeof(desc) );
- uint32_t func = (_state&BGFX_STATE_DEPTH_TEST_MASK)>>BGFX_STATE_DEPTH_TEST_SHIFT;
- desc.DepthEnable = 0 != func;
+ desc.DepthEnable = 0 != func;
desc.DepthWriteMask = !!(BGFX_STATE_DEPTH_WRITE & _state) ? D3D11_DEPTH_WRITE_MASK_ALL : D3D11_DEPTH_WRITE_MASK_ZERO;
- desc.DepthFunc = s_cmpFunc[func];
+ desc.DepthFunc = s_cmpFunc[func];
- uint32_t bstencil = unpackStencil(1, _stencil);
+ uint32_t bstencil = unpackStencil(1, _stencil);
uint32_t frontAndBack = bstencil != BGFX_STENCIL_NONE && bstencil != fstencil;
bstencil = frontAndBack ? bstencil : fstencil;
- desc.StencilEnable = 0 != _stencil;
- desc.StencilReadMask = (fstencil&BGFX_STENCIL_FUNC_RMASK_MASK)>>BGFX_STENCIL_FUNC_RMASK_SHIFT;
+ desc.StencilEnable = 0 != _stencil;
+ desc.StencilReadMask = (fstencil&BGFX_STENCIL_FUNC_RMASK_MASK)>>BGFX_STENCIL_FUNC_RMASK_SHIFT;
desc.StencilWriteMask = 0xff;
desc.FrontFace.StencilFailOp = s_stencilOp[(fstencil&BGFX_STENCIL_OP_FAIL_S_MASK)>>BGFX_STENCIL_OP_FAIL_S_SHIFT];
desc.FrontFace.StencilDepthFailOp = s_stencilOp[(fstencil&BGFX_STENCIL_OP_FAIL_Z_MASK)>>BGFX_STENCIL_OP_FAIL_Z_SHIFT];
@@ -2640,7 +2672,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
desc.DepthBias = 0;
desc.DepthBiasClamp = 0.0f;
desc.SlopeScaledDepthBias = 0.0f;
- desc.DepthClipEnable = m_featureLevel <= D3D_FEATURE_LEVEL_9_3; // disabling depth clip is only supported on 10_0+
+ desc.DepthClipEnable = !m_depthClamp;
desc.ScissorEnable = _scissor;
desc.MultisampleEnable = !!(_state&BGFX_STATE_MSAA);
desc.AntialiasedLineEnable = false;
@@ -2726,6 +2758,12 @@ BX_PRAGMA_DIAGNOSTIC_POP();
return sampler;
}
+ bool isVisible(Frame* _render, OcclusionQueryHandle _handle, bool _visible)
+ {
+ m_occlusionQuery.resolve(_render);
+ return _visible == (0 != _render->m_occlusion[_handle.idx]);
+ }
+
DXGI_FORMAT getBufferFormat()
{
#if BX_PLATFORM_WINRT
@@ -3296,6 +3334,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
ID3D11DeviceContext* m_deviceCtx;
ID3D11InfoQueue* m_infoQueue;
TimerQueryD3D11 m_gpuTimer;
+ OcclusionQueryD3D11 m_occlusionQuery;
ID3D11RenderTargetView* m_backBufferColor;
ID3D11DepthStencilView* m_backBufferDepthStencil;
@@ -3316,6 +3355,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
SwapChainDesc m_scd;
uint32_t m_maxAnisotropy;
+ bool m_depthClamp;
IndexBufferD3D11 m_indexBuffers[BGFX_CONFIG_MAX_INDEX_BUFFERS];
VertexBufferD3D11 m_vertexBuffers[BGFX_CONFIG_MAX_VERTEX_BUFFERS];
@@ -3579,8 +3619,6 @@ BX_PRAGMA_DIAGNOSTIC_POP();
#if 0
BX_UNUSED(_discard);
- ID3D11Device* device = s_renderD3D11->m_device;
-
D3D11_BUFFER_DESC desc;
desc.ByteWidth = _size;
desc.Usage = D3D11_USAGE_STAGING;
@@ -3594,17 +3632,19 @@ BX_PRAGMA_DIAGNOSTIC_POP();
srd.SysMemPitch = 0;
srd.SysMemSlicePitch = 0;
+ D3D11_BOX srcBox;
+ srcBox.left = 0;
+ srcBox.top = 0;
+ srcBox.front = 0;
+ srcBox.right = _size;
+ srcBox.bottom = 1;
+ srcBox.back = 1;
+
+ ID3D11Device* device = s_renderD3D11->m_device;
+
ID3D11Buffer* ptr;
DX_CHECK(device->CreateBuffer(&desc, &srd, &ptr) );
- D3D11_BOX box;
- box.left = 0;
- box.top = 0;
- box.front = 0;
- box.right = _size;
- box.bottom = 1;
- box.back = 1;
-
deviceCtx->CopySubresourceRegion(m_ptr
, 0
, _offset
@@ -3612,14 +3652,16 @@ BX_PRAGMA_DIAGNOSTIC_POP();
, 0
, ptr
, 0
- , &box
+ , &srcBox
);
DX_RELEASE(ptr, 0);
#else
D3D11_MAPPED_SUBRESOURCE mapped;
- BX_UNUSED(_discard);
- D3D11_MAP type = D3D11_MAP_WRITE_DISCARD;
+ D3D11_MAP type = _discard
+ ? D3D11_MAP_WRITE_DISCARD
+ : D3D11_MAP_WRITE_NO_OVERWRITE
+ ;
DX_CHECK(deviceCtx->Map(m_ptr, 0, type, 0, &mapped) );
memcpy( (uint8_t*)mapped.pData + _offset, _data, _size);
deviceCtx->Unmap(m_ptr, 0);
@@ -4149,7 +4191,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
{
TextureStage& ts = s_renderD3D11->m_textureStage;
ts.m_srv[_stage] = m_srv;
- uint32_t flags = 0 == (BGFX_SAMPLER_DEFAULT_FLAGS & _flags)
+ uint32_t flags = 0 == (BGFX_TEXTURE_INTERNAL_DEFAULT_SAMPLER & _flags)
? _flags
: m_flags
;
@@ -4465,7 +4507,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
DX_CHECK(device->CreateQuery(&query, &frame.m_disjoint) );
query.Query = D3D11_QUERY_TIMESTAMP;
- DX_CHECK(device->CreateQuery(&query, &frame.m_start) );
+ DX_CHECK(device->CreateQuery(&query, &frame.m_begin) );
DX_CHECK(device->CreateQuery(&query, &frame.m_end) );
}
@@ -4480,7 +4522,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
{
Frame& frame = m_frame[ii];
DX_RELEASE(frame.m_disjoint, 0);
- DX_RELEASE(frame.m_start, 0);
+ DX_RELEASE(frame.m_begin, 0);
DX_RELEASE(frame.m_end, 0);
}
}
@@ -4496,7 +4538,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
Frame& frame = m_frame[m_control.m_current];
deviceCtx->Begin(frame.m_disjoint);
- deviceCtx->End(frame.m_start);
+ deviceCtx->End(frame.m_begin);
}
void TimerQueryD3D11::end()
@@ -4515,8 +4557,8 @@ BX_PRAGMA_DIAGNOSTIC_POP();
ID3D11DeviceContext* deviceCtx = s_renderD3D11->m_deviceCtx;
Frame& frame = m_frame[m_control.m_read];
- uint64_t finish;
- HRESULT hr = deviceCtx->GetData(frame.m_end, &finish, sizeof(finish), 0);
+ uint64_t timeEnd;
+ HRESULT hr = deviceCtx->GetData(frame.m_end, &timeEnd, sizeof(timeEnd), D3D11_ASYNC_GETDATA_DONOTFLUSH);
if (S_OK == hr)
{
m_control.consume(1);
@@ -4530,11 +4572,13 @@ BX_PRAGMA_DIAGNOSTIC_POP();
D3D11_QUERY_DATA_TIMESTAMP_DISJOINT disjoint;
deviceCtx->GetData(frame.m_disjoint, &disjoint, sizeof(disjoint), 0);
- uint64_t start;
- deviceCtx->GetData(frame.m_start, &start, sizeof(start), 0);
+ uint64_t timeBegin;
+ deviceCtx->GetData(frame.m_begin, &timeBegin, sizeof(timeBegin), 0);
m_frequency = disjoint.Frequency;
- m_elapsed = finish - start;
+ m_begin = timeBegin;
+ m_end = timeEnd;
+ m_elapsed = timeEnd - timeBegin;
return true;
}
@@ -4543,9 +4587,74 @@ BX_PRAGMA_DIAGNOSTIC_POP();
return false;
}
+ void OcclusionQueryD3D11::postReset()
+ {
+ ID3D11Device* device = s_renderD3D11->m_device;
+
+ D3D11_QUERY_DESC desc;
+ desc.Query = D3D11_QUERY_OCCLUSION;
+ desc.MiscFlags = 0;
+ for (uint32_t ii = 0; ii < BX_COUNTOF(m_query); ++ii)
+ {
+ Query& query = m_query[ii];
+ DX_CHECK(device->CreateQuery(&desc, &query.m_ptr) );
+ }
+ }
+
+ void OcclusionQueryD3D11::preReset()
+ {
+ for (uint32_t ii = 0; ii < BX_COUNTOF(m_query); ++ii)
+ {
+ Query& query = m_query[ii];
+ DX_RELEASE(query.m_ptr, 0);
+ }
+ }
+
+ void OcclusionQueryD3D11::begin(Frame* _render, OcclusionQueryHandle _handle)
+ {
+ while (0 == m_control.reserve(1) )
+ {
+ resolve(_render, true);
+ }
+
+ ID3D11DeviceContext* deviceCtx = s_renderD3D11->m_deviceCtx;
+ Query& query = m_query[m_control.m_current];
+ deviceCtx->Begin(query.m_ptr);
+ query.m_handle = _handle;
+ }
+
+ void OcclusionQueryD3D11::end()
+ {
+ ID3D11DeviceContext* deviceCtx = s_renderD3D11->m_deviceCtx;
+ Query& query = m_query[m_control.m_current];
+ deviceCtx->End(query.m_ptr);
+ m_control.commit(1);
+ }
+
+ void OcclusionQueryD3D11::resolve(Frame* _render, bool _wait)
+ {
+ ID3D11DeviceContext* deviceCtx = s_renderD3D11->m_deviceCtx;
+
+ while (0 != m_control.available() )
+ {
+ Query& query = m_query[m_control.m_read];
+
+ uint64_t result = 0;
+ HRESULT hr = deviceCtx->GetData(query.m_ptr, &result, sizeof(result), _wait ? 0 : D3D11_ASYNC_GETDATA_DONOTFLUSH);
+ if (S_FALSE == hr)
+ {
+ break;
+ }
+
+ _render->m_occlusion[query.m_handle.idx] = 0 < result;
+ m_control.consume(1);
+ }
+ }
+
void RendererContextD3D11::submit(Frame* _render, ClearQuad& _clearQuad, TextVideoMemBlitter& _textVideoMemBlitter)
{
PIX_BEGINEVENT(D3DCOLOR_RGBA(0xff, 0x00, 0x00, 0xff), L"rendererSubmit");
+ BGFX_GPU_PROFILER_BEGIN_DYNAMIC("rendererSubmit");
ID3D11DeviceContext* deviceCtx = m_deviceCtx;
@@ -4559,20 +4668,20 @@ BX_PRAGMA_DIAGNOSTIC_POP();
if (0 < _render->m_iboffset)
{
TransientIndexBuffer* ib = _render->m_transientIb;
- m_indexBuffers[ib->handle.idx].update(0, _render->m_iboffset, ib->data);
+ m_indexBuffers[ib->handle.idx].update(0, _render->m_iboffset, ib->data, true);
}
if (0 < _render->m_vboffset)
{
TransientVertexBuffer* vb = _render->m_transientVb;
- m_vertexBuffers[vb->handle.idx].update(0, _render->m_vboffset, vb->data);
+ m_vertexBuffers[vb->handle.idx].update(0, _render->m_vboffset, vb->data, true);
}
_render->sort();
RenderDraw currentState;
currentState.clear();
- currentState.m_flags = BGFX_STATE_NONE;
+ currentState.m_stateFlags = BGFX_STATE_NONE;
currentState.m_stencil = packStencil(BGFX_STENCIL_NONE, BGFX_STENCIL_NONE);
_render->m_hmdInitialized = m_ovr.isInitialized();
@@ -4588,7 +4697,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
uint16_t programIdx = invalidHandle;
SortKey key;
uint16_t view = UINT16_MAX;
- FrameBufferHandle fbh = BGFX_INVALID_HANDLE;
+ FrameBufferHandle fbh = { BGFX_CONFIG_MAX_FRAME_BUFFERS };
BlitKey blitKey;
blitKey.decode(_render->m_blitKeys[0]);
@@ -4612,6 +4721,8 @@ BX_PRAGMA_DIAGNOSTIC_POP();
uint32_t statsNumIndices = 0;
uint32_t statsKeyType[2] = {};
+ m_occlusionQuery.resolve(_render);
+
if (0 == (_render->m_debug&BGFX_DEBUG_IFH) )
{
// reset the framebuffer to be the backbuffer; depending on the swap effect,
@@ -4676,6 +4787,13 @@ BX_PRAGMA_DIAGNOSTIC_POP();
}
PIX_ENDEVENT();
+ if (item > 1)
+ {
+ BGFX_GPU_PROFILER_END();
+ BGFX_PROFILER_END();
+ }
+ BGFX_PROFILER_BEGIN_DYNAMIC(s_viewName[view]);
+ BGFX_GPU_PROFILER_BEGIN_DYNAMIC(s_viewName[view]);
viewState.m_rect = _render->m_rect[view];
if (viewRestart)
@@ -4786,6 +4904,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
: 0
;
+ bool depthStencil = isDepth(TextureFormat::Enum(src.m_textureFormat) );
deviceCtx->CopySubresourceRegion(dst.m_ptr
, dstZ*dst.m_numMips+blit.m_dstMip
, blit.m_dstX
@@ -4793,7 +4912,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
, 0
, src.m_ptr
, srcZ*src.m_numMips+blit.m_srcMip
- , &box
+ , depthStencil ? NULL : &box
);
}
}
@@ -4965,8 +5084,6 @@ BX_PRAGMA_DIAGNOSTIC_POP();
PIX_BEGINEVENT(D3DCOLOR_RGBA(0xff, 0x00, 0x00, 0xff), viewNameW);
}
- wasCompute = false;
-
programIdx = invalidHandle;
m_currentProgram = NULL;
@@ -4975,10 +5092,18 @@ BX_PRAGMA_DIAGNOSTIC_POP();
const RenderDraw& draw = renderItem.draw;
- const uint64_t newFlags = draw.m_flags;
- uint64_t changedFlags = currentState.m_flags ^ draw.m_flags;
+ const bool hasOcclusionQuery = 0 != (draw.m_stateFlags & BGFX_STATE_INTERNAL_OCCLUSION_QUERY);
+ if (isValid(draw.m_occlusionQuery)
+ && !hasOcclusionQuery
+ && !isVisible(_render, draw.m_occlusionQuery, 0 != (draw.m_submitFlags&BGFX_SUBMIT_INTERNAL_OCCLUSION_VISIBLE) ) )
+ {
+ continue;
+ }
+
+ const uint64_t newFlags = draw.m_stateFlags;
+ uint64_t changedFlags = currentState.m_stateFlags ^ draw.m_stateFlags;
changedFlags |= currentState.m_rgba != draw.m_rgba ? BGFX_D3D11_BLEND_STATE_MASK : 0;
- currentState.m_flags = newFlags;
+ currentState.m_stateFlags = newFlags;
const uint64_t newStencil = draw.m_stencil;
uint64_t changedStencil = currentState.m_stencil ^ draw.m_stencil;
@@ -4987,12 +5112,14 @@ BX_PRAGMA_DIAGNOSTIC_POP();
if (resetState)
{
+ wasCompute = false;
+
currentState.clear();
currentState.m_scissor = !draw.m_scissor;
changedFlags = BGFX_STATE_MASK;
changedStencil = packStencil(BGFX_STENCIL_MASK, BGFX_STENCIL_MASK);
- currentState.m_flags = newFlags;
- currentState.m_stencil = newStencil;
+ currentState.m_stateFlags = newFlags;
+ currentState.m_stencil = newStencil;
setBlendState(newFlags);
setDepthStencilState(newFlags, packStencil(BGFX_STENCIL_DEFAULT, BGFX_STENCIL_DEFAULT) );
@@ -5156,13 +5283,13 @@ BX_PRAGMA_DIAGNOSTIC_POP();
const Binding& bind = draw.m_bind[stage];
Binding& current = currentState.m_bind[stage];
if (current.m_idx != bind.m_idx
- || current.m_un.m_draw.m_flags != bind.m_un.m_draw.m_flags
+ || current.m_un.m_draw.m_textureFlags != bind.m_un.m_draw.m_textureFlags
|| programChanged)
{
if (invalidHandle != bind.m_idx)
{
TextureD3D11& texture = m_textures[bind.m_idx];
- texture.commit(stage, bind.m_un.m_draw.m_flags, _render->m_colorPalette);
+ texture.commit(stage, bind.m_un.m_draw.m_textureFlags, _render->m_colorPalette);
}
else
{
@@ -5261,6 +5388,11 @@ BX_PRAGMA_DIAGNOSTIC_POP();
uint32_t numPrimsRendered = 0;
uint32_t numDrawIndirect = 0;
+ if (hasOcclusionQuery)
+ {
+ m_occlusionQuery.begin(_render, draw.m_occlusionQuery);
+ }
+
if (isValid(draw.m_indirectBuffer) )
{
const VertexBufferD3D11& vb = m_vertexBuffers[draw.m_indirectBuffer.idx];
@@ -5369,6 +5501,11 @@ BX_PRAGMA_DIAGNOSTIC_POP();
);
}
}
+
+ if (hasOcclusionQuery)
+ {
+ m_occlusionQuery.end();
+ }
}
statsNumPrimsSubmitted[primIndex] += numPrimsSubmitted;
@@ -5402,15 +5539,23 @@ BX_PRAGMA_DIAGNOSTIC_POP();
captureElapsed = -bx::getHPCounter();
capture();
captureElapsed += bx::getHPCounter();
+
+ BGFX_GPU_PROFILER_END();
+ BGFX_PROFILER_END();
}
}
PIX_ENDEVENT();
+ BGFX_GPU_PROFILER_END();
int64_t now = bx::getHPCounter();
elapsed += now;
static int64_t last = now;
+
+ Stats& perfStats = _render->m_perfStats;
+ perfStats.cpuTimeBegin = last;
+
int64_t frameTime = now - last;
last = now;
@@ -5435,10 +5580,10 @@ BX_PRAGMA_DIAGNOSTIC_POP();
const int64_t timerFreq = bx::getHPFrequency();
- Stats& perfStats = _render->m_perfStats;
- perfStats.cpuTime = frameTime;
+ perfStats.cpuTimeEnd = now;
perfStats.cpuTimerFreq = timerFreq;
- perfStats.gpuTime = m_gpuTimer.m_elapsed;
+ perfStats.gpuTimeBegin = m_gpuTimer.m_begin;
+ perfStats.gpuTimeEnd = m_gpuTimer.m_end;
perfStats.gpuTimerFreq = m_gpuTimer.m_frequency;
if (_render->m_debug & (BGFX_DEBUG_IFH|BGFX_DEBUG_STATS) )
@@ -5487,7 +5632,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
);
pos = 10;
- tvm.printf(10, pos++, 0x8e, " Frame: %7.3f, % 7.3f \x1f, % 7.3f \x1e [ms] / % 6.2f FPS "
+ tvm.printf(10, pos++, 0x8e, " Frame: %7.3f, % 7.3f \x1f, % 7.3f \x1e [ms] / % 6.2f FPS "
, double(frameTime)*toMs
, double(min)*toMs
, double(max)*toMs
@@ -5498,7 +5643,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
bx::snprintf(hmd, BX_COUNTOF(hmd), ", [%c] HMD ", hmdEnabled ? '\xfe' : ' ');
const uint32_t msaa = (m_resolution.m_flags&BGFX_RESET_MSAA_MASK)>>BGFX_RESET_MSAA_SHIFT;
- tvm.printf(10, pos++, 0x8e, " Reset flags: [%c] vsync, [%c] MSAAx%d%s, [%c] MaxAnisotropy "
+ tvm.printf(10, pos++, 0x8e, " Reset flags: [%c] vsync, [%c] MSAAx%d%s, [%c] MaxAnisotropy "
, !!(m_resolution.m_flags&BGFX_RESET_VSYNC) ? '\xfe' : ' '
, 0 != msaa ? '\xfe' : ' '
, 1<<msaa
@@ -5507,7 +5652,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
);
double elapsedCpuMs = double(elapsed)*toMs;
- tvm.printf(10, pos++, 0x8e, " Submitted: %5d (draw %5d, compute %4d) / CPU %7.4f [ms] %c GPU %7.4f [ms] (latency %d) "
+ tvm.printf(10, pos++, 0x8e, " Submitted: %5d (draw %5d, compute %4d) / CPU %7.4f [ms] %c GPU %7.4f [ms] (latency %d) "
, _render->m_num
, statsKeyType[0]
, statsKeyType[1]
@@ -5521,7 +5666,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
for (uint32_t ii = 0; ii < BX_COUNTOF(s_primName); ++ii)
{
- tvm.printf(10, pos++, 0x8e, " %9s: %7d (#inst: %5d), submitted: %7d, indirect %7d"
+ tvm.printf(10, pos++, 0x8e, " %10s: %7d (#inst: %5d), submitted: %7d, indirect %7d"
, s_primName[ii]
, statsNumPrimsRendered[ii]
, statsNumInstances[ii]
@@ -5541,6 +5686,9 @@ BX_PRAGMA_DIAGNOSTIC_POP();
tvm.printf(10, pos++, 0x8e, " DIB size: %7d ", _render->m_iboffset);
pos++;
+ tvm.printf(10, pos++, 0x8e, " Occlusion queries: %3d ", m_occlusionQuery.m_control.available() );
+
+ pos++;
tvm.printf(10, pos++, 0x8e, " State cache: ");
tvm.printf(10, pos++, 0x8e, " Blend | DepthS | Input | Raster | Sampler ");
tvm.printf(10, pos++, 0x8e, " %6d | %6d | %6d | %6d | %6d "
@@ -5580,6 +5728,12 @@ BX_PRAGMA_DIAGNOSTIC_POP();
}
} /* namespace d3d11 */ } // namespace bgfx
+#undef BGFX_GPU_PROFILER_BIND
+#undef BGFX_GPU_PROFILER_UNBIND
+#undef BGFX_GPU_PROFILER_BEGIN
+#undef BGFX_GPU_PROFILER_BEGIN_DYNAMIC
+#undef BGFX_GPU_PROFILER_END
+
#else
namespace bgfx { namespace d3d11
diff --git a/3rdparty/bgfx/src/renderer_d3d11.h b/3rdparty/bgfx/src/renderer_d3d11.h
index 958e3d8c8b8..67c05eb8161 100644
--- a/3rdparty/bgfx/src/renderer_d3d11.h
+++ b/3rdparty/bgfx/src/renderer_d3d11.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#ifndef BGFX_RENDERER_D3D11_H_HEADER_GUARD
@@ -296,10 +296,12 @@ namespace bgfx { namespace d3d11
struct Frame
{
ID3D11Query* m_disjoint;
- ID3D11Query* m_start;
+ ID3D11Query* m_begin;
ID3D11Query* m_end;
};
+ uint64_t m_begin;
+ uint64_t m_end;
uint64_t m_elapsed;
uint64_t m_frequency;
@@ -307,6 +309,29 @@ namespace bgfx { namespace d3d11
bx::RingBufferControl m_control;
};
+ struct OcclusionQueryD3D11
+ {
+ OcclusionQueryD3D11()
+ : m_control(BX_COUNTOF(m_query) )
+ {
+ }
+
+ void postReset();
+ void preReset();
+ void begin(Frame* _render, OcclusionQueryHandle _handle);
+ void end();
+ void resolve(Frame* _render, bool _wait = false);
+
+ struct Query
+ {
+ ID3D11Query* m_ptr;
+ OcclusionQueryHandle m_handle;
+ };
+
+ Query m_query[BGFX_CONFIG_MAX_OCCUSION_QUERIES];
+ bx::RingBufferControl m_control;
+ };
+
} /* namespace d3d11 */ } // namespace bgfx
#endif // BGFX_RENDERER_D3D11_H_HEADER_GUARD
diff --git a/3rdparty/bgfx/src/renderer_d3d12.cpp b/3rdparty/bgfx/src/renderer_d3d12.cpp
index ce3d71bacde..22251bebf9d 100644
--- a/3rdparty/bgfx/src/renderer_d3d12.cpp
+++ b/3rdparty/bgfx/src/renderer_d3d12.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "bgfx_p.h"
@@ -364,6 +364,7 @@ namespace bgfx { namespace d3d12
static const GUID IID_ID3D12PipelineState = { 0x765a30f3, 0xf624, 0x4c6f, { 0xa8, 0x28, 0xac, 0xe9, 0x48, 0x62, 0x24, 0x45 } };
static const GUID IID_ID3D12Resource = { 0x696442be, 0xa72e, 0x4059, { 0xbc, 0x79, 0x5b, 0x5c, 0x98, 0x04, 0x0f, 0xad } };
static const GUID IID_ID3D12RootSignature = { 0xc54a6b66, 0x72df, 0x4ee8, { 0x8b, 0xe5, 0xa9, 0x46, 0xa1, 0x42, 0x92, 0x14 } };
+ static const GUID IID_ID3D12QueryHeap = { 0x0d9658ae, 0xed45, 0x469e, { 0xa6, 0x1d, 0x97, 0x0e, 0xc5, 0x83, 0xca, 0xb4 } };
static const GUID IID_IDXGIFactory4 = { 0x1bc6ea02, 0xef36, 0x464f, { 0xbf, 0x0c, 0x21, 0xca, 0x39, 0xe5, 0x16, 0x8a } };
struct HeapProperty
@@ -458,6 +459,7 @@ namespace bgfx { namespace d3d12
RendererContextD3D12()
: m_wireframe(false)
, m_maxAnisotropy(1)
+ , m_depthClamp(false)
, m_fsChanges(0)
, m_vsChanges(0)
, m_backBufferColorIdx(0)
@@ -885,6 +887,7 @@ namespace bgfx { namespace d3d12
// | BGFX_CAPS_SWAP_CHAIN
| BGFX_CAPS_TEXTURE_BLIT
| BGFX_CAPS_TEXTURE_READ_BACK
+ | BGFX_CAPS_OCCLUSION_QUERY
);
g_caps.maxTextureSize = 16384;
g_caps.maxFBAttachments = uint8_t(bx::uint32_min(16, BGFX_CONFIG_MAX_FRAME_BUFFER_ATTACHMENTS) );
@@ -1036,6 +1039,8 @@ namespace bgfx { namespace d3d12
postReset();
m_batch.create(4<<10);
+ m_gpuTimer.init();
+ m_occlusionQuery.init();
}
return true;
@@ -1069,6 +1074,9 @@ namespace bgfx { namespace d3d12
preReset();
+ m_gpuTimer.shutdown();
+ m_occlusionQuery.shutdown();
+
m_samplerAllocator.destroy();
for (uint32_t ii = 0; ii < BX_COUNTOF(m_scratchBuffer); ++ii)
@@ -1722,13 +1730,21 @@ data.NumQualityLevels = 0;
m_maxAnisotropy = 1;
}
- uint32_t flags = _resolution.m_flags & ~(BGFX_RESET_HMD_RECENTER | BGFX_RESET_MAXANISOTROPY);
+ bool depthClamp = !!(_resolution.m_flags & BGFX_RESET_DEPTH_CLAMP);
+
+ if (m_depthClamp != depthClamp)
+ {
+ m_depthClamp = depthClamp;
+ m_pipelineStateCache.invalidate();
+ }
+
+ uint32_t flags = _resolution.m_flags & ~(BGFX_RESET_HMD_RECENTER | BGFX_RESET_MAXANISOTROPY | BGFX_RESET_DEPTH_CLAMP);
if (m_resolution.m_width != _resolution.m_width
|| m_resolution.m_height != _resolution.m_height
|| m_resolution.m_flags != flags)
{
- flags &= ~BGFX_RESET_FORCE;
+ flags &= ~BGFX_RESET_INTERNAL_FORCE;
bool resize = (m_resolution.m_flags&BGFX_RESET_MSAA_MASK) == (_resolution.m_flags&BGFX_RESET_MSAA_MASK);
@@ -2000,7 +2016,7 @@ data.NumQualityLevels = 0;
desc.DepthBias = 0;
desc.DepthBiasClamp = 0.0f;
desc.SlopeScaledDepthBias = 0.0f;
- desc.DepthClipEnable = false;
+ desc.DepthClipEnable = !m_depthClamp;
desc.MultisampleEnable = !!(_state&BGFX_STATE_MSAA);
desc.AntialiasedLineEnable = false;
desc.ForcedSampleCount = 0;
@@ -2382,6 +2398,11 @@ data.NumQualityLevels = 0;
return sampler;
}
+ bool isVisible(Frame* _render, OcclusionQueryHandle _handle, bool _visible)
+ {
+ return _visible == (0 != _render->m_occlusion[_handle.idx]);
+ }
+
void commit(UniformBuffer& _uniformBuffer)
{
_uniformBuffer.reset();
@@ -2552,7 +2573,7 @@ data.NumQualityLevels = 0;
rect.top = _rect.m_y;
rect.right = _rect.m_x + _rect.m_width;
rect.bottom = _rect.m_y + _rect.m_height;
- clear(_clear, _palette, &rect);
+ clear(_clear, _palette, &rect, 1);
}
}
@@ -2595,8 +2616,10 @@ data.NumQualityLevels = 0;
uint16_t m_numWindows;
FrameBufferHandle m_windows[BGFX_CONFIG_MAX_FRAME_BUFFERS];
- ID3D12Device* m_device;
- ID3D12InfoQueue* m_infoQueue;
+ ID3D12Device* m_device;
+ ID3D12InfoQueue* m_infoQueue;
+ TimerQueryD3D12 m_gpuTimer;
+ OcclusionQueryD3D12 m_occlusionQuery;
ID3D12DescriptorHeap* m_rtvDescriptorHeap;
ID3D12DescriptorHeap* m_dsvDescriptorHeap;
@@ -2622,6 +2645,7 @@ data.NumQualityLevels = 0;
DXGI_SWAP_CHAIN_DESC m_scd;
uint32_t m_maxAnisotropy;
+ bool m_depthClamp;
BufferD3D12 m_indexBuffers[BGFX_CONFIG_MAX_INDEX_BUFFERS];
VertexBufferD3D12 m_vertexBuffers[BGFX_CONFIG_MAX_VERTEX_BUFFERS];
@@ -4318,6 +4342,151 @@ data.NumQualityLevels = 0;
}
}
+ void TimerQueryD3D12::init()
+ {
+ D3D12_QUERY_HEAP_DESC queryHeapDesc;
+ queryHeapDesc.Count = m_control.m_size * 2;
+ queryHeapDesc.NodeMask = 1;
+ queryHeapDesc.Type = D3D12_QUERY_HEAP_TYPE_TIMESTAMP;
+ DX_CHECK(s_renderD3D12->m_device->CreateQueryHeap(&queryHeapDesc
+ , IID_ID3D12QueryHeap
+ , (void**)&m_queryHeap
+ ) );
+
+ const uint32_t size = queryHeapDesc.Count*sizeof(uint64_t);
+ m_readback = createCommittedResource(s_renderD3D12->m_device
+ , HeapProperty::ReadBack
+ , size
+ );
+
+ DX_CHECK(s_renderD3D12->m_cmd.m_commandQueue->GetTimestampFrequency(&m_frequency) );
+
+ D3D12_RANGE range = { 0, size };
+ m_readback->Map(0, &range, (void**)&m_result);
+ }
+
+ void TimerQueryD3D12::shutdown()
+ {
+ D3D12_RANGE range = { 0, 0 };
+ m_readback->Unmap(0, &range);
+
+ DX_RELEASE(m_queryHeap, 0);
+ DX_RELEASE(m_readback, 0);
+ }
+
+ void TimerQueryD3D12::begin(ID3D12GraphicsCommandList* _commandList)
+ {
+ BX_UNUSED(_commandList);
+ while (0 == m_control.reserve(1) )
+ {
+ m_control.consume(1);
+ }
+
+ uint32_t offset = m_control.m_current * 2 + 0;
+ _commandList->EndQuery(m_queryHeap
+ , D3D12_QUERY_TYPE_TIMESTAMP
+ , offset
+ );
+ }
+
+ void TimerQueryD3D12::end(ID3D12GraphicsCommandList* _commandList)
+ {
+ BX_UNUSED(_commandList);
+ uint32_t offset = m_control.m_current * 2;
+ _commandList->EndQuery(m_queryHeap
+ , D3D12_QUERY_TYPE_TIMESTAMP
+ , offset + 1
+ );
+ _commandList->ResolveQueryData(m_queryHeap
+ , D3D12_QUERY_TYPE_TIMESTAMP
+ , offset
+ , 2
+ , m_readback
+ , offset * sizeof(uint64_t)
+ );
+ m_control.commit(1);
+ }
+
+ bool TimerQueryD3D12::get()
+ {
+ if (0 != m_control.available() )
+ {
+ uint32_t offset = m_control.m_read * 2;
+ m_begin = m_result[offset+0];
+ m_end = m_result[offset+1];
+ m_elapsed = m_end - m_begin;
+
+ m_control.consume(1);
+
+ return true;
+ }
+
+ return false;
+ }
+
+ void OcclusionQueryD3D12::init()
+ {
+ D3D12_QUERY_HEAP_DESC queryHeapDesc;
+ queryHeapDesc.Count = BX_COUNTOF(m_handle);
+ queryHeapDesc.NodeMask = 1;
+ queryHeapDesc.Type = D3D12_QUERY_HEAP_TYPE_OCCLUSION;
+ DX_CHECK(s_renderD3D12->m_device->CreateQueryHeap(&queryHeapDesc
+ , IID_ID3D12QueryHeap
+ , (void**)&m_queryHeap
+ ) );
+
+ const uint32_t size = BX_COUNTOF(m_handle)*sizeof(uint64_t);
+ m_readback = createCommittedResource(s_renderD3D12->m_device
+ , HeapProperty::ReadBack
+ , size
+ );
+
+ D3D12_RANGE range = { 0, size };
+ m_readback->Map(0, &range, (void**)&m_result);
+ }
+
+ void OcclusionQueryD3D12::shutdown()
+ {
+ D3D12_RANGE range = { 0, 0 };
+ m_readback->Unmap(0, &range);
+
+ DX_RELEASE(m_queryHeap, 0);
+ DX_RELEASE(m_readback, 0);
+ }
+
+ void OcclusionQueryD3D12::begin(ID3D12GraphicsCommandList* _commandList, Frame* _render, OcclusionQueryHandle _handle)
+ {
+ while (0 == m_control.reserve(1) )
+ {
+ OcclusionQueryHandle handle = m_handle[m_control.m_read];
+ _render->m_occlusion[handle.idx] = 0 < m_result[handle.idx];
+ m_control.consume(1);
+ }
+
+ m_handle[m_control.m_current] = _handle;
+ _commandList->BeginQuery(m_queryHeap
+ , D3D12_QUERY_TYPE_BINARY_OCCLUSION
+ , _handle.idx
+ );
+ }
+
+ void OcclusionQueryD3D12::end(ID3D12GraphicsCommandList* _commandList)
+ {
+ OcclusionQueryHandle handle = m_handle[m_control.m_current];
+ _commandList->EndQuery(m_queryHeap
+ , D3D12_QUERY_TYPE_BINARY_OCCLUSION
+ , handle.idx
+ );
+ _commandList->ResolveQueryData(m_queryHeap
+ , D3D12_QUERY_TYPE_BINARY_OCCLUSION
+ , handle.idx
+ , 1
+ , m_readback
+ , handle.idx * sizeof(uint64_t)
+ );
+ m_control.commit(1);
+ }
+
struct Bind
{
D3D12_GPU_DESCRIPTOR_HANDLE m_srvHandle;
@@ -4333,6 +4502,8 @@ data.NumQualityLevels = 0;
int64_t elapsed = -bx::getHPCounter();
int64_t captureElapsed = 0;
+ m_gpuTimer.begin(m_commandList);
+
if (0 < _render->m_iboffset)
{
TransientIndexBuffer* ib = _render->m_transientIb;
@@ -4349,8 +4520,8 @@ data.NumQualityLevels = 0;
RenderDraw currentState;
currentState.clear();
- currentState.m_flags = BGFX_STATE_NONE;
- currentState.m_stencil = packStencil(BGFX_STENCIL_NONE, BGFX_STENCIL_NONE);
+ currentState.m_stateFlags = BGFX_STATE_NONE;
+ currentState.m_stencil = packStencil(BGFX_STENCIL_NONE, BGFX_STENCIL_NONE);
_render->m_hmdInitialized = false;
@@ -4369,7 +4540,7 @@ data.NumQualityLevels = 0;
ID3D12PipelineState* currentPso = NULL;
SortKey key;
uint16_t view = UINT16_MAX;
- FrameBufferHandle fbh = BGFX_INVALID_HANDLE;
+ FrameBufferHandle fbh = { BGFX_CONFIG_MAX_FRAME_BUFFERS };
BlitKey blitKey;
blitKey.decode(_render->m_blitKeys[0]);
@@ -4510,8 +4681,8 @@ data.NumQualityLevels = 0;
box.bottom = blit.m_srcY + height;;
box.back = blit.m_srcZ + bx::uint32_imax(1, depth);
- D3D12_TEXTURE_COPY_LOCATION dstLocation = { dst.m_ptr, D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX, { 0 } };
- D3D12_TEXTURE_COPY_LOCATION srcLocation = { src.m_ptr, D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX, { 0 } };
+ D3D12_TEXTURE_COPY_LOCATION dstLocation = { dst.m_ptr, D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX, {{ 0 }} };
+ D3D12_TEXTURE_COPY_LOCATION srcLocation = { src.m_ptr, D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX, {{ 0 }} };
m_commandList->CopyTextureRegion(&dstLocation
, blit.m_dstX
, blit.m_dstY
@@ -4539,14 +4710,15 @@ data.NumQualityLevels = 0;
: 0
;
- D3D12_TEXTURE_COPY_LOCATION dstLocation = { dst.m_ptr, D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX, { dstZ*dst.m_numMips+blit.m_dstMip } };
- D3D12_TEXTURE_COPY_LOCATION srcLocation = { src.m_ptr, D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX, { srcZ*src.m_numMips+blit.m_srcMip } };
+ D3D12_TEXTURE_COPY_LOCATION dstLocation = { dst.m_ptr, D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX, {{ dstZ*dst.m_numMips+blit.m_dstMip }} };
+ D3D12_TEXTURE_COPY_LOCATION srcLocation = { src.m_ptr, D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX, {{ srcZ*src.m_numMips+blit.m_srcMip }} };
+ bool depthStencil = isDepth(TextureFormat::Enum(src.m_textureFormat) );
m_commandList->CopyTextureRegion(&dstLocation
, blit.m_dstX
, blit.m_dstY
, 0
, &srcLocation
- , &box
+ , depthStencil ? NULL : &box
);
}
}
@@ -4718,9 +4890,17 @@ data.NumQualityLevels = 0;
const RenderDraw& draw = renderItem.draw;
- const uint64_t newFlags = draw.m_flags;
- uint64_t changedFlags = currentState.m_flags ^ draw.m_flags;
- currentState.m_flags = newFlags;
+ const bool hasOcclusionQuery = 0 != (draw.m_stateFlags & BGFX_STATE_INTERNAL_OCCLUSION_QUERY);
+ if (isValid(draw.m_occlusionQuery)
+ && !hasOcclusionQuery
+ && !isVisible(_render, draw.m_occlusionQuery, 0 != (draw.m_submitFlags&BGFX_SUBMIT_INTERNAL_OCCLUSION_VISIBLE) ) )
+ {
+ continue;
+ }
+
+ const uint64_t newFlags = draw.m_stateFlags;
+ uint64_t changedFlags = currentState.m_stateFlags ^ draw.m_stateFlags;
+ currentState.m_stateFlags = newFlags;
const uint64_t newStencil = draw.m_stencil;
uint64_t changedStencil = (currentState.m_stencil ^ draw.m_stencil) & BGFX_STENCIL_FUNC_REF_MASK;
@@ -4765,8 +4945,8 @@ data.NumQualityLevels = 0;
currentState.m_scissor = !draw.m_scissor;
changedFlags = BGFX_STATE_MASK;
changedStencil = packStencil(BGFX_STENCIL_MASK, BGFX_STENCIL_MASK);
- currentState.m_flags = newFlags;
- currentState.m_stencil = newStencil;
+ currentState.m_stateFlags = newFlags;
+ currentState.m_stencil = newStencil;
const uint64_t pt = newFlags&BGFX_STATE_PT_MASK;
primIndex = uint8_t(pt>>BGFX_STATE_PT_SHIFT);
@@ -4776,7 +4956,7 @@ data.NumQualityLevels = 0;
if (isValid(draw.m_vertexBuffer) )
{
- const uint64_t state = draw.m_flags;
+ const uint64_t state = draw.m_stateFlags;
bool hasFactor = 0
|| f0 == (state & f0)
|| f1 == (state & f1)
@@ -4801,7 +4981,8 @@ data.NumQualityLevels = 0;
|| (0 != (BGFX_STATE_PT_MASK & changedFlags)
|| prim.m_toplogy != s_primInfo[primIndex].m_toplogy)
|| currentState.m_scissor != scissor
- || pso != currentPso)
+ || pso != currentPso
+ || hasOcclusionQuery)
{
m_batch.flush(m_commandList);
}
@@ -4825,8 +5006,8 @@ data.NumQualityLevels = 0;
TextureD3D12& texture = m_textures[bind.m_idx];
texture.setState(m_commandList, D3D12_RESOURCE_STATE_GENERIC_READ);
scratchBuffer.allocSrv(srvHandle[stage], texture);
- samplerFlags[stage] = (0 == (BGFX_SAMPLER_DEFAULT_FLAGS & bind.m_un.m_draw.m_flags)
- ? bind.m_un.m_draw.m_flags
+ samplerFlags[stage] = (0 == (BGFX_TEXTURE_INTERNAL_DEFAULT_SAMPLER & bind.m_un.m_draw.m_textureFlags)
+ ? bind.m_un.m_draw.m_textureFlags
: texture.m_flags
) & (BGFX_TEXTURE_SAMPLER_BITS_MASK|BGFX_TEXTURE_BORDER_COLOR_MASK)
;
@@ -4977,6 +5158,13 @@ data.NumQualityLevels = 0;
statsNumPrimsRendered[primIndex] += numPrimsRendered;
statsNumInstances[primIndex] += draw.m_numInstances;
statsNumIndices += numIndices;
+
+ if (hasOcclusionQuery)
+ {
+ m_occlusionQuery.begin(m_commandList, _render, draw.m_occlusionQuery);
+ m_batch.flush(m_commandList);
+ m_occlusionQuery.end(m_commandList);
+ }
}
}
@@ -4987,6 +5175,10 @@ data.NumQualityLevels = 0;
elapsed += now;
static int64_t last = now;
+
+ Stats& perfStats = _render->m_perfStats;
+ perfStats.cpuTimeBegin = last;
+
int64_t frameTime = now - last;
last = now;
@@ -4995,11 +5187,33 @@ data.NumQualityLevels = 0;
min = bx::int64_min(min, frameTime);
max = bx::int64_max(max, frameTime);
+ static uint32_t maxGpuLatency = 0;
+ static double maxGpuElapsed = 0.0f;
+ double elapsedGpuMs = 0.0;
+
static int64_t presentMin = m_presentElapsed;
static int64_t presentMax = m_presentElapsed;
presentMin = bx::int64_min(presentMin, m_presentElapsed);
presentMax = bx::int64_max(presentMax, m_presentElapsed);
+ m_gpuTimer.end(m_commandList);
+
+ while (m_gpuTimer.get() )
+ {
+ double toGpuMs = 1000.0 / double(m_gpuTimer.m_frequency);
+ elapsedGpuMs = m_gpuTimer.m_elapsed * toGpuMs;
+ maxGpuElapsed = elapsedGpuMs > maxGpuElapsed ? elapsedGpuMs : maxGpuElapsed;
+ }
+ maxGpuLatency = bx::uint32_imax(maxGpuLatency, m_gpuTimer.m_control.available()-1);
+
+ const int64_t timerFreq = bx::getHPFrequency();
+
+ perfStats.cpuTimeEnd = now;
+ perfStats.cpuTimerFreq = timerFreq;
+ perfStats.gpuTimeBegin = m_gpuTimer.m_begin;
+ perfStats.gpuTimeEnd = m_gpuTimer.m_end;
+ perfStats.gpuTimerFreq = m_gpuTimer.m_frequency;
+
if (_render->m_debug & (BGFX_DEBUG_IFH | BGFX_DEBUG_STATS) )
{
// PIX_BEGINEVENT(D3DCOLOR_RGBA(0x40, 0x40, 0x40, 0xff), L"debugstats");
diff --git a/3rdparty/bgfx/src/renderer_d3d12.h b/3rdparty/bgfx/src/renderer_d3d12.h
index bf03858375a..d046b275142 100644
--- a/3rdparty/bgfx/src/renderer_d3d12.h
+++ b/3rdparty/bgfx/src/renderer_d3d12.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#ifndef BGFX_RENDERER_D3D12_H_HEADER_GUARD
@@ -432,6 +432,49 @@ namespace bgfx { namespace d3d12
uint32_t m_flushPerBatch;
};
+ struct TimerQueryD3D12
+ {
+ TimerQueryD3D12()
+ : m_control(4)
+ {
+ }
+
+ void init();
+ void shutdown();
+ void begin(ID3D12GraphicsCommandList* _commandList);
+ void end(ID3D12GraphicsCommandList* _commandList);
+ bool get();
+
+ uint64_t m_begin;
+ uint64_t m_end;
+ uint64_t m_elapsed;
+ uint64_t m_frequency;
+
+ ID3D12Resource* m_readback;
+ ID3D12QueryHeap* m_queryHeap;
+ uint64_t* m_result;
+ bx::RingBufferControl m_control;
+ };
+
+ struct OcclusionQueryD3D12
+ {
+ OcclusionQueryD3D12()
+ : m_control(BX_COUNTOF(m_handle) )
+ {
+ }
+
+ void init();
+ void shutdown();
+ void begin(ID3D12GraphicsCommandList* _commandList, Frame* _render, OcclusionQueryHandle _handle);
+ void end(ID3D12GraphicsCommandList* _commandList);
+
+ ID3D12Resource* m_readback;
+ ID3D12QueryHeap* m_queryHeap;
+ OcclusionQueryHandle m_handle[BGFX_CONFIG_MAX_OCCUSION_QUERIES];
+ uint64_t* m_result;
+ bx::RingBufferControl m_control;
+ };
+
} /* namespace d3d12 */ } // namespace bgfx
#endif // BGFX_RENDERER_D3D12_H_HEADER_GUARD
diff --git a/3rdparty/bgfx/src/renderer_d3d9.cpp b/3rdparty/bgfx/src/renderer_d3d9.cpp
index 63423aa6a2b..dc51a9eef3f 100644
--- a/3rdparty/bgfx/src/renderer_d3d9.cpp
+++ b/3rdparty/bgfx/src/renderer_d3d9.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "bgfx_p.h"
@@ -11,6 +11,7 @@
namespace bgfx { namespace d3d9
{
static wchar_t s_viewNameW[BGFX_CONFIG_MAX_VIEWS][BGFX_CONFIG_MAX_VIEW_NAME];
+ static char s_viewName[BGFX_CONFIG_MAX_VIEWS][BGFX_CONFIG_MAX_VIEW_NAME];
struct PrimInfo
{
@@ -285,6 +286,7 @@ namespace bgfx { namespace d3d9
, m_nvidia(false)
, m_instancingSupport(false)
, m_timerQuerySupport(false)
+ , m_occlusionQuerySupport(false)
, m_rtMsaa(false)
{
}
@@ -501,6 +503,26 @@ namespace bgfx { namespace d3d9
DX_CHECK(m_device->QueryInterface(IID_IDirect3DDevice9Ex, (void**)&m_deviceEx) );
}
+ {
+ IDirect3DQuery9* timerQueryTest[3] = {};
+ m_timerQuerySupport = true
+ && SUCCEEDED(m_device->CreateQuery(D3DQUERYTYPE_TIMESTAMPDISJOINT, &timerQueryTest[0]) )
+ && SUCCEEDED(m_device->CreateQuery(D3DQUERYTYPE_TIMESTAMP, &timerQueryTest[1]) )
+ && SUCCEEDED(m_device->CreateQuery(D3DQUERYTYPE_TIMESTAMPFREQ, &timerQueryTest[2]) )
+ ;
+ DX_RELEASE(timerQueryTest[0], 0);
+ DX_RELEASE(timerQueryTest[1], 0);
+ DX_RELEASE(timerQueryTest[2], 0);
+ }
+
+ {
+ IDirect3DQuery9* occlusionQueryTest;
+ m_occlusionQuerySupport = true
+ && SUCCEEDED(m_device->CreateQuery(D3DQUERYTYPE_OCCLUSION, &occlusionQueryTest) )
+ ;
+ DX_RELEASE(occlusionQueryTest, 0);
+ }
+
DX_CHECK(m_device->GetDeviceCaps(&m_caps) );
// For shit GPUs that can create DX9 device but can't do simple stuff. GTFO!
@@ -538,6 +560,7 @@ namespace bgfx { namespace d3d9
| ( (UINT16_MAX < m_caps.MaxVertexIndex) ? BGFX_CAPS_INDEX32 : 0)
| ( (m_caps.DevCaps2 & D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES) ? BGFX_CAPS_TEXTURE_BLIT : 0)
| BGFX_CAPS_TEXTURE_READ_BACK
+ | (m_occlusionQuerySupport ? BGFX_CAPS_OCCLUSION_QUERY : 0)
);
g_caps.maxTextureSize = uint16_t(bx::uint32_min(m_caps.MaxTextureWidth, m_caps.MaxTextureHeight) );
// g_caps.maxVertexIndex = m_caps.MaxVertexIndex;
@@ -695,18 +718,6 @@ namespace bgfx { namespace d3d9
#endif // BX_PLATFORM_WINDOWS
{
- IDirect3DQuery9* timerQueryTest[3] = {};
- m_timerQuerySupport = true
- && SUCCEEDED(m_device->CreateQuery(D3DQUERYTYPE_TIMESTAMPDISJOINT, &timerQueryTest[0]) )
- && SUCCEEDED(m_device->CreateQuery(D3DQUERYTYPE_TIMESTAMP, &timerQueryTest[1]) )
- && SUCCEEDED(m_device->CreateQuery(D3DQUERYTYPE_TIMESTAMPFREQ, &timerQueryTest[2]) )
- ;
- DX_RELEASE(timerQueryTest[0], 0);
- DX_RELEASE(timerQueryTest[1], 0);
- DX_RELEASE(timerQueryTest[2], 0);
- }
-
- {
IDirect3DSwapChain9* swapChain;
DX_CHECK(m_device->GetSwapChain(0, &swapChain) );
@@ -722,9 +733,8 @@ namespace bgfx { namespace d3d9
// Init reserved part of view name.
for (uint32_t ii = 0; ii < BGFX_CONFIG_MAX_VIEWS; ++ii)
{
- char name[BGFX_CONFIG_MAX_VIEW_NAME_RESERVED+1];
- bx::snprintf(name, sizeof(name), "%3d ", ii);
- mbstowcs(s_viewNameW[ii], name, BGFX_CONFIG_MAX_VIEW_NAME_RESERVED);
+ bx::snprintf(s_viewName[ii], BGFX_CONFIG_MAX_VIEW_NAME_RESERVED + 1, "%3d ", ii);
+ mbstowcs(s_viewNameW[ii], s_viewName[ii], BGFX_CONFIG_MAX_VIEW_NAME_RESERVED);
}
if (NULL != m_deviceEx)
@@ -1096,6 +1106,11 @@ namespace bgfx { namespace d3d9
, BX_COUNTOF(s_viewNameW[0])-BGFX_CONFIG_MAX_VIEW_NAME_RESERVED
);
}
+
+ bx::strlcpy(&s_viewName[_id][BGFX_CONFIG_MAX_VIEW_NAME_RESERVED]
+ , _name
+ , BX_COUNTOF(s_viewName[0]) - BGFX_CONFIG_MAX_VIEW_NAME_RESERVED
+ );
}
void updateUniform(uint16_t _loc, const void* _data, uint32_t _size) BX_OVERRIDE
@@ -1162,7 +1177,7 @@ namespace bgfx { namespace d3d9
uint8_t flags = predefined.m_type;
setShaderUniform(flags, predefined.m_loc, proj, 4);
- m_textures[_blitter.m_texture.idx].commit(0, BGFX_SAMPLER_DEFAULT_FLAGS, NULL);
+ m_textures[_blitter.m_texture.idx].commit(0, BGFX_TEXTURE_INTERNAL_DEFAULT_SAMPLER, NULL);
}
void blitRender(TextVideoMemBlitter& _blitter, uint32_t _numIndices) BX_OVERRIDE
@@ -1223,7 +1238,7 @@ namespace bgfx { namespace d3d9
|| m_resolution.m_height != _resolution.m_height
|| m_resolution.m_flags != flags)
{
- flags &= ~BGFX_RESET_FORCE;
+ flags &= ~BGFX_RESET_INTERNAL_FORCE;
m_resolution = _resolution;
m_resolution.m_flags = flags;
@@ -1434,6 +1449,11 @@ namespace bgfx { namespace d3d9
m_gpuTimer.preReset();
}
+ if (m_occlusionQuerySupport)
+ {
+ m_occlusionQuery.preReset();
+ }
+
for (uint32_t ii = 0; ii < BX_COUNTOF(m_indexBuffers); ++ii)
{
m_indexBuffers[ii].preReset();
@@ -1467,6 +1487,11 @@ namespace bgfx { namespace d3d9
m_gpuTimer.postReset();
}
+ if (m_occlusionQuerySupport)
+ {
+ m_occlusionQuery.postReset();
+ }
+
capturePostReset();
for (uint32_t ii = 0; ii < BX_COUNTOF(m_indexBuffers); ++ii)
@@ -1545,6 +1570,12 @@ namespace bgfx { namespace d3d9
}
}
+ bool isVisible(Frame* _render, OcclusionQueryHandle _handle, bool _visible)
+ {
+ m_occlusionQuery.resolve(_render);
+ return _visible == (0 != _render->m_occlusion[_handle.idx]);
+ }
+
void capturePreReset()
{
if (NULL != m_captureSurface)
@@ -1937,10 +1968,11 @@ namespace bgfx { namespace d3d9
IDirect3D9Ex* m_d3d9ex;
IDirect3DDevice9Ex* m_deviceEx;
- IDirect3D9* m_d3d9;
- IDirect3DDevice9* m_device;
- IDirect3DQuery9* m_flushQuery;
- TimerQueryD3D9 m_gpuTimer;
+ IDirect3D9* m_d3d9;
+ IDirect3DDevice9* m_device;
+ IDirect3DQuery9* m_flushQuery;
+ TimerQueryD3D9 m_gpuTimer;
+ OcclusionQueryD3D9 m_occlusionQuery;
D3DPOOL m_pool;
IDirect3DSwapChain9* m_swapChain;
@@ -1969,6 +2001,7 @@ namespace bgfx { namespace d3d9
bool m_nvidia;
bool m_instancingSupport;
bool m_timerQuerySupport;
+ bool m_occlusionQuerySupport;
D3DFORMAT m_fmtDepth;
@@ -2950,7 +2983,7 @@ namespace bgfx { namespace d3d9
void TextureD3D9::commit(uint8_t _stage, uint32_t _flags, const float _palette[][4])
{
- uint32_t flags = 0 == (BGFX_SAMPLER_DEFAULT_FLAGS & _flags)
+ uint32_t flags = 0 == (BGFX_TEXTURE_INTERNAL_DEFAULT_SAMPLER & _flags)
? _flags
: m_flags
;
@@ -3290,7 +3323,7 @@ namespace bgfx { namespace d3d9
{
Frame& frame = m_frame[ii];
DX_CHECK(device->CreateQuery(D3DQUERYTYPE_TIMESTAMPDISJOINT, &frame.m_disjoint) );
- DX_CHECK(device->CreateQuery(D3DQUERYTYPE_TIMESTAMP, &frame.m_start) );
+ DX_CHECK(device->CreateQuery(D3DQUERYTYPE_TIMESTAMP, &frame.m_begin) );
DX_CHECK(device->CreateQuery(D3DQUERYTYPE_TIMESTAMP, &frame.m_end) );
DX_CHECK(device->CreateQuery(D3DQUERYTYPE_TIMESTAMPFREQ, &frame.m_freq) );
}
@@ -3306,7 +3339,7 @@ namespace bgfx { namespace d3d9
{
Frame& frame = m_frame[ii];
DX_RELEASE(frame.m_disjoint, 0);
- DX_RELEASE(frame.m_start, 0);
+ DX_RELEASE(frame.m_begin, 0);
DX_RELEASE(frame.m_end, 0);
DX_RELEASE(frame.m_freq, 0);
}
@@ -3321,7 +3354,7 @@ namespace bgfx { namespace d3d9
Frame& frame = m_frame[m_control.m_current];
frame.m_disjoint->Issue(D3DISSUE_BEGIN);
- frame.m_start->Issue(D3DISSUE_END);
+ frame.m_begin->Issue(D3DISSUE_END);
}
void TimerQueryD3D9::end()
@@ -3345,14 +3378,16 @@ namespace bgfx { namespace d3d9
{
m_control.consume(1);
- uint64_t timeStart;
- DX_CHECK(frame.m_start->GetData(&timeStart, sizeof(timeStart), 0) );
+ uint64_t timeBegin;
+ DX_CHECK(frame.m_begin->GetData(&timeBegin, sizeof(timeBegin), 0) );
uint64_t freq;
DX_CHECK(frame.m_freq->GetData(&freq, sizeof(freq), 0) );
m_frequency = freq;
- m_elapsed = timeEnd - timeStart;
+ m_begin = timeBegin;
+ m_end = timeEnd;
+ m_elapsed = timeEnd - timeBegin;
return true;
}
@@ -3361,6 +3396,63 @@ namespace bgfx { namespace d3d9
return false;
}
+ void OcclusionQueryD3D9::postReset()
+ {
+ IDirect3DDevice9* device = s_renderD3D9->m_device;
+
+ for (uint32_t ii = 0; ii < BX_COUNTOF(m_query); ++ii)
+ {
+ Query& query = m_query[ii];
+ DX_CHECK(device->CreateQuery(D3DQUERYTYPE_OCCLUSION, &query.m_ptr) );
+ }
+ }
+
+ void OcclusionQueryD3D9::preReset()
+ {
+ for (uint32_t ii = 0; ii < BX_COUNTOF(m_query); ++ii)
+ {
+ Query& query = m_query[ii];
+ DX_RELEASE(query.m_ptr, 0);
+ }
+ }
+
+ void OcclusionQueryD3D9::begin(Frame* _render, OcclusionQueryHandle _handle)
+ {
+ while (0 == m_control.reserve(1) )
+ {
+ resolve(_render, true);
+ }
+
+ Query& query = m_query[m_control.m_current];
+ query.m_ptr->Issue(D3DISSUE_BEGIN);
+ query.m_handle = _handle;
+ }
+
+ void OcclusionQueryD3D9::end()
+ {
+ Query& query = m_query[m_control.m_current];
+ query.m_ptr->Issue(D3DISSUE_END);
+ m_control.commit(1);
+ }
+
+ void OcclusionQueryD3D9::resolve(Frame* _render, bool)
+ {
+ while (0 != m_control.available() )
+ {
+ Query& query = m_query[m_control.m_read];
+
+ uint32_t result;
+ HRESULT hr = query.m_ptr->GetData(&result, sizeof(result), 0);
+ if (S_FALSE == hr)
+ {
+ break;
+ }
+
+ _render->m_occlusion[query.m_handle.idx] = 0 < result;
+ m_control.consume(1);
+ }
+ }
+
void RendererContextD3D9::submit(Frame* _render, ClearQuad& _clearQuad, TextVideoMemBlitter& _textVideoMemBlitter)
{
IDirect3DDevice9* device = m_device;
@@ -3394,8 +3486,8 @@ namespace bgfx { namespace d3d9
RenderDraw currentState;
currentState.clear();
- currentState.m_flags = BGFX_STATE_NONE;
- currentState.m_stencil = packStencil(BGFX_STENCIL_NONE, BGFX_STENCIL_NONE);
+ currentState.m_stateFlags = BGFX_STATE_NONE;
+ currentState.m_stencil = packStencil(BGFX_STENCIL_NONE, BGFX_STENCIL_NONE);
ViewState viewState(_render, false);
@@ -3403,7 +3495,7 @@ namespace bgfx { namespace d3d9
uint16_t programIdx = invalidHandle;
SortKey key;
uint16_t view = UINT16_MAX;
- FrameBufferHandle fbh = BGFX_INVALID_HANDLE;
+ FrameBufferHandle fbh = { BGFX_CONFIG_MAX_FRAME_BUFFERS };
uint32_t blendFactor = 0;
BlitKey blitKey;
@@ -3430,6 +3522,11 @@ namespace bgfx { namespace d3d9
invalidateSamplerState();
+ if (m_occlusionQuerySupport)
+ {
+ m_occlusionQuery.resolve(_render);
+ }
+
if (0 == (_render->m_debug&BGFX_DEBUG_IFH) )
{
for (uint32_t item = 0, numItems = _render->m_num; item < numItems; ++item)
@@ -3445,9 +3542,17 @@ namespace bgfx { namespace d3d9
const RenderDraw& draw = _render->m_renderItem[_render->m_sortValues[item] ].draw;
- const uint64_t newFlags = draw.m_flags;
- uint64_t changedFlags = currentState.m_flags ^ draw.m_flags;
- currentState.m_flags = newFlags;
+ const bool hasOcclusionQuery = 0 != (draw.m_stateFlags & BGFX_STATE_INTERNAL_OCCLUSION_QUERY);
+ if (isValid(draw.m_occlusionQuery)
+ && !hasOcclusionQuery
+ && !isVisible(_render, draw.m_occlusionQuery, 0 != (draw.m_submitFlags&BGFX_SUBMIT_INTERNAL_OCCLUSION_VISIBLE) ) )
+ {
+ continue;
+ }
+
+ const uint64_t newFlags = draw.m_stateFlags;
+ uint64_t changedFlags = currentState.m_stateFlags ^ draw.m_stateFlags;
+ currentState.m_stateFlags = newFlags;
const uint64_t newStencil = draw.m_stencil;
uint64_t changedStencil = currentState.m_stencil ^ draw.m_stencil;
@@ -3459,11 +3564,16 @@ namespace bgfx { namespace d3d9
currentState.m_scissor = !draw.m_scissor;
changedFlags = BGFX_STATE_MASK;
changedStencil = packStencil(BGFX_STENCIL_MASK, BGFX_STENCIL_MASK);
- currentState.m_flags = newFlags;
- currentState.m_stencil = newStencil;
+ currentState.m_stateFlags = newFlags;
+ currentState.m_stencil = newStencil;
PIX_ENDEVENT();
PIX_BEGINEVENT(D3DCOLOR_RGBA(0xff, 0x00, 0x00, 0xff), s_viewNameW[key.m_view]);
+ if (item > 0)
+ {
+ BGFX_PROFILER_END();
+ }
+ BGFX_PROFILER_BEGIN_DYNAMIC(s_viewName[key.m_view]);
view = key.m_view;
programIdx = invalidHandle;
@@ -3538,10 +3648,11 @@ namespace bgfx { namespace d3d9
//
// GetRenderTargetData (dst must be SYSTEMMEM)
+ bool depth = isDepth(TextureFormat::Enum(src.m_textureFormat) );
HRESULT hr = m_device->StretchRect(srcSurface
- , &srcRect
+ , depth ? NULL : &srcRect
, dstSurface
- , &dstRect
+ , depth ? NULL : &dstRect
, D3DTEXF_NONE
);
if (FAILED(hr) )
@@ -3807,12 +3918,12 @@ namespace bgfx { namespace d3d9
const Binding& bind = draw.m_bind[stage];
Binding& current = currentState.m_bind[stage];
if (current.m_idx != bind.m_idx
- || current.m_un.m_draw.m_flags != bind.m_un.m_draw.m_flags
+ || current.m_un.m_draw.m_textureFlags != bind.m_un.m_draw.m_textureFlags
|| programChanged)
{
if (invalidHandle != bind.m_idx)
{
- m_textures[bind.m_idx].commit(stage, bind.m_un.m_draw.m_flags, _render->m_colorPalette);
+ m_textures[bind.m_idx].commit(stage, bind.m_un.m_draw.m_textureFlags, _render->m_colorPalette);
}
else
{
@@ -3902,6 +4013,11 @@ namespace bgfx { namespace d3d9
uint32_t numInstances = 0;
uint32_t numPrimsRendered = 0;
+ if (hasOcclusionQuery)
+ {
+ m_occlusionQuery.begin(_render, draw.m_occlusionQuery);
+ }
+
if (isValid(draw.m_indexBuffer) )
{
if (UINT32_MAX == draw.m_numIndices)
@@ -3949,6 +4065,11 @@ namespace bgfx { namespace d3d9
) );
}
+ if (hasOcclusionQuery)
+ {
+ m_occlusionQuery.end();
+ }
+
statsNumPrimsSubmitted[primIndex] += numPrimsSubmitted;
statsNumPrimsRendered[primIndex] += numPrimsRendered;
statsNumInstances[primIndex] += numInstances;
@@ -3967,6 +4088,8 @@ namespace bgfx { namespace d3d9
captureElapsed = -bx::getHPCounter();
capture();
captureElapsed += bx::getHPCounter();
+
+ BGFX_PROFILER_END();
}
}
@@ -3976,6 +4099,10 @@ namespace bgfx { namespace d3d9
elapsed += now;
static int64_t last = now;
+
+ Stats& perfStats = _render->m_perfStats;
+ perfStats.cpuTimeBegin = last;
+
int64_t frameTime = now - last;
last = now;
@@ -4003,10 +4130,10 @@ namespace bgfx { namespace d3d9
const int64_t timerFreq = bx::getHPFrequency();
- Stats& perfStats = _render->m_perfStats;
- perfStats.cpuTime = frameTime;
+ perfStats.cpuTimeEnd = now;
perfStats.cpuTimerFreq = timerFreq;
- perfStats.gpuTime = m_gpuTimer.m_elapsed;
+ perfStats.gpuTimeBegin = m_gpuTimer.m_begin;
+ perfStats.gpuTimeEnd = m_gpuTimer.m_end;
perfStats.gpuTimerFreq = m_gpuTimer.m_frequency;
if (_render->m_debug & (BGFX_DEBUG_IFH|BGFX_DEBUG_STATS) )
@@ -4038,7 +4165,7 @@ namespace bgfx { namespace d3d9
tvm.printf(0, pos++, 0x8f, " Memory: %s (process) ", processMemoryUsed);
pos = 10;
- tvm.printf(10, pos++, 0x8e, " Frame: %7.3f, % 7.3f \x1f, % 7.3f \x1e [ms] / % 6.2f FPS "
+ tvm.printf(10, pos++, 0x8e, " Frame: %7.3f, % 7.3f \x1f, % 7.3f \x1e [ms] / % 6.2f FPS "
, double(frameTime)*toMs
, double(min)*toMs
, double(max)*toMs
@@ -4046,7 +4173,7 @@ namespace bgfx { namespace d3d9
);
const uint32_t msaa = (m_resolution.m_flags&BGFX_RESET_MSAA_MASK)>>BGFX_RESET_MSAA_SHIFT;
- tvm.printf(10, pos++, 0x8e, " Reset flags: [%c] vsync, [%c] MSAAx%d, [%c] MaxAnisotropy "
+ tvm.printf(10, pos++, 0x8e, " Reset flags: [%c] vsync, [%c] MSAAx%d, [%c] MaxAnisotropy "
, !!(m_resolution.m_flags&BGFX_RESET_VSYNC) ? '\xfe' : ' '
, 0 != msaa ? '\xfe' : ' '
, 1<<msaa
@@ -4054,7 +4181,7 @@ namespace bgfx { namespace d3d9
);
double elapsedCpuMs = double(elapsed)*toMs;
- tvm.printf(10, pos++, 0x8e, " Submitted: %5d (draw %5d, compute %4d) / CPU %7.4f [ms] %c GPU %7.4f [ms] (latency %d)"
+ tvm.printf(10, pos++, 0x8e, " Submitted: %5d (draw %5d, compute %4d) / CPU %7.4f [ms] %c GPU %7.4f [ms] (latency %d)"
, _render->m_num
, statsKeyType[0]
, statsKeyType[1]
@@ -4068,7 +4195,7 @@ namespace bgfx { namespace d3d9
for (uint32_t ii = 0; ii < BX_COUNTOF(s_primName); ++ii)
{
- tvm.printf(10, pos++, 0x8e, " %9s: %7d (#inst: %5d), submitted: %7d"
+ tvm.printf(10, pos++, 0x8e, " %10s: %7d (#inst: %5d), submitted: %7d"
, s_primName[ii]
, statsNumPrimsRendered[ii]
, statsNumInstances[ii]
@@ -4081,6 +4208,7 @@ namespace bgfx { namespace d3d9
tvm.printf(10, pos++, 0x8e, " DVB size: %7d ", _render->m_vboffset);
tvm.printf(10, pos++, 0x8e, " DIB size: %7d ", _render->m_iboffset);
+ pos++;
double captureMs = double(captureElapsed)*toMs;
tvm.printf(10, pos++, 0x8e, " Capture: %7.4f [ms]", captureMs);
diff --git a/3rdparty/bgfx/src/renderer_d3d9.h b/3rdparty/bgfx/src/renderer_d3d9.h
index ea649dd8f15..0bef1737058 100644
--- a/3rdparty/bgfx/src/renderer_d3d9.h
+++ b/3rdparty/bgfx/src/renderer_d3d9.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#ifndef BGFX_RENDERER_D3D9_H_HEADER_GUARD
@@ -357,6 +357,7 @@ namespace bgfx { namespace d3d9
IDirect3DVolumeTexture9* m_staging3d;
IDirect3DCubeTexture9* m_stagingCube;
};
+
uint32_t m_flags;
uint32_t m_width;
uint32_t m_height;
@@ -417,11 +418,13 @@ namespace bgfx { namespace d3d9
struct Frame
{
IDirect3DQuery9* m_disjoint;
- IDirect3DQuery9* m_start;
+ IDirect3DQuery9* m_begin;
IDirect3DQuery9* m_end;
IDirect3DQuery9* m_freq;
};
+ uint64_t m_begin;
+ uint64_t m_end;
uint64_t m_elapsed;
uint64_t m_frequency;
@@ -429,6 +432,29 @@ namespace bgfx { namespace d3d9
bx::RingBufferControl m_control;
};
+ struct OcclusionQueryD3D9
+ {
+ OcclusionQueryD3D9()
+ : m_control(BX_COUNTOF(m_query) )
+ {
+ }
+
+ void postReset();
+ void preReset();
+ void begin(Frame* _render, OcclusionQueryHandle _handle);
+ void end();
+ void resolve(Frame* _render, bool _wait = false);
+
+ struct Query
+ {
+ IDirect3DQuery9* m_ptr;
+ OcclusionQueryHandle m_handle;
+ };
+
+ Query m_query[BGFX_CONFIG_MAX_OCCUSION_QUERIES];
+ bx::RingBufferControl m_control;
+ };
+
} /* namespace d3d9 */ } // namespace bgfx
#endif // BGFX_RENDERER_D3D9_H_HEADER_GUARD
diff --git a/3rdparty/bgfx/src/renderer_gl.cpp b/3rdparty/bgfx/src/renderer_gl.cpp
index 0a684f57c22..35fbdc427cf 100644
--- a/3rdparty/bgfx/src/renderer_gl.cpp
+++ b/3rdparty/bgfx/src/renderer_gl.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "bgfx_p.h"
@@ -10,6 +10,20 @@
# include <bx/timer.h>
# include <bx/uint32_t.h>
+#if BGFX_CONFIG_PROFILER_REMOTERY
+# define BGFX_GPU_PROFILER_BIND() rmt_BindOpenGL()
+# define BGFX_GPU_PROFILER_UNBIND() rmt_UnbindOpenGL()
+# define BGFX_GPU_PROFILER_BEGIN(_group, _name, _color) rmt_BeginOpenGLSample(_group##_##_name)
+# define BGFX_GPU_PROFILER_BEGIN_DYNAMIC(_namestr) rmt_BeginOpenGLSampleDynamic(_namestr)
+# define BGFX_GPU_PROFILER_END() rmt_EndOpenGLSample()
+#else
+# define BGFX_GPU_PROFILER_BIND() BX_NOOP()
+# define BGFX_GPU_PROFILER_UNBIND() BX_NOOP()
+# define BGFX_GPU_PROFILER_BEGIN(_group, _name, _color) BX_NOOP()
+# define BGFX_GPU_PROFILER_BEGIN_DYNAMIC(_namestr) BX_NOOP()
+# define BGFX_GPU_PROFILER_END() BX_NOOP()
+#endif // BGFX_CONFIG_PROFILER_REMOTERY
+
namespace bgfx { namespace gl
{
static char s_viewName[BGFX_CONFIG_MAX_VIEWS][BGFX_CONFIG_MAX_VIEW_NAME];
@@ -519,6 +533,7 @@ namespace bgfx { namespace gl
EXT_shader_image_load_store,
EXT_shader_texture_lod,
EXT_shadow_samplers,
+ EXT_sRGB_write_control,
EXT_texture_array,
EXT_texture_compression_dxt1,
EXT_texture_compression_latc,
@@ -558,6 +573,7 @@ namespace bgfx { namespace gl
NV_copy_image,
NV_draw_buffers,
+ NV_occlusion_query,
NV_texture_border_clamp,
NVX_gpu_memory_info,
@@ -716,12 +732,13 @@ namespace bgfx { namespace gl
{ "EXT_framebuffer_object", BGFX_CONFIG_RENDERER_OPENGL >= 30, true },
{ "EXT_framebuffer_sRGB", BGFX_CONFIG_RENDERER_OPENGL >= 30, true },
{ "EXT_multi_draw_indirect", false, true }, // GLES3.1 extension.
- { "EXT_occlusion_query_boolean", false, true },
+ { "EXT_occlusion_query_boolean", false, true }, // GLES2 extension.
{ "EXT_packed_float", BGFX_CONFIG_RENDERER_OPENGL >= 33, true },
{ "EXT_read_format_bgra", false, true },
{ "EXT_shader_image_load_store", false, true },
{ "EXT_shader_texture_lod", false, true }, // GLES2 extension.
{ "EXT_shadow_samplers", false, true },
+ { "EXT_sRGB_write_control", false, true }, // GLES2 extension.
{ "EXT_texture_array", BGFX_CONFIG_RENDERER_OPENGL >= 30, true },
{ "EXT_texture_compression_dxt1", false, true },
{ "EXT_texture_compression_latc", false, true },
@@ -761,6 +778,7 @@ namespace bgfx { namespace gl
{ "NV_copy_image", false, true },
{ "NV_draw_buffers", false, true }, // GLES2 extension.
+ { "NV_occlusion_query", false, true },
{ "NV_texture_border_clamp", false, true }, // GLES2 extension.
{ "NVX_gpu_memory_info", false, true },
@@ -1208,11 +1226,13 @@ namespace bgfx { namespace gl
, m_vaoSupport(false)
, m_samplerObjectSupport(false)
, m_shadowSamplersSupport(false)
+ , m_srgbWriteControlSupport(BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL) )
, m_borderColorSupport(BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL) )
, m_programBinarySupport(false)
, m_textureSwizzleSupport(false)
, m_depthTextureSupport(false)
, m_timerQuerySupport(false)
+ , m_occlusionQuerySupport(false)
, m_flip(false)
, m_hash( (BX_PLATFORM_WINDOWS<<1) | BX_ARCH_64BIT)
, m_backBufferFbo(0)
@@ -1796,10 +1816,30 @@ namespace bgfx { namespace gl
;
m_timerQuerySupport &= true
+ && NULL != glQueryCounter
&& NULL != glGetQueryObjectiv
&& NULL != glGetQueryObjectui64v
;
+ m_occlusionQuerySupport = false
+ || s_extension[Extension::ARB_occlusion_query ].m_supported
+ || s_extension[Extension::ARB_occlusion_query2 ].m_supported
+ || s_extension[Extension::EXT_occlusion_query_boolean].m_supported
+ || s_extension[Extension::NV_occlusion_query ].m_supported
+ ;
+
+ m_occlusionQuerySupport &= true
+ && NULL != glGenQueries
+ && NULL != glDeleteQueries
+ && NULL != glBeginQuery
+ && NULL != glEndQuery
+ ;
+
+ g_caps.supported |= m_occlusionQuerySupport
+ ? BGFX_CAPS_OCCLUSION_QUERY
+ : 0
+ ;
+
g_caps.supported |= m_depthTextureSupport
? BGFX_CAPS_TEXTURE_COMPARE_LEQUAL
: 0
@@ -1814,6 +1854,8 @@ namespace bgfx { namespace gl
if (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGLES) )
{
+ m_srgbWriteControlSupport = s_extension[Extension::EXT_sRGB_write_control].m_supported;
+
m_borderColorSupport = s_extension[Extension::NV_texture_border_clamp].m_supported;
s_textureAddress[BGFX_TEXTURE_U_BORDER>>BGFX_TEXTURE_U_SHIFT] = s_extension[Extension::NV_texture_border_clamp].m_supported
? GL_CLAMP_TO_BORDER
@@ -1894,11 +1936,6 @@ namespace bgfx { namespace gl
GL_CHECK(glEnable(GL_TEXTURE_CUBE_MAP_SEAMLESS) );
}
- if (s_extension[Extension::ARB_depth_clamp].m_supported)
- {
- GL_CHECK(glEnable(GL_DEPTH_CLAMP) );
- }
-
if (NULL == glFrameTerminatorGREMEDY
|| !s_extension[Extension::GREMEDY_frame_terminator].m_supported)
{
@@ -1926,12 +1963,16 @@ namespace bgfx { namespace gl
glInvalidateFramebuffer = stubInvalidateFramebuffer;
}
- if (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL)
- && m_timerQuerySupport)
+ if (m_timerQuerySupport)
{
m_gpuTimer.create();
}
+ if (m_occlusionQuerySupport)
+ {
+ m_occlusionQuery.create();
+ }
+
// Init reserved part of view name.
for (uint32_t ii = 0; ii < BGFX_CONFIG_MAX_VIEWS; ++ii)
{
@@ -1939,10 +1980,14 @@ namespace bgfx { namespace gl
}
ovrPostReset();
+
+ BGFX_GPU_PROFILER_BIND();
}
void shutdown()
{
+ BGFX_GPU_PROFILER_UNBIND();
+
ovrPreReset();
m_ovr.shutdown();
@@ -1957,12 +2002,16 @@ namespace bgfx { namespace gl
invalidateCache();
- if (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL)
- && m_timerQuerySupport)
+ if (m_timerQuerySupport)
{
m_gpuTimer.destroy();
}
+ if (m_occlusionQuerySupport)
+ {
+ m_occlusionQuery.destroy();
+ }
+
destroyMsaaFbo();
m_glctx.destroy();
@@ -2249,13 +2298,10 @@ namespace bgfx { namespace gl
void updateViewName(uint8_t _id, const char* _name) BX_OVERRIDE
{
- if (BX_ENABLED(BGFX_CONFIG_DEBUG_PIX) )
- {
- bx::strlcpy(&s_viewName[_id][BGFX_CONFIG_MAX_VIEW_NAME_RESERVED]
- , _name
- , BX_COUNTOF(s_viewName[0])-BGFX_CONFIG_MAX_VIEW_NAME_RESERVED
- );
- }
+ bx::strlcpy(&s_viewName[_id][BGFX_CONFIG_MAX_VIEW_NAME_RESERVED]
+ , _name
+ , BX_COUNTOF(s_viewName[0])-BGFX_CONFIG_MAX_VIEW_NAME_RESERVED
+ );
}
void updateUniform(uint16_t _loc, const void* _data, uint32_t _size) BX_OVERRIDE
@@ -2310,6 +2356,15 @@ namespace bgfx { namespace gl
GL_CHECK(glActiveTexture(GL_TEXTURE0) );
GL_CHECK(glBindTexture(GL_TEXTURE_2D, m_textures[_blitter.m_texture.idx].m_id) );
+
+ if (!BX_ENABLED(BX_PLATFORM_OSX) )
+ {
+ if (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL)
+ || BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGLES >= 30) )
+ {
+ GL_CHECK(glBindSampler(0, 0) );
+ }
+ }
}
void blitRender(TextVideoMemBlitter& _blitter, uint32_t _numIndices) BX_OVERRIDE
@@ -2344,13 +2399,26 @@ namespace bgfx { namespace gl
? m_maxAnisotropyDefault
: 0.0f
;
- uint32_t flags = _resolution.m_flags & ~(BGFX_RESET_HMD_RECENTER | BGFX_RESET_MAXANISOTROPY);
+
+ if (s_extension[Extension::ARB_depth_clamp].m_supported)
+ {
+ if (!!(_resolution.m_flags & BGFX_RESET_DEPTH_CLAMP) )
+ {
+ GL_CHECK(glEnable(GL_DEPTH_CLAMP) );
+ }
+ else
+ {
+ GL_CHECK(glDisable(GL_DEPTH_CLAMP) );
+ }
+ }
+
+ uint32_t flags = _resolution.m_flags & ~(BGFX_RESET_HMD_RECENTER | BGFX_RESET_MAXANISOTROPY | BGFX_RESET_DEPTH_CLAMP);
if (m_resolution.m_width != _resolution.m_width
|| m_resolution.m_height != _resolution.m_height
|| m_resolution.m_flags != flags)
{
- flags &= ~BGFX_RESET_FORCE;
+ flags &= ~BGFX_RESET_INTERNAL_FORCE;
m_resolution = _resolution;
m_resolution.m_flags = flags;
@@ -2427,6 +2495,18 @@ namespace bgfx { namespace gl
if (!isValid(_fbh) )
{
GL_CHECK(glBindFramebuffer(GL_FRAMEBUFFER, m_msaaBackBufferFbo) );
+
+ if (m_srgbWriteControlSupport)
+ {
+ if (0 != (m_resolution.m_flags & BGFX_RESET_SRGB_BACKBUFFER) )
+ {
+ GL_CHECK(glEnable(GL_FRAMEBUFFER_SRGB) );
+ }
+ else
+ {
+ GL_CHECK(glDisable(GL_FRAMEBUFFER_SRGB) );
+ }
+ }
}
else
{
@@ -2587,7 +2667,7 @@ namespace bgfx { namespace gl
if (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL)
|| BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGLES >= 30) )
{
- if (0 == (BGFX_SAMPLER_DEFAULT_FLAGS & _flags) )
+ if (0 == (BGFX_TEXTURE_INTERNAL_DEFAULT_SAMPLER & _flags) )
{
const uint32_t index = (_flags & BGFX_TEXTURE_BORDER_COLOR_MASK) >> BGFX_TEXTURE_BORDER_COLOR_SHIFT;
@@ -2689,6 +2769,12 @@ namespace bgfx { namespace gl
}
}
+ bool isVisible(Frame* _render, OcclusionQueryHandle _handle, bool _visible)
+ {
+ m_occlusionQuery.resolve(_render);
+ return _visible == (0 != _render->m_occlusion[_handle.idx]);
+ }
+
void ovrPostReset()
{
#if BGFX_CONFIG_USE_OVR
@@ -3129,7 +3215,9 @@ namespace bgfx { namespace gl
FrameBufferGL m_frameBuffers[BGFX_CONFIG_MAX_FRAME_BUFFERS];
UniformRegistry m_uniformReg;
void* m_uniforms[BGFX_CONFIG_MAX_UNIFORMS];
+
TimerQueryGL m_gpuTimer;
+ OcclusionQueryGL m_occlusionQuery;
VaoStateCache m_vaoStateCache;
SamplerStateCache m_samplerStateCache;
@@ -3152,11 +3240,13 @@ namespace bgfx { namespace gl
bool m_vaoSupport;
bool m_samplerObjectSupport;
bool m_shadowSamplersSupport;
+ bool m_srgbWriteControlSupport;
bool m_borderColorSupport;
bool m_programBinarySupport;
bool m_textureSwizzleSupport;
bool m_depthTextureSupport;
bool m_timerQuerySupport;
+ bool m_occlusionQuerySupport;
bool m_flip;
uint64_t m_hash;
@@ -4282,7 +4372,7 @@ namespace bgfx { namespace gl
;
}
- const uint32_t flags = (0 != (BGFX_SAMPLER_DEFAULT_FLAGS & _flags) ? m_flags : _flags) & BGFX_TEXTURE_SAMPLER_BITS_MASK;
+ const uint32_t flags = (0 != (BGFX_TEXTURE_INTERNAL_DEFAULT_SAMPLER & _flags) ? m_flags : _flags) & BGFX_TEXTURE_SAMPLER_BITS_MASK;
bool hasBorderColor = false;
bx::HashMurmur2A murmur;
@@ -4361,7 +4451,7 @@ namespace bgfx { namespace gl
void TextureGL::commit(uint32_t _stage, uint32_t _flags, const float _palette[][4])
{
- const uint32_t flags = 0 == (BGFX_SAMPLER_DEFAULT_FLAGS & _flags)
+ const uint32_t flags = 0 == (BGFX_TEXTURE_INTERNAL_DEFAULT_SAMPLER & _flags)
? _flags
: m_flags
;
@@ -5115,8 +5205,69 @@ namespace bgfx { namespace gl
GL_CHECK(glInvalidateFramebuffer(GL_FRAMEBUFFER, idx, buffers) );
}
+ void OcclusionQueryGL::create()
+ {
+ for (uint32_t ii = 0; ii < BX_COUNTOF(m_query); ++ii)
+ {
+ Query& query = m_query[ii];
+ GL_CHECK(glGenQueries(1, &query.m_id) );
+ }
+ }
+
+ void OcclusionQueryGL::destroy()
+ {
+ for (uint32_t ii = 0; ii < BX_COUNTOF(m_query); ++ii)
+ {
+ Query& query = m_query[ii];
+ GL_CHECK(glDeleteQueries(1, &query.m_id) );
+ }
+ }
+
+ void OcclusionQueryGL::begin(Frame* _render, OcclusionQueryHandle _handle)
+ {
+ while (0 == m_control.reserve(1) )
+ {
+ resolve(_render, true);
+ }
+
+ Query& query = m_query[m_control.m_current];
+ GL_CHECK(glBeginQuery(GL_SAMPLES_PASSED, query.m_id) );
+ query.m_handle = _handle;
+ }
+
+ void OcclusionQueryGL::end()
+ {
+ GL_CHECK(glEndQuery(GL_SAMPLES_PASSED) );
+ m_control.commit(1);
+ }
+
+ void OcclusionQueryGL::resolve(Frame* _render, bool _wait)
+ {
+ while (0 != m_control.available() )
+ {
+ Query& query = m_query[m_control.m_read];
+ int32_t result;
+
+ if (!_wait)
+ {
+ GL_CHECK(glGetQueryObjectiv(query.m_id, GL_QUERY_RESULT_AVAILABLE, &result) );
+
+ if (!result)
+ {
+ break;
+ }
+ }
+
+ GL_CHECK(glGetQueryObjectiv(query.m_id, GL_QUERY_RESULT, &result) );
+ _render->m_occlusion[query.m_handle.idx] = 0 < result;
+ m_control.consume(1);
+ }
+ }
+
void RendererContextGL::submit(Frame* _render, ClearQuad& _clearQuad, TextVideoMemBlitter& _textVideoMemBlitter)
{
+ BGFX_GPU_PROFILER_BEGIN_DYNAMIC("rendererSubmit");
+
if (1 < m_numWindows
&& m_vaoSupport)
{
@@ -5163,8 +5314,8 @@ namespace bgfx { namespace gl
RenderDraw currentState;
currentState.clear();
- currentState.m_flags = BGFX_STATE_NONE;
- currentState.m_stencil = packStencil(BGFX_STENCIL_NONE, BGFX_STENCIL_NONE);
+ currentState.m_stateFlags = BGFX_STATE_NONE;
+ currentState.m_stencil = packStencil(BGFX_STENCIL_NONE, BGFX_STENCIL_NONE);
_render->m_hmdInitialized = m_ovr.isInitialized();
@@ -5174,7 +5325,7 @@ namespace bgfx { namespace gl
uint16_t programIdx = invalidHandle;
SortKey key;
uint16_t view = UINT16_MAX;
- FrameBufferHandle fbh = BGFX_INVALID_HANDLE;
+ FrameBufferHandle fbh = { BGFX_CONFIG_MAX_FRAME_BUFFERS };
BlitKey blitKey;
blitKey.decode(_render->m_blitKeys[0]);
@@ -5213,6 +5364,11 @@ namespace bgfx { namespace gl
uint32_t statsNumIndices = 0;
uint32_t statsKeyType[2] = {};
+ if (m_occlusionQuerySupport)
+ {
+ m_occlusionQuery.resolve(_render);
+ }
+
if (0 == (_render->m_debug&BGFX_DEBUG_IFH) )
{
GL_CHECK(glBindFramebuffer(GL_FRAMEBUFFER, m_msaaBackBufferFbo) );
@@ -5278,6 +5434,14 @@ namespace bgfx { namespace gl
eye = 0;
}
+ if (item > 1)
+ {
+ BGFX_GPU_PROFILER_END();
+ BGFX_PROFILER_END();
+ }
+ BGFX_PROFILER_BEGIN_DYNAMIC(s_viewName[view]);
+ BGFX_GPU_PROFILER_BEGIN_DYNAMIC(s_viewName[view]);
+
viewState.m_rect = _render->m_rect[view];
if (viewRestart)
{
@@ -5505,9 +5669,17 @@ namespace bgfx { namespace gl
const RenderDraw& draw = renderItem.draw;
- const uint64_t newFlags = draw.m_flags;
- uint64_t changedFlags = currentState.m_flags ^ draw.m_flags;
- currentState.m_flags = newFlags;
+ const bool hasOcclusionQuery = 0 != (draw.m_stateFlags & BGFX_STATE_INTERNAL_OCCLUSION_QUERY);
+ if (isValid(draw.m_occlusionQuery)
+ && !hasOcclusionQuery
+ && !isVisible(_render, draw.m_occlusionQuery, 0 != (draw.m_submitFlags&BGFX_SUBMIT_INTERNAL_OCCLUSION_VISIBLE) ) )
+ {
+ continue;
+ }
+
+ const uint64_t newFlags = draw.m_stateFlags;
+ uint64_t changedFlags = currentState.m_stateFlags ^ draw.m_stateFlags;
+ currentState.m_stateFlags = newFlags;
const uint64_t newStencil = draw.m_stencil;
uint64_t changedStencil = currentState.m_stencil ^ draw.m_stencil;
@@ -5519,8 +5691,8 @@ namespace bgfx { namespace gl
currentState.m_scissor = !draw.m_scissor;
changedFlags = BGFX_STATE_MASK;
changedStencil = packStencil(BGFX_STENCIL_MASK, BGFX_STENCIL_MASK);
- currentState.m_flags = newFlags;
- currentState.m_stencil = newStencil;
+ currentState.m_stateFlags = newFlags;
+ currentState.m_stencil = newStencil;
}
uint16_t scissor = draw.m_scissor;
@@ -5830,13 +6002,13 @@ namespace bgfx { namespace gl
const Binding& bind = draw.m_bind[stage];
Binding& current = currentState.m_bind[stage];
if (current.m_idx != bind.m_idx
- || current.m_un.m_draw.m_flags != bind.m_un.m_draw.m_flags
+ || current.m_un.m_draw.m_textureFlags != bind.m_un.m_draw.m_textureFlags
|| programChanged)
{
if (invalidHandle != bind.m_idx)
{
TextureGL& texture = m_textures[bind.m_idx];
- texture.commit(stage, bind.m_un.m_draw.m_flags, _render->m_colorPalette);
+ texture.commit(stage, bind.m_un.m_draw.m_textureFlags, _render->m_colorPalette);
}
}
@@ -6017,6 +6189,11 @@ namespace bgfx { namespace gl
uint32_t numPrimsRendered = 0;
uint32_t numDrawIndirect = 0;
+ if (hasOcclusionQuery)
+ {
+ m_occlusionQuery.begin(_render, draw.m_occlusionQuery);
+ }
+
if (isValid(draw.m_indirectBuffer) )
{
const VertexBufferGL& vb = m_vertexBuffers[draw.m_indirectBuffer.idx];
@@ -6123,6 +6300,11 @@ namespace bgfx { namespace gl
}
}
+ if (hasOcclusionQuery)
+ {
+ m_occlusionQuery.end();
+ }
+
statsNumPrimsSubmitted[primIndex] += numPrimsSubmitted;
statsNumPrimsRendered[primIndex] += numPrimsRendered;
statsNumInstances[primIndex] += numInstances;
@@ -6143,14 +6325,23 @@ namespace bgfx { namespace gl
captureElapsed = -bx::getHPCounter();
capture();
captureElapsed += bx::getHPCounter();
+
+ BGFX_GPU_PROFILER_END();
+ BGFX_PROFILER_END();
}
}
+ BGFX_GPU_PROFILER_END();
+
m_glctx.makeCurrent(NULL);
int64_t now = bx::getHPCounter();
elapsed += now;
static int64_t last = now;
+
+ Stats& perfStats = _render->m_perfStats;
+ perfStats.cpuTimeBegin = last;
+
int64_t frameTime = now - last;
last = now;
@@ -6178,10 +6369,10 @@ namespace bgfx { namespace gl
const int64_t timerFreq = bx::getHPFrequency();
- Stats& perfStats = _render->m_perfStats;
- perfStats.cpuTime = frameTime;
+ perfStats.cpuTimeEnd = now;
perfStats.cpuTimerFreq = timerFreq;
- perfStats.gpuTime = elapsedGl;
+ perfStats.gpuTimeBegin = m_gpuTimer.m_begin;
+ perfStats.gpuTimeEnd = m_gpuTimer.m_end;
perfStats.gpuTimerFreq = 1000000000;
if (_render->m_debug & (BGFX_DEBUG_IFH|BGFX_DEBUG_STATS) )
@@ -6211,7 +6402,7 @@ namespace bgfx { namespace gl
tvm.printf(0, pos++, 0x8f, " Memory: %s (process) ", processMemoryUsed);
pos = 10;
- tvm.printf(10, pos++, 0x8e, " Frame CPU: %7.3f, % 7.3f \x1f, % 7.3f \x1e [ms] / % 6.2f FPS "
+ tvm.printf(10, pos++, 0x8e, " Frame: %7.3f, % 7.3f \x1f, % 7.3f \x1e [ms] / % 6.2f FPS "
, double(frameTime)*toMs
, double(min)*toMs
, double(max)*toMs
@@ -6222,7 +6413,7 @@ namespace bgfx { namespace gl
bx::snprintf(hmd, BX_COUNTOF(hmd), ", [%c] HMD ", hmdEnabled ? '\xfe' : ' ');
const uint32_t msaa = (m_resolution.m_flags&BGFX_RESET_MSAA_MASK)>>BGFX_RESET_MSAA_SHIFT;
- tvm.printf(10, pos++, 0x8e, " Reset flags: [%c] vsync, [%c] MSAAx%d%s, [%c] MaxAnisotropy "
+ tvm.printf(10, pos++, 0x8e, " Reset flags: [%c] vsync, [%c] MSAAx%d%s, [%c] MaxAnisotropy "
, !!(m_resolution.m_flags&BGFX_RESET_VSYNC) ? '\xfe' : ' '
, 0 != msaa ? '\xfe' : ' '
, 1<<msaa
@@ -6231,7 +6422,7 @@ namespace bgfx { namespace gl
);
double elapsedCpuMs = double(elapsed)*toMs;
- tvm.printf(10, pos++, 0x8e, " Submitted: %5d (draw %5d, compute %4d) / CPU %7.4f [ms] %c GPU %7.4f [ms] (latency %d) "
+ tvm.printf(10, pos++, 0x8e, " Submitted: %5d (draw %5d, compute %4d) / CPU %7.4f [ms] %c GPU %7.4f [ms] (latency %d) "
, _render->m_num
, statsKeyType[0]
, statsKeyType[1]
@@ -6245,7 +6436,7 @@ namespace bgfx { namespace gl
for (uint32_t ii = 0; ii < BX_COUNTOF(s_primInfo); ++ii)
{
- tvm.printf(10, pos++, 0x8e, " %9s: %7d (#inst: %5d), submitted: %7d "
+ tvm.printf(10, pos++, 0x8e, " %10s: %7d (#inst: %5d), submitted: %7d "
, s_primName[ii]
, statsNumPrimsRendered[ii]
, statsNumInstances[ii]
@@ -6345,12 +6536,10 @@ namespace bgfx { namespace gl
pos++;
double captureMs = double(captureElapsed)*toMs;
- tvm.printf(10, pos++, 0x8e, " Capture: %7.4f [ms] ", captureMs);
+ tvm.printf(10, pos++, 0x8e, " Capture: %7.4f [ms] ", captureMs);
uint8_t attr[2] = { 0x89, 0x8a };
uint8_t attrIndex = _render->m_waitSubmit < _render->m_waitRender;
-
- pos++;
tvm.printf(10, pos++, attr[attrIndex&1], " Submit wait: %7.4f [ms] ", double(_render->m_waitSubmit)*toMs);
tvm.printf(10, pos++, attr[(attrIndex+1)&1], " Render wait: %7.4f [ms] ", double(_render->m_waitRender)*toMs);
@@ -6369,6 +6558,12 @@ namespace bgfx { namespace gl
}
} } // namespace bgfx
+#undef BGFX_GPU_PROFILER_BIND
+#undef BGFX_GPU_PROFILER_UNBIND
+#undef BGFX_GPU_PROFILER_BEGIN
+#undef BGFX_GPU_PROFILER_BEGIN_DYNAMIC
+#undef BGFX_GPU_PROFILER_END
+
#else
namespace bgfx { namespace gl
diff --git a/3rdparty/bgfx/src/renderer_gl.h b/3rdparty/bgfx/src/renderer_gl.h
index 1a17070d7e6..34804d6b23c 100644
--- a/3rdparty/bgfx/src/renderer_gl.h
+++ b/3rdparty/bgfx/src/renderer_gl.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#ifndef BGFX_RENDERER_GL_H_HEADER_GUARD
@@ -10,7 +10,7 @@
|| BX_PLATFORM_ANDROID \
|| BX_PLATFORM_EMSCRIPTEN \
|| BX_PLATFORM_LINUX \
- || BX_PLATFORM_FREEBSD \
+ || BX_PLATFORM_BSD \
|| BX_PLATFORM_QNX \
|| BX_PLATFORM_RPI \
|| BX_PLATFORM_WINDOWS \
@@ -19,12 +19,12 @@
#define BGFX_USE_WGL (BGFX_CONFIG_RENDERER_OPENGL && BX_PLATFORM_WINDOWS)
#define BGFX_USE_GLX (BGFX_CONFIG_RENDERER_OPENGL && (0 \
|| BX_PLATFORM_LINUX \
- || BX_PLATFORM_FREEBSD \
+ || BX_PLATFORM_BSD \
) )
#define BGFX_USE_GL_DYNAMIC_LIB (0 \
|| BX_PLATFORM_LINUX \
- || BX_PLATFORM_FREEBSD \
+ || BX_PLATFORM_BSD \
|| BX_PLATFORM_OSX \
|| BX_PLATFORM_WINDOWS \
)
@@ -36,7 +36,7 @@
# define GL_ARB_shader_objects // OSX collsion with GLhandleARB in gltypes.h
# endif // BX_PLATFORM_OSX
# else
-# if BX_PLATFORM_LINUX || BX_PLATFORM_FREEBSD
+# if BX_PLATFORM_LINUX || BX_PLATFORM_BSD
# define GL_PROTOTYPES
# define GL_GLEXT_LEGACY
# include <GL/gl.h>
@@ -489,6 +489,14 @@ typedef uint64_t GLuint64;
# define GL_QUERY_RESULT_AVAILABLE 0x8867
#endif // GL_QUERY_RESULT_AVAILABLE
+#ifndef GL_SAMPLES_PASSED
+# define GL_SAMPLES_PASSED 0x8914
+#endif // GL_SAMPLES_PASSED
+
+#ifndef GL_ANY_SAMPLES_PASSED
+# define GL_ANY_SAMPLES_PASSED 0x8C2F
+#endif // GL_ANY_SAMPLES_PASSED
+
#ifndef GL_READ_FRAMEBUFFER
# define GL_READ_FRAMEBUFFER 0x8CA8
#endif /// GL_READ_FRAMEBUFFER
@@ -501,6 +509,10 @@ typedef uint64_t GLuint64;
# define GL_TIME_ELAPSED 0x88BF
#endif // GL_TIME_ELAPSED
+#ifndef GL_TIMESTAMP
+# define GL_TIMESTAMP 0x8E28
+#endif // GL_TIMESTAMP
+
#ifndef GL_VBO_FREE_MEMORY_ATI
# define GL_VBO_FREE_MEMORY_ATI 0x87FB
#endif // GL_VBO_FREE_MEMORY_ATI
@@ -726,6 +738,10 @@ typedef uint64_t GLuint64;
# define GL_UNSIGNED_INT_10_10_10_2 0x8DF6
#endif // GL_UNSIGNED_INT_10_10_10_2
+#ifndef GL_FRAMEBUFFER_SRGB
+# define GL_FRAMEBUFFER_SRGB 0x8DB9
+#endif // GL_FRAMEBUFFER_SRGB
+
// _KHR or _ARB...
#define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242
#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243
@@ -789,7 +805,7 @@ typedef uint64_t GLuint64;
# include "glcontext_ppapi.h"
#elif BX_PLATFORM_WINDOWS
# include <windows.h>
-#elif BX_PLATFORM_LINUX || BX_PLATFORM_FREEBSD
+#elif BX_PLATFORM_LINUX || BX_PLATFORM_BSD
# include "glcontext_glx.h"
#elif BX_PLATFORM_OSX
# include "glcontext_nsgl.h"
@@ -1188,38 +1204,6 @@ namespace bgfx { namespace gl
VaoCacheRef m_vcref;
};
- struct QueriesGL
- {
- void create()
- {
- GL_CHECK(glGenQueries(BX_COUNTOF(m_queries), m_queries) );
- }
-
- void destroy()
- {
- GL_CHECK(glDeleteQueries(BX_COUNTOF(m_queries), m_queries) );
- }
-
- void begin(uint16_t _id, GLenum _target) const
- {
- GL_CHECK(glBeginQuery(_target, m_queries[_id]) );
- }
-
- void end(GLenum _target) const
- {
- GL_CHECK(glEndQuery(_target) );
- }
-
- uint64_t getResult(uint16_t _id) const
- {
- uint64_t result;
- GL_CHECK(glGetQueryObjectui64v(m_queries[_id], GL_QUERY_RESULT, &result) );
- return result;
- }
-
- GLuint m_queries[64];
- };
-
struct TimerQueryGL
{
TimerQueryGL()
@@ -1229,12 +1213,22 @@ namespace bgfx { namespace gl
void create()
{
- GL_CHECK(glGenQueries(BX_COUNTOF(m_frame), m_frame) );
+ for (uint32_t ii = 0; ii < BX_COUNTOF(m_frame); ++ii)
+ {
+ Frame& frame = m_frame[ii];
+ GL_CHECK(glGenQueries(1, &frame.m_begin) );
+ GL_CHECK(glGenQueries(1, &frame.m_elapsed) );
+ }
}
void destroy()
{
- GL_CHECK(glDeleteQueries(BX_COUNTOF(m_frame), m_frame) );
+ for (uint32_t ii = 0; ii < BX_COUNTOF(m_frame); ++ii)
+ {
+ Frame& frame = m_frame[ii];
+ GL_CHECK(glDeleteQueries(1, &frame.m_begin) );
+ GL_CHECK(glDeleteQueries(1, &frame.m_elapsed) );
+ }
}
void begin()
@@ -1244,8 +1238,16 @@ namespace bgfx { namespace gl
get();
}
+ Frame& frame = m_frame[m_control.m_current];
+ if (!BX_ENABLED(BX_PLATFORM_OSX) )
+ {
+ GL_CHECK(glQueryCounter(frame.m_begin
+ , GL_TIMESTAMP
+ ) );
+ }
+
GL_CHECK(glBeginQuery(GL_TIME_ELAPSED
- , m_frame[m_control.m_current]
+ , frame.m_elapsed
) );
}
@@ -1259,18 +1261,33 @@ namespace bgfx { namespace gl
{
if (0 != m_control.available() )
{
+ Frame& frame = m_frame[m_control.m_read];
+
GLint available;
- GL_CHECK(glGetQueryObjectiv(m_frame[m_control.m_read]
+ GL_CHECK(glGetQueryObjectiv(frame.m_elapsed
, GL_QUERY_RESULT_AVAILABLE
, &available
) );
if (available)
{
- GL_CHECK(glGetQueryObjectui64v(m_frame[m_control.m_read]
+ if (!BX_ENABLED(BX_PLATFORM_OSX) )
+ {
+ GL_CHECK(glGetQueryObjectui64v(frame.m_begin
+ , GL_QUERY_RESULT
+ , &m_begin
+ ) );
+ }
+ else
+ {
+ m_begin = 0;
+ }
+
+ GL_CHECK(glGetQueryObjectui64v(frame.m_elapsed
, GL_QUERY_RESULT
, &m_elapsed
) );
+ m_end = m_begin + m_elapsed;
m_control.consume(1);
return true;
}
@@ -1279,9 +1296,40 @@ namespace bgfx { namespace gl
return false;
}
+ uint64_t m_begin;
+ uint64_t m_end;
uint64_t m_elapsed;
- GLuint m_frame[4];
+ struct Frame
+ {
+ GLuint m_begin;
+ GLuint m_elapsed;
+ };
+
+ Frame m_frame[4];
+ bx::RingBufferControl m_control;
+ };
+
+ struct OcclusionQueryGL
+ {
+ OcclusionQueryGL()
+ : m_control(BX_COUNTOF(m_query) )
+ {
+ }
+
+ void create();
+ void destroy();
+ void begin(Frame* _render, OcclusionQueryHandle _handle);
+ void end();
+ void resolve(Frame* _render, bool _wait = false);
+
+ struct Query
+ {
+ GLuint m_id;
+ OcclusionQueryHandle m_handle;
+ };
+
+ Query m_query[BGFX_CONFIG_MAX_OCCUSION_QUERIES];
bx::RingBufferControl m_control;
};
diff --git a/3rdparty/bgfx/src/renderer_mtl.h b/3rdparty/bgfx/src/renderer_mtl.h
index 052c7859177..2b683cff891 100644
--- a/3rdparty/bgfx/src/renderer_mtl.h
+++ b/3rdparty/bgfx/src/renderer_mtl.h
@@ -1,6 +1,6 @@
/*
* Copyright 2011-2015 Attila Kocsis, Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#ifndef BGFX_RENDERER_METAL_H_HEADER_GUARD
@@ -141,7 +141,7 @@ namespace bgfx { namespace mtl
id<MTLLibrary> lib = [m_obj newLibraryWithData:(dispatch_data_t)_data error:&error];
BX_WARN(NULL == error
, "newLibraryWithData failed: %s"
- , error.localizedDescription.UTF8String
+ , [error.localizedDescription cStringUsingEncoding:NSASCIIStringEncoding]
);
return lib;
}
@@ -150,10 +150,9 @@ namespace bgfx { namespace mtl
{
NSError* error;
id<MTLLibrary> lib = [m_obj newLibraryWithSource:@(_source) options:nil error:&error];
- //TODO: sometimes prints null as paremeter. string is too large
BX_WARN(NULL == error
, "Shader compilation failed: %s"
- , error.localizedDescription.UTF8String
+ , [error.localizedDescription cStringUsingEncoding:NSASCIIStringEncoding]
);
return lib;
}
@@ -201,7 +200,7 @@ namespace bgfx { namespace mtl
id <MTLRenderPipelineState> state = [m_obj newRenderPipelineStateWithDescriptor:_descriptor error:&error];
BX_WARN(NULL == error
, "newRenderPipelineStateWithDescriptor failed: %s"
- , error.localizedDescription.UTF8String
+ , [error.localizedDescription cStringUsingEncoding:NSASCIIStringEncoding]
);
return state;
}
@@ -213,7 +212,7 @@ namespace bgfx { namespace mtl
BX_WARN(NULL == error
, "newRenderPipelineStateWithDescriptor failed: %s"
- , error.localizedDescription.UTF8String
+ , [error.localizedDescription cStringUsingEncoding:NSASCIIStringEncoding]
);
return state;
}
@@ -226,7 +225,7 @@ namespace bgfx { namespace mtl
BX_WARN(NULL == error
, "newComputePipelineStateWithFunction failed: %s"
- , error.localizedDescription.UTF8String
+ , [error.localizedDescription cStringUsingEncoding:NSASCIIStringEncoding]
);
return state;
}
@@ -674,7 +673,7 @@ namespace bgfx { namespace mtl
MTL_RELEASE(m_ptrStencil);
}
void update(uint8_t _side, uint8_t _mip, const Rect& _rect, uint16_t _z, uint16_t _depth, uint16_t _pitch, const Memory* _mem);
- void commit(uint8_t _stage, uint32_t _flags = BGFX_SAMPLER_DEFAULT_FLAGS);
+ void commit(uint8_t _stage, uint32_t _flags = BGFX_TEXTURE_INTERNAL_DEFAULT_SAMPLER);
Texture m_ptr;
Texture m_ptrStencil; // for emulating packed depth/stencil formats - only for iOS8...
@@ -712,6 +711,29 @@ namespace bgfx { namespace mtl
uint8_t m_num; // number of color handles
};
+ struct OcclusionQueryMTL
+ {
+ OcclusionQueryMTL()
+ : m_control(BX_COUNTOF(m_query) )
+ {
+ }
+
+ void postReset();
+ void preReset();
+ void begin(RenderCommandEncoder& _rce, Frame* _render, OcclusionQueryHandle _handle);
+ void end(RenderCommandEncoder& _rce);
+ void resolve(Frame* _render, bool _wait = false);
+
+ struct Query
+ {
+ OcclusionQueryHandle m_handle;
+ };
+
+ Buffer m_buffer;
+ Query m_query[BGFX_CONFIG_MAX_OCCUSION_QUERIES];
+ bx::RingBufferControl m_control;
+ };
+
} /* namespace metal */ } // namespace bgfx
#endif // BGFX_CONFIG_RENDERER_METAL
diff --git a/3rdparty/bgfx/src/renderer_mtl.mm b/3rdparty/bgfx/src/renderer_mtl.mm
index f855c5a4ee3..bb52c45b855 100644
--- a/3rdparty/bgfx/src/renderer_mtl.mm
+++ b/3rdparty/bgfx/src/renderer_mtl.mm
@@ -1,6 +1,6 @@
/*
* Copyright 2011-2015 Attila Kocsis. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "bgfx_p.h"
@@ -18,6 +18,7 @@
#import <Foundation/Foundation.h>
#define UNIFORM_BUFFER_SIZE (1024*1024)
+#define UNIFORM_BUFFER_COUNT (3)
/*
Known issues / TODOs:
@@ -244,78 +245,78 @@ namespace bgfx { namespace mtl
static TextureFormatInfo s_textureFormat[] =
{
- { MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // BC1
- { MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // BC2
- { MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // BC3
- { MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // BC4
- { MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // BC5
- { MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // BC6H
- { MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // BC7
- { MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // ETC1
- { 180 /*MTLPixelFormatETC2_RGB8*/, 181 /*MTLPixelFormatETC2_RGB8_sRGB*/ }, // ETC2
- { 178 /*MTLPixelFormatEAC_RGBA8*/, 179 /*MTLPixelFormatEAC_RGBA8_sRGB*/ }, // ETC2A
- { 182 /*MTLPixelFormatETC2_RGB8A1*/, 183 /*MTLPixelFormatETC2_RGB8A1_sRGB*/ }, // ETC2A1
- { 160 /*MTLPixelFormatPVRTC_RGB_2BPP*/, 161 /*MTLPixelFormatPVRTC_RGB_2BPP_sRGB*/ }, // PTC12
- { 162 /*MTLPixelFormatPVRTC_RGB_4BPP*/, 163 /*MTLPixelFormatPVRTC_RGB_4BPP_sRGB*/ }, // PTC14
- { 164 /*MTLPixelFormatPVRTC_RGBA_2BPP*/, 165 /*MTLPixelFormatPVRTC_RGBA_2BPP_sRGB*/ }, // PTC12A
- { 166 /*MTLPixelFormatPVRTC_RGBA_4BPP*/, 167 /*MTLPixelFormatPVRTC_RGBA_4BPP_sRGB*/ }, // PTC14A
- { MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // PTC22
- { MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // PTC24
- { MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // Unknown
- { MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // R1
- { MTLPixelFormatA8Unorm, MTLPixelFormatInvalid }, // A8
- { MTLPixelFormatR8Unorm, 11 /*MTLPixelFormatR8Unorm_sRGB*/ }, // R8
- { MTLPixelFormatR8Sint, MTLPixelFormatInvalid }, // R8I
- { MTLPixelFormatR8Uint, MTLPixelFormatInvalid }, // R8U
- { MTLPixelFormatR8Snorm, MTLPixelFormatInvalid }, // R8S
- { MTLPixelFormatR16Unorm, MTLPixelFormatInvalid }, // R16
- { MTLPixelFormatR16Sint, MTLPixelFormatInvalid }, // R16I
- { MTLPixelFormatR16Uint, MTLPixelFormatInvalid }, // R16U
- { MTLPixelFormatR16Float, MTLPixelFormatInvalid }, // R16F
- { MTLPixelFormatR16Snorm, MTLPixelFormatInvalid }, // R16S
- { MTLPixelFormatR32Sint, MTLPixelFormatInvalid }, // R32I
- { MTLPixelFormatR32Uint, MTLPixelFormatInvalid }, // R32U
- { MTLPixelFormatR32Float, MTLPixelFormatInvalid }, // R32F
- { MTLPixelFormatRG8Unorm, 31 /*MTLPixelFormatRG8Unorm_sRGB*/ }, // RG8
- { MTLPixelFormatRG8Sint, MTLPixelFormatInvalid }, // RG8I
- { MTLPixelFormatRG8Uint, MTLPixelFormatInvalid }, // RG8U
- { MTLPixelFormatRG8Snorm, MTLPixelFormatInvalid }, // RG8S
- { MTLPixelFormatRG16Unorm, MTLPixelFormatInvalid }, // RG16
- { MTLPixelFormatRG16Sint, MTLPixelFormatInvalid }, // RG16I
- { MTLPixelFormatRG16Uint, MTLPixelFormatInvalid }, // RG16U
- { MTLPixelFormatRG16Float, MTLPixelFormatInvalid }, // RG16F
- { MTLPixelFormatRG16Snorm, MTLPixelFormatInvalid }, // RG16S
- { MTLPixelFormatRG32Sint, MTLPixelFormatInvalid }, // RG32I
- { MTLPixelFormatRG32Uint, MTLPixelFormatInvalid }, // RG32U
- { MTLPixelFormatRG32Float, MTLPixelFormatInvalid }, // RG32F
- { MTLPixelFormatRGB9E5Float, MTLPixelFormatInvalid }, // RGB9E5F
- { MTLPixelFormatBGRA8Unorm, MTLPixelFormatBGRA8Unorm_sRGB }, // BGRA8
- { MTLPixelFormatRGBA8Unorm, MTLPixelFormatRGBA8Unorm_sRGB }, // RGBA8
- { MTLPixelFormatRGBA8Sint, MTLPixelFormatInvalid }, // RGBA8I
- { MTLPixelFormatRGBA8Uint, MTLPixelFormatInvalid }, // RGBA8U
- { MTLPixelFormatRGBA8Snorm, MTLPixelFormatInvalid }, // RGBA8S
- { MTLPixelFormatRGBA16Unorm, MTLPixelFormatInvalid }, // RGBA16
- { MTLPixelFormatRGBA16Sint, MTLPixelFormatInvalid }, // RGBA16I
- { MTLPixelFormatRGBA16Uint, MTLPixelFormatInvalid }, // RGBA16I
- { MTLPixelFormatRGBA16Float, MTLPixelFormatInvalid }, // RGBA16F
- { MTLPixelFormatRGBA16Snorm, MTLPixelFormatInvalid }, // RGBA16S
- { MTLPixelFormatRGBA32Sint, MTLPixelFormatInvalid }, // RGBA32I
- { MTLPixelFormatRGBA32Uint, MTLPixelFormatInvalid }, // RGBA32U
- { MTLPixelFormatRGBA32Float, MTLPixelFormatInvalid }, // RGBA32F
- { 40 /*MTLPixelFormatB5G6R5Unorm*/, MTLPixelFormatInvalid }, // R5G6B5
- { 42 /*MTLPixelFormatABGR4Unorm*/, MTLPixelFormatInvalid }, // RGBA4
- { 41 /*MTLPixelFormatA1BGR5Unorm*/, MTLPixelFormatInvalid }, // RGB5A1
- { MTLPixelFormatRGB10A2Unorm, MTLPixelFormatInvalid }, // RGB10A2
- { MTLPixelFormatRG11B10Float, MTLPixelFormatInvalid }, // R11G11B10F
- { MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // UnknownDepth
- { MTLPixelFormatDepth32Float, MTLPixelFormatInvalid }, // D16
- { MTLPixelFormatDepth32Float, MTLPixelFormatInvalid }, // D24
- { MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // D24S8
- { MTLPixelFormatDepth32Float, MTLPixelFormatInvalid }, // D32
- { MTLPixelFormatDepth32Float, MTLPixelFormatInvalid }, // D16F
- { MTLPixelFormatDepth32Float, MTLPixelFormatInvalid }, // D24F
- { MTLPixelFormatDepth32Float, MTLPixelFormatInvalid }, // D32F
- { MTLPixelFormatStencil8, MTLPixelFormatInvalid }, // D0S8
+ { MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // BC1
+ { MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // BC2
+ { MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // BC3
+ { MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // BC4
+ { MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // BC5
+ { MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // BC6H
+ { MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // BC7
+ { MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // ETC1
+ { MTLPixelFormat(180) /*ETC2_RGB8*/, MTLPixelFormat(181) /*ETC2_RGB8_sRGB*/ }, // ETC2
+ { MTLPixelFormat(178) /*EAC_RGBA8*/, MTLPixelFormat(179) /*EAC_RGBA8_sRGB*/ }, // ETC2A
+ { MTLPixelFormat(182) /*ETC2_RGB8A1*/, MTLPixelFormat(183) /*ETC2_RGB8A1_sRGB*/ }, // ETC2A1
+ { MTLPixelFormat(160) /*PVRTC_RGB_2BPP*/, MTLPixelFormat(161) /*PVRTC_RGB_2BPP_sRGB*/ }, // PTC12
+ { MTLPixelFormat(162) /*PVRTC_RGB_4BPP*/, MTLPixelFormat(163) /*PVRTC_RGB_4BPP_sRGB*/ }, // PTC14
+ { MTLPixelFormat(164) /*PVRTC_RGBA_2BPP*/, MTLPixelFormat(165) /*PVRTC_RGBA_2BPP_sRGB*/ }, // PTC12A
+ { MTLPixelFormat(166) /*PVRTC_RGBA_4BPP*/, MTLPixelFormat(167) /*PVRTC_RGBA_4BPP_sRGB*/ }, // PTC14A
+ { MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // PTC22
+ { MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // PTC24
+ { MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // Unknown
+ { MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // R1
+ { MTLPixelFormatA8Unorm, MTLPixelFormatInvalid }, // A8
+ { MTLPixelFormatR8Unorm, MTLPixelFormat(11) /*R8Unorm_sRGB*/ }, // R8
+ { MTLPixelFormatR8Sint, MTLPixelFormatInvalid }, // R8I
+ { MTLPixelFormatR8Uint, MTLPixelFormatInvalid }, // R8U
+ { MTLPixelFormatR8Snorm, MTLPixelFormatInvalid }, // R8S
+ { MTLPixelFormatR16Unorm, MTLPixelFormatInvalid }, // R16
+ { MTLPixelFormatR16Sint, MTLPixelFormatInvalid }, // R16I
+ { MTLPixelFormatR16Uint, MTLPixelFormatInvalid }, // R16U
+ { MTLPixelFormatR16Float, MTLPixelFormatInvalid }, // R16F
+ { MTLPixelFormatR16Snorm, MTLPixelFormatInvalid }, // R16S
+ { MTLPixelFormatR32Sint, MTLPixelFormatInvalid }, // R32I
+ { MTLPixelFormatR32Uint, MTLPixelFormatInvalid }, // R32U
+ { MTLPixelFormatR32Float, MTLPixelFormatInvalid }, // R32F
+ { MTLPixelFormatRG8Unorm, MTLPixelFormat(31) /*RG8Unorm_sRGB*/ }, // RG8
+ { MTLPixelFormatRG8Sint, MTLPixelFormatInvalid }, // RG8I
+ { MTLPixelFormatRG8Uint, MTLPixelFormatInvalid }, // RG8U
+ { MTLPixelFormatRG8Snorm, MTLPixelFormatInvalid }, // RG8S
+ { MTLPixelFormatRG16Unorm, MTLPixelFormatInvalid }, // RG16
+ { MTLPixelFormatRG16Sint, MTLPixelFormatInvalid }, // RG16I
+ { MTLPixelFormatRG16Uint, MTLPixelFormatInvalid }, // RG16U
+ { MTLPixelFormatRG16Float, MTLPixelFormatInvalid }, // RG16F
+ { MTLPixelFormatRG16Snorm, MTLPixelFormatInvalid }, // RG16S
+ { MTLPixelFormatRG32Sint, MTLPixelFormatInvalid }, // RG32I
+ { MTLPixelFormatRG32Uint, MTLPixelFormatInvalid }, // RG32U
+ { MTLPixelFormatRG32Float, MTLPixelFormatInvalid }, // RG32F
+ { MTLPixelFormatRGB9E5Float, MTLPixelFormatInvalid }, // RGB9E5F
+ { MTLPixelFormatBGRA8Unorm, MTLPixelFormatBGRA8Unorm_sRGB }, // BGRA8
+ { MTLPixelFormatRGBA8Unorm, MTLPixelFormatRGBA8Unorm_sRGB }, // RGBA8
+ { MTLPixelFormatRGBA8Sint, MTLPixelFormatInvalid }, // RGBA8I
+ { MTLPixelFormatRGBA8Uint, MTLPixelFormatInvalid }, // RGBA8U
+ { MTLPixelFormatRGBA8Snorm, MTLPixelFormatInvalid }, // RGBA8S
+ { MTLPixelFormatRGBA16Unorm, MTLPixelFormatInvalid }, // RGBA16
+ { MTLPixelFormatRGBA16Sint, MTLPixelFormatInvalid }, // RGBA16I
+ { MTLPixelFormatRGBA16Uint, MTLPixelFormatInvalid }, // RGBA16I
+ { MTLPixelFormatRGBA16Float, MTLPixelFormatInvalid }, // RGBA16F
+ { MTLPixelFormatRGBA16Snorm, MTLPixelFormatInvalid }, // RGBA16S
+ { MTLPixelFormatRGBA32Sint, MTLPixelFormatInvalid }, // RGBA32I
+ { MTLPixelFormatRGBA32Uint, MTLPixelFormatInvalid }, // RGBA32U
+ { MTLPixelFormatRGBA32Float, MTLPixelFormatInvalid }, // RGBA32F
+ { MTLPixelFormat(40) /*B5G6R5Unorm*/, MTLPixelFormatInvalid }, // R5G6B5
+ { MTLPixelFormat(42) /*ABGR4Unorm*/, MTLPixelFormatInvalid }, // RGBA4
+ { MTLPixelFormat(41) /*A1BGR5Unorm*/, MTLPixelFormatInvalid }, // RGB5A1
+ { MTLPixelFormatRGB10A2Unorm, MTLPixelFormatInvalid }, // RGB10A2
+ { MTLPixelFormatRG11B10Float, MTLPixelFormatInvalid }, // R11G11B10F
+ { MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // UnknownDepth
+ { MTLPixelFormatDepth32Float, MTLPixelFormatInvalid }, // D16
+ { MTLPixelFormatDepth32Float, MTLPixelFormatInvalid }, // D24
+ { MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // D24S8
+ { MTLPixelFormatDepth32Float, MTLPixelFormatInvalid }, // D32
+ { MTLPixelFormatDepth32Float, MTLPixelFormatInvalid }, // D16F
+ { MTLPixelFormatDepth32Float, MTLPixelFormatInvalid }, // D24F
+ { MTLPixelFormatDepth32Float, MTLPixelFormatInvalid }, // D32F
+ { MTLPixelFormatStencil8, MTLPixelFormatInvalid }, // D0S8
};
BX_STATIC_ASSERT(TextureFormat::Count == BX_COUNTOF(s_textureFormat) );
@@ -328,6 +329,7 @@ namespace bgfx { namespace mtl
: m_metalLayer(NULL)
, m_backBufferPixelFormatHash(0)
, m_maxAnisotropy(1)
+ , m_uniformBufferIndex(0)
, m_numWindows(1)
, m_rtMsaa(false)
, m_drawable(NULL)
@@ -348,23 +350,25 @@ namespace bgfx { namespace mtl
if (NULL != NSClassFromString(@"CAMetalLayer") )
{
- //on iOS we need the layer as CAmetalLayer
#if BX_PLATFORM_IOS
- CAMetalLayer* metalLayer = (CAMetalLayer*)g_platformData.nwh;
- if (NULL == metalLayer
- || ![metalLayer isKindOfClass:NSClassFromString(@"CAMetalLayer")])
{
- BX_WARN(NULL != m_device, "Unable to create Metal device. Please set platform data window to a CAMetalLayer");
- return false;
+ CAMetalLayer* metalLayer = (CAMetalLayer*)g_platformData.nwh;
+ if (NULL == metalLayer
+ || ![metalLayer isKindOfClass:NSClassFromString(@"CAMetalLayer")])
+ {
+ BX_WARN(NULL != m_device, "Unable to create Metal device. Please set platform data window to a CAMetalLayer");
+ return false;
+ }
+
+ m_metalLayer = metalLayer;
}
- m_metalLayer = metalLayer;
#elif BX_PLATFORM_OSX
- // create and set metalLayer
- NSWindow* nsWindow = (NSWindow*)g_platformData.nwh;
-
- [nsWindow.contentView setWantsLayer:YES];
- m_metalLayer = [CAMetalLayer layer];
- [nsWindow.contentView setLayer:m_metalLayer];
+ {
+ NSWindow* nsWindow = (NSWindow*)g_platformData.nwh;
+ [nsWindow.contentView setWantsLayer:YES];
+ m_metalLayer = [CAMetalLayer layer];
+ [nsWindow.contentView setLayer:m_metalLayer];
+ }
#endif // BX_PLATFORM_*
m_device = (id<MTLDevice>)g_platformData.context;
@@ -396,13 +400,16 @@ namespace bgfx { namespace mtl
m_textureDescriptor = newTextureDescriptor();
m_samplerDescriptor = newSamplerDescriptor();
- m_uniformBuffer = m_device.newBufferWithLength(UNIFORM_BUFFER_SIZE, 0);
+ for (uint8_t i=0; i < UNIFORM_BUFFER_COUNT; ++i)
+ {
+ m_uniformBuffers[i] = m_device.newBufferWithLength(UNIFORM_BUFFER_SIZE, 0);
+ }
m_uniformBufferVertexOffset = 0;
m_uniformBufferFragmentOffset = 0;
g_caps.supported |= (0
- | BGFX_CAPS_TEXTURE_COMPARE_LEQUAL
| BGFX_CAPS_TEXTURE_3D
+ | BGFX_CAPS_TEXTURE_COMPARE_LEQUAL
| BGFX_CAPS_INSTANCING
| BGFX_CAPS_VERTEX_ATTRIB_HALF
// | BGFX_CAPS_FRAGMENT_DEPTH
@@ -410,6 +417,9 @@ namespace bgfx { namespace mtl
| BGFX_CAPS_COMPUTE
| BGFX_CAPS_INDEX32
| BGFX_CAPS_DRAW_INDIRECT
+// | BGFX_CAPS_TEXTURE_BLIT
+// | BGFX_CAPS_TEXTURE_READ_BACK
+ | BGFX_CAPS_OCCLUSION_QUERY
);
g_caps.maxTextureSize = 2048; //ASK: real caps width/height: 4096, but max depth(3D) size is only: 2048
@@ -483,570 +493,564 @@ namespace bgfx { namespace mtl
bx::snprintf(s_viewName[ii], BGFX_CONFIG_MAX_VIEW_NAME_RESERVED+1, "%3d ", ii);
}
- return true;
- }
+ m_occlusionQuery.preReset();
- void shutdown()
- {
- for (uint32_t ii = 0; ii < BX_COUNTOF(m_shaders); ++ii)
- {
- m_shaders[ii].destroy();
+ return true;
}
- for (uint32_t ii = 0; ii < BX_COUNTOF(m_textures); ++ii)
+ void shutdown()
{
- m_textures[ii].destroy();
- }
-
- MTL_RELEASE(m_depthStencilDescriptor);
- MTL_RELEASE(m_frontFaceStencilDescriptor);
- MTL_RELEASE(m_backFaceStencilDescriptor);
- MTL_RELEASE(m_renderPipelineDescriptor);
- MTL_RELEASE(m_vertexDescriptor);
- MTL_RELEASE(m_textureDescriptor);
- MTL_RELEASE(m_samplerDescriptor);
-
- MTL_RELEASE(m_backBufferDepth);
-#if BX_PLATFORM_IOS
- MTL_RELEASE(m_backBufferStencil);
-#endif // BX_PLATFORM_*
-
- MTL_RELEASE(m_uniformBuffer);
- MTL_RELEASE(m_commandQueue);
- MTL_RELEASE(m_device);
- }
-
- RendererType::Enum getRendererType() const BX_OVERRIDE
- {
- return RendererType::Metal;
- }
-
- const char* getRendererName() const BX_OVERRIDE
- {
- return BGFX_RENDERER_METAL_NAME;
- }
-
- void createIndexBuffer(IndexBufferHandle _handle, Memory* _mem, uint16_t _flags) BX_OVERRIDE
- {
- m_indexBuffers[_handle.idx].create(_mem->size, _mem->data, _flags);
- }
-
- void destroyIndexBuffer(IndexBufferHandle _handle) BX_OVERRIDE
- {
- m_indexBuffers[_handle.idx].destroy();
- }
-
- void createVertexDecl(VertexDeclHandle _handle, const VertexDecl& _decl) BX_OVERRIDE
- {
- VertexDecl& decl = m_vertexDecls[_handle.idx];
- memcpy(&decl, &_decl, sizeof(VertexDecl) );
- dump(decl);
- }
-
- void destroyVertexDecl(VertexDeclHandle /*_handle*/) BX_OVERRIDE
- {
- }
-
- void createVertexBuffer(VertexBufferHandle _handle, Memory* _mem, VertexDeclHandle _declHandle, uint16_t _flags) BX_OVERRIDE
- {
- m_vertexBuffers[_handle.idx].create(_mem->size, _mem->data, _declHandle, _flags);
- }
-
- void destroyVertexBuffer(VertexBufferHandle _handle) BX_OVERRIDE
- {
- m_vertexBuffers[_handle.idx].destroy();
- }
+ m_occlusionQuery.postReset();
- void createDynamicIndexBuffer(IndexBufferHandle _handle, uint32_t _size, uint16_t _flags) BX_OVERRIDE
- {
- m_indexBuffers[_handle.idx].create(_size, NULL, _flags);
- }
+ for (uint32_t ii = 0; ii < BX_COUNTOF(m_shaders); ++ii)
+ {
+ m_shaders[ii].destroy();
+ }
- void updateDynamicIndexBuffer(IndexBufferHandle _handle, uint32_t _offset, uint32_t _size, Memory* _mem) BX_OVERRIDE
- {
- m_indexBuffers[_handle.idx].update(_offset, bx::uint32_min(_size, _mem->size), _mem->data);
- }
+ for (uint32_t ii = 0; ii < BX_COUNTOF(m_textures); ++ii)
+ {
+ m_textures[ii].destroy();
+ }
- void destroyDynamicIndexBuffer(IndexBufferHandle _handle) BX_OVERRIDE
- {
- m_indexBuffers[_handle.idx].destroy();
- }
+ MTL_RELEASE(m_depthStencilDescriptor);
+ MTL_RELEASE(m_frontFaceStencilDescriptor);
+ MTL_RELEASE(m_backFaceStencilDescriptor);
+ MTL_RELEASE(m_renderPipelineDescriptor);
+ MTL_RELEASE(m_vertexDescriptor);
+ MTL_RELEASE(m_textureDescriptor);
+ MTL_RELEASE(m_samplerDescriptor);
- void createDynamicVertexBuffer(VertexBufferHandle _handle, uint32_t _size, uint16_t _flags) BX_OVERRIDE
- {
- VertexDeclHandle decl = BGFX_INVALID_HANDLE;
- m_vertexBuffers[_handle.idx].create(_size, NULL, decl, _flags);
- }
+ MTL_RELEASE(m_backBufferDepth);
+ if (BX_ENABLED(BX_PLATFORM_IOS) )
+ {
+ MTL_RELEASE(m_backBufferStencil);
+ }
- void updateDynamicVertexBuffer(VertexBufferHandle _handle, uint32_t _offset, uint32_t _size, Memory* _mem) BX_OVERRIDE
- {
- m_vertexBuffers[_handle.idx].update(_offset, bx::uint32_min(_size, _mem->size), _mem->data);
- }
+ for (uint8_t i=0; i < UNIFORM_BUFFER_COUNT; ++i)
+ {
+ MTL_RELEASE(m_uniformBuffers[i]);
+ }
+ MTL_RELEASE(m_commandQueue);
+ MTL_RELEASE(m_device);
+ }
- void destroyDynamicVertexBuffer(VertexBufferHandle _handle) BX_OVERRIDE
- {
- m_vertexBuffers[_handle.idx].destroy();
- }
+ RendererType::Enum getRendererType() const BX_OVERRIDE
+ {
+ return RendererType::Metal;
+ }
- void createShader(ShaderHandle _handle, Memory* _mem) BX_OVERRIDE
- {
- m_shaders[_handle.idx].create(_mem);
- }
+ const char* getRendererName() const BX_OVERRIDE
+ {
+ return BGFX_RENDERER_METAL_NAME;
+ }
- void destroyShader(ShaderHandle _handle) BX_OVERRIDE
- {
- m_shaders[_handle.idx].destroy();
- }
+ void createIndexBuffer(IndexBufferHandle _handle, Memory* _mem, uint16_t _flags) BX_OVERRIDE
+ {
+ m_indexBuffers[_handle.idx].create(_mem->size, _mem->data, _flags);
+ }
- void createProgram(ProgramHandle _handle, ShaderHandle _vsh, ShaderHandle _fsh) BX_OVERRIDE
- {
- m_program[_handle.idx].create(&m_shaders[_vsh.idx], &m_shaders[_fsh.idx]);
- }
+ void destroyIndexBuffer(IndexBufferHandle _handle) BX_OVERRIDE
+ {
+ m_indexBuffers[_handle.idx].destroy();
+ }
- void destroyProgram(ProgramHandle _handle) BX_OVERRIDE
- {
- m_program[_handle.idx].destroy();
- }
+ void createVertexDecl(VertexDeclHandle _handle, const VertexDecl& _decl) BX_OVERRIDE
+ {
+ VertexDecl& decl = m_vertexDecls[_handle.idx];
+ memcpy(&decl, &_decl, sizeof(VertexDecl) );
+ dump(decl);
+ }
- void createTexture(TextureHandle _handle, Memory* _mem, uint32_t _flags, uint8_t _skip) BX_OVERRIDE
- {
- m_textures[_handle.idx].create(_mem, _flags, _skip);
- }
+ void destroyVertexDecl(VertexDeclHandle /*_handle*/) BX_OVERRIDE
+ {
+ }
- void updateTextureBegin(TextureHandle /*_handle*/, uint8_t /*_side*/, uint8_t /*_mip*/) BX_OVERRIDE
- {
- }
+ void createVertexBuffer(VertexBufferHandle _handle, Memory* _mem, VertexDeclHandle _declHandle, uint16_t _flags) BX_OVERRIDE
+ {
+ m_vertexBuffers[_handle.idx].create(_mem->size, _mem->data, _declHandle, _flags);
+ }
- void updateTexture(TextureHandle _handle, uint8_t _side, uint8_t _mip, const Rect& _rect, uint16_t _z, uint16_t _depth, uint16_t _pitch, const Memory* _mem) BX_OVERRIDE
- {
- m_textures[_handle.idx].update(_side, _mip, _rect, _z, _depth, _pitch, _mem);
- }
+ void destroyVertexBuffer(VertexBufferHandle _handle) BX_OVERRIDE
+ {
+ m_vertexBuffers[_handle.idx].destroy();
+ }
- void updateTextureEnd() BX_OVERRIDE
- {
- }
+ void createDynamicIndexBuffer(IndexBufferHandle _handle, uint32_t _size, uint16_t _flags) BX_OVERRIDE
+ {
+ m_indexBuffers[_handle.idx].create(_size, NULL, _flags);
+ }
- void readTexture(TextureHandle /*_handle*/, void* /*_data*/) BX_OVERRIDE
- {
- }
+ void updateDynamicIndexBuffer(IndexBufferHandle _handle, uint32_t _offset, uint32_t _size, Memory* _mem) BX_OVERRIDE
+ {
+ m_indexBuffers[_handle.idx].update(_offset, bx::uint32_min(_size, _mem->size), _mem->data);
+ }
- void resizeTexture(TextureHandle _handle, uint16_t _width, uint16_t _height) BX_OVERRIDE
- {
- TextureMtl& texture = m_textures[_handle.idx];
-
- uint32_t size = sizeof(uint32_t) + sizeof(TextureCreate);
- const Memory* mem = alloc(size);
-
- bx::StaticMemoryBlockWriter writer(mem->data, mem->size);
- uint32_t magic = BGFX_CHUNK_MAGIC_TEX;
- bx::write(&writer, magic);
-
- TextureCreate tc;
- tc.m_flags = texture.m_flags;
- tc.m_width = _width;
- tc.m_height = _height;
- tc.m_sides = 0;
- tc.m_depth = 0;
- tc.m_numMips = 1;
- tc.m_format = texture.m_requestedFormat;
- tc.m_cubeMap = false;
- tc.m_mem = NULL;
- bx::write(&writer, tc);
-
- texture.destroy();
- texture.create(mem, tc.m_flags, 0);
-
- release(mem);
- }
+ void destroyDynamicIndexBuffer(IndexBufferHandle _handle) BX_OVERRIDE
+ {
+ m_indexBuffers[_handle.idx].destroy();
+ }
- void destroyTexture(TextureHandle _handle) BX_OVERRIDE
- {
- m_textures[_handle.idx].destroy();
- }
+ void createDynamicVertexBuffer(VertexBufferHandle _handle, uint32_t _size, uint16_t _flags) BX_OVERRIDE
+ {
+ VertexDeclHandle decl = BGFX_INVALID_HANDLE;
+ m_vertexBuffers[_handle.idx].create(_size, NULL, decl, _flags);
+ }
- void createFrameBuffer(FrameBufferHandle _handle, uint8_t _num, const TextureHandle* _textureHandles) BX_OVERRIDE
- {
- m_frameBuffers[_handle.idx].create(_num, _textureHandles);
- }
+ void updateDynamicVertexBuffer(VertexBufferHandle _handle, uint32_t _offset, uint32_t _size, Memory* _mem) BX_OVERRIDE
+ {
+ m_vertexBuffers[_handle.idx].update(_offset, bx::uint32_min(_size, _mem->size), _mem->data);
+ }
- void createFrameBuffer(FrameBufferHandle _handle, void* _nwh, uint32_t _width, uint32_t _height, TextureFormat::Enum _depthFormat) BX_OVERRIDE
- {
- uint16_t denseIdx = m_numWindows++;
- m_windows[denseIdx] = _handle;
- m_frameBuffers[_handle.idx].create(denseIdx, _nwh, _width, _height, _depthFormat);
- }
+ void destroyDynamicVertexBuffer(VertexBufferHandle _handle) BX_OVERRIDE
+ {
+ m_vertexBuffers[_handle.idx].destroy();
+ }
- void destroyFrameBuffer(FrameBufferHandle _handle) BX_OVERRIDE
- {
- uint16_t denseIdx = m_frameBuffers[_handle.idx].destroy();
- if (UINT16_MAX != denseIdx)
+ void createShader(ShaderHandle _handle, Memory* _mem) BX_OVERRIDE
{
- --m_numWindows;
- if (m_numWindows > 1)
- {
- FrameBufferHandle handle = m_windows[m_numWindows];
- m_windows[denseIdx] = handle;
- m_frameBuffers[handle.idx].m_denseIdx = denseIdx;
- }
+ m_shaders[_handle.idx].create(_mem);
}
- }
- void createUniform(UniformHandle _handle, UniformType::Enum _type, uint16_t _num, const char* _name) BX_OVERRIDE
- {
- if (NULL != m_uniforms[_handle.idx])
+ void destroyShader(ShaderHandle _handle) BX_OVERRIDE
{
- BX_FREE(g_allocator, m_uniforms[_handle.idx]);
+ m_shaders[_handle.idx].destroy();
}
- uint32_t size = BX_ALIGN_16(g_uniformTypeSize[_type]*_num);
- void* data = BX_ALLOC(g_allocator, size);
- memset(data, 0, size);
- m_uniforms[_handle.idx] = data;
- m_uniformReg.add(_handle, _name, data);
- }
+ void createProgram(ProgramHandle _handle, ShaderHandle _vsh, ShaderHandle _fsh) BX_OVERRIDE
+ {
+ m_program[_handle.idx].create(&m_shaders[_vsh.idx], &m_shaders[_fsh.idx]);
+ }
- void destroyUniform(UniformHandle _handle) BX_OVERRIDE
- {
- BX_FREE(g_allocator, m_uniforms[_handle.idx]);
- m_uniforms[_handle.idx] = NULL;
- }
+ void destroyProgram(ProgramHandle _handle) BX_OVERRIDE
+ {
+ m_program[_handle.idx].destroy();
+ }
- void saveScreenShot(const char* _filePath) BX_OVERRIDE
- {
- if (NULL == m_drawable
- || NULL == m_drawable.texture)
+ void createTexture(TextureHandle _handle, Memory* _mem, uint32_t _flags, uint8_t _skip) BX_OVERRIDE
{
- return;
+ m_textures[_handle.idx].create(_mem, _flags, _skip);
}
- //TODO: we should wait for completion of pending commandBuffers
- //TODO: implement this with saveScreenshotBegin/End
+ void updateTextureBegin(TextureHandle /*_handle*/, uint8_t /*_side*/, uint8_t /*_mip*/) BX_OVERRIDE
+ {
+ }
- Texture backBuffer = m_drawable.texture;
- uint32_t width = backBuffer.width();
- uint32_t height = backBuffer.height();
- uint32_t length = width*height*4;
- uint8_t* data = (uint8_t*)BX_ALLOC(g_allocator, length);
+ void updateTexture(TextureHandle _handle, uint8_t _side, uint8_t _mip, const Rect& _rect, uint16_t _z, uint16_t _depth, uint16_t _pitch, const Memory* _mem) BX_OVERRIDE
+ {
+ m_textures[_handle.idx].update(_side, _mip, _rect, _z, _depth, _pitch, _mem);
+ }
- MTLRegion region = { { 0, 0, 0 }, { width, height, 1 } };
+ void updateTextureEnd() BX_OVERRIDE
+ {
+ }
- backBuffer.getBytes(data, 4*width, 0, region, 0, 0);
+ void readTexture(TextureHandle /*_handle*/, void* /*_data*/) BX_OVERRIDE
+ {
+ }
- g_callback->screenShot(_filePath
- , backBuffer.width()
- , backBuffer.height()
- , width*4
- , data
- , length
- , false
- );
+ void resizeTexture(TextureHandle _handle, uint16_t _width, uint16_t _height) BX_OVERRIDE
+ {
+ TextureMtl& texture = m_textures[_handle.idx];
+
+ uint32_t size = sizeof(uint32_t) + sizeof(TextureCreate);
+ const Memory* mem = alloc(size);
+
+ bx::StaticMemoryBlockWriter writer(mem->data, mem->size);
+ uint32_t magic = BGFX_CHUNK_MAGIC_TEX;
+ bx::write(&writer, magic);
+
+ TextureCreate tc;
+ tc.m_flags = texture.m_flags;
+ tc.m_width = _width;
+ tc.m_height = _height;
+ tc.m_sides = 0;
+ tc.m_depth = 0;
+ tc.m_numMips = 1;
+ tc.m_format = texture.m_requestedFormat;
+ tc.m_cubeMap = false;
+ tc.m_mem = NULL;
+ bx::write(&writer, tc);
+
+ texture.destroy();
+ texture.create(mem, tc.m_flags, 0);
+
+ release(mem);
+ }
- BX_FREE(g_allocator, data);
- }
+ void destroyTexture(TextureHandle _handle) BX_OVERRIDE
+ {
+ m_textures[_handle.idx].destroy();
+ }
- void updateViewName(uint8_t _id, const char* _name) BX_OVERRIDE
- {
- if (BX_ENABLED(BGFX_CONFIG_DEBUG_PIX) )
+ void createFrameBuffer(FrameBufferHandle _handle, uint8_t _num, const TextureHandle* _textureHandles) BX_OVERRIDE
{
- bx::strlcpy(&s_viewName[_id][BGFX_CONFIG_MAX_VIEW_NAME_RESERVED]
- , _name
- , BX_COUNTOF(s_viewName[0])-BGFX_CONFIG_MAX_VIEW_NAME_RESERVED
- );
+ m_frameBuffers[_handle.idx].create(_num, _textureHandles);
}
- }
- void updateUniform(uint16_t _loc, const void* _data, uint32_t _size) BX_OVERRIDE
- {
- memcpy(m_uniforms[_loc], _data, _size);
- }
+ void createFrameBuffer(FrameBufferHandle _handle, void* _nwh, uint32_t _width, uint32_t _height, TextureFormat::Enum _depthFormat) BX_OVERRIDE
+ {
+ uint16_t denseIdx = m_numWindows++;
+ m_windows[denseIdx] = _handle;
+ m_frameBuffers[_handle.idx].create(denseIdx, _nwh, _width, _height, _depthFormat);
+ }
- void setMarker(const char* _marker, uint32_t /*_size*/) BX_OVERRIDE
- {
- if (BX_ENABLED(BGFX_CONFIG_DEBUG_MTL) )
+ void destroyFrameBuffer(FrameBufferHandle _handle) BX_OVERRIDE
{
- m_renderCommandEncoder.insertDebugSignpost(_marker);
+ uint16_t denseIdx = m_frameBuffers[_handle.idx].destroy();
+ if (UINT16_MAX != denseIdx)
+ {
+ --m_numWindows;
+ if (m_numWindows > 1)
+ {
+ FrameBufferHandle handle = m_windows[m_numWindows];
+ m_windows[denseIdx] = handle;
+ m_frameBuffers[handle.idx].m_denseIdx = denseIdx;
+ }
+ }
}
- }
- void submit(Frame* _render, ClearQuad& _clearQuad, TextVideoMemBlitter& _textVideoMemBlitter) BX_OVERRIDE;
+ void createUniform(UniformHandle _handle, UniformType::Enum _type, uint16_t _num, const char* _name) BX_OVERRIDE
+ {
+ if (NULL != m_uniforms[_handle.idx])
+ {
+ BX_FREE(g_allocator, m_uniforms[_handle.idx]);
+ }
- void blitSetup(TextVideoMemBlitter& _blitter) BX_OVERRIDE
- {
- RenderCommandEncoder rce = m_renderCommandEncoder;
+ uint32_t size = BX_ALIGN_16(g_uniformTypeSize[_type]*_num);
+ void* data = BX_ALLOC(g_allocator, size);
+ memset(data, 0, size);
+ m_uniforms[_handle.idx] = data;
+ m_uniformReg.add(_handle, _name, data);
+ }
- uint32_t width = getBufferWidth();
- uint32_t height = getBufferHeight();
+ void destroyUniform(UniformHandle _handle) BX_OVERRIDE
+ {
+ BX_FREE(g_allocator, m_uniforms[_handle.idx]);
+ m_uniforms[_handle.idx] = NULL;
+ }
- //if (m_ovr.isEnabled() )
- //{
- // m_ovr.getSize(width, height);
- //}
+ void saveScreenShot(const char* _filePath) BX_OVERRIDE
+ {
+ if (NULL == m_drawable
+ || NULL == m_drawable.texture)
+ {
+ return;
+ }
- FrameBufferHandle fbh = BGFX_INVALID_HANDLE;
- //TODO: change to default framebuffer - we need a new encoder for this!
- //setFrameBuffer(fbh, false);
+ //TODO: we should wait for completion of pending commandBuffers
+ //TODO: implement this with saveScreenshotBegin/End
- MTLViewport viewport = { 0.0f, 0.0f, (float)width, (float)height, 0.0f, 1.0f};
- rce.setViewport(viewport);
- MTLScissorRect rc = { 0,0,width,height };
- rce.setScissorRect(rc);
- rce.setCullMode(MTLCullModeNone);
+ Texture backBuffer = m_drawable.texture;
+ uint32_t width = backBuffer.width();
+ uint32_t height = backBuffer.height();
+ uint32_t length = width*height*4;
+ uint8_t* data = (uint8_t*)BX_ALLOC(g_allocator, length);
- uint64_t state = 0
- | BGFX_STATE_RGB_WRITE
- | BGFX_STATE_ALPHA_WRITE
- | BGFX_STATE_DEPTH_TEST_ALWAYS
- ;
+ MTLRegion region = { { 0, 0, 0 }, { width, height, 1 } };
- setDepthStencilState(state);
+ backBuffer.getBytes(data, 4*width, 0, region, 0, 0);
- ProgramMtl& program = m_program[_blitter.m_program.idx];
- RenderPipelineState pipelineState = program.getRenderPipelineState(state, 0, fbh, _blitter.m_vb->decl, 0);
- rce.setRenderPipelineState(pipelineState);
+ g_callback->screenShot(_filePath
+ , backBuffer.width()
+ , backBuffer.height()
+ , width*4
+ , data
+ , length
+ , false
+ );
- uint32_t vertexUniformBufferSize = program.m_vshConstantBufferSize;
- uint32_t fragmentUniformBufferSize = program.m_fshConstantBufferSize;
+ BX_FREE(g_allocator, data);
+ }
- if (vertexUniformBufferSize )
+ void updateViewName(uint8_t _id, const char* _name) BX_OVERRIDE
{
- m_uniformBufferVertexOffset = BX_ALIGN_MASK(m_uniformBufferVertexOffset, program.m_vshConstantBufferAlignmentMask);
- rce.setVertexBuffer(m_uniformBuffer, m_uniformBufferVertexOffset, 0);
+ if (BX_ENABLED(BGFX_CONFIG_DEBUG_PIX) )
+ {
+ bx::strlcpy(&s_viewName[_id][BGFX_CONFIG_MAX_VIEW_NAME_RESERVED]
+ , _name
+ , BX_COUNTOF(s_viewName[0])-BGFX_CONFIG_MAX_VIEW_NAME_RESERVED
+ );
+ }
}
- m_uniformBufferFragmentOffset = m_uniformBufferVertexOffset + vertexUniformBufferSize;
- if (fragmentUniformBufferSize )
+ void updateUniform(uint16_t _loc, const void* _data, uint32_t _size) BX_OVERRIDE
{
- m_uniformBufferFragmentOffset = BX_ALIGN_MASK(m_uniformBufferFragmentOffset, program.m_fshConstantBufferAlignmentMask);
- rce.setFragmentBuffer(m_uniformBuffer, m_uniformBufferFragmentOffset, 0);
+ memcpy(m_uniforms[_loc], _data, _size);
}
- VertexBufferMtl& vb = m_vertexBuffers[_blitter.m_vb->handle.idx];
- rce.setVertexBuffer(vb.m_buffer, 0, 1);
+ void setMarker(const char* _marker, uint32_t /*_size*/) BX_OVERRIDE
+ {
+ if (BX_ENABLED(BGFX_CONFIG_DEBUG_MTL) )
+ {
+ m_renderCommandEncoder.insertDebugSignpost(_marker);
+ }
+ }
- float proj[16];
- bx::mtxOrtho(proj, 0.0f, (float)width, (float)height, 0.0f, 0.0f, 1000.0f);
+ void submit(Frame* _render, ClearQuad& _clearQuad, TextVideoMemBlitter& _textVideoMemBlitter) BX_OVERRIDE;
- PredefinedUniform& predefined = program.m_predefined[0];
- uint8_t flags = predefined.m_type;
- setShaderUniform(flags, predefined.m_loc, proj, 4);
+ void blitSetup(TextVideoMemBlitter& _blitter) BX_OVERRIDE
+ {
+ RenderCommandEncoder rce = m_renderCommandEncoder;
+
+ uint32_t width = getBufferWidth();
+ uint32_t height = getBufferHeight();
+
+ //if (m_ovr.isEnabled() )
+ //{
+ // m_ovr.getSize(width, height);
+ //}
+
+ FrameBufferHandle fbh = BGFX_INVALID_HANDLE;
+ //TODO: change to default framebuffer - we need a new encoder for this!
+ //setFrameBuffer(fbh, false);
+
+ MTLViewport viewport = { 0.0f, 0.0f, (float)width, (float)height, 0.0f, 1.0f};
+ rce.setViewport(viewport);
+ MTLScissorRect rc = { 0,0,width,height };
+ rce.setScissorRect(rc);
+ rce.setCullMode(MTLCullModeNone);
+
+ uint64_t state = 0
+ | BGFX_STATE_RGB_WRITE
+ | BGFX_STATE_ALPHA_WRITE
+ | BGFX_STATE_DEPTH_TEST_ALWAYS
+ ;
- m_textures[_blitter.m_texture.idx].commit(0);
- }
+ setDepthStencilState(state);
- void blitRender(TextVideoMemBlitter& _blitter, uint32_t _numIndices) BX_OVERRIDE
- {
- const uint32_t numVertices = _numIndices*4/6;
- if (0 < numVertices)
- {
- m_indexBuffers [_blitter.m_ib->handle.idx].update(0, _numIndices*2, _blitter.m_ib->data);
- m_vertexBuffers[_blitter.m_vb->handle.idx].update(0, numVertices*_blitter.m_decl.m_stride, _blitter.m_vb->data, true);
+ ProgramMtl& program = m_program[_blitter.m_program.idx];
+ RenderPipelineState pipelineState = program.getRenderPipelineState(state, 0, fbh, _blitter.m_vb->decl, 0);
+ rce.setRenderPipelineState(pipelineState);
- m_renderCommandEncoder.drawIndexedPrimitives(MTLPrimitiveTypeTriangle, _numIndices, MTLIndexTypeUInt16, m_indexBuffers[_blitter.m_ib->handle.idx].m_buffer, 0, 1);
- }
- }
+ uint32_t vertexUniformBufferSize = program.m_vshConstantBufferSize;
+ uint32_t fragmentUniformBufferSize = program.m_fshConstantBufferSize;
- void flip(HMD& /*_hmd*/) BX_OVERRIDE
- {
- if (NULL == m_drawable
- || NULL == m_commandBuffer)
- {
- return;
- }
+ if (vertexUniformBufferSize )
+ {
+ m_uniformBufferVertexOffset = BX_ALIGN_MASK(m_uniformBufferVertexOffset, program.m_vshConstantBufferAlignmentMask);
+ rce.setVertexBuffer(m_uniformBuffer, m_uniformBufferVertexOffset, 0);
+ }
+
+ m_uniformBufferFragmentOffset = m_uniformBufferVertexOffset + vertexUniformBufferSize;
+ if (fragmentUniformBufferSize )
+ {
+ m_uniformBufferFragmentOffset = BX_ALIGN_MASK(m_uniformBufferFragmentOffset, program.m_fshConstantBufferAlignmentMask);
+ rce.setFragmentBuffer(m_uniformBuffer, m_uniformBufferFragmentOffset, 0);
+ }
- // Present and commit the command buffer
- m_commandBuffer.presentDrawable(m_drawable);
- MTL_RELEASE(m_drawable);
+ VertexBufferMtl& vb = m_vertexBuffers[_blitter.m_vb->handle.idx];
+ rce.setVertexBuffer(vb.m_buffer, 0, 1);
- m_commandBuffer.commit();
+ float proj[16];
+ bx::mtxOrtho(proj, 0.0f, (float)width, (float)height, 0.0f, 0.0f, 1000.0f);
- // using heavy syncing now
- // TODO: refactor it with double/triple buffering frame data
- m_commandBuffer.waitUntilCompleted();
+ PredefinedUniform& predefined = program.m_predefined[0];
+ uint8_t flags = predefined.m_type;
+ setShaderUniform(flags, predefined.m_loc, proj, 4);
- MTL_RELEASE(m_commandBuffer);
+ m_textures[_blitter.m_texture.idx].commit(0);
+ }
- //TODO: support multiple windows on OSX
- /*
- if (m_flip)
- {
- for (uint32_t ii = 1, num = m_numWindows; ii < num; ++ii)
+ void blitRender(TextVideoMemBlitter& _blitter, uint32_t _numIndices) BX_OVERRIDE
+ {
+ const uint32_t numVertices = _numIndices*4/6;
+ if (0 < numVertices)
{
- m_glctx.swap(m_frameBuffers[m_windows[ii].idx].m_swapChain);
+ m_indexBuffers [_blitter.m_ib->handle.idx].update(0, _numIndices*2, _blitter.m_ib->data);
+ m_vertexBuffers[_blitter.m_vb->handle.idx].update(0, numVertices*_blitter.m_decl.m_stride, _blitter.m_vb->data, true);
+
+ m_renderCommandEncoder.drawIndexedPrimitives(MTLPrimitiveTypeTriangle, _numIndices, MTLIndexTypeUInt16, m_indexBuffers[_blitter.m_ib->handle.idx].m_buffer, 0, 1);
}
+ }
- if (!m_ovr.swap(_hmd) )
+ void flip(HMD& /*_hmd*/) BX_OVERRIDE
+ {
+ if (NULL == m_drawable
+ || NULL == m_commandBuffer)
{
- m_glctx.swap();
+ return;
}
- }
- */
- }
- void updateResolution(const Resolution& _resolution)
- {
- m_maxAnisotropy = !!(_resolution.m_flags & BGFX_RESET_MAXANISOTROPY)
- ? 16
- : 1
- ;
+ // Present and commit the command buffer
+ m_commandBuffer.presentDrawable(m_drawable);
+ MTL_RELEASE(m_drawable);
- //TODO: _resolution has wrong dimensions, using m_drawable.texture size now
- if (NULL == m_drawable.texture)
- {
- return;
- }
+ m_commandBuffer.commit();
- uint32_t width = (uint32_t)m_drawable.texture.width;
- uint32_t height = (uint32_t)m_drawable.texture.height;
+ // using heavy syncing now
+ // TODO: refactor it with double/triple buffering frame data
+ m_commandBuffer.waitUntilCompleted();
- //TODO: there should be a way to specify if backbuffer needs stencil/depth.
- //TODO: support msaa
- if (NULL == m_backBufferDepth
- || width != m_backBufferDepth.width()
- || height != m_backBufferDepth.height()
- || m_resolution.m_width != _resolution.m_width
- || m_resolution.m_height != _resolution.m_height
- || m_resolution.m_flags != _resolution.m_flags)
- {
- m_resolution = _resolution;
- m_resolution.m_flags &= ~BGFX_RESET_FORCE;
+ MTL_RELEASE(m_commandBuffer);
- m_textureDescriptor.textureType = MTLTextureType2D;
+ //TODO: support multiple windows on OSX
+ /*
+ if (m_flip)
+ {
+ for (uint32_t ii = 1, num = m_numWindows; ii < num; ++ii)
+ {
+ m_glctx.swap(m_frameBuffers[m_windows[ii].idx].m_swapChain);
+ }
- m_textureDescriptor.pixelFormat = MTLPixelFormatDepth32Float_Stencil8;
+ if (!m_ovr.swap(_hmd) )
+ {
+ m_glctx.swap();
+ }
+ }
+ */
+ }
- m_textureDescriptor.width = width;
- m_textureDescriptor.height = height;
- m_textureDescriptor.depth = 1;
- m_textureDescriptor.mipmapLevelCount = 1;
- m_textureDescriptor.sampleCount = 1;
- m_textureDescriptor.arrayLength = 1;
- m_textureDescriptor.resourceOptions = MTLResourceStorageModePrivate;
- m_textureDescriptor.cpuCacheMode = MTLCPUCacheModeDefaultCache;
- m_textureDescriptor.storageMode = MTLStorageModePrivate;
- m_textureDescriptor.usage = MTLTextureUsageRenderTarget;
+ void updateResolution(const Resolution& _resolution)
+ {
+ m_maxAnisotropy = !!(_resolution.m_flags & BGFX_RESET_MAXANISOTROPY)
+ ? 16
+ : 1
+ ;
- if (NULL != m_backBufferDepth)
+ //TODO: _resolution has wrong dimensions, using m_drawable.texture size now
+ if (NULL == m_drawable.texture)
{
- release(m_backBufferDepth);
+ return;
}
- m_backBufferDepth = m_device.newTextureWithDescriptor(m_textureDescriptor);
-#if 0
- m_textureDescriptor.pixelFormat = MTLPixelFormatStencil8;
-
- if (NULL != m_backBufferStencil)
+ uint32_t width = (uint32_t)m_drawable.texture.width;
+ uint32_t height = (uint32_t)m_drawable.texture.height;
+
+ //TODO: there should be a way to specify if backbuffer needs stencil/depth.
+ //TODO: support msaa
+ if (NULL == m_backBufferDepth
+ || width != m_backBufferDepth.width()
+ || height != m_backBufferDepth.height()
+ || m_resolution.m_width != _resolution.m_width
+ || m_resolution.m_height != _resolution.m_height
+ || m_resolution.m_flags != _resolution.m_flags)
{
- release(m_backBufferStencil);
- }
+ m_resolution = _resolution;
+ m_resolution.m_flags &= ~BGFX_RESET_INTERNAL_FORCE;
- m_backBufferStencil = m_device.newTextureWithDescriptor(m_textureDescriptor);
-#else
- m_backBufferStencil = m_backBufferDepth;
-#endif // 0
+ m_textureDescriptor.textureType = MTLTextureType2D;
- bx::HashMurmur2A murmur;
- murmur.begin();
- murmur.add(1);
- murmur.add((uint32_t)m_drawable.texture.pixelFormat);
- murmur.add((uint32_t)m_backBufferDepth.pixelFormat());
- murmur.add((uint32_t)m_backBufferStencil.pixelFormat());
- m_backBufferPixelFormatHash = murmur.end();
+ m_textureDescriptor.pixelFormat = MTLPixelFormatDepth32Float_Stencil8;
- for (uint32_t ii = 0; ii < BX_COUNTOF(m_frameBuffers); ++ii)
- {
- m_frameBuffers[ii].postReset();
- }
+ m_textureDescriptor.width = width;
+ m_textureDescriptor.height = height;
+ m_textureDescriptor.depth = 1;
+ m_textureDescriptor.mipmapLevelCount = 1;
+ m_textureDescriptor.sampleCount = 1;
+ m_textureDescriptor.arrayLength = 1;
+ m_textureDescriptor.resourceOptions = MTLResourceStorageModePrivate;
+ m_textureDescriptor.cpuCacheMode = MTLCPUCacheModeDefaultCache;
+ m_textureDescriptor.storageMode = MTLStorageModePrivate;
+ m_textureDescriptor.usage = MTLTextureUsageRenderTarget;
+
+ if (NULL != m_backBufferDepth)
+ {
+ release(m_backBufferDepth);
+ }
+ m_backBufferDepth = m_device.newTextureWithDescriptor(m_textureDescriptor);
+ m_backBufferStencil = m_backBufferDepth;
+
+ bx::HashMurmur2A murmur;
+ murmur.begin();
+ murmur.add(1);
+ murmur.add((uint32_t)m_drawable.texture.pixelFormat);
+ murmur.add((uint32_t)m_backBufferDepth.pixelFormat());
+ murmur.add((uint32_t)m_backBufferStencil.pixelFormat());
+ m_backBufferPixelFormatHash = murmur.end();
+
+ for (uint32_t ii = 0; ii < BX_COUNTOF(m_frameBuffers); ++ii)
+ {
+ m_frameBuffers[ii].postReset();
+ }
- m_textVideoMem.resize(false, width, height);
- m_textVideoMem.clear();
+ m_textVideoMem.resize(false, width, height);
+ m_textVideoMem.clear();
+ }
}
- }
- void setShaderUniform(uint8_t _flags, uint32_t _loc, const void* _val, uint32_t _numRegs)
- {
- if (_flags&BGFX_UNIFORM_FRAGMENTBIT)
+ void setShaderUniform(uint8_t _flags, uint32_t _loc, const void* _val, uint32_t _numRegs)
{
- memcpy(&((char*)m_uniformBuffer.contents())[m_uniformBufferFragmentOffset + _loc], _val, _numRegs*16);
+ uint32_t offset = 0 != (_flags&BGFX_UNIFORM_FRAGMENTBIT)
+ ? m_uniformBufferFragmentOffset
+ : m_uniformBufferVertexOffset
+ ;
+ uint8_t* dst = (uint8_t*)m_uniformBuffer.contents();
+ memcpy(&dst[offset + _loc], _val, _numRegs*16);
}
- else
+
+ void setShaderUniform4f(uint8_t _flags, uint32_t _loc, const void* _val, uint32_t _numRegs)
{
- memcpy(&((char*)m_uniformBuffer.contents())[m_uniformBufferVertexOffset + _loc], _val, _numRegs*16);
+ setShaderUniform(_flags, _loc, _val, _numRegs);
}
- }
- void setShaderUniform4f(uint8_t _flags, uint32_t _loc, const void* _val, uint32_t _numRegs)
- {
- setShaderUniform(_flags, _loc, _val, _numRegs);
- }
-
- void setShaderUniform4x4f(uint8_t _flags, uint32_t _loc, const void* _val, uint32_t _numRegs)
- {
- setShaderUniform(_flags, _loc, _val, _numRegs);
- }
-
- void commit(UniformBuffer& _uniformBuffer)
- {
- _uniformBuffer.reset();
+ void setShaderUniform4x4f(uint8_t _flags, uint32_t _loc, const void* _val, uint32_t _numRegs)
+ {
+ setShaderUniform(_flags, _loc, _val, _numRegs);
+ }
- for (;;)
+ void commit(UniformBuffer& _uniformBuffer)
{
- uint32_t opcode = _uniformBuffer.read();
+ _uniformBuffer.reset();
- if (UniformType::End == opcode)
+ for (;;)
{
- break;
- }
+ uint32_t opcode = _uniformBuffer.read();
- UniformType::Enum type;
- uint16_t loc;
- uint16_t num;
- uint16_t copy;
- UniformBuffer::decodeOpcode(opcode, type, loc, num, copy);
+ if (UniformType::End == opcode)
+ {
+ break;
+ }
- const char* data;
- if (copy)
- {
- data = _uniformBuffer.read(g_uniformTypeSize[type]*num);
- }
- else
- {
- UniformHandle handle;
- memcpy(&handle, _uniformBuffer.read(sizeof(UniformHandle) ), sizeof(UniformHandle) );
- data = (const char*)m_uniforms[handle.idx];
- }
+ UniformType::Enum type;
+ uint16_t loc;
+ uint16_t num;
+ uint16_t copy;
+ UniformBuffer::decodeOpcode(opcode, type, loc, num, copy);
+
+ const char* data;
+ if (copy)
+ {
+ data = _uniformBuffer.read(g_uniformTypeSize[type]*num);
+ }
+ else
+ {
+ UniformHandle handle;
+ memcpy(&handle, _uniformBuffer.read(sizeof(UniformHandle) ), sizeof(UniformHandle) );
+ data = (const char*)m_uniforms[handle.idx];
+ }
#define CASE_IMPLEMENT_UNIFORM(_uniform, _dxsuffix, _type) \
case UniformType::_uniform: \
case UniformType::_uniform|BGFX_UNIFORM_FRAGMENTBIT: \
{ \
- setShaderUniform(uint8_t(type), loc, data, num); \
+ setShaderUniform(uint8_t(type), loc, data, num); \
} \
break;
- switch ( (uint32_t)type)
- {
- case UniformType::Mat3:
- case UniformType::Mat3|BGFX_UNIFORM_FRAGMENTBIT: \
+ switch ( (uint32_t)type)
{
- float* value = (float*)data;
- for (uint32_t ii = 0, count = num/3; ii < count; ++ii, loc += 3*16, value += 9)
+ case UniformType::Mat3:
+ case UniformType::Mat3|BGFX_UNIFORM_FRAGMENTBIT:
{
- Matrix4 mtx;
- mtx.un.val[ 0] = value[0];
- mtx.un.val[ 1] = value[1];
- mtx.un.val[ 2] = value[2];
- mtx.un.val[ 3] = 0.0f;
- mtx.un.val[ 4] = value[3];
- mtx.un.val[ 5] = value[4];
- mtx.un.val[ 6] = value[5];
- mtx.un.val[ 7] = 0.0f;
- mtx.un.val[ 8] = value[6];
- mtx.un.val[ 9] = value[7];
- mtx.un.val[10] = value[8];
- mtx.un.val[11] = 0.0f;
- setShaderUniform(uint8_t(type), loc, &mtx.un.val[0], 3);
+ float* value = (float*)data;
+ for (uint32_t ii = 0, count = num/3; ii < count; ++ii, loc += 3*16, value += 9)
+ {
+ Matrix4 mtx;
+ mtx.un.val[ 0] = value[0];
+ mtx.un.val[ 1] = value[1];
+ mtx.un.val[ 2] = value[2];
+ mtx.un.val[ 3] = 0.0f;
+ mtx.un.val[ 4] = value[3];
+ mtx.un.val[ 5] = value[4];
+ mtx.un.val[ 6] = value[5];
+ mtx.un.val[ 7] = 0.0f;
+ mtx.un.val[ 8] = value[6];
+ mtx.un.val[ 9] = value[7];
+ mtx.un.val[10] = value[8];
+ mtx.un.val[11] = 0.0f;
+ setShaderUniform(uint8_t(type), loc, &mtx.un.val[0], 3);
+ }
}
- }
break;
CASE_IMPLEMENT_UNIFORM(Int1, I, int);
@@ -1059,203 +1063,217 @@ namespace bgfx { namespace mtl
default:
BX_TRACE("%4d: INVALID 0x%08x, t %d, l %d, n %d, c %d", _uniformBuffer.getPos(), opcode, type, loc, num, copy);
break;
- }
+ }
#undef CASE_IMPLEMENT_UNIFORM
+ }
}
- }
- void setFrameBuffer(mtl::RenderPassDescriptor renderPassDescriptor, FrameBufferHandle _fbh, bool _msaa = true)
- {
- if (!isValid(_fbh) )
+ void clearQuad(ClearQuad& _clearQuad, const Rect& _rect, const Clear& _clear, const float _palette[][4])
{
- renderPassDescriptor.colorAttachments[0].texture = m_drawable.texture;
- renderPassDescriptor.depthAttachment.texture = m_backBufferDepth;
- renderPassDescriptor.stencilAttachment.texture = m_backBufferStencil;
-
- //todo: set resolve textures
+ BX_UNUSED(_clearQuad, _rect, _clear, _palette);
}
- else
- {
- FrameBufferMtl& frameBuffer = m_frameBuffers[_fbh.idx];
- for (uint32_t ii = 0; ii < frameBuffer.m_num; ++ii)
+ void setFrameBuffer(RenderPassDescriptor renderPassDescriptor, FrameBufferHandle _fbh, bool _msaa = true)
+ {
+ if (!isValid(_fbh) )
{
- const TextureMtl& texture = m_textures[frameBuffer.m_colorHandle[ii].idx];
- renderPassDescriptor.colorAttachments[ii].texture = texture.m_ptr;
+ renderPassDescriptor.colorAttachments[0].texture = m_drawable.texture;
+ renderPassDescriptor.depthAttachment.texture = m_backBufferDepth;
+ renderPassDescriptor.stencilAttachment.texture = m_backBufferStencil;
}
-
- if (isValid(frameBuffer.m_depthHandle))
+ else
{
- const TextureMtl& texture = m_textures[frameBuffer.m_depthHandle.idx];
- renderPassDescriptor.depthAttachment.texture = texture.m_ptr;
- renderPassDescriptor.stencilAttachment.texture = texture.m_ptrStencil;
- //TODO: stencilAttachment should be the same if packed/depth stencil format is used
+ FrameBufferMtl& frameBuffer = m_frameBuffers[_fbh.idx];
+
+ for (uint32_t ii = 0; ii < frameBuffer.m_num; ++ii)
+ {
+ const TextureMtl& texture = m_textures[frameBuffer.m_colorHandle[ii].idx];
+ renderPassDescriptor.colorAttachments[ii].texture = texture.m_ptr;
+ }
+
+ if (isValid(frameBuffer.m_depthHandle) )
+ {
+ const TextureMtl& texture = m_textures[frameBuffer.m_depthHandle.idx];
+ renderPassDescriptor.depthAttachment.texture = texture.m_ptr;
+ renderPassDescriptor.stencilAttachment.texture = texture.m_ptrStencil;
+ //TODO: stencilAttachment should be the same if packed/depth stencil format is used
+ }
}
- //todo: set resolve textures
+ m_fbh = _fbh;
+ m_rtMsaa = _msaa;
}
- m_fbh = _fbh;
- m_rtMsaa = _msaa;
- }
-
- void setDepthStencilState(uint64_t _state, uint64_t _stencil = 0)
- {
- _state &= BGFX_STATE_DEPTH_WRITE|BGFX_STATE_DEPTH_TEST_MASK;
- uint32_t fstencil = unpackStencil(0, _stencil);
- uint32_t ref = (fstencil&BGFX_STENCIL_FUNC_REF_MASK)>>BGFX_STENCIL_FUNC_REF_SHIFT;
- _stencil &= packStencil(~BGFX_STENCIL_FUNC_REF_MASK, BGFX_STENCIL_MASK);
+ void setDepthStencilState(uint64_t _state, uint64_t _stencil = 0)
+ {
+ _state &= BGFX_STATE_DEPTH_WRITE|BGFX_STATE_DEPTH_TEST_MASK;
- bx::HashMurmur2A murmur;
- murmur.begin();
- murmur.add(_state);
- murmur.add(_stencil);
- uint32_t hash = murmur.end();
+ uint32_t fstencil = unpackStencil(0, _stencil);
+ uint32_t ref = (fstencil&BGFX_STENCIL_FUNC_REF_MASK)>>BGFX_STENCIL_FUNC_REF_SHIFT;
- DepthStencilState dss = m_depthStencilStateCache.find(hash);
- if (NULL == dss)
- {
- DepthStencilDescriptor desc = m_depthStencilDescriptor;
- uint32_t func = (_state&BGFX_STATE_DEPTH_TEST_MASK)>>BGFX_STATE_DEPTH_TEST_SHIFT;
- desc.depthWriteEnabled = !!(BGFX_STATE_DEPTH_WRITE & _state);
- desc.depthCompareFunction = s_cmpFunc[func];
+ _stencil &= packStencil(~BGFX_STENCIL_FUNC_REF_MASK, BGFX_STENCIL_MASK);
- uint32_t bstencil = unpackStencil(1, _stencil);
- uint32_t frontAndBack = bstencil != BGFX_STENCIL_NONE && bstencil != fstencil;
- bstencil = frontAndBack ? bstencil : fstencil;
+ bx::HashMurmur2A murmur;
+ murmur.begin();
+ murmur.add(_state);
+ murmur.add(_stencil);
+ uint32_t hash = murmur.end();
- if (0 != _stencil)
+ DepthStencilState dss = m_depthStencilStateCache.find(hash);
+ if (NULL == dss)
{
- StencilDescriptor frontFaceDesc = m_frontFaceStencilDescriptor;
- StencilDescriptor backfaceDesc = m_backFaceStencilDescriptor;
-
- uint32_t readMask = (fstencil&BGFX_STENCIL_FUNC_RMASK_MASK)>>BGFX_STENCIL_FUNC_RMASK_SHIFT;
- uint32_t writeMask = 0xff;
-
- frontFaceDesc.stencilFailureOperation = s_stencilOp[(fstencil&BGFX_STENCIL_OP_FAIL_S_MASK)>>BGFX_STENCIL_OP_FAIL_S_SHIFT];
- frontFaceDesc.depthFailureOperation = s_stencilOp[(fstencil&BGFX_STENCIL_OP_FAIL_Z_MASK)>>BGFX_STENCIL_OP_FAIL_Z_SHIFT];
- frontFaceDesc.depthStencilPassOperation = s_stencilOp[(fstencil&BGFX_STENCIL_OP_PASS_Z_MASK)>>BGFX_STENCIL_OP_PASS_Z_SHIFT];
- frontFaceDesc.stencilCompareFunction = s_cmpFunc[(fstencil&BGFX_STENCIL_TEST_MASK)>>BGFX_STENCIL_TEST_SHIFT];
- frontFaceDesc.readMask = readMask;
- frontFaceDesc.writeMask = writeMask;
-
- backfaceDesc.stencilFailureOperation = s_stencilOp[(bstencil&BGFX_STENCIL_OP_FAIL_S_MASK)>>BGFX_STENCIL_OP_FAIL_S_SHIFT];
- backfaceDesc.depthFailureOperation = s_stencilOp[(bstencil&BGFX_STENCIL_OP_FAIL_Z_MASK)>>BGFX_STENCIL_OP_FAIL_Z_SHIFT];
- backfaceDesc.depthStencilPassOperation = s_stencilOp[(bstencil&BGFX_STENCIL_OP_PASS_Z_MASK)>>BGFX_STENCIL_OP_PASS_Z_SHIFT];
- backfaceDesc.stencilCompareFunction = s_cmpFunc[(bstencil&BGFX_STENCIL_TEST_MASK)>>BGFX_STENCIL_TEST_SHIFT];
- backfaceDesc.readMask = readMask;
- backfaceDesc.writeMask = writeMask;
-
- desc.frontFaceStencil = frontFaceDesc;
- desc.backFaceStencil = backfaceDesc;
- }
- else
- {
- desc.backFaceStencil = NULL;
- desc.frontFaceStencil = NULL;
- }
+ DepthStencilDescriptor desc = m_depthStencilDescriptor;
+ uint32_t func = (_state&BGFX_STATE_DEPTH_TEST_MASK)>>BGFX_STATE_DEPTH_TEST_SHIFT;
+ desc.depthWriteEnabled = !!(BGFX_STATE_DEPTH_WRITE & _state);
+ desc.depthCompareFunction = s_cmpFunc[func];
- dss = m_device.newDepthStencilStateWithDescriptor(desc);
+ uint32_t bstencil = unpackStencil(1, _stencil);
+ uint32_t frontAndBack = bstencil != BGFX_STENCIL_NONE && bstencil != fstencil;
+ bstencil = frontAndBack ? bstencil : fstencil;
- m_depthStencilStateCache.add(hash, dss);
- }
+ if (0 != _stencil)
+ {
+ StencilDescriptor frontFaceDesc = m_frontFaceStencilDescriptor;
+ StencilDescriptor backfaceDesc = m_backFaceStencilDescriptor;
+
+ uint32_t readMask = (fstencil&BGFX_STENCIL_FUNC_RMASK_MASK)>>BGFX_STENCIL_FUNC_RMASK_SHIFT;
+ uint32_t writeMask = 0xff;
+
+ frontFaceDesc.stencilFailureOperation = s_stencilOp[(fstencil&BGFX_STENCIL_OP_FAIL_S_MASK)>>BGFX_STENCIL_OP_FAIL_S_SHIFT];
+ frontFaceDesc.depthFailureOperation = s_stencilOp[(fstencil&BGFX_STENCIL_OP_FAIL_Z_MASK)>>BGFX_STENCIL_OP_FAIL_Z_SHIFT];
+ frontFaceDesc.depthStencilPassOperation = s_stencilOp[(fstencil&BGFX_STENCIL_OP_PASS_Z_MASK)>>BGFX_STENCIL_OP_PASS_Z_SHIFT];
+ frontFaceDesc.stencilCompareFunction = s_cmpFunc[(fstencil&BGFX_STENCIL_TEST_MASK)>>BGFX_STENCIL_TEST_SHIFT];
+ frontFaceDesc.readMask = readMask;
+ frontFaceDesc.writeMask = writeMask;
+
+ backfaceDesc.stencilFailureOperation = s_stencilOp[(bstencil&BGFX_STENCIL_OP_FAIL_S_MASK)>>BGFX_STENCIL_OP_FAIL_S_SHIFT];
+ backfaceDesc.depthFailureOperation = s_stencilOp[(bstencil&BGFX_STENCIL_OP_FAIL_Z_MASK)>>BGFX_STENCIL_OP_FAIL_Z_SHIFT];
+ backfaceDesc.depthStencilPassOperation = s_stencilOp[(bstencil&BGFX_STENCIL_OP_PASS_Z_MASK)>>BGFX_STENCIL_OP_PASS_Z_SHIFT];
+ backfaceDesc.stencilCompareFunction = s_cmpFunc[(bstencil&BGFX_STENCIL_TEST_MASK)>>BGFX_STENCIL_TEST_SHIFT];
+ backfaceDesc.readMask = readMask;
+ backfaceDesc.writeMask = writeMask;
+
+ desc.frontFaceStencil = frontFaceDesc;
+ desc.backFaceStencil = backfaceDesc;
+ }
+ else
+ {
+ desc.backFaceStencil = NULL;
+ desc.frontFaceStencil = NULL;
+ }
- m_renderCommandEncoder.setDepthStencilState(dss);
- m_renderCommandEncoder.setStencilReferenceValue(ref);
- }
+ dss = m_device.newDepthStencilStateWithDescriptor(desc);
- SamplerState getSamplerState(uint32_t _flags)
- {
- _flags &= BGFX_TEXTURE_SAMPLER_BITS_MASK;
- SamplerState sampler = m_samplerStateCache.find(_flags);
- if (NULL == sampler)
+ m_depthStencilStateCache.add(hash, dss);
+ }
+
+ m_renderCommandEncoder.setDepthStencilState(dss);
+ m_renderCommandEncoder.setStencilReferenceValue(ref);
+ }
+
+ SamplerState getSamplerState(uint32_t _flags)
{
+ _flags &= BGFX_TEXTURE_SAMPLER_BITS_MASK;
+ SamplerState sampler = m_samplerStateCache.find(_flags);
- m_samplerDescriptor.sAddressMode = s_textureAddress[(_flags&BGFX_TEXTURE_U_MASK)>>BGFX_TEXTURE_U_SHIFT];
- m_samplerDescriptor.tAddressMode = s_textureAddress[(_flags&BGFX_TEXTURE_V_MASK)>>BGFX_TEXTURE_V_SHIFT];
- m_samplerDescriptor.rAddressMode = s_textureAddress[(_flags&BGFX_TEXTURE_W_MASK)>>BGFX_TEXTURE_W_SHIFT];
- m_samplerDescriptor.minFilter = s_textureFilterMinMag[(_flags&BGFX_TEXTURE_MIN_MASK)>>BGFX_TEXTURE_MIN_SHIFT];
- m_samplerDescriptor.magFilter = s_textureFilterMinMag[(_flags&BGFX_TEXTURE_MAG_MASK)>>BGFX_TEXTURE_MAG_SHIFT];
- m_samplerDescriptor.mipFilter = s_textureFilterMip[(_flags&BGFX_TEXTURE_MIP_MASK)>>BGFX_TEXTURE_MIP_SHIFT];
- m_samplerDescriptor.lodMinClamp = 0;
- m_samplerDescriptor.lodMaxClamp = FLT_MAX;
- m_samplerDescriptor.normalizedCoordinates = TRUE;
- m_samplerDescriptor.maxAnisotropy = m_maxAnisotropy;
+ if (NULL == sampler)
+ {
- //TODO: I haven't found how to specify this. Comparison function can be specified in shader.
- // On OSX this can be specified. There is no support for this on iOS right now.
- //const uint32_t cmpFunc = (_flags&BGFX_TEXTURE_COMPARE_MASK)>>BGFX_TEXTURE_COMPARE_SHIFT;
- //const uint8_t filter = 0 == cmpFunc ? 0 : D3D11_COMPARISON_FILTERING_BIT;
- //m_samplerDescriptor.comparisonFunc = 0 == cmpFunc ? D3D11_COMPARISON_NEVER : s_cmpFunc[cmpFunc];
+ m_samplerDescriptor.sAddressMode = s_textureAddress[(_flags&BGFX_TEXTURE_U_MASK)>>BGFX_TEXTURE_U_SHIFT];
+ m_samplerDescriptor.tAddressMode = s_textureAddress[(_flags&BGFX_TEXTURE_V_MASK)>>BGFX_TEXTURE_V_SHIFT];
+ m_samplerDescriptor.rAddressMode = s_textureAddress[(_flags&BGFX_TEXTURE_W_MASK)>>BGFX_TEXTURE_W_SHIFT];
+ m_samplerDescriptor.minFilter = s_textureFilterMinMag[(_flags&BGFX_TEXTURE_MIN_MASK)>>BGFX_TEXTURE_MIN_SHIFT];
+ m_samplerDescriptor.magFilter = s_textureFilterMinMag[(_flags&BGFX_TEXTURE_MAG_MASK)>>BGFX_TEXTURE_MAG_SHIFT];
+ m_samplerDescriptor.mipFilter = s_textureFilterMip[(_flags&BGFX_TEXTURE_MIP_MASK)>>BGFX_TEXTURE_MIP_SHIFT];
+ m_samplerDescriptor.lodMinClamp = 0;
+ m_samplerDescriptor.lodMaxClamp = FLT_MAX;
+ m_samplerDescriptor.normalizedCoordinates = TRUE;
+ m_samplerDescriptor.maxAnisotropy = m_maxAnisotropy;
+
+ //TODO: I haven't found how to specify this. Comparison function can be specified in shader.
+ // On OSX this can be specified. There is no support for this on iOS right now.
+ //const uint32_t cmpFunc = (_flags&BGFX_TEXTURE_COMPARE_MASK)>>BGFX_TEXTURE_COMPARE_SHIFT;
+ //const uint8_t filter = 0 == cmpFunc ? 0 : D3D11_COMPARISON_FILTERING_BIT;
+ //m_samplerDescriptor.comparisonFunc = 0 == cmpFunc ? D3D11_COMPARISON_NEVER : s_cmpFunc[cmpFunc];
+
+ sampler = m_device.newSamplerStateWithDescriptor(m_samplerDescriptor);
+ m_samplerStateCache.add(_flags, sampler);
+ }
- sampler = m_device.newSamplerStateWithDescriptor(m_samplerDescriptor);
- m_samplerStateCache.add(_flags, sampler);
+ return sampler;
}
- return sampler;
- }
+ bool isVisible(Frame* _render, OcclusionQueryHandle _handle, bool _visible)
+ {
+ m_occlusionQuery.resolve(_render);
+ return _visible == (0 != _render->m_occlusion[_handle.idx]);
+ }
- uint32_t getBufferWidth()
- {
- return m_backBufferDepth.width();
- }
+ uint32_t getBufferWidth()
+ {
+ return m_backBufferDepth.width();
+ }
- uint32_t getBufferHeight()
- {
- return m_backBufferDepth.height();
- }
+ uint32_t getBufferHeight()
+ {
+ return m_backBufferDepth.height();
+ }
- Device m_device;
- CommandQueue m_commandQueue;
- CAMetalLayer* m_metalLayer;
- Texture m_backBufferDepth;
- Texture m_backBufferStencil;
- uint32_t m_backBufferPixelFormatHash;
- uint32_t m_maxAnisotropy;
-
- Buffer m_uniformBuffer; //todo: use a pool of this
- uint32_t m_uniformBufferVertexOffset;
- uint32_t m_uniformBufferFragmentOffset;
-
- uint16_t m_numWindows;
- FrameBufferHandle m_windows[BGFX_CONFIG_MAX_FRAME_BUFFERS];
-
- IndexBufferMtl m_indexBuffers[BGFX_CONFIG_MAX_INDEX_BUFFERS];
- VertexBufferMtl m_vertexBuffers[BGFX_CONFIG_MAX_VERTEX_BUFFERS];
- ShaderMtl m_shaders[BGFX_CONFIG_MAX_SHADERS];
- ProgramMtl m_program[BGFX_CONFIG_MAX_PROGRAMS];
- TextureMtl m_textures[BGFX_CONFIG_MAX_TEXTURES];
- FrameBufferMtl m_frameBuffers[BGFX_CONFIG_MAX_FRAME_BUFFERS];
- VertexDecl m_vertexDecls[BGFX_CONFIG_MAX_VERTEX_DECLS];
- UniformRegistry m_uniformReg;
- void* m_uniforms[BGFX_CONFIG_MAX_UNIFORMS];
-
- StateCacheT<DepthStencilState> m_depthStencilStateCache;
- StateCacheT<SamplerState> m_samplerStateCache;
-
- TextVideoMem m_textVideoMem;
-
- FrameBufferHandle m_fbh;
- bool m_rtMsaa;
-
- Resolution m_resolution;
-
- // descriptors
- RenderPipelineDescriptor m_renderPipelineDescriptor;
- DepthStencilDescriptor m_depthStencilDescriptor;
- StencilDescriptor m_frontFaceStencilDescriptor;
- StencilDescriptor m_backFaceStencilDescriptor;
- VertexDescriptor m_vertexDescriptor;
- TextureDescriptor m_textureDescriptor;
- SamplerDescriptor m_samplerDescriptor;
+ Device m_device;
+ CommandQueue m_commandQueue;
+ CAMetalLayer* m_metalLayer;
+ Texture m_backBufferDepth;
+ Texture m_backBufferStencil;
+ uint32_t m_backBufferPixelFormatHash;
+ uint32_t m_maxAnisotropy;
+
+ OcclusionQueryMTL m_occlusionQuery;
+
+ Buffer m_uniformBuffer;
+ Buffer m_uniformBuffers[UNIFORM_BUFFER_COUNT];
+ uint32_t m_uniformBufferVertexOffset;
+ uint32_t m_uniformBufferFragmentOffset;
+ uint8_t m_uniformBufferIndex;
+
+ uint16_t m_numWindows;
+ FrameBufferHandle m_windows[BGFX_CONFIG_MAX_FRAME_BUFFERS];
+
+ IndexBufferMtl m_indexBuffers[BGFX_CONFIG_MAX_INDEX_BUFFERS];
+ VertexBufferMtl m_vertexBuffers[BGFX_CONFIG_MAX_VERTEX_BUFFERS];
+ ShaderMtl m_shaders[BGFX_CONFIG_MAX_SHADERS];
+ ProgramMtl m_program[BGFX_CONFIG_MAX_PROGRAMS];
+ TextureMtl m_textures[BGFX_CONFIG_MAX_TEXTURES];
+ FrameBufferMtl m_frameBuffers[BGFX_CONFIG_MAX_FRAME_BUFFERS];
+ VertexDecl m_vertexDecls[BGFX_CONFIG_MAX_VERTEX_DECLS];
+ UniformRegistry m_uniformReg;
+ void* m_uniforms[BGFX_CONFIG_MAX_UNIFORMS];
+
+ StateCacheT<DepthStencilState> m_depthStencilStateCache;
+ StateCacheT<SamplerState> m_samplerStateCache;
+
+ TextVideoMem m_textVideoMem;
+
+ FrameBufferHandle m_fbh;
+ bool m_rtMsaa;
+
+ Resolution m_resolution;
+
+ // descriptors
+ RenderPipelineDescriptor m_renderPipelineDescriptor;
+ DepthStencilDescriptor m_depthStencilDescriptor;
+ StencilDescriptor m_frontFaceStencilDescriptor;
+ StencilDescriptor m_backFaceStencilDescriptor;
+ VertexDescriptor m_vertexDescriptor;
+ TextureDescriptor m_textureDescriptor;
+ SamplerDescriptor m_samplerDescriptor;
// currently active objects data
- id <CAMetalDrawable> m_drawable;
- CommandBuffer m_commandBuffer;
- RenderCommandEncoder m_renderCommandEncoder;
-};
+ id <CAMetalDrawable> m_drawable;
+ CommandBuffer m_commandBuffer;
+ RenderCommandEncoder m_renderCommandEncoder;
+ };
static RendererContextMtl* s_renderMtl;
@@ -1445,6 +1463,8 @@ namespace bgfx { namespace mtl
m_processedUniforms = false;
m_numPredefined = 0;
+
+ m_renderPipelineStateCache.invalidate();
}
UniformType::Enum convertMtlType(MTLDataType _type)
@@ -1774,9 +1794,11 @@ namespace bgfx { namespace mtl
void BufferMtl::create(uint32_t _size, void* _data, uint16_t _flags, uint16_t _stride, bool _vertex)
{
- BX_UNUSED(_flags, _stride, _vertex);
+ BX_UNUSED(_stride, _vertex);
m_size = _size;
+ m_flags = _flags;
+
if (NULL == _data)
{
m_buffer = s_renderMtl->m_device.newBufferWithLength(_size, 0);
@@ -1897,10 +1919,10 @@ namespace bgfx { namespace mtl
desc.resourceOptions = MTLResourceStorageModePrivate;
desc.cpuCacheMode = MTLCPUCacheModeDefaultCache;
- desc.storageMode = bufferOnly
+ desc.storageMode = (MTLStorageMode)(bufferOnly
? 2 /*MTLStorageModePrivate*/
: 1 /*MTLStorageModeManaged*/
- ;
+ );
desc.usage = bufferOnly
? MTLTextureUsageShaderWrite
: MTLTextureUsageShaderRead
@@ -1958,8 +1980,8 @@ namespace bgfx { namespace mtl
if (compressed && !convert)
{
- if (format >= 160 /*MTLPixelFormatPVRTC_RGB_2BPP*/
- && format <= 167 /*MTLPixelFormatPVRTC_RGBA_4BPP_sRGB*/)
+ if (format >= 160 /*PVRTC_RGB_2BPP*/
+ && format <= 167 /*PVRTC_RGBA_4BPP_sRGB*/)
{
bytesPerRow = 0;
bytesPerImage = 0;
@@ -2034,7 +2056,7 @@ namespace bgfx { namespace mtl
{
//TODO: vertex or fragment stage?
s_renderMtl->m_renderCommandEncoder.setFragmentTexture(m_ptr, _stage);
- s_renderMtl->m_renderCommandEncoder.setFragmentSamplerState(0 == (BGFX_SAMPLER_DEFAULT_FLAGS & _flags)
+ s_renderMtl->m_renderCommandEncoder.setFragmentSamplerState(0 == (BGFX_TEXTURE_INTERNAL_DEFAULT_SAMPLER & _flags)
? s_renderMtl->getSamplerState(_flags)
: m_sampler, _stage);
}
@@ -2102,10 +2124,52 @@ namespace bgfx { namespace mtl
return denseIdx;
}
- void RendererContextMtl::submit(Frame* _render, ClearQuad& _clearQuad, TextVideoMemBlitter& _textVideoMemBlitter) BX_OVERRIDE
+ void OcclusionQueryMTL::postReset()
+ {
+ MTL_RELEASE(m_buffer);
+ }
+
+ void OcclusionQueryMTL::preReset()
+ {
+ m_buffer = s_renderMtl->m_device.newBufferWithLength(BX_COUNTOF(m_query) * 8, 0);
+ }
+
+ void OcclusionQueryMTL::begin(RenderCommandEncoder& _rce, Frame* _render, OcclusionQueryHandle _handle)
{
- BX_UNUSED(_clearQuad);
+ while (0 == m_control.reserve(1) )
+ {
+ resolve(_render, true);
+ }
+
+ Query& query = m_query[m_control.m_current];
+ query.m_handle = _handle;
+ uint32_t offset = _handle.idx * 8;
+ _rce.setVisibilityResultMode(MTLVisibilityResultModeBoolean, offset);
+ }
+
+ void OcclusionQueryMTL::end(RenderCommandEncoder& _rce)
+ {
+ Query& query = m_query[m_control.m_current];
+ uint32_t offset = query.m_handle.idx * 8;
+ _rce.setVisibilityResultMode(MTLVisibilityResultModeDisabled, offset);
+ m_control.commit(1);
+ }
+
+ void OcclusionQueryMTL::resolve(Frame* _render, bool _wait)
+ {
+ BX_UNUSED(_wait);
+ while (0 != m_control.available() )
+ {
+ Query& query = m_query[m_control.m_read];
+
+ uint64_t result = ( (uint64_t*)m_buffer.contents() )[query.m_handle.idx];
+ _render->m_occlusion[query.m_handle.idx] = 0 < result;
+ m_control.consume(1);
+ }
+ }
+ void RendererContextMtl::submit(Frame* _render, ClearQuad& _clearQuad, TextVideoMemBlitter& _textVideoMemBlitter) BX_OVERRIDE
+ {
m_commandBuffer = m_commandQueue.commandBuffer();
retain(m_commandBuffer); // keep alive to be useable at 'flip'
@@ -2116,6 +2180,8 @@ namespace bgfx { namespace mtl
m_drawable = m_metalLayer.nextDrawable;
// retain(m_drawable); // keep alive to be useable at 'flip'
+ m_uniformBuffer = m_uniformBuffers[m_uniformBufferIndex];
+ m_uniformBufferIndex = (m_uniformBufferIndex + 1) % UNIFORM_BUFFER_COUNT;
m_uniformBufferVertexOffset = 0;
m_uniformBufferFragmentOffset = 0;
@@ -2146,8 +2212,8 @@ namespace bgfx { namespace mtl
RenderDraw currentState;
currentState.clear();
- currentState.m_flags = BGFX_STATE_NONE;
- currentState.m_stencil = packStencil(BGFX_STENCIL_NONE, BGFX_STENCIL_NONE);
+ currentState.m_stateFlags = BGFX_STATE_NONE;
+ currentState.m_stencil = packStencil(BGFX_STENCIL_NONE, BGFX_STENCIL_NONE);
_render->m_hmdInitialized = false;
@@ -2170,7 +2236,7 @@ namespace bgfx { namespace mtl
uint16_t programIdx = invalidHandle;
SortKey key;
uint16_t view = UINT16_MAX;
- FrameBufferHandle fbh = BGFX_INVALID_HANDLE;
+ FrameBufferHandle fbh = { BGFX_CONFIG_MAX_FRAME_BUFFERS };
//ASK: why should we use this? It changes topology, so possible renders a big mess, doesn't it?
//const uint64_t primType = _render->m_debug&BGFX_DEBUG_WIREFRAME ? BGFX_STATE_PT_LINES : 0;
@@ -2179,7 +2245,7 @@ namespace bgfx { namespace mtl
PrimInfo prim = s_primInfo[primIndex];
ProgramMtl* currentProgram = NULL;
- mtl::RenderCommandEncoder rce;
+ RenderCommandEncoder rce;
bool wasCompute = false;
bool viewHasScissor = false;
@@ -2193,6 +2259,8 @@ namespace bgfx { namespace mtl
uint32_t statsNumIndices = 0;
uint32_t statsKeyType[2] = {};
+ m_occlusionQuery.resolve(_render);
+
if (0 == (_render->m_debug&BGFX_DEBUG_IFH) )
{
bool viewRestart = false;
@@ -2209,7 +2277,7 @@ namespace bgfx { namespace mtl
const bool viewChanged = 0
|| key.m_view != view
|| item == numItems
- ;
+ ;
const RenderItem& renderItem = _render->m_renderItem[_render->m_sortValues[item] ];
++item;
@@ -2227,9 +2295,9 @@ namespace bgfx { namespace mtl
view = key.m_view;
programIdx = invalidHandle;
-
viewRestart = ( (BGFX_VIEW_STEREO == (_render->m_viewFlags[view] & BGFX_VIEW_STEREO) ) );
viewRestart &= hmdEnabled;
+
if (viewRestart)
{
if (0 == restartState)
@@ -2247,6 +2315,7 @@ namespace bgfx { namespace mtl
}
viewState.m_rect = _render->m_rect[view];
+
if (viewRestart)
{
viewState.m_rect.m_x = eye * (viewState.m_rect.m_width+1)/2;
@@ -2258,23 +2327,27 @@ namespace bgfx { namespace mtl
viewScissorRect = viewHasScissor ? scissorRect : viewState.m_rect;
Clear& clr = _render->m_clear[view];
- mtl::RenderPassDescriptor renderPassDescriptor = newRenderPassDescriptor();
+ RenderPassDescriptor renderPassDescriptor = newRenderPassDescriptor();
+ renderPassDescriptor.visibilityResultBuffer = m_occlusionQuery.m_buffer;
- //todo: check FB size
uint32_t width = getBufferWidth();
uint32_t height = getBufferHeight();
Rect viewRect = viewState.m_rect;
- bool fullscreenRect = (0 == viewRect.m_x && 0 == viewRect.m_y && width == viewRect.m_width && height == viewRect.m_height);
-
- //TODO/OPTIMIZATION: merge views with same target framebuffer into one renderPass
+ bool fullscreenRect = true
+ && 0 == viewRect.m_x
+ && 0 == viewRect.m_y
+ && width == viewRect.m_width
+ && height == viewRect.m_height
+ ;
fbh = _render->m_fb[view];
setFrameBuffer(renderPassDescriptor, fbh);
RenderPassColorAttachmentDescriptor colorAttachment0 = renderPassDescriptor.colorAttachments[0];
- if (BGFX_CLEAR_COLOR & clr.m_flags)
+
+ if (0 != (BGFX_CLEAR_COLOR & clr.m_flags) )
{
- if (BGFX_CLEAR_COLOR_USE_PALETTE & clr.m_flags)
+ if (0 != (BGFX_CLEAR_COLOR_USE_PALETTE & clr.m_flags) )
{
uint8_t index = (uint8_t)bx::uint32_min(BGFX_CONFIG_MAX_COLOR_PALETTE-1, clr.m_index[0]);
const float* rgba = _render->m_colorPalette[index];
@@ -2282,7 +2355,7 @@ namespace bgfx { namespace mtl
const float gg = rgba[1];
const float bb = rgba[2];
const float aa = rgba[3];
- colorAttachment0.clearColor = MTLClearColorMake(rr,gg,bb,aa);
+ colorAttachment0.clearColor = MTLClearColorMake(rr, gg, bb, aa);
}
else
{
@@ -2290,20 +2363,25 @@ namespace bgfx { namespace mtl
float gg = clr.m_index[1]*1.0f/255.0f;
float bb = clr.m_index[2]*1.0f/255.0f;
float aa = clr.m_index[3]*1.0f/255.0f;
- colorAttachment0.clearColor = MTLClearColorMake(rr,gg,bb,aa);
+ colorAttachment0.clearColor = MTLClearColorMake(rr, gg, bb, aa);
}
colorAttachment0.loadAction = MTLLoadActionClear;
}
else
+ {
colorAttachment0.loadAction = MTLLoadActionLoad;
+ }
//TODO: optimize store actions use discard flag
RenderPassDepthAttachmentDescriptor depthAttachment = renderPassDescriptor.depthAttachment;
if (NULL != depthAttachment.texture)
{
depthAttachment.clearDepth = clr.m_depth;
- depthAttachment.loadAction = (BGFX_CLEAR_DEPTH & clr.m_flags) ? MTLLoadActionClear : MTLLoadActionLoad;
+ depthAttachment.loadAction = 0 != (BGFX_CLEAR_DEPTH & clr.m_flags)
+ ? MTLLoadActionClear
+ : MTLLoadActionLoad
+ ;
depthAttachment.storeAction = MTLStoreActionStore;
}
@@ -2311,7 +2389,10 @@ namespace bgfx { namespace mtl
if (NULL != stencilAttachment.texture)
{
stencilAttachment.clearStencil = clr.m_stencil;
- stencilAttachment.loadAction = (BGFX_CLEAR_STENCIL & clr.m_flags) ? MTLLoadActionClear : MTLLoadActionLoad;
+ stencilAttachment.loadAction = 0 != (BGFX_CLEAR_STENCIL & clr.m_flags)
+ ? MTLLoadActionClear
+ : MTLLoadActionLoad
+ ;
stencilAttachment.storeAction = MTLStoreActionStore;
}
@@ -2319,6 +2400,7 @@ namespace bgfx { namespace mtl
{
m_renderCommandEncoder.endEncoding();
}
+
rce = m_commandBuffer.renderCommandEncoderWithDescriptor(renderPassDescriptor);
m_renderCommandEncoder = rce;
MTL_RELEASE(renderPassDescriptor);
@@ -2332,8 +2414,10 @@ namespace bgfx { namespace mtl
if (BX_ENABLED(BGFX_CONFIG_DEBUG_MTL) )
{
- if (item != 1) //ASK: better check ? I don't get the whole restart thing
+ if (item != 1)
+ {
rce.popDebugGroup();
+ }
rce.pushDebugGroup(s_viewName[view]);
}
@@ -2341,20 +2425,19 @@ namespace bgfx { namespace mtl
MTLViewport vp;
vp.originX = viewState.m_rect.m_x;
vp.originY = viewState.m_rect.m_y;
- vp.width = viewState.m_rect.m_width;
- vp.height = viewState.m_rect.m_height;
- vp.znear = 0.0f;
- vp.zfar = 1.0f;
+ vp.width = viewState.m_rect.m_width;
+ vp.height = viewState.m_rect.m_height;
+ vp.znear = 0.0f;
+ vp.zfar = 1.0f;
rce.setViewport(vp);
- if (BGFX_CLEAR_NONE != (clr.m_flags & BGFX_CLEAR_MASK) && !fullscreenRect)
- { //TODO: fallback to clear with quad
- //clearQuad(_clearQuad, viewState.m_rect, clr, _render->m_colorPalette);
+ if (BGFX_CLEAR_NONE != (clr.m_flags & BGFX_CLEAR_MASK)
+ && !fullscreenRect)
+ {
+ clearQuad(_clearQuad, viewState.m_rect, clr, _render->m_colorPalette);
}
}
- //TODO: iscompute
-
bool resetState = viewChanged || wasCompute;
if (wasCompute)
@@ -2364,15 +2447,22 @@ namespace bgfx { namespace mtl
programIdx = invalidHandle;
currentProgram = NULL;
- //TODO
//invalidateCompute();
}
const RenderDraw& draw = renderItem.draw;
- const uint64_t newFlags = draw.m_flags;
- uint64_t changedFlags = currentState.m_flags ^ draw.m_flags;
- currentState.m_flags = newFlags;
+ const bool hasOcclusionQuery = 0 != (draw.m_stateFlags & BGFX_STATE_INTERNAL_OCCLUSION_QUERY);
+ if (isValid(draw.m_occlusionQuery)
+ && !hasOcclusionQuery
+ && !isVisible(_render, draw.m_occlusionQuery, 0 != (draw.m_submitFlags&BGFX_SUBMIT_INTERNAL_OCCLUSION_VISIBLE) ) )
+ {
+ continue;
+ }
+
+ const uint64_t newFlags = draw.m_stateFlags;
+ uint64_t changedFlags = currentState.m_stateFlags ^ draw.m_stateFlags;
+ currentState.m_stateFlags = newFlags;
const uint64_t newStencil = draw.m_stencil;
uint64_t changedStencil = currentState.m_stencil ^ draw.m_stencil;
@@ -2384,8 +2474,8 @@ namespace bgfx { namespace mtl
currentState.m_scissor = !draw.m_scissor;
changedFlags = BGFX_STATE_MASK;
changedStencil = packStencil(BGFX_STENCIL_MASK, BGFX_STENCIL_MASK);
- currentState.m_flags = newFlags;
- currentState.m_stencil = newStencil;
+ currentState.m_stateFlags = newFlags;
+ currentState.m_stencil = newStencil;
programIdx = invalidHandle;
setDepthStencilState(newFlags, packStencil(BGFX_STENCIL_DEFAULT, BGFX_STENCIL_DEFAULT));
@@ -2434,18 +2524,18 @@ namespace bgfx { namespace mtl
rce.setScissorRect(rc);
}
- if ((BGFX_STATE_DEPTH_WRITE|BGFX_STATE_DEPTH_TEST_MASK) & changedFlags
- || 0 != changedStencil)
+ if ( (BGFX_STATE_DEPTH_WRITE|BGFX_STATE_DEPTH_TEST_MASK) & changedFlags
+ || 0 != changedStencil)
{
setDepthStencilState(newFlags,newStencil);
}
- if ((0
- | BGFX_STATE_CULL_MASK
- | BGFX_STATE_ALPHA_REF_MASK
- | BGFX_STATE_PT_MASK
- //| BGFX_STATE_POINT_SIZE_MASK //TODO: not supported. could be supported with uniform
- ) & changedFlags)
+ if ( (0
+ | BGFX_STATE_CULL_MASK
+ | BGFX_STATE_ALPHA_REF_MASK
+ | BGFX_STATE_PT_MASK
+// | BGFX_STATE_POINT_SIZE_MASK
+ ) & changedFlags)
{
if (BGFX_STATE_CULL_MASK & changedFlags)
{
@@ -2468,7 +2558,8 @@ namespace bgfx { namespace mtl
}
}
- if ((blendFactor != draw.m_rgba) && !(newFlags & BGFX_STATE_BLEND_INDEPENDENT) )
+ if (blendFactor != draw.m_rgba
+ && !(newFlags & BGFX_STATE_BLEND_INDEPENDENT) )
{
const uint32_t rgba = draw.m_rgba;
float rr = ( (rgba>>24) )/255.0f;
@@ -2484,12 +2575,12 @@ namespace bgfx { namespace mtl
bool constantsChanged = draw.m_constBegin < draw.m_constEnd;
rendererUpdateUniforms(this, _render->m_uniformBuffer, draw.m_constBegin, draw.m_constEnd);
- if (key.m_program != programIdx ||
- (BGFX_STATE_BLEND_MASK|BGFX_STATE_BLEND_EQUATION_MASK|BGFX_STATE_ALPHA_WRITE|BGFX_STATE_RGB_WRITE|BGFX_STATE_BLEND_INDEPENDENT|BGFX_STATE_MSAA) & changedFlags ||
- currentState.m_vertexBuffer.idx != draw.m_vertexBuffer.idx ||
- currentState.m_vertexDecl.idx != draw.m_vertexDecl.idx ||
- currentState.m_instanceDataStride != draw.m_instanceDataStride ||
- ( (blendFactor != draw.m_rgba) && !!(newFlags & BGFX_STATE_BLEND_INDEPENDENT) ) )
+ if (key.m_program != programIdx
+ || (BGFX_STATE_BLEND_MASK|BGFX_STATE_BLEND_EQUATION_MASK|BGFX_STATE_ALPHA_WRITE|BGFX_STATE_RGB_WRITE|BGFX_STATE_BLEND_INDEPENDENT|BGFX_STATE_MSAA) & changedFlags
+ || currentState.m_vertexBuffer.idx != draw.m_vertexBuffer.idx
+ || currentState.m_vertexDecl.idx != draw.m_vertexDecl.idx
+ || currentState.m_instanceDataStride != draw.m_instanceDataStride
+ || ( (blendFactor != draw.m_rgba) && !!(newFlags & BGFX_STATE_BLEND_INDEPENDENT) ) )
{
programIdx = key.m_program;
currentState.m_vertexDecl = draw.m_vertexDecl;
@@ -2529,24 +2620,22 @@ namespace bgfx { namespace mtl
{
ProgramMtl& program = m_program[programIdx];
- uint32_t vertexUniformBufferSize = program.m_vshConstantBufferSize;
+ uint32_t vertexUniformBufferSize = program.m_vshConstantBufferSize;
uint32_t fragmentUniformBufferSize = program.m_fshConstantBufferSize;
- if (vertexUniformBufferSize )
+ if (vertexUniformBufferSize)
{
m_uniformBufferVertexOffset = BX_ALIGN_MASK(m_uniformBufferVertexOffset, program.m_vshConstantBufferAlignmentMask);
rce.setVertexBuffer(m_uniformBuffer, m_uniformBufferVertexOffset, 0);
}
m_uniformBufferFragmentOffset = m_uniformBufferVertexOffset + vertexUniformBufferSize;
- if (fragmentUniformBufferSize )
+ if (fragmentUniformBufferSize)
{
m_uniformBufferFragmentOffset = BX_ALIGN_MASK(m_uniformBufferFragmentOffset, program.m_fshConstantBufferAlignmentMask);
rce.setFragmentBuffer(m_uniformBuffer, m_uniformBufferFragmentOffset, 0);
}
- //TODO: create new UniformBuffer when not enough place for next buffer
-
if (constantsChanged)
{
UniformBuffer* vcb = program.m_vshConstantBuffer;
@@ -2574,13 +2663,13 @@ namespace bgfx { namespace mtl
const Binding& sampler = draw.m_bind[stage];
Binding& current = currentState.m_bind[stage];
if (current.m_idx != sampler.m_idx
- || current.m_un.m_draw.m_flags != sampler.m_un.m_draw.m_flags
- || programChanged)
+ || current.m_un.m_draw.m_textureFlags != sampler.m_un.m_draw.m_textureFlags
+ || programChanged)
{
if (invalidHandle != sampler.m_idx)
{
TextureMtl& texture = m_textures[sampler.m_idx];
- texture.commit(stage, sampler.m_un.m_draw.m_flags);
+ texture.commit(stage, sampler.m_un.m_draw.m_textureFlags);
}
}
@@ -2589,13 +2678,12 @@ namespace bgfx { namespace mtl
}
if (currentState.m_vertexBuffer.idx != draw.m_vertexBuffer.idx
- || currentState.m_startVertex != draw.m_startVertex
- || currentState.m_instanceDataBuffer.idx != draw.m_instanceDataBuffer.idx
- || currentState.m_instanceDataOffset != draw.m_instanceDataOffset
- )
+ || currentState.m_startVertex != draw.m_startVertex
+ || currentState.m_instanceDataBuffer.idx != draw.m_instanceDataBuffer.idx
+ || currentState.m_instanceDataOffset != draw.m_instanceDataOffset)
{
currentState.m_vertexBuffer = draw.m_vertexBuffer;
- currentState.m_startVertex = draw.m_startVertex;
+ currentState.m_startVertex = draw.m_startVertex;
currentState.m_instanceDataBuffer.idx = draw.m_instanceDataBuffer.idx;
currentState.m_instanceDataOffset = draw.m_instanceDataOffset;
@@ -2635,9 +2723,13 @@ namespace bgfx { namespace mtl
uint32_t numPrimsRendered = 0;
uint32_t numDrawIndirect = 0;
+ if (hasOcclusionQuery)
+ {
+ m_occlusionQuery.begin(rce, _render, draw.m_occlusionQuery);
+ }
+
if (isValid(draw.m_indirectBuffer) )
{
- // TODO: indirect draw
}
else
{
@@ -2677,6 +2769,11 @@ namespace bgfx { namespace mtl
}
}
+ if (hasOcclusionQuery)
+ {
+ m_occlusionQuery.end(rce);
+ }
+
statsNumPrimsSubmitted[primIndex] += numPrimsSubmitted;
statsNumPrimsRendered[primIndex] += numPrimsRendered;
statsNumInstances[primIndex] += numInstances;
@@ -2687,21 +2784,12 @@ namespace bgfx { namespace mtl
if (wasCompute)
{
- //TODO
//invalidateCompute();
}
if (0 < _render->m_num)
{
- //ASK: we now using one commandBuffer that is commited in flush. Should we implement this?
- //if (0 != (m_resolution.m_flags & BGFX_RESET_FLUSH_AFTER_RENDER) )
- {
- // ????
- //deviceCtx->Flush();
- }
-
captureElapsed = -bx::getHPCounter();
- //TODO
//capture();
captureElapsed += bx::getHPCounter();
}
@@ -2715,7 +2803,6 @@ namespace bgfx { namespace mtl
}
}
- //TODO: debug stats
int64_t now = bx::getHPCounter();
elapsed += now;
@@ -2736,17 +2823,16 @@ namespace bgfx { namespace mtl
static double maxGpuElapsed = 0.0f;
// double elapsedGpuMs = 0.0;
- //TODO: gputimer
- /* m_gpuTimer.end();
+// m_gpuTimer.end();
+//
+// while (m_gpuTimer.get() )
+// {
+// double toGpuMs = 1000.0 / double(m_gpuTimer.m_frequency);
+// elapsedGpuMs = m_gpuTimer.m_elapsed * toGpuMs;
+// maxGpuElapsed = elapsedGpuMs > maxGpuElapsed ? elapsedGpuMs : maxGpuElapsed;
+// }
+// maxGpuLatency = bx::uint32_imax(maxGpuLatency, m_gpuTimer.m_control.available()-1);
- while (m_gpuTimer.get() )
- {
- double toGpuMs = 1000.0 / double(m_gpuTimer.m_frequency);
- elapsedGpuMs = m_gpuTimer.m_elapsed * toGpuMs;
- maxGpuElapsed = elapsedGpuMs > maxGpuElapsed ? elapsedGpuMs : maxGpuElapsed;
- }
- maxGpuLatency = bx::uint32_imax(maxGpuLatency, m_gpuTimer.m_control.available()-1);
- */
TextVideoMem& tvm = m_textVideoMem;
static int64_t next = now;
@@ -2761,50 +2847,46 @@ namespace bgfx { namespace mtl
tvm.clear();
uint16_t pos = 0;
tvm.printf(0, pos++, BGFX_CONFIG_DEBUG ? 0x89 : 0x8f, " %s / " BX_COMPILER_NAME " / " BX_CPU_NAME " / " BX_ARCH_NAME " / " BX_PLATFORM_NAME " "
- , getRendererName()
- );
-
- //const D3DADAPTER_IDENTIFIER9& identifier = m_identifier;
- //tvm.printf(0, pos++, 0x0f, " Device: %s (%s)", identifier.Description, identifier.Driver);
+ , getRendererName()
+ );
pos = 10;
- tvm.printf(10, pos++, 0x8e, " Frame: %7.3f, % 7.3f \x1f, % 7.3f \x1e [ms] / % 6.2f FPS "
- , double(frameTime)*toMs
- , double(min)*toMs
- , double(max)*toMs
- , freq/frameTime
- );
-
- /*
- const uint32_t msaa = (m_resolution.m_flags&BGFX_RESET_MSAA_MASK)>>BGFX_RESET_MSAA_SHIFT;
- tvm.printf(10, pos++, 0x8e, " Reset flags: [%c] vsync, [%c] MSAAx%d, [%c] MaxAnisotropy "
- , !!(m_resolution.m_flags&BGFX_RESET_VSYNC) ? '\xfe' : ' '
- , 0 != msaa ? '\xfe' : ' '
- , 1<<msaa
- , !!(m_resolution.m_flags&BGFX_RESET_MAXANISOTROPY) ? '\xfe' : ' '
- );
- */
+ tvm.printf(10, pos++, 0x8e, " Frame: %7.3f, % 7.3f \x1f, % 7.3f \x1e [ms] / % 6.2f FPS "
+ , double(frameTime)*toMs
+ , double(min)*toMs
+ , double(max)*toMs
+ , freq/frameTime
+ );
+
+ const uint32_t msaa = (m_resolution.m_flags&BGFX_RESET_MSAA_MASK)>>BGFX_RESET_MSAA_SHIFT;
+ tvm.printf(10, pos++, 0x8e, " Reset flags: [%c] vsync, [%c] MSAAx%d, [%c] MaxAnisotropy "
+ , !!(m_resolution.m_flags&BGFX_RESET_VSYNC) ? '\xfe' : ' '
+ , 0 != msaa ? '\xfe' : ' '
+ , 1<<msaa
+ , !!(m_resolution.m_flags&BGFX_RESET_MAXANISOTROPY) ? '\xfe' : ' '
+ );
+
double elapsedCpuMs = double(elapsed)*toMs;
- tvm.printf(10, pos++, 0x8e, " Submitted: %4d (draw %4d, compute %4d) / CPU %3.4f [ms] %c GPU %3.4f [ms] (latency %d)"
- , _render->m_num
- , statsKeyType[0]
- , statsKeyType[1]
- , elapsedCpuMs
- , elapsedCpuMs > maxGpuElapsed ? '>' : '<'
- , maxGpuElapsed
- , maxGpuLatency
- );
+ tvm.printf(10, pos++, 0x8e, " Submitted: %4d (draw %4d, compute %4d) / CPU %3.4f [ms] %c GPU %3.4f [ms] (latency %d)"
+ , _render->m_num
+ , statsKeyType[0]
+ , statsKeyType[1]
+ , elapsedCpuMs
+ , elapsedCpuMs > maxGpuElapsed ? '>' : '<'
+ , maxGpuElapsed
+ , maxGpuLatency
+ );
maxGpuLatency = 0;
maxGpuElapsed = 0.0;
for (uint32_t ii = 0; ii < BX_COUNTOF(s_primName); ++ii)
{
- tvm.printf(10, pos++, 0x8e, " %9s: %7d (#inst: %5d), submitted: %7d"
- , s_primName[ii]
- , statsNumPrimsRendered[ii]
- , statsNumInstances[ii]
- , statsNumPrimsSubmitted[ii]
- );
+ tvm.printf(10, pos++, 0x8e, " %10s: %7d (#inst: %5d), submitted: %7d"
+ , s_primName[ii]
+ , statsNumPrimsRendered[ii]
+ , statsNumInstances[ii]
+ , statsNumPrimsSubmitted[ii]
+ );
}
tvm.printf(10, pos++, 0x8e, " Indices: %7d ", statsNumIndices);
@@ -2812,6 +2894,7 @@ namespace bgfx { namespace mtl
tvm.printf(10, pos++, 0x8e, " DVB size: %7d ", _render->m_vboffset);
tvm.printf(10, pos++, 0x8e, " DIB size: %7d ", _render->m_iboffset);
+ pos++;
double captureMs = double(captureElapsed)*toMs;
tvm.printf(10, pos++, 0x8e, " Capture: %3.4f [ms]", captureMs);
diff --git a/3rdparty/bgfx/src/renderer_null.cpp b/3rdparty/bgfx/src/renderer_null.cpp
index db6777bdab0..021944e15cd 100644
--- a/3rdparty/bgfx/src/renderer_null.cpp
+++ b/3rdparty/bgfx/src/renderer_null.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "bgfx_p.h"
diff --git a/3rdparty/bgfx/src/renderer_vk.cpp b/3rdparty/bgfx/src/renderer_vk.cpp
index a0739ca1ec0..31455c1992f 100644
--- a/3rdparty/bgfx/src/renderer_vk.cpp
+++ b/3rdparty/bgfx/src/renderer_vk.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "bgfx_p.h"
diff --git a/3rdparty/bgfx/src/shader_dx9bc.cpp b/3rdparty/bgfx/src/shader_dx9bc.cpp
index bfbf4f6ee98..81d3dfb606a 100644
--- a/3rdparty/bgfx/src/shader_dx9bc.cpp
+++ b/3rdparty/bgfx/src/shader_dx9bc.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "bgfx_p.h"
diff --git a/3rdparty/bgfx/src/shader_dx9bc.h b/3rdparty/bgfx/src/shader_dx9bc.h
index b161dcaa29d..d7b6b381dc3 100644
--- a/3rdparty/bgfx/src/shader_dx9bc.h
+++ b/3rdparty/bgfx/src/shader_dx9bc.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#ifndef BGFX_SHADER_DX9BC_H
diff --git a/3rdparty/bgfx/src/shader_dxbc.cpp b/3rdparty/bgfx/src/shader_dxbc.cpp
index e0f8f6ef504..a1fde52f7ab 100644
--- a/3rdparty/bgfx/src/shader_dxbc.cpp
+++ b/3rdparty/bgfx/src/shader_dxbc.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "bgfx_p.h"
diff --git a/3rdparty/bgfx/src/shader_dxbc.h b/3rdparty/bgfx/src/shader_dxbc.h
index 52590981082..4aa3420fd89 100644
--- a/3rdparty/bgfx/src/shader_dxbc.h
+++ b/3rdparty/bgfx/src/shader_dxbc.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#ifndef BGFX_SHADER_DXBC_H
diff --git a/3rdparty/bgfx/src/shader_spirv.cpp b/3rdparty/bgfx/src/shader_spirv.cpp
index 40bf7acbb6f..63a8b0aa1d7 100644
--- a/3rdparty/bgfx/src/shader_spirv.cpp
+++ b/3rdparty/bgfx/src/shader_spirv.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "bgfx_p.h"
diff --git a/3rdparty/bgfx/src/shader_spirv.h b/3rdparty/bgfx/src/shader_spirv.h
index 5b9cf33c017..73577e77030 100644
--- a/3rdparty/bgfx/src/shader_spirv.h
+++ b/3rdparty/bgfx/src/shader_spirv.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#ifndef BGFX_SHADER_SPIRV_H
diff --git a/3rdparty/bgfx/src/vertexdecl.cpp b/3rdparty/bgfx/src/vertexdecl.cpp
index 470cb56755a..91ef865d0c9 100644
--- a/3rdparty/bgfx/src/vertexdecl.cpp
+++ b/3rdparty/bgfx/src/vertexdecl.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include <string.h>
diff --git a/3rdparty/bgfx/src/vertexdecl.h b/3rdparty/bgfx/src/vertexdecl.h
index 46025527594..642aae35592 100644
--- a/3rdparty/bgfx/src/vertexdecl.h
+++ b/3rdparty/bgfx/src/vertexdecl.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#ifndef BGFX_VERTEXDECL_H_HEADER_GUARD
diff --git a/3rdparty/bgfx/src/vs_clear.sc b/3rdparty/bgfx/src/vs_clear.sc
index 917e926f4fa..83eace1a45a 100644
--- a/3rdparty/bgfx/src/vs_clear.sc
+++ b/3rdparty/bgfx/src/vs_clear.sc
@@ -1,8 +1,8 @@
$input a_position
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "bgfx_shader.sh"
diff --git a/3rdparty/bgfx/src/vs_debugfont.sc b/3rdparty/bgfx/src/vs_debugfont.sc
index 6d4dfb4fbfd..2647102d1a0 100644
--- a/3rdparty/bgfx/src/vs_debugfont.sc
+++ b/3rdparty/bgfx/src/vs_debugfont.sc
@@ -2,8 +2,8 @@ $input a_position, a_color0, a_color1, a_texcoord0
$output v_color0, v_color1, v_texcoord0
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "bgfx_shader.sh"
diff --git a/3rdparty/bgfx/tools/geometryc/geometryc.cpp b/3rdparty/bgfx/tools/geometryc/geometryc.cpp
index 0314455b413..4856d71ea12 100644
--- a/3rdparty/bgfx/tools/geometryc/geometryc.cpp
+++ b/3rdparty/bgfx/tools/geometryc/geometryc.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include <algorithm>
@@ -359,8 +359,8 @@ void help(const char* _error = NULL)
fprintf(stderr
, "geometryc, bgfx geometry compiler tool\n"
- "Copyright 2011-2015 Branimir Karadzic. All rights reserved.\n"
- "License: http://www.opensource.org/licenses/BSD-2-Clause\n\n"
+ "Copyright 2011-2016 Branimir Karadzic. All rights reserved.\n"
+ "License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause\n\n"
);
fprintf(stderr
@@ -368,7 +368,7 @@ void help(const char* _error = NULL)
"\n"
"Supported input file types:\n"
- " *.obj Wavefront\n"
+ " *.obj Wavefront\n"
"\n"
"Options:\n"
diff --git a/3rdparty/bgfx/tools/makedisttex.cpp b/3rdparty/bgfx/tools/makedisttex.cpp
index a4542462e69..6bc99b5289d 100644
--- a/3rdparty/bgfx/tools/makedisttex.cpp
+++ b/3rdparty/bgfx/tools/makedisttex.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include <stdio.h>
diff --git a/3rdparty/bgfx/tools/shaderc/shaderc.cpp b/3rdparty/bgfx/tools/shaderc/shaderc.cpp
index 50c2c0f5efd..4b6c7ec0ff1 100644
--- a/3rdparty/bgfx/tools/shaderc/shaderc.cpp
+++ b/3rdparty/bgfx/tools/shaderc/shaderc.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "shaderc.h"
@@ -293,14 +293,14 @@ private:
uint32_t m_size;
};
-void strins(char* _str, const char* _insert)
+void strInsert(char* _str, const char* _insert)
{
size_t len = strlen(_insert);
memmove(&_str[len], _str, strlen(_str) );
memcpy(_str, _insert, len);
}
-void strreplace(char* _str, const char* _find, const char* _replace)
+void strReplace(char* _str, const char* _find, const char* _replace)
{
const size_t len = strlen(_find);
@@ -319,6 +319,12 @@ void strreplace(char* _str, const char* _find, const char* _replace)
}
}
+void strNormalizeEol(char* _str)
+{
+ strReplace(_str, "\r\n", "\n");
+ strReplace(_str, "\r", "\n");
+}
+
void printCode(const char* _code, int32_t _line, int32_t _start, int32_t _end)
{
fprintf(stderr, "Code:\n---\n");
@@ -587,7 +593,7 @@ void addFragData(Preprocessor& _preprocessor, char* _data, uint32_t _idx, bool _
char replace[32];
bx::snprintf(replace, sizeof(replace), "gl_FragData_%d_", _idx);
- strreplace(_data, find, replace);
+ strReplace(_data, find, replace);
_preprocessor.writef(
" \\\n\t%sout vec4 gl_FragData_%d_ : SV_TARGET%d"
@@ -602,7 +608,7 @@ void voidFragData(char* _data, uint32_t _idx)
char find[32];
bx::snprintf(find, sizeof(find), "gl_FragData[%d]", _idx);
- strreplace(_data, find, "bgfx_VoidFrag");
+ strReplace(_data, find, "bgfx_VoidFrag");
}
// c - compute
@@ -633,8 +639,8 @@ void help(const char* _error = NULL)
fprintf(stderr
, "shaderc, bgfx shader compiler tool\n"
- "Copyright 2011-2015 Branimir Karadzic. All rights reserved.\n"
- "License: http://www.opensource.org/licenses/BSD-2-Clause\n\n"
+ "Copyright 2011-2016 Branimir Karadzic. All rights reserved.\n"
+ "License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause\n\n"
);
fprintf(stderr
@@ -1015,6 +1021,8 @@ int main(int _argc, const char* _argv[])
memset(&data[size+1], 0, padding);
fclose(file);
+ strNormalizeEol(data);
+
input = const_cast<char*>(bx::strws(data) );
while (input[0] == '$')
{
@@ -1408,7 +1416,7 @@ int main(int _argc, const char* _argv[])
const char* brace = strstr(entry, "{");
if (NULL != brace)
{
- strins(const_cast<char*>(brace+1), "\nvec4 bgfx_VoidFrag;\n");
+ strInsert(const_cast<char*>(brace+1), "\nvec4 bgfx_VoidFrag;\n");
}
const bool hasFragCoord = NULL != strstr(input, "gl_FragCoord") || hlsl > 3 || hlsl == 2;
@@ -1540,7 +1548,7 @@ int main(int _argc, const char* _argv[])
const char* end = bx::strmb(brace, '{', '}');
if (NULL != end)
{
- strins(const_cast<char*>(end), "__RETURN__;\n");
+ strInsert(const_cast<char*>(end), "__RETURN__;\n");
}
}
@@ -1589,7 +1597,12 @@ int main(int _argc, const char* _argv[])
if (varyingIt != varyingMap.end() )
{
const Varying& var = varyingIt->second;
- preprocessor.writef(" \\\n\t%s = %s;", var.m_name.c_str(), var.m_init.c_str() );
+ preprocessor.writef(" \\\n\t%s", var.m_name.c_str() );
+ if (!var.m_init.empty() )
+ {
+ preprocessor.writef(" = %s", var.m_init.c_str() );
+ }
+ preprocessor.writef(";");
}
}
diff --git a/3rdparty/bgfx/tools/shaderc/shaderc.h b/3rdparty/bgfx/tools/shaderc/shaderc.h
index a9e6e09ff47..b7818ff1867 100644
--- a/3rdparty/bgfx/tools/shaderc/shaderc.h
+++ b/3rdparty/bgfx/tools/shaderc/shaderc.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#ifndef SHADERC_H_HEADER_GUARD
@@ -133,7 +133,7 @@ struct Uniform
typedef std::vector<Uniform> UniformArray;
void printCode(const char* _code, int32_t _line = 0, int32_t _start = 0, int32_t _end = INT32_MAX);
-void strreplace(char* _str, const char* _find, const char* _replace);
+void strReplace(char* _str, const char* _find, const char* _replace);
int32_t writef(bx::WriterI* _writer, const char* _format, ...);
void writeFile(const char* _filePath, const void* _data, int32_t _size);
diff --git a/3rdparty/bgfx/tools/shaderc/shaderc_glsl.cpp b/3rdparty/bgfx/tools/shaderc/shaderc_glsl.cpp
index a4afb92e43b..674b19d16fd 100644
--- a/3rdparty/bgfx/tools/shaderc/shaderc_glsl.cpp
+++ b/3rdparty/bgfx/tools/shaderc/shaderc_glsl.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "shaderc.h"
@@ -70,17 +70,17 @@ bool compileGLSLShader(bx::CommandLine& _cmdLine, uint32_t _gles, const std::str
if (0 != _gles)
{
char* code = const_cast<char*>(optimizedShader);
- strreplace(code, "gl_FragDepthEXT", "gl_FragDepth");
+ strReplace(code, "gl_FragDepthEXT", "gl_FragDepth");
- strreplace(code, "texture2DLodEXT", "texture2DLod");
- strreplace(code, "texture2DProjLodEXT", "texture2DProjLod");
- strreplace(code, "textureCubeLodEXT", "textureCubeLod");
- strreplace(code, "texture2DGradEXT", "texture2DGrad");
- strreplace(code, "texture2DProjGradEXT", "texture2DProjGrad");
- strreplace(code, "textureCubeGradEXT", "textureCubeGrad");
+ strReplace(code, "texture2DLodEXT", "texture2DLod");
+ strReplace(code, "texture2DProjLodEXT", "texture2DProjLod");
+ strReplace(code, "textureCubeLodEXT", "textureCubeLod");
+ strReplace(code, "texture2DGradEXT", "texture2DGrad");
+ strReplace(code, "texture2DProjGradEXT", "texture2DProjGrad");
+ strReplace(code, "textureCubeGradEXT", "textureCubeGrad");
- strreplace(code, "shadow2DEXT", "shadow2D");
- strreplace(code, "shadow2DProjEXT", "shadow2DProj");
+ strReplace(code, "shadow2DEXT", "shadow2D");
+ strReplace(code, "shadow2DProjEXT", "shadow2DProj");
}
UniformArray uniforms;
diff --git a/3rdparty/bgfx/tools/shaderc/shaderc_hlsl.cpp b/3rdparty/bgfx/tools/shaderc/shaderc_hlsl.cpp
index 60c81282b08..cdac5edd7b3 100644
--- a/3rdparty/bgfx/tools/shaderc/shaderc_hlsl.cpp
+++ b/3rdparty/bgfx/tools/shaderc/shaderc_hlsl.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include "shaderc.h"
diff --git a/3rdparty/bgfx/tools/texturec/texturec.cpp b/3rdparty/bgfx/tools/texturec/texturec.cpp
index 0e4063539a0..7c66cdd310c 100644
--- a/3rdparty/bgfx/tools/texturec/texturec.cpp
+++ b/3rdparty/bgfx/tools/texturec/texturec.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#include <stdio.h>
@@ -9,15 +9,23 @@
// Just hacking DDS loading code in here.
#include "bgfx_p.h"
-using namespace bgfx;
#include "image.h"
+#include <libsquish/squish.h>
+#include <etc1/etc1.h>
+#include <nvtt/nvtt.h>
+#include <pvrtc/PvrTcEncoder.h>
+#include <tinyexr/tinyexr.h>
+
+#define STB_IMAGE_IMPLEMENTATION
+#include <stb/stb_image.c>
#if 0
# define BX_TRACE(_format, ...) fprintf(stderr, "" _format "\n", ##__VA_ARGS__)
#endif // DEBUG
#include <bx/bx.h>
+#include <bx/allocator.h>
#include <bx/commandline.h>
#include <bx/uint32_t.h>
@@ -31,158 +39,292 @@ namespace bgfx
return mem;
}
- void saveTga(const char* _filePath, uint32_t _width, uint32_t _height, uint32_t _srcPitch, const void* _src, bool _grayscale = false, bool _yflip = false)
+ const Memory* makeRef(const void* _data, uint32_t _size, ReleaseFn _releaseFn, void* _userData)
+ {
+ BX_UNUSED(_releaseFn, _userData);
+ Memory* mem = (Memory*)::realloc(NULL, sizeof(Memory) );
+ mem->size = _size;
+ mem->data = (uint8_t*)_data;
+ return mem;
+ }
+
+ void release(const Memory* _mem)
{
- FILE* file = fopen(_filePath, "wb");
- if ( NULL != file )
+ Memory* mem = const_cast<Memory*>(_mem);
+ ::free(mem);
+ }
+
+ void imageEncodeFromRgba8(uint8_t* _dst, const uint8_t* _src, uint32_t _width, uint32_t _height, uint8_t _format)
+ {
+ TextureFormat::Enum format = TextureFormat::Enum(_format);
+
+ switch (format)
{
- uint8_t type = _grayscale ? 3 : 2;
- uint8_t bpp = _grayscale ? 8 : 32;
-
- putc(0, file);
- putc(0, file);
- putc(type, file);
- putc(0, file);
- putc(0, file);
- putc(0, file);
- putc(0, file);
- putc(0, file);
- putc(0, file);
- putc(0, file);
- putc(0, file);
- putc(0, file);
- putc(_width&0xff, file);
- putc( (_width>>8)&0xff, file);
- putc(_height&0xff, file);
- putc( (_height>>8)&0xff, file);
- putc(bpp, file);
- putc(32, file);
-
- uint32_t dstPitch = _width*bpp/8;
- if (_yflip)
+ case TextureFormat::BC1:
+ case TextureFormat::BC2:
+ case TextureFormat::BC3:
+ case TextureFormat::BC4:
+ case TextureFormat::BC5:
+ squish::CompressImage(_src, _width, _height, _dst
+ , format == TextureFormat::BC2 ? squish::kDxt3
+ : format == TextureFormat::BC3 ? squish::kDxt5
+ : format == TextureFormat::BC4 ? squish::kBc4
+ : format == TextureFormat::BC5 ? squish::kBc5
+ : squish::kDxt1
+ );
+ break;
+
+ case TextureFormat::BC6H:
+ nvtt::compressBC6H(_src, _width, _height, 4, _dst);
+ break;
+
+ case TextureFormat::BC7:
+ nvtt::compressBC7(_src, _width, _height, 4, _dst);
+ break;
+
+ case TextureFormat::ETC1:
+ etc1_encode_image(_src, _width, _height, 4, _width*4, _dst);
+ break;
+
+ case TextureFormat::ETC2:
+ case TextureFormat::ETC2A:
+ case TextureFormat::ETC2A1:
+ case TextureFormat::PTC12:
+ break;
+
+ case TextureFormat::PTC14:
{
- uint8_t* data = (uint8_t*)_src + dstPitch*_height - _srcPitch;
- for (uint32_t yy = 0; yy < _height; ++yy)
- {
- fwrite(data, dstPitch, 1, file);
- data -= _srcPitch;
- }
+ using namespace Javelin;
+ RgbBitmap bmp;
+ bmp.width = _width;
+ bmp.height = _height;
+ bmp.data = const_cast<uint8_t*>(_src);
+ PvrTcEncoder::EncodeRgb4Bpp(_dst, bmp);
+ bmp.data = NULL;
}
- else
+ break;
+
+ case TextureFormat::PTC12A:
+ break;
+
+ case TextureFormat::PTC14A:
{
- uint8_t* data = (uint8_t*)_src;
- for (uint32_t yy = 0; yy < _height; ++yy)
- {
- fwrite(data, dstPitch, 1, file);
- data += _srcPitch;
- }
+ using namespace Javelin;
+ RgbaBitmap bmp;
+ bmp.width = _width;
+ bmp.height = _height;
+ bmp.data = const_cast<uint8_t*>(_src);
+ PvrTcEncoder::EncodeRgba4Bpp(_dst, bmp);
+ bmp.data = NULL;
}
+ break;
+
+ case TextureFormat::PTC22:
+ case TextureFormat::PTC24:
+ break;
+
+ case TextureFormat::BGRA8:
+ imageSwizzleBgra8(_width, _height, _width*4, _src, _dst);
+ break;
+
+ case TextureFormat::RGBA8:
+ memcpy(_dst, _src, _width*_height*4);
+ break;
- fclose(file);
+ default:
+ break;
}
}
+
+} // namespace bgfx
+
+void help(const char* _error = NULL)
+{
+ if (NULL != _error)
+ {
+ fprintf(stderr, "Error:\n%s\n\n", _error);
+ }
+
+ fprintf(stderr
+ , "texturec, bgfx texture compiler tool\n"
+ "Copyright 2011-2016 Branimir Karadzic. All rights reserved.\n"
+ "License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause\n\n"
+ );
+
+ fprintf(stderr
+ , "Usage: texturec -f <in> -o <out> -t <format>\n"
+
+ "\n"
+ "Supported input file types:\n"
+ " *.png Portable Network Graphics\n"
+ " *.tga Targa\n"
+ " *.dds Direct Draw Surface\n"
+ " *.ktx Khronos Texture\n"
+ " *.pvr PowerVR\n"
+
+ "\n"
+ "Options:\n"
+ " -f <file path> Input file path.\n"
+ " -o <file path> Output file path (file will be written in KTX format).\n"
+ " -t <format> Output format type (BC1/2/3/4/5, ETC1, PVR14, etc.).\n"
+ " -m, --mips Generate mip-maps.\n"
+
+ "\n"
+ "For additional information, see https://github.com/bkaradzic/bgfx\n"
+ );
}
int main(int _argc, const char* _argv[])
{
bx::CommandLine cmdLine(_argc, _argv);
- const char* inputFileName = cmdLine.findOption('i');
+ if (cmdLine.hasArg('h', "help") )
+ {
+ help();
+ return EXIT_FAILURE;
+ }
+ const char* inputFileName = cmdLine.findOption('f');
if (NULL == inputFileName)
{
- return 0;
+ help("Input file must be specified.");
+ return EXIT_FAILURE;
+ }
+
+ const char* outputFileName = cmdLine.findOption('o');
+ if (NULL == outputFileName)
+ {
+ help("Output file must be specified.");
+ return EXIT_FAILURE;
}
bx::CrtFileReader reader;
- bx::open(&reader, inputFileName);
+ if (0 != bx::open(&reader, inputFileName) )
+ {
+ help("Failed to open input file.");
+ return EXIT_FAILURE;
+ }
+
+ const bool mips = cmdLine.hasArg('m', "mips");
+ const char* type = cmdLine.findOption('t');
+ bgfx::TextureFormat::Enum format = bgfx::TextureFormat::BGRA8;
+
+ if (NULL != type)
+ {
+ format = bgfx::getFormat(type);
+
+ if (!isValid(format) )
+ {
+ help("Invalid format specified.");
+ return EXIT_FAILURE;
+ }
+ }
+
uint32_t size = (uint32_t)bx::getSize(&reader);
- const Memory* mem = alloc(size);
+ const bgfx::Memory* mem = bgfx::alloc(size);
bx::read(&reader, mem->data, mem->size);
bx::close(&reader);
- ImageContainer imageContainer;
-
- if (imageParse(imageContainer, mem->data, mem->size) )
{
- bool decompress = cmdLine.hasArg('d');
+ using namespace bgfx;
+
+ uint8_t* decodedImage = NULL;
+ ImageContainer imageContainer;
- if (decompress
- || 0 == imageContainer.m_format)
+ bool loaded = imageParse(imageContainer, mem->data, mem->size);
+ if (!loaded)
{
- for (uint8_t side = 0, numSides = imageContainer.m_cubeMap ? 6 : 1; side < numSides; ++side)
- {
- uint32_t width = imageContainer.m_width;
- uint32_t height = imageContainer.m_height;
+ int width = 0;
+ int height = 0;
+ int comp = 0;
- for (uint32_t lod = 0, num = imageContainer.m_numMips; lod < num; ++lod)
- {
- width = bx::uint32_max(1, width);
- height = bx::uint32_max(1, height);
+ decodedImage = stbi_load_from_memory( (uint8_t*)mem->data, mem->size, &width, &height, &comp, 4);
+ loaded = NULL != decodedImage;
- ImageMip mip;
- if (imageGetRawData(imageContainer, side, lod, mem->data, mem->size, mip) )
- {
- uint32_t dstpitch = width*4;
- uint8_t* bits = (uint8_t*)malloc(dstpitch*height);
-
- if (width != mip.m_width
- || height != mip.m_height)
- {
- uint8_t* temp = (uint8_t*)realloc(NULL, mip.m_width*mip.m_height*4);
- imageDecodeToBgra8(temp, mip.m_data, mip.m_width, mip.m_height, mip.m_width*4, mip.m_format);
- uint32_t srcpitch = mip.m_width*4;
-
- for (uint32_t yy = 0; yy < height; ++yy)
- {
- uint8_t* src = &temp[yy*srcpitch];
- uint8_t* dst = &bits[yy*dstpitch];
-
- for (uint32_t xx = 0; xx < width; ++xx)
- {
- memcpy(dst, src, 4);
- dst += 4;
- src += 4;
- }
- }
-
- free(temp);
- }
- else
- {
- imageDecodeToBgra8(bits, mip.m_data, mip.m_width, mip.m_height, mip.m_width*4, mip.m_format);
- }
-
- char filePath[256];
- bx::snprintf(filePath, sizeof(filePath), "mip%d_%d.tga", side, lod);
-
- saveTga(filePath, width, height, dstpitch, bits);
- free(bits);
- }
+ if (loaded)
+ {
+ release(mem);
- width >>= 1;
- height >>= 1;
- }
+ mem = makeRef(decodedImage, width*height*4);
+
+ imageContainer.m_data = mem->data;
+ imageContainer.m_size = mem->size;
+ imageContainer.m_offset = 0;
+ imageContainer.m_width = width;
+ imageContainer.m_height = height;
+ imageContainer.m_depth = 1;
+ imageContainer.m_format = bgfx::TextureFormat::RGBA8;
+ imageContainer.m_numMips = 1;
+ imageContainer.m_hasAlpha = true;
+ imageContainer.m_cubeMap = false;
+ imageContainer.m_ktx = false;
+ imageContainer.m_ktxLE = false;
+ imageContainer.m_srgb = false;
}
}
- else
+
+ if (loaded)
{
- for (uint32_t lod = 0, num = imageContainer.m_numMips; lod < num; ++lod)
+ bx::CrtAllocator allocator;
+ const Memory* output = NULL;
+
+ ImageMip mip;
+ if (imageGetRawData(imageContainer, 0, 0, mem->data, mem->size, mip) )
+ {
+ uint32_t size = imageGetSize(TextureFormat::RGBA8, mip.m_width, mip.m_height);
+ uint8_t* rgba = (uint8_t*)BX_ALLOC(&allocator, size);
+
+ imageDecodeToRgba8(rgba
+ , mip.m_data
+ , mip.m_width
+ , mip.m_height
+ , mip.m_width*mip.m_bpp/8
+ , mip.m_format
+ );
+
+ uint8_t numMips = mips
+ ? imageGetNumMips(format, mip.m_width, mip.m_height)
+ : 1
+ ;
+ imageContainer.m_size = imageGetSize(format, mip.m_width, mip.m_height, 0, false, numMips);
+ imageContainer.m_format = format;
+ output = alloc(imageContainer.m_size);
+
+ imageEncodeFromRgba8(output->data, rgba, mip.m_width, mip.m_height, format);
+
+ for (uint8_t lod = 1; lod < numMips; ++lod)
+ {
+ ImageMip mip1;
+ imageGetRawData(imageContainer, 0, lod, output->data, output->size, mip1);
+ uint8_t* data = const_cast<uint8_t*>(mip1.m_data);
+
+ uint32_t width = bx::uint32_max(1, mip.m_width >>lod);
+ uint32_t height = bx::uint32_max(1, mip.m_height>>lod);
+ imageRgba8Downsample2x2(width, height, width*4, rgba, rgba);
+ imageEncodeFromRgba8(data, rgba, mip.m_width, mip.m_height, format);
+ }
+
+ BX_FREE(&allocator, rgba);
+ }
+
+ if (NULL != output)
{
- ImageMip mip;
- if (imageGetRawData(imageContainer, 0, lod, mem->data, mem->size, mip) )
+ bx::CrtFileWriter writer;
+ if (0 == bx::open(&writer, outputFileName) )
{
- char filePath[256];
- bx::snprintf(filePath, sizeof(filePath), "mip%d.bin", lod);
+ if (NULL != bx::stristr(outputFileName, ".ktx") )
+ {
+ imageWriteKtx(&writer, imageContainer, output->data, output->size);
+ }
- bx::CrtFileWriter writer;
- bx::open(&writer, filePath);
- printf("mip%d, size %d\n", lod, mip.m_size);
- bx::write(&writer, mip.m_data, mip.m_size);
bx::close(&writer);
}
+
+ release(output);
}
}
+
+ release(mem);
}
return EXIT_SUCCESS;
diff --git a/3rdparty/bx/LICENSE b/3rdparty/bx/LICENSE
index cb01ac80cd2..c80afb7366a 100644
--- a/3rdparty/bx/LICENSE
+++ b/3rdparty/bx/LICENSE
@@ -1,5 +1,5 @@
-Copyright 2010-2015 Branimir Karadzic. All rights reserved.
-
+Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+
https://github.com/bkaradzic/bx
Redistribution and use in source and binary forms, with or without modification,
diff --git a/3rdparty/bx/README.md b/3rdparty/bx/README.md
index b29eb1ef702..c864c84fbab 100644
--- a/3rdparty/bx/README.md
+++ b/3rdparty/bx/README.md
@@ -14,7 +14,7 @@ https://github.com/bkaradzic/bx
[License (BSD 2-clause)](https://github.com/bkaradzic/bx/blob/master/LICENSE)
-----------------------------------------------------------------------------
- Copyright 2010-2015 Branimir Karadzic. All rights reserved.
+ Copyright 2010-2016 Branimir Karadzic. All rights reserved.
https://github.com/bkaradzic/bx
diff --git a/3rdparty/bx/include/bx/allocator.h b/3rdparty/bx/include/bx/allocator.h
index 8d3e88ccdfd..50d526535b6 100644
--- a/3rdparty/bx/include/bx/allocator.h
+++ b/3rdparty/bx/include/bx/allocator.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2010-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
*/
#ifndef BX_ALLOCATOR_H_HEADER_GUARD
@@ -61,30 +61,32 @@ namespace bx
struct BX_NO_VTABLE AllocatorI
{
virtual ~AllocatorI() = 0;
- virtual void* alloc(size_t _size, size_t _align, const char* _file, uint32_t _line) = 0;
- virtual void free(void* _ptr, size_t _align, const char* _file, uint32_t _line) = 0;
+
+ /// Allocated, resizes memory block or frees memory.
+ ///
+ /// @param[in] _ptr If _ptr is NULL new block will be allocated.
+ /// @param[in] _size If _ptr is set, and _size is 0, memory will be freed.
+ /// @param[in] _align Alignment.
+ /// @param[in] _file Debug file path info.
+ /// @param[in] _line Debug file line info.
+ virtual void* realloc(void* _ptr, size_t _size, size_t _align, const char* _file, uint32_t _line) = 0;
};
inline AllocatorI::~AllocatorI()
{
}
- struct BX_NO_VTABLE ReallocatorI : public AllocatorI
- {
- virtual void* realloc(void* _ptr, size_t _size, size_t _align, const char* _file, uint32_t _line) = 0;
- };
-
inline void* alloc(AllocatorI* _allocator, size_t _size, size_t _align = 0, const char* _file = NULL, uint32_t _line = 0)
{
- return _allocator->alloc(_size, _align, _file, _line);
+ return _allocator->realloc(NULL, _size, _align, _file, _line);
}
inline void free(AllocatorI* _allocator, void* _ptr, size_t _align = 0, const char* _file = NULL, uint32_t _line = 0)
{
- _allocator->free(_ptr, _align, _file, _line);
+ _allocator->realloc(_ptr, 0, _align, _file, _line);
}
- inline void* realloc(ReallocatorI* _allocator, void* _ptr, size_t _size, size_t _align = 0, const char* _file = NULL, uint32_t _line = 0)
+ inline void* realloc(AllocatorI* _allocator, void* _ptr, size_t _size, size_t _align = 0, const char* _file = NULL, uint32_t _line = 0)
{
return _allocator->realloc(_ptr, _size, _align, _file, _line);
}
@@ -107,7 +109,7 @@ namespace bx
free(_allocator, ptr, 0, _file, _line);
}
- static inline void* alignedRealloc(ReallocatorI* _allocator, void* _ptr, size_t _size, size_t _align, const char* _file = NULL, uint32_t _line = 0)
+ static inline void* alignedRealloc(AllocatorI* _allocator, void* _ptr, size_t _size, size_t _align, const char* _file = NULL, uint32_t _line = 0)
{
if (NULL == _ptr)
{
@@ -144,7 +146,7 @@ namespace bx
}
#if BX_CONFIG_ALLOCATOR_CRT
- class CrtAllocator : public ReallocatorI
+ class CrtAllocator : public AllocatorI
{
public:
CrtAllocator()
@@ -155,39 +157,43 @@ namespace bx
{
}
- virtual void* alloc(size_t _size, size_t _align, const char* _file, uint32_t _line) BX_OVERRIDE
+ virtual void* realloc(void* _ptr, size_t _size, size_t _align, const char* _file, uint32_t _line) BX_OVERRIDE
{
- if (BX_CONFIG_ALLOCATOR_NATURAL_ALIGNMENT >= _align)
+ if (0 == _size)
{
- return ::malloc(_size);
- }
+ if (NULL != _ptr)
+ {
+ if (BX_CONFIG_ALLOCATOR_NATURAL_ALIGNMENT >= _align)
+ {
+ ::free(_ptr);
+ return NULL;
+ }
# if BX_COMPILER_MSVC
- BX_UNUSED(_file, _line);
- return _aligned_malloc(_size, _align);
+ BX_UNUSED(_file, _line);
+ _aligned_free(_ptr);
# else
- return bx::alignedAlloc(this, _size, _align, _file, _line);
+ bx::alignedFree(this, _ptr, _align, _file, _line);
# endif // BX_
- }
+ }
- virtual void free(void* _ptr, size_t _align, const char* _file, uint32_t _line) BX_OVERRIDE
- {
- if (BX_CONFIG_ALLOCATOR_NATURAL_ALIGNMENT >= _align)
- {
- ::free(_ptr);
- return;
+ return NULL;
}
+ else if (NULL == _ptr)
+ {
+ if (BX_CONFIG_ALLOCATOR_NATURAL_ALIGNMENT >= _align)
+ {
+ return ::malloc(_size);
+ }
# if BX_COMPILER_MSVC
- BX_UNUSED(_file, _line);
- _aligned_free(_ptr);
+ BX_UNUSED(_file, _line);
+ return _aligned_malloc(_size, _align);
# else
- bx::alignedFree(this, _ptr, _align, _file, _line);
+ return bx::alignedAlloc(this, _size, _align, _file, _line);
# endif // BX_
- }
+ }
- virtual void* realloc(void* _ptr, size_t _size, size_t _align, const char* _file, uint32_t _line) BX_OVERRIDE
- {
if (BX_CONFIG_ALLOCATOR_NATURAL_ALIGNMENT >= _align)
{
return ::realloc(_ptr, _size);
diff --git a/3rdparty/bx/include/bx/bx.h b/3rdparty/bx/include/bx/bx.h
index 48ba9701fb8..7ada4b2b970 100644
--- a/3rdparty/bx/include/bx/bx.h
+++ b/3rdparty/bx/include/bx/bx.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2010-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
*/
#ifndef BX_H_HEADER_GUARD
diff --git a/3rdparty/bx/include/bx/cl.h b/3rdparty/bx/include/bx/cl.h
index d42ff40781f..17b7bafd403 100644
--- a/3rdparty/bx/include/bx/cl.h
+++ b/3rdparty/bx/include/bx/cl.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2010-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
*/
#ifndef BX_CL_H_HEADER_GUARD
diff --git a/3rdparty/bx/include/bx/commandline.h b/3rdparty/bx/include/bx/commandline.h
index d366effc708..2106b87ed5a 100644
--- a/3rdparty/bx/include/bx/commandline.h
+++ b/3rdparty/bx/include/bx/commandline.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2010-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
*/
#ifndef BX_COMMANDLINE_H_HEADER_GUARD
diff --git a/3rdparty/bx/include/bx/config.h b/3rdparty/bx/include/bx/config.h
index 9a439f98651..3837193e19a 100644
--- a/3rdparty/bx/include/bx/config.h
+++ b/3rdparty/bx/include/bx/config.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2010-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
*/
#ifndef BX_CONFIG_H_HEADER_GUARD
@@ -23,7 +23,7 @@
#ifndef BX_CONFIG_CRT_FILE_READER_WRITER
# define BX_CONFIG_CRT_FILE_READER_WRITER (0 \
|| BX_PLATFORM_ANDROID \
- || BX_PLATFORM_FREEBSD \
+ || BX_PLATFORM_BSD \
|| BX_PLATFORM_EMSCRIPTEN \
|| BX_PLATFORM_IOS \
|| BX_PLATFORM_LINUX \
diff --git a/3rdparty/bx/include/bx/cpu.h b/3rdparty/bx/include/bx/cpu.h
index c3713027fbb..a4d5c65f8c8 100644
--- a/3rdparty/bx/include/bx/cpu.h
+++ b/3rdparty/bx/include/bx/cpu.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2010-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
*/
#ifndef BX_CPU_H_HEADER_GUARD
@@ -19,6 +19,9 @@
# include <intrin.h>
# include <windows.h>
# endif // !BX_PLATFORM_XBOX360
+# if BX_PLATFORM_WINRT
+# define _InterlockedExchangeAdd64 InterlockedExchangeAdd64
+# endif // BX_PLATFORM_WINRT
extern "C" void _ReadBarrier();
extern "C" void _WriteBarrier();
extern "C" void _ReadWriteBarrier();
diff --git a/3rdparty/bx/include/bx/debug.h b/3rdparty/bx/include/bx/debug.h
index 3e7afb29f6f..fc78b7b3e07 100644
--- a/3rdparty/bx/include/bx/debug.h
+++ b/3rdparty/bx/include/bx/debug.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2010-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
*/
#ifndef BX_DEBUG_H_HEADER_GUARD
diff --git a/3rdparty/bx/include/bx/endian.h b/3rdparty/bx/include/bx/endian.h
index b8df391745e..0781adec589 100644
--- a/3rdparty/bx/include/bx/endian.h
+++ b/3rdparty/bx/include/bx/endian.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2010-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
*/
#ifndef BX_ENDIAN_H_HEADER_GUARD
diff --git a/3rdparty/bx/include/bx/float4_langext.h b/3rdparty/bx/include/bx/float4_langext.h
index 8a6c6cd222c..c5c3dddfa02 100644
--- a/3rdparty/bx/include/bx/float4_langext.h
+++ b/3rdparty/bx/include/bx/float4_langext.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2010-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
*/
#ifndef BX_FLOAT4_LANGEXT_H_HEADER_GUARD
diff --git a/3rdparty/bx/include/bx/float4_neon.h b/3rdparty/bx/include/bx/float4_neon.h
index b00c9c98da1..3b6fa185296 100644
--- a/3rdparty/bx/include/bx/float4_neon.h
+++ b/3rdparty/bx/include/bx/float4_neon.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2010-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
*/
#ifndef BX_FLOAT4_NEON_H_HEADER_GUARD
diff --git a/3rdparty/bx/include/bx/float4_ni.h b/3rdparty/bx/include/bx/float4_ni.h
index c70915147d4..e85c1cd9117 100644
--- a/3rdparty/bx/include/bx/float4_ni.h
+++ b/3rdparty/bx/include/bx/float4_ni.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2010-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
*/
#ifndef BX_FLOAT4_NI_H_HEADER_GUARD
diff --git a/3rdparty/bx/include/bx/float4_ref.h b/3rdparty/bx/include/bx/float4_ref.h
index 277e2a74405..e54862ca371 100644
--- a/3rdparty/bx/include/bx/float4_ref.h
+++ b/3rdparty/bx/include/bx/float4_ref.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2010-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
*/
#ifndef BX_FLOAT4_REF_H_HEADER_GUARD
diff --git a/3rdparty/bx/include/bx/float4_sse.h b/3rdparty/bx/include/bx/float4_sse.h
index 070d2018ad3..73272518efe 100644
--- a/3rdparty/bx/include/bx/float4_sse.h
+++ b/3rdparty/bx/include/bx/float4_sse.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2010-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
*/
#ifndef BX_FLOAT4_SSE_H_HEADER_GUARD
diff --git a/3rdparty/bx/include/bx/float4_t.h b/3rdparty/bx/include/bx/float4_t.h
index 6aacf4cf3c3..78fd4e8ebb5 100644
--- a/3rdparty/bx/include/bx/float4_t.h
+++ b/3rdparty/bx/include/bx/float4_t.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2010-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
*/
#ifndef BX_FLOAT4_T_H_HEADER_GUARD
diff --git a/3rdparty/bx/include/bx/float4x4_t.h b/3rdparty/bx/include/bx/float4x4_t.h
index 435aaec2a4c..e1bc4e1ca61 100644
--- a/3rdparty/bx/include/bx/float4x4_t.h
+++ b/3rdparty/bx/include/bx/float4x4_t.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2010-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
*/
#ifndef BX_FLOAT4X4_H_HEADER_GUARD
diff --git a/3rdparty/bx/include/bx/foreach.h b/3rdparty/bx/include/bx/foreach.h
index b51aa237958..43abf621105 100644
--- a/3rdparty/bx/include/bx/foreach.h
+++ b/3rdparty/bx/include/bx/foreach.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2010-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
*/
#ifndef BX_FOREACH_H_HEADER_GUARD
diff --git a/3rdparty/bx/include/bx/fpumath.h b/3rdparty/bx/include/bx/fpumath.h
index 0aa92c8523c..0763f5bcb5f 100644
--- a/3rdparty/bx/include/bx/fpumath.h
+++ b/3rdparty/bx/include/bx/fpumath.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
*/
// FPU math lib
@@ -14,10 +14,10 @@
namespace bx
{
- static const float pi = 3.14159265358979323846f;
- static const float invPi = 1.0f/3.14159265358979323846f;
- static const float piHalf = 1.57079632679489661923f;
- static const float sqrt2 = 1.41421356237309504880f;
+ static const float pi = 3.14159265358979323846f;
+ static const float invPi = 1.0f/3.14159265358979323846f;
+ static const float piHalf = 1.57079632679489661923f;
+ static const float sqrt2 = 1.41421356237309504880f;
inline float toRad(float _deg)
{
@@ -89,11 +89,51 @@ namespace bx
return fabsf(_a);
}
+ inline float fsq(float _a)
+ {
+ return _a * _a;
+ }
+
+ inline float fsin(float _a)
+ {
+ return sinf(_a);
+ }
+
+ inline float fcos(float _a)
+ {
+ return cosf(_a);
+ }
+
+ inline float fpow(float _a, float _b)
+ {
+ return powf(_a, _b);
+ }
+
+ inline float fexp2(float _a)
+ {
+ return fpow(2.0f, _a);
+ }
+
+ inline float flog(float _a)
+ {
+ return logf(_a);
+ }
+
+ inline float flog2(float _a)
+ {
+ return flog(_a) * 1.442695041f;
+ }
+
inline float fsqrt(float _a)
{
return sqrtf(_a);
}
+ inline float frsqrt(float _a)
+ {
+ return 1.0f/fsqrt(_a);
+ }
+
inline float ffract(float _a)
{
return _a - floorf(_a);
@@ -101,7 +141,10 @@ namespace bx
inline bool fequal(float _a, float _b, float _epsilon)
{
- return fabsolute(_a - _b) <= _epsilon;
+ // http://realtimecollisiondetection.net/blog/?p=89
+ const float lhs = fabsolute(_a - _b);
+ const float rhs = _epsilon * fmax3(1.0f, fabsolute(_a), fabsolute(_b) );
+ return lhs <= rhs;
}
inline bool fequal(const float* __restrict _a, const float* __restrict _b, uint32_t _num, float _epsilon)
@@ -168,6 +211,13 @@ namespace bx
_result[2] = _a[2] + _b[2];
}
+ inline void vec3Add(float* __restrict _result, const float* __restrict _a, float _b)
+ {
+ _result[0] = _a[0] + _b;
+ _result[1] = _a[1] + _b;
+ _result[2] = _a[2] + _b;
+ }
+
inline void vec3Sub(float* __restrict _result, const float* __restrict _a, const float* __restrict _b)
{
_result[0] = _a[0] - _b[0];
@@ -175,6 +225,13 @@ namespace bx
_result[2] = _a[2] - _b[2];
}
+ inline void vec3Sub(float* __restrict _result, const float* __restrict _a, float _b)
+ {
+ _result[0] = _a[0] - _b;
+ _result[1] = _a[1] - _b;
+ _result[2] = _a[2] - _b;
+ }
+
inline void vec3Mul(float* __restrict _result, const float* __restrict _a, const float* __restrict _b)
{
_result[0] = _a[0] * _b[0];
@@ -206,6 +263,20 @@ namespace bx
return fsqrt(vec3Dot(_a, _a) );
}
+ inline void vec3Lerp(float* __restrict _result, const float* __restrict _a, const float* __restrict _b, float _t)
+ {
+ _result[0] = flerp(_a[0], _b[0], _t);
+ _result[1] = flerp(_a[1], _b[1], _t);
+ _result[2] = flerp(_a[2], _b[2], _t);
+ }
+
+ inline void vec3Lerp(float* __restrict _result, const float* __restrict _a, const float* __restrict _b, const float* __restrict _c)
+ {
+ _result[0] = flerp(_a[0], _b[0], _c[0]);
+ _result[1] = flerp(_a[1], _b[1], _c[1]);
+ _result[2] = flerp(_a[2], _b[2], _c[2]);
+ }
+
inline float vec3Norm(float* __restrict _result, const float* __restrict _a)
{
const float len = vec3Length(_a);
@@ -216,6 +287,27 @@ namespace bx
return len;
}
+ inline void vec3Min(float* __restrict _result, const float* __restrict _a, const float* __restrict _b)
+ {
+ _result[0] = fmin(_a[0], _b[0]);
+ _result[1] = fmin(_a[1], _b[1]);
+ _result[2] = fmin(_a[2], _b[2]);
+ }
+
+ inline void vec3Max(float* __restrict _result, const float* __restrict _a, const float* __restrict _b)
+ {
+ _result[0] = fmax(_a[0], _b[0]);
+ _result[1] = fmax(_a[1], _b[1]);
+ _result[2] = fmax(_a[2], _b[2]);
+ }
+
+ inline void vec3Rcp(float* __restrict _result, const float* __restrict _a)
+ {
+ _result[0] = 1.0f / _a[0];
+ _result[1] = 1.0f / _a[1];
+ _result[2] = 1.0f / _a[2];
+ }
+
inline void quatIdentity(float* _result)
{
_result[0] = 0.0f;
@@ -224,6 +316,14 @@ namespace bx
_result[3] = 1.0f;
}
+ inline void quatMove(float* __restrict _result, const float* __restrict _a)
+ {
+ _result[0] = _a[0];
+ _result[1] = _a[1];
+ _result[2] = _a[2];
+ _result[3] = _a[3];
+ }
+
inline void quatMulXYZ(float* __restrict _result, const float* __restrict _qa, const float* __restrict _qb)
{
const float ax = _qa[0];
@@ -267,6 +367,32 @@ namespace bx
_result[3] = _quat[3];
}
+ inline float quatDot(const float* __restrict _a, const float* __restrict _b)
+ {
+ return _a[0]*_b[0]
+ + _a[1]*_b[1]
+ + _a[2]*_b[2]
+ + _a[3]*_b[3]
+ ;
+ }
+
+ inline void quatNorm(float* __restrict _result, const float* __restrict _quat)
+ {
+ const float norm = quatDot(_quat, _quat);
+ if (0.0f < norm)
+ {
+ const float invNorm = 1.0f / fsqrt(norm);
+ _result[0] = _quat[0] * invNorm;
+ _result[1] = _quat[1] * invNorm;
+ _result[2] = _quat[2] * invNorm;
+ _result[3] = _quat[3] * invNorm;
+ }
+ else
+ {
+ quatIdentity(_result);
+ }
+ }
+
inline void quatToEuler(float* __restrict _result, const float* __restrict _quat)
{
const float x = _quat[0];
@@ -283,6 +409,17 @@ namespace bx
_result[2] = asinf (2.0f * (x * y + z * w) );
}
+ inline void quatRotateAxis(float* __restrict _result, const float* _axis, float _angle)
+ {
+ const float ha = _angle * 0.5f;
+ const float ca = cosf(ha);
+ const float sa = sinf(ha);
+ _result[0] = _axis[0] * sa;
+ _result[1] = _axis[1] * sa;
+ _result[2] = _axis[2] * sa;
+ _result[3] = ca;
+ }
+
inline void quatRotateX(float* _result, float _ax)
{
const float hx = _ax * 0.5f;
@@ -415,14 +552,8 @@ namespace bx
mtxQuatTranslation(_result, quat, _translation);
}
- inline void mtxLookAt(float* __restrict _result, const float* __restrict _eye, const float* __restrict _at, const float* __restrict _up = NULL)
+ inline void mtxLookAt_Impl(float* __restrict _result, const float* __restrict _eye, const float* __restrict _view, const float* __restrict _up = NULL)
{
- float tmp[4];
- vec3Sub(tmp, _at, _eye);
-
- float view[4];
- vec3Norm(view, tmp);
-
float up[3] = { 0.0f, 1.0f, 0.0f };
if (NULL != _up)
{
@@ -430,37 +561,66 @@ namespace bx
up[1] = _up[1];
up[2] = _up[2];
}
- vec3Cross(tmp, up, view);
+
+ float tmp[4];
+ vec3Cross(tmp, up, _view);
float right[4];
vec3Norm(right, tmp);
- vec3Cross(up, view, right);
+ vec3Cross(up, _view, right);
memset(_result, 0, sizeof(float)*16);
_result[ 0] = right[0];
_result[ 1] = up[0];
- _result[ 2] = view[0];
+ _result[ 2] = _view[0];
_result[ 4] = right[1];
_result[ 5] = up[1];
- _result[ 6] = view[1];
+ _result[ 6] = _view[1];
_result[ 8] = right[2];
_result[ 9] = up[2];
- _result[10] = view[2];
+ _result[10] = _view[2];
_result[12] = -vec3Dot(right, _eye);
_result[13] = -vec3Dot(up, _eye);
- _result[14] = -vec3Dot(view, _eye);
+ _result[14] = -vec3Dot(_view, _eye);
_result[15] = 1.0f;
}
- inline void mtxProjXYWH(float* _result, float _x, float _y, float _width, float _height, float _near, float _far, bool _oglNdc = false)
+ inline void mtxLookAtLh(float* __restrict _result, const float* __restrict _eye, const float* __restrict _at, const float* __restrict _up = NULL)
+ {
+ float tmp[4];
+ vec3Sub(tmp, _eye, _at);
+
+ float view[4];
+ vec3Norm(view, tmp);
+
+ mtxLookAt_Impl(_result, _eye, view, _up);
+ }
+
+ inline void mtxLookAtRh(float* __restrict _result, const float* __restrict _eye, const float* __restrict _at, const float* __restrict _up = NULL)
+ {
+ float tmp[4];
+ vec3Sub(tmp, _at, _eye);
+
+ float view[4];
+ vec3Norm(view, tmp);
+
+ mtxLookAt_Impl(_result, _eye, view, _up);
+ }
+
+ inline void mtxLookAt(float* __restrict _result, const float* __restrict _eye, const float* __restrict _at, const float* __restrict _up = NULL)
+ {
+ mtxLookAtRh(_result, _eye, _at, _up);
+ }
+
+ inline void mtxProjRhXYWH(float* _result, float _x, float _y, float _width, float _height, float _near, float _far, bool _oglNdc = false)
{
const float diff = _far-_near;
const float aa = _oglNdc ? (_far+_near)/diff : _far/diff;
- const float bb = _oglNdc ? -(2.0f*_far*_near)/diff : -_near*aa;
+ const float bb = _oglNdc ? (2.0f*_far*_near)/diff : _near*aa;
memset(_result, 0, sizeof(float)*16);
_result[ 0] = _width;
@@ -469,28 +629,80 @@ namespace bx
_result[ 9] = -_y;
_result[10] = aa;
_result[11] = 1.0f;
- _result[14] = bb;
+ _result[14] = -bb;
}
- inline void mtxProj(float* _result, float _ut, float _dt, float _lt, float _rt, float _near, float _far, bool _oglNdc = false)
+ inline void mtxProjRh(float* _result, float _ut, float _dt, float _lt, float _rt, float _near, float _far, bool _oglNdc = false)
{
const float width = 2.0f / (_lt + _rt);
const float height = 2.0f / (_ut + _dt);
const float xx = (_lt - _rt) * width * 0.5f;
const float yy = (_ut - _dt) * height * 0.5f;
- mtxProjXYWH(_result, xx, yy, width, height, _near, _far, _oglNdc);
+ mtxProjRhXYWH(_result, xx, yy, width, height, _near, _far, _oglNdc);
}
- inline void mtxProj(float* _result, const float _fov[4], float _near, float _far, bool _oglNdc = false)
+ inline void mtxProjRh(float* _result, const float _fov[4], float _near, float _far, bool _oglNdc = false)
{
- mtxProj(_result, _fov[0], _fov[1], _fov[2], _fov[3], _near, _far, _oglNdc);
+ mtxProjRh(_result, _fov[0], _fov[1], _fov[2], _fov[3], _near, _far, _oglNdc);
}
- inline void mtxProj(float* _result, float _fovy, float _aspect, float _near, float _far, bool _oglNdc = false)
+ inline void mtxProjRh(float* _result, float _fovy, float _aspect, float _near, float _far, bool _oglNdc = false)
{
const float height = 1.0f/tanf(toRad(_fovy)*0.5f);
const float width = height * 1.0f/_aspect;
- mtxProjXYWH(_result, 0.0f, 0.0f, width, height, _near, _far, _oglNdc);
+ mtxProjRhXYWH(_result, 0.0f, 0.0f, width, height, _near, _far, _oglNdc);
+ }
+
+ inline void mtxProjLhXYWH(float* _result, float _x, float _y, float _width, float _height, float _near, float _far, bool _oglNdc = false)
+ {
+ const float diff = _far-_near;
+ const float aa = _oglNdc ? (_far+_near)/diff : _far/diff;
+ const float bb = _oglNdc ? (2.0f*_far*_near)/diff : _near*aa;
+
+ memset(_result, 0, sizeof(float)*16);
+ _result[ 0] = _width;
+ _result[ 5] = _height;
+ _result[ 8] = _x;
+ _result[ 9] = -_y;
+ _result[10] = -aa;
+ _result[11] = -1.0f;
+ _result[14] = -bb;
+ }
+
+ inline void mtxProjLh(float* _result, float _ut, float _dt, float _lt, float _rt, float _near, float _far, bool _oglNdc = false)
+ {
+ const float width = 2.0f / (_lt + _rt);
+ const float height = 2.0f / (_ut + _dt);
+ const float xx = (_lt - _rt) * width * 0.5f;
+ const float yy = (_ut - _dt) * height * 0.5f;
+ mtxProjLhXYWH(_result, xx, yy, width, height, _near, _far, _oglNdc);
+ }
+
+ inline void mtxProjLh(float* _result, const float _fov[4], float _near, float _far, bool _oglNdc = false)
+ {
+ mtxProjLh(_result, _fov[0], _fov[1], _fov[2], _fov[3], _near, _far, _oglNdc);
+ }
+
+ inline void mtxProjLh(float* _result, float _fovy, float _aspect, float _near, float _far, bool _oglNdc = false)
+ {
+ const float height = 1.0f/tanf(toRad(_fovy)*0.5f);
+ const float width = height * 1.0f/_aspect;
+ mtxProjLhXYWH(_result, 0.0f, 0.0f, width, height, _near, _far, _oglNdc);
+ }
+
+ inline void mtxProj(float* _result, float _ut, float _dt, float _lt, float _rt, float _near, float _far, bool _oglNdc = false)
+ {
+ mtxProjRh(_result, _ut, _dt, _lt, _rt, _near, _far, _oglNdc);
+ }
+
+ inline void mtxProj(float* _result, const float _fov[4], float _near, float _far, bool _oglNdc = false)
+ {
+ mtxProjRh(_result, _fov, _near, _far, _oglNdc);
+ }
+
+ inline void mtxProj(float* _result, float _fovy, float _aspect, float _near, float _far, bool _oglNdc = false)
+ {
+ mtxProjRh(_result, _fovy, _aspect, _near, _far, _oglNdc);
}
inline void mtxOrtho(float* _result, float _left, float _right, float _bottom, float _top, float _near, float _far, float _offset = 0.0f)
diff --git a/3rdparty/bx/include/bx/handlealloc.h b/3rdparty/bx/include/bx/handlealloc.h
index 332fa1d96f1..d947256a9e2 100644
--- a/3rdparty/bx/include/bx/handlealloc.h
+++ b/3rdparty/bx/include/bx/handlealloc.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2010-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
*/
#ifndef BX_HANDLE_ALLOC_H_HEADER_GUARD
diff --git a/3rdparty/bx/include/bx/hash.h b/3rdparty/bx/include/bx/hash.h
index d2f11731552..de3f21c4c0e 100644
--- a/3rdparty/bx/include/bx/hash.h
+++ b/3rdparty/bx/include/bx/hash.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2010-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
*/
#ifndef BX_HASH_H_HEADER_GUARD
diff --git a/3rdparty/bx/include/bx/macros.h b/3rdparty/bx/include/bx/macros.h
index d94c29f028f..b4eaeae9287 100644
--- a/3rdparty/bx/include/bx/macros.h
+++ b/3rdparty/bx/include/bx/macros.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2010-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
*/
#ifndef BX_MACROS_H_HEADER_GUARD
diff --git a/3rdparty/bx/include/bx/maputil.h b/3rdparty/bx/include/bx/maputil.h
index f9655f5c7a2..f334aeff0ce 100644
--- a/3rdparty/bx/include/bx/maputil.h
+++ b/3rdparty/bx/include/bx/maputil.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2010-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
*/
#ifndef BX_MAPUTIL_H_HEADER_GUARD
diff --git a/3rdparty/bx/include/bx/mpscqueue.h b/3rdparty/bx/include/bx/mpscqueue.h
index d7f3966d5ae..5a3db68641a 100644
--- a/3rdparty/bx/include/bx/mpscqueue.h
+++ b/3rdparty/bx/include/bx/mpscqueue.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2010-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
*/
#ifndef BX_MPSCQUEUE_H_HEADER_GUARD
@@ -29,7 +29,7 @@ namespace bx
void push(Ty* _ptr) // producer only
{
- LwMutexScope $(m_write);
+ LwMutexScope lock(m_write);
m_queue.push(_ptr);
}
diff --git a/3rdparty/bx/include/bx/mutex.h b/3rdparty/bx/include/bx/mutex.h
index ee6bd33871b..a68525f14cd 100644
--- a/3rdparty/bx/include/bx/mutex.h
+++ b/3rdparty/bx/include/bx/mutex.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2010-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
*/
#ifndef BX_MUTEX_H_HEADER_GUARD
diff --git a/3rdparty/bx/include/bx/os.h b/3rdparty/bx/include/bx/os.h
index 9dc1a607404..50fca7f0fbe 100644
--- a/3rdparty/bx/include/bx/os.h
+++ b/3rdparty/bx/include/bx/os.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2010-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
*/
#ifndef BX_OS_H_HEADER_GUARD
@@ -14,8 +14,7 @@
# include <psapi.h>
#elif BX_PLATFORM_ANDROID \
|| BX_PLATFORM_EMSCRIPTEN \
- || BX_PLATFORM_FREEBSD \
- || BX_PLATFORM_NETBSD \
+ || BX_PLATFORM_BSD \
|| BX_PLATFORM_IOS \
|| BX_PLATFORM_LINUX \
|| BX_PLATFORM_NACL \
@@ -24,8 +23,7 @@
|| BX_PLATFORM_RPI
# include <sched.h> // sched_yield
-# if BX_PLATFORM_FREEBSD \
- || BX_PLATFORM_NETBSD \
+# if BX_PLATFORM_BSD \
|| BX_PLATFORM_IOS \
|| BX_PLATFORM_NACL \
|| BX_PLATFORM_OSX \
@@ -105,7 +103,7 @@ namespace bx
return (pid_t)::syscall(SYS_gettid);
#elif BX_PLATFORM_IOS || BX_PLATFORM_OSX
return (mach_port_t)::pthread_mach_thread_np(pthread_self() );
-#elif BX_PLATFORM_FREEBSD || BX_PLATFORM_NACL || BX_PLATFORM_NETBSD
+#elif BX_PLATFORM_BSD || BX_PLATFORM_NACL
// Casting __nc_basic_thread_data*... need better way to do this.
return *(uint32_t*)::pthread_self();
#else
diff --git a/3rdparty/bx/include/bx/platform.h b/3rdparty/bx/include/bx/platform.h
index c25febcd13f..c41ae0d11be 100644
--- a/3rdparty/bx/include/bx/platform.h
+++ b/3rdparty/bx/include/bx/platform.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2010-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
*/
#ifndef BX_PLATFORM_H_HEADER_GUARD
@@ -14,8 +14,7 @@
#define BX_PLATFORM_ANDROID 0
#define BX_PLATFORM_EMSCRIPTEN 0
-#define BX_PLATFORM_FREEBSD 0
-#define BX_PLATFORM_NETBSD 0
+#define BX_PLATFORM_BSD 0
#define BX_PLATFORM_IOS 0
#define BX_PLATFORM_LINUX 0
#define BX_PLATFORM_NACL 0
@@ -175,7 +174,11 @@
# define BX_PLATFORM_IOS 1
#elif defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__)
# undef BX_PLATFORM_OSX
-# define BX_PLATFORM_OSX 1
+# if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__)
+# define BX_PLATFORM_OSX __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__
+# else
+# define BX_PLATFORM_OSX 1
+# endif // defined(MAC_OS_X_VERSION_MAX_ALLOWED)
#elif defined(__EMSCRIPTEN__)
# undef BX_PLATFORM_EMSCRIPTEN
# define BX_PLATFORM_EMSCRIPTEN 1
@@ -185,12 +188,9 @@
#elif defined(__QNX__)
# undef BX_PLATFORM_QNX
# define BX_PLATFORM_QNX 1
-#elif defined(__FreeBSD__)
-# undef BX_PLATFORM_FREEBSD
-# define BX_PLATFORM_FREEBSD 1
-#elif defined(__NetBSD__)
-# undef BX_PLATFORM_NETBSD
-# define BX_PLATFORM_NETBSD 1
+#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__)
+# undef BX_PLATFORM_BSD
+# define BX_PLATFORM_BSD 1
#else
# error "BX_PLATFORM_* is not defined!"
#endif //
@@ -198,8 +198,7 @@
#define BX_PLATFORM_POSIX (0 \
|| BX_PLATFORM_ANDROID \
|| BX_PLATFORM_EMSCRIPTEN \
- || BX_PLATFORM_FREEBSD \
- || BX_PLATFORM_NETBSD \
+ || BX_PLATFORM_BSD \
|| BX_PLATFORM_IOS \
|| BX_PLATFORM_LINUX \
|| BX_PLATFORM_NACL \
@@ -247,10 +246,8 @@
BX_STRINGIZE(__EMSCRIPTEN_major__) "." \
BX_STRINGIZE(__EMSCRIPTEN_minor__) "." \
BX_STRINGIZE(__EMSCRIPTEN_tiny__)
-#elif BX_PLATFORM_FREEBSD
-# define BX_PLATFORM_NAME "FreeBSD"
-#elif BX_PLATFORM_NETBSD
-# define BX_PLATFORM_NAME "NetBSD"
+#elif BX_PLATFORM_BSD
+# define BX_PLATFORM_NAME "BSD"
#elif BX_PLATFORM_IOS
# define BX_PLATFORM_NAME "iOS"
#elif BX_PLATFORM_LINUX
diff --git a/3rdparty/bx/include/bx/process.h b/3rdparty/bx/include/bx/process.h
index 60fc24c5d9b..d643181771e 100644
--- a/3rdparty/bx/include/bx/process.h
+++ b/3rdparty/bx/include/bx/process.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2010-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
*/
#ifndef BX_PROCESS_H_HEADER_GUARD
diff --git a/3rdparty/bx/include/bx/radixsort.h b/3rdparty/bx/include/bx/radixsort.h
index d28f65102fd..8118a0aa0bf 100644
--- a/3rdparty/bx/include/bx/radixsort.h
+++ b/3rdparty/bx/include/bx/radixsort.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2010-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
*/
#ifndef BX_RADIXSORT_H_HEADER_GUARD
diff --git a/3rdparty/bx/include/bx/readerwriter.h b/3rdparty/bx/include/bx/readerwriter.h
index 3d681b8b0cb..c673eed388a 100644
--- a/3rdparty/bx/include/bx/readerwriter.h
+++ b/3rdparty/bx/include/bx/readerwriter.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2010-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
*/
#ifndef BX_READERWRITER_H_HEADER_GUARD
@@ -17,7 +17,7 @@
#if BX_COMPILER_MSVC_COMPATIBLE
# define fseeko64 _fseeki64
# define ftello64 _ftelli64
-#elif BX_PLATFORM_ANDROID || BX_PLATFORM_FREEBSD || BX_PLATFORM_IOS || BX_PLATFORM_OSX || BX_PLATFORM_QNX
+#elif BX_PLATFORM_ANDROID || BX_PLATFORM_BSD || BX_PLATFORM_IOS || BX_PLATFORM_OSX || BX_PLATFORM_QNX
# define fseeko64 fseeko
# define ftello64 ftello
#endif // BX_
@@ -265,7 +265,7 @@ namespace bx
class MemoryBlock : public MemoryBlockI
{
public:
- MemoryBlock(ReallocatorI* _allocator)
+ MemoryBlock(AllocatorI* _allocator)
: m_allocator(_allocator)
, m_data(NULL)
, m_size(0)
@@ -294,7 +294,7 @@ namespace bx
}
private:
- ReallocatorI* m_allocator;
+ AllocatorI* m_allocator;
void* m_data;
uint32_t m_size;
};
diff --git a/3rdparty/bx/include/bx/ringbuffer.h b/3rdparty/bx/include/bx/ringbuffer.h
index 8b24e0e7b7a..f3904f4694b 100644
--- a/3rdparty/bx/include/bx/ringbuffer.h
+++ b/3rdparty/bx/include/bx/ringbuffer.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2010-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
*/
#ifndef BX_RINGBUFFER_H_HEADER_GUARD
diff --git a/3rdparty/bx/include/bx/rng.h b/3rdparty/bx/include/bx/rng.h
index f52e5eb6af0..0a1976d6fc8 100644
--- a/3rdparty/bx/include/bx/rng.h
+++ b/3rdparty/bx/include/bx/rng.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2010-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
*/
#ifndef BX_RNG_H_HEADER_GUARD
diff --git a/3rdparty/bx/include/bx/sem.h b/3rdparty/bx/include/bx/sem.h
index 785bff349af..85c66168d58 100644
--- a/3rdparty/bx/include/bx/sem.h
+++ b/3rdparty/bx/include/bx/sem.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2010-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
*/
#ifndef BX_SEM_H_HEADER_GUARD
@@ -83,14 +83,35 @@ namespace bx
int result = pthread_mutex_lock(&m_mutex);
BX_CHECK(0 == result, "pthread_mutex_lock %d", result);
-# if BX_PLATFORM_NACL || BX_PLATFORM_OSX || BX_PLATFORM_IOS
+# if BX_PLATFORM_NACL || BX_PLATFORM_OSX
BX_UNUSED(_msecs);
- BX_CHECK(-1 == _msecs, "NaCl, iOS and OSX don't support pthread_cond_timedwait at this moment.");
+ BX_CHECK(-1 == _msecs, "NaCl and OSX don't support pthread_cond_timedwait at this moment.");
while (0 == result
- && 0 >= m_count)
+ && 0 >= m_count)
{
result = pthread_cond_wait(&m_cond, &m_mutex);
}
+# elif BX_PLATFORM_IOS
+ if (-1 == _msecs)
+ {
+ while (0 == result
+ && 0 >= m_count)
+ {
+ result = pthread_cond_wait(&m_cond, &m_mutex);
+ }
+ }
+ else
+ {
+ timespec ts;
+ ts.tv_sec = _msecs/1000;
+ ts.tv_nsec = (_msecs%1000)*1000;
+
+ while (0 == result
+ && 0 >= m_count)
+ {
+ result = pthread_cond_timedwait_relative_np(&m_cond, &m_mutex, &ts);
+ }
+ }
# else
timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);
diff --git a/3rdparty/bx/include/bx/spscqueue.h b/3rdparty/bx/include/bx/spscqueue.h
index f2eed23fa65..0e2ceacc362 100644
--- a/3rdparty/bx/include/bx/spscqueue.h
+++ b/3rdparty/bx/include/bx/spscqueue.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2010-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
*/
#ifndef BX_SPSCQUEUE_H_HEADER_GUARD
diff --git a/3rdparty/bx/include/bx/string.h b/3rdparty/bx/include/bx/string.h
index 7f9224a5a03..5dc5a434751 100644
--- a/3rdparty/bx/include/bx/string.h
+++ b/3rdparty/bx/include/bx/string.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2010-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
*/
#ifndef BX_STRING_H_HEADER_GUARD
diff --git a/3rdparty/bx/include/bx/thread.h b/3rdparty/bx/include/bx/thread.h
index 698418170cd..fb9e07df6f8 100644
--- a/3rdparty/bx/include/bx/thread.h
+++ b/3rdparty/bx/include/bx/thread.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2010-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
*/
#ifndef BX_THREAD_H_HEADER_GUARD
@@ -63,9 +63,9 @@ namespace bx
m_running = true;
#if BX_PLATFORM_WINDOWS || BX_PLATFORM_XBOX360
- m_handle = CreateThread(NULL
+ m_handle = ::CreateThread(NULL
, m_stackSize
- , threadFunc
+ , (LPTHREAD_START_ROUTINE)threadFunc
, this
, 0
, NULL
@@ -149,7 +149,7 @@ namespace bx
{
#if BX_PLATFORM_OSX || BX_PLATFORM_IOS
pthread_setname_np(_name);
-#elif (BX_PLATFORM_LINUX && defined(__GLIBC__)) || BX_PLATFORM_FREEBSD
+#elif (BX_PLATFORM_LINUX && defined(__GLIBC__)) || BX_PLATFORM_BSD
pthread_setname_np(m_handle, _name);
#elif BX_PLATFORM_WINDOWS && BX_COMPILER_MSVC
# pragma pack(push, 8)
diff --git a/3rdparty/bx/include/bx/timer.h b/3rdparty/bx/include/bx/timer.h
index 7d4657fcf4a..c3d16d29793 100644
--- a/3rdparty/bx/include/bx/timer.h
+++ b/3rdparty/bx/include/bx/timer.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2010-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
*/
#ifndef BX_TIMER_H_HEADER_GUARD
diff --git a/3rdparty/bx/include/bx/tokenizecmd.h b/3rdparty/bx/include/bx/tokenizecmd.h
index 554fcd544be..5bb44de1737 100644
--- a/3rdparty/bx/include/bx/tokenizecmd.h
+++ b/3rdparty/bx/include/bx/tokenizecmd.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2012-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2012-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
*/
#ifndef BX_TOKENIZE_CMD_H_HEADER_GUARD
diff --git a/3rdparty/bx/include/bx/uint32_t.h b/3rdparty/bx/include/bx/uint32_t.h
index 22eed28a89e..411ac28ee6b 100644
--- a/3rdparty/bx/include/bx/uint32_t.h
+++ b/3rdparty/bx/include/bx/uint32_t.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2010-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
*/
// Copyright 2006 Mike Acton <macton@gmail.com>
diff --git a/3rdparty/bx/scripts/bin2c.lua b/3rdparty/bx/scripts/bin2c.lua
index c08f31fe53d..39f193f3bca 100644
--- a/3rdparty/bx/scripts/bin2c.lua
+++ b/3rdparty/bx/scripts/bin2c.lua
@@ -1,6 +1,6 @@
--
--- Copyright 2010-2015 Branimir Karadzic. All rights reserved.
--- License: http://www.opensource.org/licenses/BSD-2-Clause
+-- Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+-- License: https://github.com/bkaradzic/bx#license-bsd-2-clause
--
project "bin2c"
diff --git a/3rdparty/bx/scripts/bx.lua b/3rdparty/bx/scripts/bx.lua
index 1f348bda39b..aa09b050f8a 100644
--- a/3rdparty/bx/scripts/bx.lua
+++ b/3rdparty/bx/scripts/bx.lua
@@ -1,6 +1,6 @@
--
--- Copyright 2010-2015 Branimir Karadzic. All rights reserved.
--- License: http://www.opensource.org/licenses/BSD-2-Clause
+-- Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+-- License: https://github.com/bkaradzic/bx#license-bsd-2-clause
--
project "bx"
diff --git a/3rdparty/bx/scripts/genie.lua b/3rdparty/bx/scripts/genie.lua
index 152cd4b21ef..2399a70ce3d 100644
--- a/3rdparty/bx/scripts/genie.lua
+++ b/3rdparty/bx/scripts/genie.lua
@@ -1,6 +1,6 @@
--
--- Copyright 2010-2015 Branimir Karadzic. All rights reserved.
--- License: http://www.opensource.org/licenses/BSD-2-Clause
+-- Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+-- License: https://github.com/bkaradzic/bx#license-bsd-2-clause
--
solution "bx"
diff --git a/3rdparty/bx/scripts/toolchain.lua b/3rdparty/bx/scripts/toolchain.lua
index a6a201709aa..4b616c24c2a 100644
--- a/3rdparty/bx/scripts/toolchain.lua
+++ b/3rdparty/bx/scripts/toolchain.lua
@@ -1,5 +1,5 @@
--
--- Copyright 2010-2015 Branimir Karadzic. All rights reserved.
+-- Copyright 2010-2016 Branimir Karadzic. All rights reserved.
-- License: https://github.com/bkaradzic/bx#license-bsd-2-clause
--
diff --git a/3rdparty/bx/scripts/unittest++.lua b/3rdparty/bx/scripts/unittest++.lua
index 02fef2c695f..3a52b246b3e 100644
--- a/3rdparty/bx/scripts/unittest++.lua
+++ b/3rdparty/bx/scripts/unittest++.lua
@@ -1,6 +1,6 @@
--
--- Copyright 2010-2015 Branimir Karadzic. All rights reserved.
--- License: http://www.opensource.org/licenses/BSD-2-Clause
+-- Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+-- License: https://github.com/bkaradzic/bx#license-bsd-2-clause
--
project "UnitTest++"
diff --git a/3rdparty/bx/tests/dbg.cpp b/3rdparty/bx/tests/dbg.cpp
index 2622259ca18..efbfad6b6c1 100644
--- a/3rdparty/bx/tests/dbg.cpp
+++ b/3rdparty/bx/tests/dbg.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
*/
#include <stdio.h>
diff --git a/3rdparty/bx/tests/dbg.h b/3rdparty/bx/tests/dbg.h
index 191ea21bfa8..b1f23910b04 100644
--- a/3rdparty/bx/tests/dbg.h
+++ b/3rdparty/bx/tests/dbg.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
*/
#ifndef DBG_H_HEADER_GUARD
diff --git a/3rdparty/bx/tests/float4_t.cpp b/3rdparty/bx/tests/float4_t.cpp
index 04a060405c0..9f39fcc9e48 100644
--- a/3rdparty/bx/tests/float4_t.cpp
+++ b/3rdparty/bx/tests/float4_t.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2010-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
*/
#include "test.h"
diff --git a/3rdparty/bx/tests/fpumath.cpp b/3rdparty/bx/tests/fpumath.cpp
index f100c0205d1..8f98ea28365 100644
--- a/3rdparty/bx/tests/fpumath.cpp
+++ b/3rdparty/bx/tests/fpumath.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2010-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
*/
#include "test.h"
diff --git a/3rdparty/bx/tests/handle.cpp b/3rdparty/bx/tests/handle.cpp
index 455e7e47f01..b5b7c1894b7 100644
--- a/3rdparty/bx/tests/handle.cpp
+++ b/3rdparty/bx/tests/handle.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2010-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
*/
#include "test.h"
diff --git a/3rdparty/bx/tests/macros.cpp b/3rdparty/bx/tests/macros.cpp
index 72b11f3a0c5..321bc67e27b 100644
--- a/3rdparty/bx/tests/macros.cpp
+++ b/3rdparty/bx/tests/macros.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2010-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
*/
#include "test.h"
diff --git a/3rdparty/bx/tests/main.cpp b/3rdparty/bx/tests/main.cpp
index b17aac8238a..3fed5a015ed 100644
--- a/3rdparty/bx/tests/main.cpp
+++ b/3rdparty/bx/tests/main.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2010-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
*/
/*
diff --git a/3rdparty/bx/tests/test.h b/3rdparty/bx/tests/test.h
index 3d6bdab4701..8aa4e03ec4c 100644
--- a/3rdparty/bx/tests/test.h
+++ b/3rdparty/bx/tests/test.h
@@ -1,6 +1,6 @@
/*
- * Copyright 2010-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
*/
#ifndef __TEST_H__
diff --git a/3rdparty/bx/tests/thread.cpp b/3rdparty/bx/tests/thread.cpp
index dad3b88ea5c..f0ee772aeba 100644
--- a/3rdparty/bx/tests/thread.cpp
+++ b/3rdparty/bx/tests/thread.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2010-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
*/
#include "test.h"
diff --git a/3rdparty/bx/tests/tokenizecmd.cpp b/3rdparty/bx/tests/tokenizecmd.cpp
index 55aa600baa0..32e927bec1f 100644
--- a/3rdparty/bx/tests/tokenizecmd.cpp
+++ b/3rdparty/bx/tests/tokenizecmd.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2012-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2012-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
*/
#include "test.h"
diff --git a/3rdparty/bx/tests/uint32_t.cpp b/3rdparty/bx/tests/uint32_t.cpp
index 553c8e23942..3fe0044d67c 100644
--- a/3rdparty/bx/tests/uint32_t.cpp
+++ b/3rdparty/bx/tests/uint32_t.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2010-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2010-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
*/
#include "test.h"
diff --git a/3rdparty/bx/tools/bin/darwin/genie b/3rdparty/bx/tools/bin/darwin/genie
index d689fbcf76b..f7df2742735 100644
--- a/3rdparty/bx/tools/bin/darwin/genie
+++ b/3rdparty/bx/tools/bin/darwin/genie
Binary files differ
diff --git a/3rdparty/bx/tools/bin/linux/genie b/3rdparty/bx/tools/bin/linux/genie
index 2e532ef9172..d22c9e96473 100644
--- a/3rdparty/bx/tools/bin/linux/genie
+++ b/3rdparty/bx/tools/bin/linux/genie
Binary files differ
diff --git a/3rdparty/bx/tools/bin/windows/genie.exe b/3rdparty/bx/tools/bin/windows/genie.exe
index 5ca75020b6a..cb0d3e7d3df 100644
--- a/3rdparty/bx/tools/bin/windows/genie.exe
+++ b/3rdparty/bx/tools/bin/windows/genie.exe
Binary files differ
diff --git a/3rdparty/bx/tools/bin2c/bin2c.cpp b/3rdparty/bx/tools/bin2c/bin2c.cpp
index 0d7cc49e099..afdcaa65cdc 100644
--- a/3rdparty/bx/tools/bin2c/bin2c.cpp
+++ b/3rdparty/bx/tools/bin2c/bin2c.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
- * License: http://www.opensource.org/licenses/BSD-2-Clause
+ * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
*/
#include <string>
@@ -95,8 +95,8 @@ void help(const char* _error = NULL)
fprintf(stderr
, "bin2c, binary to C\n"
- "Copyright 2011-2015 Branimir Karadzic. All rights reserved.\n"
- "License: http://www.opensource.org/licenses/BSD-2-Clause\n\n"
+ "Copyright 2011-2016 Branimir Karadzic. All rights reserved.\n"
+ "License: https://github.com/bkaradzic/bx#license-bsd-2-clause\n\n"
);
fprintf(stderr
diff --git a/3rdparty/genie/LICENSE b/3rdparty/genie/LICENSE
index 7be0c9fc547..5d1f47a5b2c 100644
--- a/3rdparty/genie/LICENSE
+++ b/3rdparty/genie/LICENSE
@@ -1,9 +1,9 @@
# GENie
GENie
-Copyright (c) 2014-2015 Branimir Karadžić, Neil Richardson, Mike Popoloski,
-Drew Solomon, Ted de Munnik, Miodrag Milanović, Brett Vickers,
-Terry Hendrix II.
+Copyright (c) 2014-2016 Branimir Karadžić, Neil Richardson, Mike Popoloski,
+Drew Solomon, Ted de Munnik, Miodrag Milanović, Brett Vickers, Bill Freist,
+Terry Hendrix II, Ryan Juckett, Andrew Johnson
All rights reserved.
https://github.com/bkaradzic/genie
diff --git a/3rdparty/genie/README.md b/3rdparty/genie/README.md
index 7e8145e1c82..82296292415 100644
--- a/3rdparty/genie/README.md
+++ b/3rdparty/genie/README.md
@@ -4,12 +4,14 @@
What is it?
-----------
-**GENie** is project generator tool. It automagically generates project from Lua
-script, making applying the same settings for multiple projects easy.
+**GENie** (pronounced as Jenny) is project generator tool. It automagically
+generates project from Lua script, making applying the same settings for
+multiple projects easy.
Supported project generators:
* Visual Studio 2008, 2010, 2012, 2013, 2015
* GNU Makefile
+ * XCode
Who is using it?
----------------
@@ -35,7 +37,7 @@ Download (stable)
[![Build Status](https://travis-ci.org/bkaradzic/genie.svg?branch=master)](https://travis-ci.org/bkaradzic/genie)
- version 331 (commit 3653d092d054d5725cab272b6a5fd55edfd9a4ba)
+ version 366 (commit b887178737cd74cf60899899c4c65b9bf02efb26)
Linux:
https://github.com/bkaradzic/bx/raw/master/tools/bin/linux/genie
@@ -100,6 +102,10 @@ intention to keep it compatible with it.
`excludes` will exclude files from build but files will be added to project
file. `removefiles` removes files completely from project.
- Added support for generating PS4/Orbis projects.
+ - Fixed PCH race when using concurrent Makefile build.
+ - Added Green Hills Software compiler support.
+ - Added edit & continue support for 64-bit builds in VS2013 upwards.
+ - Added `windowstargetplatformversion` to specify VS Windows target version.
## Why fork?
@@ -138,9 +144,9 @@ state of Premake, it's just acknowledging the problem, and dealing with it.
-----------------------------------------------------------------
GENie
- Copyright (c) 2014-2015 Branimir Karadžić, Neil Richardson, Mike Popoloski,
- Drew Solomon, Ted de Munnik, Miodrag Milanović, Brett Vickers,
- Terry Hendrix II.
+ Copyright (c) 2014-2016 Branimir Karadžić, Neil Richardson, Mike Popoloski,
+ Drew Solomon, Ted de Munnik, Miodrag Milanović, Brett Vickers, Bill Freist,
+ Terry Hendrix II, Ryan Juckett, Andrew Johnson
All rights reserved.
https://github.com/bkaradzic/genie
diff --git a/3rdparty/genie/build/gmake.darwin/genie.make b/3rdparty/genie/build/gmake.darwin/genie.make
index 589b3db4766..2bcdf220196 100644
--- a/3rdparty/genie/build/gmake.darwin/genie.make
+++ b/3rdparty/genie/build/gmake.darwin/genie.make
@@ -43,7 +43,7 @@ ifeq ($(config),release)
override TARGET = $(TARGETDIR)/genie
DEFINES += -DNDEBUG -DLUA_COMPAT_MODULE -DLUA_USE_MACOSX
INCLUDES += -I../../src/host/lua-5.3.0/src
- ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP $(DEFINES) $(INCLUDES)
+ ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP -MP $(DEFINES) $(INCLUDES)
ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os -mmacosx-version-min=10.4
ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os -mmacosx-version-min=10.4
ALL_OBJCFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os -mmacosx-version-min=10.4
@@ -120,7 +120,7 @@ ifeq ($(config),debug)
override TARGET = $(TARGETDIR)/genie
DEFINES += -D_DEBUG -DLUA_COMPAT_MODULE -DLUA_USE_MACOSX
INCLUDES += -I../../src/host/lua-5.3.0/src
- ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP $(DEFINES) $(INCLUDES)
+ ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP -MP $(DEFINES) $(INCLUDES)
ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g -mmacosx-version-min=10.4
ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g -mmacosx-version-min=10.4
ALL_OBJCFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g -mmacosx-version-min=10.4
@@ -192,12 +192,13 @@ ifeq ($(config),debug)
endif
ifeq ($(config),releaseuniv32)
+ AR = libtool
OBJDIR = obj/Universal32/Release
TARGETDIR = ../../bin/darwin
override TARGET = $(TARGETDIR)/genie
DEFINES += -DNDEBUG -DLUA_COMPAT_MODULE -DLUA_USE_MACOSX
INCLUDES += -I../../src/host/lua-5.3.0/src
- ALL_CPPFLAGS += $(CPPFLAGS) $(DEFINES) $(INCLUDES)
+ ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP -MP $(DEFINES) $(INCLUDES)
ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os -arch i386 -arch ppc -mmacosx-version-min=10.4
ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os -arch i386 -arch ppc -mmacosx-version-min=10.4
ALL_OBJCFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os -arch i386 -arch ppc -mmacosx-version-min=10.4
@@ -269,12 +270,13 @@ ifeq ($(config),releaseuniv32)
endif
ifeq ($(config),debuguniv32)
+ AR = libtool
OBJDIR = obj/Universal32/Debug
TARGETDIR = ../../bin/darwin
override TARGET = $(TARGETDIR)/genie
DEFINES += -D_DEBUG -DLUA_COMPAT_MODULE -DLUA_USE_MACOSX
INCLUDES += -I../../src/host/lua-5.3.0/src
- ALL_CPPFLAGS += $(CPPFLAGS) $(DEFINES) $(INCLUDES)
+ ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP -MP $(DEFINES) $(INCLUDES)
ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g -arch i386 -arch ppc -mmacosx-version-min=10.4
ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g -arch i386 -arch ppc -mmacosx-version-min=10.4
ALL_OBJCFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g -arch i386 -arch ppc -mmacosx-version-min=10.4
@@ -347,17 +349,17 @@ endif
OBJDIRS := \
$(OBJDIR) \
- $(OBJDIR)/src/host \
$(OBJDIR)/src/host/lua-5.3.0/src \
+ $(OBJDIR)/src/host \
RESOURCES := \
.PHONY: clean prebuild prelink
-all: $(TARGETDIR) $(OBJDIRS) prebuild prelink $(TARGET)
+all: $(OBJDIRS) prebuild prelink $(TARGET) | $(TARGETDIR)
@:
-$(TARGET): $(TARGETDIR) $(OBJDIRS) $(GCH) $(OBJECTS) $(LDDEPS) $(RESOURCES)
+$(TARGET): $(OBJDIRS) $(GCH) $(OBJECTS) $(LDDEPS) $(RESOURCES) | $(TARGETDIR)
@echo Linking genie
$(SILENT) $(LINKCMD)
$(POSTBUILDCMDS)
@@ -389,216 +391,216 @@ prelink:
ifneq (,$(PCH))
$(GCH): $(PCH)
@echo $(notdir $<)
- $(SILENT) $(CC) -x c-header $(ALL_CFLAGS) -MMD -MP $(DEFINES) $(INCLUDES) -o "$@" -MF "$(@:%.gch=%.d)" -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) -x c-header $(DEFINES) $(INCLUDES) -o "$@" -c "$<"
endif
-$(OBJDIR)/src/host/os_getcwd.o: ../../src/host/os_getcwd.c
+$(OBJDIR)/src/host/os_getcwd.o: ../../src/host/os_getcwd.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/os_stat.o: ../../src/host/os_stat.c
+$(OBJDIR)/src/host/os_stat.o: ../../src/host/os_stat.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/os_chdir.o: ../../src/host/os_chdir.c
+$(OBJDIR)/src/host/os_chdir.o: ../../src/host/os_chdir.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/premake_main.o: ../../src/host/premake_main.c
+$(OBJDIR)/src/host/premake_main.o: ../../src/host/premake_main.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/os_uuid.o: ../../src/host/os_uuid.c
+$(OBJDIR)/src/host/os_uuid.o: ../../src/host/os_uuid.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/os_isfile.o: ../../src/host/os_isfile.c
+$(OBJDIR)/src/host/os_isfile.o: ../../src/host/os_isfile.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/os_ticks.o: ../../src/host/os_ticks.c
+$(OBJDIR)/src/host/os_ticks.o: ../../src/host/os_ticks.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/os_copyfile.o: ../../src/host/os_copyfile.c
+$(OBJDIR)/src/host/os_copyfile.o: ../../src/host/os_copyfile.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/scripts.o: ../../src/host/scripts.c
+$(OBJDIR)/src/host/scripts.o: ../../src/host/scripts.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/string_endswith.o: ../../src/host/string_endswith.c
+$(OBJDIR)/src/host/string_endswith.o: ../../src/host/string_endswith.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/string_hash.o: ../../src/host/string_hash.c
+$(OBJDIR)/src/host/string_hash.o: ../../src/host/string_hash.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/os_pathsearch.o: ../../src/host/os_pathsearch.c
+$(OBJDIR)/src/host/os_pathsearch.o: ../../src/host/os_pathsearch.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/os_rmdir.o: ../../src/host/os_rmdir.c
+$(OBJDIR)/src/host/os_rmdir.o: ../../src/host/os_rmdir.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/os_match.o: ../../src/host/os_match.c
+$(OBJDIR)/src/host/os_match.o: ../../src/host/os_match.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/premake.o: ../../src/host/premake.c
+$(OBJDIR)/src/host/premake.o: ../../src/host/premake.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/os_isdir.o: ../../src/host/os_isdir.c
+$(OBJDIR)/src/host/os_isdir.o: ../../src/host/os_isdir.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/os_mkdir.o: ../../src/host/os_mkdir.c
+$(OBJDIR)/src/host/os_mkdir.o: ../../src/host/os_mkdir.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/path_isabsolute.o: ../../src/host/path_isabsolute.c
+$(OBJDIR)/src/host/path_isabsolute.o: ../../src/host/path_isabsolute.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/os_is64bit.o: ../../src/host/os_is64bit.c
+$(OBJDIR)/src/host/os_is64bit.o: ../../src/host/os_is64bit.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/ldump.o: ../../src/host/lua-5.3.0/src/ldump.c
+$(OBJDIR)/src/host/lua-5.3.0/src/ldump.o: ../../src/host/lua-5.3.0/src/ldump.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lvm.o: ../../src/host/lua-5.3.0/src/lvm.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lvm.o: ../../src/host/lua-5.3.0/src/lvm.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/ltable.o: ../../src/host/lua-5.3.0/src/ltable.c
+$(OBJDIR)/src/host/lua-5.3.0/src/ltable.o: ../../src/host/lua-5.3.0/src/ltable.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lstrlib.o: ../../src/host/lua-5.3.0/src/lstrlib.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lstrlib.o: ../../src/host/lua-5.3.0/src/lstrlib.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/liolib.o: ../../src/host/lua-5.3.0/src/liolib.c
+$(OBJDIR)/src/host/lua-5.3.0/src/liolib.o: ../../src/host/lua-5.3.0/src/liolib.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lcode.o: ../../src/host/lua-5.3.0/src/lcode.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lcode.o: ../../src/host/lua-5.3.0/src/lcode.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lparser.o: ../../src/host/lua-5.3.0/src/lparser.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lparser.o: ../../src/host/lua-5.3.0/src/lparser.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/loadlib.o: ../../src/host/lua-5.3.0/src/loadlib.c
+$(OBJDIR)/src/host/lua-5.3.0/src/loadlib.o: ../../src/host/lua-5.3.0/src/loadlib.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lbitlib.o: ../../src/host/lua-5.3.0/src/lbitlib.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lbitlib.o: ../../src/host/lua-5.3.0/src/lbitlib.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lzio.o: ../../src/host/lua-5.3.0/src/lzio.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lzio.o: ../../src/host/lua-5.3.0/src/lzio.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/ldblib.o: ../../src/host/lua-5.3.0/src/ldblib.c
+$(OBJDIR)/src/host/lua-5.3.0/src/ldblib.o: ../../src/host/lua-5.3.0/src/ldblib.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lmathlib.o: ../../src/host/lua-5.3.0/src/lmathlib.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lmathlib.o: ../../src/host/lua-5.3.0/src/lmathlib.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lfunc.o: ../../src/host/lua-5.3.0/src/lfunc.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lfunc.o: ../../src/host/lua-5.3.0/src/lfunc.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lmem.o: ../../src/host/lua-5.3.0/src/lmem.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lmem.o: ../../src/host/lua-5.3.0/src/lmem.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lgc.o: ../../src/host/lua-5.3.0/src/lgc.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lgc.o: ../../src/host/lua-5.3.0/src/lgc.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lstring.o: ../../src/host/lua-5.3.0/src/lstring.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lstring.o: ../../src/host/lua-5.3.0/src/lstring.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/linit.o: ../../src/host/lua-5.3.0/src/linit.c
+$(OBJDIR)/src/host/lua-5.3.0/src/linit.o: ../../src/host/lua-5.3.0/src/linit.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/ltm.o: ../../src/host/lua-5.3.0/src/ltm.c
+$(OBJDIR)/src/host/lua-5.3.0/src/ltm.o: ../../src/host/lua-5.3.0/src/ltm.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lapi.o: ../../src/host/lua-5.3.0/src/lapi.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lapi.o: ../../src/host/lua-5.3.0/src/lapi.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lctype.o: ../../src/host/lua-5.3.0/src/lctype.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lctype.o: ../../src/host/lua-5.3.0/src/lctype.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lstate.o: ../../src/host/lua-5.3.0/src/lstate.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lstate.o: ../../src/host/lua-5.3.0/src/lstate.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lbaselib.o: ../../src/host/lua-5.3.0/src/lbaselib.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lbaselib.o: ../../src/host/lua-5.3.0/src/lbaselib.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/ltablib.o: ../../src/host/lua-5.3.0/src/ltablib.c
+$(OBJDIR)/src/host/lua-5.3.0/src/ltablib.o: ../../src/host/lua-5.3.0/src/ltablib.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lauxlib.o: ../../src/host/lua-5.3.0/src/lauxlib.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lauxlib.o: ../../src/host/lua-5.3.0/src/lauxlib.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lcorolib.o: ../../src/host/lua-5.3.0/src/lcorolib.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lcorolib.o: ../../src/host/lua-5.3.0/src/lcorolib.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/llex.o: ../../src/host/lua-5.3.0/src/llex.c
+$(OBJDIR)/src/host/lua-5.3.0/src/llex.o: ../../src/host/lua-5.3.0/src/llex.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/ldo.o: ../../src/host/lua-5.3.0/src/ldo.c
+$(OBJDIR)/src/host/lua-5.3.0/src/ldo.o: ../../src/host/lua-5.3.0/src/ldo.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lundump.o: ../../src/host/lua-5.3.0/src/lundump.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lundump.o: ../../src/host/lua-5.3.0/src/lundump.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lopcodes.o: ../../src/host/lua-5.3.0/src/lopcodes.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lopcodes.o: ../../src/host/lua-5.3.0/src/lopcodes.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lutf8lib.o: ../../src/host/lua-5.3.0/src/lutf8lib.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lutf8lib.o: ../../src/host/lua-5.3.0/src/lutf8lib.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/loslib.o: ../../src/host/lua-5.3.0/src/loslib.c
+$(OBJDIR)/src/host/lua-5.3.0/src/loslib.o: ../../src/host/lua-5.3.0/src/loslib.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lobject.o: ../../src/host/lua-5.3.0/src/lobject.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lobject.o: ../../src/host/lua-5.3.0/src/lobject.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/ldebug.o: ../../src/host/lua-5.3.0/src/ldebug.c
+$(OBJDIR)/src/host/lua-5.3.0/src/ldebug.o: ../../src/host/lua-5.3.0/src/ldebug.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-include $(OBJECTS:%.o=%.d)
ifneq (,$(PCH))
diff --git a/3rdparty/genie/build/gmake.linux/genie.make b/3rdparty/genie/build/gmake.linux/genie.make
index 4599bea52c3..101a999a603 100644
--- a/3rdparty/genie/build/gmake.linux/genie.make
+++ b/3rdparty/genie/build/gmake.linux/genie.make
@@ -43,7 +43,7 @@ ifeq ($(config),release)
override TARGET = $(TARGETDIR)/genie
DEFINES += -DNDEBUG -DLUA_COMPAT_MODULE -DLUA_USE_POSIX -DLUA_USE_DLOPEN
INCLUDES += -I../../src/host/lua-5.3.0/src
- ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP $(DEFINES) $(INCLUDES)
+ ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP -MP $(DEFINES) $(INCLUDES)
ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os
ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os
ALL_OBJCFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os
@@ -120,7 +120,7 @@ ifeq ($(config),debug)
override TARGET = $(TARGETDIR)/genie
DEFINES += -D_DEBUG -DLUA_COMPAT_MODULE -DLUA_USE_POSIX -DLUA_USE_DLOPEN
INCLUDES += -I../../src/host/lua-5.3.0/src
- ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP $(DEFINES) $(INCLUDES)
+ ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP -MP $(DEFINES) $(INCLUDES)
ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g
ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g
ALL_OBJCFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g
@@ -193,17 +193,17 @@ endif
OBJDIRS := \
$(OBJDIR) \
- $(OBJDIR)/src/host \
$(OBJDIR)/src/host/lua-5.3.0/src \
+ $(OBJDIR)/src/host \
RESOURCES := \
.PHONY: clean prebuild prelink
-all: $(TARGETDIR) $(OBJDIRS) prebuild prelink $(TARGET)
+all: $(OBJDIRS) prebuild prelink $(TARGET) | $(TARGETDIR)
@:
-$(TARGET): $(TARGETDIR) $(OBJDIRS) $(GCH) $(OBJECTS) $(LDDEPS) $(RESOURCES)
+$(TARGET): $(OBJDIRS) $(GCH) $(OBJECTS) $(LDDEPS) $(RESOURCES) | $(TARGETDIR)
@echo Linking genie
$(SILENT) $(LINKCMD)
$(POSTBUILDCMDS)
@@ -235,216 +235,216 @@ prelink:
ifneq (,$(PCH))
$(GCH): $(PCH)
@echo $(notdir $<)
- $(SILENT) $(CC) -x c-header $(ALL_CFLAGS) -MMD -MP $(DEFINES) $(INCLUDES) -o "$@" -MF "$(@:%.gch=%.d)" -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) -x c-header $(DEFINES) $(INCLUDES) -o "$@" -c "$<"
endif
-$(OBJDIR)/src/host/os_getcwd.o: ../../src/host/os_getcwd.c
+$(OBJDIR)/src/host/os_getcwd.o: ../../src/host/os_getcwd.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/os_stat.o: ../../src/host/os_stat.c
+$(OBJDIR)/src/host/os_stat.o: ../../src/host/os_stat.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/os_chdir.o: ../../src/host/os_chdir.c
+$(OBJDIR)/src/host/os_chdir.o: ../../src/host/os_chdir.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/premake_main.o: ../../src/host/premake_main.c
+$(OBJDIR)/src/host/premake_main.o: ../../src/host/premake_main.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/os_uuid.o: ../../src/host/os_uuid.c
+$(OBJDIR)/src/host/os_uuid.o: ../../src/host/os_uuid.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/os_isfile.o: ../../src/host/os_isfile.c
+$(OBJDIR)/src/host/os_isfile.o: ../../src/host/os_isfile.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/os_ticks.o: ../../src/host/os_ticks.c
+$(OBJDIR)/src/host/os_ticks.o: ../../src/host/os_ticks.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/os_copyfile.o: ../../src/host/os_copyfile.c
+$(OBJDIR)/src/host/os_copyfile.o: ../../src/host/os_copyfile.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/scripts.o: ../../src/host/scripts.c
+$(OBJDIR)/src/host/scripts.o: ../../src/host/scripts.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/string_endswith.o: ../../src/host/string_endswith.c
+$(OBJDIR)/src/host/string_endswith.o: ../../src/host/string_endswith.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/string_hash.o: ../../src/host/string_hash.c
+$(OBJDIR)/src/host/string_hash.o: ../../src/host/string_hash.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/os_pathsearch.o: ../../src/host/os_pathsearch.c
+$(OBJDIR)/src/host/os_pathsearch.o: ../../src/host/os_pathsearch.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/os_rmdir.o: ../../src/host/os_rmdir.c
+$(OBJDIR)/src/host/os_rmdir.o: ../../src/host/os_rmdir.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/os_match.o: ../../src/host/os_match.c
+$(OBJDIR)/src/host/os_match.o: ../../src/host/os_match.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/premake.o: ../../src/host/premake.c
+$(OBJDIR)/src/host/premake.o: ../../src/host/premake.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/os_isdir.o: ../../src/host/os_isdir.c
+$(OBJDIR)/src/host/os_isdir.o: ../../src/host/os_isdir.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/os_mkdir.o: ../../src/host/os_mkdir.c
+$(OBJDIR)/src/host/os_mkdir.o: ../../src/host/os_mkdir.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/path_isabsolute.o: ../../src/host/path_isabsolute.c
+$(OBJDIR)/src/host/path_isabsolute.o: ../../src/host/path_isabsolute.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/os_is64bit.o: ../../src/host/os_is64bit.c
+$(OBJDIR)/src/host/os_is64bit.o: ../../src/host/os_is64bit.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/ldump.o: ../../src/host/lua-5.3.0/src/ldump.c
+$(OBJDIR)/src/host/lua-5.3.0/src/ldump.o: ../../src/host/lua-5.3.0/src/ldump.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lvm.o: ../../src/host/lua-5.3.0/src/lvm.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lvm.o: ../../src/host/lua-5.3.0/src/lvm.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/ltable.o: ../../src/host/lua-5.3.0/src/ltable.c
+$(OBJDIR)/src/host/lua-5.3.0/src/ltable.o: ../../src/host/lua-5.3.0/src/ltable.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lstrlib.o: ../../src/host/lua-5.3.0/src/lstrlib.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lstrlib.o: ../../src/host/lua-5.3.0/src/lstrlib.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/liolib.o: ../../src/host/lua-5.3.0/src/liolib.c
+$(OBJDIR)/src/host/lua-5.3.0/src/liolib.o: ../../src/host/lua-5.3.0/src/liolib.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lcode.o: ../../src/host/lua-5.3.0/src/lcode.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lcode.o: ../../src/host/lua-5.3.0/src/lcode.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lparser.o: ../../src/host/lua-5.3.0/src/lparser.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lparser.o: ../../src/host/lua-5.3.0/src/lparser.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/loadlib.o: ../../src/host/lua-5.3.0/src/loadlib.c
+$(OBJDIR)/src/host/lua-5.3.0/src/loadlib.o: ../../src/host/lua-5.3.0/src/loadlib.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lbitlib.o: ../../src/host/lua-5.3.0/src/lbitlib.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lbitlib.o: ../../src/host/lua-5.3.0/src/lbitlib.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lzio.o: ../../src/host/lua-5.3.0/src/lzio.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lzio.o: ../../src/host/lua-5.3.0/src/lzio.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/ldblib.o: ../../src/host/lua-5.3.0/src/ldblib.c
+$(OBJDIR)/src/host/lua-5.3.0/src/ldblib.o: ../../src/host/lua-5.3.0/src/ldblib.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lmathlib.o: ../../src/host/lua-5.3.0/src/lmathlib.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lmathlib.o: ../../src/host/lua-5.3.0/src/lmathlib.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lfunc.o: ../../src/host/lua-5.3.0/src/lfunc.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lfunc.o: ../../src/host/lua-5.3.0/src/lfunc.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lmem.o: ../../src/host/lua-5.3.0/src/lmem.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lmem.o: ../../src/host/lua-5.3.0/src/lmem.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lgc.o: ../../src/host/lua-5.3.0/src/lgc.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lgc.o: ../../src/host/lua-5.3.0/src/lgc.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lstring.o: ../../src/host/lua-5.3.0/src/lstring.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lstring.o: ../../src/host/lua-5.3.0/src/lstring.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/linit.o: ../../src/host/lua-5.3.0/src/linit.c
+$(OBJDIR)/src/host/lua-5.3.0/src/linit.o: ../../src/host/lua-5.3.0/src/linit.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/ltm.o: ../../src/host/lua-5.3.0/src/ltm.c
+$(OBJDIR)/src/host/lua-5.3.0/src/ltm.o: ../../src/host/lua-5.3.0/src/ltm.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lapi.o: ../../src/host/lua-5.3.0/src/lapi.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lapi.o: ../../src/host/lua-5.3.0/src/lapi.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lctype.o: ../../src/host/lua-5.3.0/src/lctype.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lctype.o: ../../src/host/lua-5.3.0/src/lctype.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lstate.o: ../../src/host/lua-5.3.0/src/lstate.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lstate.o: ../../src/host/lua-5.3.0/src/lstate.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lbaselib.o: ../../src/host/lua-5.3.0/src/lbaselib.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lbaselib.o: ../../src/host/lua-5.3.0/src/lbaselib.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/ltablib.o: ../../src/host/lua-5.3.0/src/ltablib.c
+$(OBJDIR)/src/host/lua-5.3.0/src/ltablib.o: ../../src/host/lua-5.3.0/src/ltablib.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lauxlib.o: ../../src/host/lua-5.3.0/src/lauxlib.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lauxlib.o: ../../src/host/lua-5.3.0/src/lauxlib.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lcorolib.o: ../../src/host/lua-5.3.0/src/lcorolib.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lcorolib.o: ../../src/host/lua-5.3.0/src/lcorolib.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/llex.o: ../../src/host/lua-5.3.0/src/llex.c
+$(OBJDIR)/src/host/lua-5.3.0/src/llex.o: ../../src/host/lua-5.3.0/src/llex.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/ldo.o: ../../src/host/lua-5.3.0/src/ldo.c
+$(OBJDIR)/src/host/lua-5.3.0/src/ldo.o: ../../src/host/lua-5.3.0/src/ldo.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lundump.o: ../../src/host/lua-5.3.0/src/lundump.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lundump.o: ../../src/host/lua-5.3.0/src/lundump.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lopcodes.o: ../../src/host/lua-5.3.0/src/lopcodes.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lopcodes.o: ../../src/host/lua-5.3.0/src/lopcodes.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lutf8lib.o: ../../src/host/lua-5.3.0/src/lutf8lib.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lutf8lib.o: ../../src/host/lua-5.3.0/src/lutf8lib.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/loslib.o: ../../src/host/lua-5.3.0/src/loslib.c
+$(OBJDIR)/src/host/lua-5.3.0/src/loslib.o: ../../src/host/lua-5.3.0/src/loslib.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lobject.o: ../../src/host/lua-5.3.0/src/lobject.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lobject.o: ../../src/host/lua-5.3.0/src/lobject.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/ldebug.o: ../../src/host/lua-5.3.0/src/ldebug.c
+$(OBJDIR)/src/host/lua-5.3.0/src/ldebug.o: ../../src/host/lua-5.3.0/src/ldebug.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-include $(OBJECTS:%.o=%.d)
ifneq (,$(PCH))
diff --git a/3rdparty/genie/build/gmake.windows/genie.make b/3rdparty/genie/build/gmake.windows/genie.make
index 2f002b0f9ca..3c7a3ff5a73 100644
--- a/3rdparty/genie/build/gmake.windows/genie.make
+++ b/3rdparty/genie/build/gmake.windows/genie.make
@@ -43,7 +43,7 @@ ifeq ($(config),release)
override TARGET = $(TARGETDIR)/genie.exe
DEFINES += -DNDEBUG -DLUA_COMPAT_MODULE
INCLUDES += -I../../src/host/lua-5.3.0/src
- ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP $(DEFINES) $(INCLUDES)
+ ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP -MP $(DEFINES) $(INCLUDES)
ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os
ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os
ALL_OBJCFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os
@@ -120,7 +120,7 @@ ifeq ($(config),debug)
override TARGET = $(TARGETDIR)/genie.exe
DEFINES += -D_DEBUG -DLUA_COMPAT_MODULE
INCLUDES += -I../../src/host/lua-5.3.0/src
- ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP $(DEFINES) $(INCLUDES)
+ ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP -MP $(DEFINES) $(INCLUDES)
ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g
ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g
ALL_OBJCFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g
@@ -193,17 +193,17 @@ endif
OBJDIRS := \
$(OBJDIR) \
- $(OBJDIR)/src/host \
$(OBJDIR)/src/host/lua-5.3.0/src \
+ $(OBJDIR)/src/host \
RESOURCES := \
.PHONY: clean prebuild prelink
-all: $(TARGETDIR) $(OBJDIRS) prebuild prelink $(TARGET)
+all: $(OBJDIRS) prebuild prelink $(TARGET) | $(TARGETDIR)
@:
-$(TARGET): $(TARGETDIR) $(OBJDIRS) $(GCH) $(OBJECTS) $(LDDEPS) $(RESOURCES)
+$(TARGET): $(OBJDIRS) $(GCH) $(OBJECTS) $(LDDEPS) $(RESOURCES) | $(TARGETDIR)
@echo Linking genie
$(SILENT) $(LINKCMD)
$(POSTBUILDCMDS)
@@ -235,216 +235,216 @@ prelink:
ifneq (,$(PCH))
$(GCH): $(PCH)
@echo $(notdir $<)
- $(SILENT) $(CC) -x c-header $(ALL_CFLAGS) -MMD -MP $(DEFINES) $(INCLUDES) -o "$@" -MF "$(@:%.gch=%.d)" -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) -x c-header $(DEFINES) $(INCLUDES) -o "$@" -c "$<"
endif
-$(OBJDIR)/src/host/os_getcwd.o: ../../src/host/os_getcwd.c
+$(OBJDIR)/src/host/os_getcwd.o: ../../src/host/os_getcwd.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/os_stat.o: ../../src/host/os_stat.c
+$(OBJDIR)/src/host/os_stat.o: ../../src/host/os_stat.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/os_chdir.o: ../../src/host/os_chdir.c
+$(OBJDIR)/src/host/os_chdir.o: ../../src/host/os_chdir.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/premake_main.o: ../../src/host/premake_main.c
+$(OBJDIR)/src/host/premake_main.o: ../../src/host/premake_main.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/os_uuid.o: ../../src/host/os_uuid.c
+$(OBJDIR)/src/host/os_uuid.o: ../../src/host/os_uuid.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/os_isfile.o: ../../src/host/os_isfile.c
+$(OBJDIR)/src/host/os_isfile.o: ../../src/host/os_isfile.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/os_ticks.o: ../../src/host/os_ticks.c
+$(OBJDIR)/src/host/os_ticks.o: ../../src/host/os_ticks.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/os_copyfile.o: ../../src/host/os_copyfile.c
+$(OBJDIR)/src/host/os_copyfile.o: ../../src/host/os_copyfile.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/scripts.o: ../../src/host/scripts.c
+$(OBJDIR)/src/host/scripts.o: ../../src/host/scripts.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/string_endswith.o: ../../src/host/string_endswith.c
+$(OBJDIR)/src/host/string_endswith.o: ../../src/host/string_endswith.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/string_hash.o: ../../src/host/string_hash.c
+$(OBJDIR)/src/host/string_hash.o: ../../src/host/string_hash.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/os_pathsearch.o: ../../src/host/os_pathsearch.c
+$(OBJDIR)/src/host/os_pathsearch.o: ../../src/host/os_pathsearch.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/os_rmdir.o: ../../src/host/os_rmdir.c
+$(OBJDIR)/src/host/os_rmdir.o: ../../src/host/os_rmdir.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/os_match.o: ../../src/host/os_match.c
+$(OBJDIR)/src/host/os_match.o: ../../src/host/os_match.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/premake.o: ../../src/host/premake.c
+$(OBJDIR)/src/host/premake.o: ../../src/host/premake.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/os_isdir.o: ../../src/host/os_isdir.c
+$(OBJDIR)/src/host/os_isdir.o: ../../src/host/os_isdir.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/os_mkdir.o: ../../src/host/os_mkdir.c
+$(OBJDIR)/src/host/os_mkdir.o: ../../src/host/os_mkdir.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/path_isabsolute.o: ../../src/host/path_isabsolute.c
+$(OBJDIR)/src/host/path_isabsolute.o: ../../src/host/path_isabsolute.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/os_is64bit.o: ../../src/host/os_is64bit.c
+$(OBJDIR)/src/host/os_is64bit.o: ../../src/host/os_is64bit.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/ldump.o: ../../src/host/lua-5.3.0/src/ldump.c
+$(OBJDIR)/src/host/lua-5.3.0/src/ldump.o: ../../src/host/lua-5.3.0/src/ldump.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lvm.o: ../../src/host/lua-5.3.0/src/lvm.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lvm.o: ../../src/host/lua-5.3.0/src/lvm.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/ltable.o: ../../src/host/lua-5.3.0/src/ltable.c
+$(OBJDIR)/src/host/lua-5.3.0/src/ltable.o: ../../src/host/lua-5.3.0/src/ltable.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lstrlib.o: ../../src/host/lua-5.3.0/src/lstrlib.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lstrlib.o: ../../src/host/lua-5.3.0/src/lstrlib.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/liolib.o: ../../src/host/lua-5.3.0/src/liolib.c
+$(OBJDIR)/src/host/lua-5.3.0/src/liolib.o: ../../src/host/lua-5.3.0/src/liolib.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lcode.o: ../../src/host/lua-5.3.0/src/lcode.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lcode.o: ../../src/host/lua-5.3.0/src/lcode.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lparser.o: ../../src/host/lua-5.3.0/src/lparser.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lparser.o: ../../src/host/lua-5.3.0/src/lparser.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/loadlib.o: ../../src/host/lua-5.3.0/src/loadlib.c
+$(OBJDIR)/src/host/lua-5.3.0/src/loadlib.o: ../../src/host/lua-5.3.0/src/loadlib.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lbitlib.o: ../../src/host/lua-5.3.0/src/lbitlib.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lbitlib.o: ../../src/host/lua-5.3.0/src/lbitlib.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lzio.o: ../../src/host/lua-5.3.0/src/lzio.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lzio.o: ../../src/host/lua-5.3.0/src/lzio.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/ldblib.o: ../../src/host/lua-5.3.0/src/ldblib.c
+$(OBJDIR)/src/host/lua-5.3.0/src/ldblib.o: ../../src/host/lua-5.3.0/src/ldblib.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lmathlib.o: ../../src/host/lua-5.3.0/src/lmathlib.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lmathlib.o: ../../src/host/lua-5.3.0/src/lmathlib.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lfunc.o: ../../src/host/lua-5.3.0/src/lfunc.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lfunc.o: ../../src/host/lua-5.3.0/src/lfunc.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lmem.o: ../../src/host/lua-5.3.0/src/lmem.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lmem.o: ../../src/host/lua-5.3.0/src/lmem.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lgc.o: ../../src/host/lua-5.3.0/src/lgc.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lgc.o: ../../src/host/lua-5.3.0/src/lgc.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lstring.o: ../../src/host/lua-5.3.0/src/lstring.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lstring.o: ../../src/host/lua-5.3.0/src/lstring.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/linit.o: ../../src/host/lua-5.3.0/src/linit.c
+$(OBJDIR)/src/host/lua-5.3.0/src/linit.o: ../../src/host/lua-5.3.0/src/linit.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/ltm.o: ../../src/host/lua-5.3.0/src/ltm.c
+$(OBJDIR)/src/host/lua-5.3.0/src/ltm.o: ../../src/host/lua-5.3.0/src/ltm.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lapi.o: ../../src/host/lua-5.3.0/src/lapi.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lapi.o: ../../src/host/lua-5.3.0/src/lapi.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lctype.o: ../../src/host/lua-5.3.0/src/lctype.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lctype.o: ../../src/host/lua-5.3.0/src/lctype.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lstate.o: ../../src/host/lua-5.3.0/src/lstate.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lstate.o: ../../src/host/lua-5.3.0/src/lstate.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lbaselib.o: ../../src/host/lua-5.3.0/src/lbaselib.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lbaselib.o: ../../src/host/lua-5.3.0/src/lbaselib.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/ltablib.o: ../../src/host/lua-5.3.0/src/ltablib.c
+$(OBJDIR)/src/host/lua-5.3.0/src/ltablib.o: ../../src/host/lua-5.3.0/src/ltablib.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lauxlib.o: ../../src/host/lua-5.3.0/src/lauxlib.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lauxlib.o: ../../src/host/lua-5.3.0/src/lauxlib.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lcorolib.o: ../../src/host/lua-5.3.0/src/lcorolib.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lcorolib.o: ../../src/host/lua-5.3.0/src/lcorolib.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/llex.o: ../../src/host/lua-5.3.0/src/llex.c
+$(OBJDIR)/src/host/lua-5.3.0/src/llex.o: ../../src/host/lua-5.3.0/src/llex.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/ldo.o: ../../src/host/lua-5.3.0/src/ldo.c
+$(OBJDIR)/src/host/lua-5.3.0/src/ldo.o: ../../src/host/lua-5.3.0/src/ldo.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lundump.o: ../../src/host/lua-5.3.0/src/lundump.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lundump.o: ../../src/host/lua-5.3.0/src/lundump.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lopcodes.o: ../../src/host/lua-5.3.0/src/lopcodes.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lopcodes.o: ../../src/host/lua-5.3.0/src/lopcodes.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lutf8lib.o: ../../src/host/lua-5.3.0/src/lutf8lib.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lutf8lib.o: ../../src/host/lua-5.3.0/src/lutf8lib.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/loslib.o: ../../src/host/lua-5.3.0/src/loslib.c
+$(OBJDIR)/src/host/lua-5.3.0/src/loslib.o: ../../src/host/lua-5.3.0/src/loslib.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lobject.o: ../../src/host/lua-5.3.0/src/lobject.c
+$(OBJDIR)/src/host/lua-5.3.0/src/lobject.o: ../../src/host/lua-5.3.0/src/lobject.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/ldebug.o: ../../src/host/lua-5.3.0/src/ldebug.c
+$(OBJDIR)/src/host/lua-5.3.0/src/ldebug.o: ../../src/host/lua-5.3.0/src/ldebug.c $(GCH)
@echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-include $(OBJECTS:%.o=%.d)
ifneq (,$(PCH))
diff --git a/3rdparty/genie/src/_manifest.lua b/3rdparty/genie/src/_manifest.lua
index 221e1d6e621..75d9b657ffe 100644
--- a/3rdparty/genie/src/_manifest.lua
+++ b/3rdparty/genie/src/_manifest.lua
@@ -28,6 +28,7 @@
"base/inspect.lua",
"tools/dotnet.lua",
"tools/gcc.lua",
+ "tools/ghs.lua",
"tools/msc.lua",
"tools/ow.lua",
"tools/snc.lua",
@@ -45,7 +46,7 @@
"actions/codelite/codelite_workspace.lua",
"actions/codelite/codelite_project.lua",
- -- CodeLite action
+ -- CMake action
"actions/cmake/_cmake.lua",
"actions/cmake/cmake_workspace.lua",
"actions/cmake/cmake_project.lua",
diff --git a/3rdparty/genie/src/actions/make/_make.lua b/3rdparty/genie/src/actions/make/_make.lua
index 48c389bd51b..762cbdf248a 100644
--- a/3rdparty/genie/src/actions/make/_make.lua
+++ b/3rdparty/genie/src/actions/make/_make.lua
@@ -137,7 +137,7 @@
valid_languages = { "C", "C++", "C#" },
valid_tools = {
- cc = { "gcc" },
+ cc = { "gcc", "ghs" },
dotnet = { "mono", "msnet", "pnet" },
},
diff --git a/3rdparty/genie/src/actions/make/make_cpp.lua b/3rdparty/genie/src/actions/make/make_cpp.lua
index a78fcfea871..795b74a491a 100644
--- a/3rdparty/genie/src/actions/make/make_cpp.lua
+++ b/3rdparty/genie/src/actions/make/make_cpp.lua
@@ -34,13 +34,13 @@
objdirs[_MAKE.esc(path.getdirectory(path.trimdots(file)))] = 1
end
end
-
+
for _, custombuildtask in ipairs(prj.custombuildtask or {}) do
for _, buildtask in ipairs(custombuildtask or {}) do
additionalobjdirs[_MAKE.esc(path.getdirectory(path.getrelative(prj.location,buildtask[2])))] = 1
end
end
-
+
_p('OBJDIRS := \\')
_p('\t$(OBJDIR) \\')
for dir, _ in pairs(objdirs) do
@@ -64,9 +64,9 @@
_p('')
if os.is("MacOSX") and prj.kind == "WindowedApp" then
- _p('all: $(TARGETDIR) $(OBJDIRS) prebuild prelink $(TARGET) $(dir $(TARGETDIR))PkgInfo $(dir $(TARGETDIR))Info.plist')
+ _p('all: $(OBJDIRS) prebuild prelink $(TARGET) $(dir $(TARGETDIR))PkgInfo $(dir $(TARGETDIR))Info.plist | $(TARGETDIR)')
else
- _p('all: $(TARGETDIR) $(OBJDIRS) prebuild prelink $(TARGET)')
+ _p('all: $(OBJDIRS) prebuild prelink $(TARGET) | $(TARGETDIR)')
end
_p('\t@:')
_p('')
@@ -86,7 +86,7 @@
end
-- target build rule
- _p('$(TARGET): $(GCH) $(OBJECTS) $(LDDEPS) $(RESOURCES)')
+ _p('$(TARGET): $(GCH) $(OBJECTS) $(LDDEPS) $(RESOURCES) | $(TARGETDIR) $(OBJDIRS)')
if prj.kind == "StaticLib" then
if prj.msgarchiving then
@@ -162,7 +162,7 @@
-- per-file build rules
cpp.fileRules(prj)
-
+
-- per-dependency build rules
cpp.dependencyRules(prj)
@@ -172,7 +172,7 @@
for _, depdata in ipairs(buildtask[3] or {}) do
deps = deps .. string.format("%s ",path.getrelative(prj.location,depdata))
end
- _p('%s: %s'
+ _p('%s: %s | $(TARGETDIR) $(OBJDIRS)'
,path.getrelative(prj.location,buildtask[2])
, deps
)
@@ -185,14 +185,14 @@
end
cmd = string.gsub(cmd, "%$%(<%)", "$<")
cmd = string.gsub(cmd, "%$%(@%)", "$@")
-
+
_p('\t$(SILENT) %s',cmd)
-
+
end
_p('')
end
end
-
+
-- include the dependencies, built by GCC (with the -MMD flag)
_p('-include $(OBJECTS:%%.o=%%.d)')
_p('ifneq (,$(PCH))')
@@ -359,7 +359,7 @@
if #cfg.forcedincludes > 0 then
_p(' FORCE_INCLUDE += -include %s'
- ,premake.esc(table.concat(cfg.forcedincludes, ";")))
+ ,_MAKE.esc(table.concat(cfg.forcedincludes, ";")))
end
_p(' ALL_CPPFLAGS += $(CPPFLAGS) %s $(DEFINES) $(INCLUDES)', table.concat(cc.getcppflags(cfg), " "))
@@ -387,24 +387,11 @@
_p(' LIBS += $(LDDEPS)%s', make.list(cc.getlinkflags(cfg)))
if cfg.kind == "StaticLib" then
- if cfg.platform:startswith("Universal") then
- _p(' LINKCMD = libtool -o $(TARGET)')
+ if (not prj.options.ArchiveSplit) then
+ _p(' LINKCMD = $(AR) %s $(TARGET)', make.list(cc.getarchiveflags(prj, cfg, false)))
else
- if (not prj.options.ArchiveSplit) then
- if cc.llvm then
- _p(' LINKCMD = $(AR) rcs $(TARGET)')
- else
- _p(' LINKCMD = $(AR) -rcs $(TARGET)')
- end
- else
- if cc.llvm then
- _p(' LINKCMD = $(AR) qc $(TARGET)')
- _p(' LINKCMD_NDX= $(AR) cs $(TARGET)')
- else
- _p(' LINKCMD = $(AR) -qc $(TARGET)')
- _p(' LINKCMD_NDX= $(AR) -cs $(TARGET)')
- end
- end
+ _p(' LINKCMD = $(AR) %s $(TARGET)', make.list(cc.getarchiveflags(prj, cfg, false)))
+ _p(' LINKCMD_NDX= $(AR) %s $(TARGET)', make.list(cc.getarchiveflags(prj, cfg, true)))
end
else
@@ -464,11 +451,15 @@
function cpp.pchrules(prj)
_p('ifneq (,$(PCH))')
- _p('$(GCH): $(PCH)')
- _p('\t@echo $(notdir $<)')
+ _p('$(GCH): $(PCH) | $(OBJDIR)')
+ if prj.msgprecompile then
+ _p('\t@echo ' .. prj.msgprecompile)
+ else
+ _p('\t@echo $(notdir $<)')
+ end
- local cmd = iif(prj.language == "C", "$(CC) -x c-header $(ALL_CFLAGS)", "$(CXX) -x c++-header $(ALL_CXXFLAGS)")
- _p('\t$(SILENT) %s -MMD -MP $(DEFINES) $(INCLUDES) -o "$@" -MF "$(@:%%.gch=%%.d)" -c "$<"', cmd)
+ local cmd = iif(prj.language == "C", "$(CC) $(ALL_CFLAGS) -x c-header", "$(CXX) $(ALL_CXXFLAGS) -x c++-header")
+ _p('\t$(SILENT) %s $(DEFINES) $(INCLUDES) -o "$@" -c "$<"', cmd)
_p('endif')
_p('')
@@ -482,7 +473,7 @@
function cpp.fileRules(prj)
for _, file in ipairs(prj.files or {}) do
if path.iscppfile(file) then
- _p('$(OBJDIR)/%s.o: %s'
+ _p('$(OBJDIR)/%s.o: %s $(GCH)'
, _MAKE.esc(path.trimdots(path.removeext(file)))
, _MAKE.esc(file)
)
@@ -494,7 +485,7 @@
_p('\t@echo $(notdir $<)')
end
if (path.isobjcfile(file)) then
- _p('\t$(SILENT) $(CXX) $(ALL_OBJCFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%%.o=%%.d) -c "$<"')
+ _p('\t$(SILENT) $(CXX) $(ALL_OBJCFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"')
else
cpp.buildcommand(path.iscfile(file) and not prj.options.ForceCPP, "o")
end
@@ -502,7 +493,7 @@
_p('\t$(SILENT) %s', task)
_p('')
end
-
+
_p('')
elseif (path.getextension(file) == ".rc") then
_p('$(OBJDIR)/%s.res: %s', _MAKE.esc(path.getbasename(file)), _MAKE.esc(file))
@@ -516,7 +507,7 @@
end
end
end
-
+
function cpp.dependencyRules(prj)
for _, dependency in ipairs(prj.dependency or {}) do
for _, dep in ipairs(dependency or {}) do
@@ -535,9 +526,9 @@
end
end
end
-
+
function cpp.buildcommand(iscfile, objext)
local flags = iif(iscfile, '$(CC) $(ALL_CFLAGS)', '$(CXX) $(ALL_CXXFLAGS)')
- _p('\t$(SILENT) %s $(FORCE_INCLUDE) -o "$@" -MF $(@:%%.%s=%%.d) -c "$<"', flags, objext)
+ _p('\t$(SILENT) %s $(FORCE_INCLUDE) -o "$@" -c "$<"', flags, objext)
end
diff --git a/3rdparty/genie/src/actions/vstudio/_vstudio.lua b/3rdparty/genie/src/actions/vstudio/_vstudio.lua
index 175610d16ba..9dafd85aabc 100644
--- a/3rdparty/genie/src/actions/vstudio/_vstudio.lua
+++ b/3rdparty/genie/src/actions/vstudio/_vstudio.lua
@@ -255,6 +255,7 @@
productVersion = "9.0.21022",
solutionVersion = "10",
toolsVersion = "3.5",
+ supports64bitEditContinue = false,
}
}
@@ -303,5 +304,6 @@
solutionVersion = "11",
targetFramework = "4.0",
toolsVersion = "4.0",
+ supports64bitEditContinue = false,
}
}
diff --git a/3rdparty/genie/src/actions/vstudio/vs2010_vcxproj.lua b/3rdparty/genie/src/actions/vstudio/vs2010_vcxproj.lua
index 663ff557d3f..a2be4f51f96 100644
--- a/3rdparty/genie/src/actions/vstudio/vs2010_vcxproj.lua
+++ b/3rdparty/genie/src/actions/vstudio/vs2010_vcxproj.lua
@@ -264,7 +264,7 @@
--
local debug_info = ''
if cfg.flags.Symbols then
- if cfg.platform == "x64"
+ if (action.vstudio.supports64bitEditContinue == false and cfg.platform == "x64")
or cfg.flags.Managed
or premake.config.isoptimizedbuild(cfg.flags)
or cfg.flags.NoEditAndContinue
@@ -723,7 +723,7 @@
t = ' DefaultTargets="' .. targets .. '"'
end
- _p('<Project%s ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">', t)
+ _p('<Project%s ToolsVersion="%s" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">', t, action.vstudio.toolsVersion)
end
diff --git a/3rdparty/genie/src/actions/vstudio/vs2012.lua b/3rdparty/genie/src/actions/vstudio/vs2012.lua
index f0f34e4ccda..86eb2bb80a3 100644
--- a/3rdparty/genie/src/actions/vstudio/vs2012.lua
+++ b/3rdparty/genie/src/actions/vstudio/vs2012.lua
@@ -53,6 +53,7 @@
solutionVersion = "12",
targetFramework = "4.5",
toolsVersion = "4.0",
+ supports64bitEditContinue = false,
}
}
diff --git a/3rdparty/genie/src/actions/vstudio/vs2013.lua b/3rdparty/genie/src/actions/vstudio/vs2013.lua
index b788c7915df..1449613bdbf 100644
--- a/3rdparty/genie/src/actions/vstudio/vs2013.lua
+++ b/3rdparty/genie/src/actions/vstudio/vs2013.lua
@@ -58,5 +58,6 @@
solutionVersion = "12",
targetFramework = "4.5",
toolsVersion = "12.0",
+ supports64bitEditContinue = false,
}
}
diff --git a/3rdparty/genie/src/actions/vstudio/vs2015.lua b/3rdparty/genie/src/actions/vstudio/vs2015.lua
index fee0341c648..e79ce6e2c99 100644
--- a/3rdparty/genie/src/actions/vstudio/vs2015.lua
+++ b/3rdparty/genie/src/actions/vstudio/vs2015.lua
@@ -54,9 +54,10 @@
oncleantarget = premake.vstudio.cleantarget,
vstudio = {
- solutionVersion = "14",
+ solutionVersion = "12",
targetFramework = "4.5",
toolsVersion = "14.0",
windowsTargetPlatformVersion = "8.1",
+ supports64bitEditContinue = true,
}
}
diff --git a/3rdparty/genie/src/base/api.lua b/3rdparty/genie/src/base/api.lua
index 7190a89d19d..09976de941a 100644
--- a/3rdparty/genie/src/base/api.lua
+++ b/3rdparty/genie/src/base/api.lua
@@ -371,6 +371,12 @@
scope = "config",
},
+ msgprecompile =
+ {
+ kind = "string",
+ scope = "config",
+ },
+
msgcompile_objc =
{
kind = "string",
diff --git a/3rdparty/genie/src/base/cmdline.lua b/3rdparty/genie/src/base/cmdline.lua
index 89d86ebf19a..e186ac3eaf2 100644
--- a/3rdparty/genie/src/base/cmdline.lua
+++ b/3rdparty/genie/src/base/cmdline.lua
@@ -17,6 +17,7 @@
allowed = {
{ "gcc", "GNU GCC (gcc/g++)" },
{ "ow", "OpenWatcom" },
+ { "ghs", "Green Hills Software" },
}
}
@@ -73,7 +74,8 @@
{ "ps3", "Playstation 3 (experimental)" },
{ "orbis", "Playstation 4" },
{ "xbox360", "Xbox 360 (experimental)" },
- { "ARM", "ARM (Microsoft)" },
+ { "ARM", "ARM" },
+ { "PowerPC", "PowerPC" },
}
}
diff --git a/3rdparty/genie/src/base/globals.lua b/3rdparty/genie/src/base/globals.lua
index 996e29f6f70..436aadd1469 100644
--- a/3rdparty/genie/src/base/globals.lua
+++ b/3rdparty/genie/src/base/globals.lua
@@ -57,11 +57,15 @@
iscrosscompiler = true,
namestyle = "windows",
},
+ PowerPC =
+ {
+ cfgsuffix = "ppc",
+ iscrosscompiler = true,
+ },
ARM =
{
cfgsuffix = "ARM",
iscrosscompiler = true,
- namestyle = "windows"
},
Orbis =
{
diff --git a/3rdparty/genie/src/host/scripts.c b/3rdparty/genie/src/host/scripts.c
index 85f108cf7f8..f09e80a559e 100644
--- a/3rdparty/genie/src/host/scripts.c
+++ b/3rdparty/genie/src/host/scripts.c
@@ -28,8 +28,8 @@ const char* builtin_scripts[] = {
"function io.capture()\nio.captured = ''\nend\nfunction io.endcapture()\nlocal captured = io.captured\nio.captured = nil\nreturn captured\nend\nlocal builtin_open = io.open\nfunction io.open(fname, mode)\nif (mode) then\nif (mode:find(\"w\")) then\nlocal dir = path.getdirectory(fname)\nok, err = os.mkdir(dir)\nif (not ok) then\nerror(err, 0)\nend\nend\nend\nreturn builtin_open(fname, mode)\nend\nfunction io.printf(msg, ...)\nlocal arg={...}\nif not io.eol then\nio.eol = \"\\n\"\nend\nif not io.indent then\nio.indent = \"\\t\"\nend\nif type(msg) == \"number\" then\ns = string.rep(io.indent, msg) .. string.format(table.unpack(arg))\nelse\ns = string.format(msg, table.unpack(arg))\nend\nif io.captured then\nio.captured = io.captured .. s .. io.eol\nelse\nio.write(s)\nio.write(io.eol)\nend\nend\n_p = io.printf\n",
/* base/globals.lua */
- "premake = { }\npremake.platforms = \n{\nNative = \n{ \ncfgsuffix = \"\",\n},\nx32 = \n{ \ncfgsuffix = \"32\",\n},\nx64 = \n{ \ncfgsuffix = \"64\",\n},\nUniversal = \n{ \ncfgsuffix = \"univ\",\n},\nUniversal32 = \n{ \ncfgsuffix = \"univ32\",\n},\nUniversal64 = \n{ \ncfgsuffix = \"univ64\",\n},\nPS3 = \n{ \ncfgsuffix = \"ps3\",\niscrosscompiler = true,\nnosharedlibs = true,\nnamestyle = \"PS3\",\n},\nWiiDev =\n{\ncfgsuffix = \"wii\",\niscrosscompiler = true,\nnamestyle = \"PS3\",\n},\nXbox360 = \n{ \ncfgsuffix = \"xbox360\",\niscrosscompiler = true,\nnamestyle = \"windows\",\n},\nARM =\n{\ncfgsuffix = \"ARM\",\niscrosscompiler = true,\nnamestyle = \"windows\"\n},\nOrbis = \n{ \ncfgsuffix = \"orbis\",\niscrosscompiler = true,\nnosharedlibs = true, -- @thendrix, Fix this to allow SPRXs\nnamestyle = \"Orbis\",\n},\n}\nlocal builtin_dofile = dofile\nfunction dofile(fname)\nlocal oldcwd = os.getcwd()\nlocal oldfile "
- "= _SCRIPT\nif (not os.isfile(fname)) then\nlocal path = os.pathsearch(fname, _OPTIONS[\"scripts\"], os.getenv(\"PREMAKE_PATH\"))\nif (path) then\nfname = path..\"/\"..fname\nend\nend\n_SCRIPT = path.getabsolute(fname)\nlocal newcwd = path.getdirectory(_SCRIPT)\nos.chdir(newcwd)\nlocal a, b, c, d, e, f = builtin_dofile(_SCRIPT)\n_SCRIPT = oldfile\nos.chdir(oldcwd)\nreturn a, b, c, d, e, f\nend\nfunction iif(expr, trueval, falseval)\nif (expr) then\nreturn trueval\nelse\nreturn falseval\nend\nend\nfunction include(fname)\nlocal dir, name = premake.findDefaultScript(fname, false)\nif dir ~= nil then\nreturn dofile(dir .. \"/\" .. name)\nend\nreturn nil\nend\nfunction printf(msg, ...)\nlocal arg={...}\nprint(string.format(msg, table.unpack(arg)))\nend\nlocal builtin_type = type\nfunction type(t)\nlocal mt = getmetatable(t)\nif (mt) then\nif (mt.__type) then\nreturn mt.__type\nend\nend\nreturn builtin_type(t)\nend\n",
+ "premake = { }\npremake.platforms = \n{\nNative = \n{ \ncfgsuffix = \"\",\n},\nx32 = \n{ \ncfgsuffix = \"32\",\n},\nx64 = \n{ \ncfgsuffix = \"64\",\n},\nUniversal = \n{ \ncfgsuffix = \"univ\",\n},\nUniversal32 = \n{ \ncfgsuffix = \"univ32\",\n},\nUniversal64 = \n{ \ncfgsuffix = \"univ64\",\n},\nPS3 = \n{ \ncfgsuffix = \"ps3\",\niscrosscompiler = true,\nnosharedlibs = true,\nnamestyle = \"PS3\",\n},\nWiiDev =\n{\ncfgsuffix = \"wii\",\niscrosscompiler = true,\nnamestyle = \"PS3\",\n},\nXbox360 = \n{ \ncfgsuffix = \"xbox360\",\niscrosscompiler = true,\nnamestyle = \"windows\",\n},\nPowerPC =\n{\ncfgsuffix = \"ppc\",\niscrosscompiler = true,\n},\nARM =\n{\ncfgsuffix = \"ARM\",\niscrosscompiler = true,\n},\nOrbis = \n{ \ncfgsuffix = \"orbis\",\niscrosscompiler = true,\nnosharedlibs = true, -- @thendrix, Fix this to allow SPRXs\nnamestyle = \"Orbis\",\n},\n}\nlocal builtin_dofile = dofile\nfunction dofile(fname)\nlo"
+ "cal oldcwd = os.getcwd()\nlocal oldfile = _SCRIPT\nif (not os.isfile(fname)) then\nlocal path = os.pathsearch(fname, _OPTIONS[\"scripts\"], os.getenv(\"PREMAKE_PATH\"))\nif (path) then\nfname = path..\"/\"..fname\nend\nend\n_SCRIPT = path.getabsolute(fname)\nlocal newcwd = path.getdirectory(_SCRIPT)\nos.chdir(newcwd)\nlocal a, b, c, d, e, f = builtin_dofile(_SCRIPT)\n_SCRIPT = oldfile\nos.chdir(oldcwd)\nreturn a, b, c, d, e, f\nend\nfunction iif(expr, trueval, falseval)\nif (expr) then\nreturn trueval\nelse\nreturn falseval\nend\nend\nfunction include(fname)\nlocal dir, name = premake.findDefaultScript(fname, false)\nif dir ~= nil then\nreturn dofile(dir .. \"/\" .. name)\nend\nreturn nil\nend\nfunction printf(msg, ...)\nlocal arg={...}\nprint(string.format(msg, table.unpack(arg)))\nend\nlocal builtin_type = type\nfunction type(t)\nlocal mt = getmetatable(t)\nif (mt) then\nif (mt.__type) then\nreturn mt.__type\nend\nend\nreturn builtin_type(t)\nend\n",
/* base/action.lua */
"premake.action = { }\npremake.action.list = { }\nfunction premake.action.add(a)\nlocal missing\nfor _, field in ipairs({\"description\", \"trigger\"}) do\nif (not a[field]) then\nmissing = field\nend\nend\nif (missing) then\nerror(\"action needs a \" .. missing, 3)\nend\npremake.action.list[a.trigger] = a\nend\nfunction premake.action.call(name)\nlocal a = premake.action.list[name]\nfor sln in premake.solution.each() do\nif a.onsolution then\na.onsolution(sln)\nend\nfor prj in premake.solution.eachproject(sln) do\nif a.onproject then\na.onproject(prj)\nend\nend\nend\nif a.execute then\na.execute()\nend\nend\nfunction premake.action.current()\nreturn premake.action.get(_ACTION)\nend\nfunction premake.action.get(name)\nreturn premake.action.list[name]\nend\nfunction premake.action.each()\nlocal keys = { }\nfor _, action in pairs(premake.action.list) do\ntable.insert(keys, action.trigger)\nend\ntable.sort(keys)\nlocal i = 0\nreturn function()\ni = i + 1\nreturn premake.action.list[keys[i]]\nend\nend\nfunction pre"
@@ -84,22 +84,22 @@ const char* builtin_scripts[] = {
"table\",\nscope = \"config\",\n},\nexcludes =\n{\nkind = \"filelist\",\nscope = \"config\",\n},\nfiles =\n{\nkind = \"filelist\",\nscope = \"config\",\n},\nremovefiles =\n{\nkind = \"filelist\",\nscope = \"config\",\n},\nflags =\n{\nkind = \"list\",\nscope = \"config\",\nisflags = true,\nusagecopy = true,\nallowed = function(value)\nlocal allowed_flags = {\nATL = 1,\nDebugEnvsDontMerge = 1,\nDebugEnvsInherit = 1,\nEnableMinimalRebuild = 1,\nEnableSSE = 1,\nEnableSSE2 = 1,\nExtraWarnings = 1,\nFatalWarnings = 1,\nFloatFast = 1,\nFloatStrict = 1,\nManaged = 1,\nMFC = 1,\nNativeWChar = 1,\nNo64BitChecks = 1,\nNoEditAndContinue = 1,\nNoExceptions = 1,\nNoFramePointer = 1,\nNoImportLib = 1,\nNoIncrementalLink = 1,\nNoManifest = 1,\nNoMultiProcessorCompilation = 1,\nNoNativeWChar = 1,\nNoPCH = 1,\nNoRTTI = 1,\nFastCall = 1,\nStdCall = 1,\nSingleOutputDir = 1,\nOptimize = 1,\nOptimizeSize = 1,\nOptimizeSpeed = 1,\nDebugRuntime = 1,\nReleaseRuntime = 1,\nSEH = 1,\nStaticATL = 1,\nStaticRuntime = 1,\nSymbols = 1,\n"
"Unicode = 1,\nUnsafe = 1,\nUnsignedChar = 1,\nWinMain = 1,\n}\nlocal englishToAmericanSpelling =\n{\noptimise = 'optimize',\noptimisesize = 'optimizesize',\noptimisespeed = 'optimizespeed',\n}\nlocal lowervalue = value:lower()\nlowervalue = englishToAmericanSpelling[lowervalue] or lowervalue\nfor v, _ in pairs(allowed_flags) do\nif v:lower() == lowervalue then\nreturn v\nend\nend\nreturn nil, \"invalid flag\"\nend,\n},\nframework =\n{\nkind = \"string\",\nscope = \"container\",\nallowed = {\n\"1.0\",\n\"1.1\",\n\"2.0\",\n\"3.0\",\n\"3.5\",\n\"4.0\",\n\"4.5\",\n}\n},\nwindowstargetplatformversion =\n{\nkind = \"string\",\nscope = \"project\",\n},\nforcedincludes =\n{\nkind = \"absolutefilelist\",\nscope = \"config\",\n},\nimagepath =\n{\nkind = \"path\",\nscope = \"config\",\n},\nimageoptions =\n{\nkind = \"list\",\nscope = \"config\",\n},\nimplibdir =\n{\nkind = \"path\",\nscope = \"config\",\n},\nimplibextension =\n{\nkind = \"string\",\nscope = \"config\",\n},\nimplibname =\n{\nkind = \"string\",\nscop"
"e = \"config\",\n},\nimplibprefix =\n{\nkind = \"string\",\nscope = \"config\",\n},\nimplibsuffix =\n{\nkind = \"string\",\nscope = \"config\",\n},\nincludedirs =\n{\nkind = \"dirlist\",\nscope = \"config\",\nusagecopy = true,\n},\nkind =\n{\nkind = \"string\",\nscope = \"config\",\nallowed = {\n\"ConsoleApp\",\n\"WindowedApp\",\n\"StaticLib\",\n\"SharedLib\"\n}\n},\nlanguage =\n{\nkind = \"string\",\nscope = \"container\",\nallowed = {\n\"C\",\n\"C++\",\n\"C#\"\n}\n},\nlibdirs =\n{\nkind = \"dirlist\",\nscope = \"config\",\nlinkagecopy = true,\n},\nlinkoptions =\n{\nkind = \"list\",\nscope = \"config\",\n},\nlinks =\n{\nkind = \"list\",\nscope = \"config\",\nallowed = function(value)\nif value:find('/', nil, true) then\nvalue = path.getabsolute(value)\nend\nreturn value\nend,\nlinkagecopy = true,\n},\nlocation =\n{\nkind = \"path\",\nscope = \"container\",\n},\nmakesettings =\n{\nkind = \"list\",\nscope = \"config\",\n},\nmessageskip =\n{\nkind = \"list\",\nscope = \"solution\",\nisflags = true,\nus"
- "agecopy = true,\nallowed = function(value)\nlocal allowed_messages = {\nSkipCreatingMessage = 1,\nSkipBuildingMessage = 1,\nSkipCleaningMessage = 1,\n}\nlocal lowervalue = value:lower()\nfor v, _ in pairs(allowed_messages) do\nif v:lower() == lowervalue then\nreturn v\nend\nend\nreturn nil, \"invalid message to skip\"\nend,\n},\nmsgarchiving =\n{\nkind = \"string\",\nscope = \"config\",\n},\nmsgcompile =\n{\nkind = \"string\",\nscope = \"config\",\n},\nmsgcompile_objc =\n{\nkind = \"string\",\nscope = \"config\",\n},\nmsgresource =\n{\nkind = \"string\",\nscope = \"config\",\n},\nmsglinking =\n{\nkind = \"string\",\nscope = \"config\",\n},\nobjdir =\n{\nkind = \"path\",\nscope = \"config\",\n},\noptions =\n{\nkind = \"list\",\nscope = \"container\",\nisflags = true,\nusagecopy = true,\nallowed = function(value)\nlocal allowed_options = {\nForceCPP = 1,\nArchiveSplit = 1\n}\nlocal lowervalue = value:lower()\nfor v, _ in pairs(allowed_options) do\nif v:lower() == lowervalue then\nreturn v\nend\nend\nretur"
- "n nil, \"invalid option\"\nend,\n},\npchheader =\n{\nkind = \"string\",\nscope = \"config\",\n},\npchsource =\n{\nkind = \"path\",\nscope = \"config\",\n},\nplatforms =\n{\nkind = \"list\",\nscope = \"solution\",\nallowed = table.keys(premake.platforms),\n},\npostbuildcommands =\n{\nkind = \"list\",\nscope = \"config\",\n},\nprebuildcommands =\n{\nkind = \"list\",\nscope = \"config\",\n},\npostcompiletasks =\n{\nkind = \"list\",\nscope = \"config\",\n},\nprelinkcommands =\n{\nkind = \"list\",\nscope = \"config\",\n},\nresdefines =\n{\nkind = \"list\",\nscope = \"config\",\n},\nresincludedirs =\n{\nkind = \"dirlist\",\nscope = \"config\",\n},\nresoptions =\n{\nkind = \"list\",\nscope = \"config\",\n},\nstartproject =\n{\nkind = \"string\",\nscope = \"solution\",\n},\ntargetdir =\n{\nkind = \"path\",\nscope = \"config\",\n},\ntargetsubdir =\n{\nkind = \"string\",\nscope = \"config\",\n},\ntargetextension =\n{\nkind = \"string\",\nscope = \"config\",\n},\ntargetname =\n{\nkind = \"string\",\nscope "
- "= \"config\",\n},\ntargetprefix =\n{\nkind = \"string\",\nscope = \"config\",\n},\ntargetsuffix =\n{\nkind = \"string\",\nscope = \"config\",\n},\ntrimpaths =\n{\nkind = \"dirlist\",\nscope = \"config\",\n},\nuuid =\n{\nkind = \"string\",\nscope = \"container\",\nallowed = function(value)\nlocal ok = true\nif (#value ~= 36) then ok = false end\nfor i=1,36 do\nlocal ch = value:sub(i,i)\nif (not ch:find(\"[ABCDEFabcdef0123456789-]\")) then ok = false end\nend\nif (value:sub(9,9) ~= \"-\") then ok = false end\nif (value:sub(14,14) ~= \"-\") then ok = false end\nif (value:sub(19,19) ~= \"-\") then ok = false end\nif (value:sub(24,24) ~= \"-\") then ok = false end\nif (not ok) then\nreturn nil, \"invalid UUID\"\nend\nreturn value:upper()\nend\n},\nuses =\n{\nkind = \"list\",\nscope = \"config\",\n},\nvpaths =\n{\nkind = \"keypath\",\nscope = \"container\",\n},\n}\npremake.check_paths = false\nfunction premake.checkvalue(value, allowed)\nif (allowed) then\nif (type(allowed) == \"function\") then\nreturn allowe"
- "d(value)\nelse\nfor _,v in ipairs(allowed) do\nif (value:lower() == v:lower()) then\nreturn v\nend\nend\nreturn nil, \"invalid value '\" .. value .. \"'\"\nend\nelse\nreturn value\nend\nend\nfunction premake.getobject(t)\nlocal container\nif (t == \"container\" or t == \"solution\") then\ncontainer = premake.CurrentContainer\nelse\ncontainer = premake.CurrentConfiguration\nend\nif t == \"solution\" then\nif type(container) == \"project\" then\ncontainer = container.solution\nend\nif type(container) ~= \"solution\" then\ncontainer = nil\nend\nend\nlocal msg\nif (not container) then\nif (t == \"container\") then\nmsg = \"no active solution or project\"\nelseif (t == \"solution\") then\nmsg = \"no active solution\"\nelse\nmsg = \"no active solution, project, or configuration\"\nend\nend\nreturn container, msg\nend\nfunction premake.setarray(obj, fieldname, value, allowed)\nobj[fieldname] = obj[fieldname] or {}\nlocal function add(value, depth)\nif type(value) == \"table\" then\nfor _,v in ipairs(value) do\nadd(v,"
- " depth + 1)\nend\nelse\nvalue, err = premake.checkvalue(value, allowed)\nif not value then\nerror(err, depth)\nend\ntable.insert(obj[fieldname], value)\nend\nend\nif value then\nadd(value, 5)\nend\nreturn obj[fieldname]\nend\nfunction premake.settable(obj, fieldname, value, allowed)\nobj[fieldname] = obj[fieldname] or {}\ntable.insert(obj[fieldname], value)\nreturn obj[fieldname]\nend\nlocal function domatchedarray(ctype, fieldname, value, matchfunc)\nlocal result = { }\nfunction makeabsolute(value, depth)\nif (type(value) == \"table\") then\nfor _, item in ipairs(value) do\nmakeabsolute(item, depth + 1)\nend\nelseif type(value) == \"string\" then\nif value:find(\"*\") then\nlocal arr = matchfunc(value);\nif (premake.check_paths) and (#arr == 0) then\nerror(\"Can't find matching files for pattern :\" .. value)\nend\nmakeabsolute(arr, depth + 1)\nelse\ntable.insert(result, path.getabsolute(value))\nend\nelse\nerror(\"Invalid value in list: expected string, got \" .. type(value), depth)\nend\nend\nmakeabsolute(v"
- "alue, 3)\nreturn premake.setarray(ctype, fieldname, result)\nend\nfunction premake.setdirarray(ctype, fieldname, value)\nreturn domatchedarray(ctype, fieldname, value, os.matchdirs)\nend\nfunction premake.setfilearray(ctype, fieldname, value)\nreturn domatchedarray(ctype, fieldname, value, os.matchfiles)\nend\nfunction premake.setkeyvalue(ctype, fieldname, values)\nlocal container, err = premake.getobject(ctype)\nif not container then\nerror(err, 4)\nend\nif not container[fieldname] then\ncontainer[fieldname] = {}\nend\nif type(values) ~= \"table\" then\nerror(\"invalid value; table expected\", 4)\nend\nlocal field = container[fieldname]\nfor key,value in pairs(values) do\nif not field[key] then\nfield[key] = {}\nend\ntable.insertflat(field[key], value)\nend\nreturn field\nend\nfunction premake.setstring(ctype, fieldname, value, allowed)\nlocal container, err = premake.getobject(ctype)\nif (not container) then\nerror(err, 4)\nend\nif (value) then\nvalue, err = premake.checkvalue(value, allowed)\nif (not value)"
- " then\nerror(err, 4)\nend\ncontainer[fieldname] = value\nend\nreturn container[fieldname]\nend\nfunction premake.remove(fieldname, value)\nlocal cfg = premake.CurrentConfiguration\ncfg.removes = cfg.removes or {}\ncfg.removes[fieldname] = premake.setarray(cfg.removes, fieldname, value)\nend\nlocal function accessor(name, value)\nlocal kind = premake.fields[name].kind\nlocal scope = premake.fields[name].scope\nlocal allowed = premake.fields[name].allowed\nif (kind == \"string\" or kind == \"path\") and value then\nif type(value) ~= \"string\" then\nerror(\"string value expected\", 3)\nend\nend\nlocal container, err = premake.getobject(scope)\nif (not container) then\nerror(err, 3)\nend\nif kind == \"string\" then\nreturn premake.setstring(scope, name, value, allowed)\nelseif kind == \"path\" then\nif value then value = path.getabsolute(value) end\nreturn premake.setstring(scope, name, value)\nelseif kind == \"list\" then\nreturn premake.setarray(container, name, value, allowed)\nelseif kind == \"table\" th"
- "en\nreturn premake.settable(container, name, value, allowed)\nelseif kind == \"dirlist\" then\nreturn premake.setdirarray(container, name, value)\nelseif kind == \"filelist\" or kind == \"absolutefilelist\" then\nreturn premake.setfilearray(container, name, value)\nelseif kind == \"keyvalue\" or kind == \"keypath\" then\nreturn premake.setkeyvalue(scope, name, value)\nend\nend\nfor name, info in pairs(premake.fields) do\n_G[name] = function(value)\nreturn accessor(name, value)\nend\nif info.kind == \"list\"\nor info.kind == \"dirlist\"\nor info.kind == \"filelist\"\nor info.kind == \"absolutefilelist\"\nthen\nif name ~= \"removefiles\"\nand name ~= \"files\" then\n_G[\"remove\"..name] = function(value)\npremake.remove(name, value)\nend\nend\nend\nend\nfunction configuration(terms)\nif not terms then\nreturn premake.CurrentConfiguration\nend\nlocal container, err = premake.getobject(\"container\")\nif (not container) then\nerror(err, 2)\nend\nlocal cfg = { }\ncfg.terms = table.flatten({terms})\ntable.insert(co"
- "ntainer.blocks, cfg)\npremake.CurrentConfiguration = cfg\ncfg.keywords = { }\nfor _, word in ipairs(cfg.terms) do\ntable.insert(cfg.keywords, path.wildcards(word):lower())\nend\nfor name, field in pairs(premake.fields) do\nif (field.kind ~= \"string\" and field.kind ~= \"path\") then\ncfg[name] = { }\nend\nend\nreturn cfg\nend\nlocal function creategroup(name, sln, curpath, parent, inpath)\nlocal group = {}\nsetmetatable(group, {\n__type = \"group\"\n})\ntable.insert(sln.groups, group)\nsln.groups[inpath] = group\ngroup.solution = sln\ngroup.name = name\ngroup.uuid = os.uuid(curpath)\ngroup.parent = parent\nreturn group\nend\nlocal function creategroupsfrompath(inpath, sln)\nif inpath == nil then return nil end\ninpath = path.translate(inpath, \"/\")\nlocal groups = string.explode(inpath, \"/\")\nlocal curpath = \"\"\nlocal lastgroup = nil\nfor i, v in ipairs(groups) do\ncurpath = curpath .. \"/\" .. v:lower()\nlocal group = sln.groups[curpath]\nif group == nil then\ngroup = creategroup(v, sln, curpath, lastgr"
- "oup, curpath)\nend\nlastgroup = group\nend\nreturn lastgroup\nend\nlocal function createproject(name, sln, isUsage)\nlocal prj = {}\nsetmetatable(prj, {\n__type = \"project\",\n})\ntable.insert(sln.projects, prj)\nif(isUsage) then\nif(sln.projects[name]) then\nsln.projects[name].usageProj = prj;\nelse\nsln.projects[name] = prj\nend\nelse\nif(sln.projects[name]) then\nprj.usageProj = sln.projects[name];\nend\nsln.projects[name] = prj\nend\nlocal group = creategroupsfrompath(premake.CurrentGroup, sln)\nprj.solution = sln\nprj.name = name\nprj.basedir = os.getcwd()\nprj.uuid = os.uuid(prj.name)\nprj.blocks = { }\nprj.usage = isUsage\nprj.group = group\nreturn prj;\nend\nfunction usage(name)\nif (not name) then\nif(type(premake.CurrentContainer) ~= \"project\") then return nil end\nif(not premake.CurrentContainer.usage) then return nil end\nreturn premake.CurrentContainer\nend\nlocal sln\nif (type(premake.CurrentContainer) == \"project\") then\nsln = prema"
- "ke.CurrentContainer.solution\nelse\nsln = premake.CurrentContainer\nend\nif (type(sln) ~= \"solution\") then\nerror(\"no active solution\", 2)\nend\nif((not sln.projects[name]) or\n((not sln.projects[name].usage) and (not sln.projects[name].usageProj))) then\npremake.CurrentContainer = createproject(name, sln, true)\nelse\npremake.CurrentContainer = iff(sln.projects[name].usage,\nsln.projects[name], sln.projects[name].usageProj)\nend\nconfiguration { }\nreturn premake.CurrentContainer\nend\nfunction project(name)\nif (not name) then\nif(type(premake.CurrentContainer) ~= \"project\") then return nil end\nif(premake.CurrentContainer.usage) then return nil end\nreturn premake.CurrentContainer\nend\nlocal sln\nif (type(premake.CurrentContainer) == \"project\") then\nsln = premake.CurrentContainer.solution\nelse\nsln = premake.CurrentContainer\nend\nif (type(sln) ~= \"solution\") then\nerror(\"no active solution\", 2)\nend\nif((not sln.projects[name]) or sln.projects[name].usage) then\npremake.CurrentContainer = cr"
- "eateproject(name, sln)\nelse\npremake.CurrentContainer = sln.projects[name];\nend\nconfiguration { }\nreturn premake.CurrentContainer\nend\nfunction solution(name)\nif not name then\nif type(premake.CurrentContainer) == \"project\" then\nreturn premake.CurrentContainer.solution\nelse\nreturn premake.CurrentContainer\nend\nend\npremake.CurrentContainer = premake.solution.get(name)\nif (not premake.CurrentContainer) then\npremake.CurrentContainer = premake.solution.new(name)\nend\nconfiguration { }\nreturn premake.CurrentContainer\nend\nfunction group(name)\nif not name then\nreturn premake.CurrentGroup\nend\npremake.CurrentGroup = name\nreturn premake.CurrentGroup\nend\nfunction newaction(a)\npremake.action.add(a)\nend\nfunction newoption(opt)\npremake.option.add(opt)\nend\n",
+ "agecopy = true,\nallowed = function(value)\nlocal allowed_messages = {\nSkipCreatingMessage = 1,\nSkipBuildingMessage = 1,\nSkipCleaningMessage = 1,\n}\nlocal lowervalue = value:lower()\nfor v, _ in pairs(allowed_messages) do\nif v:lower() == lowervalue then\nreturn v\nend\nend\nreturn nil, \"invalid message to skip\"\nend,\n},\nmsgarchiving =\n{\nkind = \"string\",\nscope = \"config\",\n},\nmsgcompile =\n{\nkind = \"string\",\nscope = \"config\",\n},\nmsgprecompile =\n{\nkind = \"string\",\nscope = \"config\",\n},\nmsgcompile_objc =\n{\nkind = \"string\",\nscope = \"config\",\n},\nmsgresource =\n{\nkind = \"string\",\nscope = \"config\",\n},\nmsglinking =\n{\nkind = \"string\",\nscope = \"config\",\n},\nobjdir =\n{\nkind = \"path\",\nscope = \"config\",\n},\noptions =\n{\nkind = \"list\",\nscope = \"container\",\nisflags = true,\nusagecopy = true,\nallowed = function(value)\nlocal allowed_options = {\nForceCPP = 1,\nArchiveSplit = 1\n}\nlocal lowervalue = value:lower()\nfor v, _ in pairs(allowed_optio"
+ "ns) do\nif v:lower() == lowervalue then\nreturn v\nend\nend\nreturn nil, \"invalid option\"\nend,\n},\npchheader =\n{\nkind = \"string\",\nscope = \"config\",\n},\npchsource =\n{\nkind = \"path\",\nscope = \"config\",\n},\nplatforms =\n{\nkind = \"list\",\nscope = \"solution\",\nallowed = table.keys(premake.platforms),\n},\npostbuildcommands =\n{\nkind = \"list\",\nscope = \"config\",\n},\nprebuildcommands =\n{\nkind = \"list\",\nscope = \"config\",\n},\npostcompiletasks =\n{\nkind = \"list\",\nscope = \"config\",\n},\nprelinkcommands =\n{\nkind = \"list\",\nscope = \"config\",\n},\nresdefines =\n{\nkind = \"list\",\nscope = \"config\",\n},\nresincludedirs =\n{\nkind = \"dirlist\",\nscope = \"config\",\n},\nresoptions =\n{\nkind = \"list\",\nscope = \"config\",\n},\nstartproject =\n{\nkind = \"string\",\nscope = \"solution\",\n},\ntargetdir =\n{\nkind = \"path\",\nscope = \"config\",\n},\ntargetsubdir =\n{\nkind = \"string\",\nscope = \"config\",\n},\ntargetextension =\n{\nkind = \"string\",\nsco"
+ "pe = \"config\",\n},\ntargetname =\n{\nkind = \"string\",\nscope = \"config\",\n},\ntargetprefix =\n{\nkind = \"string\",\nscope = \"config\",\n},\ntargetsuffix =\n{\nkind = \"string\",\nscope = \"config\",\n},\ntrimpaths =\n{\nkind = \"dirlist\",\nscope = \"config\",\n},\nuuid =\n{\nkind = \"string\",\nscope = \"container\",\nallowed = function(value)\nlocal ok = true\nif (#value ~= 36) then ok = false end\nfor i=1,36 do\nlocal ch = value:sub(i,i)\nif (not ch:find(\"[ABCDEFabcdef0123456789-]\")) then ok = false end\nend\nif (value:sub(9,9) ~= \"-\") then ok = false end\nif (value:sub(14,14) ~= \"-\") then ok = false end\nif (value:sub(19,19) ~= \"-\") then ok = false end\nif (value:sub(24,24) ~= \"-\") then ok = false end\nif (not ok) then\nreturn nil, \"invalid UUID\"\nend\nreturn value:upper()\nend\n},\nuses =\n{\nkind = \"list\",\nscope = \"config\",\n},\nvpaths =\n{\nkind = \"keypath\",\nscope = \"container\",\n},\n}\npremake.check_paths = false\nfunction premake.checkvalue(value, allowed)\nif (all"
+ "owed) then\nif (type(allowed) == \"function\") then\nreturn allowed(value)\nelse\nfor _,v in ipairs(allowed) do\nif (value:lower() == v:lower()) then\nreturn v\nend\nend\nreturn nil, \"invalid value '\" .. value .. \"'\"\nend\nelse\nreturn value\nend\nend\nfunction premake.getobject(t)\nlocal container\nif (t == \"container\" or t == \"solution\") then\ncontainer = premake.CurrentContainer\nelse\ncontainer = premake.CurrentConfiguration\nend\nif t == \"solution\" then\nif type(container) == \"project\" then\ncontainer = container.solution\nend\nif type(container) ~= \"solution\" then\ncontainer = nil\nend\nend\nlocal msg\nif (not container) then\nif (t == \"container\") then\nmsg = \"no active solution or project\"\nelseif (t == \"solution\") then\nmsg = \"no active solution\"\nelse\nmsg = \"no active solution, project, or configuration\"\nend\nend\nreturn container, msg\nend\nfunction premake.setarray(obj, fieldname, value, allowed)\nobj[fieldname] = obj[fieldname] or {}\nlocal function add(value, depth)\nif "
+ "type(value) == \"table\" then\nfor _,v in ipairs(value) do\nadd(v, depth + 1)\nend\nelse\nvalue, err = premake.checkvalue(value, allowed)\nif not value then\nerror(err, depth)\nend\ntable.insert(obj[fieldname], value)\nend\nend\nif value then\nadd(value, 5)\nend\nreturn obj[fieldname]\nend\nfunction premake.settable(obj, fieldname, value, allowed)\nobj[fieldname] = obj[fieldname] or {}\ntable.insert(obj[fieldname], value)\nreturn obj[fieldname]\nend\nlocal function domatchedarray(ctype, fieldname, value, matchfunc)\nlocal result = { }\nfunction makeabsolute(value, depth)\nif (type(value) == \"table\") then\nfor _, item in ipairs(value) do\nmakeabsolute(item, depth + 1)\nend\nelseif type(value) == \"string\" then\nif value:find(\"*\") then\nlocal arr = matchfunc(value);\nif (premake.check_paths) and (#arr == 0) then\nerror(\"Can't find matching files for pattern :\" .. value)\nend\nmakeabsolute(arr, depth + 1)\nelse\ntable.insert(result, path.getabsolute(value))\nend\nelse\nerror(\"Invalid value in list: expect"
+ "ed string, got \" .. type(value), depth)\nend\nend\nmakeabsolute(value, 3)\nreturn premake.setarray(ctype, fieldname, result)\nend\nfunction premake.setdirarray(ctype, fieldname, value)\nreturn domatchedarray(ctype, fieldname, value, os.matchdirs)\nend\nfunction premake.setfilearray(ctype, fieldname, value)\nreturn domatchedarray(ctype, fieldname, value, os.matchfiles)\nend\nfunction premake.setkeyvalue(ctype, fieldname, values)\nlocal container, err = premake.getobject(ctype)\nif not container then\nerror(err, 4)\nend\nif not container[fieldname] then\ncontainer[fieldname] = {}\nend\nif type(values) ~= \"table\" then\nerror(\"invalid value; table expected\", 4)\nend\nlocal field = container[fieldname]\nfor key,value in pairs(values) do\nif not field[key] then\nfield[key] = {}\nend\ntable.insertflat(field[key], value)\nend\nreturn field\nend\nfunction premake.setstring(ctype, fieldname, value, allowed)\nlocal container, err = premake.getobject(ctype)\nif (not container) then\nerror(err, 4)\nend\nif (value) the"
+ "n\nvalue, err = premake.checkvalue(value, allowed)\nif (not value) then\nerror(err, 4)\nend\ncontainer[fieldname] = value\nend\nreturn container[fieldname]\nend\nfunction premake.remove(fieldname, value)\nlocal cfg = premake.CurrentConfiguration\ncfg.removes = cfg.removes or {}\ncfg.removes[fieldname] = premake.setarray(cfg.removes, fieldname, value)\nend\nlocal function accessor(name, value)\nlocal kind = premake.fields[name].kind\nlocal scope = premake.fields[name].scope\nlocal allowed = premake.fields[name].allowed\nif (kind == \"string\" or kind == \"path\") and value then\nif type(value) ~= \"string\" then\nerror(\"string value expected\", 3)\nend\nend\nlocal container, err = premake.getobject(scope)\nif (not container) then\nerror(err, 3)\nend\nif kind == \"string\" then\nreturn premake.setstring(scope, name, value, allowed)\nelseif kind == \"path\" then\nif value then value = path.getabsolute(value) end\nreturn premake.setstring(scope, name, value)\nelseif kind == \"list\" then\nreturn premake.seta"
+ "rray(container, name, value, allowed)\nelseif kind == \"table\" then\nreturn premake.settable(container, name, value, allowed)\nelseif kind == \"dirlist\" then\nreturn premake.setdirarray(container, name, value)\nelseif kind == \"filelist\" or kind == \"absolutefilelist\" then\nreturn premake.setfilearray(container, name, value)\nelseif kind == \"keyvalue\" or kind == \"keypath\" then\nreturn premake.setkeyvalue(scope, name, value)\nend\nend\nfor name, info in pairs(premake.fields) do\n_G[name] = function(value)\nreturn accessor(name, value)\nend\nif info.kind == \"list\"\nor info.kind == \"dirlist\"\nor info.kind == \"filelist\"\nor info.kind == \"absolutefilelist\"\nthen\nif name ~= \"removefiles\"\nand name ~= \"files\" then\n_G[\"remove\"..name] = function(value)\npremake.remove(name, value)\nend\nend\nend\nend\nfunction configuration(terms)\nif not terms then\nreturn premake.CurrentConfiguration\nend\nlocal container, err = premake.getobject(\"container\")\nif (not container) then\nerror(err, 2)\nend\nlo"
+ "cal cfg = { }\ncfg.terms = table.flatten({terms})\ntable.insert(container.blocks, cfg)\npremake.CurrentConfiguration = cfg\ncfg.keywords = { }\nfor _, word in ipairs(cfg.terms) do\ntable.insert(cfg.keywords, path.wildcards(word):lower())\nend\nfor name, field in pairs(premake.fields) do\nif (field.kind ~= \"string\" and field.kind ~= \"path\") then\ncfg[name] = { }\nend\nend\nreturn cfg\nend\nlocal function creategroup(name, sln, curpath, parent, inpath)\nlocal group = {}\nsetmetatable(group, {\n__type = \"group\"\n})\ntable.insert(sln.groups, group)\nsln.groups[inpath] = group\ngroup.solution = sln\ngroup.name = name\ngroup.uuid = os.uuid(curpath)\ngroup.parent = parent\nreturn group\nend\nlocal function creategroupsfrompath(inpath, sln)\nif inpath == nil then return nil end\ninpath = path.translate(inpath, \"/\")\nlocal groups = string.explode(inpath, \"/\")\nlocal curpath = \"\"\nlocal lastgroup = nil\nfor i, v in ipairs(groups) do\ncurpath = curpath .. \"/\" .. v:lower()\nlocal group = sln.groups[curpath]"
+ "\nif group == nil then\ngroup = creategroup(v, sln, curpath, lastgroup, curpath)\nend\nlastgroup = group\nend\nreturn lastgroup\nend\nlocal function createproject(name, sln, isUsage)\nlocal prj = {}\nsetmetatable(prj, {\n__type = \"project\",\n})\ntable.insert(sln.projects, prj)\nif(isUsage) then\nif(sln.projects[name]) then\nsln.projects[name].usageProj = prj;\nelse\nsln.projects[name] = prj\nend\nelse\nif(sln.projects[name]) then\nprj.usageProj = sln.projects[name];\nend\nsln.projects[name] = prj\nend\nlocal group = creategroupsfrompath(premake.CurrentGroup, sln)\nprj.solution = sln\nprj.name = name\nprj.basedir = os.getcwd()\nprj.uuid = os.uuid(prj.name)\nprj.blocks = { }\nprj.usage = isUsage\nprj.group = group\nreturn prj;\nend\nfunction usage(name)\nif (not name) then\nif(type(premake.CurrentContainer) ~= \"project\") then return nil end\nif(not premake.CurrentContainer.usage) then return nil end\nreturn premake.CurrentContainer\nend\nlocal sln\ni"
+ "f (type(premake.CurrentContainer) == \"project\") then\nsln = premake.CurrentContainer.solution\nelse\nsln = premake.CurrentContainer\nend\nif (type(sln) ~= \"solution\") then\nerror(\"no active solution\", 2)\nend\nif((not sln.projects[name]) or\n((not sln.projects[name].usage) and (not sln.projects[name].usageProj))) then\npremake.CurrentContainer = createproject(name, sln, true)\nelse\npremake.CurrentContainer = iff(sln.projects[name].usage,\nsln.projects[name], sln.projects[name].usageProj)\nend\nconfiguration { }\nreturn premake.CurrentContainer\nend\nfunction project(name)\nif (not name) then\nif(type(premake.CurrentContainer) ~= \"project\") then return nil end\nif(premake.CurrentContainer.usage) then return nil end\nreturn premake.CurrentContainer\nend\nlocal sln\nif (type(premake.CurrentContainer) == \"project\") then\nsln = premake.CurrentContainer.solution\nelse\nsln = premake.CurrentContainer\nend\nif (type(sln) ~= \"solution\") then\nerror(\"no active solution\", 2)\nend\nif((not sln.projects[name"
+ "]) or sln.projects[name].usage) then\npremake.CurrentContainer = createproject(name, sln)\nelse\npremake.CurrentContainer = sln.projects[name];\nend\nconfiguration { }\nreturn premake.CurrentContainer\nend\nfunction solution(name)\nif not name then\nif type(premake.CurrentContainer) == \"project\" then\nreturn premake.CurrentContainer.solution\nelse\nreturn premake.CurrentContainer\nend\nend\npremake.CurrentContainer = premake.solution.get(name)\nif (not premake.CurrentContainer) then\npremake.CurrentContainer = premake.solution.new(name)\nend\nconfiguration { }\nreturn premake.CurrentContainer\nend\nfunction group(name)\nif not name then\nreturn premake.CurrentGroup\nend\npremake.CurrentGroup = name\nreturn premake.CurrentGroup\nend\nfunction newaction(a)\npremake.action.add(a)\nend\nfunction newoption(opt)\npremake.option.add(opt)\nend\n",
/* base/cmdline.lua */
- "newoption \n{\ntrigger = \"cc\",\nvalue = \"VALUE\",\ndescription = \"Choose a C/C++ compiler set\",\nallowed = {\n{ \"gcc\", \"GNU GCC (gcc/g++)\" },\n{ \"ow\", \"OpenWatcom\" },\n}\n}\nnewoption\n{\ntrigger = \"dotnet\",\nvalue = \"VALUE\",\ndescription = \"Choose a .NET compiler set\",\nallowed = {\n{ \"msnet\", \"Microsoft .NET (csc)\" },\n{ \"mono\", \"Novell Mono (mcs)\" },\n{ \"pnet\", \"Portable.NET (cscc)\" },\n}\n}\nnewoption\n{\ntrigger = \"file\",\nvalue = \"FILE\",\ndescription = \"Read FILE as a Premake script; default is 'premake4.lua'\"\n}\nnewoption\n{\ntrigger = \"help\",\ndescription = \"Display this information\"\n}\nnewoption\n{\ntrigger = \"os\",\nvalue = \"VALUE\",\ndescription = \"Generate files for a different operating system\",\nallowed = {\n{ \"bsd\", \"OpenBSD, NetBSD, or FreeBSD\" },\n{ \"linux\", \"Linux\" },\n{ \"macosx\", \"Apple Mac OS X\" },\n{ \"solaris\", \"Solaris\" },\n{ \"windows\", \"Microsoft W"
- "indows\" },\n}\n}\nnewoption\n{\ntrigger = \"platform\",\nvalue = \"VALUE\",\ndescription = \"Add target architecture (if supported by action)\",\nallowed = {\n{ \"x32\", \"32-bit\" },\n{ \"x64\", \"64-bit\" },\n{ \"universal\", \"Mac OS X Universal, 32- and 64-bit\" },\n{ \"universal32\", \"Mac OS X Universal, 32-bit only\" },\n{ \"universal64\", \"Mac OS X Universal, 64-bit only\" },\n{ \"ps3\", \"Playstation 3 (experimental)\" },\n{ \"orbis\", \"Playstation 4\" },\n{ \"xbox360\", \"Xbox 360 (experimental)\" },\n{ \"ARM\", \"ARM (Microsoft)\" },\n}\n}\nnewoption\n{\ntrigger = \"scripts\",\nvalue = \"path\",\ndescription = \"Search for additional scripts on the given path\"\n}\nnewoption\n{\ntrigger = \"version\",\ndescription = \"Display version information\"\n}\n",
+ "newoption \n{\ntrigger = \"cc\",\nvalue = \"VALUE\",\ndescription = \"Choose a C/C++ compiler set\",\nallowed = {\n{ \"gcc\", \"GNU GCC (gcc/g++)\" },\n{ \"ow\", \"OpenWatcom\" },\n{ \"ghs\", \"Green Hills Software\" },\n}\n}\nnewoption\n{\ntrigger = \"dotnet\",\nvalue = \"VALUE\",\ndescription = \"Choose a .NET compiler set\",\nallowed = {\n{ \"msnet\", \"Microsoft .NET (csc)\" },\n{ \"mono\", \"Novell Mono (mcs)\" },\n{ \"pnet\", \"Portable.NET (cscc)\" },\n}\n}\nnewoption\n{\ntrigger = \"file\",\nvalue = \"FILE\",\ndescription = \"Read FILE as a Premake script; default is 'premake4.lua'\"\n}\nnewoption\n{\ntrigger = \"help\",\ndescription = \"Display this information\"\n}\nnewoption\n{\ntrigger = \"os\",\nvalue = \"VALUE\",\ndescription = \"Generate files for a different operating system\",\nallowed = {\n{ \"bsd\", \"OpenBSD, NetBSD, or FreeBSD\" },\n{ \"linux\", \"Linux\" },\n{ \"macosx\", \"Apple Mac OS X\" },\n{ \"solaris\", \"Sol"
+ "aris\" },\n{ \"windows\", \"Microsoft Windows\" },\n}\n}\nnewoption\n{\ntrigger = \"platform\",\nvalue = \"VALUE\",\ndescription = \"Add target architecture (if supported by action)\",\nallowed = {\n{ \"x32\", \"32-bit\" },\n{ \"x64\", \"64-bit\" },\n{ \"universal\", \"Mac OS X Universal, 32- and 64-bit\" },\n{ \"universal32\", \"Mac OS X Universal, 32-bit only\" },\n{ \"universal64\", \"Mac OS X Universal, 64-bit only\" },\n{ \"ps3\", \"Playstation 3 (experimental)\" },\n{ \"orbis\", \"Playstation 4\" },\n{ \"xbox360\", \"Xbox 360 (experimental)\" },\n{ \"ARM\", \"ARM\" },\n{ \"PowerPC\", \"PowerPC\" },\n}\n}\nnewoption\n{\ntrigger = \"scripts\",\nvalue = \"path\",\ndescription = \"Search for additional scripts on the given path\"\n}\nnewoption\n{\ntrigger = \"version\",\ndescription = \"Display version information\"\n}\n",
/* base/inspect.lua */
"-- Copyright (c) 2013 Enrique García Cota\nlocal function smartQuote(str)\n if str:match('\"') and not str:match(\"'\") then\n return \"'\" .. str .. \"'\"\n end\n return '\"' .. str:gsub('\"', '\\\\\"') .. '\"'\nend\nlocal controlCharsTranslation = {\n [\"\\a\"] = \"\\\\a\", [\"\\b\"] = \"\\\\b\", [\"\\f\"] = \"\\\\f\", [\"\\n\"] = \"\\\\n\",\n [\"\\r\"] = \"\\\\r\", [\"\\t\"] = \"\\\\t\", [\"\\v\"] = \"\\\\v\"\n}\nlocal function escapeChar(c) return controlCharsTranslation[c] end\nlocal function escape(str)\n local result = str:gsub(\"\\\\\", \"\\\\\\\\\"):gsub(\"(%c)\", escapeChar)\n return result\nend\nlocal function isIdentifier(str)\n return type(str) == 'string' and str:match( \"^[_%a][_%a%d]*$\" )\nend\nlocal function isArrayKey(k, length)\n return type(k) == 'number' and 1 <= k and k <= length\nend\nlocal function isDictionaryKey(k, length)\n return not isArrayKey(k, length)\nend\nlocal defaultTypeOrders = {\n ['number'] = 1, ['boolean'] = 2, ['string'] = 3, ['table'] = 4,\n ['fu"
@@ -115,10 +115,16 @@ const char* builtin_scripts[] = {
"gs(cfg)\nlocal result = table.translate(cfg.flags, flags)\nreturn result\nend\nfunction premake.dotnet.getkind(cfg)\nif (cfg.kind == \"ConsoleApp\") then\nreturn \"Exe\"\nelseif (cfg.kind == \"WindowedApp\") then\nreturn \"WinExe\"\nelseif (cfg.kind == \"SharedLib\") then\nreturn \"Library\"\nend\nend",
/* tools/gcc.lua */
- "premake.gcc = { }\npremake.gcc.cc = \"gcc\"\npremake.gcc.cxx = \"g++\"\npremake.gcc.ar = \"ar\"\npremake.gcc.llvm = false\nlocal cflags =\n{\nEnableSSE = \"-msse\",\nEnableSSE2 = \"-msse2\",\nExtraWarnings = \"-Wall -Wextra\",\nFatalWarnings = \"-Werror\",\nFloatFast = \"-ffast-math\",\nFloatStrict = \"-ffloat-store\",\nNoFramePointer = \"-fomit-frame-pointer\",\nOptimize = \"-O2\",\nOptimizeSize = \"-Os\",\nOptimizeSpeed = \"-O3\",\nSymbols = \"-g\",\n}\nlocal cxxflags =\n{\nNoExceptions = \"-fno-exceptions\",\nNoRTTI = \"-fno-rtti\",\nUnsignedChar = \"-funsigned-char\",\n}\npremake.gcc.platforms =\n{\nNative = {\ncppflags = \"-MMD\",\n},\nx32 = {\ncppflags = \"-MMD\",\nflags = \"-m32\",\n},\nx64 = {\ncppflags = \"-MMD\",\nflags = \"-m64\",\n},\nUniversal = {\ncppflags = \"\",\nflags = \"-arch i386 -arch x86_64 -arch ppc -arch ppc64\",\n},\nUniversal32 = {\ncppflags = \"\",\nflags = \"-arch i386 -arch ppc\",\n},\nUniversal64 = {\ncppflags"
- " = \"\",\nflags = \"-arch x86_64 -arch ppc64\",\n},\nPS3 = {\ncc = \"ppu-lv2-g++\",\ncxx = \"ppu-lv2-g++\",\nar = \"ppu-lv2-ar\",\ncppflags = \"-MMD\",\n},\nWiiDev = {\ncppflags = \"-MMD -MP -I$(LIBOGC_INC) $(MACHDEP)\",\nldflags= \"-L$(LIBOGC_LIB) $(MACHDEP)\",\ncfgsettings = [[\n ifeq ($(strip $(DEVKITPPC)),)\n $(error \"DEVKITPPC environment variable is not set\")'\n endif\n include $(DEVKITPPC)/wii_rules']],\n},\nOrbis = {\ncc = \"orbis-clang\",\ncxx = \"orbis-clang++\",\nar = \"orbis-ar\",\ncppflags = \"-MMD -MP\",\n}\n}\nlocal platforms = premake.gcc.platforms\nfunction premake.gcc.getcppflags(cfg)\nlocal flags = { }\ntable.insert(flags, platforms[cfg.platform].cppflags)\nif flags[1]:startswith(\"-MMD\") then\ntable.insert(flags, \"-MP\")\nend\nreturn flags\nend\nfunction premake.gcc.getcflags(cfg)\nlocal result = table.translate(cfg.flags, cflags)\ntable.insert(result, platforms[cfg.platform].flags)\nif cfg.system ~= \"windows\" and cfg.kind "
- "== \"SharedLib\" then\ntable.insert(result, \"-fPIC\")\nend\nreturn result\nend\nfunction premake.gcc.getcxxflags(cfg)\nlocal result = table.translate(cfg.flags, cxxflags)\nreturn result\nend\nfunction premake.gcc.getldflags(cfg)\nlocal result = { }\nif not cfg.flags.Symbols then\nif cfg.system == \"macosx\" then\nelse\ntable.insert(result, \"-s\")\nend\nend\nif cfg.kind == \"SharedLib\" then\nif cfg.system == \"macosx\" then\ntable.insert(result, \"-dynamiclib\")\nelse\ntable.insert(result, \"-shared\")\nend\nif cfg.system == \"windows\" and not cfg.flags.NoImportLib then\ntable.insert(result, '-Wl,--out-implib=\"' .. cfg.linktarget.fullpath .. '\"')\nend\nend\nif cfg.kind == \"WindowedApp\" and cfg.system == \"windows\" then\ntable.insert(result, \"-mwindows\")\nend\nlocal platform = platforms[cfg.platform]\ntable.insert(result, platform.flags)\ntable.insert(result, platform.ldflags)\nreturn result\nend\nfunction premake.gcc.getlibdirflags(cfg)\nlocal result = { }\nfor _, value in ipairs(premake.getlinks(cfg"
- ", \"all\", \"directory\")) do\ntable.insert(result, '-L' .. _MAKE.esc(value))\nend\nreturn result\nend\nfunction premake.gcc.getlinkflags(cfg)\nlocal result = {}\nfor _, value in ipairs(premake.getlinks(cfg, \"system\", \"name\")) do\nif path.getextension(value) == \".framework\" then\ntable.insert(result, '-framework ' .. _MAKE.esc(path.getbasename(value)))\nelse\ntable.insert(result, '-l' .. _MAKE.esc(value))\nend\nend\nreturn result\nend\nfunction premake.gcc.getdefines(defines)\nlocal result = { }\nfor _,def in ipairs(defines) do\ntable.insert(result, '-D' .. def)\nend\nreturn result\nend\nfunction premake.gcc.getincludedirs(includedirs)\nlocal result = { }\nfor _,dir in ipairs(includedirs) do\ntable.insert(result, \"-I\" .. _MAKE.esc(dir))\nend\nreturn result\nend\nfunction premake.gcc.getcfgsettings(cfg)\nreturn platforms[cfg.platform].cfgsettings\nend\n",
+ "premake.gcc = { }\npremake.gcc.cc = \"gcc\"\npremake.gcc.cxx = \"g++\"\npremake.gcc.ar = \"ar\"\npremake.gcc.llvm = false\nlocal cflags =\n{\nEnableSSE = \"-msse\",\nEnableSSE2 = \"-msse2\",\nExtraWarnings = \"-Wall -Wextra\",\nFatalWarnings = \"-Werror\",\nFloatFast = \"-ffast-math\",\nFloatStrict = \"-ffloat-store\",\nNoFramePointer = \"-fomit-frame-pointer\",\nOptimize = \"-O2\",\nOptimizeSize = \"-Os\",\nOptimizeSpeed = \"-O3\",\nSymbols = \"-g\",\n}\nlocal cxxflags =\n{\nNoExceptions = \"-fno-exceptions\",\nNoRTTI = \"-fno-rtti\",\nUnsignedChar = \"-funsigned-char\",\n}\npremake.gcc.platforms =\n{\nNative = {\ncppflags = \"-MMD -MP\",\n},\nx32 = {\ncppflags = \"-MMD -MP\",\nflags = \"-m32\",\n},\nx64 = {\ncppflags = \"-MMD -MP\",\nflags = \"-m64\",\n},\nUniversal = {\nar = \"libtool\",\ncppflags = \"-MMD -MP\",\nflags = \"-arch i386 -arch x86_64 -arch ppc -arch ppc64\",\n},\nUniversal32 = {\nar = \"libtool\",\ncppflags = \"-M"
+ "MD -MP\",\nflags = \"-arch i386 -arch ppc\",\n},\nUniversal64 = {\nar = \"libtool\",\ncppflags = \"-MMD -MP\",\nflags = \"-arch x86_64 -arch ppc64\",\n},\nPS3 = {\ncc = \"ppu-lv2-g++\",\ncxx = \"ppu-lv2-g++\",\nar = \"ppu-lv2-ar\",\ncppflags = \"-MMD -MP\",\n},\nWiiDev = {\ncppflags = \"-MMD -MP -I$(LIBOGC_INC) $(MACHDEP)\",\nldflags= \"-L$(LIBOGC_LIB) $(MACHDEP)\",\ncfgsettings = [[\n ifeq ($(strip $(DEVKITPPC)),)\n $(error \"DEVKITPPC environment variable is not set\")'\n endif\n include $(DEVKITPPC)/wii_rules']],\n},\nOrbis = {\ncc = \"orbis-clang\",\ncxx = \"orbis-clang++\",\nar = \"orbis-ar\",\ncppflags = \"-MMD -MP\",\n}\n}\nlocal platforms = premake.gcc.platforms\nfunction premake.gcc.getcppflags(cfg)\nlocal flags = { }\ntable.insert(flags, platforms[cfg.platform].cppflags)\nif flags[1]:startswith(\"-MMD\") then\ntable.insert(flags, \"-MP\")\nend\nreturn flags\nend\nfunction premake.gcc.getcflags(cfg)\nlocal result = table.translate("
+ "cfg.flags, cflags)\ntable.insert(result, platforms[cfg.platform].flags)\nif cfg.system ~= \"windows\" and cfg.kind == \"SharedLib\" then\ntable.insert(result, \"-fPIC\")\nend\nreturn result\nend\nfunction premake.gcc.getcxxflags(cfg)\nlocal result = table.translate(cfg.flags, cxxflags)\nreturn result\nend\nfunction premake.gcc.getldflags(cfg)\nlocal result = { }\nif not cfg.flags.Symbols then\nif cfg.system == \"macosx\" then\nelse\ntable.insert(result, \"-s\")\nend\nend\nif cfg.kind == \"SharedLib\" then\nif cfg.system == \"macosx\" then\ntable.insert(result, \"-dynamiclib\")\nelse\ntable.insert(result, \"-shared\")\nend\nif cfg.system == \"windows\" and not cfg.flags.NoImportLib then\ntable.insert(result, '-Wl,--out-implib=\"' .. cfg.linktarget.fullpath .. '\"')\nend\nend\nif cfg.kind == \"WindowedApp\" and cfg.system == \"windows\" then\ntable.insert(result, \"-mwindows\")\nend\nlocal platform = platforms[cfg.platform]\ntable.insert(result, platform.flags)\ntable.insert(result, platform.ldflags)\nreturn res"
+ "ult\nend\nfunction premake.gcc.getlibdirflags(cfg)\nlocal result = { }\nfor _, value in ipairs(premake.getlinks(cfg, \"all\", \"directory\")) do\ntable.insert(result, '-L' .. _MAKE.esc(value))\nend\nreturn result\nend\nfunction premake.gcc.getlinkflags(cfg)\nlocal result = {}\nfor _, value in ipairs(premake.getlinks(cfg, \"system\", \"name\")) do\nif path.getextension(value) == \".framework\" then\ntable.insert(result, '-framework ' .. _MAKE.esc(path.getbasename(value)))\nelse\ntable.insert(result, '-l' .. _MAKE.esc(value))\nend\nend\nreturn result\nend\nfunction premake.gcc.getarchiveflags(prj, cfg, ndx)\nlocal result = {}\nif cfg.platform:startswith(\"Universal\") then\nif prj.options.ArchiveSplit then\nerror(\"gcc tool 'Universal*' platforms do not support split archives\")\nend\ntable.insert(result, '-o')\nelse\nif (not prj.options.ArchiveSplit) then\nif premake.gcc.llvm then\ntable.insert(result, 'rcs')\nelse\ntable.insert(result, '-rcs')\nend\nelse\nif premake.gcc.llvm then\nif (not ndx) then\ntable.inse"
+ "rt(result, 'qc')\nelse\ntable.insert(result, 'cs')\nend\nelse\nif (not ndx) then\ntable.insert(result, '-qc')\nelse\ntable.insert(result, '-cs')\nend\nend\nend\nend\nreturn result\nend\nfunction premake.gcc.getdefines(defines)\nlocal result = { }\nfor _,def in ipairs(defines) do\ntable.insert(result, '-D' .. def)\nend\nreturn result\nend\nfunction premake.gcc.getincludedirs(includedirs)\nlocal result = { }\nfor _,dir in ipairs(includedirs) do\ntable.insert(result, \"-I\" .. _MAKE.esc(dir))\nend\nreturn result\nend\nfunction premake.gcc.getcfgsettings(cfg)\nreturn platforms[cfg.platform].cfgsettings\nend\n",
+
+ /* tools/ghs.lua */
+ "premake.ghs = { }\npremake.ghs.namestyle = \"PS3\"\npremake.ghs.cc = \"ccppc\"\npremake.ghs.cxx = \"cxppc\"\npremake.ghs.ar = \"cxppc\"\nlocal cflags =\n{\nFatalWarnings = \"--quit_after_warnings\",\nOptimize = \"-Ogeneral\",\nOptimizeSize = \"-Osize\",\nOptimizeSpeed = \"-Ospeed\",\nSymbols = \"-g\",\n}\nlocal cxxflags =\n{\nNoExceptions = \"--no_exceptions\",\nNoRTTI = \"--no_rtti\",\nUnsignedChar = \"--unsigned_chars\",\n}\npremake.ghs.platforms =\n{\nNative = {\ncppflags = \"-MMD\",\n},\nPowerPC = {\ncc = \"ccppc\",\ncxx = \"cxppc\",\nar = \"cxppc\",\ncppflags = \"-MMD\",\narflags = \"-archive -o\",\n},\nARM = {\ncc = \"ccarm\",\ncxx = \"cxarm\",\nar = \"cxarm\",\ncppflags = \"-MMD\",\narflags = \"-archive -o\",\n}\n}\nlocal platforms = premake.ghs.platforms\nfunction premake.ghs.getcppflags(cfg)\nlocal flags = { }\ntable.insert(flags, platforms[cfg.platform].cppflags)\nreturn flags\nend\nfunction premake.ghs.getcf"
+ "lags(cfg)\nlocal result = table.translate(cfg.flags, cflags)\ntable.insert(result, platforms[cfg.platform].flags)\nreturn result\nend\nfunction premake.ghs.getcxxflags(cfg)\nlocal result = table.translate(cfg.flags, cxxflags)\nreturn result\nend\nfunction premake.ghs.getldflags(cfg)\nlocal result = { }\nlocal platform = platforms[cfg.platform]\ntable.insert(result, platform.flags)\ntable.insert(result, platform.ldflags)\nreturn result\nend\nfunction premake.ghs.getlibdirflags(cfg)\nlocal result = { }\nfor _, value in ipairs(premake.getlinks(cfg, \"all\", \"directory\")) do\ntable.insert(result, '-L' .. _MAKE.esc(value))\nend\nreturn result\nend\nfunction premake.ghs.getlinkflags(cfg)\nlocal result = {}\nfor _, value in ipairs(premake.getlinks(cfg, \"system\", \"name\")) do\ntable.insert(result, '-lnk=' .. _MAKE.esc(value))\nend\nreturn result\nend\nfunction premake.ghs.getarchiveflags(prj, cfg, ndx)\nif prj.options.ArchiveSplit then\nerror(\"ghs tool does not support split archives\")\nend\nlocal result = {}\n"
+ "local platform = platforms[cfg.platform]\ntable.insert(result, platform.arflags)\nreturn result\nend\nfunction premake.ghs.getdefines(defines)\nlocal result = { }\nfor _,def in ipairs(defines) do\ntable.insert(result, '-D' .. def)\nend\nreturn result\nend\nfunction premake.ghs.getincludedirs(includedirs)\nlocal result = { }\nfor _,dir in ipairs(includedirs) do\ntable.insert(result, \"-I\" .. _MAKE.esc(dir))\nend\nreturn result\nend\nfunction premake.ghs.getcfgsettings(cfg)\nreturn platforms[cfg.platform].cfgsettings\nend\n",
/* tools/msc.lua */
"premake.msc = { }\npremake.msc.namestyle = \"windows\"\n",
@@ -181,8 +187,8 @@ const char* builtin_scripts[] = {
/* actions/make/_make.lua */
"_MAKE = { }\npremake.make = { }\nlocal make = premake.make\nfunction _MAKE.esc(value)\nlocal result\nif (type(value) == \"table\") then\nresult = { }\nfor _,v in ipairs(value) do\ntable.insert(result, _MAKE.esc(v))\nend\nreturn result\nelse\nresult = value:gsub(\"\\\\\", \"\\\\\\\\\")\nresult = result:gsub(\" \", \"\\\\ \")\nresult = result:gsub(\"%%(\", \"\\\\%(\")\nresult = result:gsub(\"%%)\", \"\\\\%)\")\nresult = result:gsub(\"$\\\\%((.-)\\\\%)\", \"$%(%1%)\")\nreturn result\nend\nend\nfunction premake.make_copyrule(source, target)\n_p('%s: %s', target, source)\n_p('\\t@echo Copying $(notdir %s)', target)\n_p('\\t-$(call COPY,%s,%s)', source, target)\nend\nfunction premake.make_mkdirrule(var)\n_p('\\t@echo Creating %s', var)\n_p('\\t-$(call MKDIR,%s)', var)\n_p('')\nend\nfunction make.list(value)\nif #value > 0 then\nreturn \" \" .. table.concat(value, \" \")\nelse\nreturn \"\"\nend\nend\nfunction _MAKE.getmakefilename(this, searchprjs)\nlocal count = 0\nfor sln in premake.solution.each() do\nif (sln.loca"
- "tion == this.location) then count = count + 1 end\nif (searchprjs) then\nfor _,prj in ipairs(sln.projects) do\nif (prj.location == this.location) then count = count + 1 end\nend\nend\nend\nif (count == 1) then\nreturn \"Makefile\"\nelse\nreturn this.name .. \".make\"\nend\nend\nfunction _MAKE.getnames(tbl)\nlocal result = table.extract(tbl, \"name\")\nfor k,v in pairs(result) do\nresult[k] = _MAKE.esc(v)\nend\nreturn result\nend\nfunction make.settings(cfg, cc)\nif #cfg.makesettings > 0 then\nfor _, value in ipairs(cfg.makesettings) do\n_p(value)\nend\nend\nlocal toolsettings = cc.platforms[cfg.platform].cfgsettings\nif toolsettings then\n_p(toolsettings)\nend\nend\nnewaction {\ntrigger = \"gmake\",\nshortname = \"GNU Make\",\ndescription = \"Generate GNU makefiles for POSIX, MinGW, and Cygwin\",\nvalid_kinds = { \"ConsoleApp\", \"WindowedApp\", \"StaticLib\", \"SharedLib\" },\nvalid_languages = { \"C\", \"C++\", \"C#\" },\nvalid_tools = {\ncc = { \"gcc\" },\ndotnet = { \"mono\", "
- "\"msnet\", \"pnet\" },\n},\nonsolution = function(sln)\npremake.generate(sln, _MAKE.getmakefilename(sln, false), premake.make_solution)\nend,\nonproject = function(prj)\nlocal makefile = _MAKE.getmakefilename(prj, true)\nif premake.isdotnetproject(prj) then\npremake.generate(prj, makefile, premake.make_csharp)\nelse\npremake.generate(prj, makefile, premake.make_cpp)\nend\nend,\noncleansolution = function(sln)\npremake.clean.file(sln, _MAKE.getmakefilename(sln, false))\nend,\noncleanproject = function(prj)\npremake.clean.file(prj, _MAKE.getmakefilename(prj, true))\nend\n}\n",
+ "tion == this.location) then count = count + 1 end\nif (searchprjs) then\nfor _,prj in ipairs(sln.projects) do\nif (prj.location == this.location) then count = count + 1 end\nend\nend\nend\nif (count == 1) then\nreturn \"Makefile\"\nelse\nreturn this.name .. \".make\"\nend\nend\nfunction _MAKE.getnames(tbl)\nlocal result = table.extract(tbl, \"name\")\nfor k,v in pairs(result) do\nresult[k] = _MAKE.esc(v)\nend\nreturn result\nend\nfunction make.settings(cfg, cc)\nif #cfg.makesettings > 0 then\nfor _, value in ipairs(cfg.makesettings) do\n_p(value)\nend\nend\nlocal toolsettings = cc.platforms[cfg.platform].cfgsettings\nif toolsettings then\n_p(toolsettings)\nend\nend\nnewaction {\ntrigger = \"gmake\",\nshortname = \"GNU Make\",\ndescription = \"Generate GNU makefiles for POSIX, MinGW, and Cygwin\",\nvalid_kinds = { \"ConsoleApp\", \"WindowedApp\", \"StaticLib\", \"SharedLib\" },\nvalid_languages = { \"C\", \"C++\", \"C#\" },\nvalid_tools = {\ncc = { \"gcc\", \"ghs\" },\ndotnet = { "
+ "\"mono\", \"msnet\", \"pnet\" },\n},\nonsolution = function(sln)\npremake.generate(sln, _MAKE.getmakefilename(sln, false), premake.make_solution)\nend,\nonproject = function(prj)\nlocal makefile = _MAKE.getmakefilename(prj, true)\nif premake.isdotnetproject(prj) then\npremake.generate(prj, makefile, premake.make_csharp)\nelse\npremake.generate(prj, makefile, premake.make_cpp)\nend\nend,\noncleansolution = function(sln)\npremake.clean.file(sln, _MAKE.getmakefilename(sln, false))\nend,\noncleanproject = function(prj)\npremake.clean.file(prj, _MAKE.getmakefilename(prj, true))\nend\n}\n",
/* actions/make/make_solution.lua */
"function premake.make_solution(sln)\nlocal cc = premake[_OPTIONS.cc]\nlocal platforms = premake.filterplatforms(sln, cc.platforms, \"Native\")\n_p('# %s solution makefile autogenerated by GENie', premake.action.current().shortname)\n_p('# Type \"make help\" for usage help')\n_p('')\n_p('ifndef config')\n_p(' config=%s', _MAKE.esc(premake.getconfigname(sln.configurations[1], platforms[1], true)))\n_p('endif')\n_p('export config')\n_p('')\n_p('PROJECTS := %s', table.concat(_MAKE.esc(table.extract(sln.projects, \"name\")), \" \"))\n_p('')\n_p('.PHONY: all clean help $(PROJECTS)')\n_p('')\n_p('all: $(PROJECTS)')\n_p('')\nfor _, prj in ipairs(sln.projects) do\n_p('%s: %s', _MAKE.esc(prj.name), table.concat(_MAKE.esc(table.extract(premake.getdependencies(prj), \"name\")), \" \"))\nif (not sln.messageskip) or (not table.contains(sln.messageskip, \"SkipBuildingMessage\")) then\n_p('\\t@echo \"==== Building %s ($(config)) ====\"', prj.name)\nend\n_p('\\t@${MAKE} --no-print-directory -C %s -f %s', _MAKE.esc(path.getrel"
@@ -190,18 +196,18 @@ const char* builtin_scripts[] = {
/* actions/make/make_cpp.lua */
"premake.make.cpp = { }\npremake.make.override = { }\nlocal cpp = premake.make.cpp\nlocal make = premake.make\nfunction premake.make_cpp(prj)\nlocal cc = premake.gettool(prj)\nlocal platforms = premake.filterplatforms(prj.solution, cc.platforms, \"Native\")\npremake.gmake_cpp_header(prj, cc, platforms)\nfor _, platform in ipairs(platforms) do\nfor cfg in premake.eachconfig(prj, platform) do\npremake.gmake_cpp_config(prj, cfg, cc)\nend\nend\nlocal objdirs = {}\nlocal additionalobjdirs = {}\nfor _, file in ipairs(prj.files) do\nif path.iscppfile(file) then\nobjdirs[_MAKE.esc(path.getdirectory(path.trimdots(file)))] = 1\nend\nend\nfor _, custombuildtask in ipairs(prj.custombuildtask or {}) do\nfor _, buildtask in ipairs(custombuildtask or {}) do\nadditionalobjdirs[_MAKE.esc(path.getdirectory(path.getrelative(prj.location,buildtask[2])))] = 1\nend\nend\n_p('OBJDIRS := \\\\')\n_p('\\t$(OBJDIR) \\\\')\nfor dir, _ in pairs(objdirs) do\n_p('\\t$(OBJDIR)/%s \\\\', dir)\nend\nfor dir, _ in pairs(additionalobjdirs) do\n_p"
- "('\\t%s \\\\', dir)\nend\n_p('')\n_p('RESOURCES := \\\\')\nfor _, file in ipairs(prj.files) do\nif path.isresourcefile(file) then\n_p('\\t$(OBJDIR)/%s.res \\\\', _MAKE.esc(path.getbasename(file)))\nend\nend\n_p('')\n_p('.PHONY: clean prebuild prelink')\n_p('')\nif os.is(\"MacOSX\") and prj.kind == \"WindowedApp\" then\n_p('all: $(TARGETDIR) $(OBJDIRS) prebuild prelink $(TARGET) $(dir $(TARGETDIR))PkgInfo $(dir $(TARGETDIR))Info.plist')\nelse\n_p('all: $(TARGETDIR) $(OBJDIRS) prebuild prelink $(TARGET)')\nend\n_p('\\t@:')\n_p('')\nif (prj.kind == \"StaticLib\" and prj.options.ArchiveSplit) then\n_p('define max_args')\n_p('\\t$(eval _args:=)')\n_p('\\t$(foreach obj,$3,$(eval _args+=$(obj))$(if $(word $2,$(_args)),$1$(_args)$(EOL)$(eval _args:=)))')\n_p('\\t$(if $(_args),$1$(_args))')\n_p('endef')\n_p('')\n_p('define EOL')\n_p('')\n_p('')\n_p('endef')\n_p('')\nend\n_p('$(TARGET): $(GCH) $(OBJECTS) $(LDDEPS) $(RESOURCES)')\nif prj.kind == \"StaticLib\" then\nif prj.msgarchiving then\n_p('\\t@echo ' .. prj.msgarchi"
- "ving)\nelse\n_p('\\t@echo Archiving %s', prj.name)\nend\nif (not prj.archivesplit_size) then\nprj.archivesplit_size=200\nend\nif (not prj.options.ArchiveSplit) then\n_p('\\t$(SILENT) $(LINKCMD) $(OBJECTS)' .. (os.is(\"MacOSX\") and \" 2>&1 > /dev/null | sed -e '/.o) has no symbols$$/d'\" or \"\"))\nelse\n_p('\\t$(call RM,$(TARGET))')\n_p('\\t@$(call max_args,$(LINKCMD),'.. prj.archivesplit_size ..',$(OBJECTS))' .. (os.is(\"MacOSX\") and \" 2>&1 > /dev/null | sed -e '/.o) has no symbols$$/d'\" or \"\"))\n_p('\\t$(SILENT) $(LINKCMD_NDX)')\nend\nelse\nif prj.msglinking then\n_p('\\t@echo ' .. prj.msglinking)\nelse\n_p('\\t@echo Linking %s', prj.name)\nend\n_p('\\t$(SILENT) $(LINKCMD)')\nend\n_p('\\t$(POSTBUILDCMDS)')\n_p('')\n_p('$(TARGETDIR):')\npremake.make_mkdirrule(\"$(TARGETDIR)\")\n_p('$(OBJDIRS):')\nif (not prj.solution.messageskip) or (not table.contains(prj.solution.messageskip, \"SkipCreatingMessage\")) then\n_p('\\t@echo Creating $(@)')\nend\n_p('\\t-$(call MKDIR,$@)')\n_p('')\nif os.is(\"MacOSX\") and"
- " prj.kind == \"WindowedApp\" then\n_p('$(dir $(TARGETDIR))PkgInfo:')\n_p('$(dir $(TARGETDIR))Info.plist:')\n_p('')\nend\n_p('clean:')\nif (not prj.solution.messageskip) or (not table.contains(prj.solution.messageskip, \"SkipCleaningMessage\")) then\n_p('\\t@echo Cleaning %s', prj.name)\nend\n_p('ifeq (posix,$(SHELLTYPE))')\n_p('\\t$(SILENT) rm -f $(TARGET)')\n_p('\\t$(SILENT) rm -rf $(OBJDIR)')\n_p('else')\n_p('\\t$(SILENT) if exist $(subst /,\\\\\\\\,$(TARGET)) del $(subst /,\\\\\\\\,$(TARGET))')\n_p('\\t$(SILENT) if exist $(subst /,\\\\\\\\,$(OBJDIR)) rmdir /s /q $(subst /,\\\\\\\\,$(OBJDIR))')\n_p('endif')\n_p('')\n_p('prebuild:')\n_p('\\t$(PREBUILDCMDS)')\n_p('')\n_p('prelink:')\n_p('\\t$(PRELINKCMDS)')\n_p('')\ncpp.pchrules(prj)\ncpp.fileRules(prj)\ncpp.dependencyRules(prj)\nfor _, custombuildtask in ipairs(prj.custombuildtask or {}) do\nfor _, buildtask in ipairs(custombuildtask or {}) do\nlocal deps = string.format(\"%s \",path.getrelative(prj.location,buildtask[1]))\nfor _, depdata in ipairs(buildtas"
- "k[3] or {}) do\ndeps = deps .. string.format(\"%s \",path.getrelative(prj.location,depdata))\nend\n_p('%s: %s'\n,path.getrelative(prj.location,buildtask[2])\n, deps\n)\nfor _, cmdline in ipairs(buildtask[4] or {}) do\nlocal cmd = cmdline\nlocal num = 1\nfor _, depdata in ipairs(buildtask[3] or {}) do\ncmd = string.gsub(cmd,\"%$%(\" .. num ..\"%)\", string.format(\"%s \",path.getrelative(prj.location,depdata)))\nnum = num + 1\nend\ncmd = string.gsub(cmd, \"%$%(<%)\", \"$<\")\ncmd = string.gsub(cmd, \"%$%(@%)\", \"$@\")\n \n_p('\\t$(SILENT) %s',cmd)\nend\n_p('')\nend\nend\n_p('-include $(OBJECTS:%%.o=%%.d)')\n_p('ifneq (,$(PCH))')\n_p(' -include $(OBJDIR)/$(notdir $(PCH)).d')\n_p('endif')\nend\nfunction premake.gmake_cpp_header(prj, cc, platforms)\n_p('# %s project makefile autogenerated by GENie', premake.action.current().shortname)\n_p('ifndef config')\n_p(' config=%s', _MAKE.esc(premake.getconfigname(prj.solution.configurations[1], platforms[1], true)))\n_p('endif')\n_p('')\n_p('ifndef verbose')\n_p(' SILE"
- "NT = @')\n_p('endif')\n_p('')\n_p('SHELLTYPE := msdos')\n_p('ifeq (,$(ComSpec)$(COMSPEC))')\n_p(' SHELLTYPE := posix')\n_p('endif')\n_p('ifeq (/bin,$(findstring /bin,$(SHELL)))')\n_p(' SHELLTYPE := posix')\n_p('endif')\n_p('ifeq (/bin,$(findstring /bin,$(MAKESHELL)))')\n_p(' SHELLTYPE := posix')\n_p('endif')\n_p('')\n_p('ifeq (posix,$(SHELLTYPE))')\n_p(' MKDIR = $(SILENT) mkdir -p \"$(1)\"')\n_p(' COPY = $(SILENT) cp -fR \"$(1)\" \"$(2)\"')\n_p(' RM= $(SILENT) rm -f \"$(1)\"')\n_p('else')\n_p(' MKDIR = $(SILENT) mkdir \"$(subst /,\\\\\\\\,$(1))\" 2> nul || exit 0')\n_p(' COPY = $(SILENT) copy /Y \"$(subst /,\\\\\\\\,$(1))\" \"$(subst /,\\\\\\\\,$(2))\"')\n_p(' RM = $(SILENT) del /F \"$(subst /,\\\\\\\\,$(1))\" 2> nul || exit 0')\n_p('endif')\n_p('')\n_p('CC = %s', cc.cc)\n_p('CXX = %s', cc.cxx)\n_p('AR = %s', cc.ar)\n_p('')\n_p('ifndef RESCOMP')\n_p(' ifdef WINDRES')\n_p(' RESCOMP = $(WINDRES)')\n_p(' else')\n_p(' RESCOMP = windres')\n_p(' endif')\n_p('endif')\n_p('')\nend\nfunction pr"
- "emake.gmake_cpp_config(prj, cfg, cc)\n_p('ifeq ($(config),%s)', _MAKE.esc(cfg.shortname))\ncpp.platformtools(cfg, cc)\n_p(' ' .. (table.contains(premake.make.override,\"OBJDIR\") and \"override \" or \"\") .. 'OBJDIR = %s', _MAKE.esc(cfg.objectsdir))\n_p(' ' .. (table.contains(premake.make.override,\"TARGETDIR\") and \"override \" or \"\") .. 'TARGETDIR = %s', _MAKE.esc(cfg.buildtarget.directory))\n_p(' ' .. (table.contains(premake.make.override,\"TARGET\") and \"override \" or \"\") .. 'TARGET = $(TARGETDIR)/%s', _MAKE.esc(cfg.buildtarget.name))\n_p(' DEFINES +=%s', make.list(cc.getdefines(cfg.defines)))\n_p(' INCLUDES +=%s', make.list(cc.getincludedirs(cfg.includedirs)))\ncpp.pchconfig(cfg)\ncpp.flags(cfg, cc)\ncpp.linker(prj, cfg, cc)\n_p(' OBJECTS := \\\\')\nfor _, file in ipairs(prj.files) do\nif path.iscppfile(file) then\nif not table.icontains(cfg.excludes, file) then\n_p('\\t$(OBJDIR)/%s.o \\\\'\n, _MAKE.esc(path.trimdots(path.removeext(file)))\n)\nend\nend\nend\n_p('')\n_p(' d"
- "efine PREBUILDCMDS')\nif #cfg.prebuildcommands > 0 then\n_p('\\t@echo Running pre-build commands')\n_p('\\t%s', table.implode(cfg.prebuildcommands, \"\", \"\", \"\\n\\t\"))\nend\n_p(' endef')\n_p(' define PRELINKCMDS')\nif #cfg.prelinkcommands > 0 then\n_p('\\t@echo Running pre-link commands')\n_p('\\t%s', table.implode(cfg.prelinkcommands, \"\", \"\", \"\\n\\t\"))\nend\n_p(' endef')\n_p(' define POSTBUILDCMDS')\nif #cfg.postbuildcommands > 0 then\n_p('\\t@echo Running post-build commands')\n_p('\\t%s', table.implode(cfg.postbuildcommands, \"\", \"\", \"\\n\\t\"))\nend\n_p(' endef')\nmake.settings(cfg, cc)\n_p('endif')\n_p('')\nend\nfunction cpp.platformtools(cfg, cc)\nlocal platform = cc.platforms[cfg.platform]\nif platform.cc then\n_p(' CC = %s', platform.cc)\nend\nif platform.cxx then\n_p(' CXX = %s', platform.cxx)\nend\nif platform.ar then\n_p(' AR = %s', platform.ar)\nend\nend\nfunction cpp.flags(cfg, cc)\nif cfg.pchheader and not cfg.flags.NoPCH then\n_p(' FORCE_INCLUDE +="
- "-include $(OBJDIR)/$(notdir $(PCH))')\nend\nif #cfg.forcedincludes > 0 then\n_p(' FORCE_INCLUDE += -include %s'\n,premake.esc(table.concat(cfg.forcedincludes, \";\")))\nend\n_p(' ALL_CPPFLAGS += $(CPPFLAGS) %s $(DEFINES) $(INCLUDES)', table.concat(cc.getcppflags(cfg), \" \"))\n_p(' ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH)%s', make.list(table.join(cc.getcflags(cfg), cfg.buildoptions, cfg.buildoptions_c)))\n_p(' ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH)%s', make.list(table.join(cc.getcflags(cfg), cc.getcxxflags(cfg), cfg.buildoptions, cfg.buildoptions_cpp)))\n_p(' ALL_OBJCFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH)%s', make.list(table.join(cc.getcflags(cfg), cc.getcxxflags(cfg), cfg.buildoptions, cfg.buildoptions_objc)))\n_p(' ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES)%s',\n make.list(table.join(cc.getdefines(cfg.resdefines),\n cc.getincludedirs(cfg.resincludedirs), cfg.resoptions)))\nend\nfunction cpp.linker(prj, cfg"
- ", cc)\n_p(' ALL_LDFLAGS += $(LDFLAGS)%s', make.list(table.join(cc.getlibdirflags(cfg), cc.getldflags(cfg), cfg.linkoptions)))\n_p(' LDDEPS +=%s', make.list(_MAKE.esc(premake.getlinks(cfg, \"siblings\", \"fullpath\"))))\n_p(' LIBS += $(LDDEPS)%s', make.list(cc.getlinkflags(cfg)))\nif cfg.kind == \"StaticLib\" then\nif cfg.platform:startswith(\"Universal\") then\n_p(' LINKCMD = libtool -o $(TARGET)')\nelse\nif (not prj.options.ArchiveSplit) then\nif cc.llvm then\n_p(' LINKCMD = $(AR) rcs $(TARGET)')\nelse\n_p(' LINKCMD = $(AR) -rcs $(TARGET)')\nend\nelse\nif cc.llvm then\n_p(' LINKCMD = $(AR) qc $(TARGET)')\n_p(' LINKCMD_NDX= $(AR) cs $(TARGET)')\nelse\n_p(' LINKCMD = $(AR) -qc $(TARGET)')\n_p(' LINKCMD_NDX= $(AR) -cs $(TARGET)')\nend\nend\nend\nelse\nlocal tool = iif(cfg.language == \"C\", \"CC\", \"CXX\")\n_p(' LINKCMD = $(%s) -o $(TARGET) $(OBJECTS) $(RESOURCES) $(ARCH) $(ALL_LDFLAGS) $(LIBS)', tool)\nend\nend\nfunction cpp.pchconfig(cfg)\nif not cfg.pchheader or cfg.fla"
- "gs.NoPCH then\nreturn\nend\nlocal pch = cfg.pchheader\nfor _, incdir in ipairs(cfg.includedirs) do\nlocal abspath = path.getabsolute(path.join(cfg.project.location, incdir))\nlocal testname = path.join(abspath, pch)\nif os.isfile(testname) then\npch = path.getrelative(cfg.location, testname)\nbreak\nend\nend\n_p(' PCH = %s', _MAKE.esc(pch))\n_p(' GCH = $(OBJDIR)/$(notdir $(PCH)).gch')\nend\nfunction cpp.pchrules(prj)\n_p('ifneq (,$(PCH))')\n_p('$(GCH): $(PCH)')\n_p('\\t@echo $(notdir $<)')\nlocal cmd = iif(prj.language == \"C\", \"$(CC) -x c-header $(ALL_CFLAGS)\", \"$(CXX) -x c++-header $(ALL_CXXFLAGS)\")\n_p('\\t$(SILENT) %s -MMD -MP $(DEFINES) $(INCLUDES) -o \"$@\" -MF \"$(@:%%.gch=%%.d)\" -c \"$<\"', cmd)\n_p('endif')\n_p('')\nend\nfunction cpp.fileRules(prj)\nfor _, file in ipairs(prj.files or {}) do\nif path.iscppfile(file) then\n_p('$(OBJDIR)/%s.o: %s'\n, _MAKE.esc(path.trimdots(path.removeext(file)))\n, _MAKE.esc(file)\n)\nif (path.isobjcfile(file) and prj.msgcompile_objc) then\n_p('\\t"
- "@echo ' .. prj.msgcompile_objc)\nelseif prj.msgcompile then\n_p('\\t@echo ' .. prj.msgcompile)\nelse\n_p('\\t@echo $(notdir $<)')\nend\nif (path.isobjcfile(file)) then\n_p('\\t$(SILENT) $(CXX) $(ALL_OBJCFLAGS) $(FORCE_INCLUDE) -o \"$@\" -MF $(@:%%.o=%%.d) -c \"$<\"')\nelse\ncpp.buildcommand(path.iscfile(file) and not prj.options.ForceCPP, \"o\")\nend\nfor _, task in ipairs(prj.postcompiletasks or {}) do\n_p('\\t$(SILENT) %s', task)\n_p('')\nend\n_p('')\nelseif (path.getextension(file) == \".rc\") then\n_p('$(OBJDIR)/%s.res: %s', _MAKE.esc(path.getbasename(file)), _MAKE.esc(file))\nif prj.msgresource then\n_p('\\t@echo ' .. prj.msgresource)\nelse\n_p('\\t@echo $(notdir $<)')\nend\n_p('\\t$(SILENT) $(RESCOMP) $< -O coff -o \"$@\" $(ALL_RESFLAGS)')\n_p('')\nend\nend\nend\nfunction cpp.dependencyRules(prj)\nfor _, dependency in ipairs(prj.dependency or {}) do\nfor _, dep in ipairs(dependency or {}) do\nif (dep[3]==nil or dep[3]==false) then\n_p('$(OBJDIR)/%s.o: %s'\n, _MAKE.esc(path.trimdots(path.removeext(path.ge"
- "trelative(prj.location, dep[1]))))\n, _MAKE.esc(path.getrelative(prj.location, dep[2]))\n)\nelse\n_p('%s: %s'\n, _MAKE.esc(dep[1])\n, _MAKE.esc(path.getrelative(prj.location, dep[2]))\n)\nend\n_p('')\nend\nend\nend\nfunction cpp.buildcommand(iscfile, objext)\nlocal flags = iif(iscfile, '$(CC) $(ALL_CFLAGS)', '$(CXX) $(ALL_CXXFLAGS)')\n_p('\\t$(SILENT) %s $(FORCE_INCLUDE) -o \"$@\" -MF $(@:%%.%s=%%.d) -c \"$<\"', flags, objext)\nend\n",
+ "('\\t%s \\\\', dir)\nend\n_p('')\n_p('RESOURCES := \\\\')\nfor _, file in ipairs(prj.files) do\nif path.isresourcefile(file) then\n_p('\\t$(OBJDIR)/%s.res \\\\', _MAKE.esc(path.getbasename(file)))\nend\nend\n_p('')\n_p('.PHONY: clean prebuild prelink')\n_p('')\nif os.is(\"MacOSX\") and prj.kind == \"WindowedApp\" then\n_p('all: $(OBJDIRS) prebuild prelink $(TARGET) $(dir $(TARGETDIR))PkgInfo $(dir $(TARGETDIR))Info.plist | $(TARGETDIR)')\nelse\n_p('all: $(OBJDIRS) prebuild prelink $(TARGET) | $(TARGETDIR)')\nend\n_p('\\t@:')\n_p('')\nif (prj.kind == \"StaticLib\" and prj.options.ArchiveSplit) then\n_p('define max_args')\n_p('\\t$(eval _args:=)')\n_p('\\t$(foreach obj,$3,$(eval _args+=$(obj))$(if $(word $2,$(_args)),$1$(_args)$(EOL)$(eval _args:=)))')\n_p('\\t$(if $(_args),$1$(_args))')\n_p('endef')\n_p('')\n_p('define EOL')\n_p('')\n_p('')\n_p('endef')\n_p('')\nend\n_p('$(TARGET): $(GCH) $(OBJECTS) $(LDDEPS) $(RESOURCES) | $(TARGETDIR) $(OBJDIRS)')\nif prj.kind == \"StaticLib\" then\nif prj.msgarchiving then\n"
+ "_p('\\t@echo ' .. prj.msgarchiving)\nelse\n_p('\\t@echo Archiving %s', prj.name)\nend\nif (not prj.archivesplit_size) then\nprj.archivesplit_size=200\nend\nif (not prj.options.ArchiveSplit) then\n_p('\\t$(SILENT) $(LINKCMD) $(OBJECTS)' .. (os.is(\"MacOSX\") and \" 2>&1 > /dev/null | sed -e '/.o) has no symbols$$/d'\" or \"\"))\nelse\n_p('\\t$(call RM,$(TARGET))')\n_p('\\t@$(call max_args,$(LINKCMD),'.. prj.archivesplit_size ..',$(OBJECTS))' .. (os.is(\"MacOSX\") and \" 2>&1 > /dev/null | sed -e '/.o) has no symbols$$/d'\" or \"\"))\n_p('\\t$(SILENT) $(LINKCMD_NDX)')\nend\nelse\nif prj.msglinking then\n_p('\\t@echo ' .. prj.msglinking)\nelse\n_p('\\t@echo Linking %s', prj.name)\nend\n_p('\\t$(SILENT) $(LINKCMD)')\nend\n_p('\\t$(POSTBUILDCMDS)')\n_p('')\n_p('$(TARGETDIR):')\npremake.make_mkdirrule(\"$(TARGETDIR)\")\n_p('$(OBJDIRS):')\nif (not prj.solution.messageskip) or (not table.contains(prj.solution.messageskip, \"SkipCreatingMessage\")) then\n_p('\\t@echo Creating $(@)')\nend\n_p('\\t-$(call MKDIR,$@)')\n_p"
+ "('')\nif os.is(\"MacOSX\") and prj.kind == \"WindowedApp\" then\n_p('$(dir $(TARGETDIR))PkgInfo:')\n_p('$(dir $(TARGETDIR))Info.plist:')\n_p('')\nend\n_p('clean:')\nif (not prj.solution.messageskip) or (not table.contains(prj.solution.messageskip, \"SkipCleaningMessage\")) then\n_p('\\t@echo Cleaning %s', prj.name)\nend\n_p('ifeq (posix,$(SHELLTYPE))')\n_p('\\t$(SILENT) rm -f $(TARGET)')\n_p('\\t$(SILENT) rm -rf $(OBJDIR)')\n_p('else')\n_p('\\t$(SILENT) if exist $(subst /,\\\\\\\\,$(TARGET)) del $(subst /,\\\\\\\\,$(TARGET))')\n_p('\\t$(SILENT) if exist $(subst /,\\\\\\\\,$(OBJDIR)) rmdir /s /q $(subst /,\\\\\\\\,$(OBJDIR))')\n_p('endif')\n_p('')\n_p('prebuild:')\n_p('\\t$(PREBUILDCMDS)')\n_p('')\n_p('prelink:')\n_p('\\t$(PRELINKCMDS)')\n_p('')\ncpp.pchrules(prj)\ncpp.fileRules(prj)\ncpp.dependencyRules(prj)\nfor _, custombuildtask in ipairs(prj.custombuildtask or {}) do\nfor _, buildtask in ipairs(custombuildtask or {}) do\nlocal deps = string.format(\"%s \",path.getrelative(prj.location,buildtask[1]))\nfor"
+ " _, depdata in ipairs(buildtask[3] or {}) do\ndeps = deps .. string.format(\"%s \",path.getrelative(prj.location,depdata))\nend\n_p('%s: %s | $(TARGETDIR) $(OBJDIRS)'\n,path.getrelative(prj.location,buildtask[2])\n, deps\n)\nfor _, cmdline in ipairs(buildtask[4] or {}) do\nlocal cmd = cmdline\nlocal num = 1\nfor _, depdata in ipairs(buildtask[3] or {}) do\ncmd = string.gsub(cmd,\"%$%(\" .. num ..\"%)\", string.format(\"%s \",path.getrelative(prj.location,depdata)))\nnum = num + 1\nend\ncmd = string.gsub(cmd, \"%$%(<%)\", \"$<\")\ncmd = string.gsub(cmd, \"%$%(@%)\", \"$@\")\n_p('\\t$(SILENT) %s',cmd)\nend\n_p('')\nend\nend\n_p('-include $(OBJECTS:%%.o=%%.d)')\n_p('ifneq (,$(PCH))')\n_p(' -include $(OBJDIR)/$(notdir $(PCH)).d')\n_p('endif')\nend\nfunction premake.gmake_cpp_header(prj, cc, platforms)\n_p('# %s project makefile autogenerated by GENie', premake.action.current().shortname)\n_p('ifndef config')\n_p(' config=%s', _MAKE.esc(premake.getconfigname(prj.solution.configurations[1], platforms[1], true)))\n"
+ "_p('endif')\n_p('')\n_p('ifndef verbose')\n_p(' SILENT = @')\n_p('endif')\n_p('')\n_p('SHELLTYPE := msdos')\n_p('ifeq (,$(ComSpec)$(COMSPEC))')\n_p(' SHELLTYPE := posix')\n_p('endif')\n_p('ifeq (/bin,$(findstring /bin,$(SHELL)))')\n_p(' SHELLTYPE := posix')\n_p('endif')\n_p('ifeq (/bin,$(findstring /bin,$(MAKESHELL)))')\n_p(' SHELLTYPE := posix')\n_p('endif')\n_p('')\n_p('ifeq (posix,$(SHELLTYPE))')\n_p(' MKDIR = $(SILENT) mkdir -p \"$(1)\"')\n_p(' COPY = $(SILENT) cp -fR \"$(1)\" \"$(2)\"')\n_p(' RM= $(SILENT) rm -f \"$(1)\"')\n_p('else')\n_p(' MKDIR = $(SILENT) mkdir \"$(subst /,\\\\\\\\,$(1))\" 2> nul || exit 0')\n_p(' COPY = $(SILENT) copy /Y \"$(subst /,\\\\\\\\,$(1))\" \"$(subst /,\\\\\\\\,$(2))\"')\n_p(' RM = $(SILENT) del /F \"$(subst /,\\\\\\\\,$(1))\" 2> nul || exit 0')\n_p('endif')\n_p('')\n_p('CC = %s', cc.cc)\n_p('CXX = %s', cc.cxx)\n_p('AR = %s', cc.ar)\n_p('')\n_p('ifndef RESCOMP')\n_p(' ifdef WINDRES')\n_p(' RESCOMP = $(WINDRES)')\n_p(' else')\n_p(' RESCOMP = windres')"
+ "\n_p(' endif')\n_p('endif')\n_p('')\nend\nfunction premake.gmake_cpp_config(prj, cfg, cc)\n_p('ifeq ($(config),%s)', _MAKE.esc(cfg.shortname))\ncpp.platformtools(cfg, cc)\n_p(' ' .. (table.contains(premake.make.override,\"OBJDIR\") and \"override \" or \"\") .. 'OBJDIR = %s', _MAKE.esc(cfg.objectsdir))\n_p(' ' .. (table.contains(premake.make.override,\"TARGETDIR\") and \"override \" or \"\") .. 'TARGETDIR = %s', _MAKE.esc(cfg.buildtarget.directory))\n_p(' ' .. (table.contains(premake.make.override,\"TARGET\") and \"override \" or \"\") .. 'TARGET = $(TARGETDIR)/%s', _MAKE.esc(cfg.buildtarget.name))\n_p(' DEFINES +=%s', make.list(cc.getdefines(cfg.defines)))\n_p(' INCLUDES +=%s', make.list(cc.getincludedirs(cfg.includedirs)))\ncpp.pchconfig(cfg)\ncpp.flags(cfg, cc)\ncpp.linker(prj, cfg, cc)\n_p(' OBJECTS := \\\\')\nfor _, file in ipairs(prj.files) do\nif path.iscppfile(file) then\nif not table.icontains(cfg.excludes, file) then\n_p('\\t$(OBJDIR)/%s.o \\\\'\n, _MAKE.esc(path.trimdots(pat"
+ "h.removeext(file)))\n)\nend\nend\nend\n_p('')\n_p(' define PREBUILDCMDS')\nif #cfg.prebuildcommands > 0 then\n_p('\\t@echo Running pre-build commands')\n_p('\\t%s', table.implode(cfg.prebuildcommands, \"\", \"\", \"\\n\\t\"))\nend\n_p(' endef')\n_p(' define PRELINKCMDS')\nif #cfg.prelinkcommands > 0 then\n_p('\\t@echo Running pre-link commands')\n_p('\\t%s', table.implode(cfg.prelinkcommands, \"\", \"\", \"\\n\\t\"))\nend\n_p(' endef')\n_p(' define POSTBUILDCMDS')\nif #cfg.postbuildcommands > 0 then\n_p('\\t@echo Running post-build commands')\n_p('\\t%s', table.implode(cfg.postbuildcommands, \"\", \"\", \"\\n\\t\"))\nend\n_p(' endef')\nmake.settings(cfg, cc)\n_p('endif')\n_p('')\nend\nfunction cpp.platformtools(cfg, cc)\nlocal platform = cc.platforms[cfg.platform]\nif platform.cc then\n_p(' CC = %s', platform.cc)\nend\nif platform.cxx then\n_p(' CXX = %s', platform.cxx)\nend\nif platform.ar then\n_p(' AR = %s', platform.ar)\nend\nend\nfunction cpp.flags(cfg, cc)\nif cfg.pchheade"
+ "r and not cfg.flags.NoPCH then\n_p(' FORCE_INCLUDE += -include $(OBJDIR)/$(notdir $(PCH))')\nend\nif #cfg.forcedincludes > 0 then\n_p(' FORCE_INCLUDE += -include %s'\n,_MAKE.esc(table.concat(cfg.forcedincludes, \";\")))\nend\n_p(' ALL_CPPFLAGS += $(CPPFLAGS) %s $(DEFINES) $(INCLUDES)', table.concat(cc.getcppflags(cfg), \" \"))\n_p(' ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH)%s', make.list(table.join(cc.getcflags(cfg), cfg.buildoptions, cfg.buildoptions_c)))\n_p(' ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH)%s', make.list(table.join(cc.getcflags(cfg), cc.getcxxflags(cfg), cfg.buildoptions, cfg.buildoptions_cpp)))\n_p(' ALL_OBJCFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH)%s', make.list(table.join(cc.getcflags(cfg), cc.getcxxflags(cfg), cfg.buildoptions, cfg.buildoptions_objc)))\n_p(' ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES)%s',\n make.list(table.join(cc.getdefines(cfg.resdefines),\n cc.getincludedirs(cfg.resincludedirs),"
+ " cfg.resoptions)))\nend\nfunction cpp.linker(prj, cfg, cc)\n_p(' ALL_LDFLAGS += $(LDFLAGS)%s', make.list(table.join(cc.getlibdirflags(cfg), cc.getldflags(cfg), cfg.linkoptions)))\n_p(' LDDEPS +=%s', make.list(_MAKE.esc(premake.getlinks(cfg, \"siblings\", \"fullpath\"))))\n_p(' LIBS += $(LDDEPS)%s', make.list(cc.getlinkflags(cfg)))\nif cfg.kind == \"StaticLib\" then\nif (not prj.options.ArchiveSplit) then\n_p(' LINKCMD = $(AR) %s $(TARGET)', make.list(cc.getarchiveflags(prj, cfg, false)))\nelse\n_p(' LINKCMD = $(AR) %s $(TARGET)', make.list(cc.getarchiveflags(prj, cfg, false)))\n_p(' LINKCMD_NDX= $(AR) %s $(TARGET)', make.list(cc.getarchiveflags(prj, cfg, true)))\nend\nelse\nlocal tool = iif(cfg.language == \"C\", \"CC\", \"CXX\")\n_p(' LINKCMD = $(%s) -o $(TARGET) $(OBJECTS) $(RESOURCES) $(ARCH) $(ALL_LDFLAGS) $(LIBS)', tool)\nend\nend\nfunction cpp.pchconfig(cfg)\nif not cfg.pchheader or cfg.flags.NoPCH then\nreturn\nend\nlocal pch = cfg.pchheader\nfor _, incdir in ipairs(cfg.include"
+ "dirs) do\nlocal abspath = path.getabsolute(path.join(cfg.project.location, incdir))\nlocal testname = path.join(abspath, pch)\nif os.isfile(testname) then\npch = path.getrelative(cfg.location, testname)\nbreak\nend\nend\n_p(' PCH = %s', _MAKE.esc(pch))\n_p(' GCH = $(OBJDIR)/$(notdir $(PCH)).gch')\nend\nfunction cpp.pchrules(prj)\n_p('ifneq (,$(PCH))')\n_p('$(GCH): $(PCH) | $(OBJDIR)')\nif prj.msgprecompile then\n_p('\\t@echo ' .. prj.msgprecompile)\nelse\n_p('\\t@echo $(notdir $<)')\nend\nlocal cmd = iif(prj.language == \"C\", \"$(CC) $(ALL_CFLAGS) -x c-header\", \"$(CXX) $(ALL_CXXFLAGS) -x c++-header\")\n_p('\\t$(SILENT) %s $(DEFINES) $(INCLUDES) -o \"$@\" -c \"$<\"', cmd)\n_p('endif')\n_p('')\nend\nfunction cpp.fileRules(prj)\nfor _, file in ipairs(prj.files or {}) do\nif path.iscppfile(file) then\n_p('$(OBJDIR)/%s.o: %s $(GCH)'\n, _MAKE.esc(path.trimdots(path.removeext(file)))\n, _MAKE.esc(file)\n)\nif (path.isobjcfile(file) and prj.msgcompile_objc) then\n_p('\\t@echo ' .. prj.msgcompile_obj"
+ "c)\nelseif prj.msgcompile then\n_p('\\t@echo ' .. prj.msgcompile)\nelse\n_p('\\t@echo $(notdir $<)')\nend\nif (path.isobjcfile(file)) then\n_p('\\t$(SILENT) $(CXX) $(ALL_OBJCFLAGS) $(FORCE_INCLUDE) -o \"$@\" -c \"$<\"')\nelse\ncpp.buildcommand(path.iscfile(file) and not prj.options.ForceCPP, \"o\")\nend\nfor _, task in ipairs(prj.postcompiletasks or {}) do\n_p('\\t$(SILENT) %s', task)\n_p('')\nend\n_p('')\nelseif (path.getextension(file) == \".rc\") then\n_p('$(OBJDIR)/%s.res: %s', _MAKE.esc(path.getbasename(file)), _MAKE.esc(file))\nif prj.msgresource then\n_p('\\t@echo ' .. prj.msgresource)\nelse\n_p('\\t@echo $(notdir $<)')\nend\n_p('\\t$(SILENT) $(RESCOMP) $< -O coff -o \"$@\" $(ALL_RESFLAGS)')\n_p('')\nend\nend\nend\nfunction cpp.dependencyRules(prj)\nfor _, dependency in ipairs(prj.dependency or {}) do\nfor _, dep in ipairs(dependency or {}) do\nif (dep[3]==nil or dep[3]==false) then\n_p('$(OBJDIR)/%s.o: %s'\n, _MAKE.esc(path.trimdots(path.removeext(path.getrelative(prj.location, dep[1]))))\n, _MAKE.esc("
+ "path.getrelative(prj.location, dep[2]))\n)\nelse\n_p('%s: %s'\n, _MAKE.esc(dep[1])\n, _MAKE.esc(path.getrelative(prj.location, dep[2]))\n)\nend\n_p('')\nend\nend\nend\nfunction cpp.buildcommand(iscfile, objext)\nlocal flags = iif(iscfile, '$(CC) $(ALL_CFLAGS)', '$(CXX) $(ALL_CXXFLAGS)')\n_p('\\t$(SILENT) %s $(FORCE_INCLUDE) -o \"$@\" -c \"$<\"', flags, objext)\nend\n",
/* actions/make/make_csharp.lua */
"local function getresourcefilename(cfg, fname)\nif path.getextension(fname) == \".resx\" then\n local name = cfg.buildtarget.basename .. \".\"\n local dir = path.getdirectory(fname)\n if dir ~= \".\" then \nname = name .. path.translate(dir, \".\") .. \".\"\nend\nreturn \"$(OBJDIR)/\" .. _MAKE.esc(name .. path.getbasename(fname)) .. \".resources\"\nelse\nreturn fname\nend\nend\nfunction premake.make_csharp(prj)\nlocal csc = premake.dotnet\nlocal cfglibs = { }\nlocal cfgpairs = { }\nlocal anycfg\nfor cfg in premake.eachconfig(prj) do\nanycfg = cfg\ncfglibs[cfg] = premake.getlinks(cfg, \"siblings\", \"fullpath\")\ncfgpairs[cfg] = { }\nfor _, fname in ipairs(cfglibs[cfg]) do\nif path.getdirectory(fname) ~= cfg.buildtarget.directory then\ncfgpairs[cfg][\"$(TARGETDIR)/\" .. _MAKE.esc(path.getname(fname))] = _MAKE.esc(fname)\nend\nend\nend\nlocal sources = {}\nlocal embedded = { }\nlocal copypairs = { }\nfor fcfg in premake.project.eachfile(prj) do\nlocal action = csc.getbuildaction(fcfg)\nif action == \"Co"
@@ -218,8 +224,8 @@ const char* builtin_scripts[] = {
"ed\")\nend\nif hasdotnet and (_ACTION < \"vs2010\" or not hascpp) then\ntable.insert(platforms, 1, \"any\")\nend\nif _ACTION > \"vs2008\" then\nlocal platforms2010 = { }\nfor _, platform in ipairs(platforms) do\nif vstudio.platforms[platform] == \"Win32\" then\nif hascpp then\ntable.insert(platforms2010, platform)\nend\nif hasdotnet then\ntable.insert(platforms2010, \"x86\")\nend\nelse\ntable.insert(platforms2010, platform)\nend\nend\nplatforms = platforms2010\nend\nfor _, buildcfg in ipairs(sln.configurations) do\nfor _, platform in ipairs(platforms) do\nlocal entry = { }\nentry.src_buildcfg = buildcfg\nentry.src_platform = platform\nif platform ~= \"PS3\" or _ACTION > \"vs2008\" then\nentry.buildcfg = buildcfg\nentry.platform = vstudio.platforms[platform]\nelse\nentry.buildcfg = platform .. \" \" .. buildcfg\nentry.platform = \"Win32\"\nend\nentry.name = entry.buildcfg .. \"|\" .. entry.platform\nentry.isreal = (platform ~= \"any\" and platform ~= \"mixed\")\ntable.insert(cfgs, entry)\nend\nend\nreturn cfgs"
"\nend\nfunction vstudio.cleansolution(sln)\npremake.clean.file(sln, \"%%.sln\")\npremake.clean.file(sln, \"%%.suo\")\npremake.clean.file(sln, \"%%.ncb\")\npremake.clean.file(sln, \"%%.userprefs\")\npremake.clean.file(sln, \"%%.usertasks\")\nend\nfunction vstudio.cleanproject(prj)\nlocal fname = premake.project.getfilename(prj, \"%%\")\nos.remove(fname .. \".vcproj\")\nos.remove(fname .. \".vcproj.user\")\nos.remove(fname .. \".vcxproj\")\nos.remove(fname .. \".vcxproj.user\")\nos.remove(fname .. \".vcxproj.filters\")\nos.remove(fname .. \".csproj\")\nos.remove(fname .. \".csproj.user\")\nos.remove(fname .. \".pidb\")\nos.remove(fname .. \".sdf\")\nend\nfunction vstudio.cleantarget(name)\nos.remove(name .. \".pdb\")\nos.remove(name .. \".idb\")\nos.remove(name .. \".ilk\")\nos.remove(name .. \".vshost.exe\")\nos.remove(name .. \".exe.manifest\")\nend\nfunction vstudio.projectfile(prj)\nlocal pattern\nif prj.language == \"C#\" then\npattern = \"%%.csproj\"\nelse\npattern = iif(_ACTION > \"vs2008\", \"%%.vcxproj"
"\", \"%%.vcproj\")\nend\nlocal fname = premake.project.getbasename(prj.name, pattern)\nfname = path.join(prj.location, fname)\nreturn fname\nend\nfunction vstudio.tool(prj)\nif (prj.language == \"C#\") then\nreturn \"FAE04EC0-301F-11D3-BF4B-00C04F79EFBC\"\nelse\nreturn \"8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942\"\nend\nend\nnewaction {\ntrigger = \"vs2008\",\nshortname = \"Visual Studio 2008\",\ndescription = \"Generate Microsoft Visual Studio 2008 project files\",\nos = \"windows\",\nvalid_kinds = { \"ConsoleApp\", \"WindowedApp\", \"StaticLib\", \"SharedLib\" },\nvalid_languages = { \"C\", \"C++\", \"C#\" },\nvalid_tools = {\ncc = { \"msc\" },\ndotnet = { \"msnet\" },\n},\nonsolution = function(sln)\npremake.generate(sln, \"%%.sln\", vstudio.sln2005.generate)\nend,\nonproject = function(prj)\nif premake.isdotnetproject(prj) then\npremake.generate(prj, \"%%.csproj\", vstudio.cs2005.generate)\npremake.generate(prj, \"%%.csproj.user\", vstudio.cs2005.generate_user)\nelse"
- "\npremake.generate(prj, \"%%.vcproj\", vstudio.vc200x.generate)\npremake.generate(prj, \"%%.vcproj.user\", vstudio.vc200x.generate_user)\nend\nend,\noncleansolution = vstudio.cleansolution,\noncleanproject = vstudio.cleanproject,\noncleantarget = vstudio.cleantarget,\nvstudio = {\nproductVersion = \"9.0.21022\",\nsolutionVersion = \"10\",\ntoolsVersion = \"3.5\",\n}\n}\nnewaction\n{\ntrigger = \"vs2010\",\nshortname = \"Visual Studio 2010\",\ndescription = \"Generate Microsoft Visual Studio 2010 project files\",\nos = \"windows\",\nvalid_kinds = { \"ConsoleApp\", \"WindowedApp\", \"StaticLib\", \"SharedLib\" },\nvalid_languages = { \"C\", \"C++\", \"C#\"},\nvalid_tools = {\ncc = { \"msc\" },\ndotnet = { \"msnet\" },\n},\nonsolution = function(sln)\npremake.generate(sln, \"%%.sln\", vstudio.sln2005.generate)\nend,\nonproject = function(prj)\nif premake.isdotnetproject(prj) then\npremake.generate(prj, \"%%.csproj\", vstudio.cs2005.generate)\npremake.generate(pr"
- "j, \"%%.csproj.user\", vstudio.cs2005.generate_user)\nelse\npremake.generate(prj, \"%%.vcxproj\", premake.vs2010_vcxproj)\npremake.generate(prj, \"%%.vcxproj.user\", premake.vs2010_vcxproj_user)\npremake.generate(prj, \"%%.vcxproj.filters\", vstudio.vc2010.generate_filters)\nend\nend,\noncleansolution = premake.vstudio.cleansolution,\noncleanproject = premake.vstudio.cleanproject,\noncleantarget = premake.vstudio.cleantarget,\nvstudio = {\nproductVersion = \"8.0.30703\",\nsolutionVersion = \"11\",\ntargetFramework = \"4.0\",\ntoolsVersion = \"4.0\",\n}\n}\n",
+ "\npremake.generate(prj, \"%%.vcproj\", vstudio.vc200x.generate)\npremake.generate(prj, \"%%.vcproj.user\", vstudio.vc200x.generate_user)\nend\nend,\noncleansolution = vstudio.cleansolution,\noncleanproject = vstudio.cleanproject,\noncleantarget = vstudio.cleantarget,\nvstudio = {\nproductVersion = \"9.0.21022\",\nsolutionVersion = \"10\",\ntoolsVersion = \"3.5\",\nsupports64bitEditContinue = false,\n}\n}\nnewaction\n{\ntrigger = \"vs2010\",\nshortname = \"Visual Studio 2010\",\ndescription = \"Generate Microsoft Visual Studio 2010 project files\",\nos = \"windows\",\nvalid_kinds = { \"ConsoleApp\", \"WindowedApp\", \"StaticLib\", \"SharedLib\" },\nvalid_languages = { \"C\", \"C++\", \"C#\"},\nvalid_tools = {\ncc = { \"msc\" },\ndotnet = { \"msnet\" },\n},\nonsolution = function(sln)\npremake.generate(sln, \"%%.sln\", vstudio.sln2005.generate)\nend,\nonproject = function(prj)\nif premake.isdotnetproject(prj) then\npremake.generate(prj, \"%%.csproj\", vstudio.c"
+ "s2005.generate)\npremake.generate(prj, \"%%.csproj.user\", vstudio.cs2005.generate_user)\nelse\npremake.generate(prj, \"%%.vcxproj\", premake.vs2010_vcxproj)\npremake.generate(prj, \"%%.vcxproj.user\", premake.vs2010_vcxproj_user)\npremake.generate(prj, \"%%.vcxproj.filters\", vstudio.vc2010.generate_filters)\nend\nend,\noncleansolution = premake.vstudio.cleansolution,\noncleanproject = premake.vstudio.cleanproject,\noncleantarget = premake.vstudio.cleantarget,\nvstudio = {\nproductVersion = \"8.0.30703\",\nsolutionVersion = \"11\",\ntargetFramework = \"4.0\",\ntoolsVersion = \"4.0\",\nsupports64bitEditContinue = false,\n}\n}\n",
/* actions/vstudio/vs200x_vcproj.lua */
"premake.vstudio.vc200x = { }\nlocal vc200x = premake.vstudio.vc200x\nlocal tree = premake.tree\nlocal function bool(value)\nreturn iif(value, \"true\", \"false\")\nend\nfunction vc200x.optimization(cfg)\nlocal result = 0\nfor _, value in ipairs(cfg.flags) do\nif (value == \"Optimize\") then\nresult = 3\nelseif (value == \"OptimizeSize\") then\nresult = 1\nelseif (value == \"OptimizeSpeed\") then\nresult = 2\nend\nend\nreturn result\nend\nfunction vc200x.header(element)\nio.eol = \"\\r\\n\"\n_p('<?xml version=\"1.0\" encoding=\"Windows-1252\"?>')\n_p('<%s', element)\n_p(1,'ProjectType=\"Visual C++\"')\n_p(1,'Version=\"9.00\"')\nend\nfunction vc200x.Configuration(name, cfg)\n_p(2,'<Configuration')\n_p(3,'Name=\"%s\"', premake.esc(name))\n_p(3,'OutputDirectory=\"%s\"', premake.esc(cfg.buildtarget.directory))\n_p(3,'IntermediateDirectory=\"%s\"', premake.esc(cfg.objectsdir))\nlocal cfgtype\nif (cfg.kind == \"SharedLib\") then\ncfgtype = 2\nelseif (cfg.kind == \"StaticLib\") then\ncfgtype = 4\nelse\ncfgtype = 1\nen"
@@ -270,24 +276,24 @@ const char* builtin_scripts[] = {
"config_and_platform() ..'>', premake.esc(cfginfo.name))\n_p(2,'<OutDir>%s</OutDir>', premake.esc(outdir))\nif cfg.platform == \"Xbox360\" then\n_p(2,'<OutputFile>$(OutDir)%s</OutputFile>', premake.esc(target.name))\nend\n_p(2,'<IntDir>%s</IntDir>', premake.esc(intdir))\n_p(2,'<TargetName>%s</TargetName>', premake.esc(path.getbasename(target.name)))\n_p(2,'<TargetExt>%s</TargetExt>', premake.esc(path.getextension(target.name)))\nif cfg.kind == \"SharedLib\" then\nlocal ignore = (cfg.flags.NoImportLib ~= nil)\n _p(2,'<IgnoreImportLibrary>%s</IgnoreImportLibrary>', tostring(ignore))\nend\nif cfg.kind ~= \"StaticLib\" then\n_p(2,'<LinkIncremental>%s</LinkIncremental>', tostring(premake.config.isincrementallink(cfg)))\nend\nif cfg.flags.NoManifest then\n_p(2,'<GenerateManifest>false</GenerateManifest>')\nend\n_p(1,'</PropertyGroup>')\nend\nend\nlocal function runtime(cfg)\nlocal runtime\nlocal flags = cfg.flags\nif premake.config.isdebugbuild(cfg) then\nruntime = iif(flags.StaticRuntime and not flags.Managed, \"Mul"
"tiThreadedDebug\", \"MultiThreadedDebugDLL\")\nelse\nruntime = iif(flags.StaticRuntime and not flags.Managed, \"MultiThreaded\", \"MultiThreadedDLL\")\nend\nreturn runtime\nend\nlocal function precompiled_header(cfg)\n if not cfg.flags.NoPCH and cfg.pchheader then\n_p(3,'<PrecompiledHeader>Use</PrecompiledHeader>')\n_p(3,'<PrecompiledHeaderFile>%s</PrecompiledHeaderFile>', cfg.pchheader)\nelse\n_p(3,'<PrecompiledHeader></PrecompiledHeader>')\nend\nend\nlocal function preprocessor(indent,cfg)\nif #cfg.defines > 0 then\n_p(indent,'<PreprocessorDefinitions>%s;%%(PreprocessorDefinitions)</PreprocessorDefinitions>'\n,premake.esc(table.concat(cfg.defines, \";\")))\nelse\n_p(indent,'<PreprocessorDefinitions></PreprocessorDefinitions>')\nend\nend\nlocal function include_dirs(indent,cfg)\nif #cfg.includedirs > 0 then\n_p(indent,'<AdditionalIncludeDirectories>%s;%%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>'\n,premake.esc(path.translate(table.concat(cfg.includedirs, \";\"), '\\\\')))\nend\nend\nlo"
"cal function resource_compile(cfg)\n_p(2,'<ResourceCompile>')\npreprocessor(3,cfg)\ninclude_dirs(3,cfg)\n_p(2,'</ResourceCompile>')\nend\nlocal function exceptions(cfg)\nif cfg.flags.NoExceptions then\n_p(2,'<ExceptionHandling>false</ExceptionHandling>')\nelseif cfg.flags.SEH then\n_p(2,'<ExceptionHandling>Async</ExceptionHandling>')\nend\nend\nlocal function rtti(cfg)\nif cfg.flags.NoRTTI and not cfg.flags.Managed then\n_p(3,'<RuntimeTypeInfo>false</RuntimeTypeInfo>')\nend\nend\nlocal function calling_convention(cfg)\nif cfg.flags.FastCall then\n_p(3,'<CallingConvention>FastCall</CallingConvention>')\nelseif cfg.flags.StdCall then\n_p(3,'<CallingConvention>StdCall</CallingConvention>')\nend\nend\nlocal function wchar_t_buildin(cfg)\nif cfg.flags.NativeWChar then\n_p(3,'<TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>')\nelseif cfg.flags.NoNativeWChar then\n_p(3,'<TreatWChar_tAsBuiltInType>false</TreatWChar_tAsBuiltInType>')\nend\nend\nlocal function sse(cfg)\nif cfg.flags.EnableSSE then\n_p(3,'<Ena"
- "bleEnhancedInstructionSet>StreamingSIMDExtensions</EnableEnhancedInstructionSet>')\nelseif cfg.flags.EnableSSE2 then\n_p(3,'<EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>')\nend\nend\nlocal function floating_point(cfg)\n if cfg.flags.FloatFast then\n_p(3,'<FloatingPointModel>Fast</FloatingPointModel>')\nelseif cfg.flags.FloatStrict and not cfg.flags.Managed then\n_p(3,'<FloatingPointModel>Strict</FloatingPointModel>')\nend\nend\nlocal function debug_info(cfg)\nlocal debug_info = ''\nif cfg.flags.Symbols then\nif cfg.platform == \"x64\"\nor cfg.flags.Managed\nor premake.config.isoptimizedbuild(cfg.flags)\nor cfg.flags.NoEditAndContinue\nthen\ndebug_info = \"ProgramDatabase\"\nelse\ndebug_info = \"EditAndContinue\"\nend\nend\n_p(3,'<DebugInformationFormat>%s</DebugInformationFormat>',debug_info)\nend\nlocal function minimal_build(cfg)\nif premake.config.isdebugbuild(cfg) and cfg.flags.EnableMinimalRebuild then\n_p(3,'<MinimalRebuild>true</MinimalRebuild>')\nelse\n_p(3,'"
- "<MinimalRebuild>false</MinimalRebuild>')\nend\nend\nlocal function compile_language(cfg)\nif cfg.options.ForceCPP then\n_p(3,'<CompileAs>CompileAsCpp</CompileAs>')\nelse\nif cfg.language == \"C\" then\n_p(3,'<CompileAs>CompileAsC</CompileAs>')\nend\nend\nend\nlocal function forcedinclude_files(indent,cfg)\nif #cfg.forcedincludes > 0 then\n_p(indent,'<ForcedIncludeFiles>%s</ForcedIncludeFiles>'\n,premake.esc(path.translate(table.concat(cfg.forcedincludes, \";\"), '\\\\')))\nend\nend\nlocal function vs10_clcompile(cfg)\n_p(2,'<ClCompile>')\n_p(3,'<AdditionalOptions>%s %s%%(AdditionalOptions)</AdditionalOptions>'\n, table.concat(premake.esc(cfg.buildoptions), \" \")\n, iif(cfg.flags.UnsignedChar, \"/J \", \" \")\n)\n_p(3,'<Optimization>%s</Optimization>',optimisation(cfg))\ninclude_dirs(3,cfg)\npreprocessor(3,cfg)\nminimal_build(cfg)\nif not premake.config.isoptimizedbuild(cfg.flags) then\nif not cfg.flags.Managed then\n_p(3,'<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>')\nend\nif cfg.flags.ExtraWar"
- "nings then\nend\nelse\n_p(3,'<StringPooling>true</StringPooling>')\nend\n_p(3,'<RuntimeLibrary>%s</RuntimeLibrary>', runtime(cfg))\n_p(3,'<FunctionLevelLinking>true</FunctionLevelLinking>')\nif not cfg.flags.NoMultiProcessorCompilation and not cfg.flags.EnableMinimalRebuild then\n_p(3,'<MultiProcessorCompilation>true</MultiProcessorCompilation>')\nelse\n_p(3,'<MultiProcessorCompilation>false</MultiProcessorCompilation>')\nend\nprecompiled_header(cfg)\nif cfg.flags.ExtraWarnings then\n_p(3,'<WarningLevel>Level4</WarningLevel>')\nelse\n_p(3,'<WarningLevel>Level3</WarningLevel>')\nend\nif cfg.flags.FatalWarnings then\n_p(3,'<TreatWarningAsError>true</TreatWarningAsError>')\nend\nexceptions(cfg)\nrtti(cfg)\ncalling_convention(cfg)\nwchar_t_buildin(cfg)\nsse(cfg)\nfloating_point(cfg)\ndebug_info(cfg)\nif cfg.flags.Symbols then\n_p(3,'<ProgramDataBaseFileName>$(OutDir)%s.pdb</ProgramDataBaseFileName>'\n, path.getbasename(cfg.buildtarget.name))\nend\nif cfg.flags.NoFramePointer then\n_p(3,'<OmitFramePointers>true</Om"
- "itFramePointers>')\nend\ncompile_language(cfg)\nforcedinclude_files(3,cfg);\n_p(2,'</ClCompile>')\nend\nlocal function event_hooks(cfg)\nif #cfg.postbuildcommands> 0 then\n _p(2,'<PostBuildEvent>')\n_p(3,'<Command>%s</Command>',premake.esc(table.implode(cfg.postbuildcommands, \"\", \"\", \"\\r\\n\")))\n_p(2,'</PostBuildEvent>')\nend\nif #cfg.prebuildcommands> 0 then\n _p(2,'<PreBuildEvent>')\n_p(3,'<Command>%s</Command>',premake.esc(table.implode(cfg.prebuildcommands, \"\", \"\", \"\\r\\n\")))\n_p(2,'</PreBuildEvent>')\nend\nif #cfg.prelinkcommands> 0 then\n _p(2,'<PreLinkEvent>')\n_p(3,'<Command>%s</Command>',premake.esc(table.implode(cfg.prelinkcommands, \"\", \"\", \"\\r\\n\")))\n_p(2,'</PreLinkEvent>')\nend\nend\nlocal function additional_options(indent,cfg)\nif #cfg.linkoptions > 0 then\n_p(indent,'<AdditionalOptions>%s %%(AdditionalOptions)</AdditionalOptions>',\ntable.concat(premake.esc(cfg.linkoptions), \" \"))\nend\nend\nlocal function link_target_machine(index,cfg)\nlocal platforms = {x32 = "
- "'MachineX86', x64 = 'MachineX64'}\nif platforms[cfg.platform] then\n_p(index,'<TargetMachine>%s</TargetMachine>', platforms[cfg.platform])\nend\nend\nlocal function item_def_lib(cfg)\n -- The Xbox360 project files are stored in another place in the project file.\nif cfg.kind == 'StaticLib' and cfg.platform ~= \"Xbox360\" then\n_p(1,'<Lib>')\n_p(2,'<OutputFile>$(OutDir)%s</OutputFile>',cfg.buildtarget.name)\nadditional_options(2,cfg)\nlink_target_machine(2,cfg)\n_p(1,'</Lib>')\nend\nend\nlocal function import_lib(cfg)\nif cfg.kind == \"SharedLib\" then\nlocal implibname = cfg.linktarget.fullpath\n_p(3,'<ImportLibrary>%s</ImportLibrary>',iif(cfg.flags.NoImportLib, cfg.objectsdir .. \"\\\\\" .. path.getname(implibname), implibname))\nend\nend\nfunction vc2010.link(cfg)\n_p(2,'<Link>')\n_p(3,'<SubSystem>%s</SubSystem>', iif(cfg.kind == \"ConsoleApp\", \"Console\", \"Windows\"))\n_p(3,'<GenerateDebugInformation>%s</GenerateDebugInformation>', tostring(cfg.flags.Symbols ~= nil))\nif premake.config.isoptimizedb"
- "uild(cfg.flags) then\n_p(3,'<EnableCOMDATFolding>true</EnableCOMDATFolding>')\n_p(3,'<OptimizeReferences>true</OptimizeReferences>')\nend\nif cfg.kind ~= 'StaticLib' then\nvc2010.additionalDependencies(cfg)\n_p(3,'<OutputFile>$(OutDir)%s</OutputFile>', cfg.buildtarget.name)\nif #cfg.libdirs > 0 then\n_p(3,'<AdditionalLibraryDirectories>%s;%%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>',\npremake.esc(path.translate(table.concat(cfg.libdirs, ';'), '\\\\')))\nend\nif vc2010.config_type(cfg) == 'Application' and not cfg.flags.WinMain and not cfg.flags.Managed then\nif cfg.flags.Unicode then\n_p(3,'<EntryPointSymbol>wmainCRTStartup</EntryPointSymbol>')\nelse\n_p(3,'<EntryPointSymbol>mainCRTStartup</EntryPointSymbol>')\nend\nend\nimport_lib(cfg)\nlocal deffile = premake.findfile(cfg, \".def\")\nif deffile then\n_p(3,'<ModuleDefinitionFile>%s</ModuleDefinitionFile>', deffile)\nend\nlink_target_machine(3,cfg)\nadditional_options(3,cfg)\nend\n_p(2,'</Link>')\nend\nfunction vc2010.additionalDependencies"
- "(cfg)\nlocal links = premake.getlinks(cfg, \"system\", \"fullpath\")\nif #links > 0 then\n_p(3,'<AdditionalDependencies>%s;%%(AdditionalDependencies)</AdditionalDependencies>',\ntable.concat(links, \";\"))\nend\nend\nlocal function item_definitions(prj)\nfor _, cfginfo in ipairs(prj.solution.vstudio_configs) do\nlocal cfg = premake.getconfig(prj, cfginfo.src_buildcfg, cfginfo.src_platform)\n_p(1,'<ItemDefinitionGroup ' ..if_config_and_platform() ..'>'\n,premake.esc(cfginfo.name))\nvs10_clcompile(cfg)\nresource_compile(cfg)\nitem_def_lib(cfg)\nvc2010.link(cfg)\nevent_hooks(cfg)\n_p(1,'</ItemDefinitionGroup>')\nend\nend\nfunction vc2010.getfilegroup(prj, group)\nlocal sortedfiles = prj.vc2010sortedfiles\nif not sortedfiles then\nsortedfiles = {\nClCompile = {},\nClInclude = {},\nNone = {},\nResourceCompile = {},\nAppxManifest = {},\nImage = {}\n}\nlocal foundAppxManifest = false\nfor file in premake.project.eachfile(prj) do\nif path.iscppfile(file.name) then\ntable.insert(sortedfiles.ClCompile, file)\nelseif pat"
- "h.iscppheader(file.name) then\nif not table.icontains(prj.removefiles, file) then\ntable.insert(sortedfiles.ClInclude, file)\nend\nelseif path.isresourcefile(file.name) then\ntable.insert(sortedfiles.ResourceCompile, file)\nelse\nlocal ext = path.getextension(file.name):lower()\nif ext == \".appxmanifest\" then\nfoundAppxManifest = true\ntable.insert(sortedfiles.AppxManifest, file)\nelse\ntable.insert(sortedfiles.None, file)\nend\nend\nend\nif vstudio.iswinrt() and prj.kind == \"WindowedApp\" and not foundAppxManifest then\nvstudio.needAppxManifest = true\nlocal fcfg = {}\nfcfg.name = prj.name .. \".appxmanifest\"\nfcfg.vpath = premake.project.getvpath(prj, fcfg.name)\ntable.insert(sortedfiles.AppxManifest, fcfg)\nlocal splashcfg = {}\nsplashcfg.name = premake.vstudio.splashpath\nsplashcfg.vpath = premake.vstudio.splashpath\ntable.insert(sortedfiles.Image, splashcfg)\nend\nprj.vc2010sortedfiles = sortedfiles\nend\nreturn sortedfiles[group]\nend\nfunction vc2010.files(prj)\nvc2010.simplefilesgroup(prj, \"ClIncl"
- "ude\")\nvc2010.compilerfilesgroup(prj)\nvc2010.simplefilesgroup(prj, \"None\")\nvc2010.customtaskgroup(prj)\nvc2010.simplefilesgroup(prj, \"ResourceCompile\")\nvc2010.simplefilesgroup(prj, \"AppxManifest\")\nvc2010.deploymentcontentgroup(prj, \"Image\")\nend\nfunction vc2010.customtaskgroup(prj)\nlocal files = { }\nfor _, custombuildtask in ipairs(prj.custombuildtask or {}) do\nfor _, buildtask in ipairs(custombuildtask or {}) do\nlocal fcfg = { }\nfcfg.name = path.getrelative(prj.location,buildtask[1])\nfcfg.vpath = path.trimdots(fcfg.name)\ntable.insert(files, fcfg)\nend\nend\nif #files > 0 then\n_p(1,'<ItemGroup>')\nlocal groupedBuildTasks = {}\nfor _, custombuildtask in ipairs(prj.custombuildtask or {}) do\nfor _, buildtask in ipairs(custombuildtask or {}) do\nif (groupedBuildTasks[buildtask[1]] == nil) then\ngroupedBuildTasks[buildtask[1]] = {}\nend\ntable.insert(groupedBuildTasks[buildtask[1]], buildtask)\nend\nend\nfor name, custombuildtask in pairs(groupedBuildTasks or {}) do\n_p(2,'<CustomBuild Inclu"
- "de=\\\"%s\\\">', path.translate(path.getrelative(prj.location,name), \"\\\\\"))\n_p(3,'<FileType>Text</FileType>')\nlocal cmd = \"\"\nlocal outputs = \"\"\nfor _, buildtask in ipairs(custombuildtask or {}) do\nfor _, cmdline in ipairs(buildtask[4] or {}) do\ncmd = cmd .. cmdline\nlocal num = 1\nfor _, depdata in ipairs(buildtask[3] or {}) do\ncmd = string.gsub(cmd,\"%$%(\" .. num ..\"%)\", string.format(\"%s \",path.getrelative(prj.location,depdata)))\nnum = num + 1\nend\ncmd = string.gsub(cmd, \"%$%(<%)\", string.format(\"%s \",path.getrelative(prj.location,buildtask[1])))\ncmd = string.gsub(cmd, \"%$%(@%)\", string.format(\"%s \",path.getrelative(prj.location,buildtask[2])))\ncmd = cmd .. \"\\r\\n\"\nend\noutputs = outputs .. path.getrelative(prj.location,buildtask[2]) .. \";\"\nend\n_p(3,'<Command>%s</Command>',cmd)\n_p(3,'<Outputs>%s%%(Outputs)</Outputs>',outputs)\n_p(3,'<SubType>Designer</SubType>')\n_p(3,'<Message></Message>')\n_p(2,'</CustomBuild>')\nend\n_p(1,'</ItemGroup>')\nend\nend\nfunction vc2010."
- "simplefilesgroup(prj, section, subtype)\nlocal files = vc2010.getfilegroup(prj, section)\nif #files > 0 then\n_p(1,'<ItemGroup>')\nfor _, file in ipairs(files) do\nif subtype then\n_p(2,'<%s Include=\\\"%s\\\">', section, path.translate(file.name, \"\\\\\"))\n_p(3,'<SubType>%s</SubType>', subtype)\n_p(2,'</%s>', section)\nelse\n_p(2,'<%s Include=\\\"%s\\\" />', section, path.translate(file.name, \"\\\\\"))\nend\nend\n_p(1,'</ItemGroup>')\nend\nend\nfunction vc2010.deploymentcontentgroup(prj, section)\nlocal files = vc2010.getfilegroup(prj, section)\nif #files > 0 then\n_p(1,'<ItemGroup>')\nfor _, file in ipairs(files) do\n_p(2,'<%s Include=\\\"%s\\\">', section, path.translate(file.name, \"\\\\\"))\n_p(3,'<DeploymentContent>true</DeploymentContent>')\n_p(2,'</%s>', section)\nend\n_p(1,'</ItemGroup>')\nend\nend\nfunction vc2010.compilerfilesgroup(prj)\nlocal configs = prj.solution.vstudio_configs\nlocal files = vc2010.getfilegroup(prj, \"ClCompile\")\nif #files > 0 then\nlocal config_mappings = {}\nfor _, cf"
- "ginfo in ipairs(configs) do\nlocal cfg = premake.getconfig(prj, cfginfo.src_buildcfg, cfginfo.src_platform)\nif cfg.pchheader and cfg.pchsource and not cfg.flags.NoPCH then\nconfig_mappings[cfginfo] = path.translate(cfg.pchsource, \"\\\\\")\nend\nend\n_p(1,'<ItemGroup>')\nfor _, file in ipairs(files) do\nlocal translatedpath = path.translate(file.name, \"\\\\\")\n_p(2, '<ClCompile Include=\\\"%s\\\">', translatedpath)\n_p(3, '<ObjectFileName>$(IntDir)%s.obj</ObjectFileName>'\n, premake.esc(path.translate(path.trimdots(path.removeext(file.name))))\n)\nfor _, cfginfo in ipairs(configs) do\nif config_mappings[cfginfo] and translatedpath == config_mappings[cfginfo] then\n_p(3,'<PrecompiledHeader '.. if_config_and_platform() .. '>Create</PrecompiledHeader>', premake.esc(cfginfo.name))\nconfig_mappings[cfginfo] = nil --only one source file per pch\nend\nend\nlocal excluded = table.icontains(prj.excludes, file.name)\nfor _, vsconfig in ipairs(configs) do\nlocal cfg = premake.getconfig(prj, vsconfig.src_buildcfg, vsc"
- "onfig.src_platform)\nif excluded or table.icontains(cfg.excludes, file.name) then\n_p(3, '<ExcludedFromBuild '\n.. if_config_and_platform()\n.. '>true</ExcludedFromBuild>'\n, premake.esc(vsconfig.name)\n)\nend\nend\n_p(2,'</ClCompile>')\nend\n_p(1,'</ItemGroup>')\nend\nend\nfunction vc2010.header(targets)\nio.eol = \"\\r\\n\"\n_p('<?xml version=\"1.0\" encoding=\"utf-8\"?>')\nlocal t = \"\"\nif targets then\nt = ' DefaultTargets=\"' .. targets .. '\"'\nend\n_p('<Project%s ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">', t)\nend\nfunction premake.vs2010_vcxproj(prj)\nio.indent = \" \"\nvc2010.header(\"Build\")\nvs2010_config(prj)\nvs2010_globals(prj)\n_p(1,'<Import Project=\"$(VCTargetsPath)\\\\Microsoft.Cpp.Default.props\" />')\nfor _, cfginfo in ipairs(prj.solution.vstudio_configs) do\nlocal cfg = premake.getconfig(prj, cfginfo.src_buildcfg, cfginfo.src_platform)\nvc2010.configurationPropertyGroup(cfg, cfginfo)\nend\n_p(1,'<Import Project=\"$(VCTargetsPath)\\\\Microsoft.C"
- "pp.props\" />')\n_p(1,'<ImportGroup Label=\"ExtensionSettings\">')\n_p(1,'</ImportGroup>')\nimport_props(prj)\n_p(1,'<PropertyGroup Label=\"UserMacros\" />')\nvc2010.outputProperties(prj)\nitem_definitions(prj)\nvc2010.files(prj)\nvc2010.projectReferences(prj)\n_p(1,'<Import Project=\"$(VCTargetsPath)\\\\Microsoft.Cpp.targets\" />')\n_p(1,'<ImportGroup Label=\"ExtensionTargets\">')\n_p(1,'</ImportGroup>')\n_p('</Project>')\nend\nfunction vc2010.projectReferences(prj)\nlocal deps = premake.getdependencies(prj)\nif #deps > 0 then\n_p(1,'<ItemGroup>')\nfor _, dep in ipairs(deps) do\nlocal deppath = path.getrelative(prj.location, vstudio.projectfile(dep))\n_p(2,'<ProjectReference Include=\\\"%s\\\">', path.translate(deppath, \"\\\\\"))\n_p(3,'<Project>{%s}</Project>', dep.uuid)\nif vstudio.iswinrt() then\n_p(3,'<ReferenceOutputAssembly>false</ReferenceOutputAssembly>')\nend\n_p(2,'</ProjectReference>')\nend\n_p(1,'</ItemGroup>')\nend\nend\nfunction vc2010.debugdir(cfg)\nif cfg.debugdir and not vstudio.iswinrt() th"
- "en\n_p(' <LocalDebuggerWorkingDirectory>%s</LocalDebuggerWorkingDirectory>', path.translate(cfg.debugdir, '\\\\'))\n_p(' <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>')\nend\nif cfg.debugargs then\n_p(' <LocalDebuggerCommandArguments>%s</LocalDebuggerCommandArguments>', table.concat(cfg.debugargs, \" \"))\nend\nend\nfunction vc2010.debugenvs(cfg)\nif cfg.debugenvs and #cfg.debugenvs > 0 then\n_p(2,'<LocalDebuggerEnvironment>%s%s</LocalDebuggerEnvironment>',table.concat(cfg.debugenvs, \"\\n\")\n,iif(cfg.flags.DebugEnvsInherit,'\\n$(LocalDebuggerEnvironment)','')\n)\nif cfg.flags.DebugEnvsDontMerge then\n_p(2,'<LocalDebuggerMergeEnvironment>false</LocalDebuggerMergeEnvironment>')\nend\nend\nend\nfunction premake.vs2010_vcxproj_user(prj)\nio.indent = \" \"\nvc2010.header()\nfor _, cfginfo in ipairs(prj.solution.vstudio_configs) do\nlocal cfg = premake.getconfig(prj, cfginfo.src_buildcfg, cfginfo.src_platform)\n_p(' <PropertyGroup '.. if_config_and_platform() ..'>', premake.esc(cfginfo.name))\nv"
- "c2010.debugdir(cfg)\nvc2010.debugenvs(cfg)\n_p(' </PropertyGroup>')\nend\n_p('</Project>')\nend\nfunction premake.vs2010_appxmanifest(prj)\nio.indent = \" \"\nio.eol = \"\\r\\n\"\n_p('<?xml version=\"1.0\" encoding=\"utf-8\"?>')\nif vstudio.toolset == \"v120_wp81\" then\n_p('<Package xmlns=\"http://schemas.microsoft.com/appx/2010/manifest\" xmlns:m2=\"http://schemas.microsoft.com/appx/2013/manifest\" xmlns:m3=\"http://schemas.microsoft.com/appx/2014/manifest\" xmlns:mp=\"http://schemas.microsoft.com/appx/2014/phone/manifest\">')\nelseif vstudio.storeapp == \"8.1\" then\n_p('<Package xmlns=\"http://schemas.microsoft.com/appx/2010/manifest\" xmlns:m3=\"http://schemas.microsoft.com/appx/2013/manifest\">')\nelse\n_p('<Package xmlns=\"http://schemas.microsoft.com/appx/manifest/foundation/windows10\" xmlns:mp=\"http://schemas.microsoft.com/appx/2014/phone/manifest\" xmlns:m3=\"http://schemas.microsoft.com/appx/manifest/uap/windows10\">')\nend\n_p(1,'<Identity Name=\"' .. prj.uuid .. '\"')\n_p(2,'Publisher=\"CN=Unk"
- "nown\"')\n_p(2,'Version=\"1.0.0.0\" />')\nif vstudio.toolset == \"v120_wp81\" or vstudio.storeapp == \"8.2\" then\n_p(1,'<mp:PhoneIdentity PhoneProductId=\"' .. prj.uuid .. '\" PhonePublisherId=\"00000000-0000-0000-0000-000000000000\"/>')\nend\n_p(1,'<Properties>')\n_p(2,'<DisplayName>' .. prj.name .. '</DisplayName>')\n_p(2,'<PublisherDisplayName>Unknown</PublisherDisplayName>')\n_p(2,'<Logo>EmptyLogo.png</Logo>')\n_p(1,'</Properties>')\nif vstudio.storeapp == \"8.2\" then\n_p(1,'<Dependencies>')\n_p(2,'<TargetDeviceFamily Name=\"Windows.Universal\" MinVersion=\"10.0.10069.0\" MaxVersionTested=\"10.0.10069.0\" />')\n_p(1,'</Dependencies>')\nelse\n_p(1,'<Prerequisites>')\n_p(2,'<OSMinVersion>6.3.0</OSMinVersion>')\n_p(2,'<OSMaxVersionTested>6.3.0</OSMaxVersionTested>')\n_p(1,'</Prerequisites>')\nend\n_p(1,'<Resources>')\n_p(2,'<Resource Language=\"x-generate\"/>')\n_p(1,'</Resources>')\n_p(1,'<Applications>')\n_p(2,'<Application Id=\"App\"')\n_p(3,'Executable=\"$targetnametoken$.exe\"')\n_p(3,'EntryPoint=\"App"
- "\">')\n_p(3,'<m3:VisualElements')\n_p(4,'DisplayName=\"Blah\"')\n_p(4,'Square150x150Logo=\"Assets\\\\Logo.png\"')\nif vstudio.toolset == \"v120_wp81\" or vstudio.storeapp == \"8.2\" then\n_p(4,'Square44x44Logo=\"Assets\\\\SmallLogo.png\"')\nelse\n_p(4,'Square30x30Logo=\"Assets\\\\SmallLogo.png\"')\nend\n_p(4,'Description=\"Blah\"')\n_p(4,'ForegroundText=\"light\"')\n_p(4,'BackgroundColor=\"transparent\">')\n_p(4,'<m3:SplashScreen Image=\"%s\" />', path.getname(vstudio.splashpath))\n_p(3,'</m3:VisualElements>')\n_p(2,'</Application>')\n_p(1,'</Applications>')\n_p('</Package>')\nend\n",
+ "bleEnhancedInstructionSet>StreamingSIMDExtensions</EnableEnhancedInstructionSet>')\nelseif cfg.flags.EnableSSE2 then\n_p(3,'<EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>')\nend\nend\nlocal function floating_point(cfg)\n if cfg.flags.FloatFast then\n_p(3,'<FloatingPointModel>Fast</FloatingPointModel>')\nelseif cfg.flags.FloatStrict and not cfg.flags.Managed then\n_p(3,'<FloatingPointModel>Strict</FloatingPointModel>')\nend\nend\nlocal function debug_info(cfg)\nlocal debug_info = ''\nif cfg.flags.Symbols then\nif (action.vstudio.supports64bitEditContinue == false and cfg.platform == \"x64\")\nor cfg.flags.Managed\nor premake.config.isoptimizedbuild(cfg.flags)\nor cfg.flags.NoEditAndContinue\nthen\ndebug_info = \"ProgramDatabase\"\nelse\ndebug_info = \"EditAndContinue\"\nend\nend\n_p(3,'<DebugInformationFormat>%s</DebugInformationFormat>',debug_info)\nend\nlocal function minimal_build(cfg)\nif premake.config.isdebugbuild(cfg) and cfg.flags.EnableMinimalRebuild then\n_p("
+ "3,'<MinimalRebuild>true</MinimalRebuild>')\nelse\n_p(3,'<MinimalRebuild>false</MinimalRebuild>')\nend\nend\nlocal function compile_language(cfg)\nif cfg.options.ForceCPP then\n_p(3,'<CompileAs>CompileAsCpp</CompileAs>')\nelse\nif cfg.language == \"C\" then\n_p(3,'<CompileAs>CompileAsC</CompileAs>')\nend\nend\nend\nlocal function forcedinclude_files(indent,cfg)\nif #cfg.forcedincludes > 0 then\n_p(indent,'<ForcedIncludeFiles>%s</ForcedIncludeFiles>'\n,premake.esc(path.translate(table.concat(cfg.forcedincludes, \";\"), '\\\\')))\nend\nend\nlocal function vs10_clcompile(cfg)\n_p(2,'<ClCompile>')\n_p(3,'<AdditionalOptions>%s %s%%(AdditionalOptions)</AdditionalOptions>'\n, table.concat(premake.esc(cfg.buildoptions), \" \")\n, iif(cfg.flags.UnsignedChar, \"/J \", \" \")\n)\n_p(3,'<Optimization>%s</Optimization>',optimisation(cfg))\ninclude_dirs(3,cfg)\npreprocessor(3,cfg)\nminimal_build(cfg)\nif not premake.config.isoptimizedbuild(cfg.flags) then\nif not cfg.flags.Managed then\n_p(3,'<BasicRuntimeChecks>EnableFastC"
+ "hecks</BasicRuntimeChecks>')\nend\nif cfg.flags.ExtraWarnings then\nend\nelse\n_p(3,'<StringPooling>true</StringPooling>')\nend\n_p(3,'<RuntimeLibrary>%s</RuntimeLibrary>', runtime(cfg))\n_p(3,'<FunctionLevelLinking>true</FunctionLevelLinking>')\nif not cfg.flags.NoMultiProcessorCompilation and not cfg.flags.EnableMinimalRebuild then\n_p(3,'<MultiProcessorCompilation>true</MultiProcessorCompilation>')\nelse\n_p(3,'<MultiProcessorCompilation>false</MultiProcessorCompilation>')\nend\nprecompiled_header(cfg)\nif cfg.flags.ExtraWarnings then\n_p(3,'<WarningLevel>Level4</WarningLevel>')\nelse\n_p(3,'<WarningLevel>Level3</WarningLevel>')\nend\nif cfg.flags.FatalWarnings then\n_p(3,'<TreatWarningAsError>true</TreatWarningAsError>')\nend\nexceptions(cfg)\nrtti(cfg)\ncalling_convention(cfg)\nwchar_t_buildin(cfg)\nsse(cfg)\nfloating_point(cfg)\ndebug_info(cfg)\nif cfg.flags.Symbols then\n_p(3,'<ProgramDataBaseFileName>$(OutDir)%s.pdb</ProgramDataBaseFileName>'\n, path.getbasename(cfg.buildtarget.name))\nend\nif cfg.flag"
+ "s.NoFramePointer then\n_p(3,'<OmitFramePointers>true</OmitFramePointers>')\nend\ncompile_language(cfg)\nforcedinclude_files(3,cfg);\n_p(2,'</ClCompile>')\nend\nlocal function event_hooks(cfg)\nif #cfg.postbuildcommands> 0 then\n _p(2,'<PostBuildEvent>')\n_p(3,'<Command>%s</Command>',premake.esc(table.implode(cfg.postbuildcommands, \"\", \"\", \"\\r\\n\")))\n_p(2,'</PostBuildEvent>')\nend\nif #cfg.prebuildcommands> 0 then\n _p(2,'<PreBuildEvent>')\n_p(3,'<Command>%s</Command>',premake.esc(table.implode(cfg.prebuildcommands, \"\", \"\", \"\\r\\n\")))\n_p(2,'</PreBuildEvent>')\nend\nif #cfg.prelinkcommands> 0 then\n _p(2,'<PreLinkEvent>')\n_p(3,'<Command>%s</Command>',premake.esc(table.implode(cfg.prelinkcommands, \"\", \"\", \"\\r\\n\")))\n_p(2,'</PreLinkEvent>')\nend\nend\nlocal function additional_options(indent,cfg)\nif #cfg.linkoptions > 0 then\n_p(indent,'<AdditionalOptions>%s %%(AdditionalOptions)</AdditionalOptions>',\ntable.concat(premake.esc(cfg.linkoptions), \" \"))\nend\nend\nlocal function l"
+ "ink_target_machine(index,cfg)\nlocal platforms = {x32 = 'MachineX86', x64 = 'MachineX64'}\nif platforms[cfg.platform] then\n_p(index,'<TargetMachine>%s</TargetMachine>', platforms[cfg.platform])\nend\nend\nlocal function item_def_lib(cfg)\n -- The Xbox360 project files are stored in another place in the project file.\nif cfg.kind == 'StaticLib' and cfg.platform ~= \"Xbox360\" then\n_p(1,'<Lib>')\n_p(2,'<OutputFile>$(OutDir)%s</OutputFile>',cfg.buildtarget.name)\nadditional_options(2,cfg)\nlink_target_machine(2,cfg)\n_p(1,'</Lib>')\nend\nend\nlocal function import_lib(cfg)\nif cfg.kind == \"SharedLib\" then\nlocal implibname = cfg.linktarget.fullpath\n_p(3,'<ImportLibrary>%s</ImportLibrary>',iif(cfg.flags.NoImportLib, cfg.objectsdir .. \"\\\\\" .. path.getname(implibname), implibname))\nend\nend\nfunction vc2010.link(cfg)\n_p(2,'<Link>')\n_p(3,'<SubSystem>%s</SubSystem>', iif(cfg.kind == \"ConsoleApp\", \"Console\", \"Windows\"))\n_p(3,'<GenerateDebugInformation>%s</GenerateDebugInformation>', tostring(cf"
+ "g.flags.Symbols ~= nil))\nif premake.config.isoptimizedbuild(cfg.flags) then\n_p(3,'<EnableCOMDATFolding>true</EnableCOMDATFolding>')\n_p(3,'<OptimizeReferences>true</OptimizeReferences>')\nend\nif cfg.kind ~= 'StaticLib' then\nvc2010.additionalDependencies(cfg)\n_p(3,'<OutputFile>$(OutDir)%s</OutputFile>', cfg.buildtarget.name)\nif #cfg.libdirs > 0 then\n_p(3,'<AdditionalLibraryDirectories>%s;%%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>',\npremake.esc(path.translate(table.concat(cfg.libdirs, ';'), '\\\\')))\nend\nif vc2010.config_type(cfg) == 'Application' and not cfg.flags.WinMain and not cfg.flags.Managed then\nif cfg.flags.Unicode then\n_p(3,'<EntryPointSymbol>wmainCRTStartup</EntryPointSymbol>')\nelse\n_p(3,'<EntryPointSymbol>mainCRTStartup</EntryPointSymbol>')\nend\nend\nimport_lib(cfg)\nlocal deffile = premake.findfile(cfg, \".def\")\nif deffile then\n_p(3,'<ModuleDefinitionFile>%s</ModuleDefinitionFile>', deffile)\nend\nlink_target_machine(3,cfg)\nadditional_options(3,cfg)\nend\n_p(2"
+ ",'</Link>')\nend\nfunction vc2010.additionalDependencies(cfg)\nlocal links = premake.getlinks(cfg, \"system\", \"fullpath\")\nif #links > 0 then\n_p(3,'<AdditionalDependencies>%s;%%(AdditionalDependencies)</AdditionalDependencies>',\ntable.concat(links, \";\"))\nend\nend\nlocal function item_definitions(prj)\nfor _, cfginfo in ipairs(prj.solution.vstudio_configs) do\nlocal cfg = premake.getconfig(prj, cfginfo.src_buildcfg, cfginfo.src_platform)\n_p(1,'<ItemDefinitionGroup ' ..if_config_and_platform() ..'>'\n,premake.esc(cfginfo.name))\nvs10_clcompile(cfg)\nresource_compile(cfg)\nitem_def_lib(cfg)\nvc2010.link(cfg)\nevent_hooks(cfg)\n_p(1,'</ItemDefinitionGroup>')\nend\nend\nfunction vc2010.getfilegroup(prj, group)\nlocal sortedfiles = prj.vc2010sortedfiles\nif not sortedfiles then\nsortedfiles = {\nClCompile = {},\nClInclude = {},\nNone = {},\nResourceCompile = {},\nAppxManifest = {},\nImage = {}\n}\nlocal foundAppxManifest = false\nfor file in premake.project.eachfile(prj) do\nif path.iscppfile(file.name) the"
+ "n\ntable.insert(sortedfiles.ClCompile, file)\nelseif path.iscppheader(file.name) then\nif not table.icontains(prj.removefiles, file) then\ntable.insert(sortedfiles.ClInclude, file)\nend\nelseif path.isresourcefile(file.name) then\ntable.insert(sortedfiles.ResourceCompile, file)\nelse\nlocal ext = path.getextension(file.name):lower()\nif ext == \".appxmanifest\" then\nfoundAppxManifest = true\ntable.insert(sortedfiles.AppxManifest, file)\nelse\ntable.insert(sortedfiles.None, file)\nend\nend\nend\nif vstudio.iswinrt() and prj.kind == \"WindowedApp\" and not foundAppxManifest then\nvstudio.needAppxManifest = true\nlocal fcfg = {}\nfcfg.name = prj.name .. \".appxmanifest\"\nfcfg.vpath = premake.project.getvpath(prj, fcfg.name)\ntable.insert(sortedfiles.AppxManifest, fcfg)\nlocal splashcfg = {}\nsplashcfg.name = premake.vstudio.splashpath\nsplashcfg.vpath = premake.vstudio.splashpath\ntable.insert(sortedfiles.Image, splashcfg)\nend\nprj.vc2010sortedfiles = sortedfiles\nend\nreturn sortedfiles[group]\nend\nfunction "
+ "vc2010.files(prj)\nvc2010.simplefilesgroup(prj, \"ClInclude\")\nvc2010.compilerfilesgroup(prj)\nvc2010.simplefilesgroup(prj, \"None\")\nvc2010.customtaskgroup(prj)\nvc2010.simplefilesgroup(prj, \"ResourceCompile\")\nvc2010.simplefilesgroup(prj, \"AppxManifest\")\nvc2010.deploymentcontentgroup(prj, \"Image\")\nend\nfunction vc2010.customtaskgroup(prj)\nlocal files = { }\nfor _, custombuildtask in ipairs(prj.custombuildtask or {}) do\nfor _, buildtask in ipairs(custombuildtask or {}) do\nlocal fcfg = { }\nfcfg.name = path.getrelative(prj.location,buildtask[1])\nfcfg.vpath = path.trimdots(fcfg.name)\ntable.insert(files, fcfg)\nend\nend\nif #files > 0 then\n_p(1,'<ItemGroup>')\nlocal groupedBuildTasks = {}\nfor _, custombuildtask in ipairs(prj.custombuildtask or {}) do\nfor _, buildtask in ipairs(custombuildtask or {}) do\nif (groupedBuildTasks[buildtask[1]] == nil) then\ngroupedBuildTasks[buildtask[1]] = {}\nend\ntable.insert(groupedBuildTasks[buildtask[1]], buildtask)\nend\nend\nfor name, custombuildtask in pai"
+ "rs(groupedBuildTasks or {}) do\n_p(2,'<CustomBuild Include=\\\"%s\\\">', path.translate(path.getrelative(prj.location,name), \"\\\\\"))\n_p(3,'<FileType>Text</FileType>')\nlocal cmd = \"\"\nlocal outputs = \"\"\nfor _, buildtask in ipairs(custombuildtask or {}) do\nfor _, cmdline in ipairs(buildtask[4] or {}) do\ncmd = cmd .. cmdline\nlocal num = 1\nfor _, depdata in ipairs(buildtask[3] or {}) do\ncmd = string.gsub(cmd,\"%$%(\" .. num ..\"%)\", string.format(\"%s \",path.getrelative(prj.location,depdata)))\nnum = num + 1\nend\ncmd = string.gsub(cmd, \"%$%(<%)\", string.format(\"%s \",path.getrelative(prj.location,buildtask[1])))\ncmd = string.gsub(cmd, \"%$%(@%)\", string.format(\"%s \",path.getrelative(prj.location,buildtask[2])))\ncmd = cmd .. \"\\r\\n\"\nend\noutputs = outputs .. path.getrelative(prj.location,buildtask[2]) .. \";\"\nend\n_p(3,'<Command>%s</Command>',cmd)\n_p(3,'<Outputs>%s%%(Outputs)</Outputs>',outputs)\n_p(3,'<SubType>Designer</SubType>')\n_p(3,'<Message></Message>')\n_p(2,'</CustomBuild>'"
+ ")\nend\n_p(1,'</ItemGroup>')\nend\nend\nfunction vc2010.simplefilesgroup(prj, section, subtype)\nlocal files = vc2010.getfilegroup(prj, section)\nif #files > 0 then\n_p(1,'<ItemGroup>')\nfor _, file in ipairs(files) do\nif subtype then\n_p(2,'<%s Include=\\\"%s\\\">', section, path.translate(file.name, \"\\\\\"))\n_p(3,'<SubType>%s</SubType>', subtype)\n_p(2,'</%s>', section)\nelse\n_p(2,'<%s Include=\\\"%s\\\" />', section, path.translate(file.name, \"\\\\\"))\nend\nend\n_p(1,'</ItemGroup>')\nend\nend\nfunction vc2010.deploymentcontentgroup(prj, section)\nlocal files = vc2010.getfilegroup(prj, section)\nif #files > 0 then\n_p(1,'<ItemGroup>')\nfor _, file in ipairs(files) do\n_p(2,'<%s Include=\\\"%s\\\">', section, path.translate(file.name, \"\\\\\"))\n_p(3,'<DeploymentContent>true</DeploymentContent>')\n_p(2,'</%s>', section)\nend\n_p(1,'</ItemGroup>')\nend\nend\nfunction vc2010.compilerfilesgroup(prj)\nlocal configs = prj.solution.vstudio_configs\nlocal files = vc2010.getfilegroup(prj, \"ClCompile\")\nif"
+ " #files > 0 then\nlocal config_mappings = {}\nfor _, cfginfo in ipairs(configs) do\nlocal cfg = premake.getconfig(prj, cfginfo.src_buildcfg, cfginfo.src_platform)\nif cfg.pchheader and cfg.pchsource and not cfg.flags.NoPCH then\nconfig_mappings[cfginfo] = path.translate(cfg.pchsource, \"\\\\\")\nend\nend\n_p(1,'<ItemGroup>')\nfor _, file in ipairs(files) do\nlocal translatedpath = path.translate(file.name, \"\\\\\")\n_p(2, '<ClCompile Include=\\\"%s\\\">', translatedpath)\n_p(3, '<ObjectFileName>$(IntDir)%s.obj</ObjectFileName>'\n, premake.esc(path.translate(path.trimdots(path.removeext(file.name))))\n)\nfor _, cfginfo in ipairs(configs) do\nif config_mappings[cfginfo] and translatedpath == config_mappings[cfginfo] then\n_p(3,'<PrecompiledHeader '.. if_config_and_platform() .. '>Create</PrecompiledHeader>', premake.esc(cfginfo.name))\nconfig_mappings[cfginfo] = nil --only one source file per pch\nend\nend\nlocal excluded = table.icontains(prj.excludes, file.name)\nfor _, vsconfig in ipairs(configs) do\nlocal"
+ " cfg = premake.getconfig(prj, vsconfig.src_buildcfg, vsconfig.src_platform)\nif excluded or table.icontains(cfg.excludes, file.name) then\n_p(3, '<ExcludedFromBuild '\n.. if_config_and_platform()\n.. '>true</ExcludedFromBuild>'\n, premake.esc(vsconfig.name)\n)\nend\nend\n_p(2,'</ClCompile>')\nend\n_p(1,'</ItemGroup>')\nend\nend\nfunction vc2010.header(targets)\nio.eol = \"\\r\\n\"\n_p('<?xml version=\"1.0\" encoding=\"utf-8\"?>')\nlocal t = \"\"\nif targets then\nt = ' DefaultTargets=\"' .. targets .. '\"'\nend\n_p('<Project%s ToolsVersion=\"%s\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">', t, action.vstudio.toolsVersion)\nend\nfunction premake.vs2010_vcxproj(prj)\nio.indent = \" \"\nvc2010.header(\"Build\")\nvs2010_config(prj)\nvs2010_globals(prj)\n_p(1,'<Import Project=\"$(VCTargetsPath)\\\\Microsoft.Cpp.Default.props\" />')\nfor _, cfginfo in ipairs(prj.solution.vstudio_configs) do\nlocal cfg = premake.getconfig(prj, cfginfo.src_buildcfg, cfginfo.src_platform)\nvc2010.configurationPrope"
+ "rtyGroup(cfg, cfginfo)\nend\n_p(1,'<Import Project=\"$(VCTargetsPath)\\\\Microsoft.Cpp.props\" />')\n_p(1,'<ImportGroup Label=\"ExtensionSettings\">')\n_p(1,'</ImportGroup>')\nimport_props(prj)\n_p(1,'<PropertyGroup Label=\"UserMacros\" />')\nvc2010.outputProperties(prj)\nitem_definitions(prj)\nvc2010.files(prj)\nvc2010.projectReferences(prj)\n_p(1,'<Import Project=\"$(VCTargetsPath)\\\\Microsoft.Cpp.targets\" />')\n_p(1,'<ImportGroup Label=\"ExtensionTargets\">')\n_p(1,'</ImportGroup>')\n_p('</Project>')\nend\nfunction vc2010.projectReferences(prj)\nlocal deps = premake.getdependencies(prj)\nif #deps > 0 then\n_p(1,'<ItemGroup>')\nfor _, dep in ipairs(deps) do\nlocal deppath = path.getrelative(prj.location, vstudio.projectfile(dep))\n_p(2,'<ProjectReference Include=\\\"%s\\\">', path.translate(deppath, \"\\\\\"))\n_p(3,'<Project>{%s}</Project>', dep.uuid)\nif vstudio.iswinrt() then\n_p(3,'<ReferenceOutputAssembly>false</ReferenceOutputAssembly>')\nend\n_p(2,'</ProjectReference>')\nend\n_p(1,'</ItemGroup>')\ne"
+ "nd\nend\nfunction vc2010.debugdir(cfg)\nif cfg.debugdir and not vstudio.iswinrt() then\n_p(' <LocalDebuggerWorkingDirectory>%s</LocalDebuggerWorkingDirectory>', path.translate(cfg.debugdir, '\\\\'))\n_p(' <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>')\nend\nif cfg.debugargs then\n_p(' <LocalDebuggerCommandArguments>%s</LocalDebuggerCommandArguments>', table.concat(cfg.debugargs, \" \"))\nend\nend\nfunction vc2010.debugenvs(cfg)\nif cfg.debugenvs and #cfg.debugenvs > 0 then\n_p(2,'<LocalDebuggerEnvironment>%s%s</LocalDebuggerEnvironment>',table.concat(cfg.debugenvs, \"\\n\")\n,iif(cfg.flags.DebugEnvsInherit,'\\n$(LocalDebuggerEnvironment)','')\n)\nif cfg.flags.DebugEnvsDontMerge then\n_p(2,'<LocalDebuggerMergeEnvironment>false</LocalDebuggerMergeEnvironment>')\nend\nend\nend\nfunction premake.vs2010_vcxproj_user(prj)\nio.indent = \" \"\nvc2010.header()\nfor _, cfginfo in ipairs(prj.solution.vstudio_configs) do\nlocal cfg = premake.getconfig(prj, cfginfo.src_buildcfg, cfginfo.src_platform)\n_p"
+ "(' <PropertyGroup '.. if_config_and_platform() ..'>', premake.esc(cfginfo.name))\nvc2010.debugdir(cfg)\nvc2010.debugenvs(cfg)\n_p(' </PropertyGroup>')\nend\n_p('</Project>')\nend\nfunction premake.vs2010_appxmanifest(prj)\nio.indent = \" \"\nio.eol = \"\\r\\n\"\n_p('<?xml version=\"1.0\" encoding=\"utf-8\"?>')\nif vstudio.toolset == \"v120_wp81\" then\n_p('<Package xmlns=\"http://schemas.microsoft.com/appx/2010/manifest\" xmlns:m2=\"http://schemas.microsoft.com/appx/2013/manifest\" xmlns:m3=\"http://schemas.microsoft.com/appx/2014/manifest\" xmlns:mp=\"http://schemas.microsoft.com/appx/2014/phone/manifest\">')\nelseif vstudio.storeapp == \"8.1\" then\n_p('<Package xmlns=\"http://schemas.microsoft.com/appx/2010/manifest\" xmlns:m3=\"http://schemas.microsoft.com/appx/2013/manifest\">')\nelse\n_p('<Package xmlns=\"http://schemas.microsoft.com/appx/manifest/foundation/windows10\" xmlns:mp=\"http://schemas.microsoft.com/appx/2014/phone/manifest\" xmlns:m3=\"http://schemas.microsoft.com/appx/manifest/uap/windows1"
+ "0\">')\nend\n_p(1,'<Identity Name=\"' .. prj.uuid .. '\"')\n_p(2,'Publisher=\"CN=Unknown\"')\n_p(2,'Version=\"1.0.0.0\" />')\nif vstudio.toolset == \"v120_wp81\" or vstudio.storeapp == \"8.2\" then\n_p(1,'<mp:PhoneIdentity PhoneProductId=\"' .. prj.uuid .. '\" PhonePublisherId=\"00000000-0000-0000-0000-000000000000\"/>')\nend\n_p(1,'<Properties>')\n_p(2,'<DisplayName>' .. prj.name .. '</DisplayName>')\n_p(2,'<PublisherDisplayName>Unknown</PublisherDisplayName>')\n_p(2,'<Logo>EmptyLogo.png</Logo>')\n_p(1,'</Properties>')\nif vstudio.storeapp == \"8.2\" then\n_p(1,'<Dependencies>')\n_p(2,'<TargetDeviceFamily Name=\"Windows.Universal\" MinVersion=\"10.0.10069.0\" MaxVersionTested=\"10.0.10069.0\" />')\n_p(1,'</Dependencies>')\nelse\n_p(1,'<Prerequisites>')\n_p(2,'<OSMinVersion>6.3.0</OSMinVersion>')\n_p(2,'<OSMaxVersionTested>6.3.0</OSMaxVersionTested>')\n_p(1,'</Prerequisites>')\nend\n_p(1,'<Resources>')\n_p(2,'<Resource Language=\"x-generate\"/>')\n_p(1,'</Resources>')\n_p(1,'<Applications>')\n_p(2,'<Applicatio"
+ "n Id=\"App\"')\n_p(3,'Executable=\"$targetnametoken$.exe\"')\n_p(3,'EntryPoint=\"App\">')\n_p(3,'<m3:VisualElements')\n_p(4,'DisplayName=\"Blah\"')\n_p(4,'Square150x150Logo=\"Assets\\\\Logo.png\"')\nif vstudio.toolset == \"v120_wp81\" or vstudio.storeapp == \"8.2\" then\n_p(4,'Square44x44Logo=\"Assets\\\\SmallLogo.png\"')\nelse\n_p(4,'Square30x30Logo=\"Assets\\\\SmallLogo.png\"')\nend\n_p(4,'Description=\"Blah\"')\n_p(4,'ForegroundText=\"light\"')\n_p(4,'BackgroundColor=\"transparent\">')\n_p(4,'<m3:SplashScreen Image=\"%s\" />', path.getname(vstudio.splashpath))\n_p(3,'</m3:VisualElements>')\n_p(2,'</Application>')\n_p(1,'</Applications>')\n_p('</Package>')\nend\n",
/* actions/vstudio/vs2010_vcxproj_filters.lua */
"local vc2010 = premake.vstudio.vc2010\nlocal project = premake.project\nfunction vc2010.filteridgroup(prj)\nlocal filters = { }\nlocal filterfound = false\nfor file in project.eachfile(prj) do\nlocal folders = string.explode(file.vpath, \"/\", true)\nlocal path = \"\"\nfor i = 1, #folders - 1 do\nif not filterfound then\nfilterfound = true\n_p(1,'<ItemGroup>')\nend\npath = path .. folders[i]\nif not filters[path] then\nfilters[path] = true\n_p(2, '<Filter Include=\"%s\">', path)\n_p(3, '<UniqueIdentifier>{%s}</UniqueIdentifier>', os.uuid(path))\n_p(2, '</Filter>')\nend\npath = path .. \"\\\\\"\nend\nend\nfor _, custombuildtask in ipairs(prj.custombuildtask or {}) do\nfor _, buildtask in ipairs(custombuildtask or {}) do\nlocal folders = string.explode(path.trimdots(path.getrelative(prj.location,buildtask[1])), \"/\", true)\nlocal path = \"\"\nfor i = 1, #folders - 1 do\nif not filterfound then\nfilterfound = true\n_p(1,'<ItemGroup>')\nend\npath = path .. folders[i]\nif not filters[path] then\nfilters[path] = tr"
@@ -296,15 +302,15 @@ const char* builtin_scripts[] = {
/* actions/vstudio/vs2012.lua */
"premake.vstudio.vc2012 = {}\nlocal vc2012 = premake.vstudio.vc2012\nlocal vstudio = premake.vstudio\nnewaction\n{\ntrigger = \"vs2012\",\nshortname = \"Visual Studio 2012\",\ndescription = \"Generate Microsoft Visual Studio 2012 project files\",\nos = \"windows\",\nvalid_kinds = { \"ConsoleApp\", \"WindowedApp\", \"StaticLib\", \"SharedLib\" },\nvalid_languages = { \"C\", \"C++\", \"C#\"},\nvalid_tools = {\ncc = { \"msc\" },\ndotnet = { \"msnet\" },\n},\nonsolution = function(sln)\npremake.generate(sln, \"%%.sln\", vstudio.sln2005.generate)\nend,\nonproject = function(prj)\nif premake.isdotnetproject(prj) then\npremake.generate(prj, \"%%.csproj\", vstudio.cs2005.generate)\npremake.generate(prj, \"%%.csproj.user\", vstudio.cs2005.generate_user)\nelse\npremake.generate(prj, \"%%.vcxproj\", premake.vs2010_vcxproj)\npremake.generate(prj, \"%%.vcxproj.user\", premake.vs2010_vcxproj_user)\npremake.generate(prj, \"%%.vcxproj.filters\", vstudio.vc2010.generate_filters)\nend"
- "\nend,\noncleansolution = premake.vstudio.cleansolution,\noncleanproject = premake.vstudio.cleanproject,\noncleantarget = premake.vstudio.cleantarget,\nvstudio = {\nsolutionVersion = \"12\",\ntargetFramework = \"4.5\",\ntoolsVersion = \"4.0\",\n}\n}\n",
+ "\nend,\noncleansolution = premake.vstudio.cleansolution,\noncleanproject = premake.vstudio.cleanproject,\noncleantarget = premake.vstudio.cleantarget,\nvstudio = {\nsolutionVersion = \"12\",\ntargetFramework = \"4.5\",\ntoolsVersion = \"4.0\",\nsupports64bitEditContinue = false,\n}\n}\n",
/* actions/vstudio/vs2013.lua */
"premake.vstudio.vc2013 = {}\nlocal vc2013 = premake.vstudio.vc2013\nlocal vstudio = premake.vstudio\nnewaction\n{\ntrigger = \"vs2013\",\nshortname = \"Visual Studio 2013\",\ndescription = \"Generate Microsoft Visual Studio 2013 project files\",\nos = \"windows\",\nvalid_kinds = { \"ConsoleApp\", \"WindowedApp\", \"StaticLib\", \"SharedLib\" },\nvalid_languages = { \"C\", \"C++\", \"C#\"},\nvalid_tools = {\ncc = { \"msc\" },\ndotnet = { \"msnet\" },\n},\nonsolution = function(sln)\npremake.generate(sln, \"%%.sln\", vstudio.sln2005.generate)\nend,\nonproject = function(prj)\nif premake.isdotnetproject(prj) then\npremake.generate(prj, \"%%.csproj\", vstudio.cs2005.generate)\npremake.generate(prj, \"%%.csproj.user\", vstudio.cs2005.generate_user)\nelse\npremake.vstudio.needAppxManifest = false\npremake.generate(prj, \"%%.vcxproj\", premake.vs2010_vcxproj)\npremake.generate(prj, \"%%.vcxproj.user\", premake.vs2010_vcxproj_user)\npremake.generate(prj, \"%%.vcxproj.filter"
- "s\", vstudio.vc2010.generate_filters)\nif premake.vstudio.needAppxManifest then\npremake.generate(prj, \"%%.appxmanifest\", premake.vs2010_appxmanifest)\nend\nend\nend,\noncleansolution = premake.vstudio.cleansolution,\noncleanproject = premake.vstudio.cleanproject,\noncleantarget = premake.vstudio.cleantarget,\nvstudio = {\nsolutionVersion = \"12\",\ntargetFramework = \"4.5\",\ntoolsVersion = \"12.0\",\n}\n}\n",
+ "s\", vstudio.vc2010.generate_filters)\nif premake.vstudio.needAppxManifest then\npremake.generate(prj, \"%%.appxmanifest\", premake.vs2010_appxmanifest)\nend\nend\nend,\noncleansolution = premake.vstudio.cleansolution,\noncleanproject = premake.vstudio.cleanproject,\noncleantarget = premake.vstudio.cleantarget,\nvstudio = {\nsolutionVersion = \"12\",\ntargetFramework = \"4.5\",\ntoolsVersion = \"12.0\",\nsupports64bitEditContinue = false,\n}\n}\n",
/* actions/vstudio/vs2015.lua */
"premake.vstudio.vc2015 = {}\nlocal vc2015 = premake.vstudio.vc2015\nlocal vstudio = premake.vstudio\nnewaction\n{\ntrigger = \"vs2015\",\nshortname = \"Visual Studio 2015\",\ndescription = \"Generate Microsoft Visual Studio 2015 project files\",\nos = \"windows\",\nvalid_kinds = { \"ConsoleApp\", \"WindowedApp\", \"StaticLib\", \"SharedLib\" },\nvalid_languages = { \"C\", \"C++\", \"C#\" },\nvalid_tools = {\ncc = { \"msc\" },\ndotnet = { \"msnet\" },\n},\nonsolution = function(sln)\npremake.generate(sln, \"%%.sln\", vstudio.sln2005.generate)\nend,\nonproject = function(prj)\nif premake.isdotnetproject(prj) then\npremake.generate(prj, \"%%.csproj\", vstudio.cs2005.generate)\npremake.generate(prj, \"%%.csproj.user\", vstudio.cs2005.generate_user)\nelse\npremake.vstudio.needAppxManifest = false\npremake.generate(prj, \"%%.vcxproj\", premake.vs2010_vcxproj)\npremake.generate(prj, \"%%.vcxproj.user\", premake.vs2010_vcxproj_user)\npremake.generate(prj, \"%%.vcxproj.filte"
- "rs\", vstudio.vc2010.generate_filters)\nif premake.vstudio.needAppxManifest then\npremake.generate(prj, \"%%.appxmanifest\", premake.vs2010_appxmanifest)\nend\nend\nend,\noncleansolution = premake.vstudio.cleansolution,\noncleanproject = premake.vstudio.cleanproject,\noncleantarget = premake.vstudio.cleantarget,\nvstudio = {\nsolutionVersion = \"14\",\ntargetFramework = \"4.5\",\ntoolsVersion = \"14.0\",\nwindowsTargetPlatformVersion = \"8.1\",\n}\n}\n",
+ "rs\", vstudio.vc2010.generate_filters)\nif premake.vstudio.needAppxManifest then\npremake.generate(prj, \"%%.appxmanifest\", premake.vs2010_appxmanifest)\nend\nend\nend,\noncleansolution = premake.vstudio.cleansolution,\noncleanproject = premake.vstudio.cleanproject,\noncleantarget = premake.vstudio.cleantarget,\nvstudio = {\nsolutionVersion = \"12\",\ntargetFramework = \"4.5\",\ntoolsVersion = \"14.0\",\nwindowsTargetPlatformVersion = \"8.1\",\nsupports64bitEditContinue = true,\n}\n}\n",
/* actions/xcode/_xcode.lua */
"premake.xcode = { }\npremake.xcode.toolset = \"macosx\"\nnewaction \n{\ntrigger = \"xcode3\",\nshortname = \"Xcode 3\",\ndescription = \"Generate Apple Xcode 3 project files (experimental)\",\nos = \"macosx\",\nvalid_kinds = { \"ConsoleApp\", \"WindowedApp\", \"SharedLib\", \"StaticLib\" },\nvalid_languages = { \"C\", \"C++\" },\nvalid_tools = {\ncc = { \"gcc\" },\n},\nvalid_platforms = { \nNative = \"Native\", \nx32 = \"Native 32-bit\", \nx64 = \"Native 64-bit\", \nUniversal32 = \"32-bit Universal\", \nUniversal64 = \"64-bit Universal\", \nUniversal = \"Universal\",\n},\ndefault_platform = \"Universal\",\nonsolution = function(sln)\npremake.xcode.preparesolution(sln)\nend,\nonproject = function(prj)\npremake.generate(prj, \"%%.xcodeproj/project.pbxproj\", premake.xcode.project)\nend,\noncleanproject = function(prj)\npremake.clean.directory(prj, \"%%.xcodeproj\")\nend,\noncheckproject = function(prj)\nlocal last\nfor cfg in premake.eachconfig(prj) do\nif last and last"
diff --git a/3rdparty/genie/src/tools/gcc.lua b/3rdparty/genie/src/tools/gcc.lua
index 7e54e492347..46afa976ac8 100644
--- a/3rdparty/genie/src/tools/gcc.lua
+++ b/3rdparty/genie/src/tools/gcc.lua
@@ -52,33 +52,36 @@
premake.gcc.platforms =
{
Native = {
- cppflags = "-MMD",
+ cppflags = "-MMD -MP",
},
x32 = {
- cppflags = "-MMD",
+ cppflags = "-MMD -MP",
flags = "-m32",
},
x64 = {
- cppflags = "-MMD",
+ cppflags = "-MMD -MP",
flags = "-m64",
},
Universal = {
- cppflags = "",
+ ar = "libtool",
+ cppflags = "-MMD -MP",
flags = "-arch i386 -arch x86_64 -arch ppc -arch ppc64",
},
Universal32 = {
- cppflags = "",
+ ar = "libtool",
+ cppflags = "-MMD -MP",
flags = "-arch i386 -arch ppc",
},
Universal64 = {
- cppflags = "",
+ ar = "libtool",
+ cppflags = "-MMD -MP",
flags = "-arch x86_64 -arch ppc64",
},
PS3 = {
cc = "ppu-lv2-g++",
cxx = "ppu-lv2-g++",
ar = "ppu-lv2-ar",
- cppflags = "-MMD",
+ cppflags = "-MMD -MP",
},
WiiDev = {
cppflags = "-MMD -MP -I$(LIBOGC_INC) $(MACHDEP)",
@@ -213,6 +216,47 @@
--
+-- Get flags for passing to AR before the target is appended to the commandline
+-- prj: project
+-- cfg: configuration
+-- ndx: true if the final step of a split archive
+--
+
+ function premake.gcc.getarchiveflags(prj, cfg, ndx)
+ local result = {}
+ if cfg.platform:startswith("Universal") then
+ if prj.options.ArchiveSplit then
+ error("gcc tool 'Universal*' platforms do not support split archives")
+ end
+ table.insert(result, '-o')
+ else
+ if (not prj.options.ArchiveSplit) then
+ if premake.gcc.llvm then
+ table.insert(result, 'rcs')
+ else
+ table.insert(result, '-rcs')
+ end
+ else
+ if premake.gcc.llvm then
+ if (not ndx) then
+ table.insert(result, 'qc')
+ else
+ table.insert(result, 'cs')
+ end
+ else
+ if (not ndx) then
+ table.insert(result, '-qc')
+ else
+ table.insert(result, '-cs')
+ end
+ end
+ end
+ end
+ return result
+ end
+
+
+--
-- Decorate defines for the GCC command line.
--
diff --git a/3rdparty/genie/src/tools/ghs.lua b/3rdparty/genie/src/tools/ghs.lua
new file mode 100644
index 00000000000..9f31fd4b129
--- /dev/null
+++ b/3rdparty/genie/src/tools/ghs.lua
@@ -0,0 +1,191 @@
+--
+-- ghs.lua
+-- Provides Green Hills Software-specific configuration strings.
+--
+
+ premake.ghs = { }
+ premake.ghs.namestyle = "PS3"
+
+
+--
+-- Set default tools
+--
+
+ premake.ghs.cc = "ccppc"
+ premake.ghs.cxx = "cxppc"
+ premake.ghs.ar = "cxppc"
+
+
+--
+-- Translation of Premake flags into GHS flags
+--
+
+ local cflags =
+ {
+ FatalWarnings = "--quit_after_warnings",
+ Optimize = "-Ogeneral",
+ OptimizeSize = "-Osize",
+ OptimizeSpeed = "-Ospeed",
+ Symbols = "-g",
+ }
+
+ local cxxflags =
+ {
+ NoExceptions = "--no_exceptions",
+ NoRTTI = "--no_rtti",
+ UnsignedChar = "--unsigned_chars",
+ }
+
+
+--
+-- Map platforms to flags
+--
+
+ premake.ghs.platforms =
+ {
+ Native = {
+ cppflags = "-MMD",
+ },
+ PowerPC = {
+ cc = "ccppc",
+ cxx = "cxppc",
+ ar = "cxppc",
+ cppflags = "-MMD",
+ arflags = "-archive -o",
+ },
+ ARM = {
+ cc = "ccarm",
+ cxx = "cxarm",
+ ar = "cxarm",
+ cppflags = "-MMD",
+ arflags = "-archive -o",
+ }
+ }
+
+ local platforms = premake.ghs.platforms
+
+
+--
+-- Returns a list of compiler flags, based on the supplied configuration.
+--
+
+ function premake.ghs.getcppflags(cfg)
+ local flags = { }
+ table.insert(flags, platforms[cfg.platform].cppflags)
+ return flags
+ end
+
+
+ function premake.ghs.getcflags(cfg)
+ local result = table.translate(cfg.flags, cflags)
+ table.insert(result, platforms[cfg.platform].flags)
+ return result
+ end
+
+
+ function premake.ghs.getcxxflags(cfg)
+ local result = table.translate(cfg.flags, cxxflags)
+ return result
+ end
+
+
+--
+-- Returns a list of linker flags, based on the supplied configuration.
+--
+
+ function premake.ghs.getldflags(cfg)
+ local result = { }
+
+ local platform = platforms[cfg.platform]
+ table.insert(result, platform.flags)
+ table.insert(result, platform.ldflags)
+
+ return result
+ end
+
+
+--
+-- Return a list of library search paths. Technically part of LDFLAGS but need to
+-- be separated because of the way Visual Studio calls GCC for the PS3. See bug
+-- #1729227 for background on why library paths must be split.
+--
+
+ function premake.ghs.getlibdirflags(cfg)
+ local result = { }
+ for _, value in ipairs(premake.getlinks(cfg, "all", "directory")) do
+ table.insert(result, '-L' .. _MAKE.esc(value))
+ end
+ return result
+ end
+
+
+
+--
+-- This is poorly named: returns a list of linker flags for external
+-- (i.e. system, or non-sibling) libraries. See bug #1729227 for
+-- background on why the path must be split.
+--
+
+ function premake.ghs.getlinkflags(cfg)
+ local result = {}
+ for _, value in ipairs(premake.getlinks(cfg, "system", "name")) do
+ table.insert(result, '-lnk=' .. _MAKE.esc(value))
+ end
+ return result
+ end
+
+--
+-- Get flags for passing to AR before the target is appended to the commandline
+-- prj: project
+-- cfg: configuration
+-- ndx: true if the final step of a split archive
+--
+
+ function premake.ghs.getarchiveflags(prj, cfg, ndx)
+ if prj.options.ArchiveSplit then
+ error("ghs tool does not support split archives")
+ end
+
+ local result = {}
+ local platform = platforms[cfg.platform]
+ table.insert(result, platform.arflags)
+ return result
+ end
+
+
+
+--
+-- Decorate defines for the GHS command line.
+--
+
+ function premake.ghs.getdefines(defines)
+ local result = { }
+ for _,def in ipairs(defines) do
+ table.insert(result, '-D' .. def)
+ end
+ return result
+ end
+
+
+
+--
+-- Decorate include file search paths for the GCC command line.
+--
+
+ function premake.ghs.getincludedirs(includedirs)
+ local result = { }
+ for _,dir in ipairs(includedirs) do
+ table.insert(result, "-I" .. _MAKE.esc(dir))
+ end
+ return result
+ end
+
+
+--
+-- Return platform specific project and configuration level
+-- makesettings blocks.
+--
+
+ function premake.ghs.getcfgsettings(cfg)
+ return platforms[cfg.platform].cfgsettings
+ end
diff --git a/3rdparty/jsoncpp/.clang-format b/3rdparty/jsoncpp/.clang-format
deleted file mode 100644
index dd51247d50a..00000000000
--- a/3rdparty/jsoncpp/.clang-format
+++ /dev/null
@@ -1,47 +0,0 @@
----
-# BasedOnStyle: LLVM
-AccessModifierOffset: -2
-ConstructorInitializerIndentWidth: 4
-AlignEscapedNewlinesLeft: false
-AlignTrailingComments: true
-AllowAllParametersOfDeclarationOnNextLine: true
-AllowShortIfStatementsOnASingleLine: false
-AllowShortLoopsOnASingleLine: false
-AlwaysBreakTemplateDeclarations: false
-AlwaysBreakBeforeMultilineStrings: false
-BreakBeforeBinaryOperators: false
-BreakBeforeTernaryOperators: true
-BreakConstructorInitializersBeforeComma: false
-BinPackParameters: false
-ColumnLimit: 80
-ConstructorInitializerAllOnOneLineOrOnePerLine: false
-DerivePointerBinding: false
-ExperimentalAutoDetectBinPacking: false
-IndentCaseLabels: false
-MaxEmptyLinesToKeep: 1
-NamespaceIndentation: None
-ObjCSpaceBeforeProtocolList: true
-PenaltyBreakBeforeFirstCallParameter: 19
-PenaltyBreakComment: 60
-PenaltyBreakString: 1000
-PenaltyBreakFirstLessLess: 120
-PenaltyExcessCharacter: 1000000
-PenaltyReturnTypeOnItsOwnLine: 60
-PointerBindsToType: true
-SpacesBeforeTrailingComments: 1
-Cpp11BracedListStyle: false
-Standard: Cpp03
-IndentWidth: 2
-TabWidth: 8
-UseTab: Never
-BreakBeforeBraces: Attach
-IndentFunctionDeclarationAfterType: false
-SpacesInParentheses: false
-SpacesInAngles: false
-SpaceInEmptyParentheses: false
-SpacesInCStyleCastParentheses: false
-SpaceAfterControlStatementKeyword: true
-SpaceBeforeAssignmentOperators: true
-ContinuationIndentWidth: 4
-...
-
diff --git a/3rdparty/jsoncpp/.gitignore b/3rdparty/jsoncpp/.gitignore
deleted file mode 100644
index ef226a8875a..00000000000
--- a/3rdparty/jsoncpp/.gitignore
+++ /dev/null
@@ -1,36 +0,0 @@
-/build/
-*.pyc
-*.swp
-*.actual
-*.actual-rewrite
-*.process-output
-*.rewrite
-/bin/
-/buildscons/
-/libs/
-/doc/doxyfile
-/dist/
-#/version
-#/include/json/version.h
-
-# MSVC project files:
-*.sln
-*.vcxproj
-*.filters
-*.user
-*.sdf
-*.opensdf
-*.suo
-
-# MSVC build files:
-*.lib
-*.obj
-*.tlog/
-*.pdb
-
-# CMake-generated files:
-CMakeFiles/
-CTestTestFile.cmake
-cmake_install.cmake
-pkg-config/jsoncpp.pc
-jsoncpp_lib_static.dir/
diff --git a/3rdparty/jsoncpp/.travis.yml b/3rdparty/jsoncpp/.travis.yml
deleted file mode 100644
index 17e52dcf89b..00000000000
--- a/3rdparty/jsoncpp/.travis.yml
+++ /dev/null
@@ -1,25 +0,0 @@
-# Build matrix / environment variable are explained on:
-# http://about.travis-ci.org/docs/user/build-configuration/
-# This file can be validated on:
-# http://lint.travis-ci.org/
-
-#before_install: sudo apt-get install -y cmake
-# cmake is pre-installed in Travis for both linux and osx
-
-before_install:
- - sudo apt-get update -qq
- - sudo apt-get install -qq valgrind
-os:
- - linux
-language: cpp
-compiler:
- - gcc
- - clang
-script: ./travis.sh
-env:
- matrix:
- - SHARED_LIB=ON STATIC_LIB=ON CMAKE_PKG=ON BUILD_TYPE=release VERBOSE_MAKE=false
- - SHARED_LIB=OFF STATIC_LIB=ON CMAKE_PKG=OFF BUILD_TYPE=debug VERBOSE_MAKE=true VERBOSE
-notifications:
- email:
- - aaronjjacobs@gmail.com
diff --git a/3rdparty/jsoncpp/AUTHORS b/3rdparty/jsoncpp/AUTHORS
deleted file mode 100644
index c0fbbeec111..00000000000
--- a/3rdparty/jsoncpp/AUTHORS
+++ /dev/null
@@ -1 +0,0 @@
-Baptiste Lepilleur <blep@users.sourceforge.net>
diff --git a/3rdparty/jsoncpp/CMakeLists.txt b/3rdparty/jsoncpp/CMakeLists.txt
deleted file mode 100644
index 90eb14e30d0..00000000000
--- a/3rdparty/jsoncpp/CMakeLists.txt
+++ /dev/null
@@ -1,129 +0,0 @@
-# vim: et ts=4 sts=4 sw=4 tw=0
-
-CMAKE_MINIMUM_REQUIRED(VERSION 2.8.5)
-PROJECT(jsoncpp)
-ENABLE_TESTING()
-
-OPTION(JSONCPP_WITH_TESTS "Compile and (for jsoncpp_check) run JsonCpp test executables" ON)
-OPTION(JSONCPP_WITH_POST_BUILD_UNITTEST "Automatically run unit-tests as a post build step" ON)
-OPTION(JSONCPP_WITH_WARNING_AS_ERROR "Force compilation to fail if a warning occurs" OFF)
-OPTION(JSONCPP_WITH_PKGCONFIG_SUPPORT "Generate and install .pc files" ON)
-OPTION(JSONCPP_WITH_CMAKE_PACKAGE "Generate and install cmake package files" OFF)
-OPTION(BUILD_SHARED_LIBS "Build jsoncpp_lib as a shared library." OFF)
-OPTION(BUILD_STATIC_LIBS "Build jsoncpp_lib static library." ON)
-
-# Ensures that CMAKE_BUILD_TYPE is visible in cmake-gui on Unix
-IF(NOT WIN32)
- IF(NOT CMAKE_BUILD_TYPE)
- SET(CMAKE_BUILD_TYPE Release CACHE STRING
- "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel Coverage."
- FORCE)
- ENDIF(NOT CMAKE_BUILD_TYPE)
-ENDIF(NOT WIN32)
-
-SET(DEBUG_LIBNAME_SUFFIX "" CACHE STRING "Optional suffix to append to the library name for a debug build")
-SET(LIB_SUFFIX "" CACHE STRING "Optional arch-dependent suffix for the library installation directory")
-
-SET(RUNTIME_INSTALL_DIR bin
- CACHE PATH "Install dir for executables and dlls")
-SET(ARCHIVE_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}
- CACHE PATH "Install dir for static libraries")
-SET(LIBRARY_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}
- CACHE PATH "Install dir for shared libraries")
-SET(INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/include
- CACHE PATH "Install dir for headers")
-SET(PACKAGE_INSTALL_DIR lib${LIB_SUFFIX}/cmake
- CACHE PATH "Install dir for cmake package config files")
-MARK_AS_ADVANCED( RUNTIME_INSTALL_DIR ARCHIVE_INSTALL_DIR INCLUDE_INSTALL_DIR PACKAGE_INSTALL_DIR )
-
-# Set variable named ${VAR_NAME} to value ${VALUE}
-FUNCTION(set_using_dynamic_name VAR_NAME VALUE)
- SET( "${VAR_NAME}" "${VALUE}" PARENT_SCOPE)
-ENDFUNCTION(set_using_dynamic_name)
-
-# Extract major, minor, patch from version text
-# Parse a version string "X.Y.Z" and outputs
-# version parts in ${OUPUT_PREFIX}_MAJOR, _MINOR, _PATCH.
-# If parse succeeds then ${OUPUT_PREFIX}_FOUND is TRUE.
-MACRO(jsoncpp_parse_version VERSION_TEXT OUPUT_PREFIX)
- SET(VERSION_REGEX "[0-9]+\\.[0-9]+\\.[0-9]+(-[a-zA-Z0-9_]+)?")
- IF( ${VERSION_TEXT} MATCHES ${VERSION_REGEX} )
- STRING(REGEX MATCHALL "[0-9]+|-([A-Za-z0-9_]+)" VERSION_PARTS ${VERSION_TEXT})
- LIST(GET VERSION_PARTS 0 ${OUPUT_PREFIX}_MAJOR)
- LIST(GET VERSION_PARTS 1 ${OUPUT_PREFIX}_MINOR)
- LIST(GET VERSION_PARTS 2 ${OUPUT_PREFIX}_PATCH)
- set_using_dynamic_name( "${OUPUT_PREFIX}_FOUND" TRUE )
- ELSE( ${VERSION_TEXT} MATCHES ${VERSION_REGEX} )
- set_using_dynamic_name( "${OUPUT_PREFIX}_FOUND" FALSE )
- ENDIF( ${VERSION_TEXT} MATCHES ${VERSION_REGEX} )
-ENDMACRO(jsoncpp_parse_version)
-
-# Read out version from "version" file
-#FILE(STRINGS "version" JSONCPP_VERSION)
-#SET( JSONCPP_VERSION_MAJOR X )
-#SET( JSONCPP_VERSION_MINOR Y )
-#SET( JSONCPP_VERSION_PATCH Z )
-SET( JSONCPP_VERSION 1.6.2 )
-jsoncpp_parse_version( ${JSONCPP_VERSION} JSONCPP_VERSION )
-#IF(NOT JSONCPP_VERSION_FOUND)
-# MESSAGE(FATAL_ERROR "Failed to parse version string properly. Expect X.Y.Z")
-#ENDIF(NOT JSONCPP_VERSION_FOUND)
-
-MESSAGE(STATUS "JsonCpp Version: ${JSONCPP_VERSION_MAJOR}.${JSONCPP_VERSION_MINOR}.${JSONCPP_VERSION_PATCH}")
-# File version.h is only regenerated on CMake configure step
-CONFIGURE_FILE( "${PROJECT_SOURCE_DIR}/src/lib_json/version.h.in"
- "${PROJECT_SOURCE_DIR}/include/json/version.h"
- NEWLINE_STYLE UNIX )
-CONFIGURE_FILE( "${PROJECT_SOURCE_DIR}/version.in"
- "${PROJECT_SOURCE_DIR}/version"
- NEWLINE_STYLE UNIX )
-
-macro(UseCompilationWarningAsError)
- if ( MSVC )
- # Only enabled in debug because some old versions of VS STL generate
- # warnings when compiled in release configuration.
- set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /WX ")
- endif( MSVC )
-endmacro()
-
-# Include our configuration header
-INCLUDE_DIRECTORIES( ${jsoncpp_SOURCE_DIR}/include )
-
-if ( MSVC )
- # Only enabled in debug because some old versions of VS STL generate
- # unreachable code warning when compiled in release configuration.
- set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /W4 ")
-endif( MSVC )
-
-if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
- # using regular Clang or AppleClang
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Wshorten-64-to-32")
-elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
- # using GCC
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x -Wall -Wextra -pedantic")
-endif()
-
-IF(JSONCPP_WITH_WARNING_AS_ERROR)
- UseCompilationWarningAsError()
-ENDIF(JSONCPP_WITH_WARNING_AS_ERROR)
-
-IF(JSONCPP_WITH_PKGCONFIG_SUPPORT)
- CONFIGURE_FILE(
- "pkg-config/jsoncpp.pc.in"
- "pkg-config/jsoncpp.pc"
- @ONLY)
- INSTALL(FILES "${CMAKE_BINARY_DIR}/pkg-config/jsoncpp.pc"
- DESTINATION "${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}/pkgconfig")
-ENDIF(JSONCPP_WITH_PKGCONFIG_SUPPORT)
-
-IF(JSONCPP_WITH_CMAKE_PACKAGE)
- INSTALL(EXPORT jsoncpp
- DESTINATION ${PACKAGE_INSTALL_DIR}/jsoncpp
- FILE jsoncppConfig.cmake)
-ENDIF(JSONCPP_WITH_CMAKE_PACKAGE)
-
-# Build the different applications
-ADD_SUBDIRECTORY( src )
-
-#install the includes
-ADD_SUBDIRECTORY( include )
diff --git a/3rdparty/jsoncpp/LICENSE b/3rdparty/jsoncpp/LICENSE
deleted file mode 100644
index ca2bfe1a03e..00000000000
--- a/3rdparty/jsoncpp/LICENSE
+++ /dev/null
@@ -1,55 +0,0 @@
-The JsonCpp library's source code, including accompanying documentation,
-tests and demonstration applications, are licensed under the following
-conditions...
-
-The author (Baptiste Lepilleur) explicitly disclaims copyright in all
-jurisdictions which recognize such a disclaimer. In such jurisdictions,
-this software is released into the Public Domain.
-
-In jurisdictions which do not recognize Public Domain property (e.g. Germany as of
-2010), this software is Copyright (c) 2007-2010 by Baptiste Lepilleur, and is
-released under the terms of the MIT License (see below).
-
-In jurisdictions which recognize Public Domain property, the user of this
-software may choose to accept it either as 1) Public Domain, 2) under the
-conditions of the MIT License (see below), or 3) under the terms of dual
-Public Domain/MIT License conditions described here, as they choose.
-
-The MIT License is about as close to Public Domain as a license can get, and is
-described in clear, concise terms at:
-
- http://en.wikipedia.org/wiki/MIT_License
-
-The full text of the MIT License follows:
-
-========================================================================
-Copyright (c) 2007-2010 Baptiste Lepilleur
-
-Permission is hereby granted, free of charge, to any person
-obtaining a copy of this software and associated documentation
-files (the "Software"), to deal in the Software without
-restriction, including without limitation the rights to use, copy,
-modify, merge, publish, distribute, sublicense, and/or sell copies
-of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
-BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
-ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-========================================================================
-(END LICENSE TEXT)
-
-The MIT license is compatible with both the GPL and commercial
-software, affording one all of the rights of Public Domain with the
-minor nuisance of being required to keep the above copyright notice
-and license text in the source code. Note also that by accepting the
-Public Domain "license" you can re-license your copy using whatever
-license you like.
diff --git a/3rdparty/jsoncpp/NEWS.txt b/3rdparty/jsoncpp/NEWS.txt
deleted file mode 100644
index 5733fcd5ef4..00000000000
--- a/3rdparty/jsoncpp/NEWS.txt
+++ /dev/null
@@ -1,175 +0,0 @@
-New in SVN
-----------
-
- * Updated the type system's behavior, in order to better support backwards
- compatibility with code that was written before 64-bit integer support was
- introduced. Here's how it works now:
-
- * isInt, isInt64, isUInt, and isUInt64 return true if and only if the
- value can be exactly represented as that type. In particular, a value
- constructed with a double like 17.0 will now return true for all of
- these methods.
-
- * isDouble and isFloat now return true for all numeric values, since all
- numeric values can be converted to a double or float without
- truncation. Note however that the conversion may not be exact -- for
- example, doubles cannot exactly represent all integers above 2^53 + 1.
-
- * isBool, isNull, isString, isArray, and isObject now return true if and
- only if the value is of that type.
-
- * isConvertibleTo(fooValue) indicates that it is safe to call asFoo.
- (For each type foo, isFoo always implies isConvertibleTo(fooValue).)
- asFoo returns an approximate or exact representation as appropriate.
- For example, a double value may be truncated when asInt is called.
-
- * For backwards compatibility with old code, isConvertibleTo(intValue)
- may return false even if type() == intValue. This is because the value
- may have been constructed with a 64-bit integer larger than maxInt,
- and calling asInt() would cause an exception. If you're writing new
- code, use isInt64 to find out whether the value is exactly
- representable using an Int64, or asDouble() combined with minInt64 and
- maxInt64 to figure out whether it is approximately representable.
-
-* Value
- - Patch #10: BOOST_FOREACH compatibility. Made Json::iterator more
- standard compliant, added missing iterator_category and value_type
- typedefs (contribued by Robert A. Iannucci).
-
-* Compilation
-
- - New CMake based build system. Based in part on contribution from
- Igor Okulist and Damien Buhl (Patch #14).
-
- - New header json/version.h now contains version number macros
- (JSONCPP_VERSION_MAJOR, JSONCPP_VERSION_MINOR, JSONCPP_VERSION_PATCH
- and JSONCPP_VERSION_HEXA).
-
- - Patch #11: added missing JSON_API on some classes causing link issues
- when building as a dynamic library on Windows
- (contributed by Francis Bolduc).
-
- - Visual Studio DLL: suppressed warning "C4251: <data member>: <type>
- needs to have dll-interface to be used by..." via pragma push/pop
- in json-cpp headers.
-
- - Added Travis CI intregration: https://travis-ci.org/blep/jsoncpp-mirror
-
-* Bug fixes
- - Patch #15: Copy constructor does not initialize allocated_ for stringValue
- (contributed by rmongia).
-
- - Patch #16: Missing field copy in Json::Value::iterator causing infinite
- loop when using experimental internal map (#define JSON_VALUE_USE_INTERNAL_MAP)
- (contributed by Ming-Lin Kao).
-
-
- New in JsonCpp 0.6.0:
- ---------------------
-
-* Compilation
-
- - LD_LIBRARY_PATH and LIBRARY_PATH environment variables are now
- propagated to the build environment as this is required for some
- compiler installation.
-
- - Added support for Microsoft Visual Studio 2008 (bug #2930462):
- The platform "msvc90" has been added.
-
- Notes: you need to setup the environment by running vcvars32.bat
- (e.g. MSVC 2008 command prompt in start menu) before running scons.
-
- - Added support for amalgamated source and header generation (a la sqlite).
- Refer to README.md section "Generating amalgamated source and header"
- for detail.
-
-* Value
-
- - Removed experimental ValueAllocator, it caused static
- initialization/destruction order issues (bug #2934500).
- The DefaultValueAllocator has been inlined in code.
-
- - Added support for 64 bits integer:
-
- Types Json::Int64 and Json::UInt64 have been added. They are aliased
- to 64 bits integers on system that support them (based on __int64 on
- Microsoft Visual Studio platform, and long long on other platforms).
-
- Types Json::LargestInt and Json::LargestUInt have been added. They are
- aliased to the largest integer type supported:
- either Json::Int/Json::UInt or Json::Int64/Json::UInt64 respectively.
-
- Json::Value::asInt() and Json::Value::asUInt() still returns plain
- "int" based types, but asserts if an attempt is made to retrieve
- a 64 bits value that can not represented as the return type.
-
- Json::Value::asInt64() and Json::Value::asUInt64() have been added
- to obtain the 64 bits integer value.
-
- Json::Value::asLargestInt() and Json::Value::asLargestUInt() returns
- the integer as a LargestInt/LargestUInt respectively. Those functions
- functions are typically used when implementing writer.
-
- The reader attempts to read number as 64 bits integer, and fall back
- to reading a double if the number is not in the range of 64 bits
- integer.
-
- Warning: Json::Value::asInt() and Json::Value::asUInt() now returns
- long long. This changes break code that was passing the return value
- to *printf() function.
-
- Support for 64 bits integer can be disabled by defining the macro
- JSON_NO_INT64 (uncomment it in json/config.h for example), though
- it should have no impact on existing usage.
-
- - The type Json::ArrayIndex is used for indexes of a JSON value array. It
- is an unsigned int (typically 32 bits).
-
- - Array index can be passed as int to operator[], allowing use of literal:
- Json::Value array;
- array.append( 1234 );
- int value = array[0].asInt(); // did not compile previously
-
- - Added float Json::Value::asFloat() to obtain a floating point value as a
- float (avoid lost of precision warning caused by used of asDouble()
- to initialize a float).
-
-* Reader
-
- - Renamed Reader::getFormatedErrorMessages() to getFormattedErrorMessages.
- Bug #3023708 (Formatted has 2 't'). The old member function is deprecated
- but still present for backward compatibility.
-
-* Tests
-
- - Added test to ensure that the escape sequence "\/" is corrected handled
- by the parser.
-
-* Bug fixes
-
- - Bug #3139677: JSON [1 2 3] was incorrectly parsed as [1, 3]. Error is now
- correctly detected.
-
- - Bug #3139678: stack buffer overflow when parsing a double with a
- length of 32 characters.
-
- - Fixed Value::operator <= implementation (had the semantic of operator >=).
- Found when adding unit tests for comparison operators.
-
- - Value::compare() is now const and has an actual implementation with
- unit tests.
-
- - Bug #2407932: strpbrk() can fail for NULL pointer.
-
- - Bug #3306345: Fixed minor typo in Path::resolve().
-
- - Bug #3314841/#3306896: errors in amalgamate.py
-
- - Fixed some Coverity warnings and line-endings.
-
-* License
-
- - See file LICENSE for details. Basically JsonCpp is now licensed under
- MIT license, or public domain if desired and recognized in your jurisdiction.
- Thanks to Stephan G. Beal [http://wanderinghorse.net/home/stephan/]) who
- helped figuring out the solution to the public domain issue.
diff --git a/3rdparty/jsoncpp/README.md b/3rdparty/jsoncpp/README.md
deleted file mode 100644
index 93c8d1f593a..00000000000
--- a/3rdparty/jsoncpp/README.md
+++ /dev/null
@@ -1,214 +0,0 @@
-Introduction
-------------
-
-[JSON][json-org] is a lightweight data-interchange format. It can represent
-numbers, strings, ordered sequences of values, and collections of name/value
-pairs.
-
-[json-org]: http://json.org/
-
-[JsonCpp][] is a C++ library that allows manipulating JSON values, including
-serialization and deserialization to and from strings. It can also preserve
-existing comment in unserialization/serialization steps, making it a convenient
-format to store user input files.
-
-[JsonCpp]: http://open-source-parsers.github.io/jsoncpp-docs/doxygen/index.html
-
-## A note on backward-compatibility
-* `1.y.z` is built with C++11.
-* `0.y.z` can be used with older compilers.
-* Major versions maintain binary-compatibility.
-
-# Using JsonCpp in your project
------------------------------
-The recommended approach to integrating JsonCpp in your project is to include
-the [amalgamated source](#generating-amalgamated-source-and-header) (a single
-`.cpp` file and two `.h` files) in your project, and compile and build as you
-would any other source file. This ensures consistency of compilation flags and
-ABI compatibility, issues which arise when building shared or static
-libraries. See the next section for instructions.
-
-The `include/` should be added to your compiler include path. Jsoncpp headers
-should be included as follow:
-
- #include <json/json.h>
-
-If JsonCpp was built as a dynamic library on Windows, then your project needs to
-define the macro `JSON_DLL`.
-
-Generating amalgamated source and header
-----------------------------------------
-JsonCpp is provided with a script to generate a single header and a single
-source file to ease inclusion into an existing project. The amalgamated source
-can be generated at any time by running the following command from the
-top-directory (this requires Python 2.6):
-
- python amalgamate.py
-
-It is possible to specify header name. See the `-h` option for detail.
-
-By default, the following files are generated:
-* `dist/jsoncpp.cpp`: source file that needs to be added to your project.
-* `dist/json/json.h`: corresponding header file for use in your project. It is
- equivalent to including `json/json.h` in non-amalgamated source. This header
- only depends on standard headers.
-* `dist/json/json-forwards.h`: header that provides forward declaration of all
- JsonCpp types.
-
-The amalgamated sources are generated by concatenating JsonCpp source in the
-correct order and defining the macro `JSON_IS_AMALGAMATION` to prevent inclusion
-of other headers.
-
-# Contributing to JsonCpp
-
-Building and testing with CMake
--------------------------------
-[CMake][] is a C++ Makefiles/Solution generator. It is usually available on most
-Linux system as package. On Ubuntu:
-
- sudo apt-get install cmake
-
-[CMake]: http://www.cmake.org
-
-Note that Python is also required to run the JSON reader/writer tests. If
-missing, the build will skip running those tests.
-
-When running CMake, a few parameters are required:
-
-* a build directory where the makefiles/solution are generated. It is also used
- to store objects, libraries and executables files.
-* the generator to use: makefiles or Visual Studio solution? What version or
- Visual Studio, 32 or 64 bits solution?
-
-Steps for generating solution/makefiles using `cmake-gui`:
-
-* Make "source code" point to the source directory.
-* Make "where to build the binary" point to the directory to use for the build.
-* Click on the "Grouped" check box.
-* Review JsonCpp build options (tick `BUILD_SHARED_LIBS` to build as a
- dynamic library).
-* Click the configure button at the bottom, then the generate button.
-* The generated solution/makefiles can be found in the binary directory.
-
-Alternatively, from the command-line on Unix in the source directory:
-
- mkdir -p build/debug
- cd build/debug
- cmake -DCMAKE_BUILD_TYPE=debug -DBUILD_STATIC_LIBS=ON -DBUILD_SHARED_LIBS=OFF -DARCHIVE_INSTALL_DIR=. -G "Unix Makefiles" ../..
- make
-
-Running `cmake -h` will display the list of available generators (passed using
-the `-G` option).
-
-By default CMake hides compilation commands. This can be modified by specifying
-`-DCMAKE_VERBOSE_MAKEFILE=true` when generating makefiles.
-
-Building and testing with SCons
--------------------------------
-**Note:** The SCons-based build system is deprecated. Please use CMake; see the
-section above.
-
-JsonCpp can use [Scons][] as a build system. Note that SCons requires Python to
-be installed.
-
-[SCons]: http://www.scons.org/
-
-Invoke SCons as follows:
-
- scons platform=$PLATFORM [TARGET]
-
-where `$PLATFORM` may be one of:
-
-* `suncc`: Sun C++ (Solaris)
-* `vacpp`: Visual Age C++ (AIX)
-* `mingw`
-* `msvc6`: Microsoft Visual Studio 6 service pack 5-6
-* `msvc70`: Microsoft Visual Studio 2002
-* `msvc71`: Microsoft Visual Studio 2003
-* `msvc80`: Microsoft Visual Studio 2005
-* `msvc90`: Microsoft Visual Studio 2008
-* `linux-gcc`: Gnu C++ (linux, also reported to work for Mac OS X)
-
-If you are building with Microsoft Visual Studio 2008, you need to set up the
-environment by running `vcvars32.bat` (e.g. MSVC 2008 command prompt) before
-running SCons.
-
-## Running the tests manually
-You need to run tests manually only if you are troubleshooting an issue.
-
-In the instructions below, replace `path/to/jsontest` with the path of the
-`jsontest` executable that was compiled on your platform.
-
- cd test
- # This will run the Reader/Writer tests
- python runjsontests.py path/to/jsontest
-
- # This will run the Reader/Writer tests, using JSONChecker test suite
- # (http://www.json.org/JSON_checker/).
- # Notes: not all tests pass: JsonCpp is too lenient (for example,
- # it allows an integer to start with '0'). The goal is to improve
- # strict mode parsing to get all tests to pass.
- python runjsontests.py --with-json-checker path/to/jsontest
-
- # This will run the unit tests (mostly Value)
- python rununittests.py path/to/test_lib_json
-
- # You can run the tests using valgrind:
- python rununittests.py --valgrind path/to/test_lib_json
-
-## Running the tests using scons
-Note that tests can be run using SCons using the `check` target:
-
- scons platform=$PLATFORM check
-
-Building the documentation
---------------------------
-Run the Python script `doxybuild.py` from the top directory:
-
- python doxybuild.py --doxygen=$(which doxygen) --open --with-dot
-
-See `doxybuild.py --help` for options.
-
-Adding a reader/writer test
----------------------------
-To add a test, you need to create two files in test/data:
-
-* a `TESTNAME.json` file, that contains the input document in JSON format.
-* a `TESTNAME.expected` file, that contains a flatened representation of the
- input document.
-
-The `TESTNAME.expected` file format is as follows:
-
-* each line represents a JSON element of the element tree represented by the
- input document.
-* each line has two parts: the path to access the element separated from the
- element value by `=`. Array and object values are always empty (i.e.
- represented by either `[]` or `{}`).
-* element path: `.` represents the root element, and is used to separate object
- members. `[N]` is used to specify the value of an array element at index `N`.
-
-See the examples `test_complex_01.json` and `test_complex_01.expected` to better
-understand element paths.
-
-Understanding reader/writer test output
----------------------------------------
-When a test is run, output files are generated beside the input test files.
-Below is a short description of the content of each file:
-
-* `test_complex_01.json`: input JSON document.
-* `test_complex_01.expected`: flattened JSON element tree used to check if
- parsing was corrected.
-* `test_complex_01.actual`: flattened JSON element tree produced by `jsontest`
- from reading `test_complex_01.json`.
-* `test_complex_01.rewrite`: JSON document written by `jsontest` using the
- `Json::Value` parsed from `test_complex_01.json` and serialized using
- `Json::StyledWritter`.
-* `test_complex_01.actual-rewrite`: flattened JSON element tree produced by
- `jsontest` from reading `test_complex_01.rewrite`.
-* `test_complex_01.process-output`: `jsontest` output, typically useful for
- understanding parsing errors.
-
-License
--------
-See the `LICENSE` file for details. In summary, JsonCpp is licensed under the
-MIT license, or public domain if desired and recognized in your jurisdiction.
diff --git a/3rdparty/jsoncpp/SConstruct b/3rdparty/jsoncpp/SConstruct
deleted file mode 100644
index f3a73f773bf..00000000000
--- a/3rdparty/jsoncpp/SConstruct
+++ /dev/null
@@ -1,248 +0,0 @@
-"""
-Notes:
-- shared library support is buggy: it assumes that a static and dynamic library can be build from the same object files. This is not true on many platforms. For this reason it is only enabled on linux-gcc at the current time.
-
-To add a platform:
-- add its name in options allowed_values below
-- add tool initialization for this platform. Search for "if platform == 'suncc'" as an example.
-"""
-
-import os
-import os.path
-import sys
-
-JSONCPP_VERSION = open(File('#version').abspath,'rt').read().strip()
-DIST_DIR = '#dist'
-
-options = Variables()
-options.Add( EnumVariable('platform',
- 'Platform (compiler/stl) used to build the project',
- 'msvc71',
- allowed_values='suncc vacpp mingw msvc6 msvc7 msvc71 msvc80 msvc90 linux-gcc'.split(),
- ignorecase=2) )
-
-try:
- platform = ARGUMENTS['platform']
- if platform == 'linux-gcc':
- CXX = 'g++' # not quite right, but env is not yet available.
- import commands
- version = commands.getoutput('%s -dumpversion' %CXX)
- platform = 'linux-gcc-%s' %version
- print "Using platform '%s'" %platform
- LD_LIBRARY_PATH = os.environ.get('LD_LIBRARY_PATH', '')
- LD_LIBRARY_PATH = "%s:libs/%s" %(LD_LIBRARY_PATH, platform)
- os.environ['LD_LIBRARY_PATH'] = LD_LIBRARY_PATH
- print "LD_LIBRARY_PATH =", LD_LIBRARY_PATH
-except KeyError:
- print 'You must specify a "platform"'
- sys.exit(2)
-
-print "Building using PLATFORM =", platform
-
-rootbuild_dir = Dir('#buildscons')
-build_dir = os.path.join( '#buildscons', platform )
-bin_dir = os.path.join( '#bin', platform )
-lib_dir = os.path.join( '#libs', platform )
-sconsign_dir_path = Dir(build_dir).abspath
-sconsign_path = os.path.join( sconsign_dir_path, '.sconsign.dbm' )
-
-# Ensure build directory exist (SConsignFile fail otherwise!)
-if not os.path.exists( sconsign_dir_path ):
- os.makedirs( sconsign_dir_path )
-
-# Store all dependencies signature in a database
-SConsignFile( sconsign_path )
-
-def make_environ_vars():
- """Returns a dictionnary with environment variable to use when compiling."""
- # PATH is required to find the compiler
- # TEMP is required for at least mingw
- # LD_LIBRARY_PATH & co is required on some system for the compiler
- vars = {}
- for name in ('PATH', 'TEMP', 'TMP', 'LD_LIBRARY_PATH', 'LIBRARY_PATH'):
- if name in os.environ:
- vars[name] = os.environ[name]
- return vars
-
-
-env = Environment( ENV = make_environ_vars(),
- toolpath = ['scons-tools'],
- tools=[] ) #, tools=['default'] )
-
-if platform == 'suncc':
- env.Tool( 'sunc++' )
- env.Tool( 'sunlink' )
- env.Tool( 'sunar' )
- env.Append( CCFLAGS = ['-mt'] )
-elif platform == 'vacpp':
- env.Tool( 'default' )
- env.Tool( 'aixcc' )
- env['CXX'] = 'xlC_r' #scons does not pick-up the correct one !
- # using xlC_r ensure multi-threading is enabled:
- # http://publib.boulder.ibm.com/infocenter/pseries/index.jsp?topic=/com.ibm.vacpp7a.doc/compiler/ref/cuselect.htm
- env.Append( CCFLAGS = '-qrtti=all',
- LINKFLAGS='-bh:5' ) # -bh:5 remove duplicate symbol warning
-elif platform == 'msvc6':
- env['MSVS_VERSION']='6.0'
- for tool in ['msvc', 'msvs', 'mslink', 'masm', 'mslib']:
- env.Tool( tool )
- env['CXXFLAGS']='-GR -GX /nologo /MT'
-elif platform == 'msvc70':
- env['MSVS_VERSION']='7.0'
- for tool in ['msvc', 'msvs', 'mslink', 'masm', 'mslib']:
- env.Tool( tool )
- env['CXXFLAGS']='-GR -GX /nologo /MT'
-elif platform == 'msvc71':
- env['MSVS_VERSION']='7.1'
- for tool in ['msvc', 'msvs', 'mslink', 'masm', 'mslib']:
- env.Tool( tool )
- env['CXXFLAGS']='-GR -GX /nologo /MT'
-elif platform == 'msvc80':
- env['MSVS_VERSION']='8.0'
- for tool in ['msvc', 'msvs', 'mslink', 'masm', 'mslib']:
- env.Tool( tool )
- env['CXXFLAGS']='-GR -EHsc /nologo /MT'
-elif platform == 'msvc90':
- env['MSVS_VERSION']='9.0'
- # Scons 1.2 fails to detect the correct location of the platform SDK.
- # So we propagate those from the environment. This requires that the
- # user run vcvars32.bat before compiling.
- if 'INCLUDE' in os.environ:
- env['ENV']['INCLUDE'] = os.environ['INCLUDE']
- if 'LIB' in os.environ:
- env['ENV']['LIB'] = os.environ['LIB']
- for tool in ['msvc', 'msvs', 'mslink', 'masm', 'mslib']:
- env.Tool( tool )
- env['CXXFLAGS']='-GR -EHsc /nologo /MT'
-elif platform == 'mingw':
- env.Tool( 'mingw' )
- env.Append( CPPDEFINES=[ "WIN32", "NDEBUG", "_MT" ] )
-elif platform.startswith('linux-gcc'):
- env.Tool( 'default' )
- env.Append( LIBS = ['pthread'], CCFLAGS = os.environ.get("CXXFLAGS", "-Wall"), LINKFLAGS=os.environ.get("LDFLAGS", "") )
- env['SHARED_LIB_ENABLED'] = True
-else:
- print "UNSUPPORTED PLATFORM."
- env.Exit(1)
-
-env.Tool('targz')
-env.Tool('srcdist')
-env.Tool('globtool')
-
-env.Append( CPPPATH = ['#include'],
- LIBPATH = lib_dir )
-short_platform = platform
-if short_platform.startswith('msvc'):
- short_platform = short_platform[2:]
-# Notes: on Windows you need to rebuild the source for each variant
-# Build script does not support that yet so we only build static libraries.
-# This also fails on AIX because both dynamic and static library ends with
-# extension .a.
-env['SHARED_LIB_ENABLED'] = env.get('SHARED_LIB_ENABLED', False)
-env['LIB_PLATFORM'] = short_platform
-env['LIB_LINK_TYPE'] = 'lib' # static
-env['LIB_CRUNTIME'] = 'mt'
-env['LIB_NAME_SUFFIX'] = '${LIB_PLATFORM}_${LIB_LINK_TYPE}${LIB_CRUNTIME}' # must match autolink naming convention
-env['JSONCPP_VERSION'] = JSONCPP_VERSION
-env['BUILD_DIR'] = env.Dir(build_dir)
-env['ROOTBUILD_DIR'] = env.Dir(rootbuild_dir)
-env['DIST_DIR'] = DIST_DIR
-if 'TarGz' in env['BUILDERS']:
- class SrcDistAdder:
- def __init__( self, env ):
- self.env = env
- def __call__( self, *args, **kw ):
- apply( self.env.SrcDist, (self.env['SRCDIST_TARGET'],) + args, kw )
- env['SRCDIST_BUILDER'] = env.TarGz
-else: # If tarfile module is missing
- class SrcDistAdder:
- def __init__( self, env ):
- pass
- def __call__( self, *args, **kw ):
- pass
-env['SRCDIST_ADD'] = SrcDistAdder( env )
-env['SRCDIST_TARGET'] = os.path.join( DIST_DIR, 'jsoncpp-src-%s.tar.gz' % env['JSONCPP_VERSION'] )
-
-env_testing = env.Clone( )
-env_testing.Append( LIBS = ['json_${LIB_NAME_SUFFIX}'] )
-
-def buildJSONExample( env, target_sources, target_name ):
- env = env.Clone()
- env.Append( CPPPATH = ['#'] )
- exe = env.Program( target=target_name,
- source=target_sources )
- env['SRCDIST_ADD']( source=[target_sources] )
- global bin_dir
- return env.Install( bin_dir, exe )
-
-def buildJSONTests( env, target_sources, target_name ):
- jsontests_node = buildJSONExample( env, target_sources, target_name )
- check_alias_target = env.Alias( 'check', jsontests_node, RunJSONTests( jsontests_node, jsontests_node ) )
- env.AlwaysBuild( check_alias_target )
-
-def buildUnitTests( env, target_sources, target_name ):
- jsontests_node = buildJSONExample( env, target_sources, target_name )
- check_alias_target = env.Alias( 'check', jsontests_node,
- RunUnitTests( jsontests_node, jsontests_node ) )
- env.AlwaysBuild( check_alias_target )
-
-def buildLibrary( env, target_sources, target_name ):
- static_lib = env.StaticLibrary( target=target_name + '_${LIB_NAME_SUFFIX}',
- source=target_sources )
- global lib_dir
- env.Install( lib_dir, static_lib )
- if env['SHARED_LIB_ENABLED']:
- shared_lib = env.SharedLibrary( target=target_name + '_${LIB_NAME_SUFFIX}',
- source=target_sources )
- env.Install( lib_dir, shared_lib )
- env['SRCDIST_ADD']( source=[target_sources] )
-
-Export( 'env env_testing buildJSONExample buildLibrary buildJSONTests buildUnitTests' )
-
-def buildProjectInDirectory( target_directory ):
- global build_dir
- target_build_dir = os.path.join( build_dir, target_directory )
- target = os.path.join( target_directory, 'sconscript' )
- SConscript( target, build_dir=target_build_dir, duplicate=0 )
- env['SRCDIST_ADD']( source=[target] )
-
-
-def runJSONTests_action( target, source = None, env = None ):
- # Add test scripts to python path
- jsontest_path = Dir( '#test' ).abspath
- sys.path.insert( 0, jsontest_path )
- data_path = os.path.join( jsontest_path, 'data' )
- import runjsontests
- return runjsontests.runAllTests( os.path.abspath(source[0].path), data_path )
-
-def runJSONTests_string( target, source = None, env = None ):
- return 'RunJSONTests("%s")' % source[0]
-
-import SCons.Action
-ActionFactory = SCons.Action.ActionFactory
-RunJSONTests = ActionFactory(runJSONTests_action, runJSONTests_string )
-
-def runUnitTests_action( target, source = None, env = None ):
- # Add test scripts to python path
- jsontest_path = Dir( '#test' ).abspath
- sys.path.insert( 0, jsontest_path )
- import rununittests
- return rununittests.runAllTests( os.path.abspath(source[0].path) )
-
-def runUnitTests_string( target, source = None, env = None ):
- return 'RunUnitTests("%s")' % source[0]
-
-RunUnitTests = ActionFactory(runUnitTests_action, runUnitTests_string )
-
-env.Alias( 'check' )
-
-srcdist_cmd = env['SRCDIST_ADD']( source = """
- AUTHORS README.md SConstruct
- """.split() )
-env.Alias( 'src-dist', srcdist_cmd )
-
-buildProjectInDirectory( 'src/jsontestrunner' )
-buildProjectInDirectory( 'src/lib_json' )
-buildProjectInDirectory( 'src/test_lib_json' )
-#print env.Dump()
-
diff --git a/3rdparty/jsoncpp/amalgamate.py b/3rdparty/jsoncpp/amalgamate.py
deleted file mode 100644
index 1916bb0d5e7..00000000000
--- a/3rdparty/jsoncpp/amalgamate.py
+++ /dev/null
@@ -1,154 +0,0 @@
-"""Amalgate json-cpp library sources into a single source and header file.
-
-Works with python2.6+ and python3.4+.
-
-Example of invocation (must be invoked from json-cpp top directory):
-python amalgate.py
-"""
-import os
-import os.path
-import sys
-
-class AmalgamationFile:
- def __init__(self, top_dir):
- self.top_dir = top_dir
- self.blocks = []
-
- def add_text(self, text):
- if not text.endswith("\n"):
- text += "\n"
- self.blocks.append(text)
-
- def add_file(self, relative_input_path, wrap_in_comment=False):
- def add_marker(prefix):
- self.add_text("")
- self.add_text("// " + "/"*70)
- self.add_text("// %s of content of file: %s" % (prefix, relative_input_path.replace("\\","/")))
- self.add_text("// " + "/"*70)
- self.add_text("")
- add_marker("Beginning")
- f = open(os.path.join(self.top_dir, relative_input_path), "rt")
- content = f.read()
- if wrap_in_comment:
- content = "/*\n" + content + "\n*/"
- self.add_text(content)
- f.close()
- add_marker("End")
- self.add_text("\n\n\n\n")
-
- def get_value(self):
- return "".join(self.blocks).replace("\r\n","\n")
-
- def write_to(self, output_path):
- output_dir = os.path.dirname(output_path)
- if output_dir and not os.path.isdir(output_dir):
- os.makedirs(output_dir)
- f = open(output_path, "wb")
- f.write(str.encode(self.get_value(), 'UTF-8'))
- f.close()
-
-def amalgamate_source(source_top_dir=None,
- target_source_path=None,
- header_include_path=None):
- """Produces amalgated source.
- Parameters:
- source_top_dir: top-directory
- target_source_path: output .cpp path
- header_include_path: generated header path relative to target_source_path.
- """
- print("Amalgating header...")
- header = AmalgamationFile(source_top_dir)
- header.add_text("/// Json-cpp amalgated header (http://jsoncpp.sourceforge.net/).")
- header.add_text('/// It is intended to be used with #include "%s"' % header_include_path)
- header.add_file("LICENSE", wrap_in_comment=True)
- header.add_text("#ifndef JSON_AMALGATED_H_INCLUDED")
- header.add_text("# define JSON_AMALGATED_H_INCLUDED")
- header.add_text("/// If defined, indicates that the source file is amalgated")
- header.add_text("/// to prevent private header inclusion.")
- header.add_text("#define JSON_IS_AMALGAMATION")
- header.add_file("include/json/version.h")
- header.add_file("include/json/config.h")
- header.add_file("include/json/forwards.h")
- header.add_file("include/json/features.h")
- header.add_file("include/json/value.h")
- header.add_file("include/json/reader.h")
- header.add_file("include/json/writer.h")
- header.add_file("include/json/assertions.h")
- header.add_text("#endif //ifndef JSON_AMALGATED_H_INCLUDED")
-
- target_header_path = os.path.join(os.path.dirname(target_source_path), header_include_path)
- print("Writing amalgated header to %r" % target_header_path)
- header.write_to(target_header_path)
-
- base, ext = os.path.splitext(header_include_path)
- forward_header_include_path = base + "-forwards" + ext
- print("Amalgating forward header...")
- header = AmalgamationFile(source_top_dir)
- header.add_text("/// Json-cpp amalgated forward header (http://jsoncpp.sourceforge.net/).")
- header.add_text('/// It is intended to be used with #include "%s"' % forward_header_include_path)
- header.add_text("/// This header provides forward declaration for all JsonCpp types.")
- header.add_file("LICENSE", wrap_in_comment=True)
- header.add_text("#ifndef JSON_FORWARD_AMALGATED_H_INCLUDED")
- header.add_text("# define JSON_FORWARD_AMALGATED_H_INCLUDED")
- header.add_text("/// If defined, indicates that the source file is amalgated")
- header.add_text("/// to prevent private header inclusion.")
- header.add_text("#define JSON_IS_AMALGAMATION")
- header.add_file("include/json/config.h")
- header.add_file("include/json/forwards.h")
- header.add_text("#endif //ifndef JSON_FORWARD_AMALGATED_H_INCLUDED")
-
- target_forward_header_path = os.path.join(os.path.dirname(target_source_path),
- forward_header_include_path)
- print("Writing amalgated forward header to %r" % target_forward_header_path)
- header.write_to(target_forward_header_path)
-
- print("Amalgating source...")
- source = AmalgamationFile(source_top_dir)
- source.add_text("/// Json-cpp amalgated source (http://jsoncpp.sourceforge.net/).")
- source.add_text('/// It is intended to be used with #include "%s"' % header_include_path)
- source.add_file("LICENSE", wrap_in_comment=True)
- source.add_text("")
- source.add_text('#include "%s"' % header_include_path)
- source.add_text("""
-#ifndef JSON_IS_AMALGAMATION
-#error "Compile with -I PATH_TO_JSON_DIRECTORY"
-#endif
-""")
- source.add_text("")
- lib_json = "src/lib_json"
- source.add_file(os.path.join(lib_json, "json_tool.h"))
- source.add_file(os.path.join(lib_json, "json_reader.cpp"))
- source.add_file(os.path.join(lib_json, "json_valueiterator.inl"))
- source.add_file(os.path.join(lib_json, "json_value.cpp"))
- source.add_file(os.path.join(lib_json, "json_writer.cpp"))
-
- print("Writing amalgated source to %r" % target_source_path)
- source.write_to(target_source_path)
-
-def main():
- usage = """%prog [options]
-Generate a single amalgated source and header file from the sources.
-"""
- from optparse import OptionParser
- parser = OptionParser(usage=usage)
- parser.allow_interspersed_args = False
- parser.add_option("-s", "--source", dest="target_source_path", action="store", default="dist/jsoncpp.cpp",
- help="""Output .cpp source path. [Default: %default]""")
- parser.add_option("-i", "--include", dest="header_include_path", action="store", default="json/json.h",
- help="""Header include path. Used to include the header from the amalgated source file. [Default: %default]""")
- parser.add_option("-t", "--top-dir", dest="top_dir", action="store", default=os.getcwd(),
- help="""Source top-directory. [Default: %default]""")
- parser.enable_interspersed_args()
- options, args = parser.parse_args()
-
- msg = amalgamate_source(source_top_dir=options.top_dir,
- target_source_path=options.target_source_path,
- header_include_path=options.header_include_path)
- if msg:
- sys.stderr.write(msg + "\n")
- sys.exit(1)
- else:
- print("Source succesfully amalagated")
-
-if __name__ == "__main__":
- main()
diff --git a/3rdparty/jsoncpp/appveyor.yml b/3rdparty/jsoncpp/appveyor.yml
deleted file mode 100644
index 546cb7ed13e..00000000000
--- a/3rdparty/jsoncpp/appveyor.yml
+++ /dev/null
@@ -1,34 +0,0 @@
-# This is a comment.
-
-version: build.{build}
-
-os: Windows Server 2012 R2
-
-clone_folder: c:\projects\jsoncpp
-
-platform:
- - Win32
- - x64
-
-configuration:
- - Debug
- - Release
-
-# scripts to run before build
-before_build:
- - echo "Running cmake..."
- - cd c:\projects\jsoncpp
- - cmake --version
- - if %PLATFORM% == Win32 cmake .
- - if %PLATFORM% == x64 cmake -G "Visual Studio 12 2013 Win64" .
-
-build:
- project: jsoncpp.sln # path to Visual Studio solution or project
-
-deploy:
- provider: GitHub
- auth_token:
- secure: K2Tp1q8pIZ7rs0Ot24ZMWuwr12Ev6Tc6QkhMjGQxoQG3ng1pXtgPasiJ45IDXGdg
- on:
- branch: master
- appveyor_repo_tag: true
diff --git a/3rdparty/jsoncpp/dev.makefile b/3rdparty/jsoncpp/dev.makefile
deleted file mode 100644
index d288b166586..00000000000
--- a/3rdparty/jsoncpp/dev.makefile
+++ /dev/null
@@ -1,35 +0,0 @@
-# This is only for jsoncpp developers/contributors.
-# We use this to sign releases, generate documentation, etc.
-VER?=$(shell cat version)
-
-default:
- @echo "VER=${VER}"
-sign: jsoncpp-${VER}.tar.gz
- gpg --armor --detach-sign $<
- gpg --verify $<.asc
- # Then upload .asc to the release.
-jsoncpp-%.tar.gz:
- curl https://github.com/open-source-parsers/jsoncpp/archive/$*.tar.gz -o $@
-dox:
- python doxybuild.py --doxygen=$$(which doxygen) --in doc/web_doxyfile.in
- rsync -va --delete dist/doxygen/jsoncpp-api-html-${VER}/ ../jsoncpp-docs/doxygen/
- # Then 'git add -A' and 'git push' in jsoncpp-docs.
-build:
- mkdir -p build/debug
- cd build/debug; cmake -DCMAKE_BUILD_TYPE=debug -DBUILD_SHARED_LIBS=ON -G "Unix Makefiles" ../..
- make -C build/debug
-
-# Currently, this depends on include/json/version.h generated
-# by cmake.
-test-amalgamate:
- python2.7 amalgamate.py
- python3.4 amalgamate.py
- cd dist; gcc -I. -c jsoncpp.cpp
-
-valgrind:
- valgrind --error-exitcode=42 --leak-check=full ./build/debug/src/test_lib_json/jsoncpp_test
-
-clean:
- \rm -rf *.gz *.asc dist/
-
-.PHONY: build
diff --git a/3rdparty/jsoncpp/devtools/__init__.py b/3rdparty/jsoncpp/devtools/__init__.py
deleted file mode 100644
index d18a5216853..00000000000
--- a/3rdparty/jsoncpp/devtools/__init__.py
+++ /dev/null
@@ -1,6 +0,0 @@
-# Copyright 2010 Baptiste Lepilleur
-# Distributed under MIT license, or public domain if desired and
-# recognized in your jurisdiction.
-# See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
-
-# module
diff --git a/3rdparty/jsoncpp/devtools/agent_vmw7.json b/3rdparty/jsoncpp/devtools/agent_vmw7.json
deleted file mode 100644
index 0810a99544e..00000000000
--- a/3rdparty/jsoncpp/devtools/agent_vmw7.json
+++ /dev/null
@@ -1,33 +0,0 @@
-{
- "cmake_variants" : [
- {"name": "generator",
- "generators": [
- {"generator": [
- "Visual Studio 7 .NET 2003",
- "Visual Studio 9 2008",
- "Visual Studio 9 2008 Win64",
- "Visual Studio 10",
- "Visual Studio 10 Win64",
- "Visual Studio 11",
- "Visual Studio 11 Win64"
- ]
- },
- {"generator": ["MinGW Makefiles"],
- "env_prepend": [{"path": "c:/wut/prg/MinGW/bin"}]
- }
- ]
- },
- {"name": "shared_dll",
- "variables": [
- ["BUILD_SHARED_LIBS=true"],
- ["BUILD_SHARED_LIBS=false"]
- ]
- },
- {"name": "build_type",
- "build_types": [
- "debug",
- "release"
- ]
- }
- ]
-}
diff --git a/3rdparty/jsoncpp/devtools/agent_vmxp.json b/3rdparty/jsoncpp/devtools/agent_vmxp.json
deleted file mode 100644
index b627a7221a7..00000000000
--- a/3rdparty/jsoncpp/devtools/agent_vmxp.json
+++ /dev/null
@@ -1,26 +0,0 @@
-{
- "cmake_variants" : [
- {"name": "generator",
- "generators": [
- {"generator": [
- "Visual Studio 6",
- "Visual Studio 7",
- "Visual Studio 8 2005"
- ]
- }
- ]
- },
- {"name": "shared_dll",
- "variables": [
- ["BUILD_SHARED_LIBS=true"],
- ["BUILD_SHARED_LIBS=false"]
- ]
- },
- {"name": "build_type",
- "build_types": [
- "debug",
- "release"
- ]
- }
- ]
-}
diff --git a/3rdparty/jsoncpp/devtools/antglob.py b/3rdparty/jsoncpp/devtools/antglob.py
deleted file mode 100644
index c272f66343f..00000000000
--- a/3rdparty/jsoncpp/devtools/antglob.py
+++ /dev/null
@@ -1,205 +0,0 @@
-#!/usr/bin/env python
-# encoding: utf-8
-# Copyright 2009 Baptiste Lepilleur
-# Distributed under MIT license, or public domain if desired and
-# recognized in your jurisdiction.
-# See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
-
-from __future__ import print_function
-from dircache import listdir
-import re
-import fnmatch
-import os.path
-
-
-# These fnmatch expressions are used by default to prune the directory tree
-# while doing the recursive traversal in the glob_impl method of glob function.
-prune_dirs = '.git .bzr .hg .svn _MTN _darcs CVS SCCS '
-
-# These fnmatch expressions are used by default to exclude files and dirs
-# while doing the recursive traversal in the glob_impl method of glob function.
-##exclude_pats = prune_pats + '*~ #*# .#* %*% ._* .gitignore .cvsignore vssver.scc .DS_Store'.split()
-
-# These ant_glob expressions are used by default to exclude files and dirs and also prune the directory tree
-# while doing the recursive traversal in the glob_impl method of glob function.
-default_excludes = '''
-**/*~
-**/#*#
-**/.#*
-**/%*%
-**/._*
-**/CVS
-**/CVS/**
-**/.cvsignore
-**/SCCS
-**/SCCS/**
-**/vssver.scc
-**/.svn
-**/.svn/**
-**/.git
-**/.git/**
-**/.gitignore
-**/.bzr
-**/.bzr/**
-**/.hg
-**/.hg/**
-**/_MTN
-**/_MTN/**
-**/_darcs
-**/_darcs/**
-**/.DS_Store '''
-
-DIR = 1
-FILE = 2
-DIR_LINK = 4
-FILE_LINK = 8
-LINKS = DIR_LINK | FILE_LINK
-ALL_NO_LINK = DIR | FILE
-ALL = DIR | FILE | LINKS
-
-_ANT_RE = re.compile(r'(/\*\*/)|(\*\*/)|(/\*\*)|(\*)|(/)|([^\*/]*)')
-
-def ant_pattern_to_re(ant_pattern):
- """Generates a regular expression from the ant pattern.
- Matching convention:
- **/a: match 'a', 'dir/a', 'dir1/dir2/a'
- a/**/b: match 'a/b', 'a/c/b', 'a/d/c/b'
- *.py: match 'script.py' but not 'a/script.py'
- """
- rex = ['^']
- next_pos = 0
- sep_rex = r'(?:/|%s)' % re.escape(os.path.sep)
-## print 'Converting', ant_pattern
- for match in _ANT_RE.finditer(ant_pattern):
-## print 'Matched', match.group()
-## print match.start(0), next_pos
- if match.start(0) != next_pos:
- raise ValueError("Invalid ant pattern")
- if match.group(1): # /**/
- rex.append(sep_rex + '(?:.*%s)?' % sep_rex)
- elif match.group(2): # **/
- rex.append('(?:.*%s)?' % sep_rex)
- elif match.group(3): # /**
- rex.append(sep_rex + '.*')
- elif match.group(4): # *
- rex.append('[^/%s]*' % re.escape(os.path.sep))
- elif match.group(5): # /
- rex.append(sep_rex)
- else: # somepath
- rex.append(re.escape(match.group(6)))
- next_pos = match.end()
- rex.append('$')
- return re.compile(''.join(rex))
-
-def _as_list(l):
- if isinstance(l, basestring):
- return l.split()
- return l
-
-def glob(dir_path,
- includes = '**/*',
- excludes = default_excludes,
- entry_type = FILE,
- prune_dirs = prune_dirs,
- max_depth = 25):
- include_filter = [ant_pattern_to_re(p) for p in _as_list(includes)]
- exclude_filter = [ant_pattern_to_re(p) for p in _as_list(excludes)]
- prune_dirs = [p.replace('/',os.path.sep) for p in _as_list(prune_dirs)]
- dir_path = dir_path.replace('/',os.path.sep)
- entry_type_filter = entry_type
-
- def is_pruned_dir(dir_name):
- for pattern in prune_dirs:
- if fnmatch.fnmatch(dir_name, pattern):
- return True
- return False
-
- def apply_filter(full_path, filter_rexs):
- """Return True if at least one of the filter regular expression match full_path."""
- for rex in filter_rexs:
- if rex.match(full_path):
- return True
- return False
-
- def glob_impl(root_dir_path):
- child_dirs = [root_dir_path]
- while child_dirs:
- dir_path = child_dirs.pop()
- for entry in listdir(dir_path):
- full_path = os.path.join(dir_path, entry)
-## print 'Testing:', full_path,
- is_dir = os.path.isdir(full_path)
- if is_dir and not is_pruned_dir(entry): # explore child directory ?
-## print '===> marked for recursion',
- child_dirs.append(full_path)
- included = apply_filter(full_path, include_filter)
- rejected = apply_filter(full_path, exclude_filter)
- if not included or rejected: # do not include entry ?
-## print '=> not included or rejected'
- continue
- link = os.path.islink(full_path)
- is_file = os.path.isfile(full_path)
- if not is_file and not is_dir:
-## print '=> unknown entry type'
- continue
- if link:
- entry_type = is_file and FILE_LINK or DIR_LINK
- else:
- entry_type = is_file and FILE or DIR
-## print '=> type: %d' % entry_type,
- if (entry_type & entry_type_filter) != 0:
-## print ' => KEEP'
- yield os.path.join(dir_path, entry)
-## else:
-## print ' => TYPE REJECTED'
- return list(glob_impl(dir_path))
-
-
-if __name__ == "__main__":
- import unittest
-
- class AntPatternToRETest(unittest.TestCase):
-## def test_conversion(self):
-## self.assertEqual('^somepath$', ant_pattern_to_re('somepath').pattern)
-
- def test_matching(self):
- test_cases = [ ('path',
- ['path'],
- ['somepath', 'pathsuffix', '/path', '/path']),
- ('*.py',
- ['source.py', 'source.ext.py', '.py'],
- ['path/source.py', '/.py', 'dir.py/z', 'z.pyc', 'z.c']),
- ('**/path',
- ['path', '/path', '/a/path', 'c:/a/path', '/a/b/path', '//a/path', '/a/path/b/path'],
- ['path/', 'a/path/b', 'dir.py/z', 'somepath', 'pathsuffix', 'a/somepath']),
- ('path/**',
- ['path/a', 'path/path/a', 'path//'],
- ['path', 'somepath/a', 'a/path', 'a/path/a', 'pathsuffix/a']),
- ('/**/path',
- ['/path', '/a/path', '/a/b/path/path', '/path/path'],
- ['path', 'path/', 'a/path', '/pathsuffix', '/somepath']),
- ('a/b',
- ['a/b'],
- ['somea/b', 'a/bsuffix', 'a/b/c']),
- ('**/*.py',
- ['script.py', 'src/script.py', 'a/b/script.py', '/a/b/script.py'],
- ['script.pyc', 'script.pyo', 'a.py/b']),
- ('src/**/*.py',
- ['src/a.py', 'src/dir/a.py'],
- ['a/src/a.py', '/src/a.py']),
- ]
- for ant_pattern, accepted_matches, rejected_matches in list(test_cases):
- def local_path(paths):
- return [ p.replace('/',os.path.sep) for p in paths ]
- test_cases.append((ant_pattern, local_path(accepted_matches), local_path(rejected_matches)))
- for ant_pattern, accepted_matches, rejected_matches in test_cases:
- rex = ant_pattern_to_re(ant_pattern)
- print('ant_pattern:', ant_pattern, ' => ', rex.pattern)
- for accepted_match in accepted_matches:
- print('Accepted?:', accepted_match)
- self.assertTrue(rex.match(accepted_match) is not None)
- for rejected_match in rejected_matches:
- print('Rejected?:', rejected_match)
- self.assertTrue(rex.match(rejected_match) is None)
-
- unittest.main()
diff --git a/3rdparty/jsoncpp/devtools/batchbuild.py b/3rdparty/jsoncpp/devtools/batchbuild.py
deleted file mode 100644
index 0eb0690e8c6..00000000000
--- a/3rdparty/jsoncpp/devtools/batchbuild.py
+++ /dev/null
@@ -1,278 +0,0 @@
-from __future__ import print_function
-import collections
-import itertools
-import json
-import os
-import os.path
-import re
-import shutil
-import string
-import subprocess
-import sys
-import cgi
-
-class BuildDesc:
- def __init__(self, prepend_envs=None, variables=None, build_type=None, generator=None):
- self.prepend_envs = prepend_envs or [] # [ { "var": "value" } ]
- self.variables = variables or []
- self.build_type = build_type
- self.generator = generator
-
- def merged_with(self, build_desc):
- """Returns a new BuildDesc by merging field content.
- Prefer build_desc fields to self fields for single valued field.
- """
- return BuildDesc(self.prepend_envs + build_desc.prepend_envs,
- self.variables + build_desc.variables,
- build_desc.build_type or self.build_type,
- build_desc.generator or self.generator)
-
- def env(self):
- environ = os.environ.copy()
- for values_by_name in self.prepend_envs:
- for var, value in list(values_by_name.items()):
- var = var.upper()
- if type(value) is unicode:
- value = value.encode(sys.getdefaultencoding())
- if var in environ:
- environ[var] = value + os.pathsep + environ[var]
- else:
- environ[var] = value
- return environ
-
- def cmake_args(self):
- args = ["-D%s" % var for var in self.variables]
- # skip build type for Visual Studio solution as it cause warning
- if self.build_type and 'Visual' not in self.generator:
- args.append("-DCMAKE_BUILD_TYPE=%s" % self.build_type)
- if self.generator:
- args.extend(['-G', self.generator])
- return args
-
- def __repr__(self):
- return "BuildDesc(%s, build_type=%s)" % (" ".join(self.cmake_args()), self.build_type)
-
-class BuildData:
- def __init__(self, desc, work_dir, source_dir):
- self.desc = desc
- self.work_dir = work_dir
- self.source_dir = source_dir
- self.cmake_log_path = os.path.join(work_dir, 'batchbuild_cmake.log')
- self.build_log_path = os.path.join(work_dir, 'batchbuild_build.log')
- self.cmake_succeeded = False
- self.build_succeeded = False
-
- def execute_build(self):
- print('Build %s' % self.desc)
- self._make_new_work_dir()
- self.cmake_succeeded = self._generate_makefiles()
- if self.cmake_succeeded:
- self.build_succeeded = self._build_using_makefiles()
- return self.build_succeeded
-
- def _generate_makefiles(self):
- print(' Generating makefiles: ', end=' ')
- cmd = ['cmake'] + self.desc.cmake_args() + [os.path.abspath(self.source_dir)]
- succeeded = self._execute_build_subprocess(cmd, self.desc.env(), self.cmake_log_path)
- print('done' if succeeded else 'FAILED')
- return succeeded
-
- def _build_using_makefiles(self):
- print(' Building:', end=' ')
- cmd = ['cmake', '--build', self.work_dir]
- if self.desc.build_type:
- cmd += ['--config', self.desc.build_type]
- succeeded = self._execute_build_subprocess(cmd, self.desc.env(), self.build_log_path)
- print('done' if succeeded else 'FAILED')
- return succeeded
-
- def _execute_build_subprocess(self, cmd, env, log_path):
- process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, cwd=self.work_dir,
- env=env)
- stdout, _ = process.communicate()
- succeeded = (process.returncode == 0)
- with open(log_path, 'wb') as flog:
- log = ' '.join(cmd) + '\n' + stdout + '\nExit code: %r\n' % process.returncode
- flog.write(fix_eol(log))
- return succeeded
-
- def _make_new_work_dir(self):
- if os.path.isdir(self.work_dir):
- print(' Removing work directory', self.work_dir)
- shutil.rmtree(self.work_dir, ignore_errors=True)
- if not os.path.isdir(self.work_dir):
- os.makedirs(self.work_dir)
-
-def fix_eol(stdout):
- """Fixes wrong EOL produced by cmake --build on Windows (\r\r\n instead of \r\n).
- """
- return re.sub('\r*\n', os.linesep, stdout)
-
-def load_build_variants_from_config(config_path):
- with open(config_path, 'rb') as fconfig:
- data = json.load(fconfig)
- variants = data[ 'cmake_variants' ]
- build_descs_by_axis = collections.defaultdict(list)
- for axis in variants:
- axis_name = axis["name"]
- build_descs = []
- if "generators" in axis:
- for generator_data in axis["generators"]:
- for generator in generator_data["generator"]:
- build_desc = BuildDesc(generator=generator,
- prepend_envs=generator_data.get("env_prepend"))
- build_descs.append(build_desc)
- elif "variables" in axis:
- for variables in axis["variables"]:
- build_desc = BuildDesc(variables=variables)
- build_descs.append(build_desc)
- elif "build_types" in axis:
- for build_type in axis["build_types"]:
- build_desc = BuildDesc(build_type=build_type)
- build_descs.append(build_desc)
- build_descs_by_axis[axis_name].extend(build_descs)
- return build_descs_by_axis
-
-def generate_build_variants(build_descs_by_axis):
- """Returns a list of BuildDesc generated for the partial BuildDesc for each axis."""
- axis_names = list(build_descs_by_axis.keys())
- build_descs = []
- for axis_name, axis_build_descs in list(build_descs_by_axis.items()):
- if len(build_descs):
- # for each existing build_desc and each axis build desc, create a new build_desc
- new_build_descs = []
- for prototype_build_desc, axis_build_desc in itertools.product(build_descs, axis_build_descs):
- new_build_descs.append(prototype_build_desc.merged_with(axis_build_desc))
- build_descs = new_build_descs
- else:
- build_descs = axis_build_descs
- return build_descs
-
-HTML_TEMPLATE = string.Template('''<html>
-<head>
- <title>$title</title>
- <style type="text/css">
- td.failed {background-color:#f08080;}
- td.ok {background-color:#c0eec0;}
- </style>
-</head>
-<body>
-<table border="1">
-<thead>
- <tr>
- <th>Variables</th>
- $th_vars
- </tr>
- <tr>
- <th>Build type</th>
- $th_build_types
- </tr>
-</thead>
-<tbody>
-$tr_builds
-</tbody>
-</table>
-</body></html>''')
-
-def generate_html_report(html_report_path, builds):
- report_dir = os.path.dirname(html_report_path)
- # Vertical axis: generator
- # Horizontal: variables, then build_type
- builds_by_generator = collections.defaultdict(list)
- variables = set()
- build_types_by_variable = collections.defaultdict(set)
- build_by_pos_key = {} # { (generator, var_key, build_type): build }
- for build in builds:
- builds_by_generator[build.desc.generator].append(build)
- var_key = tuple(sorted(build.desc.variables))
- variables.add(var_key)
- build_types_by_variable[var_key].add(build.desc.build_type)
- pos_key = (build.desc.generator, var_key, build.desc.build_type)
- build_by_pos_key[pos_key] = build
- variables = sorted(variables)
- th_vars = []
- th_build_types = []
- for variable in variables:
- build_types = sorted(build_types_by_variable[variable])
- nb_build_type = len(build_types_by_variable[variable])
- th_vars.append('<th colspan="%d">%s</th>' % (nb_build_type, cgi.escape(' '.join(variable))))
- for build_type in build_types:
- th_build_types.append('<th>%s</th>' % cgi.escape(build_type))
- tr_builds = []
- for generator in sorted(builds_by_generator):
- tds = [ '<td>%s</td>\n' % cgi.escape(generator) ]
- for variable in variables:
- build_types = sorted(build_types_by_variable[variable])
- for build_type in build_types:
- pos_key = (generator, variable, build_type)
- build = build_by_pos_key.get(pos_key)
- if build:
- cmake_status = 'ok' if build.cmake_succeeded else 'FAILED'
- build_status = 'ok' if build.build_succeeded else 'FAILED'
- cmake_log_url = os.path.relpath(build.cmake_log_path, report_dir)
- build_log_url = os.path.relpath(build.build_log_path, report_dir)
- td = '<td class="%s"><a href="%s" class="%s">CMake: %s</a>' % ( build_status.lower(), cmake_log_url, cmake_status.lower(), cmake_status)
- if build.cmake_succeeded:
- td += '<br><a href="%s" class="%s">Build: %s</a>' % ( build_log_url, build_status.lower(), build_status)
- td += '</td>'
- else:
- td = '<td></td>'
- tds.append(td)
- tr_builds.append('<tr>%s</tr>' % '\n'.join(tds))
- html = HTML_TEMPLATE.substitute( title='Batch build report',
- th_vars=' '.join(th_vars),
- th_build_types=' '.join(th_build_types),
- tr_builds='\n'.join(tr_builds))
- with open(html_report_path, 'wt') as fhtml:
- fhtml.write(html)
- print('HTML report generated in:', html_report_path)
-
-def main():
- usage = r"""%prog WORK_DIR SOURCE_DIR CONFIG_JSON_PATH [CONFIG2_JSON_PATH...]
-Build a given CMake based project located in SOURCE_DIR with multiple generators/options.dry_run
-as described in CONFIG_JSON_PATH building in WORK_DIR.
-
-Example of call:
-python devtools\batchbuild.py e:\buildbots\jsoncpp\build . devtools\agent_vmw7.json
-"""
- from optparse import OptionParser
- parser = OptionParser(usage=usage)
- parser.allow_interspersed_args = True
-# parser.add_option('-v', '--verbose', dest="verbose", action='store_true',
-# help="""Be verbose.""")
- parser.enable_interspersed_args()
- options, args = parser.parse_args()
- if len(args) < 3:
- parser.error("Missing one of WORK_DIR SOURCE_DIR CONFIG_JSON_PATH.")
- work_dir = args[0]
- source_dir = args[1].rstrip('/\\')
- config_paths = args[2:]
- for config_path in config_paths:
- if not os.path.isfile(config_path):
- parser.error("Can not read: %r" % config_path)
-
- # generate build variants
- build_descs = []
- for config_path in config_paths:
- build_descs_by_axis = load_build_variants_from_config(config_path)
- build_descs.extend(generate_build_variants(build_descs_by_axis))
- print('Build variants (%d):' % len(build_descs))
- # assign build directory for each variant
- if not os.path.isdir(work_dir):
- os.makedirs(work_dir)
- builds = []
- with open(os.path.join(work_dir, 'matrix-dir-map.txt'), 'wt') as fmatrixmap:
- for index, build_desc in enumerate(build_descs):
- build_desc_work_dir = os.path.join(work_dir, '%03d' % (index+1))
- builds.append(BuildData(build_desc, build_desc_work_dir, source_dir))
- fmatrixmap.write('%s: %s\n' % (build_desc_work_dir, build_desc))
- for build in builds:
- build.execute_build()
- html_report_path = os.path.join(work_dir, 'batchbuild-report.html')
- generate_html_report(html_report_path, builds)
- print('Done')
-
-
-if __name__ == '__main__':
- main()
-
diff --git a/3rdparty/jsoncpp/devtools/fixeol.py b/3rdparty/jsoncpp/devtools/fixeol.py
deleted file mode 100644
index 054eb9b227b..00000000000
--- a/3rdparty/jsoncpp/devtools/fixeol.py
+++ /dev/null
@@ -1,69 +0,0 @@
-# Copyright 2010 Baptiste Lepilleur
-# Distributed under MIT license, or public domain if desired and
-# recognized in your jurisdiction.
-# See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
-
-from __future__ import print_function
-import os.path
-
-def fix_source_eol(path, is_dry_run = True, verbose = True, eol = '\n'):
- """Makes sure that all sources have the specified eol sequence (default: unix)."""
- if not os.path.isfile(path):
- raise ValueError('Path "%s" is not a file' % path)
- try:
- f = open(path, 'rb')
- except IOError as msg:
- print("%s: I/O Error: %s" % (file, str(msg)), file=sys.stderr)
- return False
- try:
- raw_lines = f.readlines()
- finally:
- f.close()
- fixed_lines = [line.rstrip('\r\n') + eol for line in raw_lines]
- if raw_lines != fixed_lines:
- print('%s =>' % path, end=' ')
- if not is_dry_run:
- f = open(path, "wb")
- try:
- f.writelines(fixed_lines)
- finally:
- f.close()
- if verbose:
- print(is_dry_run and ' NEED FIX' or ' FIXED')
- return True
-##
-##
-##
-##def _do_fix(is_dry_run = True):
-## from waftools import antglob
-## python_sources = antglob.glob('.',
-## includes = '**/*.py **/wscript **/wscript_build',
-## excludes = antglob.default_excludes + './waf.py',
-## prune_dirs = antglob.prune_dirs + 'waf-* ./build')
-## for path in python_sources:
-## _fix_python_source(path, is_dry_run)
-##
-## cpp_sources = antglob.glob('.',
-## includes = '**/*.cpp **/*.h **/*.inl',
-## prune_dirs = antglob.prune_dirs + 'waf-* ./build')
-## for path in cpp_sources:
-## _fix_source_eol(path, is_dry_run)
-##
-##
-##def dry_fix(context):
-## _do_fix(is_dry_run = True)
-##
-##def fix(context):
-## _do_fix(is_dry_run = False)
-##
-##def shutdown():
-## pass
-##
-##def check(context):
-## # Unit tests are run when "check" target is used
-## ut = UnitTest.unit_test()
-## ut.change_to_testfile_dir = True
-## ut.want_to_see_test_output = True
-## ut.want_to_see_test_error = True
-## ut.run()
-## ut.print_results()
diff --git a/3rdparty/jsoncpp/devtools/licenseupdater.py b/3rdparty/jsoncpp/devtools/licenseupdater.py
deleted file mode 100644
index 6f823618fb9..00000000000
--- a/3rdparty/jsoncpp/devtools/licenseupdater.py
+++ /dev/null
@@ -1,94 +0,0 @@
-"""Updates the license text in source file.
-"""
-from __future__ import print_function
-
-# An existing license is found if the file starts with the string below,
-# and ends with the first blank line.
-LICENSE_BEGIN = "// Copyright "
-
-BRIEF_LICENSE = LICENSE_BEGIN + """2007-2010 Baptiste Lepilleur
-// Distributed under MIT license, or public domain if desired and
-// recognized in your jurisdiction.
-// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
-
-""".replace('\r\n','\n')
-
-def update_license(path, dry_run, show_diff):
- """Update the license statement in the specified file.
- Parameters:
- path: path of the C++ source file to update.
- dry_run: if True, just print the path of the file that would be updated,
- but don't change it.
- show_diff: if True, print the path of the file that would be modified,
- as well as the change made to the file.
- """
- with open(path, 'rt') as fin:
- original_text = fin.read().replace('\r\n','\n')
- newline = fin.newlines and fin.newlines[0] or '\n'
- if not original_text.startswith(LICENSE_BEGIN):
- # No existing license found => prepend it
- new_text = BRIEF_LICENSE + original_text
- else:
- license_end_index = original_text.index('\n\n') # search first blank line
- new_text = BRIEF_LICENSE + original_text[license_end_index+2:]
- if original_text != new_text:
- if not dry_run:
- with open(path, 'wb') as fout:
- fout.write(new_text.replace('\n', newline))
- print('Updated', path)
- if show_diff:
- import difflib
- print('\n'.join(difflib.unified_diff(original_text.split('\n'),
- new_text.split('\n'))))
- return True
- return False
-
-def update_license_in_source_directories(source_dirs, dry_run, show_diff):
- """Updates license text in C++ source files found in directory source_dirs.
- Parameters:
- source_dirs: list of directory to scan for C++ sources. Directories are
- scanned recursively.
- dry_run: if True, just print the path of the file that would be updated,
- but don't change it.
- show_diff: if True, print the path of the file that would be modified,
- as well as the change made to the file.
- """
- from devtools import antglob
- prune_dirs = antglob.prune_dirs + 'scons-local* ./build* ./libs ./dist'
- for source_dir in source_dirs:
- cpp_sources = antglob.glob(source_dir,
- includes = '''**/*.h **/*.cpp **/*.inl''',
- prune_dirs = prune_dirs)
- for source in cpp_sources:
- update_license(source, dry_run, show_diff)
-
-def main():
- usage = """%prog DIR [DIR2...]
-Updates license text in sources of the project in source files found
-in the directory specified on the command-line.
-
-Example of call:
-python devtools\licenseupdater.py include src -n --diff
-=> Show change that would be made to the sources.
-
-python devtools\licenseupdater.py include src
-=> Update license statement on all sources in directories include/ and src/.
-"""
- from optparse import OptionParser
- parser = OptionParser(usage=usage)
- parser.allow_interspersed_args = False
- parser.add_option('-n', '--dry-run', dest="dry_run", action='store_true', default=False,
- help="""Only show what files are updated, do not update the files""")
- parser.add_option('--diff', dest="show_diff", action='store_true', default=False,
- help="""On update, show change made to the file.""")
- parser.enable_interspersed_args()
- options, args = parser.parse_args()
- update_license_in_source_directories(args, options.dry_run, options.show_diff)
- print('Done')
-
-if __name__ == '__main__':
- import sys
- import os.path
- sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
- main()
-
diff --git a/3rdparty/jsoncpp/devtools/tarball.py b/3rdparty/jsoncpp/devtools/tarball.py
deleted file mode 100644
index 2e72717aba4..00000000000
--- a/3rdparty/jsoncpp/devtools/tarball.py
+++ /dev/null
@@ -1,52 +0,0 @@
-# Copyright 2010 Baptiste Lepilleur
-# Distributed under MIT license, or public domain if desired and
-# recognized in your jurisdiction.
-# See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
-
-from contextlib import closing
-import os
-import tarfile
-
-TARGZ_DEFAULT_COMPRESSION_LEVEL = 9
-
-def make_tarball(tarball_path, sources, base_dir, prefix_dir=''):
- """Parameters:
- tarball_path: output path of the .tar.gz file
- sources: list of sources to include in the tarball, relative to the current directory
- base_dir: if a source file is in a sub-directory of base_dir, then base_dir is stripped
- from path in the tarball.
- prefix_dir: all files stored in the tarball be sub-directory of prefix_dir. Set to ''
- to make them child of root.
- """
- base_dir = os.path.normpath(os.path.abspath(base_dir))
- def archive_name(path):
- """Makes path relative to base_dir."""
- path = os.path.normpath(os.path.abspath(path))
- common_path = os.path.commonprefix((base_dir, path))
- archive_name = path[len(common_path):]
- if os.path.isabs(archive_name):
- archive_name = archive_name[1:]
- return os.path.join(prefix_dir, archive_name)
- def visit(tar, dirname, names):
- for name in names:
- path = os.path.join(dirname, name)
- if os.path.isfile(path):
- path_in_tar = archive_name(path)
- tar.add(path, path_in_tar)
- compression = TARGZ_DEFAULT_COMPRESSION_LEVEL
- with closing(tarfile.TarFile.open(tarball_path, 'w:gz',
- compresslevel=compression)) as tar:
- for source in sources:
- source_path = source
- if os.path.isdir(source):
- for dirpath, dirnames, filenames in os.walk(source_path):
- visit(tar, dirpath, filenames)
- else:
- path_in_tar = archive_name(source_path)
- tar.add(source_path, path_in_tar) # filename, arcname
-
-def decompress(tarball_path, base_dir):
- """Decompress the gzipped tarball into directory base_dir.
- """
- with closing(tarfile.TarFile.open(tarball_path)) as tar:
- tar.extractall(base_dir)
diff --git a/3rdparty/jsoncpp/doc/doxyfile.in b/3rdparty/jsoncpp/doc/doxyfile.in
deleted file mode 100644
index 57c61c27e40..00000000000
--- a/3rdparty/jsoncpp/doc/doxyfile.in
+++ /dev/null
@@ -1,2301 +0,0 @@
-# Doxyfile 1.8.5
-
-# This file describes the settings to be used by the documentation system
-# doxygen (www.doxygen.org) for a project.
-#
-# All text after a double hash (##) is considered a comment and is placed in
-# front of the TAG it is preceding.
-#
-# All text after a single hash (#) is considered a comment and will be ignored.
-# The format is:
-# TAG = value [value, ...]
-# For lists, items can also be appended using:
-# TAG += value [value, ...]
-# Values that contain spaces should be placed between quotes (\" \").
-
-#---------------------------------------------------------------------------
-# Project related configuration options
-#---------------------------------------------------------------------------
-
-# This tag specifies the encoding used for all characters in the config file
-# that follow. The default is UTF-8 which is also the encoding used for all text
-# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
-# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv
-# for the list of possible encodings.
-# The default value is: UTF-8.
-
-DOXYFILE_ENCODING = UTF-8
-
-# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
-# double-quotes, unless you are using Doxywizard) that should identify the
-# project for which the documentation is generated. This name is used in the
-# title of most generated pages and in a few other places.
-# The default value is: My Project.
-
-PROJECT_NAME = "JsonCpp"
-
-# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
-# could be handy for archiving the generated documentation or if some version
-# control system is used.
-
-PROJECT_NUMBER = %JSONCPP_VERSION%
-
-# Using the PROJECT_BRIEF tag one can provide an optional one line description
-# for a project that appears at the top of each page and should give viewer a
-# quick idea about the purpose of the project. Keep the description short.
-
-PROJECT_BRIEF =
-
-# With the PROJECT_LOGO tag one can specify an logo or icon that is included in
-# the documentation. The maximum height of the logo should not exceed 55 pixels
-# and the maximum width should not exceed 200 pixels. Doxygen will copy the logo
-# to the output directory.
-
-PROJECT_LOGO =
-
-# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
-# into which the generated documentation will be written. If a relative path is
-# entered, it will be relative to the location where doxygen was started. If
-# left blank the current directory will be used.
-
-OUTPUT_DIRECTORY = %DOC_TOPDIR%
-
-# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub-
-# directories (in 2 levels) under the output directory of each output format and
-# will distribute the generated files over these directories. Enabling this
-# option can be useful when feeding doxygen a huge amount of source files, where
-# putting all generated files in the same directory would otherwise causes
-# performance problems for the file system.
-# The default value is: NO.
-
-CREATE_SUBDIRS = NO
-
-# The OUTPUT_LANGUAGE tag is used to specify the language in which all
-# documentation generated by doxygen is written. Doxygen will use this
-# information to generate all constant output in the proper language.
-# Possible values are: Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-
-# Traditional, Croatian, Czech, Danish, Dutch, English, Esperanto, Farsi,
-# Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en,
-# Korean, Korean-en, Latvian, Norwegian, Macedonian, Persian, Polish,
-# Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish,
-# Turkish, Ukrainian and Vietnamese.
-# The default value is: English.
-
-OUTPUT_LANGUAGE = English
-
-# If the BRIEF_MEMBER_DESC tag is set to YES doxygen will include brief member
-# descriptions after the members that are listed in the file and class
-# documentation (similar to Javadoc). Set to NO to disable this.
-# The default value is: YES.
-
-BRIEF_MEMBER_DESC = YES
-
-# If the REPEAT_BRIEF tag is set to YES doxygen will prepend the brief
-# description of a member or function before the detailed description
-#
-# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
-# brief descriptions will be completely suppressed.
-# The default value is: YES.
-
-REPEAT_BRIEF = YES
-
-# This tag implements a quasi-intelligent brief description abbreviator that is
-# used to form the text in various listings. Each string in this list, if found
-# as the leading text of the brief description, will be stripped from the text
-# and the result, after processing the whole list, is used as the annotated
-# text. Otherwise, the brief description is used as-is. If left blank, the
-# following values are used ($name is automatically replaced with the name of
-# the entity):The $name class, The $name widget, The $name file, is, provides,
-# specifies, contains, represents, a, an and the.
-
-ABBREVIATE_BRIEF = "The $name class" \
- "The $name widget" \
- "The $name file" \
- is \
- provides \
- specifies \
- contains \
- represents \
- a \
- an \
- the
-
-# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
-# doxygen will generate a detailed section even if there is only a brief
-# description.
-# The default value is: NO.
-
-ALWAYS_DETAILED_SEC = NO
-
-# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
-# inherited members of a class in the documentation of that class as if those
-# members were ordinary class members. Constructors, destructors and assignment
-# operators of the base classes will not be shown.
-# The default value is: NO.
-
-INLINE_INHERITED_MEMB = NO
-
-# If the FULL_PATH_NAMES tag is set to YES doxygen will prepend the full path
-# before files name in the file list and in the header files. If set to NO the
-# shortest path that makes the file name unique will be used
-# The default value is: YES.
-
-FULL_PATH_NAMES = YES
-
-# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
-# Stripping is only done if one of the specified strings matches the left-hand
-# part of the path. The tag can be used to show relative paths in the file list.
-# If left blank the directory from which doxygen is run is used as the path to
-# strip.
-#
-# Note that you can specify absolute paths here, but also relative paths, which
-# will be relative from the directory where doxygen is started.
-# This tag requires that the tag FULL_PATH_NAMES is set to YES.
-
-STRIP_FROM_PATH = %TOPDIR%
-
-# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
-# path mentioned in the documentation of a class, which tells the reader which
-# header file to include in order to use a class. If left blank only the name of
-# the header file containing the class definition is used. Otherwise one should
-# specify the list of include paths that are normally passed to the compiler
-# using the -I flag.
-
-STRIP_FROM_INC_PATH = %TOPDIR%/include
-
-# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
-# less readable) file names. This can be useful is your file systems doesn't
-# support long names like on DOS, Mac, or CD-ROM.
-# The default value is: NO.
-
-SHORT_NAMES = NO
-
-# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
-# first line (until the first dot) of a Javadoc-style comment as the brief
-# description. If set to NO, the Javadoc-style will behave just like regular Qt-
-# style comments (thus requiring an explicit @brief command for a brief
-# description.)
-# The default value is: NO.
-
-JAVADOC_AUTOBRIEF = YES
-
-# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
-# line (until the first dot) of a Qt-style comment as the brief description. If
-# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
-# requiring an explicit \brief command for a brief description.)
-# The default value is: NO.
-
-QT_AUTOBRIEF = NO
-
-# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
-# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
-# a brief description. This used to be the default behavior. The new default is
-# to treat a multi-line C++ comment block as a detailed description. Set this
-# tag to YES if you prefer the old behavior instead.
-#
-# Note that setting this tag to YES also means that rational rose comments are
-# not recognized any more.
-# The default value is: NO.
-
-MULTILINE_CPP_IS_BRIEF = NO
-
-# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
-# documentation from any documented member that it re-implements.
-# The default value is: YES.
-
-INHERIT_DOCS = YES
-
-# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce a
-# new page for each member. If set to NO, the documentation of a member will be
-# part of the file/class/namespace that contains it.
-# The default value is: NO.
-
-SEPARATE_MEMBER_PAGES = NO
-
-# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
-# uses this value to replace tabs by spaces in code fragments.
-# Minimum value: 1, maximum value: 16, default value: 4.
-
-TAB_SIZE = 3
-
-# This tag can be used to specify a number of aliases that act as commands in
-# the documentation. An alias has the form:
-# name=value
-# For example adding
-# "sideeffect=@par Side Effects:\n"
-# will allow you to put the command \sideeffect (or @sideeffect) in the
-# documentation, which will result in a user-defined paragraph with heading
-# "Side Effects:". You can put \n's in the value part of an alias to insert
-# newlines.
-
-ALIASES = "testCaseSetup=\link CppUT::TestCase::setUp() setUp()\endlink" \
- "testCaseRun=\link CppUT::TestCase::run() run()\endlink" \
- "testCaseTearDown=\link CppUT::TestCase::tearDown() tearDown()\endlink" \
- "json_ref=<a HREF='http://www.json.org/'>JSON (JavaScript Object Notation)</a>"
-
-# This tag can be used to specify a number of word-keyword mappings (TCL only).
-# A mapping has the form "name=value". For example adding "class=itcl::class"
-# will allow you to use the command class in the itcl::class meaning.
-
-TCL_SUBST =
-
-# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
-# only. Doxygen will then generate output that is more tailored for C. For
-# instance, some of the names that are used will be different. The list of all
-# members will be omitted, etc.
-# The default value is: NO.
-
-OPTIMIZE_OUTPUT_FOR_C = NO
-
-# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
-# Python sources only. Doxygen will then generate output that is more tailored
-# for that language. For instance, namespaces will be presented as packages,
-# qualified scopes will look different, etc.
-# The default value is: NO.
-
-OPTIMIZE_OUTPUT_JAVA = NO
-
-# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
-# sources. Doxygen will then generate output that is tailored for Fortran.
-# The default value is: NO.
-
-OPTIMIZE_FOR_FORTRAN = NO
-
-# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
-# sources. Doxygen will then generate output that is tailored for VHDL.
-# The default value is: NO.
-
-OPTIMIZE_OUTPUT_VHDL = NO
-
-# Doxygen selects the parser to use depending on the extension of the files it
-# parses. With this tag you can assign which parser to use for a given
-# extension. Doxygen has a built-in mapping, but you can override or extend it
-# using this tag. The format is ext=language, where ext is a file extension, and
-# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
-# C#, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL. For instance to make
-# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C
-# (default is Fortran), use: inc=Fortran f=C.
-#
-# Note For files without extension you can use no_extension as a placeholder.
-#
-# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
-# the files are not read by doxygen.
-
-EXTENSION_MAPPING =
-
-# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
-# according to the Markdown format, which allows for more readable
-# documentation. See http://daringfireball.net/projects/markdown/ for details.
-# The output of markdown processing is further processed by doxygen, so you can
-# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
-# case of backward compatibilities issues.
-# The default value is: YES.
-
-MARKDOWN_SUPPORT = YES
-
-# When enabled doxygen tries to link words that correspond to documented
-# classes, or namespaces to their corresponding documentation. Such a link can
-# be prevented in individual cases by by putting a % sign in front of the word
-# or globally by setting AUTOLINK_SUPPORT to NO.
-# The default value is: YES.
-
-AUTOLINK_SUPPORT = YES
-
-# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
-# to include (a tag file for) the STL sources as input, then you should set this
-# tag to YES in order to let doxygen match functions declarations and
-# definitions whose arguments contain STL classes (e.g. func(std::string);
-# versus func(std::string) {}). This also make the inheritance and collaboration
-# diagrams that involve STL classes more complete and accurate.
-# The default value is: NO.
-
-BUILTIN_STL_SUPPORT = YES
-
-# If you use Microsoft's C++/CLI language, you should set this option to YES to
-# enable parsing support.
-# The default value is: NO.
-
-CPP_CLI_SUPPORT = NO
-
-# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
-# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen
-# will parse them like normal C++ but will assume all classes use public instead
-# of private inheritance when no explicit protection keyword is present.
-# The default value is: NO.
-
-SIP_SUPPORT = NO
-
-# For Microsoft's IDL there are propget and propput attributes to indicate
-# getter and setter methods for a property. Setting this option to YES will make
-# doxygen to replace the get and set methods by a property in the documentation.
-# This will only work if the methods are indeed getting or setting a simple
-# type. If this is not the case, or you want to show the methods anyway, you
-# should set this option to NO.
-# The default value is: YES.
-
-IDL_PROPERTY_SUPPORT = YES
-
-# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
-# tag is set to YES, then doxygen will reuse the documentation of the first
-# member in the group (if any) for the other members of the group. By default
-# all members of a group must be documented explicitly.
-# The default value is: NO.
-
-DISTRIBUTE_GROUP_DOC = NO
-
-# Set the SUBGROUPING tag to YES to allow class member groups of the same type
-# (for instance a group of public functions) to be put as a subgroup of that
-# type (e.g. under the Public Functions section). Set it to NO to prevent
-# subgrouping. Alternatively, this can be done per class using the
-# \nosubgrouping command.
-# The default value is: YES.
-
-SUBGROUPING = YES
-
-# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
-# are shown inside the group in which they are included (e.g. using \ingroup)
-# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
-# and RTF).
-#
-# Note that this feature does not work in combination with
-# SEPARATE_MEMBER_PAGES.
-# The default value is: NO.
-
-INLINE_GROUPED_CLASSES = NO
-
-# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
-# with only public data fields or simple typedef fields will be shown inline in
-# the documentation of the scope in which they are defined (i.e. file,
-# namespace, or group documentation), provided this scope is documented. If set
-# to NO, structs, classes, and unions are shown on a separate page (for HTML and
-# Man pages) or section (for LaTeX and RTF).
-# The default value is: NO.
-
-INLINE_SIMPLE_STRUCTS = NO
-
-# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
-# enum is documented as struct, union, or enum with the name of the typedef. So
-# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
-# with name TypeT. When disabled the typedef will appear as a member of a file,
-# namespace, or class. And the struct will be named TypeS. This can typically be
-# useful for C code in case the coding convention dictates that all compound
-# types are typedef'ed and only the typedef is referenced, never the tag name.
-# The default value is: NO.
-
-TYPEDEF_HIDES_STRUCT = NO
-
-# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
-# cache is used to resolve symbols given their name and scope. Since this can be
-# an expensive process and often the same symbol appears multiple times in the
-# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
-# doxygen will become slower. If the cache is too large, memory is wasted. The
-# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
-# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
-# symbols. At the end of a run doxygen will report the cache usage and suggest
-# the optimal cache size from a speed point of view.
-# Minimum value: 0, maximum value: 9, default value: 0.
-
-LOOKUP_CACHE_SIZE = 0
-
-#---------------------------------------------------------------------------
-# Build related configuration options
-#---------------------------------------------------------------------------
-
-# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
-# documentation are documented, even if no documentation was available. Private
-# class members and static file members will be hidden unless the
-# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
-# Note: This will also disable the warnings about undocumented members that are
-# normally produced when WARNINGS is set to YES.
-# The default value is: NO.
-
-EXTRACT_ALL = YES
-
-# If the EXTRACT_PRIVATE tag is set to YES all private members of a class will
-# be included in the documentation.
-# The default value is: NO.
-
-EXTRACT_PRIVATE = NO
-
-# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal
-# scope will be included in the documentation.
-# The default value is: NO.
-
-EXTRACT_PACKAGE = NO
-
-# If the EXTRACT_STATIC tag is set to YES all static members of a file will be
-# included in the documentation.
-# The default value is: NO.
-
-EXTRACT_STATIC = YES
-
-# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) defined
-# locally in source files will be included in the documentation. If set to NO
-# only classes defined in header files are included. Does not have any effect
-# for Java sources.
-# The default value is: YES.
-
-EXTRACT_LOCAL_CLASSES = NO
-
-# This flag is only useful for Objective-C code. When set to YES local methods,
-# which are defined in the implementation section but not in the interface are
-# included in the documentation. If set to NO only methods in the interface are
-# included.
-# The default value is: NO.
-
-EXTRACT_LOCAL_METHODS = NO
-
-# If this flag is set to YES, the members of anonymous namespaces will be
-# extracted and appear in the documentation as a namespace called
-# 'anonymous_namespace{file}', where file will be replaced with the base name of
-# the file that contains the anonymous namespace. By default anonymous namespace
-# are hidden.
-# The default value is: NO.
-
-EXTRACT_ANON_NSPACES = NO
-
-# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
-# undocumented members inside documented classes or files. If set to NO these
-# members will be included in the various overviews, but no documentation
-# section is generated. This option has no effect if EXTRACT_ALL is enabled.
-# The default value is: NO.
-
-HIDE_UNDOC_MEMBERS = NO
-
-# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
-# undocumented classes that are normally visible in the class hierarchy. If set
-# to NO these classes will be included in the various overviews. This option has
-# no effect if EXTRACT_ALL is enabled.
-# The default value is: NO.
-
-HIDE_UNDOC_CLASSES = NO
-
-# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
-# (class|struct|union) declarations. If set to NO these declarations will be
-# included in the documentation.
-# The default value is: NO.
-
-HIDE_FRIEND_COMPOUNDS = NO
-
-# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
-# documentation blocks found inside the body of a function. If set to NO these
-# blocks will be appended to the function's detailed documentation block.
-# The default value is: NO.
-
-HIDE_IN_BODY_DOCS = NO
-
-# The INTERNAL_DOCS tag determines if documentation that is typed after a
-# \internal command is included. If the tag is set to NO then the documentation
-# will be excluded. Set it to YES to include the internal documentation.
-# The default value is: NO.
-
-INTERNAL_DOCS = YES
-
-# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
-# names in lower-case letters. If set to YES upper-case letters are also
-# allowed. This is useful if you have classes or files whose names only differ
-# in case and if your file system supports case sensitive file names. Windows
-# and Mac users are advised to set this option to NO.
-# The default value is: system dependent.
-
-CASE_SENSE_NAMES = NO
-
-# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
-# their full class and namespace scopes in the documentation. If set to YES the
-# scope will be hidden.
-# The default value is: NO.
-
-HIDE_SCOPE_NAMES = NO
-
-# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
-# the files that are included by a file in the documentation of that file.
-# The default value is: YES.
-
-SHOW_INCLUDE_FILES = YES
-
-# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
-# files with double quotes in the documentation rather than with sharp brackets.
-# The default value is: NO.
-
-FORCE_LOCAL_INCLUDES = NO
-
-# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
-# documentation for inline members.
-# The default value is: YES.
-
-INLINE_INFO = YES
-
-# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
-# (detailed) documentation of file and class members alphabetically by member
-# name. If set to NO the members will appear in declaration order.
-# The default value is: YES.
-
-SORT_MEMBER_DOCS = YES
-
-# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
-# descriptions of file, namespace and class members alphabetically by member
-# name. If set to NO the members will appear in declaration order.
-# The default value is: NO.
-
-SORT_BRIEF_DOCS = NO
-
-# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
-# (brief and detailed) documentation of class members so that constructors and
-# destructors are listed first. If set to NO the constructors will appear in the
-# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
-# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
-# member documentation.
-# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
-# detailed member documentation.
-# The default value is: NO.
-
-SORT_MEMBERS_CTORS_1ST = NO
-
-# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
-# of group names into alphabetical order. If set to NO the group names will
-# appear in their defined order.
-# The default value is: NO.
-
-SORT_GROUP_NAMES = NO
-
-# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
-# fully-qualified names, including namespaces. If set to NO, the class list will
-# be sorted only by class name, not including the namespace part.
-# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
-# Note: This option applies only to the class list, not to the alphabetical
-# list.
-# The default value is: NO.
-
-SORT_BY_SCOPE_NAME = YES
-
-# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
-# type resolution of all parameters of a function it will reject a match between
-# the prototype and the implementation of a member function even if there is
-# only one candidate or it is obvious which candidate to choose by doing a
-# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
-# accept a match between prototype and implementation in such cases.
-# The default value is: NO.
-
-STRICT_PROTO_MATCHING = NO
-
-# The GENERATE_TODOLIST tag can be used to enable ( YES) or disable ( NO) the
-# todo list. This list is created by putting \todo commands in the
-# documentation.
-# The default value is: YES.
-
-GENERATE_TODOLIST = YES
-
-# The GENERATE_TESTLIST tag can be used to enable ( YES) or disable ( NO) the
-# test list. This list is created by putting \test commands in the
-# documentation.
-# The default value is: YES.
-
-GENERATE_TESTLIST = NO
-
-# The GENERATE_BUGLIST tag can be used to enable ( YES) or disable ( NO) the bug
-# list. This list is created by putting \bug commands in the documentation.
-# The default value is: YES.
-
-GENERATE_BUGLIST = NO
-
-# The GENERATE_DEPRECATEDLIST tag can be used to enable ( YES) or disable ( NO)
-# the deprecated list. This list is created by putting \deprecated commands in
-# the documentation.
-# The default value is: YES.
-
-GENERATE_DEPRECATEDLIST= YES
-
-# The ENABLED_SECTIONS tag can be used to enable conditional documentation
-# sections, marked by \if <section_label> ... \endif and \cond <section_label>
-# ... \endcond blocks.
-
-ENABLED_SECTIONS =
-
-# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
-# initial value of a variable or macro / define can have for it to appear in the
-# documentation. If the initializer consists of more lines than specified here
-# it will be hidden. Use a value of 0 to hide initializers completely. The
-# appearance of the value of individual variables and macros / defines can be
-# controlled using \showinitializer or \hideinitializer command in the
-# documentation regardless of this setting.
-# Minimum value: 0, maximum value: 10000, default value: 30.
-
-MAX_INITIALIZER_LINES = 30
-
-# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
-# the bottom of the documentation of classes and structs. If set to YES the list
-# will mention the files that were used to generate the documentation.
-# The default value is: YES.
-
-SHOW_USED_FILES = YES
-
-# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
-# will remove the Files entry from the Quick Index and from the Folder Tree View
-# (if specified).
-# The default value is: YES.
-
-SHOW_FILES = YES
-
-# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
-# page. This will remove the Namespaces entry from the Quick Index and from the
-# Folder Tree View (if specified).
-# The default value is: YES.
-
-SHOW_NAMESPACES = YES
-
-# The FILE_VERSION_FILTER tag can be used to specify a program or script that
-# doxygen should invoke to get the current version for each file (typically from
-# the version control system). Doxygen will invoke the program by executing (via
-# popen()) the command command input-file, where command is the value of the
-# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
-# by doxygen. Whatever the program writes to standard output is used as the file
-# version. For an example see the documentation.
-
-FILE_VERSION_FILTER =
-
-# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
-# by doxygen. The layout file controls the global structure of the generated
-# output files in an output format independent way. To create the layout file
-# that represents doxygen's defaults, run doxygen with the -l option. You can
-# optionally specify a file name after the option, if omitted DoxygenLayout.xml
-# will be used as the name of the layout file.
-#
-# Note that if you run doxygen from a directory containing a file called
-# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
-# tag is left empty.
-
-LAYOUT_FILE =
-
-# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
-# the reference definitions. This must be a list of .bib files. The .bib
-# extension is automatically appended if omitted. This requires the bibtex tool
-# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.
-# For LaTeX the style of the bibliography can be controlled using
-# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
-# search path. Do not use file names with spaces, bibtex cannot handle them. See
-# also \cite for info how to create references.
-
-CITE_BIB_FILES =
-
-#---------------------------------------------------------------------------
-# Configuration options related to warning and progress messages
-#---------------------------------------------------------------------------
-
-# The QUIET tag can be used to turn on/off the messages that are generated to
-# standard output by doxygen. If QUIET is set to YES this implies that the
-# messages are off.
-# The default value is: NO.
-
-QUIET = NO
-
-# The WARNINGS tag can be used to turn on/off the warning messages that are
-# generated to standard error ( stderr) by doxygen. If WARNINGS is set to YES
-# this implies that the warnings are on.
-#
-# Tip: Turn warnings on while writing the documentation.
-# The default value is: YES.
-
-WARNINGS = YES
-
-# If the WARN_IF_UNDOCUMENTED tag is set to YES, then doxygen will generate
-# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
-# will automatically be disabled.
-# The default value is: YES.
-
-WARN_IF_UNDOCUMENTED = YES
-
-# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
-# potential errors in the documentation, such as not documenting some parameters
-# in a documented function, or documenting parameters that don't exist or using
-# markup commands wrongly.
-# The default value is: YES.
-
-WARN_IF_DOC_ERROR = YES
-
-# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
-# are documented, but have no documentation for their parameters or return
-# value. If set to NO doxygen will only warn about wrong or incomplete parameter
-# documentation, but not about the absence of documentation.
-# The default value is: NO.
-
-WARN_NO_PARAMDOC = NO
-
-# The WARN_FORMAT tag determines the format of the warning messages that doxygen
-# can produce. The string should contain the $file, $line, and $text tags, which
-# will be replaced by the file and line number from which the warning originated
-# and the warning text. Optionally the format may contain $version, which will
-# be replaced by the version of the file (if it could be obtained via
-# FILE_VERSION_FILTER)
-# The default value is: $file:$line: $text.
-
-WARN_FORMAT = "$file:$line: $text"
-
-# The WARN_LOGFILE tag can be used to specify a file to which warning and error
-# messages should be written. If left blank the output is written to standard
-# error (stderr).
-
-WARN_LOGFILE = %WARNING_LOG_PATH%
-
-#---------------------------------------------------------------------------
-# Configuration options related to the input files
-#---------------------------------------------------------------------------
-
-# The INPUT tag is used to specify the files and/or directories that contain
-# documented source files. You may enter file names like myfile.cpp or
-# directories like /usr/src/myproject. Separate the files or directories with
-# spaces.
-# Note: If this tag is empty the current directory is searched.
-
-INPUT = ../include \
- ../src/lib_json \
- .
-
-# This tag can be used to specify the character encoding of the source files
-# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
-# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
-# documentation (see: http://www.gnu.org/software/libiconv) for the list of
-# possible encodings.
-# The default value is: UTF-8.
-
-INPUT_ENCODING = UTF-8
-
-# If the value of the INPUT tag contains directories, you can use the
-# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
-# *.h) to filter out the source-files in the directories. If left blank the
-# following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii,
-# *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp,
-# *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown,
-# *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf,
-# *.qsf, *.as and *.js.
-
-FILE_PATTERNS = *.h \
- *.cpp \
- *.inl \
- *.dox
-
-# The RECURSIVE tag can be used to specify whether or not subdirectories should
-# be searched for input files as well.
-# The default value is: NO.
-
-RECURSIVE = YES
-
-# The EXCLUDE tag can be used to specify files and/or directories that should be
-# excluded from the INPUT source files. This way you can easily exclude a
-# subdirectory from a directory tree whose root is specified with the INPUT tag.
-#
-# Note that relative paths are relative to the directory from which doxygen is
-# run.
-
-EXCLUDE =
-
-# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
-# directories that are symbolic links (a Unix file system feature) are excluded
-# from the input.
-# The default value is: NO.
-
-EXCLUDE_SYMLINKS = NO
-
-# If the value of the INPUT tag contains directories, you can use the
-# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
-# certain files from those directories.
-#
-# Note that the wildcards are matched against the file with absolute path, so to
-# exclude all test directories for example use the pattern */test/*
-
-EXCLUDE_PATTERNS =
-
-# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
-# (namespaces, classes, functions, etc.) that should be excluded from the
-# output. The symbol name can be a fully qualified name, a word, or if the
-# wildcard * is used, a substring. Examples: ANamespace, AClass,
-# AClass::ANamespace, ANamespace::*Test
-#
-# Note that the wildcards are matched against the file with absolute path, so to
-# exclude all test directories use the pattern */test/*
-
-EXCLUDE_SYMBOLS =
-
-# The EXAMPLE_PATH tag can be used to specify one or more files or directories
-# that contain example code fragments that are included (see the \include
-# command).
-
-EXAMPLE_PATH = ..
-
-# If the value of the EXAMPLE_PATH tag contains directories, you can use the
-# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
-# *.h) to filter out the source-files in the directories. If left blank all
-# files are included.
-
-EXAMPLE_PATTERNS = *
-
-# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
-# searched for input files to be used with the \include or \dontinclude commands
-# irrespective of the value of the RECURSIVE tag.
-# The default value is: NO.
-
-EXAMPLE_RECURSIVE = NO
-
-# The IMAGE_PATH tag can be used to specify one or more files or directories
-# that contain images that are to be included in the documentation (see the
-# \image command).
-
-IMAGE_PATH =
-
-# The INPUT_FILTER tag can be used to specify a program that doxygen should
-# invoke to filter for each input file. Doxygen will invoke the filter program
-# by executing (via popen()) the command:
-#
-# <filter> <input-file>
-#
-# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
-# name of an input file. Doxygen will then use the output that the filter
-# program writes to standard output. If FILTER_PATTERNS is specified, this tag
-# will be ignored.
-#
-# Note that the filter must not add or remove lines; it is applied before the
-# code is scanned, but not when the output code is generated. If lines are added
-# or removed, the anchors will not be placed correctly.
-
-INPUT_FILTER =
-
-# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
-# basis. Doxygen will compare the file name with each pattern and apply the
-# filter if there is a match. The filters are a list of the form: pattern=filter
-# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
-# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
-# patterns match the file name, INPUT_FILTER is applied.
-
-FILTER_PATTERNS =
-
-# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
-# INPUT_FILTER ) will also be used to filter the input files that are used for
-# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
-# The default value is: NO.
-
-FILTER_SOURCE_FILES = NO
-
-# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
-# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
-# it is also possible to disable source filtering for a specific pattern using
-# *.ext= (so without naming a filter).
-# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
-
-FILTER_SOURCE_PATTERNS =
-
-# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
-# is part of the input, its contents will be placed on the main page
-# (index.html). This can be useful if you have a project on for instance GitHub
-# and want to reuse the introduction page also for the doxygen output.
-
-USE_MDFILE_AS_MAINPAGE =
-
-#---------------------------------------------------------------------------
-# Configuration options related to source browsing
-#---------------------------------------------------------------------------
-
-# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
-# generated. Documented entities will be cross-referenced with these sources.
-#
-# Note: To get rid of all source code in the generated output, make sure that
-# also VERBATIM_HEADERS is set to NO.
-# The default value is: NO.
-
-SOURCE_BROWSER = YES
-
-# Setting the INLINE_SOURCES tag to YES will include the body of functions,
-# classes and enums directly into the documentation.
-# The default value is: NO.
-
-INLINE_SOURCES = NO
-
-# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
-# special comment blocks from generated source code fragments. Normal C, C++ and
-# Fortran comments will always remain visible.
-# The default value is: YES.
-
-STRIP_CODE_COMMENTS = YES
-
-# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
-# function all documented functions referencing it will be listed.
-# The default value is: NO.
-
-REFERENCED_BY_RELATION = YES
-
-# If the REFERENCES_RELATION tag is set to YES then for each documented function
-# all documented entities called/used by that function will be listed.
-# The default value is: NO.
-
-REFERENCES_RELATION = YES
-
-# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
-# to YES, then the hyperlinks from functions in REFERENCES_RELATION and
-# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
-# link to the documentation.
-# The default value is: YES.
-
-REFERENCES_LINK_SOURCE = YES
-
-# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
-# source code will show a tooltip with additional information such as prototype,
-# brief description and links to the definition and documentation. Since this
-# will make the HTML file larger and loading of large files a bit slower, you
-# can opt to disable this feature.
-# The default value is: YES.
-# This tag requires that the tag SOURCE_BROWSER is set to YES.
-
-SOURCE_TOOLTIPS = YES
-
-# If the USE_HTAGS tag is set to YES then the references to source code will
-# point to the HTML generated by the htags(1) tool instead of doxygen built-in
-# source browser. The htags tool is part of GNU's global source tagging system
-# (see http://www.gnu.org/software/global/global.html). You will need version
-# 4.8.6 or higher.
-#
-# To use it do the following:
-# - Install the latest version of global
-# - Enable SOURCE_BROWSER and USE_HTAGS in the config file
-# - Make sure the INPUT points to the root of the source tree
-# - Run doxygen as normal
-#
-# Doxygen will invoke htags (and that will in turn invoke gtags), so these
-# tools must be available from the command line (i.e. in the search path).
-#
-# The result: instead of the source browser generated by doxygen, the links to
-# source code will now point to the output of htags.
-# The default value is: NO.
-# This tag requires that the tag SOURCE_BROWSER is set to YES.
-
-USE_HTAGS = NO
-
-# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
-# verbatim copy of the header file for each class for which an include is
-# specified. Set to NO to disable this.
-# See also: Section \class.
-# The default value is: YES.
-
-VERBATIM_HEADERS = YES
-
-#---------------------------------------------------------------------------
-# Configuration options related to the alphabetical class index
-#---------------------------------------------------------------------------
-
-# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
-# compounds will be generated. Enable this if the project contains a lot of
-# classes, structs, unions or interfaces.
-# The default value is: YES.
-
-ALPHABETICAL_INDEX = NO
-
-# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
-# which the alphabetical index list will be split.
-# Minimum value: 1, maximum value: 20, default value: 5.
-# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
-
-COLS_IN_ALPHA_INDEX = 5
-
-# In case all classes in a project start with a common prefix, all classes will
-# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
-# can be used to specify a prefix (or a list of prefixes) that should be ignored
-# while generating the index headers.
-# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
-
-IGNORE_PREFIX =
-
-#---------------------------------------------------------------------------
-# Configuration options related to the HTML output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_HTML tag is set to YES doxygen will generate HTML output
-# The default value is: YES.
-
-GENERATE_HTML = YES
-
-# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
-# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
-# it.
-# The default directory is: html.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_OUTPUT = %HTML_OUTPUT%
-
-# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
-# generated HTML page (for example: .htm, .php, .asp).
-# The default value is: .html.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_FILE_EXTENSION = .html
-
-# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
-# each generated HTML page. If the tag is left blank doxygen will generate a
-# standard header.
-#
-# To get valid HTML the header file that includes any scripts and style sheets
-# that doxygen needs, which is dependent on the configuration options used (e.g.
-# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
-# default header using
-# doxygen -w html new_header.html new_footer.html new_stylesheet.css
-# YourConfigFile
-# and then modify the file new_header.html. See also section "Doxygen usage"
-# for information on how to generate the default header that doxygen normally
-# uses.
-# Note: The header is subject to change so you typically have to regenerate the
-# default header when upgrading to a newer version of doxygen. For a description
-# of the possible markers and block names see the documentation.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_HEADER = header.html
-
-# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
-# generated HTML page. If the tag is left blank doxygen will generate a standard
-# footer. See HTML_HEADER for more information on how to generate a default
-# footer and what special commands can be used inside the footer. See also
-# section "Doxygen usage" for information on how to generate the default footer
-# that doxygen normally uses.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_FOOTER = footer.html
-
-# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
-# sheet that is used by each HTML page. It can be used to fine-tune the look of
-# the HTML output. If left blank doxygen will generate a default style sheet.
-# See also section "Doxygen usage" for information on how to generate the style
-# sheet that doxygen normally uses.
-# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
-# it is more robust and this tag (HTML_STYLESHEET) will in the future become
-# obsolete.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_STYLESHEET =
-
-# The HTML_EXTRA_STYLESHEET tag can be used to specify an additional user-
-# defined cascading style sheet that is included after the standard style sheets
-# created by doxygen. Using this option one can overrule certain style aspects.
-# This is preferred over using HTML_STYLESHEET since it does not replace the
-# standard style sheet and is therefor more robust against future updates.
-# Doxygen will copy the style sheet file to the output directory. For an example
-# see the documentation.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_EXTRA_STYLESHEET =
-
-# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
-# other source files which should be copied to the HTML output directory. Note
-# that these files will be copied to the base HTML output directory. Use the
-# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
-# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
-# files will be copied as-is; there are no commands or markers available.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_EXTRA_FILES =
-
-# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
-# will adjust the colors in the stylesheet and background images according to
-# this color. Hue is specified as an angle on a colorwheel, see
-# http://en.wikipedia.org/wiki/Hue for more information. For instance the value
-# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
-# purple, and 360 is red again.
-# Minimum value: 0, maximum value: 359, default value: 220.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_COLORSTYLE_HUE = 220
-
-# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
-# in the HTML output. For a value of 0 the output will use grayscales only. A
-# value of 255 will produce the most vivid colors.
-# Minimum value: 0, maximum value: 255, default value: 100.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_COLORSTYLE_SAT = 100
-
-# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
-# luminance component of the colors in the HTML output. Values below 100
-# gradually make the output lighter, whereas values above 100 make the output
-# darker. The value divided by 100 is the actual gamma applied, so 80 represents
-# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
-# change the gamma.
-# Minimum value: 40, maximum value: 240, default value: 80.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_COLORSTYLE_GAMMA = 80
-
-# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
-# page will contain the date and time when the page was generated. Setting this
-# to NO can help when comparing the output of multiple runs.
-# The default value is: YES.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_TIMESTAMP = YES
-
-# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
-# documentation will contain sections that can be hidden and shown after the
-# page has loaded.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_DYNAMIC_SECTIONS = YES
-
-# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
-# shown in the various tree structured indices initially; the user can expand
-# and collapse entries dynamically later on. Doxygen will expand the tree to
-# such a level that at most the specified number of entries are visible (unless
-# a fully collapsed tree already exceeds this amount). So setting the number of
-# entries 1 will produce a full collapsed tree by default. 0 is a special value
-# representing an infinite number of entries and will result in a full expanded
-# tree by default.
-# Minimum value: 0, maximum value: 9999, default value: 100.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_INDEX_NUM_ENTRIES = 100
-
-# If the GENERATE_DOCSET tag is set to YES, additional index files will be
-# generated that can be used as input for Apple's Xcode 3 integrated development
-# environment (see: http://developer.apple.com/tools/xcode/), introduced with
-# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a
-# Makefile in the HTML output directory. Running make will produce the docset in
-# that directory and running make install will install the docset in
-# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
-# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
-# for more information.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-GENERATE_DOCSET = NO
-
-# This tag determines the name of the docset feed. A documentation feed provides
-# an umbrella under which multiple documentation sets from a single provider
-# (such as a company or product suite) can be grouped.
-# The default value is: Doxygen generated docs.
-# This tag requires that the tag GENERATE_DOCSET is set to YES.
-
-DOCSET_FEEDNAME = "Doxygen generated docs"
-
-# This tag specifies a string that should uniquely identify the documentation
-# set bundle. This should be a reverse domain-name style string, e.g.
-# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
-# The default value is: org.doxygen.Project.
-# This tag requires that the tag GENERATE_DOCSET is set to YES.
-
-DOCSET_BUNDLE_ID = org.doxygen.Project
-
-# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
-# the documentation publisher. This should be a reverse domain-name style
-# string, e.g. com.mycompany.MyDocSet.documentation.
-# The default value is: org.doxygen.Publisher.
-# This tag requires that the tag GENERATE_DOCSET is set to YES.
-
-DOCSET_PUBLISHER_ID = org.doxygen.Publisher
-
-# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
-# The default value is: Publisher.
-# This tag requires that the tag GENERATE_DOCSET is set to YES.
-
-DOCSET_PUBLISHER_NAME = Publisher
-
-# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
-# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
-# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
-# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on
-# Windows.
-#
-# The HTML Help Workshop contains a compiler that can convert all HTML output
-# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
-# files are now used as the Windows 98 help format, and will replace the old
-# Windows help format (.hlp) on all Windows platforms in the future. Compressed
-# HTML files also contain an index, a table of contents, and you can search for
-# words in the documentation. The HTML workshop also contains a viewer for
-# compressed HTML files.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-GENERATE_HTMLHELP = %HTML_HELP%
-
-# The CHM_FILE tag can be used to specify the file name of the resulting .chm
-# file. You can add a path in front of the file if the result should not be
-# written to the html output directory.
-# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
-
-CHM_FILE = jsoncpp-%JSONCPP_VERSION%.chm
-
-# The HHC_LOCATION tag can be used to specify the location (absolute path
-# including file name) of the HTML help compiler ( hhc.exe). If non-empty
-# doxygen will try to run the HTML help compiler on the generated index.hhp.
-# The file has to be specified with full path.
-# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
-
-HHC_LOCATION = "c:\Program Files\HTML Help Workshop\hhc.exe"
-
-# The GENERATE_CHI flag controls if a separate .chi index file is generated (
-# YES) or that it should be included in the master .chm file ( NO).
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
-
-GENERATE_CHI = YES
-
-# The CHM_INDEX_ENCODING is used to encode HtmlHelp index ( hhk), content ( hhc)
-# and project file content.
-# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
-
-CHM_INDEX_ENCODING =
-
-# The BINARY_TOC flag controls whether a binary table of contents is generated (
-# YES) or a normal table of contents ( NO) in the .chm file.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
-
-BINARY_TOC = YES
-
-# The TOC_EXPAND flag can be set to YES to add extra items for group members to
-# the table of contents of the HTML help documentation and to the tree view.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
-
-TOC_EXPAND = YES
-
-# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
-# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
-# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
-# (.qch) of the generated HTML documentation.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-GENERATE_QHP = NO
-
-# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
-# the file name of the resulting .qch file. The path specified is relative to
-# the HTML output folder.
-# This tag requires that the tag GENERATE_QHP is set to YES.
-
-QCH_FILE =
-
-# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
-# Project output. For more information please see Qt Help Project / Namespace
-# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace).
-# The default value is: org.doxygen.Project.
-# This tag requires that the tag GENERATE_QHP is set to YES.
-
-QHP_NAMESPACE =
-
-# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
-# Help Project output. For more information please see Qt Help Project / Virtual
-# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-
-# folders).
-# The default value is: doc.
-# This tag requires that the tag GENERATE_QHP is set to YES.
-
-QHP_VIRTUAL_FOLDER = doc
-
-# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
-# filter to add. For more information please see Qt Help Project / Custom
-# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
-# filters).
-# This tag requires that the tag GENERATE_QHP is set to YES.
-
-QHP_CUST_FILTER_NAME =
-
-# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
-# custom filter to add. For more information please see Qt Help Project / Custom
-# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
-# filters).
-# This tag requires that the tag GENERATE_QHP is set to YES.
-
-QHP_CUST_FILTER_ATTRS =
-
-# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
-# project's filter section matches. Qt Help Project / Filter Attributes (see:
-# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).
-# This tag requires that the tag GENERATE_QHP is set to YES.
-
-QHP_SECT_FILTER_ATTRS =
-
-# The QHG_LOCATION tag can be used to specify the location of Qt's
-# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
-# generated .qhp file.
-# This tag requires that the tag GENERATE_QHP is set to YES.
-
-QHG_LOCATION =
-
-# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
-# generated, together with the HTML files, they form an Eclipse help plugin. To
-# install this plugin and make it available under the help contents menu in
-# Eclipse, the contents of the directory containing the HTML and XML files needs
-# to be copied into the plugins directory of eclipse. The name of the directory
-# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
-# After copying Eclipse needs to be restarted before the help appears.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-GENERATE_ECLIPSEHELP = NO
-
-# A unique identifier for the Eclipse help plugin. When installing the plugin
-# the directory name containing the HTML and XML files should also have this
-# name. Each documentation set should have its own identifier.
-# The default value is: org.doxygen.Project.
-# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
-
-ECLIPSE_DOC_ID = org.doxygen.Project
-
-# If you want full control over the layout of the generated HTML pages it might
-# be necessary to disable the index and replace it with your own. The
-# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
-# of each HTML page. A value of NO enables the index and the value YES disables
-# it. Since the tabs in the index contain the same information as the navigation
-# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-DISABLE_INDEX = NO
-
-# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
-# structure should be generated to display hierarchical information. If the tag
-# value is set to YES, a side panel will be generated containing a tree-like
-# index structure (just like the one that is generated for HTML Help). For this
-# to work a browser that supports JavaScript, DHTML, CSS and frames is required
-# (i.e. any modern browser). Windows users are probably better off using the
-# HTML help feature. Via custom stylesheets (see HTML_EXTRA_STYLESHEET) one can
-# further fine-tune the look of the index. As an example, the default style
-# sheet generated by doxygen has an example that shows how to put an image at
-# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
-# the same information as the tab index, you could consider setting
-# DISABLE_INDEX to YES when enabling this option.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-GENERATE_TREEVIEW = NO
-
-# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
-# doxygen will group on one line in the generated HTML documentation.
-#
-# Note that a value of 0 will completely suppress the enum values from appearing
-# in the overview section.
-# Minimum value: 0, maximum value: 20, default value: 4.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-ENUM_VALUES_PER_LINE = 4
-
-# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
-# to set the initial width (in pixels) of the frame in which the tree is shown.
-# Minimum value: 0, maximum value: 1500, default value: 250.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-TREEVIEW_WIDTH = 250
-
-# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open links to
-# external symbols imported via tag files in a separate window.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-EXT_LINKS_IN_WINDOW = NO
-
-# Use this tag to change the font size of LaTeX formulas included as images in
-# the HTML documentation. When you change the font size after a successful
-# doxygen run you need to manually remove any form_*.png images from the HTML
-# output directory to force them to be regenerated.
-# Minimum value: 8, maximum value: 50, default value: 10.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-FORMULA_FONTSIZE = 10
-
-# Use the FORMULA_TRANPARENT tag to determine whether or not the images
-# generated for formulas are transparent PNGs. Transparent PNGs are not
-# supported properly for IE 6.0, but are supported on all modern browsers.
-#
-# Note that when changing this option you need to delete any form_*.png files in
-# the HTML output directory before the changes have effect.
-# The default value is: YES.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-FORMULA_TRANSPARENT = YES
-
-# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
-# http://www.mathjax.org) which uses client side Javascript for the rendering
-# instead of using prerendered bitmaps. Use this if you do not have LaTeX
-# installed or if you want to formulas look prettier in the HTML output. When
-# enabled you may also need to install MathJax separately and configure the path
-# to it using the MATHJAX_RELPATH option.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-USE_MATHJAX = NO
-
-# When MathJax is enabled you can set the default output format to be used for
-# the MathJax output. See the MathJax site (see:
-# http://docs.mathjax.org/en/latest/output.html) for more details.
-# Possible values are: HTML-CSS (which is slower, but has the best
-# compatibility), NativeMML (i.e. MathML) and SVG.
-# The default value is: HTML-CSS.
-# This tag requires that the tag USE_MATHJAX is set to YES.
-
-MATHJAX_FORMAT = HTML-CSS
-
-# When MathJax is enabled you need to specify the location relative to the HTML
-# output directory using the MATHJAX_RELPATH option. The destination directory
-# should contain the MathJax.js script. For instance, if the mathjax directory
-# is located at the same level as the HTML output directory, then
-# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
-# Content Delivery Network so you can quickly see the result without installing
-# MathJax. However, it is strongly recommended to install a local copy of
-# MathJax from http://www.mathjax.org before deployment.
-# The default value is: http://cdn.mathjax.org/mathjax/latest.
-# This tag requires that the tag USE_MATHJAX is set to YES.
-
-MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest
-
-# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
-# extension names that should be enabled during MathJax rendering. For example
-# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
-# This tag requires that the tag USE_MATHJAX is set to YES.
-
-MATHJAX_EXTENSIONS =
-
-# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
-# of code that will be used on startup of the MathJax code. See the MathJax site
-# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
-# example see the documentation.
-# This tag requires that the tag USE_MATHJAX is set to YES.
-
-MATHJAX_CODEFILE =
-
-# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
-# the HTML output. The underlying search engine uses javascript and DHTML and
-# should work on any modern browser. Note that when using HTML help
-# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
-# there is already a search function so this one should typically be disabled.
-# For large projects the javascript based search engine can be slow, then
-# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
-# search using the keyboard; to jump to the search box use <access key> + S
-# (what the <access key> is depends on the OS and browser, but it is typically
-# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
-# key> to jump into the search results window, the results can be navigated
-# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
-# the search. The filter options can be selected when the cursor is inside the
-# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
-# to select a filter and <Enter> or <escape> to activate or cancel the filter
-# option.
-# The default value is: YES.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-SEARCHENGINE = NO
-
-# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
-# implemented using a web server instead of a web client using Javascript. There
-# are two flavours of web server based searching depending on the
-# EXTERNAL_SEARCH setting. When disabled, doxygen will generate a PHP script for
-# searching and an index file used by the script. When EXTERNAL_SEARCH is
-# enabled the indexing and searching needs to be provided by external tools. See
-# the section "External Indexing and Searching" for details.
-# The default value is: NO.
-# This tag requires that the tag SEARCHENGINE is set to YES.
-
-SERVER_BASED_SEARCH = NO
-
-# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
-# script for searching. Instead the search results are written to an XML file
-# which needs to be processed by an external indexer. Doxygen will invoke an
-# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
-# search results.
-#
-# Doxygen ships with an example indexer ( doxyindexer) and search engine
-# (doxysearch.cgi) which are based on the open source search engine library
-# Xapian (see: http://xapian.org/).
-#
-# See the section "External Indexing and Searching" for details.
-# The default value is: NO.
-# This tag requires that the tag SEARCHENGINE is set to YES.
-
-EXTERNAL_SEARCH = NO
-
-# The SEARCHENGINE_URL should point to a search engine hosted by a web server
-# which will return the search results when EXTERNAL_SEARCH is enabled.
-#
-# Doxygen ships with an example indexer ( doxyindexer) and search engine
-# (doxysearch.cgi) which are based on the open source search engine library
-# Xapian (see: http://xapian.org/). See the section "External Indexing and
-# Searching" for details.
-# This tag requires that the tag SEARCHENGINE is set to YES.
-
-SEARCHENGINE_URL =
-
-# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
-# search data is written to a file for indexing by an external tool. With the
-# SEARCHDATA_FILE tag the name of this file can be specified.
-# The default file is: searchdata.xml.
-# This tag requires that the tag SEARCHENGINE is set to YES.
-
-SEARCHDATA_FILE = searchdata.xml
-
-# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
-# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
-# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
-# projects and redirect the results back to the right project.
-# This tag requires that the tag SEARCHENGINE is set to YES.
-
-EXTERNAL_SEARCH_ID =
-
-# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
-# projects other than the one defined by this configuration file, but that are
-# all added to the same external search index. Each project needs to have a
-# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
-# to a relative location where the documentation can be found. The format is:
-# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
-# This tag requires that the tag SEARCHENGINE is set to YES.
-
-EXTRA_SEARCH_MAPPINGS =
-
-#---------------------------------------------------------------------------
-# Configuration options related to the LaTeX output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_LATEX tag is set to YES doxygen will generate LaTeX output.
-# The default value is: YES.
-
-GENERATE_LATEX = NO
-
-# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
-# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
-# it.
-# The default directory is: latex.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_OUTPUT = latex
-
-# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
-# invoked.
-#
-# Note that when enabling USE_PDFLATEX this option is only used for generating
-# bitmaps for formulas in the HTML output, but not in the Makefile that is
-# written to the output directory.
-# The default file is: latex.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_CMD_NAME = latex
-
-# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
-# index for LaTeX.
-# The default file is: makeindex.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-MAKEINDEX_CMD_NAME = makeindex
-
-# If the COMPACT_LATEX tag is set to YES doxygen generates more compact LaTeX
-# documents. This may be useful for small projects and may help to save some
-# trees in general.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-COMPACT_LATEX = NO
-
-# The PAPER_TYPE tag can be used to set the paper type that is used by the
-# printer.
-# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
-# 14 inches) and executive (7.25 x 10.5 inches).
-# The default value is: a4.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-PAPER_TYPE = a4wide
-
-# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
-# that should be included in the LaTeX output. To get the times font for
-# instance you can specify
-# EXTRA_PACKAGES=times
-# If left blank no extra packages will be included.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-EXTRA_PACKAGES =
-
-# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
-# generated LaTeX document. The header should contain everything until the first
-# chapter. If it is left blank doxygen will generate a standard header. See
-# section "Doxygen usage" for information on how to let doxygen write the
-# default header to a separate file.
-#
-# Note: Only use a user-defined header if you know what you are doing! The
-# following commands have a special meaning inside the header: $title,
-# $datetime, $date, $doxygenversion, $projectname, $projectnumber. Doxygen will
-# replace them by respectively the title of the page, the current date and time,
-# only the current date, the version number of doxygen, the project name (see
-# PROJECT_NAME), or the project number (see PROJECT_NUMBER).
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_HEADER =
-
-# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
-# generated LaTeX document. The footer should contain everything after the last
-# chapter. If it is left blank doxygen will generate a standard footer.
-#
-# Note: Only use a user-defined footer if you know what you are doing!
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_FOOTER =
-
-# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
-# other source files which should be copied to the LATEX_OUTPUT output
-# directory. Note that the files will be copied as-is; there are no commands or
-# markers available.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_EXTRA_FILES =
-
-# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
-# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
-# contain links (just like the HTML output) instead of page references. This
-# makes the output suitable for online browsing using a PDF viewer.
-# The default value is: YES.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-PDF_HYPERLINKS = NO
-
-# If the LATEX_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
-# the PDF file directly from the LaTeX files. Set this option to YES to get a
-# higher quality PDF documentation.
-# The default value is: YES.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-USE_PDFLATEX = NO
-
-# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
-# command to the generated LaTeX files. This will instruct LaTeX to keep running
-# if errors occur, instead of asking the user for help. This option is also used
-# when generating formulas in HTML.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_BATCHMODE = NO
-
-# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
-# index chapters (such as File Index, Compound Index, etc.) in the output.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_HIDE_INDICES = NO
-
-# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
-# code with syntax highlighting in the LaTeX output.
-#
-# Note that which sources are shown also depends on other settings such as
-# SOURCE_BROWSER.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_SOURCE_CODE = NO
-
-# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
-# bibliography, e.g. plainnat, or ieeetr. See
-# http://en.wikipedia.org/wiki/BibTeX and \cite for more info.
-# The default value is: plain.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_BIB_STYLE = plain
-
-#---------------------------------------------------------------------------
-# Configuration options related to the RTF output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_RTF tag is set to YES doxygen will generate RTF output. The
-# RTF output is optimized for Word 97 and may not look too pretty with other RTF
-# readers/editors.
-# The default value is: NO.
-
-GENERATE_RTF = NO
-
-# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
-# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
-# it.
-# The default directory is: rtf.
-# This tag requires that the tag GENERATE_RTF is set to YES.
-
-RTF_OUTPUT = rtf
-
-# If the COMPACT_RTF tag is set to YES doxygen generates more compact RTF
-# documents. This may be useful for small projects and may help to save some
-# trees in general.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_RTF is set to YES.
-
-COMPACT_RTF = NO
-
-# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
-# contain hyperlink fields. The RTF file will contain links (just like the HTML
-# output) instead of page references. This makes the output suitable for online
-# browsing using Word or some other Word compatible readers that support those
-# fields.
-#
-# Note: WordPad (write) and others do not support links.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_RTF is set to YES.
-
-RTF_HYPERLINKS = NO
-
-# Load stylesheet definitions from file. Syntax is similar to doxygen's config
-# file, i.e. a series of assignments. You only have to provide replacements,
-# missing definitions are set to their default value.
-#
-# See also section "Doxygen usage" for information on how to generate the
-# default style sheet that doxygen normally uses.
-# This tag requires that the tag GENERATE_RTF is set to YES.
-
-RTF_STYLESHEET_FILE =
-
-# Set optional variables used in the generation of an RTF document. Syntax is
-# similar to doxygen's config file. A template extensions file can be generated
-# using doxygen -e rtf extensionFile.
-# This tag requires that the tag GENERATE_RTF is set to YES.
-
-RTF_EXTENSIONS_FILE =
-
-#---------------------------------------------------------------------------
-# Configuration options related to the man page output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_MAN tag is set to YES doxygen will generate man pages for
-# classes and files.
-# The default value is: NO.
-
-GENERATE_MAN = NO
-
-# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
-# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
-# it. A directory man3 will be created inside the directory specified by
-# MAN_OUTPUT.
-# The default directory is: man.
-# This tag requires that the tag GENERATE_MAN is set to YES.
-
-MAN_OUTPUT = man
-
-# The MAN_EXTENSION tag determines the extension that is added to the generated
-# man pages. In case the manual section does not start with a number, the number
-# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
-# optional.
-# The default value is: .3.
-# This tag requires that the tag GENERATE_MAN is set to YES.
-
-MAN_EXTENSION = .3
-
-# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
-# will generate one additional man file for each entity documented in the real
-# man page(s). These additional files only source the real man page, but without
-# them the man command would be unable to find the correct page.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_MAN is set to YES.
-
-MAN_LINKS = NO
-
-#---------------------------------------------------------------------------
-# Configuration options related to the XML output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_XML tag is set to YES doxygen will generate an XML file that
-# captures the structure of the code including all documentation.
-# The default value is: NO.
-
-GENERATE_XML = NO
-
-# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
-# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
-# it.
-# The default directory is: xml.
-# This tag requires that the tag GENERATE_XML is set to YES.
-
-XML_OUTPUT = xml
-
-# The XML_SCHEMA tag can be used to specify a XML schema, which can be used by a
-# validating XML parser to check the syntax of the XML files.
-# This tag requires that the tag GENERATE_XML is set to YES.
-
-XML_SCHEMA =
-
-# The XML_DTD tag can be used to specify a XML DTD, which can be used by a
-# validating XML parser to check the syntax of the XML files.
-# This tag requires that the tag GENERATE_XML is set to YES.
-
-XML_DTD =
-
-# If the XML_PROGRAMLISTING tag is set to YES doxygen will dump the program
-# listings (including syntax highlighting and cross-referencing information) to
-# the XML output. Note that enabling this will significantly increase the size
-# of the XML output.
-# The default value is: YES.
-# This tag requires that the tag GENERATE_XML is set to YES.
-
-XML_PROGRAMLISTING = YES
-
-#---------------------------------------------------------------------------
-# Configuration options related to the DOCBOOK output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_DOCBOOK tag is set to YES doxygen will generate Docbook files
-# that can be used to generate PDF.
-# The default value is: NO.
-
-GENERATE_DOCBOOK = NO
-
-# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
-# front of it.
-# The default directory is: docbook.
-# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
-
-DOCBOOK_OUTPUT = docbook
-
-#---------------------------------------------------------------------------
-# Configuration options for the AutoGen Definitions output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_AUTOGEN_DEF tag is set to YES doxygen will generate an AutoGen
-# Definitions (see http://autogen.sf.net) file that captures the structure of
-# the code including all documentation. Note that this feature is still
-# experimental and incomplete at the moment.
-# The default value is: NO.
-
-GENERATE_AUTOGEN_DEF = NO
-
-#---------------------------------------------------------------------------
-# Configuration options related to the Perl module output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_PERLMOD tag is set to YES doxygen will generate a Perl module
-# file that captures the structure of the code including all documentation.
-#
-# Note that this feature is still experimental and incomplete at the moment.
-# The default value is: NO.
-
-GENERATE_PERLMOD = NO
-
-# If the PERLMOD_LATEX tag is set to YES doxygen will generate the necessary
-# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
-# output from the Perl module output.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_PERLMOD is set to YES.
-
-PERLMOD_LATEX = NO
-
-# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be nicely
-# formatted so it can be parsed by a human reader. This is useful if you want to
-# understand what is going on. On the other hand, if this tag is set to NO the
-# size of the Perl module output will be much smaller and Perl will parse it
-# just the same.
-# The default value is: YES.
-# This tag requires that the tag GENERATE_PERLMOD is set to YES.
-
-PERLMOD_PRETTY = YES
-
-# The names of the make variables in the generated doxyrules.make file are
-# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
-# so different doxyrules.make files included by the same Makefile don't
-# overwrite each other's variables.
-# This tag requires that the tag GENERATE_PERLMOD is set to YES.
-
-PERLMOD_MAKEVAR_PREFIX =
-
-#---------------------------------------------------------------------------
-# Configuration options related to the preprocessor
-#---------------------------------------------------------------------------
-
-# If the ENABLE_PREPROCESSING tag is set to YES doxygen will evaluate all
-# C-preprocessor directives found in the sources and include files.
-# The default value is: YES.
-
-ENABLE_PREPROCESSING = YES
-
-# If the MACRO_EXPANSION tag is set to YES doxygen will expand all macro names
-# in the source code. If set to NO only conditional compilation will be
-# performed. Macro expansion can be done in a controlled way by setting
-# EXPAND_ONLY_PREDEF to YES.
-# The default value is: NO.
-# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-
-MACRO_EXPANSION = YES
-
-# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
-# the macro expansion is limited to the macros specified with the PREDEFINED and
-# EXPAND_AS_DEFINED tags.
-# The default value is: NO.
-# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-
-EXPAND_ONLY_PREDEF = NO
-
-# If the SEARCH_INCLUDES tag is set to YES the includes files in the
-# INCLUDE_PATH will be searched if a #include is found.
-# The default value is: YES.
-# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-
-SEARCH_INCLUDES = YES
-
-# The INCLUDE_PATH tag can be used to specify one or more directories that
-# contain include files that are not input files but should be processed by the
-# preprocessor.
-# This tag requires that the tag SEARCH_INCLUDES is set to YES.
-
-INCLUDE_PATH = ../include
-
-# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
-# patterns (like *.h and *.hpp) to filter out the header-files in the
-# directories. If left blank, the patterns specified with FILE_PATTERNS will be
-# used.
-# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-
-INCLUDE_FILE_PATTERNS = *.h
-
-# The PREDEFINED tag can be used to specify one or more macro names that are
-# defined before the preprocessor is started (similar to the -D option of e.g.
-# gcc). The argument of the tag is a list of macros of the form: name or
-# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
-# is assumed. To prevent a macro definition from being undefined via #undef or
-# recursively expanded use the := operator instead of the = operator.
-# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-
-PREDEFINED = "_MSC_VER=1400" \
- _CPPRTTI \
- _WIN32 \
- JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
-
-# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
-# tag can be used to specify a list of macro names that should be expanded. The
-# macro definition that is found in the sources will be used. Use the PREDEFINED
-# tag if you want to use a different macro definition that overrules the
-# definition found in the source code.
-# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-
-EXPAND_AS_DEFINED =
-
-# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
-# remove all refrences to function-like macros that are alone on a line, have an
-# all uppercase name, and do not end with a semicolon. Such function macros are
-# typically used for boiler-plate code, and will confuse the parser if not
-# removed.
-# The default value is: YES.
-# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-
-SKIP_FUNCTION_MACROS = YES
-
-#---------------------------------------------------------------------------
-# Configuration options related to external references
-#---------------------------------------------------------------------------
-
-# The TAGFILES tag can be used to specify one or more tag files. For each tag
-# file the location of the external documentation should be added. The format of
-# a tag file without this location is as follows:
-# TAGFILES = file1 file2 ...
-# Adding location for the tag files is done as follows:
-# TAGFILES = file1=loc1 "file2 = loc2" ...
-# where loc1 and loc2 can be relative or absolute paths or URLs. See the
-# section "Linking to external documentation" for more information about the use
-# of tag files.
-# Note: Each tag file must have an unique name (where the name does NOT include
-# the path). If a tag file is not located in the directory in which doxygen is
-# run, you must also specify the path to the tagfile here.
-
-TAGFILES =
-
-# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
-# tag file that is based on the input files it reads. See section "Linking to
-# external documentation" for more information about the usage of tag files.
-
-GENERATE_TAGFILE =
-
-# If the ALLEXTERNALS tag is set to YES all external class will be listed in the
-# class index. If set to NO only the inherited external classes will be listed.
-# The default value is: NO.
-
-ALLEXTERNALS = NO
-
-# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed in
-# the modules index. If set to NO, only the current project's groups will be
-# listed.
-# The default value is: YES.
-
-EXTERNAL_GROUPS = YES
-
-# If the EXTERNAL_PAGES tag is set to YES all external pages will be listed in
-# the related pages index. If set to NO, only the current project's pages will
-# be listed.
-# The default value is: YES.
-
-EXTERNAL_PAGES = YES
-
-# The PERL_PATH should be the absolute path and name of the perl script
-# interpreter (i.e. the result of 'which perl').
-# The default file (with absolute path) is: /usr/bin/perl.
-
-PERL_PATH = /usr/bin/perl
-
-#---------------------------------------------------------------------------
-# Configuration options related to the dot tool
-#---------------------------------------------------------------------------
-
-# If the CLASS_DIAGRAMS tag is set to YES doxygen will generate a class diagram
-# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
-# NO turns the diagrams off. Note that this option also works with HAVE_DOT
-# disabled, but it is recommended to install and use dot, since it yields more
-# powerful graphs.
-# The default value is: YES.
-
-CLASS_DIAGRAMS = NO
-
-# You can define message sequence charts within doxygen comments using the \msc
-# command. Doxygen will then run the mscgen tool (see:
-# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
-# documentation. The MSCGEN_PATH tag allows you to specify the directory where
-# the mscgen tool resides. If left empty the tool is assumed to be found in the
-# default search path.
-
-MSCGEN_PATH =
-
-# If set to YES, the inheritance and collaboration graphs will hide inheritance
-# and usage relations if the target is undocumented or is not a class.
-# The default value is: YES.
-
-HIDE_UNDOC_RELATIONS = NO
-
-# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
-# available from the path. This tool is part of Graphviz (see:
-# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
-# Bell Labs. The other options in this section have no effect if this option is
-# set to NO
-# The default value is: NO.
-
-HAVE_DOT = %HAVE_DOT%
-
-# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
-# to run in parallel. When set to 0 doxygen will base this on the number of
-# processors available in the system. You can set it explicitly to a value
-# larger than 0 to get control over the balance between CPU load and processing
-# speed.
-# Minimum value: 0, maximum value: 32, default value: 0.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOT_NUM_THREADS = 0
-
-# When you want a differently looking font n the dot files that doxygen
-# generates you can specify the font name using DOT_FONTNAME. You need to make
-# sure dot is able to find the font, which can be done by putting it in a
-# standard location or by setting the DOTFONTPATH environment variable or by
-# setting DOT_FONTPATH to the directory containing the font.
-# The default value is: Helvetica.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOT_FONTNAME = FreeSans
-
-# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
-# dot graphs.
-# Minimum value: 4, maximum value: 24, default value: 10.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOT_FONTSIZE = 10
-
-# By default doxygen will tell dot to use the default font as specified with
-# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
-# the path where dot can find it using this tag.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOT_FONTPATH =
-
-# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
-# each documented class showing the direct and indirect inheritance relations.
-# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-CLASS_GRAPH = YES
-
-# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
-# graph for each documented class showing the direct and indirect implementation
-# dependencies (inheritance, containment, and class references variables) of the
-# class with other documented classes.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-COLLABORATION_GRAPH = YES
-
-# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
-# groups, showing the direct groups dependencies.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-GROUP_GRAPHS = YES
-
-# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
-# collaboration diagrams in a style similar to the OMG's Unified Modeling
-# Language.
-# The default value is: NO.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-UML_LOOK = %UML_LOOK%
-
-# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
-# class node. If there are many fields or methods and many nodes the graph may
-# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
-# number of items for each type to make the size more manageable. Set this to 0
-# for no limit. Note that the threshold may be exceeded by 50% before the limit
-# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
-# but if the number exceeds 15, the total amount of fields shown is limited to
-# 10.
-# Minimum value: 0, maximum value: 100, default value: 10.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-UML_LIMIT_NUM_FIELDS = 10
-
-# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
-# collaboration graphs will show the relations between templates and their
-# instances.
-# The default value is: NO.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-TEMPLATE_RELATIONS = YES
-
-# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
-# YES then doxygen will generate a graph for each documented file showing the
-# direct and indirect include dependencies of the file with other documented
-# files.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-INCLUDE_GRAPH = YES
-
-# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
-# set to YES then doxygen will generate a graph for each documented file showing
-# the direct and indirect include dependencies of the file with other documented
-# files.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-INCLUDED_BY_GRAPH = YES
-
-# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
-# dependency graph for every global function or class method.
-#
-# Note that enabling this option will significantly increase the time of a run.
-# So in most cases it will be better to enable call graphs for selected
-# functions only using the \callgraph command.
-# The default value is: NO.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-CALL_GRAPH = NO
-
-# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
-# dependency graph for every global function or class method.
-#
-# Note that enabling this option will significantly increase the time of a run.
-# So in most cases it will be better to enable caller graphs for selected
-# functions only using the \callergraph command.
-# The default value is: NO.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-CALLER_GRAPH = YES
-
-# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
-# hierarchy of all classes instead of a textual one.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-GRAPHICAL_HIERARCHY = YES
-
-# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
-# dependencies a directory has on other directories in a graphical way. The
-# dependency relations are determined by the #include relations between the
-# files in the directories.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DIRECTORY_GRAPH = YES
-
-# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
-# generated by dot.
-# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
-# to make the SVG files visible in IE 9+ (other browsers do not have this
-# requirement).
-# Possible values are: png, jpg, gif and svg.
-# The default value is: png.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOT_IMAGE_FORMAT = png
-
-# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
-# enable generation of interactive SVG images that allow zooming and panning.
-#
-# Note that this requires a modern browser other than Internet Explorer. Tested
-# and working are Firefox, Chrome, Safari, and Opera.
-# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
-# the SVG files visible. Older versions of IE do not have SVG support.
-# The default value is: NO.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-INTERACTIVE_SVG = NO
-
-# The DOT_PATH tag can be used to specify the path where the dot tool can be
-# found. If left blank, it is assumed the dot tool can be found in the path.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOT_PATH = %DOT_PATH%
-
-# The DOTFILE_DIRS tag can be used to specify one or more directories that
-# contain dot files that are included in the documentation (see the \dotfile
-# command).
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOTFILE_DIRS =
-
-# The MSCFILE_DIRS tag can be used to specify one or more directories that
-# contain msc files that are included in the documentation (see the \mscfile
-# command).
-
-MSCFILE_DIRS =
-
-# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
-# that will be shown in the graph. If the number of nodes in a graph becomes
-# larger than this value, doxygen will truncate the graph, which is visualized
-# by representing a node as a red box. Note that doxygen if the number of direct
-# children of the root node in a graph is already larger than
-# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
-# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
-# Minimum value: 0, maximum value: 10000, default value: 50.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOT_GRAPH_MAX_NODES = 50
-
-# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
-# generated by dot. A depth value of 3 means that only nodes reachable from the
-# root by following a path via at most 3 edges will be shown. Nodes that lay
-# further from the root node will be omitted. Note that setting this option to 1
-# or 2 may greatly reduce the computation time needed for large code bases. Also
-# note that the size of a graph can be further restricted by
-# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
-# Minimum value: 0, maximum value: 1000, default value: 0.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-MAX_DOT_GRAPH_DEPTH = 1000
-
-# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
-# background. This is disabled by default, because dot on Windows does not seem
-# to support this out of the box.
-#
-# Warning: Depending on the platform used, enabling this option may lead to
-# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
-# read).
-# The default value is: NO.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOT_TRANSPARENT = NO
-
-# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
-# files in one run (i.e. multiple -o and -T options on the command line). This
-# makes dot run faster, but since only newer versions of dot (>1.8.10) support
-# this, this feature is disabled by default.
-# The default value is: NO.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOT_MULTI_TARGETS = YES
-
-# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
-# explaining the meaning of the various boxes and arrows in the dot generated
-# graphs.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-GENERATE_LEGEND = YES
-
-# If the DOT_CLEANUP tag is set to YES doxygen will remove the intermediate dot
-# files that are used to generate the various graphs.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOT_CLEANUP = YES
diff --git a/3rdparty/jsoncpp/doc/footer.html b/3rdparty/jsoncpp/doc/footer.html
deleted file mode 100644
index c83e5bcc0ea..00000000000
--- a/3rdparty/jsoncpp/doc/footer.html
+++ /dev/null
@@ -1,3 +0,0 @@
-<hr>
-</body>
-</html>
diff --git a/3rdparty/jsoncpp/doc/header.html b/3rdparty/jsoncpp/doc/header.html
deleted file mode 100644
index 4b2a5e92198..00000000000
--- a/3rdparty/jsoncpp/doc/header.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<html>
-<head>
-<title>
-JsonCpp - JSON data format manipulation library
-</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head>
-
-<body bgcolor="#ffffff">
-<table width="100%">
- <tr>
- <td width="40%" align="left" valign="center">
- <a href="https://github.com/open-source-parsers/jsoncpp">
- JsonCpp project page
- </a>
- </td>
- <td width="40%" align="right" valign="center">
- <a href="http://open-source-parsers.github.io/jsoncpp-docs/doxygen/">JsonCpp home page</a>
- </td>
- </tr>
-</table>
-
-<hr>
diff --git a/3rdparty/jsoncpp/doc/jsoncpp.dox b/3rdparty/jsoncpp/doc/jsoncpp.dox
deleted file mode 100644
index 47efc8a3576..00000000000
--- a/3rdparty/jsoncpp/doc/jsoncpp.dox
+++ /dev/null
@@ -1,164 +0,0 @@
-/**
-\mainpage
-\section _intro Introduction
-
-<a HREF="http://www.json.org/">JSON (JavaScript Object Notation)</a>
- is a lightweight data-interchange format.
-
-Here is an example of JSON data:
-\verbatim
-{
- "encoding" : "UTF-8",
- "plug-ins" : [
- "python",
- "c++",
- "ruby"
- ],
- "indent" : { "length" : 3, "use_space": true }
-}
-\endverbatim
-<b>JsonCpp</b> supports comments as <i>meta-data</i>:
-\code
-// Configuration options
-{
- // Default encoding for text
- "encoding" : "UTF-8",
-
- // Plug-ins loaded at start-up
- "plug-ins" : [
- "python",
- "c++", // trailing comment
- "ruby"
- ],
-
- // Tab indent size
- // (multi-line comment)
- "indent" : { /*embedded comment*/ "length" : 3, "use_space": true }
-}
-\endcode
-
-\section _features Features
-- read and write JSON document
-- attach C++ style comments to element during parsing
-- rewrite JSON document preserving original comments
-
-Notes: Comments used to be supported in JSON but were removed for
-portability (C like comments are not supported in Python). Since
-comments are useful in configuration/input file, this feature was
-preserved.
-
-\section _example Code example
-
-\code
-Json::Value root; // 'root' will contain the root value after parsing.
-std::cin >> root;
-
-// You can also read into a particular sub-value.
-std::cin >> root["subtree"];
-
-// Get the value of the member of root named 'encoding',
-// and return 'UTF-8' if there is no such member.
-std::string encoding = root.get("encoding", "UTF-8" ).asString();
-
-// Get the value of the member of root named 'plug-ins'; return a 'null' value if
-// there is no such member.
-const Json::Value plugins = root["plug-ins"];
-
-// Iterate over the sequence elements.
-for ( int index = 0; index < plugins.size(); ++index )
- loadPlugIn( plugins[index].asString() );
-
-// Try other datatypes. Some are auto-convertible to others.
-foo::setIndentLength( root["indent"].get("length", 3).asInt() );
-foo::setIndentUseSpace( root["indent"].get("use_space", true).asBool() );
-
-// Since Json::Value has an implicit constructor for all value types, it is not
-// necessary to explicitly construct the Json::Value object.
-root["encoding"] = foo::getCurrentEncoding();
-root["indent"]["length"] = foo::getCurrentIndentLength();
-root["indent"]["use_space"] = foo::getCurrentIndentUseSpace();
-
-// If you like the defaults, you can insert directly into a stream.
-std::cout << root;
-// Of course, you can write to `std::ostringstream` if you prefer.
-
-// If desired, remember to add a linefeed and flush.
-std::cout << std::endl;
-\endcode
-
-\section _advanced Advanced usage
-
-Configure *builders* to create *readers* and *writers*. For
-configuration, we use our own `Json::Value` (rather than
-standard setters/getters) so that we can add
-features without losing binary-compatibility.
-
-\code
-// For convenience, use `writeString()` with a specialized builder.
-Json::StreamWriterBuilder wbuilder;
-wbuilder["indentation"] = "\t";
-std::string document = Json::writeString(wbuilder, root);
-
-// Here, using a specialized Builder, we discard comments and
-// record errors as we parse.
-Json::CharReaderBuilder rbuilder;
-rbuilder["collectComments"] = false;
-std::string errs;
-bool ok = Json::parseFromStream(rbuilder, std::cin, &root, &errs);
-\endcode
-
-Yes, compile-time configuration-checking would be helpful,
-but `Json::Value` lets you
-write and read the builder configuration, which is better! In other words,
-you can configure your JSON parser using JSON.
-
-CharReaders and StreamWriters are not thread-safe, but they are re-usable.
-\code
-Json::CharReaderBuilder rbuilder;
-cfg >> rbuilder.settings_;
-std::unique_ptr<Json::CharReader> const reader(rbuilder.newCharReader());
-reader->parse(start, stop, &value1, &errs);
-// ...
-reader->parse(start, stop, &value2, &errs);
-// etc.
-\endcode
-
-\section _pbuild Build instructions
-The build instructions are located in the file
-<a HREF="https://github.com/open-source-parsers/jsoncpp/blob/master/README.md">README.md</a> in the top-directory of the project.
-
-The latest version of the source is available in the project's GitHub repository:
-<a HREF="https://github.com/open-source-parsers/jsoncpp/">
-jsoncpp</a>
-
-\section _news What's New?
-The description of latest changes can be found in
-<a HREF="https://github.com/open-source-parsers/jsoncpp/wiki/NEWS">
- the NEWS wiki
-</a>.
-
-\section _rlinks Related links
-- <a HREF="http://www.json.org/">JSON</a> Specification and alternate language implementations.
-- <a HREF="http://www.yaml.org/">YAML</a> A data format designed for human readability.
-- <a HREF="http://www.cl.cam.ac.uk/~mgk25/unicode.html">UTF-8 and Unicode FAQ</a>.
-
-\section _plinks Old project links
-- <a href="https://sourceforge.net/projects/jsoncpp/">https://sourceforge.net/projects/jsoncpp/</a>
-- <a href="http://jsoncpp.sourceforge.net">http://jsoncpp.sourceforge.net</a>
-- <a href="http://sourceforge.net/projects/jsoncpp/files/">http://sourceforge.net/projects/jsoncpp/files/</a>
-- <a href="http://jsoncpp.svn.sourceforge.net/svnroot/jsoncpp/trunk/">http://jsoncpp.svn.sourceforge.net/svnroot/jsoncpp/trunk/</a>
-- <a href="http://jsoncpp.sourceforge.net/old.html">http://jsoncpp.sourceforge.net/old.html</a>
-
-\section _license License
-See file <a href="https://github.com/open-source-parsers/jsoncpp/blob/master/LICENSE"><code>LICENSE</code></a> in the top-directory of the project.
-
-Basically JsonCpp is licensed under MIT license, or public domain if desired
-and recognized in your jurisdiction.
-
-\author Baptiste Lepilleur <blep@users.sourceforge.net> (originator)
-\author Christopher Dunn <cdunn2001@gmail.com> (primary maintainer)
-\version \include version
-We make strong guarantees about binary-compatibility, consistent with
-<a href="http://apr.apache.org/versioning.html">the Apache versioning scheme</a>.
-\sa version.h
-*/
diff --git a/3rdparty/jsoncpp/doc/readme.txt b/3rdparty/jsoncpp/doc/readme.txt
deleted file mode 100644
index 0e42cdfb4cf..00000000000
--- a/3rdparty/jsoncpp/doc/readme.txt
+++ /dev/null
@@ -1 +0,0 @@
-The documentation is generated using doxygen (http://www.doxygen.org).
diff --git a/3rdparty/jsoncpp/doc/roadmap.dox b/3rdparty/jsoncpp/doc/roadmap.dox
deleted file mode 100644
index 12294bbbd29..00000000000
--- a/3rdparty/jsoncpp/doc/roadmap.dox
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! \page roadmap JsonCpp roadmap
- Moved to: https://github.com/open-source-parsers/jsoncpp/wiki/Roadmap
-*/
diff --git a/3rdparty/jsoncpp/doc/web_doxyfile.in b/3rdparty/jsoncpp/doc/web_doxyfile.in
deleted file mode 100644
index 07d6819a743..00000000000
--- a/3rdparty/jsoncpp/doc/web_doxyfile.in
+++ /dev/null
@@ -1,2301 +0,0 @@
-# Doxyfile 1.8.5
-
-# This file describes the settings to be used by the documentation system
-# doxygen (www.doxygen.org) for a project.
-#
-# All text after a double hash (##) is considered a comment and is placed in
-# front of the TAG it is preceding.
-#
-# All text after a single hash (#) is considered a comment and will be ignored.
-# The format is:
-# TAG = value [value, ...]
-# For lists, items can also be appended using:
-# TAG += value [value, ...]
-# Values that contain spaces should be placed between quotes (\" \").
-
-#---------------------------------------------------------------------------
-# Project related configuration options
-#---------------------------------------------------------------------------
-
-# This tag specifies the encoding used for all characters in the config file
-# that follow. The default is UTF-8 which is also the encoding used for all text
-# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
-# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv
-# for the list of possible encodings.
-# The default value is: UTF-8.
-
-DOXYFILE_ENCODING = UTF-8
-
-# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
-# double-quotes, unless you are using Doxywizard) that should identify the
-# project for which the documentation is generated. This name is used in the
-# title of most generated pages and in a few other places.
-# The default value is: My Project.
-
-PROJECT_NAME = "JsonCpp"
-
-# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
-# could be handy for archiving the generated documentation or if some version
-# control system is used.
-
-PROJECT_NUMBER = %JSONCPP_VERSION%
-
-# Using the PROJECT_BRIEF tag one can provide an optional one line description
-# for a project that appears at the top of each page and should give viewer a
-# quick idea about the purpose of the project. Keep the description short.
-
-PROJECT_BRIEF =
-
-# With the PROJECT_LOGO tag one can specify an logo or icon that is included in
-# the documentation. The maximum height of the logo should not exceed 55 pixels
-# and the maximum width should not exceed 200 pixels. Doxygen will copy the logo
-# to the output directory.
-
-PROJECT_LOGO =
-
-# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
-# into which the generated documentation will be written. If a relative path is
-# entered, it will be relative to the location where doxygen was started. If
-# left blank the current directory will be used.
-
-OUTPUT_DIRECTORY = %DOC_TOPDIR%
-
-# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub-
-# directories (in 2 levels) under the output directory of each output format and
-# will distribute the generated files over these directories. Enabling this
-# option can be useful when feeding doxygen a huge amount of source files, where
-# putting all generated files in the same directory would otherwise causes
-# performance problems for the file system.
-# The default value is: NO.
-
-CREATE_SUBDIRS = NO
-
-# The OUTPUT_LANGUAGE tag is used to specify the language in which all
-# documentation generated by doxygen is written. Doxygen will use this
-# information to generate all constant output in the proper language.
-# Possible values are: Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-
-# Traditional, Croatian, Czech, Danish, Dutch, English, Esperanto, Farsi,
-# Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en,
-# Korean, Korean-en, Latvian, Norwegian, Macedonian, Persian, Polish,
-# Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish,
-# Turkish, Ukrainian and Vietnamese.
-# The default value is: English.
-
-OUTPUT_LANGUAGE = English
-
-# If the BRIEF_MEMBER_DESC tag is set to YES doxygen will include brief member
-# descriptions after the members that are listed in the file and class
-# documentation (similar to Javadoc). Set to NO to disable this.
-# The default value is: YES.
-
-BRIEF_MEMBER_DESC = YES
-
-# If the REPEAT_BRIEF tag is set to YES doxygen will prepend the brief
-# description of a member or function before the detailed description
-#
-# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
-# brief descriptions will be completely suppressed.
-# The default value is: YES.
-
-REPEAT_BRIEF = YES
-
-# This tag implements a quasi-intelligent brief description abbreviator that is
-# used to form the text in various listings. Each string in this list, if found
-# as the leading text of the brief description, will be stripped from the text
-# and the result, after processing the whole list, is used as the annotated
-# text. Otherwise, the brief description is used as-is. If left blank, the
-# following values are used ($name is automatically replaced with the name of
-# the entity):The $name class, The $name widget, The $name file, is, provides,
-# specifies, contains, represents, a, an and the.
-
-ABBREVIATE_BRIEF = "The $name class" \
- "The $name widget" \
- "The $name file" \
- is \
- provides \
- specifies \
- contains \
- represents \
- a \
- an \
- the
-
-# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
-# doxygen will generate a detailed section even if there is only a brief
-# description.
-# The default value is: NO.
-
-ALWAYS_DETAILED_SEC = NO
-
-# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
-# inherited members of a class in the documentation of that class as if those
-# members were ordinary class members. Constructors, destructors and assignment
-# operators of the base classes will not be shown.
-# The default value is: NO.
-
-INLINE_INHERITED_MEMB = NO
-
-# If the FULL_PATH_NAMES tag is set to YES doxygen will prepend the full path
-# before files name in the file list and in the header files. If set to NO the
-# shortest path that makes the file name unique will be used
-# The default value is: YES.
-
-FULL_PATH_NAMES = YES
-
-# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
-# Stripping is only done if one of the specified strings matches the left-hand
-# part of the path. The tag can be used to show relative paths in the file list.
-# If left blank the directory from which doxygen is run is used as the path to
-# strip.
-#
-# Note that you can specify absolute paths here, but also relative paths, which
-# will be relative from the directory where doxygen is started.
-# This tag requires that the tag FULL_PATH_NAMES is set to YES.
-
-STRIP_FROM_PATH = %TOPDIR%
-
-# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
-# path mentioned in the documentation of a class, which tells the reader which
-# header file to include in order to use a class. If left blank only the name of
-# the header file containing the class definition is used. Otherwise one should
-# specify the list of include paths that are normally passed to the compiler
-# using the -I flag.
-
-STRIP_FROM_INC_PATH = %TOPDIR%/include
-
-# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
-# less readable) file names. This can be useful is your file systems doesn't
-# support long names like on DOS, Mac, or CD-ROM.
-# The default value is: NO.
-
-SHORT_NAMES = NO
-
-# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
-# first line (until the first dot) of a Javadoc-style comment as the brief
-# description. If set to NO, the Javadoc-style will behave just like regular Qt-
-# style comments (thus requiring an explicit @brief command for a brief
-# description.)
-# The default value is: NO.
-
-JAVADOC_AUTOBRIEF = YES
-
-# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
-# line (until the first dot) of a Qt-style comment as the brief description. If
-# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
-# requiring an explicit \brief command for a brief description.)
-# The default value is: NO.
-
-QT_AUTOBRIEF = NO
-
-# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
-# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
-# a brief description. This used to be the default behavior. The new default is
-# to treat a multi-line C++ comment block as a detailed description. Set this
-# tag to YES if you prefer the old behavior instead.
-#
-# Note that setting this tag to YES also means that rational rose comments are
-# not recognized any more.
-# The default value is: NO.
-
-MULTILINE_CPP_IS_BRIEF = NO
-
-# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
-# documentation from any documented member that it re-implements.
-# The default value is: YES.
-
-INHERIT_DOCS = YES
-
-# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce a
-# new page for each member. If set to NO, the documentation of a member will be
-# part of the file/class/namespace that contains it.
-# The default value is: NO.
-
-SEPARATE_MEMBER_PAGES = NO
-
-# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
-# uses this value to replace tabs by spaces in code fragments.
-# Minimum value: 1, maximum value: 16, default value: 4.
-
-TAB_SIZE = 3
-
-# This tag can be used to specify a number of aliases that act as commands in
-# the documentation. An alias has the form:
-# name=value
-# For example adding
-# "sideeffect=@par Side Effects:\n"
-# will allow you to put the command \sideeffect (or @sideeffect) in the
-# documentation, which will result in a user-defined paragraph with heading
-# "Side Effects:". You can put \n's in the value part of an alias to insert
-# newlines.
-
-ALIASES = "testCaseSetup=\link CppUT::TestCase::setUp() setUp()\endlink" \
- "testCaseRun=\link CppUT::TestCase::run() run()\endlink" \
- "testCaseTearDown=\link CppUT::TestCase::tearDown() tearDown()\endlink" \
- "json_ref=<a HREF='http://www.json.org/'>JSON (JavaScript Object Notation)</a>"
-
-# This tag can be used to specify a number of word-keyword mappings (TCL only).
-# A mapping has the form "name=value". For example adding "class=itcl::class"
-# will allow you to use the command class in the itcl::class meaning.
-
-TCL_SUBST =
-
-# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
-# only. Doxygen will then generate output that is more tailored for C. For
-# instance, some of the names that are used will be different. The list of all
-# members will be omitted, etc.
-# The default value is: NO.
-
-OPTIMIZE_OUTPUT_FOR_C = NO
-
-# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
-# Python sources only. Doxygen will then generate output that is more tailored
-# for that language. For instance, namespaces will be presented as packages,
-# qualified scopes will look different, etc.
-# The default value is: NO.
-
-OPTIMIZE_OUTPUT_JAVA = NO
-
-# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
-# sources. Doxygen will then generate output that is tailored for Fortran.
-# The default value is: NO.
-
-OPTIMIZE_FOR_FORTRAN = NO
-
-# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
-# sources. Doxygen will then generate output that is tailored for VHDL.
-# The default value is: NO.
-
-OPTIMIZE_OUTPUT_VHDL = NO
-
-# Doxygen selects the parser to use depending on the extension of the files it
-# parses. With this tag you can assign which parser to use for a given
-# extension. Doxygen has a built-in mapping, but you can override or extend it
-# using this tag. The format is ext=language, where ext is a file extension, and
-# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
-# C#, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL. For instance to make
-# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C
-# (default is Fortran), use: inc=Fortran f=C.
-#
-# Note For files without extension you can use no_extension as a placeholder.
-#
-# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
-# the files are not read by doxygen.
-
-EXTENSION_MAPPING =
-
-# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
-# according to the Markdown format, which allows for more readable
-# documentation. See http://daringfireball.net/projects/markdown/ for details.
-# The output of markdown processing is further processed by doxygen, so you can
-# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
-# case of backward compatibilities issues.
-# The default value is: YES.
-
-MARKDOWN_SUPPORT = YES
-
-# When enabled doxygen tries to link words that correspond to documented
-# classes, or namespaces to their corresponding documentation. Such a link can
-# be prevented in individual cases by by putting a % sign in front of the word
-# or globally by setting AUTOLINK_SUPPORT to NO.
-# The default value is: YES.
-
-AUTOLINK_SUPPORT = YES
-
-# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
-# to include (a tag file for) the STL sources as input, then you should set this
-# tag to YES in order to let doxygen match functions declarations and
-# definitions whose arguments contain STL classes (e.g. func(std::string);
-# versus func(std::string) {}). This also make the inheritance and collaboration
-# diagrams that involve STL classes more complete and accurate.
-# The default value is: NO.
-
-BUILTIN_STL_SUPPORT = YES
-
-# If you use Microsoft's C++/CLI language, you should set this option to YES to
-# enable parsing support.
-# The default value is: NO.
-
-CPP_CLI_SUPPORT = NO
-
-# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
-# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen
-# will parse them like normal C++ but will assume all classes use public instead
-# of private inheritance when no explicit protection keyword is present.
-# The default value is: NO.
-
-SIP_SUPPORT = NO
-
-# For Microsoft's IDL there are propget and propput attributes to indicate
-# getter and setter methods for a property. Setting this option to YES will make
-# doxygen to replace the get and set methods by a property in the documentation.
-# This will only work if the methods are indeed getting or setting a simple
-# type. If this is not the case, or you want to show the methods anyway, you
-# should set this option to NO.
-# The default value is: YES.
-
-IDL_PROPERTY_SUPPORT = YES
-
-# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
-# tag is set to YES, then doxygen will reuse the documentation of the first
-# member in the group (if any) for the other members of the group. By default
-# all members of a group must be documented explicitly.
-# The default value is: NO.
-
-DISTRIBUTE_GROUP_DOC = NO
-
-# Set the SUBGROUPING tag to YES to allow class member groups of the same type
-# (for instance a group of public functions) to be put as a subgroup of that
-# type (e.g. under the Public Functions section). Set it to NO to prevent
-# subgrouping. Alternatively, this can be done per class using the
-# \nosubgrouping command.
-# The default value is: YES.
-
-SUBGROUPING = YES
-
-# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
-# are shown inside the group in which they are included (e.g. using \ingroup)
-# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
-# and RTF).
-#
-# Note that this feature does not work in combination with
-# SEPARATE_MEMBER_PAGES.
-# The default value is: NO.
-
-INLINE_GROUPED_CLASSES = NO
-
-# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
-# with only public data fields or simple typedef fields will be shown inline in
-# the documentation of the scope in which they are defined (i.e. file,
-# namespace, or group documentation), provided this scope is documented. If set
-# to NO, structs, classes, and unions are shown on a separate page (for HTML and
-# Man pages) or section (for LaTeX and RTF).
-# The default value is: NO.
-
-INLINE_SIMPLE_STRUCTS = NO
-
-# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
-# enum is documented as struct, union, or enum with the name of the typedef. So
-# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
-# with name TypeT. When disabled the typedef will appear as a member of a file,
-# namespace, or class. And the struct will be named TypeS. This can typically be
-# useful for C code in case the coding convention dictates that all compound
-# types are typedef'ed and only the typedef is referenced, never the tag name.
-# The default value is: NO.
-
-TYPEDEF_HIDES_STRUCT = NO
-
-# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
-# cache is used to resolve symbols given their name and scope. Since this can be
-# an expensive process and often the same symbol appears multiple times in the
-# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
-# doxygen will become slower. If the cache is too large, memory is wasted. The
-# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
-# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
-# symbols. At the end of a run doxygen will report the cache usage and suggest
-# the optimal cache size from a speed point of view.
-# Minimum value: 0, maximum value: 9, default value: 0.
-
-LOOKUP_CACHE_SIZE = 0
-
-#---------------------------------------------------------------------------
-# Build related configuration options
-#---------------------------------------------------------------------------
-
-# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
-# documentation are documented, even if no documentation was available. Private
-# class members and static file members will be hidden unless the
-# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
-# Note: This will also disable the warnings about undocumented members that are
-# normally produced when WARNINGS is set to YES.
-# The default value is: NO.
-
-EXTRACT_ALL = YES
-
-# If the EXTRACT_PRIVATE tag is set to YES all private members of a class will
-# be included in the documentation.
-# The default value is: NO.
-
-EXTRACT_PRIVATE = NO
-
-# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal
-# scope will be included in the documentation.
-# The default value is: NO.
-
-EXTRACT_PACKAGE = NO
-
-# If the EXTRACT_STATIC tag is set to YES all static members of a file will be
-# included in the documentation.
-# The default value is: NO.
-
-EXTRACT_STATIC = YES
-
-# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) defined
-# locally in source files will be included in the documentation. If set to NO
-# only classes defined in header files are included. Does not have any effect
-# for Java sources.
-# The default value is: YES.
-
-EXTRACT_LOCAL_CLASSES = NO
-
-# This flag is only useful for Objective-C code. When set to YES local methods,
-# which are defined in the implementation section but not in the interface are
-# included in the documentation. If set to NO only methods in the interface are
-# included.
-# The default value is: NO.
-
-EXTRACT_LOCAL_METHODS = NO
-
-# If this flag is set to YES, the members of anonymous namespaces will be
-# extracted and appear in the documentation as a namespace called
-# 'anonymous_namespace{file}', where file will be replaced with the base name of
-# the file that contains the anonymous namespace. By default anonymous namespace
-# are hidden.
-# The default value is: NO.
-
-EXTRACT_ANON_NSPACES = NO
-
-# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
-# undocumented members inside documented classes or files. If set to NO these
-# members will be included in the various overviews, but no documentation
-# section is generated. This option has no effect if EXTRACT_ALL is enabled.
-# The default value is: NO.
-
-HIDE_UNDOC_MEMBERS = NO
-
-# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
-# undocumented classes that are normally visible in the class hierarchy. If set
-# to NO these classes will be included in the various overviews. This option has
-# no effect if EXTRACT_ALL is enabled.
-# The default value is: NO.
-
-HIDE_UNDOC_CLASSES = NO
-
-# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
-# (class|struct|union) declarations. If set to NO these declarations will be
-# included in the documentation.
-# The default value is: NO.
-
-HIDE_FRIEND_COMPOUNDS = NO
-
-# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
-# documentation blocks found inside the body of a function. If set to NO these
-# blocks will be appended to the function's detailed documentation block.
-# The default value is: NO.
-
-HIDE_IN_BODY_DOCS = NO
-
-# The INTERNAL_DOCS tag determines if documentation that is typed after a
-# \internal command is included. If the tag is set to NO then the documentation
-# will be excluded. Set it to YES to include the internal documentation.
-# The default value is: NO.
-
-INTERNAL_DOCS = YES
-
-# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
-# names in lower-case letters. If set to YES upper-case letters are also
-# allowed. This is useful if you have classes or files whose names only differ
-# in case and if your file system supports case sensitive file names. Windows
-# and Mac users are advised to set this option to NO.
-# The default value is: system dependent.
-
-CASE_SENSE_NAMES = NO
-
-# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
-# their full class and namespace scopes in the documentation. If set to YES the
-# scope will be hidden.
-# The default value is: NO.
-
-HIDE_SCOPE_NAMES = NO
-
-# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
-# the files that are included by a file in the documentation of that file.
-# The default value is: YES.
-
-SHOW_INCLUDE_FILES = YES
-
-# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
-# files with double quotes in the documentation rather than with sharp brackets.
-# The default value is: NO.
-
-FORCE_LOCAL_INCLUDES = NO
-
-# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
-# documentation for inline members.
-# The default value is: YES.
-
-INLINE_INFO = YES
-
-# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
-# (detailed) documentation of file and class members alphabetically by member
-# name. If set to NO the members will appear in declaration order.
-# The default value is: YES.
-
-SORT_MEMBER_DOCS = YES
-
-# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
-# descriptions of file, namespace and class members alphabetically by member
-# name. If set to NO the members will appear in declaration order.
-# The default value is: NO.
-
-SORT_BRIEF_DOCS = NO
-
-# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
-# (brief and detailed) documentation of class members so that constructors and
-# destructors are listed first. If set to NO the constructors will appear in the
-# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
-# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
-# member documentation.
-# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
-# detailed member documentation.
-# The default value is: NO.
-
-SORT_MEMBERS_CTORS_1ST = NO
-
-# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
-# of group names into alphabetical order. If set to NO the group names will
-# appear in their defined order.
-# The default value is: NO.
-
-SORT_GROUP_NAMES = NO
-
-# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
-# fully-qualified names, including namespaces. If set to NO, the class list will
-# be sorted only by class name, not including the namespace part.
-# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
-# Note: This option applies only to the class list, not to the alphabetical
-# list.
-# The default value is: NO.
-
-SORT_BY_SCOPE_NAME = YES
-
-# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
-# type resolution of all parameters of a function it will reject a match between
-# the prototype and the implementation of a member function even if there is
-# only one candidate or it is obvious which candidate to choose by doing a
-# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
-# accept a match between prototype and implementation in such cases.
-# The default value is: NO.
-
-STRICT_PROTO_MATCHING = NO
-
-# The GENERATE_TODOLIST tag can be used to enable ( YES) or disable ( NO) the
-# todo list. This list is created by putting \todo commands in the
-# documentation.
-# The default value is: YES.
-
-GENERATE_TODOLIST = YES
-
-# The GENERATE_TESTLIST tag can be used to enable ( YES) or disable ( NO) the
-# test list. This list is created by putting \test commands in the
-# documentation.
-# The default value is: YES.
-
-GENERATE_TESTLIST = NO
-
-# The GENERATE_BUGLIST tag can be used to enable ( YES) or disable ( NO) the bug
-# list. This list is created by putting \bug commands in the documentation.
-# The default value is: YES.
-
-GENERATE_BUGLIST = NO
-
-# The GENERATE_DEPRECATEDLIST tag can be used to enable ( YES) or disable ( NO)
-# the deprecated list. This list is created by putting \deprecated commands in
-# the documentation.
-# The default value is: YES.
-
-GENERATE_DEPRECATEDLIST= YES
-
-# The ENABLED_SECTIONS tag can be used to enable conditional documentation
-# sections, marked by \if <section_label> ... \endif and \cond <section_label>
-# ... \endcond blocks.
-
-ENABLED_SECTIONS =
-
-# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
-# initial value of a variable or macro / define can have for it to appear in the
-# documentation. If the initializer consists of more lines than specified here
-# it will be hidden. Use a value of 0 to hide initializers completely. The
-# appearance of the value of individual variables and macros / defines can be
-# controlled using \showinitializer or \hideinitializer command in the
-# documentation regardless of this setting.
-# Minimum value: 0, maximum value: 10000, default value: 30.
-
-MAX_INITIALIZER_LINES = 30
-
-# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
-# the bottom of the documentation of classes and structs. If set to YES the list
-# will mention the files that were used to generate the documentation.
-# The default value is: YES.
-
-SHOW_USED_FILES = YES
-
-# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
-# will remove the Files entry from the Quick Index and from the Folder Tree View
-# (if specified).
-# The default value is: YES.
-
-SHOW_FILES = YES
-
-# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
-# page. This will remove the Namespaces entry from the Quick Index and from the
-# Folder Tree View (if specified).
-# The default value is: YES.
-
-SHOW_NAMESPACES = YES
-
-# The FILE_VERSION_FILTER tag can be used to specify a program or script that
-# doxygen should invoke to get the current version for each file (typically from
-# the version control system). Doxygen will invoke the program by executing (via
-# popen()) the command command input-file, where command is the value of the
-# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
-# by doxygen. Whatever the program writes to standard output is used as the file
-# version. For an example see the documentation.
-
-FILE_VERSION_FILTER =
-
-# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
-# by doxygen. The layout file controls the global structure of the generated
-# output files in an output format independent way. To create the layout file
-# that represents doxygen's defaults, run doxygen with the -l option. You can
-# optionally specify a file name after the option, if omitted DoxygenLayout.xml
-# will be used as the name of the layout file.
-#
-# Note that if you run doxygen from a directory containing a file called
-# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
-# tag is left empty.
-
-LAYOUT_FILE =
-
-# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
-# the reference definitions. This must be a list of .bib files. The .bib
-# extension is automatically appended if omitted. This requires the bibtex tool
-# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.
-# For LaTeX the style of the bibliography can be controlled using
-# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
-# search path. Do not use file names with spaces, bibtex cannot handle them. See
-# also \cite for info how to create references.
-
-CITE_BIB_FILES =
-
-#---------------------------------------------------------------------------
-# Configuration options related to warning and progress messages
-#---------------------------------------------------------------------------
-
-# The QUIET tag can be used to turn on/off the messages that are generated to
-# standard output by doxygen. If QUIET is set to YES this implies that the
-# messages are off.
-# The default value is: NO.
-
-QUIET = NO
-
-# The WARNINGS tag can be used to turn on/off the warning messages that are
-# generated to standard error ( stderr) by doxygen. If WARNINGS is set to YES
-# this implies that the warnings are on.
-#
-# Tip: Turn warnings on while writing the documentation.
-# The default value is: YES.
-
-WARNINGS = YES
-
-# If the WARN_IF_UNDOCUMENTED tag is set to YES, then doxygen will generate
-# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
-# will automatically be disabled.
-# The default value is: YES.
-
-WARN_IF_UNDOCUMENTED = YES
-
-# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
-# potential errors in the documentation, such as not documenting some parameters
-# in a documented function, or documenting parameters that don't exist or using
-# markup commands wrongly.
-# The default value is: YES.
-
-WARN_IF_DOC_ERROR = YES
-
-# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
-# are documented, but have no documentation for their parameters or return
-# value. If set to NO doxygen will only warn about wrong or incomplete parameter
-# documentation, but not about the absence of documentation.
-# The default value is: NO.
-
-WARN_NO_PARAMDOC = NO
-
-# The WARN_FORMAT tag determines the format of the warning messages that doxygen
-# can produce. The string should contain the $file, $line, and $text tags, which
-# will be replaced by the file and line number from which the warning originated
-# and the warning text. Optionally the format may contain $version, which will
-# be replaced by the version of the file (if it could be obtained via
-# FILE_VERSION_FILTER)
-# The default value is: $file:$line: $text.
-
-WARN_FORMAT = "$file:$line: $text"
-
-# The WARN_LOGFILE tag can be used to specify a file to which warning and error
-# messages should be written. If left blank the output is written to standard
-# error (stderr).
-
-WARN_LOGFILE = %WARNING_LOG_PATH%
-
-#---------------------------------------------------------------------------
-# Configuration options related to the input files
-#---------------------------------------------------------------------------
-
-# The INPUT tag is used to specify the files and/or directories that contain
-# documented source files. You may enter file names like myfile.cpp or
-# directories like /usr/src/myproject. Separate the files or directories with
-# spaces.
-# Note: If this tag is empty the current directory is searched.
-
-INPUT = ../include \
- ../src/lib_json \
- .
-
-# This tag can be used to specify the character encoding of the source files
-# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
-# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
-# documentation (see: http://www.gnu.org/software/libiconv) for the list of
-# possible encodings.
-# The default value is: UTF-8.
-
-INPUT_ENCODING = UTF-8
-
-# If the value of the INPUT tag contains directories, you can use the
-# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
-# *.h) to filter out the source-files in the directories. If left blank the
-# following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii,
-# *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp,
-# *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown,
-# *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf,
-# *.qsf, *.as and *.js.
-
-FILE_PATTERNS = *.h \
- *.cpp \
- *.inl \
- *.dox
-
-# The RECURSIVE tag can be used to specify whether or not subdirectories should
-# be searched for input files as well.
-# The default value is: NO.
-
-RECURSIVE = YES
-
-# The EXCLUDE tag can be used to specify files and/or directories that should be
-# excluded from the INPUT source files. This way you can easily exclude a
-# subdirectory from a directory tree whose root is specified with the INPUT tag.
-#
-# Note that relative paths are relative to the directory from which doxygen is
-# run.
-
-EXCLUDE =
-
-# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
-# directories that are symbolic links (a Unix file system feature) are excluded
-# from the input.
-# The default value is: NO.
-
-EXCLUDE_SYMLINKS = NO
-
-# If the value of the INPUT tag contains directories, you can use the
-# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
-# certain files from those directories.
-#
-# Note that the wildcards are matched against the file with absolute path, so to
-# exclude all test directories for example use the pattern */test/*
-
-EXCLUDE_PATTERNS =
-
-# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
-# (namespaces, classes, functions, etc.) that should be excluded from the
-# output. The symbol name can be a fully qualified name, a word, or if the
-# wildcard * is used, a substring. Examples: ANamespace, AClass,
-# AClass::ANamespace, ANamespace::*Test
-#
-# Note that the wildcards are matched against the file with absolute path, so to
-# exclude all test directories use the pattern */test/*
-
-EXCLUDE_SYMBOLS =
-
-# The EXAMPLE_PATH tag can be used to specify one or more files or directories
-# that contain example code fragments that are included (see the \include
-# command).
-
-EXAMPLE_PATH = ..
-
-# If the value of the EXAMPLE_PATH tag contains directories, you can use the
-# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
-# *.h) to filter out the source-files in the directories. If left blank all
-# files are included.
-
-EXAMPLE_PATTERNS = *
-
-# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
-# searched for input files to be used with the \include or \dontinclude commands
-# irrespective of the value of the RECURSIVE tag.
-# The default value is: NO.
-
-EXAMPLE_RECURSIVE = NO
-
-# The IMAGE_PATH tag can be used to specify one or more files or directories
-# that contain images that are to be included in the documentation (see the
-# \image command).
-
-IMAGE_PATH =
-
-# The INPUT_FILTER tag can be used to specify a program that doxygen should
-# invoke to filter for each input file. Doxygen will invoke the filter program
-# by executing (via popen()) the command:
-#
-# <filter> <input-file>
-#
-# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
-# name of an input file. Doxygen will then use the output that the filter
-# program writes to standard output. If FILTER_PATTERNS is specified, this tag
-# will be ignored.
-#
-# Note that the filter must not add or remove lines; it is applied before the
-# code is scanned, but not when the output code is generated. If lines are added
-# or removed, the anchors will not be placed correctly.
-
-INPUT_FILTER =
-
-# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
-# basis. Doxygen will compare the file name with each pattern and apply the
-# filter if there is a match. The filters are a list of the form: pattern=filter
-# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
-# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
-# patterns match the file name, INPUT_FILTER is applied.
-
-FILTER_PATTERNS =
-
-# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
-# INPUT_FILTER ) will also be used to filter the input files that are used for
-# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
-# The default value is: NO.
-
-FILTER_SOURCE_FILES = NO
-
-# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
-# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
-# it is also possible to disable source filtering for a specific pattern using
-# *.ext= (so without naming a filter).
-# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
-
-FILTER_SOURCE_PATTERNS =
-
-# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
-# is part of the input, its contents will be placed on the main page
-# (index.html). This can be useful if you have a project on for instance GitHub
-# and want to reuse the introduction page also for the doxygen output.
-
-USE_MDFILE_AS_MAINPAGE =
-
-#---------------------------------------------------------------------------
-# Configuration options related to source browsing
-#---------------------------------------------------------------------------
-
-# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
-# generated. Documented entities will be cross-referenced with these sources.
-#
-# Note: To get rid of all source code in the generated output, make sure that
-# also VERBATIM_HEADERS is set to NO.
-# The default value is: NO.
-
-SOURCE_BROWSER = NO
-
-# Setting the INLINE_SOURCES tag to YES will include the body of functions,
-# classes and enums directly into the documentation.
-# The default value is: NO.
-
-INLINE_SOURCES = NO
-
-# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
-# special comment blocks from generated source code fragments. Normal C, C++ and
-# Fortran comments will always remain visible.
-# The default value is: YES.
-
-STRIP_CODE_COMMENTS = YES
-
-# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
-# function all documented functions referencing it will be listed.
-# The default value is: NO.
-
-REFERENCED_BY_RELATION = NO
-
-# If the REFERENCES_RELATION tag is set to YES then for each documented function
-# all documented entities called/used by that function will be listed.
-# The default value is: NO.
-
-REFERENCES_RELATION = NO
-
-# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
-# to YES, then the hyperlinks from functions in REFERENCES_RELATION and
-# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
-# link to the documentation.
-# The default value is: YES.
-
-REFERENCES_LINK_SOURCE = YES
-
-# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
-# source code will show a tooltip with additional information such as prototype,
-# brief description and links to the definition and documentation. Since this
-# will make the HTML file larger and loading of large files a bit slower, you
-# can opt to disable this feature.
-# The default value is: YES.
-# This tag requires that the tag SOURCE_BROWSER is set to YES.
-
-SOURCE_TOOLTIPS = YES
-
-# If the USE_HTAGS tag is set to YES then the references to source code will
-# point to the HTML generated by the htags(1) tool instead of doxygen built-in
-# source browser. The htags tool is part of GNU's global source tagging system
-# (see http://www.gnu.org/software/global/global.html). You will need version
-# 4.8.6 or higher.
-#
-# To use it do the following:
-# - Install the latest version of global
-# - Enable SOURCE_BROWSER and USE_HTAGS in the config file
-# - Make sure the INPUT points to the root of the source tree
-# - Run doxygen as normal
-#
-# Doxygen will invoke htags (and that will in turn invoke gtags), so these
-# tools must be available from the command line (i.e. in the search path).
-#
-# The result: instead of the source browser generated by doxygen, the links to
-# source code will now point to the output of htags.
-# The default value is: NO.
-# This tag requires that the tag SOURCE_BROWSER is set to YES.
-
-USE_HTAGS = NO
-
-# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
-# verbatim copy of the header file for each class for which an include is
-# specified. Set to NO to disable this.
-# See also: Section \class.
-# The default value is: YES.
-
-VERBATIM_HEADERS = NO
-
-#---------------------------------------------------------------------------
-# Configuration options related to the alphabetical class index
-#---------------------------------------------------------------------------
-
-# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
-# compounds will be generated. Enable this if the project contains a lot of
-# classes, structs, unions or interfaces.
-# The default value is: YES.
-
-ALPHABETICAL_INDEX = NO
-
-# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
-# which the alphabetical index list will be split.
-# Minimum value: 1, maximum value: 20, default value: 5.
-# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
-
-COLS_IN_ALPHA_INDEX = 5
-
-# In case all classes in a project start with a common prefix, all classes will
-# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
-# can be used to specify a prefix (or a list of prefixes) that should be ignored
-# while generating the index headers.
-# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
-
-IGNORE_PREFIX =
-
-#---------------------------------------------------------------------------
-# Configuration options related to the HTML output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_HTML tag is set to YES doxygen will generate HTML output
-# The default value is: YES.
-
-GENERATE_HTML = YES
-
-# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
-# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
-# it.
-# The default directory is: html.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_OUTPUT = %HTML_OUTPUT%
-
-# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
-# generated HTML page (for example: .htm, .php, .asp).
-# The default value is: .html.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_FILE_EXTENSION = .html
-
-# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
-# each generated HTML page. If the tag is left blank doxygen will generate a
-# standard header.
-#
-# To get valid HTML the header file that includes any scripts and style sheets
-# that doxygen needs, which is dependent on the configuration options used (e.g.
-# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
-# default header using
-# doxygen -w html new_header.html new_footer.html new_stylesheet.css
-# YourConfigFile
-# and then modify the file new_header.html. See also section "Doxygen usage"
-# for information on how to generate the default header that doxygen normally
-# uses.
-# Note: The header is subject to change so you typically have to regenerate the
-# default header when upgrading to a newer version of doxygen. For a description
-# of the possible markers and block names see the documentation.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_HEADER = header.html
-
-# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
-# generated HTML page. If the tag is left blank doxygen will generate a standard
-# footer. See HTML_HEADER for more information on how to generate a default
-# footer and what special commands can be used inside the footer. See also
-# section "Doxygen usage" for information on how to generate the default footer
-# that doxygen normally uses.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_FOOTER = footer.html
-
-# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
-# sheet that is used by each HTML page. It can be used to fine-tune the look of
-# the HTML output. If left blank doxygen will generate a default style sheet.
-# See also section "Doxygen usage" for information on how to generate the style
-# sheet that doxygen normally uses.
-# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
-# it is more robust and this tag (HTML_STYLESHEET) will in the future become
-# obsolete.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_STYLESHEET =
-
-# The HTML_EXTRA_STYLESHEET tag can be used to specify an additional user-
-# defined cascading style sheet that is included after the standard style sheets
-# created by doxygen. Using this option one can overrule certain style aspects.
-# This is preferred over using HTML_STYLESHEET since it does not replace the
-# standard style sheet and is therefor more robust against future updates.
-# Doxygen will copy the style sheet file to the output directory. For an example
-# see the documentation.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_EXTRA_STYLESHEET =
-
-# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
-# other source files which should be copied to the HTML output directory. Note
-# that these files will be copied to the base HTML output directory. Use the
-# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
-# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
-# files will be copied as-is; there are no commands or markers available.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_EXTRA_FILES =
-
-# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
-# will adjust the colors in the stylesheet and background images according to
-# this color. Hue is specified as an angle on a colorwheel, see
-# http://en.wikipedia.org/wiki/Hue for more information. For instance the value
-# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
-# purple, and 360 is red again.
-# Minimum value: 0, maximum value: 359, default value: 220.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_COLORSTYLE_HUE = 220
-
-# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
-# in the HTML output. For a value of 0 the output will use grayscales only. A
-# value of 255 will produce the most vivid colors.
-# Minimum value: 0, maximum value: 255, default value: 100.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_COLORSTYLE_SAT = 100
-
-# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
-# luminance component of the colors in the HTML output. Values below 100
-# gradually make the output lighter, whereas values above 100 make the output
-# darker. The value divided by 100 is the actual gamma applied, so 80 represents
-# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
-# change the gamma.
-# Minimum value: 40, maximum value: 240, default value: 80.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_COLORSTYLE_GAMMA = 80
-
-# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
-# page will contain the date and time when the page was generated. Setting this
-# to NO can help when comparing the output of multiple runs.
-# The default value is: YES.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_TIMESTAMP = YES
-
-# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
-# documentation will contain sections that can be hidden and shown after the
-# page has loaded.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_DYNAMIC_SECTIONS = YES
-
-# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
-# shown in the various tree structured indices initially; the user can expand
-# and collapse entries dynamically later on. Doxygen will expand the tree to
-# such a level that at most the specified number of entries are visible (unless
-# a fully collapsed tree already exceeds this amount). So setting the number of
-# entries 1 will produce a full collapsed tree by default. 0 is a special value
-# representing an infinite number of entries and will result in a full expanded
-# tree by default.
-# Minimum value: 0, maximum value: 9999, default value: 100.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_INDEX_NUM_ENTRIES = 100
-
-# If the GENERATE_DOCSET tag is set to YES, additional index files will be
-# generated that can be used as input for Apple's Xcode 3 integrated development
-# environment (see: http://developer.apple.com/tools/xcode/), introduced with
-# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a
-# Makefile in the HTML output directory. Running make will produce the docset in
-# that directory and running make install will install the docset in
-# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
-# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
-# for more information.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-GENERATE_DOCSET = NO
-
-# This tag determines the name of the docset feed. A documentation feed provides
-# an umbrella under which multiple documentation sets from a single provider
-# (such as a company or product suite) can be grouped.
-# The default value is: Doxygen generated docs.
-# This tag requires that the tag GENERATE_DOCSET is set to YES.
-
-DOCSET_FEEDNAME = "Doxygen generated docs"
-
-# This tag specifies a string that should uniquely identify the documentation
-# set bundle. This should be a reverse domain-name style string, e.g.
-# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
-# The default value is: org.doxygen.Project.
-# This tag requires that the tag GENERATE_DOCSET is set to YES.
-
-DOCSET_BUNDLE_ID = org.doxygen.Project
-
-# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
-# the documentation publisher. This should be a reverse domain-name style
-# string, e.g. com.mycompany.MyDocSet.documentation.
-# The default value is: org.doxygen.Publisher.
-# This tag requires that the tag GENERATE_DOCSET is set to YES.
-
-DOCSET_PUBLISHER_ID = org.doxygen.Publisher
-
-# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
-# The default value is: Publisher.
-# This tag requires that the tag GENERATE_DOCSET is set to YES.
-
-DOCSET_PUBLISHER_NAME = Publisher
-
-# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
-# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
-# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
-# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on
-# Windows.
-#
-# The HTML Help Workshop contains a compiler that can convert all HTML output
-# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
-# files are now used as the Windows 98 help format, and will replace the old
-# Windows help format (.hlp) on all Windows platforms in the future. Compressed
-# HTML files also contain an index, a table of contents, and you can search for
-# words in the documentation. The HTML workshop also contains a viewer for
-# compressed HTML files.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-GENERATE_HTMLHELP = %HTML_HELP%
-
-# The CHM_FILE tag can be used to specify the file name of the resulting .chm
-# file. You can add a path in front of the file if the result should not be
-# written to the html output directory.
-# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
-
-CHM_FILE = jsoncpp-%JSONCPP_VERSION%.chm
-
-# The HHC_LOCATION tag can be used to specify the location (absolute path
-# including file name) of the HTML help compiler ( hhc.exe). If non-empty
-# doxygen will try to run the HTML help compiler on the generated index.hhp.
-# The file has to be specified with full path.
-# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
-
-HHC_LOCATION = "c:\Program Files\HTML Help Workshop\hhc.exe"
-
-# The GENERATE_CHI flag controls if a separate .chi index file is generated (
-# YES) or that it should be included in the master .chm file ( NO).
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
-
-GENERATE_CHI = YES
-
-# The CHM_INDEX_ENCODING is used to encode HtmlHelp index ( hhk), content ( hhc)
-# and project file content.
-# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
-
-CHM_INDEX_ENCODING =
-
-# The BINARY_TOC flag controls whether a binary table of contents is generated (
-# YES) or a normal table of contents ( NO) in the .chm file.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
-
-BINARY_TOC = YES
-
-# The TOC_EXPAND flag can be set to YES to add extra items for group members to
-# the table of contents of the HTML help documentation and to the tree view.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
-
-TOC_EXPAND = YES
-
-# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
-# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
-# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
-# (.qch) of the generated HTML documentation.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-GENERATE_QHP = NO
-
-# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
-# the file name of the resulting .qch file. The path specified is relative to
-# the HTML output folder.
-# This tag requires that the tag GENERATE_QHP is set to YES.
-
-QCH_FILE =
-
-# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
-# Project output. For more information please see Qt Help Project / Namespace
-# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace).
-# The default value is: org.doxygen.Project.
-# This tag requires that the tag GENERATE_QHP is set to YES.
-
-QHP_NAMESPACE =
-
-# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
-# Help Project output. For more information please see Qt Help Project / Virtual
-# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-
-# folders).
-# The default value is: doc.
-# This tag requires that the tag GENERATE_QHP is set to YES.
-
-QHP_VIRTUAL_FOLDER = doc
-
-# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
-# filter to add. For more information please see Qt Help Project / Custom
-# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
-# filters).
-# This tag requires that the tag GENERATE_QHP is set to YES.
-
-QHP_CUST_FILTER_NAME =
-
-# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
-# custom filter to add. For more information please see Qt Help Project / Custom
-# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
-# filters).
-# This tag requires that the tag GENERATE_QHP is set to YES.
-
-QHP_CUST_FILTER_ATTRS =
-
-# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
-# project's filter section matches. Qt Help Project / Filter Attributes (see:
-# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).
-# This tag requires that the tag GENERATE_QHP is set to YES.
-
-QHP_SECT_FILTER_ATTRS =
-
-# The QHG_LOCATION tag can be used to specify the location of Qt's
-# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
-# generated .qhp file.
-# This tag requires that the tag GENERATE_QHP is set to YES.
-
-QHG_LOCATION =
-
-# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
-# generated, together with the HTML files, they form an Eclipse help plugin. To
-# install this plugin and make it available under the help contents menu in
-# Eclipse, the contents of the directory containing the HTML and XML files needs
-# to be copied into the plugins directory of eclipse. The name of the directory
-# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
-# After copying Eclipse needs to be restarted before the help appears.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-GENERATE_ECLIPSEHELP = NO
-
-# A unique identifier for the Eclipse help plugin. When installing the plugin
-# the directory name containing the HTML and XML files should also have this
-# name. Each documentation set should have its own identifier.
-# The default value is: org.doxygen.Project.
-# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
-
-ECLIPSE_DOC_ID = org.doxygen.Project
-
-# If you want full control over the layout of the generated HTML pages it might
-# be necessary to disable the index and replace it with your own. The
-# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
-# of each HTML page. A value of NO enables the index and the value YES disables
-# it. Since the tabs in the index contain the same information as the navigation
-# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-DISABLE_INDEX = NO
-
-# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
-# structure should be generated to display hierarchical information. If the tag
-# value is set to YES, a side panel will be generated containing a tree-like
-# index structure (just like the one that is generated for HTML Help). For this
-# to work a browser that supports JavaScript, DHTML, CSS and frames is required
-# (i.e. any modern browser). Windows users are probably better off using the
-# HTML help feature. Via custom stylesheets (see HTML_EXTRA_STYLESHEET) one can
-# further fine-tune the look of the index. As an example, the default style
-# sheet generated by doxygen has an example that shows how to put an image at
-# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
-# the same information as the tab index, you could consider setting
-# DISABLE_INDEX to YES when enabling this option.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-GENERATE_TREEVIEW = NO
-
-# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
-# doxygen will group on one line in the generated HTML documentation.
-#
-# Note that a value of 0 will completely suppress the enum values from appearing
-# in the overview section.
-# Minimum value: 0, maximum value: 20, default value: 4.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-ENUM_VALUES_PER_LINE = 4
-
-# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
-# to set the initial width (in pixels) of the frame in which the tree is shown.
-# Minimum value: 0, maximum value: 1500, default value: 250.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-TREEVIEW_WIDTH = 250
-
-# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open links to
-# external symbols imported via tag files in a separate window.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-EXT_LINKS_IN_WINDOW = NO
-
-# Use this tag to change the font size of LaTeX formulas included as images in
-# the HTML documentation. When you change the font size after a successful
-# doxygen run you need to manually remove any form_*.png images from the HTML
-# output directory to force them to be regenerated.
-# Minimum value: 8, maximum value: 50, default value: 10.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-FORMULA_FONTSIZE = 10
-
-# Use the FORMULA_TRANPARENT tag to determine whether or not the images
-# generated for formulas are transparent PNGs. Transparent PNGs are not
-# supported properly for IE 6.0, but are supported on all modern browsers.
-#
-# Note that when changing this option you need to delete any form_*.png files in
-# the HTML output directory before the changes have effect.
-# The default value is: YES.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-FORMULA_TRANSPARENT = YES
-
-# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
-# http://www.mathjax.org) which uses client side Javascript for the rendering
-# instead of using prerendered bitmaps. Use this if you do not have LaTeX
-# installed or if you want to formulas look prettier in the HTML output. When
-# enabled you may also need to install MathJax separately and configure the path
-# to it using the MATHJAX_RELPATH option.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-USE_MATHJAX = NO
-
-# When MathJax is enabled you can set the default output format to be used for
-# the MathJax output. See the MathJax site (see:
-# http://docs.mathjax.org/en/latest/output.html) for more details.
-# Possible values are: HTML-CSS (which is slower, but has the best
-# compatibility), NativeMML (i.e. MathML) and SVG.
-# The default value is: HTML-CSS.
-# This tag requires that the tag USE_MATHJAX is set to YES.
-
-MATHJAX_FORMAT = HTML-CSS
-
-# When MathJax is enabled you need to specify the location relative to the HTML
-# output directory using the MATHJAX_RELPATH option. The destination directory
-# should contain the MathJax.js script. For instance, if the mathjax directory
-# is located at the same level as the HTML output directory, then
-# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
-# Content Delivery Network so you can quickly see the result without installing
-# MathJax. However, it is strongly recommended to install a local copy of
-# MathJax from http://www.mathjax.org before deployment.
-# The default value is: http://cdn.mathjax.org/mathjax/latest.
-# This tag requires that the tag USE_MATHJAX is set to YES.
-
-MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest
-
-# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
-# extension names that should be enabled during MathJax rendering. For example
-# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
-# This tag requires that the tag USE_MATHJAX is set to YES.
-
-MATHJAX_EXTENSIONS =
-
-# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
-# of code that will be used on startup of the MathJax code. See the MathJax site
-# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
-# example see the documentation.
-# This tag requires that the tag USE_MATHJAX is set to YES.
-
-MATHJAX_CODEFILE =
-
-# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
-# the HTML output. The underlying search engine uses javascript and DHTML and
-# should work on any modern browser. Note that when using HTML help
-# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
-# there is already a search function so this one should typically be disabled.
-# For large projects the javascript based search engine can be slow, then
-# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
-# search using the keyboard; to jump to the search box use <access key> + S
-# (what the <access key> is depends on the OS and browser, but it is typically
-# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
-# key> to jump into the search results window, the results can be navigated
-# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
-# the search. The filter options can be selected when the cursor is inside the
-# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
-# to select a filter and <Enter> or <escape> to activate or cancel the filter
-# option.
-# The default value is: YES.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-SEARCHENGINE = NO
-
-# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
-# implemented using a web server instead of a web client using Javascript. There
-# are two flavours of web server based searching depending on the
-# EXTERNAL_SEARCH setting. When disabled, doxygen will generate a PHP script for
-# searching and an index file used by the script. When EXTERNAL_SEARCH is
-# enabled the indexing and searching needs to be provided by external tools. See
-# the section "External Indexing and Searching" for details.
-# The default value is: NO.
-# This tag requires that the tag SEARCHENGINE is set to YES.
-
-SERVER_BASED_SEARCH = NO
-
-# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
-# script for searching. Instead the search results are written to an XML file
-# which needs to be processed by an external indexer. Doxygen will invoke an
-# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
-# search results.
-#
-# Doxygen ships with an example indexer ( doxyindexer) and search engine
-# (doxysearch.cgi) which are based on the open source search engine library
-# Xapian (see: http://xapian.org/).
-#
-# See the section "External Indexing and Searching" for details.
-# The default value is: NO.
-# This tag requires that the tag SEARCHENGINE is set to YES.
-
-EXTERNAL_SEARCH = NO
-
-# The SEARCHENGINE_URL should point to a search engine hosted by a web server
-# which will return the search results when EXTERNAL_SEARCH is enabled.
-#
-# Doxygen ships with an example indexer ( doxyindexer) and search engine
-# (doxysearch.cgi) which are based on the open source search engine library
-# Xapian (see: http://xapian.org/). See the section "External Indexing and
-# Searching" for details.
-# This tag requires that the tag SEARCHENGINE is set to YES.
-
-SEARCHENGINE_URL =
-
-# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
-# search data is written to a file for indexing by an external tool. With the
-# SEARCHDATA_FILE tag the name of this file can be specified.
-# The default file is: searchdata.xml.
-# This tag requires that the tag SEARCHENGINE is set to YES.
-
-SEARCHDATA_FILE = searchdata.xml
-
-# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
-# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
-# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
-# projects and redirect the results back to the right project.
-# This tag requires that the tag SEARCHENGINE is set to YES.
-
-EXTERNAL_SEARCH_ID =
-
-# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
-# projects other than the one defined by this configuration file, but that are
-# all added to the same external search index. Each project needs to have a
-# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
-# to a relative location where the documentation can be found. The format is:
-# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
-# This tag requires that the tag SEARCHENGINE is set to YES.
-
-EXTRA_SEARCH_MAPPINGS =
-
-#---------------------------------------------------------------------------
-# Configuration options related to the LaTeX output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_LATEX tag is set to YES doxygen will generate LaTeX output.
-# The default value is: YES.
-
-GENERATE_LATEX = NO
-
-# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
-# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
-# it.
-# The default directory is: latex.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_OUTPUT = latex
-
-# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
-# invoked.
-#
-# Note that when enabling USE_PDFLATEX this option is only used for generating
-# bitmaps for formulas in the HTML output, but not in the Makefile that is
-# written to the output directory.
-# The default file is: latex.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_CMD_NAME = latex
-
-# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
-# index for LaTeX.
-# The default file is: makeindex.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-MAKEINDEX_CMD_NAME = makeindex
-
-# If the COMPACT_LATEX tag is set to YES doxygen generates more compact LaTeX
-# documents. This may be useful for small projects and may help to save some
-# trees in general.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-COMPACT_LATEX = NO
-
-# The PAPER_TYPE tag can be used to set the paper type that is used by the
-# printer.
-# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
-# 14 inches) and executive (7.25 x 10.5 inches).
-# The default value is: a4.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-PAPER_TYPE = a4wide
-
-# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
-# that should be included in the LaTeX output. To get the times font for
-# instance you can specify
-# EXTRA_PACKAGES=times
-# If left blank no extra packages will be included.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-EXTRA_PACKAGES =
-
-# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
-# generated LaTeX document. The header should contain everything until the first
-# chapter. If it is left blank doxygen will generate a standard header. See
-# section "Doxygen usage" for information on how to let doxygen write the
-# default header to a separate file.
-#
-# Note: Only use a user-defined header if you know what you are doing! The
-# following commands have a special meaning inside the header: $title,
-# $datetime, $date, $doxygenversion, $projectname, $projectnumber. Doxygen will
-# replace them by respectively the title of the page, the current date and time,
-# only the current date, the version number of doxygen, the project name (see
-# PROJECT_NAME), or the project number (see PROJECT_NUMBER).
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_HEADER =
-
-# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
-# generated LaTeX document. The footer should contain everything after the last
-# chapter. If it is left blank doxygen will generate a standard footer.
-#
-# Note: Only use a user-defined footer if you know what you are doing!
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_FOOTER =
-
-# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
-# other source files which should be copied to the LATEX_OUTPUT output
-# directory. Note that the files will be copied as-is; there are no commands or
-# markers available.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_EXTRA_FILES =
-
-# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
-# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
-# contain links (just like the HTML output) instead of page references. This
-# makes the output suitable for online browsing using a PDF viewer.
-# The default value is: YES.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-PDF_HYPERLINKS = NO
-
-# If the LATEX_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
-# the PDF file directly from the LaTeX files. Set this option to YES to get a
-# higher quality PDF documentation.
-# The default value is: YES.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-USE_PDFLATEX = NO
-
-# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
-# command to the generated LaTeX files. This will instruct LaTeX to keep running
-# if errors occur, instead of asking the user for help. This option is also used
-# when generating formulas in HTML.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_BATCHMODE = NO
-
-# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
-# index chapters (such as File Index, Compound Index, etc.) in the output.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_HIDE_INDICES = NO
-
-# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
-# code with syntax highlighting in the LaTeX output.
-#
-# Note that which sources are shown also depends on other settings such as
-# SOURCE_BROWSER.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_SOURCE_CODE = NO
-
-# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
-# bibliography, e.g. plainnat, or ieeetr. See
-# http://en.wikipedia.org/wiki/BibTeX and \cite for more info.
-# The default value is: plain.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_BIB_STYLE = plain
-
-#---------------------------------------------------------------------------
-# Configuration options related to the RTF output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_RTF tag is set to YES doxygen will generate RTF output. The
-# RTF output is optimized for Word 97 and may not look too pretty with other RTF
-# readers/editors.
-# The default value is: NO.
-
-GENERATE_RTF = NO
-
-# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
-# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
-# it.
-# The default directory is: rtf.
-# This tag requires that the tag GENERATE_RTF is set to YES.
-
-RTF_OUTPUT = rtf
-
-# If the COMPACT_RTF tag is set to YES doxygen generates more compact RTF
-# documents. This may be useful for small projects and may help to save some
-# trees in general.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_RTF is set to YES.
-
-COMPACT_RTF = NO
-
-# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
-# contain hyperlink fields. The RTF file will contain links (just like the HTML
-# output) instead of page references. This makes the output suitable for online
-# browsing using Word or some other Word compatible readers that support those
-# fields.
-#
-# Note: WordPad (write) and others do not support links.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_RTF is set to YES.
-
-RTF_HYPERLINKS = NO
-
-# Load stylesheet definitions from file. Syntax is similar to doxygen's config
-# file, i.e. a series of assignments. You only have to provide replacements,
-# missing definitions are set to their default value.
-#
-# See also section "Doxygen usage" for information on how to generate the
-# default style sheet that doxygen normally uses.
-# This tag requires that the tag GENERATE_RTF is set to YES.
-
-RTF_STYLESHEET_FILE =
-
-# Set optional variables used in the generation of an RTF document. Syntax is
-# similar to doxygen's config file. A template extensions file can be generated
-# using doxygen -e rtf extensionFile.
-# This tag requires that the tag GENERATE_RTF is set to YES.
-
-RTF_EXTENSIONS_FILE =
-
-#---------------------------------------------------------------------------
-# Configuration options related to the man page output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_MAN tag is set to YES doxygen will generate man pages for
-# classes and files.
-# The default value is: NO.
-
-GENERATE_MAN = NO
-
-# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
-# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
-# it. A directory man3 will be created inside the directory specified by
-# MAN_OUTPUT.
-# The default directory is: man.
-# This tag requires that the tag GENERATE_MAN is set to YES.
-
-MAN_OUTPUT = man
-
-# The MAN_EXTENSION tag determines the extension that is added to the generated
-# man pages. In case the manual section does not start with a number, the number
-# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
-# optional.
-# The default value is: .3.
-# This tag requires that the tag GENERATE_MAN is set to YES.
-
-MAN_EXTENSION = .3
-
-# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
-# will generate one additional man file for each entity documented in the real
-# man page(s). These additional files only source the real man page, but without
-# them the man command would be unable to find the correct page.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_MAN is set to YES.
-
-MAN_LINKS = NO
-
-#---------------------------------------------------------------------------
-# Configuration options related to the XML output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_XML tag is set to YES doxygen will generate an XML file that
-# captures the structure of the code including all documentation.
-# The default value is: NO.
-
-GENERATE_XML = NO
-
-# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
-# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
-# it.
-# The default directory is: xml.
-# This tag requires that the tag GENERATE_XML is set to YES.
-
-XML_OUTPUT = xml
-
-# The XML_SCHEMA tag can be used to specify a XML schema, which can be used by a
-# validating XML parser to check the syntax of the XML files.
-# This tag requires that the tag GENERATE_XML is set to YES.
-
-XML_SCHEMA =
-
-# The XML_DTD tag can be used to specify a XML DTD, which can be used by a
-# validating XML parser to check the syntax of the XML files.
-# This tag requires that the tag GENERATE_XML is set to YES.
-
-XML_DTD =
-
-# If the XML_PROGRAMLISTING tag is set to YES doxygen will dump the program
-# listings (including syntax highlighting and cross-referencing information) to
-# the XML output. Note that enabling this will significantly increase the size
-# of the XML output.
-# The default value is: YES.
-# This tag requires that the tag GENERATE_XML is set to YES.
-
-XML_PROGRAMLISTING = YES
-
-#---------------------------------------------------------------------------
-# Configuration options related to the DOCBOOK output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_DOCBOOK tag is set to YES doxygen will generate Docbook files
-# that can be used to generate PDF.
-# The default value is: NO.
-
-GENERATE_DOCBOOK = NO
-
-# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
-# front of it.
-# The default directory is: docbook.
-# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
-
-DOCBOOK_OUTPUT = docbook
-
-#---------------------------------------------------------------------------
-# Configuration options for the AutoGen Definitions output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_AUTOGEN_DEF tag is set to YES doxygen will generate an AutoGen
-# Definitions (see http://autogen.sf.net) file that captures the structure of
-# the code including all documentation. Note that this feature is still
-# experimental and incomplete at the moment.
-# The default value is: NO.
-
-GENERATE_AUTOGEN_DEF = NO
-
-#---------------------------------------------------------------------------
-# Configuration options related to the Perl module output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_PERLMOD tag is set to YES doxygen will generate a Perl module
-# file that captures the structure of the code including all documentation.
-#
-# Note that this feature is still experimental and incomplete at the moment.
-# The default value is: NO.
-
-GENERATE_PERLMOD = NO
-
-# If the PERLMOD_LATEX tag is set to YES doxygen will generate the necessary
-# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
-# output from the Perl module output.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_PERLMOD is set to YES.
-
-PERLMOD_LATEX = NO
-
-# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be nicely
-# formatted so it can be parsed by a human reader. This is useful if you want to
-# understand what is going on. On the other hand, if this tag is set to NO the
-# size of the Perl module output will be much smaller and Perl will parse it
-# just the same.
-# The default value is: YES.
-# This tag requires that the tag GENERATE_PERLMOD is set to YES.
-
-PERLMOD_PRETTY = YES
-
-# The names of the make variables in the generated doxyrules.make file are
-# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
-# so different doxyrules.make files included by the same Makefile don't
-# overwrite each other's variables.
-# This tag requires that the tag GENERATE_PERLMOD is set to YES.
-
-PERLMOD_MAKEVAR_PREFIX =
-
-#---------------------------------------------------------------------------
-# Configuration options related to the preprocessor
-#---------------------------------------------------------------------------
-
-# If the ENABLE_PREPROCESSING tag is set to YES doxygen will evaluate all
-# C-preprocessor directives found in the sources and include files.
-# The default value is: YES.
-
-ENABLE_PREPROCESSING = YES
-
-# If the MACRO_EXPANSION tag is set to YES doxygen will expand all macro names
-# in the source code. If set to NO only conditional compilation will be
-# performed. Macro expansion can be done in a controlled way by setting
-# EXPAND_ONLY_PREDEF to YES.
-# The default value is: NO.
-# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-
-MACRO_EXPANSION = YES
-
-# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
-# the macro expansion is limited to the macros specified with the PREDEFINED and
-# EXPAND_AS_DEFINED tags.
-# The default value is: NO.
-# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-
-EXPAND_ONLY_PREDEF = NO
-
-# If the SEARCH_INCLUDES tag is set to YES the includes files in the
-# INCLUDE_PATH will be searched if a #include is found.
-# The default value is: YES.
-# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-
-SEARCH_INCLUDES = YES
-
-# The INCLUDE_PATH tag can be used to specify one or more directories that
-# contain include files that are not input files but should be processed by the
-# preprocessor.
-# This tag requires that the tag SEARCH_INCLUDES is set to YES.
-
-INCLUDE_PATH = ../include
-
-# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
-# patterns (like *.h and *.hpp) to filter out the header-files in the
-# directories. If left blank, the patterns specified with FILE_PATTERNS will be
-# used.
-# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-
-INCLUDE_FILE_PATTERNS = *.h
-
-# The PREDEFINED tag can be used to specify one or more macro names that are
-# defined before the preprocessor is started (similar to the -D option of e.g.
-# gcc). The argument of the tag is a list of macros of the form: name or
-# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
-# is assumed. To prevent a macro definition from being undefined via #undef or
-# recursively expanded use the := operator instead of the = operator.
-# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-
-PREDEFINED = "_MSC_VER=1400" \
- _CPPRTTI \
- _WIN32 \
- JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
-
-# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
-# tag can be used to specify a list of macro names that should be expanded. The
-# macro definition that is found in the sources will be used. Use the PREDEFINED
-# tag if you want to use a different macro definition that overrules the
-# definition found in the source code.
-# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-
-EXPAND_AS_DEFINED =
-
-# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
-# remove all refrences to function-like macros that are alone on a line, have an
-# all uppercase name, and do not end with a semicolon. Such function macros are
-# typically used for boiler-plate code, and will confuse the parser if not
-# removed.
-# The default value is: YES.
-# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-
-SKIP_FUNCTION_MACROS = YES
-
-#---------------------------------------------------------------------------
-# Configuration options related to external references
-#---------------------------------------------------------------------------
-
-# The TAGFILES tag can be used to specify one or more tag files. For each tag
-# file the location of the external documentation should be added. The format of
-# a tag file without this location is as follows:
-# TAGFILES = file1 file2 ...
-# Adding location for the tag files is done as follows:
-# TAGFILES = file1=loc1 "file2 = loc2" ...
-# where loc1 and loc2 can be relative or absolute paths or URLs. See the
-# section "Linking to external documentation" for more information about the use
-# of tag files.
-# Note: Each tag file must have an unique name (where the name does NOT include
-# the path). If a tag file is not located in the directory in which doxygen is
-# run, you must also specify the path to the tagfile here.
-
-TAGFILES =
-
-# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
-# tag file that is based on the input files it reads. See section "Linking to
-# external documentation" for more information about the usage of tag files.
-
-GENERATE_TAGFILE =
-
-# If the ALLEXTERNALS tag is set to YES all external class will be listed in the
-# class index. If set to NO only the inherited external classes will be listed.
-# The default value is: NO.
-
-ALLEXTERNALS = NO
-
-# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed in
-# the modules index. If set to NO, only the current project's groups will be
-# listed.
-# The default value is: YES.
-
-EXTERNAL_GROUPS = YES
-
-# If the EXTERNAL_PAGES tag is set to YES all external pages will be listed in
-# the related pages index. If set to NO, only the current project's pages will
-# be listed.
-# The default value is: YES.
-
-EXTERNAL_PAGES = YES
-
-# The PERL_PATH should be the absolute path and name of the perl script
-# interpreter (i.e. the result of 'which perl').
-# The default file (with absolute path) is: /usr/bin/perl.
-
-PERL_PATH = /usr/bin/perl
-
-#---------------------------------------------------------------------------
-# Configuration options related to the dot tool
-#---------------------------------------------------------------------------
-
-# If the CLASS_DIAGRAMS tag is set to YES doxygen will generate a class diagram
-# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
-# NO turns the diagrams off. Note that this option also works with HAVE_DOT
-# disabled, but it is recommended to install and use dot, since it yields more
-# powerful graphs.
-# The default value is: YES.
-
-CLASS_DIAGRAMS = NO
-
-# You can define message sequence charts within doxygen comments using the \msc
-# command. Doxygen will then run the mscgen tool (see:
-# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
-# documentation. The MSCGEN_PATH tag allows you to specify the directory where
-# the mscgen tool resides. If left empty the tool is assumed to be found in the
-# default search path.
-
-MSCGEN_PATH =
-
-# If set to YES, the inheritance and collaboration graphs will hide inheritance
-# and usage relations if the target is undocumented or is not a class.
-# The default value is: YES.
-
-HIDE_UNDOC_RELATIONS = NO
-
-# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
-# available from the path. This tool is part of Graphviz (see:
-# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
-# Bell Labs. The other options in this section have no effect if this option is
-# set to NO
-# The default value is: NO.
-
-HAVE_DOT = %HAVE_DOT%
-
-# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
-# to run in parallel. When set to 0 doxygen will base this on the number of
-# processors available in the system. You can set it explicitly to a value
-# larger than 0 to get control over the balance between CPU load and processing
-# speed.
-# Minimum value: 0, maximum value: 32, default value: 0.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOT_NUM_THREADS = 0
-
-# When you want a differently looking font n the dot files that doxygen
-# generates you can specify the font name using DOT_FONTNAME. You need to make
-# sure dot is able to find the font, which can be done by putting it in a
-# standard location or by setting the DOTFONTPATH environment variable or by
-# setting DOT_FONTPATH to the directory containing the font.
-# The default value is: Helvetica.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOT_FONTNAME = FreeSans
-
-# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
-# dot graphs.
-# Minimum value: 4, maximum value: 24, default value: 10.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOT_FONTSIZE = 10
-
-# By default doxygen will tell dot to use the default font as specified with
-# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
-# the path where dot can find it using this tag.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOT_FONTPATH =
-
-# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
-# each documented class showing the direct and indirect inheritance relations.
-# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-CLASS_GRAPH = YES
-
-# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
-# graph for each documented class showing the direct and indirect implementation
-# dependencies (inheritance, containment, and class references variables) of the
-# class with other documented classes.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-COLLABORATION_GRAPH = YES
-
-# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
-# groups, showing the direct groups dependencies.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-GROUP_GRAPHS = YES
-
-# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
-# collaboration diagrams in a style similar to the OMG's Unified Modeling
-# Language.
-# The default value is: NO.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-UML_LOOK = %UML_LOOK%
-
-# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
-# class node. If there are many fields or methods and many nodes the graph may
-# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
-# number of items for each type to make the size more manageable. Set this to 0
-# for no limit. Note that the threshold may be exceeded by 50% before the limit
-# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
-# but if the number exceeds 15, the total amount of fields shown is limited to
-# 10.
-# Minimum value: 0, maximum value: 100, default value: 10.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-UML_LIMIT_NUM_FIELDS = 10
-
-# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
-# collaboration graphs will show the relations between templates and their
-# instances.
-# The default value is: NO.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-TEMPLATE_RELATIONS = YES
-
-# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
-# YES then doxygen will generate a graph for each documented file showing the
-# direct and indirect include dependencies of the file with other documented
-# files.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-INCLUDE_GRAPH = YES
-
-# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
-# set to YES then doxygen will generate a graph for each documented file showing
-# the direct and indirect include dependencies of the file with other documented
-# files.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-INCLUDED_BY_GRAPH = YES
-
-# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
-# dependency graph for every global function or class method.
-#
-# Note that enabling this option will significantly increase the time of a run.
-# So in most cases it will be better to enable call graphs for selected
-# functions only using the \callgraph command.
-# The default value is: NO.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-CALL_GRAPH = NO
-
-# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
-# dependency graph for every global function or class method.
-#
-# Note that enabling this option will significantly increase the time of a run.
-# So in most cases it will be better to enable caller graphs for selected
-# functions only using the \callergraph command.
-# The default value is: NO.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-CALLER_GRAPH = YES
-
-# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
-# hierarchy of all classes instead of a textual one.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-GRAPHICAL_HIERARCHY = YES
-
-# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
-# dependencies a directory has on other directories in a graphical way. The
-# dependency relations are determined by the #include relations between the
-# files in the directories.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DIRECTORY_GRAPH = YES
-
-# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
-# generated by dot.
-# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
-# to make the SVG files visible in IE 9+ (other browsers do not have this
-# requirement).
-# Possible values are: png, jpg, gif and svg.
-# The default value is: png.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOT_IMAGE_FORMAT = png
-
-# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
-# enable generation of interactive SVG images that allow zooming and panning.
-#
-# Note that this requires a modern browser other than Internet Explorer. Tested
-# and working are Firefox, Chrome, Safari, and Opera.
-# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
-# the SVG files visible. Older versions of IE do not have SVG support.
-# The default value is: NO.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-INTERACTIVE_SVG = NO
-
-# The DOT_PATH tag can be used to specify the path where the dot tool can be
-# found. If left blank, it is assumed the dot tool can be found in the path.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOT_PATH = %DOT_PATH%
-
-# The DOTFILE_DIRS tag can be used to specify one or more directories that
-# contain dot files that are included in the documentation (see the \dotfile
-# command).
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOTFILE_DIRS =
-
-# The MSCFILE_DIRS tag can be used to specify one or more directories that
-# contain msc files that are included in the documentation (see the \mscfile
-# command).
-
-MSCFILE_DIRS =
-
-# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
-# that will be shown in the graph. If the number of nodes in a graph becomes
-# larger than this value, doxygen will truncate the graph, which is visualized
-# by representing a node as a red box. Note that doxygen if the number of direct
-# children of the root node in a graph is already larger than
-# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
-# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
-# Minimum value: 0, maximum value: 10000, default value: 50.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOT_GRAPH_MAX_NODES = 50
-
-# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
-# generated by dot. A depth value of 3 means that only nodes reachable from the
-# root by following a path via at most 3 edges will be shown. Nodes that lay
-# further from the root node will be omitted. Note that setting this option to 1
-# or 2 may greatly reduce the computation time needed for large code bases. Also
-# note that the size of a graph can be further restricted by
-# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
-# Minimum value: 0, maximum value: 1000, default value: 0.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-MAX_DOT_GRAPH_DEPTH = 1000
-
-# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
-# background. This is disabled by default, because dot on Windows does not seem
-# to support this out of the box.
-#
-# Warning: Depending on the platform used, enabling this option may lead to
-# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
-# read).
-# The default value is: NO.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOT_TRANSPARENT = NO
-
-# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
-# files in one run (i.e. multiple -o and -T options on the command line). This
-# makes dot run faster, but since only newer versions of dot (>1.8.10) support
-# this, this feature is disabled by default.
-# The default value is: NO.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOT_MULTI_TARGETS = YES
-
-# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
-# explaining the meaning of the various boxes and arrows in the dot generated
-# graphs.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-GENERATE_LEGEND = YES
-
-# If the DOT_CLEANUP tag is set to YES doxygen will remove the intermediate dot
-# files that are used to generate the various graphs.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOT_CLEANUP = YES
diff --git a/3rdparty/jsoncpp/doxybuild.py b/3rdparty/jsoncpp/doxybuild.py
deleted file mode 100644
index f18c9c0697b..00000000000
--- a/3rdparty/jsoncpp/doxybuild.py
+++ /dev/null
@@ -1,189 +0,0 @@
-"""Script to generate doxygen documentation.
-"""
-from __future__ import print_function
-from __future__ import unicode_literals
-from devtools import tarball
-from contextlib import contextmanager
-import subprocess
-import traceback
-import re
-import os
-import sys
-import shutil
-
-@contextmanager
-def cd(newdir):
- """
- http://stackoverflow.com/questions/431684/how-do-i-cd-in-python
- """
- prevdir = os.getcwd()
- os.chdir(newdir)
- try:
- yield
- finally:
- os.chdir(prevdir)
-
-def find_program(*filenames):
- """find a program in folders path_lst, and sets env[var]
- @param filenames: a list of possible names of the program to search for
- @return: the full path of the filename if found, or '' if filename could not be found
-"""
- paths = os.environ.get('PATH', '').split(os.pathsep)
- suffixes = ('win32' in sys.platform) and '.exe .com .bat .cmd' or ''
- for filename in filenames:
- for name in [filename+ext for ext in suffixes.split(' ')]:
- for directory in paths:
- full_path = os.path.join(directory, name)
- if os.path.isfile(full_path):
- return full_path
- return ''
-
-def do_subst_in_file(targetfile, sourcefile, dict):
- """Replace all instances of the keys of dict with their values.
- For example, if dict is {'%VERSION%': '1.2345', '%BASE%': 'MyProg'},
- then all instances of %VERSION% in the file will be replaced with 1.2345 etc.
- """
- with open(sourcefile, 'r') as f:
- contents = f.read()
- for (k,v) in list(dict.items()):
- v = v.replace('\\','\\\\')
- contents = re.sub(k, v, contents)
- with open(targetfile, 'w') as f:
- f.write(contents)
-
-def getstatusoutput(cmd):
- """cmd is a list.
- """
- try:
- process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
- output, _ = process.communicate()
- status = process.returncode
- except:
- status = -1
- output = traceback.format_exc()
- return status, output
-
-def run_cmd(cmd, silent=False):
- """Raise exception on failure.
- """
- info = 'Running: %r in %r' %(' '.join(cmd), os.getcwd())
- print(info)
- sys.stdout.flush()
- if silent:
- status, output = getstatusoutput(cmd)
- else:
- status, output = subprocess.call(cmd), ''
- if status:
- msg = 'Error while %s ...\n\terror=%d, output="""%s"""' %(info, status, output)
- raise Exception(msg)
-
-def assert_is_exe(path):
- if not path:
- raise Exception('path is empty.')
- if not os.path.isfile(path):
- raise Exception('%r is not a file.' %path)
- if not os.access(path, os.X_OK):
- raise Exception('%r is not executable by this user.' %path)
-
-def run_doxygen(doxygen_path, config_file, working_dir, is_silent):
- assert_is_exe(doxygen_path)
- config_file = os.path.abspath(config_file)
- with cd(working_dir):
- cmd = [doxygen_path, config_file]
- run_cmd(cmd, is_silent)
-
-def build_doc(options, make_release=False):
- if make_release:
- options.make_tarball = True
- options.with_dot = True
- options.with_html_help = True
- options.with_uml_look = True
- options.open = False
- options.silent = True
-
- version = open('version', 'rt').read().strip()
- output_dir = 'dist/doxygen' # relative to doc/doxyfile location.
- if not os.path.isdir(output_dir):
- os.makedirs(output_dir)
- top_dir = os.path.abspath('.')
- html_output_dirname = 'jsoncpp-api-html-' + version
- tarball_path = os.path.join('dist', html_output_dirname + '.tar.gz')
- warning_log_path = os.path.join(output_dir, '../jsoncpp-doxygen-warning.log')
- html_output_path = os.path.join(output_dir, html_output_dirname)
- def yesno(bool):
- return bool and 'YES' or 'NO'
- subst_keys = {
- '%JSONCPP_VERSION%': version,
- '%DOC_TOPDIR%': '',
- '%TOPDIR%': top_dir,
- '%HTML_OUTPUT%': os.path.join('..', output_dir, html_output_dirname),
- '%HAVE_DOT%': yesno(options.with_dot),
- '%DOT_PATH%': os.path.split(options.dot_path)[0],
- '%HTML_HELP%': yesno(options.with_html_help),
- '%UML_LOOK%': yesno(options.with_uml_look),
- '%WARNING_LOG_PATH%': os.path.join('..', warning_log_path)
- }
-
- if os.path.isdir(output_dir):
- print('Deleting directory:', output_dir)
- shutil.rmtree(output_dir)
- if not os.path.isdir(output_dir):
- os.makedirs(output_dir)
-
- do_subst_in_file('doc/doxyfile', options.doxyfile_input_path, subst_keys)
- run_doxygen(options.doxygen_path, 'doc/doxyfile', 'doc', is_silent=options.silent)
- if not options.silent:
- print(open(warning_log_path, 'r').read())
- index_path = os.path.abspath(os.path.join('doc', subst_keys['%HTML_OUTPUT%'], 'index.html'))
- print('Generated documentation can be found in:')
- print(index_path)
- if options.open:
- import webbrowser
- webbrowser.open('file://' + index_path)
- if options.make_tarball:
- print('Generating doc tarball to', tarball_path)
- tarball_sources = [
- output_dir,
- 'README.md',
- 'LICENSE',
- 'NEWS.txt',
- 'version'
- ]
- tarball_basedir = os.path.join(output_dir, html_output_dirname)
- tarball.make_tarball(tarball_path, tarball_sources, tarball_basedir, html_output_dirname)
- return tarball_path, html_output_dirname
-
-def main():
- usage = """%prog
- Generates doxygen documentation in build/doxygen.
- Optionaly makes a tarball of the documentation to dist/.
-
- Must be started in the project top directory.
- """
- from optparse import OptionParser
- parser = OptionParser(usage=usage)
- parser.allow_interspersed_args = False
- parser.add_option('--with-dot', dest="with_dot", action='store_true', default=False,
- help="""Enable usage of DOT to generate collaboration diagram""")
- parser.add_option('--dot', dest="dot_path", action='store', default=find_program('dot'),
- help="""Path to GraphViz dot tool. Must be full qualified path. [Default: %default]""")
- parser.add_option('--doxygen', dest="doxygen_path", action='store', default=find_program('doxygen'),
- help="""Path to Doxygen tool. [Default: %default]""")
- parser.add_option('--in', dest="doxyfile_input_path", action='store', default='doc/doxyfile.in',
- help="""Path to doxygen inputs. [Default: %default]""")
- parser.add_option('--with-html-help', dest="with_html_help", action='store_true', default=False,
- help="""Enable generation of Microsoft HTML HELP""")
- parser.add_option('--no-uml-look', dest="with_uml_look", action='store_false', default=True,
- help="""Generates DOT graph without UML look [Default: False]""")
- parser.add_option('--open', dest="open", action='store_true', default=False,
- help="""Open the HTML index in the web browser after generation""")
- parser.add_option('--tarball', dest="make_tarball", action='store_true', default=False,
- help="""Generates a tarball of the documentation in dist/ directory""")
- parser.add_option('-s', '--silent', dest="silent", action='store_true', default=False,
- help="""Hides doxygen output""")
- parser.enable_interspersed_args()
- options, args = parser.parse_args()
- build_doc(options)
-
-if __name__ == '__main__':
- main()
diff --git a/3rdparty/jsoncpp/include/CMakeLists.txt b/3rdparty/jsoncpp/include/CMakeLists.txt
deleted file mode 100644
index 7dde10d6feb..00000000000
--- a/3rdparty/jsoncpp/include/CMakeLists.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-FILE(GLOB INCLUDE_FILES "json/*.h")
-INSTALL(FILES ${INCLUDE_FILES} DESTINATION ${INCLUDE_INSTALL_DIR}/json)
diff --git a/3rdparty/jsoncpp/include/json/assertions.h b/3rdparty/jsoncpp/include/json/assertions.h
deleted file mode 100644
index fbec7ae00e2..00000000000
--- a/3rdparty/jsoncpp/include/json/assertions.h
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright 2007-2010 Baptiste Lepilleur
-// Distributed under MIT license, or public domain if desired and
-// recognized in your jurisdiction.
-// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
-
-#ifndef CPPTL_JSON_ASSERTIONS_H_INCLUDED
-#define CPPTL_JSON_ASSERTIONS_H_INCLUDED
-
-#include <stdlib.h>
-#include <sstream>
-
-#if !defined(JSON_IS_AMALGAMATION)
-#include "config.h"
-#endif // if !defined(JSON_IS_AMALGAMATION)
-
-/** It should not be possible for a maliciously designed file to
- * cause an abort() or seg-fault, so these macros are used only
- * for pre-condition violations and internal logic errors.
- */
-#if JSON_USE_EXCEPTION
-
-// @todo <= add detail about condition in exception
-# define JSON_ASSERT(condition) \
- {if (!(condition)) {Json::throwLogicError( "assert json failed" );}}
-
-# define JSON_FAIL_MESSAGE(message) \
- { \
- std::ostringstream oss; oss << message; \
- Json::throwLogicError(oss.str()); \
- abort(); \
- }
-
-#else // JSON_USE_EXCEPTION
-
-# define JSON_ASSERT(condition) assert(condition)
-
-// The call to assert() will show the failure message in debug builds. In
-// release builds we abort, for a core-dump or debugger.
-# define JSON_FAIL_MESSAGE(message) \
- { \
- std::ostringstream oss; oss << message; \
- assert(false && oss.str().c_str()); \
- abort(); \
- }
-
-
-#endif
-
-#define JSON_ASSERT_MESSAGE(condition, message) \
- if (!(condition)) { \
- JSON_FAIL_MESSAGE(message); \
- }
-
-#endif // CPPTL_JSON_ASSERTIONS_H_INCLUDED
diff --git a/3rdparty/jsoncpp/include/json/autolink.h b/3rdparty/jsoncpp/include/json/autolink.h
deleted file mode 100644
index 6fcc8afac57..00000000000
--- a/3rdparty/jsoncpp/include/json/autolink.h
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2007-2010 Baptiste Lepilleur
-// Distributed under MIT license, or public domain if desired and
-// recognized in your jurisdiction.
-// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
-
-#ifndef JSON_AUTOLINK_H_INCLUDED
-#define JSON_AUTOLINK_H_INCLUDED
-
-#include "config.h"
-
-#ifdef JSON_IN_CPPTL
-#include <cpptl/cpptl_autolink.h>
-#endif
-
-#if !defined(JSON_NO_AUTOLINK) && !defined(JSON_DLL_BUILD) && \
- !defined(JSON_IN_CPPTL)
-#define CPPTL_AUTOLINK_NAME "json"
-#undef CPPTL_AUTOLINK_DLL
-#ifdef JSON_DLL
-#define CPPTL_AUTOLINK_DLL
-#endif
-#include "autolink.h"
-#endif
-
-#endif // JSON_AUTOLINK_H_INCLUDED
diff --git a/3rdparty/jsoncpp/include/json/config.h b/3rdparty/jsoncpp/include/json/config.h
deleted file mode 100644
index 0dcd8ae600f..00000000000
--- a/3rdparty/jsoncpp/include/json/config.h
+++ /dev/null
@@ -1,109 +0,0 @@
-// Copyright 2007-2010 Baptiste Lepilleur
-// Distributed under MIT license, or public domain if desired and
-// recognized in your jurisdiction.
-// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
-
-#ifndef JSON_CONFIG_H_INCLUDED
-#define JSON_CONFIG_H_INCLUDED
-
-/// If defined, indicates that json library is embedded in CppTL library.
-//# define JSON_IN_CPPTL 1
-
-/// If defined, indicates that json may leverage CppTL library
-//# define JSON_USE_CPPTL 1
-/// If defined, indicates that cpptl vector based map should be used instead of
-/// std::map
-/// as Value container.
-//# define JSON_USE_CPPTL_SMALLMAP 1
-
-// If non-zero, the library uses exceptions to report bad input instead of C
-// assertion macros. The default is to use exceptions.
-#ifndef JSON_USE_EXCEPTION
-#define JSON_USE_EXCEPTION 1
-#endif
-
-/// If defined, indicates that the source file is amalgated
-/// to prevent private header inclusion.
-/// Remarks: it is automatically defined in the generated amalgated header.
-// #define JSON_IS_AMALGAMATION
-
-#ifdef JSON_IN_CPPTL
-#include <cpptl/config.h>
-#ifndef JSON_USE_CPPTL
-#define JSON_USE_CPPTL 1
-#endif
-#endif
-
-#ifdef JSON_IN_CPPTL
-#define JSON_API CPPTL_API
-#elif defined(JSON_DLL_BUILD)
-#if defined(_MSC_VER)
-#define JSON_API __declspec(dllexport)
-#define JSONCPP_DISABLE_DLL_INTERFACE_WARNING
-#endif // if defined(_MSC_VER)
-#elif defined(JSON_DLL)
-#if defined(_MSC_VER)
-#define JSON_API __declspec(dllimport)
-#define JSONCPP_DISABLE_DLL_INTERFACE_WARNING
-#endif // if defined(_MSC_VER)
-#endif // ifdef JSON_IN_CPPTL
-#if !defined(JSON_API)
-#define JSON_API
-#endif
-
-// If JSON_NO_INT64 is defined, then Json only support C++ "int" type for
-// integer
-// Storages, and 64 bits integer support is disabled.
-// #define JSON_NO_INT64 1
-
-#if defined(_MSC_VER) && _MSC_VER <= 1200 // MSVC 6
-// Microsoft Visual Studio 6 only support conversion from __int64 to double
-// (no conversion from unsigned __int64).
-#define JSON_USE_INT64_DOUBLE_CONVERSION 1
-// Disable warning 4786 for VS6 caused by STL (identifier was truncated to '255'
-// characters in the debug information)
-// All projects I've ever seen with VS6 were using this globally (not bothering
-// with pragma push/pop).
-#pragma warning(disable : 4786)
-#endif // if defined(_MSC_VER) && _MSC_VER < 1200 // MSVC 6
-
-#if defined(_MSC_VER) && _MSC_VER >= 1500 // MSVC 2008
-/// Indicates that the following function is deprecated.
-#define JSONCPP_DEPRECATED(message) __declspec(deprecated(message))
-#elif defined(__clang__) && defined(__has_feature)
-#if __has_feature(attribute_deprecated_with_message)
-#define JSONCPP_DEPRECATED(message) __attribute__ ((deprecated(message)))
-#endif
-#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5))
-#define JSONCPP_DEPRECATED(message) __attribute__ ((deprecated(message)))
-#elif defined(__GNUC__) && (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1))
-#define JSONCPP_DEPRECATED(message) __attribute__((__deprecated__))
-#endif
-
-#if !defined(JSONCPP_DEPRECATED)
-#define JSONCPP_DEPRECATED(message)
-#endif // if !defined(JSONCPP_DEPRECATED)
-
-namespace Json {
-typedef int Int;
-typedef unsigned int UInt;
-#if defined(JSON_NO_INT64)
-typedef int LargestInt;
-typedef unsigned int LargestUInt;
-#undef JSON_HAS_INT64
-#else // if defined(JSON_NO_INT64)
-// For Microsoft Visual use specific types as long long is not supported
-#if defined(_MSC_VER) // Microsoft Visual Studio
-typedef __int64 Int64;
-typedef unsigned __int64 UInt64;
-#else // if defined(_MSC_VER) // Other platforms, use long long
-typedef long long int Int64;
-typedef unsigned long long int UInt64;
-#endif // if defined(_MSC_VER)
-typedef Int64 LargestInt;
-typedef UInt64 LargestUInt;
-#define JSON_HAS_INT64
-#endif // if defined(JSON_NO_INT64)
-} // end namespace Json
-
-#endif // JSON_CONFIG_H_INCLUDED
diff --git a/3rdparty/jsoncpp/include/json/features.h b/3rdparty/jsoncpp/include/json/features.h
deleted file mode 100644
index 1bb7bb61486..00000000000
--- a/3rdparty/jsoncpp/include/json/features.h
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2007-2010 Baptiste Lepilleur
-// Distributed under MIT license, or public domain if desired and
-// recognized in your jurisdiction.
-// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
-
-#ifndef CPPTL_JSON_FEATURES_H_INCLUDED
-#define CPPTL_JSON_FEATURES_H_INCLUDED
-
-#if !defined(JSON_IS_AMALGAMATION)
-#include "forwards.h"
-#endif // if !defined(JSON_IS_AMALGAMATION)
-
-namespace Json {
-
-/** \brief Configuration passed to reader and writer.
- * This configuration object can be used to force the Reader or Writer
- * to behave in a standard conforming way.
- */
-class JSON_API Features {
-public:
- /** \brief A configuration that allows all features and assumes all strings
- * are UTF-8.
- * - C & C++ comments are allowed
- * - Root object can be any JSON value
- * - Assumes Value strings are encoded in UTF-8
- */
- static Features all();
-
- /** \brief A configuration that is strictly compatible with the JSON
- * specification.
- * - Comments are forbidden.
- * - Root object must be either an array or an object value.
- * - Assumes Value strings are encoded in UTF-8
- */
- static Features strictMode();
-
- /** \brief Initialize the configuration like JsonConfig::allFeatures;
- */
- Features();
-
- /// \c true if comments are allowed. Default: \c true.
- bool allowComments_;
-
- /// \c true if root must be either an array or an object value. Default: \c
- /// false.
- bool strictRoot_;
-
- /// \c true if dropped null placeholders are allowed. Default: \c false.
- bool allowDroppedNullPlaceholders_;
-
- /// \c true if numeric object key are allowed. Default: \c false.
- bool allowNumericKeys_;
-};
-
-} // namespace Json
-
-#endif // CPPTL_JSON_FEATURES_H_INCLUDED
diff --git a/3rdparty/jsoncpp/include/json/forwards.h b/3rdparty/jsoncpp/include/json/forwards.h
deleted file mode 100644
index ccfe09abf4b..00000000000
--- a/3rdparty/jsoncpp/include/json/forwards.h
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2007-2010 Baptiste Lepilleur
-// Distributed under MIT license, or public domain if desired and
-// recognized in your jurisdiction.
-// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
-
-#ifndef JSON_FORWARDS_H_INCLUDED
-#define JSON_FORWARDS_H_INCLUDED
-
-#if !defined(JSON_IS_AMALGAMATION)
-#include "config.h"
-#endif // if !defined(JSON_IS_AMALGAMATION)
-
-namespace Json {
-
-// writer.h
-class FastWriter;
-class StyledWriter;
-
-// reader.h
-class Reader;
-
-// features.h
-class Features;
-
-// value.h
-typedef unsigned int ArrayIndex;
-class StaticString;
-class Path;
-class PathArgument;
-class Value;
-class ValueIteratorBase;
-class ValueIterator;
-class ValueConstIterator;
-
-} // namespace Json
-
-#endif // JSON_FORWARDS_H_INCLUDED
diff --git a/3rdparty/jsoncpp/include/json/json.h b/3rdparty/jsoncpp/include/json/json.h
deleted file mode 100644
index 8f10ac2bf72..00000000000
--- a/3rdparty/jsoncpp/include/json/json.h
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2007-2010 Baptiste Lepilleur
-// Distributed under MIT license, or public domain if desired and
-// recognized in your jurisdiction.
-// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
-
-#ifndef JSON_JSON_H_INCLUDED
-#define JSON_JSON_H_INCLUDED
-
-#include "autolink.h"
-#include "value.h"
-#include "reader.h"
-#include "writer.h"
-#include "features.h"
-
-#endif // JSON_JSON_H_INCLUDED
diff --git a/3rdparty/jsoncpp/include/json/reader.h b/3rdparty/jsoncpp/include/json/reader.h
deleted file mode 100644
index c8ff747e4b1..00000000000
--- a/3rdparty/jsoncpp/include/json/reader.h
+++ /dev/null
@@ -1,401 +0,0 @@
-// Copyright 2007-2010 Baptiste Lepilleur
-// Distributed under MIT license, or public domain if desired and
-// recognized in your jurisdiction.
-// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
-
-#ifndef CPPTL_JSON_READER_H_INCLUDED
-#define CPPTL_JSON_READER_H_INCLUDED
-
-#if !defined(JSON_IS_AMALGAMATION)
-#include "features.h"
-#include "value.h"
-#endif // if !defined(JSON_IS_AMALGAMATION)
-#include <deque>
-#include <iosfwd>
-#include <stack>
-#include <string>
-#include <istream>
-
-// Disable warning C4251: <data member>: <type> needs to have dll-interface to
-// be used by...
-#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
-#pragma warning(push)
-#pragma warning(disable : 4251)
-#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
-
-namespace Json {
-
-/** \brief Unserialize a <a HREF="http://www.json.org">JSON</a> document into a
- *Value.
- *
- * \deprecated Use CharReader and CharReaderBuilder.
- */
-class JSON_API Reader {
-public:
- typedef char Char;
- typedef const Char* Location;
-
- /** \brief An error tagged with where in the JSON text it was encountered.
- *
- * The offsets give the [start, limit) range of bytes within the text. Note
- * that this is bytes, not codepoints.
- *
- */
- struct StructuredError {
- size_t offset_start;
- size_t offset_limit;
- std::string message;
- };
-
- /** \brief Constructs a Reader allowing all features
- * for parsing.
- */
- Reader();
-
- /** \brief Constructs a Reader allowing the specified feature set
- * for parsing.
- */
- Reader(const Features& features);
-
- /** \brief Read a Value from a <a HREF="http://www.json.org">JSON</a>
- * document.
- * \param document UTF-8 encoded string containing the document to read.
- * \param root [out] Contains the root value of the document if it was
- * successfully parsed.
- * \param collectComments \c true to collect comment and allow writing them
- * back during
- * serialization, \c false to discard comments.
- * This parameter is ignored if
- * Features::allowComments_
- * is \c false.
- * \return \c true if the document was successfully parsed, \c false if an
- * error occurred.
- */
- bool
- parse(const std::string& document, Value& root, bool collectComments = true);
-
- /** \brief Read a Value from a <a HREF="http://www.json.org">JSON</a>
- document.
- * \param beginDoc Pointer on the beginning of the UTF-8 encoded string of the
- document to read.
- * \param endDoc Pointer on the end of the UTF-8 encoded string of the
- document to read.
- * Must be >= beginDoc.
- * \param root [out] Contains the root value of the document if it was
- * successfully parsed.
- * \param collectComments \c true to collect comment and allow writing them
- back during
- * serialization, \c false to discard comments.
- * This parameter is ignored if
- Features::allowComments_
- * is \c false.
- * \return \c true if the document was successfully parsed, \c false if an
- error occurred.
- */
- bool parse(const char* beginDoc,
- const char* endDoc,
- Value& root,
- bool collectComments = true);
-
- /// \brief Parse from input stream.
- /// \see Json::operator>>(std::istream&, Json::Value&).
- bool parse(std::istream& is, Value& root, bool collectComments = true);
-
- /** \brief Returns a user friendly string that list errors in the parsed
- * document.
- * \return Formatted error message with the list of errors with their location
- * in
- * the parsed document. An empty string is returned if no error
- * occurred
- * during parsing.
- * \deprecated Use getFormattedErrorMessages() instead (typo fix).
- */
- JSONCPP_DEPRECATED("Use getFormattedErrorMessages() instead.")
- std::string getFormatedErrorMessages() const;
-
- /** \brief Returns a user friendly string that list errors in the parsed
- * document.
- * \return Formatted error message with the list of errors with their location
- * in
- * the parsed document. An empty string is returned if no error
- * occurred
- * during parsing.
- */
- std::string getFormattedErrorMessages() const;
-
- /** \brief Returns a vector of structured erros encounted while parsing.
- * \return A (possibly empty) vector of StructuredError objects. Currently
- * only one error can be returned, but the caller should tolerate
- * multiple
- * errors. This can occur if the parser recovers from a non-fatal
- * parse error and then encounters additional errors.
- */
- std::vector<StructuredError> getStructuredErrors() const;
-
- /** \brief Add a semantic error message.
- * \param value JSON Value location associated with the error
- * \param message The error message.
- * \return \c true if the error was successfully added, \c false if the
- * Value offset exceeds the document size.
- */
- bool pushError(const Value& value, const std::string& message);
-
- /** \brief Add a semantic error message with extra context.
- * \param value JSON Value location associated with the error
- * \param message The error message.
- * \param extra Additional JSON Value location to contextualize the error
- * \return \c true if the error was successfully added, \c false if either
- * Value offset exceeds the document size.
- */
- bool pushError(const Value& value, const std::string& message, const Value& extra);
-
- /** \brief Return whether there are any errors.
- * \return \c true if there are no errors to report \c false if
- * errors have occurred.
- */
- bool good() const;
-
-private:
- enum TokenType {
- tokenEndOfStream = 0,
- tokenObjectBegin,
- tokenObjectEnd,
- tokenArrayBegin,
- tokenArrayEnd,
- tokenString,
- tokenNumber,
- tokenTrue,
- tokenFalse,
- tokenNull,
- tokenArraySeparator,
- tokenMemberSeparator,
- tokenComment,
- tokenError
- };
-
- class Token {
- public:
- TokenType type_;
- Location start_;
- Location end_;
- };
-
- class ErrorInfo {
- public:
- Token token_;
- std::string message_;
- Location extra_;
- };
-
- typedef std::deque<ErrorInfo> Errors;
-
- bool readToken(Token& token);
- void skipSpaces();
- bool match(Location pattern, int patternLength);
- bool readComment();
- bool readCStyleComment();
- bool readCppStyleComment();
- bool readString();
- void readNumber();
- bool readValue();
- bool readObject(Token& token);
- bool readArray(Token& token);
- bool decodeNumber(Token& token);
- bool decodeNumber(Token& token, Value& decoded);
- bool decodeString(Token& token);
- bool decodeString(Token& token, std::string& decoded);
- bool decodeDouble(Token& token);
- bool decodeDouble(Token& token, Value& decoded);
- bool decodeUnicodeCodePoint(Token& token,
- Location& current,
- Location end,
- unsigned int& unicode);
- bool decodeUnicodeEscapeSequence(Token& token,
- Location& current,
- Location end,
- unsigned int& unicode);
- bool addError(const std::string& message, Token& token, Location extra = 0);
- bool recoverFromError(TokenType skipUntilToken);
- bool addErrorAndRecover(const std::string& message,
- Token& token,
- TokenType skipUntilToken);
- void skipUntilSpace();
- Value& currentValue();
- Char getNextChar();
- void
- getLocationLineAndColumn(Location location, int& line, int& column) const;
- std::string getLocationLineAndColumn(Location location) const;
- void addComment(Location begin, Location end, CommentPlacement placement);
- void skipCommentTokens(Token& token);
-
- typedef std::stack<Value*> Nodes;
- Nodes nodes_;
- Errors errors_;
- std::string document_;
- Location begin_;
- Location end_;
- Location current_;
- Location lastValueEnd_;
- Value* lastValue_;
- std::string commentsBefore_;
- Features features_;
- bool collectComments_;
-}; // Reader
-
-/** Interface for reading JSON from a char array.
- */
-class JSON_API CharReader {
-public:
- virtual ~CharReader() {}
- /** \brief Read a Value from a <a HREF="http://www.json.org">JSON</a>
- document.
- * The document must be a UTF-8 encoded string containing the document to read.
- *
- * \param beginDoc Pointer on the beginning of the UTF-8 encoded string of the
- document to read.
- * \param endDoc Pointer on the end of the UTF-8 encoded string of the
- document to read.
- * Must be >= beginDoc.
- * \param root [out] Contains the root value of the document if it was
- * successfully parsed.
- * \param errs [out] Formatted error messages (if not NULL)
- * a user friendly string that lists errors in the parsed
- * document.
- * \return \c true if the document was successfully parsed, \c false if an
- error occurred.
- */
- virtual bool parse(
- char const* beginDoc, char const* endDoc,
- Value* root, std::string* errs) = 0;
-
- class Factory {
- public:
- virtual ~Factory() {}
- /** \brief Allocate a CharReader via operator new().
- * \throw std::exception if something goes wrong (e.g. invalid settings)
- */
- virtual CharReader* newCharReader() const = 0;
- }; // Factory
-}; // CharReader
-
-/** \brief Build a CharReader implementation.
-
-Usage:
-\code
- using namespace Json;
- CharReaderBuilder builder;
- builder["collectComments"] = false;
- Value value;
- std::string errs;
- bool ok = parseFromStream(builder, std::cin, &value, &errs);
-\endcode
-*/
-class JSON_API CharReaderBuilder : public CharReader::Factory {
-public:
- // Note: We use a Json::Value so that we can add data-members to this class
- // without a major version bump.
- /** Configuration of this builder.
- These are case-sensitive.
- Available settings (case-sensitive):
- - `"collectComments": false or true`
- - true to collect comment and allow writing them
- back during serialization, false to discard comments.
- This parameter is ignored if allowComments is false.
- - `"allowComments": false or true`
- - true if comments are allowed.
- - `"strictRoot": false or true`
- - true if root must be either an array or an object value
- - `"allowDroppedNullPlaceholders": false or true`
- - true if dropped null placeholders are allowed. (See StreamWriterBuilder.)
- - `"allowNumericKeys": false or true`
- - true if numeric object keys are allowed.
- - `"allowSingleQuotes": false or true`
- - true if '' are allowed for strings (both keys and values)
- - `"stackLimit": integer`
- - Exceeding stackLimit (recursive depth of `readValue()`) will
- cause an exception.
- - This is a security issue (seg-faults caused by deeply nested JSON),
- so the default is low.
- - `"failIfExtra": false or true`
- - If true, `parse()` returns false when extra non-whitespace trails
- the JSON value in the input string.
- - `"rejectDupKeys": false or true`
- - If true, `parse()` returns false when a key is duplicated within an object.
-
- You can examine 'settings_` yourself
- to see the defaults. You can also write and read them just like any
- JSON Value.
- \sa setDefaults()
- */
- Json::Value settings_;
-
- CharReaderBuilder();
- virtual ~CharReaderBuilder();
-
- virtual CharReader* newCharReader() const;
-
- /** \return true if 'settings' are legal and consistent;
- * otherwise, indicate bad settings via 'invalid'.
- */
- bool validate(Json::Value* invalid) const;
-
- /** A simple way to update a specific setting.
- */
- Value& operator[](std::string key);
-
- /** Called by ctor, but you can use this to reset settings_.
- * \pre 'settings' != NULL (but Json::null is fine)
- * \remark Defaults:
- * \snippet src/lib_json/json_reader.cpp CharReaderBuilderDefaults
- */
- static void setDefaults(Json::Value* settings);
- /** Same as old Features::strictMode().
- * \pre 'settings' != NULL (but Json::null is fine)
- * \remark Defaults:
- * \snippet src/lib_json/json_reader.cpp CharReaderBuilderStrictMode
- */
- static void strictMode(Json::Value* settings);
-};
-
-/** Consume entire stream and use its begin/end.
- * Someday we might have a real StreamReader, but for now this
- * is convenient.
- */
-bool JSON_API parseFromStream(
- CharReader::Factory const&,
- std::istream&,
- Value* root, std::string* errs);
-
-/** \brief Read from 'sin' into 'root'.
-
- Always keep comments from the input JSON.
-
- This can be used to read a file into a particular sub-object.
- For example:
- \code
- Json::Value root;
- cin >> root["dir"]["file"];
- cout << root;
- \endcode
- Result:
- \verbatim
- {
- "dir": {
- "file": {
- // The input stream JSON would be nested here.
- }
- }
- }
- \endverbatim
- \throw std::exception on parse error.
- \see Json::operator<<()
-*/
-JSON_API std::istream& operator>>(std::istream&, Value&);
-
-} // namespace Json
-
-#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
-#pragma warning(pop)
-#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
-
-#endif // CPPTL_JSON_READER_H_INCLUDED
diff --git a/3rdparty/jsoncpp/include/json/value.h b/3rdparty/jsoncpp/include/json/value.h
deleted file mode 100644
index 2ac94fa8129..00000000000
--- a/3rdparty/jsoncpp/include/json/value.h
+++ /dev/null
@@ -1,826 +0,0 @@
-// Copyright 2007-2010 Baptiste Lepilleur
-// Distributed under MIT license, or public domain if desired and
-// recognized in your jurisdiction.
-// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
-
-#ifndef CPPTL_JSON_H_INCLUDED
-#define CPPTL_JSON_H_INCLUDED
-
-#if !defined(JSON_IS_AMALGAMATION)
-#include "forwards.h"
-#endif // if !defined(JSON_IS_AMALGAMATION)
-#include <string>
-#include <vector>
-#include <exception>
-
-#ifndef JSON_USE_CPPTL_SMALLMAP
-#include <map>
-#else
-#include <cpptl/smallmap.h>
-#endif
-#ifdef JSON_USE_CPPTL
-#include <cpptl/forwards.h>
-#endif
-
-// Disable warning C4251: <data member>: <type> needs to have dll-interface to
-// be used by...
-#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
-#pragma warning(push)
-#pragma warning(disable : 4251)
-#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
-
-/** \brief JSON (JavaScript Object Notation).
- */
-namespace Json {
-
-/** Base class for all exceptions we throw.
- *
- * We use nothing but these internally. Of course, STL can throw others.
- */
-class JSON_API Exception;
-/** Exceptions which the user cannot easily avoid.
- *
- * E.g. out-of-memory (when we use malloc), stack-overflow, malicious input
- *
- * \remark derived from Json::Exception
- */
-class JSON_API RuntimeError;
-/** Exceptions thrown by JSON_ASSERT/JSON_FAIL macros.
- *
- * These are precondition-violations (user bugs) and internal errors (our bugs).
- *
- * \remark derived from Json::Exception
- */
-class JSON_API LogicError;
-
-/// used internally
-void throwRuntimeError(std::string const& msg);
-/// used internally
-void throwLogicError(std::string const& msg);
-
-/** \brief Type of the value held by a Value object.
- */
-enum ValueType {
- nullValue = 0, ///< 'null' value
- intValue, ///< signed integer value
- uintValue, ///< unsigned integer value
- realValue, ///< double value
- stringValue, ///< UTF-8 string value
- booleanValue, ///< bool value
- arrayValue, ///< array value (ordered list)
- objectValue ///< object value (collection of name/value pairs).
-};
-
-enum CommentPlacement {
- commentBefore = 0, ///< a comment placed on the line before a value
- commentAfterOnSameLine, ///< a comment just after a value on the same line
- commentAfter, ///< a comment on the line after a value (only make sense for
- /// root value)
- numberOfCommentPlacement
-};
-
-//# ifdef JSON_USE_CPPTL
-// typedef CppTL::AnyEnumerator<const char *> EnumMemberNames;
-// typedef CppTL::AnyEnumerator<const Value &> EnumValues;
-//# endif
-
-/** \brief Lightweight wrapper to tag static string.
- *
- * Value constructor and objectValue member assignement takes advantage of the
- * StaticString and avoid the cost of string duplication when storing the
- * string or the member name.
- *
- * Example of usage:
- * \code
- * Json::Value aValue( StaticString("some text") );
- * Json::Value object;
- * static const StaticString code("code");
- * object[code] = 1234;
- * \endcode
- */
-class JSON_API StaticString {
-public:
- explicit StaticString(const char* czstring) : c_str_(czstring) {}
-
- operator const char*() const { return c_str_; }
-
- const char* c_str() const { return c_str_; }
-
-private:
- const char* c_str_;
-};
-
-/** \brief Represents a <a HREF="http://www.json.org">JSON</a> value.
- *
- * This class is a discriminated union wrapper that can represents a:
- * - signed integer [range: Value::minInt - Value::maxInt]
- * - unsigned integer (range: 0 - Value::maxUInt)
- * - double
- * - UTF-8 string
- * - boolean
- * - 'null'
- * - an ordered list of Value
- * - collection of name/value pairs (javascript object)
- *
- * The type of the held value is represented by a #ValueType and
- * can be obtained using type().
- *
- * Values of an #objectValue or #arrayValue can be accessed using operator[]()
- * methods.
- * Non-const methods will automatically create the a #nullValue element
- * if it does not exist.
- * The sequence of an #arrayValue will be automatically resized and initialized
- * with #nullValue. resize() can be used to enlarge or truncate an #arrayValue.
- *
- * The get() methods can be used to obtain default value in the case the
- * required element does not exist.
- *
- * It is possible to iterate over the list of a #objectValue values using
- * the getMemberNames() method.
- *
- * \note #Value string-length fit in size_t, but keys must be < 2^30.
- * (The reason is an implementation detail.) A #CharReader will raise an
- * exception if a bound is exceeded to avoid security holes in your app,
- * but the Value API does *not* check bounds. That is the responsibility
- * of the caller.
- */
-class JSON_API Value {
- friend class ValueIteratorBase;
-public:
- typedef std::vector<std::string> Members;
- typedef ValueIterator iterator;
- typedef ValueConstIterator const_iterator;
- typedef Json::UInt UInt;
- typedef Json::Int Int;
-#if defined(JSON_HAS_INT64)
- typedef Json::UInt64 UInt64;
- typedef Json::Int64 Int64;
-#endif // defined(JSON_HAS_INT64)
- typedef Json::LargestInt LargestInt;
- typedef Json::LargestUInt LargestUInt;
- typedef Json::ArrayIndex ArrayIndex;
-
- static const Value& null; ///< We regret this reference to a global instance; prefer the simpler Value().
- static const Value& nullRef; ///< just a kludge for binary-compatibility; same as null
- /// Minimum signed integer value that can be stored in a Json::Value.
- static const LargestInt minLargestInt;
- /// Maximum signed integer value that can be stored in a Json::Value.
- static const LargestInt maxLargestInt;
- /// Maximum unsigned integer value that can be stored in a Json::Value.
- static const LargestUInt maxLargestUInt;
-
- /// Minimum signed int value that can be stored in a Json::Value.
- static const Int minInt;
- /// Maximum signed int value that can be stored in a Json::Value.
- static const Int maxInt;
- /// Maximum unsigned int value that can be stored in a Json::Value.
- static const UInt maxUInt;
-
-#if defined(JSON_HAS_INT64)
- /// Minimum signed 64 bits int value that can be stored in a Json::Value.
- static const Int64 minInt64;
- /// Maximum signed 64 bits int value that can be stored in a Json::Value.
- static const Int64 maxInt64;
- /// Maximum unsigned 64 bits int value that can be stored in a Json::Value.
- static const UInt64 maxUInt64;
-#endif // defined(JSON_HAS_INT64)
-
-private:
-#ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
- class CZString {
- public:
- enum DuplicationPolicy {
- noDuplication = 0,
- duplicate,
- duplicateOnCopy
- };
- CZString(ArrayIndex index);
- CZString(char const* str, unsigned length, DuplicationPolicy allocate);
- CZString(CZString const& other);
- ~CZString();
- CZString& operator=(CZString other);
- bool operator<(CZString const& other) const;
- bool operator==(CZString const& other) const;
- ArrayIndex index() const;
- //const char* c_str() const; ///< \deprecated
- char const* data() const;
- unsigned length() const;
- bool isStaticString() const;
-
- private:
- void swap(CZString& other);
-
- struct StringStorage {
- unsigned policy_: 2;
- unsigned length_: 30; // 1GB max
- };
-
- char const* cstr_; // actually, a prefixed string, unless policy is noDup
- union {
- ArrayIndex index_;
- StringStorage storage_;
- };
- };
-
-public:
-#ifndef JSON_USE_CPPTL_SMALLMAP
- typedef std::map<CZString, Value> ObjectValues;
-#else
- typedef CppTL::SmallMap<CZString, Value> ObjectValues;
-#endif // ifndef JSON_USE_CPPTL_SMALLMAP
-#endif // ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
-
-public:
- /** \brief Create a default Value of the given type.
-
- This is a very useful constructor.
- To create an empty array, pass arrayValue.
- To create an empty object, pass objectValue.
- Another Value can then be set to this one by assignment.
-This is useful since clear() and resize() will not alter types.
-
- Examples:
-\code
-Json::Value null_value; // null
-Json::Value arr_value(Json::arrayValue); // []
-Json::Value obj_value(Json::objectValue); // {}
-\endcode
- */
- Value(ValueType type = nullValue);
- Value(Int value);
- Value(UInt value);
-#if defined(JSON_HAS_INT64)
- Value(Int64 value);
- Value(UInt64 value);
-#endif // if defined(JSON_HAS_INT64)
- Value(double value);
- Value(const char* value); ///< Copy til first 0. (NULL causes to seg-fault.)
- Value(const char* beginValue, const char* endValue); ///< Copy all, incl zeroes.
- /** \brief Constructs a value from a static string.
-
- * Like other value string constructor but do not duplicate the string for
- * internal storage. The given string must remain alive after the call to this
- * constructor.
- * \note This works only for null-terminated strings. (We cannot change the
- * size of this class, so we have nowhere to store the length,
- * which might be computed later for various operations.)
- *
- * Example of usage:
- * \code
- * static StaticString foo("some text");
- * Json::Value aValue(foo);
- * \endcode
- */
- Value(const StaticString& value);
- Value(const std::string& value); ///< Copy data() til size(). Embedded zeroes too.
-#ifdef JSON_USE_CPPTL
- Value(const CppTL::ConstString& value);
-#endif
- Value(bool value);
- /// Deep copy.
- Value(const Value& other);
- ~Value();
-
- /// Deep copy, then swap(other).
- /// \note Over-write existing comments. To preserve comments, use #swapPayload().
- Value& operator=(Value other);
- /// Swap everything.
- void swap(Value& other);
- /// Swap values but leave comments and source offsets in place.
- void swapPayload(Value& other);
-
- ValueType type() const;
-
- /// Compare payload only, not comments etc.
- bool operator<(const Value& other) const;
- bool operator<=(const Value& other) const;
- bool operator>=(const Value& other) const;
- bool operator>(const Value& other) const;
- bool operator==(const Value& other) const;
- bool operator!=(const Value& other) const;
- int compare(const Value& other) const;
-
- const char* asCString() const; ///< Embedded zeroes could cause you trouble!
- std::string asString() const; ///< Embedded zeroes are possible.
- /** Get raw char* of string-value.
- * \return false if !string. (Seg-fault if str or end are NULL.)
- */
- bool getString(
- char const** str, char const** end) const;
-#ifdef JSON_USE_CPPTL
- CppTL::ConstString asConstString() const;
-#endif
- Int asInt() const;
- UInt asUInt() const;
-#if defined(JSON_HAS_INT64)
- Int64 asInt64() const;
- UInt64 asUInt64() const;
-#endif // if defined(JSON_HAS_INT64)
- LargestInt asLargestInt() const;
- LargestUInt asLargestUInt() const;
- float asFloat() const;
- double asDouble() const;
- bool asBool() const;
-
- bool isNull() const;
- bool isBool() const;
- bool isInt() const;
- bool isInt64() const;
- bool isUInt() const;
- bool isUInt64() const;
- bool isIntegral() const;
- bool isDouble() const;
- bool isNumeric() const;
- bool isString() const;
- bool isArray() const;
- bool isObject() const;
-
- bool isConvertibleTo(ValueType other) const;
-
- /// Number of values in array or object
- ArrayIndex size() const;
-
- /// \brief Return true if empty array, empty object, or null;
- /// otherwise, false.
- bool empty() const;
-
- /// Return isNull()
- bool operator!() const;
-
- /// Remove all object members and array elements.
- /// \pre type() is arrayValue, objectValue, or nullValue
- /// \post type() is unchanged
- void clear();
-
- /// Resize the array to size elements.
- /// New elements are initialized to null.
- /// May only be called on nullValue or arrayValue.
- /// \pre type() is arrayValue or nullValue
- /// \post type() is arrayValue
- void resize(ArrayIndex size);
-
- /// Access an array element (zero based index ).
- /// If the array contains less than index element, then null value are
- /// inserted
- /// in the array so that its size is index+1.
- /// (You may need to say 'value[0u]' to get your compiler to distinguish
- /// this from the operator[] which takes a string.)
- Value& operator[](ArrayIndex index);
-
- /// Access an array element (zero based index ).
- /// If the array contains less than index element, then null value are
- /// inserted
- /// in the array so that its size is index+1.
- /// (You may need to say 'value[0u]' to get your compiler to distinguish
- /// this from the operator[] which takes a string.)
- Value& operator[](int index);
-
- /// Access an array element (zero based index )
- /// (You may need to say 'value[0u]' to get your compiler to distinguish
- /// this from the operator[] which takes a string.)
- const Value& operator[](ArrayIndex index) const;
-
- /// Access an array element (zero based index )
- /// (You may need to say 'value[0u]' to get your compiler to distinguish
- /// this from the operator[] which takes a string.)
- const Value& operator[](int index) const;
-
- /// If the array contains at least index+1 elements, returns the element
- /// value,
- /// otherwise returns defaultValue.
- Value get(ArrayIndex index, const Value& defaultValue) const;
- /// Return true if index < size().
- bool isValidIndex(ArrayIndex index) const;
- /// \brief Append value to array at the end.
- ///
- /// Equivalent to jsonvalue[jsonvalue.size()] = value;
- Value& append(const Value& value);
-
- /// Access an object value by name, create a null member if it does not exist.
- /// \note Because of our implementation, keys are limited to 2^30 -1 chars.
- /// Exceeding that will cause an exception.
- Value& operator[](const char* key);
- /// Access an object value by name, returns null if there is no member with
- /// that name.
- const Value& operator[](const char* key) const;
- /// Access an object value by name, create a null member if it does not exist.
- /// \param key may contain embedded nulls.
- Value& operator[](const std::string& key);
- /// Access an object value by name, returns null if there is no member with
- /// that name.
- /// \param key may contain embedded nulls.
- const Value& operator[](const std::string& key) const;
- /** \brief Access an object value by name, create a null member if it does not
- exist.
-
- * If the object has no entry for that name, then the member name used to store
- * the new entry is not duplicated.
- * Example of use:
- * \code
- * Json::Value object;
- * static const StaticString code("code");
- * object[code] = 1234;
- * \endcode
- */
- Value& operator[](const StaticString& key);
-#ifdef JSON_USE_CPPTL
- /// Access an object value by name, create a null member if it does not exist.
- Value& operator[](const CppTL::ConstString& key);
- /// Access an object value by name, returns null if there is no member with
- /// that name.
- const Value& operator[](const CppTL::ConstString& key) const;
-#endif
- /// Return the member named key if it exist, defaultValue otherwise.
- /// \note deep copy
- Value get(const char* key, const Value& defaultValue) const;
- /// Return the member named key if it exist, defaultValue otherwise.
- /// \note deep copy
- /// \param key may contain embedded nulls.
- Value get(const char* key, const char* end, const Value& defaultValue) const;
- /// Return the member named key if it exist, defaultValue otherwise.
- /// \note deep copy
- /// \param key may contain embedded nulls.
- Value get(const std::string& key, const Value& defaultValue) const;
-#ifdef JSON_USE_CPPTL
- /// Return the member named key if it exist, defaultValue otherwise.
- /// \note deep copy
- Value get(const CppTL::ConstString& key, const Value& defaultValue) const;
-#endif
- /// Most general and efficient version of isMember()const, get()const,
- /// and operator[]const
- /// \note As stated elsewhere, behavior is undefined if (end-key) >= 2^30
- Value const* find(char const* key, char const* end) const;
- /// Most general and efficient version of object-mutators.
- /// \note As stated elsewhere, behavior is undefined if (end-key) >= 2^30
- /// \return non-zero, but JSON_ASSERT if this is neither object nor nullValue.
- Value const* demand(char const* key, char const* end);
- /// \brief Remove and return the named member.
- ///
- /// Do nothing if it did not exist.
- /// \return the removed Value, or null.
- /// \pre type() is objectValue or nullValue
- /// \post type() is unchanged
- /// \deprecated
- Value removeMember(const char* key);
- /// Same as removeMember(const char*)
- /// \param key may contain embedded nulls.
- /// \deprecated
- Value removeMember(const std::string& key);
- /// Same as removeMember(const char* key, const char* end, Value* removed),
- /// but 'key' is null-terminated.
- bool removeMember(const char* key, Value* removed);
- /** \brief Remove the named map member.
-
- Update 'removed' iff removed.
- \param key may contain embedded nulls.
- \return true iff removed (no exceptions)
- */
- bool removeMember(std::string const& key, Value* removed);
- /// Same as removeMember(std::string const& key, Value* removed)
- bool removeMember(const char* key, const char* end, Value* removed);
- /** \brief Remove the indexed array element.
-
- O(n) expensive operations.
- Update 'removed' iff removed.
- \return true iff removed (no exceptions)
- */
- bool removeIndex(ArrayIndex i, Value* removed);
-
- /// Return true if the object has a member named key.
- /// \note 'key' must be null-terminated.
- bool isMember(const char* key) const;
- /// Return true if the object has a member named key.
- /// \param key may contain embedded nulls.
- bool isMember(const std::string& key) const;
- /// Same as isMember(std::string const& key)const
- bool isMember(const char* key, const char* end) const;
-#ifdef JSON_USE_CPPTL
- /// Return true if the object has a member named key.
- bool isMember(const CppTL::ConstString& key) const;
-#endif
-
- /// \brief Return a list of the member names.
- ///
- /// If null, return an empty list.
- /// \pre type() is objectValue or nullValue
- /// \post if type() was nullValue, it remains nullValue
- Members getMemberNames() const;
-
- //# ifdef JSON_USE_CPPTL
- // EnumMemberNames enumMemberNames() const;
- // EnumValues enumValues() const;
- //# endif
-
- /// \deprecated Always pass len.
- JSONCPP_DEPRECATED("Use setComment(std::string const&) instead.")
- void setComment(const char* comment, CommentPlacement placement);
- /// Comments must be //... or /* ... */
- void setComment(const char* comment, size_t len, CommentPlacement placement);
- /// Comments must be //... or /* ... */
- void setComment(const std::string& comment, CommentPlacement placement);
- bool hasComment(CommentPlacement placement) const;
- /// Include delimiters and embedded newlines.
- std::string getComment(CommentPlacement placement) const;
-
- std::string toStyledString() const;
-
- const_iterator begin() const;
- const_iterator end() const;
-
- iterator begin();
- iterator end();
-
- // Accessors for the [start, limit) range of bytes within the JSON text from
- // which this value was parsed, if any.
- void setOffsetStart(size_t start);
- void setOffsetLimit(size_t limit);
- size_t getOffsetStart() const;
- size_t getOffsetLimit() const;
-
-private:
- void initBasic(ValueType type, bool allocated = false);
-
- Value& resolveReference(const char* key);
- Value& resolveReference(const char* key, const char* end);
-
- struct CommentInfo {
- CommentInfo();
- ~CommentInfo();
-
- void setComment(const char* text, size_t len);
-
- char* comment_;
- };
-
- // struct MemberNamesTransform
- //{
- // typedef const char *result_type;
- // const char *operator()( const CZString &name ) const
- // {
- // return name.c_str();
- // }
- //};
-
- union ValueHolder {
- LargestInt int_;
- LargestUInt uint_;
- double real_;
- bool bool_;
- char* string_; // actually ptr to unsigned, followed by str, unless !allocated_
- ObjectValues* map_;
- } value_;
- ValueType type_ : 8;
- unsigned int allocated_ : 1; // Notes: if declared as bool, bitfield is useless.
- // If not allocated_, string_ must be null-terminated.
- CommentInfo* comments_;
-
- // [start, limit) byte offsets in the source JSON text from which this Value
- // was extracted.
- size_t start_;
- size_t limit_;
-};
-
-/** \brief Experimental and untested: represents an element of the "path" to
- * access a node.
- */
-class JSON_API PathArgument {
-public:
- friend class Path;
-
- PathArgument();
- PathArgument(ArrayIndex index);
- PathArgument(const char* key);
- PathArgument(const std::string& key);
-
-private:
- enum Kind {
- kindNone = 0,
- kindIndex,
- kindKey
- };
- std::string key_;
- ArrayIndex index_;
- Kind kind_;
-};
-
-/** \brief Experimental and untested: represents a "path" to access a node.
- *
- * Syntax:
- * - "." => root node
- * - ".[n]" => elements at index 'n' of root node (an array value)
- * - ".name" => member named 'name' of root node (an object value)
- * - ".name1.name2.name3"
- * - ".[0][1][2].name1[3]"
- * - ".%" => member name is provided as parameter
- * - ".[%]" => index is provied as parameter
- */
-class JSON_API Path {
-public:
- Path(const std::string& path,
- const PathArgument& a1 = PathArgument(),
- const PathArgument& a2 = PathArgument(),
- const PathArgument& a3 = PathArgument(),
- const PathArgument& a4 = PathArgument(),
- const PathArgument& a5 = PathArgument());
-
- const Value& resolve(const Value& root) const;
- Value resolve(const Value& root, const Value& defaultValue) const;
- /// Creates the "path" to access the specified node and returns a reference on
- /// the node.
- Value& make(Value& root) const;
-
-private:
- typedef std::vector<const PathArgument*> InArgs;
- typedef std::vector<PathArgument> Args;
-
- void makePath(const std::string& path, const InArgs& in);
- void addPathInArg(const std::string& path,
- const InArgs& in,
- InArgs::const_iterator& itInArg,
- PathArgument::Kind kind);
- void invalidPath(const std::string& path, int location);
-
- Args args_;
-};
-
-/** \brief base class for Value iterators.
- *
- */
-class JSON_API ValueIteratorBase {
-public:
- typedef std::bidirectional_iterator_tag iterator_category;
- typedef unsigned int size_t;
- typedef int difference_type;
- typedef ValueIteratorBase SelfType;
-
- bool operator==(const SelfType& other) const { return isEqual(other); }
-
- bool operator!=(const SelfType& other) const { return !isEqual(other); }
-
- difference_type operator-(const SelfType& other) const {
- return other.computeDistance(*this);
- }
-
- /// Return either the index or the member name of the referenced value as a
- /// Value.
- Value key() const;
-
- /// Return the index of the referenced Value, or -1 if it is not an arrayValue.
- UInt index() const;
-
- /// Return the member name of the referenced Value, or "" if it is not an
- /// objectValue.
- /// \note Avoid `c_str()` on result, as embedded zeroes are possible.
- std::string name() const;
-
- /// Return the member name of the referenced Value. "" if it is not an
- /// objectValue.
- /// \deprecated This cannot be used for UTF-8 strings, since there can be embedded nulls.
- JSONCPP_DEPRECATED("Use `key = name();` instead.")
- char const* memberName() const;
- /// Return the member name of the referenced Value, or NULL if it is not an
- /// objectValue.
- /// \note Better version than memberName(). Allows embedded nulls.
- char const* memberName(char const** end) const;
-
-protected:
- Value& deref() const;
-
- void increment();
-
- void decrement();
-
- difference_type computeDistance(const SelfType& other) const;
-
- bool isEqual(const SelfType& other) const;
-
- void copy(const SelfType& other);
-
-private:
- Value::ObjectValues::iterator current_;
- // Indicates that iterator is for a null value.
- bool isNull_;
-
-public:
- // For some reason, BORLAND needs these at the end, rather
- // than earlier. No idea why.
- ValueIteratorBase();
- explicit ValueIteratorBase(const Value::ObjectValues::iterator& current);
-};
-
-/** \brief const iterator for object and array value.
- *
- */
-class JSON_API ValueConstIterator : public ValueIteratorBase {
- friend class Value;
-
-public:
- typedef const Value value_type;
- //typedef unsigned int size_t;
- //typedef int difference_type;
- typedef const Value& reference;
- typedef const Value* pointer;
- typedef ValueConstIterator SelfType;
-
- ValueConstIterator();
-
-private:
-/*! \internal Use by Value to create an iterator.
- */
- explicit ValueConstIterator(const Value::ObjectValues::iterator& current);
-public:
- SelfType& operator=(const ValueIteratorBase& other);
-
- SelfType operator++(int) {
- SelfType temp(*this);
- ++*this;
- return temp;
- }
-
- SelfType operator--(int) {
- SelfType temp(*this);
- --*this;
- return temp;
- }
-
- SelfType& operator--() {
- decrement();
- return *this;
- }
-
- SelfType& operator++() {
- increment();
- return *this;
- }
-
- reference operator*() const { return deref(); }
-
- pointer operator->() const { return &deref(); }
-};
-
-/** \brief Iterator for object and array value.
- */
-class JSON_API ValueIterator : public ValueIteratorBase {
- friend class Value;
-
-public:
- typedef Value value_type;
- typedef unsigned int size_t;
- typedef int difference_type;
- typedef Value& reference;
- typedef Value* pointer;
- typedef ValueIterator SelfType;
-
- ValueIterator();
- ValueIterator(const ValueConstIterator& other);
- ValueIterator(const ValueIterator& other);
-
-private:
-/*! \internal Use by Value to create an iterator.
- */
- explicit ValueIterator(const Value::ObjectValues::iterator& current);
-public:
- SelfType& operator=(const SelfType& other);
-
- SelfType operator++(int) {
- SelfType temp(*this);
- ++*this;
- return temp;
- }
-
- SelfType operator--(int) {
- SelfType temp(*this);
- --*this;
- return temp;
- }
-
- SelfType& operator--() {
- decrement();
- return *this;
- }
-
- SelfType& operator++() {
- increment();
- return *this;
- }
-
- reference operator*() const { return deref(); }
-
- pointer operator->() const { return &deref(); }
-};
-
-} // namespace Json
-
-
-namespace std {
-/// Specialize std::swap() for Json::Value.
-template<>
-inline void swap(Json::Value& a, Json::Value& b) { a.swap(b); }
-}
-
-
-#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
-#pragma warning(pop)
-#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
-
-#endif // CPPTL_JSON_H_INCLUDED
diff --git a/3rdparty/jsoncpp/include/json/version.h b/3rdparty/jsoncpp/include/json/version.h
deleted file mode 100644
index a4db8b0ae7f..00000000000
--- a/3rdparty/jsoncpp/include/json/version.h
+++ /dev/null
@@ -1,14 +0,0 @@
-// DO NOT EDIT. This file is generated by CMake from "version"
-// and "version.h.in" files.
-// Run CMake configure step to update it.
-#ifndef JSON_VERSION_H_INCLUDED
-# define JSON_VERSION_H_INCLUDED
-
-# define JSONCPP_VERSION_STRING "1.6.2"
-# define JSONCPP_VERSION_MAJOR 1
-# define JSONCPP_VERSION_MINOR 6
-# define JSONCPP_VERSION_PATCH 2
-# define JSONCPP_VERSION_QUALIFIER
-# define JSONCPP_VERSION_HEXA ((JSONCPP_VERSION_MAJOR << 24) | (JSONCPP_VERSION_MINOR << 16) | (JSONCPP_VERSION_PATCH << 8))
-
-#endif // JSON_VERSION_H_INCLUDED
diff --git a/3rdparty/jsoncpp/include/json/writer.h b/3rdparty/jsoncpp/include/json/writer.h
deleted file mode 100644
index f5f0a389ee8..00000000000
--- a/3rdparty/jsoncpp/include/json/writer.h
+++ /dev/null
@@ -1,327 +0,0 @@
-// Copyright 2007-2010 Baptiste Lepilleur
-// Distributed under MIT license, or public domain if desired and
-// recognized in your jurisdiction.
-// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
-
-#ifndef JSON_WRITER_H_INCLUDED
-#define JSON_WRITER_H_INCLUDED
-
-#if !defined(JSON_IS_AMALGAMATION)
-#include "value.h"
-#endif // if !defined(JSON_IS_AMALGAMATION)
-#include <vector>
-#include <string>
-#include <ostream>
-
-// Disable warning C4251: <data member>: <type> needs to have dll-interface to
-// be used by...
-#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
-#pragma warning(push)
-#pragma warning(disable : 4251)
-#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
-
-namespace Json {
-
-class Value;
-
-/**
-
-Usage:
-\code
- using namespace Json;
- void writeToStdout(StreamWriter::Factory const& factory, Value const& value) {
- std::unique_ptr<StreamWriter> const writer(
- factory.newStreamWriter());
- writer->write(value, &std::cout);
- std::cout << std::endl; // add lf and flush
- }
-\endcode
-*/
-class JSON_API StreamWriter {
-protected:
- std::ostream* sout_; // not owned; will not delete
-public:
- StreamWriter();
- virtual ~StreamWriter();
- /** Write Value into document as configured in sub-class.
- Do not take ownership of sout, but maintain a reference during function.
- \pre sout != NULL
- \return zero on success (For now, we always return zero, so check the stream instead.)
- \throw std::exception possibly, depending on configuration
- */
- virtual int write(Value const& root, std::ostream* sout) = 0;
-
- /** \brief A simple abstract factory.
- */
- class JSON_API Factory {
- public:
- virtual ~Factory();
- /** \brief Allocate a CharReader via operator new().
- * \throw std::exception if something goes wrong (e.g. invalid settings)
- */
- virtual StreamWriter* newStreamWriter() const = 0;
- }; // Factory
-}; // StreamWriter
-
-/** \brief Write into stringstream, then return string, for convenience.
- * A StreamWriter will be created from the factory, used, and then deleted.
- */
-std::string JSON_API writeString(StreamWriter::Factory const& factory, Value const& root);
-
-
-/** \brief Build a StreamWriter implementation.
-
-Usage:
-\code
- using namespace Json;
- Value value = ...;
- StreamWriterBuilder builder;
- builder["commentStyle"] = "None";
- builder["indentation"] = " "; // or whatever you like
- std::unique_ptr<Json::StreamWriter> writer(
- builder.newStreamWriter());
- writer->write(value, &std::cout);
- std::cout << std::endl; // add lf and flush
-\endcode
-*/
-class JSON_API StreamWriterBuilder : public StreamWriter::Factory {
-public:
- // Note: We use a Json::Value so that we can add data-members to this class
- // without a major version bump.
- /** Configuration of this builder.
- Available settings (case-sensitive):
- - "commentStyle": "None" or "All"
- - "indentation": "<anything>"
- - "enableYAMLCompatibility": false or true
- - slightly change the whitespace around colons
- - "dropNullPlaceholders": false or true
- - Drop the "null" string from the writer's output for nullValues.
- Strictly speaking, this is not valid JSON. But when the output is being
- fed to a browser's Javascript, it makes for smaller output and the
- browser can handle the output just fine.
-
- You can examine 'settings_` yourself
- to see the defaults. You can also write and read them just like any
- JSON Value.
- \sa setDefaults()
- */
- Json::Value settings_;
-
- StreamWriterBuilder();
- virtual ~StreamWriterBuilder();
-
- /**
- * \throw std::exception if something goes wrong (e.g. invalid settings)
- */
- virtual StreamWriter* newStreamWriter() const;
-
- /** \return true if 'settings' are legal and consistent;
- * otherwise, indicate bad settings via 'invalid'.
- */
- bool validate(Json::Value* invalid) const;
- /** A simple way to update a specific setting.
- */
- Value& operator[](std::string key);
-
- /** Called by ctor, but you can use this to reset settings_.
- * \pre 'settings' != NULL (but Json::null is fine)
- * \remark Defaults:
- * \snippet src/lib_json/json_writer.cpp StreamWriterBuilderDefaults
- */
- static void setDefaults(Json::Value* settings);
-};
-
-/** \brief Abstract class for writers.
- * \deprecated Use StreamWriter. (And really, this is an implementation detail.)
- */
-class JSON_API Writer {
-public:
- virtual ~Writer();
-
- virtual std::string write(const Value& root) = 0;
-};
-
-/** \brief Outputs a Value in <a HREF="http://www.json.org">JSON</a> format
- *without formatting (not human friendly).
- *
- * The JSON document is written in a single line. It is not intended for 'human'
- *consumption,
- * but may be usefull to support feature such as RPC where bandwith is limited.
- * \sa Reader, Value
- * \deprecated Use StreamWriterBuilder.
- */
-class JSON_API FastWriter : public Writer {
-
-public:
- FastWriter();
- virtual ~FastWriter() {}
-
- void enableYAMLCompatibility();
-
- /** \brief Drop the "null" string from the writer's output for nullValues.
- * Strictly speaking, this is not valid JSON. But when the output is being
- * fed to a browser's Javascript, it makes for smaller output and the
- * browser can handle the output just fine.
- */
- void dropNullPlaceholders();
-
- void omitEndingLineFeed();
-
-public: // overridden from Writer
- virtual std::string write(const Value& root);
-
-private:
- void writeValue(const Value& value);
-
- std::string document_;
- bool yamlCompatiblityEnabled_;
- bool dropNullPlaceholders_;
- bool omitEndingLineFeed_;
-};
-
-/** \brief Writes a Value in <a HREF="http://www.json.org">JSON</a> format in a
- *human friendly way.
- *
- * The rules for line break and indent are as follow:
- * - Object value:
- * - if empty then print {} without indent and line break
- * - if not empty the print '{', line break & indent, print one value per
- *line
- * and then unindent and line break and print '}'.
- * - Array value:
- * - if empty then print [] without indent and line break
- * - if the array contains no object value, empty array or some other value
- *types,
- * and all the values fit on one lines, then print the array on a single
- *line.
- * - otherwise, it the values do not fit on one line, or the array contains
- * object or non empty array, then print one value per line.
- *
- * If the Value have comments then they are outputed according to their
- *#CommentPlacement.
- *
- * \sa Reader, Value, Value::setComment()
- * \deprecated Use StreamWriterBuilder.
- */
-class JSON_API StyledWriter : public Writer {
-public:
- StyledWriter();
- virtual ~StyledWriter() {}
-
-public: // overridden from Writer
- /** \brief Serialize a Value in <a HREF="http://www.json.org">JSON</a> format.
- * \param root Value to serialize.
- * \return String containing the JSON document that represents the root value.
- */
- virtual std::string write(const Value& root);
-
-private:
- void writeValue(const Value& value);
- void writeArrayValue(const Value& value);
- bool isMultineArray(const Value& value);
- void pushValue(const std::string& value);
- void writeIndent();
- void writeWithIndent(const std::string& value);
- void indent();
- void unindent();
- void writeCommentBeforeValue(const Value& root);
- void writeCommentAfterValueOnSameLine(const Value& root);
- bool hasCommentForValue(const Value& value);
- static std::string normalizeEOL(const std::string& text);
-
- typedef std::vector<std::string> ChildValues;
-
- ChildValues childValues_;
- std::string document_;
- std::string indentString_;
- int rightMargin_;
- int indentSize_;
- bool addChildValues_;
-};
-
-/** \brief Writes a Value in <a HREF="http://www.json.org">JSON</a> format in a
- human friendly way,
- to a stream rather than to a string.
- *
- * The rules for line break and indent are as follow:
- * - Object value:
- * - if empty then print {} without indent and line break
- * - if not empty the print '{', line break & indent, print one value per
- line
- * and then unindent and line break and print '}'.
- * - Array value:
- * - if empty then print [] without indent and line break
- * - if the array contains no object value, empty array or some other value
- types,
- * and all the values fit on one lines, then print the array on a single
- line.
- * - otherwise, it the values do not fit on one line, or the array contains
- * object or non empty array, then print one value per line.
- *
- * If the Value have comments then they are outputed according to their
- #CommentPlacement.
- *
- * \param indentation Each level will be indented by this amount extra.
- * \sa Reader, Value, Value::setComment()
- * \deprecated Use StreamWriterBuilder.
- */
-class JSON_API StyledStreamWriter {
-public:
- StyledStreamWriter(std::string indentation = "\t");
- ~StyledStreamWriter() {}
-
-public:
- /** \brief Serialize a Value in <a HREF="http://www.json.org">JSON</a> format.
- * \param out Stream to write to. (Can be ostringstream, e.g.)
- * \param root Value to serialize.
- * \note There is no point in deriving from Writer, since write() should not
- * return a value.
- */
- void write(std::ostream& out, const Value& root);
-
-private:
- void writeValue(const Value& value);
- void writeArrayValue(const Value& value);
- bool isMultineArray(const Value& value);
- void pushValue(const std::string& value);
- void writeIndent();
- void writeWithIndent(const std::string& value);
- void indent();
- void unindent();
- void writeCommentBeforeValue(const Value& root);
- void writeCommentAfterValueOnSameLine(const Value& root);
- bool hasCommentForValue(const Value& value);
- static std::string normalizeEOL(const std::string& text);
-
- typedef std::vector<std::string> ChildValues;
-
- ChildValues childValues_;
- std::ostream* document_;
- std::string indentString_;
- int rightMargin_;
- std::string indentation_;
- bool addChildValues_ : 1;
- bool indented_ : 1;
-};
-
-#if defined(JSON_HAS_INT64)
-std::string JSON_API valueToString(Int value);
-std::string JSON_API valueToString(UInt value);
-#endif // if defined(JSON_HAS_INT64)
-std::string JSON_API valueToString(LargestInt value);
-std::string JSON_API valueToString(LargestUInt value);
-std::string JSON_API valueToString(double value);
-std::string JSON_API valueToString(bool value);
-std::string JSON_API valueToQuotedString(const char* value);
-
-/// \brief Output using the StyledStreamWriter.
-/// \see Json::operator>>()
-JSON_API std::ostream& operator<<(std::ostream&, const Value& root);
-
-} // namespace Json
-
-#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
-#pragma warning(pop)
-#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
-
-#endif // JSON_WRITER_H_INCLUDED
diff --git a/3rdparty/jsoncpp/makefiles/msvc2010/jsoncpp.sln b/3rdparty/jsoncpp/makefiles/msvc2010/jsoncpp.sln
deleted file mode 100644
index c4ecb907072..00000000000
--- a/3rdparty/jsoncpp/makefiles/msvc2010/jsoncpp.sln
+++ /dev/null
@@ -1,42 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 11.00
-# Visual Studio 2010
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lib_json", "lib_json.vcxproj", "{1E6C2C1C-6453-4129-AE3F-0EE8E6599C89}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jsontest", "jsontest.vcxproj", "{25AF2DD2-D396-4668-B188-488C33B8E620}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_lib_json", "test_lib_json.vcxproj", "{B7A96B78-2782-40D2-8F37-A2DEF2B9C26D}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Win32 = Debug|Win32
- Debug|x64 = Debug|x64
- Release|Win32 = Release|Win32
- Release|x64 = Release|x64
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {1E6C2C1C-6453-4129-AE3F-0EE8E6599C89}.Debug|Win32.ActiveCfg = Debug|Win32
- {1E6C2C1C-6453-4129-AE3F-0EE8E6599C89}.Debug|Win32.Build.0 = Debug|Win32
- {1E6C2C1C-6453-4129-AE3F-0EE8E6599C89}.Debug|x64.ActiveCfg = Debug|x64
- {1E6C2C1C-6453-4129-AE3F-0EE8E6599C89}.Debug|x64.Build.0 = Debug|x64
- {1E6C2C1C-6453-4129-AE3F-0EE8E6599C89}.Release|Win32.ActiveCfg = Release|Win32
- {1E6C2C1C-6453-4129-AE3F-0EE8E6599C89}.Release|Win32.Build.0 = Release|Win32
- {1E6C2C1C-6453-4129-AE3F-0EE8E6599C89}.Release|x64.ActiveCfg = Release|x64
- {1E6C2C1C-6453-4129-AE3F-0EE8E6599C89}.Release|x64.Build.0 = Release|x64
- {25AF2DD2-D396-4668-B188-488C33B8E620}.Debug|Win32.ActiveCfg = Debug|Win32
- {25AF2DD2-D396-4668-B188-488C33B8E620}.Debug|Win32.Build.0 = Debug|Win32
- {25AF2DD2-D396-4668-B188-488C33B8E620}.Debug|x64.ActiveCfg = Debug|Win32
- {25AF2DD2-D396-4668-B188-488C33B8E620}.Release|Win32.ActiveCfg = Release|Win32
- {25AF2DD2-D396-4668-B188-488C33B8E620}.Release|Win32.Build.0 = Release|Win32
- {25AF2DD2-D396-4668-B188-488C33B8E620}.Release|x64.ActiveCfg = Release|Win32
- {B7A96B78-2782-40D2-8F37-A2DEF2B9C26D}.Debug|Win32.ActiveCfg = Debug|Win32
- {B7A96B78-2782-40D2-8F37-A2DEF2B9C26D}.Debug|Win32.Build.0 = Debug|Win32
- {B7A96B78-2782-40D2-8F37-A2DEF2B9C26D}.Debug|x64.ActiveCfg = Debug|Win32
- {B7A96B78-2782-40D2-8F37-A2DEF2B9C26D}.Release|Win32.ActiveCfg = Release|Win32
- {B7A96B78-2782-40D2-8F37-A2DEF2B9C26D}.Release|Win32.Build.0 = Release|Win32
- {B7A96B78-2782-40D2-8F37-A2DEF2B9C26D}.Release|x64.ActiveCfg = Release|Win32
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
diff --git a/3rdparty/jsoncpp/makefiles/msvc2010/jsontest.vcxproj b/3rdparty/jsoncpp/makefiles/msvc2010/jsontest.vcxproj
deleted file mode 100644
index 939d440ddcd..00000000000
--- a/3rdparty/jsoncpp/makefiles/msvc2010/jsontest.vcxproj
+++ /dev/null
@@ -1,96 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <ItemGroup Label="ProjectConfigurations">
- <ProjectConfiguration Include="Debug|Win32">
- <Configuration>Debug</Configuration>
- <Platform>Win32</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Release|Win32">
- <Configuration>Release</Configuration>
- <Platform>Win32</Platform>
- </ProjectConfiguration>
- </ItemGroup>
- <PropertyGroup Label="Globals">
- <ProjectGuid>{25AF2DD2-D396-4668-B188-488C33B8E620}</ProjectGuid>
- <Keyword>Win32Proj</Keyword>
- </PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
- <ConfigurationType>Application</ConfigurationType>
- <CharacterSet>MultiByte</CharacterSet>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
- <ConfigurationType>Application</ConfigurationType>
- <CharacterSet>MultiByte</CharacterSet>
- </PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
- <ImportGroup Label="ExtensionSettings">
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <PropertyGroup Label="UserMacros" />
- <PropertyGroup>
- <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../build/vs71/debug/jsontest\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../build/vs71/debug/jsontest\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../build/vs71/release/jsontest\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../build/vs71/release/jsontest\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
- </PropertyGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <ClCompile>
- <Optimization>Disabled</Optimization>
- <AdditionalIncludeDirectories>../../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <MinimalRebuild>true</MinimalRebuild>
- <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
- <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
- <PrecompiledHeader>
- </PrecompiledHeader>
- <WarningLevel>Level3</WarningLevel>
- <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
- </ClCompile>
- <Link>
- <OutputFile>$(OutDir)jsontest.exe</OutputFile>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <ProgramDatabaseFile>$(OutDir)jsontest.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
- <TargetMachine>MachineX86</TargetMachine>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <ClCompile>
- <AdditionalIncludeDirectories>../../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
- <PrecompiledHeader>
- </PrecompiledHeader>
- <WarningLevel>Level3</WarningLevel>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- </ClCompile>
- <Link>
- <OutputFile>$(OutDir)jsontest.exe</OutputFile>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <SubSystem>Console</SubSystem>
- <OptimizeReferences>true</OptimizeReferences>
- <EnableCOMDATFolding>true</EnableCOMDATFolding>
- <TargetMachine>MachineX86</TargetMachine>
- </Link>
- </ItemDefinitionGroup>
- <ItemGroup>
- <ClCompile Include="..\..\src\jsontestrunner\main.cpp" />
- </ItemGroup>
- <ItemGroup>
- <ProjectReference Include="lib_json.vcxproj">
- <Project>{1e6c2c1c-6453-4129-ae3f-0ee8e6599c89}</Project>
- </ProjectReference>
- </ItemGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
- <ImportGroup Label="ExtensionTargets">
- </ImportGroup>
-</Project> \ No newline at end of file
diff --git a/3rdparty/jsoncpp/makefiles/msvc2010/jsontest.vcxproj.filters b/3rdparty/jsoncpp/makefiles/msvc2010/jsontest.vcxproj.filters
deleted file mode 100644
index 610b540ea52..00000000000
--- a/3rdparty/jsoncpp/makefiles/msvc2010/jsontest.vcxproj.filters
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <ItemGroup>
- <Filter Include="Source Files">
- <UniqueIdentifier>{903591b3-ade3-4ce4-b1f9-1e175e62b014}</UniqueIdentifier>
- </Filter>
- </ItemGroup>
- <ItemGroup>
- <ClCompile Include="..\..\src\jsontestrunner\main.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
- </ItemGroup>
-</Project> \ No newline at end of file
diff --git a/3rdparty/jsoncpp/makefiles/msvc2010/lib_json.vcxproj b/3rdparty/jsoncpp/makefiles/msvc2010/lib_json.vcxproj
deleted file mode 100644
index 3cfd0f9362d..00000000000
--- a/3rdparty/jsoncpp/makefiles/msvc2010/lib_json.vcxproj
+++ /dev/null
@@ -1,143 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <ItemGroup Label="ProjectConfigurations">
- <ProjectConfiguration Include="Debug|Win32">
- <Configuration>Debug</Configuration>
- <Platform>Win32</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Debug|x64">
- <Configuration>Debug</Configuration>
- <Platform>x64</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Release|Win32">
- <Configuration>Release</Configuration>
- <Platform>Win32</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Release|x64">
- <Configuration>Release</Configuration>
- <Platform>x64</Platform>
- </ProjectConfiguration>
- </ItemGroup>
- <ItemGroup>
- <ClCompile Include="..\..\src\lib_json\json_reader.cpp" />
- <ClCompile Include="..\..\src\lib_json\json_value.cpp" />
- <ClCompile Include="..\..\src\lib_json\json_writer.cpp" />
- </ItemGroup>
- <ItemGroup>
- <ClInclude Include="..\..\include\json\reader.h" />
- <ClInclude Include="..\..\include\json\value.h" />
- <ClInclude Include="..\..\include\json\writer.h" />
- </ItemGroup>
- <PropertyGroup Label="Globals">
- <ProjectGuid>{1E6C2C1C-6453-4129-AE3F-0EE8E6599C89}</ProjectGuid>
- <Keyword>Win32Proj</Keyword>
- <RootNamespace>jsoncpp</RootNamespace>
- </PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
- <ConfigurationType>StaticLibrary</ConfigurationType>
- <UseDebugLibraries>true</UseDebugLibraries>
- <CharacterSet>Unicode</CharacterSet>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
- <ConfigurationType>StaticLibrary</ConfigurationType>
- <UseDebugLibraries>true</UseDebugLibraries>
- <CharacterSet>Unicode</CharacterSet>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
- <ConfigurationType>StaticLibrary</ConfigurationType>
- <UseDebugLibraries>false</UseDebugLibraries>
- <WholeProgramOptimization>true</WholeProgramOptimization>
- <CharacterSet>Unicode</CharacterSet>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
- <ConfigurationType>StaticLibrary</ConfigurationType>
- <UseDebugLibraries>false</UseDebugLibraries>
- <WholeProgramOptimization>true</WholeProgramOptimization>
- <CharacterSet>Unicode</CharacterSet>
- </PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
- <ImportGroup Label="ExtensionSettings">
- </ImportGroup>
- <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <PropertyGroup Label="UserMacros" />
- <PropertyGroup />
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <ClCompile>
- <PrecompiledHeader>NotUsing</PrecompiledHeader>
- <WarningLevel>Level3</WarningLevel>
- <Optimization>Disabled</Optimization>
- <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <AdditionalIncludeDirectories>../../include</AdditionalIncludeDirectories>
- <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
- </ClCompile>
- <Link>
- <SubSystem>Windows</SubSystem>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <ClCompile>
- <PrecompiledHeader>NotUsing</PrecompiledHeader>
- <WarningLevel>Level3</WarningLevel>
- <Optimization>Disabled</Optimization>
- <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <AdditionalIncludeDirectories>../../include</AdditionalIncludeDirectories>
- <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
- </ClCompile>
- <Link>
- <SubSystem>Windows</SubSystem>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <ClCompile>
- <WarningLevel>Level3</WarningLevel>
- <PrecompiledHeader>NotUsing</PrecompiledHeader>
- <Optimization>MaxSpeed</Optimization>
- <FunctionLevelLinking>true</FunctionLevelLinking>
- <IntrinsicFunctions>true</IntrinsicFunctions>
- <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <AdditionalIncludeDirectories>../../include</AdditionalIncludeDirectories>
- <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
- </ClCompile>
- <Link>
- <SubSystem>Windows</SubSystem>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <EnableCOMDATFolding>true</EnableCOMDATFolding>
- <OptimizeReferences>true</OptimizeReferences>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <ClCompile>
- <WarningLevel>Level3</WarningLevel>
- <PrecompiledHeader>NotUsing</PrecompiledHeader>
- <Optimization>MaxSpeed</Optimization>
- <FunctionLevelLinking>true</FunctionLevelLinking>
- <IntrinsicFunctions>true</IntrinsicFunctions>
- <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <AdditionalIncludeDirectories>../../include</AdditionalIncludeDirectories>
- <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
- </ClCompile>
- <Link>
- <SubSystem>Windows</SubSystem>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <EnableCOMDATFolding>true</EnableCOMDATFolding>
- <OptimizeReferences>true</OptimizeReferences>
- </Link>
- </ItemDefinitionGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
- <ImportGroup Label="ExtensionTargets">
- </ImportGroup>
-</Project> \ No newline at end of file
diff --git a/3rdparty/jsoncpp/makefiles/msvc2010/lib_json.vcxproj.filters b/3rdparty/jsoncpp/makefiles/msvc2010/lib_json.vcxproj.filters
deleted file mode 100644
index 63c740331e7..00000000000
--- a/3rdparty/jsoncpp/makefiles/msvc2010/lib_json.vcxproj.filters
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <ItemGroup>
- <Filter Include="Header Files">
- <UniqueIdentifier>{c110bc57-c46e-476c-97ea-84d8014f431c}</UniqueIdentifier>
- </Filter>
- <Filter Include="Source Files">
- <UniqueIdentifier>{ed718592-5acf-47b5-8f2b-b8224590da6a}</UniqueIdentifier>
- </Filter>
- </ItemGroup>
- <ItemGroup>
- <ClCompile Include="..\..\src\lib_json\json_reader.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="..\..\src\lib_json\json_value.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="..\..\src\lib_json\json_writer.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
- </ItemGroup>
- <ItemGroup>
- <ClInclude Include="..\..\include\json\reader.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="..\..\include\json\value.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="..\..\include\json\writer.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- </ItemGroup>
-</Project> \ No newline at end of file
diff --git a/3rdparty/jsoncpp/makefiles/msvc2010/test_lib_json.vcxproj b/3rdparty/jsoncpp/makefiles/msvc2010/test_lib_json.vcxproj
deleted file mode 100644
index 068af613e4f..00000000000
--- a/3rdparty/jsoncpp/makefiles/msvc2010/test_lib_json.vcxproj
+++ /dev/null
@@ -1,109 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <ItemGroup Label="ProjectConfigurations">
- <ProjectConfiguration Include="Debug|Win32">
- <Configuration>Debug</Configuration>
- <Platform>Win32</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Release|Win32">
- <Configuration>Release</Configuration>
- <Platform>Win32</Platform>
- </ProjectConfiguration>
- </ItemGroup>
- <PropertyGroup Label="Globals">
- <ProjectGuid>{B7A96B78-2782-40D2-8F37-A2DEF2B9C26D}</ProjectGuid>
- <RootNamespace>test_lib_json</RootNamespace>
- <Keyword>Win32Proj</Keyword>
- </PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
- <ConfigurationType>Application</ConfigurationType>
- <CharacterSet>MultiByte</CharacterSet>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
- <ConfigurationType>Application</ConfigurationType>
- <CharacterSet>MultiByte</CharacterSet>
- </PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
- <ImportGroup Label="ExtensionSettings">
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <PropertyGroup Label="UserMacros" />
- <PropertyGroup>
- <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../build/vs71/debug/test_lib_json\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../build/vs71/debug/test_lib_json\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../build/vs71/release/test_lib_json\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../build/vs71/release/test_lib_json\</IntDir>
- <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
- </PropertyGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <ClCompile>
- <Optimization>Disabled</Optimization>
- <AdditionalIncludeDirectories>../../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <MinimalRebuild>true</MinimalRebuild>
- <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
- <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
- <PrecompiledHeader>
- </PrecompiledHeader>
- <WarningLevel>Level3</WarningLevel>
- <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
- </ClCompile>
- <Link>
- <OutputFile>$(OutDir)test_lib_json.exe</OutputFile>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <ProgramDatabaseFile>$(OutDir)test_lib_json.pdb</ProgramDatabaseFile>
- <SubSystem>Console</SubSystem>
- <TargetMachine>MachineX86</TargetMachine>
- </Link>
- <PostBuildEvent>
- <Message>Running all unit tests</Message>
- <Command>$(TargetPath)</Command>
- </PostBuildEvent>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <ClCompile>
- <AdditionalIncludeDirectories>../../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
- <PrecompiledHeader>
- </PrecompiledHeader>
- <WarningLevel>Level3</WarningLevel>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- </ClCompile>
- <Link>
- <OutputFile>$(OutDir)test_lib_json.exe</OutputFile>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <SubSystem>Console</SubSystem>
- <OptimizeReferences>true</OptimizeReferences>
- <EnableCOMDATFolding>true</EnableCOMDATFolding>
- <TargetMachine>MachineX86</TargetMachine>
- </Link>
- <PostBuildEvent>
- <Message>Running all unit tests</Message>
- <Command>$(TargetPath)</Command>
- </PostBuildEvent>
- </ItemDefinitionGroup>
- <ItemGroup>
- <ClCompile Include="..\..\src\test_lib_json\jsontest.cpp" />
- <ClCompile Include="..\..\src\test_lib_json\main.cpp" />
- </ItemGroup>
- <ItemGroup>
- <ClInclude Include="..\..\src\test_lib_json\jsontest.h" />
- </ItemGroup>
- <ItemGroup>
- <ProjectReference Include="lib_json.vcxproj">
- <Project>{1e6c2c1c-6453-4129-ae3f-0ee8e6599c89}</Project>
- </ProjectReference>
- </ItemGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
- <ImportGroup Label="ExtensionTargets">
- </ImportGroup>
-</Project> \ No newline at end of file
diff --git a/3rdparty/jsoncpp/makefiles/msvc2010/test_lib_json.vcxproj.filters b/3rdparty/jsoncpp/makefiles/msvc2010/test_lib_json.vcxproj.filters
deleted file mode 100644
index 8f0a17b995c..00000000000
--- a/3rdparty/jsoncpp/makefiles/msvc2010/test_lib_json.vcxproj.filters
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <ItemGroup>
- <ClCompile Include="..\..\src\test_lib_json\jsontest.cpp">
- <Filter>Source Filter</Filter>
- </ClCompile>
- <ClCompile Include="..\..\src\test_lib_json\main.cpp">
- <Filter>Source Filter</Filter>
- </ClCompile>
- </ItemGroup>
- <ItemGroup>
- <Filter Include="Source Filter">
- <UniqueIdentifier>{bf40cbfc-8e98-40b4-b9f3-7e8d579cbae2}</UniqueIdentifier>
- </Filter>
- <Filter Include="Header Files">
- <UniqueIdentifier>{5fd39074-89e6-4939-aa3f-694fefd296b1}</UniqueIdentifier>
- </Filter>
- </ItemGroup>
- <ItemGroup>
- <ClInclude Include="..\..\src\test_lib_json\jsontest.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- </ItemGroup>
-</Project> \ No newline at end of file
diff --git a/3rdparty/jsoncpp/makefiles/vs71/jsoncpp.sln b/3rdparty/jsoncpp/makefiles/vs71/jsoncpp.sln
deleted file mode 100644
index dd2f91b4420..00000000000
--- a/3rdparty/jsoncpp/makefiles/vs71/jsoncpp.sln
+++ /dev/null
@@ -1,46 +0,0 @@
-Microsoft Visual Studio Solution File, Format Version 8.00
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lib_json", "lib_json.vcproj", "{B84F7231-16CE-41D8-8C08-7B523FF4225B}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jsontest", "jsontest.vcproj", "{25AF2DD2-D396-4668-B188-488C33B8E620}"
- ProjectSection(ProjectDependencies) = postProject
- {B84F7231-16CE-41D8-8C08-7B523FF4225B} = {B84F7231-16CE-41D8-8C08-7B523FF4225B}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_lib_json", "test_lib_json.vcproj", "{B7A96B78-2782-40D2-8F37-A2DEF2B9C26D}"
- ProjectSection(ProjectDependencies) = postProject
- {B84F7231-16CE-41D8-8C08-7B523FF4225B} = {B84F7231-16CE-41D8-8C08-7B523FF4225B}
- EndProjectSection
-EndProject
-Global
- GlobalSection(SolutionConfiguration) = preSolution
- Debug = Debug
- dummy = dummy
- Release = Release
- EndGlobalSection
- GlobalSection(ProjectConfiguration) = postSolution
- {B84F7231-16CE-41D8-8C08-7B523FF4225B}.Debug.ActiveCfg = Debug|Win32
- {B84F7231-16CE-41D8-8C08-7B523FF4225B}.Debug.Build.0 = Debug|Win32
- {B84F7231-16CE-41D8-8C08-7B523FF4225B}.dummy.ActiveCfg = dummy|Win32
- {B84F7231-16CE-41D8-8C08-7B523FF4225B}.dummy.Build.0 = dummy|Win32
- {B84F7231-16CE-41D8-8C08-7B523FF4225B}.Release.ActiveCfg = Release|Win32
- {B84F7231-16CE-41D8-8C08-7B523FF4225B}.Release.Build.0 = Release|Win32
- {25AF2DD2-D396-4668-B188-488C33B8E620}.Debug.ActiveCfg = Debug|Win32
- {25AF2DD2-D396-4668-B188-488C33B8E620}.Debug.Build.0 = Debug|Win32
- {25AF2DD2-D396-4668-B188-488C33B8E620}.dummy.ActiveCfg = Debug|Win32
- {25AF2DD2-D396-4668-B188-488C33B8E620}.dummy.Build.0 = Debug|Win32
- {25AF2DD2-D396-4668-B188-488C33B8E620}.Release.ActiveCfg = Release|Win32
- {25AF2DD2-D396-4668-B188-488C33B8E620}.Release.Build.0 = Release|Win32
- {B7A96B78-2782-40D2-8F37-A2DEF2B9C26D}.Debug.ActiveCfg = Debug|Win32
- {B7A96B78-2782-40D2-8F37-A2DEF2B9C26D}.Debug.Build.0 = Debug|Win32
- {B7A96B78-2782-40D2-8F37-A2DEF2B9C26D}.dummy.ActiveCfg = Debug|Win32
- {B7A96B78-2782-40D2-8F37-A2DEF2B9C26D}.dummy.Build.0 = Debug|Win32
- {B7A96B78-2782-40D2-8F37-A2DEF2B9C26D}.Release.ActiveCfg = Release|Win32
- {B7A96B78-2782-40D2-8F37-A2DEF2B9C26D}.Release.Build.0 = Release|Win32
- EndGlobalSection
- GlobalSection(ExtensibilityGlobals) = postSolution
- EndGlobalSection
- GlobalSection(ExtensibilityAddIns) = postSolution
- EndGlobalSection
-EndGlobal
diff --git a/3rdparty/jsoncpp/makefiles/vs71/jsontest.vcproj b/3rdparty/jsoncpp/makefiles/vs71/jsontest.vcproj
deleted file mode 100644
index 562c71f61ad..00000000000
--- a/3rdparty/jsoncpp/makefiles/vs71/jsontest.vcproj
+++ /dev/null
@@ -1,119 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="jsontest"
- ProjectGUID="{25AF2DD2-D396-4668-B188-488C33B8E620}"
- Keyword="Win32Proj">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="../../build/vs71/debug/jsontest"
- IntermediateDirectory="../../build/vs71/debug/jsontest"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="../../include"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
- MinimalRebuild="TRUE"
- BasicRuntimeChecks="3"
- RuntimeLibrary="1"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="4"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- OutputFile="$(OutDir)/jsontest.exe"
- LinkIncremental="2"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile="$(OutDir)/jsontest.pdb"
- SubSystem="1"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="../../build/vs71/release/jsontest"
- IntermediateDirectory="../../build/vs71/release/jsontest"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="../../include"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="0"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- OutputFile="$(OutDir)/jsontest.exe"
- LinkIncremental="1"
- GenerateDebugInformation="TRUE"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <File
- RelativePath="..\..\src\jsontestrunner\main.cpp">
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/3rdparty/jsoncpp/makefiles/vs71/lib_json.vcproj b/3rdparty/jsoncpp/makefiles/vs71/lib_json.vcproj
deleted file mode 100644
index 24c5dd411f6..00000000000
--- a/3rdparty/jsoncpp/makefiles/vs71/lib_json.vcproj
+++ /dev/null
@@ -1,205 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="lib_json"
- ProjectGUID="{B84F7231-16CE-41D8-8C08-7B523FF4225B}"
- Keyword="Win32Proj">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="../../build/vs71/debug/lib_json"
- IntermediateDirectory="../../build/vs71/debug/lib_json"
- ConfigurationType="4"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="../../include"
- PreprocessorDefinitions="WIN32;_DEBUG;_LIB"
- StringPooling="TRUE"
- MinimalRebuild="TRUE"
- BasicRuntimeChecks="3"
- RuntimeLibrary="1"
- EnableFunctionLevelLinking="TRUE"
- DisableLanguageExtensions="TRUE"
- ForceConformanceInForLoopScope="FALSE"
- RuntimeTypeInfo="TRUE"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="4"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLibrarianTool"
- OutputFile="$(OutDir)/json_vc71_libmtd.lib"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="../../build/vs71/release/lib_json"
- IntermediateDirectory="../../build/vs71/release/lib_json"
- ConfigurationType="4"
- CharacterSet="2"
- WholeProgramOptimization="TRUE">
- <Tool
- Name="VCCLCompilerTool"
- GlobalOptimizations="TRUE"
- EnableIntrinsicFunctions="TRUE"
- AdditionalIncludeDirectories="../../include"
- PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
- StringPooling="TRUE"
- RuntimeLibrary="0"
- EnableFunctionLevelLinking="TRUE"
- DisableLanguageExtensions="TRUE"
- ForceConformanceInForLoopScope="FALSE"
- RuntimeTypeInfo="TRUE"
- UsePrecompiledHeader="0"
- AssemblerOutput="4"
- WarningLevel="3"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLibrarianTool"
- OutputFile="$(OutDir)/json_vc71_libmt.lib"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="dummy|Win32"
- OutputDirectory="$(ConfigurationName)"
- IntermediateDirectory="$(ConfigurationName)"
- ConfigurationType="2"
- CharacterSet="2"
- WholeProgramOptimization="TRUE">
- <Tool
- Name="VCCLCompilerTool"
- GlobalOptimizations="TRUE"
- EnableIntrinsicFunctions="TRUE"
- AdditionalIncludeDirectories="../../include"
- PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
- StringPooling="TRUE"
- RuntimeLibrary="4"
- EnableFunctionLevelLinking="TRUE"
- DisableLanguageExtensions="TRUE"
- ForceConformanceInForLoopScope="FALSE"
- RuntimeTypeInfo="TRUE"
- UsePrecompiledHeader="0"
- AssemblerOutput="4"
- WarningLevel="3"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- GenerateDebugInformation="TRUE"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <File
- RelativePath="..\..\include\json\autolink.h">
- </File>
- <File
- RelativePath="..\..\include\json\config.h">
- </File>
- <File
- RelativePath="..\..\include\json\features.h">
- </File>
- <File
- RelativePath="..\..\include\json\forwards.h">
- </File>
- <File
- RelativePath="..\..\include\json\json.h">
- </File>
- <File
- RelativePath="..\..\src\lib_json\json_reader.cpp">
- </File>
- <File
- RelativePath="..\..\src\lib_json\json_value.cpp">
- </File>
- <File
- RelativePath="..\..\src\lib_json\json_valueiterator.inl">
- </File>
- <File
- RelativePath="..\..\src\lib_json\json_writer.cpp">
- </File>
- <File
- RelativePath="..\..\include\json\reader.h">
- </File>
- <File
- RelativePath="..\..\include\json\value.h">
- </File>
- <File
- RelativePath="..\..\include\json\writer.h">
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/3rdparty/jsoncpp/makefiles/vs71/test_lib_json.vcproj b/3rdparty/jsoncpp/makefiles/vs71/test_lib_json.vcproj
deleted file mode 100644
index 9ebb986a665..00000000000
--- a/3rdparty/jsoncpp/makefiles/vs71/test_lib_json.vcproj
+++ /dev/null
@@ -1,130 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="test_lib_json"
- ProjectGUID="{B7A96B78-2782-40D2-8F37-A2DEF2B9C26D}"
- RootNamespace="test_lib_json"
- Keyword="Win32Proj">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="../../build/vs71/debug/test_lib_json"
- IntermediateDirectory="../../build/vs71/debug/test_lib_json"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="../../include"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
- MinimalRebuild="TRUE"
- BasicRuntimeChecks="3"
- RuntimeLibrary="1"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="4"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- OutputFile="$(OutDir)/test_lib_json.exe"
- LinkIncremental="2"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile="$(OutDir)/test_lib_json.pdb"
- SubSystem="1"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"
- Description="Running all unit tests"
- CommandLine="$(TargetPath)"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="../../build/vs71/release/test_lib_json"
- IntermediateDirectory="../../build/vs71/release/test_lib_json"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="../../include"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="0"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- OutputFile="$(OutDir)/test_lib_json.exe"
- LinkIncremental="1"
- GenerateDebugInformation="TRUE"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"
- Description="Running all unit tests"
- CommandLine="$(TargetPath)"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <File
- RelativePath="..\..\src\test_lib_json\jsontest.cpp">
- </File>
- <File
- RelativePath="..\..\src\test_lib_json\jsontest.h">
- </File>
- <File
- RelativePath="..\..\src\test_lib_json\main.cpp">
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/3rdparty/jsoncpp/makerelease.py b/3rdparty/jsoncpp/makerelease.py
deleted file mode 100644
index ea3722de449..00000000000
--- a/3rdparty/jsoncpp/makerelease.py
+++ /dev/null
@@ -1,390 +0,0 @@
-# Copyright 2010 Baptiste Lepilleur
-# Distributed under MIT license, or public domain if desired and
-# recognized in your jurisdiction.
-# See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
-
-"""Tag the sandbox for release, make source and doc tarballs.
-
-Requires Python 2.6
-
-Example of invocation (use to test the script):
-python makerelease.py --platform=msvc6,msvc71,msvc80,msvc90,mingw -ublep 0.6.0 0.7.0-dev
-
-When testing this script:
-python makerelease.py --force --retag --platform=msvc6,msvc71,msvc80,mingw -ublep test-0.6.0 test-0.6.1-dev
-
-Example of invocation when doing a release:
-python makerelease.py 0.5.0 0.6.0-dev
-
-Note: This was for Subversion. Now that we are in GitHub, we do not
-need to build versioned tarballs anymore, so makerelease.py is defunct.
-"""
-
-from __future__ import print_function
-import os.path
-import subprocess
-import sys
-import doxybuild
-import subprocess
-import xml.etree.ElementTree as ElementTree
-import shutil
-import urllib2
-import tempfile
-import os
-import time
-from devtools import antglob, fixeol, tarball
-import amalgamate
-
-SVN_ROOT = 'https://jsoncpp.svn.sourceforge.net/svnroot/jsoncpp/'
-SVN_TAG_ROOT = SVN_ROOT + 'tags/jsoncpp'
-SCONS_LOCAL_URL = 'http://sourceforge.net/projects/scons/files/scons-local/1.2.0/scons-local-1.2.0.tar.gz/download'
-SOURCEFORGE_PROJECT = 'jsoncpp'
-
-def set_version(version):
- with open('version','wb') as f:
- f.write(version.strip())
-
-def rmdir_if_exist(dir_path):
- if os.path.isdir(dir_path):
- shutil.rmtree(dir_path)
-
-class SVNError(Exception):
- pass
-
-def svn_command(command, *args):
- cmd = ['svn', '--non-interactive', command] + list(args)
- print('Running:', ' '.join(cmd))
- process = subprocess.Popen(cmd,
- stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT)
- stdout = process.communicate()[0]
- if process.returncode:
- error = SVNError('SVN command failed:\n' + stdout)
- error.returncode = process.returncode
- raise error
- return stdout
-
-def check_no_pending_commit():
- """Checks that there is no pending commit in the sandbox."""
- stdout = svn_command('status', '--xml')
- etree = ElementTree.fromstring(stdout)
- msg = []
- for entry in etree.getiterator('entry'):
- path = entry.get('path')
- status = entry.find('wc-status').get('item')
- if status != 'unversioned' and path != 'version':
- msg.append('File "%s" has pending change (status="%s")' % (path, status))
- if msg:
- msg.insert(0, 'Pending change to commit found in sandbox. Commit them first!')
- return '\n'.join(msg)
-
-def svn_join_url(base_url, suffix):
- if not base_url.endswith('/'):
- base_url += '/'
- if suffix.startswith('/'):
- suffix = suffix[1:]
- return base_url + suffix
-
-def svn_check_if_tag_exist(tag_url):
- """Checks if a tag exist.
- Returns: True if the tag exist, False otherwise.
- """
- try:
- list_stdout = svn_command('list', tag_url)
- except SVNError as e:
- if e.returncode != 1 or not str(e).find('tag_url'):
- raise e
- # otherwise ignore error, meaning tag does not exist
- return False
- return True
-
-def svn_commit(message):
- """Commit the sandbox, providing the specified comment.
- """
- svn_command('ci', '-m', message)
-
-def svn_tag_sandbox(tag_url, message):
- """Makes a tag based on the sandbox revisions.
- """
- svn_command('copy', '-m', message, '.', tag_url)
-
-def svn_remove_tag(tag_url, message):
- """Removes an existing tag.
- """
- svn_command('delete', '-m', message, tag_url)
-
-def svn_export(tag_url, export_dir):
- """Exports the tag_url revision to export_dir.
- Target directory, including its parent is created if it does not exist.
- If the directory export_dir exist, it is deleted before export proceed.
- """
- rmdir_if_exist(export_dir)
- svn_command('export', tag_url, export_dir)
-
-def fix_sources_eol(dist_dir):
- """Set file EOL for tarball distribution.
- """
- print('Preparing exported source file EOL for distribution...')
- prune_dirs = antglob.prune_dirs + 'scons-local* ./build* ./libs ./dist'
- win_sources = antglob.glob(dist_dir,
- includes = '**/*.sln **/*.vcproj',
- prune_dirs = prune_dirs)
- unix_sources = antglob.glob(dist_dir,
- includes = '''**/*.h **/*.cpp **/*.inl **/*.txt **/*.dox **/*.py **/*.html **/*.in
- sconscript *.json *.expected AUTHORS LICENSE''',
- excludes = antglob.default_excludes + 'scons.py sconsign.py scons-*',
- prune_dirs = prune_dirs)
- for path in win_sources:
- fixeol.fix_source_eol(path, is_dry_run = False, verbose = True, eol = '\r\n')
- for path in unix_sources:
- fixeol.fix_source_eol(path, is_dry_run = False, verbose = True, eol = '\n')
-
-def download(url, target_path):
- """Download file represented by url to target_path.
- """
- f = urllib2.urlopen(url)
- try:
- data = f.read()
- finally:
- f.close()
- fout = open(target_path, 'wb')
- try:
- fout.write(data)
- finally:
- fout.close()
-
-def check_compile(distcheck_top_dir, platform):
- cmd = [sys.executable, 'scons.py', 'platform=%s' % platform, 'check']
- print('Running:', ' '.join(cmd))
- log_path = os.path.join(distcheck_top_dir, 'build-%s.log' % platform)
- flog = open(log_path, 'wb')
- try:
- process = subprocess.Popen(cmd,
- stdout=flog,
- stderr=subprocess.STDOUT,
- cwd=distcheck_top_dir)
- stdout = process.communicate()[0]
- status = (process.returncode == 0)
- finally:
- flog.close()
- return (status, log_path)
-
-def write_tempfile(content, **kwargs):
- fd, path = tempfile.mkstemp(**kwargs)
- f = os.fdopen(fd, 'wt')
- try:
- f.write(content)
- finally:
- f.close()
- return path
-
-class SFTPError(Exception):
- pass
-
-def run_sftp_batch(userhost, sftp, batch, retry=0):
- path = write_tempfile(batch, suffix='.sftp', text=True)
- # psftp -agent -C blep,jsoncpp@web.sourceforge.net -batch -b batch.sftp -bc
- cmd = [sftp, '-agent', '-C', '-batch', '-b', path, '-bc', userhost]
- error = None
- for retry_index in range(0, max(1,retry)):
- heading = retry_index == 0 and 'Running:' or 'Retrying:'
- print(heading, ' '.join(cmd))
- process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
- stdout = process.communicate()[0]
- if process.returncode != 0:
- error = SFTPError('SFTP batch failed:\n' + stdout)
- else:
- break
- if error:
- raise error
- return stdout
-
-def sourceforge_web_synchro(sourceforge_project, doc_dir,
- user=None, sftp='sftp'):
- """Notes: does not synchronize sub-directory of doc-dir.
- """
- userhost = '%s,%s@web.sourceforge.net' % (user, sourceforge_project)
- stdout = run_sftp_batch(userhost, sftp, """
-cd htdocs
-dir
-exit
-""")
- existing_paths = set()
- collect = 0
- for line in stdout.split('\n'):
- line = line.strip()
- if not collect and line.endswith('> dir'):
- collect = True
- elif collect and line.endswith('> exit'):
- break
- elif collect == 1:
- collect = 2
- elif collect == 2:
- path = line.strip().split()[-1:]
- if path and path[0] not in ('.', '..'):
- existing_paths.add(path[0])
- upload_paths = set([os.path.basename(p) for p in antglob.glob(doc_dir)])
- paths_to_remove = existing_paths - upload_paths
- if paths_to_remove:
- print('Removing the following file from web:')
- print('\n'.join(paths_to_remove))
- stdout = run_sftp_batch(userhost, sftp, """cd htdocs
-rm %s
-exit""" % ' '.join(paths_to_remove))
- print('Uploading %d files:' % len(upload_paths))
- batch_size = 10
- upload_paths = list(upload_paths)
- start_time = time.time()
- for index in range(0,len(upload_paths),batch_size):
- paths = upload_paths[index:index+batch_size]
- file_per_sec = (time.time() - start_time) / (index+1)
- remaining_files = len(upload_paths) - index
- remaining_sec = file_per_sec * remaining_files
- print('%d/%d, ETA=%.1fs' % (index+1, len(upload_paths), remaining_sec))
- run_sftp_batch(userhost, sftp, """cd htdocs
-lcd %s
-mput %s
-exit""" % (doc_dir, ' '.join(paths)), retry=3)
-
-def sourceforge_release_tarball(sourceforge_project, paths, user=None, sftp='sftp'):
- userhost = '%s,%s@frs.sourceforge.net' % (user, sourceforge_project)
- run_sftp_batch(userhost, sftp, """
-mput %s
-exit
-""" % (' '.join(paths),))
-
-
-def main():
- usage = """%prog release_version next_dev_version
-Update 'version' file to release_version and commit.
-Generates the document tarball.
-Tags the sandbox revision with release_version.
-Update 'version' file to next_dev_version and commit.
-
-Performs an svn export of tag release version, and build a source tarball.
-
-Must be started in the project top directory.
-
-Warning: --force should only be used when developping/testing the release script.
-"""
- from optparse import OptionParser
- parser = OptionParser(usage=usage)
- parser.allow_interspersed_args = False
- parser.add_option('--dot', dest="dot_path", action='store', default=doxybuild.find_program('dot'),
- help="""Path to GraphViz dot tool. Must be full qualified path. [Default: %default]""")
- parser.add_option('--doxygen', dest="doxygen_path", action='store', default=doxybuild.find_program('doxygen'),
- help="""Path to Doxygen tool. [Default: %default]""")
- parser.add_option('--force', dest="ignore_pending_commit", action='store_true', default=False,
- help="""Ignore pending commit. [Default: %default]""")
- parser.add_option('--retag', dest="retag_release", action='store_true', default=False,
- help="""Overwrite release existing tag if it exist. [Default: %default]""")
- parser.add_option('-p', '--platforms', dest="platforms", action='store', default='',
- help="""Comma separated list of platform passed to scons for build check.""")
- parser.add_option('--no-test', dest="no_test", action='store_true', default=False,
- help="""Skips build check.""")
- parser.add_option('--no-web', dest="no_web", action='store_true', default=False,
- help="""Do not update web site.""")
- parser.add_option('-u', '--upload-user', dest="user", action='store',
- help="""Sourceforge user for SFTP documentation upload.""")
- parser.add_option('--sftp', dest='sftp', action='store', default=doxybuild.find_program('psftp', 'sftp'),
- help="""Path of the SFTP compatible binary used to upload the documentation.""")
- parser.enable_interspersed_args()
- options, args = parser.parse_args()
-
- if len(args) != 2:
- parser.error('release_version missing on command-line.')
- release_version = args[0]
- next_version = args[1]
-
- if not options.platforms and not options.no_test:
- parser.error('You must specify either --platform or --no-test option.')
-
- if options.ignore_pending_commit:
- msg = ''
- else:
- msg = check_no_pending_commit()
- if not msg:
- print('Setting version to', release_version)
- set_version(release_version)
- svn_commit('Release ' + release_version)
- tag_url = svn_join_url(SVN_TAG_ROOT, release_version)
- if svn_check_if_tag_exist(tag_url):
- if options.retag_release:
- svn_remove_tag(tag_url, 'Overwriting previous tag')
- else:
- print('Aborting, tag %s already exist. Use --retag to overwrite it!' % tag_url)
- sys.exit(1)
- svn_tag_sandbox(tag_url, 'Release ' + release_version)
-
- print('Generated doxygen document...')
-## doc_dirname = r'jsoncpp-api-html-0.5.0'
-## doc_tarball_path = r'e:\prg\vc\Lib\jsoncpp-trunk\dist\jsoncpp-api-html-0.5.0.tar.gz'
- doc_tarball_path, doc_dirname = doxybuild.build_doc(options, make_release=True)
- doc_distcheck_dir = 'dist/doccheck'
- tarball.decompress(doc_tarball_path, doc_distcheck_dir)
- doc_distcheck_top_dir = os.path.join(doc_distcheck_dir, doc_dirname)
-
- export_dir = 'dist/export'
- svn_export(tag_url, export_dir)
- fix_sources_eol(export_dir)
-
- source_dir = 'jsoncpp-src-' + release_version
- source_tarball_path = 'dist/%s.tar.gz' % source_dir
- print('Generating source tarball to', source_tarball_path)
- tarball.make_tarball(source_tarball_path, [export_dir], export_dir, prefix_dir=source_dir)
-
- amalgamation_tarball_path = 'dist/%s-amalgamation.tar.gz' % source_dir
- print('Generating amalgamation source tarball to', amalgamation_tarball_path)
- amalgamation_dir = 'dist/amalgamation'
- amalgamate.amalgamate_source(export_dir, '%s/jsoncpp.cpp' % amalgamation_dir, 'json/json.h')
- amalgamation_source_dir = 'jsoncpp-src-amalgamation' + release_version
- tarball.make_tarball(amalgamation_tarball_path, [amalgamation_dir],
- amalgamation_dir, prefix_dir=amalgamation_source_dir)
-
- # Decompress source tarball, download and install scons-local
- distcheck_dir = 'dist/distcheck'
- distcheck_top_dir = distcheck_dir + '/' + source_dir
- print('Decompressing source tarball to', distcheck_dir)
- rmdir_if_exist(distcheck_dir)
- tarball.decompress(source_tarball_path, distcheck_dir)
- scons_local_path = 'dist/scons-local.tar.gz'
- print('Downloading scons-local to', scons_local_path)
- download(SCONS_LOCAL_URL, scons_local_path)
- print('Decompressing scons-local to', distcheck_top_dir)
- tarball.decompress(scons_local_path, distcheck_top_dir)
-
- # Run compilation
- print('Compiling decompressed tarball')
- all_build_status = True
- for platform in options.platforms.split(','):
- print('Testing platform:', platform)
- build_status, log_path = check_compile(distcheck_top_dir, platform)
- print('see build log:', log_path)
- print(build_status and '=> ok' or '=> FAILED')
- all_build_status = all_build_status and build_status
- if not build_status:
- print('Testing failed on at least one platform, aborting...')
- svn_remove_tag(tag_url, 'Removing tag due to failed testing')
- sys.exit(1)
- if options.user:
- if not options.no_web:
- print('Uploading documentation using user', options.user)
- sourceforge_web_synchro(SOURCEFORGE_PROJECT, doc_distcheck_top_dir, user=options.user, sftp=options.sftp)
- print('Completed documentation upload')
- print('Uploading source and documentation tarballs for release using user', options.user)
- sourceforge_release_tarball(SOURCEFORGE_PROJECT,
- [source_tarball_path, doc_tarball_path],
- user=options.user, sftp=options.sftp)
- print('Source and doc release tarballs uploaded')
- else:
- print('No upload user specified. Web site and download tarbal were not uploaded.')
- print('Tarball can be found at:', doc_tarball_path)
-
- # Set next version number and commit
- set_version(next_version)
- svn_commit('Released ' + release_version)
- else:
- sys.stderr.write(msg + '\n')
-
-if __name__ == '__main__':
- main()
diff --git a/3rdparty/jsoncpp/pkg-config/jsoncpp.pc.in b/3rdparty/jsoncpp/pkg-config/jsoncpp.pc.in
deleted file mode 100644
index 3ca4a84d027..00000000000
--- a/3rdparty/jsoncpp/pkg-config/jsoncpp.pc.in
+++ /dev/null
@@ -1,11 +0,0 @@
-prefix=@CMAKE_INSTALL_PREFIX@
-exec_prefix=${prefix}
-libdir=@LIBRARY_INSTALL_DIR@
-includedir=@INCLUDE_INSTALL_DIR@
-
-Name: jsoncpp
-Description: A C++ library for interacting with JSON
-Version: @JSONCPP_VERSION@
-URL: https://github.com/open-source-parsers/jsoncpp
-Libs: -L${libdir} -ljsoncpp
-Cflags: -I${includedir}
diff --git a/3rdparty/jsoncpp/scons-tools/globtool.py b/3rdparty/jsoncpp/scons-tools/globtool.py
deleted file mode 100644
index 890f1b7b1f4..00000000000
--- a/3rdparty/jsoncpp/scons-tools/globtool.py
+++ /dev/null
@@ -1,58 +0,0 @@
-# Copyright 2009 Baptiste Lepilleur
-# Distributed under MIT license, or public domain if desired and
-# recognized in your jurisdiction.
-# See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
-
-import fnmatch
-import os
-
-def generate(env):
- def Glob(env, includes = None, excludes = None, dir = '.'):
- """Adds Glob(includes = Split('*'), excludes = None, dir = '.')
- helper function to environment.
-
- Glob both the file-system files.
-
- includes: list of file name pattern included in the return list when matched.
- excludes: list of file name pattern exluced from the return list.
-
- Example:
- sources = env.Glob(("*.cpp", '*.h'), "~*.cpp", "#src")
- """
- def filterFilename(path):
- abs_path = os.path.join(dir, path)
- if not os.path.isfile(abs_path):
- return 0
- fn = os.path.basename(path)
- match = 0
- for include in includes:
- if fnmatch.fnmatchcase(fn, include):
- match = 1
- break
- if match == 1 and not excludes is None:
- for exclude in excludes:
- if fnmatch.fnmatchcase(fn, exclude):
- match = 0
- break
- return match
- if includes is None:
- includes = ('*',)
- elif type(includes) in (type(''), type(u'')):
- includes = (includes,)
- if type(excludes) in (type(''), type(u'')):
- excludes = (excludes,)
- dir = env.Dir(dir).abspath
- paths = os.listdir(dir)
- def makeAbsFileNode(path):
- return env.File(os.path.join(dir, path))
- nodes = filter(filterFilename, paths)
- return map(makeAbsFileNode, nodes)
-
- from SCons.Script import Environment
- Environment.Glob = Glob
-
-def exists(env):
- """
- Tool always exists.
- """
- return True
diff --git a/3rdparty/jsoncpp/scons-tools/srcdist.py b/3rdparty/jsoncpp/scons-tools/srcdist.py
deleted file mode 100644
index fe1d74695a2..00000000000
--- a/3rdparty/jsoncpp/scons-tools/srcdist.py
+++ /dev/null
@@ -1,183 +0,0 @@
-# Copyright 2007 Baptiste Lepilleur
-# Distributed under MIT license, or public domain if desired and
-# recognized in your jurisdiction.
-# See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
-
-import os
-import os.path
-from fnmatch import fnmatch
-import targz
-
-##def DoxyfileParse(file_contents):
-## """
-## Parse a Doxygen source file and return a dictionary of all the values.
-## Values will be strings and lists of strings.
-## """
-## data = {}
-##
-## import shlex
-## lex = shlex.shlex(instream = file_contents, posix = True)
-## lex.wordchars += "*+./-:"
-## lex.whitespace = lex.whitespace.replace("\n", "")
-## lex.escape = ""
-##
-## lineno = lex.lineno
-## last_backslash_lineno = lineno
-## token = lex.get_token()
-## key = token # the first token should be a key
-## last_token = ""
-## key_token = False
-## next_key = False
-## new_data = True
-##
-## def append_data(data, key, new_data, token):
-## if new_data or len(data[key]) == 0:
-## data[key].append(token)
-## else:
-## data[key][-1] += token
-##
-## while token:
-## if token in ['\n']:
-## if last_token not in ['\\']:
-## key_token = True
-## elif token in ['\\']:
-## pass
-## elif key_token:
-## key = token
-## key_token = False
-## else:
-## if token == "+=":
-## if not data.has_key(key):
-## data[key] = list()
-## elif token == "=":
-## data[key] = list()
-## else:
-## append_data(data, key, new_data, token)
-## new_data = True
-##
-## last_token = token
-## token = lex.get_token()
-##
-## if last_token == '\\' and token != '\n':
-## new_data = False
-## append_data(data, key, new_data, '\\')
-##
-## # compress lists of len 1 into single strings
-## for (k, v) in data.items():
-## if len(v) == 0:
-## data.pop(k)
-##
-## # items in the following list will be kept as lists and not converted to strings
-## if k in ["INPUT", "FILE_PATTERNS", "EXCLUDE_PATTERNS"]:
-## continue
-##
-## if len(v) == 1:
-## data[k] = v[0]
-##
-## return data
-##
-##def DoxySourceScan(node, env, path):
-## """
-## Doxygen Doxyfile source scanner. This should scan the Doxygen file and add
-## any files used to generate docs to the list of source files.
-## """
-## default_file_patterns = [
-## '*.c', '*.cc', '*.cxx', '*.cpp', '*.c++', '*.java', '*.ii', '*.ixx',
-## '*.ipp', '*.i++', '*.inl', '*.h', '*.hh ', '*.hxx', '*.hpp', '*.h++',
-## '*.idl', '*.odl', '*.cs', '*.php', '*.php3', '*.inc', '*.m', '*.mm',
-## '*.py',
-## ]
-##
-## default_exclude_patterns = [
-## '*~',
-## ]
-##
-## sources = []
-##
-## data = DoxyfileParse(node.get_contents())
-##
-## if data.get("RECURSIVE", "NO") == "YES":
-## recursive = True
-## else:
-## recursive = False
-##
-## file_patterns = data.get("FILE_PATTERNS", default_file_patterns)
-## exclude_patterns = data.get("EXCLUDE_PATTERNS", default_exclude_patterns)
-##
-## for node in data.get("INPUT", []):
-## if os.path.isfile(node):
-## sources.add(node)
-## elif os.path.isdir(node):
-## if recursive:
-## for root, dirs, files in os.walk(node):
-## for f in files:
-## filename = os.path.join(root, f)
-##
-## pattern_check = reduce(lambda x, y: x or bool(fnmatch(filename, y)), file_patterns, False)
-## exclude_check = reduce(lambda x, y: x and fnmatch(filename, y), exclude_patterns, True)
-##
-## if pattern_check and not exclude_check:
-## sources.append(filename)
-## else:
-## for pattern in file_patterns:
-## sources.extend(glob.glob("/".join([node, pattern])))
-## sources = map(lambda path: env.File(path), sources)
-## return sources
-##
-##
-##def DoxySourceScanCheck(node, env):
-## """Check if we should scan this file"""
-## return os.path.isfile(node.path)
-
-def srcDistEmitter(source, target, env):
-## """Doxygen Doxyfile emitter"""
-## # possible output formats and their default values and output locations
-## output_formats = {
-## "HTML": ("YES", "html"),
-## "LATEX": ("YES", "latex"),
-## "RTF": ("NO", "rtf"),
-## "MAN": ("YES", "man"),
-## "XML": ("NO", "xml"),
-## }
-##
-## data = DoxyfileParse(source[0].get_contents())
-##
-## targets = []
-## out_dir = data.get("OUTPUT_DIRECTORY", ".")
-##
-## # add our output locations
-## for (k, v) in output_formats.items():
-## if data.get("GENERATE_" + k, v[0]) == "YES":
-## targets.append(env.Dir(os.path.join(out_dir, data.get(k + "_OUTPUT", v[1]))))
-##
-## # don't clobber targets
-## for node in targets:
-## env.Precious(node)
-##
-## # set up cleaning stuff
-## for node in targets:
-## env.Clean(node, node)
-##
-## return (targets, source)
- return (target,source)
-
-def generate(env):
- """
- Add builders and construction variables for the
- SrcDist tool.
- """
-## doxyfile_scanner = env.Scanner(## DoxySourceScan,
-## "DoxySourceScan",
-## scan_check = DoxySourceScanCheck,
-##)
-
- if targz.exists(env):
- srcdist_builder = targz.makeBuilder(srcDistEmitter)
-
- env['BUILDERS']['SrcDist'] = srcdist_builder
-
-def exists(env):
- """
- Make sure srcdist exists.
- """
- return targz.exists(env)
diff --git a/3rdparty/jsoncpp/scons-tools/substinfile.py b/3rdparty/jsoncpp/scons-tools/substinfile.py
deleted file mode 100644
index c620442d572..00000000000
--- a/3rdparty/jsoncpp/scons-tools/substinfile.py
+++ /dev/null
@@ -1,85 +0,0 @@
-# Copyright 2010 Baptiste Lepilleur
-# Distributed under MIT license, or public domain if desired and
-# recognized in your jurisdiction.
-# See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
-
-import re
-from SCons.Script import * # the usual scons stuff you get in a SConscript
-import collections
-
-def generate(env):
- """
- Add builders and construction variables for the
- SubstInFile tool.
-
- Adds SubstInFile builder, which substitutes the keys->values of SUBST_DICT
- from the source to the target.
- The values of SUBST_DICT first have any construction variables expanded
- (its keys are not expanded).
- If a value of SUBST_DICT is a python callable function, it is called and
- the result is expanded as the value.
- If there's more than one source and more than one target, each target gets
- substituted from the corresponding source.
- """
- def do_subst_in_file(targetfile, sourcefile, dict):
- """Replace all instances of the keys of dict with their values.
- For example, if dict is {'%VERSION%': '1.2345', '%BASE%': 'MyProg'},
- then all instances of %VERSION% in the file will be replaced with 1.2345 etc.
- """
- try:
- f = open(sourcefile, 'rb')
- contents = f.read()
- f.close()
- except:
- raise SCons.Errors.UserError("Can't read source file %s"%sourcefile)
- for (k,v) in list(dict.items()):
- contents = re.sub(k, v, contents)
- try:
- f = open(targetfile, 'wb')
- f.write(contents)
- f.close()
- except:
- raise SCons.Errors.UserError("Can't write target file %s"%targetfile)
- return 0 # success
-
- def subst_in_file(target, source, env):
- if 'SUBST_DICT' not in env:
- raise SCons.Errors.UserError("SubstInFile requires SUBST_DICT to be set.")
- d = dict(env['SUBST_DICT']) # copy it
- for (k,v) in list(d.items()):
- if isinstance(v, collections.Callable):
- d[k] = env.subst(v()).replace('\\','\\\\')
- elif SCons.Util.is_String(v):
- d[k] = env.subst(v).replace('\\','\\\\')
- else:
- raise SCons.Errors.UserError("SubstInFile: key %s: %s must be a string or callable"%(k, repr(v)))
- for (t,s) in zip(target, source):
- return do_subst_in_file(str(t), str(s), d)
-
- def subst_in_file_string(target, source, env):
- """This is what gets printed on the console."""
- return '\n'.join(['Substituting vars from %s into %s'%(str(s), str(t))
- for (t,s) in zip(target, source)])
-
- def subst_emitter(target, source, env):
- """Add dependency from substituted SUBST_DICT to target.
- Returns original target, source tuple unchanged.
- """
- d = env['SUBST_DICT'].copy() # copy it
- for (k,v) in list(d.items()):
- if isinstance(v, collections.Callable):
- d[k] = env.subst(v())
- elif SCons.Util.is_String(v):
- d[k]=env.subst(v)
- Depends(target, SCons.Node.Python.Value(d))
- return target, source
-
-## env.Append(TOOLS = 'substinfile') # this should be automaticaly done by Scons ?!?
- subst_action = SCons.Action.Action(subst_in_file, subst_in_file_string)
- env['BUILDERS']['SubstInFile'] = Builder(action=subst_action, emitter=subst_emitter)
-
-def exists(env):
- """
- Make sure tool exists.
- """
- return True
diff --git a/3rdparty/jsoncpp/scons-tools/targz.py b/3rdparty/jsoncpp/scons-tools/targz.py
deleted file mode 100644
index 8e5ba83003b..00000000000
--- a/3rdparty/jsoncpp/scons-tools/targz.py
+++ /dev/null
@@ -1,87 +0,0 @@
-# Copyright 2007 Baptiste Lepilleur
-# Distributed under MIT license, or public domain if desired and
-# recognized in your jurisdiction.
-# See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
-
-"""tarball
-
-Tool-specific initialization for tarball.
-
-"""
-
-## Commands to tackle a command based implementation:
-##to unpack on the fly...
-##gunzip < FILE.tar.gz | tar xvf -
-##to pack on the fly...
-##tar cvf - FILE-LIST | gzip -c > FILE.tar.gz
-
-import os.path
-
-import SCons.Builder
-import SCons.Node.FS
-import SCons.Util
-
-try:
- import gzip
- import tarfile
- internal_targz = 1
-except ImportError:
- internal_targz = 0
-
-TARGZ_DEFAULT_COMPRESSION_LEVEL = 9
-
-if internal_targz:
- def targz(target, source, env):
- def archive_name(path):
- path = os.path.normpath(os.path.abspath(path))
- common_path = os.path.commonprefix((base_dir, path))
- archive_name = path[len(common_path):]
- return archive_name
-
- def visit(tar, dirname, names):
- for name in names:
- path = os.path.join(dirname, name)
- if os.path.isfile(path):
- tar.add(path, archive_name(path))
- compression = env.get('TARGZ_COMPRESSION_LEVEL',TARGZ_DEFAULT_COMPRESSION_LEVEL)
- base_dir = os.path.normpath(env.get('TARGZ_BASEDIR', env.Dir('.')).abspath)
- target_path = str(target[0])
- fileobj = gzip.GzipFile(target_path, 'wb', compression)
- tar = tarfile.TarFile(os.path.splitext(target_path)[0], 'w', fileobj)
- for source in source:
- source_path = str(source)
- if source.isdir():
- os.path.walk(source_path, visit, tar)
- else:
- tar.add(source_path, archive_name(source_path)) # filename, arcname
- tar.close()
-
- targzAction = SCons.Action.Action(targz, varlist=['TARGZ_COMPRESSION_LEVEL','TARGZ_BASEDIR'])
-
- def makeBuilder(emitter = None):
- return SCons.Builder.Builder(action = SCons.Action.Action('$TARGZ_COM', '$TARGZ_COMSTR'),
- source_factory = SCons.Node.FS.Entry,
- source_scanner = SCons.Defaults.DirScanner,
- suffix = '$TARGZ_SUFFIX',
- multi = 1)
- TarGzBuilder = makeBuilder()
-
- def generate(env):
- """Add Builders and construction variables for zip to an Environment.
- The following environnement variables may be set:
- TARGZ_COMPRESSION_LEVEL: integer, [0-9]. 0: no compression, 9: best compression (same as gzip compression level).
- TARGZ_BASEDIR: base-directory used to determine archive name (this allow archive name to be relative
- to something other than top-dir).
- """
- env['BUILDERS']['TarGz'] = TarGzBuilder
- env['TARGZ_COM'] = targzAction
- env['TARGZ_COMPRESSION_LEVEL'] = TARGZ_DEFAULT_COMPRESSION_LEVEL # range 0-9
- env['TARGZ_SUFFIX'] = '.tar.gz'
- env['TARGZ_BASEDIR'] = env.Dir('.') # Sources archive name are made relative to that directory.
-else:
- def generate(env):
- pass
-
-
-def exists(env):
- return internal_targz
diff --git a/3rdparty/jsoncpp/src/CMakeLists.txt b/3rdparty/jsoncpp/src/CMakeLists.txt
deleted file mode 100644
index 608d3f7b67d..00000000000
--- a/3rdparty/jsoncpp/src/CMakeLists.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-ADD_SUBDIRECTORY(lib_json)
-IF(JSONCPP_WITH_TESTS)
- ADD_SUBDIRECTORY(jsontestrunner)
- ADD_SUBDIRECTORY(test_lib_json)
-ENDIF(JSONCPP_WITH_TESTS)
diff --git a/3rdparty/jsoncpp/src/jsontestrunner/CMakeLists.txt b/3rdparty/jsoncpp/src/jsontestrunner/CMakeLists.txt
deleted file mode 100644
index 820a7cd3524..00000000000
--- a/3rdparty/jsoncpp/src/jsontestrunner/CMakeLists.txt
+++ /dev/null
@@ -1,25 +0,0 @@
-FIND_PACKAGE(PythonInterp 2.6)
-
-ADD_EXECUTABLE(jsontestrunner_exe
- main.cpp
- )
-
-IF(BUILD_SHARED_LIBS)
- ADD_DEFINITIONS( -DJSON_DLL )
- TARGET_LINK_LIBRARIES(jsontestrunner_exe jsoncpp_lib)
-ELSE(BUILD_SHARED_LIBS)
- TARGET_LINK_LIBRARIES(jsontestrunner_exe jsoncpp_lib_static)
-ENDIF(BUILD_SHARED_LIBS)
-
-SET_TARGET_PROPERTIES(jsontestrunner_exe PROPERTIES OUTPUT_NAME jsontestrunner_exe)
-
-IF(PYTHONINTERP_FOUND)
- # Run end to end parser/writer tests
- SET(TEST_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../test)
- SET(RUNJSONTESTS_PATH ${TEST_DIR}/runjsontests.py)
- ADD_CUSTOM_TARGET(jsoncpp_readerwriter_tests
- "${PYTHON_EXECUTABLE}" -B "${RUNJSONTESTS_PATH}" $<TARGET_FILE:jsontestrunner_exe> "${TEST_DIR}/data"
- DEPENDS jsontestrunner_exe jsoncpp_test
- )
- ADD_CUSTOM_TARGET(jsoncpp_check DEPENDS jsoncpp_readerwriter_tests)
-ENDIF(PYTHONINTERP_FOUND)
diff --git a/3rdparty/jsoncpp/src/jsontestrunner/main.cpp b/3rdparty/jsoncpp/src/jsontestrunner/main.cpp
deleted file mode 100644
index 1ec1fb6fbcd..00000000000
--- a/3rdparty/jsoncpp/src/jsontestrunner/main.cpp
+++ /dev/null
@@ -1,325 +0,0 @@
-// Copyright 2007-2010 Baptiste Lepilleur
-// Distributed under MIT license, or public domain if desired and
-// recognized in your jurisdiction.
-// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
-
-/* This executable is used for testing parser/writer using real JSON files.
- */
-
-#include <json/json.h>
-#include <algorithm> // sort
-#include <sstream>
-#include <stdio.h>
-
-#if defined(_MSC_VER) && _MSC_VER >= 1310
-#pragma warning(disable : 4996) // disable fopen deprecation warning
-#endif
-
-struct Options
-{
- std::string path;
- Json::Features features;
- bool parseOnly;
- typedef std::string (*writeFuncType)(Json::Value const&);
- writeFuncType write;
-};
-
-static std::string normalizeFloatingPointStr(double value) {
- char buffer[32];
-#if defined(_MSC_VER) && defined(__STDC_SECURE_LIB__)
- sprintf_s(buffer, sizeof(buffer), "%.16g", value);
-#else
- snprintf(buffer, sizeof(buffer), "%.16g", value);
-#endif
- buffer[sizeof(buffer) - 1] = 0;
- std::string s(buffer);
- std::string::size_type index = s.find_last_of("eE");
- if (index != std::string::npos) {
- std::string::size_type hasSign =
- (s[index + 1] == '+' || s[index + 1] == '-') ? 1 : 0;
- std::string::size_type exponentStartIndex = index + 1 + hasSign;
- std::string normalized = s.substr(0, exponentStartIndex);
- std::string::size_type indexDigit =
- s.find_first_not_of('0', exponentStartIndex);
- std::string exponent = "0";
- if (indexDigit !=
- std::string::npos) // There is an exponent different from 0
- {
- exponent = s.substr(indexDigit);
- }
- return normalized + exponent;
- }
- return s;
-}
-
-static std::string readInputTestFile(const char* path) {
- FILE* file = fopen(path, "rb");
- if (!file)
- return std::string("");
- fseek(file, 0, SEEK_END);
- long size = ftell(file);
- fseek(file, 0, SEEK_SET);
- std::string text;
- char* buffer = new char[size + 1];
- buffer[size] = 0;
- if (fread(buffer, 1, size, file) == (unsigned long)size)
- text = buffer;
- fclose(file);
- delete[] buffer;
- return text;
-}
-
-static void
-printValueTree(FILE* fout, Json::Value& value, const std::string& path = ".") {
- if (value.hasComment(Json::commentBefore)) {
- fprintf(fout, "%s\n", value.getComment(Json::commentBefore).c_str());
- }
- switch (value.type()) {
- case Json::nullValue:
- fprintf(fout, "%s=null\n", path.c_str());
- break;
- case Json::intValue:
- fprintf(fout,
- "%s=%s\n",
- path.c_str(),
- Json::valueToString(value.asLargestInt()).c_str());
- break;
- case Json::uintValue:
- fprintf(fout,
- "%s=%s\n",
- path.c_str(),
- Json::valueToString(value.asLargestUInt()).c_str());
- break;
- case Json::realValue:
- fprintf(fout,
- "%s=%s\n",
- path.c_str(),
- normalizeFloatingPointStr(value.asDouble()).c_str());
- break;
- case Json::stringValue:
- fprintf(fout, "%s=\"%s\"\n", path.c_str(), value.asString().c_str());
- break;
- case Json::booleanValue:
- fprintf(fout, "%s=%s\n", path.c_str(), value.asBool() ? "true" : "false");
- break;
- case Json::arrayValue: {
- fprintf(fout, "%s=[]\n", path.c_str());
- int size = value.size();
- for (int index = 0; index < size; ++index) {
- static char buffer[16];
-#if defined(_MSC_VER) && defined(__STDC_SECURE_LIB__)
- sprintf_s(buffer, sizeof(buffer), "[%d]", index);
-#else
- snprintf(buffer, sizeof(buffer), "[%d]", index);
-#endif
- printValueTree(fout, value[index], path + buffer);
- }
- } break;
- case Json::objectValue: {
- fprintf(fout, "%s={}\n", path.c_str());
- Json::Value::Members members(value.getMemberNames());
- std::sort(members.begin(), members.end());
- std::string suffix = *(path.end() - 1) == '.' ? "" : ".";
- for (Json::Value::Members::iterator it = members.begin();
- it != members.end();
- ++it) {
- const std::string& name = *it;
- printValueTree(fout, value[name], path + suffix + name);
- }
- } break;
- default:
- break;
- }
-
- if (value.hasComment(Json::commentAfter)) {
- fprintf(fout, "%s\n", value.getComment(Json::commentAfter).c_str());
- }
-}
-
-static int parseAndSaveValueTree(const std::string& input,
- const std::string& actual,
- const std::string& kind,
- const Json::Features& features,
- bool parseOnly,
- Json::Value* root)
-{
- Json::Reader reader(features);
- bool parsingSuccessful = reader.parse(input, *root);
- if (!parsingSuccessful) {
- printf("Failed to parse %s file: \n%s\n",
- kind.c_str(),
- reader.getFormattedErrorMessages().c_str());
- return 1;
- }
- if (!parseOnly) {
- FILE* factual = fopen(actual.c_str(), "wt");
- if (!factual) {
- printf("Failed to create %s actual file.\n", kind.c_str());
- return 2;
- }
- printValueTree(factual, *root);
- fclose(factual);
- }
- return 0;
-}
-// static std::string useFastWriter(Json::Value const& root) {
-// Json::FastWriter writer;
-// writer.enableYAMLCompatibility();
-// return writer.write(root);
-// }
-static std::string useStyledWriter(
- Json::Value const& root)
-{
- Json::StyledWriter writer;
- return writer.write(root);
-}
-static std::string useStyledStreamWriter(
- Json::Value const& root)
-{
- Json::StyledStreamWriter writer;
- std::ostringstream sout;
- writer.write(sout, root);
- return sout.str();
-}
-static std::string useBuiltStyledStreamWriter(
- Json::Value const& root)
-{
- Json::StreamWriterBuilder builder;
- return Json::writeString(builder, root);
-}
-static int rewriteValueTree(
- const std::string& rewritePath,
- const Json::Value& root,
- Options::writeFuncType write,
- std::string* rewrite)
-{
- *rewrite = write(root);
- FILE* fout = fopen(rewritePath.c_str(), "wt");
- if (!fout) {
- printf("Failed to create rewrite file: %s\n", rewritePath.c_str());
- return 2;
- }
- fprintf(fout, "%s\n", rewrite->c_str());
- fclose(fout);
- return 0;
-}
-
-static std::string removeSuffix(const std::string& path,
- const std::string& extension) {
- if (extension.length() >= path.length())
- return std::string("");
- std::string suffix = path.substr(path.length() - extension.length());
- if (suffix != extension)
- return std::string("");
- return path.substr(0, path.length() - extension.length());
-}
-
-static void printConfig() {
-// Print the configuration used to compile JsonCpp
-#if defined(JSON_NO_INT64)
- printf("JSON_NO_INT64=1\n");
-#else
- printf("JSON_NO_INT64=0\n");
-#endif
-}
-
-static int printUsage(const char* argv[]) {
- printf("Usage: %s [--strict] input-json-file", argv[0]);
- return 3;
-}
-
-static int parseCommandLine(
- int argc, const char* argv[], Options* opts)
-{
- opts->parseOnly = false;
- opts->write = &useStyledWriter;
- if (argc < 2) {
- return printUsage(argv);
- }
- int index = 1;
- if (std::string(argv[index]) == "--json-checker") {
- opts->features = Json::Features::strictMode();
- opts->parseOnly = true;
- ++index;
- }
- if (std::string(argv[index]) == "--json-config") {
- printConfig();
- return 3;
- }
- if (std::string(argv[index]) == "--json-writer") {
- ++index;
- std::string const writerName(argv[index++]);
- if (writerName == "StyledWriter") {
- opts->write = &useStyledWriter;
- } else if (writerName == "StyledStreamWriter") {
- opts->write = &useStyledStreamWriter;
- } else if (writerName == "BuiltStyledStreamWriter") {
- opts->write = &useBuiltStyledStreamWriter;
- } else {
- printf("Unknown '--json-writer %s'\n", writerName.c_str());
- return 4;
- }
- }
- if (index == argc || index + 1 < argc) {
- return printUsage(argv);
- }
- opts->path = argv[index];
- return 0;
-}
-static int runTest(Options const& opts)
-{
- int exitCode = 0;
-
- std::string input = readInputTestFile(opts.path.c_str());
- if (input.empty()) {
- printf("Failed to read input or empty input: %s\n", opts.path.c_str());
- return 3;
- }
-
- std::string basePath = removeSuffix(opts.path, ".json");
- if (!opts.parseOnly && basePath.empty()) {
- printf("Bad input path. Path does not end with '.expected':\n%s\n",
- opts.path.c_str());
- return 3;
- }
-
- std::string const actualPath = basePath + ".actual";
- std::string const rewritePath = basePath + ".rewrite";
- std::string const rewriteActualPath = basePath + ".actual-rewrite";
-
- Json::Value root;
- exitCode = parseAndSaveValueTree(
- input, actualPath, "input",
- opts.features, opts.parseOnly, &root);
- if (exitCode || opts.parseOnly) {
- return exitCode;
- }
- std::string rewrite;
- exitCode = rewriteValueTree(rewritePath, root, opts.write, &rewrite);
- if (exitCode) {
- return exitCode;
- }
- Json::Value rewriteRoot;
- exitCode = parseAndSaveValueTree(
- rewrite, rewriteActualPath, "rewrite",
- opts.features, opts.parseOnly, &rewriteRoot);
- if (exitCode) {
- return exitCode;
- }
- return 0;
-}
-int main(int argc, const char* argv[]) {
- Options opts;
- int exitCode = parseCommandLine(argc, argv, &opts);
- if (exitCode != 0) {
- printf("Failed to parse command-line.");
- return exitCode;
- }
- try {
- return runTest(opts);
- }
- catch (const std::exception& e) {
- printf("Unhandled exception:\n%s\n", e.what());
- return 1;
- }
-}
diff --git a/3rdparty/jsoncpp/src/jsontestrunner/sconscript b/3rdparty/jsoncpp/src/jsontestrunner/sconscript
deleted file mode 100644
index 6e68e31533e..00000000000
--- a/3rdparty/jsoncpp/src/jsontestrunner/sconscript
+++ /dev/null
@@ -1,9 +0,0 @@
-Import( 'env_testing buildJSONTests' )
-
-buildJSONTests( env_testing, Split( """
- main.cpp
- """ ),
- 'jsontestrunner' )
-
-# For 'check' to work, 'libs' must be built first.
-env_testing.Depends('jsontestrunner', '#libs')
diff --git a/3rdparty/jsoncpp/src/lib_json/CMakeLists.txt b/3rdparty/jsoncpp/src/lib_json/CMakeLists.txt
deleted file mode 100644
index 79ffa2ec5fe..00000000000
--- a/3rdparty/jsoncpp/src/lib_json/CMakeLists.txt
+++ /dev/null
@@ -1,80 +0,0 @@
-if( CMAKE_COMPILER_IS_GNUCXX )
- #Get compiler version.
- execute_process( COMMAND ${CMAKE_CXX_COMPILER} -dumpversion
- OUTPUT_VARIABLE GNUCXX_VERSION )
-
- #-Werror=* was introduced -after- GCC 4.1.2
- if( GNUCXX_VERSION VERSION_GREATER 4.1.2 )
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror=strict-aliasing")
- endif()
-endif( CMAKE_COMPILER_IS_GNUCXX )
-
-SET( JSONCPP_INCLUDE_DIR ../../include )
-
-SET( PUBLIC_HEADERS
- ${JSONCPP_INCLUDE_DIR}/json/config.h
- ${JSONCPP_INCLUDE_DIR}/json/forwards.h
- ${JSONCPP_INCLUDE_DIR}/json/features.h
- ${JSONCPP_INCLUDE_DIR}/json/value.h
- ${JSONCPP_INCLUDE_DIR}/json/reader.h
- ${JSONCPP_INCLUDE_DIR}/json/writer.h
- ${JSONCPP_INCLUDE_DIR}/json/assertions.h
- ${JSONCPP_INCLUDE_DIR}/json/version.h
- )
-
-SOURCE_GROUP( "Public API" FILES ${PUBLIC_HEADERS} )
-
-SET(jsoncpp_sources
- json_tool.h
- json_reader.cpp
- json_valueiterator.inl
- json_value.cpp
- json_writer.cpp
- version.h.in)
-
-# Install instructions for this target
-IF(JSONCPP_WITH_CMAKE_PACKAGE)
- SET(INSTALL_EXPORT EXPORT jsoncpp)
-ELSE(JSONCPP_WITH_CMAKE_PACKAGE)
- SET(INSTALL_EXPORT)
-ENDIF(JSONCPP_WITH_CMAKE_PACKAGE)
-
-IF(BUILD_SHARED_LIBS)
- ADD_DEFINITIONS( -DJSON_DLL_BUILD )
- ADD_LIBRARY(jsoncpp_lib SHARED ${PUBLIC_HEADERS} ${jsoncpp_sources})
- SET_TARGET_PROPERTIES( jsoncpp_lib PROPERTIES VERSION ${JSONCPP_VERSION} SOVERSION ${JSONCPP_VERSION_MAJOR})
- SET_TARGET_PROPERTIES( jsoncpp_lib PROPERTIES OUTPUT_NAME jsoncpp
- DEBUG_OUTPUT_NAME jsoncpp${DEBUG_LIBNAME_SUFFIX} )
-
- INSTALL( TARGETS jsoncpp_lib ${INSTALL_EXPORT}
- RUNTIME DESTINATION ${RUNTIME_INSTALL_DIR}
- LIBRARY DESTINATION ${LIBRARY_INSTALL_DIR}
- ARCHIVE DESTINATION ${ARCHIVE_INSTALL_DIR})
-
- IF(NOT CMAKE_VERSION VERSION_LESS 2.8.11)
- TARGET_INCLUDE_DIRECTORIES( jsoncpp_lib PUBLIC
- $<INSTALL_INTERFACE:${INCLUDE_INSTALL_DIR}>
- $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/${JSONCPP_INCLUDE_DIR}>)
- ENDIF(NOT CMAKE_VERSION VERSION_LESS 2.8.11)
-
-ENDIF()
-
-IF(BUILD_STATIC_LIBS)
- ADD_LIBRARY(jsoncpp_lib_static STATIC ${PUBLIC_HEADERS} ${jsoncpp_sources})
- SET_TARGET_PROPERTIES( jsoncpp_lib_static PROPERTIES VERSION ${JSONCPP_VERSION} SOVERSION ${JSONCPP_VERSION_MAJOR})
- SET_TARGET_PROPERTIES( jsoncpp_lib_static PROPERTIES OUTPUT_NAME jsoncpp
- DEBUG_OUTPUT_NAME jsoncpp${DEBUG_LIBNAME_SUFFIX} )
-
- INSTALL( TARGETS jsoncpp_lib_static ${INSTALL_EXPORT}
- RUNTIME DESTINATION ${RUNTIME_INSTALL_DIR}
- LIBRARY DESTINATION ${LIBRARY_INSTALL_DIR}
- ARCHIVE DESTINATION ${ARCHIVE_INSTALL_DIR})
-
- IF(NOT CMAKE_VERSION VERSION_LESS 2.8.11)
- TARGET_INCLUDE_DIRECTORIES( jsoncpp_lib_static PUBLIC
- $<INSTALL_INTERFACE:${INCLUDE_INSTALL_DIR}>
- $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/${JSONCPP_INCLUDE_DIR}>
- )
- ENDIF(NOT CMAKE_VERSION VERSION_LESS 2.8.11)
-
-ENDIF()
diff --git a/3rdparty/jsoncpp/src/lib_json/json_reader.cpp b/3rdparty/jsoncpp/src/lib_json/json_reader.cpp
deleted file mode 100644
index ceff66c3134..00000000000
--- a/3rdparty/jsoncpp/src/lib_json/json_reader.cpp
+++ /dev/null
@@ -1,1977 +0,0 @@
-// Copyright 2007-2011 Baptiste Lepilleur
-// Distributed under MIT license, or public domain if desired and
-// recognized in your jurisdiction.
-// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
-
-#if !defined(JSON_IS_AMALGAMATION)
-#include <json/assertions.h>
-#include <json/reader.h>
-#include <json/value.h>
-#include "json_tool.h"
-#endif // if !defined(JSON_IS_AMALGAMATION)
-#include <utility>
-#include <cstdio>
-#include <cassert>
-#include <cstring>
-#include <istream>
-#include <sstream>
-#include <memory>
-#include <set>
-
-#if defined(_MSC_VER) && _MSC_VER < 1500 // VC++ 8.0 and below
-#define snprintf _snprintf
-#endif
-
-#if defined(_MSC_VER) && _MSC_VER >= 1400 // VC++ 8.0
-// Disable warning about strdup being deprecated.
-#pragma warning(disable : 4996)
-#endif
-
-static int const stackLimit_g = 1000;
-static int stackDepth_g = 0; // see readValue()
-
-namespace Json {
-
-#if __cplusplus >= 201103L
-typedef std::unique_ptr<CharReader> CharReaderPtr;
-#else
-typedef std::auto_ptr<CharReader> CharReaderPtr;
-#endif
-
-// Implementation of class Features
-// ////////////////////////////////
-
-Features::Features()
- : allowComments_(true), strictRoot_(false),
- allowDroppedNullPlaceholders_(false), allowNumericKeys_(false) {}
-
-Features Features::all() { return Features(); }
-
-Features Features::strictMode() {
- Features features;
- features.allowComments_ = false;
- features.strictRoot_ = true;
- features.allowDroppedNullPlaceholders_ = false;
- features.allowNumericKeys_ = false;
- return features;
-}
-
-// Implementation of class Reader
-// ////////////////////////////////
-
-static bool containsNewLine(Reader::Location begin, Reader::Location end) {
- for (; begin < end; ++begin)
- if (*begin == '\n' || *begin == '\r')
- return true;
- return false;
-}
-
-// Class Reader
-// //////////////////////////////////////////////////////////////////
-
-Reader::Reader()
- : errors_(), document_(), begin_(), end_(), current_(), lastValueEnd_(),
- lastValue_(), commentsBefore_(), features_(Features::all()),
- collectComments_() {}
-
-Reader::Reader(const Features& features)
- : errors_(), document_(), begin_(), end_(), current_(), lastValueEnd_(),
- lastValue_(), commentsBefore_(), features_(features), collectComments_() {
-}
-
-bool
-Reader::parse(const std::string& document, Value& root, bool collectComments) {
- document_ = document;
- const char* begin = document_.c_str();
- const char* end = begin + document_.length();
- return parse(begin, end, root, collectComments);
-}
-
-bool Reader::parse(std::istream& sin, Value& root, bool collectComments) {
- // std::istream_iterator<char> begin(sin);
- // std::istream_iterator<char> end;
- // Those would allow streamed input from a file, if parse() were a
- // template function.
-
- // Since std::string is reference-counted, this at least does not
- // create an extra copy.
- std::string doc;
- std::getline(sin, doc, (char)EOF);
- return parse(doc, root, collectComments);
-}
-
-bool Reader::parse(const char* beginDoc,
- const char* endDoc,
- Value& root,
- bool collectComments) {
- if (!features_.allowComments_) {
- collectComments = false;
- }
-
- begin_ = beginDoc;
- end_ = endDoc;
- collectComments_ = collectComments;
- current_ = begin_;
- lastValueEnd_ = 0;
- lastValue_ = 0;
- commentsBefore_ = "";
- errors_.clear();
- while (!nodes_.empty())
- nodes_.pop();
- nodes_.push(&root);
-
- stackDepth_g = 0; // Yes, this is bad coding, but options are limited.
- bool successful = readValue();
- Token token;
- skipCommentTokens(token);
- if (collectComments_ && !commentsBefore_.empty())
- root.setComment(commentsBefore_, commentAfter);
- if (features_.strictRoot_) {
- if (!root.isArray() && !root.isObject()) {
- // Set error location to start of doc, ideally should be first token found
- // in doc
- token.type_ = tokenError;
- token.start_ = beginDoc;
- token.end_ = endDoc;
- addError(
- "A valid JSON document must be either an array or an object value.",
- token);
- return false;
- }
- }
- return successful;
-}
-
-bool Reader::readValue() {
- // This is a non-reentrant way to support a stackLimit. Terrible!
- // But this deprecated class has a security problem: Bad input can
- // cause a seg-fault. This seems like a fair, binary-compatible way
- // to prevent the problem.
- if (stackDepth_g >= stackLimit_g) throwRuntimeError("Exceeded stackLimit in readValue().");
- ++stackDepth_g;
-
- Token token;
- skipCommentTokens(token);
- bool successful = true;
-
- if (collectComments_ && !commentsBefore_.empty()) {
- currentValue().setComment(commentsBefore_, commentBefore);
- commentsBefore_ = "";
- }
-
- switch (token.type_) {
- case tokenObjectBegin:
- successful = readObject(token);
- currentValue().setOffsetLimit(current_ - begin_);
- break;
- case tokenArrayBegin:
- successful = readArray(token);
- currentValue().setOffsetLimit(current_ - begin_);
- break;
- case tokenNumber:
- successful = decodeNumber(token);
- break;
- case tokenString:
- successful = decodeString(token);
- break;
- case tokenTrue:
- {
- Value v(true);
- currentValue().swapPayload(v);
- currentValue().setOffsetStart(token.start_ - begin_);
- currentValue().setOffsetLimit(token.end_ - begin_);
- }
- break;
- case tokenFalse:
- {
- Value v(false);
- currentValue().swapPayload(v);
- currentValue().setOffsetStart(token.start_ - begin_);
- currentValue().setOffsetLimit(token.end_ - begin_);
- }
- break;
- case tokenNull:
- {
- Value v;
- currentValue().swapPayload(v);
- currentValue().setOffsetStart(token.start_ - begin_);
- currentValue().setOffsetLimit(token.end_ - begin_);
- }
- break;
- case tokenArraySeparator:
- case tokenObjectEnd:
- case tokenArrayEnd:
- if (features_.allowDroppedNullPlaceholders_) {
- // "Un-read" the current token and mark the current value as a null
- // token.
- current_--;
- Value v;
- currentValue().swapPayload(v);
- currentValue().setOffsetStart(current_ - begin_ - 1);
- currentValue().setOffsetLimit(current_ - begin_);
- break;
- } // Else, fall through...
- default:
- currentValue().setOffsetStart(token.start_ - begin_);
- currentValue().setOffsetLimit(token.end_ - begin_);
- return addError("Syntax error: value, object or array expected.", token);
- }
-
- if (collectComments_) {
- lastValueEnd_ = current_;
- lastValue_ = &currentValue();
- }
-
- --stackDepth_g;
- return successful;
-}
-
-void Reader::skipCommentTokens(Token& token) {
- if (features_.allowComments_) {
- do {
- readToken(token);
- } while (token.type_ == tokenComment);
- } else {
- readToken(token);
- }
-}
-
-bool Reader::readToken(Token& token) {
- skipSpaces();
- token.start_ = current_;
- Char c = getNextChar();
- bool ok = true;
- switch (c) {
- case '{':
- token.type_ = tokenObjectBegin;
- break;
- case '}':
- token.type_ = tokenObjectEnd;
- break;
- case '[':
- token.type_ = tokenArrayBegin;
- break;
- case ']':
- token.type_ = tokenArrayEnd;
- break;
- case '"':
- token.type_ = tokenString;
- ok = readString();
- break;
- case '/':
- token.type_ = tokenComment;
- ok = readComment();
- break;
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- case '-':
- token.type_ = tokenNumber;
- readNumber();
- break;
- case 't':
- token.type_ = tokenTrue;
- ok = match("rue", 3);
- break;
- case 'f':
- token.type_ = tokenFalse;
- ok = match("alse", 4);
- break;
- case 'n':
- token.type_ = tokenNull;
- ok = match("ull", 3);
- break;
- case ',':
- token.type_ = tokenArraySeparator;
- break;
- case ':':
- token.type_ = tokenMemberSeparator;
- break;
- case 0:
- token.type_ = tokenEndOfStream;
- break;
- default:
- ok = false;
- break;
- }
- if (!ok)
- token.type_ = tokenError;
- token.end_ = current_;
- return true;
-}
-
-void Reader::skipSpaces() {
- while (current_ != end_) {
- Char c = *current_;
- if (c == ' ' || c == '\t' || c == '\r' || c == '\n')
- ++current_;
- else
- break;
- }
-}
-
-bool Reader::match(Location pattern, int patternLength) {
- if (end_ - current_ < patternLength)
- return false;
- int index = patternLength;
- while (index--)
- if (current_[index] != pattern[index])
- return false;
- current_ += patternLength;
- return true;
-}
-
-bool Reader::readComment() {
- Location commentBegin = current_ - 1;
- Char c = getNextChar();
- bool successful = false;
- if (c == '*')
- successful = readCStyleComment();
- else if (c == '/')
- successful = readCppStyleComment();
- if (!successful)
- return false;
-
- if (collectComments_) {
- CommentPlacement placement = commentBefore;
- if (lastValueEnd_ && !containsNewLine(lastValueEnd_, commentBegin)) {
- if (c != '*' || !containsNewLine(commentBegin, current_))
- placement = commentAfterOnSameLine;
- }
-
- addComment(commentBegin, current_, placement);
- }
- return true;
-}
-
-static std::string normalizeEOL(Reader::Location begin, Reader::Location end) {
- std::string normalized;
- normalized.reserve(end - begin);
- Reader::Location current = begin;
- while (current != end) {
- char c = *current++;
- if (c == '\r') {
- if (current != end && *current == '\n')
- // convert dos EOL
- ++current;
- // convert Mac EOL
- normalized += '\n';
- } else {
- normalized += c;
- }
- }
- return normalized;
-}
-
-void
-Reader::addComment(Location begin, Location end, CommentPlacement placement) {
- assert(collectComments_);
- const std::string& normalized = normalizeEOL(begin, end);
- if (placement == commentAfterOnSameLine) {
- assert(lastValue_ != 0);
- lastValue_->setComment(normalized, placement);
- } else {
- commentsBefore_ += normalized;
- }
-}
-
-bool Reader::readCStyleComment() {
- while (current_ != end_) {
- Char c = getNextChar();
- if (c == '*' && *current_ == '/')
- break;
- }
- return getNextChar() == '/';
-}
-
-bool Reader::readCppStyleComment() {
- while (current_ != end_) {
- Char c = getNextChar();
- if (c == '\n')
- break;
- if (c == '\r') {
- // Consume DOS EOL. It will be normalized in addComment.
- if (current_ != end_ && *current_ == '\n')
- getNextChar();
- // Break on Moc OS 9 EOL.
- break;
- }
- }
- return true;
-}
-
-void Reader::readNumber() {
- const char *p = current_;
- char c = '0'; // stopgap for already consumed character
- // integral part
- while (c >= '0' && c <= '9')
- c = (current_ = p) < end_ ? *p++ : 0;
- // fractional part
- if (c == '.') {
- c = (current_ = p) < end_ ? *p++ : 0;
- while (c >= '0' && c <= '9')
- c = (current_ = p) < end_ ? *p++ : 0;
- }
- // exponential part
- if (c == 'e' || c == 'E') {
- c = (current_ = p) < end_ ? *p++ : 0;
- if (c == '+' || c == '-')
- c = (current_ = p) < end_ ? *p++ : 0;
- while (c >= '0' && c <= '9')
- c = (current_ = p) < end_ ? *p++ : 0;
- }
-}
-
-bool Reader::readString() {
- Char c = 0;
- while (current_ != end_) {
- c = getNextChar();
- if (c == '\\')
- getNextChar();
- else if (c == '"')
- break;
- }
- return c == '"';
-}
-
-bool Reader::readObject(Token& tokenStart) {
- Token tokenName;
- std::string name;
- Value init(objectValue);
- currentValue().swapPayload(init);
- currentValue().setOffsetStart(tokenStart.start_ - begin_);
- while (readToken(tokenName)) {
- bool initialTokenOk = true;
- while (tokenName.type_ == tokenComment && initialTokenOk)
- initialTokenOk = readToken(tokenName);
- if (!initialTokenOk)
- break;
- if (tokenName.type_ == tokenObjectEnd && name.empty()) // empty object
- return true;
- name = "";
- if (tokenName.type_ == tokenString) {
- if (!decodeString(tokenName, name))
- return recoverFromError(tokenObjectEnd);
- } else if (tokenName.type_ == tokenNumber && features_.allowNumericKeys_) {
- Value numberName;
- if (!decodeNumber(tokenName, numberName))
- return recoverFromError(tokenObjectEnd);
- name = numberName.asString();
- } else {
- break;
- }
-
- Token colon;
- if (!readToken(colon) || colon.type_ != tokenMemberSeparator) {
- return addErrorAndRecover(
- "Missing ':' after object member name", colon, tokenObjectEnd);
- }
- Value& value = currentValue()[name];
- nodes_.push(&value);
- bool ok = readValue();
- nodes_.pop();
- if (!ok) // error already set
- return recoverFromError(tokenObjectEnd);
-
- Token comma;
- if (!readToken(comma) ||
- (comma.type_ != tokenObjectEnd && comma.type_ != tokenArraySeparator &&
- comma.type_ != tokenComment)) {
- return addErrorAndRecover(
- "Missing ',' or '}' in object declaration", comma, tokenObjectEnd);
- }
- bool finalizeTokenOk = true;
- while (comma.type_ == tokenComment && finalizeTokenOk)
- finalizeTokenOk = readToken(comma);
- if (comma.type_ == tokenObjectEnd)
- return true;
- }
- return addErrorAndRecover(
- "Missing '}' or object member name", tokenName, tokenObjectEnd);
-}
-
-bool Reader::readArray(Token& tokenStart) {
- Value init(arrayValue);
- currentValue().swapPayload(init);
- currentValue().setOffsetStart(tokenStart.start_ - begin_);
- skipSpaces();
- if (*current_ == ']') // empty array
- {
- Token endArray;
- readToken(endArray);
- return true;
- }
- int index = 0;
- for (;;) {
- Value& value = currentValue()[index++];
- nodes_.push(&value);
- bool ok = readValue();
- nodes_.pop();
- if (!ok) // error already set
- return recoverFromError(tokenArrayEnd);
-
- Token token;
- // Accept Comment after last item in the array.
- ok = readToken(token);
- while (token.type_ == tokenComment && ok) {
- ok = readToken(token);
- }
- bool badTokenType =
- (token.type_ != tokenArraySeparator && token.type_ != tokenArrayEnd);
- if (!ok || badTokenType) {
- return addErrorAndRecover(
- "Missing ',' or ']' in array declaration", token, tokenArrayEnd);
- }
- if (token.type_ == tokenArrayEnd)
- break;
- }
- return true;
-}
-
-bool Reader::decodeNumber(Token& token) {
- Value decoded;
- if (!decodeNumber(token, decoded))
- return false;
- currentValue().swapPayload(decoded);
- currentValue().setOffsetStart(token.start_ - begin_);
- currentValue().setOffsetLimit(token.end_ - begin_);
- return true;
-}
-
-bool Reader::decodeNumber(Token& token, Value& decoded) {
- // Attempts to parse the number as an integer. If the number is
- // larger than the maximum supported value of an integer then
- // we decode the number as a double.
- Location current = token.start_;
- bool isNegative = *current == '-';
- if (isNegative)
- ++current;
- // TODO: Help the compiler do the div and mod at compile time or get rid of them.
- Value::LargestUInt maxIntegerValue =
- isNegative ? Value::LargestUInt(-Value::minLargestInt)
- : Value::maxLargestUInt;
- Value::LargestUInt threshold = maxIntegerValue / 10;
- Value::LargestUInt value = 0;
- while (current < token.end_) {
- Char c = *current++;
- if (c < '0' || c > '9')
- return decodeDouble(token, decoded);
- Value::UInt digit(c - '0');
- if (value >= threshold) {
- // We've hit or exceeded the max value divided by 10 (rounded down). If
- // a) we've only just touched the limit, b) this is the last digit, and
- // c) it's small enough to fit in that rounding delta, we're okay.
- // Otherwise treat this number as a double to avoid overflow.
- if (value > threshold || current != token.end_ ||
- digit > maxIntegerValue % 10) {
- return decodeDouble(token, decoded);
- }
- }
- value = value * 10 + digit;
- }
- if (isNegative)
- decoded = -Value::LargestInt(value);
- else if (value <= Value::LargestUInt(Value::maxInt))
- decoded = Value::LargestInt(value);
- else
- decoded = value;
- return true;
-}
-
-bool Reader::decodeDouble(Token& token) {
- Value decoded;
- if (!decodeDouble(token, decoded))
- return false;
- currentValue().swapPayload(decoded);
- currentValue().setOffsetStart(token.start_ - begin_);
- currentValue().setOffsetLimit(token.end_ - begin_);
- return true;
-}
-
-bool Reader::decodeDouble(Token& token, Value& decoded) {
- double value = 0;
- std::string buffer(token.start_, token.end_);
- std::istringstream is(buffer);
- if (!(is >> value))
- return addError("'" + std::string(token.start_, token.end_) +
- "' is not a number.",
- token);
- decoded = value;
- return true;
-}
-
-bool Reader::decodeString(Token& token) {
- std::string decoded_string;
- if (!decodeString(token, decoded_string))
- return false;
- Value decoded(decoded_string);
- currentValue().swapPayload(decoded);
- currentValue().setOffsetStart(token.start_ - begin_);
- currentValue().setOffsetLimit(token.end_ - begin_);
- return true;
-}
-
-bool Reader::decodeString(Token& token, std::string& decoded) {
- decoded.reserve(token.end_ - token.start_ - 2);
- Location current = token.start_ + 1; // skip '"'
- Location end = token.end_ - 1; // do not include '"'
- while (current != end) {
- Char c = *current++;
- if (c == '"')
- break;
- else if (c == '\\') {
- if (current == end)
- return addError("Empty escape sequence in string", token, current);
- Char escape = *current++;
- switch (escape) {
- case '"':
- decoded += '"';
- break;
- case '/':
- decoded += '/';
- break;
- case '\\':
- decoded += '\\';
- break;
- case 'b':
- decoded += '\b';
- break;
- case 'f':
- decoded += '\f';
- break;
- case 'n':
- decoded += '\n';
- break;
- case 'r':
- decoded += '\r';
- break;
- case 't':
- decoded += '\t';
- break;
- case 'u': {
- unsigned int unicode;
- if (!decodeUnicodeCodePoint(token, current, end, unicode))
- return false;
- decoded += codePointToUTF8(unicode);
- } break;
- default:
- return addError("Bad escape sequence in string", token, current);
- }
- } else {
- decoded += c;
- }
- }
- return true;
-}
-
-bool Reader::decodeUnicodeCodePoint(Token& token,
- Location& current,
- Location end,
- unsigned int& unicode) {
-
- if (!decodeUnicodeEscapeSequence(token, current, end, unicode))
- return false;
- if (unicode >= 0xD800 && unicode <= 0xDBFF) {
- // surrogate pairs
- if (end - current < 6)
- return addError(
- "additional six characters expected to parse unicode surrogate pair.",
- token,
- current);
- unsigned int surrogatePair;
- if (*(current++) == '\\' && *(current++) == 'u') {
- if (decodeUnicodeEscapeSequence(token, current, end, surrogatePair)) {
- unicode = 0x10000 + ((unicode & 0x3FF) << 10) + (surrogatePair & 0x3FF);
- } else
- return false;
- } else
- return addError("expecting another \\u token to begin the second half of "
- "a unicode surrogate pair",
- token,
- current);
- }
- return true;
-}
-
-bool Reader::decodeUnicodeEscapeSequence(Token& token,
- Location& current,
- Location end,
- unsigned int& unicode) {
- if (end - current < 4)
- return addError(
- "Bad unicode escape sequence in string: four digits expected.",
- token,
- current);
- unicode = 0;
- for (int index = 0; index < 4; ++index) {
- Char c = *current++;
- unicode *= 16;
- if (c >= '0' && c <= '9')
- unicode += c - '0';
- else if (c >= 'a' && c <= 'f')
- unicode += c - 'a' + 10;
- else if (c >= 'A' && c <= 'F')
- unicode += c - 'A' + 10;
- else
- return addError(
- "Bad unicode escape sequence in string: hexadecimal digit expected.",
- token,
- current);
- }
- return true;
-}
-
-bool
-Reader::addError(const std::string& message, Token& token, Location extra) {
- ErrorInfo info;
- info.token_ = token;
- info.message_ = message;
- info.extra_ = extra;
- errors_.push_back(info);
- return false;
-}
-
-bool Reader::recoverFromError(TokenType skipUntilToken) {
- int errorCount = int(errors_.size());
- Token skip;
- for (;;) {
- if (!readToken(skip))
- errors_.resize(errorCount); // discard errors caused by recovery
- if (skip.type_ == skipUntilToken || skip.type_ == tokenEndOfStream)
- break;
- }
- errors_.resize(errorCount);
- return false;
-}
-
-bool Reader::addErrorAndRecover(const std::string& message,
- Token& token,
- TokenType skipUntilToken) {
- addError(message, token);
- return recoverFromError(skipUntilToken);
-}
-
-Value& Reader::currentValue() { return *(nodes_.top()); }
-
-Reader::Char Reader::getNextChar() {
- if (current_ == end_)
- return 0;
- return *current_++;
-}
-
-void Reader::getLocationLineAndColumn(Location location,
- int& line,
- int& column) const {
- Location current = begin_;
- Location lastLineStart = current;
- line = 0;
- while (current < location && current != end_) {
- Char c = *current++;
- if (c == '\r') {
- if (*current == '\n')
- ++current;
- lastLineStart = current;
- ++line;
- } else if (c == '\n') {
- lastLineStart = current;
- ++line;
- }
- }
- // column & line start at 1
- column = int(location - lastLineStart) + 1;
- ++line;
-}
-
-std::string Reader::getLocationLineAndColumn(Location location) const {
- int line, column;
- getLocationLineAndColumn(location, line, column);
- char buffer[18 + 16 + 16 + 1];
-#if defined(_MSC_VER) && defined(__STDC_SECURE_LIB__)
-#if defined(WINCE)
- _snprintf(buffer, sizeof(buffer), "Line %d, Column %d", line, column);
-#else
- sprintf_s(buffer, sizeof(buffer), "Line %d, Column %d", line, column);
-#endif
-#else
- snprintf(buffer, sizeof(buffer), "Line %d, Column %d", line, column);
-#endif
- return buffer;
-}
-
-// Deprecated. Preserved for backward compatibility
-std::string Reader::getFormatedErrorMessages() const {
- return getFormattedErrorMessages();
-}
-
-std::string Reader::getFormattedErrorMessages() const {
- std::string formattedMessage;
- for (Errors::const_iterator itError = errors_.begin();
- itError != errors_.end();
- ++itError) {
- const ErrorInfo& error = *itError;
- formattedMessage +=
- "* " + getLocationLineAndColumn(error.token_.start_) + "\n";
- formattedMessage += " " + error.message_ + "\n";
- if (error.extra_)
- formattedMessage +=
- "See " + getLocationLineAndColumn(error.extra_) + " for detail.\n";
- }
- return formattedMessage;
-}
-
-std::vector<Reader::StructuredError> Reader::getStructuredErrors() const {
- std::vector<Reader::StructuredError> allErrors;
- for (Errors::const_iterator itError = errors_.begin();
- itError != errors_.end();
- ++itError) {
- const ErrorInfo& error = *itError;
- Reader::StructuredError structured;
- structured.offset_start = error.token_.start_ - begin_;
- structured.offset_limit = error.token_.end_ - begin_;
- structured.message = error.message_;
- allErrors.push_back(structured);
- }
- return allErrors;
-}
-
-bool Reader::pushError(const Value& value, const std::string& message) {
- size_t length = end_ - begin_;
- if(value.getOffsetStart() > length
- || value.getOffsetLimit() > length)
- return false;
- Token token;
- token.type_ = tokenError;
- token.start_ = begin_ + value.getOffsetStart();
- token.end_ = end_ + value.getOffsetLimit();
- ErrorInfo info;
- info.token_ = token;
- info.message_ = message;
- info.extra_ = 0;
- errors_.push_back(info);
- return true;
-}
-
-bool Reader::pushError(const Value& value, const std::string& message, const Value& extra) {
- size_t length = end_ - begin_;
- if(value.getOffsetStart() > length
- || value.getOffsetLimit() > length
- || extra.getOffsetLimit() > length)
- return false;
- Token token;
- token.type_ = tokenError;
- token.start_ = begin_ + value.getOffsetStart();
- token.end_ = begin_ + value.getOffsetLimit();
- ErrorInfo info;
- info.token_ = token;
- info.message_ = message;
- info.extra_ = begin_ + extra.getOffsetStart();
- errors_.push_back(info);
- return true;
-}
-
-bool Reader::good() const {
- return !errors_.size();
-}
-
-// exact copy of Features
-class OurFeatures {
-public:
- static OurFeatures all();
- OurFeatures();
- bool allowComments_;
- bool strictRoot_;
- bool allowDroppedNullPlaceholders_;
- bool allowNumericKeys_;
- bool allowSingleQuotes_;
- bool failIfExtra_;
- bool rejectDupKeys_;
- int stackLimit_;
-}; // OurFeatures
-
-// exact copy of Implementation of class Features
-// ////////////////////////////////
-
-OurFeatures::OurFeatures()
- : allowComments_(true), strictRoot_(false)
- , allowDroppedNullPlaceholders_(false), allowNumericKeys_(false)
- , allowSingleQuotes_(false)
- , failIfExtra_(false)
-{
-}
-
-OurFeatures OurFeatures::all() { return OurFeatures(); }
-
-// Implementation of class Reader
-// ////////////////////////////////
-
-// exact copy of Reader, renamed to OurReader
-class OurReader {
-public:
- typedef char Char;
- typedef const Char* Location;
- struct StructuredError {
- size_t offset_start;
- size_t offset_limit;
- std::string message;
- };
-
- OurReader(OurFeatures const& features);
- bool parse(const char* beginDoc,
- const char* endDoc,
- Value& root,
- bool collectComments = true);
- std::string getFormattedErrorMessages() const;
- std::vector<StructuredError> getStructuredErrors() const;
- bool pushError(const Value& value, const std::string& message);
- bool pushError(const Value& value, const std::string& message, const Value& extra);
- bool good() const;
-
-private:
- OurReader(OurReader const&); // no impl
- void operator=(OurReader const&); // no impl
-
- enum TokenType {
- tokenEndOfStream = 0,
- tokenObjectBegin,
- tokenObjectEnd,
- tokenArrayBegin,
- tokenArrayEnd,
- tokenString,
- tokenNumber,
- tokenTrue,
- tokenFalse,
- tokenNull,
- tokenArraySeparator,
- tokenMemberSeparator,
- tokenComment,
- tokenError
- };
-
- class Token {
- public:
- TokenType type_;
- Location start_;
- Location end_;
- };
-
- class ErrorInfo {
- public:
- Token token_;
- std::string message_;
- Location extra_;
- };
-
- typedef std::deque<ErrorInfo> Errors;
-
- bool readToken(Token& token);
- void skipSpaces();
- bool match(Location pattern, int patternLength);
- bool readComment();
- bool readCStyleComment();
- bool readCppStyleComment();
- bool readString();
- bool readStringSingleQuote();
- void readNumber();
- bool readValue();
- bool readObject(Token& token);
- bool readArray(Token& token);
- bool decodeNumber(Token& token);
- bool decodeNumber(Token& token, Value& decoded);
- bool decodeString(Token& token);
- bool decodeString(Token& token, std::string& decoded);
- bool decodeDouble(Token& token);
- bool decodeDouble(Token& token, Value& decoded);
- bool decodeUnicodeCodePoint(Token& token,
- Location& current,
- Location end,
- unsigned int& unicode);
- bool decodeUnicodeEscapeSequence(Token& token,
- Location& current,
- Location end,
- unsigned int& unicode);
- bool addError(const std::string& message, Token& token, Location extra = 0);
- bool recoverFromError(TokenType skipUntilToken);
- bool addErrorAndRecover(const std::string& message,
- Token& token,
- TokenType skipUntilToken);
- void skipUntilSpace();
- Value& currentValue();
- Char getNextChar();
- void
- getLocationLineAndColumn(Location location, int& line, int& column) const;
- std::string getLocationLineAndColumn(Location location) const;
- void addComment(Location begin, Location end, CommentPlacement placement);
- void skipCommentTokens(Token& token);
-
- typedef std::stack<Value*> Nodes;
- Nodes nodes_;
- Errors errors_;
- std::string document_;
- Location begin_;
- Location end_;
- Location current_;
- Location lastValueEnd_;
- Value* lastValue_;
- std::string commentsBefore_;
- int stackDepth_;
-
- OurFeatures const features_;
- bool collectComments_;
-}; // OurReader
-
-// complete copy of Read impl, for OurReader
-
-OurReader::OurReader(OurFeatures const& features)
- : errors_(), document_(), begin_(), end_(), current_(), lastValueEnd_(),
- lastValue_(), commentsBefore_(), features_(features), collectComments_() {
-}
-
-bool OurReader::parse(const char* beginDoc,
- const char* endDoc,
- Value& root,
- bool collectComments) {
- if (!features_.allowComments_) {
- collectComments = false;
- }
-
- begin_ = beginDoc;
- end_ = endDoc;
- collectComments_ = collectComments;
- current_ = begin_;
- lastValueEnd_ = 0;
- lastValue_ = 0;
- commentsBefore_ = "";
- errors_.clear();
- while (!nodes_.empty())
- nodes_.pop();
- nodes_.push(&root);
-
- stackDepth_ = 0;
- bool successful = readValue();
- Token token;
- skipCommentTokens(token);
- if (features_.failIfExtra_) {
- if (token.type_ != tokenError && token.type_ != tokenEndOfStream) {
- addError("Extra non-whitespace after JSON value.", token);
- return false;
- }
- }
- if (collectComments_ && !commentsBefore_.empty())
- root.setComment(commentsBefore_, commentAfter);
- if (features_.strictRoot_) {
- if (!root.isArray() && !root.isObject()) {
- // Set error location to start of doc, ideally should be first token found
- // in doc
- token.type_ = tokenError;
- token.start_ = beginDoc;
- token.end_ = endDoc;
- addError(
- "A valid JSON document must be either an array or an object value.",
- token);
- return false;
- }
- }
- return successful;
-}
-
-bool OurReader::readValue() {
- if (stackDepth_ >= features_.stackLimit_) throwRuntimeError("Exceeded stackLimit in readValue().");
- ++stackDepth_;
- Token token;
- skipCommentTokens(token);
- bool successful = true;
-
- if (collectComments_ && !commentsBefore_.empty()) {
- currentValue().setComment(commentsBefore_, commentBefore);
- commentsBefore_ = "";
- }
-
- switch (token.type_) {
- case tokenObjectBegin:
- successful = readObject(token);
- currentValue().setOffsetLimit(current_ - begin_);
- break;
- case tokenArrayBegin:
- successful = readArray(token);
- currentValue().setOffsetLimit(current_ - begin_);
- break;
- case tokenNumber:
- successful = decodeNumber(token);
- break;
- case tokenString:
- successful = decodeString(token);
- break;
- case tokenTrue:
- {
- Value v(true);
- currentValue().swapPayload(v);
- currentValue().setOffsetStart(token.start_ - begin_);
- currentValue().setOffsetLimit(token.end_ - begin_);
- }
- break;
- case tokenFalse:
- {
- Value v(false);
- currentValue().swapPayload(v);
- currentValue().setOffsetStart(token.start_ - begin_);
- currentValue().setOffsetLimit(token.end_ - begin_);
- }
- break;
- case tokenNull:
- {
- Value v;
- currentValue().swapPayload(v);
- currentValue().setOffsetStart(token.start_ - begin_);
- currentValue().setOffsetLimit(token.end_ - begin_);
- }
- break;
- case tokenArraySeparator:
- case tokenObjectEnd:
- case tokenArrayEnd:
- if (features_.allowDroppedNullPlaceholders_) {
- // "Un-read" the current token and mark the current value as a null
- // token.
- current_--;
- Value v;
- currentValue().swapPayload(v);
- currentValue().setOffsetStart(current_ - begin_ - 1);
- currentValue().setOffsetLimit(current_ - begin_);
- break;
- } // else, fall through ...
- default:
- currentValue().setOffsetStart(token.start_ - begin_);
- currentValue().setOffsetLimit(token.end_ - begin_);
- return addError("Syntax error: value, object or array expected.", token);
- }
-
- if (collectComments_) {
- lastValueEnd_ = current_;
- lastValue_ = &currentValue();
- }
-
- --stackDepth_;
- return successful;
-}
-
-void OurReader::skipCommentTokens(Token& token) {
- if (features_.allowComments_) {
- do {
- readToken(token);
- } while (token.type_ == tokenComment);
- } else {
- readToken(token);
- }
-}
-
-bool OurReader::readToken(Token& token) {
- skipSpaces();
- token.start_ = current_;
- Char c = getNextChar();
- bool ok = true;
- switch (c) {
- case '{':
- token.type_ = tokenObjectBegin;
- break;
- case '}':
- token.type_ = tokenObjectEnd;
- break;
- case '[':
- token.type_ = tokenArrayBegin;
- break;
- case ']':
- token.type_ = tokenArrayEnd;
- break;
- case '"':
- token.type_ = tokenString;
- ok = readString();
- break;
- case '\'':
- if (features_.allowSingleQuotes_) {
- token.type_ = tokenString;
- ok = readStringSingleQuote();
- break;
- } // else continue
- case '/':
- token.type_ = tokenComment;
- ok = readComment();
- break;
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- case '-':
- token.type_ = tokenNumber;
- readNumber();
- break;
- case 't':
- token.type_ = tokenTrue;
- ok = match("rue", 3);
- break;
- case 'f':
- token.type_ = tokenFalse;
- ok = match("alse", 4);
- break;
- case 'n':
- token.type_ = tokenNull;
- ok = match("ull", 3);
- break;
- case ',':
- token.type_ = tokenArraySeparator;
- break;
- case ':':
- token.type_ = tokenMemberSeparator;
- break;
- case 0:
- token.type_ = tokenEndOfStream;
- break;
- default:
- ok = false;
- break;
- }
- if (!ok)
- token.type_ = tokenError;
- token.end_ = current_;
- return true;
-}
-
-void OurReader::skipSpaces() {
- while (current_ != end_) {
- Char c = *current_;
- if (c == ' ' || c == '\t' || c == '\r' || c == '\n')
- ++current_;
- else
- break;
- }
-}
-
-bool OurReader::match(Location pattern, int patternLength) {
- if (end_ - current_ < patternLength)
- return false;
- int index = patternLength;
- while (index--)
- if (current_[index] != pattern[index])
- return false;
- current_ += patternLength;
- return true;
-}
-
-bool OurReader::readComment() {
- Location commentBegin = current_ - 1;
- Char c = getNextChar();
- bool successful = false;
- if (c == '*')
- successful = readCStyleComment();
- else if (c == '/')
- successful = readCppStyleComment();
- if (!successful)
- return false;
-
- if (collectComments_) {
- CommentPlacement placement = commentBefore;
- if (lastValueEnd_ && !containsNewLine(lastValueEnd_, commentBegin)) {
- if (c != '*' || !containsNewLine(commentBegin, current_))
- placement = commentAfterOnSameLine;
- }
-
- addComment(commentBegin, current_, placement);
- }
- return true;
-}
-
-void
-OurReader::addComment(Location begin, Location end, CommentPlacement placement) {
- assert(collectComments_);
- const std::string& normalized = normalizeEOL(begin, end);
- if (placement == commentAfterOnSameLine) {
- assert(lastValue_ != 0);
- lastValue_->setComment(normalized, placement);
- } else {
- commentsBefore_ += normalized;
- }
-}
-
-bool OurReader::readCStyleComment() {
- while (current_ != end_) {
- Char c = getNextChar();
- if (c == '*' && *current_ == '/')
- break;
- }
- return getNextChar() == '/';
-}
-
-bool OurReader::readCppStyleComment() {
- while (current_ != end_) {
- Char c = getNextChar();
- if (c == '\n')
- break;
- if (c == '\r') {
- // Consume DOS EOL. It will be normalized in addComment.
- if (current_ != end_ && *current_ == '\n')
- getNextChar();
- // Break on Moc OS 9 EOL.
- break;
- }
- }
- return true;
-}
-
-void OurReader::readNumber() {
- const char *p = current_;
- char c = '0'; // stopgap for already consumed character
- // integral part
- while (c >= '0' && c <= '9')
- c = (current_ = p) < end_ ? *p++ : 0;
- // fractional part
- if (c == '.') {
- c = (current_ = p) < end_ ? *p++ : 0;
- while (c >= '0' && c <= '9')
- c = (current_ = p) < end_ ? *p++ : 0;
- }
- // exponential part
- if (c == 'e' || c == 'E') {
- c = (current_ = p) < end_ ? *p++ : 0;
- if (c == '+' || c == '-')
- c = (current_ = p) < end_ ? *p++ : 0;
- while (c >= '0' && c <= '9')
- c = (current_ = p) < end_ ? *p++ : 0;
- }
-}
-bool OurReader::readString() {
- Char c = 0;
- while (current_ != end_) {
- c = getNextChar();
- if (c == '\\')
- getNextChar();
- else if (c == '"')
- break;
- }
- return c == '"';
-}
-
-
-bool OurReader::readStringSingleQuote() {
- Char c = 0;
- while (current_ != end_) {
- c = getNextChar();
- if (c == '\\')
- getNextChar();
- else if (c == '\'')
- break;
- }
- return c == '\'';
-}
-
-bool OurReader::readObject(Token& tokenStart) {
- Token tokenName;
- std::string name;
- Value init(objectValue);
- currentValue().swapPayload(init);
- currentValue().setOffsetStart(tokenStart.start_ - begin_);
- while (readToken(tokenName)) {
- bool initialTokenOk = true;
- while (tokenName.type_ == tokenComment && initialTokenOk)
- initialTokenOk = readToken(tokenName);
- if (!initialTokenOk)
- break;
- if (tokenName.type_ == tokenObjectEnd && name.empty()) // empty object
- return true;
- name = "";
- if (tokenName.type_ == tokenString) {
- if (!decodeString(tokenName, name))
- return recoverFromError(tokenObjectEnd);
- } else if (tokenName.type_ == tokenNumber && features_.allowNumericKeys_) {
- Value numberName;
- if (!decodeNumber(tokenName, numberName))
- return recoverFromError(tokenObjectEnd);
- name = numberName.asString();
- } else {
- break;
- }
-
- Token colon;
- if (!readToken(colon) || colon.type_ != tokenMemberSeparator) {
- return addErrorAndRecover(
- "Missing ':' after object member name", colon, tokenObjectEnd);
- }
- if (name.length() >= (1U<<30)) throwRuntimeError("keylength >= 2^30");
- if (features_.rejectDupKeys_ && currentValue().isMember(name)) {
- std::string msg = "Duplicate key: '" + name + "'";
- return addErrorAndRecover(
- msg, tokenName, tokenObjectEnd);
- }
- Value& value = currentValue()[name];
- nodes_.push(&value);
- bool ok = readValue();
- nodes_.pop();
- if (!ok) // error already set
- return recoverFromError(tokenObjectEnd);
-
- Token comma;
- if (!readToken(comma) ||
- (comma.type_ != tokenObjectEnd && comma.type_ != tokenArraySeparator &&
- comma.type_ != tokenComment)) {
- return addErrorAndRecover(
- "Missing ',' or '}' in object declaration", comma, tokenObjectEnd);
- }
- bool finalizeTokenOk = true;
- while (comma.type_ == tokenComment && finalizeTokenOk)
- finalizeTokenOk = readToken(comma);
- if (comma.type_ == tokenObjectEnd)
- return true;
- }
- return addErrorAndRecover(
- "Missing '}' or object member name", tokenName, tokenObjectEnd);
-}
-
-bool OurReader::readArray(Token& tokenStart) {
- Value init(arrayValue);
- currentValue().swapPayload(init);
- currentValue().setOffsetStart(tokenStart.start_ - begin_);
- skipSpaces();
- if (*current_ == ']') // empty array
- {
- Token endArray;
- readToken(endArray);
- return true;
- }
- int index = 0;
- for (;;) {
- Value& value = currentValue()[index++];
- nodes_.push(&value);
- bool ok = readValue();
- nodes_.pop();
- if (!ok) // error already set
- return recoverFromError(tokenArrayEnd);
-
- Token token;
- // Accept Comment after last item in the array.
- ok = readToken(token);
- while (token.type_ == tokenComment && ok) {
- ok = readToken(token);
- }
- bool badTokenType =
- (token.type_ != tokenArraySeparator && token.type_ != tokenArrayEnd);
- if (!ok || badTokenType) {
- return addErrorAndRecover(
- "Missing ',' or ']' in array declaration", token, tokenArrayEnd);
- }
- if (token.type_ == tokenArrayEnd)
- break;
- }
- return true;
-}
-
-bool OurReader::decodeNumber(Token& token) {
- Value decoded;
- if (!decodeNumber(token, decoded))
- return false;
- currentValue().swapPayload(decoded);
- currentValue().setOffsetStart(token.start_ - begin_);
- currentValue().setOffsetLimit(token.end_ - begin_);
- return true;
-}
-
-bool OurReader::decodeNumber(Token& token, Value& decoded) {
- // Attempts to parse the number as an integer. If the number is
- // larger than the maximum supported value of an integer then
- // we decode the number as a double.
- Location current = token.start_;
- bool isNegative = *current == '-';
- if (isNegative)
- ++current;
- // TODO: Help the compiler do the div and mod at compile time or get rid of them.
- Value::LargestUInt maxIntegerValue =
- isNegative ? Value::LargestUInt(-Value::minLargestInt)
- : Value::maxLargestUInt;
- Value::LargestUInt threshold = maxIntegerValue / 10;
- Value::LargestUInt value = 0;
- while (current < token.end_) {
- Char c = *current++;
- if (c < '0' || c > '9')
- return decodeDouble(token, decoded);
- Value::UInt digit(c - '0');
- if (value >= threshold) {
- // We've hit or exceeded the max value divided by 10 (rounded down). If
- // a) we've only just touched the limit, b) this is the last digit, and
- // c) it's small enough to fit in that rounding delta, we're okay.
- // Otherwise treat this number as a double to avoid overflow.
- if (value > threshold || current != token.end_ ||
- digit > maxIntegerValue % 10) {
- return decodeDouble(token, decoded);
- }
- }
- value = value * 10 + digit;
- }
- if (isNegative)
- decoded = -Value::LargestInt(value);
- else if (value <= Value::LargestUInt(Value::maxInt))
- decoded = Value::LargestInt(value);
- else
- decoded = value;
- return true;
-}
-
-bool OurReader::decodeDouble(Token& token) {
- Value decoded;
- if (!decodeDouble(token, decoded))
- return false;
- currentValue().swapPayload(decoded);
- currentValue().setOffsetStart(token.start_ - begin_);
- currentValue().setOffsetLimit(token.end_ - begin_);
- return true;
-}
-
-bool OurReader::decodeDouble(Token& token, Value& decoded) {
- double value = 0;
- const int bufferSize = 32;
- int count;
- int length = int(token.end_ - token.start_);
-
- // Sanity check to avoid buffer overflow exploits.
- if (length < 0) {
- return addError("Unable to parse token length", token);
- }
-
- // Avoid using a string constant for the format control string given to
- // sscanf, as this can cause hard to debug crashes on OS X. See here for more
- // info:
- //
- // http://developer.apple.com/library/mac/#DOCUMENTATION/DeveloperTools/gcc-4.0.1/gcc/Incompatibilities.html
- char format[] = "%lf";
-
- if (length <= bufferSize) {
- Char buffer[bufferSize + 1];
- memcpy(buffer, token.start_, length);
- buffer[length] = 0;
- count = sscanf(buffer, format, &value);
- } else {
- std::string buffer(token.start_, token.end_);
- count = sscanf(buffer.c_str(), format, &value);
- }
-
- if (count != 1)
- return addError("'" + std::string(token.start_, token.end_) +
- "' is not a number.",
- token);
- decoded = value;
- return true;
-}
-
-bool OurReader::decodeString(Token& token) {
- std::string decoded_string;
- if (!decodeString(token, decoded_string))
- return false;
- Value decoded(decoded_string);
- currentValue().swapPayload(decoded);
- currentValue().setOffsetStart(token.start_ - begin_);
- currentValue().setOffsetLimit(token.end_ - begin_);
- return true;
-}
-
-bool OurReader::decodeString(Token& token, std::string& decoded) {
- decoded.reserve(token.end_ - token.start_ - 2);
- Location current = token.start_ + 1; // skip '"'
- Location end = token.end_ - 1; // do not include '"'
- while (current != end) {
- Char c = *current++;
- if (c == '"')
- break;
- else if (c == '\\') {
- if (current == end)
- return addError("Empty escape sequence in string", token, current);
- Char escape = *current++;
- switch (escape) {
- case '"':
- decoded += '"';
- break;
- case '/':
- decoded += '/';
- break;
- case '\\':
- decoded += '\\';
- break;
- case 'b':
- decoded += '\b';
- break;
- case 'f':
- decoded += '\f';
- break;
- case 'n':
- decoded += '\n';
- break;
- case 'r':
- decoded += '\r';
- break;
- case 't':
- decoded += '\t';
- break;
- case 'u': {
- unsigned int unicode;
- if (!decodeUnicodeCodePoint(token, current, end, unicode))
- return false;
- decoded += codePointToUTF8(unicode);
- } break;
- default:
- return addError("Bad escape sequence in string", token, current);
- }
- } else {
- decoded += c;
- }
- }
- return true;
-}
-
-bool OurReader::decodeUnicodeCodePoint(Token& token,
- Location& current,
- Location end,
- unsigned int& unicode) {
-
- if (!decodeUnicodeEscapeSequence(token, current, end, unicode))
- return false;
- if (unicode >= 0xD800 && unicode <= 0xDBFF) {
- // surrogate pairs
- if (end - current < 6)
- return addError(
- "additional six characters expected to parse unicode surrogate pair.",
- token,
- current);
- unsigned int surrogatePair;
- if (*(current++) == '\\' && *(current++) == 'u') {
- if (decodeUnicodeEscapeSequence(token, current, end, surrogatePair)) {
- unicode = 0x10000 + ((unicode & 0x3FF) << 10) + (surrogatePair & 0x3FF);
- } else
- return false;
- } else
- return addError("expecting another \\u token to begin the second half of "
- "a unicode surrogate pair",
- token,
- current);
- }
- return true;
-}
-
-bool OurReader::decodeUnicodeEscapeSequence(Token& token,
- Location& current,
- Location end,
- unsigned int& unicode) {
- if (end - current < 4)
- return addError(
- "Bad unicode escape sequence in string: four digits expected.",
- token,
- current);
- unicode = 0;
- for (int index = 0; index < 4; ++index) {
- Char c = *current++;
- unicode *= 16;
- if (c >= '0' && c <= '9')
- unicode += c - '0';
- else if (c >= 'a' && c <= 'f')
- unicode += c - 'a' + 10;
- else if (c >= 'A' && c <= 'F')
- unicode += c - 'A' + 10;
- else
- return addError(
- "Bad unicode escape sequence in string: hexadecimal digit expected.",
- token,
- current);
- }
- return true;
-}
-
-bool
-OurReader::addError(const std::string& message, Token& token, Location extra) {
- ErrorInfo info;
- info.token_ = token;
- info.message_ = message;
- info.extra_ = extra;
- errors_.push_back(info);
- return false;
-}
-
-bool OurReader::recoverFromError(TokenType skipUntilToken) {
- int errorCount = int(errors_.size());
- Token skip;
- for (;;) {
- if (!readToken(skip))
- errors_.resize(errorCount); // discard errors caused by recovery
- if (skip.type_ == skipUntilToken || skip.type_ == tokenEndOfStream)
- break;
- }
- errors_.resize(errorCount);
- return false;
-}
-
-bool OurReader::addErrorAndRecover(const std::string& message,
- Token& token,
- TokenType skipUntilToken) {
- addError(message, token);
- return recoverFromError(skipUntilToken);
-}
-
-Value& OurReader::currentValue() { return *(nodes_.top()); }
-
-OurReader::Char OurReader::getNextChar() {
- if (current_ == end_)
- return 0;
- return *current_++;
-}
-
-void OurReader::getLocationLineAndColumn(Location location,
- int& line,
- int& column) const {
- Location current = begin_;
- Location lastLineStart = current;
- line = 0;
- while (current < location && current != end_) {
- Char c = *current++;
- if (c == '\r') {
- if (*current == '\n')
- ++current;
- lastLineStart = current;
- ++line;
- } else if (c == '\n') {
- lastLineStart = current;
- ++line;
- }
- }
- // column & line start at 1
- column = int(location - lastLineStart) + 1;
- ++line;
-}
-
-std::string OurReader::getLocationLineAndColumn(Location location) const {
- int line, column;
- getLocationLineAndColumn(location, line, column);
- char buffer[18 + 16 + 16 + 1];
-#if defined(_MSC_VER) && defined(__STDC_SECURE_LIB__)
-#if defined(WINCE)
- _snprintf(buffer, sizeof(buffer), "Line %d, Column %d", line, column);
-#else
- sprintf_s(buffer, sizeof(buffer), "Line %d, Column %d", line, column);
-#endif
-#else
- snprintf(buffer, sizeof(buffer), "Line %d, Column %d", line, column);
-#endif
- return buffer;
-}
-
-std::string OurReader::getFormattedErrorMessages() const {
- std::string formattedMessage;
- for (Errors::const_iterator itError = errors_.begin();
- itError != errors_.end();
- ++itError) {
- const ErrorInfo& error = *itError;
- formattedMessage +=
- "* " + getLocationLineAndColumn(error.token_.start_) + "\n";
- formattedMessage += " " + error.message_ + "\n";
- if (error.extra_)
- formattedMessage +=
- "See " + getLocationLineAndColumn(error.extra_) + " for detail.\n";
- }
- return formattedMessage;
-}
-
-std::vector<OurReader::StructuredError> OurReader::getStructuredErrors() const {
- std::vector<OurReader::StructuredError> allErrors;
- for (Errors::const_iterator itError = errors_.begin();
- itError != errors_.end();
- ++itError) {
- const ErrorInfo& error = *itError;
- OurReader::StructuredError structured;
- structured.offset_start = error.token_.start_ - begin_;
- structured.offset_limit = error.token_.end_ - begin_;
- structured.message = error.message_;
- allErrors.push_back(structured);
- }
- return allErrors;
-}
-
-bool OurReader::pushError(const Value& value, const std::string& message) {
- size_t length = end_ - begin_;
- if(value.getOffsetStart() > length
- || value.getOffsetLimit() > length)
- return false;
- Token token;
- token.type_ = tokenError;
- token.start_ = begin_ + value.getOffsetStart();
- token.end_ = end_ + value.getOffsetLimit();
- ErrorInfo info;
- info.token_ = token;
- info.message_ = message;
- info.extra_ = 0;
- errors_.push_back(info);
- return true;
-}
-
-bool OurReader::pushError(const Value& value, const std::string& message, const Value& extra) {
- size_t length = end_ - begin_;
- if(value.getOffsetStart() > length
- || value.getOffsetLimit() > length
- || extra.getOffsetLimit() > length)
- return false;
- Token token;
- token.type_ = tokenError;
- token.start_ = begin_ + value.getOffsetStart();
- token.end_ = begin_ + value.getOffsetLimit();
- ErrorInfo info;
- info.token_ = token;
- info.message_ = message;
- info.extra_ = begin_ + extra.getOffsetStart();
- errors_.push_back(info);
- return true;
-}
-
-bool OurReader::good() const {
- return !errors_.size();
-}
-
-
-class OurCharReader : public CharReader {
- bool const collectComments_;
- OurReader reader_;
-public:
- OurCharReader(
- bool collectComments,
- OurFeatures const& features)
- : collectComments_(collectComments)
- , reader_(features)
- {}
- virtual bool parse(
- char const* beginDoc, char const* endDoc,
- Value* root, std::string* errs) {
- bool ok = reader_.parse(beginDoc, endDoc, *root, collectComments_);
- if (errs) {
- *errs = reader_.getFormattedErrorMessages();
- }
- return ok;
- }
-};
-
-CharReaderBuilder::CharReaderBuilder()
-{
- setDefaults(&settings_);
-}
-CharReaderBuilder::~CharReaderBuilder()
-{}
-CharReader* CharReaderBuilder::newCharReader() const
-{
- bool collectComments = settings_["collectComments"].asBool();
- OurFeatures features = OurFeatures::all();
- features.allowComments_ = settings_["allowComments"].asBool();
- features.strictRoot_ = settings_["strictRoot"].asBool();
- features.allowDroppedNullPlaceholders_ = settings_["allowDroppedNullPlaceholders"].asBool();
- features.allowNumericKeys_ = settings_["allowNumericKeys"].asBool();
- features.allowSingleQuotes_ = settings_["allowSingleQuotes"].asBool();
- features.stackLimit_ = settings_["stackLimit"].asInt();
- features.failIfExtra_ = settings_["failIfExtra"].asBool();
- features.rejectDupKeys_ = settings_["rejectDupKeys"].asBool();
- return new OurCharReader(collectComments, features);
-}
-static void getValidReaderKeys(std::set<std::string>* valid_keys)
-{
- valid_keys->clear();
- valid_keys->insert("collectComments");
- valid_keys->insert("allowComments");
- valid_keys->insert("strictRoot");
- valid_keys->insert("allowDroppedNullPlaceholders");
- valid_keys->insert("allowNumericKeys");
- valid_keys->insert("allowSingleQuotes");
- valid_keys->insert("stackLimit");
- valid_keys->insert("failIfExtra");
- valid_keys->insert("rejectDupKeys");
-}
-bool CharReaderBuilder::validate(Json::Value* invalid) const
-{
- Json::Value my_invalid;
- if (!invalid) invalid = &my_invalid; // so we do not need to test for NULL
- Json::Value& inv = *invalid;
- std::set<std::string> valid_keys;
- getValidReaderKeys(&valid_keys);
- Value::Members keys = settings_.getMemberNames();
- size_t n = keys.size();
- for (size_t i = 0; i < n; ++i) {
- std::string const& key = keys[i];
- if (valid_keys.find(key) == valid_keys.end()) {
- inv[key] = settings_[key];
- }
- }
- return 0u == inv.size();
-}
-Value& CharReaderBuilder::operator[](std::string key)
-{
- return settings_[key];
-}
-// static
-void CharReaderBuilder::strictMode(Json::Value* settings)
-{
-//! [CharReaderBuilderStrictMode]
- (*settings)["allowComments"] = false;
- (*settings)["strictRoot"] = true;
- (*settings)["allowDroppedNullPlaceholders"] = false;
- (*settings)["allowNumericKeys"] = false;
- (*settings)["allowSingleQuotes"] = false;
- (*settings)["failIfExtra"] = true;
- (*settings)["rejectDupKeys"] = true;
-//! [CharReaderBuilderStrictMode]
-}
-// static
-void CharReaderBuilder::setDefaults(Json::Value* settings)
-{
-//! [CharReaderBuilderDefaults]
- (*settings)["collectComments"] = true;
- (*settings)["allowComments"] = true;
- (*settings)["strictRoot"] = false;
- (*settings)["allowDroppedNullPlaceholders"] = false;
- (*settings)["allowNumericKeys"] = false;
- (*settings)["allowSingleQuotes"] = false;
- (*settings)["stackLimit"] = 1000;
- (*settings)["failIfExtra"] = false;
- (*settings)["rejectDupKeys"] = false;
-//! [CharReaderBuilderDefaults]
-}
-
-//////////////////////////////////
-// global functions
-
-bool parseFromStream(
- CharReader::Factory const& fact, std::istream& sin,
- Value* root, std::string* errs)
-{
- std::ostringstream ssin;
- ssin << sin.rdbuf();
- std::string doc = ssin.str();
- char const* begin = doc.data();
- char const* end = begin + doc.size();
- // Note that we do not actually need a null-terminator.
- CharReaderPtr const reader(fact.newCharReader());
- return reader->parse(begin, end, root, errs);
-}
-
-std::istream& operator>>(std::istream& sin, Value& root) {
- CharReaderBuilder b;
- std::string errs;
- bool ok = parseFromStream(b, sin, &root, &errs);
- if (!ok) {
- fprintf(stderr,
- "Error from reader: %s",
- errs.c_str());
-
- throwRuntimeError("reader error");
- }
- return sin;
-}
-
-} // namespace Json
diff --git a/3rdparty/jsoncpp/src/lib_json/json_tool.h b/3rdparty/jsoncpp/src/lib_json/json_tool.h
deleted file mode 100644
index f9b61c38c70..00000000000
--- a/3rdparty/jsoncpp/src/lib_json/json_tool.h
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright 2007-2010 Baptiste Lepilleur
-// Distributed under MIT license, or public domain if desired and
-// recognized in your jurisdiction.
-// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
-
-#ifndef LIB_JSONCPP_JSON_TOOL_H_INCLUDED
-#define LIB_JSONCPP_JSON_TOOL_H_INCLUDED
-
-/* This header provides common string manipulation support, such as UTF-8,
- * portable conversion from/to string...
- *
- * It is an internal header that must not be exposed.
- */
-
-namespace Json {
-
-/// Converts a unicode code-point to UTF-8.
-static inline std::string codePointToUTF8(unsigned int cp) {
- std::string result;
-
- // based on description from http://en.wikipedia.org/wiki/UTF-8
-
- if (cp <= 0x7f) {
- result.resize(1);
- result[0] = static_cast<char>(cp);
- } else if (cp <= 0x7FF) {
- result.resize(2);
- result[1] = static_cast<char>(0x80 | (0x3f & cp));
- result[0] = static_cast<char>(0xC0 | (0x1f & (cp >> 6)));
- } else if (cp <= 0xFFFF) {
- result.resize(3);
- result[2] = static_cast<char>(0x80 | (0x3f & cp));
- result[1] = 0x80 | static_cast<char>((0x3f & (cp >> 6)));
- result[0] = 0xE0 | static_cast<char>((0xf & (cp >> 12)));
- } else if (cp <= 0x10FFFF) {
- result.resize(4);
- result[3] = static_cast<char>(0x80 | (0x3f & cp));
- result[2] = static_cast<char>(0x80 | (0x3f & (cp >> 6)));
- result[1] = static_cast<char>(0x80 | (0x3f & (cp >> 12)));
- result[0] = static_cast<char>(0xF0 | (0x7 & (cp >> 18)));
- }
-
- return result;
-}
-
-/// Returns true if ch is a control character (in range [0,32[).
-static inline bool isControlCharacter(char ch) { return ch > 0 && ch <= 0x1F; }
-
-enum {
- /// Constant that specify the size of the buffer that must be passed to
- /// uintToString.
- uintToStringBufferSize = 3 * sizeof(LargestUInt) + 1
-};
-
-// Defines a char buffer for use with uintToString().
-typedef char UIntToStringBuffer[uintToStringBufferSize];
-
-/** Converts an unsigned integer to string.
- * @param value Unsigned interger to convert to string
- * @param current Input/Output string buffer.
- * Must have at least uintToStringBufferSize chars free.
- */
-static inline void uintToString(LargestUInt value, char*& current) {
- *--current = 0;
- do {
- *--current = char(value % 10) + '0';
- value /= 10;
- } while (value != 0);
-}
-
-/** Change ',' to '.' everywhere in buffer.
- *
- * We had a sophisticated way, but it did not work in WinCE.
- * @see https://github.com/open-source-parsers/jsoncpp/pull/9
- */
-static inline void fixNumericLocale(char* begin, char* end) {
- while (begin < end) {
- if (*begin == ',') {
- *begin = '.';
- }
- ++begin;
- }
-}
-
-} // namespace Json {
-
-#endif // LIB_JSONCPP_JSON_TOOL_H_INCLUDED
diff --git a/3rdparty/jsoncpp/src/lib_json/json_value.cpp b/3rdparty/jsoncpp/src/lib_json/json_value.cpp
deleted file mode 100644
index cc7d4d3d8ba..00000000000
--- a/3rdparty/jsoncpp/src/lib_json/json_value.cpp
+++ /dev/null
@@ -1,1544 +0,0 @@
-// Copyright 2011 Baptiste Lepilleur
-// Distributed under MIT license, or public domain if desired and
-// recognized in your jurisdiction.
-// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
-
-#if !defined(JSON_IS_AMALGAMATION)
-#include <json/assertions.h>
-#include <json/value.h>
-#include <json/writer.h>
-#endif // if !defined(JSON_IS_AMALGAMATION)
-#include <math.h>
-#include <sstream>
-#include <utility>
-#include <cstring>
-#include <cassert>
-#ifdef JSON_USE_CPPTL
-#include <cpptl/conststring.h>
-#endif
-#include <cstddef> // size_t
-#include <algorithm> // min()
-
-#define JSON_ASSERT_UNREACHABLE assert(false)
-
-namespace Json {
-
-// This is a walkaround to avoid the static initialization of Value::null.
-// kNull must be word-aligned to avoid crashing on ARM. We use an alignment of
-// 8 (instead of 4) as a bit of future-proofing.
-#if defined(__ARMEL__)
-#define ALIGNAS(byte_alignment) __attribute__((aligned(byte_alignment)))
-#else
-#define ALIGNAS(byte_alignment)
-#endif
-static const unsigned char ALIGNAS(8) kNull[sizeof(Value)] = { 0 };
-const unsigned char& kNullRef = kNull[0];
-const Value& Value::null = reinterpret_cast<const Value&>(kNullRef);
-const Value& Value::nullRef = null;
-
-const Int Value::minInt = Int(~(UInt(-1) / 2));
-const Int Value::maxInt = Int(UInt(-1) / 2);
-const UInt Value::maxUInt = UInt(-1);
-#if defined(JSON_HAS_INT64)
-const Int64 Value::minInt64 = Int64(~(UInt64(-1) / 2));
-const Int64 Value::maxInt64 = Int64(UInt64(-1) / 2);
-const UInt64 Value::maxUInt64 = UInt64(-1);
-// The constant is hard-coded because some compiler have trouble
-// converting Value::maxUInt64 to a double correctly (AIX/xlC).
-// Assumes that UInt64 is a 64 bits integer.
-static const double maxUInt64AsDouble = 18446744073709551615.0;
-#endif // defined(JSON_HAS_INT64)
-const LargestInt Value::minLargestInt = LargestInt(~(LargestUInt(-1) / 2));
-const LargestInt Value::maxLargestInt = LargestInt(LargestUInt(-1) / 2);
-const LargestUInt Value::maxLargestUInt = LargestUInt(-1);
-
-#if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
-template <typename T, typename U>
-static inline bool InRange(double d, T min, U max) {
- return d >= min && d <= max;
-}
-#else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
-static inline double integerToDouble(Json::UInt64 value) {
- return static_cast<double>(Int64(value / 2)) * 2.0 + Int64(value & 1);
-}
-
-template <typename T> static inline double integerToDouble(T value) {
- return static_cast<double>(value);
-}
-
-template <typename T, typename U>
-static inline bool InRange(double d, T min, U max) {
- return d >= integerToDouble(min) && d <= integerToDouble(max);
-}
-#endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
-
-/** Duplicates the specified string value.
- * @param value Pointer to the string to duplicate. Must be zero-terminated if
- * length is "unknown".
- * @param length Length of the value. if equals to unknown, then it will be
- * computed using strlen(value).
- * @return Pointer on the duplicate instance of string.
- */
-static inline char* duplicateStringValue(const char* value,
- size_t length) {
- // Avoid an integer overflow in the call to malloc below by limiting length
- // to a sane value.
- if (length >= (size_t)Value::maxInt)
- length = Value::maxInt - 1;
-
- char* newString = static_cast<char*>(malloc(length + 1));
- if (newString == NULL) {
- throwRuntimeError(
- "in Json::Value::duplicateStringValue(): "
- "Failed to allocate string value buffer");
- }
- memcpy(newString, value, length);
- newString[length] = 0;
- return newString;
-}
-
-/* Record the length as a prefix.
- */
-static inline char* duplicateAndPrefixStringValue(
- const char* value,
- unsigned int length)
-{
- // Avoid an integer overflow in the call to malloc below by limiting length
- // to a sane value.
- JSON_ASSERT_MESSAGE(length <= (unsigned)Value::maxInt - sizeof(unsigned) - 1U,
- "in Json::Value::duplicateAndPrefixStringValue(): "
- "length too big for prefixing");
- unsigned actualLength = length + sizeof(unsigned) + 1U;
- char* newString = static_cast<char*>(malloc(actualLength));
- if (newString == 0) {
- throwRuntimeError(
- "in Json::Value::duplicateAndPrefixStringValue(): "
- "Failed to allocate string value buffer");
- }
- *reinterpret_cast<unsigned*>(newString) = length;
- memcpy(newString + sizeof(unsigned), value, length);
- newString[actualLength - 1U] = 0; // to avoid buffer over-run accidents by users later
- return newString;
-}
-inline static void decodePrefixedString(
- bool isPrefixed, char const* prefixed,
- unsigned* length, char const** value)
-{
- if (!isPrefixed) {
- *length = static_cast<unsigned>(strlen(prefixed));
- *value = prefixed;
- } else {
- *length = *reinterpret_cast<unsigned const*>(prefixed);
- *value = prefixed + sizeof(unsigned);
- }
-}
-/** Free the string duplicated by duplicateStringValue()/duplicateAndPrefixStringValue().
- */
-static inline void releaseStringValue(char* value) { free(value); }
-
-} // namespace Json
-
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-// ValueInternals...
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-#if !defined(JSON_IS_AMALGAMATION)
-
-#include "json_valueiterator.inl"
-#endif // if !defined(JSON_IS_AMALGAMATION)
-
-namespace Json {
-
-class JSON_API Exception : public std::exception {
-public:
- Exception(std::string const& msg);
- virtual ~Exception() throw();
- virtual char const* what() const throw();
-protected:
- std::string const msg_;
-};
-class JSON_API RuntimeError : public Exception {
-public:
- RuntimeError(std::string const& msg);
-};
-class JSON_API LogicError : public Exception {
-public:
- LogicError(std::string const& msg);
-};
-
-Exception::Exception(std::string const& msg)
- : msg_(msg)
-{}
-Exception::~Exception() throw()
-{}
-char const* Exception::what() const throw()
-{
- return msg_.c_str();
-}
-RuntimeError::RuntimeError(std::string const& msg)
- : Exception(msg)
-{}
-LogicError::LogicError(std::string const& msg)
- : Exception(msg)
-{}
-void throwRuntimeError(std::string const& msg)
-{
- throw RuntimeError(msg);
-}
-void throwLogicError(std::string const& msg)
-{
- throw LogicError(msg);
-}
-
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-// class Value::CommentInfo
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-
-Value::CommentInfo::CommentInfo() : comment_(0) {}
-
-Value::CommentInfo::~CommentInfo() {
- if (comment_)
- releaseStringValue(comment_);
-}
-
-void Value::CommentInfo::setComment(const char* text, size_t len) {
- if (comment_) {
- releaseStringValue(comment_);
- comment_ = 0;
- }
- JSON_ASSERT(text != 0);
- JSON_ASSERT_MESSAGE(
- text[0] == '\0' || text[0] == '/',
- "in Json::Value::setComment(): Comments must start with /");
- // It seems that /**/ style comments are acceptable as well.
- comment_ = duplicateStringValue(text, len);
-}
-
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-// class Value::CZString
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-
-// Notes: policy_ indicates if the string was allocated when
-// a string is stored.
-
-Value::CZString::CZString(ArrayIndex index) : cstr_(0), index_(index) {}
-
-Value::CZString::CZString(char const* str, unsigned length, DuplicationPolicy allocate)
- : cstr_(str)
-{
- // allocate != duplicate
- storage_.policy_ = allocate;
- storage_.length_ = length;
-}
-
-Value::CZString::CZString(const CZString& other)
- : cstr_(other.storage_.policy_ != noDuplication && other.cstr_ != 0
- ? duplicateStringValue(other.cstr_, other.storage_.length_)
- : other.cstr_)
-{
- storage_.policy_ = (other.cstr_
- ? (other.storage_.policy_ == noDuplication
- ? noDuplication : duplicate)
- : other.storage_.policy_);
- storage_.length_ = other.storage_.length_;
-}
-
-Value::CZString::~CZString() {
- if (cstr_ && storage_.policy_ == duplicate)
- releaseStringValue(const_cast<char*>(cstr_));
-}
-
-void Value::CZString::swap(CZString& other) {
- std::swap(cstr_, other.cstr_);
- std::swap(index_, other.index_);
-}
-
-Value::CZString& Value::CZString::operator=(CZString other) {
- swap(other);
- return *this;
-}
-
-bool Value::CZString::operator<(const CZString& other) const {
- if (!cstr_) return index_ < other.index_;
- //return strcmp(cstr_, other.cstr_) < 0;
- // Assume both are strings.
- unsigned this_len = this->storage_.length_;
- unsigned other_len = other.storage_.length_;
- unsigned min_len = std::min(this_len, other_len);
- int comp = memcmp(this->cstr_, other.cstr_, min_len);
- if (comp < 0) return true;
- if (comp > 0) return false;
- return (this_len < other_len);
-}
-
-bool Value::CZString::operator==(const CZString& other) const {
- if (!cstr_) return index_ == other.index_;
- //return strcmp(cstr_, other.cstr_) == 0;
- // Assume both are strings.
- unsigned this_len = this->storage_.length_;
- unsigned other_len = other.storage_.length_;
- if (this_len != other_len) return false;
- int comp = memcmp(this->cstr_, other.cstr_, this_len);
- return comp == 0;
-}
-
-ArrayIndex Value::CZString::index() const { return index_; }
-
-//const char* Value::CZString::c_str() const { return cstr_; }
-const char* Value::CZString::data() const { return cstr_; }
-unsigned Value::CZString::length() const { return storage_.length_; }
-bool Value::CZString::isStaticString() const { return storage_.policy_ == noDuplication; }
-
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-// class Value::Value
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-
-/*! \internal Default constructor initialization must be equivalent to:
- * memset( this, 0, sizeof(Value) )
- * This optimization is used in ValueInternalMap fast allocator.
- */
-Value::Value(ValueType type) {
- initBasic(type);
- switch (type) {
- case nullValue:
- break;
- case intValue:
- case uintValue:
- value_.int_ = 0;
- break;
- case realValue:
- value_.real_ = 0.0;
- break;
- case stringValue:
- value_.string_ = 0;
- break;
- case arrayValue:
- case objectValue:
- value_.map_ = new ObjectValues();
- break;
- case booleanValue:
- value_.bool_ = false;
- break;
- default:
- JSON_ASSERT_UNREACHABLE;
- }
-}
-
-Value::Value(Int value) {
- initBasic(intValue);
- value_.int_ = value;
-}
-
-Value::Value(UInt value) {
- initBasic(uintValue);
- value_.uint_ = value;
-}
-#if defined(JSON_HAS_INT64)
-Value::Value(Int64 value) {
- initBasic(intValue);
- value_.int_ = value;
-}
-Value::Value(UInt64 value) {
- initBasic(uintValue);
- value_.uint_ = value;
-}
-#endif // defined(JSON_HAS_INT64)
-
-Value::Value(double value) {
- initBasic(realValue);
- value_.real_ = value;
-}
-
-Value::Value(const char* value) {
- initBasic(stringValue, true);
- value_.string_ = duplicateAndPrefixStringValue(value, static_cast<unsigned>(strlen(value)));
-}
-
-Value::Value(const char* beginValue, const char* endValue) {
- initBasic(stringValue, true);
- value_.string_ =
- duplicateAndPrefixStringValue(beginValue, static_cast<unsigned>(endValue - beginValue));
-}
-
-Value::Value(const std::string& value) {
- initBasic(stringValue, true);
- value_.string_ =
- duplicateAndPrefixStringValue(value.data(), static_cast<unsigned>(value.length()));
-}
-
-Value::Value(const StaticString& value) {
- initBasic(stringValue);
- value_.string_ = const_cast<char*>(value.c_str());
-}
-
-#ifdef JSON_USE_CPPTL
-Value::Value(const CppTL::ConstString& value) {
- initBasic(stringValue, true);
- value_.string_ = duplicateAndPrefixStringValue(value, static_cast<unsigned>(value.length()));
-}
-#endif
-
-Value::Value(bool value) {
- initBasic(booleanValue);
- value_.bool_ = value;
-}
-
-Value::Value(Value const& other)
- : type_(other.type_), allocated_(false)
- ,
- comments_(0), start_(other.start_), limit_(other.limit_)
-{
- switch (type_) {
- case nullValue:
- case intValue:
- case uintValue:
- case realValue:
- case booleanValue:
- value_ = other.value_;
- break;
- case stringValue:
- if (other.value_.string_ && other.allocated_) {
- unsigned len;
- char const* str;
- decodePrefixedString(other.allocated_, other.value_.string_,
- &len, &str);
- value_.string_ = duplicateAndPrefixStringValue(str, len);
- allocated_ = true;
- } else {
- value_.string_ = other.value_.string_;
- allocated_ = false;
- }
- break;
- case arrayValue:
- case objectValue:
- value_.map_ = new ObjectValues(*other.value_.map_);
- break;
- default:
- JSON_ASSERT_UNREACHABLE;
- }
- if (other.comments_) {
- comments_ = new CommentInfo[numberOfCommentPlacement];
- for (int comment = 0; comment < numberOfCommentPlacement; ++comment) {
- const CommentInfo& otherComment = other.comments_[comment];
- if (otherComment.comment_)
- comments_[comment].setComment(
- otherComment.comment_, strlen(otherComment.comment_));
- }
- }
-}
-
-Value::~Value() {
- switch (type_) {
- case nullValue:
- case intValue:
- case uintValue:
- case realValue:
- case booleanValue:
- break;
- case stringValue:
- if (allocated_)
- releaseStringValue(value_.string_);
- break;
- case arrayValue:
- case objectValue:
- delete value_.map_;
- break;
- default:
- JSON_ASSERT_UNREACHABLE;
- }
-
- if (comments_)
- delete[] comments_;
-}
-
-Value& Value::operator=(Value other) {
- swap(other);
- return *this;
-}
-
-void Value::swapPayload(Value& other) {
- ValueType temp = type_;
- type_ = other.type_;
- other.type_ = temp;
- std::swap(value_, other.value_);
- int temp2 = allocated_;
- allocated_ = other.allocated_;
- other.allocated_ = temp2;
-}
-
-void Value::swap(Value& other) {
- swapPayload(other);
- std::swap(comments_, other.comments_);
- std::swap(start_, other.start_);
- std::swap(limit_, other.limit_);
-}
-
-ValueType Value::type() const { return type_; }
-
-int Value::compare(const Value& other) const {
- if (*this < other)
- return -1;
- if (*this > other)
- return 1;
- return 0;
-}
-
-bool Value::operator<(const Value& other) const {
- int typeDelta = type_ - other.type_;
- if (typeDelta)
- return typeDelta < 0 ? true : false;
- switch (type_) {
- case nullValue:
- return false;
- case intValue:
- return value_.int_ < other.value_.int_;
- case uintValue:
- return value_.uint_ < other.value_.uint_;
- case realValue:
- return value_.real_ < other.value_.real_;
- case booleanValue:
- return value_.bool_ < other.value_.bool_;
- case stringValue:
- {
- if ((value_.string_ == 0) || (other.value_.string_ == 0)) {
- if (other.value_.string_) return true;
- else return false;
- }
- unsigned this_len;
- unsigned other_len;
- char const* this_str;
- char const* other_str;
- decodePrefixedString(this->allocated_, this->value_.string_, &this_len, &this_str);
- decodePrefixedString(other.allocated_, other.value_.string_, &other_len, &other_str);
- unsigned min_len = std::min(this_len, other_len);
- int comp = memcmp(this_str, other_str, min_len);
- if (comp < 0) return true;
- if (comp > 0) return false;
- return (this_len < other_len);
- }
- case arrayValue:
- case objectValue: {
- int delta = int(value_.map_->size() - other.value_.map_->size());
- if (delta)
- return delta < 0;
- return (*value_.map_) < (*other.value_.map_);
- }
- default:
- JSON_ASSERT_UNREACHABLE;
- }
- return false; // unreachable
-}
-
-bool Value::operator<=(const Value& other) const { return !(other < *this); }
-
-bool Value::operator>=(const Value& other) const { return !(*this < other); }
-
-bool Value::operator>(const Value& other) const { return other < *this; }
-
-bool Value::operator==(const Value& other) const {
- // if ( type_ != other.type_ )
- // GCC 2.95.3 says:
- // attempt to take address of bit-field structure member `Json::Value::type_'
- // Beats me, but a temp solves the problem.
- int temp = other.type_;
- if (type_ != temp)
- return false;
- switch (type_) {
- case nullValue:
- return true;
- case intValue:
- return value_.int_ == other.value_.int_;
- case uintValue:
- return value_.uint_ == other.value_.uint_;
- case realValue:
- return value_.real_ == other.value_.real_;
- case booleanValue:
- return value_.bool_ == other.value_.bool_;
- case stringValue:
- {
- if ((value_.string_ == 0) || (other.value_.string_ == 0)) {
- return (value_.string_ == other.value_.string_);
- }
- unsigned this_len;
- unsigned other_len;
- char const* this_str;
- char const* other_str;
- decodePrefixedString(this->allocated_, this->value_.string_, &this_len, &this_str);
- decodePrefixedString(other.allocated_, other.value_.string_, &other_len, &other_str);
- if (this_len != other_len) return false;
- int comp = memcmp(this_str, other_str, this_len);
- return comp == 0;
- }
- case arrayValue:
- case objectValue:
- return value_.map_->size() == other.value_.map_->size() &&
- (*value_.map_) == (*other.value_.map_);
- default:
- JSON_ASSERT_UNREACHABLE;
- }
- return false; // unreachable
-}
-
-bool Value::operator!=(const Value& other) const { return !(*this == other); }
-
-const char* Value::asCString() const {
- JSON_ASSERT_MESSAGE(type_ == stringValue,
- "in Json::Value::asCString(): requires stringValue");
- if (value_.string_ == 0) return 0;
- unsigned this_len;
- char const* this_str;
- decodePrefixedString(this->allocated_, this->value_.string_, &this_len, &this_str);
- return this_str;
-}
-
-bool Value::getString(char const** str, char const** end) const {
- if (type_ != stringValue) return false;
- if (value_.string_ == 0) return false;
- unsigned length;
- decodePrefixedString(this->allocated_, this->value_.string_, &length, str);
- *end = *str + length;
- return true;
-}
-
-std::string Value::asString() const {
- switch (type_) {
- case nullValue:
- return "";
- case stringValue:
- {
- if (value_.string_ == 0) return "";
- unsigned this_len;
- char const* this_str;
- decodePrefixedString(this->allocated_, this->value_.string_, &this_len, &this_str);
- return std::string(this_str, this_len);
- }
- case booleanValue:
- return value_.bool_ ? "true" : "false";
- case intValue:
- return valueToString(value_.int_);
- case uintValue:
- return valueToString(value_.uint_);
- case realValue:
- return valueToString(value_.real_);
- default:
- JSON_FAIL_MESSAGE("Type is not convertible to string");
- }
-}
-
-#ifdef JSON_USE_CPPTL
-CppTL::ConstString Value::asConstString() const {
- unsigned len;
- char const* str;
- decodePrefixedString(allocated_, value_.string_,
- &len, &str);
- return CppTL::ConstString(str, len);
-}
-#endif
-
-Value::Int Value::asInt() const {
- switch (type_) {
- case intValue:
- JSON_ASSERT_MESSAGE(isInt(), "LargestInt out of Int range");
- return Int(value_.int_);
- case uintValue:
- JSON_ASSERT_MESSAGE(isInt(), "LargestUInt out of Int range");
- return Int(value_.uint_);
- case realValue:
- JSON_ASSERT_MESSAGE(InRange(value_.real_, minInt, maxInt),
- "double out of Int range");
- return Int(value_.real_);
- case nullValue:
- return 0;
- case booleanValue:
- return value_.bool_ ? 1 : 0;
- default:
- break;
- }
- JSON_FAIL_MESSAGE("Value is not convertible to Int.");
-}
-
-Value::UInt Value::asUInt() const {
- switch (type_) {
- case intValue:
- JSON_ASSERT_MESSAGE(isUInt(), "LargestInt out of UInt range");
- return UInt(value_.int_);
- case uintValue:
- JSON_ASSERT_MESSAGE(isUInt(), "LargestUInt out of UInt range");
- return UInt(value_.uint_);
- case realValue:
- JSON_ASSERT_MESSAGE(InRange(value_.real_, 0, maxUInt),
- "double out of UInt range");
- return UInt(value_.real_);
- case nullValue:
- return 0;
- case booleanValue:
- return value_.bool_ ? 1 : 0;
- default:
- break;
- }
- JSON_FAIL_MESSAGE("Value is not convertible to UInt.");
-}
-
-#if defined(JSON_HAS_INT64)
-
-Value::Int64 Value::asInt64() const {
- switch (type_) {
- case intValue:
- return Int64(value_.int_);
- case uintValue:
- JSON_ASSERT_MESSAGE(isInt64(), "LargestUInt out of Int64 range");
- return Int64(value_.uint_);
- case realValue:
- JSON_ASSERT_MESSAGE(InRange(value_.real_, minInt64, maxInt64),
- "double out of Int64 range");
- return Int64(value_.real_);
- case nullValue:
- return 0;
- case booleanValue:
- return value_.bool_ ? 1 : 0;
- default:
- break;
- }
- JSON_FAIL_MESSAGE("Value is not convertible to Int64.");
-}
-
-Value::UInt64 Value::asUInt64() const {
- switch (type_) {
- case intValue:
- JSON_ASSERT_MESSAGE(isUInt64(), "LargestInt out of UInt64 range");
- return UInt64(value_.int_);
- case uintValue:
- return UInt64(value_.uint_);
- case realValue:
- JSON_ASSERT_MESSAGE(InRange(value_.real_, 0, maxUInt64),
- "double out of UInt64 range");
- return UInt64(value_.real_);
- case nullValue:
- return 0;
- case booleanValue:
- return value_.bool_ ? 1 : 0;
- default:
- break;
- }
- JSON_FAIL_MESSAGE("Value is not convertible to UInt64.");
-}
-#endif // if defined(JSON_HAS_INT64)
-
-LargestInt Value::asLargestInt() const {
-#if defined(JSON_NO_INT64)
- return asInt();
-#else
- return asInt64();
-#endif
-}
-
-LargestUInt Value::asLargestUInt() const {
-#if defined(JSON_NO_INT64)
- return asUInt();
-#else
- return asUInt64();
-#endif
-}
-
-double Value::asDouble() const {
- switch (type_) {
- case intValue:
- return static_cast<double>(value_.int_);
- case uintValue:
-#if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
- return static_cast<double>(value_.uint_);
-#else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
- return integerToDouble(value_.uint_);
-#endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
- case realValue:
- return value_.real_;
- case nullValue:
- return 0.0;
- case booleanValue:
- return value_.bool_ ? 1.0 : 0.0;
- default:
- break;
- }
- JSON_FAIL_MESSAGE("Value is not convertible to double.");
-}
-
-float Value::asFloat() const {
- switch (type_) {
- case intValue:
- return static_cast<float>(value_.int_);
- case uintValue:
-#if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
- return static_cast<float>(value_.uint_);
-#else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
- return integerToDouble(value_.uint_);
-#endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
- case realValue:
- return static_cast<float>(value_.real_);
- case nullValue:
- return 0.0;
- case booleanValue:
- return value_.bool_ ? 1.0f : 0.0f;
- default:
- break;
- }
- JSON_FAIL_MESSAGE("Value is not convertible to float.");
-}
-
-bool Value::asBool() const {
- switch (type_) {
- case booleanValue:
- return value_.bool_;
- case nullValue:
- return false;
- case intValue:
- return value_.int_ ? true : false;
- case uintValue:
- return value_.uint_ ? true : false;
- case realValue:
- return value_.real_ ? true : false;
- default:
- break;
- }
- JSON_FAIL_MESSAGE("Value is not convertible to bool.");
-}
-
-bool Value::isConvertibleTo(ValueType other) const {
- switch (other) {
- case nullValue:
- return (isNumeric() && asDouble() == 0.0) ||
- (type_ == booleanValue && value_.bool_ == false) ||
- (type_ == stringValue && asString() == "") ||
- (type_ == arrayValue && value_.map_->size() == 0) ||
- (type_ == objectValue && value_.map_->size() == 0) ||
- type_ == nullValue;
- case intValue:
- return isInt() ||
- (type_ == realValue && InRange(value_.real_, minInt, maxInt)) ||
- type_ == booleanValue || type_ == nullValue;
- case uintValue:
- return isUInt() ||
- (type_ == realValue && InRange(value_.real_, 0, maxUInt)) ||
- type_ == booleanValue || type_ == nullValue;
- case realValue:
- return isNumeric() || type_ == booleanValue || type_ == nullValue;
- case booleanValue:
- return isNumeric() || type_ == booleanValue || type_ == nullValue;
- case stringValue:
- return isNumeric() || type_ == booleanValue || type_ == stringValue ||
- type_ == nullValue;
- case arrayValue:
- return type_ == arrayValue || type_ == nullValue;
- case objectValue:
- return type_ == objectValue || type_ == nullValue;
- }
- JSON_ASSERT_UNREACHABLE;
- return false;
-}
-
-/// Number of values in array or object
-ArrayIndex Value::size() const {
- switch (type_) {
- case nullValue:
- case intValue:
- case uintValue:
- case realValue:
- case booleanValue:
- case stringValue:
- return 0;
- case arrayValue: // size of the array is highest index + 1
- if (!value_.map_->empty()) {
- ObjectValues::const_iterator itLast = value_.map_->end();
- --itLast;
- return (*itLast).first.index() + 1;
- }
- return 0;
- case objectValue:
- return ArrayIndex(value_.map_->size());
- }
- JSON_ASSERT_UNREACHABLE;
- return 0; // unreachable;
-}
-
-bool Value::empty() const {
- if (isNull() || isArray() || isObject())
- return size() == 0u;
- else
- return false;
-}
-
-bool Value::operator!() const { return isNull(); }
-
-void Value::clear() {
- JSON_ASSERT_MESSAGE(type_ == nullValue || type_ == arrayValue ||
- type_ == objectValue,
- "in Json::Value::clear(): requires complex value");
- start_ = 0;
- limit_ = 0;
- switch (type_) {
- case arrayValue:
- case objectValue:
- value_.map_->clear();
- break;
- default:
- break;
- }
-}
-
-void Value::resize(ArrayIndex newSize) {
- JSON_ASSERT_MESSAGE(type_ == nullValue || type_ == arrayValue,
- "in Json::Value::resize(): requires arrayValue");
- if (type_ == nullValue)
- *this = Value(arrayValue);
- ArrayIndex oldSize = size();
- if (newSize == 0)
- clear();
- else if (newSize > oldSize)
- (*this)[newSize - 1];
- else {
- for (ArrayIndex index = newSize; index < oldSize; ++index) {
- value_.map_->erase(index);
- }
- assert(size() == newSize);
- }
-}
-
-Value& Value::operator[](ArrayIndex index) {
- JSON_ASSERT_MESSAGE(
- type_ == nullValue || type_ == arrayValue,
- "in Json::Value::operator[](ArrayIndex): requires arrayValue");
- if (type_ == nullValue)
- *this = Value(arrayValue);
- CZString key(index);
- ObjectValues::iterator it = value_.map_->lower_bound(key);
- if (it != value_.map_->end() && (*it).first == key)
- return (*it).second;
-
- ObjectValues::value_type defaultValue(key, nullRef);
- it = value_.map_->insert(it, defaultValue);
- return (*it).second;
-}
-
-Value& Value::operator[](int index) {
- JSON_ASSERT_MESSAGE(
- index >= 0,
- "in Json::Value::operator[](int index): index cannot be negative");
- return (*this)[ArrayIndex(index)];
-}
-
-const Value& Value::operator[](ArrayIndex index) const {
- JSON_ASSERT_MESSAGE(
- type_ == nullValue || type_ == arrayValue,
- "in Json::Value::operator[](ArrayIndex)const: requires arrayValue");
- if (type_ == nullValue)
- return nullRef;
- CZString key(index);
- ObjectValues::const_iterator it = value_.map_->find(key);
- if (it == value_.map_->end())
- return nullRef;
- return (*it).second;
-}
-
-const Value& Value::operator[](int index) const {
- JSON_ASSERT_MESSAGE(
- index >= 0,
- "in Json::Value::operator[](int index) const: index cannot be negative");
- return (*this)[ArrayIndex(index)];
-}
-
-void Value::initBasic(ValueType type, bool allocated) {
- type_ = type;
- allocated_ = allocated;
- comments_ = 0;
- start_ = 0;
- limit_ = 0;
-}
-
-// Access an object value by name, create a null member if it does not exist.
-// @pre Type of '*this' is object or null.
-// @param key is null-terminated.
-Value& Value::resolveReference(const char* key) {
- JSON_ASSERT_MESSAGE(
- type_ == nullValue || type_ == objectValue,
- "in Json::Value::resolveReference(): requires objectValue");
- if (type_ == nullValue)
- *this = Value(objectValue);
- CZString actualKey(
- key, static_cast<unsigned>(strlen(key)), CZString::noDuplication); // NOTE!
- ObjectValues::iterator it = value_.map_->lower_bound(actualKey);
- if (it != value_.map_->end() && (*it).first == actualKey)
- return (*it).second;
-
- ObjectValues::value_type defaultValue(actualKey, nullRef);
- it = value_.map_->insert(it, defaultValue);
- Value& value = (*it).second;
- return value;
-}
-
-// @param key is not null-terminated.
-Value& Value::resolveReference(char const* key, char const* end)
-{
- JSON_ASSERT_MESSAGE(
- type_ == nullValue || type_ == objectValue,
- "in Json::Value::resolveReference(key, end): requires objectValue");
- if (type_ == nullValue)
- *this = Value(objectValue);
- CZString actualKey(
- key, static_cast<unsigned>(end-key), CZString::duplicateOnCopy);
- ObjectValues::iterator it = value_.map_->lower_bound(actualKey);
- if (it != value_.map_->end() && (*it).first == actualKey)
- return (*it).second;
-
- ObjectValues::value_type defaultValue(actualKey, nullRef);
- it = value_.map_->insert(it, defaultValue);
- Value& value = (*it).second;
- return value;
-}
-
-Value Value::get(ArrayIndex index, const Value& defaultValue) const {
- const Value* value = &((*this)[index]);
- return value == &nullRef ? defaultValue : *value;
-}
-
-bool Value::isValidIndex(ArrayIndex index) const { return index < size(); }
-
-Value const* Value::find(char const* key, char const* end) const
-{
- JSON_ASSERT_MESSAGE(
- type_ == nullValue || type_ == objectValue,
- "in Json::Value::find(key, end, found): requires objectValue or nullValue");
- if (type_ == nullValue) return NULL;
- CZString actualKey(key, static_cast<unsigned>(end-key), CZString::noDuplication);
- ObjectValues::const_iterator it = value_.map_->find(actualKey);
- if (it == value_.map_->end()) return NULL;
- return &(*it).second;
-}
-const Value& Value::operator[](const char* key) const
-{
- Value const* found = find(key, key + strlen(key));
- if (!found) return nullRef;
- return *found;
-}
-Value const& Value::operator[](std::string const& key) const
-{
- Value const* found = find(key.data(), key.data() + key.length());
- if (!found) return nullRef;
- return *found;
-}
-
-Value& Value::operator[](const char* key) {
- return resolveReference(key, key + strlen(key));
-}
-
-Value& Value::operator[](const std::string& key) {
- return resolveReference(key.data(), key.data() + key.length());
-}
-
-Value& Value::operator[](const StaticString& key) {
- return resolveReference(key.c_str());
-}
-
-#ifdef JSON_USE_CPPTL
-Value& Value::operator[](const CppTL::ConstString& key) {
- return resolveReference(key.c_str(), key.end_c_str());
-}
-Value const& Value::operator[](CppTL::ConstString const& key) const
-{
- Value const* found = find(key.c_str(), key.end_c_str());
- if (!found) return nullRef;
- return *found;
-}
-#endif
-
-Value& Value::append(const Value& value) { return (*this)[size()] = value; }
-
-Value Value::get(char const* key, char const* end, Value const& defaultValue) const
-{
- Value const* found = find(key, end);
- return !found ? defaultValue : *found;
-}
-Value Value::get(char const* key, Value const& defaultValue) const
-{
- return get(key, key + strlen(key), defaultValue);
-}
-Value Value::get(std::string const& key, Value const& defaultValue) const
-{
- return get(key.data(), key.data() + key.length(), defaultValue);
-}
-
-
-bool Value::removeMember(const char* key, const char* end, Value* removed)
-{
- if (type_ != objectValue) {
- return false;
- }
- CZString actualKey(key, static_cast<unsigned>(end-key), CZString::noDuplication);
- ObjectValues::iterator it = value_.map_->find(actualKey);
- if (it == value_.map_->end())
- return false;
- *removed = it->second;
- value_.map_->erase(it);
- return true;
-}
-bool Value::removeMember(const char* key, Value* removed)
-{
- return removeMember(key, key + strlen(key), removed);
-}
-bool Value::removeMember(std::string const& key, Value* removed)
-{
- return removeMember(key.data(), key.data() + key.length(), removed);
-}
-Value Value::removeMember(const char* key)
-{
- JSON_ASSERT_MESSAGE(type_ == nullValue || type_ == objectValue,
- "in Json::Value::removeMember(): requires objectValue");
- if (type_ == nullValue)
- return nullRef;
-
- Value removed; // null
- removeMember(key, key + strlen(key), &removed);
- return removed; // still null if removeMember() did nothing
-}
-Value Value::removeMember(const std::string& key)
-{
- return removeMember(key.c_str());
-}
-
-bool Value::removeIndex(ArrayIndex index, Value* removed) {
- if (type_ != arrayValue) {
- return false;
- }
- CZString key(index);
- ObjectValues::iterator it = value_.map_->find(key);
- if (it == value_.map_->end()) {
- return false;
- }
- *removed = it->second;
- ArrayIndex oldSize = size();
- // shift left all items left, into the place of the "removed"
- for (ArrayIndex i = index; i < (oldSize - 1); ++i){
- CZString key(i);
- (*value_.map_)[key] = (*this)[i + 1];
- }
- // erase the last one ("leftover")
- CZString keyLast(oldSize - 1);
- ObjectValues::iterator itLast = value_.map_->find(keyLast);
- value_.map_->erase(itLast);
- return true;
-}
-
-#ifdef JSON_USE_CPPTL
-Value Value::get(const CppTL::ConstString& key,
- const Value& defaultValue) const {
- return get(key.c_str(), key.end_c_str(), defaultValue);
-}
-#endif
-
-bool Value::isMember(char const* key, char const* end) const
-{
- Value const* value = find(key, end);
- return NULL != value;
-}
-bool Value::isMember(char const* key) const
-{
- return isMember(key, key + strlen(key));
-}
-bool Value::isMember(std::string const& key) const
-{
- return isMember(key.data(), key.data() + key.length());
-}
-
-#ifdef JSON_USE_CPPTL
-bool Value::isMember(const CppTL::ConstString& key) const {
- return isMember(key.c_str(), key.end_c_str());
-}
-#endif
-
-Value::Members Value::getMemberNames() const {
- JSON_ASSERT_MESSAGE(
- type_ == nullValue || type_ == objectValue,
- "in Json::Value::getMemberNames(), value must be objectValue");
- if (type_ == nullValue)
- return Value::Members();
- Members members;
- members.reserve(value_.map_->size());
- ObjectValues::const_iterator it = value_.map_->begin();
- ObjectValues::const_iterator itEnd = value_.map_->end();
- for (; it != itEnd; ++it) {
- members.push_back(std::string((*it).first.data(),
- (*it).first.length()));
- }
- return members;
-}
-//
-//# ifdef JSON_USE_CPPTL
-// EnumMemberNames
-// Value::enumMemberNames() const
-//{
-// if ( type_ == objectValue )
-// {
-// return CppTL::Enum::any( CppTL::Enum::transform(
-// CppTL::Enum::keys( *(value_.map_), CppTL::Type<const CZString &>() ),
-// MemberNamesTransform() ) );
-// }
-// return EnumMemberNames();
-//}
-//
-//
-// EnumValues
-// Value::enumValues() const
-//{
-// if ( type_ == objectValue || type_ == arrayValue )
-// return CppTL::Enum::anyValues( *(value_.map_),
-// CppTL::Type<const Value &>() );
-// return EnumValues();
-//}
-//
-//# endif
-
-static bool IsIntegral(double d) {
- double integral_part;
- return modf(d, &integral_part) == 0.0;
-}
-
-bool Value::isNull() const { return type_ == nullValue; }
-
-bool Value::isBool() const { return type_ == booleanValue; }
-
-bool Value::isInt() const {
- switch (type_) {
- case intValue:
- return value_.int_ >= minInt && value_.int_ <= maxInt;
- case uintValue:
- return value_.uint_ <= UInt(maxInt);
- case realValue:
- return value_.real_ >= minInt && value_.real_ <= maxInt &&
- IsIntegral(value_.real_);
- default:
- break;
- }
- return false;
-}
-
-bool Value::isUInt() const {
- switch (type_) {
- case intValue:
- return value_.int_ >= 0 && LargestUInt(value_.int_) <= LargestUInt(maxUInt);
- case uintValue:
- return value_.uint_ <= maxUInt;
- case realValue:
- return value_.real_ >= 0 && value_.real_ <= maxUInt &&
- IsIntegral(value_.real_);
- default:
- break;
- }
- return false;
-}
-
-bool Value::isInt64() const {
-#if defined(JSON_HAS_INT64)
- switch (type_) {
- case intValue:
- return true;
- case uintValue:
- return value_.uint_ <= UInt64(maxInt64);
- case realValue:
- // Note that maxInt64 (= 2^63 - 1) is not exactly representable as a
- // double, so double(maxInt64) will be rounded up to 2^63. Therefore we
- // require the value to be strictly less than the limit.
- return value_.real_ >= double(minInt64) &&
- value_.real_ < double(maxInt64) && IsIntegral(value_.real_);
- default:
- break;
- }
-#endif // JSON_HAS_INT64
- return false;
-}
-
-bool Value::isUInt64() const {
-#if defined(JSON_HAS_INT64)
- switch (type_) {
- case intValue:
- return value_.int_ >= 0;
- case uintValue:
- return true;
- case realValue:
- // Note that maxUInt64 (= 2^64 - 1) is not exactly representable as a
- // double, so double(maxUInt64) will be rounded up to 2^64. Therefore we
- // require the value to be strictly less than the limit.
- return value_.real_ >= 0 && value_.real_ < maxUInt64AsDouble &&
- IsIntegral(value_.real_);
- default:
- break;
- }
-#endif // JSON_HAS_INT64
- return false;
-}
-
-bool Value::isIntegral() const {
-#if defined(JSON_HAS_INT64)
- return isInt64() || isUInt64();
-#else
- return isInt() || isUInt();
-#endif
-}
-
-bool Value::isDouble() const { return type_ == realValue || isIntegral(); }
-
-bool Value::isNumeric() const { return isIntegral() || isDouble(); }
-
-bool Value::isString() const { return type_ == stringValue; }
-
-bool Value::isArray() const { return type_ == arrayValue; }
-
-bool Value::isObject() const { return type_ == objectValue; }
-
-void Value::setComment(const char* comment, size_t len, CommentPlacement placement) {
- if (!comments_)
- comments_ = new CommentInfo[numberOfCommentPlacement];
- if ((len > 0) && (comment[len-1] == '\n')) {
- // Always discard trailing newline, to aid indentation.
- len -= 1;
- }
- comments_[placement].setComment(comment, len);
-}
-
-void Value::setComment(const char* comment, CommentPlacement placement) {
- setComment(comment, strlen(comment), placement);
-}
-
-void Value::setComment(const std::string& comment, CommentPlacement placement) {
- setComment(comment.c_str(), comment.length(), placement);
-}
-
-bool Value::hasComment(CommentPlacement placement) const {
- return comments_ != 0 && comments_[placement].comment_ != 0;
-}
-
-std::string Value::getComment(CommentPlacement placement) const {
- if (hasComment(placement))
- return comments_[placement].comment_;
- return "";
-}
-
-void Value::setOffsetStart(size_t start) { start_ = start; }
-
-void Value::setOffsetLimit(size_t limit) { limit_ = limit; }
-
-size_t Value::getOffsetStart() const { return start_; }
-
-size_t Value::getOffsetLimit() const { return limit_; }
-
-std::string Value::toStyledString() const {
- StyledWriter writer;
- return writer.write(*this);
-}
-
-Value::const_iterator Value::begin() const {
- switch (type_) {
- case arrayValue:
- case objectValue:
- if (value_.map_)
- return const_iterator(value_.map_->begin());
- break;
- default:
- break;
- }
- return const_iterator();
-}
-
-Value::const_iterator Value::end() const {
- switch (type_) {
- case arrayValue:
- case objectValue:
- if (value_.map_)
- return const_iterator(value_.map_->end());
- break;
- default:
- break;
- }
- return const_iterator();
-}
-
-Value::iterator Value::begin() {
- switch (type_) {
- case arrayValue:
- case objectValue:
- if (value_.map_)
- return iterator(value_.map_->begin());
- break;
- default:
- break;
- }
- return iterator();
-}
-
-Value::iterator Value::end() {
- switch (type_) {
- case arrayValue:
- case objectValue:
- if (value_.map_)
- return iterator(value_.map_->end());
- break;
- default:
- break;
- }
- return iterator();
-}
-
-// class PathArgument
-// //////////////////////////////////////////////////////////////////
-
-PathArgument::PathArgument() : key_(), index_(), kind_(kindNone) {}
-
-PathArgument::PathArgument(ArrayIndex index)
- : key_(), index_(index), kind_(kindIndex) {}
-
-PathArgument::PathArgument(const char* key)
- : key_(key), index_(), kind_(kindKey) {}
-
-PathArgument::PathArgument(const std::string& key)
- : key_(key.c_str()), index_(), kind_(kindKey) {}
-
-// class Path
-// //////////////////////////////////////////////////////////////////
-
-Path::Path(const std::string& path,
- const PathArgument& a1,
- const PathArgument& a2,
- const PathArgument& a3,
- const PathArgument& a4,
- const PathArgument& a5) {
- InArgs in;
- in.push_back(&a1);
- in.push_back(&a2);
- in.push_back(&a3);
- in.push_back(&a4);
- in.push_back(&a5);
- makePath(path, in);
-}
-
-void Path::makePath(const std::string& path, const InArgs& in) {
- const char* current = path.c_str();
- const char* end = current + path.length();
- InArgs::const_iterator itInArg = in.begin();
- while (current != end) {
- if (*current == '[') {
- ++current;
- if (*current == '%')
- addPathInArg(path, in, itInArg, PathArgument::kindIndex);
- else {
- ArrayIndex index = 0;
- for (; current != end && *current >= '0' && *current <= '9'; ++current)
- index = index * 10 + ArrayIndex(*current - '0');
- args_.push_back(index);
- }
- if (current == end || *current++ != ']')
- invalidPath(path, int(current - path.c_str()));
- } else if (*current == '%') {
- addPathInArg(path, in, itInArg, PathArgument::kindKey);
- ++current;
- } else if (*current == '.') {
- ++current;
- } else {
- const char* beginName = current;
- while (current != end && !strchr("[.", *current))
- ++current;
- args_.push_back(std::string(beginName, current));
- }
- }
-}
-
-void Path::addPathInArg(const std::string& /*path*/,
- const InArgs& in,
- InArgs::const_iterator& itInArg,
- PathArgument::Kind kind) {
- if (itInArg == in.end()) {
- // Error: missing argument %d
- } else if ((*itInArg)->kind_ != kind) {
- // Error: bad argument type
- } else {
- args_.push_back(**itInArg);
- }
-}
-
-void Path::invalidPath(const std::string& /*path*/, int /*location*/) {
- // Error: invalid path.
-}
-
-const Value& Path::resolve(const Value& root) const {
- const Value* node = &root;
- for (Args::const_iterator it = args_.begin(); it != args_.end(); ++it) {
- const PathArgument& arg = *it;
- if (arg.kind_ == PathArgument::kindIndex) {
- if (!node->isArray() || !node->isValidIndex(arg.index_)) {
- // Error: unable to resolve path (array value expected at position...
- }
- node = &((*node)[arg.index_]);
- } else if (arg.kind_ == PathArgument::kindKey) {
- if (!node->isObject()) {
- // Error: unable to resolve path (object value expected at position...)
- }
- node = &((*node)[arg.key_]);
- if (node == &Value::nullRef) {
- // Error: unable to resolve path (object has no member named '' at
- // position...)
- }
- }
- }
- return *node;
-}
-
-Value Path::resolve(const Value& root, const Value& defaultValue) const {
- const Value* node = &root;
- for (Args::const_iterator it = args_.begin(); it != args_.end(); ++it) {
- const PathArgument& arg = *it;
- if (arg.kind_ == PathArgument::kindIndex) {
- if (!node->isArray() || !node->isValidIndex(arg.index_))
- return defaultValue;
- node = &((*node)[arg.index_]);
- } else if (arg.kind_ == PathArgument::kindKey) {
- if (!node->isObject())
- return defaultValue;
- node = &((*node)[arg.key_]);
- if (node == &Value::nullRef)
- return defaultValue;
- }
- }
- return *node;
-}
-
-Value& Path::make(Value& root) const {
- Value* node = &root;
- for (Args::const_iterator it = args_.begin(); it != args_.end(); ++it) {
- const PathArgument& arg = *it;
- if (arg.kind_ == PathArgument::kindIndex) {
- if (!node->isArray()) {
- // Error: node is not an array at position ...
- }
- node = &((*node)[arg.index_]);
- } else if (arg.kind_ == PathArgument::kindKey) {
- if (!node->isObject()) {
- // Error: node is not an object at position...
- }
- node = &((*node)[arg.key_]);
- }
- }
- return *node;
-}
-
-} // namespace Json
diff --git a/3rdparty/jsoncpp/src/lib_json/json_valueiterator.inl b/3rdparty/jsoncpp/src/lib_json/json_valueiterator.inl
deleted file mode 100644
index d01d3c018c9..00000000000
--- a/3rdparty/jsoncpp/src/lib_json/json_valueiterator.inl
+++ /dev/null
@@ -1,162 +0,0 @@
-// Copyright 2007-2010 Baptiste Lepilleur
-// Distributed under MIT license, or public domain if desired and
-// recognized in your jurisdiction.
-// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
-
-// included by json_value.cpp
-
-namespace Json {
-
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-// class ValueIteratorBase
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-
-ValueIteratorBase::ValueIteratorBase()
- : current_(), isNull_(true) {
-}
-
-ValueIteratorBase::ValueIteratorBase(
- const Value::ObjectValues::iterator& current)
- : current_(current), isNull_(false) {}
-
-Value& ValueIteratorBase::deref() const {
- return current_->second;
-}
-
-void ValueIteratorBase::increment() {
- ++current_;
-}
-
-void ValueIteratorBase::decrement() {
- --current_;
-}
-
-ValueIteratorBase::difference_type
-ValueIteratorBase::computeDistance(const SelfType& other) const {
-#ifdef JSON_USE_CPPTL_SMALLMAP
- return other.current_ - current_;
-#else
- // Iterator for null value are initialized using the default
- // constructor, which initialize current_ to the default
- // std::map::iterator. As begin() and end() are two instance
- // of the default std::map::iterator, they can not be compared.
- // To allow this, we handle this comparison specifically.
- if (isNull_ && other.isNull_) {
- return 0;
- }
-
- // Usage of std::distance is not portable (does not compile with Sun Studio 12
- // RogueWave STL,
- // which is the one used by default).
- // Using a portable hand-made version for non random iterator instead:
- // return difference_type( std::distance( current_, other.current_ ) );
- difference_type myDistance = 0;
- for (Value::ObjectValues::iterator it = current_; it != other.current_;
- ++it) {
- ++myDistance;
- }
- return myDistance;
-#endif
-}
-
-bool ValueIteratorBase::isEqual(const SelfType& other) const {
- if (isNull_) {
- return other.isNull_;
- }
- return current_ == other.current_;
-}
-
-void ValueIteratorBase::copy(const SelfType& other) {
- current_ = other.current_;
- isNull_ = other.isNull_;
-}
-
-Value ValueIteratorBase::key() const {
- const Value::CZString czstring = (*current_).first;
- if (czstring.data()) {
- if (czstring.isStaticString())
- return Value(StaticString(czstring.data()));
- return Value(czstring.data(), czstring.data() + czstring.length());
- }
- return Value(czstring.index());
-}
-
-UInt ValueIteratorBase::index() const {
- const Value::CZString czstring = (*current_).first;
- if (!czstring.data())
- return czstring.index();
- return Value::UInt(-1);
-}
-
-std::string ValueIteratorBase::name() const {
- char const* key;
- char const* end;
- key = memberName(&end);
- if (!key) return std::string();
- return std::string(key, end);
-}
-
-char const* ValueIteratorBase::memberName() const {
- const char* name = (*current_).first.data();
- return name ? name : "";
-}
-
-char const* ValueIteratorBase::memberName(char const** end) const {
- const char* name = (*current_).first.data();
- if (!name) {
- *end = NULL;
- return NULL;
- }
- *end = name + (*current_).first.length();
- return name;
-}
-
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-// class ValueConstIterator
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-
-ValueConstIterator::ValueConstIterator() {}
-
-ValueConstIterator::ValueConstIterator(
- const Value::ObjectValues::iterator& current)
- : ValueIteratorBase(current) {}
-
-ValueConstIterator& ValueConstIterator::
-operator=(const ValueIteratorBase& other) {
- copy(other);
- return *this;
-}
-
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-// class ValueIterator
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-
-ValueIterator::ValueIterator() {}
-
-ValueIterator::ValueIterator(const Value::ObjectValues::iterator& current)
- : ValueIteratorBase(current) {}
-
-ValueIterator::ValueIterator(const ValueConstIterator& other)
- : ValueIteratorBase(other) {}
-
-ValueIterator::ValueIterator(const ValueIterator& other)
- : ValueIteratorBase(other) {}
-
-ValueIterator& ValueIterator::operator=(const SelfType& other) {
- copy(other);
- return *this;
-}
-
-} // namespace Json
diff --git a/3rdparty/jsoncpp/src/lib_json/json_writer.cpp b/3rdparty/jsoncpp/src/lib_json/json_writer.cpp
deleted file mode 100644
index 2f940c8a43f..00000000000
--- a/3rdparty/jsoncpp/src/lib_json/json_writer.cpp
+++ /dev/null
@@ -1,1179 +0,0 @@
-// Copyright 2011 Baptiste Lepilleur
-// Distributed under MIT license, or public domain if desired and
-// recognized in your jurisdiction.
-// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
-
-#if !defined(JSON_IS_AMALGAMATION)
-#include <json/writer.h>
-#include "json_tool.h"
-#endif // if !defined(JSON_IS_AMALGAMATION)
-#include <iomanip>
-#include <memory>
-#include <sstream>
-#include <utility>
-#include <set>
-#include <cassert>
-#include <cstring>
-#include <cstdio>
-
-#if defined(_MSC_VER) && _MSC_VER >= 1200 && _MSC_VER < 1800 // Between VC++ 6.0 and VC++ 11.0
-#include <float.h>
-#define isfinite _finite
-#elif defined(__sun) && defined(__SVR4) //Solaris
-#include <ieeefp.h>
-#define isfinite finite
-#else
-#include <cmath>
-#define isfinite std::isfinite
-#endif
-
-#if defined(_MSC_VER) && _MSC_VER < 1500 // VC++ 8.0 and below
-#define snprintf _snprintf
-#elif defined(__ANDROID__)
-#define snprintf snprintf
-#elif __cplusplus >= 201103L
-#define snprintf std::snprintf
-#endif
-
-#if defined(__BORLANDC__)
-#include <float.h>
-#define isfinite _finite
-#define snprintf _snprintf
-#endif
-
-#if defined(_MSC_VER) && _MSC_VER >= 1400 // VC++ 8.0
-// Disable warning about strdup being deprecated.
-#pragma warning(disable : 4996)
-#endif
-
-namespace Json {
-
-#if __cplusplus >= 201103L
-typedef std::unique_ptr<StreamWriter> StreamWriterPtr;
-#else
-typedef std::auto_ptr<StreamWriter> StreamWriterPtr;
-#endif
-
-static bool containsControlCharacter(const char* str) {
- while (*str) {
- if (isControlCharacter(*(str++)))
- return true;
- }
- return false;
-}
-
-static bool containsControlCharacter0(const char* str, unsigned len) {
- char const* end = str + len;
- while (end != str) {
- if (isControlCharacter(*str) || 0==*str)
- return true;
- ++str;
- }
- return false;
-}
-
-std::string valueToString(LargestInt value) {
- UIntToStringBuffer buffer;
- char* current = buffer + sizeof(buffer);
- bool isNegative = value < 0;
- if (isNegative)
- value = -value;
- uintToString(LargestUInt(value), current);
- if (isNegative)
- *--current = '-';
- assert(current >= buffer);
- return current;
-}
-
-std::string valueToString(LargestUInt value) {
- UIntToStringBuffer buffer;
- char* current = buffer + sizeof(buffer);
- uintToString(value, current);
- assert(current >= buffer);
- return current;
-}
-
-#if defined(JSON_HAS_INT64)
-
-std::string valueToString(Int value) {
- return valueToString(LargestInt(value));
-}
-
-std::string valueToString(UInt value) {
- return valueToString(LargestUInt(value));
-}
-
-#endif // # if defined(JSON_HAS_INT64)
-
-std::string valueToString(double value) {
- // Allocate a buffer that is more than large enough to store the 16 digits of
- // precision requested below.
- char buffer[32];
- int len = -1;
-
-// Print into the buffer. We need not request the alternative representation
-// that always has a decimal point because JSON doesn't distingish the
-// concepts of reals and integers.
-#if defined(_MSC_VER) && defined(__STDC_SECURE_LIB__) // Use secure version with
- // visual studio 2005 to
- // avoid warning.
-#if defined(WINCE)
- len = _snprintf(buffer, sizeof(buffer), "%.17g", value);
-#else
- len = sprintf_s(buffer, sizeof(buffer), "%.17g", value);
-#endif
-#else
- if (isfinite(value)) {
- len = snprintf(buffer, sizeof(buffer), "%.17g", value);
- } else {
- // IEEE standard states that NaN values will not compare to themselves
- if (value != value) {
- len = snprintf(buffer, sizeof(buffer), "null");
- } else if (value < 0) {
- len = snprintf(buffer, sizeof(buffer), "-1e+9999");
- } else {
- len = snprintf(buffer, sizeof(buffer), "1e+9999");
- }
- // For those, we do not need to call fixNumLoc, but it is fast.
- }
-#endif
- assert(len >= 0);
- fixNumericLocale(buffer, buffer + len);
- return buffer;
-}
-
-std::string valueToString(bool value) { return value ? "true" : "false"; }
-
-std::string valueToQuotedString(const char* value) {
- if (value == NULL)
- return "";
- // Not sure how to handle unicode...
- if (strpbrk(value, "\"\\\b\f\n\r\t") == NULL &&
- !containsControlCharacter(value))
- return std::string("\"") + value + "\"";
- // We have to walk value and escape any special characters.
- // Appending to std::string is not efficient, but this should be rare.
- // (Note: forward slashes are *not* rare, but I am not escaping them.)
- std::string::size_type maxsize =
- strlen(value) * 2 + 3; // allescaped+quotes+NULL
- std::string result;
- result.reserve(maxsize); // to avoid lots of mallocs
- result += "\"";
- for (const char* c = value; *c != 0; ++c) {
- switch (*c) {
- case '\"':
- result += "\\\"";
- break;
- case '\\':
- result += "\\\\";
- break;
- case '\b':
- result += "\\b";
- break;
- case '\f':
- result += "\\f";
- break;
- case '\n':
- result += "\\n";
- break;
- case '\r':
- result += "\\r";
- break;
- case '\t':
- result += "\\t";
- break;
- // case '/':
- // Even though \/ is considered a legal escape in JSON, a bare
- // slash is also legal, so I see no reason to escape it.
- // (I hope I am not misunderstanding something.
- // blep notes: actually escaping \/ may be useful in javascript to avoid </
- // sequence.
- // Should add a flag to allow this compatibility mode and prevent this
- // sequence from occurring.
- default:
- if (isControlCharacter(*c)) {
- std::ostringstream oss;
- oss << "\\u" << std::hex << std::uppercase << std::setfill('0')
- << std::setw(4) << static_cast<int>(*c);
- result += oss.str();
- } else {
- result += *c;
- }
- break;
- }
- }
- result += "\"";
- return result;
-}
-
-// https://github.com/upcaste/upcaste/blob/master/src/upcore/src/cstring/strnpbrk.cpp
-static char const* strnpbrk(char const* s, char const* accept, size_t n) {
- assert((s || !n) && accept);
-
- char const* const end = s + n;
- for (char const* cur = s; cur < end; ++cur) {
- int const c = *cur;
- for (char const* a = accept; *a; ++a) {
- if (*a == c) {
- return cur;
- }
- }
- }
- return NULL;
-}
-static std::string valueToQuotedStringN(const char* value, unsigned length) {
- if (value == NULL)
- return "";
- // Not sure how to handle unicode...
- if (strnpbrk(value, "\"\\\b\f\n\r\t", length) == NULL &&
- !containsControlCharacter0(value, length))
- return std::string("\"") + value + "\"";
- // We have to walk value and escape any special characters.
- // Appending to std::string is not efficient, but this should be rare.
- // (Note: forward slashes are *not* rare, but I am not escaping them.)
- std::string::size_type maxsize =
- length * 2 + 3; // allescaped+quotes+NULL
- std::string result;
- result.reserve(maxsize); // to avoid lots of mallocs
- result += "\"";
- char const* end = value + length;
- for (const char* c = value; c != end; ++c) {
- switch (*c) {
- case '\"':
- result += "\\\"";
- break;
- case '\\':
- result += "\\\\";
- break;
- case '\b':
- result += "\\b";
- break;
- case '\f':
- result += "\\f";
- break;
- case '\n':
- result += "\\n";
- break;
- case '\r':
- result += "\\r";
- break;
- case '\t':
- result += "\\t";
- break;
- // case '/':
- // Even though \/ is considered a legal escape in JSON, a bare
- // slash is also legal, so I see no reason to escape it.
- // (I hope I am not misunderstanding something.)
- // blep notes: actually escaping \/ may be useful in javascript to avoid </
- // sequence.
- // Should add a flag to allow this compatibility mode and prevent this
- // sequence from occurring.
- default:
- if ((isControlCharacter(*c)) || (*c == 0)) {
- std::ostringstream oss;
- oss << "\\u" << std::hex << std::uppercase << std::setfill('0')
- << std::setw(4) << static_cast<int>(*c);
- result += oss.str();
- } else {
- result += *c;
- }
- break;
- }
- }
- result += "\"";
- return result;
-}
-
-// Class Writer
-// //////////////////////////////////////////////////////////////////
-Writer::~Writer() {}
-
-// Class FastWriter
-// //////////////////////////////////////////////////////////////////
-
-FastWriter::FastWriter()
- : yamlCompatiblityEnabled_(false), dropNullPlaceholders_(false),
- omitEndingLineFeed_(false) {}
-
-void FastWriter::enableYAMLCompatibility() { yamlCompatiblityEnabled_ = true; }
-
-void FastWriter::dropNullPlaceholders() { dropNullPlaceholders_ = true; }
-
-void FastWriter::omitEndingLineFeed() { omitEndingLineFeed_ = true; }
-
-std::string FastWriter::write(const Value& root) {
- document_ = "";
- writeValue(root);
- if (!omitEndingLineFeed_)
- document_ += "\n";
- return document_;
-}
-
-void FastWriter::writeValue(const Value& value) {
- switch (value.type()) {
- case nullValue:
- if (!dropNullPlaceholders_)
- document_ += "null";
- break;
- case intValue:
- document_ += valueToString(value.asLargestInt());
- break;
- case uintValue:
- document_ += valueToString(value.asLargestUInt());
- break;
- case realValue:
- document_ += valueToString(value.asDouble());
- break;
- case stringValue:
- {
- // Is NULL possible for value.string_?
- char const* str;
- char const* end;
- bool ok = value.getString(&str, &end);
- if (ok) document_ += valueToQuotedStringN(str, static_cast<unsigned>(end-str));
- break;
- }
- case booleanValue:
- document_ += valueToString(value.asBool());
- break;
- case arrayValue: {
- document_ += '[';
- int size = value.size();
- for (int index = 0; index < size; ++index) {
- if (index > 0)
- document_ += ',';
- writeValue(value[index]);
- }
- document_ += ']';
- } break;
- case objectValue: {
- Value::Members members(value.getMemberNames());
- document_ += '{';
- for (Value::Members::iterator it = members.begin(); it != members.end();
- ++it) {
- const std::string& name = *it;
- if (it != members.begin())
- document_ += ',';
- document_ += valueToQuotedStringN(name.data(), static_cast<unsigned>(name.length()));
- document_ += yamlCompatiblityEnabled_ ? ": " : ":";
- writeValue(value[name]);
- }
- document_ += '}';
- } break;
- }
-}
-
-// Class StyledWriter
-// //////////////////////////////////////////////////////////////////
-
-StyledWriter::StyledWriter()
- : rightMargin_(74), indentSize_(3), addChildValues_() {}
-
-std::string StyledWriter::write(const Value& root) {
- document_ = "";
- addChildValues_ = false;
- indentString_ = "";
- writeCommentBeforeValue(root);
- writeValue(root);
- writeCommentAfterValueOnSameLine(root);
- document_ += "\n";
- return document_;
-}
-
-void StyledWriter::writeValue(const Value& value) {
- switch (value.type()) {
- case nullValue:
- pushValue("null");
- break;
- case intValue:
- pushValue(valueToString(value.asLargestInt()));
- break;
- case uintValue:
- pushValue(valueToString(value.asLargestUInt()));
- break;
- case realValue:
- pushValue(valueToString(value.asDouble()));
- break;
- case stringValue:
- {
- // Is NULL possible for value.string_?
- char const* str;
- char const* end;
- bool ok = value.getString(&str, &end);
- if (ok) pushValue(valueToQuotedStringN(str, static_cast<unsigned>(end-str)));
- else pushValue("");
- break;
- }
- case booleanValue:
- pushValue(valueToString(value.asBool()));
- break;
- case arrayValue:
- writeArrayValue(value);
- break;
- case objectValue: {
- Value::Members members(value.getMemberNames());
- if (members.empty())
- pushValue("{}");
- else {
- writeWithIndent("{");
- indent();
- Value::Members::iterator it = members.begin();
- for (;;) {
- const std::string& name = *it;
- const Value& childValue = value[name];
- writeCommentBeforeValue(childValue);
- writeWithIndent(valueToQuotedString(name.c_str()));
- document_ += " : ";
- writeValue(childValue);
- if (++it == members.end()) {
- writeCommentAfterValueOnSameLine(childValue);
- break;
- }
- document_ += ',';
- writeCommentAfterValueOnSameLine(childValue);
- }
- unindent();
- writeWithIndent("}");
- }
- } break;
- }
-}
-
-void StyledWriter::writeArrayValue(const Value& value) {
- unsigned size = value.size();
- if (size == 0)
- pushValue("[]");
- else {
- bool isArrayMultiLine = isMultineArray(value);
- if (isArrayMultiLine) {
- writeWithIndent("[");
- indent();
- bool hasChildValue = !childValues_.empty();
- unsigned index = 0;
- for (;;) {
- const Value& childValue = value[index];
- writeCommentBeforeValue(childValue);
- if (hasChildValue)
- writeWithIndent(childValues_[index]);
- else {
- writeIndent();
- writeValue(childValue);
- }
- if (++index == size) {
- writeCommentAfterValueOnSameLine(childValue);
- break;
- }
- document_ += ',';
- writeCommentAfterValueOnSameLine(childValue);
- }
- unindent();
- writeWithIndent("]");
- } else // output on a single line
- {
- assert(childValues_.size() == size);
- document_ += "[ ";
- for (unsigned index = 0; index < size; ++index) {
- if (index > 0)
- document_ += ", ";
- document_ += childValues_[index];
- }
- document_ += " ]";
- }
- }
-}
-
-bool StyledWriter::isMultineArray(const Value& value) {
- int size = value.size();
- bool isMultiLine = size * 3 >= rightMargin_;
- childValues_.clear();
- for (int index = 0; index < size && !isMultiLine; ++index) {
- const Value& childValue = value[index];
- isMultiLine =
- isMultiLine || ((childValue.isArray() || childValue.isObject()) &&
- childValue.size() > 0);
- }
- if (!isMultiLine) // check if line length > max line length
- {
- childValues_.reserve(size);
- addChildValues_ = true;
- int lineLength = 4 + (size - 1) * 2; // '[ ' + ', '*n + ' ]'
- for (int index = 0; index < size; ++index) {
- if (hasCommentForValue(value[index])) {
- isMultiLine = true;
- }
- writeValue(value[index]);
- lineLength += int(childValues_[index].length());
- }
- addChildValues_ = false;
- isMultiLine = isMultiLine || lineLength >= rightMargin_;
- }
- return isMultiLine;
-}
-
-void StyledWriter::pushValue(const std::string& value) {
- if (addChildValues_)
- childValues_.push_back(value);
- else
- document_ += value;
-}
-
-void StyledWriter::writeIndent() {
- if (!document_.empty()) {
- char last = document_[document_.length() - 1];
- if (last == ' ') // already indented
- return;
- if (last != '\n') // Comments may add new-line
- document_ += '\n';
- }
- document_ += indentString_;
-}
-
-void StyledWriter::writeWithIndent(const std::string& value) {
- writeIndent();
- document_ += value;
-}
-
-void StyledWriter::indent() { indentString_ += std::string(indentSize_, ' '); }
-
-void StyledWriter::unindent() {
- assert(int(indentString_.size()) >= indentSize_);
- indentString_.resize(indentString_.size() - indentSize_);
-}
-
-void StyledWriter::writeCommentBeforeValue(const Value& root) {
- if (!root.hasComment(commentBefore))
- return;
-
- document_ += "\n";
- writeIndent();
- const std::string& comment = root.getComment(commentBefore);
- std::string::const_iterator iter = comment.begin();
- while (iter != comment.end()) {
- document_ += *iter;
- if (*iter == '\n' &&
- (iter != comment.end() && *(iter + 1) == '/'))
- writeIndent();
- ++iter;
- }
-
- // Comments are stripped of trailing newlines, so add one here
- document_ += "\n";
-}
-
-void StyledWriter::writeCommentAfterValueOnSameLine(const Value& root) {
- if (root.hasComment(commentAfterOnSameLine))
- document_ += " " + root.getComment(commentAfterOnSameLine);
-
- if (root.hasComment(commentAfter)) {
- document_ += "\n";
- document_ += root.getComment(commentAfter);
- document_ += "\n";
- }
-}
-
-bool StyledWriter::hasCommentForValue(const Value& value) {
- return value.hasComment(commentBefore) ||
- value.hasComment(commentAfterOnSameLine) ||
- value.hasComment(commentAfter);
-}
-
-// Class StyledStreamWriter
-// //////////////////////////////////////////////////////////////////
-
-StyledStreamWriter::StyledStreamWriter(std::string indentation)
- : document_(NULL), rightMargin_(74), indentation_(indentation),
- addChildValues_() {}
-
-void StyledStreamWriter::write(std::ostream& out, const Value& root) {
- document_ = &out;
- addChildValues_ = false;
- indentString_ = "";
- indented_ = true;
- writeCommentBeforeValue(root);
- if (!indented_) writeIndent();
- indented_ = true;
- writeValue(root);
- writeCommentAfterValueOnSameLine(root);
- *document_ << "\n";
- document_ = NULL; // Forget the stream, for safety.
-}
-
-void StyledStreamWriter::writeValue(const Value& value) {
- switch (value.type()) {
- case nullValue:
- pushValue("null");
- break;
- case intValue:
- pushValue(valueToString(value.asLargestInt()));
- break;
- case uintValue:
- pushValue(valueToString(value.asLargestUInt()));
- break;
- case realValue:
- pushValue(valueToString(value.asDouble()));
- break;
- case stringValue:
- {
- // Is NULL possible for value.string_?
- char const* str;
- char const* end;
- bool ok = value.getString(&str, &end);
- if (ok) pushValue(valueToQuotedStringN(str, static_cast<unsigned>(end-str)));
- else pushValue("");
- break;
- }
- case booleanValue:
- pushValue(valueToString(value.asBool()));
- break;
- case arrayValue:
- writeArrayValue(value);
- break;
- case objectValue: {
- Value::Members members(value.getMemberNames());
- if (members.empty())
- pushValue("{}");
- else {
- writeWithIndent("{");
- indent();
- Value::Members::iterator it = members.begin();
- for (;;) {
- const std::string& name = *it;
- const Value& childValue = value[name];
- writeCommentBeforeValue(childValue);
- writeWithIndent(valueToQuotedString(name.c_str()));
- *document_ << " : ";
- writeValue(childValue);
- if (++it == members.end()) {
- writeCommentAfterValueOnSameLine(childValue);
- break;
- }
- *document_ << ",";
- writeCommentAfterValueOnSameLine(childValue);
- }
- unindent();
- writeWithIndent("}");
- }
- } break;
- }
-}
-
-void StyledStreamWriter::writeArrayValue(const Value& value) {
- unsigned size = value.size();
- if (size == 0)
- pushValue("[]");
- else {
- bool isArrayMultiLine = isMultineArray(value);
- if (isArrayMultiLine) {
- writeWithIndent("[");
- indent();
- bool hasChildValue = !childValues_.empty();
- unsigned index = 0;
- for (;;) {
- const Value& childValue = value[index];
- writeCommentBeforeValue(childValue);
- if (hasChildValue)
- writeWithIndent(childValues_[index]);
- else {
- if (!indented_) writeIndent();
- indented_ = true;
- writeValue(childValue);
- indented_ = false;
- }
- if (++index == size) {
- writeCommentAfterValueOnSameLine(childValue);
- break;
- }
- *document_ << ",";
- writeCommentAfterValueOnSameLine(childValue);
- }
- unindent();
- writeWithIndent("]");
- } else // output on a single line
- {
- assert(childValues_.size() == size);
- *document_ << "[ ";
- for (unsigned index = 0; index < size; ++index) {
- if (index > 0)
- *document_ << ", ";
- *document_ << childValues_[index];
- }
- *document_ << " ]";
- }
- }
-}
-
-bool StyledStreamWriter::isMultineArray(const Value& value) {
- int size = value.size();
- bool isMultiLine = size * 3 >= rightMargin_;
- childValues_.clear();
- for (int index = 0; index < size && !isMultiLine; ++index) {
- const Value& childValue = value[index];
- isMultiLine =
- isMultiLine || ((childValue.isArray() || childValue.isObject()) &&
- childValue.size() > 0);
- }
- if (!isMultiLine) // check if line length > max line length
- {
- childValues_.reserve(size);
- addChildValues_ = true;
- int lineLength = 4 + (size - 1) * 2; // '[ ' + ', '*n + ' ]'
- for (int index = 0; index < size; ++index) {
- if (hasCommentForValue(value[index])) {
- isMultiLine = true;
- }
- writeValue(value[index]);
- lineLength += int(childValues_[index].length());
- }
- addChildValues_ = false;
- isMultiLine = isMultiLine || lineLength >= rightMargin_;
- }
- return isMultiLine;
-}
-
-void StyledStreamWriter::pushValue(const std::string& value) {
- if (addChildValues_)
- childValues_.push_back(value);
- else
- *document_ << value;
-}
-
-void StyledStreamWriter::writeIndent() {
- // blep intended this to look at the so-far-written string
- // to determine whether we are already indented, but
- // with a stream we cannot do that. So we rely on some saved state.
- // The caller checks indented_.
- *document_ << '\n' << indentString_;
-}
-
-void StyledStreamWriter::writeWithIndent(const std::string& value) {
- if (!indented_) writeIndent();
- *document_ << value;
- indented_ = false;
-}
-
-void StyledStreamWriter::indent() { indentString_ += indentation_; }
-
-void StyledStreamWriter::unindent() {
- assert(indentString_.size() >= indentation_.size());
- indentString_.resize(indentString_.size() - indentation_.size());
-}
-
-void StyledStreamWriter::writeCommentBeforeValue(const Value& root) {
- if (!root.hasComment(commentBefore))
- return;
-
- if (!indented_) writeIndent();
- const std::string& comment = root.getComment(commentBefore);
- std::string::const_iterator iter = comment.begin();
- while (iter != comment.end()) {
- *document_ << *iter;
- if (*iter == '\n' &&
- (iter != comment.end() && *(iter + 1) == '/'))
- // writeIndent(); // would include newline
- *document_ << indentString_;
- ++iter;
- }
- indented_ = false;
-}
-
-void StyledStreamWriter::writeCommentAfterValueOnSameLine(const Value& root) {
- if (root.hasComment(commentAfterOnSameLine))
- *document_ << ' ' << root.getComment(commentAfterOnSameLine);
-
- if (root.hasComment(commentAfter)) {
- writeIndent();
- *document_ << root.getComment(commentAfter);
- }
- indented_ = false;
-}
-
-bool StyledStreamWriter::hasCommentForValue(const Value& value) {
- return value.hasComment(commentBefore) ||
- value.hasComment(commentAfterOnSameLine) ||
- value.hasComment(commentAfter);
-}
-
-//////////////////////////
-// BuiltStyledStreamWriter
-
-/// Scoped enums are not available until C++11.
-struct CommentStyle {
- /// Decide whether to write comments.
- enum Enum {
- None, ///< Drop all comments.
- Most, ///< Recover odd behavior of previous versions (not implemented yet).
- All ///< Keep all comments.
- };
-};
-
-struct BuiltStyledStreamWriter : public StreamWriter
-{
- BuiltStyledStreamWriter(
- std::string const& indentation,
- CommentStyle::Enum cs,
- std::string const& colonSymbol,
- std::string const& nullSymbol,
- std::string const& endingLineFeedSymbol);
- virtual int write(Value const& root, std::ostream* sout);
-private:
- void writeValue(Value const& value);
- void writeArrayValue(Value const& value);
- bool isMultineArray(Value const& value);
- void pushValue(std::string const& value);
- void writeIndent();
- void writeWithIndent(std::string const& value);
- void indent();
- void unindent();
- void writeCommentBeforeValue(Value const& root);
- void writeCommentAfterValueOnSameLine(Value const& root);
- static bool hasCommentForValue(const Value& value);
-
- typedef std::vector<std::string> ChildValues;
-
- ChildValues childValues_;
- std::string indentString_;
- int rightMargin_;
- std::string indentation_;
- CommentStyle::Enum cs_;
- std::string colonSymbol_;
- std::string nullSymbol_;
- std::string endingLineFeedSymbol_;
- bool addChildValues_ : 1;
- bool indented_ : 1;
-};
-BuiltStyledStreamWriter::BuiltStyledStreamWriter(
- std::string const& indentation,
- CommentStyle::Enum cs,
- std::string const& colonSymbol,
- std::string const& nullSymbol,
- std::string const& endingLineFeedSymbol)
- : rightMargin_(74)
- , indentation_(indentation)
- , cs_(cs)
- , colonSymbol_(colonSymbol)
- , nullSymbol_(nullSymbol)
- , endingLineFeedSymbol_(endingLineFeedSymbol)
- , addChildValues_(false)
- , indented_(false)
-{
-}
-int BuiltStyledStreamWriter::write(Value const& root, std::ostream* sout)
-{
- sout_ = sout;
- addChildValues_ = false;
- indented_ = true;
- indentString_ = "";
- writeCommentBeforeValue(root);
- if (!indented_) writeIndent();
- indented_ = true;
- writeValue(root);
- writeCommentAfterValueOnSameLine(root);
- *sout_ << endingLineFeedSymbol_;
- sout_ = NULL;
- return 0;
-}
-void BuiltStyledStreamWriter::writeValue(Value const& value) {
- switch (value.type()) {
- case nullValue:
- pushValue(nullSymbol_);
- break;
- case intValue:
- pushValue(valueToString(value.asLargestInt()));
- break;
- case uintValue:
- pushValue(valueToString(value.asLargestUInt()));
- break;
- case realValue:
- pushValue(valueToString(value.asDouble()));
- break;
- case stringValue:
- {
- // Is NULL is possible for value.string_?
- char const* str;
- char const* end;
- bool ok = value.getString(&str, &end);
- if (ok) pushValue(valueToQuotedStringN(str, static_cast<unsigned>(end-str)));
- else pushValue("");
- break;
- }
- case booleanValue:
- pushValue(valueToString(value.asBool()));
- break;
- case arrayValue:
- writeArrayValue(value);
- break;
- case objectValue: {
- Value::Members members(value.getMemberNames());
- if (members.empty())
- pushValue("{}");
- else {
- writeWithIndent("{");
- indent();
- Value::Members::iterator it = members.begin();
- for (;;) {
- std::string const& name = *it;
- Value const& childValue = value[name];
- writeCommentBeforeValue(childValue);
- writeWithIndent(valueToQuotedStringN(name.data(), static_cast<unsigned>(name.length())));
- *sout_ << colonSymbol_;
- writeValue(childValue);
- if (++it == members.end()) {
- writeCommentAfterValueOnSameLine(childValue);
- break;
- }
- *sout_ << ",";
- writeCommentAfterValueOnSameLine(childValue);
- }
- unindent();
- writeWithIndent("}");
- }
- } break;
- }
-}
-
-void BuiltStyledStreamWriter::writeArrayValue(Value const& value) {
- unsigned size = value.size();
- if (size == 0)
- pushValue("[]");
- else {
- bool isMultiLine = (cs_ == CommentStyle::All) || isMultineArray(value);
- if (isMultiLine) {
- writeWithIndent("[");
- indent();
- bool hasChildValue = !childValues_.empty();
- unsigned index = 0;
- for (;;) {
- Value const& childValue = value[index];
- writeCommentBeforeValue(childValue);
- if (hasChildValue)
- writeWithIndent(childValues_[index]);
- else {
- if (!indented_) writeIndent();
- indented_ = true;
- writeValue(childValue);
- indented_ = false;
- }
- if (++index == size) {
- writeCommentAfterValueOnSameLine(childValue);
- break;
- }
- *sout_ << ",";
- writeCommentAfterValueOnSameLine(childValue);
- }
- unindent();
- writeWithIndent("]");
- } else // output on a single line
- {
- assert(childValues_.size() == size);
- *sout_ << "[";
- if (!indentation_.empty()) *sout_ << " ";
- for (unsigned index = 0; index < size; ++index) {
- if (index > 0)
- *sout_ << ", ";
- *sout_ << childValues_[index];
- }
- if (!indentation_.empty()) *sout_ << " ";
- *sout_ << "]";
- }
- }
-}
-
-bool BuiltStyledStreamWriter::isMultineArray(Value const& value) {
- int size = value.size();
- bool isMultiLine = size * 3 >= rightMargin_;
- childValues_.clear();
- for (int index = 0; index < size && !isMultiLine; ++index) {
- Value const& childValue = value[index];
- isMultiLine =
- isMultiLine || ((childValue.isArray() || childValue.isObject()) &&
- childValue.size() > 0);
- }
- if (!isMultiLine) // check if line length > max line length
- {
- childValues_.reserve(size);
- addChildValues_ = true;
- int lineLength = 4 + (size - 1) * 2; // '[ ' + ', '*n + ' ]'
- for (int index = 0; index < size; ++index) {
- if (hasCommentForValue(value[index])) {
- isMultiLine = true;
- }
- writeValue(value[index]);
- lineLength += int(childValues_[index].length());
- }
- addChildValues_ = false;
- isMultiLine = isMultiLine || lineLength >= rightMargin_;
- }
- return isMultiLine;
-}
-
-void BuiltStyledStreamWriter::pushValue(std::string const& value) {
- if (addChildValues_)
- childValues_.push_back(value);
- else
- *sout_ << value;
-}
-
-void BuiltStyledStreamWriter::writeIndent() {
- // blep intended this to look at the so-far-written string
- // to determine whether we are already indented, but
- // with a stream we cannot do that. So we rely on some saved state.
- // The caller checks indented_.
-
- if (!indentation_.empty()) {
- // In this case, drop newlines too.
- *sout_ << '\n' << indentString_;
- }
-}
-
-void BuiltStyledStreamWriter::writeWithIndent(std::string const& value) {
- if (!indented_) writeIndent();
- *sout_ << value;
- indented_ = false;
-}
-
-void BuiltStyledStreamWriter::indent() { indentString_ += indentation_; }
-
-void BuiltStyledStreamWriter::unindent() {
- assert(indentString_.size() >= indentation_.size());
- indentString_.resize(indentString_.size() - indentation_.size());
-}
-
-void BuiltStyledStreamWriter::writeCommentBeforeValue(Value const& root) {
- if (cs_ == CommentStyle::None) return;
- if (!root.hasComment(commentBefore))
- return;
-
- if (!indented_) writeIndent();
- const std::string& comment = root.getComment(commentBefore);
- std::string::const_iterator iter = comment.begin();
- while (iter != comment.end()) {
- *sout_ << *iter;
- if (*iter == '\n' &&
- (iter != comment.end() && *(iter + 1) == '/'))
- // writeIndent(); // would write extra newline
- *sout_ << indentString_;
- ++iter;
- }
- indented_ = false;
-}
-
-void BuiltStyledStreamWriter::writeCommentAfterValueOnSameLine(Value const& root) {
- if (cs_ == CommentStyle::None) return;
- if (root.hasComment(commentAfterOnSameLine))
- *sout_ << " " + root.getComment(commentAfterOnSameLine);
-
- if (root.hasComment(commentAfter)) {
- writeIndent();
- *sout_ << root.getComment(commentAfter);
- }
-}
-
-// static
-bool BuiltStyledStreamWriter::hasCommentForValue(const Value& value) {
- return value.hasComment(commentBefore) ||
- value.hasComment(commentAfterOnSameLine) ||
- value.hasComment(commentAfter);
-}
-
-///////////////
-// StreamWriter
-
-StreamWriter::StreamWriter()
- : sout_(NULL)
-{
-}
-StreamWriter::~StreamWriter()
-{
-}
-StreamWriter::Factory::~Factory()
-{}
-StreamWriterBuilder::StreamWriterBuilder()
-{
- setDefaults(&settings_);
-}
-StreamWriterBuilder::~StreamWriterBuilder()
-{}
-StreamWriter* StreamWriterBuilder::newStreamWriter() const
-{
- std::string indentation = settings_["indentation"].asString();
- std::string cs_str = settings_["commentStyle"].asString();
- bool eyc = settings_["enableYAMLCompatibility"].asBool();
- bool dnp = settings_["dropNullPlaceholders"].asBool();
- CommentStyle::Enum cs = CommentStyle::All;
- if (cs_str == "All") {
- cs = CommentStyle::All;
- } else if (cs_str == "None") {
- cs = CommentStyle::None;
- } else {
- throwRuntimeError("commentStyle must be 'All' or 'None'");
- }
- std::string colonSymbol = " : ";
- if (eyc) {
- colonSymbol = ": ";
- } else if (indentation.empty()) {
- colonSymbol = ":";
- }
- std::string nullSymbol = "null";
- if (dnp) {
- nullSymbol = "";
- }
- std::string endingLineFeedSymbol = "";
- return new BuiltStyledStreamWriter(
- indentation, cs,
- colonSymbol, nullSymbol, endingLineFeedSymbol);
-}
-static void getValidWriterKeys(std::set<std::string>* valid_keys)
-{
- valid_keys->clear();
- valid_keys->insert("indentation");
- valid_keys->insert("commentStyle");
- valid_keys->insert("enableYAMLCompatibility");
- valid_keys->insert("dropNullPlaceholders");
-}
-bool StreamWriterBuilder::validate(Json::Value* invalid) const
-{
- Json::Value my_invalid;
- if (!invalid) invalid = &my_invalid; // so we do not need to test for NULL
- Json::Value& inv = *invalid;
- std::set<std::string> valid_keys;
- getValidWriterKeys(&valid_keys);
- Value::Members keys = settings_.getMemberNames();
- size_t n = keys.size();
- for (size_t i = 0; i < n; ++i) {
- std::string const& key = keys[i];
- if (valid_keys.find(key) == valid_keys.end()) {
- inv[key] = settings_[key];
- }
- }
- return 0u == inv.size();
-}
-Value& StreamWriterBuilder::operator[](std::string key)
-{
- return settings_[key];
-}
-// static
-void StreamWriterBuilder::setDefaults(Json::Value* settings)
-{
- //! [StreamWriterBuilderDefaults]
- (*settings)["commentStyle"] = "All";
- (*settings)["indentation"] = "\t";
- (*settings)["enableYAMLCompatibility"] = false;
- (*settings)["dropNullPlaceholders"] = false;
- //! [StreamWriterBuilderDefaults]
-}
-
-std::string writeString(StreamWriter::Factory const& builder, Value const& root) {
- std::ostringstream sout;
- StreamWriterPtr const writer(builder.newStreamWriter());
- writer->write(root, &sout);
- return sout.str();
-}
-
-std::ostream& operator<<(std::ostream& sout, Value const& root) {
- StreamWriterBuilder builder;
- StreamWriterPtr const writer(builder.newStreamWriter());
- writer->write(root, &sout);
- return sout;
-}
-
-} // namespace Json
diff --git a/3rdparty/jsoncpp/src/lib_json/sconscript b/3rdparty/jsoncpp/src/lib_json/sconscript
deleted file mode 100644
index 6e7c6c8a076..00000000000
--- a/3rdparty/jsoncpp/src/lib_json/sconscript
+++ /dev/null
@@ -1,8 +0,0 @@
-Import( 'env buildLibrary' )
-
-buildLibrary( env, Split( """
- json_reader.cpp
- json_value.cpp
- json_writer.cpp
- """ ),
- 'json' )
diff --git a/3rdparty/jsoncpp/src/lib_json/version.h.in b/3rdparty/jsoncpp/src/lib_json/version.h.in
deleted file mode 100644
index 761ca3a7b92..00000000000
--- a/3rdparty/jsoncpp/src/lib_json/version.h.in
+++ /dev/null
@@ -1,14 +0,0 @@
-// DO NOT EDIT. This file is generated by CMake from "version"
-// and "version.h.in" files.
-// Run CMake configure step to update it.
-#ifndef JSON_VERSION_H_INCLUDED
-# define JSON_VERSION_H_INCLUDED
-
-# define JSONCPP_VERSION_STRING "@JSONCPP_VERSION@"
-# define JSONCPP_VERSION_MAJOR @JSONCPP_VERSION_MAJOR@
-# define JSONCPP_VERSION_MINOR @JSONCPP_VERSION_MINOR@
-# define JSONCPP_VERSION_PATCH @JSONCPP_VERSION_PATCH@
-# define JSONCPP_VERSION_QUALIFIER
-# define JSONCPP_VERSION_HEXA ((JSONCPP_VERSION_MAJOR << 24) | (JSONCPP_VERSION_MINOR << 16) | (JSONCPP_VERSION_PATCH << 8))
-
-#endif // JSON_VERSION_H_INCLUDED
diff --git a/3rdparty/jsoncpp/src/test_lib_json/CMakeLists.txt b/3rdparty/jsoncpp/src/test_lib_json/CMakeLists.txt
deleted file mode 100644
index f54c85f6817..00000000000
--- a/3rdparty/jsoncpp/src/test_lib_json/CMakeLists.txt
+++ /dev/null
@@ -1,38 +0,0 @@
-# vim: et ts=4 sts=4 sw=4 tw=0
-
-ADD_EXECUTABLE( jsoncpp_test
- jsontest.cpp
- jsontest.h
- main.cpp
- )
-
-
-IF(BUILD_SHARED_LIBS)
- ADD_DEFINITIONS( -DJSON_DLL )
- TARGET_LINK_LIBRARIES(jsoncpp_test jsoncpp_lib)
-ELSE(BUILD_SHARED_LIBS)
- TARGET_LINK_LIBRARIES(jsoncpp_test jsoncpp_lib_static)
-ENDIF(BUILD_SHARED_LIBS)
-
-# another way to solve issue #90
-#set_target_properties(jsoncpp_test PROPERTIES COMPILE_FLAGS -ffloat-store)
-
-# Run unit tests in post-build
-# (default cmake workflow hides away the test result into a file, resulting in poor dev workflow?!?)
-IF(JSONCPP_WITH_POST_BUILD_UNITTEST)
- IF(BUILD_SHARED_LIBS)
- # First, copy the shared lib, for Microsoft.
- # Then, run the test executable.
- ADD_CUSTOM_COMMAND( TARGET jsoncpp_test
- POST_BUILD
- COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:jsoncpp_lib> $<TARGET_FILE_DIR:jsoncpp_test>
- COMMAND $<TARGET_FILE:jsoncpp_test>)
- ELSE(BUILD_SHARED_LIBS)
- # Just run the test executable.
- ADD_CUSTOM_COMMAND( TARGET jsoncpp_test
- POST_BUILD
- COMMAND $<TARGET_FILE:jsoncpp_test>)
- ENDIF(BUILD_SHARED_LIBS)
-ENDIF(JSONCPP_WITH_POST_BUILD_UNITTEST)
-
-SET_TARGET_PROPERTIES(jsoncpp_test PROPERTIES OUTPUT_NAME jsoncpp_test)
diff --git a/3rdparty/jsoncpp/src/test_lib_json/jsontest.cpp b/3rdparty/jsoncpp/src/test_lib_json/jsontest.cpp
deleted file mode 100644
index bd9463fa589..00000000000
--- a/3rdparty/jsoncpp/src/test_lib_json/jsontest.cpp
+++ /dev/null
@@ -1,443 +0,0 @@
-// Copyright 2007-2010 Baptiste Lepilleur
-// Distributed under MIT license, or public domain if desired and
-// recognized in your jurisdiction.
-// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
-
-#define _CRT_SECURE_NO_WARNINGS 1 // Prevents deprecation warning with MSVC
-#include "jsontest.h"
-#include <stdio.h>
-#include <string>
-
-#if defined(_MSC_VER)
-// Used to install a report hook that prevent dialog on assertion and error.
-#include <crtdbg.h>
-#endif // if defined(_MSC_VER)
-
-#if defined(_WIN32)
-// Used to prevent dialog on memory fault.
-// Limits headers included by Windows.h
-#define WIN32_LEAN_AND_MEAN
-#define NOSERVICE
-#define NOMCX
-#define NOIME
-#define NOSOUND
-#define NOCOMM
-#define NORPC
-#define NOGDI
-#define NOUSER
-#define NODRIVERS
-#define NOLOGERROR
-#define NOPROFILER
-#define NOMEMMGR
-#define NOLFILEIO
-#define NOOPENFILE
-#define NORESOURCE
-#define NOATOM
-#define NOLANGUAGE
-#define NOLSTRING
-#define NODBCS
-#define NOKEYBOARDINFO
-#define NOGDICAPMASKS
-#define NOCOLOR
-#define NOGDIOBJ
-#define NODRAWTEXT
-#define NOTEXTMETRIC
-#define NOSCALABLEFONT
-#define NOBITMAP
-#define NORASTEROPS
-#define NOMETAFILE
-#define NOSYSMETRICS
-#define NOSYSTEMPARAMSINFO
-#define NOMSG
-#define NOWINSTYLES
-#define NOWINOFFSETS
-#define NOSHOWWINDOW
-#define NODEFERWINDOWPOS
-#define NOVIRTUALKEYCODES
-#define NOKEYSTATES
-#define NOWH
-#define NOMENUS
-#define NOSCROLL
-#define NOCLIPBOARD
-#define NOICONS
-#define NOMB
-#define NOSYSCOMMANDS
-#define NOMDI
-#define NOCTLMGR
-#define NOWINMESSAGES
-#include <windows.h>
-#endif // if defined(_WIN32)
-
-namespace JsonTest {
-
-// class TestResult
-// //////////////////////////////////////////////////////////////////
-
-TestResult::TestResult()
- : predicateId_(1), lastUsedPredicateId_(0), messageTarget_(0) {
- // The root predicate has id 0
- rootPredicateNode_.id_ = 0;
- rootPredicateNode_.next_ = 0;
- predicateStackTail_ = &rootPredicateNode_;
-}
-
-void TestResult::setTestName(const std::string& name) { name_ = name; }
-
-TestResult&
-TestResult::addFailure(const char* file, unsigned int line, const char* expr) {
- /// Walks the PredicateContext stack adding them to failures_ if not already
- /// added.
- unsigned int nestingLevel = 0;
- PredicateContext* lastNode = rootPredicateNode_.next_;
- for (; lastNode != 0; lastNode = lastNode->next_) {
- if (lastNode->id_ > lastUsedPredicateId_) // new PredicateContext
- {
- lastUsedPredicateId_ = lastNode->id_;
- addFailureInfo(
- lastNode->file_, lastNode->line_, lastNode->expr_, nestingLevel);
- // Link the PredicateContext to the failure for message target when
- // popping the PredicateContext.
- lastNode->failure_ = &(failures_.back());
- }
- ++nestingLevel;
- }
-
- // Adds the failed assertion
- addFailureInfo(file, line, expr, nestingLevel);
- messageTarget_ = &(failures_.back());
- return *this;
-}
-
-void TestResult::addFailureInfo(const char* file,
- unsigned int line,
- const char* expr,
- unsigned int nestingLevel) {
- Failure failure;
- failure.file_ = file;
- failure.line_ = line;
- if (expr) {
- failure.expr_ = expr;
- }
- failure.nestingLevel_ = nestingLevel;
- failures_.push_back(failure);
-}
-
-TestResult& TestResult::popPredicateContext() {
- PredicateContext* lastNode = &rootPredicateNode_;
- while (lastNode->next_ != 0 && lastNode->next_->next_ != 0) {
- lastNode = lastNode->next_;
- }
- // Set message target to popped failure
- PredicateContext* tail = lastNode->next_;
- if (tail != 0 && tail->failure_ != 0) {
- messageTarget_ = tail->failure_;
- }
- // Remove tail from list
- predicateStackTail_ = lastNode;
- lastNode->next_ = 0;
- return *this;
-}
-
-bool TestResult::failed() const { return !failures_.empty(); }
-
-unsigned int TestResult::getAssertionNestingLevel() const {
- unsigned int level = 0;
- const PredicateContext* lastNode = &rootPredicateNode_;
- while (lastNode->next_ != 0) {
- lastNode = lastNode->next_;
- ++level;
- }
- return level;
-}
-
-void TestResult::printFailure(bool printTestName) const {
- if (failures_.empty()) {
- return;
- }
-
- if (printTestName) {
- printf("* Detail of %s test failure:\n", name_.c_str());
- }
-
- // Print in reverse to display the callstack in the right order
- Failures::const_iterator itEnd = failures_.end();
- for (Failures::const_iterator it = failures_.begin(); it != itEnd; ++it) {
- const Failure& failure = *it;
- std::string indent(failure.nestingLevel_ * 2, ' ');
- if (failure.file_) {
- printf("%s%s(%d): ", indent.c_str(), failure.file_, failure.line_);
- }
- if (!failure.expr_.empty()) {
- printf("%s\n", failure.expr_.c_str());
- } else if (failure.file_) {
- printf("\n");
- }
- if (!failure.message_.empty()) {
- std::string reindented = indentText(failure.message_, indent + " ");
- printf("%s\n", reindented.c_str());
- }
- }
-}
-
-std::string TestResult::indentText(const std::string& text,
- const std::string& indent) {
- std::string reindented;
- std::string::size_type lastIndex = 0;
- while (lastIndex < text.size()) {
- std::string::size_type nextIndex = text.find('\n', lastIndex);
- if (nextIndex == std::string::npos) {
- nextIndex = text.size() - 1;
- }
- reindented += indent;
- reindented += text.substr(lastIndex, nextIndex - lastIndex + 1);
- lastIndex = nextIndex + 1;
- }
- return reindented;
-}
-
-TestResult& TestResult::addToLastFailure(const std::string& message) {
- if (messageTarget_ != 0) {
- messageTarget_->message_ += message;
- }
- return *this;
-}
-
-TestResult& TestResult::operator<<(Json::Int64 value) {
- return addToLastFailure(Json::valueToString(value));
-}
-
-TestResult& TestResult::operator<<(Json::UInt64 value) {
- return addToLastFailure(Json::valueToString(value));
-}
-
-TestResult& TestResult::operator<<(bool value) {
- return addToLastFailure(value ? "true" : "false");
-}
-
-// class TestCase
-// //////////////////////////////////////////////////////////////////
-
-TestCase::TestCase() : result_(0) {}
-
-TestCase::~TestCase() {}
-
-void TestCase::run(TestResult& result) {
- result_ = &result;
- runTestCase();
-}
-
-// class Runner
-// //////////////////////////////////////////////////////////////////
-
-Runner::Runner() {}
-
-Runner& Runner::add(TestCaseFactory factory) {
- tests_.push_back(factory);
- return *this;
-}
-
-unsigned int Runner::testCount() const {
- return static_cast<unsigned int>(tests_.size());
-}
-
-std::string Runner::testNameAt(unsigned int index) const {
- TestCase* test = tests_[index]();
- std::string name = test->testName();
- delete test;
- return name;
-}
-
-void Runner::runTestAt(unsigned int index, TestResult& result) const {
- TestCase* test = tests_[index]();
- result.setTestName(test->testName());
- printf("Testing %s: ", test->testName());
- fflush(stdout);
-#if JSON_USE_EXCEPTION
- try {
-#endif // if JSON_USE_EXCEPTION
- test->run(result);
-#if JSON_USE_EXCEPTION
- }
- catch (const std::exception& e) {
- result.addFailure(__FILE__, __LINE__, "Unexpected exception caught:")
- << e.what();
- }
-#endif // if JSON_USE_EXCEPTION
- delete test;
- const char* status = result.failed() ? "FAILED" : "OK";
- printf("%s\n", status);
- fflush(stdout);
-}
-
-bool Runner::runAllTest(bool printSummary) const {
- unsigned int count = testCount();
- std::deque<TestResult> failures;
- for (unsigned int index = 0; index < count; ++index) {
- TestResult result;
- runTestAt(index, result);
- if (result.failed()) {
- failures.push_back(result);
- }
- }
-
- if (failures.empty()) {
- if (printSummary) {
- printf("All %d tests passed\n", count);
- }
- return true;
- } else {
- for (unsigned int index = 0; index < failures.size(); ++index) {
- TestResult& result = failures[index];
- result.printFailure(count > 1);
- }
-
- if (printSummary) {
- unsigned int failedCount = static_cast<unsigned int>(failures.size());
- unsigned int passedCount = count - failedCount;
- printf("%d/%d tests passed (%d failure(s))\n",
- passedCount,
- count,
- failedCount);
- }
- return false;
- }
-}
-
-bool Runner::testIndex(const std::string& testName,
- unsigned int& indexOut) const {
- unsigned int count = testCount();
- for (unsigned int index = 0; index < count; ++index) {
- if (testNameAt(index) == testName) {
- indexOut = index;
- return true;
- }
- }
- return false;
-}
-
-void Runner::listTests() const {
- unsigned int count = testCount();
- for (unsigned int index = 0; index < count; ++index) {
- printf("%s\n", testNameAt(index).c_str());
- }
-}
-
-int Runner::runCommandLine(int argc, const char* argv[]) const {
- // typedef std::deque<std::string> TestNames;
- Runner subrunner;
- for (int index = 1; index < argc; ++index) {
- std::string opt = argv[index];
- if (opt == "--list-tests") {
- listTests();
- return 0;
- } else if (opt == "--test-auto") {
- preventDialogOnCrash();
- } else if (opt == "--test") {
- ++index;
- if (index < argc) {
- unsigned int testNameIndex;
- if (testIndex(argv[index], testNameIndex)) {
- subrunner.add(tests_[testNameIndex]);
- } else {
- fprintf(stderr, "Test '%s' does not exist!\n", argv[index]);
- return 2;
- }
- } else {
- printUsage(argv[0]);
- return 2;
- }
- } else {
- printUsage(argv[0]);
- return 2;
- }
- }
- bool succeeded;
- if (subrunner.testCount() > 0) {
- succeeded = subrunner.runAllTest(subrunner.testCount() > 1);
- } else {
- succeeded = runAllTest(true);
- }
- return succeeded ? 0 : 1;
-}
-
-#if defined(_MSC_VER) && defined(_DEBUG)
-// Hook MSVCRT assertions to prevent dialog from appearing
-static int
-msvcrtSilentReportHook(int reportType, char* message, int* /*returnValue*/) {
- // The default CRT handling of error and assertion is to display
- // an error dialog to the user.
- // Instead, when an error or an assertion occurs, we force the
- // application to terminate using abort() after display
- // the message on stderr.
- if (reportType == _CRT_ERROR || reportType == _CRT_ASSERT) {
- // calling abort() cause the ReportHook to be called
- // The following is used to detect this case and let's the
- // error handler fallback on its default behaviour (
- // display a warning message)
- static volatile bool isAborting = false;
- if (isAborting) {
- return TRUE;
- }
- isAborting = true;
-
- fprintf(stderr, "CRT Error/Assert:\n%s\n", message);
- fflush(stderr);
- abort();
- }
- // Let's other reportType (_CRT_WARNING) be handled as they would by default
- return FALSE;
-}
-#endif // if defined(_MSC_VER)
-
-void Runner::preventDialogOnCrash() {
-#if defined(_MSC_VER) && defined(_DEBUG)
- // Install a hook to prevent MSVCRT error and assertion from
- // popping a dialog
- // This function a NO-OP in release configuration
- // (which cause warning since msvcrtSilentReportHook is not referenced)
- _CrtSetReportHook(&msvcrtSilentReportHook);
-#endif // if defined(_MSC_VER)
-
-// @todo investiguate this handler (for buffer overflow)
-// _set_security_error_handler
-
-#if defined(_WIN32)
- // Prevents the system from popping a dialog for debugging if the
- // application fails due to invalid memory access.
- SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX |
- SEM_NOOPENFILEERRORBOX);
-#endif // if defined(_WIN32)
-}
-
-void Runner::printUsage(const char* appName) {
- printf("Usage: %s [options]\n"
- "\n"
- "If --test is not specified, then all the test cases be run.\n"
- "\n"
- "Valid options:\n"
- "--list-tests: print the name of all test cases on the standard\n"
- " output and exit.\n"
- "--test TESTNAME: executes the test case with the specified name.\n"
- " May be repeated.\n"
- "--test-auto: prevent dialog prompting for debugging on crash.\n",
- appName);
-}
-
-// Assertion functions
-// //////////////////////////////////////////////////////////////////
-
-TestResult& checkStringEqual(TestResult& result,
- const std::string& expected,
- const std::string& actual,
- const char* file,
- unsigned int line,
- const char* expr) {
- if (expected != actual) {
- result.addFailure(file, line, expr);
- result << "Expected: '" << expected << "'\n";
- result << "Actual : '" << actual << "'";
- }
- return result;
-}
-
-} // namespace JsonTest
diff --git a/3rdparty/jsoncpp/src/test_lib_json/jsontest.h b/3rdparty/jsoncpp/src/test_lib_json/jsontest.h
deleted file mode 100644
index d6b7cf386a2..00000000000
--- a/3rdparty/jsoncpp/src/test_lib_json/jsontest.h
+++ /dev/null
@@ -1,280 +0,0 @@
-// Copyright 2007-2010 Baptiste Lepilleur
-// Distributed under MIT license, or public domain if desired and
-// recognized in your jurisdiction.
-// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
-
-#ifndef JSONTEST_H_INCLUDED
-#define JSONTEST_H_INCLUDED
-
-#include <json/config.h>
-#include <json/value.h>
-#include <json/writer.h>
-#include <stdio.h>
-#include <deque>
-#include <sstream>
-#include <string>
-
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-// Mini Unit Testing framework
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-
-/** \brief Unit testing framework.
- * \warning: all assertions are non-aborting, test case execution will continue
- * even if an assertion namespace.
- * This constraint is for portability: the framework needs to compile
- * on Visual Studio 6 and must not require exception usage.
- */
-namespace JsonTest {
-
-class Failure {
-public:
- const char* file_;
- unsigned int line_;
- std::string expr_;
- std::string message_;
- unsigned int nestingLevel_;
-};
-
-/// Context used to create the assertion callstack on failure.
-/// Must be a POD to allow inline initialisation without stepping
-/// into the debugger.
-struct PredicateContext {
- typedef unsigned int Id;
- Id id_;
- const char* file_;
- unsigned int line_;
- const char* expr_;
- PredicateContext* next_;
- /// Related Failure, set when the PredicateContext is converted
- /// into a Failure.
- Failure* failure_;
-};
-
-class TestResult {
-public:
- TestResult();
-
- /// \internal Implementation detail for assertion macros
- /// Not encapsulated to prevent step into when debugging failed assertions
- /// Incremented by one on assertion predicate entry, decreased by one
- /// by addPredicateContext().
- PredicateContext::Id predicateId_;
-
- /// \internal Implementation detail for predicate macros
- PredicateContext* predicateStackTail_;
-
- void setTestName(const std::string& name);
-
- /// Adds an assertion failure.
- TestResult&
- addFailure(const char* file, unsigned int line, const char* expr = 0);
-
- /// Removes the last PredicateContext added to the predicate stack
- /// chained list.
- /// Next messages will be targed at the PredicateContext that was removed.
- TestResult& popPredicateContext();
-
- bool failed() const;
-
- void printFailure(bool printTestName) const;
-
- // Generic operator that will work with anything ostream can deal with.
- template <typename T> TestResult& operator<<(const T& value) {
- std::ostringstream oss;
- oss.precision(16);
- oss.setf(std::ios_base::floatfield);
- oss << value;
- return addToLastFailure(oss.str());
- }
-
- // Specialized versions.
- TestResult& operator<<(bool value);
- // std:ostream does not support 64bits integers on all STL implementation
- TestResult& operator<<(Json::Int64 value);
- TestResult& operator<<(Json::UInt64 value);
-
-private:
- TestResult& addToLastFailure(const std::string& message);
- unsigned int getAssertionNestingLevel() const;
- /// Adds a failure or a predicate context
- void addFailureInfo(const char* file,
- unsigned int line,
- const char* expr,
- unsigned int nestingLevel);
- static std::string indentText(const std::string& text,
- const std::string& indent);
-
- typedef std::deque<Failure> Failures;
- Failures failures_;
- std::string name_;
- PredicateContext rootPredicateNode_;
- PredicateContext::Id lastUsedPredicateId_;
- /// Failure which is the target of the messages added using operator <<
- Failure* messageTarget_;
-};
-
-class TestCase {
-public:
- TestCase();
-
- virtual ~TestCase();
-
- void run(TestResult& result);
-
- virtual const char* testName() const = 0;
-
-protected:
- TestResult* result_;
-
-private:
- virtual void runTestCase() = 0;
-};
-
-/// Function pointer type for TestCase factory
-typedef TestCase* (*TestCaseFactory)();
-
-class Runner {
-public:
- Runner();
-
- /// Adds a test to the suite
- Runner& add(TestCaseFactory factory);
-
- /// Runs test as specified on the command-line
- /// If no command-line arguments are provided, run all tests.
- /// If --list-tests is provided, then print the list of all test cases
- /// If --test <testname> is provided, then run test testname.
- int runCommandLine(int argc, const char* argv[]) const;
-
- /// Runs all the test cases
- bool runAllTest(bool printSummary) const;
-
- /// Returns the number of test case in the suite
- unsigned int testCount() const;
-
- /// Returns the name of the test case at the specified index
- std::string testNameAt(unsigned int index) const;
-
- /// Runs the test case at the specified index using the specified TestResult
- void runTestAt(unsigned int index, TestResult& result) const;
-
- static void printUsage(const char* appName);
-
-private: // prevents copy construction and assignment
- Runner(const Runner& other);
- Runner& operator=(const Runner& other);
-
-private:
- void listTests() const;
- bool testIndex(const std::string& testName, unsigned int& index) const;
- static void preventDialogOnCrash();
-
-private:
- typedef std::deque<TestCaseFactory> Factories;
- Factories tests_;
-};
-
-template <typename T, typename U>
-TestResult& checkEqual(TestResult& result,
- T expected,
- U actual,
- const char* file,
- unsigned int line,
- const char* expr) {
- if (static_cast<U>(expected) != actual) {
- result.addFailure(file, line, expr);
- result << "Expected: " << static_cast<U>(expected) << "\n";
- result << "Actual : " << actual;
- }
- return result;
-}
-
-TestResult& checkStringEqual(TestResult& result,
- const std::string& expected,
- const std::string& actual,
- const char* file,
- unsigned int line,
- const char* expr);
-
-} // namespace JsonTest
-
-/// \brief Asserts that the given expression is true.
-/// JSONTEST_ASSERT( x == y ) << "x=" << x << ", y=" << y;
-/// JSONTEST_ASSERT( x == y );
-#define JSONTEST_ASSERT(expr) \
- if (expr) { \
- } else \
- result_->addFailure(__FILE__, __LINE__, #expr)
-
-/// \brief Asserts that the given predicate is true.
-/// The predicate may do other assertions and be a member function of the
-/// fixture.
-#define JSONTEST_ASSERT_PRED(expr) \
- { \
- JsonTest::PredicateContext _minitest_Context = { \
- result_->predicateId_, __FILE__, __LINE__, #expr, NULL, NULL \
- }; \
- result_->predicateStackTail_->next_ = &_minitest_Context; \
- result_->predicateId_ += 1; \
- result_->predicateStackTail_ = &_minitest_Context; \
- (expr); \
- result_->popPredicateContext(); \
- }
-
-/// \brief Asserts that two values are equals.
-#define JSONTEST_ASSERT_EQUAL(expected, actual) \
- JsonTest::checkEqual(*result_, \
- expected, \
- actual, \
- __FILE__, \
- __LINE__, \
- #expected " == " #actual)
-
-/// \brief Asserts that two values are equals.
-#define JSONTEST_ASSERT_STRING_EQUAL(expected, actual) \
- JsonTest::checkStringEqual(*result_, \
- std::string(expected), \
- std::string(actual), \
- __FILE__, \
- __LINE__, \
- #expected " == " #actual)
-
-/// \brief Asserts that a given expression throws an exception
-#define JSONTEST_ASSERT_THROWS(expr) \
- { \
- bool _threw = false; \
- try { \
- expr; \
- } \
- catch (...) { \
- _threw = true; \
- } \
- if (!_threw) \
- result_->addFailure( \
- __FILE__, __LINE__, "expected exception thrown: " #expr); \
- }
-
-/// \brief Begin a fixture test case.
-#define JSONTEST_FIXTURE(FixtureType, name) \
- class Test##FixtureType##name : public FixtureType { \
- public: \
- static JsonTest::TestCase* factory() { \
- return new Test##FixtureType##name(); \
- } \
- \
- public: /* overidden from TestCase */ \
- virtual const char* testName() const { return #FixtureType "/" #name; } \
- virtual void runTestCase(); \
- }; \
- \
- void Test##FixtureType##name::runTestCase()
-
-#define JSONTEST_FIXTURE_FACTORY(FixtureType, name) \
- &Test##FixtureType##name::factory
-
-#define JSONTEST_REGISTER_FIXTURE(runner, FixtureType, name) \
- (runner).add(JSONTEST_FIXTURE_FACTORY(FixtureType, name))
-
-#endif // ifndef JSONTEST_H_INCLUDED
diff --git a/3rdparty/jsoncpp/src/test_lib_json/main.cpp b/3rdparty/jsoncpp/src/test_lib_json/main.cpp
deleted file mode 100644
index 0d4284e5373..00000000000
--- a/3rdparty/jsoncpp/src/test_lib_json/main.cpp
+++ /dev/null
@@ -1,2406 +0,0 @@
-// Copyright 2007-2010 Baptiste Lepilleur
-// Distributed under MIT license, or public domain if desired and
-// recognized in your jurisdiction.
-// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
-
-#include "jsontest.h"
-#include <json/config.h>
-#include <json/json.h>
-#include <cstring>
-
-// Make numeric limits more convenient to talk about.
-// Assumes int type in 32 bits.
-#define kint32max Json::Value::maxInt
-#define kint32min Json::Value::minInt
-#define kuint32max Json::Value::maxUInt
-#define kint64max Json::Value::maxInt64
-#define kint64min Json::Value::minInt64
-#define kuint64max Json::Value::maxUInt64
-
-//static const double kdint64max = double(kint64max);
-//static const float kfint64max = float(kint64max);
-static const float kfint32max = float(kint32max);
-static const float kfuint32max = float(kuint32max);
-
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-// Json Library test cases
-// //////////////////////////////////////////////////////////////////
-// //////////////////////////////////////////////////////////////////
-
-#if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
-static inline double uint64ToDouble(Json::UInt64 value) {
- return static_cast<double>(value);
-}
-#else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
-static inline double uint64ToDouble(Json::UInt64 value) {
- return static_cast<double>(Json::Int64(value / 2)) * 2.0 +
- Json::Int64(value & 1);
-}
-#endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
-
-struct ValueTest : JsonTest::TestCase {
- Json::Value null_;
- Json::Value emptyArray_;
- Json::Value emptyObject_;
- Json::Value integer_;
- Json::Value unsignedInteger_;
- Json::Value smallUnsignedInteger_;
- Json::Value real_;
- Json::Value float_;
- Json::Value array1_;
- Json::Value object1_;
- Json::Value emptyString_;
- Json::Value string1_;
- Json::Value string_;
- Json::Value true_;
- Json::Value false_;
-
- ValueTest()
- : emptyArray_(Json::arrayValue), emptyObject_(Json::objectValue),
- integer_(123456789), unsignedInteger_(34567890u),
- smallUnsignedInteger_(Json::Value::UInt(Json::Value::maxInt)),
- real_(1234.56789), float_(0.00390625f), emptyString_(""), string1_("a"),
- string_("sometext with space"), true_(true), false_(false) {
- array1_.append(1234);
- object1_["id"] = 1234;
- }
-
- struct IsCheck {
- /// Initialize all checks to \c false by default.
- IsCheck();
-
- bool isObject_;
- bool isArray_;
- bool isBool_;
- bool isString_;
- bool isNull_;
-
- bool isInt_;
- bool isInt64_;
- bool isUInt_;
- bool isUInt64_;
- bool isIntegral_;
- bool isDouble_;
- bool isNumeric_;
- };
-
- void checkConstMemberCount(const Json::Value& value,
- unsigned int expectedCount);
-
- void checkMemberCount(Json::Value& value, unsigned int expectedCount);
-
- void checkIs(const Json::Value& value, const IsCheck& check);
-
- void checkIsLess(const Json::Value& x, const Json::Value& y);
-
- void checkIsEqual(const Json::Value& x, const Json::Value& y);
-
- /// Normalize the representation of floating-point number by stripped leading
- /// 0 in exponent.
- static std::string normalizeFloatingPointStr(const std::string& s);
-};
-
-std::string ValueTest::normalizeFloatingPointStr(const std::string& s) {
- std::string::size_type index = s.find_last_of("eE");
- if (index != std::string::npos) {
- std::string::size_type hasSign =
- (s[index + 1] == '+' || s[index + 1] == '-') ? 1 : 0;
- std::string::size_type exponentStartIndex = index + 1 + hasSign;
- std::string normalized = s.substr(0, exponentStartIndex);
- std::string::size_type indexDigit =
- s.find_first_not_of('0', exponentStartIndex);
- std::string exponent = "0";
- if (indexDigit !=
- std::string::npos) // There is an exponent different from 0
- {
- exponent = s.substr(indexDigit);
- }
- return normalized + exponent;
- }
- return s;
-}
-
-JSONTEST_FIXTURE(ValueTest, checkNormalizeFloatingPointStr) {
- JSONTEST_ASSERT_STRING_EQUAL("0.0", normalizeFloatingPointStr("0.0"));
- JSONTEST_ASSERT_STRING_EQUAL("0e0", normalizeFloatingPointStr("0e0"));
- JSONTEST_ASSERT_STRING_EQUAL("1234.0", normalizeFloatingPointStr("1234.0"));
- JSONTEST_ASSERT_STRING_EQUAL("1234.0e0",
- normalizeFloatingPointStr("1234.0e0"));
- JSONTEST_ASSERT_STRING_EQUAL("1234.0e+0",
- normalizeFloatingPointStr("1234.0e+0"));
- JSONTEST_ASSERT_STRING_EQUAL("1234e-1", normalizeFloatingPointStr("1234e-1"));
- JSONTEST_ASSERT_STRING_EQUAL("1234e10", normalizeFloatingPointStr("1234e10"));
- JSONTEST_ASSERT_STRING_EQUAL("1234e10",
- normalizeFloatingPointStr("1234e010"));
- JSONTEST_ASSERT_STRING_EQUAL("1234e+10",
- normalizeFloatingPointStr("1234e+010"));
- JSONTEST_ASSERT_STRING_EQUAL("1234e-10",
- normalizeFloatingPointStr("1234e-010"));
- JSONTEST_ASSERT_STRING_EQUAL("1234e+100",
- normalizeFloatingPointStr("1234e+100"));
- JSONTEST_ASSERT_STRING_EQUAL("1234e-100",
- normalizeFloatingPointStr("1234e-100"));
- JSONTEST_ASSERT_STRING_EQUAL("1234e+1",
- normalizeFloatingPointStr("1234e+001"));
-}
-
-JSONTEST_FIXTURE(ValueTest, memberCount) {
- JSONTEST_ASSERT_PRED(checkMemberCount(emptyArray_, 0));
- JSONTEST_ASSERT_PRED(checkMemberCount(emptyObject_, 0));
- JSONTEST_ASSERT_PRED(checkMemberCount(array1_, 1));
- JSONTEST_ASSERT_PRED(checkMemberCount(object1_, 1));
- JSONTEST_ASSERT_PRED(checkMemberCount(null_, 0));
- JSONTEST_ASSERT_PRED(checkMemberCount(integer_, 0));
- JSONTEST_ASSERT_PRED(checkMemberCount(unsignedInteger_, 0));
- JSONTEST_ASSERT_PRED(checkMemberCount(smallUnsignedInteger_, 0));
- JSONTEST_ASSERT_PRED(checkMemberCount(real_, 0));
- JSONTEST_ASSERT_PRED(checkMemberCount(emptyString_, 0));
- JSONTEST_ASSERT_PRED(checkMemberCount(string_, 0));
- JSONTEST_ASSERT_PRED(checkMemberCount(true_, 0));
-}
-
-JSONTEST_FIXTURE(ValueTest, objects) {
- // Types
- IsCheck checks;
- checks.isObject_ = true;
- JSONTEST_ASSERT_PRED(checkIs(emptyObject_, checks));
- JSONTEST_ASSERT_PRED(checkIs(object1_, checks));
-
- JSONTEST_ASSERT_EQUAL(Json::objectValue, emptyObject_.type());
-
- // Empty object okay
- JSONTEST_ASSERT(emptyObject_.isConvertibleTo(Json::nullValue));
-
- // Non-empty object not okay
- JSONTEST_ASSERT(!object1_.isConvertibleTo(Json::nullValue));
-
- // Always okay
- JSONTEST_ASSERT(emptyObject_.isConvertibleTo(Json::objectValue));
-
- // Never okay
- JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::arrayValue));
- JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::intValue));
- JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::uintValue));
- JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::realValue));
- JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::booleanValue));
- JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::stringValue));
-
- // Access through const reference
- const Json::Value& constObject = object1_;
-
- JSONTEST_ASSERT_EQUAL(Json::Value(1234), constObject["id"]);
- JSONTEST_ASSERT_EQUAL(Json::Value(), constObject["unknown id"]);
-
- // Access through non-const reference
- JSONTEST_ASSERT_EQUAL(Json::Value(1234), object1_["id"]);
- JSONTEST_ASSERT_EQUAL(Json::Value(), object1_["unknown id"]);
-
- object1_["some other id"] = "foo";
- JSONTEST_ASSERT_EQUAL(Json::Value("foo"), object1_["some other id"]);
- JSONTEST_ASSERT_EQUAL(Json::Value("foo"), object1_["some other id"]);
-
- // Remove.
- Json::Value got;
- bool did;
- did = object1_.removeMember("some other id", &got);
- JSONTEST_ASSERT_EQUAL(Json::Value("foo"), got);
- JSONTEST_ASSERT_EQUAL(true, did);
- got = Json::Value("bar");
- did = object1_.removeMember("some other id", &got);
- JSONTEST_ASSERT_EQUAL(Json::Value("bar"), got);
- JSONTEST_ASSERT_EQUAL(false, did);
-}
-
-JSONTEST_FIXTURE(ValueTest, arrays) {
- const unsigned int index0 = 0;
-
- // Types
- IsCheck checks;
- checks.isArray_ = true;
- JSONTEST_ASSERT_PRED(checkIs(emptyArray_, checks));
- JSONTEST_ASSERT_PRED(checkIs(array1_, checks));
-
- JSONTEST_ASSERT_EQUAL(Json::arrayValue, array1_.type());
-
- // Empty array okay
- JSONTEST_ASSERT(emptyArray_.isConvertibleTo(Json::nullValue));
-
- // Non-empty array not okay
- JSONTEST_ASSERT(!array1_.isConvertibleTo(Json::nullValue));
-
- // Always okay
- JSONTEST_ASSERT(emptyArray_.isConvertibleTo(Json::arrayValue));
-
- // Never okay
- JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::objectValue));
- JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::intValue));
- JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::uintValue));
- JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::realValue));
- JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::booleanValue));
- JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::stringValue));
-
- // Access through const reference
- const Json::Value& constArray = array1_;
- JSONTEST_ASSERT_EQUAL(Json::Value(1234), constArray[index0]);
- JSONTEST_ASSERT_EQUAL(Json::Value(1234), constArray[0]);
-
- // Access through non-const reference
- JSONTEST_ASSERT_EQUAL(Json::Value(1234), array1_[index0]);
- JSONTEST_ASSERT_EQUAL(Json::Value(1234), array1_[0]);
-
- array1_[2] = Json::Value(17);
- JSONTEST_ASSERT_EQUAL(Json::Value(), array1_[1]);
- JSONTEST_ASSERT_EQUAL(Json::Value(17), array1_[2]);
- Json::Value got;
- JSONTEST_ASSERT_EQUAL(true, array1_.removeIndex(2, &got));
- JSONTEST_ASSERT_EQUAL(Json::Value(17), got);
- JSONTEST_ASSERT_EQUAL(false, array1_.removeIndex(2, &got)); // gone now
-}
-JSONTEST_FIXTURE(ValueTest, arrayIssue252)
-{
- int count = 5;
- Json::Value root;
- Json::Value item;
- root["array"] = Json::Value::nullRef;
- for (int i = 0; i < count; i++)
- {
- item["a"] = i;
- item["b"] = i;
- root["array"][i] = item;
- }
- //JSONTEST_ASSERT_EQUAL(5, root["array"].size());
-}
-
-JSONTEST_FIXTURE(ValueTest, null) {
- JSONTEST_ASSERT_EQUAL(Json::nullValue, null_.type());
-
- IsCheck checks;
- checks.isNull_ = true;
- JSONTEST_ASSERT_PRED(checkIs(null_, checks));
-
- JSONTEST_ASSERT(null_.isConvertibleTo(Json::nullValue));
- JSONTEST_ASSERT(null_.isConvertibleTo(Json::intValue));
- JSONTEST_ASSERT(null_.isConvertibleTo(Json::uintValue));
- JSONTEST_ASSERT(null_.isConvertibleTo(Json::realValue));
- JSONTEST_ASSERT(null_.isConvertibleTo(Json::booleanValue));
- JSONTEST_ASSERT(null_.isConvertibleTo(Json::stringValue));
- JSONTEST_ASSERT(null_.isConvertibleTo(Json::arrayValue));
- JSONTEST_ASSERT(null_.isConvertibleTo(Json::objectValue));
-
- JSONTEST_ASSERT_EQUAL(Json::Int(0), null_.asInt());
- JSONTEST_ASSERT_EQUAL(Json::LargestInt(0), null_.asLargestInt());
- JSONTEST_ASSERT_EQUAL(Json::UInt(0), null_.asUInt());
- JSONTEST_ASSERT_EQUAL(Json::LargestUInt(0), null_.asLargestUInt());
- JSONTEST_ASSERT_EQUAL(0.0, null_.asDouble());
- JSONTEST_ASSERT_EQUAL(0.0, null_.asFloat());
- JSONTEST_ASSERT_STRING_EQUAL("", null_.asString());
-
- JSONTEST_ASSERT_EQUAL(Json::Value::null, null_);
-}
-
-JSONTEST_FIXTURE(ValueTest, strings) {
- JSONTEST_ASSERT_EQUAL(Json::stringValue, string1_.type());
-
- IsCheck checks;
- checks.isString_ = true;
- JSONTEST_ASSERT_PRED(checkIs(emptyString_, checks));
- JSONTEST_ASSERT_PRED(checkIs(string_, checks));
- JSONTEST_ASSERT_PRED(checkIs(string1_, checks));
-
- // Empty string okay
- JSONTEST_ASSERT(emptyString_.isConvertibleTo(Json::nullValue));
-
- // Non-empty string not okay
- JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::nullValue));
-
- // Always okay
- JSONTEST_ASSERT(string1_.isConvertibleTo(Json::stringValue));
-
- // Never okay
- JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::objectValue));
- JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::arrayValue));
- JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::intValue));
- JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::uintValue));
- JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::realValue));
-
- JSONTEST_ASSERT_STRING_EQUAL("a", string1_.asString());
- JSONTEST_ASSERT_STRING_EQUAL("a", string1_.asCString());
-}
-
-JSONTEST_FIXTURE(ValueTest, bools) {
- JSONTEST_ASSERT_EQUAL(Json::booleanValue, false_.type());
-
- IsCheck checks;
- checks.isBool_ = true;
- JSONTEST_ASSERT_PRED(checkIs(false_, checks));
- JSONTEST_ASSERT_PRED(checkIs(true_, checks));
-
- // False okay
- JSONTEST_ASSERT(false_.isConvertibleTo(Json::nullValue));
-
- // True not okay
- JSONTEST_ASSERT(!true_.isConvertibleTo(Json::nullValue));
-
- // Always okay
- JSONTEST_ASSERT(true_.isConvertibleTo(Json::intValue));
- JSONTEST_ASSERT(true_.isConvertibleTo(Json::uintValue));
- JSONTEST_ASSERT(true_.isConvertibleTo(Json::realValue));
- JSONTEST_ASSERT(true_.isConvertibleTo(Json::booleanValue));
- JSONTEST_ASSERT(true_.isConvertibleTo(Json::stringValue));
-
- // Never okay
- JSONTEST_ASSERT(!true_.isConvertibleTo(Json::arrayValue));
- JSONTEST_ASSERT(!true_.isConvertibleTo(Json::objectValue));
-
- JSONTEST_ASSERT_EQUAL(true, true_.asBool());
- JSONTEST_ASSERT_EQUAL(1, true_.asInt());
- JSONTEST_ASSERT_EQUAL(1, true_.asLargestInt());
- JSONTEST_ASSERT_EQUAL(1, true_.asUInt());
- JSONTEST_ASSERT_EQUAL(1, true_.asLargestUInt());
- JSONTEST_ASSERT_EQUAL(1.0, true_.asDouble());
- JSONTEST_ASSERT_EQUAL(1.0, true_.asFloat());
-
- JSONTEST_ASSERT_EQUAL(false, false_.asBool());
- JSONTEST_ASSERT_EQUAL(0, false_.asInt());
- JSONTEST_ASSERT_EQUAL(0, false_.asLargestInt());
- JSONTEST_ASSERT_EQUAL(0, false_.asUInt());
- JSONTEST_ASSERT_EQUAL(0, false_.asLargestUInt());
- JSONTEST_ASSERT_EQUAL(0.0, false_.asDouble());
- JSONTEST_ASSERT_EQUAL(0.0, false_.asFloat());
-}
-
-JSONTEST_FIXTURE(ValueTest, integers) {
- IsCheck checks;
- Json::Value val;
-
- // Conversions that don't depend on the value.
- JSONTEST_ASSERT(Json::Value(17).isConvertibleTo(Json::realValue));
- JSONTEST_ASSERT(Json::Value(17).isConvertibleTo(Json::stringValue));
- JSONTEST_ASSERT(Json::Value(17).isConvertibleTo(Json::booleanValue));
- JSONTEST_ASSERT(!Json::Value(17).isConvertibleTo(Json::arrayValue));
- JSONTEST_ASSERT(!Json::Value(17).isConvertibleTo(Json::objectValue));
-
- JSONTEST_ASSERT(Json::Value(17U).isConvertibleTo(Json::realValue));
- JSONTEST_ASSERT(Json::Value(17U).isConvertibleTo(Json::stringValue));
- JSONTEST_ASSERT(Json::Value(17U).isConvertibleTo(Json::booleanValue));
- JSONTEST_ASSERT(!Json::Value(17U).isConvertibleTo(Json::arrayValue));
- JSONTEST_ASSERT(!Json::Value(17U).isConvertibleTo(Json::objectValue));
-
- JSONTEST_ASSERT(Json::Value(17.0).isConvertibleTo(Json::realValue));
- JSONTEST_ASSERT(Json::Value(17.0).isConvertibleTo(Json::stringValue));
- JSONTEST_ASSERT(Json::Value(17.0).isConvertibleTo(Json::booleanValue));
- JSONTEST_ASSERT(!Json::Value(17.0).isConvertibleTo(Json::arrayValue));
- JSONTEST_ASSERT(!Json::Value(17.0).isConvertibleTo(Json::objectValue));
-
- // Default int
- val = Json::Value(Json::intValue);
-
- JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
-
- checks = IsCheck();
- checks.isInt_ = true;
- checks.isInt64_ = true;
- checks.isUInt_ = true;
- checks.isUInt64_ = true;
- checks.isIntegral_ = true;
- checks.isDouble_ = true;
- checks.isNumeric_ = true;
- JSONTEST_ASSERT_PRED(checkIs(val, checks));
-
- JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
- JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
- JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
-
- JSONTEST_ASSERT_EQUAL(0, val.asInt());
- JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
- JSONTEST_ASSERT_EQUAL(0, val.asUInt());
- JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
- JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
- JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
- JSONTEST_ASSERT_EQUAL(false, val.asBool());
- JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
-
- // Default uint
- val = Json::Value(Json::uintValue);
-
- JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
-
- checks = IsCheck();
- checks.isInt_ = true;
- checks.isInt64_ = true;
- checks.isUInt_ = true;
- checks.isUInt64_ = true;
- checks.isIntegral_ = true;
- checks.isDouble_ = true;
- checks.isNumeric_ = true;
- JSONTEST_ASSERT_PRED(checkIs(val, checks));
-
- JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
- JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
- JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
-
- JSONTEST_ASSERT_EQUAL(0, val.asInt());
- JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
- JSONTEST_ASSERT_EQUAL(0, val.asUInt());
- JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
- JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
- JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
- JSONTEST_ASSERT_EQUAL(false, val.asBool());
- JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
-
- // Default real
- val = Json::Value(Json::realValue);
-
- JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
-
- JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
- JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
- JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
-
- checks = IsCheck();
- checks.isInt_ = true;
- checks.isInt64_ = true;
- checks.isUInt_ = true;
- checks.isUInt64_ = true;
- checks.isIntegral_ = true;
- checks.isDouble_ = true;
- checks.isNumeric_ = true;
- JSONTEST_ASSERT_PRED(checkIs(val, checks));
-
- JSONTEST_ASSERT_EQUAL(0, val.asInt());
- JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
- JSONTEST_ASSERT_EQUAL(0, val.asUInt());
- JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
- JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
- JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
- JSONTEST_ASSERT_EQUAL(false, val.asBool());
- JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
-
- // Zero (signed constructor arg)
- val = Json::Value(0);
-
- JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
-
- checks = IsCheck();
- checks.isInt_ = true;
- checks.isInt64_ = true;
- checks.isUInt_ = true;
- checks.isUInt64_ = true;
- checks.isIntegral_ = true;
- checks.isDouble_ = true;
- checks.isNumeric_ = true;
- JSONTEST_ASSERT_PRED(checkIs(val, checks));
-
- JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
- JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
- JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
-
- JSONTEST_ASSERT_EQUAL(0, val.asInt());
- JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
- JSONTEST_ASSERT_EQUAL(0, val.asUInt());
- JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
- JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
- JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
- JSONTEST_ASSERT_EQUAL(false, val.asBool());
- JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
-
- // Zero (unsigned constructor arg)
- val = Json::Value(0u);
-
- JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
-
- checks = IsCheck();
- checks.isInt_ = true;
- checks.isInt64_ = true;
- checks.isUInt_ = true;
- checks.isUInt64_ = true;
- checks.isIntegral_ = true;
- checks.isDouble_ = true;
- checks.isNumeric_ = true;
- JSONTEST_ASSERT_PRED(checkIs(val, checks));
-
- JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
- JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
- JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
-
- JSONTEST_ASSERT_EQUAL(0, val.asInt());
- JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
- JSONTEST_ASSERT_EQUAL(0, val.asUInt());
- JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
- JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
- JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
- JSONTEST_ASSERT_EQUAL(false, val.asBool());
- JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
-
- // Zero (floating-point constructor arg)
- val = Json::Value(0.0);
-
- JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
-
- checks = IsCheck();
- checks.isInt_ = true;
- checks.isInt64_ = true;
- checks.isUInt_ = true;
- checks.isUInt64_ = true;
- checks.isIntegral_ = true;
- checks.isDouble_ = true;
- checks.isNumeric_ = true;
- JSONTEST_ASSERT_PRED(checkIs(val, checks));
-
- JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
- JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
- JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
-
- JSONTEST_ASSERT_EQUAL(0, val.asInt());
- JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
- JSONTEST_ASSERT_EQUAL(0, val.asUInt());
- JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
- JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
- JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
- JSONTEST_ASSERT_EQUAL(false, val.asBool());
- JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
-
- // 2^20 (signed constructor arg)
- val = Json::Value(1 << 20);
-
- JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
- checks = IsCheck();
- checks.isInt_ = true;
- checks.isInt64_ = true;
- checks.isUInt_ = true;
- checks.isUInt64_ = true;
- checks.isIntegral_ = true;
- checks.isDouble_ = true;
- checks.isNumeric_ = true;
- JSONTEST_ASSERT_PRED(checkIs(val, checks));
-
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
- JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
- JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
-
- JSONTEST_ASSERT_EQUAL((1 << 20), val.asInt());
- JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestInt());
- JSONTEST_ASSERT_EQUAL((1 << 20), val.asUInt());
- JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestUInt());
- JSONTEST_ASSERT_EQUAL((1 << 20), val.asDouble());
- JSONTEST_ASSERT_EQUAL((1 << 20), val.asFloat());
- JSONTEST_ASSERT_EQUAL(true, val.asBool());
- JSONTEST_ASSERT_STRING_EQUAL("1048576", val.asString());
-
- // 2^20 (unsigned constructor arg)
- val = Json::Value(Json::UInt(1 << 20));
-
- JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
-
- checks = IsCheck();
- checks.isInt_ = true;
- checks.isInt64_ = true;
- checks.isUInt_ = true;
- checks.isUInt64_ = true;
- checks.isIntegral_ = true;
- checks.isDouble_ = true;
- checks.isNumeric_ = true;
- JSONTEST_ASSERT_PRED(checkIs(val, checks));
-
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
- JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
- JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
-
- JSONTEST_ASSERT_EQUAL((1 << 20), val.asInt());
- JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestInt());
- JSONTEST_ASSERT_EQUAL((1 << 20), val.asUInt());
- JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestUInt());
- JSONTEST_ASSERT_EQUAL((1 << 20), val.asDouble());
- JSONTEST_ASSERT_EQUAL((1 << 20), val.asFloat());
- JSONTEST_ASSERT_EQUAL(true, val.asBool());
- JSONTEST_ASSERT_STRING_EQUAL("1048576", val.asString());
-
- // 2^20 (floating-point constructor arg)
- val = Json::Value((1 << 20) / 1.0);
-
- JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
-
- checks = IsCheck();
- checks.isInt_ = true;
- checks.isInt64_ = true;
- checks.isUInt_ = true;
- checks.isUInt64_ = true;
- checks.isIntegral_ = true;
- checks.isDouble_ = true;
- checks.isNumeric_ = true;
- JSONTEST_ASSERT_PRED(checkIs(val, checks));
-
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
- JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
- JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
-
- JSONTEST_ASSERT_EQUAL((1 << 20), val.asInt());
- JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestInt());
- JSONTEST_ASSERT_EQUAL((1 << 20), val.asUInt());
- JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestUInt());
- JSONTEST_ASSERT_EQUAL((1 << 20), val.asDouble());
- JSONTEST_ASSERT_EQUAL((1 << 20), val.asFloat());
- JSONTEST_ASSERT_EQUAL(true, val.asBool());
- JSONTEST_ASSERT_STRING_EQUAL("1048576",
- normalizeFloatingPointStr(val.asString()));
-
- // -2^20
- val = Json::Value(-(1 << 20));
-
- JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
-
- checks = IsCheck();
- checks.isInt_ = true;
- checks.isInt64_ = true;
- checks.isIntegral_ = true;
- checks.isDouble_ = true;
- checks.isNumeric_ = true;
- JSONTEST_ASSERT_PRED(checkIs(val, checks));
-
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
- JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
-
- JSONTEST_ASSERT_EQUAL(-(1 << 20), val.asInt());
- JSONTEST_ASSERT_EQUAL(-(1 << 20), val.asLargestInt());
- JSONTEST_ASSERT_EQUAL(-(1 << 20), val.asDouble());
- JSONTEST_ASSERT_EQUAL(-(1 << 20), val.asFloat());
- JSONTEST_ASSERT_EQUAL(true, val.asBool());
- JSONTEST_ASSERT_STRING_EQUAL("-1048576", val.asString());
-
- // int32 max
- val = Json::Value(kint32max);
-
- JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
-
- checks = IsCheck();
- checks.isInt_ = true;
- checks.isInt64_ = true;
- checks.isUInt_ = true;
- checks.isUInt64_ = true;
- checks.isIntegral_ = true;
- checks.isDouble_ = true;
- checks.isNumeric_ = true;
- JSONTEST_ASSERT_PRED(checkIs(val, checks));
-
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
- JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
- JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
-
- JSONTEST_ASSERT_EQUAL(kint32max, val.asInt());
- JSONTEST_ASSERT_EQUAL(kint32max, val.asLargestInt());
- JSONTEST_ASSERT_EQUAL(kint32max, val.asUInt());
- JSONTEST_ASSERT_EQUAL(kint32max, val.asLargestUInt());
- JSONTEST_ASSERT_EQUAL(kint32max, val.asDouble());
- JSONTEST_ASSERT_EQUAL(kfint32max, val.asFloat());
- JSONTEST_ASSERT_EQUAL(true, val.asBool());
- JSONTEST_ASSERT_STRING_EQUAL("2147483647", val.asString());
-
- // int32 min
- val = Json::Value(kint32min);
-
- JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
-
- checks = IsCheck();
- checks.isInt_ = true;
- checks.isInt64_ = true;
- checks.isIntegral_ = true;
- checks.isDouble_ = true;
- checks.isNumeric_ = true;
- JSONTEST_ASSERT_PRED(checkIs(val, checks));
-
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
- JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
-
- JSONTEST_ASSERT_EQUAL(kint32min, val.asInt());
- JSONTEST_ASSERT_EQUAL(kint32min, val.asLargestInt());
- JSONTEST_ASSERT_EQUAL(kint32min, val.asDouble());
- JSONTEST_ASSERT_EQUAL(kint32min, val.asFloat());
- JSONTEST_ASSERT_EQUAL(true, val.asBool());
- JSONTEST_ASSERT_STRING_EQUAL("-2147483648", val.asString());
-
- // uint32 max
- val = Json::Value(kuint32max);
-
- JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
-
- checks = IsCheck();
- checks.isInt64_ = true;
- checks.isUInt_ = true;
- checks.isUInt64_ = true;
- checks.isIntegral_ = true;
- checks.isDouble_ = true;
- checks.isNumeric_ = true;
- JSONTEST_ASSERT_PRED(checkIs(val, checks));
-
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
- JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
-
-#ifndef JSON_NO_INT64
- JSONTEST_ASSERT_EQUAL(kuint32max, val.asLargestInt());
-#endif
- JSONTEST_ASSERT_EQUAL(kuint32max, val.asUInt());
- JSONTEST_ASSERT_EQUAL(kuint32max, val.asLargestUInt());
- JSONTEST_ASSERT_EQUAL(kuint32max, val.asDouble());
- JSONTEST_ASSERT_EQUAL(kfuint32max, val.asFloat());
- JSONTEST_ASSERT_EQUAL(true, val.asBool());
- JSONTEST_ASSERT_STRING_EQUAL("4294967295", val.asString());
-
-#ifdef JSON_NO_INT64
- // int64 max
- val = Json::Value(double(kint64max));
-
- JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
-
- checks = IsCheck();
- checks.isDouble_ = true;
- checks.isNumeric_ = true;
- JSONTEST_ASSERT_PRED(checkIs(val, checks));
-
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
-
- JSONTEST_ASSERT_EQUAL(double(kint64max), val.asDouble());
- JSONTEST_ASSERT_EQUAL(float(kint64max), val.asFloat());
- JSONTEST_ASSERT_EQUAL(true, val.asBool());
- JSONTEST_ASSERT_STRING_EQUAL("9.22337e+18", val.asString());
-
- // int64 min
- val = Json::Value(double(kint64min));
-
- JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
-
- checks = IsCheck();
- checks.isDouble_ = true;
- checks.isNumeric_ = true;
- JSONTEST_ASSERT_PRED(checkIs(val, checks));
-
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
-
- JSONTEST_ASSERT_EQUAL(double(kint64min), val.asDouble());
- JSONTEST_ASSERT_EQUAL(float(kint64min), val.asFloat());
- JSONTEST_ASSERT_EQUAL(true, val.asBool());
- JSONTEST_ASSERT_STRING_EQUAL("-9.22337e+18", val.asString());
-
- // uint64 max
- val = Json::Value(double(kuint64max));
-
- JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
-
- checks = IsCheck();
- checks.isDouble_ = true;
- checks.isNumeric_ = true;
- JSONTEST_ASSERT_PRED(checkIs(val, checks));
-
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
-
- JSONTEST_ASSERT_EQUAL(double(kuint64max), val.asDouble());
- JSONTEST_ASSERT_EQUAL(float(kuint64max), val.asFloat());
- JSONTEST_ASSERT_EQUAL(true, val.asBool());
- JSONTEST_ASSERT_STRING_EQUAL("1.84467e+19", val.asString());
-#else // ifdef JSON_NO_INT64
- // 2^40 (signed constructor arg)
- val = Json::Value(Json::Int64(1) << 40);
-
- JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
-
- checks = IsCheck();
- checks.isInt64_ = true;
- checks.isUInt64_ = true;
- checks.isIntegral_ = true;
- checks.isDouble_ = true;
- checks.isNumeric_ = true;
- JSONTEST_ASSERT_PRED(checkIs(val, checks));
-
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
-
- JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asInt64());
- JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestInt());
- JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asUInt64());
- JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestUInt());
- JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asDouble());
- JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asFloat());
- JSONTEST_ASSERT_EQUAL(true, val.asBool());
- JSONTEST_ASSERT_STRING_EQUAL("1099511627776", val.asString());
-
- // 2^40 (unsigned constructor arg)
- val = Json::Value(Json::UInt64(1) << 40);
-
- JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
-
- checks = IsCheck();
- checks.isInt64_ = true;
- checks.isUInt64_ = true;
- checks.isIntegral_ = true;
- checks.isDouble_ = true;
- checks.isNumeric_ = true;
- JSONTEST_ASSERT_PRED(checkIs(val, checks));
-
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
-
- JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asInt64());
- JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestInt());
- JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asUInt64());
- JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestUInt());
- JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asDouble());
- JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asFloat());
- JSONTEST_ASSERT_EQUAL(true, val.asBool());
- JSONTEST_ASSERT_STRING_EQUAL("1099511627776", val.asString());
-
- // 2^40 (floating-point constructor arg)
- val = Json::Value((Json::Int64(1) << 40) / 1.0);
-
- JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
-
- checks = IsCheck();
- checks.isInt64_ = true;
- checks.isUInt64_ = true;
- checks.isIntegral_ = true;
- checks.isDouble_ = true;
- checks.isNumeric_ = true;
- JSONTEST_ASSERT_PRED(checkIs(val, checks));
-
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
-
- JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asInt64());
- JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestInt());
- JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asUInt64());
- JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestUInt());
- JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asDouble());
- JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asFloat());
- JSONTEST_ASSERT_EQUAL(true, val.asBool());
- JSONTEST_ASSERT_STRING_EQUAL("1099511627776",
- normalizeFloatingPointStr(val.asString()));
-
- // -2^40
- val = Json::Value(-(Json::Int64(1) << 40));
-
- JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
-
- checks = IsCheck();
- checks.isInt64_ = true;
- checks.isIntegral_ = true;
- checks.isDouble_ = true;
- checks.isNumeric_ = true;
- JSONTEST_ASSERT_PRED(checkIs(val, checks));
-
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
-
- JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 40), val.asInt64());
- JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 40), val.asLargestInt());
- JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 40), val.asDouble());
- JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 40), val.asFloat());
- JSONTEST_ASSERT_EQUAL(true, val.asBool());
- JSONTEST_ASSERT_STRING_EQUAL("-1099511627776", val.asString());
-
- // int64 max
- val = Json::Value(Json::Int64(kint64max));
-
- JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
-
- checks = IsCheck();
- checks.isInt64_ = true;
- checks.isUInt64_ = true;
- checks.isIntegral_ = true;
- checks.isDouble_ = true;
- checks.isNumeric_ = true;
- JSONTEST_ASSERT_PRED(checkIs(val, checks));
-
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
-
- JSONTEST_ASSERT_EQUAL(kint64max, val.asInt64());
- JSONTEST_ASSERT_EQUAL(kint64max, val.asLargestInt());
- JSONTEST_ASSERT_EQUAL(kint64max, val.asUInt64());
- JSONTEST_ASSERT_EQUAL(kint64max, val.asLargestUInt());
- JSONTEST_ASSERT_EQUAL(double(kint64max), val.asDouble());
- JSONTEST_ASSERT_EQUAL(float(kint64max), val.asFloat());
- JSONTEST_ASSERT_EQUAL(true, val.asBool());
- JSONTEST_ASSERT_STRING_EQUAL("9223372036854775807", val.asString());
-
- // int64 max (floating point constructor). Note that kint64max is not exactly
- // representable as a double, and will be rounded up to be higher.
- val = Json::Value(double(kint64max));
-
- JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
-
- checks = IsCheck();
- checks.isUInt64_ = true;
- checks.isIntegral_ = true;
- checks.isDouble_ = true;
- checks.isNumeric_ = true;
- JSONTEST_ASSERT_PRED(checkIs(val, checks));
-
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
-
- JSONTEST_ASSERT_EQUAL(Json::UInt64(1) << 63, val.asUInt64());
- JSONTEST_ASSERT_EQUAL(Json::UInt64(1) << 63, val.asLargestUInt());
- JSONTEST_ASSERT_EQUAL(uint64ToDouble(Json::UInt64(1) << 63), val.asDouble());
- JSONTEST_ASSERT_EQUAL(float(uint64ToDouble(Json::UInt64(1) << 63)),
- val.asFloat());
- JSONTEST_ASSERT_EQUAL(true, val.asBool());
- JSONTEST_ASSERT_STRING_EQUAL("9.2233720368547758e+18",
- normalizeFloatingPointStr(val.asString()));
-
- // int64 min
- val = Json::Value(Json::Int64(kint64min));
-
- JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
-
- checks = IsCheck();
- checks.isInt64_ = true;
- checks.isIntegral_ = true;
- checks.isDouble_ = true;
- checks.isNumeric_ = true;
- JSONTEST_ASSERT_PRED(checkIs(val, checks));
-
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
-
- JSONTEST_ASSERT_EQUAL(kint64min, val.asInt64());
- JSONTEST_ASSERT_EQUAL(kint64min, val.asLargestInt());
- JSONTEST_ASSERT_EQUAL(double(kint64min), val.asDouble());
- JSONTEST_ASSERT_EQUAL(float(kint64min), val.asFloat());
- JSONTEST_ASSERT_EQUAL(true, val.asBool());
- JSONTEST_ASSERT_STRING_EQUAL("-9223372036854775808", val.asString());
-
- // int64 min (floating point constructor). Note that kint64min *is* exactly
- // representable as a double.
- val = Json::Value(double(kint64min));
-
- JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
-
- checks = IsCheck();
- checks.isInt64_ = true;
- checks.isIntegral_ = true;
- checks.isDouble_ = true;
- checks.isNumeric_ = true;
- JSONTEST_ASSERT_PRED(checkIs(val, checks));
-
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
-
- JSONTEST_ASSERT_EQUAL(kint64min, val.asInt64());
- JSONTEST_ASSERT_EQUAL(kint64min, val.asLargestInt());
- JSONTEST_ASSERT_EQUAL(-9223372036854775808.0, val.asDouble());
- JSONTEST_ASSERT_EQUAL(-9223372036854775808.0, val.asFloat());
- JSONTEST_ASSERT_EQUAL(true, val.asBool());
- JSONTEST_ASSERT_STRING_EQUAL("-9.2233720368547758e+18",
- normalizeFloatingPointStr(val.asString()));
-
- // 10^19
- const Json::UInt64 ten_to_19 = static_cast<Json::UInt64>(1e19);
- val = Json::Value(Json::UInt64(ten_to_19));
-
- JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
-
- checks = IsCheck();
- checks.isUInt64_ = true;
- checks.isIntegral_ = true;
- checks.isDouble_ = true;
- checks.isNumeric_ = true;
- JSONTEST_ASSERT_PRED(checkIs(val, checks));
-
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
-
- JSONTEST_ASSERT_EQUAL(ten_to_19, val.asUInt64());
- JSONTEST_ASSERT_EQUAL(ten_to_19, val.asLargestUInt());
- JSONTEST_ASSERT_EQUAL(uint64ToDouble(ten_to_19), val.asDouble());
- JSONTEST_ASSERT_EQUAL(float(uint64ToDouble(ten_to_19)), val.asFloat());
- JSONTEST_ASSERT_EQUAL(true, val.asBool());
- JSONTEST_ASSERT_STRING_EQUAL("10000000000000000000", val.asString());
-
- // 10^19 (double constructor). Note that 10^19 is not exactly representable
- // as a double.
- val = Json::Value(uint64ToDouble(ten_to_19));
-
- JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
-
- checks = IsCheck();
- checks.isUInt64_ = true;
- checks.isIntegral_ = true;
- checks.isDouble_ = true;
- checks.isNumeric_ = true;
- JSONTEST_ASSERT_PRED(checkIs(val, checks));
-
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
-
- JSONTEST_ASSERT_EQUAL(1e19, val.asDouble());
- JSONTEST_ASSERT_EQUAL(1e19, val.asFloat());
- JSONTEST_ASSERT_EQUAL(true, val.asBool());
- JSONTEST_ASSERT_STRING_EQUAL("1e+19",
- normalizeFloatingPointStr(val.asString()));
-
- // uint64 max
- val = Json::Value(Json::UInt64(kuint64max));
-
- JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
-
- checks = IsCheck();
- checks.isUInt64_ = true;
- checks.isIntegral_ = true;
- checks.isDouble_ = true;
- checks.isNumeric_ = true;
- JSONTEST_ASSERT_PRED(checkIs(val, checks));
-
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
-
- JSONTEST_ASSERT_EQUAL(kuint64max, val.asUInt64());
- JSONTEST_ASSERT_EQUAL(kuint64max, val.asLargestUInt());
- JSONTEST_ASSERT_EQUAL(uint64ToDouble(kuint64max), val.asDouble());
- JSONTEST_ASSERT_EQUAL(float(uint64ToDouble(kuint64max)), val.asFloat());
- JSONTEST_ASSERT_EQUAL(true, val.asBool());
- JSONTEST_ASSERT_STRING_EQUAL("18446744073709551615", val.asString());
-
- // uint64 max (floating point constructor). Note that kuint64max is not
- // exactly representable as a double, and will be rounded up to be higher.
- val = Json::Value(uint64ToDouble(kuint64max));
-
- JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
-
- checks = IsCheck();
- checks.isDouble_ = true;
- checks.isNumeric_ = true;
- JSONTEST_ASSERT_PRED(checkIs(val, checks));
-
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
-
- JSONTEST_ASSERT_EQUAL(18446744073709551616.0, val.asDouble());
- JSONTEST_ASSERT_EQUAL(18446744073709551616.0, val.asFloat());
- JSONTEST_ASSERT_EQUAL(true, val.asBool());
- JSONTEST_ASSERT_STRING_EQUAL("1.8446744073709552e+19",
- normalizeFloatingPointStr(val.asString()));
-#endif
-}
-
-JSONTEST_FIXTURE(ValueTest, nonIntegers) {
- IsCheck checks;
- Json::Value val;
-
- // Small positive number
- val = Json::Value(1.5);
-
- JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
-
- checks = IsCheck();
- checks.isDouble_ = true;
- checks.isNumeric_ = true;
- JSONTEST_ASSERT_PRED(checkIs(val, checks));
-
- JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
- JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
- JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
- JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
- JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));
-
- JSONTEST_ASSERT_EQUAL(1.5, val.asDouble());
- JSONTEST_ASSERT_EQUAL(1.5, val.asFloat());
- JSONTEST_ASSERT_EQUAL(1, val.asInt());
- JSONTEST_ASSERT_EQUAL(1, val.asLargestInt());
- JSONTEST_ASSERT_EQUAL(1, val.asUInt());
- JSONTEST_ASSERT_EQUAL(1, val.asLargestUInt());
- JSONTEST_ASSERT_EQUAL(true, val.asBool());
- JSONTEST_ASSERT_EQUAL("1.5", val.asString());
-
- // Small negative number
- val = Json::Value(-1.5);
-
- JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
-
- checks = IsCheck();
- checks.isDouble_ = true;
- checks.isNumeric_ = true;
- JSONTEST_ASSERT_PRED(checkIs(val, checks));
-
- JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
- JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
- JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
- JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));
-
- JSONTEST_ASSERT_EQUAL(-1.5, val.asDouble());
- JSONTEST_ASSERT_EQUAL(-1.5, val.asFloat());
- JSONTEST_ASSERT_EQUAL(-1, val.asInt());
- JSONTEST_ASSERT_EQUAL(-1, val.asLargestInt());
- JSONTEST_ASSERT_EQUAL(true, val.asBool());
- JSONTEST_ASSERT_EQUAL("-1.5", val.asString());
-
- // A bit over int32 max
- val = Json::Value(kint32max + 0.5);
-
- JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
-
- checks = IsCheck();
- checks.isDouble_ = true;
- checks.isNumeric_ = true;
- JSONTEST_ASSERT_PRED(checkIs(val, checks));
-
- JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
- JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
- JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
- JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));
-
- JSONTEST_ASSERT_EQUAL(2147483647.5, val.asDouble());
- JSONTEST_ASSERT_EQUAL(float(2147483647.5), val.asFloat());
- JSONTEST_ASSERT_EQUAL(2147483647U, val.asUInt());
-#ifdef JSON_HAS_INT64
- JSONTEST_ASSERT_EQUAL(2147483647L, val.asLargestInt());
- JSONTEST_ASSERT_EQUAL(2147483647U, val.asLargestUInt());
-#endif
- JSONTEST_ASSERT_EQUAL(true, val.asBool());
- JSONTEST_ASSERT_EQUAL("2147483647.5",
- normalizeFloatingPointStr(val.asString()));
-
- // A bit under int32 min
- val = Json::Value(kint32min - 0.5);
-
- JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
-
- checks = IsCheck();
- checks.isDouble_ = true;
- checks.isNumeric_ = true;
- JSONTEST_ASSERT_PRED(checkIs(val, checks));
-
- JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
- JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
- JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));
-
- JSONTEST_ASSERT_EQUAL(-2147483648.5, val.asDouble());
- JSONTEST_ASSERT_EQUAL(float(-2147483648.5), val.asFloat());
-#ifdef JSON_HAS_INT64
- JSONTEST_ASSERT_EQUAL(-Json::Int64(1) << 31, val.asLargestInt());
-#endif
- JSONTEST_ASSERT_EQUAL(true, val.asBool());
- JSONTEST_ASSERT_EQUAL("-2147483648.5",
- normalizeFloatingPointStr(val.asString()));
-
- // A bit over uint32 max
- val = Json::Value(kuint32max + 0.5);
-
- JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
-
- checks = IsCheck();
- checks.isDouble_ = true;
- checks.isNumeric_ = true;
- JSONTEST_ASSERT_PRED(checkIs(val, checks));
-
- JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
- JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
- JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
- JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));
-
- JSONTEST_ASSERT_EQUAL(4294967295.5, val.asDouble());
- JSONTEST_ASSERT_EQUAL(float(4294967295.5), val.asFloat());
-#ifdef JSON_HAS_INT64
- JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 32) - 1, val.asLargestInt());
- JSONTEST_ASSERT_EQUAL((Json::UInt64(1) << 32) - Json::UInt64(1),
- val.asLargestUInt());
-#endif
- JSONTEST_ASSERT_EQUAL(true, val.asBool());
- JSONTEST_ASSERT_EQUAL("4294967295.5",
- normalizeFloatingPointStr(val.asString()));
-
- val = Json::Value(1.2345678901234);
- JSONTEST_ASSERT_STRING_EQUAL("1.2345678901234001",
- normalizeFloatingPointStr(val.asString()));
-
- // A 16-digit floating point number.
- val = Json::Value(2199023255552000.0f);
- JSONTEST_ASSERT_EQUAL(float(2199023255552000), val.asFloat());
- JSONTEST_ASSERT_STRING_EQUAL("2199023255552000",
- normalizeFloatingPointStr(val.asString()));
-
- // A very large floating point number.
- val = Json::Value(3.402823466385289e38);
- JSONTEST_ASSERT_EQUAL(float(3.402823466385289e38), val.asFloat());
- JSONTEST_ASSERT_STRING_EQUAL("3.402823466385289e+38",
- normalizeFloatingPointStr(val.asString()));
-
- // An even larger floating point number.
- val = Json::Value(1.2345678e300);
- JSONTEST_ASSERT_EQUAL(double(1.2345678e300), val.asDouble());
- JSONTEST_ASSERT_STRING_EQUAL("1.2345678e+300",
- normalizeFloatingPointStr(val.asString()));
-}
-
-void ValueTest::checkConstMemberCount(const Json::Value& value,
- unsigned int expectedCount) {
- unsigned int count = 0;
- Json::Value::const_iterator itEnd = value.end();
- for (Json::Value::const_iterator it = value.begin(); it != itEnd; ++it) {
- ++count;
- }
- JSONTEST_ASSERT_EQUAL(expectedCount, count) << "Json::Value::const_iterator";
-}
-
-void ValueTest::checkMemberCount(Json::Value& value,
- unsigned int expectedCount) {
- JSONTEST_ASSERT_EQUAL(expectedCount, value.size());
-
- unsigned int count = 0;
- Json::Value::iterator itEnd = value.end();
- for (Json::Value::iterator it = value.begin(); it != itEnd; ++it) {
- ++count;
- }
- JSONTEST_ASSERT_EQUAL(expectedCount, count) << "Json::Value::iterator";
-
- JSONTEST_ASSERT_PRED(checkConstMemberCount(value, expectedCount));
-}
-
-ValueTest::IsCheck::IsCheck()
- : isObject_(false), isArray_(false), isBool_(false), isString_(false),
- isNull_(false), isInt_(false), isInt64_(false), isUInt_(false),
- isUInt64_(false), isIntegral_(false), isDouble_(false),
- isNumeric_(false) {}
-
-void ValueTest::checkIs(const Json::Value& value, const IsCheck& check) {
- JSONTEST_ASSERT_EQUAL(check.isObject_, value.isObject());
- JSONTEST_ASSERT_EQUAL(check.isArray_, value.isArray());
- JSONTEST_ASSERT_EQUAL(check.isBool_, value.isBool());
- JSONTEST_ASSERT_EQUAL(check.isDouble_, value.isDouble());
- JSONTEST_ASSERT_EQUAL(check.isInt_, value.isInt());
- JSONTEST_ASSERT_EQUAL(check.isUInt_, value.isUInt());
- JSONTEST_ASSERT_EQUAL(check.isIntegral_, value.isIntegral());
- JSONTEST_ASSERT_EQUAL(check.isNumeric_, value.isNumeric());
- JSONTEST_ASSERT_EQUAL(check.isString_, value.isString());
- JSONTEST_ASSERT_EQUAL(check.isNull_, value.isNull());
-
-#ifdef JSON_HAS_INT64
- JSONTEST_ASSERT_EQUAL(check.isInt64_, value.isInt64());
- JSONTEST_ASSERT_EQUAL(check.isUInt64_, value.isUInt64());
-#else
- JSONTEST_ASSERT_EQUAL(false, value.isInt64());
- JSONTEST_ASSERT_EQUAL(false, value.isUInt64());
-#endif
-}
-
-JSONTEST_FIXTURE(ValueTest, compareNull) {
- JSONTEST_ASSERT_PRED(checkIsEqual(Json::Value(), Json::Value()));
-}
-
-JSONTEST_FIXTURE(ValueTest, compareInt) {
- JSONTEST_ASSERT_PRED(checkIsLess(0, 10));
- JSONTEST_ASSERT_PRED(checkIsEqual(10, 10));
- JSONTEST_ASSERT_PRED(checkIsEqual(-10, -10));
- JSONTEST_ASSERT_PRED(checkIsLess(-10, 0));
-}
-
-JSONTEST_FIXTURE(ValueTest, compareUInt) {
- JSONTEST_ASSERT_PRED(checkIsLess(0u, 10u));
- JSONTEST_ASSERT_PRED(checkIsLess(0u, Json::Value::maxUInt));
- JSONTEST_ASSERT_PRED(checkIsEqual(10u, 10u));
-}
-
-JSONTEST_FIXTURE(ValueTest, compareDouble) {
- JSONTEST_ASSERT_PRED(checkIsLess(0.0, 10.0));
- JSONTEST_ASSERT_PRED(checkIsEqual(10.0, 10.0));
- JSONTEST_ASSERT_PRED(checkIsEqual(-10.0, -10.0));
- JSONTEST_ASSERT_PRED(checkIsLess(-10.0, 0.0));
-}
-
-JSONTEST_FIXTURE(ValueTest, compareString) {
- JSONTEST_ASSERT_PRED(checkIsLess("", " "));
- JSONTEST_ASSERT_PRED(checkIsLess("", "a"));
- JSONTEST_ASSERT_PRED(checkIsLess("abcd", "zyui"));
- JSONTEST_ASSERT_PRED(checkIsLess("abc", "abcd"));
- JSONTEST_ASSERT_PRED(checkIsEqual("abcd", "abcd"));
- JSONTEST_ASSERT_PRED(checkIsEqual(" ", " "));
- JSONTEST_ASSERT_PRED(checkIsLess("ABCD", "abcd"));
- JSONTEST_ASSERT_PRED(checkIsEqual("ABCD", "ABCD"));
-}
-
-JSONTEST_FIXTURE(ValueTest, compareBoolean) {
- JSONTEST_ASSERT_PRED(checkIsLess(false, true));
- JSONTEST_ASSERT_PRED(checkIsEqual(false, false));
- JSONTEST_ASSERT_PRED(checkIsEqual(true, true));
-}
-
-JSONTEST_FIXTURE(ValueTest, compareArray) {
- // array compare size then content
- Json::Value emptyArray(Json::arrayValue);
- Json::Value l1aArray;
- l1aArray.append(0);
- Json::Value l1bArray;
- l1bArray.append(10);
- Json::Value l2aArray;
- l2aArray.append(0);
- l2aArray.append(0);
- Json::Value l2bArray;
- l2bArray.append(0);
- l2bArray.append(10);
- JSONTEST_ASSERT_PRED(checkIsLess(emptyArray, l1aArray));
- JSONTEST_ASSERT_PRED(checkIsLess(emptyArray, l2aArray));
- JSONTEST_ASSERT_PRED(checkIsLess(l1aArray, l2aArray));
- JSONTEST_ASSERT_PRED(checkIsLess(l2aArray, l2bArray));
- JSONTEST_ASSERT_PRED(checkIsEqual(emptyArray, Json::Value(emptyArray)));
- JSONTEST_ASSERT_PRED(checkIsEqual(l1aArray, Json::Value(l1aArray)));
- JSONTEST_ASSERT_PRED(checkIsEqual(l2bArray, Json::Value(l2bArray)));
-}
-
-JSONTEST_FIXTURE(ValueTest, compareObject) {
- // object compare size then content
- Json::Value emptyObject(Json::objectValue);
- Json::Value l1aObject;
- l1aObject["key1"] = 0;
- Json::Value l1bObject;
- l1aObject["key1"] = 10;
- Json::Value l2aObject;
- l2aObject["key1"] = 0;
- l2aObject["key2"] = 0;
- JSONTEST_ASSERT_PRED(checkIsLess(emptyObject, l1aObject));
- JSONTEST_ASSERT_PRED(checkIsLess(emptyObject, l2aObject));
- JSONTEST_ASSERT_PRED(checkIsLess(l1aObject, l2aObject));
- JSONTEST_ASSERT_PRED(checkIsEqual(emptyObject, Json::Value(emptyObject)));
- JSONTEST_ASSERT_PRED(checkIsEqual(l1aObject, Json::Value(l1aObject)));
- JSONTEST_ASSERT_PRED(checkIsEqual(l2aObject, Json::Value(l2aObject)));
-}
-
-JSONTEST_FIXTURE(ValueTest, compareType) {
- // object of different type are ordered according to their type
- JSONTEST_ASSERT_PRED(checkIsLess(Json::Value(), Json::Value(1)));
- JSONTEST_ASSERT_PRED(checkIsLess(Json::Value(1), Json::Value(1u)));
- JSONTEST_ASSERT_PRED(checkIsLess(Json::Value(1u), Json::Value(1.0)));
- JSONTEST_ASSERT_PRED(checkIsLess(Json::Value(1.0), Json::Value("a")));
- JSONTEST_ASSERT_PRED(checkIsLess(Json::Value("a"), Json::Value(true)));
- JSONTEST_ASSERT_PRED(
- checkIsLess(Json::Value(true), Json::Value(Json::arrayValue)));
- JSONTEST_ASSERT_PRED(checkIsLess(Json::Value(Json::arrayValue),
- Json::Value(Json::objectValue)));
-}
-
-void ValueTest::checkIsLess(const Json::Value& x, const Json::Value& y) {
- JSONTEST_ASSERT(x < y);
- JSONTEST_ASSERT(y > x);
- JSONTEST_ASSERT(x <= y);
- JSONTEST_ASSERT(y >= x);
- JSONTEST_ASSERT(!(x == y));
- JSONTEST_ASSERT(!(y == x));
- JSONTEST_ASSERT(!(x >= y));
- JSONTEST_ASSERT(!(y <= x));
- JSONTEST_ASSERT(!(x > y));
- JSONTEST_ASSERT(!(y < x));
- JSONTEST_ASSERT(x.compare(y) < 0);
- JSONTEST_ASSERT(y.compare(x) >= 0);
-}
-
-void ValueTest::checkIsEqual(const Json::Value& x, const Json::Value& y) {
- JSONTEST_ASSERT(x == y);
- JSONTEST_ASSERT(y == x);
- JSONTEST_ASSERT(x <= y);
- JSONTEST_ASSERT(y <= x);
- JSONTEST_ASSERT(x >= y);
- JSONTEST_ASSERT(y >= x);
- JSONTEST_ASSERT(!(x < y));
- JSONTEST_ASSERT(!(y < x));
- JSONTEST_ASSERT(!(x > y));
- JSONTEST_ASSERT(!(y > x));
- JSONTEST_ASSERT(x.compare(y) == 0);
- JSONTEST_ASSERT(y.compare(x) == 0);
-}
-
-JSONTEST_FIXTURE(ValueTest, typeChecksThrowExceptions) {
-#if JSON_USE_EXCEPTION
-
- Json::Value intVal(1);
- Json::Value strVal("Test");
- Json::Value objVal(Json::objectValue);
- Json::Value arrVal(Json::arrayValue);
-
- JSONTEST_ASSERT_THROWS(intVal["test"]);
- JSONTEST_ASSERT_THROWS(strVal["test"]);
- JSONTEST_ASSERT_THROWS(arrVal["test"]);
-
- JSONTEST_ASSERT_THROWS(intVal.removeMember("test"));
- JSONTEST_ASSERT_THROWS(strVal.removeMember("test"));
- JSONTEST_ASSERT_THROWS(arrVal.removeMember("test"));
-
- JSONTEST_ASSERT_THROWS(intVal.getMemberNames());
- JSONTEST_ASSERT_THROWS(strVal.getMemberNames());
- JSONTEST_ASSERT_THROWS(arrVal.getMemberNames());
-
- JSONTEST_ASSERT_THROWS(intVal[0]);
- JSONTEST_ASSERT_THROWS(objVal[0]);
- JSONTEST_ASSERT_THROWS(strVal[0]);
-
- JSONTEST_ASSERT_THROWS(intVal.clear());
-
- JSONTEST_ASSERT_THROWS(intVal.resize(1));
- JSONTEST_ASSERT_THROWS(strVal.resize(1));
- JSONTEST_ASSERT_THROWS(objVal.resize(1));
-
- JSONTEST_ASSERT_THROWS(intVal.asCString());
-
- JSONTEST_ASSERT_THROWS(objVal.asString());
- JSONTEST_ASSERT_THROWS(arrVal.asString());
-
- JSONTEST_ASSERT_THROWS(strVal.asInt());
- JSONTEST_ASSERT_THROWS(objVal.asInt());
- JSONTEST_ASSERT_THROWS(arrVal.asInt());
-
- JSONTEST_ASSERT_THROWS(strVal.asUInt());
- JSONTEST_ASSERT_THROWS(objVal.asUInt());
- JSONTEST_ASSERT_THROWS(arrVal.asUInt());
-
- JSONTEST_ASSERT_THROWS(strVal.asInt64());
- JSONTEST_ASSERT_THROWS(objVal.asInt64());
- JSONTEST_ASSERT_THROWS(arrVal.asInt64());
-
- JSONTEST_ASSERT_THROWS(strVal.asUInt64());
- JSONTEST_ASSERT_THROWS(objVal.asUInt64());
- JSONTEST_ASSERT_THROWS(arrVal.asUInt64());
-
- JSONTEST_ASSERT_THROWS(strVal.asDouble());
- JSONTEST_ASSERT_THROWS(objVal.asDouble());
- JSONTEST_ASSERT_THROWS(arrVal.asDouble());
-
- JSONTEST_ASSERT_THROWS(strVal.asFloat());
- JSONTEST_ASSERT_THROWS(objVal.asFloat());
- JSONTEST_ASSERT_THROWS(arrVal.asFloat());
-
- JSONTEST_ASSERT_THROWS(strVal.asBool());
- JSONTEST_ASSERT_THROWS(objVal.asBool());
- JSONTEST_ASSERT_THROWS(arrVal.asBool());
-
-#endif
-}
-
-JSONTEST_FIXTURE(ValueTest, offsetAccessors) {
- Json::Value x;
- JSONTEST_ASSERT(x.getOffsetStart() == 0);
- JSONTEST_ASSERT(x.getOffsetLimit() == 0);
- x.setOffsetStart(10);
- x.setOffsetLimit(20);
- JSONTEST_ASSERT(x.getOffsetStart() == 10);
- JSONTEST_ASSERT(x.getOffsetLimit() == 20);
- Json::Value y(x);
- JSONTEST_ASSERT(y.getOffsetStart() == 10);
- JSONTEST_ASSERT(y.getOffsetLimit() == 20);
- Json::Value z;
- z.swap(y);
- JSONTEST_ASSERT(z.getOffsetStart() == 10);
- JSONTEST_ASSERT(z.getOffsetLimit() == 20);
- JSONTEST_ASSERT(y.getOffsetStart() == 0);
- JSONTEST_ASSERT(y.getOffsetLimit() == 0);
-}
-
-JSONTEST_FIXTURE(ValueTest, StaticString) {
- char mutant[] = "hello";
- Json::StaticString ss(mutant);
- std::string regular(mutant);
- mutant[1] = 'a';
- JSONTEST_ASSERT_STRING_EQUAL("hallo", ss.c_str());
- JSONTEST_ASSERT_STRING_EQUAL("hello", regular.c_str());
- {
- Json::Value root;
- root["top"] = ss;
- JSONTEST_ASSERT_STRING_EQUAL("hallo", root["top"].asString());
- mutant[1] = 'u';
- JSONTEST_ASSERT_STRING_EQUAL("hullo", root["top"].asString());
- }
- {
- Json::Value root;
- root["top"] = regular;
- JSONTEST_ASSERT_STRING_EQUAL("hello", root["top"].asString());
- mutant[1] = 'u';
- JSONTEST_ASSERT_STRING_EQUAL("hello", root["top"].asString());
- }
-}
-
-JSONTEST_FIXTURE(ValueTest, CommentBefore) {
- Json::Value val; // fill val
- val.setComment(std::string("// this comment should appear before"), Json::commentBefore);
- Json::StreamWriterBuilder wbuilder;
- wbuilder.settings_["commentStyle"] = "All";
- {
- char const expected[] = "// this comment should appear before\nnull";
- std::string result = Json::writeString(wbuilder, val);
- JSONTEST_ASSERT_STRING_EQUAL(expected, result);
- std::string res2 = val.toStyledString();
- std::string exp2 = "\n";
- exp2 += expected;
- exp2 += "\n";
- JSONTEST_ASSERT_STRING_EQUAL(exp2, res2);
- }
- Json::Value other = "hello";
- val.swapPayload(other);
- {
- char const expected[] = "// this comment should appear before\n\"hello\"";
- std::string result = Json::writeString(wbuilder, val);
- JSONTEST_ASSERT_STRING_EQUAL(expected, result);
- std::string res2 = val.toStyledString();
- std::string exp2 = "\n";
- exp2 += expected;
- exp2 += "\n";
- JSONTEST_ASSERT_STRING_EQUAL(exp2, res2);
- JSONTEST_ASSERT_STRING_EQUAL("null\n", other.toStyledString());
- }
- val = "hello";
- // val.setComment("// this comment should appear before", Json::CommentPlacement::commentBefore);
- // Assignment over-writes comments.
- {
- char const expected[] = "\"hello\"";
- std::string result = Json::writeString(wbuilder, val);
- JSONTEST_ASSERT_STRING_EQUAL(expected, result);
- std::string res2 = val.toStyledString();
- std::string exp2 = "";
- exp2 += expected;
- exp2 += "\n";
- JSONTEST_ASSERT_STRING_EQUAL(exp2, res2);
- }
-}
-
-JSONTEST_FIXTURE(ValueTest, zeroes) {
- char const cstr[] = "h\0i";
- std::string binary(cstr, sizeof(cstr)); // include trailing 0
- JSONTEST_ASSERT_EQUAL(4U, binary.length());
- Json::StreamWriterBuilder b;
- {
- Json::Value root;
- root = binary;
- JSONTEST_ASSERT_STRING_EQUAL(binary, root.asString());
- }
- {
- char const top[] = "top";
- Json::Value root;
- root[top] = binary;
- JSONTEST_ASSERT_STRING_EQUAL(binary, root[top].asString());
- Json::Value removed;
- bool did;
- did = root.removeMember(top, top + sizeof(top) - 1U,
- &removed);
- JSONTEST_ASSERT(did);
- JSONTEST_ASSERT_STRING_EQUAL(binary, removed.asString());
- did = root.removeMember(top, top + sizeof(top) - 1U,
- &removed);
- JSONTEST_ASSERT(!did);
- JSONTEST_ASSERT_STRING_EQUAL(binary, removed.asString()); // still
- }
-}
-
-JSONTEST_FIXTURE(ValueTest, zeroesInKeys) {
- char const cstr[] = "h\0i";
- std::string binary(cstr, sizeof(cstr)); // include trailing 0
- JSONTEST_ASSERT_EQUAL(4U, binary.length());
- {
- Json::Value root;
- root[binary] = "there";
- JSONTEST_ASSERT_STRING_EQUAL("there", root[binary].asString());
- JSONTEST_ASSERT(!root.isMember("h"));
- JSONTEST_ASSERT(root.isMember(binary));
- JSONTEST_ASSERT_STRING_EQUAL("there", root.get(binary, Json::Value::nullRef).asString());
- Json::Value removed;
- bool did;
- did = root.removeMember(binary.data(), binary.data() + binary.length(),
- &removed);
- JSONTEST_ASSERT(did);
- JSONTEST_ASSERT_STRING_EQUAL("there", removed.asString());
- did = root.removeMember(binary.data(), binary.data() + binary.length(),
- &removed);
- JSONTEST_ASSERT(!did);
- JSONTEST_ASSERT_STRING_EQUAL("there", removed.asString()); // still
- JSONTEST_ASSERT(!root.isMember(binary));
- JSONTEST_ASSERT_STRING_EQUAL("", root.get(binary, Json::Value::nullRef).asString());
- }
-}
-
-struct WriterTest : JsonTest::TestCase {};
-
-JSONTEST_FIXTURE(WriterTest, dropNullPlaceholders) {
- Json::FastWriter writer;
- Json::Value nullValue;
- JSONTEST_ASSERT(writer.write(nullValue) == "null\n");
-
- writer.dropNullPlaceholders();
- JSONTEST_ASSERT(writer.write(nullValue) == "\n");
-}
-
-struct StreamWriterTest : JsonTest::TestCase {};
-
-JSONTEST_FIXTURE(StreamWriterTest, dropNullPlaceholders) {
- Json::StreamWriterBuilder b;
- Json::Value nullValue;
- b.settings_["dropNullPlaceholders"] = false;
- JSONTEST_ASSERT(Json::writeString(b, nullValue) == "null");
- b.settings_["dropNullPlaceholders"] = true;
- JSONTEST_ASSERT(Json::writeString(b, nullValue) == "");
-}
-
-JSONTEST_FIXTURE(StreamWriterTest, writeZeroes) {
- std::string binary("hi", 3); // include trailing 0
- JSONTEST_ASSERT_EQUAL(3, binary.length());
- std::string expected("\"hi\\u0000\""); // unicoded zero
- Json::StreamWriterBuilder b;
- {
- Json::Value root;
- root = binary;
- JSONTEST_ASSERT_STRING_EQUAL(binary, root.asString());
- std::string out = Json::writeString(b, root);
- JSONTEST_ASSERT_EQUAL(expected.size(), out.size());
- JSONTEST_ASSERT_STRING_EQUAL(expected, out);
- }
- {
- Json::Value root;
- root["top"] = binary;
- JSONTEST_ASSERT_STRING_EQUAL(binary, root["top"].asString());
- std::string out = Json::writeString(b, root["top"]);
- JSONTEST_ASSERT_STRING_EQUAL(expected, out);
- }
-}
-
-struct ReaderTest : JsonTest::TestCase {};
-
-JSONTEST_FIXTURE(ReaderTest, parseWithNoErrors) {
- Json::Reader reader;
- Json::Value root;
- bool ok = reader.parse("{ \"property\" : \"value\" }", root);
- JSONTEST_ASSERT(ok);
- JSONTEST_ASSERT(reader.getFormattedErrorMessages().size() == 0);
- JSONTEST_ASSERT(reader.getStructuredErrors().size() == 0);
-}
-
-JSONTEST_FIXTURE(ReaderTest, parseWithNoErrorsTestingOffsets) {
- Json::Reader reader;
- Json::Value root;
- bool ok = reader.parse("{ \"property\" : [\"value\", \"value2\"], \"obj\" : "
- "{ \"nested\" : 123, \"bool\" : true}, \"null\" : "
- "null, \"false\" : false }",
- root);
- JSONTEST_ASSERT(ok);
- JSONTEST_ASSERT(reader.getFormattedErrorMessages().size() == 0);
- JSONTEST_ASSERT(reader.getStructuredErrors().size() == 0);
- JSONTEST_ASSERT(root["property"].getOffsetStart() == 15);
- JSONTEST_ASSERT(root["property"].getOffsetLimit() == 34);
- JSONTEST_ASSERT(root["property"][0].getOffsetStart() == 16);
- JSONTEST_ASSERT(root["property"][0].getOffsetLimit() == 23);
- JSONTEST_ASSERT(root["property"][1].getOffsetStart() == 25);
- JSONTEST_ASSERT(root["property"][1].getOffsetLimit() == 33);
- JSONTEST_ASSERT(root["obj"].getOffsetStart() == 44);
- JSONTEST_ASSERT(root["obj"].getOffsetLimit() == 76);
- JSONTEST_ASSERT(root["obj"]["nested"].getOffsetStart() == 57);
- JSONTEST_ASSERT(root["obj"]["nested"].getOffsetLimit() == 60);
- JSONTEST_ASSERT(root["obj"]["bool"].getOffsetStart() == 71);
- JSONTEST_ASSERT(root["obj"]["bool"].getOffsetLimit() == 75);
- JSONTEST_ASSERT(root["null"].getOffsetStart() == 87);
- JSONTEST_ASSERT(root["null"].getOffsetLimit() == 91);
- JSONTEST_ASSERT(root["false"].getOffsetStart() == 103);
- JSONTEST_ASSERT(root["false"].getOffsetLimit() == 108);
- JSONTEST_ASSERT(root.getOffsetStart() == 0);
- JSONTEST_ASSERT(root.getOffsetLimit() == 110);
-}
-
-JSONTEST_FIXTURE(ReaderTest, parseWithOneError) {
- Json::Reader reader;
- Json::Value root;
- bool ok = reader.parse("{ \"property\" :: \"value\" }", root);
- JSONTEST_ASSERT(!ok);
- JSONTEST_ASSERT(reader.getFormattedErrorMessages() ==
- "* Line 1, Column 15\n Syntax error: value, object or array "
- "expected.\n");
- std::vector<Json::Reader::StructuredError> errors =
- reader.getStructuredErrors();
- JSONTEST_ASSERT(errors.size() == 1);
- JSONTEST_ASSERT(errors.at(0).offset_start == 14);
- JSONTEST_ASSERT(errors.at(0).offset_limit == 15);
- JSONTEST_ASSERT(errors.at(0).message ==
- "Syntax error: value, object or array expected.");
-}
-
-JSONTEST_FIXTURE(ReaderTest, parseChineseWithOneError) {
- Json::Reader reader;
- Json::Value root;
- bool ok = reader.parse("{ \"prä½è—¤erty\" :: \"value\" }", root);
- JSONTEST_ASSERT(!ok);
- JSONTEST_ASSERT(reader.getFormattedErrorMessages() ==
- "* Line 1, Column 19\n Syntax error: value, object or array "
- "expected.\n");
- std::vector<Json::Reader::StructuredError> errors =
- reader.getStructuredErrors();
- JSONTEST_ASSERT(errors.size() == 1);
- JSONTEST_ASSERT(errors.at(0).offset_start == 18);
- JSONTEST_ASSERT(errors.at(0).offset_limit == 19);
- JSONTEST_ASSERT(errors.at(0).message ==
- "Syntax error: value, object or array expected.");
-}
-
-JSONTEST_FIXTURE(ReaderTest, parseWithDetailError) {
- Json::Reader reader;
- Json::Value root;
- bool ok = reader.parse("{ \"property\" : \"v\\alue\" }", root);
- JSONTEST_ASSERT(!ok);
- JSONTEST_ASSERT(reader.getFormattedErrorMessages() ==
- "* Line 1, Column 16\n Bad escape sequence in string\nSee "
- "Line 1, Column 20 for detail.\n");
- std::vector<Json::Reader::StructuredError> errors =
- reader.getStructuredErrors();
- JSONTEST_ASSERT(errors.size() == 1);
- JSONTEST_ASSERT(errors.at(0).offset_start == 15);
- JSONTEST_ASSERT(errors.at(0).offset_limit == 23);
- JSONTEST_ASSERT(errors.at(0).message == "Bad escape sequence in string");
-}
-
-struct CharReaderTest : JsonTest::TestCase {};
-
-JSONTEST_FIXTURE(CharReaderTest, parseWithNoErrors) {
- Json::CharReaderBuilder b;
- Json::CharReader* reader(b.newCharReader());
- std::string errs;
- Json::Value root;
- char const doc[] = "{ \"property\" : \"value\" }";
- bool ok = reader->parse(
- doc, doc + std::strlen(doc),
- &root, &errs);
- JSONTEST_ASSERT(ok);
- JSONTEST_ASSERT(errs.size() == 0);
- delete reader;
-}
-
-JSONTEST_FIXTURE(CharReaderTest, parseWithNoErrorsTestingOffsets) {
- Json::CharReaderBuilder b;
- Json::CharReader* reader(b.newCharReader());
- std::string errs;
- Json::Value root;
- char const doc[] =
- "{ \"property\" : [\"value\", \"value2\"], \"obj\" : "
- "{ \"nested\" : 123, \"bool\" : true}, \"null\" : "
- "null, \"false\" : false }";
- bool ok = reader->parse(
- doc, doc + std::strlen(doc),
- &root, &errs);
- JSONTEST_ASSERT(ok);
- JSONTEST_ASSERT(errs.size() == 0);
- delete reader;
-}
-
-JSONTEST_FIXTURE(CharReaderTest, parseWithOneError) {
- Json::CharReaderBuilder b;
- Json::CharReader* reader(b.newCharReader());
- std::string errs;
- Json::Value root;
- char const doc[] =
- "{ \"property\" :: \"value\" }";
- bool ok = reader->parse(
- doc, doc + std::strlen(doc),
- &root, &errs);
- JSONTEST_ASSERT(!ok);
- JSONTEST_ASSERT(errs ==
- "* Line 1, Column 15\n Syntax error: value, object or array "
- "expected.\n");
- delete reader;
-}
-
-JSONTEST_FIXTURE(CharReaderTest, parseChineseWithOneError) {
- Json::CharReaderBuilder b;
- Json::CharReader* reader(b.newCharReader());
- std::string errs;
- Json::Value root;
- char const doc[] =
- "{ \"prä½è—¤erty\" :: \"value\" }";
- bool ok = reader->parse(
- doc, doc + std::strlen(doc),
- &root, &errs);
- JSONTEST_ASSERT(!ok);
- JSONTEST_ASSERT(errs ==
- "* Line 1, Column 19\n Syntax error: value, object or array "
- "expected.\n");
- delete reader;
-}
-
-JSONTEST_FIXTURE(CharReaderTest, parseWithDetailError) {
- Json::CharReaderBuilder b;
- Json::CharReader* reader(b.newCharReader());
- std::string errs;
- Json::Value root;
- char const doc[] =
- "{ \"property\" : \"v\\alue\" }";
- bool ok = reader->parse(
- doc, doc + std::strlen(doc),
- &root, &errs);
- JSONTEST_ASSERT(!ok);
- JSONTEST_ASSERT(errs ==
- "* Line 1, Column 16\n Bad escape sequence in string\nSee "
- "Line 1, Column 20 for detail.\n");
- delete reader;
-}
-
-JSONTEST_FIXTURE(CharReaderTest, parseWithStackLimit) {
- Json::CharReaderBuilder b;
- Json::Value root;
- char const doc[] =
- "{ \"property\" : \"value\" }";
- {
- b.settings_["stackLimit"] = 2;
- Json::CharReader* reader(b.newCharReader());
- std::string errs;
- bool ok = reader->parse(
- doc, doc + std::strlen(doc),
- &root, &errs);
- JSONTEST_ASSERT(ok);
- JSONTEST_ASSERT(errs == "");
- JSONTEST_ASSERT_EQUAL("value", root["property"]);
- delete reader;
- }
- {
- b.settings_["stackLimit"] = 1;
- Json::CharReader* reader(b.newCharReader());
- std::string errs;
- JSONTEST_ASSERT_THROWS(reader->parse(
- doc, doc + std::strlen(doc),
- &root, &errs));
- delete reader;
- }
-}
-
-struct CharReaderStrictModeTest : JsonTest::TestCase {};
-
-JSONTEST_FIXTURE(CharReaderStrictModeTest, dupKeys) {
- Json::CharReaderBuilder b;
- Json::Value root;
- char const doc[] =
- "{ \"property\" : \"value\", \"key\" : \"val1\", \"key\" : \"val2\" }";
- {
- b.strictMode(&b.settings_);
- Json::CharReader* reader(b.newCharReader());
- std::string errs;
- bool ok = reader->parse(
- doc, doc + std::strlen(doc),
- &root, &errs);
- JSONTEST_ASSERT(!ok);
- JSONTEST_ASSERT_STRING_EQUAL(
- "* Line 1, Column 41\n"
- " Duplicate key: 'key'\n",
- errs);
- JSONTEST_ASSERT_EQUAL("val1", root["key"]); // so far
- delete reader;
- }
-}
-struct CharReaderFailIfExtraTest : JsonTest::TestCase {};
-
-JSONTEST_FIXTURE(CharReaderFailIfExtraTest, issue164) {
- // This is interpretted as a string value followed by a colon.
- Json::CharReaderBuilder b;
- Json::Value root;
- char const doc[] =
- " \"property\" : \"value\" }";
- {
- b.settings_["failIfExtra"] = false;
- Json::CharReader* reader(b.newCharReader());
- std::string errs;
- bool ok = reader->parse(
- doc, doc + std::strlen(doc),
- &root, &errs);
- JSONTEST_ASSERT(ok);
- JSONTEST_ASSERT(errs == "");
- JSONTEST_ASSERT_EQUAL("property", root);
- delete reader;
- }
- {
- b.settings_["failIfExtra"] = true;
- Json::CharReader* reader(b.newCharReader());
- std::string errs;
- bool ok = reader->parse(
- doc, doc + std::strlen(doc),
- &root, &errs);
- JSONTEST_ASSERT(!ok);
- JSONTEST_ASSERT_STRING_EQUAL(errs,
- "* Line 1, Column 13\n"
- " Extra non-whitespace after JSON value.\n");
- JSONTEST_ASSERT_EQUAL("property", root);
- delete reader;
- }
- {
- b.settings_["failIfExtra"] = false;
- b.strictMode(&b.settings_);
- Json::CharReader* reader(b.newCharReader());
- std::string errs;
- bool ok = reader->parse(
- doc, doc + std::strlen(doc),
- &root, &errs);
- JSONTEST_ASSERT(!ok);
- JSONTEST_ASSERT_STRING_EQUAL(errs,
- "* Line 1, Column 13\n"
- " Extra non-whitespace after JSON value.\n");
- JSONTEST_ASSERT_EQUAL("property", root);
- delete reader;
- }
-}
-JSONTEST_FIXTURE(CharReaderFailIfExtraTest, issue107) {
- // This is interpretted as an int value followed by a colon.
- Json::CharReaderBuilder b;
- Json::Value root;
- char const doc[] =
- "1:2:3";
- b.settings_["failIfExtra"] = true;
- Json::CharReader* reader(b.newCharReader());
- std::string errs;
- bool ok = reader->parse(
- doc, doc + std::strlen(doc),
- &root, &errs);
- JSONTEST_ASSERT(!ok);
- JSONTEST_ASSERT_STRING_EQUAL(
- "* Line 1, Column 2\n"
- " Extra non-whitespace after JSON value.\n",
- errs);
- JSONTEST_ASSERT_EQUAL(1, root.asInt());
- delete reader;
-}
-JSONTEST_FIXTURE(CharReaderFailIfExtraTest, commentAfterObject) {
- Json::CharReaderBuilder b;
- Json::Value root;
- {
- char const doc[] =
- "{ \"property\" : \"value\" } //trailing\n//comment\n";
- b.settings_["failIfExtra"] = true;
- Json::CharReader* reader(b.newCharReader());
- std::string errs;
- bool ok = reader->parse(
- doc, doc + std::strlen(doc),
- &root, &errs);
- JSONTEST_ASSERT(ok);
- JSONTEST_ASSERT_STRING_EQUAL("", errs);
- JSONTEST_ASSERT_EQUAL("value", root["property"]);
- delete reader;
- }
-}
-JSONTEST_FIXTURE(CharReaderFailIfExtraTest, commentAfterArray) {
- Json::CharReaderBuilder b;
- Json::Value root;
- char const doc[] =
- "[ \"property\" , \"value\" ] //trailing\n//comment\n";
- b.settings_["failIfExtra"] = true;
- Json::CharReader* reader(b.newCharReader());
- std::string errs;
- bool ok = reader->parse(
- doc, doc + std::strlen(doc),
- &root, &errs);
- JSONTEST_ASSERT(ok);
- JSONTEST_ASSERT_STRING_EQUAL("", errs);
- JSONTEST_ASSERT_EQUAL("value", root[1u]);
- delete reader;
-}
-JSONTEST_FIXTURE(CharReaderFailIfExtraTest, commentAfterBool) {
- Json::CharReaderBuilder b;
- Json::Value root;
- char const doc[] =
- " true /*trailing\ncomment*/";
- b.settings_["failIfExtra"] = true;
- Json::CharReader* reader(b.newCharReader());
- std::string errs;
- bool ok = reader->parse(
- doc, doc + std::strlen(doc),
- &root, &errs);
- JSONTEST_ASSERT(ok);
- JSONTEST_ASSERT_STRING_EQUAL("", errs);
- JSONTEST_ASSERT_EQUAL(true, root.asBool());
- delete reader;
-}
-struct CharReaderAllowDropNullTest : JsonTest::TestCase {};
-
-JSONTEST_FIXTURE(CharReaderAllowDropNullTest, issue178) {
- Json::CharReaderBuilder b;
- b.settings_["allowDroppedNullPlaceholders"] = true;
- Json::Value root;
- std::string errs;
- Json::CharReader* reader(b.newCharReader());
- {
- char const doc[] = "{\"a\":,\"b\":true}";
- bool ok = reader->parse(
- doc, doc + std::strlen(doc),
- &root, &errs);
- JSONTEST_ASSERT(ok);
- JSONTEST_ASSERT_STRING_EQUAL("", errs);
- JSONTEST_ASSERT_EQUAL(2u, root.size());
- JSONTEST_ASSERT_EQUAL(Json::nullValue, root.get("a", true));
- }
- {
- char const doc[] = "{\"a\":}";
- bool ok = reader->parse(
- doc, doc + std::strlen(doc),
- &root, &errs);
- JSONTEST_ASSERT(ok);
- JSONTEST_ASSERT_STRING_EQUAL("", errs);
- JSONTEST_ASSERT_EQUAL(1u, root.size());
- JSONTEST_ASSERT_EQUAL(Json::nullValue, root.get("a", true));
- }
- {
- char const doc[] = "[]";
- bool ok = reader->parse(
- doc, doc + std::strlen(doc),
- &root, &errs);
- JSONTEST_ASSERT(ok);
- JSONTEST_ASSERT(errs == "");
- JSONTEST_ASSERT_EQUAL(0u, root.size());
- JSONTEST_ASSERT_EQUAL(Json::arrayValue, root);
- }
- {
- char const doc[] = "[null]";
- bool ok = reader->parse(
- doc, doc + std::strlen(doc),
- &root, &errs);
- JSONTEST_ASSERT(ok);
- JSONTEST_ASSERT(errs == "");
- JSONTEST_ASSERT_EQUAL(1u, root.size());
- }
- {
- char const doc[] = "[,]";
- bool ok = reader->parse(
- doc, doc + std::strlen(doc),
- &root, &errs);
- JSONTEST_ASSERT(ok);
- JSONTEST_ASSERT_STRING_EQUAL("", errs);
- JSONTEST_ASSERT_EQUAL(2u, root.size());
- }
- {
- char const doc[] = "[,,,]";
- bool ok = reader->parse(
- doc, doc + std::strlen(doc),
- &root, &errs);
- JSONTEST_ASSERT(ok);
- JSONTEST_ASSERT_STRING_EQUAL("", errs);
- JSONTEST_ASSERT_EQUAL(4u, root.size());
- }
- {
- char const doc[] = "[null,]";
- bool ok = reader->parse(
- doc, doc + std::strlen(doc),
- &root, &errs);
- JSONTEST_ASSERT(ok);
- JSONTEST_ASSERT_STRING_EQUAL("", errs);
- JSONTEST_ASSERT_EQUAL(2u, root.size());
- }
- {
- char const doc[] = "[,null]";
- bool ok = reader->parse(
- doc, doc + std::strlen(doc),
- &root, &errs);
- JSONTEST_ASSERT(ok);
- JSONTEST_ASSERT(errs == "");
- JSONTEST_ASSERT_EQUAL(2u, root.size());
- }
- {
- char const doc[] = "[,,]";
- bool ok = reader->parse(
- doc, doc + std::strlen(doc),
- &root, &errs);
- JSONTEST_ASSERT(ok);
- JSONTEST_ASSERT_STRING_EQUAL("", errs);
- JSONTEST_ASSERT_EQUAL(3u, root.size());
- }
- {
- char const doc[] = "[null,,]";
- bool ok = reader->parse(
- doc, doc + std::strlen(doc),
- &root, &errs);
- JSONTEST_ASSERT(ok);
- JSONTEST_ASSERT_STRING_EQUAL("", errs);
- JSONTEST_ASSERT_EQUAL(3u, root.size());
- }
- {
- char const doc[] = "[,null,]";
- bool ok = reader->parse(
- doc, doc + std::strlen(doc),
- &root, &errs);
- JSONTEST_ASSERT(ok);
- JSONTEST_ASSERT_STRING_EQUAL("", errs);
- JSONTEST_ASSERT_EQUAL(3u, root.size());
- }
- {
- char const doc[] = "[,,null]";
- bool ok = reader->parse(
- doc, doc + std::strlen(doc),
- &root, &errs);
- JSONTEST_ASSERT(ok);
- JSONTEST_ASSERT(errs == "");
- JSONTEST_ASSERT_EQUAL(3u, root.size());
- }
- {
- char const doc[] = "[[],,,]";
- bool ok = reader->parse(
- doc, doc + std::strlen(doc),
- &root, &errs);
- JSONTEST_ASSERT(ok);
- JSONTEST_ASSERT_STRING_EQUAL("", errs);
- JSONTEST_ASSERT_EQUAL(4u, root.size());
- JSONTEST_ASSERT_EQUAL(Json::arrayValue, root[0u]);
- }
- {
- char const doc[] = "[,[],,]";
- bool ok = reader->parse(
- doc, doc + std::strlen(doc),
- &root, &errs);
- JSONTEST_ASSERT(ok);
- JSONTEST_ASSERT_STRING_EQUAL("", errs);
- JSONTEST_ASSERT_EQUAL(4u, root.size());
- JSONTEST_ASSERT_EQUAL(Json::arrayValue, root[1u]);
- }
- {
- char const doc[] = "[,,,[]]";
- bool ok = reader->parse(
- doc, doc + std::strlen(doc),
- &root, &errs);
- JSONTEST_ASSERT(ok);
- JSONTEST_ASSERT(errs == "");
- JSONTEST_ASSERT_EQUAL(4u, root.size());
- JSONTEST_ASSERT_EQUAL(Json::arrayValue, root[3u]);
- }
- delete reader;
-}
-
-struct CharReaderAllowSingleQuotesTest : JsonTest::TestCase {};
-
-JSONTEST_FIXTURE(CharReaderAllowSingleQuotesTest, issue182) {
- Json::CharReaderBuilder b;
- b.settings_["allowSingleQuotes"] = true;
- Json::Value root;
- std::string errs;
- Json::CharReader* reader(b.newCharReader());
- {
- char const doc[] = "{'a':true,\"b\":true}";
- bool ok = reader->parse(
- doc, doc + std::strlen(doc),
- &root, &errs);
- JSONTEST_ASSERT(ok);
- JSONTEST_ASSERT_STRING_EQUAL("", errs);
- JSONTEST_ASSERT_EQUAL(2u, root.size());
- JSONTEST_ASSERT_EQUAL(true, root.get("a", false));
- JSONTEST_ASSERT_EQUAL(true, root.get("b", false));
- }
- {
- char const doc[] = "{'a': 'x', \"b\":'y'}";
- bool ok = reader->parse(
- doc, doc + std::strlen(doc),
- &root, &errs);
- JSONTEST_ASSERT(ok);
- JSONTEST_ASSERT_STRING_EQUAL("", errs);
- JSONTEST_ASSERT_EQUAL(2u, root.size());
- JSONTEST_ASSERT_STRING_EQUAL("x", root["a"].asString());
- JSONTEST_ASSERT_STRING_EQUAL("y", root["b"].asString());
- }
- delete reader;
-}
-
-struct CharReaderAllowZeroesTest : JsonTest::TestCase {};
-
-JSONTEST_FIXTURE(CharReaderAllowZeroesTest, issue176) {
- Json::CharReaderBuilder b;
- b.settings_["allowSingleQuotes"] = true;
- Json::Value root;
- std::string errs;
- Json::CharReader* reader(b.newCharReader());
- {
- char const doc[] = "{'a':true,\"b\":true}";
- bool ok = reader->parse(
- doc, doc + std::strlen(doc),
- &root, &errs);
- JSONTEST_ASSERT(ok);
- JSONTEST_ASSERT_STRING_EQUAL("", errs);
- JSONTEST_ASSERT_EQUAL(2u, root.size());
- JSONTEST_ASSERT_EQUAL(true, root.get("a", false));
- JSONTEST_ASSERT_EQUAL(true, root.get("b", false));
- }
- {
- char const doc[] = "{'a': 'x', \"b\":'y'}";
- bool ok = reader->parse(
- doc, doc + std::strlen(doc),
- &root, &errs);
- JSONTEST_ASSERT(ok);
- JSONTEST_ASSERT_STRING_EQUAL("", errs);
- JSONTEST_ASSERT_EQUAL(2u, root.size());
- JSONTEST_ASSERT_STRING_EQUAL("x", root["a"].asString());
- JSONTEST_ASSERT_STRING_EQUAL("y", root["b"].asString());
- }
- delete reader;
-}
-
-struct BuilderTest : JsonTest::TestCase {};
-
-JSONTEST_FIXTURE(BuilderTest, settings) {
- {
- Json::Value errs;
- Json::CharReaderBuilder rb;
- JSONTEST_ASSERT_EQUAL(false, rb.settings_.isMember("foo"));
- JSONTEST_ASSERT_EQUAL(true, rb.validate(&errs));
- rb["foo"] = "bar";
- JSONTEST_ASSERT_EQUAL(true, rb.settings_.isMember("foo"));
- JSONTEST_ASSERT_EQUAL(false, rb.validate(&errs));
- }
- {
- Json::Value errs;
- Json::StreamWriterBuilder wb;
- JSONTEST_ASSERT_EQUAL(false, wb.settings_.isMember("foo"));
- JSONTEST_ASSERT_EQUAL(true, wb.validate(&errs));
- wb["foo"] = "bar";
- JSONTEST_ASSERT_EQUAL(true, wb.settings_.isMember("foo"));
- JSONTEST_ASSERT_EQUAL(false, wb.validate(&errs));
- }
-}
-
-struct IteratorTest : JsonTest::TestCase {};
-
-JSONTEST_FIXTURE(IteratorTest, distance) {
- Json::Value json;
- json["k1"] = "a";
- json["k2"] = "b";
- int dist = 0;
- std::string str;
- for (Json::ValueIterator it = json.begin(); it != json.end(); ++it) {
- dist = it - json.begin();
- str = it->asString().c_str();
- }
- JSONTEST_ASSERT_EQUAL(1, dist);
- JSONTEST_ASSERT_STRING_EQUAL("b", str);
-}
-
-JSONTEST_FIXTURE(IteratorTest, names) {
- Json::Value json;
- json["k1"] = "a";
- json["k2"] = "b";
- Json::ValueIterator it = json.begin();
- JSONTEST_ASSERT(it != json.end());
- JSONTEST_ASSERT_EQUAL(Json::Value("k1"), it.key());
- JSONTEST_ASSERT_STRING_EQUAL("k1", it.name());
- JSONTEST_ASSERT_EQUAL(-1, it.index());
- ++it;
- JSONTEST_ASSERT(it != json.end());
- JSONTEST_ASSERT_EQUAL(Json::Value("k2"), it.key());
- JSONTEST_ASSERT_STRING_EQUAL("k2", it.name());
- JSONTEST_ASSERT_EQUAL(-1, it.index());
- ++it;
- JSONTEST_ASSERT(it == json.end());
-}
-
-JSONTEST_FIXTURE(IteratorTest, indexes) {
- Json::Value json;
- json[0] = "a";
- json[1] = "b";
- Json::ValueIterator it = json.begin();
- JSONTEST_ASSERT(it != json.end());
- JSONTEST_ASSERT_EQUAL(Json::Value(Json::ArrayIndex(0)), it.key());
- JSONTEST_ASSERT_STRING_EQUAL("", it.name());
- JSONTEST_ASSERT_EQUAL(0, it.index());
- ++it;
- JSONTEST_ASSERT(it != json.end());
- JSONTEST_ASSERT_EQUAL(Json::Value(Json::ArrayIndex(1)), it.key());
- JSONTEST_ASSERT_STRING_EQUAL("", it.name());
- JSONTEST_ASSERT_EQUAL(1, it.index());
- ++it;
- JSONTEST_ASSERT(it == json.end());
-}
-
-int main(int argc, const char* argv[]) {
- JsonTest::Runner runner;
- JSONTEST_REGISTER_FIXTURE(runner, ValueTest, checkNormalizeFloatingPointStr);
- JSONTEST_REGISTER_FIXTURE(runner, ValueTest, memberCount);
- JSONTEST_REGISTER_FIXTURE(runner, ValueTest, objects);
- JSONTEST_REGISTER_FIXTURE(runner, ValueTest, arrays);
- JSONTEST_REGISTER_FIXTURE(runner, ValueTest, arrayIssue252);
- JSONTEST_REGISTER_FIXTURE(runner, ValueTest, null);
- JSONTEST_REGISTER_FIXTURE(runner, ValueTest, strings);
- JSONTEST_REGISTER_FIXTURE(runner, ValueTest, bools);
- JSONTEST_REGISTER_FIXTURE(runner, ValueTest, integers);
- JSONTEST_REGISTER_FIXTURE(runner, ValueTest, nonIntegers);
- JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareNull);
- JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareInt);
- JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareUInt);
- JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareDouble);
- JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareString);
- JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareBoolean);
- JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareArray);
- JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareObject);
- JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareType);
- JSONTEST_REGISTER_FIXTURE(runner, ValueTest, offsetAccessors);
- JSONTEST_REGISTER_FIXTURE(runner, ValueTest, typeChecksThrowExceptions);
- JSONTEST_REGISTER_FIXTURE(runner, ValueTest, StaticString);
- JSONTEST_REGISTER_FIXTURE(runner, ValueTest, CommentBefore);
- //JSONTEST_REGISTER_FIXTURE(runner, ValueTest, nulls);
- JSONTEST_REGISTER_FIXTURE(runner, ValueTest, zeroes);
- JSONTEST_REGISTER_FIXTURE(runner, ValueTest, zeroesInKeys);
-
- JSONTEST_REGISTER_FIXTURE(runner, WriterTest, dropNullPlaceholders);
- JSONTEST_REGISTER_FIXTURE(runner, StreamWriterTest, dropNullPlaceholders);
- JSONTEST_REGISTER_FIXTURE(runner, StreamWriterTest, writeZeroes);
-
- JSONTEST_REGISTER_FIXTURE(runner, ReaderTest, parseWithNoErrors);
- JSONTEST_REGISTER_FIXTURE(
- runner, ReaderTest, parseWithNoErrorsTestingOffsets);
- JSONTEST_REGISTER_FIXTURE(runner, ReaderTest, parseWithOneError);
- JSONTEST_REGISTER_FIXTURE(runner, ReaderTest, parseChineseWithOneError);
- JSONTEST_REGISTER_FIXTURE(runner, ReaderTest, parseWithDetailError);
-
- JSONTEST_REGISTER_FIXTURE(runner, CharReaderTest, parseWithNoErrors);
- JSONTEST_REGISTER_FIXTURE(
- runner, CharReaderTest, parseWithNoErrorsTestingOffsets);
- JSONTEST_REGISTER_FIXTURE(runner, CharReaderTest, parseWithOneError);
- JSONTEST_REGISTER_FIXTURE(runner, CharReaderTest, parseChineseWithOneError);
- JSONTEST_REGISTER_FIXTURE(runner, CharReaderTest, parseWithDetailError);
- JSONTEST_REGISTER_FIXTURE(runner, CharReaderTest, parseWithStackLimit);
-
- JSONTEST_REGISTER_FIXTURE(runner, CharReaderStrictModeTest, dupKeys);
-
- JSONTEST_REGISTER_FIXTURE(runner, CharReaderFailIfExtraTest, issue164);
- JSONTEST_REGISTER_FIXTURE(runner, CharReaderFailIfExtraTest, issue107);
- JSONTEST_REGISTER_FIXTURE(runner, CharReaderFailIfExtraTest, commentAfterObject);
- JSONTEST_REGISTER_FIXTURE(runner, CharReaderFailIfExtraTest, commentAfterArray);
- JSONTEST_REGISTER_FIXTURE(runner, CharReaderFailIfExtraTest, commentAfterBool);
-
- JSONTEST_REGISTER_FIXTURE(runner, CharReaderAllowDropNullTest, issue178);
-
- JSONTEST_REGISTER_FIXTURE(runner, CharReaderAllowSingleQuotesTest, issue182);
-
- JSONTEST_REGISTER_FIXTURE(runner, CharReaderAllowZeroesTest, issue176);
-
- JSONTEST_REGISTER_FIXTURE(runner, BuilderTest, settings);
-
- JSONTEST_REGISTER_FIXTURE(runner, IteratorTest, distance);
- JSONTEST_REGISTER_FIXTURE(runner, IteratorTest, names);
- JSONTEST_REGISTER_FIXTURE(runner, IteratorTest, indexes);
-
- return runner.runCommandLine(argc, argv);
-}
diff --git a/3rdparty/jsoncpp/src/test_lib_json/sconscript b/3rdparty/jsoncpp/src/test_lib_json/sconscript
deleted file mode 100644
index 915fd01c0a3..00000000000
--- a/3rdparty/jsoncpp/src/test_lib_json/sconscript
+++ /dev/null
@@ -1,10 +0,0 @@
-Import( 'env_testing buildUnitTests' )
-
-buildUnitTests( env_testing, Split( """
- main.cpp
- jsontest.cpp
- """ ),
- 'test_lib_json' )
-
-# For 'check' to work, 'libs' must be built first.
-env_testing.Depends('test_lib_json', '#libs')
diff --git a/3rdparty/jsoncpp/test/cleantests.py b/3rdparty/jsoncpp/test/cleantests.py
deleted file mode 100644
index 9772d542b3a..00000000000
--- a/3rdparty/jsoncpp/test/cleantests.py
+++ /dev/null
@@ -1,16 +0,0 @@
-# Copyright 2007 Baptiste Lepilleur
-# Distributed under MIT license, or public domain if desired and
-# recognized in your jurisdiction.
-# See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
-
-"""Removes all files created during testing."""
-
-import glob
-import os
-
-paths = []
-for pattern in [ '*.actual', '*.actual-rewrite', '*.rewrite', '*.process-output' ]:
- paths += glob.glob('data/' + pattern)
-
-for path in paths:
- os.unlink(path)
diff --git a/3rdparty/jsoncpp/test/data/fail_test_array_01.json b/3rdparty/jsoncpp/test/data/fail_test_array_01.json
deleted file mode 100644
index f72a6d07749..00000000000
--- a/3rdparty/jsoncpp/test/data/fail_test_array_01.json
+++ /dev/null
@@ -1 +0,0 @@
-[ 1 2 3]
diff --git a/3rdparty/jsoncpp/test/data/test_array_01.expected b/3rdparty/jsoncpp/test/data/test_array_01.expected
deleted file mode 100644
index a341ff753cb..00000000000
--- a/3rdparty/jsoncpp/test/data/test_array_01.expected
+++ /dev/null
@@ -1 +0,0 @@
-.=[]
diff --git a/3rdparty/jsoncpp/test/data/test_array_01.json b/3rdparty/jsoncpp/test/data/test_array_01.json
deleted file mode 100644
index fe51488c706..00000000000
--- a/3rdparty/jsoncpp/test/data/test_array_01.json
+++ /dev/null
@@ -1 +0,0 @@
-[]
diff --git a/3rdparty/jsoncpp/test/data/test_array_02.expected b/3rdparty/jsoncpp/test/data/test_array_02.expected
deleted file mode 100644
index ef1f2623de0..00000000000
--- a/3rdparty/jsoncpp/test/data/test_array_02.expected
+++ /dev/null
@@ -1,2 +0,0 @@
-.=[]
-.[0]=1
diff --git a/3rdparty/jsoncpp/test/data/test_array_02.json b/3rdparty/jsoncpp/test/data/test_array_02.json
deleted file mode 100644
index 7660873d103..00000000000
--- a/3rdparty/jsoncpp/test/data/test_array_02.json
+++ /dev/null
@@ -1 +0,0 @@
-[1]
diff --git a/3rdparty/jsoncpp/test/data/test_array_03.expected b/3rdparty/jsoncpp/test/data/test_array_03.expected
deleted file mode 100644
index 3d8dc18eb1e..00000000000
--- a/3rdparty/jsoncpp/test/data/test_array_03.expected
+++ /dev/null
@@ -1,6 +0,0 @@
-.=[]
-.[0]=1
-.[1]=2
-.[2]=3
-.[3]=4
-.[4]=5
diff --git a/3rdparty/jsoncpp/test/data/test_array_03.json b/3rdparty/jsoncpp/test/data/test_array_03.json
deleted file mode 100644
index 9b3f9247559..00000000000
--- a/3rdparty/jsoncpp/test/data/test_array_03.json
+++ /dev/null
@@ -1 +0,0 @@
-[ 1, 2 , 3,4,5]
diff --git a/3rdparty/jsoncpp/test/data/test_array_04.expected b/3rdparty/jsoncpp/test/data/test_array_04.expected
deleted file mode 100644
index ad4add97946..00000000000
--- a/3rdparty/jsoncpp/test/data/test_array_04.expected
+++ /dev/null
@@ -1,5 +0,0 @@
-.=[]
-.[0]=1
-.[1]="abc"
-.[2]=12.3
-.[3]=-4
diff --git a/3rdparty/jsoncpp/test/data/test_array_04.json b/3rdparty/jsoncpp/test/data/test_array_04.json
deleted file mode 100644
index ecca546b2c6..00000000000
--- a/3rdparty/jsoncpp/test/data/test_array_04.json
+++ /dev/null
@@ -1 +0,0 @@
-[1, "abc" , 12.3, -4]
diff --git a/3rdparty/jsoncpp/test/data/test_array_05.expected b/3rdparty/jsoncpp/test/data/test_array_05.expected
deleted file mode 100644
index 76cff87c2ab..00000000000
--- a/3rdparty/jsoncpp/test/data/test_array_05.expected
+++ /dev/null
@@ -1,100 +0,0 @@
-.=[]
-.[0]=1
-.[1]=2
-.[2]=3
-.[3]=4
-.[4]=5
-.[5]=6
-.[6]=7
-.[7]=8
-.[8]=9
-.[9]=10
-.[10]=11
-.[11]=12
-.[12]=13
-.[13]=14
-.[14]=15
-.[15]=16
-.[16]=17
-.[17]=18
-.[18]=19
-.[19]=20
-.[20]=21
-.[21]=22
-.[22]=23
-.[23]=24
-.[24]=25
-.[25]=26
-.[26]=27
-.[27]=28
-.[28]=29
-.[29]=30
-.[30]=31
-.[31]=32
-.[32]=33
-.[33]=34
-.[34]=35
-.[35]=36
-.[36]=37
-.[37]=38
-.[38]=39
-.[39]=40
-.[40]=41
-.[41]=42
-.[42]=43
-.[43]=44
-.[44]=45
-.[45]=46
-.[46]=47
-.[47]=48
-.[48]=49
-.[49]=50
-.[50]=51
-.[51]=52
-.[52]=53
-.[53]=54
-.[54]=55
-.[55]=56
-.[56]=57
-.[57]=58
-.[58]=59
-.[59]=60
-.[60]=61
-.[61]=62
-.[62]=63
-.[63]=64
-.[64]=65
-.[65]=66
-.[66]=67
-.[67]=68
-.[68]=69
-.[69]=70
-.[70]=71
-.[71]=72
-.[72]=73
-.[73]=74
-.[74]=75
-.[75]=76
-.[76]=77
-.[77]=78
-.[78]=79
-.[79]=80
-.[80]=81
-.[81]=82
-.[82]=83
-.[83]=84
-.[84]=85
-.[85]=86
-.[86]=87
-.[87]=88
-.[88]=89
-.[89]=90
-.[90]=91
-.[91]=92
-.[92]=93
-.[93]=94
-.[94]=95
-.[95]=96
-.[96]=97
-.[97]=98
-.[98]=99
diff --git a/3rdparty/jsoncpp/test/data/test_array_05.json b/3rdparty/jsoncpp/test/data/test_array_05.json
deleted file mode 100644
index 7809d6c9a1a..00000000000
--- a/3rdparty/jsoncpp/test/data/test_array_05.json
+++ /dev/null
@@ -1 +0,0 @@
-[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99] \ No newline at end of file
diff --git a/3rdparty/jsoncpp/test/data/test_array_06.expected b/3rdparty/jsoncpp/test/data/test_array_06.expected
deleted file mode 100644
index 5c9f48eaacd..00000000000
--- a/3rdparty/jsoncpp/test/data/test_array_06.expected
+++ /dev/null
@@ -1,5 +0,0 @@
-.=[]
-.[0]="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
-.[1]="bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
-.[2]="ccccccccccccccccccccccc"
-.[3]="dddddddddddddddddddddddddddddddddddddddddddddddddddd"
diff --git a/3rdparty/jsoncpp/test/data/test_array_06.json b/3rdparty/jsoncpp/test/data/test_array_06.json
deleted file mode 100644
index 7f6c516afde..00000000000
--- a/3rdparty/jsoncpp/test/data/test_array_06.json
+++ /dev/null
@@ -1,4 +0,0 @@
-[ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
- "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
- "ccccccccccccccccccccccc",
- "dddddddddddddddddddddddddddddddddddddddddddddddddddd" ] \ No newline at end of file
diff --git a/3rdparty/jsoncpp/test/data/test_array_07.expected b/3rdparty/jsoncpp/test/data/test_array_07.expected
deleted file mode 100644
index ee2fafc010e..00000000000
--- a/3rdparty/jsoncpp/test/data/test_array_07.expected
+++ /dev/null
@@ -1,2122 +0,0 @@
-.=[]
-.[0]=[]
-.[0][0]="A"
-.[0][1]=0
-.[0][2]=1
-.[0][3]=2
-.[0][4]=3
-.[0][5]=4
-.[0][6]=5
-.[0][7]=6
-.[0][8]=7
-.[0][9]=8
-.[0][10]=9
-.[0][11]=10
-.[0][12]=11
-.[0][13]=12
-.[0][14]=13
-.[0][15]=14
-.[0][16]=15
-.[0][17]=16
-.[0][18]=17
-.[0][19]=18
-.[0][20]=19
-.[0][21]=20
-.[0][22]=21
-.[0][23]=22
-.[0][24]=23
-.[0][25]=24
-.[0][26]=25
-.[0][27]=26
-.[0][28]=27
-.[0][29]=28
-.[0][30]=29
-.[0][31]=30
-.[0][32]=31
-.[0][33]=32
-.[0][34]=33
-.[0][35]=34
-.[0][36]=35
-.[0][37]=36
-.[0][38]=37
-.[0][39]=38
-.[0][40]=39
-.[0][41]=40
-.[0][42]=41
-.[0][43]=42
-.[0][44]=43
-.[0][45]=44
-.[0][46]=45
-.[0][47]=46
-.[0][48]=47
-.[0][49]=48
-.[0][50]=49
-.[0][51]=50
-.[0][52]=51
-.[0][53]=52
-.[0][54]=53
-.[0][55]=54
-.[0][56]=55
-.[0][57]=56
-.[0][58]=57
-.[0][59]=58
-.[0][60]=59
-.[0][61]=60
-.[0][62]=61
-.[0][63]=62
-.[0][64]=63
-.[0][65]=64
-.[0][66]=65
-.[0][67]=66
-.[0][68]=67
-.[0][69]=68
-.[0][70]=69
-.[0][71]=70
-.[0][72]=71
-.[0][73]=72
-.[0][74]=73
-.[0][75]=74
-.[0][76]=75
-.[0][77]=76
-.[0][78]=77
-.[0][79]=78
-.[0][80]=79
-.[0][81]=80
-.[0][82]=81
-.[0][83]=82
-.[0][84]=83
-.[0][85]=84
-.[0][86]=85
-.[0][87]=86
-.[0][88]=87
-.[0][89]=88
-.[0][90]=89
-.[0][91]=90
-.[0][92]=91
-.[0][93]=92
-.[0][94]=93
-.[0][95]=94
-.[0][96]=95
-.[0][97]=96
-.[0][98]=97
-.[0][99]=98
-.[0][100]=99
-.[0][101]=100
-.[0][102]=101
-.[0][103]=102
-.[0][104]=103
-.[0][105]=104
-.[0][106]=105
-.[0][107]=106
-.[0][108]=107
-.[0][109]=108
-.[0][110]=109
-.[0][111]=110
-.[0][112]=111
-.[0][113]=112
-.[0][114]=113
-.[0][115]=114
-.[0][116]=115
-.[0][117]=116
-.[0][118]=117
-.[0][119]=118
-.[0][120]=119
-.[0][121]=120
-.[0][122]=121
-.[0][123]=122
-.[0][124]=123
-.[0][125]=124
-.[0][126]=125
-.[0][127]=126
-.[0][128]=127
-.[0][129]=128
-.[0][130]=129
-.[0][131]=130
-.[0][132]=131
-.[0][133]=132
-.[0][134]=133
-.[0][135]=134
-.[0][136]=135
-.[0][137]=136
-.[0][138]=137
-.[0][139]=138
-.[0][140]=139
-.[0][141]=140
-.[0][142]=141
-.[0][143]=142
-.[0][144]=143
-.[0][145]=144
-.[0][146]=145
-.[0][147]=146
-.[0][148]=147
-.[0][149]=148
-.[0][150]=149
-.[0][151]=150
-.[0][152]=151
-.[0][153]=152
-.[0][154]=153
-.[0][155]=154
-.[0][156]=155
-.[0][157]=156
-.[0][158]=157
-.[0][159]=158
-.[0][160]=159
-.[0][161]=160
-.[0][162]=161
-.[0][163]=162
-.[0][164]=163
-.[0][165]=164
-.[0][166]=165
-.[0][167]=166
-.[0][168]=167
-.[0][169]=168
-.[0][170]=169
-.[0][171]=170
-.[0][172]=171
-.[0][173]=172
-.[0][174]=173
-.[0][175]=174
-.[0][176]=175
-.[0][177]=176
-.[0][178]=177
-.[0][179]=178
-.[0][180]=179
-.[0][181]=180
-.[0][182]=181
-.[0][183]=182
-.[0][184]=183
-.[0][185]=184
-.[0][186]=185
-.[0][187]=186
-.[0][188]=187
-.[0][189]=188
-.[0][190]=189
-.[0][191]=190
-.[0][192]=191
-.[0][193]=192
-.[0][194]=193
-.[0][195]=194
-.[0][196]=195
-.[0][197]=196
-.[0][198]=197
-.[0][199]=198
-.[0][200]=199
-.[0][201]=200
-.[0][202]=201
-.[0][203]=202
-.[0][204]=203
-.[0][205]=204
-.[0][206]=205
-.[0][207]=206
-.[0][208]=207
-.[0][209]=208
-.[0][210]=209
-.[0][211]=210
-.[0][212]=211
-.[0][213]=212
-.[0][214]=213
-.[0][215]=214
-.[0][216]=215
-.[0][217]=216
-.[0][218]=217
-.[0][219]=218
-.[0][220]=219
-.[0][221]=220
-.[0][222]=221
-.[0][223]=222
-.[0][224]=223
-.[0][225]=224
-.[0][226]=225
-.[0][227]=226
-.[0][228]=227
-.[0][229]=228
-.[0][230]=229
-.[0][231]=230
-.[0][232]=231
-.[0][233]=232
-.[0][234]=233
-.[0][235]=234
-.[0][236]=235
-.[0][237]=236
-.[0][238]=237
-.[0][239]=238
-.[0][240]=239
-.[0][241]=240
-.[0][242]=241
-.[0][243]=242
-.[0][244]=243
-.[0][245]=244
-.[0][246]=245
-.[0][247]=246
-.[0][248]=247
-.[0][249]=248
-.[0][250]=249
-.[0][251]=250
-.[0][252]=251
-.[0][253]=252
-.[0][254]=253
-.[0][255]=254
-.[0][256]=255
-.[0][257]=256
-.[0][258]=257
-.[0][259]=258
-.[0][260]=259
-.[0][261]=260
-.[0][262]=261
-.[0][263]=262
-.[0][264]=263
-.[0][265]=264
-.[0][266]=265
-.[0][267]=266
-.[0][268]=267
-.[0][269]=268
-.[0][270]=269
-.[0][271]=270
-.[0][272]=271
-.[0][273]=272
-.[0][274]=273
-.[0][275]=274
-.[0][276]=275
-.[0][277]=276
-.[0][278]=277
-.[0][279]=278
-.[0][280]=279
-.[0][281]=280
-.[0][282]=281
-.[0][283]=282
-.[0][284]=283
-.[0][285]=284
-.[0][286]=285
-.[0][287]=286
-.[0][288]=287
-.[0][289]=288
-.[0][290]=289
-.[0][291]=290
-.[0][292]=291
-.[0][293]=292
-.[0][294]=293
-.[0][295]=294
-.[0][296]=295
-.[0][297]=296
-.[0][298]=297
-.[0][299]=298
-.[0][300]=299
-.[0][301]=300
-.[0][302]=301
-.[0][303]=302
-.[0][304]=303
-.[0][305]=304
-.[0][306]=305
-.[0][307]=306
-.[0][308]=307
-.[0][309]=308
-.[0][310]=309
-.[0][311]=310
-.[0][312]=311
-.[0][313]=312
-.[0][314]=313
-.[0][315]=314
-.[0][316]=315
-.[0][317]=316
-.[0][318]=317
-.[0][319]=318
-.[0][320]=319
-.[0][321]=320
-.[0][322]=321
-.[0][323]=322
-.[0][324]=323
-.[0][325]=324
-.[0][326]=325
-.[0][327]=326
-.[0][328]=327
-.[0][329]=328
-.[0][330]=329
-.[0][331]=330
-.[0][332]=331
-.[0][333]=332
-.[0][334]=333
-.[0][335]=334
-.[0][336]=335
-.[0][337]=336
-.[0][338]=337
-.[0][339]=338
-.[0][340]=339
-.[0][341]=340
-.[0][342]=341
-.[0][343]=342
-.[0][344]=343
-.[0][345]=344
-.[0][346]=345
-.[0][347]=346
-.[0][348]=347
-.[0][349]=348
-.[0][350]=349
-.[0][351]=350
-.[0][352]=351
-.[0][353]=352
-.[0][354]=353
-.[0][355]=354
-.[0][356]=355
-.[0][357]=356
-.[0][358]=357
-.[0][359]=358
-.[0][360]=359
-.[0][361]=360
-.[0][362]=361
-.[0][363]=362
-.[0][364]=363
-.[0][365]=364
-.[0][366]=365
-.[0][367]=366
-.[0][368]=367
-.[0][369]=368
-.[0][370]=369
-.[0][371]=370
-.[0][372]=371
-.[0][373]=372
-.[0][374]=373
-.[0][375]=374
-.[0][376]=375
-.[0][377]=376
-.[0][378]=377
-.[0][379]=378
-.[0][380]=379
-.[0][381]=380
-.[0][382]=381
-.[0][383]=382
-.[0][384]=383
-.[0][385]=384
-.[0][386]=385
-.[0][387]=386
-.[0][388]=387
-.[0][389]=388
-.[0][390]=389
-.[0][391]=390
-.[0][392]=391
-.[0][393]=392
-.[0][394]=393
-.[0][395]=394
-.[0][396]=395
-.[0][397]=396
-.[0][398]=397
-.[0][399]=398
-.[0][400]=399
-.[0][401]=400
-.[0][402]=401
-.[0][403]=402
-.[0][404]=403
-.[0][405]=404
-.[0][406]=405
-.[0][407]=406
-.[0][408]=407
-.[0][409]=408
-.[0][410]=409
-.[0][411]=410
-.[0][412]=411
-.[0][413]=412
-.[0][414]=413
-.[0][415]=414
-.[0][416]=415
-.[0][417]=416
-.[0][418]=417
-.[0][419]=418
-.[0][420]=419
-.[0][421]=420
-.[0][422]=421
-.[0][423]=422
-.[0][424]=423
-.[0][425]=424
-.[0][426]=425
-.[0][427]=426
-.[0][428]=427
-.[0][429]=428
-.[0][430]=429
-.[0][431]=430
-.[0][432]=431
-.[0][433]=432
-.[0][434]=433
-.[0][435]=434
-.[0][436]=435
-.[0][437]=436
-.[0][438]=437
-.[0][439]=438
-.[0][440]=439
-.[0][441]=440
-.[0][442]=441
-.[0][443]=442
-.[0][444]=443
-.[0][445]=444
-.[0][446]=445
-.[0][447]=446
-.[0][448]=447
-.[0][449]=448
-.[0][450]=449
-.[0][451]=450
-.[0][452]=451
-.[0][453]=452
-.[0][454]=453
-.[0][455]=454
-.[0][456]=455
-.[0][457]=456
-.[0][458]=457
-.[0][459]=458
-.[0][460]=459
-.[0][461]=460
-.[0][462]=461
-.[0][463]=462
-.[0][464]=463
-.[0][465]=464
-.[0][466]=465
-.[0][467]=466
-.[0][468]=467
-.[0][469]=468
-.[0][470]=469
-.[0][471]=470
-.[0][472]=471
-.[0][473]=472
-.[0][474]=473
-.[0][475]=474
-.[0][476]=475
-.[0][477]=476
-.[0][478]=477
-.[0][479]=478
-.[0][480]=479
-.[0][481]=480
-.[0][482]=481
-.[0][483]=482
-.[0][484]=483
-.[0][485]=484
-.[0][486]=485
-.[0][487]=486
-.[0][488]=487
-.[0][489]=488
-.[0][490]=489
-.[0][491]=490
-.[0][492]=491
-.[0][493]=492
-.[0][494]=493
-.[0][495]=494
-.[0][496]=495
-.[0][497]=496
-.[0][498]=497
-.[0][499]=498
-.[0][500]=499
-.[0][501]=500
-.[0][502]=501
-.[0][503]=502
-.[0][504]=503
-.[0][505]=504
-.[0][506]=505
-.[0][507]=506
-.[0][508]=507
-.[0][509]=508
-.[0][510]=509
-.[0][511]=510
-.[0][512]=511
-.[0][513]=512
-.[0][514]=513
-.[0][515]=514
-.[0][516]=515
-.[0][517]=516
-.[0][518]=517
-.[0][519]=518
-.[0][520]=519
-.[0][521]=520
-.[0][522]=521
-.[0][523]=522
-.[0][524]=523
-.[0][525]=524
-.[0][526]=525
-.[0][527]=526
-.[0][528]=527
-.[0][529]=528
-.[0][530]=529
-.[0][531]=530
-.[0][532]=531
-.[0][533]=532
-.[0][534]=533
-.[0][535]=534
-.[0][536]=535
-.[0][537]=536
-.[0][538]=537
-.[0][539]=538
-.[0][540]=539
-.[0][541]=540
-.[0][542]=541
-.[0][543]=542
-.[0][544]=543
-.[0][545]=544
-.[0][546]=545
-.[0][547]=546
-.[0][548]=547
-.[0][549]=548
-.[0][550]=549
-.[0][551]=550
-.[0][552]=551
-.[0][553]=552
-.[0][554]=553
-.[0][555]=554
-.[0][556]=555
-.[0][557]=556
-.[0][558]=557
-.[0][559]=558
-.[0][560]=559
-.[0][561]=560
-.[0][562]=561
-.[0][563]=562
-.[0][564]=563
-.[0][565]=564
-.[0][566]=565
-.[0][567]=566
-.[0][568]=567
-.[0][569]=568
-.[0][570]=569
-.[0][571]=570
-.[0][572]=571
-.[0][573]=572
-.[0][574]=573
-.[0][575]=574
-.[0][576]=575
-.[0][577]=576
-.[0][578]=577
-.[0][579]=578
-.[0][580]=579
-.[0][581]=580
-.[0][582]=581
-.[0][583]=582
-.[0][584]=583
-.[0][585]=584
-.[0][586]=585
-.[0][587]=586
-.[0][588]=587
-.[0][589]=588
-.[0][590]=589
-.[0][591]=590
-.[0][592]=591
-.[0][593]=592
-.[0][594]=593
-.[0][595]=594
-.[0][596]=595
-.[0][597]=596
-.[0][598]=597
-.[0][599]=598
-.[0][600]=599
-.[0][601]=600
-.[0][602]=601
-.[0][603]=602
-.[0][604]=603
-.[0][605]=604
-.[0][606]=605
-.[0][607]=606
-.[0][608]=607
-.[0][609]=608
-.[0][610]=609
-.[0][611]=610
-.[0][612]=611
-.[0][613]=612
-.[0][614]=613
-.[0][615]=614
-.[0][616]=615
-.[0][617]=616
-.[0][618]=617
-.[0][619]=618
-.[0][620]=619
-.[0][621]=620
-.[0][622]=621
-.[0][623]=622
-.[0][624]=623
-.[0][625]=624
-.[0][626]=625
-.[0][627]=626
-.[0][628]=627
-.[0][629]=628
-.[0][630]=629
-.[0][631]=630
-.[0][632]=631
-.[0][633]=632
-.[0][634]=633
-.[0][635]=634
-.[0][636]=635
-.[0][637]=636
-.[0][638]=637
-.[0][639]=638
-.[0][640]=639
-.[0][641]=640
-.[0][642]=641
-.[0][643]=642
-.[0][644]=643
-.[0][645]=644
-.[0][646]=645
-.[0][647]=646
-.[0][648]=647
-.[0][649]=648
-.[0][650]=649
-.[0][651]=650
-.[0][652]=651
-.[0][653]=652
-.[0][654]=653
-.[0][655]=654
-.[0][656]=655
-.[0][657]=656
-.[0][658]=657
-.[0][659]=658
-.[0][660]=659
-.[0][661]=660
-.[0][662]=661
-.[0][663]=662
-.[0][664]=663
-.[0][665]=664
-.[0][666]=665
-.[0][667]=666
-.[0][668]=667
-.[0][669]=668
-.[0][670]=669
-.[0][671]=670
-.[0][672]=671
-.[0][673]=672
-.[0][674]=673
-.[0][675]=674
-.[0][676]=675
-.[0][677]=676
-.[0][678]=677
-.[0][679]=678
-.[0][680]=679
-.[0][681]=680
-.[0][682]=681
-.[0][683]=682
-.[0][684]=683
-.[0][685]=684
-.[0][686]=685
-.[0][687]=686
-.[0][688]=687
-.[0][689]=688
-.[0][690]=689
-.[0][691]=690
-.[0][692]=691
-.[0][693]=692
-.[0][694]=693
-.[0][695]=694
-.[0][696]=695
-.[0][697]=696
-.[0][698]=697
-.[0][699]=698
-.[0][700]=699
-.[0][701]=700
-.[0][702]=701
-.[0][703]=702
-.[0][704]=703
-.[0][705]=704
-.[0][706]=705
-.[0][707]=706
-.[0][708]=707
-.[0][709]=708
-.[0][710]=709
-.[0][711]=710
-.[0][712]=711
-.[0][713]=712
-.[0][714]=713
-.[0][715]=714
-.[0][716]=715
-.[0][717]=716
-.[0][718]=717
-.[0][719]=718
-.[0][720]=719
-.[0][721]=720
-.[0][722]=721
-.[0][723]=722
-.[0][724]=723
-.[0][725]=724
-.[0][726]=725
-.[0][727]=726
-.[0][728]=727
-.[0][729]=728
-.[0][730]=729
-.[0][731]=730
-.[0][732]=731
-.[0][733]=732
-.[0][734]=733
-.[0][735]=734
-.[0][736]=735
-.[0][737]=736
-.[0][738]=737
-.[0][739]=738
-.[0][740]=739
-.[0][741]=740
-.[0][742]=741
-.[0][743]=742
-.[0][744]=743
-.[0][745]=744
-.[0][746]=745
-.[0][747]=746
-.[0][748]=747
-.[0][749]=748
-.[0][750]=749
-.[0][751]=750
-.[0][752]=751
-.[0][753]=752
-.[0][754]=753
-.[0][755]=754
-.[0][756]=755
-.[0][757]=756
-.[0][758]=757
-.[0][759]=758
-.[0][760]=759
-.[0][761]=760
-.[0][762]=761
-.[0][763]=762
-.[0][764]=763
-.[0][765]=764
-.[0][766]=765
-.[0][767]=766
-.[0][768]=767
-.[0][769]=768
-.[0][770]=769
-.[0][771]=770
-.[0][772]=771
-.[0][773]=772
-.[0][774]=773
-.[0][775]=774
-.[0][776]=775
-.[0][777]=776
-.[0][778]=777
-.[0][779]=778
-.[0][780]=779
-.[0][781]=780
-.[0][782]=781
-.[0][783]=782
-.[0][784]=783
-.[0][785]=784
-.[0][786]=785
-.[0][787]=786
-.[0][788]=787
-.[0][789]=788
-.[0][790]=789
-.[0][791]=790
-.[0][792]=791
-.[0][793]=792
-.[0][794]=793
-.[0][795]=794
-.[0][796]=795
-.[0][797]=796
-.[0][798]=797
-.[0][799]=798
-.[0][800]=799
-.[0][801]=800
-.[0][802]=801
-.[0][803]=802
-.[0][804]=803
-.[0][805]=804
-.[0][806]=805
-.[0][807]=806
-.[0][808]=807
-.[0][809]=808
-.[0][810]=809
-.[0][811]=810
-.[0][812]=811
-.[0][813]=812
-.[0][814]=813
-.[0][815]=814
-.[0][816]=815
-.[0][817]=816
-.[0][818]=817
-.[0][819]=818
-.[0][820]=819
-.[0][821]=820
-.[0][822]=821
-.[0][823]=822
-.[0][824]=823
-.[0][825]=824
-.[0][826]=825
-.[0][827]=826
-.[0][828]=827
-.[0][829]=828
-.[0][830]=829
-.[0][831]=830
-.[0][832]=831
-.[0][833]=832
-.[0][834]=833
-.[0][835]=834
-.[0][836]=835
-.[0][837]=836
-.[0][838]=837
-.[0][839]=838
-.[0][840]=839
-.[0][841]=840
-.[0][842]=841
-.[0][843]=842
-.[0][844]=843
-.[0][845]=844
-.[0][846]=845
-.[0][847]=846
-.[0][848]=847
-.[0][849]=848
-.[0][850]=849
-.[0][851]=850
-.[0][852]=851
-.[0][853]=852
-.[0][854]=853
-.[0][855]=854
-.[0][856]=855
-.[0][857]=856
-.[0][858]=857
-.[0][859]=858
-.[0][860]=859
-.[0][861]=860
-.[0][862]=861
-.[0][863]=862
-.[0][864]=863
-.[0][865]=864
-.[0][866]=865
-.[0][867]=866
-.[0][868]=867
-.[0][869]=868
-.[0][870]=869
-.[0][871]=870
-.[0][872]=871
-.[0][873]=872
-.[0][874]=873
-.[0][875]=874
-.[0][876]=875
-.[0][877]=876
-.[0][878]=877
-.[0][879]=878
-.[0][880]=879
-.[0][881]=880
-.[0][882]=881
-.[0][883]=882
-.[0][884]=883
-.[0][885]=884
-.[0][886]=885
-.[0][887]=886
-.[0][888]=887
-.[0][889]=888
-.[0][890]=889
-.[0][891]=890
-.[0][892]=891
-.[0][893]=892
-.[0][894]=893
-.[0][895]=894
-.[0][896]=895
-.[0][897]=896
-.[0][898]=897
-.[0][899]=898
-.[0][900]=899
-.[0][901]=900
-.[0][902]=901
-.[0][903]=902
-.[0][904]=903
-.[0][905]=904
-.[0][906]=905
-.[0][907]=906
-.[0][908]=907
-.[0][909]=908
-.[0][910]=909
-.[0][911]=910
-.[0][912]=911
-.[0][913]=912
-.[0][914]=913
-.[0][915]=914
-.[0][916]=915
-.[0][917]=916
-.[0][918]=917
-.[0][919]=918
-.[0][920]=919
-.[0][921]=920
-.[0][922]=921
-.[0][923]=922
-.[0][924]=923
-.[0][925]=924
-.[0][926]=925
-.[0][927]=926
-.[0][928]=927
-.[0][929]=928
-.[0][930]=929
-.[0][931]=930
-.[0][932]=931
-.[0][933]=932
-.[0][934]=933
-.[0][935]=934
-.[0][936]=935
-.[0][937]=936
-.[0][938]=937
-.[0][939]=938
-.[0][940]=939
-.[0][941]=940
-.[0][942]=941
-.[0][943]=942
-.[0][944]=943
-.[0][945]=944
-.[0][946]=945
-.[0][947]=946
-.[0][948]=947
-.[0][949]=948
-.[0][950]=949
-.[0][951]=950
-.[0][952]=951
-.[0][953]=952
-.[0][954]=953
-.[0][955]=954
-.[0][956]=955
-.[0][957]=956
-.[0][958]=957
-.[0][959]=958
-.[0][960]=959
-.[0][961]=960
-.[0][962]=961
-.[0][963]=962
-.[0][964]=963
-.[0][965]=964
-.[0][966]=965
-.[0][967]=966
-.[0][968]=967
-.[0][969]=968
-.[0][970]=969
-.[0][971]=970
-.[0][972]=971
-.[0][973]=972
-.[0][974]=973
-.[0][975]=974
-.[0][976]=975
-.[0][977]=976
-.[0][978]=977
-.[0][979]=978
-.[0][980]=979
-.[0][981]=980
-.[0][982]=981
-.[0][983]=982
-.[0][984]=983
-.[0][985]=984
-.[0][986]=985
-.[0][987]=986
-.[0][988]=987
-.[0][989]=988
-.[0][990]=989
-.[0][991]=990
-.[0][992]=991
-.[0][993]=992
-.[0][994]=993
-.[0][995]=994
-.[0][996]=995
-.[0][997]=996
-.[0][998]=997
-.[0][999]=998
-.[0][1000]=999
-.[0][1001]=1000
-.[0][1002]=1001
-.[0][1003]=1002
-.[0][1004]=1003
-.[0][1005]=1004
-.[0][1006]=1005
-.[0][1007]=1006
-.[0][1008]=1007
-.[0][1009]=1008
-.[0][1010]=1009
-.[0][1011]=1010
-.[0][1012]=1011
-.[0][1013]=1012
-.[0][1014]=1013
-.[0][1015]=1014
-.[0][1016]=1015
-.[0][1017]=1016
-.[0][1018]=1017
-.[0][1019]=1018
-.[0][1020]=1019
-.[0][1021]=1020
-.[0][1022]=1021
-.[0][1023]=1022
-.[0][1024]=1023
-.[0][1025]=1024
-.[0][1026]=1025
-.[0][1027]=1026
-.[0][1028]=1027
-.[0][1029]=1028
-.[0][1030]=1029
-.[0][1031]=1030
-.[0][1032]=1031
-.[0][1033]=1032
-.[0][1034]=1033
-.[0][1035]=1034
-.[0][1036]=1035
-.[0][1037]=1036
-.[0][1038]=1037
-.[0][1039]=1038
-.[0][1040]=1039
-.[0][1041]=1040
-.[0][1042]=1041
-.[0][1043]=1042
-.[0][1044]=1043
-.[0][1045]=1044
-.[0][1046]=1045
-.[0][1047]=1046
-.[0][1048]=1047
-.[0][1049]=1048
-.[0][1050]=1049
-.[0][1051]=1050
-.[0][1052]=1051
-.[0][1053]=1052
-.[0][1054]=1053
-.[0][1055]=1054
-.[0][1056]=1055
-.[0][1057]=1056
-.[0][1058]=1057
-.[0][1059]=1058
-.[0][1060]=1059
-.[0][1061]=1060
-.[0][1062]=1061
-.[0][1063]=1062
-.[0][1064]=1063
-.[0][1065]=1064
-.[0][1066]=1065
-.[0][1067]=1066
-.[0][1068]=1067
-.[0][1069]=1068
-.[0][1070]=1069
-.[0][1071]=1070
-.[0][1072]=1071
-.[0][1073]=1072
-.[0][1074]=1073
-.[0][1075]=1074
-.[0][1076]=1075
-.[0][1077]=1076
-.[0][1078]=1077
-.[0][1079]=1078
-.[0][1080]=1079
-.[0][1081]=1080
-.[0][1082]=1081
-.[0][1083]=1082
-.[0][1084]=1083
-.[0][1085]=1084
-.[0][1086]=1085
-.[0][1087]=1086
-.[0][1088]=1087
-.[0][1089]=1088
-.[0][1090]=1089
-.[0][1091]=1090
-.[0][1092]=1091
-.[0][1093]=1092
-.[0][1094]=1093
-.[0][1095]=1094
-.[0][1096]=1095
-.[0][1097]=1096
-.[0][1098]=1097
-.[0][1099]=1098
-.[0][1100]=1099
-.[0][1101]=1100
-.[0][1102]=1101
-.[0][1103]=1102
-.[0][1104]=1103
-.[0][1105]=1104
-.[0][1106]=1105
-.[0][1107]=1106
-.[0][1108]=1107
-.[0][1109]=1108
-.[0][1110]=1109
-.[0][1111]=1110
-.[0][1112]=1111
-.[0][1113]=1112
-.[0][1114]=1113
-.[0][1115]=1114
-.[0][1116]=1115
-.[0][1117]=1116
-.[0][1118]=1117
-.[0][1119]=1118
-.[0][1120]=1119
-.[0][1121]=1120
-.[0][1122]=1121
-.[0][1123]=1122
-.[0][1124]=1123
-.[0][1125]=1124
-.[0][1126]=1125
-.[0][1127]=1126
-.[0][1128]=1127
-.[0][1129]=1128
-.[0][1130]=1129
-.[0][1131]=1130
-.[0][1132]=1131
-.[0][1133]=1132
-.[0][1134]=1133
-.[0][1135]=1134
-.[0][1136]=1135
-.[0][1137]=1136
-.[0][1138]=1137
-.[0][1139]=1138
-.[0][1140]=1139
-.[0][1141]=1140
-.[0][1142]=1141
-.[0][1143]=1142
-.[0][1144]=1143
-.[0][1145]=1144
-.[0][1146]=1145
-.[0][1147]=1146
-.[0][1148]=1147
-.[0][1149]=1148
-.[0][1150]=1149
-.[0][1151]=1150
-.[0][1152]=1151
-.[0][1153]=1152
-.[0][1154]=1153
-.[0][1155]=1154
-.[0][1156]=1155
-.[0][1157]=1156
-.[0][1158]=1157
-.[0][1159]=1158
-.[0][1160]=1159
-.[0][1161]=1160
-.[0][1162]=1161
-.[0][1163]=1162
-.[0][1164]=1163
-.[0][1165]=1164
-.[0][1166]=1165
-.[0][1167]=1166
-.[0][1168]=1167
-.[0][1169]=1168
-.[0][1170]=1169
-.[0][1171]=1170
-.[0][1172]=1171
-.[0][1173]=1172
-.[0][1174]=1173
-.[0][1175]=1174
-.[0][1176]=1175
-.[0][1177]=1176
-.[0][1178]=1177
-.[0][1179]=1178
-.[0][1180]=1179
-.[0][1181]=1180
-.[0][1182]=1181
-.[0][1183]=1182
-.[0][1184]=1183
-.[0][1185]=1184
-.[0][1186]=1185
-.[0][1187]=1186
-.[0][1188]=1187
-.[0][1189]=1188
-.[0][1190]=1189
-.[0][1191]=1190
-.[0][1192]=1191
-.[0][1193]=1192
-.[0][1194]=1193
-.[0][1195]=1194
-.[0][1196]=1195
-.[0][1197]=1196
-.[0][1198]=1197
-.[0][1199]=1198
-.[0][1200]=1199
-.[0][1201]=1200
-.[0][1202]=1201
-.[0][1203]=1202
-.[0][1204]=1203
-.[0][1205]=1204
-.[0][1206]=1205
-.[0][1207]=1206
-.[0][1208]=1207
-.[0][1209]=1208
-.[0][1210]=1209
-.[0][1211]=1210
-.[0][1212]=1211
-.[0][1213]=1212
-.[0][1214]=1213
-.[0][1215]=1214
-.[0][1216]=1215
-.[0][1217]=1216
-.[0][1218]=1217
-.[0][1219]=1218
-.[0][1220]=1219
-.[0][1221]=1220
-.[0][1222]=1221
-.[0][1223]=1222
-.[0][1224]=1223
-.[0][1225]=1224
-.[0][1226]=1225
-.[0][1227]=1226
-.[0][1228]=1227
-.[0][1229]=1228
-.[0][1230]=1229
-.[0][1231]=1230
-.[0][1232]=1231
-.[0][1233]=1232
-.[0][1234]=1233
-.[0][1235]=1234
-.[0][1236]=1235
-.[0][1237]=1236
-.[0][1238]=1237
-.[0][1239]=1238
-.[0][1240]=1239
-.[0][1241]=1240
-.[0][1242]=1241
-.[0][1243]=1242
-.[0][1244]=1243
-.[0][1245]=1244
-.[0][1246]=1245
-.[0][1247]=1246
-.[0][1248]=1247
-.[0][1249]=1248
-.[0][1250]=1249
-.[0][1251]=1250
-.[0][1252]=1251
-.[0][1253]=1252
-.[0][1254]=1253
-.[0][1255]=1254
-.[0][1256]=1255
-.[0][1257]=1256
-.[0][1258]=1257
-.[0][1259]=1258
-.[0][1260]=1259
-.[0][1261]=1260
-.[0][1262]=1261
-.[0][1263]=1262
-.[0][1264]=1263
-.[0][1265]=1264
-.[0][1266]=1265
-.[0][1267]=1266
-.[0][1268]=1267
-.[0][1269]=1268
-.[0][1270]=1269
-.[0][1271]=1270
-.[0][1272]=1271
-.[0][1273]=1272
-.[0][1274]=1273
-.[0][1275]=1274
-.[0][1276]=1275
-.[0][1277]=1276
-.[0][1278]=1277
-.[0][1279]=1278
-.[0][1280]=1279
-.[0][1281]=1280
-.[0][1282]=1281
-.[0][1283]=1282
-.[0][1284]=1283
-.[0][1285]=1284
-.[0][1286]=1285
-.[0][1287]=1286
-.[0][1288]=1287
-.[0][1289]=1288
-.[0][1290]=1289
-.[0][1291]=1290
-.[0][1292]=1291
-.[0][1293]=1292
-.[0][1294]=1293
-.[0][1295]=1294
-.[0][1296]=1295
-.[0][1297]=1296
-.[0][1298]=1297
-.[0][1299]=1298
-.[0][1300]=1299
-.[0][1301]=1300
-.[0][1302]=1301
-.[0][1303]=1302
-.[0][1304]=1303
-.[0][1305]=1304
-.[0][1306]=1305
-.[0][1307]=1306
-.[0][1308]=1307
-.[0][1309]=1308
-.[0][1310]=1309
-.[0][1311]=1310
-.[0][1312]=1311
-.[0][1313]=1312
-.[0][1314]=1313
-.[0][1315]=1314
-.[0][1316]=1315
-.[0][1317]=1316
-.[0][1318]=1317
-.[0][1319]=1318
-.[0][1320]=1319
-.[0][1321]=1320
-.[0][1322]=1321
-.[0][1323]=1322
-.[0][1324]=1323
-.[0][1325]=1324
-.[0][1326]=1325
-.[0][1327]=1326
-.[0][1328]=1327
-.[0][1329]=1328
-.[0][1330]=1329
-.[0][1331]=1330
-.[0][1332]=1331
-.[0][1333]=1332
-.[0][1334]=1333
-.[0][1335]=1334
-.[0][1336]=1335
-.[0][1337]=1336
-.[0][1338]=1337
-.[0][1339]=1338
-.[0][1340]=1339
-.[0][1341]=1340
-.[0][1342]=1341
-.[0][1343]=1342
-.[0][1344]=1343
-.[0][1345]=1344
-.[0][1346]=1345
-.[0][1347]=1346
-.[0][1348]=1347
-.[0][1349]=1348
-.[0][1350]=1349
-.[0][1351]=1350
-.[0][1352]=1351
-.[0][1353]=1352
-.[0][1354]=1353
-.[0][1355]=1354
-.[0][1356]=1355
-.[0][1357]=1356
-.[0][1358]=1357
-.[0][1359]=1358
-.[0][1360]=1359
-.[0][1361]=1360
-.[0][1362]=1361
-.[0][1363]=1362
-.[0][1364]=1363
-.[0][1365]=1364
-.[0][1366]=1365
-.[0][1367]=1366
-.[0][1368]=1367
-.[0][1369]=1368
-.[0][1370]=1369
-.[0][1371]=1370
-.[0][1372]=1371
-.[0][1373]=1372
-.[0][1374]=1373
-.[0][1375]=1374
-.[0][1376]=1375
-.[0][1377]=1376
-.[0][1378]=1377
-.[0][1379]=1378
-.[0][1380]=1379
-.[0][1381]=1380
-.[0][1382]=1381
-.[0][1383]=1382
-.[0][1384]=1383
-.[0][1385]=1384
-.[0][1386]=1385
-.[0][1387]=1386
-.[0][1388]=1387
-.[0][1389]=1388
-.[0][1390]=1389
-.[0][1391]=1390
-.[0][1392]=1391
-.[0][1393]=1392
-.[0][1394]=1393
-.[0][1395]=1394
-.[0][1396]=1395
-.[0][1397]=1396
-.[0][1398]=1397
-.[0][1399]=1398
-.[0][1400]=1399
-.[0][1401]=1400
-.[0][1402]=1401
-.[0][1403]=1402
-.[0][1404]=1403
-.[0][1405]=1404
-.[0][1406]=1405
-.[0][1407]=1406
-.[0][1408]=1407
-.[0][1409]=1408
-.[0][1410]=1409
-.[0][1411]=1410
-.[0][1412]=1411
-.[0][1413]=1412
-.[0][1414]=1413
-.[0][1415]=1414
-.[0][1416]=1415
-.[0][1417]=1416
-.[0][1418]=1417
-.[0][1419]=1418
-.[0][1420]=1419
-.[0][1421]=1420
-.[0][1422]=1421
-.[0][1423]=1422
-.[0][1424]=1423
-.[0][1425]=1424
-.[0][1426]=1425
-.[0][1427]=1426
-.[0][1428]=1427
-.[0][1429]=1428
-.[0][1430]=1429
-.[0][1431]=1430
-.[0][1432]=1431
-.[0][1433]=1432
-.[0][1434]=1433
-.[0][1435]=1434
-.[0][1436]=1435
-.[0][1437]=1436
-.[0][1438]=1437
-.[0][1439]=1438
-.[0][1440]=1439
-.[0][1441]=1440
-.[0][1442]=1441
-.[0][1443]=1442
-.[0][1444]=1443
-.[0][1445]=1444
-.[0][1446]=1445
-.[0][1447]=1446
-.[0][1448]=1447
-.[0][1449]=1448
-.[0][1450]=1449
-.[0][1451]=1450
-.[0][1452]=1451
-.[0][1453]=1452
-.[0][1454]=1453
-.[0][1455]=1454
-.[0][1456]=1455
-.[0][1457]=1456
-.[0][1458]=1457
-.[0][1459]=1458
-.[0][1460]=1459
-.[0][1461]=1460
-.[0][1462]=1461
-.[0][1463]=1462
-.[0][1464]=1463
-.[0][1465]=1464
-.[0][1466]=1465
-.[0][1467]=1466
-.[0][1468]=1467
-.[0][1469]=1468
-.[0][1470]=1469
-.[0][1471]=1470
-.[0][1472]=1471
-.[0][1473]=1472
-.[0][1474]=1473
-.[0][1475]=1474
-.[0][1476]=1475
-.[0][1477]=1476
-.[0][1478]=1477
-.[0][1479]=1478
-.[0][1480]=1479
-.[0][1481]=1480
-.[0][1482]=1481
-.[0][1483]=1482
-.[0][1484]=1483
-.[0][1485]=1484
-.[0][1486]=1485
-.[0][1487]=1486
-.[0][1488]=1487
-.[0][1489]=1488
-.[0][1490]=1489
-.[0][1491]=1490
-.[0][1492]=1491
-.[0][1493]=1492
-.[0][1494]=1493
-.[0][1495]=1494
-.[0][1496]=1495
-.[0][1497]=1496
-.[0][1498]=1497
-.[0][1499]=1498
-.[0][1500]=1499
-.[0][1501]=1500
-.[0][1502]=1501
-.[0][1503]=1502
-.[0][1504]=1503
-.[0][1505]=1504
-.[0][1506]=1505
-.[0][1507]=1506
-.[0][1508]=1507
-.[0][1509]=1508
-.[0][1510]=1509
-.[0][1511]=1510
-.[0][1512]=1511
-.[0][1513]=1512
-.[0][1514]=1513
-.[0][1515]=1514
-.[0][1516]=1515
-.[0][1517]=1516
-.[0][1518]=1517
-.[0][1519]=1518
-.[0][1520]=1519
-.[0][1521]=1520
-.[0][1522]=1521
-.[0][1523]=1522
-.[0][1524]=1523
-.[0][1525]=1524
-.[0][1526]=1525
-.[0][1527]=1526
-.[0][1528]=1527
-.[0][1529]=1528
-.[0][1530]=1529
-.[0][1531]=1530
-.[0][1532]=1531
-.[0][1533]=1532
-.[0][1534]=1533
-.[0][1535]=1534
-.[0][1536]=1535
-.[0][1537]=1536
-.[0][1538]=1537
-.[0][1539]=1538
-.[0][1540]=1539
-.[0][1541]=1540
-.[0][1542]=1541
-.[0][1543]=1542
-.[0][1544]=1543
-.[0][1545]=1544
-.[0][1546]=1545
-.[0][1547]=1546
-.[0][1548]=1547
-.[0][1549]=1548
-.[0][1550]=1549
-.[0][1551]=1550
-.[0][1552]=1551
-.[0][1553]=1552
-.[0][1554]=1553
-.[0][1555]=1554
-.[0][1556]=1555
-.[0][1557]=1556
-.[0][1558]=1557
-.[0][1559]=1558
-.[0][1560]=1559
-.[0][1561]=1560
-.[0][1562]=1561
-.[0][1563]=1562
-.[0][1564]=1563
-.[0][1565]=1564
-.[0][1566]=1565
-.[0][1567]=1566
-.[0][1568]=1567
-.[0][1569]=1568
-.[0][1570]=1569
-.[0][1571]=1570
-.[0][1572]=1571
-.[0][1573]=1572
-.[0][1574]=1573
-.[0][1575]=1574
-.[0][1576]=1575
-.[0][1577]=1576
-.[0][1578]=1577
-.[0][1579]=1578
-.[0][1580]=1579
-.[0][1581]=1580
-.[0][1582]=1581
-.[0][1583]=1582
-.[0][1584]=1583
-.[0][1585]=1584
-.[0][1586]=1585
-.[0][1587]=1586
-.[0][1588]=1587
-.[0][1589]=1588
-.[0][1590]=1589
-.[0][1591]=1590
-.[0][1592]=1591
-.[0][1593]=1592
-.[0][1594]=1593
-.[0][1595]=1594
-.[0][1596]=1595
-.[0][1597]=1596
-.[0][1598]=1597
-.[0][1599]=1598
-.[0][1600]=1599
-.[0][1601]=1600
-.[0][1602]=1601
-.[0][1603]=1602
-.[0][1604]=1603
-.[0][1605]=1604
-.[0][1606]=1605
-.[0][1607]=1606
-.[0][1608]=1607
-.[0][1609]=1608
-.[0][1610]=1609
-.[0][1611]=1610
-.[0][1612]=1611
-.[0][1613]=1612
-.[0][1614]=1613
-.[0][1615]=1614
-.[0][1616]=1615
-.[0][1617]=1616
-.[0][1618]=1617
-.[0][1619]=1618
-.[0][1620]=1619
-.[0][1621]=1620
-.[0][1622]=1621
-.[0][1623]=1622
-.[0][1624]=1623
-.[0][1625]=1624
-.[0][1626]=1625
-.[0][1627]=1626
-.[0][1628]=1627
-.[0][1629]=1628
-.[0][1630]=1629
-.[0][1631]=1630
-.[0][1632]=1631
-.[0][1633]=1632
-.[0][1634]=1633
-.[0][1635]=1634
-.[0][1636]=1635
-.[0][1637]=1636
-.[0][1638]=1637
-.[0][1639]=1638
-.[0][1640]=1639
-.[0][1641]=1640
-.[0][1642]=1641
-.[0][1643]=1642
-.[0][1644]=1643
-.[0][1645]=1644
-.[0][1646]=1645
-.[0][1647]=1646
-.[0][1648]=1647
-.[0][1649]=1648
-.[0][1650]=1649
-.[0][1651]=1650
-.[0][1652]=1651
-.[0][1653]=1652
-.[0][1654]=1653
-.[0][1655]=1654
-.[0][1656]=1655
-.[0][1657]=1656
-.[0][1658]=1657
-.[0][1659]=1658
-.[0][1660]=1659
-.[0][1661]=1660
-.[0][1662]=1661
-.[0][1663]=1662
-.[0][1664]=1663
-.[0][1665]=1664
-.[0][1666]=1665
-.[0][1667]=1666
-.[0][1668]=1667
-.[0][1669]=1668
-.[0][1670]=1669
-.[0][1671]=1670
-.[0][1672]=1671
-.[0][1673]=1672
-.[0][1674]=1673
-.[0][1675]=1674
-.[0][1676]=1675
-.[0][1677]=1676
-.[0][1678]=1677
-.[0][1679]=1678
-.[0][1680]=1679
-.[0][1681]=1680
-.[0][1682]=1681
-.[0][1683]=1682
-.[0][1684]=1683
-.[0][1685]=1684
-.[0][1686]=1685
-.[0][1687]=1686
-.[0][1688]=1687
-.[0][1689]=1688
-.[0][1690]=1689
-.[0][1691]=1690
-.[0][1692]=1691
-.[0][1693]=1692
-.[0][1694]=1693
-.[0][1695]=1694
-.[0][1696]=1695
-.[0][1697]=1696
-.[0][1698]=1697
-.[0][1699]=1698
-.[0][1700]=1699
-.[0][1701]=1700
-.[0][1702]=1701
-.[0][1703]=1702
-.[0][1704]=1703
-.[0][1705]=1704
-.[0][1706]=1705
-.[0][1707]=1706
-.[0][1708]=1707
-.[0][1709]=1708
-.[0][1710]=1709
-.[0][1711]=1710
-.[0][1712]=1711
-.[0][1713]=1712
-.[0][1714]=1713
-.[0][1715]=1714
-.[0][1716]=1715
-.[0][1717]=1716
-.[0][1718]=1717
-.[0][1719]=1718
-.[0][1720]=1719
-.[0][1721]=1720
-.[0][1722]=1721
-.[0][1723]=1722
-.[0][1724]=1723
-.[0][1725]=1724
-.[0][1726]=1725
-.[0][1727]=1726
-.[0][1728]=1727
-.[0][1729]=1728
-.[0][1730]=1729
-.[0][1731]=1730
-.[0][1732]=1731
-.[0][1733]=1732
-.[0][1734]=1733
-.[0][1735]=1734
-.[0][1736]=1735
-.[0][1737]=1736
-.[0][1738]=1737
-.[0][1739]=1738
-.[0][1740]=1739
-.[0][1741]=1740
-.[0][1742]=1741
-.[0][1743]=1742
-.[0][1744]=1743
-.[0][1745]=1744
-.[0][1746]=1745
-.[0][1747]=1746
-.[0][1748]=1747
-.[0][1749]=1748
-.[0][1750]=1749
-.[0][1751]=1750
-.[0][1752]=1751
-.[0][1753]=1752
-.[0][1754]=1753
-.[0][1755]=1754
-.[0][1756]=1755
-.[0][1757]=1756
-.[0][1758]=1757
-.[0][1759]=1758
-.[0][1760]=1759
-.[0][1761]=1760
-.[0][1762]=1761
-.[0][1763]=1762
-.[0][1764]=1763
-.[0][1765]=1764
-.[0][1766]=1765
-.[0][1767]=1766
-.[0][1768]=1767
-.[0][1769]=1768
-.[0][1770]=1769
-.[0][1771]=1770
-.[0][1772]=1771
-.[0][1773]=1772
-.[0][1774]=1773
-.[0][1775]=1774
-.[0][1776]=1775
-.[0][1777]=1776
-.[0][1778]=1777
-.[0][1779]=1778
-.[0][1780]=1779
-.[0][1781]=1780
-.[0][1782]=1781
-.[0][1783]=1782
-.[0][1784]=1783
-.[0][1785]=1784
-.[0][1786]=1785
-.[0][1787]=1786
-.[0][1788]=1787
-.[0][1789]=1788
-.[0][1790]=1789
-.[0][1791]=1790
-.[0][1792]=1791
-.[0][1793]=1792
-.[0][1794]=1793
-.[0][1795]=1794
-.[0][1796]=1795
-.[0][1797]=1796
-.[0][1798]=1797
-.[0][1799]=1798
-.[0][1800]=1799
-.[0][1801]=1800
-.[0][1802]=1801
-.[0][1803]=1802
-.[0][1804]=1803
-.[0][1805]=1804
-.[0][1806]=1805
-.[0][1807]=1806
-.[0][1808]=1807
-.[0][1809]=1808
-.[0][1810]=1809
-.[0][1811]=1810
-.[0][1812]=1811
-.[0][1813]=1812
-.[0][1814]=1813
-.[0][1815]=1814
-.[0][1816]=1815
-.[0][1817]=1816
-.[0][1818]=1817
-.[0][1819]=1818
-.[0][1820]=1819
-.[0][1821]=1820
-.[0][1822]=1821
-.[0][1823]=1822
-.[0][1824]=1823
-.[0][1825]=1824
-.[0][1826]=1825
-.[0][1827]=1826
-.[0][1828]=1827
-.[0][1829]=1828
-.[0][1830]=1829
-.[0][1831]=1830
-.[0][1832]=1831
-.[0][1833]=1832
-.[0][1834]=1833
-.[0][1835]=1834
-.[0][1836]=1835
-.[0][1837]=1836
-.[0][1838]=1837
-.[0][1839]=1838
-.[0][1840]=1839
-.[0][1841]=1840
-.[0][1842]=1841
-.[0][1843]=1842
-.[0][1844]=1843
-.[0][1845]=1844
-.[0][1846]=1845
-.[0][1847]=1846
-.[0][1848]=1847
-.[0][1849]=1848
-.[0][1850]=1849
-.[0][1851]=1850
-.[0][1852]=1851
-.[0][1853]=1852
-.[0][1854]=1853
-.[0][1855]=1854
-.[0][1856]=1855
-.[0][1857]=1856
-.[0][1858]=1857
-.[0][1859]=1858
-.[0][1860]=1859
-.[0][1861]=1860
-.[0][1862]=1861
-.[0][1863]=1862
-.[0][1864]=1863
-.[0][1865]=1864
-.[0][1866]=1865
-.[0][1867]=1866
-.[0][1868]=1867
-.[0][1869]=1868
-.[0][1870]=1869
-.[0][1871]=1870
-.[0][1872]=1871
-.[0][1873]=1872
-.[0][1874]=1873
-.[0][1875]=1874
-.[0][1876]=1875
-.[0][1877]=1876
-.[0][1878]=1877
-.[0][1879]=1878
-.[0][1880]=1879
-.[0][1881]=1880
-.[0][1882]=1881
-.[0][1883]=1882
-.[0][1884]=1883
-.[0][1885]=1884
-.[0][1886]=1885
-.[0][1887]=1886
-.[0][1888]=1887
-.[0][1889]=1888
-.[0][1890]=1889
-.[0][1891]=1890
-.[0][1892]=1891
-.[0][1893]=1892
-.[0][1894]=1893
-.[0][1895]=1894
-.[0][1896]=1895
-.[0][1897]=1896
-.[0][1898]=1897
-.[0][1899]=1898
-.[0][1900]=1899
-.[0][1901]=1900
-.[0][1902]=1901
-.[0][1903]=1902
-.[0][1904]=1903
-.[0][1905]=1904
-.[0][1906]=1905
-.[0][1907]=1906
-.[0][1908]=1907
-.[0][1909]=1908
-.[0][1910]=1909
-.[0][1911]=1910
-.[0][1912]=1911
-.[0][1913]=1912
-.[0][1914]=1913
-.[0][1915]=1914
-.[0][1916]=1915
-.[0][1917]=1916
-.[0][1918]=1917
-.[0][1919]=1918
-.[0][1920]=1919
-.[0][1921]=1920
-.[0][1922]=1921
-.[0][1923]=1922
-.[0][1924]=1923
-.[0][1925]=1924
-.[0][1926]=1925
-.[0][1927]=1926
-.[0][1928]=1927
-.[0][1929]=1928
-.[0][1930]=1929
-.[0][1931]=1930
-.[0][1932]=1931
-.[0][1933]=1932
-.[0][1934]=1933
-.[0][1935]=1934
-.[0][1936]=1935
-.[0][1937]=1936
-.[0][1938]=1937
-.[0][1939]=1938
-.[0][1940]=1939
-.[0][1941]=1940
-.[0][1942]=1941
-.[0][1943]=1942
-.[0][1944]=1943
-.[0][1945]=1944
-.[0][1946]=1945
-.[0][1947]=1946
-.[0][1948]=1947
-.[0][1949]=1948
-.[0][1950]=1949
-.[0][1951]=1950
-.[0][1952]=1951
-.[0][1953]=1952
-.[0][1954]=1953
-.[0][1955]=1954
-.[0][1956]=1955
-.[0][1957]=1956
-.[0][1958]=1957
-.[0][1959]=1958
-.[0][1960]=1959
-.[0][1961]=1960
-.[0][1962]=1961
-.[0][1963]=1962
-.[0][1964]=1963
-.[0][1965]=1964
-.[0][1966]=1965
-.[0][1967]=1966
-.[0][1968]=1967
-.[0][1969]=1968
-.[0][1970]=1969
-.[0][1971]=1970
-.[0][1972]=1971
-.[0][1973]=1972
-.[0][1974]=1973
-.[0][1975]=1974
-.[0][1976]=1975
-.[0][1977]=1976
-.[0][1978]=1977
-.[0][1979]=1978
-.[0][1980]=1979
-.[0][1981]=1980
-.[0][1982]=1981
-.[0][1983]=1982
-.[0][1984]=1983
-.[0][1985]=1984
-.[0][1986]=1985
-.[0][1987]=1986
-.[0][1988]=1987
-.[0][1989]=1988
-.[0][1990]=1989
-.[0][1991]=1990
-.[0][1992]=1991
-.[0][1993]=1992
-.[0][1994]=1993
-.[0][1995]=1994
-.[0][1996]=1995
-.[0][1997]=1996
-.[0][1998]=1997
-.[0][1999]=1998
-.[0][2000]=1999
-.[0][2001]=2000
-.[0][2002]=2001
-.[0][2003]=2002
-.[0][2004]=2003
-.[0][2005]=2004
-.[0][2006]=2005
-.[0][2007]=2006
-.[0][2008]=2007
-.[0][2009]=2008
-.[0][2010]=2009
-.[0][2011]=2010
-.[0][2012]=2011
-.[0][2013]=2012
-.[0][2014]=2013
-.[0][2015]=2014
-.[0][2016]=2015
-.[0][2017]=2016
-.[0][2018]=2017
-.[0][2019]=2018
-.[0][2020]=2019
-.[0][2021]=2020
-.[0][2022]=2021
-.[0][2023]=2022
-.[0][2024]=2023
-.[0][2025]=2024
-.[0][2026]=2025
-.[0][2027]=2026
-.[0][2028]=2027
-.[0][2029]=2028
-.[0][2030]=2029
-.[0][2031]=2030
-.[0][2032]=2031
-.[0][2033]=2032
-.[0][2034]=2033
-.[0][2035]=2034
-.[0][2036]=2035
-.[0][2037]=2036
-.[0][2038]=2037
-.[0][2039]=2038
-.[0][2040]=2039
-.[0][2041]=2040
-.[0][2042]=2041
-.[0][2043]=2042
-.[0][2044]=2043
-.[0][2045]=2044
-.[0][2046]=2045
-.[0][2047]=2046
-.[0][2048]=2047
-.[0][2049]=2048
-.[0][2050]=2049
-.[0][2051]=2050
-.[0][2052]=2051
-.[0][2053]=2052
-.[0][2054]=2053
-.[0][2055]=2054
-.[0][2056]=2055
-.[0][2057]=2056
-.[0][2058]=2057
-.[0][2059]=2058
-.[0][2060]=2059
-.[0][2061]=2060
-.[0][2062]=2061
-.[0][2063]=2062
-.[0][2064]=2063
-.[0][2065]=2064
-.[0][2066]=2065
-.[0][2067]=2066
-.[0][2068]=2067
-.[0][2069]=2068
-.[0][2070]=2069
-.[0][2071]=2070
-.[0][2072]=2071
-.[0][2073]=2072
-.[0][2074]=2073
-.[0][2075]=2074
-.[0][2076]=2075
-.[0][2077]=2076
-.[0][2078]=2077
-.[0][2079]=2078
-.[0][2080]=2079
-.[0][2081]=2080
-.[0][2082]=2081
-.[0][2083]=2082
-.[0][2084]=2083
-.[0][2085]=2084
-.[0][2086]=2085
-.[0][2087]=2086
-.[0][2088]=2087
-.[0][2089]=2088
-.[0][2090]=2089
-.[0][2091]=2090
-.[0][2092]=2091
-.[0][2093]=2092
-.[0][2094]=2093
-.[0][2095]=2094
-.[0][2096]=2095
-.[0][2097]=2096
-.[0][2098]=2097
-.[0][2099]=2098
-.[0][2100]=2099
-.[0][2101]=2100
-.[0][2102]=2101
-.[0][2103]=2102
-.[0][2104]=2103
-.[0][2105]=2104
-.[0][2106]=2105
-.[0][2107]=2106
-.[0][2108]=2107
-.[0][2109]=2108
-.[0][2110]=2109
-.[0][2111]=2110
-.[0][2112]=2111
-.[0][2113]=2112
-.[0][2114]=2113
-.[0][2115]=2114
-.[0][2116]=2115
-.[0][2117]=2116
-.[0][2118]=2117
-.[0][2119]=2118
diff --git a/3rdparty/jsoncpp/test/data/test_array_07.json b/3rdparty/jsoncpp/test/data/test_array_07.json
deleted file mode 100644
index e4ab4cd4330..00000000000
--- a/3rdparty/jsoncpp/test/data/test_array_07.json
+++ /dev/null
@@ -1,2 +0,0 @@
-[["A",0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,886,887,888,889,890,891,892,893,894,895,896,897,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1154,1155,1156,1157,1158,1159,1160,1161,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1283,1284,1285,1286,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1298,1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1328,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1367,1368,1369,1370,1371,1372,1373,1374,1375,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,1416,1417,1418,1419,1420,1421,1422,1423,1424,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434,1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447,1448,1449,1450,1451,1452,1453,1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1476,1477,1478,1479,1480,1481,1482,1483,1484,1485,1486,1487,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,1515,1516,1517,1518,1519,1520,1521,1522,1523,1524,1525,1526,1527,1528,1529,1530,1531,1532,1533,1534,1535,1536,1537,1538,1539,1540,1541,1542,1543,1544,1545,1546,1547,1548,1549,1550,1551,1552,1553,1554,1555,1556,1557,1558,1559,1560,1561,1562,1563,1564,1565,1566,1567,1568,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1611,1612,1613,1614,1615,1616,1617,1618,1619,1620,1621,1622,1623,1624,1625,1626,1627,1628,1629,1630,1631,1632,1633,1634,1635,1636,1637,1638,1639,1640,1641,1642,1643,1644,1645,1646,1647,1648,1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659,1660,1661,1662,1663,1664,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674,1675,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689,1690,1691,1692,1693,1694,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704,1705,1706,1707,1708,1709,1710,1711,1712,1713,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1813,1814,1815,1816,1817,1818,1819,1820,1821,1822,1823,1824,1825,1826,1827,1828,1829,1830,1831,1832,1833,1834,1835,1836,1837,1838,1839,1840,1841,1842,1843,1844,1845,1846,1847,1848,1849,1850,1851,1852,1853,1854,1855,1856,1857,1858,1859,1860,1861,1862,1863,1864,1865,1866,1867,1868,1869,1870,1871,1872,1873,1874,1875,1876,1877,1878,1879,1880,1881,1882,1883,1884,1885,1886,1887,1888,1889,1890,1891,1892,1893,1894,1895,1896,1897,1898,1899,1900,1901,1902,1903,1904,1905,1906,1907,1908,1909,1910,1911,1912,1913,1914,1915,1916,1917,1918,1919,1920,1921,1922,1923,1924,1925,1926,1927,1928,1929,1930,1931,1932,1933,1934,1935,1936,1937,1938,1939,1940,1941,1942,1943,1944,1945,1946,1947,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1958,1959,1960,1961,1962,1963,1964,1965,1966,1967,1968,1969,1970,1971,1972,1973,1974,1975,1976,1977,1978,1979,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022,2023,2024,2025,2026,2027,2028,2029,2030,2031,2032,2033,2034,2035,2036,2037,2038,2039,2040,2041,2042,2043,2044,2045,2046,2047,2048,2049,2050,2051,2052,2053,2054,2055,2056,2057,2058,2059,2060,2061,2062,2063,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2075,2076,2077,2078,2079,2080,2081,2082,2083,2084,2085,2086,2087,2088,2089,2090,2091,2092,2093,2094,2095,2096,2097,2098,2099,2100,2101,2102,2103,2104,2105,2106,2107,2108,2109,2110,2111,2112,2113,2114,2115,2116,2117,2118]
-] \ No newline at end of file
diff --git a/3rdparty/jsoncpp/test/data/test_basic_01.expected b/3rdparty/jsoncpp/test/data/test_basic_01.expected
deleted file mode 100644
index d761fce1cc0..00000000000
--- a/3rdparty/jsoncpp/test/data/test_basic_01.expected
+++ /dev/null
@@ -1 +0,0 @@
-.=123456789
diff --git a/3rdparty/jsoncpp/test/data/test_basic_01.json b/3rdparty/jsoncpp/test/data/test_basic_01.json
deleted file mode 100644
index 11f11f9be3b..00000000000
--- a/3rdparty/jsoncpp/test/data/test_basic_01.json
+++ /dev/null
@@ -1 +0,0 @@
-0123456789
diff --git a/3rdparty/jsoncpp/test/data/test_basic_02.expected b/3rdparty/jsoncpp/test/data/test_basic_02.expected
deleted file mode 100644
index 650e37cbaaf..00000000000
--- a/3rdparty/jsoncpp/test/data/test_basic_02.expected
+++ /dev/null
@@ -1 +0,0 @@
-.=-123456789
diff --git a/3rdparty/jsoncpp/test/data/test_basic_02.json b/3rdparty/jsoncpp/test/data/test_basic_02.json
deleted file mode 100644
index bf11bceac74..00000000000
--- a/3rdparty/jsoncpp/test/data/test_basic_02.json
+++ /dev/null
@@ -1 +0,0 @@
--0123456789
diff --git a/3rdparty/jsoncpp/test/data/test_basic_03.expected b/3rdparty/jsoncpp/test/data/test_basic_03.expected
deleted file mode 100644
index 1da2d395b8e..00000000000
--- a/3rdparty/jsoncpp/test/data/test_basic_03.expected
+++ /dev/null
@@ -1,3 +0,0 @@
-.=1.2345678
-
-
diff --git a/3rdparty/jsoncpp/test/data/test_basic_03.json b/3rdparty/jsoncpp/test/data/test_basic_03.json
deleted file mode 100644
index a92b6bd28b5..00000000000
--- a/3rdparty/jsoncpp/test/data/test_basic_03.json
+++ /dev/null
@@ -1,3 +0,0 @@
-1.2345678
-
-
diff --git a/3rdparty/jsoncpp/test/data/test_basic_04.expected b/3rdparty/jsoncpp/test/data/test_basic_04.expected
deleted file mode 100644
index 013f424f932..00000000000
--- a/3rdparty/jsoncpp/test/data/test_basic_04.expected
+++ /dev/null
@@ -1,2 +0,0 @@
-.="abcdef"
-
diff --git a/3rdparty/jsoncpp/test/data/test_basic_04.json b/3rdparty/jsoncpp/test/data/test_basic_04.json
deleted file mode 100644
index 17eeb99e0b0..00000000000
--- a/3rdparty/jsoncpp/test/data/test_basic_04.json
+++ /dev/null
@@ -1,2 +0,0 @@
-"abcdef"
-
diff --git a/3rdparty/jsoncpp/test/data/test_basic_05.expected b/3rdparty/jsoncpp/test/data/test_basic_05.expected
deleted file mode 100644
index c8db822e584..00000000000
--- a/3rdparty/jsoncpp/test/data/test_basic_05.expected
+++ /dev/null
@@ -1,2 +0,0 @@
-.=null
-
diff --git a/3rdparty/jsoncpp/test/data/test_basic_05.json b/3rdparty/jsoncpp/test/data/test_basic_05.json
deleted file mode 100644
index d0aaea2126b..00000000000
--- a/3rdparty/jsoncpp/test/data/test_basic_05.json
+++ /dev/null
@@ -1,2 +0,0 @@
-null
-
diff --git a/3rdparty/jsoncpp/test/data/test_basic_06.expected b/3rdparty/jsoncpp/test/data/test_basic_06.expected
deleted file mode 100644
index 49be55a9654..00000000000
--- a/3rdparty/jsoncpp/test/data/test_basic_06.expected
+++ /dev/null
@@ -1,2 +0,0 @@
-.=true
-
diff --git a/3rdparty/jsoncpp/test/data/test_basic_06.json b/3rdparty/jsoncpp/test/data/test_basic_06.json
deleted file mode 100644
index 7eead1ee75f..00000000000
--- a/3rdparty/jsoncpp/test/data/test_basic_06.json
+++ /dev/null
@@ -1,2 +0,0 @@
-true
-
diff --git a/3rdparty/jsoncpp/test/data/test_basic_07.expected b/3rdparty/jsoncpp/test/data/test_basic_07.expected
deleted file mode 100644
index fe55a6a8546..00000000000
--- a/3rdparty/jsoncpp/test/data/test_basic_07.expected
+++ /dev/null
@@ -1,2 +0,0 @@
-.=false
-
diff --git a/3rdparty/jsoncpp/test/data/test_basic_07.json b/3rdparty/jsoncpp/test/data/test_basic_07.json
deleted file mode 100644
index a864bc487d4..00000000000
--- a/3rdparty/jsoncpp/test/data/test_basic_07.json
+++ /dev/null
@@ -1,2 +0,0 @@
-false
-
diff --git a/3rdparty/jsoncpp/test/data/test_basic_08.expected b/3rdparty/jsoncpp/test/data/test_basic_08.expected
deleted file mode 100644
index caf5352a113..00000000000
--- a/3rdparty/jsoncpp/test/data/test_basic_08.expected
+++ /dev/null
@@ -1,3 +0,0 @@
-// C++ style comment
-.=null
-
diff --git a/3rdparty/jsoncpp/test/data/test_basic_08.json b/3rdparty/jsoncpp/test/data/test_basic_08.json
deleted file mode 100644
index fd78837c0c8..00000000000
--- a/3rdparty/jsoncpp/test/data/test_basic_08.json
+++ /dev/null
@@ -1,3 +0,0 @@
-// C++ style comment
-null
-
diff --git a/3rdparty/jsoncpp/test/data/test_basic_09.expected b/3rdparty/jsoncpp/test/data/test_basic_09.expected
deleted file mode 100644
index 8b129da42e4..00000000000
--- a/3rdparty/jsoncpp/test/data/test_basic_09.expected
+++ /dev/null
@@ -1,4 +0,0 @@
-/* C style comment
- */
-.=null
-
diff --git a/3rdparty/jsoncpp/test/data/test_basic_09.json b/3rdparty/jsoncpp/test/data/test_basic_09.json
deleted file mode 100644
index fc95f0f514e..00000000000
--- a/3rdparty/jsoncpp/test/data/test_basic_09.json
+++ /dev/null
@@ -1,4 +0,0 @@
-/* C style comment
- */
-null
-
diff --git a/3rdparty/jsoncpp/test/data/test_comment_00.expected b/3rdparty/jsoncpp/test/data/test_comment_00.expected
deleted file mode 100644
index 284a797d714..00000000000
--- a/3rdparty/jsoncpp/test/data/test_comment_00.expected
+++ /dev/null
@@ -1,4 +0,0 @@
-// Comment for array
-.=[]
-// Comment within array
-.[0]="one-element"
diff --git a/3rdparty/jsoncpp/test/data/test_comment_00.json b/3rdparty/jsoncpp/test/data/test_comment_00.json
deleted file mode 100644
index 4df577a8ae2..00000000000
--- a/3rdparty/jsoncpp/test/data/test_comment_00.json
+++ /dev/null
@@ -1,5 +0,0 @@
-// Comment for array
-[
- // Comment within array
- "one-element"
-]
diff --git a/3rdparty/jsoncpp/test/data/test_comment_01.expected b/3rdparty/jsoncpp/test/data/test_comment_01.expected
deleted file mode 100644
index 1ed01ba100c..00000000000
--- a/3rdparty/jsoncpp/test/data/test_comment_01.expected
+++ /dev/null
@@ -1,10 +0,0 @@
-.={}
-// Comment for array
-.test=[]
-// Comment within array
-.test[0]={}
-.test[0].a="aaa"
-.test[1]={}
-.test[1].b="bbb"
-.test[2]={}
-.test[2].c="ccc"
diff --git a/3rdparty/jsoncpp/test/data/test_comment_01.json b/3rdparty/jsoncpp/test/data/test_comment_01.json
deleted file mode 100644
index 6defe400404..00000000000
--- a/3rdparty/jsoncpp/test/data/test_comment_01.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "test":
- // Comment for array
- [
- // Comment within array
- { "a" : "aaa" }, // Comment for a
- { "b" : "bbb" }, // Comment for b
- { "c" : "ccc" } // Comment for c
- ]
-}
diff --git a/3rdparty/jsoncpp/test/data/test_comment_02.expected b/3rdparty/jsoncpp/test/data/test_comment_02.expected
deleted file mode 100644
index 8986dbac05e..00000000000
--- a/3rdparty/jsoncpp/test/data/test_comment_02.expected
+++ /dev/null
@@ -1,23 +0,0 @@
-.={}
-/* C-style comment
-
- C-style-2 comment */
-.c-test={}
-.c-test.a=1
-/* Internal comment c-style */
-.c-test.b=2
-// C++-style comment
-.cpp-test={}
-// Multiline comment cpp-style
-// Second line
-.cpp-test.c=3
-// Comment before double
-.cpp-test.d=4.1
-// Comment before string
-.cpp-test.e="e-string"
-// Comment before true
-.cpp-test.f=true
-// Comment before false
-.cpp-test.g=false
-// Comment before null
-.cpp-test.h=null
diff --git a/3rdparty/jsoncpp/test/data/test_comment_02.json b/3rdparty/jsoncpp/test/data/test_comment_02.json
deleted file mode 100644
index f5042e0dd68..00000000000
--- a/3rdparty/jsoncpp/test/data/test_comment_02.json
+++ /dev/null
@@ -1,26 +0,0 @@
-{
- /* C-style comment
-
- C-style-2 comment */
- "c-test" : {
- "a" : 1,
- /* Internal comment c-style */
- "b" : 2
- },
- // C++-style comment
- "cpp-test" : {
- // Multiline comment cpp-style
- // Second line
- "c" : 3,
- // Comment before double
- "d" : 4.1,
- // Comment before string
- "e" : "e-string",
- // Comment before true
- "f" : true,
- // Comment before false
- "g" : false,
- // Comment before null
- "h" : null
- }
-}
diff --git a/3rdparty/jsoncpp/test/data/test_complex_01.expected b/3rdparty/jsoncpp/test/data/test_complex_01.expected
deleted file mode 100644
index 7573c8812d9..00000000000
--- a/3rdparty/jsoncpp/test/data/test_complex_01.expected
+++ /dev/null
@@ -1,20 +0,0 @@
-.={}
-.attribute=[]
-.attribute[0]="random"
-.attribute[1]="short"
-.attribute[2]="bold"
-.attribute[3]=12
-.attribute[4]={}
-.attribute[4].height=7
-.attribute[4].width=64
-.count=1234
-.name={}
-.name.aka="T.E.S.T."
-.name.id=123987
-.test={}
-.test.1={}
-.test.1.2={}
-.test.1.2.3={}
-.test.1.2.3.coord=[]
-.test.1.2.3.coord[0]=1
-.test.1.2.3.coord[1]=2
diff --git a/3rdparty/jsoncpp/test/data/test_complex_01.json b/3rdparty/jsoncpp/test/data/test_complex_01.json
deleted file mode 100644
index cc0f30f5c34..00000000000
--- a/3rdparty/jsoncpp/test/data/test_complex_01.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "count" : 1234,
- "name" : { "aka" : "T.E.S.T.", "id" : 123987 },
- "attribute" : [
- "random",
- "short",
- "bold",
- 12,
- { "height" : 7, "width" : 64 }
- ],
- "test": { "1" :
- { "2" :
- { "3" : { "coord" : [ 1,2] }
- }
- }
- }
-}
diff --git a/3rdparty/jsoncpp/test/data/test_integer_01.expected b/3rdparty/jsoncpp/test/data/test_integer_01.expected
deleted file mode 100644
index 463e149de87..00000000000
--- a/3rdparty/jsoncpp/test/data/test_integer_01.expected
+++ /dev/null
@@ -1,2 +0,0 @@
-// Max signed integer
-.=2147483647
diff --git a/3rdparty/jsoncpp/test/data/test_integer_01.json b/3rdparty/jsoncpp/test/data/test_integer_01.json
deleted file mode 100644
index 5ab12ffee41..00000000000
--- a/3rdparty/jsoncpp/test/data/test_integer_01.json
+++ /dev/null
@@ -1,2 +0,0 @@
-// Max signed integer
-2147483647
diff --git a/3rdparty/jsoncpp/test/data/test_integer_02.expected b/3rdparty/jsoncpp/test/data/test_integer_02.expected
deleted file mode 100644
index 0773e0851a4..00000000000
--- a/3rdparty/jsoncpp/test/data/test_integer_02.expected
+++ /dev/null
@@ -1,2 +0,0 @@
-// Min signed integer
-.=-2147483648
diff --git a/3rdparty/jsoncpp/test/data/test_integer_02.json b/3rdparty/jsoncpp/test/data/test_integer_02.json
deleted file mode 100644
index 056c8500657..00000000000
--- a/3rdparty/jsoncpp/test/data/test_integer_02.json
+++ /dev/null
@@ -1,2 +0,0 @@
-// Min signed integer
--2147483648
diff --git a/3rdparty/jsoncpp/test/data/test_integer_03.expected b/3rdparty/jsoncpp/test/data/test_integer_03.expected
deleted file mode 100644
index c7efff799eb..00000000000
--- a/3rdparty/jsoncpp/test/data/test_integer_03.expected
+++ /dev/null
@@ -1,2 +0,0 @@
-// Max unsigned integer
-.=4294967295
diff --git a/3rdparty/jsoncpp/test/data/test_integer_03.json b/3rdparty/jsoncpp/test/data/test_integer_03.json
deleted file mode 100644
index 12ef3fbb894..00000000000
--- a/3rdparty/jsoncpp/test/data/test_integer_03.json
+++ /dev/null
@@ -1,2 +0,0 @@
-// Max unsigned integer
-4294967295
diff --git a/3rdparty/jsoncpp/test/data/test_integer_04.expected b/3rdparty/jsoncpp/test/data/test_integer_04.expected
deleted file mode 100644
index 39f8567040f..00000000000
--- a/3rdparty/jsoncpp/test/data/test_integer_04.expected
+++ /dev/null
@@ -1,3 +0,0 @@
-// Min unsigned integer
-.=0
-
diff --git a/3rdparty/jsoncpp/test/data/test_integer_04.json b/3rdparty/jsoncpp/test/data/test_integer_04.json
deleted file mode 100644
index bf814994533..00000000000
--- a/3rdparty/jsoncpp/test/data/test_integer_04.json
+++ /dev/null
@@ -1,3 +0,0 @@
-// Min unsigned integer
-0
-
diff --git a/3rdparty/jsoncpp/test/data/test_integer_05.expected b/3rdparty/jsoncpp/test/data/test_integer_05.expected
deleted file mode 100644
index 0caea9d3fd3..00000000000
--- a/3rdparty/jsoncpp/test/data/test_integer_05.expected
+++ /dev/null
@@ -1,2 +0,0 @@
-.=1
-
diff --git a/3rdparty/jsoncpp/test/data/test_integer_05.json b/3rdparty/jsoncpp/test/data/test_integer_05.json
deleted file mode 100644
index d474e1b4d62..00000000000
--- a/3rdparty/jsoncpp/test/data/test_integer_05.json
+++ /dev/null
@@ -1,2 +0,0 @@
-1
-
diff --git a/3rdparty/jsoncpp/test/data/test_integer_06_64bits.expected b/3rdparty/jsoncpp/test/data/test_integer_06_64bits.expected
deleted file mode 100644
index 131b085ff56..00000000000
--- a/3rdparty/jsoncpp/test/data/test_integer_06_64bits.expected
+++ /dev/null
@@ -1 +0,0 @@
-.=9223372036854775808
diff --git a/3rdparty/jsoncpp/test/data/test_integer_06_64bits.json b/3rdparty/jsoncpp/test/data/test_integer_06_64bits.json
deleted file mode 100644
index cfedfe5e809..00000000000
--- a/3rdparty/jsoncpp/test/data/test_integer_06_64bits.json
+++ /dev/null
@@ -1,2 +0,0 @@
-9223372036854775808
-
diff --git a/3rdparty/jsoncpp/test/data/test_integer_07_64bits.expected b/3rdparty/jsoncpp/test/data/test_integer_07_64bits.expected
deleted file mode 100644
index c8524a32c7a..00000000000
--- a/3rdparty/jsoncpp/test/data/test_integer_07_64bits.expected
+++ /dev/null
@@ -1 +0,0 @@
-.=-9223372036854775808
diff --git a/3rdparty/jsoncpp/test/data/test_integer_07_64bits.json b/3rdparty/jsoncpp/test/data/test_integer_07_64bits.json
deleted file mode 100644
index a964ad2ed25..00000000000
--- a/3rdparty/jsoncpp/test/data/test_integer_07_64bits.json
+++ /dev/null
@@ -1,2 +0,0 @@
--9223372036854775808
-
diff --git a/3rdparty/jsoncpp/test/data/test_integer_08_64bits.expected b/3rdparty/jsoncpp/test/data/test_integer_08_64bits.expected
deleted file mode 100644
index 321bba5a738..00000000000
--- a/3rdparty/jsoncpp/test/data/test_integer_08_64bits.expected
+++ /dev/null
@@ -1 +0,0 @@
-.=18446744073709551615
diff --git a/3rdparty/jsoncpp/test/data/test_integer_08_64bits.json b/3rdparty/jsoncpp/test/data/test_integer_08_64bits.json
deleted file mode 100644
index 4c15a01b4a9..00000000000
--- a/3rdparty/jsoncpp/test/data/test_integer_08_64bits.json
+++ /dev/null
@@ -1,2 +0,0 @@
-18446744073709551615
-
diff --git a/3rdparty/jsoncpp/test/data/test_large_01.expected b/3rdparty/jsoncpp/test/data/test_large_01.expected
deleted file mode 100644
index ee2fafc010e..00000000000
--- a/3rdparty/jsoncpp/test/data/test_large_01.expected
+++ /dev/null
@@ -1,2122 +0,0 @@
-.=[]
-.[0]=[]
-.[0][0]="A"
-.[0][1]=0
-.[0][2]=1
-.[0][3]=2
-.[0][4]=3
-.[0][5]=4
-.[0][6]=5
-.[0][7]=6
-.[0][8]=7
-.[0][9]=8
-.[0][10]=9
-.[0][11]=10
-.[0][12]=11
-.[0][13]=12
-.[0][14]=13
-.[0][15]=14
-.[0][16]=15
-.[0][17]=16
-.[0][18]=17
-.[0][19]=18
-.[0][20]=19
-.[0][21]=20
-.[0][22]=21
-.[0][23]=22
-.[0][24]=23
-.[0][25]=24
-.[0][26]=25
-.[0][27]=26
-.[0][28]=27
-.[0][29]=28
-.[0][30]=29
-.[0][31]=30
-.[0][32]=31
-.[0][33]=32
-.[0][34]=33
-.[0][35]=34
-.[0][36]=35
-.[0][37]=36
-.[0][38]=37
-.[0][39]=38
-.[0][40]=39
-.[0][41]=40
-.[0][42]=41
-.[0][43]=42
-.[0][44]=43
-.[0][45]=44
-.[0][46]=45
-.[0][47]=46
-.[0][48]=47
-.[0][49]=48
-.[0][50]=49
-.[0][51]=50
-.[0][52]=51
-.[0][53]=52
-.[0][54]=53
-.[0][55]=54
-.[0][56]=55
-.[0][57]=56
-.[0][58]=57
-.[0][59]=58
-.[0][60]=59
-.[0][61]=60
-.[0][62]=61
-.[0][63]=62
-.[0][64]=63
-.[0][65]=64
-.[0][66]=65
-.[0][67]=66
-.[0][68]=67
-.[0][69]=68
-.[0][70]=69
-.[0][71]=70
-.[0][72]=71
-.[0][73]=72
-.[0][74]=73
-.[0][75]=74
-.[0][76]=75
-.[0][77]=76
-.[0][78]=77
-.[0][79]=78
-.[0][80]=79
-.[0][81]=80
-.[0][82]=81
-.[0][83]=82
-.[0][84]=83
-.[0][85]=84
-.[0][86]=85
-.[0][87]=86
-.[0][88]=87
-.[0][89]=88
-.[0][90]=89
-.[0][91]=90
-.[0][92]=91
-.[0][93]=92
-.[0][94]=93
-.[0][95]=94
-.[0][96]=95
-.[0][97]=96
-.[0][98]=97
-.[0][99]=98
-.[0][100]=99
-.[0][101]=100
-.[0][102]=101
-.[0][103]=102
-.[0][104]=103
-.[0][105]=104
-.[0][106]=105
-.[0][107]=106
-.[0][108]=107
-.[0][109]=108
-.[0][110]=109
-.[0][111]=110
-.[0][112]=111
-.[0][113]=112
-.[0][114]=113
-.[0][115]=114
-.[0][116]=115
-.[0][117]=116
-.[0][118]=117
-.[0][119]=118
-.[0][120]=119
-.[0][121]=120
-.[0][122]=121
-.[0][123]=122
-.[0][124]=123
-.[0][125]=124
-.[0][126]=125
-.[0][127]=126
-.[0][128]=127
-.[0][129]=128
-.[0][130]=129
-.[0][131]=130
-.[0][132]=131
-.[0][133]=132
-.[0][134]=133
-.[0][135]=134
-.[0][136]=135
-.[0][137]=136
-.[0][138]=137
-.[0][139]=138
-.[0][140]=139
-.[0][141]=140
-.[0][142]=141
-.[0][143]=142
-.[0][144]=143
-.[0][145]=144
-.[0][146]=145
-.[0][147]=146
-.[0][148]=147
-.[0][149]=148
-.[0][150]=149
-.[0][151]=150
-.[0][152]=151
-.[0][153]=152
-.[0][154]=153
-.[0][155]=154
-.[0][156]=155
-.[0][157]=156
-.[0][158]=157
-.[0][159]=158
-.[0][160]=159
-.[0][161]=160
-.[0][162]=161
-.[0][163]=162
-.[0][164]=163
-.[0][165]=164
-.[0][166]=165
-.[0][167]=166
-.[0][168]=167
-.[0][169]=168
-.[0][170]=169
-.[0][171]=170
-.[0][172]=171
-.[0][173]=172
-.[0][174]=173
-.[0][175]=174
-.[0][176]=175
-.[0][177]=176
-.[0][178]=177
-.[0][179]=178
-.[0][180]=179
-.[0][181]=180
-.[0][182]=181
-.[0][183]=182
-.[0][184]=183
-.[0][185]=184
-.[0][186]=185
-.[0][187]=186
-.[0][188]=187
-.[0][189]=188
-.[0][190]=189
-.[0][191]=190
-.[0][192]=191
-.[0][193]=192
-.[0][194]=193
-.[0][195]=194
-.[0][196]=195
-.[0][197]=196
-.[0][198]=197
-.[0][199]=198
-.[0][200]=199
-.[0][201]=200
-.[0][202]=201
-.[0][203]=202
-.[0][204]=203
-.[0][205]=204
-.[0][206]=205
-.[0][207]=206
-.[0][208]=207
-.[0][209]=208
-.[0][210]=209
-.[0][211]=210
-.[0][212]=211
-.[0][213]=212
-.[0][214]=213
-.[0][215]=214
-.[0][216]=215
-.[0][217]=216
-.[0][218]=217
-.[0][219]=218
-.[0][220]=219
-.[0][221]=220
-.[0][222]=221
-.[0][223]=222
-.[0][224]=223
-.[0][225]=224
-.[0][226]=225
-.[0][227]=226
-.[0][228]=227
-.[0][229]=228
-.[0][230]=229
-.[0][231]=230
-.[0][232]=231
-.[0][233]=232
-.[0][234]=233
-.[0][235]=234
-.[0][236]=235
-.[0][237]=236
-.[0][238]=237
-.[0][239]=238
-.[0][240]=239
-.[0][241]=240
-.[0][242]=241
-.[0][243]=242
-.[0][244]=243
-.[0][245]=244
-.[0][246]=245
-.[0][247]=246
-.[0][248]=247
-.[0][249]=248
-.[0][250]=249
-.[0][251]=250
-.[0][252]=251
-.[0][253]=252
-.[0][254]=253
-.[0][255]=254
-.[0][256]=255
-.[0][257]=256
-.[0][258]=257
-.[0][259]=258
-.[0][260]=259
-.[0][261]=260
-.[0][262]=261
-.[0][263]=262
-.[0][264]=263
-.[0][265]=264
-.[0][266]=265
-.[0][267]=266
-.[0][268]=267
-.[0][269]=268
-.[0][270]=269
-.[0][271]=270
-.[0][272]=271
-.[0][273]=272
-.[0][274]=273
-.[0][275]=274
-.[0][276]=275
-.[0][277]=276
-.[0][278]=277
-.[0][279]=278
-.[0][280]=279
-.[0][281]=280
-.[0][282]=281
-.[0][283]=282
-.[0][284]=283
-.[0][285]=284
-.[0][286]=285
-.[0][287]=286
-.[0][288]=287
-.[0][289]=288
-.[0][290]=289
-.[0][291]=290
-.[0][292]=291
-.[0][293]=292
-.[0][294]=293
-.[0][295]=294
-.[0][296]=295
-.[0][297]=296
-.[0][298]=297
-.[0][299]=298
-.[0][300]=299
-.[0][301]=300
-.[0][302]=301
-.[0][303]=302
-.[0][304]=303
-.[0][305]=304
-.[0][306]=305
-.[0][307]=306
-.[0][308]=307
-.[0][309]=308
-.[0][310]=309
-.[0][311]=310
-.[0][312]=311
-.[0][313]=312
-.[0][314]=313
-.[0][315]=314
-.[0][316]=315
-.[0][317]=316
-.[0][318]=317
-.[0][319]=318
-.[0][320]=319
-.[0][321]=320
-.[0][322]=321
-.[0][323]=322
-.[0][324]=323
-.[0][325]=324
-.[0][326]=325
-.[0][327]=326
-.[0][328]=327
-.[0][329]=328
-.[0][330]=329
-.[0][331]=330
-.[0][332]=331
-.[0][333]=332
-.[0][334]=333
-.[0][335]=334
-.[0][336]=335
-.[0][337]=336
-.[0][338]=337
-.[0][339]=338
-.[0][340]=339
-.[0][341]=340
-.[0][342]=341
-.[0][343]=342
-.[0][344]=343
-.[0][345]=344
-.[0][346]=345
-.[0][347]=346
-.[0][348]=347
-.[0][349]=348
-.[0][350]=349
-.[0][351]=350
-.[0][352]=351
-.[0][353]=352
-.[0][354]=353
-.[0][355]=354
-.[0][356]=355
-.[0][357]=356
-.[0][358]=357
-.[0][359]=358
-.[0][360]=359
-.[0][361]=360
-.[0][362]=361
-.[0][363]=362
-.[0][364]=363
-.[0][365]=364
-.[0][366]=365
-.[0][367]=366
-.[0][368]=367
-.[0][369]=368
-.[0][370]=369
-.[0][371]=370
-.[0][372]=371
-.[0][373]=372
-.[0][374]=373
-.[0][375]=374
-.[0][376]=375
-.[0][377]=376
-.[0][378]=377
-.[0][379]=378
-.[0][380]=379
-.[0][381]=380
-.[0][382]=381
-.[0][383]=382
-.[0][384]=383
-.[0][385]=384
-.[0][386]=385
-.[0][387]=386
-.[0][388]=387
-.[0][389]=388
-.[0][390]=389
-.[0][391]=390
-.[0][392]=391
-.[0][393]=392
-.[0][394]=393
-.[0][395]=394
-.[0][396]=395
-.[0][397]=396
-.[0][398]=397
-.[0][399]=398
-.[0][400]=399
-.[0][401]=400
-.[0][402]=401
-.[0][403]=402
-.[0][404]=403
-.[0][405]=404
-.[0][406]=405
-.[0][407]=406
-.[0][408]=407
-.[0][409]=408
-.[0][410]=409
-.[0][411]=410
-.[0][412]=411
-.[0][413]=412
-.[0][414]=413
-.[0][415]=414
-.[0][416]=415
-.[0][417]=416
-.[0][418]=417
-.[0][419]=418
-.[0][420]=419
-.[0][421]=420
-.[0][422]=421
-.[0][423]=422
-.[0][424]=423
-.[0][425]=424
-.[0][426]=425
-.[0][427]=426
-.[0][428]=427
-.[0][429]=428
-.[0][430]=429
-.[0][431]=430
-.[0][432]=431
-.[0][433]=432
-.[0][434]=433
-.[0][435]=434
-.[0][436]=435
-.[0][437]=436
-.[0][438]=437
-.[0][439]=438
-.[0][440]=439
-.[0][441]=440
-.[0][442]=441
-.[0][443]=442
-.[0][444]=443
-.[0][445]=444
-.[0][446]=445
-.[0][447]=446
-.[0][448]=447
-.[0][449]=448
-.[0][450]=449
-.[0][451]=450
-.[0][452]=451
-.[0][453]=452
-.[0][454]=453
-.[0][455]=454
-.[0][456]=455
-.[0][457]=456
-.[0][458]=457
-.[0][459]=458
-.[0][460]=459
-.[0][461]=460
-.[0][462]=461
-.[0][463]=462
-.[0][464]=463
-.[0][465]=464
-.[0][466]=465
-.[0][467]=466
-.[0][468]=467
-.[0][469]=468
-.[0][470]=469
-.[0][471]=470
-.[0][472]=471
-.[0][473]=472
-.[0][474]=473
-.[0][475]=474
-.[0][476]=475
-.[0][477]=476
-.[0][478]=477
-.[0][479]=478
-.[0][480]=479
-.[0][481]=480
-.[0][482]=481
-.[0][483]=482
-.[0][484]=483
-.[0][485]=484
-.[0][486]=485
-.[0][487]=486
-.[0][488]=487
-.[0][489]=488
-.[0][490]=489
-.[0][491]=490
-.[0][492]=491
-.[0][493]=492
-.[0][494]=493
-.[0][495]=494
-.[0][496]=495
-.[0][497]=496
-.[0][498]=497
-.[0][499]=498
-.[0][500]=499
-.[0][501]=500
-.[0][502]=501
-.[0][503]=502
-.[0][504]=503
-.[0][505]=504
-.[0][506]=505
-.[0][507]=506
-.[0][508]=507
-.[0][509]=508
-.[0][510]=509
-.[0][511]=510
-.[0][512]=511
-.[0][513]=512
-.[0][514]=513
-.[0][515]=514
-.[0][516]=515
-.[0][517]=516
-.[0][518]=517
-.[0][519]=518
-.[0][520]=519
-.[0][521]=520
-.[0][522]=521
-.[0][523]=522
-.[0][524]=523
-.[0][525]=524
-.[0][526]=525
-.[0][527]=526
-.[0][528]=527
-.[0][529]=528
-.[0][530]=529
-.[0][531]=530
-.[0][532]=531
-.[0][533]=532
-.[0][534]=533
-.[0][535]=534
-.[0][536]=535
-.[0][537]=536
-.[0][538]=537
-.[0][539]=538
-.[0][540]=539
-.[0][541]=540
-.[0][542]=541
-.[0][543]=542
-.[0][544]=543
-.[0][545]=544
-.[0][546]=545
-.[0][547]=546
-.[0][548]=547
-.[0][549]=548
-.[0][550]=549
-.[0][551]=550
-.[0][552]=551
-.[0][553]=552
-.[0][554]=553
-.[0][555]=554
-.[0][556]=555
-.[0][557]=556
-.[0][558]=557
-.[0][559]=558
-.[0][560]=559
-.[0][561]=560
-.[0][562]=561
-.[0][563]=562
-.[0][564]=563
-.[0][565]=564
-.[0][566]=565
-.[0][567]=566
-.[0][568]=567
-.[0][569]=568
-.[0][570]=569
-.[0][571]=570
-.[0][572]=571
-.[0][573]=572
-.[0][574]=573
-.[0][575]=574
-.[0][576]=575
-.[0][577]=576
-.[0][578]=577
-.[0][579]=578
-.[0][580]=579
-.[0][581]=580
-.[0][582]=581
-.[0][583]=582
-.[0][584]=583
-.[0][585]=584
-.[0][586]=585
-.[0][587]=586
-.[0][588]=587
-.[0][589]=588
-.[0][590]=589
-.[0][591]=590
-.[0][592]=591
-.[0][593]=592
-.[0][594]=593
-.[0][595]=594
-.[0][596]=595
-.[0][597]=596
-.[0][598]=597
-.[0][599]=598
-.[0][600]=599
-.[0][601]=600
-.[0][602]=601
-.[0][603]=602
-.[0][604]=603
-.[0][605]=604
-.[0][606]=605
-.[0][607]=606
-.[0][608]=607
-.[0][609]=608
-.[0][610]=609
-.[0][611]=610
-.[0][612]=611
-.[0][613]=612
-.[0][614]=613
-.[0][615]=614
-.[0][616]=615
-.[0][617]=616
-.[0][618]=617
-.[0][619]=618
-.[0][620]=619
-.[0][621]=620
-.[0][622]=621
-.[0][623]=622
-.[0][624]=623
-.[0][625]=624
-.[0][626]=625
-.[0][627]=626
-.[0][628]=627
-.[0][629]=628
-.[0][630]=629
-.[0][631]=630
-.[0][632]=631
-.[0][633]=632
-.[0][634]=633
-.[0][635]=634
-.[0][636]=635
-.[0][637]=636
-.[0][638]=637
-.[0][639]=638
-.[0][640]=639
-.[0][641]=640
-.[0][642]=641
-.[0][643]=642
-.[0][644]=643
-.[0][645]=644
-.[0][646]=645
-.[0][647]=646
-.[0][648]=647
-.[0][649]=648
-.[0][650]=649
-.[0][651]=650
-.[0][652]=651
-.[0][653]=652
-.[0][654]=653
-.[0][655]=654
-.[0][656]=655
-.[0][657]=656
-.[0][658]=657
-.[0][659]=658
-.[0][660]=659
-.[0][661]=660
-.[0][662]=661
-.[0][663]=662
-.[0][664]=663
-.[0][665]=664
-.[0][666]=665
-.[0][667]=666
-.[0][668]=667
-.[0][669]=668
-.[0][670]=669
-.[0][671]=670
-.[0][672]=671
-.[0][673]=672
-.[0][674]=673
-.[0][675]=674
-.[0][676]=675
-.[0][677]=676
-.[0][678]=677
-.[0][679]=678
-.[0][680]=679
-.[0][681]=680
-.[0][682]=681
-.[0][683]=682
-.[0][684]=683
-.[0][685]=684
-.[0][686]=685
-.[0][687]=686
-.[0][688]=687
-.[0][689]=688
-.[0][690]=689
-.[0][691]=690
-.[0][692]=691
-.[0][693]=692
-.[0][694]=693
-.[0][695]=694
-.[0][696]=695
-.[0][697]=696
-.[0][698]=697
-.[0][699]=698
-.[0][700]=699
-.[0][701]=700
-.[0][702]=701
-.[0][703]=702
-.[0][704]=703
-.[0][705]=704
-.[0][706]=705
-.[0][707]=706
-.[0][708]=707
-.[0][709]=708
-.[0][710]=709
-.[0][711]=710
-.[0][712]=711
-.[0][713]=712
-.[0][714]=713
-.[0][715]=714
-.[0][716]=715
-.[0][717]=716
-.[0][718]=717
-.[0][719]=718
-.[0][720]=719
-.[0][721]=720
-.[0][722]=721
-.[0][723]=722
-.[0][724]=723
-.[0][725]=724
-.[0][726]=725
-.[0][727]=726
-.[0][728]=727
-.[0][729]=728
-.[0][730]=729
-.[0][731]=730
-.[0][732]=731
-.[0][733]=732
-.[0][734]=733
-.[0][735]=734
-.[0][736]=735
-.[0][737]=736
-.[0][738]=737
-.[0][739]=738
-.[0][740]=739
-.[0][741]=740
-.[0][742]=741
-.[0][743]=742
-.[0][744]=743
-.[0][745]=744
-.[0][746]=745
-.[0][747]=746
-.[0][748]=747
-.[0][749]=748
-.[0][750]=749
-.[0][751]=750
-.[0][752]=751
-.[0][753]=752
-.[0][754]=753
-.[0][755]=754
-.[0][756]=755
-.[0][757]=756
-.[0][758]=757
-.[0][759]=758
-.[0][760]=759
-.[0][761]=760
-.[0][762]=761
-.[0][763]=762
-.[0][764]=763
-.[0][765]=764
-.[0][766]=765
-.[0][767]=766
-.[0][768]=767
-.[0][769]=768
-.[0][770]=769
-.[0][771]=770
-.[0][772]=771
-.[0][773]=772
-.[0][774]=773
-.[0][775]=774
-.[0][776]=775
-.[0][777]=776
-.[0][778]=777
-.[0][779]=778
-.[0][780]=779
-.[0][781]=780
-.[0][782]=781
-.[0][783]=782
-.[0][784]=783
-.[0][785]=784
-.[0][786]=785
-.[0][787]=786
-.[0][788]=787
-.[0][789]=788
-.[0][790]=789
-.[0][791]=790
-.[0][792]=791
-.[0][793]=792
-.[0][794]=793
-.[0][795]=794
-.[0][796]=795
-.[0][797]=796
-.[0][798]=797
-.[0][799]=798
-.[0][800]=799
-.[0][801]=800
-.[0][802]=801
-.[0][803]=802
-.[0][804]=803
-.[0][805]=804
-.[0][806]=805
-.[0][807]=806
-.[0][808]=807
-.[0][809]=808
-.[0][810]=809
-.[0][811]=810
-.[0][812]=811
-.[0][813]=812
-.[0][814]=813
-.[0][815]=814
-.[0][816]=815
-.[0][817]=816
-.[0][818]=817
-.[0][819]=818
-.[0][820]=819
-.[0][821]=820
-.[0][822]=821
-.[0][823]=822
-.[0][824]=823
-.[0][825]=824
-.[0][826]=825
-.[0][827]=826
-.[0][828]=827
-.[0][829]=828
-.[0][830]=829
-.[0][831]=830
-.[0][832]=831
-.[0][833]=832
-.[0][834]=833
-.[0][835]=834
-.[0][836]=835
-.[0][837]=836
-.[0][838]=837
-.[0][839]=838
-.[0][840]=839
-.[0][841]=840
-.[0][842]=841
-.[0][843]=842
-.[0][844]=843
-.[0][845]=844
-.[0][846]=845
-.[0][847]=846
-.[0][848]=847
-.[0][849]=848
-.[0][850]=849
-.[0][851]=850
-.[0][852]=851
-.[0][853]=852
-.[0][854]=853
-.[0][855]=854
-.[0][856]=855
-.[0][857]=856
-.[0][858]=857
-.[0][859]=858
-.[0][860]=859
-.[0][861]=860
-.[0][862]=861
-.[0][863]=862
-.[0][864]=863
-.[0][865]=864
-.[0][866]=865
-.[0][867]=866
-.[0][868]=867
-.[0][869]=868
-.[0][870]=869
-.[0][871]=870
-.[0][872]=871
-.[0][873]=872
-.[0][874]=873
-.[0][875]=874
-.[0][876]=875
-.[0][877]=876
-.[0][878]=877
-.[0][879]=878
-.[0][880]=879
-.[0][881]=880
-.[0][882]=881
-.[0][883]=882
-.[0][884]=883
-.[0][885]=884
-.[0][886]=885
-.[0][887]=886
-.[0][888]=887
-.[0][889]=888
-.[0][890]=889
-.[0][891]=890
-.[0][892]=891
-.[0][893]=892
-.[0][894]=893
-.[0][895]=894
-.[0][896]=895
-.[0][897]=896
-.[0][898]=897
-.[0][899]=898
-.[0][900]=899
-.[0][901]=900
-.[0][902]=901
-.[0][903]=902
-.[0][904]=903
-.[0][905]=904
-.[0][906]=905
-.[0][907]=906
-.[0][908]=907
-.[0][909]=908
-.[0][910]=909
-.[0][911]=910
-.[0][912]=911
-.[0][913]=912
-.[0][914]=913
-.[0][915]=914
-.[0][916]=915
-.[0][917]=916
-.[0][918]=917
-.[0][919]=918
-.[0][920]=919
-.[0][921]=920
-.[0][922]=921
-.[0][923]=922
-.[0][924]=923
-.[0][925]=924
-.[0][926]=925
-.[0][927]=926
-.[0][928]=927
-.[0][929]=928
-.[0][930]=929
-.[0][931]=930
-.[0][932]=931
-.[0][933]=932
-.[0][934]=933
-.[0][935]=934
-.[0][936]=935
-.[0][937]=936
-.[0][938]=937
-.[0][939]=938
-.[0][940]=939
-.[0][941]=940
-.[0][942]=941
-.[0][943]=942
-.[0][944]=943
-.[0][945]=944
-.[0][946]=945
-.[0][947]=946
-.[0][948]=947
-.[0][949]=948
-.[0][950]=949
-.[0][951]=950
-.[0][952]=951
-.[0][953]=952
-.[0][954]=953
-.[0][955]=954
-.[0][956]=955
-.[0][957]=956
-.[0][958]=957
-.[0][959]=958
-.[0][960]=959
-.[0][961]=960
-.[0][962]=961
-.[0][963]=962
-.[0][964]=963
-.[0][965]=964
-.[0][966]=965
-.[0][967]=966
-.[0][968]=967
-.[0][969]=968
-.[0][970]=969
-.[0][971]=970
-.[0][972]=971
-.[0][973]=972
-.[0][974]=973
-.[0][975]=974
-.[0][976]=975
-.[0][977]=976
-.[0][978]=977
-.[0][979]=978
-.[0][980]=979
-.[0][981]=980
-.[0][982]=981
-.[0][983]=982
-.[0][984]=983
-.[0][985]=984
-.[0][986]=985
-.[0][987]=986
-.[0][988]=987
-.[0][989]=988
-.[0][990]=989
-.[0][991]=990
-.[0][992]=991
-.[0][993]=992
-.[0][994]=993
-.[0][995]=994
-.[0][996]=995
-.[0][997]=996
-.[0][998]=997
-.[0][999]=998
-.[0][1000]=999
-.[0][1001]=1000
-.[0][1002]=1001
-.[0][1003]=1002
-.[0][1004]=1003
-.[0][1005]=1004
-.[0][1006]=1005
-.[0][1007]=1006
-.[0][1008]=1007
-.[0][1009]=1008
-.[0][1010]=1009
-.[0][1011]=1010
-.[0][1012]=1011
-.[0][1013]=1012
-.[0][1014]=1013
-.[0][1015]=1014
-.[0][1016]=1015
-.[0][1017]=1016
-.[0][1018]=1017
-.[0][1019]=1018
-.[0][1020]=1019
-.[0][1021]=1020
-.[0][1022]=1021
-.[0][1023]=1022
-.[0][1024]=1023
-.[0][1025]=1024
-.[0][1026]=1025
-.[0][1027]=1026
-.[0][1028]=1027
-.[0][1029]=1028
-.[0][1030]=1029
-.[0][1031]=1030
-.[0][1032]=1031
-.[0][1033]=1032
-.[0][1034]=1033
-.[0][1035]=1034
-.[0][1036]=1035
-.[0][1037]=1036
-.[0][1038]=1037
-.[0][1039]=1038
-.[0][1040]=1039
-.[0][1041]=1040
-.[0][1042]=1041
-.[0][1043]=1042
-.[0][1044]=1043
-.[0][1045]=1044
-.[0][1046]=1045
-.[0][1047]=1046
-.[0][1048]=1047
-.[0][1049]=1048
-.[0][1050]=1049
-.[0][1051]=1050
-.[0][1052]=1051
-.[0][1053]=1052
-.[0][1054]=1053
-.[0][1055]=1054
-.[0][1056]=1055
-.[0][1057]=1056
-.[0][1058]=1057
-.[0][1059]=1058
-.[0][1060]=1059
-.[0][1061]=1060
-.[0][1062]=1061
-.[0][1063]=1062
-.[0][1064]=1063
-.[0][1065]=1064
-.[0][1066]=1065
-.[0][1067]=1066
-.[0][1068]=1067
-.[0][1069]=1068
-.[0][1070]=1069
-.[0][1071]=1070
-.[0][1072]=1071
-.[0][1073]=1072
-.[0][1074]=1073
-.[0][1075]=1074
-.[0][1076]=1075
-.[0][1077]=1076
-.[0][1078]=1077
-.[0][1079]=1078
-.[0][1080]=1079
-.[0][1081]=1080
-.[0][1082]=1081
-.[0][1083]=1082
-.[0][1084]=1083
-.[0][1085]=1084
-.[0][1086]=1085
-.[0][1087]=1086
-.[0][1088]=1087
-.[0][1089]=1088
-.[0][1090]=1089
-.[0][1091]=1090
-.[0][1092]=1091
-.[0][1093]=1092
-.[0][1094]=1093
-.[0][1095]=1094
-.[0][1096]=1095
-.[0][1097]=1096
-.[0][1098]=1097
-.[0][1099]=1098
-.[0][1100]=1099
-.[0][1101]=1100
-.[0][1102]=1101
-.[0][1103]=1102
-.[0][1104]=1103
-.[0][1105]=1104
-.[0][1106]=1105
-.[0][1107]=1106
-.[0][1108]=1107
-.[0][1109]=1108
-.[0][1110]=1109
-.[0][1111]=1110
-.[0][1112]=1111
-.[0][1113]=1112
-.[0][1114]=1113
-.[0][1115]=1114
-.[0][1116]=1115
-.[0][1117]=1116
-.[0][1118]=1117
-.[0][1119]=1118
-.[0][1120]=1119
-.[0][1121]=1120
-.[0][1122]=1121
-.[0][1123]=1122
-.[0][1124]=1123
-.[0][1125]=1124
-.[0][1126]=1125
-.[0][1127]=1126
-.[0][1128]=1127
-.[0][1129]=1128
-.[0][1130]=1129
-.[0][1131]=1130
-.[0][1132]=1131
-.[0][1133]=1132
-.[0][1134]=1133
-.[0][1135]=1134
-.[0][1136]=1135
-.[0][1137]=1136
-.[0][1138]=1137
-.[0][1139]=1138
-.[0][1140]=1139
-.[0][1141]=1140
-.[0][1142]=1141
-.[0][1143]=1142
-.[0][1144]=1143
-.[0][1145]=1144
-.[0][1146]=1145
-.[0][1147]=1146
-.[0][1148]=1147
-.[0][1149]=1148
-.[0][1150]=1149
-.[0][1151]=1150
-.[0][1152]=1151
-.[0][1153]=1152
-.[0][1154]=1153
-.[0][1155]=1154
-.[0][1156]=1155
-.[0][1157]=1156
-.[0][1158]=1157
-.[0][1159]=1158
-.[0][1160]=1159
-.[0][1161]=1160
-.[0][1162]=1161
-.[0][1163]=1162
-.[0][1164]=1163
-.[0][1165]=1164
-.[0][1166]=1165
-.[0][1167]=1166
-.[0][1168]=1167
-.[0][1169]=1168
-.[0][1170]=1169
-.[0][1171]=1170
-.[0][1172]=1171
-.[0][1173]=1172
-.[0][1174]=1173
-.[0][1175]=1174
-.[0][1176]=1175
-.[0][1177]=1176
-.[0][1178]=1177
-.[0][1179]=1178
-.[0][1180]=1179
-.[0][1181]=1180
-.[0][1182]=1181
-.[0][1183]=1182
-.[0][1184]=1183
-.[0][1185]=1184
-.[0][1186]=1185
-.[0][1187]=1186
-.[0][1188]=1187
-.[0][1189]=1188
-.[0][1190]=1189
-.[0][1191]=1190
-.[0][1192]=1191
-.[0][1193]=1192
-.[0][1194]=1193
-.[0][1195]=1194
-.[0][1196]=1195
-.[0][1197]=1196
-.[0][1198]=1197
-.[0][1199]=1198
-.[0][1200]=1199
-.[0][1201]=1200
-.[0][1202]=1201
-.[0][1203]=1202
-.[0][1204]=1203
-.[0][1205]=1204
-.[0][1206]=1205
-.[0][1207]=1206
-.[0][1208]=1207
-.[0][1209]=1208
-.[0][1210]=1209
-.[0][1211]=1210
-.[0][1212]=1211
-.[0][1213]=1212
-.[0][1214]=1213
-.[0][1215]=1214
-.[0][1216]=1215
-.[0][1217]=1216
-.[0][1218]=1217
-.[0][1219]=1218
-.[0][1220]=1219
-.[0][1221]=1220
-.[0][1222]=1221
-.[0][1223]=1222
-.[0][1224]=1223
-.[0][1225]=1224
-.[0][1226]=1225
-.[0][1227]=1226
-.[0][1228]=1227
-.[0][1229]=1228
-.[0][1230]=1229
-.[0][1231]=1230
-.[0][1232]=1231
-.[0][1233]=1232
-.[0][1234]=1233
-.[0][1235]=1234
-.[0][1236]=1235
-.[0][1237]=1236
-.[0][1238]=1237
-.[0][1239]=1238
-.[0][1240]=1239
-.[0][1241]=1240
-.[0][1242]=1241
-.[0][1243]=1242
-.[0][1244]=1243
-.[0][1245]=1244
-.[0][1246]=1245
-.[0][1247]=1246
-.[0][1248]=1247
-.[0][1249]=1248
-.[0][1250]=1249
-.[0][1251]=1250
-.[0][1252]=1251
-.[0][1253]=1252
-.[0][1254]=1253
-.[0][1255]=1254
-.[0][1256]=1255
-.[0][1257]=1256
-.[0][1258]=1257
-.[0][1259]=1258
-.[0][1260]=1259
-.[0][1261]=1260
-.[0][1262]=1261
-.[0][1263]=1262
-.[0][1264]=1263
-.[0][1265]=1264
-.[0][1266]=1265
-.[0][1267]=1266
-.[0][1268]=1267
-.[0][1269]=1268
-.[0][1270]=1269
-.[0][1271]=1270
-.[0][1272]=1271
-.[0][1273]=1272
-.[0][1274]=1273
-.[0][1275]=1274
-.[0][1276]=1275
-.[0][1277]=1276
-.[0][1278]=1277
-.[0][1279]=1278
-.[0][1280]=1279
-.[0][1281]=1280
-.[0][1282]=1281
-.[0][1283]=1282
-.[0][1284]=1283
-.[0][1285]=1284
-.[0][1286]=1285
-.[0][1287]=1286
-.[0][1288]=1287
-.[0][1289]=1288
-.[0][1290]=1289
-.[0][1291]=1290
-.[0][1292]=1291
-.[0][1293]=1292
-.[0][1294]=1293
-.[0][1295]=1294
-.[0][1296]=1295
-.[0][1297]=1296
-.[0][1298]=1297
-.[0][1299]=1298
-.[0][1300]=1299
-.[0][1301]=1300
-.[0][1302]=1301
-.[0][1303]=1302
-.[0][1304]=1303
-.[0][1305]=1304
-.[0][1306]=1305
-.[0][1307]=1306
-.[0][1308]=1307
-.[0][1309]=1308
-.[0][1310]=1309
-.[0][1311]=1310
-.[0][1312]=1311
-.[0][1313]=1312
-.[0][1314]=1313
-.[0][1315]=1314
-.[0][1316]=1315
-.[0][1317]=1316
-.[0][1318]=1317
-.[0][1319]=1318
-.[0][1320]=1319
-.[0][1321]=1320
-.[0][1322]=1321
-.[0][1323]=1322
-.[0][1324]=1323
-.[0][1325]=1324
-.[0][1326]=1325
-.[0][1327]=1326
-.[0][1328]=1327
-.[0][1329]=1328
-.[0][1330]=1329
-.[0][1331]=1330
-.[0][1332]=1331
-.[0][1333]=1332
-.[0][1334]=1333
-.[0][1335]=1334
-.[0][1336]=1335
-.[0][1337]=1336
-.[0][1338]=1337
-.[0][1339]=1338
-.[0][1340]=1339
-.[0][1341]=1340
-.[0][1342]=1341
-.[0][1343]=1342
-.[0][1344]=1343
-.[0][1345]=1344
-.[0][1346]=1345
-.[0][1347]=1346
-.[0][1348]=1347
-.[0][1349]=1348
-.[0][1350]=1349
-.[0][1351]=1350
-.[0][1352]=1351
-.[0][1353]=1352
-.[0][1354]=1353
-.[0][1355]=1354
-.[0][1356]=1355
-.[0][1357]=1356
-.[0][1358]=1357
-.[0][1359]=1358
-.[0][1360]=1359
-.[0][1361]=1360
-.[0][1362]=1361
-.[0][1363]=1362
-.[0][1364]=1363
-.[0][1365]=1364
-.[0][1366]=1365
-.[0][1367]=1366
-.[0][1368]=1367
-.[0][1369]=1368
-.[0][1370]=1369
-.[0][1371]=1370
-.[0][1372]=1371
-.[0][1373]=1372
-.[0][1374]=1373
-.[0][1375]=1374
-.[0][1376]=1375
-.[0][1377]=1376
-.[0][1378]=1377
-.[0][1379]=1378
-.[0][1380]=1379
-.[0][1381]=1380
-.[0][1382]=1381
-.[0][1383]=1382
-.[0][1384]=1383
-.[0][1385]=1384
-.[0][1386]=1385
-.[0][1387]=1386
-.[0][1388]=1387
-.[0][1389]=1388
-.[0][1390]=1389
-.[0][1391]=1390
-.[0][1392]=1391
-.[0][1393]=1392
-.[0][1394]=1393
-.[0][1395]=1394
-.[0][1396]=1395
-.[0][1397]=1396
-.[0][1398]=1397
-.[0][1399]=1398
-.[0][1400]=1399
-.[0][1401]=1400
-.[0][1402]=1401
-.[0][1403]=1402
-.[0][1404]=1403
-.[0][1405]=1404
-.[0][1406]=1405
-.[0][1407]=1406
-.[0][1408]=1407
-.[0][1409]=1408
-.[0][1410]=1409
-.[0][1411]=1410
-.[0][1412]=1411
-.[0][1413]=1412
-.[0][1414]=1413
-.[0][1415]=1414
-.[0][1416]=1415
-.[0][1417]=1416
-.[0][1418]=1417
-.[0][1419]=1418
-.[0][1420]=1419
-.[0][1421]=1420
-.[0][1422]=1421
-.[0][1423]=1422
-.[0][1424]=1423
-.[0][1425]=1424
-.[0][1426]=1425
-.[0][1427]=1426
-.[0][1428]=1427
-.[0][1429]=1428
-.[0][1430]=1429
-.[0][1431]=1430
-.[0][1432]=1431
-.[0][1433]=1432
-.[0][1434]=1433
-.[0][1435]=1434
-.[0][1436]=1435
-.[0][1437]=1436
-.[0][1438]=1437
-.[0][1439]=1438
-.[0][1440]=1439
-.[0][1441]=1440
-.[0][1442]=1441
-.[0][1443]=1442
-.[0][1444]=1443
-.[0][1445]=1444
-.[0][1446]=1445
-.[0][1447]=1446
-.[0][1448]=1447
-.[0][1449]=1448
-.[0][1450]=1449
-.[0][1451]=1450
-.[0][1452]=1451
-.[0][1453]=1452
-.[0][1454]=1453
-.[0][1455]=1454
-.[0][1456]=1455
-.[0][1457]=1456
-.[0][1458]=1457
-.[0][1459]=1458
-.[0][1460]=1459
-.[0][1461]=1460
-.[0][1462]=1461
-.[0][1463]=1462
-.[0][1464]=1463
-.[0][1465]=1464
-.[0][1466]=1465
-.[0][1467]=1466
-.[0][1468]=1467
-.[0][1469]=1468
-.[0][1470]=1469
-.[0][1471]=1470
-.[0][1472]=1471
-.[0][1473]=1472
-.[0][1474]=1473
-.[0][1475]=1474
-.[0][1476]=1475
-.[0][1477]=1476
-.[0][1478]=1477
-.[0][1479]=1478
-.[0][1480]=1479
-.[0][1481]=1480
-.[0][1482]=1481
-.[0][1483]=1482
-.[0][1484]=1483
-.[0][1485]=1484
-.[0][1486]=1485
-.[0][1487]=1486
-.[0][1488]=1487
-.[0][1489]=1488
-.[0][1490]=1489
-.[0][1491]=1490
-.[0][1492]=1491
-.[0][1493]=1492
-.[0][1494]=1493
-.[0][1495]=1494
-.[0][1496]=1495
-.[0][1497]=1496
-.[0][1498]=1497
-.[0][1499]=1498
-.[0][1500]=1499
-.[0][1501]=1500
-.[0][1502]=1501
-.[0][1503]=1502
-.[0][1504]=1503
-.[0][1505]=1504
-.[0][1506]=1505
-.[0][1507]=1506
-.[0][1508]=1507
-.[0][1509]=1508
-.[0][1510]=1509
-.[0][1511]=1510
-.[0][1512]=1511
-.[0][1513]=1512
-.[0][1514]=1513
-.[0][1515]=1514
-.[0][1516]=1515
-.[0][1517]=1516
-.[0][1518]=1517
-.[0][1519]=1518
-.[0][1520]=1519
-.[0][1521]=1520
-.[0][1522]=1521
-.[0][1523]=1522
-.[0][1524]=1523
-.[0][1525]=1524
-.[0][1526]=1525
-.[0][1527]=1526
-.[0][1528]=1527
-.[0][1529]=1528
-.[0][1530]=1529
-.[0][1531]=1530
-.[0][1532]=1531
-.[0][1533]=1532
-.[0][1534]=1533
-.[0][1535]=1534
-.[0][1536]=1535
-.[0][1537]=1536
-.[0][1538]=1537
-.[0][1539]=1538
-.[0][1540]=1539
-.[0][1541]=1540
-.[0][1542]=1541
-.[0][1543]=1542
-.[0][1544]=1543
-.[0][1545]=1544
-.[0][1546]=1545
-.[0][1547]=1546
-.[0][1548]=1547
-.[0][1549]=1548
-.[0][1550]=1549
-.[0][1551]=1550
-.[0][1552]=1551
-.[0][1553]=1552
-.[0][1554]=1553
-.[0][1555]=1554
-.[0][1556]=1555
-.[0][1557]=1556
-.[0][1558]=1557
-.[0][1559]=1558
-.[0][1560]=1559
-.[0][1561]=1560
-.[0][1562]=1561
-.[0][1563]=1562
-.[0][1564]=1563
-.[0][1565]=1564
-.[0][1566]=1565
-.[0][1567]=1566
-.[0][1568]=1567
-.[0][1569]=1568
-.[0][1570]=1569
-.[0][1571]=1570
-.[0][1572]=1571
-.[0][1573]=1572
-.[0][1574]=1573
-.[0][1575]=1574
-.[0][1576]=1575
-.[0][1577]=1576
-.[0][1578]=1577
-.[0][1579]=1578
-.[0][1580]=1579
-.[0][1581]=1580
-.[0][1582]=1581
-.[0][1583]=1582
-.[0][1584]=1583
-.[0][1585]=1584
-.[0][1586]=1585
-.[0][1587]=1586
-.[0][1588]=1587
-.[0][1589]=1588
-.[0][1590]=1589
-.[0][1591]=1590
-.[0][1592]=1591
-.[0][1593]=1592
-.[0][1594]=1593
-.[0][1595]=1594
-.[0][1596]=1595
-.[0][1597]=1596
-.[0][1598]=1597
-.[0][1599]=1598
-.[0][1600]=1599
-.[0][1601]=1600
-.[0][1602]=1601
-.[0][1603]=1602
-.[0][1604]=1603
-.[0][1605]=1604
-.[0][1606]=1605
-.[0][1607]=1606
-.[0][1608]=1607
-.[0][1609]=1608
-.[0][1610]=1609
-.[0][1611]=1610
-.[0][1612]=1611
-.[0][1613]=1612
-.[0][1614]=1613
-.[0][1615]=1614
-.[0][1616]=1615
-.[0][1617]=1616
-.[0][1618]=1617
-.[0][1619]=1618
-.[0][1620]=1619
-.[0][1621]=1620
-.[0][1622]=1621
-.[0][1623]=1622
-.[0][1624]=1623
-.[0][1625]=1624
-.[0][1626]=1625
-.[0][1627]=1626
-.[0][1628]=1627
-.[0][1629]=1628
-.[0][1630]=1629
-.[0][1631]=1630
-.[0][1632]=1631
-.[0][1633]=1632
-.[0][1634]=1633
-.[0][1635]=1634
-.[0][1636]=1635
-.[0][1637]=1636
-.[0][1638]=1637
-.[0][1639]=1638
-.[0][1640]=1639
-.[0][1641]=1640
-.[0][1642]=1641
-.[0][1643]=1642
-.[0][1644]=1643
-.[0][1645]=1644
-.[0][1646]=1645
-.[0][1647]=1646
-.[0][1648]=1647
-.[0][1649]=1648
-.[0][1650]=1649
-.[0][1651]=1650
-.[0][1652]=1651
-.[0][1653]=1652
-.[0][1654]=1653
-.[0][1655]=1654
-.[0][1656]=1655
-.[0][1657]=1656
-.[0][1658]=1657
-.[0][1659]=1658
-.[0][1660]=1659
-.[0][1661]=1660
-.[0][1662]=1661
-.[0][1663]=1662
-.[0][1664]=1663
-.[0][1665]=1664
-.[0][1666]=1665
-.[0][1667]=1666
-.[0][1668]=1667
-.[0][1669]=1668
-.[0][1670]=1669
-.[0][1671]=1670
-.[0][1672]=1671
-.[0][1673]=1672
-.[0][1674]=1673
-.[0][1675]=1674
-.[0][1676]=1675
-.[0][1677]=1676
-.[0][1678]=1677
-.[0][1679]=1678
-.[0][1680]=1679
-.[0][1681]=1680
-.[0][1682]=1681
-.[0][1683]=1682
-.[0][1684]=1683
-.[0][1685]=1684
-.[0][1686]=1685
-.[0][1687]=1686
-.[0][1688]=1687
-.[0][1689]=1688
-.[0][1690]=1689
-.[0][1691]=1690
-.[0][1692]=1691
-.[0][1693]=1692
-.[0][1694]=1693
-.[0][1695]=1694
-.[0][1696]=1695
-.[0][1697]=1696
-.[0][1698]=1697
-.[0][1699]=1698
-.[0][1700]=1699
-.[0][1701]=1700
-.[0][1702]=1701
-.[0][1703]=1702
-.[0][1704]=1703
-.[0][1705]=1704
-.[0][1706]=1705
-.[0][1707]=1706
-.[0][1708]=1707
-.[0][1709]=1708
-.[0][1710]=1709
-.[0][1711]=1710
-.[0][1712]=1711
-.[0][1713]=1712
-.[0][1714]=1713
-.[0][1715]=1714
-.[0][1716]=1715
-.[0][1717]=1716
-.[0][1718]=1717
-.[0][1719]=1718
-.[0][1720]=1719
-.[0][1721]=1720
-.[0][1722]=1721
-.[0][1723]=1722
-.[0][1724]=1723
-.[0][1725]=1724
-.[0][1726]=1725
-.[0][1727]=1726
-.[0][1728]=1727
-.[0][1729]=1728
-.[0][1730]=1729
-.[0][1731]=1730
-.[0][1732]=1731
-.[0][1733]=1732
-.[0][1734]=1733
-.[0][1735]=1734
-.[0][1736]=1735
-.[0][1737]=1736
-.[0][1738]=1737
-.[0][1739]=1738
-.[0][1740]=1739
-.[0][1741]=1740
-.[0][1742]=1741
-.[0][1743]=1742
-.[0][1744]=1743
-.[0][1745]=1744
-.[0][1746]=1745
-.[0][1747]=1746
-.[0][1748]=1747
-.[0][1749]=1748
-.[0][1750]=1749
-.[0][1751]=1750
-.[0][1752]=1751
-.[0][1753]=1752
-.[0][1754]=1753
-.[0][1755]=1754
-.[0][1756]=1755
-.[0][1757]=1756
-.[0][1758]=1757
-.[0][1759]=1758
-.[0][1760]=1759
-.[0][1761]=1760
-.[0][1762]=1761
-.[0][1763]=1762
-.[0][1764]=1763
-.[0][1765]=1764
-.[0][1766]=1765
-.[0][1767]=1766
-.[0][1768]=1767
-.[0][1769]=1768
-.[0][1770]=1769
-.[0][1771]=1770
-.[0][1772]=1771
-.[0][1773]=1772
-.[0][1774]=1773
-.[0][1775]=1774
-.[0][1776]=1775
-.[0][1777]=1776
-.[0][1778]=1777
-.[0][1779]=1778
-.[0][1780]=1779
-.[0][1781]=1780
-.[0][1782]=1781
-.[0][1783]=1782
-.[0][1784]=1783
-.[0][1785]=1784
-.[0][1786]=1785
-.[0][1787]=1786
-.[0][1788]=1787
-.[0][1789]=1788
-.[0][1790]=1789
-.[0][1791]=1790
-.[0][1792]=1791
-.[0][1793]=1792
-.[0][1794]=1793
-.[0][1795]=1794
-.[0][1796]=1795
-.[0][1797]=1796
-.[0][1798]=1797
-.[0][1799]=1798
-.[0][1800]=1799
-.[0][1801]=1800
-.[0][1802]=1801
-.[0][1803]=1802
-.[0][1804]=1803
-.[0][1805]=1804
-.[0][1806]=1805
-.[0][1807]=1806
-.[0][1808]=1807
-.[0][1809]=1808
-.[0][1810]=1809
-.[0][1811]=1810
-.[0][1812]=1811
-.[0][1813]=1812
-.[0][1814]=1813
-.[0][1815]=1814
-.[0][1816]=1815
-.[0][1817]=1816
-.[0][1818]=1817
-.[0][1819]=1818
-.[0][1820]=1819
-.[0][1821]=1820
-.[0][1822]=1821
-.[0][1823]=1822
-.[0][1824]=1823
-.[0][1825]=1824
-.[0][1826]=1825
-.[0][1827]=1826
-.[0][1828]=1827
-.[0][1829]=1828
-.[0][1830]=1829
-.[0][1831]=1830
-.[0][1832]=1831
-.[0][1833]=1832
-.[0][1834]=1833
-.[0][1835]=1834
-.[0][1836]=1835
-.[0][1837]=1836
-.[0][1838]=1837
-.[0][1839]=1838
-.[0][1840]=1839
-.[0][1841]=1840
-.[0][1842]=1841
-.[0][1843]=1842
-.[0][1844]=1843
-.[0][1845]=1844
-.[0][1846]=1845
-.[0][1847]=1846
-.[0][1848]=1847
-.[0][1849]=1848
-.[0][1850]=1849
-.[0][1851]=1850
-.[0][1852]=1851
-.[0][1853]=1852
-.[0][1854]=1853
-.[0][1855]=1854
-.[0][1856]=1855
-.[0][1857]=1856
-.[0][1858]=1857
-.[0][1859]=1858
-.[0][1860]=1859
-.[0][1861]=1860
-.[0][1862]=1861
-.[0][1863]=1862
-.[0][1864]=1863
-.[0][1865]=1864
-.[0][1866]=1865
-.[0][1867]=1866
-.[0][1868]=1867
-.[0][1869]=1868
-.[0][1870]=1869
-.[0][1871]=1870
-.[0][1872]=1871
-.[0][1873]=1872
-.[0][1874]=1873
-.[0][1875]=1874
-.[0][1876]=1875
-.[0][1877]=1876
-.[0][1878]=1877
-.[0][1879]=1878
-.[0][1880]=1879
-.[0][1881]=1880
-.[0][1882]=1881
-.[0][1883]=1882
-.[0][1884]=1883
-.[0][1885]=1884
-.[0][1886]=1885
-.[0][1887]=1886
-.[0][1888]=1887
-.[0][1889]=1888
-.[0][1890]=1889
-.[0][1891]=1890
-.[0][1892]=1891
-.[0][1893]=1892
-.[0][1894]=1893
-.[0][1895]=1894
-.[0][1896]=1895
-.[0][1897]=1896
-.[0][1898]=1897
-.[0][1899]=1898
-.[0][1900]=1899
-.[0][1901]=1900
-.[0][1902]=1901
-.[0][1903]=1902
-.[0][1904]=1903
-.[0][1905]=1904
-.[0][1906]=1905
-.[0][1907]=1906
-.[0][1908]=1907
-.[0][1909]=1908
-.[0][1910]=1909
-.[0][1911]=1910
-.[0][1912]=1911
-.[0][1913]=1912
-.[0][1914]=1913
-.[0][1915]=1914
-.[0][1916]=1915
-.[0][1917]=1916
-.[0][1918]=1917
-.[0][1919]=1918
-.[0][1920]=1919
-.[0][1921]=1920
-.[0][1922]=1921
-.[0][1923]=1922
-.[0][1924]=1923
-.[0][1925]=1924
-.[0][1926]=1925
-.[0][1927]=1926
-.[0][1928]=1927
-.[0][1929]=1928
-.[0][1930]=1929
-.[0][1931]=1930
-.[0][1932]=1931
-.[0][1933]=1932
-.[0][1934]=1933
-.[0][1935]=1934
-.[0][1936]=1935
-.[0][1937]=1936
-.[0][1938]=1937
-.[0][1939]=1938
-.[0][1940]=1939
-.[0][1941]=1940
-.[0][1942]=1941
-.[0][1943]=1942
-.[0][1944]=1943
-.[0][1945]=1944
-.[0][1946]=1945
-.[0][1947]=1946
-.[0][1948]=1947
-.[0][1949]=1948
-.[0][1950]=1949
-.[0][1951]=1950
-.[0][1952]=1951
-.[0][1953]=1952
-.[0][1954]=1953
-.[0][1955]=1954
-.[0][1956]=1955
-.[0][1957]=1956
-.[0][1958]=1957
-.[0][1959]=1958
-.[0][1960]=1959
-.[0][1961]=1960
-.[0][1962]=1961
-.[0][1963]=1962
-.[0][1964]=1963
-.[0][1965]=1964
-.[0][1966]=1965
-.[0][1967]=1966
-.[0][1968]=1967
-.[0][1969]=1968
-.[0][1970]=1969
-.[0][1971]=1970
-.[0][1972]=1971
-.[0][1973]=1972
-.[0][1974]=1973
-.[0][1975]=1974
-.[0][1976]=1975
-.[0][1977]=1976
-.[0][1978]=1977
-.[0][1979]=1978
-.[0][1980]=1979
-.[0][1981]=1980
-.[0][1982]=1981
-.[0][1983]=1982
-.[0][1984]=1983
-.[0][1985]=1984
-.[0][1986]=1985
-.[0][1987]=1986
-.[0][1988]=1987
-.[0][1989]=1988
-.[0][1990]=1989
-.[0][1991]=1990
-.[0][1992]=1991
-.[0][1993]=1992
-.[0][1994]=1993
-.[0][1995]=1994
-.[0][1996]=1995
-.[0][1997]=1996
-.[0][1998]=1997
-.[0][1999]=1998
-.[0][2000]=1999
-.[0][2001]=2000
-.[0][2002]=2001
-.[0][2003]=2002
-.[0][2004]=2003
-.[0][2005]=2004
-.[0][2006]=2005
-.[0][2007]=2006
-.[0][2008]=2007
-.[0][2009]=2008
-.[0][2010]=2009
-.[0][2011]=2010
-.[0][2012]=2011
-.[0][2013]=2012
-.[0][2014]=2013
-.[0][2015]=2014
-.[0][2016]=2015
-.[0][2017]=2016
-.[0][2018]=2017
-.[0][2019]=2018
-.[0][2020]=2019
-.[0][2021]=2020
-.[0][2022]=2021
-.[0][2023]=2022
-.[0][2024]=2023
-.[0][2025]=2024
-.[0][2026]=2025
-.[0][2027]=2026
-.[0][2028]=2027
-.[0][2029]=2028
-.[0][2030]=2029
-.[0][2031]=2030
-.[0][2032]=2031
-.[0][2033]=2032
-.[0][2034]=2033
-.[0][2035]=2034
-.[0][2036]=2035
-.[0][2037]=2036
-.[0][2038]=2037
-.[0][2039]=2038
-.[0][2040]=2039
-.[0][2041]=2040
-.[0][2042]=2041
-.[0][2043]=2042
-.[0][2044]=2043
-.[0][2045]=2044
-.[0][2046]=2045
-.[0][2047]=2046
-.[0][2048]=2047
-.[0][2049]=2048
-.[0][2050]=2049
-.[0][2051]=2050
-.[0][2052]=2051
-.[0][2053]=2052
-.[0][2054]=2053
-.[0][2055]=2054
-.[0][2056]=2055
-.[0][2057]=2056
-.[0][2058]=2057
-.[0][2059]=2058
-.[0][2060]=2059
-.[0][2061]=2060
-.[0][2062]=2061
-.[0][2063]=2062
-.[0][2064]=2063
-.[0][2065]=2064
-.[0][2066]=2065
-.[0][2067]=2066
-.[0][2068]=2067
-.[0][2069]=2068
-.[0][2070]=2069
-.[0][2071]=2070
-.[0][2072]=2071
-.[0][2073]=2072
-.[0][2074]=2073
-.[0][2075]=2074
-.[0][2076]=2075
-.[0][2077]=2076
-.[0][2078]=2077
-.[0][2079]=2078
-.[0][2080]=2079
-.[0][2081]=2080
-.[0][2082]=2081
-.[0][2083]=2082
-.[0][2084]=2083
-.[0][2085]=2084
-.[0][2086]=2085
-.[0][2087]=2086
-.[0][2088]=2087
-.[0][2089]=2088
-.[0][2090]=2089
-.[0][2091]=2090
-.[0][2092]=2091
-.[0][2093]=2092
-.[0][2094]=2093
-.[0][2095]=2094
-.[0][2096]=2095
-.[0][2097]=2096
-.[0][2098]=2097
-.[0][2099]=2098
-.[0][2100]=2099
-.[0][2101]=2100
-.[0][2102]=2101
-.[0][2103]=2102
-.[0][2104]=2103
-.[0][2105]=2104
-.[0][2106]=2105
-.[0][2107]=2106
-.[0][2108]=2107
-.[0][2109]=2108
-.[0][2110]=2109
-.[0][2111]=2110
-.[0][2112]=2111
-.[0][2113]=2112
-.[0][2114]=2113
-.[0][2115]=2114
-.[0][2116]=2115
-.[0][2117]=2116
-.[0][2118]=2117
-.[0][2119]=2118
diff --git a/3rdparty/jsoncpp/test/data/test_large_01.json b/3rdparty/jsoncpp/test/data/test_large_01.json
deleted file mode 100644
index e4ab4cd4330..00000000000
--- a/3rdparty/jsoncpp/test/data/test_large_01.json
+++ /dev/null
@@ -1,2 +0,0 @@
-[["A",0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,886,887,888,889,890,891,892,893,894,895,896,897,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1154,1155,1156,1157,1158,1159,1160,1161,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1283,1284,1285,1286,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1298,1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1328,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1367,1368,1369,1370,1371,1372,1373,1374,1375,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,1416,1417,1418,1419,1420,1421,1422,1423,1424,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434,1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447,1448,1449,1450,1451,1452,1453,1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1476,1477,1478,1479,1480,1481,1482,1483,1484,1485,1486,1487,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,1515,1516,1517,1518,1519,1520,1521,1522,1523,1524,1525,1526,1527,1528,1529,1530,1531,1532,1533,1534,1535,1536,1537,1538,1539,1540,1541,1542,1543,1544,1545,1546,1547,1548,1549,1550,1551,1552,1553,1554,1555,1556,1557,1558,1559,1560,1561,1562,1563,1564,1565,1566,1567,1568,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1611,1612,1613,1614,1615,1616,1617,1618,1619,1620,1621,1622,1623,1624,1625,1626,1627,1628,1629,1630,1631,1632,1633,1634,1635,1636,1637,1638,1639,1640,1641,1642,1643,1644,1645,1646,1647,1648,1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659,1660,1661,1662,1663,1664,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674,1675,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689,1690,1691,1692,1693,1694,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704,1705,1706,1707,1708,1709,1710,1711,1712,1713,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1813,1814,1815,1816,1817,1818,1819,1820,1821,1822,1823,1824,1825,1826,1827,1828,1829,1830,1831,1832,1833,1834,1835,1836,1837,1838,1839,1840,1841,1842,1843,1844,1845,1846,1847,1848,1849,1850,1851,1852,1853,1854,1855,1856,1857,1858,1859,1860,1861,1862,1863,1864,1865,1866,1867,1868,1869,1870,1871,1872,1873,1874,1875,1876,1877,1878,1879,1880,1881,1882,1883,1884,1885,1886,1887,1888,1889,1890,1891,1892,1893,1894,1895,1896,1897,1898,1899,1900,1901,1902,1903,1904,1905,1906,1907,1908,1909,1910,1911,1912,1913,1914,1915,1916,1917,1918,1919,1920,1921,1922,1923,1924,1925,1926,1927,1928,1929,1930,1931,1932,1933,1934,1935,1936,1937,1938,1939,1940,1941,1942,1943,1944,1945,1946,1947,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1958,1959,1960,1961,1962,1963,1964,1965,1966,1967,1968,1969,1970,1971,1972,1973,1974,1975,1976,1977,1978,1979,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022,2023,2024,2025,2026,2027,2028,2029,2030,2031,2032,2033,2034,2035,2036,2037,2038,2039,2040,2041,2042,2043,2044,2045,2046,2047,2048,2049,2050,2051,2052,2053,2054,2055,2056,2057,2058,2059,2060,2061,2062,2063,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2075,2076,2077,2078,2079,2080,2081,2082,2083,2084,2085,2086,2087,2088,2089,2090,2091,2092,2093,2094,2095,2096,2097,2098,2099,2100,2101,2102,2103,2104,2105,2106,2107,2108,2109,2110,2111,2112,2113,2114,2115,2116,2117,2118]
-] \ No newline at end of file
diff --git a/3rdparty/jsoncpp/test/data/test_object_01.expected b/3rdparty/jsoncpp/test/data/test_object_01.expected
deleted file mode 100644
index 67444e5794e..00000000000
--- a/3rdparty/jsoncpp/test/data/test_object_01.expected
+++ /dev/null
@@ -1 +0,0 @@
-.={}
diff --git a/3rdparty/jsoncpp/test/data/test_object_01.json b/3rdparty/jsoncpp/test/data/test_object_01.json
deleted file mode 100644
index 0967ef424bc..00000000000
--- a/3rdparty/jsoncpp/test/data/test_object_01.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
diff --git a/3rdparty/jsoncpp/test/data/test_object_02.expected b/3rdparty/jsoncpp/test/data/test_object_02.expected
deleted file mode 100644
index 79391c2a6cb..00000000000
--- a/3rdparty/jsoncpp/test/data/test_object_02.expected
+++ /dev/null
@@ -1,2 +0,0 @@
-.={}
-.count=1234
diff --git a/3rdparty/jsoncpp/test/data/test_object_02.json b/3rdparty/jsoncpp/test/data/test_object_02.json
deleted file mode 100644
index d0f2facac36..00000000000
--- a/3rdparty/jsoncpp/test/data/test_object_02.json
+++ /dev/null
@@ -1 +0,0 @@
-{ "count" : 1234 }
diff --git a/3rdparty/jsoncpp/test/data/test_object_03.expected b/3rdparty/jsoncpp/test/data/test_object_03.expected
deleted file mode 100644
index 5e96113792d..00000000000
--- a/3rdparty/jsoncpp/test/data/test_object_03.expected
+++ /dev/null
@@ -1,4 +0,0 @@
-.={}
-.attribute="random"
-.count=1234
-.name="test"
diff --git a/3rdparty/jsoncpp/test/data/test_object_03.json b/3rdparty/jsoncpp/test/data/test_object_03.json
deleted file mode 100644
index 4fcd4d821d4..00000000000
--- a/3rdparty/jsoncpp/test/data/test_object_03.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "count" : 1234,
- "name" : "test",
- "attribute" : "random"
-}
diff --git a/3rdparty/jsoncpp/test/data/test_object_04.expected b/3rdparty/jsoncpp/test/data/test_object_04.expected
deleted file mode 100644
index 812965b0caa..00000000000
--- a/3rdparty/jsoncpp/test/data/test_object_04.expected
+++ /dev/null
@@ -1,2 +0,0 @@
-.={}
-.=1234
diff --git a/3rdparty/jsoncpp/test/data/test_object_04.json b/3rdparty/jsoncpp/test/data/test_object_04.json
deleted file mode 100644
index 450762d71e5..00000000000
--- a/3rdparty/jsoncpp/test/data/test_object_04.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "" : 1234
-}
diff --git a/3rdparty/jsoncpp/test/data/test_preserve_comment_01.expected b/3rdparty/jsoncpp/test/data/test_preserve_comment_01.expected
deleted file mode 100644
index 2797aa7d6be..00000000000
--- a/3rdparty/jsoncpp/test/data/test_preserve_comment_01.expected
+++ /dev/null
@@ -1,11 +0,0 @@
-/* A comment
- at the beginning of the file.
- */
-.={}
-.first=1
-/* Comment before 'second'
- */
-.second=2
-/* A comment at
- the end of the file.
- */
diff --git a/3rdparty/jsoncpp/test/data/test_preserve_comment_01.json b/3rdparty/jsoncpp/test/data/test_preserve_comment_01.json
deleted file mode 100644
index fabd55dd966..00000000000
--- a/3rdparty/jsoncpp/test/data/test_preserve_comment_01.json
+++ /dev/null
@@ -1,14 +0,0 @@
-/* A comment
- at the beginning of the file.
- */
-{
- "first" : 1, // comment after 'first' on the same line
-
-/* Comment before 'second'
- */
- "second" : 2
-}
-
-/* A comment at
- the end of the file.
- */
diff --git a/3rdparty/jsoncpp/test/data/test_real_01.expected b/3rdparty/jsoncpp/test/data/test_real_01.expected
deleted file mode 100644
index 951482708a0..00000000000
--- a/3rdparty/jsoncpp/test/data/test_real_01.expected
+++ /dev/null
@@ -1,3 +0,0 @@
-// 2^33 => out of integer range, switch to double
-.=8589934592
-
diff --git a/3rdparty/jsoncpp/test/data/test_real_01.json b/3rdparty/jsoncpp/test/data/test_real_01.json
deleted file mode 100644
index 358452d3878..00000000000
--- a/3rdparty/jsoncpp/test/data/test_real_01.json
+++ /dev/null
@@ -1,3 +0,0 @@
-// 2^33 => out of integer range, switch to double
-8589934592
-
diff --git a/3rdparty/jsoncpp/test/data/test_real_02.expected b/3rdparty/jsoncpp/test/data/test_real_02.expected
deleted file mode 100644
index b80c0048119..00000000000
--- a/3rdparty/jsoncpp/test/data/test_real_02.expected
+++ /dev/null
@@ -1,3 +0,0 @@
-// -2^32 => out of signed integer range, switch to double
-.=-4294967295
-
diff --git a/3rdparty/jsoncpp/test/data/test_real_02.json b/3rdparty/jsoncpp/test/data/test_real_02.json
deleted file mode 100644
index 936c706b68e..00000000000
--- a/3rdparty/jsoncpp/test/data/test_real_02.json
+++ /dev/null
@@ -1,3 +0,0 @@
-// -2^32 => out of signed integer range, switch to double
--4294967295
-
diff --git a/3rdparty/jsoncpp/test/data/test_real_03.expected b/3rdparty/jsoncpp/test/data/test_real_03.expected
deleted file mode 100644
index b80c0048119..00000000000
--- a/3rdparty/jsoncpp/test/data/test_real_03.expected
+++ /dev/null
@@ -1,3 +0,0 @@
-// -2^32 => out of signed integer range, switch to double
-.=-4294967295
-
diff --git a/3rdparty/jsoncpp/test/data/test_real_03.json b/3rdparty/jsoncpp/test/data/test_real_03.json
deleted file mode 100644
index 936c706b68e..00000000000
--- a/3rdparty/jsoncpp/test/data/test_real_03.json
+++ /dev/null
@@ -1,3 +0,0 @@
-// -2^32 => out of signed integer range, switch to double
--4294967295
-
diff --git a/3rdparty/jsoncpp/test/data/test_real_04.expected b/3rdparty/jsoncpp/test/data/test_real_04.expected
deleted file mode 100644
index ff71a23e141..00000000000
--- a/3rdparty/jsoncpp/test/data/test_real_04.expected
+++ /dev/null
@@ -1,3 +0,0 @@
-// 1.2345678
-.=1.2345678
-
diff --git a/3rdparty/jsoncpp/test/data/test_real_04.json b/3rdparty/jsoncpp/test/data/test_real_04.json
deleted file mode 100644
index a8eb6d0c92c..00000000000
--- a/3rdparty/jsoncpp/test/data/test_real_04.json
+++ /dev/null
@@ -1,3 +0,0 @@
-// 1.2345678
-12345678e-7
-
diff --git a/3rdparty/jsoncpp/test/data/test_real_05.expected b/3rdparty/jsoncpp/test/data/test_real_05.expected
deleted file mode 100644
index 7a460932d7b..00000000000
--- a/3rdparty/jsoncpp/test/data/test_real_05.expected
+++ /dev/null
@@ -1,4 +0,0 @@
-// 1234567.8
-.=1234567.8
-
-
diff --git a/3rdparty/jsoncpp/test/data/test_real_05.json b/3rdparty/jsoncpp/test/data/test_real_05.json
deleted file mode 100644
index f7923bab898..00000000000
--- a/3rdparty/jsoncpp/test/data/test_real_05.json
+++ /dev/null
@@ -1,3 +0,0 @@
-// 1234567.8
-0.12345678e7
-
diff --git a/3rdparty/jsoncpp/test/data/test_real_06.expected b/3rdparty/jsoncpp/test/data/test_real_06.expected
deleted file mode 100644
index a4a004deb14..00000000000
--- a/3rdparty/jsoncpp/test/data/test_real_06.expected
+++ /dev/null
@@ -1,4 +0,0 @@
-// -1.2345678
-.=-1.2345678
-
-
diff --git a/3rdparty/jsoncpp/test/data/test_real_06.json b/3rdparty/jsoncpp/test/data/test_real_06.json
deleted file mode 100644
index 485419a276c..00000000000
--- a/3rdparty/jsoncpp/test/data/test_real_06.json
+++ /dev/null
@@ -1,3 +0,0 @@
-// -1.2345678
--12345678e-7
-
diff --git a/3rdparty/jsoncpp/test/data/test_real_07.expected b/3rdparty/jsoncpp/test/data/test_real_07.expected
deleted file mode 100644
index dc02a895831..00000000000
--- a/3rdparty/jsoncpp/test/data/test_real_07.expected
+++ /dev/null
@@ -1,4 +0,0 @@
-// -1234567.8
-.=-1234567.8
-
-
diff --git a/3rdparty/jsoncpp/test/data/test_real_07.json b/3rdparty/jsoncpp/test/data/test_real_07.json
deleted file mode 100644
index 8013eb5c9a4..00000000000
--- a/3rdparty/jsoncpp/test/data/test_real_07.json
+++ /dev/null
@@ -1,3 +0,0 @@
-// -1234567.8
--0.12345678e7
-
diff --git a/3rdparty/jsoncpp/test/data/test_real_08.expected b/3rdparty/jsoncpp/test/data/test_real_08.expected
deleted file mode 100644
index b1deef919e9..00000000000
--- a/3rdparty/jsoncpp/test/data/test_real_08.expected
+++ /dev/null
@@ -1,4 +0,0 @@
-// Out of 32-bit integer range, switch to double in 32-bit mode. Length the
-// same as UINT_MAX in base 10 and digit less than UINT_MAX's last digit in
-// order to catch a bug in the parsing code.
-.=4300000001
diff --git a/3rdparty/jsoncpp/test/data/test_real_08.json b/3rdparty/jsoncpp/test/data/test_real_08.json
deleted file mode 100644
index cca950d939e..00000000000
--- a/3rdparty/jsoncpp/test/data/test_real_08.json
+++ /dev/null
@@ -1,4 +0,0 @@
-// Out of 32-bit integer range, switch to double in 32-bit mode. Length the
-// same as UINT_MAX in base 10 and digit less than UINT_MAX's last digit in
-// order to catch a bug in the parsing code.
-4300000001
diff --git a/3rdparty/jsoncpp/test/data/test_real_09.expected b/3rdparty/jsoncpp/test/data/test_real_09.expected
deleted file mode 100644
index aa2dbb2849d..00000000000
--- a/3rdparty/jsoncpp/test/data/test_real_09.expected
+++ /dev/null
@@ -1,4 +0,0 @@
-// Out of 64-bit integer range, switch to double in all modes. Length the same
-// as ULONG_MAX in base 10 and digit less than ULONG_MAX's last digit in order
-// to catch a bug in the parsing code.
-.=1.9e+19
diff --git a/3rdparty/jsoncpp/test/data/test_real_09.json b/3rdparty/jsoncpp/test/data/test_real_09.json
deleted file mode 100644
index e65d50c97c6..00000000000
--- a/3rdparty/jsoncpp/test/data/test_real_09.json
+++ /dev/null
@@ -1,4 +0,0 @@
-// Out of 64-bit integer range, switch to double in all modes. Length the same
-// as ULONG_MAX in base 10 and digit less than ULONG_MAX's last digit in order
-// to catch a bug in the parsing code.
-19000000000000000001
diff --git a/3rdparty/jsoncpp/test/data/test_real_10.expected b/3rdparty/jsoncpp/test/data/test_real_10.expected
deleted file mode 100644
index d28a430eab4..00000000000
--- a/3rdparty/jsoncpp/test/data/test_real_10.expected
+++ /dev/null
@@ -1,4 +0,0 @@
-// Out of 32-bit signed integer range, switch to double in all modes. Length
-// the same as INT_MIN in base 10 and digit less than INT_MIN's last digit in
-// order to catch a bug in the parsing code.
-.=-2200000001
diff --git a/3rdparty/jsoncpp/test/data/test_real_10.json b/3rdparty/jsoncpp/test/data/test_real_10.json
deleted file mode 100644
index a6a8bcef50f..00000000000
--- a/3rdparty/jsoncpp/test/data/test_real_10.json
+++ /dev/null
@@ -1,4 +0,0 @@
-// Out of 32-bit signed integer range, switch to double in all modes. Length
-// the same as INT_MIN in base 10 and digit less than INT_MIN's last digit in
-// order to catch a bug in the parsing code.
--2200000001
diff --git a/3rdparty/jsoncpp/test/data/test_real_11.expected b/3rdparty/jsoncpp/test/data/test_real_11.expected
deleted file mode 100644
index 2551946f52f..00000000000
--- a/3rdparty/jsoncpp/test/data/test_real_11.expected
+++ /dev/null
@@ -1,4 +0,0 @@
-// Out of 64-bit signed integer range, switch to double in all modes. Length
-// the same as LONG_MIN in base 10 and digit less than LONG_MIN's last digit in
-// order to catch a bug in the parsing code.
-.=-9.3e+18
diff --git a/3rdparty/jsoncpp/test/data/test_real_11.json b/3rdparty/jsoncpp/test/data/test_real_11.json
deleted file mode 100644
index 63cdb36f4ec..00000000000
--- a/3rdparty/jsoncpp/test/data/test_real_11.json
+++ /dev/null
@@ -1,4 +0,0 @@
-// Out of 64-bit signed integer range, switch to double in all modes. Length
-// the same as LONG_MIN in base 10 and digit less than LONG_MIN's last digit in
-// order to catch a bug in the parsing code.
--9300000000000000001
diff --git a/3rdparty/jsoncpp/test/data/test_real_12.expected b/3rdparty/jsoncpp/test/data/test_real_12.expected
deleted file mode 100644
index 93e2417d342..00000000000
--- a/3rdparty/jsoncpp/test/data/test_real_12.expected
+++ /dev/null
@@ -1,2 +0,0 @@
-// 2^64 -> switch to double.
-.=1.844674407370955e+19
diff --git a/3rdparty/jsoncpp/test/data/test_real_12.json b/3rdparty/jsoncpp/test/data/test_real_12.json
deleted file mode 100644
index 0a13eed2200..00000000000
--- a/3rdparty/jsoncpp/test/data/test_real_12.json
+++ /dev/null
@@ -1,2 +0,0 @@
-// 2^64 -> switch to double.
-18446744073709551616
diff --git a/3rdparty/jsoncpp/test/data/test_string_01.expected b/3rdparty/jsoncpp/test/data/test_string_01.expected
deleted file mode 100644
index 8fd37b1e0e7..00000000000
--- a/3rdparty/jsoncpp/test/data/test_string_01.expected
+++ /dev/null
@@ -1 +0,0 @@
-.="!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~" \ No newline at end of file
diff --git a/3rdparty/jsoncpp/test/data/test_string_01.json b/3rdparty/jsoncpp/test/data/test_string_01.json
deleted file mode 100644
index 6cd0db44dfc..00000000000
--- a/3rdparty/jsoncpp/test/data/test_string_01.json
+++ /dev/null
@@ -1 +0,0 @@
-"!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
diff --git a/3rdparty/jsoncpp/test/data/test_string_02.expected b/3rdparty/jsoncpp/test/data/test_string_02.expected
deleted file mode 100644
index 0443bc3649d..00000000000
--- a/3rdparty/jsoncpp/test/data/test_string_02.expected
+++ /dev/null
@@ -1 +0,0 @@
-.="!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~" \ No newline at end of file
diff --git a/3rdparty/jsoncpp/test/data/test_string_02.json b/3rdparty/jsoncpp/test/data/test_string_02.json
deleted file mode 100644
index 9a7e5dcad43..00000000000
--- a/3rdparty/jsoncpp/test/data/test_string_02.json
+++ /dev/null
@@ -1 +0,0 @@
-"!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
diff --git a/3rdparty/jsoncpp/test/data/test_string_03.expected b/3rdparty/jsoncpp/test/data/test_string_03.expected
deleted file mode 100644
index 6ed627a8503..00000000000
--- a/3rdparty/jsoncpp/test/data/test_string_03.expected
+++ /dev/null
@@ -1 +0,0 @@
-.="http://jsoncpp.sourceforge.net/" \ No newline at end of file
diff --git a/3rdparty/jsoncpp/test/data/test_string_03.json b/3rdparty/jsoncpp/test/data/test_string_03.json
deleted file mode 100644
index 2d38180aea1..00000000000
--- a/3rdparty/jsoncpp/test/data/test_string_03.json
+++ /dev/null
@@ -1 +0,0 @@
-"http:\/\/jsoncpp.sourceforge.net\/"
diff --git a/3rdparty/jsoncpp/test/data/test_string_04.expected b/3rdparty/jsoncpp/test/data/test_string_04.expected
deleted file mode 100644
index f57d5256c49..00000000000
--- a/3rdparty/jsoncpp/test/data/test_string_04.expected
+++ /dev/null
@@ -1,2 +0,0 @@
-.=""abc\def""
-
diff --git a/3rdparty/jsoncpp/test/data/test_string_04.json b/3rdparty/jsoncpp/test/data/test_string_04.json
deleted file mode 100644
index 01fe7524ceb..00000000000
--- a/3rdparty/jsoncpp/test/data/test_string_04.json
+++ /dev/null
@@ -1,2 +0,0 @@
-"\"abc\\def\""
-
diff --git a/3rdparty/jsoncpp/test/data/test_string_05.expected b/3rdparty/jsoncpp/test/data/test_string_05.expected
deleted file mode 100644
index 9794dddb4d7..00000000000
--- a/3rdparty/jsoncpp/test/data/test_string_05.expected
+++ /dev/null
@@ -1,2 +0,0 @@
-.="\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"
-
diff --git a/3rdparty/jsoncpp/test/data/test_string_05.json b/3rdparty/jsoncpp/test/data/test_string_05.json
deleted file mode 100644
index e156024d5ae..00000000000
--- a/3rdparty/jsoncpp/test/data/test_string_05.json
+++ /dev/null
@@ -1,2 +0,0 @@
-"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"
-
diff --git a/3rdparty/jsoncpp/test/data/test_string_unicode_01.expected b/3rdparty/jsoncpp/test/data/test_string_unicode_01.expected
deleted file mode 100644
index 1f3be7fb687..00000000000
--- a/3rdparty/jsoncpp/test/data/test_string_unicode_01.expected
+++ /dev/null
@@ -1 +0,0 @@
-.="a"
diff --git a/3rdparty/jsoncpp/test/data/test_string_unicode_01.json b/3rdparty/jsoncpp/test/data/test_string_unicode_01.json
deleted file mode 100644
index 024114bc095..00000000000
--- a/3rdparty/jsoncpp/test/data/test_string_unicode_01.json
+++ /dev/null
@@ -1 +0,0 @@
-"\u0061" \ No newline at end of file
diff --git a/3rdparty/jsoncpp/test/data/test_string_unicode_02.expected b/3rdparty/jsoncpp/test/data/test_string_unicode_02.expected
deleted file mode 100644
index 1388f539432..00000000000
--- a/3rdparty/jsoncpp/test/data/test_string_unicode_02.expected
+++ /dev/null
@@ -1 +0,0 @@
-.="¢"
diff --git a/3rdparty/jsoncpp/test/data/test_string_unicode_02.json b/3rdparty/jsoncpp/test/data/test_string_unicode_02.json
deleted file mode 100644
index 4961024fab4..00000000000
--- a/3rdparty/jsoncpp/test/data/test_string_unicode_02.json
+++ /dev/null
@@ -1 +0,0 @@
-"\u00A2" \ No newline at end of file
diff --git a/3rdparty/jsoncpp/test/data/test_string_unicode_03.expected b/3rdparty/jsoncpp/test/data/test_string_unicode_03.expected
deleted file mode 100644
index 9b80b2719f1..00000000000
--- a/3rdparty/jsoncpp/test/data/test_string_unicode_03.expected
+++ /dev/null
@@ -1 +0,0 @@
-.="€"
diff --git a/3rdparty/jsoncpp/test/data/test_string_unicode_03.json b/3rdparty/jsoncpp/test/data/test_string_unicode_03.json
deleted file mode 100644
index e7e1a9e1388..00000000000
--- a/3rdparty/jsoncpp/test/data/test_string_unicode_03.json
+++ /dev/null
@@ -1 +0,0 @@
-"\u20AC" \ No newline at end of file
diff --git a/3rdparty/jsoncpp/test/data/test_string_unicode_04.expected b/3rdparty/jsoncpp/test/data/test_string_unicode_04.expected
deleted file mode 100644
index b9e7fe3b7d5..00000000000
--- a/3rdparty/jsoncpp/test/data/test_string_unicode_04.expected
+++ /dev/null
@@ -1 +0,0 @@
-.="ð„ž"
diff --git a/3rdparty/jsoncpp/test/data/test_string_unicode_04.json b/3rdparty/jsoncpp/test/data/test_string_unicode_04.json
deleted file mode 100644
index dae65c51554..00000000000
--- a/3rdparty/jsoncpp/test/data/test_string_unicode_04.json
+++ /dev/null
@@ -1 +0,0 @@
-"\uD834\uDD1E" \ No newline at end of file
diff --git a/3rdparty/jsoncpp/test/data/test_string_unicode_05.expected b/3rdparty/jsoncpp/test/data/test_string_unicode_05.expected
deleted file mode 100644
index c2e67f99819..00000000000
--- a/3rdparty/jsoncpp/test/data/test_string_unicode_05.expected
+++ /dev/null
@@ -1,2 +0,0 @@
-.="Zażółć gęślą jaźń"
-
diff --git a/3rdparty/jsoncpp/test/data/test_string_unicode_05.json b/3rdparty/jsoncpp/test/data/test_string_unicode_05.json
deleted file mode 100644
index 87704109462..00000000000
--- a/3rdparty/jsoncpp/test/data/test_string_unicode_05.json
+++ /dev/null
@@ -1 +0,0 @@
-"Zażółć gęślą jaźń" \ No newline at end of file
diff --git a/3rdparty/jsoncpp/test/generate_expected.py b/3rdparty/jsoncpp/test/generate_expected.py
deleted file mode 100644
index 0b74f51ceef..00000000000
--- a/3rdparty/jsoncpp/test/generate_expected.py
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright 2007 Baptiste Lepilleur
-# Distributed under MIT license, or public domain if desired and
-# recognized in your jurisdiction.
-# See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
-
-from __future__ import print_function
-import glob
-import os.path
-for path in glob.glob('*.json'):
- text = file(path,'rt').read()
- target = os.path.splitext(path)[0] + '.expected'
- if os.path.exists(target):
- print('skipping:', target)
- else:
- print('creating:', target)
- file(target,'wt').write(text)
-
diff --git a/3rdparty/jsoncpp/test/jsonchecker/fail1.json b/3rdparty/jsoncpp/test/jsonchecker/fail1.json
deleted file mode 100644
index 6216b865f10..00000000000
--- a/3rdparty/jsoncpp/test/jsonchecker/fail1.json
+++ /dev/null
@@ -1 +0,0 @@
-"A JSON payload should be an object or array, not a string." \ No newline at end of file
diff --git a/3rdparty/jsoncpp/test/jsonchecker/fail10.json b/3rdparty/jsoncpp/test/jsonchecker/fail10.json
deleted file mode 100644
index 5d8c0047bd5..00000000000
--- a/3rdparty/jsoncpp/test/jsonchecker/fail10.json
+++ /dev/null
@@ -1 +0,0 @@
-{"Extra value after close": true} "misplaced quoted value" \ No newline at end of file
diff --git a/3rdparty/jsoncpp/test/jsonchecker/fail11.json b/3rdparty/jsoncpp/test/jsonchecker/fail11.json
deleted file mode 100644
index 76eb95b4583..00000000000
--- a/3rdparty/jsoncpp/test/jsonchecker/fail11.json
+++ /dev/null
@@ -1 +0,0 @@
-{"Illegal expression": 1 + 2} \ No newline at end of file
diff --git a/3rdparty/jsoncpp/test/jsonchecker/fail12.json b/3rdparty/jsoncpp/test/jsonchecker/fail12.json
deleted file mode 100644
index 77580a4522d..00000000000
--- a/3rdparty/jsoncpp/test/jsonchecker/fail12.json
+++ /dev/null
@@ -1 +0,0 @@
-{"Illegal invocation": alert()} \ No newline at end of file
diff --git a/3rdparty/jsoncpp/test/jsonchecker/fail13.json b/3rdparty/jsoncpp/test/jsonchecker/fail13.json
deleted file mode 100644
index 379406b59bd..00000000000
--- a/3rdparty/jsoncpp/test/jsonchecker/fail13.json
+++ /dev/null
@@ -1 +0,0 @@
-{"Numbers cannot have leading zeroes": 013} \ No newline at end of file
diff --git a/3rdparty/jsoncpp/test/jsonchecker/fail14.json b/3rdparty/jsoncpp/test/jsonchecker/fail14.json
deleted file mode 100644
index 0ed366b38a3..00000000000
--- a/3rdparty/jsoncpp/test/jsonchecker/fail14.json
+++ /dev/null
@@ -1 +0,0 @@
-{"Numbers cannot be hex": 0x14} \ No newline at end of file
diff --git a/3rdparty/jsoncpp/test/jsonchecker/fail15.json b/3rdparty/jsoncpp/test/jsonchecker/fail15.json
deleted file mode 100644
index fc8376b605d..00000000000
--- a/3rdparty/jsoncpp/test/jsonchecker/fail15.json
+++ /dev/null
@@ -1 +0,0 @@
-["Illegal backslash escape: \x15"] \ No newline at end of file
diff --git a/3rdparty/jsoncpp/test/jsonchecker/fail16.json b/3rdparty/jsoncpp/test/jsonchecker/fail16.json
deleted file mode 100644
index 3fe21d4b532..00000000000
--- a/3rdparty/jsoncpp/test/jsonchecker/fail16.json
+++ /dev/null
@@ -1 +0,0 @@
-[\naked] \ No newline at end of file
diff --git a/3rdparty/jsoncpp/test/jsonchecker/fail17.json b/3rdparty/jsoncpp/test/jsonchecker/fail17.json
deleted file mode 100644
index 62b9214aeda..00000000000
--- a/3rdparty/jsoncpp/test/jsonchecker/fail17.json
+++ /dev/null
@@ -1 +0,0 @@
-["Illegal backslash escape: \017"] \ No newline at end of file
diff --git a/3rdparty/jsoncpp/test/jsonchecker/fail18.json b/3rdparty/jsoncpp/test/jsonchecker/fail18.json
deleted file mode 100644
index edac92716f1..00000000000
--- a/3rdparty/jsoncpp/test/jsonchecker/fail18.json
+++ /dev/null
@@ -1 +0,0 @@
-[[[[[[[[[[[[[[[[[[[["Too deep"]]]]]]]]]]]]]]]]]]]] \ No newline at end of file
diff --git a/3rdparty/jsoncpp/test/jsonchecker/fail19.json b/3rdparty/jsoncpp/test/jsonchecker/fail19.json
deleted file mode 100644
index 3b9c46fa9a2..00000000000
--- a/3rdparty/jsoncpp/test/jsonchecker/fail19.json
+++ /dev/null
@@ -1 +0,0 @@
-{"Missing colon" null} \ No newline at end of file
diff --git a/3rdparty/jsoncpp/test/jsonchecker/fail2.json b/3rdparty/jsoncpp/test/jsonchecker/fail2.json
deleted file mode 100644
index 6b7c11e5a56..00000000000
--- a/3rdparty/jsoncpp/test/jsonchecker/fail2.json
+++ /dev/null
@@ -1 +0,0 @@
-["Unclosed array" \ No newline at end of file
diff --git a/3rdparty/jsoncpp/test/jsonchecker/fail20.json b/3rdparty/jsoncpp/test/jsonchecker/fail20.json
deleted file mode 100644
index 27c1af3e72e..00000000000
--- a/3rdparty/jsoncpp/test/jsonchecker/fail20.json
+++ /dev/null
@@ -1 +0,0 @@
-{"Double colon":: null} \ No newline at end of file
diff --git a/3rdparty/jsoncpp/test/jsonchecker/fail21.json b/3rdparty/jsoncpp/test/jsonchecker/fail21.json
deleted file mode 100644
index 62474573b21..00000000000
--- a/3rdparty/jsoncpp/test/jsonchecker/fail21.json
+++ /dev/null
@@ -1 +0,0 @@
-{"Comma instead of colon", null} \ No newline at end of file
diff --git a/3rdparty/jsoncpp/test/jsonchecker/fail22.json b/3rdparty/jsoncpp/test/jsonchecker/fail22.json
deleted file mode 100644
index a7752581bcf..00000000000
--- a/3rdparty/jsoncpp/test/jsonchecker/fail22.json
+++ /dev/null
@@ -1 +0,0 @@
-["Colon instead of comma": false] \ No newline at end of file
diff --git a/3rdparty/jsoncpp/test/jsonchecker/fail23.json b/3rdparty/jsoncpp/test/jsonchecker/fail23.json
deleted file mode 100644
index 494add1ca19..00000000000
--- a/3rdparty/jsoncpp/test/jsonchecker/fail23.json
+++ /dev/null
@@ -1 +0,0 @@
-["Bad value", truth] \ No newline at end of file
diff --git a/3rdparty/jsoncpp/test/jsonchecker/fail24.json b/3rdparty/jsoncpp/test/jsonchecker/fail24.json
deleted file mode 100644
index caff239bfc3..00000000000
--- a/3rdparty/jsoncpp/test/jsonchecker/fail24.json
+++ /dev/null
@@ -1 +0,0 @@
-['single quote'] \ No newline at end of file
diff --git a/3rdparty/jsoncpp/test/jsonchecker/fail25.json b/3rdparty/jsoncpp/test/jsonchecker/fail25.json
deleted file mode 100644
index 8b7ad23e010..00000000000
--- a/3rdparty/jsoncpp/test/jsonchecker/fail25.json
+++ /dev/null
@@ -1 +0,0 @@
-[" tab character in string "] \ No newline at end of file
diff --git a/3rdparty/jsoncpp/test/jsonchecker/fail26.json b/3rdparty/jsoncpp/test/jsonchecker/fail26.json
deleted file mode 100644
index 845d26a6a54..00000000000
--- a/3rdparty/jsoncpp/test/jsonchecker/fail26.json
+++ /dev/null
@@ -1 +0,0 @@
-["tab\ character\ in\ string\ "] \ No newline at end of file
diff --git a/3rdparty/jsoncpp/test/jsonchecker/fail27.json b/3rdparty/jsoncpp/test/jsonchecker/fail27.json
deleted file mode 100644
index 6b01a2ca4a9..00000000000
--- a/3rdparty/jsoncpp/test/jsonchecker/fail27.json
+++ /dev/null
@@ -1,2 +0,0 @@
-["line
-break"] \ No newline at end of file
diff --git a/3rdparty/jsoncpp/test/jsonchecker/fail28.json b/3rdparty/jsoncpp/test/jsonchecker/fail28.json
deleted file mode 100644
index 621a0101c66..00000000000
--- a/3rdparty/jsoncpp/test/jsonchecker/fail28.json
+++ /dev/null
@@ -1,2 +0,0 @@
-["line\
-break"] \ No newline at end of file
diff --git a/3rdparty/jsoncpp/test/jsonchecker/fail29.json b/3rdparty/jsoncpp/test/jsonchecker/fail29.json
deleted file mode 100644
index 47ec421bb62..00000000000
--- a/3rdparty/jsoncpp/test/jsonchecker/fail29.json
+++ /dev/null
@@ -1 +0,0 @@
-[0e] \ No newline at end of file
diff --git a/3rdparty/jsoncpp/test/jsonchecker/fail3.json b/3rdparty/jsoncpp/test/jsonchecker/fail3.json
deleted file mode 100644
index 168c81eb785..00000000000
--- a/3rdparty/jsoncpp/test/jsonchecker/fail3.json
+++ /dev/null
@@ -1 +0,0 @@
-{unquoted_key: "keys must be quoted"} \ No newline at end of file
diff --git a/3rdparty/jsoncpp/test/jsonchecker/fail30.json b/3rdparty/jsoncpp/test/jsonchecker/fail30.json
deleted file mode 100644
index 8ab0bc4b8b2..00000000000
--- a/3rdparty/jsoncpp/test/jsonchecker/fail30.json
+++ /dev/null
@@ -1 +0,0 @@
-[0e+] \ No newline at end of file
diff --git a/3rdparty/jsoncpp/test/jsonchecker/fail31.json b/3rdparty/jsoncpp/test/jsonchecker/fail31.json
deleted file mode 100644
index 1cce602b518..00000000000
--- a/3rdparty/jsoncpp/test/jsonchecker/fail31.json
+++ /dev/null
@@ -1 +0,0 @@
-[0e+-1] \ No newline at end of file
diff --git a/3rdparty/jsoncpp/test/jsonchecker/fail32.json b/3rdparty/jsoncpp/test/jsonchecker/fail32.json
deleted file mode 100644
index 45cba7396ff..00000000000
--- a/3rdparty/jsoncpp/test/jsonchecker/fail32.json
+++ /dev/null
@@ -1 +0,0 @@
-{"Comma instead if closing brace": true, \ No newline at end of file
diff --git a/3rdparty/jsoncpp/test/jsonchecker/fail33.json b/3rdparty/jsoncpp/test/jsonchecker/fail33.json
deleted file mode 100644
index ca5eb19dc97..00000000000
--- a/3rdparty/jsoncpp/test/jsonchecker/fail33.json
+++ /dev/null
@@ -1 +0,0 @@
-["mismatch"} \ No newline at end of file
diff --git a/3rdparty/jsoncpp/test/jsonchecker/fail4.json b/3rdparty/jsoncpp/test/jsonchecker/fail4.json
deleted file mode 100644
index 9de168bf34e..00000000000
--- a/3rdparty/jsoncpp/test/jsonchecker/fail4.json
+++ /dev/null
@@ -1 +0,0 @@
-["extra comma",] \ No newline at end of file
diff --git a/3rdparty/jsoncpp/test/jsonchecker/fail5.json b/3rdparty/jsoncpp/test/jsonchecker/fail5.json
deleted file mode 100644
index ddf3ce3d240..00000000000
--- a/3rdparty/jsoncpp/test/jsonchecker/fail5.json
+++ /dev/null
@@ -1 +0,0 @@
-["double extra comma",,] \ No newline at end of file
diff --git a/3rdparty/jsoncpp/test/jsonchecker/fail6.json b/3rdparty/jsoncpp/test/jsonchecker/fail6.json
deleted file mode 100644
index ed91580e1b1..00000000000
--- a/3rdparty/jsoncpp/test/jsonchecker/fail6.json
+++ /dev/null
@@ -1 +0,0 @@
-[ , "<-- missing value"] \ No newline at end of file
diff --git a/3rdparty/jsoncpp/test/jsonchecker/fail7.json b/3rdparty/jsoncpp/test/jsonchecker/fail7.json
deleted file mode 100644
index 8a96af3e4ee..00000000000
--- a/3rdparty/jsoncpp/test/jsonchecker/fail7.json
+++ /dev/null
@@ -1 +0,0 @@
-["Comma after the close"], \ No newline at end of file
diff --git a/3rdparty/jsoncpp/test/jsonchecker/fail8.json b/3rdparty/jsoncpp/test/jsonchecker/fail8.json
deleted file mode 100644
index b28479c6ecb..00000000000
--- a/3rdparty/jsoncpp/test/jsonchecker/fail8.json
+++ /dev/null
@@ -1 +0,0 @@
-["Extra close"]] \ No newline at end of file
diff --git a/3rdparty/jsoncpp/test/jsonchecker/fail9.json b/3rdparty/jsoncpp/test/jsonchecker/fail9.json
deleted file mode 100644
index 5815574f363..00000000000
--- a/3rdparty/jsoncpp/test/jsonchecker/fail9.json
+++ /dev/null
@@ -1 +0,0 @@
-{"Extra comma": true,} \ No newline at end of file
diff --git a/3rdparty/jsoncpp/test/jsonchecker/pass1.json b/3rdparty/jsoncpp/test/jsonchecker/pass1.json
deleted file mode 100644
index 70e26854369..00000000000
--- a/3rdparty/jsoncpp/test/jsonchecker/pass1.json
+++ /dev/null
@@ -1,58 +0,0 @@
-[
- "JSON Test Pattern pass1",
- {"object with 1 member":["array with 1 element"]},
- {},
- [],
- -42,
- true,
- false,
- null,
- {
- "integer": 1234567890,
- "real": -9876.543210,
- "e": 0.123456789e-12,
- "E": 1.234567890E+34,
- "": 23456789012E66,
- "zero": 0,
- "one": 1,
- "space": " ",
- "quote": "\"",
- "backslash": "\\",
- "controls": "\b\f\n\r\t",
- "slash": "/ & \/",
- "alpha": "abcdefghijklmnopqrstuvwyz",
- "ALPHA": "ABCDEFGHIJKLMNOPQRSTUVWYZ",
- "digit": "0123456789",
- "0123456789": "digit",
- "special": "`1~!@#$%^&*()_+-={':[,]}|;.</>?",
- "hex": "\u0123\u4567\u89AB\uCDEF\uabcd\uef4A",
- "true": true,
- "false": false,
- "null": null,
- "array":[ ],
- "object":{ },
- "address": "50 St. James Street",
- "url": "http://www.JSON.org/",
- "comment": "// /* <!-- --",
- "# -- --> */": " ",
- " s p a c e d " :[1,2 , 3
-
-,
-
-4 , 5 , 6 ,7 ],"compact":[1,2,3,4,5,6,7],
- "jsontext": "{\"object with 1 member\":[\"array with 1 element\"]}",
- "quotes": "&#34; \u0022 %22 0x22 034 &#x22;",
- "\/\\\"\uCAFE\uBABE\uAB98\uFCDE\ubcda\uef4A\b\f\n\r\t`1~!@#$%^&*()_+-=[]{}|;:',./<>?"
-: "A key can be any string"
- },
- 0.5 ,98.6
-,
-99.44
-,
-
-1066,
-1e1,
-0.1e1,
-1e-1,
-1e00,2e+00,2e-00
-,"rosebud"] \ No newline at end of file
diff --git a/3rdparty/jsoncpp/test/jsonchecker/pass2.json b/3rdparty/jsoncpp/test/jsonchecker/pass2.json
deleted file mode 100644
index d3c63c7ad84..00000000000
--- a/3rdparty/jsoncpp/test/jsonchecker/pass2.json
+++ /dev/null
@@ -1 +0,0 @@
-[[[[[[[[[[[[[[[[[[["Not too deep"]]]]]]]]]]]]]]]]]]] \ No newline at end of file
diff --git a/3rdparty/jsoncpp/test/jsonchecker/pass3.json b/3rdparty/jsoncpp/test/jsonchecker/pass3.json
deleted file mode 100644
index 4528d51f1ac..00000000000
--- a/3rdparty/jsoncpp/test/jsonchecker/pass3.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "JSON Test Pattern pass3": {
- "The outermost value": "must be an object or array.",
- "In this test": "It is an object."
- }
-}
diff --git a/3rdparty/jsoncpp/test/jsonchecker/readme.txt b/3rdparty/jsoncpp/test/jsonchecker/readme.txt
deleted file mode 100644
index 321d89d998e..00000000000
--- a/3rdparty/jsoncpp/test/jsonchecker/readme.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-Test suite from http://json.org/JSON_checker/.
-
-If the JSON_checker is working correctly, it must accept all of the pass*.json files and reject all of the fail*.json files.
diff --git a/3rdparty/jsoncpp/test/pyjsontestrunner.py b/3rdparty/jsoncpp/test/pyjsontestrunner.py
deleted file mode 100644
index 7f38356ae98..00000000000
--- a/3rdparty/jsoncpp/test/pyjsontestrunner.py
+++ /dev/null
@@ -1,71 +0,0 @@
-# Copyright 2007 Baptiste Lepilleur
-# Distributed under MIT license, or public domain if desired and
-# recognized in your jurisdiction.
-# See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
-
-"""Simple implementation of a json test runner to run the test against
-json-py."""
-
-from __future__ import print_function
-import sys
-import os.path
-import json
-import types
-
-if len(sys.argv) != 2:
- print("Usage: %s input-json-file", sys.argv[0])
- sys.exit(3)
-
-input_path = sys.argv[1]
-base_path = os.path.splitext(input_path)[0]
-actual_path = base_path + '.actual'
-rewrite_path = base_path + '.rewrite'
-rewrite_actual_path = base_path + '.actual-rewrite'
-
-def valueTreeToString(fout, value, path = '.'):
- ty = type(value)
- if ty is types.DictType:
- fout.write('%s={}\n' % path)
- suffix = path[-1] != '.' and '.' or ''
- names = value.keys()
- names.sort()
- for name in names:
- valueTreeToString(fout, value[name], path + suffix + name)
- elif ty is types.ListType:
- fout.write('%s=[]\n' % path)
- for index, childValue in zip(xrange(0,len(value)), value):
- valueTreeToString(fout, childValue, path + '[%d]' % index)
- elif ty is types.StringType:
- fout.write('%s="%s"\n' % (path,value))
- elif ty is types.IntType:
- fout.write('%s=%d\n' % (path,value))
- elif ty is types.FloatType:
- fout.write('%s=%.16g\n' % (path,value))
- elif value is True:
- fout.write('%s=true\n' % path)
- elif value is False:
- fout.write('%s=false\n' % path)
- elif value is None:
- fout.write('%s=null\n' % path)
- else:
- assert False and "Unexpected value type"
-
-def parseAndSaveValueTree(input, actual_path):
- root = json.loads(input)
- fout = file(actual_path, 'wt')
- valueTreeToString(fout, root)
- fout.close()
- return root
-
-def rewriteValueTree(value, rewrite_path):
- rewrite = json.dumps(value)
- #rewrite = rewrite[1:-1] # Somehow the string is quoted ! jsonpy bug ?
- file(rewrite_path, 'wt').write(rewrite + '\n')
- return rewrite
-
-input = file(input_path, 'rt').read()
-root = parseAndSaveValueTree(input, actual_path)
-rewrite = rewriteValueTree(json.write(root), rewrite_path)
-rewrite_root = parseAndSaveValueTree(rewrite, rewrite_actual_path)
-
-sys.exit(0)
diff --git a/3rdparty/jsoncpp/test/runjsontests.py b/3rdparty/jsoncpp/test/runjsontests.py
deleted file mode 100644
index d21c02f3802..00000000000
--- a/3rdparty/jsoncpp/test/runjsontests.py
+++ /dev/null
@@ -1,174 +0,0 @@
-# Copyright 2007 Baptiste Lepilleur
-# Distributed under MIT license, or public domain if desired and
-# recognized in your jurisdiction.
-# See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
-
-from __future__ import print_function
-from __future__ import unicode_literals
-from io import open
-from glob import glob
-import sys
-import os
-import os.path
-import optparse
-
-VALGRIND_CMD = 'valgrind --tool=memcheck --leak-check=yes --undef-value-errors=yes '
-
-def getStatusOutput(cmd):
- """
- Return int, unicode (for both Python 2 and 3).
- Note: os.popen().close() would return None for 0.
- """
- print(cmd, file=sys.stderr)
- pipe = os.popen(cmd)
- process_output = pipe.read()
- try:
- # We have been using os.popen(). When we read() the result
- # we get 'str' (bytes) in py2, and 'str' (unicode) in py3.
- # Ugh! There must be a better way to handle this.
- process_output = process_output.decode('utf-8')
- except AttributeError:
- pass # python3
- status = pipe.close()
- return status, process_output
-def compareOutputs(expected, actual, message):
- expected = expected.strip().replace('\r','').split('\n')
- actual = actual.strip().replace('\r','').split('\n')
- diff_line = 0
- max_line_to_compare = min(len(expected), len(actual))
- for index in range(0,max_line_to_compare):
- if expected[index].strip() != actual[index].strip():
- diff_line = index + 1
- break
- if diff_line == 0 and len(expected) != len(actual):
- diff_line = max_line_to_compare+1
- if diff_line == 0:
- return None
- def safeGetLine(lines, index):
- index += -1
- if index >= len(lines):
- return ''
- return lines[index].strip()
- return """ Difference in %s at line %d:
- Expected: '%s'
- Actual: '%s'
-""" % (message, diff_line,
- safeGetLine(expected,diff_line),
- safeGetLine(actual,diff_line))
-
-def safeReadFile(path):
- try:
- return open(path, 'rt', encoding = 'utf-8').read()
- except IOError as e:
- return '<File "%s" is missing: %s>' % (path,e)
-
-def runAllTests(jsontest_executable_path, input_dir = None,
- use_valgrind=False, with_json_checker=False,
- writerClass='StyledWriter'):
- if not input_dir:
- input_dir = os.path.join(os.getcwd(), 'data')
- tests = glob(os.path.join(input_dir, '*.json'))
- if with_json_checker:
- test_jsonchecker = glob(os.path.join(input_dir, '../jsonchecker', '*.json'))
- else:
- test_jsonchecker = []
- failed_tests = []
- valgrind_path = use_valgrind and VALGRIND_CMD or ''
- for input_path in tests + test_jsonchecker:
- expect_failure = os.path.basename(input_path).startswith('fail')
- is_json_checker_test = (input_path in test_jsonchecker) or expect_failure
- print('TESTING:', input_path, end=' ')
- options = is_json_checker_test and '--json-checker' or ''
- options += ' --json-writer %s'%writerClass
- cmd = '%s%s %s "%s"' % ( valgrind_path, jsontest_executable_path, options,
- input_path)
- status, process_output = getStatusOutput(cmd)
- if is_json_checker_test:
- if expect_failure:
- if not status:
- print('FAILED')
- failed_tests.append((input_path, 'Parsing should have failed:\n%s' %
- safeReadFile(input_path)))
- else:
- print('OK')
- else:
- if status:
- print('FAILED')
- failed_tests.append((input_path, 'Parsing failed:\n' + process_output))
- else:
- print('OK')
- else:
- base_path = os.path.splitext(input_path)[0]
- actual_output = safeReadFile(base_path + '.actual')
- actual_rewrite_output = safeReadFile(base_path + '.actual-rewrite')
- open(base_path + '.process-output', 'wt', encoding = 'utf-8').write(process_output)
- if status:
- print('parsing failed')
- failed_tests.append((input_path, 'Parsing failed:\n' + process_output))
- else:
- expected_output_path = os.path.splitext(input_path)[0] + '.expected'
- expected_output = open(expected_output_path, 'rt', encoding = 'utf-8').read()
- detail = (compareOutputs(expected_output, actual_output, 'input')
- or compareOutputs(expected_output, actual_rewrite_output, 'rewrite'))
- if detail:
- print('FAILED')
- failed_tests.append((input_path, detail))
- else:
- print('OK')
-
- if failed_tests:
- print()
- print('Failure details:')
- for failed_test in failed_tests:
- print('* Test', failed_test[0])
- print(failed_test[1])
- print()
- print('Test results: %d passed, %d failed.' % (len(tests)-len(failed_tests),
- len(failed_tests)))
- return 1
- else:
- print('All %d tests passed.' % len(tests))
- return 0
-
-def main():
- from optparse import OptionParser
- parser = OptionParser(usage="%prog [options] <path to jsontestrunner.exe> [test case directory]")
- parser.add_option("--valgrind",
- action="store_true", dest="valgrind", default=False,
- help="run all the tests using valgrind to detect memory leaks")
- parser.add_option("-c", "--with-json-checker",
- action="store_true", dest="with_json_checker", default=False,
- help="run all the tests from the official JSONChecker test suite of json.org")
- parser.enable_interspersed_args()
- options, args = parser.parse_args()
-
- if len(args) < 1 or len(args) > 2:
- parser.error('Must provides at least path to jsontestrunner executable.')
- sys.exit(1)
-
- jsontest_executable_path = os.path.normpath(os.path.abspath(args[0]))
- if len(args) > 1:
- input_path = os.path.normpath(os.path.abspath(args[1]))
- else:
- input_path = None
- status = runAllTests(jsontest_executable_path, input_path,
- use_valgrind=options.valgrind,
- with_json_checker=options.with_json_checker,
- writerClass='StyledWriter')
- if status:
- sys.exit(status)
- status = runAllTests(jsontest_executable_path, input_path,
- use_valgrind=options.valgrind,
- with_json_checker=options.with_json_checker,
- writerClass='StyledStreamWriter')
- if status:
- sys.exit(status)
- status = runAllTests(jsontest_executable_path, input_path,
- use_valgrind=options.valgrind,
- with_json_checker=options.with_json_checker,
- writerClass='BuiltStyledStreamWriter')
- if status:
- sys.exit(status)
-
-if __name__ == '__main__':
- main()
diff --git a/3rdparty/jsoncpp/test/rununittests.py b/3rdparty/jsoncpp/test/rununittests.py
deleted file mode 100644
index 08850ec1a1d..00000000000
--- a/3rdparty/jsoncpp/test/rununittests.py
+++ /dev/null
@@ -1,84 +0,0 @@
-# Copyright 2009 Baptiste Lepilleur
-# Distributed under MIT license, or public domain if desired and
-# recognized in your jurisdiction.
-# See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
-
-from __future__ import print_function
-from __future__ import unicode_literals
-from io import open
-from glob import glob
-import sys
-import os
-import os.path
-import subprocess
-import optparse
-
-VALGRIND_CMD = 'valgrind --tool=memcheck --leak-check=yes --undef-value-errors=yes'
-
-class TestProxy(object):
- def __init__(self, test_exe_path, use_valgrind=False):
- self.test_exe_path = os.path.normpath(os.path.abspath(test_exe_path))
- self.use_valgrind = use_valgrind
-
- def run(self, options):
- if self.use_valgrind:
- cmd = VALGRIND_CMD.split()
- else:
- cmd = []
- cmd.extend([self.test_exe_path, '--test-auto'] + options)
- try:
- process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
- except:
- print(cmd)
- raise
- stdout = process.communicate()[0]
- if process.returncode:
- return False, stdout
- return True, stdout
-
-def runAllTests(exe_path, use_valgrind=False):
- test_proxy = TestProxy(exe_path, use_valgrind=use_valgrind)
- status, test_names = test_proxy.run(['--list-tests'])
- if not status:
- print("Failed to obtain unit tests list:\n" + test_names, file=sys.stderr)
- return 1
- test_names = [name.strip() for name in test_names.decode('utf-8').strip().split('\n')]
- failures = []
- for name in test_names:
- print('TESTING %s:' % name, end=' ')
- succeed, result = test_proxy.run(['--test', name])
- if succeed:
- print('OK')
- else:
- failures.append((name, result))
- print('FAILED')
- failed_count = len(failures)
- pass_count = len(test_names) - failed_count
- if failed_count:
- print()
- for name, result in failures:
- print(result)
- print('%d/%d tests passed (%d failure(s))' % ( pass_count, len(test_names), failed_count))
- return 1
- else:
- print('All %d tests passed' % len(test_names))
- return 0
-
-def main():
- from optparse import OptionParser
- parser = OptionParser(usage="%prog [options] <path to test_lib_json.exe>")
- parser.add_option("--valgrind",
- action="store_true", dest="valgrind", default=False,
- help="run all the tests using valgrind to detect memory leaks")
- parser.enable_interspersed_args()
- options, args = parser.parse_args()
-
- if len(args) != 1:
- parser.error('Must provides at least path to test_lib_json executable.')
- sys.exit(1)
-
- exit_code = runAllTests(args[0], use_valgrind=options.valgrind)
- sys.exit(exit_code)
-
-if __name__ == '__main__':
- main()
diff --git a/3rdparty/jsoncpp/travis.sh b/3rdparty/jsoncpp/travis.sh
deleted file mode 100644
index 2b25f4766fd..00000000000
--- a/3rdparty/jsoncpp/travis.sh
+++ /dev/null
@@ -1,29 +0,0 @@
-#!/usr/bin/env sh
-# This is called by `.travis.yml` via Travis CI.
-# Travis supplies $TRAVIS_OS_NAME.
-# http://docs.travis-ci.com/user/multi-os/
-# Our .travis.yml also defines:
-# - SHARED_LIB=ON/OFF
-# - STATIC_LIB=ON/OFF
-# - CMAKE_PKG=ON/OFF
-# - BUILD_TYPE=release/debug
-# - VERBOSE_MAKE=false/true
-# - VERBOSE (set or not)
-
-# -e: fail on error
-# -v: show commands
-# -x: show expanded commands
-set -vex
-
-env | sort
-
-cmake -DJSONCPP_WITH_CMAKE_PACKAGE=$CMAKE_PKG -DBUILD_SHARED_LIBS=$SHARED_LIB -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_VERBOSE_MAKEFILE=$VERBOSE_MAKE .
-make
-
-# Python is not available in Travis for osx.
-# https://github.com/travis-ci/travis-ci/issues/2320
-if [ "$TRAVIS_OS_NAME" != "osx" ]
-then
- make jsoncpp_check
- valgrind --error-exitcode=42 --leak-check=full ./src/test_lib_json/jsoncpp_test
-fi
diff --git a/3rdparty/jsoncpp/version b/3rdparty/jsoncpp/version
deleted file mode 100644
index fdd3be6df54..00000000000
--- a/3rdparty/jsoncpp/version
+++ /dev/null
@@ -1 +0,0 @@
-1.6.2
diff --git a/3rdparty/jsoncpp/version.in b/3rdparty/jsoncpp/version.in
deleted file mode 100644
index bfc03f7dd72..00000000000
--- a/3rdparty/jsoncpp/version.in
+++ /dev/null
@@ -1 +0,0 @@
-@JSONCPP_VERSION@
diff --git a/3rdparty/win81sdk/Include/um/xaudio2.h b/3rdparty/win81sdk/Include/um/xaudio2.h
new file mode 100644
index 00000000000..e44c6a0f163
--- /dev/null
+++ b/3rdparty/win81sdk/Include/um/xaudio2.h
@@ -0,0 +1,1196 @@
+/**************************************************************************
+ *
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ *
+ * File: xaudio2.h
+ * Content: Declarations for the XAudio2 game audio API.
+ *
+ **************************************************************************/
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef __XAUDIO2_INCLUDED__
+#define __XAUDIO2_INCLUDED__
+
+#include <sdkddkver.h>
+
+#if(_WIN32_WINNT < _WIN32_WINNT_WIN8)
+#error "This version of XAudio2 is available only in Windows 8 or later. Use the XAudio2 headers and libraries from the DirectX SDK with applications that target Windows 7 and earlier versions."
+#endif // (_WIN32_WINNT < _WIN32_WINNT_WIN8)
+
+#include <winapifamily.h>
+
+#pragma region Application Family
+#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
+
+// Current name of the DLL shipped in the same SDK as this header.
+// The name reflects the current version
+#define XAUDIO2_DLL_A "xaudio2_8.dll"
+#define XAUDIO2_DLL_W L"xaudio2_8.dll"
+
+#ifdef UNICODE
+ #define XAUDIO2_DLL XAUDIO2_DLL_W
+#else
+ #define XAUDIO2_DLL XAUDIO2_DLL_A
+#endif
+
+
+/**************************************************************************
+ *
+ * XAudio2 COM object class and interface IDs.
+ *
+ **************************************************************************/
+
+#include <basetyps.h>
+
+// XAudio 2.8
+interface __declspec(uuid("60d8dac8-5aa1-4e8e-b597-2f5e2883d484")) IXAudio2;
+
+// Ignore the rest of this header if only the GUID definitions were requested
+#ifndef GUID_DEFS_ONLY
+
+#include <objbase.h> // Windows COM declarations
+
+#include <sal.h> // Markers for documenting API semantics
+#include <mmreg.h> // Basic data types and constants for audio work
+#include <audiosessiontypes.h> // For AUDIO_STREAM_CATEGORY
+
+// All structures defined in this file use tight field packing
+#pragma pack(push, 1)
+
+
+/**************************************************************************
+ *
+ * XAudio2 constants, flags and error codes.
+ *
+ **************************************************************************/
+
+// Numeric boundary values
+#define XAUDIO2_MAX_BUFFER_BYTES 0x80000000 // Maximum bytes allowed in a source buffer
+#define XAUDIO2_MAX_QUEUED_BUFFERS 64 // Maximum buffers allowed in a voice queue
+#define XAUDIO2_MAX_BUFFERS_SYSTEM 2 // Maximum buffers allowed for system threads (Xbox 360 only)
+#define XAUDIO2_MAX_AUDIO_CHANNELS 64 // Maximum channels in an audio stream
+#define XAUDIO2_MIN_SAMPLE_RATE 1000 // Minimum audio sample rate supported
+#define XAUDIO2_MAX_SAMPLE_RATE 200000 // Maximum audio sample rate supported
+#define XAUDIO2_MAX_VOLUME_LEVEL 16777216.0f // Maximum acceptable volume level (2^24)
+#define XAUDIO2_MIN_FREQ_RATIO (1/1024.0f) // Minimum SetFrequencyRatio argument
+#define XAUDIO2_MAX_FREQ_RATIO 1024.0f // Maximum MaxFrequencyRatio argument
+#define XAUDIO2_DEFAULT_FREQ_RATIO 2.0f // Default MaxFrequencyRatio argument
+#define XAUDIO2_MAX_FILTER_ONEOVERQ 1.5f // Maximum XAUDIO2_FILTER_PARAMETERS.OneOverQ
+#define XAUDIO2_MAX_FILTER_FREQUENCY 1.0f // Maximum XAUDIO2_FILTER_PARAMETERS.Frequency
+#define XAUDIO2_MAX_LOOP_COUNT 254 // Maximum non-infinite XAUDIO2_BUFFER.LoopCount
+#define XAUDIO2_MAX_INSTANCES 8 // Maximum simultaneous XAudio2 objects on Xbox 360
+
+// For XMA voices on Xbox 360 there is an additional restriction on the MaxFrequencyRatio
+// argument and the voice's sample rate: the product of these numbers cannot exceed 600000
+// for one-channel voices or 300000 for voices with more than one channel.
+#define XAUDIO2_MAX_RATIO_TIMES_RATE_XMA_MONO 600000
+#define XAUDIO2_MAX_RATIO_TIMES_RATE_XMA_MULTICHANNEL 300000
+
+// Numeric values with special meanings
+#define XAUDIO2_COMMIT_NOW 0 // Used as an OperationSet argument
+#define XAUDIO2_COMMIT_ALL 0 // Used in IXAudio2::CommitChanges
+#define XAUDIO2_INVALID_OPSET (UINT32)(-1) // Not allowed for OperationSet arguments
+#define XAUDIO2_NO_LOOP_REGION 0 // Used in XAUDIO2_BUFFER.LoopCount
+#define XAUDIO2_LOOP_INFINITE 255 // Used in XAUDIO2_BUFFER.LoopCount
+#define XAUDIO2_DEFAULT_CHANNELS 0 // Used in CreateMasteringVoice
+#define XAUDIO2_DEFAULT_SAMPLERATE 0 // Used in CreateMasteringVoice
+
+// Flags
+#define XAUDIO2_VOICE_NOPITCH 0x0002 // Used in IXAudio2::CreateSourceVoice
+#define XAUDIO2_VOICE_NOSRC 0x0004 // Used in IXAudio2::CreateSourceVoice
+#define XAUDIO2_VOICE_USEFILTER 0x0008 // Used in IXAudio2::CreateSource/SubmixVoice
+#define XAUDIO2_PLAY_TAILS 0x0020 // Used in IXAudio2SourceVoice::Stop
+#define XAUDIO2_END_OF_STREAM 0x0040 // Used in XAUDIO2_BUFFER.Flags
+#define XAUDIO2_SEND_USEFILTER 0x0080 // Used in XAUDIO2_SEND_DESCRIPTOR.Flags
+#define XAUDIO2_VOICE_NOSAMPLESPLAYED 0x0100 // Used in IXAudio2SourceVoice::GetState
+
+// Default parameters for the built-in filter
+#define XAUDIO2_DEFAULT_FILTER_TYPE LowPassFilter
+#define XAUDIO2_DEFAULT_FILTER_FREQUENCY XAUDIO2_MAX_FILTER_FREQUENCY
+#define XAUDIO2_DEFAULT_FILTER_ONEOVERQ 1.0f
+
+// Internal XAudio2 constants
+#define XAUDIO2_QUANTUM_NUMERATOR 1 // On Windows, XAudio2 processes audio
+#define XAUDIO2_QUANTUM_DENOMINATOR 100 // in 10ms chunks (= 1/100 seconds)
+#define XAUDIO2_QUANTUM_MS (1000.0f * XAUDIO2_QUANTUM_NUMERATOR / XAUDIO2_QUANTUM_DENOMINATOR)
+
+// XAudio2 error codes
+#define FACILITY_XAUDIO2 0x896
+#define XAUDIO2_E_INVALID_CALL 0x88960001 // An API call or one of its arguments was illegal
+#define XAUDIO2_E_XMA_DECODER_ERROR 0x88960002 // The XMA hardware suffered an unrecoverable error
+#define XAUDIO2_E_XAPO_CREATION_FAILED 0x88960003 // XAudio2 failed to initialize an XAPO effect
+#define XAUDIO2_E_DEVICE_INVALIDATED 0x88960004 // An audio device became unusable (unplugged, etc)
+
+
+/**************************************************************************
+ *
+ * Forward declarations for the XAudio2 interfaces.
+ *
+ **************************************************************************/
+
+#ifdef __cplusplus
+ #define FWD_DECLARE(x) interface x
+#else
+ #define FWD_DECLARE(x) typedef interface x x
+#endif
+
+FWD_DECLARE(IXAudio2);
+FWD_DECLARE(IXAudio2Voice);
+FWD_DECLARE(IXAudio2SourceVoice);
+FWD_DECLARE(IXAudio2SubmixVoice);
+FWD_DECLARE(IXAudio2MasteringVoice);
+FWD_DECLARE(IXAudio2EngineCallback);
+FWD_DECLARE(IXAudio2VoiceCallback);
+
+
+/**************************************************************************
+ *
+ * XAudio2 structures and enumerations.
+ *
+ **************************************************************************/
+
+// Used in XAudio2Create, specifies which CPU(s) to use.
+typedef UINT32 XAUDIO2_PROCESSOR;
+#define Processor1 0x00000001
+#define Processor2 0x00000002
+#define Processor3 0x00000004
+#define Processor4 0x00000008
+#define Processor5 0x00000010
+#define Processor6 0x00000020
+#define Processor7 0x00000040
+#define Processor8 0x00000080
+#define Processor9 0x00000100
+#define Processor10 0x00000200
+#define Processor11 0x00000400
+#define Processor12 0x00000800
+#define Processor13 0x00001000
+#define Processor14 0x00002000
+#define Processor15 0x00004000
+#define Processor16 0x00008000
+#define Processor17 0x00010000
+#define Processor18 0x00020000
+#define Processor19 0x00040000
+#define Processor20 0x00080000
+#define Processor21 0x00100000
+#define Processor22 0x00200000
+#define Processor23 0x00400000
+#define Processor24 0x00800000
+#define Processor25 0x01000000
+#define Processor26 0x02000000
+#define Processor27 0x04000000
+#define Processor28 0x08000000
+#define Processor29 0x10000000
+#define Processor30 0x20000000
+#define Processor31 0x40000000
+#define Processor32 0x80000000
+#define XAUDIO2_ANY_PROCESSOR 0xffffffff
+#define XAUDIO2_DEFAULT_PROCESSOR Processor1
+
+// Returned by IXAudio2Voice::GetVoiceDetails
+typedef struct XAUDIO2_VOICE_DETAILS
+{
+ UINT32 CreationFlags; // Flags the voice was created with.
+ UINT32 ActiveFlags; // Flags currently active.
+ UINT32 InputChannels; // Channels in the voice's input audio.
+ UINT32 InputSampleRate; // Sample rate of the voice's input audio.
+} XAUDIO2_VOICE_DETAILS;
+
+// Used in XAUDIO2_VOICE_SENDS below
+typedef struct XAUDIO2_SEND_DESCRIPTOR
+{
+ UINT32 Flags; // Either 0 or XAUDIO2_SEND_USEFILTER.
+ IXAudio2Voice* pOutputVoice; // This send's destination voice.
+} XAUDIO2_SEND_DESCRIPTOR;
+
+// Used in the voice creation functions and in IXAudio2Voice::SetOutputVoices
+typedef struct XAUDIO2_VOICE_SENDS
+{
+ UINT32 SendCount; // Number of sends from this voice.
+ XAUDIO2_SEND_DESCRIPTOR* pSends; // Array of SendCount send descriptors.
+} XAUDIO2_VOICE_SENDS;
+
+// Used in XAUDIO2_EFFECT_CHAIN below
+typedef struct XAUDIO2_EFFECT_DESCRIPTOR
+{
+ IUnknown* pEffect; // Pointer to the effect object's IUnknown interface.
+ BOOL InitialState; // TRUE if the effect should begin in the enabled state.
+ UINT32 OutputChannels; // How many output channels the effect should produce.
+} XAUDIO2_EFFECT_DESCRIPTOR;
+
+// Used in the voice creation functions and in IXAudio2Voice::SetEffectChain
+typedef struct XAUDIO2_EFFECT_CHAIN
+{
+ UINT32 EffectCount; // Number of effects in this voice's effect chain.
+ XAUDIO2_EFFECT_DESCRIPTOR* pEffectDescriptors; // Array of effect descriptors.
+} XAUDIO2_EFFECT_CHAIN;
+
+// Used in XAUDIO2_FILTER_PARAMETERS below
+typedef enum XAUDIO2_FILTER_TYPE
+{
+ LowPassFilter, // Attenuates frequencies above the cutoff frequency (state-variable filter).
+ BandPassFilter, // Attenuates frequencies outside a given range (state-variable filter).
+ HighPassFilter, // Attenuates frequencies below the cutoff frequency (state-variable filter).
+ NotchFilter, // Attenuates frequencies inside a given range (state-variable filter).
+ LowPassOnePoleFilter, // Attenuates frequencies above the cutoff frequency (one-pole filter, XAUDIO2_FILTER_PARAMETERS.OneOverQ has no effect)
+ HighPassOnePoleFilter // Attenuates frequencies below the cutoff frequency (one-pole filter, XAUDIO2_FILTER_PARAMETERS.OneOverQ has no effect)
+} XAUDIO2_FILTER_TYPE;
+
+// Used in IXAudio2Voice::Set/GetFilterParameters and Set/GetOutputFilterParameters
+typedef struct XAUDIO2_FILTER_PARAMETERS
+{
+ XAUDIO2_FILTER_TYPE Type; // Filter type.
+ float Frequency; // Filter coefficient.
+ // must be >= 0 and <= XAUDIO2_MAX_FILTER_FREQUENCY
+ // See XAudio2CutoffFrequencyToRadians() for state-variable filter types and
+ // XAudio2CutoffFrequencyToOnePoleCoefficient() for one-pole filter types.
+ float OneOverQ; // Reciprocal of the filter's quality factor Q;
+ // must be > 0 and <= XAUDIO2_MAX_FILTER_ONEOVERQ.
+ // Has no effect for one-pole filters.
+} XAUDIO2_FILTER_PARAMETERS;
+
+// Used in IXAudio2SourceVoice::SubmitSourceBuffer
+typedef struct XAUDIO2_BUFFER
+{
+ UINT32 Flags; // Either 0 or XAUDIO2_END_OF_STREAM.
+ UINT32 AudioBytes; // Size of the audio data buffer in bytes.
+ const BYTE* pAudioData; // Pointer to the audio data buffer.
+ UINT32 PlayBegin; // First sample in this buffer to be played.
+ UINT32 PlayLength; // Length of the region to be played in samples,
+ // or 0 to play the whole buffer.
+ UINT32 LoopBegin; // First sample of the region to be looped.
+ UINT32 LoopLength; // Length of the desired loop region in samples,
+ // or 0 to loop the entire buffer.
+ UINT32 LoopCount; // Number of times to repeat the loop region,
+ // or XAUDIO2_LOOP_INFINITE to loop forever.
+ void* pContext; // Context value to be passed back in callbacks.
+} XAUDIO2_BUFFER;
+
+// Used in IXAudio2SourceVoice::SubmitSourceBuffer when submitting XWMA data.
+// NOTE: If an XWMA sound is submitted in more than one buffer, each buffer's
+// pDecodedPacketCumulativeBytes[PacketCount-1] value must be subtracted from
+// all the entries in the next buffer's pDecodedPacketCumulativeBytes array.
+// And whether a sound is submitted in more than one buffer or not, the final
+// buffer of the sound should use the XAUDIO2_END_OF_STREAM flag, or else the
+// client must call IXAudio2SourceVoice::Discontinuity after submitting it.
+typedef struct XAUDIO2_BUFFER_WMA
+{
+ const UINT32* pDecodedPacketCumulativeBytes; // Decoded packet's cumulative size array.
+ // Each element is the number of bytes accumulated
+ // when the corresponding XWMA packet is decoded in
+ // order. The array must have PacketCount elements.
+ UINT32 PacketCount; // Number of XWMA packets submitted. Must be >= 1 and
+ // divide evenly into XAUDIO2_BUFFER.AudioBytes.
+} XAUDIO2_BUFFER_WMA;
+
+// Returned by IXAudio2SourceVoice::GetState
+typedef struct XAUDIO2_VOICE_STATE
+{
+ void* pCurrentBufferContext; // The pContext value provided in the XAUDIO2_BUFFER
+ // that is currently being processed, or NULL if
+ // there are no buffers in the queue.
+ UINT32 BuffersQueued; // Number of buffers currently queued on the voice
+ // (including the one that is being processed).
+ UINT64 SamplesPlayed; // Total number of samples produced by the voice since
+ // it began processing the current audio stream.
+ // If XAUDIO2_VOICE_NOSAMPLESPLAYED is specified
+ // in the call to IXAudio2SourceVoice::GetState,
+ // this member will not be calculated, saving CPU.
+} XAUDIO2_VOICE_STATE;
+
+// Returned by IXAudio2::GetPerformanceData
+typedef struct XAUDIO2_PERFORMANCE_DATA
+{
+ // CPU usage information
+ UINT64 AudioCyclesSinceLastQuery; // CPU cycles spent on audio processing since the
+ // last call to StartEngine or GetPerformanceData.
+ UINT64 TotalCyclesSinceLastQuery; // Total CPU cycles elapsed since the last call
+ // (only counts the CPU XAudio2 is running on).
+ UINT32 MinimumCyclesPerQuantum; // Fewest CPU cycles spent processing any one
+ // audio quantum since the last call.
+ UINT32 MaximumCyclesPerQuantum; // Most CPU cycles spent processing any one
+ // audio quantum since the last call.
+
+ // Memory usage information
+ UINT32 MemoryUsageInBytes; // Total heap space currently in use.
+
+ // Audio latency and glitching information
+ UINT32 CurrentLatencyInSamples; // Minimum delay from when a sample is read from a
+ // source buffer to when it reaches the speakers.
+ UINT32 GlitchesSinceEngineStarted; // Audio dropouts since the engine was started.
+
+ // Data about XAudio2's current workload
+ UINT32 ActiveSourceVoiceCount; // Source voices currently playing.
+ UINT32 TotalSourceVoiceCount; // Source voices currently existing.
+ UINT32 ActiveSubmixVoiceCount; // Submix voices currently playing/existing.
+
+ UINT32 ActiveResamplerCount; // Resample xAPOs currently active.
+ UINT32 ActiveMatrixMixCount; // MatrixMix xAPOs currently active.
+
+ // Usage of the hardware XMA decoder (Xbox 360 only)
+ UINT32 ActiveXmaSourceVoices; // Number of source voices decoding XMA data.
+ UINT32 ActiveXmaStreams; // A voice can use more than one XMA stream.
+} XAUDIO2_PERFORMANCE_DATA;
+
+// Used in IXAudio2::SetDebugConfiguration
+typedef struct XAUDIO2_DEBUG_CONFIGURATION
+{
+ UINT32 TraceMask; // Bitmap of enabled debug message types.
+ UINT32 BreakMask; // Message types that will break into the debugger.
+ BOOL LogThreadID; // Whether to log the thread ID with each message.
+ BOOL LogFileline; // Whether to log the source file and line number.
+ BOOL LogFunctionName; // Whether to log the function name.
+ BOOL LogTiming; // Whether to log message timestamps.
+} XAUDIO2_DEBUG_CONFIGURATION;
+
+// Values for the TraceMask and BreakMask bitmaps. Only ERRORS and WARNINGS
+// are valid in BreakMask. WARNINGS implies ERRORS, DETAIL implies INFO, and
+// FUNC_CALLS implies API_CALLS. By default, TraceMask is ERRORS and WARNINGS
+// and all the other settings are zero.
+#define XAUDIO2_LOG_ERRORS 0x0001 // For handled errors with serious effects.
+#define XAUDIO2_LOG_WARNINGS 0x0002 // For handled errors that may be recoverable.
+#define XAUDIO2_LOG_INFO 0x0004 // Informational chit-chat (e.g. state changes).
+#define XAUDIO2_LOG_DETAIL 0x0008 // More detailed chit-chat.
+#define XAUDIO2_LOG_API_CALLS 0x0010 // Public API function entries and exits.
+#define XAUDIO2_LOG_FUNC_CALLS 0x0020 // Internal function entries and exits.
+#define XAUDIO2_LOG_TIMING 0x0040 // Delays detected and other timing data.
+#define XAUDIO2_LOG_LOCKS 0x0080 // Usage of critical sections and mutexes.
+#define XAUDIO2_LOG_MEMORY 0x0100 // Memory heap usage information.
+#define XAUDIO2_LOG_STREAMING 0x1000 // Audio streaming information.
+
+
+/**************************************************************************
+ *
+ * IXAudio2: Top-level XAudio2 COM interface.
+ *
+ **************************************************************************/
+
+// Use default arguments if compiling as C++
+#ifdef __cplusplus
+ #define X2DEFAULT(x) =x
+#else
+ #define X2DEFAULT(x)
+#endif
+
+#undef INTERFACE
+#define INTERFACE IXAudio2
+DECLARE_INTERFACE_(IXAudio2, IUnknown)
+{
+ // NAME: IXAudio2::QueryInterface
+ // DESCRIPTION: Queries for a given COM interface on the XAudio2 object.
+ // Only IID_IUnknown and IID_IXAudio2 are supported.
+ //
+ // ARGUMENTS:
+ // riid - IID of the interface to be obtained.
+ // ppvInterface - Returns a pointer to the requested interface.
+ //
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, _Outptr_ void** ppvInterface) PURE;
+
+ // NAME: IXAudio2::AddRef
+ // DESCRIPTION: Adds a reference to the XAudio2 object.
+ //
+ STDMETHOD_(ULONG, AddRef) (THIS) PURE;
+
+ // NAME: IXAudio2::Release
+ // DESCRIPTION: Releases a reference to the XAudio2 object.
+ //
+ STDMETHOD_(ULONG, Release) (THIS) PURE;
+
+ // NAME: IXAudio2::RegisterForCallbacks
+ // DESCRIPTION: Adds a new client to receive XAudio2's engine callbacks.
+ //
+ // ARGUMENTS:
+ // pCallback - Callback interface to be called during each processing pass.
+ //
+ STDMETHOD(RegisterForCallbacks) (_In_ IXAudio2EngineCallback* pCallback) PURE;
+
+ // NAME: IXAudio2::UnregisterForCallbacks
+ // DESCRIPTION: Removes an existing receiver of XAudio2 engine callbacks.
+ //
+ // ARGUMENTS:
+ // pCallback - Previously registered callback interface to be removed.
+ //
+ STDMETHOD_(void, UnregisterForCallbacks) (_In_ IXAudio2EngineCallback* pCallback) PURE;
+
+ // NAME: IXAudio2::CreateSourceVoice
+ // DESCRIPTION: Creates and configures a source voice.
+ //
+ // ARGUMENTS:
+ // ppSourceVoice - Returns the new object's IXAudio2SourceVoice interface.
+ // pSourceFormat - Format of the audio that will be fed to the voice.
+ // Flags - XAUDIO2_VOICE flags specifying the source voice's behavior.
+ // MaxFrequencyRatio - Maximum SetFrequencyRatio argument to be allowed.
+ // pCallback - Optional pointer to a client-provided callback interface.
+ // pSendList - Optional list of voices this voice should send audio to.
+ // pEffectChain - Optional list of effects to apply to the audio data.
+ //
+ STDMETHOD(CreateSourceVoice) (THIS_ _Outptr_ IXAudio2SourceVoice** ppSourceVoice,
+ _In_ const WAVEFORMATEX* pSourceFormat,
+ UINT32 Flags X2DEFAULT(0),
+ float MaxFrequencyRatio X2DEFAULT(XAUDIO2_DEFAULT_FREQ_RATIO),
+ _In_opt_ IXAudio2VoiceCallback* pCallback X2DEFAULT(NULL),
+ _In_opt_ const XAUDIO2_VOICE_SENDS* pSendList X2DEFAULT(NULL),
+ _In_opt_ const XAUDIO2_EFFECT_CHAIN* pEffectChain X2DEFAULT(NULL)) PURE;
+
+ // NAME: IXAudio2::CreateSubmixVoice
+ // DESCRIPTION: Creates and configures a submix voice.
+ //
+ // ARGUMENTS:
+ // ppSubmixVoice - Returns the new object's IXAudio2SubmixVoice interface.
+ // InputChannels - Number of channels in this voice's input audio data.
+ // InputSampleRate - Sample rate of this voice's input audio data.
+ // Flags - XAUDIO2_VOICE flags specifying the submix voice's behavior.
+ // ProcessingStage - Arbitrary number that determines the processing order.
+ // pSendList - Optional list of voices this voice should send audio to.
+ // pEffectChain - Optional list of effects to apply to the audio data.
+ //
+ STDMETHOD(CreateSubmixVoice) (THIS_ _Outptr_ IXAudio2SubmixVoice** ppSubmixVoice,
+ UINT32 InputChannels, UINT32 InputSampleRate,
+ UINT32 Flags X2DEFAULT(0), UINT32 ProcessingStage X2DEFAULT(0),
+ _In_opt_ const XAUDIO2_VOICE_SENDS* pSendList X2DEFAULT(NULL),
+ _In_opt_ const XAUDIO2_EFFECT_CHAIN* pEffectChain X2DEFAULT(NULL)) PURE;
+
+
+ // NAME: IXAudio2::CreateMasteringVoice
+ // DESCRIPTION: Creates and configures a mastering voice.
+ //
+ // ARGUMENTS:
+ // ppMasteringVoice - Returns the new object's IXAudio2MasteringVoice interface.
+ // InputChannels - Number of channels in this voice's input audio data.
+ // InputSampleRate - Sample rate of this voice's input audio data.
+ // Flags - XAUDIO2_VOICE flags specifying the mastering voice's behavior.
+ // szDeviceId - Identifier of the device to receive the output audio.
+ // pEffectChain - Optional list of effects to apply to the audio data.
+ // StreamCategory - The audio stream category to use for this mastering voice
+ //
+ STDMETHOD(CreateMasteringVoice) (THIS_ _Outptr_ IXAudio2MasteringVoice** ppMasteringVoice,
+ UINT32 InputChannels X2DEFAULT(XAUDIO2_DEFAULT_CHANNELS),
+ UINT32 InputSampleRate X2DEFAULT(XAUDIO2_DEFAULT_SAMPLERATE),
+ UINT32 Flags X2DEFAULT(0), _In_opt_z_ LPCWSTR szDeviceId X2DEFAULT(NULL),
+ _In_opt_ const XAUDIO2_EFFECT_CHAIN* pEffectChain X2DEFAULT(NULL),
+ _In_ AUDIO_STREAM_CATEGORY StreamCategory X2DEFAULT(AudioCategory_GameEffects)) PURE;
+
+ // NAME: IXAudio2::StartEngine
+ // DESCRIPTION: Creates and starts the audio processing thread.
+ //
+ STDMETHOD(StartEngine) (THIS) PURE;
+
+ // NAME: IXAudio2::StopEngine
+ // DESCRIPTION: Stops and destroys the audio processing thread.
+ //
+ STDMETHOD_(void, StopEngine) (THIS) PURE;
+
+ // NAME: IXAudio2::CommitChanges
+ // DESCRIPTION: Atomically applies a set of operations previously tagged
+ // with a given identifier.
+ //
+ // ARGUMENTS:
+ // OperationSet - Identifier of the set of operations to be applied.
+ //
+ STDMETHOD(CommitChanges) (THIS_ UINT32 OperationSet) PURE;
+
+ // NAME: IXAudio2::GetPerformanceData
+ // DESCRIPTION: Returns current resource usage details: memory, CPU, etc.
+ //
+ // ARGUMENTS:
+ // pPerfData - Returns the performance data structure.
+ //
+ STDMETHOD_(void, GetPerformanceData) (THIS_ _Out_ XAUDIO2_PERFORMANCE_DATA* pPerfData) PURE;
+
+ // NAME: IXAudio2::SetDebugConfiguration
+ // DESCRIPTION: Configures XAudio2's debug output (in debug builds only).
+ //
+ // ARGUMENTS:
+ // pDebugConfiguration - Structure describing the debug output behavior.
+ // pReserved - Optional parameter; must be NULL.
+ //
+ STDMETHOD_(void, SetDebugConfiguration) (THIS_ _In_opt_ const XAUDIO2_DEBUG_CONFIGURATION* pDebugConfiguration,
+ _Reserved_ void* pReserved X2DEFAULT(NULL)) PURE;
+};
+
+
+/**************************************************************************
+ *
+ * IXAudio2Voice: Base voice management interface.
+ *
+ **************************************************************************/
+
+#undef INTERFACE
+#define INTERFACE IXAudio2Voice
+DECLARE_INTERFACE(IXAudio2Voice)
+{
+ // These methods are declared in a macro so that the same declarations
+ // can be used in the derived voice types (IXAudio2SourceVoice, etc).
+
+ #define Declare_IXAudio2Voice_Methods() \
+ \
+ /* NAME: IXAudio2Voice::GetVoiceDetails
+ // DESCRIPTION: Returns the basic characteristics of this voice.
+ //
+ // ARGUMENTS:
+ // pVoiceDetails - Returns the voice's details.
+ */\
+ STDMETHOD_(void, GetVoiceDetails) (THIS_ _Out_ XAUDIO2_VOICE_DETAILS* pVoiceDetails) PURE; \
+ \
+ /* NAME: IXAudio2Voice::SetOutputVoices
+ // DESCRIPTION: Replaces the set of submix/mastering voices that receive
+ // this voice's output.
+ //
+ // ARGUMENTS:
+ // pSendList - Optional list of voices this voice should send audio to.
+ */\
+ STDMETHOD(SetOutputVoices) (THIS_ _In_opt_ const XAUDIO2_VOICE_SENDS* pSendList) PURE; \
+ \
+ /* NAME: IXAudio2Voice::SetEffectChain
+ // DESCRIPTION: Replaces this voice's current effect chain with a new one.
+ //
+ // ARGUMENTS:
+ // pEffectChain - Structure describing the new effect chain to be used.
+ */\
+ STDMETHOD(SetEffectChain) (THIS_ _In_opt_ const XAUDIO2_EFFECT_CHAIN* pEffectChain) PURE; \
+ \
+ /* NAME: IXAudio2Voice::EnableEffect
+ // DESCRIPTION: Enables an effect in this voice's effect chain.
+ //
+ // ARGUMENTS:
+ // EffectIndex - Index of an effect within this voice's effect chain.
+ // OperationSet - Used to identify this call as part of a deferred batch.
+ */\
+ STDMETHOD(EnableEffect) (THIS_ UINT32 EffectIndex, \
+ UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \
+ \
+ /* NAME: IXAudio2Voice::DisableEffect
+ // DESCRIPTION: Disables an effect in this voice's effect chain.
+ //
+ // ARGUMENTS:
+ // EffectIndex - Index of an effect within this voice's effect chain.
+ // OperationSet - Used to identify this call as part of a deferred batch.
+ */\
+ STDMETHOD(DisableEffect) (THIS_ UINT32 EffectIndex, \
+ UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \
+ \
+ /* NAME: IXAudio2Voice::GetEffectState
+ // DESCRIPTION: Returns the running state of an effect.
+ //
+ // ARGUMENTS:
+ // EffectIndex - Index of an effect within this voice's effect chain.
+ // pEnabled - Returns the enabled/disabled state of the given effect.
+ */\
+ STDMETHOD_(void, GetEffectState) (THIS_ UINT32 EffectIndex, _Out_ BOOL* pEnabled) PURE; \
+ \
+ /* NAME: IXAudio2Voice::SetEffectParameters
+ // DESCRIPTION: Sets effect-specific parameters.
+ //
+ // REMARKS: Unlike IXAPOParameters::SetParameters, this method may
+ // be called from any thread. XAudio2 implements
+ // appropriate synchronization to copy the parameters to the
+ // realtime audio processing thread.
+ //
+ // ARGUMENTS:
+ // EffectIndex - Index of an effect within this voice's effect chain.
+ // pParameters - Pointer to an effect-specific parameters block.
+ // ParametersByteSize - Size of the pParameters array in bytes.
+ // OperationSet - Used to identify this call as part of a deferred batch.
+ */\
+ STDMETHOD(SetEffectParameters) (THIS_ UINT32 EffectIndex, \
+ _In_reads_bytes_(ParametersByteSize) const void* pParameters, \
+ UINT32 ParametersByteSize, \
+ UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \
+ \
+ /* NAME: IXAudio2Voice::GetEffectParameters
+ // DESCRIPTION: Obtains the current effect-specific parameters.
+ //
+ // ARGUMENTS:
+ // EffectIndex - Index of an effect within this voice's effect chain.
+ // pParameters - Returns the current values of the effect-specific parameters.
+ // ParametersByteSize - Size of the pParameters array in bytes.
+ */\
+ STDMETHOD(GetEffectParameters) (THIS_ UINT32 EffectIndex, \
+ _Out_writes_bytes_(ParametersByteSize) void* pParameters, \
+ UINT32 ParametersByteSize) PURE; \
+ \
+ /* NAME: IXAudio2Voice::SetFilterParameters
+ // DESCRIPTION: Sets this voice's filter parameters.
+ //
+ // ARGUMENTS:
+ // pParameters - Pointer to the filter's parameter structure.
+ // OperationSet - Used to identify this call as part of a deferred batch.
+ */\
+ STDMETHOD(SetFilterParameters) (THIS_ _In_ const XAUDIO2_FILTER_PARAMETERS* pParameters, \
+ UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \
+ \
+ /* NAME: IXAudio2Voice::GetFilterParameters
+ // DESCRIPTION: Returns this voice's current filter parameters.
+ //
+ // ARGUMENTS:
+ // pParameters - Returns the filter parameters.
+ */\
+ STDMETHOD_(void, GetFilterParameters) (THIS_ _Out_ XAUDIO2_FILTER_PARAMETERS* pParameters) PURE; \
+ \
+ /* NAME: IXAudio2Voice::SetOutputFilterParameters
+ // DESCRIPTION: Sets the filter parameters on one of this voice's sends.
+ //
+ // ARGUMENTS:
+ // pDestinationVoice - Destination voice of the send whose filter parameters will be set.
+ // pParameters - Pointer to the filter's parameter structure.
+ // OperationSet - Used to identify this call as part of a deferred batch.
+ */\
+ STDMETHOD(SetOutputFilterParameters) (THIS_ _In_opt_ IXAudio2Voice* pDestinationVoice, \
+ _In_ const XAUDIO2_FILTER_PARAMETERS* pParameters, \
+ UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \
+ \
+ /* NAME: IXAudio2Voice::GetOutputFilterParameters
+ // DESCRIPTION: Returns the filter parameters from one of this voice's sends.
+ //
+ // ARGUMENTS:
+ // pDestinationVoice - Destination voice of the send whose filter parameters will be read.
+ // pParameters - Returns the filter parameters.
+ */\
+ STDMETHOD_(void, GetOutputFilterParameters) (THIS_ _In_opt_ IXAudio2Voice* pDestinationVoice, \
+ _Out_ XAUDIO2_FILTER_PARAMETERS* pParameters) PURE; \
+ \
+ /* NAME: IXAudio2Voice::SetVolume
+ // DESCRIPTION: Sets this voice's overall volume level.
+ //
+ // ARGUMENTS:
+ // Volume - New overall volume level to be used, as an amplitude factor.
+ // OperationSet - Used to identify this call as part of a deferred batch.
+ */\
+ STDMETHOD(SetVolume) (THIS_ float Volume, \
+ UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \
+ \
+ /* NAME: IXAudio2Voice::GetVolume
+ // DESCRIPTION: Obtains this voice's current overall volume level.
+ //
+ // ARGUMENTS:
+ // pVolume: Returns the voice's current overall volume level.
+ */\
+ STDMETHOD_(void, GetVolume) (THIS_ _Out_ float* pVolume) PURE; \
+ \
+ /* NAME: IXAudio2Voice::SetChannelVolumes
+ // DESCRIPTION: Sets this voice's per-channel volume levels.
+ //
+ // ARGUMENTS:
+ // Channels - Used to confirm the voice's channel count.
+ // pVolumes - Array of per-channel volume levels to be used.
+ // OperationSet - Used to identify this call as part of a deferred batch.
+ */\
+ STDMETHOD(SetChannelVolumes) (THIS_ UINT32 Channels, _In_reads_(Channels) const float* pVolumes, \
+ UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \
+ \
+ /* NAME: IXAudio2Voice::GetChannelVolumes
+ // DESCRIPTION: Returns this voice's current per-channel volume levels.
+ //
+ // ARGUMENTS:
+ // Channels - Used to confirm the voice's channel count.
+ // pVolumes - Returns an array of the current per-channel volume levels.
+ */\
+ STDMETHOD_(void, GetChannelVolumes) (THIS_ UINT32 Channels, _Out_writes_(Channels) float* pVolumes) PURE; \
+ \
+ /* NAME: IXAudio2Voice::SetOutputMatrix
+ // DESCRIPTION: Sets the volume levels used to mix from each channel of this
+ // voice's output audio to each channel of a given destination
+ // voice's input audio.
+ //
+ // ARGUMENTS:
+ // pDestinationVoice - The destination voice whose mix matrix to change.
+ // SourceChannels - Used to confirm this voice's output channel count
+ // (the number of channels produced by the last effect in the chain).
+ // DestinationChannels - Confirms the destination voice's input channels.
+ // pLevelMatrix - Array of [SourceChannels * DestinationChannels] send
+ // levels. The level used to send from source channel S to destination
+ // channel D should be in pLevelMatrix[S + SourceChannels * D].
+ // OperationSet - Used to identify this call as part of a deferred batch.
+ */\
+ STDMETHOD(SetOutputMatrix) (THIS_ _In_opt_ IXAudio2Voice* pDestinationVoice, \
+ UINT32 SourceChannels, UINT32 DestinationChannels, \
+ _In_reads_(SourceChannels * DestinationChannels) const float* pLevelMatrix, \
+ UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \
+ \
+ /* NAME: IXAudio2Voice::GetOutputMatrix
+ // DESCRIPTION: Obtains the volume levels used to send each channel of this
+ // voice's output audio to each channel of a given destination
+ // voice's input audio.
+ //
+ // ARGUMENTS:
+ // pDestinationVoice - The destination voice whose mix matrix to obtain.
+ // SourceChannels - Used to confirm this voice's output channel count
+ // (the number of channels produced by the last effect in the chain).
+ // DestinationChannels - Confirms the destination voice's input channels.
+ // pLevelMatrix - Array of send levels, as above.
+ */\
+ STDMETHOD_(void, GetOutputMatrix) (THIS_ _In_opt_ IXAudio2Voice* pDestinationVoice, \
+ UINT32 SourceChannels, UINT32 DestinationChannels, \
+ _Out_writes_(SourceChannels * DestinationChannels) float* pLevelMatrix) PURE; \
+ \
+ /* NAME: IXAudio2Voice::DestroyVoice
+ // DESCRIPTION: Destroys this voice, stopping it if necessary and removing
+ // it from the XAudio2 graph.
+ */\
+ STDMETHOD_(void, DestroyVoice) (THIS) PURE
+
+ Declare_IXAudio2Voice_Methods();
+};
+
+
+/**************************************************************************
+ *
+ * IXAudio2SourceVoice: Source voice management interface.
+ *
+ **************************************************************************/
+
+#undef INTERFACE
+#define INTERFACE IXAudio2SourceVoice
+DECLARE_INTERFACE_(IXAudio2SourceVoice, IXAudio2Voice)
+{
+ // Methods from IXAudio2Voice base interface
+ Declare_IXAudio2Voice_Methods();
+
+ // NAME: IXAudio2SourceVoice::Start
+ // DESCRIPTION: Makes this voice start consuming and processing audio.
+ //
+ // ARGUMENTS:
+ // Flags - Flags controlling how the voice should be started.
+ // OperationSet - Used to identify this call as part of a deferred batch.
+ //
+ STDMETHOD(Start) (THIS_ UINT32 Flags X2DEFAULT(0), UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE;
+
+ // NAME: IXAudio2SourceVoice::Stop
+ // DESCRIPTION: Makes this voice stop consuming audio.
+ //
+ // ARGUMENTS:
+ // Flags - Flags controlling how the voice should be stopped.
+ // OperationSet - Used to identify this call as part of a deferred batch.
+ //
+ STDMETHOD(Stop) (THIS_ UINT32 Flags X2DEFAULT(0), UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE;
+
+ // NAME: IXAudio2SourceVoice::SubmitSourceBuffer
+ // DESCRIPTION: Adds a new audio buffer to this voice's input queue.
+ //
+ // ARGUMENTS:
+ // pBuffer - Pointer to the buffer structure to be queued.
+ // pBufferWMA - Additional structure used only when submitting XWMA data.
+ //
+ STDMETHOD(SubmitSourceBuffer) (THIS_ _In_ const XAUDIO2_BUFFER* pBuffer, _In_opt_ const XAUDIO2_BUFFER_WMA* pBufferWMA X2DEFAULT(NULL)) PURE;
+
+ // NAME: IXAudio2SourceVoice::FlushSourceBuffers
+ // DESCRIPTION: Removes all pending audio buffers from this voice's queue.
+ //
+ STDMETHOD(FlushSourceBuffers) (THIS) PURE;
+
+ // NAME: IXAudio2SourceVoice::Discontinuity
+ // DESCRIPTION: Notifies the voice of an intentional break in the stream of
+ // audio buffers (e.g. the end of a sound), to prevent XAudio2
+ // from interpreting an empty buffer queue as a glitch.
+ //
+ STDMETHOD(Discontinuity) (THIS) PURE;
+
+ // NAME: IXAudio2SourceVoice::ExitLoop
+ // DESCRIPTION: Breaks out of the current loop when its end is reached.
+ //
+ // ARGUMENTS:
+ // OperationSet - Used to identify this call as part of a deferred batch.
+ //
+ STDMETHOD(ExitLoop) (THIS_ UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE;
+
+ // NAME: IXAudio2SourceVoice::GetState
+ // DESCRIPTION: Returns the number of buffers currently queued on this voice,
+ // the pContext value associated with the currently processing
+ // buffer (if any), and other voice state information.
+ //
+ // ARGUMENTS:
+ // pVoiceState - Returns the state information.
+ // Flags - Flags controlling what voice state is returned.
+ //
+ STDMETHOD_(void, GetState) (THIS_ _Out_ XAUDIO2_VOICE_STATE* pVoiceState, UINT32 Flags X2DEFAULT(0)) PURE;
+
+ // NAME: IXAudio2SourceVoice::SetFrequencyRatio
+ // DESCRIPTION: Sets this voice's frequency adjustment, i.e. its pitch.
+ //
+ // ARGUMENTS:
+ // Ratio - Frequency change, expressed as source frequency / target frequency.
+ // OperationSet - Used to identify this call as part of a deferred batch.
+ //
+ STDMETHOD(SetFrequencyRatio) (THIS_ float Ratio,
+ UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE;
+
+ // NAME: IXAudio2SourceVoice::GetFrequencyRatio
+ // DESCRIPTION: Returns this voice's current frequency adjustment ratio.
+ //
+ // ARGUMENTS:
+ // pRatio - Returns the frequency adjustment.
+ //
+ STDMETHOD_(void, GetFrequencyRatio) (THIS_ _Out_ float* pRatio) PURE;
+
+ // NAME: IXAudio2SourceVoice::SetSourceSampleRate
+ // DESCRIPTION: Reconfigures this voice to treat its source data as being
+ // at a different sample rate than the original one specified
+ // in CreateSourceVoice's pSourceFormat argument.
+ //
+ // ARGUMENTS:
+ // UINT32 - The intended sample rate of further submitted source data.
+ //
+ STDMETHOD(SetSourceSampleRate) (THIS_ UINT32 NewSourceSampleRate) PURE;
+};
+
+
+/**************************************************************************
+ *
+ * IXAudio2SubmixVoice: Submixing voice management interface.
+ *
+ **************************************************************************/
+
+#undef INTERFACE
+#define INTERFACE IXAudio2SubmixVoice
+DECLARE_INTERFACE_(IXAudio2SubmixVoice, IXAudio2Voice)
+{
+ // Methods from IXAudio2Voice base interface
+ Declare_IXAudio2Voice_Methods();
+
+ // There are currently no methods specific to submix voices.
+};
+
+
+/**************************************************************************
+ *
+ * IXAudio2MasteringVoice: Mastering voice management interface.
+ *
+ **************************************************************************/
+
+#undef INTERFACE
+#define INTERFACE IXAudio2MasteringVoice
+DECLARE_INTERFACE_(IXAudio2MasteringVoice, IXAudio2Voice)
+{
+ // Methods from IXAudio2Voice base interface
+ Declare_IXAudio2Voice_Methods();
+
+ // NAME: IXAudio2MasteringVoice::GetChannelMask
+ // DESCRIPTION: Returns the channel mask for this voice
+ //
+ // ARGUMENTS:
+ // pChannelMask - returns the channel mask for this voice. This corresponds
+ // to the dwChannelMask member of WAVEFORMATEXTENSIBLE.
+ //
+ STDMETHOD(GetChannelMask) (THIS_ _Out_ DWORD* pChannelmask) PURE;
+};
+
+
+/**************************************************************************
+ *
+ * IXAudio2EngineCallback: Client notification interface for engine events.
+ *
+ * REMARKS: Contains methods to notify the client when certain events happen
+ * in the XAudio2 engine. This interface should be implemented by
+ * the client. XAudio2 will call these methods via the interface
+ * pointer provided by the client when it calls
+ * IXAudio2::RegisterForCallbacks.
+ *
+ **************************************************************************/
+
+#undef INTERFACE
+#define INTERFACE IXAudio2EngineCallback
+DECLARE_INTERFACE(IXAudio2EngineCallback)
+{
+ // Called by XAudio2 just before an audio processing pass begins.
+ STDMETHOD_(void, OnProcessingPassStart) (THIS) PURE;
+
+ // Called just after an audio processing pass ends.
+ STDMETHOD_(void, OnProcessingPassEnd) (THIS) PURE;
+
+ // Called in the event of a critical system error which requires XAudio2
+ // to be closed down and restarted. The error code is given in Error.
+ STDMETHOD_(void, OnCriticalError) (THIS_ HRESULT Error) PURE;
+};
+
+
+/**************************************************************************
+ *
+ * IXAudio2VoiceCallback: Client notification interface for voice events.
+ *
+ * REMARKS: Contains methods to notify the client when certain events happen
+ * in an XAudio2 voice. This interface should be implemented by the
+ * client. XAudio2 will call these methods via an interface pointer
+ * provided by the client in the IXAudio2::CreateSourceVoice call.
+ *
+ **************************************************************************/
+
+#undef INTERFACE
+#define INTERFACE IXAudio2VoiceCallback
+DECLARE_INTERFACE(IXAudio2VoiceCallback)
+{
+ // Called just before this voice's processing pass begins.
+ STDMETHOD_(void, OnVoiceProcessingPassStart) (THIS_ UINT32 BytesRequired) PURE;
+
+ // Called just after this voice's processing pass ends.
+ STDMETHOD_(void, OnVoiceProcessingPassEnd) (THIS) PURE;
+
+ // Called when this voice has just finished playing a buffer stream
+ // (as marked with the XAUDIO2_END_OF_STREAM flag on the last buffer).
+ STDMETHOD_(void, OnStreamEnd) (THIS) PURE;
+
+ // Called when this voice is about to start processing a new buffer.
+ STDMETHOD_(void, OnBufferStart) (THIS_ void* pBufferContext) PURE;
+
+ // Called when this voice has just finished processing a buffer.
+ // The buffer can now be reused or destroyed.
+ STDMETHOD_(void, OnBufferEnd) (THIS_ void* pBufferContext) PURE;
+
+ // Called when this voice has just reached the end position of a loop.
+ STDMETHOD_(void, OnLoopEnd) (THIS_ void* pBufferContext) PURE;
+
+ // Called in the event of a critical error during voice processing,
+ // such as a failing xAPO or an error from the hardware XMA decoder.
+ // The voice may have to be destroyed and re-created to recover from
+ // the error. The callback arguments report which buffer was being
+ // processed when the error occurred, and its HRESULT code.
+ STDMETHOD_(void, OnVoiceError) (THIS_ void* pBufferContext, HRESULT Error) PURE;
+};
+
+
+/**************************************************************************
+ *
+ * Macros to make it easier to use the XAudio2 COM interfaces in C code.
+ *
+ **************************************************************************/
+
+#ifndef __cplusplus
+
+// IXAudio2
+#define IXAudio2_QueryInterface(This,riid,ppvInterface) ((This)->lpVtbl->QueryInterface(This,riid,ppvInterface))
+#define IXAudio2_AddRef(This) ((This)->lpVtbl->AddRef(This))
+#define IXAudio2_Release(This) ((This)->lpVtbl->Release(This))
+#define IXAudio2_CreateSourceVoice(This,ppSourceVoice,pSourceFormat,Flags,MaxFrequencyRatio,pCallback,pSendList,pEffectChain) ((This)->lpVtbl->CreateSourceVoice(This,ppSourceVoice,pSourceFormat,Flags,MaxFrequencyRatio,pCallback,pSendList,pEffectChain))
+#define IXAudio2_CreateSubmixVoice(This,ppSubmixVoice,InputChannels,InputSampleRate,Flags,ProcessingStage,pSendList,pEffectChain) ((This)->lpVtbl->CreateSubmixVoice(This,ppSubmixVoice,InputChannels,InputSampleRate,Flags,ProcessingStage,pSendList,pEffectChain))
+#define IXAudio2_CreateMasteringVoice(This,ppMasteringVoice,InputChannels,InputSampleRate,Flags,DeviceId,pEffectChain,StreamCategory) ((This)->lpVtbl->CreateMasteringVoice(This,ppMasteringVoice,InputChannels,InputSampleRate,Flags,DeviceId,pEffectChain,StreamCategory))
+#define IXAudio2_StartEngine(This) ((This)->lpVtbl->StartEngine(This))
+#define IXAudio2_StopEngine(This) ((This)->lpVtbl->StopEngine(This))
+#define IXAudio2_CommitChanges(This,OperationSet) ((This)->lpVtbl->CommitChanges(This,OperationSet))
+#define IXAudio2_GetPerformanceData(This,pPerfData) ((This)->lpVtbl->GetPerformanceData(This,pPerfData))
+#define IXAudio2_SetDebugConfiguration(This,pDebugConfiguration,pReserved) ((This)->lpVtbl->SetDebugConfiguration(This,pDebugConfiguration,pReserved))
+
+// IXAudio2Voice
+#define IXAudio2Voice_GetVoiceDetails(This,pVoiceDetails) ((This)->lpVtbl->GetVoiceDetails(This,pVoiceDetails))
+#define IXAudio2Voice_SetOutputVoices(This,pSendList) ((This)->lpVtbl->SetOutputVoices(This,pSendList))
+#define IXAudio2Voice_SetEffectChain(This,pEffectChain) ((This)->lpVtbl->SetEffectChain(This,pEffectChain))
+#define IXAudio2Voice_EnableEffect(This,EffectIndex,OperationSet) ((This)->lpVtbl->EnableEffect(This,EffectIndex,OperationSet))
+#define IXAudio2Voice_DisableEffect(This,EffectIndex,OperationSet) ((This)->lpVtbl->DisableEffect(This,EffectIndex,OperationSet))
+#define IXAudio2Voice_GetEffectState(This,EffectIndex,pEnabled) ((This)->lpVtbl->GetEffectState(This,EffectIndex,pEnabled))
+#define IXAudio2Voice_SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize, OperationSet) ((This)->lpVtbl->SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize,OperationSet))
+#define IXAudio2Voice_GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize) ((This)->lpVtbl->GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize))
+#define IXAudio2Voice_SetFilterParameters(This,pParameters,OperationSet) ((This)->lpVtbl->SetFilterParameters(This,pParameters,OperationSet))
+#define IXAudio2Voice_GetFilterParameters(This,pParameters) ((This)->lpVtbl->GetFilterParameters(This,pParameters))
+#define IXAudio2Voice_SetOutputFilterParameters(This,pDestinationVoice,pParameters,OperationSet) ((This)->lpVtbl->SetOutputFilterParameters(This,pDestinationVoice,pParameters,OperationSet))
+#define IXAudio2Voice_GetOutputFilterParameters(This,pDestinationVoice,pParameters) ((This)->lpVtbl->GetOutputFilterParameters(This,pDestinationVoice,pParameters))
+#define IXAudio2Voice_SetVolume(This,Volume,OperationSet) ((This)->lpVtbl->SetVolume(This,Volume,OperationSet))
+#define IXAudio2Voice_GetVolume(This,pVolume) ((This)->lpVtbl->GetVolume(This,pVolume))
+#define IXAudio2Voice_SetChannelVolumes(This,Channels,pVolumes,OperationSet) ((This)->lpVtbl->SetChannelVolumes(This,Channels,pVolumes,OperationSet))
+#define IXAudio2Voice_GetChannelVolumes(This,Channels,pVolumes) ((This)->lpVtbl->GetChannelVolumes(This,Channels,pVolumes))
+#define IXAudio2Voice_SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet) ((This)->lpVtbl->SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet))
+#define IXAudio2Voice_GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix) ((This)->lpVtbl->GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix))
+#define IXAudio2Voice_DestroyVoice(This) ((This)->lpVtbl->DestroyVoice(This))
+
+// IXAudio2SourceVoice
+#define IXAudio2SourceVoice_GetVoiceDetails IXAudio2Voice_GetVoiceDetails
+#define IXAudio2SourceVoice_SetOutputVoices IXAudio2Voice_SetOutputVoices
+#define IXAudio2SourceVoice_SetEffectChain IXAudio2Voice_SetEffectChain
+#define IXAudio2SourceVoice_EnableEffect IXAudio2Voice_EnableEffect
+#define IXAudio2SourceVoice_DisableEffect IXAudio2Voice_DisableEffect
+#define IXAudio2SourceVoice_GetEffectState IXAudio2Voice_GetEffectState
+#define IXAudio2SourceVoice_SetEffectParameters IXAudio2Voice_SetEffectParameters
+#define IXAudio2SourceVoice_GetEffectParameters IXAudio2Voice_GetEffectParameters
+#define IXAudio2SourceVoice_SetFilterParameters IXAudio2Voice_SetFilterParameters
+#define IXAudio2SourceVoice_GetFilterParameters IXAudio2Voice_GetFilterParameters
+#define IXAudio2SourceVoice_SetOutputFilterParameters IXAudio2Voice_SetOutputFilterParameters
+#define IXAudio2SourceVoice_GetOutputFilterParameters IXAudio2Voice_GetOutputFilterParameters
+#define IXAudio2SourceVoice_SetVolume IXAudio2Voice_SetVolume
+#define IXAudio2SourceVoice_GetVolume IXAudio2Voice_GetVolume
+#define IXAudio2SourceVoice_SetChannelVolumes IXAudio2Voice_SetChannelVolumes
+#define IXAudio2SourceVoice_GetChannelVolumes IXAudio2Voice_GetChannelVolumes
+#define IXAudio2SourceVoice_SetOutputMatrix IXAudio2Voice_SetOutputMatrix
+#define IXAudio2SourceVoice_GetOutputMatrix IXAudio2Voice_GetOutputMatrix
+#define IXAudio2SourceVoice_DestroyVoice IXAudio2Voice_DestroyVoice
+#define IXAudio2SourceVoice_Start(This,Flags,OperationSet) ((This)->lpVtbl->Start(This,Flags,OperationSet))
+#define IXAudio2SourceVoice_Stop(This,Flags,OperationSet) ((This)->lpVtbl->Stop(This,Flags,OperationSet))
+#define IXAudio2SourceVoice_SubmitSourceBuffer(This,pBuffer,pBufferWMA) ((This)->lpVtbl->SubmitSourceBuffer(This,pBuffer,pBufferWMA))
+#define IXAudio2SourceVoice_FlushSourceBuffers(This) ((This)->lpVtbl->FlushSourceBuffers(This))
+#define IXAudio2SourceVoice_Discontinuity(This) ((This)->lpVtbl->Discontinuity(This))
+#define IXAudio2SourceVoice_ExitLoop(This,OperationSet) ((This)->lpVtbl->ExitLoop(This,OperationSet))
+#define IXAudio2SourceVoice_GetState(This,pVoiceState,Flags) ((This)->lpVtbl->GetState(This,pVoiceState,Flags))
+#define IXAudio2SourceVoice_SetFrequencyRatio(This,Ratio,OperationSet) ((This)->lpVtbl->SetFrequencyRatio(This,Ratio,OperationSet))
+#define IXAudio2SourceVoice_GetFrequencyRatio(This,pRatio) ((This)->lpVtbl->GetFrequencyRatio(This,pRatio))
+#define IXAudio2SourceVoice_SetSourceSampleRate(This,NewSourceSampleRate) ((This)->lpVtbl->SetSourceSampleRate(This,NewSourceSampleRate))
+
+// IXAudio2SubmixVoice
+#define IXAudio2SubmixVoice_GetVoiceDetails IXAudio2Voice_GetVoiceDetails
+#define IXAudio2SubmixVoice_SetOutputVoices IXAudio2Voice_SetOutputVoices
+#define IXAudio2SubmixVoice_SetEffectChain IXAudio2Voice_SetEffectChain
+#define IXAudio2SubmixVoice_EnableEffect IXAudio2Voice_EnableEffect
+#define IXAudio2SubmixVoice_DisableEffect IXAudio2Voice_DisableEffect
+#define IXAudio2SubmixVoice_GetEffectState IXAudio2Voice_GetEffectState
+#define IXAudio2SubmixVoice_SetEffectParameters IXAudio2Voice_SetEffectParameters
+#define IXAudio2SubmixVoice_GetEffectParameters IXAudio2Voice_GetEffectParameters
+#define IXAudio2SubmixVoice_SetFilterParameters IXAudio2Voice_SetFilterParameters
+#define IXAudio2SubmixVoice_GetFilterParameters IXAudio2Voice_GetFilterParameters
+#define IXAudio2SubmixVoice_SetOutputFilterParameters IXAudio2Voice_SetOutputFilterParameters
+#define IXAudio2SubmixVoice_GetOutputFilterParameters IXAudio2Voice_GetOutputFilterParameters
+#define IXAudio2SubmixVoice_SetVolume IXAudio2Voice_SetVolume
+#define IXAudio2SubmixVoice_GetVolume IXAudio2Voice_GetVolume
+#define IXAudio2SubmixVoice_SetChannelVolumes IXAudio2Voice_SetChannelVolumes
+#define IXAudio2SubmixVoice_GetChannelVolumes IXAudio2Voice_GetChannelVolumes
+#define IXAudio2SubmixVoice_SetOutputMatrix IXAudio2Voice_SetOutputMatrix
+#define IXAudio2SubmixVoice_GetOutputMatrix IXAudio2Voice_GetOutputMatrix
+#define IXAudio2SubmixVoice_DestroyVoice IXAudio2Voice_DestroyVoice
+
+// IXAudio2MasteringVoice
+#define IXAudio2MasteringVoice_GetVoiceDetails IXAudio2Voice_GetVoiceDetails
+#define IXAudio2MasteringVoice_SetOutputVoices IXAudio2Voice_SetOutputVoices
+#define IXAudio2MasteringVoice_SetEffectChain IXAudio2Voice_SetEffectChain
+#define IXAudio2MasteringVoice_EnableEffect IXAudio2Voice_EnableEffect
+#define IXAudio2MasteringVoice_DisableEffect IXAudio2Voice_DisableEffect
+#define IXAudio2MasteringVoice_GetEffectState IXAudio2Voice_GetEffectState
+#define IXAudio2MasteringVoice_SetEffectParameters IXAudio2Voice_SetEffectParameters
+#define IXAudio2MasteringVoice_GetEffectParameters IXAudio2Voice_GetEffectParameters
+#define IXAudio2MasteringVoice_SetFilterParameters IXAudio2Voice_SetFilterParameters
+#define IXAudio2MasteringVoice_GetFilterParameters IXAudio2Voice_GetFilterParameters
+#define IXAudio2MasteringVoice_SetOutputFilterParameters IXAudio2Voice_SetOutputFilterParameters
+#define IXAudio2MasteringVoice_GetOutputFilterParameters IXAudio2Voice_GetOutputFilterParameters
+#define IXAudio2MasteringVoice_SetVolume IXAudio2Voice_SetVolume
+#define IXAudio2MasteringVoice_GetVolume IXAudio2Voice_GetVolume
+#define IXAudio2MasteringVoice_SetChannelVolumes IXAudio2Voice_SetChannelVolumes
+#define IXAudio2MasteringVoice_GetChannelVolumes IXAudio2Voice_GetChannelVolumes
+#define IXAudio2MasteringVoice_SetOutputMatrix IXAudio2Voice_SetOutputMatrix
+#define IXAudio2MasteringVoice_GetOutputMatrix IXAudio2Voice_GetOutputMatrix
+#define IXAudio2MasteringVoice_DestroyVoice IXAudio2Voice_DestroyVoice
+#define IXAudio2MasteringVoice_GetChannelMask(This,pChannelMask) ((This)->lpVtbl->GetChannelMask(This,pChannelMask))
+
+#endif // #ifndef __cplusplus
+
+
+/**************************************************************************
+ *
+ * Utility functions used to convert from pitch in semitones and volume
+ * in decibels to the frequency and amplitude ratio units used by XAudio2.
+ * These are only defined if the client #defines XAUDIO2_HELPER_FUNCTIONS
+ * prior to #including xaudio2.h.
+ *
+ **************************************************************************/
+
+#ifdef XAUDIO2_HELPER_FUNCTIONS
+
+#define _USE_MATH_DEFINES // Make math.h define M_PI
+#include <math.h> // For powf, log10f, sinf and asinf
+
+// Calculate the argument to SetVolume from a decibel value
+__inline float XAudio2DecibelsToAmplitudeRatio(float Decibels)
+{
+ return powf(10.0f, Decibels / 20.0f);
+}
+
+// Recover a volume in decibels from an amplitude factor
+__inline float XAudio2AmplitudeRatioToDecibels(float Volume)
+{
+ if (Volume == 0)
+ {
+ return -3.402823466e+38f; // Smallest float value (-FLT_MAX)
+ }
+ return 20.0f * log10f(Volume);
+}
+
+// Calculate the argument to SetFrequencyRatio from a semitone value
+__inline float XAudio2SemitonesToFrequencyRatio(float Semitones)
+{
+ // FrequencyRatio = 2 ^ Octaves
+ // = 2 ^ (Semitones / 12)
+ return powf(2.0f, Semitones / 12.0f);
+}
+
+// Recover a pitch in semitones from a frequency ratio
+__inline float XAudio2FrequencyRatioToSemitones(float FrequencyRatio)
+{
+ // Semitones = 12 * log2(FrequencyRatio)
+ // = 12 * log2(10) * log10(FrequencyRatio)
+ return 39.86313713864835f * log10f(FrequencyRatio);
+}
+
+// Convert from filter cutoff frequencies expressed in Hertz to the radian
+// frequency values used in XAUDIO2_FILTER_PARAMETERS.Frequency, state-variable
+// filter types only. Use XAudio2CutoffFrequencyToOnePoleCoefficient() for one-pole filter types.
+// Note that the highest CutoffFrequency supported is SampleRate/6.
+// Higher values of CutoffFrequency will return XAUDIO2_MAX_FILTER_FREQUENCY.
+__inline float XAudio2CutoffFrequencyToRadians(float CutoffFrequency, UINT32 SampleRate)
+{
+ if ((UINT32)(CutoffFrequency * 6.0f) >= SampleRate)
+ {
+ return XAUDIO2_MAX_FILTER_FREQUENCY;
+ }
+ return 2.0f * sinf((float)M_PI * CutoffFrequency / SampleRate);
+}
+
+// Convert from radian frequencies back to absolute frequencies in Hertz
+__inline float XAudio2RadiansToCutoffFrequency(float Radians, float SampleRate)
+{
+ return SampleRate * asinf(Radians / 2.0f) / (float)M_PI;
+}
+
+// Convert from filter cutoff frequencies expressed in Hertz to the filter
+// coefficients used with XAUDIO2_FILTER_PARAMETERS.Frequency,
+// LowPassOnePoleFilter and HighPassOnePoleFilter filter types only.
+// Use XAudio2CutoffFrequencyToRadians() for state-variable filter types.
+__inline float XAudio2CutoffFrequencyToOnePoleCoefficient(float CutoffFrequency, UINT32 SampleRate)
+{
+ if ((UINT32)CutoffFrequency >= SampleRate)
+ {
+ return XAUDIO2_MAX_FILTER_FREQUENCY;
+ }
+ return ( 1.0f - powf(1.0f - 2.0f * CutoffFrequency / SampleRate, 2.0f) );
+}
+
+
+#endif // #ifdef XAUDIO2_HELPER_FUNCTIONS
+
+
+/**************************************************************************
+ *
+ * XAudio2Create: Top-level function that creates an XAudio2 instance.
+ *
+ * ARGUMENTS:
+ *
+ * Flags - Flags specifying the XAudio2 object's behavior. Currently
+ * unused, must be set to 0.
+ *
+ * XAudio2Processor - An XAUDIO2_PROCESSOR value that specifies the
+ * hardware threads (Xbox) or processors (Windows) that XAudio2
+ * will use. Note that XAudio2 supports concurrent processing on
+ * multiple threads, using any combination of XAUDIO2_PROCESSOR
+ * flags. The values are platform-specific; platform-independent
+ * code can use XAUDIO2_DEFAULT_PROCESSOR to use the default on
+ * each platform.
+ *
+ **************************************************************************/
+
+#if (defined XAUDIO2_EXPORT)
+ // We're building xaudio2.dll
+ #define XAUDIO2_STDAPI extern "C" __declspec(dllexport) HRESULT __stdcall
+#elif (defined DX_BUILD)
+ // We're building xaudio2 as a static library
+ #define XAUDIO2_STDAPI STDAPI
+#else
+ // We're an xaudio2 client
+ #define XAUDIO2_STDAPI extern "C" __declspec(dllimport) HRESULT __stdcall
+#endif
+
+XAUDIO2_STDAPI XAudio2Create(_Outptr_ IXAudio2** ppXAudio2, UINT32 Flags X2DEFAULT(0),
+ XAUDIO2_PROCESSOR XAudio2Processor X2DEFAULT(XAUDIO2_DEFAULT_PROCESSOR));
+
+// Undo the #pragma pack(push, 1) directive at the top of this file
+#pragma pack(pop)
+
+#endif // #ifndef GUID_DEFS_ONLY
+
+#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) */
+#pragma endregion
+
+#endif // #ifndef __XAUDIO2_INCLUDED__
+
diff --git a/hash/atom_cass.xml b/hash/atom_cass.xml
new file mode 100644
index 00000000000..304d4c884ea
--- /dev/null
+++ b/hash/atom_cass.xml
@@ -0,0 +1,481 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
+
+<!-- Acorn Atom - Cassette images -->
+
+<softwarelist name="atom_cass" description="Acorn Atom cassettes">
+
+ <software name="747">
+ <description>747 (12K)</description>
+ <year>1981</year>
+ <publisher>Bug Byte</publisher>
+ <part name="cass1" interface="atom_cass">
+ <dataarea name="cass" size="4252">
+ <rom name="747(bugbyte).hq.uef" size="4252" crc="098b61ec" sha1="e819e5e7a85e481bb21d1332140bae702615eb9d" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="adventre">
+ <description>Adventure (12K)</description>
+ <year>1981</year>
+ <publisher>Program Power</publisher>
+ <part name="cass1" interface="atom_cass">
+ <dataarea name="cass" size="4505">
+ <rom name="adventure(programpower).hq.uef" size="4505" crc="31b5e31c" sha1="8c91aa7a353e03b4ec607c1e616a5cdafe80ed35" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="adventrs">
+ <description>Adventures (Adventure/Dungeon/House/Intergalactic)</description>
+ <year>1981</year>
+ <publisher>Acornsoft</publisher>
+ <part name="cass1" interface="atom_cass">
+ <dataarea name="cass" size="13965">
+ <rom name="adventures(acornsoft).hq.uef" size="13965" crc="18e3d1d4" sha1="6513f6951f34c64555027615f0afdc18987f2e38" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="africadi">
+ <description>The Africa Diamond (10K)</description>
+ <year>1982</year>
+ <publisher>Ramtronics</publisher>
+ <part name="cass1" interface="atom_cass">
+ <dataarea name="cass" size="7512">
+ <rom name="africadiamond(ramtronics).hq.uef" size="7512" crc="1c80dbe5" sha1="1682c82b2892f7ebdd80673ab313f17b4138fbee" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="atdbase">
+ <description>Atom Database</description>
+ <year>1980</year>
+ <publisher>Acornsoft</publisher>
+ <part name="cass1" interface="atom_cass">
+ <dataarea name="cass" size="4389">
+ <rom name="database(acornsoft).hq.uef" size="4389" crc="d4fcb5d8" sha1="1568a25063197149792e3aa7c1f4b16b7e050e79" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="atstore">
+ <description>AtomStore (12K)</description>
+ <year>1981</year>
+ <publisher>Program Power</publisher>
+ <part name="cass1" interface="atom_cass">
+ <dataarea name="cass" size="3517">
+ <rom name="atomstore(programpower).hq.uef" size="3517" crc="6604a70b" sha1="fd0b98ca8415591111cbb5ab188eefb40733f5f8" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="atsynth">
+ <description>Atom Synthesiser (5K)</description>
+ <year>1981</year>
+ <publisher>Acornsoft</publisher>
+ <part name="cass1" interface="atom_cass">
+ <dataarea name="cass" size="4663">
+ <rom name="synthesiser(acornsoft).hq.uef" size="4663" crc="8dbbdca0" sha1="4f12bad56fe7c4b5a10471a0d1e164100158ce94" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="breakout">
+ <description>Breakout (4K)</description>
+ <year>1981</year>
+ <publisher>Bug Byte</publisher>
+ <part name="cass1" interface="atom_cass">
+ <dataarea name="cass" size="3460">
+ <rom name="breakout(bugbyte).hq.uef" size="3460" crc="36b837d3" sha1="774f827ffb97d29831b29985b7c79bcece525cbc" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="busgame">
+ <description>Business Game</description>
+ <year>1982</year>
+ <publisher>Program Power</publisher>
+ <part name="cass1" interface="atom_cass">
+ <dataarea name="cass" size="3459">
+ <rom name="businessgame(programpower).hq.uef" size="3459" crc="c2e72bbb" sha1="4acdf3e491aba4a0bf22f2f9bebb546e3487c089" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="centiped">
+ <description>Centipede</description>
+ <year>198?</year>
+ <publisher>Micromania</publisher>
+ <part name="cass1" interface="atom_cass">
+ <dataarea name="cass" size="4067">
+ <rom name="centipede(micromania).hq.uef" size="4067" crc="f4e450e7" sha1="88c83eeec83dbfe5507e308c6a7c3476fa47c66a" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="chuckie">
+ <description>Atomic Chuckie Egg (32K)</description>
+ <year>2012</year>
+ <publisher>Retro Software</publisher>
+ <info name="author" value="Kees van Oss" />
+ <info name="usage" value="Load with *RUN&quot;CHUCKIE&quot;" />
+ <part name="cass1" interface="atom_cass">
+ <feature name="part_id" value="Monochrome"/>
+ <dataarea name="cass" size="9070">
+ <rom name="mchuck.uef" size="9070" crc="0ccd10cd" sha1="2c33026fc6a64ea30197e44896ce4f763183d14b" offset="0" />
+ </dataarea>
+ </part>
+ <part name="cass2" interface="atom_cass">
+ <feature name="part_id" value="Colour"/>
+ <dataarea name="cass" size="9062">
+ <rom name="cchuck.uef" size="9062" crc="ab4b3a62" sha1="4240d4401c61fac78c9c8b7ce8a12b56266654d8" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="deathsat">
+ <description>Death Satellite (12K)</description>
+ <year>1982</year>
+ <publisher>A&amp;F Software</publisher>
+ <part name="cass1" interface="atom_cass">
+ <dataarea name="cass" size="10114">
+ <rom name="deathsatellite(anf).hq.uef" size="10114" crc="2c303b50" sha1="c8a7a9fba2c9913c8d0ffd3b0296f6742109a4e1" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="defender">
+ <description>Defender</description>
+ <year>1982</year>
+ <publisher>Micromania</publisher>
+ <part name="cass1" interface="atom_cass">
+ <dataarea name="cass" size="4424">
+ <rom name="defender(micromania).hq.uef" size="4424" crc="15a7abd3" sha1="4d7c788787b8e98c6a5d5317a82b5b5081c370ce" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="demondun">
+ <description>Demon Dungeon (5K)</description>
+ <year>1980</year>
+ <publisher>Program Power</publisher>
+ <part name="cass1" interface="atom_cass">
+ <dataarea name="cass" size="5116">
+ <rom name="demondungeon(programpower).hq.uef" size="5116" crc="3f82cb6f" sha1="326b7b29a56735df61c4f75e3cb5899be85b1e5f" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gala">
+ <description>Galaforce (32K)</description>
+ <year>2012</year>
+ <publisher>Retro Software</publisher>
+ <info name="author" value="Kees van Oss" />
+ <info name="usage" value="Load with *RUN&quot;LOADER&quot;" />
+ <part name="cass1" interface="atom_cass">
+ <feature name="part_id" value="Monochrome"/>
+ <dataarea name="cass" size="9913">
+ <rom name="mgala.uef" size="9913" crc="71ce39de" sha1="83519ddabf85255a3fb222e8946300ae1ebe11c8" offset="0" />
+ </dataarea>
+ </part>
+ <part name="cass2" interface="atom_cass">
+ <feature name="part_id" value="Colour"/>
+ <dataarea name="cass" size="9933">
+ <rom name="cgala.uef" size="9933" crc="49582b6a" sha1="7eae37d834cc79f5d066fe0f8b465f629bf6b279" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="galaxian">
+ <description>Galaxian (12K)</description>
+ <year>1981</year>
+ <publisher>Bug Byte</publisher>
+ <part name="cass1" interface="atom_cass">
+ <dataarea name="cass" size="4106">
+ <rom name="galaxian(bugbyte).hq.uef" size="4106" crc="da761b61" sha1="88fd7efe9a4defa2e593ec713070081e30dfad8f" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gamepk1">
+ <description>Games Pack 1 (Asteroids/Sub Hunt/Breakout)</description>
+ <year>1981</year>
+ <publisher>Acornsoft</publisher>
+ <part name="cass1" interface="atom_cass">
+ <dataarea name="cass" size="6080">
+ <rom name="gamespack1(acornsoft).hq.uef" size="6080" crc="fe4ed08b" sha1="986348d3b7b4d3f895a21e015f2d89be00f41824" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gamepk3">
+ <description>Games Pack 3 (Rat Trap/Lunar Lander/Black Box)</description>
+ <year>1981</year>
+ <publisher>Acornsoft</publisher>
+ <part name="cass1" interface="atom_cass">
+ <dataarea name="cass" size="5707">
+ <rom name="gamespack3(acornsoft).hq.uef" size="5707" crc="e00f2289" sha1="2715c998002885f355430d6aa61e66610da6c7ae" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gamepk4">
+ <description>Games Pack 4 (Star Trek/Four Row/Space Attack)</description>
+ <year>1981</year>
+ <publisher>Acornsoft</publisher>
+ <part name="cass1" interface="atom_cass">
+ <dataarea name="cass" size="8390">
+ <rom name="gamespack4(acornsoft).hq.uef" size="8390" crc="17255110" sha1="98df80200d5aacd7bf8aa98c60dc74848ad1d028" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gamepk8">
+ <description>Games Pack 8 (Stargate/Gomoku/Robots)</description>
+ <year>1981</year>
+ <publisher>Acornsoft</publisher>
+ <part name="cass1" interface="atom_cass">
+ <dataarea name="cass" size="8659">
+ <rom name="gamespack8(acornsoft).hq.uef" size="8659" crc="6ca83cd1" sha1="b95b10021e5b85f814c4562c92ad1905da470b18" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gamepk9">
+ <description>Games Pack 9 (Snapper/Minotaur/Babies)</description>
+ <year>1981</year>
+ <publisher>Acornsoft</publisher>
+ <part name="cass1" interface="atom_cass">
+ <dataarea name="cass" size="9710">
+ <rom name="gamespack9(acornsoft).hq.uef" size="9710" crc="587742c0" sha1="1b0f064539383c2255cc9a560607c1c7e62c5c7b" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gamepk10">
+ <description>Games Pack 10 (Breakout/Mastermind/Snake/Simon/Moon/Hectic/Ski-Run/Track/Squash/Bombs-Away)</description>
+ <year>1981</year>
+ <publisher>Acornsoft</publisher>
+ <part name="cass1" interface="atom_cass">
+ <dataarea name="cass" size="5389">
+ <rom name="gamespack10(acornsoft).hq.uef" size="5389" crc="329712bb" sha1="2a70142356a601b94324b7bd6127ff71fc915e32" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="hardhath">
+ <description>Hard Hat Harry (32K)</description>
+ <year>2011</year>
+ <publisher>Retro Software</publisher>
+ <info name="author" value="Tom Walker" />
+ <info name="usage" value="Load with *RUN&quot;LOADER&quot;" />
+ <part name="cass1" interface="atom_cass">
+ <dataarea name="cass" size="8911">
+ <rom name="hardhatharry.uef" size="8911" crc="901ca53a" sha1="b195c7ee16da9b91c83f4cd7705e0a250a5a61a4" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="hyperfir">
+ <description>Hyperfire (12K)</description>
+ <year>1982</year>
+ <publisher>Program Power</publisher>
+ <part name="cass1" interface="atom_cass">
+ <dataarea name="cass" size="4245">
+ <rom name="hyperfire(programpower).hq.uef" size="4245" crc="470b61d7" sha1="5000117044c1c9b5c10951f85ffe5b028f8ca4fe" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="hypervpr">
+ <description>Hyper Viper (12K)</description>
+ <year>2011</year>
+ <publisher>Retro Software</publisher>
+ <info name="author" value="Kenton Price" />
+ <info name="usage" value="Load with *RUN&quot;LOADER&quot;" />
+ <part name="cass1" interface="atom_cass">
+ <feature name="part_id" value="Monochrome"/>
+ <dataarea name="cass" size="4055">
+ <rom name="mhyperviper.uef" size="4055" crc="c77e31b1" sha1="0cbf321aa49357371a242127a90d2fe56e712e65" offset="0" />
+ </dataarea>
+ </part>
+ <part name="cass2" interface="atom_cass">
+ <feature name="part_id" value="Colour"/>
+ <dataarea name="cass" size="4053">
+ <rom name="chyperviper.uef" size="4053" crc="f2cdc664" sha1="06834429d0c133ebca1e47aab143bab4aec0dd7f" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="jetsetmn">
+ <description>Jet Set Miner (12K)</description>
+ <year>2009</year>
+ <publisher>Retro Software</publisher>
+ <info name="author" value="Kees van Oss" />
+ <info name="usage" value="Load with *RUN&quot;LOADER&quot;" />
+ <part name="cass1" interface="atom_cass">
+ <feature name="part_id" value="Monochrome"/>
+ <dataarea name="cass" size="3960">
+ <rom name="mjetsetminer.uef" size="3960" crc="08bf1104" sha1="7db984f82f230531ee2485cb602caa13fc9279cb" offset="0" />
+ </dataarea>
+ </part>
+ <part name="cass2" interface="atom_cass">
+ <feature name="part_id" value="Colour"/>
+ <dataarea name="cass" size="4021">
+ <rom name="cjetsetminer.uef" size="4021" crc="d1765c3d" sha1="1ce54ed41b878ba7abf0059785497eb7645430f2" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="joeblade">
+ <description>Atomic Joe Blade (32K)</description>
+ <year>2014</year>
+ <publisher>Retro Software</publisher>
+ <info name="author" value="Kees van Oss" />
+ <info name="usage" value="Load with *RUN&quot;LOADER&quot;" />
+ <part name="cass1" interface="atom_cass">
+ <dataarea name="cass" size="15022">
+ <rom name="joeblade.uef" size="15022" crc="76b7572e" sha1="0079738ca604e6cfbba4016a9e3d6937b6e8f358" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="jungle">
+ <description>Jungle Journey (32K)</description>
+ <year>2012</year>
+ <publisher>Retro Software</publisher>
+ <info name="author" value="Kees van Oss" />
+ <info name="usage" value="Load with *RUN&quot;JUNGLE&quot;" />
+ <part name="cass1" interface="atom_cass">
+ <dataarea name="cass" size="13807">
+ <rom name="jungle.uef" size="13807" crc="d5ed427b" sha1="7d78b13538820e6a39b08da9ea9b0ac6b0dfddfc" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="labyrint">
+ <description>Labyrinth (12K)</description>
+ <year>1981</year>
+ <publisher>Bug Byte</publisher>
+ <part name="cass1" interface="atom_cass">
+ <dataarea name="cass" size="5009">
+ <rom name="labyrinth(bugbyte).hq.uef" size="5009" crc="445a3221" sha1="86cb47e30cddbd36407691abdf8ee46bf1b3d265" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="omegamis">
+ <description>Omega Mission</description>
+ <year>1982</year>
+ <publisher>Micromania</publisher>
+ <part name="cass1" interface="atom_cass">
+ <dataarea name="cass" size="5081">
+ <rom name="omegamission(micromania).hq.uef" size="5081" crc="76fa7cdd" sha1="751466ae1e19788641063540510d61b37ab080df" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="peekocom">
+ <description>Peeko-Computer</description>
+ <year>1981</year>
+ <publisher>Acornsoft</publisher>
+ <part name="cass1" interface="atom_cass">
+ <dataarea name="cass" size="4483">
+ <rom name="peekocomputer(acornsoft).hq.uef" size="4483" crc="0c74b9c7" sha1="bf804a058a5012b12d3b4c9dbc44d885c42e1c8c" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pinball">
+ <description>Pinball (6K)</description>
+ <year>1980</year>
+ <publisher>Bug Byte</publisher>
+ <part name="cass1" interface="atom_cass">
+ <dataarea name="cass" size="4501">
+ <rom name="pinball(bugbyte).hq.uef" size="4501" crc="29501b59" sha1="0cd917188dd3bd22a1c7d5804bdf872a86ea694e" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="protectr">
+ <description>The Protector</description>
+ <year>1982</year>
+ <publisher>Micromania</publisher>
+ <part name="cass1" interface="atom_cass">
+ <dataarea name="cass" size="3726">
+ <rom name="protector(micromania).hq.uef" size="3726" crc="dc0a2ac4" sha1="19e24ab434f3fcdba79425a58e263d9405d46f91" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="repton">
+ <description>Repton (32K)</description>
+ <year>2013</year>
+ <publisher>Retro Software</publisher>
+ <info name="author" value="Kees van Oss" />
+ <info name="usage" value="Load with *RUN&quot;LOADER&quot;" />
+ <part name="cass1" interface="atom_cass">
+ <dataarea name="cass" size="14895">
+ <rom name="repton.uef" size="14895" crc="1a69941a" sha1="ce3fc486457f1b51b1a4bde83e25936201bb63dd" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="spfightr">
+ <description>Space Fighter (6K)</description>
+ <year>1981</year>
+ <publisher>Program Power</publisher>
+ <part name="cass1" interface="atom_cass">
+ <dataarea name="cass" size="4341">
+ <rom name="spacefighter(programpower).hq.uef" size="4341" crc="4783c679" sha1="ef2591d569a0ddece32020e7328d721eef573ee5" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="swarm">
+ <description>Swarm</description>
+ <year>1981</year>
+ <publisher>Program Power</publisher>
+ <part name="cass1" interface="atom_cass">
+ <dataarea name="cass" size="3800">
+ <rom name="swarm(programpower).hq.uef" size="3800" crc="9e6706e9" sha1="563811e318bad804b874089fa2733906104494c0" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="typist">
+ <description>Atom Typist (7K)</description>
+ <year>1981</year>
+ <publisher>Bug Byte</publisher>
+ <part name="cass1" interface="atom_cass">
+ <dataarea name="cass" size="3136">
+ <rom name="atomtypist(bugbyte).hq.uef" size="3136" crc="4339f00b" sha1="92ae659767cf0cf3fb3e747088620cce2b7132a4" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ufobombr">
+ <description>UFO Bomber (7K)</description>
+ <year>1981</year>
+ <publisher>Bug Byte</publisher>
+ <part name="cass1" interface="atom_cass">
+ <dataarea name="cass" size="3309">
+ <rom name="ufobomber(bugbyte).hq.uef" size="3309" crc="660cc687" sha1="d8ec60072e596628171e132dea978a5190c9030b" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="zodiac">
+ <description>Zodiac (12K)</description>
+ <year>1981</year>
+ <publisher>A&amp;F Software</publisher>
+ <part name="cass1" interface="atom_cass">
+ <dataarea name="cass" size="7969">
+ <rom name="zodiac(anf).hq.uef" size="7969" crc="2d3e6f50" sha1="75342bca3fb0560b08964280457493b59f6f3120" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+</softwarelist>
diff --git a/hash/atom_flop.xml b/hash/atom_flop.xml
new file mode 100644
index 00000000000..b82207f023b
--- /dev/null
+++ b/hash/atom_flop.xml
@@ -0,0 +1,146 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
+
+<!-- Acorn Atom - Floppy disk images -->
+
+<!-- Loading Instructions:
+
+ *DOS - enters the DOS. The LOAD and SAVE commands apply now to disk, not cassette. Use the BREAK key to return to the cassette basic.
+ *DIR - load the directory information into a buffer (but does not show it). This is a sort of mount command.
+ *CAT - prints the directory information from the buffer on the screen. If the disk was spinning, an implicit *DIR is executed.
+
+-->
+
+<softwarelist name="atom_flop" description="Acorn Atom disk images">
+
+ <software name="chuckie">
+ <description>Atomic Chuckie Egg (32K)</description>
+ <year>2012</year>
+ <publisher>Retro Software</publisher>
+ <info name="author" value="Kees van Oss" />
+ <info name="usage" value="Load with *RUN&quot;runme&quot;" />
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="102400">
+ <rom name="chuckie.dsk" size="102400" crc="1241ac5d" sha1="4ef6e1a18af27c922003415abb69987d54efe391" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gala">
+ <description>Galaforce (32K)</description>
+ <year>2012</year>
+ <publisher>Retro Software</publisher>
+ <info name="author" value="Kees van Oss" />
+ <info name="usage" value="Load with *RUN&quot;runme&quot;" />
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="102400">
+ <rom name="gala.dsk" size="102400" crc="db52a3ae" sha1="ffece5ae2295818f649735c5b7711e740dfe4731" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="hardhath">
+ <description>Hard Hat Harry (32K)</description>
+ <year>2011</year>
+ <publisher>Retro Software</publisher>
+ <info name="author" value="Tom Walker" />
+ <info name="usage" value="Load with *RUN&quot;LOADER&quot;" />
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="102400">
+ <rom name="hardhatharry.dsk" size="102400" crc="654cadd3" sha1="fd2f6ff91bfb105b5eb866562d23f3a6edc91276" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="hypervpr">
+ <description>Hyper Viper (12K)</description>
+ <year>2011</year>
+ <publisher>Retro Software</publisher>
+ <info name="author" value="Kenton Price" />
+ <info name="usage" value="Load with *RUN&quot;LOADER&quot;" />
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="102400">
+ <rom name="hyperviper.dsk" size="102400" crc="401dadb9" sha1="ece2cf9d7740c0266ebe5072dd298e9811dd0f47" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="jetsetmn">
+ <description>Jet Set Miner (12K)</description>
+ <year>2009</year>
+ <publisher>Retro Software</publisher>
+ <info name="author" value="Kees van Oss" />
+ <info name="usage" value="Load with *RUN&quot;LOADER&quot;" />
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="102400">
+ <rom name="jetsetminer.dsk" size="102400" crc="de1a54f2" sha1="62d97d25fb748ee72ee972ad42c30f69d31ec5e0" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="jsw">
+ <description>Jet Set Willy (32K)</description>
+ <year>2015</year>
+ <publisher>Retro Software</publisher>
+ <info name="author" value="Kees van Oss" />
+ <info name="usage" value="Load with *RUN&quot;JSWRUN&quot;" />
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="102400">
+ <rom name="jsw.dsk" size="102400" crc="01625c6a" sha1="ee1f5cc7e21cbc7044d4b6741b144facf45130e7" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="jsw2">
+ <description>Jet Set Willy 2 (32K)</description>
+ <year>2015</year>
+ <publisher>Retro Software</publisher>
+ <info name="author" value="Kees van Oss" />
+ <info name="usage" value="Load with *RUN&quot;JSW2RUN&quot;" />
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="102400">
+ <rom name="jsw2.dsk" size="102400" crc="28566aed" sha1="394859c86d20d404a210e984b759c067aa2dc67d" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="joeblade">
+ <description>Atomic Joe Blade (32K)</description>
+ <year>2014</year>
+ <publisher>Retro Software</publisher>
+ <info name="author" value="Kees van Oss" />
+ <info name="usage" value="Load with *RUN&quot;JOE&quot;" />
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="102400">
+ <rom name="joeblade.dsk" size="102400" crc="6b5fc7a5" sha1="58c812c2bdecc358e0a127d470ee26aa0c190262" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="jungle">
+ <description>Jungle Journey (32K)</description>
+ <year>2012</year>
+ <publisher>Retro Software</publisher>
+ <info name="author" value="Kees van Oss" />
+ <info name="usage" value="Load with *RUN&quot;runme&quot;" />
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="102400">
+ <rom name="jungle.dsk" size="102400" crc="92c50fe2" sha1="a6ffbdbf0f2f7b5c4038d44632a14e1b89682db0" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="repton">
+ <description>Repton (32K)</description>
+ <year>2013</year>
+ <publisher>Retro Software</publisher>
+ <info name="author" value="Kees van Oss" />
+ <info name="usage" value="Load with *RUN&quot;runme&quot;" />
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="102400">
+ <rom name="repton.dsk" size="102400" crc="17cebe3d" sha1="0657e2bb63ba46e0de7e21abca5cab6dcdf666d1" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+</softwarelist>
diff --git a/hash/atom.xml b/hash/atom_rom.xml
index 3c30d60b338..bb4eb423942 100644
--- a/hash/atom.xml
+++ b/hash/atom_rom.xml
@@ -8,9 +8,10 @@
- axr2 (APP Laboratories)
-->
-<softwarelist name="atom" description="Acorn Atom expansion ROMs">
+<softwarelist name="atom_rom" description="Acorn Atom expansion ROMs">
+
<software name="josbox">
- <description>Atom Extension ROM AXR1</description>
+ <description>AXR1</description>
<year>198?</year>
<publisher>ECD Computer Workshop</publisher>
<part name="cart" interface="atom_cart">
@@ -21,7 +22,7 @@
</software>
<software name="pcharme">
- <description>P-Charme</description>
+ <description>P-Charme Interpreter</description>
<year>1984</year>
<publisher>Frans van Hoesel</publisher>
<part name="cart" interface="atom_cart">
@@ -55,8 +56,8 @@
<software name="afuk">
<description>A&amp;F Utility Kit</description>
- <year>198?</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <year>1982</year>
+ <publisher>A&amp;F Software</publisher>
<part name="cart" interface="atom_cart">
<dataarea name="rom" size="4096">
<rom name="utilikit.rom" size="4096" crc="013b8f93" sha1="b4341f116a6d1e0cbcd39d64e0b5d14a90dc0356" offset="0" />
@@ -100,7 +101,7 @@
<software name="windows">
<description>Atomic Windows v1.0</description>
<year>198?</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <publisher>Kees van Oss</publisher>
<part name="cart" interface="atom_cart">
<dataarea name="rom" size="4096">
<rom name="atomicw.rom" size="4096" crc="a3fd737d" sha1="d418d9322c69c49106ed2c268ad0864c0f2c4c1b" offset="0" />
diff --git a/hash/bbc_32016_flop.xml b/hash/bbc_flop_32016.xml
index f7c354aab39..bec6703922b 100644
--- a/hash/bbc_32016_flop.xml
+++ b/hash/bbc_flop_32016.xml
@@ -8,7 +8,7 @@
Hold down the SHIFT key and press and release the BREAK key.
-->
-<softwarelist name="bbc_32016_flop" description="32016 Co-Processor Discs">
+<softwarelist name="bbc_flop_32016" description="32016 Co-Processor Discs">
<software name="panos11" cloneof="panos14" supported="no">
<description>PanOS Version 1.10 System Disks</description>
diff --git a/hash/bbc_flop_6502.xml b/hash/bbc_flop_6502.xml
new file mode 100644
index 00000000000..51b0c9863fe
--- /dev/null
+++ b/hash/bbc_flop_6502.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
+
+<!-- BBC Micro - 6502 Co-Processor Discs -->
+
+<!-- Loading Instructions:
+
+ Hold down the SHIFT key and press and release the BREAK key.
+-->
+
+<softwarelist name="bbc_flop_6502" description="6502 Co-Processor Discs">
+
+ <software name="6502dev" supported="no">
+ <description>6502 Development Package</description>
+ <year>1985</year>
+ <publisher>Acornsoft</publisher>
+ <info name="release" value="SNL05" />
+ <info name="compatibility" value="6502 co-processor" />
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="53760">
+ <rom name="6502development.ssd" size="53760" crc="219eefd1" sha1="d408d6d14d442c9e77be78fecef4b223e0c2404f" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bitstik1" supported="no">
+ <description>Bitstik Graphics System</description>
+ <year>1984</year>
+ <publisher>Acorn</publisher>
+ <info name="release" value="ANF04" />
+ <info name="compatibility" value="6502 co-processor" />
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="System Master Disc"/>
+ <dataarea name="flop" size="204800">
+ <rom name="bitstik1.0_system_master.ssd" size="204800" crc="77996ac8" sha1="0de49dc2535dfe27915a58dfc71729ecd14f7515" offset="0" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Buffer Disc"/>
+ <dataarea name="flop" size="204800">
+ <rom name="bitstik1.0_buffer.ssd" size="204800" crc="2a58f413" sha1="2ab1f5da153d40517a9e68bcaf3e579b373d2dc6" offset="0" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Introductory Library Disc 252/253"/>
+ <dataarea name="flop" size="409600">
+ <rom name="bitstik1.0_introductory_library.ssd" size="409600" crc="bba2cbdc" sha1="ec73cc3225b3d35285377b143c5d34213a46716d" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bitstik2" supported="no">
+ <description>Bitstik 2</description>
+ <year>1985</year>
+ <publisher>Robo Systems</publisher>
+ <info name="compatibility" value="6502 co-processor" />
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Introductory Library Disc Vol.1"/>
+ <dataarea name="flop" size="204800">
+ <rom name="bitstik2.0_library_vol1.ssd" size="204800" crc="2d2ece29" sha1="390fcfee6efb7bf980d1a94dee03db42b8a34cba" offset="0" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Introductory Library Disc Vol.2"/>
+ <dataarea name="flop" size="204800">
+ <rom name="bitstik2.0_library_vol2.ssd" size="204800" crc="ddda8667" sha1="268799856bd19c06f4a3125d1f4164429d15e0dd" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="l2fsutil" supported="no">
+ <description>Econet Level 2 Fileserver Software</description>
+ <year>1985</year>
+ <publisher>Acorn</publisher>
+ <info name="release" value="AES21" />
+ <info name="compatibility" value="6502 co-processor" />
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="204800">
+ <rom name="econet_level_2_utils.ssd" size="204800" crc="c7039167" sha1="37a52b17138c1d84301ed23a04456939810f103c" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+</softwarelist>
diff --git a/hash/bbc_65c102_flop.xml b/hash/bbc_flop_65c102.xml
index 9770296374c..efc30b3f5e9 100644
--- a/hash/bbc_65c102_flop.xml
+++ b/hash/bbc_flop_65c102.xml
@@ -8,7 +8,7 @@
Hold down the SHIFT key and press and release the BREAK key.
-->
-<softwarelist name="bbc_65c102_flop" description="65C102 Co-Processor Discs">
+<softwarelist name="bbc_flop_65c102" description="65C102 Co-Processor Discs">
<software name="coprosup" supported="no">
<description>BBC Master 65C102 Co-Processor Support Disc</description>
diff --git a/hash/bbc_68000_flop.xml b/hash/bbc_flop_68000.xml
index 0f5a23c557b..3c20855b6ae 100644
--- a/hash/bbc_68000_flop.xml
+++ b/hash/bbc_flop_68000.xml
@@ -8,28 +8,28 @@
Hold down the SHIFT key and press and release the BREAK key.
-->
-<softwarelist name="bbc_68000_flop" description="68000 Co-Processor Discs">
+<softwarelist name="bbc_flop_68000" description="68000 Co-Processor Discs">
<software name="casper" supported="no">
<description>Casper Support Discs</description>
<year>1986</year>
- <publisher>Delcomm</publisher>
+ <publisher>Crombie Anderson Associates</publisher>
<info name="format" value="DFS" />
<info name="compatibility" value="68000 co-processor" />
<part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Casper Control C Version 0.1"/>
+ <feature name="part_id" value="Casper Control C Version 0_1"/>
<dataarea name="flop" size="204800">
<rom name="casper control c version 0_1.ssd" size="204800" crc="f92958ef" sha1="3b68a54befb002e26c7a30a1d8f42dfae2b2f501" offset="0" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Casper System Disc Version 2.2"/>
+ <feature name="part_id" value="Casper System Disc Version 2_2"/>
<dataarea name="flop" size="204800">
<rom name="casper system disc version 2_2.ssd" size="204800" crc="fa48e7e1" sha1="a3dffefdc13e4a44ec4e57b1cad27e912abdcd15" offset="0" />
</dataarea>
</part>
<part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Casper Test Disc Version 2.2"/>
+ <feature name="part_id" value="Casper Test Disc Version 2_2"/>
<dataarea name="flop" size="204800">
<rom name="casper test disc version 2_2.ssd" size="204800" crc="67c43659" sha1="83b0361ab7908584aaedb9f5a42e9cf5c3cc6c1d" offset="0" />
</dataarea>
diff --git a/hash/bbc_80186_flop.xml b/hash/bbc_flop_80186.xml
index 5e3fcae4e83..2805986c240 100644
--- a/hash/bbc_80186_flop.xml
+++ b/hash/bbc_flop_80186.xml
@@ -8,7 +8,7 @@
Hold down the SHIFT key and press and release the BREAK key.
-->
-<softwarelist name="bbc_80186_flop" description="80186 Co-Processor Discs">
+<softwarelist name="bbc_flop_80186" description="80186 Co-Processor Discs">
<software name="m512sys" supported="no">
<description>BBC Master 512 System Discs</description>
diff --git a/hash/bbc_arm_flop.xml b/hash/bbc_flop_arm.xml
index 691ed53f12e..a347eb3c19c 100644
--- a/hash/bbc_arm_flop.xml
+++ b/hash/bbc_flop_arm.xml
@@ -8,7 +8,7 @@
Hold down the SHIFT key and press and release the BREAK key.
-->
-<softwarelist name="bbc_arm_flop" description="ARM Co-Processor Discs">
+<softwarelist name="bbc_flop_arm" description="ARM Co-Processor Discs">
<software name="armevals" supported="no">
<description>ARM Evaluation System Discs</description>
diff --git a/hash/bbc_flop_torch.xml b/hash/bbc_flop_torch.xml
new file mode 100644
index 00000000000..cc0612558fb
--- /dev/null
+++ b/hash/bbc_flop_torch.xml
@@ -0,0 +1,172 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
+
+<!-- BBC Micro - Torch Z80 Co-Processor Discs -->
+
+<!-- Loading CPN:
+
+ Reset with Z80 co-processor enabled and Acorn CP/M System Disc 1 in drive 0.
+-->
+
+<softwarelist name="bbc_flop_torch" description="Torch Z80 Co-Processor Discs">
+
+ <software name="advent" supported="no">
+ <description>Adventure B01 - 550 points</description>
+ <year>1984</year>
+ <publisher>Crowther and Woods</publisher>
+ <info name="format" value="CP/M" />
+ <info name="compatibility" value="Torch Z80 co-processor" />
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="409600">
+ <rom name="adventureb01.dsd" size="409600" crc="38be4448" sha1="acadee5c6648f01d84188ea05cba9b2f55fef8e5" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bbcbasic" supported="no">
+ <description>Torch BBC BASIC (Z80) v2.30</description>
+ <year>1984</year>
+ <publisher>Torch</publisher>
+ <info name="release" value="SC02" />
+ <info name="format" value="CP/M" />
+ <info name="compatibility" value="Torch Z80 co-processor" />
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="409600">
+ <rom name="bbcbasic.dsd" size="409600" crc="d72e8582" sha1="6a6080863988810117774d79a5ff94da79a1ef48" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="comanex" supported="no">
+ <description>Comanex</description>
+ <year>1982</year>
+ <publisher>Sapphire Systems</publisher>
+ <info name="format" value="CP/M" />
+ <info name="compatibility" value="Torch Z80 co-processor" />
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="409600">
+ <rom name="comanex.dsd" size="409600" crc="5e457aea" sha1="d5544c6e56c9f6d484890951b7c1a9134df8dcf1" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dbaseii" supported="no">
+ <description>dBASE-II</description>
+ <year>1982</year>
+ <publisher>Torch</publisher>
+ <info name="release" value="SC05" />
+ <info name="format" value="CP/M" />
+ <info name="compatibility" value="Torch Z80 co-processor" />
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="409600">
+ <rom name="dbase_ii.dsd" size="409600" crc="f9dc5794" sha1="5e26e1a4b05f689b95c34e9121019cccafd7a57c" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="hdutils" supported="no">
+ <description>Hard Disc Utilities v4.0</description>
+ <year>1985</year>
+ <publisher>Torch</publisher>
+ <info name="format" value="CP/M" />
+ <info name="compatibility" value="Torch Z80 co-processor" />
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="409600">
+ <rom name="hard_disc_utils.dsd" size="409600" crc="c84cdc5d" sha1="a8134ccb787e831e234731297c719ad94e3ffe2a" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="kermit" supported="no">
+ <description>Kermit-80 v4.05</description>
+ <year>1984</year>
+ <publisher>Columbia University</publisher>
+ <info name="format" value="CP/M" />
+ <info name="compatibility" value="Torch Z80 co-processor" />
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="409600">
+ <rom name="kermit.dsd" size="409600" crc="f48b3ca6" sha1="de7d576f5c0a0e24a5425fb41de8f73f7651d075" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="perfect" supported="no">
+ <description>Perfect Software Suite</description>
+ <year>1983</year>
+ <publisher>Torch</publisher>
+ <info name="format" value="CP/M" />
+ <info name="compatibility" value="Torch Z80 co-processor" />
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Perfect Calc"/>
+ <dataarea name="flop" size="409600">
+ <rom name="perfect_calc.dsd" size="409600" crc="9430ff7a" sha1="5666a290779a8c0151ffe4b84b6b4b80d4c841f9" offset="0" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Perfect Filer"/>
+ <dataarea name="flop" size="409600">
+ <rom name="perfect_filer.dsd" size="409600" crc="749784f6" sha1="020b0eeeb6a9f59ffcbec6dcdd8e14c3a181c25f" offset="0" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Perfect Writer"/>
+ <dataarea name="flop" size="409600">
+ <rom name="perfect_writer.dsd" size="409600" crc="32c1884a" sha1="61b7a8d35ea71529bb494b3123701601cedfc9eb" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="stdutil2" supported="no">
+ <description>Standard Utilities v2.0</description>
+ <year>1984</year>
+ <publisher>Torch</publisher>
+ <info name="format" value="CP/M" />
+ <info name="compatibility" value="Torch Z80 co-processor" />
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="409600">
+ <rom name="standard_utilities_2.dsd" size="409600" crc="6e6feeec" sha1="52033a8e4772a81d5879d3d14c04cc65b5df47cf" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tpascal3" supported="no">
+ <description>Turbo Pascal v3.0A</description>
+ <year>1985</year>
+ <publisher>Borland</publisher>
+ <info name="format" value="CP/M" />
+ <info name="compatibility" value="Torch Z80 co-processor" />
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="409600">
+ <rom name="turbopascal30a.dsd" size="409600" crc="8c3dde20" sha1="15b544b9b7a3cf0369fd7c952fa3c95f741b2fc2" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="unicomm" supported="no">
+ <description>UniComm</description>
+ <year>1984</year>
+ <publisher>Torch</publisher>
+ <info name="format" value="CP/M" />
+ <info name="compatibility" value="Torch Z80 co-processor" />
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="409600">
+ <rom name="unicomms.dsd" size="409600" crc="35dd22b8" sha1="1878284d8aa1610eec80fb91a0a074acc709ec69" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wordstar" supported="no">
+ <description>WordStar</description>
+ <year>1983</year>
+ <publisher>Torch</publisher>
+ <info name="release" value="SC02" />
+ <info name="format" value="CP/M" />
+ <info name="compatibility" value="Torch Z80 co-processor" />
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="409600">
+ <rom name="wordstar.dsd" size="409600" crc="cf3b9c77" sha1="2053ec8a1aead7c392c0e7243e8420699fd43491" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+</softwarelist>
diff --git a/hash/bbc_z80_flop.xml b/hash/bbc_flop_z80.xml
index 548ed9bfdd8..f6e9dd91f27 100644
--- a/hash/bbc_z80_flop.xml
+++ b/hash/bbc_flop_z80.xml
@@ -8,7 +8,7 @@
Reset with Z80 co-processor enabled and Acorn CP/M System Disc 1 in drive 0.
-->
-<softwarelist name="bbc_z80_flop" description="Z80 Co-Processor Discs">
+<softwarelist name="bbc_flop_z80" description="Z80 Co-Processor Discs">
<software name="cpmsys" supported="no">
<description>Acorn CP/M System Discs</description>
diff --git a/hash/bbca_cass.xml b/hash/bbca_cass.xml
index 2b401ad8833..7f4c30586e5 100644
--- a/hash/bbca_cass.xml
+++ b/hash/bbca_cass.xml
@@ -31,7 +31,7 @@
<description>Arcade Action</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G06" />
+ <info name="release" value="SBG06" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="13352">
<rom name="arcadeaction-v2.5(1982)(acornsoft)(g06).uef" size="13352" crc="6c2db1cd" sha1="b86be839f41ce68dc229f4ca84bac63c24326f9a" offset="0"/>
@@ -39,9 +39,21 @@
</part>
</software>
+ <software name="asterbel">
+ <description>Asteroid Belt</description>
+ <year>1982</year>
+ <publisher>Computer Concepts</publisher>
+ <info name="usage" value="Load with *RUN" />
+ <part name="cass" interface="bbc_cass">
+ <dataarea name="cass" size="4713">
+ <rom name="asteroidbelt_run(computerconcepts).uef" size="4713" crc="61b7b9e7" sha1="bd51ec809ac60842bacd6916d6d4c5ce7d431586" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="beebtrek">
<description>Beebtrek</description>
- <year>1982</year>
+ <year>1983</year>
<publisher>Software For All</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="7235">
@@ -61,6 +73,17 @@
</part>
</software>
+ <software name="catmouse">
+ <description>Cat and Mouse</description>
+ <year>1982</year>
+ <publisher>Micro Power</publisher>
+ <part name="cass" interface="bbc_cass">
+ <dataarea name="cass" size="2370">
+ <rom name="catandmouse(micropower).uef" size="2370" crc="2abaadbb" sha1="20969ad3fe5002b9cdbbf10c5d51fca6a6477371" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="corncrop">
<description>Corn Cropper</description>
<year>1983</year>
@@ -72,11 +95,22 @@
</part>
</software>
+ <software name="disassem">
+ <description>Disassembler</description>
+ <year>1982</year>
+ <publisher>Micro Power</publisher>
+ <part name="cass" interface="bbc_cass">
+ <dataarea name="cass" size="2624">
+ <rom name="disassembler(micropower).uef" size="2624" crc="e9bc953b" sha1="c70e48ec699f60de7b8cb07769c2ba80b245b9d3" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="dreversi">
<description>Draughts And Reversi</description>
<year>1983</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G20" />
+ <info name="release" value="SBG20" />
<part name="cass1" interface="bbc_cass">
<feature name="part_id" value="Draughts"/>
<dataarea name="cass" size="6165">
@@ -135,7 +169,7 @@
<software name="fruitmc">
<description>Fruit Machine</description>
- <year>198?</year>
+ <year>1982</year>
<publisher>Computer Concepts</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="4421">
@@ -144,6 +178,17 @@
</part>
</software>
+ <software name="gomoku">
+ <description>Gomoku</description>
+ <year>1982</year>
+ <publisher>Micro Power</publisher>
+ <part name="cass" interface="bbc_cass">
+ <dataarea name="cass" size="3482">
+ <rom name="gomoku(micropower).uef" size="3482" crc="fcfcb9f5" sha1="2cfed84fab03f6aab487dffc722ca4a855ed8a19" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="ainvader">
<description>Model A Invaders</description>
<year>1982</year>
@@ -166,6 +211,17 @@
</part>
</software>
+ <software name="mutantbr">
+ <description>Mutant Invaders/Breakout</description>
+ <year>1982</year>
+ <publisher>I.J.K.</publisher>
+ <part name="cass" interface="bbc_cass">
+ <dataarea name="cass" size="5346">
+ <rom name="mutantbreakout(ijk).uef" size="5346" crc="69d134b0" sha1="cdbd3c5a970961fa4fe9f72c9dc848708f920708" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="mystad1">
<description>Mysterious Adventure 1 - The Golden Baton</description>
<year>1981</year>
@@ -210,6 +266,17 @@
</part>
</software>
+ <software name="reversim">
+ <description>Reversi (Micro Power)</description>
+ <year>1982</year>
+ <publisher>Micro Power</publisher>
+ <part name="cass" interface="bbc_cass">
+ <dataarea name="cass" size="2150">
+ <rom name="reversi(198x)(micropower).uef" size="2150" crc="45f2023a" sha1="b01cd4fbf1c0d0e2a8515c01e224871c6f3a3af4" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="seek">
<description>Seek</description>
<year>1982</year>
@@ -233,17 +300,6 @@
</part>
</software>
- <software name="spacmaze">
- <description>Space Maze</description>
- <year>1981</year>
- <publisher>Micro Power</publisher>
- <part name="cass" interface="bbc_cass">
- <dataarea name="cass" size="8096">
- <rom name="spacemaze(1981)(micropower).uef" size="8096" crc="7ed8de96" sha1="6dd52f9832f8ff8d3b8e7fd94586fc7ddeb8b182" offset="0" />
- </dataarea>
- </part>
- </software>
-
<software name="sppirate">
<description>Space Pirates</description>
<year>1982</year>
@@ -266,100 +322,115 @@
</part>
</software>
- <!-- Educational -->
-
- <software name="peekog" cloneof="peeko">
- <description>Peeko Computer (Ger)</description>
- <year>198?</year>
- <publisher>Acornsoft</publisher>
- <info name="release" value="E02" />
+ <software name="startrkm">
+ <description>Star Trek (Micro Power)</description>
+ <year>1983</year>
+ <publisher>Micro Power</publisher>
<part name="cass" interface="bbc_cass">
- <dataarea name="cass" size="4821">
- <rom name="peekocomputer-german(198x)(acornsoft)(e02).uef" size="4821" crc="c6503a6b" sha1="813a6399a45a75a4aab3d2edd1722488edf41a52" offset="0" />
+ <dataarea name="cass" size="6092">
+ <rom name="startrek(1983)(micropower).uef" size="6092" crc="9daba7da" sha1="2562b7e8da65a5c80f909f477e36e9241f43c376" offset="0" />
</dataarea>
</part>
</software>
- <software name="peeko">
- <description>Peeko Computer</description>
- <year>198?</year>
- <publisher>Acornsoft</publisher>
- <info name="release" value="E02" />
+ <software name="towealos">
+ <description>Tower of Alos</description>
+ <year>1982</year>
+ <publisher>A&amp;F Software</publisher>
<part name="cass" interface="bbc_cass">
- <dataarea name="cass" size="3993">
- <rom name="peekocomputer(198x)(acornsoft)(e02).uef" size="3993" crc="9a78f3b9" sha1="ff974eb52d6d984637e21e15a883a7572991e38b" offset="0" />
+ <dataarea name="cass" size="6425">
+ <rom name="towerofalos(anf).uef" size="6425" crc="fd11ea22" sha1="c5af41e482249edfc7f568f93a27de19d2a9ba04" offset="0" />
</dataarea>
</part>
</software>
- <software name="busgames">
- <description>Business Games (Ger)</description>
- <year>198?</year>
- <publisher>Acornsoft</publisher>
- <info name="release" value="E03" />
+ <software name="zombies">
+ <description>Zombies</description>
+ <year>1982</year>
+ <publisher>Micro Power</publisher>
<part name="cass" interface="bbc_cass">
- <dataarea name="cass" size="11858">
- <rom name="businessgames-german(198x)(acornsoft)(e03).uef" size="11858" crc="ae23e0dd" sha1="2a4ca1e06870e41d9fa4c4e86ab196251869b160" offset="0" />
+ <dataarea name="cass" size="1561">
+ <rom name="zombies.uef" size="1561" crc="2457e0a7" sha1="d94bab3abed8122debeb4fc579b43e699033a828" offset="0" />
</dataarea>
</part>
</software>
- <software name="wordhunt">
- <description>Word Hunt (Ger)</description>
- <year>198?</year>
+ <!-- Business -->
+
+ <software name="dskdiary">
+ <description>Desk Diary</description>
+ <year>1982</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="E05" />
+ <info name="release" value="SBB01" />
<part name="cass" interface="bbc_cass">
- <dataarea name="cass" size="10849">
- <rom name="wordhunt-german(198x)(acornsoft)(e05).uef" size="10849" crc="e412d5af" sha1="3163432f2388b0795ec03b61ab77e90e37a3f18d" offset="0" />
+ <dataarea name="cass" size="8831">
+ <rom name="deskdiary(198x)(acornsoft)(b01).uef" size="8831" crc="fa88d857" sha1="e12a6e25e371a141c7152a8e88474be2967cb4c2" offset="0" />
</dataarea>
</part>
</software>
- <software name="wordseqg" cloneof="wordseq">
- <description>Word Sequencing (Ger)</description>
- <year>198?</year>
+ <!-- Educational -->
+
+ <software name="peekoc">
+ <description>Peeko-Computer</description>
+ <year>1982</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="E06" />
+ <info name="release" value="SBE02" />
<part name="cass" interface="bbc_cass">
- <dataarea name="cass" size="10883">
- <rom name="wordsequencing-german(198x)(acornsoft)(e06).uef" size="10883" crc="605ebb74" sha1="5d2b67151889a0fa90c490dd4db40d579a8fb386" offset="0" />
+ <dataarea name="cass" size="3993">
+ <rom name="peekocomputer(198x)(acornsoft)(e02).uef" size="3993" crc="9a78f3b9" sha1="ff974eb52d6d984637e21e15a883a7572991e38b" offset="0" />
</dataarea>
</part>
</software>
<software name="wordseq">
<description>Word Sequencing</description>
- <year>198?</year>
+ <year>1983</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="E06" />
+ <info name="release" value="SBE06" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="7955">
- <rom name="wordsequencing(198x)(acornsoft)(e06).uef" size="7955" crc="b6a37e42" sha1="b0b2088cd4bbbed7accd33e943eb8f343e36c7a2" offset="0" />
+ <rom name="wordsequencing(1983)(acornsoft)(e06).uef" size="7955" crc="b6a37e42" sha1="b0b2088cd4bbbed7accd33e943eb8f343e36c7a2" offset="0" />
</dataarea>
</part>
</software>
- <software name="missignsg" cloneof="missigns">
- <description>Missing Signs (Ger)</description>
- <year>198?</year>
+ <software name="missigns">
+ <description>Missing Signs</description>
+ <year>1983</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="E09" />
+ <info name="release" value="SBE09" />
<part name="cass" interface="bbc_cass">
- <dataarea name="cass" size="11055">
- <rom name="missingsigns-german(198x)(acornsoft)(e09).uef" size="11055" crc="3a6c4f59" sha1="e02115cbf2cdcc0996b12fe8db25c02ca234248b" offset="0" />
+ <dataarea name="cass" size="7977">
+ <rom name="missingsigns(1983)(acornsoft)(e09).uef" size="7977" crc="7da85f67" sha1="ebc8116fa980c0d268918a3aa333f772de0a7cb9" offset="0" />
</dataarea>
</part>
</software>
- <software name="missigns">
- <description>Missing Signs</description>
- <year>198?</year>
+ <!-- Languages -->
+
+ <software name="lisp">
+ <description>LISP</description>
+ <year>1982</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="E09" />
+ <info name="release" value="SBL02" />
<part name="cass" interface="bbc_cass">
- <dataarea name="cass" size="7977">
- <rom name="missingsigns(198x)(acornsoft)(e09).uef" size="7977" crc="7da85f67" sha1="ebc8116fa980c0d268918a3aa333f772de0a7cb9" offset="0" />
+ <dataarea name="cass" size="12734">
+ <rom name="lisp(1982)(acornsoft)(l02).uef" size="12734" crc="f93222c5" sha1="fd2b12ce8a273d0b2340c86627c82dec85a7366e" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <!-- Graphics and other -->
+
+ <software name="crgraph">
+ <description>Creative Graphics</description>
+ <year>1982</year>
+ <publisher>Acornsoft</publisher>
+ <info name="release" value="SBX01" />
+ <part name="cass" interface="bbc_cass">
+ <dataarea name="cass" size="9543">
+ <rom name="creativegraphics(198x)(acornsoft)(x01).uef" size="9543" crc="b1879555" sha1="5f603d2a1c0693c4d91d8695e473e65e5c6ba3c5" offset="0" />
</dataarea>
</part>
</software>
diff --git a/hash/bbcb_cass.xml b/hash/bbcb_cass.xml
index aeda92aa6aa..7cce513ba03 100644
--- a/hash/bbcb_cass.xml
+++ b/hash/bbcb_cass.xml
@@ -31,7 +31,7 @@
<software name="1984">
<description>1984</description>
- <year>198?</year>
+ <year>1984</year>
<publisher>Incentive</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="16456">
@@ -85,8 +85,8 @@
</software>
<software name="3deepspc">
- <description>3Deep Space</description>
- <year>198?</year>
+ <description>3 Deep Space</description>
+ <year>1983</year>
<publisher>Postern</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="4395">
@@ -97,7 +97,7 @@
<software name="3dgp">
<description>3D Grand Prix</description>
- <year>198?</year>
+ <year>1984</year>
<publisher>Software Invasion</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="26884">
@@ -251,7 +251,7 @@
<software name="747flsim">
<description>747 Flight Simulator</description>
<year>1983</year>
- <publisher>Dacc</publisher>
+ <publisher>DACC</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="5805">
<rom name="747flightsim(1983)(dacc).uef" size="5805" crc="83f0ca6c" sha1="7b99e5dbd19e0b5cffbd37beef4034c25b1fa578" offset="0" />
@@ -471,7 +471,7 @@
<software name="airliftb">
<description>Airlift (Bug Byte)</description>
- <year>198?</year>
+ <year>1983</year>
<publisher>Bug Byte</publisher>
<info name="compatibility" value="OS0.1" />
<part name="cass" interface="bbc_cass">
@@ -597,10 +597,10 @@
<software name="alienswi">
<description>Alien Swirl</description>
<year>1983</year>
- <publisher>Micro Power</publisher>
+ <publisher>Amcom</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="6489">
- <rom name="alienswirl(1983)(micropower).uef" size="6489" crc="5c69a2fc" sha1="f23a88dde1d2a9891393ae7869919959813ee91e" offset="0" />
+ <rom name="alienswirl(1983)(amcom).uef" size="6489" crc="5c69a2fc" sha1="f23a88dde1d2a9891393ae7869919959813ee91e" offset="0" />
</dataarea>
</part>
</software>
@@ -755,7 +755,7 @@
<software name="apocalyp">
<description>Apocalypse (Red Shift)</description>
- <year>198?</year>
+ <year>1984</year>
<publisher>Red Shift</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="24098">
@@ -808,7 +808,7 @@
<description>Arcadians</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G14" />
+ <info name="release" value="SBG14" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="13255">
<rom name="arcadians-v1.2(1982)(acornsoft)(g14).uef" size="13255" crc="e8418496" sha1="78c73583c25d54f89d21dbb6564ac4f26c7949b5" offset="0" />
@@ -849,18 +849,6 @@
</part>
</software>
- <software name="asterbel">
- <description>Asteroid Belt</description>
- <year>198?</year>
- <publisher>Computer Concepts</publisher>
- <info name="usage" value="Load with *RUN" />
- <part name="cass" interface="bbc_cass">
- <dataarea name="cass" size="4713">
- <rom name="asteroidbelt_run(computerconcepts).uef" size="4713" crc="61b7b9e7" sha1="bd51ec809ac60842bacd6916d6d4c5ce7d431586" offset="0" />
- </dataarea>
- </part>
- </software>
-
<software name="astermin">
<description>Asteroid Miner</description>
<year>198?</year>
@@ -942,7 +930,7 @@
<software name="atlantis">
<description>Atlantis</description>
- <year>198?</year>
+ <year>1983</year>
<publisher>I.J.K.</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="8005">
@@ -999,7 +987,7 @@
<description>Aviator</description>
<year>1983</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G02" />
+ <info name="release" value="SBG02" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="18084">
<rom name="aviator-v1.1(1983)(acornsoft)(g02).uef" size="18084" crc="8fe4373a" sha1="c3853da35b9b22b44333db3cd43cee36fa8922df" offset="0" />
@@ -1265,7 +1253,7 @@
</software>
<software name="batltank">
- <description>Battle Tank (Superior Software)</description>
+ <description>Battle Tank</description>
<year>1984</year>
<publisher>Superior Software</publisher>
<part name="cass" interface="bbc_cass">
@@ -1286,10 +1274,10 @@
</part>
</software>
- <software name="bbcmaste">
+ <software name="mmind">
<description>BBC Mastermind</description>
<year>1984</year>
- <publisher>Mirrorsoft</publisher>
+ <publisher>Mirrorsoft-Ivan Berg</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="21861">
<rom name="bbcmastermind(1984)(mirrorsoft).uef" size="21861" crc="6a9c820c" sha1="97ad4cf249890d04d75cc418d7af79a52ee8f4c8" offset="0" />
@@ -1297,6 +1285,17 @@
</part>
</software>
+ <software name="mmindqm">
+ <description>BBC Mastermind Quizmaster</description>
+ <year>1984</year>
+ <publisher>Mirrorsoft-Ivan Berg</publisher>
+ <part name="cass" interface="bbc_cass">
+ <dataarea name="cass" size="5436">
+ <rom name="mastermindquizmaster_be(1984)(mirrorsoft).uef" size="5436" crc="1cd42c57" sha1="f2c1171a603128cf7f9abc5e32dc9afe41c8e97e" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="bcbill">
<description>BC Bill</description>
<year>1984</year>
@@ -1320,12 +1319,12 @@
</software>
<software name="beebbeep">
- <description>Beeb-Beep</description>
+ <description>Beep-Beeb</description>
<year>1982</year>
<publisher>I.J.K.</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="3568">
- <rom name="beebbeep(ijk).uef" size="3568" crc="06ca6d60" sha1="a6bfb6414366206320057316e0c3a6edfbb57a69" offset="0" />
+ <rom name="beepbeeb(ijk).uef" size="3568" crc="06ca6d60" sha1="a6bfb6414366206320057316e0c3a6edfbb57a69" offset="0" />
</dataarea>
</part>
</software>
@@ -1342,7 +1341,7 @@
</software>
<software name="beebmunc">
- <description>Beeb Munch</description>
+ <description>Beebmunch</description>
<year>1982</year>
<publisher>I.J.K.</publisher>
<part name="cass" interface="bbc_cass">
@@ -1354,7 +1353,7 @@
<software name="beebtote">
<description>Beebtote</description>
- <year>198?</year>
+ <year>1983</year>
<publisher>Micro Power</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="5197">
@@ -1365,7 +1364,7 @@
<software name="beebtrek">
<description>Beebtrek</description>
- <year>198?</year>
+ <year>1982</year>
<publisher>Epsilon</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="7168">
@@ -1422,7 +1421,7 @@
<description>Black Box and Gambit</description>
<year>1984</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G34" />
+ <info name="release" value="SBG34" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="13391">
<rom name="blackboxandgambit-v1(1984)(acornsoft)(g34).uef" size="13391" crc="a5be6678" sha1="478967d65ce36a168a0428aa21663f9e65b97411" offset="0" />
@@ -1452,26 +1451,22 @@
</part>
</software>
- <software name="blitzkric" cloneof="blitzkri">
- <description>Blitzkrieg (Colour)</description>
- <year>1984</year>
- <publisher>Software Invasion</publisher>
- <part name="cass" interface="bbc_cass">
- <dataarea name="cass" size="17888">
- <rom name="blitzkrieg-colour.hq(1984)(softwareinvasion).uef" size="17888" crc="ad7f1f6d" sha1="db85b52b1a775c3f3455e6c7df4640be3a7e62ba" offset="0" />
- </dataarea>
- </part>
- </software>
-
<software name="blitzkri">
<description>Blitzkrieg</description>
<year>1984</year>
<publisher>Software Invasion</publisher>
- <part name="cass" interface="bbc_cass">
+ <part name="cass1" interface="bbc_cass">
+ <feature name="part_id" value="Original"/>
<dataarea name="cass" size="17412">
<rom name="blitzkrieg-mono.hq(1984)(softwareinvasion).uef" size="17412" crc="46ae1ea4" sha1="883a581e6f86fb171de30ab8d2fa297030e55de5" offset="0" />
</dataarea>
</part>
+ <part name="cass2" interface="bbc_cass">
+ <feature name="part_id" value="Colour"/>
+ <dataarea name="cass" size="17888">
+ <rom name="blitzkrieg-colour.hq(1984)(softwareinvasion).uef" size="17888" crc="ad7f1f6d" sha1="db85b52b1a775c3f3455e6c7df4640be3a7e62ba" offset="0" />
+ </dataarea>
+ </part>
</software>
<software name="blockbus">
@@ -1578,7 +1573,7 @@
<software name="bobbycha">
<description>Bobby Charlton Soccer</description>
<year>1985</year>
- <publisher>Dacc</publisher>
+ <publisher>DACC</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="12700">
<rom name="bobbycharltonsoccer(1985)(dacc).uef" size="12700" crc="9e3b01e6" sha1="a68476394b7096948e485d4f9e860285c4dbf6fb" offset="0" />
@@ -1610,11 +1605,11 @@
<software name="bonecrunpias" cloneof="bonecrun">
<description>Bone Cruncher (Play It Again Sam 7)</description>
- <year>1988</year>
+ <year>1989</year>
<publisher>Superior Software</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="39351">
- <rom name="bonecruncher-piasrr(1987)(superior).uef" size="39351" crc="0583cf9f" sha1="d7c787af3751a73e733fb492b0df29ef4f47fbab" offset="0" />
+ <rom name="bonecruncher-piasrr(1989)(superior).uef" size="39351" crc="0583cf9f" sha1="d7c787af3751a73e733fb492b0df29ef4f47fbab" offset="0" />
</dataarea>
</part>
</software>
@@ -1667,7 +1662,7 @@
<description>Bouncer</description>
<year>1984</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G35" />
+ <info name="release" value="SBG35" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="8722">
<rom name="bouncer-v1(1984)(acornsoft)(g35).uef" size="8722" crc="6f68649c" sha1="1cd59da929fe95cc04132ef4316f3939ed60f828" offset="0" />
@@ -1690,7 +1685,7 @@
<description>Boxer</description>
<year>1984</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G31" />
+ <info name="release" value="SBG31" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="9143">
<rom name="boxer-v1(1984)(acornsoft)(g31).uef" size="9143" crc="9b78d174" sha1="47b0b4e13eafcf5fd48064c787cd046a29620093" offset="0" />
@@ -1886,11 +1881,11 @@
<software name="bullseye">
<description>Bullseye</description>
- <year>198?</year>
- <publisher>Domark</publisher>
+ <year>1984</year>
+ <publisher>Macsen</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="21886">
- <rom name="bullseye(domark).uef" size="21886" crc="2b18614c" sha1="908786278f7920234198d9937f11e11bc9e735bd" offset="0" />
+ <rom name="bullseye(macsen).uef" size="21886" crc="2b18614c" sha1="908786278f7920234198d9937f11e11bc9e735bd" offset="0" />
</dataarea>
</part>
</software>
@@ -1954,7 +1949,7 @@
<description>Carousel</description>
<year>1983</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G24" />
+ <info name="release" value="SBG24" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="9733">
<rom name="carousel-v1.1(1983)(acornsoft)(g24).uef" size="9733" crc="c8937c86" sha1="064c5a26c72af93f1905d473d94154b739faa74e" offset="0" />
@@ -1963,7 +1958,7 @@
</software>
<software name="carwarsp">
- <description>Car Wars/Planet of the Aliens</description>
+ <description>Car Wars/Alien Planet</description>
<year>1982</year>
<publisher>Software For All</publisher>
<info name="usage" value="CH.&quot;CAR-WARS&quot;/CH.&quot;ALIEN-P&quot;" />
@@ -2063,7 +2058,7 @@
<description>Castle of Riddles v1.0</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G17" />
+ <info name="release" value="SBG17" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="15634">
<rom name="castleofriddles-v1.0(1982)(acornsoft)(g17).uef" size="15634" crc="f61d67f7" sha1="404dfc37c0876d79c7d57c7137943e4916119e25" offset="0" />
@@ -2075,7 +2070,7 @@
<description>Castle of Riddles v2.0</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G17" />
+ <info name="release" value="SBG17" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="15602">
<rom name="castleofriddles-v2.0(1982)(acornsoft)(g17).uef" size="15602" crc="339f7688" sha1="d36002d0e8ab0b3cfb6672be72a8f36180c26c67" offset="0" />
@@ -2094,17 +2089,6 @@
</part>
</software>
- <software name="catmouse">
- <description>Cat and Mouse</description>
- <year>198?</year>
- <publisher>Micro Power</publisher>
- <part name="cass" interface="bbc_cass">
- <dataarea name="cass" size="2370">
- <rom name="catandmouse(micropower).uef" size="2370" crc="2abaadbb" sha1="20969ad3fe5002b9cdbbf10c5d51fca6a6477371" offset="0" />
- </dataarea>
- </part>
- </software>
-
<software name="caterpil">
<description>Caterpillar</description>
<year>1983</year>
@@ -2240,7 +2224,7 @@
<software name="chartbus">
<description>Chart Buster</description>
- <year>198?</year>
+ <year>1984</year>
<publisher>Alligata</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="32610">
@@ -2297,7 +2281,7 @@
<description>Chess v2.1</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G10" />
+ <info name="release" value="SBG10" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="12900">
<rom name="chess-acornsoft-v2.1(1982)(acornsoft)(g10).uef" size="12900" crc="cef54328" sha1="ac378be88dee4df98902f30690338ed84a4481b4" offset="0" />
@@ -2309,7 +2293,7 @@
<description>Chess v2.2</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G10" />
+ <info name="release" value="SBG10" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="12900">
<rom name="chess-acornsoft-v2.2(1982)(acornsoft)(g10).uef" size="12900" crc="0ab8406d" sha1="a978801af4e9ea4c4eff0db7726b55cf90137ca6" offset="0" />
@@ -2319,7 +2303,7 @@
<software name="chessb">
<description>Chess (Bug Byte)</description>
- <year>198?</year>
+ <year>1983</year>
<publisher>Bug Byte</publisher>
<info name="usage" value="Load with *RUN" />
<part name="cass" interface="bbc_cass">
@@ -2330,8 +2314,8 @@
</software>
<software name="chessc">
- <description>Chess (Computer Concepts)</description>
- <year>198?</year>
+ <description>Chess v2.32E (Computer Concepts)</description>
+ <year>1983</year>
<publisher>Computer Concepts</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="9668">
@@ -2340,6 +2324,17 @@
</part>
</software>
+ <software name="chess232" cloneof="chessc">
+ <description>Chess v2.32C (Computer Concepts)</description>
+ <year>1982</year>
+ <publisher>Computer Concepts</publisher>
+ <part name="cass" interface="bbc_cass">
+ <dataarea name="cass" size="8392">
+ <rom name="chess-v232c(computerconcepts).uef" size="8392" crc="f8a9a4cc" sha1="b573ac8fe6a9f6f04f0b5cf22669460367624e48" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="chessmp">
<description>Chess (Micro Power)</description>
<year>198?</year>
@@ -2363,17 +2358,6 @@
</part>
</software>
- <software name="chess232">
- <description>Chess v232c</description>
- <year>198?</year>
- <publisher>Computer Concepts</publisher>
- <part name="cass" interface="bbc_cass">
- <dataarea name="cass" size="8392">
- <rom name="chess-v232c(computerconcepts).uef" size="8392" crc="f8a9a4cc" sha1="b573ac8fe6a9f6f04f0b5cf22669460367624e48" offset="0" />
- </dataarea>
- </part>
- </software>
-
<software name="chickaro">
<description>Chickaroo</description>
<year>198?</year>
@@ -2389,6 +2373,7 @@
<description>Chieftain</description>
<year>1983</year>
<publisher>Virgin Games</publisher>
+ <info name="release" value="VGA2006" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="7422">
<rom name="chieftain(1983)(virgin).uef" size="7422" crc="9a58cb81" sha1="29f886088979b9f3be97ba94f08bd458776de939" offset="0" />
@@ -2508,8 +2493,8 @@
</software>
<software name="claresjo">
- <description>Clares Joystick Software</description>
- <year>198?</year>
+ <description>Joystick Utility</description>
+ <year>1983</year>
<publisher>Clares</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="6275">
@@ -2792,7 +2777,7 @@
<software name="constell">
<description>Constellation</description>
- <year>198?</year>
+ <year>1982</year>
<publisher>Micro Power</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="4598">
@@ -2948,7 +2933,7 @@
<description>Countdown to Doom</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G19" />
+ <info name="release" value="SBG19" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="18954">
<rom name="countdowntodoom-v3.2(1982)(acornsoft)(g19).uef" size="18954" crc="3d9938d0" sha1="aa8be5912da9683a32099e57004143fc98b2b7d2" offset="0" />
@@ -3045,7 +3030,7 @@
<description>Crazy Tracer</description>
<year>1983</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G26" />
+ <info name="release" value="SBG26" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="8535">
<rom name="crazytracer-v1.1(1983)(acornsoft)(g26).uef" size="8535" crc="e21bdd04" sha1="bdcc817714497541709582029c3e30be4a61488d" offset="0" />
@@ -3114,6 +3099,7 @@
<description>Cruncher</description>
<year>1983</year>
<publisher>Virgin Games</publisher>
+ <info name="release" value="VGA2009" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="6919">
<rom name="cruncher(1983)(virgin).uef" size="6919" crc="95cf15c6" sha1="613eb0cba988bbdb364b188311781e2fb2fb79df" offset="0" />
@@ -3147,7 +3133,7 @@
<description>Cube Master</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G08" />
+ <info name="release" value="SBG08" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="5883">
<rom name="cubemaster-v1.0(1982)(acornsoft)(g08).uef" size="5883" crc="0f4a40f6" sha1="bcf0b137a5dcc2e56d10c847d4c372abbe171c44" offset="0" />
@@ -3186,7 +3172,7 @@
<software name="cybermis">
<description>Cybertron Mission</description>
- <year>1984</year>
+ <year>1983</year>
<publisher>Micro Power</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="10863">
@@ -3239,9 +3225,9 @@
</part>
</software>
- <software name="daleysup">
- <description>Daley Thompson's Supertest</description>
- <year>198?</year>
+ <software name="daleytst">
+ <description>Daley Thompson's Super-Test</description>
+ <year>1985</year>
<publisher>Ocean</publisher>
<part name="cass1" interface="bbc_cass">
<feature name="part_id" value="Side 1"/>
@@ -3404,7 +3390,7 @@
<description>Defender v1.0 (Deleted)</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G02 (deleted)" />
+ <info name="release" value="SBG02 (deleted)" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="8358">
<rom name="defender-v1.0(1982)(acornsoft)(g02).uef" size="8358" crc="d981bff4" sha1="4a38d349f4b23cc7983e1537c85ec89bb8df22d6" offset="0" />
@@ -3518,8 +3504,8 @@
<software name="design">
<description>Design</description>
- <year>198?</year>
- <publisher>Beebug</publisher>
+ <year>1984</year>
+ <publisher>Beebugsoft</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="11931">
<rom name="design(beebug).uef" size="11931" crc="cd3b4dde" sha1="1310cdac61a5acb3d891591894cdacd90fda3e3f" offset="0" />
@@ -3605,17 +3591,6 @@
</part>
</software>
- <software name="disassem">
- <description>Disassembler</description>
- <year>198?</year>
- <publisher>Micro Power</publisher>
- <part name="cass" interface="bbc_cass">
- <dataarea name="cass" size="2624">
- <rom name="disassembler(micropower).uef" size="2624" crc="e9bc953b" sha1="c70e48ec699f60de7b8cb07769c2ba80b245b9d3" offset="0" />
- </dataarea>
- </part>
- </software>
-
<software name="diskmast">
<description>Disk Master</description>
<year>198?</year>
@@ -3677,9 +3652,9 @@
</software>
<software name="dodgem">
- <description>DodgEm</description>
- <year>198?</year>
- <publisher>Microgame</publisher>
+ <description>Dodg'Em</description>
+ <year>1983</year>
+ <publisher>Microgame Simulations</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="4182">
<rom name="dodgem(microgame).uef" size="4182" crc="330d345e" sha1="68b59ec42d3649df9f8e96c0c9d61dd537b34cfb" offset="0" />
@@ -3711,8 +3686,8 @@
<software name="dominoeg">
<description>Dominoes (Garland)</description>
- <year>198?</year>
- <publisher>Garland</publisher>
+ <year>1984</year>
+ <publisher>Garland Computing</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="10583">
<rom name="dominoes_be(garland).uef" size="10583" crc="4734ec77" sha1="b98482401f571ece2a3e91846520172f70424fe3" offset="0" />
@@ -3844,7 +3819,7 @@
<software name="drawing">
<description>Drawing</description>
- <year>198?</year>
+ <year>1983</year>
<publisher>BBC Soft</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="7018">
@@ -3857,7 +3832,7 @@
<description>Drogna</description>
<year>1983</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G27" />
+ <info name="release" value="SBG27" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="7979">
<rom name="drogna-v1(1983)(acornsoft)(g27).uef" size="7979" crc="24ef9bab" sha1="cd41f48683b11593598f59b611df6380f2aab9fc" offset="0" />
@@ -3977,7 +3952,7 @@
<software name="edggraph">
<description>EDG Graphics Package</description>
- <year>198?</year>
+ <year>1983</year>
<publisher>Salamander</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="6769">
@@ -4010,11 +3985,11 @@
<software name="elitesrr" cloneof="elite">
<description>Elite (Superior Software)</description>
- <year>198?</year>
+ <year>1986</year>
<publisher>Superior Software</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="26126">
- <rom name="elite-srr(198x)(superior)(g38).uef" size="26126" crc="15c3c66c" sha1="907877ec62ca0217ba95292a8e6227721401cc1f" offset="0" />
+ <rom name="elite-srr(1986)(superior)(g38).uef" size="26126" crc="15c3c66c" sha1="907877ec62ca0217ba95292a8e6227721401cc1f" offset="0" />
</dataarea>
</part>
</software>
@@ -4023,7 +3998,7 @@
<description>Elite</description>
<year>1984</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G38" />
+ <info name="release" value="SBG38" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="27174">
<rom name="elite-v1.0(1984)(acornsoft)(g38).uef" size="27174" crc="c942b5af" sha1="95be4a10a29af210df0f74529194fb29c8ca0e68" offset="0" />
@@ -4099,7 +4074,7 @@
<software name="enigma">
<description>Enigma</description>
- <year>19??</year>
+ <year>1983</year>
<publisher>Brainbox</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="5814">
@@ -4121,11 +4096,11 @@
<software name="embalpha">
<description>Escape from Moonbase Alpha</description>
- <year>1982</year>
+ <year>1983</year>
<publisher>Micro Power</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="6141">
- <rom name="escapefrommoonbasealpha(1982)(micropower).uef" size="6141" crc="84d1e894" sha1="9db191cd5a0480db077be7954cbb94fb82057a06" offset="0" />
+ <rom name="escapefrommoonbasealpha(1983)(micropower).uef" size="6141" crc="84d1e894" sha1="9db191cd5a0480db077be7954cbb94fb82057a06" offset="0" />
</dataarea>
</part>
</software>
@@ -4331,11 +4306,11 @@
<software name="felixfac">
<description>Felix in the Factory</description>
- <year>1982</year>
+ <year>1983</year>
<publisher>Micro Power</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="8088">
- <rom name="felixinthefactory(1982)(micropower).uef" size="8088" crc="4f632fb3" sha1="7c47b276dce5f0bee3814e8fe1f30b95b794d9b3" offset="0" />
+ <rom name="felixinthefactory(1983)(micropower).uef" size="8088" crc="4f632fb3" sha1="7c47b276dce5f0bee3814e8fe1f30b95b794d9b3" offset="0" />
</dataarea>
</part>
</software>
@@ -4364,7 +4339,7 @@
<software name="ffreddie">
<description>F for Freddie</description>
- <year>198?</year>
+ <year>1983</year>
<publisher>Kansas</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="6158">
@@ -4386,7 +4361,7 @@
<software name="filer">
<description>Filer</description>
- <year>198?</year>
+ <year>1982</year>
<publisher>Micro Power</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="7092">
@@ -4410,7 +4385,7 @@
<description>Firebug</description>
<year>1984</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G39" />
+ <info name="release" value="SBG39" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="9118">
<rom name="firebug-v1(1984)(acornsoft)(g39).uef" size="9118" crc="637c6756" sha1="8b2c5e35e8195bd1cd48671d36466b4cb7d3c390" offset="0" />
@@ -4420,7 +4395,7 @@
<software name="firehawk">
<description>Firehawks</description>
- <year>198?</year>
+ <year>1983</year>
<publisher>Postern</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="4622">
@@ -4597,7 +4572,7 @@
<software name="footbman">
<description>Football Manager</description>
- <year>198?</year>
+ <year>1984</year>
<publisher>Addictive</publisher>
<info name="usage" value="Load with *RUN" />
<part name="cass" interface="bbc_cass">
@@ -4609,7 +4584,7 @@
<software name="footer">
<description>Footer</description>
- <year>198?</year>
+ <year>1982</year>
<publisher>Micro Power</publisher>
<info name="usage" value="Load with *LOAD" />
<part name="cass" interface="bbc_cass">
@@ -4676,7 +4651,7 @@
<software name="franklin">
<description>Franklins Tomb</description>
- <year>198?</year>
+ <year>1983</year>
<publisher>Salamander</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="11887">
@@ -4701,7 +4676,7 @@
<description>Free Fall</description>
<year>1983</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G28" />
+ <info name="release" value="SBG28" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="14302">
<rom name="freefall-v1.2(1983)(acornsoft)(g28).uef" size="14302" crc="388da7c1" sha1="6829c13f0d8437b80ab97ce8cc60605143adc4fc" offset="0" />
@@ -4789,7 +4764,7 @@
<software name="fruitmac">
<description>Fruit Machine (Alligata)</description>
- <year>198?</year>
+ <year>1983</year>
<publisher>Alligata</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="3670">
@@ -4835,7 +4810,7 @@
<software name="frfreddy">
<description>Fruity Freddy</description>
<year>1983</year>
- <publisher>Softspot</publisher>
+ <publisher>SoftSpot</publisher>
<info name="usage" value="Load with *RUN" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="6875">
@@ -4891,7 +4866,7 @@
<software name="funfair">
<description>Funfair</description>
<year>1983</year>
- <publisher>Softspot</publisher>
+ <publisher>SoftSpot</publisher>
<info name="usage" value="Load with *RUN" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="7205">
@@ -4902,7 +4877,7 @@
<software name="fungames">
<description>Fun Games</description>
- <year>198?</year>
+ <year>1983</year>
<publisher>BBC Soft</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="9753">
@@ -5026,12 +5001,12 @@
<software name="galaxian">
<description>Galaxians</description>
- <year>1984</year>
+ <year>1982</year>
<publisher>Superior Software</publisher>
<info name="usage" value="Load with *RUN" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="7875">
- <rom name="galaxians_run(1984)(superior).uef" size="7875" crc="36782221" sha1="178441631951c5ff2a5b509acd22c2f59a1503e9" offset="0" />
+ <rom name="galaxians_run(1982)(superior).uef" size="7875" crc="36782221" sha1="178441631951c5ff2a5b509acd22c2f59a1503e9" offset="0" />
</dataarea>
</part>
</software>
@@ -5161,7 +5136,7 @@
<description>Gateway To Karos</description>
<year>1983</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G30" />
+ <info name="release" value="SBG30" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="21761">
<rom name="gatewaytokaros-v1.2(1983)(acornsoft)(g30).uef" size="21761" crc="837ac45a" sha1="3104549e9be80fd055d20254b690871bb93c2a54" offset="0" />
@@ -5240,7 +5215,7 @@
<description>Go</description>
<year>1984</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G42" />
+ <info name="release" value="SBG42" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="12814">
<rom name="go-v1(1984)(acornsoft)(g42).uef" size="12814" crc="e7bbcff3" sha1="0189d4ec49f327ee570d007e489e41acf0247003" offset="0" />
@@ -5343,17 +5318,6 @@
</part>
</software>
- <software name="gomoku">
- <description>Gomoku</description>
- <year>198?</year>
- <publisher>Micro Power</publisher>
- <part name="cass" interface="bbc_cass">
- <dataarea name="cass" size="3482">
- <rom name="gomoku(micropower).uef" size="3482" crc="fcfcb9f5" sha1="2cfed84fab03f6aab487dffc722ca4a855ed8a19" offset="0" />
- </dataarea>
- </part>
- </software>
-
<software name="gorf">
<description>Gorf</description>
<year>1983</year>
@@ -5430,7 +5394,7 @@
<software name="gbltd">
<description>Great Britain Ltd</description>
- <year>198?</year>
+ <year>1983</year>
<publisher>Hessel</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="10380">
@@ -5718,7 +5682,7 @@
<software name="heist">
<description>Heist</description>
<year>1983</year>
- <publisher>Softspot</publisher>
+ <publisher>SoftSpot</publisher>
<info name="usage" value="Load with *RUN" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="6155">
@@ -5895,7 +5859,7 @@
<software name="homefina">
<description>Home Finance</description>
- <year>198?</year>
+ <year>1983</year>
<publisher>BBC Soft</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="18779">
@@ -5919,7 +5883,7 @@
<description>Hopper v2.1</description>
<year>1983</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G23" />
+ <info name="release" value="SBG23" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="7958">
<rom name="hopper-v2.1(1983)(acornsoft)(g23).uef" size="7958" crc="6799d1a5" sha1="0b5bef8cd1fbf0a6032ed705150c6729d30f65f3" offset="0" />
@@ -5931,7 +5895,7 @@
<description>Hopper v2.2</description>
<year>1983</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G23" />
+ <info name="release" value="SBG23" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="7957">
<rom name="hopper-v2.2(1983)(acornsoft)(g23).uef" size="7957" crc="934807a1" sha1="39eb04e7844d06743e510ad835148bf982e94350" offset="0" />
@@ -6018,12 +5982,12 @@
<software name="hnchback">
<description>Hunchback</description>
- <year>1984</year>
+ <year>1983</year>
<publisher>Superior Software</publisher>
<info name="usage" value="Load with *RUN" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="6908">
- <rom name="hunchback_run(1984)(superior).uef" size="6908" crc="aa485002" sha1="67677d55b1fd28e1efb8f0916a2c27e4fdd2462c" offset="0" />
+ <rom name="hunchback_run(1983)(superior).uef" size="6908" crc="aa485002" sha1="67677d55b1fd28e1efb8f0916a2c27e4fdd2462c" offset="0" />
</dataarea>
</part>
</software>
@@ -6248,7 +6212,7 @@
<software name="infinity">
<description>Infinity</description>
- <year>19??</year>
+ <year>1989</year>
<publisher>White Panther</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="85986">
@@ -6259,7 +6223,7 @@
<software name="inherita">
<description>Inheritance</description>
- <year>198?</year>
+ <year>1983</year>
<publisher>Hessel</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="13910">
@@ -6343,7 +6307,7 @@
<software name="invaderb">
<description>Invaders (Bug Byte)</description>
- <year>198?</year>
+ <year>1982</year>
<publisher>Bug Byte</publisher>
<info name="usage" value="Load with *RUN" />
<part name="cass" interface="bbc_cass">
@@ -6391,7 +6355,7 @@
<software name="islandia">
<description>Islandia</description>
- <year>198?</year>
+ <year>1984</year>
<publisher>Red Shift</publisher>
<info name="usage" value="Load with *RUN" />
<part name="cass" interface="bbc_cass">
@@ -6456,7 +6420,7 @@
<description>JCB Digger</description>
<year>1983</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G09" />
+ <info name="release" value="SBG09" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="10051">
<rom name="jcbdigger-v1.1(1983)(acornsoft)(g09).uef" size="10051" crc="2a6abe99" sha1="81ee3924e027bf16429d0a013711ebf008c752bc" offset="0" />
@@ -6465,12 +6429,12 @@
</software>
<software name="jetboat">
- <description>Jetboat</description>
+ <description>Jet Boat</description>
<year>1984</year>
<publisher>Software Invasion</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="22870">
- <rom name="jetboat.hq(1984)(softwareinvasion).uef" size="22870" crc="7c2b591f" sha1="7f12fb95f80e27d3f26e12882d0f6f7dd1fd16ea" offset="0" />
+ <rom name="jetboat(1984)(softwareinvasion).hq.uef" size="22870" crc="7c2b591f" sha1="7f12fb95f80e27d3f26e12882d0f6f7dd1fd16ea" offset="0" />
</dataarea>
</part>
</software>
@@ -6667,7 +6631,7 @@
<software name="katakomb">
<description>Katakombs</description>
- <year>198?</year>
+ <year>1983</year>
<publisher>Golem</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="10166">
@@ -6779,7 +6743,7 @@
<description>Kingdom of Hamil</description>
<year>1983</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G25" />
+ <info name="release" value="SBG25" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="18905">
<rom name="kingdomofhamil-v1.1(1983)(acornsoft)(g25).uef" size="18905" crc="851a33cb" sha1="f19156edaf9ed1097739eda2227e0068d72629a6" offset="0" />
@@ -6821,7 +6785,7 @@
</software>
<software name="kix">
- <description>Kix</description>
+ <description>Kix (The Superior Collection Vol.2)</description>
<year>1986</year>
<publisher>Superior Software</publisher>
<part name="cass" interface="bbc_cass">
@@ -6913,7 +6877,7 @@
<description>Labyrinth</description>
<year>1984</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G41" />
+ <info name="release" value="SBG41" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="15623">
<rom name="labyrinth-v1.0(1984)(acornsoft)(g41).uef" size="15623" crc="4052af69" sha1="32955760cde941a02e97371bc30542e235542244" offset="0" />
@@ -7222,8 +7186,8 @@
</software>
<software name="logo2">
- <description>Logo2</description>
- <year>198?</year>
+ <description>Logo 2</description>
+ <year>1982</year>
<publisher>Computer Concepts</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="2940">
@@ -7252,8 +7216,8 @@
<software name="loonlift">
<description>Looney Lift</description>
- <year>198?</year>
- <publisher>H&amp;H</publisher>
+ <year>1983</year>
+ <publisher>H&amp;H Software</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="5239">
<rom name="looneylift(hh).uef" size="5239" crc="367c001c" sha1="6316af9624b5deadcbd535cab48fda59ea4a41a5" offset="0" />
@@ -7338,7 +7302,7 @@
<software name="lostinsp">
<description>Lost in Space</description>
- <year>198?</year>
+ <year>1983</year>
<publisher>Salamander</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="13451">
@@ -7349,7 +7313,7 @@
<software name="llander">
<description>Lunar Lander</description>
- <year>198?</year>
+ <year>1983</year>
<publisher>A&amp;F Software</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="4951">
@@ -7417,7 +7381,7 @@
<description>Magic Mushrooms</description>
<year>1985</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G46" />
+ <info name="release" value="SBG46" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="9083">
<rom name="magicmushrooms-v1(1985)(acornsoft)(g46).uef" size="9083" crc="54d740e1" sha1="a5a4e50e8ef8beef4f0d1ae304aa5c36853382f4" offset="0" />
@@ -7537,17 +7501,6 @@
</part>
</software>
- <software name="mmind">
- <description>Mastermind Quizmaster</description>
- <year>1984</year>
- <publisher>Mirrorsoft</publisher>
- <part name="cass" interface="bbc_cass">
- <dataarea name="cass" size="5436">
- <rom name="mastermindquizmaster_be(1984)(mirrorsoft).uef" size="5436" crc="1cd42c57" sha1="f2c1171a603128cf7f9abc5e32dc9afe41c8e97e" offset="0" />
- </dataarea>
- </part>
- </software>
-
<software name="masters">
<description>Masters of the Universe</description>
<year>198?</year>
@@ -7597,7 +7550,7 @@
<description>Maze</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G11" />
+ <info name="release" value="SBG11" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="10689">
<rom name="maze-v1(1982)(acornsoft)(g11).uef" size="10689" crc="95415e93" sha1="3c725157d1cee91a52bf4a9cbc822d892212e6f4" offset="0" />
@@ -7607,7 +7560,7 @@
<software name="mzinvade">
<description>Maze Invaders</description>
- <year>198?</year>
+ <year>1982</year>
<publisher>Micro Power</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="3161">
@@ -7675,7 +7628,7 @@
<description>Meteor Mission</description>
<year>1984</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G29" />
+ <info name="release" value="SBG29" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="7512">
<rom name="meteormission-v1(1984)(acornsoft)(g29).uef" size="7512" crc="921df4c6" sha1="1c0445f26f3607b9c7a69a5d308e587c1b8386b6" offset="0" />
@@ -7698,7 +7651,7 @@
<description>Meteors</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G13" />
+ <info name="release" value="SBG13" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="6875">
<rom name="meteors-v1(1982)(acornsoft)(g13).uef" size="6875" crc="c737a94a" sha1="f06045f46f052a614bb3e2625007cb6ed5fb719a" offset="0" />
@@ -7739,6 +7692,7 @@
<description>Microbe</description>
<year>1983</year>
<publisher>Virgin Games</publisher>
+ <info name="release" value="VGA2007" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="8640">
<rom name="microbe(1983)(virgin).uef" size="8640" crc="823c371a" sha1="5f7fc034e02c1f517277833fd6d6e3027896cc6d" offset="0" />
@@ -7748,7 +7702,7 @@
<software name="micrbudg">
<description>Micro Budget</description>
- <year>198?</year>
+ <year>1983</year>
<publisher>Micro Power</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="3142">
@@ -7770,7 +7724,7 @@
<software name="micrderb">
<description>Micro Derby</description>
- <year>198?</year>
+ <year>1983</year>
<publisher>Bug Byte</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="5731">
@@ -7895,7 +7849,7 @@
<description>Missile Base v2.0</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G18" />
+ <info name="release" value="SBG18" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="8534">
<rom name="missilebase-v2.0(1982)(acornsoft)(g18).uef" size="8534" crc="574b5833" sha1="d9cf1b4cbafb2921f1c24af1513d33c769354eab" offset="0" />
@@ -8006,7 +7960,7 @@
<description>Monsters v3.0</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G03" />
+ <info name="release" value="SBG03" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="7388">
<rom name="monsters-v3.0(1982)(acornsoft)(g03).uef" size="7388" crc="60ff8790" sha1="e4a6cdafac14471c2a090c822087fbeb67824ce5" offset="0" />
@@ -8018,7 +7972,7 @@
<description>Monsters v3.1</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G03" />
+ <info name="release" value="SBG03" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="7385">
<rom name="monsters-v3.1(1982)(acornsoft)(g03).uef" size="7385" crc="8a58e5cc" sha1="440fa54ec9852f42c8d50862e05c9fe99f3fe5c7" offset="0" />
@@ -8030,7 +7984,7 @@
<description>Monsters v3.2</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G03" />
+ <info name="release" value="SBG03" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="8699">
<rom name="monsters-v3.2(1982)(acornsoft)(g03).uef" size="8699" crc="9b7941e1" sha1="d1a408f1f895de16d9927863f89a27c1ff6e879b" offset="0" />
@@ -8178,7 +8132,7 @@
</software>
<software name="mrwiz">
- <description>Mr Wiz (Superior Software)</description>
+ <description>Mr Wiz</description>
<year>1984</year>
<publisher>Superior Software</publisher>
<part name="cass" interface="bbc_cass">
@@ -8285,17 +8239,6 @@
</part>
</software>
- <software name="mutantbr">
- <description>Mutant Breakout</description>
- <year>198?</year>
- <publisher>I.J.K.</publisher>
- <part name="cass" interface="bbc_cass">
- <dataarea name="cass" size="5346">
- <rom name="mutantbreakout(ijk).uef" size="5346" crc="69d134b0" sha1="cdbd3c5a970961fa4fe9f72c9dc848708f920708" offset="0" />
- </dataarea>
- </part>
- </software>
-
<software name="mutantsp">
<description>Mutant Spiders</description>
<year>1984</year>
@@ -8415,34 +8358,34 @@
<software name="nemesis">
<description>Nemesis</description>
- <year>1983</year>
+ <year>1984</year>
<publisher>Micro Power</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="6249">
- <rom name="nemesis(1983)(micropower).uef" size="6249" crc="1d572c82" sha1="f9f39f549141c6724f611629dfb25b063a74ef18" offset="0" />
+ <rom name="nemesis(1984)(micropower).uef" size="6249" crc="1d572c82" sha1="f9f39f549141c6724f611629dfb25b063a74ef18" offset="0" />
</dataarea>
</part>
</software>
<software name="networkpias" cloneof="network">
- <description>The Network (Play It Again Sam 15)</description>
- <year>1990</year>
+ <description>Network (Play It Again Sam 15)</description>
+ <year>1991</year>
<publisher>Superior Software</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="22580">
- <rom name="network-piasrr(198x)(superior).uef" size="22580" crc="965de4b5" sha1="835e61348df4437ef436a3f4d03f73ba450d9760" offset="0" />
+ <rom name="network-piasrr(1991)(superior).uef" size="22580" crc="965de4b5" sha1="835e61348df4437ef436a3f4d03f73ba450d9760" offset="0" />
</dataarea>
</part>
</software>
<software name="network">
<description>The Network</description>
- <year>1985</year>
+ <year>1986</year>
<publisher>Top Ten</publisher>
<info name="usage" value="Load with *RUN" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="18226">
- <rom name="network-pst_run(1985)(superior).uef" size="18226" crc="0ece4f10" sha1="d14a9cffc35e1277a998b5e5d694ba170198d2fb" offset="0" />
+ <rom name="network-pst_run(1986)(superior).uef" size="18226" crc="0ece4f10" sha1="d14a9cffc35e1277a998b5e5d694ba170198d2fb" offset="0" />
</dataarea>
</part>
</software>
@@ -8517,6 +8460,7 @@
<description>Noc-A-Bloc</description>
<year>1983</year>
<publisher>Virgin Games</publisher>
+ <info name="release" value="VGA2010" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="9701">
<rom name="nocabloc(1983)(virgin).uef" size="9701" crc="8887ca6c" sha1="0bec76407bcbeee579be2c24b83b871947020d7d" offset="0" />
@@ -8669,8 +8613,9 @@
<software name="owzat">
<description>Owzat</description>
- <year>198?</year>
+ <year>1983</year>
<publisher>Virgin Games</publisher>
+ <info name="release" value="VGA2005" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="9035">
<rom name="owzat(virgin).uef" size="9035" crc="dae0316d" sha1="f8378c67154e2493161324f686bfa70da6d6e754" offset="0" />
@@ -8713,7 +8658,7 @@
<software name="painting">
<description>Painting</description>
- <year>198?</year>
+ <year>1983</year>
<publisher>BBC Soft</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="7196">
@@ -8800,17 +8745,6 @@
</part>
</software>
- <software name="patience">
- <description>Patience</description>
- <year>1982</year>
- <publisher>I.J.K.</publisher>
- <part name="cass" interface="bbc_cass">
- <dataarea name="cass" size="3263">
- <rom name="patience(ijk).uef" size="3263" crc="1f0d1396" sha1="1bcec82abc08ad5cd36f6bfbfd1d55e34f07ee7b" offset="0" />
- </dataarea>
- </part>
- </software>
-
<software name="pcwbest">
<description>PCW Best of Software</description>
<year>198?</year>
@@ -8879,7 +8813,7 @@
<software name="pengwyn">
<description>Pengwyn</description>
- <year>198?</year>
+ <year>1984</year>
<publisher>Postern</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="7046">
@@ -8911,7 +8845,7 @@
</software>
<software name="ppenguin">
- <description>Percy Penguin (Superior Software)</description>
+ <description>Percy Penguin</description>
<year>1984</year>
<publisher>Superior Software</publisher>
<part name="cass" interface="bbc_cass">
@@ -8969,7 +8903,7 @@
<description>Philosopher's Quest</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G01" />
+ <info name="release" value="SBG01" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="16930">
<rom name="philosophersquest-v2.0(1982)(acornsoft)(g01).uef" size="16930" crc="0310eeb8" sha1="dfe227e334b3174029f5445b1b396eadc2fe2826" offset="0" />
@@ -9165,7 +9099,7 @@
<description>Planetoid v2.0</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G15" />
+ <info name="release" value="SBG15" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="8382">
<rom name="planetoid-v2.0(1982)(acornsoft)(g15).uef" size="8382" crc="c5a6ebed" sha1="27551cee8e8768b33d5fe2092c2fbeb5ecf3d787" offset="0" />
@@ -9177,7 +9111,7 @@
<description>Planetoid v2.1</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G15" />
+ <info name="release" value="SBG15" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="8381">
<rom name="planetoid-v2.1(1982)(acornsoft)(g15).uef" size="8381" crc="0ae03de4" sha1="06f40cdf9bdc69b89010713c30431f7b6c483c2c" offset="0" />
@@ -9189,6 +9123,7 @@
<description>Plankwalk</description>
<year>1983</year>
<publisher>Virgin Games</publisher>
+ <info name="release" value="VGA2008" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="5539">
<rom name="plankwalk(1983)(virgin).uef" size="5539" crc="7311e62b" sha1="0e188e80718dfde87d6e68360bf3e885e21e6648" offset="0" />
@@ -9264,7 +9199,7 @@
<software name="polaris">
<description>Polaris</description>
- <year>198?</year>
+ <year>1983</year>
<publisher>Bug Byte</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="3208">
@@ -9284,15 +9219,22 @@
</part>
</software>
- <software name="pontooni">
- <description>Pontoon (I.J.K.)</description>
- <year>198?</year>
+ <software name="pontoonp">
+ <description>Pontoon &amp; Patience</description>
+ <year>1983</year>
<publisher>I.J.K.</publisher>
- <part name="cass" interface="bbc_cass">
+ <part name="cass1" interface="bbc_cass">
+ <feature name="part_id" value="Pontoon"/>
<dataarea name="cass" size="5415">
<rom name="pontoon(ijk).uef" size="5415" crc="bbe959ab" sha1="b973eb2751ce3c86f7107409c23361c86cdbd9d6" offset="0" />
</dataarea>
</part>
+ <part name="cass2" interface="bbc_cass">
+ <feature name="part_id" value="Patience"/>
+ <dataarea name="cass" size="3263">
+ <rom name="patience(ijk).uef" size="3263" crc="1f0d1396" sha1="1bcec82abc08ad5cd36f6bfbfd1d55e34f07ee7b" offset="0" />
+ </dataarea>
+ </part>
</software>
<software name="pontoons">
@@ -9644,7 +9586,7 @@
<description>Quondam</description>
<year>1984</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G40" />
+ <info name="release" value="SBG40" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="19907">
<rom name="quondam-v1(1984)(acornsoft)(g40).uef" size="19907" crc="77491c63" sha1="8b1f5f462bc1eb52ffb70cbdc37e678617a7277f" offset="0" />
@@ -9912,17 +9854,6 @@
</part>
</software>
- <software name="reversim">
- <description>Reversi (Micro Power)</description>
- <year>198?</year>
- <publisher>Micro Power</publisher>
- <part name="cass" interface="bbc_cass">
- <dataarea name="cass" size="2150">
- <rom name="reversi(198x)(micropower).uef" size="2150" crc="45f2023a" sha1="b01cd4fbf1c0d0e2a8515c01e224871c6f3a3af4" offset="0" />
- </dataarea>
- </part>
- </software>
-
<software name="reversis">
<description>Reversi (Superior Software)</description>
<year>1983</year>
@@ -9938,7 +9869,7 @@
<description>Revs 4 Tracks</description>
<year>1985</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G44" />
+ <info name="release" value="SBG44" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="27303">
<rom name="revs4tracks-srr(1985)(acornsoft)(g44).uef" size="27303" crc="64da77c6" sha1="2f438e5c5e117e9c65833264790fb2c2c4158aa6" offset="0" />
@@ -9950,7 +9881,7 @@
<description>Revs</description>
<year>1984</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G43" />
+ <info name="release" value="SBG43" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="31111">
<rom name="revs.hq(1984)(acornsoft)(g43).uef" size="31111" crc="42b8a114" sha1="9d4ff3aa3370c49b4ace00162d2117f0fe2bc442" offset="0" />
@@ -10017,7 +9948,7 @@
<software name="ringtime">
<description>Ring of Time</description>
- <year>198?</year>
+ <year>1983</year>
<publisher>Kansas</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="9197">
@@ -10081,7 +10012,7 @@
<software name="roboman">
<description>Roboman</description>
- <year>198?</year>
+ <year>1984</year>
<publisher>Alligata</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="9661">
@@ -10127,7 +10058,7 @@
<description>Rocket Raid v1</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G05" />
+ <info name="release" value="SBG05" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="7912">
<rom name="rocketraid-v1(1982)(acornsoft)(g05).uef" size="7912" crc="15d61216" sha1="843e6ba8637352b946cef168cc1a46c900ca432d" offset="0" />
@@ -10139,7 +10070,7 @@
<description>Rocket Raid v2.0</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G05" />
+ <info name="release" value="SBG05" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="7931">
<rom name="rocketraid-v2.0(1982)(acornsoft)(g05).uef" size="7931" crc="4827a001" sha1="e67e12145a55be7f1152fe00d7185214abbf3a2b" offset="0" />
@@ -10151,7 +10082,7 @@
<description>Rocket Raid v2.1</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G05" />
+ <info name="release" value="SBG05" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="7933">
<rom name="rocketraid-v2.1(1982)(acornsoft)(g05).uef" size="7933" crc="f63b0425" sha1="e4178ad35c36791babca5bd5cb4328142eaf2b2c" offset="0" />
@@ -10236,7 +10167,7 @@
<software name="rowfour">
<description>Row of Four</description>
- <year>198?</year>
+ <year>1982</year>
<publisher>Software For All</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="4581">
@@ -10387,7 +10318,7 @@
<software name="runesmit">
<description>Runesmith</description>
- <year>19??</year>
+ <year>1983</year>
<publisher>Abraxas</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="16599">
@@ -10677,7 +10608,7 @@
<description>The Seventh Star</description>
<year>1984</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G36" />
+ <info name="release" value="SBG36" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="22732">
<rom name="seventhstar-v1.0(1984)(acornsoft)(g36).uef" size="22732" crc="a3202842" sha1="a83ddaf4e4d39e61aa44fd7eaa07dea510dbdd36" offset="0" />
@@ -10687,7 +10618,7 @@
<software name="shadowfa">
<description>Shadowfax</description>
- <year>198?</year>
+ <year>1983</year>
<publisher>Postern</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="3562">
@@ -10763,8 +10694,8 @@
</software>
<software name="shuttle">
- <description>Shuttle</description>
- <year>198?</year>
+ <description>Shuttle Pilot</description>
+ <year>1984</year>
<publisher>Oakleaf</publisher>
<info name="usage" value="Load with *RUN" />
<part name="cass" interface="bbc_cass">
@@ -10776,7 +10707,7 @@
<software name="siege">
<description>Siege</description>
- <year>198?</year>
+ <year>1983</year>
<publisher>Postern</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="2690">
@@ -10788,7 +10719,7 @@
<software name="sigmagic">
<description>Signals and Magic</description>
<year>198?</year>
- <publisher>H&amp;H</publisher>
+ <publisher>H&amp;H Software</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="9649">
<rom name="signalsandmagic(hnh).uef" size="9649" crc="19edfd4a" sha1="0353fbea7269b821a8174bdb51ced70e2eb36b7c" offset="0" />
@@ -10888,7 +10819,7 @@
<description>Sliding Block Puzzles v1.0</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G12" />
+ <info name="release" value="SBG12" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="13546">
<rom name="slidingblockpuzzles-v1.0(1982)(acornsoft)(g12).uef" size="13546" crc="731299fd" sha1="8208e7cdb6ba40713fb44922cdf0f893a72ca6d6" offset="0" />
@@ -10900,7 +10831,7 @@
<description>Sliding Block Puzzles v2.3</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G12" />
+ <info name="release" value="SBG12" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="14702">
<rom name="slidingblockpuzzles-v2.3(1982)(acornsoft)(g12).uef" size="14702" crc="dc26f6e9" sha1="684924eafe6e6054b2aa7c6ca55c01595ec1a330" offset="0" />
@@ -11010,7 +10941,7 @@
<software name="snakepit">
<description>Snake Pit</description>
- <year>198?</year>
+ <year>1983</year>
<publisher>Postern</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="2367">
@@ -11021,11 +10952,11 @@
<software name="snapperpias" cloneof="snapper">
<description>Snapper (Play It Again Sam 7)</description>
- <year>1988</year>
+ <year>1989</year>
<publisher>Superior Software</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="11761">
- <rom name="snapper-piasrr(198x)(superior)(g04).uef" size="11761" crc="94813097" sha1="47cf3fbfc77a5780bdfded18af1890f4f205e884" offset="0" />
+ <rom name="snapper-piasrr(1989)(superior)(g04).uef" size="11761" crc="94813097" sha1="47cf3fbfc77a5780bdfded18af1890f4f205e884" offset="0" />
</dataarea>
</part>
</software>
@@ -11034,7 +10965,7 @@
<description>Snapper v1</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G04" />
+ <info name="release" value="SBG04" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="6568">
<rom name="snapper-v1(1982)(acornsoft)(g04).uef" size="6568" crc="dd094359" sha1="7baac890a5d40f332f491d3eaebfcc7eaee18044" offset="0" />
@@ -11046,7 +10977,7 @@
<description>Snapper v2.1</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G04" />
+ <info name="release" value="SBG04" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="7330">
<rom name="snapper-v2.1(1982)(acornsoft)(g04).uef" size="7330" crc="d0ee1a50" sha1="aa34d0e1a6d3fb862194705b77a016822b54ceaf" offset="0" />
@@ -11058,7 +10989,7 @@
<description>Snapper v2.2</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G04" />
+ <info name="release" value="SBG04" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="7331">
<rom name="snapper-v2.2(1982)(acornsoft)(g04).uef" size="7331" crc="ef5ee5d1" sha1="1a365530f20fcbc99f5b4e9f36445c393b9482d8" offset="0" />
@@ -11070,7 +11001,7 @@
<description>Snooker (Acornsoft)</description>
<year>1983</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G21" />
+ <info name="release" value="SBG21" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="7270">
<rom name="snooker-acornsoft-v2.0(1983)(acornsoft)(g21).uef" size="7270" crc="d60da42b" sha1="79281c87db0191cc559f542dfcbc43a1ce15880a" offset="0" />
@@ -11169,10 +11100,21 @@
</part>
</software>
+ <software name="spacmaze">
+ <description>Space Maze</description>
+ <year>1981</year>
+ <publisher>Micro Power</publisher>
+ <part name="cass" interface="bbc_cass">
+ <dataarea name="cass" size="8096">
+ <rom name="spacemaze(1981)(micropower).uef" size="8096" crc="7ed8de96" sha1="6dd52f9832f8ff8d3b8e7fd94586fc7ddeb8b182" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="spadvpro">
- <description>Space Adventure Pro</description>
- <year>19??</year>
- <publisher>Pro</publisher>
+ <description>Space Adventure (Pro)</description>
+ <year>1982</year>
+ <publisher>Pro Software</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="9964">
<rom name="spaceadventure(pro).uef" size="9964" crc="b908950e" sha1="adb6336dacfa7873b18d0d36e006c71761e8eb36" offset="0" />
@@ -11253,7 +11195,7 @@
<software name="sphiway">
<description>Space Hi-way</description>
- <year>198?</year>
+ <year>1983</year>
<publisher>Amcom</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="9212">
@@ -11343,7 +11285,7 @@
<software name="spshuttx">
<description>Space Shuttle (Molimerx)</description>
- <year>198?</year>
+ <year>1983</year>
<publisher>Molimerx</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="5247">
@@ -11474,7 +11416,7 @@
<description>Sphinx Adventure</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G07" />
+ <info name="release" value="SBG07" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="13999">
<rom name="sphinxadventure-v1.0(1982)(acornsoft)(g07).uef" size="13999" crc="d71fcbc5" sha1="177135bfa47a0bc46cdcf29342aacb10339303e6" offset="0" />
@@ -11685,11 +11627,11 @@
<software name="starfind">
<description>Starfinder</description>
- <year>198?</year>
- <publisher>Mirrorsoft</publisher>
+ <year>1984</year>
+ <publisher>Century Communications</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="12077">
- <rom name="starfinder_be(mirrorsoft).uef" size="12077" crc="69d1bd3e" sha1="f2a5d0ed65165bbc72075569a3eb1d3890131363" offset="0" />
+ <rom name="starfinder_be(century).uef" size="12077" crc="69d1bd3e" sha1="f2a5d0ed65165bbc72075569a3eb1d3890131363" offset="0" />
</dataarea>
</part>
</software>
@@ -11763,7 +11705,7 @@
<software name="starmaze">
<description>Starmaze</description>
- <year>198?</year>
+ <year>1984</year>
<publisher>Software Invasion</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="9368">
@@ -11809,7 +11751,7 @@
<description>Starship Command</description>
<year>1983</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G22" />
+ <info name="release" value="SBG22" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="12949">
<rom name="starshipcommand-v1.1(1983)(acornsoft)(g22).uef" size="12949" crc="92204551" sha1="7606748c501013fde28357214e74134ce84b5d50" offset="0" />
@@ -11865,11 +11807,11 @@
<software name="starstri">
<description>Star Striker</description>
- <year>1987</year>
+ <year>1984</year>
<publisher>Superior Software</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="8405">
- <rom name="starstriker(1987)(superior).uef" size="8405" crc="3375b385" sha1="cdd7c4ffe4ba169d915ba5c6f2cf8f4498b78527" offset="0" />
+ <rom name="starstriker(1984)(superior).uef" size="8405" crc="3375b385" sha1="cdd7c4ffe4ba169d915ba5c6f2cf8f4498b78527" offset="0" />
</dataarea>
</part>
</software>
@@ -11897,17 +11839,6 @@
</part>
</software>
- <software name="startrkm">
- <description>Star Trek</description>
- <year>1983</year>
- <publisher>Micro Power</publisher>
- <part name="cass" interface="bbc_cass">
- <dataarea name="cass" size="6092">
- <rom name="startrek(1983)(micropower).uef" size="6092" crc="9daba7da" sha1="2562b7e8da65a5c80f909f477e36e9241f43c376" offset="0" />
- </dataarea>
- </part>
- </software>
-
<software name="startrka">
<description>Star Trek Adventure</description>
<year>1983</year>
@@ -12010,11 +11941,11 @@
<software name="stranded">
<description>Stranded</description>
- <year>1985</year>
+ <year>1984</year>
<publisher>Superior Software</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="10276">
- <rom name="stranded(1985)(superior).uef" size="10276" crc="78fe7e2c" sha1="4b639ea87776877127140cf3a39d2cf7794a8868" offset="0" />
+ <rom name="stranded(1984)(superior).uef" size="10276" crc="78fe7e2c" sha1="4b639ea87776877127140cf3a39d2cf7794a8868" offset="0" />
</dataarea>
</part>
</software>
@@ -12054,7 +11985,7 @@
<software name="stratobo">
<description>Stratobomber</description>
- <year>1982</year>
+ <year>1983</year>
<publisher>I.J.K.</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="5104">
@@ -12067,6 +11998,7 @@
<description>Street Patroller</description>
<year>19??</year>
<publisher>Central Computing</publisher>
+ <info name="usage" value="Load with *RUN" />
<part name="cass1" interface="bbc_cass">
<feature name="part_id" value="Side One"/>
<dataarea name="cass" size="15755">
@@ -12086,6 +12018,7 @@
<description>Street Patroller The Remix</description>
<year>19??</year>
<publisher>Central Computing</publisher>
+ <info name="usage" value="Load with *RUN" />
<part name="cass1" interface="bbc_cass">
<feature name="part_id" value="Side One"/>
<dataarea name="cass" size="23899">
@@ -12197,8 +12130,8 @@
</software>
<software name="super7">
- <description>Super 7</description>
- <year>198?</year>
+ <description>Super-7</description>
+ <year>1983</year>
<publisher>DACC</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="17337">
@@ -12255,7 +12188,7 @@
<description>Super Invaders</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G16" />
+ <info name="release" value="SBG16" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="6377">
<rom name="superinvaders-v1(1982)(acornsoft)(g16).uef" size="6377" crc="fd1fd9d5" sha1="35e7c2717a8ae193f9321fcb9a3734e1c3ea5668" offset="0" />
@@ -12377,7 +12310,7 @@
</software>
<software name="syncron">
- <description>Syncron</description>
+ <description>Syncron (The Superior Collection Vol.1)</description>
<year>1987</year>
<publisher>Superior Software</publisher>
<part name="cass" interface="bbc_cass">
@@ -12521,7 +12454,7 @@
</software>
<software name="tempterrgc" cloneof="tempterr">
- <description>Temple of Terror gcrr</description>
+ <description>Temple of Terror (The Gold Collection)</description>
<year>198?</year>
<publisher>Adventure Soft</publisher>
<part name="cass" interface="bbc_cass">
@@ -12615,7 +12548,7 @@
<description>Tetrapod</description>
<year>1984</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G32" />
+ <info name="release" value="SBG32" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="9542">
<rom name="tetrapod-v1(1984)(acornsoft)(g32).uef" size="9542" crc="8c1b883a" sha1="d2e327fc890d245dbc624b197b4bc0e86db09911" offset="0" />
@@ -12658,7 +12591,7 @@
<software name="archers">
<description>The Archers</description>
- <year>19??</year>
+ <year>1986</year>
<publisher>Mosaic</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="94604">
@@ -12852,7 +12785,7 @@
<software name="magsword">
<description>The Magic Sword</description>
- <year>198?</year>
+ <year>1984</year>
<publisher>Database</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="19213">
@@ -12929,9 +12862,9 @@
</software>
<software name="realyou">
- <description>The Real You</description>
- <year>19??</year>
- <publisher>Collinsoft</publisher>
+ <description>The Real You?</description>
+ <year>198?</year>
+ <publisher>Collins Soft</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="36155">
<rom name="therealyou(collinsoft).uef" size="36155" crc="63aa5fff" sha1="17d74f1bc544da9cde432deb94f1f00420702206" offset="0" />
@@ -13129,17 +13062,6 @@
</part>
</software>
- <software name="towealos">
- <description>Tower of Alos</description>
- <year>198?</year>
- <publisher>A&amp;F Software</publisher>
- <part name="cass" interface="bbc_cass">
- <dataarea name="cass" size="6425">
- <rom name="towerofalos(anf).uef" size="6425" crc="fd11ea22" sha1="c5af41e482249edfc7f568f93a27de19d2a9ba04" offset="0" />
- </dataarea>
- </part>
- </software>
-
<software name="traditio">
<description>Traditional Games</description>
<year>1983</year>
@@ -13184,7 +13106,7 @@
<software name="transrev">
<description>Transistor's Revenge</description>
<year>1983</year>
- <publisher>Softspot</publisher>
+ <publisher>SoftSpot</publisher>
<info name="usage" value="Load with *RUN" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="5964">
@@ -13228,8 +13150,9 @@
<software name="trench">
<description>Trench</description>
- <year>198?</year>
+ <year>1983</year>
<publisher>Virgin Games</publisher>
+ <info name="release" value="VGA2004" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="6117">
<rom name="trench(virgin).uef" size="6117" crc="c3d71202" sha1="05eabee7c1aac3db789c2a70e89746533bc24a49" offset="0" />
@@ -13524,7 +13447,7 @@
<software name="ultron">
<description>Ultron</description>
- <year>198?</year>
+ <year>1984</year>
<publisher>Icon</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="12102">
@@ -13577,7 +13500,7 @@
<software name="pendark">
<description>Unorthodox Engineers - The Pen and the Dark</description>
- <year>19??</year>
+ <year>1984</year>
<publisher>Mosaic</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="14660">
@@ -13599,8 +13522,8 @@
<software name="uridium">
<description>Uridium</description>
- <year>19??</year>
- <publisher>Hewson</publisher>
+ <year>1987</year>
+ <publisher>Hewson Consultants</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="17034">
<rom name="uridium.uef" size="17034" crc="377ddba7" sha1="ba14def9f8a7893ff50f3afce1fbfc849b1cd4b9" offset="0" />
@@ -13735,7 +13658,7 @@
<description>Volcano</description>
<year>1984</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G33" />
+ <info name="release" value="SBG33" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="9951">
<rom name="volcano-v1(1984)(acornsoft)(g33).uef" size="9951" crc="6750ea2f" sha1="5079d10c287cdab70bb1c73078fc05c488aff045" offset="0" />
@@ -13937,7 +13860,7 @@
</software>
<software name="eeyores">
- <description>What's Eeyores</description>
+ <description>What's Eeyore's</description>
<year>19??</year>
<publisher>Magus</publisher>
<part name="cass" interface="bbc_cass">
@@ -14207,7 +14130,7 @@
<software name="worldtra">
<description>World Travel Game</description>
- <year>198?</year>
+ <year>1983</year>
<publisher>Hessel</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="9350">
@@ -14252,7 +14175,7 @@
<software name="xanadu">
<description>Xanadu Adventure</description>
- <year>198?</year>
+ <year>1982</year>
<publisher>Hopesoft</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="18875">
@@ -14274,7 +14197,7 @@
<software name="xanagram">
<description>Xanagrams</description>
- <year>198?</year>
+ <year>1984</year>
<publisher>Postern</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="27303">
@@ -14353,7 +14276,7 @@
<software name="zarm">
<description>Zarm</description>
- <year>198?</year>
+ <year>1983</year>
<publisher>Micro Power</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="8557">
@@ -14386,7 +14309,7 @@
<software name="zombieis">
<description>Zombie Island</description>
- <year>198?</year>
+ <year>1982</year>
<publisher>Software For All</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="5791">
@@ -14395,17 +14318,6 @@
</part>
</software>
- <software name="zombies">
- <description>Zombies</description>
- <year>198?</year>
- <publisher>Micro Power</publisher>
- <part name="cass" interface="bbc_cass">
- <dataarea name="cass" size="1561">
- <rom name="zombies.uef" size="1561" crc="2457e0a7" sha1="d94bab3abed8122debeb4fc579b43e699033a828" offset="0" />
- </dataarea>
- </part>
- </software>
-
<software name="zoom">
<description>Zoom</description>
<year>198?</year>
@@ -14477,7 +14389,7 @@
<software name="commacco">
<description>Commercial Accounts</description>
- <year>198?</year>
+ <year>1982</year>
<publisher>Gemini</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="5322">
@@ -14497,26 +14409,14 @@
</part>
</software>
- <software name="dskdiary">
- <description>Desk Diary</description>
- <year>198?</year>
- <publisher>Acornsoft</publisher>
- <info name="release" value="B01" />
- <part name="cass" interface="bbc_cass">
- <dataarea name="cass" size="8831">
- <rom name="deskdiary(198x)(acornsoft)(b01).uef" size="8831" crc="fa88d857" sha1="e12a6e25e371a141c7152a8e88474be2967cb4c2" offset="0" />
- </dataarea>
- </part>
- </software>
-
<software name="forecast">
<description>Forecast</description>
- <year>198?</year>
+ <year>1983</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="B02" />
+ <info name="release" value="SBB02" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="13657">
- <rom name="forecast(198x)(acornsoft)(b02).uef" size="13657" crc="63f563b6" sha1="e3624dcd75ec92a610d152821931ef0a020681db" offset="0" />
+ <rom name="forecast(1983)(acornsoft)(b02).uef" size="13657" crc="63f563b6" sha1="e3624dcd75ec92a610d152821931ef0a020681db" offset="0" />
</dataarea>
</part>
</software>
@@ -14539,24 +14439,24 @@
<software name="pmoneyma">
<description>Personal Money Management</description>
- <year>198?</year>
+ <year>1983</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="B05" />
+ <info name="release" value="SBB05" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="11383">
- <rom name="personalmoneymanagement(198x)(acornsoft)(b05).uef" size="11383" crc="ab870373" sha1="8c287a4e4427ad60c023a651f78e78e8952f9abb" offset="0" />
+ <rom name="personalmoneymanagement(1983)(acornsoft)(b05).uef" size="11383" crc="ab870373" sha1="8c287a4e4427ad60c023a651f78e78e8952f9abb" offset="0" />
</dataarea>
</part>
</software>
<software name="stockcon">
<description>Stock Control</description>
- <year>198?</year>
+ <year>1984</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="B11" />
+ <info name="release" value="SNB11" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="4706">
- <rom name="stockcontrol(198x)(acornsoft)(b11).uef" size="4706" crc="b53b4c25" sha1="e91185367082cced699e8899e62e9d854d79cc6a" offset="0" />
+ <rom name="stockcontrol(1984)(acornsoft)(b11).uef" size="4706" crc="b53b4c25" sha1="e91185367082cced699e8899e62e9d854d79cc6a" offset="0" />
</dataarea>
</part>
</software>
@@ -14633,7 +14533,7 @@
<software name="animalve">
<description>Animal, Vegetable, Mineral</description>
- <year>198?</year>
+ <year>1983</year>
<publisher>Bourne Educational Software</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="6797">
@@ -14761,36 +14661,36 @@
<software name="chemanal">
<description>Chemical Analysis</description>
- <year>198?</year>
+ <year>1983</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="E12" />
+ <info name="release" value="SBE12" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="14615">
- <rom name="chemicalanalysis(198x)(acornsoft)(e12).uef" size="14615" crc="ba8cf4d3" sha1="8a3ce907763a834a2a1ddd8d26bbc25a9838e6c8" offset="0" />
+ <rom name="chemicalanalysis(1983)(acornsoft)(e12).uef" size="14615" crc="ba8cf4d3" sha1="8a3ce907763a834a2a1ddd8d26bbc25a9838e6c8" offset="0" />
</dataarea>
</part>
</software>
<software name="chemsimu">
<description>Chemical Simulations</description>
- <year>198?</year>
+ <year>1983</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="E13" />
+ <info name="release" value="SBE13" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="22182">
- <rom name="chemicalsimulations(198x)(acornsoft)(e13).uef" size="22182" crc="120f468c" sha1="991f98f80465c6a7e5c2d3db5b6228f5be247d64" offset="0" />
+ <rom name="chemicalsimulations(1983)(acornsoft)(e13).uef" size="22182" crc="120f468c" sha1="991f98f80465c6a7e5c2d3db5b6228f5be247d64" offset="0" />
</dataarea>
</part>
</software>
<software name="chemstru">
<description>Chemical Structures</description>
- <year>198?</year>
+ <year>1983</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="E14" />
+ <info name="release" value="SBE14" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="7832">
- <rom name="chemicalstructures(198x)(acornsoft)(e14).uef" size="7832" crc="854200b2" sha1="d1076fc51983acdd7eff655256d973a5daa01d4e" offset="0" />
+ <rom name="chemicalstructures(1983)(acornsoft)(e14).uef" size="7832" crc="854200b2" sha1="d1076fc51983acdd7eff655256d973a5daa01d4e" offset="0" />
</dataarea>
</part>
</software>
@@ -14828,6 +14728,7 @@
<description>Cranky</description>
<year>1984</year>
<publisher>Acornsoft/ASK</publisher>
+ <info name="release" value="XBE17" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="5841">
<rom name="cranky(1984)(acornsoftask).uef" size="5841" crc="5f3762eb" sha1="e16ab1e039313b89a4c06fd4936770a47ada9205" offset="0" />
@@ -14947,7 +14848,7 @@
<software name="eiffelto">
<description>Eiffel Tower</description>
- <year>198?</year>
+ <year>1983</year>
<publisher>Chalksoft</publisher>
<part name="cass1" interface="bbc_cass">
<feature name="part_id" value="Side 1"/>
@@ -14965,8 +14866,9 @@
<software name="facemake">
<description>Facemaker</description>
- <year>198?</year>
+ <year>1984</year>
<publisher>Acornsoft/ASK</publisher>
+ <info name="release" value="XBE10" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="10197">
<rom name="facemaker(acornsoftask).uef" size="10197" crc="17f9d198" sha1="256e585c013bf0a5c5bb1b7db122a9f4dfbf3a4b" offset="0" />
@@ -14985,35 +14887,35 @@
</part>
</software>
- <software name="fs26to8">
- <description>Fun School 2: For 6-8 Years</description>
- <year>1990</year>
- <publisher>Database</publisher>
+ <software name="fs2-68">
+ <description>Fun School 2 (For 6-8 year olds)</description>
+ <year>1989</year>
+ <publisher>Database Educational Software</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="23020">
- <rom name="funschool2-6to8_be(1990)(database).uef" size="23020" crc="e4a90cf1" sha1="e5c219e2df219baae6adb56b1294837fbbff598f" offset="0" />
+ <rom name="funschool2-6to8_be(1989)(database).uef" size="23020" crc="e4a90cf1" sha1="e5c219e2df219baae6adb56b1294837fbbff598f" offset="0" />
</dataarea>
</part>
</software>
- <software name="fs2ov8">
- <description>Fun School 2: For Over 8's</description>
- <year>1990</year>
- <publisher>Database</publisher>
+ <software name="fs2-ov8">
+ <description>Fun School 2 (For the Over-8s)</description>
+ <year>1989</year>
+ <publisher>Database Educational Software</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="25666">
- <rom name="funschool2-over8_be(1990)(database).uef" size="25666" crc="3b0179fa" sha1="7f68ae668e2771116fac37bf57c8448195a6e79d" offset="0" />
+ <rom name="funschool2-over8_be(1989)(database).uef" size="25666" crc="3b0179fa" sha1="7f68ae668e2771116fac37bf57c8448195a6e79d" offset="0" />
</dataarea>
</part>
</software>
- <software name="fs2un6">
- <description>Fun School 2: For Under 6's</description>
- <year>1990</year>
- <publisher>Database</publisher>
+ <software name="fs2-un6">
+ <description>Fun School 2 (For Under 6s)</description>
+ <year>1989</year>
+ <publisher>Database Educational Software</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="19488">
- <rom name="funschool2-under6_be(1990)(database).uef" size="19488" crc="5b96b37a" sha1="5da6422a91a4016f6eea1bd0ee81673e4290f00e" offset="0" />
+ <rom name="funschool2-under6_be(1989)(database).uef" size="19488" crc="5b96b37a" sha1="5da6422a91a4016f6eea1bd0ee81673e4290f00e" offset="0" />
</dataarea>
</part>
</software>
@@ -15055,6 +14957,7 @@
<description>Juggle Puzzle</description>
<year>1984</year>
<publisher>Acornsoft/ASK</publisher>
+ <info name="release" value="XBE27" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="8139">
<rom name="jugglepuzzle_be(1984)(acornsoftask).uef" size="8139" crc="1569b7c6" sha1="ad458c1d2a24879f61c1b4574c767c26a93fd08e" offset="0" />
@@ -15086,7 +14989,7 @@
<software name="jnrmath">
<description>Junior Maths Pack</description>
- <year>198?</year>
+ <year>1982</year>
<publisher>Micro Power</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="5641">
@@ -15097,7 +15000,7 @@
<software name="lsrlettr">
<description>Laser Letters</description>
- <year>198?</year>
+ <year>1984</year>
<publisher>Shards Software</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="23380">
@@ -15110,6 +15013,7 @@
<description>Let's Count</description>
<year>1984</year>
<publisher>Acornsoft/ASK</publisher>
+ <info name="release" value="XBE12" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="6036">
<rom name="letscount(1984)(acornsoftask).uef" size="6036" crc="263b4a12" sha1="f4f54fbb1a56301c20f6271b7c678d262dcd09e9" offset="0" />
@@ -15154,6 +15058,7 @@
<description>Number Gulper</description>
<year>1984</year>
<publisher>Acornsoft/ASK</publisher>
+ <info name="release" value="XBE13" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="11352">
<rom name="numbergulper_be(1984)(acornsoftask).uef" size="11352" crc="5cda773f" sha1="9f037647ff6bf5107f3282e231098125b5b548d1" offset="0" />
@@ -15198,6 +15103,7 @@
<description>Podd</description>
<year>1984</year>
<publisher>Acornsoft/ASK</publisher>
+ <info name="release" value="XBE26" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="10487">
<rom name="podd_be(1984)(acornsoftask).uef" size="10487" crc="dac846b0" sha1="3b1d08c721338a38c4d2b74c91ddfed4986eb079" offset="0" />
@@ -15218,7 +15124,7 @@
<software name="puncmn12">
<description>Puncman 1 and 2</description>
- <year>198?</year>
+ <year>1983</year>
<publisher>Chalksoft</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="6966">
@@ -15240,30 +15146,30 @@
<software name="science1">
<description>Science 1</description>
- <year>1985</year>
+ <year>1984</year>
<publisher>Shards Software</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="15699">
- <rom name="science1(1985)(shards).uef" size="15699" crc="23a70afc" sha1="c9c15955612e50169ac5a8030b50489c0be8c57c" offset="0" />
+ <rom name="science1(1984)(shards).uef" size="15699" crc="23a70afc" sha1="c9c15955612e50169ac5a8030b50489c0be8c57c" offset="0" />
</dataarea>
</part>
</software>
<software name="sentseq">
<description>Sentence Sequencing</description>
- <year>198?</year>
+ <year>1983</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="E07" />
+ <info name="release" value="SBE07" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="8628">
- <rom name="sentencesequencing(198x)(acornsoft)(e07).uef" size="8628" crc="a7cbdc3b" sha1="ee718b17f7810fffdc309b693873bafca8018933" offset="0" />
+ <rom name="sentencesequencing(1983)(acornsoft)(e07).uef" size="8628" crc="a7cbdc3b" sha1="ee718b17f7810fffdc309b693873bafca8018933" offset="0" />
</dataarea>
</part>
</software>
<software name="spanishg">
<description>Spanish Gold</description>
- <year>198?</year>
+ <year>1983</year>
<publisher>Chalksoft</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="23459">
@@ -15358,12 +15264,12 @@
<software name="treeknow">
<description>Tree Of Knowledge</description>
- <year>198?</year>
+ <year>1983</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="E04" />
+ <info name="release" value="SBE04" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="10563">
- <rom name="treeofknowlege(198x)(acornsoft)(e04).uef" size="10563" crc="3c8b5c61" sha1="53d21c483fcbfacb22fb1afc63d1f38bc479e6f2" offset="0" />
+ <rom name="treeofknowlege(1983)(acornsoft)(e04).uef" size="10563" crc="3c8b5c61" sha1="53d21c483fcbfacb22fb1afc63d1f38bc479e6f2" offset="0" />
</dataarea>
</part>
</software>
@@ -15381,7 +15287,7 @@
<software name="where">
<description>Where</description>
- <year>198?</year>
+ <year>1982</year>
<publisher>Micro Power</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="6504">
@@ -15424,7 +15330,7 @@
</software>
<software name="wordsqua">
- <description>Wordsquare - Seabattle - Pickapair</description>
+ <description>Wordsquare/Seabattle/Pick-A-Pair</description>
<year>198?</year>
<publisher>Garland Computing</publisher>
<part name="cass" interface="bbc_cass">
@@ -15447,7 +15353,7 @@
<software name="worldwis">
<description>World-Wise</description>
- <year>198?</year>
+ <year>1983</year>
<publisher>Bourne Educational Software</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="8377">
@@ -15460,34 +15366,34 @@
<description>Spooky Manor</description>
<year>1984</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="E18" />
+ <info name="release" value="SBE18" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="17433">
- <rom name="spookymanor-v1(198x)(acornsoft)(e18).uef" size="17433" crc="14f8ddae" sha1="17a0e69bfb907557f7f90003eeb1cc351fc3ae97" offset="0" />
+ <rom name="spookymanor-v1(1984)(acornsoft)(e18).uef" size="17433" crc="14f8ddae" sha1="17a0e69bfb907557f7f90003eeb1cc351fc3ae97" offset="0" />
</dataarea>
</part>
</software>
<software name="workshop">
<description>Workshop</description>
- <year>198?</year>
+ <year>1984</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="E23" />
+ <info name="release" value="SBE23" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="11126">
- <rom name="workshop-v1(198x)(acornsoft)(e23).uef" size="11126" crc="abfeb34b" sha1="512dd8b9ca14cefb27978392bcb5ffb98535a715" offset="0" />
+ <rom name="workshop-v1(1984)(acornsoft)(e23).uef" size="11126" crc="abfeb34b" sha1="512dd8b9ca14cefb27978392bcb5ffb98535a715" offset="0" />
</dataarea>
</part>
</software>
<software name="abc">
<description>ABC</description>
- <year>198?</year>
+ <year>1984</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="E24" />
+ <info name="release" value="SBE24" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="13886">
- <rom name="abc(198x)(acornsoft)(e24).uef" size="13886" crc="1da6a521" sha1="0b3ea05602f07fe084f46723f65613f1a13d5a56" offset="0" />
+ <rom name="abc(1984)(acornsoft)(e24).uef" size="13886" crc="1da6a521" sha1="0b3ea05602f07fe084f46723f65613f1a13d5a56" offset="0" />
</dataarea>
</part>
</software>
@@ -15524,10 +15430,10 @@
</software>
<software name="forth">
- <description>Forth</description>
+ <description>FORTH</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="L01" />
+ <info name="release" value="SBL01" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="17212">
<rom name="forth(acornsoft).uef" size="17212" crc="1eda123d" sha1="f4a545734043bc631bfc3affa7bda26203c89b42" offset="0" />
@@ -15535,18 +15441,6 @@
</part>
</software>
- <software name="lisp">
- <description>LISP</description>
- <year>1982</year>
- <publisher>Acornsoft</publisher>
- <info name="release" value="L02" />
- <part name="cass" interface="bbc_cass">
- <dataarea name="cass" size="12734">
- <rom name="lisp(1982)(acornsoft)(l02).uef" size="12734" crc="f93222c5" sha1="fd2b12ce8a273d0b2340c86627c82dec85a7366e" offset="0" />
- </dataarea>
- </part>
- </software>
-
<!-- Graphics and other -->
<software name="advgraph">
@@ -15639,7 +15533,7 @@
<software name="bbcmusyn">
<description>BBC Music Synthesizer</description>
- <year>198?</year>
+ <year>1983</year>
<publisher>Bug Byte</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="7696">
@@ -15661,7 +15555,7 @@
<software name="beebsynt">
<description>Beeb Synth</description>
- <year>198?</year>
+ <year>1984</year>
<publisher>Clares</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="5595">
@@ -15681,18 +15575,6 @@
</part>
</software>
- <software name="crgraph">
- <description>Creative Graphics</description>
- <year>198?</year>
- <publisher>Acornsoft</publisher>
- <info name="release" value="X01" />
- <part name="cass" interface="bbc_cass">
- <dataarea name="cass" size="9543">
- <rom name="creativegraphics(198x)(acornsoft)(x01).uef" size="9543" crc="b1879555" sha1="5f603d2a1c0693c4d91d8695e473e65e5c6ba3c5" offset="0" />
- </dataarea>
- </part>
- </software>
-
<software name="graphpac">
<description>Graphics Package</description>
<year>198?</year>
@@ -15726,7 +15608,7 @@
<description>Picture Maker</description>
<year>1983</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="X03" />
+ <info name="release" value="SBX03" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="18501">
<rom name="picturemaker(1983)(acornsoft)(x03).uef" size="18501" crc="5a1ad93a" sha1="a7bec5e1b1271335e33f9fdb92b1bb0dfe01a232" offset="0" />
@@ -15738,7 +15620,7 @@
<description>Shirley Conran's Magic Garden</description>
<year>1983</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="X04" />
+ <info name="release" value="SBX04" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="14024">
<rom name="shirleyconransmagicgarden(1983)(acornsoft)(x04).uef" size="14024" crc="19697140" sha1="992cf0986bffcc8c8c5bf7eccd262ab34157298b" offset="0" />
@@ -15748,33 +15630,33 @@
<software name="onetonin">
<description>One to Nine</description>
- <year>198?</year>
- <publisher>Acornsoft</publisher>
- <info name="release" value="X07" />
+ <year>1984</year>
+ <publisher>Acornsoft/ICL</publisher>
+ <info name="release" value="SBX07" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="6845">
- <rom name="onetonine(198x)(acornsoft)(x07).uef" size="6845" crc="c9cdc624" sha1="63e3f8d61c49773f2c9437bfb103a0787cf70e5a" offset="0" />
+ <rom name="onetonine(1984)(acornsoft)(x07).uef" size="6845" crc="c9cdc624" sha1="63e3f8d61c49773f2c9437bfb103a0787cf70e5a" offset="0" />
</dataarea>
</part>
</software>
<software name="pauldani">
<description>Paul Daniel's Magic Show</description>
- <year>198?</year>
+ <year>1984</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="X11" />
+ <info name="release" value="SBX11" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="25634">
- <rom name="pauldanielsmagicshow(198x)(acornsoft)(x11).uef" size="25634" crc="794f3de0" sha1="efa0139ad02dac3867fb4a446216b384ffb58efa" offset="0" />
+ <rom name="pauldanielsmagicshow(1984)(acornsoft)(x11).uef" size="25634" crc="794f3de0" sha1="efa0139ad02dac3867fb4a446216b384ffb58efa" offset="0" />
</dataarea>
</part>
</software>
<software name="lwordspa">
- <description>Linkword Spanish</description>
+ <description>LINKWORD Spanish</description>
<year>1984</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="X15" />
+ <info name="release" value="SBX15" />
<part name="cass1" interface="bbc_cass">
<feature name="part_id" value="Side 1"/>
<dataarea name="cass" size="25919">
@@ -15936,7 +15818,7 @@
<software name="augraphi">
<description>Acorn User Graphics</description>
- <year>198?</year>
+ <year>1985</year>
<publisher>Acorn User</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="23174">
diff --git a/hash/bbcb_de_cass.xml b/hash/bbcb_cass_de.xml
index 60d499216ca..9673fc6b484 100644
--- a/hash/bbcb_de_cass.xml
+++ b/hash/bbcb_cass_de.xml
@@ -12,7 +12,7 @@
To start/stop the tape you must use the MESS menus, so you'll have to turn full keyboard mode off with Scroll Lock, then navigate the menus, turning Scroll Lock back on when you're finished.
-->
-<softwarelist name="bbcb_de_cass" description="BBC Micro Model B (German) cassettes">
+<softwarelist name="bbcb_cass_de" description="BBC Micro Model B (German) cassettes">
<!-- Games -->
@@ -20,6 +20,7 @@
<description>Hopper (Ger)</description>
<year>1983</year>
<publisher>Acornsoft</publisher>
+ <info name="release" value="SBG23" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="8112">
<rom name="hopper-german(1983)(acornsoft)(g23).uef" size="8112" crc="3972b897" sha1="b5f7897dcad92b758d0473ac840f2b41e8049ef4" offset="0" />
@@ -31,6 +32,7 @@
<description>Meteors (Ger)</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
+ <info name="release" value="SBG13" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="6610">
<rom name="meteors-german(1982)(acornsoft)(g13).uef" size="6610" crc="0bb65e55" sha1="238ba733b0094942dd477ca49754249284741c40" offset="0" />
@@ -42,6 +44,7 @@
<description>Monsters (Ger)</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
+ <info name="release" value="SBG03" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="7890">
<rom name="monsters-german(1982)(acornsoft)(g03).uef" size="7890" crc="37838358" sha1="c3c698a8174d0b67d6ee563bcecb9a42354ae3fc" offset="0" />
@@ -53,6 +56,7 @@
<description>Planetoid (Ger)</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
+ <info name="release" value="SBG15" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="8515">
<rom name="planetoid-german(1982)(acornsoft)(g15).uef" size="8515" crc="bfaa94f8" sha1="fc8cb246c19cd717f7684074979ea5cb6d98e4fb" offset="0" />
@@ -64,6 +68,7 @@
<description>Rocket Raid (Ger)</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
+ <info name="release" value="SBG05" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="7747">
<rom name="rocketraid-german(1982)(acornsoft)(g05).uef" size="7747" crc="3a6ccbd0" sha1="afd7318589bb419606b25b575c7488369acf2c9b" offset="0" />
@@ -75,6 +80,7 @@
<description>Snapper (Ger)</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
+ <info name="release" value="SBG04" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="7174">
<rom name="snapper-german(1982)(acornsoft)(g04).uef" size="7174" crc="6ffbe578" sha1="0cc295dba1b771475ae8e71340b6ce4f885040e9" offset="0" />
@@ -86,6 +92,7 @@
<description>Super Invaders (Ger)</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
+ <info name="release" value="SBG16" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="7812">
<rom name="superinvaders-german(1982)(acornsoft)(g16).uef" size="7812" crc="382b3412" sha1="4361fba1203b07fb05f62273ac02db403a3f38ce" offset="0" />
@@ -108,8 +115,9 @@
<software name="dskdiarg">
<description>Desk Diary (Ger)</description>
- <year>198?</year>
+ <year>1982</year>
<publisher>Acornsoft</publisher>
+ <info name="release" value="SBB01" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="9739">
<rom name="deskdiary-german(198x)(acornsoft)(b01).uef" size="9739" crc="7ef32892" sha1="ec3910be9c7b5c1729586ba88a88173d08dcf34b" offset="0" />
@@ -119,8 +127,44 @@
<!-- Educational -->
+ <software name="peekocg">
+ <description>Peeko-Computer (Ger)</description>
+ <year>1982</year>
+ <publisher>Acornsoft</publisher>
+ <info name="release" value="SBE02" />
+ <part name="cass" interface="bbc_cass">
+ <dataarea name="cass" size="4821">
+ <rom name="peekocomputer-german(198x)(acornsoft)(e02).uef" size="4821" crc="c6503a6b" sha1="813a6399a45a75a4aab3d2edd1722488edf41a52" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="busgames">
+ <description>Managementspiele (Ger)</description>
+ <year>1982</year>
+ <publisher>Acornsoft</publisher>
+ <info name="release" value="SBE03" />
+ <part name="cass" interface="bbc_cass">
+ <dataarea name="cass" size="11858">
+ <rom name="businessgames-german(198x)(acornsoft)(e03).uef" size="11858" crc="ae23e0dd" sha1="2a4ca1e06870e41d9fa4c4e86ab196251869b160" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="missigns">
+ <description>Fehlende Zeichen (Ger)</description>
+ <year>1983</year>
+ <publisher>Acornsoft</publisher>
+ <info name="release" value="SBE09" />
+ <part name="cass" interface="bbc_cass">
+ <dataarea name="cass" size="11055">
+ <rom name="missingsigns-german(1983)(acornsoft)(e09).uef" size="11055" crc="3a6c4f59" sha1="e02115cbf2cdcc0996b12fe8db25c02ca234248b" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="numberbg">
- <description>Number Balance (Ger)</description>
+ <description>Zahlenwaage (Ger)</description>
<year>198?</year>
<publisher>Acornsoft/ESM</publisher>
<part name="cass" interface="bbc_cass">
@@ -131,9 +175,10 @@
</software>
<software name="sentseqg">
- <description>Sentence Sequencing (Ger)</description>
+ <description>Satzsalat (Ger)</description>
<year>198?</year>
<publisher>Acornsoft</publisher>
+ <info name="release" value="SBE07" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="10769">
<rom name="sentencesequencing-german(198x)(acornsoft)(e07).uef" size="10769" crc="28955bf7" sha1="f6422764589cbe5d1acefca2d90f288b95e84280" offset="0" />
@@ -142,20 +187,22 @@
</software>
<software name="treeknog">
- <description>Tree Of Knowledge (Ger)</description>
- <year>198?</year>
+ <description>Baum der Weisheit (Ger)</description>
+ <year>1983</year>
<publisher>Acornsoft</publisher>
+ <info name="release" value="SBE04" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="11319">
- <rom name="treeofknowledge-german(198x)(acornsoft)(e04).uef" size="11319" crc="c1b66b33" sha1="53bd97ccc48c5b00a1e57728800e786b6a9d30d9" offset="0" />
+ <rom name="treeofknowledge-german(1983)(acornsoft)(e04).uef" size="11319" crc="c1b66b33" sha1="53bd97ccc48c5b00a1e57728800e786b6a9d30d9" offset="0" />
</dataarea>
</part>
</software>
<software name="jars">
- <description>Jars (Ger)</description>
+ <description>Kruege (Ger)</description>
<year>198?</year>
<publisher>Acornsoft</publisher>
+ <info name="release" value="SBE15" />
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="8325">
<rom name="jars-german(198x)(acornsoft)(e15).uef" size="8325" crc="943ba245" sha1="5a911796040eb708926d5c9e1aecb3d0e7ea546b" offset="0" />
@@ -163,4 +210,28 @@
</part>
</software>
+ <software name="wordhunt">
+ <description>Wort-Schatzsuche (Ger)</description>
+ <year>1983</year>
+ <publisher>Acornsoft</publisher>
+ <info name="release" value="SBE05" />
+ <part name="cass" interface="bbc_cass">
+ <dataarea name="cass" size="10849">
+ <rom name="wordhunt-german(1983)(acornsoft)(e05).uef" size="10849" crc="e412d5af" sha1="3163432f2388b0795ec03b61ab77e90e37a3f18d" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wordseqg">
+ <description>Wortsalat (Ger)</description>
+ <year>1983</year>
+ <publisher>Acornsoft</publisher>
+ <info name="release" value="SBE06" />
+ <part name="cass" interface="bbc_cass">
+ <dataarea name="cass" size="10883">
+ <rom name="wordsequencing-german(1983)(acornsoft)(e06).uef" size="10883" crc="605ebb74" sha1="5d2b67151889a0fa90c490dd4db40d579a8fb386" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
</softwarelist>
diff --git a/hash/bbcb_flop.xml b/hash/bbcb_flop.xml
index a735b8a5b72..2cdfb1ae053 100644
--- a/hash/bbcb_flop.xml
+++ b/hash/bbcb_flop.xml
@@ -56,6 +56,7 @@
<description>Elite</description>
<year>1984</year>
<publisher>Acornsoft</publisher>
+ <info name="release" value="SNG38" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="204800">
<rom name="elitebbc.ssd" size="204800" crc="1f15458d" sha1="ac47c0d6d0006ceef2102dda521df3364aff32aa" offset="0" />
@@ -67,6 +68,7 @@
<description>Elite (Executive Edition)</description>
<year>1986</year>
<publisher>Acornsoft</publisher>
+ <info name="release" value="SNG47" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="204800">
<rom name="elite_executive.ssd" size="204800" crc="f10aea60" sha1="cbd40dd9cad231f2f093e64665a69b64ddab5608" offset="0" />
@@ -180,7 +182,7 @@
</part>
</software>
- <software name="mapocaly">
+ <software name="megapoca">
<description>Mega-Apocalypse</description>
<year>1988</year>
<publisher>Martech</publisher>
diff --git a/hash/bbcb_orig_flop.xml b/hash/bbcb_flop_orig.xml
index f60270162a0..37eb2c4b212 100644
--- a/hash/bbcb_orig_flop.xml
+++ b/hash/bbcb_flop_orig.xml
@@ -12,7 +12,7 @@
<!-- All images in this list were created from original discs, most contain copy protection. -->
-<softwarelist name="bbcb_orig_flop" description="BBC Micro Model B Original disks">
+<softwarelist name="bbcb_flop_orig" description="BBC Micro Model B Original disks">
<!-- Games -->
@@ -20,7 +20,7 @@
<description>Magic Mushrooms</description>
<year>1985</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G46" />
+ <info name="release" value="SNG46" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="55146">
<rom name="004 magic mushrooms.fsd" size="55146" crc="cac03f12" sha1="6efe0e75045805057ec45c44338ba5d2e9ec2c4e" offset="0" />
@@ -32,7 +32,7 @@
<description>Arcadians</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G14" />
+ <info name="release" value="SNG14" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="35063">
<rom name="005 arcadians.fsd" size="35063" crc="9e2f412b" sha1="6c833c589a619a4dac186d7e7a1db02b94ee8aba" offset="0" />
@@ -44,7 +44,7 @@
<description>Arcadians (40/80t)</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G14" />
+ <info name="release" value="SNG14" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="55277">
<rom name="006 arcadians 40-80.fsd" size="55277" crc="94e7e5cf" sha1="66c84208dd461605ed48233b02e3ee6570e95de3" offset="0" />
@@ -56,7 +56,7 @@
<description>Boxer (40/80t)</description>
<year>1984</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G31" />
+ <info name="release" value="SNG31" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="55273">
<rom name="007 boxer 40-80.fsd" size="55273" crc="365164a9" sha1="7f25cfa4f4cfccfbcececd0619884d02f1023628" offset="0" />
@@ -68,7 +68,7 @@
<description>Hopper (40/80t)</description>
<year>1983</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G23" />
+ <info name="release" value="SNG23" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="101175">
<rom name="008 hopper 40-80.fsd" size="101175" crc="597ee0d9" sha1="3e0e2ad75147ab28cc514f125221c4e765f5f308" offset="0" />
@@ -80,7 +80,7 @@
<description>Volcano</description>
<year>1984</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G33" />
+ <info name="release" value="SNG33" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="55275">
<rom name="009 volcano.fsd" size="55275" crc="4e16b301" sha1="8775b14d2bb46b3e4254f3e7227463ff77cfd619" offset="0" />
@@ -92,7 +92,7 @@
<description>Meteors</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G13" />
+ <info name="release" value="SNG13" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="24709">
<rom name="010 meteors.fsd" size="24709" crc="9f4226a2" sha1="6f529751be461cb695bad9778d2f4998784fda34" offset="0" />
@@ -104,7 +104,7 @@
<description>Labyrinth</description>
<year>1984</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G41" />
+ <info name="release" value="SNG41" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="55277">
<rom name="011 labyrinth.fsd" size="55277" crc="919768d4" sha1="12e9b368afa58198c823e789ad4827ff6aaabbb3" offset="0" />
@@ -114,9 +114,9 @@
<software name="bboxgamb">
<description>Black Box and Gambit</description>
- <year>198?</year>
+ <year>1984</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G34" />
+ <info name="release" value="SNG34" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="102329">
<rom name="015 black box and gambit.fsd" size="102329" crc="876b301b" sha1="c5114ea239fd42e4ae6d64c98b25a7f1ed714581" offset="0" />
@@ -128,7 +128,7 @@
<description>Meteor Mission</description>
<year>1983</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G29" />
+ <info name="release" value="SNG29" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="55282">
<rom name="016 meteor mission.fsd" size="55282" crc="8c538999" sha1="abab70a653d18ed50ab0d838cb9fe89efedb9aa9" offset="0" />
@@ -140,7 +140,7 @@
<description>Tetrapod</description>
<year>1984</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G32" />
+ <info name="release" value="SNG32" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="55276">
<rom name="017 tetrapod.fsd" size="55276" crc="bc5f3936" sha1="0752cabb3c168cb4695df1d668c9a968c7b44979" offset="0" />
@@ -152,7 +152,7 @@
<description>Firebug</description>
<year>1984</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G39" />
+ <info name="release" value="SNG39" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="55275">
<rom name="018 firebug.fsd" size="55275" crc="826d3399" sha1="0120f272bc4de8f6ffa480bfc235e0a579c85444" offset="0" />
@@ -164,7 +164,7 @@
<description>Snapper</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G04" />
+ <info name="release" value="SNG04" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="55138">
<rom name="019 snapper.fsd" size="55138" crc="526d12a5" sha1="a40b51aa75e02bd096e08c13fd8372e0f2c71069" offset="0" />
@@ -176,7 +176,7 @@
<description>Drogna</description>
<year>1983</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G27" />
+ <info name="release" value="SNG27" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="55274">
<rom name="020 drogna.fsd" size="55274" crc="4ff2895f" sha1="019545da835024bf31959d78bab351988c60ba47" offset="0" />
@@ -188,7 +188,7 @@
<description>Go</description>
<year>1984</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G42" />
+ <info name="release" value="SNG42" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="55270">
<rom name="026 go.fsd" size="55270" crc="bb260970" sha1="cdbca519a0825c2d54a08e685cc5dc2cb9ce2842" offset="0" />
@@ -200,7 +200,7 @@
<description>Maze</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G11" />
+ <info name="release" value="SNG11" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="55272">
<rom name="027 maze.fsd" size="55272" crc="38c998e4" sha1="00eee0558e2f12ba864b9612a09e911e5ba61e2e" offset="0" />
@@ -212,7 +212,7 @@
<description>Quondam</description>
<year>1984</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G40" />
+ <info name="release" value="SNG40" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="55275">
<rom name="028 quondam.fsd" size="55275" crc="10efe562" sha1="09c5069b68ff7dbfcfabfb0a04934e153d664945" offset="0" />
@@ -224,7 +224,7 @@
<description>Bouncer</description>
<year>1984</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G35" />
+ <info name="release" value="SNG35" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="55275">
<rom name="029 bouncer.fsd" size="55275" crc="8166acf9" sha1="bc3f9fe318d6f22266698f3d70f9ba3509510813" offset="0" />
@@ -236,7 +236,7 @@
<description>Revs</description>
<year>1984</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G43" />
+ <info name="release" value="SNG43" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="104934">
<rom name="030 revs.fsd" size="104934" crc="48f95827" sha1="2a8d2e82f1d4b0fdd56d39e2400f445a59855f98" offset="0" />
@@ -248,7 +248,7 @@
<description>Revs 4 Tracks</description>
<year>1985</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G44" />
+ <info name="release" value="SNG44" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="102322">
<rom name="031 revs 4 tracks.fsd" size="102322" crc="d1cbdf33" sha1="b4281b2b55c292b7ed96798a52139d9a1a50b661" offset="0" />
@@ -260,7 +260,7 @@
<description>Acheton</description>
<year>1984</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G37" />
+ <info name="release" value="SNG37" />
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Program"/>
<dataarea name="flop" size="102461">
@@ -279,7 +279,7 @@
<description>Monsters</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G03" />
+ <info name="release" value="SNG03" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="55276">
<rom name="034 monsters.fsd" size="55276" crc="ba2223e5" sha1="66359136ad78a049733eca596a77115037fdbe82" offset="0" />
@@ -291,7 +291,7 @@
<description>Monsters (40t)</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G03" />
+ <info name="release" value="SNG03" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="24710">
<rom name="054 monsters 40track.fsd" size="24710" crc="3e371d1d" sha1="f35c4b15f8f3358c4ff9c6fc63c850d228f2e6b3" offset="0" />
@@ -303,7 +303,7 @@
<description>Snooker</description>
<year>1983</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G21" />
+ <info name="release" value="SNG21" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="55275">
<rom name="035 snooker.fsd" size="55275" crc="08eaa805" sha1="42254fc9b39029f30abac5e4c2da6eeec16dec4a" offset="0" />
@@ -315,7 +315,7 @@
<description>Carousel</description>
<year>1983</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G24" />
+ <info name="release" value="SNG24" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="101177">
<rom name="036 carousel.fsd" size="101177" crc="dac1680a" sha1="b70cd85993adc22155ef750ef0ec3905e429d195" offset="0" />
@@ -327,7 +327,7 @@
<description>Free Fall</description>
<year>1983</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G28" />
+ <info name="release" value="SNG28" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="55277">
<rom name="037 free fall.fsd" size="55277" crc="eca72121" sha1="279300664a66bc95908fe48a37075adc24fb5aa1" offset="0" />
@@ -339,7 +339,7 @@
<description>Crazy Tracer</description>
<year>1983</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G26" />
+ <info name="release" value="SNG26" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="101318">
<rom name="038 crazy tracer.fsd" size="101318" crc="40d4e30b" sha1="1a35ba220245b1d75319628c1c0cd5fcd53b82e9" offset="0" />
@@ -351,7 +351,7 @@
<description>Kingdom of Hamil</description>
<year>1983</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G25" />
+ <info name="release" value="SNG25" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="73134">
<rom name="039 kingdom of hamil.fsd" size="73134" crc="3fe60d1e" sha1="a441d9c67a1677069f855e3b29f638b47b18aaea" offset="0" />
@@ -363,7 +363,7 @@
<description>Starship Command</description>
<year>1983</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G22" />
+ <info name="release" value="SNG22" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="101185">
<rom name="040 starship command.fsd" size="101185" crc="f0bc6523" sha1="446ca8e624a0edfe29540e94b6ad76fcd80b9bfc" offset="0" />
@@ -375,7 +375,7 @@
<description>Countdown to Doom</description>
<year>1984</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G19" />
+ <info name="release" value="SNG19" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="73495">
<rom name="041 countdown to doom.fsd" size="73495" crc="ba37517e" sha1="2cb63f7f044e99bd38abab273229c303f5801259" offset="0" />
@@ -387,7 +387,7 @@
<description>Missile Base</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G18" />
+ <info name="release" value="SNG18" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="101181">
<rom name="042 missile base.fsd" size="101181" crc="91a46fa1" sha1="6afc77cb445e4aa1e8069ae9134449d51786b704" offset="0" />
@@ -399,7 +399,7 @@
<description>Philosopher's Quest</description>
<year>1984</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G01" />
+ <info name="release" value="SNG01" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="55287">
<rom name="043 philosopher's quest.fsd" size="55287" crc="d69898f3" sha1="ea76abc3dd58565d9219c76e2c15db3168ec96be" offset="0" />
@@ -411,7 +411,7 @@
<description>Aviator</description>
<year>1983</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G02" />
+ <info name="release" value="SNG02" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="55275">
<rom name="044 aviator.fsd" size="55275" crc="8249a0f0" sha1="a6f2a56059851b211c0dc753b14643571b3f4002" offset="0" />
@@ -423,7 +423,7 @@
<description>Sphinx Adventure</description>
<year>1983</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G07" />
+ <info name="release" value="SNG07" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="55284">
<rom name="045 sphinx adventure.fsd" size="55284" crc="65f04493" sha1="45faab5009902c6df0e14fb780e74d487dcf7376" offset="0" />
@@ -435,7 +435,7 @@
<description>Planetoid</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G15" />
+ <info name="release" value="SNG15" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="55277">
<rom name="046 planetoid.fsd" size="55277" crc="c9b6bd5c" sha1="48fc462499de9fd37a3e5164e723f9022ab0f870" offset="0" />
@@ -447,7 +447,7 @@
<description>Planetoid (40t)</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G15" />
+ <info name="release" value="SNG15" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="24711">
<rom name="055 planetoid 40track.fsd" size="24711" crc="f8f6c291" sha1="d7a8d0b55052d62f748301b6a0ece3d6d063e606" offset="0" />
@@ -459,7 +459,7 @@
<description>Super Invaders</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G16" />
+ <info name="release" value="SNG16" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="55282">
<rom name="047 super invaders.fsd" size="55282" crc="e639e138" sha1="61fa94d5beb55b178b1ec732c69649d4a6bdb6ea" offset="0" />
@@ -471,7 +471,7 @@
<description>Super Invaders (40t)</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G16" />
+ <info name="release" value="SNG16" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="24716">
<rom name="053 super invaders 40track.fsd" size="24716" crc="0a8e861d" sha1="7d81dbf2a01a83266b4531c913d956a68bc63a12" offset="0" />
@@ -483,7 +483,7 @@
<description>Rocket Raid</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G05" />
+ <info name="release" value="SNG05" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="55279">
<rom name="048 rocket raid.fsd" size="55279" crc="06311675" sha1="e7524e853b83906c12ec3a17497339d25596eee8" offset="0" />
@@ -495,7 +495,7 @@
<description>Shirley Conran's Magic Garden</description>
<year>1983</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="X04" />
+ <info name="release" value="SNX04" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="104959">
<rom name="067 shirley conran's magic garden.fsd" size="104959" crc="dd05b72c" sha1="5914bd14014f89cfae12b8e55a9b4b8349835286" offset="0" />
@@ -507,7 +507,7 @@
<description>Spooky Manor</description>
<year>1984</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="E18" />
+ <info name="release" value="SNE18" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="102321">
<rom name="068 spooky manor.fsd" size="102321" crc="077375a1" sha1="2b2d7cccd4bfa6fe2e8c352098e11acc685633f4" offset="0" />
@@ -517,9 +517,9 @@
<software name="peekoc">
<description>Peeko-Computer</description>
- <year>198?</year>
+ <year>1982</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="E02" />
+ <info name="release" value="SNE02" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="55478">
<rom name="069 peeko-computer.fsd" size="55478" crc="149db5f7" sha1="62967f65582d2e3d78c28be407dbd68da5609824" offset="0" />
@@ -529,9 +529,9 @@
<software name="busgames">
<description>Business Games</description>
- <year>198?</year>
+ <year>1984</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="E03" />
+ <info name="release" value="SNE03" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="102323">
<rom name="070 business games.fsd" size="102323" crc="47b34ec1" sha1="96fe3ca59520a28113387606d5d6826a236e9027" offset="0" />
@@ -543,7 +543,7 @@
<description>Microtext</description>
<year>1983</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="L04" />
+ <info name="release" value="SNL04" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="104939">
<rom name="075 microtext.fsd" size="104939" crc="b614ea31" sha1="224e87db1a3fa677e53f3506fa1401ee598bd2b2" offset="0" />
@@ -564,9 +564,9 @@
<software name="prtdrvgn">
<description>Printer Driver Generator</description>
- <year>198?</year>
+ <year>1984</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="B0?" />
+ <info name="release" value="SNB16" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="105091">
<rom name="227 printer driver generator.fsd" size="105091" crc="c047f362" sha1="024b53fe31bdbec2083de9a9ffc8c9d2737f398d" offset="0" />
@@ -578,7 +578,7 @@
<description>FORTH</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="L01" />
+ <info name="release" value="SNL01" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="81355">
<rom name="235 forth.fsd" size="81355" crc="5d6ba897" sha1="f58964a536b59012e85298ffc55c2165b05bd154" offset="0" />
@@ -590,7 +590,7 @@
<description>Jars</description>
<year>198?</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="E15" />
+ <info name="release" value="SNE15" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="29478">
<rom name="262 jars.fsd" size="29478" crc="6613abb4" sha1="19024209a8fe98df7726acbefa78744459637dcf" offset="0" />
@@ -600,9 +600,9 @@
<software name="chemanal">
<description>Chemical Analysis</description>
- <year>198?</year>
+ <year>1983</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="E12" />
+ <info name="release" value="SNE12" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="104947">
<rom name="263 chemical analysis.fsd" size="104947" crc="1c0ecd19" sha1="04f9c198dda70bb498844594d206918344aa13d3" offset="0" />
@@ -614,7 +614,7 @@
<description>JCB Digger</description>
<year>1983</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="G09" />
+ <info name="release" value="SNG09" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="101190">
<rom name="286 jcb digger.fsd" size="101190" crc="16102871" sha1="e0226e03b831d260c8ccbab5e1a6885a0b362b10" offset="0" />
@@ -757,7 +757,7 @@
<software name="fabfour1">
<description>Fab Four Vol.1</description>
- <year>1990</year>
+ <year>1989</year>
<publisher>Audiogenic</publisher>
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side [A]"/>
@@ -1031,8 +1031,8 @@
<software name="battbrit">
<description>Battle of Britain</description>
- <year>1987</year>
- <publisher>Design People</publisher>
+ <year>1984</year>
+ <publisher>Betasoft</publisher>
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="104947">
<rom name="092 battle of britain.fsd" size="104947" crc="6ba3eb9e" sha1="d0798a2bd0717cf3fc872cfdaee77e35fee9913e" offset="0" />
@@ -1130,7 +1130,7 @@
<software name="impmiss">
<description>Impossible Mission</description>
- <year>1985</year>
+ <year>1986</year>
<publisher>U.S. Gold</publisher>
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="105085">
@@ -1229,7 +1229,7 @@
<software name="sharrier">
<description>Strike Force Harrier</description>
- <year>1986</year>
+ <year>1985</year>
<publisher>Mirrorsoft</publisher>
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="102539">
@@ -1544,8 +1544,8 @@
<software name="discdebg">
<description>Disc Debug and Copy All</description>
- <year>198?</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <year>1983</year>
+ <publisher>Basil Bloom</publisher>
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="104953">
<rom name="190 disk debug and copy-all.fsd" size="104953" crc="20dc59e1" sha1="c5e998e839cef9f9a53b531e10a0d2de4ee8050a" offset="0" />
@@ -1997,17 +1997,17 @@
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side 2"/>
- <dataarea name="flop" size="105084">
- <rom name="304 the hobbit side 2.fsd" size="105084" crc="2629eaff" sha1="ab033a5c6d74d7c86b0e4d03be4a2fd76814cfe2" offset="0" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
<feature name="part_id" value="Picture Disk 1"/>
<dataarea name="flop" size="104955">
<rom name="304 the hobbit picture disk 1.fsd" size="104955" crc="c6b638f4" sha1="a0e0683312eaa726b1bfec3e859a7c87bcaff175" offset="0" />
</dataarea>
</part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Side 2"/>
+ <dataarea name="flop" size="105084">
+ <rom name="304 the hobbit side 2.fsd" size="105084" crc="2629eaff" sha1="ab033a5c6d74d7c86b0e4d03be4a2fd76814cfe2" offset="0" />
+ </dataarea>
+ </part>
<part name="flop4" interface="floppy_5_25">
<feature name="part_id" value="Picture Disk 2"/>
<dataarea name="flop" size="104955">
@@ -2065,7 +2065,7 @@
<software name="story">
<description>Story</description>
<year>1983</year>
- <publisher>H &amp; H Software</publisher>
+ <publisher>H&amp;H Software</publisher>
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="105191">
<rom name="342 story.fsd" size="105191" crc="3cfde5fc" sha1="99e1bdaacf6615d10279b87c279213188434a57a" offset="0" />
@@ -2114,7 +2114,7 @@
</software>
<software name="bismarck">
- <description>Bismarck Death of a Battleship</description>
+ <description>Bismarck: Death of a Battleship</description>
<year>1987</year>
<publisher>BBC Soft</publisher>
<part name="flop1" interface="floppy_5_25">
@@ -2624,7 +2624,7 @@
<software name="cybermis">
<description>Cybertron Mission</description>
- <year>1984</year>
+ <year>1983</year>
<publisher>Micro Power</publisher>
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="87383">
@@ -3261,17 +3261,17 @@
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side 01"/>
- <dataarea name="flop" size="104948">
- <rom name="156 beverly hills cop (side 01).fsd" size="104948" crc="4ce85ea9" sha1="1e2951fb058fe10c212a5b59842733ba3dc09504" offset="0" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
<feature name="part_id" value="Side 02"/>
<dataarea name="flop" size="104947">
<rom name="156 beverly hills cop (side 02).fsd" size="104947" crc="05d06984" sha1="308cf3ff46e6b88478ab471bd412fc2d86d53e75" offset="0" />
</dataarea>
</part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Side 01"/>
+ <dataarea name="flop" size="104948">
+ <rom name="156 beverly hills cop (side 01).fsd" size="104948" crc="4ce85ea9" sha1="1e2951fb058fe10c212a5b59842733ba3dc09504" offset="0" />
+ </dataarea>
+ </part>
<part name="flop4" interface="floppy_5_25">
<feature name="part_id" value="Side 03"/>
<dataarea name="flop" size="104947">
@@ -3355,7 +3355,7 @@
<description>Mailing System</description>
<year>1984</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="B09" />
+ <info name="release" value="SNB09" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="104944">
<rom name="228 mailing system.fsd" size="104944" crc="e3f570ed" sha1="cd5ec03cb9c28636496b5af912d615226d78677a" offset="0" />
@@ -3367,7 +3367,7 @@
<description>Database</description>
<year>1983</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="B06" />
+ <info name="release" value="SNB06" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="102318">
<rom name="229 database.fsd" size="102318" crc="abebfbc3" sha1="49219fd09580b758bd2d5ab8d285555027407c05" offset="0" />
@@ -3379,7 +3379,7 @@
<description>Accounts Receivable</description>
<year>1984</year>
<publisher>Acornsoft/MI</publisher>
- <info name="release" value="B10" />
+ <info name="release" value="SNB10" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="104949">
<rom name="230 accounts receivable.fsd" size="104949" crc="ac819ec1" sha1="a9fe53efcaa39051ee4bb9bbb2b71f1009ddc8ca" offset="0" />
@@ -3391,7 +3391,7 @@
<description>Accounts Payable</description>
<year>1984</year>
<publisher>Acornsoft/MI</publisher>
- <info name="release" value="B13" />
+ <info name="release" value="SNB13" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="104946">
<rom name="231 accounts payable.fsd" size="104946" crc="cb182be6" sha1="d47a2e8b18f8efb533bc300e334b88bd06125e48" offset="0" />
@@ -3403,7 +3403,7 @@
<description>Purchasing</description>
<year>1984</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="B14" />
+ <info name="release" value="SNB14" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="104940">
<rom name="232 purchasing.fsd" size="104940" crc="29d5cbdf" sha1="6c0751612fd710e6d09f347cbe0cb1fba3472bd7" offset="0" />
@@ -3415,7 +3415,7 @@
<description>Invoicing</description>
<year>1984</year>
<publisher>Acornsoft</publisher>
- <info name="release" value="B08" />
+ <info name="release" value="SNB08" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="104939">
<rom name="234 invoicing.fsd" size="104939" crc="3fdd7673" sha1="a33910702375886d4ec4e48337861634e6783d14" offset="0" />
@@ -3423,48 +3423,31 @@
</part>
</software>
- <software name="farmcash">
- <description>FarmCash Setup v1.12</description>
+ <software name="farmman">
+ <description>Farm Management Suite</description>
<year>198?</year>
<publisher>Acornsoft</publisher>
<info name="protection" value="None" />
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="FarmCash Setup"/>
<dataarea name="flop" size="204800">
<rom name="240 farmcash.ssd" size="204800" crc="ba011313" sha1="5f502b669b83dd80ef524addc75875b946ae0121" offset="0" />
</dataarea>
</part>
- </software>
-
- <software name="fieldfil">
- <description>FieldFile Setup v1.11</description>
- <year>198?</year>
- <publisher>Acornsoft</publisher>
- <info name="protection" value="None" />
- <part name="flop1" interface="floppy_5_25">
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="FieldFile Setup"/>
<dataarea name="flop" size="204800">
<rom name="241 fieldfile.ssd" size="204800" crc="61938782" sha1="50ede0e4380043268a9b010587a4bdb5285ea0f2" offset="0" />
</dataarea>
</part>
- </software>
-
- <software name="capcost">
- <description>CapCost Setup v1.11</description>
- <year>1983</year>
- <publisher>Acornsoft</publisher>
- <info name="protection" value="None" />
- <part name="flop1" interface="floppy_5_25">
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="CapCost Setup"/>
<dataarea name="flop" size="204800">
<rom name="242 capcost.ssd" size="204800" crc="78f00286" sha1="d747ca27c7490c7638870a099e7660d623eaf54e" offset="0" />
</dataarea>
</part>
- </software>
-
- <software name="farmplan">
- <description>FarmPlanner Setup v1.01</description>
- <year>1983</year>
- <publisher>Acornsoft</publisher>
- <info name="protection" value="None" />
- <part name="flop1" interface="floppy_5_25">
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="FarmPlanner Setup"/>
<dataarea name="flop" size="204800">
<rom name="243 farmplanner.ssd" size="204800" crc="142493ad" sha1="3dc58f3d23893f9a926858ff16edf3418ba1b0fd" offset="0" />
</dataarea>
@@ -3508,7 +3491,7 @@
<software name="dragonwb">
<description>Dragon World (BBC Only)</description>
- <year>198?</year>
+ <year>1985</year>
<publisher>4mation</publisher>
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="102584">
@@ -3519,7 +3502,7 @@
<software name="dragonw">
<description>Dragon World</description>
- <year>198?</year>
+ <year>1985</year>
<publisher>4mation</publisher>
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="102721">
@@ -3550,26 +3533,22 @@
</part>
</software>
- <software name="boxtresc">
- <description>Box of Treasures Create</description>
- <year>198?</year>
- <publisher>4mation</publisher>
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="102725">
- <rom name="250 box of treasures create.fsd" size="102725" crc="94a92558" sha1="3116adba9d0c5c454f966ccb02e5ec571c616a12" offset="0" />
- </dataarea>
- </part>
- </software>
-
<software name="boxtres">
<description>Box of Treasures</description>
- <year>1983</year>
+ <year>1985</year>
<publisher>4mation</publisher>
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Game"/>
<dataarea name="flop" size="102503">
<rom name="250 box of treasures.fsd" size="102503" crc="7e2a3d56" sha1="2a92a30c363b4830b3e9261b037fdee242103686" offset="0" />
</dataarea>
</part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Create"/>
+ <dataarea name="flop" size="102725">
+ <rom name="250 box of treasures create.fsd" size="102725" crc="94a92558" sha1="3116adba9d0c5c454f966ccb02e5ec571c616a12" offset="0" />
+ </dataarea>
+ </part>
</software>
<software name="ggarden">
@@ -3588,6 +3567,7 @@
<description>Children from Space</description>
<year>1984</year>
<publisher>Acornsoft/ASK</publisher>
+ <info name="release" value="XNE16" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="79288">
<rom name="218 children from space.fsd" size="79288" crc="2a1f96c7" sha1="dda2f5479a755d065d830c9938370a6d743b5e28" offset="0" />
@@ -3599,6 +3579,7 @@
<description>Hide &amp; Seek</description>
<year>1984</year>
<publisher>Acornsoft/ASK</publisher>
+ <info name="release" value="XNE11" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="79280">
<rom name="219 hide and seek.fsd" size="79280" crc="6a537a1b" sha1="e1d3b464985e13da5476a1da4e40117c9cef0306" offset="0" />
@@ -3610,6 +3591,7 @@
<description>Facemaker</description>
<year>1984</year>
<publisher>Acornsoft/ASK</publisher>
+ <info name="release" value="XNE10" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="76468">
<rom name="220 facemaker.fsd" size="76468" crc="02565c9f" sha1="c3044473cad293f2c0cb2f57d2ff30ffda3ac40b" offset="0" />
@@ -3621,6 +3603,7 @@
<description>Squeeze</description>
<year>1984</year>
<publisher>Acornsoft/ASK</publisher>
+ <info name="release" value="XNE28" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="55138">
<rom name="221 squeeze.fsd" size="55138" crc="9b9689e7" sha1="6d2af4e6c8454fb9e6ad588611fb22b369b2a845" offset="0" />
@@ -3632,6 +3615,7 @@
<description>Number Gulper</description>
<year>1984</year>
<publisher>Acornsoft/ASK</publisher>
+ <info name="release" value="XNE13" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="79282">
<rom name="222 number gulper.fsd" size="79282" crc="2827a37e" sha1="1c03bfb9f0af780ef9d271f715e856758795a215" offset="0" />
@@ -3643,6 +3627,7 @@
<description>Cranky</description>
<year>1984</year>
<publisher>Acornsoft/ASK</publisher>
+ <info name="release" value="XNE17" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="79275">
<rom name="223 cranky.fsd" size="79275" crc="2cef012f" sha1="b693814f465653020504f87c57a7909e6a3225a8" offset="0" />
@@ -3654,6 +3639,7 @@
<description>Table Adventures</description>
<year>1984</year>
<publisher>Acornsoft/ASK</publisher>
+ <info name="release" value="XNE18" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="79285">
<rom name="224 table adventures.fsd" size="79285" crc="098d33cf" sha1="5d21be7e707cdfd2248a6f0beb1612a4cda4a08c" offset="0" />
@@ -3665,6 +3651,7 @@
<description>Juggle Puzzle</description>
<year>1984</year>
<publisher>Acornsoft/ASK</publisher>
+ <info name="release" value="XNE27" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="55144">
<rom name="225 juggle puzzle.fsd" size="55144" crc="244d1ac3" sha1="b71d331ee864e91c863065b468617e2ec13179d9" offset="0" />
@@ -3687,6 +3674,7 @@
<description>Let's Count</description>
<year>1984</year>
<publisher>Acornsoft/ASK</publisher>
+ <info name="release" value="XNE12" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="79280">
<rom name="347 let's count.fsd" size="79280" crc="8d69c2ba" sha1="7dc53270ea1a36964cd2040f3044ae83f936b27a" offset="0" />
@@ -3698,6 +3686,7 @@
<description>Words Words Words</description>
<year>1984</year>
<publisher>Acornsoft/ASK</publisher>
+ <info name="release" value="XNE19" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="72642">
<rom name="348 words words words.fsd" size="72642" crc="ecda7e69" sha1="c2706c4bd45d6eee0af3ce176a8a34d8111bcbd9" offset="0" />
@@ -3709,6 +3698,7 @@
<description>Podd</description>
<year>1984</year>
<publisher>Acornsoft/ASK</publisher>
+ <info name="release" value="XNE26" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="102386">
<rom name="349 podd.fsd" size="102386" crc="6d764be9" sha1="8d6334c45f7e9d28e4300b7fe3f8a2f608e833a6" offset="0" />
@@ -3773,7 +3763,7 @@
<software name="longwave">
<description>Longitudinal Waves</description>
- <year>198?</year>
+ <year>1983</year>
<publisher>Five Ways Software</publisher>
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="57770">
diff --git a/hash/bbcb_us_flop.xml b/hash/bbcb_flop_us.xml
index 29c2581d3ce..451d62d5626 100644
--- a/hash/bbcb_us_flop.xml
+++ b/hash/bbcb_flop_us.xml
@@ -8,7 +8,7 @@
Hold down the SHIFT key and press and release the BREAK key.
-->
-<softwarelist name="bbcb_us_flop" description="BBC Micro Model B (US) disks">
+<softwarelist name="bbcb_flop_us" description="BBC Micro Model B (US) disks">
<software name="intrutil">
<description>Introductory and Utilities Disk</description>
diff --git a/hash/bbcm_cart.xml b/hash/bbcm_cart.xml
index c9a48d80930..7db85ae8644 100644
--- a/hash/bbcm_cart.xml
+++ b/hash/bbcm_cart.xml
@@ -12,7 +12,7 @@
<software name="demo">
<description>BBC Master Demonstration Cartridge</description>
- <year>198?</year>
+ <year>1986</year>
<publisher>Acorn</publisher>
<part name="cart" interface="bbcm_cart">
<dataarea name="uprom" size="16384">
@@ -24,4 +24,19 @@
</part>
</software>
+ <software name="overview">
+ <description>OverView</description>
+ <year>1985</year>
+ <publisher>Acornsoft</publisher>
+ <info name="release" value="SQB30" />
+ <part name="cart" interface="bbcm_cart">
+ <dataarea name="uprom" size="16384">
+ <rom name="viewspell.rom" size="16384" crc="e8840023" sha1="94036e81c4684f245a0111279a0a665262e93271" offset="0" />
+ </dataarea>
+ <dataarea name="lorom" size="16384">
+ <rom name="viewstore.rom" size="16384" crc="bc69c63e" sha1="5b9bf5bd57af043ddeaa182d188ceaea801bd11f" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
</softwarelist>
diff --git a/hash/bbcm_flop.xml b/hash/bbcm_flop.xml
index 76256841722..d020fbcfc17 100644
--- a/hash/bbcm_flop.xml
+++ b/hash/bbcm_flop.xml
@@ -38,4 +38,16 @@
</part>
</software>
+ <software name="fsdd">
+ <description>FileStore Dealer Test Disc</description>
+ <year>1986</year>
+ <publisher>Acorn</publisher>
+ <info name="format" value="ADFS" />
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="655360">
+ <rom name="fsdd.adl" size="655360" crc="77560540" sha1="c60e1df1aff74cb491234140577137c65c55be0a" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
</softwarelist>
diff --git a/hash/bw14.xml b/hash/bw14.xml
new file mode 100644
index 00000000000..ffe4ba871f2
--- /dev/null
+++ b/hash/bw14.xml
@@ -0,0 +1,106 @@
+<?xml version="1.0"?>
+<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
+
+<softwarelist name="bw14" description="Bondwell 14 disk images">
+
+ <software name="cpm30">
+ <description>CP/M 3.02</description>
+ <year>1984</year>
+ <publisher>Digital Research Inc.</publisher>
+ <info name="serial" value="1006-1269-00306" />
+ <info name="part" value="MM00027/MM00028" />
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="System &amp; Utl. (1)"/>
+ <dataarea name="flop" size="368974">
+ <rom name="cpm3sys1.cqm" size="368974" crc="22b4904b" sha1="cc5fcbf445281625bf9f670d7bbc1f88e0b0f5af" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="System &amp; Utl. (2)"/>
+ <dataarea name="flop" size="368974">
+ <rom name="cpm3sys2.cqm" size="368974" crc="6285e8cc" sha1="3886f19a73f4f83db524df5b217f86dfa86bd8c4" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="calcstar">
+ <description>CalcStar v1.45</description>
+ <year>1983</year>
+ <publisher>MicroPro International</publisher>
+ <info name="serial" value="BC01-0003-01003" />
+ <info name="part" value="MM00013" />
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="CalcStar"/>
+ <dataarea name="flop" size="368974">
+ <rom name="calcstar.cqm" size="368974" crc="78855358" sha1="bdf5bc01f2eca7a5b264df7a5367622270f17631" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="datastar">
+ <description>DataStar v1.41</description>
+ <year>1982</year>
+ <publisher>MicroPro International</publisher>
+ <info name="serial" value="BC01-0004-01003" />
+ <info name="part" value="MM00014" />
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="DataStar"/>
+ <dataarea name="flop" size="368974">
+ <rom name="datastar.cqm" size="368974" crc="a67d06bd" sha1="13298801950eb3fdbbb4b2f9604b7b5cb0619629" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="datastarc" cloneof="datastar">
+ <description>DataStar v1.41c</description>
+ <year>1982</year>
+ <publisher>MicroPro International</publisher>
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="DataStar"/>
+ <dataarea name="flop" size="368974">
+ <rom name="datastar_v141c.cqm" size="368974" crc="65459fa1" sha1="f61c14a3cb4f4a36a53c8c343d236983db1c5506" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="repstar">
+ <description>ReportStar v1.02</description>
+ <year>1982</year>
+ <publisher>MicroPro International</publisher>
+ <info name="serial" value="BC01-0005-01003/BC01-0006-01003" />
+ <info name="part" value="MM00015/MM00018" />
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="ReportStar"/>
+ <dataarea name="flop" size="368974">
+ <rom name="reportstar.cqm" size="368974" crc="cb7512ec" sha1="547ccb4401d59d6691790a9b7465a5bdff102207" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="ReportStar Installation"/>
+ <dataarea name="flop" size="368974">
+ <rom name="reportstar_installation.cqm" size="368974" crc="0e017a2c" sha1="af55804ff8b59d7ce4782f7c7ba31ad6a8eeca89" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wordstar">
+ <description>WordStar v3.30</description>
+ <year>1983</year>
+ <publisher>MicroPro International</publisher>
+ <info name="serial" value="BC01-0001-01003/BC01-0002-01003" />
+ <info name="part" value="MM00011/MM00012" />
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="WordStar &amp; MailMerge"/>
+ <dataarea name="flop" size="368974">
+ <rom name="wordstar.cqm" size="368974" crc="2c443cf8" sha1="b647902c851a7a037bb7f6ceb8d37e018d25f9fc" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="WordStar Installation"/>
+ <dataarea name="flop" size="368974">
+ <rom name="wordstar_installation.cqm" size="368974" crc="37c19ef0" sha1="2fcd919a8c32acbb3d66d2eedba5da3fe587d400" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+</softwarelist>
diff --git a/hash/c64_cart.xml b/hash/c64_cart.xml
index 1aa4b84ccb2..fe0fcd71bbc 100644
--- a/hash/c64_cart.xml
+++ b/hash/c64_cart.xml
@@ -7001,6 +7001,19 @@
</part>
</software>
+ <software name="koalapnt">
+ <description>KoalaPainter</description>
+ <year>1984</year>
+ <publisher>Koala Technologies</publisher>
+ <part name="cart" interface="c64_cart">
+ <feature name="exrom" value="0" />
+ <feature name="game" value="0" />
+ <dataarea name="roml" size="0x4000">
+ <rom name="koalapainter" size="0x4000" crc="cc75a06d" sha1="4707fe57b0575415a2c258392355941c130fcc80" offset="0x0000" />
+ </dataarea>
+ </part>
+ </software>
+
<!-- Dummy cartridge entries to allow requirement mappings from c64_flop -->
<software name="cpm">
diff --git a/hash/c64_flop.xml b/hash/c64_flop.xml
index 250aeb480c8..f788e300be2 100644
--- a/hash/c64_flop.xml
+++ b/hash/c64_flop.xml
@@ -4,6 +4,18 @@
<!-- Games -->
+ <software name="arttu">
+ <description>Little Knight Arthur</description>
+ <year>1986</year>
+ <publisher>Pasi Hytönen</publisher>
+ <info name="protection" value="none" />
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="174848">
+ <rom name="arthurc64.d64" size="174848" crc="f741ada3" sha1="84eb7ce5152370fe53604209ee7fb54a284bfa6e" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="aztecchl">
<description>Aztec Challenge</description>
<year>1983</year>
diff --git a/hash/casloopy.xml b/hash/casloopy.xml
index cd8936c5202..6573fddaa37 100644
--- a/hash/casloopy.xml
+++ b/hash/casloopy.xml
@@ -3,9 +3,7 @@
<softwarelist name="casloopy" description="Casio Loopy cartridges">
<!-- Undumped titles:
-- Loopy Town no Oheya ga Hoshii! (ルーピータウンã®ãŠã¸ã‚„ãŒã»ã—ã„!)
- Little Romance (リトルロマンス)
-- Lupiton no Wonder Palette (ルピトンã®ãƒ¯ãƒ³ãƒ€ãƒ¼ãƒ‘レット)
- Chakura-kun no Omajinai Paradise (ãƒãƒ£ã‚¯ãƒ©ãã‚“ã®ãŠã¾ã˜ãªã„パラダイス)
- Magical Shop [add-on to extract images from vhs/dvd?]
-->
@@ -87,4 +85,32 @@
</dataarea>
</part>
</software>
+
+ <software name="loopytwn">
+ <description>Loopy Town no Oheya ga Hoshii!</description>
+ <year>1996</year>
+ <publisher>Casio</publisher>
+ <info name="serial" value="XK-504"/>
+ <info name="alt_name" value="ルーピータウンã®ãŠã¸ã‚„ãŒã»ã—ã„!"/>
+ <part name="cart" interface="loopy_cart">
+ <dataarea name="rom" size="0x300000">
+ <rom name="CHIP1.IC104" size="0x200000" crc="bae71d45" sha1="79628715ccedd9bc3fd72d21fa9ea6513b88cf51" offset="0x000000" />
+ <rom name="CHIP2.IC105" size="0x100000" crc="e0514d03" sha1="4dd02faa1ebf6754da0ade417e488512f3502620" offset="0x200000" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="lupiton">
+ <description>Lupiton no Wonder Palette</description>
+ <year>1995</year>
+ <publisher>Casio</publisher>
+ <info name="serial" value="XK-701"/>
+ <info name="alt_name" value="ルピトンã®ãƒ¯ãƒ³ãƒ€ãƒ¼ãƒ‘レット"/>
+ <part name="cart" interface="loopy_cart">
+ <dataarea name="rom" size="0x200000">
+ <rom name="lupiton.bin" size="0x200000" crc="338a5af7" sha1="ddb3e2b363ef0325a1370511f3692ca47031cb46" offset="0x000000" />
+ </dataarea>
+ </part>
+ </software>
+
</softwarelist>
diff --git a/hash/database.xml b/hash/database.xml
index 1e503859d09..f5b25308849 100644
--- a/hash/database.xml
+++ b/hash/database.xml
@@ -251,4 +251,16 @@
</part>
</software>
+ <software name="leapfrog" supported ="no"> <!-- major video timing glitches -->
+ <description>Leapfrog</description>
+ <year>1982</year>
+ <publisher>Voltmace</publisher>
+ <part name="cart" interface="vc4000_cart">
+ <feature name="slot" value="rom4k" />
+ <dataarea name="rom" size="4096">
+ <rom name="leapfrog.bin" size="4096" crc="105eb530" sha1="7211b0b1c6e8798399f4f6d2a942db4e8379c691" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
</softwarelist>
diff --git a/hash/dim68k.xml b/hash/dim68k.xml
index a8a9011ab83..b262c96d79a 100644
--- a/hash/dim68k.xml
+++ b/hash/dim68k.xml
@@ -9,6 +9,49 @@ CP/M-68K Release 1.04: Disks: All (maybe others)
<softwarelist name="dim68k" description="Dimension 68000 Disks">
+ <software name="cpm124">
+ <description>CP/M-68K Release 1.24</description>
+ <!-- Serial Number: 1015-1004-0004016-->
+ <!-- Build Date: Sept 27, 1984 -->
+ <year>1984</year>
+ <publisher>Micro Craft Corporation</publisher>
+
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="User Master"/>
+ <dataarea name="flop" size="365718">
+ <rom name="system.imd" size="365718" crc="302a26f0" sha1="e480f90206fc24b9d74681633a90f4d575c380ca" offset="0"/>
+ </dataarea>
+ </part>
+
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Utilities"/>
+ <dataarea name="flop" size="343743">
+ <rom name="utilities.imd" size="343743" crc="c3bbf1f0" sha1="332771861b8a27deb307f2a758ce741406c3da36" offset="0"/>
+ </dataarea>
+ </part>
+
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Assembler"/>
+ <dataarea name="flop" size="381558">
+ <rom name="assembler.imd" size="381558" crc="d0a9ced3" sha1="11ba67ffa495eb81b76eab72cfff30e77a604d00" offset="0"/>
+ </dataarea>
+ </part>
+
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="C Language/Linker"/>
+ <dataarea name="flop" size="318713">
+ <rom name="clanguage.imd" size="318713" crc="a0d6748d" sha1="080adfd1f435895bac511231e654beeb59e7657d" offset="0"/>
+ </dataarea>
+ </part>
+
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Emulation"/>
+ <dataarea name="flop" size="395324">
+ <rom name="emulator.imd" size="395324" crc="60264ee0" sha1="fcd206f5670d5289b618ee03fb0bcad937306f15" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="cpm121">
<description>CP/M-68K Release 1.21</description>
<!-- Serial Number: 1015-1004-000548-->
@@ -18,6 +61,7 @@ CP/M-68K Release 1.04: Disks: All (maybe others)
<part name="flop1" interface="floppy_5_25">
<!-- Disk Content: User Master -->
+ <feature name="part_id" value="User Master"/>
<dataarea name="flop" size="369826">
<rom name="system.imd" size="369826" crc="18fe0e83" sha1="b389159e47c8fccc6674d3cb0e35d716f04d267e" offset="0x0000" />
</dataarea>
@@ -25,6 +69,7 @@ CP/M-68K Release 1.04: Disks: All (maybe others)
<part name="flop2" interface="floppy_5_25">
<!-- Disk Content: utilities -->
+ <feature name="part_id" value="Utilities"/>
<dataarea name="flop" size="384645">
<rom name="utilities.imd" size="384645" crc="175e10da" sha1="47f3151805556a4fd0c9e33329dc2db1d3b28725" offset="0x0000" />
</dataarea>
@@ -32,6 +77,7 @@ CP/M-68K Release 1.04: Disks: All (maybe others)
<part name="flop3" interface="floppy_5_25">
<!-- Disk Content: Assembler -->
+ <feature name="part_id" value="Assembler"/>
<dataarea name="flop" size="381579">
<rom name="assembler.imd" size="381579" crc="05926cfa" sha1="feaa2f0a9833aae96882d8b880dcd4cc8bbf871c" offset="0x0000" />
</dataarea>
@@ -39,6 +85,7 @@ CP/M-68K Release 1.04: Disks: All (maybe others)
<part name="flop4" interface="floppy_5_25">
<!-- Disk Content: C Language/Linker -->
+ <feature name="part_id" value="C Language/Linker"/>
<dataarea name="flop" size="302891">
<rom name="clanguage.imd" size="302891" crc="2e6505af" sha1="8f2296b3e852600aa77d96bd5b66f8ca52e2a24e" offset="0x0000" />
</dataarea>
@@ -46,6 +93,7 @@ CP/M-68K Release 1.04: Disks: All (maybe others)
<part name="flop5" interface="floppy_5_25">
<!-- Disk Content: Apple ][+, Kaypro II, Z80, and IBM emulators -->
+ <feature name="part_id" value="Apple ][+, Kaypro II, Z80, and IBM emulators"/>
<dataarea name="flop" size="398409">
<rom name="emulator.imd" size="398409" crc="0f8cfc5b" sha1="5a3653bbf8f34ddf1b85565b069716ef30ede195" offset="0x0000" />
</dataarea>
@@ -118,4 +166,38 @@ CP/M-68K Release 1.04: Disks: All (maybe others)
</dataarea>
</part>
</software>
+
+ <software name="d68brnin">
+ <description>Dimension 68000 Burnin Test</description>
+ <year>1984</year>
+ <publisher>Micro Craft Corporation</publisher>
+
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="181726">
+ <rom name="d68brnin.imd" size="181726" crc="40229a75" sha1="fac1f9a69ae9b9bac5ac7af35f21b8879a21aeb2" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="d68fort">
+ <description>Fortran 68K</description>
+ <year>1983</year>
+ <publisher>Silicon Valley Software</publisher>
+
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="391735">
+ <rom name="d68fort1.imd" size="391735" crc="db27dc48" sha1="b912b91ed49e828c91863d3f71d3a7d673ac08b1" offset="0"/>
+ </dataarea>
+ </part>
+
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="386625">
+ <rom name="d68fort2.imd" size="386625" crc="cdd04f0c" sha1="db9028aad6d757cf5dc316142d06398d7e27abab" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
</softwarelist>
diff --git a/hash/electron_cart.xml b/hash/electron_cart.xml
index 602bc67facd..307d5ba7bb3 100644
--- a/hash/electron_cart.xml
+++ b/hash/electron_cart.xml
@@ -18,6 +18,7 @@
<description>Countdown to Doom</description>
<year>1984</year>
<publisher>Acornsoft</publisher>
+ <info name="release" value="SCG19" />
<part name="cart" interface="electron_cart">
<dataarea name="uprom" size="16384">
<rom name="countdowntodoom_1.rom" size="16384" crc="f8720e7e" sha1="eb414b81760d38c0a0d58a34dc70c2462c12e23c" offset="0" />
@@ -32,6 +33,7 @@
<description>Hopper</description>
<year>1984</year>
<publisher>Acornsoft</publisher>
+ <info name="release" value="SCG23" />
<part name="cart" interface="electron_cart">
<dataarea name="uprom" size="16384">
<rom name="hopper.rom" size="16384" crc="18db837e" sha1="fa3c6b17fd1ce2efd0115e370f6f6e0b528a05e2" offset="0" />
@@ -43,6 +45,7 @@
<description>Snapper</description>
<year>1983</year>
<publisher>Acornsoft</publisher>
+ <info name="release" value="SCG04" />
<part name="cart" interface="electron_cart">
<dataarea name="uprom" size="16384">
<rom name="snapper.rom" size="16384" crc="08befbda" sha1="7db762c705f64e91ab7fe8797e14d1213bc90de1" offset="0" />
@@ -54,6 +57,7 @@
<description>Starship Command</description>
<year>1983</year>
<publisher>Acornsoft</publisher>
+ <info name="release" value="SCG22" />
<part name="cart" interface="electron_cart">
<dataarea name="uprom" size="16384">
<rom name="starshipcommand_1.rom" size="16384" crc="e39ada2d" sha1="9dfa6d622e37d5115cbeaae9c9a4e978f85f2683" offset="0" />
@@ -75,10 +79,13 @@
</part>
</software>
+ <!-- Educational -->
+
<software name="treeknow">
<description>Tree of Knowledge</description>
<year>1983</year>
<publisher>Acornsoft</publisher>
+ <info name="release" value="SCE04" />
<part name="cart" interface="electron_cart">
<dataarea name="uprom" size="16384">
<rom name="treeofknowledge_1.rom" size="16384" crc="c09522e0" sha1="5b107be7a57a01b2719e9953e163f16825a026ab" offset="0" />
@@ -95,6 +102,7 @@
<description>LISP</description>
<year>1984</year>
<publisher>Acornsoft</publisher>
+ <info name="release" value="SCL02" />
<part name="cart" interface="electron_cart">
<dataarea name="uprom" size="16384">
<rom name="lisp_1.rom" size="16384" crc="fda4c546" sha1="24c7062fc3666cd6814d72e417146e32eb995b04" offset="0" />
@@ -109,6 +117,7 @@
<description>Logo</description>
<year>1985</year>
<publisher>Acornsoft</publisher>
+ <info name="release" value="SCL06" />
<part name="cart" interface="electron_cart">
<dataarea name="uprom" size="16384">
<rom name="logo-v1.0e_1.rom" size="16384" crc="a0defcf9" sha1="57fdd30894679400cb7c10b331cefd1a2362aeae" offset="0" />
@@ -123,6 +132,7 @@
<description>ISO-Pascal</description>
<year>1985</year>
<publisher>Acornsoft</publisher>
+ <info name="release" value="SCL18" />
<part name="cart" interface="electron_cart">
<dataarea name="uprom" size="16384">
<rom name="pascal_1.rom" size="16384" crc="c4adeb8c" sha1="ed5226520136ffa1212317ad5ab9d09c2a04b88d" offset="0" />
@@ -139,6 +149,7 @@
<description>View</description>
<year>1984</year>
<publisher>Acornsoft</publisher>
+ <info name="release" value="SCB03" />
<part name="cart" interface="electron_cart">
<dataarea name="uprom" size="16384">
<rom name="view-v1.0e.rom" size="16384" crc="5bdea2dd" sha1="64a12be5a1bbcf5bd003f38feb98e0eeafd601ee" offset="0" />
@@ -150,6 +161,7 @@
<description>ViewSheet</description>
<year>1984</year>
<publisher>Acornsoft</publisher>
+ <info name="release" value="SCB07" />
<part name="cart" interface="electron_cart">
<dataarea name="uprom" size="16384">
<rom name="viewsheet-v1.0e.rom" size="16384" crc="356fe589" sha1="146b3fb6cc9843a64c4e29a69f80db8980fab043" offset="0" />
diff --git a/hash/gamate.xml b/hash/gamate.xml
index 3d104772978..45f60522c88 100644
--- a/hash/gamate.xml
+++ b/hash/gamate.xml
@@ -8,37 +8,21 @@ C1016 - Volcano Panic
C1020 - Bad Bud Chou Chu's Adventure (Unreleased?)
C1025 - Jackpot (Unreleased?)
C1030 - Beach Volleyball (Unreleased?)
-C1033 - Fist of Thunder
C1034 - Superboy (Unreleased?)
-C1036 - Jewelriss
-C1038 - Mars Voyage (Unreleased?)
C1039 - Column #5 (Unreleased?)
C1040 - ??
C1041 - Mighty Boxer
-C1042 - Flying Goblin
-C1045 - World Cup Soccer
C1046 - Kiki Island
C1047 - Fortune 'n Luck
C1048 - Baseball (or Super Baseball)
-C1049 - Punk Boy
C1050 - Fortress of Fierceness
C1051 - Incantational Couple
-C1052 - Famous 7
-C1053 - Metamorphosiser
C1055 - ??
C1056 - GP Race
-C1057 - Fantasy Travel
-C1058 - Heaven Clash
C1059 - ??
-C1060 - Further Adventures of Hannibal The Cat
C1062 - ??
-C1063 - Basketball
-C1064 - Bao Qing Tian
C1065 - Hot Hero
C1066 - ??
-C1067 - Robin Hood
-C1069 - Riddle of the Ancient Tomb
-C1070 - Insect War
-->
<softwarelist name="gamate" description="Bit Corp Gamate cartridges">
@@ -46,11 +30,11 @@ C1070 - Insect War
<software name="cubeup" supported="no">
<description>Cube Up</description>
<year>1990</year>
- <publisher>Bit Corp.</publisher>
+ <publisher>Bit Corporation</publisher>
<info name="serial" value="C1001" />
<part name="cart" interface="gamate_cart">
<dataarea name="rom" size="16384">
- <rom name="cube up.bin" size="16384" crc="2a911e57" sha1="9d3b28887b6f375600bff29f8f233087b9152a60" offset="0x00000" />
+ <rom name="c1001_cubeup.bin" size="16384" crc="2a911e57" sha1="9d3b28887b6f375600bff29f8f233087b9152a60" offset="0x00000" />
</dataarea>
</part>
</software>
@@ -58,7 +42,7 @@ C1070 - Insect War
<software name="wittyape" supported="no">
<description>Witty Apee</description>
<year>1990</year>
- <publisher>Bit Corp.</publisher>
+ <publisher>Bit Corporation</publisher>
<info name="serial" value="C1002" />
<part name="cart" interface="gamate_cart">
<dataarea name="rom" size="32768">
@@ -70,7 +54,7 @@ C1070 - Insect War
<software name="boxforum" supported="no">
<description>Box Forum</description>
<year>1991</year>
- <publisher>Bit Corp.</publisher>
+ <publisher>Bit Corporation</publisher>
<info name="serial" value="C1003" />
<part name="cart" interface="gamate_cart">
<dataarea name="rom" size="32768">
@@ -81,8 +65,8 @@ C1070 - Insect War
<software name="mightytk" supported="no">
<description>Mighty Tank</description>
- <year>19??</year>
- <publisher>Bit Corp.</publisher>
+ <year>199?</year>
+ <publisher>Bit Corporation</publisher>
<info name="serial" value="C1004" />
<part name="cart" interface="gamate_cart">
<dataarea name="rom" size="32768">
@@ -94,7 +78,7 @@ C1070 - Insect War
<software name="encbrick" supported="no">
<description>Enchanted Bricks</description>
<year>1990</year>
- <publisher>Bit Corp.</publisher>
+ <publisher>Bit Corporation</publisher>
<info name="serial" value="C1005" />
<part name="cart" interface="gamate_cart">
<dataarea name="rom" size="32768">
@@ -106,7 +90,7 @@ C1070 - Insect War
<software name="minigolf" supported="no">
<description>Mini Golf</description>
<year>1990</year>
- <publisher>Bit Corp.</publisher>
+ <publisher>Bit Corporation</publisher>
<info name="serial" value="C1006" />
<part name="cart" interface="gamate_cart">
<dataarea name="rom" size="32768">
@@ -118,7 +102,7 @@ C1070 - Insect War
<software name="galaxinv" supported="no">
<description>Galaxy Invaders</description>
<year>1990</year>
- <publisher>Bit Corp.</publisher>
+ <publisher>Bit Corporation</publisher>
<info name="serial" value="C1007" />
<part name="cart" interface="gamate_cart">
<dataarea name="rom" size="32768">
@@ -130,11 +114,11 @@ C1070 - Insect War
<software name="dknight" supported="no">
<description>Legend of Dragon Knight</description>
<year>1991</year>
- <publisher>Bit Corp.</publisher>
+ <publisher>Bit Corporation</publisher>
<info name="serial" value="C1008" />
<part name="cart" interface="gamate_cart">
- <dataarea name="rom" size="16384">
- <rom name="c1008_legend_of_dragon_knight.bin" size="16384" crc="d65d1f4b" sha1="d247193a22ba34e6dc0e606d71460bd5dd1ccab5" offset="0" />
+ <dataarea name="rom" size="65536">
+ <rom name="c1-008.bin" size="65536" crc="a67ba296" sha1="d01988984e2950fde8096a0156808995a0e5c515" offset="0" />
</dataarea>
</part>
</software>
@@ -142,7 +126,7 @@ C1070 - Insect War
<software name="tornado" supported="no">
<description>Tornado</description>
<year>1991</year>
- <publisher>Bit Corp.</publisher>
+ <publisher>Bit Corporation</publisher>
<info name="serial" value="C1009" />
<part name="cart" interface="gamate_cart">
<dataarea name="rom" size="32768">
@@ -153,7 +137,7 @@ C1070 - Insect War
<software name="moneymaz" supported="no">
<description>Money Maze</description>
- <year>19??</year>
+ <year>199?</year>
<publisher>&lt;unknown&gt;</publisher>
<info name="serial" value="C1011" />
<part name="cart" interface="gamate_cart">
@@ -166,7 +150,7 @@ C1070 - Insect War
<software name="pharaoh" supported="no">
<description>Pharaoh Revenger</description>
<year>1991</year>
- <publisher>Bit Corp.</publisher>
+ <publisher>Bit Corporation</publisher>
<info name="serial" value="C1012" />
<part name="cart" interface="gamate_cart">
<dataarea name="rom" size="32768">
@@ -177,7 +161,7 @@ C1070 - Insect War
<software name="dinobibo" supported="no">
<description>Dino Bibo</description>
- <year>19??</year>
+ <year>1991</year>
<publisher>&lt;unknown&gt;</publisher>
<info name="serial" value="C1013" />
<part name="cart" interface="gamate_cart">
@@ -190,7 +174,7 @@ C1070 - Insect War
<software name="timewarr" supported="no">
<description>Time Warrior</description>
<year>1990</year>
- <publisher>Bit Corp.</publisher>
+ <publisher>Bit Corporation</publisher>
<info name="serial" value="C1014" />
<part name="cart" interface="gamate_cart">
<dataarea name="rom" size="32768">
@@ -202,7 +186,7 @@ C1070 - Insect War
<software name="killshot" supported="no">
<description>Kill Shot</description>
<year>1991</year>
- <publisher>Bit Corp.</publisher>
+ <publisher>Bit Corporation</publisher>
<info name="serial" value="C1015" />
<part name="cart" interface="gamate_cart">
<dataarea name="rom" size="32768">
@@ -214,7 +198,7 @@ C1070 - Insect War
<software name="dvcastle" supported="no">
<description>Devil Castle</description>
<year>1991</year>
- <publisher>Bit Corp.</publisher>
+ <publisher>Bit Corporation</publisher>
<info name="serial" value="C1017" />
<part name="cart" interface="gamate_cart">
<dataarea name="rom" size="32768">
@@ -226,7 +210,7 @@ C1070 - Insect War
<software name="kungfu" supported="no">
<description>Kung-Fu Fighter</description>
<year>1990</year>
- <publisher>Bit Corp.</publisher>
+ <publisher>Bit Corporation</publisher>
<info name="serial" value="C1018" />
<part name="cart" interface="gamate_cart">
<dataarea name="rom" size="32768">
@@ -238,7 +222,7 @@ C1070 - Insect War
<software name="dinoball" supported="no">
<description>Dino Ball</description>
<year>1991</year>
- <publisher>Bit Corp.</publisher>
+ <publisher>Bit Corporation</publisher>
<info name="serial" value="C1019" />
<part name="cart" interface="gamate_cart">
<dataarea name="rom" size="32768">
@@ -250,7 +234,7 @@ C1070 - Insect War
<software name="mythasam" supported="no">
<description>Myth of Asamia</description>
<year>1990</year>
- <publisher>Bit Corp.</publisher>
+ <publisher>Bit Corporation</publisher>
<info name="serial" value="C1021" />
<part name="cart" interface="gamate_cart">
<dataarea name="rom" size="32768">
@@ -262,7 +246,7 @@ C1070 - Insect War
<software name="pipemani" supported="no">
<description>Pipemania</description>
<year>1991</year>
- <publisher>Bit Corp.</publisher>
+ <publisher>Bit Corporation</publisher>
<info name="serial" value="C1022" />
<part name="cart" interface="gamate_cart">
<dataarea name="rom" size="32768">
@@ -274,7 +258,7 @@ C1070 - Insect War
<software name="tennis" supported="no">
<description>Tennis</description>
<year>1991</year>
- <publisher>Bit Corp.</publisher>
+ <publisher>Bit Corporation</publisher>
<info name="serial" value="C1023" />
<part name="cart" interface="gamate_cart">
<dataarea name="rom" size="32768">
@@ -286,7 +270,7 @@ C1070 - Insect War
<software name="marauder" supported="no">
<description>Marauder</description>
<year>1991</year>
- <publisher>Bit Corp.</publisher>
+ <publisher>Bit Corporation</publisher>
<info name="serial" value="C1024" />
<part name="cart" interface="gamate_cart">
<dataarea name="rom" size="32768">
@@ -298,7 +282,7 @@ C1070 - Insect War
<software name="flipuzle" supported="no">
<description>Flipuzzle</description>
<year>1991</year>
- <publisher>Bit Corp.</publisher>
+ <publisher>Bit Corporation</publisher>
<info name="serial" value="C1026" />
<part name="cart" interface="gamate_cart">
<dataarea name="rom" size="32768">
@@ -310,7 +294,7 @@ C1070 - Insect War
<software name="monstpit" supported="no">
<description>Monster Pitfall</description>
<year>1990</year>
- <publisher>Bit Corp.</publisher>
+ <publisher>Bit Corporation</publisher>
<info name="serial" value="C1027" />
<part name="cart" interface="gamate_cart">
<dataarea name="rom" size="32768">
@@ -322,7 +306,7 @@ C1070 - Insect War
<software name="vindicat" supported="no">
<description>Vindicators</description>
<year>1990</year>
- <publisher>Bit Corp.</publisher>
+ <publisher>Bit Corporation</publisher>
<info name="serial" value="C1028" />
<part name="cart" interface="gamate_cart">
<dataarea name="rom" size="32768">
@@ -334,7 +318,7 @@ C1070 - Insect War
<software name="brikblst" supported="no">
<description>Brick Blaster</description>
<year>1990</year>
- <publisher>Bit Corp.</publisher>
+ <publisher>Bit Corporation</publisher>
<info name="serial" value="C1029" />
<part name="cart" interface="gamate_cart">
<dataarea name="rom" size="32768">
@@ -346,7 +330,7 @@ C1070 - Insect War
<software name="bomblast" supported="no">
<description>Bomb Blaster</description>
<year>1990</year>
- <publisher>Bit Corp.</publisher>
+ <publisher>Bit Corporation</publisher>
<info name="serial" value="C1031" />
<part name="cart" interface="gamate_cart">
<dataarea name="rom" size="32768">
@@ -359,7 +343,7 @@ C1070 - Insect War
<software name="bomblasta" cloneof="bomblast" supported="no">
<description>Bomb Blaster (Alt)</description>
<year>1990</year>
- <publisher>Bit Corp.</publisher>
+ <publisher>Bit Corporation</publisher>
<info name="serial" value="C1031" />
<part name="cart" interface="gamate_cart">
<dataarea name="rom" size="32768">
@@ -371,7 +355,7 @@ C1070 - Insect War
<software name="cosmicfg" supported="no">
<description>Cosmic Fighter</description>
<year>1990</year>
- <publisher>Bit Corp.</publisher>
+ <publisher>Bit Corporation</publisher>
<info name="serial" value="C1032" />
<part name="cart" interface="gamate_cart">
<dataarea name="rom" size="32768">
@@ -380,10 +364,22 @@ C1070 - Insect War
</part>
</software>
+ <software name="fistofth" supported="no">
+ <description>Fist of Thunder</description>
+ <year>1991</year>
+ <publisher>Bit Corporation</publisher>
+ <info name="serial" value="C1033" />
+ <part name="cart" interface="gamate_cart">
+ <dataarea name="rom" size="65536">
+ <rom name="c1-033.bin" size="65536" crc="9002269d" sha1="899d1592f0da06f9684cb271ec34541c702f21ab" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="treashnt" supported="no">
<description>Treasure Hunter</description>
<year>1990</year>
- <publisher>Bit Corp.</publisher>
+ <publisher>Bit Corporation</publisher>
<info name="serial" value="C1035" />
<part name="cart" interface="gamate_cart">
<dataarea name="rom" size="32768">
@@ -392,10 +388,22 @@ C1070 - Insect War
</part>
</software>
+ <software name="jewelris" supported="no">
+ <description>Jewelriss</description>
+ <year>1990</year>
+ <publisher>Bit Corporation</publisher>
+ <info name="serial" value="C1036" />
+ <part name="cart" interface="gamate_cart">
+ <dataarea name="rom" size="32768">
+ <rom name="c1-036.bin" size="32768" crc="5ba39d1c" sha1="23f4adad99f6c17fb556b512b6eca2645033aadd" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="santa" supported="no">
<description>Nightmare of Santa Claus</description>
<year>1991</year>
- <publisher>Bit Corp.</publisher>
+ <publisher>Bit Corporation</publisher>
<info name="serial" value="C1037" />
<part name="cart" interface="gamate_cart">
<dataarea name="rom" size="32768">
@@ -404,10 +412,34 @@ C1070 - Insect War
</part>
</software>
+ <software name="marsvoya" supported="no">
+ <description>Mars Voyage</description>
+ <year>1991</year>
+ <publisher>Bit Corporation</publisher>
+ <info name="serial" value="C1038" />
+ <part name="cart" interface="gamate_cart">
+ <dataarea name="rom" size="65536">
+ <rom name="c1-038.bin" size="65536" crc="19bba397" sha1="01163f89447c68554cd2fe60b22dea7b578f1605" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="flgoblin" supported="no">
+ <description>Flying Goblin</description>
+ <year>1991</year>
+ <publisher>Bit Corporation</publisher>
+ <info name="serial" value="C1042" />
+ <part name="cart" interface="gamate_cart">
+ <dataarea name="rom" size="65536">
+ <rom name="c1-042.bin" size="65536" crc="8363c32d" sha1="b07681e28b65af53fed23def3f6305ab929bb8f1" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="boom" supported="no">
<description>Boom</description>
<year>1991</year>
- <publisher>Bit Corp.</publisher>
+ <publisher>Bit Corporation</publisher>
<info name="serial" value="C1043" />
<part name="cart" interface="gamate_cart">
<dataarea name="rom" size="32768">
@@ -419,7 +451,7 @@ C1070 - Insect War
<software name="snowman" supported="no">
<description>Snowman Legend</description>
<year>1991</year>
- <publisher>Bit Corp.</publisher>
+ <publisher>Bit Corporation</publisher>
<info name="serial" value="C1044" />
<part name="cart" interface="gamate_cart">
<dataarea name="rom" size="32768">
@@ -428,10 +460,58 @@ C1070 - Insect War
</part>
</software>
+ <software name="wcupsocc" supported="no">
+ <description>World Cup Soccer</description>
+ <year>199?</year>
+ <publisher>Unknown</publisher>
+ <info name="serial" value="C1045" />
+ <part name="cart" interface="gamate_cart">
+ <dataarea name="rom" size="65536">
+ <rom name="c1-045.bin" size="65536" crc="c165094f" sha1="148bd0e461d8f967b483136460a770820d2e7226" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="punkboy" supported="no">
+ <description>Punk Boy</description>
+ <year>1992</year>
+ <publisher>Bit Corporation</publisher>
+ <info name="serial" value="C1049" />
+ <part name="cart" interface="gamate_cart">
+ <dataarea name="rom" size="131072">
+ <rom name="c1-049.bin" size="65536" crc="aa2e0d32" sha1="1b3082be0698c12c8fc978db6a0c63c8958c33f8" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="famous7" supported="no">
+ <description>Famous 7</description>
+ <year>1993</year>
+ <publisher>United Microelectronics Corporation</publisher>
+ <info name="serial" value="C1052" />
+ <part name="cart" interface="gamate_cart">
+ <dataarea name="rom" size="65536">
+ <rom name="c1-052.bin" size="65536" crc="0fa48c23" sha1="ea422fe969b260296b99397cdeff6ae053ac4a86" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="toughguy" supported="no">
+ <description>Tough Guy</description>
+ <year>1993</year>
+ <publisher>United Microelectronics Corporation</publisher>
+ <info name="serial" value="C1053" />
+ <part name="cart" interface="gamate_cart">
+ <dataarea name="rom" size="131072">
+ <rom name="c1-053.bin" size="131072" crc="727299c7" sha1="5515f7dc5a00fa38677c4ac5b73af232008f3e51" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="mjigsaw" supported="no">
<description>Magic Jigsaw</description>
<year>1991</year>
- <publisher>Bit Corp.</publisher>
+ <publisher>Bit Corporation</publisher>
<info name="serial" value="C1054" />
<part name="cart" interface="gamate_cart">
<dataarea name="rom" size="32768">
@@ -440,28 +520,146 @@ C1070 - Insect War
</part>
</software>
-<!-- This does not display anything, so it might not be this game! -->
+ <software name="fanttrav" supported="no">
+ <description>Fantasy Travel</description>
+ <year>1993</year>
+ <publisher>United Microelectronics Corporation</publisher>
+ <info name="serial" value="C1057" />
+ <part name="cart" interface="gamate_cart">
+ <dataarea name="rom" size="131072">
+ <rom name="c1-057.bin" size="131072" crc="a542c61f" sha1="2eccf1fe8d400a54ffb2f026af8b9842442b6d9f" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="quizfigh" supported="no">
+ <description>QuizFighter</description>
+ <year>1993</year>
+ <publisher>United Microelectronics Corporation</publisher>
+ <info name="serial" value="C1058" />
+ <part name="cart" interface="gamate_cart">
+ <dataarea name="rom" size="262144">
+ <rom name="c1-058.bin" size="262144" crc="16a79cd8" sha1="7d638bf61286adfa612de974efff2d9b5b4b3331" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="hannibal" supported="no">
+ <description>Further Adventures of Hannibal The Cat</description>
+ <year>1993</year>
+ <publisher>Unknown</publisher>
+ <info name="serial" value="C1060" />
+ <part name="cart" interface="gamate_cart">
+ <dataarea name="rom" size="524288">
+ <rom name="c1-060.bin" size="524288" crc="9aa13551" sha1="a1163f1da52e23bda0502f229488a5b4d04bbe8a" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="dinopark" supported="no">
<description>Dinosaur Park</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <year>1993</year>
+ <publisher>Phinnex Co., Ltd.</publisher>
<info name="serial" value="C1061" />
<part name="cart" interface="gamate_cart">
- <dataarea name="rom" size="16384">
- <rom name="c1061_gamate_card.bin" size="16384" crc="c05d20b5" sha1="e45a028809738bfa265661414f755691a5b63ad0" offset="0" />
+ <dataarea name="rom" size="524288">
+ <rom name="c1-061.bin" size="524288" crc="00356983" sha1="e93c671ee1eb40bb4d7298671dc213a07afef9e0" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="basketba" supported="no">
+ <description>Basketball</description>
+ <year>199?</year>
+ <publisher>Unknown</publisher>
+ <info name="serial" value="C1063" />
+ <part name="cart" interface="gamate_cart">
+ <dataarea name="rom" size="524288">
+ <rom name="c1-063.bin" size="262144" crc="93d5f365" sha1="91b9b9060b76d2012d5cbc6523839f67caa37aaf" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="baoqingt" supported="no">
+ <description>Bao Qing Tian</description>
+ <year>199?</year>
+ <publisher>Unknown</publisher>
+ <info name="serial" value="C1064" />
+ <part name="cart" interface="gamate_cart">
+ <dataarea name="rom" size="524288">
+ <rom name="c1-064.bin" size="524288" crc="8574f0eb" sha1="ba42622b9ff4b2fa0cb70f322ee24b1d8c387222" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="robinhoo" supported="no">
+ <description>Robin Hood</description>
+ <year>1994</year>
+ <publisher>Phinnex Co., Ltd.</publisher>
+ <info name="serial" value="C1067" />
+ <part name="cart" interface="gamate_cart">
+ <dataarea name="rom" size="524288">
+ <rom name="c1-067.bin" size="524288" crc="76e26b63" sha1="bfb2f4b5b771277333ffc1e27cf3a5608e9ea163" offset="0" />
</dataarea>
</part>
</software>
-<!-- This does not display anything, so it might not be this game! -->
<software name="goldpyra" supported="no">
<description>The Golden Pyramid</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <year>199?</year>
+ <publisher>Unknown</publisher>
<info name="serial" value="C1068" />
<part name="cart" interface="gamate_cart">
- <dataarea name="rom" size="16384">
- <rom name="c1068_gamate_card.bin" size="16384" crc="fdd4dce6" sha1="156211b19d8e38f58955f95f9329cfa9d8b1c74c" offset="0" />
+ <dataarea name="rom" size="524288">
+ <rom name="c1-068.bin" size="524288" crc="96386b08" sha1="69909b78598184760b3e261da897a9bc90af9dfb" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rotat" supported="no">
+ <description>Riddle of the Ancient Tomb</description>
+ <year>1994</year>
+ <publisher>Unknown</publisher>
+ <info name="serial" value="C1069" />
+ <part name="cart" interface="gamate_cart">
+ <dataarea name="rom" size="524288">
+ <rom name="c1-069.bin" size="524288" crc="3bceb859" sha1="32187903c10dc80d62e9bf794b912921542d6d38" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="insectwa" supported="no">
+ <description>Insect War</description>
+ <year>1995</year>
+ <publisher>United Microelectronics Corporation</publisher>
+ <info name="serial" value="C1070" />
+ <part name="cart" interface="gamate_cart">
+ <dataarea name="rom" size="524288">
+ <rom name="c1-070.bin" size="524288" crc="7ba8af6d" sha1="6aa0364010272c82c7cc8c7afd60254de148fa72" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="4in1" supported="no">
+ <description>4-in-1 (Mini Golf, Cube-Up, Brick Blaster, and Vindicators)</description>
+ <year>1991</year>
+ <publisher>Bit Corporation</publisher>
+ <info name="serial" value="C1401" />
+ <part name="cart" interface="gamate_cart">
+ <dataarea name="rom" size="131072">
+ <rom name="c1-401.bin" size="131072" crc="10e81571" sha1="4dd20632eb31023e18241290eca7d5a5acb1fa84" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="1milwhys" supported="no">
+ <description>One Million Whys</description>
+ <year>1993</year>
+ <publisher>United Microelectronics Corporation</publisher>
+ <info name="serial" value="K1001" />
+ <part name="cart" interface="gamate_cart">
+ <dataarea name="rom" size="524288">
+ <rom name="k1-001.bin" size="524288" crc="ebb46efe" sha1="beae4f3365031f4e8ae192a5e6d27a28979ef84b" offset="0" />
</dataarea>
</part>
</software>
diff --git a/hash/gba.xml b/hash/gba.xml
index 2cc71b2965f..ae84ccbc74e 100644
--- a/hash/gba.xml
+++ b/hash/gba.xml
@@ -39380,5 +39380,39 @@ The cart also contained a non-empty SRAM save which we currently include in the
</part>
</software>
+<!-- These are not yet verified as good, mapper is not emulated -->
+
+ <software name="shrekmv">
+ <description>Shrek</description>
+ <year>200?</year>
+ <publisher>&lt;unlicensed&gt;</publisher>
+ <part name="cart" interface="gba_cart">
+ <dataarea name="rom" size="0x4000000">
+ <rom name="shrek-mske.gba" size="0x4000000" crc="e698c9ae" sha1="95d57c0a825b5f6531c8a098c8b9f8b6eb3f8eb5" offset="000000" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="shrek2mv">
+ <description>Shrek 2</description>
+ <year>200?</year>
+ <publisher>&lt;unlicensed&gt;</publisher>
+ <part name="cart" interface="gba_cart">
+ <dataarea name="rom" size="0x4000000">
+ <rom name="shrek2-m2se.gba" size="0x4000000" crc="0d353654" sha1="5cd627e205020297b25d707131883be5850515fe" offset="000000" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sharkmv">
+ <description>Shark's Tale</description>
+ <year>200?</year>
+ <publisher>&lt;unlicensed&gt;</publisher>
+ <part name="cart" interface="gba_cart">
+ <dataarea name="rom" size="0x4000000">
+ <rom name="sharkstale-msae.gba" size="0x4000000" crc="d2cf417a" sha1="9bc5b60793b8a6de3b80eb2c213cd125e1fa468e" offset="000000" />
+ </dataarea>
+ </part>
+ </software>
</softwarelist>
diff --git a/hash/gmaster.xml b/hash/gmaster.xml
index 78b2f7904bc..cdec418a14a 100644
--- a/hash/gmaster.xml
+++ b/hash/gmaster.xml
@@ -7,7 +7,6 @@ Undumped:
- Invader
- Move It
- S-Race
-- Soccer (Fuss-Ball)
- Tank War
-->
<softwarelist name="gmaster" description="Hartung Game Master cartridges">
@@ -55,6 +54,17 @@ Undumped:
</part>
</software>
+ <software name="fussball" supported ="partial"> <!-- some gfx corruption -->
+ <description>3-on-3 Soccer (Fuss-ball)</description>
+ <year>1990</year>
+ <publisher>Hartung</publisher>
+ <part name="cart" interface="gmaster_cart">
+ <dataarea name="rom" size="0x8000">
+ <rom name="fussball.bin" size="0x8000" crc="76cf4c92" sha1="a4b6e7f98e953e47f5aa427752e8a936e7582bc9" offset="00000" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="gobang" supported="no">
<description>Go Bang</description>
<year>1990</year>
diff --git a/hash/h21.xml b/hash/h21.xml
index 41cb66d746f..d3a57f82e5c 100644
--- a/hash/h21.xml
+++ b/hash/h21.xml
@@ -4,21 +4,21 @@
<softwarelist name="h21" description="TRQ Video Computer H-21 cartridges">
<!--
-
+
TRQ distributed a total of 24 games for this system. The only exclusive title
appears to be "Come frutas", the rest of the games are copies of the respective
VC-4000 games.
-
+
TODO: Verify and add the rest of the games.
- 1 Millón electrónico
- 2 Guerra de tanques y aviones
- 3 Batalla aero-naval
- 4 Invasores
- 5 Guerra de las galaxias
- 6 Circo
-
- -->
+ 1 Millón electrónico
+ 2 Guerra de tanques y aviones
+ 3 Batalla aero-naval
+ 4 Invasores
+ 5 Guerra de las galaxias
+ 6 Circo
+
+ -->
<software name="comefrut" supported="no">
<description>Come frutas</description>
@@ -34,25 +34,25 @@
</software>
<!--
-
- 8 En busca del tesoro / Memoria
- 9 Caza
- 10 Othello
- 11 Super-Sport 60
- 12 Fútbol
- 13 Carrera de caballos
- 14 Las 4 en raya
- 15 Master-Mind (Código Secreto)
- 16 Carreras de coches
- 17 Laberinto
- 18 Boxeo
- 19 Juego de cartas / Black Jack
- 20 Órgano musical / Simon
- 21 Golf
- 22 Matemáticas I
- 23 Matemáticas II
- 24 Crazy Spider. La araña loca
-
+
+ 8 En busca del tesoro / Memoria
+ 9 Caza
+ 10 Othello
+ 11 Super-Sport 60
+ 12 Fútbol
+ 13 Carrera de caballos
+ 14 Las 4 en raya
+ 15 Master-Mind (Código Secreto)
+ 16 Carreras de coches
+ 17 Laberinto
+ 18 Boxeo
+ 19 Juego de cartas / Black Jack
+ 20 Órgano musical / Simon
+ 21 Golf
+ 22 Matemáticas I
+ 23 Matemáticas II
+ 24 Crazy Spider. La araña loca
+
-->
</softwarelist>
diff --git a/hash/md2_flop.xml b/hash/md2_flop.xml
new file mode 100644
index 00000000000..ffa8c15912a
--- /dev/null
+++ b/hash/md2_flop.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0"?>
+<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
+
+<softwarelist name="md2_flop" description="MD-2 disk images">
+
+ <software name="momd2r21">
+ <description>CP/M 2.2 System Disk rev 2.1</description>
+ <year>1983</year>
+ <publisher>Morrow Designs</publisher>
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="80734">
+ <rom name="momd2r21.tdo" size="80734" crc="5d265d5b" sha1="68d036c1b055a1ee95679bb70e169029cb825e23" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="momd2r16" cloneof="momd2r21">
+ <description>CP/M 2.2 System Disk rev 1.6</description>
+ <year>198?</year>
+ <publisher>Morrow Designs</publisher>
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="79928">
+ <rom name="momd2r16.tdo" size="79928" crc="3e5ba26d" sha1="c9de296ea18904f8de984b9f71b43a7988a8facc" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="momd2r13" cloneof="momd2r21">
+ <description>CP/M 2.2 System Disk rev 1.3</description>
+ <year>198?</year>
+ <publisher>Morrow Designs</publisher>
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="76008">
+ <rom name="momd2r13.tdo" size="76008" crc="dc649f14" sha1="fb37b54d2acf99f38109482a2c7953a39754e27c" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="momd2r1x" cloneof="momd2r21">
+ <description>CP/M 2.2 System Disk rev 1.x</description>
+ <year>198?</year>
+ <publisher>Morrow Designs</publisher>
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="75924">
+ <rom name="momd2r1x.tdo" size="75924" crc="5ba9aa27" sha1="2915d45c04b7185b7d8494730928afb327664204" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="softdist">
+ <description>Software Distribution Disks</description>
+ <year>1982</year>
+ <publisher>Morrow Designs</publisher>
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Correct-It"/>
+ <dataarea name="flop" size="165597">
+ <rom name="distr_disk_1.imd" size="165597" crc="bf6d2ba2" sha1="4d8f95ee638894789b23abb8c72974db2cd59651" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="BASIC-80 &amp; BAZIC"/>
+ <dataarea name="flop" size="112445">
+ <rom name="6distr_disk_2.imd" size="112445" crc="899a6a8a" sha1="8c6192a3106c00d927a6da886b5ea837ea608656" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="LogiCalc"/>
+ <dataarea name="flop" size="152331">
+ <rom name="distr_disk_3.imd" size="152331" crc="7f1bbdf6" sha1="8faaab8be8123ffd49f5f9acae520faf05f699f5" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+</softwarelist>
diff --git a/hash/megadriv.xml b/hash/megadriv.xml
index eb531e19d5d..db4975ef4ac 100644
--- a/hash/megadriv.xml
+++ b/hash/megadriv.xml
@@ -24757,7 +24757,7 @@ Notice that these are not working on real hardware due to bugged code with VDP i
</software>
<software name="stargatep" cloneof="stargate">
- <description>Stargate (Euro, Prototype)</description>
+ <description>Stargate (Euro, Prototype, older)</description>
<year>1994</year>
<publisher>Acclaim Entertainment</publisher>
<part name="cart" interface="megadriv_cart">
@@ -24767,6 +24767,17 @@ Notice that these are not working on real hardware due to bugged code with VDP i
</part>
</software>
+ <software name="stargatepa" cloneof="stargate">
+ <description>Stargate (Prototype)</description>
+ <year>1994</year>
+ <publisher>Acclaim Entertainment</publisher>
+ <part name="cart" interface="megadriv_cart">
+ <dataarea name="rom" width="16" endianness="big" size="2097152">
+ <rom name="Stargate.98DC.bin" size="2097152" crc="51946ea9" sha1="92bee364d23fc28d9f976037d3420767c4f97d68" offset="0x000000"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="steeltalj" cloneof="steeltal">
<description>Steel Talons (Jpn, Kor)</description>
<year>1993</year>
@@ -26679,6 +26690,17 @@ Notice that these are not working on real hardware due to bugged code with VDP i
</part>
</software>
+ <software name="toystoryp" cloneof="toystory">
+ <description>Toy Story (USA, prototype)</description>
+ <year>1996</year>
+ <publisher>Disney Interactive</publisher>
+ <part name="cart" interface="megadriv_cart">
+ <dataarea name="rom" width="16" endianness="big" size="4194304">
+ <rom name="ExecuteDemo1.9F79.bin" size="4194304" crc="9321bec1" sha1="7932c7de237ca333750b98ff3d2832c5f65be851" offset="0x000000"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="toys">
<description>Toys (USA)</description>
<year>1993</year>
diff --git a/hash/msx2_flop.xml b/hash/msx2_flop.xml
index 825e81c94dd..4301fc097fa 100644
--- a/hash/msx2_flop.xml
+++ b/hash/msx2_flop.xml
@@ -7617,6 +7617,50 @@ The following floppies came with the machines.
</part>
</software>
+ <software name="midgarts">
+ <description>Mid-Garts Dual Side (Jpn)</description>
+ <year>1989</year>
+ <publisher>WolfTeam</publisher>
+ <info name="alt_title" value="ミッドガルツ" />
+
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="737280">
+ <rom name="middogarutsu. mid-garts dual side (1989)(wolfteam)(jp)(disk 1 of 6).dsk" size="737280" crc="90559e83" sha1="c78e099022ae77c47b95a45fca869324fecb4cb5" offset="0" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="737280">
+ <rom name="middogarutsu. mid-garts dual side (1989)(wolfteam)(jp)(disk 2 of 6).dsk" size="737280" crc="24183de3" sha1="53d6aa633a841878a3c67a3024f7c3ed3e1b4508" offset="0" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 3"/>
+ <dataarea name="flop" size="737280">
+ <rom name="middogarutsu. mid-garts dual side (1989)(wolfteam)(jp)(disk 3 of 6).dsk" size="737280" crc="5611fda7" sha1="b30746e7fe256ddef2d2f1cad8a57aea86a4c478" offset="0" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 4"/>
+ <dataarea name="flop" size="737280">
+ <rom name="middogarutsu. mid-garts dual side (1989)(wolfteam)(jp)(disk 4 of 6).dsk" size="737280" crc="7a28644e" sha1="33e94dac0f9cb73f4a15265bb0166e48183bdb35" offset="0" />
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 5"/>
+ <dataarea name="flop" size="737280">
+ <rom name="middogarutsu. mid-garts dual side (1989)(wolfteam)(jp)(disk 5 of 6).dsk" size="737280" crc="64acdb49" sha1="47b9228b014d9e953dad956bb04aabedfa4db8a9" offset="0" />
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 6"/>
+ <dataarea name="flop" size="737280">
+ <rom name="middogarutsu. mid-garts dual side (1989)(wolfteam)(jp)(disk 6 of 6).dsk" size="737280" crc="b920cf5b" sha1="2863537cbf930701a81540948f7e037359ba8ec3" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="mightmg2">
<description>Might and Magic II - Gates to Another World (Jpn)</description>
<year>1989</year>
diff --git a/hash/msx2p_flop.xml b/hash/msx2p_flop.xml
index 0387a534490..24cf03cb7c5 100644
--- a/hash/msx2p_flop.xml
+++ b/hash/msx2p_flop.xml
@@ -281,8 +281,9 @@ Known undumped:
</part>
</software>
- <software name="midgarts">
- <description>Mid-Garts (Jpn)</description>
+ <!-- Has smooth horizontal scrolling, unlike the MSX2 release - this effect is not emulated correctly -->
+ <software name="midgarts" supported="no">
+ <description>Mid-Garts (MSX2+) (Jpn)</description>
<year>1989</year>
<publisher>WolfTeam</publisher>
<info name="alt_title" value="ミッドガルツ" />
@@ -290,37 +291,37 @@ Known undumped:
<part name="flop1" interface="floppy_3_5">
<feature name="part_id" value="Disk 1"/>
<dataarea name="flop" size="737280">
- <rom name="middogarutsu. mid-garts dual side (1989)(wolfteam)(jp)(disk 1 of 6).dsk" size="737280" crc="90559e83" sha1="c78e099022ae77c47b95a45fca869324fecb4cb5" offset="0" />
+ <rom name="m2p_006a.dsk" size="737280" crc="9eef9228" sha1="a5c831306c86d445d42ec13f7551346f28814686" offset="0" />
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
<feature name="part_id" value="Disk 2"/>
<dataarea name="flop" size="737280">
- <rom name="middogarutsu. mid-garts dual side (1989)(wolfteam)(jp)(disk 2 of 6).dsk" size="737280" crc="24183de3" sha1="53d6aa633a841878a3c67a3024f7c3ed3e1b4508" offset="0" />
+ <rom name="m2p_006b.dsk" size="737280" crc="26f58049" sha1="5ba41719f93bd8dc55b6a1b027cf321a31dd0884" offset="0" />
</dataarea>
</part>
<part name="flop3" interface="floppy_3_5">
<feature name="part_id" value="Disk 3"/>
<dataarea name="flop" size="737280">
- <rom name="middogarutsu. mid-garts dual side (1989)(wolfteam)(jp)(disk 3 of 6).dsk" size="737280" crc="5611fda7" sha1="b30746e7fe256ddef2d2f1cad8a57aea86a4c478" offset="0" />
+ <rom name="m2p_006c.dsk" size="737280" crc="691c1eff" sha1="42cdf6f5bb4d7d39f4a11e7fec31b0a5ecf7ecd4" offset="0" />
</dataarea>
</part>
<part name="flop4" interface="floppy_3_5">
<feature name="part_id" value="Disk 4"/>
<dataarea name="flop" size="737280">
- <rom name="middogarutsu. mid-garts dual side (1989)(wolfteam)(jp)(disk 4 of 6).dsk" size="737280" crc="7a28644e" sha1="33e94dac0f9cb73f4a15265bb0166e48183bdb35" offset="0" />
+ <rom name="m2p_006d.dsk" size="737280" crc="bdf45ec0" sha1="ee868c95dacc2edee29e7c390bcb2f87ec07b898" offset="0" />
</dataarea>
</part>
<part name="flop5" interface="floppy_3_5">
<feature name="part_id" value="Disk 5"/>
<dataarea name="flop" size="737280">
- <rom name="middogarutsu. mid-garts dual side (1989)(wolfteam)(jp)(disk 5 of 6).dsk" size="737280" crc="64acdb49" sha1="47b9228b014d9e953dad956bb04aabedfa4db8a9" offset="0" />
+ <rom name="m2p_006e.dsk" size="737280" crc="406f5f54" sha1="90b4f39cb440b2cb3b2479ee5e633818ebe54bb4" offset="0" />
</dataarea>
</part>
<part name="flop6" interface="floppy_3_5">
<feature name="part_id" value="Disk 6"/>
<dataarea name="flop" size="737280">
- <rom name="middogarutsu. mid-garts dual side (1989)(wolfteam)(jp)(disk 6 of 6).dsk" size="737280" crc="b920cf5b" sha1="2863537cbf930701a81540948f7e037359ba8ec3" offset="0" />
+ <rom name="m2p_006f.dsk" size="737280" crc="c65264da" sha1="8c847557b7838afff2354eb8a9d7f02e5d70519c" offset="0" />
</dataarea>
</part>
</software>
diff --git a/hash/neogeo.xml b/hash/neogeo.xml
index ef68e42aa33..43092413118 100644
--- a/hash/neogeo.xml
+++ b/hash/neogeo.xml
@@ -12036,10 +12036,10 @@
<rom loadflag="load16_word_swap" name="dig-p1.bin" offset="0x000000" size="0x080000" crc="eda433d7" sha1="abb14c66777ab0fe4ac76a402e253a49df7178d8" />
</dataarea>
<dataarea name="fixed" size="0x040000">
- <rom offset="0x000000" size="0x010000" name="dig-s1.bin" crc="75a88c1f" sha1="295dd9225f1e3d2fc64a65b3c287c7f1765417b1" />
+ <rom offset="0x000000" size="0x020000" name="dig-s1.bin" crc="9b3168f0" sha1="9be8c625686a1482f7399e5a856cfe2fef25ec52" />
</dataarea>
- <dataarea name="audiocpu" size="0x010000">
- <rom offset="0x000000" size="0x010000" name="dig-m1.bin" crc="833cdf1b" sha1="3a92c79adbe0d37956ea46a4746d6f1cbf7d2c14" />
+ <dataarea name="audiocpu" size="0x020000">
+ <rom offset="0x000000" size="0x020000" name="dig-m1.bin" crc="e777a234" sha1="9f3974ac07859337bc0203f903c40ae3f60dc1fb" />
</dataarea>
<dataarea name="ymsnd" size="0x200000">
<rom name="dig-v1.bin" offset="0x000000" size="0x080000" crc="ee15bda4" sha1="fe2206728e6efd02d6302869a98b196eb19a17df" />
diff --git a/hash/pc1000.xml b/hash/pc1000.xml
new file mode 100644
index 00000000000..6c1089f64d7
--- /dev/null
+++ b/hash/pc1000.xml
@@ -0,0 +1,142 @@
+<?xml version="1.0"?>
+<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
+<softwarelist name="pc1000" description="VTech PreComputer 1000 cartridges">
+ <software name="biblekno">
+ <description>Bible Knowledge</description>
+ <year>1988</year>
+ <publisher>VTech</publisher>
+ <part name="rom" interface="genius_cart">
+ <dataarea name="rom" size="0x20000">
+ <rom name="27-5410-00.ic1" size="0x20000" crc="fc1fa151" sha1="54cd1311aa9f58607836b152826e782de6bfe098" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="explor"> <!-- only working with PreComputer 1000 or MisterX -->
+ <description>Explorations</description>
+ <year>1988</year>
+ <publisher>VTech</publisher>
+ <part name="rom" interface="genius_cart">
+ <dataarea name="rom" size="0x20000">
+ <rom name="27-5410-00.ic1" size="0x10000" crc="fc1fa151" sha1="54cd1311aa9f58607836b152826e782de6bfe098" offset="0" />
+ <rom size="0x10000" offset="0" loadflag="continue"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ftp">
+ <description>Famous Things &amp; Places</description>
+ <year>1992</year>
+ <publisher>VTech</publisher>
+ <part name="rom" interface="genius_cart">
+ <dataarea name="rom" size="0x20000">
+ <rom name="LH531G30" size="0x20000" crc="3a0722b8" sha1="1ebc0ca41dddff8f4ef1e5a0f7986c4e5b5cfdd5" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ftpa">
+ <description>Famous Things &amp; Places Alt</description>
+ <year>1992</year>
+ <publisher>VTech</publisher>
+ <part name="rom" interface="genius_cart">
+ <dataarea name="rom" size="0x20000">
+ <rom name="LH531G30" size="0x10000" crc="3a0722b8" sha1="1ebc0ca41dddff8f4ef1e5a0f7986c4e5b5cfdd5" offset="0" />
+ <rom size="0x10000" offset="0" loadflag="continue"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="generalk">
+ <description>General Knowledge 2</description>
+ <year>1988</year>
+ <publisher>VTech</publisher>
+ <part name="rom" interface="genius_cart">
+ <dataarea name="rom" size="0x20000">
+ <rom name="LH531G34.ic1" size="0x20000" crc="ec1c2c18" sha1="09ff0dbdbe679ed5ae2bd312d271be3d32bf252f" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="fantasyt">
+ <description>Fantasy Trivia</description>
+ <year>1988</year>
+ <publisher>VTech</publisher>
+ <part name="rom" interface="genius_cart">
+ <dataarea name="rom" size="0x20000">
+ <rom name="LH531G34.ic1" size="0x10000" crc="ec1c2c18" sha1="09ff0dbdbe679ed5ae2bd312d271be3d32bf252f" offset="0" />
+ <rom size="0x10000" offset="0" loadflag="continue"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="generala">
+ <description>General Knowledge 2 Alt</description>
+ <year>1988</year>
+ <publisher>VTech</publisher>
+ <part name="rom" interface="genius_cart">
+ <dataarea name="rom" size="0x20000">
+ <rom name="LH531G35.ic1" size="0x20000" crc="36f87983" sha1="505b564a01056ba33cc366cede761ce59d92d16e" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sportstr">
+ <description>Sports Trivia</description>
+ <year>1988</year>
+ <publisher>VTech</publisher>
+ <part name="rom" interface="genius_cart">
+ <dataarea name="rom" size="0x20000">
+ <rom name="LH531G35.ic1" size="0x10000" crc="36f87983" sha1="505b564a01056ba33cc366cede761ce59d92d16e" offset="0" />
+ <rom size="0x10000" offset="0" loadflag="continue"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="supers">
+ <description>Super Science</description>
+ <year>1991</year>
+ <publisher>VTech</publisher>
+ <part name="rom" interface="genius_cart">
+ <dataarea name="rom" size="0x20000">
+ <rom name="LH531G08.ic1" size="0x20000" crc="e311c7ea" sha1="8403675984043b0abeaa71a8496cb050c84a05b7" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="supersa">
+ <description>* Super Science *</description>
+ <year>1991</year>
+ <publisher>VTech</publisher>
+ <part name="rom" interface="genius_cart">
+ <dataarea name="rom" size="0x20000">
+ <rom name="LH531G08.ic1" size="0x10000" crc="e311c7ea" sha1="8403675984043b0abeaa71a8496cb050c84a05b7" offset="0" />
+ <rom size="0x10000" offset="0" loadflag="continue"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cgen2"> <!-- cart for Ordisavant -->
+ <description>Connaissances Generales II</description>
+ <year>1988</year>
+ <publisher>VTech</publisher>
+ <part name="rom" interface="genius_cart">
+ <dataarea name="rom" size="0x20000">
+ <rom name="27-5040-00-0.u1" size="0x20000" crc="4eb76fe6" sha1="99d3ad729b7eb784558dba50a38a80cf154a9b30" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="encyclop"> <!-- cart for Ordisavant -->
+ <description>Encyclopedie</description>
+ <year>1988</year>
+ <publisher>VTech</publisher>
+ <part name="rom" interface="genius_cart">
+ <dataarea name="rom" size="0x20000">
+ <rom name="27-5040-00-0.u1" size="0x10000" crc="4eb76fe6" sha1="99d3ad729b7eb784558dba50a38a80cf154a9b30" offset="0" />
+ <rom size="0x10000" offset="0" loadflag="continue"/>
+ </dataarea>
+ </part>
+ </software>
+
+</softwarelist>
diff --git a/hash/pico.xml b/hash/pico.xml
index 94265c61fa6..71ba190c791 100644
--- a/hash/pico.xml
+++ b/hash/pico.xml
@@ -21,7 +21,6 @@ Published by Sega/Sega Toys (HPC-6*** serial codes)
* ã„ã£ã—ょã«ã†ãŸãŠã†! ドラãˆã‚‚ã‚“ ã‚ãã‚ãカラオケ - Issho ni Utaou! Doraemon Wakuwaku Karaoke (Sega Toys - 1999xxxx - HPC-6073)
* クッキングピコ セット - Cooking Pico Set (Sega Toys - 1999xxxx - HPC-6076)
* パソコン接続キット ピコタウンã«ã§ã‹ã‘よã†! - Pasokon Setsuzoku Kit PicoTown ni Dekakeyou! (Sega Toys - 20010601 - HPC-6097)
-* トミカ・ピコ レスキューパーキング ãã‚“ãã‚…ã†ã—ã‚…ã¤ã©ã†! ã¯ãŸã‚‰ãã®ã‚Šã‚‚ã® <åˆå›žï½¥ãƒˆãƒŸã‚«ä»˜å±ž> - Tomica Pico Rescue Parking Kinkyuushutsudou! Hataraku Norimono ~Shokai-Tomica Fuzoku~ (Sega Toys - 200207xx - HPC-6114)
* 学研 ピコã§å­¦ç¿’ 1年生 - Gakken Pico de Gakushuu 1-nensei (Sega Toys - ???? - HPC-????)
* McDonald's マクドナルドã§ã‚ãã¼!<10th> - McDonald's - McDonald de Asobo! ~10th Anniversary Edition~ (Sega Toys - 200306xx - HPC-6125) [reprint HPC-6079]
* ドラãˆã‚‚ã‚“ ã®ã³ãŸã® ã¾ã¡ãªã‹ ドキドキ ãŸã‚“ã‘ã‚“!<10th> - Doraemon - Nobita no Machinaka Dokidoki Tanken! ~10th Anniversary Edition~ (Sega Toys - 200308xx - HPC-6126) [reprint HPC-6009]
@@ -49,7 +48,6 @@ Published by Others (T-yyy*** serial codes, for yyy depending on the publisher)
* ã¯ã˜ã‚ã¾ã‚·ãƒªãƒ¼ã‚º4 学研ã®ãŠã¹ã‚“ãょã†ã‚½ãƒ•ト ãŸã—ã–ã‚“ ã²ãã–ã‚“ - Hajimema Series 4 - Gakken no Obenkyou Soft - Tashizan Hikizan (Gakken - 1998xxxx - T-169070)
* ãã‚‚ã‚“ã® ã™ãã™ãれã£ã™ã‚“ ã¯ã˜ã‚ã¦ã®ã²ã‚‰ãŒãª - Kumon no Sukusuku Ressun Hajimete no Hiragana (Kumon - 20020124 - T-300020)
* 左脳開発シリーズ2 æ•°é‡ãƒ»è¨ˆç®— - Sanou Kaihatsu Series 2 Suuryou - Keisan (Imagineer - 19951002 - T-150230)
-* å¹³æˆæ•™è‚²å§”員会Jr. ã‚ã–ã›å„ªç­‰ç”Ÿ - Heisei Kyouikuiinkai Jr. Mezase Yuutousei (Imagineer - 19951201 - T-150270)
* 左脳開発シリーズ 探索・感性・記憶 - Sanou Kaihatsu Series Tansaku-Kansei-Kioku (Imagineer - Existence unconfirmed!)
@@ -1815,6 +1813,18 @@ Published by Others (T-yyy*** serial codes, for yyy depending on the publisher)
</part>
</software>
+ <software name="heiseiky">
+ <description>Heisei Kyouiku Iinkai Jr. Mezase Yuutousei (Jpn)</description>
+ <year>1995</year>
+ <publisher>Imagineer</publisher>
+ <part name="cart" interface="pico_cart">
+ <feature name="pcb" value="171-6882A" />
+ <dataarea name="rom" size="524288">
+ <rom name="mpr-18565-t.ic1" size="524288" crc="8ba23bbe" sha1="85e6ed98f5e7bfa04c1b099bba79ddd34ccdd40e" offset="000000" loadflag="load16_word_swap" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="hellokcs">
<description>Hello Kitty no Castelo (Bra)</description>
<year>19??</year>
@@ -4618,6 +4628,17 @@ But how do later protos fit with this theory? Maybe the later protos were from t
</part>
</software>
+ <software name="tomicarp">
+ <description>Tomica Pico Rescue Parking ~Shokai-Tomica Fuzoku~ (Jpn)</description>
+ <year>2002</year>
+ <publisher>Sega Toys</publisher>
+ <part name="cart" interface="pico_cart">
+ <dataarea name="rom" size="2097152">
+ <rom name="9v1-0014ar2" size="2097152" crc="3e53c515" sha1="fff0d70882c10adab3065bebe4ce07aee690f674" offset="000000" loadflag="load16_word_swap" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="hamtnaka">
<description>Tottoko Hamtaro - Haru-Natsu-Aki-Fuyu - Tottoko Nakayoshi! Ham Chance! (Jpn)</description>
<year>2001</year>
diff --git a/hash/pro128s_flop.xml b/hash/pro128s_flop.xml
index b40068439bd..ad06426769c 100644
--- a/hash/pro128s_flop.xml
+++ b/hash/pro128s_flop.xml
@@ -18,6 +18,7 @@
<description>Aviator</description>
<year>1987</year>
<publisher>Olivetti Prodest</publisher>
+ <info name="release" value="SF9590" />
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="327680">
<rom name="aviator.adm" size="327680" crc="98f1d06d" sha1="c8614cd080991d19cbf40ef205d049343d738a5f" offset="0" />
@@ -29,6 +30,7 @@
<description>Blue Ribbon 1</description>
<year>1987</year>
<publisher>Olivetti Prodest</publisher>
+ <info name="release" value="SF9640" />
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="327680">
<rom name="blueribbon1.adm" size="327680" crc="4bda3704" sha1="2c23d43f01d35fc1397377d8317b148be804cc72" offset="0" />
@@ -40,6 +42,7 @@
<description>Blue Ribbon 2</description>
<year>1987</year>
<publisher>Olivetti Prodest</publisher>
+ <info name="release" value="SF9650" />
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="327680">
<rom name="blueribbon2.adm" size="327680" crc="9cf20547" sha1="3e490286c043b3066a05785cc217b0b0866ffc09" offset="0" />
@@ -121,6 +124,7 @@
<description>Overdrive &amp; Centibug</description>
<year>1987</year>
<publisher>Olivetti Prodest</publisher>
+ <info name="release" value="SF9710" />
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="327680">
<rom name="overdrive_centibug.adm" size="327680" crc="a99d9e29" sha1="e44116199ae711131937a5de010bdcab541a87b3" offset="0" />
@@ -132,6 +136,7 @@
<description>Revs</description>
<year>1987</year>
<publisher>Olivetti Prodest</publisher>
+ <info name="release" value="SF9620" />
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="327680">
<rom name="revs.adm" size="327680" crc="c445ec45" sha1="4bef4edf44a727c0b36d81cf5ddd8064a13eb039" offset="0" />
@@ -167,6 +172,7 @@
<description>Super Arcade 3</description>
<year>1987</year>
<publisher>Olivetti Prodest</publisher>
+ <info name="release" value="SF9580" />
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="327680">
<rom name="superarcade3.adm" size="327680" crc="c34681e0" sha1="2c3cb301ecb1fbd5b2cedd1d12385ed263c39cfd" offset="0" />
@@ -178,6 +184,7 @@
<description>Super Arcade 4</description>
<year>1987</year>
<publisher>Olivetti Prodest</publisher>
+ <info name="release" value="SF9600" />
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="327680">
<rom name="superarcade4.adm" size="327680" crc="3b4510ab" sha1="058e56ac99fc8af81c05cefb8bf8954c5fa0d7e7" offset="0" />
@@ -201,6 +208,7 @@
<description>Scacchi (Ita)</description>
<year>1987</year>
<publisher>Olivetti Prodest</publisher>
+ <info name="release" value="SF9550" />
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="655360">
<rom name="scacchi.adl" size="655360" crc="08a45c85" sha1="a0b38359657c6df80f58e00578ad961a316d2385" offset="0" />
@@ -212,6 +220,7 @@
<description>Smash &amp; Grab &amp; Mr Wiz</description>
<year>1987</year>
<publisher>Olivetti Prodest</publisher>
+ <info name="release" value="SF9700" />
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="327680">
<rom name="smash_mrwiz.adm" size="327680" crc="2fba2c48" sha1="2e9c5ce65da83c2ac0b59f387ebe4fbd171d93c5" offset="0" />
@@ -223,6 +232,7 @@
<description>Star Striker &amp; Wallaby</description>
<year>1987</year>
<publisher>Olivetti Prodest</publisher>
+ <info name="release" value="SF9690" />
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="327680">
<rom name="starstriker_wallaby.adm" size="327680" crc="7768d196" sha1="f76cf06efc9c9b6ce01d5d6e9c656bdc034236c4" offset="0" />
@@ -303,6 +313,7 @@
<description>Beta-Base (Ita)</description>
<year>1987</year>
<publisher>Clares</publisher>
+ <info name="release" value="SF9750" />
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="163840">
<rom name="betabase.ads" size="163840" crc="8351f1f4" sha1="e015c41a93bf36b681d8fa7f1a18f324e789e554" offset="0" />
@@ -325,6 +336,7 @@
<description>ViewIndex</description>
<year>1987</year>
<publisher>Olivetti Prodest</publisher>
+ <info name="release" value="SF9530" />
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="327680">
<rom name="viewindex.adm" size="327680" crc="6e780731" sha1="8dfaddaa238e5f3db0b9dcbbc7ef06f4fa52102a" offset="0" />
@@ -336,6 +348,7 @@
<description>ViewPlot</description>
<year>1987</year>
<publisher>Olivetti Prodest</publisher>
+ <info name="release" value="SF9540" />
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="327680">
<rom name="viewplot.adm" size="327680" crc="2ca1eade" sha1="12eaa4ac1c6a6484a886f313bb793a2c4537eb91" offset="0" />
@@ -347,6 +360,7 @@
<description>ViewStore</description>
<year>1987</year>
<publisher>Olivetti Prodest</publisher>
+ <info name="release" value="SF9520" />
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="327680">
<rom name="viewstore.adm" size="327680" crc="c6a08aba" sha1="a8041767230cc029f0d48e9b7aa5bb8131817441" offset="0" />
diff --git a/hash/pv1000.xml b/hash/pv1000.xml
index 1355fa63d72..bd1e69893c2 100644
--- a/hash/pv1000.xml
+++ b/hash/pv1000.xml
@@ -115,7 +115,7 @@ Undumped carts:
</dataarea>
</part>
</software>
-
+
<software name="fightbug" supported="no">
<description>Fighting Bug</description>
<year>1982</year>
diff --git a/hash/r9751.xml b/hash/r9751.xml
new file mode 100644
index 00000000000..8beb20bf171
--- /dev/null
+++ b/hash/r9751.xml
@@ -0,0 +1,150 @@
+<?xml version="1.0"?>
+<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
+<!--
+ ROLM 9751 CBX Software
+
+ Releases known: 9004, 9005
+
+ 9005.6.84 - Last software release (1998)
+ Install disks (7) - MN 19584
+ Disktool - MN 19584
+ Mini Patch Volume MPV4-84 - MN 19274, 19584-36, 19684-35
+ Additional fixes up to year 2000
+ RPDN Loadware Version 6 - MN 19293-35
+
+ 9005.6.82 (1995)
+ Install disks (7) - MN 19582
+ Disktool (missing)
+ Mini Patch Volume 2 - MN 19270
+ Additional fixes up to year 1996
+ RPDN Loadware Version 3.0 - MN 19293-35 PN 51D0553
+-->
+
+<!-- System Software -->
+<softwarelist name="r9751" description="ROLM CBX 9751 floppy disk images">
+ <software name="cbxr5684">
+ <description>Siemens ROLM 9751 CBX 9005.6.84</description>
+ <year>1998</year>
+ <publisher>Siemens Rolm Communications Inc</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="1474560">
+ <rom name="Siemens.9751.CBX.Release.9005.6.84.Disk1.img" size="1474560" crc="b5d349b5" sha1="9e7e4f13723f54eed7bcbabd6c4fe5670ee1aa96" offset="0" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="1474560">
+ <rom name="Siemens.9751.CBX.Release.9005.6.84.Disk2.img" size="1474560" crc="3f18aa3d" sha1="8d8558833465dee0d4768696e50ab8cc48b2eec8" offset="0" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 3" />
+ <dataarea name="flop" size="1474560">
+ <rom name="Siemens.9751.CBX.Release.9005.6.84.Disk3.img" size="1474560" crc="2c0226e2" sha1="08fca05de78e6325881deb3f062235a7bcc4ea10" offset="0" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 4" />
+ <dataarea name="flop" size="1474560">
+ <rom name="Siemens.9751.CBX.Release.9005.6.84.Disk4.img" size="1474560" crc="685be02e" sha1="2ffe5c1c9c73ae1fbaffbe957c6bd2fa09471338" offset="0" />
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 5" />
+ <dataarea name="flop" size="1474560">
+ <rom name="Siemens.9751.CBX.Release.9005.6.84.Disk5.img" size="1474560" crc="e2ffdece" sha1="86bae983f7c9a763f5cfc8de172fa871f2ae84db" offset="0" />
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 6" />
+ <dataarea name="flop" size="1474560">
+ <rom name="Siemens.9751.CBX.Release.9005.6.84.Disk6.img" size="1474560" crc="b1aef71e" sha1="2d6bacfa45a2f35998a69b7b4b7212076ffd6523" offset="0" />
+ </dataarea>
+ </part>
+ <part name="flop7" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 7" />
+ <dataarea name="flop" size="1474560">
+ <rom name="Siemens.9751.CBX.Release.9005.6.84.Disk7.img" size="1474560" crc="fd12e3e4" sha1="031bfab7d525bf9584eb32c3da41d5d567616cda" offset="0" />
+ </dataarea>
+ </part>
+ <part name="flop8" interface="floppy_3_5">
+ <feature name="part_id" value="Disktool" />
+ <dataarea name="flop" size="1474560">
+ <rom name="Siemens.9751.CBX.Release.9005.6.84.Disktool.img" size="1474560" crc="99746f7c" sha1="84dcdc0fe5645e3ae72d5209a9c2b4368859eaa9" offset="0" />
+ </dataarea>
+ </part>
+ <part name="flop9" interface="floppy_3_5">
+ <feature name="part_id" value="Mini Patch Volume MPV4-84" />
+ <dataarea name="flop" size="1474560">
+ <rom name="Siemens.9751.CBX.Release.9005.6.84.Mini.Patch.Volume.MPV4-84.img" size="1474560" crc="b73fd1ee" sha1="9d374ca33bd731334ba32c2febc206134a45bcb1" offset="0" />
+ </dataarea>
+ </part>
+ <part name="flop10" interface="floppy_3_5">
+ <feature name="part_id" value="RPDN Loadware" />
+ <dataarea name="flop" size="1474560">
+ <rom name="Siemens.9751.CBX.Release.9005.6.84.RPDN.Loadware.img" size="1474560" crc="5f5a0990" sha1="95cd0a38c447eeb6096edb5f4377df2920ba9a89" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cbxr5682">
+ <description>Siemens ROLM 9751 CBX 9005.6.82</description>
+ <year>1995</year>
+ <publisher>Siemens Rolm Communications Inc</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="1474560">
+ <rom name="Siemens.9751.CBX.Release.9005.6.82.Disk1.img" size="1474560" crc="e9600226" sha1="89d18c6b16e66a6dcb74850bca972e54dc89f043" offset="0" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="1474560">
+ <rom name="Siemens.9751.CBX.Release.9005.6.82.Disk2.img" size="1474560" crc="7a8053b5" sha1="fa439bf102143114bd27501619b63d02268e9788" offset="0" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 3" />
+ <dataarea name="flop" size="1474560">
+ <rom name="Siemens.9751.CBX.Release.9005.6.82.Disk3.img" size="1474560" crc="03b4d15a" sha1="1cbdea2407ae1ff1eaa8c08ecadd92cca39a5f00" offset="0" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 4" />
+ <dataarea name="flop" size="1474560">
+ <rom name="Siemens.9751.CBX.Release.9005.6.82.Disk4.img" size="1474560" crc="28377232" sha1="81a1bd74dff32381aefe12faffdf08d4e6532f67" offset="0" />
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 5" />
+ <dataarea name="flop" size="1474560">
+ <rom name="Siemens.9751.CBX.Release.9005.6.82.Disk5.img" size="1474560" crc="8a8eb36e" sha1="e31ac428d4775d22fbf911f3abb8cf7a416159c1" offset="0" />
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 6" />
+ <dataarea name="flop" size="1474560">
+ <rom name="Siemens.9751.CBX.Release.9005.6.82.Disk6.img" size="1474560" crc="b2bd782f" sha1="dcd982467132c32ed04a53fe1327272cf1ba8320" offset="0" />
+ </dataarea>
+ </part>
+ <part name="flop7" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 7" />
+ <dataarea name="flop" size="1474560">
+ <rom name="Siemens.9751.CBX.Release.9005.6.82.Disk7.img" size="1474560" crc="1695649f" sha1="dd5a9e5af910237f9a4b7e12d5fade15d1e1ceeb" offset="0" />
+ </dataarea>
+ </part>
+ <part name="flop8" interface="floppy_3_5">
+ <feature name="part_id" value="Mini Patch Volume 2" />
+ <dataarea name="flop" size="1474560">
+ <rom name="Siemens.9751.CBX.Release.9005.6.82.Mini.Patch.Volume.2.img" size="1474560" crc="65d5021d" sha1="57a11686805f3873a4dde231a260943f2e2ab1b3" offset="0" />
+ </dataarea>
+ </part>
+ <part name="flop9" interface="floppy_3_5">
+ <feature name="part_id" value="RPDN Loadware Version 3.0" />
+ <dataarea name="flop" size="1474560">
+ <rom name="Siemens.9751.CBX.Release.9005.6.82.RPDN.Loadware.img" size="1474560" crc="f082df1f" sha1="ccfce632a2433b6c5ad6cd75130e999ce98daaea" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+</softwarelist>
diff --git a/hash/saturn.xml b/hash/saturn.xml
index 73636feb6a2..c7fed414bbe 100644
--- a/hash/saturn.xml
+++ b/hash/saturn.xml
@@ -38970,7 +38970,19 @@ Olympic Soccer (Fra) T-7904H-09
</part>
</software>
-
+ <!-- input / output cue/bin verified identical as of CHDMAN change made around 28th Dec 2015, except for
+ the 'ISRC 904002100272' metadata line after 'TRACK 24 AUDIO' being ommitted from the cuesheet, we don't
+ store that information -->
+ <software name="raymanp" supported="no"> <!-- the header lists 19950424, but elsewhere there are date stamps of 19950720 -->
+ <description>Rayman (Prototype 19950720)</description>
+ <year>1995</year>
+ <publisher>Ubi Soft</publisher>
+ <part name="cdrom" interface="sat_cdrom">
+ <diskarea name="cdrom">
+ <disk name="rayman (prototype 19950720)" sha1="6072f577a950aded8d0a634cb0dc962ed639a520" />
+ </diskarea>
+ </part>
+ </software>
</softwarelist>
diff --git a/hash/snotec.xml b/hash/snotec.xml
new file mode 100644
index 00000000000..2873bd4f522
--- /dev/null
+++ b/hash/snotec.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0"?>
+<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
+<softwarelist name="snotec" description="Bandai Super Note Club cartridges">
+
+ <software name="conan2">
+ <description>Detective Conan 2</description>
+ <year>1996</year>
+ <publisher>Bandai</publisher>
+ <part name="rom" interface="genius_cart">
+ <dataarea name="rom" size="0x40000">
+ <rom name="SNC_Conan2.ic" size="0x40000" crc="47a3ce5e" sha1="2f9653ef01026d8a8f8c3036bda533336ebc7e0a" offset="0" />
+ </dataarea>
+ <dataarea name="eeprom" size="0x4000">
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tamago">
+ <description>Tamagotchi</description>
+ <year>1997</year>
+ <publisher>Bandai</publisher>
+ <part name="rom" interface="genius_cart">
+ <dataarea name="rom" size="0x40000">
+ <rom name="SNC_Tamago.ic1" size="0x40000" crc="3900e281" sha1="8b2faf3961e4a873a513f426056da188af37b2b5" offset="0" />
+ </dataarea>
+ <dataarea name="eeprom" size="0x4000">
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="angelmt">
+ <!-- cartridge also include a LCD-Game -->
+ <description>Angel Mail Town</description>
+ <year>1999</year>
+ <publisher>Bandai</publisher>
+ <part name="rom" interface="genius_cart">
+ <dataarea name="rom" size="0x80000">
+ <rom name="SNCVC-MAIL.IC3" size="0x80000" crc="a3246a56" sha1="616b060cab85076571c47edf30f312535196e41a" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="catdog">
+ <description>Cats and Dogs</description>
+ <year>1995</year>
+ <publisher>Bandai</publisher>
+ <part name="rom" interface="genius_cart">
+ <dataarea name="rom" size="0x40000">
+ <rom name="SNC-PET1.IC1" size="0x40000" crc="1ba10001" sha1="6ab6e9d79d6f60dc07c951ec94369e6059351744" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="conan3">
+ <description>Detective Conan 3</description>
+ <year>1999</year>
+ <publisher>Bandai</publisher>
+ <part name="rom" interface="genius_cart">
+ <dataarea name="rom" size="0x80000">
+ <rom name="SNC-CONAN3.IC1" size="0x80000" crc="f93d6149" sha1="b624db8fd47cae79357de4d60d41d88ebe1f089d" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="notepadn">
+ <description>Notepad</description>
+ <year>1995</year>
+ <publisher>Bandai</publisher>
+ <part name="rom" interface="genius_cart">
+ <dataarea name="rom" size="0x40000">
+ <rom name="BANDAIP1.IC1" size="0x40000" crc="dc8bd361" sha1="d88498321c3038afd6b917005860bd118fe31aa2" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+</softwarelist>
diff --git a/hash/supracan.xml b/hash/supracan.xml
index 5d93a88ddba..1b78e31a3de 100644
--- a/hash/supracan.xml
+++ b/hash/supracan.xml
@@ -1,7 +1,20 @@
<?xml version="1.0"?>
<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
<softwarelist name="supracan" description="Funtech Super A'Can cartridges">
- <!-- F001 - ç¦çˆ¾æ‘©æ²™å¤§å°æ±º (Formosa Da Dui Jue) - aka Formosa Duel -->
+
+
+ <!-- appears to work, but gameplay logic is broken, attack pieces don't drop down, game can get stuck, can sometimes rotate pieces through other pieces too! -->
+ <software name="formduel" supported="no"> <!-- F001 - ç¦çˆ¾æ‘©æ²™å¤§å°æ±º (Formosa Da Dui Jue) - aka Formosa Duel -->
+ <description>Formosa Duel</description>
+ <year>1995</year>
+ <publisher>AV Artisan Corp.</publisher>
+ <info name="serial" value="F001" />
+ <part name="cart" interface="supracan_cart">
+ <dataarea name="rom" width="16" endianness="big" size="0x100000">
+ <rom loadflag="load16_word_swap" name="Formosa Duel (Taiwan).bin" size="0x100000" crc="b2bf31dc" sha1="8d0680e1322af21b20d5cee2c100b05cf4217815" offset="0" />
+ </dataarea>
+ </part>
+ </software>
<software name="sangofgt">
<description>Sango Fighter ~ Wu Jiang Zheng Ba - San Guo Zhi</description>
diff --git a/hash/tutor.xml b/hash/tutor.xml
index 538b14e7c13..ffc8b89e6dd 100644
--- a/hash/tutor.xml
+++ b/hash/tutor.xml
@@ -1,7 +1,7 @@
<?xml version="1.0"?>
<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
-<!-- Tomy Tutor ant Pyuuta Cartridges
+<!-- Tomy Tutor and Pyuuta Cartridges
Here's a list of known software packages and peripherals. There are 50 documented cartridges, counting both Japanese and American domestic releases; however, some are Japan-only, and a few are verifiably vapourware or were never otherwise released.
Info Taken from: http://www.floodgap.com/retrobits/tomy/carts.html
@@ -21,14 +21,14 @@ Japanese Releases - Pyuuta
011E Mystery Gold ~ ミステリー ゴールド [dumped]
012E DonPan ~ ドンãƒãƒ³ [dumped]
013E Mickey Athletic Land ~ ミッキー アスレãƒãƒƒã‚¯ãƒ©ãƒ³ãƒ‰ [dumped]
-014E Pooyan ~ プーヤン
-015E Jungler ~ ジャングラー
-016E Guttang Gottong ~ ガッタンゴットン
+014E Pooyan ~ プーヤン [dumped]
+015E Jungler ~ ジャングラー [dumped]
+016E Guttang Gottong ~ ガッタンゴットン [dumped]]
017E Maze Patrol ~ メイズ パトロール [dumped]
-018E Tron ~ トロン
+018E Tron ~ トロン [dumped]
019E Mr. Do! ~ Mr.DO! [dumped]
020E Bermuda Triangle ~ ãƒãƒŸãƒ¥ãƒ¼ãƒ€ãƒ» トライアングル [dumped]
-021E 4-nin Mahjan ~ 四人麻雀
+021E 4-nin Mahjan ~ 四人麻雀 [dumped]
022E Triplecommand ~ トリプルコマンド [dumped]
023E SuperBike ~ スーパーãƒã‚¤ã‚¯
024E Rescue Copter [3D] ~ レスキュー コプター [dumped]
@@ -80,9 +80,22 @@ Battlefighter (Original) (Unreleased - Prototype Stage)
<softwarelist name="tutor" description="Tomy Tutor &amp; Pyuuta cartridges">
+ <software name="4ninmj">
+ <description>4-nin Mahjan (Jpn)</description>
+ <year>1984</year>
+ <publisher>Tomy</publisher>
+ <info name="alt_title" value="四人麻雀 "/>
+ <info name="serial" value="021E"/>
+ <part name="cart" interface="tutor_cart">
+ <dataarea name="rom" size="0x4000">
+ <rom name="Yonnin Majan.bin" size="0x4000" crc="1c2eb2f0" sha1="4e9a0ce55f479c4b1a5fee9320561ce93765c4d7" offset="0" /> <!-- needs splitting into 2 files? there are 2 roms, marked 1 and 2 in the cart?? -->
+ </dataarea>
+ </part>
+ </software>
+
<software name="baseball">
<description>Baseball (Jpn)</description>
- <year>198?</year>
+ <year>1984</year>
<publisher>Tomy</publisher>
<info name="alt_title" value="ベースボール"/>
<info name="serial" value="025E"/>
@@ -93,19 +106,6 @@ Battlefighter (Original) (Unreleased - Prototype Stage)
</part>
</software>
- <software name="bermudat">
- <description>Bermuda Triangle (Jpn)</description>
- <year>198?</year>
- <publisher>Tomy</publisher>
- <info name="alt_title" value="ãƒãƒŸãƒ¥ãƒ¼ãƒ€ãƒ» トライアングル"/>
- <info name="serial" value="020E"/>
- <part name="cart" interface="tutor_cart">
- <dataarea name="rom" size="8192">
- <rom name="bermudatriangle.bin" size="8192" crc="95577ceb" sha1="4b75c4bdd2285eff5ed0df3a951d8527270e6b96" offset="0" />
- </dataarea>
- </part>
- </software>
-
<software name="bombman">
<description>Bombman (Jpn)</description>
<year>1982</year>
@@ -131,15 +131,17 @@ Battlefighter (Original) (Unreleased - Prototype Stage)
</part>
</software>
+ <!-- Crawlers and Maze Patrol are confirmed as using the exact same ROM data -->
<software name="crawlers">
<!-- Stock No: 8100, Clone of Maze Patrol (Japanese 017E)-->
- <description>Cave Crawlers (USA)</description>
+ <description>Cave Crawlers (USA) / Maze Patrol (Jpn)</description>
<year>1983</year>
<publisher>Tomy</publisher>
- <info name="serial" value="8100"/>
+ <info name="alt_title" value="メイズ パトロール"/>
+ <info name="serial" value="8100 / 017E"/>
<part name="cart" interface="tutor_cart">
<dataarea name="rom" size="8192">
- <rom name="crawlers.bin" size="8192" crc="f3059779" sha1="fd51c445f0356ed3796bdbbd4a7f6086d7bb5331" offset="0" />
+ <rom name="tomy 36.7.u1" size="8192" crc="f3059779" sha1="fd51c445f0356ed3796bdbbd4a7f6086d7bb5331" offset="0" />
</dataarea>
</part>
</software>
@@ -194,7 +196,18 @@ Battlefighter (Original) (Unreleased - Prototype Stage)
</part>
</software>
- <software name="jungler">
+ <software name="tron" cloneof="hyperspc">
+ <description>Tron (Jpn)</description>
+ <year>1983</year>
+ <publisher>Tomy / Walt Disney Productions</publisher>
+ <part name="cart" interface="tutor_cart">
+ <dataarea name="rom" size="8192">
+ <rom name="tron.bin" size="8192" crc="280f191d" sha1="0d8b5c43db89a438f6036794be7628793643818b" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="jungler"> <!-- US and Japan confirmed to be the same -->
<!-- Stock No: 8202, (Japanese 015E)-->
<description>Jungler</description>
<year>1981</year>
@@ -206,9 +219,9 @@ Battlefighter (Original) (Unreleased - Prototype Stage)
</part>
</software>
- <software name="locomotn">
+ <software name="locomotn"> <!-- US and Japan confirmed to be the same -->
<!-- Stock No: 8203, Clone of Guttang Gottong (Japanese 016E)-->
- <description>Loco-motion (USA)</description>
+ <description>Loco-motion (USA) / Guttang Gottong (Jpn)</description>
<year>1983</year>
<publisher>Tomy</publisher>
<info name="serial" value="8203"/>
@@ -232,19 +245,6 @@ Battlefighter (Original) (Unreleased - Prototype Stage)
</part>
</software>
- <software name="mazeptrl">
- <description>Maze Patrol (Jpn)</description>
- <year>1983</year>
- <publisher>Tomy</publisher>
- <info name="alt_title" value="メイズ パトロール"/>
- <info name="serial" value="017E"/>
- <part name="cart" interface="tutor_cart">
- <dataarea name="rom" size="8192">
- <rom name="tomy 36.7.u1" size="8192" crc="f3059779" sha1="fd51c445f0356ed3796bdbbd4a7f6086d7bb5331" offset="0" />
- </dataarea>
- </part>
- </software>
-
<software name="athland">
<description>Mickey Athletic Land (Jpn)</description>
<year>198?</year>
@@ -323,7 +323,7 @@ Battlefighter (Original) (Unreleased - Prototype Stage)
</part>
</software>
- <software name="pooyan">
+ <software name="pooyan"> <!-- US and Japan confirmed to be the same -->
<!-- Stock No: 8200, (Japanese 014E)-->
<description>Pooyan</description>
<year>1982</year>
@@ -386,12 +386,14 @@ Battlefighter (Original) (Unreleased - Prototype Stage)
</part>
</software>
+ <!-- Torpedo and Bermuda Triangle are confirmed as using the exact same ROM data -->
<software name="torpedo">
<!-- Stock No: 8101, Clone of Bermuda Triangle (Japanese 020E)-->
- <description>Torpedo Terror</description>
+ <description>Torpedo Terror (USA) / Bermuda Triangle (Jpn)</description>
<year>1983</year>
<publisher>Tomy</publisher>
- <info name="serial" value="8101"/>
+ <info name="alt_title" value="ãƒãƒŸãƒ¥ãƒ¼ãƒ€ãƒ» トライアングル"/>
+ <info name="serial" value="8101 / 020E"/>
<part name="cart" interface="tutor_cart">
<dataarea name="rom" size="8192">
<rom name="torpedo.bin" size="8192" crc="95577ceb" sha1="4b75c4bdd2285eff5ed0df3a951d8527270e6b96" offset="0" />
diff --git a/hash/x1_cass.xml b/hash/x1_cass.xml
index b9c15c36420..8dd9c2ef93d 100644
--- a/hash/x1_cass.xml
+++ b/hash/x1_cass.xml
@@ -207,6 +207,19 @@ Titles, publishers and release dates taken from:
</part>
</software>
+ <!-- This is supposed to work on a regular X1, but in MAME only the x1turbo drivers can load it -->
+ <software name="fantsian">
+ <description>Fantasian</description>
+ <year>1985</year>
+ <publisher>クリスタルソフト (Xtal Soft)</publisher>
+ <info name="alt_title" value="ファンタジアン"/>
+ <part name="cass" interface="x1_cass">
+ <dataarea name="side1" size="24382972">
+ <rom name="fantsian.wav" size="24382972" crc="1f65588a" sha1="1657223787a45e81a7bf0bcfc9bbe5c19fbb54b1" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="firecrys">
<description>The Fire Crystal</description>
<year>1986</year>
@@ -443,6 +456,20 @@ Titles, publishers and release dates taken from:
</part>
</software>
+ <software name="pinball">
+ <description>Pinball</description>
+ <year>1982</year>
+ <publisher>ãƒãƒ‰ã‚½ãƒ³ (Hudson Soft)</publisher>
+ <info name="alt_title" value="ピンボール"/>
+ <info name="usage" value="In BASIC, type LOAD and then RUN"/>
+ <sharedfeat name="requirement" value="x1_flop:tapbas"/>
+ <part name="cass" interface="x1_cass">
+ <dataarea name="side1" size="12021244">
+ <rom name="pinball.wav" size="12021244" crc="0ecdd227" sha1="2b521b68a1e302ee508d72c7ef16b5ebc41edc7a" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="plazmali" supported="no">
<description>Plazma Line</description>
<year>1985</year>
diff --git a/makefile b/makefile
index 757e26889a4..7818353125d 100644
--- a/makefile
+++ b/makefile
@@ -25,6 +25,8 @@
# USE_BGFX = 1
# NO_OPENGL = 1
# USE_DISPATCH_GL = 0
+# MODERN_WIN_API = 0
+# USE_XAUDIO2 = 0
# DIRECTINPUT = 7
# USE_SDL = 1
# SDL_INI_PATH = .;$HOME/.mame/;ini;
@@ -82,7 +84,6 @@
# OPENMP = 1
# FASTDEBUG = 1
-# FILTER_DEPS = 1
# SEPARATE_BIN = 1
# PYTHON_EXECUTABLE = python3
# SHADOW_CHECK = 1
@@ -115,9 +116,28 @@ MAKEPARAMS := -R
ifeq ($(OS),Windows_NT)
OS := windows
GENIEOS := windows
+PLATFORM := x86
else
UNAME := $(shell uname -mps)
+UNAME_M := $(shell uname -m)
+UNAME_P := $(shell uname -p)
GENIEOS := linux
+PLATFORM := unknown
+ifneq ($(filter x86_64,$(UNAME_P)),)
+PLATFORM := x86
+endif
+ifneq ($(filter %86,$(UNAME_P)),)
+PLATFORM := x86
+endif
+ifneq ($(filter arm%,$(UNAME_M)),)
+PLATFORM := arm
+endif
+ifneq ($(filter arm%,$(UNAME_P)),)
+PLATFORM := arm
+endif
+ifneq ($(filter powerpc,$(UNAME_P)),)
+PLATFORM := powerpc
+endif
ifeq ($(firstword $(filter Linux,$(UNAME))),Linux)
OS := linux
endif
@@ -162,10 +182,10 @@ endif
endif
#-------------------------------------------------
-# specify core target: mame, mess, etc.
-# specify subtarget: mame, mess, tiny, etc.
-# build rules will be included from
-# src/$(TARGET)/$(SUBTARGET).mak
+# specify core target: mame, ldplayer
+# specify subtarget: mame, arcade, mess, tiny, etc.
+# build scripts will be run from
+# scripts/target/$(TARGET)/$(SUBTARGET).lua
#-------------------------------------------------
ifndef TARGET
@@ -293,8 +313,8 @@ LD := $(SILENT)g++
#-------------------------------------------------
# specify OSD layer: windows, sdl, etc.
-# build rules will be included from
-# src/osd/$(OSD)/$(OSD).mak
+# build scripts will be run from
+# scripts/src/osd/$(OSD).lua
#-------------------------------------------------
ifndef OSD
@@ -438,9 +458,12 @@ endif
# set the symbols level
ifdef SYMBOLS
ifndef SYMLEVEL
+SYMLEVEL = 1
+ifdef SOURCES
SYMLEVEL = 2
endif
endif
+endif
ifdef TOOLS
PARAMS += --with-tools
@@ -546,6 +569,14 @@ ifdef USE_QTDEBUG
PARAMS += --USE_QTDEBUG='$(USE_QTDEBUG)'
endif
+ifdef MODERN_WIN_API
+PARAMS += --MODERN_WIN_API='$(MODERN_WIN_API)'
+endif
+
+ifdef USE_XAUDIO2
+PARAMS += --USE_XAUDIO2='$(USE_XAUDIO2)'
+endif
+
ifdef DIRECTINPUT
PARAMS += --DIRECTINPUT='$(DIRECTINPUT)'
endif
@@ -618,10 +649,6 @@ ifdef FASTDEBUG
PARAMS += --FASTDEBUG='$(FASTDEBUG)'
endif
-ifdef FILTER_DEPS
-PARAMS += --FILTER_DEPS='$(FILTER_DEPS)'
-endif
-
ifdef SEPARATE_BIN
PARAMS += --SEPARATE_BIN='$(SEPARATE_BIN)'
endif
@@ -650,6 +677,10 @@ ifdef FORCE_VERSION_COMPILE
PARAMS += --FORCE_VERSION_COMPILE='$(FORCE_VERSION_COMPILE)'
endif
+ifdef PLATFORM
+PARAMS += --PLATFORM='$(PLATFORM)'
+endif
+
#-------------------------------------------------
# All scripts
#-------------------------------------------------
@@ -728,11 +759,25 @@ SRC = src
# all 3rd party sources are under the 3rdparty/ directory
3RDPARTY = 3rdparty
+ifeq ($(SUBTARGET),mame)
+PROJECT_NAME := $(SUBTARGET)
+else ifeq ($(SUBTARGET),mess)
+PROJECT_NAME := $(SUBTARGET)
+else
+PROJECT_NAME := $(TARGET)$(SUBTARGET)
+endif
+
ifeq ($(OS),windows)
+ifeq (posix,$(SHELLTYPE))
+GCC_VERSION := $(shell $(subst @,,$(CC)) -dumpversion 2> /dev/null)
+CLANG_VERSION := $(shell $(subst @,,$(CC)) --version 2> /dev/null| head -n 1 | grep clang | sed "s/^.*[^0-9]\([0-9]*\.[0-9]*\.[0-9]*\).*$$/\1/" | head -n 1)
+PYTHON_AVAILABLE := $(shell $(PYTHON) --version > /dev/null 2>&1 && echo python)
+else
GCC_VERSION := $(shell $(subst @,,$(CC)) -dumpversion 2> NUL)
CLANG_VERSION := $(shell $(subst @,,$(CC)) --version 2> NUL| head -n 1 | grep clang | sed "s/^.*[^0-9]\([0-9]*\.[0-9]*\.[0-9]*\).*$$/\1/" | head -n 1)
PYTHON_AVAILABLE := $(shell $(PYTHON) --version > NUL 2>&1 && echo python)
+endif
ifdef MSBUILD
MSBUILD_PARAMS := /v:minimal /m:$(NUMBER_OF_PROCESSORS)
ifeq ($(CONFIG),debug)
@@ -745,13 +790,6 @@ MSBUILD_PARAMS += /p:Platform=x64
else
MSBUILD_PARAMS += /p:Platform=win32
endif
-ifeq ($(SUBTARGET),mame)
-MSBUILD_SOLUTION := $(SUBTARGET).sln
-else ifeq ($(SUBTARGET),mess)
-MSBUILD_SOLUTION := $(SUBTARGET).sln
-else
-MSBUILD_SOLUTION := $(TARGET)$(SUBTARGET).sln
-endif
endif
else
GCC_VERSION := $(shell $(subst @,,$(CC)) -dumpversion 2> /dev/null)
@@ -799,7 +837,11 @@ endif
.PHONY: windows_x64
windows_x64: generate $(PROJECTDIR)/gmake-mingw64-gcc/Makefile
- $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-mingw64-gcc config=$(CONFIG)64 WINDRES=$(WINDRES)
+ifndef MINGW64
+ $(error MINGW64 is not set)
+endif
+ $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-mingw64-gcc config=$(CONFIG)64 WINDRES=$(WINDRES) precompile
+ $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-mingw64-gcc config=$(CONFIG)64 WINDRES=$(WINDRES)
#-------------------------------------------------
# gmake-mingw32-gcc
@@ -816,6 +858,10 @@ endif
.PHONY: windows_x86
windows_x86: generate $(PROJECTDIR)/gmake-mingw32-gcc/Makefile
+ifndef MINGW32
+ $(error MINGW32 is not set)
+endif
+ $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-mingw32-gcc config=$(CONFIG)32 WINDRES=$(WINDRES) precompile
$(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-mingw32-gcc config=$(CONFIG)32 WINDRES=$(WINDRES)
#-------------------------------------------------
@@ -823,35 +869,34 @@ windows_x86: generate $(PROJECTDIR)/gmake-mingw32-gcc/Makefile
#-------------------------------------------------
$(PROJECTDIR)/gmake-mingw-clang/Makefile: makefile $(SCRIPTS) $(GENIE)
-ifndef CLANG
- $(error CLANG is not set)
-endif
$(SILENT) $(GENIE) $(PARAMS) --gcc=mingw-clang --gcc_version=$(CLANG_VERSION) gmake
.PHONY: windows_x64_clang
windows_x64_clang: generate $(PROJECTDIR)/gmake-mingw-clang/Makefile
+ $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-mingw-clang config=$(CONFIG)64 WINDRES=$(WINDRES) precompile
$(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-mingw-clang config=$(CONFIG)64 WINDRES=$(WINDRES)
.PHONY: windows_x86_clang
windows_x86_clang: generate $(PROJECTDIR)/gmake-mingw-clang/Makefile
+ $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-mingw-clang config=$(CONFIG)32 WINDRES=$(WINDRES) precompile
$(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-mingw-clang config=$(CONFIG)32 WINDRES=$(WINDRES)
vs2013: generate
$(SILENT) $(GENIE) $(PARAMS) vs2013
ifdef MSBUILD
- $(SILENT) msbuild $(PROJECTDIR)/vs2013/$(MSBUILD_SOLUTION) $(MSBUILD_PARAMS)
+ $(SILENT) msbuild $(PROJECTDIR)/vs2013/$(PROJECT_NAME).sln $(MSBUILD_PARAMS)
endif
vs2013_intel: generate
$(SILENT) $(GENIE) $(PARAMS) --vs=intel-15 vs2013
ifdef MSBUILD
- $(SILENT) msbuild $(PROJECTDIR)/vs2013-intel/$(MSBUILD_SOLUTION) $(MSBUILD_PARAMS)
+ $(SILENT) msbuild $(PROJECTDIR)/vs2013-intel/$(PROJECT_NAME).sln $(MSBUILD_PARAMS)
endif
vs2013_xp: generate
$(SILENT) $(GENIE) $(PARAMS) --vs=vs2013-xp vs2013
ifdef MSBUILD
- $(SILENT) msbuild $(PROJECTDIR)/vs2013-xp/$(MSBUILD_SOLUTION) $(MSBUILD_PARAMS)
+ $(SILENT) msbuild $(PROJECTDIR)/vs2013-xp/$(PROJECT_NAME).sln $(MSBUILD_PARAMS)
endif
vs2013_clang: generate
@@ -863,19 +908,19 @@ vs2013_winrt: generate
vs2015: generate
$(SILENT) $(GENIE) $(PARAMS) vs2015
ifdef MSBUILD
- $(SILENT) msbuild $(PROJECTDIR)/vs2015/$(MSBUILD_SOLUTION) $(MSBUILD_PARAMS)
+ $(SILENT) msbuild $(PROJECTDIR)/vs2015/$(PROJECT_NAME).sln $(MSBUILD_PARAMS)
endif
vs2015_intel: generate
$(SILENT) $(GENIE) $(PARAMS) --vs=intel-15 vs2015
ifdef MSBUILD
- $(SILENT) msbuild $(PROJECTDIR)/vs2015-intel/$(MSBUILD_SOLUTION) $(MSBUILD_PARAMS)
+ $(SILENT) msbuild $(PROJECTDIR)/vs2015-intel/$(PROJECT_NAME).sln $(MSBUILD_PARAMS)
endif
vs2015_xp: generate
$(SILENT) $(GENIE) $(PARAMS) --vs=vs2015-xp vs2015
ifdef MSBUILD
- $(SILENT) msbuild $(PROJECTDIR)/vs2015-xp/$(MSBUILD_SOLUTION) $(MSBUILD_PARAMS)
+ $(SILENT) msbuild $(PROJECTDIR)/vs2015-xp/$(PROJECT_NAME).sln $(MSBUILD_PARAMS)
endif
vs2015_clang: generate
@@ -925,7 +970,7 @@ ifndef EMSCRIPTEN
$(error EMSCRIPTEN is not set)
endif
ifndef COMPILE
- $(SILENT) $(GENIE) $(PARAMS) --gcc=asmjs --gcc_version=4.8 gmake
+ $(SILENT) $(GENIE) $(PARAMS) --gcc=asmjs --gcc_version=4.9 gmake
endif
$(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-asmjs config=$(CONFIG)
@@ -977,14 +1022,17 @@ $(PROJECTDIR)/gmake-linux/Makefile: makefile $(SCRIPTS) $(GENIE)
.PHONY: linux_x64
linux_x64: generate $(PROJECTDIR)/gmake-linux/Makefile
+ $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-linux config=$(CONFIG)64 precompile
$(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-linux config=$(CONFIG)64
.PHONY: linux_x86
linux_x86: generate $(PROJECTDIR)/gmake-linux/Makefile
+ $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-linux config=$(CONFIG)32 precompile
$(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-linux config=$(CONFIG)32
.PHONY: linux
linux: generate $(PROJECTDIR)/gmake-linux/Makefile
+ $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-linux config=$(CONFIG) precompile
$(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-linux config=$(CONFIG)
#-------------------------------------------------
@@ -996,10 +1044,12 @@ $(PROJECTDIR)/gmake-linux-clang/Makefile: makefile $(SCRIPTS) $(GENIE)
.PHONY: linux_x64_clang
linux_x64_clang: generate $(PROJECTDIR)/gmake-linux-clang/Makefile
+ $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-linux-clang config=$(CONFIG)64 precompile
$(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-linux-clang config=$(CONFIG)64
.PHONY: linux_x86_clang
linux_x86_clang: generate $(PROJECTDIR)/gmake-linux-clang/Makefile
+ $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-linux-clang config=$(CONFIG)32 precompile
$(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-linux-clang config=$(CONFIG)32
#-------------------------------------------------
@@ -1011,6 +1061,7 @@ $(PROJECTDIR)/gmake-osx/Makefile: makefile $(SCRIPTS) $(GENIE)
.PHONY: macosx_x64
macosx_x64: generate $(PROJECTDIR)/gmake-osx/Makefile
+ $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-osx config=$(CONFIG)64 precompile
$(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-osx config=$(CONFIG)64
.PHONY: macosx
@@ -1018,6 +1069,7 @@ macosx: macosx_x86
.PHONY: macosx_x86
macosx_x86: generate $(PROJECTDIR)/gmake-osx/Makefile
+ $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-osx config=$(CONFIG)32 precompile
$(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-osx config=$(CONFIG)32
#-------------------------------------------------
@@ -1029,10 +1081,12 @@ $(PROJECTDIR)/gmake-osx-clang/Makefile: makefile $(SCRIPTS) $(GENIE)
.PHONY: macosx_x64_clang
macosx_x64_clang: generate $(PROJECTDIR)/gmake-osx-clang/Makefile
+ $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-osx-clang config=$(CONFIG)64 precompile
$(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-osx-clang config=$(CONFIG)64
.PHONY: macosx_x86_clang
macosx_x86_clang: generate $(PROJECTDIR)/gmake-osx-clang/Makefile
+ $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-osx-clang config=$(CONFIG)32 precompile
$(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-osx-clang config=$(CONFIG)32
xcode4: generate
@@ -1051,6 +1105,7 @@ $(PROJECTDIR)/gmake-solaris/Makefile: makefile $(SCRIPTS) $(GENIE)
.PHONY: solaris_x64
solaris_x64: generate $(PROJECTDIR)/gmake-solaris/Makefile
+ $(SILENT) $(MAKE) -C $(PROJECTDIR)/gmake-solaris config=$(CONFIG)64 precompile
$(SILENT) $(MAKE) -C $(PROJECTDIR)/gmake-solaris config=$(CONFIG)64
.PHONY: solaris
@@ -1058,6 +1113,7 @@ solaris: solaris_x86
.PHONY: solaris_x86
solaris_x86: generate $(PROJECTDIR)/gmake-solaris/Makefile
+ $(SILENT) $(MAKE) -C $(PROJECTDIR)/gmake-solaris config=$(CONFIG)32 precompile
$(SILENT) $(MAKE) -C $(PROJECTDIR)/gmake-solaris config=$(CONFIG)32
@@ -1071,6 +1127,7 @@ $(PROJECTDIR)/gmake-freebsd/Makefile: makefile $(SCRIPTS) $(GENIE)
.PHONY: freebsd_x64
freebsd_x64: generate $(PROJECTDIR)/gmake-freebsd/Makefile
+ $(SILENT) $(MAKE) -C $(PROJECTDIR)/gmake-freebsd config=$(CONFIG)64 precompile
$(SILENT) $(MAKE) -C $(PROJECTDIR)/gmake-freebsd config=$(CONFIG)64
.PHONY: freebsd
@@ -1078,6 +1135,7 @@ freebsd: freebsd_x86
.PHONY: freebsd_x86
freebsd_x86: generate $(PROJECTDIR)/gmake-freebsd/Makefile
+ $(SILENT) $(MAKE) -C $(PROJECTDIR)/gmake-freebsd config=$(CONFIG)32 precompile
$(SILENT) $(MAKE) -C $(PROJECTDIR)/gmake-freebsd config=$(CONFIG)32
@@ -1091,6 +1149,7 @@ $(PROJECTDIR)/gmake-netbsd/Makefile: makefile $(SCRIPTS) $(GENIE)
.PHONY: netbsd_x64
netbsd_x64: generate $(PROJECTDIR)/gmake-netbsd/Makefile
+ $(SILENT) $(MAKE) -C $(PROJECTDIR)/gmake-netbsd config=$(CONFIG)64 precompile
$(SILENT) $(MAKE) -C $(PROJECTDIR)/gmake-netbsd config=$(CONFIG)64
.PHONY: netbsd
@@ -1098,6 +1157,7 @@ netbsd: netbsd_x86
.PHONY: netbsd_x86
netbsd_x86: generate $(PROJECTDIR)/gmake-netbsd/Makefile
+ $(SILENT) $(MAKE) -C $(PROJECTDIR)/gmake-netbsd config=$(CONFIG)32 precompile
$(SILENT) $(MAKE) -C $(PROJECTDIR)/gmake-netbsd config=$(CONFIG)32
@@ -1114,10 +1174,37 @@ os2: os2_x86
.PHONY: os2_x86
os2_x86: generate $(PROJECTDIR)/gmake-os2/Makefile
+ $(SILENT) $(MAKE) -C $(PROJECTDIR)/gmake-os2 config=$(CONFIG)32 precompile
$(SILENT) $(MAKE) -C $(PROJECTDIR)/gmake-os2 config=$(CONFIG)32
#-------------------------------------------------
+# gmake-steamlink
+#-------------------------------------------------
+
+$(PROJECTDIR)/gmake-steamlink/Makefile: makefile $(SCRIPTS) $(GENIE)
+ifndef MARVELL_SDK_PATH
+ $(error MARVELL_SDK_PATH is not set)
+endif
+ifndef MARVELL_ROOTFS
+ $(error MARVELL_ROOTFS is not set)
+endif
+ $(SILENT) $(GENIE) $(PARAMS) --gcc=steamlink --gcc_version=$(GCC_VERSION) --USE_BGFX=0 --NO_OPENGL=1 --NO_USE_MIDI=1 --NO_X11=1 --NOASM=1 --SDL_INSTALL_ROOT=$(MARVELL_ROOTFS)/usr gmake
+
+.PHONY: steamlink
+ifndef MARVELL_SDK_PATH
+ $(error MARVELL_SDK_PATH is not set)
+endif
+ifndef MARVELL_ROOTFS
+ $(error MARVELL_ROOTFS is not set)
+endif
+steamlink: generate $(PROJECTDIR)/gmake-steamlink/Makefile
+ $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-steamlink config=$(CONFIG) precompile
+ $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-steamlink config=$(CONFIG)
+
+
+
+#-------------------------------------------------
# cmake
#-------------------------------------------------
cmake: generate
@@ -1167,7 +1254,7 @@ generate: \
$(GEN_FOLDERS) \
$(patsubst $(SRC)/%.lay,$(GENDIR)/%.lh,$(LAYOUTS))
-$(GENDIR)/%.lh: $(SRC)/%.lay scripts/build/file2str.py
+$(GENDIR)/%.lh: $(SRC)/%.lay scripts/build/file2str.py | $(GEN_FOLDERS)
@echo Converting $<...
$(SILENT)$(PYTHON) scripts/build/file2str.py $< $@ layout_$(basename $(notdir $<))
diff --git a/scripts/build/makedep.py b/scripts/build/makedep.py
index 54be719a807..eba69370621 100644
--- a/scripts/build/makedep.py
+++ b/scripts/build/makedep.py
@@ -27,7 +27,7 @@ def file_exists(root, srcfile, folder, inc_dir):
includes.extend(inc_dir)
for line in includes:
try:
- fp = open(root + line + srcfile, 'rb')
+ fp = open(root + line + srcfile, 'r')
fp.close()
return line + srcfile
except IOError:
@@ -36,7 +36,7 @@ def file_exists(root, srcfile, folder, inc_dir):
def add_c_if_exists(root, fullname):
try:
- fp = open(root + fullname, 'rb')
+ fp = open(root + fullname, 'r')
fp.close()
deps_files_included.append(fullname)
except IOError:
@@ -61,7 +61,7 @@ def add_rest_if_exists(root, srcfile,folder):
def parse_file_for_deps(root, srcfile, folder):
try:
- fp = open(root + srcfile, 'rb')
+ fp = open(root + srcfile, 'r')
except IOError:
return 1
in_comment = 0
@@ -73,11 +73,11 @@ def parse_file_for_deps(root, srcfile, folder):
while srcptr < len(line):
c = line[srcptr]
srcptr+=1
- if c==13 or c==10:
- if c==13 and line[srcptr]==10:
+ if ord(c)==13 or ord(c)==10:
+ if ord(c)==13 and ord(line[srcptr])==10:
srcptr+=1
continue
- if c==' ' or c==9:
+ if c==' ' or ord(c)==9:
continue
if in_comment==1 and c=='*' and line[srcptr]=='/' :
srcptr+=1
@@ -112,7 +112,7 @@ def parse_file_for_deps(root, srcfile, folder):
def parse_file(root, srcfile, folder):
try:
- fp = open(root + srcfile, 'rb')
+ fp = open(root + srcfile, 'r')
except IOError:
return 1
in_comment = 0
@@ -124,11 +124,11 @@ def parse_file(root, srcfile, folder):
while srcptr < len(line):
c = line[srcptr]
srcptr+=1
- if c==13 or c==10:
- if c==13 and line[srcptr]==10:
+ if ord(c)==13 or ord(c)==10:
+ if ord(c)==13 and ord(line[srcptr])==10:
srcptr+=1
continue
- if c==' ' or c==9:
+ if c==' ' or ord(c)==9:
continue
if in_comment==1 and c=='*' and line[srcptr]=='/' :
srcptr+=1
@@ -168,7 +168,7 @@ def parse_file(root, srcfile, folder):
def parse_file_for_drivers(root, srcfile):
try:
- fp = open(root + srcfile, 'rb')
+ fp = open(root + srcfile, 'r')
except IOError:
sys.stderr.write("Unable to open source file '%s'\n" % srcfile)
return 1
@@ -181,11 +181,11 @@ def parse_file_for_drivers(root, srcfile):
while srcptr < len(line):
c = line[srcptr]
srcptr+=1
- if c==13 or c==10:
- if c==13 and line[srcptr]==10:
+ if ord(c)==13 or ord(c)==10:
+ if ord(c)==13 and ord(line[srcptr])==10:
srcptr+=1
continue
- if c==' ' or c==9:
+ if c==' ' or ord(c)==9:
continue
if in_comment==1 and c=='*' and line[srcptr]=='/' :
srcptr+=1
@@ -209,7 +209,7 @@ def parse_file_for_drivers(root, srcfile):
def parse_lua_file(srcfile):
try:
- fp = open(srcfile, 'rb')
+ fp = open(srcfile, 'r')
except IOError:
sys.stderr.write("Unable to open source file '%s'\n" % srcfile)
return 1
@@ -287,9 +287,9 @@ if sys.argv[3]=='target':
sys.stdout.write(' MAME_DIR .. "src/mame",\n')
sys.stdout.write(' MAME_DIR .. "src/lib",\n')
sys.stdout.write(' MAME_DIR .. "src/lib/util",\n')
+ sys.stdout.write(' MAME_DIR .. "src/lib/netlist",\n')
sys.stdout.write(' MAME_DIR .. "3rdparty",\n')
sys.stdout.write(' GEN_DIR .. "mame/layout",\n')
- sys.stdout.write(' GEN_DIR .. "mess/layout",\n')
sys.stdout.write(' }\n')
sys.stdout.write(' if _OPTIONS["with-bundled-zlib"] then\n')
sys.stdout.write(' includedirs {\n')
diff --git a/scripts/depfilter.awk b/scripts/depfilter.awk
deleted file mode 100644
index 74f3cce9ce7..00000000000
--- a/scripts/depfilter.awk
+++ /dev/null
@@ -1,25 +0,0 @@
-function base_dir(f)
-{
- ne = split(f, s, "/")
- for(k=ne;k>=1 && s[k] != "src";k--);
- r = s[k]
- for(j=k+1;j<ne;j++)
- r = r "/" s[j]
- return r
-}
-
-{
- for(i=1; i<=NF; i++) {
- if($i != "\\") {
- ff = $i
- fd = base_dir(ff)
- if(substr(ff,length(ff)) == ":") {
- root_dir = fd
- } else if(fd != root_dir) {
- if(fd == "src/emu" || fd == "src/osd" || fd == "src/lib/util")
- $i = ""
- }
- }
- }
- print
-} \ No newline at end of file
diff --git a/scripts/genie.lua b/scripts/genie.lua
index 5ca87cf7c16..2fcfb323653 100644
--- a/scripts/genie.lua
+++ b/scripts/genie.lua
@@ -9,7 +9,7 @@ newoption {
premake.check_paths = true
premake.make.override = { "TARGET" }
MAME_DIR = (path.getabsolute("..") .. "/")
-MAME_DIR = string.gsub(MAME_DIR, "(%s)", "\\%1")
+--MAME_DIR = string.gsub(MAME_DIR, "(%s)", "\\%1")
local MAME_BUILD_DIR = (MAME_DIR .. _OPTIONS["build-dir"] .. "/")
local naclToolchain = ""
@@ -53,6 +53,10 @@ function layoutbuildtask(_folder, _name)
{ MAME_DIR .. "scripts/build/file2str.py" }, {"@echo Converting src/".._folder.."/".._name..".lay...", PYTHON .. " $(1) $(<) $(@) layout_".._name }};
end
+function precompiledheaders()
+ pchheader("emu.h")
+end
+
function addprojectflags()
local version = str_to_version(_OPTIONS["gcc_version"])
if _OPTIONS["gcc"]~=nil and string.find(_OPTIONS["gcc"], "gcc") and (version >= 50100) then
@@ -104,6 +108,7 @@ newoption {
{ "os2", "OS/2 eComStation" },
{ "haiku", "Haiku" },
{ "solaris", "Solaris SunOS" },
+ { "steamlink", "Steam Link" },
},
}
@@ -324,15 +329,6 @@ newoption {
}
newoption {
- trigger = "FILTER_DEPS",
- description = "Filter dependency files.",
- allowed = {
- { "0", "Disabled" },
- { "1", "Enabled" },
- }
-}
-
-newoption {
trigger = "SEPARATE_BIN",
description = "Use separate bin folders.",
allowed = {
@@ -388,6 +384,11 @@ newoption {
}
}
+newoption {
+ trigger = "PLATFORM",
+ description = "Target machine platform (x86,arm,...)",
+}
+
if _OPTIONS["SHLIB"]=="1" then
LIBTYPE = "SharedLib"
else
@@ -451,11 +452,11 @@ language "C++"
flags {
"StaticRuntime",
- "NoPCH",
}
configuration { "vs*" }
flags {
+ "NoPCH",
"ExtraWarnings",
"NoEditAndContinue",
"EnableMinimalRebuild",
@@ -479,36 +480,6 @@ configuration { "Release", "vs*" }
configuration {}
-local AWK = ""
-if (os.is("windows")) then
- AWK_TEST = backtick("awk --version 2> NUL")
- if (AWK_TEST~='') then
- AWK = "awk"
- else
- AWK_TEST = backtick("gawk --version 2> NUL")
- if (AWK_TEST~='') then
- AWK = "gawk"
- end
- end
-else
- AWK_TEST = backtick("awk --version 2> /dev/null")
- if (AWK_TEST~='') then
- AWK = "awk"
- else
- AWK_TEST = backtick("gawk --version 2> /dev/null")
- if (AWK_TEST~='') then
- AWK = "gawk"
- end
- end
-end
-
-if (_OPTIONS["FILTER_DEPS"]=="1") and (AWK~='') then
- postcompiletasks {
- AWK .. " -f ../../../../../scripts/depfilter.awk $(@:%.o=%.d) > $(@:%.o=%.dep)",
- "mv $(@:%.o=%.dep) $(@:%.o=%.d)",
- }
-end
-
msgcompile ("Compiling $(subst ../,,$<)...")
msgcompile_objc ("Objective-C compiling $(subst ../,,$<)...")
@@ -519,6 +490,8 @@ msglinking ("Linking $(notdir $@)...")
msgarchiving ("Archiving $(notdir $@)...")
+msgprecompile ("Precompiling $(subst ../,,$<)...")
+
messageskip { "SkipCreatingMessage", "SkipBuildingMessage", "SkipCleaningMessage" }
if (_OPTIONS["SOURCES"] == nil) then
@@ -526,11 +499,8 @@ if (_OPTIONS["SOURCES"] == nil) then
error("File definition for TARGET=" .. _OPTIONS["target"] .. " SUBTARGET=" .. _OPTIONS["subtarget"] .. " does not exist")
end
dofile (path.join("target", _OPTIONS["target"],_OPTIONS["subtarget"] .. ".lua"))
-else
- OUT_STR = os.outputof( PYTHON .. " " .. MAME_DIR .. "scripts/build/makedep.py " .. MAME_DIR .. " " .. _OPTIONS["SOURCES"] .. " target " .. _OPTIONS["subtarget"])
- load(OUT_STR)()
- os.outputof( PYTHON .. " " .. MAME_DIR .. "scripts/build/makedep.py " .. MAME_DIR .. " " .. _OPTIONS["SOURCES"] .. " drivers " .. _OPTIONS["subtarget"] .. " > ".. GEN_DIR .. _OPTIONS["target"] .. "/" .. _OPTIONS["subtarget"].."/drivlist.cpp")
end
+
configuration { "gmake" }
flags {
"SingleOutputDir",
@@ -703,16 +673,11 @@ end
if _ACTION == "gmake" then
- --we compile C-only to C89 standard with GNU extensions
-if (_OPTIONS["targetos"]=="solaris") then
+ --we compile C-only to C99 standard with GNU extensions
+
buildoptions_c {
"-std=gnu99",
}
-else
- buildoptions_c {
- "-std=gnu89",
- }
-end
local version = str_to_version(_OPTIONS["gcc_version"])
if string.find(_OPTIONS["gcc"], "clang") and ((version < 30500) or (_OPTIONS["targetos"]=="macosx" and (version <= 60000))) then
@@ -726,10 +691,17 @@ if string.find(_OPTIONS["gcc"], "clang") and ((version < 30500) or (_OPTIONS["ta
"-std=c++1y",
}
else
- buildoptions_cpp {
- "-x c++",
- "-std=c++14",
- }
+ if _OPTIONS["targetos"]=="os2" then
+ buildoptions_cpp {
+ "-x c++",
+ "-std=gnu++14",
+ }
+ else
+ buildoptions_cpp {
+ "-x c++",
+ "-std=c++14",
+ }
+ end
buildoptions_objc {
"-x objective-c++",
@@ -1012,9 +984,12 @@ end
}
end
end
---ifeq ($(findstring arm,$(UNAME)),arm)
--- CCOMFLAGS += -Wno-cast-align
---endif
+
+if (_OPTIONS["PLATFORM"]=="arm") then
+ buildoptions {
+ "-Wno-cast-align",
+ }
+end
local subdir
if (_OPTIONS["target"] == _OPTIONS["subtarget"]) then
@@ -1078,6 +1053,15 @@ configuration { "linux-*" }
end
+
+configuration { "steamlink" }
+ links {
+ "dl",
+ }
+ defines {
+ "EGL_API_FB",
+ }
+
configuration { "osx*" }
links {
"pthread",
@@ -1087,6 +1071,7 @@ configuration { "mingw*" }
linkoptions {
"-static-libgcc",
"-static-libstdc++",
+ "-static",
}
links {
"user32",
@@ -1095,6 +1080,11 @@ configuration { "mingw*" }
"shlwapi",
"wsock32",
}
+configuration { "mingw-clang" }
+ linkoptions {
+ "-pthread",
+ }
+
configuration { "vs*" }
defines {
@@ -1247,6 +1237,11 @@ configuration { "winphone8* or winstore8*" }
configuration { }
+if (_OPTIONS["SOURCES"] ~= nil) then
+ OUT_STR = os.outputof( PYTHON .. " " .. MAME_DIR .. "scripts/build/makedep.py " .. MAME_DIR .. " " .. _OPTIONS["SOURCES"] .. " target " .. _OPTIONS["subtarget"])
+ load(OUT_STR)()
+ os.outputof( PYTHON .. " " .. MAME_DIR .. "scripts/build/makedep.py " .. MAME_DIR .. " " .. _OPTIONS["SOURCES"] .. " drivers " .. _OPTIONS["subtarget"] .. " > ".. GEN_DIR .. _OPTIONS["target"] .. "/" .. _OPTIONS["subtarget"].."/drivlist.cpp")
+end
group "libs"
@@ -1273,15 +1268,19 @@ findfunction("createProjects_" .. _OPTIONS["target"] .. "_" .. _OPTIONS["subtarg
group "emulator"
dofile(path.join("src", "main.lua"))
-if (_OPTIONS["target"] == _OPTIONS["subtarget"]) then
- startproject (_OPTIONS["target"])
-else
- if (_OPTIONS["subtarget"]=="mess") then
- startproject (_OPTIONS["subtarget"])
+if (_OPTIONS["SOURCES"] == nil) then
+ if (_OPTIONS["target"] == _OPTIONS["subtarget"]) then
+ startproject (_OPTIONS["target"])
else
- startproject (_OPTIONS["target"] .. _OPTIONS["subtarget"])
+ if (_OPTIONS["subtarget"]=="mess") then
+ startproject (_OPTIONS["subtarget"])
+ else
+ startproject (_OPTIONS["target"] .. _OPTIONS["subtarget"])
+ end
end
-end
+else
+ startproject (_OPTIONS["subtarget"])
+end
mainProject(_OPTIONS["target"],_OPTIONS["subtarget"])
if (_OPTIONS["STRIP_SYMBOLS"]=="1") then
diff --git a/scripts/src/3rdparty.lua b/scripts/src/3rdparty.lua
index 761257dc930..2bee6477f01 100644
--- a/scripts/src/3rdparty.lua
+++ b/scripts/src/3rdparty.lua
@@ -37,7 +37,7 @@ end
"/wd4456", -- warning C4456: declaration of 'xxx' hides previous local declaration
}
configuration { }
-
+
files {
MAME_DIR .. "3rdparty/expat/lib/xmlparse.c",
MAME_DIR .. "3rdparty/expat/lib/xmlrole.c",
@@ -59,13 +59,13 @@ project "zlib"
kind "StaticLib"
local version = str_to_version(_OPTIONS["gcc_version"])
- if _OPTIONS["gcc"]~=nil and string.find(_OPTIONS["gcc"], "clang") then
+ if _OPTIONS["gcc"]~=nil and (string.find(_OPTIONS["gcc"], "clang") or string.find(_OPTIONS["gcc"], "asmjs")) then
configuration { "gmake" }
if (version >= 30700) then
buildoptions {
"-Wno-shift-negative-value",
}
- end
+ end
end
configuration { "vs*" }
@@ -117,7 +117,7 @@ end
--------------------------------------------------
-- SoftFloat library objects
--------------------------------------------------
-
+
project "softfloat"
uuid "04fbf89e-4761-4cf2-8a12-64500cf0c5c5"
kind "StaticLib"
@@ -139,7 +139,7 @@ if _OPTIONS["vs"]=="intel-15" then
buildoptions {
"/Qwd2557", -- remark #2557: comparison between signed and unsigned operands
}
-end
+end
configuration { }
files {
@@ -159,7 +159,7 @@ project "jpeg"
configuration { "vs*" }
buildoptions {
- "/wd4100", -- warning C4100: 'xxx' : unreferenced formal parameter
+ "/wd4100", -- warning C4100: 'xxx' : unreferenced formal parameter
"/wd4127", -- warning C4127: conditional expression is constant
"/wd4244", -- warning C4244: 'argument' : conversion from 'xxx' to 'xxx', possible loss of data
}
@@ -167,7 +167,7 @@ if _OPTIONS["vs"]=="intel-15" then
buildoptions {
"/Qwd869", -- remark #869: parameter "xxx" was never referenced
}
-end
+end
configuration { }
@@ -238,7 +238,7 @@ project "flac"
buildoptions {
"/wd4127", -- warning C4127: conditional expression is constant
"/wd4244", -- warning C4244: 'argument' : conversion from 'xxx' to 'xxx', possible loss of data
- "/wd4100", -- warning C4100: 'xxx' : unreferenced formal parameter
+ "/wd4100", -- warning C4100: 'xxx' : unreferenced formal parameter
"/wd4702", -- warning C4702: unreachable code
}
if _OPTIONS["vs"]=="intel-15" then
@@ -249,7 +249,12 @@ if _OPTIONS["vs"]=="intel-15" then
"/Qwd188", -- error #188: enumerated type mixed with another type
"/Qwd869", -- remark #869: parameter "xxx" was never referenced
}
-end
+end
+
+ configuration { "mingw-clang" }
+ buildoptions {
+ "-include stdint.h"
+ }
configuration { "vs2015" }
buildoptions {
@@ -328,7 +333,7 @@ end
"/wd4456", -- warning C4456: declaration of 'xxx' hides previous local declaration
"/wd4457", -- warning C4457: declaration of 'xxx' hides function parameter
}
-
+
configuration { }
defines {
"_7ZIP_PPMD_SUPPPORT",
@@ -366,7 +371,7 @@ project "lua"
kind "StaticLib"
-- uncomment the options below to
- -- compile using c++. Do the same
+ -- compile using c++. Do the same
-- in lsqlite3.
-- In addition comment out the "extern "C""
-- in lua.hpp and do the same in luaengine.c line 47
@@ -378,6 +383,7 @@ project "lua"
buildoptions_c {
"-Wno-bad-function-cast"
}
+
configuration { "vs*" }
buildoptions {
"/wd4244", -- warning C4244: 'argument' : conversion from 'xxx' to 'xxx', possible loss of data
@@ -403,7 +409,7 @@ end
"LUA_32BITS",
}
end
-
+
configuration { }
includedirs {
@@ -454,7 +460,7 @@ end
--------------------------------------------------
-- sqlite3 lua library objects
--------------------------------------------------
-
+
project "lsqlite3"
uuid "1d84edab-94cf-48fb-83ee-b75bc697660e"
kind "StaticLib"
@@ -487,32 +493,6 @@ project "lsqlite3"
}
--------------------------------------------------
--- jsoncpp library objects
---------------------------------------------------
-
-project "jsoncpp"
- uuid "ae023ff3-d712-4e54-adc5-3b56a148650f"
- kind "StaticLib"
-
- configuration { "vs2015" }
- buildoptions {
- "/wd4456", -- warning C4456: declaration of 'xxx' hides previous local declaration
- }
-
- configuration { }
-
- includedirs {
- MAME_DIR .. "3rdparty/jsoncpp/include",
- }
-
- files {
- MAME_DIR .. "3rdparty/jsoncpp/src/lib_json/json_reader.cpp",
- MAME_DIR .. "3rdparty/jsoncpp/src/lib_json/json_value.cpp",
- MAME_DIR .. "3rdparty/jsoncpp/src/lib_json/json_writer.cpp",
-
- }
-
---------------------------------------------------
-- SQLite3 library objects
--------------------------------------------------
@@ -540,14 +520,14 @@ end
buildoptions {
"/wd4456", -- warning C4456: declaration of 'xxx' hides previous local declaration
}
-
-
+
+
configuration { "gmake" }
buildoptions_c {
"-Wno-bad-function-cast",
"-Wno-undef",
}
-
+
local version = str_to_version(_OPTIONS["gcc_version"])
if _OPTIONS["gcc"]~=nil and not string.find(_OPTIONS["gcc"], "clang") then
if (version >= 40800) then
@@ -581,7 +561,7 @@ project "portmidi"
MAME_DIR .. "3rdparty/portmidi/pm_common",
MAME_DIR .. "3rdparty/portmidi/porttime",
}
-
+
configuration { "vs*" }
buildoptions {
"/wd4100", -- warning C4100: 'xxx' : unreferenced formal parameter
@@ -602,7 +582,7 @@ end
buildoptions {
"/wd4456", -- warning C4456: declaration of 'xxx' hides previous local declaration
}
-
+
configuration { "linux*" }
defines {
"PMALSA=1",
@@ -654,11 +634,11 @@ links {
"portmidi",
}
end
-end
+end
--------------------------------------------------
-- BGFX library objects
--------------------------------------------------
-
+
if (USE_BGFX == 1) then
project "bgfx"
uuid "d3e7e119-35cf-4f4f-aba0-d3bdcd1b879a"
@@ -669,7 +649,7 @@ project "bgfx"
"/wd4324", -- warning C4324: 'xxx' : structure was padded due to __declspec(align())
"/wd4244", -- warning C4244: 'argument' : conversion from 'xxx' to 'xxx', possible loss of data
"/wd4611", -- warning C4611: interaction between '_setjmp' and C++ object destruction is non-portable
- "/wd4310", -- warning C4310: cast truncates constant value
+ "/wd4310", -- warning C4310: cast truncates constant value
}
if _OPTIONS["vs"]=="intel-15" then
buildoptions {
@@ -680,7 +660,7 @@ if _OPTIONS["vs"]=="intel-15" then
end
configuration { }
- includedirs {
+ includedirs {
MAME_DIR .. "3rdparty/bgfx/include",
MAME_DIR .. "3rdparty/bgfx/3rdparty",
MAME_DIR .. "3rdparty/bx/include",
@@ -701,7 +681,7 @@ end
includedirs {
MAME_DIR .. "3rdparty/bx/include/compat/osx",
}
-
+
configuration { "freebsd" }
includedirs {
MAME_DIR .. "3rdparty/bx/include/compat/freebsd",
@@ -713,11 +693,11 @@ end
}
configuration { "gmake" }
- buildoptions {
+ buildoptions {
"-Wno-uninitialized",
"-Wno-unused-function",
}
-
+
configuration { }
if _OPTIONS["targetos"]=="windows" then
@@ -726,10 +706,20 @@ end
buildoptions {
"-Wno-unknown-attributes",
"-Wno-missing-braces",
+ "-Wno-int-to-pointer-cast",
}
end
end
-
+
+ if _OPTIONS["targetos"]=="macosx" then
+ local version = str_to_version(_OPTIONS["gcc_version"])
+ if _OPTIONS["gcc"]~=nil and string.find(_OPTIONS["gcc"], "clang") then
+ buildoptions {
+ "-Wno-switch",
+ }
+ end
+ end
+
defines {
"__STDC_LIMIT_MACROS",
"__STDC_FORMAT_MACROS",
@@ -786,7 +776,7 @@ project "portaudio"
configuration { "vs*" }
buildoptions {
- "/wd4245", -- warning C4245: 'conversion' : conversion from 'type1' to 'type2', signed/unsigned mismatch
+ "/wd4245", -- warning C4245: 'conversion' : conversion from 'type1' to 'type2', signed/unsigned mismatch
"/wd4244", -- warning C4244: 'argument' : conversion from 'xxx' to 'xxx', possible loss of data
"/wd4100", -- warning C4100: 'xxx' : unreferenced formal parameter
"/wd4389", -- warning C4389: 'operator' : signed/unsigned mismatch
@@ -818,7 +808,7 @@ end
"-Wno-unknown-pragmas",
}
- local version = str_to_version(_OPTIONS["gcc_version"])
+ local version = str_to_version(_OPTIONS["gcc_version"])
if (_OPTIONS["gcc"]~=nil) then
if string.find(_OPTIONS["gcc"], "clang") then
buildoptions_c {
@@ -843,7 +833,7 @@ end
"/wd4204", -- warning C4204: nonstandard extension used : non-constant aggregate initializer
"/wd4701", -- warning C4701: potentially uninitialized local variable 'xxx' used
}
-
+
configuration { }
includedirs {
@@ -869,13 +859,13 @@ end
"PA_USE_DS=1",
"PA_USE_WDMKS=1",
"PA_USE_WMME=1",
- }
+ }
includedirs {
MAME_DIR .. "3rdparty/portaudio/src/os/win",
}
- configuration { }
- files {
+ configuration { }
+ files {
MAME_DIR .. "3rdparty/portaudio/src/os/win/pa_win_util.c",
MAME_DIR .. "3rdparty/portaudio/src/os/win/pa_win_waveformat.c",
MAME_DIR .. "3rdparty/portaudio/src/os/win/pa_win_hostapis.c",
@@ -887,47 +877,47 @@ end
MAME_DIR .. "3rdparty/portaudio/src/common/pa_ringbuffer.c",
MAME_DIR .. "3rdparty/portaudio/src/hostapi/wmme/pa_win_wmme.c",
}
-
+
end
if _OPTIONS["targetos"]=="linux" then
defines {
"PA_USE_ALSA=1",
"PA_USE_OSS=1",
"HAVE_LINUX_SOUNDCARD_H",
- }
+ }
includedirs {
MAME_DIR .. "3rdparty/portaudio/src/os/unix",
}
- files {
+ files {
MAME_DIR .. "3rdparty/portaudio/src/os/unix/pa_unix_hostapis.c",
MAME_DIR .. "3rdparty/portaudio/src/os/unix/pa_unix_util.c",
MAME_DIR .. "3rdparty/portaudio/src/hostapi/alsa/pa_linux_alsa.c",
MAME_DIR .. "3rdparty/portaudio/src/hostapi/oss/pa_unix_oss.c",
- }
+ }
end
if _OPTIONS["targetos"]=="macosx" then
defines {
"PA_USE_COREAUDIO=1",
- }
+ }
includedirs {
MAME_DIR .. "3rdparty/portaudio/src/os/unix",
}
- files {
+ files {
MAME_DIR .. "3rdparty/portaudio/src/os/unix/pa_unix_hostapis.c",
MAME_DIR .. "3rdparty/portaudio/src/os/unix/pa_unix_util.c",
MAME_DIR .. "3rdparty/portaudio/src/hostapi/coreaudio/pa_mac_core.c",
MAME_DIR .. "3rdparty/portaudio/src/hostapi/coreaudio/pa_mac_core_utilities.c",
MAME_DIR .. "3rdparty/portaudio/src/hostapi/coreaudio/pa_mac_core_blocking.c",
MAME_DIR .. "3rdparty/portaudio/src/common/pa_ringbuffer.c",
- }
+ }
end
-
+
else
links {
"portaudio",
}
end
-
+
--------------------------------------------------
-- GoogleTest library objects
--------------------------------------------------
@@ -942,6 +932,11 @@ project "gtest"
"-Wno-unused-variable",
}
+ configuration { "mingw-clang" }
+ buildoptions {
+ "-O0", -- crash of compiler when doing optimization
+ }
+
configuration { "vs*" }
if _OPTIONS["vs"]=="intel-15" then
buildoptions {
@@ -954,7 +949,7 @@ end
includedirs {
MAME_DIR .. "3rdparty/googletest/googletest/include",
MAME_DIR .. "3rdparty/googletest/googletest",
- }
- files {
+ }
+ files {
MAME_DIR .. "3rdparty/googletest/googletest/src/gtest-all.cc",
}
diff --git a/scripts/src/devices.lua b/scripts/src/devices.lua
index 05e8810f2df..15e53a17cfb 100644
--- a/scripts/src/devices.lua
+++ b/scripts/src/devices.lua
@@ -24,6 +24,7 @@ function devicesProject(_target, _subtarget)
}
addprojectflags()
+ precompiledheaders()
includedirs {
MAME_DIR .. "src/osd",
@@ -62,6 +63,7 @@ if (_OPTIONS["SOURCES"] == nil) then
kind (LIBTYPE)
targetsubdir(_target .."_" .. _subtarget)
addprojectflags()
+ precompiledheaders()
options {
"ArchiveSplit",
}
@@ -100,6 +102,7 @@ if #disasm_files > 0 then
kind (LIBTYPE)
targetsubdir(_target .."_" .. _subtarget)
addprojectflags()
+ precompiledheaders()
includedirs {
MAME_DIR .. "src/osd",
diff --git a/scripts/src/emu.lua b/scripts/src/emu.lua
index 7b19e397c93..01e61852d60 100644
--- a/scripts/src/emu.lua
+++ b/scripts/src/emu.lua
@@ -15,6 +15,7 @@ uuid ("e6fa15e4-a354-4526-acef-13c8e80fcacf")
kind (LIBTYPE)
addprojectflags()
+precompiledheaders()
includedirs {
MAME_DIR .. "src/osd",
@@ -48,6 +49,8 @@ files {
MAME_DIR .. "src/emu/attotime.h",
MAME_DIR .. "src/emu/audit.cpp",
MAME_DIR .. "src/emu/audit.h",
+ MAME_DIR .. "src/emu/bookkeeping.cpp",
+ MAME_DIR .. "src/emu/bookkeeping.h",
MAME_DIR .. "src/emu/cheat.cpp",
MAME_DIR .. "src/emu/cheat.h",
MAME_DIR .. "src/emu/clifront.cpp",
@@ -271,8 +274,6 @@ files {
MAME_DIR .. "src/devices/machine/buffer.h",
MAME_DIR .. "src/devices/machine/clock.cpp",
MAME_DIR .. "src/devices/machine/clock.h",
- MAME_DIR .. "src/emu/machine/generic.cpp",
- MAME_DIR .. "src/emu/machine/generic.h",
MAME_DIR .. "src/devices/machine/keyboard.cpp",
MAME_DIR .. "src/devices/machine/keyboard.h",
MAME_DIR .. "src/devices/machine/laserdsc.cpp",
@@ -365,3 +366,30 @@ custombuildtask {
layoutbuildtask("emu/layout", "noscreens"),
layoutbuildtask("emu/layout", "snap"),
}
+
+project ("precompile")
+targetsubdir(_OPTIONS["target"] .."_" .. _OPTIONS["subtarget"])
+uuid ("a6fb15d4-b123-4445-acef-13c8e80fcacf")
+kind (LIBTYPE)
+
+addprojectflags()
+precompiledheaders()
+
+includedirs {
+ MAME_DIR .. "src/osd",
+ MAME_DIR .. "src/emu",
+ MAME_DIR .. "src/devices", -- till deps are fixed
+ MAME_DIR .. "src/lib",
+ MAME_DIR .. "src/lib/util",
+ MAME_DIR .. "3rdparty",
+ GEN_DIR .. "emu",
+ GEN_DIR .. "emu/layout",
+}
+files {
+ MAME_DIR .. "src/emu/drivers/empty.cpp",
+}
+dependency {
+ { "$(OBJDIR)/src/emu/drivers/empty.o", "$(GCH)", true },
+}
+
+
diff --git a/scripts/src/lib.lua b/scripts/src/lib.lua
index 833504a92f7..7620389f5dc 100644
--- a/scripts/src/lib.lua
+++ b/scripts/src/lib.lua
@@ -48,7 +48,6 @@ project "utils"
MAME_DIR .. "src/lib/util/chdcd.h",
MAME_DIR .. "src/lib/util/chdcodec.cpp",
MAME_DIR .. "src/lib/util/chdcodec.h",
- MAME_DIR .. "src/lib/util/corealloc.cpp",
MAME_DIR .. "src/lib/util/corealloc.h",
MAME_DIR .. "src/lib/util/corefile.cpp",
MAME_DIR .. "src/lib/util/corefile.h",
diff --git a/scripts/src/machine.lua b/scripts/src/machine.lua
index c048884cf4f..5a97d22d015 100644
--- a/scripts/src/machine.lua
+++ b/scripts/src/machine.lua
@@ -2701,3 +2701,14 @@ if (MACHINES["VT82C496"]~=null) then
}
end
+---------------------------------------------------
+--
+--@src/emu/machine/pdc.h,MACHINES["PDC"] = true
+---------------------------------------------------
+
+if (MACHINES["PDC"]~=null) then
+ files {
+ MAME_DIR .. "src/devices/machine/pdc.cpp",
+ MAME_DIR .. "src/devices/machine/pdc.h",
+ }
+end
diff --git a/scripts/src/main.lua b/scripts/src/main.lua
index 619833ccf57..da633c55212 100644
--- a/scripts/src/main.lua
+++ b/scripts/src/main.lua
@@ -44,7 +44,7 @@ end
flags {
"Unicode",
}
-if (_OPTIONS["SOURCES"] == nil) then
+
configuration { "x64", "Release" }
targetsuffix "64"
if _OPTIONS["PROFILE"] then
@@ -80,7 +80,7 @@ if (_OPTIONS["SOURCES"] == nil) then
if _OPTIONS["PROFILE"] then
targetsuffix "dp"
end
-end
+
configuration { "mingw*" or "vs*" }
targetextension ".exe"
@@ -88,7 +88,7 @@ end
targetextension ".bc"
if os.getenv("EMSCRIPTEN") then
postbuildcommands {
- os.getenv("EMSCRIPTEN") .. "/emcc -O3 -s DISABLE_EXCEPTION_CATCHING=2 -s USE_SDL=2 --memory-init-file 0 -s ALLOW_MEMORY_GROWTH=0 -s TOTAL_MEMORY=268435456 -s EXCEPTION_CATCHING_WHITELIST='[\"__ZN15running_machine17start_all_devicesEv\"]' -s EXPORTED_FUNCTIONS=\"['_main', '_malloc', '__Z14js_get_machinev', '__Z9js_get_uiv', '__Z12js_get_soundv', '__ZN10ui_manager12set_show_fpsEb', '__ZNK10ui_manager8show_fpsEv', '__ZN13sound_manager4muteEbh', '_SDL_PauseAudio']\" $(TARGET) -o " .. MAME_DIR .. _OPTIONS["target"] .. _OPTIONS["subtarget"] .. ".js --post-js " .. MAME_DIR .. "src/osd/sdl/emscripten_post.js",
+ os.getenv("EMSCRIPTEN") .. "/emcc -O3 -s DISABLE_EXCEPTION_CATCHING=2 -s USE_SDL=2 --memory-init-file 0 -s ALLOW_MEMORY_GROWTH=0 -s TOTAL_MEMORY=268435456 -s EXCEPTION_CATCHING_WHITELIST='[\"__ZN15running_machine17start_all_devicesEv\"]' -s EXPORTED_FUNCTIONS=\"['_main', '_malloc', '__Z14js_get_machinev', '__Z9js_get_uiv', '__Z12js_get_soundv', '__ZN10ui_manager12set_show_fpsEb', '__ZNK10ui_manager8show_fpsEv', '__ZN13sound_manager4muteEbh', '_SDL_PauseAudio']\" $(TARGET) -o " .. _MAKE.esc(MAME_DIR) .. _OPTIONS["target"] .. _OPTIONS["subtarget"] .. ".js --post-js " .. _MAKE.esc(MAME_DIR) .. "src/osd/sdl/emscripten_post.js",
}
end
@@ -102,6 +102,9 @@ end
links {
"osd_" .. _OPTIONS["osd"],
}
+ links {
+ "qtdbg_" .. _OPTIONS["osd"],
+ }
if (_OPTIONS["SOURCES"] == nil) then
links {
"bus",
@@ -126,7 +129,6 @@ end
"7z",
"lua",
"lsqlite3",
- "jsoncpp",
}
if _OPTIONS["with-bundled-zlib"] then
@@ -197,13 +199,13 @@ end
if _OPTIONS["targetos"]=="macosx" and (not override_resources) then
linkoptions {
- "-sectcreate __TEXT __info_plist " .. GEN_DIR .. "/resource/" .. _subtarget .. "-Info.plist"
+ "-sectcreate __TEXT __info_plist " .. _MAKE.esc(GEN_DIR) .. "resource/" .. _subtarget .. "-Info.plist"
}
custombuildtask {
- { MAME_DIR .. "src/version.cpp" , GEN_DIR .. "/resource/" .. _subtarget .. "-Info.plist", { MAME_DIR .. "scripts/build/verinfo.py" }, {"@echo Emitting " .. _subtarget .. "-Info.plist" .. "...", PYTHON .. " $(1) -p -b " .. _subtarget .. " $(<) > $(@)" }},
+ { MAME_DIR .. "src/version.cpp" , GEN_DIR .. "resource/" .. _subtarget .. "-Info.plist", { MAME_DIR .. "scripts/build/verinfo.py" }, {"@echo Emitting " .. _subtarget .. "-Info.plist" .. "...", PYTHON .. " $(1) -p -b " .. _subtarget .. " $(<) > $(@)" }},
}
dependency {
- { "$(TARGET)" , GEN_DIR .. "/resource/" .. _subtarget .. "-Info.plist", true },
+ { "$(TARGET)" , GEN_DIR .. "resource/" .. _subtarget .. "-Info.plist", true },
}
end
@@ -219,7 +221,7 @@ end
rcfile,
}
dependency {
- { "$(OBJDIR)/".._subtarget ..".res" , GEN_DIR .. "/resource/" .. rctarget .. "vers.rc", true },
+ { "$(OBJDIR)/".._subtarget ..".res" , GEN_DIR .. "resource/" .. rctarget .. "vers.rc", true },
}
else
rctarget = "mame"
@@ -227,7 +229,7 @@ end
MAME_DIR .. "src/mame/osd/windows/mame/mame.rc",
}
dependency {
- { "$(OBJDIR)/mame.res" , GEN_DIR .. "/resource/" .. rctarget .. "vers.rc", true },
+ { "$(OBJDIR)/mame.res" , GEN_DIR .. "resource/" .. rctarget .. "vers.rc", true },
}
end
end
@@ -261,14 +263,14 @@ if _OPTIONS["FORCE_VERSION_COMPILE"]=="1" then
end
configuration { "mingw*" }
custombuildtask {
- { MAME_DIR .. "src/version.cpp" , GEN_DIR .. "/resource/" .. rctarget .. "vers.rc", { MAME_DIR .. "scripts/build/verinfo.py" }, {"@echo Emitting " .. rctarget .. "vers.rc" .. "...", PYTHON .. " $(1) -r -b " .. rctarget .. " $(<) > $(@)" }},
+ { MAME_DIR .. "src/version.cpp" , GEN_DIR .. "resource/" .. rctarget .. "vers.rc", { MAME_DIR .. "scripts/build/verinfo.py" }, {"@echo Emitting " .. rctarget .. "vers.rc" .. "...", PYTHON .. " $(1) -r -b " .. rctarget .. " $(<) > $(@)" }},
}
configuration { "vs*" }
prebuildcommands {
- "mkdir " .. path.translate(GEN_DIR .. "/resource/","\\") .. " 2>NUL",
+ "mkdir " .. path.translate(GEN_DIR .. "resource/","\\") .. " 2>NUL",
"@echo Emitting ".. rctarget .. "vers.rc...",
- PYTHON .. " " .. path.translate(MAME_DIR .. "scripts/build/verinfo.py","\\") .. " -r -b " .. rctarget .. " " .. path.translate(MAME_DIR .. "src/version.cpp","\\") .. " > " .. path.translate(GEN_DIR .. "/resource/" .. rctarget .. "vers.rc", "\\") ,
+ PYTHON .. " " .. path.translate(MAME_DIR .. "scripts/build/verinfo.py","\\") .. " -r -b " .. rctarget .. " " .. path.translate(MAME_DIR .. "src/version.cpp","\\") .. " > " .. path.translate(GEN_DIR .. "resource/" .. rctarget .. "vers.rc", "\\") ,
}
diff --git a/scripts/src/osd/modules.lua b/scripts/src/osd/modules.lua
index cdb376c9c92..87e684a50f6 100644
--- a/scripts/src/osd/modules.lua
+++ b/scripts/src/osd/modules.lua
@@ -15,8 +15,8 @@ end
function addlibfromstring(str)
if (str==nil) then return end
- for w in str:gmatch("%S+") do
- if string.starts(w,"-l")==true then
+ for w in str:gmatch("%S+") do
+ if string.starts(w,"-l")==true then
links {
string.sub(w,3)
}
@@ -26,8 +26,8 @@ end
function addoptionsfromstring(str)
if (str==nil) then return end
- for w in str:gmatch("%S+") do
- if string.starts(w,"-l")==false then
+ for w in str:gmatch("%S+") do
+ if string.starts(w,"-l")==false then
linkoptions {
w
}
@@ -54,7 +54,6 @@ function osdmodulesbuild()
MAME_DIR .. "src/osd/modules/debugger/none.cpp",
MAME_DIR .. "src/osd/modules/debugger/debugint.cpp",
MAME_DIR .. "src/osd/modules/debugger/debugwin.cpp",
- MAME_DIR .. "src/osd/modules/debugger/debugqt.cpp",
MAME_DIR .. "src/osd/modules/font/font_sdl.cpp",
MAME_DIR .. "src/osd/modules/font/font_windows.cpp",
MAME_DIR .. "src/osd/modules/font/font_osx.cpp",
@@ -68,6 +67,7 @@ function osdmodulesbuild()
MAME_DIR .. "src/osd/modules/sound/direct_sound.cpp",
MAME_DIR .. "src/osd/modules/sound/coreaudio_sound.cpp",
MAME_DIR .. "src/osd/modules/sound/sdl_sound.cpp",
+ MAME_DIR .. "src/osd/modules/sound/xaudio2_sound.cpp",
MAME_DIR .. "src/osd/modules/sound/none.cpp",
}
@@ -121,6 +121,38 @@ function osdmodulesbuild()
end
if _OPTIONS["USE_QTDEBUG"]=="1" then
+ defines {
+ "USE_QTDEBUG=1",
+ }
+ else
+ defines {
+ "USE_QTDEBUG=0",
+ }
+ end
+
+end
+
+
+function qtdebuggerbuild()
+
+ removeflags {
+ "SingleOutputDir",
+ }
+ local version = str_to_version(_OPTIONS["gcc_version"])
+ if _OPTIONS["gcc"]~=nil and (string.find(_OPTIONS["gcc"], "clang") or string.find(_OPTIONS["gcc"], "asmjs")) then
+ configuration { "gmake" }
+ if (version >= 30600) then
+ buildoptions {
+ "-Wno-inconsistent-missing-override",
+ }
+ end
+ end
+
+ files {
+ MAME_DIR .. "src/osd/modules/debugger/debugqt.cpp",
+ }
+
+ if _OPTIONS["USE_QTDEBUG"]=="1" then
files {
MAME_DIR .. "src/osd/modules/debugger/qt/debuggerview.cpp",
MAME_DIR .. "src/osd/modules/debugger/qt/debuggerview.h",
@@ -153,7 +185,7 @@ function osdmodulesbuild()
defines {
"USE_QTDEBUG=1",
}
-
+
local MOC = ""
if (os.is("windows")) then
MOC = "moc"
@@ -163,22 +195,22 @@ function osdmodulesbuild()
if (QMAKETST=='') then
print("Qt's Meta Object Compiler (moc) wasn't found!")
os.exit(1)
- end
+ end
MOC = _OPTIONS["QT_HOME"] .. "/bin/moc"
- else
- MOCTST = backtick("which moc-qt4 2>/dev/null")
+ else
+ MOCTST = backtick("which moc-qt5 2>/dev/null")
if (MOCTST=='') then
MOCTST = backtick("which moc 2>/dev/null")
end
if (MOCTST=='') then
print("Qt's Meta Object Compiler (moc) wasn't found!")
os.exit(1)
- end
+ end
MOC = MOCTST
end
end
-
-
+
+
custombuildtask {
{ MAME_DIR .. "src/osd/modules/debugger/qt/debuggerview.h", GEN_DIR .. "osd/modules/debugger/qt/debuggerview.moc.cpp", { }, { MOC .. "$(MOCINCPATH) $(<) -o $(@)" }},
{ MAME_DIR .. "src/osd/modules/debugger/qt/windowqt.h", GEN_DIR .. "osd/modules/debugger/qt/windowqt.moc.cpp", { }, { MOC .. "$(MOCINCPATH) $(<) -o $(@)" }},
@@ -189,9 +221,9 @@ function osdmodulesbuild()
{ MAME_DIR .. "src/osd/modules/debugger/qt/breakpointswindow.h", GEN_DIR .. "osd/modules/debugger/qt/breakpointswindow.moc.cpp", { }, { MOC .. "$(MOCINCPATH) $(<) -o $(@)" }},
{ MAME_DIR .. "src/osd/modules/debugger/qt/deviceswindow.h", GEN_DIR .. "osd/modules/debugger/qt/deviceswindow.moc.cpp", { }, { MOC .. "$(MOCINCPATH) $(<) -o $(@)" }},
{ MAME_DIR .. "src/osd/modules/debugger/qt/deviceinformationwindow.h", GEN_DIR .. "osd/modules/debugger/qt/deviceinformationwindow.moc.cpp", { },{ MOC .. "$(MOCINCPATH) $(<) -o $(@)" }},
-
+
}
-
+
if _OPTIONS["targetos"]=="windows" then
configuration { "mingw*" }
buildoptions {
@@ -209,7 +241,7 @@ function osdmodulesbuild()
}
else
buildoptions {
- backtick("pkg-config --cflags QtGui"),
+ backtick("pkg-config --cflags Qt5Widgets"),
}
end
end
@@ -261,16 +293,18 @@ function osdmodulestargetconf()
}
links {
"qtmain",
- "QtGui4",
- "QtCore4",
+ "Qt5Core.dll",
+ "Qt5Gui.dll",
+ "Qt5Widgets.dll",
}
elseif _OPTIONS["targetos"]=="macosx" then
linkoptions {
"-F" .. backtick("qmake -query QT_INSTALL_LIBS"),
}
links {
- "QtCore.framework",
- "QtGui.framework",
+ "Qt5Core.framework",
+ "Qt5Gui.framework",
+ "Qt5Widgets.framework",
}
else
if _OPTIONS["QT_HOME"]~=nil then
@@ -278,11 +312,12 @@ function osdmodulestargetconf()
"-L" .. backtick(_OPTIONS["QT_HOME"] .. "/bin/qmake -query QT_INSTALL_LIBS"),
}
links {
- "QtGui",
- "QtCore",
+ "Qt5Core",
+ "Qt5Gui",
+ "Qt5Widgets",
}
else
- local str = backtick("pkg-config --libs QtGui")
+ local str = backtick("pkg-config --libs Qt5Widgets")
addlibfromstring(str)
addoptionsfromstring(str)
end
@@ -364,6 +399,38 @@ if not _OPTIONS["NO_USE_MIDI"] then
end
newoption {
+ trigger = "MODERN_WIN_API",
+ description = "Use Modern Windows APIs",
+ allowed = {
+ { "0", "Use classic Windows APIs - allows support for XP and later" },
+ { "1", "Use Modern Windows APIs - support for Windows 8.1 and later" },
+ },
+}
+
+newoption {
+ trigger = "USE_XAUDIO2",
+ description = "Use XAudio2 API for audio",
+ allowed = {
+ { "0", "Disable XAudio2" },
+ { "1", "Enable XAudio2" },
+ },
+}
+
+if _OPTIONS["USE_XAUDIO2"]=="1" then
+ _OPTIONS["MODERN_WIN_API"] = "1",
+ defines {
+ "USE_XAUDIO2=1",
+ },
+ includedirs {
+ MAME_DIR .. "3rdparty/win81sdk/Include/um",
+ }
+else
+ defines {
+ "USE_XAUDIO2=0",
+ }
+end
+
+newoption {
trigger = "USE_QTDEBUG",
description = "Use QT debugger",
allowed = {
diff --git a/scripts/src/osd/osdmini.lua b/scripts/src/osd/osdmini.lua
index 43ff9c4c40b..803b7413014 100644
--- a/scripts/src/osd/osdmini.lua
+++ b/scripts/src/osd/osdmini.lua
@@ -12,6 +12,27 @@
function maintargetosdoptions(_target,_subtarget)
end
+project ("qtdbg_" .. _OPTIONS["osd"])
+ uuid (os.uuid("qtdbg_" .. _OPTIONS["osd"]))
+ kind (LIBTYPE)
+
+ dofile("osdmini_cfg.lua")
+ includedirs {
+ MAME_DIR .. "src/emu",
+ MAME_DIR .. "src/devices", -- accessing imagedev from debugger
+ MAME_DIR .. "src/osd",
+ MAME_DIR .. "src/lib",
+ MAME_DIR .. "src/lib/util",
+ MAME_DIR .. "src/osd/modules/render",
+ MAME_DIR .. "3rdparty",
+ }
+ removeflags {
+ "SingleOutputDir",
+ }
+
+ files {
+ MAME_DIR .. "src/osd/modules/debugger/debugqt.cpp",
+ }
project ("osd_" .. _OPTIONS["osd"])
uuid (os.uuid("osd_" .. _OPTIONS["osd"]))
diff --git a/scripts/src/osd/osdmini_cfg.lua b/scripts/src/osd/osdmini_cfg.lua
index aa6f64113f2..ff9539066b2 100644
--- a/scripts/src/osd/osdmini_cfg.lua
+++ b/scripts/src/osd/osdmini_cfg.lua
@@ -3,7 +3,7 @@
defines {
"OSD_MINI",
- "USE_QTDEBUG",
+ "USE_QTDEBUG=0",
"USE_SDL",
"SDLMAME_NOASM=1",
"USE_OPENGL=0",
diff --git a/scripts/src/osd/sdl.lua b/scripts/src/osd/sdl.lua
index 30c776490c5..6acb5a2d262 100644
--- a/scripts/src/osd/sdl.lua
+++ b/scripts/src/osd/sdl.lua
@@ -241,9 +241,20 @@ end
if BASE_TARGETOS=="unix" then
if _OPTIONS["targetos"]=="macosx" then
+ local os_version = str_to_version(backtick("sw_vers -productVersion"))
+
links {
"Cocoa.framework",
}
+ linkoptions {
+ "-framework QuartzCore",
+ "-framework OpenGL",
+ }
+ if os_version>=101100 then
+ linkoptions {
+ "-weak_framework Metal",
+ }
+ end
if _OPTIONS["MACOSX_USE_LIBSDL"]~="1" then
linkoptions {
"-F" .. _OPTIONS["SDL_FRAMEWORK_PATH"],
@@ -307,6 +318,27 @@ elseif BASE_TARGETOS=="os2" then
}
end
+project ("qtdbg_" .. _OPTIONS["osd"])
+ uuid (os.uuid("qtdbg_" .. _OPTIONS["osd"]))
+ kind (LIBTYPE)
+
+ dofile("sdl_cfg.lua")
+ includedirs {
+ MAME_DIR .. "src/emu",
+ MAME_DIR .. "src/devices", -- accessing imagedev from debugger
+ MAME_DIR .. "src/osd",
+ MAME_DIR .. "src/lib",
+ MAME_DIR .. "src/lib/util",
+ MAME_DIR .. "src/osd/modules/render",
+ MAME_DIR .. "3rdparty",
+ }
+ configuration { "linux-*" }
+ buildoptions {
+ "-fPIC",
+ }
+ configuration { }
+
+ qtdebuggerbuild()
project ("osd_" .. _OPTIONS["osd"])
targetsubdir(_OPTIONS["target"] .."_" .._OPTIONS["subtarget"])
@@ -369,7 +401,7 @@ project ("osd_" .. _OPTIONS["osd"])
MAME_DIR .. "src/osd/modules/debugger/osx/registersview.mm",
MAME_DIR .. "src/osd/modules/debugger/osx/registersview.h",
MAME_DIR .. "src/osd/modules/debugger/osx/watchpointsview.mm",
- MAME_DIR .. "src/osd/modules/debugger/osx/watchpointsview.h",
+ MAME_DIR .. "src/osd/modules/debugger/osx/watchpointsview.h",
MAME_DIR .. "src/osd/modules/debugger/osx/debugosx.h",
}
if _OPTIONS["SDL_LIBVER"]=="sdl" then
@@ -438,7 +470,7 @@ project ("ocore_" .. _OPTIONS["osd"])
MAME_DIR .. "src/osd/sdl/sdlsocket.cpp",
MAME_DIR .. "src/osd/sdl/sdlos_" .. SDLOS_TARGETOS .. ".cpp",
MAME_DIR .. "src/osd/modules/osdmodule.cpp",
- MAME_DIR .. "src/osd/modules/osdmodule.h",
+ MAME_DIR .. "src/osd/modules/osdmodule.h",
MAME_DIR .. "src/osd/modules/lib/osdlib_" .. SDLOS_TARGETOS .. ".cpp",
MAME_DIR .. "src/osd/modules/lib/osdlib.h",
MAME_DIR .. "src/osd/modules/sync/sync_" .. SYNC_IMPLEMENTATION .. ".cpp",
@@ -473,9 +505,9 @@ if _OPTIONS["with-tools"] then
kind "ConsoleApp"
flags {
- "Symbols", -- always include minimum symbols for executables
+ "Symbols", -- always include minimum symbols for executables
}
-
+
dofile("sdl_cfg.lua")
includedirs {
@@ -483,7 +515,7 @@ if _OPTIONS["with-tools"] then
MAME_DIR .. "src/lib/util",
}
- if _OPTIONS["SEPARATE_BIN"]~="1" then
+ if _OPTIONS["SEPARATE_BIN"]~="1" then
targetdir(MAME_DIR)
end
@@ -534,12 +566,12 @@ if _OPTIONS["targetos"] == "macosx" and _OPTIONS["with-tools"] then
kind "ConsoleApp"
flags {
- "Symbols", -- always include minimum symbols for executables
+ "Symbols", -- always include minimum symbols for executables
}
dofile("sdl_cfg.lua")
- if _OPTIONS["SEPARATE_BIN"]~="1" then
+ if _OPTIONS["SEPARATE_BIN"]~="1" then
targetdir(MAME_DIR)
end
diff --git a/scripts/src/osd/sdl_cfg.lua b/scripts/src/osd/sdl_cfg.lua
index 878a5a2f945..2dc1a7e465a 100644
--- a/scripts/src/osd/sdl_cfg.lua
+++ b/scripts/src/osd/sdl_cfg.lua
@@ -130,7 +130,7 @@ elseif _OPTIONS["targetos"]=="linux" then
}
else
buildoptions {
- backtick("pkg-config --cflags QtGui"),
+ backtick("pkg-config --cflags Qt5Widgets"),
}
end
elseif _OPTIONS["targetos"]=="macosx" then
diff --git a/scripts/src/osd/windows.lua b/scripts/src/osd/windows.lua
index 32b15ef0431..fd508e645c5 100644
--- a/scripts/src/osd/windows.lua
+++ b/scripts/src/osd/windows.lua
@@ -100,6 +100,22 @@ if _OPTIONS["CYGWIN_BUILD"] == "1" then
end
+project ("qtdbg_" .. _OPTIONS["osd"])
+ uuid (os.uuid("qtdbg_" .. _OPTIONS["osd"]))
+ kind (LIBTYPE)
+
+ dofile("windows_cfg.lua")
+ includedirs {
+ MAME_DIR .. "src/emu",
+ MAME_DIR .. "src/devices", -- accessing imagedev from debugger
+ MAME_DIR .. "src/osd",
+ MAME_DIR .. "src/lib",
+ MAME_DIR .. "src/lib/util",
+ MAME_DIR .. "src/osd/modules/render",
+ MAME_DIR .. "3rdparty",
+ }
+ qtdebuggerbuild()
+
project ("osd_" .. _OPTIONS["osd"])
uuid (os.uuid("osd_" .. _OPTIONS["osd"]))
kind (LIBTYPE)
diff --git a/scripts/src/osd/windows_cfg.lua b/scripts/src/osd/windows_cfg.lua
index bff1d436d3e..19ef05c3ce9 100644
--- a/scripts/src/osd/windows_cfg.lua
+++ b/scripts/src/osd/windows_cfg.lua
@@ -3,7 +3,6 @@
defines {
"OSD_WINDOWS",
- "_WIN32_WINNT=0x0501",
}
configuration { "mingw*-gcc or vs*" }
@@ -25,6 +24,23 @@ configuration { "vs*" }
configuration { }
+if not _OPTIONS["MODERN_WIN_API"] then
+ _OPTIONS["MODERN_WIN_API"] = "0"
+end
+
+if _OPTIONS["MODERN_WIN_API"]=="1" then
+ defines {
+ "WINVER=0x0602",
+ "_WIN32_WINNT=0x0602",
+ "NTDDI_VERSION=0x06030000",
+ "MODERN_WIN_API",
+ }
+else
+ defines {
+ "_WIN32_WINNT=0x0501",
+ }
+end
+
if not _OPTIONS["DONT_USE_NETWORK"] then
defines {
"USE_NETWORK",
diff --git a/scripts/src/sound.lua b/scripts/src/sound.lua
index 4ba380deefb..6fd7e6398d7 100644
--- a/scripts/src/sound.lua
+++ b/scripts/src/sound.lua
@@ -925,6 +925,7 @@ if (SOUNDS["SP0250"]~=null) then
end
+
---------------------------------------------------
-- S14001A speech synthesizer
--@src/devices/sound/s14001a.h,SOUNDS["S14001A"] = true
diff --git a/scripts/src/video.lua b/scripts/src/video.lua
index ad91ca0f9f8..a09ef123fca 100644
--- a/scripts/src/video.lua
+++ b/scripts/src/video.lua
@@ -524,6 +524,18 @@ end
--------------------------------------------------
--
+--@src/devices/video/pcd8544.h,VIDEOS["PCD8544"] = true
+--------------------------------------------------
+
+if (VIDEOS["PCD8544"]~=null) then
+ files {
+ MAME_DIR .. "src/devices/video/pcd8544.cpp",
+ MAME_DIR .. "src/devices/video/pcd8544.h",
+ }
+end
+
+--------------------------------------------------
+--
--@src/devices/video/polylgcy.h,VIDEOS["POLY"] = true
--------------------------------------------------
diff --git a/scripts/target/mame/arcade.lua b/scripts/target/mame/arcade.lua
index 5d65732f54a..c00c3d4731c 100644
--- a/scripts/target/mame/arcade.lua
+++ b/scripts/target/mame/arcade.lua
@@ -766,6 +766,7 @@ function createMAMEProjects(_target, _subtarget, _name)
kind (LIBTYPE)
uuid (os.uuid("drv-" .. _target .."_" .. _subtarget .. "_" .._name))
addprojectflags()
+ precompiledheaders()
includedirs {
MAME_DIR .. "src/osd",
@@ -1324,6 +1325,7 @@ files {
MAME_DIR .. "src/mame/video/vulgus.cpp",
MAME_DIR .. "src/mame/machine/kabuki.cpp",
MAME_DIR .. "src/mame/machine/kabuki.h",
+ MAME_DIR .. "src/mame/drivers/tvcapcom.cpp",
}
createMAMEProjects(_target, _subtarget, "cinemat")
@@ -3661,6 +3663,8 @@ files {
MAME_DIR .. "src/mame/video/tc0110pcr.h",
MAME_DIR .. "src/mame/video/tc0180vcu.cpp",
MAME_DIR .. "src/mame/video/tc0180vcu.h",
+ MAME_DIR .. "src/mame/video/tc0780fpa.cpp",
+ MAME_DIR .. "src/mame/video/tc0780fpa.h",
}
createMAMEProjects(_target, _subtarget, "tatsumi")
@@ -4017,6 +4021,7 @@ createMAMEProjects(_target, _subtarget, "zaccaria")
files {
MAME_DIR .. "src/mame/drivers/laserbat.cpp",
MAME_DIR .. "src/mame/includes/laserbat.h",
+ MAME_DIR .. "src/mame/video/laserbat.cpp",
MAME_DIR .. "src/mame/audio/laserbat.cpp",
MAME_DIR .. "src/mame/drivers/seabattl.cpp",
MAME_DIR .. "src/mame/drivers/zac2650.cpp",
@@ -4277,6 +4282,7 @@ files {
MAME_DIR .. "src/mame/video/esripsys.cpp",
MAME_DIR .. "src/mame/drivers/ettrivia.cpp",
MAME_DIR .. "src/mame/drivers/extrema.cpp",
+ MAME_DIR .. "src/mame/drivers/fastinvaders.cpp",
MAME_DIR .. "src/mame/drivers/fireball.cpp",
MAME_DIR .. "src/mame/drivers/flipjack.cpp",
MAME_DIR .. "src/mame/drivers/flower.cpp",
@@ -4297,6 +4303,7 @@ files {
MAME_DIR .. "src/mame/drivers/gammagic.cpp",
MAME_DIR .. "src/mame/drivers/gamtor.cpp",
MAME_DIR .. "src/mame/drivers/gei.cpp",
+ MAME_DIR .. "src/mame/drivers/gkigt.cpp",
MAME_DIR .. "src/mame/drivers/globalfr.cpp",
MAME_DIR .. "src/mame/drivers/globalvr.cpp",
MAME_DIR .. "src/mame/drivers/gluck2.cpp",
@@ -4448,6 +4455,7 @@ files {
MAME_DIR .. "src/mame/drivers/roul.cpp",
MAME_DIR .. "src/mame/drivers/savquest.cpp",
MAME_DIR .. "src/mame/drivers/sanremo.cpp",
+ MAME_DIR .. "src/mame/drivers/sanremmg.cpp",
MAME_DIR .. "src/mame/drivers/sealy.cpp",
MAME_DIR .. "src/mame/drivers/scm_500.cpp",
MAME_DIR .. "src/mame/drivers/sfbonus.cpp",
diff --git a/scripts/target/mame/dummy.lua b/scripts/target/mame/dummy.lua
index 9d7a986f714..f64a02fbae7 100644
--- a/scripts/target/mame/dummy.lua
+++ b/scripts/target/mame/dummy.lua
@@ -18,6 +18,7 @@ function createProjects_mame_dummy(_target, _subtarget)
kind (LIBTYPE)
uuid (os.uuid("drv-mame_dummy"))
addprojectflags()
+ precompiledheaders()
includedirs {
MAME_DIR .. "src/osd",
diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua
index 60ecf006397..cfbf4e0667a 100644
--- a/scripts/target/mame/mess.lua
+++ b/scripts/target/mame/mess.lua
@@ -301,6 +301,7 @@ VIDEOS["MSM6222B"] = true
VIDEOS["MSM6255"] = true
VIDEOS["MOS6566"] = true
VIDEOS["PC_VGA"] = true
+VIDEOS["PCD8544"] = true
--VIDEOS+= POLY"] = true
VIDEOS["PSX"] = true
VIDEOS["RAMDAC"] = true
@@ -486,6 +487,7 @@ MACHINES["PC_LPT"] = true
MACHINES["PCCARD"] = true
MACHINES["PCF8593"] = true
MACHINES["PCKEYBRD"] = true
+MACHINES["PDC"] = true
MACHINES["PIC8259"] = true
MACHINES["PIT68230"] = true
MACHINES["PIT8253"] = true
@@ -808,11 +810,14 @@ function linkProjects_mame_mess(_target, _subtarget)
"robotron",
"rockwell",
"roland",
+ "rolm",
"sage",
"samcoupe",
"samsung",
"sanyo",
+ "saturn",
"sega",
+ "sequential",
"sgi",
"sharp",
"siemens",
@@ -883,6 +888,7 @@ function createMESSProjects(_target, _subtarget, _name)
kind (LIBTYPE)
uuid (os.uuid("drv-" .. _target .."_" .. _subtarget .. "_" .._name))
addprojectflags()
+ precompiledheaders()
includedirs {
MAME_DIR .. "src/osd",
@@ -1692,9 +1698,9 @@ files {
createMESSProjects(_target, _subtarget, "fidelity")
files {
- MAME_DIR .. "src/mame/drivers/csc.cpp",
MAME_DIR .. "src/mame/drivers/fidelz80.cpp",
MAME_DIR .. "src/mame/includes/fidelz80.h",
+ MAME_DIR .. "src/mame/drivers/fidel6502.cpp",
}
createMESSProjects(_target, _subtarget, "force")
@@ -2358,6 +2364,12 @@ files {
MAME_DIR .. "src/mame/drivers/rd110.cpp",
MAME_DIR .. "src/mame/drivers/rsc55.cpp",
MAME_DIR .. "src/mame/drivers/tb303.cpp",
+ MAME_DIR .. "src/mame/drivers/tr606.cpp",
+}
+
+createMESSProjects(_target, _subtarget, "rolm")
+files {
+ MAME_DIR .. "src/mame/drivers/r9751.cpp",
}
createMESSProjects(_target, _subtarget, "rockwell")
@@ -2368,6 +2380,11 @@ files {
MAME_DIR .. "src/mame/drivers/aim65_40.cpp",
}
+createMESSProjects(_target, _subtarget, "saturn")
+files {
+ MAME_DIR .. "src/mame/drivers/st17xx.cpp",
+}
+
createMESSProjects(_target, _subtarget, "sage")
files {
MAME_DIR .. "src/mame/drivers/sage2.cpp",
@@ -2385,6 +2402,7 @@ files {
createMESSProjects(_target, _subtarget, "samsung")
files {
MAME_DIR .. "src/mame/drivers/spc1000.cpp",
+ MAME_DIR .. "src/mame/drivers/spc1500.cpp",
}
createMESSProjects(_target, _subtarget, "sanyo")
@@ -2424,14 +2442,19 @@ files {
MAME_DIR .. "src/mame/machine/megacdcd.h",
}
+createMESSProjects(_target, _subtarget, "sequential")
+files {
+ MAME_DIR .. "src/mame/drivers/prophet600.cpp",
+}
+
createMESSProjects(_target, _subtarget, "sgi")
files {
MAME_DIR .. "src/mame/machine/sgi.cpp",
MAME_DIR .. "src/mame/machine/sgi.h",
- MAME_DIR .. "src/mame/drivers/sgi_ip2.cpp",
- MAME_DIR .. "src/mame/drivers/sgi_ip6.cpp",
- MAME_DIR .. "src/mame/drivers/ip20.cpp",
- MAME_DIR .. "src/mame/drivers/ip22.cpp",
+ MAME_DIR .. "src/mame/drivers/iris3130.cpp",
+ MAME_DIR .. "src/mame/drivers/4dpi.cpp",
+ MAME_DIR .. "src/mame/drivers/indigo.cpp",
+ MAME_DIR .. "src/mame/drivers/indy_indigo2.cpp",
MAME_DIR .. "src/mame/video/newport.cpp",
MAME_DIR .. "src/mame/video/newport.h",
}
@@ -2713,6 +2736,7 @@ files {
MAME_DIR .. "src/mame/drivers/geneve.cpp",
MAME_DIR .. "src/mame/drivers/ticalc1x.cpp",
MAME_DIR .. "src/mame/drivers/tispeak.cpp",
+ MAME_DIR .. "src/mame/drivers/tispellb.cpp",
MAME_DIR .. "src/mame/drivers/ti74.cpp",
MAME_DIR .. "src/mame/drivers/ti85.cpp",
MAME_DIR .. "src/mame/includes/ti85.h",
@@ -3032,6 +3056,7 @@ files {
MAME_DIR .. "src/mame/drivers/d6800.cpp",
MAME_DIR .. "src/mame/drivers/d6809.cpp",
MAME_DIR .. "src/mame/drivers/daruma.cpp",
+ MAME_DIR .. "src/mame/drivers/didact.cpp",
MAME_DIR .. "src/mame/drivers/digel804.cpp",
MAME_DIR .. "src/mame/drivers/dim68k.cpp",
MAME_DIR .. "src/mame/drivers/dm7000.cpp",
@@ -3080,7 +3105,8 @@ files {
MAME_DIR .. "src/mame/drivers/lft.cpp",
MAME_DIR .. "src/mame/drivers/lg-dvd.cpp",
MAME_DIR .. "src/mame/drivers/lola8a.cpp",
- MAME_DIR .. "src/mame/drivers/m79152pc.cpp",
+ MAME_DIR .. "src/mame/drivers/m79152pc.cpp",
+ MAME_DIR .. "src/mame/drivers/marywu.cpp",
MAME_DIR .. "src/mame/drivers/mccpm.cpp",
MAME_DIR .. "src/mame/drivers/mes.cpp",
MAME_DIR .. "src/mame/drivers/mice.cpp",
@@ -3126,6 +3152,7 @@ files {
MAME_DIR .. "src/mame/drivers/sbrain.cpp",
MAME_DIR .. "src/mame/drivers/seattlecmp.cpp",
MAME_DIR .. "src/mame/drivers/sh4robot.cpp",
+ MAME_DIR .. "src/mame/drivers/sansa_fuze.cpp",
MAME_DIR .. "src/mame/drivers/softbox.cpp",
MAME_DIR .. "src/mame/includes/softbox.h",
MAME_DIR .. "src/mame/drivers/squale.cpp",
diff --git a/scripts/target/mame/tiny.lua b/scripts/target/mame/tiny.lua
index 6aba11b51e7..75d0cd955df 100644
--- a/scripts/target/mame/tiny.lua
+++ b/scripts/target/mame/tiny.lua
@@ -81,6 +81,7 @@ function createProjects_mame_tiny(_target, _subtarget)
kind (LIBTYPE)
uuid (os.uuid("drv-mame-tiny"))
addprojectflags()
+ precompiledheaders()
includedirs {
MAME_DIR .. "src/osd",
diff --git a/scripts/toolchain.lua b/scripts/toolchain.lua
index 13fe67eac1d..7fad61ce928 100644
--- a/scripts/toolchain.lua
+++ b/scripts/toolchain.lua
@@ -32,6 +32,7 @@ newoption {
{ "qnx-arm", "QNX/Blackberry - ARM" },
{ "rpi", "RaspberryPi" },
{ "solaris", "Solaris" },
+ { "steamlink", "Steam Link" },
},
}
@@ -189,8 +190,18 @@ function toolchain(_buildDir, _subDir)
location (_buildDir .. "projects/" .. _subDir .. "/".. _ACTION .. "-linux-clang")
end
+ if "steamlink" == _OPTIONS["gcc"] then
+ if not os.getenv("MARVELL_SDK_PATH") then
+ print("Set MARVELL_SDK_PATH envrionment variable.")
+ end
+ premake.gcc.cc = "$(MARVELL_SDK_PATH)/toolchain/bin/armv7a-cros-linux-gnueabi-gcc"
+ premake.gcc.cxx = "$(MARVELL_SDK_PATH)/toolchain/bin/armv7a-cros-linux-gnueabi-g++"
+ premake.gcc.ar = "$(MARVELL_SDK_PATH)/toolchain/bin/armv7a-cros-linux-gnueabi-ar"
+ location (_buildDir .. "projects/" .. _subDir .. "/".. _ACTION .. "-steamlink")
+ end
+
if "mingw32-gcc" == _OPTIONS["gcc"] then
- if not os.getenv("MINGW32") or not os.getenv("MINGW32") then
+ if not os.getenv("MINGW32") then
print("Set MINGW32 envrionment variable.")
end
premake.gcc.cc = "$(MINGW32)/bin/i686-w64-mingw32-gcc"
@@ -207,7 +218,7 @@ function toolchain(_buildDir, _subDir)
end
if "mingw64-gcc" == _OPTIONS["gcc"] then
- if not os.getenv("MINGW64") or not os.getenv("MINGW64") then
+ if not os.getenv("MINGW64") then
print("Set MINGW64 envrionment variable.")
end
premake.gcc.cc = "$(MINGW64)/bin/x86_64-w64-mingw32-gcc"
@@ -225,9 +236,9 @@ function toolchain(_buildDir, _subDir)
if "mingw-clang" == _OPTIONS["gcc"] then
- premake.gcc.cc = "$(CLANG)/bin/clang"
- premake.gcc.cxx = "$(CLANG)/bin/clang++"
- premake.gcc.ar = "$(CLANG)/bin/llvm-ar"
+ premake.gcc.cc = "clang"
+ premake.gcc.cxx = "clang++"
+ premake.gcc.ar = "llvm-ar"
premake.gcc.llvm = true
location (_buildDir .. "projects/" .. _subDir .. "/".. _ACTION .. "-mingw-clang")
end
@@ -483,36 +494,44 @@ function toolchain(_buildDir, _subDir)
configuration { "x64", "mingw64-gcc", "Debug" }
targetdir (_buildDir .. "mingw-gcc" .. "/bin/x64/Debug")
+ configuration { "steamlink" }
+ objdir ( _buildDir .. "steamlink/obj")
+
+ buildoptions {
+ "-marm",
+ "-mfloat-abi=hard",
+ "--sysroot=$(MARVELL_SDK_PATH)/rootfs",
+ }
+ linkoptions {
+ "-static-libgcc",
+ "-static-libstdc++",
+ "--sysroot=$(MARVELL_SDK_PATH)/rootfs",
+ }
+
+ configuration { "steamlink", "Release" }
+ targetdir (_buildDir .. "steamlink/bin/Release")
+
+ configuration { "steamlink", "Debug" }
+ targetdir (_buildDir .. "steamlink/bin/Debug")
+
configuration { "mingw-clang" }
linkoptions {
- "-Qunused-arguments",
- "-Wno-error=unused-command-line-argument-hard-error-in-future",
"-Wl,--allow-multiple-definition",
}
configuration { "x32", "mingw-clang" }
objdir ( _buildDir .. "mingw-clang/obj")
buildoptions { "-m32" }
- buildoptions {
- "-isystem$(MINGW32)/i686-w64-mingw32/include/c++",
- "-isystem$(MINGW32)/i686-w64-mingw32/include/c++/i686-w64-mingw32",
- "-isystem$(MINGW32)/i686-w64-mingw32/include",
- }
configuration { "x32", "mingw-clang", "Release" }
targetdir (_buildDir .. "mingw-clang/bin/x32/Release")
configuration { "x32", "mingw-clang", "Debug" }
- targetdir (_buildDir .. "win32_mingw-clang/bin/x32/Debug")
+ targetdir (_buildDir .. "mingw-clang/bin/x32/Debug")
configuration { "x64", "mingw-clang" }
objdir (_buildDir .. "mingw-clang/obj")
buildoptions { "-m64" }
- buildoptions {
- "-isystem$(MINGW64)/x86_64-w64-mingw32/include/c++",
- "-isystem$(MINGW64)/x86_64-w64-mingw32/include/c++/x86_64-w64-mingw32",
- "-isystem$(MINGW64)/x86_64-w64-mingw32/include",
- }
configuration { "x64", "mingw-clang", "Release" }
targetdir (_buildDir .. "mingw-clang/bin/x64/Release")
diff --git a/src/devices/bus/a7800/a78_slot.cpp b/src/devices/bus/a7800/a78_slot.cpp
index 7fda107b70c..0509753a1c3 100644
--- a/src/devices/bus/a7800/a78_slot.cpp
+++ b/src/devices/bus/a7800/a78_slot.cpp
@@ -115,7 +115,7 @@ void device_a78_cart_interface::nvram_alloc(UINT32 size)
a78_cart_slot_device::a78_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
device_t(mconfig, A78_CART_SLOT, "Atari 7800 Cartridge Slot", tag, owner, clock, "a78_cart_slot", __FILE__),
device_image_interface(mconfig, *this),
- device_slot_interface(mconfig, *this), m_cart(nullptr), m_type(0), m_stick_type(0)
+ device_slot_interface(mconfig, *this), m_cart(nullptr), m_type(0)
{
}
@@ -500,7 +500,7 @@ void a78_cart_slot_device::call_unload()
bool a78_cart_slot_device::call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry)
{
- load_software_part_region(*this, swlist, swname, start_entry);
+ machine().rom_load().load_software_part_region(*this, swlist, swname, start_entry);
return TRUE;
}
@@ -528,11 +528,11 @@ int a78_cart_slot_device::verify_header(char *header)
get default card software
-------------------------------------------------*/
-void a78_cart_slot_device::get_default_card_software(std::string &result)
+std::string a78_cart_slot_device::get_default_card_software()
{
if (open_image_file(mconfig().options()))
{
- const char *slot_string = "a78_rom";
+ const char *slot_string;
dynamic_buffer head(128);
int type = A78_TYPE0, mapper;
@@ -586,10 +586,10 @@ void a78_cart_slot_device::get_default_card_software(std::string &result)
clear();
- result.assign(slot_string);
+ return std::string(slot_string);
}
else
- software_get_default_slot(result, "a78_rom");
+ return software_get_default_slot("a78_rom");
}
diff --git a/src/devices/bus/a7800/a78_slot.h b/src/devices/bus/a7800/a78_slot.h
index 4d006c7d94d..cbdc38741f2 100644
--- a/src/devices/bus/a7800/a78_slot.h
+++ b/src/devices/bus/a7800/a78_slot.h
@@ -99,7 +99,6 @@ public:
virtual bool call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry) override;
int get_cart_type() { return m_type; };
- int identify_cart_type(UINT8 *ROM, UINT32 len);
bool has_cart() { return m_cart != nullptr; }
virtual iodevice_t image_type() const override { return IO_CARTSLOT; }
@@ -114,7 +113,7 @@ public:
virtual device_image_partialhash_func get_partial_hash() const override { return &a78_partialhash; }
// slot interface overrides
- virtual void get_default_card_software(std::string &result) override;
+ virtual std::string get_default_card_software() override;
// reading and writing
virtual DECLARE_READ8_MEMBER(read_04xx);
@@ -129,7 +128,6 @@ public:
private:
device_a78_cart_interface* m_cart;
int m_type;
- int m_stick_type;
int verify_header(char *header);
int validate_header(int head, bool log);
diff --git a/src/devices/bus/a800/a800_slot.cpp b/src/devices/bus/a800/a800_slot.cpp
index 148ab38ed03..b2e46a421da 100644
--- a/src/devices/bus/a800/a800_slot.cpp
+++ b/src/devices/bus/a800/a800_slot.cpp
@@ -305,7 +305,7 @@ void a800_cart_slot_device::call_unload()
bool a800_cart_slot_device::call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry)
{
- load_software_part_region(*this, swlist, swname, start_entry);
+ machine().rom_load().load_software_part_region(*this, swlist, swname, start_entry);
return TRUE;
}
@@ -406,11 +406,11 @@ int a800_cart_slot_device::identify_cart_type(UINT8 *header)
get default card software
-------------------------------------------------*/
-void a800_cart_slot_device::get_default_card_software(std::string &result)
+std::string a800_cart_slot_device::get_default_card_software()
{
if (open_image_file(mconfig().options()))
{
- const char *slot_string = "a800_8k";
+ const char *slot_string;
dynamic_buffer head(0x10);
UINT32 len = core_fsize(m_file);
int type = A800_8K;
@@ -436,18 +436,18 @@ void a800_cart_slot_device::get_default_card_software(std::string &result)
clear();
- result.assign(slot_string);
+ return std::string(slot_string);
}
else
- software_get_default_slot(result, "a800_8k");
+ return software_get_default_slot("a800_8k");
}
-void a5200_cart_slot_device::get_default_card_software(std::string &result)
+std::string a5200_cart_slot_device::get_default_card_software()
{
if (open_image_file(mconfig().options()))
{
- const char *slot_string = "a5200";
+ const char *slot_string;
dynamic_buffer head(0x10);
UINT32 len = core_fsize(m_file);
int type = A5200_8K;
@@ -469,18 +469,18 @@ void a5200_cart_slot_device::get_default_card_software(std::string &result)
clear();
- result.assign(slot_string);
+ return std::string(slot_string);
}
else
- software_get_default_slot(result, "a5200");
+ return software_get_default_slot("a5200");
}
-void xegs_cart_slot_device::get_default_card_software(std::string &result)
+std::string xegs_cart_slot_device::get_default_card_software()
{
if (open_image_file(mconfig().options()))
{
- const char *slot_string = "xegs";
+ const char *slot_string;
dynamic_buffer head(0x10);
UINT32 len = core_fsize(m_file);
int type = A800_8K;
@@ -504,10 +504,10 @@ void xegs_cart_slot_device::get_default_card_software(std::string &result)
clear();
- result.assign(slot_string);
+ return std::string(slot_string);
}
else
- software_get_default_slot(result, "xegs");
+ return software_get_default_slot("xegs");
}
diff --git a/src/devices/bus/a800/a800_slot.h b/src/devices/bus/a800/a800_slot.h
index 95948109653..6efdd0839e9 100644
--- a/src/devices/bus/a800/a800_slot.h
+++ b/src/devices/bus/a800/a800_slot.h
@@ -113,7 +113,7 @@ public:
virtual const char *file_extensions() const override { return "bin,rom,car"; }
// slot interface overrides
- virtual void get_default_card_software(std::string &result) override;
+ virtual std::string get_default_card_software() override;
// reading and writing
virtual DECLARE_READ8_MEMBER(read_80xx);
@@ -142,7 +142,7 @@ public:
virtual const char *file_extensions() const override { return "bin,rom,car,a52"; }
// slot interface overrides
- virtual void get_default_card_software(std::string &result) override;
+ virtual std::string get_default_card_software() override;
};
// ======================> xegs_cart_slot_device
@@ -157,7 +157,7 @@ public:
virtual const char *file_extensions() const override { return "bin,rom,car"; }
// slot interface overrides
- virtual void get_default_card_software(std::string &result) override;
+ virtual std::string get_default_card_software() override;
};
// device type definition
diff --git a/src/devices/bus/abckb/abc99.cpp b/src/devices/bus/abckb/abc99.cpp
index 01fd743d3eb..8dc4d9e75c7 100644
--- a/src/devices/bus/abckb/abc99.cpp
+++ b/src/devices/bus/abckb/abc99.cpp
@@ -588,14 +588,14 @@ WRITE8_MEMBER( abc99_device::z2_led_w )
{
if (m_led_en) return;
- output_set_led_value(LED_1, BIT(data, 0));
- output_set_led_value(LED_2, BIT(data, 1));
- output_set_led_value(LED_3, BIT(data, 2));
- output_set_led_value(LED_4, BIT(data, 3));
- output_set_led_value(LED_5, BIT(data, 4));
- output_set_led_value(LED_6, BIT(data, 5));
- output_set_led_value(LED_7, BIT(data, 6));
- output_set_led_value(LED_8, BIT(data, 7));
+ machine().output().set_led_value(LED_1, BIT(data, 0));
+ machine().output().set_led_value(LED_2, BIT(data, 1));
+ machine().output().set_led_value(LED_3, BIT(data, 2));
+ machine().output().set_led_value(LED_4, BIT(data, 3));
+ machine().output().set_led_value(LED_5, BIT(data, 4));
+ machine().output().set_led_value(LED_6, BIT(data, 5));
+ machine().output().set_led_value(LED_7, BIT(data, 6));
+ machine().output().set_led_value(LED_8, BIT(data, 7));
}
@@ -631,9 +631,9 @@ WRITE8_MEMBER( abc99_device::z2_p1_w )
m_t1_z5 = BIT(data, 2);
// key LEDs
- output_set_led_value(LED_INS, BIT(data, 3));
- output_set_led_value(LED_ALT, BIT(data, 4));
- output_set_led_value(LED_CAPS_LOCK, BIT(data, 5));
+ machine().output().set_led_value(LED_INS, BIT(data, 3));
+ machine().output().set_led_value(LED_ALT, BIT(data, 4));
+ machine().output().set_led_value(LED_CAPS_LOCK, BIT(data, 5));
// speaker output
m_speaker->level_w(!BIT(data, 6));
diff --git a/src/devices/bus/adam/exp.cpp b/src/devices/bus/adam/exp.cpp
index a8ac09cf676..3c43a400ff0 100644
--- a/src/devices/bus/adam/exp.cpp
+++ b/src/devices/bus/adam/exp.cpp
@@ -90,7 +90,7 @@ bool adam_expansion_slot_device::call_load()
{
if (m_card)
{
- size_t size = 0;
+ size_t size;
if (software_entry() == nullptr)
{
@@ -114,7 +114,7 @@ bool adam_expansion_slot_device::call_load()
bool adam_expansion_slot_device::call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry)
{
- load_software_part_region(*this, swlist, swname, start_entry);
+ machine().rom_load().load_software_part_region(*this, swlist, swname, start_entry);
return true;
}
@@ -124,9 +124,9 @@ bool adam_expansion_slot_device::call_softlist_load(software_list_device &swlist
// get_default_card_software -
//-------------------------------------------------
-void adam_expansion_slot_device::get_default_card_software(std::string &result)
+std::string adam_expansion_slot_device::get_default_card_software()
{
- software_get_default_slot(result, "standard");
+ return software_get_default_slot("standard");
}
diff --git a/src/devices/bus/adam/exp.h b/src/devices/bus/adam/exp.h
index 0ede272e340..bd764c667c9 100644
--- a/src/devices/bus/adam/exp.h
+++ b/src/devices/bus/adam/exp.h
@@ -87,7 +87,7 @@ protected:
virtual const option_guide *create_option_guide() const override { return nullptr; }
// slot interface overrides
- virtual void get_default_card_software(std::string &result) override;
+ virtual std::string get_default_card_software() override;
devcb_write_line m_write_irq;
diff --git a/src/devices/bus/amiga/zorro/buddha.cpp b/src/devices/bus/amiga/zorro/buddha.cpp
index 7ea65396afa..6f21e86d9be 100644
--- a/src/devices/bus/amiga/zorro/buddha.cpp
+++ b/src/devices/bus/amiga/zorro/buddha.cpp
@@ -220,7 +220,7 @@ WRITE_LINE_MEMBER( buddha_device::ide_1_interrupt_w)
READ16_MEMBER( buddha_device::ide_0_interrupt_r )
{
- UINT16 data = 0xffff;
+ UINT16 data;
data = m_ide_0_interrupt << 15;
@@ -234,7 +234,7 @@ READ16_MEMBER( buddha_device::ide_0_interrupt_r )
READ16_MEMBER( buddha_device::ide_1_interrupt_r )
{
- UINT16 data = 0xffff;
+ UINT16 data;
data = m_ide_1_interrupt << 15;
@@ -255,7 +255,7 @@ WRITE16_MEMBER( buddha_device::ide_interrupt_enable_w )
READ16_MEMBER( buddha_device::ide_0_cs0_r )
{
- UINT16 data = 0xffff;
+ UINT16 data;
mem_mask = (mem_mask << 8) | (mem_mask >> 8);
data = m_ata_0->read_cs0(space, (offset >> 1) & 0x07, mem_mask);
@@ -279,7 +279,7 @@ WRITE16_MEMBER( buddha_device::ide_0_cs0_w )
READ16_MEMBER( buddha_device::ide_0_cs1_r )
{
- UINT16 data = 0xffff;
+ UINT16 data;
mem_mask = (mem_mask << 8) | (mem_mask >> 8);
data = m_ata_0->read_cs1(space, (offset >> 1) & 0x07, mem_mask);
@@ -303,7 +303,7 @@ WRITE16_MEMBER( buddha_device::ide_0_cs1_w )
READ16_MEMBER( buddha_device::ide_1_cs0_r )
{
- UINT16 data = 0xffff;
+ UINT16 data;
mem_mask = (mem_mask << 8) | (mem_mask >> 8);
data = m_ata_1->read_cs0(space, (offset >> 1) & 0x07, mem_mask);
@@ -327,7 +327,7 @@ WRITE16_MEMBER( buddha_device::ide_1_cs0_w )
READ16_MEMBER( buddha_device::ide_1_cs1_r )
{
- UINT16 data = 0xffff;
+ UINT16 data;
mem_mask = (mem_mask << 8) | (mem_mask >> 8);
data = m_ata_1->read_cs1(space, (offset >> 1) & 0x07, mem_mask);
diff --git a/src/devices/bus/apf/slot.cpp b/src/devices/bus/apf/slot.cpp
index b94f286798c..eb2e17d9f80 100644
--- a/src/devices/bus/apf/slot.cpp
+++ b/src/devices/bus/apf/slot.cpp
@@ -212,7 +212,7 @@ bool apf_cart_slot_device::call_load()
bool apf_cart_slot_device::call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry)
{
- load_software_part_region(*this, swlist, swname, start_entry);
+ machine().rom_load().load_software_part_region(*this, swlist, swname, start_entry);
return TRUE;
}
@@ -221,11 +221,11 @@ bool apf_cart_slot_device::call_softlist_load(software_list_device &swlist, cons
get default card software
-------------------------------------------------*/
-void apf_cart_slot_device::get_default_card_software(std::string &result)
+std::string apf_cart_slot_device::get_default_card_software()
{
if (open_image_file(mconfig().options()))
{
- const char *slot_string = "std";
+ const char *slot_string;
UINT32 size = core_fsize(m_file);
int type = APF_STD;
@@ -240,11 +240,10 @@ void apf_cart_slot_device::get_default_card_software(std::string &result)
//printf("type: %s\n", slot_string);
clear();
- result.assign(slot_string);
- return;
+ return std::string(slot_string);
}
- software_get_default_slot(result, "std");
+ return software_get_default_slot("std");
}
/*-------------------------------------------------
diff --git a/src/devices/bus/apf/slot.h b/src/devices/bus/apf/slot.h
index 15d2c8500a9..e8260ab55bc 100644
--- a/src/devices/bus/apf/slot.h
+++ b/src/devices/bus/apf/slot.h
@@ -84,7 +84,7 @@ public:
virtual const char *file_extensions() const override { return "bin"; }
// slot interface overrides
- virtual void get_default_card_software(std::string &result) override;
+ virtual std::string get_default_card_software() override;
// reading and writing
virtual DECLARE_READ8_MEMBER(read_rom);
diff --git a/src/devices/bus/arcadia/slot.cpp b/src/devices/bus/arcadia/slot.cpp
index eec8c412775..3a6aee846ab 100644
--- a/src/devices/bus/arcadia/slot.cpp
+++ b/src/devices/bus/arcadia/slot.cpp
@@ -220,7 +220,7 @@ bool arcadia_cart_slot_device::call_load()
bool arcadia_cart_slot_device::call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry)
{
- load_software_part_region(*this, swlist, swname, start_entry);
+ machine().rom_load().load_software_part_region(*this, swlist, swname, start_entry);
return TRUE;
}
@@ -230,9 +230,9 @@ bool arcadia_cart_slot_device::call_softlist_load(software_list_device &swlist,
get default card software
-------------------------------------------------*/
-void arcadia_cart_slot_device::get_default_card_software(std::string &result)
+std::string arcadia_cart_slot_device::get_default_card_software()
{
- software_get_default_slot(result, "std");
+ return software_get_default_slot("std");
}
/*-------------------------------------------------
diff --git a/src/devices/bus/arcadia/slot.h b/src/devices/bus/arcadia/slot.h
index b4777024f2c..e018b40595d 100644
--- a/src/devices/bus/arcadia/slot.h
+++ b/src/devices/bus/arcadia/slot.h
@@ -73,7 +73,7 @@ public:
virtual const char *file_extensions() const override { return "bin"; }
// slot interface overrides
- virtual void get_default_card_software(std::string &result) override;
+ virtual std::string get_default_card_software() override;
// reading and writing
virtual DECLARE_READ8_MEMBER(read_rom);
diff --git a/src/devices/bus/astrocde/slot.cpp b/src/devices/bus/astrocde/slot.cpp
index 877df4773a0..8ae7bbe8c15 100644
--- a/src/devices/bus/astrocde/slot.cpp
+++ b/src/devices/bus/astrocde/slot.cpp
@@ -189,7 +189,7 @@ bool astrocade_cart_slot_device::call_load()
bool astrocade_cart_slot_device::call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry)
{
- load_software_part_region(*this, swlist, swname, start_entry);
+ machine().rom_load().load_software_part_region(*this, swlist, swname, start_entry);
return TRUE;
}
@@ -198,11 +198,11 @@ bool astrocade_cart_slot_device::call_softlist_load(software_list_device &swlist
get default card software
-------------------------------------------------*/
-void astrocade_cart_slot_device::get_default_card_software(std::string &result)
+std::string astrocade_cart_slot_device::get_default_card_software()
{
if (open_image_file(mconfig().options()))
{
- const char *slot_string = "rom";
+ const char *slot_string;
UINT32 size = core_fsize(m_file);
int type = ASTROCADE_STD;
@@ -216,11 +216,10 @@ void astrocade_cart_slot_device::get_default_card_software(std::string &result)
//printf("type: %s\n", slot_string);
clear();
- result.assign(slot_string);
- return;
+ return std::string(slot_string);
}
- software_get_default_slot(result, "rom");
+ return software_get_default_slot("rom");
}
/*-------------------------------------------------
diff --git a/src/devices/bus/astrocde/slot.h b/src/devices/bus/astrocde/slot.h
index 42e8026305e..1a28ccf4b96 100644
--- a/src/devices/bus/astrocde/slot.h
+++ b/src/devices/bus/astrocde/slot.h
@@ -30,7 +30,6 @@ public:
virtual DECLARE_READ8_MEMBER(read_rom) { return 0xff; }
void rom_alloc(UINT32 size, const char *tag);
- void ram_alloc(UINT32 size);
UINT8* get_rom_base() { return m_rom; }
UINT32 get_rom_size() { return m_rom_size; }
@@ -74,7 +73,7 @@ public:
virtual const char *file_extensions() const override { return "bin"; }
// slot interface overrides
- virtual void get_default_card_software(std::string &result) override;
+ virtual std::string get_default_card_software() override;
// reading and writing
virtual DECLARE_READ8_MEMBER(read_rom);
diff --git a/src/devices/bus/c64/exp.cpp b/src/devices/bus/c64/exp.cpp
index 1155cf54d69..47e2a20cc14 100644
--- a/src/devices/bus/c64/exp.cpp
+++ b/src/devices/bus/c64/exp.cpp
@@ -117,7 +117,7 @@ bool c64_expansion_slot_device::call_load()
{
if (m_card)
{
- size_t size = 0;
+ size_t size;
if (software_entry() == nullptr)
{
@@ -207,7 +207,7 @@ bool c64_expansion_slot_device::call_load()
bool c64_expansion_slot_device::call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry)
{
- load_software_part_region(*this, swlist, swname, start_entry);
+ machine().rom_load().load_software_part_region(*this, swlist, swname, start_entry);
return true;
}
@@ -217,20 +217,17 @@ bool c64_expansion_slot_device::call_softlist_load(software_list_device &swlist,
// get_default_card_software -
//-------------------------------------------------
-void c64_expansion_slot_device::get_default_card_software(std::string &result)
+std::string c64_expansion_slot_device::get_default_card_software()
{
if (open_image_file(mconfig().options()))
{
if (!core_stricmp(filetype(), "crt"))
- {
- cbm_crt_get_card(result, m_file);
- return;
- }
+ return cbm_crt_get_card(m_file);
clear();
}
- software_get_default_slot(result, "standard");
+ return software_get_default_slot("standard");
}
diff --git a/src/devices/bus/c64/exp.h b/src/devices/bus/c64/exp.h
index 1e3c4ad049c..d72a91475be 100644
--- a/src/devices/bus/c64/exp.h
+++ b/src/devices/bus/c64/exp.h
@@ -149,7 +149,7 @@ protected:
virtual const option_guide *create_option_guide() const override { return nullptr; }
// slot interface overrides
- virtual void get_default_card_software(std::string &result) override;
+ virtual std::string get_default_card_software() override;
devcb_read8 m_read_dma_cd;
devcb_write8 m_write_dma_cd;
diff --git a/src/devices/bus/c64/geocable.h b/src/devices/bus/c64/geocable.h
index 373fcd25a73..6b823b9a668 100644
--- a/src/devices/bus/c64/geocable.h
+++ b/src/devices/bus/c64/geocable.h
@@ -51,8 +51,6 @@ protected:
private:
required_device<centronics_device> m_centronics;
-
- void update_output();
};
diff --git a/src/devices/bus/c64/magic_voice.h b/src/devices/bus/c64/magic_voice.h
index cfcd2aaded8..f5e8af19e59 100644
--- a/src/devices/bus/c64/magic_voice.h
+++ b/src/devices/bus/c64/magic_voice.h
@@ -40,8 +40,6 @@ public:
DECLARE_WRITE8_MEMBER( tpi_pa_w );
DECLARE_READ8_MEMBER( tpi_pb_r );
DECLARE_WRITE8_MEMBER( tpi_pb_w );
- DECLARE_READ8_MEMBER( tpi_pc_r );
- DECLARE_WRITE8_MEMBER( tpi_pc_w );
DECLARE_WRITE_LINE_MEMBER( tpi_ca_w );
DECLARE_WRITE_LINE_MEMBER( tpi_cb_w );
diff --git a/src/devices/bus/cbm2/exp.cpp b/src/devices/bus/cbm2/exp.cpp
index 4eb95e81bb2..fd4993760c3 100644
--- a/src/devices/bus/cbm2/exp.cpp
+++ b/src/devices/bus/cbm2/exp.cpp
@@ -103,7 +103,7 @@ void cbm2_expansion_slot_device::device_reset()
bool cbm2_expansion_slot_device::call_load()
{
- size_t size = 0;
+ size_t size;
if (m_card)
{
@@ -145,7 +145,7 @@ bool cbm2_expansion_slot_device::call_load()
bool cbm2_expansion_slot_device::call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry)
{
- load_software_part_region(*this, swlist, swname, start_entry);
+ machine().rom_load().load_software_part_region(*this, swlist, swname, start_entry);
return true;
}
@@ -155,9 +155,9 @@ bool cbm2_expansion_slot_device::call_softlist_load(software_list_device &swlist
// get_default_card_software -
//-------------------------------------------------
-void cbm2_expansion_slot_device::get_default_card_software(std::string &result)
+std::string cbm2_expansion_slot_device::get_default_card_software()
{
- software_get_default_slot(result, "standard");
+ return software_get_default_slot("standard");
}
diff --git a/src/devices/bus/cbm2/exp.h b/src/devices/bus/cbm2/exp.h
index 771a66604cc..ce5daf10dbb 100644
--- a/src/devices/bus/cbm2/exp.h
+++ b/src/devices/bus/cbm2/exp.h
@@ -96,7 +96,7 @@ protected:
virtual const option_guide *create_option_guide() const override { return nullptr; }
// slot interface overrides
- virtual void get_default_card_software(std::string &result) override;
+ virtual std::string get_default_card_software() override;
device_cbm2_expansion_card_interface *m_card;
};
diff --git a/src/devices/bus/cbm2/hrg.cpp b/src/devices/bus/cbm2/hrg.cpp
index cb489ec359f..bb0e38a22cb 100644
--- a/src/devices/bus/cbm2/hrg.cpp
+++ b/src/devices/bus/cbm2/hrg.cpp
@@ -14,6 +14,7 @@
- version A (EF9365, 512x512 interlaced, 1 page)
- version B (EF9366, 512x256 non-interlaced, 2 pages)
+ - 256KB version ROM
*/
@@ -26,7 +27,7 @@
//**************************************************************************
#define EF9365_TAG "ef9365"
-#define EF9366_TAG "ef9366"
+#define EF9366_TAG EF9365_TAG
#define SCREEN_TAG "screen"
@@ -35,8 +36,8 @@
// DEVICE DEFINITIONS
//**************************************************************************
-const device_type CBM2_HRG_A = &device_creator<cbm2_graphic_cartridge_a_device>;
-const device_type CBM2_HRG_B = &device_creator<cbm2_graphic_cartridge_b_device>;
+const device_type CBM2_HRG_A = &device_creator<cbm2_hrg_a_t>;
+const device_type CBM2_HRG_B = &device_creator<cbm2_hrg_b_t>;
//-------------------------------------------------
@@ -53,25 +54,50 @@ ROM_END
// rom_region - device-specific ROM region
//-------------------------------------------------
-const rom_entry *cbm2_graphic_cartridge_device::device_rom_region() const
+const rom_entry *cbm2_hrg_t::device_rom_region() const
{
return ROM_NAME( cbm2_hrg );
}
//-------------------------------------------------
+// ADDRESS_MAP( hrg_a_map )
+//-------------------------------------------------
+
+static ADDRESS_MAP_START( hrg_a_map, AS_0, 8, cbm2_hrg_a_t )
+ ADDRESS_MAP_GLOBAL_MASK(0x7fff)
+ AM_RANGE(0x0000, 0x7fff) AM_RAM
+ADDRESS_MAP_END
+
+
+//-------------------------------------------------
+// ADDRESS_MAP( hrg_b_map )
+//-------------------------------------------------
+
+static ADDRESS_MAP_START( hrg_b_map, AS_0, 8, cbm2_hrg_b_t )
+ ADDRESS_MAP_GLOBAL_MASK(0x3fff)
+ AM_RANGE(0x0000, 0x3fff) AM_RAM
+ADDRESS_MAP_END
+
+
+//-------------------------------------------------
// MACHINE_CONFIG_FRAGMENT( cbm2_hrg_a )
//-------------------------------------------------
static MACHINE_CONFIG_FRAGMENT( cbm2_hrg_a )
-/* MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
- MCFG_SCREEN_UPDATE_DEVICE(EF9365_TAG, ef9365_device, screen_update)
- MCFG_SCREEN_SIZE(512, 512)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 512-1)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_REFRESH_RATE(50)
-
- MCFG_EF9365_ADD(EF9365_TAG, gdp_intf)*/
+ MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
+ MCFG_SCREEN_UPDATE_DEVICE(EF9365_TAG, ef9365_device, screen_update)
+ MCFG_SCREEN_SIZE(512, 512)
+ MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 512-1)
+ MCFG_SCREEN_REFRESH_RATE(25)
+ MCFG_PALETTE_ADD_MONOCHROME_GREEN("palette")
+
+ MCFG_DEVICE_ADD(EF9365_TAG, EF9365, 1750000)
+ MCFG_VIDEO_SET_SCREEN(SCREEN_TAG)
+ MCFG_DEVICE_ADDRESS_MAP(AS_0, hrg_a_map)
+ MCFG_EF936X_PALETTE("palette")
+ MCFG_EF936X_BITPLANES_CNT(1);
+ MCFG_EF936X_DISPLAYMODE(EF936X_512x512_DISPLAY_MODE);
MACHINE_CONFIG_END
@@ -80,14 +106,19 @@ MACHINE_CONFIG_END
//-------------------------------------------------
static MACHINE_CONFIG_FRAGMENT( cbm2_hrg_b )
-/* MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
- MCFG_SCREEN_UPDATE_DEVICE(EF9366_TAG, ef9366_device, screen_update)
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_REFRESH_RATE(50)
-
- MCFG_EF9366_ADD(EF9366_TAG, gdp_intf)*/
+ MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
+ MCFG_SCREEN_UPDATE_DEVICE(EF9366_TAG, ef9365_device, screen_update)
+ MCFG_SCREEN_SIZE(512, 256)
+ MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1)
+ MCFG_SCREEN_REFRESH_RATE(50)
+ MCFG_PALETTE_ADD_MONOCHROME_GREEN("palette")
+
+ MCFG_DEVICE_ADD(EF9366_TAG, EF9365, 1750000)
+ MCFG_VIDEO_SET_SCREEN(SCREEN_TAG)
+ MCFG_DEVICE_ADDRESS_MAP(AS_0, hrg_b_map)
+ MCFG_EF936X_PALETTE("palette")
+ MCFG_EF936X_BITPLANES_CNT(1);
+ MCFG_EF936X_DISPLAYMODE(EF936X_512x256_DISPLAY_MODE);
MACHINE_CONFIG_END
@@ -96,12 +127,12 @@ MACHINE_CONFIG_END
// machine configurations
//-------------------------------------------------
-machine_config_constructor cbm2_graphic_cartridge_a_device::device_mconfig_additions() const
+machine_config_constructor cbm2_hrg_a_t::device_mconfig_additions() const
{
return MACHINE_CONFIG_NAME( cbm2_hrg_a );
}
-machine_config_constructor cbm2_graphic_cartridge_b_device::device_mconfig_additions() const
+machine_config_constructor cbm2_hrg_b_t::device_mconfig_additions() const
{
return MACHINE_CONFIG_NAME( cbm2_hrg_b );
}
@@ -113,25 +144,24 @@ machine_config_constructor cbm2_graphic_cartridge_b_device::device_mconfig_addit
//**************************************************************************
//-------------------------------------------------
-// cbm2_graphic_cartridge_device - constructor
+// cbm2_hrg_t - constructor
//-------------------------------------------------
-cbm2_graphic_cartridge_device::cbm2_graphic_cartridge_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source) :
+cbm2_hrg_t::cbm2_hrg_t(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source) :
device_t(mconfig, type, name, tag, owner, clock, shortname, source),
device_cbm2_expansion_card_interface(mconfig, *this),
+ m_gdc(*this, EF9366_TAG),
m_bank3(*this, "bank3")
{
}
-cbm2_graphic_cartridge_a_device::cbm2_graphic_cartridge_a_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
- cbm2_graphic_cartridge_device(mconfig, CBM2_HRG_A, "CBM 500/600/700 High Resolution Graphics (A)", tag, owner, clock, "cbm2_hrga", __FILE__)
- //m_gdc(*this, EF9365_TAG)
+cbm2_hrg_a_t::cbm2_hrg_a_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
+ cbm2_hrg_t(mconfig, CBM2_HRG_A, "CBM 500/600/700 High Resolution Graphics (A)", tag, owner, clock, "cbm2_hrga", __FILE__)
{
}
-cbm2_graphic_cartridge_b_device::cbm2_graphic_cartridge_b_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
- cbm2_graphic_cartridge_device(mconfig, CBM2_HRG_B, "CBM 500/600/700 High Resolution Graphics (B)", tag, owner, clock, "cbm2_hrgb", __FILE__)
- //m_gdc(*this, EF9366_TAG)
+cbm2_hrg_b_t::cbm2_hrg_b_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
+ cbm2_hrg_t(mconfig, CBM2_HRG_B, "CBM 500/600/700 High Resolution Graphics (B)", tag, owner, clock, "cbm2_hrgb", __FILE__)
{
}
@@ -140,7 +170,7 @@ cbm2_graphic_cartridge_b_device::cbm2_graphic_cartridge_b_device(const machine_c
// device_start - device-specific startup
//-------------------------------------------------
-void cbm2_graphic_cartridge_device::device_start()
+void cbm2_hrg_t::device_start()
{
}
@@ -149,9 +179,9 @@ void cbm2_graphic_cartridge_device::device_start()
// device_reset - device-specific reset
//-------------------------------------------------
-void cbm2_graphic_cartridge_device::device_reset()
+void cbm2_hrg_t::device_reset()
{
- //m_gdc->reset();
+ m_gdc->reset();
}
@@ -159,7 +189,7 @@ void cbm2_graphic_cartridge_device::device_reset()
// cbm2_bd_r - cartridge data read
//-------------------------------------------------
-UINT8 cbm2_graphic_cartridge_device::cbm2_bd_r(address_space &space, offs_t offset, UINT8 data, int csbank1, int csbank2, int csbank3)
+UINT8 cbm2_hrg_t::cbm2_bd_r(address_space &space, offs_t offset, UINT8 data, int csbank1, int csbank2, int csbank3)
{
if (!csbank3)
{
@@ -190,7 +220,7 @@ UINT8 cbm2_graphic_cartridge_device::cbm2_bd_r(address_space &space, offs_t offs
}
else if (offset >= 0x7ff0)
{
- //data = m_gdc->data_r(space, offset & 0x07);
+ data = m_gdc->data_r(space, offset & 0x0f);
}
}
@@ -202,7 +232,7 @@ UINT8 cbm2_graphic_cartridge_device::cbm2_bd_r(address_space &space, offs_t offs
// cbm2_bd_w - cartridge data write
//-------------------------------------------------
-void cbm2_graphic_cartridge_device::cbm2_bd_w(address_space &space, offs_t offset, UINT8 data, int csbank1, int csbank2, int csbank3)
+void cbm2_hrg_t::cbm2_bd_w(address_space &space, offs_t offset, UINT8 data, int csbank1, int csbank2, int csbank3)
{
if (!csbank3)
{
@@ -225,7 +255,7 @@ void cbm2_graphic_cartridge_device::cbm2_bd_w(address_space &space, offs_t offse
}
else if (offset >= 0x7ff0)
{
- //m_gdc->data_w(space, offset & 0x07, data);
+ m_gdc->data_w(space, offset & 0x0f, data);
}
}
}
diff --git a/src/devices/bus/cbm2/hrg.h b/src/devices/bus/cbm2/hrg.h
index 604229e9da4..c93b806b3e1 100644
--- a/src/devices/bus/cbm2/hrg.h
+++ b/src/devices/bus/cbm2/hrg.h
@@ -13,6 +13,7 @@
#include "emu.h"
#include "exp.h"
+#include "video/ef9365.h"
@@ -20,15 +21,14 @@
// TYPE DEFINITIONS
//**************************************************************************
-// ======================> cbm2_graphic_cartridge_device
+// ======================> cbm2_hrg_t
-class cbm2_graphic_cartridge_device : public device_t,
- public device_cbm2_expansion_card_interface
+class cbm2_hrg_t : public device_t,
+ public device_cbm2_expansion_card_interface
{
public:
// construction/destruction
- cbm2_graphic_cartridge_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source);
- cbm2_graphic_cartridge_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+ cbm2_hrg_t(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source);
// optional information overrides
virtual const rom_entry *device_rom_region() const override;
@@ -43,31 +43,31 @@ protected:
virtual void cbm2_bd_w(address_space &space, offs_t offset, UINT8 data, int csbank1, int csbank2, int csbank3) override;
private:
- //required_device<ef9365_device> m_gdc;
+ required_device<ef9365_device> m_gdc;
required_memory_region m_bank3;
};
-// ======================> cbm2_graphic_cartridge_a_device
+// ======================> cbm2_hrg_a_t
-class cbm2_graphic_cartridge_a_device : public cbm2_graphic_cartridge_device
+class cbm2_hrg_a_t : public cbm2_hrg_t
{
public:
// construction/destruction
- cbm2_graphic_cartridge_a_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+ cbm2_hrg_a_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
// optional information overrides
virtual machine_config_constructor device_mconfig_additions() const override;
};
-// ======================> cbm2_graphic_cartridge_b_device
+// ======================> cbm2_hrg_b_t
-class cbm2_graphic_cartridge_b_device : public cbm2_graphic_cartridge_device
+class cbm2_hrg_b_t : public cbm2_hrg_t
{
public:
// construction/destruction
- cbm2_graphic_cartridge_b_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+ cbm2_hrg_b_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
// optional information overrides
virtual machine_config_constructor device_mconfig_additions() const override;
diff --git a/src/devices/bus/cbmiec/c1541.cpp b/src/devices/bus/cbmiec/c1541.cpp
index a25aa7a434f..6e1be701b64 100644
--- a/src/devices/bus/cbmiec/c1541.cpp
+++ b/src/devices/bus/cbmiec/c1541.cpp
@@ -590,7 +590,7 @@ READ8_MEMBER( c1541_base_t::via0_pb_r )
*/
- UINT8 data = 0;
+ UINT8 data;
// data in
data = !m_bus->data_r() && !m_ga->atn_r();
@@ -722,7 +722,7 @@ WRITE8_MEMBER( c1541_base_t::via1_pb_w )
m_ga->stp_w(data & 0x03);
// activity LED
- output_set_led_value(LED_ACT, BIT(data, 3));
+ machine().output().set_led_value(LED_ACT, BIT(data, 3));
// density select
m_ga->ds_w((data >> 5) & 0x03);
diff --git a/src/devices/bus/cbmiec/c1571.cpp b/src/devices/bus/cbmiec/c1571.cpp
index 97ec044b271..976455387ae 100644
--- a/src/devices/bus/cbmiec/c1571.cpp
+++ b/src/devices/bus/cbmiec/c1571.cpp
@@ -303,7 +303,7 @@ READ8_MEMBER( c1571_t::via0_pb_r )
*/
- UINT8 data = 0;
+ UINT8 data;
// data in
data = !m_bus->data_r();
@@ -456,7 +456,7 @@ WRITE8_MEMBER( c1571_t::via1_pb_w )
m_ga->stp_w(data & 0x03); // TODO actually STP1=0, STP0=!(PB0^PB1), Y0=PB1, Y2=!PB1
// activity LED
- output_set_led_value(LED_ACT, BIT(data, 3));
+ machine().output().set_led_value(LED_ACT, BIT(data, 3));
// density select
m_ga->ds_w((data >> 5) & 0x03);
diff --git a/src/devices/bus/cbmiec/c1571.h b/src/devices/bus/cbmiec/c1571.h
index fde13dd0b66..cd0da9a3a3d 100644
--- a/src/devices/bus/cbmiec/c1571.h
+++ b/src/devices/bus/cbmiec/c1571.h
@@ -73,8 +73,6 @@ public:
DECLARE_WRITE_LINE_MEMBER( byte_w );
- DECLARE_WRITE_LINE_MEMBER( wpt_w );
-
DECLARE_FLOPPY_FORMATS( floppy_formats );
void wpt_callback(floppy_image_device *floppy, int state);
diff --git a/src/devices/bus/cbmiec/c1581.cpp b/src/devices/bus/cbmiec/c1581.cpp
index 33bc082241e..e13317654a2 100644
--- a/src/devices/bus/cbmiec/c1581.cpp
+++ b/src/devices/bus/cbmiec/c1581.cpp
@@ -169,10 +169,10 @@ WRITE8_MEMBER( c1581_t::cia_pa_w )
m_floppy->mon_w(BIT(data, 2));
// power led
- output_set_led_value(LED_POWER, BIT(data, 5));
+ machine().output().set_led_value(LED_POWER, BIT(data, 5));
// activity led
- output_set_led_value(LED_ACT, BIT(data, 6));
+ machine().output().set_led_value(LED_ACT, BIT(data, 6));
}
READ8_MEMBER( c1581_t::cia_pb_r )
@@ -192,7 +192,7 @@ READ8_MEMBER( c1581_t::cia_pb_r )
*/
- UINT8 data = 0;
+ UINT8 data;
// data in
data = !m_bus->data_r();
diff --git a/src/devices/bus/centronics/epson_ex800.cpp b/src/devices/bus/centronics/epson_ex800.cpp
index c8a1acc54a6..c09cc8f4af7 100644
--- a/src/devices/bus/centronics/epson_ex800.cpp
+++ b/src/devices/bus/centronics/epson_ex800.cpp
@@ -235,7 +235,7 @@ static MACHINE_CONFIG_FRAGMENT( epson_ex800 )
/* audio hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
- MCFG_SOUND_ADD("beeper", BEEP, 0)
+ MCFG_SOUND_ADD("beeper", BEEP, 4000) /* measured at 4000 Hz */
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
MACHINE_CONFIG_END
@@ -269,7 +269,7 @@ INPUT_CHANGED_MEMBER(epson_ex800_t::online_switch)
INPUT_PORTS_START( epson_ex800 )
PORT_START("ONLISW")
PORT_BIT(0xfe, IP_ACTIVE_HIGH, IPT_UNUSED)
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("ON LINE") PORT_CODE(KEYCODE_F9) PORT_CHANGED_MEMBER(DEVICE_SELF, epson_ex800_t, online_switch, NULL)
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("ON LINE") PORT_CODE(KEYCODE_F9) PORT_CHANGED_MEMBER(DEVICE_SELF, epson_ex800_t, online_switch, nullptr)
PORT_START("FEED")
PORT_BIT(0xfc, IP_ACTIVE_LOW, IPT_UNUSED)
@@ -384,7 +384,6 @@ void epson_ex800_t::device_reset()
{
/* Setup beep */
m_beeper->set_state(0);
- m_beeper->set_frequency(4000); /* measured at 4000 Hz */
}
diff --git a/src/devices/bus/centronics/epson_ex800.h b/src/devices/bus/centronics/epson_ex800.h
index 23d960a055a..2b28229c0df 100644
--- a/src/devices/bus/centronics/epson_ex800.h
+++ b/src/devices/bus/centronics/epson_ex800.h
@@ -30,7 +30,6 @@ class epson_ex800_t : public device_t,
public:
// construction/destruction
epson_ex800_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
- epson_ex800_t(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source);
// optional information overrides
virtual const rom_entry *device_rom_region() const override;
diff --git a/src/devices/bus/centronics/epson_lx800.cpp b/src/devices/bus/centronics/epson_lx800.cpp
index cfcffb7329c..ad52bc8c349 100644
--- a/src/devices/bus/centronics/epson_lx800.cpp
+++ b/src/devices/bus/centronics/epson_lx800.cpp
@@ -91,7 +91,7 @@ static MACHINE_CONFIG_FRAGMENT( epson_lx800 )
/* audio hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
- MCFG_SOUND_ADD("beeper", BEEP, 0)
+ MCFG_SOUND_ADD("beeper", BEEP, 4000) // ?
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.05)
/* gate array */
@@ -232,7 +232,6 @@ void epson_lx800_t::device_start()
void epson_lx800_t::device_reset()
{
m_beep->set_state(0);
- m_beep->set_frequency(4000); /* ? */
}
@@ -295,7 +294,7 @@ WRITE8_MEMBER( epson_lx800_t::portc_w )
logerror("%s: lx800_portc_w(%02x): %02x\n", machine().describe_context(), offset, data);
logerror("--> err: %d, ack: %d, fire: %d, buzzer: %d\n", BIT(data, 4), BIT(data, 5), BIT(data, 6), BIT(data, 7));
- output_set_value("online_led", !BIT(data, 2));
+ machine().output().set_value("online_led", !BIT(data, 2));
m_beep->set_state(!BIT(data, 7));
}
@@ -348,7 +347,7 @@ WRITE_LINE_MEMBER( epson_lx800_t::centronics_pe_w )
WRITE_LINE_MEMBER( epson_lx800_t::paperempty_led_w )
{
logerror("setting paperout led: %d\n", state);
- output_set_value("paperout_led", state);
+ machine().output().set_value("paperout_led", state);
}
WRITE_LINE_MEMBER( epson_lx800_t::reset_w )
diff --git a/src/devices/bus/centronics/epson_lx810l.cpp b/src/devices/bus/centronics/epson_lx810l.cpp
index 56e606d576f..fc7d557d928 100644
--- a/src/devices/bus/centronics/epson_lx810l.cpp
+++ b/src/devices/bus/centronics/epson_lx810l.cpp
@@ -192,7 +192,7 @@ static INPUT_PORTS_START( epson_lx810l )
/* Buttons on printer */
PORT_START("ONLINE")
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("On Line") PORT_CODE(KEYCODE_O) PORT_CHANGED_MEMBER(DEVICE_SELF, epson_lx810l_t, online_sw, NULL)
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("On Line") PORT_CODE(KEYCODE_O) PORT_CHANGED_MEMBER(DEVICE_SELF, epson_lx810l_t, online_sw, nullptr)
PORT_START("FORMFEED")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Form Feed") PORT_CODE(KEYCODE_F) PORT_TOGGLE
PORT_START("LINEFEED")
@@ -502,7 +502,7 @@ WRITE8_MEMBER( epson_lx810l_t::portc_w )
m_eeprom->clk_write(m_93c06_clk ? ASSERT_LINE : CLEAR_LINE);
m_eeprom->cs_write (m_93c06_cs ? ASSERT_LINE : CLEAR_LINE);
- output_set_value("online_led", !BIT(data, 2));
+ machine().output().set_value("online_led", !BIT(data, 2));
}
diff --git a/src/devices/bus/cgenie/expansion/floppy.h b/src/devices/bus/cgenie/expansion/floppy.h
index a85f26a68fe..540b2febebe 100644
--- a/src/devices/bus/cgenie/expansion/floppy.h
+++ b/src/devices/bus/cgenie/expansion/floppy.h
@@ -50,8 +50,6 @@ protected:
virtual void device_reset() override;
private:
- void update_irq();
-
required_device<fd1793_t> m_fdc;
required_device<floppy_connector> m_floppy0;
required_device<floppy_connector> m_floppy1;
diff --git a/src/devices/bus/chanf/slot.cpp b/src/devices/bus/chanf/slot.cpp
index f46abf3b7c3..72045151cca 100644
--- a/src/devices/bus/chanf/slot.cpp
+++ b/src/devices/bus/chanf/slot.cpp
@@ -207,7 +207,7 @@ bool channelf_cart_slot_device::call_load()
bool channelf_cart_slot_device::call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry)
{
- load_software_part_region(*this, swlist, swname, start_entry);
+ machine().rom_load().load_software_part_region(*this, swlist, swname, start_entry);
return TRUE;
}
@@ -217,11 +217,11 @@ bool channelf_cart_slot_device::call_softlist_load(software_list_device &swlist,
get default card software
-------------------------------------------------*/
-void channelf_cart_slot_device::get_default_card_software(std::string &result)
+std::string channelf_cart_slot_device::get_default_card_software()
{
if (open_image_file(mconfig().options()))
{
- const char *slot_string = "chess";
+ const char *slot_string;
UINT32 len = core_fsize(m_file);
int type;
@@ -235,10 +235,9 @@ void channelf_cart_slot_device::get_default_card_software(std::string &result)
//printf("type: %s\n", slot_string);
clear();
- result.assign(slot_string);
- return;
+ return std::string(slot_string);
}
- software_get_default_slot(result, "chess");
+ return software_get_default_slot("chess");
}
/*-------------------------------------------------
diff --git a/src/devices/bus/chanf/slot.h b/src/devices/bus/chanf/slot.h
index cd20ce557c4..78ee692640e 100644
--- a/src/devices/bus/chanf/slot.h
+++ b/src/devices/bus/chanf/slot.h
@@ -87,7 +87,7 @@ public:
virtual const char *file_extensions() const override { return "bin,chf"; }
// slot interface overrides
- virtual void get_default_card_software(std::string &result) override;
+ virtual std::string get_default_card_software() override;
// reading and writing
virtual DECLARE_READ8_MEMBER(read_rom);
diff --git a/src/devices/bus/coco/coco_dwsock.cpp b/src/devices/bus/coco/coco_dwsock.cpp
index e48b3e565d1..2750f266998 100644
--- a/src/devices/bus/coco/coco_dwsock.cpp
+++ b/src/devices/bus/coco/coco_dwsock.cpp
@@ -26,8 +26,7 @@ const device_type COCO_DWSOCK = &device_creator<beckerport_device>;
INPUT_PORTS_START( coco_drivewire )
PORT_START(DRIVEWIRE_PORT_TAG)
- PORT_CONFNAME( 0xffff, 65504, "Drivewire Server TCP Port")
- PORT_CHANGED_MEMBER(DEVICE_SELF, beckerport_device, drivewire_port_changed, NULL )
+ PORT_CONFNAME( 0xffff, 65504, "Drivewire Server TCP Port") PORT_CHANGED_MEMBER(DEVICE_SELF, beckerport_device, drivewire_port_changed, nullptr)
PORT_CONFSETTING( 65500, "65500" )
PORT_CONFSETTING( 65501, "65501" )
PORT_CONFSETTING( 65502, "65502" )
diff --git a/src/devices/bus/coco/coco_fdc.cpp b/src/devices/bus/coco/coco_fdc.cpp
index f510993473d..6e434ea3e0a 100644
--- a/src/devices/bus/coco/coco_fdc.cpp
+++ b/src/devices/bus/coco/coco_fdc.cpp
@@ -266,7 +266,7 @@ void coco_fdc_device::update_lines()
void coco_fdc_device::dskreg_w(UINT8 data)
{
UINT8 drive = 0;
- UINT8 head = 0;
+ UINT8 head;
if (LOG_FDC)
{
diff --git a/src/devices/bus/coco/cococart.cpp b/src/devices/bus/coco/cococart.cpp
index e3f25389eb1..66cbc1dc121 100644
--- a/src/devices/bus/coco/cococart.cpp
+++ b/src/devices/bus/coco/cococart.cpp
@@ -160,7 +160,7 @@ WRITE8_MEMBER(cococart_slot_device::write)
static const char *line_value_string(cococart_line_value value)
{
- const char *s = nullptr;
+ const char *s;
switch(value)
{
case COCOCART_LINE_VALUE_CLEAR:
@@ -326,7 +326,7 @@ bool cococart_slot_device::call_load()
{
if (m_cart)
{
- offs_t read_length = 0;
+ offs_t read_length;
if (software_entry() == nullptr)
{
read_length = fread(m_cart->get_cart_base(), 0x8000);
@@ -354,7 +354,7 @@ bool cococart_slot_device::call_load()
bool cococart_slot_device::call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry)
{
- load_software_part_region(*this, swlist, swname, start_entry );
+ machine().rom_load().load_software_part_region(*this, swlist, swname, start_entry );
return TRUE;
}
@@ -364,9 +364,9 @@ bool cococart_slot_device::call_softlist_load(software_list_device &swlist, cons
// get_default_card_software
//-------------------------------------------------
-void cococart_slot_device::get_default_card_software(std::string &result)
+std::string cococart_slot_device::get_default_card_software()
{
- software_get_default_slot(result, "pak");
+ return software_get_default_slot("pak");
}
diff --git a/src/devices/bus/coco/cococart.h b/src/devices/bus/coco/cococart.h
index ac53c52a0da..f92459b4388 100644
--- a/src/devices/bus/coco/cococart.h
+++ b/src/devices/bus/coco/cococart.h
@@ -102,7 +102,7 @@ public:
virtual const option_guide *create_option_guide() const override { return nullptr; }
// slot interface overrides
- virtual void get_default_card_software(std::string &result) override;
+ virtual std::string get_default_card_software() override;
// reading and writing to $FF40-$FF7F
DECLARE_READ8_MEMBER(read);
diff --git a/src/devices/bus/coleco/exp.cpp b/src/devices/bus/coleco/exp.cpp
index bf79854d857..05a53b584a5 100644
--- a/src/devices/bus/coleco/exp.cpp
+++ b/src/devices/bus/coleco/exp.cpp
@@ -102,7 +102,7 @@ bool colecovision_cartridge_slot_device::call_load()
bool colecovision_cartridge_slot_device::call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry)
{
- load_software_part_region(*this, swlist, swname, start_entry);
+ machine().rom_load().load_software_part_region(*this, swlist, swname, start_entry);
return true;
}
@@ -112,18 +112,15 @@ bool colecovision_cartridge_slot_device::call_softlist_load(software_list_device
// get_default_card_software -
//-------------------------------------------------
-void colecovision_cartridge_slot_device::get_default_card_software(std::string &result)
+std::string colecovision_cartridge_slot_device::get_default_card_software()
{
if (open_image_file(mconfig().options()))
{
UINT32 length = core_fsize(m_file);
if (length == 0x100000 || length == 0x200000)
- {
- software_get_default_slot(result, "xin1");
- return;
- }
+ return software_get_default_slot("xin1");
}
- software_get_default_slot(result, "standard");
+ return software_get_default_slot("standard");
}
diff --git a/src/devices/bus/coleco/exp.h b/src/devices/bus/coleco/exp.h
index c70b06959a0..e64e3c8d6d1 100644
--- a/src/devices/bus/coleco/exp.h
+++ b/src/devices/bus/coleco/exp.h
@@ -93,7 +93,7 @@ protected:
virtual const option_guide *create_option_guide() const override { return nullptr; }
// slot interface overrides
- virtual void get_default_card_software(std::string &result) override;
+ virtual std::string get_default_card_software() override;
device_colecovision_cartridge_interface *m_card;
};
diff --git a/src/devices/bus/cpc/cpc_rom.cpp b/src/devices/bus/cpc/cpc_rom.cpp
index a60b8e35c0b..d0d59ea4452 100644
--- a/src/devices/bus/cpc/cpc_rom.cpp
+++ b/src/devices/bus/cpc/cpc_rom.cpp
@@ -110,15 +110,15 @@ bool rom_image_device::call_load()
device_image_interface* image = this;
UINT64 size = image->length();
- m_base = global_alloc_array(UINT8, 16384);
+ m_base = std::make_unique<UINT8[]>(16384);
if(size <= 16384)
{
- image->fread(m_base,size);
+ image->fread(m_base.get(),size);
}
else
{
image->fseek(size-16384,SEEK_SET);
- image->fread(m_base,16384);
+ image->fread(m_base.get(),16384);
}
return IMAGE_INIT_PASS;
@@ -130,6 +130,5 @@ bool rom_image_device::call_load()
-------------------------------------------------*/
void rom_image_device::call_unload()
{
- global_free_array(m_base);
m_base = nullptr;
}
diff --git a/src/devices/bus/cpc/cpc_rom.h b/src/devices/bus/cpc/cpc_rom.h
index b53a94d49d3..ee758aba761 100644
--- a/src/devices/bus/cpc/cpc_rom.h
+++ b/src/devices/bus/cpc/cpc_rom.h
@@ -39,7 +39,7 @@ public:
virtual const char *file_extensions() const override { return "rom,bin"; }
virtual const option_guide *create_option_guide() const override { return nullptr; }
- UINT8* base() { return m_base; }
+ UINT8* base() { return m_base.get(); }
protected:
// device-level overrides
@@ -47,7 +47,7 @@ protected:
virtual void device_start() override;
private:
- UINT8* m_base;
+ std::unique_ptr<UINT8[]> m_base;
};
diff --git a/src/devices/bus/cpc/mface2.cpp b/src/devices/bus/cpc/mface2.cpp
index 3bb01352876..bb4354041bc 100644
--- a/src/devices/bus/cpc/mface2.cpp
+++ b/src/devices/bus/cpc/mface2.cpp
@@ -107,9 +107,9 @@ void cpc_multiface2_device::multiface_rethink_memory()
{
/* set bank addressess */
machine().root_device().membank("bank1")->set_base(multiface_rom);
- machine().root_device().membank("bank2")->set_base(m_multiface_ram);
+ machine().root_device().membank("bank2")->set_base(m_multiface_ram.get());
machine().root_device().membank("bank9")->set_base(multiface_rom);
- machine().root_device().membank("bank10")->set_base(m_multiface_ram);
+ machine().root_device().membank("bank10")->set_base(m_multiface_ram.get());
}
}
@@ -326,7 +326,7 @@ void cpc_multiface2_device::device_start()
m_multiface_flags = MULTIFACE_VISIBLE;
/* allocate ram */
- m_multiface_ram = auto_alloc_array(machine(), UINT8, 8192);
+ m_multiface_ram = std::make_unique<UINT8[]>(8192);
}
//-------------------------------------------------
diff --git a/src/devices/bus/cpc/mface2.h b/src/devices/bus/cpc/mface2.h
index c54e38ec889..c64872af18b 100644
--- a/src/devices/bus/cpc/mface2.h
+++ b/src/devices/bus/cpc/mface2.h
@@ -59,7 +59,7 @@ private:
DIRECT_UPDATE_MEMBER( amstrad_default );
DIRECT_UPDATE_MEMBER( amstrad_multiface_directoverride );
- unsigned char *m_multiface_ram;
+ std::unique_ptr<UINT8[]> m_multiface_ram;
unsigned long m_multiface_flags;
UINT8 m_romdis;
diff --git a/src/devices/bus/cpc/symbfac2.cpp b/src/devices/bus/cpc/symbfac2.cpp
index c80d22da6c6..f64b6cfa131 100644
--- a/src/devices/bus/cpc/symbfac2.cpp
+++ b/src/devices/bus/cpc/symbfac2.cpp
@@ -36,17 +36,17 @@ MACHINE_CONFIG_END
static INPUT_PORTS_START(cpc_symbiface2)
PORT_START("sf2_mouse_x")
- PORT_BIT(0x3f , 0x00, IPT_MOUSE_X) PORT_SENSITIVITY(50) PORT_KEYDELTA(0) PORT_REVERSE PORT_PLAYER(1) PORT_CODE(MOUSECODE_X) PORT_CHANGED_MEMBER(DEVICE_SELF,cpc_symbiface2_device,mouse_change_x,NULL)
+ PORT_BIT(0x3f , 0x00, IPT_MOUSE_X) PORT_SENSITIVITY(50) PORT_KEYDELTA(0) PORT_REVERSE PORT_PLAYER(1) PORT_CODE(MOUSECODE_X) PORT_CHANGED_MEMBER(DEVICE_SELF,cpc_symbiface2_device,mouse_change_x,nullptr)
PORT_START("sf2_mouse_y")
- PORT_BIT(0x3f , 0x00, IPT_MOUSE_Y) PORT_SENSITIVITY(50) PORT_KEYDELTA(0) PORT_PLAYER(1) PORT_CODE(MOUSECODE_Y) PORT_CHANGED_MEMBER(DEVICE_SELF,cpc_symbiface2_device,mouse_change_x,NULL)
+ PORT_BIT(0x3f , 0x00, IPT_MOUSE_Y) PORT_SENSITIVITY(50) PORT_KEYDELTA(0) PORT_PLAYER(1) PORT_CODE(MOUSECODE_Y) PORT_CHANGED_MEMBER(DEVICE_SELF,cpc_symbiface2_device,mouse_change_x,nullptr)
PORT_START("sf2_mouse_buttons")
- PORT_BIT(0x00000001, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("PS/2 Mouse left button") PORT_CODE(MOUSECODE_BUTTON1) PORT_CHANGED_MEMBER(DEVICE_SELF,cpc_symbiface2_device,mouse_change_x,NULL)
- PORT_BIT(0x00000002, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("PS/2 Mouse right button") PORT_CODE(MOUSECODE_BUTTON3) PORT_CHANGED_MEMBER(DEVICE_SELF,cpc_symbiface2_device,mouse_change_x,NULL)
- PORT_BIT(0x00000004, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("PS/2 Mouse middle button") PORT_CODE(MOUSECODE_BUTTON2) PORT_CHANGED_MEMBER(DEVICE_SELF,cpc_symbiface2_device,mouse_change_x,NULL)
- PORT_BIT(0x00000008, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("PS/2 Mouse back button") PORT_CODE(MOUSECODE_BUTTON4) PORT_CHANGED_MEMBER(DEVICE_SELF,cpc_symbiface2_device,mouse_change_x,NULL)
- PORT_BIT(0x00000010, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("PS/2 Mouse forward button") PORT_CODE(MOUSECODE_BUTTON5) PORT_CHANGED_MEMBER(DEVICE_SELF,cpc_symbiface2_device,mouse_change_x,NULL)
+ PORT_BIT(0x00000001, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("PS/2 Mouse left button") PORT_CODE(MOUSECODE_BUTTON1) PORT_CHANGED_MEMBER(DEVICE_SELF,cpc_symbiface2_device,mouse_change_x,nullptr)
+ PORT_BIT(0x00000002, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("PS/2 Mouse right button") PORT_CODE(MOUSECODE_BUTTON3) PORT_CHANGED_MEMBER(DEVICE_SELF,cpc_symbiface2_device,mouse_change_x,nullptr)
+ PORT_BIT(0x00000004, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("PS/2 Mouse middle button") PORT_CODE(MOUSECODE_BUTTON2) PORT_CHANGED_MEMBER(DEVICE_SELF,cpc_symbiface2_device,mouse_change_x,nullptr)
+ PORT_BIT(0x00000008, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("PS/2 Mouse back button") PORT_CODE(MOUSECODE_BUTTON4) PORT_CHANGED_MEMBER(DEVICE_SELF,cpc_symbiface2_device,mouse_change_x,nullptr)
+ PORT_BIT(0x00000010, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("PS/2 Mouse forward button") PORT_CODE(MOUSECODE_BUTTON5) PORT_CHANGED_MEMBER(DEVICE_SELF,cpc_symbiface2_device,mouse_change_x,nullptr)
// TODO: mouse scroll wheel support
// PORT_START("sf2_mouse_scroll")
diff --git a/src/devices/bus/cpc/transtape.cpp b/src/devices/bus/cpc/transtape.cpp
index adb3a152557..680a40890d4 100644
--- a/src/devices/bus/cpc/transtape.cpp
+++ b/src/devices/bus/cpc/transtape.cpp
@@ -29,8 +29,8 @@ const rom_entry *cpc_transtape_device::device_rom_region() const
static INPUT_PORTS_START(cpc_transtape)
PORT_START("transtape")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Red Button") PORT_CODE(KEYCODE_F1) PORT_CHANGED_MEMBER(DEVICE_SELF,cpc_transtape_device,button_red_w,1)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Black Button") PORT_CODE(KEYCODE_F2) PORT_CHANGED_MEMBER(DEVICE_SELF,cpc_transtape_device,button_black_w,1)
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Red Button") PORT_CODE(KEYCODE_F1) PORT_CHANGED_MEMBER(DEVICE_SELF,cpc_transtape_device,button_red_w,nullptr)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Black Button") PORT_CODE(KEYCODE_F2) PORT_CHANGED_MEMBER(DEVICE_SELF,cpc_transtape_device,button_black_w,nullptr)
INPUT_PORTS_END
ioport_constructor cpc_transtape_device::device_input_ports() const
@@ -61,7 +61,7 @@ void cpc_transtape_device::device_start()
m_cpu = static_cast<cpu_device*>(machine().device("maincpu"));
m_space = &m_cpu->space(AS_IO);
- m_ram = auto_alloc_array_clear(machine(), UINT8, 0x2000);
+ m_ram = make_unique_clear<UINT8[]>(0x2000);
m_space->install_write_handler(0xfbf0,0xfbf0,0,0,write8_delegate(FUNC(cpc_transtape_device::output_w),this));
m_space->install_read_handler(0xfbff,0xfbff,0,0,read8_delegate(FUNC(cpc_transtape_device::input_r),this));
@@ -88,10 +88,10 @@ void cpc_transtape_device::map_enable()
}
if(m_output & 0x01) // RAM enable
{
- membank(":bank7")->set_base(m_ram);
- membank(":bank15")->set_base(m_ram);
- membank(":bank8")->set_base(m_ram); // repeats in second 8kB
- membank(":bank16")->set_base(m_ram);
+ membank(":bank7")->set_base(m_ram.get());
+ membank(":bank15")->set_base(m_ram.get());
+ membank(":bank8")->set_base(m_ram.get()); // repeats in second 8kB
+ membank(":bank16")->set_base(m_ram.get());
}
}
diff --git a/src/devices/bus/cpc/transtape.h b/src/devices/bus/cpc/transtape.h
index ec177f8ed7e..bb1a70e6ecc 100644
--- a/src/devices/bus/cpc/transtape.h
+++ b/src/devices/bus/cpc/transtape.h
@@ -41,7 +41,7 @@ private:
cpc_expansion_slot_device *m_slot;
cpu_device* m_cpu;
address_space* m_space;
- UINT8* m_ram; // 8kB internal RAM
+ std::unique_ptr<UINT8[]> m_ram; // 8kB internal RAM
bool m_rom_active;
bool m_romen;
UINT8 m_output;
diff --git a/src/devices/bus/crvision/slot.cpp b/src/devices/bus/crvision/slot.cpp
index 207105ea1d6..74c9eb28645 100644
--- a/src/devices/bus/crvision/slot.cpp
+++ b/src/devices/bus/crvision/slot.cpp
@@ -220,7 +220,7 @@ bool crvision_cart_slot_device::call_load()
bool crvision_cart_slot_device::call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry)
{
- load_software_part_region(*this, swlist, swname, start_entry);
+ machine().rom_load().load_software_part_region(*this, swlist, swname, start_entry);
return TRUE;
}
@@ -229,11 +229,11 @@ bool crvision_cart_slot_device::call_softlist_load(software_list_device &swlist,
get default card software
-------------------------------------------------*/
-void crvision_cart_slot_device::get_default_card_software(std::string &result)
+std::string crvision_cart_slot_device::get_default_card_software()
{
if (open_image_file(mconfig().options()))
{
- const char *slot_string = "crv_rom4k";
+ const char *slot_string;
UINT32 size = core_fsize(m_file);
int type = CRV_4K;
@@ -267,11 +267,10 @@ void crvision_cart_slot_device::get_default_card_software(std::string &result)
//printf("type: %s\n", slot_string);
clear();
- result.assign(slot_string);
- return;
+ return std::string(slot_string);
}
- software_get_default_slot(result, "crv_rom4k");
+ return software_get_default_slot("crv_rom4k");
}
/*-------------------------------------------------
diff --git a/src/devices/bus/crvision/slot.h b/src/devices/bus/crvision/slot.h
index b6da6c165df..d3bb02d6790 100644
--- a/src/devices/bus/crvision/slot.h
+++ b/src/devices/bus/crvision/slot.h
@@ -78,7 +78,7 @@ public:
virtual const char *file_extensions() const override { return "bin,rom"; }
// slot interface overrides
- virtual void get_default_card_software(std::string &result) override;
+ virtual std::string get_default_card_software() override;
// reading and writing
virtual DECLARE_READ8_MEMBER(read_rom40);
diff --git a/src/devices/bus/dmv/k220.cpp b/src/devices/bus/dmv/k220.cpp
index 65e278943e1..cd1c55a39a6 100644
--- a/src/devices/bus/dmv/k220.cpp
+++ b/src/devices/bus/dmv/k220.cpp
@@ -236,8 +236,8 @@ WRITE8_MEMBER( dmv_k220_device::porta_w )
// 74LS247 BCD-to-Seven-Segment Decoder
static UINT8 bcd2hex[] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x58, 0x4c, 0x62, 0x69, 0x78, 0x00 };
- output_set_digit_value(0, bcd2hex[(data >> 4) & 0x0f]);
- output_set_digit_value(1, bcd2hex[data & 0x0f]);
+ machine().output().set_digit_value(0, bcd2hex[(data >> 4) & 0x0f]);
+ machine().output().set_digit_value(1, bcd2hex[data & 0x0f]);
}
diff --git a/src/devices/bus/econet/e01.cpp b/src/devices/bus/econet/e01.cpp
index 162e8c7f6d6..ed60ccc2d28 100644
--- a/src/devices/bus/econet/e01.cpp
+++ b/src/devices/bus/econet/e01.cpp
@@ -482,7 +482,7 @@ void e01_device::device_timer(emu_timer &timer, device_timer_id id, int param, v
READ8_MEMBER( e01_device::read )
{
- UINT8 data = 0;
+ UINT8 data;
if (m_ram_en)
{
@@ -563,7 +563,7 @@ WRITE8_MEMBER( e01_device::floppy_w )
// TODO floppy test
// mode LED
- output_set_value("led_0", BIT(data, 7));
+ machine().output().set_value("led_0", BIT(data, 7));
}
diff --git a/src/devices/bus/econet/e01.h b/src/devices/bus/econet/e01.h
index 07c84969239..e83b9a0b6bd 100644
--- a/src/devices/bus/econet/e01.h
+++ b/src/devices/bus/econet/e01.h
@@ -47,7 +47,6 @@ public:
DECLARE_WRITE8_MEMBER( network_irq_enable_w );
DECLARE_READ8_MEMBER( hdc_data_r );
DECLARE_WRITE8_MEMBER( hdc_data_w );
- DECLARE_READ8_MEMBER( hdc_status_r );
DECLARE_WRITE8_MEMBER( hdc_select_w );
DECLARE_WRITE8_MEMBER( hdc_irq_enable_w );
DECLARE_READ8_MEMBER( rtc_address_r );
diff --git a/src/devices/bus/gameboy/gb_slot.cpp b/src/devices/bus/gameboy/gb_slot.cpp
index e70eb07c6d2..55555a8d4b2 100644
--- a/src/devices/bus/gameboy/gb_slot.cpp
+++ b/src/devices/bus/gameboy/gb_slot.cpp
@@ -262,7 +262,7 @@ bool base_gb_cart_slot_device::call_load()
{
if (m_cart)
{
- UINT32 offset = 0;
+ UINT32 offset;
UINT32 len = (software_entry() == nullptr) ? length() : get_software_region_length("rom");
UINT8 *ROM;
int rambanks = 0;
@@ -457,7 +457,7 @@ void base_gb_cart_slot_device::setup_ram(UINT8 banks)
bool base_gb_cart_slot_device::call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry)
{
- load_software_part_region(*this, swlist, swname, start_entry);
+ machine().rom_load().load_software_part_region(*this, swlist, swname, start_entry);
return true;
}
@@ -600,11 +600,11 @@ int base_gb_cart_slot_device::get_cart_type(UINT8 *ROM, UINT32 len)
get default card software
-------------------------------------------------*/
-void base_gb_cart_slot_device::get_default_card_software(std::string &result)
+std::string base_gb_cart_slot_device::get_default_card_software()
{
if (open_image_file(mconfig().options()))
{
- const char *slot_string = "rom";
+ const char *slot_string;
UINT32 len = core_fsize(m_file), offset = 0;
dynamic_buffer rom(len);
int type;
@@ -623,23 +623,19 @@ void base_gb_cart_slot_device::get_default_card_software(std::string &result)
//printf("type: %s\n", slot_string);
clear();
- result.assign(slot_string);
- return;
+ return std::string(slot_string);
}
- software_get_default_slot(result, "rom");
+ return software_get_default_slot("rom");
}
-void megaduck_cart_slot_device::get_default_card_software(std::string &result)
+std::string megaduck_cart_slot_device::get_default_card_software()
{
if (open_image_file(mconfig().options()))
- {
- result.assign("rom");
- return;
- }
+ return std::string("rom");
- software_get_default_slot(result, "rom");
+ return software_get_default_slot("rom");
}
@@ -793,7 +789,7 @@ void base_gb_cart_slot_device::internal_header_logging(UINT8 *ROM, UINT32 len)
static const int ramsize[8] = { 0, 2, 8, 32, 128, 64, 0, 0 };
char soft[17];
- UINT32 tmp = 0;
+ UINT32 tmp;
int csum = 0, i = 0;
int rom_banks;
diff --git a/src/devices/bus/gameboy/gb_slot.h b/src/devices/bus/gameboy/gb_slot.h
index 3d37b7b11ec..a0108ec03c7 100644
--- a/src/devices/bus/gameboy/gb_slot.h
+++ b/src/devices/bus/gameboy/gb_slot.h
@@ -141,7 +141,7 @@ public:
virtual const char *file_extensions() const override { return "bin,gb,gbc"; }
// slot interface overrides
- virtual void get_default_card_software(std::string &result) override;
+ virtual std::string get_default_card_software() override;
// reading and writing
virtual DECLARE_READ8_MEMBER(read_rom);
@@ -182,7 +182,7 @@ public:
virtual const char *file_extensions() const override { return "bin"; }
// slot interface overrides
- virtual void get_default_card_software(std::string &result) override;
+ virtual std::string get_default_card_software() override;
};
diff --git a/src/devices/bus/gameboy/rom.h b/src/devices/bus/gameboy/rom.h
index 80fedd7a838..343d30195b0 100644
--- a/src/devices/bus/gameboy/rom.h
+++ b/src/devices/bus/gameboy/rom.h
@@ -44,7 +44,7 @@ public:
virtual DECLARE_READ8_MEMBER(read_rom) override;
virtual DECLARE_READ8_MEMBER(read_ram) override;
virtual DECLARE_WRITE8_MEMBER(write_ram) override;
-
+
UINT16 m_tama5_data, m_tama5_addr, m_tama5_cmd;
UINT8 m_regs[32];
UINT8 m_rtc_reg;
diff --git a/src/devices/bus/gba/gba_slot.cpp b/src/devices/bus/gba/gba_slot.cpp
index 4e7c9f62060..217f3f9e954 100644
--- a/src/devices/bus/gba/gba_slot.cpp
+++ b/src/devices/bus/gba/gba_slot.cpp
@@ -245,7 +245,7 @@ void gba_cart_slot_device::call_unload()
bool gba_cart_slot_device::call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry)
{
- load_software_part_region(*this, swlist, swname, start_entry);
+ machine().rom_load().load_software_part_region(*this, swlist, swname, start_entry);
return TRUE;
}
@@ -400,11 +400,11 @@ int gba_cart_slot_device::get_cart_type(UINT8 *ROM, UINT32 len)
get default card software
-------------------------------------------------*/
-void gba_cart_slot_device::get_default_card_software(std::string &result)
+std::string gba_cart_slot_device::get_default_card_software()
{
if (open_image_file(mconfig().options()))
{
- const char *slot_string = "gba_rom";
+ const char *slot_string;
UINT32 len = core_fsize(m_file);
dynamic_buffer rom(len);
int type;
@@ -417,11 +417,10 @@ void gba_cart_slot_device::get_default_card_software(std::string &result)
//printf("type: %s\n", slot_string);
clear();
- result.assign(slot_string);
- return;
+ return std::string(slot_string);
}
- software_get_default_slot(result, "gba_rom");
+ return software_get_default_slot("gba_rom");
}
/*-------------------------------------------------
diff --git a/src/devices/bus/gba/gba_slot.h b/src/devices/bus/gba/gba_slot.h
index 107334004ac..9d9a6a48be7 100644
--- a/src/devices/bus/gba/gba_slot.h
+++ b/src/devices/bus/gba/gba_slot.h
@@ -76,7 +76,6 @@ public:
int get_type() { return m_type; }
int get_cart_type(UINT8 *ROM, UINT32 len);
- void setup_ram(UINT8 banks);
void internal_header_logging(UINT8 *ROM, UINT32 len);
void save_nvram() { if (m_cart && m_cart->get_nvram_size()) m_cart->save_nvram(); }
@@ -92,7 +91,7 @@ public:
virtual const char *file_extensions() const override { return "gba,bin"; }
// slot interface overrides
- virtual void get_default_card_software(std::string &result) override;
+ virtual std::string get_default_card_software() override;
// reading and writing
virtual DECLARE_READ32_MEMBER(read_rom);
diff --git a/src/devices/bus/generic/slot.cpp b/src/devices/bus/generic/slot.cpp
index 40a32ffcecd..4f3af4df411 100644
--- a/src/devices/bus/generic/slot.cpp
+++ b/src/devices/bus/generic/slot.cpp
@@ -169,7 +169,7 @@ void generic_slot_device::call_unload()
bool generic_slot_device::call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry)
{
- load_software_part_region(*this, swlist, swname, start_entry);
+ machine().rom_load().load_software_part_region(*this, swlist, swname, start_entry);
return TRUE;
}
@@ -179,9 +179,9 @@ bool generic_slot_device::call_softlist_load(software_list_device &swlist, const
get default card software
-------------------------------------------------*/
-void generic_slot_device::get_default_card_software(std::string &result)
+std::string generic_slot_device::get_default_card_software()
{
- software_get_default_slot(result, m_default_card);
+ return software_get_default_slot(m_default_card);
}
diff --git a/src/devices/bus/generic/slot.h b/src/devices/bus/generic/slot.h
index bf3833558da..6a12c1cd84c 100644
--- a/src/devices/bus/generic/slot.h
+++ b/src/devices/bus/generic/slot.h
@@ -124,7 +124,7 @@ public:
virtual const char *file_extensions() const override { return m_extensions; }
// slot interface overrides
- virtual void get_default_card_software(std::string &result) override;
+ virtual std::string get_default_card_software() override;
// reading and writing
virtual DECLARE_READ8_MEMBER(read_rom);
diff --git a/src/devices/bus/ieee488/c2031.cpp b/src/devices/bus/ieee488/c2031.cpp
index 0cc16925615..0e455c35b67 100644
--- a/src/devices/bus/ieee488/c2031.cpp
+++ b/src/devices/bus/ieee488/c2031.cpp
@@ -259,7 +259,7 @@ WRITE8_MEMBER( c2031_device::via1_pb_w )
m_ga->stp_w(data & 0x03);
// activity LED
- output_set_led_value(LED_ACT, BIT(data, 3));
+ machine().output().set_led_value(LED_ACT, BIT(data, 3));
// density select
m_ga->ds_w((data >> 5) & 0x03);
diff --git a/src/devices/bus/ieee488/c2040.cpp b/src/devices/bus/ieee488/c2040.cpp
index 7b73a31ed2d..55dd8f9a072 100644
--- a/src/devices/bus/ieee488/c2040.cpp
+++ b/src/devices/bus/ieee488/c2040.cpp
@@ -363,13 +363,13 @@ WRITE8_MEMBER( c2040_t::riot1_pb_w )
*/
// activity led 1
- output_set_led_value(LED_ACT1, BIT(data, 3));
+ machine().output().set_led_value(LED_ACT1, BIT(data, 3));
// activity led 0
- output_set_led_value(LED_ACT0, BIT(data, 4));
+ machine().output().set_led_value(LED_ACT0, BIT(data, 4));
// error led
- output_set_led_value(LED_ERR, BIT(data, 5));
+ machine().output().set_led_value(LED_ERR, BIT(data, 5));
}
diff --git a/src/devices/bus/ieee488/c2040.h b/src/devices/bus/ieee488/c2040.h
index ef62555f1b9..74539e6524d 100644
--- a/src/devices/bus/ieee488/c2040.h
+++ b/src/devices/bus/ieee488/c2040.h
@@ -47,8 +47,6 @@ public:
DECLARE_READ8_MEMBER( riot1_pb_r );
DECLARE_WRITE8_MEMBER( riot1_pb_w );
DECLARE_WRITE8_MEMBER( via_pb_w );
- DECLARE_WRITE_LINE_MEMBER( mode_sel_w );
- DECLARE_WRITE_LINE_MEMBER( rw_sel_w );
DECLARE_FLOPPY_FORMATS( floppy_formats );
diff --git a/src/devices/bus/ieee488/c8050.cpp b/src/devices/bus/ieee488/c8050.cpp
index 4884e214bcd..ead9fad37a5 100644
--- a/src/devices/bus/ieee488/c8050.cpp
+++ b/src/devices/bus/ieee488/c8050.cpp
@@ -410,13 +410,13 @@ WRITE8_MEMBER( c8050_t::riot1_pb_w )
*/
// activity led 1
- output_set_led_value(LED_ACT1, BIT(data, 3));
+ machine().output().set_led_value(LED_ACT1, BIT(data, 3));
// activity led 0
- output_set_led_value(LED_ACT0, BIT(data, 4));
+ machine().output().set_led_value(LED_ACT0, BIT(data, 4));
// error led
- output_set_led_value(LED_ERR, BIT(data, 5));
+ machine().output().set_led_value(LED_ERR, BIT(data, 5));
}
WRITE8_MEMBER( c8050_t::via_pb_w )
diff --git a/src/devices/bus/ieee488/c8050.h b/src/devices/bus/ieee488/c8050.h
index 3dd65dfc742..71bd9ae42cf 100644
--- a/src/devices/bus/ieee488/c8050.h
+++ b/src/devices/bus/ieee488/c8050.h
@@ -47,8 +47,6 @@ public:
DECLARE_READ8_MEMBER( riot1_pb_r );
DECLARE_WRITE8_MEMBER( riot1_pb_w );
DECLARE_WRITE8_MEMBER( via_pb_w );
- DECLARE_READ8_MEMBER( pi_r );
- DECLARE_WRITE8_MEMBER( pi_w );
DECLARE_FLOPPY_FORMATS( floppy_formats );
diff --git a/src/devices/bus/ieee488/c8280.cpp b/src/devices/bus/ieee488/c8280.cpp
index 29ade86c570..05c39c7ffdd 100644
--- a/src/devices/bus/ieee488/c8280.cpp
+++ b/src/devices/bus/ieee488/c8280.cpp
@@ -266,13 +266,13 @@ WRITE8_MEMBER( c8280_t::riot1_pb_w )
*/
// activity led 1
- output_set_led_value(LED_ACT1, BIT(data, 3));
+ machine().output().set_led_value(LED_ACT1, BIT(data, 3));
// activity led 0
- output_set_led_value(LED_ACT0, BIT(data, 4));
+ machine().output().set_led_value(LED_ACT0, BIT(data, 4));
// error led
- output_set_led_value(LED_ERR, BIT(data, 5));
+ machine().output().set_led_value(LED_ERR, BIT(data, 5));
}
static SLOT_INTERFACE_START( c8280_floppies )
diff --git a/src/devices/bus/ieee488/d9060.cpp b/src/devices/bus/ieee488/d9060.cpp
index 3260ab80a08..68b63589ed9 100644
--- a/src/devices/bus/ieee488/d9060.cpp
+++ b/src/devices/bus/ieee488/d9060.cpp
@@ -302,13 +302,13 @@ WRITE8_MEMBER( d9060_base_t::riot1_pb_w )
*/
// ready led
- output_set_led_value(LED_READY, BIT(data, 4));
+ machine().output().set_led_value(LED_READY, BIT(data, 4));
// power led
- output_set_led_value(LED_POWER, BIT(data, 5));
+ machine().output().set_led_value(LED_POWER, BIT(data, 5));
// error led
- output_set_led_value(LED_ERROR, !BIT(data, 5));
+ machine().output().set_led_value(LED_ERROR, !BIT(data, 5));
}
diff --git a/src/devices/bus/ieee488/d9060.h b/src/devices/bus/ieee488/d9060.h
index e5681dae310..104daec4a11 100644
--- a/src/devices/bus/ieee488/d9060.h
+++ b/src/devices/bus/ieee488/d9060.h
@@ -52,7 +52,6 @@ public:
DECLARE_WRITE8_MEMBER( riot1_pa_w );
DECLARE_READ8_MEMBER( riot1_pb_r );
DECLARE_WRITE8_MEMBER( riot1_pb_w );
- DECLARE_READ8_MEMBER( via_pb_r );
DECLARE_WRITE8_MEMBER( via_pb_w );
DECLARE_WRITE_LINE_MEMBER( ack_w );
DECLARE_WRITE_LINE_MEMBER( enable_w );
diff --git a/src/devices/bus/ieee488/hardbox.cpp b/src/devices/bus/ieee488/hardbox.cpp
index 83dc8caa150..c03f147250d 100644
--- a/src/devices/bus/ieee488/hardbox.cpp
+++ b/src/devices/bus/ieee488/hardbox.cpp
@@ -254,9 +254,9 @@ WRITE8_MEMBER( hardbox_device::ppi1_pc_w )
*/
- output_set_led_value(LED_A, !BIT(data, 0));
- output_set_led_value(LED_B, !BIT(data, 1));
- output_set_led_value(LED_READY, !BIT(data, 2));
+ machine().output().set_led_value(LED_A, !BIT(data, 0));
+ machine().output().set_led_value(LED_B, !BIT(data, 1));
+ machine().output().set_led_value(LED_READY, !BIT(data, 2));
}
//-------------------------------------------------
diff --git a/src/devices/bus/ieee488/softbox.cpp b/src/devices/bus/ieee488/softbox.cpp
index 02d75d19a34..0536b4aba07 100644
--- a/src/devices/bus/ieee488/softbox.cpp
+++ b/src/devices/bus/ieee488/softbox.cpp
@@ -212,9 +212,9 @@ WRITE8_MEMBER( softbox_device::ppi1_pc_w )
*/
- output_set_led_value(LED_A, !BIT(data, 0));
- output_set_led_value(LED_B, !BIT(data, 1));
- output_set_led_value(LED_READY, !BIT(data, 2));
+ machine().output().set_led_value(LED_A, !BIT(data, 0));
+ machine().output().set_led_value(LED_B, !BIT(data, 1));
+ machine().output().set_led_value(LED_READY, !BIT(data, 2));
}
static DEVICE_INPUT_DEFAULTS_START( terminal )
diff --git a/src/devices/bus/imi7000/imi7000.h b/src/devices/bus/imi7000/imi7000.h
index 391899a63f9..e374fedb6d9 100644
--- a/src/devices/bus/imi7000/imi7000.h
+++ b/src/devices/bus/imi7000/imi7000.h
@@ -76,8 +76,6 @@ public:
// construction/destruction
imi7000_bus_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
- void add_device(imi7000_slot_device *slot, device_t *target);
-
protected:
// device-level overrides
virtual void device_start() override;
diff --git a/src/devices/bus/intv/ecs.cpp b/src/devices/bus/intv/ecs.cpp
index b855bb73143..b9da2d9803b 100644
--- a/src/devices/bus/intv/ecs.cpp
+++ b/src/devices/bus/intv/ecs.cpp
@@ -138,12 +138,24 @@ UINT8 intv_ecs_device::intv_control_r(int hand)
}
}
- switch ((m_options->read() >> hand) & 4)
+ y = (m_options->read() >> ((hand + 2) * 2)) & 3;
+ switch (y)
{
- case 0: /* disc == digital */
+ case 0: /* disc == digital 8-way */
+ case 1: /* disc == digital 16-way */
default:
x = m_disc[hand]->read();
+ if (!!x && (!y || !(x & 0x7777)))
+ {
+ // merge cardinals to form true diagonals
+ y = ((x >> 2) & (x << 2)) | ((x >> (16 - 2)) & (x >> 2));
+ x = y | (x & ~((y << 2) | (y >> 2) | (y << (16 - 2))));
+ }
+
+ // only one disc direction is allowed
+ x &= -x;
+
for (y = 0; y < 16; y++)
{
if (x & (1 << y))
@@ -153,7 +165,7 @@ UINT8 intv_ecs_device::intv_control_r(int hand)
}
break;
- case 4: /* disc == _fake_ analog */
+ case 2: /* disc == _fake_ analog */
x = m_discx[hand]->read();
y = m_discy[hand]->read();
@@ -417,89 +429,89 @@ INPUT_PORTS_END
static INPUT_PORTS_START( intv_ecs_pads )
// First ECS Hand Controller
PORT_START("KEYPAD.0")
- PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P3/1") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P3/2") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P3/3") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P3/4") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P3/5") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P3/6") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P3/7") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P3/8") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P3/9") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P3/Clear") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P3/0") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P3/Enter") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P3/Upper") PORT_PLAYER(3) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P3/Lower-Left") PORT_PLAYER(3) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P3/Lower-Right") PORT_PLAYER(3) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
+ PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P3 1") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
+ PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P3 2") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
+ PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P3 3") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
+ PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P3 4") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
+ PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P3 5") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
+ PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P3 6") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
+ PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P3 7") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
+ PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P3 8") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
+ PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P3 9") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
+ PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P3 Clear") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P3 0") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P3 Enter") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
+ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P3 Upper") PORT_PLAYER(3) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P3 Lower-Left") PORT_PLAYER(3) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P3 Lower-Right") PORT_PLAYER(3) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("DISC.0")
- PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_NAME("P3/Up") PORT_PLAYER(3) PORT_CONDITION("OPTIONS",0x04,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P3/Up-Up-Right") PORT_CONDITION("OPTIONS",0x04,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P3/Right") PORT_CONDITION("OPTIONS",0x04,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P3/Right-Up-Right") PORT_CONDITION("OPTIONS",0x04,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_NAME("P3/Right") PORT_PLAYER(3) PORT_CONDITION("OPTIONS",0x04,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P3/Right-Down-Right") PORT_CONDITION("OPTIONS",0x04,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P3/Down-Right") PORT_CONDITION("OPTIONS",0x04,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P3/Down-Down-Right") PORT_CONDITION("OPTIONS",0x04,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_NAME("P3/Down") PORT_PLAYER(3) PORT_CONDITION("OPTIONS",0x04,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P3/Down-Down-Left") PORT_CONDITION("OPTIONS",0x04,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P3/Down-Left") PORT_CONDITION("OPTIONS",0x04,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P3/Left-Down-Left") PORT_CONDITION("OPTIONS",0x04,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_NAME("P3/Left") PORT_PLAYER(3) PORT_CONDITION("OPTIONS",0x04,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P3/Left-Up-Left") PORT_CONDITION("OPTIONS",0x04,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P3/Up-Left") PORT_CONDITION("OPTIONS",0x04,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P3/Up-Up-Left") PORT_CONDITION("OPTIONS",0x04,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
+ PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_NAME("P3 Up") PORT_PLAYER(3) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) PORT_CONDITION("OPTIONS",0x30,NOTEQUALS,0x20)
+ PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P3 Up-Up-Right") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) PORT_CONDITION("OPTIONS",0x30,EQUALS,0x10)
+ PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P3 Up-Right") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) PORT_CONDITION("OPTIONS",0x30,EQUALS,0x10)
+ PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P3 Right-Up-Right") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) PORT_CONDITION("OPTIONS",0x30,EQUALS,0x10)
+ PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_NAME("P3 Right") PORT_PLAYER(3) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) PORT_CONDITION("OPTIONS",0x30,NOTEQUALS,0x20)
+ PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P3 Right-Down-Right") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) PORT_CONDITION("OPTIONS",0x30,EQUALS,0x10)
+ PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P3 Down-Right") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) PORT_CONDITION("OPTIONS",0x30,EQUALS,0x10)
+ PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P3 Down-Down-Right") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) PORT_CONDITION("OPTIONS",0x30,EQUALS,0x10)
+ PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_NAME("P3 Down") PORT_PLAYER(3) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) PORT_CONDITION("OPTIONS",0x30,NOTEQUALS,0x20)
+ PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P3 Down-Down-Left") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) PORT_CONDITION("OPTIONS",0x30,EQUALS,0x10)
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P3 Down-Left") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) PORT_CONDITION("OPTIONS",0x30,EQUALS,0x10)
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P3 Left-Down-Left") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) PORT_CONDITION("OPTIONS",0x30,EQUALS,0x10)
+ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_NAME("P3 Left") PORT_PLAYER(3) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) PORT_CONDITION("OPTIONS",0x30,NOTEQUALS,0x20)
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P3 Left-Up-Left") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) PORT_CONDITION("OPTIONS",0x30,EQUALS,0x10)
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P3 Up-Left") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) PORT_CONDITION("OPTIONS",0x30,EQUALS,0x10)
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P3 Up-Up-Left") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) PORT_CONDITION("OPTIONS",0x30,EQUALS,0x10)
PORT_START("DISCX.0")
- PORT_BIT( 0xff, 0x50, IPT_AD_STICK_X ) PORT_NAME("P3/X") PORT_MINMAX(0x00,0x9f) PORT_SENSITIVITY(100) PORT_KEYDELTA(0x50) PORT_PLAYER(3) PORT_CONDITION("OPTIONS",0x04,EQUALS,0x04) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
+ PORT_BIT( 0xff, 0x50, IPT_AD_STICK_X ) PORT_NAME("P3 X") PORT_MINMAX(0x00,0x9f) PORT_SENSITIVITY(100) PORT_KEYDELTA(0x50) PORT_PLAYER(3) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) PORT_CONDITION("OPTIONS",0x30,EQUALS,0x20)
PORT_START("DISCY.0")
- PORT_BIT( 0xff, 0x50, IPT_AD_STICK_Y ) PORT_NAME("P3/Y") PORT_MINMAX(0x00,0x9f) PORT_SENSITIVITY(100) PORT_KEYDELTA(0x50) PORT_PLAYER(3) PORT_CONDITION("OPTIONS",0x04,EQUALS,0x04) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
+ PORT_BIT( 0xff, 0x50, IPT_AD_STICK_Y ) PORT_NAME("P3 Y") PORT_MINMAX(0x00,0x9f) PORT_SENSITIVITY(100) PORT_KEYDELTA(0x50) PORT_PLAYER(3) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) PORT_CONDITION("OPTIONS",0x30,EQUALS,0x20)
// Second ECS Hand Controller
PORT_START("KEYPAD.1")
- PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P4/1") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P4/2") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P4/3") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P4/4") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P4/5") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P4/6") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P4/7") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P4/8") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P4/9") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P4/Clear") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P4/0") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P4/Enter") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P4/Upper") PORT_PLAYER(4) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P4/Lower-Left") PORT_PLAYER(4) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P4/Lower-Right") PORT_PLAYER(4) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
+ PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P4 1") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
+ PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P4 2") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
+ PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P4 3") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
+ PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P4 4") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
+ PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P4 5") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
+ PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P4 6") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
+ PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P4 7") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
+ PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P4 8") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
+ PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P4 9") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
+ PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P4 Clear") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P4 0") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P4 Enter") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
+ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P4 Upper") PORT_PLAYER(4) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P4 Lower-Left") PORT_PLAYER(4) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P4 Lower-Right") PORT_PLAYER(4) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("DISC.1")
- PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_NAME("P4/Up") PORT_PLAYER(4) PORT_CONDITION("OPTIONS",0x08,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P4/Up-Up-Right") PORT_CONDITION("OPTIONS",0x08,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P4/Up-Right") PORT_CONDITION("OPTIONS",0x08,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P4/Right-Up-Right") PORT_CONDITION("OPTIONS",0x08,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_NAME("P4/Right") PORT_PLAYER(4) PORT_CONDITION("OPTIONS",0x08,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P4/Right-Down-Right") PORT_CONDITION("OPTIONS",0x08,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P4/Down-Right") PORT_CONDITION("OPTIONS",0x08,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P4/Down-Down-Right") PORT_CONDITION("OPTIONS",0x08,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_NAME("P4/Down") PORT_PLAYER(4) PORT_CONDITION("OPTIONS",0x08,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P4/Down-Down-Left") PORT_CONDITION("OPTIONS",0x08,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P4/Down-Left") PORT_CONDITION("OPTIONS",0x08,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P4/Left-Down-Left") PORT_CONDITION("OPTIONS",0x08,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_NAME("P4/Left") PORT_PLAYER(4) PORT_CONDITION("OPTIONS",0x08,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P4/Left-Up-Left") PORT_CONDITION("OPTIONS",0x08,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P4/Up-Left") PORT_CONDITION("OPTIONS",0x08,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P4/Up-Up-Left") PORT_CONDITION("OPTIONS",0x08,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
+ PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_NAME("P4 Up") PORT_PLAYER(4) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) PORT_CONDITION("OPTIONS",0xC0,NOTEQUALS,0x80)
+ PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P4 Up-Up-Right") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) PORT_CONDITION("OPTIONS",0xC0,EQUALS,0x40)
+ PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P4 Up-Right") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) PORT_CONDITION("OPTIONS",0xC0,EQUALS,0x40)
+ PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P4 Right-Up-Right") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) PORT_CONDITION("OPTIONS",0xC0,EQUALS,0x40)
+ PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_NAME("P4 Right") PORT_PLAYER(4) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) PORT_CONDITION("OPTIONS",0xC0,NOTEQUALS,0x80)
+ PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P4 Right-Down-Right") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) PORT_CONDITION("OPTIONS",0xC0,EQUALS,0x40)
+ PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P4 Down-Right") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) PORT_CONDITION("OPTIONS",0xC0,EQUALS,0x40)
+ PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P4 Down-Down-Right") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) PORT_CONDITION("OPTIONS",0xC0,EQUALS,0x40)
+ PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_NAME("P4 Down") PORT_PLAYER(4) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) PORT_CONDITION("OPTIONS",0xC0,NOTEQUALS,0x80)
+ PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P4 Down-Down-Left") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) PORT_CONDITION("OPTIONS",0xC0,EQUALS,0x40)
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P4 Down-Left") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) PORT_CONDITION("OPTIONS",0xC0,EQUALS,0x40)
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P4 Left-Down-Left") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) PORT_CONDITION("OPTIONS",0xC0,EQUALS,0x40)
+ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_NAME("P4 Left") PORT_PLAYER(4) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) PORT_CONDITION("OPTIONS",0xC0,NOTEQUALS,0x80)
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P4 Left-Up-Left") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) PORT_CONDITION("OPTIONS",0xC0,EQUALS,0x40)
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P4 Up-Left") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) PORT_CONDITION("OPTIONS",0xC0,EQUALS,0x40)
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P4 Up-Up-Left") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) PORT_CONDITION("OPTIONS",0xC0,EQUALS,0x40)
PORT_START("DISCX.1")
- PORT_BIT( 0xff, 0x50, IPT_AD_STICK_X ) PORT_NAME("P4/X") PORT_MINMAX(0x00,0x9f) PORT_SENSITIVITY(100) PORT_KEYDELTA(0x50) PORT_CODE_DEC(KEYCODE_D) PORT_CODE_INC(KEYCODE_G) PORT_PLAYER(4) PORT_CONDITION("OPTIONS",0x08,EQUALS,0x08) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
+ PORT_BIT( 0xff, 0x50, IPT_AD_STICK_X ) PORT_NAME("P4 X") PORT_MINMAX(0x00,0x9f) PORT_SENSITIVITY(100) PORT_KEYDELTA(0x50) PORT_CODE_DEC(KEYCODE_D) PORT_CODE_INC(KEYCODE_G) PORT_PLAYER(4) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) PORT_CONDITION("OPTIONS",0xC0,EQUALS,0x80)
PORT_START("DISCY.1")
- PORT_BIT( 0xff, 0x50, IPT_AD_STICK_Y ) PORT_NAME("P4/Y") PORT_MINMAX(0x00,0x9f) PORT_SENSITIVITY(100) PORT_KEYDELTA(0x50) PORT_CODE_DEC(KEYCODE_R) PORT_CODE_INC(KEYCODE_F) PORT_PLAYER(4) PORT_CONDITION("OPTIONS",0x08,EQUALS,0x08) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
+ PORT_BIT( 0xff, 0x50, IPT_AD_STICK_Y ) PORT_NAME("P4 Y") PORT_MINMAX(0x00,0x9f) PORT_SENSITIVITY(100) PORT_KEYDELTA(0x50) PORT_CODE_DEC(KEYCODE_R) PORT_CODE_INC(KEYCODE_F) PORT_PLAYER(4) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) PORT_CONDITION("OPTIONS",0xC0,EQUALS,0x80)
INPUT_PORTS_END
static INPUT_PORTS_START( intv_ecs )
@@ -508,12 +520,14 @@ static INPUT_PORTS_START( intv_ecs )
PORT_INCLUDE( intv_ecs_kbd )
PORT_START("OPTIONS")
- PORT_CONFNAME( 0x04, 0x00, "ECS_P3 Disc" ) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_CONFSETTING( 0x00, "Digital" )
- PORT_CONFSETTING( 0x04, "Analog" )
- PORT_CONFNAME( 0x08, 0x00, "ECS_P4 Disc" ) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
- PORT_CONFSETTING( 0x00, "Digital" )
- PORT_CONFSETTING( 0x08, "Analog" )
+ PORT_CONFNAME( 0x30, 0x00, "ECS P3 Disc" ) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
+ PORT_CONFSETTING( 0x00, "Digital 8-way" )
+ PORT_CONFSETTING( 0x10, "Digital 16-way" )
+ PORT_CONFSETTING( 0x20, "Analog" )
+ PORT_CONFNAME( 0xC0, 0x00, "ECS P4 Disc" ) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00)
+ PORT_CONFSETTING( 0x00, "Digital 8-way" )
+ PORT_CONFSETTING( 0x40, "Digital 16-way" )
+ PORT_CONFSETTING( 0x80, "Analog" )
PORT_START("CNTRLSEL")
PORT_CONFNAME( 0x0F, 0x02, "ECS Controller")
diff --git a/src/devices/bus/intv/slot.cpp b/src/devices/bus/intv/slot.cpp
index 05e55e49318..87f36e14bac 100644
--- a/src/devices/bus/intv/slot.cpp
+++ b/src/devices/bus/intv/slot.cpp
@@ -409,8 +409,8 @@ bool intv_cart_slot_device::call_load()
if (m_type == INTV_WSMLB)
extra_bank = true;
- UINT32 size = 0;
- UINT16 address = 0;
+ UINT32 size;
+ UINT16 address;
UINT8 *ROM, *region;
m_cart->rom_alloc(extra_bank ? 0x22000 : 0x20000, tag());
@@ -450,7 +450,7 @@ bool intv_cart_slot_device::call_load()
bool intv_cart_slot_device::call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry)
{
- load_software_part_region(*this, swlist, swname, start_entry);
+ machine().rom_load().load_software_part_region(*this, swlist, swname, start_entry);
return TRUE;
}
@@ -459,11 +459,11 @@ bool intv_cart_slot_device::call_softlist_load(software_list_device &swlist, con
get default card software
-------------------------------------------------*/
-void intv_cart_slot_device::get_default_card_software(std::string &result)
+std::string intv_cart_slot_device::get_default_card_software()
{
if (open_image_file(mconfig().options()))
{
- const char *slot_string = "intv_rom";
+ const char *slot_string;
UINT32 len = core_fsize(m_file);
dynamic_buffer rom(len);
int type = INTV_STD;
@@ -503,10 +503,9 @@ void intv_cart_slot_device::get_default_card_software(std::string &result)
//printf("type: %s\n", slot_string);
clear();
- result.assign(slot_string);
- return;
+ return std::string(slot_string);
}
- software_get_default_slot(result, "intv_rom");
+ return software_get_default_slot("intv_rom");
}
/*-------------------------------------------------
diff --git a/src/devices/bus/intv/slot.h b/src/devices/bus/intv/slot.h
index 865866ca2e0..7d970f18a52 100644
--- a/src/devices/bus/intv/slot.h
+++ b/src/devices/bus/intv/slot.h
@@ -120,7 +120,7 @@ public:
virtual const char *file_extensions() const override { return "bin,int,rom,itv"; }
// slot interface overrides
- virtual void get_default_card_software(std::string &result) override;
+ virtual std::string get_default_card_software() override;
// reading and writing
virtual DECLARE_READ16_MEMBER(read_rom04) { if (m_cart) return m_cart->read_rom04(space, offset, mem_mask); else return 0xffff; }
diff --git a/src/devices/bus/iq151/iq151.cpp b/src/devices/bus/iq151/iq151.cpp
index de7f9355cb3..3d4ef7abe05 100644
--- a/src/devices/bus/iq151/iq151.cpp
+++ b/src/devices/bus/iq151/iq151.cpp
@@ -167,7 +167,7 @@ bool iq151cart_slot_device::call_load()
{
if (m_cart)
{
- offs_t read_length = 0;
+ offs_t read_length;
UINT8 *cart_base = m_cart->get_cart_base();
if (cart_base != nullptr)
@@ -196,7 +196,7 @@ bool iq151cart_slot_device::call_load()
bool iq151cart_slot_device::call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry)
{
- load_software_part_region(*this, swlist, swname, start_entry );
+ machine().rom_load().load_software_part_region(*this, swlist, swname, start_entry );
return TRUE;
}
@@ -204,7 +204,7 @@ bool iq151cart_slot_device::call_softlist_load(software_list_device &swlist, con
get default card software
-------------------------------------------------*/
-void iq151cart_slot_device::get_default_card_software(std::string &result)
+std::string iq151cart_slot_device::get_default_card_software()
{
- software_get_default_slot(result, "basic6");
+ return software_get_default_slot("basic6");
}
diff --git a/src/devices/bus/iq151/iq151.h b/src/devices/bus/iq151/iq151.h
index c88948c925c..292362f0d45 100644
--- a/src/devices/bus/iq151/iq151.h
+++ b/src/devices/bus/iq151/iq151.h
@@ -106,7 +106,7 @@ public:
virtual const option_guide *create_option_guide() const override { return nullptr; }
// slot interface overrides
- virtual void get_default_card_software(std::string &result) override;
+ virtual std::string get_default_card_software() override;
// reading and writing
virtual void read(offs_t offset, UINT8 &data);
diff --git a/src/devices/bus/iq151/minigraf.cpp b/src/devices/bus/iq151/minigraf.cpp
index ca4ffdcc463..1a8e9d182a0 100644
--- a/src/devices/bus/iq151/minigraf.cpp
+++ b/src/devices/bus/iq151/minigraf.cpp
@@ -62,7 +62,7 @@ void iq151_minigraf_device::device_start()
m_rom = (UINT8*)memregion("minigraf")->base();
// allocate a bitmap for represent the paper
- m_paper = auto_bitmap_ind16_alloc(machine(), PAPER_WIDTH, PAPER_HEIGHT);
+ m_paper = std::make_unique<bitmap_ind16>(PAPER_WIDTH, PAPER_HEIGHT);
m_paper->fill(0);
m_pen = 0;
diff --git a/src/devices/bus/iq151/minigraf.h b/src/devices/bus/iq151/minigraf.h
index 311d79e97f1..6632fa31aa4 100644
--- a/src/devices/bus/iq151/minigraf.h
+++ b/src/devices/bus/iq151/minigraf.h
@@ -46,7 +46,7 @@ private:
UINT8 m_pen;
UINT8 m_control;
- bitmap_ind16 * m_paper;
+ std::unique_ptr<bitmap_ind16> m_paper;
};
diff --git a/src/devices/bus/iq151/ms151a.cpp b/src/devices/bus/iq151/ms151a.cpp
index 1a4ee73d586..99da92c6d61 100644
--- a/src/devices/bus/iq151/ms151a.cpp
+++ b/src/devices/bus/iq151/ms151a.cpp
@@ -61,7 +61,7 @@ void iq151_ms151a_device::device_start()
m_rom = (UINT8*)memregion("ms151a")->base();
// allocate a bitmap for represent the paper
- m_paper = auto_bitmap_ind16_alloc(machine(), PAPER_WIDTH, PAPER_HEIGHT);
+ m_paper = std::make_unique<bitmap_ind16>(PAPER_WIDTH, PAPER_HEIGHT);
m_paper->fill(0);
m_pen = 0;
diff --git a/src/devices/bus/iq151/ms151a.h b/src/devices/bus/iq151/ms151a.h
index 528ce9a9554..1d794e1081d 100644
--- a/src/devices/bus/iq151/ms151a.h
+++ b/src/devices/bus/iq151/ms151a.h
@@ -46,7 +46,7 @@ private:
INT32 m_posy;
UINT8 m_pen;
- bitmap_ind16 * m_paper;
+ std::unique_ptr<bitmap_ind16> m_paper;
};
diff --git a/src/devices/bus/iq151/video32.cpp b/src/devices/bus/iq151/video32.cpp
index b5d6a76681f..a5ce59a51db 100644
--- a/src/devices/bus/iq151/video32.cpp
+++ b/src/devices/bus/iq151/video32.cpp
@@ -75,7 +75,7 @@ void iq151_video32_device::device_start()
m_videoram = (UINT8*)memregion("videoram")->base();
m_chargen = (UINT8*)memregion("chargen")->base();
- m_gfxdecode->set_gfx(0, global_alloc(gfx_element(m_palette, iq151_video32_charlayout, m_chargen, 0, 1, 0)));
+ m_gfxdecode->set_gfx(0, std::make_unique<gfx_element>(m_palette, iq151_video32_charlayout, m_chargen, 0, 1, 0));
}
//-------------------------------------------------
diff --git a/src/devices/bus/iq151/video64.cpp b/src/devices/bus/iq151/video64.cpp
index ec5e82ff645..d58cca76aec 100644
--- a/src/devices/bus/iq151/video64.cpp
+++ b/src/devices/bus/iq151/video64.cpp
@@ -74,7 +74,7 @@ void iq151_video64_device::device_start()
m_videoram = (UINT8*)memregion("videoram")->base();
m_chargen = (UINT8*)memregion("chargen")->base();
- m_gfxdecode->set_gfx(0,global_alloc(gfx_element(m_palette, iq151_video64_charlayout, m_chargen, 0, 1, 0)));
+ m_gfxdecode->set_gfx(0,std::make_unique<gfx_element>(m_palette, iq151_video64_charlayout, m_chargen, 0, 1, 0));
}
//-------------------------------------------------
diff --git a/src/devices/bus/isa/3c505.h b/src/devices/bus/isa/3c505.h
index 36b90369540..e31317792da 100644
--- a/src/devices/bus/isa/3c505.h
+++ b/src/devices/bus/isa/3c505.h
@@ -212,8 +212,6 @@ private:
void log_command();
void log_response();
- void log_tx_data();
- void log_rx_data();
void do_receive_command();
void set_command_pending(int onoff);
diff --git a/src/devices/bus/isa/aga.cpp b/src/devices/bus/isa/aga.cpp
index 8149486ae7e..9146f2ce581 100644
--- a/src/devices/bus/isa/aga.cpp
+++ b/src/devices/bus/isa/aga.cpp
@@ -107,7 +107,7 @@ void isa8_aga_device::device_start()
m_mode = AGA_COLOR;
m_mda_chr_gen = memregion("gfx1")->base() + 0x1000;
m_cga_chr_gen = memregion("gfx1")->base();
- m_videoram = auto_alloc_array(machine(), UINT8, 0x10000);
+ m_videoram = std::make_unique<UINT8[]>(0x10000);
set_isa_device();
m_isa->install_memory(0xb0000, 0xbffff, 0, 0, read8_delegate(FUNC(isa8_aga_device::pc_aga_videoram_r),this), write8_delegate(FUNC(isa8_aga_device::pc_aga_videoram_w),this));
@@ -194,7 +194,7 @@ void isa8_aga_pc200_device::device_start()
m_mode = AGA_COLOR;
m_mda_chr_gen = memregion("gfx1")->base();
m_cga_chr_gen = memregion("gfx1")->base() + 0x1000;
- m_videoram = auto_alloc_array(machine(), UINT8, 0x10000);
+ m_videoram = std::make_unique<UINT8[]>(0x10000);
set_isa_device();
m_isa->install_memory(0xb0000, 0xbffff, 0, 0, read8_delegate(FUNC(isa8_aga_pc200_device::pc200_videoram_r),this), write8_delegate(FUNC(isa8_aga_pc200_device::pc200_videoram_w),this));
@@ -315,7 +315,7 @@ machine_config_constructor isa8_aga_device::device_mconfig_additions() const
MC6845_UPDATE_ROW( isa8_aga_device::mda_text_inten_update_row )
{
const rgb_t *palette = m_palette->palette()->entry_list_raw();
- UINT8 *videoram = m_videoram;
+ UINT8 *videoram = m_videoram.get();
UINT32 *p = &bitmap.pix32(y);
UINT16 chr_base = ( ra & 0x08 ) ? 0x800 | ( ra & 0x07 ) : ra;
int i;
@@ -375,7 +375,7 @@ MC6845_UPDATE_ROW( isa8_aga_device::mda_text_inten_update_row )
MC6845_UPDATE_ROW( isa8_aga_device::mda_text_blink_update_row )
{
- UINT8 *videoram = m_videoram;
+ UINT8 *videoram = m_videoram.get();
const rgb_t *palette = m_palette->palette()->entry_list_raw();
UINT32 *p = &bitmap.pix32(y);
UINT16 chr_base = ( ra & 0x08 ) ? 0x800 | ( ra & 0x07 ) : ra;
@@ -437,7 +437,7 @@ MC6845_UPDATE_ROW( isa8_aga_device::mda_text_blink_update_row )
MC6845_UPDATE_ROW( isa8_aga_device::cga_text_inten_update_row )
{
- UINT8 *videoram = m_videoram;
+ UINT8 *videoram = m_videoram.get();
const rgb_t *palette = m_palette->palette()->entry_list_raw();
UINT32 *p = &bitmap.pix32(y);
int i;
@@ -469,7 +469,7 @@ MC6845_UPDATE_ROW( isa8_aga_device::cga_text_inten_update_row )
MC6845_UPDATE_ROW( isa8_aga_device::cga_text_inten_alt_update_row )
{
const rgb_t *palette = m_palette->palette()->entry_list_raw();
- UINT8 *videoram = m_videoram;
+ UINT8 *videoram = m_videoram.get();
UINT32 *p = &bitmap.pix32(y);
int i;
@@ -499,7 +499,7 @@ MC6845_UPDATE_ROW( isa8_aga_device::cga_text_inten_alt_update_row )
MC6845_UPDATE_ROW( isa8_aga_device::cga_text_blink_update_row )
{
const rgb_t *palette = m_palette->palette()->entry_list_raw();
- UINT8 *videoram = m_videoram;
+ UINT8 *videoram = m_videoram.get();
UINT32 *p = &bitmap.pix32(y);
int i;
@@ -533,7 +533,7 @@ MC6845_UPDATE_ROW( isa8_aga_device::cga_text_blink_update_row )
MC6845_UPDATE_ROW( isa8_aga_device::cga_text_blink_alt_update_row )
{
const rgb_t *palette = m_palette->palette()->entry_list_raw();
- UINT8 *videoram = m_videoram;
+ UINT8 *videoram = m_videoram.get();
UINT32 *p = &bitmap.pix32(y);
int i;
@@ -569,7 +569,7 @@ MC6845_UPDATE_ROW( isa8_aga_device::cga_text_blink_alt_update_row )
MC6845_UPDATE_ROW( isa8_aga_device::cga_gfx_4bppl_update_row )
{
const rgb_t *palette = m_palette->palette()->entry_list_raw();
- UINT8 *videoram = m_videoram;
+ UINT8 *videoram = m_videoram.get();
UINT32 *p = &bitmap.pix32(y);
int i;
@@ -594,7 +594,7 @@ MC6845_UPDATE_ROW( isa8_aga_device::cga_gfx_4bppl_update_row )
MC6845_UPDATE_ROW( isa8_aga_device::cga_gfx_4bpph_update_row )
{
- UINT8 *videoram = m_videoram;
+ UINT8 *videoram = m_videoram.get();
const rgb_t *palette = m_palette->palette()->entry_list_raw();
UINT32 *p = &bitmap.pix32(y);
int i;
@@ -628,7 +628,7 @@ MC6845_UPDATE_ROW( isa8_aga_device::cga_gfx_4bpph_update_row )
MC6845_UPDATE_ROW( isa8_aga_device::cga_gfx_2bpp_update_row )
{
- UINT8 *videoram = m_videoram;
+ UINT8 *videoram = m_videoram.get();
const rgb_t *palette = m_palette->palette()->entry_list_raw();
UINT32 *p = &bitmap.pix32(y);
int i;
@@ -654,7 +654,7 @@ MC6845_UPDATE_ROW( isa8_aga_device::cga_gfx_2bpp_update_row )
MC6845_UPDATE_ROW( isa8_aga_device::cga_gfx_1bpp_update_row )
{
- UINT8 *videoram = m_videoram;
+ UINT8 *videoram = m_videoram.get();
const rgb_t *palette = m_palette->palette()->entry_list_raw();
UINT32 *p = &bitmap.pix32(y);
UINT8 fg = m_cga_color_select & 0x0F;
@@ -985,7 +985,7 @@ WRITE8_MEMBER( isa8_aga_pc200_device::pc200_cga_w )
READ8_MEMBER ( isa8_aga_pc200_device::pc200_cga_r )
{
- UINT8 result = 0xff;
+ UINT8 result;
switch(offset) {
case 8:
diff --git a/src/devices/bus/isa/aga.h b/src/devices/bus/isa/aga.h
index 5ed2e560287..c0c80ac29bb 100644
--- a/src/devices/bus/isa/aga.h
+++ b/src/devices/bus/isa/aga.h
@@ -93,7 +93,7 @@ public:
UINT8 m_cga_palette_lut_2bpp[4];
- UINT8 *m_videoram;
+ std::unique_ptr<UINT8[]> m_videoram;
};
// device type definition
diff --git a/src/devices/bus/isa/com.cpp b/src/devices/bus/isa/com.cpp
index 9a15b0b2e1f..e61777c63c2 100644
--- a/src/devices/bus/isa/com.cpp
+++ b/src/devices/bus/isa/com.cpp
@@ -56,14 +56,14 @@ static MACHINE_CONFIG_FRAGMENT( com_config )
MCFG_RS232_RI_HANDLER(DEVWRITELINE("uart_1", ins8250_uart_device, ri_w))
MCFG_RS232_CTS_HANDLER(DEVWRITELINE("uart_1", ins8250_uart_device, cts_w))
- //MCFG_RS232_PORT_ADD( "serport2", isa_com, NULL )
+ //MCFG_RS232_PORT_ADD( "serport2", isa_com, nullptr )
//MCFG_RS232_RXD_HANDLER(DEVWRITELINE("uart_1", ins8250_uart_device, rx_w))
//MCFG_RS232_DCD_HANDLER(DEVWRITELINE("uart_1", ins8250_uart_device, dcd_w))
//MCFG_RS232_DSR_HANDLER(DEVWRITELINE("uart_1", ins8250_uart_device, dsr_w))
//MCFG_RS232_RI_HANDLER(DEVWRITELINE("uart_1", ins8250_uart_device, ri_w))
//MCFG_RS232_CTS_HANDLER(DEVWRITELINE("uart_1", ins8250_uart_device, cts_w))
- //MCFG_RS232_PORT_ADD( "serport3", isa_com, NULL )
+ //MCFG_RS232_PORT_ADD( "serport3", isa_com, nullptr )
//MCFG_RS232_RXD_HANDLER(DEVWRITELINE("uart_2", ins8250_uart_device, rx_w))
//MCFG_RS232_DCD_HANDLER(DEVWRITELINE("uart_2", ins8250_uart_device, dcd_w))
//MCFG_RS232_DSR_HANDLER(DEVWRITELINE("uart_2", ins8250_uart_device, dsr_w))
@@ -164,8 +164,8 @@ static MACHINE_CONFIG_FRAGMENT( com_at_config )
MCFG_RS232_RI_HANDLER(DEVWRITELINE("uart_1", ins8250_uart_device, ri_w))
MCFG_RS232_CTS_HANDLER(DEVWRITELINE("uart_1", ins8250_uart_device, cts_w))
-// MCFG_RS232_PORT_ADD( "serport2", isa_com, NULL )
-// MCFG_RS232_PORT_ADD( "serport3", isa_com, NULL )
+// MCFG_RS232_PORT_ADD( "serport2", isa_com, nullptr )
+// MCFG_RS232_PORT_ADD( "serport3", isa_com, nullptr )
MACHINE_CONFIG_END
//**************************************************************************
diff --git a/src/devices/bus/isa/ega.cpp b/src/devices/bus/isa/ega.cpp
index 762f1d05a77..85d943b92ac 100644
--- a/src/devices/bus/isa/ega.cpp
+++ b/src/devices/bus/isa/ega.cpp
@@ -854,7 +854,7 @@ CRTC_EGA_ROW_UPDATE( isa8_ega_device::pc_ega_text )
UINT16 offset = ma + i;
UINT8 chr = m_plane[0][ offset ];
UINT8 attr = m_plane[1][ offset ];
- UINT8 data = 0;
+ UINT8 data;
UINT16 fg = m_attribute.data[ attr & 0x07 ];
UINT16 bg = m_attribute.data[ ( attr >> 4 ) & 0x07 ];
@@ -1329,7 +1329,7 @@ WRITE8_MEMBER(isa8_ega_device::pc_ega8_3c0_w )
0x0F, 0x0F, 0x0F, 0x1F, 0x07, 0x3F, 0x0F, 0x0F,
0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
- int index = 0;
+ int index;
if ( VERBOSE_EGA )
{
diff --git a/src/devices/bus/isa/gus.cpp b/src/devices/bus/isa/gus.cpp
index 2a8edf69145..2928aaa252c 100644
--- a/src/devices/bus/isa/gus.cpp
+++ b/src/devices/bus/isa/gus.cpp
@@ -479,7 +479,7 @@ WRITE8_MEMBER(gf1_device::global_reg_select_w)
READ8_MEMBER(gf1_device::global_reg_data_r)
{
- UINT16 ret = 0x00;
+ UINT16 ret;
switch(m_current_reg)
{
@@ -1430,7 +1430,7 @@ READ8_MEMBER(isa16_gus_device::joy_r)
{
if(offset == 1)
{
- UINT8 data = 0;
+ UINT8 data;
int delta;
attotime new_time = machine().time();
diff --git a/src/devices/bus/isa/hdc.cpp b/src/devices/bus/isa/hdc.cpp
index e7b386b2f7b..7708d341abd 100644
--- a/src/devices/bus/isa/hdc.cpp
+++ b/src/devices/bus/isa/hdc.cpp
@@ -430,7 +430,7 @@ void xt_hdc_device::dack_ws(int data)
void xt_hdc_device::execute_read()
{
- hard_disk_file *disk = nullptr;
+ hard_disk_file *disk;
int size = sector_cnt[drv] * 512;
int read_ = 0;
@@ -460,7 +460,7 @@ void xt_hdc_device::execute_read()
void xt_hdc_device::execute_write()
{
- hard_disk_file *disk = nullptr;
+ hard_disk_file *disk;
int size = sector_cnt[drv] * 512;
int write_ = 512;
diff --git a/src/devices/bus/isa/ibm_mfc.cpp b/src/devices/bus/isa/ibm_mfc.cpp
index 2bc6c513ace..b6445c9385f 100644
--- a/src/devices/bus/isa/ibm_mfc.cpp
+++ b/src/devices/bus/isa/ibm_mfc.cpp
@@ -313,7 +313,7 @@ MACHINE_CONFIG_END
READ8_MEMBER( isa8_ibm_mfc_device::ibm_mfc_r )
{
- UINT8 val = 0xff;
+ UINT8 val;
switch (offset)
{
diff --git a/src/devices/bus/isa/mda.cpp b/src/devices/bus/isa/mda.cpp
index 713891a5186..c8456886f02 100644
--- a/src/devices/bus/isa/mda.cpp
+++ b/src/devices/bus/isa/mda.cpp
@@ -799,15 +799,15 @@ void isa8_ec1840_0002_device::device_start()
{
isa8_mda_device::device_start();
- m_soft_chr_gen = auto_alloc_array(machine(), UINT8, 0x2000);
- m_isa->install_bank(0xdc000, 0xddfff, 0, 0x2000, "bank_chargen", m_soft_chr_gen);
+ m_soft_chr_gen = std::make_unique<UINT8[]>(0x2000);
+ m_isa->install_bank(0xdc000, 0xddfff, 0, 0x2000, "bank_chargen", m_soft_chr_gen.get());
}
void isa8_ec1840_0002_device::device_reset()
{
isa8_mda_device::device_reset();
- m_chr_gen = m_soft_chr_gen;
+ m_chr_gen = m_soft_chr_gen.get();
}
diff --git a/src/devices/bus/isa/mda.h b/src/devices/bus/isa/mda.h
index cba94767b40..c6cf72b29ad 100644
--- a/src/devices/bus/isa/mda.h
+++ b/src/devices/bus/isa/mda.h
@@ -120,7 +120,7 @@ protected:
virtual void device_reset() override;
public:
- UINT8 *m_soft_chr_gen;
+ std::unique_ptr<UINT8[]> m_soft_chr_gen;
};
diff --git a/src/devices/bus/isa/omti8621.cpp b/src/devices/bus/isa/omti8621.cpp
index 3df6cb77b66..5f42c31200b 100644
--- a/src/devices/bus/isa/omti8621.cpp
+++ b/src/devices/bus/isa/omti8621.cpp
@@ -231,13 +231,8 @@ FLOPPY_FORMATS_END
ROM_START( omti8621 )
ROM_REGION(0x4000, OMTI_CPU_REGION, 0) // disassembles fine as Z8 code
ROM_LOAD( "omti_8621_102640-b.bin", 0x000000, 0x004000, CRC(e6f20dbb) SHA1(cf1990ad72eac6b296485410f5fa3309a0d6d078) )
-
-#if 1
- // OMTI 8621 boards for Apollo workstations never use a BIOS ROM
- // They don't even have a socket for the BIOS ROM
ROM_REGION(0x1000, OMTI_BIOS_REGION, 0)
ROM_LOAD_OPTIONAL("omti_bios", 0x0000, 0x1000, NO_DUMP)
-#endif
ROM_END
static INPUT_PORTS_START( omti_port )
@@ -274,6 +269,13 @@ const rom_entry *omti8621_device::device_rom_region() const
return ROM_NAME( omti8621 );
}
+const rom_entry *omti8621_apollo_device::device_rom_region() const
+{
+ // OMTI 8621 boards for Apollo workstations never use a BIOS ROM
+ // They don't even have a socket for the BIOS ROM
+ return nullptr;
+}
+
ioport_constructor omti8621_device::device_input_ports() const
{
return INPUT_PORTS_NAME( omti_port );
@@ -369,10 +371,22 @@ void omti8621_device::device_reset()
alternate_track_address[1] = 0;
}
-const device_type ISA16_OMTI8621 = &device_creator<omti8621_device>;
+const device_type ISA16_OMTI8621 = &device_creator<omti8621_pc_device>;
+
+omti8621_pc_device::omti8621_pc_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : omti8621_device(mconfig, ISA16_OMTI8621, tag, owner, clock)
+{
+}
+
+const device_type ISA16_OMTI8621_APOLLO = &device_creator<omti8621_apollo_device>;
+
+omti8621_apollo_device::omti8621_apollo_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : omti8621_device(mconfig, ISA16_OMTI8621_APOLLO, tag, owner, clock)
+{
+}
-omti8621_device::omti8621_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
- : device_t(mconfig, ISA16_OMTI8621, "OMTI 8621 ESDI/floppy controller", tag, owner, clock, "omti8621", __FILE__),
+omti8621_device::omti8621_device(const machine_config &mconfig, device_type type,const char *tag, device_t *owner, UINT32 clock)
+ : device_t(mconfig, type, "OMTI 8621 ESDI/floppy controller", tag, owner, clock, "omti8621", __FILE__),
device_isa16_card_interface(mconfig, *this),
m_fdc(*this, OMTI_FDC_TAG),
m_iobase(*this, "IO_BASE"),
@@ -679,80 +693,83 @@ void omti8621_device::log_command(const UINT8 cdb[], const UINT16 cdb_length)
{
if (verbose > 0) {
int i;
- logerror("%s: OMTI command ", cpu_context(this));
+ char sb[100];
+ std::string text(cpu_context(this));
+ text += ": OMTI command ";
switch (cdb[0]) {
case OMTI_CMD_TEST_DRIVE_READY: // 0x00
- logerror("Test Drive Ready");
+ text += "Test Drive Ready";
break;
case OMTI_CMD_RECALIBRATE: // 0x01
- logerror("Recalibrate");
+ text += "Recalibrate";
break;
case OMTI_CMD_REQUEST_SENSE: // 0x03
- logerror("Request Sense");
+ text += "Request Sense";
break;
case OMTI_CMD_READ_VERIFY: // 0x05
- logerror("Read Verify");
+ text += "Read Verify";
break;
case OMTI_CMD_FORMAT_TRACK: // 0x06
- logerror("Format Track");
+ text += "Format Track";
break;
case OMTI_CMD_FORMAT_BAD_TRACK: // 0x07
- logerror("Format Bad Track");
+ text += "Format Bad Track";
break;
case OMTI_CMD_READ: // 0x08
- logerror("Read");
+ text += "Read";
break;
case OMTI_CMD_WRITE: // 0x0A
- logerror("Write");
+ text += "Write";
break;
case OMTI_CMD_SEEK: // 0x0B
- logerror("Seek");
+ text += "Seek";
break;
case OMTI_CMD_READ_SECTOR_BUFFER: // 0x0E
- logerror("Read Sector Buffer");
+ text += "Read Sector Buffer";
break;
case OMTI_CMD_WRITE_SECTOR_BUFFER: // 0x0F
- logerror("Write Sector Buffer");
+ text += "Write Sector Buffer";
break;
case OMTI_CMD_ASSIGN_ALTERNATE_TRACK: // 0x11
- logerror("Assign Alternate Track");
+ text += "Assign Alternate Track";
break;
case OMTI_CMD_READ_DATA_TO_BUFFER: // 0x1E
- logerror("Read Data to Buffer");
+ text += "Read Data to Buffer";
break;
case OMTI_CMD_WRITE_DATA_FROM_BUFFER: // 0x1F
- logerror("Write Data from Buffer");
+ text += "Write Data from Buffer";
break;
case OMTI_CMD_COPY: // 0x20
- logerror("Copy");
+ text += "Copy";
break;
case OMTI_CMD_READ_ESDI_DEFECT_LIST: // 0x37
- logerror("Read ESDI Defect List");
+ text += "Read ESDI Defect List";
break;
case OMTI_CMD_RAM_DIAGNOSTICS: // 0xE0
- logerror("RAM. Diagnostic");
+ text += "RAM. Diagnostic";
break;
case OMTI_CMD_CONTROLLER_INT_DIAGNOSTIC: // 0xE4
- logerror("Controller Int. Diagnostic");
+ text += "Controller Int. Diagnostic";
break;
case OMTI_CMD_READ_LONG: // 0xE5
- logerror("Read Long");
+ text += "Read Long";
break;
case OMTI_CMD_WRITE_LONG: // 0xE6
- logerror("Write Long");
+ text += "Write Long";
break;
case OMTI_CMD_READ_CONFIGURATION: // 0xEC
- logerror("Read Configuration");
+ text += "Read Configuration";
break;
case OMTI_CMD_INVALID_COMMAND: // 0xFF
- logerror("Invalid Command");
+ text += "Invalid Command";
break;
default:
- logerror("!!! Unexpected Command !!!");
+ text += "!!! Unexpected Command !!!";
}
// logerror(" (%02x, length=%02x)", cdb[0], cdb_length);
for (i = 0; i < cdb_length; i++) {
- logerror(" %02x", cdb[i]);
+ sprintf(sb, " %02x", cdb[i]);
+ text += sb;
}
switch (cdb[0]) {
@@ -763,10 +780,12 @@ void omti8621_device::log_command(const UINT8 cdb[], const UINT16 cdb_length)
case OMTI_CMD_READ_DATA_TO_BUFFER: // 0x1E
case OMTI_CMD_WRITE_DATA_FROM_BUFFER: // 0x1F
case OMTI_CMD_COPY: // 0x20
- logerror(" (diskaddr=%x count=%x)", get_disk_address(cdb), cdb[4]);
+ sprintf(sb, " (diskaddr=%x count=%x)", get_disk_address(cdb), cdb[4]);
+ text += sb;
break;
}
- logerror("\n");
+ text += "\n";
+ logerror(text.c_str());
}
}
@@ -776,18 +795,25 @@ void omti8621_device::log_command(const UINT8 cdb[], const UINT16 cdb_length)
void omti8621_device::log_data()
{
- if (verbose > 0) {
+ if (verbose > 0)
+ {
int i;
- logerror("%s: OMTI data (length=%02x)", cpu_context(this),
+ char sb[100];
+ sprintf(sb, "%s: OMTI data (length=%02x)", cpu_context(this),
data_length);
- for (i = 0; i < data_length && i < OMTI_DISK_SECTOR_SIZE; i++) {
- logerror(" %02x", data_buffer[i]);
+ std::string text(sb);
+ for (i = 0; i < data_length && i < OMTI_DISK_SECTOR_SIZE; i++)
+ {
+ sprintf(sb, " %02x", data_buffer[i]);
+ text += sb;
}
- if (i < data_length) {
- logerror(" ...");
+ if (i < data_length)
+ {
+ text += " ...";
}
- logerror("\n");
+ text += "\n";
+ logerror(text.c_str());
}
}
@@ -1209,13 +1235,11 @@ void omti8621_device::set_verbose(int on_off)
get_sector - get sector diskaddr of logical unit lun into data_buffer
***************************************************************************/
-// FIXME: this will work, but is not supported by MESS
-#if 0 // APOLLO_XXL
-UINT32 omti8621_device::get_sector(INT32 diskaddr, UINT8 *data_buffer, UINT32 length, UINT8 lun)
+UINT32 omti8621_apollo_device::get_sector(INT32 diskaddr, UINT8 *data_buffer, UINT32 length, UINT8 lun)
{
- omti_disk_image_device *disk = omti8621_device_1->our_disks[lun];
+ omti_disk_image_device *disk = our_disks[lun];
- if (disk == NULL || disk->m_image == NULL || !disk->m_image->exists())
+ if (disk == nullptr || disk->m_image == nullptr || !disk->m_image->exists())
{
return 0;
}
@@ -1232,10 +1256,9 @@ UINT32 omti8621_device::get_sector(INT32 diskaddr, UINT8 *data_buffer, UINT32 le
return length;
}
}
-#endif
/***************************************************************************
- omti_set_jumper - set OMI jumpers
+ omti_set_jumper - set OMTI jumpers
***************************************************************************/
void omti8621_device::set_jumper(UINT16 disk_type)
diff --git a/src/devices/bus/isa/omti8621.h b/src/devices/bus/isa/omti8621.h
index 4bc92a3a5de..04dff836316 100644
--- a/src/devices/bus/isa/omti8621.h
+++ b/src/devices/bus/isa/omti8621.h
@@ -33,7 +33,7 @@ class omti_disk_image_device;
class omti8621_device : public device_t, public device_isa16_card_interface
{
public:
- omti8621_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+ omti8621_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, UINT32 clock);
~omti8621_device() {}
DECLARE_READ16_MEMBER(read);
@@ -41,9 +41,6 @@ public:
static void set_verbose(int on_off);
- // get sector diskaddr of logical unit lun into data_buffer
- static UINT32 get_sector(INT32 diskaddr, UINT8 *data_buffer, UINT32 length, UINT8 lun);
-
required_device<pc_fdc_interface> m_fdc;
required_ioport m_iobase;
required_ioport m_biosopts;
@@ -68,9 +65,9 @@ protected:
void set_interrupt(enum line_state line_state);
-private:
omti_disk_image_device *our_disks[OMTI_MAX_LUN+1];
+private:
UINT16 jumper;
UINT8 omti_state;
@@ -128,8 +125,31 @@ private:
DECLARE_WRITE8_MEMBER(write8);
};
+/* ----- omti8621 for PC device interface ----- */
+
+class omti8621_pc_device : public omti8621_device
+{
+public:
+ omti8621_pc_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+};
+
extern const device_type ISA16_OMTI8621;
+/* ----- omti8621 for apollo device interface ----- */
+
+class omti8621_apollo_device : public omti8621_device
+{
+public:
+ omti8621_apollo_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ // get sector diskaddr of logical unit lun into data_buffer
+ UINT32 get_sector(INT32 diskaddr, UINT8 *data_buffer, UINT32 length, UINT8 lun);
+protected:
+ virtual const rom_entry *device_rom_region() const override;
+};
+
+extern const device_type ISA16_OMTI8621_APOLLO;
+
//###############################################################
#endif /* OMTI8621_H_ */
diff --git a/src/devices/bus/isa/pgc.cpp b/src/devices/bus/isa/pgc.cpp
index f551a0fc2ec..c22631d405b 100644
--- a/src/devices/bus/isa/pgc.cpp
+++ b/src/devices/bus/isa/pgc.cpp
@@ -237,14 +237,14 @@ void isa8_pgc_device::device_start()
m_palette->set_pen_color( i, 0, 0, 0 );
}
- m_bitmap = auto_bitmap_ind16_alloc(machine(), width, height);
+ m_bitmap = std::make_unique<bitmap_ind16>(width, height);
m_bitmap->fill(0);
- m_vram = auto_alloc_array(machine(), UINT8, 0x78000);
+ m_vram = std::make_unique<UINT8[]>(0x78000);
space.install_readwrite_bank(0x80000, 0xf7fff, "vram");
- membank("vram")->set_base(m_vram);
+ membank("vram")->set_base(m_vram.get());
- m_eram = auto_alloc_array(machine(), UINT8, 0x8000);
+ m_eram = std::make_unique<UINT8[]>(0x8000);
machine().add_notifier(MACHINE_NOTIFY_RESET, machine_notify_delegate(FUNC(isa8_pgc_device::reset_common), this));
}
@@ -325,7 +325,7 @@ READ8_MEMBER( isa8_pgc_device::init_r ) {
DBG_LOG(1,"INIT",("mapping emulator RAM\n"));
space.install_readwrite_bank(0xf8000, 0xfffff, "eram");
- membank("eram")->set_base(m_eram);
+ membank("eram")->set_base(m_eram.get());
DBG_LOG(1,"INIT",("mapping LUT\n"));
space.install_write_handler(0xf8400, 0xf85ff,
diff --git a/src/devices/bus/isa/pgc.h b/src/devices/bus/isa/pgc.h
index 45eb4bfb25a..cf83eb8ae1d 100644
--- a/src/devices/bus/isa/pgc.h
+++ b/src/devices/bus/isa/pgc.h
@@ -55,11 +55,11 @@ private:
required_device<palette_device> m_palette;
UINT8 *m_commarea;
- UINT8 *m_vram;
- UINT8 *m_eram;
+ std::unique_ptr<UINT8[]> m_vram;
+ std::unique_ptr<UINT8[]> m_eram;
UINT8 m_stateparam[16];
UINT8 m_lut[256*3];
- bitmap_ind16 *m_bitmap;
+ std::unique_ptr<bitmap_ind16> m_bitmap;
};
diff --git a/src/devices/bus/isa/sc499.cpp b/src/devices/bus/isa/sc499.cpp
index 0e0c6438410..4effacb3394 100644
--- a/src/devices/bus/isa/sc499.cpp
+++ b/src/devices/bus/isa/sc499.cpp
@@ -16,7 +16,6 @@
#include "sc499.h"
#include "formats/ioprocs.h"
-#include "image.h"
#define VERBOSE 0
@@ -321,7 +320,7 @@ sc499_device::sc499_device(const machine_config &mconfig, const char *tag, devic
m_iobase(*this, "IO_BASE"),
m_irqdrq(*this, "IRQ_DRQ"), m_data(0), m_command(0), m_status(0), m_control(0), m_has_cartridge(0), m_is_writable(0), m_current_command(0), m_first_block_hack(0), m_nasty_readahead(0), m_read_block_pending(0),
m_data_index(0), m_tape_status(0), m_data_error_counter(0), m_underrun_counter(0), m_tape_pos(0), m_ctape_block_count(0), m_ctape_block_index(0), m_image_length(0),
- m_image(*this, SC499_CTAPE_TAG), irq_state(), dma_drq_state(), m_timer(nullptr), m_timer1(nullptr), m_timer_type(0), m_irq(0), m_drq(0), m_installed(false)
+ m_image(*this, SC499_CTAPE_TAG), irq_state(), dma_drq_state(), m_timer(nullptr), m_timer1(nullptr), m_irq(0), m_drq(0), m_installed(false)
{
}
@@ -1085,7 +1084,7 @@ void sc499_device::eop_w(int state)
UINT8 sc499_device::dack_r(int line)
{
- UINT8 data = 0xff;
+ UINT8 data;
// set_dma_drq(CLEAR_LINE);
diff --git a/src/devices/bus/isa/sc499.h b/src/devices/bus/isa/sc499.h
index d8c347e2859..8c63f810073 100644
--- a/src/devices/bus/isa/sc499.h
+++ b/src/devices/bus/isa/sc499.h
@@ -63,8 +63,6 @@ public:
// construction/destruction
sc499_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
- int sc499_receive(const UINT8 data[], int length);
-
required_ioport m_iobase;
required_ioport m_irqdrq;
@@ -146,7 +144,6 @@ private:
emu_timer * m_timer; // timer to delay functions
emu_timer * m_timer1; // timer to delay functions
- int m_timer_type;
int m_irq, m_drq;
bool m_installed;
diff --git a/src/devices/bus/isa/trident.cpp b/src/devices/bus/isa/trident.cpp
index 03f646139be..4f47bdd7212 100644
--- a/src/devices/bus/isa/trident.cpp
+++ b/src/devices/bus/isa/trident.cpp
@@ -195,7 +195,7 @@ void trident_vga_device::device_reset()
UINT32 trident_vga_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
- UINT8 cur_mode = 0;
+ UINT8 cur_mode;
svga_device::screen_update(screen,bitmap,cliprect);
cur_mode = pc_vga_choosevideomode();
diff --git a/src/devices/bus/kc/kc.cpp b/src/devices/bus/kc/kc.cpp
index b87e3f34314..a5a46802998 100644
--- a/src/devices/bus/kc/kc.cpp
+++ b/src/devices/bus/kc/kc.cpp
@@ -333,7 +333,7 @@ bool kccart_slot_device::call_load()
{
if (m_cart)
{
- offs_t read_length = 0;
+ offs_t read_length;
UINT8 *cart_base = m_cart->get_cart_base();
if (cart_base != nullptr)
@@ -362,7 +362,7 @@ bool kccart_slot_device::call_load()
bool kccart_slot_device::call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry)
{
- load_software_part_region(*this, swlist, swname, start_entry );
+ machine().rom_load().load_software_part_region(*this, swlist, swname, start_entry );
return TRUE;
}
@@ -370,7 +370,7 @@ bool kccart_slot_device::call_softlist_load(software_list_device &swlist, const
get default card software
-------------------------------------------------*/
-void kccart_slot_device::get_default_card_software(std::string &result)
+std::string kccart_slot_device::get_default_card_software()
{
- software_get_default_slot(result, "standard");
+ return software_get_default_slot("standard");
}
diff --git a/src/devices/bus/kc/kc.h b/src/devices/bus/kc/kc.h
index 85146d4cfe8..e31007ea85e 100644
--- a/src/devices/bus/kc/kc.h
+++ b/src/devices/bus/kc/kc.h
@@ -104,7 +104,7 @@ public:
virtual const option_guide *create_option_guide() const override { return nullptr; }
// slot interface overrides
- virtual void get_default_card_software(std::string &result) override;
+ virtual std::string get_default_card_software() override;
};
// device type definition
diff --git a/src/devices/bus/lpci/i82439tx.cpp b/src/devices/bus/lpci/i82439tx.cpp
index ceee9a4a032..e2c64f49473 100644
--- a/src/devices/bus/lpci/i82439tx.cpp
+++ b/src/devices/bus/lpci/i82439tx.cpp
@@ -55,7 +55,7 @@ void i82439tx_device::i82439tx_configure_memory(UINT8 val, offs_t begin, offs_t
UINT32 i82439tx_device::pci_read(pci_bus_device *pcibus, int function, int offset, UINT32 mem_mask)
{
- UINT32 result = 0;
+ UINT32 result;
if (function != 0)
return 0;
diff --git a/src/devices/bus/macpds/macpds.h b/src/devices/bus/macpds/macpds.h
index f1a67dfc1be..db572d553f2 100644
--- a/src/devices/bus/macpds/macpds.h
+++ b/src/devices/bus/macpds/macpds.h
@@ -118,7 +118,6 @@ public:
void set_macpds_device();
// helper functions for card devices
- void install_declaration_rom(device_t *dev, const char *romregion, bool mirror_all_mb = false, bool reverse_rom = false);
void install_bank(offs_t start, offs_t end, offs_t mask, offs_t mirror, const char *tag, UINT8 *data);
void install_rom(device_t *dev, const char *romregion, UINT32 addr);
diff --git a/src/devices/bus/macpds/pds_tpdfpd.cpp b/src/devices/bus/macpds/pds_tpdfpd.cpp
index 968eed3564f..f89a210888f 100644
--- a/src/devices/bus/macpds/pds_tpdfpd.cpp
+++ b/src/devices/bus/macpds/pds_tpdfpd.cpp
@@ -115,10 +115,10 @@ void macpds_sedisplay_device::device_start()
install_rom(this, SEDISPLAY_ROM_REGION, 0xc00000);
install_rom(this, SEDISPLAY_ROM_REGION, 0xf80000);
- m_vram = auto_alloc_array(machine(), UINT8, VRAM_SIZE);
+ m_vram = std::make_unique<UINT8[]>(VRAM_SIZE);
static const char bankname[] = { "radpds_ram" };
- m_macpds->install_bank(0xc40000, 0xc40000+VRAM_SIZE-1, 0, 0, bankname, m_vram);
+ m_macpds->install_bank(0xc40000, 0xc40000+VRAM_SIZE-1, 0, 0, bankname, m_vram.get());
m_macpds->install_device(0x770000, 0x77000f, read16_delegate(FUNC(macpds_sedisplay_device::ramdac_r), this), write16_delegate(FUNC(macpds_sedisplay_device::ramdac_w), this));
m_macpds->install_device(0xc10000, 0xc2ffff, read16_delegate(FUNC(macpds_sedisplay_device::sedisplay_r), this), write16_delegate(FUNC(macpds_sedisplay_device::sedisplay_w), this));
@@ -136,7 +136,7 @@ void macpds_sedisplay_device::device_reset()
m_count = 0;
m_clutoffs = 0;
m_vbl_disable = 1;
- memset(m_vram, 0, VRAM_SIZE);
+ memset(m_vram.get(), 0, VRAM_SIZE);
memset(m_palette, 0, sizeof(m_palette));
m_palette[0] = rgb_t(0, 0, 0);
@@ -166,7 +166,7 @@ UINT32 macpds_sedisplay_device::screen_update(screen_device &screen, bitmap_rgb3
int x, y;
UINT8 pixels, *vram;
- vram = m_vram;
+ vram = m_vram.get();
for (y = 0; y < 870; y++)
{
diff --git a/src/devices/bus/macpds/pds_tpdfpd.h b/src/devices/bus/macpds/pds_tpdfpd.h
index 0adf48c2765..218c30f959b 100644
--- a/src/devices/bus/macpds/pds_tpdfpd.h
+++ b/src/devices/bus/macpds/pds_tpdfpd.h
@@ -41,7 +41,7 @@ protected:
DECLARE_WRITE16_MEMBER(ramdac_w);
public:
- UINT8 *m_vram;
+ std::unique_ptr<UINT8[]> m_vram;
UINT32 m_vbl_disable;
UINT32 m_palette[256], m_colors[3], m_count, m_clutoffs;
emu_timer *m_timer;
diff --git a/src/devices/bus/megadrive/md_slot.cpp b/src/devices/bus/megadrive/md_slot.cpp
index 2d0ff90acb6..a2674838914 100644
--- a/src/devices/bus/megadrive/md_slot.cpp
+++ b/src/devices/bus/megadrive/md_slot.cpp
@@ -677,7 +677,7 @@ void base_md_cart_slot_device::setup_nvram()
bool base_md_cart_slot_device::call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry)
{
- load_software_part_region(*this, swlist, swname, start_entry);
+ machine().rom_load().load_software_part_region(*this, swlist, swname, start_entry);
return TRUE;
}
@@ -900,11 +900,11 @@ int base_md_cart_slot_device::get_cart_type(UINT8 *ROM, UINT32 len)
get default card software
-------------------------------------------------*/
-void base_md_cart_slot_device::get_default_card_software(std::string &result)
+std::string base_md_cart_slot_device::get_default_card_software()
{
if (open_image_file(mconfig().options()))
{
- const char *slot_string = "rom";
+ const char *slot_string;
UINT32 len = core_fsize(m_file), offset = 0;
dynamic_buffer rom(len);
int type;
@@ -919,10 +919,10 @@ void base_md_cart_slot_device::get_default_card_software(std::string &result)
clear();
- result.assign(slot_string);
+ return std::string(slot_string);
}
else
- software_get_default_slot(result, "rom");
+ return software_get_default_slot("rom");
}
diff --git a/src/devices/bus/megadrive/md_slot.h b/src/devices/bus/megadrive/md_slot.h
index 2adac9e01d0..086d02bc79f 100644
--- a/src/devices/bus/megadrive/md_slot.h
+++ b/src/devices/bus/megadrive/md_slot.h
@@ -161,7 +161,7 @@ public:
virtual const option_guide *create_option_guide() const override { return nullptr; }
// slot interface overrides
- virtual void get_default_card_software(std::string &result) override;
+ virtual std::string get_default_card_software() override;
int get_type() { return m_type; }
diff --git a/src/devices/bus/megadrive/rom.cpp b/src/devices/bus/megadrive/rom.cpp
index 5af9f0a64a2..2ce6d353e35 100644
--- a/src/devices/bus/megadrive/rom.cpp
+++ b/src/devices/bus/megadrive/rom.cpp
@@ -597,7 +597,7 @@ READ16_MEMBER(md_rom_chinf3_device::read)
and the writes made at the start of the game.. */
if (offset >= 0x400000/2 && offset < 0x500000/2)
{
- UINT32 retdat = 0;
+ UINT32 retdat;
/*
04dc10 chifi3, prot_r? 2800
04cefa chifi3, prot_r? 65262
diff --git a/src/devices/bus/megadrive/svp.cpp b/src/devices/bus/megadrive/svp.cpp
index 9aa905b7a66..589a58138a6 100644
--- a/src/devices/bus/megadrive/svp.cpp
+++ b/src/devices/bus/megadrive/svp.cpp
@@ -1,4 +1,4 @@
-// license:???
+// license:BSD-3-Clause
// copyright-holders:Fabio Priuli,Pierpaolo Prazzoli,Grazvydas Ignotas
/****************************************** SVP related *****************************************/
diff --git a/src/devices/bus/megadrive/svp.h b/src/devices/bus/megadrive/svp.h
index dce7115cf05..73c230c92a0 100644
--- a/src/devices/bus/megadrive/svp.h
+++ b/src/devices/bus/megadrive/svp.h
@@ -1,4 +1,4 @@
-// license:???
+// license:BSD-3-Clause
// copyright-holders:Fabio Priuli,Pierpaolo Prazzoli,Grazvydas Ignotas
#ifndef __MD_SVP_H
#define __MD_SVP_H
diff --git a/src/devices/bus/msx_cart/disk.cpp b/src/devices/bus/msx_cart/disk.cpp
index 5d973a2fd17..11789e0a79f 100644
--- a/src/devices/bus/msx_cart/disk.cpp
+++ b/src/devices/bus/msx_cart/disk.cpp
@@ -335,7 +335,7 @@ void msx_cart_disk_type1::set_control(UINT8 data)
if ((old_m_control ^ m_control) & 0x40)
{
- set_led_status(machine(), 0, !(m_control & 0x40));
+ machine().output().set_led_value(0, !(m_control & 0x40));
}
}
@@ -495,7 +495,7 @@ void msx_cart_disk_type2::set_control(UINT8 data)
if ((old_m_control ^ m_control) & 0x40)
{
- set_led_status(machine(), 0, !(m_control & 0x40));
+ machine().output().set_led_value(0, !(m_control & 0x40));
}
}
diff --git a/src/devices/bus/msx_slot/cartridge.cpp b/src/devices/bus/msx_slot/cartridge.cpp
index 43a92a94906..c24df3bf1fb 100644
--- a/src/devices/bus/msx_slot/cartridge.cpp
+++ b/src/devices/bus/msx_slot/cartridge.cpp
@@ -200,7 +200,7 @@ void msx_slot_cartridge_device::call_unload()
bool msx_slot_cartridge_device::call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry)
{
- load_software_part_region(*this, swlist, swname, start_entry);
+ machine().rom_load().load_software_part_region(*this, swlist, swname, start_entry);
return true;
}
@@ -278,7 +278,7 @@ int msx_slot_cartridge_device::get_cart_type(UINT8 *rom, UINT32 length)
}
-void msx_slot_cartridge_device::get_default_card_software(std::string &result)
+std::string msx_slot_cartridge_device::get_default_card_software()
{
if (open_image_file(mconfig().options()))
{
@@ -337,10 +337,9 @@ void msx_slot_cartridge_device::get_default_card_software(std::string &result)
slot_string = msx_cart_get_slot_option(type);
}
- result.assign(slot_string);
- return;
+ return std::string(slot_string);
}
- software_get_default_slot(result, "nomapper");
+ return software_get_default_slot("nomapper");
}
diff --git a/src/devices/bus/msx_slot/cartridge.h b/src/devices/bus/msx_slot/cartridge.h
index 7eaaf7a3242..ce8303ff3d4 100644
--- a/src/devices/bus/msx_slot/cartridge.h
+++ b/src/devices/bus/msx_slot/cartridge.h
@@ -55,7 +55,7 @@ public:
virtual const char *file_extensions() const override { return "mx1,bin,rom"; }
// slot interface overrides
- virtual void get_default_card_software(std::string &result) override;
+ virtual std::string get_default_card_software() override;
// msx_internal_slot-level overrides
virtual DECLARE_READ8_MEMBER(read) override;
diff --git a/src/devices/bus/msx_slot/disk.cpp b/src/devices/bus/msx_slot/disk.cpp
index 24a1b5c95c1..ea4313f6ac5 100644
--- a/src/devices/bus/msx_slot/disk.cpp
+++ b/src/devices/bus/msx_slot/disk.cpp
@@ -200,7 +200,7 @@ void msx_slot_disk1_device::set_control(UINT8 data)
if ((old_m_control ^ m_control) & 0x40)
{
- set_led_status(machine(), 0, !(m_control & 0x40));
+ machine().output().set_led_value(0, !(m_control & 0x40));
}
}
@@ -349,7 +349,7 @@ void msx_slot_disk2_device::set_control(UINT8 data)
if ((old_m_control ^ m_control) & 0x40)
{
- set_led_status(machine(), 0, !(m_control & 0x40));
+ machine().output().set_led_value(0, !(m_control & 0x40));
}
}
diff --git a/src/devices/bus/neogeo/bootleg_prot.cpp b/src/devices/bus/neogeo/bootleg_prot.cpp
index a577528e271..8c023f00091 100644
--- a/src/devices/bus/neogeo/bootleg_prot.cpp
+++ b/src/devices/bus/neogeo/bootleg_prot.cpp
@@ -1033,7 +1033,7 @@ void ngbootleg_prot_device::matrimbl_decrypt(UINT8* sprrom, UINT32 sprrom_size,
/* decrypt Z80 */
UINT8 *rom = audiorom+0x10000;
dynamic_buffer buf( 0x20000 );
- int i, j=0;
+ int i, j;
memcpy( &buf[0], rom, 0x20000 );
for( i=0x00000; i<0x20000; i++ )
{
diff --git a/src/devices/bus/neogeo/neogeo_intf.h b/src/devices/bus/neogeo/neogeo_intf.h
index 5c6947ff52d..54ef30ce722 100644
--- a/src/devices/bus/neogeo/neogeo_intf.h
+++ b/src/devices/bus/neogeo/neogeo_intf.h
@@ -38,7 +38,7 @@ public:
UINT32 get_audio_size() { return m_audio.size(); }
void audiocrypt_alloc(UINT32 size) { m_audiocrypt.resize(size); }
- UINT8* get_audiocrypt_base() { return &m_audiocrypt[0]; }
+ UINT8* get_audiocrypt_base() { if (m_audiocrypt.size() == 0) return nullptr; else return &m_audiocrypt[0]; }
UINT32 get_audiocrypt_size() { return m_audiocrypt.size(); }
void sprites_alloc(UINT32 size) { m_sprites.resize(size); }
diff --git a/src/devices/bus/neogeo/neogeo_slot.cpp b/src/devices/bus/neogeo/neogeo_slot.cpp
index 100e53e6e18..fac43eda050 100644
--- a/src/devices/bus/neogeo/neogeo_slot.cpp
+++ b/src/devices/bus/neogeo/neogeo_slot.cpp
@@ -195,7 +195,7 @@ void neogeo_cart_slot_device::call_unload()
bool neogeo_cart_slot_device::call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry)
{
- load_software_part_region(*this, swlist, swname, start_entry );
+ machine().rom_load().load_software_part_region(*this, swlist, swname, start_entry );
return TRUE;
}
@@ -204,9 +204,9 @@ bool neogeo_cart_slot_device::call_softlist_load(software_list_device &swlist, c
get default card software
-------------------------------------------------*/
-void neogeo_cart_slot_device::get_default_card_software(std::string &result)
+std::string neogeo_cart_slot_device::get_default_card_software()
{
- software_get_default_slot(result, "rom");
+ return software_get_default_slot("rom");
}
/*-------------------------------------------------
diff --git a/src/devices/bus/neogeo/neogeo_slot.h b/src/devices/bus/neogeo/neogeo_slot.h
index ae46e619f0e..1b037103165 100644
--- a/src/devices/bus/neogeo/neogeo_slot.h
+++ b/src/devices/bus/neogeo/neogeo_slot.h
@@ -41,7 +41,7 @@ public:
virtual const char *file_extensions() const override { return "bin"; }
// slot interface overrides
- virtual void get_default_card_software(std::string &result) override;
+ virtual std::string get_default_card_software() override;
// reading and writing
virtual DECLARE_READ16_MEMBER(read_rom);
diff --git a/src/devices/bus/nes/act53.cpp b/src/devices/bus/nes/act53.cpp
index b0f7a8dae23..225be65d449 100644
--- a/src/devices/bus/nes/act53.cpp
+++ b/src/devices/bus/nes/act53.cpp
@@ -105,7 +105,7 @@ void nes_action53_device::pcb_reset()
void nes_action53_device::update_prg()
{
- UINT8 prg_lo = 0, prg_hi = 0, helper = 0;
+ UINT8 prg_lo, prg_hi, helper;
UINT8 out = (m_reg[3] & 0x3f) << 1; // Outer PRG reg
UINT8 size = (m_reg[2] & 0x30) >> 4; // Game size
UINT8 mask = (1 << (size + 1)) - 1; // Bits to be taken from PRG reg
diff --git a/src/devices/bus/nes/aladdin.cpp b/src/devices/bus/nes/aladdin.cpp
index 3022bd49f0a..bad863b9255 100644
--- a/src/devices/bus/nes/aladdin.cpp
+++ b/src/devices/bus/nes/aladdin.cpp
@@ -97,7 +97,7 @@ bool nes_aladdin_slot_device::call_load()
if (m_cart)
{
UINT8 *ROM = m_cart->get_cart_base();
- UINT32 size = 0;
+ UINT32 size;
if (!ROM)
return IMAGE_INIT_FAIL;
@@ -138,11 +138,11 @@ bool nes_aladdin_slot_device::call_load()
bool nes_aladdin_slot_device::call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry)
{
- load_software_part_region(*this, swlist, swname, start_entry );
+ machine().rom_load().load_software_part_region(*this, swlist, swname, start_entry );
return TRUE;
}
-void nes_aladdin_slot_device::get_default_card_software(std::string &result)
+std::string nes_aladdin_slot_device::get_default_card_software()
{
if (open_image_file(mconfig().options()))
{
@@ -163,10 +163,10 @@ void nes_aladdin_slot_device::get_default_card_software(std::string &result)
clear();
- result.assign(slot_string);
+ return std::string(slot_string);
}
else
- software_get_default_slot(result, "algn");
+ return software_get_default_slot("algn");
}
diff --git a/src/devices/bus/nes/aladdin.h b/src/devices/bus/nes/aladdin.h
index ad6b7a4a796..20786c3cab3 100644
--- a/src/devices/bus/nes/aladdin.h
+++ b/src/devices/bus/nes/aladdin.h
@@ -65,7 +65,7 @@ public:
virtual const option_guide *create_option_guide() const override { return nullptr; }
// slot interface overrides
- virtual void get_default_card_software(std::string &result) override;
+ virtual std::string get_default_card_software() override;
virtual DECLARE_READ8_MEMBER(read);
void write_prg(UINT32 offset, UINT8 data) { if (m_cart) m_cart->write_prg(offset, data); }
diff --git a/src/devices/bus/nes/bootleg.cpp b/src/devices/bus/nes/bootleg.cpp
index 87910440771..5ae9729db14 100644
--- a/src/devices/bus/nes/bootleg.cpp
+++ b/src/devices/bus/nes/bootleg.cpp
@@ -978,7 +978,7 @@ WRITE8_MEMBER(nes_smb2j_device::write_ex)
if (offset == 2)
{
- int temp = 0;
+ int temp;
// According to hardware tests
if (data & 1)
diff --git a/src/devices/bus/nes/datach.cpp b/src/devices/bus/nes/datach.cpp
index e0629f74fd3..cdb41e16830 100644
--- a/src/devices/bus/nes/datach.cpp
+++ b/src/devices/bus/nes/datach.cpp
@@ -139,14 +139,14 @@ bool nes_datach_slot_device::call_load()
bool nes_datach_slot_device::call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry)
{
- load_software_part_region(*this, swlist, swname, start_entry );
+ machine().rom_load().load_software_part_region(*this, swlist, swname, start_entry );
return TRUE;
}
-void nes_datach_slot_device::get_default_card_software(std::string &result)
+std::string nes_datach_slot_device::get_default_card_software()
{
// any way to detect the game with X24C01?
- software_get_default_slot(result, "datach_rom");
+ return software_get_default_slot("datach_rom");
}
diff --git a/src/devices/bus/nes/datach.h b/src/devices/bus/nes/datach.h
index 3fe70c2a531..bda9edfe50e 100644
--- a/src/devices/bus/nes/datach.h
+++ b/src/devices/bus/nes/datach.h
@@ -67,7 +67,7 @@ public:
virtual const option_guide *create_option_guide() const override { return nullptr; }
// slot interface overrides
- virtual void get_default_card_software(std::string &result) override;
+ virtual std::string get_default_card_software() override;
virtual DECLARE_READ8_MEMBER(read);
void write_prg_bank(UINT8 bank) { if (m_cart) m_cart->write_prg_bank(bank); }
diff --git a/src/devices/bus/nes/disksys.cpp b/src/devices/bus/nes/disksys.cpp
index e89429dc0c4..38b24438408 100644
--- a/src/devices/bus/nes/disksys.cpp
+++ b/src/devices/bus/nes/disksys.cpp
@@ -289,7 +289,7 @@ WRITE8_MEMBER(nes_disksys_device::write_ex)
READ8_MEMBER(nes_disksys_device::read_ex)
{
LOG_MMC(("Famicom Disk System read_ex, offset: %04x\n", offset));
- UINT8 ret = 0x00;
+ UINT8 ret;
if (offset >= 0x20 && offset < 0x60)
{
@@ -416,11 +416,11 @@ void nes_disksys_device::load_disk(device_image_interface &image)
m_fds_sides = (image.length() - header) / 65500;
if (!m_fds_data)
- m_fds_data = auto_alloc_array(machine(), UINT8, m_fds_sides * 65500);
+ m_fds_data = std::make_unique<UINT8[]>(m_fds_sides * 65500);
// if there is an header, skip it
image.fseek(header, SEEK_SET);
- image.fread(m_fds_data, 65500 * m_fds_sides);
+ image.fread(m_fds_data.get(), 65500 * m_fds_sides);
return;
}
diff --git a/src/devices/bus/nes/disksys.h b/src/devices/bus/nes/disksys.h
index 821cfb5614b..7dbefa37ee4 100644
--- a/src/devices/bus/nes/disksys.h
+++ b/src/devices/bus/nes/disksys.h
@@ -38,7 +38,7 @@ public:
private:
UINT8 *m_2c33_rom;
- UINT8 *m_fds_data; // here, we store a copy of the disk
+ std::unique_ptr<UINT8[]> m_fds_data; // here, we store a copy of the disk
required_device<legacy_floppy_image_device> m_disk;
static const device_timer_id TIMER_IRQ = 0;
diff --git a/src/devices/bus/nes/karastudio.cpp b/src/devices/bus/nes/karastudio.cpp
index 9342f18dd40..d9d0e26a2cf 100644
--- a/src/devices/bus/nes/karastudio.cpp
+++ b/src/devices/bus/nes/karastudio.cpp
@@ -128,13 +128,13 @@ bool nes_kstudio_slot_device::call_load()
bool nes_kstudio_slot_device::call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry)
{
- load_software_part_region(*this, swlist, swname, start_entry );
+ machine().rom_load().load_software_part_region(*this, swlist, swname, start_entry );
return TRUE;
}
-void nes_kstudio_slot_device::get_default_card_software(std::string &result)
+std::string nes_kstudio_slot_device::get_default_card_software()
{
- software_get_default_slot(result, "ks_exp");
+ return software_get_default_slot("ks_exp");
}
diff --git a/src/devices/bus/nes/karastudio.h b/src/devices/bus/nes/karastudio.h
index c39020d38ce..3a2f0c6d919 100644
--- a/src/devices/bus/nes/karastudio.h
+++ b/src/devices/bus/nes/karastudio.h
@@ -64,7 +64,7 @@ public:
virtual const option_guide *create_option_guide() const override { return nullptr; }
// slot interface overrides
- virtual void get_default_card_software(std::string &result) override;
+ virtual std::string get_default_card_software() override;
virtual DECLARE_READ8_MEMBER(read);
void write_prg_bank(UINT8 bank) { if (m_cart) m_cart->write_prg_bank(bank); }
diff --git a/src/devices/bus/nes/mmc5.h b/src/devices/bus/nes/mmc5.h
index 9bf73c9ac4b..44569d3d561 100644
--- a/src/devices/bus/nes/mmc5.h
+++ b/src/devices/bus/nes/mmc5.h
@@ -32,7 +32,6 @@ public:
protected:
void set_mirror(int page, int src);
- void update_render_mode();
void update_prg();
inline UINT8 base_chr_r(int bank, UINT32 offset);
diff --git a/src/devices/bus/nes/nes_slot.cpp b/src/devices/bus/nes/nes_slot.cpp
index 7a4065a6d80..05adca0f9ae 100644
--- a/src/devices/bus/nes/nes_slot.cpp
+++ b/src/devices/bus/nes/nes_slot.cpp
@@ -904,7 +904,7 @@ void nes_cart_slot_device::call_unload()
bool nes_cart_slot_device::call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry)
{
- load_software_part_region(*this, swlist, swname, start_entry);
+ machine().rom_load().load_software_part_region(*this, swlist, swname, start_entry);
return TRUE;
}
@@ -912,7 +912,7 @@ bool nes_cart_slot_device::call_softlist_load(software_list_device &swlist, cons
get default card software
-------------------------------------------------*/
-void nes_cart_slot_device::get_default_card_software(std::string &result)
+std::string nes_cart_slot_device::get_default_card_software()
{
if (open_image_file(mconfig().options()))
{
@@ -930,10 +930,10 @@ void nes_cart_slot_device::get_default_card_software(std::string &result)
clear();
- result.assign(slot_string);
+ return std::string(slot_string);
}
else
- software_get_default_slot(result, "nrom");
+ return software_get_default_slot("nrom");
}
diff --git a/src/devices/bus/nes/nes_slot.h b/src/devices/bus/nes/nes_slot.h
index 975357c81aa..ad2a1b1c28a 100644
--- a/src/devices/bus/nes/nes_slot.h
+++ b/src/devices/bus/nes/nes_slot.h
@@ -363,7 +363,7 @@ public:
virtual device_image_partialhash_func get_partial_hash() const override { return &nes_partialhash; }
// slot interface overrides
- virtual void get_default_card_software(std::string &result) override;
+ virtual std::string get_default_card_software() override;
const char * get_default_card_ines(UINT8 *ROM, UINT32 len);
const char * get_default_card_unif(UINT8 *ROM, UINT32 len);
const char * nes_get_slot(int pcb_id);
diff --git a/src/devices/bus/nes/sunsoft_dcs.cpp b/src/devices/bus/nes/sunsoft_dcs.cpp
index 8be24a9c66d..25d1a1db623 100644
--- a/src/devices/bus/nes/sunsoft_dcs.cpp
+++ b/src/devices/bus/nes/sunsoft_dcs.cpp
@@ -107,13 +107,13 @@ bool nes_ntb_slot_device::call_load()
bool nes_ntb_slot_device::call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry)
{
- load_software_part_region(*this, swlist, swname, start_entry );
+ machine().rom_load().load_software_part_region(*this, swlist, swname, start_entry );
return TRUE;
}
-void nes_ntb_slot_device::get_default_card_software(std::string &result)
+std::string nes_ntb_slot_device::get_default_card_software()
{
- software_get_default_slot(result, "ntbrom");
+ return software_get_default_slot("ntbrom");
}
//-----------------------------------------------
diff --git a/src/devices/bus/nes/sunsoft_dcs.h b/src/devices/bus/nes/sunsoft_dcs.h
index a6437cb4638..83393719cf7 100644
--- a/src/devices/bus/nes/sunsoft_dcs.h
+++ b/src/devices/bus/nes/sunsoft_dcs.h
@@ -61,7 +61,7 @@ public:
virtual const option_guide *create_option_guide() const override { return nullptr; }
// slot interface overrides
- virtual void get_default_card_software(std::string &result) override;
+ virtual std::string get_default_card_software() override;
virtual DECLARE_READ8_MEMBER(read);
diff --git a/src/devices/bus/nes_ctrl/arkpaddle.cpp b/src/devices/bus/nes_ctrl/arkpaddle.cpp
index 5e7e6bc992e..15755d283ca 100644
--- a/src/devices/bus/nes_ctrl/arkpaddle.cpp
+++ b/src/devices/bus/nes_ctrl/arkpaddle.cpp
@@ -103,7 +103,7 @@ UINT8 nes_vaus_device::read_bit34()
UINT8 nes_vausfc_device::read_exp(offs_t offset)
{
- UINT8 ret = 0;
+ UINT8 ret;
if (offset == 0) //$4016
ret = m_button->read() << 1;
else //$4017
diff --git a/src/devices/bus/nubus/nubus_image.cpp b/src/devices/bus/nubus/nubus_image.cpp
index e9c94e9c891..412925fc351 100644
--- a/src/devices/bus/nubus/nubus_image.cpp
+++ b/src/devices/bus/nubus/nubus_image.cpp
@@ -58,7 +58,7 @@ public:
virtual void device_reset() override;
public:
UINT32 m_size;
- UINT8 *m_data;
+ std::unique_ptr<UINT8[]> m_data;
bool m_ejected;
};
@@ -86,7 +86,7 @@ void messimg_disk_image_device::device_config_complete()
void messimg_disk_image_device::device_start()
{
- m_data = (UINT8 *)nullptr;
+ m_data = nullptr;
if (exists() && fseek(0, SEEK_END) == 0)
{
@@ -105,9 +105,9 @@ bool messimg_disk_image_device::call_load()
return IMAGE_INIT_FAIL;
}
- m_data = (UINT8 *)auto_alloc_array_clear(machine(), UINT32, m_size/sizeof(UINT32));
+ m_data = make_unique_clear<UINT8[]>(m_size);
fseek(0, SEEK_SET);
- fread(m_data, m_size);
+ fread(m_data.get(), m_size);
m_ejected = false;
return IMAGE_INIT_PASS;
@@ -117,7 +117,7 @@ void messimg_disk_image_device::call_unload()
{
// TODO: track dirty sectors and only write those
fseek(0, SEEK_SET);
- fwrite(m_data, m_size);
+ fwrite(m_data.get(), m_size);
m_size = 0;
//free(m_data);
}
@@ -255,7 +255,7 @@ READ32_MEMBER( nubus_image_device::image_r )
WRITE32_MEMBER( nubus_image_device::image_super_w )
{
- UINT32 *image = (UINT32*)m_image->m_data;
+ UINT32 *image = (UINT32*)m_image->m_data.get();
data = ((data & 0xff) << 24) | ((data & 0xff00) << 8) | ((data & 0xff0000) >> 8) | ((data & 0xff000000) >> 24);
mem_mask = ((mem_mask & 0xff) << 24) | ((mem_mask & 0xff00) << 8) | ((mem_mask & 0xff0000) >> 8) | ((mem_mask & 0xff000000) >> 24);
@@ -264,14 +264,14 @@ WRITE32_MEMBER( nubus_image_device::image_super_w )
READ32_MEMBER( nubus_image_device::image_super_r )
{
- UINT32 *image = (UINT32*)m_image->m_data;
+ UINT32 *image = (UINT32*)m_image->m_data.get();
UINT32 data = image[offset];
return ((data & 0xff) << 24) | ((data & 0xff00) << 8) | ((data & 0xff0000) >> 8) | ((data & 0xff000000) >> 24);
}
WRITE32_MEMBER( nubus_image_device::file_cmd_w )
{
- const osd_directory_entry *dp = nullptr;
+ const osd_directory_entry *dp;
char fullpath[1024];
UINT64 filesize;
diff --git a/src/devices/bus/odyssey2/slot.cpp b/src/devices/bus/odyssey2/slot.cpp
index e4d3f4c8d3c..0a6e35028b9 100644
--- a/src/devices/bus/odyssey2/slot.cpp
+++ b/src/devices/bus/odyssey2/slot.cpp
@@ -200,7 +200,7 @@ bool o2_cart_slot_device::call_load()
bool o2_cart_slot_device::call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry)
{
- load_software_part_region(*this, swlist, swname, start_entry);
+ machine().rom_load().load_software_part_region(*this, swlist, swname, start_entry);
return TRUE;
}
@@ -209,11 +209,11 @@ bool o2_cart_slot_device::call_softlist_load(software_list_device &swlist, const
get default card software
-------------------------------------------------*/
-void o2_cart_slot_device::get_default_card_software(std::string &result)
+std::string o2_cart_slot_device::get_default_card_software()
{
if (open_image_file(mconfig().options()))
{
- const char *slot_string = "o2_rom";
+ const char *slot_string;
UINT32 size = core_fsize(m_file);
int type = O2_STD;
@@ -227,11 +227,10 @@ void o2_cart_slot_device::get_default_card_software(std::string &result)
//printf("type: %s\n", slot_string);
clear();
- result.assign(slot_string);
- return;
+ return std::string(slot_string);
}
- software_get_default_slot(result, "o2_rom");
+ return software_get_default_slot("o2_rom");
}
/*-------------------------------------------------
diff --git a/src/devices/bus/odyssey2/slot.h b/src/devices/bus/odyssey2/slot.h
index 59b576af30f..6634ed57c61 100644
--- a/src/devices/bus/odyssey2/slot.h
+++ b/src/devices/bus/odyssey2/slot.h
@@ -84,7 +84,7 @@ public:
virtual const char *file_extensions() const override { return "bin,rom"; }
// slot interface overrides
- virtual void get_default_card_software(std::string &result) override;
+ virtual std::string get_default_card_software() override;
// reading and writing
virtual DECLARE_READ8_MEMBER(read_rom04);
diff --git a/src/devices/bus/pc_kbd/pcat84.cpp b/src/devices/bus/pc_kbd/pcat84.cpp
index 471333e9d18..eeaf9494fd3 100644
--- a/src/devices/bus/pc_kbd/pcat84.cpp
+++ b/src/devices/bus/pc_kbd/pcat84.cpp
@@ -580,9 +580,9 @@ WRITE8_MEMBER( ibm_pc_at_84_keyboard_device::p2_w )
*/
- output_set_led_value(LED_SCROLL, BIT(data, 0));
- output_set_led_value(LED_NUM, BIT(data, 1));
- output_set_led_value(LED_CAPS, BIT(data, 2));
+ machine().output().set_led_value(LED_SCROLL, BIT(data, 0));
+ machine().output().set_led_value(LED_NUM, BIT(data, 1));
+ machine().output().set_led_value(LED_CAPS, BIT(data, 2));
m_pc_kbdc->data_write_from_kb(!BIT(data, 7));
m_pc_kbdc->clock_write_from_kb(!BIT(data, 6));
diff --git a/src/devices/bus/pce/pce_slot.cpp b/src/devices/bus/pce/pce_slot.cpp
index 254993a4714..4fffa5172fc 100644
--- a/src/devices/bus/pce/pce_slot.cpp
+++ b/src/devices/bus/pce/pce_slot.cpp
@@ -226,7 +226,7 @@ bool pce_cart_slot_device::call_load()
{
if (m_cart)
{
- UINT32 offset = 0;
+ UINT32 offset;
UINT32 len = (software_entry() == nullptr) ? length() : get_software_region_length("rom");
UINT8 *ROM;
@@ -300,7 +300,7 @@ void pce_cart_slot_device::call_unload()
bool pce_cart_slot_device::call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry)
{
- load_software_part_region(*this, swlist, swname, start_entry);
+ machine().rom_load().load_software_part_region(*this, swlist, swname, start_entry);
return TRUE;
}
@@ -339,11 +339,11 @@ int pce_cart_slot_device::get_cart_type(UINT8 *ROM, UINT32 len)
get default card software
-------------------------------------------------*/
-void pce_cart_slot_device::get_default_card_software(std::string &result)
+std::string pce_cart_slot_device::get_default_card_software()
{
if (open_image_file(mconfig().options()))
{
- const char *slot_string = "rom";
+ const char *slot_string;
UINT32 len = core_fsize(m_file);
dynamic_buffer rom(len);
int type;
@@ -356,11 +356,10 @@ void pce_cart_slot_device::get_default_card_software(std::string &result)
//printf("type: %s\n", slot_string);
clear();
- result.assign(slot_string);
- return;
+ return std::string(slot_string);
}
- software_get_default_slot(result, "rom");
+ return software_get_default_slot("rom");
}
/*-------------------------------------------------
diff --git a/src/devices/bus/pce/pce_slot.h b/src/devices/bus/pce/pce_slot.h
index cb9036b02c7..e680ef7b950 100644
--- a/src/devices/bus/pce/pce_slot.h
+++ b/src/devices/bus/pce/pce_slot.h
@@ -73,7 +73,6 @@ public:
int get_type() { return m_type; }
int get_cart_type(UINT8 *ROM, UINT32 len);
- void setup_ram(UINT8 banks);
void internal_header_logging(UINT8 *ROM, UINT32 len);
void set_intf(const char * interface) { m_interface = interface; }
@@ -89,7 +88,7 @@ public:
virtual const char *file_extensions() const override { return "pce,bin"; }
// slot interface overrides
- virtual void get_default_card_software(std::string &result) override;
+ virtual std::string get_default_card_software() override;
// reading and writing
virtual DECLARE_READ8_MEMBER(read_cart);
diff --git a/src/devices/bus/pet/64k.cpp b/src/devices/bus/pet/64k.cpp
index 4bc9c01d596..dfdc278a77d 100644
--- a/src/devices/bus/pet/64k.cpp
+++ b/src/devices/bus/pet/64k.cpp
@@ -28,7 +28,7 @@ const device_type PET_64K = &device_creator<pet_64k_expansion_device>;
inline UINT8 pet_64k_expansion_device::read_ram(offs_t offset)
{
- UINT8 data = 0;
+ UINT8 data;
if (offset < 0xc000)
{
diff --git a/src/devices/bus/pet/hsg.cpp b/src/devices/bus/pet/hsg.cpp
index 5f2d7d1df9d..d0bd43d0020 100644
--- a/src/devices/bus/pet/hsg.cpp
+++ b/src/devices/bus/pet/hsg.cpp
@@ -26,7 +26,7 @@
//**************************************************************************
#define EF9365_TAG "ef9365"
-#define EF9366_TAG "ef9366"
+#define EF9366_TAG EF9365_TAG
#define SCREEN_TAG "screen"
@@ -63,13 +63,23 @@ const rom_entry *cbm8000_hsg_t::device_rom_region() const
//-------------------------------------------------
-// screen_update -
+// ADDRESS_MAP( hsg_a_map )
//-------------------------------------------------
-UINT32 cbm8000_hsg_t::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
-{
- return 0;
-}
+static ADDRESS_MAP_START( hsg_a_map, AS_0, 8, cbm8000_hsg_a_t )
+ ADDRESS_MAP_GLOBAL_MASK(0x7fff)
+ AM_RANGE(0x0000, 0x7fff) AM_RAM
+ADDRESS_MAP_END
+
+
+//-------------------------------------------------
+// ADDRESS_MAP( hsg_b_map )
+//-------------------------------------------------
+
+static ADDRESS_MAP_START( hsg_b_map, AS_0, 8, cbm8000_hsg_b_t )
+ ADDRESS_MAP_GLOBAL_MASK(0x3fff)
+ AM_RANGE(0x0000, 0x3fff) AM_RAM
+ADDRESS_MAP_END
//-------------------------------------------------
@@ -78,13 +88,18 @@ UINT32 cbm8000_hsg_t::screen_update(screen_device &screen, bitmap_rgb32 &bitmap,
static MACHINE_CONFIG_FRAGMENT( cbm8000_hsg_a )
MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
- MCFG_SCREEN_UPDATE_DEVICE(DEVICE_SELF, cbm8000_hsg_t, screen_update)
+ MCFG_SCREEN_UPDATE_DEVICE(EF9365_TAG, ef9365_device, screen_update)
MCFG_SCREEN_SIZE(512, 512)
MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 512-1)
MCFG_SCREEN_REFRESH_RATE(25)
MCFG_PALETTE_ADD_MONOCHROME_GREEN("palette")
- //MCFG_DEVICE_ADD(EF9365_TAG, EF9365, 0)
+ MCFG_DEVICE_ADD(EF9365_TAG, EF9365, 1750000)
+ MCFG_VIDEO_SET_SCREEN(SCREEN_TAG)
+ MCFG_DEVICE_ADDRESS_MAP(AS_0, hsg_a_map)
+ MCFG_EF936X_PALETTE("palette")
+ MCFG_EF936X_BITPLANES_CNT(1);
+ MCFG_EF936X_DISPLAYMODE(EF936X_512x512_DISPLAY_MODE);
MACHINE_CONFIG_END
@@ -94,13 +109,18 @@ MACHINE_CONFIG_END
static MACHINE_CONFIG_FRAGMENT( cbm8000_hsg_b )
MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
- MCFG_SCREEN_UPDATE_DEVICE(DEVICE_SELF, cbm8000_hsg_t, screen_update)
+ MCFG_SCREEN_UPDATE_DEVICE(EF9366_TAG, ef9365_device, screen_update)
MCFG_SCREEN_SIZE(512, 256)
MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1)
MCFG_SCREEN_REFRESH_RATE(50)
MCFG_PALETTE_ADD_MONOCHROME_GREEN("palette")
- //MCFG_DEVICE_ADD(EF9366_TAG, EF9366, 0)
+ MCFG_DEVICE_ADD(EF9366_TAG, EF9365, 1750000)
+ MCFG_VIDEO_SET_SCREEN(SCREEN_TAG)
+ MCFG_DEVICE_ADDRESS_MAP(AS_0, hsg_b_map)
+ MCFG_EF936X_PALETTE("palette")
+ MCFG_EF936X_BITPLANES_CNT(1);
+ MCFG_EF936X_DISPLAYMODE(EF936X_512x256_DISPLAY_MODE);
MACHINE_CONFIG_END
@@ -132,6 +152,7 @@ machine_config_constructor cbm8000_hsg_b_t::device_mconfig_additions() const
cbm8000_hsg_t::cbm8000_hsg_t(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source) :
device_t(mconfig, type, name, tag, owner, clock, shortname, source),
device_pet_expansion_card_interface(mconfig, *this),
+ m_gdc(*this, EF9365_TAG),
m_9000(*this, "9000"),
m_a000(*this, "a000")
{
@@ -139,13 +160,11 @@ cbm8000_hsg_t::cbm8000_hsg_t(const machine_config &mconfig, device_type type, co
cbm8000_hsg_a_t::cbm8000_hsg_a_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
cbm8000_hsg_t(mconfig, CBM8000_HSG_A, "CBM 8000 High Speed Graphics (A)", tag, owner, clock, "cbm8000_hsg_a", __FILE__)
- //m_gdc(*this, EF9365_TAG)
{
}
cbm8000_hsg_b_t::cbm8000_hsg_b_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
cbm8000_hsg_t(mconfig, CBM8000_HSG_B, "CBM 8000 High Speed Graphics (B)", tag, owner, clock, "cbm8000_hsg_b", __FILE__)
- //m_gdc(*this, EF9366_TAG)
{
}
@@ -165,7 +184,7 @@ void cbm8000_hsg_t::device_start()
void cbm8000_hsg_t::device_reset()
{
- //m_gdc->reset();
+ m_gdc->reset();
}
@@ -219,7 +238,7 @@ UINT8 cbm8000_hsg_t::pet_bd_r(address_space &space, offs_t offset, UINT8 data, i
}
else if (offset >= 0xaf70 && offset < 0xaf80)
{
- //data = m_gdc->data_r(space, offset & 0x0f);
+ data = m_gdc->data_r(space, offset & 0x0f);
}
break;
}
@@ -253,6 +272,6 @@ void cbm8000_hsg_t::pet_bd_w(address_space &space, offs_t offset, UINT8 data, in
}
else if (offset >= 0xaf70 && offset < 0xaf80)
{
- //m_gdc->data_w(space, offset & 0x0f, data);
+ m_gdc->data_w(space, offset & 0x0f, data);
}
}
diff --git a/src/devices/bus/pet/hsg.h b/src/devices/bus/pet/hsg.h
index 3b5dcaeb9ee..c8d81463b5b 100644
--- a/src/devices/bus/pet/hsg.h
+++ b/src/devices/bus/pet/hsg.h
@@ -13,6 +13,7 @@
#include "emu.h"
#include "exp.h"
+#include "video/ef9365.h"
@@ -28,7 +29,6 @@ class cbm8000_hsg_t : public device_t,
public:
// construction/destruction
cbm8000_hsg_t(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source);
- cbm8000_hsg_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
// optional information overrides
virtual const rom_entry *device_rom_region() const override;
@@ -46,7 +46,7 @@ protected:
virtual void device_reset() override;
private:
- //required_device<ef9365_device> m_gdc;
+ required_device<ef9365_device> m_gdc;
required_memory_region m_9000;
required_memory_region m_a000;
};
diff --git a/src/devices/bus/plus4/c1551.cpp b/src/devices/bus/plus4/c1551.cpp
index 4e10f777702..4e24bb153e9 100644
--- a/src/devices/bus/plus4/c1551.cpp
+++ b/src/devices/bus/plus4/c1551.cpp
@@ -108,7 +108,7 @@ WRITE8_MEMBER( c1551_t::port_w )
m_ga->mtr_w(BIT(data, 2));
// activity LED
- output_set_led_value(LED_ACT, BIT(data, 3));
+ machine().output().set_led_value(LED_ACT, BIT(data, 3));
// density select
m_ga->ds_w((data >> 5) & 0x03);
diff --git a/src/devices/bus/plus4/c1551.h b/src/devices/bus/plus4/c1551.h
index 04a8a1a7a47..af10e75daed 100644
--- a/src/devices/bus/plus4/c1551.h
+++ b/src/devices/bus/plus4/c1551.h
@@ -45,13 +45,9 @@ public:
DECLARE_WRITE8_MEMBER( tcbm_data_w );
DECLARE_READ8_MEMBER( tpi0_r );
DECLARE_WRITE8_MEMBER( tpi0_w );
- DECLARE_READ8_MEMBER( yb_r );
- DECLARE_WRITE8_MEMBER( yb_w );
DECLARE_READ8_MEMBER( tpi0_pc_r );
DECLARE_WRITE8_MEMBER( tpi0_pc_w );
- DECLARE_READ8_MEMBER( tpi1_pa_r );
- DECLARE_WRITE8_MEMBER( tpi1_pa_w );
DECLARE_READ8_MEMBER( tpi1_pb_r );
DECLARE_READ8_MEMBER( tpi1_pc_r );
DECLARE_WRITE8_MEMBER( tpi1_pc_w );
diff --git a/src/devices/bus/plus4/exp.cpp b/src/devices/bus/plus4/exp.cpp
index 5ea6289b2cc..47f404cacf4 100644
--- a/src/devices/bus/plus4/exp.cpp
+++ b/src/devices/bus/plus4/exp.cpp
@@ -147,7 +147,7 @@ bool plus4_expansion_slot_device::call_load()
bool plus4_expansion_slot_device::call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry)
{
- load_software_part_region(*this, swlist, swname, start_entry);
+ machine().rom_load().load_software_part_region(*this, swlist, swname, start_entry);
return true;
}
@@ -157,9 +157,9 @@ bool plus4_expansion_slot_device::call_softlist_load(software_list_device &swlis
// get_default_card_software -
//-------------------------------------------------
-void plus4_expansion_slot_device::get_default_card_software(std::string &result)
+std::string plus4_expansion_slot_device::get_default_card_software()
{
- software_get_default_slot(result, "standard");
+ return software_get_default_slot("standard");
}
diff --git a/src/devices/bus/plus4/exp.h b/src/devices/bus/plus4/exp.h
index 616857711c8..3595b013f98 100644
--- a/src/devices/bus/plus4/exp.h
+++ b/src/devices/bus/plus4/exp.h
@@ -135,7 +135,7 @@ protected:
virtual const option_guide *create_option_guide() const override { return nullptr; }
// slot interface overrides
- virtual void get_default_card_software(std::string &result) override;
+ virtual std::string get_default_card_software() override;
devcb_write_line m_write_irq;
devcb_read8 m_read_dma_cd;
diff --git a/src/devices/bus/ql/cst_q_plus4.h b/src/devices/bus/ql/cst_q_plus4.h
index 29437632b1a..eba0f3ac712 100644
--- a/src/devices/bus/ql/cst_q_plus4.h
+++ b/src/devices/bus/ql/cst_q_plus4.h
@@ -28,7 +28,6 @@ class cst_q_plus4_t : public device_t,
public:
// construction/destruction
cst_q_plus4_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
- cst_q_plus4_t(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source, int ram_size);
// optional information overrides
virtual const rom_entry *device_rom_region() const override;
diff --git a/src/devices/bus/ql/cst_qdisc.h b/src/devices/bus/ql/cst_qdisc.h
index ec9f5a253e9..d2ddae10b2e 100644
--- a/src/devices/bus/ql/cst_qdisc.h
+++ b/src/devices/bus/ql/cst_qdisc.h
@@ -27,7 +27,6 @@ class cst_ql_disc_interface_t : public device_t,
public:
// construction/destruction
cst_ql_disc_interface_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
- cst_ql_disc_interface_t(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source, int ram_size);
// optional information overrides
virtual const rom_entry *device_rom_region() const override;
diff --git a/src/devices/bus/ql/cumana_fdi.h b/src/devices/bus/ql/cumana_fdi.h
index fa3d0d0a7ae..9ac1b9ba01e 100644
--- a/src/devices/bus/ql/cumana_fdi.h
+++ b/src/devices/bus/ql/cumana_fdi.h
@@ -27,7 +27,6 @@ class cumana_floppy_disk_interface_t : public device_t,
public:
// construction/destruction
cumana_floppy_disk_interface_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
- cumana_floppy_disk_interface_t(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source, int ram_size);
// optional information overrides
virtual const rom_entry *device_rom_region() const override;
diff --git a/src/devices/bus/ql/kempston_di.h b/src/devices/bus/ql/kempston_di.h
index f0fe15a0f34..041bdc65544 100644
--- a/src/devices/bus/ql/kempston_di.h
+++ b/src/devices/bus/ql/kempston_di.h
@@ -27,7 +27,6 @@ class kempston_disk_interface_t : public device_t,
public:
// construction/destruction
kempston_disk_interface_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
- kempston_disk_interface_t(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source, int ram_size);
// optional information overrides
virtual const rom_entry *device_rom_region() const override;
diff --git a/src/devices/bus/ql/miracle_gold_card.h b/src/devices/bus/ql/miracle_gold_card.h
index 694ce2af578..176f7556fdf 100644
--- a/src/devices/bus/ql/miracle_gold_card.h
+++ b/src/devices/bus/ql/miracle_gold_card.h
@@ -27,7 +27,6 @@ class miracle_gold_card_t : public device_t,
public:
// construction/destruction
miracle_gold_card_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
- miracle_gold_card_t(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source, int ram_size);
// optional information overrides
virtual const rom_entry *device_rom_region() const override;
diff --git a/src/devices/bus/ql/miracle_hd.h b/src/devices/bus/ql/miracle_hd.h
index df4dc99a47b..c4aeaa6d74b 100644
--- a/src/devices/bus/ql/miracle_hd.h
+++ b/src/devices/bus/ql/miracle_hd.h
@@ -27,7 +27,6 @@ class miracle_hard_disk_t : public device_t,
public:
// construction/destruction
miracle_hard_disk_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
- miracle_hard_disk_t(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source, int ram_size);
// optional information overrides
virtual const rom_entry *device_rom_region() const override;
diff --git a/src/devices/bus/ql/mp_fdi.h b/src/devices/bus/ql/mp_fdi.h
index d5e485ba3af..57681f30d28 100644
--- a/src/devices/bus/ql/mp_fdi.h
+++ b/src/devices/bus/ql/mp_fdi.h
@@ -27,7 +27,6 @@ class micro_peripherals_floppy_disk_interface_t : public device_t,
public:
// construction/destruction
micro_peripherals_floppy_disk_interface_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
- micro_peripherals_floppy_disk_interface_t(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source, int ram_size);
// optional information overrides
virtual const rom_entry *device_rom_region() const override;
diff --git a/src/devices/bus/ql/opd_basic_master.h b/src/devices/bus/ql/opd_basic_master.h
index 3edf027fe92..16608210cf2 100644
--- a/src/devices/bus/ql/opd_basic_master.h
+++ b/src/devices/bus/ql/opd_basic_master.h
@@ -27,7 +27,6 @@ class opd_basic_master_t : public device_t,
public:
// construction/destruction
opd_basic_master_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
- opd_basic_master_t(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source, int ram_size);
// optional information overrides
virtual const rom_entry *device_rom_region() const override;
diff --git a/src/devices/bus/ql/pcml_qdisk.h b/src/devices/bus/ql/pcml_qdisk.h
index a4062c8ab9f..29a011b7455 100644
--- a/src/devices/bus/ql/pcml_qdisk.h
+++ b/src/devices/bus/ql/pcml_qdisk.h
@@ -27,7 +27,6 @@ class pcml_q_disk_interface_t : public device_t,
public:
// construction/destruction
pcml_q_disk_interface_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
- pcml_q_disk_interface_t(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source, int ram_size);
// optional information overrides
virtual const rom_entry *device_rom_region() const override;
diff --git a/src/devices/bus/ql/qubide.h b/src/devices/bus/ql/qubide.h
index 29e1fde3fa8..f8a363b55a2 100644
--- a/src/devices/bus/ql/qubide.h
+++ b/src/devices/bus/ql/qubide.h
@@ -28,7 +28,6 @@ class qubide_t : public device_t,
public:
// construction/destruction
qubide_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
- qubide_t(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source, int ram_size);
// optional information overrides
virtual const rom_entry *device_rom_region() const override;
diff --git a/src/devices/bus/ql/rom.cpp b/src/devices/bus/ql/rom.cpp
index 6474957a7da..bd17b2cb1b8 100644
--- a/src/devices/bus/ql/rom.cpp
+++ b/src/devices/bus/ql/rom.cpp
@@ -79,7 +79,7 @@ bool ql_rom_cartridge_slot_t::call_load()
{
if (m_card)
{
- size_t size = 0;
+ size_t size;
if (software_entry() == nullptr)
{
@@ -104,7 +104,7 @@ bool ql_rom_cartridge_slot_t::call_load()
bool ql_rom_cartridge_slot_t::call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry)
{
- load_software_part_region(*this, swlist, swname, start_entry);
+ machine().rom_load().load_software_part_region(*this, swlist, swname, start_entry);
return true;
}
@@ -114,9 +114,9 @@ bool ql_rom_cartridge_slot_t::call_softlist_load(software_list_device &swlist, c
// get_default_card_software -
//-------------------------------------------------
-void ql_rom_cartridge_slot_t::get_default_card_software(std::string &result)
+std::string ql_rom_cartridge_slot_t::get_default_card_software()
{
- software_get_default_slot(result, "standard");
+ return software_get_default_slot("standard");
}
diff --git a/src/devices/bus/ql/rom.h b/src/devices/bus/ql/rom.h
index e2c9a89818e..282c47cac3d 100644
--- a/src/devices/bus/ql/rom.h
+++ b/src/devices/bus/ql/rom.h
@@ -110,7 +110,7 @@ protected:
virtual const option_guide *create_option_guide() const override { return nullptr; }
// slot interface overrides
- virtual void get_default_card_software(std::string &result) override;
+ virtual std::string get_default_card_software() override;
device_ql_rom_cartridge_card_interface *m_card;
};
diff --git a/src/devices/bus/rs232/keyboard.h b/src/devices/bus/rs232/keyboard.h
index 38d9dfbc56e..37e2097b8fb 100644
--- a/src/devices/bus/rs232/keyboard.h
+++ b/src/devices/bus/rs232/keyboard.h
@@ -18,7 +18,6 @@ public:
serial_keyboard_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source);
virtual DECLARE_WRITE_LINE_MEMBER( input_txd ) override { device_serial_interface::rx_w(state); }
- DECLARE_READ_LINE_MEMBER(tx_r);
virtual ioport_constructor device_input_ports() const override;
diff --git a/src/devices/bus/rs232/xvd701.h b/src/devices/bus/rs232/xvd701.h
index 5f7b6a7ba64..29f6dd0a5a9 100644
--- a/src/devices/bus/rs232/xvd701.h
+++ b/src/devices/bus/rs232/xvd701.h
@@ -14,9 +14,6 @@ public:
virtual machine_config_constructor device_mconfig_additions() const override;
virtual WRITE_LINE_MEMBER( input_txd ) override { device_serial_interface::rx_w(state); }
-
- DECLARE_WRITE_LINE_MEMBER(update_serial);
-
protected:
virtual ioport_constructor device_input_ports() const override;
virtual void device_start() override;
diff --git a/src/devices/bus/saturn/sat_slot.cpp b/src/devices/bus/saturn/sat_slot.cpp
index 7e1f0cd1233..dba415c8a47 100644
--- a/src/devices/bus/saturn/sat_slot.cpp
+++ b/src/devices/bus/saturn/sat_slot.cpp
@@ -210,7 +210,7 @@ void sat_cart_slot_device::call_unload()
bool sat_cart_slot_device::call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry)
{
- load_software_part_region(*this, swlist, swname, start_entry);
+ machine().rom_load().load_software_part_region(*this, swlist, swname, start_entry);
return TRUE;
}
@@ -219,9 +219,9 @@ bool sat_cart_slot_device::call_softlist_load(software_list_device &swlist, cons
get default card software
-------------------------------------------------*/
-void sat_cart_slot_device::get_default_card_software(std::string &result)
+std::string sat_cart_slot_device::get_default_card_software()
{
- software_get_default_slot(result, "rom");
+ return software_get_default_slot("rom");
}
diff --git a/src/devices/bus/saturn/sat_slot.h b/src/devices/bus/saturn/sat_slot.h
index 075848ee409..e8a711c3a0b 100644
--- a/src/devices/bus/saturn/sat_slot.h
+++ b/src/devices/bus/saturn/sat_slot.h
@@ -89,7 +89,7 @@ public:
virtual const char *file_extensions() const override { return "bin"; }
// slot interface overrides
- virtual void get_default_card_software(std::string &result) override;
+ virtual std::string get_default_card_software() override;
// reading and writing
virtual DECLARE_READ32_MEMBER(read_rom);
diff --git a/src/devices/bus/scv/slot.cpp b/src/devices/bus/scv/slot.cpp
index e29221b411a..15495afe918 100644
--- a/src/devices/bus/scv/slot.cpp
+++ b/src/devices/bus/scv/slot.cpp
@@ -216,7 +216,7 @@ bool scv_cart_slot_device::call_load()
bool scv_cart_slot_device::call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry)
{
- load_software_part_region(*this, swlist, swname, start_entry);
+ machine().rom_load().load_software_part_region(*this, swlist, swname, start_entry);
return TRUE;
}
@@ -259,11 +259,11 @@ int scv_cart_slot_device::get_cart_type(UINT8 *ROM, UINT32 len)
get default card software
-------------------------------------------------*/
-void scv_cart_slot_device::get_default_card_software(std::string &result)
+std::string scv_cart_slot_device::get_default_card_software()
{
if (open_image_file(mconfig().options()))
{
- const char *slot_string = "rom8k";
+ const char *slot_string;
UINT32 len = core_fsize(m_file);
dynamic_buffer rom(len);
int type;
@@ -276,11 +276,10 @@ void scv_cart_slot_device::get_default_card_software(std::string &result)
//printf("type: %s\n", slot_string);
clear();
- result.assign(slot_string);
- return;
+ return std::string(slot_string);
}
- software_get_default_slot(result, "rom8k");
+ return software_get_default_slot("rom8k");
}
/*-------------------------------------------------
diff --git a/src/devices/bus/scv/slot.h b/src/devices/bus/scv/slot.h
index 1befef08f28..3fa5a02578a 100644
--- a/src/devices/bus/scv/slot.h
+++ b/src/devices/bus/scv/slot.h
@@ -88,7 +88,7 @@ public:
virtual const char *file_extensions() const override { return "bin"; }
// slot interface overrides
- virtual void get_default_card_software(std::string &result) override;
+ virtual std::string get_default_card_software() override;
// reading and writing
virtual DECLARE_READ8_MEMBER(read_cart);
diff --git a/src/devices/bus/sega8/sega8_slot.cpp b/src/devices/bus/sega8/sega8_slot.cpp
index c88be013d3f..df3c59adc05 100644
--- a/src/devices/bus/sega8/sega8_slot.cpp
+++ b/src/devices/bus/sega8/sega8_slot.cpp
@@ -421,7 +421,7 @@ void sega8_cart_slot_device::call_unload()
bool sega8_cart_slot_device::call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry)
{
- load_software_part_region(*this, swlist, swname, start_entry);
+ machine().rom_load().load_software_part_region(*this, swlist, swname, start_entry);
return TRUE;
}
@@ -603,11 +603,11 @@ int sega8_cart_slot_device::get_cart_type(UINT8 *ROM, UINT32 len)
get default card software
-------------------------------------------------*/
-void sega8_cart_slot_device::get_default_card_software(std::string &result)
+std::string sega8_cart_slot_device::get_default_card_software()
{
if (open_image_file(mconfig().options()))
{
- const char *slot_string = "rom";
+ const char *slot_string;
UINT32 len = core_fsize(m_file), offset = 0;
dynamic_buffer rom(len);
int type;
@@ -623,11 +623,10 @@ void sega8_cart_slot_device::get_default_card_software(std::string &result)
//printf("type: %s\n", slot_string);
clear();
- result.assign(slot_string);
- return;
+ return std::string(slot_string);
}
- software_get_default_slot(result, "rom");
+ return software_get_default_slot("rom");
}
@@ -725,7 +724,7 @@ void sega8_cart_slot_device::internal_header_logging(UINT8 *ROM, UINT32 len, UIN
char reserved[10];
UINT8 version, csum_size, region, serial[3];
UINT16 checksum, csum = 0;
- UINT32 csum_end = 0;
+ UINT32 csum_end;
// LOG FILE DETAILS
logerror("FILE DETAILS\n" );
diff --git a/src/devices/bus/sega8/sega8_slot.h b/src/devices/bus/sega8/sega8_slot.h
index 64f332e5e81..439bc3be7a2 100644
--- a/src/devices/bus/sega8/sega8_slot.h
+++ b/src/devices/bus/sega8/sega8_slot.h
@@ -71,9 +71,6 @@ public:
UINT32 get_rom_size() { return m_rom_size; }
UINT32 get_ram_size() { return m_ram.size(); }
- void rom_map_setup(UINT32 size);
- void ram_map_setup(UINT8 banks);
-
void save_ram() { device().save_item(NAME(m_ram)); }
//private:
@@ -140,7 +137,7 @@ public:
virtual const char *file_extensions() const override { return m_extensions; }
// slot interface overrides
- virtual void get_default_card_software(std::string &result) override;
+ virtual std::string get_default_card_software() override;
// reading and writing
virtual DECLARE_READ8_MEMBER(read_cart);
diff --git a/src/devices/bus/sms_ctrl/lphaser.cpp b/src/devices/bus/sms_ctrl/lphaser.cpp
index 54e03d5627e..7c1056da5f0 100644
--- a/src/devices/bus/sms_ctrl/lphaser.cpp
+++ b/src/devices/bus/sms_ctrl/lphaser.cpp
@@ -38,7 +38,7 @@ INPUT_CHANGED_MEMBER( sms_light_phaser_device::position_changed )
static INPUT_PORTS_START( sms_light_phaser )
PORT_START("CTRL_PORT")
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) // TL (trigger)
- PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, sms_light_phaser_device, th_pin_r, NULL)
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, sms_light_phaser_device, th_pin_r, nullptr)
PORT_BIT( 0x9f, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("LPHASER_X")
diff --git a/src/devices/bus/sms_ctrl/paddle.cpp b/src/devices/bus/sms_ctrl/paddle.cpp
index e2418f38345..5486c9a50bd 100644
--- a/src/devices/bus/sms_ctrl/paddle.cpp
+++ b/src/devices/bus/sms_ctrl/paddle.cpp
@@ -41,11 +41,11 @@ CUSTOM_INPUT_MEMBER( sms_paddle_device::tr_pin_r )
static INPUT_PORTS_START( sms_paddle )
PORT_START("CTRL_PORT")
- PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, sms_paddle_device, dir_pins_r, NULL) // Directional pins
+ PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, sms_paddle_device, dir_pins_r, nullptr) // Directional pins
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED ) // Vcc
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) // TL
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) // TH
- PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, sms_paddle_device, tr_pin_r, NULL)
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, sms_paddle_device, tr_pin_r, nullptr)
PORT_START("PADDLE_X") // Paddle knob
PORT_BIT( 0xff, 0x80, IPT_PADDLE) PORT_SENSITIVITY(40) PORT_KEYDELTA(20) PORT_CENTERDELTA(0) PORT_MINMAX(0,255)
diff --git a/src/devices/bus/sms_ctrl/rfu.cpp b/src/devices/bus/sms_ctrl/rfu.cpp
index 3da326aa378..2b43b31a6b8 100644
--- a/src/devices/bus/sms_ctrl/rfu.cpp
+++ b/src/devices/bus/sms_ctrl/rfu.cpp
@@ -81,7 +81,7 @@ void sms_rapid_fire_device::device_start()
UINT8 sms_rapid_fire_device::peripheral_r()
{
- UINT8 data = 0xff;
+ UINT8 data;
int num_intervals = (machine().time() - m_start_time).as_double() / m_interval.as_double();
m_read_state = num_intervals & 1;
diff --git a/src/devices/bus/sms_ctrl/sports.cpp b/src/devices/bus/sms_ctrl/sports.cpp
index e7ea829372c..68a2b142eec 100644
--- a/src/devices/bus/sms_ctrl/sports.cpp
+++ b/src/devices/bus/sms_ctrl/sports.cpp
@@ -103,17 +103,17 @@ CUSTOM_INPUT_MEMBER( sms_sports_pad_device::dir_pins_r )
static INPUT_PORTS_START( sms_sports_pad )
PORT_START("SPORTS_IN")
- PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, sms_sports_pad_device, dir_pins_r, NULL) // Directional pins
+ PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, sms_sports_pad_device, dir_pins_r, nullptr) // Directional pins
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED ) // Vcc
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) // TL (Button 1)
- PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, sms_sports_pad_device, th_pin_r, NULL)
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, sms_sports_pad_device, th_pin_r, nullptr)
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON2 ) // TR (Button 2)
PORT_START("SPORTS_OUT")
PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) // Directional pins
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED ) // Vcc
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED ) // TL (Button 1)
- PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_OUTPUT ) PORT_CHANGED_MEMBER(DEVICE_SELF, sms_sports_pad_device, th_pin_w, NULL)
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_OUTPUT ) PORT_CHANGED_MEMBER(DEVICE_SELF, sms_sports_pad_device, th_pin_w, nullptr)
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) // TR (Button 2)
PORT_START("SPORTS_X") /* Sports Pad X axis */
diff --git a/src/devices/bus/sms_ctrl/sportsjp.cpp b/src/devices/bus/sms_ctrl/sportsjp.cpp
index d431f0a6816..260654c7dac 100644
--- a/src/devices/bus/sms_ctrl/sportsjp.cpp
+++ b/src/devices/bus/sms_ctrl/sportsjp.cpp
@@ -52,7 +52,7 @@ DECLARE_CUSTOM_INPUT_MEMBER( sms_sports_pad_jp_device::dir_pins_r )
static INPUT_PORTS_START( sms_sports_pad_jp )
PORT_START("SPORTS_JP_IN")
- PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, sms_sports_pad_jp_device, dir_pins_r, NULL) // Directional pins
+ PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, sms_sports_pad_jp_device, dir_pins_r, nullptr) // Directional pins
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED ) // Vcc
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) // TL (Button 1)
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) // TH
diff --git a/src/devices/bus/snes/bsx.cpp b/src/devices/bus/snes/bsx.cpp
index 450bcadcbce..a534018f78d 100644
--- a/src/devices/bus/snes/bsx.cpp
+++ b/src/devices/bus/snes/bsx.cpp
@@ -70,7 +70,7 @@ sns_rom_bsmempak_device::sns_rom_bsmempak_device(const machine_config &mconfig,
void sns_rom_bsx_device::device_start()
{
- m_base_unit = auto_alloc(machine(), BSX_base(machine()));
+ m_base_unit = std::make_unique<BSX_base>(machine());
m_base_unit->init();
memset(m_cart_regs, 0x00, sizeof(m_cart_regs));
diff --git a/src/devices/bus/snes/bsx.h b/src/devices/bus/snes/bsx.h
index d4df9529326..43ee42f7b4a 100644
--- a/src/devices/bus/snes/bsx.h
+++ b/src/devices/bus/snes/bsx.h
@@ -51,7 +51,7 @@ public:
virtual DECLARE_WRITE8_MEMBER(chip_write) override;
// base regs
- BSX_base *m_base_unit;
+ std::unique_ptr<BSX_base> m_base_unit;
// cart regs
UINT8 m_cart_regs[16];
diff --git a/src/devices/bus/snes/rom.cpp b/src/devices/bus/snes/rom.cpp
index daac69bbc72..3763f11ed91 100644
--- a/src/devices/bus/snes/rom.cpp
+++ b/src/devices/bus/snes/rom.cpp
@@ -377,7 +377,7 @@ WRITE8_MEMBER( sns_rom_tekken2_device::chip_write )
// Banks $c0-$ff return open bus.
READ8_MEMBER( sns_rom_soulblad_device::chip_read )
{
- UINT8 value = 0;
+ UINT8 value;
offset &= 3;
switch (offset)
{
diff --git a/src/devices/bus/snes/sa1.cpp b/src/devices/bus/snes/sa1.cpp
index be4f4c039fe..b22af792a97 100644
--- a/src/devices/bus/snes/sa1.cpp
+++ b/src/devices/bus/snes/sa1.cpp
@@ -819,8 +819,8 @@ void sns_sa1_device::write_iram(UINT32 offset, UINT8 data)
UINT8 sns_sa1_device::read_bwram(UINT32 offset)
{
- int shift = 0;
- UINT8 mask = 0xff;
+ int shift;
+ UINT8 mask;
if (m_nvram.empty())
return 0xff; // this should probably never happen, or are there SA-1 games with no BWRAM?
@@ -852,7 +852,7 @@ UINT8 sns_sa1_device::read_bwram(UINT32 offset)
void sns_sa1_device::write_bwram(UINT32 offset, UINT8 data)
{
- UINT8 mask = 0xff;
+ UINT8 mask;
if (m_nvram.empty())
return; // this should probably never happen, or are there SA-1 games with no BWRAM?
@@ -894,7 +894,7 @@ void sns_sa1_device::write_bwram(UINT32 offset, UINT8 data)
READ8_MEMBER(sns_sa1_device::read_l)
{
- int bank = 0;
+ int bank;
if (offset == 0xffea && BIT(m_scpu_ctrl, 4)) return (m_nmi_vector >> 0) & 0xff;
if (offset == 0xffeb && BIT(m_scpu_ctrl, 4)) return (m_nmi_vector >> 8) & 0xff;
@@ -929,7 +929,7 @@ READ8_MEMBER(sns_sa1_device::read_l)
READ8_MEMBER(sns_sa1_device::read_h)
{
- int bank = 0;
+ int bank;
// ROM is mapped to [80-bf][8000-ffff] & [c0-ff][0000-ffff]
if (offset < 0x200000)
diff --git a/src/devices/bus/snes/sdd1.cpp b/src/devices/bus/snes/sdd1.cpp
index 56376641705..9570b5110ad 100644
--- a/src/devices/bus/snes/sdd1.cpp
+++ b/src/devices/bus/snes/sdd1.cpp
@@ -256,7 +256,7 @@ UINT8 SDD1_CM::CM_getBit(UINT8 *ROM, UINT32 *mmc)
{
UINT8 currContext;
UINT16 *context_bits;
- UINT8 bit = 0;
+ UINT8 bit;
switch (m_bitplanesInfo)
{
@@ -319,7 +319,7 @@ void SDD1_OL::OL_prepareDecomp(UINT8 *ROM, UINT32 *mmc, UINT32 first_byte, UINT1
void SDD1_OL::OL_launch(UINT8 *ROM, UINT32 *mmc)
{
UINT8 i;
- UINT8 register1 = 0, register2 = 0;
+ UINT8 register1, register2 = 0;
switch (m_bitplanesInfo)
{
@@ -369,20 +369,20 @@ void SDD1_OL::OL_launch(UINT8 *ROM, UINT32 *mmc)
SDD1_emu::SDD1_emu(running_machine &machine)
: m_machine(machine)
{
- m_IM = auto_alloc(machine, SDD1_IM());
- m_GCD = auto_alloc(machine, SDD1_GCD(m_IM));
- m_BG0 = auto_alloc(machine, SDD1_BG(m_GCD, 0));
- m_BG1 = auto_alloc(machine, SDD1_BG(m_GCD, 1));
- m_BG2 = auto_alloc(machine, SDD1_BG(m_GCD, 2));
- m_BG3 = auto_alloc(machine, SDD1_BG(m_GCD, 3));
- m_BG4 = auto_alloc(machine, SDD1_BG(m_GCD, 4));
- m_BG5 = auto_alloc(machine, SDD1_BG(m_GCD, 5));
- m_BG6 = auto_alloc(machine, SDD1_BG(m_GCD, 6));
- m_BG7 = auto_alloc(machine, SDD1_BG(m_GCD, 7));
- m_PEM = auto_alloc(machine, SDD1_PEM(m_BG0, m_BG1, m_BG2, m_BG3,
- m_BG4, m_BG5, m_BG6, m_BG7));
- m_CM = auto_alloc(machine, SDD1_CM(m_PEM));
- m_OL = auto_alloc(machine, SDD1_OL(m_CM));
+ m_IM = std::make_unique<SDD1_IM>();
+ m_GCD = std::make_unique<SDD1_GCD>(m_IM.get());
+ m_BG0 = std::make_unique<SDD1_BG>(m_GCD.get(), 0);
+ m_BG1 = std::make_unique<SDD1_BG>(m_GCD.get(), 1);
+ m_BG2 = std::make_unique<SDD1_BG>(m_GCD.get(), 2);
+ m_BG3 = std::make_unique<SDD1_BG>(m_GCD.get(), 3);
+ m_BG4 = std::make_unique<SDD1_BG>(m_GCD.get(), 4);
+ m_BG5 = std::make_unique<SDD1_BG>(m_GCD.get(), 5);
+ m_BG6 = std::make_unique<SDD1_BG>(m_GCD.get(), 6);
+ m_BG7 = std::make_unique<SDD1_BG>(m_GCD.get(), 7);
+ m_PEM = std::make_unique<SDD1_PEM>(m_BG0.get(), m_BG1.get(), m_BG2.get(), m_BG3.get(),
+ m_BG4.get(), m_BG5.get(), m_BG6.get(), m_BG7.get());
+ m_CM = std::make_unique<SDD1_CM>(m_PEM.get());
+ m_OL = std::make_unique<SDD1_OL>(m_CM.get());
}
void SDD1_emu::SDD1emu_decompress(UINT8 *ROM, UINT32 *mmc, UINT32 in_buf, UINT16 out_len, UINT8 *out_buf)
@@ -426,9 +426,9 @@ sns_rom_sdd1_device::sns_rom_sdd1_device(const machine_config &mconfig, const ch
void sns_rom_sdd1_device::device_start()
{
- m_sdd1emu = auto_alloc(machine(), SDD1_emu(machine()));
+ m_sdd1emu = std::make_unique<SDD1_emu>(machine());
- m_buffer.data = (UINT8*)auto_alloc_array(machine(), UINT8, 0x10000);
+ m_buffer.data = std::make_unique<UINT8[]>(0x10000);
m_buffer.ready = 0;
save_item(NAME(m_sdd1_enable));
@@ -441,7 +441,7 @@ void sns_rom_sdd1_device::device_start()
save_item(NAME(m_dma[i].size), i);
}
- save_pointer(NAME(m_buffer.data), 0x10000);
+ save_pointer(NAME(m_buffer.data.get()), 0x10000);
save_item(NAME(m_buffer.offset));
save_item(NAME(m_buffer.size));
save_item(NAME(m_buffer.ready));
@@ -567,7 +567,7 @@ UINT8 sns_rom_sdd1_device::read_helper(UINT32 addr)
// SDD1_emu calls this function; it needs to access uncompressed data;
// so temporarily disable decompression mode for decompress() call.
- m_sdd1emu->SDD1emu_decompress(m_rom, m_mmc, addr, m_buffer.size, m_buffer.data);
+ m_sdd1emu->SDD1emu_decompress(m_rom, m_mmc, addr, m_buffer.size, m_buffer.data.get());
m_buffer.ready = 1;
}
diff --git a/src/devices/bus/snes/sdd1.h b/src/devices/bus/snes/sdd1.h
index 24e8ecaf47a..e9dcc9e71e1 100644
--- a/src/devices/bus/snes/sdd1.h
+++ b/src/devices/bus/snes/sdd1.h
@@ -126,13 +126,19 @@ public:
running_machine &machine() const { return m_machine; }
- SDD1_IM* m_IM;
- SDD1_GCD* m_GCD;
- SDD1_BG* m_BG0; SDD1_BG* m_BG1; SDD1_BG* m_BG2; SDD1_BG* m_BG3;
- SDD1_BG* m_BG4; SDD1_BG* m_BG5; SDD1_BG* m_BG6; SDD1_BG* m_BG7;
- SDD1_PEM* m_PEM;
- SDD1_CM* m_CM;
- SDD1_OL* m_OL;
+ std::unique_ptr<SDD1_IM> m_IM;
+ std::unique_ptr<SDD1_GCD> m_GCD;
+ std::unique_ptr<SDD1_BG> m_BG0;
+ std::unique_ptr<SDD1_BG> m_BG1;
+ std::unique_ptr<SDD1_BG> m_BG2;
+ std::unique_ptr<SDD1_BG> m_BG3;
+ std::unique_ptr<SDD1_BG> m_BG4;
+ std::unique_ptr<SDD1_BG> m_BG5;
+ std::unique_ptr<SDD1_BG> m_BG6;
+ std::unique_ptr<SDD1_BG> m_BG7;
+ std::unique_ptr<SDD1_PEM> m_PEM;
+ std::unique_ptr<SDD1_CM> m_CM;
+ std::unique_ptr<SDD1_OL> m_OL;
void SDD1emu_decompress(UINT8 *ROM, UINT32 *mmc, UINT32 in_buf, UINT16 out_len, UINT8 *out_buf);
@@ -176,11 +182,11 @@ public:
UINT16 size; // $43x5-$43x6 -- DMA transfer size
} m_dma[8];
- SDD1_emu* m_sdd1emu;
+ std::unique_ptr<SDD1_emu> m_sdd1emu;
struct
{
- UINT8 *data; // pointer to decompressed S-DD1 data (65536 bytes)
+ std::unique_ptr<UINT8[]> data; // pointer to decompressed S-DD1 data (65536 bytes)
UINT16 offset; // read index into S-DD1 decompression buffer
UINT32 size; // length of data buffer; reads decrement counter, set ready to false at 0
UINT8 ready; // 1 when data[] is valid; 0 to invoke sdd1emu.decompress()
diff --git a/src/devices/bus/snes/snes_slot.cpp b/src/devices/bus/snes/snes_slot.cpp
index 10add2da1cc..65c2fffdb4d 100644
--- a/src/devices/bus/snes/snes_slot.cpp
+++ b/src/devices/bus/snes/snes_slot.cpp
@@ -797,7 +797,7 @@ void base_sns_cart_slot_device::setup_addon_from_fullpath()
if (!m_cart->get_addon_bios_size())
{
std::string region = std::string(m_cart->device().tag()).append(":addon");
- UINT8 *ROM = nullptr;
+ UINT8 *ROM;
switch (m_addon)
{
@@ -886,7 +886,7 @@ void base_sns_cart_slot_device::setup_nvram()
bool base_sns_cart_slot_device::call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry)
{
- load_software_part_region(*this, swlist, swname, start_entry );
+ machine().rom_load().load_software_part_region(*this, swlist, swname, start_entry );
return TRUE;
}
@@ -999,14 +999,14 @@ void base_sns_cart_slot_device::get_cart_type_addon(UINT8 *ROM, UINT32 len, int
get default card software
-------------------------------------------------*/
-void base_sns_cart_slot_device::get_default_card_software(std::string &result)
+std::string base_sns_cart_slot_device::get_default_card_software()
{
bool fullpath = open_image_file(mconfig().options());
if (fullpath)
{
- const char *slot_string = "lorom";
- UINT32 offset = 0;
+ const char *slot_string;
+ UINT32 offset;
UINT32 len = core_fsize(m_file);
dynamic_buffer rom(len);
int type = 0, addon = 0;
@@ -1058,11 +1058,10 @@ void base_sns_cart_slot_device::get_default_card_software(std::string &result)
clear();
- result.assign(slot_string);
- return;
+ return std::string(slot_string);
}
- software_get_default_slot(result, "lorom");
+ return software_get_default_slot("lorom");
}
diff --git a/src/devices/bus/snes/snes_slot.h b/src/devices/bus/snes/snes_slot.h
index 8b433d1128a..02b00a1cb87 100644
--- a/src/devices/bus/snes/snes_slot.h
+++ b/src/devices/bus/snes/snes_slot.h
@@ -180,7 +180,7 @@ public:
virtual const option_guide *create_option_guide() const override { return nullptr; }
// slot interface overrides
- virtual void get_default_card_software(std::string &result) override;
+ virtual std::string get_default_card_software() override;
// reading and writing
virtual DECLARE_READ8_MEMBER(read_l);
diff --git a/src/devices/bus/snes/spc7110.cpp b/src/devices/bus/snes/spc7110.cpp
index a6ebbdab2df..b9b0ee77cd3 100644
--- a/src/devices/bus/snes/spc7110.cpp
+++ b/src/devices/bus/snes/spc7110.cpp
@@ -50,7 +50,7 @@ sns_rom_spc7110rtc_device::sns_rom_spc7110rtc_device(const machine_config &mconf
void sns_rom_spc7110_device::spc7110_start()
{
- m_decomp = auto_alloc(machine(), SPC7110_Decomp(machine()));
+ m_decomp = std::make_unique<SPC7110_Decomp>(machine());
// The SPC7110 works in conjunction with 0x2000 of RAM, which is battery backed up (and hence emulated by our m_nvram)
@@ -300,7 +300,7 @@ static const UINT8 spc7110_mode2_context_table[32][2] =
SPC7110_Decomp::SPC7110_Decomp(running_machine &machine)
: m_machine(machine)
{
- m_decomp_buffer = (UINT8*)auto_alloc_array(machine, UINT8, SPC7110_DECOMP_BUFFER_SIZE);
+ m_decomp_buffer = std::make_unique<UINT8[]>(SPC7110_DECOMP_BUFFER_SIZE);
reset();
for (int i = 0; i < 256; i++)
@@ -325,7 +325,7 @@ SPC7110_Decomp::SPC7110_Decomp(running_machine &machine)
m_machine.save().save_item(m_decomp_mode, "SNES_SPC7110/m_decomp_mode");
m_machine.save().save_item(m_decomp_offset, "SNES_SPC7110/m_decomp_offset");
- m_machine.save().save_pointer(m_decomp_buffer, "SNES_SPC7110/m_decomp_buffer", SPC7110_DECOMP_BUFFER_SIZE);
+ m_machine.save().save_pointer(m_decomp_buffer.get(), "SNES_SPC7110/m_decomp_buffer", SPC7110_DECOMP_BUFFER_SIZE);
m_machine.save().save_item(m_decomp_buffer_rdoffset, "SNES_SPC7110/m_decomp_buffer_rdoffset");
m_machine.save().save_item(m_decomp_buffer_wroffset, "SNES_SPC7110/m_decomp_buffer_wroffset");
m_machine.save().save_item(m_decomp_buffer_length, "SNES_SPC7110/m_decomp_buffer_length");
@@ -1233,7 +1233,7 @@ READ8_MEMBER(sns_rom_spc7110_device::chip_read)
case 0x4840: return m_r4840;
case 0x4841:
{
- UINT8 data = 0;
+ UINT8 data;
if (m_rtc_state == RTCS_Inactive || m_rtc_state == RTCS_ModeSelect)
return 0x00;
diff --git a/src/devices/bus/snes/spc7110.h b/src/devices/bus/snes/spc7110.h
index ba356790d2f..33d7170d02c 100644
--- a/src/devices/bus/snes/spc7110.h
+++ b/src/devices/bus/snes/spc7110.h
@@ -50,7 +50,7 @@ private:
UINT32 m_decomp_mode;
UINT32 m_decomp_offset;
- UINT8 *m_decomp_buffer;
+ std::unique_ptr<UINT8[]> m_decomp_buffer;
UINT32 m_decomp_buffer_rdoffset;
UINT32 m_decomp_buffer_wroffset;
UINT32 m_decomp_buffer_length;
@@ -130,7 +130,7 @@ public:
UINT8 m_r480b; // decompression control register
UINT8 m_r480c; // decompression status
- SPC7110_Decomp* m_decomp;
+ std::unique_ptr<SPC7110_Decomp> m_decomp;
UINT8 m_r4811; // data pointer low
UINT8 m_r4812; // data pointer high
diff --git a/src/devices/bus/ti99_peb/bwg.cpp b/src/devices/bus/ti99_peb/bwg.cpp
index 89c0b5d69ea..4085dcfe230 100644
--- a/src/devices/bus/ti99_peb/bwg.cpp
+++ b/src/devices/bus/ti99_peb/bwg.cpp
@@ -338,7 +338,7 @@ WRITE8_MEMBER(snug_bwg_device::write)
*/
READ8Z_MEMBER(snug_bwg_device::crureadz)
{
- UINT8 reply = 0;
+ UINT8 reply;
if ((offset & 0xff00)==m_cru_base)
{
diff --git a/src/devices/bus/ti99_peb/bwg.h b/src/devices/bus/ti99_peb/bwg.h
index db0ba735792..6a301b5cb59 100644
--- a/src/devices/bus/ti99_peb/bwg.h
+++ b/src/devices/bus/ti99_peb/bwg.h
@@ -28,9 +28,6 @@ public:
DECLARE_WRITE8_MEMBER(write) override;
DECLARE_SETADDRESS_DBIN_MEMBER(setaddress_dbin) override;
- DECLARE_WRITE_LINE_MEMBER( intrq_w );
- DECLARE_WRITE_LINE_MEMBER( drq_w );
-
DECLARE_READ8Z_MEMBER(crureadz) override;
DECLARE_WRITE8_MEMBER(cruwrite) override;
diff --git a/src/devices/bus/ti99_peb/evpc.cpp b/src/devices/bus/ti99_peb/evpc.cpp
index ee7b4cd77a2..6945df0dcc6 100644
--- a/src/devices/bus/ti99_peb/evpc.cpp
+++ b/src/devices/bus/ti99_peb/evpc.cpp
@@ -41,7 +41,7 @@ snug_enhanced_video_device::snug_enhanced_video_device(const machine_config &mco
void snug_enhanced_video_device::nvram_default()
{
- memset(m_novram, 0, NOVRAM_SIZE);
+ memset(m_novram.get(), 0, NOVRAM_SIZE);
}
//-------------------------------------------------
@@ -51,7 +51,7 @@ void snug_enhanced_video_device::nvram_default()
void snug_enhanced_video_device::nvram_read(emu_file &file)
{
- file.read(m_novram, NOVRAM_SIZE);
+ file.read(m_novram.get(), NOVRAM_SIZE);
}
//-------------------------------------------------
@@ -61,7 +61,7 @@ void snug_enhanced_video_device::nvram_read(emu_file &file)
void snug_enhanced_video_device::nvram_write(emu_file &file)
{
- file.write(m_novram, NOVRAM_SIZE);
+ file.write(m_novram.get(), NOVRAM_SIZE);
}
@@ -312,7 +312,7 @@ WRITE8_MEMBER(snug_enhanced_video_device::cruwrite)
void snug_enhanced_video_device::device_start()
{
m_dsrrom = memregion(DSRROM)->base();
- m_novram = global_alloc_array(UINT8, NOVRAM_SIZE);
+ m_novram = std::make_unique<UINT8[]>(NOVRAM_SIZE);
}
void snug_enhanced_video_device::device_reset()
@@ -327,7 +327,7 @@ void snug_enhanced_video_device::device_reset()
void snug_enhanced_video_device::device_stop()
{
- global_free_array(m_novram);
+ m_novram = nullptr;
}
ROM_START( ti99_evpc )
diff --git a/src/devices/bus/ti99_peb/evpc.h b/src/devices/bus/ti99_peb/evpc.h
index 5fbc9a73e38..2b67fd272fc 100644
--- a/src/devices/bus/ti99_peb/evpc.h
+++ b/src/devices/bus/ti99_peb/evpc.h
@@ -55,7 +55,7 @@ private:
UINT8* m_dsrrom;
bool m_RAMEN;
int m_dsr_page;
- UINT8* m_novram; /* NOVRAM area */
+ std::unique_ptr<UINT8[]> m_novram; /* NOVRAM area */
evpc_palette m_palette;
};
diff --git a/src/devices/bus/ti99_peb/hfdc.cpp b/src/devices/bus/ti99_peb/hfdc.cpp
index 6e2e11fe628..c3e4779c1ef 100644
--- a/src/devices/bus/ti99_peb/hfdc.cpp
+++ b/src/devices/bus/ti99_peb/hfdc.cpp
@@ -91,7 +91,7 @@ myarc_hfdc_device::myarc_hfdc_device(const machine_config &mconfig, const char *
: ti_expansion_card_device(mconfig, TI99_HFDC, "Myarc Hard and Floppy Disk Controller", tag, owner, clock, "ti99_hfdc", __FILE__), m_motor_on_timer(nullptr),
m_hdc9234(*this, FDC_TAG),
m_clock(*this, CLOCK_TAG), m_current_floppy(nullptr), m_current_harddisk(nullptr), m_see_switches(false), m_irq(), m_dip(), m_motor_running(false),
- m_inDsrArea(false), m_HDCsel(false), m_RTCsel(false), m_tapesel(false), m_RAMsel(false), m_ROMsel(false), m_address(0), m_dma_in_progress(false),
+ m_inDsrArea(false), m_HDCsel(false), m_RTCsel(false), m_tapesel(false), m_RAMsel(false), m_ROMsel(false), m_address(0),
m_wait_for_hd1(false), m_dsrrom(nullptr), m_rom_page(0), m_buffer_ram(nullptr), m_status_latch(0), m_dma_address(0), m_output1_latch(0), m_output2_latch(0), m_lastval(0), m_MOTOR_ON(), m_readyflags(0)
{
}
diff --git a/src/devices/bus/ti99_peb/hfdc.h b/src/devices/bus/ti99_peb/hfdc.h
index 7e62a22f253..ec51e3122d6 100644
--- a/src/devices/bus/ti99_peb/hfdc.h
+++ b/src/devices/bus/ti99_peb/hfdc.h
@@ -139,9 +139,6 @@ private:
// Recent address
int m_address;
- // DMA in progress
- bool m_dma_in_progress;
-
// Wait for HD. This was an addition in later cards.
bool m_wait_for_hd1;
@@ -182,7 +179,6 @@ private:
void set_bits(UINT8& byte, int mask, bool set);
// Joined ready line towards the controller
- void set_ready(int dev, bool ready);
int m_readyflags;
};
#endif
diff --git a/src/devices/bus/ti99_peb/horizon.cpp b/src/devices/bus/ti99_peb/horizon.cpp
index cdae19a2bbb..babfcb9e7fd 100644
--- a/src/devices/bus/ti99_peb/horizon.cpp
+++ b/src/devices/bus/ti99_peb/horizon.cpp
@@ -408,7 +408,7 @@ INPUT_PORTS_START( horizon )
PORT_DIPSETTING( 0x02, "Geneve mode" )
PORT_START( "HORIZONACT" )
- PORT_DIPNAME( 0x01, 0x00, "Horizon killswitch" ) PORT_CHANGED_MEMBER(DEVICE_SELF, horizon_ramdisk_device, ks_changed, 1)
+ PORT_DIPNAME( 0x01, 0x00, "Horizon killswitch" ) PORT_CHANGED_MEMBER(DEVICE_SELF, horizon_ramdisk_device, ks_changed, nullptr)
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x01, DEF_STR( On ) )
@@ -432,7 +432,7 @@ INPUT_PORTS_END
ROM_START( horizon )
ROM_REGION(MAXRAM_SIZE, NVRAMREGION, 0)
- ROM_FILL(0x0000, MAXRAM_SIZE, nullptr)
+ ROM_FILL(0x0000, MAXRAM_SIZE, 0x00)
ROM_REGION(0x8000, RAMREGION, 0)
ROM_FILL(0x0000, 0x8000, 0x00)
ROM_END
diff --git a/src/devices/bus/ti99_peb/hsgpl.cpp b/src/devices/bus/ti99_peb/hsgpl.cpp
index 7f75f23ca25..42ec9360ad3 100644
--- a/src/devices/bus/ti99_peb/hsgpl.cpp
+++ b/src/devices/bus/ti99_peb/hsgpl.cpp
@@ -613,8 +613,8 @@ void snug_high_speed_gpl_device::grom_write(address_space& space, offs_t offset,
void snug_high_speed_gpl_device::device_start()
{
- m_ram6_memory = global_alloc_array(UINT8, RAMSIZE);
- m_gram_memory = global_alloc_array(UINT8, GRAMSIZE);
+ m_ram6_memory = std::make_unique<UINT8[]>(RAMSIZE);
+ m_gram_memory = std::make_unique<UINT8[]>(GRAMSIZE);
}
void snug_high_speed_gpl_device::device_reset()
@@ -651,8 +651,8 @@ void snug_high_speed_gpl_device::device_config_complete(void)
void snug_high_speed_gpl_device::device_stop()
{
- global_free_array(m_ram6_memory);
- global_free_array(m_gram_memory);
+ m_ram6_memory = nullptr;
+ m_gram_memory = nullptr;
}
// Flash setting is used to flash an empty HSGPL DSR ROM
diff --git a/src/devices/bus/ti99_peb/hsgpl.h b/src/devices/bus/ti99_peb/hsgpl.h
index 9cebf4bdb13..dfb755c67b4 100644
--- a/src/devices/bus/ti99_peb/hsgpl.h
+++ b/src/devices/bus/ti99_peb/hsgpl.h
@@ -47,8 +47,8 @@ private:
at29c040a_device* m_grom_a_eeprom;
at29c040a_device* m_grom_b_eeprom;
- UINT8* m_ram6_memory;
- UINT8* m_gram_memory;
+ std::unique_ptr<UINT8[]> m_ram6_memory;
+ std::unique_ptr<UINT8[]> m_gram_memory;
void dsrspace_readz(address_space& space, offs_t offset, UINT8* value, UINT8 mem_mask);
void cartspace_readz(address_space& space, offs_t offset, UINT8* value, UINT8 mem_mask);
diff --git a/src/devices/bus/ti99_peb/memex.cpp b/src/devices/bus/ti99_peb/memex.cpp
index 17cc6fe4283..66dd2f7b291 100644
--- a/src/devices/bus/ti99_peb/memex.cpp
+++ b/src/devices/bus/ti99_peb/memex.cpp
@@ -48,7 +48,7 @@ bool geneve_memex_device::access_enabled(offs_t offset)
// Some traditional cards will not decode the AMx lines, so
// we may have to lock out those areas
int page = (offset >> 13)&0xff;
- int index = 0;
+ int index;
// SW2: "off" locks
// 10xxx010
diff --git a/src/devices/bus/ti99_peb/myarcmem.cpp b/src/devices/bus/ti99_peb/myarcmem.cpp
index 159152ddef5..08e8f893a95 100644
--- a/src/devices/bus/ti99_peb/myarcmem.cpp
+++ b/src/devices/bus/ti99_peb/myarcmem.cpp
@@ -52,7 +52,7 @@ m_ram(nullptr), m_dsrrom(nullptr), m_bank(0), m_size(0)
int myarc_memory_expansion_device::get_base(int offset)
{
- int base = 0;
+ int base;
if (m_size == SIZE_128)
{
base = ((m_bank & 0x03) << 15);
diff --git a/src/devices/bus/ti99_peb/samsmem.cpp b/src/devices/bus/ti99_peb/samsmem.cpp
index 3951294f3c7..0ff3e27d928 100644
--- a/src/devices/bus/ti99_peb/samsmem.cpp
+++ b/src/devices/bus/ti99_peb/samsmem.cpp
@@ -37,7 +37,7 @@ sams_memory_expansion_device::sams_memory_expansion_device(const machine_config
*/
READ8Z_MEMBER(sams_memory_expansion_device::readz)
{
- int base = 0;
+ int base;
if (m_access_mapper && ((offset & 0xe000)==0x4000))
{
@@ -61,7 +61,7 @@ READ8Z_MEMBER(sams_memory_expansion_device::readz)
WRITE8_MEMBER(sams_memory_expansion_device::write)
{
- int base = 0;
+ int base;
if (m_access_mapper && ((offset & 0xe000)==0x4000))
{
diff --git a/src/devices/bus/ti99_peb/spchsyn.h b/src/devices/bus/ti99_peb/spchsyn.h
index 38af09dd6d7..44e7aca54c4 100644
--- a/src/devices/bus/ti99_peb/spchsyn.h
+++ b/src/devices/bus/ti99_peb/spchsyn.h
@@ -32,10 +32,6 @@ public:
DECLARE_WRITE_LINE_MEMBER( speech_ready );
- DECLARE_READ8_MEMBER( spchrom_read );
- DECLARE_WRITE8_MEMBER( spchrom_load_address );
- DECLARE_WRITE8_MEMBER( spchrom_read_and_branch );
-
protected:
virtual void device_start() override;
virtual void device_reset(void) override;
diff --git a/src/devices/bus/ti99_peb/ti_fdc.h b/src/devices/bus/ti99_peb/ti_fdc.h
index ababee22aae..ed1082d3b0a 100644
--- a/src/devices/bus/ti99_peb/ti_fdc.h
+++ b/src/devices/bus/ti99_peb/ti_fdc.h
@@ -27,9 +27,6 @@ public:
DECLARE_WRITE8_MEMBER(write) override;
DECLARE_SETADDRESS_DBIN_MEMBER(setaddress_dbin) override;
- DECLARE_WRITE_LINE_MEMBER( intrq_w );
- DECLARE_WRITE_LINE_MEMBER( drq_w );
-
DECLARE_READ8Z_MEMBER(crureadz) override;
DECLARE_WRITE8_MEMBER(cruwrite) override;
diff --git a/src/devices/bus/ti99_peb/ti_rs232.cpp b/src/devices/bus/ti99_peb/ti_rs232.cpp
index af23d59a445..e93bb86d015 100644
--- a/src/devices/bus/ti99_peb/ti_rs232.cpp
+++ b/src/devices/bus/ti99_peb/ti_rs232.cpp
@@ -176,7 +176,7 @@ int ti_rs232_attached_device::get_index_from_tagname()
*/
bool ti_rs232_attached_device::call_load()
{
- tms9902_device* tms9902 = nullptr;
+ tms9902_device* tms9902;
// ti_rs232_pio_device* card = static_cast<ti_rs232_pio_device*>(owner());
int devnumber = get_index_from_tagname();
@@ -206,7 +206,7 @@ bool ti_rs232_attached_device::call_load()
void ti_rs232_attached_device::call_unload()
{
- tms9902_device* tms9902 = nullptr;
+ tms9902_device* tms9902;
int devnumber = get_index_from_tagname();
if (devnumber==0)
@@ -705,7 +705,7 @@ void ti_rs232_pio_device::receive_data_or_line_state(int uartind)
if (m_bufpos[uartind] == m_buflen[uartind])
{
// Get all out of sdlsocket
- m_buflen[uartind] = serial->fread(m_recvbuf[uartind], 512);
+ m_buflen[uartind] = serial->fread(m_recvbuf[uartind].get(), 512);
m_bufpos[uartind] = 0;
if (m_buflen[uartind]==0) return;
}
@@ -1023,8 +1023,8 @@ void ti_rs232_pio_device::device_start()
m_serdev[1] = subdevice<ti_rs232_attached_device>("serdev1");
m_piodev = subdevice<ti_pio_attached_device>("piodev");
// Prepare the receive buffers
- m_recvbuf[0] = global_alloc_array(UINT8, 512);
- m_recvbuf[1] = global_alloc_array(UINT8, 512);
+ m_recvbuf[0] = std::make_unique<UINT8[]>(512);
+ m_recvbuf[1] = std::make_unique<UINT8[]>(512);
m_pio_write = true; // required for call_load of pio_attached_device
m_pio_writable = false;
m_pio_handshakein = false;
@@ -1032,8 +1032,8 @@ void ti_rs232_pio_device::device_start()
void ti_rs232_pio_device::device_stop()
{
- if (m_recvbuf[0] != nullptr) global_free_array(m_recvbuf[0]);
- if (m_recvbuf[1] != nullptr) global_free_array(m_recvbuf[1]);
+ m_recvbuf[0] = nullptr;
+ m_recvbuf[1] = nullptr;
}
void ti_rs232_pio_device::device_reset()
diff --git a/src/devices/bus/ti99_peb/ti_rs232.h b/src/devices/bus/ti99_peb/ti_rs232.h
index df1a7bb3a69..24c190aac2d 100644
--- a/src/devices/bus/ti99_peb/ti_rs232.h
+++ b/src/devices/bus/ti99_peb/ti_rs232.h
@@ -45,7 +45,6 @@ public:
DECLARE_WRITE8_MEMBER( xmit1_callback );
DECLARE_WRITE8_MEMBER( ctrl0_callback );
DECLARE_WRITE8_MEMBER( ctrl1_callback );
- DECLARE_WRITE_LINE_MEMBER( senila );
protected:
virtual void device_start(void) override;
@@ -80,7 +79,7 @@ private:
// Input buffer for each UART. We have to copy the contents of sdlsocket here
// because the buffer in corefile will be lost on the next write operation
- UINT8* m_recvbuf[2];
+ std::unique_ptr<UINT8[]> m_recvbuf[2];
int m_bufpos[2], m_buflen[2];
// Latches the state of the output lines for UART0/UART1
diff --git a/src/devices/bus/ti99x/998board.cpp b/src/devices/bus/ti99x/998board.cpp
index d59313bc57c..6df84271cc4 100644
--- a/src/devices/bus/ti99x/998board.cpp
+++ b/src/devices/bus/ti99x/998board.cpp
@@ -295,7 +295,7 @@ void mainboard8_device::PTGE_set(bool state)
READ8_MEMBER( mainboard8_device::readm )
{
UINT8 value = 0;
- bool found = false;
+ bool found;
if (TRACE_MEM) logerror("%s: read from %04x\n", tag(), offset);
found = access_logical_r(space, offset, &value, mem_mask);
m_waitcount = 2;
@@ -323,7 +323,7 @@ READ8_MEMBER( mainboard8_device::readm )
WRITE8_MEMBER( mainboard8_device::writem )
{
- bool found = false;
+ bool found;
// Look for components responding to the logical address
found = access_logical_w(space, offset, data, mem_mask);
@@ -485,7 +485,7 @@ bool mainboard8_device::access_logical_r(address_space& space, offs_t offset, UI
{
bool found = false;
logically_addressed_device *ldev = m_logcomp.first();
- bus8z_device *bdev = nullptr;
+ bus8z_device *bdev;
if (TRACE_MEM) logerror("%s: offset=%04x; CRUS=%d, PTGEN=%d\n", tag(), offset, m_CRUS? 1:0, m_PTGE? 0:1);
while (ldev != nullptr)
@@ -531,7 +531,7 @@ bool mainboard8_device::access_logical_w(address_space& space, offs_t offset, UI
{
bool found = false;
logically_addressed_device *ldev = m_logcomp.first();
- bus8z_device *bdev = nullptr;
+ bus8z_device *bdev;
while (ldev != nullptr)
{
@@ -573,7 +573,7 @@ bool mainboard8_device::access_logical_w(address_space& space, offs_t offset, UI
void mainboard8_device::access_physical_r( address_space& space, offs_t pas_address, UINT8 *value, UINT8 mem_mask )
{
physically_addressed_device *pdev = m_physcomp.first();
- bus8z_device *bdev = nullptr;
+ bus8z_device *bdev;
while (pdev != nullptr)
{
@@ -621,7 +621,7 @@ void mainboard8_device::access_physical_r( address_space& space, offs_t pas_addr
void mainboard8_device::access_physical_w( address_space& space, offs_t pas_address, UINT8 data, UINT8 mem_mask )
{
physically_addressed_device *pdev = m_physcomp.first();
- bus8z_device *bdev = nullptr;
+ bus8z_device *bdev;
while (pdev != nullptr)
{
diff --git a/src/devices/bus/ti99x/998board.h b/src/devices/bus/ti99x/998board.h
index d7f8e5f7fc7..9231d9be647 100644
--- a/src/devices/bus/ti99x/998board.h
+++ b/src/devices/bus/ti99x/998board.h
@@ -157,10 +157,6 @@ public:
DECLARE_WRITE_LINE_MEMBER( speech8_ready );
- DECLARE_READ8_MEMBER( spchrom_read );
- DECLARE_WRITE8_MEMBER( spchrom_load_address );
- DECLARE_WRITE8_MEMBER( spchrom_read_and_branch );
-
protected:
virtual void device_start() override;
virtual void device_reset(void) override;
diff --git a/src/devices/bus/ti99x/datamux.cpp b/src/devices/bus/ti99x/datamux.cpp
index a9b60f30c47..1b8ec8de02f 100644
--- a/src/devices/bus/ti99x/datamux.cpp
+++ b/src/devices/bus/ti99x/datamux.cpp
@@ -393,7 +393,7 @@ void ti99_datamux_device::device_start(void)
void ti99_datamux_device::device_stop(void)
{
- if (m_ram16b) global_free_array(m_ram16b);
+ m_ram16b = nullptr;
}
void ti99_datamux_device::device_reset(void)
@@ -411,7 +411,7 @@ void ti99_datamux_device::device_reset(void)
// better use a region?
if (m_ram16b==nullptr)
{
- m_ram16b = global_alloc_array_clear(UINT16, 32768/2);
+ m_ram16b = make_unique_clear<UINT16[]>(32768/2);
}
// Now building the list of active devices at this databus multiplex.
@@ -429,7 +429,7 @@ void ti99_datamux_device::device_reset(void)
}
else
{
- UINT32 set = 0;
+ UINT32 set;
bool active_device = true;
if (list[i].setting!=nullptr)
{
diff --git a/src/devices/bus/ti99x/datamux.h b/src/devices/bus/ti99x/datamux.h
index a93fd6b4740..604dfb2e62f 100644
--- a/src/devices/bus/ti99x/datamux.h
+++ b/src/devices/bus/ti99x/datamux.h
@@ -134,7 +134,7 @@ private:
int m_waitcount;
/* Memory expansion (internal, 16 bit). */
- UINT16 *m_ram16b;
+ std::unique_ptr<UINT16[]> m_ram16b;
/* Use the memory expansion? */
bool m_use32k;
diff --git a/src/devices/bus/ti99x/genboard.cpp b/src/devices/bus/ti99x/genboard.cpp
index 1817aad95a2..9d6aeef7e76 100644
--- a/src/devices/bus/ti99x/genboard.cpp
+++ b/src/devices/bus/ti99x/genboard.cpp
@@ -1186,7 +1186,7 @@ void geneve_mapper_device::decode(address_space& space, offs_t offset, bool read
*/
READ8_MEMBER( geneve_mapper_device::read_from_pfm )
{
- UINT8 value = 0;
+ UINT8 value;
if (!m_pfm_output_enable) return 0;
int address = (offset & 0x01ffff) | (m_pfm_bank<<17);
diff --git a/src/devices/bus/ti99x/gromport.cpp b/src/devices/bus/ti99x/gromport.cpp
index d75ca72d469..9e1533cb9a8 100644
--- a/src/devices/bus/ti99x/gromport.cpp
+++ b/src/devices/bus/ti99x/gromport.cpp
@@ -134,6 +134,52 @@
#define GKRACKER_ROM_TAG "gkracker_rom"
#define GKRACKER_NVRAM_TAG "gkracker_nvram"
+/*-------------------------------------------------
+ image_battery_load_by_name - retrieves the battery
+ backed RAM for an image. A filename may be supplied
+ to the function.
+
+ The function comes in two flavors, depending on
+ what should happen when no battery is available:
+ we could fill the memory with a given value, or
+ pass a default battery (for a pre-initialized
+ battery from factory)
+-------------------------------------------------*/
+
+static void image_battery_load_by_name(emu_options &options, const char *filename, void *buffer, int length, int fill)
+{
+ file_error filerr;
+ int bytes_read = 0;
+
+ assert_always(buffer && (length > 0), "Must specify sensical buffer/length");
+
+ /* try to open the battery file and read it in, if possible */
+ emu_file file(options.nvram_directory(), OPEN_FLAG_READ);
+ filerr = file.open(filename);
+ if (filerr == FILERR_NONE)
+ bytes_read = file.read(buffer, length);
+
+ /* fill remaining bytes (if necessary) */
+ memset(((char *) buffer) + bytes_read, fill, length - bytes_read);
+}
+
+/*-------------------------------------------------
+ image_battery_save_by_name - stores the battery
+ backed RAM for an image. A filename may be supplied
+ to the function.
+-------------------------------------------------*/
+static void image_battery_save_by_name(emu_options &options, const char *filename, const void *buffer, int length)
+{
+ assert_always(buffer && (length > 0), "Must specify sensical buffer/length");
+
+ /* try to open the battery file and write it out, if possible */
+ emu_file file(options.nvram_directory(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
+ file_error filerr = file.open(filename);
+ if (filerr == FILERR_NONE)
+ file.write(buffer, length);
+}
+
+
gromport_device::gromport_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: bus8z_device(mconfig, GROMPORT, "Cartridge port", tag, owner, clock, "gromport", __FILE__),
device_slot_interface(mconfig, *this),
@@ -1347,7 +1393,7 @@ void ti99_cartridge_device::set_slot(int i)
bool ti99_cartridge_device::call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry)
{
if (TRACE_CONFIG) logerror("%s: swlist = %s, swname = %s\n", tag(), swlist.list_name(), swname);
- load_software_part_region(*this, swlist, swname, start_entry);
+ machine().rom_load().load_software_part_region(*this, swlist, swname, start_entry);
m_softlist = true;
m_rpk = nullptr;
return true;
@@ -1796,7 +1842,7 @@ WRITE8_MEMBER(ti99_mbx_cartridge::write)
*/
int ti99_paged379i_cartridge::get_paged379i_bank(int rompage)
{
- int mask = 0;
+ int mask;
if (m_rom_size > 16384)
{
if (m_rom_size > 32768)
@@ -2260,7 +2306,7 @@ rpk_socket* rpk_reader::load_rom_resource(zip_file* zip, xml_data_node* rom_reso
length = header->uncompressed_length;
// Allocate storage
- contents = global_alloc_array_clear(UINT8, length);
+ contents = global_alloc_array_clear<UINT8>(length);
if (contents==nullptr) throw rpk_exception(RPK_OUT_OF_MEMORY);
// and unzip file from the zip file
@@ -2326,7 +2372,7 @@ rpk_socket* rpk_reader::load_ram_resource(emu_options &options, xml_data_node* r
}
// Allocate memory for this resource
- contents = global_alloc_array_clear(UINT8, length);
+ contents = global_alloc_array_clear<UINT8>(length);
if (contents==nullptr) throw rpk_exception(RPK_OUT_OF_MEMORY);
//if (TRACE_RPK) logerror("gromport/RPK: Allocating RAM buffer (%d bytes) for socket '%s'\n", length, socketname);
diff --git a/src/devices/bus/ti99x/gromport.h b/src/devices/bus/ti99x/gromport.h
index 768bf7d51e8..7655173b10d 100644
--- a/src/devices/bus/ti99x/gromport.h
+++ b/src/devices/bus/ti99x/gromport.h
@@ -208,7 +208,6 @@ private:
void set_slot(int slotnumber);
int get_active_slot(bool changebase, offs_t offset);
- void change_slot(bool inserted, int index);
};
/*
@@ -370,8 +369,6 @@ public:
~ti99_paged378_cartridge() { };
DECLARE_READ8Z_MEMBER(readz) override;
DECLARE_WRITE8_MEMBER(write) override;
-private:
- int get_paged378_bank(int rompage);
};
/********************** Paged 377 ************************************/
@@ -382,8 +379,6 @@ public:
~ti99_paged377_cartridge() { };
DECLARE_READ8Z_MEMBER(readz) override;
DECLARE_WRITE8_MEMBER(write) override;
-private:
- int get_paged377_bank(int rompage);
};
/********************** Paged CRU ************************************/
diff --git a/src/devices/bus/ti99x/handset.h b/src/devices/bus/ti99x/handset.h
index 17b2eac8190..3f9de1b6221 100644
--- a/src/devices/bus/ti99x/handset.h
+++ b/src/devices/bus/ti99x/handset.h
@@ -73,7 +73,6 @@ class ti99_twin_joystick : public joyport_attached_device
{
public:
ti99_twin_joystick(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
- DECLARE_READ8_MEMBER( read );
virtual void device_start(void) override;
UINT8 read_dev() override;
diff --git a/src/devices/bus/ti99x/videowrp.h b/src/devices/bus/ti99x/videowrp.h
index de08dfb3dce..cb339e9dd60 100644
--- a/src/devices/bus/ti99x/videowrp.h
+++ b/src/devices/bus/ti99x/videowrp.h
@@ -163,18 +163,6 @@ protected:
MCFG_TMS9928A_SCREEN_ADD_PAL( SCREEN_TAG ) \
MCFG_SCREEN_UPDATE_DEVICE( VDP_TAG, tms9928a_device, screen_update )
-#define MCFG_TI_V9938_ADD(_tag, _rate, _screen, _blank, _x, _y, _class, _int) \
- MCFG_DEVICE_ADD(_tag, V9938VIDEO, 0) \
- MCFG_V9938_ADD(VDP_TAG, _screen, 0x20000, XTAL_21_4772MHz) /* typical 9938 clock, not verified */ \
- MCFG_V99X8_INTERRUPT_CALLBACK(WRITELINE(_class, _int)) \
- MCFG_SCREEN_ADD(_screen, RASTER) \
- MCFG_SCREEN_REFRESH_RATE(_rate) \
- MCFG_SCREEN_UPDATE_DEVICE(VDP_TAG, v9938_device, screen_update) \
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(_blank)) \
- MCFG_SCREEN_SIZE(_x, _y) \
- MCFG_SCREEN_VISIBLE_AREA(0, _x - 1, 0, _y - 1) \
- MCFG_SCREEN_PALETTE(VDP_TAG ":palette")
-
#define MCFG_TI_SOUND_94624_ADD(_tag) \
MCFG_DEVICE_ADD(_tag, TISOUND_94624, 0)
diff --git a/src/devices/bus/vboy/slot.cpp b/src/devices/bus/vboy/slot.cpp
index 88ef2ce7a2f..4b8fc1bf4d2 100644
--- a/src/devices/bus/vboy/slot.cpp
+++ b/src/devices/bus/vboy/slot.cpp
@@ -223,7 +223,7 @@ void vboy_cart_slot_device::call_unload()
bool vboy_cart_slot_device::call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry)
{
- load_software_part_region(*this, swlist, swname, start_entry);
+ machine().rom_load().load_software_part_region(*this, swlist, swname, start_entry);
return TRUE;
}
@@ -233,9 +233,9 @@ bool vboy_cart_slot_device::call_softlist_load(software_list_device &swlist, con
get default card software
-------------------------------------------------*/
-void vboy_cart_slot_device::get_default_card_software(std::string &result)
+std::string vboy_cart_slot_device::get_default_card_software()
{
- software_get_default_slot(result, "vb_rom");
+ return software_get_default_slot("vb_rom");
}
/*-------------------------------------------------
diff --git a/src/devices/bus/vboy/slot.h b/src/devices/bus/vboy/slot.h
index 3f2b15698ce..ca9e784ad8c 100644
--- a/src/devices/bus/vboy/slot.h
+++ b/src/devices/bus/vboy/slot.h
@@ -69,7 +69,6 @@ public:
virtual bool call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry) override;
int get_type() { return m_type; }
- int get_cart_type(UINT8 *ROM, UINT32 len);
void save_eeprom() { if (m_cart && m_cart->get_eeprom_size()) m_cart->save_eeprom(); }
@@ -84,7 +83,7 @@ public:
virtual const char *file_extensions() const override { return "vb,bin"; }
// slot interface overrides
- virtual void get_default_card_software(std::string &result) override;
+ virtual std::string get_default_card_software() override;
// reading and writing
virtual DECLARE_READ32_MEMBER(read_cart);
diff --git a/src/devices/bus/vc4000/slot.cpp b/src/devices/bus/vc4000/slot.cpp
index ecfc63b42dd..0b67a264c34 100644
--- a/src/devices/bus/vc4000/slot.cpp
+++ b/src/devices/bus/vc4000/slot.cpp
@@ -226,7 +226,7 @@ bool vc4000_cart_slot_device::call_load()
bool vc4000_cart_slot_device::call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry)
{
- load_software_part_region(*this, swlist, swname, start_entry);
+ machine().rom_load().load_software_part_region(*this, swlist, swname, start_entry);
return TRUE;
}
@@ -235,11 +235,11 @@ bool vc4000_cart_slot_device::call_softlist_load(software_list_device &swlist, c
get default card software
-------------------------------------------------*/
-void vc4000_cart_slot_device::get_default_card_software(std::string &result)
+std::string vc4000_cart_slot_device::get_default_card_software()
{
if (open_image_file(mconfig().options()))
{
- const char *slot_string = "std";
+ const char *slot_string;
UINT32 size = core_fsize(m_file);
int type = VC4000_STD;
@@ -254,11 +254,10 @@ void vc4000_cart_slot_device::get_default_card_software(std::string &result)
//printf("type: %s\n", slot_string);
clear();
- result.assign(slot_string);
- return;
+ return std::string(slot_string);
}
- software_get_default_slot(result, "std");
+ return software_get_default_slot("std");
}
/*-------------------------------------------------
diff --git a/src/devices/bus/vc4000/slot.h b/src/devices/bus/vc4000/slot.h
index 089bdf5fc3a..6b40c6cbcbe 100644
--- a/src/devices/bus/vc4000/slot.h
+++ b/src/devices/bus/vc4000/slot.h
@@ -85,7 +85,7 @@ public:
virtual const char *file_extensions() const override { return "bin,rom"; }
// slot interface overrides
- virtual void get_default_card_software(std::string &result) override;
+ virtual std::string get_default_card_software() override;
// reading and writing
virtual DECLARE_READ8_MEMBER(read_rom);
diff --git a/src/devices/bus/vcs/vcs_slot.cpp b/src/devices/bus/vcs/vcs_slot.cpp
index caa46ef358b..b946c8051e7 100755
--- a/src/devices/bus/vcs/vcs_slot.cpp
+++ b/src/devices/bus/vcs/vcs_slot.cpp
@@ -333,7 +333,7 @@ void vcs_cart_slot_device::call_unload()
bool vcs_cart_slot_device::call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry)
{
- load_software_part_region(*this, swlist, swname, start_entry );
+ machine().rom_load().load_software_part_region(*this, swlist, swname, start_entry );
return TRUE;
}
@@ -781,11 +781,11 @@ int vcs_cart_slot_device::identify_cart_type(UINT8 *ROM, UINT32 len)
get default card software
-------------------------------------------------*/
-void vcs_cart_slot_device::get_default_card_software(std::string &result)
+std::string vcs_cart_slot_device::get_default_card_software()
{
if (open_image_file(mconfig().options()))
{
- const char *slot_string = "a26_4k";
+ const char *slot_string;
UINT32 len = core_fsize(m_file);
dynamic_buffer rom(len);
int type;
@@ -797,10 +797,10 @@ void vcs_cart_slot_device::get_default_card_software(std::string &result)
clear();
- result.assign(slot_string);
+ return std::string(slot_string);
}
else
- software_get_default_slot(result, "a26_4k");
+ return software_get_default_slot("a26_4k");
}
diff --git a/src/devices/bus/vcs/vcs_slot.h b/src/devices/bus/vcs/vcs_slot.h
index f77eda9056c..984cf5c9d12 100755
--- a/src/devices/bus/vcs/vcs_slot.h
+++ b/src/devices/bus/vcs/vcs_slot.h
@@ -112,7 +112,7 @@ public:
virtual const char *file_extensions() const override { return "bin,a26"; }
// slot interface overrides
- virtual void get_default_card_software(std::string &result) override;
+ virtual std::string get_default_card_software() override;
// reading and writing
virtual DECLARE_READ8_MEMBER(read_rom);
diff --git a/src/devices/bus/vcs_ctrl/ctrl.h b/src/devices/bus/vcs_ctrl/ctrl.h
index bdcc9f5abe0..41f7c12e75a 100644
--- a/src/devices/bus/vcs_ctrl/ctrl.h
+++ b/src/devices/bus/vcs_ctrl/ctrl.h
@@ -95,7 +95,6 @@ public:
DECLARE_READ8_MEMBER( pot_y_r ) { return pot_y_r(); }
void joy_w( UINT8 data ) { if ( exists() ) m_device->vcs_joy_w( data ); }
- DECLARE_WRITE8_MEMBER( joy_w );
bool exists() { return m_device != nullptr; }
bool has_pot_x() { return exists() && m_device->has_pot_x(); }
diff --git a/src/devices/bus/vectrex/slot.cpp b/src/devices/bus/vectrex/slot.cpp
index a7322b0b994..1a9bbed7d29 100644
--- a/src/devices/bus/vectrex/slot.cpp
+++ b/src/devices/bus/vectrex/slot.cpp
@@ -208,7 +208,7 @@ bool vectrex_cart_slot_device::call_load()
bool vectrex_cart_slot_device::call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry)
{
- load_software_part_region(*this, swlist, swname, start_entry);
+ machine().rom_load().load_software_part_region(*this, swlist, swname, start_entry);
return TRUE;
}
@@ -217,11 +217,11 @@ bool vectrex_cart_slot_device::call_softlist_load(software_list_device &swlist,
get default card software
-------------------------------------------------*/
-void vectrex_cart_slot_device::get_default_card_software(std::string &result)
+std::string vectrex_cart_slot_device::get_default_card_software()
{
if (open_image_file(mconfig().options()))
{
- const char *slot_string = "vec_rom";
+ const char *slot_string;
UINT32 size = core_fsize(m_file);
dynamic_buffer rom(size);
int type = VECTREX_STD;
@@ -238,11 +238,10 @@ void vectrex_cart_slot_device::get_default_card_software(std::string &result)
//printf("type: %s\n", slot_string);
clear();
- result.assign(slot_string);
- return;
+ return std::string(slot_string);
}
- software_get_default_slot(result, "vec_rom");
+ return software_get_default_slot("vec_rom");
}
/*-------------------------------------------------
diff --git a/src/devices/bus/vectrex/slot.h b/src/devices/bus/vectrex/slot.h
index f9007ca01a6..5a1bf306213 100644
--- a/src/devices/bus/vectrex/slot.h
+++ b/src/devices/bus/vectrex/slot.h
@@ -84,7 +84,7 @@ public:
virtual const char *file_extensions() const override { return "bin,gam,vec"; }
// slot interface overrides
- virtual void get_default_card_software(std::string &result) override;
+ virtual std::string get_default_card_software() override;
// reading and writing
virtual DECLARE_READ8_MEMBER(read_rom);
diff --git a/src/devices/bus/vic10/exp.cpp b/src/devices/bus/vic10/exp.cpp
index 23c20e6b93f..1aa6f2e6363 100644
--- a/src/devices/bus/vic10/exp.cpp
+++ b/src/devices/bus/vic10/exp.cpp
@@ -113,7 +113,7 @@ bool vic10_expansion_slot_device::call_load()
{
if (m_card)
{
- size_t size = 0;
+ size_t size;
if (software_entry() == nullptr)
{
@@ -172,7 +172,7 @@ bool vic10_expansion_slot_device::call_load()
bool vic10_expansion_slot_device::call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry)
{
- load_software_part_region(*this, swlist, swname, start_entry);
+ machine().rom_load().load_software_part_region(*this, swlist, swname, start_entry);
return true;
}
@@ -182,20 +182,17 @@ bool vic10_expansion_slot_device::call_softlist_load(software_list_device &swlis
// get_default_card_software -
//-------------------------------------------------
-void vic10_expansion_slot_device::get_default_card_software(std::string &result)
+std::string vic10_expansion_slot_device::get_default_card_software()
{
if (open_image_file(mconfig().options()))
{
if (!core_stricmp(filetype(), "crt"))
- {
- cbm_crt_get_card(result, m_file);
- return;
- }
+ return cbm_crt_get_card(m_file);
clear();
}
- software_get_default_slot(result, "standard");
+ return software_get_default_slot("standard");
}
diff --git a/src/devices/bus/vic10/exp.h b/src/devices/bus/vic10/exp.h
index f334668ada8..9ca71e33653 100644
--- a/src/devices/bus/vic10/exp.h
+++ b/src/devices/bus/vic10/exp.h
@@ -134,7 +134,7 @@ protected:
virtual const option_guide *create_option_guide() const override { return nullptr; }
// slot interface overrides
- virtual void get_default_card_software(std::string &result) override;
+ virtual std::string get_default_card_software() override;
devcb_write_line m_write_irq;
devcb_write_line m_write_res;
diff --git a/src/devices/bus/vic20/exp.cpp b/src/devices/bus/vic20/exp.cpp
index 42907bbb0d9..37761ab7d14 100644
--- a/src/devices/bus/vic20/exp.cpp
+++ b/src/devices/bus/vic20/exp.cpp
@@ -157,7 +157,7 @@ bool vic20_expansion_slot_device::call_load()
bool vic20_expansion_slot_device::call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry)
{
- load_software_part_region(*this, swlist, swname, start_entry);
+ machine().rom_load().load_software_part_region(*this, swlist, swname, start_entry);
return true;
}
@@ -167,9 +167,9 @@ bool vic20_expansion_slot_device::call_softlist_load(software_list_device &swlis
// get_default_card_software -
//-------------------------------------------------
-void vic20_expansion_slot_device::get_default_card_software(std::string &result)
+std::string vic20_expansion_slot_device::get_default_card_software()
{
- software_get_default_slot(result, "standard");
+ return software_get_default_slot("standard");
}
diff --git a/src/devices/bus/vic20/exp.h b/src/devices/bus/vic20/exp.h
index ddcffa82569..15d67b00e53 100644
--- a/src/devices/bus/vic20/exp.h
+++ b/src/devices/bus/vic20/exp.h
@@ -125,7 +125,7 @@ protected:
virtual const option_guide *create_option_guide() const override { return nullptr; }
// slot interface overrides
- virtual void get_default_card_software(std::string &result) override;
+ virtual std::string get_default_card_software() override;
devcb_write_line m_write_irq;
devcb_write_line m_write_nmi;
diff --git a/src/devices/bus/vidbrain/exp.cpp b/src/devices/bus/vidbrain/exp.cpp
index a100e4eeebe..2b4ac800ff3 100644
--- a/src/devices/bus/vidbrain/exp.cpp
+++ b/src/devices/bus/vidbrain/exp.cpp
@@ -116,7 +116,7 @@ bool videobrain_expansion_slot_device::call_load()
{
if (m_cart)
{
- size_t size = 0;
+ size_t size;
if (software_entry() == nullptr)
{
@@ -144,7 +144,7 @@ bool videobrain_expansion_slot_device::call_load()
bool videobrain_expansion_slot_device::call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry)
{
- load_software_part_region(*this, swlist, swname, start_entry);
+ machine().rom_load().load_software_part_region(*this, swlist, swname, start_entry);
return true;
}
@@ -154,9 +154,9 @@ bool videobrain_expansion_slot_device::call_softlist_load(software_list_device &
// get_default_card_software -
//-------------------------------------------------
-void videobrain_expansion_slot_device::get_default_card_software(std::string &result)
+std::string videobrain_expansion_slot_device::get_default_card_software()
{
- software_get_default_slot(result, "standard");
+ return software_get_default_slot("standard");
}
diff --git a/src/devices/bus/vidbrain/exp.h b/src/devices/bus/vidbrain/exp.h
index 2579d92a08d..e431ff3f1a6 100644
--- a/src/devices/bus/vidbrain/exp.h
+++ b/src/devices/bus/vidbrain/exp.h
@@ -150,7 +150,7 @@ protected:
virtual const option_guide *create_option_guide() const override { return nullptr; }
// slot interface overrides
- virtual void get_default_card_software(std::string &result) override;
+ virtual std::string get_default_card_software() override;
devcb_write_line m_write_extres;
diff --git a/src/devices/bus/wangpc/tig.cpp b/src/devices/bus/wangpc/tig.cpp
index 47bda2c6747..efadfc332dc 100644
--- a/src/devices/bus/wangpc/tig.cpp
+++ b/src/devices/bus/wangpc/tig.cpp
@@ -282,7 +282,7 @@ void wangpc_tig_device::wangpcbus_aiowc_w(address_space &space, offs_t offset, U
UINT8 wangpc_tig_device::wangpcbus_dack_r(address_space &space, int line)
{
- UINT8 data = 0;
+ UINT8 data;
if (DMA_GRAPHICS)
{
diff --git a/src/devices/bus/wswan/slot.cpp b/src/devices/bus/wswan/slot.cpp
index 749f82596e1..b5b95851f00 100644
--- a/src/devices/bus/wswan/slot.cpp
+++ b/src/devices/bus/wswan/slot.cpp
@@ -243,7 +243,7 @@ void ws_cart_slot_device::call_unload()
bool ws_cart_slot_device::call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry)
{
- load_software_part_region(*this, swlist, swname, start_entry);
+ machine().rom_load().load_software_part_region(*this, swlist, swname, start_entry);
return TRUE;
}
@@ -306,11 +306,11 @@ int ws_cart_slot_device::get_cart_type(UINT8 *ROM, UINT32 len, UINT32 &nvram_len
get default card software
-------------------------------------------------*/
-void ws_cart_slot_device::get_default_card_software(std::string &result)
+std::string ws_cart_slot_device::get_default_card_software()
{
if (open_image_file(mconfig().options()))
{
- const char *slot_string = "ws_rom";
+ const char *slot_string;
UINT32 size = core_fsize(m_file);
dynamic_buffer rom(size);
int type;
@@ -325,11 +325,10 @@ void ws_cart_slot_device::get_default_card_software(std::string &result)
//printf("type: %s\n", slot_string);
clear();
- result.assign(slot_string);
- return;
+ return std::string(slot_string);
}
- software_get_default_slot(result, "ws_rom");
+ return software_get_default_slot("ws_rom");
}
/*-------------------------------------------------
diff --git a/src/devices/bus/wswan/slot.h b/src/devices/bus/wswan/slot.h
index 59dd49550ca..ae5ab7d81d6 100644
--- a/src/devices/bus/wswan/slot.h
+++ b/src/devices/bus/wswan/slot.h
@@ -96,7 +96,7 @@ public:
virtual const char *file_extensions() const override { return "ws,wsc,bin"; }
// slot interface overrides
- virtual void get_default_card_software(std::string &result) override;
+ virtual std::string get_default_card_software() override;
// reading and writing
virtual DECLARE_READ8_MEMBER(read_rom20);
diff --git a/src/devices/bus/z88/z88.cpp b/src/devices/bus/z88/z88.cpp
index 2cbc97c53dd..62313b76dd3 100644
--- a/src/devices/bus/z88/z88.cpp
+++ b/src/devices/bus/z88/z88.cpp
@@ -121,7 +121,7 @@ bool z88cart_slot_device::call_load()
{
if (m_cart)
{
- offs_t read_length = 0;
+ offs_t read_length;
UINT8 *cart_base = m_cart->get_cart_base();
if (cart_base != nullptr)
@@ -158,7 +158,11 @@ bool z88cart_slot_device::call_load()
void z88cart_slot_device::call_unload()
{
if (m_cart)
- memset(m_cart->get_cart_base(), 0xff, m_cart->get_cart_size());
+ {
+ auto cart_size = m_cart->get_cart_size();
+ if (cart_size>0)
+ memset(m_cart->get_cart_base(), 0xff, cart_size);
+ }
// open the flap
m_out_flp_cb(ASSERT_LINE);
@@ -174,7 +178,7 @@ void z88cart_slot_device::call_unload()
bool z88cart_slot_device::call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry)
{
- load_software_part_region(*this, swlist, swname, start_entry );
+ machine().rom_load().load_software_part_region(*this, swlist, swname, start_entry );
return TRUE;
}
@@ -182,9 +186,9 @@ bool z88cart_slot_device::call_softlist_load(software_list_device &swlist, const
get default card software
-------------------------------------------------*/
-void z88cart_slot_device::get_default_card_software(std::string &result)
+std::string z88cart_slot_device::get_default_card_software()
{
- software_get_default_slot(result, "128krom");
+ return software_get_default_slot("128krom");
}
diff --git a/src/devices/bus/z88/z88.h b/src/devices/bus/z88/z88.h
index 19785d4a7b1..0c39edd5e24 100644
--- a/src/devices/bus/z88/z88.h
+++ b/src/devices/bus/z88/z88.h
@@ -109,7 +109,7 @@ public:
virtual const option_guide *create_option_guide() const override { return nullptr; }
// slot interface overrides
- virtual void get_default_card_software(std::string &result) override;
+ virtual std::string get_default_card_software() override;
// reading and writing
virtual DECLARE_READ8_MEMBER(read);
diff --git a/src/devices/cpu/8x300/8x300.cpp b/src/devices/cpu/8x300/8x300.cpp
index bf6a5148ca5..a18f4d50c73 100644
--- a/src/devices/cpu/8x300/8x300.cpp
+++ b/src/devices/cpu/8x300/8x300.cpp
@@ -145,7 +145,7 @@ void n8x300_cpu_device::device_start()
m_icountptr = &m_icount;
}
-void n8x300_cpu_device::state_string_export(const device_state_entry &entry, std::string &str)
+void n8x300_cpu_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
@@ -168,7 +168,7 @@ void n8x300_cpu_device::execute_run()
do
{
UINT16 opcode;
- UINT8 src = 0;
+ UINT8 src;
UINT8 dst;
UINT8 rotlen; // rotate amount or I/O field length
UINT8 mask;
diff --git a/src/devices/cpu/8x300/8x300.h b/src/devices/cpu/8x300/8x300.h
index fe6b95259b0..dd236372e5d 100644
--- a/src/devices/cpu/8x300/8x300.h
+++ b/src/devices/cpu/8x300/8x300.h
@@ -66,7 +66,7 @@ protected:
}
// device_state_interface overrides
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 2; }
diff --git a/src/devices/cpu/adsp2100/adsp2100.cpp b/src/devices/cpu/adsp2100/adsp2100.cpp
index e0e38ef3264..63788892288 100644
--- a/src/devices/cpu/adsp2100/adsp2100.cpp
+++ b/src/devices/cpu/adsp2100/adsp2100.cpp
@@ -368,7 +368,7 @@ void adsp2181_device::idma_data_w(UINT16 data)
UINT16 adsp2181_device::idma_data_r()
{
- UINT16 result = 0xffff;
+ UINT16 result;
// program memory?
if (!(m_idma_addr & 0x4000))
@@ -544,15 +544,14 @@ void adsp21xx_device::device_start()
state_add(ADSP2100_SR0_SEC, "SR0_SEC", m_alt.sr.srx.sr0.u);
state_add(ADSP2100_SR1_SEC, "SR1_SEC", m_alt.sr.srx.sr1.u);
- std::string tempstring;
for (int ireg = 0; ireg < 8; ireg++)
- state_add(ADSP2100_I0 + ireg, strformat(tempstring, "I%d", ireg).c_str(), m_i[ireg]).mask(0x3fff).callimport();
+ state_add(ADSP2100_I0 + ireg, strformat("I%d", ireg).c_str(), m_i[ireg]).mask(0x3fff).callimport();
for (int lreg = 0; lreg < 8; lreg++)
- state_add(ADSP2100_L0 + lreg, strformat(tempstring, "L%d", lreg).c_str(), m_l[lreg]).mask(0x3fff).callimport();
+ state_add(ADSP2100_L0 + lreg, strformat("L%d", lreg).c_str(), m_l[lreg]).mask(0x3fff).callimport();
for (int mreg = 0; mreg < 8; mreg++)
- state_add(ADSP2100_M0 + mreg, strformat(tempstring, "M%d", mreg).c_str(), m_m[mreg]).signed_mask(0x3fff);
+ state_add(ADSP2100_M0 + mreg, strformat("M%d", mreg).c_str(), m_m[mreg]).signed_mask(0x3fff);
state_add(ADSP2100_PX, "PX", m_px);
state_add(ADSP2100_CNTR, "CNTR", m_cntr).mask(0x3fff);
@@ -571,7 +570,7 @@ void adsp21xx_device::device_start()
for (int irqnum = 0; irqnum < 4; irqnum++)
if (irqnum < 4 || m_chip_type == CHIP_TYPE_ADSP2100)
- state_add(ADSP2100_IRQSTATE0 + irqnum, strformat(tempstring, "IRQ%d", irqnum).c_str(), m_irq_state[irqnum]).mask(1).callimport();
+ state_add(ADSP2100_IRQSTATE0 + irqnum, strformat("IRQ%d", irqnum).c_str(), m_irq_state[irqnum]).mask(1).callimport();
state_add(ADSP2100_FLAGIN, "FLAGIN", m_flagin).mask(1);
state_add(ADSP2100_FLAGOUT, "FLAGOUT", m_flagout).mask(1);
@@ -720,7 +719,7 @@ void adsp21xx_device::state_import(const device_state_entry &entry)
// for the debugger
//-------------------------------------------------
-void adsp21xx_device::state_string_export(const device_state_entry &entry, std::string &str)
+void adsp21xx_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/adsp2100/adsp2100.h b/src/devices/cpu/adsp2100/adsp2100.h
index 816255eea4a..f2393f986d2 100644
--- a/src/devices/cpu/adsp2100/adsp2100.h
+++ b/src/devices/cpu/adsp2100/adsp2100.h
@@ -237,7 +237,7 @@ protected:
// device_state_interface overrides
virtual void state_import(const device_state_entry &entry) override;
- virtual void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override;
diff --git a/src/devices/cpu/alph8201/alph8201.cpp b/src/devices/cpu/alph8201/alph8201.cpp
index 06c4deb020e..9c40d8d55ee 100644
--- a/src/devices/cpu/alph8201/alph8201.cpp
+++ b/src/devices/cpu/alph8201/alph8201.cpp
@@ -527,7 +527,7 @@ void alpha8201_cpu_device::state_export(const device_state_entry &entry)
}
-void alpha8201_cpu_device::state_string_export(const device_state_entry &entry, std::string &str)
+void alpha8201_cpu_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/alph8201/alph8201.h b/src/devices/cpu/alph8201/alph8201.h
index 740bd1b1042..22130bc5464 100644
--- a/src/devices/cpu/alph8201/alph8201.h
+++ b/src/devices/cpu/alph8201/alph8201.h
@@ -75,7 +75,7 @@ protected:
// device_state_interface overrides
virtual void state_import(const device_state_entry &entry) override;
virtual void state_export(const device_state_entry &entry) override;
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 1; }
diff --git a/src/devices/cpu/alto2/a2disk.cpp b/src/devices/cpu/alto2/a2disk.cpp
index 8075ae3ed39..f6de163d745 100644
--- a/src/devices/cpu/alto2/a2disk.cpp
+++ b/src/devices/cpu/alto2/a2disk.cpp
@@ -1600,7 +1600,7 @@ void alto2_cpu_device::disk_bitclk(void* ptr, INT32 arg)
(void)ptr;
diablo_hd_device* dhd = m_drive[m_dsk.drive];
int clk = arg & 1;
- int bit = 0;
+ int bit;
/**
* The source for BITCLK and DATAIN depends on disk controller part #65
diff --git a/src/devices/cpu/alto2/a2disp.cpp b/src/devices/cpu/alto2/a2disp.cpp
index 82b0e083cf8..30f38f94fa4 100644
--- a/src/devices/cpu/alto2/a2disp.cpp
+++ b/src/devices/cpu/alto2/a2disp.cpp
@@ -286,7 +286,7 @@ void alto2_cpu_device::unload_word()
m_unload_time = -1;
return;
}
- UINT16* bitmap = m_dsp.raw_bitmap + y * ALTO2_DISPLAY_SCANLINE_WORDS;
+ UINT16* bitmap = m_dsp.raw_bitmap.get() + y * ALTO2_DISPLAY_SCANLINE_WORDS;
UINT16 word = m_dsp.inverse;
UINT8 a38 = m_disp_a38[m_dsp.ra * 16 + m_dsp.wa];
if (FIFO_MBEMPTY(a38))
@@ -532,12 +532,12 @@ void alto2_cpu_device::init_disp()
m_dsp.hlc = ALTO2_DISPLAY_HLC_START;
- m_dsp.raw_bitmap = auto_alloc_array(machine(), UINT16, ALTO2_DISPLAY_HEIGHT * ALTO2_DISPLAY_SCANLINE_WORDS);
+ m_dsp.raw_bitmap = std::make_unique<UINT16[]>(ALTO2_DISPLAY_HEIGHT * ALTO2_DISPLAY_SCANLINE_WORDS);
m_dsp.scanline = auto_alloc_array(machine(), UINT8*, ALTO2_DISPLAY_HEIGHT + ALTO2_FAKE_STATUS_H);
for (int y = 0; y < ALTO2_DISPLAY_HEIGHT + ALTO2_FAKE_STATUS_H; y++)
m_dsp.scanline[y] = auto_alloc_array(machine(), UINT8, ALTO2_DISPLAY_TOTAL_WIDTH);
- m_dsp.bitmap = auto_bitmap_ind16_alloc(machine(), ALTO2_DISPLAY_WIDTH, ALTO2_DISPLAY_HEIGHT + ALTO2_FAKE_STATUS_H);
+ m_dsp.bitmap = std::make_unique<bitmap_ind16>(ALTO2_DISPLAY_WIDTH, ALTO2_DISPLAY_HEIGHT + ALTO2_FAKE_STATUS_H);
m_dsp.state = 0;
}
@@ -567,7 +567,7 @@ void alto2_cpu_device::reset_disp()
m_dsp.curxpos = 0;
m_dsp.cursor0 = 0;
m_dsp.cursor1 = 0;
- memset(m_dsp.raw_bitmap, 0, sizeof(UINT16) * ALTO2_DISPLAY_HEIGHT * ALTO2_DISPLAY_SCANLINE_WORDS);
+ memset(m_dsp.raw_bitmap.get(), 0, sizeof(UINT16) * ALTO2_DISPLAY_HEIGHT * ALTO2_DISPLAY_SCANLINE_WORDS);
for (int y = 0; y < ALTO2_DISPLAY_HEIGHT; y++)
memset(m_dsp.scanline[y], 0, sizeof(UINT8) * ALTO2_DISPLAY_TOTAL_WIDTH);
m_dsp.odd_frame = false;
@@ -581,8 +581,8 @@ void alto2_cpu_device::reset_disp()
UINT32 alto2_cpu_device::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
pen_t palette_bw[2];
- palette_bw[0] = screen.palette()->white_pen();
- palette_bw[1] = screen.palette()->black_pen();
+ palette_bw[0] = screen.palette().white_pen();
+ palette_bw[1] = screen.palette().black_pen();
// copy even or odd field
for (int y = m_dsp.odd_frame ? 0 : 1; y < ALTO2_DISPLAY_HEIGHT; y += 2)
draw_scanline8(*m_dsp.bitmap, 0, y, ALTO2_DISPLAY_WIDTH, m_dsp.scanline[y], palette_bw);
diff --git a/src/devices/cpu/alto2/a2disp.h b/src/devices/cpu/alto2/a2disp.h
index 80454eb4896..a8f4568f29d 100644
--- a/src/devices/cpu/alto2/a2disp.h
+++ b/src/devices/cpu/alto2/a2disp.h
@@ -192,9 +192,9 @@ struct {
UINT32 curxpos; //!< helper: first cursor word in scanline
UINT16 cursor0; //!< helper: shifted cursor data for left word
UINT16 cursor1; //!< helper: shifted cursor data for right word
- UINT16 *raw_bitmap; //!< array of words of the raw bitmap that is displayed
+ std::unique_ptr<UINT16[]> raw_bitmap; //!< array of words of the raw bitmap that is displayed
UINT8 **scanline; //!< array of scanlines with 1 byte per pixel
- bitmap_ind16 *bitmap; //!< MAME bitmap with 16 bit indices
+ std::unique_ptr<bitmap_ind16> bitmap; //!< MAME bitmap with 16 bit indices
bool odd_frame; //!< true, if odd frame is drawn
} m_dsp;
diff --git a/src/devices/cpu/alto2/a2ether.cpp b/src/devices/cpu/alto2/a2ether.cpp
index 2cd38bb48c6..c3fd5a5c87a 100644
--- a/src/devices/cpu/alto2/a2ether.cpp
+++ b/src/devices/cpu/alto2/a2ether.cpp
@@ -600,7 +600,7 @@ void alto2_cpu_device::bs_early_eidfct()
m_eth.rx_packet[m_eth.rx_count] = r;
m_eth.rx_count++;
if (ALTO2_ETHER_PACKET_SIZE == m_eth.rx_count) {
- dump_packet(this,"RX", m_eth.rx_packet, 0, m_eth.rx_count);
+ dump_packet(this,"RX", m_eth.rx_packet.get(), 0, m_eth.rx_count);
m_eth.rx_count = 0;
}
#endif
@@ -709,7 +709,7 @@ void alto2_cpu_device::f2_late_eodfct()
m_eth.tx_packet[m_eth.tx_count] = m_bus;
m_eth.tx_count++;
if (ALTO2_ETHER_PACKET_SIZE == m_eth.tx_count) {
- dump_packet(this,"TX", m_eth.tx_packet, 0, m_eth.tx_count);
+ dump_packet(this,"TX", m_eth.tx_packet.get(), 0, m_eth.tx_count);
m_eth.tx_count = 0;
}
#endif
@@ -1338,8 +1338,8 @@ void alto2_cpu_device::init_ether(int task)
m_active_callback[task] = &alto2_cpu_device::activate_eth;
- m_eth.rx_packet = auto_alloc_array(machine(), UINT16, sizeof(UINT16)*ALTO2_ETHER_PACKET_SIZE);
- m_eth.tx_packet = auto_alloc_array(machine(), UINT16, sizeof(UINT16)*ALTO2_ETHER_PACKET_SIZE);
+ m_eth.rx_packet = std::make_unique<UINT16[]>(sizeof(UINT16)*ALTO2_ETHER_PACKET_SIZE);
+ m_eth.tx_packet = std::make_unique<UINT16[]>(sizeof(UINT16)*ALTO2_ETHER_PACKET_SIZE);
m_eth.tx_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(alto2_cpu_device::tx_packet),this));
m_eth.tx_timer->reset();
diff --git a/src/devices/cpu/alto2/a2ether.h b/src/devices/cpu/alto2/a2ether.h
index 6bdbd24ce3e..484bd187f8c 100644
--- a/src/devices/cpu/alto2/a2ether.h
+++ b/src/devices/cpu/alto2/a2ether.h
@@ -57,8 +57,8 @@ struct {
UINT16 tx_crc; //!< transmitter CRC
UINT32 rx_count; //!< received words count
UINT32 tx_count; //!< transmitted words count
- UINT16* rx_packet; //!< buffer to collect received words
- UINT16* tx_packet; //!< buffer to collect transmitted words
+ std::unique_ptr<UINT16[]> rx_packet; //!< buffer to collect received words
+ std::unique_ptr<UINT16[]> tx_packet; //!< buffer to collect transmitted words
emu_timer* rx_timer; //!< receiver timer
emu_timer* tx_timer; //!< transmitter timer
jkff_t ff_10a; //!< JK flip-flop 10a IBUSY (Sheet 13)
diff --git a/src/devices/cpu/alto2/a2mem.cpp b/src/devices/cpu/alto2/a2mem.cpp
index d4118fa70b6..e4fa65184f1 100644
--- a/src/devices/cpu/alto2/a2mem.cpp
+++ b/src/devices/cpu/alto2/a2mem.cpp
@@ -770,7 +770,7 @@ UINT16 alto2_cpu_device::debug_read_mem(UINT32 addr)
{
space(AS_2).set_debugger_access(true);
int base_addr = addr & 0177777;
- int data = 0177777;
+ int data;
if (base_addr >= ALTO2_IO_PAGE_BASE && addr < ALTO2_RAM_SIZE) {
data = m_iomem->read_word(m_iomem->address_to_byte(base_addr));
} else {
@@ -838,11 +838,9 @@ void alto2_cpu_device::exit_memory()
void alto2_cpu_device::reset_memory()
{
if (m_mem.ram) {
- auto_free(machine(), m_mem.ram);
m_mem.ram = nullptr;
}
if (m_mem.hpb) {
- auto_free(machine(), m_mem.hpb);
m_mem.hpb = nullptr;
}
// allocate 64K or 128K words of main memory
@@ -854,8 +852,8 @@ void alto2_cpu_device::reset_memory()
m_mem.size = ALTO2_RAM_SIZE;
logerror("Main memory %u KiB\n", static_cast<UINT32>(sizeof(UINT16) * m_mem.size / 1024));
- m_mem.ram = auto_alloc_array_clear(machine(), UINT32, sizeof(UINT16) * m_mem.size);
- m_mem.hpb = auto_alloc_array_clear(machine(), UINT8, sizeof(UINT16) * m_mem.size);
+ m_mem.ram = make_unique_clear<UINT32[]>(sizeof(UINT16) * m_mem.size);
+ m_mem.hpb = make_unique_clear<UINT8[]>( sizeof(UINT16) * m_mem.size);
#if USE_HAMMING_CHECK
// Initialize the hamming codes and parity bit
diff --git a/src/devices/cpu/alto2/a2mem.h b/src/devices/cpu/alto2/a2mem.h
index c450693a22b..1f6b4ac0ef5 100644
--- a/src/devices/cpu/alto2/a2mem.h
+++ b/src/devices/cpu/alto2/a2mem.h
@@ -25,8 +25,8 @@ enum {
struct {
UINT32 size; //!< main memory size (64K or 128K)
- UINT32* ram; //!< main memory organized as double-words
- UINT8* hpb; //!< Hamming Code bits (6) and Parity bits (1) per double word
+ std::unique_ptr<UINT32[]> ram; //!< main memory organized as double-words
+ std::unique_ptr<UINT8[]> hpb; //!< Hamming Code bits (6) and Parity bits (1) per double word
UINT32 mar; //!< memory address register
UINT32 rmdd; //!< read memory data double-word
UINT32 wmdd; //!< write memory data double-word
diff --git a/src/devices/cpu/alto2/a2ram.cpp b/src/devices/cpu/alto2/a2ram.cpp
index 425f3f60634..159415d0605 100644
--- a/src/devices/cpu/alto2/a2ram.cpp
+++ b/src/devices/cpu/alto2/a2ram.cpp
@@ -10,11 +10,11 @@
#define DEBUG_WRTRAM 0 //!< define to 1 to printf disassembled CRAM writes
//! direct read access to the microcode CRAM
-#define RD_CRAM(addr) (*reinterpret_cast<UINT32 *>(m_ucode_cram + addr * 4))
+#define RD_CRAM(addr) (*reinterpret_cast<UINT32 *>(m_ucode_cram.get() + addr * 4))
//! direct write access to the microcode CRAM
#define WR_CRAM(addr,data) do { \
- *reinterpret_cast<UINT32 *>(m_ucode_cram + addr * 4) = data; \
+ *reinterpret_cast<UINT32 *>(m_ucode_cram.get() + addr * 4) = data; \
} while (0)
/**
diff --git a/src/devices/cpu/alto2/alto2cpu.cpp b/src/devices/cpu/alto2/alto2cpu.cpp
index 382732044ca..a3538dee290 100644
--- a/src/devices/cpu/alto2/alto2cpu.cpp
+++ b/src/devices/cpu/alto2/alto2cpu.cpp
@@ -819,10 +819,10 @@ void alto2_cpu_device::device_start()
m_ucode_crom = prom_load(machine(), pl_ucode, memregion("ucode_proms")->base(), ALTO2_UCODE_ROM_PAGES, 8);
// allocate micro code CRAM
- m_ucode_cram = auto_alloc_array(machine(), UINT8, sizeof(UINT32) * ALTO2_UCODE_RAM_PAGES * ALTO2_UCODE_PAGE_SIZE);
+ m_ucode_cram = std::make_unique<UINT8[]>(sizeof(UINT32) * ALTO2_UCODE_RAM_PAGES * ALTO2_UCODE_PAGE_SIZE);
// fill with the micro code inverted bits value
for (offs_t offset = 0; offset < ALTO2_UCODE_RAM_PAGES * ALTO2_UCODE_PAGE_SIZE; offset++)
- *reinterpret_cast<UINT32 *>(m_ucode_cram + offset * 4) = ALTO2_UCODE_INVERTED;
+ *reinterpret_cast<UINT32 *>(m_ucode_cram.get() + offset * 4) = ALTO2_UCODE_INVERTED;
// decode constant PROMs to m_const_data
m_const_data = prom_load(machine(), pl_const, memregion("const_proms")->base(), 1, 4);
@@ -1002,7 +1002,7 @@ void alto2_cpu_device::device_start()
// for the debugger
//-------------------------------------------------
-void alto2_cpu_device::state_string_export(const device_state_entry &entry, std::string &str)
+void alto2_cpu_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
@@ -1028,13 +1028,13 @@ READ32_MEMBER ( alto2_cpu_device::crom_r )
//! read microcode CRAM
READ32_MEMBER ( alto2_cpu_device::cram_r )
{
- return *reinterpret_cast<UINT32 *>(m_ucode_cram + offset * 4);
+ return *reinterpret_cast<UINT32 *>(m_ucode_cram.get() + offset * 4);
}
//! write microcode CRAM
WRITE32_MEMBER( alto2_cpu_device::cram_w )
{
- *reinterpret_cast<UINT32 *>(m_ucode_cram + offset * 4) = data;
+ *reinterpret_cast<UINT32 *>(m_ucode_cram.get() + offset * 4) = data;
}
//! read constants PROM
@@ -1046,7 +1046,7 @@ READ16_MEMBER ( alto2_cpu_device::const_r )
//! direct read access to the microcode CROM or CRAM
#define RD_UCODE(addr) (addr < ALTO2_UCODE_RAM_BASE ? \
*reinterpret_cast<UINT32 *>(m_ucode_crom + addr * 4) : \
- *reinterpret_cast<UINT32 *>(m_ucode_cram + (addr - ALTO2_UCODE_RAM_BASE) * 4))
+ *reinterpret_cast<UINT32 *>(m_ucode_cram.get() + (addr - ALTO2_UCODE_RAM_BASE) * 4))
//-------------------------------------------------
// device_reset - device-specific reset
diff --git a/src/devices/cpu/alto2/alto2cpu.h b/src/devices/cpu/alto2/alto2cpu.h
index daa66d81658..071cbd3cb2a 100644
--- a/src/devices/cpu/alto2/alto2cpu.h
+++ b/src/devices/cpu/alto2/alto2cpu.h
@@ -213,7 +213,7 @@ protected:
//! device (P)ROMs
virtual const rom_entry *device_rom_region() const override;
//! device_state_interface overrides
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ void state_string_export(const device_state_entry &entry, std::string &str) const override;
//! device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 4; }
@@ -231,7 +231,7 @@ private:
address_space* m_iomem;
UINT8* m_ucode_crom;
- UINT8* m_ucode_cram;
+ std::unique_ptr<UINT8[]> m_ucode_cram;
UINT8* m_const_data;
//! read microcode CROM
@@ -252,12 +252,6 @@ private:
//!< write i/o space RAM
DECLARE_WRITE16_MEMBER( ioram_w );
- //!< read memory mapped i/o
- DECLARE_READ16_MEMBER ( mmio_r );
-
- //!< write memory mapped i/o
- DECLARE_WRITE16_MEMBER( mmio_w );
-
int m_icount;
typedef void (alto2_cpu_device::*a2func)();
diff --git a/src/devices/cpu/am29000/am29000.cpp b/src/devices/cpu/am29000/am29000.cpp
index 27924fa163f..a31dc3b0374 100644
--- a/src/devices/cpu/am29000/am29000.cpp
+++ b/src/devices/cpu/am29000/am29000.cpp
@@ -404,7 +404,7 @@ void am29000_cpu_device::device_start()
}
-void am29000_cpu_device::state_string_export(const device_state_entry &entry, std::string &str)
+void am29000_cpu_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/am29000/am29000.h b/src/devices/cpu/am29000/am29000.h
index 221e7309cea..4f0c1a1a4af 100644
--- a/src/devices/cpu/am29000/am29000.h
+++ b/src/devices/cpu/am29000/am29000.h
@@ -462,7 +462,7 @@ protected:
}
// device_state_interface overrides
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 4; }
diff --git a/src/devices/cpu/amis2000/amis2000.cpp b/src/devices/cpu/amis2000/amis2000.cpp
index 3082b09f14b..57ed4d99578 100644
--- a/src/devices/cpu/amis2000/amis2000.cpp
+++ b/src/devices/cpu/amis2000/amis2000.cpp
@@ -70,7 +70,7 @@ amis2152_cpu_device::amis2152_cpu_device(const machine_config &mconfig, const ch
// disasm
-void amis2000_base_device::state_string_export(const device_state_entry &entry, std::string &str)
+void amis2000_base_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/amis2000/amis2000.h b/src/devices/cpu/amis2000/amis2000.h
index e30522d7719..5beee90fae9 100644
--- a/src/devices/cpu/amis2000/amis2000.h
+++ b/src/devices/cpu/amis2000/amis2000.h
@@ -89,7 +89,7 @@ protected:
virtual UINT32 disasm_min_opcode_bytes() const override { return 1; }
virtual UINT32 disasm_max_opcode_bytes() const override { return 1; }
virtual offs_t disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options) override;
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
address_space_config m_program_config;
address_space_config m_data_config;
diff --git a/src/devices/cpu/apexc/apexc.cpp b/src/devices/cpu/apexc/apexc.cpp
index 77e5c919f44..87c5ff9a351 100644
--- a/src/devices/cpu/apexc/apexc.cpp
+++ b/src/devices/cpu/apexc/apexc.cpp
@@ -814,7 +814,7 @@ void apexc_cpu_device::state_export(const device_state_entry &entry)
}
-void apexc_cpu_device::state_string_export(const device_state_entry &entry, std::string &str)
+void apexc_cpu_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/apexc/apexc.h b/src/devices/cpu/apexc/apexc.h
index 99b64812702..ad07fba71c6 100644
--- a/src/devices/cpu/apexc/apexc.h
+++ b/src/devices/cpu/apexc/apexc.h
@@ -44,7 +44,7 @@ protected:
// device_state_interface overrides
virtual void state_import(const device_state_entry &entry) override;
virtual void state_export(const device_state_entry &entry) override;
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 4; }
diff --git a/src/devices/cpu/arcompact/arcompact_execute.cpp b/src/devices/cpu/arcompact/arcompact_execute.cpp
index ba3c3ea3af4..8da820fa25d 100644
--- a/src/devices/cpu/arcompact/arcompact_execute.cpp
+++ b/src/devices/cpu/arcompact/arcompact_execute.cpp
@@ -1293,7 +1293,7 @@ ARCOMPACT_RETTYPE arcompact_device::arcompact_handle01_00_01dasm(OPS_32)
ARCOMPACT_RETTYPE arcompact_device::arcompact_01_01_00_helper(OPS_32, const char* optext)
{
- int size = 4;
+ int size;
// Branch on Compare / Bit Test - Register-Register
@@ -1564,7 +1564,7 @@ ARCOMPACT_RETTYPE arcompact_device::arcompact_handle01_01_01_0f(OPS_32) { retur
ARCOMPACT_RETTYPE arcompact_device::arcompact_handle02(OPS_32)
{
int size = 4;
- UINT32 limm = 0;
+ UINT32 limm;
int S = (op & 0x00008000) >> 15;// op &= ~0x00008000;
int s = (op & 0x00ff0000) >> 16;// op &= ~0x00ff0000;
@@ -1761,7 +1761,7 @@ ARCOMPACT_RETTYPE arcompact_device::arcompact_handle03(OPS_32)
ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_helper(OPS_32, const char* optext, int ignore_dst, int b_reserved)
{
- int size = 4;
+ int size;
//UINT32 limm = 0;
int got_limm = 0;
@@ -1925,7 +1925,7 @@ ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_1d(OPS_32)
ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_20_p00(OPS_32)
{
- int size = 4;
+ int size;
UINT32 limm = 0;
int got_limm = 0;
@@ -2011,7 +2011,7 @@ ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_20_p11_m0(OPS_32) // Jcc
COMMON32_GET_CONDITION;
COMMON32_GET_F
- UINT32 c = 0;
+ UINT32 c;
if (creg == LIMM_REG)
{
@@ -2127,7 +2127,7 @@ ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_21_p10(OPS_32)
ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_21_p11_m0(OPS_32) // Jcc.D (no link, delay)
{
int size = 4;
- UINT32 limm = 0;
+ UINT32 limm;
int got_limm = 0;
COMMON32_GET_creg
@@ -2270,7 +2270,7 @@ ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_29(OPS_32)
ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_2f_helper(OPS_32, const char* optext)
{
- int size = 4;
+ int size;
COMMON32_GET_p;
//COMMON32_GET_breg;
@@ -2330,7 +2330,7 @@ ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_2f_3f_05(OPS_32) { arcom
ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_3x_helper(OPS_32, int dsize, int extend)
{
- int size = 4;
+ int size;
//UINT32 limm=0;
int got_limm = 0;
@@ -2406,7 +2406,7 @@ ARCOMPACT_RETTYPE arcompact_device::arcompact_handle05_29(OPS_32) { return arco
ARCOMPACT_RETTYPE arcompact_device::arcompact_handle05_2f_0x_helper(OPS_32, const char* optext)
{
- int size = 4;
+ int size;
COMMON32_GET_p;
//COMMON32_GET_breg;
@@ -2548,7 +2548,7 @@ ARCOMPACT_RETTYPE arcompact_device::arcompact_handle0d_03(OPS_16)
ARCOMPACT_RETTYPE arcompact_device::arcompact_handle0e_0x_helper(OPS_16, const char* optext, int revop)
{
int h;// , breg;
- int size = 2;
+ int size;
GROUP_0e_GET_h;
diff --git a/src/devices/cpu/arcompact/arcompactdasm.cpp b/src/devices/cpu/arcompact/arcompactdasm.cpp
index 0b917a05d56..755106ce90c 100644
--- a/src/devices/cpu/arcompact/arcompactdasm.cpp
+++ b/src/devices/cpu/arcompact/arcompactdasm.cpp
@@ -26,7 +26,7 @@ extern char *output;
CPU_DISASSEMBLE(arcompact)
{
- int size = 2;
+ int size;
UINT32 op = oprom[0] | (oprom[1] << 8);
output = buffer;
diff --git a/src/devices/cpu/arcompact/arcompactdasm_ops.cpp b/src/devices/cpu/arcompact/arcompactdasm_ops.cpp
index eeac8cac2f8..b9cfc30b545 100644
--- a/src/devices/cpu/arcompact/arcompactdasm_ops.cpp
+++ b/src/devices/cpu/arcompact/arcompactdasm_ops.cpp
@@ -504,7 +504,7 @@ int arcompact_handle04_p01_helper_dasm(DASM_OPS_32, const char* optext, int igno
int arcompact_handle04_p10_helper_dasm(DASM_OPS_32, const char* optext, int b_reserved)
{
int size = 4;
- UINT32 limm = 0;
+ UINT32 limm;
//int got_limm = 0;
COMMON32_GET_breg;
@@ -599,7 +599,7 @@ int arcompact_handle04_p11_m0_helper_dasm(DASM_OPS_32, const char* optext, int b
int arcompact_handle04_p11_m1_helper_dasm(DASM_OPS_32, const char* optext, int b_reserved)
{
int size = 4;
- UINT32 limm = 0;
+ UINT32 limm;
//int got_limm = 0;
COMMON32_GET_breg;
diff --git a/src/devices/cpu/arm/arm.cpp b/src/devices/cpu/arm/arm.cpp
index aa07ddcfecb..41724668f53 100644
--- a/src/devices/cpu/arm/arm.cpp
+++ b/src/devices/cpu/arm/arm.cpp
@@ -552,7 +552,7 @@ void arm_cpu_device::device_start()
}
-void arm_cpu_device::state_string_export(const device_state_entry &entry, std::string &str)
+void arm_cpu_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
static const char *s[4] = { "USER", "FIRQ", "IRQ ", "SVC " };
diff --git a/src/devices/cpu/arm/arm.h b/src/devices/cpu/arm/arm.h
index f0639f384c1..d2f6156127b 100644
--- a/src/devices/cpu/arm/arm.h
+++ b/src/devices/cpu/arm/arm.h
@@ -61,7 +61,7 @@ protected:
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override { return (spacenum == AS_PROGRAM) ? &m_program_config : nullptr; }
// device_state_interface overrides
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 4; }
diff --git a/src/devices/cpu/arm7/arm7.cpp b/src/devices/cpu/arm7/arm7.cpp
index 346dcb1020d..828f8562811 100644
--- a/src/devices/cpu/arm7/arm7.cpp
+++ b/src/devices/cpu/arm7/arm7.cpp
@@ -564,7 +564,7 @@ void arm7_cpu_device::state_export(const device_state_entry &entry)
}
-void arm7_cpu_device::state_string_export(const device_state_entry &entry, std::string &str)
+void arm7_cpu_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/arm7/arm7.h b/src/devices/cpu/arm7/arm7.h
index 210abe73cf6..24ab02f2b86 100644
--- a/src/devices/cpu/arm7/arm7.h
+++ b/src/devices/cpu/arm7/arm7.h
@@ -71,7 +71,7 @@ protected:
// device_state_interface overrides
virtual void state_export(const device_state_entry &entry) override;
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 2; }
diff --git a/src/devices/cpu/arm7/arm7dasm.cpp b/src/devices/cpu/arm7/arm7dasm.cpp
index b749d3624a2..68a2bb38654 100644
--- a/src/devices/cpu/arm7/arm7dasm.cpp
+++ b/src/devices/cpu/arm7/arm7dasm.cpp
@@ -494,7 +494,7 @@ static UINT32 arm7_disasm( char *pBuf, UINT32 pc, UINT32 opcode )
}
else if( (opcode&0x0c000000)==0x04000000 ) //bits 27-26 == 01
{
- UINT32 rn = 0;
+ UINT32 rn;
UINT32 rnv = 0;
/* Data Transfer */
diff --git a/src/devices/cpu/arm7/arm7ops.cpp b/src/devices/cpu/arm7/arm7ops.cpp
index 07dd3c2e75c..9c1f0197764 100644
--- a/src/devices/cpu/arm7/arm7ops.cpp
+++ b/src/devices/cpu/arm7/arm7ops.cpp
@@ -637,7 +637,7 @@ void arm7_cpu_device::HandleHalfWordDT(UINT32 insn)
// Signed?
if (insn & 0x40)
{
- UINT32 newval = 0;
+ UINT32 newval;
// Signed Half Word?
if (insn & 0x20) {
@@ -822,7 +822,7 @@ void arm7_cpu_device::HandleSwap(UINT32 insn)
void arm7_cpu_device::HandlePSRTransfer(UINT32 insn)
{
int reg = (insn & 0x400000) ? SPSR : eCPSR; // Either CPSR or SPSR
- UINT32 newval, val = 0;
+ UINT32 newval, val;
int oldmode = GET_CPSR & MODE_FLAG;
// get old value of CPSR/SPSR
@@ -1195,7 +1195,7 @@ void arm7_cpu_device::HandleSMulLong(UINT32 insn)
{
INT32 rm, rs;
UINT32 rhi, rlo;
- INT64 res = 0;
+ INT64 res;
// MULL takes 1S + (m+1)I and MLAL 1S + (m+2)I cycles to execute, where m is the
// number of 8 bit multiplier array cycles required to complete the multiply, which is
@@ -1247,7 +1247,7 @@ void arm7_cpu_device::HandleUMulLong(UINT32 insn)
{
UINT32 rm, rs;
UINT32 rhi, rlo;
- UINT64 res = 0;
+ UINT64 res;
// MULL takes 1S + (m+1)I and MLAL 1S + (m+2)I cycles to execute, where m is the
// number of 8 bit multiplier array cycles required to complete the multiply, which is
diff --git a/src/devices/cpu/asap/asap.cpp b/src/devices/cpu/asap/asap.cpp
index 9f36eb6116f..c22d0cdcee2 100644
--- a/src/devices/cpu/asap/asap.cpp
+++ b/src/devices/cpu/asap/asap.cpp
@@ -186,7 +186,6 @@ void asap_device::device_start()
m_direct = &m_program->direct();
// register our state for the debugger
- std::string tempstr;
state_add(STATE_GENPC, "GENPC", m_pc).noshow();
state_add(STATE_GENPCBASE, "GENPCBASE", m_ppc).noshow();
state_add(STATE_GENSP, "GENSP", m_src2val[REGBASE + 31]).noshow();
@@ -194,7 +193,7 @@ void asap_device::device_start()
state_add(ASAP_PC, "PC", m_pc);
state_add(ASAP_PS, "PS", m_flagsio).callimport().callexport();
for (int regnum = 0; regnum < 32; regnum++)
- state_add(ASAP_R0 + regnum, strformat(tempstr, "R%d", regnum).c_str(), m_src2val[REGBASE + regnum]);
+ state_add(ASAP_R0 + regnum, strformat("R%d", regnum).c_str(), m_src2val[REGBASE + regnum]);
// register our state for saving
save_item(NAME(m_pc));
@@ -281,7 +280,7 @@ void asap_device::state_export(const device_state_entry &entry)
// for the debugger
//-------------------------------------------------
-void asap_device::state_string_export(const device_state_entry &entry, std::string &str)
+void asap_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/asap/asap.h b/src/devices/cpu/asap/asap.h
index 287f2056af2..87d11282072 100644
--- a/src/devices/cpu/asap/asap.h
+++ b/src/devices/cpu/asap/asap.h
@@ -48,7 +48,7 @@ protected:
// device_state_interface overrides
virtual void state_import(const device_state_entry &entry) override;
virtual void state_export(const device_state_entry &entry) override;
- virtual void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override;
diff --git a/src/devices/cpu/avr8/avr8.cpp b/src/devices/cpu/avr8/avr8.cpp
index d043e466876..756562f0ea7 100644
--- a/src/devices/cpu/avr8/avr8.cpp
+++ b/src/devices/cpu/avr8/avr8.cpp
@@ -905,7 +905,7 @@ const address_space_config *avr8_device::memory_space_config(address_spacenum sp
// for the debugger
//-------------------------------------------------
-void avr8_device::state_string_export(const device_state_entry &entry, std::string &str)
+void avr8_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
@@ -1316,7 +1316,7 @@ void avr8_device::timer1_tick()
//UINT8 compare_mode[2] = { (m_r[AVR8_REGIDX_TCCR1A] & AVR8_TCCR1A_COM1A_MASK) >> AVR8_TCCR1A_COM1A_SHIFT,
//(m_r[AVR8_REGIDX_TCCR1A] & AVR8_TCCR1A_COM1B_MASK) >> AVR8_TCCR1A_COM1B_SHIFT };
UINT16 ocr1[2] = { static_cast<UINT16>((m_r[AVR8_REGIDX_OCR1AH] << 8) | m_r[AVR8_REGIDX_OCR1AL]),
- static_cast<UINT16>((m_r[AVR8_REGIDX_OCR1BH] << 8) | m_r[AVR8_REGIDX_OCR1BL]) };
+ static_cast<UINT16>((m_r[AVR8_REGIDX_OCR1BH] << 8) | m_r[AVR8_REGIDX_OCR1BL]) };
UINT8 ocf1[2] = { (1 << AVR8_TIFR1_OCF1A_SHIFT), (1 << AVR8_TIFR1_OCF1B_SHIFT) };
UINT8 int1[2] = { AVR8_INTIDX_OCF1A, AVR8_INTIDX_OCF1B };
INT32 increment = m_timer_increment[1];
@@ -1712,7 +1712,7 @@ void avr8_device::timer4_tick()
//UINT8 compare_mode[2] = { (m_r[AVR8_REGIDX_TCCR1A] & AVR8_TCCR1A_COM1A_MASK) >> AVR8_TCCR1A_COM1A_SHIFT,
//(m_r[AVR8_REGIDX_TCCR1A] & AVR8_TCCR1A_COM1B_MASK) >> AVR8_TCCR1A_COM1B_SHIFT };
UINT16 ocr4[2] = { static_cast<UINT16>((m_r[AVR8_REGIDX_OCR4AH] << 8) | m_r[AVR8_REGIDX_OCR4AL]),
- static_cast<UINT16>((m_r[AVR8_REGIDX_OCR4BH] << 8) | m_r[AVR8_REGIDX_OCR4BL]) };
+ static_cast<UINT16>((m_r[AVR8_REGIDX_OCR4BH] << 8) | m_r[AVR8_REGIDX_OCR4BL]) };
//TODO UINT8 ocf4[2] = { (1 << AVR8_TIFR4_OCF4A_SHIFT), (1 << AVR8_TIFR4_OCF4B_SHIFT) };
//TODO UINT8 int4[2] = { AVR8_INTIDX_OCF4A, AVR8_INTIDX_OCF4B };
INT32 increment = m_timer_increment[4];
@@ -2973,15 +2973,15 @@ void avr8_device::execute_set_input(int inputnum, int state)
void avr8_device::execute_run()
{
- UINT32 op = 0;
- INT32 offs = 0;
- UINT8 rd = 0;
- UINT8 rr = 0;
- UINT8 res = 0;
- UINT16 pd = 0;
- UINT32 pd32 = 0;
- INT16 sd = 0;
- INT32 opcycles = 1;
+ UINT32 op;
+ INT32 offs;
+ UINT8 rd;
+ UINT8 rr;
+ UINT8 res;
+ UINT16 pd;
+ UINT32 pd32;
+ INT16 sd;
+ INT32 opcycles;
while (m_icount > 0)
{
diff --git a/src/devices/cpu/avr8/avr8.h b/src/devices/cpu/avr8/avr8.h
index 715b12a0432..86207566ffc 100644
--- a/src/devices/cpu/avr8/avr8.h
+++ b/src/devices/cpu/avr8/avr8.h
@@ -79,9 +79,6 @@ class avr8_device;
class avr8_device : public cpu_device
{
public:
- // construction/destruction
- avr8_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock, const device_type type, UINT32 address_mask);
-
// inline configuration helpers
static void set_eeprom_tag(device_t &device, const char *tag) { downcast<avr8_device &>(device).m_eeprom_tag = tag; }
@@ -134,7 +131,7 @@ protected:
virtual offs_t disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options) override;
// device_state_interface overrides
- virtual void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// address spaces
const address_space_config m_program_config;
@@ -188,13 +185,6 @@ protected:
UINT64 m_elapsed_cycles;
// memory access
- inline UINT8 program_read8(UINT32 addr);
- inline UINT16 program_read16(UINT32 addr);
- inline void program_write8(UINT32 addr, UINT8 data);
- inline void program_write16(UINT32 addr, UINT16 data);
- inline UINT8 io_read8(UINT16 addr);
- inline void io_write8(UINT16 addr, UINT8 data);
- inline UINT16 opcode_read();
inline void push(UINT8 val);
inline UINT8 pop();
inline bool is_long_opcode(UINT16 op);
@@ -204,7 +194,6 @@ protected:
// interrupts
void set_irq_line(UINT16 vector, int state);
- void update_interrupt_internal(int source);
// timers
void timer_tick(int cycles);
diff --git a/src/devices/cpu/avr8/avr8dasm.cpp b/src/devices/cpu/avr8/avr8dasm.cpp
index 31b149d5737..cc5fcecf3a9 100644
--- a/src/devices/cpu/avr8/avr8dasm.cpp
+++ b/src/devices/cpu/avr8/avr8dasm.cpp
@@ -31,7 +31,7 @@ CPU_DISASSEMBLE( avr8 )
int pos = 0;
UINT32 op = oprom[pos++];
op |= oprom[pos++] << 8;
- UINT32 addr = 0;
+ UINT32 addr;
const char* register_names[0x40] = {"PINA", "DDRA", "PORTA", "PINB", "DDRB", "PORTB", "PINC", "DDRC", "PORTC", "PIND", "DDRD", "PORTD", "PINE", "DDRE", "PORTE", "PINF", "DDRF", "PORTF", "PING", "DDRG", "PORTG", "TIFR0", "TIFR1", "TIFR2","TIFR3", "TIFR4", "TIFR5", "PCIFR", "EIFR", "EIMSK", "GPIOR0", "EECR", "EEDR", "EEARL", "EEARH", "GTCCR", "TCCR0A", "TCCR0B", "TCNT0", "OCR0A", "OCR0B", "0x29", "GPIOR1", "GPIOR2", "SPCR", "SPSR", "SPDR", "0x2F", "ACSR", "OCDR", "0x32", "SMCR", "MCUSR", "MCUCR", "0x36", "SPMCSR", "0x38", "0x39", "0x3A", "RAMPZ", "EIND", "SPL", "SPH", "SREG"};
const char* register_bit_names[0x40][8] = {
diff --git a/src/devices/cpu/ccpu/ccpu.cpp b/src/devices/cpu/ccpu/ccpu.cpp
index e8893580f0c..bde43753786 100644
--- a/src/devices/cpu/ccpu/ccpu.cpp
+++ b/src/devices/cpu/ccpu/ccpu.cpp
@@ -121,6 +121,7 @@ void ccpu_cpu_device::device_start()
save_item(NAME(m_drflag));
save_item(NAME(m_waiting));
save_item(NAME(m_watchdog));
+ save_item(NAME(m_extinput));
// Register state for debugger
state_add( CCPU_PC, "PC", m_PC).formatstr("%04X");
@@ -139,7 +140,7 @@ void ccpu_cpu_device::device_start()
}
-void ccpu_cpu_device::state_string_export(const device_state_entry &entry, std::string &str)
+void ccpu_cpu_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
@@ -149,7 +150,7 @@ void ccpu_cpu_device::state_string_export(const device_state_entry &entry, std::
TEST_NC ? 'N' : 'n',
TEST_LT ? 'L' : 'l',
TEST_EQ ? 'E' : 'e',
- m_external_input() ? 'M' : 'm',
+ m_extinput ? 'M' : 'm',
TEST_DR ? 'D' : 'd');
break;
}
@@ -206,8 +207,11 @@ void ccpu_cpu_device::execute_run()
m_nextmiflag = m_nextnextmiflag;
/* fetch the opcode */
+ opcode = READOP(m_PC);
+ if (opcode == 0x51 || opcode == 0x59)
+ m_extinput = m_external_input();
debugger_instruction_hook(this, m_PC);
- opcode = READOP(m_PC++);
+ m_PC++;
switch (opcode)
{
@@ -286,7 +290,7 @@ void ccpu_cpu_device::execute_run()
/* JMIB/JEHB */
case 0x51:
- if (m_external_input()) { m_PC = ((m_PC - 1) & 0xf000) + m_J; CYCLES(2); }
+ if (m_extinput) { m_PC = ((m_PC - 1) & 0xf000) + m_J; CYCLES(2); }
NEXT_ACC_B; CYCLES(2);
break;
@@ -333,7 +337,7 @@ void ccpu_cpu_device::execute_run()
/* JMI/JEH */
case 0x59:
- if (m_external_input()) { m_PC = ((m_PC - 1) & 0xf000) + m_J; CYCLES(2); }
+ if (m_extinput) { m_PC = ((m_PC - 1) & 0xf000) + m_J; CYCLES(2); }
NEXT_ACC_A; CYCLES(2);
break;
diff --git a/src/devices/cpu/ccpu/ccpu.h b/src/devices/cpu/ccpu/ccpu.h
index 349b9e9ffc4..9247e54f16d 100644
--- a/src/devices/cpu/ccpu/ccpu.h
+++ b/src/devices/cpu/ccpu/ccpu.h
@@ -82,7 +82,7 @@ protected:
}
// device_state_interface overrides
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 1; }
@@ -113,6 +113,7 @@ protected:
UINT8 m_waiting;
UINT8 m_watchdog;
+ UINT8 m_extinput;
int m_icount;
diff --git a/src/devices/cpu/cop400/cop400.cpp b/src/devices/cpu/cop400/cop400.cpp
index 9f68a8c0545..ae14bd59cab 100644
--- a/src/devices/cpu/cop400/cop400.cpp
+++ b/src/devices/cpu/cop400/cop400.cpp
@@ -1205,7 +1205,7 @@ void cop400_cpu_device::state_export(const device_state_entry &entry)
}
}
-void cop400_cpu_device::state_string_export(const device_state_entry &entry, std::string &str)
+void cop400_cpu_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/cop400/cop400.h b/src/devices/cpu/cop400/cop400.h
index 3b2cbf349bc..43e7755f1f4 100644
--- a/src/devices/cpu/cop400/cop400.h
+++ b/src/devices/cpu/cop400/cop400.h
@@ -170,7 +170,7 @@ protected:
// device_state_interface overrides
virtual void state_import(const device_state_entry &entry) override;
virtual void state_export(const device_state_entry &entry) override;
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 1; }
diff --git a/src/devices/cpu/cosmac/cosmac.cpp b/src/devices/cpu/cosmac/cosmac.cpp
index 73170762cbf..d8e3d52c6fd 100644
--- a/src/devices/cpu/cosmac/cosmac.cpp
+++ b/src/devices/cpu/cosmac/cosmac.cpp
@@ -353,9 +353,8 @@ void cosmac_device::device_start()
state_add(COSMAC_I, "I", m_i).mask(0xf);
state_add(COSMAC_N, "N", m_n).mask(0xf);
- std::string tempstr;
for (int regnum = 0; regnum < 16; regnum++)
- state_add(COSMAC_R0 + regnum, strformat(tempstr, "R%x", regnum).c_str(), m_r[regnum]);
+ state_add(COSMAC_R0 + regnum, strformat("R%x", regnum).c_str(), m_r[regnum]);
state_add(COSMAC_DF, "DF", m_df).mask(0x1).noshow();
state_add(COSMAC_IE, "IE", m_ie).mask(0x1).noshow();
@@ -469,7 +468,7 @@ void cosmac_device::state_export(const device_state_entry &entry)
// for the debugger
//-------------------------------------------------
-void cosmac_device::state_string_export(const device_state_entry &entry, std::string &str)
+void cosmac_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/cosmac/cosmac.h b/src/devices/cpu/cosmac/cosmac.h
index 02cd87f0668..31b1d8dc11c 100644
--- a/src/devices/cpu/cosmac/cosmac.h
+++ b/src/devices/cpu/cosmac/cosmac.h
@@ -232,7 +232,7 @@ protected:
// device_state_interface overrides
virtual void state_import(const device_state_entry &entry) override;
virtual void state_export(const device_state_entry &entry) override;
- virtual void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override;
@@ -251,7 +251,6 @@ protected:
inline void reset();
inline void initialize();
inline void fetch_instruction();
- inline void fetch_instruction_debug();
inline void execute_instruction();
inline void dma_input();
inline void dma_output();
diff --git a/src/devices/cpu/cp1610/cp1610.cpp b/src/devices/cpu/cp1610/cp1610.cpp
index fd6fd5eceb7..a05bbbc0d49 100644
--- a/src/devices/cpu/cp1610/cp1610.cpp
+++ b/src/devices/cpu/cp1610/cp1610.cpp
@@ -3401,7 +3401,7 @@ cp1610_cpu_device::cp1610_cpu_device(const machine_config &mconfig, const char *
}
-void cp1610_cpu_device::state_string_export(const device_state_entry &entry, std::string &str)
+void cp1610_cpu_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/cp1610/cp1610.h b/src/devices/cpu/cp1610/cp1610.h
index ec9618eefff..84611f75a2c 100644
--- a/src/devices/cpu/cp1610/cp1610.h
+++ b/src/devices/cpu/cp1610/cp1610.h
@@ -56,7 +56,7 @@ protected:
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override { return (spacenum == AS_PROGRAM) ? &m_program_config : nullptr; }
// device_state_interface overrides
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 2; }
diff --git a/src/devices/cpu/cubeqcpu/cubeqcpu.cpp b/src/devices/cpu/cubeqcpu/cubeqcpu.cpp
index 0582c9a2679..a657a23680e 100644
--- a/src/devices/cpu/cubeqcpu/cubeqcpu.cpp
+++ b/src/devices/cpu/cubeqcpu/cubeqcpu.cpp
@@ -347,7 +347,7 @@ void cquestrot_cpu_device::device_reset()
}
-void cquestrot_cpu_device::state_string_export(const device_state_entry &entry, std::string &str)
+void cquestrot_cpu_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
@@ -471,7 +471,7 @@ void cquestlin_cpu_device::device_reset()
}
-void cquestlin_cpu_device::state_string_export(const device_state_entry &entry, std::string &str)
+void cquestlin_cpu_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/cubeqcpu/cubeqcpu.h b/src/devices/cpu/cubeqcpu/cubeqcpu.h
index 1faa4fc5db7..23bfbf84f5b 100644
--- a/src/devices/cpu/cubeqcpu/cubeqcpu.h
+++ b/src/devices/cpu/cubeqcpu/cubeqcpu.h
@@ -232,7 +232,7 @@ protected:
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override { return (spacenum == AS_PROGRAM) ? &m_program_config : nullptr; }
// device_state_interface overrides
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 8; }
@@ -316,7 +316,7 @@ protected:
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override { return (spacenum == AS_PROGRAM) ? &m_program_config : nullptr; }
// device_state_interface overrides
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 8; }
diff --git a/src/devices/cpu/drcbeut.cpp b/src/devices/cpu/drcbeut.cpp
index 3bd0edac4a1..356045fad3b 100644
--- a/src/devices/cpu/drcbeut.cpp
+++ b/src/devices/cpu/drcbeut.cpp
@@ -359,7 +359,7 @@ UINT32 drc_map_variables::get_value(drccodeptr codebase, UINT32 mapvar) const
UINT64 *endscan = (UINT64 *)m_cache.top();
// look for the signature
- while (curscan < endscan && *curscan++ != m_uniquevalue) ;
+ while (curscan < endscan && *curscan++ != m_uniquevalue) {};
if (curscan >= endscan)
return 0;
diff --git a/src/devices/cpu/drcbex64.cpp b/src/devices/cpu/drcbex64.cpp
index b14e4cd189d..034f06def80 100644
--- a/src/devices/cpu/drcbex64.cpp
+++ b/src/devices/cpu/drcbex64.cpp
@@ -680,7 +680,7 @@ void drcbe_x64::reset()
{
// output a note to the log
if (m_log != nullptr)
- x86log_printf(m_log, "\n\n===========\nCACHE RESET\n===========\n\n");
+ x86log_printf(m_log, "%s", "\n\n===========\nCACHE RESET\n===========\n\n");
// generate a little bit of glue code to set up the environment
drccodeptr *cachetop = m_cache.begin_codegen(500);
@@ -787,7 +787,6 @@ void drcbe_x64::generate(drcuml_block &block, const instruction *instlist, UINT3
x86code *dst = base;
// generate code
- std::string tempstring;
const char *blockname = nullptr;
for (int inum = 0; inum < numinst; inum++)
{
@@ -797,8 +796,7 @@ void drcbe_x64::generate(drcuml_block &block, const instruction *instlist, UINT3
// add a comment
if (m_log != nullptr)
{
- std::string dasm;
- inst.disasm(dasm, &m_drcuml);
+ std::string dasm = inst.disasm(&m_drcuml);
x86log_add_comment(m_log, dst, "%s", dasm.c_str());
}
@@ -808,7 +806,7 @@ void drcbe_x64::generate(drcuml_block &block, const instruction *instlist, UINT3
if (inst.opcode() == OP_HANDLE)
blockname = inst.param(0).handle().string();
else if (inst.opcode() == OP_HASH)
- blockname = strformat(tempstring, "Code: mode=%d PC=%08X", (UINT32)inst.param(0).immediate(), (offs_t)inst.param(1).immediate()).c_str();
+ blockname = strformat("Code: mode=%d PC=%08X", (UINT32)inst.param(0).immediate(), (offs_t)inst.param(1).immediate()).c_str();
}
// generate code
diff --git a/src/devices/cpu/drcbex86.cpp b/src/devices/cpu/drcbex86.cpp
index 846d054bf14..3ca840e1c6f 100644
--- a/src/devices/cpu/drcbex86.cpp
+++ b/src/devices/cpu/drcbex86.cpp
@@ -594,7 +594,7 @@ void drcbe_x86::reset()
{
// output a note to the log
if (m_log != nullptr)
- x86log_printf(m_log, "\n\n===========\nCACHE RESET\n===========\n\n");
+ x86log_printf(m_log, "%s", "\n\n===========\nCACHE RESET\n===========\n\n");
// generate a little bit of glue code to set up the environment
drccodeptr *cachetop = m_cache.begin_codegen(500);
@@ -770,7 +770,6 @@ void drcbe_x86::generate(drcuml_block &block, const instruction *instlist, UINT3
x86code *dst = base;
// generate code
- std::string tempstring;
const char *blockname = nullptr;
for (int inum = 0; inum < numinst; inum++)
{
@@ -780,8 +779,7 @@ void drcbe_x86::generate(drcuml_block &block, const instruction *instlist, UINT3
// add a comment
if (m_log != nullptr)
{
- std::string dasm;
- inst.disasm(dasm, &m_drcuml);
+ std::string dasm = inst.disasm(&m_drcuml);
x86log_add_comment(m_log, dst, "%s", dasm.c_str());
}
@@ -791,7 +789,7 @@ void drcbe_x86::generate(drcuml_block &block, const instruction *instlist, UINT3
if (inst.opcode() == OP_HANDLE)
blockname = inst.param(0).handle().string();
else if (inst.opcode() == OP_HASH)
- blockname = strformat(tempstring, "Code: mode=%d PC=%08X", (UINT32)inst.param(0).immediate(), (offs_t)inst.param(1).immediate()).c_str();
+ blockname = strformat("Code: mode=%d PC=%08X", (UINT32)inst.param(0).immediate(), (offs_t)inst.param(1).immediate()).c_str();
}
// generate code
diff --git a/src/devices/cpu/drcbex86.h b/src/devices/cpu/drcbex86.h
index 33eaa65bacc..df81ee0c7c7 100644
--- a/src/devices/cpu/drcbex86.h
+++ b/src/devices/cpu/drcbex86.h
@@ -127,7 +127,6 @@ private:
void fixup_exception(drccodeptr *codeptr, void *param1, void *param2);
static void debug_log_hashjmp(int mode, offs_t pc);
- static void debug_log_hashjmp_fail();
// code generators
void op_handle(x86code *&dst, const uml::instruction &inst);
@@ -262,7 +261,6 @@ private:
void emit_sbb_r64_p64(x86code *&dst, UINT8 reglo, UINT8 reghi, const be_parameter &param, const uml::instruction &inst);
void emit_sbb_m64_p64(x86code *&dst, x86_memref memref, const be_parameter &param, const uml::instruction &inst);
void emit_cmp_r64_p64(x86code *&dst, UINT8 reglo, UINT8 reghi, const be_parameter &param, const uml::instruction &inst);
- void emit_cmp_m64_p64(x86code *&dst, x86_memref memref, const be_parameter &param, const uml::instruction &inst);
void emit_and_r64_p64(x86code *&dst, UINT8 reglo, UINT8 reghi, const be_parameter &param, const uml::instruction &inst);
void emit_and_m64_p64(x86code *&dst, x86_memref memref, const be_parameter &param, const uml::instruction &inst);
void emit_test_r64_p64(x86code *&dst, UINT8 reglo, UINT8 reghi, const be_parameter &param, const uml::instruction &inst);
@@ -272,19 +270,12 @@ private:
void emit_xor_r64_p64(x86code *&dst, UINT8 reglo, UINT8 reghi, const be_parameter &param, const uml::instruction &inst);
void emit_xor_m64_p64(x86code *&dst, x86_memref memref, const be_parameter &param, const uml::instruction &inst);
void emit_shl_r64_p64(x86code *&dst, UINT8 reglo, UINT8 reghi, const be_parameter &param, const uml::instruction &inst);
- void emit_shl_m64_p64(x86code *&dst, x86_memref memref, const be_parameter &param, const uml::instruction &inst);
void emit_shr_r64_p64(x86code *&dst, UINT8 reglo, UINT8 reghi, const be_parameter &param, const uml::instruction &inst);
- void emit_shr_m64_p64(x86code *&dst, x86_memref memref, const be_parameter &param, const uml::instruction &inst);
void emit_sar_r64_p64(x86code *&dst, UINT8 reglo, UINT8 reghi, const be_parameter &param, const uml::instruction &inst);
- void emit_sar_m64_p64(x86code *&dst, x86_memref memref, const be_parameter &param, const uml::instruction &inst);
void emit_rol_r64_p64(x86code *&dst, UINT8 reglo, UINT8 reghi, const be_parameter &param, const uml::instruction &inst);
- void emit_rol_m64_p64(x86code *&dst, x86_memref memref, const be_parameter &param, const uml::instruction &inst);
void emit_ror_r64_p64(x86code *&dst, UINT8 reglo, UINT8 reghi, const be_parameter &param, const uml::instruction &inst);
- void emit_ror_m64_p64(x86code *&dst, x86_memref memref, const be_parameter &param, const uml::instruction &inst);
void emit_rcl_r64_p64(x86code *&dst, UINT8 reglo, UINT8 reghi, const be_parameter &param, const uml::instruction &inst);
- void emit_rcl_m64_p64(x86code *&dst, x86_memref memref, const be_parameter &param, const uml::instruction &inst);
void emit_rcr_r64_p64(x86code *&dst, UINT8 reglo, UINT8 reghi, const be_parameter &param, const uml::instruction &inst);
- void emit_rcr_m64_p64(x86code *&dst, x86_memref memref, const be_parameter &param, const uml::instruction &inst);
// floating-point code emission helpers
void emit_fld_p(x86code *&dst, int size, const be_parameter &param);
diff --git a/src/devices/cpu/drcuml.cpp b/src/devices/cpu/drcuml.cpp
index a835cb01bda..3bbd610cfa9 100644
--- a/src/devices/cpu/drcuml.cpp
+++ b/src/devices/cpu/drcuml.cpp
@@ -91,7 +91,7 @@ drcbe_interface::drcbe_interface(drcuml_state &drcuml, drc_cache &cache, device_
// find the spaces and fetch memory accessors
device_memory_interface *memory;
if (device.interface(memory))
- for (address_spacenum spacenum = AS_0; spacenum < ARRAY_LENGTH(m_space); spacenum++)
+ for (address_spacenum spacenum = AS_0; spacenum < ARRAY_LENGTH(m_space); ++spacenum)
if (memory->has_space(spacenum))
{
m_space[spacenum] = &memory->space(spacenum);
@@ -121,9 +121,10 @@ drcbe_interface::~drcbe_interface()
drcuml_state::drcuml_state(device_t &device, drc_cache &cache, UINT32 flags, int modes, int addrbits, int ignorebits)
: m_device(device),
m_cache(cache),
- m_beintf(device.machine().options().drc_use_c() ?
- *static_cast<drcbe_interface *>(auto_alloc(device.machine(), drcbe_c(*this, device, cache, flags, modes, addrbits, ignorebits))) :
- *static_cast<drcbe_interface *>(auto_alloc(device.machine(), drcbe_native(*this, device, cache, flags, modes, addrbits, ignorebits)))),
+ m_drcbe_interface(device.machine().options().drc_use_c() ?
+ std::unique_ptr<drcbe_interface>{ std::make_unique<drcbe_c>(*this, device, cache, flags, modes, addrbits, ignorebits) } :
+ std::unique_ptr<drcbe_interface>{ std::make_unique<drcbe_native>(*this, device, cache, flags, modes, addrbits, ignorebits) }),
+ m_beintf(*m_drcbe_interface.get()),
m_umllog(nullptr)
{
// if we're to log, create the logfile
@@ -141,9 +142,6 @@ drcuml_state::drcuml_state(device_t &device, drc_cache &cache, UINT32 flags, int
drcuml_state::~drcuml_state()
{
- // free the back-end
- auto_free(m_device.machine(), &m_beintf);
-
// close any files
if (m_umllog != nullptr)
fclose(m_umllog);
@@ -458,7 +456,6 @@ void drcuml_block::optimize()
void drcuml_block::disassemble()
{
std::string comment;
- std::string dasm;
// iterate over instructions and output
int firstcomment = -1;
@@ -485,7 +482,7 @@ void drcuml_block::disassemble()
// indent everything else with a tab
else
{
- m_inst[instnum].disasm(dasm, &m_drcuml);
+ std::string dasm = m_inst[instnum].disasm(&m_drcuml);
// include the first accumulated comment with this line
if (firstcomment != -1)
@@ -1121,16 +1118,14 @@ static int bevalidate_verify_state(drcuml_state *drcuml, const drcuml_machine_st
// output the error if we have one
if (errend != errorbuf)
{
- char disasm[256];
-
// disassemble the test instruction
- testinst->disasm(disasm, drcuml);
+ std::string disasm = testinst->disasm(drcuml);
// output a description of what went wrong
printf("\n");
printf("----------------------------------------------\n");
printf("Backend validation error:\n");
- printf(" %s\n", disasm);
+ printf(" %s\n", disasm.c_str());
printf("\n");
printf("Errors:\n");
printf("%s\n", errorbuf);
diff --git a/src/devices/cpu/drcuml.h b/src/devices/cpu/drcuml.h
index cb24396c655..9c13d1110b3 100644
--- a/src/devices/cpu/drcuml.h
+++ b/src/devices/cpu/drcuml.h
@@ -226,6 +226,7 @@ private:
// internal state
device_t & m_device; // CPU device we are associated with
drc_cache & m_cache; // pointer to the codegen cache
+ std::unique_ptr<drcbe_interface> m_drcbe_interface;
drcbe_interface & m_beintf; // backend interface pointer
FILE * m_umllog; // handle to the UML logfile
simple_list<drcuml_block> m_blocklist; // list of active blocks
diff --git a/src/devices/cpu/dsp16/dsp16.cpp b/src/devices/cpu/dsp16/dsp16.cpp
index f7b68e50d75..8b97ce4c064 100644
--- a/src/devices/cpu/dsp16/dsp16.cpp
+++ b/src/devices/cpu/dsp16/dsp16.cpp
@@ -214,7 +214,7 @@ const address_space_config *dsp16_device::memory_space_config(address_spacenum s
// for the debugger
//-------------------------------------------------
-void dsp16_device::state_string_export(const device_state_entry &entry, std::string &str)
+void dsp16_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/dsp16/dsp16.h b/src/devices/cpu/dsp16/dsp16.h
index f574aeae03e..6e509da0569 100644
--- a/src/devices/cpu/dsp16/dsp16.h
+++ b/src/devices/cpu/dsp16/dsp16.h
@@ -46,7 +46,7 @@ protected:
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override;
// device_state_interface overrides
- virtual void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override;
diff --git a/src/devices/cpu/dsp32/dsp32.cpp b/src/devices/cpu/dsp32/dsp32.cpp
index a8e65846559..f060e81d13c 100644
--- a/src/devices/cpu/dsp32/dsp32.cpp
+++ b/src/devices/cpu/dsp32/dsp32.cpp
@@ -194,14 +194,13 @@ void dsp32c_device::device_start()
m_direct = &m_program->direct();
// register our state for the debugger
- std::string tempstr;
state_add(STATE_GENPC, "GENPC", m_r[15]).noshow();
state_add(STATE_GENPCBASE, "GENPCBASE", m_ppc).noshow();
state_add(STATE_GENSP, "GENSP", m_r[21]).noshow();
state_add(STATE_GENFLAGS, "GENFLAGS", m_iotemp).callimport().callexport().formatstr("%6s").noshow();
state_add(DSP32_PC, "PC", m_r[15]).mask(0xffffff);
for (int regnum = 0; regnum <= 14; regnum++)
- state_add(DSP32_R0 + regnum, strformat(tempstr, "R%d", regnum).c_str(), m_r[regnum]).mask(0xffffff);
+ state_add(DSP32_R0 + regnum, strformat("R%d", regnum).c_str(), m_r[regnum]).mask(0xffffff);
state_add(DSP32_R15, "R15", m_r[17]).mask(0xffffff);
state_add(DSP32_R16, "R16", m_r[18]).mask(0xffffff);
state_add(DSP32_R17, "R17", m_r[19]).mask(0xffffff);
@@ -369,7 +368,7 @@ void dsp32c_device::state_export(const device_state_entry &entry)
// for the debugger
//-------------------------------------------------
-void dsp32c_device::state_string_export(const device_state_entry &entry, std::string &str)
+void dsp32c_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/dsp32/dsp32.h b/src/devices/cpu/dsp32/dsp32.h
index 2b0b9e2b07e..b83888b7a6a 100644
--- a/src/devices/cpu/dsp32/dsp32.h
+++ b/src/devices/cpu/dsp32/dsp32.h
@@ -123,7 +123,7 @@ protected:
// device_state_interface overrides
virtual void state_import(const device_state_entry &entry) override;
virtual void state_export(const device_state_entry &entry) override;
- virtual void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override;
diff --git a/src/devices/cpu/dsp56k/dsp56k.cpp b/src/devices/cpu/dsp56k/dsp56k.cpp
index 9e151019c7e..7c4b7abd163 100644
--- a/src/devices/cpu/dsp56k/dsp56k.cpp
+++ b/src/devices/cpu/dsp56k/dsp56k.cpp
@@ -340,9 +340,9 @@ void dsp56k_device::device_start()
}
-void dsp56k_device::state_string_export(const device_state_entry &entry, std::string &str)
+void dsp56k_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
- dsp56k_core *cpustate = &m_dsp56k_core;
+ const dsp56k_core *cpustate = &m_dsp56k_core;
switch (entry.index())
{
diff --git a/src/devices/cpu/dsp56k/dsp56k.h b/src/devices/cpu/dsp56k/dsp56k.h
index 39ed11cc945..185b52dc033 100644
--- a/src/devices/cpu/dsp56k/dsp56k.h
+++ b/src/devices/cpu/dsp56k/dsp56k.h
@@ -204,8 +204,6 @@ class dsp56k_device : public cpu_device
public:
dsp56k_device(const machine_config &mconfig, const char *_tag, device_t *_owner, UINT32 _clock);
- DECLARE_READ16_MEMBER( program_r );
- DECLARE_WRITE16_MEMBER( program_w );
DECLARE_READ16_MEMBER( peripheral_register_r );
DECLARE_WRITE16_MEMBER( peripheral_register_w );
@@ -233,7 +231,7 @@ protected:
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override { return (spacenum == AS_PROGRAM) ? &m_program_config : ((spacenum == AS_DATA) ? &m_data_config : nullptr ); }
// device_state_interface overrides
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 2; }
diff --git a/src/devices/cpu/dsp56k/dsp56pcu.cpp b/src/devices/cpu/dsp56k/dsp56pcu.cpp
index 68b35199c73..637f7b6e067 100644
--- a/src/devices/cpu/dsp56k/dsp56pcu.cpp
+++ b/src/devices/cpu/dsp56k/dsp56pcu.cpp
@@ -14,18 +14,18 @@ namespace DSP56K
/* |-------------------------------------| |-------------------------------| */
/* */
/* ************************************************************************* */
-UINT8 LF_bit(dsp56k_core* cpustate) { return (SR & 0x8000) >> 15; }
-UINT8 FV_bit(dsp56k_core* cpustate) { return (SR & 0x4000) >> 14; }
-// UINT8 S_bits(dsp56k_core* cpustate) { return (SR & 0x0c00) >> 10; }
-UINT8 I_bits(dsp56k_core* cpustate) { return (SR & 0x0300) >> 8; }
-UINT8 S_bit (dsp56k_core* cpustate) { return (SR & 0x0080) >> 7; }
-UINT8 L_bit (dsp56k_core* cpustate) { return (SR & 0x0040) >> 6; }
-UINT8 E_bit (dsp56k_core* cpustate) { return (SR & 0x0020) >> 5; }
-UINT8 U_bit (dsp56k_core* cpustate) { return (SR & 0x0010) >> 4; }
-UINT8 N_bit (dsp56k_core* cpustate) { return (SR & 0x0008) >> 3; }
-UINT8 Z_bit (dsp56k_core* cpustate) { return (SR & 0x0004) >> 2; }
-UINT8 V_bit (dsp56k_core* cpustate) { return (SR & 0x0002) >> 1; }
-UINT8 C_bit (dsp56k_core* cpustate) { return (SR & 0x0001) >> 0; }
+UINT8 LF_bit(const dsp56k_core* cpustate) { return (SR & 0x8000) >> 15; }
+UINT8 FV_bit(const dsp56k_core* cpustate) { return (SR & 0x4000) >> 14; }
+// UINT8 S_bits(const dsp56k_core* cpustate) { return (SR & 0x0c00) >> 10; }
+UINT8 I_bits(const dsp56k_core* cpustate) { return (SR & 0x0300) >> 8; }
+UINT8 S_bit (const dsp56k_core* cpustate) { return (SR & 0x0080) >> 7; }
+UINT8 L_bit (const dsp56k_core* cpustate) { return (SR & 0x0040) >> 6; }
+UINT8 E_bit (const dsp56k_core* cpustate) { return (SR & 0x0020) >> 5; }
+UINT8 U_bit (const dsp56k_core* cpustate) { return (SR & 0x0010) >> 4; }
+UINT8 N_bit (const dsp56k_core* cpustate) { return (SR & 0x0008) >> 3; }
+UINT8 Z_bit (const dsp56k_core* cpustate) { return (SR & 0x0004) >> 2; }
+UINT8 V_bit (const dsp56k_core* cpustate) { return (SR & 0x0002) >> 1; }
+UINT8 C_bit (const dsp56k_core* cpustate) { return (SR & 0x0001) >> 0; }
/* MR setters */
void LF_bit_set(dsp56k_core* cpustate, UINT8 value) { if (value) (SR |= 0x8000); else (SR &= (~0x8000)); }
@@ -54,13 +54,13 @@ void C_bit_set(dsp56k_core* cpustate, UINT8 value) { if (value) (SR |= 0x0001);
/* |---------------------------------------------------------------------| */
/* */
/* ************************************************************************* */
-// UINT8 CD_bit(dsp56k_core* cpustate) { return ((OMR & 0x0080) != 0); }
-// UINT8 SD_bit(dsp56k_core* cpustate) { return ((OMR & 0x0040) != 0); }
-// UINT8 R_bit(dsp56k_core* cpustate) { return ((OMR & 0x0020) != 0); }
-// UINT8 SA_bit(dsp56k_core* cpustate) { return ((OMR & 0x0010) != 0); }
-// UINT8 MC_bit(dsp56k_core* cpustate) { return ((OMR & 0x0004) != 0); }
-UINT8 MB_bit(dsp56k_core* cpustate) { return ((OMR & 0x0002) != 0); }
-UINT8 MA_bit(dsp56k_core* cpustate) { return ((OMR & 0x0001) != 0); }
+// UINT8 CD_bit(const dsp56k_core* cpustate) { return ((OMR & 0x0080) != 0); }
+// UINT8 SD_bit(const dsp56k_core* cpustate) { return ((OMR & 0x0040) != 0); }
+// UINT8 R_bit(const dsp56k_core* cpustate) { return ((OMR & 0x0020) != 0); }
+// UINT8 SA_bit(const dsp56k_core* cpustate) { return ((OMR & 0x0010) != 0); }
+// UINT8 MC_bit(const dsp56k_core* cpustate) { return ((OMR & 0x0004) != 0); }
+UINT8 MB_bit(const dsp56k_core* cpustate) { return ((OMR & 0x0002) != 0); }
+UINT8 MA_bit(const dsp56k_core* cpustate) { return ((OMR & 0x0001) != 0); }
void CD_bit_set(dsp56k_core* cpustate, UINT8 value) { if (value) (OMR |= 0x0080); else (OMR &= (~0x0080)); }
void SD_bit_set(dsp56k_core* cpustate, UINT8 value) { if (value) (OMR |= 0x0040); else (OMR &= (~0x0040)); }
@@ -70,7 +70,7 @@ void MC_bit_set(dsp56k_core* cpustate, UINT8 value) { if (value) (OMR |= 0x0004)
void MB_bit_set(dsp56k_core* cpustate, UINT8 value) { if (value) (OMR |= 0x0002); else (OMR &= (~0x0002)); }
void MA_bit_set(dsp56k_core* cpustate, UINT8 value) { if (value) (OMR |= 0x0001); else (OMR &= (~0x0001)); }
-UINT8 dsp56k_operating_mode(dsp56k_core* cpustate)
+UINT8 dsp56k_operating_mode(const dsp56k_core* cpustate)
{
return ((MB_bit(cpustate) << 1) | MA_bit(cpustate));
}
@@ -86,8 +86,8 @@ UINT8 dsp56k_operating_mode(dsp56k_core* cpustate)
/* |---------------------------------------------------------------------| */
/* */
/* ************************************************************************* */
-UINT8 UF_bit(dsp56k_core* cpustate) { return ((SP & 0x0020) != 0); }
-UINT8 SE_bit(dsp56k_core* cpustate) { return ((SP & 0x0010) != 0); }
+UINT8 UF_bit(const dsp56k_core* cpustate) { return ((SP & 0x0020) != 0); }
+UINT8 SE_bit(const dsp56k_core* cpustate) { return ((SP & 0x0010) != 0); }
//void UF_bit_set(dsp56k_core* cpustate, UINT8 value) {};
//void SE_bit_set(dsp56k_core* cpustate, UINT8 value) {};
diff --git a/src/devices/cpu/dsp56k/dsp56pcu.h b/src/devices/cpu/dsp56k/dsp56pcu.h
index 7463ac11d35..b3b83109a35 100644
--- a/src/devices/cpu/dsp56k/dsp56pcu.h
+++ b/src/devices/cpu/dsp56k/dsp56pcu.h
@@ -42,28 +42,28 @@ void pcu_init(dsp56k_core* cpustate, device_t *device);
/* STATUS REGISTER (SR) BITS (1-25) */
/* MR */
-UINT8 LF_bit(dsp56k_core* cpustate);
-UINT8 FV_bit(dsp56k_core* cpustate);
-//UINT8 S_bits(dsp56k_core* cpustate);
-UINT8 I_bits(dsp56k_core* cpustate);
+UINT8 LF_bit(const dsp56k_core* cpustate);
+UINT8 FV_bit(const dsp56k_core* cpustate);
+//UINT8 S_bits(const dsp56k_core* cpustate);
+UINT8 I_bits(const dsp56k_core* cpustate);
/* CCR - with macros for easy access */
#define S() (S_bit(cpustate))
-UINT8 S_bit(dsp56k_core* cpustate);
+UINT8 S_bit(const dsp56k_core* cpustate);
#define L() (L_bit(cpustate))
-UINT8 L_bit(dsp56k_core* cpustate);
+UINT8 L_bit(const dsp56k_core* cpustate);
#define E() (E_bit(cpustate))
-UINT8 E_bit(dsp56k_core* cpustate);
+UINT8 E_bit(const dsp56k_core* cpustate);
#define U() (U_bit(cpustate))
-UINT8 U_bit(dsp56k_core* cpustate);
+UINT8 U_bit(const dsp56k_core* cpustate);
#define N() (N_bit(cpustate))
-UINT8 N_bit(dsp56k_core* cpustate);
+UINT8 N_bit(const dsp56k_core* cpustate);
#define Z() (Z_bit(cpustate))
-UINT8 Z_bit(dsp56k_core* cpustate);
+UINT8 Z_bit(const dsp56k_core* cpustate);
#define V() (V_bit(cpustate))
-UINT8 V_bit(dsp56k_core* cpustate);
+UINT8 V_bit(const dsp56k_core* cpustate);
#define C() (C_bit(cpustate))
-UINT8 C_bit(dsp56k_core* cpustate);
+UINT8 C_bit(const dsp56k_core* cpustate);
/* MR setters */
void LF_bit_set(dsp56k_core* cpustate, UINT8 value);
@@ -101,13 +101,13 @@ void C_bit_set(dsp56k_core* cpustate, UINT8 value);
/* 1-28 OPERATING MODE REGISTER (OMR) BITS */
-//UINT8 CD_bit(dsp56k_core* cpustate);
-//UINT8 SD_bit(dsp56k_core* cpustate);
-//UINT8 R_bit(dsp56k_core* cpustate);
-//UINT8 SA_bit(dsp56k_core* cpustate);
-//UINT8 MC_bit(dsp56k_core* cpustate);
-UINT8 MB_bit(dsp56k_core* cpustate);
-UINT8 MA_bit(dsp56k_core* cpustate);
+//UINT8 CD_bit(const dsp56k_core* cpustate);
+//UINT8 SD_bit(const dsp56k_core* cpustate);
+//UINT8 R_bit(const dsp56k_core* cpustate);
+//UINT8 SA_bit(const dsp56k_core* cpustate);
+//UINT8 MC_bit(const dsp56k_core* cpustate);
+UINT8 MB_bit(const dsp56k_core* cpustate);
+UINT8 MA_bit(const dsp56k_core* cpustate);
void CD_bit_set(dsp56k_core* cpustate, UINT8 value);
void SD_bit_set(dsp56k_core* cpustate, UINT8 value);
@@ -118,8 +118,8 @@ void MB_bit_set(dsp56k_core* cpustate, UINT8 value);
void MA_bit_set(dsp56k_core* cpustate, UINT8 value);
/* 1-27 STACK POINTER (SP) BITS */
-UINT8 UF_bit(dsp56k_core* cpustate);
-UINT8 SE_bit(dsp56k_core* cpustate);
+UINT8 UF_bit(const dsp56k_core* cpustate);
+UINT8 SE_bit(const dsp56k_core* cpustate);
//void UF_bit_set(dsp56k_core* cpustate, UINT8 value) {};
//void SE_bit_set(dsp56k_core* cpustate, UINT8 value) {};
diff --git a/src/devices/cpu/e0c6200/e0c6200.cpp b/src/devices/cpu/e0c6200/e0c6200.cpp
index e0b6a2eb8d2..0b87b9eaa7d 100644
--- a/src/devices/cpu/e0c6200/e0c6200.cpp
+++ b/src/devices/cpu/e0c6200/e0c6200.cpp
@@ -25,7 +25,7 @@
// disasm
-void e0c6200_cpu_device::state_string_export(const device_state_entry &entry, std::string &str)
+void e0c6200_cpu_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/e0c6200/e0c6200.h b/src/devices/cpu/e0c6200/e0c6200.h
index c55aae83505..7e47f817380 100644
--- a/src/devices/cpu/e0c6200/e0c6200.h
+++ b/src/devices/cpu/e0c6200/e0c6200.h
@@ -44,7 +44,7 @@ protected:
virtual UINT32 disasm_min_opcode_bytes() const override { return 2; }
virtual UINT32 disasm_max_opcode_bytes() const override { return 2; }
virtual offs_t disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options) override;
- virtual void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
address_space_config m_program_config;
address_space_config m_data_config;
diff --git a/src/devices/cpu/e0c6200/e0c6200d.cpp b/src/devices/cpu/e0c6200/e0c6200d.cpp
index 4fc0599ac24..4935b257470 100644
--- a/src/devices/cpu/e0c6200/e0c6200d.cpp
+++ b/src/devices/cpu/e0c6200/e0c6200d.cpp
@@ -114,7 +114,7 @@ CPU_DISASSEMBLE(e0c6200)
{
UINT16 op = (oprom[1] | oprom[0] << 8) & 0xfff;
- int m = -1;
+ int m;
int p1 = -1;
int p2 = -1;
diff --git a/src/devices/cpu/e132xs/32xsdasm.cpp b/src/devices/cpu/e132xs/32xsdasm.cpp
index d165f2fdc42..48f3e97968f 100644
--- a/src/devices/cpu/e132xs/32xsdasm.cpp
+++ b/src/devices/cpu/e132xs/32xsdasm.cpp
@@ -394,7 +394,7 @@ static UINT32 RRdis_format(char *source, char *dest, UINT16 op, UINT16 next_op,
unsigned dasm_hyperstone(char *buffer, unsigned pc, const UINT8 *oprom, unsigned h_flag, int private_fp)
{
- UINT16 op = 0;
+ UINT16 op;
UINT8 op_num;
UINT8 source_code, dest_code, source_bit, dest_bit;
diff --git a/src/devices/cpu/e132xs/e132xs.cpp b/src/devices/cpu/e132xs/e132xs.cpp
index 95622ee095a..afa0da8d962 100644
--- a/src/devices/cpu/e132xs/e132xs.cpp
+++ b/src/devices/cpu/e132xs/e132xs.cpp
@@ -1848,7 +1848,7 @@ const address_space_config *hyperstone_device::memory_space_config(address_space
// for the debugger
//-------------------------------------------------
-void hyperstone_device::state_string_export(const device_state_entry &entry, std::string &str)
+void hyperstone_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/e132xs/e132xs.h b/src/devices/cpu/e132xs/e132xs.h
index ccfd74f1e5e..28149e1a742 100644
--- a/src/devices/cpu/e132xs/e132xs.h
+++ b/src/devices/cpu/e132xs/e132xs.h
@@ -225,8 +225,6 @@ protected:
virtual void device_reset() override;
virtual void device_stop() override;
- void make_ops();
-
// device_execute_interface overrides
virtual UINT32 execute_min_cycles() const override;
virtual UINT32 execute_max_cycles() const override;
@@ -243,7 +241,7 @@ protected:
virtual offs_t disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options) override;
// device_state_interface overrides
- virtual void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// address spaces
const address_space_config m_program_config;
@@ -494,8 +492,6 @@ private:
void ope8(); void ope9(); void opea(); void opeb(); void opec(); void oped(); void opee(); void opef();
void opf0(); void opf1(); void opf2(); void opf3(); void opf4(); void opf5(); void opf6(); void opf7();
void opf8(); void opf9(); void opfa(); void opfb(); void opfc(); void opfd(); void opfe(); void opff();
-
- void set_irq_line(int irqline, int state);
};
// device type definition
diff --git a/src/devices/cpu/esrip/esrip.cpp b/src/devices/cpu/esrip/esrip.cpp
index 4a1b27b62de..a788c2a3ab3 100644
--- a/src/devices/cpu/esrip/esrip.cpp
+++ b/src/devices/cpu/esrip/esrip.cpp
@@ -350,7 +350,7 @@ const address_space_config *esrip_device::memory_space_config(address_spacenum s
// for the debugger
//-------------------------------------------------
-void esrip_device::state_string_export(const device_state_entry &entry, std::string &str)
+void esrip_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
@@ -408,13 +408,13 @@ offs_t esrip_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 *op
PRIVATE FUNCTIONS
***************************************************************************/
-int esrip_device::get_hblank()
+int esrip_device::get_hblank() const
{
return machine().first_screen()->hblank();
}
/* Return the state of the LBRM line (Y-scaling related) */
-int esrip_device::get_lbrm()
+int esrip_device::get_lbrm() const
{
int addr = ((m_y_scale & 0x3f) << 3) | ((m_line_latch >> 3) & 7);
int sel = (m_line_latch & 7);
@@ -424,7 +424,7 @@ int esrip_device::get_lbrm()
return (val >> sel) & 1;
}
-int esrip_device::check_jmp(UINT8 jmp_ctrl)
+int esrip_device::check_jmp(UINT8 jmp_ctrl) const
{
int ret = 0;
diff --git a/src/devices/cpu/esrip/esrip.h b/src/devices/cpu/esrip/esrip.h
index 468139701f6..852ce65533e 100644
--- a/src/devices/cpu/esrip/esrip.h
+++ b/src/devices/cpu/esrip/esrip.h
@@ -152,7 +152,7 @@ protected:
virtual offs_t disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options) override;
// device_state_interface overrides
- virtual void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// address spaces
const address_space_config m_program_config;
@@ -223,9 +223,9 @@ protected:
static const ophandler s_opcodetable[24];
private:
- int get_hblank();
- int get_lbrm();
- int check_jmp(UINT8 jmp_ctrl);
+ int get_hblank() const;
+ int get_lbrm() const;
+ int check_jmp(UINT8 jmp_ctrl) const;
// flags
void calc_z_flag(UINT16 res);
diff --git a/src/devices/cpu/f8/f8.cpp b/src/devices/cpu/f8/f8.cpp
index 182638543d7..2bc875e12ee 100644
--- a/src/devices/cpu/f8/f8.cpp
+++ b/src/devices/cpu/f8/f8.cpp
@@ -2045,7 +2045,7 @@ void f8_cpu_device::device_start()
}
-void f8_cpu_device::state_string_export(const device_state_entry &entry, std::string &str)
+void f8_cpu_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/f8/f8.h b/src/devices/cpu/f8/f8.h
index 277383c4fec..8afddae22bd 100644
--- a/src/devices/cpu/f8/f8.h
+++ b/src/devices/cpu/f8/f8.h
@@ -51,7 +51,7 @@ protected:
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override { return (spacenum == AS_PROGRAM) ? &m_program_config : ( (spacenum == AS_IO) ? &m_io_config : nullptr ); }
// device_state_interface overrides
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 1; }
diff --git a/src/devices/cpu/g65816/g65816.cpp b/src/devices/cpu/g65816/g65816.cpp
index 8373ddbeecf..47b0e035798 100644
--- a/src/devices/cpu/g65816/g65816.cpp
+++ b/src/devices/cpu/g65816/g65816.cpp
@@ -952,7 +952,7 @@ void g65816_device::state_export(const device_state_entry &entry)
}
}
-void g65816_device::state_string_export(const device_state_entry &entry, std::string &str)
+void g65816_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/g65816/g65816.h b/src/devices/cpu/g65816/g65816.h
index 54294ad4f74..c04b9adf71c 100644
--- a/src/devices/cpu/g65816/g65816.h
+++ b/src/devices/cpu/g65816/g65816.h
@@ -82,7 +82,7 @@ protected:
// device_state_interface overrides
virtual void state_import(const device_state_entry &entry) override;
virtual void state_export(const device_state_entry &entry) override;
- virtual void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 1; }
diff --git a/src/devices/cpu/h6280/h6280.cpp b/src/devices/cpu/h6280/h6280.cpp
index d1be228e732..ec0b62b5076 100644
--- a/src/devices/cpu/h6280/h6280.cpp
+++ b/src/devices/cpu/h6280/h6280.cpp
@@ -2191,7 +2191,7 @@ OP(op,ff) { h6280_cycles(4); bbs(7, rd_zpg()); } // 6/8 BBS7 ZPG,REL
// for the debugger
//-------------------------------------------------
-void h6280_device::state_string_export(const device_state_entry &entry, std::string &str)
+void h6280_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/h6280/h6280.h b/src/devices/cpu/h6280/h6280.h
index a344f6392be..ecf93dee843 100644
--- a/src/devices/cpu/h6280/h6280.h
+++ b/src/devices/cpu/h6280/h6280.h
@@ -98,7 +98,7 @@ protected:
virtual offs_t disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options) override;
// device_state_interface overrides
- virtual void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// opcode accessors
UINT8 program_read8(offs_t addr);
diff --git a/src/devices/cpu/h8/h8.cpp b/src/devices/cpu/h8/h8.cpp
index 2692dc4372c..bc78626b00b 100644
--- a/src/devices/cpu/h8/h8.cpp
+++ b/src/devices/cpu/h8/h8.cpp
@@ -216,7 +216,7 @@ void h8_device::state_export(const device_state_entry &entry)
{
}
-void h8_device::state_string_export(const device_state_entry &entry, std::string &str)
+void h8_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch(entry.index()) {
case STATE_GENFLAGS:
diff --git a/src/devices/cpu/h8/h8.h b/src/devices/cpu/h8/h8.h
index d55d8ea7784..8ed2bee2796 100644
--- a/src/devices/cpu/h8/h8.h
+++ b/src/devices/cpu/h8/h8.h
@@ -157,7 +157,7 @@ protected:
// device_state_interface overrides
virtual void state_import(const device_state_entry &entry) override;
virtual void state_export(const device_state_entry &entry) override;
- virtual void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override;
diff --git a/src/devices/cpu/h8/h83008.h b/src/devices/cpu/h8/h83008.h
index f8132f4bc37..8a19568f43f 100644
--- a/src/devices/cpu/h8/h83008.h
+++ b/src/devices/cpu/h8/h83008.h
@@ -24,7 +24,6 @@
class h83008_device : public h8h_device {
public:
- h83008_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source);
h83008_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
DECLARE_READ8_MEMBER(syscr_r);
diff --git a/src/devices/cpu/h8/h8_intc.h b/src/devices/cpu/h8/h8_intc.h
index 80275d40017..b6a6da31af7 100644
--- a/src/devices/cpu/h8/h8_intc.h
+++ b/src/devices/cpu/h8/h8_intc.h
@@ -102,9 +102,6 @@ public:
DECLARE_WRITE8_MEMBER(ipr_w);
DECLARE_READ8_MEMBER(iprk_r);
DECLARE_WRITE8_MEMBER(iprk_w);
-
- void set_mode_8(bool mode_8);
-
private:
static const int vector_to_slot[];
UINT8 ipr[11];
diff --git a/src/devices/cpu/h8/h8_timer16.h b/src/devices/cpu/h8/h8_timer16.h
index c7bedbbcfe8..f8f6c1efda2 100644
--- a/src/devices/cpu/h8/h8_timer16.h
+++ b/src/devices/cpu/h8/h8_timer16.h
@@ -88,8 +88,6 @@ public:
DECLARE_WRITE8_MEMBER(tier_w);
DECLARE_READ8_MEMBER(tsr_r);
DECLARE_WRITE8_MEMBER(tsr_w);
- DECLARE_READ8_MEMBER(tocr_r);
- DECLARE_WRITE8_MEMBER(tocr_w);
DECLARE_READ16_MEMBER(tcnt_r);
DECLARE_WRITE16_MEMBER(tcnt_w);
DECLARE_READ16_MEMBER(tgr_r);
diff --git a/src/devices/cpu/hcd62121/hcd62121.cpp b/src/devices/cpu/hcd62121/hcd62121.cpp
index 692297048c0..e6104627990 100644
--- a/src/devices/cpu/hcd62121/hcd62121.cpp
+++ b/src/devices/cpu/hcd62121/hcd62121.cpp
@@ -363,7 +363,7 @@ void hcd62121_cpu_device::device_start()
}
-void hcd62121_cpu_device::state_string_export(const device_state_entry &entry, std::string &str)
+void hcd62121_cpu_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/hcd62121/hcd62121.h b/src/devices/cpu/hcd62121/hcd62121.h
index dc1c7477409..2339f2229c3 100644
--- a/src/devices/cpu/hcd62121/hcd62121.h
+++ b/src/devices/cpu/hcd62121/hcd62121.h
@@ -54,7 +54,7 @@ protected:
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override { return (spacenum == AS_PROGRAM) ? &m_program_config : ( (spacenum == AS_IO) ? &m_io_config : nullptr ); }
// device_state_interface overrides
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 1; }
diff --git a/src/devices/cpu/hcd62121/hcd62121d.cpp b/src/devices/cpu/hcd62121/hcd62121d.cpp
index 2283c0682af..0c6bc082b11 100644
--- a/src/devices/cpu/hcd62121/hcd62121d.cpp
+++ b/src/devices/cpu/hcd62121/hcd62121d.cpp
@@ -131,7 +131,9 @@ static const hcd62121_dasm hcd62121_ops[256] =
CPU_DISASSEMBLE( hcd62121 )
{
- UINT8 op, op1=0, op2=0;
+ UINT8 op;
+ UINT8 op1;
+ UINT8 op2;
int pos = 0;
const hcd62121_dasm *inst;
diff --git a/src/devices/cpu/hd61700/hd61700.cpp b/src/devices/cpu/hd61700/hd61700.cpp
index 777a23de894..c786c7235ba 100644
--- a/src/devices/cpu/hd61700/hd61700.cpp
+++ b/src/devices/cpu/hd61700/hd61700.cpp
@@ -183,8 +183,7 @@ void hd61700_cpu_device::device_start()
for (int ireg=0; ireg<32; ireg++)
{
- std::string tmpstr;
- state_add(HD61700_MAINREG + ireg, strformat(tmpstr, "R%d", ireg).c_str(), m_regmain[ireg]).callimport().callexport().formatstr("%02X");
+ state_add(HD61700_MAINREG + ireg, strformat("R%d", ireg).c_str(), m_regmain[ireg]).callimport().callexport().formatstr("%02X");
}
state_add(STATE_GENPC, "curpc", m_curpc).callimport().callexport().formatstr("%8s").noshow();
@@ -271,7 +270,7 @@ void hd61700_cpu_device::state_import(const device_state_entry &entry)
// for the debugger
//-------------------------------------------------
-void hd61700_cpu_device::state_string_export(const device_state_entry &entry, std::string &str)
+void hd61700_cpu_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
@@ -661,7 +660,7 @@ void hd61700_cpu_device::execute_run()
case 0x1c: //gpo/gfl
{
UINT8 arg = read_op();
- UINT8 src = 0xff;
+ UINT8 src;
if (arg&0x40)
{
@@ -2255,7 +2254,7 @@ void hd61700_cpu_device::execute_run()
{
UINT8 arg = read_op();
UINT8 arg1 = read_op();
- UINT8 r1 = 0, r2 = 0, f = 0;
+ UINT8 r1 = 0, r2, f = 0;
r2 = (arg&0x40) ? 0 : 1;
@@ -2745,7 +2744,7 @@ inline void hd61700_cpu_device::set_pc(INT32 new_pc)
inline UINT8 hd61700_cpu_device::read_op()
{
- UINT16 data = 0;
+ UINT16 data;
UINT32 addr18 = make_18bit_addr((m_irq_status) ? 0 : prev_ua, m_pc);
if (m_pc <= INT_ROM)
diff --git a/src/devices/cpu/hd61700/hd61700.h b/src/devices/cpu/hd61700/hd61700.h
index 6f99aeca899..838ea8833bb 100644
--- a/src/devices/cpu/hd61700/hd61700.h
+++ b/src/devices/cpu/hd61700/hd61700.h
@@ -92,7 +92,7 @@ protected:
// device_state_interface overrides
virtual void state_import(const device_state_entry &entry) override;
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_memory_interface overrides
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override { return (spacenum == AS_PROGRAM) ? &m_program_config : nullptr; }
diff --git a/src/devices/cpu/hd61700/hd61700d.cpp b/src/devices/cpu/hd61700/hd61700d.cpp
index 719fade4f49..b5461ec58e8 100644
--- a/src/devices/cpu/hd61700/hd61700d.cpp
+++ b/src/devices/cpu/hd61700/hd61700d.cpp
@@ -399,7 +399,7 @@ UINT32 get_dasmflags(UINT8 op)
CPU_DISASSEMBLE( hd61700 )
{
const hd61700_dasm *inst;
- UINT32 dasmflags = 0;
+ UINT32 dasmflags;
UINT8 op, op1;
int pos = 0, type = EXT_ROM;
diff --git a/src/devices/cpu/hmcs40/hmcs40.cpp b/src/devices/cpu/hmcs40/hmcs40.cpp
index c9b7220cf2a..58cd711f8da 100644
--- a/src/devices/cpu/hmcs40/hmcs40.cpp
+++ b/src/devices/cpu/hmcs40/hmcs40.cpp
@@ -133,7 +133,7 @@ hd44828_device::hd44828_device(const machine_config &mconfig, const char *tag, d
// disasm
-void hmcs40_cpu_device::state_string_export(const device_state_entry &entry, std::string &str)
+void hmcs40_cpu_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/hmcs40/hmcs40.h b/src/devices/cpu/hmcs40/hmcs40.h
index a06d3848cbc..d9e30a92f72 100644
--- a/src/devices/cpu/hmcs40/hmcs40.h
+++ b/src/devices/cpu/hmcs40/hmcs40.h
@@ -175,7 +175,7 @@ protected:
virtual UINT32 disasm_min_opcode_bytes() const override { return 2; }
virtual UINT32 disasm_max_opcode_bytes() const override { return 2; }
virtual offs_t disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options) override;
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
address_space_config m_program_config;
address_space_config m_data_config;
diff --git a/src/devices/cpu/hphybrid/hphybrid.cpp b/src/devices/cpu/hphybrid/hphybrid.cpp
index 027a37e03ed..052c7058604 100644
--- a/src/devices/cpu/hphybrid/hphybrid.cpp
+++ b/src/devices/cpu/hphybrid/hphybrid.cpp
@@ -17,7 +17,22 @@ enum {
HPHYBRID_DMAPA,
HPHYBRID_DMAMA,
HPHYBRID_DMAC,
- HPHYBRID_I
+ HPHYBRID_I,
+ HPHYBRID_W,
+ HPHYBRID_AR2,
+ HPHYBRID_AR2_2,
+ HPHYBRID_AR2_3,
+ HPHYBRID_AR2_4,
+ HPHYBRID_SE,
+ HPHYBRID_R25,
+ HPHYBRID_R26,
+ HPHYBRID_R27,
+ HPHYBRID_R32,
+ HPHYBRID_R33,
+ HPHYBRID_R34,
+ HPHYBRID_R35,
+ HPHYBRID_R36,
+ HPHYBRID_R37
};
#define BIT_MASK(n) (1U << (n))
@@ -40,13 +55,22 @@ enum {
#define HPHYBRID_IRH_SVC_BIT 10 // IRH in service
#define HPHYBRID_IRL_SVC_BIT 11 // IRL in service
#define HPHYBRID_DMAR_BIT 12 // DMA request
+#define HPHYBRID_STS_BIT 13 // Status flag
+#define HPHYBRID_FLG_BIT 14 // "Flag" flag
+#define HPHYBRID_DC_BIT 15 // Decimal carry
#define HPHYBRID_IV_MASK 0xfff0 // IV mask
+#define HP_REG_SE_MASK 0x000f
+
#define CURRENT_PA (m_reg_PA[ 0 ])
#define HP_RESET_ADDR 0x0020
+// Part of r32-r37 that is actually output as address extension (6 bits of "BSC": block select code)
+#define BSC_REG_MASK 0x3f
+
+const device_type HP_5061_3001 = &device_creator<hp_5061_3001_cpu_device>;
const device_type HP_5061_3011 = &device_creator<hp_5061_3011_cpu_device>;
WRITE_LINE_MEMBER(hp_hybrid_cpu_device::dmar_w)
@@ -58,10 +82,38 @@ WRITE_LINE_MEMBER(hp_hybrid_cpu_device::dmar_w)
}
}
-hp_hybrid_cpu_device::hp_hybrid_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname)
-: cpu_device(mconfig, type, name, tag, owner, clock, shortname, __FILE__),
- m_program_config("program", ENDIANNESS_BIG, 16, 16, -1),
- m_io_config("io", ENDIANNESS_BIG, 16, 6, -1)
+WRITE_LINE_MEMBER(hp_hybrid_cpu_device::halt_w)
+{
+ if (state) {
+ BIT_SET(m_flags , HPHYBRID_HALT_BIT);
+ } else {
+ BIT_CLR(m_flags , HPHYBRID_HALT_BIT);
+ }
+}
+
+WRITE_LINE_MEMBER(hp_hybrid_cpu_device::status_w)
+{
+ if (state) {
+ BIT_SET(m_flags , HPHYBRID_STS_BIT);
+ } else {
+ BIT_CLR(m_flags , HPHYBRID_STS_BIT);
+ }
+}
+
+WRITE_LINE_MEMBER(hp_hybrid_cpu_device::flag_w)
+{
+ if (state) {
+ BIT_SET(m_flags , HPHYBRID_FLG_BIT);
+ } else {
+ BIT_CLR(m_flags , HPHYBRID_FLG_BIT);
+ }
+}
+
+hp_hybrid_cpu_device::hp_hybrid_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname , UINT8 addrwidth)
+ : cpu_device(mconfig, type, name, tag, owner, clock, shortname, __FILE__),
+ m_pa_changed_func(*this),
+ m_program_config("program", ENDIANNESS_BIG, 16, addrwidth, -1),
+ m_io_config("io", ENDIANNESS_BIG, 16, 6, -1)
{
}
@@ -77,11 +129,13 @@ void hp_hybrid_cpu_device::device_start()
m_reg_PA[ 0 ] = 0;
m_reg_PA[ 1 ] = 0;
m_reg_PA[ 2 ] = 0;
+ m_reg_W = 0;
m_flags = 0;
m_dmapa = 0;
m_dmama = 0;
m_dmac = 0;
m_reg_I = 0;
+ m_forced_bsc_25 = false;
{
state_add(HPHYBRID_A, "A", m_reg_A);
@@ -89,11 +143,12 @@ void hp_hybrid_cpu_device::device_start()
state_add(HPHYBRID_C, "C", m_reg_C);
state_add(HPHYBRID_D, "D", m_reg_D);
state_add(HPHYBRID_P, "P", m_reg_P);
- state_add(STATE_GENPC, "GENPC", m_reg_P).noshow();
+ state_add(STATE_GENPC, "GENPC", m_genpc).noshow();
state_add(HPHYBRID_R, "R", m_reg_R);
state_add(STATE_GENSP, "GENSP", m_reg_R).noshow();
state_add(HPHYBRID_IV, "IV", m_reg_IV);
state_add(HPHYBRID_PA, "PA", m_reg_PA[ 0 ]);
+ state_add(HPHYBRID_W, "W", m_reg_W).noshow();
state_add(STATE_GENFLAGS, "GENFLAGS", m_flags).noshow().formatstr("%9s");
state_add(HPHYBRID_DMAPA , "DMAPA" , m_dmapa).noshow();
state_add(HPHYBRID_DMAMA , "DMAMA" , m_dmama).noshow();
@@ -115,19 +170,23 @@ void hp_hybrid_cpu_device::device_start()
save_item(NAME(m_reg_PA[0]));
save_item(NAME(m_reg_PA[1]));
save_item(NAME(m_reg_PA[2]));
+ save_item(NAME(m_reg_W));
save_item(NAME(m_flags));
save_item(NAME(m_dmapa));
save_item(NAME(m_dmama));
save_item(NAME(m_dmac));
save_item(NAME(m_reg_I));
+ save_item(NAME(m_forced_bsc_25));
m_icountptr = &m_icount;
+
+ m_pa_changed_func.resolve_safe();
}
void hp_hybrid_cpu_device::device_reset()
{
m_reg_P = HP_RESET_ADDR;
- m_reg_I = RM(m_reg_P);
+ m_reg_I = fetch();
m_flags = 0;
}
@@ -137,7 +196,7 @@ void hp_hybrid_cpu_device::execute_run()
if (BIT(m_flags , HPHYBRID_DMAEN_BIT) && BIT(m_flags , HPHYBRID_DMAR_BIT)) {
handle_dma();
} else {
- debugger_instruction_hook(this, m_reg_P);
+ debugger_instruction_hook(this, m_genpc);
// Check for interrupts
check_for_interrupts();
@@ -173,7 +232,7 @@ UINT16 hp_hybrid_cpu_device::execute_one(UINT16 opcode)
return RM(opcode & 0x1f);
} else {
m_reg_P = execute_one_sub(opcode);
- return RM(m_reg_P);
+ return fetch();
}
}
@@ -186,7 +245,7 @@ UINT16 hp_hybrid_cpu_device::execute_one(UINT16 opcode)
*/
UINT16 hp_hybrid_cpu_device::execute_one_sub(UINT16 opcode)
{
- UINT16 ea;
+ UINT32 ea;
UINT16 tmp;
switch (opcode & 0x7800) {
@@ -247,8 +306,8 @@ UINT16 hp_hybrid_cpu_device::execute_one_sub(UINT16 opcode)
case 0x4000:
// JSM
m_icount -= 17;
- WM(++m_reg_R , m_reg_P);
- return get_ea(opcode);
+ WM(AEC_CASE_C , ++m_reg_R , m_reg_P);
+ return remove_mae(get_ea(opcode));
case 0x4800:
// ISZ
@@ -289,7 +348,7 @@ UINT16 hp_hybrid_cpu_device::execute_one_sub(UINT16 opcode)
case 0x6800:
// JMP
m_icount -= 8;
- return get_ea(opcode);
+ return remove_mae(get_ea(opcode));
default:
switch (opcode & 0xfec0) {
@@ -309,8 +368,7 @@ UINT16 hp_hybrid_cpu_device::execute_one_sub(UINT16 opcode)
// SFS
// SFC
m_icount -= 14;
- // TODO: read flag bit
- return get_skip_addr(opcode , true);
+ return get_skip_addr(opcode , !BIT(m_flags , HPHYBRID_FLG_BIT));
case 0x7C00:
// RZB
@@ -328,8 +386,7 @@ UINT16 hp_hybrid_cpu_device::execute_one_sub(UINT16 opcode)
// SSS
// SSC
m_icount -= 14;
- // TODO: read status bit
- return get_skip_addr(opcode , true);
+ return get_skip_addr(opcode , !BIT(m_flags , HPHYBRID_STS_BIT));
case 0x7cc0:
// SHS
@@ -449,12 +506,14 @@ UINT16 hp_hybrid_cpu_device::execute_one_sub(UINT16 opcode)
if (BIT(m_flags , HPHYBRID_IRH_SVC_BIT)) {
BIT_CLR(m_flags , HPHYBRID_IRH_SVC_BIT);
memmove(&m_reg_PA[ 0 ] , &m_reg_PA[ 1 ] , HPHYBRID_INT_LVLS);
+ m_pa_changed_func((UINT8)CURRENT_PA);
} else if (BIT(m_flags , HPHYBRID_IRL_SVC_BIT)) {
BIT_CLR(m_flags , HPHYBRID_IRL_SVC_BIT);
memmove(&m_reg_PA[ 0 ] , &m_reg_PA[ 1 ] , HPHYBRID_INT_LVLS);
+ m_pa_changed_func((UINT8)CURRENT_PA);
}
}
- tmp = RM(m_reg_R--) + (opcode & 0x1f);
+ tmp = RM(AEC_CASE_C , m_reg_R--) + (opcode & 0x1f);
return BIT(opcode , 5) ? tmp - 0x20 : tmp;
} else {
switch (opcode) {
@@ -545,28 +604,27 @@ UINT16 hp_hybrid_cpu_device::execute_one_sub(UINT16 opcode)
break;
default:
- // Unrecognized instructions: NOP
- // Execution time is fictional
- m_icount -= 6;
+ // Unrecognized instruction: pass it on for further processing (by EMC if present)
+ return execute_no_bpc_ioc(opcode);
+ }
+ }
+ }
}
- }
}
- }
}
- }
return m_reg_P + 1;
}
-void hp_hybrid_cpu_device::state_string_export(const device_state_entry &entry, std::string &str)
+void hp_hybrid_cpu_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
- if (entry.index() == STATE_GENFLAGS) {
- strprintf(str, "%s %s %c %c",
- BIT(m_flags , HPHYBRID_DB_BIT) ? "Db":"..",
- BIT(m_flags , HPHYBRID_CB_BIT) ? "Cb":"..",
- BIT(m_flags , HPHYBRID_O_BIT) ? 'O':'.',
- BIT(m_flags , HPHYBRID_C_BIT) ? 'E':'.');
- }
+ if (entry.index() == STATE_GENFLAGS) {
+ strprintf(str, "%s %s %c %c",
+ BIT(m_flags , HPHYBRID_DB_BIT) ? "Db":"..",
+ BIT(m_flags , HPHYBRID_CB_BIT) ? "Cb":"..",
+ BIT(m_flags , HPHYBRID_O_BIT) ? 'O':'.',
+ BIT(m_flags , HPHYBRID_C_BIT) ? 'E':'.');
+ }
}
offs_t hp_hybrid_cpu_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options)
@@ -575,34 +633,206 @@ offs_t hp_hybrid_cpu_device::disasm_disassemble(char *buffer, offs_t pc, const U
return CPU_DISASSEMBLE_NAME(hp_hybrid)(this, buffer, pc, oprom, opram, options);
}
-UINT16 hp_hybrid_cpu_device::get_ea(UINT16 opcode)
+UINT16 hp_hybrid_cpu_device::remove_mae(UINT32 addr)
{
- UINT16 base;
- UINT16 off;
+ return (UINT16)(addr & 0xffff);
+}
- if (BIT(opcode , 10)) {
- // Current page
- base = m_reg_P;
- } else {
- // Base page
- base = 0;
- }
+UINT16 hp_hybrid_cpu_device::RM(aec_cases_t aec_case , UINT16 addr)
+{
+ return RM(add_mae(aec_case , addr));
+}
+
+UINT16 hp_hybrid_cpu_device::RM(UINT32 addr)
+{
+ UINT16 tmp;
+ UINT16 addr_wo_bsc = remove_mae(addr);
+
+ if (addr_wo_bsc <= HP_REG_LAST_ADDR) {
+ // Any access to internal registers removes forcing of BSC 2x
+ m_forced_bsc_25 = false;
+
+ // Memory mapped registers that are present in both 3001 & 3011
+ switch (addr_wo_bsc) {
+ case HP_REG_A_ADDR:
+ return m_reg_A;
+
+ case HP_REG_B_ADDR:
+ return m_reg_B;
+
+ case HP_REG_P_ADDR:
+ return m_reg_P;
+
+ case HP_REG_R_ADDR:
+ return m_reg_R;
+
+ case HP_REG_R4_ADDR:
+ case HP_REG_R5_ADDR:
+ case HP_REG_R6_ADDR:
+ case HP_REG_R7_ADDR:
+ return RIO(CURRENT_PA , addr_wo_bsc - HP_REG_R4_ADDR);
+
+ case HP_REG_IV_ADDR:
+ // Correct?
+ if (!BIT(m_flags , HPHYBRID_IRH_SVC_BIT) && !BIT(m_flags , HPHYBRID_IRL_SVC_BIT)) {
+ return m_reg_IV;
+ } else {
+ return m_reg_IV | CURRENT_PA;
+ }
+
+ case HP_REG_PA_ADDR:
+ return CURRENT_PA;
+
+ case HP_REG_W_ADDR:
+ return m_reg_W;
+
+ case HP_REG_DMAPA_ADDR:
+ tmp = m_dmapa & HP_REG_PA_MASK;
+ if (BIT(m_flags , HPHYBRID_CB_BIT)) {
+ BIT_SET(tmp , 15);
+ }
+ if (BIT(m_flags , HPHYBRID_DB_BIT)) {
+ BIT_SET(tmp , 14);
+ }
+ return tmp;
+
+ case HP_REG_DMAMA_ADDR:
+ return m_dmama;
+
+ case HP_REG_DMAC_ADDR:
+ return m_dmac;
+
+ case HP_REG_C_ADDR:
+ return m_reg_C;
- off = opcode & 0x3ff;
- if (off & 0x200) {
- off -= 0x400;
+ case HP_REG_D_ADDR:
+ return m_reg_D;
+
+ default:
+ return read_non_common_reg(addr_wo_bsc);
}
+ } else {
+ return m_direct->read_word(addr << 1);
+ }
+}
- base += off;
+void hp_hybrid_cpu_device::WM(aec_cases_t aec_case , UINT16 addr , UINT16 v)
+{
+ WM(add_mae(aec_case , addr) , v);
+}
- if (BIT(opcode , 15)) {
- // Indirect addressing
- m_icount -= 6;
- return RM(base);
- } else {
- // Direct addressing
- return base;
+void hp_hybrid_cpu_device::WM(UINT32 addr , UINT16 v)
+{
+ UINT16 addr_wo_bsc = remove_mae(addr);
+
+ if (addr_wo_bsc <= HP_REG_LAST_ADDR) {
+ // Any access to internal registers removes forcing of BSC 2x
+ m_forced_bsc_25 = false;
+
+ // Memory mapped registers
+ switch (addr_wo_bsc) {
+ case HP_REG_A_ADDR:
+ m_reg_A = v;
+ break;
+
+ case HP_REG_B_ADDR:
+ m_reg_B = v;
+ break;
+
+ case HP_REG_P_ADDR:
+ m_reg_P = v;
+ break;
+
+ case HP_REG_R_ADDR:
+ m_reg_R = v;
+ break;
+
+ case HP_REG_R4_ADDR:
+ case HP_REG_R5_ADDR:
+ case HP_REG_R6_ADDR:
+ case HP_REG_R7_ADDR:
+ WIO(CURRENT_PA , addr_wo_bsc - HP_REG_R4_ADDR , v);
+ break;
+
+ case HP_REG_IV_ADDR:
+ m_reg_IV = v & HP_REG_IV_MASK;
+ break;
+
+ case HP_REG_PA_ADDR:
+ CURRENT_PA = v & HP_REG_PA_MASK;
+ m_pa_changed_func((UINT8)CURRENT_PA);
+ break;
+
+ case HP_REG_W_ADDR:
+ m_reg_W = v;
+ break;
+
+ case HP_REG_DMAPA_ADDR:
+ m_dmapa = v & HP_REG_PA_MASK;
+ break;
+
+ case HP_REG_DMAMA_ADDR:
+ m_dmama = v;
+ break;
+
+ case HP_REG_DMAC_ADDR:
+ m_dmac = v;
+ break;
+
+ case HP_REG_C_ADDR:
+ m_reg_C = v;
+ break;
+
+ case HP_REG_D_ADDR:
+ m_reg_D = v;
+ break;
+
+ default:
+ write_non_common_reg(addr_wo_bsc , v);
+ break;
}
+ } else {
+ m_program->write_word(addr << 1 , v);
+ }
+}
+
+UINT16 hp_hybrid_cpu_device::fetch(void)
+{
+ m_genpc = add_mae(AEC_CASE_A , m_reg_P);
+ return RM(m_genpc);
+}
+
+UINT32 hp_hybrid_cpu_device::get_ea(UINT16 opcode)
+{
+ UINT16 base;
+ UINT16 off;
+ aec_cases_t aec;
+
+ if (BIT(opcode , 10)) {
+ // Current page
+ base = m_reg_P;
+ aec = AEC_CASE_A;
+ } else {
+ // Base page
+ base = 0;
+ aec = AEC_CASE_B;
+ }
+
+ off = opcode & 0x3ff;
+ if (off & 0x200) {
+ off -= 0x400;
+ }
+
+ base += off;
+
+ if (BIT(opcode , 15)) {
+ // Indirect addressing
+ m_icount -= 6;
+ return add_mae(AEC_CASE_C , RM(aec , base));
+ } else {
+ // Direct addressing
+ return add_mae(aec , base);
+ }
}
void hp_hybrid_cpu_device::do_add(UINT16& addend1 , UINT16 addend2)
@@ -676,7 +906,7 @@ void hp_hybrid_cpu_device::do_pw(UINT16 opcode)
if (m_flags & b_mask) {
tmp_addr |= 0x10000;
}
- tmp = RM((UINT16)(tmp_addr >> 1));
+ tmp = RM(AEC_CASE_C , (UINT16)(tmp_addr >> 1));
if (BIT(tmp_addr , 0)) {
tmp &= 0xff;
} else {
@@ -684,7 +914,7 @@ void hp_hybrid_cpu_device::do_pw(UINT16 opcode)
}
} else {
// Word
- tmp = RM(*ptr_reg);
+ tmp = RM(AEC_CASE_C , *ptr_reg);
}
WM(reg_addr , tmp);
@@ -719,10 +949,25 @@ void hp_hybrid_cpu_device::do_pw(UINT16 opcode)
if (m_flags & b_mask) {
tmp_addr |= 0x10000;
}
- WMB(tmp_addr , (UINT8)tmp);
+ if (tmp_addr <= (HP_REG_LAST_ADDR * 2 + 1)) {
+ // Single bytes can be written to registers.
+ // The addressed register gets the written byte in the proper position
+ // and a 0 in the other byte because access to registers is always done in
+ // 16 bits units.
+ if (BIT(tmp_addr , 0)) {
+ tmp &= 0xff;
+ } else {
+ tmp <<= 8;
+ }
+ WM(tmp_addr >> 1 , tmp);
+ } else {
+ // Extend address, preserve LSB & form byte address
+ tmp_addr = (add_mae(AEC_CASE_C , tmp_addr >> 1) << 1) | (tmp_addr & 1);
+ m_program->write_byte(tmp_addr , (UINT8)tmp);
+ }
} else {
// Word
- WM(*ptr_reg , tmp);
+ WM(AEC_CASE_C , *ptr_reg , tmp);
}
}
}
@@ -768,14 +1013,16 @@ void hp_hybrid_cpu_device::check_for_interrupts(void)
CURRENT_PA = new_PA;
+ m_pa_changed_func((UINT8)CURRENT_PA);
+
// Is this correct? Patent @ pg 210 suggests that the whole interrupt recognition sequence
- // lasts for 32 cycles (6 are already accounted for in get_ea for one indirection)
- m_icount -= 26;
+ // lasts for 32 cycles
+ m_icount -= 32;
// Do a double-indirect JSM IV,I instruction
- WM(++m_reg_R , m_reg_P);
- m_reg_P = RM(get_ea(0xc008));
- m_reg_I = RM(m_reg_P);
+ WM(AEC_CASE_C , ++m_reg_R , m_reg_P);
+ m_reg_P = RM(AEC_CASE_I , RM(HP_REG_IV_ADDR));
+ m_reg_I = fetch();
}
void hp_hybrid_cpu_device::handle_dma(void)
@@ -786,13 +1033,13 @@ void hp_hybrid_cpu_device::handle_dma(void)
if (BIT(m_flags , HPHYBRID_DMADIR_BIT)) {
// "Outward" DMA: memory -> peripheral
- tmp = RM(m_dmama++);
+ tmp = RM(AEC_CASE_D , m_dmama++);
WIO(m_dmapa , tc ? 2 : 0 , tmp);
m_icount -= 10;
} else {
// "Inward" DMA: peripheral -> memory
tmp = RIO(m_dmapa , tc ? 2 : 0);
- WM(m_dmama++ , tmp);
+ WM(AEC_CASE_D , m_dmama++ , tmp);
m_icount -= 9;
}
@@ -804,158 +1051,563 @@ void hp_hybrid_cpu_device::handle_dma(void)
}
}
-UINT16 hp_hybrid_cpu_device::RM(UINT16 addr)
+UINT16 hp_hybrid_cpu_device::RIO(UINT8 pa , UINT8 ic)
{
- UINT16 tmp;
+ return m_io->read_word(HP_MAKE_IOADDR(pa, ic) << 1);
+}
- if (addr <= HP_REG_LAST_ADDR) {
- // Memory mapped registers
- switch (addr) {
- case HP_REG_A_ADDR:
- return m_reg_A;
+void hp_hybrid_cpu_device::WIO(UINT8 pa , UINT8 ic , UINT16 v)
+{
+ m_io->write_word(HP_MAKE_IOADDR(pa, ic) << 1 , v);
+}
- case HP_REG_B_ADDR:
- return m_reg_B;
+hp_5061_3001_cpu_device::hp_5061_3001_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : hp_hybrid_cpu_device(mconfig, HP_5061_3001, "HP-5061-3001", tag, owner, clock, "5061-3001", 22),
+ m_boot_mode(false)
+{
+}
- case HP_REG_P_ADDR:
- return m_reg_P;
+void hp_5061_3001_cpu_device::device_start()
+{
+ hp_hybrid_cpu_device::device_start();
+
+ state_add(HPHYBRID_AR2, "Ar2" , m_reg_ar2[ 0 ]);
+ state_add(HPHYBRID_AR2_2, "Ar2_2" , m_reg_ar2[ 1 ]);
+ state_add(HPHYBRID_AR2_3, "Ar2_3" , m_reg_ar2[ 2 ]);
+ state_add(HPHYBRID_AR2_4, "Ar2_4" , m_reg_ar2[ 3 ]);
+ state_add(HPHYBRID_SE, "SE" , m_reg_se);
+ state_add(HPHYBRID_R25, "R25" , m_reg_r25).noshow();
+ state_add(HPHYBRID_R26, "R26" , m_reg_r26).noshow();
+ state_add(HPHYBRID_R27, "R27" , m_reg_r27).noshow();
+ state_add(HPHYBRID_R32, "R32" , m_reg_aec[ 0 ]);
+ state_add(HPHYBRID_R33, "R33" , m_reg_aec[ 1 ]);
+ state_add(HPHYBRID_R34, "R34" , m_reg_aec[ 2 ]);
+ state_add(HPHYBRID_R35, "R35" , m_reg_aec[ 3 ]);
+ state_add(HPHYBRID_R36, "R36" , m_reg_aec[ 4 ]);
+ state_add(HPHYBRID_R37, "R37" , m_reg_aec[ 5 ]);
+
+ save_item(NAME(m_reg_ar2[ 0 ]));
+ save_item(NAME(m_reg_ar2[ 1 ]));
+ save_item(NAME(m_reg_ar2[ 2 ]));
+ save_item(NAME(m_reg_ar2[ 3 ]));
+ save_item(NAME(m_reg_se));
+ save_item(NAME(m_reg_r25));
+ save_item(NAME(m_reg_r26));
+ save_item(NAME(m_reg_r27));
+ save_item(NAME(m_reg_aec[ 0 ]));
+ save_item(NAME(m_reg_aec[ 1 ]));
+ save_item(NAME(m_reg_aec[ 2 ]));
+ save_item(NAME(m_reg_aec[ 3 ]));
+ save_item(NAME(m_reg_aec[ 4 ]));
+ save_item(NAME(m_reg_aec[ 5 ]));
+}
- case HP_REG_R_ADDR:
- return m_reg_R;
+void hp_5061_3001_cpu_device::device_reset()
+{
+ // Initial state of AEC registers:
+ // R32 0
+ // R33 5
+ // R34 0
+ // R35 0
+ // R36 0
+ // R37 0
+ m_reg_aec[ 0 ] = 0;
+ m_reg_aec[ 1 ] = 5;
+ m_reg_aec[ 2 ] = 0;
+ m_reg_aec[ 3 ] = 0;
+ m_reg_aec[ 4 ] = 0;
+ m_reg_aec[ 5 ] = 0;
+
+ m_forced_bsc_25 = m_boot_mode;
+
+ hp_hybrid_cpu_device::device_reset();
+}
- case HP_REG_R4_ADDR:
- case HP_REG_R5_ADDR:
- case HP_REG_R6_ADDR:
- case HP_REG_R7_ADDR:
- return RIO(CURRENT_PA , addr - HP_REG_R4_ADDR);
+UINT8 hp_5061_3001_cpu_device::do_dec_shift_r(UINT8 d1 , UINT64& mantissa)
+{
+ UINT8 d12 = (UINT8)(mantissa & 0xf);
- case HP_REG_IV_ADDR:
- // Correct?
- if (!BIT(m_flags , HPHYBRID_IRH_SVC_BIT) && !BIT(m_flags , HPHYBRID_IRL_SVC_BIT)) {
- return m_reg_IV;
- } else {
- return m_reg_IV | CURRENT_PA;
- }
+ mantissa = (mantissa >> 4) | ((UINT64)d1 << 44);
- case HP_REG_PA_ADDR:
- return CURRENT_PA;
+ return d12;
+}
- case HP_REG_DMAPA_ADDR:
- tmp = m_dmapa & HP_REG_PA_MASK;
- if (BIT(m_flags , HPHYBRID_CB_BIT)) {
- BIT_SET(tmp , 15);
- }
- if (BIT(m_flags , HPHYBRID_DB_BIT)) {
- BIT_SET(tmp , 14);
- }
- return tmp;
+UINT8 hp_5061_3001_cpu_device::do_dec_shift_l(UINT8 d12 , UINT64& mantissa)
+{
+ UINT8 d1 = (UINT8)((mantissa >> 44) & 0xf);
- case HP_REG_DMAMA_ADDR:
- return m_dmama;
+ mantissa = (mantissa << 4) | ((UINT64)d12);
+ mantissa &= 0xffffffffffffULL;
- case HP_REG_DMAC_ADDR:
- return m_dmac;
+ return d1;
+}
- case HP_REG_C_ADDR:
- return m_reg_C;
+UINT64 hp_5061_3001_cpu_device::get_ar1(void)
+{
+ UINT32 addr;
+ UINT64 tmp;
- case HP_REG_D_ADDR:
- return m_reg_D;
+ addr = add_mae(AEC_CASE_B , HP_REG_AR1_ADDR + 1);
+ tmp = (UINT64)RM(addr++);
+ tmp <<= 16;
+ tmp |= (UINT64)RM(addr++);
+ tmp <<= 16;
+ tmp |= (UINT64)RM(addr);
- default:
- // Unknown registers are returned as 0
- return 0;
- }
- } else {
- return m_direct->read_word((offs_t)addr << 1);
- }
+ return tmp;
}
-void hp_hybrid_cpu_device::WM(UINT16 addr , UINT16 v)
+void hp_5061_3001_cpu_device::set_ar1(UINT64 v)
{
- if (addr <= HP_REG_LAST_ADDR) {
- // Memory mapped registers
- switch (addr) {
- case HP_REG_A_ADDR:
- m_reg_A = v;
- break;
+ UINT32 addr;
+
+ addr = add_mae(AEC_CASE_B , HP_REG_AR1_ADDR + 3);
+ WM(addr-- , (UINT16)(v & 0xffff));
+ v >>= 16;
+ WM(addr-- , (UINT16)(v & 0xffff));
+ v >>= 16;
+ WM(addr , (UINT16)(v & 0xffff));
+}
- case HP_REG_B_ADDR:
- m_reg_B = v;
- break;
+UINT64 hp_5061_3001_cpu_device::get_ar2(void) const
+{
+ UINT64 tmp;
- case HP_REG_P_ADDR:
- m_reg_P = v;
- break;
+ tmp = (UINT64)m_reg_ar2[ 1 ];
+ tmp <<= 16;
+ tmp |= (UINT64)m_reg_ar2[ 2 ];
+ tmp <<= 16;
+ tmp |= (UINT64)m_reg_ar2[ 3 ];
- case HP_REG_R_ADDR:
- m_reg_R = v;
- break;
+ return tmp;
+}
- case HP_REG_R4_ADDR:
- case HP_REG_R5_ADDR:
- case HP_REG_R6_ADDR:
- case HP_REG_R7_ADDR:
- WIO(CURRENT_PA , addr - HP_REG_R4_ADDR , v);
- break;
+void hp_5061_3001_cpu_device::set_ar2(UINT64 v)
+{
+ m_reg_ar2[ 3 ] = (UINT16)(v & 0xffff);
+ v >>= 16;
+ m_reg_ar2[ 2 ] = (UINT16)(v & 0xffff);
+ v >>= 16;
+ m_reg_ar2[ 1 ] = (UINT16)(v & 0xffff);
+}
- case HP_REG_IV_ADDR:
- m_reg_IV = v & HP_REG_IV_MASK;
- break;
+UINT64 hp_5061_3001_cpu_device::do_mrxy(UINT64 ar)
+{
+ UINT8 n;
- case HP_REG_PA_ADDR:
- CURRENT_PA = v & HP_REG_PA_MASK;
- break;
+ n = m_reg_B & 0xf;
+ m_reg_A &= 0xf;
+ m_reg_se = m_reg_A;
+ while (n--) {
+ m_reg_se = do_dec_shift_r(m_reg_A , ar);
+ m_reg_A = 0;
+ m_icount -= 4;
+ }
+ m_reg_A = m_reg_se;
+ BIT_CLR(m_flags , HPHYBRID_DC_BIT);
- case HP_REG_DMAPA_ADDR:
- m_dmapa = v & HP_REG_PA_MASK;
- break;
+ return ar;
+}
- case HP_REG_DMAMA_ADDR:
- m_dmama = v;
- break;
+bool hp_5061_3001_cpu_device::do_dec_add(bool carry_in , UINT64& a , UINT64 b)
+{
+ UINT64 tmp = 0;
+ unsigned i;
+ UINT8 digit_a , digit_b;
- case HP_REG_DMAC_ADDR:
- m_dmac = v;
- break;
+ for (i = 0; i < 12; i++) {
+ digit_a = (UINT8)(a & 0xf);
+ digit_b = (UINT8)(b & 0xf);
- case HP_REG_C_ADDR:
- m_reg_C = v;
- break;
+ if (carry_in) {
+ digit_a++;
+ }
- case HP_REG_D_ADDR:
- m_reg_D = v;
- break;
+ digit_a += digit_b;
- default:
- // Unknown registers are silently discarded
- break;
+ carry_in = digit_a >= 10;
+
+ if (carry_in) {
+ digit_a = (digit_a - 10) & 0xf;
+ }
+
+ tmp |= (UINT64)digit_a << (4 * i);
+
+ a >>= 4;
+ b >>= 4;
+ }
+
+ a = tmp;
+
+ return carry_in;
+}
+
+void hp_5061_3001_cpu_device::do_mpy(void)
+{
+ INT32 a = (INT16)m_reg_A;
+ INT32 b = (INT16)m_reg_B;
+ INT32 p = a * b;
+
+ m_reg_A = (UINT16)(p & 0xffff);
+ m_reg_B = (UINT16)((p >> 16) & 0xffff);
+
+ // Not entirely correct, timing depends on initial content of A register
+ m_icount -= 65;
+}
+
+UINT16 hp_5061_3001_cpu_device::execute_no_bpc_ioc(UINT16 opcode)
+{
+ // EMC instructions
+ UINT8 n;
+ UINT16 tmp1;
+ UINT16 tmp2;
+ UINT64 tmp_ar;
+ UINT64 tmp_ar2;
+ bool carry;
+
+ switch (opcode & 0xfff0) {
+ case 0x7300:
+ // XFR
+ tmp1 = m_reg_A;
+ tmp2 = m_reg_B;
+ n = (opcode & 0xf) + 1;
+ m_icount -= 21;
+ while (n--) {
+ m_icount -= 12;
+ WM(AEC_CASE_C , tmp2 , RM(AEC_CASE_C , tmp1));
+ tmp1++;
+ tmp2++;
+ }
+ break;
+
+ case 0x7380:
+ // CLR
+ tmp1 = m_reg_A;
+ n = (opcode & 0xf) + 1;
+ m_icount -= 16;
+ while (n--) {
+ m_icount -= 6;
+ WM(AEC_CASE_C , tmp1 , 0);
+ tmp1++;
+ }
+ break;
+
+ default:
+ switch (opcode) {
+ case 0x7200:
+ // MWA
+ m_icount -= 28;
+ tmp_ar2 = get_ar2();
+ carry = do_dec_add(BIT(m_flags , HPHYBRID_DC_BIT) , tmp_ar2 , m_reg_B);
+ set_ar2(tmp_ar2);
+ if (carry) {
+ BIT_SET(m_flags, HPHYBRID_DC_BIT);
+ } else {
+ BIT_CLR(m_flags, HPHYBRID_DC_BIT);
+ }
+ break;
+
+ case 0x7220:
+ // CMY
+ m_icount -= 23;
+ tmp_ar2 = get_ar2();
+ tmp_ar2 = 0x999999999999ULL - tmp_ar2;
+ do_dec_add(true , tmp_ar2 , 0);
+ set_ar2(tmp_ar2);
+ BIT_CLR(m_flags , HPHYBRID_DC_BIT);
+ break;
+
+ case 0x7260:
+ // CMX
+ m_icount -= 59;
+ tmp_ar = get_ar1();
+ tmp_ar = 0x999999999999ULL - tmp_ar;
+ do_dec_add(true , tmp_ar , 0);
+ set_ar1(tmp_ar);
+ BIT_CLR(m_flags , HPHYBRID_DC_BIT);
+ break;
+
+ case 0x7280:
+ // FXA
+ m_icount -= 40;
+ tmp_ar2 = get_ar2();
+ carry = do_dec_add(BIT(m_flags , HPHYBRID_DC_BIT) , tmp_ar2 , get_ar1());
+ set_ar2(tmp_ar2);
+ if (carry) {
+ BIT_SET(m_flags, HPHYBRID_DC_BIT);
+ } else {
+ BIT_CLR(m_flags, HPHYBRID_DC_BIT);
+ }
+ break;
+
+ case 0x7340:
+ // NRM
+ tmp_ar2 = get_ar2();
+ m_icount -= 23;
+ for (n = 0; n < 12 && (tmp_ar2 & 0xf00000000000ULL) == 0; n++) {
+ do_dec_shift_l(0 , tmp_ar2);
+ m_icount--;
+ }
+ m_reg_B = n;
+ if (n < 12) {
+ BIT_CLR(m_flags , HPHYBRID_DC_BIT);
+ set_ar2(tmp_ar2);
+ } else {
+ BIT_SET(m_flags , HPHYBRID_DC_BIT);
+ // When ar2 is 0, total time is 69 cycles
+ // (salcazzo che cosa fa per altri 34 cicli)
+ m_icount -= 34;
+ }
+ break;
+
+ case 0x73c0:
+ // CDC
+ m_icount -= 11;
+ BIT_CLR(m_flags , HPHYBRID_DC_BIT);
+ break;
+
+ case 0x7a00:
+ // FMP
+ m_icount -= 42;
+ m_reg_A = 0;
+ tmp_ar = get_ar1();
+ tmp_ar2 = get_ar2();
+ for (n = m_reg_B & 0xf; n > 0; n--) {
+ m_icount -= 13;
+ if (do_dec_add(BIT(m_flags , HPHYBRID_DC_BIT) , tmp_ar2 , tmp_ar)) {
+ m_reg_A++;
}
- } else {
- m_program->write_word((offs_t)addr << 1 , v);
+ BIT_CLR(m_flags , HPHYBRID_DC_BIT);
+ }
+ set_ar2(tmp_ar2);
+ break;
+
+ case 0x7a21:
+ // FDV
+ // No doc mentions any limit on the iterations done by this instruction.
+ // Here we stop at 15 (after all there are only 4 bits in the loop counter). But is it correct?
+ m_icount -= 37;
+ m_reg_B = 0;
+ tmp_ar = get_ar1();
+ tmp_ar2 = get_ar2();
+ while (m_reg_B < 15 && !do_dec_add(BIT(m_flags , HPHYBRID_DC_BIT) , tmp_ar2 , tmp_ar)) {
+ m_icount -= 13;
+ BIT_CLR(m_flags , HPHYBRID_DC_BIT);
+ m_reg_B++;
+ }
+ set_ar2(tmp_ar2);
+ break;
+
+ case 0x7b00:
+ // MRX
+ set_ar1(do_mrxy(get_ar1()));
+ m_icount -= 62;
+ break;
+
+ case 0x7b21:
+ // DRS
+ tmp_ar = get_ar1();
+ m_icount -= 56;
+ m_reg_A = m_reg_se = do_dec_shift_r(0 , tmp_ar);
+ set_ar1(tmp_ar);
+ BIT_CLR(m_flags , HPHYBRID_DC_BIT);
+ break;
+
+ case 0x7b40:
+ // MRY
+ set_ar2(do_mrxy(get_ar2()));
+ m_icount -= 33;
+ break;
+
+ case 0x7b61:
+ // MLY
+ tmp_ar2 = get_ar2();
+ m_icount -= 32;
+ m_reg_A = m_reg_se = do_dec_shift_l(m_reg_A & 0xf , tmp_ar2);
+ set_ar2(tmp_ar2);
+ BIT_CLR(m_flags , HPHYBRID_DC_BIT);
+ break;
+
+ case 0x7b8f:
+ // MPY
+ do_mpy();
+ break;
+
+ default:
+ if ((opcode & 0xfec0) == 0x74c0) {
+ // SDS
+ // SDC
+ m_icount -= 14;
+ return get_skip_addr(opcode , !BIT(m_flags , HPHYBRID_DC_BIT));
+ } else {
+ // Unrecognized instructions: NOP
+ // Execution time is fictional
+ logerror("hp-5061-3001: unknown opcode %04x @ %06x\n" , opcode , m_genpc);
+ m_icount -= 6;
+ }
+ break;
}
+ }
+
+ return m_reg_P + 1;
}
-void hp_hybrid_cpu_device::WMB(UINT32 addr , UINT8 v)
+offs_t hp_5061_3001_cpu_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options)
{
- if (addr <= (HP_REG_LAST_ADDR * 2 + 1)) {
- // Cannot write bytes to registers
- } else {
- m_program->write_byte(addr , v);
+ extern CPU_DISASSEMBLE(hp_5061_3001);
+ return CPU_DISASSEMBLE_NAME(hp_5061_3001)(this, buffer, pc, oprom, opram, options);
+}
+
+UINT32 hp_5061_3001_cpu_device::add_mae(aec_cases_t aec_case , UINT16 addr)
+{
+ UINT16 bsc_reg;
+ bool top_half = BIT(addr , 15) != 0;
+
+ // Detect accesses to top half of base page
+ if (aec_case == AEC_CASE_C && (addr & 0xfe00) == 0xfe00) {
+ aec_case = AEC_CASE_B;
+ }
+
+ switch (aec_case) {
+ case AEC_CASE_A:
+ bsc_reg = top_half ? HP_REG_R34_ADDR : HP_REG_R33_ADDR;
+ break;
+
+ case AEC_CASE_B:
+ bsc_reg = top_half ? HP_REG_R36_ADDR : HP_REG_R33_ADDR;
+ break;
+
+ case AEC_CASE_C:
+ bsc_reg = top_half ? HP_REG_R32_ADDR : HP_REG_R35_ADDR;
+ break;
+
+ case AEC_CASE_D:
+ bsc_reg = HP_REG_R37_ADDR;
+ break;
+
+ case AEC_CASE_I:
+ // Behaviour of AEC during interrupt vector fetch is undocumented but it can be guessed from 9845B firmware.
+ // Basically in this case the integrated AEC seems to do what the discrete implementation in 9845A does:
+ // top half of memory is mapped to block 0 (fixed) and bottom half is mapped according to content of R35
+ // (see pg 334 of patent).
+ bsc_reg = top_half ? 0 : HP_REG_R35_ADDR;
+ break;
+
+ default:
+ logerror("hphybrid: aec_case=%d\n" , aec_case);
+ return 0;
}
+
+ UINT16 aec_reg = (bsc_reg != 0) ? (m_reg_aec[ bsc_reg - HP_REG_R32_ADDR ] & BSC_REG_MASK) : 0;
+
+ if (m_forced_bsc_25) {
+ aec_reg = (aec_reg & 0xf) | 0x20;
+ }
+
+ return (UINT32)addr | ((UINT32)aec_reg << 16);
}
-UINT16 hp_hybrid_cpu_device::RIO(UINT8 pa , UINT8 ic)
+UINT16 hp_5061_3001_cpu_device::read_non_common_reg(UINT16 addr)
{
- return m_io->read_word(HP_MAKE_IOADDR(pa, ic) << 1);
+ switch (addr) {
+ case HP_REG_AR2_ADDR:
+ case HP_REG_AR2_ADDR + 1:
+ case HP_REG_AR2_ADDR + 2:
+ case HP_REG_AR2_ADDR + 3:
+ return m_reg_ar2[ addr - HP_REG_AR2_ADDR ];
+
+ case HP_REG_SE_ADDR:
+ return m_reg_se;
+
+ case HP_REG_R25_ADDR:
+ return m_reg_r25;
+
+ case HP_REG_R26_ADDR:
+ return m_reg_r26;
+
+ case HP_REG_R27_ADDR:
+ return m_reg_r27;
+
+ case HP_REG_R32_ADDR:
+ case HP_REG_R33_ADDR:
+ case HP_REG_R34_ADDR:
+ case HP_REG_R35_ADDR:
+ case HP_REG_R36_ADDR:
+ case HP_REG_R37_ADDR:
+ return m_reg_aec[ addr - HP_REG_R32_ADDR ];
+
+ default:
+ return 0;
+ }
}
-void hp_hybrid_cpu_device::WIO(UINT8 pa , UINT8 ic , UINT16 v)
+void hp_5061_3001_cpu_device::write_non_common_reg(UINT16 addr , UINT16 v)
{
- m_io->write_word(HP_MAKE_IOADDR(pa, ic) << 1 , v);
+ switch (addr) {
+ case HP_REG_AR2_ADDR:
+ case HP_REG_AR2_ADDR + 1:
+ case HP_REG_AR2_ADDR + 2:
+ case HP_REG_AR2_ADDR + 3:
+ m_reg_ar2[ addr - HP_REG_AR2_ADDR ] = v;
+ break;
+
+ case HP_REG_SE_ADDR:
+ m_reg_se = v & HP_REG_SE_MASK;
+ break;
+
+ case HP_REG_R25_ADDR:
+ m_reg_r25 = v;
+ break;
+
+ case HP_REG_R26_ADDR:
+ m_reg_r26 = v;
+ break;
+
+ case HP_REG_R27_ADDR:
+ m_reg_r27 = v;
+ break;
+
+ case HP_REG_R32_ADDR:
+ case HP_REG_R33_ADDR:
+ case HP_REG_R34_ADDR:
+ case HP_REG_R35_ADDR:
+ case HP_REG_R36_ADDR:
+ case HP_REG_R37_ADDR:
+ m_reg_aec[ addr - HP_REG_R32_ADDR ] = v;
+ break;
+
+ default:
+ break;
+ }
}
hp_5061_3011_cpu_device::hp_5061_3011_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
-: hp_hybrid_cpu_device(mconfig, HP_5061_3011, "HP_5061_3011", tag, owner, clock, "5061-3011")
+ : hp_hybrid_cpu_device(mconfig, HP_5061_3011, "HP-5061-3011", tag, owner, clock, "5061-3011", 16)
+{
+}
+
+UINT16 hp_5061_3011_cpu_device::execute_no_bpc_ioc(UINT16 opcode)
+{
+ // Unrecognized instructions: NOP
+ // Execution time is fictional
+ m_icount -= 6;
+
+ return m_reg_P + 1;
+}
+
+UINT32 hp_5061_3011_cpu_device::add_mae(aec_cases_t aec_case , UINT16 addr)
+{
+ // No MAE on 3011
+ return addr;
+}
+
+UINT16 hp_5061_3011_cpu_device::read_non_common_reg(UINT16 addr)
+{
+ // Non-existing registers are returned as 0
+ return 0;
+}
+
+void hp_5061_3011_cpu_device::write_non_common_reg(UINT16 addr , UINT16 v)
{
+ // Non-existing registers are silently discarded
}
diff --git a/src/devices/cpu/hphybrid/hphybrid.h b/src/devices/cpu/hphybrid/hphybrid.h
index 49d2910b4a1..97aea0febce 100644
--- a/src/devices/cpu/hphybrid/hphybrid.h
+++ b/src/devices/cpu/hphybrid/hphybrid.h
@@ -8,14 +8,15 @@
// The HP hybrid processor series is composed of a few different models with different
// capabilities. The series was derived from HP's own 2116 processor by translating a
// discrete implementation of the 1960s into a multi-chip module (hence the "hybrid" name).
-// This emulator currently supports the 5061-3011 version only.
+// This emulator currently supports both the 5061-3001 & the 5061-3011 versions.
//
// For this emulator I mainly relied on these sources:
// - http://www.hp9845.net/ website
// - HP manual "Assembly development ROM manual for the HP9845": this is the most precious
// and "enabling" resource of all
// - US Patent 4,180,854 describing the HP9845 system
-// - Study of disassembly of firmware of HP64000 system
+// - Study of disassembly of firmware of HP64000 & HP9845 systems
+// - hp9800e emulator for inspiration on implementing EMC instructions
// - A lot of "educated" guessing
#ifndef _HPHYBRID_H_
@@ -26,11 +27,6 @@
#define HPHYBRID_IRL 1 // Low-level interrupt
#define HPHYBRID_INT_LVLS 2 // Levels of interrupt
-#define HPHYBRID_DMAR 2 // DMA request
-#define HPHYBRID_HALT 3 // "Halt" input
-#define HPHYBRID_STS 4 // "Status" input
-#define HPHYBRID_FLG 5 // "Flag" input
-
// I/O addressing space (16-bit wide)
// Addresses into this space are composed as follows:
// b[5..2] = Peripheral address 0..15
@@ -52,95 +48,200 @@
#define HP_REG_R7_ADDR 0x0007
#define HP_REG_IV_ADDR 0x0008
#define HP_REG_PA_ADDR 0x0009
+#define HP_REG_W_ADDR 0x000A
#define HP_REG_DMAPA_ADDR 0x000B
#define HP_REG_DMAMA_ADDR 0x000C
#define HP_REG_DMAC_ADDR 0x000D
#define HP_REG_C_ADDR 0x000e
#define HP_REG_D_ADDR 0x000f
+#define HP_REG_AR2_ADDR 0x0010
+#define HP_REG_SE_ADDR 0x0014
+#define HP_REG_R25_ADDR 0x0015
+#define HP_REG_R26_ADDR 0x0016
+#define HP_REG_R27_ADDR 0x0017
+#define HP_REG_R32_ADDR 0x001a
+#define HP_REG_R33_ADDR 0x001b
+#define HP_REG_R34_ADDR 0x001c
+#define HP_REG_R35_ADDR 0x001d
+#define HP_REG_R36_ADDR 0x001e
+#define HP_REG_R37_ADDR 0x001f
#define HP_REG_LAST_ADDR 0x001f
+#define HP_REG_AR1_ADDR 0xfff8
#define HP_REG_IV_MASK 0xfff0
#define HP_REG_PA_MASK 0x000f
+// Set boot mode of 5061-3001: either normal (false) or as in HP9845 system (true)
+#define MCFG_HPHYBRID_SET_9845_BOOT(_mode) \
+ hp_5061_3001_cpu_device::set_boot_mode_static(*device, _mode);
+
+// PA changed callback
+#define MCFG_HPHYBRID_PA_CHANGED(_devcb) \
+ hp_hybrid_cpu_device::set_pa_changed_func(*device , DEVCB_##_devcb);
+
class hp_hybrid_cpu_device : public cpu_device
{
public:
- DECLARE_WRITE_LINE_MEMBER(dmar_w);
+ DECLARE_WRITE_LINE_MEMBER(dmar_w);
+ DECLARE_WRITE_LINE_MEMBER(halt_w);
+ DECLARE_WRITE_LINE_MEMBER(status_w);
+ DECLARE_WRITE_LINE_MEMBER(flag_w);
+
+ template<class _Object> static devcb_base &set_pa_changed_func(device_t &device, _Object object) { return downcast<hp_hybrid_cpu_device &>(device).m_pa_changed_func.set_callback(object); }
protected:
- hp_hybrid_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname);
+ hp_hybrid_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname , UINT8 addrwidth);
- // device-level overrides
- virtual void device_start() override;
- virtual void device_reset() override;
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
- // device_execute_interface overrides
- virtual UINT32 execute_min_cycles() const override { return 6; }
- virtual UINT32 execute_max_cycles() const override { return 25; }
- virtual UINT32 execute_input_lines() const override { return 2; }
- virtual UINT32 execute_default_irq_vector() const override { return 0xffff; }
- virtual void execute_run() override;
- virtual void execute_set_input(int inputnum, int state) override;
+ // device_execute_interface overrides
+ virtual UINT32 execute_min_cycles() const override { return 6; }
+ virtual UINT32 execute_input_lines() const override { return 2; }
+ virtual UINT32 execute_default_irq_vector() const override { return 0xffff; }
+ virtual void execute_run() override;
+ virtual void execute_set_input(int inputnum, int state) override;
+
+ UINT16 execute_one(UINT16 opcode);
+ UINT16 execute_one_sub(UINT16 opcode);
+ // Execute an instruction that doesn't belong to either BPC or IOC
+ virtual UINT16 execute_no_bpc_ioc(UINT16 opcode) = 0;
+
+ // device_memory_interface overrides
+ virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override { return (spacenum == AS_PROGRAM) ? &m_program_config : ( (spacenum == AS_IO) ? &m_io_config : NULL ); }
+
+ // device_state_interface overrides
+ void state_string_export(const device_state_entry &entry, std::string &str) const override;
+
+ // device_disasm_interface overrides
+ virtual UINT32 disasm_min_opcode_bytes() const override { return 2; }
+ virtual UINT32 disasm_max_opcode_bytes() const override { return 2; }
+ virtual offs_t disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options) override;
+
+ // Different cases of memory access
+ // See patent @ pg 361
+ typedef enum {
+ AEC_CASE_A, // Instr. fetches, non-base page fetches of link pointers, BPC direct non-base page accesses
+ AEC_CASE_B, // Base page fetches of link pointers, BPC direct base page accesses
+ AEC_CASE_C, // IOC, EMC & BPC indirect final destination accesses
+ AEC_CASE_D, // DMA accesses
+ AEC_CASE_I // Interrupt vector fetches
+ } aec_cases_t;
+
+ // do memory address extension
+ virtual UINT32 add_mae(aec_cases_t aec_case , UINT16 addr) = 0;
+
+ UINT16 remove_mae(UINT32 addr);
+
+ UINT16 RM(aec_cases_t aec_case , UINT16 addr);
+ UINT16 RM(UINT32 addr);
+ virtual UINT16 read_non_common_reg(UINT16 addr) = 0;
+
+ void WM(aec_cases_t aec_case , UINT16 addr , UINT16 v);
+ void WM(UINT32 addr , UINT16 v);
+ virtual void write_non_common_reg(UINT16 addr , UINT16 v) = 0;
- UINT16 execute_one(UINT16 opcode);
- UINT16 execute_one_sub(UINT16 opcode);
+ UINT16 fetch(void);
- // device_memory_interface overrides
- virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override { return (spacenum == AS_PROGRAM) ? &m_program_config : ( (spacenum == AS_IO) ? &m_io_config : nullptr ); }
+ UINT16 get_skip_addr(UINT16 opcode , bool condition) const;
+
+ devcb_write8 m_pa_changed_func;
+
+ int m_icount;
+ bool m_forced_bsc_25;
+
+ // State of processor
+ UINT16 m_reg_A; // Register A
+ UINT16 m_reg_B; // Register B
+ UINT16 m_reg_P; // Register P
+ UINT16 m_reg_R; // Register R
+ UINT16 m_reg_C; // Register C
+ UINT16 m_reg_D; // Register D
+ UINT16 m_reg_IV; // Register IV
+ UINT16 m_reg_W; // Register W
+ UINT8 m_reg_PA[ HPHYBRID_INT_LVLS + 1 ]; // Stack of register PA (4 bit-long)
+ UINT16 m_flags; // Flags
+ UINT8 m_dmapa; // DMA peripheral address (4 bits)
+ UINT16 m_dmama; // DMA address
+ UINT16 m_dmac; // DMA counter
+ UINT16 m_reg_I; // Instruction register
+ UINT32 m_genpc; // Full PC
+
+private:
+ address_space_config m_program_config;
+ address_space_config m_io_config;
+
+ address_space *m_program;
+ direct_read_data *m_direct;
+ address_space *m_io;
+
+ UINT32 get_ea(UINT16 opcode);
+ void do_add(UINT16& addend1 , UINT16 addend2);
+ UINT16 get_skip_addr_sc(UINT16 opcode , UINT16& v , unsigned n);
+ void do_pw(UINT16 opcode);
+ void check_for_interrupts(void);
+ void handle_dma(void);
+
+ UINT16 RIO(UINT8 pa , UINT8 ic);
+ void WIO(UINT8 pa , UINT8 ic , UINT16 v);
+};
+
+class hp_5061_3001_cpu_device : public hp_hybrid_cpu_device
+{
+public:
+ hp_5061_3001_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
- // device_state_interface overrides
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ static void set_boot_mode_static(device_t &device, bool mode) { downcast<hp_5061_3001_cpu_device &>(device).m_boot_mode = mode; }
- // device_disasm_interface overrides
- virtual UINT32 disasm_min_opcode_bytes() const override { return 2; }
- virtual UINT32 disasm_max_opcode_bytes() const override { return 2; }
+protected:
+ virtual void device_start() override;
+ virtual void device_reset() override;
+ virtual UINT32 execute_max_cycles() const override { return 237; } // FMP 15
+
+ static UINT8 do_dec_shift_r(UINT8 d1 , UINT64& mantissa);
+ static UINT8 do_dec_shift_l(UINT8 d12 , UINT64& mantissa);
+ UINT64 get_ar1(void);
+ void set_ar1(UINT64 v);
+ UINT64 get_ar2(void) const;
+ void set_ar2(UINT64 v);
+ UINT64 do_mrxy(UINT64 ar);
+ bool do_dec_add(bool carry_in , UINT64& a , UINT64 b);
+ void do_mpy(void);
+
+ virtual UINT16 execute_no_bpc_ioc(UINT16 opcode) override;
virtual offs_t disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options) override;
+ virtual UINT32 add_mae(aec_cases_t aec_case , UINT16 addr) override;
+ virtual UINT16 read_non_common_reg(UINT16 addr) override;
+ virtual void write_non_common_reg(UINT16 addr , UINT16 v) override;
private:
- address_space_config m_program_config;
- address_space_config m_io_config;
-
- address_space *m_program;
- direct_read_data *m_direct;
- address_space *m_io;
- int m_icount;
-
- // State of processor
- UINT16 m_reg_A; // Register A
- UINT16 m_reg_B; // Register B
- UINT16 m_reg_P; // Register P
- UINT16 m_reg_R; // Register R
- UINT16 m_reg_C; // Register C
- UINT16 m_reg_D; // Register D
- UINT16 m_reg_IV; // Register IV
- UINT8 m_reg_PA[ HPHYBRID_INT_LVLS + 1 ]; // Stack of register PA (4 bit-long)
- UINT16 m_flags; // Flags (carry, overflow, cb, db, int en, dma en, dma dir)
- UINT8 m_dmapa; // DMA peripheral address (4 bits)
- UINT16 m_dmama; // DMA address
- UINT16 m_dmac; // DMA counter
- UINT16 m_reg_I; // Instruction register
-
- UINT16 get_ea(UINT16 opcode);
- void do_add(UINT16& addend1 , UINT16 addend2);
- UINT16 get_skip_addr(UINT16 opcode , bool condition) const;
- UINT16 get_skip_addr_sc(UINT16 opcode , UINT16& v , unsigned n);
- void do_pw(UINT16 opcode);
- void check_for_interrupts(void);
- void handle_dma(void);
-
- UINT16 RM(UINT16 addr);
- void WM(UINT16 addr , UINT16 v);
- void WMB(UINT32 addr , UINT8 v);
- UINT16 RIO(UINT8 pa , UINT8 ic);
- void WIO(UINT8 pa , UINT8 ic , UINT16 v);
+ bool m_boot_mode;
+
+ // Additional state of processor
+ UINT16 m_reg_ar2[ 4 ]; // AR2 register
+ UINT16 m_reg_se; // SE register (4 bits)
+ UINT16 m_reg_r25; // R25 register
+ UINT16 m_reg_r26; // R26 register
+ UINT16 m_reg_r27; // R27 register
+ UINT16 m_reg_aec[ HP_REG_R37_ADDR - HP_REG_R32_ADDR + 1 ]; // AEC registers R32-R37
};
class hp_5061_3011_cpu_device : public hp_hybrid_cpu_device
{
public:
hp_5061_3011_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+protected:
+ virtual UINT32 execute_max_cycles() const override { return 25; }
+ virtual UINT16 execute_no_bpc_ioc(UINT16 opcode) override;
+ virtual UINT32 add_mae(aec_cases_t aec_case , UINT16 addr) override;
+ virtual UINT16 read_non_common_reg(UINT16 addr) override;
+ virtual void write_non_common_reg(UINT16 addr , UINT16 v) override;
+
};
+extern const device_type HP_5061_3001;
extern const device_type HP_5061_3011;
#endif /* _HPHYBRID_H_ */
diff --git a/src/devices/cpu/hphybrid/hphybrid_dasm.cpp b/src/devices/cpu/hphybrid/hphybrid_dasm.cpp
index 2f4d1f9ef40..48b03b4afb4 100644
--- a/src/devices/cpu/hphybrid/hphybrid_dasm.cpp
+++ b/src/devices/cpu/hphybrid/hphybrid_dasm.cpp
@@ -8,7 +8,7 @@
#include "debugger.h"
#include "hphybrid.h"
-typedef void (*fn_dis_param)(char *buffer , offs_t pc , UINT16 opcode);
+typedef void (*fn_dis_param)(char *buffer , offs_t pc , UINT16 opcode , bool is_3001);
typedef struct {
UINT16 m_op_mask;
@@ -18,84 +18,160 @@ typedef struct {
UINT32 m_dasm_flags;
} dis_entry_t;
-static void addr_2_str(char *buffer , UINT16 addr , bool indirect)
+static void addr_2_str(char *buffer , UINT16 addr , bool indirect , bool is_3001)
{
- char *s = buffer + strlen(buffer);
+ char *s = buffer + strlen(buffer);
- s += sprintf(s , "$%04x" , addr);
+ s += sprintf(s , "$%04x" , addr);
- switch (addr) {
- case HP_REG_A_ADDR:
- strcpy(s , "(A)");
- break;
+ if (is_3001) {
+ switch (addr) {
+ case HP_REG_AR1_ADDR:
+ strcpy(s , "(Ar1)");
+ break;
- case HP_REG_B_ADDR:
- strcpy(s , "(B)");
- break;
+ case HP_REG_AR1_ADDR + 1:
+ strcpy(s , "(Ar1_2)");
+ break;
- case HP_REG_P_ADDR:
- strcpy(s , "(P)");
- break;
+ case HP_REG_AR1_ADDR + 2:
+ strcpy(s , "(Ar1_3)");
+ break;
- case HP_REG_R_ADDR:
- strcpy(s , "(R)");
- break;
+ case HP_REG_AR1_ADDR + 3:
+ strcpy(s , "(Ar1_4)");
+ break;
- case HP_REG_R4_ADDR:
- strcpy(s , "(R4)");
- break;
+ case HP_REG_AR2_ADDR:
+ strcpy(s , "(Ar2)");
+ break;
- case HP_REG_R5_ADDR:
- strcpy(s , "(R5)");
- break;
+ case HP_REG_AR2_ADDR + 1:
+ strcpy(s , "(Ar2_2)");
+ break;
- case HP_REG_R6_ADDR:
- strcpy(s , "(R6)");
- break;
+ case HP_REG_AR2_ADDR + 2:
+ strcpy(s , "(Ar2_3)");
+ break;
- case HP_REG_R7_ADDR:
- strcpy(s , "(R7)");
- break;
+ case HP_REG_AR2_ADDR + 3:
+ strcpy(s , "(Ar2_4)");
+ break;
- case HP_REG_IV_ADDR:
- strcpy(s , "(IV)");
- break;
+ case HP_REG_SE_ADDR:
+ strcpy(s , "(SE)");
+ break;
- case HP_REG_PA_ADDR:
- strcpy(s , "(PA)");
- break;
+ case HP_REG_R25_ADDR:
+ strcpy(s , "(R25)");
+ break;
- case HP_REG_DMAPA_ADDR:
- strcpy(s , "(DMAPA)");
- break;
+ case HP_REG_R26_ADDR:
+ strcpy(s , "(R26)");
+ break;
- case HP_REG_DMAMA_ADDR:
- strcpy(s , "(DMAMA)");
- break;
+ case HP_REG_R27_ADDR:
+ strcpy(s , "(R27)");
+ break;
- case HP_REG_DMAC_ADDR:
- strcpy(s , "(DMAC)");
- break;
+ case HP_REG_R32_ADDR:
+ strcpy(s , "(R32)");
+ break;
- case HP_REG_C_ADDR:
- strcpy(s , "(C)");
- break;
+ case HP_REG_R33_ADDR:
+ strcpy(s , "(R33)");
+ break;
- case HP_REG_D_ADDR:
- strcpy(s , "(D)");
- break;
- }
+ case HP_REG_R34_ADDR:
+ strcpy(s , "(R34)");
+ break;
- if (indirect) {
- strcat(s , ",I");
- }
+ case HP_REG_R35_ADDR:
+ strcpy(s , "(R35)");
+ break;
+
+ case HP_REG_R36_ADDR:
+ strcpy(s , "(R36)");
+ break;
+
+ case HP_REG_R37_ADDR:
+ strcpy(s , "(R37)");
+ break;
+ }
+ }
+
+ switch (addr) {
+ case HP_REG_A_ADDR:
+ strcpy(s , "(A)");
+ break;
+
+ case HP_REG_B_ADDR:
+ strcpy(s , "(B)");
+ break;
+
+ case HP_REG_P_ADDR:
+ strcpy(s , "(P)");
+ break;
+
+ case HP_REG_R_ADDR:
+ strcpy(s , "(R)");
+ break;
+
+ case HP_REG_R4_ADDR:
+ strcpy(s , "(R4)");
+ break;
+
+ case HP_REG_R5_ADDR:
+ strcpy(s , "(R5)");
+ break;
+
+ case HP_REG_R6_ADDR:
+ strcpy(s , "(R6)");
+ break;
+
+ case HP_REG_R7_ADDR:
+ strcpy(s , "(R7)");
+ break;
+
+ case HP_REG_IV_ADDR:
+ strcpy(s , "(IV)");
+ break;
+
+ case HP_REG_PA_ADDR:
+ strcpy(s , "(PA)");
+ break;
+
+ case HP_REG_DMAPA_ADDR:
+ strcpy(s , "(DMAPA)");
+ break;
+
+ case HP_REG_DMAMA_ADDR:
+ strcpy(s , "(DMAMA)");
+ break;
+
+ case HP_REG_DMAC_ADDR:
+ strcpy(s , "(DMAC)");
+ break;
+
+ case HP_REG_C_ADDR:
+ strcpy(s , "(C)");
+ break;
+
+ case HP_REG_D_ADDR:
+ strcpy(s , "(D)");
+ break;
+ }
+
+ if (indirect) {
+ strcat(s , ",I");
+ }
}
-static void param_none(char *buffer , offs_t pc , UINT16 opcode)
+static void param_none(char *buffer , offs_t pc , UINT16 opcode , bool is_3001)
{
}
-static void param_loc(char *buffer , offs_t pc , UINT16 opcode)
+static void param_loc(char *buffer , offs_t pc , UINT16 opcode , bool is_3001)
{
UINT16 base;
UINT16 off;
@@ -113,26 +189,26 @@ static void param_loc(char *buffer , offs_t pc , UINT16 opcode)
off -= 0x400;
}
- addr_2_str(buffer , base + off , (opcode & 0x8000) != 0);
+ addr_2_str(buffer , base + off , (opcode & 0x8000) != 0 , is_3001);
}
-static void param_addr32(char *buffer , offs_t pc , UINT16 opcode)
+static void param_addr32(char *buffer , offs_t pc , UINT16 opcode , bool is_3001)
{
- addr_2_str(buffer , opcode & 0x1f , (opcode & 0x8000) != 0);
+ addr_2_str(buffer , opcode & 0x1f , (opcode & 0x8000) != 0 , is_3001);
}
-static void param_skip(char *buffer , offs_t pc , UINT16 opcode)
+static void param_skip(char *buffer , offs_t pc , UINT16 opcode , bool is_3001)
{
UINT16 off = opcode & 0x3f;
if (off & 0x20) {
off -= 0x40;
}
- addr_2_str(buffer , pc + off , false);
+ addr_2_str(buffer , pc + off , false , is_3001);
}
-static void param_skip_sc(char *buffer , offs_t pc , UINT16 opcode)
+static void param_skip_sc(char *buffer , offs_t pc , UINT16 opcode , bool is_3001)
{
- param_skip(buffer, pc, opcode);
+ param_skip(buffer, pc, opcode , is_3001);
if (opcode & 0x80) {
if (opcode & 0x40) {
@@ -143,7 +219,7 @@ static void param_skip_sc(char *buffer , offs_t pc , UINT16 opcode)
}
}
-static void param_ret(char *buffer , offs_t pc , UINT16 opcode)
+static void param_ret(char *buffer , offs_t pc , UINT16 opcode , bool is_3001)
{
char *s = buffer + strlen(buffer);
@@ -159,16 +235,16 @@ static void param_ret(char *buffer , offs_t pc , UINT16 opcode)
}
}
-static void param_n16(char *buffer , offs_t pc , UINT16 opcode)
+static void param_n16(char *buffer , offs_t pc , UINT16 opcode , bool is_3001)
{
char *s = buffer + strlen(buffer);
sprintf(s , "%u" , (opcode & 0xf) + 1);
}
-static void param_reg_id(char *buffer , offs_t pc , UINT16 opcode)
+static void param_reg_id(char *buffer , offs_t pc , UINT16 opcode , bool is_3001)
{
- addr_2_str(buffer, opcode & 7, false);
+ addr_2_str(buffer, opcode & 7, false , is_3001);
if (opcode & 0x80) {
strcat(buffer , ",D");
@@ -260,22 +336,77 @@ static const dis_entry_t dis_table[] = {
{0 , 0 , nullptr , nullptr , 0 }
};
+static const dis_entry_t dis_table_emc[] = {
+ // *** EMC Instructions ***
+ {0xffff , 0x7200 , "MWA" , param_none , 0 },
+ {0xffff , 0x7220 , "CMY" , param_none , 0 },
+ {0xffff , 0x7260 , "CMX" , param_none , 0 },
+ {0xffff , 0x7280 , "FXA" , param_none , 0 },
+ {0xfff0 , 0x7300 , "XFR" , param_n16 , 0 },
+ {0xffff , 0x7340 , "NRM" , param_none , 0 },
+ {0xfff0 , 0x7380 , "CLR" , param_n16 , 0 },
+ {0xffff , 0x73c0 , "CDC" , param_none , 0 },
+ {0xffc0 , 0x74c0 , "SDS" , param_skip , 0 },
+ {0xffc0 , 0x75c0 , "SDC" , param_skip , 0 },
+ {0xffff , 0x7a00 , "FMP" , param_none , 0 },
+ {0xffff , 0x7a21 , "FDV" , param_none , 0 },
+ {0xffff , 0x7b00 , "MRX" , param_none , 0 },
+ {0xffff , 0x7b21 , "DRS" , param_none , 0 },
+ {0xffff , 0x7b40 , "MRY" , param_none , 0 },
+ {0xffff , 0x7b61 , "MLY" , param_none , 0 },
+ {0xffff , 0x7b8f , "MPY" , param_none , 0 },
+ // *** END ***
+ {0 , 0 , nullptr , nullptr , 0 }
+};
+
+static offs_t disassemble_table(UINT16 opcode , offs_t pc , const dis_entry_t *table , bool is_3001 , char *buffer)
+{
+ const dis_entry_t *p;
+
+ for (p = table; p->m_op_mask; p++) {
+ if ((opcode & p->m_op_mask) == p->m_opcode) {
+ strcpy(buffer , p->m_mnemonic);
+ strcat(buffer , " ");
+ p->m_param_fn(buffer , pc , opcode , is_3001);
+ return 1 | p->m_dasm_flags | DASMFLAG_SUPPORTED;
+ }
+ }
+
+ return 0;
+}
+
CPU_DISASSEMBLE(hp_hybrid)
{
UINT16 opcode = ((UINT16)oprom[ 0 ] << 8) | oprom[ 1 ];
- const dis_entry_t *p;
-
- for (p = dis_table; p->m_op_mask; p++) {
- if ((opcode & p->m_op_mask) == p->m_opcode) {
- strcpy(buffer , p->m_mnemonic);
- strcat(buffer , " ");
- p->m_param_fn(buffer , pc , opcode);
- return 1 | p->m_dasm_flags | DASMFLAG_SUPPORTED;
- }
+ offs_t res;
+
+ res = disassemble_table(opcode , pc , dis_table , false , buffer);
+
+ if (res == 0) {
+ // Unknown opcode
+ strcpy(buffer , "???");
+ res = 1 | DASMFLAG_SUPPORTED;
}
- // Unknown opcode
- strcpy(buffer , "???");
+ return res;
+}
+
+CPU_DISASSEMBLE(hp_5061_3001)
+{
+ UINT16 opcode = ((UINT16)oprom[ 0 ] << 8) | oprom[ 1 ];
+ offs_t res;
+
+ res = disassemble_table(opcode , pc , dis_table_emc , true , buffer);
+
+ if (res == 0) {
+ res = disassemble_table(opcode , pc , dis_table , true , buffer);
+ }
+
+ if (res == 0) {
+ // Unknown opcode
+ strcpy(buffer , "???");
+ res = 1 | DASMFLAG_SUPPORTED;
+ }
- return 1 | DASMFLAG_SUPPORTED;
+ return res;
}
diff --git a/src/devices/cpu/i386/cycles.h b/src/devices/cpu/i386/cycles.h
index a04e54da8e0..62b6da2a80a 100644
--- a/src/devices/cpu/i386/cycles.h
+++ b/src/devices/cpu/i386/cycles.h
@@ -333,7 +333,6 @@ enum X86_CYCLES
};
-#define X86_NUM_CPUS 4
#define CPU_CYCLES_I386 0
#define CPU_CYCLES_I486 1
#define CPU_CYCLES_PENTIUM 2
diff --git a/src/devices/cpu/i386/i386.cpp b/src/devices/cpu/i386/i386.cpp
index 9017ffbaea7..f0d57ada9a0 100644
--- a/src/devices/cpu/i386/i386.cpp
+++ b/src/devices/cpu/i386/i386.cpp
@@ -275,7 +275,7 @@ UINT32 i386_device::i386_get_stack_ptr(UINT8 privilege)
return ret;
}
-UINT32 i386_device::get_flags()
+UINT32 i386_device::get_flags() const
{
UINT32 f = 0x2;
f |= m_CF;
@@ -475,7 +475,7 @@ void i386_device::i386_check_sreg_validity(int reg)
UINT8 CPL = m_CPL;
UINT8 DPL,RPL;
I386_SREG desc;
- int invalid = 0;
+ int invalid;
memset(&desc, 0, sizeof(desc));
desc.selector = selector;
@@ -697,7 +697,7 @@ void i386_device::i386_trap(int irq, int irq_gate, int trap_level)
UINT32 offset, oldflags = get_flags();
UINT16 segment;
int entry = irq * (PROTECTED_MODE ? 8 : 4);
- int SetRPL = 0;
+ int SetRPL;
m_lock = false;
if( !(PROTECTED_MODE) )
@@ -721,7 +721,7 @@ void i386_device::i386_trap(int irq, int irq_gate, int trap_level)
int type;
UINT16 flags;
I386_SREG desc;
- UINT8 CPL = m_CPL, DPL = 0; //, RPL = 0;
+ UINT8 CPL = m_CPL, DPL; //, RPL = 0;
/* 32-bit */
v1 = READ32PL0(m_idtr.base + entry );
@@ -1347,7 +1347,7 @@ void i386_device::i386_protected_mode_jump(UINT16 seg, UINT32 off, int indirect,
I386_SREG desc;
I386_CALL_GATE call_gate;
UINT8 CPL,DPL,RPL;
- UINT8 SetRPL = 0;
+ UINT8 SetRPL;
UINT16 segment = seg;
UINT32 offset = off;
@@ -1618,7 +1618,7 @@ void i386_device::i386_protected_mode_call(UINT16 seg, UINT32 off, int indirect,
{
I386_SREG desc;
I386_CALL_GATE gate;
- UINT8 SetRPL = 0;
+ UINT8 SetRPL;
UINT8 CPL, DPL, RPL;
UINT16 selector = seg;
UINT32 offset = off;
@@ -2769,9 +2769,6 @@ void i386_device::i386_protected_mode_iret(int operand32)
#include "cycles.h"
-static UINT8 *cycle_table_rm[X86_NUM_CPUS];
-static UINT8 *cycle_table_pm[X86_NUM_CPUS];
-
#define CYCLES_NUM(x) (m_cycles -= (x))
void i386_device::CYCLES(int x)
@@ -2817,8 +2814,8 @@ void i386_device::build_cycle_table()
int i, j;
for (j=0; j < X86_NUM_CPUS; j++)
{
- cycle_table_rm[j] = auto_alloc_array(machine(), UINT8, CYCLES_NUM_OPCODES);
- cycle_table_pm[j] = auto_alloc_array(machine(), UINT8, CYCLES_NUM_OPCODES);
+ cycle_table_rm[j] = std::make_unique<UINT8[]>(CYCLES_NUM_OPCODES);
+ cycle_table_pm[j] = std::make_unique<UINT8[]>(CYCLES_NUM_OPCODES);
for (i=0; i < sizeof(x86_cycle_table)/sizeof(X86_CYCLE_TABLE); i++)
{
@@ -3094,7 +3091,7 @@ UINT64 i386_device::debug_seglimit(symbol_table &table, int params, const UINT64
UINT64 i386_device::debug_segofftovirt(symbol_table &table, int params, const UINT64 *param)
{
- UINT32 result = 0;
+ UINT32 result;
I386_SREG seg;
if(param[0] > 65535)
@@ -3300,8 +3297,8 @@ void i386_device::device_start()
i386_common_init(32);
build_opcode_table(OP_I386);
- m_cycle_table_rm = cycle_table_rm[CPU_CYCLES_I386];
- m_cycle_table_pm = cycle_table_pm[CPU_CYCLES_I386];
+ m_cycle_table_rm = cycle_table_rm[CPU_CYCLES_I386].get();
+ m_cycle_table_pm = cycle_table_pm[CPU_CYCLES_I386].get();
register_state_i386();
}
@@ -3468,7 +3465,7 @@ void i386_device::state_export(const device_state_entry &entry)
}
}
-void i386_device::state_string_export(const device_state_entry &entry, std::string &str)
+void i386_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
@@ -3983,8 +3980,8 @@ void i486_device::device_start()
build_opcode_table(OP_I386 | OP_FPU | OP_I486);
build_x87_opcode_table();
- m_cycle_table_rm = cycle_table_rm[CPU_CYCLES_I486];
- m_cycle_table_pm = cycle_table_pm[CPU_CYCLES_I486];
+ m_cycle_table_rm = cycle_table_rm[CPU_CYCLES_I486].get();
+ m_cycle_table_pm = cycle_table_pm[CPU_CYCLES_I486].get();
register_state_i386_x87();
}
@@ -4042,8 +4039,8 @@ void pentium_device::device_start()
build_opcode_table(OP_I386 | OP_FPU | OP_I486 | OP_PENTIUM);
build_x87_opcode_table();
- m_cycle_table_rm = cycle_table_rm[CPU_CYCLES_PENTIUM];
- m_cycle_table_pm = cycle_table_pm[CPU_CYCLES_PENTIUM];
+ m_cycle_table_rm = cycle_table_rm[CPU_CYCLES_PENTIUM].get();
+ m_cycle_table_pm = cycle_table_pm[CPU_CYCLES_PENTIUM].get();
}
void pentium_device::device_reset()
@@ -4116,8 +4113,8 @@ void mediagx_device::device_start()
build_x87_opcode_table();
build_opcode_table(OP_I386 | OP_FPU | OP_I486 | OP_PENTIUM | OP_CYRIX);
- m_cycle_table_rm = cycle_table_rm[CPU_CYCLES_MEDIAGX];
- m_cycle_table_pm = cycle_table_pm[CPU_CYCLES_MEDIAGX];
+ m_cycle_table_rm = cycle_table_rm[CPU_CYCLES_MEDIAGX].get();
+ m_cycle_table_pm = cycle_table_pm[CPU_CYCLES_MEDIAGX].get();
}
void mediagx_device::device_reset()
@@ -4181,8 +4178,8 @@ void pentium_pro_device::device_start()
build_x87_opcode_table();
build_opcode_table(OP_I386 | OP_FPU | OP_I486 | OP_PENTIUM | OP_PPRO);
- m_cycle_table_rm = cycle_table_rm[CPU_CYCLES_PENTIUM]; // TODO: generate own cycle tables
- m_cycle_table_pm = cycle_table_pm[CPU_CYCLES_PENTIUM]; // TODO: generate own cycle tables
+ m_cycle_table_rm = cycle_table_rm[CPU_CYCLES_PENTIUM].get(); // TODO: generate own cycle tables
+ m_cycle_table_pm = cycle_table_pm[CPU_CYCLES_PENTIUM].get(); // TODO: generate own cycle tables
}
void pentium_pro_device::device_reset()
@@ -4256,8 +4253,8 @@ void pentium_mmx_device::device_start()
build_x87_opcode_table();
build_opcode_table(OP_I386 | OP_FPU | OP_I486 | OP_PENTIUM | OP_MMX);
- m_cycle_table_rm = cycle_table_rm[CPU_CYCLES_PENTIUM]; // TODO: generate own cycle tables
- m_cycle_table_pm = cycle_table_pm[CPU_CYCLES_PENTIUM]; // TODO: generate own cycle tables
+ m_cycle_table_rm = cycle_table_rm[CPU_CYCLES_PENTIUM].get(); // TODO: generate own cycle tables
+ m_cycle_table_pm = cycle_table_pm[CPU_CYCLES_PENTIUM].get(); // TODO: generate own cycle tables
}
void pentium_mmx_device::device_reset()
@@ -4329,8 +4326,8 @@ void pentium2_device::device_start()
build_x87_opcode_table();
build_opcode_table(OP_I386 | OP_FPU | OP_I486 | OP_PENTIUM | OP_PPRO | OP_MMX);
- m_cycle_table_rm = cycle_table_rm[CPU_CYCLES_PENTIUM]; // TODO: generate own cycle tables
- m_cycle_table_pm = cycle_table_pm[CPU_CYCLES_PENTIUM]; // TODO: generate own cycle tables
+ m_cycle_table_rm = cycle_table_rm[CPU_CYCLES_PENTIUM].get(); // TODO: generate own cycle tables
+ m_cycle_table_pm = cycle_table_pm[CPU_CYCLES_PENTIUM].get(); // TODO: generate own cycle tables
}
void pentium2_device::device_reset()
@@ -4396,8 +4393,8 @@ void pentium3_device::device_start()
build_x87_opcode_table();
build_opcode_table(OP_I386 | OP_FPU | OP_I486 | OP_PENTIUM | OP_PPRO | OP_MMX | OP_SSE);
- m_cycle_table_rm = cycle_table_rm[CPU_CYCLES_PENTIUM]; // TODO: generate own cycle tables
- m_cycle_table_pm = cycle_table_pm[CPU_CYCLES_PENTIUM]; // TODO: generate own cycle tables
+ m_cycle_table_rm = cycle_table_rm[CPU_CYCLES_PENTIUM].get(); // TODO: generate own cycle tables
+ m_cycle_table_pm = cycle_table_pm[CPU_CYCLES_PENTIUM].get(); // TODO: generate own cycle tables
}
void pentium3_device::device_reset()
@@ -4465,8 +4462,8 @@ void pentium4_device::device_start()
build_x87_opcode_table();
build_opcode_table(OP_I386 | OP_FPU | OP_I486 | OP_PENTIUM | OP_PPRO | OP_MMX | OP_SSE | OP_SSE2);
- m_cycle_table_rm = cycle_table_rm[CPU_CYCLES_PENTIUM]; // TODO: generate own cycle tables
- m_cycle_table_pm = cycle_table_pm[CPU_CYCLES_PENTIUM]; // TODO: generate own cycle tables
+ m_cycle_table_rm = cycle_table_rm[CPU_CYCLES_PENTIUM].get(); // TODO: generate own cycle tables
+ m_cycle_table_pm = cycle_table_pm[CPU_CYCLES_PENTIUM].get(); // TODO: generate own cycle tables
}
void pentium4_device::device_reset()
diff --git a/src/devices/cpu/i386/i386.h b/src/devices/cpu/i386/i386.h
index 60eea10264d..c9ef38b4280 100644
--- a/src/devices/cpu/i386/i386.h
+++ b/src/devices/cpu/i386/i386.h
@@ -22,6 +22,7 @@
#define MCFG_I386_SMIACT(_devcb) \
i386_device::set_smiact(*device, DEVCB_##_devcb);
+#define X86_NUM_CPUS 4
class i386_device : public cpu_device
{
@@ -58,7 +59,7 @@ protected:
// device_state_interface overrides
virtual void state_import(const device_state_entry &entry) override;
virtual void state_export(const device_state_entry &entry) override;
- virtual void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 1; }
@@ -68,6 +69,10 @@ protected:
address_space_config m_program_config;
address_space_config m_io_config;
+ std::unique_ptr<UINT8[]> cycle_table_rm[X86_NUM_CPUS];
+ std::unique_ptr<UINT8[]> cycle_table_pm[X86_NUM_CPUS];
+
+
union I386_GPR {
UINT32 d[8];
UINT16 w[16];
@@ -357,7 +362,7 @@ struct I386_CALL_GATE
void i386_load_segment_descriptor(int segment );
UINT32 i386_get_stack_segment(UINT8 privilege);
UINT32 i386_get_stack_ptr(UINT8 privilege);
- UINT32 get_flags();
+ UINT32 get_flags() const;
void set_flags(UINT32 f );
void sib_byte(UINT8 mod, UINT32* out_ea, UINT8* out_segment);
void modrm_to_EA(UINT8 mod_rm, UINT32* out_ea, UINT8* out_segment);
diff --git a/src/devices/cpu/i386/i386priv.h b/src/devices/cpu/i386/i386priv.h
index c1f6ecea94c..9913d851fa2 100644
--- a/src/devices/cpu/i386/i386priv.h
+++ b/src/devices/cpu/i386/i386priv.h
@@ -398,7 +398,7 @@ bool i386_device::i386_translate_address(int intention, offs_t *address, vtlb_en
UINT32 directory = (a >> 22) & 0x3ff;
UINT32 table = (a >> 12) & 0x3ff;
vtlb_entry perm = 0;
- bool ret = false;
+ bool ret;
bool user = (intention & TRANSLATE_USER_MASK) ? true : false;
bool write = (intention & TRANSLATE_WRITE) ? true : false;
bool debug = (intention & TRANSLATE_DEBUG_MASK) ? true : false;
diff --git a/src/devices/cpu/i4004/i4004.cpp b/src/devices/cpu/i4004/i4004.cpp
index 51258268e8a..d4ba8891260 100644
--- a/src/devices/cpu/i4004/i4004.cpp
+++ b/src/devices/cpu/i4004/i4004.cpp
@@ -419,15 +419,14 @@ void i4004_cpu_device::device_start()
state_add(STATE_GENFLAGS, "GENFLAGS", m_flags).mask(0x0f).callimport().callexport().noshow().formatstr("%4s");
state_add(I4004_A, "A", m_A).mask(0x0f);
- std::string tempstr;
for (int regnum = 0; regnum < 8; regnum++)
{
- state_add(I4004_R01 + regnum, strformat(tempstr, "R%X%X", regnum * 2, regnum * 2 + 1).c_str(), m_R[regnum]);
+ state_add(I4004_R01 + regnum, strformat("R%X%X", regnum * 2, regnum * 2 + 1).c_str(), m_R[regnum]);
}
for (int addrnum = 0; addrnum < 4; addrnum++)
{
- state_add(I4004_ADDR1 + addrnum, strformat(tempstr, "ADDR%d", addrnum + 1).c_str(), m_ADDR[addrnum].w.l).mask(0xfff);
+ state_add(I4004_ADDR1 + addrnum, strformat("ADDR%d", addrnum + 1).c_str(), m_ADDR[addrnum].w.l).mask(0xfff);
}
state_add(I4004_RAM, "RAM", m_RAM.w.l).mask(0x0fff);
@@ -507,7 +506,7 @@ void i4004_cpu_device::state_export(const device_state_entry &entry)
}
}
-void i4004_cpu_device::state_string_export(const device_state_entry &entry, std::string &str)
+void i4004_cpu_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/i4004/i4004.h b/src/devices/cpu/i4004/i4004.h
index 3bdc7cddcfd..fd60a9a5d10 100644
--- a/src/devices/cpu/i4004/i4004.h
+++ b/src/devices/cpu/i4004/i4004.h
@@ -57,7 +57,7 @@ protected:
// device_state_interface overrides
virtual void state_import(const device_state_entry &entry) override;
virtual void state_export(const device_state_entry &entry) override;
- virtual void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 1; }
diff --git a/src/devices/cpu/i8008/i8008.cpp b/src/devices/cpu/i8008/i8008.cpp
index 319e6ccd56b..6baeacfe7bb 100644
--- a/src/devices/cpu/i8008/i8008.cpp
+++ b/src/devices/cpu/i8008/i8008.cpp
@@ -92,9 +92,8 @@ void i8008_device::device_start()
state_add(I8008_H, "H", m_H);
state_add(I8008_L, "L", m_L);
- std::string tempstr;
for (int addrnum = 0; addrnum < 8; addrnum++)
- state_add(I8008_ADDR1 + addrnum, strformat(tempstr, "ADDR%d", addrnum + 1).c_str(), m_ADDR[addrnum].w.l).mask(0xfff);
+ state_add(I8008_ADDR1 + addrnum, strformat("ADDR%d", addrnum + 1).c_str(), m_ADDR[addrnum].w.l).mask(0xfff);
init_tables();
}
@@ -187,7 +186,7 @@ void i8008_device::state_export(const device_state_entry &entry)
// for the debugger
//-------------------------------------------------
-void i8008_device::state_string_export(const device_state_entry &entry, std::string &str)
+void i8008_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/i8008/i8008.h b/src/devices/cpu/i8008/i8008.h
index 35b9c0b41ad..74c727290eb 100644
--- a/src/devices/cpu/i8008/i8008.h
+++ b/src/devices/cpu/i8008/i8008.h
@@ -48,7 +48,7 @@ protected:
// device_state_interface overrides
virtual void state_import(const device_state_entry &entry) override;
virtual void state_export(const device_state_entry &entry) override;
- virtual void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
diff --git a/src/devices/cpu/i8085/i8085.cpp b/src/devices/cpu/i8085/i8085.cpp
index 53c2ca603c2..308de09e4a1 100644
--- a/src/devices/cpu/i8085/i8085.cpp
+++ b/src/devices/cpu/i8085/i8085.cpp
@@ -395,7 +395,7 @@ void i8085a_cpu_device::check_for_interrupts()
/* followed by classic INTR */
else if (m_irq_state[I8085_INTR_LINE] && (m_IM & IM_IE))
{
- UINT32 vector = 0;
+ UINT32 vector;
/* break out of HALT state and call the IRQ ack callback */
break_halt_for_interrupt();
@@ -1048,7 +1048,7 @@ void i8085a_cpu_device::state_export(const device_state_entry &entry)
}
}
-void i8085a_cpu_device::state_string_export(const device_state_entry &entry, std::string &str)
+void i8085a_cpu_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/i8085/i8085.h b/src/devices/cpu/i8085/i8085.h
index 59d630393db..9a866577ca6 100644
--- a/src/devices/cpu/i8085/i8085.h
+++ b/src/devices/cpu/i8085/i8085.h
@@ -85,9 +85,9 @@ protected:
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override { return (spacenum == AS_PROGRAM) ? &m_program_config : ( (spacenum == AS_IO) ? &m_io_config : nullptr ); }
// device_state_interface overrides
- void state_string_export(const device_state_entry &entry, std::string &str) override;
- void state_export(const device_state_entry &entry) override;
- void state_import(const device_state_entry &entry) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
+ virtual void state_export(const device_state_entry &entry) override;
+ virtual void state_import(const device_state_entry &entry) override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 1; }
diff --git a/src/devices/cpu/i8089/i8089.cpp b/src/devices/cpu/i8089/i8089.cpp
index 7e4c09485a8..22494cfdd2f 100644
--- a/src/devices/cpu/i8089/i8089.cpp
+++ b/src/devices/cpu/i8089/i8089.cpp
@@ -158,9 +158,9 @@ offs_t i8089_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 *op
// for the debugger
//-------------------------------------------------
-void i8089_device::state_string_export(const device_state_entry &entry, std::string &str)
+void i8089_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
- i8089_channel *ch = m_ch1;
+ const i8089_channel *ch = m_ch1;
if (entry.index() >= CH2_GA && entry.index() <= CH2_PSW)
ch = m_ch2;
@@ -286,7 +286,7 @@ UINT8 i8089_device::read_byte(bool space, offs_t address)
UINT16 i8089_device::read_word(bool space, offs_t address)
{
- UINT16 data = 0xffff;
+ UINT16 data;
address_space *aspace = (space ? m_io : m_mem);
if (sysbus_width() && !(address & 1))
diff --git a/src/devices/cpu/i8089/i8089.h b/src/devices/cpu/i8089/i8089.h
index 66477c4e6c3..e4100b8fa94 100644
--- a/src/devices/cpu/i8089/i8089.h
+++ b/src/devices/cpu/i8089/i8089.h
@@ -88,15 +88,15 @@ protected:
virtual offs_t disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options) override;
// device_state_interface overrides
- virtual void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// optional information overrides
virtual machine_config_constructor device_mconfig_additions() const override;
private:
- bool sysbus_width() { return BIT(m_sysbus, 0); }
- bool remotebus_width() { return BIT(m_soc, 0); }
- bool request_grant() { return BIT(m_soc, 1); }
+ bool sysbus_width() const { return BIT(m_sysbus, 0); }
+ bool remotebus_width() const { return BIT(m_soc, 0); }
+ bool request_grant() const { return BIT(m_soc, 1); }
UINT8 read_byte(bool space, offs_t address);
UINT16 read_word(bool space, offs_t address);
diff --git a/src/devices/cpu/i86/i286.cpp b/src/devices/cpu/i86/i286.cpp
index 637f9cc1e47..9f79007506a 100644
--- a/src/devices/cpu/i86/i286.cpp
+++ b/src/devices/cpu/i86/i286.cpp
@@ -277,12 +277,12 @@ void i80286_cpu_device::device_start()
m_out_shutdown_func.resolve_safe();
}
-void i80286_cpu_device::state_string_export(const device_state_entry &entry, std::string &str)
+void i80286_cpu_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
case STATE_GENPC:
- strprintf(str, "%08X", pc());
+ strprintf(str, "%08X", m_base[CS] + m_ip);
break;
case STATE_GENFLAGS:
@@ -1970,7 +1970,7 @@ UINT16 i80286_cpu_device::far_return(int iret, int bytes)
void i80286_cpu_device::check_permission(UINT8 check_seg, UINT32 offset, UINT16 size, int operation)
{
- int trap = 0;
+ int trap;
UINT8 rights;
if(PM)
{
diff --git a/src/devices/cpu/i86/i286.h b/src/devices/cpu/i86/i286.h
index 62ee771ac0a..8df1bf43d94 100644
--- a/src/devices/cpu/i86/i286.h
+++ b/src/devices/cpu/i86/i286.h
@@ -77,7 +77,7 @@ protected:
virtual void execute_run() override;
virtual void device_reset() override;
virtual void device_start() override;
- virtual void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
virtual UINT32 execute_input_lines() const override { return 1; }
virtual void execute_set_input(int inputnum, int state) override;
bool memory_translate(address_spacenum spacenum, int intention, offs_t &address) override;
diff --git a/src/devices/cpu/i86/i86.cpp b/src/devices/cpu/i86/i86.cpp
index 70af764f1a2..28669d16563 100644
--- a/src/devices/cpu/i86/i86.cpp
+++ b/src/devices/cpu/i86/i86.cpp
@@ -144,7 +144,7 @@ void i8086_cpu_device::execute_run()
m_seg_prefix = false;
/* Dispatch IRQ */
- if ( m_pending_irq && m_no_interrupt == 0 )
+ if ( m_pending_irq && (m_no_interrupt == 0) )
{
if ( m_pending_irq & NMI_IRQ )
{
@@ -159,25 +159,29 @@ void i8086_cpu_device::execute_run()
}
}
- /* No interrupt allowed between last instruction and this one */
- if ( m_no_interrupt )
+ /* Trap should allow one instruction to be executed.
+ CPUID.ASM (by Bob Smith, 1985) suggests that in situations where m_no_interrupt is 1,
+ (directly after POP SS / MOV_SREG), single step IRQs don't fire.
+ */
+ if (m_fire_trap )
{
- m_no_interrupt--;
- }
-
- /* trap should allow one instruction to be executed */
- if ( m_fire_trap )
- {
- if ( m_fire_trap >= 2 )
+ if ( (m_fire_trap >= 2) && (m_no_interrupt == 0) )
{
+ m_fire_trap = 0; // reset trap flag upon entry
interrupt(1);
- m_fire_trap = 0;
}
else
{
m_fire_trap++;
}
}
+
+ /* No interrupt allowed between last instruction and this one */
+ if ( m_no_interrupt )
+ {
+ m_no_interrupt--;
+ }
+
}
if (!m_seg_prefix)
@@ -314,12 +318,12 @@ i8086_common_cpu_device::i8086_common_cpu_device(const machine_config &mconfig,
memset(m_sregs, 0x00, sizeof(m_sregs));
}
-void i8086_common_cpu_device::state_string_export(const device_state_entry &entry, std::string &str)
+void i8086_common_cpu_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
case STATE_GENPC:
- strprintf(str, "%08X", pc());
+ strprintf(str, "%08X", (m_sregs[CS] << 4) + m_ip);
break;
case STATE_GENFLAGS:
@@ -1404,6 +1408,7 @@ bool i8086_common_cpu_device::common_op(UINT8 op)
m_src = GetRMWord();
m_sregs[(m_modrm & 0x18) >> 3] = m_src; // confirmed on hw: modrm bit 5 ignored
CLKM(MOV_SR,MOV_SM);
+ m_no_interrupt = 1; // Disable IRQ after load segment register.
break;
case 0x8f: // i_popw
diff --git a/src/devices/cpu/i86/i86.h b/src/devices/cpu/i86/i86.h
index a142d6672f2..978fa7d1690 100644
--- a/src/devices/cpu/i86/i86.h
+++ b/src/devices/cpu/i86/i86.h
@@ -127,7 +127,7 @@ protected:
virtual offs_t disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options) override;
// device_state_interface overrides
- virtual void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
virtual void interrupt(int int_num, int trap = 1);
bool common_op(UINT8 op);
@@ -192,7 +192,7 @@ protected:
inline void set_OFB_Add(UINT32 x,UINT32 y,UINT32 z);
inline void set_OFW_Sub(UINT32 x,UINT32 y,UINT32 z);
inline void set_OFB_Sub(UINT32 x,UINT32 y,UINT32 z);
- inline UINT16 CompressFlags();
+ inline UINT16 CompressFlags() const;
inline void ExpandFlags(UINT16 f);
// rep instructions
diff --git a/src/devices/cpu/i86/i86inline.h b/src/devices/cpu/i86/i86inline.h
index d848e336e35..8a9ad703fec 100644
--- a/src/devices/cpu/i86/i86inline.h
+++ b/src/devices/cpu/i86/i86inline.h
@@ -504,7 +504,7 @@ inline void i8086_common_cpu_device::set_OFB_Sub(UINT32 x,UINT32 y,UINT32 z)
}
-inline UINT16 i8086_common_cpu_device::CompressFlags()
+inline UINT16 i8086_common_cpu_device::CompressFlags() const
{
return (CF ? 1 : 0)
| (1 << 1)
diff --git a/src/devices/cpu/i860/i860.cpp b/src/devices/cpu/i860/i860.cpp
index d9b8e43f1cb..4a02ab51dd6 100644
--- a/src/devices/cpu/i860/i860.cpp
+++ b/src/devices/cpu/i860/i860.cpp
@@ -36,7 +36,7 @@ const device_type I860 = &device_creator<i860_cpu_device>;
i860_cpu_device::i860_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: cpu_device(mconfig, I860, "i860XR", tag, owner, clock, "i860xr", __FILE__)
- , m_program_config("program", ENDIANNESS_LITTLE, 64, 32, 0), m_pc(0), m_merge(0), m_pin_bus_hold(0), m_pin_reset(0), m_exiting_readmem(0), m_exiting_ifetch(0), m_pc_updated(0), m_pending_trap(0), m_fir_gets_trap_addr(0), m_single_stepping(0), m_program(nullptr), m_ppc(0), m_icount(0)
+ , m_program_config("program", ENDIANNESS_LITTLE, 64, 32, 0), m_pc(0), m_merge(0), m_pin_bus_hold(0), m_pin_reset(0), m_exiting_readmem(0), m_exiting_ifetch(0), m_pc_updated(0), m_pending_trap(0), m_fir_gets_trap_addr(0), m_single_stepping(0), m_program(nullptr), m_icount(0)
{
}
diff --git a/src/devices/cpu/i860/i860.h b/src/devices/cpu/i860/i860.h
index fc9b5b83abf..248cab2d4ba 100644
--- a/src/devices/cpu/i860/i860.h
+++ b/src/devices/cpu/i860/i860.h
@@ -200,7 +200,6 @@ private:
* MAME-specific stuff.
*/
address_space *m_program;
- UINT32 m_ppc;
int m_icount;
// For debugger
UINT32 m_freg[32];
@@ -208,8 +207,6 @@ private:
void writememi_emu (UINT32 addr, int size, UINT32 data);
void fp_readmem_emu (UINT32 addr, int size, UINT8 *dest);
void fp_writemem_emu (UINT32 addr, int size, UINT8 *data, UINT32 wmask);
- void dump_pipe (int type);
- void dump_state ();
void unrecog_opcode (UINT32 pc, UINT32 insn);
void insn_ld_ctrl (UINT32 insn);
void insn_st_ctrl (UINT32 insn);
@@ -278,8 +275,6 @@ private:
void insn_faddp (UINT32 insn);
void insn_faddz (UINT32 insn);
void decode_exec (UINT32 insn, UINT32 non_shadow);
- void disasm (UINT32 addr, int len);
- void dbg_db (UINT32 addr, int len);
float get_fregval_s (int fr);
double get_fregval_d (int fr);
void set_fregval_s (int fr, float s);
diff --git a/src/devices/cpu/i860/i860dis.cpp b/src/devices/cpu/i860/i860dis.cpp
index b158221ddc8..85851817c22 100644
--- a/src/devices/cpu/i860/i860dis.cpp
+++ b/src/devices/cpu/i860/i860dis.cpp
@@ -243,7 +243,7 @@ static void int_ldx(char *buf, char *mnemonic, UINT32 pc, UINT32 insn)
/* Operand size, in bytes. */
int sizes[4] = { 1, 1, 2, 4 };
const char *const suffix[4] = { "b", "b", "s", "l" };
- UINT32 idx = 0;
+ UINT32 idx;
/* Bits 28 and 0 determine the operand size. */
idx = ((insn >> 27) & 2) | (insn & 1);
@@ -270,7 +270,7 @@ static void int_stx(char *buf, char *mnemonic, UINT32 pc, UINT32 insn)
/* Operand size, in bytes. */
int sizes[4] = { 1, 1, 2, 4 };
const char *const suffix[4] = { "b", "b", "s", "l" };
- int idx = 0;
+ int idx;
int size;
INT32 immsrc = sign_ext ((((insn >> 5) & 0xf800) | (insn & 0x07ff)), 16);
@@ -297,8 +297,8 @@ static void int_fldst(char *buf, char *mnemonic, UINT32 pc, UINT32 insn)
/* Operand size, in bytes. */
int sizes[4] = { 8, 4, 16, 4 };
const char *const suffix[4] = { "d", "l", "q", "l" };
- int idx = 0;
- int size = 0;
+ int idx;
+ int size;
int auto_inc = (insn & 1);
const char *const auto_suff[2] = { "", "++" };
int piped = (insn & 0x40000000) >> 29;
diff --git a/src/devices/cpu/i960/i960.cpp b/src/devices/cpu/i960/i960.cpp
index d2bb39e709c..224b844387c 100644
--- a/src/devices/cpu/i960/i960.cpp
+++ b/src/devices/cpu/i960/i960.cpp
@@ -2081,7 +2081,7 @@ void i960_cpu_device::device_start()
m_icountptr = &m_icount;
}
-void i960_cpu_device::state_string_export(const device_state_entry &entry, std::string &str)
+void i960_cpu_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
static const char *const conditions[8] =
{
diff --git a/src/devices/cpu/i960/i960.h b/src/devices/cpu/i960/i960.h
index 833ae7d741a..3f26fbb46d1 100644
--- a/src/devices/cpu/i960/i960.h
+++ b/src/devices/cpu/i960/i960.h
@@ -95,7 +95,7 @@ protected:
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override { return (spacenum == AS_PROGRAM) ? &m_program_config : nullptr; }
// device_state_interface overrides
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 4; }
diff --git a/src/devices/cpu/ie15/ie15.cpp b/src/devices/cpu/ie15/ie15.cpp
index 95851497236..87de1cb2217 100644
--- a/src/devices/cpu/ie15/ie15.cpp
+++ b/src/devices/cpu/ie15/ie15.cpp
@@ -64,9 +64,8 @@ void ie15_device::device_start()
state_add(STATE_GENFLAGS,"GENFLAGS", m_flags).mask(0x0f).callimport().callexport().noshow().formatstr("%4s");
state_add(IE15_A, "A", m_A);
- std::string tempstring;
for (int ireg = 0; ireg < 32; ireg++)
- state_add(IE15_R0 + ireg, strformat(tempstring, "R%d", ireg).c_str(), m_REGS[ireg]);
+ state_add(IE15_R0 + ireg, strformat("R%d", ireg).c_str(), m_REGS[ireg]);
}
//-------------------------------------------------
@@ -133,7 +132,7 @@ void ie15_device::state_export(const device_state_entry &entry)
// for the debugger
//-------------------------------------------------
-void ie15_device::state_string_export(const device_state_entry &entry, std::string &str)
+void ie15_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/ie15/ie15.h b/src/devices/cpu/ie15/ie15.h
index a68b7acbd15..ce5cb46bf81 100644
--- a/src/devices/cpu/ie15/ie15.h
+++ b/src/devices/cpu/ie15/ie15.h
@@ -48,7 +48,7 @@ protected:
// device_state_interface overrides
virtual void state_import(const device_state_entry &entry) override;
virtual void state_export(const device_state_entry &entry) override;
- virtual void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override;
diff --git a/src/devices/cpu/jaguar/jaguar.cpp b/src/devices/cpu/jaguar/jaguar.cpp
index 0a3d1e92741..000d6375cce 100644
--- a/src/devices/cpu/jaguar/jaguar.cpp
+++ b/src/devices/cpu/jaguar/jaguar.cpp
@@ -78,10 +78,6 @@
PRIVATE GLOBAL VARIABLES
***************************************************************************/
-static UINT32 table_refcount = 0;
-static UINT16 * mirror_table;
-static UINT8 * condition_table;
-
const UINT32 jaguar_cpu_device::convert_zero[32] =
{ 32,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 };
@@ -150,6 +146,7 @@ jaguar_cpu_device::jaguar_cpu_device(const machine_config &mconfig, device_type
, m_isdsp(isdsp)
, m_cpu_interrupt(*this)
, m_tables_referenced(false)
+ , table_refcount(0)
, m_table(isdsp ? dsp_op_table : gpu_op_table)
{
if (isdsp)
@@ -291,7 +288,7 @@ void jaguar_cpu_device::init_tables()
}
/* fill in the mirror table */
- mirror_table = global_alloc_array(UINT16, 65536);
+ mirror_table = std::make_unique<UINT16[]>(65536);
for (i = 0; i < 65536; i++)
mirror_table[i] = ((i >> 15) & 0x0001) | ((i >> 13) & 0x0002) |
((i >> 11) & 0x0004) | ((i >> 9) & 0x0008) |
@@ -303,7 +300,7 @@ void jaguar_cpu_device::init_tables()
((i << 13) & 0x4000) | ((i << 15) & 0x8000);
/* fill in the condition table */
- condition_table = global_alloc_array(UINT8, 32 * 8);
+ condition_table = std::make_unique<UINT8[]>(32 * 8);
for (i = 0; i < 8; i++)
for (j = 0; j < 32; j++)
{
@@ -403,7 +400,7 @@ void jaguar_cpu_device::device_start()
}
-void jaguar_cpu_device::state_string_export(const device_state_entry &entry, std::string &str)
+void jaguar_cpu_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
@@ -440,12 +437,7 @@ jaguar_cpu_device::~jaguar_cpu_device()
if (--table_refcount != 0)
return;
- if (mirror_table != nullptr)
- global_free_array(mirror_table);
mirror_table = nullptr;
-
- if (condition_table != nullptr)
- global_free_array(condition_table);
condition_table = nullptr;
}
diff --git a/src/devices/cpu/jaguar/jaguar.h b/src/devices/cpu/jaguar/jaguar.h
index 49f6e48d5c7..cc2e8938961 100644
--- a/src/devices/cpu/jaguar/jaguar.h
+++ b/src/devices/cpu/jaguar/jaguar.h
@@ -127,7 +127,7 @@ protected:
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override { return (spacenum == AS_PROGRAM) ? &m_program_config : nullptr; }
// device_state_interface overrides
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 2; }
@@ -164,6 +164,10 @@ protected:
static const UINT32 convert_zero[32];
bool m_tables_referenced;
+ UINT32 table_refcount;
+ std::unique_ptr<UINT16[]> mirror_table;
+ std::unique_ptr<UINT8[]> condition_table;
+
const op_func *m_table;
void abs_rn(UINT16 op);
diff --git a/src/devices/cpu/lc8670/lc8670.cpp b/src/devices/cpu/lc8670/lc8670.cpp
index c7af2b69546..d24b3f64775 100644
--- a/src/devices/cpu/lc8670/lc8670.cpp
+++ b/src/devices/cpu/lc8670/lc8670.cpp
@@ -369,7 +369,7 @@ void lc8670_cpu_device::state_import(const device_state_entry &entry)
// for the debugger
//-------------------------------------------------
-void lc8670_cpu_device::state_string_export(const device_state_entry &entry, std::string &str)
+void lc8670_cpu_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
@@ -418,7 +418,7 @@ void lc8670_cpu_device::execute_run()
debugger_instruction_hook(this, m_pc);
- int cycles = 0;
+ int cycles;
m_ppc = m_pc;
if (REG_PCON & HALT_MODE)
@@ -1135,7 +1135,7 @@ inline UINT8 lc8670_cpu_device::pop()
inline UINT16 lc8670_cpu_device::get_addr()
{
int mode = m_op & 0x0f;
- UINT16 addr = 0;
+ UINT16 addr;
if (mode > 0x01 && mode <= 0x03)
addr = GET_D9;
@@ -1150,7 +1150,7 @@ inline UINT16 lc8670_cpu_device::get_addr()
inline UINT8 lc8670_cpu_device::get_data()
{
int mode = m_op & 0x0f;
- UINT8 data = 0;
+ UINT8 data;
if (mode == 0x01)
data = GET_I8;
@@ -1217,7 +1217,7 @@ inline void lc8670_cpu_device::set_irq_flag(int source)
int lc8670_cpu_device::decode_op(UINT8 op)
{
- int idx = 0;
+ int idx;
switch (op & 0x0f)
{
case 0: case 1:
diff --git a/src/devices/cpu/lc8670/lc8670.h b/src/devices/cpu/lc8670/lc8670.h
index 6d2522dcef4..e6211a4522f 100644
--- a/src/devices/cpu/lc8670/lc8670.h
+++ b/src/devices/cpu/lc8670/lc8670.h
@@ -110,7 +110,7 @@ protected:
// device_state_interface overrides
virtual void state_import(const device_state_entry &entry) override;
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_memory_interface overrides
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override;
diff --git a/src/devices/cpu/lh5801/lh5801.cpp b/src/devices/cpu/lh5801/lh5801.cpp
index 0287e0d0859..2e748c63905 100644
--- a/src/devices/cpu/lh5801/lh5801.cpp
+++ b/src/devices/cpu/lh5801/lh5801.cpp
@@ -142,7 +142,7 @@ void lh5801_cpu_device::device_start()
m_icountptr = &m_icount;
}
-void lh5801_cpu_device::state_string_export(const device_state_entry &entry, std::string &str)
+void lh5801_cpu_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/lh5801/lh5801.h b/src/devices/cpu/lh5801/lh5801.h
index ff47135b262..fe6f3c44f63 100644
--- a/src/devices/cpu/lh5801/lh5801.h
+++ b/src/devices/cpu/lh5801/lh5801.h
@@ -90,7 +90,7 @@ protected:
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override { return (spacenum == AS_PROGRAM) ? &m_program_config : ( (spacenum == AS_IO) ? &m_io_config : nullptr ); }
// device_state_interface overrides
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 1; }
diff --git a/src/devices/cpu/lr35902/lr35902.cpp b/src/devices/cpu/lr35902/lr35902.cpp
index 02cb785e1ff..8f365c18c54 100644
--- a/src/devices/cpu/lr35902/lr35902.cpp
+++ b/src/devices/cpu/lr35902/lr35902.cpp
@@ -180,7 +180,7 @@ void lr35902_cpu_device::device_start()
}
-void lr35902_cpu_device::state_string_export(const device_state_entry &entry, std::string &str)
+void lr35902_cpu_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/lr35902/lr35902.h b/src/devices/cpu/lr35902/lr35902.h
index 0a9999ba10c..74ad24d07f8 100644
--- a/src/devices/cpu/lr35902/lr35902.h
+++ b/src/devices/cpu/lr35902/lr35902.h
@@ -70,7 +70,7 @@ protected:
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override { return (spacenum == AS_PROGRAM) ? &m_program_config : nullptr; }
// device_state_interface overrides
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 1; }
diff --git a/src/devices/cpu/lr35902/lr35902d.cpp b/src/devices/cpu/lr35902/lr35902d.cpp
index 8fe9bf8977a..3458c5094e6 100644
--- a/src/devices/cpu/lr35902/lr35902d.cpp
+++ b/src/devices/cpu/lr35902/lr35902d.cpp
@@ -195,9 +195,9 @@ CPU_DISASSEMBLE( lr35902 )
const lr35902dasm *d;
const char /* *symbol,*/ *src;
char *dst;
- INT8 offset = 0;
+ INT8 offset;
UINT8 op, op1;
- UINT16 ea = 0;
+ UINT16 ea;
int pos = 0;
dst = buffer;
diff --git a/src/devices/cpu/m37710/m37710.cpp b/src/devices/cpu/m37710/m37710.cpp
index 26a2accfe76..43568915dce 100644
--- a/src/devices/cpu/m37710/m37710.cpp
+++ b/src/devices/cpu/m37710/m37710.cpp
@@ -1136,7 +1136,7 @@ void m37710_cpu_device::state_export(const device_state_entry &entry)
}
-void m37710_cpu_device::state_string_export(const device_state_entry &entry, std::string &str)
+void m37710_cpu_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/m37710/m37710.h b/src/devices/cpu/m37710/m37710.h
index 1f085da0c1f..e88408e527a 100644
--- a/src/devices/cpu/m37710/m37710.h
+++ b/src/devices/cpu/m37710/m37710.h
@@ -117,7 +117,7 @@ protected:
// device_state_interface overrides
virtual void state_import(const device_state_entry &entry) override;
virtual void state_export(const device_state_entry &entry) override;
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 1; }
diff --git a/src/devices/cpu/m6502/m6502.cpp b/src/devices/cpu/m6502/m6502.cpp
index eae369f4960..0ecd12258f1 100644
--- a/src/devices/cpu/m6502/m6502.cpp
+++ b/src/devices/cpu/m6502/m6502.cpp
@@ -439,7 +439,7 @@ void m6502_device::state_export(const device_state_entry &entry)
{
}
-void m6502_device::state_string_export(const device_state_entry &entry, std::string &str)
+void m6502_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch(entry.index()) {
case STATE_GENFLAGS:
diff --git a/src/devices/cpu/m6502/m6502.h b/src/devices/cpu/m6502/m6502.h
index 6f5ef092891..b8f8b16a6dd 100644
--- a/src/devices/cpu/m6502/m6502.h
+++ b/src/devices/cpu/m6502/m6502.h
@@ -144,7 +144,7 @@ protected:
// device_state_interface overrides
virtual void state_import(const device_state_entry &entry) override;
virtual void state_export(const device_state_entry &entry) override;
- virtual void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override;
diff --git a/src/devices/cpu/m6502/m6510.h b/src/devices/cpu/m6502/m6510.h
index be555b866df..dbd0132baff 100644
--- a/src/devices/cpu/m6502/m6510.h
+++ b/src/devices/cpu/m6502/m6510.h
@@ -25,7 +25,6 @@ public:
m6510_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source);
UINT8 get_port();
- void set_port(UINT8 val);
void set_pulls(UINT8 pullup, UINT8 pulldown);
template<class _read, class _write> void set_callbacks(_read rd, _write wr) {
diff --git a/src/devices/cpu/m6502/m65ce02.cpp b/src/devices/cpu/m6502/m65ce02.cpp
index fdedc99369d..01f6fe34b2f 100644
--- a/src/devices/cpu/m6502/m65ce02.cpp
+++ b/src/devices/cpu/m6502/m65ce02.cpp
@@ -75,7 +75,7 @@ void m65ce02_device::state_export(const device_state_entry &entry)
{
}
-void m65ce02_device::state_string_export(const device_state_entry &entry, std::string &str)
+void m65ce02_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch(entry.index()) {
case STATE_GENFLAGS:
diff --git a/src/devices/cpu/m6502/m65ce02.h b/src/devices/cpu/m6502/m65ce02.h
index 3b5dc800954..d0d457d313c 100644
--- a/src/devices/cpu/m6502/m65ce02.h
+++ b/src/devices/cpu/m6502/m65ce02.h
@@ -34,7 +34,7 @@ protected:
virtual void device_reset() override;
virtual void state_import(const device_state_entry &entry) override;
virtual void state_export(const device_state_entry &entry) override;
- virtual void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
inline void dec_SP_ce() { if(P & F_E) SP = set_l(SP, SP-1); else SP--; }
inline void inc_SP_ce() { if(P & F_E) SP = set_l(SP, SP+1); else SP++; }
diff --git a/src/devices/cpu/m6502/m740.cpp b/src/devices/cpu/m6502/m740.cpp
index 4987b26e31a..061f6dd75c7 100644
--- a/src/devices/cpu/m6502/m740.cpp
+++ b/src/devices/cpu/m6502/m740.cpp
@@ -53,7 +53,7 @@ void m740_device::device_reset()
SP = 0x00ff;
}
-void m740_device::state_string_export(const device_state_entry &entry, std::string &str)
+void m740_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch(entry.index()) {
case STATE_GENFLAGS:
diff --git a/src/devices/cpu/m6502/m740.h b/src/devices/cpu/m6502/m740.h
index c08eda19609..7f312b256cd 100644
--- a/src/devices/cpu/m6502/m740.h
+++ b/src/devices/cpu/m6502/m740.h
@@ -44,7 +44,7 @@ public:
static const disasm_entry disasm_entries[0x200];
- virtual void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
virtual offs_t disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options) override;
virtual void do_exec_full() override;
diff --git a/src/devices/cpu/m6800/m6800.cpp b/src/devices/cpu/m6800/m6800.cpp
index 302ba478445..84d3b8d03e2 100644
--- a/src/devices/cpu/m6800/m6800.cpp
+++ b/src/devices/cpu/m6800/m6800.cpp
@@ -1140,7 +1140,7 @@ void m6800_cpu_device::device_start()
m_icountptr = &m_icount;
}
-void m6800_cpu_device::state_string_export(const device_state_entry &entry, std::string &str)
+void m6800_cpu_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/m6800/m6800.h b/src/devices/cpu/m6800/m6800.h
index 45c24d2e039..bb6055e8ad0 100644
--- a/src/devices/cpu/m6800/m6800.h
+++ b/src/devices/cpu/m6800/m6800.h
@@ -87,7 +87,7 @@ protected:
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override;
// device_state_interface overrides
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 1; }
diff --git a/src/devices/cpu/m68000/m68000.h b/src/devices/cpu/m68000/m68000.h
index 4fb372fdf12..013627ac6c0 100644
--- a/src/devices/cpu/m68000/m68000.h
+++ b/src/devices/cpu/m68000/m68000.h
@@ -396,7 +396,7 @@ public:
// device_state_interface overrides
virtual void state_import(const device_state_entry &entry) override;
virtual void state_export(const device_state_entry &entry) override;
- virtual void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_memory_interface overrides
virtual bool memory_translate(address_spacenum space, int intention, offs_t &address) override;
diff --git a/src/devices/cpu/m68000/m68k_in.cpp b/src/devices/cpu/m68000/m68k_in.cpp
index 9bdc9558a83..df98a736226 100644
--- a/src/devices/cpu/m68000/m68k_in.cpp
+++ b/src/devices/cpu/m68000/m68k_in.cpp
@@ -81,7 +81,8 @@ must fix:
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
M68KMAKE_PROTOTYPE_HEADER
-
+// license:BSD-3-Clause
+// copyright-holders:Karl Stenerud
/* ======================================================================== */
/* ============================ OPCODE HANDLERS =========================== */
/* ======================================================================== */
@@ -139,7 +140,7 @@ static const opcode_handler_struct m68k_opcode_handler_table[] =
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
M68KMAKE_TABLE_FOOTER
- {0, 0, 0, {0, 0, 0, 0, 0}}
+ {nullptr, 0, 0, {0, 0, 0, 0, 0}}
};
@@ -2959,9 +2960,9 @@ M68KMAKE_OP(bfins, 32, ., .)
if((width + offset) > 32)
{
mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset);
- insert_byte = MASK_OUT_ABOVE_8(insert_base);
+ insert_byte = MASK_OUT_ABOVE_8(insert_base) << (8-offset);
data_byte = m68ki_read_8((mc68kcpu), ea+4);
- (mc68kcpu)->not_z_flag |= (data_byte & mask_byte);
+ (mc68kcpu)->not_z_flag |= (insert_byte & mask_byte);
m68ki_write_8((mc68kcpu), ea+4, (data_byte & ~mask_byte) | insert_byte);
}
return;
@@ -3315,7 +3316,7 @@ M68KMAKE_OP(callm, 32, ., .)
m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */
REG_PC(mc68kcpu) += 2;
(void)ea; /* just to avoid an 'unused variable' warning */
- logerror("%s at %08x: called unimplemented instruction %04x (callm)\n",
+ mc68kcpu->logerror("%s at %08x: called unimplemented instruction %04x (callm)\n",
(mc68kcpu)->tag(), REG_PC(mc68kcpu) - 2, (mc68kcpu)->ir);
return;
}
@@ -4414,7 +4415,7 @@ M68KMAKE_OP(cpbcc, 32, ., .)
{
if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type))
{
- logerror("%s at %08x: called unimplemented instruction %04x (cpbcc)\n",
+ mc68kcpu->logerror("%s at %08x: called unimplemented instruction %04x (cpbcc)\n",
(mc68kcpu)->tag(), REG_PC(mc68kcpu) - 2, (mc68kcpu)->ir);
return;
}
@@ -4426,7 +4427,7 @@ M68KMAKE_OP(cpdbcc, 32, ., .)
{
if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type))
{
- logerror("%s at %08x: called unimplemented instruction %04x (cpdbcc)\n",
+ mc68kcpu->logerror("%s at %08x: called unimplemented instruction %04x (cpdbcc)\n",
(mc68kcpu)->tag(), REG_PC(mc68kcpu) - 2, (mc68kcpu)->ir);
return;
}
@@ -4438,7 +4439,7 @@ M68KMAKE_OP(cpgen, 32, ., .)
{
if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type) && (mc68kcpu->has_fpu || mc68kcpu->has_pmmu))
{
- logerror("%s at %08x: called unimplemented instruction %04x (cpgen)\n",
+ mc68kcpu->logerror("%s at %08x: called unimplemented instruction %04x (cpgen)\n",
(mc68kcpu)->tag(), REG_PC(mc68kcpu) - 2, (mc68kcpu)->ir);
return;
}
@@ -4450,7 +4451,7 @@ M68KMAKE_OP(cpscc, 32, ., .)
{
if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type))
{
- logerror("%s at %08x: called unimplemented instruction %04x (cpscc)\n",
+ mc68kcpu->logerror("%s at %08x: called unimplemented instruction %04x (cpscc)\n",
(mc68kcpu)->tag(), REG_PC(mc68kcpu) - 2, (mc68kcpu)->ir);
return;
}
@@ -4462,7 +4463,7 @@ M68KMAKE_OP(cptrapcc, 32, ., .)
{
if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type))
{
- logerror("%s at %08x: called unimplemented instruction %04x (cptrapcc)\n",
+ mc68kcpu->logerror("%s at %08x: called unimplemented instruction %04x (cptrapcc)\n",
(mc68kcpu)->tag(), REG_PC(mc68kcpu) - 2, (mc68kcpu)->ir);
return;
}
@@ -6827,7 +6828,7 @@ M68KMAKE_OP(movec, 32, rc, .)
(mc68kcpu)->cacr = REG_DA(mc68kcpu)[(word2 >> 12) & 15] & 0x0f;
}
-// logerror("movec to cacr=%04x\n", (mc68kcpu)->cacr);
+// mc68kcpu->logerror("movec to cacr=%04x\n", (mc68kcpu)->cacr);
if ((mc68kcpu)->cacr & (M68K_CACR_CI | M68K_CACR_CEI))
{
m68ki_ic_clear(mc68kcpu);
@@ -8239,7 +8240,7 @@ M68KMAKE_OP(pflusha, 32, ., .)
{
if ((CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) && ((mc68kcpu)->has_pmmu))
{
- logerror("68040: unhandled PFLUSHA (ir=%04x)\n", mc68kcpu->ir);
+ mc68kcpu->logerror("68040: unhandled PFLUSHA (ir=%04x)\n", mc68kcpu->ir);
return;
}
m68ki_exception_1111(mc68kcpu);
@@ -8249,7 +8250,7 @@ M68KMAKE_OP(pflushan, 32, ., .)
{
if ((CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) && ((mc68kcpu)->has_pmmu))
{
- logerror("68040: unhandled PFLUSHAN (ir=%04x)\n", mc68kcpu->ir);
+ mc68kcpu->logerror("68040: unhandled PFLUSHAN (ir=%04x)\n", mc68kcpu->ir);
return;
}
m68ki_exception_1111(mc68kcpu);
@@ -8271,7 +8272,7 @@ M68KMAKE_OP(ptest, 32, ., .)
{
if ((CPU_TYPE_IS_040_PLUS((mc68kcpu)->cpu_type)) && ((mc68kcpu)->has_pmmu))
{
- logerror("68040: unhandled PTEST\n");
+ mc68kcpu->logerror("68040: unhandled PTEST\n");
return;
}
else
@@ -9151,7 +9152,7 @@ M68KMAKE_OP(rtm, 32, ., .)
if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type))
{
m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */
- logerror("%s at %08x: called unimplemented instruction %04x (rtm)\n",
+ mc68kcpu->logerror("%s at %08x: called unimplemented instruction %04x (rtm)\n",
(mc68kcpu)->tag(), REG_PC(mc68kcpu) - 2, (mc68kcpu)->ir);
return;
}
@@ -10515,7 +10516,7 @@ M68KMAKE_OP(cinv, 32, ., .)
UINT16 ir = mc68kcpu->ir;
UINT8 cache = (ir >> 6) & 3;
// UINT8 scope = (ir >> 3) & 3;
-// logerror("68040 %s: pc=%08x ir=%04x cache=%d scope=%d register=%d\n", ir & 0x0020 ? "cpush" : "cinv", REG_PPC(mc68kcpu), ir, cache, scope, ir & 7);
+// mc68kcpu->logerror("68040 %s: pc=%08x ir=%04x cache=%d scope=%d register=%d\n", ir & 0x0020 ? "cpush" : "cinv", REG_PPC(mc68kcpu), ir, cache, scope, ir & 7);
switch (cache)
{
case 2:
@@ -10532,7 +10533,7 @@ M68KMAKE_OP(cpush, 32, ., .)
{
if(CPU_TYPE_IS_040_PLUS((mc68kcpu)->cpu_type))
{
- logerror("%s at %08x: called unimplemented instruction %04x (cpush)\n",
+ mc68kcpu->logerror("%s at %08x: called unimplemented instruction %04x (cpush)\n",
(mc68kcpu)->tag(), REG_PC(mc68kcpu) - 2, (mc68kcpu)->ir);
return;
}
diff --git a/src/devices/cpu/m68000/m68kcpu.cpp b/src/devices/cpu/m68000/m68kcpu.cpp
index 5b6d2a602bf..dc7e0b14a6f 100644
--- a/src/devices/cpu/m68000/m68kcpu.cpp
+++ b/src/devices/cpu/m68000/m68kcpu.cpp
@@ -1166,7 +1166,7 @@ void m68000_base_device::state_export(const device_state_entry &entry)
}
}
-void m68000_base_device::state_string_export(const device_state_entry &entry, std::string &str)
+void m68000_base_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
UINT16 sr;
@@ -1734,14 +1734,11 @@ void m68000_base_device::define_state(void)
if (cpu_type & MASK_020_OR_LATER)
state_add(M68K_MSP, "MSP", iotemp).callimport().callexport();
- std::string tempstr;
for (int regnum = 0; regnum < 8; regnum++) {
- strprintf(tempstr,"D%d", regnum);
- state_add(M68K_D0 + regnum, tempstr.c_str(), dar[regnum]);
+ state_add(M68K_D0 + regnum, strformat("D%d", regnum).c_str(), dar[regnum]);
}
for (int regnum = 0; regnum < 8; regnum++) {
- strprintf(tempstr,"A%d", regnum);
- state_add(M68K_A0 + regnum, tempstr.c_str(), dar[8 + regnum]);
+ state_add(M68K_A0 + regnum, strformat("A%d", regnum).c_str(), dar[8 + regnum]);
}
state_add(M68K_PREF_ADDR, "PREF_ADDR", pref_addr).mask(addrmask);
@@ -1763,8 +1760,7 @@ void m68000_base_device::define_state(void)
if (cpu_type & MASK_030_OR_LATER)
{
for (int regnum = 0; regnum < 8; regnum++) {
- strprintf(tempstr,"FP%d", regnum);
- state_add(M68K_FP0 + regnum, tempstr.c_str(), iotemp).callimport().callexport().formatstr("%10s");
+ state_add(M68K_FP0 + regnum, strformat("FP%d", regnum).c_str(), iotemp).callimport().callexport().formatstr("%10s");
}
state_add(M68K_FPSR, "FPSR", fpsr);
state_add(M68K_FPCR, "FPCR", fpcr);
diff --git a/src/devices/cpu/m68000/m68kfpu.inc b/src/devices/cpu/m68000/m68kfpu.inc
index 6493bc1f614..b5275bd314a 100644
--- a/src/devices/cpu/m68000/m68kfpu.inc
+++ b/src/devices/cpu/m68000/m68kfpu.inc
@@ -1681,7 +1681,7 @@ static void fmove_fpcr(m68000_base_device *m68k, UINT16 w2)
int rnd = (REG_FPCR(m68k) >> 4) & 3;
int prec = (REG_FPCR(m68k) >> 6) & 3;
- m68k->logerror("m68k_fpsp:fmove_fpcr fpcr=%04x prec=%d rnd=%d\n", REG_FPCR(m68k), prec, rnd);
+// m68k->logerror("m68k_fpsp:fmove_fpcr fpcr=%04x prec=%d rnd=%d\n", REG_FPCR(m68k), prec, rnd);
#ifdef FLOATX80
switch (prec)
diff --git a/src/devices/cpu/m68000/m68kmake.cpp b/src/devices/cpu/m68000/m68kmake.cpp
index 9b732dbec59..f36797d76ba 100644
--- a/src/devices/cpu/m68000/m68kmake.cpp
+++ b/src/devices/cpu/m68000/m68kmake.cpp
@@ -92,9 +92,9 @@ static const char g_version[] = "4.90";
#define MAX_OPCODE_OUTPUT_TABLE_LENGTH 3000 /* Max length of opcode handler tbl */
/* Default filenames */
-#define FILENAME_INPUT "m68k_in.c"
+#define FILENAME_INPUT "m68k_in.cpp"
#define FILENAME_PROTOTYPE "m68kops.h"
-#define FILENAME_TABLE "m68kops.c"
+#define FILENAME_TABLE "m68kops.cpp"
/* Identifier sequences recognized by this program */
diff --git a/src/devices/cpu/m68000/m68kops.cpp b/src/devices/cpu/m68000/m68kops.cpp
index 40c4a78cecf..0505f863c73 100644
--- a/src/devices/cpu/m68000/m68kops.cpp
+++ b/src/devices/cpu/m68000/m68kops.cpp
@@ -7176,9 +7176,9 @@ void m68000_base_device_ops::m68k_op_bfins_32_ai(m68000_base_device* mc68kcpu)
if((width + offset) > 32)
{
mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset);
- insert_byte = MASK_OUT_ABOVE_8(insert_base);
+ insert_byte = MASK_OUT_ABOVE_8(insert_base) << (8-offset);
data_byte = m68ki_read_8((mc68kcpu), ea+4);
- (mc68kcpu)->not_z_flag |= (data_byte & mask_byte);
+ (mc68kcpu)->not_z_flag |= (insert_byte & mask_byte);
m68ki_write_8((mc68kcpu), ea+4, (data_byte & ~mask_byte) | insert_byte);
}
return;
@@ -7252,9 +7252,9 @@ void m68000_base_device_ops::m68k_op_bfins_32_di(m68000_base_device* mc68kcpu)
if((width + offset) > 32)
{
mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset);
- insert_byte = MASK_OUT_ABOVE_8(insert_base);
+ insert_byte = MASK_OUT_ABOVE_8(insert_base) << (8-offset);
data_byte = m68ki_read_8((mc68kcpu), ea+4);
- (mc68kcpu)->not_z_flag |= (data_byte & mask_byte);
+ (mc68kcpu)->not_z_flag |= (insert_byte & mask_byte);
m68ki_write_8((mc68kcpu), ea+4, (data_byte & ~mask_byte) | insert_byte);
}
return;
@@ -7328,9 +7328,9 @@ void m68000_base_device_ops::m68k_op_bfins_32_ix(m68000_base_device* mc68kcpu)
if((width + offset) > 32)
{
mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset);
- insert_byte = MASK_OUT_ABOVE_8(insert_base);
+ insert_byte = MASK_OUT_ABOVE_8(insert_base) << (8-offset);
data_byte = m68ki_read_8((mc68kcpu), ea+4);
- (mc68kcpu)->not_z_flag |= (data_byte & mask_byte);
+ (mc68kcpu)->not_z_flag |= (insert_byte & mask_byte);
m68ki_write_8((mc68kcpu), ea+4, (data_byte & ~mask_byte) | insert_byte);
}
return;
@@ -7404,9 +7404,9 @@ void m68000_base_device_ops::m68k_op_bfins_32_aw(m68000_base_device* mc68kcpu)
if((width + offset) > 32)
{
mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset);
- insert_byte = MASK_OUT_ABOVE_8(insert_base);
+ insert_byte = MASK_OUT_ABOVE_8(insert_base) << (8-offset);
data_byte = m68ki_read_8((mc68kcpu), ea+4);
- (mc68kcpu)->not_z_flag |= (data_byte & mask_byte);
+ (mc68kcpu)->not_z_flag |= (insert_byte & mask_byte);
m68ki_write_8((mc68kcpu), ea+4, (data_byte & ~mask_byte) | insert_byte);
}
return;
@@ -7480,9 +7480,9 @@ void m68000_base_device_ops::m68k_op_bfins_32_al(m68000_base_device* mc68kcpu)
if((width + offset) > 32)
{
mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset);
- insert_byte = MASK_OUT_ABOVE_8(insert_base);
+ insert_byte = MASK_OUT_ABOVE_8(insert_base) << (8-offset);
data_byte = m68ki_read_8((mc68kcpu), ea+4);
- (mc68kcpu)->not_z_flag |= (data_byte & mask_byte);
+ (mc68kcpu)->not_z_flag |= (insert_byte & mask_byte);
m68ki_write_8((mc68kcpu), ea+4, (data_byte & ~mask_byte) | insert_byte);
}
return;
@@ -21288,7 +21288,7 @@ void m68000_base_device_ops::m68k_op_movec_32_rc(m68000_base_device* mc68kcpu)
(mc68kcpu)->cacr = REG_DA(mc68kcpu)[(word2 >> 12) & 15] & 0x0f;
}
-// logerror("movec to cacr=%04x\n", (mc68kcpu)->cacr);
+// mc68kcpu->logerror("movec to cacr=%04x\n", (mc68kcpu)->cacr);
if ((mc68kcpu)->cacr & (M68K_CACR_CI | M68K_CACR_CEI))
{
m68ki_ic_clear(mc68kcpu);
@@ -32728,7 +32728,7 @@ void m68000_base_device_ops::m68k_op_cinv_32(m68000_base_device* mc68kcpu)
UINT16 ir = mc68kcpu->ir;
UINT8 cache = (ir >> 6) & 3;
// UINT8 scope = (ir >> 3) & 3;
-// logerror("68040 %s: pc=%08x ir=%04x cache=%d scope=%d register=%d\n", ir & 0x0020 ? "cpush" : "cinv", REG_PPC(mc68kcpu), ir, cache, scope, ir & 7);
+// mc68kcpu->logerror("68040 %s: pc=%08x ir=%04x cache=%d scope=%d register=%d\n", ir & 0x0020 ? "cpush" : "cinv", REG_PPC(mc68kcpu), ir, cache, scope, ir & 7);
switch (cache)
{
case 2:
diff --git a/src/devices/cpu/m6805/m6805.cpp b/src/devices/cpu/m6805/m6805.cpp
index d3905118b48..0bb5ac3877e 100644
--- a/src/devices/cpu/m6805/m6805.cpp
+++ b/src/devices/cpu/m6805/m6805.cpp
@@ -493,7 +493,7 @@ const address_space_config *m6805_base_device::memory_space_config(address_space
// for the debugger
//-------------------------------------------------
-void m6805_base_device::state_string_export(const device_state_entry &entry, std::string &str)
+void m6805_base_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/m6805/m6805.h b/src/devices/cpu/m6805/m6805.h
index dc85fd6eaaa..40fd8b3db9b 100644
--- a/src/devices/cpu/m6805/m6805.h
+++ b/src/devices/cpu/m6805/m6805.h
@@ -51,7 +51,7 @@ protected:
virtual offs_t disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options) override;
// device_state_interface overrides
- virtual void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
private:
// opcode/condition tables
@@ -119,7 +119,7 @@ protected:
void rorx();
void asrx();
void aslx();
- void lslx();
+// void lslx();
void rolx();
void decx();
void incx();
diff --git a/src/devices/cpu/m6809/m6809.cpp b/src/devices/cpu/m6809/m6809.cpp
index 30690ed5db5..61337f180f0 100644
--- a/src/devices/cpu/m6809/m6809.cpp
+++ b/src/devices/cpu/m6809/m6809.cpp
@@ -302,7 +302,7 @@ const address_space_config *m6809_base_device::memory_space_config(address_space
// for the debugger
//-------------------------------------------------
-void m6809_base_device::state_string_export(const device_state_entry &entry, std::string &str)
+void m6809_base_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/m6809/m6809.h b/src/devices/cpu/m6809/m6809.h
index 53ca385f81c..a992be78789 100644
--- a/src/devices/cpu/m6809/m6809.h
+++ b/src/devices/cpu/m6809/m6809.h
@@ -84,7 +84,7 @@ protected:
virtual offs_t disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options) override;
// device_state_interface overrides
- virtual void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// addressing modes
enum
diff --git a/src/devices/cpu/mb86233/mb86233.cpp b/src/devices/cpu/mb86233/mb86233.cpp
index 7d760567872..341309d8c12 100644
--- a/src/devices/cpu/mb86233/mb86233.cpp
+++ b/src/devices/cpu/mb86233/mb86233.cpp
@@ -161,7 +161,7 @@ void mb86233_cpu_device::device_start()
}
-void mb86233_cpu_device::state_string_export(const device_state_entry &entry, std::string &str)
+void mb86233_cpu_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
@@ -478,7 +478,7 @@ UINT32 mb86233_cpu_device::GETEXTERNAL( UINT32 EB, UINT32 offset )
{
unsigned int value=GETEXTPORT()[0x27];
int exp=(value>>23)&0xff;
- unsigned int res=0;
+ unsigned int res;
unsigned int sign=0;
MB86233_REG a,b;
int index;
diff --git a/src/devices/cpu/mb86233/mb86233.h b/src/devices/cpu/mb86233/mb86233.h
index 0d1e3843737..26fc5b3e9f6 100644
--- a/src/devices/cpu/mb86233/mb86233.h
+++ b/src/devices/cpu/mb86233/mb86233.h
@@ -74,7 +74,7 @@ protected:
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override { return (spacenum == AS_PROGRAM) ? &m_program_config : ( (spacenum == AS_DATA) ? &m_data_config : nullptr ); }
// device_state_interface overrides
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 4; }
diff --git a/src/devices/cpu/mb86235/mb86235.cpp b/src/devices/cpu/mb86235/mb86235.cpp
index c68a66e4e7b..edcc6a0471f 100644
--- a/src/devices/cpu/mb86235/mb86235.cpp
+++ b/src/devices/cpu/mb86235/mb86235.cpp
@@ -108,7 +108,7 @@ mb86235_cpu_device::mb86235_cpu_device(const machine_config &mconfig, const char
}
-void mb86235_cpu_device::state_string_export(const device_state_entry &entry, std::string &str)
+void mb86235_cpu_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/mb86235/mb86235.h b/src/devices/cpu/mb86235/mb86235.h
index 4fdda0030be..35f586c7290 100644
--- a/src/devices/cpu/mb86235/mb86235.h
+++ b/src/devices/cpu/mb86235/mb86235.h
@@ -42,7 +42,7 @@ protected:
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override { return (spacenum == AS_PROGRAM) ? &m_program_config : nullptr; }
// device_state_interface overrides
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 8; }
diff --git a/src/devices/cpu/mb88xx/mb88xx.cpp b/src/devices/cpu/mb88xx/mb88xx.cpp
index 5d8ca5f7e09..9ab07538e6e 100644
--- a/src/devices/cpu/mb88xx/mb88xx.cpp
+++ b/src/devices/cpu/mb88xx/mb88xx.cpp
@@ -269,7 +269,7 @@ void mb88_cpu_device::state_export(const device_state_entry &entry)
}
-void mb88_cpu_device::state_string_export(const device_state_entry &entry, std::string &str)
+void mb88_cpu_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/mb88xx/mb88xx.h b/src/devices/cpu/mb88xx/mb88xx.h
index 8a9e555d968..6dc4252f706 100644
--- a/src/devices/cpu/mb88xx/mb88xx.h
+++ b/src/devices/cpu/mb88xx/mb88xx.h
@@ -90,9 +90,9 @@ protected:
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override { return (spacenum == AS_PROGRAM) ? &m_program_config : ( (spacenum == AS_DATA) ? &m_data_config : ( (spacenum == AS_IO) ? &m_io_config : nullptr ) ); }
// device_state_interface overrides
- void state_string_export(const device_state_entry &entry, std::string &str) override;
- void state_import(const device_state_entry &entry) override;
- void state_export(const device_state_entry &entry) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
+ virtual void state_import(const device_state_entry &entry) override;
+ virtual void state_export(const device_state_entry &entry) override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 1; }
diff --git a/src/devices/cpu/mc68hc11/hc11dasm.cpp b/src/devices/cpu/mc68hc11/hc11dasm.cpp
index eed3df13c5e..2594634671f 100644
--- a/src/devices/cpu/mc68hc11/hc11dasm.cpp
+++ b/src/devices/cpu/mc68hc11/hc11dasm.cpp
@@ -1286,7 +1286,7 @@ static UINT32 decode_opcode(UINT32 pc, const M68HC11_OPCODE *op_table)
CPU_DISASSEMBLE( hc11 )
{
- UINT32 flags = 0;
+ UINT32 flags;
UINT8 opcode;
output = buffer;
diff --git a/src/devices/cpu/mc68hc11/mc68hc11.cpp b/src/devices/cpu/mc68hc11/mc68hc11.cpp
index f05d9126334..a208a618c4b 100644
--- a/src/devices/cpu/mc68hc11/mc68hc11.cpp
+++ b/src/devices/cpu/mc68hc11/mc68hc11.cpp
@@ -448,7 +448,7 @@ void mc68hc11_cpu_device::device_start()
}
-void mc68hc11_cpu_device::state_string_export(const device_state_entry &entry, std::string &str)
+void mc68hc11_cpu_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/mc68hc11/mc68hc11.h b/src/devices/cpu/mc68hc11/mc68hc11.h
index 3f76577b29c..047a1f559e2 100644
--- a/src/devices/cpu/mc68hc11/mc68hc11.h
+++ b/src/devices/cpu/mc68hc11/mc68hc11.h
@@ -70,7 +70,7 @@ protected:
}
// device_state_interface overrides
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 1; }
diff --git a/src/devices/cpu/mcs48/mcs48.cpp b/src/devices/cpu/mcs48/mcs48.cpp
index 0f7a72f0f89..b49899ca498 100644
--- a/src/devices/cpu/mcs48/mcs48.cpp
+++ b/src/devices/cpu/mcs48/mcs48.cpp
@@ -978,10 +978,8 @@ void mcs48_cpu_device::device_start()
state_add(MCS48_P1, "P1", m_p1);
state_add(MCS48_P2, "P2", m_p2);
- std::string tempstr;
for (int regnum = 0; regnum < 8; regnum++) {
- strprintf(tempstr, "R%d", regnum);
- state_add(MCS48_R0 + regnum, tempstr.c_str(), m_rtemp).callimport().callexport();
+ state_add(MCS48_R0 + regnum, strformat("R%d", regnum).c_str(), m_rtemp).callimport().callexport();
}
state_add(MCS48_EA, "EA", m_ea).mask(0x1);
@@ -1298,7 +1296,7 @@ void mcs48_cpu_device::state_export(const device_state_entry &entry)
}
}
-void mcs48_cpu_device::state_string_export(const device_state_entry &entry, std::string &str)
+void mcs48_cpu_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/mcs48/mcs48.h b/src/devices/cpu/mcs48/mcs48.h
index ed994d1030e..a916ccd2016 100644
--- a/src/devices/cpu/mcs48/mcs48.h
+++ b/src/devices/cpu/mcs48/mcs48.h
@@ -152,7 +152,7 @@ protected:
// device_state_interface overrides
virtual void state_import(const device_state_entry &entry) override;
virtual void state_export(const device_state_entry &entry) override;
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 1; }
diff --git a/src/devices/cpu/mcs51/mcs51.cpp b/src/devices/cpu/mcs51/mcs51.cpp
index 0fc5d9449be..f3d5816d722 100644
--- a/src/devices/cpu/mcs51/mcs51.cpp
+++ b/src/devices/cpu/mcs51/mcs51.cpp
@@ -1004,7 +1004,7 @@ void mcs51_cpu_device::transmit_receive(int source)
void mcs51_cpu_device::update_timer_t0(int cycles)
{
int mode = (GET_M0_1<<1) | GET_M0_0;
- UINT32 count = 0;
+ UINT32 count;
if (GET_TR0)
{
@@ -1091,7 +1091,7 @@ void mcs51_cpu_device::update_timer_t1(int cycles)
{
UINT8 mode = (GET_M1_1<<1) | GET_M1_0;
UINT8 mode_0 = (GET_M0_1<<1) | GET_M0_0;
- UINT32 count = 0;
+ UINT32 count;
if (mode_0 != 3)
{
@@ -1713,7 +1713,7 @@ void mcs51_cpu_device::check_irqs()
UINT8 ints = (GET_IE0 | (GET_TF0<<1) | (GET_IE1<<2) | (GET_TF1<<3)
| ((GET_RI|GET_TI)<<4));
UINT8 int_vec = 0;
- UINT8 int_mask = 0;
+ UINT8 int_mask;
int priority_request = -1;
int i;
@@ -2213,7 +2213,7 @@ void mcs51_cpu_device::state_export(const device_state_entry &entry)
}
}
-void mcs51_cpu_device::state_string_export(const device_state_entry &entry, std::string &str)
+void mcs51_cpu_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/mcs51/mcs51.h b/src/devices/cpu/mcs51/mcs51.h
index 3babfda9f50..7b769de24ad 100644
--- a/src/devices/cpu/mcs51/mcs51.h
+++ b/src/devices/cpu/mcs51/mcs51.h
@@ -109,7 +109,7 @@ protected:
// device_state_interface overrides
virtual void state_import(const device_state_entry &entry) override;
virtual void state_export(const device_state_entry &entry) override;
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 1; }
diff --git a/src/devices/cpu/mcs96/mcs96.cpp b/src/devices/cpu/mcs96/mcs96.cpp
index 8c52a8c029d..3c8284f8555 100644
--- a/src/devices/cpu/mcs96/mcs96.cpp
+++ b/src/devices/cpu/mcs96/mcs96.cpp
@@ -128,7 +128,7 @@ void mcs96_device::state_export(const device_state_entry &entry)
{
}
-void mcs96_device::state_string_export(const device_state_entry &entry, std::string &str)
+void mcs96_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch(entry.index()) {
case STATE_GENFLAGS:
diff --git a/src/devices/cpu/mcs96/mcs96.h b/src/devices/cpu/mcs96/mcs96.h
index ed9b64709ec..0111361899c 100644
--- a/src/devices/cpu/mcs96/mcs96.h
+++ b/src/devices/cpu/mcs96/mcs96.h
@@ -85,7 +85,7 @@ protected:
// device_state_interface overrides
virtual void state_import(const device_state_entry &entry) override;
virtual void state_export(const device_state_entry &entry) override;
- virtual void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override;
diff --git a/src/devices/cpu/melps4/melps4.cpp b/src/devices/cpu/melps4/melps4.cpp
index b7390eaccf5..d228b42fbee 100644
--- a/src/devices/cpu/melps4/melps4.cpp
+++ b/src/devices/cpu/melps4/melps4.cpp
@@ -42,7 +42,7 @@
// disasm
-void melps4_cpu_device::state_string_export(const device_state_entry &entry, std::string &str)
+void melps4_cpu_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
@@ -367,7 +367,7 @@ void melps4_cpu_device::check_interrupt()
if (!m_inte)
return;
- int which = 0;
+ int which;
// assume that lower irq vectors have higher priority
if (m_irqflag[0])
diff --git a/src/devices/cpu/melps4/melps4.h b/src/devices/cpu/melps4/melps4.h
index 2d80cfcf8d2..b0aa67fd6d4 100644
--- a/src/devices/cpu/melps4/melps4.h
+++ b/src/devices/cpu/melps4/melps4.h
@@ -160,7 +160,7 @@ protected:
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 2; }
virtual UINT32 disasm_max_opcode_bytes() const override { return 2; }
- virtual void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
address_space_config m_program_config;
address_space_config m_data_config;
diff --git a/src/devices/cpu/minx/minx.cpp b/src/devices/cpu/minx/minx.cpp
index e822fbd9ecc..bae0338da76 100644
--- a/src/devices/cpu/minx/minx.cpp
+++ b/src/devices/cpu/minx/minx.cpp
@@ -121,7 +121,7 @@ void minx_cpu_device::device_start()
}
-void minx_cpu_device::state_string_export(const device_state_entry &entry, std::string &str)
+void minx_cpu_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/minx/minx.h b/src/devices/cpu/minx/minx.h
index e530b3cf88a..a31db6ab7a0 100644
--- a/src/devices/cpu/minx/minx.h
+++ b/src/devices/cpu/minx/minx.h
@@ -36,7 +36,7 @@ protected:
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override { return (spacenum == AS_PROGRAM) ? &m_program_config : nullptr; }
// device_state_interface overrides
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 1; }
diff --git a/src/devices/cpu/minx/minxd.cpp b/src/devices/cpu/minx/minxd.cpp
index 58789942409..31f4a1f51d7 100644
--- a/src/devices/cpu/minx/minxd.cpp
+++ b/src/devices/cpu/minx/minxd.cpp
@@ -424,8 +424,8 @@ CPU_DISASSEMBLE( minx )
{
const minxdasm *instr;
UINT8 op, op1;
- INT8 ofs8 = 0;
- UINT16 ea = 0;
+ INT8 ofs8;
+ UINT16 ea;
int pos = 0;
char *dst = buffer;
diff --git a/src/devices/cpu/mips/mips3.cpp b/src/devices/cpu/mips/mips3.cpp
index ed95f09d418..f4747b7304c 100644
--- a/src/devices/cpu/mips/mips3.cpp
+++ b/src/devices/cpu/mips/mips3.cpp
@@ -203,12 +203,10 @@ void mips3_device::device_stop()
if (m_drcfe != nullptr)
{
- auto_free(machine(), m_drcfe);
m_drcfe = nullptr;
}
if (m_drcuml != nullptr)
{
- auto_free(machine(), m_drcuml);
m_drcuml = nullptr;
}
}
@@ -357,7 +355,7 @@ void mips3_device::device_start()
UINT32 flags = 0;
/* initialize the UML generator */
- m_drcuml = auto_alloc(machine(), drcuml_state(*this, m_cache, flags, 8, 32, 2));
+ m_drcuml = std::make_unique<drcuml_state>(*this, m_cache, flags, 8, 32, 2);
/* add symbols for our stuff */
m_drcuml->symbol_add(&m_core->pc, sizeof(m_core->pc), "pc");
@@ -403,7 +401,7 @@ void mips3_device::device_start()
m_drcuml->symbol_add(&m_fpmode, sizeof(m_fpmode), "fpmode");
/* initialize the front-end helper */
- m_drcfe = auto_alloc(machine(), mips3_frontend(this, COMPILE_BACKWARDS_BYTES, COMPILE_FORWARDS_BYTES, SINGLE_INSTRUCTION_MODE ? 1 : COMPILE_MAX_SEQUENCE));
+ m_drcfe = std::make_unique<mips3_frontend>(this, COMPILE_BACKWARDS_BYTES, COMPILE_FORWARDS_BYTES, SINGLE_INSTRUCTION_MODE ? 1 : COMPILE_MAX_SEQUENCE);
/* allocate memory for cache-local state and initialize it */
memcpy(m_fpmode, fpmode_source, sizeof(fpmode_source));
@@ -661,7 +659,7 @@ void mips3_device::state_export(const device_state_entry &entry)
}
-void mips3_device::state_string_export(const device_state_entry &entry, std::string &str)
+void mips3_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/mips/mips3.h b/src/devices/cpu/mips/mips3.h
index 1b76e37fe3f..9e0de9ed419 100644
--- a/src/devices/cpu/mips/mips3.h
+++ b/src/devices/cpu/mips/mips3.h
@@ -303,7 +303,7 @@ protected:
// device_state_interface overrides
virtual void state_export(const device_state_entry &entry) override;
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 4; }
@@ -409,8 +409,8 @@ private:
/* core state */
drc_cache m_cache; /* pointer to the DRC code cache */
- drcuml_state * m_drcuml; /* DRC UML generator state */
- mips3_frontend * m_drcfe; /* pointer to the DRC front-end state */
+ std::unique_ptr<drcuml_state> m_drcuml; /* DRC UML generator state */
+ std::unique_ptr<mips3_frontend> m_drcfe; /* pointer to the DRC front-end state */
UINT32 m_drcoptions; /* configurable DRC options */
/* internal stuff */
diff --git a/src/devices/cpu/mips/mips3drc.cpp b/src/devices/cpu/mips/mips3drc.cpp
index 02d73de3b14..4e6e9771a38 100644
--- a/src/devices/cpu/mips/mips3drc.cpp
+++ b/src/devices/cpu/mips/mips3drc.cpp
@@ -280,7 +280,7 @@ void mips3_device::code_flush_cache()
void mips3_device::code_compile_block(UINT8 mode, offs_t pc)
{
- drcuml_state *drcuml = m_drcuml;
+ drcuml_state *drcuml = m_drcuml.get();
compiler_state compiler = { 0 };
const opcode_desc *seqhead, *seqlast;
const opcode_desc *desclist;
@@ -553,7 +553,7 @@ static void cfunc_unimplemented(void *param)
void mips3_device::static_generate_entry_point()
{
- drcuml_state *drcuml = m_drcuml;
+ drcuml_state *drcuml = m_drcuml.get();
code_label skip = 1;
drcuml_block *block;
@@ -601,7 +601,7 @@ void mips3_device::static_generate_entry_point()
void mips3_device::static_generate_nocode_handler()
{
- drcuml_state *drcuml = m_drcuml;
+ drcuml_state *drcuml = m_drcuml.get();
drcuml_block *block;
/* begin generating */
@@ -626,7 +626,7 @@ void mips3_device::static_generate_nocode_handler()
void mips3_device::static_generate_out_of_cycles()
{
- drcuml_state *drcuml = m_drcuml;
+ drcuml_state *drcuml = m_drcuml.get();
drcuml_block *block;
/* begin generating */
@@ -651,7 +651,7 @@ void mips3_device::static_generate_out_of_cycles()
void mips3_device::static_generate_tlb_mismatch()
{
- drcuml_state *drcuml = m_drcuml;
+ drcuml_state *drcuml = m_drcuml.get();
drcuml_block *block;
/* forward references */
@@ -702,7 +702,7 @@ void mips3_device::static_generate_tlb_mismatch()
void mips3_device::static_generate_exception(UINT8 exception, int recover, const char *name)
{
code_handle *&exception_handle = recover ? m_exception[exception] : m_exception_norecover[exception];
- drcuml_state *drcuml = m_drcuml;
+ drcuml_state *drcuml = m_drcuml.get();
UINT32 offset = 0x180;
code_label next = 1;
code_label skip = 2;
@@ -805,7 +805,7 @@ void mips3_device::static_generate_memory_accessor(int mode, int size, int iswri
code_handle &exception_tlb = *m_exception[iswrite ? EXCEPTION_TLBSTORE : EXCEPTION_TLBLOAD];
code_handle &exception_tlbfill = *m_exception[iswrite ? EXCEPTION_TLBSTORE_FILL : EXCEPTION_TLBLOAD_FILL];
code_handle &exception_addrerr = *m_exception[iswrite ? EXCEPTION_ADDRSTORE : EXCEPTION_ADDRLOAD];
- drcuml_state *drcuml = m_drcuml;
+ drcuml_state *drcuml = m_drcuml.get();
drcuml_block *block;
int tlbmiss = 0;
int label = 1;
diff --git a/src/devices/cpu/mips/r3000.cpp b/src/devices/cpu/mips/r3000.cpp
index b53afb83d29..f14c6adc93f 100644
--- a/src/devices/cpu/mips/r3000.cpp
+++ b/src/devices/cpu/mips/r3000.cpp
@@ -443,7 +443,7 @@ void r3000_device::state_export(const device_state_entry &entry)
// for the debugger
//-------------------------------------------------
-void r3000_device::state_string_export(const device_state_entry &entry, std::string &str)
+void r3000_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/mips/r3000.h b/src/devices/cpu/mips/r3000.h
index f9063806cde..a7541eaab85 100644
--- a/src/devices/cpu/mips/r3000.h
+++ b/src/devices/cpu/mips/r3000.h
@@ -126,7 +126,7 @@ protected:
// device_state_interface overrides
virtual void state_import(const device_state_entry &entry) override;
virtual void state_export(const device_state_entry &entry) override;
- virtual void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override;
diff --git a/src/devices/cpu/mn10200/mn10200.cpp b/src/devices/cpu/mn10200/mn10200.cpp
index bf00be5b984..1b4af66e13f 100644
--- a/src/devices/cpu/mn10200/mn10200.cpp
+++ b/src/devices/cpu/mn10200/mn10200.cpp
@@ -51,7 +51,7 @@ mn1020012a_device::mn1020012a_device(const machine_config &mconfig, const char *
// disasm
-void mn10200_device::state_string_export(const device_state_entry &entry, std::string &str)
+void mn10200_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/mn10200/mn10200.h b/src/devices/cpu/mn10200/mn10200.h
index f3dc2dcfee7..38073fb8e27 100644
--- a/src/devices/cpu/mn10200/mn10200.h
+++ b/src/devices/cpu/mn10200/mn10200.h
@@ -88,7 +88,7 @@ protected:
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override { return (spacenum == AS_PROGRAM) ? &m_program_config : nullptr; }
// device_state_interface overrides
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 1; }
diff --git a/src/devices/cpu/nec/nec.cpp b/src/devices/cpu/nec/nec.cpp
index 7b282e2570c..42ef74df7d5 100644
--- a/src/devices/cpu/nec/nec.cpp
+++ b/src/devices/cpu/nec/nec.cpp
@@ -437,7 +437,7 @@ void nec_common_device::device_start()
m_icountptr = &m_icount;
}
-void nec_common_device::state_string_export(const device_state_entry &entry, std::string &str)
+void nec_common_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
UINT16 flags = CompressFlags();
diff --git a/src/devices/cpu/nec/nec.h b/src/devices/cpu/nec/nec.h
index 50a3adc7656..c0c1fa82327 100644
--- a/src/devices/cpu/nec/nec.h
+++ b/src/devices/cpu/nec/nec.h
@@ -42,7 +42,7 @@ protected:
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override { return (spacenum == AS_PROGRAM) ? &m_program_config : ( (spacenum == AS_IO) ? &m_io_config : nullptr); }
// device_state_interface overrides
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
virtual void state_import(const device_state_entry &entry) override;
virtual void state_export(const device_state_entry &entry) override;
diff --git a/src/devices/cpu/nec/v25.cpp b/src/devices/cpu/nec/v25.cpp
index 8612c5f8760..c5e62446cb0 100644
--- a/src/devices/cpu/nec/v25.cpp
+++ b/src/devices/cpu/nec/v25.cpp
@@ -525,7 +525,7 @@ void v25_common_device::device_start()
}
-void v25_common_device::state_string_export(const device_state_entry &entry, std::string &str)
+void v25_common_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
UINT16 flags = CompressFlags();
diff --git a/src/devices/cpu/nec/v25.h b/src/devices/cpu/nec/v25.h
index 0e996468942..1cd5ab91012 100644
--- a/src/devices/cpu/nec/v25.h
+++ b/src/devices/cpu/nec/v25.h
@@ -59,7 +59,7 @@ protected:
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override { return (spacenum == AS_PROGRAM) ? &m_program_config : ( (spacenum == AS_IO) ? &m_io_config : nullptr); }
// device_state_interface overrides
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
virtual void state_import(const device_state_entry &entry) override;
virtual void state_export(const device_state_entry &entry) override;
diff --git a/src/devices/cpu/patinhofeio/patinho_feio.cpp b/src/devices/cpu/patinhofeio/patinho_feio.cpp
index 9377ad259f8..78fc92a8270 100644
--- a/src/devices/cpu/patinhofeio/patinho_feio.cpp
+++ b/src/devices/cpu/patinhofeio/patinho_feio.cpp
@@ -28,14 +28,14 @@
#define INCREMENT_PC_4K (PC = (PC+1) & ADDRESS_MASK_4K)
unsigned int patinho_feio_cpu_device::compute_effective_address(unsigned int addr){
- unsigned int retval = addr;
- if (m_indirect_addressing){
- retval = READ_WORD_PATINHO(addr);
- if (retval & 0x1000)
- return compute_effective_address(retval & 0xFFF);
- }
-
- return retval;
+ unsigned int retval = addr;
+ if (m_indirect_addressing){
+ retval = READ_WORD_PATINHO(addr);
+ if (retval & 0x1000)
+ return compute_effective_address(retval & 0xFFF);
+ }
+
+ return retval;
}
const device_type PATINHO_FEIO = &device_creator<patinho_feio_cpu_device>;
@@ -43,494 +43,493 @@ const device_type PATINHO_FEIO = &device_creator<patinho_feio_cpu_device>;
//Internal 4kbytes of RAM
static ADDRESS_MAP_START(prog_8bit, AS_PROGRAM, 8, patinho_feio_cpu_device)
- AM_RANGE(0x0000, 0x0fff) AM_RAM AM_SHARE("internalram")
+ AM_RANGE(0x0000, 0x0fff) AM_RAM AM_SHARE("internalram")
ADDRESS_MAP_END
patinho_feio_cpu_device::patinho_feio_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
- : cpu_device(mconfig, PATINHO_FEIO, "PATINHO FEIO", tag, owner, clock, "patinho_feio_cpu", __FILE__),
- m_program_config("program", ENDIANNESS_LITTLE, 8, 12, 0, ADDRESS_MAP_NAME(prog_8bit)),
- m_icount(0),
- m_rc_read_cb(*this)
+ : cpu_device(mconfig, PATINHO_FEIO, "PATINHO FEIO", tag, owner, clock, "patinho_feio_cpu", __FILE__),
+ m_program_config("program", ENDIANNESS_LITTLE, 8, 12, 0, ADDRESS_MAP_NAME(prog_8bit)),
+ m_icount(0),
+ m_rc_read_cb(*this)
{
}
UINT16 patinho_feio_cpu_device::read_panel_keys_register(){
- if (!m_rc_read_cb.isnull())
- m_rc = m_rc_read_cb(0);
- else
- m_rc = 0;
+ if (!m_rc_read_cb.isnull())
+ m_rc = m_rc_read_cb(0);
+ else
+ m_rc = 0;
- return m_rc;
+ return m_rc;
}
void patinho_feio_cpu_device::device_start()
{
- m_program = &space(AS_PROGRAM);
-
- save_item(NAME(m_pc));
- save_item(NAME(m_acc));
- save_item(NAME(m_rc));
- save_item(NAME(m_idx));
- save_item(NAME(m_flags));
-
- // Register state for debugger
- state_add( PATINHO_FEIO_CI, "CI", m_pc ).mask(0xFFF);
- state_add( PATINHO_FEIO_RC, "RC", m_rc ).mask(0xFFF);
- state_add( PATINHO_FEIO_ACC, "ACC", m_acc ).mask(0xFF);
- state_add( PATINHO_FEIO_IDX, "IDX", m_idx ).mask(0xFF);
- state_add(STATE_GENPC, "GENPC", m_pc).formatstr("0%06O").noshow();
- state_add(STATE_GENFLAGS, "GENFLAGS", m_flags).noshow().formatstr("%8s");
-
- if (m_rc_read_cb.isnull()){
- fatalerror("Panel keys register not found!");
- } else {
- m_rc_read_cb.resolve();
- }
-
- m_icountptr = &m_icount;
+ m_program = &space(AS_PROGRAM);
+
+ save_item(NAME(m_pc));
+ save_item(NAME(m_acc));
+ save_item(NAME(m_rc));
+ save_item(NAME(m_idx));
+ save_item(NAME(m_flags));
+
+ // Register state for debugger
+ state_add( PATINHO_FEIO_CI, "CI", m_pc ).mask(0xFFF);
+ state_add( PATINHO_FEIO_RC, "RC", m_rc ).mask(0xFFF);
+ state_add( PATINHO_FEIO_ACC, "ACC", m_acc ).mask(0xFF);
+ state_add( PATINHO_FEIO_IDX, "IDX", m_idx ).mask(0xFF);
+ state_add(STATE_GENPC, "GENPC", m_pc).formatstr("0%06O").noshow();
+ state_add(STATE_GENFLAGS, "GENFLAGS", m_flags).noshow().formatstr("%8s");
+
+ if (m_rc_read_cb.isnull()){
+ fatalerror("Panel keys register not found!");
+ } else {
+ m_rc_read_cb.resolve();
+ }
+
+ m_icountptr = &m_icount;
}
void patinho_feio_cpu_device::device_reset()
{
- m_pc = 0x006;
- m_acc = 0;
- m_rc = 0;
- m_idx = READ_INDEX_REG();
- m_flags = 0;
- m_run = true;
- m_scheduled_IND_bit_reset = false;
- m_indirect_addressing = false;
+ m_pc = 0x006;
+ m_acc = 0;
+ m_rc = 0;
+ m_idx = READ_INDEX_REG();
+ m_flags = 0;
+ m_run = true;
+ m_scheduled_IND_bit_reset = false;
+ m_indirect_addressing = false;
}
/* execute instructions on this CPU until icount expires */
void patinho_feio_cpu_device::execute_run()
{
- do
- {
- if ((! m_run)){
- m_icount = 0; /* if processor is stopped, just burn cycles */
- } else {
- m_idx = READ_INDEX_REG();
- read_panel_keys_register();
-
- execute_instruction();
- m_icount --;
- }
- }
- while (m_icount > 0);
+ do
+ {
+ if ((! m_run)){
+ m_icount = 0; /* if processor is stopped, just burn cycles */
+ } else {
+ m_idx = READ_INDEX_REG();
+ read_panel_keys_register();
+
+ execute_instruction();
+ m_icount --;
+ }
+ }
+ while (m_icount > 0);
}
/* execute one instruction */
void patinho_feio_cpu_device::execute_instruction()
{
- debugger_instruction_hook(this, PC);
- offs_t addr;
- bool skip;
- unsigned int tmp;
- unsigned char value, channel, function;
- unsigned char opcode = READ_BYTE_PATINHO(PC);
- INCREMENT_PC_4K;
-
- if (m_scheduled_IND_bit_reset)
- m_indirect_addressing = false;
-
- if (m_indirect_addressing)
- m_scheduled_IND_bit_reset = true;
-
- switch (opcode){
- case 0xD2:
- //XOR: Computes the bitwise XOR of an immediate into the accumulator
- ACC ^= READ_BYTE_PATINHO(PC);
- INCREMENT_PC_4K;
- //TODO: update T and V flags
- return;
- case 0xD4:
- //NAND: Computes the bitwise XOR of an immediate into the accumulator
- ACC = ~(ACC & READ_BYTE_PATINHO(PC));
- INCREMENT_PC_4K;
- //TODO: update T and V flags
- return;
- case 0xD8:
- //SOMI="Soma Imediato":
- // Add an immediate into the accumulator
- ACC += READ_BYTE_PATINHO(PC);
- INCREMENT_PC_4K;
- //TODO: update T and V flags
- return;
- case 0xDA:
- //CARI="Carrega Imediato":
- // Load an immediate into the accumulator
- ACC = READ_BYTE_PATINHO(PC);
- INCREMENT_PC_4K;
- return;
- case 0x80:
- //LIMPO:
- // Clear accumulator and flags
- ACC = 0;
- FLAGS = 0;
- return;
- case 0x81:
- //UM="One":
- // Load 1 into accumulator
- // and clear the flags
- ACC = 1;
- FLAGS = 0;
- return;
- case 0x82:
- //CMP1:
- // Compute One's complement of the accumulator
- // and clear the flags
- ACC = ~ACC;
- FLAGS = 0;
- return;
- case 0x83:
- //CMP2:
- // Compute Two's complement of the accumulator
- // and updates flags according to the result of the operation
- ACC = ~ACC + 1;
- FLAGS = 0; //TODO: fix-me (I'm not sure yet how to compute the flags here)
- return;
- case 0x84:
- //LIM="Limpa":
- // Clear flags
- FLAGS = 0;
- return;
- case 0x85:
- //INC:
- // Increment accumulator
- ACC++;
- FLAGS = 0; //TODO: fix-me (I'm not sure yet how to compute the flags here)
- return;
- case 0x86:
- //UNEG="Um Negativo":
- // Load -1 into accumulator and clear flags
- ACC = -1;
- FLAGS = 0;
- return;
- case 0x87:
- //LIMP1:
- // Clear accumulator, reset T and set V
- ACC = 0;
- FLAGS = V;
- return;
- case 0x88:
- //PNL 0:
- ACC = (RC & 0xFF);
- FLAGS = 0;
- return;
- case 0x89:
- //PNL 1:
- ACC = (RC & 0xFF) + 1;
- //TODO: FLAGS = ?;
- return;
- case 0x8A:
- //PNL 2:
- ACC = (RC & 0xFF) - ACC - 1;
- //TODO: FLAGS = ?;
- return;
- case 0x8B:
- //PNL 3:
- ACC = (RC & 0xFF) - ACC;
- //TODO: FLAGS = ?;
- return;
- case 0x8C:
- //PNL 4:
- ACC = (RC & 0xFF) + ACC;
- //TODO: FLAGS = ?;
- return;
- case 0x8D:
- //PNL 5:
- ACC = (RC & 0xFF) + ACC + 1;
- //TODO: FLAGS = ?;
- return;
- case 0x8E:
- //PNL 6:
- ACC = (RC & 0xFF) - 1;
- //TODO: FLAGS = ?;
- return;
- case 0x8F:
- //PNL 7:
- ACC = (RC & 0xFF);
- FLAGS = V;
- return;
- case 0x9A:
- //INIB="Inibe"
- // disables interrupts
- m_interrupts_enabled = false;
- return;
- case 0x9B:
- //PERM="Permite"
- // enables interrupts
- m_interrupts_enabled = true;
- return;
- case 0x9C:
- //ESP="Espera":
- // Holds execution and waits for an interrupt to occur.
- m_run = false;
- m_wait_for_interrupt = true;
- return;
- case 0x9D:
- //PARE="Pare":
- // Holds execution. This can only be recovered by
- // manually triggering execution again by
- // pressing the "Partida" (start) button in the panel
- m_run = false;
- m_wait_for_interrupt = false;
- return;
- case 0x9E:
- //TRI="Troca com Indexador":
- // Exchange the value of the accumulator with the index register
- value = ACC;
- ACC = READ_INDEX_REG();
- WRITE_INDEX_REG(value);
- return;
- case 0x9F:
- //IND="Enderecamento indireto":
- // Sets memory addressing for the next instruction to be indirect.
- m_indirect_addressing = true;
- m_scheduled_IND_bit_reset = false; //the next instruction execution will schedule it.
- return;
- case 0xD1:
- //Bit-Shift/Bit-Rotate instructions
- value = READ_BYTE_PATINHO(PC);
- INCREMENT_PC_4K;
- for (int i=0; i<4; i++){
- if (value & (1<<i)){
- /* The number of shifts or rotations is determined by the
- ammount of 1 bits in the lower 4 bits of 'value' */
- switch(value & 0xF0)
- {
- case 0x00:
- //DD="Deslocamento para a Direita"
- // Shift right
- FLAGS &= ~V;
- if (ACC & 1)
- FLAGS |= V;
-
- ACC >>= 1;
- break;
- case 0x20:
- //GD="Giro para a Direita"
- // Rotate right
- FLAGS &= ~V;
- if (ACC & 1)
- FLAGS |= V;
-
- ACC = ((ACC & 1) << 7) | (ACC >> 1);
- break;
- case 0x10: //DDV="Deslocamento para a Direita com Vai-um"
- // Shift right with Carry
- case 0x30: //GDV="Giro para a Direita com Vai-um"
- // Rotate right with Carry
-
- //both instructions are equivalent
- if (FLAGS & V)
- tmp = 0x100 | ACC;
- else
- tmp = ACC;
-
- FLAGS &= ~V;
- if (ACC & 1)
- FLAGS |= V;
-
- ACC = tmp >> 1;
- break;
- case 0x40: //DE="Deslocamento para a Esquerda"
- // Shift left
- FLAGS &= ~V;
- if (ACC & (1<<7))
- FLAGS |= V;
-
- ACC <<= 1;
- break;
- case 0x60: //GE="Giro para a Esquerda"
- // Rotate left
- FLAGS &= ~V;
- if (ACC & (1<<7))
- FLAGS |= V;
-
- ACC = (ACC << 1) | ((ACC >> 7) & 1);
- break;
- case 0x50: //DEV="Deslocamento para a Esquerda com Vai-um"
- // Shift left with Carry
- case 0x70: //GEV="Giro para a Esquerda com Vai-um"
- // Rotate left with Carry
-
- //both instructions are equivalent
- if (FLAGS & V)
- tmp = (ACC << 1) | 1;
- else
- tmp = (ACC << 1);
-
- FLAGS &= ~V;
- if (tmp & (1<<8))
- FLAGS |= V;
-
- ACC = tmp & 0xFF;
- break;
- case 0x80: //DDS="Deslocamento para a Direita com duplicacao de Sinal"
- // Rotate right with signal duplication
- FLAGS &= ~V;
- if (ACC & 1)
- FLAGS |= V;
-
- ACC = (ACC & (1 << 7)) | ACC >> 1;
- break;
- default:
- printf("Illegal instruction: %02X %02X\n", opcode, value);
- return;
- }
- }
- }
- return;
- }
-
- switch (opcode & 0xF0){
- case 0x00:
- //PLA = "Pula": Jump to address
- addr = compute_effective_address((opcode & 0x0F) << 8 | READ_BYTE_PATINHO(PC));
- INCREMENT_PC_4K;
- PC = addr;
- return;
- case 0x10:
- //PLAX = "Pula indexado": Jump to indexed address
- tmp = (opcode & 0x0F) << 8 | READ_BYTE_PATINHO(PC);
- INCREMENT_PC_4K;
- m_idx = READ_INDEX_REG();
- PC = compute_effective_address(m_idx + tmp);
- return;
- case 0x20:
- //ARM = "Armazena": Store the value of the accumulator into a given memory position
- addr = compute_effective_address((opcode & 0x0F) << 8 | READ_BYTE_PATINHO(PC));
- INCREMENT_PC_4K;
- WRITE_BYTE_PATINHO(addr, ACC);
- return;
- case 0x30:
- //ARMX = "Armazena indexado": Store the value of the accumulator into a given indexed memory position
- tmp = (opcode & 0x0F) << 8 | READ_BYTE_PATINHO(PC);
- INCREMENT_PC_4K;
- m_idx = READ_INDEX_REG();
- addr = compute_effective_address(m_idx + tmp);
- WRITE_BYTE_PATINHO(addr, ACC);
- return;
- case 0x40:
- //CAR = "Carrega": Load a value from a given memory position into the accumulator
- addr = compute_effective_address((opcode & 0x0F) << 8 | READ_BYTE_PATINHO(PC));
- INCREMENT_PC_4K;
- ACC = READ_BYTE_PATINHO(addr);
- return;
- case 0x50:
- //CARX = "Carga indexada": Load a value from a given indexed memory position into the accumulator
- tmp = (opcode & 0x0F) << 8 | READ_BYTE_PATINHO(PC);
- INCREMENT_PC_4K;
- m_idx = READ_INDEX_REG();
- addr = compute_effective_address(m_idx + tmp);
- ACC = READ_BYTE_PATINHO(addr);
- return;
- case 0x60:
- //SOM = "Soma": Add a value from a given memory position into the accumulator
- addr = compute_effective_address((opcode & 0x0F) << 8 | READ_BYTE_PATINHO(PC));
- INCREMENT_PC_4K;
- ACC += READ_BYTE_PATINHO(addr);
- //TODO: update V and T flags
- return;
- case 0x70:
- //SOMX = "Soma indexada": Add a value from a given indexed memory position into the accumulator
- tmp = (opcode & 0x0F) << 8 | READ_BYTE_PATINHO(PC);
- INCREMENT_PC_4K;
- m_idx = READ_INDEX_REG();
- addr = compute_effective_address(m_idx + tmp);
- ACC += READ_BYTE_PATINHO(addr);
- //TODO: update V and T flags
- return;
- case 0xA0:
- //PLAN = "Pula se ACC negativo": Jump to a given address if ACC is negative
- addr = compute_effective_address((opcode & 0x0F) << 8 | READ_BYTE_PATINHO(PC));
- INCREMENT_PC_4K;
- if ((signed char) ACC < 0)
- PC = addr;
- return;
- case 0xB0:
- //PLAZ = "Pula se ACC for zero": Jump to a given address if ACC is zero
- addr = compute_effective_address((opcode & 0x0F) << 8 | READ_BYTE_PATINHO(PC));
- INCREMENT_PC_4K;
- if (ACC == 0)
- PC = addr;
- return;
- case 0xC0:
- //Executes I/O functions
- //TODO: Implement-me!
- value = READ_BYTE_PATINHO(PC);
- INCREMENT_PC_4K;
- channel = opcode & 0x0F;
- function = value & 0x0F;
- switch(value & 0xF0){
- case 0x10:
- printf("Unimplemented FNC /%X%X instruction\n", channel, function);
- break;
- case 0x20:
- //SAL="Salta"
- // Skips a couple bytes if a condition is met
- skip = false;
- switch(function)
- {
- case 1:
- if (m_peripherals[channel].io_status == DEVICE_READY)
- skip = true;
- break;
- case 2:
- if (m_peripherals[channel].device_is_ok)
- skip = true;
- break;
- case 4:
- if (m_peripherals[channel].IRQ_request == true)
- skip = true;
- break;
- }
-
- if (skip){
- INCREMENT_PC_4K;
- INCREMENT_PC_4K;
- }
- break;
- case 0x40:
- printf("Unimplemented ENTR /%X0 instruction\n", channel);
- break;
- case 0x80:
- printf("Unimplemented SAI /%X0 instruction (ACC = 0x%02X '%c')\n", channel, ACC, ACC);
- break;
- }
- return;
- case 0xE0:
- //SUS = "Subtrai um ou Salta": Subtract one from the data in the given address
- // or, if the data is zero, then simply skip a couple bytes.
- addr = compute_effective_address((opcode & 0x0F) << 8 | READ_BYTE_PATINHO(PC));
- INCREMENT_PC_4K;
- value = READ_BYTE_PATINHO(addr);
- if (value > 0){
- WRITE_BYTE_PATINHO(addr, value-1);
- } else {
- INCREMENT_PC_4K;
- INCREMENT_PC_4K;
- }
- return;
- case 0xF0:
- //PUG = "Pula e guarda": Jump and store.
- // It stores the return address to addr and addr+1
- // And then jumps to addr+2
- addr = compute_effective_address((opcode & 0x0F) << 8 | READ_BYTE_PATINHO(PC));
- INCREMENT_PC_4K;
- WRITE_BYTE_PATINHO(addr, (PC >> 8) & 0x0F);
- WRITE_BYTE_PATINHO(addr+1, PC & 0xFF);
- PC = addr+2;
- return;
- }
- printf("unimplemented opcode: 0x%02X\n", opcode);
+ debugger_instruction_hook(this, PC);
+ offs_t addr;
+ bool skip;
+ unsigned int tmp;
+ unsigned char value, channel, function;
+ unsigned char opcode = READ_BYTE_PATINHO(PC);
+ INCREMENT_PC_4K;
+
+ if (m_scheduled_IND_bit_reset)
+ m_indirect_addressing = false;
+
+ if (m_indirect_addressing)
+ m_scheduled_IND_bit_reset = true;
+
+ switch (opcode){
+ case 0xD2:
+ //XOR: Computes the bitwise XOR of an immediate into the accumulator
+ ACC ^= READ_BYTE_PATINHO(PC);
+ INCREMENT_PC_4K;
+ //TODO: update T and V flags
+ return;
+ case 0xD4:
+ //NAND: Computes the bitwise XOR of an immediate into the accumulator
+ ACC = ~(ACC & READ_BYTE_PATINHO(PC));
+ INCREMENT_PC_4K;
+ //TODO: update T and V flags
+ return;
+ case 0xD8:
+ //SOMI="Soma Imediato":
+ // Add an immediate into the accumulator
+ ACC += READ_BYTE_PATINHO(PC);
+ INCREMENT_PC_4K;
+ //TODO: update T and V flags
+ return;
+ case 0xDA:
+ //CARI="Carrega Imediato":
+ // Load an immediate into the accumulator
+ ACC = READ_BYTE_PATINHO(PC);
+ INCREMENT_PC_4K;
+ return;
+ case 0x80:
+ //LIMPO:
+ // Clear accumulator and flags
+ ACC = 0;
+ FLAGS = 0;
+ return;
+ case 0x81:
+ //UM="One":
+ // Load 1 into accumulator
+ // and clear the flags
+ ACC = 1;
+ FLAGS = 0;
+ return;
+ case 0x82:
+ //CMP1:
+ // Compute One's complement of the accumulator
+ // and clear the flags
+ ACC = ~ACC;
+ FLAGS = 0;
+ return;
+ case 0x83:
+ //CMP2:
+ // Compute Two's complement of the accumulator
+ // and updates flags according to the result of the operation
+ ACC = ~ACC + 1;
+ FLAGS = 0; //TODO: fix-me (I'm not sure yet how to compute the flags here)
+ return;
+ case 0x84:
+ //LIM="Limpa":
+ // Clear flags
+ FLAGS = 0;
+ return;
+ case 0x85:
+ //INC:
+ // Increment accumulator
+ ACC++;
+ FLAGS = 0; //TODO: fix-me (I'm not sure yet how to compute the flags here)
+ return;
+ case 0x86:
+ //UNEG="Um Negativo":
+ // Load -1 into accumulator and clear flags
+ ACC = -1;
+ FLAGS = 0;
+ return;
+ case 0x87:
+ //LIMP1:
+ // Clear accumulator, reset T and set V
+ ACC = 0;
+ FLAGS = V;
+ return;
+ case 0x88:
+ //PNL 0:
+ ACC = (RC & 0xFF);
+ FLAGS = 0;
+ return;
+ case 0x89:
+ //PNL 1:
+ ACC = (RC & 0xFF) + 1;
+ //TODO: FLAGS = ?;
+ return;
+ case 0x8A:
+ //PNL 2:
+ ACC = (RC & 0xFF) - ACC - 1;
+ //TODO: FLAGS = ?;
+ return;
+ case 0x8B:
+ //PNL 3:
+ ACC = (RC & 0xFF) - ACC;
+ //TODO: FLAGS = ?;
+ return;
+ case 0x8C:
+ //PNL 4:
+ ACC = (RC & 0xFF) + ACC;
+ //TODO: FLAGS = ?;
+ return;
+ case 0x8D:
+ //PNL 5:
+ ACC = (RC & 0xFF) + ACC + 1;
+ //TODO: FLAGS = ?;
+ return;
+ case 0x8E:
+ //PNL 6:
+ ACC = (RC & 0xFF) - 1;
+ //TODO: FLAGS = ?;
+ return;
+ case 0x8F:
+ //PNL 7:
+ ACC = (RC & 0xFF);
+ FLAGS = V;
+ return;
+ case 0x9A:
+ //INIB="Inibe"
+ // disables interrupts
+ m_interrupts_enabled = false;
+ return;
+ case 0x9B:
+ //PERM="Permite"
+ // enables interrupts
+ m_interrupts_enabled = true;
+ return;
+ case 0x9C:
+ //ESP="Espera":
+ // Holds execution and waits for an interrupt to occur.
+ m_run = false;
+ m_wait_for_interrupt = true;
+ return;
+ case 0x9D:
+ //PARE="Pare":
+ // Holds execution. This can only be recovered by
+ // manually triggering execution again by
+ // pressing the "Partida" (start) button in the panel
+ m_run = false;
+ m_wait_for_interrupt = false;
+ return;
+ case 0x9E:
+ //TRI="Troca com Indexador":
+ // Exchange the value of the accumulator with the index register
+ value = ACC;
+ ACC = READ_INDEX_REG();
+ WRITE_INDEX_REG(value);
+ return;
+ case 0x9F:
+ //IND="Enderecamento indireto":
+ // Sets memory addressing for the next instruction to be indirect.
+ m_indirect_addressing = true;
+ m_scheduled_IND_bit_reset = false; //the next instruction execution will schedule it.
+ return;
+ case 0xD1:
+ //Bit-Shift/Bit-Rotate instructions
+ value = READ_BYTE_PATINHO(PC);
+ INCREMENT_PC_4K;
+ for (int i=0; i<4; i++){
+ if (value & (1<<i)){
+ /* The number of shifts or rotations is determined by the
+ ammount of 1 bits in the lower 4 bits of 'value' */
+ switch(value & 0xF0)
+ {
+ case 0x00:
+ //DD="Deslocamento para a Direita"
+ // Shift right
+ FLAGS &= ~V;
+ if (ACC & 1)
+ FLAGS |= V;
+
+ ACC >>= 1;
+ break;
+ case 0x20:
+ //GD="Giro para a Direita"
+ // Rotate right
+ FLAGS &= ~V;
+ if (ACC & 1)
+ FLAGS |= V;
+
+ ACC = ((ACC & 1) << 7) | (ACC >> 1);
+ break;
+ case 0x10: //DDV="Deslocamento para a Direita com Vai-um"
+ // Shift right with Carry
+ case 0x30: //GDV="Giro para a Direita com Vai-um"
+ // Rotate right with Carry
+
+ //both instructions are equivalent
+ if (FLAGS & V)
+ tmp = 0x100 | ACC;
+ else
+ tmp = ACC;
+
+ FLAGS &= ~V;
+ if (ACC & 1)
+ FLAGS |= V;
+
+ ACC = tmp >> 1;
+ break;
+ case 0x40: //DE="Deslocamento para a Esquerda"
+ // Shift left
+ FLAGS &= ~V;
+ if (ACC & (1<<7))
+ FLAGS |= V;
+
+ ACC <<= 1;
+ break;
+ case 0x60: //GE="Giro para a Esquerda"
+ // Rotate left
+ FLAGS &= ~V;
+ if (ACC & (1<<7))
+ FLAGS |= V;
+
+ ACC = (ACC << 1) | ((ACC >> 7) & 1);
+ break;
+ case 0x50: //DEV="Deslocamento para a Esquerda com Vai-um"
+ // Shift left with Carry
+ case 0x70: //GEV="Giro para a Esquerda com Vai-um"
+ // Rotate left with Carry
+
+ //both instructions are equivalent
+ if (FLAGS & V)
+ tmp = (ACC << 1) | 1;
+ else
+ tmp = (ACC << 1);
+
+ FLAGS &= ~V;
+ if (tmp & (1<<8))
+ FLAGS |= V;
+
+ ACC = tmp & 0xFF;
+ break;
+ case 0x80: //DDS="Deslocamento para a Direita com duplicacao de Sinal"
+ // Rotate right with signal duplication
+ FLAGS &= ~V;
+ if (ACC & 1)
+ FLAGS |= V;
+
+ ACC = (ACC & (1 << 7)) | ACC >> 1;
+ break;
+ default:
+ printf("Illegal instruction: %02X %02X\n", opcode, value);
+ return;
+ }
+ }
+ }
+ return;
+ }
+
+ switch (opcode & 0xF0){
+ case 0x00:
+ //PLA = "Pula": Jump to address
+ addr = compute_effective_address((opcode & 0x0F) << 8 | READ_BYTE_PATINHO(PC));
+ INCREMENT_PC_4K;
+ PC = addr;
+ return;
+ case 0x10:
+ //PLAX = "Pula indexado": Jump to indexed address
+ tmp = (opcode & 0x0F) << 8 | READ_BYTE_PATINHO(PC);
+ INCREMENT_PC_4K;
+ m_idx = READ_INDEX_REG();
+ PC = compute_effective_address(m_idx + tmp);
+ return;
+ case 0x20:
+ //ARM = "Armazena": Store the value of the accumulator into a given memory position
+ addr = compute_effective_address((opcode & 0x0F) << 8 | READ_BYTE_PATINHO(PC));
+ INCREMENT_PC_4K;
+ WRITE_BYTE_PATINHO(addr, ACC);
+ return;
+ case 0x30:
+ //ARMX = "Armazena indexado": Store the value of the accumulator into a given indexed memory position
+ tmp = (opcode & 0x0F) << 8 | READ_BYTE_PATINHO(PC);
+ INCREMENT_PC_4K;
+ m_idx = READ_INDEX_REG();
+ addr = compute_effective_address(m_idx + tmp);
+ WRITE_BYTE_PATINHO(addr, ACC);
+ return;
+ case 0x40:
+ //CAR = "Carrega": Load a value from a given memory position into the accumulator
+ addr = compute_effective_address((opcode & 0x0F) << 8 | READ_BYTE_PATINHO(PC));
+ INCREMENT_PC_4K;
+ ACC = READ_BYTE_PATINHO(addr);
+ return;
+ case 0x50:
+ //CARX = "Carga indexada": Load a value from a given indexed memory position into the accumulator
+ tmp = (opcode & 0x0F) << 8 | READ_BYTE_PATINHO(PC);
+ INCREMENT_PC_4K;
+ m_idx = READ_INDEX_REG();
+ addr = compute_effective_address(m_idx + tmp);
+ ACC = READ_BYTE_PATINHO(addr);
+ return;
+ case 0x60:
+ //SOM = "Soma": Add a value from a given memory position into the accumulator
+ addr = compute_effective_address((opcode & 0x0F) << 8 | READ_BYTE_PATINHO(PC));
+ INCREMENT_PC_4K;
+ ACC += READ_BYTE_PATINHO(addr);
+ //TODO: update V and T flags
+ return;
+ case 0x70:
+ //SOMX = "Soma indexada": Add a value from a given indexed memory position into the accumulator
+ tmp = (opcode & 0x0F) << 8 | READ_BYTE_PATINHO(PC);
+ INCREMENT_PC_4K;
+ m_idx = READ_INDEX_REG();
+ addr = compute_effective_address(m_idx + tmp);
+ ACC += READ_BYTE_PATINHO(addr);
+ //TODO: update V and T flags
+ return;
+ case 0xA0:
+ //PLAN = "Pula se ACC negativo": Jump to a given address if ACC is negative
+ addr = compute_effective_address((opcode & 0x0F) << 8 | READ_BYTE_PATINHO(PC));
+ INCREMENT_PC_4K;
+ if ((signed char) ACC < 0)
+ PC = addr;
+ return;
+ case 0xB0:
+ //PLAZ = "Pula se ACC for zero": Jump to a given address if ACC is zero
+ addr = compute_effective_address((opcode & 0x0F) << 8 | READ_BYTE_PATINHO(PC));
+ INCREMENT_PC_4K;
+ if (ACC == 0)
+ PC = addr;
+ return;
+ case 0xC0:
+ //Executes I/O functions
+ //TODO: Implement-me!
+ value = READ_BYTE_PATINHO(PC);
+ INCREMENT_PC_4K;
+ channel = opcode & 0x0F;
+ function = value & 0x0F;
+ switch(value & 0xF0){
+ case 0x10:
+ printf("Unimplemented FNC /%X%X instruction\n", channel, function);
+ break;
+ case 0x20:
+ //SAL="Salta"
+ // Skips a couple bytes if a condition is met
+ skip = false;
+ switch(function)
+ {
+ case 1:
+ if (m_peripherals[channel].io_status == DEVICE_READY)
+ skip = true;
+ break;
+ case 2:
+ if (m_peripherals[channel].device_is_ok)
+ skip = true;
+ break;
+ case 4:
+ if (m_peripherals[channel].IRQ_request == true)
+ skip = true;
+ break;
+ }
+
+ if (skip){
+ INCREMENT_PC_4K;
+ INCREMENT_PC_4K;
+ }
+ break;
+ case 0x40:
+ printf("Unimplemented ENTR /%X0 instruction\n", channel);
+ break;
+ case 0x80:
+ printf("Unimplemented SAI /%X0 instruction (ACC = 0x%02X '%c')\n", channel, ACC, ACC);
+ break;
+ }
+ return;
+ case 0xE0:
+ //SUS = "Subtrai um ou Salta": Subtract one from the data in the given address
+ // or, if the data is zero, then simply skip a couple bytes.
+ addr = compute_effective_address((opcode & 0x0F) << 8 | READ_BYTE_PATINHO(PC));
+ INCREMENT_PC_4K;
+ value = READ_BYTE_PATINHO(addr);
+ if (value > 0){
+ WRITE_BYTE_PATINHO(addr, value-1);
+ } else {
+ INCREMENT_PC_4K;
+ INCREMENT_PC_4K;
+ }
+ return;
+ case 0xF0:
+ //PUG = "Pula e guarda": Jump and store.
+ // It stores the return address to addr and addr+1
+ // And then jumps to addr+2
+ addr = compute_effective_address((opcode & 0x0F) << 8 | READ_BYTE_PATINHO(PC));
+ INCREMENT_PC_4K;
+ WRITE_BYTE_PATINHO(addr, (PC >> 8) & 0x0F);
+ WRITE_BYTE_PATINHO(addr+1, PC & 0xFF);
+ PC = addr+2;
+ return;
+ }
+ printf("unimplemented opcode: 0x%02X\n", opcode);
}
offs_t patinho_feio_cpu_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options)
{
- extern CPU_DISASSEMBLE( patinho_feio );
- return CPU_DISASSEMBLE_NAME(patinho_feio)(this, buffer, pc, oprom, opram, options);
+ extern CPU_DISASSEMBLE( patinho_feio );
+ return CPU_DISASSEMBLE_NAME(patinho_feio)(this, buffer, pc, oprom, opram, options);
}
-
diff --git a/src/devices/cpu/patinhofeio/patinho_feio.h b/src/devices/cpu/patinhofeio/patinho_feio.h
index 030077ea78e..df80799d592 100644
--- a/src/devices/cpu/patinhofeio/patinho_feio.h
+++ b/src/devices/cpu/patinhofeio/patinho_feio.h
@@ -6,99 +6,99 @@
#define __PATINHOFEIO_H__
#define MCFG_PATINHO_RC_READ_CB(_devcb) \
- devcb = &patinho_feio_cpu_device::set_rc_read_callback(*device, DEVCB_##_devcb);
+ devcb = &patinho_feio_cpu_device::set_rc_read_callback(*device, DEVCB_##_devcb);
/* register IDs */
enum
{
- PATINHO_FEIO_CI=1, PATINHO_FEIO_ACC, PATINHO_FEIO_IDX, PATINHO_FEIO_RC
+ PATINHO_FEIO_CI=1, PATINHO_FEIO_ACC, PATINHO_FEIO_IDX, PATINHO_FEIO_RC
};
enum {
- DEVICE_BUSY=0,
- DEVICE_READY=1
+ DEVICE_BUSY=0,
+ DEVICE_READY=1
};
class patinho_feio_peripheral
{
public:
- patinho_feio_peripheral()
- : io_status(DEVICE_READY)
- , device_is_ok(true)
- , IRQ_request(false)
- { };
-
- int io_status;
- bool device_is_ok;
- bool IRQ_request;
+ patinho_feio_peripheral()
+ : io_status(DEVICE_READY)
+ , device_is_ok(true)
+ , IRQ_request(false)
+ { };
+
+ int io_status;
+ bool device_is_ok;
+ bool IRQ_request;
};
class patinho_feio_cpu_device : public cpu_device
{
public:
- // construction/destruction
- patinho_feio_cpu_device(const machine_config &mconfig, const char *_tag, device_t *_owner, UINT32 _clock);
+ // construction/destruction
+ patinho_feio_cpu_device(const machine_config &mconfig, const char *_tag, device_t *_owner, UINT32 _clock);
- template<class _Object> static devcb_base &set_rc_read_callback(device_t &device, _Object object) { return downcast<patinho_feio_cpu_device &>(device).m_rc_read_cb.set_callback(object); }
+ template<class _Object> static devcb_base &set_rc_read_callback(device_t &device, _Object object) { return downcast<patinho_feio_cpu_device &>(device).m_rc_read_cb.set_callback(object); }
protected:
-
- virtual void execute_run() override;
- virtual offs_t disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options) override;
- address_space_config m_program_config;
+ virtual void execute_run() override;
+ virtual offs_t disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options) override;
- /* processor registers */
- unsigned char m_acc; /* accumulator (8 bits) */
- unsigned int m_pc; /* program counter (12 bits)
+ address_space_config m_program_config;
+
+ /* processor registers */
+ unsigned char m_acc; /* accumulator (8 bits) */
+ unsigned int m_pc; /* program counter (12 bits)
* Actual register name is CI, which
* stands for "Contador de Instrucao"
* or "instructions counter".
*/
- unsigned int m_rc; /* RC = "Registrador de Chaves" (Keys Register)
+ unsigned int m_rc; /* RC = "Registrador de Chaves" (Keys Register)
* It represents the 12 bits of input data
* from toggle switches in the computer panel
*/
- unsigned char m_idx;
+ unsigned char m_idx;
+
+ /* processor state flip-flops */
+ bool m_run; /* processor is running */
+ bool m_wait_for_interrupt;
+ bool m_interrupts_enabled;
+ bool m_scheduled_IND_bit_reset;
+ bool m_indirect_addressing;
- /* processor state flip-flops */
- bool m_run; /* processor is running */
- bool m_wait_for_interrupt;
- bool m_interrupts_enabled;
- bool m_scheduled_IND_bit_reset;
- bool m_indirect_addressing;
+ int m_flags;
+ // V = "Vai um" (Carry flag)
+ // T = "Transbordo" (Overflow flag)
- int m_flags;
- // V = "Vai um" (Carry flag)
- // T = "Transbordo" (Overflow flag)
-
- patinho_feio_peripheral m_peripherals[16];
+ patinho_feio_peripheral m_peripherals[16];
- int m_address_mask; /* address mask */
- int m_icount;
+ int m_address_mask; /* address mask */
+ int m_icount;
- address_space *m_program;
+ address_space *m_program;
- // device-level overrides
- virtual void device_start() override;
- virtual void device_reset() override;
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
- // device_execute_interface overrides
- virtual UINT32 execute_min_cycles() const override { return 1; }
- virtual UINT32 execute_max_cycles() const override { return 2; }
+ // device_execute_interface overrides
+ virtual UINT32 execute_min_cycles() const override { return 1; }
+ virtual UINT32 execute_max_cycles() const override { return 2; }
- // device_memory_interface overrides
- virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override { return (spacenum == AS_PROGRAM) ? &m_program_config : NULL; }
+ // device_memory_interface overrides
+ virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override { return (spacenum == AS_PROGRAM) ? &m_program_config : NULL; }
- // device_disasm_interface overrides
- virtual UINT32 disasm_min_opcode_bytes() const override { return 1; }
- virtual UINT32 disasm_max_opcode_bytes() const override { return 2; }
+ // device_disasm_interface overrides
+ virtual UINT32 disasm_min_opcode_bytes() const override { return 1; }
+ virtual UINT32 disasm_max_opcode_bytes() const override { return 2; }
private:
- void execute_instruction();
- unsigned int compute_effective_address(unsigned int addr);
- UINT16 read_panel_keys_register();
- devcb_read16 m_rc_read_cb;
+ void execute_instruction();
+ unsigned int compute_effective_address(unsigned int addr);
+ UINT16 read_panel_keys_register();
+ devcb_read16 m_rc_read_cb;
};
diff --git a/src/devices/cpu/patinhofeio/patinho_feio_dasm.cpp b/src/devices/cpu/patinhofeio/patinho_feio_dasm.cpp
index ac78ef4be73..f2f2899af6e 100644
--- a/src/devices/cpu/patinhofeio/patinho_feio_dasm.cpp
+++ b/src/devices/cpu/patinhofeio/patinho_feio_dasm.cpp
@@ -5,161 +5,161 @@
CPU_DISASSEMBLE( patinho_feio )
{
- int addr, value, n, f;
+ int addr, value, n, f;
- switch (oprom[0] & 0xF0)
- {
- case 0x00:
- //PLA = "Pula": Unconditionally JUMP to effective address
- addr = (oprom[0] & 0x0F) << 8 | oprom[1];
- sprintf (buffer, "PLA /%03X", addr);
- return 2;
- case 0x10:
- //PLAX = "Pulo indexado": Unconditionally JUMP to indexed address
- addr = (oprom[0] & 0x0F) << 8 | oprom[1];
- sprintf (buffer, "PLAX (IDX) + /%03X", addr);
- return 2;
- case 0x20:
- //ARM = "Armazena": Stores the contents of the
- // accumulator in the given 12bit address
- addr = (oprom[0] & 0x0F) << 8 | oprom[1];
- if (addr==0){
- sprintf (buffer, "ARM (IDX)");
- }else{
- sprintf (buffer, "ARM /%03X", addr);
- }
- return 2;
- case 0x30:
- //ARMX = "Armazenamento indexado": Stores the contents of the accumulator in the
- // given 12bit address (indexed by IDX)
- addr = (oprom[0] & 0x0F) << 8 | oprom[1];
- sprintf (buffer, "ARMX (IDX) + /%03X", addr);
- return 2;
- case 0x40:
- //CAR = "Carrega": Loads the contents of the given 12bit address
- // into the accumulator
- addr = (oprom[0] & 0x0F) << 8 | oprom[1];
- if (addr==0){
- sprintf (buffer, "CAR (IDX)");
- }else{
- sprintf (buffer, "CAR /%03X", addr);
- }
- return 2;
- case 0x50:
- //CARX = "Carga indexada": Loads the contents of the given 12bit address
- // (indexed by IDX) into the accumulator
- addr = (oprom[0] & 0x0F) << 8 | oprom[1];
- sprintf (buffer, "CARX (IDX) + /%03X", addr);
- return 2;
- case 0x60:
- //SOM = "Soma": Adds the contents of the given 12bit address
- // into the accumulator
- addr = (oprom[0] & 0x0F) << 8 | oprom[1];
- sprintf (buffer, "SOM /%03X", addr);
- return 2;
- case 0x70:
- //SOMX = "Soma indexada": Adds the contents of the given 12bit address
- // (indexed by IDX) into the accumulator
- addr = (oprom[0] & 0x0F) << 8 | oprom[1];
- sprintf (buffer, "SOMX (IDX) + /%03X", addr);
- return 2;
- case 0xA0:
- //PLAN = "Pula se ACC for negativo": Jumps to the 12bit address
- // if the accumulator is negative
- addr = (oprom[0] & 0x0F) << 8 | oprom[1];
- sprintf (buffer, "PLAN /%03X", addr);
- return 2;
- case 0xB0:
- //PLAZ = "Pula se ACC for zero": Jumps to the 12bit address
- // if the accumulator is zero
- addr = (oprom[0] & 0x0F) << 8 | oprom[1];
- sprintf (buffer, "PLAZ /%03X", addr);
- return 2;
- case 0xC0:
- n = (oprom[0] & 0x0F);
- f = (oprom[1] & 0x0F);
- n+= (n < 10) ? '0' : 'A'-10;
- f+= (f < 10) ? '0' : 'A'-10;
- switch(oprom[1] & 0xF0)
- {
- case 0x10: sprintf (buffer, "FNC /%c%c", n, f); return 2;
- case 0x20: sprintf (buffer, "SAL /%c%c", n, f); return 2;
- case 0x40: sprintf (buffer, "ENTR /%c0", n); return 2;
- case 0x80: sprintf (buffer, "SAI /%c0", n); return 2;
- }
- break;
- case 0xD0:
- value = oprom[1] & 0x0F;
- switch (oprom[0] & 0x0F)
- {
- case 0x01:
- switch (oprom[1] & 0xF0)
- {
- case 0x00: sprintf (buffer, "DD /%01X", value); return 2; //DD = "Deslocamento para a direita": Shift right
- case 0x10: sprintf (buffer, "DDV /%01X", value); return 2; //DDV = "Deslocamento para a direita c/ V": Shift right with carry
- case 0x20: sprintf (buffer, "GD /%01X", value); return 2; //GD = "Giro para a direita": Rotate right
- case 0x30: sprintf (buffer, "GDV /%01X", value); return 2; //GDV = "Giro para a direita c/ V": Rotate right with carry
- case 0x40: sprintf (buffer, "DE /%01X", value); return 2; //DE = "Deslocamento para a esquerda": Shift right
- case 0x50: sprintf (buffer, "DEV /%01X", value); return 2; //DEV = "Deslocamento para a esquerda c/ V": Shift right with carry
- case 0x60: sprintf (buffer, "GE /%01X", value); return 2; //GE = "Giro para a esquerda": Rotate right
- case 0x70: sprintf (buffer, "GEV /%01X", value); return 2; //GEV = "Giro para a esquerda c/ V": Rotate right with carry
- case 0x80: sprintf (buffer, "DDS /%01X", value); return 2; //DDS = "Deslocamento para a direita com duplicacao de sinal": Shift right with sign duplication
- }
- break;
- case 0x02: sprintf (buffer, "XOR /%02X", oprom[1]); return 2; //Logical XOR
- case 0x04: sprintf (buffer, "NAND /%02X", oprom[1]); return 2; //Logical NAND
- case 0x08: sprintf (buffer, "SOMI /%02X", oprom[1]); return 2; //SOMI = "Soma imediata": Add immediate value into accumulator
- case 0x0A: sprintf (buffer, "CARI /%02X", oprom[1]); return 2; //CARI = "Carrega imediato": Loads an immediate value into the accumulator
- }
- break;
- case 0xE0:
- //SUS = "Subtrai um ou salta"
- addr = (oprom[0] & 0x0F) << 8 | oprom[1];
- sprintf (buffer, "SUS /%03X", addr);
- return 2;
- case 0xF0:
- //PUG = "Pula e guarda"
- addr = (oprom[0] & 0x0F) << 8 | oprom[1];
- sprintf (buffer, "PUG /%03X", addr);
- return 2;
- }
+ switch (oprom[0] & 0xF0)
+ {
+ case 0x00:
+ //PLA = "Pula": Unconditionally JUMP to effective address
+ addr = (oprom[0] & 0x0F) << 8 | oprom[1];
+ sprintf (buffer, "PLA /%03X", addr);
+ return 2;
+ case 0x10:
+ //PLAX = "Pulo indexado": Unconditionally JUMP to indexed address
+ addr = (oprom[0] & 0x0F) << 8 | oprom[1];
+ sprintf (buffer, "PLAX (IDX) + /%03X", addr);
+ return 2;
+ case 0x20:
+ //ARM = "Armazena": Stores the contents of the
+ // accumulator in the given 12bit address
+ addr = (oprom[0] & 0x0F) << 8 | oprom[1];
+ if (addr==0){
+ sprintf (buffer, "ARM (IDX)");
+ }else{
+ sprintf (buffer, "ARM /%03X", addr);
+ }
+ return 2;
+ case 0x30:
+ //ARMX = "Armazenamento indexado": Stores the contents of the accumulator in the
+ // given 12bit address (indexed by IDX)
+ addr = (oprom[0] & 0x0F) << 8 | oprom[1];
+ sprintf (buffer, "ARMX (IDX) + /%03X", addr);
+ return 2;
+ case 0x40:
+ //CAR = "Carrega": Loads the contents of the given 12bit address
+ // into the accumulator
+ addr = (oprom[0] & 0x0F) << 8 | oprom[1];
+ if (addr==0){
+ sprintf (buffer, "CAR (IDX)");
+ }else{
+ sprintf (buffer, "CAR /%03X", addr);
+ }
+ return 2;
+ case 0x50:
+ //CARX = "Carga indexada": Loads the contents of the given 12bit address
+ // (indexed by IDX) into the accumulator
+ addr = (oprom[0] & 0x0F) << 8 | oprom[1];
+ sprintf (buffer, "CARX (IDX) + /%03X", addr);
+ return 2;
+ case 0x60:
+ //SOM = "Soma": Adds the contents of the given 12bit address
+ // into the accumulator
+ addr = (oprom[0] & 0x0F) << 8 | oprom[1];
+ sprintf (buffer, "SOM /%03X", addr);
+ return 2;
+ case 0x70:
+ //SOMX = "Soma indexada": Adds the contents of the given 12bit address
+ // (indexed by IDX) into the accumulator
+ addr = (oprom[0] & 0x0F) << 8 | oprom[1];
+ sprintf (buffer, "SOMX (IDX) + /%03X", addr);
+ return 2;
+ case 0xA0:
+ //PLAN = "Pula se ACC for negativo": Jumps to the 12bit address
+ // if the accumulator is negative
+ addr = (oprom[0] & 0x0F) << 8 | oprom[1];
+ sprintf (buffer, "PLAN /%03X", addr);
+ return 2;
+ case 0xB0:
+ //PLAZ = "Pula se ACC for zero": Jumps to the 12bit address
+ // if the accumulator is zero
+ addr = (oprom[0] & 0x0F) << 8 | oprom[1];
+ sprintf (buffer, "PLAZ /%03X", addr);
+ return 2;
+ case 0xC0:
+ n = (oprom[0] & 0x0F);
+ f = (oprom[1] & 0x0F);
+ n+= (n < 10) ? '0' : 'A'-10;
+ f+= (f < 10) ? '0' : 'A'-10;
+ switch(oprom[1] & 0xF0)
+ {
+ case 0x10: sprintf (buffer, "FNC /%c%c", n, f); return 2;
+ case 0x20: sprintf (buffer, "SAL /%c%c", n, f); return 2;
+ case 0x40: sprintf (buffer, "ENTR /%c0", n); return 2;
+ case 0x80: sprintf (buffer, "SAI /%c0", n); return 2;
+ }
+ break;
+ case 0xD0:
+ value = oprom[1] & 0x0F;
+ switch (oprom[0] & 0x0F)
+ {
+ case 0x01:
+ switch (oprom[1] & 0xF0)
+ {
+ case 0x00: sprintf (buffer, "DD /%01X", value); return 2; //DD = "Deslocamento para a direita": Shift right
+ case 0x10: sprintf (buffer, "DDV /%01X", value); return 2; //DDV = "Deslocamento para a direita c/ V": Shift right with carry
+ case 0x20: sprintf (buffer, "GD /%01X", value); return 2; //GD = "Giro para a direita": Rotate right
+ case 0x30: sprintf (buffer, "GDV /%01X", value); return 2; //GDV = "Giro para a direita c/ V": Rotate right with carry
+ case 0x40: sprintf (buffer, "DE /%01X", value); return 2; //DE = "Deslocamento para a esquerda": Shift right
+ case 0x50: sprintf (buffer, "DEV /%01X", value); return 2; //DEV = "Deslocamento para a esquerda c/ V": Shift right with carry
+ case 0x60: sprintf (buffer, "GE /%01X", value); return 2; //GE = "Giro para a esquerda": Rotate right
+ case 0x70: sprintf (buffer, "GEV /%01X", value); return 2; //GEV = "Giro para a esquerda c/ V": Rotate right with carry
+ case 0x80: sprintf (buffer, "DDS /%01X", value); return 2; //DDS = "Deslocamento para a direita com duplicacao de sinal": Shift right with sign duplication
+ }
+ break;
+ case 0x02: sprintf (buffer, "XOR /%02X", oprom[1]); return 2; //Logical XOR
+ case 0x04: sprintf (buffer, "NAND /%02X", oprom[1]); return 2; //Logical NAND
+ case 0x08: sprintf (buffer, "SOMI /%02X", oprom[1]); return 2; //SOMI = "Soma imediata": Add immediate value into accumulator
+ case 0x0A: sprintf (buffer, "CARI /%02X", oprom[1]); return 2; //CARI = "Carrega imediato": Loads an immediate value into the accumulator
+ }
+ break;
+ case 0xE0:
+ //SUS = "Subtrai um ou salta"
+ addr = (oprom[0] & 0x0F) << 8 | oprom[1];
+ sprintf (buffer, "SUS /%03X", addr);
+ return 2;
+ case 0xF0:
+ //PUG = "Pula e guarda"
+ addr = (oprom[0] & 0x0F) << 8 | oprom[1];
+ sprintf (buffer, "PUG /%03X", addr);
+ return 2;
+ }
- switch (oprom[0])
- {
- case 0x80: sprintf (buffer, "LIMPO"); return 1;
- case 0x81: sprintf (buffer, "UM"); return 1;
- case 0x82: sprintf (buffer, "CMP1"); return 1;
- case 0x83: sprintf (buffer, "CMP2"); return 1;
- case 0x84: sprintf (buffer, "LIN"); return 1;
- case 0x85: sprintf (buffer, "INC"); return 1;
- case 0x86: sprintf (buffer, "UNEG"); return 1;
- case 0x87: sprintf (buffer, "LIMP1"); return 1;
- case 0x88: sprintf (buffer, "PNL 0"); return 1;
- case 0x89: sprintf (buffer, "PNL 1"); return 1;
- case 0x8A: sprintf (buffer, "PNL 2"); return 1;
- case 0x8B: sprintf (buffer, "PNL 3"); return 1;
- case 0x8C: sprintf (buffer, "PNL 4"); return 1;
- case 0x8D: sprintf (buffer, "PNL 5"); return 1;
- case 0x8E: sprintf (buffer, "PNL 6"); return 1;
- case 0x8F: sprintf (buffer, "PNL 7"); return 1;
- case 0x90: sprintf (buffer, "ST 0"); return 1;
- case 0x91: sprintf (buffer, "STM 0"); return 1;
- case 0x92: sprintf (buffer, "ST 1"); return 1;
- case 0x93: sprintf (buffer, "STM 1"); return 1;
- case 0x94: sprintf (buffer, "SV 0"); return 1;
- case 0x95: sprintf (buffer, "SVM 0"); return 1;
- case 0x96: sprintf (buffer, "SV 1"); return 1;
- case 0x97: sprintf (buffer, "SVM 1"); return 1;
- case 0x98: sprintf (buffer, "PUL"); return 1;
- case 0x99: sprintf (buffer, "TRE"); return 1;
- case 0x9A: sprintf (buffer, "INIB"); return 1;
- case 0x9B: sprintf (buffer, "PERM"); return 1;
- case 0x9C: sprintf (buffer, "ESP"); return 1;
- case 0x9D: sprintf (buffer, "PARE"); return 1;
- case 0x9E: sprintf (buffer, "TRI"); return 1;
- case 0x9F: sprintf (buffer, "IND"); return 1;
- }
+ switch (oprom[0])
+ {
+ case 0x80: sprintf (buffer, "LIMPO"); return 1;
+ case 0x81: sprintf (buffer, "UM"); return 1;
+ case 0x82: sprintf (buffer, "CMP1"); return 1;
+ case 0x83: sprintf (buffer, "CMP2"); return 1;
+ case 0x84: sprintf (buffer, "LIN"); return 1;
+ case 0x85: sprintf (buffer, "INC"); return 1;
+ case 0x86: sprintf (buffer, "UNEG"); return 1;
+ case 0x87: sprintf (buffer, "LIMP1"); return 1;
+ case 0x88: sprintf (buffer, "PNL 0"); return 1;
+ case 0x89: sprintf (buffer, "PNL 1"); return 1;
+ case 0x8A: sprintf (buffer, "PNL 2"); return 1;
+ case 0x8B: sprintf (buffer, "PNL 3"); return 1;
+ case 0x8C: sprintf (buffer, "PNL 4"); return 1;
+ case 0x8D: sprintf (buffer, "PNL 5"); return 1;
+ case 0x8E: sprintf (buffer, "PNL 6"); return 1;
+ case 0x8F: sprintf (buffer, "PNL 7"); return 1;
+ case 0x90: sprintf (buffer, "ST 0"); return 1;
+ case 0x91: sprintf (buffer, "STM 0"); return 1;
+ case 0x92: sprintf (buffer, "ST 1"); return 1;
+ case 0x93: sprintf (buffer, "STM 1"); return 1;
+ case 0x94: sprintf (buffer, "SV 0"); return 1;
+ case 0x95: sprintf (buffer, "SVM 0"); return 1;
+ case 0x96: sprintf (buffer, "SV 1"); return 1;
+ case 0x97: sprintf (buffer, "SVM 1"); return 1;
+ case 0x98: sprintf (buffer, "PUL"); return 1;
+ case 0x99: sprintf (buffer, "TRE"); return 1;
+ case 0x9A: sprintf (buffer, "INIB"); return 1;
+ case 0x9B: sprintf (buffer, "PERM"); return 1;
+ case 0x9C: sprintf (buffer, "ESP"); return 1;
+ case 0x9D: sprintf (buffer, "PARE"); return 1;
+ case 0x9E: sprintf (buffer, "TRI"); return 1;
+ case 0x9F: sprintf (buffer, "IND"); return 1;
+ }
- sprintf (buffer, "illegal instruction");
- return 1;
+ sprintf (buffer, "illegal instruction");
+ return 1;
}
diff --git a/src/devices/cpu/pdp1/pdp1.cpp b/src/devices/cpu/pdp1/pdp1.cpp
index b36e7242967..cbb43535d7f 100644
--- a/src/devices/cpu/pdp1/pdp1.cpp
+++ b/src/devices/cpu/pdp1/pdp1.cpp
@@ -737,7 +737,7 @@ void pdp1_device::state_export(const device_state_entry &entry)
}
-void pdp1_device::state_string_export(const device_state_entry &entry, std::string &str)
+void pdp1_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/pdp1/pdp1.h b/src/devices/cpu/pdp1/pdp1.h
index 9f421716366..2cb01f5c20b 100644
--- a/src/devices/cpu/pdp1/pdp1.h
+++ b/src/devices/cpu/pdp1/pdp1.h
@@ -107,7 +107,7 @@ protected:
// device_state_interface overrides
virtual void state_import(const device_state_entry &entry) override;
virtual void state_export(const device_state_entry &entry) override;
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 4; }
diff --git a/src/devices/cpu/pdp8/pdp8.cpp b/src/devices/cpu/pdp8/pdp8.cpp
index 1ed24effe12..2679c7e9205 100644
--- a/src/devices/cpu/pdp8/pdp8.cpp
+++ b/src/devices/cpu/pdp8/pdp8.cpp
@@ -72,7 +72,6 @@ void pdp8_device::device_start()
m_program = &space(AS_PROGRAM);
// register our state for the debugger
- std::string tempstr;
state_add(STATE_GENPC, "GENPC", m_pc).noshow();
state_add(STATE_GENFLAGS, "GENFLAGS", m_l).callimport().callexport().formatstr("%1s").noshow();
state_add(PDP8_PC, "PC", m_pc).mask(0xfff);
@@ -136,7 +135,7 @@ const address_space_config *pdp8_device::memory_space_config(address_spacenum sp
// for the debugger
//-------------------------------------------------
-void pdp8_device::state_string_export(const device_state_entry &entry, std::string &str)
+void pdp8_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/pdp8/pdp8.h b/src/devices/cpu/pdp8/pdp8.h
index 70393e3f0bf..66f04682d7e 100644
--- a/src/devices/cpu/pdp8/pdp8.h
+++ b/src/devices/cpu/pdp8/pdp8.h
@@ -45,7 +45,7 @@ public:
virtual offs_t disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options) override;
// device_state_interface overrides
- virtual void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// address spaces
const address_space_config m_program_config;
diff --git a/src/devices/cpu/pic16c5x/pic16c5x.cpp b/src/devices/cpu/pic16c5x/pic16c5x.cpp
index 3acd46944f7..c568b27b4c7 100644
--- a/src/devices/cpu/pic16c5x/pic16c5x.cpp
+++ b/src/devices/cpu/pic16c5x/pic16c5x.cpp
@@ -923,7 +923,7 @@ void pic16c5x_device::state_export(const device_state_entry &entry)
}
}
-void pic16c5x_device::state_string_export(const device_state_entry &entry, std::string &str)
+void pic16c5x_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/pic16c5x/pic16c5x.h b/src/devices/cpu/pic16c5x/pic16c5x.h
index 0e34f97178f..c3d2480fd86 100644
--- a/src/devices/cpu/pic16c5x/pic16c5x.h
+++ b/src/devices/cpu/pic16c5x/pic16c5x.h
@@ -117,7 +117,7 @@ protected:
// device_state_interface overrides
virtual void state_import(const device_state_entry &entry) override;
virtual void state_export(const device_state_entry &entry) override;
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 2; }
diff --git a/src/devices/cpu/pic16c62x/pic16c62x.cpp b/src/devices/cpu/pic16c62x/pic16c62x.cpp
index 2bbbd9f3439..9fb6e2324ab 100644
--- a/src/devices/cpu/pic16c62x/pic16c62x.cpp
+++ b/src/devices/cpu/pic16c62x/pic16c62x.cpp
@@ -990,7 +990,7 @@ void pic16c62x_device::state_export(const device_state_entry &entry)
}
}
-void pic16c62x_device::state_string_export(const device_state_entry &entry, std::string &str)
+void pic16c62x_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/pic16c62x/pic16c62x.h b/src/devices/cpu/pic16c62x/pic16c62x.h
index c373bd64ec2..7e8af51ca40 100644
--- a/src/devices/cpu/pic16c62x/pic16c62x.h
+++ b/src/devices/cpu/pic16c62x/pic16c62x.h
@@ -56,15 +56,6 @@ class pic16c62x_device : public cpu_device
public:
// construction/destruction
pic16c62x_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, int program_width, int picmodel);
-
- /****************************************************************************
- * Function to configure the CONFIG register. This is actually hard-wired
- * during ROM programming, so should be called in the driver INIT, with
- * the value if known (available in HEX dumps of the ROM).
- */
-
- void pic16c62x_set_config(device_t *cpu, int data);
-
protected:
// device-level overrides
virtual void device_start() override;
@@ -88,7 +79,7 @@ protected:
// device_state_interface overrides
virtual void state_import(const device_state_entry &entry) override;
virtual void state_export(const device_state_entry &entry) override;
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 2; }
diff --git a/src/devices/cpu/powerpc/ppc.h b/src/devices/cpu/powerpc/ppc.h
index 3a0e9b9b2f3..5e40ee88249 100644
--- a/src/devices/cpu/powerpc/ppc.h
+++ b/src/devices/cpu/powerpc/ppc.h
@@ -264,7 +264,7 @@ protected:
// device_state_interface overrides
virtual void state_export(const device_state_entry &entry) override;
virtual void state_import(const device_state_entry &entry) override;
- virtual void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 4; }
@@ -537,8 +537,8 @@ protected:
/* core state */
drc_cache m_cache; /* pointer to the DRC code cache */
- drcuml_state * m_drcuml; /* DRC UML generator state */
- ppc_frontend * m_drcfe; /* pointer to the DRC front-end state */
+ std::unique_ptr<drcuml_state> m_drcuml; /* DRC UML generator state */
+ std::unique_ptr<ppc_frontend> m_drcfe; /* pointer to the DRC front-end state */
UINT32 m_drcoptions; /* configurable DRC options */
/* parameters for subroutines */
@@ -620,9 +620,6 @@ protected:
uml::code_label labelnum; /* index for local labels */
};
- int IS_PPC602(void);
- int IS_PPC603(void);
- int IS_PPC403(void);
UINT32 get_cr();
void set_cr(UINT32 value);
UINT32 get_xer();
diff --git a/src/devices/cpu/powerpc/ppccom.cpp b/src/devices/cpu/powerpc/ppccom.cpp
index 6c8d4397206..9036ff2c794 100644
--- a/src/devices/cpu/powerpc/ppccom.cpp
+++ b/src/devices/cpu/powerpc/ppccom.cpp
@@ -882,7 +882,7 @@ void ppc_device::device_start()
UINT32 flags = 0;
/* initialize the UML generator */
- m_drcuml = auto_alloc(machine(), drcuml_state(*this, m_cache, flags, 8, 32, 2));
+ m_drcuml = std::make_unique<drcuml_state>(*this, m_cache, flags, 8, 32, 2);
/* add symbols for our stuff */
m_drcuml->symbol_add(&m_core->pc, sizeof(m_core->pc), "pc");
@@ -928,7 +928,7 @@ void ppc_device::device_start()
m_drcuml->symbol_add(&m_fcmp_cr_table, sizeof(m_fcmp_cr_table), "fcmp_cr_table");
/* initialize the front-end helper */
- m_drcfe = auto_alloc(machine(), ppc_frontend(this, COMPILE_BACKWARDS_BYTES, COMPILE_FORWARDS_BYTES, SINGLE_INSTRUCTION_MODE ? 1 : COMPILE_MAX_SEQUENCE));
+ m_drcfe = std::make_unique<ppc_frontend>(this, COMPILE_BACKWARDS_BYTES, COMPILE_FORWARDS_BYTES, SINGLE_INSTRUCTION_MODE ? 1 : COMPILE_MAX_SEQUENCE);
/* compute the register parameters */
for (int regnum = 0; regnum < 32; regnum++)
@@ -1007,7 +1007,7 @@ void ppc_device::state_import(const device_state_entry &entry)
}
-void ppc_device::state_string_export(const device_state_entry &entry, std::string &str)
+void ppc_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
@@ -1151,10 +1151,6 @@ void ppc_device::device_stop()
if (m_vtlb != nullptr)
vtlb_free(m_vtlb);
m_vtlb = nullptr;
-
- /* clean up the DRC */
- auto_free(machine(), m_drcfe);
- auto_free(machine(), m_drcuml);
}
@@ -1520,7 +1516,7 @@ void ppc_device::ppccom_execute_tlbl()
{
UINT32 address = m_core->param0;
int isitlb = m_core->param1;
- vtlb_entry flags = 0;
+ vtlb_entry flags;
int entrynum;
/* determine entry number; we use rand() for associativity */
diff --git a/src/devices/cpu/powerpc/ppcdrc.cpp b/src/devices/cpu/powerpc/ppcdrc.cpp
index 57b6290a191..ed502d344de 100644
--- a/src/devices/cpu/powerpc/ppcdrc.cpp
+++ b/src/devices/cpu/powerpc/ppcdrc.cpp
@@ -369,7 +369,7 @@ void ppc_device::code_compile_block(UINT8 mode, offs_t pc)
/* get a description of this sequence */
desclist = m_drcfe->describe_code(pc);
if (m_drcuml->logging() || m_drcuml->logging_native())
- log_opcode_desc(m_drcuml, desclist, 0);
+ log_opcode_desc(m_drcuml.get(), desclist, 0);
bool succeeded = false;
while (!succeeded)
@@ -641,10 +641,10 @@ void ppc_device::static_generate_entry_point()
block = m_drcuml->begin_block(20);
/* forward references */
- alloc_handle(m_drcuml, &m_nocode, "nocode");
- alloc_handle(m_drcuml, &m_exception_norecover[EXCEPTION_EI], "exception_ei_norecover");
+ alloc_handle(m_drcuml.get(), &m_nocode, "nocode");
+ alloc_handle(m_drcuml.get(), &m_exception_norecover[EXCEPTION_EI], "exception_ei_norecover");
- alloc_handle(m_drcuml, &m_entry, "entry");
+ alloc_handle(m_drcuml.get(), &m_entry, "entry");
UML_HANDLE(block, *m_entry); // handle entry
/* reset the FPU mode */
@@ -685,7 +685,7 @@ void ppc_device::static_generate_nocode_handler()
block = m_drcuml->begin_block(10);
/* generate a hash jump via the current mode and PC */
- alloc_handle(m_drcuml, &m_nocode, "nocode");
+ alloc_handle(m_drcuml.get(), &m_nocode, "nocode");
UML_HANDLE(block, *m_nocode); // handle nocode
UML_GETEXP(block, I0); // getexp i0
UML_MOV(block, mem(&m_core->pc), I0); // mov [pc],i0
@@ -709,7 +709,7 @@ void ppc_device::static_generate_out_of_cycles()
block = m_drcuml->begin_block(10);
/* generate a hash jump via the current mode and PC */
- alloc_handle(m_drcuml, &m_out_of_cycles, "out_of_cycles");
+ alloc_handle(m_drcuml.get(), &m_out_of_cycles, "out_of_cycles");
UML_HANDLE(block, *m_out_of_cycles); // handle out_of_cycles
UML_GETEXP(block, I0); // getexp i0
UML_MOV(block, mem(&m_core->pc), I0); // mov <pc>,i0
@@ -731,15 +731,15 @@ void ppc_device::static_generate_tlb_mismatch()
int isi, exit, label = 1;
/* forward references */
- alloc_handle(m_drcuml, &m_exception[EXCEPTION_ISI], "exception_isi");
+ alloc_handle(m_drcuml.get(), &m_exception[EXCEPTION_ISI], "exception_isi");
if (m_cap & PPCCAP_603_MMU)
- alloc_handle(m_drcuml, &m_exception[EXCEPTION_ITLBMISS], "exception_itlb_miss");
+ alloc_handle(m_drcuml.get(), &m_exception[EXCEPTION_ITLBMISS], "exception_itlb_miss");
/* begin generating */
block = m_drcuml->begin_block(20);
/* generate a hash jump via the current mode and PC */
- alloc_handle(m_drcuml, &m_tlb_mismatch, "tlb_mismatch");
+ alloc_handle(m_drcuml.get(), &m_tlb_mismatch, "tlb_mismatch");
UML_HANDLE(block, *m_tlb_mismatch); // handle tlb_mismatch
UML_RECOVER(block, I0, MAPVAR_PC); // recover i0,PC
UML_SHR(block, I1, I0, 12); // shr i1,i0,12
@@ -792,7 +792,7 @@ void ppc_device::static_generate_exception(UINT8 exception, int recover, const c
block = m_drcuml->begin_block(1024);
/* add a global entry for this */
- alloc_handle(m_drcuml, &exception_handle, name);
+ alloc_handle(m_drcuml.get(), &exception_handle, name);
UML_HANDLE(block, *exception_handle); // handle name
/* exception parameter is expected to be the fault address in this case */
@@ -981,7 +981,7 @@ void ppc_device::static_generate_memory_accessor(int mode, int size, int iswrite
block = m_drcuml->begin_block(1024);
/* add a global entry for this */
- alloc_handle(m_drcuml, &handleptr, name);
+ alloc_handle(m_drcuml.get(), &handleptr, name);
UML_HANDLE(block, *handleptr); // handle *handleptr
/* check for unaligned accesses and break into two */
@@ -1388,7 +1388,7 @@ void ppc_device::static_generate_swap_tgpr()
block = m_drcuml->begin_block(30);
/* generate a hash jump via the current mode and PC */
- alloc_handle(m_drcuml, &m_swap_tgpr, "swap_tgpr");
+ alloc_handle(m_drcuml.get(), &m_swap_tgpr, "swap_tgpr");
UML_HANDLE(block, *m_swap_tgpr); // handle swap_tgpr
for (regnum = 0; regnum < 4; regnum++)
{
@@ -1423,7 +1423,7 @@ void ppc_device::static_generate_lsw_entries(int mode)
/* allocate a handle */
sprintf(temp, "lsw%d", regnum);
- alloc_handle(m_drcuml, &m_lsw[mode][regnum], temp);
+ alloc_handle(m_drcuml.get(), &m_lsw[mode][regnum], temp);
UML_HANDLE(block, *m_lsw[mode][regnum]); // handle lsw<regnum>
UML_LABEL(block, regnum); // regnum:
UML_ADD(block, I0, mem(&m_core->updateaddr), 0); // add i0,[updateaddr],0
@@ -1477,7 +1477,7 @@ void ppc_device::static_generate_stsw_entries(int mode)
/* allocate a handle */
sprintf(temp, "stsw%d", regnum);
- alloc_handle(m_drcuml, &m_stsw[mode][regnum], temp);
+ alloc_handle(m_drcuml.get(), &m_stsw[mode][regnum], temp);
UML_HANDLE(block, *m_stsw[mode][regnum]); // handle stsw<regnum>
UML_LABEL(block, regnum); // regnum:
UML_ADD(block, I0, mem(&m_core->updateaddr), 0); // add i0,[updateaddr],0
diff --git a/src/devices/cpu/pps4/pps4.cpp b/src/devices/cpu/pps4/pps4.cpp
index 5be986f2c3d..43c79059d4b 100644
--- a/src/devices/cpu/pps4/pps4.cpp
+++ b/src/devices/cpu/pps4/pps4.cpp
@@ -1552,7 +1552,7 @@ void pps4_device::device_start()
m_icountptr = &m_icount;
}
-void pps4_device::state_string_export(const device_state_entry &entry, std::string &str)
+void pps4_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/pps4/pps4.h b/src/devices/cpu/pps4/pps4.h
index 7993a34743e..a2797668751 100644
--- a/src/devices/cpu/pps4/pps4.h
+++ b/src/devices/cpu/pps4/pps4.h
@@ -62,7 +62,7 @@ protected:
}
// device_state_interface overrides
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 1; }
@@ -95,9 +95,6 @@ private:
UINT8 m_I2; //!< Most recent parameter I2(8:1)
UINT8 m_Ip; //!< Previous instruction I(8:1)
- //! return the contents of B register (made of BU, BM and BL)
- inline UINT16 B() const;
-
//! return memory at address B(12:1)
inline UINT8 M();
diff --git a/src/devices/cpu/psx/dma.h b/src/devices/cpu/psx/dma.h
index 809bcaf035a..e241dfac9ac 100644
--- a/src/devices/cpu/psx/dma.h
+++ b/src/devices/cpu/psx/dma.h
@@ -63,8 +63,6 @@ private:
void dma_timer_adjust( int n_channel );
void dma_interrupt_update();
void dma_finished( int n_channel );
- void write( offs_t offset, UINT32 data, UINT32 mem_mask );
- UINT32 read( offs_t offset, UINT32 mem_mask );
psx_dma_channel m_channel[7];
UINT32 m_dpcp;
diff --git a/src/devices/cpu/psx/gte.h b/src/devices/cpu/psx/gte.h
index 3fc7075a81d..3a1ef18ba2d 100644
--- a/src/devices/cpu/psx/gte.h
+++ b/src/devices/cpu/psx/gte.h
@@ -24,6 +24,10 @@
class gte
{
public:
+ gte() : m_sf(0), m_mac0(0), m_mac1(0), m_mac2(0), m_mac3(0)
+ {
+ }
+
PAIR m_cp2cr[ 32 ];
PAIR m_cp2dr[ 32 ];
diff --git a/src/devices/cpu/psx/psx.cpp b/src/devices/cpu/psx/psx.cpp
index f98c6fccc8f..c3e2e340d24 100644
--- a/src/devices/cpu/psx/psx.cpp
+++ b/src/devices/cpu/psx/psx.cpp
@@ -2026,7 +2026,7 @@ void psxcpu_device::state_import( const device_state_entry &entry )
// for the debugger
//-------------------------------------------------
-void psxcpu_device::state_string_export( const device_state_entry &entry, std::string &str )
+void psxcpu_device::state_string_export( const device_state_entry &entry, std::string &str ) const
{
switch( entry.index() )
{
diff --git a/src/devices/cpu/psx/psx.h b/src/devices/cpu/psx/psx.h
index f5ec1423293..98b15819f32 100644
--- a/src/devices/cpu/psx/psx.h
+++ b/src/devices/cpu/psx/psx.h
@@ -153,7 +153,6 @@ class psxcpu_device : public cpu_device,
{
public:
// construction/destruction
- psxcpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
virtual ~psxcpu_device() {};
// static configuration helpers
@@ -223,7 +222,7 @@ protected:
// device_state_interface overrides
virtual void state_import(const device_state_entry &entry) override;
- virtual void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 4; }
@@ -240,11 +239,6 @@ protected:
// internal stuff
UINT32 m_op;
- // memory access
- inline UINT32 program_read(UINT32 addr);
- inline void program_write(UINT32 addr, UINT32 data);
- inline UINT32 opcode_read();
-
// address spaces
const address_space_config m_program_config;
address_space *m_program;
diff --git a/src/devices/cpu/psx/sio.h b/src/devices/cpu/psx/sio.h
index 4610f249700..93d8428bc9e 100644
--- a/src/devices/cpu/psx/sio.h
+++ b/src/devices/cpu/psx/sio.h
@@ -66,7 +66,6 @@ public:
DECLARE_WRITE_LINE_MEMBER(write_rxd);
DECLARE_WRITE_LINE_MEMBER(write_dsr);
- DECLARE_WRITE_LINE_MEMBER(write_cts);
protected:
// device-level overrides
diff --git a/src/devices/cpu/rsp/rsp.cpp b/src/devices/cpu/rsp/rsp.cpp
index c8cbbfe24d1..1939cb33b5f 100644
--- a/src/devices/cpu/rsp/rsp.cpp
+++ b/src/devices/cpu/rsp/rsp.cpp
@@ -373,11 +373,11 @@ void rsp_device::device_start()
if (m_isdrc)
{
- m_cop2 = auto_alloc(machine(), rsp_cop2_drc(*this, machine()));
+ m_cop2 = std::make_unique<rsp_cop2_drc>(*this, machine());
}
else
{
- m_cop2 = auto_alloc(machine(), rsp_cop2(*this, machine()));
+ m_cop2 = std::make_unique<rsp_cop2>(*this, machine());
}
m_cop2->init();
m_cop2->start();
@@ -393,7 +393,7 @@ void rsp_device::device_start()
/* initialize the UML generator */
UINT32 drc_flags = 0;
- m_drcuml = auto_alloc(machine(), drcuml_state(*this, m_cache, drc_flags, 8, 32, 2));
+ m_drcuml = std::make_unique<drcuml_state>(*this, m_cache, drc_flags, 8, 32, 2);
/* add symbols for our stuff */
m_drcuml->symbol_add(&m_rsp_state->pc, sizeof(m_rsp_state->pc), "pc");
@@ -411,7 +411,7 @@ void rsp_device::device_start()
m_drcuml->symbol_add(&m_numcycles, sizeof(m_numcycles), "numcycles");
/* initialize the front-end helper */
- m_drcfe = auto_alloc(machine(), rsp_frontend(*this, COMPILE_BACKWARDS_BYTES, COMPILE_FORWARDS_BYTES, SINGLE_INSTRUCTION_MODE ? 1 : COMPILE_MAX_SEQUENCE));
+ m_drcfe = std::make_unique<rsp_frontend>(*this, COMPILE_BACKWARDS_BYTES, COMPILE_FORWARDS_BYTES, SINGLE_INSTRUCTION_MODE ? 1 : COMPILE_MAX_SEQUENCE);
/* compute the register parameters */
for (int regnum = 0; regnum < 32; regnum++)
@@ -539,7 +539,7 @@ void rsp_device::state_export(const device_state_entry &entry)
}
}
-void rsp_device::state_string_export(const device_state_entry &entry, std::string &str)
+void rsp_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
const int index = entry.index();
if (index >= RSP_V0 && index <= RSP_V31)
@@ -596,21 +596,6 @@ void rsp_device::device_stop()
if (m_exec_output)
fclose(m_exec_output);
m_exec_output = nullptr;
-
- /* clean up the DRC */
- if (m_drcuml)
- {
- auto_free(machine(), m_drcuml);
- }
- if (m_drcfe)
- {
- auto_free(machine(), m_drcfe);
- }
-
- if (m_cop2)
- {
- auto_free(machine(), m_cop2);
- }
}
void rsp_device::device_reset()
diff --git a/src/devices/cpu/rsp/rsp.h b/src/devices/cpu/rsp/rsp.h
index 1f92aac50d9..93215bd0649 100644
--- a/src/devices/cpu/rsp/rsp.h
+++ b/src/devices/cpu/rsp/rsp.h
@@ -159,7 +159,6 @@ public:
void ccfunc_write32();
void ccfunc_get_cop0_reg();
void ccfunc_set_cop0_reg();
- void ccfunc_unimplemented_opcode();
void ccfunc_sp_set_status_cb();
void ccfunc_unimplemented();
@@ -185,7 +184,7 @@ protected:
// device_state_interface overrides
virtual void state_import(const device_state_entry &entry) override;
virtual void state_export(const device_state_entry &entry) override;
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 4; }
@@ -217,8 +216,8 @@ private:
/* core state */
drc_cache m_cache; /* pointer to the DRC code cache */
- drcuml_state * m_drcuml; /* DRC UML generator state */
- rsp_frontend * m_drcfe; /* pointer to the DRC front-end state */
+ std::unique_ptr<drcuml_state> m_drcuml; /* DRC UML generator state */
+ std::unique_ptr<rsp_frontend> m_drcfe; /* pointer to the DRC front-end state */
UINT32 m_drcoptions; /* configurable DRC options */
/* internal stuff */
@@ -269,7 +268,7 @@ protected:
direct_read_data *m_direct;
private:
- rsp_cop2 *m_cop2;
+ std::unique_ptr<rsp_cop2> m_cop2;
UINT32 *m_dmem32;
UINT16 *m_dmem16;
@@ -317,11 +316,9 @@ private:
void generate_sequence_instruction(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc);
void generate_delay_slot_and_branch(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc, UINT8 linkreg);
void generate_branch(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc);
- int generate_vector_opcode(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc);
int generate_opcode(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc);
int generate_special(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc);
int generate_regimm(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc);
- int generate_cop2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc);
int generate_cop0(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc);
void log_add_disasm_comment(drcuml_block *block, UINT32 pc, UINT32 op);
};
diff --git a/src/devices/cpu/rsp/rspcp2.cpp b/src/devices/cpu/rsp/rspcp2.cpp
index fe6d3b243e8..cb45d906bde 100644
--- a/src/devices/cpu/rsp/rspcp2.cpp
+++ b/src/devices/cpu/rsp/rspcp2.cpp
@@ -746,7 +746,7 @@ void rsp_cop2::start()
}
}
-void rsp_cop2::state_string_export(const int index, std::string &str)
+void rsp_cop2::state_string_export(const int index, std::string &str) const
{
switch (index)
{
@@ -1167,7 +1167,7 @@ void rsp_cop2::handle_lwc2(UINT32 op)
if (ve > 32)
ve = 32;
- INT32 element = 7 - (index >> 1);
+ INT32 element;
if (index & 1) fatalerror("RSP: LTV: index = %d\n", index);
@@ -2966,7 +2966,7 @@ void rsp_cop2::handle_vector_ops(UINT32 op)
CLEAR_CLIP1_FLAGS();
CLEAR_ZERO_FLAGS();
CLEAR_CLIP2_FLAGS();
- UINT32 vce = 0;
+ UINT32 vce;
for (i=0; i < 8; i++)
{
diff --git a/src/devices/cpu/rsp/rspcp2.h b/src/devices/cpu/rsp/rspcp2.h
index 909b0ae4172..9eb0bb37fdc 100644
--- a/src/devices/cpu/rsp/rspcp2.h
+++ b/src/devices/cpu/rsp/rspcp2.h
@@ -78,9 +78,10 @@ class rsp_cop2
{
friend class rsp_device;
-protected:
+public:
rsp_cop2(rsp_device &rsp, running_machine &machine);
+protected:
virtual void init();
virtual void start();
@@ -88,7 +89,7 @@ protected:
virtual int generate_lwc2(drcuml_block *block, rsp_device::compiler_state *compiler, const opcode_desc *desc) { return TRUE; }
virtual int generate_swc2(drcuml_block *block, rsp_device::compiler_state *compiler, const opcode_desc *desc) { return TRUE; }
- virtual void state_string_export(const int index, std::string &str);
+ virtual void state_string_export(const int index, std::string &str) const;
public:
virtual ~rsp_cop2();
@@ -174,7 +175,6 @@ protected:
virtual int generate_vector_opcode(drcuml_block *block, rsp_device::compiler_state *compiler, const opcode_desc *desc) { return TRUE; }
UINT16 SATURATE_ACCUM(int accum, int slice, UINT16 negative, UINT16 positive);
- UINT16 SATURATE_ACCUM1(int accum, UINT16 negative, UINT16 positive);
// Data that needs to be stored close to the generated DRC code
struct internal_rspcop2_state
diff --git a/src/devices/cpu/rsp/rspcp2d.cpp b/src/devices/cpu/rsp/rspcp2d.cpp
index da23d00df0d..4caacd28a0d 100644
--- a/src/devices/cpu/rsp/rspcp2d.cpp
+++ b/src/devices/cpu/rsp/rspcp2d.cpp
@@ -147,7 +147,7 @@ static void unimplemented_opcode(void *param)
((rsp_cop2 *)param)->cfunc_unimplemented_opcode();
}
-void rsp_cop2_drc::state_string_export(const int index, std::string &str)
+void rsp_cop2_drc::state_string_export(const int index, std::string &str) const
{
switch (index)
{
@@ -268,7 +268,7 @@ void rsp_cop2_drc::lbv()
{
UINT32 op = m_rspcop2_state->op;
- UINT32 ea = 0;
+ UINT32 ea;
int dest = (op >> 16) & 0x1f;
int base = (op >> 21) & 0x1f;
int index = (op >> 7) & 0xf;
@@ -336,7 +336,7 @@ static void cfunc_lsv(void *param)
void rsp_cop2_drc::llv()
{
UINT32 op = m_rspcop2_state->op;
- UINT32 ea = 0;
+ UINT32 ea;
int dest = (op >> 16) & 0x1f;
int base = (op >> 21) & 0x1f;
int index = (op >> 7) & 0xc;
@@ -375,7 +375,7 @@ static void cfunc_llv(void *param)
void rsp_cop2_drc::ldv()
{
UINT32 op = m_rspcop2_state->op;
- UINT32 ea = 0;
+ UINT32 ea;
int dest = (op >> 16) & 0x1f;
int base = (op >> 21) & 0x1f;
int index = (op >> 7) & 0x8;
@@ -687,7 +687,7 @@ void rsp_cop2_drc::ltv()
ve = 32;
}
- int element = 7 - (index >> 1);
+ int element;
UINT32 ea = (base) ? m_rsp.m_rsp_state->r[base] + (offset * 16) : (offset * 16);
@@ -2438,7 +2438,7 @@ void rsp_cop2_drc::vch()
CLEAR_ZERO_FLAGS();
CLEAR_CLIP2_FLAGS();
- UINT32 vce = 0;
+ UINT32 vce;
for (int i = 0; i < 8; i++)
{
INT16 s1, s2;
diff --git a/src/devices/cpu/rsp/rspcp2d.h b/src/devices/cpu/rsp/rspcp2d.h
index ef727e37b95..62fc25fe475 100644
--- a/src/devices/cpu/rsp/rspcp2d.h
+++ b/src/devices/cpu/rsp/rspcp2d.h
@@ -21,14 +21,14 @@
class rsp_cop2_drc : public rsp_cop2
{
friend class rsp_device;
-
+public:
rsp_cop2_drc(rsp_device &rsp, running_machine &machine) : rsp_cop2(rsp, machine) { }
-
+private:
virtual int generate_cop2(drcuml_block *block, rsp_device::compiler_state *compiler, const opcode_desc *desc) override;
virtual int generate_lwc2(drcuml_block *block, rsp_device::compiler_state *compiler, const opcode_desc *desc) override;
virtual int generate_swc2(drcuml_block *block, rsp_device::compiler_state *compiler, const opcode_desc *desc) override;
- virtual void state_string_export(const int index, std::string &str) override;
+ virtual void state_string_export(const int index, std::string &str) const override;
void cfunc_unimplemented_opcode() override;
diff --git a/src/devices/cpu/rsp/rspdrc.cpp b/src/devices/cpu/rsp/rspdrc.cpp
index 097a8c39507..c581cfb3aba 100644
--- a/src/devices/cpu/rsp/rspdrc.cpp
+++ b/src/devices/cpu/rsp/rspdrc.cpp
@@ -260,7 +260,7 @@ void cfunc_sp_set_status_cb(void *param)
void rsp_device::execute_run_drc()
{
- drcuml_state *drcuml = m_drcuml;
+ drcuml_state *drcuml = m_drcuml.get();
int execute_result;
/* reset the cache if dirty */
@@ -350,7 +350,7 @@ void rsp_device::code_flush_cache()
void rsp_device::code_compile_block(offs_t pc)
{
- drcuml_state *drcuml = m_drcuml;
+ drcuml_state *drcuml = m_drcuml.get();
compiler_state compiler = { 0 };
const opcode_desc *seqhead, *seqlast;
const opcode_desc *desclist;
@@ -490,7 +490,7 @@ static void cfunc_fatalerror(void *param)
void rsp_device::static_generate_entry_point()
{
- drcuml_state *drcuml = m_drcuml;
+ drcuml_state *drcuml = m_drcuml.get();
drcuml_block *block;
/* begin generating */
@@ -518,7 +518,7 @@ void rsp_device::static_generate_entry_point()
void rsp_device::static_generate_nocode_handler()
{
- drcuml_state *drcuml = m_drcuml;
+ drcuml_state *drcuml = m_drcuml.get();
drcuml_block *block;
/* begin generating */
@@ -543,7 +543,7 @@ void rsp_device::static_generate_nocode_handler()
void rsp_device::static_generate_out_of_cycles()
{
- drcuml_state *drcuml = m_drcuml;
+ drcuml_state *drcuml = m_drcuml.get();
drcuml_block *block;
/* begin generating */
@@ -569,7 +569,7 @@ void rsp_device::static_generate_memory_accessor(int size, int iswrite, const ch
/* on entry, address is in I0; data for writes is in I1 */
/* on exit, read result is in I0 */
/* routine trashes I0-I1 */
- drcuml_state *drcuml = m_drcuml;
+ drcuml_state *drcuml = m_drcuml.get();
drcuml_block *block;
/* begin generating */
diff --git a/src/devices/cpu/s2650/s2650.cpp b/src/devices/cpu/s2650/s2650.cpp
index 1bb0fe01e77..8a257ff5a9e 100644
--- a/src/devices/cpu/s2650/s2650.cpp
+++ b/src/devices/cpu/s2650/s2650.cpp
@@ -35,9 +35,10 @@ s2650_device::s2650_device(const machine_config &mconfig, const char *tag, devic
: cpu_device(mconfig, S2650, "S2650", tag, owner, clock, "s2650", __FILE__ )
, m_program_config("program", ENDIANNESS_LITTLE, 8, 15)
, m_io_config("io", ENDIANNESS_LITTLE, 8, 9)
- , m_flag_handler(*this), m_ppc(0), m_page(0), m_iar(0), m_ea(0), m_psl(0), m_psu(0), m_r(0)
- , m_halt(0), m_ir(0), m_irq_state(0), m_icount(0), m_program(nullptr), m_direct(nullptr), m_io(nullptr)
- , m_debugger_temp(0)
+ , m_flag_handler(*this), m_intack_handler(*this)
+ , m_ppc(0), m_page(0), m_iar(0), m_ea(0), m_psl(0), m_psu(0), m_r(0)
+ , m_halt(0), m_ir(0), m_irq_state(0), m_icount(0), m_program(nullptr), m_direct(nullptr), m_io(nullptr)
+ , m_debugger_temp(0)
{
memset(m_reg, 0x00, sizeof(m_reg));
}
@@ -183,6 +184,10 @@ inline int s2650_device::check_irq_line()
m_iar = (m_iar + 1) & PMSK;
}
vector = standard_irq_callback(0) & 0xff;
+
+ /* Say hi */
+ m_intack_handler(true);
+
/* build effective address within first 8K page */
m_ea = S2650_relative[vector] & PMSK;
if (vector & 0x80) /* indirect bit set ? */
@@ -786,6 +791,7 @@ static void BRA_EA(void) _BRA_EA()
void s2650_device::device_start()
{
m_flag_handler.resolve_safe();
+ m_intack_handler.resolve_safe();
m_program = &space(AS_PROGRAM);
m_direct = &m_program->direct();
@@ -870,7 +876,7 @@ void s2650_device::state_export(const device_state_entry &entry)
}
}
-void s2650_device::state_string_export(const device_state_entry &entry, std::string &str)
+void s2650_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/s2650/s2650.h b/src/devices/cpu/s2650/s2650.h
index 66e2af40cd5..cd5dc1c12f1 100644
--- a/src/devices/cpu/s2650/s2650.h
+++ b/src/devices/cpu/s2650/s2650.h
@@ -29,6 +29,9 @@ extern const device_type S2650;
#define MCFG_S2650_FLAG_HANDLER(_devcb) \
devcb = &s2650_device::set_flag_handler(*device, DEVCB_##_devcb);
+#define MCFG_S2650_INTACK_HANDLER(_devcb) \
+ devcb = &s2650_device::set_intack_handler(*device, DEVCB_##_devcb);
+
class s2650_device : public cpu_device
{
public:
@@ -39,6 +42,7 @@ public:
// static configuration helpers
template<class _Object> static devcb_base &set_flag_handler(device_t &device, _Object object) { return downcast<s2650_device &>(device).m_flag_handler.set_callback(object); }
+ template<class _Object> static devcb_base &set_intack_handler(device_t &device, _Object object) { return downcast<s2650_device &>(device).m_intack_handler.set_callback(object); }
protected:
// device-level overrides
@@ -62,7 +66,7 @@ protected:
// device_state_interface overrides
virtual void state_import(const device_state_entry &entry) override;
virtual void state_export(const device_state_entry &entry) override;
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 1; }
@@ -74,6 +78,7 @@ private:
address_space_config m_io_config;
devcb_write_line m_flag_handler;
+ devcb_write_line m_intack_handler;
UINT16 m_ppc; /* previous program counter (page + iar) */
UINT16 m_page; /* 8K page select register (A14..A13) */
diff --git a/src/devices/cpu/saturn/saturn.cpp b/src/devices/cpu/saturn/saturn.cpp
index a8c86f934c0..3e25ae6b76f 100644
--- a/src/devices/cpu/saturn/saturn.cpp
+++ b/src/devices/cpu/saturn/saturn.cpp
@@ -169,7 +169,7 @@ void saturn_device::device_start()
m_icountptr = &m_icount;
}
-void saturn_device::state_string_export(const device_state_entry &entry, std::string &str)
+void saturn_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
#define Reg64Data(s) s[15],s[14],s[13],s[12],s[11],s[10],s[9],s[8],s[7],s[6],s[5],s[4],s[3],s[2],s[1],s[0]
#define Reg64Format "%x %x%x%x%x%x%x%x %x%x%x %x%x%x%x%x"
diff --git a/src/devices/cpu/saturn/saturn.h b/src/devices/cpu/saturn/saturn.h
index 3281ade5fcd..28de3e41910 100644
--- a/src/devices/cpu/saturn/saturn.h
+++ b/src/devices/cpu/saturn/saturn.h
@@ -104,7 +104,7 @@ protected:
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override { return (spacenum == AS_PROGRAM) ? &m_program_config : nullptr; }
// device_state_interface overrides
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
virtual void state_import(const device_state_entry &entry) override;
virtual void state_export(const device_state_entry &entry) override;
diff --git a/src/devices/cpu/sc61860/sc61860.cpp b/src/devices/cpu/sc61860/sc61860.cpp
index a36c02a658a..27251e10e78 100644
--- a/src/devices/cpu/sc61860/sc61860.cpp
+++ b/src/devices/cpu/sc61860/sc61860.cpp
@@ -171,7 +171,7 @@ void sc61860_device::device_start()
}
-void sc61860_device::state_string_export(const device_state_entry &entry, std::string &str)
+void sc61860_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/sc61860/sc61860.h b/src/devices/cpu/sc61860/sc61860.h
index 65a42862bb8..855d0d91e21 100644
--- a/src/devices/cpu/sc61860/sc61860.h
+++ b/src/devices/cpu/sc61860/sc61860.h
@@ -106,7 +106,7 @@ protected:
// device_state_interface overrides
virtual void state_import(const device_state_entry &entry) override;
virtual void state_export(const device_state_entry &entry) override;
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 1; }
diff --git a/src/devices/cpu/scmp/scmp.cpp b/src/devices/cpu/scmp/scmp.cpp
index ed05dafa962..2e1cf4cd021 100644
--- a/src/devices/cpu/scmp/scmp.cpp
+++ b/src/devices/cpu/scmp/scmp.cpp
@@ -130,8 +130,8 @@ void scmp_device::DEC_ADD(UINT8 val)
UINT16 scmp_device::GET_ADDR(UINT8 code)
{
- UINT16 addr = 0;
- INT8 offset = 0;
+ UINT16 addr;
+ INT8 offset;
UINT16 retVal = 0;
UINT16 ptr = GET_PTR_REG(code & 0x03)->w.l;
@@ -547,7 +547,7 @@ void scmp_device::device_reset()
COMMON STATE IMPORT/EXPORT
***************************************************************************/
-void scmp_device::state_string_export(const device_state_entry &entry, std::string &str)
+void scmp_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/scmp/scmp.h b/src/devices/cpu/scmp/scmp.h
index e89dc2e9088..03f284589eb 100644
--- a/src/devices/cpu/scmp/scmp.h
+++ b/src/devices/cpu/scmp/scmp.h
@@ -56,7 +56,7 @@ protected:
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override { return (spacenum == AS_PROGRAM) ? &m_program_config : nullptr; }
// device_state_interface overrides
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 1; }
diff --git a/src/devices/cpu/score/score.cpp b/src/devices/cpu/score/score.cpp
index f949efe7453..984f832b464 100644
--- a/src/devices/cpu/score/score.cpp
+++ b/src/devices/cpu/score/score.cpp
@@ -80,16 +80,14 @@ void score7_cpu_device::device_start()
// register state for debugger
state_add(SCORE_PC , "PC" , m_pc).callimport().callexport().formatstr("%08X");
- std::string tmp_string;
-
for(int i=0; i<0x20; i++)
- state_add(SCORE_GPR + i, strformat(tmp_string, "r%d", i).c_str(), m_gpr[i]).callimport().callexport().formatstr("%08X");
+ state_add(SCORE_GPR + i, strformat("r%d", i).c_str(), m_gpr[i]).callimport().callexport().formatstr("%08X");
for(int i=0; i<0x20; i++)
- state_add(SCORE_CR + i, strformat(tmp_string, "cr%d", i).c_str(), m_cr[i]).callimport().callexport().formatstr("%08X");
+ state_add(SCORE_CR + i, strformat("cr%d", i).c_str(), m_cr[i]).callimport().callexport().formatstr("%08X");
for(int i=0; i<3; i++)
- state_add(SCORE_SR + i, strformat(tmp_string, "sr%d", i).c_str(), m_sr[i]).callimport().callexport().formatstr("%08X");
+ state_add(SCORE_SR + i, strformat("sr%d", i).c_str(), m_sr[i]).callimport().callexport().formatstr("%08X");
state_add(SCORE_CEH, "ceh", REG_CEH).callimport().callexport().formatstr("%08X");
state_add(SCORE_CEL, "cel", REG_CEL).callimport().callexport().formatstr("%08X");
@@ -132,7 +130,7 @@ void score7_cpu_device::device_reset()
// for the debugger
//-------------------------------------------------
-void score7_cpu_device::state_string_export(const device_state_entry &entry, std::string &str)
+void score7_cpu_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/score/score.h b/src/devices/cpu/score/score.h
index 83e724e7785..ba7058196f8 100644
--- a/src/devices/cpu/score/score.h
+++ b/src/devices/cpu/score/score.h
@@ -47,7 +47,7 @@ protected:
virtual void execute_set_input(int inputnum, int state) override;
// device_state_interface overrides
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_memory_interface overrides
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override;
diff --git a/src/devices/cpu/scudsp/scudsp.cpp b/src/devices/cpu/scudsp/scudsp.cpp
index 14d1565caa2..f0ec1644af5 100644
--- a/src/devices/cpu/scudsp/scudsp.cpp
+++ b/src/devices/cpu/scudsp/scudsp.cpp
@@ -1010,7 +1010,7 @@ scudsp_cpu_device::scudsp_cpu_device(const machine_config &mconfig, const char *
}
-void scudsp_cpu_device::state_string_export(const device_state_entry &entry, std::string &str)
+void scudsp_cpu_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/scudsp/scudsp.h b/src/devices/cpu/scudsp/scudsp.h
index e8f52f661f1..a5827b05e41 100644
--- a/src/devices/cpu/scudsp/scudsp.h
+++ b/src/devices/cpu/scudsp/scudsp.h
@@ -96,7 +96,7 @@ protected:
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override { return (spacenum == AS_PROGRAM) ? &m_program_config : ( (spacenum == AS_DATA) ? &m_data_config : nullptr ); }
// device_state_interface overrides
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 4; }
diff --git a/src/devices/cpu/se3208/se3208.cpp b/src/devices/cpu/se3208/se3208.cpp
index b37a8e09f5f..011cc103909 100644
--- a/src/devices/cpu/se3208/se3208.cpp
+++ b/src/devices/cpu/se3208/se3208.cpp
@@ -1821,7 +1821,7 @@ void se3208_device::device_start()
}
-void se3208_device::state_string_export(const device_state_entry &entry, std::string &str)
+void se3208_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/se3208/se3208.h b/src/devices/cpu/se3208/se3208.h
index e548b7f7621..fbed0d6452b 100644
--- a/src/devices/cpu/se3208/se3208.h
+++ b/src/devices/cpu/se3208/se3208.h
@@ -32,7 +32,7 @@ protected:
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override { return (spacenum == AS_PROGRAM) ? &m_program_config : nullptr; }
// device_state_interface overrides
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 2; }
diff --git a/src/devices/cpu/sh2/sh2.cpp b/src/devices/cpu/sh2/sh2.cpp
index 7cd45505c9b..481f2544126 100644
--- a/src/devices/cpu/sh2/sh2.cpp
+++ b/src/devices/cpu/sh2/sh2.cpp
@@ -199,11 +199,6 @@ sh2_device::sh2_device(const machine_config &mconfig, const char *tag, device_t
void sh2_device::device_stop()
{
- /* clean up the DRC */
- if ( m_drcuml )
- {
- auto_free(machine(), m_drcuml);
- }
}
@@ -2536,7 +2531,7 @@ void sh2_device::device_start()
/* initialize the UML generator */
UINT32 flags = 0;
- m_drcuml = auto_alloc(machine(), drcuml_state(*this, m_cache, flags, 1, 32, 1));
+ m_drcuml = std::make_unique<drcuml_state>(*this, m_cache, flags, 1, 32, 1);
/* add symbols for our stuff */
m_drcuml->symbol_add(&m_sh2_state->pc, sizeof(m_sh2_state->pc), "pc");
@@ -2555,7 +2550,7 @@ void sh2_device::device_start()
m_drcuml->symbol_add(&m_sh2_state->mach, sizeof(m_sh2_state->macl), "mach");
/* initialize the front-end helper */
- m_drcfe = auto_alloc(machine(), sh2_frontend(this, COMPILE_BACKWARDS_BYTES, COMPILE_FORWARDS_BYTES, SINGLE_INSTRUCTION_MODE ? 1 : COMPILE_MAX_SEQUENCE));
+ m_drcfe = std::make_unique<sh2_frontend>(this, COMPILE_BACKWARDS_BYTES, COMPILE_FORWARDS_BYTES, SINGLE_INSTRUCTION_MODE ? 1 : COMPILE_MAX_SEQUENCE);
/* compute the register parameters */
for (int regnum = 0; regnum < 16; regnum++)
@@ -2588,7 +2583,7 @@ void sh2_device::device_start()
}
-void sh2_device::state_string_export(const device_state_entry &entry, std::string &str)
+void sh2_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/sh2/sh2.h b/src/devices/cpu/sh2/sh2.h
index 6a32072ada5..d7fe6c36935 100644
--- a/src/devices/cpu/sh2/sh2.h
+++ b/src/devices/cpu/sh2/sh2.h
@@ -131,7 +131,7 @@ protected:
// device_state_interface overrides
virtual void state_import(const device_state_entry &entry) override;
virtual void state_export(const device_state_entry &entry) override;
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 2; }
@@ -219,8 +219,8 @@ private:
sh2_ftcsr_read_delegate m_ftcsr_read_cb;
drc_cache m_cache; /* pointer to the DRC code cache */
- drcuml_state * m_drcuml; /* DRC UML generator state */
- sh2_frontend * m_drcfe; /* pointer to the DRC front-end state */
+ std::unique_ptr<drcuml_state> m_drcuml; /* DRC UML generator state */
+ std::unique_ptr<sh2_frontend> m_drcfe; /* pointer to the DRC front-end state */
UINT32 m_drcoptions; /* configurable DRC options */
internal_sh2_state *m_sh2_state;
diff --git a/src/devices/cpu/sh2/sh2drc.cpp b/src/devices/cpu/sh2/sh2drc.cpp
index 6f112eb0db5..db732e57b40 100644
--- a/src/devices/cpu/sh2/sh2drc.cpp
+++ b/src/devices/cpu/sh2/sh2drc.cpp
@@ -586,7 +586,7 @@ void sh2_device::func_SUBV() {}
void sh2_device::code_flush_cache()
{
- drcuml_state *drcuml = m_drcuml;
+ drcuml_state *drcuml = m_drcuml.get();
/* empty the transient cache contents */
drcuml->reset();
@@ -617,7 +617,7 @@ void sh2_device::code_flush_cache()
/* Execute cycles - returns number of cycles actually run */
void sh2_device::execute_run_drc()
{
- drcuml_state *drcuml = m_drcuml;
+ drcuml_state *drcuml = m_drcuml.get();
int execute_result;
// run any active DMAs now
@@ -665,7 +665,7 @@ void sh2_device::execute_run_drc()
void sh2_device::code_compile_block(UINT8 mode, offs_t pc)
{
- drcuml_state *drcuml = m_drcuml;
+ drcuml_state *drcuml = m_drcuml.get();
compiler_state compiler = { 0 };
const opcode_desc *seqhead, *seqlast;
const opcode_desc *desclist;
@@ -781,7 +781,7 @@ void sh2_device::code_compile_block(UINT8 mode, offs_t pc)
void sh2_device::static_generate_entry_point()
{
- drcuml_state *drcuml = m_drcuml;
+ drcuml_state *drcuml = m_drcuml.get();
code_label skip = 1;
drcuml_block *block;
@@ -861,7 +861,7 @@ void sh2_device::static_generate_entry_point()
void sh2_device::static_generate_nocode_handler()
{
- drcuml_state *drcuml = m_drcuml;
+ drcuml_state *drcuml = m_drcuml.get();
drcuml_block *block;
/* begin generating */
@@ -886,7 +886,7 @@ void sh2_device::static_generate_nocode_handler()
void sh2_device::static_generate_out_of_cycles()
{
- drcuml_state *drcuml = m_drcuml;
+ drcuml_state *drcuml = m_drcuml.get();
drcuml_block *block;
/* begin generating */
@@ -912,7 +912,7 @@ void sh2_device::static_generate_memory_accessor(int size, int iswrite, const ch
/* on entry, address is in I0; data for writes is in I1 */
/* on exit, read result is in I0 */
/* routine trashes I0 */
- drcuml_state *drcuml = m_drcuml;
+ drcuml_state *drcuml = m_drcuml.get();
drcuml_block *block;
int label = 1;
diff --git a/src/devices/cpu/sh4/sh4.cpp b/src/devices/cpu/sh4/sh4.cpp
index e0835b1f9c0..fc67b4d9d86 100644
--- a/src/devices/cpu/sh4/sh4.cpp
+++ b/src/devices/cpu/sh4/sh4.cpp
@@ -4447,7 +4447,7 @@ void sh34_base_device::state_export(const device_state_entry &entry)
}
}
-void sh34_base_device::state_string_export(const device_state_entry &entry, std::string &str)
+void sh34_base_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
#ifdef LSB_FIRST
UINT8 fpu_xor = m_fpu_pr;
diff --git a/src/devices/cpu/sh4/sh4.h b/src/devices/cpu/sh4/sh4.h
index bba3483b9a1..badaacd4558 100644
--- a/src/devices/cpu/sh4/sh4.h
+++ b/src/devices/cpu/sh4/sh4.h
@@ -220,7 +220,7 @@ protected:
// device_state_interface overrides
virtual void state_import(const device_state_entry &entry) override;
virtual void state_export(const device_state_entry &entry) override;
- virtual void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 2; }
diff --git a/src/devices/cpu/sharc/sharcdsm.cpp b/src/devices/cpu/sharc/sharcdsm.cpp
index c498dcb78e5..af754afe66b 100644
--- a/src/devices/cpu/sharc/sharcdsm.cpp
+++ b/src/devices/cpu/sharc/sharcdsm.cpp
@@ -1208,8 +1208,8 @@ static UINT32 sharc_dasm_one(char *buffer, offs_t pc, UINT64 opcode)
CPU_DISASSEMBLE( sharc )
{
- UINT64 op = 0;
- UINT32 flags = 0;
+ UINT64 op;
+ UINT32 flags;
op = ((UINT64)oprom[0] << 0) | ((UINT64)oprom[1] << 8) |
((UINT64)oprom[2] << 16) | ((UINT64)oprom[3] << 24) |
diff --git a/src/devices/cpu/sm8500/sm8500.cpp b/src/devices/cpu/sm8500/sm8500.cpp
index 11fc61132fc..66c51c61e5b 100644
--- a/src/devices/cpu/sm8500/sm8500.cpp
+++ b/src/devices/cpu/sm8500/sm8500.cpp
@@ -53,7 +53,7 @@ void sm8500_cpu_device::get_sp()
}
-UINT8 sm8500_cpu_device::mem_readbyte( UINT32 offset )
+UINT8 sm8500_cpu_device::mem_readbyte( UINT32 offset ) const
{
offset &= 0xffff;
if ( offset < 0x10)
@@ -141,7 +141,7 @@ void sm8500_cpu_device::device_start()
}
-void sm8500_cpu_device::state_string_export(const device_state_entry &entry, std::string &str)
+void sm8500_cpu_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/sm8500/sm8500.h b/src/devices/cpu/sm8500/sm8500.h
index 8dd4802efb6..ab9f3c9ea65 100644
--- a/src/devices/cpu/sm8500/sm8500.h
+++ b/src/devices/cpu/sm8500/sm8500.h
@@ -71,7 +71,7 @@ protected:
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override { return (spacenum == AS_PROGRAM) ? &m_program_config : nullptr; }
// device_state_interface overrides
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 1; }
@@ -79,9 +79,9 @@ protected:
virtual offs_t disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options) override;
inline void get_sp();
- UINT8 mem_readbyte(UINT32 offset);
+ UINT8 mem_readbyte(UINT32 offset) const;
void mem_writebyte(UINT32 offset, UINT8 data);
- inline UINT16 mem_readword(UINT32 address) { return (mem_readbyte(address ) << 8) | (mem_readbyte(address+1)); }
+ inline UINT16 mem_readword(UINT32 address) const { return (mem_readbyte(address ) << 8) | (mem_readbyte(address+1)); }
inline void mem_writeword(UINT32 address, UINT16 value) { mem_writebyte(address, value >> 8); mem_writebyte(address+1, value); }
inline void take_interrupt(UINT16 vector);
void process_interrupts();
diff --git a/src/devices/cpu/sm8500/sm8500d.cpp b/src/devices/cpu/sm8500/sm8500d.cpp
index 06b37795d54..f5fc1341365 100644
--- a/src/devices/cpu/sm8500/sm8500d.cpp
+++ b/src/devices/cpu/sm8500/sm8500d.cpp
@@ -178,8 +178,9 @@ CPU_DISASSEMBLE( sm8500 )
const sm8500dasm *instr;
char *dst;
UINT8 op;
- INT8 offset = 0;
- UINT16 ea = 0, ea2 = 0;
+ INT8 offset;
+ UINT16 ea;
+ UINT16 ea2;
int pos = 0;
dst = buffer;
diff --git a/src/devices/cpu/spc700/spc700.cpp b/src/devices/cpu/spc700/spc700.cpp
index 968aad0f10c..22969235ae7 100644
--- a/src/devices/cpu/spc700/spc700.cpp
+++ b/src/devices/cpu/spc700/spc700.cpp
@@ -1244,7 +1244,7 @@ void spc700_device::device_start()
}
-void spc700_device::state_string_export(const device_state_entry &entry, std::string &str)
+void spc700_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/spc700/spc700.h b/src/devices/cpu/spc700/spc700.h
index ad5085b38a9..30b9b2ccdf3 100644
--- a/src/devices/cpu/spc700/spc700.h
+++ b/src/devices/cpu/spc700/spc700.h
@@ -30,7 +30,7 @@ protected:
// device_state_interface overrides
virtual void state_import(const device_state_entry &entry) override;
virtual void state_export(const device_state_entry &entry) override;
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 1; }
diff --git a/src/devices/cpu/ssem/ssem.cpp b/src/devices/cpu/ssem/ssem.cpp
index 0dfec9b9cfb..438e36cbd9e 100644
--- a/src/devices/cpu/ssem/ssem.cpp
+++ b/src/devices/cpu/ssem/ssem.cpp
@@ -149,7 +149,7 @@ const address_space_config *ssem_device::memory_space_config(address_spacenum sp
// for the debugger
//-------------------------------------------------
-void ssem_device::state_string_export(const device_state_entry &entry, std::string &str)
+void ssem_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/ssem/ssem.h b/src/devices/cpu/ssem/ssem.h
index e57294fbbf5..8d2c0c21044 100644
--- a/src/devices/cpu/ssem/ssem.h
+++ b/src/devices/cpu/ssem/ssem.h
@@ -45,7 +45,7 @@ public:
virtual offs_t disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options) override;
// device_state_interface overrides
- virtual void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// address spaces
const address_space_config m_program_config;
diff --git a/src/devices/cpu/ssp1601/ssp1601.cpp b/src/devices/cpu/ssp1601/ssp1601.cpp
index 945eb7d4499..db50c5e6816 100644
--- a/src/devices/cpu/ssp1601/ssp1601.cpp
+++ b/src/devices/cpu/ssp1601/ssp1601.cpp
@@ -1,4 +1,4 @@
-// license:???
+// license:BSD-3-Clause
// copyright-holders:Pierpaolo Prazzoli,Grazvydas Ignotas
/*
* Samsung SSP1601 DSP emulator
@@ -451,7 +451,7 @@ void ssp1601_device::ptr1_write(int op, UINT32 d)
UINT32 ssp1601_device::ptr2_read(int op)
{
- int mv = 0, t = (op&3) | ((op>>6)&4) | ((op<<1)&0x18);
+ int mv, t = (op&3) | ((op>>6)&4) | ((op<<1)&0x18);
switch (t)
{
// mod=0 (00)
@@ -547,7 +547,7 @@ void ssp1601_device::device_start()
}
-void ssp1601_device::state_string_export(const device_state_entry &entry, std::string &str)
+void ssp1601_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/ssp1601/ssp1601.h b/src/devices/cpu/ssp1601/ssp1601.h
index 5d67827b288..1917af79adb 100644
--- a/src/devices/cpu/ssp1601/ssp1601.h
+++ b/src/devices/cpu/ssp1601/ssp1601.h
@@ -40,7 +40,7 @@ protected:
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override { return (spacenum == AS_PROGRAM) ? &m_program_config : ((spacenum == AS_IO) ? &m_io_config : nullptr); }
// device_state_interface overrides
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 2; }
diff --git a/src/devices/cpu/ssp1601/ssp1601d.cpp b/src/devices/cpu/ssp1601/ssp1601d.cpp
index c147cbd8534..dfc8f3ae366 100644
--- a/src/devices/cpu/ssp1601/ssp1601d.cpp
+++ b/src/devices/cpu/ssp1601/ssp1601d.cpp
@@ -1,5 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders:Pierpaolo Prazzoli
+// copyright-holders:Pierpaolo Prazzoli,Grazvydas Ignotas
/*
SSP1601 disassembler
diff --git a/src/devices/cpu/superfx/superfx.cpp b/src/devices/cpu/superfx/superfx.cpp
index eb5f04278d3..7601fa9bdc3 100644
--- a/src/devices/cpu/superfx/superfx.cpp
+++ b/src/devices/cpu/superfx/superfx.cpp
@@ -106,7 +106,7 @@ void superfx_device::superfx_pixelcache_flush(INT32 line)
UINT8 y = m_pixelcache[line].offset >> 5;
UINT32 cn = 0;
UINT32 bpp = 2 << ((m_scmr & SUPERFX_SCMR_MD) - ((m_scmr & SUPERFX_SCMR_MD) >> 1)); // = [regs.scmr.md]{ 2, 4, 4, 8 };
- UINT32 addr = 0;
+ UINT32 addr;
UINT32 n = 0;
if(m_pixelcache[line].bitpend == 0x00)
@@ -218,8 +218,8 @@ void superfx_device::superfx_plot(UINT8 x, UINT8 y)
UINT8 superfx_device::superfx_rpix(UINT8 x, UINT8 y)
{
UINT32 cn = 0;
- UINT32 bpp = 0;
- UINT32 addr = 0;
+ UINT32 bpp;
+ UINT32 addr;
UINT8 data = 0x00;
UINT32 n = 0;
@@ -988,7 +988,7 @@ void superfx_device::execute_run()
case 0x46: case 0x47: case 0x48: case 0x49: case 0x4a: case 0x4b: // LDW_IR / LDB_IR
if((m_sfr & SUPERFX_SFR_ALT1) == 0)
{ // LDW_IR
- UINT16 data = 0;
+ UINT16 data;
m_ramaddr = m_r[op & 0xf];
data = superfx_rambuffer_read(m_ramaddr ^ 0) << 0;
data |= superfx_rambuffer_read(m_ramaddr ^ 1) << 8;
@@ -1271,7 +1271,7 @@ void superfx_device::execute_run()
case SUPERFX_SFR_ALT1: // LMS
case SUPERFX_SFR_ALT3: // LMS
{
- UINT16 data = 0;
+ UINT16 data;
m_ramaddr = superfx_pipe() << 1;
data = superfx_rambuffer_read(m_ramaddr ^ 0) << 0;
data |= superfx_rambuffer_read(m_ramaddr ^ 1) << 8;
diff --git a/src/devices/cpu/t11/t11.cpp b/src/devices/cpu/t11/t11.cpp
index 4a012ec0505..72c2e80c91b 100644
--- a/src/devices/cpu/t11/t11.cpp
+++ b/src/devices/cpu/t11/t11.cpp
@@ -291,7 +291,7 @@ void t11_device::device_start()
m_icountptr = &m_icount;
}
-void t11_device::state_string_export(const device_state_entry &entry, std::string &str)
+void t11_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
@@ -310,7 +310,7 @@ void t11_device::state_string_export(const device_state_entry &entry, std::strin
}
}
-void k1801vm2_device::state_string_export(const device_state_entry &entry, std::string &str)
+void k1801vm2_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/t11/t11.h b/src/devices/cpu/t11/t11.h
index d2d0896445b..55d11c9666a 100644
--- a/src/devices/cpu/t11/t11.h
+++ b/src/devices/cpu/t11/t11.h
@@ -59,7 +59,7 @@ protected:
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override { return (spacenum == AS_PROGRAM) ? &m_program_config : nullptr; }
// device_state_interface overrides
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 2; }
@@ -1145,7 +1145,7 @@ protected:
virtual void device_reset() override;
// device_state_interface overrides
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
};
diff --git a/src/devices/cpu/tlcs90/tlcs90.cpp b/src/devices/cpu/tlcs90/tlcs90.cpp
index aec1191f4ae..994d0abb3da 100644
--- a/src/devices/cpu/tlcs90/tlcs90.cpp
+++ b/src/devices/cpu/tlcs90/tlcs90.cpp
@@ -1328,7 +1328,7 @@ void tlcs90_device::check_interrupts()
if (!(F & IF))
return;
- for (irq = INTSWI; irq < INTMAX; irq++)
+ for (irq = INTSWI; irq < INTMAX; ++irq)
{
mask = (1 << irq);
if(irq >= INT0) mask &= m_irq_mask;
@@ -2766,7 +2766,7 @@ void tlcs90_device::device_start()
}
-void tlcs90_device::state_string_export(const device_state_entry &entry, std::string &str)
+void tlcs90_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/tlcs90/tlcs90.h b/src/devices/cpu/tlcs90/tlcs90.h
index 7921444d7fd..42a7e5f5c08 100644
--- a/src/devices/cpu/tlcs90/tlcs90.h
+++ b/src/devices/cpu/tlcs90/tlcs90.h
@@ -51,7 +51,7 @@ protected:
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override { return (spacenum == AS_PROGRAM) ? &m_program_config : ( (spacenum == AS_IO) ? &m_io_config : nullptr ); }
// device_state_interface overrides
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 1; }
diff --git a/src/devices/cpu/tlcs900/tlcs900.cpp b/src/devices/cpu/tlcs900/tlcs900.cpp
index c11dc9c08a9..2b5d45d7757 100644
--- a/src/devices/cpu/tlcs900/tlcs900.cpp
+++ b/src/devices/cpu/tlcs900/tlcs900.cpp
@@ -110,7 +110,15 @@ tmp95c063_device::tmp95c063_device(const machine_config &mconfig, const char *ta
m_portd_read(*this),
m_portd_write(*this),
m_porte_read(*this),
- m_porte_write(*this)
+ m_porte_write(*this),
+ m_an0_read(*this),
+ m_an1_read(*this),
+ m_an2_read(*this),
+ m_an3_read(*this),
+ m_an4_read(*this),
+ m_an5_read(*this),
+ m_an6_read(*this),
+ m_an7_read(*this)
{
}
@@ -356,18 +364,18 @@ void tlcs900h_device::device_start()
state_add( TLCS900_DMAD0, "DMAD0", m_dmad[0].d ).formatstr("%08X");
state_add( TLCS900_DMAC0, "DMAC0", m_dmac[0].w.l ).formatstr("%04X");
state_add( TLCS900_DMAM0, "DMAM0", m_dmam[0].b.l ).formatstr("%02X");
- state_add( TLCS900_DMAS1, "DMAS0", m_dmas[1].d ).formatstr("%08X");
- state_add( TLCS900_DMAD1, "DMAD0", m_dmad[1].d ).formatstr("%08X");
- state_add( TLCS900_DMAC1, "DMAC0", m_dmac[1].w.l ).formatstr("%04X");
- state_add( TLCS900_DMAM1, "DMAM0", m_dmam[1].b.l ).formatstr("%02X");
- state_add( TLCS900_DMAS2, "DMAS0", m_dmas[2].d ).formatstr("%08X");
- state_add( TLCS900_DMAD2, "DMAD0", m_dmad[2].d ).formatstr("%08X");
- state_add( TLCS900_DMAC2, "DMAC0", m_dmac[2].w.l ).formatstr("%04X");
- state_add( TLCS900_DMAM2, "DMAM0", m_dmam[2].b.l ).formatstr("%02X");
- state_add( TLCS900_DMAS3, "DMAS0", m_dmas[3].d ).formatstr("%08X");
- state_add( TLCS900_DMAD3, "DMAD0", m_dmad[3].d ).formatstr("%08X");
- state_add( TLCS900_DMAC3, "DMAC0", m_dmac[3].w.l ).formatstr("%04X");
- state_add( TLCS900_DMAM3, "DMAM0", m_dmam[3].b.l ).formatstr("%02X");
+ state_add( TLCS900_DMAS1, "DMAS1", m_dmas[1].d ).formatstr("%08X");
+ state_add( TLCS900_DMAD1, "DMAD1", m_dmad[1].d ).formatstr("%08X");
+ state_add( TLCS900_DMAC1, "DMAC1", m_dmac[1].w.l ).formatstr("%04X");
+ state_add( TLCS900_DMAM1, "DMAM1", m_dmam[1].b.l ).formatstr("%02X");
+ state_add( TLCS900_DMAS2, "DMAS2", m_dmas[2].d ).formatstr("%08X");
+ state_add( TLCS900_DMAD2, "DMAD2", m_dmad[2].d ).formatstr("%08X");
+ state_add( TLCS900_DMAC2, "DMAC2", m_dmac[2].w.l ).formatstr("%04X");
+ state_add( TLCS900_DMAM2, "DMAM2", m_dmam[2].b.l ).formatstr("%02X");
+ state_add( TLCS900_DMAS3, "DMAS3", m_dmas[3].d ).formatstr("%08X");
+ state_add( TLCS900_DMAD3, "DMAD3", m_dmad[3].d ).formatstr("%08X");
+ state_add( TLCS900_DMAC3, "DMAC3", m_dmac[3].w.l ).formatstr("%04X");
+ state_add( TLCS900_DMAM3, "DMAM3", m_dmam[3].b.l ).formatstr("%02X");
state_add( STATE_GENPC, "GENPC", m_pc.d ).noshow();
state_add( STATE_GENFLAGS, "GENFLAGS", m_sr.w.l ).formatstr("%12s").noshow();
@@ -376,7 +384,7 @@ void tlcs900h_device::device_start()
}
-void tlcs900h_device::state_string_export(const device_state_entry &entry, std::string &str)
+void tlcs900h_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
@@ -1732,7 +1740,151 @@ void tmp95c063_device::tlcs900_check_irqs()
void tmp95c063_device::tlcs900_handle_ad()
{
- // TODO
+ if ( m_ad_cycles_left > 0 )
+ {
+ m_ad_cycles_left -= m_cycles;
+ if ( m_ad_cycles_left <= 0 )
+ {
+ int ad_value;
+
+ /* Store A/D converted value */
+ if ((m_reg[TMP95C063_ADMOD1] & 0x10) == 0) // conversion channel fixed
+ {
+ switch( m_reg[TMP95C063_ADMOD2] & 0x07 )
+ {
+ case 0x00: // AN0
+ ad_value = m_an0_read(0) & 0x3ff;
+ m_reg[TMP95C063_ADREG04L] = (ad_value & 0x3) << 6;
+ m_reg[TMP95C063_ADREG04H] = (ad_value >> 2) & 0xff;
+ break;
+ case 0x01: // AN1
+ ad_value = m_an1_read(0) & 0x3ff;
+ m_reg[TMP95C063_ADREG15L] = (ad_value & 0x3) << 6;
+ m_reg[TMP95C063_ADREG15H] = (ad_value >> 2) & 0xff;
+ break;
+ case 0x02: // AN2
+ ad_value = m_an2_read(0) & 0x3ff;
+ m_reg[TMP95C063_ADREG26L] = (ad_value & 0x3) << 6;
+ m_reg[TMP95C063_ADREG26H] = (ad_value >> 2) & 0xff;
+ break;
+ case 0x03: // AN3
+ ad_value = m_an3_read(0) & 0x3ff;
+ m_reg[TMP95C063_ADREG37L] = (ad_value & 0x3) << 6;
+ m_reg[TMP95C063_ADREG37H] = (ad_value >> 2) & 0xff;
+ break;
+ case 0x04: // AN4
+ ad_value = m_an4_read(0) & 0x3ff;
+ m_reg[TMP95C063_ADREG04L] = (ad_value & 0x3) << 6;
+ m_reg[TMP95C063_ADREG04H] = (ad_value >> 2) & 0xff;
+ break;
+ case 0x05: // AN5
+ ad_value = m_an5_read(0) & 0x3ff;
+ m_reg[TMP95C063_ADREG15L] = (ad_value & 0x3) << 6;
+ m_reg[TMP95C063_ADREG15H] = (ad_value >> 2) & 0xff;
+ break;
+ case 0x06: // AN6
+ ad_value = m_an6_read(0) & 0x3ff;
+ m_reg[TMP95C063_ADREG26L] = (ad_value & 0x3) << 6;
+ m_reg[TMP95C063_ADREG26H] = (ad_value >> 2) & 0xff;
+ break;
+ case 0x07: // AN7
+ ad_value = m_an7_read(0) & 0x3ff;
+ m_reg[TMP95C063_ADREG37L] = (ad_value & 0x3) << 6;
+ m_reg[TMP95C063_ADREG37H] = (ad_value >> 2) & 0xff;
+ break;
+ }
+ }
+ else // conversion channel sweep
+ {
+ switch( m_reg[TMP95C063_ADMOD2] & 0x07 )
+ {
+ case 0x00: // AN0
+ ad_value = m_an0_read(0) & 0x3ff;
+ m_reg[TMP95C063_ADREG04L] = (ad_value & 0x3) << 6;
+ m_reg[TMP95C063_ADREG04H] = (ad_value >> 2) & 0xff;
+ break;
+ case 0x01: // AN0 -> AN1
+ ad_value = m_an0_read(0) & 0x3ff;
+ m_reg[TMP95C063_ADREG04L] = (ad_value & 0x3) << 6;
+ m_reg[TMP95C063_ADREG04H] = (ad_value >> 2) & 0xff;
+ ad_value = m_an1_read(0) & 0x3ff;
+ m_reg[TMP95C063_ADREG15L] = (ad_value & 0x3) << 6;
+ m_reg[TMP95C063_ADREG15H] = (ad_value >> 2) & 0xff;
+ break;
+ case 0x02: // AN0 -> AN1 -> AN2
+ ad_value = m_an0_read(0) & 0x3ff;
+ m_reg[TMP95C063_ADREG04L] = (ad_value & 0x3) << 6;
+ m_reg[TMP95C063_ADREG04H] = (ad_value >> 2) & 0xff;
+ ad_value = m_an1_read(0) & 0x3ff;
+ m_reg[TMP95C063_ADREG15L] = (ad_value & 0x3) << 6;
+ m_reg[TMP95C063_ADREG15H] = (ad_value >> 2) & 0xff;
+ ad_value = m_an2_read(0) & 0x3ff;
+ m_reg[TMP95C063_ADREG26L] = (ad_value & 0x3) << 6;
+ m_reg[TMP95C063_ADREG26H] = (ad_value >> 2) & 0xff;
+ break;
+ case 0x03: // AN0 -> AN1 -> AN2 -> AN3
+ ad_value = m_an0_read(0) & 0x3ff;
+ m_reg[TMP95C063_ADREG04L] = (ad_value & 0x3) << 6;
+ m_reg[TMP95C063_ADREG04H] = (ad_value >> 2) & 0xff;
+ ad_value = m_an1_read(0) & 0x3ff;
+ m_reg[TMP95C063_ADREG15L] = (ad_value & 0x3) << 6;
+ m_reg[TMP95C063_ADREG15H] = (ad_value >> 2) & 0xff;
+ ad_value = m_an2_read(0) & 0x3ff;
+ m_reg[TMP95C063_ADREG26L] = (ad_value & 0x3) << 6;
+ m_reg[TMP95C063_ADREG26H] = (ad_value >> 2) & 0xff;
+ ad_value = m_an3_read(0) & 0x3ff;
+ m_reg[TMP95C063_ADREG37L] = (ad_value & 0x3) << 6;
+ m_reg[TMP95C063_ADREG37H] = (ad_value >> 2) & 0xff;
+ break;
+ case 0x04: // AN4
+ ad_value = m_an4_read(0) & 0x3ff;
+ m_reg[TMP95C063_ADREG04L] = (ad_value & 0x3) << 6;
+ m_reg[TMP95C063_ADREG04H] = (ad_value >> 2) & 0xff;
+ break;
+ case 0x05: // AN4 -> AN5
+ ad_value = m_an4_read(0) & 0x3ff;
+ m_reg[TMP95C063_ADREG04L] = (ad_value & 0x3) << 6;
+ m_reg[TMP95C063_ADREG04H] = (ad_value >> 2) & 0xff;
+ ad_value = m_an5_read(0) & 0x3ff;
+ m_reg[TMP95C063_ADREG15L] = (ad_value & 0x3) << 6;
+ m_reg[TMP95C063_ADREG15H] = (ad_value >> 2) & 0xff;
+ break;
+ case 0x06: // AN4 -> AN5 -> AN6
+ ad_value = m_an4_read(0) & 0x3ff;
+ m_reg[TMP95C063_ADREG04L] = (ad_value & 0x3) << 6;
+ m_reg[TMP95C063_ADREG04H] = (ad_value >> 2) & 0xff;
+ ad_value = m_an5_read(0) & 0x3ff;
+ m_reg[TMP95C063_ADREG15L] = (ad_value & 0x3) << 6;
+ m_reg[TMP95C063_ADREG15H] = (ad_value >> 2) & 0xff;
+ ad_value = m_an6_read(0) & 0x3ff;
+ m_reg[TMP95C063_ADREG26L] = (ad_value & 0x3) << 6;
+ m_reg[TMP95C063_ADREG26H] = (ad_value >> 2) & 0xff;
+ break;
+ case 0x07: // AN4 -> AN5 -> AN6 -> AN7
+ ad_value = m_an4_read(0) & 0x3ff;
+ m_reg[TMP95C063_ADREG04L] = (ad_value & 0x3) << 6;
+ m_reg[TMP95C063_ADREG04H] = (ad_value >> 2) & 0xff;
+ ad_value = m_an5_read(0) & 0x3ff;
+ m_reg[TMP95C063_ADREG15L] = (ad_value & 0x3) << 6;
+ m_reg[TMP95C063_ADREG15H] = (ad_value >> 2) & 0xff;
+ ad_value = m_an6_read(0) & 0x3ff;
+ m_reg[TMP95C063_ADREG26L] = (ad_value & 0x3) << 6;
+ m_reg[TMP95C063_ADREG26H] = (ad_value >> 2) & 0xff;
+ ad_value = m_an7_read(0) & 0x3ff;
+ m_reg[TMP95C063_ADREG37L] = (ad_value & 0x3) << 6;
+ m_reg[TMP95C063_ADREG37H] = (ad_value >> 2) & 0xff;
+ break;
+ }
+ }
+
+ /* Clear BUSY flag, set END flag */
+ m_reg[TMP95C063_ADMOD1] &= ~ 0x40;
+ m_reg[TMP95C063_ADMOD1] |= 0x80;
+
+ m_reg[TMP95C063_INTE0AD] |= 0x80;
+ m_check_irqs = 1;
+ }
+ }
}
@@ -1762,6 +1914,14 @@ void tmp95c063_device::device_start()
m_portd_write.resolve_safe();
m_porte_read.resolve_safe(0);
m_porte_write.resolve_safe();
+ m_an0_read.resolve_safe(0);
+ m_an1_read.resolve_safe(0);
+ m_an2_read.resolve_safe(0);
+ m_an3_read.resolve_safe(0);
+ m_an4_read.resolve_safe(0);
+ m_an5_read.resolve_safe(0);
+ m_an6_read.resolve_safe(0);
+ m_an7_read.resolve_safe(0);
}
void tmp95c063_device::device_reset()
@@ -2050,6 +2210,26 @@ WRITE8_MEMBER( tmp95c063_device::internal_w )
case TMP95C063_IIMC:
break;
+ case TMP95C063_ADMOD1:
+ // conversion start
+ if (data & 0x04)
+ {
+ data &= ~0x04;
+ data |= 0x40;
+
+ switch ((m_reg[TMP95C063_ADMOD2] >> 4) & 3)
+ {
+ case 0: m_ad_cycles_left = 160; break;
+ case 1: m_ad_cycles_left = 320; break;
+ case 2: m_ad_cycles_left = 640; break;
+ case 3: m_ad_cycles_left = 1280; break;
+ }
+ }
+ break;
+
+ case TMP95C063_ADMOD2:
+ break;
+
default:
break;
}
diff --git a/src/devices/cpu/tlcs900/tlcs900.h b/src/devices/cpu/tlcs900/tlcs900.h
index 0481d96db21..54b68a090d5 100644
--- a/src/devices/cpu/tlcs900/tlcs900.h
+++ b/src/devices/cpu/tlcs900/tlcs900.h
@@ -49,7 +49,6 @@ class tlcs900h_device : public cpu_device
{
public:
// construction/destruction
- tlcs900h_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
tlcs900h_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname);
// static configuration helpers
@@ -72,7 +71,7 @@ protected:
}
// device_state_interface overrides
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 1; }
@@ -744,6 +743,14 @@ private:
#define MCFG_TMP95C063_PORTD_WRITE( _port_write ) tmp95c063_device::set_portd_write( *device, DEVCB_##_port_write );
#define MCFG_TMP95C063_PORTE_READ( _port_read ) tmp95c063_device::set_porte_read( *device, DEVCB_##_port_read );
#define MCFG_TMP95C063_PORTE_WRITE( _port_write ) tmp95c063_device::set_porte_write( *device, DEVCB_##_port_write );
+#define MCFG_TMP95C063_AN0_READ( _port_read ) tmp95c063_device::set_an0_read( *device, DEVCB_##_port_read );
+#define MCFG_TMP95C063_AN1_READ( _port_read ) tmp95c063_device::set_an1_read( *device, DEVCB_##_port_read );
+#define MCFG_TMP95C063_AN2_READ( _port_read ) tmp95c063_device::set_an2_read( *device, DEVCB_##_port_read );
+#define MCFG_TMP95C063_AN3_READ( _port_read ) tmp95c063_device::set_an3_read( *device, DEVCB_##_port_read );
+#define MCFG_TMP95C063_AN4_READ( _port_read ) tmp95c063_device::set_an4_read( *device, DEVCB_##_port_read );
+#define MCFG_TMP95C063_AN5_READ( _port_read ) tmp95c063_device::set_an5_read( *device, DEVCB_##_port_read );
+#define MCFG_TMP95C063_AN6_READ( _port_read ) tmp95c063_device::set_an6_read( *device, DEVCB_##_port_read );
+#define MCFG_TMP95C063_AN7_READ( _port_read ) tmp95c063_device::set_an7_read( *device, DEVCB_##_port_read );
class tmp95c063_device : public tlcs900h_device
{
@@ -777,6 +784,14 @@ public:
template<class _Object> static devcb_base &set_portd_write(device_t &device, _Object object) { return downcast<tmp95c063_device &>(device).m_portd_write.set_callback(object); }
template<class _Object> static devcb_base &set_porte_read(device_t &device, _Object object) { return downcast<tmp95c063_device &>(device).m_porte_read.set_callback(object); }
template<class _Object> static devcb_base &set_porte_write(device_t &device, _Object object) { return downcast<tmp95c063_device &>(device).m_porte_write.set_callback(object); }
+ template<class _Object> static devcb_base &set_an0_read(device_t &device, _Object object) { return downcast<tmp95c063_device &>(device).m_an0_read.set_callback(object); }
+ template<class _Object> static devcb_base &set_an1_read(device_t &device, _Object object) { return downcast<tmp95c063_device &>(device).m_an1_read.set_callback(object); }
+ template<class _Object> static devcb_base &set_an2_read(device_t &device, _Object object) { return downcast<tmp95c063_device &>(device).m_an2_read.set_callback(object); }
+ template<class _Object> static devcb_base &set_an3_read(device_t &device, _Object object) { return downcast<tmp95c063_device &>(device).m_an3_read.set_callback(object); }
+ template<class _Object> static devcb_base &set_an4_read(device_t &device, _Object object) { return downcast<tmp95c063_device &>(device).m_an4_read.set_callback(object); }
+ template<class _Object> static devcb_base &set_an5_read(device_t &device, _Object object) { return downcast<tmp95c063_device &>(device).m_an5_read.set_callback(object); }
+ template<class _Object> static devcb_base &set_an6_read(device_t &device, _Object object) { return downcast<tmp95c063_device &>(device).m_an6_read.set_callback(object); }
+ template<class _Object> static devcb_base &set_an7_read(device_t &device, _Object object) { return downcast<tmp95c063_device &>(device).m_an7_read.set_callback(object); }
protected:
virtual void device_config_complete() override;
@@ -835,6 +850,16 @@ private:
// Port E: 8 bit I/O.
devcb_read8 m_porte_read;
devcb_write8 m_porte_write;
+
+ // analogue inputs, sampled at 10 bits
+ devcb_read16 m_an0_read;
+ devcb_read16 m_an1_read;
+ devcb_read16 m_an2_read;
+ devcb_read16 m_an3_read;
+ devcb_read16 m_an4_read;
+ devcb_read16 m_an5_read;
+ devcb_read16 m_an6_read;
+ devcb_read16 m_an7_read;
};
#endif
diff --git a/src/devices/cpu/tms0980/tms0980.cpp b/src/devices/cpu/tms0980/tms0980.cpp
index 3cb9f2a0800..7bc62b5a475 100644
--- a/src/devices/cpu/tms0980/tms0980.cpp
+++ b/src/devices/cpu/tms0980/tms0980.cpp
@@ -166,31 +166,35 @@ const device_type TMS1670 = &device_creator<tms1670_cpu_device>; // high voltage
// - 2048x9bit ROM array at the bottom-left
// - main instructions PLA at the top half, to the right of the midline
// - 64-term microinstructions PLA between the RAM and ROM, supporting 20 microinstructions
-// - 16-term output PLA and segment PLA above the RAM (rotate opla 90 degrees)
+// - 16-term inverted output PLA and segment PLA above the RAM (rotate opla 90 degrees)
const device_type TMS0980 = &device_creator<tms0980_cpu_device>; // 28-pin DIP, 9 R pins
// TMS1980 is a TMS0980 with a TMS1x00 style opla
-// - RAM, ROM, and main instructions PLA is exactly the same as TMS0980
+// - RAM, ROM, and main instructions PLA is the same as TMS0980
// - one of the microinstructions redirects to a RSTR instruction, like on TMS0270
-// - 32-term output PLA above the RAM, 7 bits! (rotate opla 270 degrees)
-const device_type TMS1980 = &device_creator<tms1980_cpu_device>; // 28-pin DIP, 7 O pins, ? R pins, high voltage
-// TMS0260 is same?
+// - 32-term inverted output PLA above the RAM, 7 bits! (rotate opla 270 degrees)
+const device_type TMS1980 = &device_creator<tms1980_cpu_device>; // 28-pin DIP, 7 O pins, 10 R pins, high voltage
+
+// TMS0950 is a TMS1000 with a TMS0980 style opla, it was quickly succeeded by the TMS0970
+// - RAM, ROM, microinstructions is the same as TMS1000
+// - 10-term inverted output PLA and segment PLA on the top-left
+const device_type TMS0950 = &device_creator<tms0950_cpu_device>; // 28-pin DIP, 8 O pins, 11? R pins
// TMS0970 is a stripped-down version of the TMS0980, itself acting more like a TMS1000
-// - RAM and ROM is exactly the same as TMS1000
+// - RAM and ROM is the same as TMS1000
// - main instructions PLA at the top half, to the right of the midline
// - 32-term microinstructions PLA between the RAM and ROM, supporting 15 microinstructions
-// - 16-term output PLA and segment PLA above the RAM (rotate opla 90 degrees)
+// - 16-term inverted output PLA and segment PLA above the RAM (rotate opla 90 degrees)
const device_type TMS0970 = &device_creator<tms0970_cpu_device>; // 28-pin DIP, 11 R pins (note: pinout may slightly differ from chip to chip)
const device_type TMS1990 = &device_creator<tms1990_cpu_device>; // 28-pin DIP, ? R pins..
-// TMS0950 is same?
// TMS0270 on the other hand, is a TMS0980 with earrings and a new hat. The new changes look like a quick afterthought, almost hacky
-// - RAM, ROM, and main instructions PLA is exactly the same as TMS0980
+// - RAM, ROM, and main instructions PLA is the same as TMS0980
// - 64-term microinstructions PLA between the RAM and ROM, supporting 20 microinstructions plus optional separate lines for custom opcode handling
// - 48-term output PLA above the RAM (rotate opla 90 degrees)
const device_type TMS0270 = &device_creator<tms0270_cpu_device>; // 40-pin DIP, 16 O pins, 8+ R pins (some R pins are internally hooked up to support more I/O)
// newer TMS0270 chips (eg. Speak & Math) have 42 pins
+// TMS0260 is same or similar?
// internal memory maps
@@ -302,6 +306,10 @@ tms0970_cpu_device::tms0970_cpu_device(const machine_config &mconfig, device_typ
: tms1000_cpu_device(mconfig, type, name, tag, owner, clock, o_pins, r_pins, pc_bits, byte_bits, x_bits, prgwidth, program, datawidth, data, shortname, source)
{ }
+tms0950_cpu_device::tms0950_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : tms0970_cpu_device(mconfig, TMS0950, "TMS0950", tag, owner, clock, 8, 11, 6, 8, 2, 10, ADDRESS_MAP_NAME(program_10bit_8), 6, ADDRESS_MAP_NAME(data_64x4), "tms0950", __FILE__)
+{ }
+
tms1990_cpu_device::tms1990_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: tms0970_cpu_device(mconfig, TMS1990, "TMS1990", tag, owner, clock, 8, 11, 6, 8, 2, 10, ADDRESS_MAP_NAME(program_10bit_8), 6, ADDRESS_MAP_NAME(data_64x4), "tms1990", __FILE__)
{ }
@@ -316,7 +324,7 @@ tms0980_cpu_device::tms0980_cpu_device(const machine_config &mconfig, device_typ
{ }
tms1980_cpu_device::tms1980_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
- : tms0980_cpu_device(mconfig, TMS1980, "TMS1980", tag, owner, clock, 7, 11, 7, 9, 4, 12, ADDRESS_MAP_NAME(program_11bit_9), 8, ADDRESS_MAP_NAME(data_64x9_as4), "tms1980", __FILE__)
+ : tms0980_cpu_device(mconfig, TMS1980, "TMS1980", tag, owner, clock, 7, 10, 7, 9, 4, 12, ADDRESS_MAP_NAME(program_11bit_9), 8, ADDRESS_MAP_NAME(data_64x9_as4), "tms1980", __FILE__)
{ }
@@ -359,6 +367,23 @@ machine_config_constructor tms1400_cpu_device::device_mconfig_additions() const
}
+static MACHINE_CONFIG_FRAGMENT(tms0950)
+
+ // microinstructions PLA, output PLA, segment PLA
+ MCFG_PLA_ADD("mpla", 8, 16, 30)
+ MCFG_PLA_FILEFORMAT(PLA_FMT_BERKELEY)
+ MCFG_PLA_ADD("opla", 4, 8, 10)
+ MCFG_PLA_FILEFORMAT(PLA_FMT_BERKELEY)
+ MCFG_PLA_ADD("spla", 3, 8, 8)
+ MCFG_PLA_FILEFORMAT(PLA_FMT_BERKELEY)
+MACHINE_CONFIG_END
+
+machine_config_constructor tms0950_cpu_device::device_mconfig_additions() const
+{
+ return MACHINE_CONFIG_NAME(tms0950);
+}
+
+
static MACHINE_CONFIG_FRAGMENT(tms0970)
// main opcodes PLA, microinstructions PLA, output PLA, segment PLA
@@ -402,7 +427,7 @@ static MACHINE_CONFIG_FRAGMENT(tms1980)
// main opcodes PLA, microinstructions PLA, output PLA
MCFG_PLA_ADD("ipla", 9, 22, 24)
MCFG_PLA_FILEFORMAT(PLA_FMT_BERKELEY)
- MCFG_PLA_ADD("mpla", 6, 21, 64)
+ MCFG_PLA_ADD("mpla", 6, 22, 64)
MCFG_PLA_FILEFORMAT(PLA_FMT_BERKELEY)
MCFG_PLA_ADD("opla", 5, 7, 32)
MCFG_PLA_FILEFORMAT(PLA_FMT_BERKELEY)
@@ -450,7 +475,7 @@ offs_t tms0980_cpu_device::disasm_disassemble(char *buffer, offs_t pc, const UIN
return CPU_DISASSEMBLE_NAME(tms0980)(this, buffer, pc, oprom, opram, options);
}
-void tms1xxx_cpu_device::state_string_export(const device_state_entry &entry, std::string &str)
+void tms1xxx_cpu_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
@@ -763,7 +788,7 @@ UINT32 tms0980_cpu_device::decode_micro(UINT8 sel)
mask ^= 0x43fc3; // invert active-negative
// M_RSTR is specific to TMS02x0/TMS1980, it redirects to F_RSTR
- // M_UNK1 is specific to TMS0270, unknown yet
+ // M_UNK1 is specific to TMS0270, unknown/unused yet and apparently not connected on every TMS0270
// _______ ______ _____ _____ _____ _____ ______ _____ ______ _____ _____
const UINT32 md[22] = { M_NDMTP, M_DMTP, M_AUTY, M_AUTA, M_CKM, M_SSE, M_CKP, M_YTP, M_MTP, M_ATN, M_NATN, M_MTN, M_15TN, M_CKN, M_NE, M_C8, M_SSS, M_CME, M_CIN, M_STO, M_RSTR, M_UNK1 };
@@ -908,7 +933,7 @@ void tms0270_cpu_device::dynamic_output()
if (m_chipsel)
{
- // ACC via SEG B,C,D,G: TMS5100 CTL pins
+ // ACC via SEG G,B,C,D: TMS5100 CTL pins
if (m_ctl_dir && m_a != m_ctl_out)
{
m_ctl_out = m_a;
@@ -956,7 +981,7 @@ UINT8 tms0980_cpu_device::read_k_input()
UINT8 tms0270_cpu_device::read_k_input()
{
- // external: TMS5100 CTL port via SEG B,C,D,G
+ // external: TMS5100 CTL port via SEG G,B,C,D
if (m_chipsel)
return (m_ctl_dir) ? m_ctl_out : m_read_ctl(0, 0xff) & 0xf;
@@ -1238,11 +1263,12 @@ void tms1xxx_cpu_device::op_tpc()
// TMS0970-specific (and possibly child classes)
+
void tms0970_cpu_device::op_setr()
{
// SETR: set output register
// DDIG line is a coincidence between the selected output pla row(s) and segment pla row(s)
- int ddig = (m_opla->read(m_a) & m_o) ? 0 : 1;
+ int ddig = (m_opla->read(m_a) & m_o) ? 1 : 0;
m_r = (m_r & ~(1 << m_y)) | (ddig << m_y);
}
diff --git a/src/devices/cpu/tms0980/tms0980.h b/src/devices/cpu/tms0980/tms0980.h
index fb8255be68e..2572eb1b1ef 100644
--- a/src/devices/cpu/tms0980/tms0980.h
+++ b/src/devices/cpu/tms0980/tms0980.h
@@ -137,7 +137,8 @@ protected:
virtual UINT32 disasm_min_opcode_bytes() const override { return 1; }
virtual UINT32 disasm_max_opcode_bytes() const override { return 1; }
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ // device_state_interface overrides
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
void next_pc();
@@ -373,6 +374,20 @@ protected:
virtual void op_tdo() override;
};
+class tms0950_cpu_device : public tms0970_cpu_device
+{
+public:
+ tms0950_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+protected:
+ // overrides
+ virtual void device_reset() override { tms1000_cpu_device::device_reset(); }
+ virtual machine_config_constructor device_mconfig_additions() const override;
+
+ virtual void op_rstr() override { ; } // assume it has no RSTR or CLO
+ virtual void op_clo() override { ; } // "
+};
+
class tms1990_cpu_device : public tms0970_cpu_device
{
public:
@@ -478,6 +493,7 @@ extern const device_type TMS1400;
extern const device_type TMS1470;
extern const device_type TMS1600;
extern const device_type TMS1670;
+extern const device_type TMS0950;
extern const device_type TMS0970;
extern const device_type TMS1990;
extern const device_type TMS0980;
diff --git a/src/devices/cpu/tms32010/tms32010.cpp b/src/devices/cpu/tms32010/tms32010.cpp
index e6264d3f1dd..3a164e8f984 100644
--- a/src/devices/cpu/tms32010/tms32010.cpp
+++ b/src/devices/cpu/tms32010/tms32010.cpp
@@ -895,7 +895,7 @@ void tms32010_device::device_reset()
}
-void tms32010_device::state_string_export(const device_state_entry &entry, std::string &str)
+void tms32010_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/tms32010/tms32010.h b/src/devices/cpu/tms32010/tms32010.h
index 2185e324346..a1c0692c566 100644
--- a/src/devices/cpu/tms32010/tms32010.h
+++ b/src/devices/cpu/tms32010/tms32010.h
@@ -72,7 +72,7 @@ protected:
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override { return (spacenum == AS_PROGRAM) ? &m_program_config : ( (spacenum == AS_IO) ? &m_io_config : ( (spacenum == AS_DATA) ? &m_data_config : nullptr ) ); }
// device_state_interface overrides
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 2; }
diff --git a/src/devices/cpu/tms32025/tms32025.cpp b/src/devices/cpu/tms32025/tms32025.cpp
index e9226c86165..2d40b2d3448 100644
--- a/src/devices/cpu/tms32025/tms32025.cpp
+++ b/src/devices/cpu/tms32025/tms32025.cpp
@@ -1801,7 +1801,7 @@ void tms32025_device::state_export(const device_state_entry &entry)
}
-void tms32025_device::state_string_export(const device_state_entry &entry, std::string &str)
+void tms32025_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
@@ -2187,7 +2187,7 @@ bool tms32025_device::memory_readop(offs_t offset, int size, UINT64 &value)
****************************************************************************/
bool tms32025_device::memory_read(address_spacenum spacenum, offs_t offset, int size, UINT64 &value)
{
- void *ptr = nullptr;
+ void *ptr;
UINT64 temp = 0;
switch (spacenum)
@@ -2239,7 +2239,7 @@ bool tms32025_device::memory_read(address_spacenum spacenum, offs_t offset, int
****************************************************************************/
bool tms32025_device::memory_write(address_spacenum spacenum, offs_t offset, int size, UINT64 value)
{
- void *ptr = nullptr;
+ void *ptr;
switch (spacenum)
{
diff --git a/src/devices/cpu/tms32025/tms32025.h b/src/devices/cpu/tms32025/tms32025.h
index 773ddb576f8..daac81c8314 100644
--- a/src/devices/cpu/tms32025/tms32025.h
+++ b/src/devices/cpu/tms32025/tms32025.h
@@ -97,7 +97,7 @@ protected:
// device_state_interface overrides
virtual void state_import(const device_state_entry &entry) override;
virtual void state_export(const device_state_entry &entry) override;
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 2; }
@@ -276,7 +276,6 @@ private:
void mpys();
void mpyu();
void neg();
- void nop();
void norm();
void or_();
void ork();
diff --git a/src/devices/cpu/tms32031/tms32031.cpp b/src/devices/cpu/tms32031/tms32031.cpp
index d391285f314..cfab62a7929 100644
--- a/src/devices/cpu/tms32031/tms32031.cpp
+++ b/src/devices/cpu/tms32031/tms32031.cpp
@@ -529,7 +529,7 @@ void tms3203x_device::state_export(const device_state_entry &entry)
// for the debugger
//-------------------------------------------------
-void tms3203x_device::state_string_export(const device_state_entry &entry, std::string &str)
+void tms3203x_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/tms32031/tms32031.h b/src/devices/cpu/tms32031/tms32031.h
index 0dbc85fdf96..4ce0decf010 100644
--- a/src/devices/cpu/tms32031/tms32031.h
+++ b/src/devices/cpu/tms32031/tms32031.h
@@ -179,7 +179,7 @@ protected:
// device_state_interface overrides
virtual void state_import(const device_state_entry &entry) override;
virtual void state_export(const device_state_entry &entry) override;
- virtual void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override;
@@ -199,7 +199,6 @@ protected:
bool condition(int which);
// floating point helpers
- void double_to_dsp_with_flags(double val, tmsreg &result);
void int2float(tmsreg &srcdst);
void float2int(tmsreg &srcdst, bool setflags);
void negf(tmsreg &dst, tmsreg &src);
diff --git a/src/devices/cpu/tms32051/32051ops.inc b/src/devices/cpu/tms32051/32051ops.inc
index c52cf4a1d5d..83e769416a1 100644
--- a/src/devices/cpu/tms32051/32051ops.inc
+++ b/src/devices/cpu/tms32051/32051ops.inc
@@ -15,12 +15,20 @@ UINT16 tms32051_device::POP_STACK()
return pc;
}
-INT32 tms32051_device::SUB(UINT32 a, UINT32 b)
+INT32 tms32051_device::SUB(UINT32 a, UINT32 b, bool shift16)
{
UINT32 res = a - b;
- // C is cleared if borrow was generated
- m_st1.c = (b > a) ? 0 : 1;
+ if (shift16)
+ {
+ // C is cleared if borrow was generated, otherwise unaffected
+ if (a < res) m_st1.c = 0;
+ }
+ else
+ {
+ // C is cleared if borrow was generated
+ m_st1.c = (a < res) ? 0 : 1;
+ }
// check overflow
if ((a ^ b) & (a ^ res) & 0x80000000)
@@ -37,12 +45,20 @@ INT32 tms32051_device::SUB(UINT32 a, UINT32 b)
return (INT32)(res);
}
-INT32 tms32051_device::ADD(UINT32 a, UINT32 b)
+INT32 tms32051_device::ADD(UINT32 a, UINT32 b, bool shift16)
{
UINT32 res = a + b;
- // C is set if carry was generated
- m_st1.c = (a > res) ? 1 : 0;
+ if (shift16)
+ {
+ // C is set if carry was generated, otherwise unaffected
+ if (a > res) m_st1.c = 1;
+ }
+ else
+ {
+ // C is set if carry was generated
+ m_st1.c = (a > res) ? 1 : 0;
+ }
// check overflow
if ((a ^ res) & (b ^ res) & 0x80000000)
@@ -180,67 +196,63 @@ UINT16 tms32051_device::GET_ADDRESS()
}
}
-int tms32051_device::GET_ZLVC_CONDITION(int zlvc, int zlvc_mask)
+bool tms32051_device::GET_ZLVC_CONDITION(int zlvc, int zlvc_mask)
{
- if (zlvc_mask & 0x2) // OV-bit
+ if (zlvc_mask & 0x2) // OV-bit
{
- if ((zlvc & 0x2) && m_st0.ov) // OV
- {
- // clear OV
- m_st0.ov = 0;
-
- return 1;
- }
- else if ((zlvc & 0x2) == 0 && m_st0.ov == 0) // NOV
- return 1;
+ if ((zlvc & 0x2) && m_st0.ov == 0) // OV
+ return false;
+ if (((zlvc & 0x2) == 0) && m_st0.ov != 0) // NOV
+ return false;
}
- if (zlvc_mask & 0x1) // C-bit
+ if (zlvc_mask & 0x1) // C-bit
{
- if ((zlvc & 0x1) && m_st1.c) // C
- return 1;
- else if ((zlvc & 0x1) == 0 && m_st1.c == 0) // NC
- return 1;
+ if ((zlvc & 0x1) && m_st1.c == 0) // C
+ return false;
+ if (((zlvc & 0x1) == 0) && m_st1.c != 0) // NC
+ return false;
}
- if (zlvc_mask & 0x8) // Z-bit
- {
- if ((zlvc & 0x8) && (INT32)(m_acc) == 0) // EQ
- return 1;
- else if ((zlvc & 0x8) == 0 && (INT32)(m_acc) != 0) // NEQ
- return 1;
- }
- if (zlvc_mask & 0x4) // L-bit
+
+ switch ((zlvc_mask & 0xc) | ((zlvc >> 2) & 0x3))
{
- if ((zlvc & 0x4) && (INT32)(m_acc) < 0) // LT
- return 1;
- else if ((zlvc & 0x4) == 0 && (INT32)(m_acc) > 0) // GT
- return 1;
+ case 0x00: break; // MZ=0, ML=0, Z=0, L=0
+ case 0x01: break; // MZ=0, ML=0, Z=0, L=1
+ case 0x02: break; // MZ=0, ML=0, Z=1, L=0
+ case 0x03: break; // MZ=0, ML=0, Z=1, L=1
+ case 0x04: if ((INT32)(m_acc) <= 0) return false; break; // MZ=0, ML=1, Z=0, L=0 (GT)
+ case 0x05: if ((INT32)(m_acc) >= 0) return false; break; // MZ=0, ML=1, Z=0, L=1 (LT)
+ case 0x06: if ((INT32)(m_acc) <= 0) return false; break; // MZ=0, ML=1, Z=1, L=0 (GT)
+ case 0x07: if ((INT32)(m_acc) >= 0) return false; break; // MZ=0, ML=1, Z=1, L=1 (LT)
+ case 0x08: if ((INT32)(m_acc) == 0) return false; break; // MZ=1, ML=0, Z=0, L=0 (NEQ)
+ case 0x09: if ((INT32)(m_acc) == 0) return false; break; // MZ=1, ML=0, Z=0, L=1 (NEQ)
+ case 0x0a: if ((INT32)(m_acc) != 0) return false; break; // MZ=1, ML=0, Z=1, L=0 (EQ)
+ case 0x0b: if ((INT32)(m_acc) != 0) return false; break; // MZ=1, ML=0, Z=1, L=1 (EQ)
+ case 0x0c: if ((INT32)(m_acc) <= 0) return false; break; // MZ=1, ML=1, Z=0, L=0 (GT)
+ case 0x0d: if ((INT32)(m_acc) >= 0) return false; break; // MZ=1, ML=1, Z=0, L=1 (LT)
+ case 0x0e: if ((INT32)(m_acc) < 0) return false; break; // MZ=1, ML=1, Z=1, L=0 (GEQ)
+ case 0x0f: if ((INT32)(m_acc) > 0) return false; break; // MZ=1, ML=1, Z=1, L=1 (LEQ)
}
- return 0;
+ return true;
}
-int tms32051_device::GET_TP_CONDITION(int tp)
+bool tms32051_device::GET_TP_CONDITION(int tp)
{
switch (tp)
{
case 0: // BIO pin low
- {
// TODO
- return 0;
- }
- case 1: // TC = 1
- {
- return m_st1.tc;
- }
- case 2: // TC = 0
- {
- return m_st1.tc ^ 1;
- }
- case 3: // always false
- {
- return 0;
- }
+ return false;
+
+ case 1: // TC == 1
+ return m_st1.tc != 0;
+
+ case 2: // TC == 0
+ return m_st1.tc == 0;
+
+ case 3:
+ return true;
}
- return 0;
+ return true;
}
INT32 tms32051_device::PREG_PSCALER(INT32 preg)
@@ -302,7 +314,7 @@ void tms32051_device::op_add_mem()
d = (UINT32)(UINT16)(data) << shift;
}
- m_acc = ADD(m_acc, d);
+ m_acc = ADD(m_acc, d, false);
CYCLES(1);
}
@@ -311,7 +323,7 @@ void tms32051_device::op_add_simm()
{
UINT16 imm = m_op & 0xff;
- m_acc = ADD(m_acc, imm);
+ m_acc = ADD(m_acc, imm, false);
CYCLES(1);
}
@@ -331,7 +343,7 @@ void tms32051_device::op_add_limm()
d = (UINT32)(UINT16)(imm) << shift;
}
- m_acc = ADD(m_acc, d);
+ m_acc = ADD(m_acc, d, false);
CYCLES(2);
}
@@ -341,14 +353,14 @@ void tms32051_device::op_add_s16_mem()
UINT16 ea = GET_ADDRESS();
UINT32 data = DM_READ16(ea) << 16;
- m_acc = ADD(m_acc, data);
+ m_acc = ADD(m_acc, data, true);
CYCLES(1);
}
void tms32051_device::op_addb()
{
- m_acc = ADD(m_acc, m_accb);
+ m_acc = ADD(m_acc, m_accb, false);
CYCLES(1);
}
@@ -370,7 +382,12 @@ void tms32051_device::op_addt()
void tms32051_device::op_and_mem()
{
- fatalerror("32051: unimplemented op and mem at %08X\n", m_pc-1);
+ UINT16 ea = GET_ADDRESS();
+ UINT16 data = DM_READ16(ea);
+
+ m_acc &= (UINT32)(data);
+
+ CYCLES(1);
}
void tms32051_device::op_and_limm()
@@ -658,12 +675,27 @@ void tms32051_device::op_sath()
void tms32051_device::op_satl()
{
- fatalerror("32051: unimplemented op satl at %08X\n", m_pc-1);
+ int count = m_treg1 & 0xf;
+ if (m_st1.sxm)
+ {
+ m_acc = (INT32)(m_acc) >> count;
+ }
+ else
+ {
+ m_acc = (UINT32)(m_acc) >> count;
+ }
+
+ CYCLES(1);
}
void tms32051_device::op_sbb()
{
- m_acc = SUB(m_acc, m_accb);
+ UINT32 res = m_acc - m_accb;
+
+ // C is cleared if borrow was generated
+ m_st1.c = ((UINT32)(m_acc) < res) ? 0 : 1;
+
+ m_acc = res;
CYCLES(1);
}
@@ -730,7 +762,7 @@ void tms32051_device::op_sub_mem()
d = (UINT32)(UINT16)(data) << shift;
}
- m_acc = SUB(m_acc, d);
+ m_acc = SUB(m_acc, d, false);
CYCLES(1);
}
@@ -744,7 +776,7 @@ void tms32051_device::op_sub_simm()
{
UINT16 imm = m_op & 0xff;
- m_acc = SUB(m_acc, imm);
+ m_acc = SUB(m_acc, imm, false);
CYCLES(1);
}
@@ -764,7 +796,7 @@ void tms32051_device::op_sub_limm()
d = (UINT32)(UINT16)(imm) << shift;
}
- m_acc = SUB(m_acc, d);
+ m_acc = SUB(m_acc, d, false);
CYCLES(2);
}
@@ -1006,10 +1038,14 @@ void tms32051_device::op_bcnd()
{
UINT16 pma = ROPCODE();
- if (GET_ZLVC_CONDITION((m_op >> 4) & 0xf, m_op & 0xf) || GET_TP_CONDITION((m_op >> 8) & 0x3))
+ if (GET_ZLVC_CONDITION((m_op >> 4) & 0xf, m_op & 0xf) && GET_TP_CONDITION((m_op >> 8) & 0x3))
{
CHANGE_PC(pma);
CYCLES(4);
+
+ // clear overflow
+ if (m_op & 0x2)
+ m_st0.ov = 0;
}
else
{
@@ -1021,8 +1057,12 @@ void tms32051_device::op_bcndd()
{
UINT16 pma = ROPCODE();
- if (GET_ZLVC_CONDITION((m_op >> 4) & 0xf, m_op & 0xf) || GET_TP_CONDITION((m_op >> 8) & 0x3))
+ if (GET_ZLVC_CONDITION((m_op >> 4) & 0xf, m_op & 0xf) && GET_TP_CONDITION((m_op >> 8) & 0x3))
{
+ // clear overflow
+ if (m_op & 0x2)
+ m_st0.ov = 0;
+
delay_slot(m_pc);
CHANGE_PC(pma);
CYCLES(4);
@@ -1088,17 +1128,37 @@ void tms32051_device::op_calld()
void tms32051_device::op_cc()
{
- fatalerror("32051: unimplemented op cc at %08X\n", m_pc-1);
+ UINT16 pma = ROPCODE();
+
+ if (GET_ZLVC_CONDITION((m_op >> 4) & 0xf, m_op & 0xf) && GET_TP_CONDITION((m_op >> 8) & 0x3))
+ {
+ PUSH_STACK(m_pc);
+
+ CHANGE_PC(pma);
+ CYCLES(4);
+
+ // clear overflow
+ if (m_op & 0x2)
+ m_st0.ov = 0;
+ }
+ else
+ {
+ CYCLES(2);
+ }
}
void tms32051_device::op_ccd()
{
UINT16 pma = ROPCODE();
- if (GET_ZLVC_CONDITION((m_op >> 4) & 0xf, m_op & 0xf) || GET_TP_CONDITION((m_op >> 8) & 0x3))
+ if (GET_ZLVC_CONDITION((m_op >> 4) & 0xf, m_op & 0xf) && GET_TP_CONDITION((m_op >> 8) & 0x3))
{
PUSH_STACK(m_pc+2);
+ // clear overflow
+ if (m_op & 0x2)
+ m_st0.ov = 0;
+
delay_slot(m_pc);
CHANGE_PC(pma);
}
@@ -1118,7 +1178,7 @@ void tms32051_device::op_nmi()
void tms32051_device::op_retc()
{
- if ((m_op & 0x3ff) == 0x300 || GET_ZLVC_CONDITION((m_op >> 4) & 0xf, m_op & 0xf) || GET_TP_CONDITION((m_op >> 8) & 0x3))
+ if (GET_ZLVC_CONDITION((m_op >> 4) & 0xf, m_op & 0xf) && GET_TP_CONDITION((m_op >> 8) & 0x3))
{
UINT16 pc = POP_STACK();
CHANGE_PC(pc);
@@ -1132,7 +1192,7 @@ void tms32051_device::op_retc()
void tms32051_device::op_retcd()
{
- if ((m_op & 0x3ff) == 0x300 || GET_ZLVC_CONDITION((m_op >> 4) & 0xf, m_op & 0xf) || GET_TP_CONDITION((m_op >> 8) & 0x3))
+ if (GET_ZLVC_CONDITION((m_op >> 4) & 0xf, m_op & 0xf) && GET_TP_CONDITION((m_op >> 8) & 0x3))
{
UINT16 pc = POP_STACK();
delay_slot(m_pc);
@@ -1169,7 +1229,7 @@ void tms32051_device::op_trap()
void tms32051_device::op_xc()
{
- if (GET_ZLVC_CONDITION((m_op >> 4) & 0xf, m_op & 0xf) || GET_TP_CONDITION((m_op >> 8) & 0x3))
+ if (GET_ZLVC_CONDITION((m_op >> 4) & 0xf, m_op & 0xf) && GET_TP_CONDITION((m_op >> 8) & 0x3))
{
CYCLES(1);
}
@@ -1314,7 +1374,14 @@ void tms32051_device::op_lmmr()
void tms32051_device::op_out()
{
- fatalerror("32051: unimplemented op out at %08X\n", m_pc-1);
+ UINT16 port = ROPCODE();
+ UINT16 ea = GET_ADDRESS();
+
+ UINT16 data = DM_READ16(ea);
+ m_io->write_word(port << 1, data);
+
+ // TODO: handle repeat
+ CYCLES(3);
}
void tms32051_device::op_smmr()
@@ -1371,7 +1438,11 @@ void tms32051_device::op_apl_dbmr()
{
UINT16 ea = GET_ADDRESS();
UINT16 data = DM_READ16(ea);
+
data &= m_dbmr;
+
+ m_st1.tc = (data == 0) ? 1 : 0;
+
DM_WRITE16(ea, data);
CYCLES(1);
}
@@ -1381,7 +1452,11 @@ void tms32051_device::op_apl_imm()
UINT16 ea = GET_ADDRESS();
UINT16 imm = ROPCODE();
UINT16 data = DM_READ16(ea);
+
data &= imm;
+
+ m_st1.tc = (data == 0) ? 1 : 0;
+
DM_WRITE16(ea, data);
CYCLES(1);
}
@@ -1407,6 +1482,9 @@ void tms32051_device::op_opl_dbmr()
UINT16 ea = GET_ADDRESS();
UINT16 data = DM_READ16(ea);
data |= m_dbmr;
+
+ m_st1.tc = (data == 0) ? 1 : 0;
+
DM_WRITE16(ea, data);
CYCLES(1);
}
@@ -1417,6 +1495,9 @@ void tms32051_device::op_opl_imm()
UINT16 imm = ROPCODE();
UINT16 data = DM_READ16(ea);
data |= imm;
+
+ m_st1.tc = (data == 0) ? 1 : 0;
+
DM_WRITE16(ea, data);
CYCLES(1);
}
@@ -1444,7 +1525,7 @@ void tms32051_device::op_xpl_imm()
void tms32051_device::op_apac()
{
INT32 spreg = PREG_PSCALER(m_preg);
- m_acc = ADD(m_acc, spreg);
+ m_acc = ADD(m_acc, spreg, false);
CYCLES(1);
}
@@ -1477,7 +1558,7 @@ void tms32051_device::op_lta()
m_treg0 = data;
spreg = PREG_PSCALER(m_preg);
- m_acc = ADD(m_acc, spreg);
+ m_acc = ADD(m_acc, spreg, false);
if (m_pmst.trm == 0)
{
m_treg1 = data;
@@ -1578,7 +1659,11 @@ void tms32051_device::op_sph()
void tms32051_device::op_spl()
{
- fatalerror("32051: unimplemented op spl at %08X\n", m_pc-1);
+ UINT16 ea = GET_ADDRESS();
+ UINT16 spreg = (UINT16)(PREG_PSCALER(m_preg));
+ DM_WRITE16(ea, spreg);
+
+ CYCLES(1);
}
void tms32051_device::op_spm()
@@ -1670,7 +1755,9 @@ void tms32051_device::op_clrc_intm()
void tms32051_device::op_clrc_xf()
{
- fatalerror("32051: unimplemented op clrc xf at %08X\n", m_pc-1);
+ m_st1.xf = 0;
+
+ CYCLES(1);
}
void tms32051_device::op_idle()
@@ -1780,7 +1867,9 @@ void tms32051_device::op_setc_hold()
void tms32051_device::op_setc_tc()
{
- fatalerror("32051: unimplemented op setc tc at %08X\n", m_pc-1);
+ m_st1.tc = 1;
+
+ CYCLES(1);
}
void tms32051_device::op_setc_carry()
@@ -1790,7 +1879,9 @@ void tms32051_device::op_setc_carry()
void tms32051_device::op_setc_xf()
{
- fatalerror("32051: unimplemented op setc xf at %08X\n", m_pc-1);
+ m_st1.xf = 1;
+
+ CYCLES(1);
}
void tms32051_device::op_setc_cnf()
diff --git a/src/devices/cpu/tms32051/dis32051.cpp b/src/devices/cpu/tms32051/dis32051.cpp
index 6f3c4ea2156..ad4f2be1d04 100644
--- a/src/devices/cpu/tms32051/dis32051.cpp
+++ b/src/devices/cpu/tms32051/dis32051.cpp
@@ -27,22 +27,22 @@ static const char *const zl_condition_codes[] =
static const char *const cv_condition_codes[16] =
{
- "", // C=0, V=0, CM=0, VM=0
- "nov", // C=0, V=0, CM=0, VM=1
- "nc", // C=0, V=0, CM=1, VM=0
- "nc nov", // C=0, V=0, CM=1, VM=1
- "", // C=0, V=1, CM=0, VM=0
- "ov", // C=0, V=1, CM=0, VM=1
- "nc", // C=0, V=1, CM=1, VM=0
- "nc ov", // C=0, V=1, CM=1, VM=1
- "", // C=1, V=0, CM=0, VM=0
- "nov", // C=1, V=0, CM=0, VM=1
- "c", // C=1, V=0, CM=1, VM=0
- "c nov", // C=1, V=0, CM=1, VM=1
- "", // C=1, V=1, CM=0, VM=0
- "ov", // C=1, V=1, CM=0, VM=1
- "c", // C=1, V=1, CM=1, VM=0
- "c ov", // C=1, V=1, CM=1, VM=1
+ "", // V=0, C=0, VM=0, CM=0
+ "nc", // V=0, C=0, VM=0, CM=1
+ "nov", // V=0, C=0, VM=1, CM=0
+ "nc nov", // V=0, C=0, VM=1, CM=1
+ "", // V=0, C=1, VM=0, CM=0
+ "c", // V=0, C=1, VM=0, CM=1
+ "nov", // V=0, C=1, VM=1, CM=0
+ "c nov", // V=0, C=1, VM=1, CM=1
+ "", // V=1, C=0, VM=0, CM=0
+ "nc", // V=1, C=0, VM=0, CM=1
+ "ov", // V=1, C=0, VM=1, CM=0
+ "nc ov", // V=1, C=0, VM=1, CM=1
+ "", // V=1, C=1, VM=0, CM=0
+ "c", // V=1, C=1, VM=0, CM=1
+ "ov", // V=1, C=1, VM=1, CM=0
+ "c ov", // V=1, C=1, VM=1, CM=1
};
static const char *const tp_condition_codes[4] =
@@ -128,6 +128,30 @@ static char *GET_SHIFT(int shift)
return buffer;
}
+static void print_condition_codes(bool pp, int zl, int cv, int tp)
+{
+ if (*(zl_condition_codes[zl]) != 0)
+ {
+ if (pp)
+ print(", ");
+ print("%s", zl_condition_codes[zl]);
+ pp = true;
+ }
+ if (*(cv_condition_codes[cv]) != 0)
+ {
+ if (pp)
+ print(", ");
+ print("%s", cv_condition_codes[cv]);
+ pp = true;
+ }
+ if (*(tp_condition_codes[tp]) != 0)
+ {
+ if (pp)
+ print(", ");
+ print("%s", tp_condition_codes[tp]);
+ }
+}
+
static void dasm_group_be(UINT16 opcode)
{
int subop = opcode & 0xff;
@@ -207,8 +231,8 @@ static void dasm_group_be(UINT16 opcode)
case 0x82: print("or #%04X", FETCH() << 16); break;
case 0x83: print("xor #%04X", FETCH() << 16); break;
case 0xc4: print("rpt #%04X", FETCH()); break;
- case 0xc5: print("rpt #%04X", FETCH()); break;
- case 0xc6: print("rpt #%04X", FETCH()); break;
+ case 0xc5: print("rptz #%04X", FETCH()); break;
+ case 0xc6: print("rptb #%04X", FETCH()); break;
default: print("??? (group be)"); break;
}
@@ -285,7 +309,7 @@ CPU_DISASSEMBLE( tms32051 )
break;
}
case 0x08: print("lamm %s", GET_ADDRESS(addr_mode, address)); break;
- case 0x09: print("smmr %s", GET_ADDRESS(addr_mode, address)); break;
+ case 0x09: print("smmr %s, #%04X", GET_ADDRESS(addr_mode, address), FETCH()); break;
case 0x0a: print("subc %s", GET_ADDRESS(addr_mode, address)); break;
case 0x0b: print("rpt %s", GET_ADDRESS(addr_mode, address)); break;
case 0x0c: print("out %s, #%04X", GET_ADDRESS(addr_mode, address), FETCH()); break;
@@ -463,19 +487,7 @@ CPU_DISASSEMBLE( tms32051 )
int tp = (opcode >> 8) & 0x3;
print("bcnd %04X", FETCH());
-
- if (*(zl_condition_codes[zl]) != 0)
- {
- print(", %s", zl_condition_codes[zl]);
- }
- if (*(cv_condition_codes[cv]) != 0)
- {
- print(", %s", cv_condition_codes[cv]);
- }
- if (*(tp_condition_codes[tp]) != 0)
- {
- print(", %s", tp_condition_codes[tp]);
- }
+ print_condition_codes(true, zl, cv, tp);
break;
}
@@ -490,19 +502,7 @@ CPU_DISASSEMBLE( tms32051 )
int n = ((opcode >> 12) & 0x1) + 1;
print("xc %d", n);
-
- if (*(zl_condition_codes[zl]) != 0)
- {
- print(", %s", zl_condition_codes[zl]);
- }
- if (*(cv_condition_codes[cv]) != 0)
- {
- print(", %s", cv_condition_codes[cv]);
- }
- if (*(tp_condition_codes[tp]) != 0)
- {
- print(", %s", tp_condition_codes[tp]);
- }
+ print_condition_codes(true, zl, cv, tp);
break;
}
@@ -515,23 +515,11 @@ CPU_DISASSEMBLE( tms32051 )
int tp = (opcode >> 8) & 0x3;
print("cc %04X", FETCH());
-
- if (*(zl_condition_codes[zl]) != 0)
- {
- print(", %s", zl_condition_codes[zl]);
- }
- if (*(cv_condition_codes[cv]) != 0)
- {
- print(", %s", cv_condition_codes[cv]);
- }
- if (*(tp_condition_codes[tp]) != 0)
- {
- print(", %s", tp_condition_codes[tp]);
- }
+ print_condition_codes(true, zl, cv, tp);
break;
}
- case 0xec: case 0xed: case 0xee:
+ case 0xec: case 0xed: case 0xee: case 0xef:
{
int zlcvmask = opcode & 0xf;
int zlcv = (opcode >> 4) & 0xf;
@@ -539,26 +527,19 @@ CPU_DISASSEMBLE( tms32051 )
int cv = ((zlcv << 2) & 0xc) | (zlcvmask & 0x3);
int tp = (opcode >> 8) & 0x3;
- print("retc ");
-
- if (*(zl_condition_codes[zl]) != 0)
+ if (opcode == 0xef00)
{
- print(", %s", zl_condition_codes[zl]);
+ print("ret");
}
- if (*(cv_condition_codes[cv]) != 0)
- {
- print(", %s", cv_condition_codes[cv]);
- }
- if (*(tp_condition_codes[tp]) != 0)
+ else
{
- print(", %s", tp_condition_codes[tp]);
+ print("retc ");
+ print_condition_codes(false, zl, cv, tp);
}
flags = DASMFLAG_STEP_OUT;
break;
}
- case 0xef: print("ret"); flags = DASMFLAG_STEP_OUT; break;
-
case 0xf0: case 0xf1: case 0xf2: case 0xf3:
{
int zlcvmask = opcode & 0xf;
@@ -568,19 +549,7 @@ CPU_DISASSEMBLE( tms32051 )
int tp = (opcode >> 8) & 0x3;
print("bcndd %04X", FETCH());
-
- if (*(zl_condition_codes[zl]) != 0)
- {
- print(", %s", zl_condition_codes[zl]);
- }
- if (*(cv_condition_codes[cv]) != 0)
- {
- print(", %s", cv_condition_codes[cv]);
- }
- if (*(tp_condition_codes[tp]) != 0)
- {
- print(", %s", tp_condition_codes[tp]);
- }
+ print_condition_codes(true, zl, cv, tp);
break;
}
@@ -593,23 +562,11 @@ CPU_DISASSEMBLE( tms32051 )
int tp = (opcode >> 8) & 0x3;
print("ccd %04X", FETCH());
-
- if (*(zl_condition_codes[zl]) != 0)
- {
- print(", %s", zl_condition_codes[zl]);
- }
- if (*(cv_condition_codes[cv]) != 0)
- {
- print(", %s", cv_condition_codes[cv]);
- }
- if (*(tp_condition_codes[tp]) != 0)
- {
- print(", %s", tp_condition_codes[tp]);
- }
+ print_condition_codes(true, zl, cv, tp);
break;
}
- case 0xfc: case 0xfd: case 0xfe:
+ case 0xfc: case 0xfd: case 0xfe: case 0xff:
{
int zlcvmask = opcode & 0xf;
int zlcv = (opcode >> 4) & 0xf;
@@ -617,26 +574,19 @@ CPU_DISASSEMBLE( tms32051 )
int cv = ((zlcv << 2) & 0xc) | (zlcvmask & 0x3);
int tp = (opcode >> 8) & 0x3;
- print("retcd ");
-
- if (*(zl_condition_codes[zl]) != 0)
- {
- print(", %s", zl_condition_codes[zl]);
- }
- if (*(cv_condition_codes[cv]) != 0)
+ if (opcode == 0xff00)
{
- print(", %s", cv_condition_codes[cv]);
+ print("retd");
}
- if (*(tp_condition_codes[tp]) != 0)
+ else
{
- print(", %s", tp_condition_codes[tp]);
+ print("retcd ");
+ print_condition_codes(false, zl, cv, tp);
}
flags = DASMFLAG_STEP_OUT;
break;
}
- case 0xff: print("retd"); flags = DASMFLAG_STEP_OUT; break;
-
default: print("??? ($%04X)", opcode); break;
}
diff --git a/src/devices/cpu/tms32051/tms32051.cpp b/src/devices/cpu/tms32051/tms32051.cpp
index 881a28fe4e1..5d35b7c025a 100644
--- a/src/devices/cpu/tms32051/tms32051.cpp
+++ b/src/devices/cpu/tms32051/tms32051.cpp
@@ -38,10 +38,9 @@ enum
TMS32051_AR7,
TMS32051_IFR,
TMS32051_IMR,
- TMS32051_ST0_ARP,
TMS32051_ST0_INTM,
- TMS32051_ST0_DP,
TMS32051_ST1_ARB,
+ TMS32051_ST1_TC,
TMS32051_TIM,
TMS32051_PSC
};
@@ -74,6 +73,7 @@ tms32051_device::tms32051_device(const machine_config &mconfig, const char *tag,
: cpu_device(mconfig, TMS32051, "TMS32051", tag, owner, clock, "tms32051", __FILE__)
, m_program_config("program", ENDIANNESS_LITTLE, 16, 16, -1, ADDRESS_MAP_NAME(tms32051_internal_pgm))
, m_data_config("data", ENDIANNESS_LITTLE, 16, 16, -1, ADDRESS_MAP_NAME(tms32051_internal_data))
+ , m_io_config("io", ENDIANNESS_LITTLE, 16, 16, -1)
{
}
@@ -81,6 +81,7 @@ tms32051_device::tms32051_device(const machine_config &mconfig, device_type type
: cpu_device(mconfig, type, name, tag, owner, clock, shortname, source)
, m_program_config("program", ENDIANNESS_LITTLE, 16, 16, -1)
, m_data_config("data", ENDIANNESS_LITTLE, 16, 16, -1)
+ , m_io_config("io", ENDIANNESS_LITTLE, 16, 16, -1)
{
}
@@ -179,6 +180,7 @@ void tms32051_device::device_start()
m_program = &space(AS_PROGRAM);
m_direct = &m_program->direct();
m_data = &space(AS_DATA);
+ m_io = &space(AS_IO);
m_pcstack_ptr = 0;
m_op = 0;
@@ -235,10 +237,9 @@ void tms32051_device::device_start()
state_add( TMS32051_IFR, "IFR", m_ifr).formatstr("%04X");
state_add( TMS32051_IMR, "IMR", m_imr).formatstr("%04X");
- state_add( TMS32051_ST0_ARP, "ST0 ARP", m_st0.arp).formatstr("%1d");
- state_add( TMS32051_ST0_INTM, "ST0 INTM", m_st0.intm).formatstr("%1d");
- state_add( TMS32051_ST0_DP, "ST0 DP", m_st0.dp).formatstr("%04X");
- state_add( TMS32051_ST1_ARB, "ST1 ARB", m_st1.arb).formatstr("%04X");
+ state_add( TMS32051_ST0_INTM, "ST0_INTM", m_st0.intm).formatstr("%1d");
+ state_add( TMS32051_ST1_ARB, "ST1_ARB", m_st1.arb).formatstr("%04X");
+ state_add( TMS32051_ST1_TC, "ST1_TC", m_st1.tc).formatstr("%1d");
state_add( TMS32051_TIM, "TIM", m_timer.tim).formatstr("%04X");
state_add( TMS32051_PSC, "PSC", m_timer.psc).formatstr("%04X");
@@ -384,7 +385,7 @@ void tms32051_device::execute_run()
{
CHANGE_PC(m_pasr);
}
-
+
m_brcr--;
if (m_brcr <= 0)
{
@@ -489,6 +490,27 @@ READ16_MEMBER( tms32051_device::cpuregs_r )
case 0x28: // PDWSR
return 0;
+ case 0x37: // ABU BKR
+ return 0;
+
+ case 0x50: // Memory-mapped I/O ports
+ case 0x51:
+ case 0x52:
+ case 0x53:
+ case 0x54:
+ case 0x55:
+ case 0x56:
+ case 0x57:
+ case 0x58:
+ case 0x59:
+ case 0x5a:
+ case 0x5b:
+ case 0x5c:
+ case 0x5d:
+ case 0x5e:
+ case 0x5f:
+ return m_io->read_word(offset << 1);
+
default:
if (!space.debugger_access())
fatalerror("32051: cpuregs_r: unimplemented memory-mapped register %02X at %04X\n", offset, m_pc-1);
@@ -533,6 +555,7 @@ WRITE16_MEMBER( tms32051_device::cpuregs_w )
}
case 0x09: m_brcr = data; break;
+ case 0x0d: m_treg1 = data; break;
case 0x0e: m_treg2 = data; break;
case 0x0f: m_dbmr = data; break;
case 0x10: m_ar[0] = data; break;
@@ -581,6 +604,25 @@ WRITE16_MEMBER( tms32051_device::cpuregs_w )
case 0x2a: // CWSR
break;
+ case 0x50: // Memory-mapped I/O ports
+ case 0x51:
+ case 0x52:
+ case 0x53:
+ case 0x54:
+ case 0x55:
+ case 0x56:
+ case 0x57:
+ case 0x58:
+ case 0x59:
+ case 0x5a:
+ case 0x5b:
+ case 0x5c:
+ case 0x5d:
+ case 0x5e:
+ case 0x5f:
+ m_io->write_word(offset << 1, data);
+ break;
+
default:
if (!space.debugger_access())
fatalerror("32051: cpuregs_w: unimplemented memory-mapped register %02X, data %04X at %04X\n", offset, data, m_pc-1);
@@ -599,6 +641,10 @@ bool tms32051_device::memory_read(address_spacenum spacenum, offs_t offset, int
{
value = (DM_READ16(offset>>1));
}
+ else if (spacenum == AS_IO)
+ {
+ value = m_io->read_word(offset);
+ }
return 1;
}
@@ -636,4 +682,4 @@ void tms32053_device::device_config_complete()
{
m_program_config = address_space_config("program", ENDIANNESS_LITTLE, 16, 16, -1, ADDRESS_MAP_NAME(tms32053_internal_pgm));
m_data_config = address_space_config("data", ENDIANNESS_LITTLE, 16, 16, -1, ADDRESS_MAP_NAME(tms32053_internal_data));
-} \ No newline at end of file
+}
diff --git a/src/devices/cpu/tms32051/tms32051.h b/src/devices/cpu/tms32051/tms32051.h
index cbae57ef6a0..ee83ed3c2ae 100644
--- a/src/devices/cpu/tms32051/tms32051.h
+++ b/src/devices/cpu/tms32051/tms32051.h
@@ -76,7 +76,7 @@ protected:
virtual void execute_set_input(int inputnum, int state) override;
// device_memory_interface overrides
- virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override { return (spacenum == AS_PROGRAM) ? &m_program_config : ( (spacenum == AS_DATA) ? &m_data_config : nullptr ); }
+ virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override { return (spacenum == AS_PROGRAM) ? &m_program_config : ( (spacenum == AS_IO) ? &m_io_config : ( (spacenum == AS_DATA) ? &m_data_config : nullptr ) ); }
virtual bool memory_read(address_spacenum spacenum, offs_t offset, int size, UINT64 &value) override;
// device_disasm_interface overrides
@@ -86,6 +86,7 @@ protected:
address_space_config m_program_config;
address_space_config m_data_config;
+ address_space_config m_io_config;
typedef void ( tms32051_device::*opcode_func )();
static const opcode_func s_opcode_table[256];
@@ -162,6 +163,7 @@ protected:
address_space *m_program;
direct_read_data *m_direct;
address_space *m_data;
+ address_space *m_io;
int m_icount;
bool m_idle;
@@ -173,13 +175,13 @@ protected:
inline void DM_WRITE16(UINT16 address, UINT16 data);
inline void PUSH_STACK(UINT16 pc);
inline UINT16 POP_STACK();
- inline INT32 SUB(UINT32 a, UINT32 b);
- inline INT32 ADD(UINT32 a, UINT32 b);
+ inline INT32 SUB(UINT32 a, UINT32 b, bool shift16);
+ inline INT32 ADD(UINT32 a, UINT32 b, bool shift16);
inline void UPDATE_AR(int ar, int step);
inline void UPDATE_ARP(int nar);
UINT16 GET_ADDRESS();
- inline int GET_ZLVC_CONDITION(int zlvc, int zlvc_mask);
- inline int GET_TP_CONDITION(int tp);
+ inline bool GET_ZLVC_CONDITION(int zlvc, int zlvc_mask);
+ inline bool GET_TP_CONDITION(int tp);
inline INT32 PREG_PSCALER(INT32 preg);
void op_invalid();
void op_abs();
diff --git a/src/devices/cpu/tms32082/dis_mp.cpp b/src/devices/cpu/tms32082/dis_mp.cpp
index 1b89eb88129..e7083901fc7 100644
--- a/src/devices/cpu/tms32082/dis_mp.cpp
+++ b/src/devices/cpu/tms32082/dis_mp.cpp
@@ -231,7 +231,14 @@ static offs_t tms32082_disasm_mp(char *buffer, offs_t pc, const UINT8 *oprom)
case 0x00: print("illop0 "); break;
case 0x01: print("trap %d", UIMM15(uimm15)); break;
case 0x02: print("cmnd 0x%04X", UIMM15(uimm15)); break;
- case 0x04: print("rdcr %s, R%d", get_creg_name(UIMM15(uimm15)), rd); break;
+
+ case 0x04:
+ if (op == 0x00020000)
+ print("nop ");
+ else
+ print("rdcr %s, R%d", get_creg_name(UIMM15(uimm15)), rd);
+ break;
+
case 0x05: print("swcr R%d, %s, R%d", rd, get_creg_name(UIMM15(uimm15)), rs); break;
case 0x06: print("brcr %s", get_creg_name(UIMM15(uimm15))); break;
case 0x08: print("shift%s.dz %d, %d, R%d, R%d", (op & (1 << 10)) ? "r" : "l", rotate, endmask, rs, rd); break;
diff --git a/src/devices/cpu/tms32082/dis_pp.cpp b/src/devices/cpu/tms32082/dis_pp.cpp
index 54f8a6d7004..8bc6af719a9 100644
--- a/src/devices/cpu/tms32082/dis_pp.cpp
+++ b/src/devices/cpu/tms32082/dis_pp.cpp
@@ -258,7 +258,7 @@ static void format_transfer(UINT64 op)
int reg = (bank << 3) | d;
- UINT16 offset = 0;
+ UINT16 offset;
if (s)
{
offset = op & 0x7fff;
diff --git a/src/devices/cpu/tms32082/mp_ops.cpp b/src/devices/cpu/tms32082/mp_ops.cpp
index 79c0b401392..1cce61f6a8d 100644
--- a/src/devices/cpu/tms32082/mp_ops.cpp
+++ b/src/devices/cpu/tms32082/mp_ops.cpp
@@ -254,7 +254,7 @@ void tms32082_mp_device::execute_short_imm()
UINT32 compmask = endmask; // shiftmask == 0xffffffff
- UINT32 res = 0;
+ UINT32 res;
if (r) // right
{
res = ROTATE_R(source, rot) & compmask;
@@ -283,7 +283,7 @@ void tms32082_mp_device::execute_short_imm()
UINT32 compmask = endmask; // shiftmask == 0xffffffff
- UINT32 res = 0;
+ UINT32 res;
if (r) // right
{
res = ROTATE_R(source, rot) & compmask;
@@ -316,7 +316,7 @@ void tms32082_mp_device::execute_short_imm()
UINT32 shiftmask = SHIFT_MASK[shift ? shift : 32];
UINT32 compmask = endmask & shiftmask;
- UINT32 res = 0;
+ UINT32 res;
if (r) // right
{
res = ROTATE_R(source, rot) & compmask;
@@ -346,7 +346,7 @@ void tms32082_mp_device::execute_short_imm()
UINT32 shiftmask = SHIFT_MASK[r ? 32-rot : rot];
UINT32 compmask = endmask & shiftmask;
- UINT32 res = 0;
+ UINT32 res;
if (r) // right
{
res = (ROTATE_R(source, rot) & compmask) | (m_reg[rd] & ~compmask);
@@ -377,7 +377,7 @@ void tms32082_mp_device::execute_short_imm()
UINT32 shiftmask = SHIFT_MASK[shift ? shift : 32];
UINT32 compmask = endmask & shiftmask;
- UINT32 res = 0;
+ UINT32 res;
if (r) // right
{
res = ROTATE_R(source, rot) & compmask;
@@ -409,7 +409,7 @@ void tms32082_mp_device::execute_short_imm()
UINT32 shiftmask = SHIFT_MASK[r ? 32-rot : rot];
UINT32 compmask = endmask & ~shiftmask;
- UINT32 res = 0;
+ UINT32 res;
if (r) // right
{
res = ROTATE_R(source, rot) & compmask;
@@ -439,7 +439,7 @@ void tms32082_mp_device::execute_short_imm()
UINT32 shiftmask = SHIFT_MASK[r ? 32-rot : rot];
UINT32 compmask = endmask & ~shiftmask;
- UINT32 res = 0;
+ UINT32 res;
if (r) // right
{
res = (ROTATE_R(source, rot) & compmask) | (m_reg[rd] & ~compmask);
@@ -897,7 +897,7 @@ void tms32082_mp_device::execute_reg_long_imm()
UINT32 shiftmask = SHIFT_MASK[shift ? shift : 32];
UINT32 compmask = endmask & shiftmask;
- UINT32 res = 0;
+ UINT32 res;
if (r) // right
{
res = ROTATE_R(source, rot) & compmask;
@@ -928,7 +928,7 @@ void tms32082_mp_device::execute_reg_long_imm()
UINT32 shiftmask = SHIFT_MASK[shift ? shift : 32];
UINT32 compmask = endmask & shiftmask;
- UINT32 res = 0;
+ UINT32 res;
if (r) // right
{
res = ROTATE_R(source, rot) & compmask;
@@ -960,7 +960,7 @@ void tms32082_mp_device::execute_reg_long_imm()
UINT32 shiftmask = SHIFT_MASK[shift ? shift : 32];
UINT32 compmask = endmask & ~shiftmask;
- UINT32 res = 0;
+ UINT32 res;
if (r) // right
{
res = ROTATE_R(source, rot) & compmask;
@@ -1393,7 +1393,7 @@ void tms32082_mp_device::execute_reg_long_imm()
float src1 = u2f(m_reg[OP_SRC1()]);
float src2 = u2f(m_reg[OP_RS()]);
- float res = (src1 * src2) + (z ? 0.0f : m_acc[acc]);
+ float res = (src1 * src2) + (z ? 0.0f : m_facc[acc]);
// parallel load/store op
if (!(ls_bit1 == 0 && ls_bit2 == 0))
@@ -1436,7 +1436,7 @@ void tms32082_mp_device::execute_reg_long_imm()
float src1 = u2f(m_reg[OP_SRC1()]);
float src2 = u2f(m_reg[OP_RS()]);
- float res = (z ? 0.0f : m_acc[acc]) - (src1 * src2);
+ float res = (z ? 0.0f : m_facc[acc]) - (src1 * src2);
// parallel load/store op
if (!(ls_bit1 == 0 && ls_bit2 == 0))
@@ -1663,7 +1663,11 @@ void tms32082_mp_device::execute_reg_long_imm()
double src1 = has_imm ? (double)u2f(imm32) : (p1 ? u2d(m_fpair[rs1 >> 1]) : (double)u2f(m_reg[rs1]));
double src2 = p2 ? u2d(m_fpair[rs2 >> 1]) : (double)u2f(m_reg[rs2]);
- double res = src1 / src2;
+ double res;
+ if (src2 != 0.0)
+ res = src1 / src2;
+ else
+ res = 0.0f;
if (pd)
m_fpair[rd >> 1] = d2u(res);
@@ -1710,7 +1714,7 @@ void tms32082_mp_device::execute_reg_long_imm()
m_reg[rd] = f2u((float)(s));
break;
case 1:
- m_fpair[rd] = d2u(s);
+ m_fpair[rd >> 1] = d2u(s);
break;
case 2:
m_reg[rd] = (INT32)(s);
@@ -1767,7 +1771,11 @@ void tms32082_mp_device::execute_reg_long_imm()
if (rd)
{
- double res = sqrt(source);
+ double res;
+ if (source >= 0.0f)
+ res = sqrt(source);
+ else
+ res = 0.0;
if (pd)
m_fpair[rd >> 1] = d2u(res);
diff --git a/src/devices/cpu/tms32082/tms32082.cpp b/src/devices/cpu/tms32082/tms32082.cpp
index c3c95f9305f..8b89bc3ef88 100644
--- a/src/devices/cpu/tms32082/tms32082.cpp
+++ b/src/devices/cpu/tms32082/tms32082.cpp
@@ -58,6 +58,12 @@ offs_t tms32082_mp_device::disasm_disassemble(char *buffer, offs_t pc, const UIN
+void tms32082_mp_device::set_command_callback(write32_delegate callback)
+{
+ m_cmd_callback = callback;
+}
+
+
READ32_MEMBER(tms32082_mp_device::mp_param_r)
{
//printf("mp_param_w: %08X, %08X\n", offset, mem_mask);
@@ -208,7 +214,7 @@ void tms32082_mp_device::device_start()
m_icountptr = &m_icount;
}
-void tms32082_mp_device::state_string_export(const device_state_entry &entry, std::string &str)
+void tms32082_mp_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
@@ -277,75 +283,10 @@ void tms32082_mp_device::processor_command(UINT32 command)
if (command & 0x00000001)
printf("PP0 ");
- printf("\n");
-
- // PP0
- if (command & 1)
- {
- if (command & 0x00004000)
- {
- // simulate PP behavior for now...
- m_program->write_dword(0x00000084, 3);
-
- UINT32 num = m_program->read_dword(0x90);
-
- printf("PP num %d\n", num);
-
- /*
- UINT32 ra = 0x1000280;
-
- printf("FIFO push:\n");
-
- for (int i=0; i < num; i++)
- {
- printf("Entry %d:\n", i);
- for (int k=0; k < 6; k++)
- {
- for (int l=0; l < 4; l++)
- {
- UINT32 dd = m_program->read_dword(ra);
- ra += 4;
-
- printf("%08X(%f) ", dd, u2f(dd));
- }
- printf("\n");
- }
- printf("\n");
- }
- */
-
- UINT32 ra = 0x1000280;
-
- int oldnum = m_program->read_dword(0x600ffffc);
- UINT32 rb = 0x60000000 + (oldnum * 0x60);
+ if (!m_cmd_callback.isnull())
+ m_cmd_callback(*m_program, 0, command, 0xffffffff);
- for (int i=0; i < num; i++)
- {
- for (int k=0; k < 24; k++)
- {
- UINT32 dd = m_program->read_dword(ra);
- ra += 4;
-
- m_program->write_dword(rb, dd);
- rb += 4;
- }
- }
- m_program->write_dword(0x600ffffc, oldnum+num);
-
- m_program->write_dword(0x00000090, 0);
- m_program->write_dword(0x00000094, num);
-
- }
- }
- // PP1
- if (command & 2)
- {
- if (command & 0x00004000)
- {
- // simulate PP behavior for now...
- m_program->write_dword(0x00001014, 3);
- }
- }
+ printf("\n");
}
UINT32 tms32082_mp_device::read_creg(int reg)
@@ -512,15 +453,12 @@ void tms32082_mp_device::execute_run()
m_ir = fetch();
execute();
- if (m_tcount == 0)
+ m_tcount--;
+ if (m_tcount < 0)
{
// TODO: timer interrupt
m_tcount = m_tscale;
}
- else
- {
- m_tcount--;
- }
m_icount--;
};
@@ -573,7 +511,7 @@ void tms32082_pp_device::device_start()
m_icountptr = &m_icount;
}
-void tms32082_pp_device::state_string_export(const device_state_entry &entry, std::string &str)
+void tms32082_pp_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/tms32082/tms32082.h b/src/devices/cpu/tms32082/tms32082.h
index 6d3e932375c..80163cc6145 100644
--- a/src/devices/cpu/tms32082/tms32082.h
+++ b/src/devices/cpu/tms32082/tms32082.h
@@ -71,6 +71,8 @@ public:
DECLARE_READ32_MEMBER(mp_param_r);
DECLARE_WRITE32_MEMBER(mp_param_w);
+ void set_command_callback(write32_delegate callback);
+
protected:
// device level overrides
@@ -95,7 +97,7 @@ protected:
}
// device_state_interface overrides
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 4; }
@@ -139,6 +141,8 @@ protected:
address_space *m_program;
direct_read_data* m_direct;
+ write32_delegate m_cmd_callback;
+
void check_interrupts();
void processor_command(UINT32 command);
UINT32 fetch();
@@ -188,7 +192,7 @@ protected:
}
// device_state_interface overrides
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 8; }
diff --git a/src/devices/cpu/tms34010/tms34010.cpp b/src/devices/cpu/tms34010/tms34010.cpp
index 3fffd1c03c5..68f410d5b2b 100644
--- a/src/devices/cpu/tms34010/tms34010.cpp
+++ b/src/devices/cpu/tms34010/tms34010.cpp
@@ -592,14 +592,13 @@ void tms340x0_device::device_start()
state_add(TMS34010_ST, "ST", m_st);
state_add(STATE_GENFLAGS, "GENFLAGS", m_st).noshow().formatstr("%18s");
- std::string tempstr;
for (int regnum = 0; regnum < 15; regnum++)
{
- state_add(TMS34010_A0 + regnum, strformat(tempstr, "A%d", regnum).c_str(), m_regs[regnum].reg);
+ state_add(TMS34010_A0 + regnum, strformat("A%d", regnum).c_str(), m_regs[regnum].reg);
}
for (int regnum = 0; regnum < 15; regnum++)
{
- state_add(TMS34010_B0 + regnum, strformat(tempstr, "B%d", regnum).c_str(), m_regs[30 - regnum].reg);
+ state_add(TMS34010_B0 + regnum, strformat("B%d", regnum).c_str(), m_regs[30 - regnum].reg);
}
}
@@ -1005,7 +1004,7 @@ void tms340x0_device::get_display_params(tms34010_display_params *params)
UINT32 tms340x0_device::tms340x0_ind16(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
- pen_t blackpen = screen.palette()->black_pen();
+ pen_t blackpen = screen.palette().black_pen();
tms34010_display_params params;
int x;
@@ -1599,7 +1598,7 @@ READ16_MEMBER( tms340x0_device::host_r )
}
-void tms340x0_device::state_string_export(const device_state_entry &entry, std::string &str)
+void tms340x0_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/tms34010/tms34010.h b/src/devices/cpu/tms34010/tms34010.h
index 733674d4279..f87a3df37b1 100644
--- a/src/devices/cpu/tms34010/tms34010.h
+++ b/src/devices/cpu/tms34010/tms34010.h
@@ -282,7 +282,7 @@ protected:
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override { return (spacenum == AS_PROGRAM) ? &m_program_config : nullptr; }
// device_state_interface overrides
- virtual void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 2; }
diff --git a/src/devices/cpu/tms57002/tms57002.h b/src/devices/cpu/tms57002/tms57002.h
index 5e871591158..6cfcf4b4b51 100644
--- a/src/devices/cpu/tms57002/tms57002.h
+++ b/src/devices/cpu/tms57002/tms57002.h
@@ -159,8 +159,6 @@ private:
inline int movm(UINT32 st1);
inline int sfma(UINT32 st1);
- const char *get_memadr(UINT32 opcode, char type);
-
void xm_init();
void xm_step_read();
void xm_step_write();
diff --git a/src/devices/cpu/tms7000/tms7000.cpp b/src/devices/cpu/tms7000/tms7000.cpp
index 99451e30d6b..42e76319855 100644
--- a/src/devices/cpu/tms7000/tms7000.cpp
+++ b/src/devices/cpu/tms7000/tms7000.cpp
@@ -257,7 +257,7 @@ void tms7000_device::device_start()
state_add(STATE_GENFLAGS, "GENFLAGS", m_sr).formatstr("%8s").noshow();
}
-void tms7000_device::state_string_export(const device_state_entry &entry, std::string &str)
+void tms7000_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/tms7000/tms7000.h b/src/devices/cpu/tms7000/tms7000.h
index 53d940232d2..b44ac9324c7 100644
--- a/src/devices/cpu/tms7000/tms7000.h
+++ b/src/devices/cpu/tms7000/tms7000.h
@@ -80,7 +80,7 @@ protected:
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override { return (spacenum == AS_PROGRAM) ? &m_program_config : ( (spacenum == AS_IO) ? &m_io_config : nullptr ); }
// device_state_interface overrides
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 1; }
diff --git a/src/devices/cpu/tms9900/tms9900.cpp b/src/devices/cpu/tms9900/tms9900.cpp
index 71f177809eb..b1fad1bbeeb 100644
--- a/src/devices/cpu/tms9900/tms9900.cpp
+++ b/src/devices/cpu/tms9900/tms9900.cpp
@@ -349,11 +349,11 @@ void tms99xx_device::state_export(const device_state_entry &entry)
/*
state_string_export - export state as a string for the debugger
*/
-void tms99xx_device::state_string_export(const device_state_entry &entry, std::string &str)
+void tms99xx_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
static const char *statestr = "LAECOPX-----IIII";
char flags[17];
- memset(flags, 0x00, ARRAY_LENGTH(flags));
+ for (auto &flag : flags) flag = 0x00;
UINT16 val = 0x8000;
if (entry.index()==STATE_GENFLAGS)
{
@@ -1039,7 +1039,7 @@ const tms99xx_device::tms_instruction tms99xx_device::s_command[] =
void tms99xx_device::build_command_lookup_table()
{
int i = 0;
- int cmdindex = 0;
+ int cmdindex;
int bitcount;
const tms_instruction *inst;
UINT16 opcode;
@@ -1968,7 +1968,7 @@ void tms99xx_device::alu_f3()
void tms99xx_device::alu_multiply()
{
- UINT32 result = 0;
+ UINT32 result;
switch (m_state)
{
diff --git a/src/devices/cpu/tms9900/tms9900.h b/src/devices/cpu/tms9900/tms9900.h
index be2c8a4ba3b..4669eeb439a 100644
--- a/src/devices/cpu/tms9900/tms9900.h
+++ b/src/devices/cpu/tms9900/tms9900.h
@@ -224,9 +224,9 @@ private:
// State / debug management
UINT16 m_state_any;
static const char* s_statename[];
- void state_import(const device_state_entry &entry) override;
- void state_export(const device_state_entry &entry) override;
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_import(const device_state_entry &entry) override;
+ virtual void state_export(const device_state_entry &entry) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// Interrupt handling
void service_interrupt();
@@ -301,7 +301,7 @@ private:
void alu_abs(void);
void alu_x(void);
void alu_b(void);
- void alu_bl(void);
+ //void alu_bl(void);
void alu_blwp(void);
void alu_ldcr(void);
void alu_stcr(void);
diff --git a/src/devices/cpu/tms9900/tms9995.cpp b/src/devices/cpu/tms9900/tms9995.cpp
index e40cfd94280..855f00499a0 100644
--- a/src/devices/cpu/tms9900/tms9995.cpp
+++ b/src/devices/cpu/tms9900/tms9995.cpp
@@ -372,7 +372,7 @@ void tms9995_device::state_export(const device_state_entry &entry)
/*
state_string_export - export state as a string for the debugger
*/
-void tms9995_device::state_string_export(const device_state_entry &entry, std::string &str)
+void tms9995_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
static const char *statestr = "LAECOPX-----IIII";
char flags[17];
@@ -1128,7 +1128,7 @@ const tms9995_device::tms_instruction tms9995_device::s_command[] =
void tms9995_device::build_command_lookup_table()
{
int i = 0;
- int cmdindex = 0;
+ int cmdindex;
int bitcount;
const tms_instruction *inst;
UINT16 opcode;
@@ -1599,7 +1599,7 @@ void tms9995_device::command_completed()
*/
void tms9995_device::service_interrupt()
{
- int vectorpos = 0;
+ int vectorpos;
if (m_reset)
{
@@ -2555,7 +2555,7 @@ void tms9995_device::alu_divide()
void tms9995_device::alu_divide_signed()
{
int n=1;
- bool overflow = true;
+ bool overflow;
UINT16 w1, w2, dwait;
INT16 divisor;
INT32 dividend;
@@ -2930,8 +2930,8 @@ void tms9995_device::alu_mov()
void tms9995_device::alu_multiply()
{
int n = 0;
- UINT32 result = 0;
- INT32 results = 0;
+ UINT32 result;
+ INT32 results;
if (m_instruction->command==MPY)
{
diff --git a/src/devices/cpu/tms9900/tms9995.h b/src/devices/cpu/tms9900/tms9995.h
index fc24c82801d..e5dc055f36f 100644
--- a/src/devices/cpu/tms9900/tms9995.h
+++ b/src/devices/cpu/tms9900/tms9995.h
@@ -106,7 +106,7 @@ private:
static const char* s_statename[];
void state_import(const device_state_entry &entry) override;
void state_export(const device_state_entry &entry) override;
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ void state_string_export(const device_state_entry &entry, std::string &str) const override;
UINT16 read_workspace_register_debug(int reg);
void write_workspace_register_debug(int reg, UINT16 data);
diff --git a/src/devices/cpu/ucom4/ucom4.cpp b/src/devices/cpu/ucom4/ucom4.cpp
index 0c6bd280358..69b608a6592 100644
--- a/src/devices/cpu/ucom4/ucom4.cpp
+++ b/src/devices/cpu/ucom4/ucom4.cpp
@@ -76,7 +76,7 @@ upd552_cpu_device::upd552_cpu_device(const machine_config &mconfig, const char *
// disasm
-void ucom4_cpu_device::state_string_export(const device_state_entry &entry, std::string &str)
+void ucom4_cpu_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/ucom4/ucom4.h b/src/devices/cpu/ucom4/ucom4.h
index a01ccaa37a7..01a7f2ecc1c 100644
--- a/src/devices/cpu/ucom4/ucom4.h
+++ b/src/devices/cpu/ucom4/ucom4.h
@@ -157,7 +157,8 @@ protected:
virtual UINT32 disasm_max_opcode_bytes() const override { return 2; }
virtual offs_t disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options) override;
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ // device_state_interface overrides
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
address_space_config m_program_config;
address_space_config m_data_config;
diff --git a/src/devices/cpu/uml.cpp b/src/devices/cpu/uml.cpp
index e01b34cdcb6..5b9785f792c 100644
--- a/src/devices/cpu/uml.cpp
+++ b/src/devices/cpu/uml.cpp
@@ -739,9 +739,8 @@ void uml::instruction::simplify()
/*
if (LOG_SIMPLIFICATIONS && memcmp(&orig, inst, sizeof(orig)) != 0)
{
- std::string disasm1, disasm2;
- orig.disasm(disasm1, block->drcuml);
- inst->disasm(disasm2, block->drcuml);
+ std::string disasm1 = orig.disasm(block->drcuml);
+ std::string disasm2 = inst->disasm(block->drcuml);
osd_printf_debug("Simplified: %-50.50s -> %s\n", disasm1.c_str(), disasm2.c_str());
}
*/
@@ -854,7 +853,7 @@ UINT8 uml::instruction::modified_flags() const
// given buffer
//-------------------------------------------------
-const char *uml::instruction::disasm(std::string &buffer, drcuml_state *drcuml) const
+std::string uml::instruction::disasm(drcuml_state *drcuml) const
{
static const char *const conditions[] = { "z", "nz", "s", "ns", "c", "nc", "v", "nv", "u", "nu", "a", "be", "g", "le", "l", "ge" };
static const char *const pound_size[] = { "?", "?", "?", "?", "s", "?", "?", "?", "d" };
@@ -868,7 +867,7 @@ const char *uml::instruction::disasm(std::string &buffer, drcuml_state *drcuml)
assert(m_opcode != OP_INVALID && m_opcode < OP_MAX);
// start with the raw mnemonic and substitute sizes
- buffer.clear();
+ std::string buffer;
for (const char *opsrc = opinfo.mnemonic; *opsrc != 0; opsrc++)
if (*opsrc == '!')
strcatprintf(buffer, "%s", bang_size[m_size]);
@@ -1025,5 +1024,5 @@ const char *uml::instruction::disasm(std::string &buffer, drcuml_state *drcuml)
if (m_flags & FLAG_C)
buffer.push_back('C');
}
- return buffer.c_str();
+ return buffer;
}
diff --git a/src/devices/cpu/uml.h b/src/devices/cpu/uml.h
index 6086320cf99..2dfd95adbea 100644
--- a/src/devices/cpu/uml.h
+++ b/src/devices/cpu/uml.h
@@ -409,7 +409,7 @@ namespace uml
void set_mapvar(int paramnum, UINT32 value) { assert(paramnum < m_numparams); assert(m_param[paramnum].is_mapvar()); m_param[paramnum] = value; }
// misc
- const char *disasm(std::string &str, drcuml_state *drcuml = nullptr) const;
+ std::string disasm(drcuml_state *drcuml = nullptr) const;
UINT8 input_flags() const;
UINT8 output_flags() const;
UINT8 modified_flags() const;
diff --git a/src/devices/cpu/upd7725/upd7725.cpp b/src/devices/cpu/upd7725/upd7725.cpp
index 5820d6fe4e0..ef211dd13c3 100644
--- a/src/devices/cpu/upd7725/upd7725.cpp
+++ b/src/devices/cpu/upd7725/upd7725.cpp
@@ -202,7 +202,7 @@ void necdsp_device::state_export(const device_state_entry &entry)
// for the debugger
//-------------------------------------------------
-void necdsp_device::state_string_export(const device_state_entry &entry, std::string &str)
+void necdsp_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/upd7725/upd7725.h b/src/devices/cpu/upd7725/upd7725.h
index 063360e6d34..94a7f85869f 100644
--- a/src/devices/cpu/upd7725/upd7725.h
+++ b/src/devices/cpu/upd7725/upd7725.h
@@ -110,7 +110,7 @@ protected:
// device_state_interface overrides
virtual void state_import(const device_state_entry &entry) override;
virtual void state_export(const device_state_entry &entry) override;
- virtual void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override;
@@ -188,9 +188,6 @@ private:
void exec_jp(UINT32 opcode);
void exec_ld(UINT32 opcode);
- void stack_push();
- void stack_pull();
-
int m_icount;
int m_irq; // old irq line state, for detecting rising edges.
diff --git a/src/devices/cpu/upd7810/upd7810.cpp b/src/devices/cpu/upd7810/upd7810.cpp
index bf699d70fa9..d0974d00a74 100644
--- a/src/devices/cpu/upd7810/upd7810.cpp
+++ b/src/devices/cpu/upd7810/upd7810.cpp
@@ -1696,7 +1696,7 @@ void upd78c05_device::device_start()
}
-void upd7810_device::state_string_export(const device_state_entry &entry, std::string &str)
+void upd7810_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
@@ -1825,7 +1825,7 @@ void upd7810_device::execute_run()
{
do
{
- int cc = 0;
+ int cc;
debugger_instruction_hook(this, PC);
diff --git a/src/devices/cpu/upd7810/upd7810.h b/src/devices/cpu/upd7810/upd7810.h
index d25b22e49a7..d7d96be75d7 100644
--- a/src/devices/cpu/upd7810/upd7810.h
+++ b/src/devices/cpu/upd7810/upd7810.h
@@ -170,7 +170,7 @@ protected:
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override { return (spacenum == AS_PROGRAM) ? &m_program_config : ( (spacenum == AS_IO) ? &m_io_config : nullptr ); }
// device_state_interface overrides
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 1; }
diff --git a/src/devices/cpu/v30mz/v30mz.cpp b/src/devices/cpu/v30mz/v30mz.cpp
index 3bc7c28236a..ec720d59f9a 100644
--- a/src/devices/cpu/v30mz/v30mz.cpp
+++ b/src/devices/cpu/v30mz/v30mz.cpp
@@ -185,12 +185,12 @@ void v30mz_cpu_device::device_start()
}
-void v30mz_cpu_device::state_string_export(const device_state_entry &entry, std::string &str)
+void v30mz_cpu_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
case STATE_GENPC:
- strprintf(str, "%08X", pc());
+ strprintf(str, "%08X", ( m_sregs[CS] << 4 ) + m_ip);
break;
case STATE_GENFLAGS:
@@ -781,7 +781,7 @@ inline void v30mz_cpu_device::set_OFB_Sub(UINT32 x,UINT32 y,UINT32 z)
}
-inline UINT16 v30mz_cpu_device::CompressFlags()
+inline UINT16 v30mz_cpu_device::CompressFlags() const
{
return (CF ? 1 : 0)
| (PF ? 4 : 0)
diff --git a/src/devices/cpu/v30mz/v30mz.h b/src/devices/cpu/v30mz/v30mz.h
index 7696cda2f0d..6ba07800b9e 100644
--- a/src/devices/cpu/v30mz/v30mz.h
+++ b/src/devices/cpu/v30mz/v30mz.h
@@ -44,7 +44,7 @@ protected:
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override { return (spacenum == AS_PROGRAM) ? &m_program_config : ( (spacenum == AS_IO) ? &m_io_config : nullptr ); }
// device_state_interface overrides
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 1; }
@@ -112,7 +112,7 @@ protected:
inline void set_OFB_Add(UINT32 x,UINT32 y,UINT32 z);
inline void set_OFW_Sub(UINT32 x,UINT32 y,UINT32 z);
inline void set_OFB_Sub(UINT32 x,UINT32 y,UINT32 z);
- inline UINT16 CompressFlags();
+ inline UINT16 CompressFlags() const;
inline void ExpandFlags(UINT16 f);
// rep instructions
diff --git a/src/devices/cpu/v60/v60.cpp b/src/devices/cpu/v60/v60.cpp
index 2a770739e25..61764add79a 100644
--- a/src/devices/cpu/v60/v60.cpp
+++ b/src/devices/cpu/v60/v60.cpp
@@ -85,7 +85,6 @@ v60_device::v60_device(const machine_config &mconfig, const char *tag, device_t
: cpu_device(mconfig, V60, "V60", tag, owner, clock, "v60", __FILE__)
, m_program_config("program", ENDIANNESS_LITTLE, 16, 24, 0)
, m_io_config("io", ENDIANNESS_LITTLE, 16, 24, 0)
- , m_fetch_xor(BYTE_XOR_LE(0))
, m_start_pc(0xfffff0)
{
// Set m_PIR (Processor ID) for NEC m_ LSB is reserved to NEC,
@@ -98,7 +97,6 @@ v60_device::v60_device(const machine_config &mconfig, device_type type, const ch
: cpu_device(mconfig, type, name, tag, owner, clock, shortname, source)
, m_program_config("program", ENDIANNESS_LITTLE, 32, 32, 0)
, m_io_config("io", ENDIANNESS_LITTLE, 16, 24, 0)
- , m_fetch_xor(BYTE4_XOR_LE(0))
, m_start_pc(0xfffffff0)
{
// Set m_PIR (Processor ID) for NEC v70. LSB is reserved to NEC,
diff --git a/src/devices/cpu/v60/v60.h b/src/devices/cpu/v60/v60.h
index 4ef35d130b0..a7b2c886d5e 100644
--- a/src/devices/cpu/v60/v60.h
+++ b/src/devices/cpu/v60/v60.h
@@ -151,7 +151,6 @@ private:
address_space_config m_program_config;
address_space_config m_io_config;
- offs_t m_fetch_xor;
offs_t m_start_pc;
UINT32 m_reg[68];
struct {
@@ -286,8 +285,6 @@ private:
UINT32 bam1Error1();
UINT32 am1Error2();
UINT32 bam1Error2();
- UINT32 am1Error3();
- UINT32 bam1Error3();
UINT32 am1Error4();
UINT32 bam1Error4();
UINT32 am1Error5();
@@ -380,12 +377,10 @@ private:
UINT32 am2ImmediateQuick();
UINT32 am2Error1();
UINT32 am2Error2();
- UINT32 am2Error3();
UINT32 am2Error4();
UINT32 am2Error5();
UINT32 bam2Error1();
UINT32 bam2Error2();
- UINT32 bam2Error3();
UINT32 bam2Error4();
UINT32 bam2Error5();
UINT32 bam2Error6();
@@ -438,7 +433,6 @@ private:
UINT32 am3ImmediateQuick();
UINT32 am3Error1();
UINT32 am3Error2();
- UINT32 am3Error3();
UINT32 am3Error4();
UINT32 am3Error5();
UINT32 am3Group7a();
diff --git a/src/devices/cpu/v810/v810.cpp b/src/devices/cpu/v810/v810.cpp
index 84293a990ae..958c28edc49 100644
--- a/src/devices/cpu/v810/v810.cpp
+++ b/src/devices/cpu/v810/v810.cpp
@@ -1314,7 +1314,7 @@ void v810_device::device_start()
m_icountptr = &m_icount;
}
-void v810_device::state_string_export(const device_state_entry &entry, std::string &str)
+void v810_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/v810/v810.h b/src/devices/cpu/v810/v810.h
index dbe9cf10b55..4e85ed7b540 100644
--- a/src/devices/cpu/v810/v810.h
+++ b/src/devices/cpu/v810/v810.h
@@ -101,7 +101,7 @@ protected:
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override { return (spacenum == AS_PROGRAM) ? &m_program_config : ((spacenum == AS_IO) ? &m_io_config : nullptr); }
// device_state_interface overrides
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 2; }
diff --git a/src/devices/cpu/vtlb.cpp b/src/devices/cpu/vtlb.cpp
index 5dd5711366c..4c9a9a2f311 100644
--- a/src/devices/cpu/vtlb.cpp
+++ b/src/devices/cpu/vtlb.cpp
@@ -56,7 +56,7 @@ vtlb_state *vtlb_alloc(device_t *cpu, address_spacenum space, int fixed_entries,
vtlb_state *vtlb;
/* allocate memory for the core structure */
- vtlb = auto_alloc_clear(cpu->machine(), vtlb_state);
+ vtlb = auto_alloc_clear(cpu->machine(), <vtlb_state>());
/* fill in CPU information */
vtlb->cpudevice = downcast<cpu_device *>(cpu);
diff --git a/src/devices/cpu/x86log.cpp b/src/devices/cpu/x86log.cpp
index d709af981f3..c9cb81e78e9 100644
--- a/src/devices/cpu/x86log.cpp
+++ b/src/devices/cpu/x86log.cpp
@@ -8,66 +8,18 @@
***************************************************************************/
+#include <cstdint>
+#include <cassert>
#include "emu.h"
#include "x86log.h"
/***************************************************************************
- CONSTANTS
-***************************************************************************/
-
-/* comment parameters */
-#define MAX_COMMENTS 4000
-#define MAX_DATA_RANGES 1000
-#define COMMENT_POOL_SIZE (MAX_COMMENTS * 40)
-
-
-
-/***************************************************************************
- TYPE DEFINITIONS
-***************************************************************************/
-
-/* code logging info */
-struct log_comment
-{
- x86code * base;
- const char * string;
-};
-
-
-/* data ranges */
-struct data_range_t
-{
- x86code * base;
- x86code * end;
- int size;
-};
-
-
-/* the code logging context */
-struct x86log_context
-{
- std::string filename; /* name of the file */
- FILE * file; /* file we are logging to */
-
- data_range_t data_range[MAX_DATA_RANGES]; /* list of data ranges */
- int data_range_count; /* number of data ranges */
-
- log_comment comment_list[MAX_COMMENTS]; /* list of comments */
- int comment_count; /* number of live comments */
-
- char comment_pool[COMMENT_POOL_SIZE];/* string pool to hold comments */
- char * comment_pool_next; /* pointer to next string pool location */
-};
-
-
-
-/***************************************************************************
FUNCTION PROTOTYPES
***************************************************************************/
-static void reset_log(x86log_context *log);
+static void reset_log(x86log_context *log) noexcept;
extern int i386_dasm_one_ex(char *buffer, UINT64 eip, const UINT8 *oprom, int mode);
@@ -85,7 +37,7 @@ x86log_context *x86log_create_context(const char *filename)
x86log_context *log;
/* allocate the log */
- log = global_alloc_clear(x86log_context);
+ log = global_alloc_clear<x86log_context>();
/* allocate the filename */
log->filename.assign(filename);
@@ -100,7 +52,7 @@ x86log_context *x86log_create_context(const char *filename)
x86log_free_context - release a context
-------------------------------------------------*/
-void x86log_free_context(x86log_context *log)
+void x86log_free_context(x86log_context *log) noexcept
{
/* close any open files */
if (log->file != nullptr)
@@ -112,46 +64,11 @@ void x86log_free_context(x86log_context *log)
/*-------------------------------------------------
- x86log_add_comment - add a comment associated
- with a given code pointer
--------------------------------------------------*/
-
-void x86log_add_comment(x86log_context *log, x86code *base, const char *format, ...)
-{
- char *string = log->comment_pool_next;
- log_comment *comment;
- va_list va;
-
- assert(log->comment_count < MAX_COMMENTS);
- assert(log->comment_pool_next + strlen(format) + 256 < log->comment_pool + COMMENT_POOL_SIZE);
-
- /* we assume comments are registered in order; enforce this */
- assert(log->comment_count == 0 || base >= log->comment_list[log->comment_count - 1].base);
-
- /* if we exceed the maxima, skip it */
- if (log->comment_count >= MAX_COMMENTS)
- return;
- if (log->comment_pool_next + strlen(format) + 256 >= log->comment_pool + COMMENT_POOL_SIZE)
- return;
-
- /* do the printf to the string pool */
- va_start(va, format);
- log->comment_pool_next += vsprintf(log->comment_pool_next, format, va) + 1;
- va_end(va);
-
- /* fill in the new comment */
- comment = &log->comment_list[log->comment_count++];
- comment->base = base;
- comment->string = string;
-}
-
-
-/*-------------------------------------------------
x86log_mark_as_data - mark a given range as
data for logging purposes
-------------------------------------------------*/
-void x86log_mark_as_data(x86log_context *log, x86code *base, x86code *end, int size)
+void x86log_mark_as_data(x86log_context *log, x86code *base, x86code *end, int size) noexcept
{
data_range_t *data;
@@ -258,31 +175,6 @@ void x86log_disasm_code_range(x86log_context *log, const char *label, x86code *s
}
-/*-------------------------------------------------
- x86log_printf - manually printf information to
- the log file
--------------------------------------------------*/
-
-void x86log_printf(x86log_context *log, const char *format, ...)
-{
- va_list va;
-
- /* open the file, creating it if necessary */
- if (log->file == nullptr)
- log->file = fopen(log->filename.c_str(), "w");
- if (log->file == nullptr)
- return;
-
- /* do the printf */
- va_start(va, format);
- vfprintf(log->file, format, va);
- va_end(va);
-
- /* flush the file */
- fflush(log->file);
-}
-
-
/***************************************************************************
LOCAL FUNCTIONS
@@ -292,7 +184,7 @@ void x86log_printf(x86log_context *log, const char *format, ...)
reset_log - reset the state of the log
-------------------------------------------------*/
-static void reset_log(x86log_context *log)
+static void reset_log(x86log_context *log) noexcept
{
log->data_range_count = 0;
log->comment_count = 0;
diff --git a/src/devices/cpu/x86log.h b/src/devices/cpu/x86log.h
index 68ca2ec5257..ac7195c99bd 100644
--- a/src/devices/cpu/x86log.h
+++ b/src/devices/cpu/x86log.h
@@ -13,14 +13,57 @@
#ifndef __X86LOG_H__
#define __X86LOG_H__
+#include <cstdint>
+#include <cassert>
#include "x86emit.h"
/***************************************************************************
+ CONSTANTS
+***************************************************************************/
+
+/* comment parameters */
+constexpr int MAX_COMMENTS{4000};
+constexpr int MAX_DATA_RANGES{1000};
+constexpr int COMMENT_POOL_SIZE{MAX_COMMENTS * 40};
+
+
+/***************************************************************************
TYPE DEFINITIONS
***************************************************************************/
-struct x86log_context;
+/* code logging info */
+struct log_comment
+{
+ x86code* base;
+ const char* string;
+};
+
+
+/* data ranges */
+struct data_range_t
+{
+ x86code* base;
+ x86code* end;
+ int size;
+};
+
+
+/* the code logging context */
+struct x86log_context
+{
+ std::string filename; /* name of the file */
+ FILE* file; /* file we are logging to */
+
+ data_range_t data_range[MAX_DATA_RANGES]; /* list of data ranges */
+ int data_range_count; /* number of data ranges */
+
+ log_comment comment_list[MAX_COMMENTS]; /* list of comments */
+ int comment_count; /* number of live comments */
+
+ char comment_pool[COMMENT_POOL_SIZE]; /* string pool to hold comments */
+ char* comment_pool_next; /* pointer to next string pool location */
+};
@@ -29,22 +72,89 @@ struct x86log_context;
***************************************************************************/
/* create a new context */
-x86log_context *x86log_create_context(const char *filename);
+x86log_context* x86log_create_context(const char* filename);
/* release a context */
-void x86log_free_context(x86log_context *log);
+void x86log_free_context(x86log_context* log) noexcept;
/* add a comment associated with a given code pointer */
-void x86log_add_comment(x86log_context *log, x86code *base, const char *format, ...) ATTR_PRINTF(3,4);
+template <typename... Ts>
+inline void x86log_add_comment(
+ x86log_context* log, x86code* base, const char* format, Ts&&... xs);
/* mark a given range as data for logging purposes */
-void x86log_mark_as_data(x86log_context *log, x86code *base, x86code *end, int size);
+void x86log_mark_as_data(
+ x86log_context* log, x86code* base, x86code* end, int size) noexcept;
/* disassemble a range of code and reset accumulated information */
-void x86log_disasm_code_range(x86log_context *log, const char *label, x86code *start, x86code *stop);
+void x86log_disasm_code_range(
+ x86log_context* log, const char* label, x86code* start, x86code* stop);
/* manually printf information to the log file */
-void x86log_printf(x86log_context *log, const char *format, ...) ATTR_PRINTF(2,3);
+template <typename... Ts>
+inline void x86log_printf(x86log_context* log, const char* format, Ts&&... xs);
+
+
+/*-------------------------------------------------
+ x86log_add_comment - add a comment associated
+ with a given code pointer
+-------------------------------------------------*/
+
+template <typename... Ts>
+inline void x86log_add_comment(
+ x86log_context* log, x86code* base, const char* format, Ts&&... xs)
+{
+ char* string = log->comment_pool_next;
+ log_comment* comment;
+
+ assert(log->comment_count < MAX_COMMENTS);
+ assert(log->comment_pool_next + strlen(format) + 256 <
+ log->comment_pool + COMMENT_POOL_SIZE);
+
+ /* we assume comments are registered in order; enforce this */
+ assert(log->comment_count == 0 ||
+ base >= log->comment_list[log->comment_count - 1].base);
+
+ /* if we exceed the maxima, skip it */
+ if(log->comment_count >= MAX_COMMENTS) return;
+ if(log->comment_pool_next + strlen(format) + 256 >=
+ log->comment_pool + COMMENT_POOL_SIZE)
+ return;
+
+ /* do the printf to the string pool */
+ log->comment_pool_next +=
+ sprintf(log->comment_pool_next, format, std::forward<Ts>(xs)...) + 1;
+
+ /* fill in the new comment */
+ comment = &log->comment_list[log->comment_count++];
+ comment->base = base;
+ comment->string = string;
+}
+
+
+/*-------------------------------------------------
+ x86log_printf - manually printf information to
+ the log file
+-------------------------------------------------*/
+
+template <typename... Ts>
+inline void x86log_printf(x86log_context* log, const char* format, Ts&&... xs)
+{
+ /* open the file, creating it if necessary */
+ if(log->file == nullptr)
+ {
+ log->file = fopen(log->filename.c_str(), "w");
+
+ if(log->file == nullptr) return;
+ }
+
+ assert(log->file != nullptr);
+
+ /* do the printf */
+ fprintf(log->file, format, std::forward<Ts>(xs)...);
+ /* flush the file */
+ fflush(log->file);
+}
-#endif /* __X86LOG_H__ */
+#endif /* __X86LOG_H__ */
diff --git a/src/devices/cpu/z180/z180.cpp b/src/devices/cpu/z180/z180.cpp
index 5a76f81ae76..c8f3b968468 100644
--- a/src/devices/cpu/z180/z180.cpp
+++ b/src/devices/cpu/z180/z180.cpp
@@ -755,8 +755,8 @@ static UINT8 SZP[256]; /* zero, sign and parity flags */
static UINT8 SZHV_inc[256]; /* zero, sign, half carry and overflow flags INC r8 */
static UINT8 SZHV_dec[256]; /* zero, sign, half carry and overflow flags DEC r8 */
-static UINT8 *SZHVC_add;
-static UINT8 *SZHVC_sub;
+static std::unique_ptr<UINT8[]> SZHVC_add;
+static std::unique_ptr<UINT8[]> SZHVC_sub;
#include "z180ops.h"
#include "z180tbl.h"
@@ -1894,8 +1894,8 @@ void z180_device::device_start()
}
/* allocate big flag arrays once */
- SZHVC_add = auto_alloc_array(machine(), UINT8, 2*256*256);
- SZHVC_sub = auto_alloc_array(machine(), UINT8, 2*256*256);
+ SZHVC_add = std::make_unique<UINT8[]>(2*256*256);
+ SZHVC_sub = std::make_unique<UINT8[]>(2*256*256);
padd = &SZHVC_add[ 0*256];
padc = &SZHVC_add[256*256];
@@ -2560,7 +2560,7 @@ void z180_device::state_export(const device_state_entry &entry)
}
}
-void z180_device::state_string_export(const device_state_entry &entry, std::string &str)
+void z180_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/z180/z180.h b/src/devices/cpu/z180/z180.h
index 9f36266fc94..e76c75501ba 100644
--- a/src/devices/cpu/z180/z180.h
+++ b/src/devices/cpu/z180/z180.h
@@ -152,7 +152,7 @@ protected:
// device_state_interface overrides
virtual void state_import(const device_state_entry &entry) override;
virtual void state_export(const device_state_entry &entry) override;
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 1; }
diff --git a/src/devices/cpu/z180/z180dasm.cpp b/src/devices/cpu/z180/z180dasm.cpp
index 4d89d6ac673..e44f6d67ae4 100644
--- a/src/devices/cpu/z180/z180dasm.cpp
+++ b/src/devices/cpu/z180/z180dasm.cpp
@@ -399,7 +399,7 @@ CPU_DISASSEMBLE( z180 )
unsigned PC = pc;
INT8 offset = 0;
UINT8 op, op1 = 0;
- UINT16 ea = 0;
+ UINT16 ea;
int pos = 0;
UINT32 flags = 0;
diff --git a/src/devices/cpu/z8/z8.cpp b/src/devices/cpu/z8/z8.cpp
index 3d8c6746c5b..d6c4fe3de77 100644
--- a/src/devices/cpu/z8/z8.cpp
+++ b/src/devices/cpu/z8/z8.cpp
@@ -677,9 +677,8 @@ void z8_device::device_start()
state_add(Z8_T1, "T1", m_t1);
state_add(STATE_GENFLAGS, "GENFLAGS", m_r[Z8_REGISTER_FLAGS]).noshow().formatstr("%6s");
- std::string tempstr;
for (int regnum = 0; regnum < 16; regnum++)
- state_add(Z8_R0 + regnum, strformat(tempstr, "R%d", regnum).c_str(), m_fake_r[regnum]).callimport().callexport();
+ state_add(Z8_R0 + regnum, strformat("R%d", regnum).c_str(), m_fake_r[regnum]).callimport().callexport();
}
/* find address spaces */
@@ -806,7 +805,7 @@ void z8_device::state_export(const device_state_entry &entry)
}
}
-void z8_device::state_string_export(const device_state_entry &entry, std::string &str)
+void z8_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/z8/z8.h b/src/devices/cpu/z8/z8.h
index 11758a771d7..6ef667c74cc 100644
--- a/src/devices/cpu/z8/z8.h
+++ b/src/devices/cpu/z8/z8.h
@@ -59,7 +59,7 @@ protected:
// device_state_interface overrides
virtual void state_import(const device_state_entry &entry) override;
virtual void state_export(const device_state_entry &entry) override;
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 1; }
diff --git a/src/devices/cpu/z80/z80.cpp b/src/devices/cpu/z80/z80.cpp
index 37ae5938426..345ea4334bf 100644
--- a/src/devices/cpu/z80/z80.cpp
+++ b/src/devices/cpu/z80/z80.cpp
@@ -3666,7 +3666,7 @@ void z80_device::state_export( const device_state_entry &entry )
}
}
-void z80_device::state_string_export(const device_state_entry &entry, std::string &str)
+void z80_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/z80/z80.h b/src/devices/cpu/z80/z80.h
index 679e7444435..c523f101a24 100644
--- a/src/devices/cpu/z80/z80.h
+++ b/src/devices/cpu/z80/z80.h
@@ -68,7 +68,7 @@ protected:
// device_state_interface overrides
virtual void state_import(const device_state_entry &entry) override;
virtual void state_export(const device_state_entry &entry) override;
- virtual void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 1; }
diff --git a/src/devices/cpu/z8000/z8000.cpp b/src/devices/cpu/z8000/z8000.cpp
index 9cd356225d6..dcc52f92fb0 100644
--- a/src/devices/cpu/z8000/z8000.cpp
+++ b/src/devices/cpu/z8000/z8000.cpp
@@ -616,7 +616,7 @@ void z8002_device::register_debug_state()
state_add( STATE_GENSP, "GENSP", m_nspoff ).noshow();
}
-void z8002_device::state_string_export(const device_state_entry &entry, std::string &str)
+void z8002_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
diff --git a/src/devices/cpu/z8000/z8000.h b/src/devices/cpu/z8000/z8000.h
index aaea89f7600..98ccc6ddea4 100644
--- a/src/devices/cpu/z8000/z8000.h
+++ b/src/devices/cpu/z8000/z8000.h
@@ -67,7 +67,7 @@ protected:
}
// device_state_interface overrides
- void state_string_export(const device_state_entry &entry, std::string &str) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual UINT32 disasm_min_opcode_bytes() const override { return 2; }
diff --git a/src/devices/imagedev/cassette.cpp b/src/devices/imagedev/cassette.cpp
index e6485b05523..aedc6509d42 100644
--- a/src/devices/imagedev/cassette.cpp
+++ b/src/devices/imagedev/cassette.cpp
@@ -12,7 +12,6 @@
#include "formats/imageutl.h"
#include "cassette.h"
#include "ui/ui.h"
-#include "image.h"
#define ANIMATION_FPS 1
diff --git a/src/devices/imagedev/chd_cd.cpp b/src/devices/imagedev/chd_cd.cpp
index 83845d026b8..d9ab295dfad 100644
--- a/src/devices/imagedev/chd_cd.cpp
+++ b/src/devices/imagedev/chd_cd.cpp
@@ -79,7 +79,7 @@ const option_guide *cdrom_image_device::create_option_guide() const
void cdrom_image_device::device_start()
{
// try to locate the CHD from a DISK_REGION
- chd_file *chd = get_disk_handle( machine(), owner()->tag() );
+ chd_file *chd = machine().rom_load().get_disk_handle(owner()->tag() );
if( chd != nullptr )
{
m_cdrom_handle = cdrom_open( chd );
@@ -115,7 +115,7 @@ bool cdrom_image_device::call_load()
chd = &m_self_chd;
}
} else {
- chd = get_disk_handle(device().machine(), device().subtag("cdrom").c_str());
+ chd = device().machine().rom_load().get_disk_handle(device().subtag("cdrom").c_str());
}
/* open the CHD file */
diff --git a/src/devices/imagedev/chd_cd.h b/src/devices/imagedev/chd_cd.h
index 5303b474045..5d229a471b4 100644
--- a/src/devices/imagedev/chd_cd.h
+++ b/src/devices/imagedev/chd_cd.h
@@ -33,7 +33,7 @@ public:
// image-level overrides
virtual bool call_load() override;
virtual void call_unload() override;
- virtual bool call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry) override { load_software_part_region(*this, swlist, swname, start_entry ); return TRUE; }
+ virtual bool call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry) override { machine().rom_load().load_software_part_region(*this, swlist, swname, start_entry ); return TRUE; }
virtual iodevice_t image_type() const override { return IO_CDROM; }
diff --git a/src/devices/imagedev/diablo.cpp b/src/devices/imagedev/diablo.cpp
index 9982463fd08..be8b3e500f2 100644
--- a/src/devices/imagedev/diablo.cpp
+++ b/src/devices/imagedev/diablo.cpp
@@ -76,7 +76,7 @@ void diablo_image_device::device_start()
m_chd = nullptr;
// try to locate the CHD from a DISK_REGION
- chd_file *handle = get_disk_handle(machine(), tag());
+ chd_file *handle = machine().rom_load().get_disk_handle(tag());
if (handle != nullptr)
{
m_hard_disk_handle = hard_disk_open(handle);
@@ -217,7 +217,7 @@ int diablo_image_device::internal_load_dsk()
/* open the CHD file */
if (software_entry() != nullptr)
{
- m_chd = get_disk_handle(device().machine(), device().subtag("harddriv").c_str());
+ m_chd = device().machine().rom_load().get_disk_handle(device().subtag("harddriv").c_str());
}
else
{
diff --git a/src/devices/imagedev/diablo.h b/src/devices/imagedev/diablo.h
index 6cc5530e534..00df1345bbd 100644
--- a/src/devices/imagedev/diablo.h
+++ b/src/devices/imagedev/diablo.h
@@ -33,7 +33,7 @@ public:
virtual bool call_load() override;
virtual bool call_create(int create_format, option_resolution *create_args) override;
virtual void call_unload() override;
- virtual bool call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry) override { load_software_part_region(*this, swlist, swname, start_entry ); return TRUE; }
+ virtual bool call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry) override { device().machine().rom_load().load_software_part_region(*this, swlist, swname, start_entry ); return TRUE; }
virtual iodevice_t image_type() const override { return IO_HARDDISK; }
diff --git a/src/devices/imagedev/flopdrv.cpp b/src/devices/imagedev/flopdrv.cpp
index 4bfa045dae9..71bfd2c7158 100644
--- a/src/devices/imagedev/flopdrv.cpp
+++ b/src/devices/imagedev/flopdrv.cpp
@@ -16,7 +16,6 @@
#include "emu.h"
#include "formats/imageutl.h"
#include "flopdrv.h"
-#include "image.h"
#define VERBOSE 0
#define LOG(x) do { if (VERBOSE) logerror x; } while (0)
diff --git a/src/devices/imagedev/floppy.cpp b/src/devices/imagedev/floppy.cpp
index 786a44e2916..2d6eb4d5460 100644
--- a/src/devices/imagedev/floppy.cpp
+++ b/src/devices/imagedev/floppy.cpp
@@ -12,7 +12,6 @@
#include "zippath.h"
#include "floppy.h"
#include "formats/imageutl.h"
-#include "image.h"
/*
Debugging flags. Set to 0 or 1.
@@ -934,7 +933,7 @@ UINT32 floppy_image_device::get_variant() const
ui_menu *floppy_image_device::get_selection_menu(running_machine &machine, render_container *container)
{
- return auto_alloc_clear(machine, ui_menu_control_floppy_image(machine, container, this));
+ return auto_alloc_clear(machine, <ui_menu_control_floppy_image>(machine, container, this));
}
ui_menu_control_floppy_image::ui_menu_control_floppy_image(running_machine &machine, render_container *container, device_image_interface *_image) : ui_menu_control_device_image(machine, container, _image)
@@ -1011,7 +1010,7 @@ void ui_menu_control_floppy_image::hook_load(std::string filename, bool softlist
can_in_place = false;
}
submenu_result = -1;
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_select_rw(machine(), container, can_in_place, &submenu_result)));
+ ui_menu::stack_push(auto_alloc_clear(machine(), <ui_menu_select_rw>(machine(), container, can_in_place, &submenu_result)));
state = SELECT_RW;
}
@@ -1037,7 +1036,7 @@ void ui_menu_control_floppy_image::handle()
format_array[total_usable++] = i;
}
submenu_result = -1;
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_select_format(machine(), container, format_array, ext_match, total_usable, &submenu_result)));
+ ui_menu::stack_push(auto_alloc_clear(machine(), <ui_menu_select_format>(machine(), container, format_array, ext_match, total_usable, &submenu_result)));
state = SELECT_FORMAT;
break;
@@ -1074,7 +1073,7 @@ void ui_menu_control_floppy_image::handle()
break;
case ui_menu_select_rw::WRITE_OTHER:
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_file_create(machine(), container, image, current_directory, current_file, &create_ok)));
+ ui_menu::stack_push(auto_alloc_clear(machine(), <ui_menu_file_create>(machine(), container, image, current_directory, current_file, &create_ok)));
state = CHECK_CREATE;
break;
diff --git a/src/devices/imagedev/floppy.h b/src/devices/imagedev/floppy.h
index 4d50d74234d..32ec1382801 100644
--- a/src/devices/imagedev/floppy.h
+++ b/src/devices/imagedev/floppy.h
@@ -36,6 +36,9 @@
#define FLOPPY_FORMATS_MEMBER(_member) \
const floppy_format_type _member [] = {
+#define FLOPPY_FORMATS_END0 \
+ , \
+ NULL };
#define FLOPPY_FORMATS_END \
, \
FLOPPY_D88_FORMAT, \
@@ -46,8 +49,8 @@
FLOPPY_MFM_FORMAT, \
FLOPPY_TD0_FORMAT, \
FLOPPY_CQM_FORMAT, \
- FLOPPY_DSK_FORMAT, \
- NULL };
+ FLOPPY_DSK_FORMAT \
+ FLOPPY_FORMATS_END0
class floppy_sound_device;
diff --git a/src/devices/imagedev/harddriv.cpp b/src/devices/imagedev/harddriv.cpp
index 8b0ea459be5..b5fd6ca87dc 100644
--- a/src/devices/imagedev/harddriv.cpp
+++ b/src/devices/imagedev/harddriv.cpp
@@ -99,7 +99,7 @@ void harddisk_image_device::device_start()
m_chd = nullptr;
// try to locate the CHD from a DISK_REGION
- chd_file *handle = get_disk_handle(machine(), tag());
+ chd_file *handle = machine().rom_load().get_disk_handle(tag());
if (handle != nullptr)
{
m_hard_disk_handle = hard_disk_open(handle);
@@ -241,7 +241,7 @@ int harddisk_image_device::internal_load_hd()
/* open the CHD file */
if (software_entry() != nullptr)
{
- m_chd = get_disk_handle(device().machine(), device().subtag("harddriv").c_str());
+ m_chd = machine().rom_load().get_disk_handle(device().subtag("harddriv").c_str());
}
else
{
diff --git a/src/devices/imagedev/harddriv.h b/src/devices/imagedev/harddriv.h
index 7c3da504a5a..b85418e8c33 100644
--- a/src/devices/imagedev/harddriv.h
+++ b/src/devices/imagedev/harddriv.h
@@ -35,7 +35,7 @@ public:
virtual bool call_load() override;
virtual bool call_create(int create_format, option_resolution *create_args) override;
virtual void call_unload() override;
- virtual bool call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry) override { load_software_part_region(*this, swlist, swname, start_entry ); return TRUE; }
+ virtual bool call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry) override { machine().rom_load().load_software_part_region(*this, swlist, swname, start_entry ); return TRUE; }
virtual iodevice_t image_type() const override { return IO_HARDDISK; }
diff --git a/src/devices/machine/53c7xx.cpp b/src/devices/machine/53c7xx.cpp
index f2aad1ad75b..c77baa6a8dc 100644
--- a/src/devices/machine/53c7xx.cpp
+++ b/src/devices/machine/53c7xx.cpp
@@ -854,7 +854,7 @@ void ncr53c7xx_device::step(bool timeout)
if (((m_scntl[0] >> SCNTL0_ARB_SHIFT) & SCNTL0_ARB_MASK) == 3)
{
int win;
- for (win = 7; win >=0 && !(data & (1 << win)); win--);
+ for (win = 7; win >=0 && !(data & (1 << win)); win--) {};
if ((1 << win) != m_scid)
{
diff --git a/src/devices/machine/53c810.cpp b/src/devices/machine/53c810.cpp
index 1323e822d69..2d6b7049016 100644
--- a/src/devices/machine/53c810.cpp
+++ b/src/devices/machine/53c810.cpp
@@ -708,7 +708,7 @@ unsigned lsi53c810_device::lsi53c810_dasm(char *buf, UINT32 pc)
{ 0x00000200, "TARGET" },
{ 0x00000400, "CARRY" }
};
- int need_cojunction = FALSE;
+ int need_cojunction;
/* SET/CLEAR */
switch(op & 0xF8000000)
diff --git a/src/devices/machine/53c810.h b/src/devices/machine/53c810.h
index 7ce9f444d79..49ac2281e2f 100644
--- a/src/devices/machine/53c810.h
+++ b/src/devices/machine/53c810.h
@@ -25,9 +25,6 @@ public:
static void set_dma_callback(device_t &device, lsi53c810_dma_delegate callback) { downcast<lsi53c810_device &>(device).m_dma_cb = callback; }
static void set_fetch_callback(device_t &device, lsi53c810_fetch_delegate callback) { downcast<lsi53c810_device &>(device).m_fetch_cb = callback; }
- void lsi53c810_read_data(int bytes, UINT8 *pData);
- void lsi53c810_write_data(int bytes, UINT8 *pData);
-
UINT8 lsi53c810_reg_r( int offset );
void lsi53c810_reg_w(int offset, UINT8 data);
@@ -65,12 +62,9 @@ private:
void dmaop_load();
void dma_exec();
void add_opcode(UINT8 op, UINT8 mask, opcode_handler_delegate handler);
- void lsi53c810_init();
UINT32 lsi53c810_dasm_fetch(UINT32 pc);
unsigned lsi53c810_dasm(char *buf, UINT32 pc);
- UINT8 last_id;
-
UINT8 scntl0;
UINT8 scntl1;
UINT8 scntl2;
diff --git a/src/devices/machine/6821pia.cpp b/src/devices/machine/6821pia.cpp
index 971d07eee01..a2a08180086 100644
--- a/src/devices/machine/6821pia.cpp
+++ b/src/devices/machine/6821pia.cpp
@@ -14,7 +14,7 @@
// MACROS
//**************************************************************************
-#define VERBOSE 1
+#define VERBOSE 0
#define LOG(x) do { if (VERBOSE) logerror x; } while (0)
diff --git a/src/devices/machine/68230pit.cpp b/src/devices/machine/68230pit.cpp
index cb066344784..927ece2cb75 100644
--- a/src/devices/machine/68230pit.cpp
+++ b/src/devices/machine/68230pit.cpp
@@ -190,7 +190,7 @@ LOG (static INT32 or_data = 0)
LOG (static INT32 or_ofs = 0)
READ8_MEMBER (pit68230_device::read){
- UINT8 data = 0;
+ UINT8 data;
switch (offset) {
case PIT_68230_PGCR:
diff --git a/src/devices/machine/68307.cpp b/src/devices/machine/68307.cpp
index 2c3649023be..cbdd2c1eed8 100644
--- a/src/devices/machine/68307.cpp
+++ b/src/devices/machine/68307.cpp
@@ -307,7 +307,7 @@ WRITE16_MEMBER( m68307cpu_device::m68307_internal_base_w )
int pc = space.device().safe_pc();
logerror("%08x m68307_internal_base_w %08x, %04x (%04x)\n", pc, offset*2,data,mem_mask);
- int base = 0;
+ int base;
//int mask = 0;
switch (offset<<1)
diff --git a/src/devices/machine/68307.h b/src/devices/machine/68307.h
index 555a1ec39e3..60ae61db49a 100644
--- a/src/devices/machine/68307.h
+++ b/src/devices/machine/68307.h
@@ -109,7 +109,6 @@ public:
m68307_portb_write_delegate m_m68307_portb_w;
void init16_m68307(address_space &space);
- void init_cpu_m68307(void);
virtual UINT32 disasm_min_opcode_bytes() const override { return 2; };
virtual UINT32 disasm_max_opcode_bytes() const override { return 10; };
diff --git a/src/devices/machine/74123.h b/src/devices/machine/74123.h
index b44354b456b..898dd48e6ea 100644
--- a/src/devices/machine/74123.h
+++ b/src/devices/machine/74123.h
@@ -125,10 +125,8 @@ private:
int timer_running();
void start_pulse();
- void output(INT32 param);
void set_output();
attotime compute_duration();
- void clear();
emu_timer *m_timer;
int m_connection_type; /* the hook up type - one of the constants above */
diff --git a/src/devices/machine/adc1213x.cpp b/src/devices/machine/adc1213x.cpp
index f6104f273e3..b3aec60a8e7 100644
--- a/src/devices/machine/adc1213x.cpp
+++ b/src/devices/machine/adc1213x.cpp
@@ -127,7 +127,7 @@ void adc12138_device::convert(int channel, int bits16, int lsbfirst)
{
int bits;
int input_value;
- double input = 0;
+ double input;
if (bits16)
fatalerror("ADC1213X: 16-bit mode not supported\n");
diff --git a/src/devices/machine/akiko.cpp b/src/devices/machine/akiko.cpp
index 0c7ef441ad2..6a2772187f8 100644
--- a/src/devices/machine/akiko.cpp
+++ b/src/devices/machine/akiko.cpp
@@ -170,7 +170,7 @@ void akiko_device::device_reset()
else
{
// MAME case
- m_cdrom = cdrom_open(get_disk_handle(machine(), ":cdrom"));
+ m_cdrom = cdrom_open(machine().rom_load().get_disk_handle(":cdrom"));
m_cdrom_is_device = 0;
}
@@ -187,10 +187,10 @@ void akiko_device::device_reset()
m_cdrom_numtracks = cdrom_get_last_track(m_cdrom)+3;
- m_cdrom_toc = auto_alloc_array(machine(), UINT8, 13*m_cdrom_numtracks);
- memset( m_cdrom_toc, 0, 13*m_cdrom_numtracks);
+ m_cdrom_toc = std::make_unique<UINT8[]>(13*m_cdrom_numtracks);
+ memset( m_cdrom_toc.get(), 0, 13*m_cdrom_numtracks);
- p = m_cdrom_toc;
+ p = m_cdrom_toc.get();
p[1] = ((addrctrl & 0x0f) << 4) | ((addrctrl & 0xf0) >> 4);
p[3] = 0xa0; /* first track */
p[8] = 1;
@@ -471,7 +471,7 @@ TIMER_CALLBACK_MEMBER(akiko_device::dma_proc)
{
amiga_state *amiga = machine().driver_data<amiga_state>();
UINT32 track = cdrom_get_track( m_cdrom, m_cdrom_lba_cur );
- UINT32 datasize = cdrom_get_toc( m_cdrom )->tracks[track].datasize;
+ UINT32 datasize;// = cdrom_get_toc(m_cdrom)->tracks[track].datasize;
UINT32 subsize = cdrom_get_toc( m_cdrom )->tracks[track].subsize;
int i;
diff --git a/src/devices/machine/akiko.h b/src/devices/machine/akiko.h
index 6886a4073a4..3fd1b586fb6 100644
--- a/src/devices/machine/akiko.h
+++ b/src/devices/machine/akiko.h
@@ -113,7 +113,7 @@ private:
cdda_device *m_cdda;
cdrom_file *m_cdrom;
- UINT8 *m_cdrom_toc;
+ std::unique_ptr<UINT8[]> m_cdrom_toc;
emu_timer *m_dma_timer;
emu_timer *m_frame_timer;
diff --git a/src/devices/machine/amigafdc.cpp b/src/devices/machine/amigafdc.cpp
index e6cbe2911ae..d71b4f458dc 100644
--- a/src/devices/machine/amigafdc.cpp
+++ b/src/devices/machine/amigafdc.cpp
@@ -432,13 +432,13 @@ void amiga_fdc::setup_leds()
floppy == floppy_devices[2] ? 2 :
3;
- output_set_value("drive_0_led", drive == 0);
- output_set_value("drive_1_led", drive == 1);
- output_set_value("drive_2_led", drive == 2);
- output_set_value("drive_3_led", drive == 3);
+ machine().output().set_value("drive_0_led", drive == 0);
+ machine().output().set_value("drive_1_led", drive == 1);
+ machine().output().set_value("drive_2_led", drive == 2);
+ machine().output().set_value("drive_3_led", drive == 3);
- set_led_status(machine(), 1, drive == 0); /* update internal drive led */
- set_led_status(machine(), 2, drive == 1); /* update external drive led */
+ machine().output().set_led_value(1, drive == 0); /* update internal drive led */
+ machine().output().set_led_value(2, drive == 1); /* update external drive led */
}
}
@@ -471,7 +471,7 @@ WRITE8_MEMBER( amiga_fdc::ciaaprb_w )
floppy->dir_w((data >> 1) & 1);
floppy->stp_w(data & 1);
floppy->mon_w((data >> 7) & 1);
- output_set_value("fdc_led", data & 0x80); // LED directly connected to FDC motor
+ machine().output().set_value("fdc_led", data & 0x80); // LED directly connected to FDC motor
}
if(floppy) {
diff --git a/src/devices/machine/at29x.cpp b/src/devices/machine/at29x.cpp
index 440645b4c00..bb2bdd8b8b9 100644
--- a/src/devices/machine/at29x.cpp
+++ b/src/devices/machine/at29x.cpp
@@ -108,7 +108,7 @@ at29c040a_device::at29c040a_device(const machine_config &mconfig, const char *ta
void at29x_device::nvram_default()
{
- memset(m_eememory, 0, m_memory_size+2);
+ memset(m_eememory.get(), 0, m_memory_size+2);
}
//-------------------------------------------------
@@ -118,7 +118,7 @@ void at29x_device::nvram_default()
void at29x_device::nvram_read(emu_file &file)
{
- file.read(m_eememory, m_memory_size+2);
+ file.read(m_eememory.get(), m_memory_size+2);
}
//-------------------------------------------------
@@ -131,7 +131,7 @@ void at29x_device::nvram_write(emu_file &file)
// If we don't write (because there were no changes), the file will be wiped
if (TRACE_PRG) logerror("%s: Write to NVRAM file\n", tag());
m_eememory[0] = m_version;
- file.write(m_eememory, m_memory_size+2);
+ file.write(m_eememory.get(), m_memory_size+2);
}
/*
@@ -157,7 +157,7 @@ void at29x_device::device_timer(emu_timer &timer, device_timer_id id, int param,
case PGM_3:
// Programming cycle end; now burn the buffer into the flash EEPROM
- memcpy(m_eememory + 2 + get_sector_number(m_programming_last_offset) * m_sector_size, m_programming_buffer, m_sector_size);
+ memcpy(m_eememory.get() + 2 + get_sector_number(m_programming_last_offset) * m_sector_size, m_programming_buffer.get(), m_sector_size);
if (TRACE_PRG) logerror("%s: Sector write completed at location %04x\n", tag(), m_programming_last_offset);
@@ -366,7 +366,7 @@ WRITE8_MEMBER( at29x_device::write )
else
{
if (TRACE_STATE) logerror("%s: Erase chip\n", tag());
- memset(m_eememory+2, 0xff, m_memory_size);
+ memset(m_eememory.get()+2, 0xff, m_memory_size);
}
}
break;
@@ -460,7 +460,7 @@ WRITE8_MEMBER( at29x_device::write )
{ // enter programming mode
if (TRACE_STATE) logerror("%s: Enter programming mode (m_pgm=%d, m_sdp=%d)\n", tag(), m_pgm, m_sdp);
// Clear the programming buffer
- memset(m_programming_buffer, 0xff, m_sector_size);
+ memset(m_programming_buffer.get(), 0xff, m_sector_size);
m_pgm = PGM_2;
}
}
@@ -479,8 +479,8 @@ WRITE8_MEMBER( at29x_device::write )
void at29x_device::device_start(void)
{
- m_programming_buffer = global_alloc_array(UINT8, m_sector_size);
- m_eememory = global_alloc_array(UINT8, m_memory_size+2);
+ m_programming_buffer = std::make_unique<UINT8[]>(m_sector_size);
+ m_eememory = std::make_unique<UINT8[]>(m_memory_size+2);
m_programming_timer = timer_alloc(PRGTIMER);
// TODO: Complete 16-bit handling
@@ -490,8 +490,8 @@ void at29x_device::device_start(void)
void at29x_device::device_stop(void)
{
- global_free_array(m_programming_buffer);
- global_free_array(m_eememory);
+ m_programming_buffer = nullptr;
+ m_eememory = nullptr;
}
void at29x_device::device_reset(void)
diff --git a/src/devices/machine/at29x.h b/src/devices/machine/at29x.h
index 6c8eb6531eb..924a17e0f70 100644
--- a/src/devices/machine/at29x.h
+++ b/src/devices/machine/at29x.h
@@ -63,7 +63,7 @@ protected:
private:
void sync_flags(void);
- UINT8* m_eememory;
+ std::unique_ptr<UINT8[]> m_eememory;
bool m_lower_bbl; // set when lower boot block lockout is enabled
bool m_higher_bbl; // set when upper boot block lockout is enabled
@@ -78,7 +78,7 @@ private:
bool m_disabling_sdb; // set when a sdp disable command is in progress
bool m_toggle_bit; // indicates flashing in progress (toggles for each query)
- UINT8* m_programming_buffer;
+ std::unique_ptr<UINT8[]> m_programming_buffer;
int m_programming_last_offset;
emu_timer* m_programming_timer;
};
diff --git a/src/devices/machine/atahle.h b/src/devices/machine/atahle.h
index 1841bdb2be8..e26ad86b92c 100644
--- a/src/devices/machine/atahle.h
+++ b/src/devices/machine/atahle.h
@@ -33,9 +33,6 @@ public:
virtual DECLARE_WRITE_LINE_MEMBER(write_dasp) override;
virtual DECLARE_WRITE_LINE_MEMBER(write_dmack) override;
virtual DECLARE_WRITE_LINE_MEMBER(write_pdiag) override;
-
- TIMER_CALLBACK_MEMBER(buffer_empty_timer_work);
-
protected:
virtual void device_start() override;
virtual void device_reset() override;
@@ -129,6 +126,7 @@ protected:
IDE_COMMAND_IDENTIFY_DEVICE = 0xec,
IDE_COMMAND_SET_FEATURES = 0xef,
IDE_COMMAND_SECURITY_UNLOCK = 0xf2,
+ IDE_COMMAND_SECURITY_DISABLE_PASSWORD = 0xf6,
IDE_COMMAND_READ_NATIVE_MAX_ADDRESS = 0xf8,
IDE_COMMAND_SET_MAX = 0xf9
};
diff --git a/src/devices/machine/atapihle.cpp b/src/devices/machine/atapihle.cpp
index dcbc00fb26c..1216e7a91ad 100644
--- a/src/devices/machine/atapihle.cpp
+++ b/src/devices/machine/atapihle.cpp
@@ -97,9 +97,13 @@ void atapi_hle_device::fill_buffer()
{
m_buffer_size = m_data_size;
}
- else if (m_buffer_size & 1)
+ else
{
- m_buffer_size--;
+ if (m_buffer_size & 1)
+ m_buffer_size--;
+ // if it is transferring less than the remaining data, make sure the size is a multiple of the sector size, otherwise data will be lost
+ if (m_buffer_size % m_sector_bytes)
+ m_buffer_size = m_buffer_size - (m_buffer_size % m_sector_bytes);
}
m_cylinder_low = m_buffer_size & 0xff;
diff --git a/src/devices/machine/diablo_hd.cpp b/src/devices/machine/diablo_hd.cpp
index f067acd4742..f833cf54504 100644
--- a/src/devices/machine/diablo_hd.cpp
+++ b/src/devices/machine/diablo_hd.cpp
@@ -87,7 +87,6 @@ diablo_hd_device::diablo_hd_device(const machine_config &mconfig, const char *ta
m_head(-1),
m_sector(-1),
m_page(-1),
- m_cache(nullptr),
m_bits(nullptr),
m_rdfirst(-1),
m_rdlast(-1),
@@ -310,13 +309,12 @@ void diablo_hd_device::read_sector()
if (m_disk) {
// allocate a buffer for this page
- m_cache[m_page] = auto_alloc_array(machine(), UINT8, sizeof(diablo_sector_t));
+ m_cache[m_page] = std::make_unique<UINT8[]>(sizeof(diablo_sector_t));
// and read the page from the hard_disk image
- if (hard_disk_read(m_disk, m_page, m_cache[m_page])) {
+ if (hard_disk_read(m_disk, m_page, m_cache[m_page].get())) {
LOG_DRIVE((2,"[DHD%u] CHS:%03d/%d/%02d => page:%d loaded\n", m_unit, m_cylinder, m_head, m_sector, m_page));
} else {
LOG_DRIVE((0,"[DHD%u] CHS:%03d/%d/%02d => page:%d read failed\n", m_unit, m_cylinder, m_head, m_sector, m_page));
- auto_free(machine(), m_cache[m_page]);
m_cache[m_page] = nullptr;
}
} else {
@@ -442,7 +440,7 @@ UINT32* diablo_hd_device::expand_sector()
LOG_DRIVE((0,"[DHD%u] no image for page #%d\n", m_unit, m_page));
return nullptr;
}
- diablo_sector_t *s = reinterpret_cast<diablo_sector_t *>(m_cache[m_page]);
+ diablo_sector_t *s = reinterpret_cast<diablo_sector_t *>(m_cache[m_page].get());
/* allocate a bits image */
UINT32 *bits = auto_alloc_array_clear(machine(), UINT32, 400);
@@ -727,7 +725,7 @@ void diablo_hd_device::squeeze_sector()
UINT32 *bits = m_bits[m_page];
// pointer to sector buffer
- s = reinterpret_cast<diablo_sector_t *>(m_cache[m_page]);
+ s = reinterpret_cast<diablo_sector_t *>(m_cache[m_page].get());
// zap the sector first
memset(s, 0, sizeof(*s));
@@ -778,7 +776,7 @@ void diablo_hd_device::squeeze_sector()
m_bits[m_page] = nullptr;
if (m_disk) {
- if (!hard_disk_write(m_disk, m_page, m_cache[m_page])) {
+ if (!hard_disk_write(m_disk, m_page, m_cache[m_page].get())) {
LOG_DRIVE((0,"[DHD%u] write failed for page #%d\n", m_unit, m_page));
}
} else {
@@ -1334,9 +1332,7 @@ void diablo_hd_device::device_reset()
if (m_cache) {
for (int page = 0; page < m_pages; page++)
if (m_cache[page])
- auto_free(machine(), m_cache[page]);
- auto_free(machine(), m_cache);
- m_cache = nullptr;
+ m_cache[page] = nullptr;
}
// free previous bits cache
if (m_bits) {
@@ -1406,7 +1402,6 @@ void diablo_hd_device::device_reset()
if (!m_handle)
return;
// for units with a CHD assigned to them start the timer
- m_cache = auto_alloc_array_clear(machine(), UINT8*, m_pages);
m_bits = auto_alloc_array_clear(machine(), UINT32*, m_pages);
timer_set(m_sector_time - m_sector_mark_0_time, 1, 0);
read_sector();
diff --git a/src/devices/machine/diablo_hd.h b/src/devices/machine/diablo_hd.h
index 19b1b5c776b..c3fadd2a073 100644
--- a/src/devices/machine/diablo_hd.h
+++ b/src/devices/machine/diablo_hd.h
@@ -108,7 +108,7 @@ private:
int m_head; //!< current head (track) number on cylinder
int m_sector; //!< current sector number in track
int m_page; //!< current page (derived from cylinder, head and sector)
- UINT8** m_cache; //!< pages raw bytes
+ std::unique_ptr<UINT8[]> m_cache[2 * DIABLO_PAGES]; //!< pages raw bytes
UINT32** m_bits; //!< pages expanded to bits
int m_rdfirst; //!< set to first bit of a sector that is read from
int m_rdlast; //!< set to last bit of a sector that was read from
diff --git a/src/devices/machine/dp8390.h b/src/devices/machine/dp8390.h
index 09dd590f176..49341e30e49 100644
--- a/src/devices/machine/dp8390.h
+++ b/src/devices/machine/dp8390.h
@@ -72,7 +72,6 @@ private:
void set_cr(UINT8 newcr);
void check_dma_complete();
void do_tx();
- bool mcast_ck(const UINT8 *buf, int len);
void check_irq() { m_irq_cb((m_regs.imr & m_regs.isr & 0x7f)?ASSERT_LINE:CLEAR_LINE); }
void recv_overflow();
void stop();
diff --git a/src/devices/machine/ds1315.cpp b/src/devices/machine/ds1315.cpp
index 5764158cefe..e9c984e4716 100644
--- a/src/devices/machine/ds1315.cpp
+++ b/src/devices/machine/ds1315.cpp
@@ -231,7 +231,7 @@ READ8_MEMBER(ds1315_device::write_data)
void ds1315_device::input_raw_data()
{
- int raw[8], i, j=0;
+ int raw[8], i, j;
raw[0] = raw[1] = raw[2] = raw[3] = raw[4] = raw[5] = raw[6] = raw[7] = 0;
UINT8 flag = 1;
diff --git a/src/devices/machine/gayle.cpp b/src/devices/machine/gayle.cpp
index bf56f2aaf9e..93ea9034eb0 100644
--- a/src/devices/machine/gayle.cpp
+++ b/src/devices/machine/gayle.cpp
@@ -188,7 +188,7 @@ WRITE_LINE_MEMBER( gayle_device::ide_interrupt_w )
READ16_MEMBER( gayle_device::gayle_id_r )
{
- UINT16 data = 0xffff;
+ UINT16 data;
if (ACCESSING_BITS_8_15)
data = ((m_gayle_id << m_gayle_id_count++) & 0x80) << 8;
diff --git a/src/devices/machine/hdc92x4.cpp b/src/devices/machine/hdc92x4.cpp
index f433a7a2edd..54a8f802b99 100644
--- a/src/devices/machine/hdc92x4.cpp
+++ b/src/devices/machine/hdc92x4.cpp
@@ -568,7 +568,7 @@ bool hdc92x4_device::using_floppy()
*/
int hdc92x4_device::step_time()
{
- int time = 0;
+ int time;
int index = m_register_w[MODE] & MO_STEPRATE;
// Get seek time.
if (m_selected_drive_type == TYPE_FLOPPY8)
@@ -588,7 +588,7 @@ int hdc92x4_device::step_time()
*/
int hdc92x4_device::pulse_width()
{
- int time = 0;
+ int time;
// Get seek time.
if (m_selected_drive_type == TYPE_FLOPPY8)
time = pulse_flop8;
@@ -1319,7 +1319,7 @@ void hdc92x4_device::tape_backup()
*/
void hdc92x4_device::poll_drives()
{
- UINT8 drivebit = 0;
+ UINT8 drivebit;
if (m_substate == UNDEF)
{
logerror("%s: POLL DRIVES command %02x\n", tag(), current_command());
@@ -3795,7 +3795,7 @@ bool hdc92x4_device::read_from_mfmhd(const attotime &limit)
*/
bool hdc92x4_device::write_to_mfmhd(const attotime &limit)
{
- UINT16 data = 0;
+ UINT16 data;
int count;
bool offlimit = false;
@@ -3918,7 +3918,7 @@ UINT16 hdc92x4_device::encode_a1_hd()
*/
READ8_MEMBER( hdc92x4_device::read )
{
- UINT8 reply = 0;
+ UINT8 reply;
if ((offset & 1) == 0)
{
// Data register
diff --git a/src/devices/machine/i8255.cpp b/src/devices/machine/i8255.cpp
index 7725565cde2..7e6a769f904 100644
--- a/src/devices/machine/i8255.cpp
+++ b/src/devices/machine/i8255.cpp
@@ -313,7 +313,7 @@ void i8255_device::device_reset()
UINT8 i8255_device::read_mode0(int port)
{
- UINT8 data = 0;
+ UINT8 data;
if (port_mode(port) == MODE_OUTPUT)
{
@@ -336,7 +336,7 @@ UINT8 i8255_device::read_mode0(int port)
UINT8 i8255_device::read_mode1(int port)
{
- UINT8 data = 0;
+ UINT8 data;
if (port_mode(port) == MODE_OUTPUT)
{
@@ -368,7 +368,7 @@ UINT8 i8255_device::read_mode1(int port)
UINT8 i8255_device::read_mode2()
{
- UINT8 data = 0;
+ UINT8 data;
// read data from input latch
data = m_input[PORT_A];
diff --git a/src/devices/machine/i8271.cpp b/src/devices/machine/i8271.cpp
index 3d1d602dd74..cd8c0faf5bf 100644
--- a/src/devices/machine/i8271.cpp
+++ b/src/devices/machine/i8271.cpp
@@ -1541,7 +1541,6 @@ void i8271_device::device_timer(emu_timer &timer, device_timer_id id, int param,
void i8271_device::index_callback(floppy_image_device *floppy, int state)
{
for(auto & fi : flopi) {
-
if(fi.dev != floppy)
continue;
diff --git a/src/devices/machine/i8271.h b/src/devices/machine/i8271.h
index dcc5f470713..e4409bed389 100644
--- a/src/devices/machine/i8271.h
+++ b/src/devices/machine/i8271.h
@@ -244,8 +244,6 @@ private:
void set_irq(bool state);
bool get_ready(int fid);
- void enable_transfer();
- void disable_transfer();
int calc_sector_size(UINT8 size);
int check_command();
diff --git a/src/devices/machine/i8279.cpp b/src/devices/machine/i8279.cpp
index d336dd80858..725d1aa4827 100644
--- a/src/devices/machine/i8279.cpp
+++ b/src/devices/machine/i8279.cpp
@@ -206,11 +206,11 @@ void i8279_device::set_irq(bool state)
void i8279_device::new_key(UINT8 data, bool skey, bool ckey)
{
UINT8 i, rl, sl;
- for (i = 0; BIT(data, i); i++);
+ for (i = 0; BIT(data, i); i++) {};
rl = i;
if (BIT(m_cmd[0], 0))
{
- for (i = 0; !BIT(data, i); i++);
+ for (i = 0; !BIT(data, i); i++) {};
sl = i;
}
else
@@ -315,7 +315,7 @@ void i8279_device::timer_mainloop()
UINT8 addr = m_scanner &7;
if (decoded)
- for (addr=0; !BIT(m_scanner, addr); addr++);
+ for (addr=0; !BIT(m_scanner, addr); addr++) {};
rl ^= 0xff; // inverted
assert(addr < ARRAY_LENGTH(m_s_ram));
diff --git a/src/devices/machine/i8279.h b/src/devices/machine/i8279.h
index c5e56239b9e..3da46da3121 100644
--- a/src/devices/machine/i8279.h
+++ b/src/devices/machine/i8279.h
@@ -106,9 +106,7 @@ private:
void clear_display();
void new_key(UINT8 data, bool skey, bool ckey);
void new_fifo(UINT8 data);
- UINT8 get_segments();
void set_irq(bool state);
- void set_display_mode(UINT8 data);
devcb_write_line m_out_irq_cb; // IRQ
devcb_write8 m_out_sl_cb; // Scanlines SL0-3
diff --git a/src/devices/machine/i8355.h b/src/devices/machine/i8355.h
index 037e281cd70..7337fa0193d 100644
--- a/src/devices/machine/i8355.h
+++ b/src/devices/machine/i8355.h
@@ -84,7 +84,6 @@ public:
DECLARE_WRITE8_MEMBER( io_w );
DECLARE_READ8_MEMBER( memory_r );
- DECLARE_WRITE8_MEMBER( memory_w );
protected:
// device-level overrides
diff --git a/src/devices/machine/idehd.cpp b/src/devices/machine/idehd.cpp
index a9205ed02fe..c17e4258fbc 100644
--- a/src/devices/machine/idehd.cpp
+++ b/src/devices/machine/idehd.cpp
@@ -60,7 +60,7 @@ static void swap_strncpy(UINT16 *dst, const char *src, int field_size_in_words)
{
for (int i = 0; i < field_size_in_words; i++)
{
- UINT16 d = 0;
+ UINT16 d;
if (*src)
{
@@ -404,7 +404,7 @@ void ata_mass_storage_device::fill_buffer()
void ata_mass_storage_device::finished_read()
{
- int lba = lba_address(), count = 0;
+ int lba = lba_address(), count;
set_dasp(CLEAR_LINE);
@@ -506,6 +506,10 @@ void ata_mass_storage_device::process_buffer()
if (m_master_password_enable || m_user_password_enable)
security_error();
}
+ else if (m_command == IDE_COMMAND_SECURITY_DISABLE_PASSWORD)
+ {
+ LOGPRINT(("IDE Done unimplemented SECURITY_DISABLE_PASSWORD command\n"));
+ }
else
{
set_dasp(ASSERT_LINE);
@@ -534,7 +538,7 @@ void ata_mass_storage_device::process_buffer()
void ata_mass_storage_device::finished_write()
{
- int lba = lba_address(), count = 0;
+ int lba = lba_address(), count;
set_dasp(CLEAR_LINE);
@@ -685,6 +689,15 @@ void ata_mass_storage_device::process_command()
set_irq(ASSERT_LINE);
break;
+ case IDE_COMMAND_SECURITY_DISABLE_PASSWORD:
+ LOGPRINT(("IDE Unimplemented SECURITY DISABLE PASSWORD command\n"));
+
+ /* mark the buffer ready */
+ m_status |= IDE_STATUS_DRQ;
+
+ set_irq(ASSERT_LINE);
+ break;
+
case IDE_COMMAND_IDENTIFY_DEVICE:
LOGPRINT(("IDE Identify device\n"));
diff --git a/src/devices/machine/intelfsh.cpp b/src/devices/machine/intelfsh.cpp
index 9fdc04609c1..54f9d4f722f 100644
--- a/src/devices/machine/intelfsh.cpp
+++ b/src/devices/machine/intelfsh.cpp
@@ -103,6 +103,7 @@ const device_type SST_39VF020 = &device_creator<sst_39vf020_device>;
const device_type SHARP_LH28F400 = &device_creator<sharp_lh28f400_device>;
const device_type INTEL_E28F008SA = &device_creator<intel_e28f008sa_device>;
const device_type INTEL_TE28F160 = &device_creator<intel_te28f160_device>;
+const device_type INTEL_TE28F320 = &device_creator<intel_te28f320_device>;
const device_type SHARP_UNK128MBIT = &device_creator<sharp_unk128mbit_device>;
const device_type INTEL_28F320J3D = &device_creator<intel_28f320j3d_device>;
const device_type INTEL_28F320J5 = &device_creator<intel_28f320j5_device>;
@@ -327,6 +328,13 @@ intelfsh_device::intelfsh_device(const machine_config &mconfig, device_type type
m_device_id = 0xd0;
map = ADDRESS_MAP_NAME( memory_map16_16Mb );
break;
+ case FLASH_INTEL_TE28F320:
+ m_bits = 16;
+ m_size = 0x400000;
+ m_maker_id = MFG_INTEL;
+ m_device_id = 0x8896;
+ map = ADDRESS_MAP_NAME( memory_map16_32Mb );
+ break;
case FLASH_SHARP_UNK128MBIT:
m_bits = 16;
m_size = 0x800000;
@@ -460,6 +468,9 @@ sharp_lh28f400_device::sharp_lh28f400_device(const machine_config &mconfig, cons
intel_te28f160_device::intel_te28f160_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: intelfsh16_device(mconfig, INTEL_TE28F160, "Intel TE28F160 Flash", tag, owner, clock, FLASH_INTEL_TE28F160, "intel_te28f160", __FILE__) { }
+intel_te28f320_device::intel_te28f320_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : intelfsh16_device(mconfig, INTEL_TE28F320, "Intel TE28F320 Flash", tag, owner, clock, FLASH_INTEL_TE28F320, "intel_te28f320", __FILE__) { }
+
intel_e28f400b_device::intel_e28f400b_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: intelfsh16_device(mconfig, INTEL_E28F400B, "Intel E28F400B Flash", tag, owner, clock, FLASH_INTEL_E28F400B, "intel_e28f400b", __FILE__) { }
diff --git a/src/devices/machine/intelfsh.h b/src/devices/machine/intelfsh.h
index c52856e0cef..437d8c946c2 100644
--- a/src/devices/machine/intelfsh.h
+++ b/src/devices/machine/intelfsh.h
@@ -78,6 +78,9 @@
#define MCFG_INTEL_TE28F160_ADD(_tag) \
MCFG_DEVICE_ADD(_tag, INTEL_TE28F160, 0)
+#define MCFG_INTEL_TE28F320_ADD(_tag) \
+ MCFG_DEVICE_ADD(_tag, INTEL_TE28F320, 0)
+
#define MCFG_SHARP_UNK128MBIT_ADD(_tag) \
MCFG_DEVICE_ADD(_tag, SHARP_UNK128MBIT, 0)
@@ -135,6 +138,7 @@ public:
FLASH_SHARP_LH28F400 = 0x1000,
FLASH_INTEL_E28F400B,
FLASH_INTEL_TE28F160,
+ FLASH_INTEL_TE28F320,
FLASH_SHARP_UNK128MBIT,
FLASH_INTEL_28F320J3D,
FLASH_INTEL_28F320J5,
@@ -362,6 +366,12 @@ public:
intel_te28f160_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
};
+class intel_te28f320_device : public intelfsh16_device
+{
+public:
+ intel_te28f320_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+};
+
class intel_e28f400b_device : public intelfsh16_device
{
public:
@@ -419,6 +429,7 @@ extern const device_type SST_39VF020;
extern const device_type SHARP_LH28F400;
extern const device_type INTEL_E28F008SA;
extern const device_type INTEL_TE28F160;
+extern const device_type INTEL_TE28F320;
extern const device_type SHARP_UNK128MBIT;
extern const device_type INTEL_28F320J3D;
extern const device_type INTEL_28F320J5;
diff --git a/src/devices/machine/k053252.cpp b/src/devices/machine/k053252.cpp
index 6e3a612a1e8..45020926ace 100644
--- a/src/devices/machine/k053252.cpp
+++ b/src/devices/machine/k053252.cpp
@@ -124,6 +124,11 @@ void k053252_device::device_reset()
m_regs[0x08] = 1; // Xexex apparently does a wrong assignment for VC (sets up the INT enable register instead)
+ reset_internal_state();
+}
+
+void k053252_device::reset_internal_state()
+{
m_hc=0;
m_hfp=0;
m_hbp=0;
@@ -134,7 +139,6 @@ void k053252_device::device_reset()
m_hsw=0;
}
-
/*****************************************************************************
DEVICE HANDLERS
*****************************************************************************/
@@ -170,9 +174,6 @@ void k053252_device::res_change()
//VC - VFP - VBP - (VSW+1)
attoseconds_t refresh = HZ_TO_ATTOSECONDS(clock()) * (m_hc) * m_vc;
- //printf("H %d %d %d %d\n",m_hc,m_hfp,m_hbp,m_hsw);
- //printf("V %d %d %d %d\n",m_vc,m_vfp,m_vbp,m_vsw);
-
visarea.min_x = m_offsx;
visarea.min_y = m_offsy;
visarea.max_x = m_offsx + m_hc - m_hfp - m_hbp - 8*(m_hsw) - 1;
@@ -182,6 +183,16 @@ void k053252_device::res_change()
if (m_slave_screen)
m_slave_screen->configure(m_hc, m_vc, visarea, refresh);
+
+#if 0
+ attoseconds_t hsync = HZ_TO_ATTOSECONDS(clock()) * (m_hc);
+ printf("H %d HFP %d HSW %d HBP %d\n",m_hc,m_hfp,m_hsw*8,m_hbp);
+ printf("V %d VFP %d VSW %d VBP %d\n",m_vc,m_vfp,m_vsw,m_vbp);
+ // L stands for Legacy ...
+ printf("L %d %d\n",m_offsx,m_offsy);
+ printf("Screen params: Clock: %u V-Sync %.2f H-Sync %.f\n",clock(),ATTOSECONDS_TO_HZ(refresh),ATTOSECONDS_TO_HZ(hsync));
+ printf("visible screen area: %d x %d\n\n",(visarea.max_x - visarea.min_x) + 1,(visarea.max_y - visarea.min_y) + 1);
+#endif
}
}
@@ -240,7 +251,7 @@ WRITE8_MEMBER( k053252_device::write )
logerror("%02x VSW / %02x HSW set\n",m_vsw,m_hsw);
res_change();
break;
-
+
//case 0x0d: m_int_time(data); break;
case 0x0e: m_int1_ack_cb(1); break;
case 0x0f: m_int2_ack_cb(1); break;
diff --git a/src/devices/machine/k053252.h b/src/devices/machine/k053252.h
index 70ec6f4f376..a00743789ad 100644
--- a/src/devices/machine/k053252.h
+++ b/src/devices/machine/k053252.h
@@ -49,6 +49,7 @@ public:
void res_change();
+
static void static_set_slave_screen(device_t &device, const char *tag);
@@ -56,7 +57,8 @@ protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
- virtual void device_clock_changed() override { res_change(); }
+ virtual void device_clock_changed() override { reset_internal_state(); }
+ void reset_internal_state();
private:
// internal state
@@ -73,7 +75,7 @@ protected:
int m_offsx;
int m_offsy;
- const char * m_slave_screen_tag;
+ const char * m_slave_screen_tag;
screen_device * m_slave_screen;
};
diff --git a/src/devices/machine/laserdsc.cpp b/src/devices/machine/laserdsc.cpp
index b8ecf53611c..50e6dc09836 100644
--- a/src/devices/machine/laserdsc.cpp
+++ b/src/devices/machine/laserdsc.cpp
@@ -321,7 +321,7 @@ void laserdisc_device::device_start()
init_audio();
// register callbacks
- config_register(machine(), "laserdisc", config_saveload_delegate(FUNC(laserdisc_device::config_load), this), config_saveload_delegate(FUNC(laserdisc_device::config_save), this));
+ machine().configuration().config_register("laserdisc", config_saveload_delegate(FUNC(laserdisc_device::config_load), this), config_saveload_delegate(FUNC(laserdisc_device::config_save), this));
}
@@ -737,7 +737,7 @@ void laserdisc_device::init_disc()
if (!m_getdisc_callback.isnull())
m_disc = m_getdisc_callback(*this);
else
- m_disc = get_disk_handle(machine(), tag());
+ m_disc = machine().rom_load().get_disk_handle(tag());
// set default parameters
m_width = 720;
@@ -805,7 +805,7 @@ void laserdisc_device::init_video()
for (auto & frame : m_frame)
{
// first allocate a YUY16 bitmap at 2x the height
-
+
frame.m_bitmap.allocate(m_width, m_height * 2);
frame.m_bitmap.set_palette(m_videopalette);
fillbitmap_yuy16(frame.m_bitmap, 40, 109, 240);
@@ -1142,10 +1142,10 @@ void laserdisc_device::process_track_data()
// configuration file
//-------------------------------------------------
-void laserdisc_device::config_load(int config_type, xml_data_node *parentnode)
+void laserdisc_device::config_load(config_type cfg_type, xml_data_node *parentnode)
{
// we only care about game files
- if (config_type != CONFIG_TYPE_GAME)
+ if (cfg_type != config_type::CONFIG_TYPE_GAME)
return;
// might not have any data
@@ -1178,10 +1178,10 @@ void laserdisc_device::config_load(int config_type, xml_data_node *parentnode)
// file
//-------------------------------------------------
-void laserdisc_device::config_save(int config_type, xml_data_node *parentnode)
+void laserdisc_device::config_save(config_type cfg_type, xml_data_node *parentnode)
{
// we only care about game files
- if (config_type != CONFIG_TYPE_GAME)
+ if (cfg_type != config_type::CONFIG_TYPE_GAME)
return;
// create a node
diff --git a/src/devices/machine/laserdsc.h b/src/devices/machine/laserdsc.h
index 0980bbb9f13..c550a9f61aa 100644
--- a/src/devices/machine/laserdsc.h
+++ b/src/devices/machine/laserdsc.h
@@ -284,8 +284,8 @@ private:
void read_track_data();
static void *read_async_static(void *param, int threadid);
void process_track_data();
- void config_load(int config_type, xml_data_node *parentnode);
- void config_save(int config_type, xml_data_node *parentnode);
+ void config_load(config_type cfg_type, xml_data_node *parentnode);
+ void config_save(config_type cfg_type, xml_data_node *parentnode);
// configuration
laserdisc_get_disc_delegate m_getdisc_callback;
diff --git a/src/devices/machine/ldpr8210.cpp b/src/devices/machine/ldpr8210.cpp
index 967dac974e7..17b02edf276 100644
--- a/src/devices/machine/ldpr8210.cpp
+++ b/src/devices/machine/ldpr8210.cpp
@@ -563,18 +563,18 @@ WRITE8_MEMBER( pioneer_pr8210_device::i8049_pia_w )
case 0x60:
// these 4 are direct-connect
- output_set_value("pr8210_audio1", (data & 0x01) != 0);
- output_set_value("pr8210_audio2", (data & 0x02) != 0);
- output_set_value("pr8210_clv", (data & 0x04) != 0);
- output_set_value("pr8210_cav", (data & 0x08) != 0);
+ machine().output().set_value("pr8210_audio1", (data & 0x01) != 0);
+ machine().output().set_value("pr8210_audio2", (data & 0x02) != 0);
+ machine().output().set_value("pr8210_clv", (data & 0x04) != 0);
+ machine().output().set_value("pr8210_cav", (data & 0x08) != 0);
// remaining 3 bits select one of 5 LEDs via a mux
value = ((data & 0x40) >> 6) | ((data & 0x20) >> 4) | ((data & 0x10) >> 2);
- output_set_value("pr8210_srev", (value == 0));
- output_set_value("pr8210_sfwd", (value == 1));
- output_set_value("pr8210_play", (value == 2));
- output_set_value("pr8210_step", (value == 3));
- output_set_value("pr8210_pause", (value == 4));
+ machine().output().set_value("pr8210_srev", (value == 0));
+ machine().output().set_value("pr8210_sfwd", (value == 1));
+ machine().output().set_value("pr8210_play", (value == 2));
+ machine().output().set_value("pr8210_step", (value == 3));
+ machine().output().set_value("pr8210_pause", (value == 4));
m_pia.portb = data;
update_audio_squelch();
@@ -724,7 +724,7 @@ WRITE8_MEMBER( pioneer_pr8210_device::i8049_port2_w )
m_i8049_cpu->set_input_line(MCS48_INPUT_IRQ, (data & 0x40) ? CLEAR_LINE : ASSERT_LINE);
// standby LED is set accordingl to bit 4
- output_set_value("pr8210_standby", (data & 0x10) != 0);
+ machine().output().set_value("pr8210_standby", (data & 0x10) != 0);
}
diff --git a/src/devices/machine/ldvp931.cpp b/src/devices/machine/ldvp931.cpp
index 47133de9ffb..716728b638b 100644
--- a/src/devices/machine/ldvp931.cpp
+++ b/src/devices/machine/ldvp931.cpp
@@ -389,7 +389,7 @@ WRITE8_MEMBER( phillips_22vp931_device::i8049_output1_w )
$01 = OSM
*/
- INT32 speed = 0;
+ INT32 speed;
if (LOG_PORTS && (m_i8049_out1 ^ data) & 0x08)
{
diff --git a/src/devices/machine/mc68328.cpp b/src/devices/machine/mc68328.cpp
index 4cd578d6a4c..deb73d0eaa4 100644
--- a/src/devices/machine/mc68328.cpp
+++ b/src/devices/machine/mc68328.cpp
@@ -1794,7 +1794,7 @@ WRITE16_MEMBER( mc68328_device::write )
READ16_MEMBER( mc68328_device::read )
{
- UINT16 temp16 = 0;
+ UINT16 temp16;
UINT32 address = offset << 1;
switch (address)
diff --git a/src/devices/machine/mc68681.cpp b/src/devices/machine/mc68681.cpp
index edf1a23f817..00b38347285 100644
--- a/src/devices/machine/mc68681.cpp
+++ b/src/devices/machine/mc68681.cpp
@@ -590,7 +590,7 @@ mc68681_channel *mc68681_device::get_channel(int chan)
int mc68681_device::calc_baud(int ch, UINT8 data)
{
- int baud_rate = 0;
+ int baud_rate;
if ( BIT(ACR, 7) == 0 )
{
@@ -878,7 +878,7 @@ void mc68681_channel::update_interrupts()
UINT8 mc68681_channel::read_rx_fifo()
{
- UINT8 rv = 0;
+ UINT8 rv;
// printf("read_rx_fifo: rx_fifo_num %d\n", rx_fifo_num);
diff --git a/src/devices/machine/microtch.h b/src/devices/machine/microtch.h
index a3d64804de5..4ee60abede7 100644
--- a/src/devices/machine/microtch.h
+++ b/src/devices/machine/microtch.h
@@ -11,7 +11,6 @@ class microtouch_device :
public device_serial_interface
{
public:
- microtouch_device(const machine_config &mconfig, device_type type, const char* name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source);
microtouch_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
template<class _Object> static devcb_base &static_set_stx_callback(device_t &device, _Object object) { return downcast<microtouch_device &>(device).m_out_stx_func.set_callback(object); }
diff --git a/src/devices/machine/mos6526.cpp b/src/devices/machine/mos6526.cpp
index 3d9561b36f7..317c6b8555d 100644
--- a/src/devices/machine/mos6526.cpp
+++ b/src/devices/machine/mos6526.cpp
@@ -921,7 +921,7 @@ READ8_MEMBER( mos6526_device::read )
READ8_MEMBER( mos8520_device::read )
{
- UINT8 data = 0;
+ UINT8 data;
switch (offset & 0x0f)
{
diff --git a/src/devices/machine/mos6530.cpp b/src/devices/machine/mos6530.cpp
index a32383fcbda..46979b078f0 100644
--- a/src/devices/machine/mos6530.cpp
+++ b/src/devices/machine/mos6530.cpp
@@ -259,7 +259,7 @@ WRITE8_MEMBER( mos6530_device::write )
READ8_MEMBER( mos6530_device::read )
{
- UINT8 val = 0;
+ UINT8 val;
/* if A2 == 1 and A0 == 1, we are reading interrupt flags */
if ((offset & 0x05) == 0x05)
diff --git a/src/devices/machine/mos6530n.cpp b/src/devices/machine/mos6530n.cpp
index 3affa2d7b7f..31c15c65e1d 100644
--- a/src/devices/machine/mos6530n.cpp
+++ b/src/devices/machine/mos6530n.cpp
@@ -648,7 +648,7 @@ READ8_MEMBER( mos6530_base_t::timer_on_r )
UINT8 mos6530_base_t::timer_r(bool ie)
{
- UINT8 data = 0;
+ UINT8 data;
live_sync();
diff --git a/src/devices/machine/ncr5380.cpp b/src/devices/machine/ncr5380.cpp
index 175e9130c1c..fe62190d40f 100644
--- a/src/devices/machine/ncr5380.cpp
+++ b/src/devices/machine/ncr5380.cpp
@@ -137,7 +137,7 @@ void ncr5380_device::device_stop()
UINT8 ncr5380_device::ncr5380_read_reg(UINT32 offset)
{
int reg = offset & 7;
- UINT8 rv = 0;
+ UINT8 rv;
switch( reg )
{
diff --git a/src/devices/machine/ncr5380n.cpp b/src/devices/machine/ncr5380n.cpp
index 6534730ca00..cffe173d73c 100644
--- a/src/devices/machine/ncr5380n.cpp
+++ b/src/devices/machine/ncr5380n.cpp
@@ -165,7 +165,7 @@ void ncr5380n_device::step(bool timeout)
break;
int win;
- for(win=7; win>=0 && !(data & (1<<win)); win--);
+ for(win=7; win>=0 && !(data & (1<<win)); win--) {};
// printf("arb complete: data %02x win %02x scsi_id %02x\n", data, win, scsi_id);
if(win != scsi_id) {
scsi_bus->data_w(scsi_refid, 0);
@@ -322,7 +322,7 @@ WRITE8_MEMBER(ncr5380n_device::icmd_w)
if (mask)
{
// translate data to nscsi
- UINT8 newdata = 0;
+ UINT8 newdata;
newdata = (data & IC_RST ? S_RST : 0) |
(data & IC_ACK ? S_ACK : 0) |
diff --git a/src/devices/machine/ncr5390.cpp b/src/devices/machine/ncr5390.cpp
index fa29299ff45..9de72de9afe 100644
--- a/src/devices/machine/ncr5390.cpp
+++ b/src/devices/machine/ncr5390.cpp
@@ -143,7 +143,7 @@ void ncr5390_device::step(bool timeout)
break;
int win;
- for(win=7; win>=0 && !(data & (1<<win)); win--);
+ for(win=7; win>=0 && !(data & (1<<win)); win--) {};
if(win != scsi_id) {
scsi_bus->data_w(scsi_refid, 0);
scsi_bus->ctrl_w(scsi_refid, 0, S_ALL);
diff --git a/src/devices/machine/netlist.h b/src/devices/machine/netlist.h
index 568199444d7..961bb7a26ea 100644
--- a/src/devices/machine/netlist.h
+++ b/src/devices/machine/netlist.h
@@ -178,9 +178,6 @@ public:
// construction/destruction
netlist_mame_cpu_device_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
virtual ~netlist_mame_cpu_device_t() {}
-
- static void static_set_constructor(device_t &device, void (*setup_func)(netlist::setup_t &));
-
protected:
// netlist_mame_device_t
virtual void nl_register_devices() override;
@@ -223,7 +220,7 @@ protected:
// device_state_interface overrides
- virtual void state_string_export(const device_state_entry &entry, std::string &str) override
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override
{
if (entry.index() >= 0)
{
@@ -256,8 +253,6 @@ public:
netlist_mame_sound_device_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
virtual ~netlist_mame_sound_device_t() {}
- static void static_set_constructor(device_t &device, void (*setup_func)(netlist::setup_t &));
-
inline sound_stream *get_stream() { return m_stream; }
diff --git a/src/devices/machine/nscsi_bus.cpp b/src/devices/machine/nscsi_bus.cpp
index 611586a7962..d0508059758 100644
--- a/src/devices/machine/nscsi_bus.cpp
+++ b/src/devices/machine/nscsi_bus.cpp
@@ -280,7 +280,7 @@ void nscsi_full_device::step(bool timeout)
switch(scsi_state & SUB_MASK ? scsi_state & SUB_MASK : scsi_state & STATE_MASK) {
case IDLE:
if(((ctrl & (S_SEL|S_BSY)) == S_SEL) && (scsi_id != -1) && ((data & (1 << scsi_id)) != 0)) {
- for(scsi_initiator_id = 0; scsi_initiator_id != 16 && (scsi_initiator_id == scsi_id || (data & (1 << scsi_initiator_id))); scsi_initiator_id++);
+ for(scsi_initiator_id = 0; scsi_initiator_id != 16 && (scsi_initiator_id == scsi_id || (data & (1 << scsi_initiator_id))); scsi_initiator_id++) {};
if(scsi_initiator_id == 16)
scsi_initiator_id = -1;
scsi_state = TARGET_SELECT_WAIT_BUS_SETTLE;
diff --git a/src/devices/machine/pci.h b/src/devices/machine/pci.h
index c57d3eb3bf8..a88f0a3b7fb 100644
--- a/src/devices/machine/pci.h
+++ b/src/devices/machine/pci.h
@@ -133,10 +133,6 @@ protected:
void set_map_address(int id, UINT64 adr);
void set_map_size(int id, UINT64 size);
void set_map_flags(int id, int flags);
-
-private:
- void add_map_finish(int bid, UINT64 size, int flags);
-
};
class agp_device : public pci_device {
diff --git a/src/devices/machine/pci9050.cpp b/src/devices/machine/pci9050.cpp
index 4a8ad2dd704..6e74a19e284 100644
--- a/src/devices/machine/pci9050.cpp
+++ b/src/devices/machine/pci9050.cpp
@@ -113,7 +113,7 @@ void pci9050_device::remap_local(int id)
return;
}
int lsize;
- for(lsize=1; lsize<28 && !(csbase & (1<<lsize)); lsize++);
+ for(lsize=1; lsize<28 && !(csbase & (1<<lsize)); lsize++) {};
if(lsize == 28) {
set_map_flags(id+2, M_MEM | M_DISABLED);
return;
diff --git a/src/devices/machine/pckeybrd.cpp b/src/devices/machine/pckeybrd.cpp
index 513b9036dc9..0650fc8cea3 100644
--- a/src/devices/machine/pckeybrd.cpp
+++ b/src/devices/machine/pckeybrd.cpp
@@ -357,9 +357,9 @@ void pc_keyboard_device::device_reset()
m_numlock = 0;
m_on = true;
/* set default led state */
- set_led_status(machine(), 2, 0);
- set_led_status(machine(), 0, 0);
- set_led_status(machine(), 1, 0);
+ machine().output().set_led_value(2, 0);
+ machine().output().set_led_value(0, 0);
+ machine().output().set_led_value(1, 0);
m_head = m_tail = 0;
queue_insert(0xaa);
@@ -421,7 +421,7 @@ void pc_keyboard_device::standard_scancode_insert(int our_code, int pressed)
/* add codes for standard keys */
void at_keyboard_device::standard_scancode_insert(int our_code, int pressed)
{
- int scancode = our_code;
+ int scancode;
switch (m_scan_code_set)
{
@@ -832,9 +832,9 @@ WRITE8_MEMBER(at_keyboard_device::write)
/* led's in same order as my keyboard leds. */
/* num lock, caps lock, scroll lock */
- set_led_status(machine(), 2, (data & 0x01));
- set_led_status(machine(), 0, ((data & 0x02)>>1));
- set_led_status(machine(), 1, ((data & 0x04)>>2));
+ machine().output().set_led_value(2, (data & 0x01));
+ machine().output().set_led_value(0, ((data & 0x02)>>1));
+ machine().output().set_led_value(1, ((data & 0x04)>>2));
}
break;
diff --git a/src/devices/machine/pdc.cpp b/src/devices/machine/pdc.cpp
new file mode 100644
index 00000000000..4a882d12a04
--- /dev/null
+++ b/src/devices/machine/pdc.cpp
@@ -0,0 +1,591 @@
+// license:GPL-2.0+
+// copyright-holders:Brandon Munger
+/**********************************************************************
+
+ ROLM 9751 9005 Peripheral device controller emulation
+
+**********************************************************************/
+
+/*
+ Device PDCN
+ Board Copyright - IBM Corp 1989 Made in USA
+
+ Labels:
+ * 96D1975
+ MN 90594C
+
+ * EC# A6466SP
+ MFG 85575
+
+ Hardware:
+ * CPU - Zilog Z0840006PSC Z80 @ 5MHz - U19
+ * FDC - NEC D765AC-2 9002P7004 - U35
+ * HDC - HDC9224 SMC E8838 8/90 - U59
+ * DMA - P8237A-5 L1041330 - U34
+ * Channel 0 - FDC
+ * Channel 1 - Main system ram
+ * Memory - HM6264ALP-12 SRAM 8KB - U16
+ * Memory - HM6116P-2 SRAM 2KB - U33
+ Logic:
+ * U1 - PLS105AN Label: 59D9101
+ * U11 - ?? Label: 59D10001
+ * U27 - ?? Label: 96D1978
+ * U28 - ?? Label: 97D8750
+ * U31 - TIBPAL20L8-25CNT Label: 96D1987
+ * U32 - ?? Label: 59D1001
+ * U37 - PLS100N Label: 72D2701
+ * U38 - PLS100N Label: 58D9201
+ * U39 - ?? Label: 96D1981
+ * U40 - ?? Label: 96D1984
+ * U68 - ?? Label: 91D4301
+ * U69 - ?? Label: 59D1001
+ * U70 - ?? Label: 59D1001
+
+ Switches:
+ * S1 - Hard drive format configuration (Default all off)
+ * S2 - Floppy drive format configuration (Default 1-7 off, 8 on)
+
+ Program Memory:
+ * 0x0000 - 0x3FFF : ROM 27128 Label: 97D9988
+ * 0x8000 - 0x9FFF : SRAM HM6264ALP-12 8KB
+ * 0xC000 - 0xC7FF : SRAM HM6116P-2 2KB
+
+ IO Memory:
+ * 0x00 - 0x01 : Old style command [0x5FF041B0]
+ * 0x02 - 0x03 : FDC command address [0x5FF0C0B0][0x5FF0C1B0]
+ * 0x04 - 0x05 : FDC command completion status [0x5FF030B0]
+ * 0x06 - 0x07 : FDC data address [0x5FF080B0]
+ * 0x10 - 0x18 : HDC registers (unknown)
+ * 0x21 - 0x21 : FDC unknown, resets bit 1 on 0x38
+ * 0x22 - 0x22 : FDC unknown
+ * 0x23 - 0x24 : FDC Active DMA host address (auto increments)
+ * 0x25 - 0x25 : FDC unknown
+ * 0x26 - 0x26 : DREQ1 on
+ * 0x27 - 0x27 : FDC unknown
+ * 0x28 - 0x2A : Possibly LED lights
+ * 0x2C - 0x2C : DREQ1 off
+ * 0x2D - 0x2D : Unknown
+ * 0x2E - 0x2E : Transfer direction 0x80 = PDC -> Host (read data)
+ 0x00 = Host -> PDC (Commands, write data)
+ * 0x2F - 0x2F : Unknown
+ * 0x38 - 0x38 : FDC command request
+ Bit 1: Debug?
+ Bit 2: Command complete
+ Bit 3: Unknown
+ Bit 5: Unknown
+ Bit 6-7: Error conditions
+ * 0x39 - 0x39 : Interrupt status
+ Bit 0: HDC9224 interrupt
+ Bit 1: Incoming command
+ Bit 3: FDD related, maybe uPD interrupt pin?
+ * 0x3C - 0x3D : Dipswitch 2 and 1
+ * 0x40 - 0x40 : HDC9224 DATA register
+ * 0x41 - 0x41 : HDC9224 COMMAND register
+ * 0x42 - 0x42 : uPD765 STATUS register
+ * 0x43 - 0x43 : uPD765 DATA register
+ * 0x50 - 0x51 : Unknown - reset latch maybe?
+ * 0x52 - 0x52 : FDD Master motor control
+ * 0x53 - 0x53 : Unknown
+ * 0x54 - 0x57 : FDD motor control (Units 1-4)
+ * 0x60 - 0x6F : P8237A DMA controller register set
+
+*/
+
+#include "pdc.h"
+
+
+//**************************************************************************
+// MACROS / CONSTANTS
+//**************************************************************************
+
+#define Z80_TAG "pdc_z80" // U19
+#define FDC_TAG "fdc"
+#define HDC_TAG "hdc"
+#define FDCDMA_TAG "i8237dma"
+
+#define TRACE_PDC_FDC 0
+#define TRACE_PDC_HDC 0
+#define TRACE_PDC_DMA 0
+#define TRACE_PDC_CMD 0
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+const device_type PDC = &device_creator<pdc_device>;
+
+//-------------------------------------------------
+// ROM( PDC )
+//-------------------------------------------------
+
+ROM_START( pdc )
+ ROM_REGION( 0x4000, "rom", 0 )
+ ROM_LOAD( "97d9988.27128.pdc.u17", 0x0000, 0x4000, CRC(d96ccaa6) SHA1(e1a465c2274a63e81dba7a71fc8b30f10c03baf0) ) // Label: "97D9988" 27128 @U17
+ROM_END
+
+//-------------------------------------------------
+// rom_region - device-specific ROM region
+//-------------------------------------------------
+
+const rom_entry *pdc_device::device_rom_region() const
+{
+ return ROM_NAME( pdc );
+}
+
+//-------------------------------------------------
+// ADDRESS_MAP( pdc_mem )
+//-------------------------------------------------
+
+static ADDRESS_MAP_START( pdc_mem, AS_PROGRAM, 8, pdc_device )
+ AM_RANGE(0x0000, 0x3fff) AM_ROM AM_REGION("rom", 0)
+ AM_RANGE(0x8000, 0x9FFF) AM_RAM AM_SHARE("pdc_ram") // HM6264ALP-12 SRAM 8KB
+ AM_RANGE(0xC000, 0xC7FF) AM_RAM // HM6116P-2 SRAM 2KB
+ADDRESS_MAP_END
+
+//-------------------------------------------------
+// ADDRESS_MAP( pdc_io )
+//-------------------------------------------------
+
+static ADDRESS_MAP_START( pdc_io, AS_IO, 8, pdc_device )
+ AM_RANGE(0x00, 0x07) AM_READWRITE(p0_7_r,p0_7_w) AM_MIRROR(0xFF00)
+ AM_RANGE(0x21, 0x2F) AM_READWRITE(fdd_68k_r,fdd_68k_w) AM_MIRROR(0xFF00)
+ AM_RANGE(0x38, 0x38) AM_READ(p38_r) AM_MIRROR(0xFF00) // Possibly UPD765 interrupt
+ AM_RANGE(0x39, 0x39) AM_READ(p39_r) AM_MIRROR(0xFF00) // HDD related
+ AM_RANGE(0x3c, 0x3c) AM_READ_PORT("SW2") AM_MIRROR(0xFF00) /* FDC Dipswitch */
+ AM_RANGE(0x3d, 0x3d) AM_READ_PORT("SW1") AM_MIRROR(0xFF00) /* HDC Dipswitch */
+ AM_RANGE(0x40, 0x41) AM_DEVREADWRITE(HDC_TAG, hdc9224_device,read,write) AM_MIRROR(0xFF00)
+ AM_RANGE(0x42, 0x43) AM_DEVICE(FDC_TAG, upd765a_device, map) AM_MIRROR(0xFF00)
+ AM_RANGE(0x50, 0x5f) AM_WRITE(p50_5f_w) AM_MIRROR(0xFF00)
+ AM_RANGE(0x60, 0x6f) AM_DEVREADWRITE(FDCDMA_TAG,am9517a_device,read,write) AM_MIRROR(0xFF00)
+ADDRESS_MAP_END
+
+//-------------------------------------------------
+// INPUT_PORTS_START( pdc )
+//-------------------------------------------------
+
+static INPUT_PORTS_START( pdc_ports )
+ /* Hard Disk Controller SW1 */
+ PORT_START("SW1")
+ PORT_DIPNAME( 0x80, 0x80, "SW1-1") PORT_DIPLOCATION("SW1:1")
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, "SW1-2") PORT_DIPLOCATION("SW1:2")
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x20, "SW1-3") PORT_DIPLOCATION("SW1:3")
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x10, 0x10, "SW1-4") PORT_DIPLOCATION("SW1:4")
+ PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x08, 0x08, "SW1-5") PORT_DIPLOCATION("SW1:5")
+ PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x04, 0x04, "SW1-6") PORT_DIPLOCATION("SW1:6")
+ PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x02, 0x02, "SW1-7") PORT_DIPLOCATION("SW1:7")
+ PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x01, 0x01, "SW1-8") PORT_DIPLOCATION("SW1:8")
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ /* Floppy Disk Controller SW2 */
+ PORT_START("SW2")
+ PORT_DIPNAME( 0x80, 0x80, "SW2-1") PORT_DIPLOCATION("SW2:1")
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, "SW2-2") PORT_DIPLOCATION("SW2:2")
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x20, "SW2-3") PORT_DIPLOCATION("SW2:3")
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x10, 0x10, "SW2-4") PORT_DIPLOCATION("SW2:4")
+ PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x08, 0x08, "SW2-5") PORT_DIPLOCATION("SW2:5")
+ PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x04, 0x04, "SW2-6") PORT_DIPLOCATION("SW2:6")
+ PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x02, 0x02, "SW2-7") PORT_DIPLOCATION("SW2:7")
+ PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x01, 0x00, "SW2-8") PORT_DIPLOCATION("SW2:8")
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+INPUT_PORTS_END
+
+//-------------------------------------------------
+// SLOT_INTERFACE( pdc_floppies )
+//-------------------------------------------------
+
+static SLOT_INTERFACE_START( pdc_floppies )
+ SLOT_INTERFACE( "35hd", FLOPPY_35_HD )
+SLOT_INTERFACE_END
+
+//-------------------------------------------------
+// SLOT_INTERFACE( pdc_harddisks )
+//-------------------------------------------------
+
+static SLOT_INTERFACE_START( pdc_harddisks )
+ SLOT_INTERFACE( "generic", MFMHD_GENERIC ) // Generic hard disk (self-adapting to image)
+ SLOT_INTERFACE( "st213", MFMHD_ST213 ) // Seagate ST-213 (10 MB)
+ SLOT_INTERFACE( "st225", MFMHD_ST225 ) // Seagate ST-225 (20 MB)
+ SLOT_INTERFACE( "st251", MFMHD_ST251 ) // Seagate ST-251 (40 MB)
+SLOT_INTERFACE_END
+
+//-------------------------------------------------
+// FLOPPY_FORMATS( floppy_formats )
+//-------------------------------------------------
+
+FLOPPY_FORMATS_MEMBER( pdc_device::floppy_formats )
+ FLOPPY_PC_FORMAT
+FLOPPY_FORMATS_END
+
+//-------------------------------------------------
+// MACHINE_DRIVER( pdc )
+//-------------------------------------------------
+
+static MACHINE_CONFIG_FRAGMENT( pdc )
+ /* CPU - Zilog Z0840006PSC */
+ MCFG_CPU_ADD(Z80_TAG, Z80, XTAL_10MHz / 2)
+ MCFG_CPU_PROGRAM_MAP(pdc_mem)
+ MCFG_CPU_IO_MAP(pdc_io)
+ //MCFG_QUANTUM_PERFECT_CPU(M6502_TAG)
+
+ /* Floppy Disk Controller - uPD765a - NEC D765AC-2 */
+ MCFG_UPD765A_ADD(FDC_TAG, true, true)
+ MCFG_UPD765_INTRQ_CALLBACK(WRITELINE(pdc_device, fdc_irq))
+ MCFG_UPD765_DRQ_CALLBACK(DEVWRITELINE(FDCDMA_TAG, am9517a_device, dreq0_w)) //MCFG_DEVCB_INVERT
+
+ // Floppy disk drive
+ MCFG_FLOPPY_DRIVE_ADD(FDC_TAG":0", pdc_floppies, "35hd", pdc_device::floppy_formats)
+
+ /* DMA Controller - Intel P8237A-5 */
+ /* Channel 0: uPD765a Floppy Disk Controller */
+ /* Channel 1: M68K main system memory */
+ MCFG_DEVICE_ADD(FDCDMA_TAG, AM9517A, XTAL_10MHz / 2)
+ MCFG_I8237_OUT_HREQ_CB(WRITELINE(pdc_device, i8237_hreq_w))
+ MCFG_I8237_OUT_EOP_CB(WRITELINE(pdc_device, i8237_eop_w))
+ MCFG_I8237_IN_MEMR_CB(READ8(pdc_device, i8237_dma_mem_r))
+ MCFG_I8237_OUT_MEMW_CB(WRITE8(pdc_device, i8237_dma_mem_w))
+ MCFG_I8237_IN_IOR_0_CB(READ8(pdc_device, i8237_fdc_dma_r))
+ MCFG_I8237_OUT_IOW_0_CB(WRITE8(pdc_device, i8237_fdc_dma_w))
+ MCFG_I8237_IN_IOR_1_CB(READ8(pdc_device, m68k_dma_r))
+ MCFG_I8237_OUT_IOW_1_CB(WRITE8(pdc_device, m68k_dma_w))
+
+ /* Hard Disk Controller - HDC9224 */
+ MCFG_DEVICE_ADD(HDC_TAG, HDC9224, 0)
+ MCFG_MFM_HARDDISK_CONN_ADD("h1", pdc_harddisks, NULL, MFM_BYTE, 3000, 20, MFMHD_GEN_FORMAT)
+MACHINE_CONFIG_END
+
+//-------------------------------------------------
+// machine_config_additions - device-specific
+// machine configurations
+//-------------------------------------------------
+
+machine_config_constructor pdc_device::device_mconfig_additions() const
+{
+ return MACHINE_CONFIG_NAME( pdc );
+}
+
+ioport_constructor pdc_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME( pdc_ports );
+}
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// pdc_device - constructor
+//-------------------------------------------------
+
+pdc_device::pdc_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
+ device_t(mconfig, PDC, "ROLM PDC", tag, owner, clock, "pdc", __FILE__),
+ m_pdccpu(*this, Z80_TAG),
+ m_dma8237(*this, FDCDMA_TAG),
+ m_fdc(*this, FDC_TAG),
+ m_hdc9224(*this, HDC_TAG),
+ m_pdc_ram(*this, "pdc_ram"),
+ m_m68k_r_cb(*this),
+ m_m68k_w_cb(*this)
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void pdc_device::device_start()
+{
+}
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void pdc_device::device_reset()
+{
+ /* Reset registers */
+ reg_p38 = 0;
+ reg_p38 |= 4; /* ready for 68k ram DMA */
+ //reg_p38 |= 0x20; // no idea at all - bit 5 (32)
+
+ /* Reset CPU */
+ m_pdccpu->reset();
+
+ /* Resolve callbacks */
+ m_m68k_r_cb.resolve_safe(0);
+ m_m68k_w_cb.resolve_safe();
+
+ m_fdc->set_rate(500000) ;
+}
+
+//-------------------------------------------------
+// I8237 DMA
+//-------------------------------------------------
+
+WRITE_LINE_MEMBER(pdc_device::i8237_hreq_w)
+{
+ m_pdccpu->set_input_line(INPUT_LINE_HALT, state ? ASSERT_LINE : CLEAR_LINE);
+ m_dma8237->hack_w(state);
+}
+
+WRITE_LINE_MEMBER(pdc_device::i8237_eop_w)
+{
+ m_fdc->tc_w(state);
+ reg_p38 |= 4; /* ready for 68k ram DMA */
+ if(state) m_dma8237->dreq1_w(0);
+}
+
+READ8_MEMBER(pdc_device::i8237_dma_mem_r)
+{
+ return m_pdccpu->space(AS_PROGRAM).read_byte(offset);
+}
+
+WRITE8_MEMBER(pdc_device::i8237_dma_mem_w)
+{
+ m_pdccpu->space(AS_PROGRAM).write_byte(offset,data);
+}
+
+READ8_MEMBER(pdc_device::i8237_fdc_dma_r)
+{
+ UINT8 ret = m_fdc->dma_r();
+ if(TRACE_PDC_DMA) logerror("PDC: 8237 DMA CHANNEL 0 READ ADDRESS: %08X, DATA: %02X\n", offset, ret );
+ return ret;
+}
+
+WRITE8_MEMBER(pdc_device::i8237_fdc_dma_w)
+{
+ if(TRACE_PDC_DMA) logerror("PDC: 8237 DMA CHANNEL 0 WRITE ADDRESS: %08X, DATA: %02X\n", offset, data );
+ m_fdc->dma_w(data);
+}
+
+READ8_MEMBER(pdc_device::m68k_dma_r)
+{
+ UINT32 address;
+ UINT8 data;
+
+ address = fdd_68k_dma_address++;
+ data = m_m68k_r_cb(address);
+ if(TRACE_PDC_DMA) logerror("PDC: 8237 DMA CHANNEL 1 READ ADDRESS: %08X, DATA: %02X\n", address, data );
+ return data;
+}
+
+WRITE8_MEMBER(pdc_device::m68k_dma_w)
+{
+ if(TRACE_PDC_DMA) logerror("PDC: 8237 DMA CHANNEL 1 WRITE ADDRESS: %08X, DATA: %02X\n", fdd_68k_dma_address, data );
+ m_m68k_w_cb(data);
+ fdd_68k_dma_address++;
+}
+
+WRITE_LINE_MEMBER(pdc_device::hdd_irq)
+{
+ m_pdccpu->set_input_line(INPUT_LINE_IRQ0, HOLD_LINE);
+}
+
+WRITE_LINE_MEMBER(pdc_device::fdc_irq)
+{
+ b_fdc_irq = state != 0;
+}
+READ8_MEMBER(pdc_device::p0_7_r)
+{
+ switch(offset)
+ {
+ case 0: /* Port 0: Old style command low byte [0x5FF041B0] */
+ if(TRACE_PDC_CMD) logerror("PDC: Port 0x00 READ: %02X\n", reg_p0);
+ return reg_p0;
+ case 1: /* Port 1: Old style command high byte [0x5FF041B0] */
+ if(TRACE_PDC_CMD) logerror("PDC: Port 0x01 READ: %02X\n", reg_p1);
+ return reg_p1;
+ case 2: /* Port 2: FDD command address low byte [0x5FF0C0B0][0x5FF0C1B0] */
+ if(TRACE_PDC_FDC) logerror("PDC: Port 0x02 READ: %02X\n", reg_p2);
+ return reg_p2;
+ case 3: /* Port 3: FDD command address high byte [0x5FF0C0B0][0x5FF0C1B0] */
+ if(TRACE_PDC_FDC) logerror("PDC: Port 0x03 READ: %02X\n", reg_p3);
+ return reg_p3;
+ case 6: /* Port 6: FDD data destination address low byte [0x5FF080B0] */
+ if(TRACE_PDC_FDC) logerror("PDC: Port 0x06 READ: %02X\n", reg_p6);
+ return reg_p6;
+ case 7: /* Port 7: FDD data destination address high byte [0x5FF080B0] */
+ if(TRACE_PDC_FDC) logerror("PDC: Port 0x07 READ: %02X\n", reg_p7);
+ return reg_p7;
+ default:
+ if(TRACE_PDC_CMD) logerror("(!)PDC: Port %02X READ: \n", offset);
+ return 0;
+ }
+}
+
+WRITE8_MEMBER(pdc_device::p0_7_w)
+{
+ switch(offset)
+ {
+ case 4: /* Port 4: FDD command completion status low byte [0x5FF030B0] */
+ if(TRACE_PDC_FDC) logerror("PDC: Port 0x04 WRITE: %02X\n", data);
+ reg_p4 = data;
+ break;
+ case 5: /* Port 5: FDD command completion status high byte [0x5FF030B0] */
+ if(TRACE_PDC_FDC) logerror("PDC: Port 0x05 WRITE: %02X\n", data);
+ reg_p5 = data;
+ break;
+ default:
+ if(TRACE_PDC_FDC) logerror("(!)PDC: Port %02X WRITE: %02X\n", offset, data);
+ break;
+ }
+}
+
+READ8_MEMBER(pdc_device::fdd_68k_r)
+{
+ UINT8 address = offset + 0x21;
+ switch(address)
+ {
+ default:
+ if(TRACE_PDC_FDC) logerror("(!)PDC: Port %02X READ: \n", address);
+ return 0;
+ }
+}
+WRITE8_MEMBER(pdc_device::fdd_68k_w)
+{
+ UINT8 address = offset + 0x21;
+ switch(address)
+ {
+ case 0x21: /* Port 21: ?? */
+ if(TRACE_PDC_FDC) logerror("PDC: Port 0x21 WRITE: %02X\n", data);
+ if(TRACE_PDC_FDC) logerror("PDC: Resetting 0x38 bit 1\n");
+ reg_p38 &= ~2; // Clear bit 1
+ reg_p21 = data;
+ break;
+ case 0x23: /* Port 23: FDD 68k DMA high byte */
+ /* The address is << 1 on the 68k side */
+ fdd_68k_dma_address = (fdd_68k_dma_address & (0xFF<<1)) | (data << 9);
+ if(TRACE_PDC_FDC) logerror("PDC: Port %02X WRITE: %02X\n", address, data);
+ break;
+ case 0x24: /* Port 24: FDD 68k DMA low byte */
+ /* The address is << 1 on the 68k side */
+ fdd_68k_dma_address = (fdd_68k_dma_address & (0xFF<<9)) | (data << 1);
+ if(TRACE_PDC_FDC) logerror("PDC: Port %02X WRITE: %02X\n", address, data);
+ break;
+ case 0x26:
+ switch(data)
+ {
+ case 0x80:
+ m_dma8237->dreq1_w(1);
+ reg_p38 &= ~4; // Clear bit 4
+ if(TRACE_PDC_DMA) logerror("PDC: Port 0x26 WRITE: 0x80, DMA REQ CH 1\n");
+ break;
+ }
+ break;
+ case 0x2C:
+ switch(data)
+ {
+ case 0xFF:
+ m_dma8237->dreq1_w(0);
+ if(TRACE_PDC_DMA) logerror("PDC: Port 0x2C WRITE: 0xFF, DMA REQ CH 1 OFF\n");
+ break;
+ }
+ break;
+ default:
+ if(TRACE_PDC_FDC) logerror("(!)PDC: Port %02X WRITE: %02X, PC: %X\n", address, data, space.device().safe_pc());
+ break;
+ }
+}
+
+WRITE8_MEMBER(pdc_device::p38_w)
+{
+ if(TRACE_PDC_CMD) logerror("PDC: Port 0x38 WRITE: %i\n", data);
+ //reg_p38 |= data;
+ reg_p38 = data;
+}
+
+READ8_MEMBER(pdc_device::p38_r)
+{
+ reg_p38 ^= 0x20; /* Invert bit 5 (32) */
+ if(TRACE_PDC_CMD) logerror("PDC: Port 0x38 READ: %02X, PC: %X\n", reg_p38, space.device().safe_pc());
+ return reg_p38;
+}
+
+READ8_MEMBER(pdc_device::p39_r)
+{
+ UINT8 data = 1;
+ if(b_fdc_irq) data |= 8; // Set bit 3
+ if(TRACE_PDC_CMD) logerror("PDC: Port 0x39 READ: %02X, PC: %X\n", data, space.device().safe_pc());
+ return data;
+}
+
+WRITE8_MEMBER(pdc_device::p50_5f_w)
+{
+ UINT8 address = 0x50 + offset;
+ switch(address)
+ {
+ case 0x52:
+ switch(data)
+ {
+ case 0x00:
+ if(TRACE_PDC_FDC) logerror("PDC: FDD (all) Motor off.\n");
+ m_fdc->subdevice<floppy_connector>("0")->get_device()->mon_w(1);
+ break;
+ case 0x80:
+ if(TRACE_PDC_FDC) logerror("PDC: FDD (all) Motor on.\n");
+ m_fdc->subdevice<floppy_connector>("0")->get_device()->mon_w(0);
+ break;
+ default:
+ if(TRACE_PDC_FDC) logerror("PDC: Port 0x52 WRITE: %x\n", data);
+ }
+ break;
+ case 0x53: /* Probably set_rate here */
+ if(TRACE_PDC_FDC) logerror("PDC: Port 0x53 WRITE: %x\n", data);
+ break;
+ case 0x54: /* Port 54: FDD Unit 1 Motor control */
+ switch(data)
+ {
+ case 0x00:
+ if(TRACE_PDC_FDC) logerror("PDC: FDD 1 Motor off.\n");
+ m_fdc->subdevice<floppy_connector>("0")->get_device()->mon_w(1);
+ break;
+ case 0x80:
+ if(TRACE_PDC_FDC) logerror("PDC: FDD 1 Motor on.\n");
+ m_fdc->subdevice<floppy_connector>("0")->get_device()->mon_w(0);
+ break;
+ default:
+ if(TRACE_PDC_FDC) logerror("PDC: Port 0x54 WRITE: %x\n", data);
+ }
+ break;
+ case 0x55: /* Port 54: FDD Unit 2 Motor control */
+ if(TRACE_PDC_FDC) logerror("PDC: FDD 2 motor control: %02X\n", data);
+ break;
+ case 0x56: /* Port 54: FDD Unit 3 Motor control */
+ if(TRACE_PDC_FDC) logerror("PDC: FDD 3 motor control: %02X\n", data);
+ break;
+ case 0x57: /* Port 54: FDD Unit 4 Motor control */
+ if(TRACE_PDC_FDC) logerror("PDC: FDD 4 motor control: %02X\n", data);
+ break;
+ default:
+ if(TRACE_PDC_FDC) logerror("PDC: Port %02x WRITE: %x\n", address, data);
+ }
+}
diff --git a/src/devices/machine/pdc.h b/src/devices/machine/pdc.h
new file mode 100644
index 00000000000..c1f3a3cbf51
--- /dev/null
+++ b/src/devices/machine/pdc.h
@@ -0,0 +1,118 @@
+// license:GPL-2.0+
+// copyright-holders:Brandon Munger
+/**********************************************************************
+
+ ROLM 9751 9005 Peripheral device controller emulation
+
+**********************************************************************/
+
+#pragma once
+
+#ifndef __R9751_PDC_H__
+#define __R9751_PDC_H__
+
+#include "emu.h"
+#include "cpu/z80/z80.h"
+#include "machine/upd765.h"
+#include "machine/am9517a.h"
+#include "formats/pc_dsk.h"
+#include "machine/hdc92x4.h"
+#include "imagedev/mfmhd.h"
+
+//**************************************************************************
+// MACROS / CONSTANTS
+//**************************************************************************
+
+#define PDC_TAG "pdc"
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> pdc_device
+
+class pdc_device : public device_t
+{
+public:
+ /* Constructor and Destructor */
+ pdc_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ /* Optional information overrides */
+ virtual machine_config_constructor device_mconfig_additions() const override;
+ virtual ioport_constructor device_input_ports() const override;
+ virtual const rom_entry *device_rom_region() const override;
+
+ /* Callbacks */
+ template<class _Object> static devcb_base &m68k_r_callback(device_t &device, _Object object) { return downcast<pdc_device &>(device).m_m68k_r_cb.set_callback(object); }
+ template<class _Object> static devcb_base &m68k_w_callback(device_t &device, _Object object) { return downcast<pdc_device &>(device).m_m68k_w_cb.set_callback(object); }
+
+ /* Read and Write members */
+ DECLARE_WRITE_LINE_MEMBER(i8237_hreq_w);
+ DECLARE_WRITE_LINE_MEMBER(i8237_eop_w);
+ DECLARE_READ8_MEMBER(i8237_dma_mem_r);
+ DECLARE_WRITE8_MEMBER(i8237_dma_mem_w);
+ DECLARE_READ8_MEMBER(i8237_fdc_dma_r);
+ DECLARE_WRITE8_MEMBER(i8237_fdc_dma_w);
+
+ DECLARE_WRITE_LINE_MEMBER(hdd_irq);
+
+ DECLARE_READ8_MEMBER(p0_7_r);
+ DECLARE_WRITE8_MEMBER(p0_7_w);
+ DECLARE_READ8_MEMBER(fdd_68k_r);
+ DECLARE_WRITE8_MEMBER(fdd_68k_w);
+ DECLARE_WRITE8_MEMBER(p38_w);
+ DECLARE_READ8_MEMBER(p38_r);
+ DECLARE_READ8_MEMBER(p39_r);
+ DECLARE_WRITE8_MEMBER(p50_5f_w);
+
+ DECLARE_READ8_MEMBER(m68k_dma_r);
+ DECLARE_WRITE8_MEMBER(m68k_dma_w);
+
+ DECLARE_WRITE_LINE_MEMBER(fdc_irq);
+ DECLARE_FLOPPY_FORMATS( floppy_formats );
+
+ /* Main CPU accessible registers */
+ UINT8 reg_p0;
+ UINT8 reg_p1;
+ UINT8 reg_p2;
+ UINT8 reg_p3;
+ UINT8 reg_p4;
+ UINT8 reg_p5;
+ UINT8 reg_p6;
+ UINT8 reg_p7;
+ UINT8 reg_p21;
+ UINT8 reg_p38;
+ UINT32 fdd_68k_dma_address; /* FDD <-> m68k DMA read/write address */
+protected:
+ /* Device-level overrides */
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ /* Protected variables */
+ //UINT32 fdd_68k_dma_address;
+ bool b_fdc_irq;
+
+ /* Attached devices */
+ required_device<cpu_device> m_pdccpu;
+ required_device<am9517a_device> m_dma8237;
+ required_device<upd765a_device> m_fdc;
+ //required_device<floppy_connector> m_floppy;
+ //required_device<floppy_image_device> m_floppy;
+ optional_device<hdc9224_device> m_hdc9224;
+ mfm_harddisk_device* m_harddisk;
+ required_shared_ptr<UINT8> m_pdc_ram;
+
+ /* Callbacks */
+ devcb_read8 m_m68k_r_cb;
+ devcb_write8 m_m68k_w_cb;
+};
+
+/* Device type */
+extern const device_type PDC;
+
+/* MCFG defines */
+#define MCFG_PDC_R_CB(_devcb) \
+ devcb = &pdc_device::m68k_r_callback(*device, DEVCB_##_devcb);
+#define MCFG_PDC_W_CB(_devcb) \
+ devcb = &pdc_device::m68k_w_callback(*device, DEVCB_##_devcb);
+#endif
diff --git a/src/devices/machine/pla.cpp b/src/devices/machine/pla.cpp
index 417fb4e6c3f..f96a2bd8f60 100644
--- a/src/devices/machine/pla.cpp
+++ b/src/devices/machine/pla.cpp
@@ -148,8 +148,6 @@ UINT32 pla_device::read(UINT32 input)
for (auto cache2_entry : m_cache2)
{
-
-
if ((UINT32)cache2_entry == input)
{
// cache2 hit
diff --git a/src/devices/machine/roc10937.cpp b/src/devices/machine/roc10937.cpp
index fbfda7ce0e8..c76e02f13e6 100644
--- a/src/devices/machine/roc10937.cpp
+++ b/src/devices/machine/roc10937.cpp
@@ -197,7 +197,7 @@ void rocvfd_t::update_display()
for (int i =0; i<16; i++)
{
m_outputs[i] = set_display(m_chars[i]);
- output_set_indexed_value("vfd", (m_port_val*16) + i, m_outputs[i]);
+ machine().output().set_indexed_value("vfd", (m_port_val*16) + i, m_outputs[i]);
}
}
diff --git a/src/devices/machine/roc10937.h b/src/devices/machine/roc10937.h
index 81ab7a31a63..3acf90726b0 100644
--- a/src/devices/machine/roc10937.h
+++ b/src/devices/machine/roc10937.h
@@ -55,10 +55,8 @@ public:
static void static_set_value(device_t &device, int val);
virtual void update_display();
UINT8 m_port_val;
- void blank(int data);
void shift_clock(int data);
void write_char(int data);
- void setdata(int segdata, int data);
UINT32 set_display(UINT32 segin);
DECLARE_WRITE_LINE_MEMBER( sclk );
DECLARE_WRITE_LINE_MEMBER( data );
diff --git a/src/devices/machine/rp5c15.h b/src/devices/machine/rp5c15.h
index 03f8cd91d66..1e36dfaf60f 100644
--- a/src/devices/machine/rp5c15.h
+++ b/src/devices/machine/rp5c15.h
@@ -55,7 +55,6 @@ public:
DECLARE_READ8_MEMBER( read );
DECLARE_WRITE8_MEMBER( write );
- DECLARE_WRITE_LINE_MEMBER( adj_w );
protected:
// device-level overrides
diff --git a/src/devices/machine/rp5h01.cpp b/src/devices/machine/rp5h01.cpp
index 40964570129..4a3138225a7 100644
--- a/src/devices/machine/rp5h01.cpp
+++ b/src/devices/machine/rp5h01.cpp
@@ -34,6 +34,7 @@ const device_type RP5H01 = &device_creator<rp5h01_device>;
rp5h01_device::rp5h01_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: device_t(mconfig, RP5H01, "RP5H01 6/7-bit Counter", tag, owner, clock, "rp5h01", __FILE__)
+ , m_rom_ptr(*this, DEVICE_SELF)
{
}
@@ -53,11 +54,15 @@ void rp5h01_device::device_config_complete()
void rp5h01_device::device_start()
{
- m_data = region()->base();
- if (m_data == nullptr)
+ if (m_rom_ptr == nullptr)
+ {
m_data = initial_data;
+ }
else
+ {
+ m_data = m_rom_ptr;
assert(region()->bytes() == 0x10);
+ }
/* register for state saving */
save_item(NAME(m_counter));
diff --git a/src/devices/machine/rp5h01.h b/src/devices/machine/rp5h01.h
index 9a72c6384de..0585b5ddf55 100644
--- a/src/devices/machine/rp5h01.h
+++ b/src/devices/machine/rp5h01.h
@@ -52,6 +52,7 @@ protected:
virtual void device_config_complete() override;
virtual void device_start() override;
virtual void device_reset() override;
+
private:
// internal state
int m_counter;
@@ -60,6 +61,7 @@ private:
int m_old_reset; /* reset pin state (level-triggered) */
int m_old_clock; /* clock pin state (level-triggered) */
const UINT8 *m_data;
+ optional_region_ptr<UINT8> m_rom_ptr;
};
extern const device_type RP5H01;
diff --git a/src/devices/machine/s2636.cpp b/src/devices/machine/s2636.cpp
index 70a9f165da7..0beddbed0a3 100644
--- a/src/devices/machine/s2636.cpp
+++ b/src/devices/machine/s2636.cpp
@@ -162,9 +162,12 @@ s2636_device::s2636_device(const machine_config &mconfig, const char *tag, devic
, m_divider(1)
, m_y_offset(0)
, m_x_offset(0)
+ , m_intreq_cb(*this)
, m_vrst(false)
, m_screen_line(0)
, m_vis_line(0)
+ , m_intreq(CLEAR_LINE)
+ , m_intack(CLEAR_LINE)
, m_stream(nullptr)
, m_sample_cnt(0)
, m_sound_lvl(false)
@@ -187,19 +190,25 @@ void s2636_device::device_start()
save_item(NAME(m_registers));
+ save_item(NAME(m_vrst));
+ save_item(NAME(m_screen_line));
+ save_item(NAME(m_vis_line));
+
save_item(NAME(m_obj_cnt));
save_item(NAME(m_obj_disp));
save_item(NAME(m_obj_dup));
- save_item(NAME(m_vrst));
- save_item(NAME(m_screen_line));
- save_item(NAME(m_vis_line));
+ save_item(NAME(m_intreq));
+ save_item(NAME(m_intack));
m_stream = machine().sound().stream_alloc(*this, 0, 1, machine().sample_rate());
save_item(NAME(m_sample_cnt));
save_item(NAME(m_sound_lvl));
+
+ m_intreq_cb.resolve_safe();
}
+
//-------------------------------------------------
// backwards-compatible update method
//-------------------------------------------------
@@ -215,6 +224,10 @@ bitmap_ind16 const &s2636_device::update(const rectangle &cliprect)
}
+//-------------------------------------------------
+// render the first line into the bitmap
+//-------------------------------------------------
+
void s2636_device::render_first_line()
{
m_screen_line = 0;
@@ -222,8 +235,14 @@ void s2636_device::render_first_line()
}
+//-------------------------------------------------
+// render next line into the bitmap
+//-------------------------------------------------
+
void s2636_device::render_next_line()
{
+ assert(m_screen_line < m_bitmap.height());
+
// pre-clear the line for convenience
rectangle const &vis_area = m_screen->visible_area();
UINT16 *const row = &m_bitmap.pix16(m_screen_line);
@@ -235,6 +254,7 @@ void s2636_device::render_next_line()
{
m_registers[REG_VBL_COL_OBJ] |= 0x40;
m_vrst = true;
+ update_intreq(ASSERT_LINE);
}
}
else
@@ -254,9 +274,10 @@ void s2636_device::render_next_line()
m_registers[REG_COL_BG_CMPL] = 0x00;
m_registers[REG_VBL_COL_OBJ] = 0x00;
- // set our internal tracking flags
+ // set our internal tracking flags and clear interrupt
m_vrst = false;
m_vis_line = 0;
+ update_intreq(CLEAR_LINE);
}
// work out what object pixels belong in this line
@@ -295,6 +316,7 @@ void s2636_device::render_next_line()
m_obj_cnt[i] = 1 + m_registers[OFFS_OBJ[i] + OFFS_VCB];
m_obj_disp[i] = false;
m_obj_dup[i] = true;
+ update_intreq(ASSERT_LINE);
}
}
else
@@ -381,7 +403,7 @@ void s2636_device::render_next_line()
// bus access handlers
//-------------------------------------------------
-READ8_MEMBER( s2636_device::read )
+READ8_MEMBER( s2636_device::read_data )
{
mask_offset(offset);
UINT8 data = m_registers[offset];
@@ -399,7 +421,7 @@ READ8_MEMBER( s2636_device::read )
return data;
}
-WRITE8_MEMBER( s2636_device::write )
+WRITE8_MEMBER( s2636_device::write_data )
{
mask_offset(offset);
@@ -409,6 +431,17 @@ WRITE8_MEMBER( s2636_device::write )
m_registers[offset] = data;
}
+WRITE_LINE_MEMBER( s2636_device::write_intack )
+{
+ assert((ASSERT_LINE == state) || (HOLD_LINE == state) || (CLEAR_LINE == state) || (PULSE_LINE == state));
+
+ // pretend interrupt acknowledge is handled instantaneously
+ m_intack = state;
+ update_intreq(m_intreq);
+ if (ASSERT_LINE != m_intreq)
+ m_intack = CLEAR_LINE;
+}
+
//-------------------------------------------------
// sound_stream_update - generate audio output
@@ -437,3 +470,14 @@ void s2636_device::sound_stream_update(sound_stream &stream, stream_sample_t **i
m_sample_cnt--;
}
}
+
+
+void s2636_device::update_intreq(int value)
+{
+ int const new_value = m_intack ? CLEAR_LINE : value;
+ if (new_value != m_intreq)
+ {
+ m_intreq = new_value;
+ m_intreq_cb(m_intreq);
+ }
+}
diff --git a/src/devices/machine/s2636.h b/src/devices/machine/s2636.h
index eb97a1b74b4..2a22aa323d7 100644
--- a/src/devices/machine/s2636.h
+++ b/src/devices/machine/s2636.h
@@ -13,12 +13,29 @@
#define S2636_IS_PIXEL_DRAWN(p) (((p) & 0x08) ? TRUE : FALSE)
#define S2636_PIXEL_COLOR(p) ((p) & 0x07)
+
/*************************************
*
* Device configuration macros
*
*************************************/
+#define MCFG_S2636_OFFSETS(_yoffs, _xoffs) \
+ s2636_device::set_offsets(*device, _yoffs, _xoffs);
+
+#define MCFG_S2636_DIVIDER(_divider) \
+ s2636_device::set_divider(*device, _divider);
+
+#define MCFG_S2623_SET_INTREQ_CALLBACK(_devcb) \
+ devcb = &s2636_device::set_intreq_cb(*device, DEVCB_##_devcb);
+
+
+/*************************************
+ *
+ * Device state class
+ *
+ *************************************/
+
class s2636_device : public device_t,
public device_video_interface,
public device_sound_interface
@@ -40,6 +57,12 @@ public:
dev.m_divider = divider;
}
+ template<class _Object> static devcb_base &set_intreq_cb(device_t &device, _Object object)
+ {
+ s2636_device &dev = downcast<s2636_device &>(device);
+ return dev.m_intreq_cb.set_callback(object);
+ }
+
// returns a BITMAP_FORMAT_IND16 bitmap the size of the screen
// D0-D2 of each pixel is the pixel color
// D3 indicates how the S2636 drew this pixel - 0 = background, 1 = object/score
@@ -53,8 +76,10 @@ public:
void render_first_line();
void render_next_line();
- DECLARE_READ8_MEMBER( read );
- DECLARE_WRITE8_MEMBER( write );
+ DECLARE_READ8_MEMBER( read_data );
+ DECLARE_WRITE8_MEMBER( write_data );
+
+ DECLARE_WRITE_LINE_MEMBER( write_intack );
protected:
// device-level overrides
@@ -116,22 +141,35 @@ private:
UINT8 object_color(int obj) const { return (m_registers[REG_OBJ_CLR_1_2 + (obj >> 1)] >> ((obj & 1) ? 0 : 3)) & 0x07; }
UINT8 score_digit(int digit) const { return (m_registers[REG_SCORE_1_2 + (digit >> 1)] >> ((digit & 1) ? 0 : 4)) & 0x0f; }
- int m_divider;
- int m_y_offset;
- int m_x_offset;
+ void update_intreq(int value);
- bitmap_ind16 m_bitmap;
+ // Configuration
+ int m_divider;
+ int m_y_offset;
+ int m_x_offset;
- UINT8 m_registers[0x100];
+ // interfacing with other devices
+ devcb_write_line m_intreq_cb;
+ bitmap_ind16 m_bitmap;
- int m_obj_cnt[OBJ_COUNT];
- bool m_obj_disp[OBJ_COUNT];
- bool m_obj_dup[OBJ_COUNT];
+ // 256-byte register file (not all of this really exists)
+ UINT8 m_registers[0x100];
- bool m_vrst;
- int m_screen_line;
- int m_vis_line;
+ // tracking where we're up to in the screen update
+ bool m_vrst;
+ int m_screen_line;
+ int m_vis_line;
+ // current display state of object
+ int m_obj_cnt[OBJ_COUNT];
+ bool m_obj_disp[OBJ_COUNT];
+ bool m_obj_dup[OBJ_COUNT];
+
+ // interrupt generation
+ int m_intreq;
+ int m_intack;
+
+ // sound generation state
sound_stream *m_stream;
int m_sample_cnt;
bool m_sound_lvl;
@@ -139,12 +177,4 @@ private:
extern const device_type S2636;
-
-#define MCFG_S2636_OFFSETS(_yoffs, _xoffs) \
- s2636_device::set_offsets(*device, _yoffs, _xoffs);
-
-#define MCFG_S2636_DIVIDER(_divider) \
- s2636_device::set_divider(*device, _divider);
-
-
#endif /* __S2636_H__ */
diff --git a/src/devices/machine/s3c2400.h b/src/devices/machine/s3c2400.h
index 5c8b6d3dcb9..fbd2e5e70d4 100644
--- a/src/devices/machine/s3c2400.h
+++ b/src/devices/machine/s3c2400.h
@@ -769,7 +769,7 @@ public:
{
s3c24xx_lcd_regs_t regs;
emu_timer *timer;
- bitmap_rgb32 *bitmap[2];
+ std::unique_ptr<bitmap_rgb32> bitmap[2];
UINT32 vramaddr_cur;
UINT32 vramaddr_max;
UINT32 offsize;
diff --git a/src/devices/machine/s3c2410.h b/src/devices/machine/s3c2410.h
index 33665eabbcb..6e9b28a9146 100644
--- a/src/devices/machine/s3c2410.h
+++ b/src/devices/machine/s3c2410.h
@@ -935,7 +935,7 @@ public:
{
s3c24xx_lcd_regs_t regs;
emu_timer *timer;
- bitmap_rgb32 *bitmap[2];
+ std::unique_ptr<bitmap_rgb32> bitmap[2];
UINT32 vramaddr_cur;
UINT32 vramaddr_max;
UINT32 offsize;
diff --git a/src/devices/machine/s3c2440.h b/src/devices/machine/s3c2440.h
index 9adfce38569..58976ddcf1a 100644
--- a/src/devices/machine/s3c2440.h
+++ b/src/devices/machine/s3c2440.h
@@ -1006,7 +1006,7 @@ public:
{
s3c24xx_lcd_regs_t regs;
emu_timer *timer;
- bitmap_rgb32 *bitmap[2];
+ std::unique_ptr<bitmap_rgb32> bitmap[2];
UINT32 vramaddr_cur;
UINT32 vramaddr_max;
UINT32 offsize;
diff --git a/src/devices/machine/s3c24xx.inc b/src/devices/machine/s3c24xx.inc
index 07193f890a4..e2c4800f077 100644
--- a/src/devices/machine/s3c24xx.inc
+++ b/src/devices/machine/s3c24xx.inc
@@ -716,8 +716,8 @@ TIMER_CALLBACK_MEMBER( S3C24_CLASS_NAME::s3c24xx_lcd_timer_exp )
void S3C24_CLASS_NAME::s3c24xx_video_start()
{
screen_device *screen = machine().first_screen();
- m_lcd.bitmap[0] = auto_bitmap_rgb32_alloc(machine(), screen->width(), screen->height());
- m_lcd.bitmap[1] = auto_bitmap_rgb32_alloc(machine(), screen->width(), screen->height());
+ m_lcd.bitmap[0] = std::make_unique<bitmap_rgb32>( screen->width(), screen->height());
+ m_lcd.bitmap[1] = std::make_unique<bitmap_rgb32>( screen->width(), screen->height());
}
void S3C24_CLASS_NAME::bitmap_blend( bitmap_rgb32 &bitmap_dst, bitmap_rgb32 &bitmap_src_1, bitmap_rgb32 &bitmap_src_2)
diff --git a/src/devices/machine/s3c44b0.cpp b/src/devices/machine/s3c44b0.cpp
index 37402f900b0..19579a1aa03 100644
--- a/src/devices/machine/s3c44b0.cpp
+++ b/src/devices/machine/s3c44b0.cpp
@@ -387,7 +387,7 @@ void s3c44b0_device::lcd_dma_read(int count, UINT8 *data)
void s3c44b0_device::lcd_render_stn_04()
{
- UINT8 *bitmap = m_lcd.bitmap + ((m_lcd.vpos - m_lcd.vpos_min) * (m_lcd.hpos_max - m_lcd.hpos_min + 1)) + (m_lcd.hpos - m_lcd.hpos_min);
+ UINT8 *bitmap = m_lcd.bitmap.get() + ((m_lcd.vpos - m_lcd.vpos_min) * (m_lcd.hpos_max - m_lcd.hpos_min + 1)) + (m_lcd.hpos - m_lcd.hpos_min);
UINT8 data[16];
lcd_dma_read(16, data);
for (auto & elem : data)
@@ -403,7 +403,7 @@ void s3c44b0_device::lcd_render_stn_04()
if (m_lcd.vpos > m_lcd.vpos_max)
{
m_lcd.vpos = m_lcd.vpos_min;
- bitmap = m_lcd.bitmap;
+ bitmap = m_lcd.bitmap.get();
}
m_lcd.hpos = m_lcd.hpos_min;
}
@@ -413,7 +413,7 @@ void s3c44b0_device::lcd_render_stn_04()
void s3c44b0_device::lcd_render_stn_08()
{
- UINT8 *bitmap = m_lcd.bitmap + ((m_lcd.vpos - m_lcd.vpos_min) * (m_lcd.hpos_max - m_lcd.hpos_min + 1)) + (m_lcd.hpos - m_lcd.hpos_min);
+ UINT8 *bitmap = m_lcd.bitmap.get() + ((m_lcd.vpos - m_lcd.vpos_min) * (m_lcd.hpos_max - m_lcd.hpos_min + 1)) + (m_lcd.hpos - m_lcd.hpos_min);
UINT8 data[16];
lcd_dma_read(16, data);
for (auto & elem : data)
@@ -432,7 +432,7 @@ void s3c44b0_device::lcd_render_stn_08()
if (m_lcd.vpos > m_lcd.vpos_max)
{
m_lcd.vpos = m_lcd.vpos_min;
- bitmap = m_lcd.bitmap;
+ bitmap = m_lcd.bitmap.get();
}
m_lcd.hpos = m_lcd.hpos_min;
}
@@ -510,7 +510,7 @@ UINT32 s3c44b0_device::video_update(screen_device &screen, bitmap_rgb32 &bitmap,
for (int y = 0; y < screen.height(); y++)
{
UINT32 *scanline = &bitmap.pix32(y);
- UINT8 *vram = m_lcd.bitmap + y * (m_lcd.hpos_max - m_lcd.hpos_min + 1);
+ UINT8 *vram = m_lcd.bitmap.get() + y * (m_lcd.hpos_max - m_lcd.hpos_min + 1);
for (int x = 0; x < screen.width(); x++)
{
*scanline++ = rgb_t(vram[0], vram[1], vram[2]);
@@ -596,9 +596,9 @@ void s3c44b0_device::lcd_configure()
verboselog( *this, 3, "LCD - min_x %d min_y %d max_x %d max_y %d\n", m_lcd.hpos_min, m_lcd.vpos_min, m_lcd.hpos_max, m_lcd.vpos_max);
if (m_lcd.bitmap)
{
- auto_free(machine(), m_lcd.bitmap);
+ m_lcd.bitmap = nullptr;
}
- m_lcd.bitmap = auto_alloc_array(machine(), UINT8, (m_lcd.hpos_max - m_lcd.hpos_min + 1) * (m_lcd.vpos_max - m_lcd.vpos_min + 1) * 3);
+ m_lcd.bitmap = std::make_unique<UINT8[]>((m_lcd.hpos_max - m_lcd.hpos_min + 1) * (m_lcd.vpos_max - m_lcd.vpos_min + 1) * 3);
m_lcd.frame_period = HZ_TO_ATTOSECONDS(m_lcd.framerate);
m_lcd.scantime = m_lcd.frame_period / m_lcd.vpos_end;
m_lcd.pixeltime = m_lcd.frame_period / (m_lcd.vpos_end * m_lcd.hpos_end);
diff --git a/src/devices/machine/s3c44b0.h b/src/devices/machine/s3c44b0.h
index cdf1fe6d72e..05b0c134532 100644
--- a/src/devices/machine/s3c44b0.h
+++ b/src/devices/machine/s3c44b0.h
@@ -505,7 +505,7 @@ struct s3c44b0_lcd_t
{
s3c44b0_lcd_regs_t regs;
emu_timer *timer;
- UINT8 *bitmap;
+ std::unique_ptr<UINT8[]> bitmap;
UINT32 vramaddr_cur;
UINT32 vramaddr_max;
UINT32 offsize;
diff --git a/src/devices/machine/smc91c9x.cpp b/src/devices/machine/smc91c9x.cpp
index c075f03fb76..a38be999136 100644
--- a/src/devices/machine/smc91c9x.cpp
+++ b/src/devices/machine/smc91c9x.cpp
@@ -377,7 +377,7 @@ void smc91c9x_device::process_command(UINT16 data)
READ16_MEMBER( smc91c9x_device::read )
{
- UINT32 result = ~0;
+ UINT32 result;
/* determine the effective register */
offset %= 8;
diff --git a/src/devices/machine/smpc.cpp b/src/devices/machine/smpc.cpp
index caf0834da5a..34a7cb87f05 100644
--- a/src/devices/machine/smpc.cpp
+++ b/src/devices/machine/smpc.cpp
@@ -214,15 +214,15 @@ TIMER_CALLBACK_MEMBER( saturn_state::smpc_cd_enable )
void saturn_state::smpc_system_reset()
{
/*Only backup ram and SMPC ram are retained after that this command is issued.*/
- memset(m_scu_regs ,0x00,0x000100);
- memset(m_scsp_regs,0x00,0x001000);
+ memset(m_scu_regs.get() ,0x00,0x000100);
+ memset(m_scsp_regs.get(),0x00,0x001000);
memset(m_sound_ram,0x00,0x080000);
memset(m_workram_h,0x00,0x100000);
memset(m_workram_l,0x00,0x100000);
- memset(m_vdp2_regs,0x00,0x040000);
- memset(m_vdp2_vram,0x00,0x100000);
- memset(m_vdp2_cram,0x00,0x080000);
- memset(m_vdp1_vram,0x00,0x100000);
+ memset(m_vdp2_regs.get(),0x00,0x040000);
+ memset(m_vdp2_vram.get(),0x00,0x100000);
+ memset(m_vdp2_cram.get(),0x00,0x080000);
+ memset(m_vdp1_vram.get(),0x00,0x100000);
//A-Bus
m_maincpu->set_input_line(INPUT_LINE_RESET, PULSE_LINE);
diff --git a/src/devices/machine/steppers.cpp b/src/devices/machine/steppers.cpp
index e1eea4d648e..2f63c8529d3 100644
--- a/src/devices/machine/steppers.cpp
+++ b/src/devices/machine/steppers.cpp
@@ -142,7 +142,7 @@ int stepper_device::update(UINT8 pattern)
a small movement that may trigger the optic tab.
*/
- int pos,steps=0;
+ int pos,steps;
m_pattern = pattern;
switch ( m_type )
{
diff --git a/src/devices/machine/strata.cpp b/src/devices/machine/strata.cpp
index 01651eb90bd..4f7006f4d99 100644
--- a/src/devices/machine/strata.cpp
+++ b/src/devices/machine/strata.cpp
@@ -59,7 +59,7 @@ strataflash_device::strataflash_device(const machine_config &mconfig, const char
void strataflash_device::nvram_default()
{
- memset(m_flashmemory, 0, COMPLETE_SIZE);
+ memset(m_flashmemory.get(), 0, COMPLETE_SIZE);
}
//-------------------------------------------------
@@ -69,7 +69,7 @@ void strataflash_device::nvram_default()
void strataflash_device::nvram_read(emu_file &file)
{
- file.read(m_flashmemory, COMPLETE_SIZE);
+ file.read(m_flashmemory.get(), COMPLETE_SIZE);
// TODO
@@ -173,7 +173,7 @@ void strataflash_device::nvram_write(emu_file &file)
return 0;
*/
- file.write(m_flashmemory, COMPLETE_SIZE);
+ file.write(m_flashmemory.get(), COMPLETE_SIZE);
}
//-------------------------------------------------
@@ -184,15 +184,15 @@ void strataflash_device::device_start(void)
m_mode = FM_NORMAL;
m_status = 0x80;
m_master_lock = 0;
- m_flashmemory = auto_alloc_array(machine(), UINT8, COMPLETE_SIZE);
+ m_flashmemory = std::make_unique<UINT8[]>(COMPLETE_SIZE);
- m_wrbuf = m_flashmemory + FEEPROM_SIZE;
+ m_wrbuf = m_flashmemory.get() + FEEPROM_SIZE;
m_prot_regs = m_wrbuf + WRBUF_SIZE;
m_blocklock = m_prot_regs + PROT_REGS_SIZE;
// clear various FEEPROM areas
memset(m_prot_regs, 0xff, 18);
- memset(m_flashmemory, 0xff, FEEPROM_SIZE);
+ memset(m_flashmemory.get(), 0xff, FEEPROM_SIZE);
memset(m_blocklock, 0x00, BLOCKLOCK_SIZE);
// set-up factory-programmed protection register segment
@@ -234,7 +234,7 @@ UINT16 strataflash_device::read8_16(address_space& space, offs_t offset, bus_wid
case bw_8:
return m_flashmemory[BYTE_XOR_LE(offset)];
case bw_16:
- return *(UINT16*)(m_flashmemory+offset);
+ return *(UINT16*)(m_flashmemory.get()+offset);
}
break;
case FM_READSTATUS:
@@ -562,7 +562,7 @@ void strataflash_device::write8_16(address_space& space, offs_t offset, UINT16 d
m_flashmemory[BYTE_XOR_LE(offset)] &= data;
break;
case bw_16:
- *(UINT16*)(m_flashmemory+offset) &= data;
+ *(UINT16*)(m_flashmemory.get()+offset) &= data;
break;
}
}
diff --git a/src/devices/machine/strata.h b/src/devices/machine/strata.h
index 1d1835f0812..5092d1e891e 100644
--- a/src/devices/machine/strata.h
+++ b/src/devices/machine/strata.h
@@ -64,7 +64,7 @@ private:
int m_wrbuf_len; // count converted into byte length in write buffer command
int m_wrbuf_count; // current count in write buffer command
UINT8* m_wrbuf; // write buffer used by write buffer command
- UINT8* m_flashmemory; // main FEEPROM area
+ std::unique_ptr<UINT8[]> m_flashmemory; // main FEEPROM area
UINT8* m_blocklock; // block lock flags
UINT8* m_prot_regs; // protection registers
};
diff --git a/src/devices/machine/stvcd.cpp b/src/devices/machine/stvcd.cpp
index 09d7b9e09a5..5ec8fb7c95f 100644
--- a/src/devices/machine/stvcd.cpp
+++ b/src/devices/machine/stvcd.cpp
@@ -1483,7 +1483,7 @@ void saturn_state::stvcd_reset( void )
else
{
// MAME case
- cdrom = cdrom_open(get_disk_handle(machine(), "cdrom"));
+ cdrom = cdrom_open(machine().rom_load().get_disk_handle("cdrom"));
}
machine().device<cdda_device>("cdda")->set_cdrom(cdrom);
@@ -2346,7 +2346,7 @@ void saturn_state::cd_readTOC(void)
saturn_state::partitionT *saturn_state::cd_filterdata(filterT *flt, int trktype, UINT8 *p_ok)
{
int match, keepgoing;
- partitionT *filterprt = (partitionT *)nullptr;
+ partitionT *filterprt;
CDROM_LOG(("cd_filterdata, trktype %d\n", trktype))
match = 1;
@@ -2678,7 +2678,7 @@ void saturn_state::stvcd_set_tray_close( void )
else
{
// MAME case
- cdrom = cdrom_open(get_disk_handle(machine(), "cdrom"));
+ cdrom = cdrom_open(machine().rom_load().get_disk_handle("cdrom"));
}
machine().device<cdda_device>("cdda")->set_cdrom(cdrom);
diff --git a/src/devices/machine/t10mmc.h b/src/devices/machine/t10mmc.h
index 07056e22795..8b2f5a73cd7 100644
--- a/src/devices/machine/t10mmc.h
+++ b/src/devices/machine/t10mmc.h
@@ -16,6 +16,11 @@ t10mmc.h
class t10mmc : public virtual t10spc
{
public:
+ t10mmc()
+ : t10spc(), m_image(nullptr), m_cdda(nullptr), m_cdrom(nullptr), m_lba(0), m_blocks(0), m_last_lba(0), m_num_subblocks(0), m_cur_subblock(0), m_audio_sense(0), m_device(nullptr)
+ {
+ }
+
virtual void SetDevice( void *device ) override;
virtual void GetDevice( void **device ) override;
virtual void ExecCommand() override;
diff --git a/src/devices/machine/t10sbc.h b/src/devices/machine/t10sbc.h
index 889b73c53a0..1ca570c89ca 100644
--- a/src/devices/machine/t10sbc.h
+++ b/src/devices/machine/t10sbc.h
@@ -15,6 +15,11 @@ t10sbc.h
class t10sbc : public virtual t10spc
{
public:
+ t10sbc()
+ : t10spc(), m_image(nullptr), m_lba(0), m_blocks(0), m_disk(nullptr), m_device(nullptr)
+ {
+ }
+
virtual void SetDevice( void *device ) override;
virtual void GetDevice( void **device ) override;
virtual void ExecCommand() override;
diff --git a/src/devices/machine/t10spc.h b/src/devices/machine/t10spc.h
index 778fd40bce1..cad5a65c3a5 100644
--- a/src/devices/machine/t10spc.h
+++ b/src/devices/machine/t10spc.h
@@ -14,6 +14,10 @@ t10spc.h
class t10spc
{
public:
+ t10spc() : commandLength(0), m_transfer_length(0), m_phase(0), m_status_code(), m_sense_key(0), m_sense_asc(0), m_sense_ascq(0), m_sense_information(0), m_sector_bytes(0), m_device(nullptr)
+ {
+ }
+
virtual ~t10spc() {};
virtual void SetDevice( void *device ) = 0;
virtual void GetDevice( void **device ) = 0;
diff --git a/src/devices/machine/tc009xlvc.cpp b/src/devices/machine/tc009xlvc.cpp
index 32c02a32db7..724bd5edf16 100644
--- a/src/devices/machine/tc009xlvc.cpp
+++ b/src/devices/machine/tc009xlvc.cpp
@@ -297,7 +297,7 @@ void tc0091lvc_device::device_start()
//printf("m_gfx_index %d\n", m_gfx_index);
- m_gfxdecode->set_gfx(m_gfx_index, global_alloc(gfx_element(m_palette, char_layout, (UINT8 *)m_pcg_ram, 0, m_palette->entries() / 16, 0)));
+ m_gfxdecode->set_gfx(m_gfx_index, std::make_unique<gfx_element>(m_palette, char_layout, (UINT8 *)m_pcg_ram, 0, m_palette->entries() / 16, 0));
}
void tc0091lvc_device::device_reset()
diff --git a/src/devices/machine/tc009xlvc.h b/src/devices/machine/tc009xlvc.h
index 9cd3cf3a11e..66911acd4e5 100644
--- a/src/devices/machine/tc009xlvc.h
+++ b/src/devices/machine/tc009xlvc.h
@@ -43,9 +43,6 @@ public:
DECLARE_READ8_MEMBER( tc0091lvc_tvram_r );
DECLARE_WRITE8_MEMBER( tc0091lvc_tvram_w );
- DECLARE_WRITE8_MEMBER( tc0091lvc_bg0_scroll_w );
- DECLARE_WRITE8_MEMBER( tc0091lvc_bg1_scroll_w );
-
TILE_GET_INFO_MEMBER(get_bg0_tile_info);
TILE_GET_INFO_MEMBER(get_bg1_tile_info);
TILE_GET_INFO_MEMBER(get_tx_tile_info);
diff --git a/src/devices/machine/timekpr.cpp b/src/devices/machine/timekpr.cpp
index ccd849ef21d..7b602c896c6 100644
--- a/src/devices/machine/timekpr.cpp
+++ b/src/devices/machine/timekpr.cpp
@@ -120,8 +120,9 @@ static int counter_from_ram( UINT8 *data, int offset )
//-------------------------------------------------
timekeeper_device::timekeeper_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source)
- : device_t(mconfig, type, name, tag, owner, clock, shortname, source),
- device_nvram_interface(mconfig, *this)
+ : device_t(mconfig, type, name, tag, owner, clock, shortname, source)
+ , device_nvram_interface(mconfig, *this)
+ , m_default_data(*this, DEVICE_SELF)
{
}
@@ -230,10 +231,9 @@ void timekeeper_device::device_start()
m_century = make_bcd( systime.local_time.year / 100 );
m_data.resize( m_size );
- m_default_data = region()->base();
if (m_default_data)
{
- assert( region()->bytes() == m_size );
+ assert(m_default_data.bytes() == m_size);
}
save_item( NAME(m_control) );
diff --git a/src/devices/machine/timekpr.h b/src/devices/machine/timekpr.h
index 4cb11f6ea86..84c969b076d 100644
--- a/src/devices/machine/timekpr.h
+++ b/src/devices/machine/timekpr.h
@@ -88,7 +88,7 @@ private:
UINT8 m_century;
dynamic_buffer m_data;
- UINT8 *m_default_data;
+ optional_region_ptr<UINT8> m_default_data;
protected:
int m_size;
diff --git a/src/devices/machine/tms6100.cpp b/src/devices/machine/tms6100.cpp
index 7d0f3226ca5..7242ca1312d 100644
--- a/src/devices/machine/tms6100.cpp
+++ b/src/devices/machine/tms6100.cpp
@@ -1,129 +1,55 @@
// license:BSD-3-Clause
-// copyright-holders:Couriersud
+// copyright-holders:hap, Couriersud
/**********************************************************************************************
- TMS6100 simulator
-
- Written for MAME by Couriersud
-
- Todo:
- - implement CS
- - implement 4 bit mode (mask programmed)
- - implement chip addressing (0-15 mask programmed)
-
- TMS6100:
-
- +-----------------+
- VDD | 1 28 | NC
- NC | 2 27 | NC
- DATA/ADD1 | 3 26 | NC
- DATA/ADD2 | 4 25 | NC
- DATA/ADD4 | 5 24 | NC
- DATA/ADD8 | 6 23 | NC
- CLK | 7 22 | NC
- NC | 8 21 | NC
- NC | 9 20 | NC
- M0 | 10 19 | NC
- M1 | 11 18 | NC
- NC | 12 17 | NC
- /CS | 13 16 | NC
- VSS | 14 15 | NC
- +-----------------+
-
- TMS6125:
-
- +---------+
- DATA/ADD1 | 1 16 | NC
- DATA/ADD2 | 2 15 | NC
- DATA/ADD4 | 3 14 | NC
- DATA/ADD8 | 4 13 | NC
- CLK | 5 12 | VDD
- NC | 6 11 | /CS
- NC | 7 10 | M1
- M0 | 8 9 | VSS
- +---------+
-
- M58819 (from radarscope schematics):
-
- +-----------------+
- AD0 | 1 40 | AD1
- GND | 2 39 | AD2
- -5V | 3 38 | AD3
- A0 | 4 37 | AD4
- NC | 5 36 | AD5
- NC | 6 35 | AD6
- A1 | 7 34 | AD7
- A2 | 8 33 | AD8
- A3 | 9 32 | AD9
- CLK | 10 31 | AD10
- NC | 11 30 | AD11
- -5V | 12 29 | AD12
- C0 | 13 28 | NC
- C1 | 14 27 | NC
- NC | 15 26 | I7
- NC | 16 25 | NC
- +5V | 17 24 | I6
- I0 | 18 23 | I5
- I1 | 19 22 | I4
- I2 | 20 21 | I3
- +-----------------+
-
- The M58819 is used as an interface to external speech eproms.
- NC pins may have a function, although they are not connected in
- radarscope.
+ Texas Instruments TMS6100 Voice Synthesis Memory (VSM)
-***********************************************************************************************/
-
-#include "emu.h"
-#include "tms6100.h"
+ References:
+ - TMS 6100 Voice Synthesis Memory Data Manual
+ - TMS 6125 Voice Synthesis Memory Data Manual
+ - Speak & Spell patent US4189779 for low-level documentation
+ - 1982 Mitsubishi Data Book (M58819S section)
-#define VERBOSE (0)
+ TODO:
+ - implement clock pin(CLK) properly, xtal/timer
+ - command processing timing is not accurate, on the real chip it will take a few microseconds
+ - current implementation does not regard multi-chip configuration and pretends it is 1 chip,
+ this will work fine under normal circumstances since CS would be disabled on invalid address
+ - implement chip addressing (0-15 mask programmed, see above)
+ - M58819S pins SL(PROM expansion input), POC(reset)
-#if VERBOSE
-#define LOG(x) logerror x
-#else
-#define LOG(x)
-#endif
-
-#define TMS6100_READ_PENDING 0x01
-#define TMS6100_NEXT_READ_IS_DUMMY 0x02
+***********************************************************************************************/
-/* Variants */
+#include "tms6100.h"
-#define TMS6110_IS_TMS6100 (1)
-#define TMS6110_IS_M58819 (2)
+// device definitions
const device_type TMS6100 = &device_creator<tms6100_device>;
tms6100_device::tms6100_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source)
: device_t(mconfig, type, name, tag, owner, clock, shortname, source),
- m_rom(*this, DEVICE_SELF)
+ m_rom(*this, DEVICE_SELF),
+ m_reverse_bits(false),
+ m_4bit_mode(false)
{
}
tms6100_device::tms6100_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: device_t(mconfig, TMS6100, "TMS6100", tag, owner, clock, "tms6100", __FILE__),
- m_rom(*this, DEVICE_SELF)
+ m_rom(*this, DEVICE_SELF),
+ m_reverse_bits(false),
+ m_4bit_mode(false)
{
}
const device_type M58819 = &device_creator<m58819_device>;
m58819_device::m58819_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
- : tms6100_device(mconfig, M58819, "M58819 Memory Controller", tag, owner, clock, "m58819", __FILE__)
+ : tms6100_device(mconfig, M58819, "M58819S", tag, owner, clock, "m58819s", __FILE__)
{
}
-//-------------------------------------------------
-// device_config_complete - perform any
-// operations now that the configuration is
-// complete
-//-------------------------------------------------
-
-void tms6100_device::device_config_complete()
-{
-}
//-------------------------------------------------
// device_start - device-specific startup
@@ -131,134 +57,204 @@ void tms6100_device::device_config_complete()
void tms6100_device::device_start()
{
- // save device variables
- save_item(NAME(m_addr_bits));
+ m_rommask = m_rom.bytes() - 1;
+
+ // zerofill
+ m_address = 0;
+ m_sa = 0;
+ m_count = 0;
+ m_prev_cmd = 0;
+ m_prev_m = 0;
+
+ m_add = 0;
+ m_data = 0;
+ m_m0 = 0;
+ m_m1 = 0;
+ m_cs = 1;
+ m_clk = 0;
+ m_rck = 0;
+
+ // register for savestates
save_item(NAME(m_address));
- save_item(NAME(m_address_latch));
- save_item(NAME(m_tms_clock));
+ save_item(NAME(m_sa));
+ save_item(NAME(m_count));
+ save_item(NAME(m_prev_cmd));
+ save_item(NAME(m_prev_m));
+ save_item(NAME(m_add));
save_item(NAME(m_data));
- save_item(NAME(m_loadptr));
save_item(NAME(m_m0));
save_item(NAME(m_m1));
- save_item(NAME(m_state));
- save_item(NAME(m_variant));
- set_variant(TMS6110_IS_TMS6100);
-
+ save_item(NAME(m_cs));
+ save_item(NAME(m_clk));
+ save_item(NAME(m_rck));
}
void m58819_device::device_start()
{
tms6100_device::device_start();
- set_variant(TMS6110_IS_M58819);
+ m_reverse_bits = true; // m58819 'vsm-emulator' chip expects ROM bit order backwards
}
-//-------------------------------------------------
-// device_reset - device-specific reset
-//-------------------------------------------------
-void tms6100_device::device_reset()
+// external i/o
+
+WRITE_LINE_MEMBER(tms6100_device::m0_w)
{
- /* initialize the chip */
- m_addr_bits = 0;
- m_address = 0;
- m_address_latch = 0;
- m_loadptr = 0;
- m_m0 = 0;
- m_m1 = 0;
- m_state = 0;
- m_tms_clock = 0;
- m_data = 0;
+ m_m0 = (state) ? 1 : 0;
}
-void tms6100_device::set_variant(int variant)
+WRITE_LINE_MEMBER(tms6100_device::m1_w)
{
- m_variant = variant;
+ m_m1 = (state) ? 1 : 0;
}
-WRITE_LINE_MEMBER(tms6100_device::tms6100_m0_w)
+WRITE_LINE_MEMBER(tms6100_device::cs_w)
{
- if (state != m_m0)
- m_m0 = state;
+ // chip select pin
+ m_cs = (state) ? 1 : 0;
}
-WRITE_LINE_MEMBER(tms6100_device::tms6100_m1_w)
+WRITE_LINE_MEMBER(tms6100_device::rck_w)
{
- if (state != m_m1)
- m_m1 = state;
+ // gate/mask for clk
+ m_rck = (state) ? 1 : 0;
}
-WRITE_LINE_MEMBER(tms6100_device::tms6100_romclock_w)
+WRITE8_MEMBER(tms6100_device::add_w)
{
- /* process on falling edge */
- if (m_tms_clock && !state)
+ m_add = data & 0xf;
+}
+
+READ8_MEMBER(tms6100_device::data_r)
+{
+ return m_data & 0xf;
+}
+
+READ_LINE_MEMBER(tms6100_device::data_line_r)
+{
+ // DATA/ADD8
+ return (m_data & 8) ? 1 : 0;
+}
+
+WRITE_LINE_MEMBER(tms6100_device::clk_w)
+{
+ // process on falling edge
+ if (m_clk && !m_rck && !state)
{
- switch ((m_m1<<1) | m_m0)
+ if (m_cs)
{
- case 0x00:
- /* NOP in datasheet, not really ... */
- if (m_state & TMS6100_READ_PENDING)
+ // new command enabled on rising edge of m0/m1
+ UINT8 m = m_m1 << 1 | m_m0;
+ if ((m & ~m_prev_m & 1) || (m & ~m_prev_m & 2))
+ handle_command(m);
+
+ m_prev_m = m;
+ }
+ }
+
+ m_clk = (state) ? 1 : 0;
+}
+
+
+// m0/m1 commands
+
+void tms6100_device::handle_command(UINT8 cmd)
+{
+ enum
+ {
+ M_NOP = 0, M_TB, M_LA, M_RB
+ };
+
+ switch (cmd)
+ {
+ // TB: transfer bit (read)
+ case M_TB:
+ if (m_prev_cmd == M_LA)
+ {
+ // dummy read after LA
+ m_count = 0;
+ }
+ else
{
- if (m_state & TMS6100_NEXT_READ_IS_DUMMY)
+ // load new data from rom
+ if (m_count == 0)
{
- m_address = (m_address_latch << 3);
- m_address_latch = 0;
- m_loadptr = 0;
- m_state &= ~TMS6100_NEXT_READ_IS_DUMMY;
- LOG(("loaded address %08x\n", m_address));
+ m_sa = m_rom[m_address & m_rommask];
+
+ // M58819S reads serial data reversed
+ if (m_reverse_bits)
+ m_sa = BITSWAP8(m_sa,0,1,2,3,4,5,6,7);
}
else
{
- /* read bit at address */
- if (m_variant == TMS6110_IS_M58819)
- {
- m_data = (m_rom[m_address >> 3] >> (7-(m_address & 0x07))) & 1;
- }
- else // m_variant == (TMS6110_IS_TMS6100 || TMS6110_IS_TMS6125)
- {
- m_data = (m_rom[m_address >> 3] >> (m_address & 0x07)) & 1;
- }
- m_address++;
+ // or shift(rotate) right
+ m_sa = (m_sa >> 1) | (m_sa << 7 & 0x80);
}
- m_state &= ~TMS6100_READ_PENDING;
+
+ // output to DATA pin(s)
+ if (!m_4bit_mode)
+ {
+ // 1-bit mode: SA0 to ADD8/DATA
+ m_data = m_sa << 3 & 8;
+ }
+ else
+ {
+ // 4-bit mode: SA0-3 or SA3-6(!) to DATA
+ if (m_count & 1)
+ m_data = m_sa >> 3 & 0xf;
+ else
+ m_data = m_sa & 0xf;
+ }
+
+ // 8 bits in 1-bit mode, otherwise 2 nybbles
+ m_count = (m_count + 1) & (m_4bit_mode ? 1 : 7);
+
+ // TB8
+ if (m_count == 0)
+ m_address++; // CS bits too
}
break;
- case 0x01:
- /* READ */
- m_state |= TMS6100_READ_PENDING;
- break;
- case 0x02:
- /* LOAD ADDRESS */
- m_state |= TMS6100_NEXT_READ_IS_DUMMY;
- m_address_latch |= (m_addr_bits << m_loadptr);
- LOG(("loaded address latch %08x\n", m_address_latch));
- m_loadptr += 4;
+
+ // LA: load address
+ case M_LA:
+ if (m_prev_cmd == M_TB)
+ {
+ // start LA after TB
+ m_address = (m_address & ~0xf) | m_add;
+ m_count = 0;
+ }
+ else if (m_prev_cmd == M_LA)
+ {
+ // load consecutive address bits (including CS bits)
+ // the 8-step counter PLA is shared between LA and TB
+ if (m_count < 4)
+ {
+ const UINT8 shift = 4 * (m_count+1);
+ m_address = (m_address & ~(0xf << shift)) | (m_add << shift);
+ }
+
+ m_count = (m_count + 1) & 7;
+ }
break;
- case 0x03:
- /* READ AND BRANCH */
- if (m_state & TMS6100_NEXT_READ_IS_DUMMY)
+
+ // RB: read and branch
+ case M_RB:
+ // process RB after LA or TB8
+ if (m_prev_cmd == M_LA || (m_prev_cmd == M_TB && m_count == 0))
{
- m_state &= ~TMS6100_NEXT_READ_IS_DUMMY; // clear - no dummy read according to datasheet
- LOG(("loaded address latch %08x\n", m_address_latch));
- m_address = m_rom[m_address_latch] | (m_rom[m_address_latch+1]<<8);
- m_address &= 0x3fff; // 14 bits
- LOG(("loaded indirect address %04x\n", m_address));
- m_address = (m_address << 3);
- m_address_latch = 0;
- m_loadptr = 0;
+ m_count = 0;
+
+ // load new address bits (14 bits on TMS6100)
+ UINT16 rb = m_rom[m_address & m_rommask];
+ m_address++;
+ rb |= (m_rom[m_address & m_rommask] << 8);
+ m_address = (m_address & ~0x3fff) | (rb & 0x3fff);
}
break;
- }
- }
- m_tms_clock = state;
-}
-WRITE8_MEMBER(tms6100_device::tms6100_addr_w)
-{
- if (data != m_addr_bits)
- m_addr_bits = data;
-}
+ default:
+ break;
+ }
-READ_LINE_MEMBER(tms6100_device::tms6100_data_r)
-{
- return m_data;
+ m_prev_cmd = cmd;
}
diff --git a/src/devices/machine/tms6100.h b/src/devices/machine/tms6100.h
index 01c24144624..ae295dec4b2 100644
--- a/src/devices/machine/tms6100.h
+++ b/src/devices/machine/tms6100.h
@@ -1,11 +1,95 @@
// license:BSD-3-Clause
-// copyright-holders:Couriersud
-#pragma once
+// copyright-holders:hap, Couriersud
+/**********************************************************************************************
+
+ Texas Instruments TMS6100 Voice Synthesis Memory (VSM)
+
+***********************************************************************************************/
#ifndef __TMS6100_H__
#define __TMS6100_H__
-/* TMS 6100 memory controller */
+#include "emu.h"
+
+
+//**************************************************************************
+// INTERFACE CONFIGURATION MACROS
+//**************************************************************************
+
+// 4-bit mode (mask option)
+// note: in 4-bit mode, use data_r, otherwise use data_line_r
+
+#define MCFG_TMS6100_4BIT_MODE() \
+ tms6100_device::enable_4bit_mode(*device);
+
+
+// pinout reference
+
+/*
+ TMS6100:
+ +-----------------+
+ VDD | 1 28 | NC
+ NC | 2 27 | NC
+ DATA/ADD1 | 3 26 | NC
+ DATA/ADD2 | 4 25 | NC
+ DATA/ADD4 | 5 24 | NC
+ DATA/ADD8 | 6 23 | NC
+ CLK | 7 22 | NC
+ NC | 8 21 | NC
+ NC | 9 20 | NC
+ M0 | 10 19 | NC
+ M1 | 11 18 | NC
+ NC | 12 17 | NC
+ /CS | 13 16 | NC
+ VSS | 14 15 | NC
+ +-----------------+
+
+
+ TMS6125: two types known
+
+ +---------+ +---------+
+ DATA/ADD1 | 1 16 | NC DATA/ADD1 | 1 16 | NC
+ DATA/ADD2 | 2 15 | NC DATA/ADD2 | 2 15 | NC
+ DATA/ADD4 | 3 14 | NC DATA/ADD4 | 3 14 | NC
+ RCK | 4 13 | NC DATA/ADD8 | 4 13 | NC
+ CLK | 5 12 | VDD CLK | 5 12 | VDD
+ DATA/ADD8 | 6 11 | CS NC | 6 11 | /CS
+ NC | 7 10 | M1 NC | 7 10 | M1
+ M0 | 8 9 | VSS M0 | 8 9 | VSS
+ +---------+ +---------+
+
+
+ Mitsubishi M58819S EPROM Interface:
+ It is a clone of TMS6100, but external EPROM instead
+
+ +-----------------+
+ AD0 | 1 40 | AD1
+ VDDl | 2 39 | AD2
+ VDD | 3 38 | AD3
+ A0 | 4 37 | NC
+ NC | 5 36 | AD4
+ NC | 6 35 | AD5
+ A1 | 7 34 | AD6
+ A2 | 8 33 | AD7
+ A3/Q | 9 32 | AD8
+ CLK | 10 31 | AD9
+ POW | 11 30 | AD10
+ SL | 12 29 | AD11
+ C0 | 13 28 | AD12
+ C1 | 14 27 | AD13
+ NC | 15 26 | D7
+ NC | 16 25 | NC
+ VSS | 17 24 | D6
+ D0 | 18 23 | D5
+ D1 | 19 22 | D4
+ D2 | 20 21 | D3
+ +-----------------+
+*/
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
class tms6100_device : public device_t
{
@@ -13,36 +97,45 @@ public:
tms6100_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
tms6100_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source);
- DECLARE_WRITE_LINE_MEMBER( tms6100_m0_w );
- DECLARE_WRITE_LINE_MEMBER( tms6100_m1_w );
- DECLARE_WRITE_LINE_MEMBER( tms6100_romclock_w );
- DECLARE_WRITE8_MEMBER( tms6100_addr_w );
+ static void enable_4bit_mode(device_t &device) { downcast<tms6100_device &>(device).m_4bit_mode = true; }
+
+ DECLARE_WRITE_LINE_MEMBER(m0_w);
+ DECLARE_WRITE_LINE_MEMBER(m1_w);
+ DECLARE_WRITE_LINE_MEMBER(rck_w);
+ DECLARE_WRITE_LINE_MEMBER(cs_w);
+ DECLARE_WRITE_LINE_MEMBER(clk_w);
- DECLARE_READ_LINE_MEMBER( tms6100_data_r );
+ DECLARE_WRITE8_MEMBER(add_w);
+ DECLARE_READ8_MEMBER(data_r); // 4bit
+ DECLARE_READ_LINE_MEMBER(data_line_r);
protected:
// device-level overrides
- virtual void device_config_complete() override;
virtual void device_start() override;
- virtual void device_reset() override;
- void set_variant(int variant);
-private:
+
+ void handle_command(UINT8 cmd);
+
// internal state
required_region_ptr<UINT8> m_rom;
- UINT32 m_address;
- UINT32 m_address_latch;
- UINT8 m_loadptr;
- UINT8 m_m0;
- UINT8 m_m1;
- UINT8 m_addr_bits;
- UINT8 m_tms_clock;
- UINT8 m_data;
- UINT8 m_state;
- UINT8 m_variant;
+ bool m_reverse_bits;
+ bool m_4bit_mode;
+
+ UINT32 m_rommask;
+ UINT32 m_address; // internal address + chipselect
+ UINT8 m_sa; // romdata shift register
+ UINT8 m_count; // TB/LA counter (-> PLA)
+ UINT8 m_prev_cmd; // previous handled command
+ UINT8 m_prev_m; // previous valid m0/m1 state
+ UINT8 m_add; // ADD/DATA pins input
+ UINT8 m_data; // ADD/DATA pins output
+ int m_m0;
+ int m_m1;
+ int m_cs; // chipselect pin
+ int m_clk; // CLK pin
+ int m_rck; // RCK pin (mask/gate to CLK?)
};
-extern const device_type TMS6100;
class m58819_device : public tms6100_device
{
@@ -54,6 +147,8 @@ protected:
virtual void device_start() override;
};
+
+extern const device_type TMS6100;
extern const device_type M58819;
diff --git a/src/devices/machine/upd765.cpp b/src/devices/machine/upd765.cpp
index 54c1119d4e7..48901ef2314 100644
--- a/src/devices/machine/upd765.cpp
+++ b/src/devices/machine/upd765.cpp
@@ -1335,7 +1335,7 @@ void upd765_family_device::start_command(int cmd)
main_phase = PHASE_RESULT;
int fid;
- for(fid=0; fid<4 && !flopi[fid].st0_filled; fid++);
+ for(fid=0; fid<4 && !flopi[fid].st0_filled; fid++) {};
if(fid == 4) {
result[0] = ST0_UNK;
result_pos = 1;
@@ -2247,7 +2247,6 @@ void upd765_family_device::run_drive_ready_polling()
void upd765_family_device::index_callback(floppy_image_device *floppy, int state)
{
for(auto & fi : flopi) {
-
if(fi.dev != floppy)
continue;
diff --git a/src/devices/machine/v3021.h b/src/devices/machine/v3021.h
index 8764c4c3eff..7e4844216c4 100644
--- a/src/devices/machine/v3021.h
+++ b/src/devices/machine/v3021.h
@@ -53,9 +53,6 @@ protected:
virtual void device_start() override;
virtual void device_reset() override;
- inline UINT8 rtc_read(UINT8 offset);
- inline void rtc_write(UINT8 offset,UINT8 data);
-
static TIMER_CALLBACK( rtc_inc_callback );
UINT8 m_cal_mask,m_cal_com,m_cal_cnt,m_cal_val;
diff --git a/src/devices/machine/wd2010.cpp b/src/devices/machine/wd2010.cpp
index 6f50622ec79..a97b35b2517 100644
--- a/src/devices/machine/wd2010.cpp
+++ b/src/devices/machine/wd2010.cpp
@@ -224,7 +224,7 @@ void wd2010_device::device_reset()
READ8_MEMBER(wd2010_device::read)
{
- UINT8 data = 0;
+ UINT8 data;
switch (offset)
{
@@ -462,8 +462,8 @@ void wd2010_device::seek(UINT8 data)
auto_scan_id(data); // has drive number changed?
- int direction = 0; // 0 = towards 0
- int step_pulses = 0;
+ int direction; // 0 = towards 0
+ int step_pulses;
// Calculate number of steps by comparing the cylinder registers
// HI/LO with the internally stored position.
diff --git a/src/devices/machine/wd_fdc.cpp b/src/devices/machine/wd_fdc.cpp
index 32cda7b663c..15744f5f7bc 100644
--- a/src/devices/machine/wd_fdc.cpp
+++ b/src/devices/machine/wd_fdc.cpp
@@ -360,6 +360,9 @@ void wd_fdc_t::seek_continue()
case SEEK_DONE:
if (TRACE_STATE) logerror("%s: SEEK_DONE\n", tag());
status |= S_HLD;
+ hld = true;
+ if (!hld_cb.isnull())
+ hld_cb(hld);
if(command & 0x04) {
if(!is_ready()) {
status |= S_RNF;
diff --git a/src/devices/machine/z80ctc.cpp b/src/devices/machine/z80ctc.cpp
index 13c4844c9e3..276254d96f1 100644
--- a/src/devices/machine/z80ctc.cpp
+++ b/src/devices/machine/z80ctc.cpp
@@ -185,8 +185,6 @@ int z80ctc_device::z80daisy_irq_state()
int state = 0;
for (auto & channel : m_channel)
{
-
-
// if we're servicing a request, don't indicate more interrupts
if (channel.m_int_state & Z80_DAISY_IEO)
{
diff --git a/src/devices/machine/z80dma.cpp b/src/devices/machine/z80dma.cpp
index 745d22877f0..c1f3162bebd 100644
--- a/src/devices/machine/z80dma.cpp
+++ b/src/devices/machine/z80dma.cpp
@@ -443,7 +443,7 @@ void z80dma_device::do_search()
int z80dma_device::do_write()
{
- int done = 0;
+ int done;
UINT8 mode;
mode = TRANSFER_MODE;
diff --git a/src/devices/machine/z80scc.cpp b/src/devices/machine/z80scc.cpp
index 3c6a17f6fbb..d2aa4a5f5bd 100644
--- a/src/devices/machine/z80scc.cpp
+++ b/src/devices/machine/z80scc.cpp
@@ -425,10 +425,10 @@ UINT8 z80scc_device::modify_vector(UINT8 vec, int i, UINT8 src)
void z80scc_device::trigger_interrupt(int index, int state)
{
UINT8 vector = m_chanB->m_wr2;
- UINT8 source = 0;
+ UINT8 source;
int priority;
- int prio_level = 0;
+ int prio_level;
LOG(("%s %s:%c %d \n",FUNCNAME, tag(), 'A' + index, state));
@@ -613,6 +613,53 @@ WRITE8_MEMBER( z80scc_device::ba_cd_w )
channel->data_write(data);
}
+//-------------------------------------------------
+// ba_cd_r - Universal Bus read
+//-------------------------------------------------
+
+READ8_MEMBER( z80scc_device::ba_cd_inv_r )
+{
+ int ba = BIT(offset, 1);
+ int cd = BIT(offset, 0);
+ z80scc_channel *channel = ba ? m_chanA : m_chanB;
+
+ /* Expell non-Universal Bus variants */
+ if ( !(m_variant & SET_Z85X3X) )
+ {
+ logerror("Z80SCC ba_cd_r not supported by this device variant, you should probably use combinations of c*_r/w and d*_r/w (see z80scc.h)\n");
+ return 0;
+ }
+
+ // LOG(("z80scc_device::ba_cd_inv_r ba:%02x cd:%02x\n", ba, cd));
+ return cd ? channel->data_read() : channel->control_read();
+}
+
+
+//-------------------------------------------------
+// ba_cd_w -
+//-------------------------------------------------
+
+WRITE8_MEMBER( z80scc_device::ba_cd_inv_w )
+{
+ int ba = BIT(offset, 1);
+ int cd = BIT(offset, 0);
+ z80scc_channel *channel = ba ? m_chanA : m_chanB;
+
+ /* Expell non-Universal Bus variants */
+ if ( !(m_variant & SET_Z85X3X) )
+ {
+ logerror("Z80SCC ba_cd_w not supported by this device variant, you should probably use combinations of c*_r/w and d*_r/w (see z80scc.h)\n");
+ return;
+ }
+
+ LOG(("z80scc_device::ba_cd_inv_w ba:%02x cd:%02x\n", ba, cd));
+
+ if (cd)
+ channel->data_write(data);
+ else
+ channel->control_write(data);
+}
+
//**************************************************************************
// SCC CHANNEL
//**************************************************************************
diff --git a/src/devices/machine/z80scc.h b/src/devices/machine/z80scc.h
index e48a670192b..7f956ec9b74 100644
--- a/src/devices/machine/z80scc.h
+++ b/src/devices/machine/z80scc.h
@@ -137,7 +137,7 @@ public:
UINT8 do_sccreg_rr5();
UINT8 do_sccreg_rr6();
UINT8 do_sccreg_rr7();
- UINT8 do_sccreg_rr8();
+// UINT8 do_sccreg_rr8();
UINT8 do_sccreg_rr9();
UINT8 do_sccreg_rr10();
UINT8 do_sccreg_rr11();
@@ -555,6 +555,8 @@ public:
DECLARE_WRITE8_MEMBER( cd_ba_w );
DECLARE_READ8_MEMBER( ba_cd_r );
DECLARE_WRITE8_MEMBER( ba_cd_w );
+ DECLARE_READ8_MEMBER( ba_cd_inv_r );
+ DECLARE_WRITE8_MEMBER( ba_cd_inv_w );
/* Definitions moved to z80scc.c for enhencements */
DECLARE_READ8_MEMBER( da_r ); // { return m_chanA->data_read(); }
diff --git a/src/devices/machine/z80sio.h b/src/devices/machine/z80sio.h
index 278fa006d45..3eac1e98d69 100644
--- a/src/devices/machine/z80sio.h
+++ b/src/devices/machine/z80sio.h
@@ -169,7 +169,7 @@ public:
DECLARE_WRITE_LINE_MEMBER( write_rx );
DECLARE_WRITE_LINE_MEMBER( cts_w );
DECLARE_WRITE_LINE_MEMBER( dcd_w );
- DECLARE_WRITE_LINE_MEMBER( ri_w );
+ //DECLARE_WRITE_LINE_MEMBER( ri_w );
DECLARE_WRITE_LINE_MEMBER( rxc_w );
DECLARE_WRITE_LINE_MEMBER( txc_w );
DECLARE_WRITE_LINE_MEMBER( sync_w );
@@ -457,8 +457,8 @@ class z80sio_device : public device_t,
DECLARE_WRITE_LINE_MEMBER( ctsb_w ) { m_chanB->cts_w(state); }
DECLARE_WRITE_LINE_MEMBER( dcda_w ) { m_chanA->dcd_w(state); }
DECLARE_WRITE_LINE_MEMBER( dcdb_w ) { m_chanB->dcd_w(state); }
- DECLARE_WRITE_LINE_MEMBER( ria_w ) { m_chanA->ri_w(state); }
- DECLARE_WRITE_LINE_MEMBER( rib_w ) { m_chanB->ri_w(state); }
+ //DECLARE_WRITE_LINE_MEMBER( ria_w ) { m_chanA->ri_w(state); }
+ //DECLARE_WRITE_LINE_MEMBER( rib_w ) { m_chanB->ri_w(state); }
DECLARE_WRITE_LINE_MEMBER( rxca_w ) { m_chanA->rxc_w(state); }
DECLARE_WRITE_LINE_MEMBER( rxcb_w ) { m_chanB->rxc_w(state); }
DECLARE_WRITE_LINE_MEMBER( txca_w ) { m_chanA->txc_w(state); }
diff --git a/src/devices/machine/z8536.cpp b/src/devices/machine/z8536.cpp
index 60d5e46f05f..f10b1c8f97a 100644
--- a/src/devices/machine/z8536.cpp
+++ b/src/devices/machine/z8536.cpp
@@ -214,7 +214,7 @@ void z8536_device::get_interrupt_vector()
void z8536_device::check_interrupt()
{
- int state = ASSERT_LINE;
+ int state;
if (m_register[MASTER_INTERRUPT_CONTROL] & MICR_MIE)
{
@@ -251,7 +251,7 @@ void z8536_device::check_interrupt()
UINT8 z8536_device::read_register(offs_t offset)
{
- UINT8 data = 0;
+ UINT8 data;
switch (offset)
{
diff --git a/src/devices/sound/2610intf.cpp b/src/devices/sound/2610intf.cpp
index 9111b03502c..4cc7f303795 100644
--- a/src/devices/sound/2610intf.cpp
+++ b/src/devices/sound/2610intf.cpp
@@ -16,6 +16,9 @@
#include "2610intf.h"
#include "fm.h"
+const char* YM2610_TAG = "ymsnd";
+const char* YM2610_DELTAT_TAG = "ymsnd.deltat";
+
static void psg_set_clock(void *param, int clock)
{
ym2610_device *ym2610 = (ym2610_device *) param;
@@ -143,9 +146,6 @@ void ym2610_device::device_start()
ay8910_device::device_start();
int rate = clock()/72;
- void *pcmbufa,*pcmbufb;
- int pcmsizea,pcmsizeb;
- std::string name(tag());
m_irq_handler.resolve();
@@ -155,16 +155,19 @@ void ym2610_device::device_start()
/* stream system initialize */
m_stream = machine().sound().stream_alloc(*this,0,2,rate, stream_update_delegate(FUNC(ym2610_device::stream_generate),this));
+
/* setup adpcm buffers */
- pcmbufa = region()->base();
- pcmsizea = region()->bytes();
- name.append(".deltat");
- pcmbufb = (void *)(machine().root_device().memregion(name.c_str())->base());
- pcmsizeb = machine().root_device().memregion(name.c_str())->bytes();
- if (pcmbufb == nullptr || pcmsizeb == 0)
+ void *pcmbufa = region()->base();
+ int pcmsizea = region()->bytes();
+
+ std::string name = tag() + std::string(".deltat");
+ memory_region *deltat_region = machine().root_device().memregion(name.c_str());
+ void *pcmbufb = pcmbufa;
+ int pcmsizeb = pcmsizea;
+ if (deltat_region != nullptr && deltat_region->base() != nullptr && deltat_region->bytes() != 0)
{
- pcmbufb = pcmbufa;
- pcmsizeb = pcmsizea;
+ pcmbufb = deltat_region->base();
+ pcmsizeb = deltat_region->bytes();
}
/**** initialize YM2610 ****/
@@ -207,14 +210,14 @@ WRITE8_MEMBER( ym2610_device::write )
const device_type YM2610 = &device_creator<ym2610_device>;
ym2610_device::ym2610_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
- : ay8910_device(mconfig, YM2610, "YM2610", tag, owner, clock, PSG_TYPE_YM, 1, 0, "ym2610", __FILE__),
- m_irq_handler(*this)
+ : ay8910_device(mconfig, YM2610, "YM2610", tag, owner, clock, PSG_TYPE_YM, 1, 0, "ym2610", __FILE__)
+ , m_irq_handler(*this)
{
}
ym2610_device::ym2610_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source)
- : ay8910_device(mconfig, type, name, tag, owner, clock, PSG_TYPE_YM, 1, 0, shortname, source),
- m_irq_handler(*this)
+ : ay8910_device(mconfig, type, name, tag, owner, clock, PSG_TYPE_YM, 1, 0, shortname, source)
+ , m_irq_handler(*this)
{
}
diff --git a/src/devices/sound/2610intf.h b/src/devices/sound/2610intf.h
index c4409e46f21..dcd0ef01787 100644
--- a/src/devices/sound/2610intf.h
+++ b/src/devices/sound/2610intf.h
@@ -29,6 +29,9 @@ public:
void _timer_handler(int c,int count,int clock);
void _ym2610_update_request();
+ static const char* YM2610_TAG;
+ static const char* YM2610_DELTAT_TAG;
+
protected:
// device-level overrides
virtual void device_start() override;
diff --git a/src/devices/sound/aica.cpp b/src/devices/sound/aica.cpp
index c0a0915c96d..0442f5811ff 100644
--- a/src/devices/sound/aica.cpp
+++ b/src/devices/sound/aica.cpp
@@ -414,17 +414,15 @@ void aica_device::Init()
m_MidiOutR=m_MidiOutW=0;
// get AICA RAM
+ if (m_ram_region != NULL)
{
- m_AICARAM = region()->base();
- if (m_AICARAM)
- {
- m_AICARAM += m_roffset;
- m_AICARAM_LENGTH = region()->bytes();
- m_RAM_MASK = m_AICARAM_LENGTH-1;
- m_RAM_MASK16 = m_RAM_MASK & 0x7ffffe;
- m_DSP.AICARAM = (UINT16 *)m_AICARAM;
- m_DSP.AICARAM_LENGTH = m_AICARAM_LENGTH/2;
- }
+ m_AICARAM = m_ram_region->base();
+ m_AICARAM += m_roffset;
+ m_AICARAM_LENGTH = m_ram_region->bytes();
+ m_RAM_MASK = m_AICARAM_LENGTH-1;
+ m_RAM_MASK16 = m_RAM_MASK & 0x7ffffe;
+ m_DSP.AICARAM = (UINT16 *)m_AICARAM;
+ m_DSP.AICARAM_LENGTH = m_AICARAM_LENGTH/2;
}
m_timerA = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(aica_device::timerA_cb), this));
@@ -443,10 +441,10 @@ void aica_device::Init()
int iTL =(i>>0x0)&0xff;
int iPAN=(i>>0x8)&0x1f;
int iSDL=(i>>0xD)&0x0F;
- float TL=1.0;
+ float TL;
float SegaDB=0;
- float fSDL=1.0;
- float PAN=1.0;
+ float fSDL;
+ float PAN;
float LPAN,RPAN;
if(iTL&0x01) SegaDB-=0.4f;
@@ -521,8 +519,8 @@ void aica_device::Init()
}
AICALFO_Init();
- m_buffertmpl=auto_alloc_array_clear(machine(), signed int, 44100);
- m_buffertmpr=auto_alloc_array_clear(machine(), signed int, 44100);
+ m_buffertmpl=make_unique_clear<INT32[]>(44100);
+ m_buffertmpr=make_unique_clear<INT32[]>(44100);
// no "pend"
m_udata.data[0xa0/2] = 0;
@@ -804,7 +802,7 @@ void aica_device::UpdateRegR(address_space &space, int reg)
{
int slotnum = MSLC();
AICA_SLOT *slot=m_Slots + slotnum;
- UINT16 LP = 0;
+ UINT16 LP;
if (!(AFSEL()))
{
UINT16 SGC;
@@ -834,7 +832,7 @@ void aica_device::UpdateRegR(address_space &space, int reg)
//m_stream->update();
int slotnum = MSLC();
AICA_SLOT *slot=m_Slots+slotnum;
- unsigned int CA = 0;
+ unsigned int CA;
if (PCMS(slot) == 0) // 16-bit samples
{
@@ -1473,6 +1471,7 @@ aica_device::aica_device(const machine_config &mconfig, const char *tag, device_
m_roffset(0),
m_irq_cb(*this),
m_main_irq_cb(*this),
+ m_ram_region(*this, this->tag()),
m_IRQL(0),
m_IRQR(0),
m_BUFPTR(0),
diff --git a/src/devices/sound/aica.h b/src/devices/sound/aica.h
index 5264c8cb9c6..a67143c3871 100644
--- a/src/devices/sound/aica.h
+++ b/src/devices/sound/aica.h
@@ -143,6 +143,7 @@ private:
int m_roffset; /* offset in the region */
devcb_write_line m_irq_cb;
devcb_write_line m_main_irq_cb;
+ optional_memory_region m_ram_region;
union
{
@@ -159,7 +160,8 @@ private:
UINT32 m_AICARAM_LENGTH, m_RAM_MASK, m_RAM_MASK16;
sound_stream * m_stream;
- INT32 *m_buffertmpl, *m_buffertmpr;
+ std::unique_ptr<INT32[]> m_buffertmpl;
+ std::unique_ptr<INT32[]> m_buffertmpr;
UINT32 m_IrqTimA;
UINT32 m_IrqTimBC;
diff --git a/src/devices/sound/aicadsp.cpp b/src/devices/sound/aicadsp.cpp
index 3cf57261cd5..08cb0702e44 100644
--- a/src/devices/sound/aicadsp.cpp
+++ b/src/devices/sound/aicadsp.cpp
@@ -66,14 +66,14 @@ void aica_dsp_step(AICADSP *DSP)
{
INT32 ACC=0; //26 bit
INT32 SHIFTED=0; //24 bit
- INT32 X=0; //24 bit
+ INT32 X; //24 bit
INT32 Y=0; //13 bit
- INT32 B=0; //26 bit
+ INT32 B; //26 bit
INT32 INPUTS=0; //24 bit
INT32 MEMVAL=0;
INT32 FRC_REG=0; //13 bit
INT32 Y_REG=0; //24 bit
- UINT32 ADDR=0;
+ UINT32 ADDR;
UINT32 ADRS_REG=0; //13 bit
int step;
diff --git a/src/devices/sound/beep.cpp b/src/devices/sound/beep.cpp
index e5c9362dc9f..7997b590a86 100644
--- a/src/devices/sound/beep.cpp
+++ b/src/devices/sound/beep.cpp
@@ -36,9 +36,7 @@ beep_device::beep_device(const machine_config &mconfig, const char *tag, device_
device_sound_interface(mconfig, *this),
m_stream(nullptr),
m_enable(0),
- m_frequency(0),
- m_incr(0),
- m_signal(0)
+ m_frequency(clock)
{
}
@@ -51,9 +49,13 @@ void beep_device::device_start()
{
m_stream = stream_alloc(0, 1, BEEP_RATE);
m_enable = 0;
- m_frequency = 3250;
- m_incr = 0;
m_signal = 0x07fff;
+
+ // register for savestates
+ save_item(NAME(m_enable));
+ save_item(NAME(m_frequency));
+ save_item(NAME(m_incr));
+ save_item(NAME(m_signal));
}
@@ -102,9 +104,10 @@ void beep_device::sound_stream_update(sound_stream &stream, stream_sample_t **in
// changing state to on from off will restart tone
//-------------------------------------------------
-void beep_device::set_state(int on)
+WRITE_LINE_MEMBER(beep_device::set_state)
{
/* only update if new state is not the same as old state */
+ int on = (state) ? 1 : 0;
if (m_enable == on)
return;
@@ -117,12 +120,11 @@ void beep_device::set_state(int on)
}
-
//-------------------------------------------------
// setting new frequency starts from beginning
//-------------------------------------------------
-void beep_device::set_frequency(int frequency)
+void beep_device::set_clock(UINT32 frequency)
{
if (m_frequency == frequency)
return;
@@ -132,16 +134,3 @@ void beep_device::set_frequency(int frequency)
m_signal = 0x07fff;
m_incr = 0;
}
-
-
-
-//-------------------------------------------------
-// change a channel volume
-//-------------------------------------------------
-
-void beep_device::set_volume(int volume)
-{
- m_stream->update();
- volume = 100 * volume / 7;
- set_output_gain(0, volume);
-}
diff --git a/src/devices/sound/beep.h b/src/devices/sound/beep.h
index 68fddb54a29..0970e6f4a93 100644
--- a/src/devices/sound/beep.h
+++ b/src/devices/sound/beep.h
@@ -26,9 +26,8 @@ protected:
virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) override;
public:
- void set_state(int on);
- void set_frequency(int frequency);
- void set_volume(int volume);
+ DECLARE_WRITE_LINE_MEMBER(set_state); // enable/disable sound output
+ void set_clock(UINT32 frequency); // output frequency
private:
sound_stream *m_stream; /* stream number */
diff --git a/src/devices/sound/c140.cpp b/src/devices/sound/c140.cpp
index 6e5ff8321bf..350ba6f047b 100644
--- a/src/devices/sound/c140.cpp
+++ b/src/devices/sound/c140.cpp
@@ -87,15 +87,16 @@ static inline int limit(INT32 in)
//-------------------------------------------------
c140_device::c140_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
- : device_t(mconfig, C140, "C140", tag, owner, clock, "c140", __FILE__),
- device_sound_interface(mconfig, *this),
- m_sample_rate(0),
- m_stream(nullptr),
- m_banking_type(0),
- m_mixer_buffer_left(nullptr),
- m_mixer_buffer_right(nullptr),
- m_baserate(0),
- m_pRom(nullptr)
+ : device_t(mconfig, C140, "C140", tag, owner, clock, "c140", __FILE__)
+ , device_sound_interface(mconfig, *this)
+ , m_sample_rate(0)
+ , m_stream(nullptr)
+ , m_banking_type(0)
+ , m_mixer_buffer_left(nullptr)
+ , m_mixer_buffer_right(nullptr)
+ , m_baserate(0)
+ , m_rom_ptr(*this, DEVICE_SELF)
+ , m_pRom(nullptr)
{
memset(m_REG, 0, sizeof(UINT8)*0x200);
memset(m_pcmtbl, 0, sizeof(INT16)*8);
@@ -108,32 +109,33 @@ c140_device::c140_device(const machine_config &mconfig, const char *tag, device_
void c140_device::device_start()
{
- m_sample_rate=m_baserate=clock();
+ m_sample_rate = m_baserate = clock();
m_stream = stream_alloc(0, 2, m_sample_rate);
- m_pRom = (INT8 *)region()->base();
+ if (m_rom_ptr != NULL)
+ {
+ m_pRom = m_rom_ptr;
+ }
/* make decompress pcm table */ //2000.06.26 CAB
+ INT32 segbase = 0;
+ for(int i = 0; i < 8; i++)
{
- int i;
- INT32 segbase=0;
- for(i=0;i<8;i++)
- {
- m_pcmtbl[i]=segbase; //segment base value
- segbase += 16<<i;
- }
+ m_pcmtbl[i]=segbase; //segment base value
+ segbase += 16<<i;
}
memset(m_REG,0,sizeof(m_REG));
+
+ for(int i = 0; i < C140_MAX_VOICE; i++)
{
- int i;
- for(i=0;i<C140_MAX_VOICE;i++) init_voice( &m_voi[i] );
+ init_voice(&m_voi[i]);
}
/* allocate a pair of buffers to mix into - 1 second's worth should be more than enough */
- m_mixer_buffer_left = auto_alloc_array(machine(), INT16, 2 * m_sample_rate);
- m_mixer_buffer_right = m_mixer_buffer_left + m_sample_rate;
+ m_mixer_buffer_left = std::make_unique<INT16[]>(m_sample_rate);
+ m_mixer_buffer_right = std::make_unique<INT16[]>(m_sample_rate);;
save_item(NAME(m_REG));
@@ -181,8 +183,8 @@ void c140_device::sound_stream_update(sound_stream &stream, stream_sample_t **in
if(samples>m_sample_rate) samples=m_sample_rate;
/* zap the contents of the mixer buffer */
- memset(m_mixer_buffer_left, 0, samples * sizeof(INT16));
- memset(m_mixer_buffer_right, 0, samples * sizeof(INT16));
+ memset(m_mixer_buffer_left.get(), 0, samples * sizeof(INT16));
+ memset(m_mixer_buffer_right.get(), 0, samples * sizeof(INT16));
/* get the number of voices to update */
voicecnt = (m_banking_type == C140_TYPE_ASIC219) ? 16 : 24;
@@ -208,8 +210,8 @@ void c140_device::sound_stream_update(sound_stream &stream, stream_sample_t **in
rvol=(vreg->volume_right*32)/C140_MAX_VOICE;
/* Set mixer outputs base pointers */
- lmix = m_mixer_buffer_left;
- rmix = m_mixer_buffer_right;
+ lmix = m_mixer_buffer_left.get();
+ rmix = m_mixer_buffer_right.get();
/* Retrieve sample start/end and calculate size */
st=v->sample_start;
@@ -342,8 +344,8 @@ void c140_device::sound_stream_update(sound_stream &stream, stream_sample_t **in
}
/* render to MAME's stream buffer */
- lmix = m_mixer_buffer_left;
- rmix = m_mixer_buffer_right;
+ lmix = m_mixer_buffer_left.get();
+ rmix = m_mixer_buffer_right.get();
{
stream_sample_t *dest1 = outputs[0];
stream_sample_t *dest2 = outputs[1];
diff --git a/src/devices/sound/c140.h b/src/devices/sound/c140.h
index 899045d03af..a7662daae1e 100644
--- a/src/devices/sound/c140.h
+++ b/src/devices/sound/c140.h
@@ -106,10 +106,11 @@ private:
sound_stream *m_stream;
int m_banking_type;
/* internal buffers */
- INT16 *m_mixer_buffer_left;
- INT16 *m_mixer_buffer_right;
+ std::unique_ptr<INT16[]> m_mixer_buffer_left;
+ std::unique_ptr<INT16[]> m_mixer_buffer_right;
int m_baserate;
+ optional_region_ptr<INT8> m_rom_ptr;
INT8 *m_pRom;
UINT8 m_REG[0x200];
diff --git a/src/devices/sound/cdda.cpp b/src/devices/sound/cdda.cpp
index 5bd6746e9d7..3223142a062 100644
--- a/src/devices/sound/cdda.cpp
+++ b/src/devices/sound/cdda.cpp
@@ -29,7 +29,7 @@ void cdda_device::sound_stream_update(sound_stream &stream, stream_sample_t **in
void cdda_device::device_start()
{
/* allocate an audio cache */
- m_audio_cache = auto_alloc_array( machine(), UINT8, CD_MAX_SECTOR_DATA * MAX_SECTORS );
+ m_audio_cache = std::make_unique<UINT8[]>(CD_MAX_SECTOR_DATA * MAX_SECTORS );
m_stream = machine().sound().stream_alloc(*this, 0, 2, 44100);
@@ -47,7 +47,7 @@ void cdda_device::device_start()
save_item( NAME(m_audio_ended_normally) );
save_item( NAME(m_audio_lba) );
save_item( NAME(m_audio_length) );
- save_pointer( NAME(m_audio_cache), CD_MAX_SECTOR_DATA * MAX_SECTORS );
+ save_pointer( NAME(m_audio_cache.get()), CD_MAX_SECTOR_DATA * MAX_SECTORS );
save_item( NAME(m_audio_samples) );
save_item( NAME(m_audio_bptr) );
}
@@ -161,7 +161,7 @@ int cdda_device::audio_ended()
void cdda_device::get_audio_data(stream_sample_t *bufL, stream_sample_t *bufR, UINT32 samples_wanted)
{
int i;
- INT16 *audio_cache = (INT16 *) m_audio_cache;
+ INT16 *audio_cache = (INT16 *) m_audio_cache.get();
while (samples_wanted > 0)
{
diff --git a/src/devices/sound/cdda.h b/src/devices/sound/cdda.h
index 4e6da29919e..2d9b6d86584 100644
--- a/src/devices/sound/cdda.h
+++ b/src/devices/sound/cdda.h
@@ -46,7 +46,7 @@ private:
INT8 m_audio_playing, m_audio_pause, m_audio_ended_normally;
UINT32 m_audio_lba, m_audio_length;
- UINT8 * m_audio_cache;
+ std::unique_ptr<UINT8[]> m_audio_cache;
UINT32 m_audio_samples;
UINT32 m_audio_bptr;
INT16 m_audio_volume[2];
diff --git a/src/devices/sound/cem3394.cpp b/src/devices/sound/cem3394.cpp
index c64b2539482..5d345fa6507 100644
--- a/src/devices/sound/cem3394.cpp
+++ b/src/devices/sound/cem3394.cpp
@@ -176,7 +176,7 @@ void cem3394_device::sound_stream_update(sound_stream &stream, stream_sample_t *
INT16 last_ext = m_last_ext;
/* fetch the external data */
- m_ext_cb(samples, m_external_buffer);
+ m_ext_cb(samples, m_external_buffer.get());
/* compute the modulation depth, and adjust fstep to the maximum frequency */
/* we lop off 13 bits of depth so that we can multiply by stepadjust, below, */
@@ -187,7 +187,7 @@ void cem3394_device::sound_stream_update(sound_stream &stream, stream_sample_t *
/* "apply" the filter: note this is pretty cheesy; it basically just downsamples the
external sample to filter_freq by allowing only 2 transitions for every cycle */
- for (i = 0, ext = m_external_buffer, position = m_position; i < samples; i++, ext++)
+ for (i = 0, ext = m_external_buffer.get(), position = m_position; i < samples; i++, ext++)
{
UINT32 newposition;
INT32 stepadjust;
@@ -229,7 +229,7 @@ void cem3394_device::sound_stream_update(sound_stream &stream, stream_sample_t *
/* if the width is wider than the step, we're guaranteed to hit it once per cycle */
if (pulse_width >= step)
{
- for (i = 0, mix = m_mixer_buffer, position = m_position; i < samples; i++, mix++)
+ for (i = 0, mix = m_mixer_buffer.get(), position = m_position; i < samples; i++, mix++)
{
if (position < pulse_width)
*mix = 0x1932;
@@ -243,7 +243,7 @@ void cem3394_device::sound_stream_update(sound_stream &stream, stream_sample_t *
else
{
INT16 volume = 0x1932 * pulse_width / step;
- for (i = 0, mix = m_mixer_buffer, position = m_position; i < samples; i++, mix++)
+ for (i = 0, mix = m_mixer_buffer.get(), position = m_position; i < samples; i++, mix++)
{
UINT32 newposition = position + step;
if ((newposition ^ position) & ~FRACTION_MASK)
@@ -258,13 +258,13 @@ void cem3394_device::sound_stream_update(sound_stream &stream, stream_sample_t *
/* otherwise, clear the mixing buffer */
else
- memset(m_mixer_buffer, 0, sizeof(INT16) * samples);
+ memset(m_mixer_buffer.get(), 0, sizeof(INT16) * samples);
/* handle the sawtooth component; it maxes out at 0x2000, which is 27% larger */
/* than the pulse */
if (ENABLE_SAWTOOTH && (m_wave_select & WAVE_SAWTOOTH))
{
- for (i = 0, mix = m_mixer_buffer, position = m_position; i < samples; i++, mix++)
+ for (i = 0, mix = m_mixer_buffer.get(), position = m_position; i < samples; i++, mix++)
{
*mix += ((position >> (FRACTION_BITS - 14)) & 0x3fff) - 0x2000;
position += step;
@@ -277,7 +277,7 @@ void cem3394_device::sound_stream_update(sound_stream &stream, stream_sample_t *
/* a multiplication) */
if (ENABLE_TRIANGLE && (m_wave_select & WAVE_TRIANGLE))
{
- for (i = 0, mix = m_mixer_buffer, position = m_position; i < samples; i++, mix++)
+ for (i = 0, mix = m_mixer_buffer.get(), position = m_position; i < samples; i++, mix++)
{
INT16 value;
if (position & (1 << (FRACTION_BITS - 1)))
@@ -295,8 +295,8 @@ void cem3394_device::sound_stream_update(sound_stream &stream, stream_sample_t *
}
/* mix it down */
- mix = m_mixer_buffer;
- ext = m_external_buffer;
+ mix = m_mixer_buffer.get();
+ ext = m_external_buffer.get();
{
/* internal + external */
if (ext_volume != 0 && int_volume != 0)
@@ -336,8 +336,8 @@ void cem3394_device::device_start()
m_ext_cb.bind_relative_to(*owner());
/* allocate memory for a mixer buffer and external buffer (1 second should do it!) */
- m_mixer_buffer = auto_alloc_array(machine(), INT16, m_sample_rate);
- m_external_buffer = auto_alloc_array(machine(), INT16, m_sample_rate);
+ m_mixer_buffer = std::make_unique<INT16[]>(m_sample_rate);
+ m_external_buffer = std::make_unique<INT16[]>(m_sample_rate);
save_item(NAME(m_values));
save_item(NAME(m_wave_select));
diff --git a/src/devices/sound/cem3394.h b/src/devices/sound/cem3394.h
index 188ad9b069f..88d2608bec1 100644
--- a/src/devices/sound/cem3394.h
+++ b/src/devices/sound/cem3394.h
@@ -107,8 +107,8 @@ private:
double m_inv_sample_rate;
int m_sample_rate;
- INT16 *m_mixer_buffer;
- INT16 *m_external_buffer;
+ std::unique_ptr<INT16[]> m_mixer_buffer;
+ std::unique_ptr<INT16[]> m_external_buffer;
};
extern const device_type CEM3394;
diff --git a/src/devices/sound/disc_cls.h b/src/devices/sound/disc_cls.h
index de7faeb1e2a..b627106a75d 100644
--- a/src/devices/sound/disc_cls.h
+++ b/src/devices/sound/disc_cls.h
@@ -1,6 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders:K.Wilkins,Couriersud
-// thanks-to:Derrick Renaud, F.Palazzolo
+// copyright-holders:K.Wilkins,Couriersud,Derrick Renaud,Frank Palazzolo
#pragma once
#ifndef __DISC_CLS_H__
diff --git a/src/devices/sound/disc_dev.h b/src/devices/sound/disc_dev.h
index 8828bf15573..19d96339889 100644
--- a/src/devices/sound/disc_dev.h
+++ b/src/devices/sound/disc_dev.h
@@ -1,6 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders:K.Wilkins,Couriersud
-// thanks-to:Derrick Renaud, F.Palazzolo
+// copyright-holders:K.Wilkins,Couriersud,Derrick Renaud,Frank Palazzolo
#pragma once
#ifndef __DISC_DEV_H__
diff --git a/src/devices/sound/disc_dev.inc b/src/devices/sound/disc_dev.inc
index 7ebf374f65a..da859e471ec 100644
--- a/src/devices/sound/disc_dev.inc
+++ b/src/devices/sound/disc_dev.inc
@@ -1,5 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders:K.Wilkins
+// copyright-holders:K.Wilkins,Derrick Renaud
/************************************************************************
*
* MAME - Discrete sound system emulation library
diff --git a/src/devices/sound/disc_flt.h b/src/devices/sound/disc_flt.h
index f873c87228b..c60d25d107b 100644
--- a/src/devices/sound/disc_flt.h
+++ b/src/devices/sound/disc_flt.h
@@ -1,6 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders:K.Wilkins,Couriersud
-// thanks-to:Derrick Renaud, F.Palazzolo
+// copyright-holders:K.Wilkins,Couriersud,Derrick Renaud,Frank Palazzolo
#pragma once
#ifndef __DISC_FLTH__
diff --git a/src/devices/sound/disc_mth.h b/src/devices/sound/disc_mth.h
index 4c46f9bad54..0e550739a53 100644
--- a/src/devices/sound/disc_mth.h
+++ b/src/devices/sound/disc_mth.h
@@ -1,6 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders:K.Wilkins,Couriersud
-// thanks-to:Derrick Renaud, F.Palazzolo
+// copyright-holders:K.Wilkins,Couriersud,Derrick Renaud,Frank Palazzolo
#pragma once
#ifndef __DISC_MTH_H__
diff --git a/src/devices/sound/disc_mth.inc b/src/devices/sound/disc_mth.inc
index 2172e80edd6..9825ee0b899 100644
--- a/src/devices/sound/disc_mth.inc
+++ b/src/devices/sound/disc_mth.inc
@@ -1,5 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders:K.Wilkins
+// copyright-holders:K.Wilkins,Derrick Renaud
/************************************************************************
*
* MAME - Discrete sound system emulation library
diff --git a/src/devices/sound/disc_sys.inc b/src/devices/sound/disc_sys.inc
index 4192e832d93..92b00c30383 100644
--- a/src/devices/sound/disc_sys.inc
+++ b/src/devices/sound/disc_sys.inc
@@ -1,5 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders:K.Wilkins
+// copyright-holders:K.Wilkins,Derrick Renaud
/************************************************************************
*
* MAME - Discrete sound system emulation library
diff --git a/src/devices/sound/disc_wav.h b/src/devices/sound/disc_wav.h
index c84d70addf4..dc1dc11773b 100644
--- a/src/devices/sound/disc_wav.h
+++ b/src/devices/sound/disc_wav.h
@@ -1,6 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders:K.Wilkins,Couriersud
-// thanks-to:Derrick Renaud, F.Palazzolo
+// copyright-holders:K.Wilkins,Couriersud,Derrick Renaud,Frank Palazzolo
#pragma once
#ifndef __DISC_WAV_H__
diff --git a/src/devices/sound/discrete.cpp b/src/devices/sound/discrete.cpp
index 6e670b3f333..22b5ebe942a 100644
--- a/src/devices/sound/discrete.cpp
+++ b/src/devices/sound/discrete.cpp
@@ -1,6 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders:K.Wilkins,Couriersud
-// thanks-to:Derrick Renaud, F.Palazzolo
+// copyright-holders:K.Wilkins,Couriersud,Derrick Renaud,Frank Palazzolo
/************************************************************************
*
* MAME - Discrete sound system emulation library
@@ -126,7 +125,6 @@ public:
int task_group;
-protected:
discrete_task(discrete_device &pdev)
: task_group(0), m_device(pdev), m_threadid(-1), m_samples(0)
{
@@ -135,6 +133,7 @@ protected:
m_buffers.clear();
}
+protected:
static void *task_callback(void *param, int threadid);
inline bool process(void);
@@ -699,7 +698,7 @@ void discrete_device::init_nodes(const sound_block_list_t &block_list)
/* make sure we have one simple task
* No need to create a node since there are no dependencies.
*/
- task = auto_alloc_clear(machine(), discrete_task(*this));
+ task = auto_alloc_clear(machine(), <discrete_task>(*this));
task_list.add(task);
}
@@ -734,7 +733,7 @@ void discrete_device::init_nodes(const sound_block_list_t &block_list)
{
if (task != nullptr)
fatalerror("init_nodes() - Nested DISCRETE_START_TASK.\n");
- task = auto_alloc_clear(machine(), discrete_task(*this));
+ task = auto_alloc_clear(machine(), <discrete_task>(*this));
task->task_group = block->initial[0];
if (task->task_group < 0 || task->task_group >= DISCRETE_MAX_TASK_GROUPS)
fatalerror("discrete_dso_task: illegal task_group %d\n", task->task_group);
diff --git a/src/devices/sound/discrete.h b/src/devices/sound/discrete.h
index 1ee71e4056d..e5145b39132 100644
--- a/src/devices/sound/discrete.h
+++ b/src/devices/sound/discrete.h
@@ -1,6 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders:K.Wilkins,Couriersud
-// thanks-to:Derrick Renaud, F.Palazzolo
+// copyright-holders:K.Wilkins,Couriersud,Derrick Renaud,Frank Palazzolo
#pragma once
#ifndef __DISCRETE_H__
@@ -3759,15 +3758,15 @@ public:
vector_t(int initial) {
m_count = 0;
m_allocated = initial;
- m_arr = global_alloc_array_clear(_ElementType, m_allocated);
+ m_arr = make_unique_clear<_ElementType[]>(m_allocated);
}
vector_t() {
m_count = 0;
m_allocated = 16;
- m_arr = global_alloc_array_clear(_ElementType, m_allocated);
+ m_arr = make_unique_clear<_ElementType[]>(m_allocated);
}
~vector_t() {
- global_free_array(m_arr);
+ m_arr = nullptr;
}
_ElementType& operator [] (unsigned int index) const // get array item
{
@@ -3780,7 +3779,7 @@ public:
if (m_allocated < 16)
m_allocated = 16;
m_count = a.count();
- m_arr = global_alloc_array_clear(_ElementType, m_allocated);
+ m_arr = make_unique_clear<_ElementType[]>(m_allocated);
for (int i=0; i < m_count; i++)
m_arr[i] = a[i];
}
@@ -3791,7 +3790,7 @@ public:
if (m_allocated < 16)
m_allocated = 16;
m_count = a.count();
- m_arr = global_alloc_array_clear(_ElementType, m_allocated);
+ m_arr = make_unique_clear<_ElementType[]>(m_allocated);
for (int i=0; i < m_count; i++)
m_arr[i] = a[i];
return *this;
@@ -3801,12 +3800,14 @@ public:
{
if (m_count >= m_allocated)
{
+ auto oldarr = make_unique_clear<_ElementType[]>(m_allocated);
+ for (int i = 0; i < m_count; i++)
+ oldarr[i] = m_arr[i];
+
m_allocated *= 2;
- auto newarr = global_alloc_array_clear(_ElementType, m_allocated);
- for (int i=0; i < m_count; i++)
- newarr[i] = m_arr[i];
- global_free_array(m_arr);
- m_arr = newarr;
+ m_arr = make_unique_clear<_ElementType[]>(m_allocated);
+ for (int i = 0; i < m_count; i++)
+ m_arr[i] = oldarr[i];
}
m_arr[m_count] = object;
m_count++;
@@ -3820,10 +3821,10 @@ public:
}
inline void clear(void) { m_count = 0; }
inline int count(void) const { return m_count; }
- inline _ElementType *begin_ptr(void) const { return m_arr; }
- inline _ElementType *end_ptr(void) const { return m_arr + (m_count - 1); }
+ inline _ElementType *begin_ptr(void) const { return m_arr.get(); }
+ inline _ElementType *end_ptr(void) const { return m_arr.get() + (m_count - 1); }
private:
- _ElementType *m_arr;
+ std::unique_ptr<_ElementType[]> m_arr;
int m_count;
int m_allocated;
};
@@ -4499,7 +4500,7 @@ public:
template <class C>
discrete_base_node * discrete_node_factory<C>::Create(discrete_device * pdev, const discrete_block *block)
{
- discrete_base_node *r = auto_alloc_clear(pdev->machine(), C);
+ discrete_base_node *r = auto_alloc_clear(pdev->machine(), <C>());
r->init(pdev, block);
return r;
diff --git a/src/devices/sound/dmadac.cpp b/src/devices/sound/dmadac.cpp
index 91e6216ef69..24e89835d06 100644
--- a/src/devices/sound/dmadac.cpp
+++ b/src/devices/sound/dmadac.cpp
@@ -47,7 +47,7 @@
void dmadac_sound_device::device_start()
{
/* allocate a clear a buffer */
- m_buffer = auto_alloc_array_clear(machine(), INT16, BUFFER_SIZE);
+ m_buffer = make_unique_clear<INT16[]>(BUFFER_SIZE);
/* reset the state */
m_volume = 0x100;
@@ -61,7 +61,7 @@ void dmadac_sound_device::device_start()
save_item(NAME(m_volume));
save_item(NAME(m_enabled));
save_item(NAME(m_frequency));
- save_pointer(NAME(m_buffer), BUFFER_SIZE);
+ save_pointer(NAME(m_buffer.get()), BUFFER_SIZE);
}
@@ -217,7 +217,7 @@ dmadac_sound_device::dmadac_sound_device(const machine_config &mconfig, const ch
void dmadac_sound_device::sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples)
{
stream_sample_t *output = outputs[0];
- INT16 *source = m_buffer;
+ INT16 *source = m_buffer.get();
UINT32 curout = m_bufout;
UINT32 curin = m_bufin;
int volume = m_volume;
diff --git a/src/devices/sound/dmadac.h b/src/devices/sound/dmadac.h
index c4be88e5596..6e0c4f47dd6 100644
--- a/src/devices/sound/dmadac.h
+++ b/src/devices/sound/dmadac.h
@@ -35,7 +35,7 @@ private:
// internal state
/* sound stream and buffers */
sound_stream * m_channel;
- INT16 * m_buffer;
+ std::unique_ptr<INT16[]> m_buffer;
UINT32 m_bufin;
UINT32 m_bufout;
diff --git a/src/devices/sound/es5506.cpp b/src/devices/sound/es5506.cpp
index 6e47ed7977d..7a27d7575f7 100644
--- a/src/devices/sound/es5506.cpp
+++ b/src/devices/sound/es5506.cpp
@@ -195,10 +195,39 @@ void es5506_device::device_start()
m_stream = machine().sound().stream_alloc(*this, 0, 2 * channels, clock() / (16*32));
/* initialize the regions */
- m_region_base[0] = m_region0 ? (UINT16 *)machine().root_device().memregion(m_region0)->base() : nullptr;
- m_region_base[1] = m_region1 ? (UINT16 *)machine().root_device().memregion(m_region1)->base() : nullptr;
- m_region_base[2] = m_region2 ? (UINT16 *)machine().root_device().memregion(m_region2)->base() : nullptr;
- m_region_base[3] = m_region3 ? (UINT16 *)machine().root_device().memregion(m_region3)->base() : nullptr;
+ m_region_base[0] = m_region_base[1] = m_region_base[2] = m_region_base[3] = nullptr;
+ if (m_region0)
+ {
+ memory_region *region0 = machine().root_device().memregion(m_region0);
+ if (region0 != nullptr)
+ {
+ m_region_base[0] = (UINT16 *)region0->base();
+ }
+ }
+ if (m_region1)
+ {
+ memory_region *region1 = machine().root_device().memregion(m_region1);
+ if (region1 != nullptr)
+ {
+ m_region_base[1] = (UINT16 *)region1->base();
+ }
+ }
+ if (m_region2)
+ {
+ memory_region *region2 = machine().root_device().memregion(m_region2);
+ if (region2 != nullptr)
+ {
+ m_region_base[2] = (UINT16 *)region2->base();
+ }
+ }
+ if (m_region3)
+ {
+ memory_region *region3 = machine().root_device().memregion(m_region3);
+ if (region3 != nullptr)
+ {
+ m_region_base[3] = (UINT16 *)region3->base();
+ }
+ }
/* initialize the rest of the structure */
m_master_clock = clock();
@@ -228,7 +257,7 @@ void es5506_device::device_start()
}
/* allocate memory */
- m_scratch = auto_alloc_array_clear(machine(), INT32, 2 * MAX_SAMPLE_CHUNK);
+ m_scratch = make_unique_clear<INT32[]>(2 * MAX_SAMPLE_CHUNK);
/* register save */
save_item(NAME(m_sample_rate));
@@ -243,7 +272,7 @@ void es5506_device::device_start()
save_item(NAME(m_lrend));
save_item(NAME(m_irqv));
- save_pointer(NAME(m_scratch), 2 * MAX_SAMPLE_CHUNK);
+ save_pointer(NAME(m_scratch.get()), 2 * MAX_SAMPLE_CHUNK);
for (j = 0; j < 32; j++)
{
@@ -337,8 +366,16 @@ void es5505_device::device_start()
m_stream = machine().sound().stream_alloc(*this, 0, 2 * channels, clock() / (16*32));
/* initialize the regions */
- m_region_base[0] = m_region0 ? (UINT16 *)machine().root_device().memregion(m_region0)->base() : nullptr;
- m_region_base[1] = m_region1 ? (UINT16 *)machine().root_device().memregion(m_region1)->base() : nullptr;
+ if (m_region0)
+ {
+ memory_region* region = machine().root_device().memregion(m_region0);
+ m_region_base[0] = region ? reinterpret_cast<UINT16 *>(region->base()) : nullptr;
+ }
+ if (m_region1)
+ {
+ memory_region* region = machine().root_device().memregion(m_region1);
+ m_region_base[1] = region ? reinterpret_cast<UINT16 *>(region->base()) : nullptr;
+ }
/* initialize the rest of the structure */
m_master_clock = clock();
@@ -363,7 +400,7 @@ void es5505_device::device_start()
}
/* allocate memory */
- m_scratch = auto_alloc_array_clear(machine(), INT32, 2 * MAX_SAMPLE_CHUNK);
+ m_scratch = make_unique_clear<INT32[]>(2 * MAX_SAMPLE_CHUNK);
/* register save */
save_item(NAME(m_sample_rate));
@@ -378,7 +415,7 @@ void es5505_device::device_start()
save_item(NAME(m_lrend));
save_item(NAME(m_irqv));
- save_pointer(NAME(m_scratch), 2 * MAX_SAMPLE_CHUNK);
+ save_pointer(NAME(m_scratch.get()), 2 * MAX_SAMPLE_CHUNK);
for (j = 0; j < 32; j++)
{
@@ -452,7 +489,7 @@ void es550x_device::compute_tables()
int i;
/* allocate ulaw lookup table */
- m_ulaw_lookup = auto_alloc_array_clear(machine(), INT16, 1 << ULAW_MAXBITS);
+ m_ulaw_lookup = make_unique_clear<INT16[]>(1 << ULAW_MAXBITS);
/* generate ulaw lookup table */
for (i = 0; i < (1 << ULAW_MAXBITS); i++)
@@ -471,7 +508,7 @@ void es550x_device::compute_tables()
}
/* allocate volume lookup table */
- m_volume_lookup = auto_alloc_array_clear(machine(), UINT16, 4096);
+ m_volume_lookup = make_unique_clear<UINT16[]>(4096);
/* generate volume lookup table */
for (i = 0; i < 4096; i++)
@@ -2139,7 +2176,7 @@ inline UINT16 es5505_device::reg_read_test(es550x_voice *voice, offs_t offset)
READ16_MEMBER( es5505_device::read )
{
es550x_voice *voice = &m_voice[m_current_page & 0x1f];
- UINT16 result = 0;
+ UINT16 result;
if (LOG_COMMANDS && m_eslog)
fprintf(m_eslog, "read from %02x/%02x -> ", m_current_page, offset);
diff --git a/src/devices/sound/es5506.h b/src/devices/sound/es5506.h
index 3995a97c931..4ccc9d2d3f6 100644
--- a/src/devices/sound/es5506.h
+++ b/src/devices/sound/es5506.h
@@ -154,10 +154,10 @@ protected:
es550x_voice m_voice[32]; /* the 32 voices */
- INT32 * m_scratch;
+ std::unique_ptr<INT32[]> m_scratch;
- INT16 * m_ulaw_lookup;
- UINT16 * m_volume_lookup;
+ std::unique_ptr<INT16[]> m_ulaw_lookup;
+ std::unique_ptr<UINT16[]> m_volume_lookup;
#if MAKE_WAVS
void * m_wavraw; /* raw waveform */
diff --git a/src/devices/sound/flt_rc.cpp b/src/devices/sound/flt_rc.cpp
index af73f401e59..cf37a4fd6d8 100644
--- a/src/devices/sound/flt_rc.cpp
+++ b/src/devices/sound/flt_rc.cpp
@@ -1,4 +1,4 @@
-// license:???
+// license:BSD-3-Clause
// copyright-holders:Derrick Renaud, Couriersud
#include "emu.h"
#include "flt_rc.h"
diff --git a/src/devices/sound/flt_rc.h b/src/devices/sound/flt_rc.h
index 8d8b1e0d4fb..79c1abfa2ca 100644
--- a/src/devices/sound/flt_rc.h
+++ b/src/devices/sound/flt_rc.h
@@ -1,4 +1,4 @@
-// license:???
+// license:BSD-3-Clause
// copyright-holders:Derrick Renaud, Couriersud
#pragma once
diff --git a/src/devices/sound/flt_vol.cpp b/src/devices/sound/flt_vol.cpp
index c8aaffc9afe..e980b502b8e 100644
--- a/src/devices/sound/flt_vol.cpp
+++ b/src/devices/sound/flt_vol.cpp
@@ -1,4 +1,4 @@
-// license:???
+// license:BSD-3-Clause
// copyright-holders:Derrick Renaud, Couriersud
#include "emu.h"
#include "flt_vol.h"
diff --git a/src/devices/sound/flt_vol.h b/src/devices/sound/flt_vol.h
index 44016c0da9a..f9b090002c3 100644
--- a/src/devices/sound/flt_vol.h
+++ b/src/devices/sound/flt_vol.h
@@ -1,4 +1,4 @@
-// license:???
+// license:BSD-3-Clause
// copyright-holders:Derrick Renaud, Couriersud
#pragma once
diff --git a/src/devices/sound/fm.cpp b/src/devices/sound/fm.cpp
index 8aa9f157f91..ee74c47fd97 100644
--- a/src/devices/sound/fm.cpp
+++ b/src/devices/sound/fm.cpp
@@ -1,4 +1,4 @@
-// license:???
+// license:GPL-2.0+
// copyright-holders:Jarek Burczynski,Tatsuyuki Satoh
#define YM2610B_WARNING
@@ -1112,7 +1112,7 @@ static inline void advance_lfo(FM_OPN *OPN)
static void advance_eg_channel(FM_OPN *OPN, FM_SLOT *SLOT)
{
unsigned int out;
- unsigned int swap_flag = 0;
+ unsigned int swap_flag;
unsigned int i;
@@ -2263,7 +2263,7 @@ void * ym2203_init(void *param, device_t *device, int clock, int rate,
YM2203 *F2203;
/* allocate ym2203 state space */
- F2203 = auto_alloc_clear(device->machine(), YM2203);
+ F2203 = auto_alloc_clear(device->machine(), <YM2203>());
if( !init_tables() )
{
@@ -2941,7 +2941,7 @@ void * ym2608_init(void *param, device_t *device, int clock, int rate,
YM2608 *F2608;
/* allocate extend state space */
- F2608 = auto_alloc_clear(device->machine(), YM2608);
+ F2608 = auto_alloc_clear(device->machine(), <YM2608>());
/* allocate total level table (128kb space) */
if( !init_tables() )
{
@@ -2949,6 +2949,7 @@ void * ym2608_init(void *param, device_t *device, int clock, int rate,
return nullptr;
}
+ F2608->device = device;
F2608->OPN.ST.param = param;
F2608->OPN.type = TYPE_YM2608;
F2608->OPN.P_CH = F2608->CH;
@@ -3072,7 +3073,7 @@ void ym2608_reset_chip(void *chip)
DELTAT->output_pointer = OPN->out_delta;
DELTAT->portshift = 5; /* always 5bits shift */ /* ASG */
DELTAT->output_range = 1<<23;
- YM_DELTAT_ADPCM_Reset(DELTAT,OUTD_CENTER,YM_DELTAT_EMULATION_MODE_NORMAL,DELTAT->device);
+ YM_DELTAT_ADPCM_Reset(DELTAT,OUTD_CENTER,YM_DELTAT_EMULATION_MODE_NORMAL,F2608->device);
}
/* YM2608 write */
@@ -3622,7 +3623,7 @@ void *ym2610_init(void *param, device_t *device, int clock, int rate,
YM2610 *F2610;
/* allocate extend state space */
- F2610 = auto_alloc_clear(device->machine(), YM2610);
+ F2610 = auto_alloc_clear(device->machine(), <YM2610>());
/* allocate total level table (128kb space) */
if( !init_tables() )
{
@@ -3685,14 +3686,21 @@ void ym2610_reset_chip(void *chip)
F2610->pcmbuf = (const UINT8 *)dev->machine().root_device().memregion(name.c_str())->base();
F2610->pcm_size = dev->machine().root_device().memregion(name.c_str())->bytes();
name.append(".deltat");
- F2610->deltaT.memory = (UINT8 *)dev->machine().root_device().memregion(name.c_str())->base();
+ memory_region *deltat_region = dev->machine().root_device().memregion(name.c_str());
+ F2610->deltaT.memory = nullptr;
+ if (deltat_region != nullptr)
+ {
+ F2610->deltaT.memory = (UINT8 *)dev->machine().root_device().memregion(name.c_str())->base();
+ }
if(F2610->deltaT.memory == nullptr)
{
F2610->deltaT.memory = (UINT8*)F2610->pcmbuf;
F2610->deltaT.memory_size = F2610->pcm_size;
}
else
+ {
F2610->deltaT.memory_size = dev->machine().root_device().memregion(name.c_str())->bytes();
+ }
/* Reset Prescaler */
OPNSetPres( OPN, 6*24, 6*24, 4*2); /* OPN 1/6 , SSG 1/4 */
diff --git a/src/devices/sound/fm.h b/src/devices/sound/fm.h
index 9d6042ac768..11b76eff45b 100644
--- a/src/devices/sound/fm.h
+++ b/src/devices/sound/fm.h
@@ -1,4 +1,4 @@
-// license:???
+// license:GPL-2.0+
// copyright-holders:Jarek Burczynski,Tatsuyuki Satoh
/*
File: fm.h -- header file for software emulation for FM sound generator
diff --git a/src/devices/sound/fm2612.cpp b/src/devices/sound/fm2612.cpp
index 086198a9ec4..af75298a59a 100644
--- a/src/devices/sound/fm2612.cpp
+++ b/src/devices/sound/fm2612.cpp
@@ -1,4 +1,4 @@
-// license:???
+// license:GPL-2.0+
// copyright-holders:Jarek Burczynski,Tatsuyuki Satoh
/*
**
@@ -2372,7 +2372,7 @@ void * ym2612_init(void *param, device_t *device, int clock, int rate,
YM2612 *F2612;
/* allocate extend state space */
- F2612 = auto_alloc_clear(device->machine(), YM2612);
+ F2612 = auto_alloc_clear(device->machine(), <YM2612>());
/* allocate total level table (128kb space) */
init_tables();
diff --git a/src/devices/sound/fmopl.cpp b/src/devices/sound/fmopl.cpp
index 920d65e59ed..9f3a92a4517 100644
--- a/src/devices/sound/fmopl.cpp
+++ b/src/devices/sound/fmopl.cpp
@@ -1,4 +1,4 @@
-// license:???
+// license:GPL-2.0+
// copyright-holders:Jarek Burczynski,Tatsuyuki Satoh
/*
**
diff --git a/src/devices/sound/fmopl.h b/src/devices/sound/fmopl.h
index 7dccb50001e..1769cf57789 100644
--- a/src/devices/sound/fmopl.h
+++ b/src/devices/sound/fmopl.h
@@ -1,4 +1,4 @@
-// license:???
+// license:GPL-2.0+
// copyright-holders:Jarek Burczynski,Tatsuyuki Satoh
#pragma once
diff --git a/src/devices/sound/k005289.cpp b/src/devices/sound/k005289.cpp
index dc349b7e211..b49d97b1555 100644
--- a/src/devices/sound/k005289.cpp
+++ b/src/devices/sound/k005289.cpp
@@ -77,7 +77,7 @@ void k005289_device::device_start()
m_stream = stream_alloc(0, 1, m_rate);
/* allocate a pair of buffers to mix into - 1 second's worth should be more than enough */
- m_mixer_buffer = auto_alloc_array(machine(), short, 2 * m_rate);
+ m_mixer_buffer = std::make_unique<short[]>(2 * m_rate);
/* build the mixer table */
make_mixer_table(2);
@@ -113,7 +113,7 @@ void k005289_device::sound_stream_update(sound_stream &stream, stream_sample_t *
int i,v,f;
/* zap the contents of the mixer buffer */
- memset(m_mixer_buffer, 0, samples * sizeof(INT16));
+ memset(m_mixer_buffer.get(), 0, samples * sizeof(INT16));
v=m_volume[0];
f=m_frequency[0];
@@ -122,7 +122,7 @@ void k005289_device::sound_stream_update(sound_stream &stream, stream_sample_t *
const unsigned char *w = m_sound_prom + m_waveform[0];
int c = m_counter[0];
- mix = m_mixer_buffer;
+ mix = m_mixer_buffer.get();
/* add our contribution */
for (i = 0; i < samples; i++)
@@ -145,7 +145,7 @@ void k005289_device::sound_stream_update(sound_stream &stream, stream_sample_t *
const unsigned char *w = m_sound_prom + m_waveform[1];
int c = m_counter[1];
- mix = m_mixer_buffer;
+ mix = m_mixer_buffer.get();
/* add our contribution */
for (i = 0; i < samples; i++)
@@ -162,7 +162,7 @@ void k005289_device::sound_stream_update(sound_stream &stream, stream_sample_t *
}
/* mix it down */
- mix = m_mixer_buffer;
+ mix = m_mixer_buffer.get();
for (i = 0; i < samples; i++)
*buffer++ = m_mixer_lookup[*mix++];
}
@@ -180,10 +180,10 @@ void k005289_device::make_mixer_table(int voices)
int gain = 16;
/* allocate memory */
- m_mixer_table = auto_alloc_array(machine(), INT16, 256 * voices);
+ m_mixer_table = std::make_unique<INT16[]>(256 * voices);
/* find the middle of the table */
- m_mixer_lookup = m_mixer_table + (128 * voices);
+ m_mixer_lookup = m_mixer_table.get() + (128 * voices);
/* fill in the table - 16 bit case */
for (i = 0; i < count; i++)
diff --git a/src/devices/sound/k005289.h b/src/devices/sound/k005289.h
index 9112ca5458f..24f84638263 100644
--- a/src/devices/sound/k005289.h
+++ b/src/devices/sound/k005289.h
@@ -48,9 +48,9 @@ private:
int m_rate;
/* mixer tables and internal buffers */
- INT16 *m_mixer_table;
+ std::unique_ptr<INT16[]> m_mixer_table;
INT16 *m_mixer_lookup;
- short *m_mixer_buffer;
+ std::unique_ptr<short[]> m_mixer_buffer;
UINT32 m_counter[2];
UINT16 m_frequency[2];
diff --git a/src/devices/sound/k007232.cpp b/src/devices/sound/k007232.cpp
index 767cd904357..cc25519e4b9 100644
--- a/src/devices/sound/k007232.cpp
+++ b/src/devices/sound/k007232.cpp
@@ -310,7 +310,7 @@ WRITE8_MEMBER( k007232_device::write )
READ8_MEMBER( k007232_device::read )
{
int r = offset;
- int ch = 0;
+ int ch;
if( r == 0x0005 || r == 0x000b ){
ch = r/0x0006;
diff --git a/src/devices/sound/k051649.cpp b/src/devices/sound/k051649.cpp
index 05c8fffae3f..dde61572d44 100644
--- a/src/devices/sound/k051649.cpp
+++ b/src/devices/sound/k051649.cpp
@@ -69,7 +69,7 @@ void k051649_device::device_start()
m_mclock = clock();
// allocate a buffer to mix into - 1 second's worth should be more than enough
- m_mixer_buffer = auto_alloc_array(machine(), short, 2 * m_rate);
+ m_mixer_buffer = std::make_unique<short[]>(2 * m_rate);
// build the mixer table
make_mixer_table(5);
@@ -111,7 +111,7 @@ void k051649_device::sound_stream_update(sound_stream &stream, stream_sample_t *
int i,j;
// zap the contents of the mixer buffer
- memset(m_mixer_buffer, 0, samples * sizeof(short));
+ memset(m_mixer_buffer.get(), 0, samples * sizeof(short));
for (j = 0; j < 5; j++)
{
@@ -123,7 +123,7 @@ void k051649_device::sound_stream_update(sound_stream &stream, stream_sample_t *
int c=voice[j].counter;
int step = ((INT64)m_mclock * (1 << FREQ_BITS)) / (float)((voice[j].frequency + 1) * 16 * (m_rate / 32)) + 0.5f;
- mix = m_mixer_buffer;
+ mix = m_mixer_buffer.get();
// add our contribution
for (i = 0; i < samples; i++)
@@ -141,7 +141,7 @@ void k051649_device::sound_stream_update(sound_stream &stream, stream_sample_t *
}
// mix it down
- mix = m_mixer_buffer;
+ mix = m_mixer_buffer.get();
for (i = 0; i < samples; i++)
*buffer++ = m_mixer_lookup[*mix++];
}
@@ -272,10 +272,10 @@ void k051649_device::make_mixer_table(int voices)
int i;
// allocate memory
- m_mixer_table = auto_alloc_array(machine(), INT16, 512 * voices);
+ m_mixer_table = std::make_unique<INT16[]>(512 * voices);
// find the middle of the table
- m_mixer_lookup = m_mixer_table + (256 * voices);
+ m_mixer_lookup = m_mixer_table.get() + (256 * voices);
// fill in the table - 16 bit case
for (i = 0; i < (voices * 256); i++)
diff --git a/src/devices/sound/k051649.h b/src/devices/sound/k051649.h
index 4fec1b7659f..f5e4997f02c 100644
--- a/src/devices/sound/k051649.h
+++ b/src/devices/sound/k051649.h
@@ -81,9 +81,9 @@ private:
int m_rate;
/* mixer tables and internal buffers */
- INT16 *m_mixer_table;
+ std::unique_ptr<INT16[]> m_mixer_table;
INT16 *m_mixer_lookup;
- short *m_mixer_buffer;
+ std::unique_ptr<short[]> m_mixer_buffer;
/* chip registers */
UINT8 m_test;
diff --git a/src/devices/sound/k053260.cpp b/src/devices/sound/k053260.cpp
index 134598a1f7c..f3ebc4b2445 100644
--- a/src/devices/sound/k053260.cpp
+++ b/src/devices/sound/k053260.cpp
@@ -274,7 +274,6 @@ void k053260_device::sound_stream_update(sound_stream &stream, stream_sample_t *
for (auto & voice : m_voice)
{
-
if (voice.playing())
voice.play(buffer);
}
diff --git a/src/devices/sound/k053260.h b/src/devices/sound/k053260.h
index 5f64ce86ad3..ace87855740 100644
--- a/src/devices/sound/k053260.h
+++ b/src/devices/sound/k053260.h
@@ -70,6 +70,10 @@ private:
class KDSC_Voice
{
public:
+ KDSC_Voice() : m_device(nullptr), m_position(0), m_counter(0), m_output(0), m_playing(false), m_start(0), m_length(0), m_pitch(0), m_volume(0), m_pan(0), m_loop(false), m_kadpcm(false)
+ {
+ }
+
inline void voice_start(k053260_device &device, int index);
inline void voice_reset();
inline void set_register(offs_t offset, UINT8 data);
diff --git a/src/devices/sound/k054539.cpp b/src/devices/sound/k054539.cpp
index e619e53a0bd..5270f5b80d6 100644
--- a/src/devices/sound/k054539.cpp
+++ b/src/devices/sound/k054539.cpp
@@ -105,7 +105,7 @@ void k054539_device::sound_stream_update(sound_stream &stream, stream_sample_t *
};
- INT16 *rbase = (INT16 *)ram;
+ INT16 *rbase = (INT16 *)ram.get();
if(!(regs[0x22f] & 1))
return;
@@ -306,10 +306,10 @@ void k054539_device::init_chip()
memset(posreg_latch, 0, sizeof(posreg_latch)); //*
flags |= UPDATE_AT_KEYON; //* make it default until proven otherwise
- ram = auto_alloc_array(machine(), unsigned char, 0x4000);
+ ram = std::make_unique<UINT8[]>(0x4000);
reverb_pos = 0;
cur_ptr = 0;
- memset(ram, 0, 0x4000);
+ memset(ram.get(), 0, 0x4000);
memory_region *reg = (m_rgnoverride != nullptr) ? owner()->memregion(m_rgnoverride) : region();
rom = reg->base();
@@ -324,7 +324,7 @@ void k054539_device::init_chip()
stream = stream_alloc(0, 2, clock() / 384);
save_item(NAME(regs));
- save_pointer(NAME(ram), 0x4000);
+ save_pointer(NAME(ram.get()), 0x4000);
save_item(NAME(cur_ptr));
}
@@ -428,7 +428,7 @@ WRITE8_MEMBER(k054539_device::write)
case 0x22e:
cur_zone =
- data == 0x80 ? ram :
+ data == 0x80 ? ram.get() :
rom + 0x20000*data;
cur_limit = data == 0x80 ? 0x4000 : 0x20000;
cur_ptr = 0;
@@ -466,7 +466,7 @@ WRITE8_MEMBER(k054539_device::write)
void k054539_device::device_post_load()
{
int data = regs[0x22e];
- cur_zone = data == 0x80 ? ram : rom + 0x20000*data;
+ cur_zone = data == 0x80 ? ram.get() : rom + 0x20000*data;
cur_limit = data == 0x80 ? 0x4000 : 0x20000;
}
diff --git a/src/devices/sound/k054539.h b/src/devices/sound/k054539.h
index dea41388837..fd196d306b8 100644
--- a/src/devices/sound/k054539.h
+++ b/src/devices/sound/k054539.h
@@ -94,7 +94,7 @@ private:
int flags;
unsigned char regs[0x230];
- unsigned char *ram;
+ std::unique_ptr<UINT8[]> ram;
int reverb_pos;
INT32 cur_ptr;
diff --git a/src/devices/sound/k056800.cpp b/src/devices/sound/k056800.cpp
index beac3a67b73..908a0b2d42c 100644
--- a/src/devices/sound/k056800.cpp
+++ b/src/devices/sound/k056800.cpp
@@ -108,11 +108,11 @@ WRITE8_MEMBER( k056800_device::host_w )
case 7:
// Sound interrupt
- m_int_pending = true;
-
if (m_int_enabled)
+ {
+ m_int_pending = true;
m_int_handler(ASSERT_LINE);
-
+ }
break;
}
}
diff --git a/src/devices/sound/mos6560.cpp b/src/devices/sound/mos6560.cpp
index 61ca40f5829..f7c31e96ea9 100644
--- a/src/devices/sound/mos6560.cpp
+++ b/src/devices/sound/mos6560.cpp
@@ -626,7 +626,7 @@ void mos6560_device::sound_start()
/* buffer for fastest played sample for 5 second so we have enough data for min 5 second */
m_noisesize = NOISE_FREQUENCY_MAX * NOISE_BUFFER_SIZE_SEC;
- m_noise = auto_alloc_array(machine(), INT8, m_noisesize);
+ m_noise = std::make_unique<INT8[]>(m_noisesize);
{
int noiseshift = 0x7ffff8;
char data;
@@ -661,7 +661,7 @@ void mos6560_device::sound_start()
if (m_tonesize > 0)
{
- m_tone = auto_alloc_array(machine(), INT16, m_tonesize);
+ m_tone = std::make_unique<INT16[]>(m_tonesize);
for (i = 0; i < m_tonesize; i++)
{
diff --git a/src/devices/sound/mos6560.h b/src/devices/sound/mos6560.h
index c5259f72659..d84897027d5 100644
--- a/src/devices/sound/mos6560.h
+++ b/src/devices/sound/mos6560.h
@@ -223,8 +223,8 @@ protected:
m_noisesamples; /* count of samples to give out per tone */
sound_stream *m_channel;
- INT16 *m_tone;
- INT8 *m_noise;
+ std::unique_ptr<INT16[]> m_tone;
+ std::unique_ptr<INT8[]> m_noise;
emu_timer *m_line_timer;
};
diff --git a/src/devices/sound/mos6581.cpp b/src/devices/sound/mos6581.cpp
index 89ed5e375c8..6f9a4ae24cb 100644
--- a/src/devices/sound/mos6581.cpp
+++ b/src/devices/sound/mos6581.cpp
@@ -45,7 +45,7 @@ mos6581_device::mos6581_device(const machine_config &mconfig, device_type type,
m_stream(nullptr),
m_variant(variant)
{
- m_token = global_alloc_clear(SID6581_t);
+ m_token = global_alloc_clear<SID6581_t>();
}
mos6581_device::mos6581_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
@@ -56,7 +56,7 @@ mos6581_device::mos6581_device(const machine_config &mconfig, const char *tag, d
m_stream(nullptr),
m_variant(TYPE_6581)
{
- m_token = global_alloc_clear(SID6581_t);
+ m_token = global_alloc_clear<SID6581_t>();
}
mos6581_device::~mos6581_device()
@@ -126,7 +126,7 @@ void mos6581_device::sound_stream_update(sound_stream &stream, stream_sample_t *
READ8_MEMBER( mos6581_device::read )
{
- UINT8 data = 0;
+ UINT8 data;
switch (offset & 0x1f)
{
diff --git a/src/devices/sound/mos7360.cpp b/src/devices/sound/mos7360.cpp
index 1be8535b417..6478d931111 100644
--- a/src/devices/sound/mos7360.cpp
+++ b/src/devices/sound/mos7360.cpp
@@ -297,7 +297,7 @@ void mos7360_device::device_start()
// buffer for fastest played sample for 5 second so we have enough data for min 5 second
m_noisesize = NOISE_FREQUENCY_MAX * NOISE_BUFFER_SIZE_SEC;
- m_noise = auto_alloc_array(machine(), UINT8, m_noisesize);
+ m_noise = std::make_unique<UINT8[]>(m_noisesize);
{
int noiseshift = 0x7ffff8;
diff --git a/src/devices/sound/mos7360.h b/src/devices/sound/mos7360.h
index f1d755981b2..cba7b398762 100644
--- a/src/devices/sound/mos7360.h
+++ b/src/devices/sound/mos7360.h
@@ -185,7 +185,7 @@ protected:
double m_rastertime;
/* sound part */
- UINT8 *m_noise;
+ std::unique_ptr<UINT8[]> m_noise;
int m_tone1pos, m_tone2pos,
m_tone1samples, m_tone2samples,
m_noisesize, /* number of samples */
diff --git a/src/devices/sound/mpeg_audio.h b/src/devices/sound/mpeg_audio.h
index 615116b6021..428d18f63bc 100644
--- a/src/devices/sound/mpeg_audio.h
+++ b/src/devices/sound/mpeg_audio.h
@@ -54,9 +54,6 @@ public:
// Clear audio buffer
void clear();
- // Change the base pointer
- void set_base(const void *base);
-
private:
struct limit_hit {};
@@ -94,8 +91,6 @@ private:
double audio_buffer[2][32*32];
int audio_buffer_pos[2];
- int master_pos;
-
int current_pos, current_limit;
void read_header_amm(bool layer25);
@@ -111,7 +106,6 @@ private:
void build_amplitudes();
void build_next_segments(int step);
void retrieve_subbuffer(int step);
- void handle_block(int &pos);
void idct32(const double *input, double *output);
void resynthesis(const double *input, double *output);
void scale_and_clamp(const double *input, short *output, int step);
diff --git a/src/devices/sound/msm5232.cpp b/src/devices/sound/msm5232.cpp
index 5d3f2ddf8b0..5411dc29558 100644
--- a/src/devices/sound/msm5232.cpp
+++ b/src/devices/sound/msm5232.cpp
@@ -1,4 +1,4 @@
-// license:???
+// license:GPL-2.0+
// copyright-holders:Jarek Burczynski, Hiromitsu Shioya
#include "emu.h"
diff --git a/src/devices/sound/msm5232.h b/src/devices/sound/msm5232.h
index 5edb00b6cff..e861aa2725e 100644
--- a/src/devices/sound/msm5232.h
+++ b/src/devices/sound/msm5232.h
@@ -1,4 +1,4 @@
-// license:???
+// license:GPL-2.0+
// copyright-holders:Jarek Burczynski, Hiromitsu Shioya
#pragma once
diff --git a/src/devices/sound/multipcm.h b/src/devices/sound/multipcm.h
index 388dfe6b84c..3abb6bd214e 100644
--- a/src/devices/sound/multipcm.h
+++ b/src/devices/sound/multipcm.h
@@ -126,7 +126,6 @@ private:
// Internal LFO functions
void lfo_init();
- INT32 lfo_float_to_fixed(const float value);
void lfo_compute_step(lfo_t *lfo, UINT32 lfo_frequency, UINT32 LFOS, INT32 amplitude_lfo);
INT32 pitch_lfo_step(lfo_t *lfo);
INT32 amplitude_lfo_step(lfo_t *lfo);
diff --git a/src/devices/sound/namco.cpp b/src/devices/sound/namco.cpp
index 070ae056597..9bddba97783 100644
--- a/src/devices/sound/namco.cpp
+++ b/src/devices/sound/namco.cpp
@@ -36,19 +36,20 @@ const device_type NAMCO_15XX = &device_creator<namco_15xx_device>;
const device_type NAMCO_CUS30 = &device_creator<namco_cus30_device>;
namco_audio_device::namco_audio_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source)
- : device_t(mconfig, type, name, tag, owner, clock, shortname, __FILE__),
- device_sound_interface(mconfig, *this),
- m_last_channel(nullptr),
- m_soundregs(nullptr),
- m_wavedata(nullptr),
- m_wave_size(0),
- m_sound_enable(0),
- m_stream(nullptr),
- m_namco_clock(0),
- m_sample_rate(0),
- m_f_fracbits(0),
- m_voices(0),
- m_stereo(0)
+ : device_t(mconfig, type, name, tag, owner, clock, shortname, __FILE__)
+ , device_sound_interface(mconfig, *this)
+ , m_wave_ptr(*this, DEVICE_SELF)
+ , m_last_channel(nullptr)
+ , m_soundregs(nullptr)
+ , m_wavedata(nullptr)
+ , m_wave_size(0)
+ , m_sound_enable(0)
+ , m_stream(nullptr)
+ , m_namco_clock(0)
+ , m_sample_rate(0)
+ , m_f_fracbits(0)
+ , m_voices(0)
+ , m_stereo(0)
{
}
@@ -95,7 +96,7 @@ void namco_audio_device::device_start()
logerror("Namco: freq fractional bits = %d: internal freq = %d, output freq = %d\n", m_f_fracbits, m_namco_clock, m_sample_rate);
/* build the waveform table */
- build_decoded_waveform(region()->base());
+ build_decoded_waveform(m_wave_ptr);
/* get stream channels */
if (m_stereo)
@@ -109,7 +110,7 @@ void namco_audio_device::device_start()
/* register with the save state system */
save_pointer(NAME(m_soundregs), 0x400);
- if (region() == nullptr)
+ if (m_wave_ptr == nullptr)
save_pointer(NAME(m_wavedata), 0x400);
save_item(NAME(m_voices));
diff --git a/src/devices/sound/namco.h b/src/devices/sound/namco.h
index e79484e4f4a..4bd09c5d3a1 100644
--- a/src/devices/sound/namco.h
+++ b/src/devices/sound/namco.h
@@ -53,6 +53,9 @@ protected:
void update_namco_waveform(int offset, UINT8 data);
UINT32 namco_update_one(stream_sample_t *buffer, int length, const INT16 *wave, UINT32 counter, UINT32 freq);
+ /* waveform region */
+ optional_region_ptr<UINT8> m_wave_ptr;
+
/* data about the sound system */
sound_channel m_channel_list[MAX_VOICES];
sound_channel *m_last_channel;
diff --git a/src/devices/sound/pokey.cpp b/src/devices/sound/pokey.cpp
index e38b92dd6b3..b23980c8b05 100644
--- a/src/devices/sound/pokey.cpp
+++ b/src/devices/sound/pokey.cpp
@@ -802,7 +802,7 @@ READ8_MEMBER( pokey_device::read )
UINT8 pokey_device::read(offs_t offset)
{
- int data = 0, pot;
+ int data, pot;
synchronize(SYNC_NOOP); /* force resync */
diff --git a/src/devices/sound/qs1000.cpp b/src/devices/sound/qs1000.cpp
index 44ff9017ea4..a892945adad 100644
--- a/src/devices/sound/qs1000.cpp
+++ b/src/devices/sound/qs1000.cpp
@@ -488,8 +488,6 @@ void qs1000_device::sound_stream_update(sound_stream &stream, stream_sample_t **
// Iterate over voices and accumulate sample data
for (auto & chan : m_channels)
{
-
-
UINT8 lvol = chan.m_regs[6];
UINT8 rvol = chan.m_regs[7];
UINT8 vol = chan.m_regs[8];
diff --git a/src/devices/sound/qs1000.h b/src/devices/sound/qs1000.h
index a807071fe22..1543a01b057 100644
--- a/src/devices/sound/qs1000.h
+++ b/src/devices/sound/qs1000.h
@@ -112,7 +112,6 @@ public:
};
void start_voice(int ch);
- void set_voice_regs(int ch);
bool m_external_rom;
diff --git a/src/devices/sound/qsound.cpp b/src/devices/sound/qsound.cpp
index c9bd30d3e74..cc5fc28560a 100644
--- a/src/devices/sound/qsound.cpp
+++ b/src/devices/sound/qsound.cpp
@@ -1,4 +1,4 @@
-// license:???
+// license:BSD-3-Clause
// copyright-holders:Paul Leaman, Miguel Angel Horna
/***************************************************************************
@@ -224,7 +224,7 @@ READ8_MEMBER(qsound_device::qsound_r)
void qsound_device::write_data(UINT8 address, UINT16 data)
{
- int ch = 0, reg = 0;
+ int ch = 0, reg;
// direct sound reg
if (address < 0x80)
diff --git a/src/devices/sound/qsound.h b/src/devices/sound/qsound.h
index d17511455d7..cd90136238e 100644
--- a/src/devices/sound/qsound.h
+++ b/src/devices/sound/qsound.h
@@ -1,4 +1,4 @@
-// license:???
+// license:BSD-3-Clause
// copyright-holders:Paul Leaman, Miguel Angel Horna
/*********************************************************
diff --git a/src/devices/sound/rf5c400.cpp b/src/devices/sound/rf5c400.cpp
index ad381817ccf..6eaa2245ca9 100644
--- a/src/devices/sound/rf5c400.cpp
+++ b/src/devices/sound/rf5c400.cpp
@@ -354,6 +354,11 @@ READ16_MEMBER( rf5c400_device::rf5c400_r )
{
return 0;
}
+
+ case 0x13: // memory read
+ {
+ return m_rom[m_ext_mem_address];
+ }
}
return 0;
@@ -413,17 +418,32 @@ WRITE16_MEMBER( rf5c400_device::rf5c400_w )
case 0x08: // relative to env attack (channel no)
case 0x09: // relative to env attack (0x0c00/ 0x1c00)
- case 0x11: // ? counter for 0x13?
+ case 0x11: // memory r/w address, bits 15 - 0
+ {
+ m_ext_mem_address &= ~0xffff;
+ m_ext_mem_address |= data;
+ break;
+ }
+ case 0x12: // memory r/w address, bits 23 - 16
{
+ m_ext_mem_address &= 0xffff;
+ m_ext_mem_address |= (UINT32)(data) << 16;
break;
}
- case 0x13: // ? bujutsu writes sample data here
+ case 0x13: // memory write data
{
+ m_ext_mem_data = data;
break;
}
- case 0x14: // ? related to 0x11/0x13 ?
+ case 0x14: // memory write
+ {
+ if ((data & 0x3) == 3)
+ {
+ m_rom[m_ext_mem_address] = m_ext_mem_data;
+ }
break;
+ }
case 0x21: // reverb(character).w
case 0x32: // reverb(pre-lpf).w
diff --git a/src/devices/sound/rf5c400.h b/src/devices/sound/rf5c400.h
index fd04b788f93..bc30301d9cd 100644
--- a/src/devices/sound/rf5c400.h
+++ b/src/devices/sound/rf5c400.h
@@ -109,6 +109,9 @@ private:
double m_env_rr_table[0x9f];
rf5c400_channel m_channels[32];
+
+ UINT32 m_ext_mem_address;
+ UINT16 m_ext_mem_data;
};
extern const device_type RF5C400;
diff --git a/src/devices/sound/s14001a.cpp b/src/devices/sound/s14001a.cpp
index a238a23cd43..627d3214b10 100644
--- a/src/devices/sound/s14001a.cpp
+++ b/src/devices/sound/s14001a.cpp
@@ -1,36 +1,20 @@
// license:BSD-3-Clause
-// copyright-holders:Jonathan Gevaryahu,R. Belmont,Zsolt Vasvari
+// copyright-holders:Ed Bernard, Jonathan Gevaryahu, hap
+// thanks-to:Kevin Horton
/*
-
- TSI S14001A emulator v1.32
- By Jonathan Gevaryahu ("Lord Nightmare") with help from Kevin Horton ("kevtris")
- MAME conversion and integration by R. Belmont
- Clock Frequency control updated by Zsolt Vasvari
- Other fixes by AtariAce
-
- Copyright (C) 2006-2013 Jonathan Gevaryahu aka Lord Nightmare
-
- Version history:
- 0.8 initial version - LN
- 0.9 MAME conversion, glue code added - R. Belmont
- 1.0 partly fixed stream update - LN (0.111u4)
- 1.01 fixed clipping problem - LN (0.111u5)
- 1.1 add VSU-1000 features, fully fixed stream update by fixing word latching - LN (0.111u6)
- 1.11 fix signedness of output, pre-multiply, fixes clicking on VSU-1000 volume change - LN (0.111u7)
- 1.20 supports setting the clock freq directly - reset is done by external hardware,
- the chip has no reset line ZV (0.122)
- 1.30 move main dac to 4 bits only with no extension (4->16 bit range extension is now done by output).
- Added a somewhat better, but still not perfect, filtering system - LN
- 1.31 fix a minor bug with the dac range. wolfpack clips again, and I'm almost sure its an encoding error on the original speech - LN (0.125u9)
- 1.31a Add chip pinout and other notes - LN (0.128u4)
- 1.31b slight update to notes to clarify input bus stuff, mostly finish the state map in the comments - LN
- 1.31c remove usage of deprecat lib - AtariAce (0.128u5)
- 1.32 fix the squealing noise using a define; it isn't accurate to the chip exactly, but there are other issues which need to be fixed too. see TODO. - LN (0.136u2)
-
- TODO:
- * increase accuracy of internal S14001A 'filter' for both driven and undriven cycles (its not terribly inaccurate for undriven cycles, but the dc sliding of driven cycles is not emulated)
- * add option for and attach Frank P.'s emulation of the Analog external filter from the vsu-1000 using the discrete core. (with the direction of independent sound core and analog stuff, this should actually be attached in the main berzerk/frenzy driver and not here)
- * fix the local and global silence stuff to not force the dac to a specific level, but cease doing deltas (i.e. force all deltas to 0) after the last sample; this should fix the clipping in wolfpack and in the fidelity games in mess.
+ SSi TSI S14001A speech IC emulator
+ aka CRC: Custom ROM Controller, designed in 1975, first usage in 1976 on TSI Speech+ calculator
+ Originally written for MAME by Jonathan Gevaryahu(Lord Nightmare) 2006-2013,
+ replaced with near-complete rewrite by Ed Bernard in 2016
+
+ TODO:
+ - nothing at the moment?
+
+ Further reading:
+ - http://www.vintagecalculators.com/html/speech-.html
+ - http://www.vintagecalculators.com/html/development_of_the_tsi_speech-.html
+ - http://www.vintagecalculators.com/html/speech-_state_machine.html
+ - https://archive.org/stream/pdfy-QPCSwTWiFz1u9WU_/david_djvu.txt
*/
/* Chip Pinout:
@@ -99,7 +83,7 @@ and the TEST pins may do so too.
START is pulled high when a word is to be said and the word number is on the
word select/speech address input lines. The Canon 'Canola' uses a separate 'rom
strobe' signal independent of the chip to either enable or clock the speech rom.
-Its likely that they did this to be able to force the speech chip to stop talking,
+It's likely that they did this to be able to force the speech chip to stop talking,
which is normally impossible. The later 'version 3' TSI speech board as featured in
an advertisement in the John Cater book probably also has this feature, in addition
to external speech rom banking.
@@ -110,9 +94,7 @@ on 'invalid' cycles they act as a 4 bit input to drive the dac.
Because it requires -10V to operate, the chip manufacturing process must be PMOS.
-/-----------\
-> Operation <
-\-----------/
+* Operation:
Put the 6-bit address of the word to be said onto the C0-C5 word select/speech
address bus lines. Next, clock the START line low-high-low. As long as the START
line is held high, the first address byte of the first word will be read repeatedly
@@ -121,531 +103,475 @@ and off as it normally does during speech). Once START has gone low-high-low, th
/BUSY line will go low until 3 clocks after the chip is done speaking.
*/
-
-/* state map:
-
- * state machine 1: odd/even clock state
- * on even clocks, audio output is floating, /romen is low so rom data bus is driven, input is latched?
- * on odd clocks, audio output is driven, /romen is high, state machine 2 is clocked
- * *****
- * state machine 2: decoder state
- * NOTE: holding the start line high forces the state machine 2 state to go to or remain in state 1!
- * state 0(Idle): Idle (no sample rom bus activity, output at 0), next state is 0(Idle)
-
- * state 1(GetHiWord):
- * grab byte at (wordinput<<1) -> register_WH
- * reset output DAC accumulator to 0x8 <- ???
- * reset OldValHi to 1
- * reset OldValLo to 0
- * next state is 2(GetLoWord) UNLESS the PLAY line is still high, in which case the state remains at 1
-
- * state 2(GetLoWord):
- * grab byte at (wordinput<<1)+1 -> register_WL
- * next state is 3(GetHiPhon)
-
- * state 3(GetHiPhon):
- * grab byte at ((register_WH<<8) + (register_WL))>>4 -> phoneaddress
- * next state is 4(GetLoPhon)
-
- * state 4(GetLoPhon):
- * grab byte at (((register_WH<<8) + (register_WL))>>4)+1 -> playparams
- * set phonepos register to 0
- * set oddphone register to 0
- * next state is 5(PlayForward1)
- * playparams:
- * 7 6 5 4 3 2 1 0
- * G G = LastPhone
- * B B = PlayMode
- * Y Y = Silenceflag
- * S S S S = Length count load value
- * R R R = Repeat count reload value (upon carry/overflow of 3 bits)
- * load the repeat counter with the bits 'R R 0'
- * load the length counter with the bits 'S S S 0'
- * NOTE: though only three bits of the length counter load value are controllable, there is a fourth lower bit which is assumed 0 on start and controls the direction of playback, i.e. forwards or backwards within a phone.
- * NOTE: though only two bits of the repeat counter reload value are controllable, there is a third bit which is loaded to 0 on phoneme start, and this hidden low-order bit of the counter itself is what controls whether the output is forced to silence in mirrored mode. the 'carry' from the highest bit of the 3 bit counter is what increments the address pointer for pointing to the next phoneme in mirrored mode
-
-
- * shift register diagram:
- * F E D C B A 9 8 7 6 5 4 3 2 1 0
- * <new byte here>
- * C C C = Current delta sample read point
- * O O O = Old delta sample read point
- * I *OPTIMIZED OUT* the shift register by making use of the fact that the device reads each rom byte 4 times
-
- * state 5(PlayForward1):
- * grab byte at (((phoneaddress<<8)+(oddphone*8))+(phonepos>>2)) -> PlayRegister high end, bits F to 8
- * if Playmode is mirrored, set OldValHi and OldValLo to 1 and 0 respectively, otherwise leave them with whatever was in them before.
- * Put OldValHi in bit 7 of PlayRegister
- * Put OldValLo in bit 6 of PlayRegister
- * Get new OldValHi from bit 9
- * Get new OldValLo from bit 8
- * feed current delta (bits 9 and 8) and olddelta (bits 7 and 6) to delta demodulator table, delta demodulator table applies a delta to the accumulator, accumulator goes to enable/disable latch which Silenceflag enables or disables (forces output to 0x8 on disable), then to DAC to output.
- * next state: state 6(PlayForward2)
-
- * state 6(PlayForward2):
- * grab byte at (((phoneaddress<<8)+oddphone)+(phonepos>>2)) -> PlayRegister bits D to 6.
- * Put OldValHi in bit 7 of PlayRegister\____already done by above operation
- * Put OldValLo in bit 6 of PlayRegister/
- * Get new OldValHi from bit 9
- * Get new OldValLo from bit 8
- * feed current delta (bits 9 and 8) and olddelta (bits 7 and 6) to delta demodulator table, delta demodulator table applies a delta to the accumulator, accumulator goes to enable/disable latch which Silenceflag enables or disables (forces output to 0x8 on disable), then to DAC to output.
- * next state: state 7(PlayForward3)
-
- * state 7(PlayForward3):
- * grab byte at (((phoneaddress<<8)+oddphone)+(phonepos>>2)) -> PlayRegister bits B to 4.
- * Put OldValHi in bit 7 of PlayRegister\____already done by above operation
- * Put OldValLo in bit 6 of PlayRegister/
- * Get new OldValHi from bit 9
- * Get new OldValLo from bit 8
- * feed current delta (bits 9 and 8) and olddelta (bits 7 and 6) to delta demodulator table, delta demodulator table applies a delta to the accumulator, accumulator goes to enable/disable latch which Silenceflag enables or disables (forces output to 0x8 on disable), then to DAC to output.
- * next state: state 8(PlayForward4)
-
- * state 8(PlayForward4):
- * grab byte at (((phoneaddress<<8)+oddphone)+(phonepos>>2)) -> PlayRegister bits 9 to 2.
- * Put OldValHi in bit 7 of PlayRegister\____already done by above operation
- * Put OldValLo in bit 6 of PlayRegister/
- * Get new OldValHi from bit 9
- * Get new OldValLo from bit 8
- * feed current delta (bits 9 and 8) and olddelta (bits 7 and 6) to delta demodulator table, delta demodulator table applies a delta to the accumulator, accumulator goes to enable/disable latch which Silenceflag enables or disables (forces output to 0x8 on disable), then to DAC to output.
- * if offset < 8, increment offset within 8-byte phone
- * if offset = 8: (see PostPhoneme code to understand how this part works, its a bit complicated)
-
- * next state: depends on playparams:
- * if we're in mirrored mode, next will be LoadAndPlayBackward1
- * if we're in nonmirrored mode, next will be PlayForward1
-
- * state 9(LoadAndPlayBackward1)
- * grab byte at (((phoneaddress<<8)+(oddphone*8))+(phonepos>>2)) -> PlayRegister high end, bits F to 8 <- check code on this, I think its backwards here but its correct in the code
- * see code for this, its basically the same as state 8 but with the byte grab mentioned above, and the values fed to the delta demod table are switched
- * state 10(PlayBackward2)
- * see code for this, its basically the same as state 7 but the values fed to the delta demod table are switched
- * state 11(PlayBackward3)
- * see code for this, its basically the same as state 6 but the values fed to the delta demod table are switched
- * state 12(PlayBackward4)
- * see code for this, its basically the same as state 5 but with no byte grab, and the values fed to the delta demod table are switched, and a bit below similar to state 5
- * if offset > -1, decrement offset within 8-byte phone
- * if offset = -1: (see PostPhoneme code to understand how this part works, its a bit complicated)
-*/
-
-/* increment address function:
- * increment repeat counter
- if repeat counter produces a carry, do two things:
- 1. if mirrored mode is ON, increment oddphone. if oddphone carries out (i.e. if it was 1), increment phoneaddress and zero oddphone
- 2. increment lengthcounter. if lengthcounter carries out, we're done this phone.
- * increment output counter
- * if mirrored mode is on, output direction is
- * if mirrored mode is OFF, increment oddphone. if not, don't touch it here. if oddphone was 1 before the increment, increment phoneaddress and set oddphone to 0
- *
- */
-
-#undef ACCURATE_SQUEAL
-
#include "emu.h"
#include "s14001a.h"
+// device definition
+const device_type S14001A = &device_creator<s14001a_device>;
-//#define DEBUGSTATE
+s14001a_device::s14001a_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : device_t(mconfig, S14001A, "S14001A", tag, owner, clock, "s14001a", __FILE__),
+ device_sound_interface(mconfig, *this),
+ m_SpeechRom(*this, DEVICE_SELF),
+ m_stream(nullptr),
+ m_bsy_handler(*this),
+ m_ext_read_handler(*this)
+{
+}
-#define SILENCE 0x7 // value output when silent
-#define ALTFLAG 0xFF // value to tell renderer that this frame's output is the average of the 8 prior frames and not directly used.
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
-#define LASTSYLLABLE ((m_PlayParams & 0x80)>>7)
-#define MIRRORMODE ((m_PlayParams & 0x40)>>6)
-#define SILENCEFLAG ((m_PlayParams & 0x20)>>5)
-#define LENGTHCOUNT ((m_PlayParams & 0x1C)>>1) // remember: its 4 bits and the bottom bit is always zero!
-#define REPEATCOUNT ((m_PlayParams<<1)&0x6) // remember: its 3 bits and the bottom bit is always zero!
-#define LOCALSILENCESTATE ((m_OutputCounter & 0x2) && (MIRRORMODE)) // 1 when silent output, 0 when DAC output.
+ALLOW_SAVE_TYPE(s14001a_device::states); // allow save_item on a non-fundamental type
-static const INT8 DeltaTable[4][4] =
-{
- { -3, -3, -1, -1, },
- { -1, -1, 0, 0, },
- { 0, 0, 1, 1, },
- { 1, 1, 3, 3 },
-};
-
-#ifdef ACCURATE_SQUEAL
-INT16 s14001a_device::audiofilter() /* rewrite me to better match the real filter! */
+void s14001a_device::device_start()
{
- UINT8 temp1;
- INT16 temp2 = 0;
- /* mean averaging filter! 1/n exponential *would* be somewhat better, but I'm lazy... */
- for (temp1 = 0; temp1 < 8; temp1++) { temp2 += m_filtervals[temp1]; }
- temp2 >>= 3;
- return temp2;
+ m_stream = machine().sound().stream_alloc(*this, 0, 1, clock() ? clock() : machine().sample_rate());
+
+ // resolve callbacks
+ m_ext_read_handler.resolve();
+ m_bsy_handler.resolve();
+
+ // note: zerofill is done already by MAME core
+ ClearStatistics();
+ m_uOutputP1 = m_uOutputP2 = 7;
+
+ // register for savestates
+ save_item(NAME(m_bPhase1));
+ save_item(NAME(m_uStateP1));
+ save_item(NAME(m_uStateP2));
+ save_item(NAME(m_uDAR13To05P1));
+ save_item(NAME(m_uDAR13To05P2));
+ save_item(NAME(m_uDAR04To00P1));
+ save_item(NAME(m_uDAR04To00P2));
+ save_item(NAME(m_uCWARP1));
+ save_item(NAME(m_uCWARP2));
+
+ save_item(NAME(m_bStopP1));
+ save_item(NAME(m_bStopP2));
+ save_item(NAME(m_bVoicedP1));
+ save_item(NAME(m_bVoicedP2));
+ save_item(NAME(m_bSilenceP1));
+ save_item(NAME(m_bSilenceP2));
+ save_item(NAME(m_uLengthP1));
+ save_item(NAME(m_uLengthP2));
+ save_item(NAME(m_uXRepeatP1));
+ save_item(NAME(m_uXRepeatP2));
+ save_item(NAME(m_uDeltaOldP1));
+ save_item(NAME(m_uDeltaOldP2));
+ save_item(NAME(m_uOutputP1));
+
+ save_item(NAME(m_bDAR04To00CarryP2));
+ save_item(NAME(m_bPPQCarryP2));
+ save_item(NAME(m_bRepeatCarryP2));
+ save_item(NAME(m_bLengthCarryP2));
+ save_item(NAME(m_RomAddrP1));
+
+ save_item(NAME(m_uOutputP2));
+ save_item(NAME(m_uRomAddrP2));
+ save_item(NAME(m_bBusyP1));
+ save_item(NAME(m_bStart));
+ save_item(NAME(m_uWord));
+
+ save_item(NAME(m_uNPitchPeriods));
+ save_item(NAME(m_uNVoiced));
+ save_item(NAME(m_uNControlWords));
+ save_item(NAME(m_uPrintLevel));
}
-void s14001a_device::shiftIntoFilter(INT16 inputvalue)
+
+//-------------------------------------------------
+// sound_stream_update - handle a stream update
+//-------------------------------------------------
+
+void s14001a_device::sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples)
{
- UINT8 temp1;
- for (temp1 = 7; temp1 > 0; temp1--)
+ for (int i = 0; i < samples; i++)
{
- m_filtervals[temp1] = m_filtervals[(temp1 - 1)];
+ Clock();
+ INT16 sample = m_uOutputP2 - 7; // range -7..8
+ outputs[0][i] = sample * 0xf00;
}
- m_filtervals[0] = inputvalue;
}
-#endif
-void s14001a_device::PostPhoneme() /* figure out what the heck to do after playing a phoneme */
+
+/**************************************************************************
+ External interface
+**************************************************************************/
+
+void s14001a_device::force_update()
{
-#ifdef DEBUGSTATE
- fprintf(stderr,"0: entered PostPhoneme\n");
-#endif
- m_RepeatCounter++; // increment the repeat counter
- m_OutputCounter++; // increment the output counter
- if (MIRRORMODE) // if mirroring is enabled
- {
-#ifdef DEBUGSTATE
- fprintf(stderr,"1: MIRRORMODE was on\n");
-#endif
- if (m_RepeatCounter == 0x8) // exceeded 3 bits?
- {
-#ifdef DEBUGSTATE
- fprintf(stderr,"2: RepeatCounter was == 8\n");
-#endif
- // reset repeat counter, increment length counter
- // but first check if lowest bit is set
- m_RepeatCounter = REPEATCOUNT; // reload repeat counter with reload value
- if (m_LengthCounter & 0x1) // if low bit is 1 (will carry after increment)
- {
-#ifdef DEBUGSTATE
- fprintf(stderr,"3: LengthCounter's low bit was 1\n");
-#endif
- m_PhoneAddress+=8; // go to next phone in this syllable
- }
- m_LengthCounter++;
- if (m_LengthCounter == 0x10) // if Length counter carried out of 4 bits
- {
-#ifdef DEBUGSTATE
- fprintf(stderr,"3: LengthCounter overflowed\n");
-#endif
- m_SyllableAddress += 2; // go to next syllable
- m_nextstate = LASTSYLLABLE ? 13 : 3; // if we're on the last syllable, go to end state, otherwise go and load the next syllable.
- }
- else
- {
-#ifdef DEBUGSTATE
- fprintf(stderr,"3: LengthCounter's low bit wasn't 1 and it didn't overflow\n");
-#endif
- m_PhoneOffset = (m_OutputCounter&1) ? 7 : 0;
- m_nextstate = (m_OutputCounter&1) ? 9 : 5;
- }
- }
- else // repeatcounter did NOT carry out of 3 bits so leave length counter alone
- {
-#ifdef DEBUGSTATE
- fprintf(stderr,"2: RepeatCounter is less than 8 (its actually %d)\n", m_RepeatCounter);
-#endif
- m_PhoneOffset = (m_OutputCounter&1) ? 7 : 0;
- m_nextstate = (m_OutputCounter&1) ? 9 : 5;
- }
- }
- else // if mirroring is NOT enabled
- {
-#ifdef DEBUGSTATE
- fprintf(stderr,"1: MIRRORMODE was off\n");
-#endif
- if (m_RepeatCounter == 0x8) // exceeded 3 bits?
- {
-#ifdef DEBUGSTATE
- fprintf(stderr,"2: RepeatCounter was == 8\n");
-#endif
- // reset repeat counter, increment length counter
- m_RepeatCounter = REPEATCOUNT; // reload repeat counter with reload value
- m_LengthCounter++;
- if (m_LengthCounter == 0x10) // if Length counter carried out of 4 bits
- {
-#ifdef DEBUGSTATE
- fprintf(stderr,"3: LengthCounter overflowed\n");
-#endif
- m_SyllableAddress += 2; // go to next syllable
- m_nextstate = LASTSYLLABLE ? 13 : 3; // if we're on the last syllable, go to end state, otherwise go and load the next syllable.
-#ifdef DEBUGSTATE
- fprintf(stderr,"nextstate is now %d\n", m_nextstate); // see line below, same reason.
-#endif
- return; // need a return here so we don't hit the 'nextstate = 5' line below
- }
- }
- m_PhoneAddress += 8; // regardless of counters, the phone address always increments in non-mirrored mode
- m_PhoneOffset = 0;
- m_nextstate = 5;
- }
-#ifdef DEBUGSTATE
- fprintf(stderr,"nextstate is now %d\n", m_nextstate);
-#endif
+ m_stream->update();
}
-void s14001a_device::s14001a_clock() /* called once per clock */
+READ_LINE_MEMBER(s14001a_device::romen_r)
{
- UINT8 CurDelta; // Current delta
-
- /* on even clocks, audio output is floating, /romen is low so rom data bus is driven
- * on odd clocks, audio output is driven, /romen is high, state machine 2 is clocked
- */
- m_oddeven = !(m_oddeven); // invert the clock
- if (m_oddeven == 0) // even clock
- {
-#ifdef ACCURATE_SQUEAL
- m_audioout = ALTFLAG; // flag to the renderer that this output should be the average of the last 8
-#endif
- // DIGITAL INPUT *MIGHT* occur on the test pins occurs on this cycle?
- }
- else // odd clock
- {
- // fix dac output between samples. theoretically this might be unnecessary but it would require some messy logic in state 5 on the first sample load.
- // Note: this behavior is NOT accurate, and needs to be fixed. see TODO.
- if (m_GlobalSilenceState || LOCALSILENCESTATE)
- {
- m_DACOutput = SILENCE;
- m_OldDelta = 2;
- }
- m_audioout = (m_GlobalSilenceState || LOCALSILENCESTATE) ? SILENCE : m_DACOutput; // when either silence state is 1, output silence.
- // DIGITAL OUTPUT *might* be driven onto the test pins on this cycle?
- switch(m_machineState) // HUUUUUGE switch statement
- {
- case 0: // idle state
- m_nextstate = 0;
- break;
- case 1: // read starting syllable high byte from word table
- m_SyllableAddress = 0; // clear syllable address
- m_SyllableAddress |= m_SpeechRom[(m_LatchedWord<<1)]<<4;
- m_nextstate = m_resetState ? 1 : 2;
- break;
- case 2: // read starting syllable low byte from word table
- m_SyllableAddress |= m_SpeechRom[(m_LatchedWord<<1)+1]>>4;
- m_nextstate = 3;
- break;
- case 3: // read starting phone address
- m_PhoneAddress = m_SpeechRom[m_SyllableAddress]<<4;
- m_nextstate = 4;
- break;
- case 4: // read playback parameters and prepare for play
- m_PlayParams = m_SpeechRom[m_SyllableAddress+1];
- m_GlobalSilenceState = SILENCEFLAG; // load phone silence flag
- m_LengthCounter = LENGTHCOUNT; // load length counter
- m_RepeatCounter = REPEATCOUNT; // load repeat counter
- m_OutputCounter = 0; // clear output counter and disable mirrored phoneme silence indirectly via LOCALSILENCESTATE
- m_PhoneOffset = 0; // set offset within phone to zero
- m_OldDelta = 0x2; // set old delta to 2 <- is this right?
- m_DACOutput = SILENCE ; // set DAC output to center/silence position
- m_nextstate = 5;
- break;
- case 5: // Play phone forward, shift = 0 (also load)
- CurDelta = (m_SpeechRom[(m_PhoneAddress)+m_PhoneOffset]&0xc0)>>6; // grab current delta from high 2 bits of high nybble
- m_DACOutput += DeltaTable[CurDelta][m_OldDelta]; // send data to forward delta table and add result to accumulator
- m_OldDelta = CurDelta; // Move current delta to old
- m_nextstate = 6;
- break;
- case 6: // Play phone forward, shift = 2
- CurDelta = (m_SpeechRom[(m_PhoneAddress)+m_PhoneOffset]&0x30)>>4; // grab current delta from low 2 bits of high nybble
- m_DACOutput += DeltaTable[CurDelta][m_OldDelta]; // send data to forward delta table and add result to accumulator
- m_OldDelta = CurDelta; // Move current delta to old
- m_nextstate = 7;
- break;
- case 7: // Play phone forward, shift = 4
- CurDelta = (m_SpeechRom[(m_PhoneAddress)+m_PhoneOffset]&0xc)>>2; // grab current delta from high 2 bits of low nybble
- m_DACOutput += DeltaTable[CurDelta][m_OldDelta]; // send data to forward delta table and add result to accumulator
- m_OldDelta = CurDelta; // Move current delta to old
- m_nextstate = 8;
- break;
- case 8: // Play phone forward, shift = 6 (increment address if needed)
- CurDelta = m_SpeechRom[(m_PhoneAddress)+m_PhoneOffset]&0x3; // grab current delta from low 2 bits of low nybble
- m_DACOutput += DeltaTable[CurDelta][m_OldDelta]; // send data to forward delta table and add result to accumulator
- m_OldDelta = CurDelta; // Move current delta to old
- m_PhoneOffset++; // increment phone offset
- if (m_PhoneOffset == 0x8) // if we're now done this phone
- {
- /* call the PostPhoneme Function */
- PostPhoneme();
- }
- else
- {
- m_nextstate = 5;
- }
- break;
- case 9: // Play phone backward, shift = 6 (also load)
- CurDelta = (m_SpeechRom[(m_PhoneAddress)+m_PhoneOffset]&0x3); // grab current delta from low 2 bits of low nybble
- if (m_laststate != 8) // ignore first (bogus) dac change in mirrored backwards mode. observations and the patent show this.
- {
- m_DACOutput -= DeltaTable[m_OldDelta][CurDelta]; // send data to forward delta table and subtract result from accumulator
- }
- m_OldDelta = CurDelta; // Move current delta to old
- m_nextstate = 10;
- break;
- case 10: // Play phone backward, shift = 4
- CurDelta = (m_SpeechRom[(m_PhoneAddress)+m_PhoneOffset]&0xc)>>2; // grab current delta from high 2 bits of low nybble
- m_DACOutput -= DeltaTable[m_OldDelta][CurDelta]; // send data to forward delta table and subtract result from accumulator
- m_OldDelta = CurDelta; // Move current delta to old
- m_nextstate = 11;
- break;
- case 11: // Play phone backward, shift = 2
- CurDelta = (m_SpeechRom[(m_PhoneAddress)+m_PhoneOffset]&0x30)>>4; // grab current delta from low 2 bits of high nybble
- m_DACOutput -= DeltaTable[m_OldDelta][CurDelta]; // send data to forward delta table and subtract result from accumulator
- m_OldDelta = CurDelta; // Move current delta to old
- m_nextstate = 12;
- break;
- case 12: // Play phone backward, shift = 0 (increment address if needed)
- CurDelta = (m_SpeechRom[(m_PhoneAddress)+m_PhoneOffset]&0xc0)>>6; // grab current delta from high 2 bits of high nybble
- m_DACOutput -= DeltaTable[m_OldDelta][CurDelta]; // send data to forward delta table and subtract result from accumulator
- m_OldDelta = CurDelta; // Move current delta to old
- m_PhoneOffset--; // decrement phone offset
- if (m_PhoneOffset == 0xFF) // if we're now done this phone
- {
- /* call the PostPhoneme() function */
- PostPhoneme();
- }
- else
- {
- m_nextstate = 9;
- }
- break;
- case 13: // For those pedantic among us, consume an extra two clocks like the real chip does.
- m_nextstate = 0;
- break;
- }
-#ifdef DEBUGSTATE
- fprintf(stderr, "Machine state is now %d, was %d, PhoneOffset is %d\n", m_nextstate, m_machineState, m_PhoneOffset);
-#endif
- m_laststate = m_machineState;
- m_machineState = m_nextstate;
-
- /* the dac is 4 bits wide. if a delta step forced it outside of 4 bits, mask it back over here */
- m_DACOutput &= 0xF;
- }
+ m_stream->update();
+ return (m_bPhase1) ? 1 : 0;
}
-/**************************************************************************
- MAME glue code
- **************************************************************************/
-
-int s14001a_device::bsy_r()
+READ_LINE_MEMBER(s14001a_device::busy_r)
{
m_stream->update();
-#ifdef DEBUGSTATE
- fprintf(stderr,"busy state checked: %d\n",(m_machineState != 0) );
-#endif
- return (m_machineState != 0);
+ return (m_bBusyP1) ? 1 : 0;
}
-void s14001a_device::reg_w(int data)
+WRITE8_MEMBER(s14001a_device::data_w)
{
m_stream->update();
- m_WordInput = data;
+ m_uWord = data & 0x3f; // C0-C5
}
-void s14001a_device::rst_w(int data)
+WRITE_LINE_MEMBER(s14001a_device::start_w)
{
m_stream->update();
- m_LatchedWord = m_WordInput;
- m_resetState = (data==1);
- m_machineState = m_resetState ? 1 : m_machineState;
+ m_bStart = (state != 0);
+ if (m_bStart) m_uStateP1 = WORDWAIT;
}
-void s14001a_device::set_clock(int clock)
+void s14001a_device::set_clock(UINT32 clock)
{
+ m_stream->update();
m_stream->set_sample_rate(clock);
}
-void s14001a_device::set_volume(int volume)
+
+/**************************************************************************
+ Device emulation
+**************************************************************************/
+
+UINT8 s14001a_device::readmem(UINT16 offset, bool phase)
{
- m_stream->update();
- m_VSU1000_amp = volume;
+ offset &= 0xfff; // 11-bit internal
+ return ((m_ext_read_handler.isnull()) ? m_SpeechRom[offset & (m_SpeechRom.bytes() - 1)] : m_ext_read_handler(offset));
}
-const device_type S14001A = &device_creator<s14001a_device>;
+bool s14001a_device::Clock()
+{
+ // effectively toggles external clock twice, one cycle
+ // internal clock toggles on external clock transition from 0 to 1 so internal clock will always transition here
+ // return false if some emulator problem detected
-s14001a_device::s14001a_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
- : device_t(mconfig, S14001A, "S14001A", tag, owner, clock, "s14001a", __FILE__),
- device_sound_interface(mconfig, *this),
- m_SpeechRom(*this, DEVICE_SELF),
- m_stream(nullptr),
- m_WordInput(0),
- m_LatchedWord(0),
- m_SyllableAddress(0),
- m_PhoneAddress(0),
- m_PlayParams(0),
- m_PhoneOffset(0),
- m_LengthCounter(0),
- m_RepeatCounter(0),
- m_OutputCounter(0),
- m_machineState(0),
- m_nextstate(0),
- m_laststate(0),
- m_resetState(0),
- m_oddeven(0),
- m_GlobalSilenceState(1),
- m_OldDelta(0x02),
- m_DACOutput(SILENCE),
- m_audioout(0),
- m_VSU1000_amp(0)
+ // On the actual chip, all register phase 1 values needed to be refreshed from phase 2 values
+ // or else risk losing their state due to charge loss.
+ // But on a computer the values are static.
+ // So to reduce code clutter, phase 1 values are only modified if they are different
+ // from the preceeding phase 2 values.
+
+ if (m_bPhase1)
+ {
+ // transition to phase2
+ m_bPhase1 = false;
+
+ // transfer phase1 variables to phase2
+ m_uStateP2 = m_uStateP1;
+ m_uDAR13To05P2 = m_uDAR13To05P1;
+ m_uDAR04To00P2 = m_uDAR04To00P1;
+ m_uCWARP2 = m_uCWARP1;
+ m_bStopP2 = m_bStopP1;
+ m_bVoicedP2 = m_bVoicedP1;
+ m_bSilenceP2 = m_bSilenceP1;
+ m_uLengthP2 = m_uLengthP1;
+ m_uXRepeatP2 = m_uXRepeatP1;
+ m_uDeltaOldP2 = m_uDeltaOldP1;
+
+ m_uOutputP2 = m_uOutputP1;
+ m_uRomAddrP2 = m_RomAddrP1;
+
+ // setup carries from phase 2 values
+ m_bDAR04To00CarryP2 = m_uDAR04To00P2 == 0x1F;
+ m_bPPQCarryP2 = m_bDAR04To00CarryP2 && ((m_uLengthP2&0x03) == 0x03); // pitch period quarter
+ m_bRepeatCarryP2 = m_bPPQCarryP2 && ((m_uLengthP2&0x0C) == 0x0C);
+ m_bLengthCarryP2 = m_bRepeatCarryP2 && ( m_uLengthP2 == 0x7F);
+
+ return true;
+ }
+ m_bPhase1 = true;
+
+ // logic done during phase 1
+ switch (m_uStateP1)
+ {
+ case IDLE:
+ m_uOutputP1 = 7;
+ if (m_bStart) m_uStateP1 = WORDWAIT;
+
+ if (m_bBusyP1 && !m_bsy_handler.isnull())
+ m_bsy_handler(0);
+ m_bBusyP1 = false;
+ break;
+
+ case WORDWAIT:
+ // the delta address register latches the word number into bits 03 to 08
+ // all other bits forced to 0. 04 to 08 makes a multiply by two.
+ m_uDAR13To05P1 = (m_uWord&0x3C)>>2;
+ m_uDAR04To00P1 = (m_uWord&0x03)<<3;
+ m_RomAddrP1 = (m_uDAR13To05P1<<3)|(m_uDAR04To00P1>>2); // remove lower two bits
+ m_uOutputP1 = 7;
+ if (m_bStart) m_uStateP1 = WORDWAIT;
+ else m_uStateP1 = CWARMSB;
+
+ if (!m_bBusyP1 && !m_bsy_handler.isnull())
+ m_bsy_handler(1);
+ m_bBusyP1 = true;
+ break;
+
+ case CWARMSB:
+ if (m_uPrintLevel >= 1)
+ printf("\n speaking word %02x",m_uWord);
+
+ // use uDAR to load uCWAR 8 msb
+ m_uCWARP1 = readmem(m_uRomAddrP2,m_bPhase1)<<4; // note use of rom address setup in previous state
+ // increment DAR by 4, 2 lsb's count deltas within a byte
+ m_uDAR04To00P1 += 4;
+ if (m_uDAR04To00P1 >= 32) m_uDAR04To00P1 = 0; // emulate 5 bit counter
+ m_RomAddrP1 = (m_uDAR13To05P1<<3)|(m_uDAR04To00P1>>2); // remove lower two bits
+
+ m_uOutputP1 = 7;
+ if (m_bStart) m_uStateP1 = WORDWAIT;
+ else m_uStateP1 = CWARLSB;
+ break;
+
+ case CWARLSB:
+ m_uCWARP1 = m_uCWARP2|(readmem(m_uRomAddrP2,m_bPhase1)>>4); // setup in previous state
+ m_RomAddrP1 = m_uCWARP1;
+
+ m_uOutputP1 = 7;
+ if (m_bStart) m_uStateP1 = WORDWAIT;
+ else m_uStateP1 = DARMSB;
+ break;
+
+ case DARMSB:
+ m_uDAR13To05P1 = readmem(m_uRomAddrP2,m_bPhase1)<<1; // 9 bit counter, 8 MSBs from ROM, lsb zeroed
+ m_uDAR04To00P1 = 0;
+ m_uCWARP1++;
+ m_RomAddrP1 = m_uCWARP1;
+ m_uNControlWords++; // statistics
+
+ m_uOutputP1 = 7;
+ if (m_bStart) m_uStateP1 = WORDWAIT;
+ else m_uStateP1 = CTRLBITS;
+ break;
+
+ case CTRLBITS:
+ m_bStopP1 = readmem(m_uRomAddrP2,m_bPhase1)&0x80? true: false;
+ m_bVoicedP1 = readmem(m_uRomAddrP2,m_bPhase1)&0x40? true: false;
+ m_bSilenceP1 = readmem(m_uRomAddrP2,m_bPhase1)&0x20? true: false;
+ m_uXRepeatP1 = readmem(m_uRomAddrP2,m_bPhase1)&0x03;
+ m_uLengthP1 =(readmem(m_uRomAddrP2,m_bPhase1)&0x1F)<<2; // includes external length and repeat
+ m_uDAR04To00P1 = 0;
+ m_uCWARP1++; // gets ready for next DARMSB
+ m_RomAddrP1 = (m_uDAR13To05P1<<3)|(m_uDAR04To00P1>>2); // remove lower two bits
+
+ m_uOutputP1 = 7;
+ if (m_bStart) m_uStateP1 = WORDWAIT;
+ else m_uStateP1 = PLAY;
+
+ if (m_uPrintLevel >= 2)
+ printf("\n cw %d %d %d %d %d",m_bStopP1,m_bVoicedP1,m_bSilenceP1,m_uLengthP1>>4,m_uXRepeatP1);
+
+ break;
+
+ case PLAY:
+ {
+ // statistics
+ if (m_bPPQCarryP2)
+ {
+ // pitch period end
+ if (m_uPrintLevel >= 3)
+ printf("\n ppe: RomAddr %03x",m_uRomAddrP2);
+
+ m_uNPitchPeriods++;
+ if (m_bVoicedP2) m_uNVoiced++;
+ }
+ // end statistics
+
+ // modify output
+ UINT8 uDeltaP2; // signal line
+ UINT8 uIncrementP2; // signal lines
+ bool bAddP2; // signal line
+ uDeltaP2 = Mux8To2(m_bVoicedP2,
+ m_uLengthP2 & 0x03, // pitch period quater counter
+ m_uDAR04To00P2 & 0x03, // two bit delta address within byte
+ readmem(m_uRomAddrP2,m_bPhase1)
+ );
+ CalculateIncrement(m_bVoicedP2,
+ m_uLengthP2 & 0x03, // pitch period quater counter
+ m_uDAR04To00P2 == 0, // pitch period quarter start
+ uDeltaP2,
+ m_uDeltaOldP2, // input
+ m_uDeltaOldP1, // output
+ uIncrementP2, // output 0, 1, or 3
+ bAddP2 // output
+ );
+ m_uOutputP1 = CalculateOutput(m_bVoicedP2,
+ m_bSilenceP2,
+ m_uLengthP2 & 0x03, // pitch period quater counter
+ m_uDAR04To00P2 == 0, // pitch period quarter start
+ m_uOutputP2, // last output
+ uIncrementP2,
+ bAddP2
+ );
+
+ // advance counters
+ m_uDAR04To00P1++;
+ if (m_bDAR04To00CarryP2) // pitch period quarter end
+ {
+ m_uDAR04To00P1 = 0; // emulate 5 bit counter
+
+ m_uLengthP1++; // lower two bits of length count quarter pitch periods
+ if (m_uLengthP1 >= 0x80)
+ {
+ m_uLengthP1 = 0; // emulate 7 bit counter
+ }
+ }
+
+ if (m_bVoicedP2 && m_bRepeatCarryP2) // repeat complete
+ {
+ m_uLengthP1 &= 0x70; // keep current "length"
+ m_uLengthP1 |= (m_uXRepeatP1<<2); // load repeat from external repeat
+ m_uDAR13To05P1++; // advances ROM address 8 bytes
+ if (m_uDAR13To05P1 >= 0x200) m_uDAR13To05P1 = 0; // emulate 9 bit counter
+ }
+ if (!m_bVoicedP2 && m_bDAR04To00CarryP2)
+ {
+ // unvoiced advances each quarter pitch period
+ // note repeat counter not reloaded for non voiced speech
+ m_uDAR13To05P1++; // advances ROM address 8 bytes
+ if (m_uDAR13To05P1 >= 0x200) m_uDAR13To05P1 = 0; // emulate 9 bit counter
+ }
+
+ // construct m_RomAddrP1
+ m_RomAddrP1 = m_uDAR04To00P1;
+ if (m_bVoicedP2 && m_uLengthP1&0x1) // mirroring
+ {
+ m_RomAddrP1 ^= 0x1f; // count backwards
+ }
+ m_RomAddrP1 = (m_uDAR13To05P1<<3) | m_RomAddrP1>>2;
+
+ // next state
+ if (m_bStart) m_uStateP1 = WORDWAIT;
+ else if (m_bStopP2 && m_bLengthCarryP2) m_uStateP1 = DELAY;
+ else if (m_bLengthCarryP2)
+ {
+ m_uStateP1 = DARMSB;
+ m_RomAddrP1 = m_uCWARP1; // output correct address
+ }
+ else m_uStateP1 = PLAY;
+ break;
+ }
+
+ case DELAY:
+ m_uOutputP1 = 7;
+ if (m_bStart) m_uStateP1 = WORDWAIT;
+ else m_uStateP1 = IDLE;
+ break;
+ }
+
+ return true;
+}
+
+UINT8 s14001a_device::Mux8To2(bool bVoicedP2, UINT8 uPPQtrP2, UINT8 uDeltaAdrP2, UINT8 uRomDataP2)
{
+ // pick two bits of rom data as delta
+
+ if (bVoicedP2 && uPPQtrP2&0x01) // mirroring
+ {
+ uDeltaAdrP2 ^= 0x03; // count backwards
+ }
+ // emulate 8 to 2 mux to obtain delta from byte (bigendian)
+ switch (uDeltaAdrP2)
+ {
+ case 0x00:
+ return (uRomDataP2&0xC0)>>6;
+ case 0x01:
+ return (uRomDataP2&0x30)>>4;
+ case 0x02:
+ return (uRomDataP2&0x0C)>>2;
+ case 0x03:
+ return (uRomDataP2&0x03)>>0;
+ }
+ return 0xFF;
}
-//-------------------------------------------------
-// device_start - device-specific startup
-//-------------------------------------------------
+void s14001a_device::CalculateIncrement(bool bVoicedP2, UINT8 uPPQtrP2, bool bPPQStartP2, UINT8 uDelta, UINT8 uDeltaOldP2, UINT8 &uDeltaOldP1, UINT8 &uIncrementP2, bool &bAddP2)
+{
+ // uPPQtr, pitch period quarter counter; 2 lsb of uLength
+ // bPPStart, start of a pitch period
+ // implemented to mimic silicon (a bit)
-void s14001a_device::device_start()
+ // beginning of a pitch period
+ if (uPPQtrP2 == 0x00 && bPPQStartP2) // note this is done for voiced and unvoiced
+ {
+ uDeltaOldP2 = 0x02;
+ }
+ static const UINT8 uIncrements[4][4] =
+ {
+ // 00 01 10 11
+ { 3, 3, 1, 1,}, // 00
+ { 1, 1, 0, 0,}, // 01
+ { 0, 0, 1, 1,}, // 10
+ { 1, 1, 3, 3 }, // 11
+ };
+
+#define MIRROR (uPPQtrP2&0x01)
+
+ // calculate increment from delta, always done even if silent to update uDeltaOld
+ // in silicon a PLA determined 0,1,3 and add/subtract and passed uDelta to uDeltaOld
+ if (!bVoicedP2 || !MIRROR)
+ {
+ uIncrementP2 = uIncrements[uDelta][uDeltaOldP2];
+ bAddP2 = uDelta >= 0x02;
+ }
+ else
+ {
+ uIncrementP2 = uIncrements[uDeltaOldP2][uDelta];
+ bAddP2 = uDeltaOldP2 < 0x02;
+ }
+ uDeltaOldP1 = uDelta;
+ if (bVoicedP2 && bPPQStartP2 && MIRROR) uIncrementP2 = 0; // no change when first starting mirroring
+}
+
+UINT8 s14001a_device::CalculateOutput(bool bVoiced, bool bXSilence, UINT8 uPPQtr, bool bPPQStart, UINT8 uLOutput, UINT8 uIncrementP2, bool bAddP2)
{
- int i;
+ // implemented to mimic silicon (a bit)
+ // limits output to 0x00 and 0x0f
+ UINT8 uTmp; // used for subtraction
+
+#define SILENCE (uPPQtr&0x02)
- m_GlobalSilenceState = 1;
- m_OldDelta = 0x02;
- m_DACOutput = SILENCE;
+ // determine output
+ if (bXSilence || (bVoiced && SILENCE)) return 7;
- for (i = 0; i < 8; i++)
+ // beginning of a pitch period
+ if (uPPQtr == 0x00 && bPPQStart) // note this is done for voiced and nonvoiced
{
- m_filtervals[i] = SILENCE;
+ uLOutput = 7;
}
- m_stream = machine().sound().stream_alloc(*this, 0, 1, clock() ? clock() : machine().sample_rate());
+ // adder
+ uTmp = uLOutput;
+ if (!bAddP2) uTmp ^= 0x0F; // turns subtraction into addition
- save_item(NAME(m_WordInput));
- save_item(NAME(m_LatchedWord));
- save_item(NAME(m_SyllableAddress));
- save_item(NAME(m_PhoneAddress));
- save_item(NAME(m_PlayParams));
- save_item(NAME(m_PhoneOffset));
- save_item(NAME(m_LengthCounter));
- save_item(NAME(m_RepeatCounter));
- save_item(NAME(m_OutputCounter));
- save_item(NAME(m_machineState));
- save_item(NAME(m_nextstate));
- save_item(NAME(m_laststate));
- save_item(NAME(m_resetState));
- save_item(NAME(m_oddeven));
- save_item(NAME(m_GlobalSilenceState));
- save_item(NAME(m_OldDelta));
- save_item(NAME(m_DACOutput));
- save_item(NAME(m_audioout));
- save_item(NAME(m_filtervals));
- save_item(NAME(m_VSU1000_amp));
-}
+ // add 0, 1, 3; limit at 15
+ uTmp += uIncrementP2;
+ if (uTmp > 15) uTmp = 15;
-//-------------------------------------------------
-// sound_stream_update - handle a stream update
-//-------------------------------------------------
+ if (!bAddP2) uTmp ^= 0x0F; // turns addition back to subtraction
+ return uTmp;
+}
-void s14001a_device::sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples)
+void s14001a_device::ClearStatistics()
{
- int i;
+ m_uNPitchPeriods = 0;
+ m_uNVoiced = 0;
+ m_uPrintLevel = 0;
+ m_uNControlWords = 0;
+}
- for (i = 0; i < samples; i++)
- {
- s14001a_clock();
- #ifdef ACCURATE_SQUEAL
- if (m_audioout == ALTFLAG) // input from test pins -> output
- {
- shiftIntoFilter(chip, audiofilter(chip)); // shift over the previous outputs and stick in audioout.
- outputs[0][i] = audiofilter(chip)*m_VSU1000_amp;
- }
- else // normal, dac-driven output
- {
- shiftIntoFilter(chip, ((((INT16)m_audioout)-8)<<9)); // shift over the previous outputs and stick in audioout 4 times. note <<9 instead of <<10, to prevent clipping, and to simulate that the filtered output normally has a somewhat lower amplitude than the driven one.
- #endif
- outputs[0][i] = ((((INT16)m_audioout)-8)<<10)*m_VSU1000_amp;
- #ifdef ACCURATE_SQUEAL
- }
- #endif
- }
+void s14001a_device::GetStatistics(UINT32 &uNPitchPeriods, UINT32 &uNVoiced, UINT32 uNControlWords)
+{
+ uNPitchPeriods = m_uNPitchPeriods;
+ uNVoiced = m_uNVoiced;
+ uNControlWords = m_uNControlWords;
}
diff --git a/src/devices/sound/s14001a.h b/src/devices/sound/s14001a.h
index 86131138697..97025b8c3c1 100644
--- a/src/devices/sound/s14001a.h
+++ b/src/devices/sound/s14001a.h
@@ -1,26 +1,38 @@
-// license:LGPL-2.1+
-// copyright-holders:Jonathan Gevaryahu,R. Belmont,Zsolt Vasvari
-#pragma once
+// license:BSD-3-Clause
+// copyright-holders:Ed Bernard, Jonathan Gevaryahu, hap
+// thanks-to:Kevin Horton
/*
- Copyright (C) 2006-2013 Jonathan Gevaryahu AKA Lord Nightmare
-
+ SSi TSI S14001A speech IC emulator
*/
+
#ifndef __S14001A_H__
#define __S14001A_H__
+#define MCFG_S14001A_BSY_HANDLER(_devcb) \
+ devcb = &s14001a_device::set_bsy_handler(*device, DEVCB_##_devcb);
+
+#define MCFG_S14001A_EXT_READ_HANDLER(_devcb) \
+ devcb = &s14001a_device::set_ext_read_handler(*device, DEVCB_##_devcb);
+
class s14001a_device : public device_t,
- public device_sound_interface
+ public device_sound_interface
{
public:
s14001a_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
~s14001a_device() {}
- int bsy_r(); /* read BUSY pin */
- void reg_w(int data); /* write to input latch */
- void rst_w(int data); /* write to RESET pin */
- void set_clock(int clock); /* set VSU-1000 clock */
- void set_volume(int volume); /* set VSU-1000 volume control */
+ // static configuration helpers
+ template<class _Object> static devcb_base &set_bsy_handler(device_t &device, _Object object) { return downcast<s14001a_device &>(device).m_bsy_handler.set_callback(object); }
+ template<class _Object> static devcb_base &set_ext_read_handler(device_t &device, _Object object) { return downcast<s14001a_device &>(device).m_ext_read_handler.set_callback(object); }
+
+ DECLARE_READ_LINE_MEMBER(busy_r); // /BUSY (pin 40)
+ DECLARE_READ_LINE_MEMBER(romen_r); // ROM /EN (pin 9)
+ DECLARE_WRITE_LINE_MEMBER(start_w); // START (pin 10)
+ DECLARE_WRITE8_MEMBER(data_w); // 6-bit word
+
+ void set_clock(UINT32 clock); // set new CLK frequency
+ void force_update(); // update stream, eg. before external ROM bankswitch
protected:
// device-level overrides
@@ -30,35 +42,94 @@ protected:
virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) override;
private:
- // internal state
required_region_ptr<UINT8> m_SpeechRom;
sound_stream * m_stream;
- UINT8 m_WordInput; // value on word input bus
- UINT8 m_LatchedWord; // value latched from input bus
- UINT16 m_SyllableAddress; // address read from word table
- UINT16 m_PhoneAddress; // starting/current phone address from syllable table
- UINT8 m_PlayParams; // playback parameters from syllable table
- UINT8 m_PhoneOffset; // offset within phone
- UINT8 m_LengthCounter; // 4-bit counter which holds the inverted length of the word in phones, leftshifted by 1
- UINT8 m_RepeatCounter; // 3-bit counter which holds the inverted number of repeats per phone, leftshifted by 1
- UINT8 m_OutputCounter; // 2-bit counter to determine forward/backward and output/silence state.
- UINT8 m_machineState; // chip state machine state
- UINT8 m_nextstate; // chip state machine's new state
- UINT8 m_laststate; // chip state machine's previous state, needed for mirror increment masking
- UINT8 m_resetState; // reset line state
- UINT8 m_oddeven; // odd versus even cycle toggle
- UINT8 m_GlobalSilenceState; // same as above but for silent syllables instead of silent portions of mirrored syllables
- UINT8 m_OldDelta; // 2-bit old delta value
- UINT8 m_DACOutput; // 4-bit DAC Accumulator/output
- UINT8 m_audioout; // filtered audio output
- INT16 m_filtervals[8];
- UINT8 m_VSU1000_amp; // amplitude setting on VSU-1000 board
-
- INT16 audiofilter();
- void shiftIntoFilter(INT16 inputvalue);
- void PostPhoneme();
- void s14001a_clock();
+ devcb_write_line m_bsy_handler;
+ devcb_read8 m_ext_read_handler;
+
+ UINT8 readmem(UINT16 offset, bool phase);
+ bool Clock(); // called once to toggle external clock twice
+
+ // emulator helper functions
+ UINT8 Mux8To2(bool bVoicedP2, UINT8 uPPQtrP2, UINT8 uDeltaAdrP2, UINT8 uRomDataP2);
+ void CalculateIncrement(bool bVoicedP2, UINT8 uPPQtrP2, bool bPPQStartP2, UINT8 uDeltaP2, UINT8 uDeltaOldP2, UINT8 &uDeltaOldP1, UINT8 &uIncrementP2, bool &bAddP2);
+ UINT8 CalculateOutput(bool bVoicedP2, bool bXSilenceP2, UINT8 uPPQtrP2, bool bPPQStartP2, UINT8 uLOutputP2, UINT8 uIncrementP2, bool bAddP2);
+ void ClearStatistics();
+ void GetStatistics(UINT32 &uNPitchPeriods, UINT32 &uNVoiced, UINT32 uNControlWords);
+ void SetPrintLevel(UINT32 uPrintLevel) { m_uPrintLevel = uPrintLevel; }
+
+ // internal state
+ bool m_bPhase1; // 1 bit internal clock
+
+ enum states
+ {
+ IDLE = 0,
+ WORDWAIT,
+ CWARMSB, // read 8 CWAR MSBs
+ CWARLSB, // read 4 CWAR LSBs from rom d7-d4
+ DARMSB, // read 8 DAR MSBs
+ CTRLBITS, // read Stop, Voiced, Silence, Length, XRepeat
+ PLAY,
+ DELAY
+ };
+
+ // registers
+ states m_uStateP1; // 3 bits
+ states m_uStateP2;
+
+ UINT16 m_uDAR13To05P1; // 9 MSBs of delta address register
+ UINT16 m_uDAR13To05P2; // incrementing uDAR05To13 advances ROM address by 8 bytes
+
+ UINT16 m_uDAR04To00P1; // 5 LSBs of delta address register
+ UINT16 m_uDAR04To00P2; // 3 address ROM, 2 mux 8 bits of data into 2 bit delta
+ // carry indicates end of quarter pitch period (32 cycles)
+
+ UINT16 m_uCWARP1; // 12 bits Control Word Address Register (syllable)
+ UINT16 m_uCWARP2;
+
+ bool m_bStopP1;
+ bool m_bStopP2;
+ bool m_bVoicedP1;
+ bool m_bVoicedP2;
+ bool m_bSilenceP1;
+ bool m_bSilenceP2;
+ UINT8 m_uLengthP1; // 7 bits, upper three loaded from ROM length
+ UINT8 m_uLengthP2; // middle two loaded from ROM repeat and/or uXRepeat
+ // bit 0 indicates mirror in voiced mode
+ // bit 1 indicates internal silence in voiced mode
+ // incremented each pitch period quarter
+
+ UINT8 m_uXRepeatP1; // 2 bits, loaded from ROM repeat
+ UINT8 m_uXRepeatP2;
+ UINT8 m_uDeltaOldP1; // 2 bit old delta
+ UINT8 m_uDeltaOldP2;
+ UINT8 m_uOutputP1; // 4 bits audio output, calculated during phase 1
+
+ // derived signals
+ bool m_bDAR04To00CarryP2;
+ bool m_bPPQCarryP2;
+ bool m_bRepeatCarryP2;
+ bool m_bLengthCarryP2;
+ UINT16 m_RomAddrP1; // rom address
+
+ // output pins
+ UINT8 m_uOutputP2; // output changes on phase2
+ UINT16 m_uRomAddrP2; // address pins change on phase 2
+ bool m_bBusyP1; // busy changes on phase 1
+
+ // input pins
+ bool m_bStart;
+ UINT8 m_uWord; // 6 bit word noumber to be spoken
+
+ // emulator variables
+ // statistics
+ UINT32 m_uNPitchPeriods;
+ UINT32 m_uNVoiced;
+ UINT32 m_uNControlWords;
+
+ // diagnostic output
+ UINT32 m_uPrintLevel;
};
extern const device_type S14001A;
diff --git a/src/devices/sound/saa1099.cpp b/src/devices/sound/saa1099.cpp
index f1986196ddf..22ec858a36c 100644
--- a/src/devices/sound/saa1099.cpp
+++ b/src/devices/sound/saa1099.cpp
@@ -63,13 +63,6 @@
0x1c | ---- ---x | All channels enable (0 = off, 1 = on)
0x1c | ---- --x- | Synch & Reset generators
- Version History:
- ================
- ??-??-200? - First version of the driver submitted for MESS (GPL/MESS license)
- ??-??-200? - Submitted to DOSBOX for Creative Music System/Game Blaster emulation
- ??-??-201? - Driver relicensed to BSD 3 Clause (GPL+ compatible)
- 06-27-2015 - Applied clock divisor fix from DOSBOX SVN, http://www.vogons.org/viewtopic.php?p=344227#p344227
-
***************************************************************************/
#include "emu.h"
diff --git a/src/devices/sound/scsp.cpp b/src/devices/sound/scsp.cpp
index 10868deb158..1acf90f2c22 100644
--- a/src/devices/sound/scsp.cpp
+++ b/src/devices/sound/scsp.cpp
@@ -502,25 +502,28 @@ void scsp_device::init()
SCSPDSP_Init(&m_DSP);
m_IrqTimA = m_IrqTimBC = m_IrqMidi = 0;
- m_MidiR=m_MidiW=0;
- m_MidiOutR=m_MidiOutW=0;
+ m_MidiR=m_MidiW = 0;
+ m_MidiOutR = m_MidiOutW = 0;
// get SCSP RAM
if (strcmp(tag(), ":scsp") == 0 || strcmp(tag(), ":scsp1") == 0)
{
- m_Master=1;
+ m_Master = 1;
}
else
{
- m_Master=0;
+ m_Master = 0;
}
- m_SCSPRAM = region()->base();
- if (m_SCSPRAM)
+ memory_region* ram_region = memregion(tag());
+
+ // coolridr.c defines a region for the RAM, stv.c doesn't (uses set_ram_base instead, which seems to be more correct anyway?)
+ if (ram_region != NULL)
{
- m_SCSPRAM_LENGTH = region()->bytes();
+ m_SCSPRAM = ram_region->base();
+ m_SCSPRAM_LENGTH = ram_region->bytes();
m_DSP.SCSPRAM = (UINT16 *)m_SCSPRAM;
- m_DSP.SCSPRAM_LENGTH = m_SCSPRAM_LENGTH/2;
+ m_DSP.SCSPRAM_LENGTH = m_SCSPRAM_LENGTH / 2;
m_SCSPRAM += m_roffset;
}
@@ -540,10 +543,10 @@ void scsp_device::init()
int iTL =(i>>0x0)&0xff;
int iPAN=(i>>0x8)&0x1f;
int iSDL=(i>>0xD)&0x07;
- float TL=1.0f;
+ float TL;
float SegaDB=0.0f;
- float fSDL=1.0f;
- float PAN=1.0f;
+ float fSDL;
+ float PAN;
float LPAN,RPAN;
if(iTL&0x01) SegaDB-=0.4f;
@@ -617,8 +620,8 @@ void scsp_device::init()
}
LFO_Init();
- m_buffertmpl=auto_alloc_array_clear(machine(), signed int, 44100);
- m_buffertmpr=auto_alloc_array_clear(machine(), signed int, 44100);
+ m_buffertmpl=make_unique_clear<INT32[]>(44100);
+ m_buffertmpr=make_unique_clear<INT32[]>(44100);
// no "pend"
m_udata.data[0x20/2] = 0;
diff --git a/src/devices/sound/scsp.h b/src/devices/sound/scsp.h
index d2242958ff5..d96fd53a3c8 100644
--- a/src/devices/sound/scsp.h
+++ b/src/devices/sound/scsp.h
@@ -45,7 +45,7 @@ struct SCSP_EG_t
struct SCSP_LFO_t
{
- unsigned short phase;
+ UINT16 phase;
UINT32 phase_step;
int *table;
int *scale;
@@ -69,7 +69,7 @@ struct SCSP_SLOT
SCSP_LFO_t PLFO; //Phase LFO
SCSP_LFO_t ALFO; //Amplitude LFO
int slot;
- signed short Prev; //Previous sample (for interpolation)
+ INT16 Prev; //Previous sample (for interpolation)
};
@@ -112,18 +112,19 @@ private:
} m_udata;
SCSP_SLOT m_Slots[32];
- signed short m_RINGBUF[128];
- unsigned char m_BUFPTR;
+ INT16 m_RINGBUF[128];
+ UINT8 m_BUFPTR;
#if FM_DELAY
- signed short m_DELAYBUF[FM_DELAY];
- unsigned char m_DELAYPTR;
+ INT16 m_DELAYBUF[FM_DELAY];
+ UINT8 m_DELAYPTR;
#endif
- unsigned char *m_SCSPRAM;
+ UINT8 *m_SCSPRAM;
UINT32 m_SCSPRAM_LENGTH;
char m_Master;
sound_stream * m_stream;
- INT32 *m_buffertmpl,*m_buffertmpr;
+ std::unique_ptr<INT32[]> m_buffertmpl;
+ std::unique_ptr<INT32[]> m_buffertmpr;
UINT32 m_IrqTimA;
UINT32 m_IrqTimBC;
@@ -166,7 +167,7 @@ private:
int m_length;
- signed short *m_RBUFDST; //this points to where the sample will be stored in the RingBuf
+ INT16 *m_RBUFDST; //this points to where the sample will be stored in the RingBuf
//LFO
int m_PLFO_TRI[256], m_PLFO_SQR[256], m_PLFO_SAW[256], m_PLFO_NOI[256];
@@ -175,7 +176,7 @@ private:
int m_ASCALES[8][256];
void exec_dma(address_space &space); /*state DMA transfer function*/
- unsigned char DecodeSCI(unsigned char irq);
+ UINT8 DecodeSCI(UINT8 irq);
void CheckPendingIRQ();
void MainCheckPendingIRQ(UINT16 irq_type);
void ResetInterrupts();
@@ -190,22 +191,22 @@ private:
UINT32 Step(SCSP_SLOT *slot);
void Compute_LFO(SCSP_SLOT *slot);
void StartSlot(SCSP_SLOT *slot);
- void StopSlot(SCSP_SLOT *slot,int keyoff);
+ void StopSlot(SCSP_SLOT *slot, int keyoff);
void init();
- void UpdateSlotReg(int s,int r);
+ void UpdateSlotReg(int s, int r);
void UpdateReg(address_space &space, int reg);
- void UpdateSlotRegR(int slot,int reg);
+ void UpdateSlotRegR(int slot, int reg);
void UpdateRegR(address_space &space, int reg);
- void w16(address_space &space,unsigned int addr,unsigned short val);
- unsigned short r16(address_space &space, unsigned int addr);
+ void w16(address_space &space, UINT32 addr, UINT16 val);
+ UINT16 r16(address_space &space, UINT32 addr);
inline INT32 UpdateSlot(SCSP_SLOT *slot);
void DoMasterSamples(int nsamples);
//LFO
void LFO_Init();
- signed int PLFO_Step(SCSP_LFO_t *LFO);
- signed int ALFO_Step(SCSP_LFO_t *LFO);
- void LFO_ComputeStep(SCSP_LFO_t *LFO,UINT32 LFOF,UINT32 LFOWS,UINT32 LFOS,int ALFO);
+ INT32 PLFO_Step(SCSP_LFO_t *LFO);
+ INT32 ALFO_Step(SCSP_LFO_t *LFO);
+ void LFO_ComputeStep(SCSP_LFO_t *LFO, UINT32 LFOF, UINT32 LFOWS, UINT32 LFOS, int ALFO);
};
extern const device_type SCSP;
diff --git a/src/devices/sound/scspdsp.cpp b/src/devices/sound/scspdsp.cpp
index 75b30cfe85a..9989e48b08a 100644
--- a/src/devices/sound/scspdsp.cpp
+++ b/src/devices/sound/scspdsp.cpp
@@ -65,14 +65,14 @@ void SCSPDSP_Step(SCSPDSP *DSP)
{
INT32 ACC=0; //26 bit
INT32 SHIFTED=0; //24 bit
- INT32 X=0; //24 bit
+ INT32 X; //24 bit
INT32 Y=0; //13 bit
- INT32 B=0; //26 bit
- INT32 INPUTS=0; //24 bit
+ INT32 B; //26 bit
+ INT32 INPUTS; //24 bit
INT32 MEMVAL=0;
INT32 FRC_REG=0; //13 bit
INT32 Y_REG=0; //24 bit
- UINT32 ADDR=0;
+ UINT32 ADDR;
UINT32 ADRS_REG=0; //13 bit
int step;
diff --git a/src/devices/sound/segapcm.cpp b/src/devices/sound/segapcm.cpp
index 8e92167c708..555ee019b16 100644
--- a/src/devices/sound/segapcm.cpp
+++ b/src/devices/sound/segapcm.cpp
@@ -37,16 +37,16 @@ void segapcm_device::device_start()
{
int mask, rom_mask;
- m_ram = auto_alloc_array(machine(), UINT8, 0x800);
+ m_ram = std::make_unique<UINT8[]>(0x800);
- memset(m_ram, 0xff, 0x800);
+ memset(m_ram.get(), 0xff, 0x800);
m_bankshift = (UINT8) m_bank;
mask = m_bank >> 16;
if (!mask)
mask = BANK_MASK7 >> 16;
- for(rom_mask = 1; rom_mask < m_rom.length(); rom_mask *= 2);
+ for(rom_mask = 1; rom_mask < m_rom.length(); rom_mask *= 2) { };
rom_mask--;
m_bankmask = mask & (rom_mask >> m_bankshift);
@@ -54,7 +54,7 @@ void segapcm_device::device_start()
m_stream = stream_alloc(0, 2, clock() / 128);
save_item(NAME(m_low));
- save_pointer(NAME(m_ram), 0x800);
+ save_pointer(NAME(m_ram.get()), 0x800);
}
@@ -92,7 +92,7 @@ void segapcm_device::sound_stream_update(sound_stream &stream, stream_sample_t *
/* loop over channels */
for (int ch = 0; ch < 16; ch++)
{
- UINT8 *regs = m_ram+8*ch;
+ UINT8 *regs = m_ram.get()+8*ch;
/* only process active channels */
if (!(regs[0x86]&1))
@@ -106,7 +106,7 @@ void segapcm_device::sound_stream_update(sound_stream &stream, stream_sample_t *
/* loop over samples on this channel */
for (i = 0; i < samples; i++)
{
- INT8 v = 0;
+ INT8 v;
/* handle looping if we've hit the end */
if ((addr >> 16) == end)
diff --git a/src/devices/sound/segapcm.h b/src/devices/sound/segapcm.h
index a56a9062688..48474134b46 100644
--- a/src/devices/sound/segapcm.h
+++ b/src/devices/sound/segapcm.h
@@ -56,7 +56,7 @@ protected:
private:
required_region_ptr<UINT8> m_rom;
- UINT8* m_ram;
+ std::unique_ptr<UINT8[]> m_ram;
UINT8 m_low[16];
int m_bank;
int m_bankshift;
diff --git a/src/devices/sound/sid.cpp b/src/devices/sound/sid.cpp
index d040702eeae..a2a406c13d6 100644
--- a/src/devices/sound/sid.cpp
+++ b/src/devices/sound/sid.cpp
@@ -19,8 +19,8 @@
#include "sidenvel.h"
#include "sid.h"
-static float *filterTable;
-static float *bandPassParam;
+static std::unique_ptr<float[]> filterTable;
+static std::unique_ptr<float[]> bandPassParam;
#define lowPassParam filterTable
static float filterResTable[16];
@@ -168,8 +168,8 @@ static void filterTableInit(running_machine &machine)
float resDyMin;
float resDy;
- filterTable = auto_alloc_array(machine, float, 0x800);
- bandPassParam = auto_alloc_array(machine, float, 0x800);
+ filterTable = std::make_unique<float[]>(0x800);
+ bandPassParam = std::make_unique<float[]>(0x800);
uk = 0;
for ( rk = 0; rk < 0x800; rk++ )
diff --git a/src/devices/sound/sidvoice.cpp b/src/devices/sound/sidvoice.cpp
index 3104f69d680..33f4039891a 100644
--- a/src/devices/sound/sidvoice.cpp
+++ b/src/devices/sound/sidvoice.cpp
@@ -23,7 +23,7 @@ static const UINT8* waveform70;
static UINT8 noiseTableLSB[1<<8];
#endif
-static INT8* ampMod1x8;
+static std::unique_ptr<INT8[]> ampMod1x8;
static const UINT32 noiseSeed = 0x7ffff8;
@@ -35,7 +35,7 @@ void sidInitMixerEngine(running_machine &machine)
/* 8-bit volume modulation tables. */
float filterAmpl = 0.7f;
- ampMod1x8=auto_alloc_array(machine, INT8, 256*256);
+ ampMod1x8=std::make_unique<INT8[]>(256*256);
uk = 0;
for ( si = 0; si < 256; si++ )
diff --git a/src/devices/sound/sn76477.cpp b/src/devices/sound/sn76477.cpp
index bc89db04447..e1fe3f4d3fc 100644
--- a/src/devices/sound/sn76477.cpp
+++ b/src/devices/sound/sn76477.cpp
@@ -1,5 +1,6 @@
// license:BSD-3-Clause
// copyright-holders:Zsolt Vasvari
+// thanks-to:Derrick Renaud
/*****************************************************************************
Texas Instruments SN76477 emulator
@@ -15,6 +16,9 @@
application at http://zunzun.com to come up with the functions.
Known issues/to-do's:
+ * Use RES_INF for unconnected resistor pins and treat 0 as a short
+ circuit
+
* VCO
* confirm value of VCO_MAX_EXT_VOLTAGE, VCO_TO_SLF_VOLTAGE_DIFF
VCO_CAP_VOLTAGE_MIN and VCO_CAP_VOLTAGE_MAX
@@ -22,11 +26,15 @@
* get real formulas for VCO cap charging and discharging
* get real formula for VCO duty cycle
* what happens if no vco_res
- * what happens if no vco_cap
+ * what happens if no vco_cap (needed for laserbat/lazarian)
* Attack/Decay
* get real formulas for a/d cap charging and discharging
+ * Output
+ * what happens if output is taken at pin 12 with no feedback_res
+ (needed for laserbat/lazarian)
+
*****************************************************************************/
#include "emu.h"
@@ -68,27 +76,10 @@
#define LOG(n,x) do { if (VERBOSE >= (n)) logerror x; } while (0)
-#define CHECK_CHIP_NUM assert(this != NULL)
-#define CHECK_CHIP_NUM_AND_BOOLEAN CHECK_CHIP_NUM; assert((state & 0x01) == state)
-#define CHECK_CHIP_NUM_AND_POSITIVE CHECK_CHIP_NUM; assert(data >= 0.0)
-#define CHECK_CHIP_NUM_AND_VOLTAGE CHECK_CHIP_NUM; assert((data >= 0.0) && (data <= 5.0))
-#define CHECK_CHIP_NUM_AND_CAP_VOLTAGE CHECK_CHIP_NUM; assert(((data >= 0.0) && (data <= 5.0)) || (data == SN76477_EXTERNAL_VOLTAGE_DISCONNECT))
-
-
-
-/*****************************************************************************
- *
- * Test Mode
- *
- * in test mode, calls by the driver to
- * the input setter functions are ignored.
- * Interface values can be set in device_start
- * to any desired test value.
- * Use the space bar to enable/disable the chip.
- *
- *****************************************************************************/
-
-#define TEST_MODE 0
+#define CHECK_BOOLEAN assert((state & 0x01) == state)
+#define CHECK_POSITIVE assert(data >= 0.0)
+#define CHECK_VOLTAGE assert((data >= 0.0) && (data <= 5.0))
+#define CHECK_CAP_VOLTAGE assert(((data >= 0.0) && (data <= 5.0)) || (data == SN76477_EXTERNAL_VOLTAGE_DISCONNECT))
/*****************************************************************************
*
@@ -158,28 +149,28 @@ sn76477_device::sn76477_device(const machine_config &mconfig, const char *tag, d
m_envelope_mode(0),
m_vco_mode(0),
m_mixer_mode(0),
- m_one_shot_res(0),
+ m_one_shot_res(RES_INF),
m_one_shot_cap(0),
m_one_shot_cap_voltage_ext(0),
- m_slf_res(0),
+ m_slf_res(RES_INF),
m_slf_cap(0),
m_slf_cap_voltage_ext(0),
m_vco_voltage(0),
- m_vco_res(0),
+ m_vco_res(RES_INF),
m_vco_cap(0),
m_vco_cap_voltage_ext(0),
- m_noise_clock_res(0),
+ m_noise_clock_res(RES_INF),
m_noise_clock_ext(0),
m_noise_clock(0),
- m_noise_filter_res(0),
+ m_noise_filter_res(RES_INF),
m_noise_filter_cap(0),
m_noise_filter_cap_voltage_ext(0),
- m_attack_res(0),
- m_decay_res(0),
+ m_attack_res(RES_INF),
+ m_decay_res(RES_INF),
m_attack_decay_cap(0),
m_attack_decay_cap_voltage_ext(0),
- m_amplitude_res(0),
- m_feedback_res(0),
+ m_amplitude_res(RES_INF),
+ m_feedback_res(RES_INF),
m_pitch_voltage(0),
m_one_shot_cap_voltage(0),
m_one_shot_running_ff(0),
@@ -225,11 +216,11 @@ void sn76477_device::device_start()
intialize_noise();
// set up mixer and envelope modes, based on interface values
- _SN76477_mixer_a_w(m_mixer_a);
- _SN76477_mixer_b_w(m_mixer_b);
- _SN76477_mixer_c_w(m_mixer_c);
- _SN76477_envelope_1_w(m_envelope_1);
- _SN76477_envelope_2_w(m_envelope_2);
+ mixer_a_w(m_mixer_a);
+ mixer_b_w(m_mixer_b);
+ mixer_c_w(m_mixer_c);
+ envelope_1_w(m_envelope_1);
+ envelope_2_w(m_envelope_2);
m_one_shot_cap_voltage = ONE_SHOT_CAP_VOLTAGE_MIN;
m_slf_cap_voltage = SLF_CAP_VOLTAGE_MIN;
@@ -958,45 +949,31 @@ inline UINT32 sn76477_device::generate_next_real_noise_bit()
*
*****************************************************************************/
-void sn76477_device::_SN76477_enable_w(UINT32 data)
+WRITE_LINE_MEMBER(sn76477_device::enable_w)
{
- m_enable = data;
+ CHECK_BOOLEAN;
- /* if falling edge */
- if (!m_enable)
+ if (state != m_enable)
{
- /* start the attack phase */
- m_attack_decay_cap_voltage = AD_CAP_VOLTAGE_MIN;
-
- /* one-shot runs regardless of envelope mode */
- m_one_shot_running_ff = 1;
- }
-}
+ m_channel->update();
+ m_enable = state;
-void sn76477_device::SN76477_test_enable_w(UINT32 data)
-{
- if (data != m_enable)
- {
- m_channel->update();
+ /* if falling edge */
+ if (!m_enable)
+ {
+ /* start the attack phase */
+ m_attack_decay_cap_voltage = AD_CAP_VOLTAGE_MIN;
- _SN76477_enable_w(data);
+ /* one-shot runs regardless of envelope mode */
+ m_one_shot_running_ff = 1;
+ }
log_enable_line();
}
}
-WRITE_LINE_MEMBER( sn76477_device::enable_w )
-{
-#if TEST_MODE == 0
- CHECK_CHIP_NUM_AND_BOOLEAN;
-
- SN76477_test_enable_w(state);
-#endif
-}
-
-
/*****************************************************************************
*
@@ -1004,219 +981,142 @@ WRITE_LINE_MEMBER( sn76477_device::enable_w )
*
*****************************************************************************/
-void sn76477_device::_SN76477_mixer_a_w(UINT32 data)
-{
- m_mixer_mode = (m_mixer_mode & ~0x01) | (data << 0);
-}
-
-
WRITE_LINE_MEMBER( sn76477_device::mixer_a_w )
{
-#if TEST_MODE == 0
- CHECK_CHIP_NUM_AND_BOOLEAN;
+ CHECK_BOOLEAN;
if (state != ((m_mixer_mode >> 0) & 0x01))
{
m_channel->update();
- _SN76477_mixer_a_w(state);
+ m_mixer_mode = (m_mixer_mode & ~0x01) | state;
log_mixer_mode();
}
-#endif
}
-
-void sn76477_device::_SN76477_mixer_b_w(UINT32 data)
-{
- m_mixer_mode = (m_mixer_mode & ~0x02) | (data << 1);
-}
-
-
WRITE_LINE_MEMBER( sn76477_device::mixer_b_w )
{
-#if TEST_MODE == 0
- CHECK_CHIP_NUM_AND_BOOLEAN;
+ CHECK_BOOLEAN;
if (state != ((m_mixer_mode >> 1) & 0x01))
{
m_channel->update();
- _SN76477_mixer_b_w(state);
+ m_mixer_mode = (m_mixer_mode & ~0x02) | (state << 1);
log_mixer_mode();
}
-#endif
}
-
-void sn76477_device::_SN76477_mixer_c_w(UINT32 data)
-{
- m_mixer_mode = (m_mixer_mode & ~0x04) | (data << 2);
-}
-
-
WRITE_LINE_MEMBER( sn76477_device::mixer_c_w )
{
-#if TEST_MODE == 0
- CHECK_CHIP_NUM_AND_BOOLEAN;
+ CHECK_BOOLEAN;
if (state != ((m_mixer_mode >> 2) & 0x01))
{
m_channel->update();
- _SN76477_mixer_c_w(state);
+ m_mixer_mode = (m_mixer_mode & ~0x04) | (state << 2);
log_mixer_mode();
}
-#endif
}
-
-
/*****************************************************************************
*
* Set envelope select inputs
*
*****************************************************************************/
-void sn76477_device::_SN76477_envelope_1_w(UINT32 data)
-{
- m_envelope_mode = (m_envelope_mode & ~0x01) | (data << 0);
-}
-
-
WRITE_LINE_MEMBER( sn76477_device::envelope_1_w )
{
-#if TEST_MODE == 0
- CHECK_CHIP_NUM_AND_BOOLEAN;
+ CHECK_BOOLEAN;
if (state != ((m_envelope_mode >> 0) & 0x01))
{
m_channel->update();
- _SN76477_envelope_1_w(state);
+ m_envelope_mode = (m_envelope_mode & ~0x01) | state;
log_envelope_mode();
}
-#endif
-}
-
-
-void sn76477_device::_SN76477_envelope_2_w(UINT32 data)
-{
- m_envelope_mode = (m_envelope_mode & ~0x02) | (data << 1);
}
-
WRITE_LINE_MEMBER( sn76477_device::envelope_2_w )
{
-#if TEST_MODE == 0
- CHECK_CHIP_NUM_AND_BOOLEAN;
+ CHECK_BOOLEAN;
if (state != ((m_envelope_mode >> 1) & 0x01))
{
m_channel->update();
- _SN76477_envelope_2_w(state);
+ m_envelope_mode = (m_envelope_mode & ~0x02) | (state << 1);
log_envelope_mode();
}
-#endif
}
-
-
/*****************************************************************************
*
* Set VCO select input
*
*****************************************************************************/
-void sn76477_device::_SN76477_vco_w(UINT32 data)
-{
- m_vco_mode = data;
-}
-
-
WRITE_LINE_MEMBER( sn76477_device::vco_w )
{
-#if TEST_MODE == 0
- CHECK_CHIP_NUM_AND_BOOLEAN;
+ CHECK_BOOLEAN;
if (state != m_vco_mode)
{
m_channel->update();
- _SN76477_vco_w(state);
+ m_vco_mode = state;
log_vco_mode();
}
-#endif
}
-
-
/*****************************************************************************
*
* Set one-shot resistor
*
*****************************************************************************/
-void sn76477_device::_SN76477_one_shot_res_w(double data)
-{
- m_one_shot_res = data;
-}
-
-
void sn76477_device::one_shot_res_w(double data)
{
-#if TEST_MODE == 0
- CHECK_CHIP_NUM_AND_POSITIVE;
+ CHECK_POSITIVE;
if (data != m_one_shot_res)
{
m_channel->update();
- _SN76477_one_shot_res_w(data);
+ m_one_shot_res = data;
log_one_shot_time();
}
-#endif
}
-
-
/*****************************************************************************
*
* Set one-shot capacitor
*
*****************************************************************************/
-void sn76477_device::_SN76477_one_shot_cap_w(double data)
-{
- m_one_shot_cap = data;
-}
-
-
void sn76477_device::one_shot_cap_w(double data)
{
-#if TEST_MODE == 0
- CHECK_CHIP_NUM_AND_POSITIVE;
+ CHECK_POSITIVE;
if (data != m_one_shot_cap)
{
m_channel->update();
- _SN76477_one_shot_cap_w(data);
+ m_one_shot_cap = data;
log_one_shot_time();
}
-#endif
}
-
-
/*****************************************************************************
*
* Set the voltage on the one-shot capacitor
@@ -1225,8 +1125,7 @@ void sn76477_device::one_shot_cap_w(double data)
void sn76477_device::one_shot_cap_voltage_w(double data)
{
-#if TEST_MODE == 0
- CHECK_CHIP_NUM_AND_CAP_VOLTAGE;
+ CHECK_CAP_VOLTAGE;
if (data == SN76477_EXTERNAL_VOLTAGE_DISCONNECT)
{
@@ -1253,71 +1152,48 @@ void sn76477_device::one_shot_cap_voltage_w(double data)
log_one_shot_time();
}
}
-#endif
}
-
-
/*****************************************************************************
*
* Set SLF resistor
*
*****************************************************************************/
-void sn76477_device::_SN76477_slf_res_w(double data)
-{
- m_slf_res = data;
-}
-
-
void sn76477_device::slf_res_w(double data)
{
-#if TEST_MODE == 0
- CHECK_CHIP_NUM_AND_POSITIVE;
+ CHECK_POSITIVE;
if (data != m_slf_res)
{
m_channel->update();
- _SN76477_slf_res_w(data);
+ m_slf_res = data;
log_slf_freq();
}
-#endif
}
-
-
/*****************************************************************************
*
* Set SLF capacitor
*
*****************************************************************************/
-void sn76477_device::_SN76477_slf_cap_w(double data)
-{
- m_slf_cap = data;
-}
-
-
void sn76477_device::slf_cap_w(double data)
{
-#if TEST_MODE == 0
- CHECK_CHIP_NUM_AND_POSITIVE;
+ CHECK_POSITIVE;
if (data != m_slf_cap)
{
m_channel->update();
- _SN76477_slf_cap_w(data);
+ m_slf_cap = data;
log_slf_freq();
}
-#endif
}
-
-
/*****************************************************************************
*
* Set the voltage on the SLF capacitor
@@ -1328,8 +1204,7 @@ void sn76477_device::slf_cap_w(double data)
void sn76477_device::slf_cap_voltage_w(double data)
{
-#if TEST_MODE == 0
- CHECK_CHIP_NUM_AND_CAP_VOLTAGE;
+ CHECK_CAP_VOLTAGE;
if (data == SN76477_EXTERNAL_VOLTAGE_DISCONNECT)
{
@@ -1356,71 +1231,48 @@ void sn76477_device::slf_cap_voltage_w(double data)
log_slf_freq();
}
}
-#endif
}
-
-
/*****************************************************************************
*
* Set VCO resistor
*
*****************************************************************************/
-void sn76477_device::_SN76477_vco_res_w(double data)
-{
- m_vco_res = data;
-}
-
-
void sn76477_device::vco_res_w(double data)
{
-#if TEST_MODE == 0
- CHECK_CHIP_NUM_AND_POSITIVE;
+ CHECK_POSITIVE;
if (data != m_vco_res)
{
m_channel->update();
- _SN76477_vco_res_w(data);
+ m_vco_res = data;
log_vco_freq();
}
-#endif
}
-
-
/*****************************************************************************
*
* Set VCO capacitor
*
*****************************************************************************/
-void sn76477_device::_SN76477_vco_cap_w(double data)
-{
- m_vco_cap = data;
-}
-
-
void sn76477_device::vco_cap_w(double data)
{
-#if TEST_MODE == 0
- CHECK_CHIP_NUM_AND_POSITIVE;
+ CHECK_POSITIVE;
if (data != m_vco_cap)
{
m_channel->update();
- _SN76477_vco_cap_w(data);
+ m_vco_cap = data;
log_vco_freq();
}
-#endif
}
-
-
/*****************************************************************************
*
* Set the voltage on the VCO capacitor
@@ -1429,8 +1281,7 @@ void sn76477_device::vco_cap_w(double data)
void sn76477_device::vco_cap_voltage_w(double data)
{
-#if TEST_MODE == 0
- CHECK_CHIP_NUM_AND_CAP_VOLTAGE;
+ CHECK_CAP_VOLTAGE;
if (data == SN76477_EXTERNAL_VOLTAGE_DISCONNECT)
{
@@ -1457,73 +1308,50 @@ void sn76477_device::vco_cap_voltage_w(double data)
log_vco_freq();
}
}
-#endif
}
-
-
/*****************************************************************************
*
* Set VCO voltage
*
*****************************************************************************/
-void sn76477_device::_SN76477_vco_voltage_w(double data)
-{
- m_vco_voltage = data;
-}
-
-
void sn76477_device::vco_voltage_w(double data)
{
-#if TEST_MODE == 0
- CHECK_CHIP_NUM_AND_VOLTAGE;
+ CHECK_VOLTAGE;
if (data != m_vco_voltage)
{
m_channel->update();
- _SN76477_vco_voltage_w(data);
+ m_vco_voltage = data;
log_vco_ext_voltage();
log_vco_duty_cycle();
}
-#endif
}
-
-
/*****************************************************************************
*
* Set pitch voltage
*
*****************************************************************************/
-void sn76477_device::_SN76477_pitch_voltage_w(double data)
-{
- m_pitch_voltage = data;
-}
-
-
void sn76477_device::pitch_voltage_w(double data)
{
-#if TEST_MODE == 0
- CHECK_CHIP_NUM_AND_VOLTAGE;
+ CHECK_VOLTAGE;
if (data != m_pitch_voltage)
{
m_channel->update();
- _SN76477_pitch_voltage_w(data);
+ m_pitch_voltage = data;
log_vco_pitch_voltage();
log_vco_duty_cycle();
}
-#endif
}
-
-
/*****************************************************************************
*
* Set noise external clock
@@ -1532,8 +1360,7 @@ void sn76477_device::pitch_voltage_w(double data)
WRITE_LINE_MEMBER( sn76477_device::noise_clock_w )
{
-#if TEST_MODE == 0
- CHECK_CHIP_NUM_AND_BOOLEAN;
+ CHECK_BOOLEAN;
if (state != m_noise_clock)
{
@@ -1548,111 +1375,78 @@ WRITE_LINE_MEMBER( sn76477_device::noise_clock_w )
m_real_noise_bit_ff = generate_next_real_noise_bit();
}
}
-#endif
}
-
-
/*****************************************************************************
*
* Set noise clock resistor
*
*****************************************************************************/
-void sn76477_device::_SN76477_noise_clock_res_w(double data)
-{
- if (data == 0)
- {
- m_noise_clock_ext = 1;
- }
- else
- {
- m_noise_clock_ext = 0;
-
- m_noise_clock_res = data;
- }
-}
-
-
void sn76477_device::noise_clock_res_w(double data)
{
-#if TEST_MODE == 0
- CHECK_CHIP_NUM_AND_POSITIVE;
+ CHECK_POSITIVE;
if (((data == 0) && !m_noise_clock_ext) ||
((data != 0) && (data != m_noise_clock_res)))
{
m_channel->update();
- _SN76477_noise_clock_res_w(data);
+ if (data == 0)
+ {
+ m_noise_clock_ext = 1;
+ }
+ else
+ {
+ m_noise_clock_ext = 0;
+
+ m_noise_clock_res = data;
+ }
log_noise_gen_freq();
}
-#endif
}
-
-
/*****************************************************************************
*
* Set noise filter resistor
*
*****************************************************************************/
-void sn76477_device::_SN76477_noise_filter_res_w(double data)
-{
- m_noise_filter_res = data;
-}
-
-
void sn76477_device::noise_filter_res_w(double data)
{
-#if TEST_MODE == 0
- CHECK_CHIP_NUM_AND_POSITIVE;
+ CHECK_POSITIVE;
if (data != m_noise_filter_res)
{
m_channel->update();
- _SN76477_noise_filter_res_w(data);
+ m_noise_filter_res = data;
log_noise_filter_freq();
}
-#endif
}
-
-
/*****************************************************************************
*
* Set noise filter capacitor
*
*****************************************************************************/
-void sn76477_device::_SN76477_noise_filter_cap_w(double data)
-{
- m_noise_filter_cap = data;
-}
-
-
void sn76477_device::noise_filter_cap_w(double data)
{
-#if TEST_MODE == 0
- CHECK_CHIP_NUM_AND_POSITIVE;
+ CHECK_POSITIVE;
if (data != m_noise_filter_cap)
{
m_channel->update();
- _SN76477_noise_filter_cap_w(data);
+ m_noise_filter_cap = data;
log_noise_filter_freq();
}
-#endif
}
-
-
/*****************************************************************************
*
* Set the voltage on the noise filter capacitor
@@ -1661,8 +1455,7 @@ void sn76477_device::noise_filter_cap_w(double data)
void sn76477_device::noise_filter_cap_voltage_w(double data)
{
-#if TEST_MODE == 0
- CHECK_CHIP_NUM_AND_CAP_VOLTAGE;
+ CHECK_CAP_VOLTAGE;
if (data == SN76477_EXTERNAL_VOLTAGE_DISCONNECT)
{
@@ -1689,102 +1482,69 @@ void sn76477_device::noise_filter_cap_voltage_w(double data)
log_noise_filter_freq();
}
}
-#endif
}
-
-
/*****************************************************************************
*
* Set attack resistor
*
*****************************************************************************/
-void sn76477_device::_SN76477_attack_res_w(double data)
-{
- m_attack_res = data;
-}
-
-
void sn76477_device::attack_res_w(double data)
{
-#if TEST_MODE == 0
- CHECK_CHIP_NUM_AND_POSITIVE;
+ CHECK_POSITIVE;
if (data != m_attack_res)
{
m_channel->update();
- _SN76477_attack_res_w(data);
+ m_attack_res = data;
log_attack_time();
}
-#endif
}
-
-
/*****************************************************************************
*
* Set decay resistor
*
*****************************************************************************/
-void sn76477_device::_SN76477_decay_res_w(double data)
-{
- m_decay_res = data;
-}
-
-
void sn76477_device::decay_res_w(double data)
{
-#if TEST_MODE == 0
- CHECK_CHIP_NUM_AND_POSITIVE;
+ CHECK_POSITIVE;
if (data != m_decay_res)
{
m_channel->update();
- _SN76477_decay_res_w(data);
+ m_decay_res = data;
log_decay_time();
}
-#endif
}
-
-
/*****************************************************************************
*
* Set attack/decay capacitor
*
*****************************************************************************/
-void sn76477_device::_SN76477_attack_decay_cap_w(double data)
-{
- m_attack_decay_cap = data;
-}
-
-
void sn76477_device::attack_decay_cap_w(double data)
{
-#if TEST_MODE == 0
- CHECK_CHIP_NUM_AND_POSITIVE;
+ CHECK_POSITIVE;
if (data != m_attack_decay_cap)
{
m_channel->update();
- _SN76477_attack_decay_cap_w(data);
+ m_attack_decay_cap = data;
log_attack_time();
log_decay_time();
}
-#endif
}
-
-
/*****************************************************************************
*
* Set the voltage on the attack/decay capacitor
@@ -1793,8 +1553,7 @@ void sn76477_device::attack_decay_cap_w(double data)
void sn76477_device::attack_decay_cap_voltage_w(double data)
{
-#if TEST_MODE == 0
- CHECK_CHIP_NUM_AND_CAP_VOLTAGE;
+ CHECK_CAP_VOLTAGE;
if (data == SN76477_EXTERNAL_VOLTAGE_DISCONNECT)
{
@@ -1823,70 +1582,48 @@ void sn76477_device::attack_decay_cap_voltage_w(double data)
log_decay_time();
}
}
-#endif
}
-
-
/*****************************************************************************
*
* Set amplitude resistor
*
*****************************************************************************/
-void sn76477_device::_SN76477_amplitude_res_w(double data)
-{
- m_amplitude_res = data;
-}
-
-
void sn76477_device::amplitude_res_w(double data)
{
-#if TEST_MODE == 0
- CHECK_CHIP_NUM_AND_POSITIVE;
+ CHECK_POSITIVE;
if (data != m_amplitude_res)
{
m_channel->update();
- _SN76477_amplitude_res_w(data);
+ m_amplitude_res = data;
log_voltage_out();
}
-#endif
}
-
-
/*****************************************************************************
*
* Set feedback resistor
*
*****************************************************************************/
-void sn76477_device::_SN76477_feedback_res_w(double data)
-{
- m_feedback_res = data;
-}
-
-
void sn76477_device::feedback_res_w(double data)
{
-#if TEST_MODE == 0
- CHECK_CHIP_NUM_AND_POSITIVE;
+ CHECK_POSITIVE;
if (data != m_feedback_res)
{
m_channel->update();
- _SN76477_feedback_res_w(data);
+ m_feedback_res = data;
log_voltage_out();
}
-#endif
}
-
/*****************************************************************************
*
* State saving
@@ -1974,21 +1711,6 @@ void sn76477_device::sound_stream_update(sound_stream &stream, stream_sample_t *
stream_sample_t *buffer = outputs[0];
-
-#if TEST_MODE
- static int recursing = 0; /* we need to prevent recursion since enable_w calls machine().input().code_pressed_once(KEYCODE_SPACE->update */
-
- if () && !recursing)
- {
- recursing = 1;
-
- machine().sound().system_enable();
- SN76477_test_enable_w(!m_enable);
- }
-
- recursing = 0;
-#endif
-
/* compute charging values, doing it here ensures that we always use the latest values */
one_shot_cap_charging_step = compute_one_shot_cap_charging_rate() / m_our_sample_rate;
one_shot_cap_discharging_step = compute_one_shot_cap_discharging_rate() / m_our_sample_rate;
diff --git a/src/devices/sound/sn76477.h b/src/devices/sound/sn76477.h
index 7d19a442453..849229c22d7 100644
--- a/src/devices/sound/sn76477.h
+++ b/src/devices/sound/sn76477.h
@@ -63,7 +63,7 @@
sn76477_device::set_amp_res(*device, _amp_res);
#define MCFG_SN76477_FEEDBACK_RES(_feedback_res) \
- sn76477_device::set_feedack_res(*device, _feedback_res);
+ sn76477_device::set_feedback_res(*device, _feedback_res);
#define MCFG_SN76477_VCO_PARAMS(_volt, _cap, _res) \
sn76477_device::set_vco_params(*device, _volt, _cap, _res);
@@ -111,7 +111,7 @@ public:
dev.m_attack_res = res;
}
static void set_amp_res(device_t &device, double amp_res) { downcast<sn76477_device &>(device).m_amplitude_res = amp_res; }
- static void set_feedack_res(device_t &device, double feedback_res) { downcast<sn76477_device &>(device).m_feedback_res = feedback_res; }
+ static void set_feedback_res(device_t &device, double feedback_res) { downcast<sn76477_device &>(device).m_feedback_res = feedback_res; }
static void set_vco_params(device_t &device, double volt, double cap, double res)
{
sn76477_device &dev = downcast<sn76477_device &>(device);
@@ -304,31 +304,6 @@ private:
inline UINT32 generate_next_real_noise_bit();
void state_save_register();
-
- void _SN76477_enable_w(UINT32 data);
- void _SN76477_vco_w(UINT32 data);
- void _SN76477_mixer_a_w(UINT32 data);
- void _SN76477_mixer_b_w(UINT32 data);
- void _SN76477_mixer_c_w(UINT32 data);
- void _SN76477_envelope_1_w(UINT32 data);
- void _SN76477_envelope_2_w(UINT32 data);
- void _SN76477_one_shot_res_w(double data);
- void _SN76477_one_shot_cap_w(double data);
- void _SN76477_slf_res_w(double data);
- void _SN76477_slf_cap_w(double data);
- void _SN76477_vco_res_w(double data);
- void _SN76477_vco_cap_w(double data);
- void _SN76477_vco_voltage_w(double data);
- void _SN76477_noise_clock_res_w(double data);
- void _SN76477_noise_filter_res_w(double data);
- void _SN76477_noise_filter_cap_w(double data);
- void _SN76477_decay_res_w(double data);
- void _SN76477_attack_res_w(double data);
- void _SN76477_attack_decay_cap_w(double data);
- void _SN76477_amplitude_res_w(double data);
- void _SN76477_feedback_res_w(double data);
- void _SN76477_pitch_voltage_w(double data);
- void SN76477_test_enable_w(UINT32 data);
};
extern const device_type SN76477;
diff --git a/src/devices/sound/sn76496.cpp b/src/devices/sound/sn76496.cpp
index 305daa62b5b..f39fc04bc38 100644
--- a/src/devices/sound/sn76496.cpp
+++ b/src/devices/sound/sn76496.cpp
@@ -335,7 +335,7 @@ void sn76496_base_device::sound_stream_update(sound_stream &stream, stream_sampl
stream_sample_t *lbuffer = outputs[0];
stream_sample_t *rbuffer = (m_stereo)? outputs[1] : nullptr;
- INT16 out = 0;
+ INT16 out;
INT16 out2 = 0;
while (samples > 0)
diff --git a/src/devices/sound/sp0256.cpp b/src/devices/sound/sp0256.cpp
index 1ba54669ab2..f009516a807 100644
--- a/src/devices/sound/sp0256.cpp
+++ b/src/devices/sound/sp0256.cpp
@@ -125,8 +125,8 @@ void sp0256_device::device_start()
/* -------------------------------------------------------------------- */
/* Allocate a scratch buffer for generating ~10kHz samples. */
/* -------------------------------------------------------------------- */
- m_scratch = auto_alloc_array(machine(), INT16, SCBUF_SIZE);
- save_pointer(NAME(m_scratch), SCBUF_SIZE);
+ m_scratch = std::make_unique<INT16[]>(SCBUF_SIZE);
+ save_pointer(NAME(m_scratch.get()), SCBUF_SIZE);
m_sc_head = m_sc_tail = 0;
@@ -759,7 +759,7 @@ void sp0256_device::bitrevbuff(UINT8 *buffer, unsigned int start, unsigned int l
/* ======================================================================== */
UINT32 sp0256_device::getb( int len )
{
- UINT32 data = 0;
+ UINT32 data;
UINT32 d0, d1;
/* -------------------------------------------------------------------- */
@@ -822,8 +822,8 @@ void sp0256_device::micro()
UINT8 immed4;
UINT8 opcode;
UINT16 cr;
- int ctrl_xfer = 0;
- int repeat = 0;
+ int ctrl_xfer;
+ int repeat;
int i, idx0, idx1;
/* -------------------------------------------------------------------- */
@@ -1357,7 +1357,7 @@ void sp0256_device::sound_stream_update(sound_stream &stream, stream_sample_t **
else
{
did_samp += lpc12_update(&m_filt, do_samp,
- m_scratch, &m_sc_head);
+ m_scratch.get(), &m_sc_head);
}
m_sc_head &= SCBUF_MASK;
diff --git a/src/devices/sound/sp0256.h b/src/devices/sound/sp0256.h
index c1e486883d6..c7215cb4e6c 100644
--- a/src/devices/sound/sp0256.h
+++ b/src/devices/sound/sp0256.h
@@ -108,7 +108,7 @@ private:
int m_silent; /* Flag: SP0256 is silent. */
- INT16 *m_scratch; /* Scratch buffer for audio. */
+ std::unique_ptr<INT16[]> m_scratch; /* Scratch buffer for audio. */
UINT32 m_sc_head; /* Head pointer into scratch circular buf */
UINT32 m_sc_tail; /* Tail pointer into scratch circular buf */
diff --git a/src/devices/sound/spu.cpp b/src/devices/sound/spu.cpp
index 50276f3c486..3686fab3f9d 100644
--- a/src/devices/sound/spu.cpp
+++ b/src/devices/sound/spu.cpp
@@ -1147,7 +1147,7 @@ void spu_device::kill_sound()
READ16_MEMBER( spu_device::read )
{
- unsigned short ret=0, *rp=(unsigned short *)(reg+((offset*2)&0x1ff));
+ unsigned short ret, *rp=(unsigned short *)(reg+((offset*2)&0x1ff));
m_stream->update();
diff --git a/src/devices/sound/spu.h b/src/devices/sound/spu.h
index 4c0a090bd71..6381464c7cd 100644
--- a/src/devices/sound/spu.h
+++ b/src/devices/sound/spu.h
@@ -165,7 +165,6 @@ protected:
void *fmnoise_ptr,
void *outxptr,
unsigned int *tleft);
- void process();
void process_until(const unsigned int tsample);
void update_voice_loop(const unsigned int v);
bool update_voice_state(const unsigned int v);
@@ -233,8 +232,6 @@ public:
void reinit_sound();
void kill_sound();
- void update();
-
void start_dma(UINT8 *mainram, bool to_spu, UINT32 size);
bool play_xa(const unsigned int sector, const unsigned char *sec);
bool play_cdda(const unsigned int sector, const unsigned char *sec);
diff --git a/src/devices/sound/spureverb.h b/src/devices/sound/spureverb.h
index 8a8cb040ba8..9f64c5c7f19 100644
--- a/src/devices/sound/spureverb.h
+++ b/src/devices/sound/spureverb.h
@@ -66,7 +66,6 @@
const int wetvol_r,
const unsigned int sz);
- void reset();
};
#endif
diff --git a/src/devices/sound/tiasound.cpp b/src/devices/sound/tiasound.cpp
index 960520b6b79..71b7b5a107e 100644
--- a/src/devices/sound/tiasound.cpp
+++ b/src/devices/sound/tiasound.cpp
@@ -162,7 +162,7 @@ static const UINT8 Div31[POLY5_SIZE] =
void tia_write(void *_chip, offs_t offset, UINT8 data)
{
struct tia *chip = (struct tia *)_chip;
- UINT16 new_val = 0;
+ UINT16 new_val;
UINT8 chan;
/* determine which address was changed */
@@ -564,7 +564,7 @@ void *tia_sound_init(device_t *device, int clock, int sample_rate, int gain)
struct tia *chip;
int chan;
- chip = global_alloc_clear(struct tia);
+ chip = global_alloc_clear<struct tia>();
/* set the gain factor (normally use TIA_DEFAULT_GAIN) */
chip->tia_gain = gain;
diff --git a/src/devices/sound/tms5110.cpp b/src/devices/sound/tms5110.cpp
index 724e2b02c98..aa98b69697a 100644
--- a/src/devices/sound/tms5110.cpp
+++ b/src/devices/sound/tms5110.cpp
@@ -1,4 +1,4 @@
-// license:???
+// license:BSD-3-Clause
// copyright-holders:Frank Palazzolo, Jarek Burczynski, Aaron Giles, Jonathan Gevaryahu, Couriersud
/**********************************************************************************************
@@ -1049,8 +1049,6 @@ static const unsigned int example_word_TEN[619]={
void tms5110_device::device_start()
{
- m_table = region()->base();
-
set_variant(TMS5110_IS_TMS5110A);
/* resolve lines */
@@ -1531,24 +1529,26 @@ WRITE_LINE_MEMBER( tmsprom_device::enable_w )
const device_type TMS5110 = &device_creator<tms5110_device>;
tms5110_device::tms5110_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
- : device_t(mconfig, TMS5110, "TMS5110", tag, owner, clock, "tms5110", __FILE__),
- device_sound_interface(mconfig, *this),
- m_m0_cb(*this),
- m_m1_cb(*this),
- m_addr_cb(*this),
- m_data_cb(*this),
- m_romclk_cb(*this)
+ : device_t(mconfig, TMS5110, "TMS5110", tag, owner, clock, "tms5110", __FILE__)
+ , device_sound_interface(mconfig, *this)
+ , m_table(*this, DEVICE_SELF)
+ , m_m0_cb(*this)
+ , m_m1_cb(*this)
+ , m_addr_cb(*this)
+ , m_data_cb(*this)
+ , m_romclk_cb(*this)
{
}
tms5110_device::tms5110_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source)
- : device_t(mconfig, type, name, tag, owner, clock, shortname, source),
- device_sound_interface(mconfig, *this),
- m_m0_cb(*this),
- m_m1_cb(*this),
- m_addr_cb(*this),
- m_data_cb(*this),
- m_romclk_cb(*this)
+ : device_t(mconfig, type, name, tag, owner, clock, shortname, source)
+ , device_sound_interface(mconfig, *this)
+ , m_table(*this, DEVICE_SELF)
+ , m_m0_cb(*this)
+ , m_m1_cb(*this)
+ , m_addr_cb(*this)
+ , m_data_cb(*this)
+ , m_romclk_cb(*this)
{
}
diff --git a/src/devices/sound/tms5110.h b/src/devices/sound/tms5110.h
index 5b5eb3c5124..8eb5306eaf9 100644
--- a/src/devices/sound/tms5110.h
+++ b/src/devices/sound/tms5110.h
@@ -1,4 +1,4 @@
-// license:???
+// license:BSD-3-Clause
// copyright-holders:Frank Palazzolo, Jarek Burczynski, Aaron Giles, Jonathan Gevaryahu, Couriersud
#pragma once
@@ -66,10 +66,6 @@ public:
DECLARE_READ8_MEMBER( romclk_hack_r );
void set_frequency(int frequency);
-
- int _speech_rom_read_bit();
- void _speech_rom_set_addr(int addr);
-
protected:
// device-level overrides
virtual void device_start() override;
@@ -101,6 +97,9 @@ private:
void parse_frame();
// internal state
+ /* table */
+ optional_region_ptr<UINT8> m_table;
+
/* coefficient tables */
int m_variant; /* Variant of the 5110 - see tms5110.h */
@@ -195,7 +194,6 @@ private:
UINT8 m_romclk_hack_state;
emu_timer *m_romclk_hack_timer;
- const UINT8 *m_table;
};
extern const device_type TMS5110;
diff --git a/src/devices/sound/upd7759.cpp b/src/devices/sound/upd7759.cpp
index a7e0491687f..ed26fe6772f 100644
--- a/src/devices/sound/upd7759.cpp
+++ b/src/devices/sound/upd7759.cpp
@@ -145,52 +145,52 @@
upd775x_device::upd775x_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source)
- : device_t(mconfig, type, name, tag, owner, clock, shortname, source),
- device_sound_interface(mconfig, *this),
- m_channel(nullptr),
- m_sample_offset_shift(0),
- m_pos(0),
- m_step(0),
- m_fifo_in(0),
- m_reset(0),
- m_start(0),
- m_drq(0),
- m_state(0),
- m_clocks_left(0),
- m_nibbles_left(0),
- m_repeat_count(0),
- m_post_drq_state(0),
- m_post_drq_clocks(0),
- m_req_sample(0),
- m_last_sample(0),
- m_block_header(0),
- m_sample_rate(0),
- m_first_valid_header(0),
- m_offset(0),
- m_repeat_offset(0),
- m_adpcm_state(0),
- m_adpcm_data(0),
- m_sample(0),
- m_rom(nullptr),
- m_rombase(nullptr),
- m_romoffset(0),
- m_rommask(0),
- m_drqcallback(*this)
-{
-}
+ : device_t(mconfig, type, name, tag, owner, clock, shortname, source)
+ , device_sound_interface(mconfig, *this)
+ , m_channel(nullptr)
+ , m_sample_offset_shift(0)
+ , m_pos(0)
+ , m_step(0)
+ , m_fifo_in(0)
+ , m_reset(0)
+ , m_start(0)
+ , m_drq(0)
+ , m_state(0)
+ , m_clocks_left(0)
+ , m_nibbles_left(0)
+ , m_repeat_count(0)
+ , m_post_drq_state(0)
+ , m_post_drq_clocks(0)
+ , m_req_sample(0)
+ , m_last_sample(0)
+ , m_block_header(0)
+ , m_sample_rate(0)
+ , m_first_valid_header(0)
+ , m_offset(0)
+ , m_repeat_offset(0)
+ , m_adpcm_state(0)
+ , m_adpcm_data(0)
+ , m_sample(0)
+ , m_rombase(*this, DEVICE_SELF)
+ , m_rom(nullptr)
+ , m_romoffset(0)
+ , m_rommask(0)
+ , m_drqcallback(*this)
+ {
+ }
const device_type UPD7759 = &device_creator<upd7759_device>;
upd7759_device::upd7759_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
- : upd775x_device(mconfig, UPD7759, "uPD7759", tag, owner, clock, "upd7759", __FILE__),
- m_timer(nullptr)
+ : upd775x_device(mconfig, UPD7759, "uPD7759", tag, owner, clock, "upd7759", __FILE__)
+ , m_timer(nullptr)
{
}
upd7759_device::upd7759_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source)
- : upd775x_device(mconfig, type, name, tag, owner, clock, shortname, source),
- m_timer(nullptr)
+ : upd775x_device(mconfig, type, name, tag, owner, clock, shortname, source)
+ , m_timer(nullptr)
{
}
@@ -231,20 +231,26 @@ void upd7759_device::device_start()
/* compute the ROM base or allocate a timer */
m_romoffset = 0;
- m_rom = m_rombase = region()->base();
- if (m_rombase == nullptr)
+ m_rom = m_rombase;
+ if (m_rombase != nullptr)
{
- assert(type() == UPD7759); // other chips do not support slave mode
- m_timer = timer_alloc(TIMER_SLAVE_UPDATE);
- m_rommask = 0;
+ UINT32 romsize = m_rombase.bytes();
+ if (romsize >= 0x20000)
+ {
+ m_rommask = 0x1ffff;
+ }
+ else
+ {
+ m_rommask = romsize - 1;
+ }
+
+ m_drqcallback.set_callback(DEVCB_NULL);
}
else
{
- UINT32 romsize = region()->bytes();
- if (romsize >= 0x20000) m_rommask = 0x1ffff;
- else m_rommask = romsize - 1;
-
- m_drqcallback.set_callback(DEVCB_NULL);
+ assert(type() == UPD7759); // other chips do not support slave mode
+ m_timer = timer_alloc(TIMER_SLAVE_UPDATE);
+ m_rommask = 0;
}
/* assume /RESET and /START are both high */
@@ -306,18 +312,24 @@ void upd7756_device::device_start()
/* compute the ROM base or allocate a timer */
m_romoffset = 0;
- m_rom = m_rombase = region()->base();
- if (m_rombase == nullptr)
+ m_rom = m_rombase;
+ if (m_rombase != nullptr)
{
- m_rommask = 0;
+ UINT32 romsize = m_rombase.bytes();
+ if (romsize >= 0x20000)
+ {
+ m_rommask = 0x1ffff;
+ }
+ else
+ {
+ m_rommask = romsize - 1;
+ }
+
+ m_drqcallback.set_callback(DEVCB_NULL);
}
else
{
- UINT32 romsize = region()->bytes();
- if (romsize >= 0x20000) m_rommask = 0x1ffff;
- else m_rommask = romsize - 1;
-
- m_drqcallback.set_callback(DEVCB_NULL);
+ m_rommask = 0;
}
/* assume /RESET and /START are both high */
@@ -720,7 +732,9 @@ void upd7759_device::device_timer(emu_timer &timer, device_timer_id id, int para
void upd775x_device::postload()
{
if (m_rombase)
+ {
m_rom = m_rombase + m_romoffset;
+ }
}
/************************************************************
diff --git a/src/devices/sound/upd7759.h b/src/devices/sound/upd7759.h
index 637732b22fa..6828810e4eb 100644
--- a/src/devices/sound/upd7759.h
+++ b/src/devices/sound/upd7759.h
@@ -95,8 +95,8 @@ protected:
INT16 m_sample; /* current sample value */
/* ROM access */
+ optional_region_ptr<UINT8> m_rombase; /* pointer to ROM data or NULL for slave mode */
UINT8 * m_rom; /* pointer to ROM data or NULL for slave mode */
- UINT8 * m_rombase; /* pointer to ROM data or NULL for slave mode */
UINT32 m_romoffset; /* ROM offset to make save/restore easier */
UINT32 m_rommask; /* maximum address offset */
diff --git a/src/devices/sound/vrender0.cpp b/src/devices/sound/vrender0.cpp
index e063daf3d42..7226f35d304 100644
--- a/src/devices/sound/vrender0.cpp
+++ b/src/devices/sound/vrender0.cpp
@@ -161,7 +161,7 @@ void vrender0_device::VR0_RenderAudio(int nsamples, stream_sample_t *l, stream_s
{
INT16 *SAMPLES;
UINT32 st=STATUS;
- signed int lsample=0,rsample=0;
+ signed int lsample,rsample=0;
UINT32 CLK=(m_SOUNDREGS[0x600/4]>>0)&0xff;
UINT32 NCH=(m_SOUNDREGS[0x600/4]>>8)&0xff;
UINT32 CT1=(m_SOUNDREGS[0x600/4]>>16)&0xff;
diff --git a/src/devices/sound/ym2151.cpp b/src/devices/sound/ym2151.cpp
index 9f5f63120ec..f41077b96aa 100644
--- a/src/devices/sound/ym2151.cpp
+++ b/src/devices/sound/ym2151.cpp
@@ -1,4 +1,4 @@
-// license:???
+// license:GPL-2.0+
// copyright-holders:Jarek Burczynski
/*****************************************************************************
*
diff --git a/src/devices/sound/ym2151.h b/src/devices/sound/ym2151.h
index 3d62ac278ac..8ad1c8ea773 100644
--- a/src/devices/sound/ym2151.h
+++ b/src/devices/sound/ym2151.h
@@ -1,4 +1,4 @@
-// license:???
+// license:GPL-2.0+
// copyright-holders:Jarek Burczynski
/*
** File: ym2151.h - header file for software implementation of YM2151
diff --git a/src/devices/sound/ym2413.cpp b/src/devices/sound/ym2413.cpp
index 7573bfa4323..2e0ab6cd38b 100644
--- a/src/devices/sound/ym2413.cpp
+++ b/src/devices/sound/ym2413.cpp
@@ -1,4 +1,4 @@
-// license:???
+// license:GPL-2.0+
// copyright-holders:Jarek Burczynski
/*
**
@@ -2008,7 +2008,7 @@ static YM2413 *OPLLCreate(device_t *device, int clock, int rate)
if (OPLL_LockTable(device) == -1) return nullptr;
/* allocate memory block */
- chip = auto_alloc_clear(device->machine(), YM2413);
+ chip = auto_alloc_clear(device->machine(), <YM2413>());
chip->device = device;
chip->clock = clock;
diff --git a/src/devices/sound/ym2413.h b/src/devices/sound/ym2413.h
index eb9441bec5a..413986d8c8f 100644
--- a/src/devices/sound/ym2413.h
+++ b/src/devices/sound/ym2413.h
@@ -1,4 +1,4 @@
-// license:???
+// license:GPL-2.0+
// copyright-holders:Jarek Burczynski
#pragma once
diff --git a/src/devices/sound/ymdeltat.cpp b/src/devices/sound/ymdeltat.cpp
index d6668c7a8a5..ad8c0f12b13 100644
--- a/src/devices/sound/ymdeltat.cpp
+++ b/src/devices/sound/ymdeltat.cpp
@@ -1,4 +1,4 @@
-// license:???
+// license:GPL-2.0+
// copyright-holders:Jarek Burczynski
/*
**
diff --git a/src/devices/sound/ymdeltat.h b/src/devices/sound/ymdeltat.h
index afff1ab447a..8ba599f42c3 100644
--- a/src/devices/sound/ymdeltat.h
+++ b/src/devices/sound/ymdeltat.h
@@ -1,4 +1,4 @@
-// license:???
+// license:GPL-2.0+
// copyright-holders:Jarek Burczynski
#pragma once
diff --git a/src/devices/sound/ymf262.cpp b/src/devices/sound/ymf262.cpp
index 84f0c22466d..912b70e530e 100644
--- a/src/devices/sound/ymf262.cpp
+++ b/src/devices/sound/ymf262.cpp
@@ -1,4 +1,4 @@
-// license:???
+// license:GPL-2.0+
// copyright-holders:Jarek Burczynski
/*
**
@@ -2342,7 +2342,7 @@ static OPL3 *OPL3Create(device_t *device, int clock, int rate, int type)
if (OPL3_LockTable(device) == -1) return nullptr;
/* allocate memory block */
- chip = auto_alloc_clear(device->machine(), OPL3);
+ chip = auto_alloc_clear(device->machine(), <OPL3>());
chip->device = device;
chip->type = type;
diff --git a/src/devices/sound/ymf262.h b/src/devices/sound/ymf262.h
index 904b4f259c5..ef8e2fbf47a 100644
--- a/src/devices/sound/ymf262.h
+++ b/src/devices/sound/ymf262.h
@@ -1,4 +1,4 @@
-// license:???
+// license:GPL-2.0+
// copyright-holders:Jarek Burczynski
#pragma once
diff --git a/src/devices/sound/ymf271.cpp b/src/devices/sound/ymf271.cpp
index 1d0eec4fa5d..653285f18a1 100644
--- a/src/devices/sound/ymf271.cpp
+++ b/src/devices/sound/ymf271.cpp
@@ -399,7 +399,7 @@ void ymf271_device::update_lfo(YMF271Slot *slot)
slot->lfo_phase += slot->lfo_step;
slot->lfo_amplitude = m_lut_alfo[slot->lfowave][(slot->lfo_phase >> LFO_SHIFT) & (LFO_LENGTH-1)];
- slot->lfo_phasemod = m_lut_plfo[slot->lfowave][slot->pms][(slot->lfo_phase >> LFO_SHIFT) & (LFO_LENGTH-1)];
+ slot->lfo_phasemod = m_lut_plfo[slot->lfowave][slot->pms].get()[(slot->lfo_phase >> LFO_SHIFT) & (LFO_LENGTH-1)];
calculate_step(slot);
}
@@ -544,12 +544,12 @@ void ymf271_device::sound_stream_update(sound_stream &stream, stream_sample_t **
int op;
INT32 *mixp;
- memset(m_mix_buffer, 0, sizeof(m_mix_buffer[0])*samples*2);
+ memset(m_mix_buffer.get(), 0, sizeof(m_mix_buffer[0])*samples*2);
for (j = 0; j < 12; j++)
{
YMF271Group *slot_group = &m_groups[j];
- mixp = m_mix_buffer;
+ mixp = m_mix_buffer.get();
if (slot_group->pfm && slot_group->sync != 3)
{
@@ -567,14 +567,14 @@ void ymf271_device::sound_stream_update(sound_stream &stream, stream_sample_t **
int slot2 = j + (1*12);
int slot3 = j + (2*12);
int slot4 = j + (3*12);
- mixp = m_mix_buffer;
+ mixp = m_mix_buffer.get();
if (m_slots[slot1].active)
{
for (i = 0; i < samples; i++)
{
INT64 output1 = 0, output2 = 0, output3 = 0, output4 = 0;
- INT64 phase_mod1 = 0, phase_mod2 = 0, phase_mod3 = 0;
+ INT64 phase_mod1, phase_mod2, phase_mod3;
switch (m_slots[slot1].algorithm)
{
// <--------|
@@ -794,13 +794,13 @@ void ymf271_device::sound_stream_update(sound_stream &stream, stream_sample_t **
int slot1 = j + ((op + 0) * 12);
int slot3 = j + ((op + 2) * 12);
- mixp = m_mix_buffer;
+ mixp = m_mix_buffer.get();
if (m_slots[slot1].active)
{
for (i = 0; i < samples; i++)
{
INT64 output1 = 0, output3 = 0;
- INT64 phase_mod1, phase_mod3 = 0;
+ INT64 phase_mod1, phase_mod3;
switch (m_slots[slot1].algorithm & 3)
{
// <--------|
@@ -856,14 +856,14 @@ void ymf271_device::sound_stream_update(sound_stream &stream, stream_sample_t **
int slot1 = j + (0*12);
int slot2 = j + (1*12);
int slot3 = j + (2*12);
- mixp = m_mix_buffer;
+ mixp = m_mix_buffer.get();
if (m_slots[slot1].active)
{
for (i = 0; i < samples; i++)
{
INT64 output1 = 0, output2 = 0, output3 = 0;
- INT64 phase_mod1 = 0, phase_mod3 = 0;
+ INT64 phase_mod1, phase_mod3;
switch (m_slots[slot1].algorithm & 7)
{
// <--------|
@@ -959,7 +959,7 @@ void ymf271_device::sound_stream_update(sound_stream &stream, stream_sample_t **
}
}
- mixp = m_mix_buffer;
+ mixp = m_mix_buffer.get();
update_pcm(j + (3*12), mixp, samples);
break;
}
@@ -976,7 +976,7 @@ void ymf271_device::sound_stream_update(sound_stream &stream, stream_sample_t **
}
}
- mixp = m_mix_buffer;
+ mixp = m_mix_buffer.get();
for (i = 0; i < samples; i++)
{
outputs[0][i] = (*mixp++)>>2;
@@ -1505,13 +1505,13 @@ void ymf271_device::init_tables()
int i, j;
for (i = 0; i < 8; i++)
- m_lut_waves[i] = auto_alloc_array(machine(), INT16, SIN_LEN);
+ m_lut_waves[i] = std::make_unique<INT16[]>(SIN_LEN);
for (i = 0; i < 4*8; i++)
- m_lut_plfo[i>>3][i&7] = auto_alloc_array(machine(), double, LFO_LENGTH);
+ m_lut_plfo[i>>3][i&7] = std::make_unique<double[]>(LFO_LENGTH);
for (i = 0; i < 4; i++)
- m_lut_alfo[i] = auto_alloc_array(machine(), int, LFO_LENGTH);
+ m_lut_alfo[i] = std::make_unique<int[]>(LFO_LENGTH);
for (i = 0; i < SIN_LEN; i++)
{
@@ -1568,14 +1568,14 @@ void ymf271_device::init_tables()
for (j = 0; j < 4; j++)
{
- m_lut_plfo[j][0][i] = pow(2.0, 0.0);
- m_lut_plfo[j][1][i] = pow(2.0, (3.378 * plfo[j]) / 1200.0);
- m_lut_plfo[j][2][i] = pow(2.0, (5.0646 * plfo[j]) / 1200.0);
- m_lut_plfo[j][3][i] = pow(2.0, (6.7495 * plfo[j]) / 1200.0);
- m_lut_plfo[j][4][i] = pow(2.0, (10.1143 * plfo[j]) / 1200.0);
- m_lut_plfo[j][5][i] = pow(2.0, (20.1699 * plfo[j]) / 1200.0);
- m_lut_plfo[j][6][i] = pow(2.0, (40.1076 * plfo[j]) / 1200.0);
- m_lut_plfo[j][7][i] = pow(2.0, (79.307 * plfo[j]) / 1200.0);
+ m_lut_plfo[j][0].get()[i] = pow(2.0, 0.0);
+ m_lut_plfo[j][1].get()[i] = pow(2.0, (3.378 * plfo[j]) / 1200.0);
+ m_lut_plfo[j][2].get()[i] = pow(2.0, (5.0646 * plfo[j]) / 1200.0);
+ m_lut_plfo[j][3].get()[i] = pow(2.0, (6.7495 * plfo[j]) / 1200.0);
+ m_lut_plfo[j][4].get()[i] = pow(2.0, (10.1143 * plfo[j]) / 1200.0);
+ m_lut_plfo[j][5].get()[i] = pow(2.0, (20.1699 * plfo[j]) / 1200.0);
+ m_lut_plfo[j][6].get()[i] = pow(2.0, (40.1076 * plfo[j]) / 1200.0);
+ m_lut_plfo[j][7].get()[i] = pow(2.0, (79.307 * plfo[j]) / 1200.0);
}
// LFO amplitude modulation
@@ -1706,8 +1706,8 @@ void ymf271_device::device_start()
m_timA = timer_alloc(0);
m_timB = timer_alloc(1);
- m_mem_base = region()->base();
- m_mem_size = region()->bytes();
+ m_mem_size = m_mem_base.bytes();
+
m_irq_handler.resolve();
m_ext_read_handler.resolve();
@@ -1717,7 +1717,7 @@ void ymf271_device::device_start()
init_state();
m_stream = machine().sound().stream_alloc(*this, 0, 2, clock()/384);
- m_mix_buffer = auto_alloc_array(machine(), INT32, 44100*2);
+ m_mix_buffer = std::make_unique<INT32[]>(44100*2);
}
//-------------------------------------------------
@@ -1747,19 +1747,26 @@ void ymf271_device::device_reset()
const device_type YMF271 = &device_creator<ymf271_device>;
ymf271_device::ymf271_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
- : device_t(mconfig, YMF271, "YMF271", tag, owner, clock, "ymf271", __FILE__),
- device_sound_interface(mconfig, *this),
- m_timerA(0),
- m_timerB(0),
- m_irqstate(0),
- m_status(0),
- m_enable(0),
- m_ext_address(0),
- m_ext_rw(0),
- m_ext_readlatch(0),
- m_irq_handler(*this),
- m_ext_read_handler(*this),
- m_ext_write_handler(*this)
+ : device_t(mconfig, YMF271, "YMF271", tag, owner, clock, "ymf271", __FILE__)
+ , device_sound_interface(mconfig, *this)
+ , m_timerA(0)
+ , m_timerB(0)
+ , m_irqstate(0)
+ , m_status(0)
+ , m_enable(0)
+ , m_ext_address(0)
+ , m_ext_rw(0)
+ , m_ext_readlatch(0)
+ , m_mem_base(*this, DEVICE_SELF)
+ , m_mem_size(0)
+ , m_clock(0)
+ , m_timA(nullptr)
+ , m_timB(nullptr)
+ , m_stream(nullptr)
+ , m_mix_buffer(nullptr)
+ , m_irq_handler(*this)
+ , m_ext_read_handler(*this)
+ , m_ext_write_handler(*this)
{
memset(m_slots, 0, sizeof(m_slots));
memset(m_groups, 0, sizeof(m_groups));
diff --git a/src/devices/sound/ymf271.h b/src/devices/sound/ymf271.h
index 81c59164512..39d51a64d05 100644
--- a/src/devices/sound/ymf271.h
+++ b/src/devices/sound/ymf271.h
@@ -16,8 +16,7 @@
#define MCFG_YMF271_EXT_WRITE_HANDLER(_devcb) \
devcb = &ymf271_device::set_ext_write_handler(*device, DEVCB_##_devcb);
-class ymf271_device : public device_t,
- public device_sound_interface
+class ymf271_device : public device_t, public device_sound_interface
{
public:
ymf271_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
@@ -121,9 +120,9 @@ private:
inline bool check_envelope_end(YMF271Slot *slot);
// lookup tables
- INT16 *m_lut_waves[8];
- double *m_lut_plfo[4][8];
- int *m_lut_alfo[4];
+ std::unique_ptr<INT16[]> m_lut_waves[8];
+ std::unique_ptr<double[]> m_lut_plfo[4][8];
+ std::unique_ptr<int[]> m_lut_alfo[4];
double m_lut_ar[64];
double m_lut_dc[64];
double m_lut_lfo[256];
@@ -147,13 +146,14 @@ private:
UINT8 m_ext_rw;
UINT8 m_ext_readlatch;
- UINT8 *m_mem_base;
+ optional_region_ptr<UINT8> m_mem_base;
UINT32 m_mem_size;
UINT32 m_clock;
- emu_timer *m_timA, *m_timB;
+ emu_timer *m_timA;
+ emu_timer *m_timB;
sound_stream *m_stream;
- INT32 *m_mix_buffer;
+ std::unique_ptr<INT32[]> m_mix_buffer;
devcb_write_line m_irq_handler;
devcb_read8 m_ext_read_handler;
diff --git a/src/devices/sound/ymf278b.cpp b/src/devices/sound/ymf278b.cpp
index 160d609126d..af186ff0100 100644
--- a/src/devices/sound/ymf278b.cpp
+++ b/src/devices/sound/ymf278b.cpp
@@ -220,7 +220,7 @@ void ymf278b_device::compute_envelope(YMF278BSlot *slot)
void ymf278b_device::sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples)
{
int i, j;
- YMF278BSlot *slot = nullptr;
+ YMF278BSlot *slot;
INT16 sample = 0;
INT32 *mixp;
INT32 vl, vr;
@@ -231,7 +231,7 @@ void ymf278b_device::sound_stream_update(sound_stream &stream, stream_sample_t *
return;
}
- memset(m_mix_buffer, 0, sizeof(m_mix_buffer[0])*samples*2);
+ memset(m_mix_buffer.get(), 0, sizeof(m_mix_buffer[0])*samples*2);
for (i = 0; i < 24; i++)
{
@@ -239,7 +239,7 @@ void ymf278b_device::sound_stream_update(sound_stream &stream, stream_sample_t *
if (slot->active)
{
- mixp = m_mix_buffer;
+ mixp = m_mix_buffer.get();
for (j = 0; j < samples; j++)
{
@@ -299,7 +299,7 @@ void ymf278b_device::sound_stream_update(sound_stream &stream, stream_sample_t *
}
}
- mixp = m_mix_buffer;
+ mixp = m_mix_buffer.get();
vl = m_mix_level[m_pcm_l];
vr = m_mix_level[m_pcm_r];
for (i = 0; i < samples; i++)
@@ -463,7 +463,7 @@ void ymf278b_device::C_w(UINT8 reg, UINT8 data)
// Handle slot registers specifically
if (reg >= 0x08 && reg <= 0xf7)
{
- YMF278BSlot *slot = nullptr;
+ YMF278BSlot *slot;
int snum;
snum = (reg-8) % 24;
slot = &m_slots[snum];
@@ -985,7 +985,7 @@ void ymf278b_device::device_start()
}
m_stream = machine().sound().stream_alloc(*this, 0, 2, clock()/768);
- m_mix_buffer = auto_alloc_array(machine(), INT32, 44100*2);
+ m_mix_buffer = std::make_unique<INT32[]>(44100*2);
// rate tables
precompute_rate_tables();
diff --git a/src/devices/sound/ymf278b.h b/src/devices/sound/ymf278b.h
index 8037af45d82..6c750fcfd91 100644
--- a/src/devices/sound/ymf278b.h
+++ b/src/devices/sound/ymf278b.h
@@ -130,7 +130,7 @@ private:
int m_clock;
sound_stream * m_stream;
- INT32 *m_mix_buffer;
+ std::unique_ptr<INT32[]> m_mix_buffer;
direct_read_data * m_direct;
const address_space_config m_space_config;
devcb_write_line m_irq_handler;
diff --git a/src/devices/sound/ymz280b.cpp b/src/devices/sound/ymz280b.cpp
index c9c19277780..fad4f1b7558 100644
--- a/src/devices/sound/ymz280b.cpp
+++ b/src/devices/sound/ymz280b.cpp
@@ -451,7 +451,7 @@ void ymz280b_device::sound_stream_update(sound_stream &stream, stream_sample_t *
struct YMZ280BVoice *voice = &m_voice[v];
INT16 prev = voice->last_sample;
INT16 curr = voice->curr_sample;
- INT16 *curr_data = m_scratch;
+ INT16 *curr_data = m_scratch.get();
INT32 *ldest = lacc;
INT32 *rdest = racc;
UINT32 new_samples, samples_left;
@@ -496,10 +496,10 @@ void ymz280b_device::sound_stream_update(sound_stream &stream, stream_sample_t *
/* generate them into our buffer */
switch (voice->playing << 7 | voice->mode)
{
- case 0x81: samples_left = generate_adpcm(voice, m_scratch, new_samples); break;
- case 0x82: samples_left = generate_pcm8(voice, m_scratch, new_samples); break;
- case 0x83: samples_left = generate_pcm16(voice, m_scratch, new_samples); break;
- default: samples_left = 0; memset(m_scratch, 0, new_samples * sizeof(m_scratch[0])); break;
+ case 0x81: samples_left = generate_adpcm(voice, m_scratch.get(), new_samples); break;
+ case 0x82: samples_left = generate_pcm8(voice, m_scratch.get(), new_samples); break;
+ case 0x83: samples_left = generate_pcm16(voice, m_scratch.get(), new_samples); break;
+ default: samples_left = 0; memset(m_scratch.get(), 0, new_samples * sizeof(m_scratch[0])); break;
}
if (samples_left || voice->ended)
@@ -581,10 +581,15 @@ void ymz280b_device::device_start()
/* initialize the rest of the structure */
m_master_clock = (double)clock() / 384.0;
- m_mem_base = region()->base();
- m_mem_size = region()->bytes();
m_irq_handler.resolve();
+ if (region() != NULL)
+ {
+ /* Some systems (e.g. Konami Firebeat) have a YMZ280B on-board that isn't hooked up to ROM, so be safe. */
+ m_mem_base = region()->base();
+ m_mem_size = region()->bytes();
+ }
+
for (int i = 0; i < 8; i++)
{
m_voice[i].timer = timer_alloc(i);
@@ -595,7 +600,7 @@ void ymz280b_device::device_start()
/* allocate memory */
assert(MAX_SAMPLE_CHUNK < 0x10000);
- m_scratch = auto_alloc_array(machine(), INT16, MAX_SAMPLE_CHUNK);
+ m_scratch = std::make_unique<INT16[]>(MAX_SAMPLE_CHUNK);
/* state save */
save_item(NAME(m_current_register));
diff --git a/src/devices/sound/ymz280b.h b/src/devices/sound/ymz280b.h
index 4f53d955499..44cd6e16665 100644
--- a/src/devices/sound/ymz280b.h
+++ b/src/devices/sound/ymz280b.h
@@ -121,7 +121,7 @@ private:
UINT8 *m_mem_base; /* pointer to the base of external memory */
UINT32 m_mem_size;
sound_stream *m_stream; /* which stream are we using */
- INT16 *m_scratch;
+ std::unique_ptr<INT16[]> m_scratch;
#if MAKE_WAVS
void *m_wavresample; /* resampled waveform */
#endif
diff --git a/src/devices/sound/zsg2.cpp b/src/devices/sound/zsg2.cpp
index f7f7f53ae16..805acd892cc 100644
--- a/src/devices/sound/zsg2.cpp
+++ b/src/devices/sound/zsg2.cpp
@@ -88,12 +88,12 @@ void zsg2_device::device_start()
m_stream = stream_alloc(0, 2, clock() / 768);
m_mem_blocks = m_mem_base.length();
- m_mem_copy = auto_alloc_array_clear(machine(), UINT32, m_mem_blocks);
- m_full_samples = auto_alloc_array_clear(machine(), INT16, m_mem_blocks * 4 + 4); // +4 is for empty block
+ m_mem_copy = make_unique_clear<UINT32[]>(m_mem_blocks);
+ m_full_samples = make_unique_clear<INT16[]>(m_mem_blocks * 4 + 4); // +4 is for empty block
// register for savestates
- save_pointer(NAME(m_mem_copy), m_mem_blocks / sizeof(UINT32));
- save_pointer(NAME(m_full_samples), (m_mem_blocks * 4 + 4) / sizeof(INT16));
+ save_pointer(NAME(m_mem_copy.get()), m_mem_blocks / sizeof(UINT32));
+ save_pointer(NAME(m_full_samples.get()), (m_mem_blocks * 4 + 4) / sizeof(INT16));
save_item(NAME(m_read_address));
for (int ch = 0; ch < 48; ch++)
diff --git a/src/devices/sound/zsg2.h b/src/devices/sound/zsg2.h
index ce953a5be48..c88e2c60cc5 100644
--- a/src/devices/sound/zsg2.h
+++ b/src/devices/sound/zsg2.h
@@ -70,9 +70,9 @@ private:
required_region_ptr<UINT32> m_mem_base;
UINT32 m_read_address;
- UINT32 *m_mem_copy;
+ std::unique_ptr<UINT32[]> m_mem_copy;
UINT32 m_mem_blocks;
- INT16 *m_full_samples;
+ std::unique_ptr<INT16[]> m_full_samples;
sound_stream *m_stream;
diff --git a/src/devices/video/315_5313.cpp b/src/devices/video/315_5313.cpp
index 6a655874da4..22b63f36d5b 100644
--- a/src/devices/video/315_5313.cpp
+++ b/src/devices/video/315_5313.cpp
@@ -113,24 +113,24 @@ void sega315_5313_device::device_start()
m_32x_interrupt_func.bind_relative_to(*owner());
m_32x_scanline_helper_func.bind_relative_to(*owner());
- m_vram = auto_alloc_array(machine(), UINT16, 0x10000/2);
- m_cram = auto_alloc_array(machine(), UINT16, 0x80/2);
- m_vsram = auto_alloc_array(machine(), UINT16, 0x80/2);
- m_regs = auto_alloc_array(machine(), UINT16, 0x40/2);
- m_internal_sprite_attribute_table = auto_alloc_array(machine(), UINT16, 0x400/2);
+ m_vram = std::make_unique<UINT16[]>(0x10000/2);
+ m_cram = std::make_unique<UINT16[]>(0x80/2);
+ m_vsram = std::make_unique<UINT16[]>(0x80/2);
+ m_regs = std::make_unique<UINT16[]>(0x40/2);
+ m_internal_sprite_attribute_table = std::make_unique<UINT16[]>(0x400/2);
- memset(m_vram, 0x00, 0x10000);
- memset(m_cram, 0x00, 0x80);
- memset(m_vsram, 0x00, 0x80);
- memset(m_regs, 0x00, 0x40);
- memset(m_internal_sprite_attribute_table, 0x00, 0x400);
+ memset(m_vram.get(), 0x00, 0x10000);
+ memset(m_cram.get(), 0x00, 0x80);
+ memset(m_vsram.get(), 0x00, 0x80);
+ memset(m_regs.get(), 0x00, 0x40);
+ memset(m_internal_sprite_attribute_table.get(), 0x00, 0x400);
- save_pointer(NAME(m_vram), 0x10000/2);
- save_pointer(NAME(m_cram), 0x80/2);
- save_pointer(NAME(m_vsram), 0x80/2);
- save_pointer(NAME(m_regs), 0x40/2);
- save_pointer(NAME(m_internal_sprite_attribute_table), 0x400/2);
+ save_pointer(NAME(m_vram.get()), 0x10000/2);
+ save_pointer(NAME(m_cram.get()), 0x80/2);
+ save_pointer(NAME(m_vsram.get()), 0x80/2);
+ save_pointer(NAME(m_regs.get()), 0x40/2);
+ save_pointer(NAME(m_internal_sprite_attribute_table.get()), 0x400/2);
save_item(NAME(m_command_pending));
save_item(NAME(m_command_part1));
@@ -152,42 +152,42 @@ void sega315_5313_device::device_start()
save_item(NAME(m_vblank_flag));
save_item(NAME(m_total_scanlines));
- m_sprite_renderline = auto_alloc_array(machine(), UINT8, 1024);
- m_highpri_renderline = auto_alloc_array(machine(), UINT8, 320);
- m_video_renderline = auto_alloc_array(machine(), UINT32, 320);
+ m_sprite_renderline = std::make_unique<UINT8[]>(1024);
+ m_highpri_renderline = std::make_unique<UINT8[]>(320);
+ m_video_renderline = std::make_unique<UINT32[]>(320);
- m_palette_lookup = auto_alloc_array(machine(), UINT16, 0x40);
- m_palette_lookup_sprite = auto_alloc_array(machine(), UINT16, 0x40);
+ m_palette_lookup = std::make_unique<UINT16[]>(0x40);
+ m_palette_lookup_sprite = std::make_unique<UINT16[]>(0x40);
- m_palette_lookup_shadow = auto_alloc_array(machine(), UINT16, 0x40);
- m_palette_lookup_highlight = auto_alloc_array(machine(), UINT16, 0x40);
+ m_palette_lookup_shadow = std::make_unique<UINT16[]>(0x40);
+ m_palette_lookup_highlight = std::make_unique<UINT16[]>(0x40);
- memset(m_palette_lookup,0x00,0x40*2);
- memset(m_palette_lookup_sprite,0x00,0x40*2);
+ memset(m_palette_lookup.get(),0x00,0x40*2);
+ memset(m_palette_lookup_sprite.get(),0x00,0x40*2);
- memset(m_palette_lookup_shadow,0x00,0x40*2);
- memset(m_palette_lookup_highlight,0x00,0x40*2);
+ memset(m_palette_lookup_shadow.get(),0x00,0x40*2);
+ memset(m_palette_lookup_highlight.get(),0x00,0x40*2);
if (!m_use_alt_timing)
- m_render_bitmap = auto_bitmap_ind16_alloc(machine(), 320, 512); // allocate maximum sizes we're going to use, it's safer.
+ m_render_bitmap = std::make_unique<bitmap_ind16>(320, 512); // allocate maximum sizes we're going to use, it's safer.
else
- m_render_line = auto_alloc_array(machine(), UINT16, 320);
+ m_render_line = std::make_unique<UINT16[]>(320);
- m_render_line_raw = auto_alloc_array(machine(), UINT16, 320);
+ m_render_line_raw = std::make_unique<UINT16[]>(320);
// FIXME: are these all needed? I'm pretty sure some of these (most?) are just helpers which don't need to be saved,
// but better safe than sorry...
- save_pointer(NAME(m_sprite_renderline), 1024);
- save_pointer(NAME(m_highpri_renderline), 320);
- save_pointer(NAME(m_video_renderline), 320/4);
- save_pointer(NAME(m_palette_lookup), 0x40);
- save_pointer(NAME(m_palette_lookup_sprite), 0x40);
- save_pointer(NAME(m_palette_lookup_shadow), 0x40);
- save_pointer(NAME(m_palette_lookup_highlight), 0x40);
- save_pointer(NAME(m_render_line_raw), 320/2);
+ save_pointer(NAME(m_sprite_renderline.get()), 1024);
+ save_pointer(NAME(m_highpri_renderline.get()), 320);
+ save_pointer(NAME(m_video_renderline.get()), 320/4);
+ save_pointer(NAME(m_palette_lookup.get()), 0x40);
+ save_pointer(NAME(m_palette_lookup_sprite.get()), 0x40);
+ save_pointer(NAME(m_palette_lookup_shadow.get()), 0x40);
+ save_pointer(NAME(m_palette_lookup_highlight.get()), 0x40);
+ save_pointer(NAME(m_render_line_raw.get()), 320/2);
if (m_use_alt_timing)
- save_pointer(NAME(m_render_line), 320/2);
+ save_pointer(NAME(m_render_line.get()), 320/2);
m_irq6_on_timer = machine().scheduler().timer_alloc(FUNC(irq6_on_timer_callback), (void*)this);
m_irq4_on_timer = machine().scheduler().timer_alloc(FUNC(irq4_on_timer_callback), (void*)this);
@@ -1310,7 +1310,7 @@ void sega315_5313_device::render_spriteline_to_spritebuffer(int scanline)
/* Clear our Render Buffer */
- memset(m_sprite_renderline, 0, 1024);
+ memset(m_sprite_renderline.get(), 0, 1024);
{
@@ -1319,7 +1319,7 @@ void sega315_5313_device::render_spriteline_to_spritebuffer(int scanline)
int drawypos;
int /*drawwidth,*/ drawheight;
int spritemask = 0;
- UINT8 height,width=0,link=0,xflip,yflip,colour,pri;
+ UINT8 height,width,link,xflip,yflip,colour,pri;
/* Get Sprite Attribs */
spritenum = 0;
@@ -1506,7 +1506,7 @@ void sega315_5313_device::render_videoline_to_videobuffer(int scanline)
int x;
int window_hsize=0;
int window_vsize=0;
- int window_is_bugged = 0;
+ int window_is_bugged;
int non_window_firstcol;
int non_window_lastcol;
int screenheight = MEGADRIVE_REG01_240_LINE?240:224;
@@ -1517,7 +1517,7 @@ void sega315_5313_device::render_videoline_to_videobuffer(int scanline)
m_video_renderline[x]=MEGADRIVE_REG07_BGCOLOUR | 0x20000; // mark as BG
}
- memset(m_highpri_renderline, 0, 320);
+ memset(m_highpri_renderline.get(), 0, 320);
/* is this line enabled? */
if (!MEGADRIVE_REG01_DISP_ENABLE)
@@ -2518,7 +2518,7 @@ void sega315_5313_device::render_videobuffer_to_screenbuffer(int scanline)
}
else
- lineptr = m_render_line;
+ lineptr = m_render_line.get();
for (int x = 0; x < 320; x++)
{
diff --git a/src/devices/video/315_5313.h b/src/devices/video/315_5313.h
index 90f5f0a1cd2..d7ca05ee2e6 100644
--- a/src/devices/video/315_5313.h
+++ b/src/devices/video/315_5313.h
@@ -240,9 +240,9 @@ public:
m_render_bitmap->fill(0);
}
- bitmap_ind16* m_render_bitmap;
- UINT16* m_render_line;
- UINT16* m_render_line_raw;
+ std::unique_ptr<bitmap_ind16> m_render_bitmap;
+ std::unique_ptr<UINT16[]> m_render_line;
+ std::unique_ptr<UINT16[]> m_render_line_raw;
TIMER_DEVICE_CALLBACK_MEMBER( megadriv_scanline_timer_callback_alt_timing );
TIMER_DEVICE_CALLBACK_MEMBER( megadriv_scanline_timer_callback );
@@ -295,13 +295,13 @@ private:
int m_use_cram; // c2 uses it's own palette ram, so it sets this to 0
int m_dma_delay; // SVP and SegaCD have some 'lag' in DMA transfers
- UINT16* m_regs;
- UINT16* m_vram;
- UINT16* m_cram;
- UINT16* m_vsram;
+ std::unique_ptr<UINT16[]> m_regs;
+ std::unique_ptr<UINT16[]> m_vram;
+ std::unique_ptr<UINT16[]> m_cram;
+ std::unique_ptr<UINT16[]> m_vsram;
/* The VDP keeps a 0x400 byte on-chip cache of the Sprite Attribute Table
to speed up processing, Castlevania Bloodlines abuses this on the upside down level */
- UINT16* m_internal_sprite_attribute_table;
+ std::unique_ptr<UINT16[]> m_internal_sprite_attribute_table;
// these are used internally by the VDP to schedule when after the start of a scanline
// to trigger the various interrupts / rendering to our bitmap, bit of a hack really
@@ -342,13 +342,13 @@ private:
void render_videobuffer_to_screenbuffer(int scanline);
/* variables used during emulation - not saved */
- UINT8* m_sprite_renderline;
- UINT8* m_highpri_renderline;
- UINT32* m_video_renderline;
- UINT16* m_palette_lookup;
- UINT16* m_palette_lookup_sprite; // for C2
- UINT16* m_palette_lookup_shadow;
- UINT16* m_palette_lookup_highlight;
+ std::unique_ptr<UINT8[]> m_sprite_renderline;
+ std::unique_ptr<UINT8[]> m_highpri_renderline;
+ std::unique_ptr<UINT32[]> m_video_renderline;
+ std::unique_ptr<UINT16[]> m_palette_lookup;
+ std::unique_ptr<UINT16[]> m_palette_lookup_sprite; // for C2
+ std::unique_ptr<UINT16[]> m_palette_lookup_shadow;
+ std::unique_ptr<UINT16[]> m_palette_lookup_highlight;
address_space *m_space68k;
m68000_base_device* m_cpu68k;
diff --git a/src/devices/video/clgd542x.cpp b/src/devices/video/clgd542x.cpp
index 854611d1c80..f7950c879a9 100644
--- a/src/devices/video/clgd542x.cpp
+++ b/src/devices/video/clgd542x.cpp
@@ -1094,7 +1094,7 @@ WRITE8_MEMBER(cirrus_gd5428_device::port_03d0_w)
UINT8 cirrus_gd5428_device::cirrus_crtc_reg_read(UINT8 index)
{
- UINT8 res = 0xff;
+ UINT8 res;
switch(index)
{
diff --git a/src/devices/video/ef9340_1.cpp b/src/devices/video/ef9340_1.cpp
index 1875ef3cf15..39654a32ba9 100644
--- a/src/devices/video/ef9340_1.cpp
+++ b/src/devices/video/ef9340_1.cpp
@@ -234,7 +234,7 @@ void ef9340_1_device::ef9341_write( UINT8 command, UINT8 b, UINT8 data )
UINT8 ef9340_1_device::ef9341_read( UINT8 command, UINT8 b )
{
- UINT8 data = 0xFF;
+ UINT8 data;
logerror("ef9341 %s read, t%s\n", command ? "command" : "data", b ? "B" : "A" );
if ( command )
diff --git a/src/devices/video/ef9365.cpp b/src/devices/video/ef9365.cpp
index 8cb14fe1782..f923cfd0813 100644
--- a/src/devices/video/ef9365.cpp
+++ b/src/devices/video/ef9365.cpp
@@ -1,30 +1,135 @@
// license:BSD-3-Clause
-// copyright-holders:Jean-François DEL NERO
+// copyright-holders:Jean-Francois DEL NERO
+
/*********************************************************************
ef9365.c
- Thomson EF9365 video controller emulator code
-
+ Thomson EF9365/EF9366 video controller emulator code
+
+ The EF9365/EF9366 is a video controller driving a frame buffer
+ and having built-in vectors and characters drawing engines.
+ This is natively a "black and white" chip (1 bitplane),
+ but it is possible to add more bitplanes to have colors with a
+ hardware trick. The system don't have direct access to the video
+ memory, but indirect access is possible through the 0x0F command
+ and some hardware glue logics.
+ The current implementation emulate the main functions :
+
+ Video modes supported (Hardware implementation dependent):
+ - 256 x 256 (EF9365 with 4 bits shifters per bitplane and FMAT to VSS)
+ - 512 x 512 interlaced (EF9365 with 8 bits shifters per bitplane and FMAT to VCC)
+ - 512 x 256 non interlaced (EF9366 with 8 bits shifters per bitplane)
+ - 128 x 128 (EF9365 with 2 bits shifters per bitplane and FMAT to VSS)
+ - 64 x 64 (EF9365 with FMAT to VSS)
+
+ - 1 bitplane up to 8 bitplanes hardware configuration.
+ - 2 up to 256 colors fixed palette.
+
+ Character & block drawing :
+ - Normal / Titled mode
+ - Horizontal / Vertical orientation
+ - P & Q Zoom factors (1 up to 16)
+
+ Vector drawing :
+ - Normal / Dotted / Dashed / Dotted-Dashed mode
+ - All directions and size supported.
+
+ General :
+ - Clear Screen
+ - Fill Screen
+ - Clear X & Y registers
+ - Video RAM readback supported (Command 0x0F)
+
+ What is NOT yet currently implemented:
+ - Light pen support
+ (To be done when i will find a software using the lightpen)
+
+ What is implemented but not really tested:
+ - Interrupts output.
+ My target system (Squale Apollo 7) doesn't use the interruption
+ for this chip. So i add the interrupt line support, but
+ bug(s) is possible.
+
+ The needed charset file charset_ef9365.rom (CRC 8d3053be) is available
+ there : http://hxc2001.free.fr/Squale/rom/charset_ef9365.zip
+ This ROM charset is into the EF9365/EF9366.
+
+ To see how to use this driver, have a look to the Squale machine
+ driver (squale.cpp).
+ If you have any question, don't hesitate to contact me at the email
+ present on this website : http://hxc2001.free.fr/
+
+ 12/29/2015
+ Jean-Francois DEL NERO
*********************************************************************/
#include "emu.h"
#include "ef9365.h"
-//**************************************************************************
-// GLOBAL VARIABLES
-//**************************************************************************
+#ifdef DBGMODE
+//-------------------------------------------------
+// Some debug mode const strings
+// to trace the commands and registers accesses.
+//-------------------------------------------------
+
+// Registers list
+const char * register_names[]=
+{
+ "0x00 - CMD / STATUS",
+ "0x01 - CTRL 1 ",
+ "0x02 - CTRL 2 ",
+ "0x03 - CSIZE ",
+ "0x04 - RESERVED ",
+ "0x05 - DELTA X ",
+ "0x06 - RESERVED ",
+ "0x07 - DELTA Y ",
+ "0x08 - X MSBs ",
+ "0x09 - X LSBs ",
+ "0x0A - Y MSBs ",
+ "0x0B - Y LSBs ",
+ "0x0C - XLP ",
+ "0x0D - YLP ",
+ "0x0E - RESERVED ",
+ "0x0F - RESERVED "
+};
+
+// Commands list
+const char * commands_names[]=
+{
+ "0x00 - Set bit 1 of CTRL1 : Pen selection",
+ "0x01 - Clear bit 1 of CTRL1 : Eraser selection",
+ "0x02 - Set bit 0 of CTRL1 : Pen/Eraser down selection",
+ "0x03 - Clear bit 0 of CTRL1 : Pen/Eraser up selection",
+ "0x04 - Clear screen",
+ "0x05 - X and Y registers reset to 0",
+ "0x06 - X and Y registers reset to 0 and clear screen",
+ "0x07 - Clear screen, set CSIZE to code \"minsize\". All other registers reset to 0",
+ "0x08 - Light-pen initialization (/White forced low)",
+ "0x09 - Light-pen initialization",
+ "0x0A - 5x8 block drawing (size according to CSIZE)",
+ "0x0B - 4x4 block drawing (size according to CSIZE)",
+ "0x0C - Screen scanning : pen or Eraser as defined by CTRL1",
+ "0x0D - X reset to 0",
+ "0x0E - Y reset to 0",
+ "0x0F - Direct image memory access request for the next free cycle.",
+ "0x10<>0x17 - Vector generation",
+ "0x18<>0x1F - Special direction vectors",
+ "0x20<>0x7F - Character Drawing",
+ "0x80<>0xFF - Small vector generation",
+};
+
+#endif
// devices
const device_type EF9365 = &device_creator<ef9365_device>;
+//-------------------------------------------------
// default address map
-// Up to 4 bitplans @ 256*256
+// Up to 512*512 per bitplane, 8 bitplanes max.
+//-------------------------------------------------
static ADDRESS_MAP_START( ef9365, AS_0, 8, ef9365_device )
- AM_RANGE(0x0000, 0x1fff) AM_RAM
- AM_RANGE(0x2000, 0x3fff) AM_RAM
- AM_RANGE(0x4000, 0x5fff) AM_RAM
- AM_RANGE(0x6000, 0x7fff) AM_RAM
+ AM_RANGE(0x00000, ( ( EF936X_BITPLANE_MAX_SIZE * EF936X_MAX_BITPLANES ) - 1 ) ) AM_RAM
ADDRESS_MAP_END
//-------------------------------------------------
@@ -54,9 +159,11 @@ ef9365_device::ef9365_device(const machine_config &mconfig, const char *tag, dev
device_t(mconfig, EF9365, "EF9365", tag, owner, clock, "ef9365", __FILE__),
device_memory_interface(mconfig, *this),
device_video_interface(mconfig, *this),
- m_space_config("videoram", ENDIANNESS_LITTLE, 8, 16, 0, nullptr, *ADDRESS_MAP_NAME(ef9365)),
- m_palette(*this)
+ m_space_config("videoram", ENDIANNESS_LITTLE, 8, 18, 0, nullptr, *ADDRESS_MAP_NAME(ef9365)),
+ m_palette(*this),
+ m_irq_handler(*this)
{
+ clock_freq = clock;
}
//-------------------------------------------------
@@ -70,26 +177,97 @@ void ef9365_device::static_set_palette_tag(device_t &device, const char *tag)
}
//-------------------------------------------------
-// static_set_color_filler: Set the color value
-// used by the chip to draw/fill the memory
+// static_set_nb_of_bitplanes: Set the number of bitplanes
//-------------------------------------------------
-void ef9365_device::static_set_color_filler( UINT8 color )
+void ef9365_device::static_set_nb_bitplanes(device_t &device, int nb_bitplanes )
{
- m_current_color = color;
+ if( nb_bitplanes > 0 && nb_bitplanes <= 8 )
+ {
+ downcast<ef9365_device &>(device).nb_of_bitplanes = nb_bitplanes;
+ downcast<ef9365_device &>(device).nb_of_colors = pow(2,nb_bitplanes);
+ }
+}
+
+//-------------------------------------------------
+// static_set_display_mode: Set the display mode
+//-------------------------------------------------
+
+void ef9365_device::static_set_display_mode(device_t &device, int display_mode )
+{
+ switch(display_mode)
+ {
+ case EF936X_256x256_DISPLAY_MODE:
+ downcast<ef9365_device &>(device).bitplane_xres = 256;
+ downcast<ef9365_device &>(device).bitplane_yres = 256;
+ downcast<ef9365_device &>(device).vsync_scanline_pos = 250;
+ downcast<ef9365_device &>(device).overflow_mask_x = 0xFF00;
+ downcast<ef9365_device &>(device).overflow_mask_y = 0xFF00;
+ break;
+ case EF936X_512x512_DISPLAY_MODE:
+ downcast<ef9365_device &>(device).bitplane_xres = 512;
+ downcast<ef9365_device &>(device).bitplane_yres = 512;
+ downcast<ef9365_device &>(device).vsync_scanline_pos = 506;
+ downcast<ef9365_device &>(device).overflow_mask_x = 0xFE00;
+ downcast<ef9365_device &>(device).overflow_mask_y = 0xFE00;
+ break;
+ case EF936X_512x256_DISPLAY_MODE:
+ downcast<ef9365_device &>(device).bitplane_xres = 512;
+ downcast<ef9365_device &>(device).bitplane_yres = 256;
+ downcast<ef9365_device &>(device).vsync_scanline_pos = 250;
+ downcast<ef9365_device &>(device).overflow_mask_x = 0xFE00;
+ downcast<ef9365_device &>(device).overflow_mask_y = 0xFF00;
+ break;
+ case EF936X_128x128_DISPLAY_MODE:
+ downcast<ef9365_device &>(device).bitplane_xres = 128;
+ downcast<ef9365_device &>(device).bitplane_yres = 128;
+ downcast<ef9365_device &>(device).vsync_scanline_pos = 124;
+ downcast<ef9365_device &>(device).overflow_mask_x = 0xFF80;
+ downcast<ef9365_device &>(device).overflow_mask_y = 0xFF80;
+ break;
+ case EF936X_64x64_DISPLAY_MODE:
+ downcast<ef9365_device &>(device).bitplane_xres = 64;
+ downcast<ef9365_device &>(device).bitplane_yres = 64;
+ downcast<ef9365_device &>(device).vsync_scanline_pos = 62;
+ downcast<ef9365_device &>(device).overflow_mask_x = 0xFFC0;
+ downcast<ef9365_device &>(device).overflow_mask_y = 0xFFC0;
+ break;
+ default:
+ downcast<ef9365_device &>(device).logerror("Invalid EF9365 Display mode: %02x\n", display_mode);
+ downcast<ef9365_device &>(device).bitplane_xres = 256;
+ downcast<ef9365_device &>(device).bitplane_yres = 256;
+ downcast<ef9365_device &>(device).vsync_scanline_pos = 250;
+ downcast<ef9365_device &>(device).overflow_mask_x = 0xFF00;
+ downcast<ef9365_device &>(device).overflow_mask_y = 0xFF00;
+ break;
+ }
}
//-------------------------------------------------
-// static_set_color_entry: Set the color value
+// set_color_entry: Set the color value
// into the palette
//-------------------------------------------------
-void ef9365_device::static_set_color_entry( int index, UINT8 r, UINT8 g, UINT8 b )
+void ef9365_device::set_color_entry( int index, UINT8 r, UINT8 g, UINT8 b )
{
- if( index < 16 )
+ if( index < nb_of_colors )
{
palette[index] = rgb_t(r, g, b);
}
+ else
+ {
+ logerror("Invalid EF9365 Palette entry : %02x\n", index);
+ }
+}
+
+//-------------------------------------------------
+// set_color_filler: Set the color number
+// used by the chip to draw/fill the memory
+//-------------------------------------------------
+
+void ef9365_device::set_color_filler( UINT8 color )
+{
+ m_current_color = color;
}
//-------------------------------------------------
@@ -100,12 +278,19 @@ void ef9365_device::device_start()
{
int i;
+ m_irq_handler.resolve_safe();
+
m_busy_timer = timer_alloc(BUSY_TIMER);
m_videoram = &space(0);
m_charset = region();
m_current_color = 0x0F;
+ m_irq_vb = 0;
+ m_irq_lb = 0;
+ m_irq_rdy = 0;
+ m_irq_state = 0;
+
// Default palette : Black and white
palette[0] = rgb_t(0, 0, 0);
for( i = 1; i < 16 ; i++ )
@@ -113,23 +298,34 @@ void ef9365_device::device_start()
palette[i] = rgb_t(255, 255, 255);
}
- m_screen_out.allocate(496, m_screen->height());
+ m_screen_out.allocate( bitplane_xres, m_screen->height() );
save_item(NAME(m_border));
save_item(NAME(m_registers));
save_item(NAME(m_bf));
save_item(NAME(m_state));
+ save_item(NAME(m_irq_state));
+ save_item(NAME(m_irq_vb));
+ save_item(NAME(m_irq_lb));
+ save_item(NAME(m_irq_rdy));
+
save_item(NAME(m_screen_out));
}
//-------------------------------------------------
// device_reset - device-specific reset
//-------------------------------------------------
+
void ef9365_device::device_reset()
{
m_state = 0;
+
m_bf = 0;
+ m_irq_state = 0;
+ m_irq_vb = 0;
+ m_irq_lb = 0;
+ m_irq_rdy = 0;
memset(m_registers, 0, sizeof(m_registers));
memset(m_border, 0, sizeof(m_border));
@@ -137,32 +333,104 @@ void ef9365_device::device_reset()
m_screen_out.fill(0);
set_video_mode();
+
+ m_irq_handler(FALSE);
+}
+
+//-------------------------------------------------
+// update_interrupts
+//-------------------------------------------------
+void ef9365_device::update_interrupts()
+{
+ int new_state = ( m_irq_vb && (m_registers[EF936X_REG_CTRL1] & 0x20) )
+ || ( m_irq_rdy && (m_registers[EF936X_REG_CTRL1] & 0x40) )
+ || ( m_irq_lb && (m_registers[EF936X_REG_CTRL1] & 0x10) );
+
+ if (new_state != m_irq_state)
+ {
+ m_irq_state = new_state;
+ m_irq_handler(m_irq_state);
+ }
}
//-------------------------------------------------
// device_timer - handler timer events
//-------------------------------------------------
+
void ef9365_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{
switch(id)
{
case BUSY_TIMER:
m_bf = 0;
+
+ if( m_registers[EF936X_REG_CTRL1] & 0x40 )
+ {
+ m_irq_rdy = 1;
+ }
+
+ update_interrupts();
+
break;
}
}
-// set busy flag and timer to clear it
+//-------------------------------------------------
+// set_busy_flag: set busy flag and
+// timer to clear it
+//-------------------------------------------------
+
void ef9365_device::set_busy_flag(int period)
{
m_bf = 1;
m_busy_timer->adjust(attotime::from_usec(period));
}
-// set then ef9365 mode
+//-------------------------------------------------
+// get_x_reg: Get the X register value
+//-------------------------------------------------
+
+unsigned int ef9365_device::get_x_reg()
+{
+ return (m_registers[EF936X_REG_X_MSB]<<8) | m_registers[EF936X_REG_X_LSB];
+}
+
+//-------------------------------------------------
+// get_y_reg: Get the Y register value
+//-------------------------------------------------
+
+unsigned int ef9365_device::get_y_reg()
+{
+ return (m_registers[EF936X_REG_Y_MSB]<<8) | m_registers[EF936X_REG_Y_LSB];
+}
+
+//-------------------------------------------------
+// set_x_reg: Set the X register value
+//-------------------------------------------------
+
+void ef9365_device::set_x_reg(unsigned int x)
+{
+ m_registers[EF936X_REG_X_MSB] = x >> 8;
+ m_registers[EF936X_REG_X_LSB] = x & 0xFF;
+}
+
+//-------------------------------------------------
+// set_y_reg: Set the Y register value
+//-------------------------------------------------
+
+void ef9365_device::set_y_reg(unsigned int y)
+{
+ m_registers[EF936X_REG_Y_MSB] = y >> 8;
+ m_registers[EF936X_REG_Y_LSB] = y & 0xFF;
+}
+
+//-------------------------------------------------
+// set_video_mode: Set output screen format
+//-------------------------------------------------
+
void ef9365_device::set_video_mode(void)
{
- UINT16 new_width = 256;
+ UINT16 new_width = bitplane_xres;
if (m_screen->width() != new_width)
{
@@ -176,20 +444,317 @@ void ef9365_device::set_video_mode(void)
memset(m_border, 0, sizeof(m_border));
}
+//-------------------------------------------------
+// get_last_readback_word: Read back the latched
+// bitplane words
+//-------------------------------------------------
+
+UINT8 ef9365_device::get_last_readback_word(int bitplane_number, int * pixel_offset)
+{
+ if( pixel_offset )
+ *pixel_offset = m_readback_latch_pix_offset;
+
+ if( bitplane_number < nb_of_bitplanes )
+ {
+ return m_readback_latch[bitplane_number];
+ }
+ else
+ {
+ return 0x00;
+ }
+}
+
+//-------------------------------------------------
+// draw_border: Draw the left and right borders
+// ( No border for the moment ;) )
+//-------------------------------------------------
+
void ef9365_device::draw_border(UINT16 line)
{
+}
+
+//-------------------------------------------------
+// plot: Plot a pixel to the bitplanes
+// at the x & y position with the m_current_color color
+//-------------------------------------------------
+
+void ef9365_device::plot(int x_pos,int y_pos)
+{
+ int p;
+ if( ( x_pos >= 0 && y_pos >= 0 ) && ( x_pos < bitplane_xres && y_pos < bitplane_yres ) )
+ {
+ if ( m_registers[EF936X_REG_CTRL1] & 0x01 )
+ {
+ y_pos = ( (bitplane_yres - 1) - y_pos );
+
+ if( (m_registers[EF936X_REG_CTRL1] & 0x02) )
+ {
+ // Pen
+ for( p = 0 ; p < nb_of_bitplanes ; p++ )
+ {
+ if( m_current_color & (0x01 << p) )
+ m_videoram->write_byte ( (EF936X_BITPLANE_MAX_SIZE*p) + (((y_pos*bitplane_xres) + x_pos)>>3), m_videoram->read_byte( (EF936X_BITPLANE_MAX_SIZE*p) + (((y_pos*bitplane_xres) + x_pos)>>3)) | (0x80 >> (((y_pos*bitplane_xres) + x_pos)&7) ) );
+ else
+ m_videoram->write_byte ( (EF936X_BITPLANE_MAX_SIZE*p) + (((y_pos*bitplane_xres) + x_pos)>>3), m_videoram->read_byte( (EF936X_BITPLANE_MAX_SIZE*p) + (((y_pos*bitplane_xres) + x_pos)>>3)) & ~(0x80 >> (((y_pos*bitplane_xres) + x_pos)&7) ) );
+ }
+ }
+ else
+ {
+ // Eraser
+ for( p = 0 ; p < nb_of_bitplanes ; p++ )
+ {
+ m_videoram->write_byte ( (EF936X_BITPLANE_MAX_SIZE*p) + (((y_pos*bitplane_xres) + x_pos)>>3), m_videoram->read_byte( (EF936X_BITPLANE_MAX_SIZE*p) + (((y_pos*bitplane_xres) + x_pos)>>3)) | (0x80 >> (((y_pos*bitplane_xres) + x_pos)&7) ) );
+ }
+ }
+ }
+ }
}
-void ef9365_device::draw_character( unsigned char c, int block, int smallblock )
+
+const static unsigned int vectortype_code[][8] =
+{
+ {0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // Continous drawing
+ {0x82,0x02,0x00,0x00,0x00,0x00,0x00,0x00}, // Dotted - 2 dots on, 2 dots off
+ {0x84,0x04,0x00,0x00,0x00,0x00,0x00,0x00}, // Dashed - 4 dots on, 4 dots off
+ {0x8A,0x02,0x82,0x02,0x00,0x00,0x00,0x00} // Dotted-Dashed - 10 dots on, 2 dots off, 2 dots on, 2 dots off
+};
+
+//-------------------------------------------------
+// draw_vector: Vector drawing function
+// from the x1 & y1 position to the x2 & y2 position
+// with the m_current_color color
+// (Bresenham's line algorithm)
+//-------------------------------------------------
+
+int ef9365_device::draw_vector(int x1,int y1,int x2,int y2)
+{
+ int dx;
+ int dy,t;
+ int e;
+ int x,y;
+ int incy;
+ int diago,horiz;
+ unsigned char c1;
+
+ int pen_state;
+ unsigned int state_counter;
+ int dot_code_ptr;
+ int compute_cycles;
+
+ compute_cycles = 0;
+
+ c1=0;
+ incy=1;
+
+ dot_code_ptr = 0;
+ state_counter = vectortype_code[m_registers[EF936X_REG_CTRL2] & 0x3][dot_code_ptr&7];
+ if(state_counter&0x80)
+ pen_state = 1;
+ else
+ pen_state = 0;
+ state_counter &= ~0x80;
+
+ if(x2>x1)
+ dx = x2 - x1;
+ else
+ dx = x1 - x2;
+
+ if(y2>y1)
+ dy = y2 - y1;
+ else
+ dy = y1 - y2;
+
+ if( dy > dx )
+ {
+ t = y2;
+ y2 = x2;
+ x2 = t;
+
+ t = y1;
+ y1 = x1;
+ x1 = t;
+
+ t = dx;
+ dx = dy;
+ dy = t;
+
+ c1 = 1;
+ }
+
+ if( x1 > x2 )
+ {
+ t = y2;
+ y2 = y1;
+ y1 = t;
+
+ t = x1;
+ x1 = x2;
+ x2 = t;
+ }
+
+ horiz = dy<<1;
+ diago = ( dy - dx )<<1;
+ e = ( dy<<1 ) - dx;
+
+ if( y1 <= y2 )
+ incy = 1;
+ else
+ incy = -1;
+
+ x = x1;
+ y = y1;
+
+ if(c1)
+ {
+ do
+ {
+ if(pen_state)
+ plot(y,x);
+
+ compute_cycles++;
+
+ set_x_reg(y);
+ set_y_reg(x);
+
+ state_counter--;
+
+ if( !state_counter )
+ {
+ dot_code_ptr++;
+
+ state_counter = vectortype_code[m_registers[EF936X_REG_CTRL2] & 0x3][dot_code_ptr&7];
+
+ if(!state_counter)
+ {
+ dot_code_ptr = 0;
+ state_counter = vectortype_code[m_registers[EF936X_REG_CTRL2] & 0x3][dot_code_ptr&7];
+ }
+
+ if( state_counter & 0x80 )
+ {
+ pen_state = 1;
+ }
+ else
+ {
+ pen_state = 0;
+ }
+
+ state_counter &= ~0x80;
+ }
+
+ if( e > 0 )
+ {
+ y = y + incy;
+ e = e + diago;
+ }
+ else
+ {
+ e = e + horiz;
+ }
+
+ x++;
+
+ }while( x <= x2 );
+ }
+ else
+ {
+ do
+ {
+ if(pen_state)
+ plot(x,y);
+
+ compute_cycles++;
+
+ set_x_reg(x);
+ set_y_reg(y);
+
+ state_counter--;
+
+ if( !state_counter )
+ {
+ dot_code_ptr++;
+
+ state_counter = vectortype_code[m_registers[EF936X_REG_CTRL2] & 0x3][dot_code_ptr&7];
+
+ if(!state_counter)
+ {
+ dot_code_ptr = 0;
+ state_counter = vectortype_code[m_registers[EF936X_REG_CTRL2] & 0x3][dot_code_ptr&7];
+ }
+
+ if( state_counter & 0x80 )
+ {
+ pen_state = 1;
+ }
+ else
+ {
+ pen_state = 0;
+ }
+
+ state_counter &= ~0x80;
+ }
+
+ if( e > 0 )
+ {
+ y = y + incy;
+ e = e + diago;
+ }
+ else
+ {
+ e = e + horiz;
+ }
+
+ x++;
+
+ }while( x <= x2 );
+ }
+
+ return compute_cycles;
+}
+
+//-------------------------------------------------
+// get_char_pix: Get a character pixel state
+// from the charset.
+//-------------------------------------------------
+
+int ef9365_device::get_char_pix( unsigned char c, int x, int y )
{
- int x_char,y_char;
int char_base,char_pix;
- unsigned int x, y, p;
+
+ if(c<96)
+ {
+ if( x < 5 && y < 8 )
+ {
+ char_base = c * 5;
+ char_pix = ( y * 5 ) + x;
+
+ if ( m_charset->u8(char_base + (char_pix>>3) ) & ( 0x80 >> (char_pix&7)) )
+ return 1;
+ else
+ return 0;
+ }
+ }
+
+ return 0;
+}
+
+//-------------------------------------------------
+// draw_character: Character and block drawing function
+// Set smallblock to draw a 4x4 block
+// Set block to draw a 5x8 block
+//-------------------------------------------------
+
+int ef9365_device::draw_character( unsigned char c, int block, int smallblock )
+{
+ int x_char,y_char;
+ unsigned int x, y;
int x_char_res,y_char_res;
+ int p_factor,q_factor,p,q;
+ int compute_cycles;
- x = ( (m_registers[EF9365_REG_X_MSB]<<8) | m_registers[EF9365_REG_X_LSB]);
- y = ( (m_registers[EF9365_REG_Y_MSB]<<8) | m_registers[EF9365_REG_Y_LSB]);
+ x = get_x_reg();
+ y = get_y_reg();
x_char_res = 5;
y_char_res = 8;
@@ -201,213 +766,254 @@ void ef9365_device::draw_character( unsigned char c, int block, int smallblock )
y_char_res = 4;
}
+ p_factor = (m_registers[EF936X_REG_CSIZE] >> 4);
+ if(!p_factor)
+ p_factor = 16;
+
+ q_factor = (m_registers[EF936X_REG_CSIZE] & 0xF);
+ if(!q_factor)
+ q_factor = 16;
+
+ compute_cycles = ( ( x_char_res + 1 ) * p_factor ) * ( y_char_res * q_factor );
+
if(c<96)
{
- y = ( 256 - y ) - y_char_res;
-
- if( ( x < ( 256 - 5 ) ) && ( y < ( 256 - y_char_res ) ) )
+ for( x_char=0 ; x_char < x_char_res ; x_char++ )
{
- char_base = c * 5; // 5 bytes per char.
- char_pix = 0;
-
- if ( block )
+ for( y_char = y_char_res - 1 ; y_char >= 0 ; y_char-- )
{
- // 5x8 or 4x4 block
-
- for( y_char = 0 ; y_char < y_char_res ; y_char++ )
+ if ( block || get_char_pix( c, x_char, ( (y_char_res - 1) - y_char ) ) )
{
- for( x_char = 0 ; x_char < x_char_res ; x_char++ )
+ if( m_registers[EF936X_REG_CTRL2] & 0x04) // Titled character ?
{
- for( p = 0 ; p < 4 ; p++ )
+ for(q = 0; q < q_factor; q++)
{
- if( m_current_color & (0x01 << p) )
- m_videoram->write_byte ( (0x2000*p) + ((((y_char+y)*256) + (x_char+x))>>3), m_videoram->read_byte( (0x2000*p) + ((((y_char+y)*256) + (x_char+x))>>3)) | (0x80 >> ((((y_char+y)*256) + (x_char+x))&7) ) );
- else
- m_videoram->write_byte ( (0x2000*p) + ((((y_char+y)*256) + (x_char+x))>>3), m_videoram->read_byte( (0x2000*p) + ((((y_char+y)*256) + (x_char+x))>>3)) & ~(0x80 >> ((((y_char+y)*256) + (x_char+x))&7) ) );
+ for(p = 0; p < p_factor; p++)
+ {
+ if( !(m_registers[EF936X_REG_CTRL2] & 0x08) )
+ { // Titled - Horizontal orientation
+ plot(
+ x + ( (y_char*q_factor) + q ) + ( (x_char*p_factor) + p ),
+ y + ( (y_char*q_factor) + q )
+ );
+ }
+ else
+ {
+ // Titled - Vertical orientation
+ plot(
+ x - ( (y_char*q_factor)+ q ),
+ y + ( (x_char*p_factor)+ p ) - ( ( ( (y_char_res - 1 ) - y_char) * q_factor ) + ( q_factor - q ) )
+ );
+ }
+ }
}
- char_pix++;
}
- }
- }
- else
- {
- // 5x8 character
- for( y_char=0 ; y_char < y_char_res ;y_char++ )
- {
- for( x_char=0 ; x_char < x_char_res ; x_char++ )
+ else
{
- if ( m_charset->u8(char_base + (char_pix>>3) ) & ( 0x80 >> (char_pix&7)))
+ for(q = 0; q < q_factor; q++)
{
- for( p = 0 ; p < 4 ; p++ )
+ for(p = 0; p < p_factor; p++)
{
- if( m_current_color & (0x01 << p) )
- m_videoram->write_byte ( (0x2000*p) + ((((y_char+y)*256) + (x_char+x))>>3), m_videoram->read_byte( (0x2000*p) + ((((y_char+y)*256) + (x_char+x))>>3)) | (0x80 >> ((((y_char+y)*256) + (x_char+x))&7) ) );
+ if( !(m_registers[EF936X_REG_CTRL2] & 0x08) )
+ { // Normal - Horizontal orientation
+ plot(
+ x + ( (x_char*p_factor) + p ),
+ y + ( (y_char*q_factor) + q )
+ );
+ }
else
- m_videoram->write_byte ( (0x2000*p) + ((((y_char+y)*256) + (x_char+x))>>3), m_videoram->read_byte( (0x2000*p) + ((((y_char+y)*256) + (x_char+x))>>3)) & ~(0x80 >> ((((y_char+y)*256) + (x_char+x))&7) ) );
+ { // Normal - Vertical orientation
+ plot(
+ x - ( (y_char*q_factor) + q ),
+ y + ( (x_char*p_factor) + p )
+ );
+ }
}
}
-
- char_pix++;
}
}
}
+ }
+
+ if(!(m_registers[EF936X_REG_CTRL2] & 0x08))
+ {
+ x = x + ( (x_char_res + 1 ) * p_factor ) ;
+ set_x_reg(x);
+ }
+ else
+ {
+ y = y + ( (x_char_res + 1 ) * p_factor ) ;
+ set_x_reg(y);
+ }
+ }
- x = x + ( x_char_res + 1 );
+ return compute_cycles;
+}
+
+//-------------------------------------------------
+// cycles_to_us: Convert a number of clock cycles to us
+//-------------------------------------------------
+
+int ef9365_device::cycles_to_us(int cycles)
+{
+ return ( (float)cycles * ( (float)1000000 / (float)clock_freq ) );
+}
- m_registers[EF9365_REG_X_MSB] = x >> 8;
- m_registers[EF9365_REG_X_LSB] = x & 0xFF;
+//-------------------------------------------------
+// dump_bitplanes_word: Latch the bitplane words
+// pointed by the x & y regiters
+// (Memory read back function)
+//-------------------------------------------------
+
+void ef9365_device::dump_bitplanes_word()
+{
+ int p;
+ int pixel_ptr;
+
+ pixel_ptr = ( ( ( ( bitplane_yres - 1 ) - ( get_y_reg() & ( bitplane_yres - 1 ) ) ) * bitplane_xres ) + ( get_x_reg() & ( bitplane_xres - 1 ) ) );
+
+ #ifdef DBGMODE
+ printf("dump : x = %d , y = %d\n", get_x_reg() ,get_y_reg());
+ #endif
+
+ for( p = 0; p < nb_of_bitplanes ; p++ )
+ {
+ if( pixel_ptr & 0x4 )
+ {
+ m_readback_latch[p] = ( m_videoram->read_byte( (EF936X_BITPLANE_MAX_SIZE*p) + (pixel_ptr>>3) ) ) & 0xF ;
}
+ else
+ {
+ m_readback_latch[p] = ( m_videoram->read_byte( (EF936X_BITPLANE_MAX_SIZE*p) + (pixel_ptr>>3) ) >> 4 ) & 0xF ;
+ }
+
}
+
+ m_readback_latch_pix_offset = pixel_ptr & 0x3;
}
+//-------------------------------------------------
+// screen_scanning: Fill / Clear framebuffer memory
+//-------------------------------------------------
+
void ef9365_device::screen_scanning( int force_clear )
{
int x,y,p;
- if( (m_registers[EF9365_REG_CTRL1] & 0x02) && !force_clear )
+ if( (m_registers[EF936X_REG_CTRL1] & 0x02) && !force_clear )
{
- for( y = 0; y < 256; y++ )
+ for( y = 0; y < bitplane_yres; y++ )
{
- for( x = 0; x < 256; x++ )
+ for( x = 0; x < bitplane_xres; x++ )
{
- for( p = 0 ; p < 4 ; p++ )
+ for( p = 0 ; p < nb_of_bitplanes ; p++ )
{
if( m_current_color & (0x01 << p) )
- m_videoram->write_byte ( (0x2000*p) + (((y*256) + x)>>3), m_videoram->read_byte( (0x2000*p) + (((y*256) + x)>>3)) | (0x80 >> (((y*256) + x)&7) ) );
+ m_videoram->write_byte ( (EF936X_BITPLANE_MAX_SIZE*p) + (((y*bitplane_xres) + x)>>3), m_videoram->read_byte( (EF936X_BITPLANE_MAX_SIZE*p) + (((y*bitplane_xres) + x)>>3)) | (0x80 >> (((y*bitplane_xres) + x)&7) ) );
else
- m_videoram->write_byte ( (0x2000*p) + (((y*256) + x)>>3), m_videoram->read_byte( (0x2000*p) + (((y*256) + x)>>3)) & ~(0x80 >> (((y*256) + x)&7) ) );
+ m_videoram->write_byte ( (EF936X_BITPLANE_MAX_SIZE*p) + (((y*bitplane_xres) + x)>>3), m_videoram->read_byte( (EF936X_BITPLANE_MAX_SIZE*p) + (((y*bitplane_xres) + x)>>3)) & ~(0x80 >> (((y*bitplane_xres) + x)&7) ) );
}
}
}
}
else
{
- for( y = 0; y < 256; y++)
+ for( y = 0; y < bitplane_yres; y++)
{
- for( x = 0; x < 256; x++)
+ for( x = 0; x < bitplane_xres; x++)
{
- for( p = 0 ; p < 4 ; p++ )
+ for( p = 0 ; p < nb_of_bitplanes ; p++ )
{
- m_videoram->write_byte ( (0x2000*p) + (((y*256) + x)>>3), m_videoram->read_byte( (0x2000*p) + (((y*256) + x)>>3)) & ~(0x80 >> (((y*256) + x)&7) ) );
+ m_videoram->write_byte ( (EF936X_BITPLANE_MAX_SIZE*p) + (((y*bitplane_xres) + x)>>3), m_videoram->read_byte( (EF936X_BITPLANE_MAX_SIZE*p) + (((y*bitplane_xres) + x)>>3)) | (0x80 >> (((y*bitplane_xres) + x)&7) ) );
}
}
}
}
}
-// Execute EF9365 command
+//-------------------------------------------------
+// ef9365_exec: EF936X Command decoder and execution
+//-------------------------------------------------
+
void ef9365_device::ef9365_exec(UINT8 cmd)
{
+ int tmp_delta_x,tmp_delta_y;
+ int busy_cycles;
m_state = 0;
- set_busy_flag(4);
-
if( ( cmd>>4 ) == 0 )
{
+ #ifdef DBGMODE
+ printf("EF9365 Command : %s\n", commands_names[cmd & 0xF]);
+ #endif
+
switch(cmd & 0xF)
{
case 0x0: // Set bit 1 of CTRL1 : Pen Selection
- #ifdef DBGMODE
- printf("Set bit 1 of CTRL1 : Pen Selection\n");
- #endif
- m_registers[EF9365_REG_CTRL1] |= 0x02;
+ m_registers[EF936X_REG_CTRL1] |= 0x02;
+ set_busy_flag( cycles_to_us( 4 ) ); // Timing to check on the real hardware
break;
case 0x1: // Clear bit 1 of CTRL1 : Eraser Selection
- #ifdef DBGMODE
- printf("Clear bit 1 of CTRL1 : Eraser Selection\n");
- #endif
- m_registers[EF9365_REG_CTRL1] &= (~0x02);
+ m_registers[EF936X_REG_CTRL1] &= (~0x02);
+ set_busy_flag( cycles_to_us( 4 ) ); // Timing to check on the real hardware
break;
case 0x2: // Set bit 0 of CTRL1 : Pen/Eraser down selection
- #ifdef DBGMODE
- printf("Set bit 0 of CTRL1 : Pen/Eraser down selection\n");
- #endif
- m_registers[EF9365_REG_CTRL1] |= 0x01;
+ m_registers[EF936X_REG_CTRL1] |= 0x01;
+ set_busy_flag( cycles_to_us( 4 ) ); // Timing to check on the real hardware
break;
case 0x3: // Clear bit 0 of CTRL1 : Pen/Eraser up selection
- #ifdef DBGMODE
- printf("Clear bit 0 of CTRL1 : Pen/Eraser up selection\n");
- #endif
- m_registers[EF9365_REG_CTRL1] &= (~0x01);
+ m_registers[EF936X_REG_CTRL1] &= (~0x01);
+ set_busy_flag( cycles_to_us( 4 ) ); // Timing to check on the real hardware
break;
case 0x4: // Clear screen
- #ifdef DBGMODE
- printf("Clear screen\n");
- #endif
screen_scanning(1);
+ set_busy_flag( cycles_to_us( bitplane_xres*bitplane_yres ) ); // Timing to check on the real hardware
break;
case 0x5: // X and Y registers reset to 0
- #ifdef DBGMODE
- printf("X and Y registers reset to 0\n");
- #endif
- m_registers[EF9365_REG_X_MSB] = 0;
- m_registers[EF9365_REG_X_LSB] = 0;
-
- m_registers[EF9365_REG_Y_MSB] = 0;
- m_registers[EF9365_REG_Y_LSB] = 0;
+ set_x_reg(0);
+ set_y_reg(0);
+ set_busy_flag( cycles_to_us( 4 ) ); // Timing to check on the real hardware
break;
case 0x6: // X and Y registers reset to 0 and clear screen
- #ifdef DBGMODE
- printf("X and Y registers reset to 0 and clear screen\n");
- #endif
- m_registers[EF9365_REG_X_MSB] = 0;
- m_registers[EF9365_REG_X_LSB] = 0;
-
- m_registers[EF9365_REG_Y_MSB] = 0;
- m_registers[EF9365_REG_Y_LSB] = 0;
+ set_x_reg(0);
+ set_y_reg(0);
+ screen_scanning(1);
+ set_busy_flag( cycles_to_us( bitplane_xres*bitplane_yres ) ); // Timing to check on the real hardware
break;
case 0x7: // Clear screen, set CSIZE to code "minsize". All other registers reset to 0
- #ifdef DBGMODE
- printf("Clear screen, set CSIZE to code \"minsize\". All other registers reset to 0\n");
- #endif
+ m_registers[EF936X_REG_CSIZE] = 0x11;
screen_scanning(1);
+ set_busy_flag( cycles_to_us( bitplane_xres*bitplane_yres ) ); // Timing to check on the real hardware
break;
case 0x8: // Light-pen initialization (/White forced low)
- #ifdef DBGMODE
- printf("Light-pen initialization (/White forced low)\n");
- #endif
+ set_busy_flag( cycles_to_us( 4 ) ); // Timing to check on the real hardware
break;
case 0x9: // Light-pen initialization
- #ifdef DBGMODE
- printf("Light-pen initialization\n");
- #endif
+ set_busy_flag( cycles_to_us( 4 ) ); // Timing to check on the real hardware
break;
case 0xA: // 5x8 block drawing (size according to CSIZE)
- #ifdef DBGMODE
- printf("5x8 block drawing (size according to CSIZE)\n");
- #endif
- draw_character( 0x00 , 1 , 0 );
+ busy_cycles = draw_character( 0x00 , 1 , 0 );
+ set_busy_flag( cycles_to_us( busy_cycles ) );
break;
case 0xB: // 4x4 block drawing (size according to CSIZE)
- #ifdef DBGMODE
- printf("4x4 block drawing (size according to CSIZE)\n");
- #endif
- draw_character( 0x00 , 1 , 1 );
+ busy_cycles = draw_character( 0x00 , 1 , 1 );
+ set_busy_flag( cycles_to_us( busy_cycles ) );
break;
case 0xC: // Screen scanning : pen or Eraser as defined by CTRL1
- #ifdef DBGMODE
- printf("Screen scanning : pen or Eraser as defined by CTRL1\n");
- #endif
screen_scanning(0);
+ set_busy_flag( cycles_to_us( bitplane_xres*bitplane_yres ) ); // Timing to check on the real hardware
break;
case 0xD: // X reset to 0
- #ifdef DBGMODE
- printf("X reset to 0\n");
- #endif
- m_registers[EF9365_REG_X_MSB] = 0;
- m_registers[EF9365_REG_X_LSB] = 0;
+ set_x_reg(0);
+ set_busy_flag( cycles_to_us( 4 ) ); // Timing to check on the real hardware
break;
case 0xE: // Y reset to 0
- #ifdef DBGMODE
- printf("Y reset to 0\n");
- #endif
- m_registers[EF9365_REG_Y_MSB] = 0;
- m_registers[EF9365_REG_Y_LSB] = 0;
+ set_y_reg(0);
+ set_busy_flag( cycles_to_us( 4 ) ); // Timing to check on the real hardware
break;
case 0xF: // Direct image memory access request for the next free cycle.
- #ifdef DBGMODE
- printf("Direct image memory access request for the next free cycle.\n");
- #endif
+ set_busy_flag( cycles_to_us( 64 ) ); // Timing to check on the real hardware
+ dump_bitplanes_word();
break;
default:
logerror("Unemulated EF9365 cmd: %02x\n", cmd);
@@ -417,82 +1023,139 @@ void ef9365_device::ef9365_exec(UINT8 cmd)
{
if ( ( cmd>>4 ) == 1 )
{
- if( ( cmd & 0xF ) < 0x8 )
+ #ifdef DBGMODE
+ if( cmd & 0x08 )
+ printf("EF9365 Command : [0x%.2X] %s\n", cmd, commands_names[0x11]);
+ else
+ printf("EF9365 Command : [0x%.2X] %s\n", cmd, commands_names[0x10]);
+ #endif
+
+ tmp_delta_x = m_registers[EF936X_REG_DELTAX];
+ tmp_delta_y = m_registers[EF936X_REG_DELTAY];
+
+ if( cmd & 0x08 )
{
- // Vector generation ( for b2,b1,0 see small vector definition)
- #ifdef DBGMODE
- printf("Vector generation ( for b2,b1,0 see small vector definition)\n");
- #endif
+ if(tmp_delta_x > tmp_delta_y )
+ tmp_delta_y = tmp_delta_x;
+ if(tmp_delta_y > tmp_delta_x )
+ tmp_delta_y = tmp_delta_x;
}
- else
+
+ // Vector / Special direction vector generation
+ switch ( cmd & 0x7 ) // Direction code
{
- // Special direction vectors generation ( for b2,b1,0 see small vector definition)
- #ifdef DBGMODE
- printf("Special direction vectors generation ( for b2,b1,0 see small vector definition)\n");
- #endif
+ case 0x1:
+ busy_cycles = draw_vector ( get_x_reg(), get_y_reg(), get_x_reg() + tmp_delta_x, get_y_reg() + tmp_delta_y);
+ break;
+ case 0x3:
+ busy_cycles = draw_vector ( get_x_reg(), get_y_reg(), get_x_reg() - tmp_delta_x, get_y_reg() + tmp_delta_y);
+ break;
+ case 0x5:
+ busy_cycles = draw_vector ( get_x_reg(), get_y_reg(), get_x_reg() + tmp_delta_x, get_y_reg() - tmp_delta_y);
+ break;
+ case 0x7:
+ busy_cycles = draw_vector ( get_x_reg(), get_y_reg(), get_x_reg() - tmp_delta_x, get_y_reg() - tmp_delta_y);
+ break;
+
+ case 0x0:
+ busy_cycles = draw_vector ( get_x_reg(), get_y_reg(), get_x_reg() + tmp_delta_x, get_y_reg() );
+ break;
+ case 0x2:
+ busy_cycles = draw_vector ( get_x_reg(), get_y_reg(), get_x_reg(), get_y_reg() + tmp_delta_y);
+ break;
+ case 0x4:
+ busy_cycles = draw_vector ( get_x_reg(), get_y_reg(), get_x_reg(), get_y_reg() - tmp_delta_y);
+ break;
+ case 0x6:
+ busy_cycles = draw_vector ( get_x_reg(), get_y_reg(), get_x_reg() - tmp_delta_x, get_y_reg() );
+ break;
}
+ set_busy_flag( cycles_to_us( busy_cycles ) );
}
else
{
if( ( cmd>>4 ) >= 0x8 )
{
- // Small vector definition.
#ifdef DBGMODE
- printf("Small vector definition.\n");
+ printf("EF9365 Command : [0x%.2X] %s\n", cmd, commands_names[0x13]);
#endif
+
+ tmp_delta_x = ( cmd >> 5 ) & 3;
+ tmp_delta_y = ( cmd >> 3 ) & 3;
+
+ // Small vector.
+ switch ( cmd & 0x7 ) // Direction code
+ {
+ case 0x1:
+ busy_cycles = draw_vector ( get_x_reg(), get_y_reg(), get_x_reg() + tmp_delta_x, get_y_reg() + tmp_delta_y);
+ break;
+ case 0x3:
+ busy_cycles = draw_vector ( get_x_reg(), get_y_reg(), get_x_reg() - tmp_delta_x, get_y_reg() + tmp_delta_y);
+ break;
+ case 0x5:
+ busy_cycles = draw_vector ( get_x_reg(), get_y_reg(), get_x_reg() + tmp_delta_x, get_y_reg() - tmp_delta_y);
+ break;
+ case 0x7:
+ busy_cycles = draw_vector ( get_x_reg(), get_y_reg(), get_x_reg() - tmp_delta_x, get_y_reg() - tmp_delta_y);
+ break;
+
+ case 0x0:
+ busy_cycles = draw_vector ( get_x_reg(), get_y_reg(), get_x_reg() + tmp_delta_x, get_y_reg() );
+ break;
+ case 0x2:
+ busy_cycles = draw_vector ( get_x_reg(), get_y_reg(), get_x_reg(), get_y_reg() + tmp_delta_y);
+ break;
+ case 0x4:
+ busy_cycles = draw_vector ( get_x_reg(), get_y_reg(), get_x_reg(), get_y_reg() - tmp_delta_y);
+ break;
+ case 0x6:
+ busy_cycles = draw_vector ( get_x_reg(), get_y_reg(), get_x_reg() - tmp_delta_x, get_y_reg() );
+ break;
+ }
+
+ set_busy_flag( cycles_to_us( busy_cycles ) );
}
else
{
// Draw character
+
#ifdef DBGMODE
- printf("Draw character\n");
+ printf("EF9365 Command : [0x%.2X] %s\n", cmd, commands_names[0x12]);
#endif
- draw_character( cmd - 0x20, 0 , 0 );
+
+ busy_cycles = draw_character( cmd - 0x20, 0 , 0 );
+ set_busy_flag( cycles_to_us( busy_cycles ) );
}
}
}
}
-
-/**************************************************************
- EF9365 interface
-**************************************************************/
+//-------------------------------------------------
+// screen_update: Framebuffer video ouput
+//-------------------------------------------------
UINT32 ef9365_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
- int i,j,k;
+ int i,j,ptr,p;
unsigned char color_index;
- k = 0;
- for(i=0;i<256;i++)
+ for(j=0;j<bitplane_yres;j++)
{
- for(j=0;j<256;j++)
+ for(i=0;i<bitplane_xres;i++)
{
color_index = 0x00;
- if( m_videoram->read_byte(0x0000 + (k>>3)) & (0x80>>(k&7)))
- {
- color_index |= 0x01;
- }
-
- if( m_videoram->read_byte(0x2000 + (k>>3)) & (0x80>>(k&7)))
- {
- color_index |= 0x02;
- }
+ ptr = ( bitplane_xres * j ) + i;
- if( m_videoram->read_byte(0x4000 + (k>>3)) & (0x80>>(k&7)))
+ for( p = 0; p < nb_of_bitplanes; p++)
{
- color_index |= 0x04;
- }
-
- if( m_videoram->read_byte(0x6000 + (k>>3)) & (0x80>>(k&7)))
- {
- color_index |= 0x08;
+ if( m_videoram->read_byte( (EF936X_BITPLANE_MAX_SIZE*p) + (ptr>>3)) & (0x80>>(ptr&7)))
+ {
+ color_index |= (0x01<<p);
+ }
}
- m_screen_out.pix32(i, j) = palette[ color_index&0xF ];
-
- k++;
+ m_screen_out.pix32(j, i) = palette[ color_index ];
}
}
@@ -500,48 +1163,170 @@ UINT32 ef9365_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap,
return 0;
}
+//-------------------------------------------------
+// update_scanline: Scanline callback
+//-------------------------------------------------
+
void ef9365_device::update_scanline(UINT16 scanline)
{
- if (scanline == 250)
+ if (scanline == vsync_scanline_pos)
+ {
m_state |= (0x02); // vsync
+ if( m_registers[EF936X_REG_CTRL1] & 0x20 )
+ {
+ m_irq_vb = 1;
+ }
+
+ update_interrupts();
+ }
if (scanline == 0)
{
m_state &= (~0x02);
draw_border(0);
}
-
- else if (scanline < 120)
- {
- }
- else if (scanline < 250)
- {
- }
}
+//-------------------------------------------------
+// data_r: Registers read access callback
+//-------------------------------------------------
+
READ8_MEMBER( ef9365_device::data_r )
{
- if (offset & 0xF)
- return m_registers[offset & 0xF];
+ unsigned char return_value;
- if (m_bf)
- m_state &= (~0x04);
- else
- m_state |= 0x04;
+ switch(offset & 0xF)
+ {
+ case EF936X_REG_STATUS:
+ if (m_bf)
+ m_state &= (~0x04);
+ else
+ m_state |= 0x04;
+
+ if ( ( overflow_mask_x & get_x_reg() ) || ( overflow_mask_y & get_y_reg() ) )
+ {
+ m_state |= 0x08;
+ }
+
+ if( m_irq_vb || m_irq_lb || m_irq_rdy )
+ {
+ m_state |= 0x80;
+ }
+
+ if( m_irq_lb )
+ {
+ m_state |= 0x10;
+ m_irq_lb = 0;
+ }
+
+ if( m_irq_vb )
+ {
+ m_state |= 0x20;
+ m_irq_vb = 0;
+ }
+
+ if( m_irq_rdy )
+ {
+ m_state |= 0x40;
+ m_irq_rdy = 0;
+ }
+
+ update_interrupts();
+
+ return_value = m_state;
+ break;
+ case EF936X_REG_CTRL1:
+ return_value = m_registers[EF936X_REG_CTRL1] & 0x7F;
+ break;
+ case EF936X_REG_CTRL2:
+ return_value = m_registers[EF936X_REG_CTRL2] & 0x0F;
+ break;
+ case EF936X_REG_CSIZE:
+ return_value = m_registers[EF936X_REG_CSIZE];
+ break;
+ case EF936X_REG_DELTAX:
+ return_value = m_registers[EF936X_REG_DELTAX];
+ break;
+ case EF936X_REG_DELTAY:
+ return_value = m_registers[EF936X_REG_DELTAY];
+ break;
+ case EF936X_REG_X_MSB:
+ return_value = m_registers[EF936X_REG_X_MSB] & 0x0F;
+ break;
+ case EF936X_REG_X_LSB:
+ return_value = m_registers[EF936X_REG_X_LSB];
+ break;
+ case EF936X_REG_Y_MSB:
+ return_value = m_registers[EF936X_REG_Y_MSB] & 0x0F;
+ break;
+ case EF936X_REG_Y_LSB:
+ return_value = m_registers[EF936X_REG_Y_LSB];
+ break;
+ case EF936X_REG_XLP:
+ return_value = m_registers[EF936X_REG_XLP] & 0xFD;
+ break;
+ case EF936X_REG_YLP:
+ return_value = m_registers[EF936X_REG_YLP];
+ break;
+ default:
+ return_value = 0xFF;
+ break;
+ }
#ifdef DBGMODE
- printf("rd ef9365 [0x%2x] = [0x%2x]\n", offset&0xF,m_state );
+ printf("EF9365 [ %s ] RD> [ 0x%.2X ] - %s\n", register_names[offset&0xF],return_value, machine().describe_context() );
#endif
- return m_state;
+
+ return return_value;
}
+//-------------------------------------------------
+// data_w: Registers write access callback
+//-------------------------------------------------
+
WRITE8_MEMBER( ef9365_device::data_w )
{
- m_registers[offset & 0xF] = data;
#ifdef DBGMODE
- printf("wr ef9365 [0x%2x] = [0x%2x]\n", offset&0xF,data );
+ printf("EF9365 [ %s ] <WR [ 0x%.2X ] - %s\n", register_names[offset&0xF],data, machine().describe_context() );
#endif
- if (!offset)
- ef9365_exec(m_registers[0] & 0xff);
+ switch(offset & 0xF)
+ {
+ case EF936X_REG_CMD:
+ ef9365_exec( data & 0xff);
+ break;
+ case EF936X_REG_CTRL1:
+ m_registers[EF936X_REG_CTRL1] = data & 0x7F;
+ break;
+ case EF936X_REG_CTRL2:
+ m_registers[EF936X_REG_CTRL2] = data & 0x0F;
+ break;
+ case EF936X_REG_CSIZE:
+ m_registers[EF936X_REG_CSIZE] = data;
+ break;
+ case EF936X_REG_DELTAX:
+ m_registers[EF936X_REG_DELTAX] = data;
+ break;
+ case EF936X_REG_DELTAY:
+ m_registers[EF936X_REG_DELTAY] = data;
+ break;
+ case EF936X_REG_X_MSB:
+ m_registers[EF936X_REG_X_MSB] = data & 0x0F;
+ break;
+ case EF936X_REG_X_LSB:
+ m_registers[EF936X_REG_X_LSB] = data;
+ break;
+ case EF936X_REG_Y_MSB:
+ m_registers[EF936X_REG_Y_MSB] = data & 0x0F;
+ break;
+ case EF936X_REG_Y_LSB:
+ m_registers[EF936X_REG_Y_LSB] = data;
+ break;
+ case EF936X_REG_XLP:
+ break;
+ case EF936X_REG_YLP:
+ break;
+ default:
+ break;
+ }
}
diff --git a/src/devices/video/ef9365.h b/src/devices/video/ef9365.h
index c4d4b2160b2..e29b3adca33 100644
--- a/src/devices/video/ef9365.h
+++ b/src/devices/video/ef9365.h
@@ -1,10 +1,10 @@
// license:BSD-3-Clause
-// copyright-holders:Jean-François DEL NERO
+// copyright-holders:Jean-Francois DEL NERO
/*********************************************************************
ef9365.h
- Thomson EF9365 video controller
+ Thomson EF9365/EF9366 video controller
*********************************************************************/
@@ -13,10 +13,21 @@
#ifndef __EF9365_H__
#define __EF9365_H__
+#define EF936X_BITPLANE_MAX_SIZE 0x8000
+#define EF936X_MAX_BITPLANES 8
-#define MCFG_EF9365_PALETTE(_palette_tag) \
+#define MCFG_EF936X_PALETTE(_palette_tag) \
ef9365_device::static_set_palette_tag(*device, "^" _palette_tag);
+#define MCFG_EF936X_BITPLANES_CNT(_bitplanes_number) \
+ ef9365_device::static_set_nb_bitplanes(*device,_bitplanes_number);
+
+#define MCFG_EF936X_DISPLAYMODE(_display_mode) \
+ ef9365_device::static_set_display_mode(*device,_display_mode);
+
+#define MCFG_EF936X_IRQ_HANDLER(_devcb) \
+ devcb = &ef9365_device::set_irq_handler(*device, DEVCB_##_devcb);
+
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -33,14 +44,20 @@ public:
// static configuration
static void static_set_palette_tag(device_t &device, const char *tag);
+ static void static_set_nb_bitplanes(device_t &device, int nb_bitplanes );
+ static void static_set_display_mode(device_t &device, int display_mode );
+ template<class _Object> static devcb_base &set_irq_handler(device_t &device, _Object object) { return downcast<ef9365_device &>(device).m_irq_handler.set_callback(object); }
// device interface
DECLARE_READ8_MEMBER( data_r );
DECLARE_WRITE8_MEMBER( data_w );
void update_scanline(UINT16 scanline);
- void static_set_color_filler( UINT8 color );
- void static_set_color_entry( int index, UINT8 r, UINT8 g, UINT8 b );
+ void set_color_filler( UINT8 color );
+ void set_color_entry( int index, UINT8 r, UINT8 g, UINT8 b );
+
+ UINT8 get_last_readback_word(int bitplane_number, int * pixel_offset);
+
UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
protected:
@@ -58,12 +75,22 @@ protected:
// inline helper
private:
- void draw_character( unsigned char c, int block, int smallblock );
+ int get_char_pix( unsigned char c, int x, int y );
+ void plot(int x_pos,int y_pos);
+ int draw_character( unsigned char c, int block, int smallblock );
+ int draw_vector(int x1,int y1,int x2,int y2);
+ unsigned int get_x_reg();
+ unsigned int get_y_reg();
+ void set_x_reg(unsigned int x);
+ void set_y_reg(unsigned int y);
void screen_scanning( int force_clear );
void set_busy_flag(int period);
void set_video_mode(void);
void draw_border(UINT16 line);
void ef9365_exec(UINT8 cmd);
+ int cycles_to_us(int cycles);
+ void dump_bitplanes_word();
+ void update_interrupts();
// internal state
static const device_timer_id BUSY_TIMER = 0;
@@ -71,36 +98,60 @@ private:
memory_region *m_charset;
address_space *m_videoram;
+ UINT8 m_irq_state;
+ UINT8 m_irq_vb;
+ UINT8 m_irq_lb;
+ UINT8 m_irq_rdy;
UINT8 m_current_color;
UINT8 m_bf; //busy flag
UINT8 m_registers[0x10]; //registers
UINT8 m_state; //status register
UINT8 m_border[80]; //border color
- rgb_t palette[16];
+ rgb_t palette[256]; // 8 bitplanes max -> 256 colors max
+ int nb_of_bitplanes;
+ int nb_of_colors;
+ int bitplane_xres;
+ int bitplane_yres;
+ UINT16 overflow_mask_x;
+ UINT16 overflow_mask_y;
+ int vsync_scanline_pos;
+
+ UINT8 m_readback_latch[EF936X_MAX_BITPLANES]; // Last DRAM Readback buffer (Filled after a Direct Memory Access Request command)
+ int m_readback_latch_pix_offset;
+
+ UINT32 clock_freq;
bitmap_rgb32 m_screen_out;
// timers
emu_timer *m_busy_timer;
required_device<palette_device> m_palette;
+ devcb_write_line m_irq_handler;
};
// device type definition
extern const device_type EF9365;
-#define EF9365_REG_STATUS 0x00
-#define EF9365_REG_CMD 0x00
-#define EF9365_REG_CTRL1 0x01
-#define EF9365_REG_CTRL2 0x02
-#define EF9365_REG_CSIZE 0x03
-#define EF9365_REG_DELTAX 0x05
-#define EF9365_REG_DELTAY 0x07
-#define EF9365_REG_X_MSB 0x08
-#define EF9365_REG_X_LSB 0x09
-#define EF9365_REG_Y_MSB 0x0A
-#define EF9365_REG_Y_LSB 0x0B
-#define EF9365_REG_XLP 0x0C
-#define EF9365_REG_YLP 0x0D
+#define EF936X_REG_STATUS 0x00
+#define EF936X_REG_CMD 0x00
+#define EF936X_REG_CTRL1 0x01
+#define EF936X_REG_CTRL2 0x02
+#define EF936X_REG_CSIZE 0x03
+#define EF936X_REG_DELTAX 0x05
+#define EF936X_REG_DELTAY 0x07
+#define EF936X_REG_X_MSB 0x08
+#define EF936X_REG_X_LSB 0x09
+#define EF936X_REG_Y_MSB 0x0A
+#define EF936X_REG_Y_LSB 0x0B
+#define EF936X_REG_XLP 0x0C
+#define EF936X_REG_YLP 0x0D
+
+#define EF936X_256x256_DISPLAY_MODE 0x00
+#define EF936X_512x512_DISPLAY_MODE 0x01
+#define EF936X_512x256_DISPLAY_MODE 0x02
+#define EF936X_128x128_DISPLAY_MODE 0x03
+#define EF936X_64x64_DISPLAY_MODE 0x04
+
#endif
diff --git a/src/devices/video/epic12.cpp b/src/devices/video/epic12.cpp
index fa9c8522198..fa168e5ac36 100644
--- a/src/devices/video/epic12.cpp
+++ b/src/devices/video/epic12.cpp
@@ -41,11 +41,11 @@ TIMER_CALLBACK_MEMBER( epic12_device::blitter_delay_callback )
void epic12_device::device_start()
{
m_gfx_size = 0x2000 * 0x1000;
- m_bitmaps = auto_bitmap_rgb32_alloc(machine(), 0x2000, 0x1000);
+ m_bitmaps = std::make_unique<bitmap_rgb32>( 0x2000, 0x1000);
m_clip = m_bitmaps->cliprect();
m_clip.set(0, 0x2000-1, 0, 0x1000-1);
- m_ram16_copy = auto_alloc_array(machine(), UINT16, m_main_ramsize/2);
+ m_ram16_copy = std::make_unique<UINT16[]>(m_main_ramsize/2);
m_blitter_delay_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(epic12_device::blitter_delay_callback),this));
m_blitter_delay_timer->adjust(attotime::never);
@@ -60,7 +60,7 @@ void epic12_device::device_reset()
}
else
{
- m_use_ram = m_ram16_copy; // slow mode
+ m_use_ram = m_ram16_copy.get(); // slow mode
m_work_queue = osd_work_queue_alloc(WORK_QUEUE_FLAG_HIGH_FREQ);
}
@@ -186,7 +186,7 @@ inline void epic12_device::gfx_upload(offs_t *addr)
}
}
-#define draw_params m_bitmaps, &m_clip, &m_bitmaps->pix(0,0),src_x,src_y, x,y, dimx,dimy, flipy, s_alpha, d_alpha, &tint_clr
+#define draw_params m_bitmaps.get(), &m_clip, &m_bitmaps->pix(0,0),src_x,src_y, x,y, dimx,dimy, flipy, s_alpha, d_alpha, &tint_clr
diff --git a/src/devices/video/epic12.h b/src/devices/video/epic12.h
index fac967b1a3d..5e6301b44f8 100644
--- a/src/devices/video/epic12.h
+++ b/src/devices/video/epic12.h
@@ -76,7 +76,7 @@ public:
UINT32 m_gfx_scroll_1_x, m_gfx_scroll_1_y;
int m_gfx_size;
- bitmap_rgb32 *m_bitmaps;
+ std::unique_ptr<bitmap_rgb32> m_bitmaps;
rectangle m_clip;
UINT16* m_use_ram;
@@ -95,7 +95,7 @@ public:
UINT32 m_gfx_addr_shadowcopy;
UINT32 m_gfx_scroll_0_x_shadowcopy, m_gfx_scroll_0_y_shadowcopy;
UINT32 m_gfx_scroll_1_x_shadowcopy, m_gfx_scroll_1_y_shadowcopy;
- UINT16* m_ram16_copy;
+ std::unique_ptr<UINT16[]> m_ram16_copy;
inline void gfx_upload_shadow_copy(address_space &space, offs_t *addr);
inline void gfx_create_shadow_copy(address_space &space);
inline UINT16 COPY_NEXT_WORD(address_space &space, offs_t *addr);
diff --git a/src/devices/video/fixfreq.cpp b/src/devices/video/fixfreq.cpp
index 355150ccfb6..d75232808e9 100644
--- a/src/devices/video/fixfreq.cpp
+++ b/src/devices/video/fixfreq.cpp
@@ -149,9 +149,9 @@ void fixedfreq_device::recompute_parameters(bool postload)
bool needs_realloc = (m_htotal != m_hbackporch) && (m_vtotal != m_vbackporch);
if (m_bitmap[0] != nullptr || needs_realloc)
- auto_free(machine(), m_bitmap[0]);
+ m_bitmap[0] = nullptr;
if (m_bitmap[1] != nullptr || needs_realloc)
- auto_free(machine(), m_bitmap[0]);
+ m_bitmap[1] = nullptr;
m_htotal = m_hbackporch;
m_vtotal = m_vbackporch;
@@ -162,8 +162,8 @@ void fixedfreq_device::recompute_parameters(bool postload)
m_mult = (double) (m_monitor_clock) / (double) m_htotal * 1.0; // / (3.0 + 3.0);
VERBOSE_OUT(("trigger %f with len %f\n", m_int_trig, 1e6 / m_mult));
- m_bitmap[0] = auto_bitmap_rgb32_alloc(machine(),m_htotal, m_vtotal);
- m_bitmap[1] = auto_bitmap_rgb32_alloc(machine(),m_htotal, m_vtotal);
+ m_bitmap[0] = std::make_unique<bitmap_rgb32>(m_htotal, m_vtotal);
+ m_bitmap[1] = std::make_unique<bitmap_rgb32>(m_htotal, m_vtotal);
rectangle visarea(
m_hbackporch - m_hfrontporch,
@@ -235,7 +235,7 @@ UINT32 fixedfreq_device::screen_update(screen_device &screen, bitmap_rgb32 &bitm
NETDEV_ANALOG_CALLBACK_MEMBER(fixedfreq_device::update_vid)
{
- bitmap_rgb32 *bm = m_bitmap[m_cur_bm];
+ bitmap_rgb32 *bm = m_bitmap[m_cur_bm].get();
const int has_fields = (m_fieldcount > 1) ? 1: 0;
int pixels = round((time - m_line_time).as_double() / m_clock_period.as_double());
diff --git a/src/devices/video/fixfreq.h b/src/devices/video/fixfreq.h
index b8cdc9c711e..38fde1c5f3b 100644
--- a/src/devices/video/fixfreq.h
+++ b/src/devices/video/fixfreq.h
@@ -126,7 +126,7 @@ private:
attotime m_last_vsync_time;
attotime m_refresh;
attotime m_clock_period;
- bitmap_rgb32 *m_bitmap[2];
+ std::unique_ptr<bitmap_rgb32> m_bitmap[2];
int m_cur_bm;
/* adjustable by drivers */
diff --git a/src/devices/video/gf4500.cpp b/src/devices/video/gf4500.cpp
index f3061597002..d4b7e86f056 100644
--- a/src/devices/video/gf4500.cpp
+++ b/src/devices/video/gf4500.cpp
@@ -57,9 +57,9 @@ void gf4500_device::device_config_complete()
void gf4500_device::device_start()
{
- m_data = auto_alloc_array_clear(machine(), UINT32, 0x140000/4);
+ m_data = make_unique_clear<UINT32[]>(0x140000/4);
- save_pointer(NAME(m_data), 0x140000/4);
+ save_pointer(NAME(m_data.get()), 0x140000/4);
save_item(NAME(m_screen_x));
save_item(NAME(m_screen_y));
save_item(NAME(m_screen_x_max));
@@ -83,7 +83,7 @@ void gf4500_device::vram_write16( UINT16 data )
{
if ((m_screen_x < m_screen_x_max) && (m_screen_y < m_screen_y_max))
{
- UINT16 *vram = (UINT16 *)((UINT8 *)m_data + GF4500_FRAMEBUF_OFFSET + (((m_screen_y_min + m_screen_y) * (320 + 1)) + (m_screen_x_min + m_screen_x)) * 2);
+ UINT16 *vram = (UINT16 *)((UINT8 *)m_data.get() + GF4500_FRAMEBUF_OFFSET + (((m_screen_y_min + m_screen_y) * (320 + 1)) + (m_screen_x_min + m_screen_x)) * 2);
*vram = data;
m_screen_x++;
}
@@ -100,7 +100,7 @@ static rgb_t gf4500_get_color_16( UINT16 data )
UINT32 gf4500_device::screen_update(screen_device &device, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
- UINT16 *vram = (UINT16 *)(m_data + GF4500_FRAMEBUF_OFFSET / 4);
+ UINT16 *vram = (UINT16 *)(m_data.get() + GF4500_FRAMEBUF_OFFSET / 4);
int x, y;
for (y = 0; y < 240; y++)
{
diff --git a/src/devices/video/gf4500.h b/src/devices/video/gf4500.h
index 1a64abaded2..aa8bf8ebf63 100644
--- a/src/devices/video/gf4500.h
+++ b/src/devices/video/gf4500.h
@@ -35,7 +35,7 @@ private:
void vram_write16(UINT16 data);
- UINT32 *m_data;
+ std::unique_ptr<UINT32[]> m_data;
int m_screen_x;
int m_screen_y;
int m_screen_x_max;
diff --git a/src/devices/video/h63484.cpp b/src/devices/video/h63484.cpp
index 75b8f881eb0..1e0d7cbb0d8 100644
--- a/src/devices/video/h63484.cpp
+++ b/src/devices/video/h63484.cpp
@@ -1918,7 +1918,7 @@ READ16_MEMBER( h63484_device::status_r )
READ16_MEMBER( h63484_device::data_r )
{
- UINT16 res = 0xffff;
+ UINT16 res;
if(m_ar == 0) // FIFO read
{
diff --git a/src/devices/video/hd44780.cpp b/src/devices/video/hd44780.cpp
index c54adc6538f..00c75e3cd2a 100644
--- a/src/devices/video/hd44780.cpp
+++ b/src/devices/video/hd44780.cpp
@@ -288,7 +288,7 @@ const UINT8 *hd44780_device::render()
{
UINT16 char_pos = line * 0x40 + ((pos + m_disp_shift) % line_size);
- int char_base = 0;
+ int char_base;
if (m_ddram[char_pos] < 0x10)
{
// draw CGRAM characters
diff --git a/src/devices/video/hd61830.cpp b/src/devices/video/hd61830.cpp
index da996128773..d60354ef8a8 100644
--- a/src/devices/video/hd61830.cpp
+++ b/src/devices/video/hd61830.cpp
@@ -420,7 +420,7 @@ void hd61830_device::draw_char(bitmap_ind16 &bitmap, const rectangle &cliprect,
{
int sy = y * m_vp + cl;
int sx = x * m_hp + cr;
- UINT8 data = 0;
+ UINT8 data;
if (m_mcr & MODE_EXTERNAL_CG)
{
diff --git a/src/devices/video/hd63484.cpp b/src/devices/video/hd63484.cpp
index d23081564a6..9dab25d3669 100644
--- a/src/devices/video/hd63484.cpp
+++ b/src/devices/video/hd63484.cpp
@@ -70,9 +70,9 @@ hd63484_device::hd63484_device(const machine_config &mconfig, const char *tag, d
void hd63484_device::device_start()
{
- m_ram = auto_alloc_array_clear(machine(), UINT16, HD63484_RAM_SIZE);
+ m_ram = make_unique_clear<UINT16[]>(HD63484_RAM_SIZE);
- save_pointer(NAME(m_ram), HD63484_RAM_SIZE);
+ save_pointer(NAME(m_ram.get()), HD63484_RAM_SIZE);
save_item(NAME(m_reg));
save_item(NAME(m_fifo_counter));
save_item(NAME(m_fifo));
diff --git a/src/devices/video/hd63484.h b/src/devices/video/hd63484.h
index 8dc2cc25aa0..aca908fe008 100644
--- a/src/devices/video/hd63484.h
+++ b/src/devices/video/hd63484.h
@@ -46,7 +46,7 @@ protected:
private:
// internal state
- UINT16 * m_ram;
+ std::unique_ptr<UINT16[]> m_ram;
UINT16 m_reg[256/2];
int m_fifo_counter;
diff --git a/src/devices/video/huc6260.cpp b/src/devices/video/huc6260.cpp
index 7d3ccc75f78..ca9a9b0510d 100644
--- a/src/devices/video/huc6260.cpp
+++ b/src/devices/video/huc6260.cpp
@@ -253,7 +253,7 @@ WRITE8_MEMBER( huc6260_device::write )
void huc6260_device::device_start()
{
m_timer = timer_alloc();
- m_bmp = auto_bitmap_ind16_alloc( machine(), HUC6260_WPF, HUC6260_LPF );
+ m_bmp = std::make_unique<bitmap_ind16>(HUC6260_WPF, HUC6260_LPF );
/* Resolve callbacks */
m_hsync_changed_cb.resolve();
diff --git a/src/devices/video/huc6260.h b/src/devices/video/huc6260.h
index 36131787fbe..85552fbd265 100644
--- a/src/devices/video/huc6260.h
+++ b/src/devices/video/huc6260.h
@@ -88,7 +88,7 @@ private:
UINT8 m_pixel_clock;
emu_timer *m_timer;
- bitmap_ind16 *m_bmp;
+ std::unique_ptr<bitmap_ind16> m_bmp;
};
diff --git a/src/devices/video/huc6261.cpp b/src/devices/video/huc6261.cpp
index 295f8d8abf9..69caa26008e 100644
--- a/src/devices/video/huc6261.cpp
+++ b/src/devices/video/huc6261.cpp
@@ -398,7 +398,7 @@ void huc6261_device::device_start()
m_huc6270_a = machine().device<huc6270_device>(m_huc6270_a_tag);
m_huc6270_b = machine().device<huc6270_device>(m_huc6270_b_tag);
- m_bmp = auto_bitmap_rgb32_alloc( machine(), HUC6261_WPF, HUC6261_LPF );
+ m_bmp = std::make_unique<bitmap_rgb32>(HUC6261_WPF, HUC6261_LPF );
/* We want to have valid devices */
assert( m_huc6270_a != nullptr );
diff --git a/src/devices/video/huc6261.h b/src/devices/video/huc6261.h
index b8a86f0e69e..ab04cd01c22 100644
--- a/src/devices/video/huc6261.h
+++ b/src/devices/video/huc6261.h
@@ -70,7 +70,7 @@ private:
UINT8 m_pixel_clock;
emu_timer *m_timer;
- bitmap_rgb32 *m_bmp;
+ std::unique_ptr<bitmap_rgb32> m_bmp;
INT32 m_uv_lookup[65536][3];
};
diff --git a/src/devices/video/huc6270.cpp b/src/devices/video/huc6270.cpp
index c0fe5225c8e..42527fbcf16 100644
--- a/src/devices/video/huc6270.cpp
+++ b/src/devices/video/huc6270.cpp
@@ -804,10 +804,10 @@ void huc6270_device::device_start()
/* Resolve callbacks */
m_irq_changed_cb.resolve_safe();
- m_vram = auto_alloc_array_clear(machine(), UINT16, m_vram_size/sizeof(UINT16));
+ m_vram = make_unique_clear<UINT16[]>(m_vram_size/sizeof(UINT16));
m_vram_mask = (m_vram_size >> 1) - 1;
- save_pointer(NAME(m_vram), m_vram_size/sizeof(UINT16));
+ save_pointer(NAME(m_vram.get()), m_vram_size/sizeof(UINT16));
save_item(NAME(m_register_index));
save_item(NAME(m_mawr));
diff --git a/src/devices/video/huc6270.h b/src/devices/video/huc6270.h
index c104fe15347..fdaca3b4f5c 100644
--- a/src/devices/video/huc6270.h
+++ b/src/devices/video/huc6270.h
@@ -128,7 +128,7 @@ private:
int m_sprites_this_line;
int m_sprite_row_index;
UINT16 m_sprite_row[1024];
- UINT16 *m_vram;
+ std::unique_ptr<UINT16[]> m_vram;
UINT16 m_vram_mask;
const static UINT8 vram_increments[4];
diff --git a/src/devices/video/i8244.cpp b/src/devices/video/i8244.cpp
index 82ddeed4e43..8adb5b5ed15 100644
--- a/src/devices/video/i8244.cpp
+++ b/src/devices/video/i8244.cpp
@@ -285,7 +285,7 @@ offs_t i8244_device::fix_register_mirrors( offs_t offset )
READ8_MEMBER(i8244_device::read)
{
- UINT8 data = 0;
+ UINT8 data;
offset = fix_register_mirrors( offset );
diff --git a/src/devices/video/i82730.cpp b/src/devices/video/i82730.cpp
index 84bed542f24..d344c7006ef 100644
--- a/src/devices/video/i82730.cpp
+++ b/src/devices/video/i82730.cpp
@@ -126,7 +126,7 @@ UINT8 i82730_device::read_byte(offs_t address)
UINT16 i82730_device::read_word(offs_t address)
{
- UINT16 data = 0xffff;
+ UINT16 data;
if (sysbus_16bit() && !(address & 1))
{
diff --git a/src/devices/video/i8275.cpp b/src/devices/video/i8275.cpp
index 4f75d7cbc1a..433f222cb92 100644
--- a/src/devices/video/i8275.cpp
+++ b/src/devices/video/i8275.cpp
@@ -367,7 +367,7 @@ void i8275_device::device_timer(emu_timer &timer, device_timer_id id, int param,
m_hlgt = (data & CA_H) ? 1 : 0;
m_vsp = (data & CA_B) ? 1 : 0;
- UINT8 ca = 0;
+ UINT8 ca;
int cccc = (data >> 2) & 0x0f;
if (line_counter < UNDERLINE)
@@ -448,7 +448,7 @@ void i8275_device::device_timer(emu_timer &timer, device_timer_id id, int param,
READ8_MEMBER( i8275_device::read )
{
- UINT8 data = 0;
+ UINT8 data;
if (offset & 0x01)
{
diff --git a/src/devices/video/m50458.cpp b/src/devices/video/m50458.cpp
index e2121cf565d..38e5eeb6e9a 100644
--- a/src/devices/video/m50458.cpp
+++ b/src/devices/video/m50458.cpp
@@ -205,7 +205,7 @@ void m50458_device::device_start()
/* Create an array for shadow gfx */
/* this will spread the source ROM into four directions (up-left, up-right, down-left, down-right) thus creating a working shadow copy */
- m_shadow_gfx = auto_alloc_array_clear(machine(), UINT8, 0x1200);
+ m_shadow_gfx = make_unique_clear<UINT8[]>(0x1200);
for(tile=0;tile<0x80;tile++)
{
diff --git a/src/devices/video/m50458.h b/src/devices/video/m50458.h
index fe6cc087f13..9744ff6d361 100644
--- a/src/devices/video/m50458.h
+++ b/src/devices/video/m50458.h
@@ -71,7 +71,7 @@ protected:
UINT16 m_current_cmd;
int m_cmd_stream_pos;
UINT16 m_osd_addr;
- UINT8 *m_shadow_gfx;
+ std::unique_ptr<UINT8[]> m_shadow_gfx;
UINT8 m_bg_pen;
UINT8 m_phase;
diff --git a/src/devices/video/mb_vcu.cpp b/src/devices/video/mb_vcu.cpp
index 8ee9e835ddc..eda7751a768 100644
--- a/src/devices/video/mb_vcu.cpp
+++ b/src/devices/video/mb_vcu.cpp
@@ -178,8 +178,8 @@ void mb_vcu_device::device_validity_check(validity_checker &valid) const
void mb_vcu_device::device_start()
{
// TODO: m_screen_tag
- m_ram = auto_alloc_array_clear(machine(), UINT8, 0x800);
- m_palram = auto_alloc_array_clear(machine(), UINT8, 0x100);
+ m_ram = make_unique_clear<UINT8[]>(0x800);
+ m_palram = make_unique_clear<UINT8[]>(0x100);
{
static const int resistances_r[2] = { 4700, 2200 };
@@ -193,8 +193,8 @@ void mb_vcu_device::device_start()
}
save_item(NAME(m_status));
- save_pointer(NAME(m_ram), 0x800);
- save_pointer(NAME(m_palram), 0x100);
+ save_pointer(NAME(m_ram.get()), 0x800);
+ save_pointer(NAME(m_palram.get()), 0x100);
save_item(NAME(m_param_offset_latch));
save_item(NAME(m_xpos));
save_item(NAME(m_ypos));
diff --git a/src/devices/video/mb_vcu.h b/src/devices/video/mb_vcu.h
index 8cdc0261be0..e5fe1b2e62e 100644
--- a/src/devices/video/mb_vcu.h
+++ b/src/devices/video/mb_vcu.h
@@ -55,8 +55,8 @@ private:
const address_space_config m_videoram_space_config;
const address_space_config m_paletteram_space_config;
UINT8 m_status;
- UINT8 *m_ram;
- UINT8 *m_palram;
+ std::unique_ptr<UINT8[]> m_ram;
+ std::unique_ptr<UINT8[]> m_palram;
UINT16 m_param_offset_latch;
INT16 m_xpos, m_ypos;
diff --git a/src/devices/video/mc6845.cpp b/src/devices/video/mc6845.cpp
index 827854b0824..57813f574ab 100644
--- a/src/devices/video/mc6845.cpp
+++ b/src/devices/video/mc6845.cpp
@@ -527,7 +527,7 @@ void mc6845_device::recompute_parameters(bool postload)
}
if(m_show_border_area)
- visarea.set(0, horiz_pix_total-1, 0, vert_pix_total-1);
+ visarea.set(0, horiz_pix_total-2, 0, vert_pix_total-2);
else
visarea.set(0 + m_visarea_adjust_min_x, max_visible_x + m_visarea_adjust_max_x, 0 + m_visarea_adjust_min_y, max_visible_y + m_visarea_adjust_max_y);
diff --git a/src/devices/video/mc6847.h b/src/devices/video/mc6847.h
index 26eeb048afe..ac8279080e0 100644
--- a/src/devices/video/mc6847.h
+++ b/src/devices/video/mc6847.h
@@ -411,7 +411,7 @@ protected:
UINT32 emit_mc6847_samples(UINT8 mode, const UINT8 *data, int length, pixel_t *RESTRICT pixels, const pixel_t *RESTRICT palette,
mc6847_get_char_rom_delegate get_char_rom, int x, int y)
{
- UINT32 result = 0;
+ UINT32 result;
if (mode & MODE_AG)
{
/* graphics */
@@ -447,12 +447,12 @@ protected:
break;
}
}
- else if (!get_char_rom.isnull() && ((mode & (MODE_AG|MODE_AS|MODE_INTEXT)) == MODE_INTEXT))
+ else if (!m_charrom_cb.isnull() && ((mode & (MODE_AG|MODE_AS|MODE_INTEXT)) == MODE_INTEXT))
{
/* external ROM */
for (int i = 0; i < length; i++)
{
- UINT8 byte = get_char_rom(data[i], y % 12) ^ (mode & MODE_INV ? 0xFF : 0x00);
+ UINT8 byte = m_charrom_cb(data[i], y % 12) ^ (mode & MODE_INV ? 0xFF : 0x00);
emit_extbytes<1, xscale>(&byte, 1, &pixels[i * 8], (mode & MODE_CSS) ? 14 : 12, palette);
}
result = length * 8 * xscale;
@@ -623,9 +623,6 @@ private:
void record_body_scanline(UINT16 physical_scanline, UINT16 scanline, INT32 start_pos, INT32 end_pos);
pixel_t border_value(UINT8 mode, const pixel_t *palette, bool is_mc6847t1);
- template<int xscale>
- void emit_samples(UINT8 mode, const UINT8 *data, int length, pixel_t *pixels, int x, int y);
-
// template function for doing video update collection
template<int sample_count, int yres>
void record_scanline_res(int scanline, INT32 start_pos, INT32 end_pos);
diff --git a/src/devices/video/mos6566.cpp b/src/devices/video/mos6566.cpp
index d39e8cb041a..f6b9ca75a62 100644
--- a/src/devices/video/mos6566.cpp
+++ b/src/devices/video/mos6566.cpp
@@ -2138,7 +2138,7 @@ void mos6566_device::draw_sprites()
UINT8 snum, sbit;
UINT8 spr_coll = 0, gfx_coll = 0;
UINT32 plane0_l, plane0_r, plane1_l, plane1_r;
- UINT32 sdata_l = 0, sdata_r = 0;
+ UINT32 sdata_l, sdata_r;
for (i = 0; i < 0x400; i++)
m_spr_coll_buf[i] = 0;
diff --git a/src/devices/video/msm6222b.cpp b/src/devices/video/msm6222b.cpp
index 4287916ce1d..efa82d7c119 100644
--- a/src/devices/video/msm6222b.cpp
+++ b/src/devices/video/msm6222b.cpp
@@ -67,7 +67,7 @@ void msm6222b_device::device_start()
void msm6222b_device::control_w(UINT8 data)
{
int cmd;
- for(cmd = 7; cmd >= 0 && !(data & (1<<cmd)); cmd--);
+ for(cmd = 7; cmd >= 0 && !(data & (1<<cmd)); cmd--) {};
switch(cmd) {
case 0:
memset(ddram, 0x20, sizeof(ddram));
diff --git a/src/devices/video/msm6222b.h b/src/devices/video/msm6222b.h
index 50268e9e0f1..d86bcd63629 100644
--- a/src/devices/video/msm6222b.h
+++ b/src/devices/video/msm6222b.h
@@ -27,7 +27,6 @@ public:
void control_w(UINT8 data);
UINT8 control_r();
void data_w(UINT8 data);
- UINT8 data_r();
// Character n bits are at bytes n*16..n*16+7 when 8-high, +10 when 11-high. Only the low 5 bits are used.
// In one line mode n = 0..79. In two line mode first line is 0..39 and second is 40..79.
diff --git a/src/devices/video/pc_vga.cpp b/src/devices/video/pc_vga.cpp
index fa8131e5b88..7710e3402c3 100644
--- a/src/devices/video/pc_vga.cpp
+++ b/src/devices/video/pc_vga.cpp
@@ -992,7 +992,7 @@ UINT32 svga_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, c
UINT32 s3_vga_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
- UINT8 cur_mode = 0;
+ UINT8 cur_mode;
svga_device::screen_update(screen, bitmap, cliprect);
@@ -3387,7 +3387,7 @@ void ibm8514a_device::ibm8514_write_bg(UINT32 offset)
void ibm8514a_device::ibm8514_write(UINT32 offset, UINT32 src)
{
int data_size = 8;
- UINT32 xfer = 0;
+ UINT32 xfer;
address_space& space = machine().device("maincpu")->memory().space(AS_PROGRAM);
switch(ibm8514.pixel_control & 0x00c0)
diff --git a/src/devices/video/pcd8544.cpp b/src/devices/video/pcd8544.cpp
new file mode 100644
index 00000000000..a0de1762fa9
--- /dev/null
+++ b/src/devices/video/pcd8544.cpp
@@ -0,0 +1,226 @@
+// license:BSD-3-Clause
+// copyright-holders:Sandro Ronco
+/***************************************************************************
+
+ Philips PCD8544 LCD controller
+
+***************************************************************************/
+
+#include "emu.h"
+#include "video/pcd8544.h"
+
+#define LOG 0
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+const device_type PCD8544 = &device_creator<pcd8544_device>;
+
+
+//**************************************************************************
+// live device
+//**************************************************************************
+
+//-------------------------------------------------
+// pcd8544_device - constructor
+//-------------------------------------------------
+
+pcd8544_device::pcd8544_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
+ device_t(mconfig, PCD8544, "PCD8544", tag, owner, clock, "pcd8544", __FILE__)
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void pcd8544_device::device_start()
+{
+ m_screen_update_cb.bind_relative_to(*owner());
+
+ // state saving
+ save_item(NAME(m_sdin));
+ save_item(NAME(m_sclk));
+ save_item(NAME(m_dc));
+ save_item(NAME(m_bits));
+ save_item(NAME(m_mode));
+ save_item(NAME(m_control));
+ save_item(NAME(m_op_vol));
+ save_item(NAME(m_bias));
+ save_item(NAME(m_temp_coef));
+ save_item(NAME(m_indata));
+ save_item(NAME(m_addr_y));
+ save_item(NAME(m_addr_x));
+ save_item(NAME(m_vram));
+}
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void pcd8544_device::device_reset()
+{
+ m_mode = 0x04; // PD=1, V=0, H=0
+ m_control = 0x00; // E=0, D=0
+ m_addr_y = 0;
+ m_addr_x = 0;
+ m_bias = 0;
+ m_temp_coef = 0;
+ m_op_vol = 0;
+ m_bits = 0;
+ m_indata = 0;
+ m_sdin = 0;
+ m_sclk = 0;
+ m_dc = 0;
+}
+
+void pcd8544_device::exec_command(UINT8 cmd)
+{
+ if (m_mode & 0x01)
+ {
+ if(cmd & 0x80)
+ {
+ m_op_vol = cmd & 0x7f;
+ if (LOG) logerror("PCD8544: set Vop %d\n", m_op_vol);
+ }
+ else if(cmd & 0x40)
+ {
+ logerror("PCD8544: unused command H=1 0x%02x\n", cmd);
+ }
+ else if(cmd & 0x20)
+ {
+ m_mode = cmd & 0x07;
+ if (LOG) logerror("PCD8544: set PD=%d V=%d H=%d\n", BIT(m_mode, 2), BIT(m_mode, 1), BIT(m_mode, 0));
+ }
+ else if(cmd & 0x10)
+ {
+ m_bias = cmd & 0x07;
+ if (LOG) logerror("PCD8544: set bias system %d\n", m_bias);
+ }
+ else if(cmd & 0x08)
+ {
+ logerror("PCD8544: unused command H=1 0x%02x\n", cmd);
+ }
+ else if(cmd & 0x04)
+ {
+ m_temp_coef = cmd & 0x03;
+ if (LOG) logerror("PCD8544: set temperature coefficient %d\n", m_temp_coef);
+ }
+ else if (cmd)
+ {
+ logerror("PCD8544: unused command H=1 0x%02x\n", cmd);
+ }
+ }
+ else
+ {
+ if(cmd & 0x80)
+ {
+ m_addr_x = (cmd & 0x7f) % 84;
+ if (LOG) logerror("PCD8544: set X-address %d\n", cmd & 0x7f);
+ }
+ else if(cmd & 0x40)
+ {
+ m_addr_y = (cmd & 0x07) % 6;
+ if (LOG) logerror("PCD8544: set Y-address %d\n", cmd & 0x07);
+ }
+ else if(cmd & 0x20)
+ {
+ m_mode = cmd & 0x07;
+ if (LOG) logerror("PCD8544: set PD=%d V=%d H=%d\n", BIT(m_mode, 2), BIT(m_mode, 1), BIT(m_mode, 0));
+ }
+ else if(cmd & 0x10)
+ {
+ logerror("PCD8544: unused command H=0 0x%02x\n", cmd);
+ }
+ else if(cmd & 0x08)
+ {
+ m_control = ((cmd & 0x04) >> 1) | (cmd & 0x01);
+ if (LOG) logerror("PCD8544: set D=%d E=%d\n", BIT(m_control, 1), BIT(m_control, 0));
+ }
+ else if (cmd)
+ {
+ logerror("PCD8544: unused command H=0 0x%02x\n", cmd);
+ }
+ }
+}
+
+void pcd8544_device::write_data(UINT8 data)
+{
+ m_vram[m_addr_y * 84 + m_addr_x] = data;
+
+ if (m_mode & 0x02)
+ {
+ m_addr_y++;
+
+ if (m_addr_y > 5)
+ {
+ m_addr_y = 0;
+ m_addr_x = (m_addr_x + 1) % 84;
+ }
+ }
+ else
+ {
+ m_addr_x++;
+ if (m_addr_x > 83)
+ {
+ m_addr_x = 0;
+ m_addr_y = (m_addr_y + 1) % 6;
+ }
+ }
+}
+
+WRITE_LINE_MEMBER(pcd8544_device::sdin_w)
+{
+ m_sdin = state;
+}
+
+WRITE_LINE_MEMBER(pcd8544_device::sclk_w)
+{
+ if (!m_sclk && state)
+ {
+ m_indata = (m_indata << 1) | (m_sdin ? 1 : 0);
+ m_bits++;
+ if (m_bits == 8)
+ {
+ if (m_dc)
+ write_data(m_indata);
+
+ else
+ exec_command(m_indata);
+
+ m_bits = 0;
+ m_indata = 0;
+ }
+ }
+ m_sclk = state;
+}
+
+WRITE_LINE_MEMBER(pcd8544_device::dc_w)
+{
+ m_dc = state;
+}
+
+UINT32 pcd8544_device::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+{
+ if ((m_mode & 0x04) == 0)
+ {
+ switch (m_control)
+ {
+ case 0: // display blank
+ case 1: // all display segments on
+ bitmap.fill(m_control & 1, cliprect);
+ break;
+
+ case 2: // normal mode
+ case 3: // inverse video mode
+ if (!m_screen_update_cb.isnull())
+ m_screen_update_cb(screen, bitmap, cliprect, m_vram, m_control & 1);
+ break;
+ }
+ }
+ else
+ bitmap.fill(0, cliprect);
+
+ return 0;
+}
diff --git a/src/devices/video/pcd8544.h b/src/devices/video/pcd8544.h
new file mode 100644
index 00000000000..bfcd802823b
--- /dev/null
+++ b/src/devices/video/pcd8544.h
@@ -0,0 +1,72 @@
+// license:BSD-3-Clause
+// copyright-holders:Sandro Ronco
+/***************************************************************************
+
+ Philips PCD8544 LCD controller
+
+***************************************************************************/
+
+#pragma once
+
+#ifndef __PCD8544_H__
+#define __PCD8544_H__
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+typedef device_delegate<void (device_t &device, bitmap_ind16 &bitmap, const rectangle &cliprect , UINT8 *vram, int inv)> pcd8544_screen_update_delegate;
+#define PCD8544_SCREEN_UPDATE(name) void name(device_t &device, bitmap_ind16 &bitmap, const rectangle &cliprect , UINT8 *vram, int inv)
+
+#define MCFG_PCD8544_ADD( _tag ) \
+ MCFG_DEVICE_ADD( _tag, PCD8544, 0 )
+
+#define MCFG_PCD8544_SCREEN_UPDATE_CALLBACK(_class, _method) \
+ pcd8544_device::static_set_screen_update_cb(*device, pcd8544_screen_update_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner)));
+
+
+// ======================> pcd8544_device
+
+class pcd8544_device : public device_t
+{
+public:
+ // construction/destruction
+ pcd8544_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+ static void static_set_screen_update_cb(device_t &device, pcd8544_screen_update_delegate _cb) { downcast<pcd8544_device &>(device).m_screen_update_cb = _cb; }
+
+ // device interface
+ DECLARE_WRITE_LINE_MEMBER(sdin_w);
+ DECLARE_WRITE_LINE_MEMBER(sclk_w);
+ DECLARE_WRITE_LINE_MEMBER(dc_w);
+ UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ void exec_command(UINT8 cmd);
+ void write_data(UINT8 data);
+
+private:
+ pcd8544_screen_update_delegate m_screen_update_cb; // screen update callback
+ int m_sdin;
+ int m_sclk;
+ int m_dc;
+ int m_bits;
+ UINT8 m_mode;
+ UINT8 m_control;
+ UINT8 m_op_vol;
+ UINT8 m_bias;
+ UINT8 m_temp_coef;
+ UINT8 m_indata;
+ UINT8 m_addr_y;
+ UINT8 m_addr_x;
+ UINT8 m_vram[6*84]; // 4032 bit video ram
+};
+
+// device type definition
+extern const device_type PCD8544;
+
+#endif
diff --git a/src/devices/video/poly.h b/src/devices/video/poly.h
index 613ae78df14..2ecc72491f7 100644
--- a/src/devices/video/poly.h
+++ b/src/devices/video/poly.h
@@ -186,16 +186,16 @@ private:
// construction
poly_array(running_machine &machine, poly_manager &manager)
: m_manager(manager),
- m_base(auto_alloc_array_clear(machine, UINT8, k_itemsize * _Count)),
+ m_base(make_unique_clear<UINT8[]>(k_itemsize * _Count)),
m_next(0),
m_max(0),
m_waits(0) { }
// destruction
- ~poly_array() { auto_free(m_manager.machine(), m_base); }
+ ~poly_array() { m_base = nullptr; }
// operators
- _Type &operator[](int index) const { assert(index >= 0 && index < _Count); return *reinterpret_cast<_Type *>(m_base + index * k_itemsize); }
+ _Type &operator[](int index) const { assert(index >= 0 && index < _Count); return *reinterpret_cast<_Type *>(m_base.get() + index * k_itemsize); }
// getters
int count() const { return m_next; }
@@ -203,18 +203,18 @@ private:
int waits() const { return m_waits; }
int itemsize() const { return k_itemsize; }
int allocated() const { return _Count; }
- int indexof(_Type &item) const { int result = (reinterpret_cast<UINT8 *>(&item) - m_base) / k_itemsize; assert(result >= 0 && result < _Count); return result; }
+ int indexof(_Type &item) const { int result = (reinterpret_cast<UINT8 *>(&item) - m_base.get()) / k_itemsize; assert(result >= 0 && result < _Count); return result; }
// operations
void reset() { m_next = 0; }
- _Type &next() { if (m_next > m_max) m_max = m_next; assert(m_next < _Count); return *new(m_base + m_next++ * k_itemsize) _Type; }
+ _Type &next() { if (m_next > m_max) m_max = m_next; assert(m_next < _Count); return *new(m_base.get() + m_next++ * k_itemsize) _Type; }
_Type &last() const { return (*this)[m_next - 1]; }
void wait_for_space(int count = 1) { while ((m_next + count) >= _Count) { m_waits++; m_manager.wait(""); } }
private:
// internal state
poly_manager & m_manager;
- UINT8 * m_base;
+ std::unique_ptr<UINT8[]> m_base;
int m_next;
int m_max;
int m_waits;
diff --git a/src/devices/video/polylgcy.cpp b/src/devices/video/polylgcy.cpp
index b18c6941515..b5daf5a924b 100644
--- a/src/devices/video/polylgcy.cpp
+++ b/src/devices/video/polylgcy.cpp
@@ -315,7 +315,7 @@ legacy_poly_manager *poly_alloc(running_machine &machine, int max_polys, size_t
legacy_poly_manager *poly;
/* allocate the manager itself */
- poly = auto_alloc_clear(machine, legacy_poly_manager);
+ poly = auto_alloc_clear(machine, <legacy_poly_manager>());
poly->flags = flags;
/* allocate polygons */
diff --git a/src/devices/video/psx.cpp b/src/devices/video/psx.cpp
index 9268c6dc575..1caf2a92284 100644
--- a/src/devices/video/psx.cpp
+++ b/src/devices/video/psx.cpp
@@ -127,7 +127,7 @@ void psxgpu_device::DebugMeshInit( void )
m_debug.b_clear = 1;
m_debug.n_coord = 0;
m_debug.n_skip = 0;
- m_debug.mesh = auto_bitmap_ind16_alloc( machine(), width, height );
+ m_debug.mesh = std::make_unique<bitmap_ind16>(width, height );
}
void psxgpu_device::DebugMesh( int n_coordx, int n_coordy )
@@ -469,7 +469,7 @@ void psxgpu_device::psx_gpu_init( int n_gputype )
n_lightgun_y = 0;
b_reverseflag = 0;
- p_vram = auto_alloc_array_clear( machine(), UINT16, width * height );
+ p_vram = make_unique_clear<UINT16[]>(width * height );
for( n_line = 0; n_line < 1024; n_line++ )
{
@@ -570,7 +570,7 @@ void psxgpu_device::psx_gpu_init( int n_gputype )
// icky!!!
machine().save().save_memory( this, "globals", nullptr, 0, "m_packet", (UINT8 *)&m_packet, 1, sizeof( m_packet ) );
- save_pointer(NAME(p_vram), width * height );
+ save_pointer(NAME(p_vram.get()), width * height );
save_item(NAME(n_gpu_buffer_offset));
save_item(NAME(n_vramx));
save_item(NAME(n_vramy));
diff --git a/src/devices/video/psx.h b/src/devices/video/psx.h
index f1767df722d..ae96761cb02 100644
--- a/src/devices/video/psx.h
+++ b/src/devices/video/psx.h
@@ -58,7 +58,7 @@ extern const device_type CXD8654Q;
struct psx_gpu_debug
{
- bitmap_ind16 *mesh;
+ std::unique_ptr<bitmap_ind16> mesh;
int b_clear;
int b_mesh;
int n_skip;
@@ -240,7 +240,7 @@ private:
INT32 n_iy;
INT32 n_ti;
- UINT16 *p_vram;
+ std::unique_ptr<UINT16[]> p_vram;
UINT32 n_vramx;
UINT32 n_vramy;
UINT32 n_twy;
diff --git a/src/devices/video/ramdac.cpp b/src/devices/video/ramdac.cpp
index 1cda8c4b658..b05cccfa10b 100644
--- a/src/devices/video/ramdac.cpp
+++ b/src/devices/video/ramdac.cpp
@@ -103,7 +103,7 @@ void ramdac_device::device_validity_check(validity_checker &valid) const
void ramdac_device::device_start()
{
- m_palram = auto_alloc_array_clear(machine(), UINT8, 1 << 10);
+ m_palram = make_unique_clear<UINT8[]>(1 << 10);
}
diff --git a/src/devices/video/ramdac.h b/src/devices/video/ramdac.h
index 4ad5b076a07..a006312c59f 100644
--- a/src/devices/video/ramdac.h
+++ b/src/devices/video/ramdac.h
@@ -71,7 +71,7 @@ private:
UINT8 m_pal_index[2];
UINT8 m_pal_mask;
UINT8 m_int_index[2];
- UINT8 *m_palram;
+ std::unique_ptr<UINT8[]> m_palram;
const address_space_config m_space_config;
required_device<palette_device> m_palette;
diff --git a/src/devices/video/snes_ppu.cpp b/src/devices/video/snes_ppu.cpp
index 134f3e84a97..7fdd700278c 100644
--- a/src/devices/video/snes_ppu.cpp
+++ b/src/devices/video/snes_ppu.cpp
@@ -216,9 +216,9 @@ void snes_ppu_device::device_start()
{
m_openbus_cb.resolve_safe(0);
- m_vram = auto_alloc_array(machine(), UINT8, SNES_VRAM_SIZE);
- m_cgram = auto_alloc_array(machine(), UINT16, SNES_CGRAM_SIZE/2);
- m_oam_ram = auto_alloc_array(machine(), UINT16, SNES_OAM_SIZE/2);
+ m_vram = std::make_unique<UINT8[]>(SNES_VRAM_SIZE);
+ m_cgram = std::make_unique<UINT16[]>(SNES_CGRAM_SIZE/2);
+ m_oam_ram = std::make_unique<UINT16[]>(SNES_OAM_SIZE/2);
for (int i = 0; i < 2; i++)
{
@@ -355,9 +355,9 @@ void snes_ppu_device::device_start()
save_item(NAME(m_regs));
- save_pointer(NAME(m_vram), SNES_VRAM_SIZE);
- save_pointer(NAME(m_cgram), SNES_CGRAM_SIZE/2);
- save_pointer(NAME(m_oam_ram), SNES_OAM_SIZE/2);
+ save_pointer(NAME(m_vram.get()), SNES_VRAM_SIZE);
+ save_pointer(NAME(m_cgram.get()), SNES_CGRAM_SIZE/2);
+ save_pointer(NAME(m_oam_ram.get()), SNES_OAM_SIZE/2);
}
void snes_ppu_device::device_reset()
@@ -393,13 +393,13 @@ void snes_ppu_device::device_reset()
}
/* Init VRAM */
- memset(m_vram, 0, SNES_VRAM_SIZE);
+ memset(m_vram.get(), 0, SNES_VRAM_SIZE);
/* Init Palette RAM */
- memset((UINT8 *)m_cgram, 0, SNES_CGRAM_SIZE);
+ memset((UINT8 *)m_cgram.get(), 0, SNES_CGRAM_SIZE);
/* Init oam RAM */
- memset((UINT8 *)m_oam_ram, 0xff, SNES_OAM_SIZE);
+ memset((UINT8 *)m_oam_ram.get(), 0xff, SNES_OAM_SIZE);
m_stat78 = 0;
@@ -474,7 +474,7 @@ void snes_ppu_device::device_reset()
inline UINT16 snes_ppu_device::get_bgcolor( UINT8 direct_colors, UINT16 palette, UINT8 color )
{
- UINT16 c = 0;
+ UINT16 c;
if (direct_colors)
{
@@ -801,8 +801,8 @@ inline void snes_ppu_device::update_line( UINT16 curline, UINT8 layer, UINT8 pri
if (offset_per_tile != SNES_OPT_NONE)
{
int opt_x = ii + (xoff & 7);
- UINT32 haddr = 0, vaddr = 0;
- UINT16 hval = 0, vval = 0;
+ UINT32 haddr, vaddr;
+ UINT16 hval, vval;
if (opt_x >= 8)
{
@@ -1156,7 +1156,7 @@ void snes_ppu_device::update_obsel( void )
void snes_ppu_device::oam_list_build( void )
{
- UINT8 *oamram = (UINT8 *)m_oam_ram;
+ UINT8 *oamram = (UINT8 *)m_oam_ram.get();
INT16 oam = 0x1ff;
UINT16 oam_extra = oam + 0x20;
UINT16 extra = 0;
@@ -1275,7 +1275,7 @@ void snes_ppu_device::update_objects_rto( UINT16 curline )
UINT8 height, width, vflip, hflip, priority, pal;
UINT16 tile;
INT16 x, y;
- UINT32 name_sel = 0;
+ UINT32 name_sel;
oam_list_build();
@@ -2047,7 +2047,7 @@ inline UINT32 snes_ppu_device::get_vram_address()
READ8_MEMBER( snes_ppu_device::vram_read )
{
- UINT8 res = 0;
+ UINT8 res;
offset &= 0xffff; // only 64KB are present on SNES
if (m_screen_disabled)
@@ -2208,7 +2208,7 @@ WRITE8_MEMBER( snes_ppu_device::oam_write )
READ8_MEMBER( snes_ppu_device::cgram_read )
{
- UINT8 res = 0;
+ UINT8 res;
offset &= 0x1ff;
#if 0
@@ -2222,7 +2222,7 @@ READ8_MEMBER( snes_ppu_device::cgram_read )
}
#endif
- res = ((UINT8 *)m_cgram)[offset];
+ res = ((UINT8 *)m_cgram.get())[offset];
// CGRAM palette data format is 15-bits (0,bbbbb,ggggg,rrrrr).
// Highest bit is simply ignored.
@@ -2255,7 +2255,7 @@ WRITE8_MEMBER( snes_ppu_device::cgram_write )
if (offset & 0x01)
data &= 0x7f;
- ((UINT8 *)m_cgram)[offset] = data;
+ ((UINT8 *)m_cgram.get())[offset] = data;
}
UINT8 snes_ppu_device::read(address_space &space, UINT32 offset, UINT8 wrio_bit7)
diff --git a/src/devices/video/snes_ppu.h b/src/devices/video/snes_ppu.h
index f9fa754b549..68634c5db60 100644
--- a/src/devices/video/snes_ppu.h
+++ b/src/devices/video/snes_ppu.h
@@ -256,7 +256,6 @@ public:
void set_latch_hv(INT16 x, INT16 y);
void dynamic_res_change();
inline UINT32 get_vram_address();
- UINT8 dbg_video(UINT16 curline);
UINT8 read(address_space &space, UINT32 offset, UINT8 wrio_bit7);
void write(address_space &space, UINT32 offset, UINT8 data);
@@ -267,9 +266,9 @@ public:
DECLARE_WRITE8_MEMBER( cgram_write );
DECLARE_READ8_MEMBER( vram_read );
DECLARE_WRITE8_MEMBER( vram_write );
- UINT16 *m_oam_ram; /* Object Attribute Memory */
- UINT16 *m_cgram; /* Palette RAM */
- UINT8 *m_vram; /* Video RAM (TODO: Should be 16-bit, but it's easier this way) */
+ std::unique_ptr<UINT16[]> m_oam_ram; /* Object Attribute Memory */
+ std::unique_ptr<UINT16[]> m_cgram; /* Palette RAM */
+ std::unique_ptr<UINT8[]> m_vram; /* Video RAM (TODO: Should be 16-bit, but it's easier this way) */
protected:
// device-level overrides
diff --git a/src/devices/video/stvvdp1.cpp b/src/devices/video/stvvdp1.cpp
index e467bb4a68c..a98dc8fe709 100644
--- a/src/devices/video/stvvdp1.cpp
+++ b/src/devices/video/stvvdp1.cpp
@@ -337,7 +337,7 @@ READ32_MEMBER ( saturn_state::saturn_vdp1_vram_r )
WRITE32_MEMBER ( saturn_state::saturn_vdp1_vram_w )
{
- UINT8 *vdp1 = m_vdp1.gfx_decode;
+ UINT8 *vdp1 = m_vdp1.gfx_decode.get();
COMBINE_DATA (&m_vdp1_vram[offset]);
@@ -2099,7 +2099,7 @@ void saturn_state::video_update_vdp1( void )
void saturn_state::stv_vdp1_state_save_postload( void )
{
- UINT8 *vdp1 = m_vdp1.gfx_decode;
+ UINT8 *vdp1 = m_vdp1.gfx_decode.get();
int offset;
UINT32 data;
@@ -2121,14 +2121,14 @@ void saturn_state::stv_vdp1_state_save_postload( void )
int saturn_state::stv_vdp1_start ( void )
{
- m_vdp1_regs = auto_alloc_array_clear(machine(), UINT16, 0x020/2 );
- m_vdp1_vram = auto_alloc_array_clear(machine(), UINT32, 0x100000/4 );
- m_vdp1.gfx_decode = auto_alloc_array(machine(), UINT8, 0x100000 );
+ m_vdp1_regs = make_unique_clear<UINT16[]>(0x020/2 );
+ m_vdp1_vram = make_unique_clear<UINT32[]>(0x100000/4 );
+ m_vdp1.gfx_decode = std::make_unique<UINT8[]>(0x100000 );
- stv_vdp1_shading_data = auto_alloc(machine(), struct stv_vdp1_poly_scanline_data);
+ stv_vdp1_shading_data = std::make_unique<struct stv_vdp1_poly_scanline_data>();
- m_vdp1.framebuffer[0] = auto_alloc_array(machine(), UINT16, 1024 * 256 * 2 ); /* *2 is for double interlace */
- m_vdp1.framebuffer[1] = auto_alloc_array(machine(), UINT16, 1024 * 256 * 2 );
+ m_vdp1.framebuffer[0] = std::make_unique<UINT16[]>(1024 * 256 * 2 ); /* *2 is for double interlace */
+ m_vdp1.framebuffer[1] = std::make_unique<UINT16[]>(1024 * 256 * 2 );
m_vdp1.framebuffer_display_lines = auto_alloc_array(machine(), UINT16 *, 512);
m_vdp1.framebuffer_draw_lines = auto_alloc_array(machine(), UINT16 *, 512);
@@ -2147,8 +2147,8 @@ int saturn_state::stv_vdp1_start ( void )
m_vdp1.user_cliprect.set(0, 512, 0, 256);
// save state
- save_pointer(NAME(m_vdp1_regs), 0x020/2);
- save_pointer(NAME(m_vdp1_vram), 0x100000/4);
+ save_pointer(NAME(m_vdp1_regs.get()), 0x020/2);
+ save_pointer(NAME(m_vdp1_vram.get()), 0x100000/4);
save_item(NAME(m_vdp1.fbcr_accessed));
save_item(NAME(m_vdp1.framebuffer_current_display));
save_item(NAME(m_vdp1.framebuffer_current_draw));
diff --git a/src/devices/video/stvvdp2.cpp b/src/devices/video/stvvdp2.cpp
index 07b718741c2..566b802e553 100644
--- a/src/devices/video/stvvdp2.cpp
+++ b/src/devices/video/stvvdp2.cpp
@@ -2104,7 +2104,7 @@ bit-> /----15----|----14----|----13----|----12----|----11----|----10----|----09
void saturn_state::stv_vdp2_fill_rotation_parameter_table( UINT8 rot_parameter )
{
- UINT32 address = 0;
+ UINT32 address;
address = (((STV_VDP2_RPTAU << 16) | STV_VDP2_RPTAL) << 1);
if ( rot_parameter == 1 )
@@ -2390,7 +2390,7 @@ void saturn_state::stv_vdp2_drawgfxzoom(
if (gfx->has_pen_usage() && transparency == STV_TRANSPARENCY_PEN)
{
- int transmask = 0;
+ int transmask;
transmask = 1 << (transparent_color & 0xff);
@@ -2580,7 +2580,7 @@ void saturn_state::stv_vdp2_drawgfxzoom_rgb555(
rectangle myclip;
UINT8* gfxdata;
- gfxdata = m_vdp2.gfx_decode + code * 0x20;
+ gfxdata = m_vdp2.gfx_decode.get() + code * 0x20;
if(stv2_current_tilemap.window_control.enabled[0] ||
stv2_current_tilemap.window_control.enabled[1])
@@ -2806,7 +2806,7 @@ void saturn_state::stv_vdp2_drawgfx_rgb555( bitmap_rgb32 &dest_bmp, const rectan
UINT8* gfxdata;
int sprite_screen_width, sprite_screen_height;
- gfxdata = m_vdp2.gfx_decode + code * 0x20;
+ gfxdata = m_vdp2.gfx_decode.get() + code * 0x20;
sprite_screen_width = sprite_screen_height = 8;
if(stv2_current_tilemap.window_control.enabled[0] ||
@@ -2920,7 +2920,7 @@ void saturn_state::stv_vdp2_drawgfx_rgb888( bitmap_rgb32 &dest_bmp, const rectan
UINT8* gfxdata;
int sprite_screen_width, sprite_screen_height;
- gfxdata = m_vdp2.gfx_decode + code * 0x20;
+ gfxdata = m_vdp2.gfx_decode.get() + code * 0x20;
sprite_screen_width = sprite_screen_height = 8;
if(stv2_current_tilemap.window_control.enabled[0] ||
@@ -3185,7 +3185,7 @@ void saturn_state::draw_4bpp_bitmap(bitmap_rgb32 &bitmap, const rectangle &clipr
int xsize, ysize, xsize_mask, ysize_mask;
int xsrc,ysrc,xdst,ydst;
int src_offs;
- UINT8* vram = m_vdp2.gfx_decode;
+ UINT8* vram = m_vdp2.gfx_decode.get();
UINT32 map_offset = stv2_current_tilemap.bitmap_map * 0x20000;
int scrollx = stv2_current_tilemap.scrollx;
int scrolly = stv2_current_tilemap.scrolly;
@@ -3241,7 +3241,7 @@ void saturn_state::draw_8bpp_bitmap(bitmap_rgb32 &bitmap, const rectangle &clipr
int xsize, ysize, xsize_mask, ysize_mask;
int xsrc,ysrc,xdst,ydst;
int src_offs;
- UINT8* vram = m_vdp2.gfx_decode;
+ UINT8* vram = m_vdp2.gfx_decode.get();
UINT32 map_offset = stv2_current_tilemap.bitmap_map * 0x20000;
int scrollx = stv2_current_tilemap.scrollx;
int scrolly = stv2_current_tilemap.scrolly;
@@ -3300,7 +3300,7 @@ void saturn_state::draw_11bpp_bitmap(bitmap_rgb32 &bitmap, const rectangle &clip
int xsize, ysize, xsize_mask, ysize_mask;
int xsrc,ysrc,xdst,ydst;
int src_offs;
- UINT8* vram = m_vdp2.gfx_decode;
+ UINT8* vram = m_vdp2.gfx_decode.get();
UINT32 map_offset = stv2_current_tilemap.bitmap_map * 0x20000;
int scrollx = stv2_current_tilemap.scrollx;
int scrolly = stv2_current_tilemap.scrolly;
@@ -3358,7 +3358,7 @@ void saturn_state::draw_rgb15_bitmap(bitmap_rgb32 &bitmap, const rectangle &clip
int xsize, ysize, xsize_mask, ysize_mask;
int xsrc,ysrc,xdst,ydst;
int src_offs;
- UINT8* vram = m_vdp2.gfx_decode;
+ UINT8* vram = m_vdp2.gfx_decode.get();
UINT32 map_offset = stv2_current_tilemap.bitmap_map * 0x20000;
int scrollx = stv2_current_tilemap.scrollx;
int scrolly = stv2_current_tilemap.scrolly;
@@ -3416,7 +3416,7 @@ void saturn_state::draw_rgb32_bitmap(bitmap_rgb32 &bitmap, const rectangle &clip
int xsize, ysize, xsize_mask, ysize_mask;
int xsrc,ysrc,xdst,ydst;
int src_offs;
- UINT8* vram = m_vdp2.gfx_decode;
+ UINT8* vram = m_vdp2.gfx_decode.get();
UINT32 map_offset = stv2_current_tilemap.bitmap_map * 0x20000;
int scrollx = stv2_current_tilemap.scrollx;
int scrolly = stv2_current_tilemap.scrolly;
@@ -3579,7 +3579,7 @@ map is always enabled?
void saturn_state::stv_vdp2_get_map_page( int x, int y, int *_map, int *_page )
{
int page = 0;
- int map = 0;
+ int map;
if ( stv2_current_tilemap.map_count == 4 )
{
@@ -4327,7 +4327,7 @@ void saturn_state::stv_vdp2_check_tilemap_with_linescroll(bitmap_rgb32 &bitmap,
void saturn_state::stv_vdp2_draw_line(bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
int x,y;
- UINT8* gfxdata = m_vdp2.gfx_decode;
+ UINT8* gfxdata = m_vdp2.gfx_decode.get();
UINT32 base_offs,base_mask;
UINT32 pix;
UINT8 interlace;
@@ -4576,11 +4576,11 @@ void saturn_state::stv_vdp2_copy_roz_bitmap(bitmap_rgb32 &bitmap,
{
if ( STV_VDP2_CRKTE == 0 )
{
- coeff_table_base = m_vdp2_vram;
+ coeff_table_base = m_vdp2_vram.get();
}
else
{
- coeff_table_base = m_vdp2_cram;
+ coeff_table_base = m_vdp2_cram.get();
}
if ( coeff_table_size == 0 )
{
@@ -5581,7 +5581,7 @@ void saturn_state::stv_vdp2_draw_RBG0(bitmap_rgb32 &bitmap, const rectangle &cli
void saturn_state::stv_vdp2_draw_back(bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
int x,y;
- UINT8* gfxdata = m_vdp2.gfx_decode;
+ UINT8* gfxdata = m_vdp2.gfx_decode.get();
UINT32 base_offs,base_mask;
UINT8 interlace;
@@ -5627,7 +5627,7 @@ READ32_MEMBER ( saturn_state::saturn_vdp2_vram_r )
WRITE32_MEMBER ( saturn_state::saturn_vdp2_vram_w )
{
- UINT8* gfxdata = m_vdp2.gfx_decode;
+ UINT8* gfxdata = m_vdp2.gfx_decode.get();
COMBINE_DATA(&m_vdp2_vram[offset]);
@@ -6057,7 +6057,7 @@ int saturn_state::get_vcounter( void )
void saturn_state::stv_vdp2_state_save_postload( void )
{
- UINT8 *gfxdata = m_vdp2.gfx_decode;
+ UINT8 *gfxdata = m_vdp2.gfx_decode.get();
int offset;
UINT32 data;
@@ -6101,10 +6101,10 @@ int saturn_state::stv_vdp2_start ( void )
{
machine().add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(saturn_state::stv_vdp2_exit), this));
- m_vdp2_regs = auto_alloc_array_clear(machine(), UINT16, 0x040000/2 );
- m_vdp2_vram = auto_alloc_array_clear(machine(), UINT32, 0x100000/4 );
- m_vdp2_cram = auto_alloc_array_clear(machine(), UINT32, 0x080000/4 );
- m_vdp2.gfx_decode = auto_alloc_array(machine(), UINT8, 0x100000 );
+ m_vdp2_regs = make_unique_clear<UINT16[]>(0x040000/2 );
+ m_vdp2_vram = make_unique_clear<UINT32[]>(0x100000/4 );
+ m_vdp2_cram = make_unique_clear<UINT32[]>(0x080000/4 );
+ m_vdp2.gfx_decode = std::make_unique<UINT8[]>(0x100000 );
// m_gfxdecode->gfx(0)->granularity()=4;
// m_gfxdecode->gfx(1)->granularity()=4;
@@ -6113,9 +6113,9 @@ int saturn_state::stv_vdp2_start ( void )
stv_rbg_cache_data.is_cache_dirty = 3;
memset( &stv_vdp2_layer_data_placement, 0, sizeof(stv_vdp2_layer_data_placement));
- save_pointer(NAME(m_vdp2_regs), 0x040000/2);
- save_pointer(NAME(m_vdp2_vram), 0x100000/4);
- save_pointer(NAME(m_vdp2_cram), 0x080000/4);
+ save_pointer(NAME(m_vdp2_regs.get()), 0x040000/2);
+ save_pointer(NAME(m_vdp2_vram.get()), 0x100000/4);
+ save_pointer(NAME(m_vdp2_cram.get()), 0x080000/4);
machine().save().register_postload(save_prepost_delegate(FUNC(saturn_state::stv_vdp2_state_save_postload), this));
return 0;
@@ -6129,10 +6129,10 @@ VIDEO_START_MEMBER(saturn_state,stv_vdp2)
stv_vdp2_start();
stv_vdp1_start();
m_vdpdebug_roz = 0;
- m_gfxdecode->gfx(0)->set_source(m_vdp2.gfx_decode);
- m_gfxdecode->gfx(1)->set_source(m_vdp2.gfx_decode);
- m_gfxdecode->gfx(2)->set_source(m_vdp2.gfx_decode);
- m_gfxdecode->gfx(3)->set_source(m_vdp2.gfx_decode);
+ m_gfxdecode->gfx(0)->set_source(m_vdp2.gfx_decode.get());
+ m_gfxdecode->gfx(1)->set_source(m_vdp2.gfx_decode.get());
+ m_gfxdecode->gfx(2)->set_source(m_vdp2.gfx_decode.get());
+ m_gfxdecode->gfx(3)->set_source(m_vdp2.gfx_decode.get());
/* calc V counter offsets */
/* 224 mode */
diff --git a/src/devices/video/tms3556.cpp b/src/devices/video/tms3556.cpp
index b007d2fe137..716b1c0269d 100644
--- a/src/devices/video/tms3556.cpp
+++ b/src/devices/video/tms3556.cpp
@@ -557,8 +557,8 @@ void tms3556_device::draw_line_mixed(UINT16 *ln)
void tms3556_device::draw_line(bitmap_ind16 &bmp, int line)
{
- int double_lines = 0;
- UINT16 *ln, *ln2 = nullptr;
+ int double_lines;
+ UINT16 *ln, *ln2;
// if (m_control_regs[4] & 0x??)
// { // interlaced mode
diff --git a/src/devices/video/upd7220.cpp b/src/devices/video/upd7220.cpp
index cc892d66b33..23548f1ecd7 100644
--- a/src/devices/video/upd7220.cpp
+++ b/src/devices/video/upd7220.cpp
@@ -987,7 +987,7 @@ void upd7220_device::draw_rectangle(int x, int y)
void upd7220_device::draw_char(int x, int y)
{
int isize,psize;
- UINT16 tile_data = 0;
+ UINT16 tile_data;
LOG(("uPD7220 char check: %d %d %02x %08x %d %d %02x\n",x,y,m_figs.m_dir,m_ead,m_figs.m_d,m_figs.m_dc,m_figs.m_figure_type));
@@ -1623,10 +1623,10 @@ void upd7220_device::update_graphics(bitmap_rgb32 &bitmap, const rectangle &clip
Quarth (PC-98xx) doesn't seem to use pitch here and it definitely wants bsy to be /2 to make scrolling to work.
Xevious (PC-98xx) wants the pitch to be fixed at 80, and wants bsy to be /1
Dragon Buster (PC-98xx) contradicts with Xevious with regards of the pitch tho ... */
- addr = ((sad << 1) & 0x3ffff) + (y * (m_pitch << (im ? 0 : 1)));
+ addr = ((sad << 1) & 0x3ffff) + ((y / (mixed ? 1 : m_lr)) * (m_pitch << (im ? 0 : 1)));
if (!m_display_cb.isnull())
- draw_graphics_line(bitmap, addr, y + ((bsy + m_vbp) / (mixed ? 1 : m_lr)), wd, (m_pitch << interlace));
+ draw_graphics_line(bitmap, addr, y + bsy + m_vbp, wd, (m_pitch << interlace));
}
}
else
diff --git a/src/devices/video/upd7220.h b/src/devices/video/upd7220.h
index 3f96783f7ec..dbde33a93f8 100644
--- a/src/devices/video/upd7220.h
+++ b/src/devices/video/upd7220.h
@@ -101,10 +101,6 @@ public:
DECLARE_WRITE_LINE_MEMBER( ext_sync_w );
DECLARE_WRITE_LINE_MEMBER( lpen_w );
- DECLARE_WRITE8_MEMBER( bank_w );
- DECLARE_READ8_MEMBER( vram_r );
- DECLARE_WRITE8_MEMBER( vram_w );
-
UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
virtual const rom_entry *device_rom_region() const override;
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override;
diff --git a/src/devices/video/vic4567.cpp b/src/devices/video/vic4567.cpp
index e04a4851dcc..8df490408f8 100644
--- a/src/devices/video/vic4567.cpp
+++ b/src/devices/video/vic4567.cpp
@@ -172,7 +172,7 @@ void vic3_device::device_start()
width = m_screen->width();
height = m_screen->height();
- m_bitmap = auto_bitmap_ind16_alloc(machine(), width, height);
+ m_bitmap = std::make_unique<bitmap_ind16>(width, height);
m_dma_read_cb.resolve_safe(0);
m_dma_read_color_cb.resolve_safe(0);
diff --git a/src/devices/video/vic4567.h b/src/devices/video/vic4567.h
index ddf17a6a6b3..b4b179d43d5 100644
--- a/src/devices/video/vic4567.h
+++ b/src/devices/video/vic4567.h
@@ -185,7 +185,7 @@ private:
UINT16 m_chargenaddr, m_videoaddr, m_bitmapaddr;
- bitmap_ind16 *m_bitmap;
+ std::unique_ptr<bitmap_ind16> m_bitmap;
int m_x_begin, m_x_end;
int m_y_begin, m_y_end;
diff --git a/src/devices/video/vooddefs.h b/src/devices/video/vooddefs.h
index bf14947df16..e394946d445 100644
--- a/src/devices/video/vooddefs.h
+++ b/src/devices/video/vooddefs.h
@@ -23,8 +23,7 @@ enum
STALLED_UNTIL_FIFO_EMPTY
};
-// Use old macro style or newer SSE2 optimized functions
-#define USE_OLD_RASTER 0
+
// Use old table lookup versus straight double divide
#define USE_FAST_RECIP 0
@@ -2366,7 +2365,7 @@ static inline bool ATTR_FORCE_INLINE chromaKeyTest(voodoo_state *v, stats_block
else
{
INT32 low, high, test;
- int results = 0;
+ int results;
/* check blue */
low = v->reg[chromaKey].rgb.b;
@@ -3787,47 +3786,6 @@ static inline bool ATTR_FORCE_INLINE depthTest(UINT16 zaColorReg, stats_block *s
return true;
}
-#if USE_OLD_RASTER == 1
-#define PIXEL_PIPELINE_END(VV, STATS, DITHER, DITHER4, DITHER_LOOKUP, XX, dest, depth, FBZMODE, FBZCOLORPATH, ALPHAMODE, FOGMODE, ITERZ, ITERW, ITERAXXX) \
- \
- /* perform fogging */ \
- INT32 prefogr, prefogg, prefogb; \
- prefogr = r; \
- prefogg = g; \
- prefogb = b; \
- APPLY_FOGGING(VV, FOGMODE, FBZCOLORPATH, XX, DITHER4, r, g, b, \
- ITERZ, ITERW, ITERAXXX); \
- \
- /* perform alpha blending */ \
- APPLY_ALPHA_BLEND(FBZMODE, ALPHAMODE, XX, DITHER, r, g, b, a); \
- /* modify the pixel for debugging purposes */ \
- MODIFY_PIXEL(VV); \
- \
- /* write to framebuffer */ \
- if (FBZMODE_RGB_BUFFER_MASK(FBZMODE)) \
- { \
- /* apply dithering */ \
- APPLY_DITHER(FBZMODE, XX, DITHER_LOOKUP, r, g, b); \
- dest[XX] = (r << 11) | (g << 5) | b; \
- } \
- \
- /* write to aux buffer */ \
- if (depth && FBZMODE_AUX_BUFFER_MASK(FBZMODE)) \
- { \
- if (FBZMODE_ENABLE_ALPHA_PLANES(FBZMODE) == 0) \
- depth[XX] = biasdepth; \
- else \
- depth[XX] = a; \
- } \
- \
- /* track pixel writes to the frame buffer regardless of mask */ \
- (STATS)->pixels_out++; \
- \
-skipdrawdepth: \
- ; \
-} \
-while (0)
-#else
#define PIXEL_PIPELINE_END(VV, STATS, DITHER, DITHER4, DITHER_LOOKUP, XX, dest, depth, FBZMODE, FBZCOLORPATH, ALPHAMODE, FOGMODE, ITERZ, ITERW, ITERAXXX) \
\
/* perform fogging */ \
@@ -3863,7 +3821,7 @@ skipdrawdepth:
; \
} \
while (0)
-#endif
+
/*************************************
@@ -4411,155 +4369,7 @@ static inline bool ATTR_FORCE_INLINE combineColor(voodoo_state *VV, stats_block
* Rasterizer generator macro
*
*************************************/
-#if USE_OLD_RASTER == 1
-#define RASTERIZER(name, TMUS, FBZCOLORPATH, FBZMODE, ALPHAMODE, FOGMODE, TEXMODE0, TEXMODE1) \
- \
-static void raster_##name(void *destbase, INT32 y, const poly_extent *extent, const void *extradata, int threadid) \
-{ \
- const poly_extra_data *extra = (const poly_extra_data *)extradata; \
- voodoo_state *v = extra->state; \
- stats_block *stats = &v->thread_stats[threadid]; \
- DECLARE_DITHER_POINTERS; \
- INT32 startx = extent->startx; \
- INT32 stopx = extent->stopx; \
- INT32 iterr, iterg, iterb, itera; \
- INT32 iterz; \
- INT64 iterw, iterw0 = 0, iterw1 = 0; \
- INT64 iters0 = 0, iters1 = 0; \
- INT64 itert0 = 0, itert1 = 0; \
- UINT16 *depth; \
- UINT16 *dest; \
- INT32 dx, dy; \
- INT32 scry; \
- INT32 x; \
- \
- /* determine the screen Y */ \
- scry = y; \
- if (FBZMODE_Y_ORIGIN(FBZMODE)) \
- scry = (v->fbi.yorigin - y) & 0x3ff; \
- \
- /* compute dithering */ \
- COMPUTE_DITHER_POINTERS(FBZMODE, y); \
- \
- /* apply clipping */ \
- if (FBZMODE_ENABLE_CLIPPING(FBZMODE)) \
- { \
- INT32 tempclip; \
- \
- /* Y clipping buys us the whole scanline */ \
- if (scry < ((v->reg[clipLowYHighY].u >> 16) & 0x3ff) || \
- scry >= (v->reg[clipLowYHighY].u & 0x3ff)) \
- { \
- stats->pixels_in += stopx - startx; \
- stats->clip_fail += stopx - startx; \
- return; \
- } \
- \
- /* X clipping */ \
- tempclip = (v->reg[clipLeftRight].u >> 16) & 0x3ff; \
- if (startx < tempclip) \
- { \
- stats->pixels_in += tempclip - startx; \
- v->stats.total_clipped += tempclip - startx; \
- startx = tempclip; \
- } \
- tempclip = v->reg[clipLeftRight].u & 0x3ff; \
- if (stopx >= tempclip) \
- { \
- stats->pixels_in += stopx - tempclip; \
- v->stats.total_clipped += stopx - tempclip; \
- stopx = tempclip - 1; \
- } \
- } \
- \
- /* get pointers to the target buffer and depth buffer */ \
- dest = (UINT16 *)destbase + scry * v->fbi.rowpixels; \
- depth = (v->fbi.auxoffs != ~0) ? ((UINT16 *)(v->fbi.ram + v->fbi.auxoffs) + scry * v->fbi.rowpixels) : NULL; \
- \
- /* compute the starting parameters */ \
- dx = startx - (extra->ax >> 4); \
- dy = y - (extra->ay >> 4); \
- iterr = extra->startr + dy * extra->drdy + dx * extra->drdx; \
- iterg = extra->startg + dy * extra->dgdy + dx * extra->dgdx; \
- iterb = extra->startb + dy * extra->dbdy + dx * extra->dbdx; \
- itera = extra->starta + dy * extra->dady + dx * extra->dadx; \
- iterz = extra->startz + dy * extra->dzdy + dx * extra->dzdx; \
- iterw = extra->startw + dy * extra->dwdy + dx * extra->dwdx; \
- if (TMUS >= 1) \
- { \
- iterw0 = extra->startw0 + dy * extra->dw0dy + dx * extra->dw0dx; \
- iters0 = extra->starts0 + dy * extra->ds0dy + dx * extra->ds0dx; \
- itert0 = extra->startt0 + dy * extra->dt0dy + dx * extra->dt0dx; \
- } \
- if (TMUS >= 2) \
- { \
- iterw1 = extra->startw1 + dy * extra->dw1dy + dx * extra->dw1dx; \
- iters1 = extra->starts1 + dy * extra->ds1dy + dx * extra->ds1dx; \
- itert1 = extra->startt1 + dy * extra->dt1dy + dx * extra->dt1dx; \
- } \
- extra->info->hits++; \
- /* loop in X */ \
- for (x = startx; x < stopx; x++) \
- { \
- rgb_union iterargb; \
- rgb_union texel = { 0 }; \
- \
- /* pixel pipeline part 1 handles depth setup and stippling */ \
- PIXEL_PIPELINE_BEGIN(v, stats, x, y, FBZCOLORPATH, FBZMODE, iterz, iterw); \
- DEPTH_TEST(v, stats, x, FBZMODE); \
- \
- /* run the texture pipeline on TMU1 to produce a value in texel */ \
- /* note that they set LOD min to 8 to "disable" a TMU */ \
- if (TMUS >= 2 && v->tmu[1].lodmin < (8 << 8)) \
- TEXTURE_PIPELINE(&v->tmu[1], x, dither4, TEXMODE1, texel, \
- v->tmu[1].lookup, extra->lodbase1, \
- iters1, itert1, iterw1, texel); \
- \
- /* run the texture pipeline on TMU0 to produce a final */ \
- /* result in texel */ \
- /* note that they set LOD min to 8 to "disable" a TMU */ \
- if (TMUS >= 1 && v->tmu[0].lodmin < (8 << 8)) \
- { \
- if (!v->send_config) \
- TEXTURE_PIPELINE(&v->tmu[0], x, dither4, TEXMODE0, texel, \
- v->tmu[0].lookup, extra->lodbase0, \
- iters0, itert0, iterw0, texel); \
- else \
- texel.u = v->tmu_config; \
- } \
- /* colorpath pipeline selects source colors and does blending */ \
- CLAMPED_ARGB(iterr, iterg, iterb, itera, FBZCOLORPATH, iterargb); \
- COLORPATH_PIPELINE(v, stats, FBZCOLORPATH, FBZMODE, ALPHAMODE, texel, \
- iterz, iterw, iterargb); \
- \
- /* pixel pipeline part 2 handles fog, alpha, and final output */ \
- PIXEL_PIPELINE_END(v, stats, dither, dither4, dither_lookup, x, dest, depth, \
- FBZMODE, FBZCOLORPATH, ALPHAMODE, FOGMODE, \
- iterz, iterw, iterargb); \
- \
- /* update the iterated parameters */ \
- iterr += extra->drdx; \
- iterg += extra->dgdx; \
- iterb += extra->dbdx; \
- itera += extra->dadx; \
- iterz += extra->dzdx; \
- iterw += extra->dwdx; \
- if (TMUS >= 1) \
- { \
- iterw0 += extra->dw0dx; \
- iters0 += extra->ds0dx; \
- itert0 += extra->dt0dx; \
- } \
- if (TMUS >= 2) \
- { \
- iterw1 += extra->dw1dx; \
- iters1 += extra->ds1dx; \
- itert1 += extra->dt1dx; \
- } \
- } \
-}
-#else
-// New rasterizer implementation
+
#define RASTERIZER(name, TMUS, FBZCOLORPATH, FBZMODE, ALPHAMODE, FOGMODE, TEXMODE0, TEXMODE1) \
\
static void raster_##name(void *destbase, INT32 y, const poly_extent *extent, const void *extradata, int threadid) \
@@ -4716,7 +4526,8 @@ static void raster_##name(void *destbase, INT32 y, const poly_extent *extent, co
} \
} \
}
-#endif
+
+
// ******************************************************************************************************************************
// Computes a log2 of a 16.32 value to 2 fractional bits of precision.
// The return value is coded as a 24.8 value.
diff --git a/src/devices/video/voodoo.cpp b/src/devices/video/voodoo.cpp
index 72d94e994d4..4304b5ebf32 100644
--- a/src/devices/video/voodoo.cpp
+++ b/src/devices/video/voodoo.cpp
@@ -141,8 +141,6 @@ bits(7:4) and bit(24)), X, and Y:
**************************************************************************/
-#ifndef EXPAND_RASTERIZERS
-#define EXPAND_RASTERIZERS
#include "emu.h"
#include "video/polylgcy.h"
@@ -251,7 +249,7 @@ static void raster_generic_2tmu(void *dest, INT32 scanline, const poly_extent *e
#define RASTERIZER_ENTRY(fbzcp, alpha, fog, fbz, tex0, tex1) \
RASTERIZER(fbzcp##_##alpha##_##fog##_##fbz##_##tex0##_##tex1, (((tex0) == 0xffffffff) ? 0 : ((tex1) == 0xffffffff) ? 1 : 2), fbzcp, fbz, alpha, fog, tex0, tex1)
-#include "voodoo.cpp"
+#include "voodoo_rast.inc"
#undef RASTERIZER_ENTRY
@@ -268,7 +266,7 @@ static void raster_generic_2tmu(void *dest, INT32 scanline, const poly_extent *e
static const raster_info predef_raster_table[] =
{
-#include "voodoo.cpp"
+#include "voodoo_rast.inc"
{ nullptr }
};
@@ -3325,13 +3323,10 @@ static INT32 lfb_w(voodoo_state *v, offs_t offset, UINT32 data, UINT32 mem_mask)
goto nextpixel;
}
}
- #if USE_OLD_RASTER == 1
- rgb_union color;
- rgb_union iterargb = { 0 };
- #else
- rgbaint_t color, preFog;
- rgbaint_t iterargb(0);
- #endif
+
+ rgbaint_t color, preFog;
+ rgbaint_t iterargb(0);
+
/* pixel pipeline part 1 handles depth testing and stippling */
//PIXEL_PIPELINE_BEGIN(v, stats, x, y, v->reg[fbzColorPath].u, v->reg[fbzMode].u, iterz, iterw);
@@ -3375,38 +3370,24 @@ static INT32 lfb_w(voodoo_state *v, offs_t offset, UINT32 data, UINT32 mem_mask)
// Depth testing value for lfb pipeline writes is directly from write data, no biasing is used
fogdepth = biasdepth = (UINT32) sw[pix];
- #if USE_OLD_RASTER == 1
- /* Perform depth testing */
- DEPTH_TEST(v, stats, x, v->reg[fbzMode].u);
-
- /* use the RGBA we stashed above */
- color.rgb.r = r = sr[pix];
- color.rgb.g = g = sg[pix];
- color.rgb.b = b = sb[pix];
- color.rgb.a = a = sa[pix];
-
- /* apply chroma key, alpha mask, and alpha testing */
- APPLY_CHROMAKEY(v, stats, v->reg[fbzMode].u, color);
- APPLY_ALPHAMASK(v, stats, v->reg[fbzMode].u, color.rgb.a);
- APPLY_ALPHATEST(v, stats, v->reg[alphaMode].u, color.rgb.a);
- #else
- /* Perform depth testing */
- if (!depthTest((UINT16) v->reg[zaColor].u, stats, depth[x], v->reg[fbzMode].u, biasdepth))
- goto nextpixel;
- /* use the RGBA we stashed above */
- color.set(sa[pix], sr[pix], sg[pix], sb[pix]);
+ /* Perform depth testing */
+ if (!depthTest((UINT16) v->reg[zaColor].u, stats, depth[x], v->reg[fbzMode].u, biasdepth))
+ goto nextpixel;
+
+ /* use the RGBA we stashed above */
+ color.set(sa[pix], sr[pix], sg[pix], sb[pix]);
+
+ /* handle chroma key */
+ if (!chromaKeyTest(v, stats, v->reg[fbzMode].u, color))
+ goto nextpixel;
+ /* handle alpha mask */
+ if (!alphaMaskTest(stats, v->reg[fbzMode].u, color.get_a()))
+ goto nextpixel;
+ /* handle alpha test */
+ if (!alphaTest(v, stats, v->reg[alphaMode].u, color.get_a()))
+ goto nextpixel;
- /* handle chroma key */
- if (!chromaKeyTest(v, stats, v->reg[fbzMode].u, color))
- goto nextpixel;
- /* handle alpha mask */
- if (!alphaMaskTest(stats, v->reg[fbzMode].u, color.get_a()))
- goto nextpixel;
- /* handle alpha test */
- if (!alphaTest(v, stats, v->reg[alphaMode].u, color.get_a()))
- goto nextpixel;
- #endif
/* wait for any outstanding work to finish */
poly_wait(v->poly, "LFB Write");
@@ -3414,7 +3395,7 @@ static INT32 lfb_w(voodoo_state *v, offs_t offset, UINT32 data, UINT32 mem_mask)
/* pixel pipeline part 2 handles color combine, fog, alpha, and final output */
PIXEL_PIPELINE_END(v, stats, dither, dither4, dither_lookup, x, dest, depth,
v->reg[fbzMode].u, v->reg[fbzColorPath].u, v->reg[alphaMode].u, v->reg[fogMode].u,
- iterz, iterw, iterargb);
+ iterz, iterw, iterargb) {};
nextpixel:
/* advance our pointers */
x++;
@@ -5317,7 +5298,7 @@ static INT32 swapbuffer(voodoo_state *v, UINT32 data)
static INT32 triangle(voodoo_state *v)
{
- int texcount = 0;
+ int texcount;
UINT16 *drawbuf;
int destbuf;
int pixels;
@@ -5841,7 +5822,7 @@ voodoo_device::voodoo_device(const machine_config &mconfig, device_type type, co
m_vblank(*this),
m_stall(*this)
{
- m_token = global_alloc_clear(voodoo_state);
+ m_token = global_alloc_clear<voodoo_state>();
}
voodoo_device::~voodoo_device()
@@ -6035,503 +6016,3 @@ RASTERIZER(generic_1tmu, 1, v->reg[fbzColorPath].u, v->reg[fbzMode].u, v->reg[al
RASTERIZER(generic_2tmu, 2, v->reg[fbzColorPath].u, v->reg[fbzMode].u, v->reg[alphaMode].u,
v->reg[fogMode].u, v->tmu[0].reg[textureMode].u, v->tmu[1].reg[textureMode].u)
-
-
-#else
-
-
-
-/***************************************************************************
- GAME-SPECIFIC RASTERIZERS
-***************************************************************************/
-
-/* blitz ------> fbzColorPath alphaMode fogMode, fbzMode, texMode0, texMode1 */
-RASTERIZER_ENTRY( 0x00000035, 0x00000000, 0x00000000, 0x000B0739, 0x0C261A0F, 0xFFFFFFFF ) /* 284269 914846168 */
-RASTERIZER_ENTRY( 0x00002C35, 0x00515110, 0x00000000, 0x000B07F9, 0x0C261A0F, 0xFFFFFFFF ) /* 485421 440309121 */
-RASTERIZER_ENTRY( 0x00582C35, 0x00515110, 0x00000000, 0x000B0739, 0x0C261ACF, 0xFFFFFFFF ) /* 31606 230753709 */
-RASTERIZER_ENTRY( 0x00582C35, 0x00515110, 0x00000000, 0x000B0739, 0x0C261A0F, 0xFFFFFFFF ) /* 76742 211701679 */
-RASTERIZER_ENTRY( 0x01420039, 0x00000000, 0x00000000, 0x000B073B, 0x0C261ACF, 0xFFFFFFFF ) /* 6188 152109056 */
-RASTERIZER_ENTRY( 0x01420039, 0x00000000, 0x00000000, 0x000B07F9, 0x0C261ACF, 0xFFFFFFFF ) /* 1100 108134400 */
-RASTERIZER_ENTRY( 0x00002C35, 0x00515119, 0x00000000, 0x000B0739, 0x0C261A0F, 0xFFFFFFFF ) /* 6229525 106197740 */
-RASTERIZER_ENTRY( 0x00002C35, 0x00515119, 0x00000000, 0x000B0799, 0x0C261A0F, 0xFFFFFFFF ) /* 905641 75886220 */
-RASTERIZER_ENTRY( 0x00002C35, 0x00515119, 0x00000000, 0x000B07F9, 0x0C261A0F, 0xFFFFFFFF ) /* 205236 53317253 */
-RASTERIZER_ENTRY( 0x01422439, 0x00000000, 0x00000000, 0x000B073B, 0x0C2610C9, 0xFFFFFFFF ) /* 817356 48881349 */
-RASTERIZER_ENTRY( 0x00000035, 0x00000000, 0x00000000, 0x000B07F9, 0x0C261A0F, 0xFFFFFFFF ) /* 37979 41687251 */
-RASTERIZER_ENTRY( 0x00002C35, 0x00515110, 0x00000000, 0x000B0739, 0x0C261A0F, 0xFFFFFFFF ) /* 26014 41183295 */
-RASTERIZER_ENTRY( 0x01420039, 0x00000000, 0x00000000, 0x000B07F9, 0x0C261A0F, 0xFFFFFFFF ) /* 2512 37911104 */
-RASTERIZER_ENTRY( 0x00006136, 0x00515119, 0x00000000, 0x000B07F9, 0x0C261A0F, 0xFFFFFFFF ) /* 28834 15527654 */
-RASTERIZER_ENTRY( 0x00582435, 0x00515110, 0x00000000, 0x000B0739, 0x0C261ACF, 0xFFFFFFFF ) /* 9878 4979429 */
-RASTERIZER_ENTRY( 0x00002C35, 0x00515119, 0x00000000, 0x000B0739, 0x0C261ACF, 0xFFFFFFFF ) /* 199952 4622064 */
-RASTERIZER_ENTRY( 0x00582C35, 0x00515110, 0x00000000, 0x000B0739, 0x0C261AC9, 0xFFFFFFFF ) /* 8672 3676949 */
-RASTERIZER_ENTRY( 0x00582C35, 0x00515010, 0x00000000, 0x000B0739, 0x0C2610CF, 0xFFFFFFFF ) /* 616 2743972 */
-RASTERIZER_ENTRY( 0x01422C39, 0x00045110, 0x00000000, 0x000B0739, 0x0C261A0F, 0xFFFFFFFF ) /* 81380 2494832 */
-//RASTERIZER_ENTRY( 0x00582435, 0x00515110, 0x00000000, 0x000B0739, 0x0C261AC9, 0xFFFFFFFF ) /* 7670 2235587 */
-//RASTERIZER_ENTRY( 0x00592136, 0x00515110, 0x00000000, 0x000B073B, 0x0C261A0F, 0xFFFFFFFF ) /* 210 1639140 */
-//RASTERIZER_ENTRY( 0x00582C35, 0x00515110, 0x00000000, 0x000B073B, 0x0C261A0F, 0xFFFFFFFF ) /* 108 1154736 */
-//RASTERIZER_ENTRY( 0x00002C35, 0x00515110, 0x00000000, 0x000B07F9, 0x0C26180F, 0xFFFFFFFF ) /* 2152 1150842 */
-//RASTERIZER_ENTRY( 0x00592136, 0x00515110, 0x00000000, 0x000B073B, 0x0C261ACF, 0xFFFFFFFF ) /* 152 880560 */
-//RASTERIZER_ENTRY( 0x00008035, 0x00515119, 0x00000000, 0x000B0739, 0x0C261A0F, 0xFFFFFFFF ) /* 90848 805730 */
-//RASTERIZER_ENTRY( 0x00002C35, 0x00515119, 0x00000000, 0x000B07F9, 0x0C261AC9, 0xFFFFFFFF ) /* 2024 571406 */
-//RASTERIZER_ENTRY( 0x00012136, 0x00515110, 0x00000000, 0x000B07F9, 0x0C261A0F, 0xFFFFFFFF ) /* 1792 494592 */
-//RASTERIZER_ENTRY( 0x00000002, 0x00000000, 0x00000000, 0x00000300, 0xFFFFFFFF, 0xFFFFFFFF ) /* 256 161280 */
-
-/* blitz99 ----> fbzColorPath alphaMode fogMode, fbzMode, texMode0, texMode1 */
-RASTERIZER_ENTRY( 0x00000035, 0x00000009, 0x00000000, 0x000B0739, 0x0C261A0F, 0xFFFFFFFF ) /* * 6297478 149465839 */
-RASTERIZER_ENTRY( 0x00000035, 0x00000009, 0x00000000, 0x000B0739, 0x0C261ACF, 0xFFFFFFFF ) /* * 210693 6285480 */
-RASTERIZER_ENTRY( 0x01422C39, 0x00045110, 0x00000000, 0x000B073B, 0x0C2610C9, 0xFFFFFFFF ) /* * 20180 2718710 */
-RASTERIZER_ENTRY( 0x00582C35, 0x00515110, 0x00000000, 0x000B073B, 0x0C261ACF, 0xFFFFFFFF ) /* * 360 2425416 */
-RASTERIZER_ENTRY( 0x00002C35, 0x00000009, 0x00000000, 0x000B0739, 0x0C261A0F, 0xFFFFFFFF ) /* * 67059 1480978 */
-RASTERIZER_ENTRY( 0x00008035, 0x00000009, 0x00000000, 0x000B0739, 0x0C261A0F, 0xFFFFFFFF ) /* * 24811 400666 */
-RASTERIZER_ENTRY( 0x01420039, 0x00000000, 0x00000000, 0x000B073B, 0x0C2610C9, 0xFFFFFFFF ) /* * 10304 324468 */
-RASTERIZER_ENTRY( 0x00002C35, 0x00515110, 0x00000000, 0x000B0739, 0x0C261ACF, 0xFFFFFFFF ) /* * 1024 112665 */
-
-/* blitz2k ----> fbzColorPath alphaMode fogMode, fbzMode, texMode0, texMode1 */
-RASTERIZER_ENTRY( 0x01420039, 0x00000000, 0x00000000, 0x000B0739, 0x0C261ACF, 0xFFFFFFFF ) /* * 3880 95344128 */
-RASTERIZER_ENTRY( 0x00582C35, 0x00514110, 0x00000000, 0x000B0739, 0x0C261ACF, 0xFFFFFFFF ) /* * 148 1785480 */
-RASTERIZER_ENTRY( 0x01420039, 0x00000000, 0x00000000, 0x000B073B, 0x0C2610CF, 0xFFFFFFFF ) /* * 9976 314244 */
-
-/* carnevil ---> fbzColorPath alphaMode fogMode, fbzMode, texMode0, texMode1 */
-RASTERIZER_ENTRY( 0x00002435, 0x00045119, 0x00000000, 0x00030279, 0x0C261A0F, 0xFFFFFFFF ) /* * 492 84128082 */
-RASTERIZER_ENTRY( 0x00002425, 0x00045119, 0x00000000, 0x00030679, 0x0C261A0F, 0xFFFFFFFF ) /* * 1988398 36166780 */
-RASTERIZER_ENTRY( 0x00486116, 0x00045119, 0x00000000, 0x00030279, 0x0C26180F, 0xFFFFFFFF ) /* * 34424 28788847 */
-RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x00030679, 0x0C261A0F, 0xFFFFFFFF ) /* * 514 26316800 */
-RASTERIZER_ENTRY( 0x00480015, 0x00045119, 0x00000000, 0x000306F9, 0x0C261AC9, 0xFFFFFFFF ) /* * 7346 18805760 */
-RASTERIZER_ENTRY( 0x00002435, 0x00045119, 0x00000000, 0x000302F9, 0x0C26180F, 0xFFFFFFFF ) /* * 130764 18678972 */
-RASTERIZER_ENTRY( 0x00482415, 0x00045119, 0x00000000, 0x000306F9, 0x0C2618C9, 0xFFFFFFFF ) /* * 7244 12179040 */
-RASTERIZER_ENTRY( 0x00482415, 0x00045119, 0x00000000, 0x000306F9, 0x0C26180F, 0xFFFFFFFF ) /* * 84520 12059721 */
-RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000306F9, 0x0C261AC9, 0xFFFFFFFF ) /* * 21926 11226112 */
-RASTERIZER_ENTRY( 0x00482415, 0x00045119, 0x00000000, 0x00030679, 0x0C2618C9, 0xFFFFFFFF ) /* * 92115 8926536 */
-RASTERIZER_ENTRY( 0x00482415, 0x00045119, 0x00000000, 0x00030279, 0x0C261A0F, 0xFFFFFFFF ) /* * 1730 7629334 */
-RASTERIZER_ENTRY( 0x00002435, 0x00045119, 0x00000000, 0x000B0779, 0x0C26180F, 0xFFFFFFFF ) /* * 37408 5545956 */
-RASTERIZER_ENTRY( 0x00002435, 0x00045119, 0x00000000, 0x00030679, 0x0C26180F, 0xFFFFFFFF ) /* * 26528 4225026 */
-RASTERIZER_ENTRY( 0x00002435, 0x00045119, 0x00000000, 0x000306F9, 0x0C26180F, 0xFFFFFFFF ) /* * 35764 3230884 */
-RASTERIZER_ENTRY( 0x01422409, 0x00045119, 0x00000000, 0x00030679, 0x0C261A0F, 0xFFFFFFFF ) /* * 96020 1226438 */
-RASTERIZER_ENTRY( 0x00482415, 0x00045119, 0x00000000, 0x00030279, 0x0C2618C9, 0xFFFFFFFF ) /* * 1020 574649 */
-RASTERIZER_ENTRY( 0x00482415, 0x00045119, 0x00000000, 0x00030679, 0x0C261A0F, 0xFFFFFFFF ) /* * 360 370008 */
-RASTERIZER_ENTRY( 0x00480015, 0x00045119, 0x00000000, 0x000306F9, 0x0C261A0F, 0xFFFFFFFF ) /* * 576 334404 */
-
-/* calspeed ---> fbzColorPath alphaMode fogMode, fbzMode, texMode0, texMode1 */
-RASTERIZER_ENTRY( 0x00002815, 0x00045119, 0x00000001, 0x000B07F9, 0x0C26100F, 0xFFFFFFFF ) /* * 99120 1731923836 */
-RASTERIZER_ENTRY( 0x01022819, 0x00000009, 0x00000001, 0x000B0739, 0x0C26100F, 0xFFFFFFFF ) /* * 9955804 1526119944 */
-RASTERIZER_ENTRY( 0x00002815, 0x00045119, 0x00000001, 0x000B0739, 0x0C26180F, 0xFFFFFFFF ) /* * 1898207 1124776864 */
-RASTERIZER_ENTRY( 0x01022819, 0x00000009, 0x00000001, 0x000B073B, 0x0C26100F, 0xFFFFFFFF ) /* * 3487467 1101663125 */
-RASTERIZER_ENTRY( 0x01022C19, 0x00000009, 0x00000001, 0x000B0739, 0x0C26100F, 0xFFFFFFFF ) /* * 1079277 609256033 */
-RASTERIZER_ENTRY( 0x00002815, 0x00045119, 0x00000001, 0x000A0723, 0x0C261ACF, 0xFFFFFFFF ) /* * 11880 583925760 */
-RASTERIZER_ENTRY( 0x00602819, 0x00045119, 0x00000001, 0x000B07F9, 0x0C26180F, 0xFFFFFFFF ) /* * 63644 582469888 */
-RASTERIZER_ENTRY( 0x01022819, 0x00000009, 0x00000001, 0x000B07F9, 0x0C261A0F, 0xFFFFFFFF ) /* * 22688 556797972 */
-RASTERIZER_ENTRY( 0x00002815, 0x00045119, 0x00000001, 0x000B07F9, 0x0C26180F, 0xFFFFFFFF ) /* * 1360254 417068457 */
-RASTERIZER_ENTRY( 0x00002815, 0x00045119, 0x00000001, 0x000B0739, 0x0C26100F, 0xFFFFFFFF ) /* * 3427489 405421272 */
-RASTERIZER_ENTRY( 0x00002C15, 0x00045119, 0x00000001, 0x000B0739, 0x0C26180F, 0xFFFFFFFF ) /* * 286809 238944049 */
-RASTERIZER_ENTRY( 0x00002815, 0x00045119, 0x00000001, 0x000A0321, 0x0C26180F, 0xFFFFFFFF ) /* * 28160 231084818 */
-RASTERIZER_ENTRY( 0x01022819, 0x00000009, 0x00000001, 0x000B07FB, 0x0C26100F, 0xFFFFFFFF ) /* * 183564 201014424 */
-RASTERIZER_ENTRY( 0x00480015, 0x00045119, 0x00000001, 0x000B0339, 0x0C26100F, 0xFFFFFFFF ) /* * 15275 168207109 */
-RASTERIZER_ENTRY( 0x01022819, 0x00000009, 0x00000001, 0x000B07F9, 0x0C26100F, 0xFFFFFFFF ) /* * 2856 134400000 */
-RASTERIZER_ENTRY( 0x00002815, 0x00045119, 0x00000001, 0x000B0339, 0x0C26180F, 0xFFFFFFFF ) /* * 98551 110417974 */
-RASTERIZER_ENTRY( 0x01022819, 0x00000009, 0x00000001, 0x000B07F9, 0x0C2610CF, 0xFFFFFFFF ) /* * 47040 107360728 */
-RASTERIZER_ENTRY( 0x00480015, 0x00045119, 0x00000001, 0x000B0339, 0x0C26180F, 0xFFFFFFFF ) /* * 13128 86876789 */
-RASTERIZER_ENTRY( 0x01022C19, 0x00000009, 0x00000001, 0x000B073B, 0x0C26100F, 0xFFFFFFFF ) /* * 257515 76329054 */
-RASTERIZER_ENTRY( 0x00002815, 0x00045119, 0x00000001, 0x000B07F9, 0x0C261A0F, 0xFFFFFFFF ) /* * 3934 64958208 */
-//RASTERIZER_ENTRY( 0x00002C15, 0x00045119, 0x00000001, 0x000B07F9, 0x0C26180F, 0xFFFFFFFF ) /* * 77400 63786236 */
-//RASTERIZER_ENTRY( 0x01022C19, 0x00000009, 0x00000001, 0x000B07F9, 0x0C261A0F, 0xFFFFFFFF ) /* * 12500 63151200 */
-//RASTERIZER_ENTRY( 0x0102001A, 0x00045119, 0x00000001, 0x000A0321, 0xFFFFFFFF, 0xFFFFFFFF ) /* * 8764 57629312 */
-//RASTERIZER_ENTRY( 0x00002C15, 0x00045119, 0x00000001, 0x000A0321, 0x0C26180F, 0xFFFFFFFF ) /* * 3257 32708448 */
-//RASTERIZER_ENTRY( 0x00002815, 0x00045119, 0x00000001, 0x000A07E3, 0x0C2610CF, 0xFFFFFFFF ) /* * 28364 31195605 */
-//RASTERIZER_ENTRY( 0x00002C15, 0x00045119, 0x00000001, 0x000B0739, 0x0C26100F, 0xFFFFFFFF ) /* * 409001 30699647 */
-//RASTERIZER_ENTRY( 0x00482C35, 0x00045119, 0x00000001, 0x000A0321, 0x0C26100F, 0xFFFFFFFF ) /* * 17669 11214172 */
-//RASTERIZER_ENTRY( 0x00002C15, 0x00045119, 0x00000001, 0x000B0339, 0x0C26180F, 0xFFFFFFFF ) /* * 5844 6064373 */
-//RASTERIZER_ENTRY( 0x00002C15, 0x00045119, 0x00000001, 0x000B07FB, 0x0C26100F, 0xFFFFFFFF ) /* * 626 4651080 */
-//RASTERIZER_ENTRY( 0x00482C35, 0x00045119, 0x00000001, 0x000A0321, 0x0C26180F, 0xFFFFFFFF ) /* * 5887 2945500 */
-//RASTERIZER_ENTRY( 0x00480015, 0x00045119, 0x00000001, 0x000B0339, 0x0C261A0F, 0xFFFFFFFF ) /* * 1090 2945093 */
-//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x00000001, 0x000B07F9, 0x0C26180F, 0xFFFFFFFF ) /* * 228 1723908 */
-//RASTERIZER_ENTRY( 0x00002C15, 0x00045119, 0x00000001, 0x000A0321, 0x0C261A0F, 0xFFFFFFFF ) /* * 112 1433600 */
-//RASTERIZER_ENTRY( 0x00002815, 0x00045119, 0x00000001, 0x000B0739, 0x0C261A0F, 0xFFFFFFFF ) /* * 3091 1165805 */
-//RASTERIZER_ENTRY( 0x01022C19, 0x00000009, 0x00000001, 0x000B07FB, 0x0C26100F, 0xFFFFFFFF ) /* * 620 791202 */
-
-/* hyprdriv ---> fbzColorPath alphaMode fogMode, fbzMode, texMode0, texMode1 */
-RASTERIZER_ENTRY( 0x01420039, 0x00000000, 0x00000001, 0x000B0739, 0x0C261ACF, 0xFFFFFFFF ) /* * 60860 498565120 */
-RASTERIZER_ENTRY( 0x01420039, 0x00000000, 0x00000001, 0x000B07F9, 0x0C261A0F, 0xFFFFFFFF ) /* * 28688 235012096 */
-RASTERIZER_ENTRY( 0x01420039, 0x00000000, 0x00000001, 0x000B07F9, 0x0C261ACF, 0xFFFFFFFF ) /* * 11844 156499968 */
-RASTERIZER_ENTRY( 0x00580035, 0x00045119, 0x00000001, 0x00030279, 0x0C261A0F, 0xFFFFFFFF ) /* * 175990 146518715 */
-RASTERIZER_ENTRY( 0x00582C35, 0x00515110, 0x00000001, 0x000B0739, 0x0C261ACF, 0xFFFFFFFF ) /* * 2336 114819072 */
-RASTERIZER_ENTRY( 0x00580035, 0x00000000, 0x00000001, 0x000B073B, 0x0C261A1F, 0xFFFFFFFF ) /* * 363325 100404294 */
-RASTERIZER_ENTRY( 0x00582C35, 0x00045110, 0x00000001, 0x000B073B, 0x0C261A0F, 0xFFFFFFFF ) /* * 40918 96318738 */
-RASTERIZER_ENTRY( 0x01420039, 0x00000000, 0x00000001, 0x000B0739, 0x0C26101F, 0xFFFFFFFF ) /* * 54815 94990269 */
-RASTERIZER_ENTRY( 0x01420039, 0x00000000, 0x00000001, 0x000B0739, 0x0C261A1F, 0xFFFFFFFF ) /* * 123032 91652828 */
-RASTERIZER_ENTRY( 0x01422429, 0x00000000, 0x00000001, 0x000B0739, 0x0C261A1F, 0xFFFFFFFF ) /* * 82767 86431997 */
-RASTERIZER_ENTRY( 0x01422429, 0x00000000, 0x00000001, 0x000B0739, 0x0C26101F, 0xFFFFFFFF ) /* * 9874 78101834 */
-RASTERIZER_ENTRY( 0x01422429, 0x00000000, 0x00000001, 0x000B073B, 0x0C261A1F, 0xFFFFFFFF ) /* * 102146 72570879 */
-RASTERIZER_ENTRY( 0x01420039, 0x00000000, 0x00000001, 0x000B073B, 0x0C26100F, 0xFFFFFFFF ) /* * 657804 67229658 */
-RASTERIZER_ENTRY( 0x00580035, 0x00045110, 0x00000001, 0x000B03F9, 0x0C261A0F, 0xFFFFFFFF ) /* * 10428 63173865 */
-RASTERIZER_ENTRY( 0x01422429, 0x00000000, 0x00000001, 0x000B073B, 0x0C261A0F, 0xFFFFFFFF ) /* * 230145 57902926 */
-RASTERIZER_ENTRY( 0x01422C19, 0x00000000, 0x00000001, 0x000B073B, 0x0C261A0F, 0xFFFFFFFF ) /* * 769654 53992486 */
-RASTERIZER_ENTRY( 0x01422C19, 0x00000000, 0x00000001, 0x000B0739, 0x0C26101F, 0xFFFFFFFF ) /* * 85365 51865697 */
-RASTERIZER_ENTRY( 0x00582435, 0x00515110, 0x00000001, 0x000B0739, 0x0C261AC9, 0xFFFFFFFF ) /* * 454674 46165536 */
-RASTERIZER_ENTRY( 0x00580035, 0x00000000, 0x00000001, 0x000B073B, 0x0C26101F, 0xFFFFFFFF ) /* * 101889 33337987 */
-RASTERIZER_ENTRY( 0x00580035, 0x00000000, 0x00000001, 0x000B0739, 0x0C26101F, 0xFFFFFFFF ) /* * 255952 29810993 */
-//RASTERIZER_ENTRY( 0x00582425, 0x00000000, 0x00000001, 0x000B073B, 0x0C261A1F, 0xFFFFFFFF ) /* * 106190 25430383 */
-//RASTERIZER_ENTRY( 0x01420039, 0x00000000, 0x00000001, 0x000B073B, 0x0C261A1F, 0xFFFFFFFF ) /* * 595001 23268601 */
-//RASTERIZER_ENTRY( 0x0142612A, 0x00000000, 0x00000001, 0x000B0739, 0xFFFFFFFF, 0xFFFFFFFF ) /* * 946410 22589110 */
-//RASTERIZER_ENTRY( 0x01420039, 0x00000000, 0x00000001, 0x000B073B, 0x0C261A0F, 0xFFFFFFFF ) /* * 330036 21323230 */
-//RASTERIZER_ENTRY( 0x01422C19, 0x00000000, 0x00000001, 0x000B0739, 0x0C261A1F, 0xFFFFFFFF ) /* * 40089 13470498 */
-//RASTERIZER_ENTRY( 0x01422C19, 0x00000000, 0x00000000, 0x000B073B, 0x0C261A0F, 0xFFFFFFFF ) /* * 90906 12850855 */
-//RASTERIZER_ENTRY( 0x00582C35, 0x00515110, 0x00000001, 0x000B0739, 0x0C261A0F, 0xFFFFFFFF ) /* * 9492 12115280 */
-//RASTERIZER_ENTRY( 0x01420039, 0x00000000, 0x00000001, 0x000B073B, 0x0C26101F, 0xFFFFFFFF ) /* * 453515 12013961 */
-//RASTERIZER_ENTRY( 0x01422C19, 0x00000000, 0x00000001, 0x000B073B, 0x0C261A1F, 0xFFFFFFFF ) /* * 33829 8384312 */
-//RASTERIZER_ENTRY( 0x00580035, 0x00000000, 0x00000001, 0x000B073B, 0x0C26100F, 0xFFFFFFFF ) /* * 83986 7841206 */
-//RASTERIZER_ENTRY( 0x00580035, 0x00045110, 0x00000001, 0x000B0339, 0x0C261A0F, 0xFFFFFFFF ) /* * 42515 7242660 */
-//RASTERIZER_ENTRY( 0x00582425, 0x00000000, 0x00000001, 0x000B0739, 0x0C26100F, 0xFFFFFFFF ) /* * 706 6158684 */
-//RASTERIZER_ENTRY( 0x00582425, 0x00000000, 0x00000001, 0x000B0739, 0x0C26101F, 0xFFFFFFFF ) /* * 62051 5819485 */
-//RASTERIZER_ENTRY( 0x0142612A, 0x00000000, 0x00000000, 0x000B0739, 0xFFFFFFFF, 0xFFFFFFFF ) /* * 135139 5063467 */
-//RASTERIZER_ENTRY( 0x01422429, 0x00000000, 0x00000001, 0x000B073B, 0x0C26100F, 0xFFFFFFFF ) /* * 10359 5135837 */
-//RASTERIZER_ENTRY( 0x01420039, 0x00000000, 0x00000001, 0x000B0739, 0x0C26100F, 0xFFFFFFFF ) /* * 170159 4449246 */
-//RASTERIZER_ENTRY( 0x00582425, 0x00000000, 0x00000001, 0x000B073B, 0x0C26101F, 0xFFFFFFFF ) /* * 19037 4371219 */
-//RASTERIZER_ENTRY( 0x01422429, 0x00000000, 0x00000001, 0x000B073B, 0x0C26101F, 0xFFFFFFFF ) /* * 8963 4352501 */
-//RASTERIZER_ENTRY( 0x01422C39, 0x00045110, 0x00000001, 0x000B073B, 0x0C261A0F, 0xFFFFFFFF ) /* * 47712 4159994 */
-//RASTERIZER_ENTRY( 0x01422C19, 0x00000000, 0x00000000, 0x000B073B, 0x0C261ACF, 0xFFFFFFFF ) /* * 47525 4151435 */
-//RASTERIZER_ENTRY( 0x01422C19, 0x00000000, 0x00000001, 0x000B0739, 0x0C261A0F, 0xFFFFFFFF ) /* * 34980 3794066 */
-//RASTERIZER_ENTRY( 0x0142613A, 0x00045110, 0x00000000, 0x000B0739, 0xFFFFFFFF, 0xFFFFFFFF ) /* * 6540 2358068 */
-//RASTERIZER_ENTRY( 0x0142611A, 0x00045110, 0x00000000, 0x000B0739, 0xFFFFFFFF, 0xFFFFFFFF ) /* * 703308 2096781 */
-//RASTERIZER_ENTRY( 0x00580035, 0x00045110, 0x00000001, 0x000B0339, 0x0C261A1F, 0xFFFFFFFF ) /* * 3963 2079440 */
-//RASTERIZER_ENTRY( 0x01422439, 0x00000000, 0x00000001, 0x000B073B, 0x0C261AC9, 0xFFFFFFFF ) /* * 22866 2008397 */
-//RASTERIZER_ENTRY( 0x01420039, 0x00000000, 0x00000001, 0x000B0739, 0x0C261A0F, 0xFFFFFFFF ) /* * 69705 1673671 */
-//RASTERIZER_ENTRY( 0x01422C19, 0x00000000, 0x00000001, 0x000B073B, 0x0C26100F, 0xFFFFFFFF ) /* * 13366 1575120 */
-//RASTERIZER_ENTRY( 0x0142613A, 0x00000000, 0x00000000, 0x000B0739, 0xFFFFFFFF, 0xFFFFFFFF ) /* * 50625 1408211 */
-//RASTERIZER_ENTRY( 0x0142613A, 0x00045110, 0x00000001, 0x000B0739, 0xFFFFFFFF, 0xFFFFFFFF ) /* * 1244348 1244346 */
-//RASTERIZER_ENTRY( 0x00582425, 0x00000000, 0x00000001, 0x000B073B, 0x0C26100F, 0xFFFFFFFF ) /* * 13791 1222735 */
-//RASTERIZER_ENTRY( 0x00580035, 0x00000000, 0x00000001, 0x000B073B, 0x0C261A0F, 0xFFFFFFFF ) /* * 33064 943590 */
-//RASTERIZER_ENTRY( 0x0142610A, 0x00045110, 0x00000001, 0x000B0739, 0xFFFFFFFF, 0xFFFFFFFF ) /* * 2041 926507 */
-//RASTERIZER_ENTRY( 0x00480019, 0x00045110, 0x00000001, 0x000B073B, 0x0C261A0F, 0xFFFFFFFF ) /* * 2722 453924 */
-//RASTERIZER_ENTRY( 0x00580035, 0x00000000, 0x00000001, 0x000B0739, 0x0C26100F, 0xFFFFFFFF ) /* * 68232 306869 */
-//RASTERIZER_ENTRY( 0x0142611A, 0x00045110, 0x00000001, 0x000B0379, 0xFFFFFFFF, 0xFFFFFFFF ) /* * 7164 269002 */
-
-/* mace -------> fbzColorPath alphaMode fogMode, fbzMode, texMode0, texMode1 */
-RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x0824100F, 0xFFFFFFFF ) /* * 7204150 1340201579 */
-RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0779, 0x08241ADF, 0xFFFFFFFF ) /* * 15332 1181663232 */
-RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0779, 0x082418DF, 0xFFFFFFFF ) /* * 104456 652582379 */
-RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x0824180F, 0xFFFFFFFF ) /* * 488613 368880164 */
-RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x082418CF, 0xFFFFFFFF ) /* * 352924 312417405 */
-RASTERIZER_ENTRY( 0x00480035, 0x00045119, 0x00000000, 0x000B0779, 0x082418DF, 0xFFFFFFFF ) /* * 15024 291762384 */
-RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x082410CF, 0xFFFFFFFF ) /* * 711824 279246170 */
-RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x0824100F, 0xFFFFFFFF ) /* * 735574 171881981 */
-RASTERIZER_ENTRY( 0x00602401, 0x00045119, 0x00000000, 0x000B0779, 0x082418DF, 0xFFFFFFFF ) /* * 943006 154374023 */
-RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x082410CF, 0xFFFFFFFF ) /* * 103877 101077498 */
-RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x0824108F, 0xFFFFFFFF ) /* * 710125 87547221 */
-RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x08241ACF, 0xFFFFFFFF ) /* * 9834 79774966 */
-RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0379, 0x082418DF, 0xFFFFFFFF ) /* * 17644 70187036 */
-RASTERIZER_ENTRY( 0x00480035, 0x00045119, 0x00000000, 0x000B0379, 0x082418DF, 0xFFFFFFFF ) /* * 11324 56633925 */
-RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0379, 0x0824180F, 0xFFFFFFFF ) /* * 96743 40820171 */
-RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0739, 0x082418CF, 0xFFFFFFFF ) /* * 166053 29100794 */
-RASTERIZER_ENTRY( 0x00482435, 0x00045117, 0x00000000, 0x000B0339, 0x082418CF, 0xFFFFFFFF ) /* * 166053 29100697 */
-RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0379, 0x0824188F, 0xFFFFFFFF ) /* * 6723 29076516 */
-RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x0824188F, 0xFFFFFFFF ) /* * 53297 23928976 */
-RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x0824180F, 0xFFFFFFFF ) /* * 10309 19001776 */
-//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0379, 0x0824180F, 0xFFFFFFFF ) /* * 22105 17473157 */
-//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0379, 0x0824188F, 0xFFFFFFFF ) /* * 11304 17236698 */
-//RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0779, 0x082410DF, 0xFFFFFFFF ) /* * 1664 17180883 */
-//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x08241A0F, 0xFFFFFFFF ) /* * 148606 12274278 */
-//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x082418CF, 0xFFFFFFFF ) /* * 80692 9248007 */
-//RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000001, 0x000B0739, 0x082418CF, 0xFFFFFFFF ) /* * 37819 8080994 */
-//RASTERIZER_ENTRY( 0x00482435, 0x00045117, 0x00000001, 0x000B0339, 0x082418CF, 0xFFFFFFFF ) /* * 37819 8080969 */
-//RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000001, 0x000B0379, 0x082418DF, 0xFFFFFFFF ) /* * 536 7930305 */
-//RASTERIZER_ENTRY( 0x00482435, 0x00045117, 0x00000000, 0x000B0339, 0x082418CF, 0xFFFFFFFF ) /* * 27601 7905364 */
-//RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0739, 0x082418CF, 0xFFFFFFFF ) /* * 27601 7905364 */
-//RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0739, 0x082418CF, 0xFFFFFFFF ) /* * 36314 7667917 */
-//RASTERIZER_ENTRY( 0x00482435, 0x00045117, 0x00000000, 0x000B0339, 0x082418CF, 0xFFFFFFFF ) /* * 36314 7667917 */
-//RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0739, 0x082418CF, 0xFFFFFFFF ) /* * 31109 6020110 */
-//RASTERIZER_ENTRY( 0x00482435, 0x00045117, 0x00000000, 0x000B0339, 0x082418CF, 0xFFFFFFFF ) /* * 31109 6020110 */
-//RASTERIZER_ENTRY( 0x00482435, 0x00045117, 0x00000000, 0x000B0339, 0x082418CF, 0xFFFFFFFF ) /* * 42689 5959231 */
-//RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0739, 0x082418CF, 0xFFFFFFFF ) /* * 42689 5959231 */
-//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x0824188F, 0xFFFFFFFF ) /* * 11965 5118044 */
-//RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000001, 0x000B0379, 0x0824180F, 0xFFFFFFFF ) /* * 11923 4662909 */
-//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0379, 0x082410CF, 0xFFFFFFFF ) /* * 4422 4624260 */
-//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0379, 0x0824100F, 0xFFFFFFFF ) /* * 3853 3596375 */
-//RASTERIZER_ENTRY( 0x00480035, 0x00045119, 0x00000001, 0x000B0379, 0x082418DF, 0xFFFFFFFF ) /* * 400 3555759 */
-//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0379, 0x0824180F, 0xFFFFFFFF ) /* * 3755 3453084 */
-//RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000001, 0x000B0779, 0x082418DF, 0xFFFFFFFF ) /* * 4170 2425016 */
-//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x0824184F, 0xFFFFFFFF ) /* * 322 2220073 */
-//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0379, 0x082418CF, 0xFFFFFFFF ) /* * 4008 1201335 */
-//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x0824108F, 0xFFFFFFFF ) /* * 13704 883585 */
-
-/* sfrush -----> fbzColorPath alphaMode fogMode, fbzMode, texMode0, texMode1 */
-RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x00000000, 0x0824101F ) /* * 590139 246714190 */
-RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x0824101F, 0x0824101F ) /* * 397774 153418144 */
-RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x00000000, 0x082410DF ) /* * 22732 146975666 */
-RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x00000000, 0x0824101F ) /* * 306398 130393278 */
-RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x0824101F, 0x0824101F ) /* * 437743 117403881 */
-RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x0824181F, 0x0824101F ) /* * 66608 109289500 */
-RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x00000000, 0x082410DF ) /* * 19101 92573085 */
-RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x00000000, 0x0824181F ) /* * 258287 78618228 */
-RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x0824181F, 0x0824101F ) /* * 61814 68788856 */
-RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000001, 0x000B0779, 0x082410DF, 0x0824181F ) /* * 149792 61464124 */
-RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x0824181F, 0x0824181F ) /* * 109988 55083276 */
-RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0779, 0x08241ADF, 0x00000000 ) /* * 478 46989312 */
-RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0779, 0x08241ADF, 0x0824181F ) /* * 468 46006272 */
-RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x00000000, 0x0824181F ) /* * 125204 39023396 */
-RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0779, 0x08241ADF, 0x082410DB ) /* * 394 38731776 */
-RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0779, 0x082410DF, 0x082410DB ) /* * 12890 36333568 */
-RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0379, 0x0824101F, 0x0824101F ) /* * 147995 31086325 */
-RASTERIZER_ENTRY( 0x00480035, 0x00045119, 0x00000000, 0x000B077B, 0x00000000, 0x082410DB ) /* * 3576 29294592 */
-RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x0824181F, 0x0824181F ) /* * 76059 29282981 */
-RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000001, 0x000B0779, 0x082418DF, 0x0824101F ) /* * 12632 29173808 */
-//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x00000000, 0x082418DF ) /* * 14040 24318118 */
-//RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000001, 0x000B0379, 0x0824101F, 0x0824101F ) /* * 56586 17643207 */
-//RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000001, 0x000B0779, 0x082418DF, 0x0824181F ) /* * 9130 17277440 */
-//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x082418DF, 0x0824101F ) /* * 66302 17049921 */
-//RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000001, 0x000B0779, 0x082410DF, 0x0824101F ) /* * 64380 16463672 */
-//RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0779, 0x082410DF, 0x0824181F ) /* * 152 14942208 */
-//RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0779, 0x082418DF, 0x0824101F ) /* * 8748 13810176 */
-//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x082708DF, 0x0824101F ) /* * 216634 10628656 */
-//RASTERIZER_ENTRY( 0x00480035, 0x00045119, 0x00000001, 0x000B077B, 0x00000000, 0x082410DB ) /* * 1282 10502144 */
-//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x082418DF, 0x0824101F ) /* * 74636 9758030 */
-//RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0779, 0x082418DF, 0x082410DB ) /* * 58652 9353671 */
-//RASTERIZER_ENTRY( 0x00480035, 0x00045119, 0x00000000, 0x000B0779, 0x082418DF, 0x082410DB ) /* * 5242 8038747 */
-//RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B077B, 0x082410DB, 0x082410DB ) /* * 11048 7538060 */
-//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x0824101F, 0x0824181F ) /* * 121630 6906591 */
-//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x00000000, 0x082418DF ) /* * 19553 6864245 */
-//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x082418DF, 0x082418DF ) /* * 1287 6648834 */
-//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x082708DF, 0x0824101F ) /* * 197766 6617876 */
-//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x082700DF, 0x0824101F ) /* * 75470 6231739 */
-//RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000001, 0x000B0779, 0x08241ADF, 0x0824101F ) /* * 180 5898240 */
-//RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000001, 0x000B0779, 0x082410DF, 0x082410DB ) /* * 7692 5743360 */
-//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x082418DF, 0x0824181F ) /* * 20128 4980591 */
-//RASTERIZER_ENTRY( 0x00480035, 0x00045119, 0x00000001, 0x000B0779, 0x082418DF, 0x0824181F ) /* * 1144 4685824 */
-//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x082700DF, 0x0824101F ) /* * 72299 4466336 */
-//RASTERIZER_ENTRY( 0x00480035, 0x00045119, 0x00000000, 0x000B0779, 0x082410DF, 0x082410DB ) /* * 3750 4018176 */
-//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x082410DF, 0x082410DF ) /* * 7533 3692141 */
-//RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000001, 0x000B077B, 0x082410DB, 0x0824101F ) /* * 9484 3610674 */
-//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x0824101F, 0x0824181F ) /* * 128660 3216280 */
-//RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000001, 0x000B0779, 0x082418DF, 0x082410DB ) /* * 22214 3172813 */
-//RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000001, 0x000B077B, 0x082410DB, 0x0824181F ) /* * 5094 3099098 */
-//RASTERIZER_ENTRY( 0x00480035, 0x00045119, 0x00000001, 0x000B0779, 0x082418DF, 0x0824101F ) /* * 1954 2850924 */
-//RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0779, 0x082418DF, 0x0824181F ) /* * 1542 2434304 */
-//RASTERIZER_ENTRY( 0x00480035, 0x00045119, 0x00000000, 0x000B0779, 0x082418DF, 0x00000000 ) /* * 478 1957888 */
-//RASTERIZER_ENTRY( 0x00480035, 0x00045119, 0x00000000, 0x000B0779, 0x082418DF, 0x0824181F ) /* * 468 1916928 */
-//RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B077B, 0x082410DB, 0x0824101F ) /* * 11664 1729188 */
-//RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000001, 0x000B077B, 0x082410DB, 0x082410DB ) /* * 1282 1640960 */
-//RASTERIZER_ENTRY( 0x00480035, 0x00045119, 0x00000001, 0x000B077B, 0x082410DB, 0x0824101F ) /* * 388 1589248 */
-//RASTERIZER_ENTRY( 0x00480035, 0x00045119, 0x00000001, 0x000B0779, 0x082410DF, 0x082410DB ) /* * 1282 1312768 */
-//RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B077B, 0x082410DB, 0x0824181F ) /* * 3928 1046582 */
-
-/* vaportrx ---> fbzColorPath alphaMode fogMode, fbzMode, texMode0, texMode1 */
-RASTERIZER_ENTRY( 0x00482405, 0x00000000, 0x00000000, 0x000B0739, 0x0C26100F, 0xFFFFFFFF ) /* * 2226138 592165102 */
-RASTERIZER_ENTRY( 0x00482435, 0x00000000, 0x00000000, 0x000B0739, 0x0C261A0F, 0xFFFFFFFF ) /* * 53533 281405105 */
-RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B07F9, 0x0C261ACF, 0xFFFFFFFF ) /* * 314131 219103141 */
-RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x00000000, 0x000B0339, 0x0C261A0F, 0xFFFFFFFF ) /* * 216329 95014510 */
-RASTERIZER_ENTRY( 0x00482405, 0x00000009, 0x00000000, 0x000B0739, 0x0C26100F, 0xFFFFFFFF ) /* * 317128 92010096 */
-RASTERIZER_ENTRY( 0x0142613A, 0x00045119, 0x00000000, 0x000B07F9, 0xFFFFFFFF, 0xFFFFFFFF ) /* * 13728 88595930 */
-RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0339, 0x0C261ACF, 0xFFFFFFFF ) /* * 649448 81449105 */
-RASTERIZER_ENTRY( 0x00482435, 0x00000000, 0x00000000, 0x000B0739, 0x0C26100F, 0xFFFFFFFF ) /* * 444231 60067944 */
-RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x00000000, 0x000B0339, 0x0C26184F, 0xFFFFFFFF ) /* * 36057 58970468 */
-RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0339, 0x0C26100F, 0xFFFFFFFF ) /* * 53147 48856709 */
-RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B07F9, 0x0C2610C9, 0xFFFFFFFF ) /* * 447654 47171792 */
-RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0339, 0x0C261A0F, 0xFFFFFFFF ) /* * 207392 38933691 */
-RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0739, 0x0C2610CF, 0xFFFFFFFF ) /* * 2015632 33364173 */
-RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x00000000, 0x000B0339, 0x0C26100F, 0xFFFFFFFF ) /* * 196361 30395218 */
-RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0339, 0x0C2610CF, 0xFFFFFFFF ) /* * 110898 28973006 */
-RASTERIZER_ENTRY( 0x00482435, 0x00000009, 0x00000000, 0x000B0739, 0x0C26100F, 0xFFFFFFFF ) /* * 135107 16301589 */
-RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0339, 0x0C261A8F, 0xFFFFFFFF ) /* * 22375 15797748 */
-RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0339, 0x0C26184F, 0xFFFFFFFF ) /* * 141539 7513140 */
-RASTERIZER_ENTRY( 0x0142613A, 0x00045119, 0x00000000, 0x000B0739, 0xFFFFFFFF, 0xFFFFFFFF ) /* * 621403 5369705 */
-RASTERIZER_ENTRY( 0x00482435, 0x00045110, 0x00000000, 0x000B0739, 0x0C261A0F, 0xFFFFFFFF ) /* * 30443 4070277 */
-//RASTERIZER_ENTRY( 0x00482405, 0x00045110, 0x00000000, 0x000B0739, 0x0C261A0F, 0xFFFFFFFF ) /* * 22121 3129894 */
-//RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0739, 0x0C26100F, 0xFFFFFFFF ) /* * 9187 1864599 */
-//RASTERIZER_ENTRY( 0x00482405, 0x00044110, 0x00000000, 0x000B0739, 0x0C2610CF, 0xFFFFFFFF ) /* * 10390 1694950 */
-//RASTERIZER_ENTRY( 0x0142610A, 0x00000009, 0x00000000, 0x000B0739, 0xFFFFFFFF, 0xFFFFFFFF ) /* * 25366 1624563 */
-//RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0739, 0x0C261A0F, 0xFFFFFFFF ) /* * 69033 1607970 */
-//RASTERIZER_ENTRY( 0x0142610A, 0x00000000, 0x00000000, 0x000B0739, 0xFFFFFFFF, 0xFFFFFFFF ) /* * 36316 1084818 */
-//RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x00000000, 0x000B0339, 0x0C2610CF, 0xFFFFFFFF ) /* * 1813 816763 */
-//RASTERIZER_ENTRY( 0x0142613A, 0x00045119, 0x00000000, 0x000B0339, 0xFFFFFFFF, 0xFFFFFFFF ) /* * 6602 767221 */
-//RASTERIZER_ENTRY( 0x00482435, 0x00045110, 0x00000000, 0x000B0739, 0x0C26100F, 0xFFFFFFFF ) /* * 2547 646048 */
-//RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x00000000, 0x000B0339, 0x0C261A8F, 0xFFFFFFFF ) /* * 2394 501590 */
-//RASTERIZER_ENTRY( 0x0142613A, 0x00000009, 0x00000000, 0x000B0739, 0xFFFFFFFF, 0xFFFFFFFF ) /* * 14078 440086 */
-//RASTERIZER_ENTRY( 0x0142610A, 0x00045119, 0x00000000, 0x000B0339, 0xFFFFFFFF, 0xFFFFFFFF ) /* * 9877 429160 */
-//RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x00000000, 0x000B0339, 0x0C261ACF, 0xFFFFFFFF ) /* * 3222 366052 */
-//RASTERIZER_ENTRY( 0x00482435, 0x00000009, 0x00000000, 0x000B0739, 0x0C2610CF, 0xFFFFFFFF ) /* * 5942 285657 */
-//RASTERIZER_ENTRY( 0x00482405, 0x00044119, 0x00000000, 0x000B0339, 0x0C2610CF, 0xFFFFFFFF ) /* * 2328 239688 */
-//RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x00000000, 0x000B0739, 0x0C26100F, 0xFFFFFFFF ) /* * 1129 208448 */
-
-/* wg3dh ------> fbzColorPath alphaMode fogMode, fbzMode, texMode0, texMode1 */
-RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0779, 0x0824181F, 0xFFFFFFFF ) /* * 127676 116109477 */
-RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0779, 0x0824189F, 0xFFFFFFFF ) /* * 96310 112016758 */
-RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0779, 0x0824109F, 0xFFFFFFFF ) /* * 1412831 108682642 */
-RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0779, 0x0824101F, 0xFFFFFFFF ) /* * 1612798 45952714 */
-RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0779, 0x08241AD9, 0xFFFFFFFF ) /* * 5960 6103040 */
-RASTERIZER_ENTRY( 0x00002435, 0x00045119, 0x00000000, 0x000B0779, 0x082418DF, 0xFFFFFFFF ) /* * 56512 4856542 */
-RASTERIZER_ENTRY( 0x00480035, 0x00045119, 0x00000000, 0x000B0779, 0x0824109F, 0xFFFFFFFF ) /* * 8480 2045940 */
-RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0379, 0x0824181F, 0xFFFFFFFF ) /* * 2779 1994317 */
-RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0779, 0x0824105F, 0xFFFFFFFF ) /* * 154691 1922774 */
-RASTERIZER_ENTRY( 0x00002435, 0x00045119, 0x00000000, 0x000B0779, 0x082410DF, 0xFFFFFFFF ) /* * 18114 776139 */
-
-/* gauntleg ---> fbzColorPath alphaMode fogMode, fbzMode, texMode0, texMode1 */
-RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x00000000, 0x000B0779, 0x00000000, 0x0C24100F ) /* * 157050 668626339 */
-RASTERIZER_ENTRY( 0x00600039, 0x00045119, 0x00000000, 0x000B0779, 0x0C22400F, 0x0C241ACF ) /* * 1079126 580272490 */
-RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0779, 0x0C241A4F, 0x0C24100F ) /* * 49686 232178144 */
-RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0779, 0x0C24104F, 0x0C24100F ) /* * 1048560 206304396 */
-RASTERIZER_ENTRY( 0x00600039, 0x00045119, 0x00000000, 0x000B0779, 0x0C2240CF, 0x0C241ACF ) /* * 59176 182444375 */
-RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0779, 0x00000000, 0x0C241A4F ) /* * 66342 179689728 */
-RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x00000000, 0x000B0779, 0x0C24180F, 0x0C24180F ) /* * 72264 109413344 */
-RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x00000000, 0x000B0779, 0x0C24100F, 0x0C24100F ) /* * 281243 75399210 */
-RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0779, 0x00000000, 0x0C24104F ) /* * 126384 68412120 */
-RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x0C241A0F, 0x0C24100F ) /* * 26864 43754988 */
-RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0779, 0x00000000, 0x0C241ACF ) /* * 30510 32759936 */
-RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x00000000, 0x000B0779, 0x0C24180F, 0x0C24100F ) /* * 44783 31884168 */
-RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x00000000, 0x000B0779, 0x00000000, 0x0C24180F ) /* * 34946 31359362 */
-RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x00000000, 0x0C241ACF ) /* * 8006 28367999 */
-RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x00000000, 0x000B0379, 0x0C24180F, 0x0C24180F ) /* * 15430 27908213 */
-RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x00000000, 0x0C241A0F ) /* * 29306 25166802 */
-RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x00000000, 0x000B0779, 0x0C24180F, 0x0C241ACF ) /* * 27737 24517949 */
-RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x0C241ACF, 0x0C24100F ) /* * 6783 21292092 */
-RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x00000000, 0x000B0379, 0x00000000, 0x0C24180F ) /* * 9591 17815763 */
-RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x00000000, 0x000B0779, 0x0C24100F, 0x0C24180F ) /* * 343966 13864759 */
-//RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0779, 0x0C241ACF, 0x0C24100F ) /* * 11842 12126208 */
-//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x0C241A8F, 0x0C24100F ) /* * 6648 9788508 */
-//RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0779, 0x00000000, 0x0C2418CF ) /* * 8444 8646656 */
-//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0379, 0x0C24180F, 0x0C24100F ) /* * 9677 8365606 */
-//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x0C24100F, 0x0C24100F ) /* * 844920 8289326 */
-//RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0779, 0x00000000, 0x0C24184F ) /* * 3108 8010176 */
-//RASTERIZER_ENTRY( 0x00600039, 0x00045119, 0x00000000, 0x000B03F9, 0x00000000, 0x0C24180F ) /* * 1435 6209238 */
-//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x00000000, 0x000B0379, 0x0C24180F, 0x0C24100F ) /* * 5754 5617499 */
-//RASTERIZER_ENTRY( 0x00600039, 0x00045119, 0x00000000, 0x000B0379, 0x0C24180F, 0x0C24180F ) /* * 1608 5557253 */
-//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x00000000, 0x000B0779, 0x0C24100F, 0x0C241ACF ) /* * 105127 5133321 */
-//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x00000000, 0x000B0379, 0x0C24180F, 0x0C241ACF ) /* * 3460 4689138 */
-//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x0C24180F, 0x0C24100F ) /* * 7025 4629550 */
-//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x00000000, 0x0C24180F ) /* * 7164 4407683 */
-//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x00000000, 0x000B0779, 0x00000000, 0x0C24188F ) /* * 1922 3924179 */
-//RASTERIZER_ENTRY( 0x00600039, 0x00045119, 0x00000000, 0x000B0779, 0x00000000, 0x0C24180F ) /* * 4116 3733777 */
-//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x00000000, 0x0C241A8F ) /* * 2626 3732809 */
-//RASTERIZER_ENTRY( 0x00600039, 0x00045119, 0x00000000, 0x000B03F9, 0x0C24180F, 0x0C24180F ) /* * 778 3202973 */
-//RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0779, 0x0C24184F, 0x0C24100F ) /* * 1525 2997446 */
-//RASTERIZER_ENTRY( 0x00600039, 0x00045119, 0x00000000, 0x000B03F9, 0x0C24180F, 0x0C241A0F ) /* * 645 2975266 */
-//RASTERIZER_ENTRY( 0x00600039, 0x00044119, 0x00000000, 0x000B0379, 0x00000000, 0x0C241A0F ) /* * 5212 2491361 */
-//RASTERIZER_ENTRY( 0x00600039, 0x00045119, 0x00000000, 0x000B0379, 0x00000000, 0x0C24180F ) /* * 825 1996513 */
-//RASTERIZER_ENTRY( 0x00600039, 0x00045119, 0x00000000, 0x000B0379, 0x0C24180F, 0x0C241A0F ) /* * 466 1967163 */
-//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x00000000, 0x000B0779, 0x0580000F, 0x0C24180F ) /* * 77400 1883434 */
-//RASTERIZER_ENTRY( 0x00600039, 0x00045119, 0x00000000, 0x000B0379, 0x0C24180F, 0x0C24100F ) /* * 472 1698177 */
-//RASTERIZER_ENTRY( 0x00600039, 0x00045119, 0x00000000, 0x000B0779, 0x0C24180F, 0x0C24180F ) /* * 2476 1678760 */
-//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0379, 0x00000000, 0x0C24180F ) /* * 4054 1541748 */
-//RASTERIZER_ENTRY( 0x00600039, 0x00044119, 0x00000000, 0x000B0379, 0x0C241A0F, 0x0C24180F ) /* * 3132 1509438 */
-//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x00000000, 0x000B0779, 0x0580080F, 0x0C24180F ) /* * 8582 1324196 */
-//RASTERIZER_ENTRY( 0x00602C19, 0x00044119, 0x00000000, 0x000B0379, 0x00000000, 0x0C24100F ) /* * 1436 1239704 */
-//RASTERIZER_ENTRY( 0x00600039, 0x00045119, 0x00000000, 0x000B03F9, 0x0C24180F, 0x0C24100F ) /* * 253 1220316 */
-//RASTERIZER_ENTRY( 0x00600039, 0x00045119, 0x00000000, 0x000B0779, 0x0C22480F, 0x0C241ACF ) /* * 2433 1014668 */
-
-/* gauntdl ----> fbzColorPath alphaMode fogMode, fbzMode, texMode0, texMode1 */
-RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x000000C1, 0x000B0779, 0x00000009, 0x0C241ACF ) /* * 30860 1128173568 */
-RASTERIZER_ENTRY( 0x0060743A, 0x00045119, 0x000000C1, 0x000B0779, 0x0C22400F, 0x0C241ACF ) /* * 2631692 1117011118 */
-RASTERIZER_ENTRY( 0x0060743A, 0x00045110, 0x000000C1, 0x000B0779, 0x0C22400F, 0x0C241ACF ) /* * 2429239 826969012 */
-RASTERIZER_ENTRY( 0x0060743A, 0x00045119, 0x000000C1, 0x000B0779, 0x0C22480F, 0x0C241ACF ) /* * 454056 468285142 */
-RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x000000C1, 0x000B0779, 0x00000009, 0x0C2418CF ) /* * 257586 355634672 */
-RASTERIZER_ENTRY( 0x00602439, 0x00045119, 0x000000C1, 0x000B0379, 0x00000009, 0x0C24180F ) /* * 10898 134362122 */
-RASTERIZER_ENTRY( 0x00602439, 0x00045119, 0x000000C1, 0x000B0779, 0x00000009, 0x0C241A0F ) /* * 32195 126327049 */
-RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x000000C1, 0x000B0779, 0x0C2410CF, 0x0C24100F ) /* * 855240 123899880 */
-RASTERIZER_ENTRY( 0x00602439, 0x00045110, 0x000000C1, 0x000B0379, 0x00000009, 0x0C24180F ) /* * 1718 120629204 */
-RASTERIZER_ENTRY( 0x0060743A, 0x00045119, 0x000000C1, 0x000B0779, 0x0C22488F, 0x0C241ACF ) /* * 186839 120281357 */
-RASTERIZER_ENTRY( 0x0060743A, 0x00045119, 0x000000C1, 0x000B0379, 0x0C22480F, 0x0C241ACF ) /* * 14102 115428820 */
-RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x000000C1, 0x000B0779, 0x00000009, 0x0C2410CF ) /* * 88530 98271949 */
-RASTERIZER_ENTRY( 0x0060743A, 0x00045110, 0x000000C1, 0x000B0379, 0x0C22480F, 0x0C241ACF ) /* * 12994 68053222 */
-RASTERIZER_ENTRY( 0x00602439, 0x00044110, 0x00000000, 0x000B0379, 0x00000009, 0x0C24100F ) /* * 68273 67454880 */
-RASTERIZER_ENTRY( 0x00602439, 0x00045119, 0x000000C1, 0x000B0779, 0x00000009, 0x0C24180F ) /* * 100026 62271618 */
-RASTERIZER_ENTRY( 0x0060743A, 0x00045110, 0x000000C1, 0x000B0779, 0x0C22480F, 0x0C241ACF ) /* * 153285 44411342 */
-RASTERIZER_ENTRY( 0x00602439, 0x00045119, 0x000000C1, 0x000B0779, 0x00000009, 0x0C24100F ) /* * 157545 40702131 */
-RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x000000C1, 0x000B0779, 0x0C241ACF, 0x0C24100F ) /* * 7800 31948800 */
-RASTERIZER_ENTRY( 0x0060743A, 0x00045110, 0x000000C1, 0x000B0779, 0x0C22408F, 0x0C241ACF ) /* * 47623 20321183 */
-RASTERIZER_ENTRY( 0x00602439, 0x00044119, 0x00000000, 0x000B0379, 0x00000009, 0x0C24188F ) /* * 21570 19324892 */
-//RASTERIZER_ENTRY( 0x00482435, 0x00045110, 0x000000C1, 0x000B0779, 0x0C241ACF, 0x0C24100F ) /* * 3698 15147008 */
-//RASTERIZER_ENTRY( 0x0060743A, 0x00045119, 0x000000C1, 0x000B0779, 0x0C22408F, 0x0C241ACF ) /* * 19765 12383722 */
-//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x000000C1, 0x000B0779, 0x0C24100F, 0x0C241ACF ) /* * 662274 10563855 */
-//RASTERIZER_ENTRY( 0x00602439, 0x00045110, 0x000000C1, 0x000B0779, 0x0C24180F, 0x0C241ACF ) /* * 27909 10462997 */
-//RASTERIZER_ENTRY( 0x00602439, 0x00045110, 0x000000C1, 0x000B0779, 0x00000009, 0x0C24180F ) /* * 78671 10286957 */
-//RASTERIZER_ENTRY( 0x00602439, 0x00045110, 0x000000C1, 0x000B0779, 0x00000009, 0x0C24188F ) /* * 52038 9928244 */
-//RASTERIZER_ENTRY( 0x0060743A, 0x00045119, 0x000000C1, 0x000B0779, 0x0C224A0F, 0x0C241ACF ) /* * 27469 9239782 */
-//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x000000C1, 0x000B0779, 0x00000009, 0x0C24100F ) /* * 757116 8072783 */
-//RASTERIZER_ENTRY( 0x0060743A, 0x00045110, 0x000000C1, 0x000B0779, 0x0C22488F, 0x0C241ACF ) /* * 18018 7035833 */
-//RASTERIZER_ENTRY( 0x00602439, 0x00044119, 0x00000000, 0x000B0379, 0x00000009, 0x0C241A0F ) /* * 50339 5976564 */
-//RASTERIZER_ENTRY( 0x00603430, 0x00040219, 0x00000000, 0x000B0379, 0x00000009, 0x0C2410CE ) /* * 29385 5466384 */
-//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x000000C1, 0x000B0779, 0x0C24100F, 0x0C24180F ) /* * 423347 5355017 */
-//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x000000C1, 0x000B0779, 0x0C24180F, 0x0C241ACF ) /* * 162620 4709092 */
-//RASTERIZER_ENTRY( 0x00602C19, 0x00045110, 0x000000C1, 0x000B0779, 0x00000009, 0x0C24100F ) /* * 463705 4642480 */
-//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x000000C1, 0x000B0779, 0x0C24180F, 0x0C24180F ) /* * 280337 4425529 */
-//RASTERIZER_ENTRY( 0x00602C19, 0x00045110, 0x000000C1, 0x000B0779, 0x0C24180F, 0x0C24180F ) /* * 212646 3432265 */
-//RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x000000C1, 0x000B0779, 0x0C2418CF, 0x0C24100F ) /* * 5788 2963456 */
-//RASTERIZER_ENTRY( 0x00602C19, 0x00045110, 0x000000C1, 0x000B0779, 0x0C24180F, 0x0C24100F ) /* * 460800 2609198 */
-//RASTERIZER_ENTRY( 0x00602439, 0x00045119, 0x000000C1, 0x000B0779, 0x0C24100F, 0x0C24180F ) /* * 251108 2392362 */
-//RASTERIZER_ENTRY( 0x00602C19, 0x00045110, 0x000000C1, 0x000B0779, 0x0C24100F, 0x0C24100F ) /* * 297219 2352862 */
-//RASTERIZER_ENTRY( 0x00602439, 0x00045119, 0x000000C1, 0x000B0779, 0x0584180F, 0x0C2410CF ) /* * 9913 2097069 */
-//RASTERIZER_ENTRY( 0x00602C19, 0x00045110, 0x000000C1, 0x000B0779, 0x0C24180F, 0x0C241ACF ) /* * 142722 2091569 */
-//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x000000C1, 0x000B0379, 0x0C24180F, 0x0C241ACF ) /* * 8820 2053325 */
-//RASTERIZER_ENTRY( 0x00602439, 0x00045119, 0x000000C1, 0x000B0779, 0x00000009, 0x0C24188F ) /* * 10346 2033427 */
-//RASTERIZER_ENTRY( 0x00602439, 0x00045119, 0x000000C1, 0x000B0779, 0x0C24188F, 0x0C241ACF ) /* * 2136 2017241 */
-//RASTERIZER_ENTRY( 0x00602439, 0x00044119, 0x00000000, 0x000B0379, 0x00000009, 0x0C24100F ) /* * 1505 1928490 */
-//RASTERIZER_ENTRY( 0x00602C19, 0x00045110, 0x000000C1, 0x000B0779, 0x0C24100F, 0x0C241ACF ) /* * 176734 1842440 */
-//RASTERIZER_ENTRY( 0x00602C19, 0x00045110, 0x000000C1, 0x000B0779, 0x0C24100F, 0x0C24180F ) /* * 262577 1799080 */
-//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x000000C1, 0x000B0779, 0x00000009, 0x0C24180F ) /* * 83179 1534171 */
-//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x000000C1, 0x000B0779, 0x00000009, 0x0C24188F ) /* * 3863 1527077 */
-//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x000000C1, 0x000B0379, 0x0C24180F, 0x0C24180F ) /* * 8021 1472661 */
-//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x000000C1, 0x000B0779, 0x0C241A0F, 0x0C241ACF ) /* * 85416 1342195 */
-//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x000000C1, 0x000B0779, 0x0C24180F, 0x0C24100F ) /* * 261360 1335048 */
-//RASTERIZER_ENTRY( 0x00602C19, 0x00000009, 0x000000C1, 0x000B0779, 0x0C2418CF, 0x0C24100F ) /* * 74811 1320900 */
-//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x000000C1, 0x000B0779, 0x0C24100F, 0x0C24100F ) /* * 239331 1268661 */
-//RASTERIZER_ENTRY( 0x00602439, 0x00045119, 0x000000C1, 0x000B0779, 0x0C24100F, 0x0C241ACF ) /* * 107769 1244175 */
-//RASTERIZER_ENTRY( 0x00602C19, 0x00045110, 0x000000C1, 0x000B0379, 0x0C24180F, 0x0C241ACF ) /* * 3706 1216182 */
-//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x000000C1, 0x000B0779, 0x0C24100F, 0x0C24188F ) /* * 49608 1206129 */
-//RASTERIZER_ENTRY( 0x00602C19, 0x00000009, 0x000000C1, 0x000B0779, 0x0C2418CF, 0x0C241ACF ) /* * 42440 1204109 */
-//RASTERIZER_ENTRY( 0x00482435, 0x00045110, 0x000000C1, 0x000B0779, 0x0C2410CF, 0x0C24100F ) /* * 29584 1168568 */
-//RASTERIZER_ENTRY( 0x00602439, 0x00045119, 0x000000C1, 0x000B0779, 0x0C24180F, 0x0C241ACF ) /* * 17729 1152869 */
-//RASTERIZER_ENTRY( 0x00602C19, 0x00045110, 0x000000C1, 0x000B0379, 0x0C24180F, 0x0C24100F ) /* * 4052 1108726 */
-//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x000000C1, 0x000B0779, 0x0C2418CF, 0x0C24100F ) /* * 7082 1079348 */
-//RASTERIZER_ENTRY( 0x00602439, 0x00044119, 0x00000000, 0x000B0379, 0x00000009, 0x0C24180F ) /* * 7761 1023855 */
-
-/* gradius4 ----> fbzColorPath alphaMode fogMode, fbzMode, texMode0, texMode1 */
-//RASTERIZER_ENTRY( 0x02420002, 0x00000009, 0x00000000, 0x00030F7B, 0x08241AC7, 0xFFFFFFFF ) /* intro */
-//RASTERIZER_ENTRY( 0x01420021, 0x00005119, 0x00000000, 0x00030F7B, 0x14261AC7, 0xFFFFFFFF ) /* intro */
-//RASTERIZER_ENTRY( 0x00000005, 0x00005119, 0x00000000, 0x00030F7B, 0x14261A87, 0xFFFFFFFF ) /* in-game */
-
-/* nbapbp ------> fbzColorPath alphaMode fogMode, fbzMode, texMode0, texMode1 */
-//RASTERIZER_ENTRY( 0x00424219, 0x00000000, 0x00000001, 0x00030B7B, 0x08241AC7, 0xFFFFFFFF ) /* intro */
-//RASTERIZER_ENTRY( 0x00002809, 0x00004110, 0x00000001, 0x00030FFB, 0x08241AC7, 0xFFFFFFFF ) /* in-game */
-//RASTERIZER_ENTRY( 0x00424219, 0x00000000, 0x00000001, 0x00030F7B, 0x08241AC7, 0xFFFFFFFF ) /* in-game */
-//RASTERIZER_ENTRY( 0x0200421A, 0x00001510, 0x00000001, 0x00030F7B, 0x08241AC7, 0xFFFFFFFF ) /* in-game */
-/* gtfore06 ----> fbzColorPath alphaMode fogMode, fbzMode, texMode0, texMode1 hash */
-RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x000000C1, 0x00010F79, 0x0C261ACD, 0x0C261ACD ) /* 18 1064626 69362127 */
-RASTERIZER_ENTRY( 0x00002425, 0x00045119, 0x000000C1, 0x00010F79, 0x0C224A0D, 0x0C261ACD ) /* 47 3272483 31242799 */
-RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x000000C1, 0x00010F79, 0x00000ACD, 0x0C261ACD ) /* 9 221917 12348555 */
-RASTERIZER_ENTRY( 0x00002425, 0x00045110, 0x000000C1, 0x00010FF9, 0x00000ACD, 0x0C261ACD ) /* 26 57291 9357989 */
-RASTERIZER_ENTRY( 0x00002429, 0x00000000, 0x000000C1, 0x00010FF9, 0x00000A09, 0x0C261A0F ) /* 12 97156 8530607 */
-RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x000000C1, 0x00010F79, 0x000000C4, 0x0C261ACD ) /* 55 110144 5265532 */
-RASTERIZER_ENTRY( 0x00002425, 0x00045110, 0x000000C1, 0x00010FF9, 0x000000C4, 0x0C261ACD ) /* 61 16644 1079382 */
-RASTERIZER_ENTRY( 0x00002425, 0x00045119, 0x000000C1, 0x00010FF9, 0x000000C4, 0x0C261ACD ) /* 5 8332 1065229 */
-RASTERIZER_ENTRY( 0x00002425, 0x00045119, 0x000000C1, 0x00010F79, 0x0C224A0D, 0x0C261A0D ) /* 45 8148 505013 */
-RASTERIZER_ENTRY( 0x00002425, 0x00045119, 0x00000000, 0x00010F79, 0x0C224A0D, 0x0C261A0D ) /* 84 45233 248267 */
-RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x000000C1, 0x00010F79, 0x0C261ACD, 0x0C2610C4 ) /* 90 10235 193036 */
-RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x000000C1, 0x00010FF9, 0x0C261ACD, 0x0C261ACD ) /* * 29 3777 83777 */
-RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x00000000, 0x00010FF9, 0x0C261ACD, 0x042210C0 ) /* 2 24952 66761 */
-RASTERIZER_ENTRY( 0x00002429, 0x00000000, 0x00000000, 0x00010FF9, 0x00000A09, 0x0C261A0F ) /* 24 661 50222 */
-RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x00000000, 0x00010FF9, 0x0C261ACD, 0x04221AC9 ) /* 92 12504 43720 */
-RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x000000C1, 0x00010FF9, 0x0C261ACD, 0x0C2610C4 ) /* 79 2160 43650 */
-RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x00000000, 0x00010FF9, 0x000000C4, 0x04221AC9 ) /* 19 2796 30377 */
-RASTERIZER_ENTRY( 0x00002425, 0x00045119, 0x000000C1, 0x00010FF9, 0x00000ACD, 0x0C261ACD ) /* 67 1962 14755 */
-RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x000000C1, 0x00010FF9, 0x000000C4, 0x0C261ACD ) /* * 66 74 3951 */
-RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x00000000, 0x00010FF9, 0x00000ACD, 0x04221AC9 ) /* 70 374 3691 */
-RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x000000C1, 0x00010FF9, 0x00000ACD, 0x0C261ACD ) /* * 20 350 7928 */
-/* virtpool ----> fbzColorPath alphaMode fogMode, fbzMode, texMode0, texMode1 hash */
-RASTERIZER_ENTRY( 0x00002421, 0x00000000, 0x00000000, 0x000B0739, 0x0C261A0F, 0x042210C0 ) /* * 78 2182388 74854175 */
-RASTERIZER_ENTRY( 0x00002421, 0x00000000, 0x00000000, 0x000B07F9, 0x0C261A0F, 0x042210C0 ) /* * 46 114830 6776826 */
-RASTERIZER_ENTRY( 0x00482405, 0x00045110, 0x00000000, 0x000B0739, 0x0C261A0F, 0x042210C0 ) /* * 58 1273673 4513463 */
-RASTERIZER_ENTRY( 0x00482405, 0x00045110, 0x00000000, 0x000B0739, 0x0C261A09, 0x042210C0 ) /* * 46 634995 2275612 */
-RASTERIZER_ENTRY( 0x00002421, 0x00000000, 0x00000000, 0x000B073B, 0x0C261A0F, 0x042210C0 ) /* * 46 26651 1883507 */
-RASTERIZER_ENTRY( 0x00482405, 0x00045110, 0x00000000, 0x000B073B, 0x0C261A0F, 0x042210C0 ) /* * 26 220644 751241 */
-//RASTERIZER_ENTRY( 0x00002421, 0x00445110, 0x00000000, 0x000B073B, 0x0C261A09, 0x042210C0 ) /* * 79 14846 3499120 */
-//RASTERIZER_ENTRY( 0x00002421, 0x00000000, 0x00000000, 0x000B0739, 0x0C261A09, 0x042210C0 ) /* * 66 26665 1583363 */
-//RASTERIZER_ENTRY( 0x00002421, 0x00000000, 0x00000000, 0x000B073B, 0x0C26100F, 0x042210C0 ) /* * 78 33096 957935 */
-//RASTERIZER_ENTRY( 0x00002425, 0x00445110, 0x00000000, 0x000B07F9, 0x0C261A0F, 0x042210C0 ) /* * 38 12494 678029 */
-//RASTERIZER_ENTRY( 0x00800000, 0x00000000, 0x00000000, 0x00000200, 0x00000000, 0x00000000 ) /* * 28 25348 316181 */
-//RASTERIZER_ENTRY( 0x00002421, 0x00000000, 0x00000000, 0x000B0739, 0x0C26100F, 0x042210C0 ) /* * 13 11344 267903 */
-//RASTERIZER_ENTRY( 0x00002421, 0x00000000, 0x00000000, 0x000B073B, 0x0C261A09, 0x042210C0 ) /* * 34 1548 112168 */
-//RASTERIZER_ENTRY( 0x00002421, 0x00000000, 0x00000000, 0x000B07FB, 0x0C26100F, 0x042210C0 ) /* * 35 664 25222 */
-//RASTERIZER_ENTRY( 0x00000002, 0x00000000, 0x00000000, 0x00000300, 0xFFFFFFFF, 0xFFFFFFFF ) /* * 33 512 18393 */
-//RASTERIZER_ENTRY( 0x00002421, 0x00000000, 0x00000000, 0x000B07FB, 0x0C261A0F, 0x042210C0 ) /* * 14 216 16842 */
-//RASTERIZER_ENTRY( 0x00000001, 0x00000000, 0x00000000, 0x00000300, 0x00000800, 0x00000800 ) /* * 87 2 72 */
-//RASTERIZER_ENTRY( 0x00000001, 0x00000000, 0x00000000, 0x00000200, 0x08241A00, 0x08241A00 ) /* * 92 2 8 */
-//RASTERIZER_ENTRY( 0x00000001, 0x00000000, 0x00000000, 0x00000200, 0x00000000, 0x08241A00 ) /* * 93 2 8 */
-
-#endif
diff --git a/src/devices/video/voodoo_rast.inc b/src/devices/video/voodoo_rast.inc
new file mode 100644
index 00000000000..e7251bf9a01
--- /dev/null
+++ b/src/devices/video/voodoo_rast.inc
@@ -0,0 +1,493 @@
+
+/***************************************************************************
+ GAME-SPECIFIC RASTERIZERS
+***************************************************************************/
+
+/* blitz ------> fbzColorPath alphaMode fogMode, fbzMode, texMode0, texMode1 */
+RASTERIZER_ENTRY( 0x00000035, 0x00000000, 0x00000000, 0x000B0739, 0x0C261A0F, 0xFFFFFFFF ) /* 284269 914846168 */
+RASTERIZER_ENTRY( 0x00002C35, 0x00515110, 0x00000000, 0x000B07F9, 0x0C261A0F, 0xFFFFFFFF ) /* 485421 440309121 */
+RASTERIZER_ENTRY( 0x00582C35, 0x00515110, 0x00000000, 0x000B0739, 0x0C261ACF, 0xFFFFFFFF ) /* 31606 230753709 */
+RASTERIZER_ENTRY( 0x00582C35, 0x00515110, 0x00000000, 0x000B0739, 0x0C261A0F, 0xFFFFFFFF ) /* 76742 211701679 */
+RASTERIZER_ENTRY( 0x01420039, 0x00000000, 0x00000000, 0x000B073B, 0x0C261ACF, 0xFFFFFFFF ) /* 6188 152109056 */
+RASTERIZER_ENTRY( 0x01420039, 0x00000000, 0x00000000, 0x000B07F9, 0x0C261ACF, 0xFFFFFFFF ) /* 1100 108134400 */
+RASTERIZER_ENTRY( 0x00002C35, 0x00515119, 0x00000000, 0x000B0739, 0x0C261A0F, 0xFFFFFFFF ) /* 6229525 106197740 */
+RASTERIZER_ENTRY( 0x00002C35, 0x00515119, 0x00000000, 0x000B0799, 0x0C261A0F, 0xFFFFFFFF ) /* 905641 75886220 */
+RASTERIZER_ENTRY( 0x00002C35, 0x00515119, 0x00000000, 0x000B07F9, 0x0C261A0F, 0xFFFFFFFF ) /* 205236 53317253 */
+RASTERIZER_ENTRY( 0x01422439, 0x00000000, 0x00000000, 0x000B073B, 0x0C2610C9, 0xFFFFFFFF ) /* 817356 48881349 */
+RASTERIZER_ENTRY( 0x00000035, 0x00000000, 0x00000000, 0x000B07F9, 0x0C261A0F, 0xFFFFFFFF ) /* 37979 41687251 */
+RASTERIZER_ENTRY( 0x00002C35, 0x00515110, 0x00000000, 0x000B0739, 0x0C261A0F, 0xFFFFFFFF ) /* 26014 41183295 */
+RASTERIZER_ENTRY( 0x01420039, 0x00000000, 0x00000000, 0x000B07F9, 0x0C261A0F, 0xFFFFFFFF ) /* 2512 37911104 */
+RASTERIZER_ENTRY( 0x00006136, 0x00515119, 0x00000000, 0x000B07F9, 0x0C261A0F, 0xFFFFFFFF ) /* 28834 15527654 */
+RASTERIZER_ENTRY( 0x00582435, 0x00515110, 0x00000000, 0x000B0739, 0x0C261ACF, 0xFFFFFFFF ) /* 9878 4979429 */
+RASTERIZER_ENTRY( 0x00002C35, 0x00515119, 0x00000000, 0x000B0739, 0x0C261ACF, 0xFFFFFFFF ) /* 199952 4622064 */
+RASTERIZER_ENTRY( 0x00582C35, 0x00515110, 0x00000000, 0x000B0739, 0x0C261AC9, 0xFFFFFFFF ) /* 8672 3676949 */
+RASTERIZER_ENTRY( 0x00582C35, 0x00515010, 0x00000000, 0x000B0739, 0x0C2610CF, 0xFFFFFFFF ) /* 616 2743972 */
+RASTERIZER_ENTRY( 0x01422C39, 0x00045110, 0x00000000, 0x000B0739, 0x0C261A0F, 0xFFFFFFFF ) /* 81380 2494832 */
+//RASTERIZER_ENTRY( 0x00582435, 0x00515110, 0x00000000, 0x000B0739, 0x0C261AC9, 0xFFFFFFFF ) /* 7670 2235587 */
+//RASTERIZER_ENTRY( 0x00592136, 0x00515110, 0x00000000, 0x000B073B, 0x0C261A0F, 0xFFFFFFFF ) /* 210 1639140 */
+//RASTERIZER_ENTRY( 0x00582C35, 0x00515110, 0x00000000, 0x000B073B, 0x0C261A0F, 0xFFFFFFFF ) /* 108 1154736 */
+//RASTERIZER_ENTRY( 0x00002C35, 0x00515110, 0x00000000, 0x000B07F9, 0x0C26180F, 0xFFFFFFFF ) /* 2152 1150842 */
+//RASTERIZER_ENTRY( 0x00592136, 0x00515110, 0x00000000, 0x000B073B, 0x0C261ACF, 0xFFFFFFFF ) /* 152 880560 */
+//RASTERIZER_ENTRY( 0x00008035, 0x00515119, 0x00000000, 0x000B0739, 0x0C261A0F, 0xFFFFFFFF ) /* 90848 805730 */
+//RASTERIZER_ENTRY( 0x00002C35, 0x00515119, 0x00000000, 0x000B07F9, 0x0C261AC9, 0xFFFFFFFF ) /* 2024 571406 */
+//RASTERIZER_ENTRY( 0x00012136, 0x00515110, 0x00000000, 0x000B07F9, 0x0C261A0F, 0xFFFFFFFF ) /* 1792 494592 */
+//RASTERIZER_ENTRY( 0x00000002, 0x00000000, 0x00000000, 0x00000300, 0xFFFFFFFF, 0xFFFFFFFF ) /* 256 161280 */
+
+/* blitz99 ----> fbzColorPath alphaMode fogMode, fbzMode, texMode0, texMode1 */
+RASTERIZER_ENTRY( 0x00000035, 0x00000009, 0x00000000, 0x000B0739, 0x0C261A0F, 0xFFFFFFFF ) /* * 6297478 149465839 */
+RASTERIZER_ENTRY( 0x00000035, 0x00000009, 0x00000000, 0x000B0739, 0x0C261ACF, 0xFFFFFFFF ) /* * 210693 6285480 */
+RASTERIZER_ENTRY( 0x01422C39, 0x00045110, 0x00000000, 0x000B073B, 0x0C2610C9, 0xFFFFFFFF ) /* * 20180 2718710 */
+RASTERIZER_ENTRY( 0x00582C35, 0x00515110, 0x00000000, 0x000B073B, 0x0C261ACF, 0xFFFFFFFF ) /* * 360 2425416 */
+RASTERIZER_ENTRY( 0x00002C35, 0x00000009, 0x00000000, 0x000B0739, 0x0C261A0F, 0xFFFFFFFF ) /* * 67059 1480978 */
+RASTERIZER_ENTRY( 0x00008035, 0x00000009, 0x00000000, 0x000B0739, 0x0C261A0F, 0xFFFFFFFF ) /* * 24811 400666 */
+RASTERIZER_ENTRY( 0x01420039, 0x00000000, 0x00000000, 0x000B073B, 0x0C2610C9, 0xFFFFFFFF ) /* * 10304 324468 */
+RASTERIZER_ENTRY( 0x00002C35, 0x00515110, 0x00000000, 0x000B0739, 0x0C261ACF, 0xFFFFFFFF ) /* * 1024 112665 */
+
+/* blitz2k ----> fbzColorPath alphaMode fogMode, fbzMode, texMode0, texMode1 */
+RASTERIZER_ENTRY( 0x01420039, 0x00000000, 0x00000000, 0x000B0739, 0x0C261ACF, 0xFFFFFFFF ) /* * 3880 95344128 */
+RASTERIZER_ENTRY( 0x00582C35, 0x00514110, 0x00000000, 0x000B0739, 0x0C261ACF, 0xFFFFFFFF ) /* * 148 1785480 */
+RASTERIZER_ENTRY( 0x01420039, 0x00000000, 0x00000000, 0x000B073B, 0x0C2610CF, 0xFFFFFFFF ) /* * 9976 314244 */
+
+/* carnevil ---> fbzColorPath alphaMode fogMode, fbzMode, texMode0, texMode1 */
+RASTERIZER_ENTRY( 0x00002435, 0x00045119, 0x00000000, 0x00030279, 0x0C261A0F, 0xFFFFFFFF ) /* * 492 84128082 */
+RASTERIZER_ENTRY( 0x00002425, 0x00045119, 0x00000000, 0x00030679, 0x0C261A0F, 0xFFFFFFFF ) /* * 1988398 36166780 */
+RASTERIZER_ENTRY( 0x00486116, 0x00045119, 0x00000000, 0x00030279, 0x0C26180F, 0xFFFFFFFF ) /* * 34424 28788847 */
+RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x00030679, 0x0C261A0F, 0xFFFFFFFF ) /* * 514 26316800 */
+RASTERIZER_ENTRY( 0x00480015, 0x00045119, 0x00000000, 0x000306F9, 0x0C261AC9, 0xFFFFFFFF ) /* * 7346 18805760 */
+RASTERIZER_ENTRY( 0x00002435, 0x00045119, 0x00000000, 0x000302F9, 0x0C26180F, 0xFFFFFFFF ) /* * 130764 18678972 */
+RASTERIZER_ENTRY( 0x00482415, 0x00045119, 0x00000000, 0x000306F9, 0x0C2618C9, 0xFFFFFFFF ) /* * 7244 12179040 */
+RASTERIZER_ENTRY( 0x00482415, 0x00045119, 0x00000000, 0x000306F9, 0x0C26180F, 0xFFFFFFFF ) /* * 84520 12059721 */
+RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000306F9, 0x0C261AC9, 0xFFFFFFFF ) /* * 21926 11226112 */
+RASTERIZER_ENTRY( 0x00482415, 0x00045119, 0x00000000, 0x00030679, 0x0C2618C9, 0xFFFFFFFF ) /* * 92115 8926536 */
+RASTERIZER_ENTRY( 0x00482415, 0x00045119, 0x00000000, 0x00030279, 0x0C261A0F, 0xFFFFFFFF ) /* * 1730 7629334 */
+RASTERIZER_ENTRY( 0x00002435, 0x00045119, 0x00000000, 0x000B0779, 0x0C26180F, 0xFFFFFFFF ) /* * 37408 5545956 */
+RASTERIZER_ENTRY( 0x00002435, 0x00045119, 0x00000000, 0x00030679, 0x0C26180F, 0xFFFFFFFF ) /* * 26528 4225026 */
+RASTERIZER_ENTRY( 0x00002435, 0x00045119, 0x00000000, 0x000306F9, 0x0C26180F, 0xFFFFFFFF ) /* * 35764 3230884 */
+RASTERIZER_ENTRY( 0x01422409, 0x00045119, 0x00000000, 0x00030679, 0x0C261A0F, 0xFFFFFFFF ) /* * 96020 1226438 */
+RASTERIZER_ENTRY( 0x00482415, 0x00045119, 0x00000000, 0x00030279, 0x0C2618C9, 0xFFFFFFFF ) /* * 1020 574649 */
+RASTERIZER_ENTRY( 0x00482415, 0x00045119, 0x00000000, 0x00030679, 0x0C261A0F, 0xFFFFFFFF ) /* * 360 370008 */
+RASTERIZER_ENTRY( 0x00480015, 0x00045119, 0x00000000, 0x000306F9, 0x0C261A0F, 0xFFFFFFFF ) /* * 576 334404 */
+
+/* calspeed ---> fbzColorPath alphaMode fogMode, fbzMode, texMode0, texMode1 */
+RASTERIZER_ENTRY( 0x00002815, 0x00045119, 0x00000001, 0x000B07F9, 0x0C26100F, 0xFFFFFFFF ) /* * 99120 1731923836 */
+RASTERIZER_ENTRY( 0x01022819, 0x00000009, 0x00000001, 0x000B0739, 0x0C26100F, 0xFFFFFFFF ) /* * 9955804 1526119944 */
+RASTERIZER_ENTRY( 0x00002815, 0x00045119, 0x00000001, 0x000B0739, 0x0C26180F, 0xFFFFFFFF ) /* * 1898207 1124776864 */
+RASTERIZER_ENTRY( 0x01022819, 0x00000009, 0x00000001, 0x000B073B, 0x0C26100F, 0xFFFFFFFF ) /* * 3487467 1101663125 */
+RASTERIZER_ENTRY( 0x01022C19, 0x00000009, 0x00000001, 0x000B0739, 0x0C26100F, 0xFFFFFFFF ) /* * 1079277 609256033 */
+RASTERIZER_ENTRY( 0x00002815, 0x00045119, 0x00000001, 0x000A0723, 0x0C261ACF, 0xFFFFFFFF ) /* * 11880 583925760 */
+RASTERIZER_ENTRY( 0x00602819, 0x00045119, 0x00000001, 0x000B07F9, 0x0C26180F, 0xFFFFFFFF ) /* * 63644 582469888 */
+RASTERIZER_ENTRY( 0x01022819, 0x00000009, 0x00000001, 0x000B07F9, 0x0C261A0F, 0xFFFFFFFF ) /* * 22688 556797972 */
+RASTERIZER_ENTRY( 0x00002815, 0x00045119, 0x00000001, 0x000B07F9, 0x0C26180F, 0xFFFFFFFF ) /* * 1360254 417068457 */
+RASTERIZER_ENTRY( 0x00002815, 0x00045119, 0x00000001, 0x000B0739, 0x0C26100F, 0xFFFFFFFF ) /* * 3427489 405421272 */
+RASTERIZER_ENTRY( 0x00002C15, 0x00045119, 0x00000001, 0x000B0739, 0x0C26180F, 0xFFFFFFFF ) /* * 286809 238944049 */
+RASTERIZER_ENTRY( 0x00002815, 0x00045119, 0x00000001, 0x000A0321, 0x0C26180F, 0xFFFFFFFF ) /* * 28160 231084818 */
+RASTERIZER_ENTRY( 0x01022819, 0x00000009, 0x00000001, 0x000B07FB, 0x0C26100F, 0xFFFFFFFF ) /* * 183564 201014424 */
+RASTERIZER_ENTRY( 0x00480015, 0x00045119, 0x00000001, 0x000B0339, 0x0C26100F, 0xFFFFFFFF ) /* * 15275 168207109 */
+RASTERIZER_ENTRY( 0x01022819, 0x00000009, 0x00000001, 0x000B07F9, 0x0C26100F, 0xFFFFFFFF ) /* * 2856 134400000 */
+RASTERIZER_ENTRY( 0x00002815, 0x00045119, 0x00000001, 0x000B0339, 0x0C26180F, 0xFFFFFFFF ) /* * 98551 110417974 */
+RASTERIZER_ENTRY( 0x01022819, 0x00000009, 0x00000001, 0x000B07F9, 0x0C2610CF, 0xFFFFFFFF ) /* * 47040 107360728 */
+RASTERIZER_ENTRY( 0x00480015, 0x00045119, 0x00000001, 0x000B0339, 0x0C26180F, 0xFFFFFFFF ) /* * 13128 86876789 */
+RASTERIZER_ENTRY( 0x01022C19, 0x00000009, 0x00000001, 0x000B073B, 0x0C26100F, 0xFFFFFFFF ) /* * 257515 76329054 */
+RASTERIZER_ENTRY( 0x00002815, 0x00045119, 0x00000001, 0x000B07F9, 0x0C261A0F, 0xFFFFFFFF ) /* * 3934 64958208 */
+//RASTERIZER_ENTRY( 0x00002C15, 0x00045119, 0x00000001, 0x000B07F9, 0x0C26180F, 0xFFFFFFFF ) /* * 77400 63786236 */
+//RASTERIZER_ENTRY( 0x01022C19, 0x00000009, 0x00000001, 0x000B07F9, 0x0C261A0F, 0xFFFFFFFF ) /* * 12500 63151200 */
+//RASTERIZER_ENTRY( 0x0102001A, 0x00045119, 0x00000001, 0x000A0321, 0xFFFFFFFF, 0xFFFFFFFF ) /* * 8764 57629312 */
+//RASTERIZER_ENTRY( 0x00002C15, 0x00045119, 0x00000001, 0x000A0321, 0x0C26180F, 0xFFFFFFFF ) /* * 3257 32708448 */
+//RASTERIZER_ENTRY( 0x00002815, 0x00045119, 0x00000001, 0x000A07E3, 0x0C2610CF, 0xFFFFFFFF ) /* * 28364 31195605 */
+//RASTERIZER_ENTRY( 0x00002C15, 0x00045119, 0x00000001, 0x000B0739, 0x0C26100F, 0xFFFFFFFF ) /* * 409001 30699647 */
+//RASTERIZER_ENTRY( 0x00482C35, 0x00045119, 0x00000001, 0x000A0321, 0x0C26100F, 0xFFFFFFFF ) /* * 17669 11214172 */
+//RASTERIZER_ENTRY( 0x00002C15, 0x00045119, 0x00000001, 0x000B0339, 0x0C26180F, 0xFFFFFFFF ) /* * 5844 6064373 */
+//RASTERIZER_ENTRY( 0x00002C15, 0x00045119, 0x00000001, 0x000B07FB, 0x0C26100F, 0xFFFFFFFF ) /* * 626 4651080 */
+//RASTERIZER_ENTRY( 0x00482C35, 0x00045119, 0x00000001, 0x000A0321, 0x0C26180F, 0xFFFFFFFF ) /* * 5887 2945500 */
+//RASTERIZER_ENTRY( 0x00480015, 0x00045119, 0x00000001, 0x000B0339, 0x0C261A0F, 0xFFFFFFFF ) /* * 1090 2945093 */
+//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x00000001, 0x000B07F9, 0x0C26180F, 0xFFFFFFFF ) /* * 228 1723908 */
+//RASTERIZER_ENTRY( 0x00002C15, 0x00045119, 0x00000001, 0x000A0321, 0x0C261A0F, 0xFFFFFFFF ) /* * 112 1433600 */
+//RASTERIZER_ENTRY( 0x00002815, 0x00045119, 0x00000001, 0x000B0739, 0x0C261A0F, 0xFFFFFFFF ) /* * 3091 1165805 */
+//RASTERIZER_ENTRY( 0x01022C19, 0x00000009, 0x00000001, 0x000B07FB, 0x0C26100F, 0xFFFFFFFF ) /* * 620 791202 */
+
+/* hyprdriv ---> fbzColorPath alphaMode fogMode, fbzMode, texMode0, texMode1 */
+RASTERIZER_ENTRY( 0x01420039, 0x00000000, 0x00000001, 0x000B0739, 0x0C261ACF, 0xFFFFFFFF ) /* * 60860 498565120 */
+RASTERIZER_ENTRY( 0x01420039, 0x00000000, 0x00000001, 0x000B07F9, 0x0C261A0F, 0xFFFFFFFF ) /* * 28688 235012096 */
+RASTERIZER_ENTRY( 0x01420039, 0x00000000, 0x00000001, 0x000B07F9, 0x0C261ACF, 0xFFFFFFFF ) /* * 11844 156499968 */
+RASTERIZER_ENTRY( 0x00580035, 0x00045119, 0x00000001, 0x00030279, 0x0C261A0F, 0xFFFFFFFF ) /* * 175990 146518715 */
+RASTERIZER_ENTRY( 0x00582C35, 0x00515110, 0x00000001, 0x000B0739, 0x0C261ACF, 0xFFFFFFFF ) /* * 2336 114819072 */
+RASTERIZER_ENTRY( 0x00580035, 0x00000000, 0x00000001, 0x000B073B, 0x0C261A1F, 0xFFFFFFFF ) /* * 363325 100404294 */
+RASTERIZER_ENTRY( 0x00582C35, 0x00045110, 0x00000001, 0x000B073B, 0x0C261A0F, 0xFFFFFFFF ) /* * 40918 96318738 */
+RASTERIZER_ENTRY( 0x01420039, 0x00000000, 0x00000001, 0x000B0739, 0x0C26101F, 0xFFFFFFFF ) /* * 54815 94990269 */
+RASTERIZER_ENTRY( 0x01420039, 0x00000000, 0x00000001, 0x000B0739, 0x0C261A1F, 0xFFFFFFFF ) /* * 123032 91652828 */
+RASTERIZER_ENTRY( 0x01422429, 0x00000000, 0x00000001, 0x000B0739, 0x0C261A1F, 0xFFFFFFFF ) /* * 82767 86431997 */
+RASTERIZER_ENTRY( 0x01422429, 0x00000000, 0x00000001, 0x000B0739, 0x0C26101F, 0xFFFFFFFF ) /* * 9874 78101834 */
+RASTERIZER_ENTRY( 0x01422429, 0x00000000, 0x00000001, 0x000B073B, 0x0C261A1F, 0xFFFFFFFF ) /* * 102146 72570879 */
+RASTERIZER_ENTRY( 0x01420039, 0x00000000, 0x00000001, 0x000B073B, 0x0C26100F, 0xFFFFFFFF ) /* * 657804 67229658 */
+RASTERIZER_ENTRY( 0x00580035, 0x00045110, 0x00000001, 0x000B03F9, 0x0C261A0F, 0xFFFFFFFF ) /* * 10428 63173865 */
+RASTERIZER_ENTRY( 0x01422429, 0x00000000, 0x00000001, 0x000B073B, 0x0C261A0F, 0xFFFFFFFF ) /* * 230145 57902926 */
+RASTERIZER_ENTRY( 0x01422C19, 0x00000000, 0x00000001, 0x000B073B, 0x0C261A0F, 0xFFFFFFFF ) /* * 769654 53992486 */
+RASTERIZER_ENTRY( 0x01422C19, 0x00000000, 0x00000001, 0x000B0739, 0x0C26101F, 0xFFFFFFFF ) /* * 85365 51865697 */
+RASTERIZER_ENTRY( 0x00582435, 0x00515110, 0x00000001, 0x000B0739, 0x0C261AC9, 0xFFFFFFFF ) /* * 454674 46165536 */
+RASTERIZER_ENTRY( 0x00580035, 0x00000000, 0x00000001, 0x000B073B, 0x0C26101F, 0xFFFFFFFF ) /* * 101889 33337987 */
+RASTERIZER_ENTRY( 0x00580035, 0x00000000, 0x00000001, 0x000B0739, 0x0C26101F, 0xFFFFFFFF ) /* * 255952 29810993 */
+//RASTERIZER_ENTRY( 0x00582425, 0x00000000, 0x00000001, 0x000B073B, 0x0C261A1F, 0xFFFFFFFF ) /* * 106190 25430383 */
+//RASTERIZER_ENTRY( 0x01420039, 0x00000000, 0x00000001, 0x000B073B, 0x0C261A1F, 0xFFFFFFFF ) /* * 595001 23268601 */
+//RASTERIZER_ENTRY( 0x0142612A, 0x00000000, 0x00000001, 0x000B0739, 0xFFFFFFFF, 0xFFFFFFFF ) /* * 946410 22589110 */
+//RASTERIZER_ENTRY( 0x01420039, 0x00000000, 0x00000001, 0x000B073B, 0x0C261A0F, 0xFFFFFFFF ) /* * 330036 21323230 */
+//RASTERIZER_ENTRY( 0x01422C19, 0x00000000, 0x00000001, 0x000B0739, 0x0C261A1F, 0xFFFFFFFF ) /* * 40089 13470498 */
+//RASTERIZER_ENTRY( 0x01422C19, 0x00000000, 0x00000000, 0x000B073B, 0x0C261A0F, 0xFFFFFFFF ) /* * 90906 12850855 */
+//RASTERIZER_ENTRY( 0x00582C35, 0x00515110, 0x00000001, 0x000B0739, 0x0C261A0F, 0xFFFFFFFF ) /* * 9492 12115280 */
+//RASTERIZER_ENTRY( 0x01420039, 0x00000000, 0x00000001, 0x000B073B, 0x0C26101F, 0xFFFFFFFF ) /* * 453515 12013961 */
+//RASTERIZER_ENTRY( 0x01422C19, 0x00000000, 0x00000001, 0x000B073B, 0x0C261A1F, 0xFFFFFFFF ) /* * 33829 8384312 */
+//RASTERIZER_ENTRY( 0x00580035, 0x00000000, 0x00000001, 0x000B073B, 0x0C26100F, 0xFFFFFFFF ) /* * 83986 7841206 */
+//RASTERIZER_ENTRY( 0x00580035, 0x00045110, 0x00000001, 0x000B0339, 0x0C261A0F, 0xFFFFFFFF ) /* * 42515 7242660 */
+//RASTERIZER_ENTRY( 0x00582425, 0x00000000, 0x00000001, 0x000B0739, 0x0C26100F, 0xFFFFFFFF ) /* * 706 6158684 */
+//RASTERIZER_ENTRY( 0x00582425, 0x00000000, 0x00000001, 0x000B0739, 0x0C26101F, 0xFFFFFFFF ) /* * 62051 5819485 */
+//RASTERIZER_ENTRY( 0x0142612A, 0x00000000, 0x00000000, 0x000B0739, 0xFFFFFFFF, 0xFFFFFFFF ) /* * 135139 5063467 */
+//RASTERIZER_ENTRY( 0x01422429, 0x00000000, 0x00000001, 0x000B073B, 0x0C26100F, 0xFFFFFFFF ) /* * 10359 5135837 */
+//RASTERIZER_ENTRY( 0x01420039, 0x00000000, 0x00000001, 0x000B0739, 0x0C26100F, 0xFFFFFFFF ) /* * 170159 4449246 */
+//RASTERIZER_ENTRY( 0x00582425, 0x00000000, 0x00000001, 0x000B073B, 0x0C26101F, 0xFFFFFFFF ) /* * 19037 4371219 */
+//RASTERIZER_ENTRY( 0x01422429, 0x00000000, 0x00000001, 0x000B073B, 0x0C26101F, 0xFFFFFFFF ) /* * 8963 4352501 */
+//RASTERIZER_ENTRY( 0x01422C39, 0x00045110, 0x00000001, 0x000B073B, 0x0C261A0F, 0xFFFFFFFF ) /* * 47712 4159994 */
+//RASTERIZER_ENTRY( 0x01422C19, 0x00000000, 0x00000000, 0x000B073B, 0x0C261ACF, 0xFFFFFFFF ) /* * 47525 4151435 */
+//RASTERIZER_ENTRY( 0x01422C19, 0x00000000, 0x00000001, 0x000B0739, 0x0C261A0F, 0xFFFFFFFF ) /* * 34980 3794066 */
+//RASTERIZER_ENTRY( 0x0142613A, 0x00045110, 0x00000000, 0x000B0739, 0xFFFFFFFF, 0xFFFFFFFF ) /* * 6540 2358068 */
+//RASTERIZER_ENTRY( 0x0142611A, 0x00045110, 0x00000000, 0x000B0739, 0xFFFFFFFF, 0xFFFFFFFF ) /* * 703308 2096781 */
+//RASTERIZER_ENTRY( 0x00580035, 0x00045110, 0x00000001, 0x000B0339, 0x0C261A1F, 0xFFFFFFFF ) /* * 3963 2079440 */
+//RASTERIZER_ENTRY( 0x01422439, 0x00000000, 0x00000001, 0x000B073B, 0x0C261AC9, 0xFFFFFFFF ) /* * 22866 2008397 */
+//RASTERIZER_ENTRY( 0x01420039, 0x00000000, 0x00000001, 0x000B0739, 0x0C261A0F, 0xFFFFFFFF ) /* * 69705 1673671 */
+//RASTERIZER_ENTRY( 0x01422C19, 0x00000000, 0x00000001, 0x000B073B, 0x0C26100F, 0xFFFFFFFF ) /* * 13366 1575120 */
+//RASTERIZER_ENTRY( 0x0142613A, 0x00000000, 0x00000000, 0x000B0739, 0xFFFFFFFF, 0xFFFFFFFF ) /* * 50625 1408211 */
+//RASTERIZER_ENTRY( 0x0142613A, 0x00045110, 0x00000001, 0x000B0739, 0xFFFFFFFF, 0xFFFFFFFF ) /* * 1244348 1244346 */
+//RASTERIZER_ENTRY( 0x00582425, 0x00000000, 0x00000001, 0x000B073B, 0x0C26100F, 0xFFFFFFFF ) /* * 13791 1222735 */
+//RASTERIZER_ENTRY( 0x00580035, 0x00000000, 0x00000001, 0x000B073B, 0x0C261A0F, 0xFFFFFFFF ) /* * 33064 943590 */
+//RASTERIZER_ENTRY( 0x0142610A, 0x00045110, 0x00000001, 0x000B0739, 0xFFFFFFFF, 0xFFFFFFFF ) /* * 2041 926507 */
+//RASTERIZER_ENTRY( 0x00480019, 0x00045110, 0x00000001, 0x000B073B, 0x0C261A0F, 0xFFFFFFFF ) /* * 2722 453924 */
+//RASTERIZER_ENTRY( 0x00580035, 0x00000000, 0x00000001, 0x000B0739, 0x0C26100F, 0xFFFFFFFF ) /* * 68232 306869 */
+//RASTERIZER_ENTRY( 0x0142611A, 0x00045110, 0x00000001, 0x000B0379, 0xFFFFFFFF, 0xFFFFFFFF ) /* * 7164 269002 */
+
+/* mace -------> fbzColorPath alphaMode fogMode, fbzMode, texMode0, texMode1 */
+RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x0824100F, 0xFFFFFFFF ) /* * 7204150 1340201579 */
+RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0779, 0x08241ADF, 0xFFFFFFFF ) /* * 15332 1181663232 */
+RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0779, 0x082418DF, 0xFFFFFFFF ) /* * 104456 652582379 */
+RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x0824180F, 0xFFFFFFFF ) /* * 488613 368880164 */
+RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x082418CF, 0xFFFFFFFF ) /* * 352924 312417405 */
+RASTERIZER_ENTRY( 0x00480035, 0x00045119, 0x00000000, 0x000B0779, 0x082418DF, 0xFFFFFFFF ) /* * 15024 291762384 */
+RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x082410CF, 0xFFFFFFFF ) /* * 711824 279246170 */
+RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x0824100F, 0xFFFFFFFF ) /* * 735574 171881981 */
+RASTERIZER_ENTRY( 0x00602401, 0x00045119, 0x00000000, 0x000B0779, 0x082418DF, 0xFFFFFFFF ) /* * 943006 154374023 */
+RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x082410CF, 0xFFFFFFFF ) /* * 103877 101077498 */
+RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x0824108F, 0xFFFFFFFF ) /* * 710125 87547221 */
+RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x08241ACF, 0xFFFFFFFF ) /* * 9834 79774966 */
+RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0379, 0x082418DF, 0xFFFFFFFF ) /* * 17644 70187036 */
+RASTERIZER_ENTRY( 0x00480035, 0x00045119, 0x00000000, 0x000B0379, 0x082418DF, 0xFFFFFFFF ) /* * 11324 56633925 */
+RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0379, 0x0824180F, 0xFFFFFFFF ) /* * 96743 40820171 */
+RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0739, 0x082418CF, 0xFFFFFFFF ) /* * 166053 29100794 */
+RASTERIZER_ENTRY( 0x00482435, 0x00045117, 0x00000000, 0x000B0339, 0x082418CF, 0xFFFFFFFF ) /* * 166053 29100697 */
+RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0379, 0x0824188F, 0xFFFFFFFF ) /* * 6723 29076516 */
+RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x0824188F, 0xFFFFFFFF ) /* * 53297 23928976 */
+RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x0824180F, 0xFFFFFFFF ) /* * 10309 19001776 */
+//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0379, 0x0824180F, 0xFFFFFFFF ) /* * 22105 17473157 */
+//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0379, 0x0824188F, 0xFFFFFFFF ) /* * 11304 17236698 */
+//RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0779, 0x082410DF, 0xFFFFFFFF ) /* * 1664 17180883 */
+//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x08241A0F, 0xFFFFFFFF ) /* * 148606 12274278 */
+//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x082418CF, 0xFFFFFFFF ) /* * 80692 9248007 */
+//RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000001, 0x000B0739, 0x082418CF, 0xFFFFFFFF ) /* * 37819 8080994 */
+//RASTERIZER_ENTRY( 0x00482435, 0x00045117, 0x00000001, 0x000B0339, 0x082418CF, 0xFFFFFFFF ) /* * 37819 8080969 */
+//RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000001, 0x000B0379, 0x082418DF, 0xFFFFFFFF ) /* * 536 7930305 */
+//RASTERIZER_ENTRY( 0x00482435, 0x00045117, 0x00000000, 0x000B0339, 0x082418CF, 0xFFFFFFFF ) /* * 27601 7905364 */
+//RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0739, 0x082418CF, 0xFFFFFFFF ) /* * 27601 7905364 */
+//RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0739, 0x082418CF, 0xFFFFFFFF ) /* * 36314 7667917 */
+//RASTERIZER_ENTRY( 0x00482435, 0x00045117, 0x00000000, 0x000B0339, 0x082418CF, 0xFFFFFFFF ) /* * 36314 7667917 */
+//RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0739, 0x082418CF, 0xFFFFFFFF ) /* * 31109 6020110 */
+//RASTERIZER_ENTRY( 0x00482435, 0x00045117, 0x00000000, 0x000B0339, 0x082418CF, 0xFFFFFFFF ) /* * 31109 6020110 */
+//RASTERIZER_ENTRY( 0x00482435, 0x00045117, 0x00000000, 0x000B0339, 0x082418CF, 0xFFFFFFFF ) /* * 42689 5959231 */
+//RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0739, 0x082418CF, 0xFFFFFFFF ) /* * 42689 5959231 */
+//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x0824188F, 0xFFFFFFFF ) /* * 11965 5118044 */
+//RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000001, 0x000B0379, 0x0824180F, 0xFFFFFFFF ) /* * 11923 4662909 */
+//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0379, 0x082410CF, 0xFFFFFFFF ) /* * 4422 4624260 */
+//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0379, 0x0824100F, 0xFFFFFFFF ) /* * 3853 3596375 */
+//RASTERIZER_ENTRY( 0x00480035, 0x00045119, 0x00000001, 0x000B0379, 0x082418DF, 0xFFFFFFFF ) /* * 400 3555759 */
+//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0379, 0x0824180F, 0xFFFFFFFF ) /* * 3755 3453084 */
+//RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000001, 0x000B0779, 0x082418DF, 0xFFFFFFFF ) /* * 4170 2425016 */
+//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x0824184F, 0xFFFFFFFF ) /* * 322 2220073 */
+//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0379, 0x082418CF, 0xFFFFFFFF ) /* * 4008 1201335 */
+//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x0824108F, 0xFFFFFFFF ) /* * 13704 883585 */
+
+/* sfrush -----> fbzColorPath alphaMode fogMode, fbzMode, texMode0, texMode1 */
+RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x00000000, 0x0824101F ) /* * 590139 246714190 */
+RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x0824101F, 0x0824101F ) /* * 397774 153418144 */
+RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x00000000, 0x082410DF ) /* * 22732 146975666 */
+RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x00000000, 0x0824101F ) /* * 306398 130393278 */
+RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x0824101F, 0x0824101F ) /* * 437743 117403881 */
+RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x0824181F, 0x0824101F ) /* * 66608 109289500 */
+RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x00000000, 0x082410DF ) /* * 19101 92573085 */
+RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x00000000, 0x0824181F ) /* * 258287 78618228 */
+RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x0824181F, 0x0824101F ) /* * 61814 68788856 */
+RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000001, 0x000B0779, 0x082410DF, 0x0824181F ) /* * 149792 61464124 */
+RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x0824181F, 0x0824181F ) /* * 109988 55083276 */
+RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0779, 0x08241ADF, 0x00000000 ) /* * 478 46989312 */
+RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0779, 0x08241ADF, 0x0824181F ) /* * 468 46006272 */
+RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x00000000, 0x0824181F ) /* * 125204 39023396 */
+RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0779, 0x08241ADF, 0x082410DB ) /* * 394 38731776 */
+RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0779, 0x082410DF, 0x082410DB ) /* * 12890 36333568 */
+RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0379, 0x0824101F, 0x0824101F ) /* * 147995 31086325 */
+RASTERIZER_ENTRY( 0x00480035, 0x00045119, 0x00000000, 0x000B077B, 0x00000000, 0x082410DB ) /* * 3576 29294592 */
+RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x0824181F, 0x0824181F ) /* * 76059 29282981 */
+RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000001, 0x000B0779, 0x082418DF, 0x0824101F ) /* * 12632 29173808 */
+//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x00000000, 0x082418DF ) /* * 14040 24318118 */
+//RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000001, 0x000B0379, 0x0824101F, 0x0824101F ) /* * 56586 17643207 */
+//RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000001, 0x000B0779, 0x082418DF, 0x0824181F ) /* * 9130 17277440 */
+//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x082418DF, 0x0824101F ) /* * 66302 17049921 */
+//RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000001, 0x000B0779, 0x082410DF, 0x0824101F ) /* * 64380 16463672 */
+//RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0779, 0x082410DF, 0x0824181F ) /* * 152 14942208 */
+//RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0779, 0x082418DF, 0x0824101F ) /* * 8748 13810176 */
+//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x082708DF, 0x0824101F ) /* * 216634 10628656 */
+//RASTERIZER_ENTRY( 0x00480035, 0x00045119, 0x00000001, 0x000B077B, 0x00000000, 0x082410DB ) /* * 1282 10502144 */
+//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x082418DF, 0x0824101F ) /* * 74636 9758030 */
+//RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0779, 0x082418DF, 0x082410DB ) /* * 58652 9353671 */
+//RASTERIZER_ENTRY( 0x00480035, 0x00045119, 0x00000000, 0x000B0779, 0x082418DF, 0x082410DB ) /* * 5242 8038747 */
+//RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B077B, 0x082410DB, 0x082410DB ) /* * 11048 7538060 */
+//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x0824101F, 0x0824181F ) /* * 121630 6906591 */
+//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x00000000, 0x082418DF ) /* * 19553 6864245 */
+//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x082418DF, 0x082418DF ) /* * 1287 6648834 */
+//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x082708DF, 0x0824101F ) /* * 197766 6617876 */
+//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x082700DF, 0x0824101F ) /* * 75470 6231739 */
+//RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000001, 0x000B0779, 0x08241ADF, 0x0824101F ) /* * 180 5898240 */
+//RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000001, 0x000B0779, 0x082410DF, 0x082410DB ) /* * 7692 5743360 */
+//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x082418DF, 0x0824181F ) /* * 20128 4980591 */
+//RASTERIZER_ENTRY( 0x00480035, 0x00045119, 0x00000001, 0x000B0779, 0x082418DF, 0x0824181F ) /* * 1144 4685824 */
+//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x082700DF, 0x0824101F ) /* * 72299 4466336 */
+//RASTERIZER_ENTRY( 0x00480035, 0x00045119, 0x00000000, 0x000B0779, 0x082410DF, 0x082410DB ) /* * 3750 4018176 */
+//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x082410DF, 0x082410DF ) /* * 7533 3692141 */
+//RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000001, 0x000B077B, 0x082410DB, 0x0824101F ) /* * 9484 3610674 */
+//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x0824101F, 0x0824181F ) /* * 128660 3216280 */
+//RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000001, 0x000B0779, 0x082418DF, 0x082410DB ) /* * 22214 3172813 */
+//RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000001, 0x000B077B, 0x082410DB, 0x0824181F ) /* * 5094 3099098 */
+//RASTERIZER_ENTRY( 0x00480035, 0x00045119, 0x00000001, 0x000B0779, 0x082418DF, 0x0824101F ) /* * 1954 2850924 */
+//RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0779, 0x082418DF, 0x0824181F ) /* * 1542 2434304 */
+//RASTERIZER_ENTRY( 0x00480035, 0x00045119, 0x00000000, 0x000B0779, 0x082418DF, 0x00000000 ) /* * 478 1957888 */
+//RASTERIZER_ENTRY( 0x00480035, 0x00045119, 0x00000000, 0x000B0779, 0x082418DF, 0x0824181F ) /* * 468 1916928 */
+//RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B077B, 0x082410DB, 0x0824101F ) /* * 11664 1729188 */
+//RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000001, 0x000B077B, 0x082410DB, 0x082410DB ) /* * 1282 1640960 */
+//RASTERIZER_ENTRY( 0x00480035, 0x00045119, 0x00000001, 0x000B077B, 0x082410DB, 0x0824101F ) /* * 388 1589248 */
+//RASTERIZER_ENTRY( 0x00480035, 0x00045119, 0x00000001, 0x000B0779, 0x082410DF, 0x082410DB ) /* * 1282 1312768 */
+//RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B077B, 0x082410DB, 0x0824181F ) /* * 3928 1046582 */
+
+/* vaportrx ---> fbzColorPath alphaMode fogMode, fbzMode, texMode0, texMode1 */
+RASTERIZER_ENTRY( 0x00482405, 0x00000000, 0x00000000, 0x000B0739, 0x0C26100F, 0xFFFFFFFF ) /* * 2226138 592165102 */
+RASTERIZER_ENTRY( 0x00482435, 0x00000000, 0x00000000, 0x000B0739, 0x0C261A0F, 0xFFFFFFFF ) /* * 53533 281405105 */
+RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B07F9, 0x0C261ACF, 0xFFFFFFFF ) /* * 314131 219103141 */
+RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x00000000, 0x000B0339, 0x0C261A0F, 0xFFFFFFFF ) /* * 216329 95014510 */
+RASTERIZER_ENTRY( 0x00482405, 0x00000009, 0x00000000, 0x000B0739, 0x0C26100F, 0xFFFFFFFF ) /* * 317128 92010096 */
+RASTERIZER_ENTRY( 0x0142613A, 0x00045119, 0x00000000, 0x000B07F9, 0xFFFFFFFF, 0xFFFFFFFF ) /* * 13728 88595930 */
+RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0339, 0x0C261ACF, 0xFFFFFFFF ) /* * 649448 81449105 */
+RASTERIZER_ENTRY( 0x00482435, 0x00000000, 0x00000000, 0x000B0739, 0x0C26100F, 0xFFFFFFFF ) /* * 444231 60067944 */
+RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x00000000, 0x000B0339, 0x0C26184F, 0xFFFFFFFF ) /* * 36057 58970468 */
+RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0339, 0x0C26100F, 0xFFFFFFFF ) /* * 53147 48856709 */
+RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B07F9, 0x0C2610C9, 0xFFFFFFFF ) /* * 447654 47171792 */
+RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0339, 0x0C261A0F, 0xFFFFFFFF ) /* * 207392 38933691 */
+RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0739, 0x0C2610CF, 0xFFFFFFFF ) /* * 2015632 33364173 */
+RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x00000000, 0x000B0339, 0x0C26100F, 0xFFFFFFFF ) /* * 196361 30395218 */
+RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0339, 0x0C2610CF, 0xFFFFFFFF ) /* * 110898 28973006 */
+RASTERIZER_ENTRY( 0x00482435, 0x00000009, 0x00000000, 0x000B0739, 0x0C26100F, 0xFFFFFFFF ) /* * 135107 16301589 */
+RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0339, 0x0C261A8F, 0xFFFFFFFF ) /* * 22375 15797748 */
+RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0339, 0x0C26184F, 0xFFFFFFFF ) /* * 141539 7513140 */
+RASTERIZER_ENTRY( 0x0142613A, 0x00045119, 0x00000000, 0x000B0739, 0xFFFFFFFF, 0xFFFFFFFF ) /* * 621403 5369705 */
+RASTERIZER_ENTRY( 0x00482435, 0x00045110, 0x00000000, 0x000B0739, 0x0C261A0F, 0xFFFFFFFF ) /* * 30443 4070277 */
+//RASTERIZER_ENTRY( 0x00482405, 0x00045110, 0x00000000, 0x000B0739, 0x0C261A0F, 0xFFFFFFFF ) /* * 22121 3129894 */
+//RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0739, 0x0C26100F, 0xFFFFFFFF ) /* * 9187 1864599 */
+//RASTERIZER_ENTRY( 0x00482405, 0x00044110, 0x00000000, 0x000B0739, 0x0C2610CF, 0xFFFFFFFF ) /* * 10390 1694950 */
+//RASTERIZER_ENTRY( 0x0142610A, 0x00000009, 0x00000000, 0x000B0739, 0xFFFFFFFF, 0xFFFFFFFF ) /* * 25366 1624563 */
+//RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0739, 0x0C261A0F, 0xFFFFFFFF ) /* * 69033 1607970 */
+//RASTERIZER_ENTRY( 0x0142610A, 0x00000000, 0x00000000, 0x000B0739, 0xFFFFFFFF, 0xFFFFFFFF ) /* * 36316 1084818 */
+//RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x00000000, 0x000B0339, 0x0C2610CF, 0xFFFFFFFF ) /* * 1813 816763 */
+//RASTERIZER_ENTRY( 0x0142613A, 0x00045119, 0x00000000, 0x000B0339, 0xFFFFFFFF, 0xFFFFFFFF ) /* * 6602 767221 */
+//RASTERIZER_ENTRY( 0x00482435, 0x00045110, 0x00000000, 0x000B0739, 0x0C26100F, 0xFFFFFFFF ) /* * 2547 646048 */
+//RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x00000000, 0x000B0339, 0x0C261A8F, 0xFFFFFFFF ) /* * 2394 501590 */
+//RASTERIZER_ENTRY( 0x0142613A, 0x00000009, 0x00000000, 0x000B0739, 0xFFFFFFFF, 0xFFFFFFFF ) /* * 14078 440086 */
+//RASTERIZER_ENTRY( 0x0142610A, 0x00045119, 0x00000000, 0x000B0339, 0xFFFFFFFF, 0xFFFFFFFF ) /* * 9877 429160 */
+//RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x00000000, 0x000B0339, 0x0C261ACF, 0xFFFFFFFF ) /* * 3222 366052 */
+//RASTERIZER_ENTRY( 0x00482435, 0x00000009, 0x00000000, 0x000B0739, 0x0C2610CF, 0xFFFFFFFF ) /* * 5942 285657 */
+//RASTERIZER_ENTRY( 0x00482405, 0x00044119, 0x00000000, 0x000B0339, 0x0C2610CF, 0xFFFFFFFF ) /* * 2328 239688 */
+//RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x00000000, 0x000B0739, 0x0C26100F, 0xFFFFFFFF ) /* * 1129 208448 */
+
+/* wg3dh ------> fbzColorPath alphaMode fogMode, fbzMode, texMode0, texMode1 */
+RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0779, 0x0824181F, 0xFFFFFFFF ) /* * 127676 116109477 */
+RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0779, 0x0824189F, 0xFFFFFFFF ) /* * 96310 112016758 */
+RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0779, 0x0824109F, 0xFFFFFFFF ) /* * 1412831 108682642 */
+RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0779, 0x0824101F, 0xFFFFFFFF ) /* * 1612798 45952714 */
+RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0779, 0x08241AD9, 0xFFFFFFFF ) /* * 5960 6103040 */
+RASTERIZER_ENTRY( 0x00002435, 0x00045119, 0x00000000, 0x000B0779, 0x082418DF, 0xFFFFFFFF ) /* * 56512 4856542 */
+RASTERIZER_ENTRY( 0x00480035, 0x00045119, 0x00000000, 0x000B0779, 0x0824109F, 0xFFFFFFFF ) /* * 8480 2045940 */
+RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0379, 0x0824181F, 0xFFFFFFFF ) /* * 2779 1994317 */
+RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0779, 0x0824105F, 0xFFFFFFFF ) /* * 154691 1922774 */
+RASTERIZER_ENTRY( 0x00002435, 0x00045119, 0x00000000, 0x000B0779, 0x082410DF, 0xFFFFFFFF ) /* * 18114 776139 */
+
+/* gauntleg ---> fbzColorPath alphaMode fogMode, fbzMode, texMode0, texMode1 */
+RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x00000000, 0x000B0779, 0x00000000, 0x0C24100F ) /* * 157050 668626339 */
+RASTERIZER_ENTRY( 0x00600039, 0x00045119, 0x00000000, 0x000B0779, 0x0C22400F, 0x0C241ACF ) /* * 1079126 580272490 */
+RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0779, 0x0C241A4F, 0x0C24100F ) /* * 49686 232178144 */
+RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0779, 0x0C24104F, 0x0C24100F ) /* * 1048560 206304396 */
+RASTERIZER_ENTRY( 0x00600039, 0x00045119, 0x00000000, 0x000B0779, 0x0C2240CF, 0x0C241ACF ) /* * 59176 182444375 */
+RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0779, 0x00000000, 0x0C241A4F ) /* * 66342 179689728 */
+RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x00000000, 0x000B0779, 0x0C24180F, 0x0C24180F ) /* * 72264 109413344 */
+RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x00000000, 0x000B0779, 0x0C24100F, 0x0C24100F ) /* * 281243 75399210 */
+RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0779, 0x00000000, 0x0C24104F ) /* * 126384 68412120 */
+RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x0C241A0F, 0x0C24100F ) /* * 26864 43754988 */
+RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0779, 0x00000000, 0x0C241ACF ) /* * 30510 32759936 */
+RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x00000000, 0x000B0779, 0x0C24180F, 0x0C24100F ) /* * 44783 31884168 */
+RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x00000000, 0x000B0779, 0x00000000, 0x0C24180F ) /* * 34946 31359362 */
+RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x00000000, 0x0C241ACF ) /* * 8006 28367999 */
+RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x00000000, 0x000B0379, 0x0C24180F, 0x0C24180F ) /* * 15430 27908213 */
+RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x00000000, 0x0C241A0F ) /* * 29306 25166802 */
+RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x00000000, 0x000B0779, 0x0C24180F, 0x0C241ACF ) /* * 27737 24517949 */
+RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x0C241ACF, 0x0C24100F ) /* * 6783 21292092 */
+RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x00000000, 0x000B0379, 0x00000000, 0x0C24180F ) /* * 9591 17815763 */
+RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x00000000, 0x000B0779, 0x0C24100F, 0x0C24180F ) /* * 343966 13864759 */
+//RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0779, 0x0C241ACF, 0x0C24100F ) /* * 11842 12126208 */
+//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x0C241A8F, 0x0C24100F ) /* * 6648 9788508 */
+//RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0779, 0x00000000, 0x0C2418CF ) /* * 8444 8646656 */
+//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0379, 0x0C24180F, 0x0C24100F ) /* * 9677 8365606 */
+//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x0C24100F, 0x0C24100F ) /* * 844920 8289326 */
+//RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0779, 0x00000000, 0x0C24184F ) /* * 3108 8010176 */
+//RASTERIZER_ENTRY( 0x00600039, 0x00045119, 0x00000000, 0x000B03F9, 0x00000000, 0x0C24180F ) /* * 1435 6209238 */
+//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x00000000, 0x000B0379, 0x0C24180F, 0x0C24100F ) /* * 5754 5617499 */
+//RASTERIZER_ENTRY( 0x00600039, 0x00045119, 0x00000000, 0x000B0379, 0x0C24180F, 0x0C24180F ) /* * 1608 5557253 */
+//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x00000000, 0x000B0779, 0x0C24100F, 0x0C241ACF ) /* * 105127 5133321 */
+//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x00000000, 0x000B0379, 0x0C24180F, 0x0C241ACF ) /* * 3460 4689138 */
+//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x0C24180F, 0x0C24100F ) /* * 7025 4629550 */
+//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x00000000, 0x0C24180F ) /* * 7164 4407683 */
+//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x00000000, 0x000B0779, 0x00000000, 0x0C24188F ) /* * 1922 3924179 */
+//RASTERIZER_ENTRY( 0x00600039, 0x00045119, 0x00000000, 0x000B0779, 0x00000000, 0x0C24180F ) /* * 4116 3733777 */
+//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x00000000, 0x0C241A8F ) /* * 2626 3732809 */
+//RASTERIZER_ENTRY( 0x00600039, 0x00045119, 0x00000000, 0x000B03F9, 0x0C24180F, 0x0C24180F ) /* * 778 3202973 */
+//RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0779, 0x0C24184F, 0x0C24100F ) /* * 1525 2997446 */
+//RASTERIZER_ENTRY( 0x00600039, 0x00045119, 0x00000000, 0x000B03F9, 0x0C24180F, 0x0C241A0F ) /* * 645 2975266 */
+//RASTERIZER_ENTRY( 0x00600039, 0x00044119, 0x00000000, 0x000B0379, 0x00000000, 0x0C241A0F ) /* * 5212 2491361 */
+//RASTERIZER_ENTRY( 0x00600039, 0x00045119, 0x00000000, 0x000B0379, 0x00000000, 0x0C24180F ) /* * 825 1996513 */
+//RASTERIZER_ENTRY( 0x00600039, 0x00045119, 0x00000000, 0x000B0379, 0x0C24180F, 0x0C241A0F ) /* * 466 1967163 */
+//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x00000000, 0x000B0779, 0x0580000F, 0x0C24180F ) /* * 77400 1883434 */
+//RASTERIZER_ENTRY( 0x00600039, 0x00045119, 0x00000000, 0x000B0379, 0x0C24180F, 0x0C24100F ) /* * 472 1698177 */
+//RASTERIZER_ENTRY( 0x00600039, 0x00045119, 0x00000000, 0x000B0779, 0x0C24180F, 0x0C24180F ) /* * 2476 1678760 */
+//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0379, 0x00000000, 0x0C24180F ) /* * 4054 1541748 */
+//RASTERIZER_ENTRY( 0x00600039, 0x00044119, 0x00000000, 0x000B0379, 0x0C241A0F, 0x0C24180F ) /* * 3132 1509438 */
+//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x00000000, 0x000B0779, 0x0580080F, 0x0C24180F ) /* * 8582 1324196 */
+//RASTERIZER_ENTRY( 0x00602C19, 0x00044119, 0x00000000, 0x000B0379, 0x00000000, 0x0C24100F ) /* * 1436 1239704 */
+//RASTERIZER_ENTRY( 0x00600039, 0x00045119, 0x00000000, 0x000B03F9, 0x0C24180F, 0x0C24100F ) /* * 253 1220316 */
+//RASTERIZER_ENTRY( 0x00600039, 0x00045119, 0x00000000, 0x000B0779, 0x0C22480F, 0x0C241ACF ) /* * 2433 1014668 */
+
+/* gauntdl ----> fbzColorPath alphaMode fogMode, fbzMode, texMode0, texMode1 */
+RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x000000C1, 0x000B0779, 0x00000009, 0x0C241ACF ) /* * 30860 1128173568 */
+RASTERIZER_ENTRY( 0x0060743A, 0x00045119, 0x000000C1, 0x000B0779, 0x0C22400F, 0x0C241ACF ) /* * 2631692 1117011118 */
+RASTERIZER_ENTRY( 0x0060743A, 0x00045110, 0x000000C1, 0x000B0779, 0x0C22400F, 0x0C241ACF ) /* * 2429239 826969012 */
+RASTERIZER_ENTRY( 0x0060743A, 0x00045119, 0x000000C1, 0x000B0779, 0x0C22480F, 0x0C241ACF ) /* * 454056 468285142 */
+RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x000000C1, 0x000B0779, 0x00000009, 0x0C2418CF ) /* * 257586 355634672 */
+RASTERIZER_ENTRY( 0x00602439, 0x00045119, 0x000000C1, 0x000B0379, 0x00000009, 0x0C24180F ) /* * 10898 134362122 */
+RASTERIZER_ENTRY( 0x00602439, 0x00045119, 0x000000C1, 0x000B0779, 0x00000009, 0x0C241A0F ) /* * 32195 126327049 */
+RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x000000C1, 0x000B0779, 0x0C2410CF, 0x0C24100F ) /* * 855240 123899880 */
+RASTERIZER_ENTRY( 0x00602439, 0x00045110, 0x000000C1, 0x000B0379, 0x00000009, 0x0C24180F ) /* * 1718 120629204 */
+RASTERIZER_ENTRY( 0x0060743A, 0x00045119, 0x000000C1, 0x000B0779, 0x0C22488F, 0x0C241ACF ) /* * 186839 120281357 */
+RASTERIZER_ENTRY( 0x0060743A, 0x00045119, 0x000000C1, 0x000B0379, 0x0C22480F, 0x0C241ACF ) /* * 14102 115428820 */
+RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x000000C1, 0x000B0779, 0x00000009, 0x0C2410CF ) /* * 88530 98271949 */
+RASTERIZER_ENTRY( 0x0060743A, 0x00045110, 0x000000C1, 0x000B0379, 0x0C22480F, 0x0C241ACF ) /* * 12994 68053222 */
+RASTERIZER_ENTRY( 0x00602439, 0x00044110, 0x00000000, 0x000B0379, 0x00000009, 0x0C24100F ) /* * 68273 67454880 */
+RASTERIZER_ENTRY( 0x00602439, 0x00045119, 0x000000C1, 0x000B0779, 0x00000009, 0x0C24180F ) /* * 100026 62271618 */
+RASTERIZER_ENTRY( 0x0060743A, 0x00045110, 0x000000C1, 0x000B0779, 0x0C22480F, 0x0C241ACF ) /* * 153285 44411342 */
+RASTERIZER_ENTRY( 0x00602439, 0x00045119, 0x000000C1, 0x000B0779, 0x00000009, 0x0C24100F ) /* * 157545 40702131 */
+RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x000000C1, 0x000B0779, 0x0C241ACF, 0x0C24100F ) /* * 7800 31948800 */
+RASTERIZER_ENTRY( 0x0060743A, 0x00045110, 0x000000C1, 0x000B0779, 0x0C22408F, 0x0C241ACF ) /* * 47623 20321183 */
+RASTERIZER_ENTRY( 0x00602439, 0x00044119, 0x00000000, 0x000B0379, 0x00000009, 0x0C24188F ) /* * 21570 19324892 */
+//RASTERIZER_ENTRY( 0x00482435, 0x00045110, 0x000000C1, 0x000B0779, 0x0C241ACF, 0x0C24100F ) /* * 3698 15147008 */
+//RASTERIZER_ENTRY( 0x0060743A, 0x00045119, 0x000000C1, 0x000B0779, 0x0C22408F, 0x0C241ACF ) /* * 19765 12383722 */
+//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x000000C1, 0x000B0779, 0x0C24100F, 0x0C241ACF ) /* * 662274 10563855 */
+//RASTERIZER_ENTRY( 0x00602439, 0x00045110, 0x000000C1, 0x000B0779, 0x0C24180F, 0x0C241ACF ) /* * 27909 10462997 */
+//RASTERIZER_ENTRY( 0x00602439, 0x00045110, 0x000000C1, 0x000B0779, 0x00000009, 0x0C24180F ) /* * 78671 10286957 */
+//RASTERIZER_ENTRY( 0x00602439, 0x00045110, 0x000000C1, 0x000B0779, 0x00000009, 0x0C24188F ) /* * 52038 9928244 */
+//RASTERIZER_ENTRY( 0x0060743A, 0x00045119, 0x000000C1, 0x000B0779, 0x0C224A0F, 0x0C241ACF ) /* * 27469 9239782 */
+//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x000000C1, 0x000B0779, 0x00000009, 0x0C24100F ) /* * 757116 8072783 */
+//RASTERIZER_ENTRY( 0x0060743A, 0x00045110, 0x000000C1, 0x000B0779, 0x0C22488F, 0x0C241ACF ) /* * 18018 7035833 */
+//RASTERIZER_ENTRY( 0x00602439, 0x00044119, 0x00000000, 0x000B0379, 0x00000009, 0x0C241A0F ) /* * 50339 5976564 */
+//RASTERIZER_ENTRY( 0x00603430, 0x00040219, 0x00000000, 0x000B0379, 0x00000009, 0x0C2410CE ) /* * 29385 5466384 */
+//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x000000C1, 0x000B0779, 0x0C24100F, 0x0C24180F ) /* * 423347 5355017 */
+//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x000000C1, 0x000B0779, 0x0C24180F, 0x0C241ACF ) /* * 162620 4709092 */
+//RASTERIZER_ENTRY( 0x00602C19, 0x00045110, 0x000000C1, 0x000B0779, 0x00000009, 0x0C24100F ) /* * 463705 4642480 */
+//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x000000C1, 0x000B0779, 0x0C24180F, 0x0C24180F ) /* * 280337 4425529 */
+//RASTERIZER_ENTRY( 0x00602C19, 0x00045110, 0x000000C1, 0x000B0779, 0x0C24180F, 0x0C24180F ) /* * 212646 3432265 */
+//RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x000000C1, 0x000B0779, 0x0C2418CF, 0x0C24100F ) /* * 5788 2963456 */
+//RASTERIZER_ENTRY( 0x00602C19, 0x00045110, 0x000000C1, 0x000B0779, 0x0C24180F, 0x0C24100F ) /* * 460800 2609198 */
+//RASTERIZER_ENTRY( 0x00602439, 0x00045119, 0x000000C1, 0x000B0779, 0x0C24100F, 0x0C24180F ) /* * 251108 2392362 */
+//RASTERIZER_ENTRY( 0x00602C19, 0x00045110, 0x000000C1, 0x000B0779, 0x0C24100F, 0x0C24100F ) /* * 297219 2352862 */
+//RASTERIZER_ENTRY( 0x00602439, 0x00045119, 0x000000C1, 0x000B0779, 0x0584180F, 0x0C2410CF ) /* * 9913 2097069 */
+//RASTERIZER_ENTRY( 0x00602C19, 0x00045110, 0x000000C1, 0x000B0779, 0x0C24180F, 0x0C241ACF ) /* * 142722 2091569 */
+//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x000000C1, 0x000B0379, 0x0C24180F, 0x0C241ACF ) /* * 8820 2053325 */
+//RASTERIZER_ENTRY( 0x00602439, 0x00045119, 0x000000C1, 0x000B0779, 0x00000009, 0x0C24188F ) /* * 10346 2033427 */
+//RASTERIZER_ENTRY( 0x00602439, 0x00045119, 0x000000C1, 0x000B0779, 0x0C24188F, 0x0C241ACF ) /* * 2136 2017241 */
+//RASTERIZER_ENTRY( 0x00602439, 0x00044119, 0x00000000, 0x000B0379, 0x00000009, 0x0C24100F ) /* * 1505 1928490 */
+//RASTERIZER_ENTRY( 0x00602C19, 0x00045110, 0x000000C1, 0x000B0779, 0x0C24100F, 0x0C241ACF ) /* * 176734 1842440 */
+//RASTERIZER_ENTRY( 0x00602C19, 0x00045110, 0x000000C1, 0x000B0779, 0x0C24100F, 0x0C24180F ) /* * 262577 1799080 */
+//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x000000C1, 0x000B0779, 0x00000009, 0x0C24180F ) /* * 83179 1534171 */
+//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x000000C1, 0x000B0779, 0x00000009, 0x0C24188F ) /* * 3863 1527077 */
+//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x000000C1, 0x000B0379, 0x0C24180F, 0x0C24180F ) /* * 8021 1472661 */
+//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x000000C1, 0x000B0779, 0x0C241A0F, 0x0C241ACF ) /* * 85416 1342195 */
+//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x000000C1, 0x000B0779, 0x0C24180F, 0x0C24100F ) /* * 261360 1335048 */
+//RASTERIZER_ENTRY( 0x00602C19, 0x00000009, 0x000000C1, 0x000B0779, 0x0C2418CF, 0x0C24100F ) /* * 74811 1320900 */
+//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x000000C1, 0x000B0779, 0x0C24100F, 0x0C24100F ) /* * 239331 1268661 */
+//RASTERIZER_ENTRY( 0x00602439, 0x00045119, 0x000000C1, 0x000B0779, 0x0C24100F, 0x0C241ACF ) /* * 107769 1244175 */
+//RASTERIZER_ENTRY( 0x00602C19, 0x00045110, 0x000000C1, 0x000B0379, 0x0C24180F, 0x0C241ACF ) /* * 3706 1216182 */
+//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x000000C1, 0x000B0779, 0x0C24100F, 0x0C24188F ) /* * 49608 1206129 */
+//RASTERIZER_ENTRY( 0x00602C19, 0x00000009, 0x000000C1, 0x000B0779, 0x0C2418CF, 0x0C241ACF ) /* * 42440 1204109 */
+//RASTERIZER_ENTRY( 0x00482435, 0x00045110, 0x000000C1, 0x000B0779, 0x0C2410CF, 0x0C24100F ) /* * 29584 1168568 */
+//RASTERIZER_ENTRY( 0x00602439, 0x00045119, 0x000000C1, 0x000B0779, 0x0C24180F, 0x0C241ACF ) /* * 17729 1152869 */
+//RASTERIZER_ENTRY( 0x00602C19, 0x00045110, 0x000000C1, 0x000B0379, 0x0C24180F, 0x0C24100F ) /* * 4052 1108726 */
+//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x000000C1, 0x000B0779, 0x0C2418CF, 0x0C24100F ) /* * 7082 1079348 */
+//RASTERIZER_ENTRY( 0x00602439, 0x00044119, 0x00000000, 0x000B0379, 0x00000009, 0x0C24180F ) /* * 7761 1023855 */
+
+/* gradius4 ----> fbzColorPath alphaMode fogMode, fbzMode, texMode0, texMode1 */
+//RASTERIZER_ENTRY( 0x02420002, 0x00000009, 0x00000000, 0x00030F7B, 0x08241AC7, 0xFFFFFFFF ) /* intro */
+//RASTERIZER_ENTRY( 0x01420021, 0x00005119, 0x00000000, 0x00030F7B, 0x14261AC7, 0xFFFFFFFF ) /* intro */
+//RASTERIZER_ENTRY( 0x00000005, 0x00005119, 0x00000000, 0x00030F7B, 0x14261A87, 0xFFFFFFFF ) /* in-game */
+
+/* nbapbp ------> fbzColorPath alphaMode fogMode, fbzMode, texMode0, texMode1 */
+//RASTERIZER_ENTRY( 0x00424219, 0x00000000, 0x00000001, 0x00030B7B, 0x08241AC7, 0xFFFFFFFF ) /* intro */
+//RASTERIZER_ENTRY( 0x00002809, 0x00004110, 0x00000001, 0x00030FFB, 0x08241AC7, 0xFFFFFFFF ) /* in-game */
+//RASTERIZER_ENTRY( 0x00424219, 0x00000000, 0x00000001, 0x00030F7B, 0x08241AC7, 0xFFFFFFFF ) /* in-game */
+//RASTERIZER_ENTRY( 0x0200421A, 0x00001510, 0x00000001, 0x00030F7B, 0x08241AC7, 0xFFFFFFFF ) /* in-game */
+/* gtfore06 ----> fbzColorPath alphaMode fogMode, fbzMode, texMode0, texMode1 hash */
+RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x000000C1, 0x00010F79, 0x0C261ACD, 0x0C261ACD ) /* 18 1064626 69362127 */
+RASTERIZER_ENTRY( 0x00002425, 0x00045119, 0x000000C1, 0x00010F79, 0x0C224A0D, 0x0C261ACD ) /* 47 3272483 31242799 */
+RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x000000C1, 0x00010F79, 0x00000ACD, 0x0C261ACD ) /* 9 221917 12348555 */
+RASTERIZER_ENTRY( 0x00002425, 0x00045110, 0x000000C1, 0x00010FF9, 0x00000ACD, 0x0C261ACD ) /* 26 57291 9357989 */
+RASTERIZER_ENTRY( 0x00002429, 0x00000000, 0x000000C1, 0x00010FF9, 0x00000A09, 0x0C261A0F ) /* 12 97156 8530607 */
+RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x000000C1, 0x00010F79, 0x000000C4, 0x0C261ACD ) /* 55 110144 5265532 */
+RASTERIZER_ENTRY( 0x00002425, 0x00045110, 0x000000C1, 0x00010FF9, 0x000000C4, 0x0C261ACD ) /* 61 16644 1079382 */
+RASTERIZER_ENTRY( 0x00002425, 0x00045119, 0x000000C1, 0x00010FF9, 0x000000C4, 0x0C261ACD ) /* 5 8332 1065229 */
+RASTERIZER_ENTRY( 0x00002425, 0x00045119, 0x000000C1, 0x00010F79, 0x0C224A0D, 0x0C261A0D ) /* 45 8148 505013 */
+RASTERIZER_ENTRY( 0x00002425, 0x00045119, 0x00000000, 0x00010F79, 0x0C224A0D, 0x0C261A0D ) /* 84 45233 248267 */
+RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x000000C1, 0x00010F79, 0x0C261ACD, 0x0C2610C4 ) /* 90 10235 193036 */
+RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x000000C1, 0x00010FF9, 0x0C261ACD, 0x0C261ACD ) /* * 29 3777 83777 */
+RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x00000000, 0x00010FF9, 0x0C261ACD, 0x042210C0 ) /* 2 24952 66761 */
+RASTERIZER_ENTRY( 0x00002429, 0x00000000, 0x00000000, 0x00010FF9, 0x00000A09, 0x0C261A0F ) /* 24 661 50222 */
+RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x00000000, 0x00010FF9, 0x0C261ACD, 0x04221AC9 ) /* 92 12504 43720 */
+RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x000000C1, 0x00010FF9, 0x0C261ACD, 0x0C2610C4 ) /* 79 2160 43650 */
+RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x00000000, 0x00010FF9, 0x000000C4, 0x04221AC9 ) /* 19 2796 30377 */
+RASTERIZER_ENTRY( 0x00002425, 0x00045119, 0x000000C1, 0x00010FF9, 0x00000ACD, 0x0C261ACD ) /* 67 1962 14755 */
+RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x000000C1, 0x00010FF9, 0x000000C4, 0x0C261ACD ) /* * 66 74 3951 */
+RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x00000000, 0x00010FF9, 0x00000ACD, 0x04221AC9 ) /* 70 374 3691 */
+RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x000000C1, 0x00010FF9, 0x00000ACD, 0x0C261ACD ) /* * 20 350 7928 */
+/* virtpool ----> fbzColorPath alphaMode fogMode, fbzMode, texMode0, texMode1 hash */
+RASTERIZER_ENTRY( 0x00002421, 0x00000000, 0x00000000, 0x000B0739, 0x0C261A0F, 0x042210C0 ) /* * 78 2182388 74854175 */
+RASTERIZER_ENTRY( 0x00002421, 0x00000000, 0x00000000, 0x000B07F9, 0x0C261A0F, 0x042210C0 ) /* * 46 114830 6776826 */
+RASTERIZER_ENTRY( 0x00482405, 0x00045110, 0x00000000, 0x000B0739, 0x0C261A0F, 0x042210C0 ) /* * 58 1273673 4513463 */
+RASTERIZER_ENTRY( 0x00482405, 0x00045110, 0x00000000, 0x000B0739, 0x0C261A09, 0x042210C0 ) /* * 46 634995 2275612 */
+RASTERIZER_ENTRY( 0x00002421, 0x00000000, 0x00000000, 0x000B073B, 0x0C261A0F, 0x042210C0 ) /* * 46 26651 1883507 */
+RASTERIZER_ENTRY( 0x00482405, 0x00045110, 0x00000000, 0x000B073B, 0x0C261A0F, 0x042210C0 ) /* * 26 220644 751241 */
+//RASTERIZER_ENTRY( 0x00002421, 0x00445110, 0x00000000, 0x000B073B, 0x0C261A09, 0x042210C0 ) /* * 79 14846 3499120 */
+//RASTERIZER_ENTRY( 0x00002421, 0x00000000, 0x00000000, 0x000B0739, 0x0C261A09, 0x042210C0 ) /* * 66 26665 1583363 */
+//RASTERIZER_ENTRY( 0x00002421, 0x00000000, 0x00000000, 0x000B073B, 0x0C26100F, 0x042210C0 ) /* * 78 33096 957935 */
+//RASTERIZER_ENTRY( 0x00002425, 0x00445110, 0x00000000, 0x000B07F9, 0x0C261A0F, 0x042210C0 ) /* * 38 12494 678029 */
+//RASTERIZER_ENTRY( 0x00800000, 0x00000000, 0x00000000, 0x00000200, 0x00000000, 0x00000000 ) /* * 28 25348 316181 */
+//RASTERIZER_ENTRY( 0x00002421, 0x00000000, 0x00000000, 0x000B0739, 0x0C26100F, 0x042210C0 ) /* * 13 11344 267903 */
+//RASTERIZER_ENTRY( 0x00002421, 0x00000000, 0x00000000, 0x000B073B, 0x0C261A09, 0x042210C0 ) /* * 34 1548 112168 */
+//RASTERIZER_ENTRY( 0x00002421, 0x00000000, 0x00000000, 0x000B07FB, 0x0C26100F, 0x042210C0 ) /* * 35 664 25222 */
+//RASTERIZER_ENTRY( 0x00000002, 0x00000000, 0x00000000, 0x00000300, 0xFFFFFFFF, 0xFFFFFFFF ) /* * 33 512 18393 */
+//RASTERIZER_ENTRY( 0x00002421, 0x00000000, 0x00000000, 0x000B07FB, 0x0C261A0F, 0x042210C0 ) /* * 14 216 16842 */
+//RASTERIZER_ENTRY( 0x00000001, 0x00000000, 0x00000000, 0x00000300, 0x00000800, 0x00000800 ) /* * 87 2 72 */
+//RASTERIZER_ENTRY( 0x00000001, 0x00000000, 0x00000000, 0x00000200, 0x08241A00, 0x08241A00 ) /* * 92 2 8 */
+//RASTERIZER_ENTRY( 0x00000001, 0x00000000, 0x00000000, 0x00000200, 0x00000000, 0x08241A00 ) /* * 93 2 8 */
diff --git a/src/emu/addrmap.cpp b/src/emu/addrmap.cpp
index 708caf5d3ee..2ae44142ac1 100644
--- a/src/emu/addrmap.cpp
+++ b/src/emu/addrmap.cpp
@@ -9,6 +9,15 @@
***************************************************************************/
#include "emu.h"
+#include "validity.h"
+
+
+//**************************************************************************
+// PARAMETERS
+//**************************************************************************
+
+#define DETECT_OVERLAPPING_MEMORY (0)
+
//**************************************************************************
@@ -332,7 +341,7 @@ address_map::address_map(device_t &device, address_spacenum spacenum)
// and then the configuration for the current address space
const address_space_config *spaceconfig = memintf->space_config(spacenum);
- if (!device.interface(memintf))
+ if (spaceconfig == nullptr)
throw emu_fatalerror("No memory address space configuration found for device '%s', space %d\n", device.tag(), spacenum);
// construct the internal device map (first so it takes priority)
@@ -614,3 +623,145 @@ void address_map::uplift_submaps(running_machine &machine, device_t &device, dev
}
}
}
+
+
+//-------------------------------------------------
+// map_validity_check - perform validity checks on
+// one of the device's address maps
+//-------------------------------------------------
+
+void address_map::map_validity_check(validity_checker &valid, const device_t &device, address_spacenum spacenum) const
+{
+ // it's safe to assume here that the device has a memory interface and a config for this space
+ const address_space_config &spaceconfig = *device.memory().space_config(spacenum);
+ int datawidth = spaceconfig.m_databus_width;
+ int alignunit = datawidth / 8;
+
+ bool detected_overlap = DETECT_OVERLAPPING_MEMORY ? false : true;
+
+ // if this is an empty map, just ignore it
+ if (m_entrylist.first() == nullptr)
+ return;
+
+ // validate the global map parameters
+ if (m_spacenum != spacenum)
+ osd_printf_error("Space %d has address space %d handlers!\n", spacenum, m_spacenum);
+ if (m_databits != datawidth)
+ osd_printf_error("Wrong memory handlers provided for %s space! (width = %d, memory = %08x)\n", spaceconfig.m_name, datawidth, m_databits);
+
+ // loop over entries and look for errors
+ for (address_map_entry *entry = m_entrylist.first(); entry != nullptr; entry = entry->next())
+ {
+ UINT32 bytestart = spaceconfig.addr2byte(entry->m_addrstart);
+ UINT32 byteend = spaceconfig.addr2byte_end(entry->m_addrend);
+
+ // look for overlapping entries
+ if (!detected_overlap)
+ {
+ for (address_map_entry *scan = m_entrylist.first(); scan != entry; scan = scan->next())
+ if (entry->m_addrstart <= scan->m_addrend && entry->m_addrend >= scan->m_addrstart &&
+ ((entry->m_read.m_type != AMH_NONE && scan->m_read.m_type != AMH_NONE) ||
+ (entry->m_write.m_type != AMH_NONE && scan->m_write.m_type != AMH_NONE)))
+ {
+ osd_printf_warning("%s space has overlapping memory (%X-%X,%d,%d) vs (%X-%X,%d,%d)\n", spaceconfig.m_name, entry->m_addrstart, entry->m_addrend, entry->m_read.m_type, entry->m_write.m_type, scan->m_addrstart, scan->m_addrend, scan->m_read.m_type, scan->m_write.m_type);
+ detected_overlap = true;
+ break;
+ }
+ }
+
+ // look for inverted start/end pairs
+ if (byteend < bytestart)
+ osd_printf_error("Wrong %s memory read handler start = %08x > end = %08x\n", spaceconfig.m_name, entry->m_addrstart, entry->m_addrend);
+
+ // look for misaligned entries
+ if ((bytestart & (alignunit - 1)) != 0 || (byteend & (alignunit - 1)) != (alignunit - 1))
+ osd_printf_error("Wrong %s memory read handler start = %08x, end = %08x ALIGN = %d\n", spaceconfig.m_name, entry->m_addrstart, entry->m_addrend, alignunit);
+
+ // if this is a program space, auto-assign implicit ROM entries
+ if (entry->m_read.m_type == AMH_ROM && entry->m_region == nullptr)
+ {
+ entry->m_region = device.tag();
+ entry->m_rgnoffs = entry->m_addrstart;
+ }
+
+ // if this entry references a memory region, validate it
+ if (entry->m_region != nullptr && entry->m_share == nullptr)
+ {
+ // make sure we can resolve the full path to the region
+ bool found = false;
+ std::string entry_region = entry->m_devbase.subtag(entry->m_region);
+
+ // look for the region
+ device_iterator deviter(device.mconfig().root_device());
+ for (device_t *dev = deviter.first(); dev != nullptr; dev = deviter.next())
+ for (const rom_entry *romp = rom_first_region(*dev); romp != nullptr && !found; romp = rom_next_region(romp))
+ {
+ if (rom_region_name(*dev, romp) == entry_region)
+ {
+ // verify the address range is within the region's bounds
+ offs_t length = ROMREGION_GETLENGTH(romp);
+ if (entry->m_rgnoffs + (byteend - bytestart + 1) > length)
+ osd_printf_error("%s space memory map entry %X-%X extends beyond region '%s' size (%X)\n", spaceconfig.m_name, entry->m_addrstart, entry->m_addrend, entry->m_region, length);
+ found = true;
+ }
+ }
+
+ // error if not found
+ if (!found)
+ osd_printf_error("%s space memory map entry %X-%X references non-existant region '%s'\n", spaceconfig.m_name, entry->m_addrstart, entry->m_addrend, entry->m_region);
+ }
+
+ // make sure all devices exist
+ if (entry->m_read.m_type == AMH_DEVICE_DELEGATE)
+ {
+ // extract the device tag from the proto-delegate
+ const char *devtag = nullptr;
+ switch (entry->m_read.m_bits)
+ {
+ case 8: devtag = entry->m_rproto8.device_name(); break;
+ case 16: devtag = entry->m_rproto16.device_name(); break;
+ case 32: devtag = entry->m_rproto32.device_name(); break;
+ case 64: devtag = entry->m_rproto64.device_name(); break;
+ }
+ if (entry->m_devbase.subdevice(devtag) == nullptr)
+ osd_printf_error("%s space memory map entry reads from nonexistant device '%s'\n", spaceconfig.m_name,
+ devtag != nullptr ? devtag : "<unspecified>");
+ }
+ if (entry->m_write.m_type == AMH_DEVICE_DELEGATE)
+ {
+ // extract the device tag from the proto-delegate
+ const char *devtag = nullptr;
+ switch (entry->m_write.m_bits)
+ {
+ case 8: devtag = entry->m_wproto8.device_name(); break;
+ case 16: devtag = entry->m_wproto16.device_name(); break;
+ case 32: devtag = entry->m_wproto32.device_name(); break;
+ case 64: devtag = entry->m_wproto64.device_name(); break;
+ }
+ if (entry->m_devbase.subdevice(devtag) == nullptr)
+ osd_printf_error("%s space memory map entry writes to nonexistant device '%s'\n", spaceconfig.m_name,
+ devtag != nullptr ? devtag : "<unspecified>");
+ }
+ if (entry->m_setoffsethd.m_type == AMH_DEVICE_DELEGATE)
+ {
+ // extract the device tag from the proto-delegate
+ const char *devtag = entry->m_soproto.device_name();
+ if (entry->m_devbase.subdevice(devtag) == nullptr)
+ osd_printf_error("%s space memory map entry references nonexistant device '%s'\n", spaceconfig.m_name,
+ devtag != nullptr ? devtag : "<unspecified>");
+ }
+
+ // make sure ports exist
+// if ((entry->m_read.m_type == AMH_PORT && entry->m_read.m_tag != NULL && portlist.find(entry->m_read.m_tag) == NULL) ||
+// (entry->m_write.m_type == AMH_PORT && entry->m_write.m_tag != NULL && portlist.find(entry->m_write.m_tag) == NULL))
+// osd_printf_error("%s space memory map entry references nonexistant port tag '%s'\n", spaceconfig.m_name, entry->m_read.m_tag);
+
+ // validate bank and share tags
+ if (entry->m_read.m_type == AMH_BANK)
+ valid.validate_tag(entry->m_read.m_tag);
+ if (entry->m_write.m_type == AMH_BANK)
+ valid.validate_tag(entry->m_write.m_tag);
+ if (entry->m_share != nullptr)
+ valid.validate_tag(entry->m_share);
+ }
+}
diff --git a/src/emu/addrmap.h b/src/emu/addrmap.h
index 0e767570b05..492ad21b03b 100644
--- a/src/emu/addrmap.h
+++ b/src/emu/addrmap.h
@@ -43,6 +43,10 @@ enum map_handler_type
// TYPE DEFINITIONS
//**************************************************************************
+// forward declarations
+class validity_checker;
+
+
// address map handler data
class map_handler_data
{
@@ -289,6 +293,7 @@ public:
simple_list<address_map_entry> m_entrylist; // list of entries
void uplift_submaps(running_machine &machine, device_t &device, device_t &owner, endianness_t endian);
+ void map_validity_check(validity_checker &valid, const device_t &device, address_spacenum spacenum) const;
};
@@ -309,6 +314,7 @@ void ADDRESS_MAP_NAME(_name)(address_map &map, device_t &device) \
typedef write##_bits##_delegate write_delegate ATTR_UNUSED; \
address_map_entry##_bits *curentry = NULL; \
(void)curentry; \
+ assert(&device != nullptr); \
map.configure(_space, _bits); \
typedef _class drivdata_class ATTR_UNUSED;
#define DEVICE_ADDRESS_MAP_START(_name, _bits, _class) \
@@ -318,6 +324,7 @@ void _class :: _name(::address_map &map, device_t &device) \
typedef write##_bits##_delegate write_delegate ATTR_UNUSED; \
address_map_entry##_bits *curentry = NULL; \
(void)curentry; \
+ assert(&device != nullptr); \
map.configure(AS_PROGRAM, _bits); \
typedef _class drivdata_class ATTR_UNUSED;
#define ADDRESS_MAP_END \
diff --git a/src/emu/audit.cpp b/src/emu/audit.cpp
index 714fadcc32e..b1016967931 100644
--- a/src/emu/audit.cpp
+++ b/src/emu/audit.cpp
@@ -369,10 +369,9 @@ media_auditor::summary media_auditor::summarize(const char *name, std::string *o
case audit_record::SUBSTATUS_FOUND_BAD_CHECKSUM:
if (output != nullptr)
{
- std::string tempstr;
strcatprintf(*output,"INCORRECT CHECKSUM:\n");
- strcatprintf(*output,"EXPECTED: %s\n", record->expected_hashes().macro_string(tempstr));
- strcatprintf(*output," FOUND: %s\n", record->actual_hashes().macro_string(tempstr));
+ strcatprintf(*output,"EXPECTED: %s\n", record->expected_hashes().macro_string().c_str());
+ strcatprintf(*output," FOUND: %s\n", record->actual_hashes().macro_string().c_str());
}
break;
diff --git a/src/emu/bookkeeping.cpp b/src/emu/bookkeeping.cpp
new file mode 100644
index 00000000000..b93493db9a4
--- /dev/null
+++ b/src/emu/bookkeeping.cpp
@@ -0,0 +1,215 @@
+// license:BSD-3-Clause
+// copyright-holders:Nicola Salmoria
+/*********************************************************************
+
+ bookkeeping.c
+
+ Bookkeeping simple machine functions.
+
+*********************************************************************/
+
+#include "emu.h"
+#include "config.h"
+
+
+//**************************************************************************
+// BOOKKEEPING MANAGER
+//**************************************************************************
+
+//-------------------------------------------------
+// bookkeeping_manager - constructor
+//-------------------------------------------------
+
+bookkeeping_manager::bookkeeping_manager(running_machine &machine)
+ : m_machine(machine),
+ m_dispensed_tickets(0)
+{
+ /* reset coin counters */
+ for (int counternum = 0; counternum < COIN_COUNTERS; counternum++)
+ {
+ m_lastcoin[counternum] = 0;
+ m_coinlockedout[counternum] = 0;
+ m_coin_count[counternum] = 0;
+ }
+
+ // register coin save state
+ machine.save().save_item(NAME(m_coin_count));
+ machine.save().save_item(NAME(m_coinlockedout));
+ machine.save().save_item(NAME(m_lastcoin));
+ machine.save().save_item(NAME(m_dispensed_tickets));
+
+ // register for configuration
+ machine.configuration().config_register("counters", config_saveload_delegate(FUNC(bookkeeping_manager::config_load), this), config_saveload_delegate(FUNC(bookkeeping_manager::config_save), this));
+}
+
+
+
+/***************************************************************************
+ TICKETS
+***************************************************************************/
+
+/*-------------------------------------------------
+ get_dispensed_tickets - return the number of
+ tickets dispensed
+-------------------------------------------------*/
+
+int bookkeeping_manager::get_dispensed_tickets() const
+{
+ return m_dispensed_tickets;
+}
+
+
+/*-------------------------------------------------
+ increment_dispensed_tickets - increment the
+ number of dispensed tickets
+-------------------------------------------------*/
+
+void bookkeeping_manager::increment_dispensed_tickets(int delta)
+{
+ m_dispensed_tickets += delta;
+}
+
+
+
+/***************************************************************************
+ COIN COUNTERS
+***************************************************************************/
+
+/*-------------------------------------------------
+ config_load - load the state of the counters
+ and tickets
+-------------------------------------------------*/
+
+void bookkeeping_manager::config_load(config_type cfg_type, xml_data_node *parentnode)
+{
+ xml_data_node *coinnode, *ticketnode;
+
+ /* on init, reset the counters */
+ if (cfg_type == config_type::CONFIG_TYPE_INIT)
+ {
+ memset(m_coin_count, 0, sizeof(m_coin_count));
+ m_dispensed_tickets = 0;
+ }
+
+ /* only care about game-specific data */
+ if (cfg_type != config_type::CONFIG_TYPE_GAME)
+ return;
+
+ /* might not have any data */
+ if (parentnode == nullptr)
+ return;
+
+ /* iterate over coins nodes */
+ for (coinnode = xml_get_sibling(parentnode->child, "coins"); coinnode; coinnode = xml_get_sibling(coinnode->next, "coins"))
+ {
+ int index = xml_get_attribute_int(coinnode, "index", -1);
+ if (index >= 0 && index < COIN_COUNTERS)
+ m_coin_count[index] = xml_get_attribute_int(coinnode, "number", 0);
+ }
+
+ /* get the single tickets node */
+ ticketnode = xml_get_sibling(parentnode->child, "tickets");
+ if (ticketnode != nullptr)
+ m_dispensed_tickets = xml_get_attribute_int(ticketnode, "number", 0);
+}
+
+
+/*-------------------------------------------------
+ config_save - save the state of the counters
+ and tickets
+-------------------------------------------------*/
+
+void bookkeeping_manager::config_save(config_type cfg_type, xml_data_node *parentnode)
+{
+ int i;
+
+ /* only care about game-specific data */
+ if (cfg_type != config_type::CONFIG_TYPE_GAME)
+ return;
+
+ /* iterate over coin counters */
+ for (i = 0; i < COIN_COUNTERS; i++)
+ if (m_coin_count[i] != 0)
+ {
+ xml_data_node *coinnode = xml_add_child(parentnode, "coins", nullptr);
+ if (coinnode != nullptr)
+ {
+ xml_set_attribute_int(coinnode, "index", i);
+ xml_set_attribute_int(coinnode, "number", m_coin_count[i]);
+ }
+ }
+
+ /* output tickets */
+ if (m_dispensed_tickets != 0)
+ {
+ xml_data_node *tickets = xml_add_child(parentnode, "tickets", nullptr);
+ if (tickets != nullptr)
+ xml_set_attribute_int(tickets, "number", m_dispensed_tickets);
+ }
+}
+
+
+/*-------------------------------------------------
+ coin_counter_w - sets input for coin counter
+-------------------------------------------------*/
+
+void bookkeeping_manager::coin_counter_w(int num, int on)
+{
+ if (num >= ARRAY_LENGTH(m_coin_count))
+ return;
+
+ /* Count it only if the data has changed from 0 to non-zero */
+ if (on && (m_lastcoin[num] == 0))
+ m_coin_count[num]++;
+ m_lastcoin[num] = on;
+}
+
+
+/*-------------------------------------------------
+ coin_counter_get_count - return the coin count
+ for a given coin
+-------------------------------------------------*/
+
+int bookkeeping_manager::coin_counter_get_count(int num)
+{
+ if (num >= ARRAY_LENGTH(m_coin_count))
+ return 0;
+ return m_coin_count[num];
+}
+
+
+/*-------------------------------------------------
+ coin_lockout_w - locks out one coin input
+-------------------------------------------------*/
+
+void bookkeeping_manager::coin_lockout_w(int num,int on)
+{
+ if (num >= ARRAY_LENGTH(m_coinlockedout))
+ return;
+ m_coinlockedout[num] = on;
+}
+
+
+/*-------------------------------------------------
+ coin_lockout_get_state - return current lockout
+ state for a particular coin
+-------------------------------------------------*/
+
+int bookkeeping_manager::coin_lockout_get_state(int num)
+{
+ if (num >= ARRAY_LENGTH(m_coinlockedout))
+ return FALSE;
+ return m_coinlockedout[num];
+}
+
+
+/*-------------------------------------------------
+ coin_lockout_global_w - locks out all the coin
+ inputs
+-------------------------------------------------*/
+
+void bookkeeping_manager::coin_lockout_global_w(int on)
+{
+ for (int i = 0; i < ARRAY_LENGTH(m_coinlockedout); i++)
+ coin_lockout_w(i, on);
+}
diff --git a/src/emu/bookkeeping.h b/src/emu/bookkeeping.h
new file mode 100644
index 00000000000..7285a40f058
--- /dev/null
+++ b/src/emu/bookkeeping.h
@@ -0,0 +1,78 @@
+// license:BSD-3-Clause
+// copyright-holders:Nicola Salmoria
+/*********************************************************************
+
+ bookkeeping.h
+
+ Bookkeeping simple machine functions.
+
+*********************************************************************/
+
+#pragma once
+
+#ifndef __BOOKKEEPING_H__
+#define __BOOKKEEPING_H__
+
+
+
+/***************************************************************************
+ CONSTANTS
+***************************************************************************/
+
+/* total # of coin counters */
+#define COIN_COUNTERS 8
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+
+// ======================> bookkeeping_manager
+
+enum class config_type;
+
+class bookkeeping_manager
+{
+public:
+ // construction/destruction
+ bookkeeping_manager(running_machine &machine);
+
+ // ----- tickets -----
+ // return the number of tickets dispensed
+ int get_dispensed_tickets() const;
+
+ // increment the number of dispensed tickets
+ void increment_dispensed_tickets(int delta);
+
+ // ----- coin counters -----
+ // write to a particular coin counter (clocks on active high edge)
+ void coin_counter_w(int num, int on);
+
+ // return the coin count for a given coin
+ int coin_counter_get_count(int num);
+
+ // enable/disable coin lockout for a particular coin
+ void coin_lockout_w(int num, int on);
+
+ // return current lockout state for a particular coin
+ int coin_lockout_get_state(int num);
+
+ // enable/disable global coin lockout
+ void coin_lockout_global_w(int on);
+
+ // getters
+ running_machine &machine() const { return m_machine; }
+private:
+ void config_load(config_type cfg_type, xml_data_node *parentnode);
+ void config_save(config_type cfg_type, xml_data_node *parentnode);
+
+ // internal state
+ running_machine & m_machine; // reference to our machine
+
+ UINT32 m_dispensed_tickets;
+ UINT32 m_coin_count[COIN_COUNTERS];
+ UINT32 m_coinlockedout[COIN_COUNTERS];
+ UINT32 m_lastcoin[COIN_COUNTERS];
+};
+
+#endif /* __BOOKKEEPING_H__ */
diff --git a/src/emu/cheat.cpp b/src/emu/cheat.cpp
index 8b1584bbd2a..16291063985 100644
--- a/src/emu/cheat.cpp
+++ b/src/emu/cheat.cpp
@@ -102,28 +102,23 @@
// the format
//-------------------------------------------------
-inline const char *number_and_format::format(std::string &str) const
+inline std::string number_and_format::format() const
{
switch (m_format)
{
default:
case XML_INT_FORMAT_DECIMAL:
- strprintf(str, "%d", (UINT32)m_value);
- break;
+ return strformat("%d", (UINT32)m_value);
case XML_INT_FORMAT_DECIMAL_POUND:
- strprintf(str, "#%d", (UINT32)m_value);
- break;
+ return strformat("#%d", (UINT32)m_value);
case XML_INT_FORMAT_HEX_DOLLAR:
- strprintf(str, "$%X", (UINT32)m_value);
- break;
+ return strformat("$%X", (UINT32)m_value);
case XML_INT_FORMAT_HEX_C:
- strprintf(str, "0x%X", (UINT32)m_value);
- break;
+ return strformat("0x%X", (UINT32)m_value);
}
- return str.c_str();
}
@@ -206,15 +201,14 @@ void cheat_parameter::save(emu_file &cheatfile) const
cheatfile.printf("\t\t<parameter");
// if no items, just output min/max/step
- std::string str;
if (!has_itemlist())
{
if (m_minval != 0)
- cheatfile.printf(" min=\"%s\"", m_minval.format(str));
+ cheatfile.printf(" min=\"%s\"", m_minval.format().c_str());
if (m_maxval != 0)
- cheatfile.printf(" max=\"%s\"", m_maxval.format(str));
+ cheatfile.printf(" max=\"%s\"", m_maxval.format().c_str());
if (m_stepval != 1)
- cheatfile.printf(" step=\"%s\"", m_stepval.format(str));
+ cheatfile.printf(" step=\"%s\"", m_stepval.format().c_str());
cheatfile.printf("/>\n");
}
@@ -222,7 +216,7 @@ void cheat_parameter::save(emu_file &cheatfile) const
else
{
for (const item *curitem = m_itemlist.first(); curitem != nullptr; curitem = curitem->next())
- cheatfile.printf("\t\t\t<item value=\"%s\">%s</item>\n", curitem->value().format(str), curitem->text());
+ cheatfile.printf("\t\t\t<item value=\"%s\">%s</item>\n", curitem->value().format().c_str(), curitem->text());
cheatfile.printf("\t\t</parameter>\n");
}
}
@@ -527,15 +521,13 @@ void cheat_script::script_entry::execute(cheat_manager &manager, UINT64 &arginde
void cheat_script::script_entry::save(emu_file &cheatfile) const
{
- std::string tempstring;
-
// output an action
if (m_format.empty())
{
cheatfile.printf("\t\t\t<action");
if (!m_condition.is_empty())
- cheatfile.printf(" condition=\"%s\"", cheat_manager::quote_expression(tempstring, m_condition));
- cheatfile.printf(">%s</action>\n", cheat_manager::quote_expression(tempstring, m_expression));
+ cheatfile.printf(" condition=\"%s\"", cheat_manager::quote_expression(m_condition).c_str());
+ cheatfile.printf(">%s</action>\n", cheat_manager::quote_expression(m_expression).c_str());
}
// output an output
@@ -543,7 +535,7 @@ void cheat_script::script_entry::save(emu_file &cheatfile) const
{
cheatfile.printf("\t\t\t<output format=\"%s\"", m_format.c_str());
if (!m_condition.is_empty())
- cheatfile.printf(" condition=\"%s\"", cheat_manager::quote_expression(tempstring, m_condition));
+ cheatfile.printf(" condition=\"%s\"", cheat_manager::quote_expression(m_condition).c_str());
if (m_line != 0)
cheatfile.printf(" line=\"%d\"", m_line);
if (m_justify == JUSTIFY_CENTER)
@@ -661,12 +653,10 @@ int cheat_script::script_entry::output_argument::values(UINT64 &argindex, UINT64
void cheat_script::script_entry::output_argument::save(emu_file &cheatfile) const
{
- std::string tempstring;
-
cheatfile.printf("\t\t\t\t<argument");
if (m_count != 1)
cheatfile.printf(" count=\"%d\"", (int)m_count);
- cheatfile.printf(">%s</argument>\n", cheat_manager::quote_expression(tempstring, m_expression));
+ cheatfile.printf(">%s</argument>\n", cheat_manager::quote_expression(m_expression).c_str());
}
@@ -706,10 +696,8 @@ cheat_entry::cheat_entry(cheat_manager &manager, symbol_table &globaltable, cons
// create the symbol table
m_symbols.add("argindex", symbol_table::READ_ONLY, &m_argindex);
- std::string tempname;
for (int curtemp = 0; curtemp < tempcount; curtemp++) {
- strprintf(tempname,"temp%d", curtemp);
- m_symbols.add(tempname.c_str(), symbol_table::READ_WRITE);
+ m_symbols.add(strformat("temp%d", curtemp).c_str(), symbol_table::READ_WRITE);
}
// read the first comment node
@@ -1267,9 +1255,9 @@ std::string &cheat_manager::get_output_astring(int row, int justify)
// document
//-------------------------------------------------
-const char *cheat_manager::quote_expression(std::string &str, const parsed_expression &expression)
+std::string cheat_manager::quote_expression(const parsed_expression &expression)
{
- str.assign(expression.original_string());
+ std::string str = expression.original_string();
strreplace(str, " && ", " and ");
strreplace(str, " &&", " and ");
@@ -1296,7 +1284,7 @@ const char *cheat_manager::quote_expression(std::string &str, const parsed_expre
strreplace(str, "<< ", " lshift ");
strreplace(str, "<<", " lshift ");
- return str.c_str();
+ return str;
}
diff --git a/src/emu/cheat.h b/src/emu/cheat.h
index 197de382cd3..8e49a8888bb 100644
--- a/src/emu/cheat.h
+++ b/src/emu/cheat.h
@@ -56,7 +56,7 @@ public:
operator const UINT64 &() const { return m_value; }
// format the number according to its format
- const char *format(std::string &str) const;
+ std::string format() const;
private:
// internal state
@@ -308,7 +308,7 @@ public:
std::string &get_output_astring(int row, int justify);
// global helpers
- static const char *quote_expression(std::string &str, const parsed_expression &expression);
+ static std::string quote_expression(const parsed_expression &expression);
static UINT64 execute_frombcd(symbol_table &table, void *ref, int params, const UINT64 *param);
static UINT64 execute_tobcd(symbol_table &table, void *ref, int params, const UINT64 *param);
diff --git a/src/emu/clifront.cpp b/src/emu/clifront.cpp
index 60d75272f82..05b0ace6116 100644
--- a/src/emu/clifront.cpp
+++ b/src/emu/clifront.cpp
@@ -72,11 +72,8 @@ private:
cli_frontend::cli_frontend(cli_options &options, osd_interface &osd)
: m_options(options),
m_osd(osd),
- m_result(MAMERR_NONE),
- m_start_memory(next_memory_id())
+ m_result(MAMERR_NONE)
{
- // begin tracking memory
- track_memory(true);
}
@@ -88,11 +85,6 @@ cli_frontend::~cli_frontend()
{
// nuke any device options since they will leak memory
m_options.remove_device_options();
-
- // report any unfreed memory on clean exits
- track_memory(false);
- if (m_result == MAMERR_NONE)
- dump_unfreed_mem(m_start_memory);
}
@@ -192,8 +184,7 @@ int cli_frontend::execute(int argc, char **argv)
osd_printf_error("Error in command line:\n%s\n", strtrimspace(option_errors).c_str());
// determine the base name of the EXE
- std::string exename;
- core_filename_extract_base(exename, argv[0], true);
+ std::string exename = core_filename_extract_base(argv[0], true);
// if we have a command, execute that
if (*(m_options.command()) != 0)
@@ -329,9 +320,8 @@ void cli_frontend::listsource(const char *gamename)
throw emu_fatalerror(MAMERR_NO_SUCH_GAME, "No matching games found for '%s'", gamename);
// iterate through drivers and output the info
- std::string filename;
while (drivlist.next())
- osd_printf_info("%-16s %s\n", drivlist.driver().name, core_filename_extract_base(filename, drivlist.driver().source_file).c_str());
+ osd_printf_info("%-16s %s\n", drivlist.driver().name, core_filename_extract_base(drivlist.driver().source_file).c_str());
}
@@ -417,11 +407,10 @@ void cli_frontend::listbrothers(const char *gamename)
// output the entries found
drivlist.reset();
- std::string filename;
while (drivlist.next())
{
int clone_of = drivlist.clone();
- osd_printf_info("%-16s %-16s %-16s\n", core_filename_extract_base(filename, drivlist.driver().source_file).c_str(), drivlist.driver().name, (clone_of == -1 ? "" : drivlist.driver(clone_of).name));
+ osd_printf_info("%-16s %-16s %-16s\n", core_filename_extract_base(drivlist.driver().source_file).c_str(), drivlist.driver().name, (clone_of == -1 ? "" : drivlist.driver(clone_of).name));
}
}
@@ -468,7 +457,6 @@ void cli_frontend::listroms(const char *gamename)
throw emu_fatalerror(MAMERR_NO_SUCH_GAME, "No matching games found for '%s'", gamename);
// iterate through matches
- std::string tempstr;
bool first = true;
while (drivlist.next())
{
@@ -506,7 +494,7 @@ void cli_frontend::listroms(const char *gamename)
{
if (hashes.flag(hash_collection::FLAG_BAD_DUMP))
osd_printf_info(" BAD");
- osd_printf_info(" %s", hashes.macro_string(tempstr));
+ osd_printf_info(" %s", hashes.macro_string().c_str());
}
else
osd_printf_info(" NO GOOD DUMP KNOWN");
@@ -597,8 +585,6 @@ void cli_frontend::listdevices(const char *gamename)
// dump the results
for (auto device : device_list)
{
-
-
// extract the tag, stripping the leading colon
const char *tag = device->tag();
if (*tag == ':')
@@ -939,6 +925,67 @@ void cli_frontend::verifyroms(const char *gamename)
}
}
}
+ } else {
+ // check for subdevices with ROMs (a few devices are missed otherwise, e.g. MPU401)
+ device_iterator subiter(*dev);
+ for (device_t *device = subiter.first(); device != nullptr; device = subiter.next())
+ {
+ device_iterator subsubiter(*device);
+ for (device_t *subdev = subsubiter.first(); subdev != nullptr; subdev = subsubiter.next())
+ {
+ if (subdev->owner() == device && subdev->rom_region() != nullptr && subdev->shortname() != nullptr && subdev->shortname()[0] != '\0')
+ {
+ if (device_map.insert(subdev->shortname()).second)
+ {
+ if (core_strwildcmp(gamename, subdev->shortname()) == 0)
+ {
+ matched++;
+
+ // audit the ROMs in this set
+ media_auditor::summary summary = auditor.audit_device(subdev, AUDIT_VALIDATE_FAST);
+
+ // if not found, count that and leave it at that
+ if (summary == media_auditor::NOTFOUND)
+ notfound++;
+
+ // else display information about what we discovered
+ else if (summary != media_auditor::NONE_NEEDED)
+ {
+ // output the summary of the audit
+ std::string summary_string;
+ auditor.summarize(subdev->shortname(),&summary_string);
+ osd_printf_info("%s", summary_string.c_str());
+
+ // display information about what we discovered
+ osd_printf_info("romset %s ", subdev->shortname());
+
+ // switch off of the result
+ switch (summary)
+ {
+ case media_auditor::INCORRECT:
+ osd_printf_info("is bad\n");
+ incorrect++;
+ break;
+
+ case media_auditor::CORRECT:
+ osd_printf_info("is good\n");
+ correct++;
+ break;
+
+ case media_auditor::BEST_AVAILABLE:
+ osd_printf_info("is best available\n");
+ correct++;
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
}
const_cast<machine_config &>(config).device_remove(&config.root_device(), temptag.c_str());
@@ -1123,8 +1170,6 @@ void cli_frontend::verifysamples(const char *gamename)
void cli_frontend::output_single_softlist(FILE *out, software_list_device &swlistdev)
{
- std::string tempstr;
-
fprintf(out, "\t<softwarelist name=\"%s\" description=\"%s\">\n", swlistdev.list_name(), xml_normalize_string(swlistdev.description()));
for (software_info *swinfo = swlistdev.first_software_info(); swinfo != nullptr; swinfo = swinfo->next())
{
@@ -1176,7 +1221,7 @@ void cli_frontend::output_single_softlist(FILE *out, software_list_device &swlis
/* dump checksum information only if there is a known dump */
hash_collection hashes(ROM_GETHASHDATA(rom));
if ( !hashes.flag(hash_collection::FLAG_NO_DUMP) )
- fprintf( out, " %s", hashes.attribute_string(tempstr) );
+ fprintf( out, " %s", hashes.attribute_string().c_str() );
else
fprintf( out, " status=\"nodump\"" );
@@ -1541,9 +1586,8 @@ void cli_frontend::execute_commands(const char *exename)
// showusage?
if (strcmp(m_options.command(), CLICOMMAND_SHOWUSAGE) == 0)
{
- std::string helpstring;
emulator_info::printf_usage(exename, emulator_info::get_gamenoun());
- osd_printf_info("\n\nOptions:\n%s", m_options.output_help(helpstring));
+ osd_printf_info("\n\nOptions:\n%s", m_options.output_help().c_str());
return;
}
@@ -1551,9 +1595,10 @@ void cli_frontend::execute_commands(const char *exename)
if (strcmp(m_options.command(), CLICOMMAND_VALIDATE) == 0)
{
validity_checker valid(m_options);
- bool result = valid.check_all();
+ const char *sysname = m_options.system_name();
+ bool result = valid.check_all_matching((sysname[0] == 0) ? "*" : sysname);
if (!result)
- throw emu_fatalerror(MAMERR_FAILED_VALIDITY, "Validity check failed!\n");
+ throw emu_fatalerror(MAMERR_FAILED_VALIDITY, "Validity check failed (%d errors, %d warnings in total)\n", valid.errors(), valid.warnings());
return;
}
@@ -1572,8 +1617,7 @@ void cli_frontend::execute_commands(const char *exename)
throw emu_fatalerror("Unable to create file %s.ini\n",emulator_info::get_configname());
// generate the updated INI
- std::string initext;
- file.puts(m_options.output_ini(initext));
+ file.puts(m_options.output_ini().c_str());
return;
}
@@ -1581,8 +1625,7 @@ void cli_frontend::execute_commands(const char *exename)
if (strcmp(m_options.command(), CLICOMMAND_SHOWCONFIG) == 0)
{
// print the INI text
- std::string initext;
- printf("%s\n", m_options.output_ini(initext));
+ printf("%s\n", m_options.output_ini().c_str());
return;
}
@@ -1636,7 +1679,7 @@ void cli_frontend::execute_commands(const char *exename)
void cli_frontend::display_help()
{
- osd_printf_info("%s v%s - %s\n%s\n\n", emulator_info::get_applongname(),build_version,emulator_info::get_fulllongname(),emulator_info::get_copyright_info());
+ osd_printf_info("%s v%s\n%s\n\n", emulator_info::get_appname(),build_version,emulator_info::get_copyright_info());
osd_printf_info("%s\n", emulator_info::get_disclaimer());
emulator_info::printf_usage(emulator_info::get_appname(),emulator_info::get_gamenoun());
osd_printf_info("\n\n"
@@ -1783,8 +1826,7 @@ void media_identifier::identify_file(const char *name)
if (core_filename_ends_with(name, ".chd"))
{
// output the name
- std::string basename;
- osd_printf_info("%-20s", core_filename_extract_base(basename, name).c_str());
+ osd_printf_info("%-20s", core_filename_extract_base(name).c_str());
m_total++;
// attempt to open as a CHD; fail if not
@@ -1859,8 +1901,7 @@ void media_identifier::identify_data(const char *name, const UINT8 *data, int le
// output the name
m_total++;
- std::string basename;
- osd_printf_info("%-20s", core_filename_extract_base(basename, name).c_str());
+ osd_printf_info("%-20s", core_filename_extract_base(name).c_str());
// see if we can find a match in the ROMs
int found = find_by_hash(hashes, length);
diff --git a/src/emu/clifront.h b/src/emu/clifront.h
index b5613f94b76..584261660db 100644
--- a/src/emu/clifront.h
+++ b/src/emu/clifront.h
@@ -67,7 +67,6 @@ private:
cli_options & m_options;
osd_interface & m_osd;
int m_result;
- UINT64 m_start_memory;
};
diff --git a/src/emu/config.cpp b/src/emu/config.cpp
index 65dbea7ce38..691012a4a41 100644
--- a/src/emu/config.cpp
+++ b/src/emu/config.cpp
@@ -13,59 +13,22 @@
#include "config.h"
#include "xmlfile.h"
-
#define DEBUG_CONFIG 0
+//**************************************************************************
+// CONFIGURATION MANAGER
+//**************************************************************************
+//-------------------------------------------------
+// configuration_manager - constructor
+//-------------------------------------------------
-/***************************************************************************
- TYPE DEFINITIONS
-***************************************************************************/
-
-struct config_type
-{
- config_type * next; /* next in line */
- const char * name; /* node name */
- config_saveload_delegate load; /* load callback */
- config_saveload_delegate save; /* save callback */
-};
-
-
-
-/***************************************************************************
- GLOBAL VARIABLES
-***************************************************************************/
-
-static config_type *typelist;
-
-
-
-/***************************************************************************
- FUNCTION PROTOTYPES
-***************************************************************************/
-
-static int config_load_xml(running_machine &machine, emu_file &file, int type);
-static int config_save_xml(running_machine &machine, emu_file &file, int type);
-
-
-
-/***************************************************************************
- CORE IMPLEMENTATION
-***************************************************************************/
-
-/*************************************
- *
- * Reset the configuration callbacks
- *
- *************************************/
-void config_init(running_machine &machine)
+configuration_manager::configuration_manager(running_machine &machine)
+ : m_machine(machine)
{
- typelist = nullptr;
}
-
-
/*************************************
*
* Register to be involved in config
@@ -73,21 +36,14 @@ void config_init(running_machine &machine)
*
*************************************/
-void config_register(running_machine &machine, const char *nodename, config_saveload_delegate load, config_saveload_delegate save)
+void configuration_manager::config_register(const char* nodename, config_saveload_delegate load, config_saveload_delegate save)
{
- config_type *newtype;
- config_type **ptype;
-
- /* allocate a new type */
- newtype = auto_alloc(machine, config_type);
- newtype->next = nullptr;
- newtype->name = nodename;
- newtype->load = load;
- newtype->save = save;
-
- /* add us to the end */
- for (ptype = &typelist; *ptype; ptype = &(*ptype)->next) { }
- *ptype = newtype;
+ config_element element;
+ element.name = nodename;
+ element.load = load;
+ element.save = save;
+
+ m_typelist.push_back(element);
}
@@ -98,45 +54,44 @@ void config_register(running_machine &machine, const char *nodename, config_save
*
*************************************/
-int config_load_settings(running_machine &machine)
+int configuration_manager::load_settings()
{
- const char *controller = machine.options().ctrlr();
- config_type *type;
+ const char *controller = machine().options().ctrlr();
int loaded = 0;
/* loop over all registrants and call their init function */
- for (type = typelist; type; type = type->next)
- type->load(CONFIG_TYPE_INIT, nullptr);
+ for (auto type : m_typelist)
+ type.load(config_type::CONFIG_TYPE_INIT, nullptr);
/* now load the controller file */
if (controller[0] != 0)
{
/* open the config file */
- emu_file file(machine.options().ctrlr_path(), OPEN_FLAG_READ);
+ emu_file file(machine().options().ctrlr_path(), OPEN_FLAG_READ);
file_error filerr = file.open(controller, ".cfg");
if (filerr != FILERR_NONE)
throw emu_fatalerror("Could not load controller file %s.cfg", controller);
/* load the XML */
- if (!config_load_xml(machine, file, CONFIG_TYPE_CONTROLLER))
+ if (!load_xml(file, config_type::CONFIG_TYPE_CONTROLLER))
throw emu_fatalerror("Could not load controller file %s.cfg", controller);
}
/* next load the defaults file */
- emu_file file(machine.options().cfg_directory(), OPEN_FLAG_READ);
+ emu_file file(machine().options().cfg_directory(), OPEN_FLAG_READ);
file_error filerr = file.open("default.cfg");
if (filerr == FILERR_NONE)
- config_load_xml(machine, file, CONFIG_TYPE_DEFAULT);
+ load_xml(file, config_type::CONFIG_TYPE_DEFAULT);
/* finally, load the game-specific file */
- filerr = file.open(machine.basename(), ".cfg");
+ filerr = file.open(machine().basename(), ".cfg");
if (filerr == FILERR_NONE)
- loaded = config_load_xml(machine, file, CONFIG_TYPE_GAME);
+ loaded = load_xml(file, config_type::CONFIG_TYPE_GAME);
/* loop over all registrants and call their final function */
- for (type = typelist; type; type = type->next)
- type->load(CONFIG_TYPE_FINAL, nullptr);
+ for (auto type : m_typelist)
+ type.load(config_type::CONFIG_TYPE_FINAL, nullptr);
/* if we didn't find a saved config, return 0 so the main core knows that it */
/* is the first time the game is run and it should diplay the disclaimer. */
@@ -144,28 +99,26 @@ int config_load_settings(running_machine &machine)
}
-void config_save_settings(running_machine &machine)
+void configuration_manager::save_settings()
{
- config_type *type;
-
/* loop over all registrants and call their init function */
- for (type = typelist; type; type = type->next)
- type->save(CONFIG_TYPE_INIT, nullptr);
+ for (auto type : m_typelist)
+ type.save(config_type::CONFIG_TYPE_INIT, nullptr);
/* save the defaults file */
- emu_file file(machine.options().cfg_directory(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
+ emu_file file(machine().options().cfg_directory(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
file_error filerr = file.open("default.cfg");
if (filerr == FILERR_NONE)
- config_save_xml(machine, file, CONFIG_TYPE_DEFAULT);
+ save_xml(file, config_type::CONFIG_TYPE_DEFAULT);
/* finally, save the game-specific file */
- filerr = file.open(machine.basename(), ".cfg");
+ filerr = file.open(machine().basename(), ".cfg");
if (filerr == FILERR_NONE)
- config_save_xml(machine, file, CONFIG_TYPE_GAME);
+ save_xml(file, config_type::CONFIG_TYPE_GAME);
/* loop over all registrants and call their final function */
- for (type = typelist; type; type = type->next)
- type->save(CONFIG_TYPE_FINAL, nullptr);
+ for (auto type : m_typelist)
+ type.save(config_type::CONFIG_TYPE_FINAL, nullptr);
}
@@ -176,10 +129,9 @@ void config_save_settings(running_machine &machine)
*
*************************************/
-static int config_load_xml(running_machine &machine, emu_file &file, int which_type)
+int configuration_manager::load_xml(emu_file &file, config_type which_type)
{
xml_data_node *root, *confignode, *systemnode;
- config_type *type;
const char *srcfile;
int version, count;
@@ -199,13 +151,13 @@ static int config_load_xml(running_machine &machine, emu_file &file, int which_t
goto error;
/* strip off all the path crap from the source filename */
- srcfile = strrchr(machine.system().source_file, '/');
+ srcfile = strrchr(machine().system().source_file, '/');
if (!srcfile)
- srcfile = strrchr(machine.system().source_file, '\\');
+ srcfile = strrchr(machine().system().source_file, '\\');
if (!srcfile)
- srcfile = strrchr(machine.system().source_file, ':');
+ srcfile = strrchr(machine().system().source_file, ':');
if (!srcfile)
- srcfile = machine.system().source_file;
+ srcfile = machine().system().source_file;
else
srcfile++;
@@ -219,30 +171,32 @@ static int config_load_xml(running_machine &machine, emu_file &file, int which_t
/* based on the file type, determine whether we have a match */
switch (which_type)
{
- case CONFIG_TYPE_GAME:
+ case config_type::CONFIG_TYPE_GAME:
/* only match on the specific game name */
- if (strcmp(name, machine.system().name) != 0)
+ if (strcmp(name, machine().system().name) != 0)
continue;
break;
- case CONFIG_TYPE_DEFAULT:
+ case config_type::CONFIG_TYPE_DEFAULT:
/* only match on default */
if (strcmp(name, "default") != 0)
continue;
break;
- case CONFIG_TYPE_CONTROLLER:
+ case config_type::CONFIG_TYPE_CONTROLLER:
{
int clone_of;
/* match on: default, game name, source file name, parent name, grandparent name */
if (strcmp(name, "default") != 0 &&
- strcmp(name, machine.system().name) != 0 &&
+ strcmp(name, machine().system().name) != 0 &&
strcmp(name, srcfile) != 0 &&
- ((clone_of = driver_list::clone(machine.system())) == -1 || strcmp(name, driver_list::driver(clone_of).name) != 0) &&
+ ((clone_of = driver_list::clone(machine().system())) == -1 || strcmp(name, driver_list::driver(clone_of).name) != 0) &&
(clone_of == -1 || ((clone_of = driver_list::clone(clone_of)) == -1) || strcmp(name, driver_list::driver(clone_of).name) != 0))
continue;
break;
}
+ default:
+ break;
}
/* log that we are processing this entry */
@@ -250,8 +204,8 @@ static int config_load_xml(running_machine &machine, emu_file &file, int which_t
osd_printf_debug("Entry: %s -- processing\n", name);
/* loop over all registrants and call their load function */
- for (type = typelist; type; type = type->next)
- type->load(which_type, xml_get_sibling(systemnode->child, type->name));
+ for (auto type : m_typelist)
+ type.load(which_type, xml_get_sibling(systemnode->child, type.name.c_str()));
count++;
}
@@ -277,11 +231,10 @@ error:
*
*************************************/
-static int config_save_xml(running_machine &machine, emu_file &file, int which_type)
+int configuration_manager::save_xml(emu_file &file, config_type which_type)
{
xml_data_node *root = xml_file_create();
xml_data_node *confignode, *systemnode;
- config_type *type;
/* if we don't have a root, bail */
if (!root)
@@ -297,16 +250,16 @@ static int config_save_xml(running_machine &machine, emu_file &file, int which_t
systemnode = xml_add_child(confignode, "system", nullptr);
if (!systemnode)
goto error;
- xml_set_attribute(systemnode, "name", (which_type == CONFIG_TYPE_DEFAULT) ? "default" : machine.system().name);
+ xml_set_attribute(systemnode, "name", (which_type == config_type::CONFIG_TYPE_DEFAULT) ? "default" : machine().system().name);
/* create the input node and write it out */
/* loop over all registrants and call their save function */
- for (type = typelist; type; type = type->next)
+ for (auto type : m_typelist)
{
- xml_data_node *curnode = xml_add_child(systemnode, type->name, nullptr);
+ xml_data_node *curnode = xml_add_child(systemnode, type.name.c_str(), nullptr);
if (!curnode)
goto error;
- type->save(which_type, curnode);
+ type.save(which_type, curnode);
/* if nothing was added, just nuke the node */
if (!curnode->value && !curnode->child)
diff --git a/src/emu/config.h b/src/emu/config.h
index da3d7dc3bae..172f9f19daa 100644
--- a/src/emu/config.h
+++ b/src/emu/config.h
@@ -14,8 +14,6 @@
#include "xmlfile.h"
-
-
/*************************************
*
* Constants
@@ -24,7 +22,7 @@
#define CONFIG_VERSION 10
-enum
+enum class config_type
{
CONFIG_TYPE_INIT = 0, /* opportunity to initialize things first */
CONFIG_TYPE_CONTROLLER, /* loading from controller file */
@@ -33,27 +31,42 @@ enum
CONFIG_TYPE_FINAL /* opportunity to finish initialization */
};
-
-
/*************************************
*
* Type definitions
*
*************************************/
-typedef delegate<void (int, xml_data_node *)> config_saveload_delegate;
-
-
+typedef delegate<void (config_type, xml_data_node *)> config_saveload_delegate;
-/*************************************
- *
- * Function prototypes
- *
- *************************************/
+// ======================> configuration_manager
-void config_init(running_machine &machine);
-void config_register(running_machine &machine, const char *nodename, config_saveload_delegate load, config_saveload_delegate save);
-int config_load_settings(running_machine &machine);
-void config_save_settings(running_machine &machine);
+class configuration_manager
+{
+ struct config_element
+ {
+ std::string name; /* node name */
+ config_saveload_delegate load; /* load callback */
+ config_saveload_delegate save; /* save callback */
+ };
+
+public:
+ // construction/destruction
+ configuration_manager(running_machine &machine);
+
+ void config_register(const char* nodename, config_saveload_delegate load, config_saveload_delegate save);
+ int load_settings();
+ void save_settings();
+
+ // getters
+ running_machine &machine() const { return m_machine; }
+private:
+ int load_xml(emu_file &file, config_type which_type);
+ int save_xml(emu_file &file, config_type which_type);
+
+ // internal state
+ running_machine & m_machine; // reference to our machine
+ std::vector<config_element> m_typelist;
+};
#endif /* __CONFIG_H__ */
diff --git a/src/emu/crsshair.cpp b/src/emu/crsshair.cpp
index 88cfb8dac02..a4bee628ae9 100644
--- a/src/emu/crsshair.cpp
+++ b/src/emu/crsshair.cpp
@@ -25,37 +25,9 @@
/***************************************************************************
- TYPE DEFINITIONS
-***************************************************************************/
-
-struct crosshair_global
-{
- UINT8 usage; /* true if any crosshairs are used */
- UINT8 used[MAX_PLAYERS]; /* usage per player */
- UINT8 mode[MAX_PLAYERS]; /* visibility mode per player */
- UINT8 visible[MAX_PLAYERS]; /* visibility per player */
- bitmap_argb32 * bitmap[MAX_PLAYERS]; /* bitmap per player */
- render_texture * texture[MAX_PLAYERS]; /* texture per player */
- screen_device * screen[MAX_PLAYERS]; /* the screen on which this player's crosshair is drawn */
- float x[MAX_PLAYERS]; /* current X position */
- float y[MAX_PLAYERS]; /* current Y position */
- float last_x[MAX_PLAYERS]; /* last X position */
- float last_y[MAX_PLAYERS]; /* last Y position */
- UINT8 fade; /* color fading factor */
- UINT8 animation_counter; /* animation frame index */
- UINT16 auto_time; /* time in seconds to turn invisible */
- UINT16 time[MAX_PLAYERS]; /* time since last movement */
- char name[MAX_PLAYERS][CROSSHAIR_PIC_NAME_LENGTH + 1]; /* name of crosshair png file */
-};
-
-
-/***************************************************************************
GLOBAL VARIABLES
***************************************************************************/
-/* global state */
-static crosshair_global global;
-
/* raw bitmap */
static const UINT8 crosshair_raw_top[] =
{
@@ -123,71 +95,117 @@ static const rgb_t crosshair_colors[] =
rgb_t(0xff,0xff,0xff)
};
+//**************************************************************************
+// CROSSHAIR MANAGER
+//**************************************************************************
-/***************************************************************************
- FUNCTION PROTOTYPES
-***************************************************************************/
+//-------------------------------------------------
+// crosshair_manager - constructor
+//-------------------------------------------------
+
+crosshair_manager::crosshair_manager(running_machine &machine)
+ : m_machine(machine)
+{
+ /* request a callback upon exiting */
+ machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(crosshair_manager::exit), this));
-static void crosshair_exit(running_machine &machine);
-static void crosshair_load(running_machine &machine, int config_type, xml_data_node *parentnode);
-static void crosshair_save(running_machine &machine, int config_type, xml_data_node *parentnode);
+ /* setup the default auto visibility time */
+ m_auto_time = CROSSHAIR_VISIBILITY_AUTOTIME_DEFAULT;
-static void animate(running_machine &machine, screen_device &device, bool vblank_state);
+ /* determine who needs crosshairs */
+ for (ioport_port *port = machine.ioport().first_port(); port != nullptr; port = port->next())
+ for (ioport_field *field = port->first_field(); field != nullptr; field = field->next())
+ if (field->crosshair_axis() != CROSSHAIR_AXIS_NONE)
+ {
+ int player = field->player();
+ assert(player < MAX_PLAYERS);
-/***************************************************************************
- CORE IMPLEMENTATION
-***************************************************************************/
+ /* mark as used and set the default visibility and mode */
+ m_usage = TRUE;
+ m_used[player] = TRUE;
+ m_mode[player] = CROSSHAIR_VISIBILITY_DEFAULT;
+ m_visible[player] = (CROSSHAIR_VISIBILITY_DEFAULT == CROSSHAIR_VISIBILITY_OFF) ? FALSE : TRUE;
+ /* for now, use the main screen */
+ m_screen[player] = machine.first_screen();
+
+ create_bitmap(player);
+ }
+
+ /* register callbacks for when we load/save configurations */
+ if (m_usage)
+ machine.configuration().config_register("crosshairs", config_saveload_delegate(FUNC(crosshair_manager::config_load), this), config_saveload_delegate(FUNC(crosshair_manager::config_save), this));
+
+ /* register the animation callback */
+ if (machine.first_screen() != nullptr)
+ machine.first_screen()->register_vblank_callback(vblank_state_delegate(FUNC(crosshair_manager::animate), this));
+}
+
+/*-------------------------------------------------
+exit - free memory allocated for
+the crosshairs
+-------------------------------------------------*/
+
+void crosshair_manager::exit()
+{
+ /* free bitmaps and textures for each player */
+ for (int player = 0; player < MAX_PLAYERS; player++)
+ {
+ machine().render().texture_free(m_texture[player]);
+ m_texture[player] = nullptr;
+ m_bitmap[player] = nullptr;
+ }
+}
/*-------------------------------------------------
create_bitmap - create the rendering
structures for the given player
-------------------------------------------------*/
-static void create_bitmap(running_machine &machine, int player)
+void crosshair_manager::create_bitmap(int player)
{
int x, y;
char filename[20];
rgb_t color = crosshair_colors[player];
/* if we have a bitmap and texture for this player, kill it */
- if (global.bitmap[player] == nullptr) {
- global.bitmap[player] = global_alloc(bitmap_argb32);
- global.texture[player] = machine.render().texture_alloc(render_texture::hq_scale);
+ if (m_bitmap[player] == nullptr) {
+ m_bitmap[player] = std::make_unique<bitmap_argb32>();
+ m_texture[player] = machine().render().texture_alloc(render_texture::hq_scale);
}
- emu_file crossfile(machine.options().crosshair_path(), OPEN_FLAG_READ);
- if (global.name[player][0] != 0)
+ emu_file crossfile(machine().options().crosshair_path(), OPEN_FLAG_READ);
+ if (m_name[player][0] != 0)
{
/* look for user specified file */
- sprintf(filename, "%s.png", global.name[player]);
- render_load_png(*global.bitmap[player], crossfile, nullptr, filename);
+ sprintf(filename, "%s.png", m_name[player]);
+ render_load_png(*m_bitmap[player], crossfile, nullptr, filename);
}
else
{
/* look for default cross?.png in crsshair\game dir */
sprintf(filename, "cross%d.png", player + 1);
- render_load_png(*global.bitmap[player], crossfile, machine.system().name, filename);
+ render_load_png(*m_bitmap[player], crossfile, machine().system().name, filename);
/* look for default cross?.png in crsshair dir */
- if (!global.bitmap[player]->valid())
- render_load_png(*global.bitmap[player], crossfile, nullptr, filename);
+ if (!m_bitmap[player]->valid())
+ render_load_png(*m_bitmap[player], crossfile, nullptr, filename);
}
/* if that didn't work, use the built-in one */
- if (!global.bitmap[player]->valid())
+ if (!m_bitmap[player]->valid())
{
/* allocate a blank bitmap to start with */
- global.bitmap[player]->allocate(CROSSHAIR_RAW_SIZE, CROSSHAIR_RAW_SIZE);
- global.bitmap[player]->fill(rgb_t(0x00,0xff,0xff,0xff));
+ m_bitmap[player]->allocate(CROSSHAIR_RAW_SIZE, CROSSHAIR_RAW_SIZE);
+ m_bitmap[player]->fill(rgb_t(0x00,0xff,0xff,0xff));
/* extract the raw source data to it */
for (y = 0; y < CROSSHAIR_RAW_SIZE / 2; y++)
{
/* assume it is mirrored vertically */
- UINT32 *dest0 = &global.bitmap[player]->pix32(y);
- UINT32 *dest1 = &global.bitmap[player]->pix32(CROSSHAIR_RAW_SIZE - 1 - y);
+ UINT32 *dest0 = &m_bitmap[player]->pix32(y);
+ UINT32 *dest1 = &m_bitmap[player]->pix32(CROSSHAIR_RAW_SIZE - 1 - y);
/* extract to two rows simultaneously */
for (x = 0; x < CROSSHAIR_RAW_SIZE; x++)
@@ -197,123 +215,45 @@ static void create_bitmap(running_machine &machine, int player)
}
/* reference the new bitmap */
- global.texture[player]->set_bitmap(*global.bitmap[player], global.bitmap[player]->cliprect(), TEXFORMAT_ARGB32);
-}
-
-
-/*-------------------------------------------------
- crosshair_init - initialize the crosshair
- bitmaps and such
--------------------------------------------------*/
-
-void crosshair_init(running_machine &machine)
-{
- /* request a callback upon exiting */
- machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(crosshair_exit), &machine));
-
- /* clear all the globals */
- memset(&global, 0, sizeof(global));
-
- /* setup the default auto visibility time */
- global.auto_time = CROSSHAIR_VISIBILITY_AUTOTIME_DEFAULT;
-
- /* determine who needs crosshairs */
- for (ioport_port *port = machine.ioport().first_port(); port != nullptr; port = port->next())
- for (ioport_field *field = port->first_field(); field != nullptr; field = field->next())
- if (field->crosshair_axis() != CROSSHAIR_AXIS_NONE)
- {
- int player = field->player();
-
- assert(player < MAX_PLAYERS);
-
- /* mark as used and set the default visibility and mode */
- global.usage = TRUE;
- global.used[player] = TRUE;
- global.mode[player] = CROSSHAIR_VISIBILITY_DEFAULT;
- global.visible[player] = (CROSSHAIR_VISIBILITY_DEFAULT == CROSSHAIR_VISIBILITY_OFF) ? FALSE : TRUE;
-
- /* for now, use the main screen */
- global.screen[player] = machine.first_screen();
-
- create_bitmap(machine, player);
- }
-
- /* register callbacks for when we load/save configurations */
- if (global.usage)
- config_register(machine, "crosshairs", config_saveload_delegate(FUNC(crosshair_load), &machine), config_saveload_delegate(FUNC(crosshair_save), &machine));
-
- /* register the animation callback */
- if (machine.first_screen() != nullptr)
- machine.first_screen()->register_vblank_callback(vblank_state_delegate(FUNC(animate), &machine));
+ m_texture[player]->set_bitmap(*m_bitmap[player], m_bitmap[player]->cliprect(), TEXFORMAT_ARGB32);
}
-
/*-------------------------------------------------
- crosshair_exit - free memory allocated for
- the crosshairs
--------------------------------------------------*/
-
-static void crosshair_exit(running_machine &machine)
-{
- /* free bitmaps and textures for each player */
- for (int player = 0; player < MAX_PLAYERS; player++)
- {
- machine.render().texture_free(global.texture[player]);
- global.texture[player] = nullptr;
-
- global_free(global.bitmap[player]);
- global.bitmap[player] = nullptr;
- }
-}
-
-
-/*-------------------------------------------------
- crosshair_get_usage - return TRUE
- if any crosshairs are used
--------------------------------------------------*/
-
-int crosshair_get_usage(running_machine &machine)
-{
- return global.usage;
-}
-
-
-/*-------------------------------------------------
- crosshair_get_user_settings - return the
+ get_user_settings - return the
current crosshair settings for a player
Note: auto_time is common for all players
-------------------------------------------------*/
-void crosshair_get_user_settings(running_machine &machine, UINT8 player, crosshair_user_settings *settings)
+void crosshair_manager::get_user_settings(UINT8 player, crosshair_user_settings *settings)
{
- settings->auto_time = global.auto_time;
- settings->used = global.used[player];
- settings->mode = global.mode[player];
- strcpy(settings->name, global.name[player]);
+ settings->auto_time = m_auto_time;
+ settings->used = m_used[player];
+ settings->mode = m_mode[player];
+ strcpy(settings->name, m_name[player]);
}
/*-------------------------------------------------
- crosshair_set_user_settings - modify the
+ set_user_settings - modify the
current crosshair settings for a player
Note: auto_time is common for all players
-------------------------------------------------*/
-void crosshair_set_user_settings(running_machine &machine, UINT8 player, crosshair_user_settings *settings)
+void crosshair_manager::set_user_settings(UINT8 player, crosshair_user_settings *settings)
{
- global.auto_time = settings->auto_time;
- global.used[player] = settings->used;
- global.mode[player] = settings->mode;
+ m_auto_time = settings->auto_time;
+ m_used[player] = settings->used;
+ m_mode[player] = settings->mode;
/* set visibility as specified by mode */
/* auto mode starts with visibility off */
- global.visible[player] = (settings->mode == CROSSHAIR_VISIBILITY_ON) ? TRUE : FALSE;
+ m_visible[player] = (settings->mode == CROSSHAIR_VISIBILITY_ON) ? TRUE : FALSE;
/* update bitmap if name has changed */
- int changed = strcmp(settings->name, global.name[player]);
- strcpy(global.name[player], settings->name);
+ int changed = strcmp(settings->name, m_name[player]);
+ strcpy(m_name[player], settings->name);
if (changed != 0)
- create_bitmap(machine, player);
+ create_bitmap(player);
}
@@ -321,7 +261,7 @@ void crosshair_set_user_settings(running_machine &machine, UINT8 player, crossha
animate - animates the crosshair once a frame
-------------------------------------------------*/
-static void animate(running_machine &machine, screen_device &device, bool vblank_state)
+void crosshair_manager::animate(screen_device &device, bool vblank_state)
{
int player;
@@ -330,30 +270,30 @@ static void animate(running_machine &machine, screen_device &device, bool vblank
return;
/* increment animation counter */
- global.animation_counter += 0x08;
+ m_animation_counter += 0x08;
/* compute a fade factor from the current animation value */
- if (global.animation_counter < 0x80)
- global.fade = 0xa0 + (0x60 * ( global.animation_counter & 0x7f) / 0x80);
+ if (m_animation_counter < 0x80)
+ m_fade = 0xa0 + (0x60 * ( m_animation_counter & 0x7f) / 0x80);
else
- global.fade = 0xa0 + (0x60 * (~global.animation_counter & 0x7f) / 0x80);
+ m_fade = 0xa0 + (0x60 * (~m_animation_counter & 0x7f) / 0x80);
for (player = 0; player < MAX_PLAYERS; player++)
{
/* read all the lightgun values */
- if (global.used[player])
- device.machine().ioport().crosshair_position(player, global.x[player], global.y[player]);
+ if (m_used[player])
+ device.machine().ioport().crosshair_position(player, m_x[player], m_y[player]);
/* auto visibility */
- if (global.mode[player] == CROSSHAIR_VISIBILITY_AUTO)
+ if (m_mode[player] == CROSSHAIR_VISIBILITY_AUTO)
{
- if ((global.x[player] != global.last_x[player]) || (global.y[player] != global.last_y[player]))
+ if ((m_x[player] != m_last_x[player]) || (m_y[player] != m_last_y[player]))
{
/* crosshair has moved, keep crosshair visible */
- global.visible[player] = TRUE;
- global.last_x[player] = global.x[player];
- global.last_y[player] = global.y[player];
- global.time[player] = 0;
+ m_visible[player] = TRUE;
+ m_last_x[player] = m_x[player];
+ m_last_y[player] = m_y[player];
+ m_time[player] = 0;
}
else
{
@@ -361,12 +301,12 @@ static void animate(running_machine &machine, screen_device &device, bool vblank
/* slightly confusing formula, but the effect is: */
/* auto_time = 0 makes the crosshair barely visible while moved */
/* every increment in auto_time is about .2s at 60Hz */
- if (global.time[player] > global.auto_time * 12 + 2)
+ if (m_time[player] > m_auto_time * 12 + 2)
/* time exceeded so turn crosshair invisible */
- global.visible[player] = FALSE;
+ m_visible[player] = FALSE;
/* increment player visibility time */
- global.time[player]++;
+ m_time[player]++;
}
}
}
@@ -374,45 +314,33 @@ static void animate(running_machine &machine, screen_device &device, bool vblank
/*-------------------------------------------------
- crosshair_render - render the crosshairs
+ render - render the crosshairs
for the given screen
-------------------------------------------------*/
-void crosshair_render(screen_device &screen)
+void crosshair_manager::render(screen_device &screen)
{
int player;
for (player = 0; player < MAX_PLAYERS; player++)
/* draw if visible and the right screen */
- if (global.visible[player] &&
- ((global.screen[player] == &screen) || (global.screen[player] == CROSSHAIR_SCREEN_ALL)))
+ if (m_visible[player] &&
+ ((m_screen[player] == &screen) || (m_screen[player] == CROSSHAIR_SCREEN_ALL)))
{
/* add a quad assuming a 4:3 screen (this is not perfect) */
- screen.container().add_quad(global.x[player] - 0.03f, global.y[player] - 0.04f,
- global.x[player] + 0.03f, global.y[player] + 0.04f,
- rgb_t(0xc0, global.fade, global.fade, global.fade),
- global.texture[player], PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA));
+ screen.container().add_quad(m_x[player] - 0.03f, m_y[player] - 0.04f,
+ m_x[player] + 0.03f, m_y[player] + 0.04f,
+ rgb_t(0xc0, m_fade, m_fade, m_fade),
+ m_texture[player], PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA));
}
}
-
-/*-------------------------------------------------
- crosshair_set_screen - sets the screen(s) for a
- given player's crosshair
--------------------------------------------------*/
-
-void crosshair_set_screen(running_machine &machine, int player, screen_device *screen)
-{
- global.screen[player] = screen;
-}
-
-
/*-------------------------------------------------
- crosshair_load - read and apply data from the
+ config_load - read and apply data from the
configuration file
-------------------------------------------------*/
-static void crosshair_load(running_machine &machine, int config_type, xml_data_node *parentnode)
+void crosshair_manager::config_load(config_type cfg_type, xml_data_node *parentnode)
{
/* Note: crosshair_load() is only registered if croshairs are used */
@@ -420,7 +348,7 @@ static void crosshair_load(running_machine &machine, int config_type, xml_data_n
int auto_time;
/* we only care about game files */
- if (config_type != CONFIG_TYPE_GAME)
+ if (cfg_type != config_type::CONFIG_TYPE_GAME)
return;
/* might not have any data */
@@ -436,22 +364,22 @@ static void crosshair_load(running_machine &machine, int config_type, xml_data_n
/* check to make sure we have a valid player */
/* also check if the player really uses a crosshair */
- if (player >=0 && player < MAX_PLAYERS && global.used[player])
+ if (player >=0 && player < MAX_PLAYERS && m_used[player])
{
/* get, check, and store visibility mode */
mode = xml_get_attribute_int(crosshairnode, "mode", CROSSHAIR_VISIBILITY_DEFAULT);
if (mode >= CROSSHAIR_VISIBILITY_OFF && mode <= CROSSHAIR_VISIBILITY_AUTO)
{
- global.mode[player] = (UINT8)mode;
+ m_mode[player] = (UINT8)mode;
/* set visibility as specified by mode */
/* auto mode starts with visibility off */
- global.visible[player] = (mode == CROSSHAIR_VISIBILITY_ON) ? TRUE : FALSE;
+ m_visible[player] = (mode == CROSSHAIR_VISIBILITY_ON) ? TRUE : FALSE;
}
/* get and store crosshair pic name, truncate name to max length */
- strncpy(global.name[player], xml_get_attribute_string(crosshairnode, "pic", ""), CROSSHAIR_PIC_NAME_LENGTH);
+ strncpy(m_name[player], xml_get_attribute_string(crosshairnode, "pic", ""), CROSSHAIR_PIC_NAME_LENGTH);
/* update bitmap */
- create_bitmap(machine, player);
+ create_bitmap(player);
}
}
@@ -461,17 +389,17 @@ static void crosshair_load(running_machine &machine, int config_type, xml_data_n
{
auto_time = xml_get_attribute_int(crosshairnode, "val", CROSSHAIR_VISIBILITY_AUTOTIME_DEFAULT);
if ((auto_time >= CROSSHAIR_VISIBILITY_AUTOTIME_MIN) && (auto_time <= CROSSHAIR_VISIBILITY_AUTOTIME_MAX))
- global.auto_time = (UINT8)auto_time;
+ m_auto_time = (UINT8)auto_time;
}
}
/*-------------------------------------------------
- crosshair_save - save data to the
+ config_save - save data to the
configuration file
-------------------------------------------------*/
-static void crosshair_save(running_machine &machine, int config_type, xml_data_node *parentnode)
+void crosshair_manager::config_save(config_type cfg_type, xml_data_node *parentnode)
{
/* Note: crosshair_save() is only registered if crosshairs are used */
@@ -479,12 +407,12 @@ static void crosshair_save(running_machine &machine, int config_type, xml_data_n
int player;
/* we only care about game files */
- if (config_type != CONFIG_TYPE_GAME)
+ if (cfg_type != config_type::CONFIG_TYPE_GAME)
return;
for (player = 0; player < MAX_PLAYERS; player++)
{
- if (global.used[player])
+ if (m_used[player])
{
/* create a node */
crosshairnode = xml_add_child(parentnode, "crosshair", nullptr);
@@ -495,16 +423,16 @@ static void crosshair_save(running_machine &machine, int config_type, xml_data_n
xml_set_attribute_int(crosshairnode, "player", player);
- if (global.visible[player] != CROSSHAIR_VISIBILITY_DEFAULT)
+ if (m_visible[player] != CROSSHAIR_VISIBILITY_DEFAULT)
{
- xml_set_attribute_int(crosshairnode, "mode", global.mode[player]);
+ xml_set_attribute_int(crosshairnode, "mode", m_mode[player]);
changed = TRUE;
}
/* the default graphic name is "", so only save if not */
- if (*(global.name[player]) != 0)
+ if (*(m_name[player]) != 0)
{
- xml_set_attribute(crosshairnode, "pic", global.name[player]);
+ xml_set_attribute(crosshairnode, "pic", m_name[player]);
changed = TRUE;
}
@@ -516,13 +444,13 @@ static void crosshair_save(running_machine &machine, int config_type, xml_data_n
}
/* always store autotime so that it stays at the user value if it is needed */
- if (global.auto_time != CROSSHAIR_VISIBILITY_AUTOTIME_DEFAULT)
+ if (m_auto_time != CROSSHAIR_VISIBILITY_AUTOTIME_DEFAULT)
{
/* create a node */
crosshairnode = xml_add_child(parentnode, "autotime", nullptr);
if (crosshairnode != nullptr)
- xml_set_attribute_int(crosshairnode, "val", global.auto_time);
+ xml_set_attribute_int(crosshairnode, "val", m_auto_time);
}
}
diff --git a/src/emu/crsshair.h b/src/emu/crsshair.h
index 3f8643b797c..91becc37f58 100644
--- a/src/emu/crsshair.h
+++ b/src/emu/crsshair.h
@@ -50,28 +50,57 @@ struct crosshair_user_settings
};
+// ======================> crosshair_manager
-/***************************************************************************
- FUNCTION PROTOTYPES
-***************************************************************************/
-
-/* initializes the crosshair system */
-void crosshair_init(running_machine &machine);
-
-/* draws crosshair(s) in a given screen, if necessary */
-void crosshair_render(screen_device &screen);
-
-/* sets the screen(s) for a given player's crosshair */
-void crosshair_set_screen(running_machine &machine, int player, screen_device *screen);
-
-/* return TRUE if any crosshairs are used */
-int crosshair_get_usage(running_machine &machine);
-
-/* return the current crosshair settings for the given player */
-void crosshair_get_user_settings(running_machine &machine, UINT8 player, crosshair_user_settings *settings);
-
-/* modify the current crosshair settings for the given player */
-void crosshair_set_user_settings(running_machine &machine, UINT8 player, crosshair_user_settings *settings);
-
+class crosshair_manager
+{
+public:
+ // construction/destruction
+ crosshair_manager(running_machine &machine);
+
+ /* draws crosshair(s) in a given screen, if necessary */
+ void render(screen_device &screen);
+
+ /* sets the screen(s) for a given player's crosshair */
+ void set_screen(int player, screen_device *screen) { m_screen[player] = screen; }
+
+ /* return TRUE if any crosshairs are used */
+ int get_usage() { return m_usage; }
+
+ /* return the current crosshair settings for the given player */
+ void get_user_settings(UINT8 player, crosshair_user_settings *settings);
+
+ /* modify the current crosshair settings for the given player */
+ void set_user_settings(UINT8 player, crosshair_user_settings *settings);
+ // getters
+ running_machine &machine() const { return m_machine; }
+private:
+ void create_bitmap(int player);
+ void exit();
+ void animate(screen_device &device, bool vblank_state);
+
+ void config_load(config_type cfg_type, xml_data_node *parentnode);
+ void config_save(config_type cfg_type, xml_data_node *parentnode);
+
+ // internal state
+ running_machine & m_machine; // reference to our machine
+
+ UINT8 m_usage; /* true if any crosshairs are used */
+ UINT8 m_used[MAX_PLAYERS]; /* usage per player */
+ UINT8 m_mode[MAX_PLAYERS]; /* visibility mode per player */
+ UINT8 m_visible[MAX_PLAYERS]; /* visibility per player */
+ std::unique_ptr<bitmap_argb32> m_bitmap[MAX_PLAYERS]; /* bitmap per player */
+ render_texture * m_texture[MAX_PLAYERS]; /* texture per player */
+ screen_device * m_screen[MAX_PLAYERS]; /* the screen on which this player's crosshair is drawn */
+ float m_x[MAX_PLAYERS]; /* current X position */
+ float m_y[MAX_PLAYERS]; /* current Y position */
+ float m_last_x[MAX_PLAYERS]; /* last X position */
+ float m_last_y[MAX_PLAYERS]; /* last Y position */
+ UINT8 m_fade; /* color fading factor */
+ UINT8 m_animation_counter; /* animation frame index */
+ UINT16 m_auto_time; /* time in seconds to turn invisible */
+ UINT16 m_time[MAX_PLAYERS]; /* time since last movement */
+ char m_name[MAX_PLAYERS][CROSSHAIR_PIC_NAME_LENGTH + 1]; /* name of crosshair png file */
+};
#endif /* __CRSSHAIR_H__ */
diff --git a/src/emu/debug/debugcmd.cpp b/src/emu/debug/debugcmd.cpp
index 328079095c9..4558413b2c3 100644
--- a/src/emu/debug/debugcmd.cpp
+++ b/src/emu/debug/debugcmd.cpp
@@ -10,6 +10,7 @@
#include "emu.h"
#include "emuopts.h"
+#include "debugger.h"
#include "debugcmd.h"
#include "debugcon.h"
#include "debugcpu.h"
diff --git a/src/emu/debug/debugcon.cpp b/src/emu/debug/debugcon.cpp
index b35d4afc690..7bf80dd6118 100644
--- a/src/emu/debug/debugcon.cpp
+++ b/src/emu/debug/debugcon.cpp
@@ -385,7 +385,7 @@ CMDERR debug_console_execute_command(running_machine &machine, const char *comma
if (echo)
{
machine.debug_view().update_all();
- debugger_refresh_display(machine);
+ machine.debugger().refresh_display();
}
return result;
}
@@ -414,7 +414,7 @@ void debug_console_register_command(running_machine &machine, const char *comman
assert_always(machine.phase() == MACHINE_PHASE_INIT, "Can only call debug_console_register_command() at init time!");
assert_always((machine.debug_flags & DEBUG_FLAG_ENABLED) != 0, "Cannot call debug_console_register_command() when debugger is not running");
- cmd = auto_alloc_clear(machine, debug_command);
+ cmd = auto_alloc_clear(machine, <debug_command>());
/* fill in the command */
strcpy(cmd->command, command);
diff --git a/src/emu/debug/debugcon.h b/src/emu/debug/debugcon.h
index 6861530cdd5..7c688332ed4 100644
--- a/src/emu/debug/debugcon.h
+++ b/src/emu/debug/debugcon.h
@@ -18,8 +18,8 @@
CONSTANTS
***************************************************************************/
-#define MAX_COMMAND_LENGTH 512
-#define MAX_COMMAND_PARAMS 16
+#define MAX_COMMAND_LENGTH 4096
+#define MAX_COMMAND_PARAMS 128
/* flags for command parsing */
#define CMDFLAG_NONE (0x0000)
diff --git a/src/emu/debug/debugcpu.cpp b/src/emu/debug/debugcpu.cpp
index 3a95a823594..82c175251fe 100644
--- a/src/emu/debug/debugcpu.cpp
+++ b/src/emu/debug/debugcpu.cpp
@@ -116,7 +116,7 @@ void debug_cpu_init(running_machine &machine)
int regnum;
/* allocate and reset globals */
- machine.debugcpu_data = global = auto_alloc_clear(machine, debugcpu_private);
+ machine.debugcpu_data = global = auto_alloc_clear(machine, <debugcpu_private>());
global->execution_state = EXECUTION_STATE_STOPPED;
global->bpindex = 1;
global->wpindex = 1;
@@ -1690,8 +1690,6 @@ device_debug::device_debug(device_t &device)
device_debug::~device_debug()
{
- auto_free(m_device.machine(), m_trace);
-
// free breakpoints and watchpoints
breakpoint_clear_all();
watchpoint_clear_all();
@@ -1756,7 +1754,7 @@ void device_debug::start_hook(const attotime &endtime)
}
}
// check for debug keypresses
- if (ui_input_pressed(m_device.machine(), IPT_UI_DEBUG_BREAK))
+ if (m_device.machine().ui_input().pressed(IPT_UI_DEBUG_BREAK))
global->visiblecpu->debug()->halt_on_next_instruction("User-initiated break\n");
}
@@ -1873,7 +1871,7 @@ void device_debug::instruction_hook(offs_t curpc)
{
machine.debug_view().update_all();
machine.debug_view().flush_osd_updates();
- debugger_refresh_display(machine);
+ machine.debugger().refresh_display();
}
}
}
@@ -1921,7 +1919,7 @@ void device_debug::instruction_hook(offs_t curpc)
// update all views
machine.debug_view().update_all();
- debugger_refresh_display(m_device.machine());
+ machine.debugger().refresh_display();
// wait for the debugger; during this time, disable sound output
m_device.machine().sound().debugger_mute(true);
@@ -1940,7 +1938,7 @@ void device_debug::instruction_hook(offs_t curpc)
if (global->memory_modified)
{
machine.debug_view().update_all(DVT_DISASSEMBLY);
- debugger_refresh_display(m_device.machine());
+ machine.debugger().refresh_display();
}
// check for commands in the source file
@@ -2759,12 +2757,11 @@ UINT32 device_debug::compute_opcode_crc32(offs_t pc) const
void device_debug::trace(FILE *file, bool trace_over, const char *action)
{
// delete any existing tracers
- auto_free(m_device.machine(), m_trace);
m_trace = nullptr;
// if we have a new file, make a new tracer
if (file != nullptr)
- m_trace = auto_alloc(m_device.machine(), tracer(*this, *file, trace_over, action));
+ m_trace = std::make_unique<tracer>(*this, *file, trace_over, action);
}
diff --git a/src/emu/debug/debugcpu.h b/src/emu/debug/debugcpu.h
index 33c17253354..754411cb3f0 100644
--- a/src/emu/debug/debugcpu.h
+++ b/src/emu/debug/debugcpu.h
@@ -360,7 +360,7 @@ private:
// (0 = not tracing over,
// ~0 = not currently tracing over)
};
- tracer * m_trace; // tracer state
+ std::unique_ptr<tracer> m_trace; // tracer state
// hotspots
struct hotspot_entry
diff --git a/src/emu/debug/dvbpoints.cpp b/src/emu/debug/dvbpoints.cpp
index 919f352842f..efb604e385d 100644
--- a/src/emu/debug/dvbpoints.cpp
+++ b/src/emu/debug/dvbpoints.cpp
@@ -9,6 +9,7 @@
***************************************************************************/
#include "emu.h"
+#include "debugger.h"
#include "dvbpoints.h"
diff --git a/src/emu/debug/dvbpoints.h b/src/emu/debug/dvbpoints.h
index 1867dcf2b6f..cd9d0b8c22a 100644
--- a/src/emu/debug/dvbpoints.h
+++ b/src/emu/debug/dvbpoints.h
@@ -34,10 +34,6 @@ class debug_view_breakpoints : public debug_view
debug_view_breakpoints(running_machine &machine, debug_view_osd_update_func osdupdate, void *osdprivate);
virtual ~debug_view_breakpoints();
-public:
- // getters
- // setters
-
protected:
// view overrides
virtual void view_update() override;
diff --git a/src/emu/debug/dvdisasm.cpp b/src/emu/debug/dvdisasm.cpp
index e873b0be8bb..e8becd1954d 100644
--- a/src/emu/debug/dvdisasm.cpp
+++ b/src/emu/debug/dvdisasm.cpp
@@ -100,7 +100,8 @@ void debug_view_disasm::enumerate_sources()
for (device_disasm_interface *dasm = iter.first(); dasm != nullptr; dasm = iter.next())
{
strprintf(name,"%s '%s'", dasm->device().name(), dasm->device().tag());
- m_source_list.append(*global_alloc(debug_view_disasm_source(name.c_str(), dasm->device())));
+ if (dasm->device().memory().space_config(AS_PROGRAM)!=nullptr)
+ m_source_list.append(*global_alloc(debug_view_disasm_source(name.c_str(), dasm->device())));
}
// reset the source to a known good entry
diff --git a/src/emu/debug/dvmemory.cpp b/src/emu/debug/dvmemory.cpp
index 2327d7284cc..b792d002c27 100644
--- a/src/emu/debug/dvmemory.cpp
+++ b/src/emu/debug/dvmemory.cpp
@@ -315,7 +315,7 @@ void debug_view_memory::view_update()
UINT64 chunkdata = 0;
floatx80 chunkdata80 = { 0, 0 };
bool ismapped;
-
+
if (m_data_format != 11)
ismapped = read(m_bytes_per_chunk, addrbyte + chunknum * m_bytes_per_chunk, chunkdata);
else
diff --git a/src/emu/debug/dvmemory.h b/src/emu/debug/dvmemory.h
index afe597b8477..234bd0ed19b 100644
--- a/src/emu/debug/dvmemory.h
+++ b/src/emu/debug/dvmemory.h
@@ -103,11 +103,11 @@ private:
debug_view_expression m_expression; // expression describing the start address
UINT32 m_chunks_per_row; // number of chunks displayed per line
UINT8 m_bytes_per_chunk; // bytes per chunk
- int m_data_format; // 1-8 current values 9 32bit floating point
+ int m_data_format; // 1-8 current values 9 32bit floating point
bool m_reverse_view; // reverse-endian view?
bool m_ascii_view; // display ASCII characters?
bool m_no_translation; // don't run addresses through the cpu translation hook
- bool m_edit_enabled; // can modify contents ?
+ bool m_edit_enabled; // can modify contents ?
offs_t m_maxaddr; // (derived) maximum address to display
UINT32 m_bytes_per_row; // (derived) number of bytes displayed per line
UINT32 m_byte_offset; // (derived) offset of starting visible byte
diff --git a/src/emu/debug/dvstate.cpp b/src/emu/debug/dvstate.cpp
index dd3f3d33f9c..578b423725d 100644
--- a/src/emu/debug/dvstate.cpp
+++ b/src/emu/debug/dvstate.cpp
@@ -276,7 +276,7 @@ void debug_view_state::view_update()
if (m_last_update != total_cycles)
curitem->m_lastval = curitem->m_currval;
curitem->m_currval = source.m_stateintf->state_int(curitem->m_index);
- source.m_stateintf->state_string(curitem->m_index, valstr);
+ valstr = source.m_stateintf->state_string(curitem->m_index);
}
// see if we changed
diff --git a/src/emu/debugger.cpp b/src/emu/debugger.cpp
index b21e4ca779b..849b16d068d 100644
--- a/src/emu/debugger.cpp
+++ b/src/emu/debugger.cpp
@@ -16,108 +16,68 @@
#include "debug/debugvw.h"
#include <ctype.h>
-
-
-/***************************************************************************
- TYPE DEFINITIONS
-***************************************************************************/
-
-struct machine_entry
-{
- machine_entry * next;
- running_machine * machine;
-};
-
-
-
/***************************************************************************
GLOBAL VARIABLES
***************************************************************************/
-static machine_entry *machine_list;
-static int atexit_registered;
+static running_machine *g_machine = nullptr;
+static int g_atexit_registered = FALSE;
+//**************************************************************************
+// DEBUGGER MANAGER
+//**************************************************************************
+//-------------------------------------------------
+// debugger_manager - constructor
+//-------------------------------------------------
-/***************************************************************************
- FUNCTION PROTOTYPES
-***************************************************************************/
+debugger_manager::debugger_manager(running_machine &machine)
+ : m_machine(machine)
+{
+ /* initialize the submodules */
+ debug_cpu_init(machine);
+ debug_command_init(machine);
-static void debugger_exit(running_machine &machine);
+ g_machine = &machine;
+ /* register an atexit handler if we haven't yet */
+ if (!g_atexit_registered)
+ atexit(debugger_flush_all_traces_on_abnormal_exit);
+ g_atexit_registered = TRUE;
+ /* listen in on the errorlog */
+ machine.add_logerror_callback(debug_errorlog_write_line);
-/***************************************************************************
- CENTRAL INITIALIZATION POINT
-***************************************************************************/
+ /* initialize osd debugger features */
+ machine.osd().init_debugger();
+}
/*-------------------------------------------------
- debugger_init - start up all subsections
+// debugger_manager - destructor
-------------------------------------------------*/
-void debugger_init(running_machine &machine)
+debugger_manager::~debugger_manager()
+{
+ g_machine = nullptr;
+}
+
+void debugger_manager::initialize()
{
/* only if debugging is enabled */
- if (machine.debug_flags & DEBUG_FLAG_ENABLED)
+ if (machine().debug_flags & DEBUG_FLAG_ENABLED)
{
- machine_entry *entry;
-
- /* initialize the submodules */
- machine.m_debug_view.reset(global_alloc(debug_view_manager(machine)));
- debug_cpu_init(machine);
- debug_command_init(machine);
- debug_console_init(machine);
-
- /* allocate a new entry for our global list */
- machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(debugger_exit), &machine));
- entry = global_alloc(machine_entry);
- entry->next = machine_list;
- entry->machine = &machine;
- machine_list = entry;
-
- /* register an atexit handler if we haven't yet */
- if (!atexit_registered)
- atexit(debugger_flush_all_traces_on_abnormal_exit);
- atexit_registered = TRUE;
-
- /* listen in on the errorlog */
- machine.add_logerror_callback(debug_errorlog_write_line);
-
- /* initialize osd debugger features */
- machine.osd().init_debugger();
+ debug_console_init(machine());
}
}
-
/*-------------------------------------------------
- debugger_refresh_display - redraw the current
+ refresh_display - redraw the current
video display
-------------------------------------------------*/
-void debugger_refresh_display(running_machine &machine)
-{
- machine.video().frame_update(true);
-}
-
-
-/*-------------------------------------------------
- debugger_exit - remove ourself from the
- global list of active machines for cleanup
--------------------------------------------------*/
-
-static void debugger_exit(running_machine &machine)
+void debugger_manager::refresh_display()
{
- machine_entry **entryptr;
-
- /* remove this machine from the list; it came down cleanly */
- for (entryptr = &machine_list; *entryptr != nullptr; entryptr = &(*entryptr)->next)
- if ((*entryptr)->machine == &machine)
- {
- machine_entry *deleteme = *entryptr;
- *entryptr = deleteme->next;
- global_free(deleteme);
- break;
- }
+ machine().video().frame_update(true);
}
@@ -129,12 +89,8 @@ static void debugger_exit(running_machine &machine)
void debugger_flush_all_traces_on_abnormal_exit(void)
{
- /* clear out the machine list and flush traces on each one */
- while (machine_list != nullptr)
+ if(g_machine!=nullptr)
{
- machine_entry *deleteme = machine_list;
- debug_cpu_flush_traces(*deleteme->machine);
- machine_list = deleteme->next;
- global_free(deleteme);
+ debug_cpu_flush_traces(*g_machine);
}
}
diff --git a/src/emu/debugger.h b/src/emu/debugger.h
index bde3ad7572b..4efcc5c3de6 100644
--- a/src/emu/debugger.h
+++ b/src/emu/debugger.h
@@ -15,17 +15,31 @@
#include "debug/debugcpu.h"
-/***************************************************************************
- FUNCTION PROTOTYPES
-***************************************************************************/
+// ======================> debugger_manager
+
+class debugger_manager
+{
+public:
+ // construction/destruction
+ debugger_manager(running_machine &machine);
+ ~debugger_manager();
-/* ----- core debugger functions ----- */
+ void initialize();
-/* initialize the debugger */
-void debugger_init(running_machine &machine);
+ /* redraw the current video display */
+ void refresh_display();
-/* redraw the current video display */
-void debugger_refresh_display(running_machine &machine);
+ // getters
+ running_machine &machine() const { return m_machine; }
+private:
+ // internal state
+ running_machine & m_machine; // reference to our machine
+};
+
+
+/***************************************************************************
+ FUNCTION PROTOTYPES
+***************************************************************************/
/* OSD can call this to safely flush all traces in the event of a crash */
void debugger_flush_all_traces_on_abnormal_exit(void);
diff --git a/src/emu/devdelegate.h b/src/emu/devdelegate.h
index 531bea5bd44..b688cd31261 100644
--- a/src/emu/devdelegate.h
+++ b/src/emu/devdelegate.h
@@ -74,7 +74,10 @@ public:
device_delegate(const thistype &src, device_t &search_root) : basetype(src), device_delegate_helper(src.m_device_name) { bind_relative_to(search_root); }
// perform the binding
- void bind_relative_to(device_t &search_root) { if (!basetype::isnull()) basetype::late_bind(bound_object(search_root)); }
+ void bind_relative_to(device_t &search_root) { assert(&search_root != nullptr); if (!basetype::isnull()) basetype::late_bind(bound_object(search_root)); }
+
+ // getter (for validation purposes)
+ const char *device_name() const { return m_device_name; }
};
diff --git a/src/emu/devfind.h b/src/emu/devfind.h
index d3bc00711a4..00e859437ba 100644
--- a/src/emu/devfind.h
+++ b/src/emu/devfind.h
@@ -83,8 +83,9 @@ public:
virtual _ObjectClass *operator->() const { assert(m_target != nullptr); return m_target; }
- // getter for explicit fetching
+ // getters for explicit fetching
_ObjectClass *target() const { return m_target; }
+ bool found() const { return m_target != nullptr; }
// setter for setting the object
void set_target(_ObjectClass *target) { m_target = target; }
@@ -270,7 +271,7 @@ public:
{
for (int index = 0; index < _Count; index++)
{
- strformat(m_tag[index], "%s.%d", basetag, index);
+ strprintf(m_tag[index], "%s.%d", basetag, index);
m_array[index] = std::make_unique<ioport_finder_type>(base, m_tag[index].c_str());
}
}
@@ -441,7 +442,7 @@ public:
{
for (int index = 0; index < _Count; index++)
{
- strformat(m_tag[index],"%s.%d", basetag, index);
+ strprintf(m_tag[index],"%s.%d", basetag, index);
m_array[index] = std::make_unique<shared_ptr_type>(base, m_tag[index].c_str(), width);
}
}
diff --git a/src/emu/device.cpp b/src/emu/device.cpp
index 8400d87ddbd..7af78e6a3f5 100644
--- a/src/emu/device.cpp
+++ b/src/emu/device.cpp
@@ -84,10 +84,6 @@ device_t::~device_t()
memory_region *device_t::memregion(const char *_tag) const
{
- // safety first
- if (this == nullptr)
- return nullptr;
-
// build a fully-qualified name and look it up
return machine().memory().region(subtag(_tag).c_str());
}
@@ -100,10 +96,6 @@ memory_region *device_t::memregion(const char *_tag) const
memory_share *device_t::memshare(const char *_tag) const
{
- // safety first
- if (this == nullptr)
- return nullptr;
-
// build a fully-qualified name and look it up
return machine().memory().shared(subtag(_tag).c_str());
}
@@ -116,10 +108,6 @@ memory_share *device_t::memshare(const char *_tag) const
memory_bank *device_t::membank(const char *_tag) const
{
- // safety first
- if (this == nullptr)
- return nullptr;
-
// build a fully-qualified name and look it up
return machine().memory().bank(subtag(_tag).c_str());
}
@@ -132,10 +120,6 @@ memory_bank *device_t::membank(const char *_tag) const
ioport_port *device_t::ioport(const char *tag) const
{
- // safety first
- if (this == nullptr)
- return nullptr;
-
// build a fully-qualified name and look it up
return machine().ioport().port(subtag(tag).c_str());
}
@@ -148,10 +132,6 @@ ioport_port *device_t::ioport(const char *tag) const
std::string device_t::parameter(const char *tag) const
{
- // safety first
- if (this == nullptr)
- return nullptr;
-
// build a fully-qualified name and look it up
return machine().parameters().lookup(subtag(tag));
}
diff --git a/src/emu/device.h b/src/emu/device.h
index fec1654c72d..2b807d58d94 100644
--- a/src/emu/device.h
+++ b/src/emu/device.h
@@ -79,7 +79,7 @@ typedef device_t *(*device_type)(const machine_config &mconfig, const char *tag,
template<class _DeviceClass>
device_t *device_creator(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
{
- return global_alloc(_DeviceClass(mconfig, tag, owner, clock));
+ return global_alloc_clear<_DeviceClass>(mconfig, tag, owner, clock);
}
@@ -151,7 +151,7 @@ public:
// owned object helpers
device_t *first_subdevice() const { return m_subdevice_list.first(); }
std::string subtag(const char *tag) const;
- std::string siblingtag(const char *tag) const { return (this != nullptr && m_owner != nullptr) ? m_owner->subtag(tag) : std::string(tag); }
+ std::string siblingtag(const char *tag) const { return (m_owner != nullptr) ? m_owner->subtag(tag) : std::string(tag); }
memory_region *memregion(const char *tag) const;
memory_share *memshare(const char *tag) const;
memory_bank *membank(const char *tag) const;
@@ -589,10 +589,6 @@ private:
inline device_t *device_t::subdevice(const char *tag) const
{
- // safety first
- if (this == nullptr)
- return nullptr;
-
// empty string or NULL means this device
if (tag == nullptr || *tag == 0)
return const_cast<device_t *>(this);
@@ -610,10 +606,6 @@ inline device_t *device_t::subdevice(const char *tag) const
inline device_t *device_t::siblingdevice(const char *tag) const
{
- // safety first
- if (this == nullptr)
- return nullptr;
-
// empty string or NULL means this device
if (tag == nullptr || *tag == 0)
return const_cast<device_t *>(this);
diff --git a/src/emu/digfx.cpp b/src/emu/digfx.cpp
index bed430e64f0..d3763c9d82e 100644
--- a/src/emu/digfx.cpp
+++ b/src/emu/digfx.cpp
@@ -276,7 +276,7 @@ void device_gfx_interface::decode_gfx(const gfx_decode_entry *gfxdecodeinfo)
}
// allocate the graphics
- m_gfx[curgfx] = std::make_unique<gfx_element>(m_palette, glcopy, (region_base != nullptr) ? region_base + gfx.start : nullptr, xormask, gfx.total_color_codes, gfx.color_codes_start);
+ m_gfx[curgfx] = std::make_unique<gfx_element>(*m_palette, glcopy, (region_base != nullptr) ? region_base + gfx.start : nullptr, xormask, gfx.total_color_codes, gfx.color_codes_start);
}
m_decoded = true;
diff --git a/src/emu/digfx.h b/src/emu/digfx.h
index 3dfe042f3f1..ec13147e966 100644
--- a/src/emu/digfx.h
+++ b/src/emu/digfx.h
@@ -199,14 +199,14 @@ public:
static void static_set_palette(device_t &device, const char *tag);
// getters
- palette_device *palette() const { return m_palette; }
+ palette_device &palette() const { return *m_palette; }
gfx_element *gfx(int index) const { assert(index < MAX_GFX_ELEMENTS); return m_gfx[index].get(); }
// decoding
void decode_gfx(const gfx_decode_entry *gfxdecodeinfo);
void decode_gfx() { decode_gfx(m_gfxdecodeinfo); }
- void set_gfx(int index, gfx_element *element) { assert(index < MAX_GFX_ELEMENTS); m_gfx[index].reset(element); }
+ void set_gfx(int index, std::unique_ptr<gfx_element> &&element) { assert(index < MAX_GFX_ELEMENTS); m_gfx[index] = std::move(element); }
protected:
// interface-level overrides
@@ -214,10 +214,10 @@ protected:
virtual void interface_pre_start() override;
virtual void interface_post_start() override;
+private:
palette_device * m_palette; // pointer to the palette device
std::unique_ptr<gfx_element> m_gfx[MAX_GFX_ELEMENTS]; // array of pointers to graphic sets
-private:
// configuration
const gfx_decode_entry * m_gfxdecodeinfo; // pointer to array of gfx decode information
const char * m_palette_tag; // configured tag for palette device
diff --git a/src/emu/diimage.cpp b/src/emu/diimage.cpp
index c0104da34e2..392da316dbb 100644
--- a/src/emu/diimage.cpp
+++ b/src/emu/diimage.cpp
@@ -17,6 +17,7 @@
#include "ui/imgcntrl.h"
#include "softlist.h"
#include "image.h"
+#include "formats/ioprocs.h"
//**************************************************************************
// DEVICE CONFIG IMAGE INTERFACE
@@ -378,7 +379,8 @@ UINT8 *device_image_interface::get_software_region(const char *tag)
return nullptr;
sprintf( full_tag, "%s:%s", device().tag(), tag );
- return device().machine().root_device().memregion( full_tag )->base();
+ memory_region *region = device().machine().root_device().memregion(full_tag);
+ return region != NULL ? region->base() : NULL;
}
@@ -391,7 +393,9 @@ UINT32 device_image_interface::get_software_region_length(const char *tag)
char full_tag[256];
sprintf( full_tag, "%s:%s", device().tag(), tag );
- return device().machine().root_device().memregion( full_tag )->bytes();
+
+ memory_region *region = device().machine().root_device().memregion(full_tag);
+ return region != NULL ? region->bytes() : 0;
}
@@ -508,14 +512,39 @@ UINT32 device_image_interface::crc()
-------------------------------------------------*/
void device_image_interface::battery_load(void *buffer, int length, int fill)
{
+ assert_always(buffer && (length > 0), "Must specify sensical buffer/length");
+
+ file_error filerr;
+ int bytes_read = 0;
std::string fname = std::string(device().machine().system().name).append(PATH_SEPARATOR).append(m_basename_noext.c_str()).append(".nv");
- image_battery_load_by_name(device().machine().options(), fname.c_str(), buffer, length, fill);
+
+ /* try to open the battery file and read it in, if possible */
+ emu_file file(device().machine().options().nvram_directory(), OPEN_FLAG_READ);
+ filerr = file.open(fname.c_str());
+ if (filerr == FILERR_NONE)
+ bytes_read = file.read(buffer, length);
+
+ /* fill remaining bytes (if necessary) */
+ memset(((char *)buffer) + bytes_read, fill, length - bytes_read);
}
void device_image_interface::battery_load(void *buffer, int length, void *def_buffer)
{
+ assert_always(buffer && (length > 0), "Must specify sensical buffer/length");
+
+ file_error filerr;
+ int bytes_read = 0;
std::string fname = std::string(device().machine().system().name).append(PATH_SEPARATOR).append(m_basename_noext.c_str()).append(".nv");
- image_battery_load_by_name(device().machine().options(), fname.c_str(), buffer, length, def_buffer);
+
+ /* try to open the battery file and read it in, if possible */
+ emu_file file(device().machine().options().nvram_directory(), OPEN_FLAG_READ);
+ filerr = file.open(fname.c_str());
+ if (filerr == FILERR_NONE)
+ bytes_read = file.read(buffer, length);
+
+ /* if no file was present, copy the default battery */
+ if (bytes_read == 0 && def_buffer)
+ memcpy((char *)buffer, (char *)def_buffer, length);
}
/*-------------------------------------------------
@@ -526,9 +555,14 @@ void device_image_interface::battery_load(void *buffer, int length, void *def_bu
-------------------------------------------------*/
void device_image_interface::battery_save(const void *buffer, int length)
{
+ assert_always(buffer && (length > 0), "Must specify sensical buffer/length");
std::string fname = std::string(device().machine().system().name).append(PATH_SEPARATOR).append(m_basename_noext.c_str()).append(".nv");
- image_battery_save_by_name(device().machine().options(), fname.c_str(), buffer, length);
+ /* try to open the battery file and write it out, if possible */
+ emu_file file(device().machine().options().nvram_directory(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
+ file_error filerr = file.open(fname.c_str());
+ if (filerr == FILERR_NONE)
+ file.write(buffer, length);
}
//-------------------------------------------------
@@ -711,9 +745,8 @@ void device_image_interface::determine_open_plan(int is_create, UINT32 *open_pla
static void dump_wrong_and_correct_checksums(const hash_collection &hashes, const hash_collection &acthashes)
{
- std::string tempstr;
- osd_printf_error(" EXPECTED: %s\n", hashes.macro_string(tempstr));
- osd_printf_error(" FOUND: %s\n", acthashes.macro_string(tempstr));
+ osd_printf_error(" EXPECTED: %s\n", hashes.macro_string().c_str());
+ osd_printf_error(" FOUND: %s\n", acthashes.macro_string().c_str());
}
/*-------------------------------------------------
@@ -735,8 +768,7 @@ static int verify_length_and_hash(emu_file *file, const char *name, UINT32 exple
}
/* If there is no good dump known, write it */
- std::string tempstr;
- hash_collection &acthashes = file->hashes(hashes.hash_types(tempstr));
+ hash_collection &acthashes = file->hashes(hashes.hash_types().c_str());
if (hashes.flag(hash_collection::FLAG_NO_DUMP))
{
osd_printf_error("%s NO GOOD DUMP KNOWN\n", name);
@@ -832,18 +864,18 @@ bool device_image_interface::load_software(software_list_device &swlist, const c
// - if we are using lists, we have: list/clonename, list/parentname, clonename, parentname
// try to load from list/setname
if ((m_mame_file == nullptr) && (tag2.c_str() != nullptr))
- filerr = common_process_file(device().machine().options(), tag2.c_str(), has_crc, crc, romp, &m_mame_file);
+ m_mame_file = common_process_file(device().machine().options(), tag2.c_str(), has_crc, crc, romp, filerr);
// try to load from list/parentname
if ((m_mame_file == nullptr) && (tag3.c_str() != nullptr))
- filerr = common_process_file(device().machine().options(), tag3.c_str(), has_crc, crc, romp, &m_mame_file);
+ m_mame_file = common_process_file(device().machine().options(), tag3.c_str(), has_crc, crc, romp, filerr);
// try to load from setname
if ((m_mame_file == nullptr) && (tag4.c_str() != nullptr))
- filerr = common_process_file(device().machine().options(), tag4.c_str(), has_crc, crc, romp, &m_mame_file);
+ m_mame_file = common_process_file(device().machine().options(), tag4.c_str(), has_crc, crc, romp, filerr);
// try to load from parentname
if ((m_mame_file == nullptr) && (tag5.c_str() != nullptr))
- filerr = common_process_file(device().machine().options(), tag5.c_str(), has_crc, crc, romp, &m_mame_file);
+ m_mame_file = common_process_file(device().machine().options(), tag5.c_str(), has_crc, crc, romp, filerr);
- warningcount += verify_length_and_hash(m_mame_file,ROM_GETNAME(romp),ROM_GETLENGTH(romp),hash_collection(ROM_GETHASHDATA(romp)));
+ warningcount += verify_length_and_hash(m_mame_file.get(),ROM_GETNAME(romp),ROM_GETLENGTH(romp),hash_collection(ROM_GETHASHDATA(romp)));
if (filerr == FILERR_NONE)
{
@@ -1090,7 +1122,6 @@ void device_image_interface::clear()
{
if (m_mame_file)
{
- global_free(m_mame_file);
m_mame_file = nullptr;
m_file = nullptr;
} else {
@@ -1209,7 +1240,7 @@ void device_image_interface::software_name_split(const char *swlist_swname, std:
}
-software_part *device_image_interface::find_software_item(const char *path, bool restrict_to_interface)
+software_part *device_image_interface::find_software_item(const char *path, bool restrict_to_interface) const
{
// split full software name into software list name and short software name
std::string swlist_name, swinfo_name, swpart_name;
@@ -1307,7 +1338,7 @@ bool device_image_interface::load_software_part(const char *path, software_part
{
const char *option = device().mconfig().options().value(req_image->brief_instance_name());
// mount only if not already mounted
- if (strlen(option) == 0 && !req_image->filename())
+ if (*option == '\0' && !req_image->filename())
{
req_image->set_init_phase();
req_image->load(requirement);
@@ -1325,11 +1356,11 @@ bool device_image_interface::load_software_part(const char *path, software_part
// software_get_default_slot
//-------------------------------------------------
-void device_image_interface::software_get_default_slot(std::string &result, const char *default_card_slot)
+std::string device_image_interface::software_get_default_slot(const char *default_card_slot) const
{
const char *path = device().mconfig().options().value(instance_name());
- result.clear();
- if (strlen(path) > 0)
+ std::string result;
+ if (*path != '\0')
{
result.assign(default_card_slot);
software_part *swpart = find_software_item(path, true);
@@ -1340,6 +1371,7 @@ void device_image_interface::software_get_default_slot(std::string &result, cons
result.assign(slot);
}
}
+ return result;
}
/*-------------------------------------------------
@@ -1349,5 +1381,42 @@ void device_image_interface::software_get_default_slot(std::string &result, cons
ui_menu *device_image_interface::get_selection_menu(running_machine &machine, render_container *container)
{
- return auto_alloc_clear(machine, ui_menu_control_device_image(machine, container, this));
+ return auto_alloc_clear(machine, <ui_menu_control_device_image>(machine, container, this));
+}
+
+/* ----------------------------------------------------------------------- */
+
+static int image_fseek_thunk(void *file, INT64 offset, int whence)
+{
+ device_image_interface *image = (device_image_interface *) file;
+ return image->fseek(offset, whence);
+}
+
+static size_t image_fread_thunk(void *file, void *buffer, size_t length)
+{
+ device_image_interface *image = (device_image_interface *) file;
+ return image->fread(buffer, length);
+}
+
+static size_t image_fwrite_thunk(void *file, const void *buffer, size_t length)
+{
+ device_image_interface *image = (device_image_interface *) file;
+ return image->fwrite(buffer, length);
}
+
+static UINT64 image_fsize_thunk(void *file)
+{
+ device_image_interface *image = (device_image_interface *) file;
+ return image->length();
+}
+
+/* ----------------------------------------------------------------------- */
+
+struct io_procs image_ioprocs =
+{
+ nullptr,
+ image_fseek_thunk,
+ image_fread_thunk,
+ image_fwrite_thunk,
+ image_fsize_thunk
+};
diff --git a/src/emu/diimage.h b/src/emu/diimage.h
index e699194fd6c..b1a8a16ad70 100644
--- a/src/emu/diimage.h
+++ b/src/emu/diimage.h
@@ -21,6 +21,8 @@
// TYPE DEFINITIONS
//**************************************************************************
+extern struct io_procs image_ioprocs;
+
class software_list;
enum iodevice_t
@@ -257,9 +259,9 @@ protected:
void image_checkhash();
void update_names(const device_type device_type = nullptr, const char *inst = nullptr, const char *brief = nullptr);
- software_part *find_software_item(const char *path, bool restrict_to_interface);
+ software_part *find_software_item(const char *path, bool restrict_to_interface) const;
bool load_software_part(const char *path, software_part *&swpart);
- void software_get_default_slot(std::string &result, const char *default_card_slot);
+ std::string software_get_default_slot(const char *default_card_slot) const;
// derived class overrides
@@ -273,7 +275,7 @@ protected:
/* variables that are only non-zero when an image is mounted */
core_file *m_file;
- emu_file *m_mame_file;
+ std::unique_ptr<emu_file> m_mame_file;
std::string m_image_name;
std::string m_basename;
std::string m_basename_noext;
diff --git a/src/emu/dimemory.cpp b/src/emu/dimemory.cpp
index 0650ebfab70..b245d51a0b9 100644
--- a/src/emu/dimemory.cpp
+++ b/src/emu/dimemory.cpp
@@ -13,14 +13,6 @@
//**************************************************************************
-// PARAMETERS
-//**************************************************************************
-
-#define DETECT_OVERLAPPING_MEMORY (0)
-
-
-
-//**************************************************************************
// CONSTANTS
//**************************************************************************
@@ -238,127 +230,16 @@ bool device_memory_interface::memory_readop(offs_t offset, int size, UINT64 &val
void device_memory_interface::interface_validity_check(validity_checker &valid) const
{
- bool detected_overlap = DETECT_OVERLAPPING_MEMORY ? false : true;
-
// loop over all address spaces
for (address_spacenum spacenum = AS_0; spacenum < ADDRESS_SPACES; ++spacenum)
{
- const address_space_config *spaceconfig = space_config(spacenum);
- if (spaceconfig != nullptr)
+ if (space_config(spacenum) != nullptr)
{
- int datawidth = spaceconfig->m_databus_width;
- int alignunit = datawidth / 8;
-
- // construct the maps
- auto map = global_alloc(::address_map(const_cast<device_t &>(device()), spacenum));
-
- // if this is an empty map, just skip it
- if (map->m_entrylist.first() == nullptr)
- {
- global_free(map);
- continue;
- }
-
- // validate the global map parameters
- if (map->m_spacenum != spacenum)
- osd_printf_error("Space %d has address space %d handlers!\n", spacenum, map->m_spacenum);
- if (map->m_databits != datawidth)
- osd_printf_error("Wrong memory handlers provided for %s space! (width = %d, memory = %08x)\n", spaceconfig->m_name, datawidth, map->m_databits);
-
- // loop over entries and look for errors
- for (address_map_entry *entry = map->m_entrylist.first(); entry != nullptr; entry = entry->next())
- {
- UINT32 bytestart = spaceconfig->addr2byte(entry->m_addrstart);
- UINT32 byteend = spaceconfig->addr2byte_end(entry->m_addrend);
-
- // look for overlapping entries
- if (!detected_overlap)
- {
- address_map_entry *scan;
- for (scan = map->m_entrylist.first(); scan != entry; scan = scan->next())
- if (entry->m_addrstart <= scan->m_addrend && entry->m_addrend >= scan->m_addrstart &&
- ((entry->m_read.m_type != AMH_NONE && scan->m_read.m_type != AMH_NONE) ||
- (entry->m_write.m_type != AMH_NONE && scan->m_write.m_type != AMH_NONE)))
- {
- osd_printf_warning("%s space has overlapping memory (%X-%X,%d,%d) vs (%X-%X,%d,%d)\n", spaceconfig->m_name, entry->m_addrstart, entry->m_addrend, entry->m_read.m_type, entry->m_write.m_type, scan->m_addrstart, scan->m_addrend, scan->m_read.m_type, scan->m_write.m_type);
- detected_overlap = true;
- break;
- }
- }
-
- // look for inverted start/end pairs
- if (byteend < bytestart)
- osd_printf_error("Wrong %s memory read handler start = %08x > end = %08x\n", spaceconfig->m_name, entry->m_addrstart, entry->m_addrend);
-
- // look for misaligned entries
- if ((bytestart & (alignunit - 1)) != 0 || (byteend & (alignunit - 1)) != (alignunit - 1))
- osd_printf_error("Wrong %s memory read handler start = %08x, end = %08x ALIGN = %d\n", spaceconfig->m_name, entry->m_addrstart, entry->m_addrend, alignunit);
-
- // if this is a program space, auto-assign implicit ROM entries
- if (entry->m_read.m_type == AMH_ROM && entry->m_region == nullptr)
- {
- entry->m_region = device().tag();
- entry->m_rgnoffs = entry->m_addrstart;
- }
-
- // if this entry references a memory region, validate it
- if (entry->m_region != nullptr && entry->m_share == nullptr)
- {
- // make sure we can resolve the full path to the region
- bool found = false;
- std::string entry_region = entry->m_devbase.subtag(entry->m_region);
-
- // look for the region
- device_iterator deviter(device().mconfig().root_device());
- for (device_t *device = deviter.first(); device != nullptr; device = deviter.next())
- for (const rom_entry *romp = rom_first_region(*device); romp != nullptr && !found; romp = rom_next_region(romp))
- {
- if (rom_region_name(*device, romp) == entry_region)
- {
- // verify the address range is within the region's bounds
- offs_t length = ROMREGION_GETLENGTH(romp);
- if (entry->m_rgnoffs + (byteend - bytestart + 1) > length)
- osd_printf_error("%s space memory map entry %X-%X extends beyond region '%s' size (%X)\n", spaceconfig->m_name, entry->m_addrstart, entry->m_addrend, entry->m_region, length);
- found = true;
- }
- }
-
- // error if not found
- if (!found)
- osd_printf_error("%s space memory map entry %X-%X references non-existant region '%s'\n", spaceconfig->m_name, entry->m_addrstart, entry->m_addrend, entry->m_region);
- }
-
- // make sure all devices exist
- // FIXME: This doesn't work! AMH_DEVICE_DELEGATE entries don't even set m_tag, the device tag is inside the proto-delegate
- if (entry->m_read.m_type == AMH_DEVICE_DELEGATE && entry->m_read.m_tag != nullptr)
- {
- std::string temp(entry->m_read.m_tag);
- if (device().siblingdevice(temp.c_str()) == nullptr)
- osd_printf_error("%s space memory map entry references nonexistant device '%s'\n", spaceconfig->m_name, entry->m_read.m_tag);
- }
- if (entry->m_write.m_type == AMH_DEVICE_DELEGATE && entry->m_write.m_tag != nullptr)
- {
- std::string temp(entry->m_write.m_tag);
- if (device().siblingdevice(temp.c_str()) == nullptr)
- osd_printf_error("%s space memory map entry references nonexistant device '%s'\n", spaceconfig->m_name, entry->m_write.m_tag);
- }
-
- // make sure ports exist
-// if ((entry->m_read.m_type == AMH_PORT && entry->m_read.m_tag != NULL && portlist.find(entry->m_read.m_tag) == NULL) ||
-// (entry->m_write.m_type == AMH_PORT && entry->m_write.m_tag != NULL && portlist.find(entry->m_write.m_tag) == NULL))
-// osd_printf_error("%s space memory map entry references nonexistant port tag '%s'\n", spaceconfig->m_name, entry->m_read.m_tag);
-
- // validate bank and share tags
- if (entry->m_read.m_type == AMH_BANK)
- valid.validate_tag(entry->m_read.m_tag);
- if (entry->m_write.m_type == AMH_BANK)
- valid.validate_tag(entry->m_write.m_tag);
- if (entry->m_share != nullptr)
- valid.validate_tag(entry->m_share);
- }
-
- // release the address map
- global_free(map);
+ // construct the map
+ ::address_map addrmap(const_cast<device_t &>(device()), spacenum);
+
+ // let the map check itself
+ addrmap.map_validity_check(valid, device(), spacenum);
}
}
}
diff --git a/src/emu/dioutput.cpp b/src/emu/dioutput.cpp
index 32e1338d091..176b5c8efc5 100644
--- a/src/emu/dioutput.cpp
+++ b/src/emu/dioutput.cpp
@@ -38,7 +38,7 @@ device_output_interface::~device_output_interface()
void device_output_interface::set_output_value(int value) const
{
if (m_output_name)
- output_set_value(m_output_name, value);
+ device().machine().output().set_value(m_output_name, value);
else
fatalerror("Output name not set!");
}
@@ -46,23 +46,23 @@ void device_output_interface::set_output_value(int value) const
void device_output_interface::set_led_value(int value) const
{
if (m_output_name)
- output_set_value(m_output_name, value);
+ device().machine().output().set_value(m_output_name, value);
else
- output_set_led_value(m_output_index, value);
+ device().machine().output().set_led_value(m_output_index, value);
}
void device_output_interface::set_lamp_value(int value) const
{
if (m_output_name)
- output_set_value(m_output_name, value);
+ device().machine().output().set_value(m_output_name, value);
else
- output_set_lamp_value(m_output_index, value);
+ device().machine().output().set_lamp_value(m_output_index, value);
}
void device_output_interface::set_digit_value(int value) const
{
if (m_output_name)
- output_set_value(m_output_name, value);
+ device().machine().output().set_value(m_output_name, value);
else
- output_set_digit_value(m_output_index, value);
+ device().machine().output().set_digit_value(m_output_index, value);
}
diff --git a/src/emu/dislot.cpp b/src/emu/dislot.cpp
index 697eb673a9f..051dc33bdb2 100644
--- a/src/emu/dislot.cpp
+++ b/src/emu/dislot.cpp
@@ -63,17 +63,15 @@ device_slot_option *device_slot_interface::static_option(device_t &device, const
device_t* device_slot_interface::get_card_device()
{
- const char *subtag;
+ std::string subtag;
device_t *dev = nullptr;
- std::string temp;
- if (!device().mconfig().options().exists(device().tag()+1)) {
- subtag = m_default_option;
- } else {
- subtag = device().mconfig().options().main_value(temp,device().tag()+1);
- }
- if (subtag && *subtag != 0) {
+ if (device().mconfig().options().exists(device().tag()+1))
+ subtag = device().mconfig().options().main_value(device().tag()+1);
+ else if (m_default_option != nullptr)
+ subtag.assign(m_default_option);
+ if (!subtag.empty()) {
device_slot_card_interface *intf = nullptr;
- dev = device().subdevice(subtag);
+ dev = device().subdevice(subtag.c_str());
if (dev!=nullptr && !dev->interface(intf))
throw emu_fatalerror("get_card_device called for device '%s' with no slot card interface", dev->tag());
}
diff --git a/src/emu/dislot.h b/src/emu/dislot.h
index 3c89b1350d3..573d8fa2221 100644
--- a/src/emu/dislot.h
+++ b/src/emu/dislot.h
@@ -116,7 +116,7 @@ public:
const char *default_option() const { return m_default_option; }
device_slot_option *first_option() const { return m_options.first(); }
device_slot_option *option(const char *name) const { if (name) return m_options.find(name); return nullptr; }
- virtual void get_default_card_software(std::string &result) { result.clear(); }
+ virtual std::string get_default_card_software() { return std::string(); }
device_t *get_card_device();
private:
diff --git a/src/emu/distate.cpp b/src/emu/distate.cpp
index 77ed3307946..9986b261e93 100644
--- a/src/emu/distate.cpp
+++ b/src/emu/distate.cpp
@@ -113,8 +113,7 @@ device_state_entry &device_state_entry::formatstr(const char *_format)
// set the DSF_CUSTOM_STRING flag by formatting with a NULL string
m_flags &= ~DSF_CUSTOM_STRING;
- std::string dummy;
- format(dummy, nullptr);
+ format(nullptr);
return *this;
}
@@ -164,8 +163,9 @@ UINT64 device_state_entry::value() const
// pieces of indexed state as a string
//-------------------------------------------------
-std::string &device_state_entry::format(std::string &dest, const char *string, bool maxout) const
+std::string device_state_entry::format(const char *string, bool maxout) const
{
+ std::string dest;
UINT64 result = value();
// parse the format
@@ -436,12 +436,12 @@ UINT64 device_state_interface::state_int(int index)
// pieces of indexed state as a string
//-------------------------------------------------
-std::string &device_state_interface::state_string(int index, std::string &dest)
+std::string device_state_interface::state_string(int index) const
{
// NULL or out-of-range entry returns bogus string
const device_state_entry *entry = state_find_entry(index);
if (entry == nullptr)
- return dest.assign("???");
+ return std::string("???");
// get the custom string if needed
std::string custom;
@@ -449,7 +449,7 @@ std::string &device_state_interface::state_string(int index, std::string &dest)
state_string_export(*entry, custom);
// ask the entry to format itself
- return entry->format(dest, custom.c_str());
+ return entry->format(custom.c_str());
}
@@ -466,8 +466,7 @@ int device_state_interface::state_string_max_length(int index)
return 3;
// ask the entry to format itself maximally
- std::string tempstring;
- return entry->format(tempstring, "", true).length();
+ return entry->format("", true).length();
}
@@ -591,7 +590,7 @@ void device_state_interface::state_string_import(const device_state_entry &entry
// written to perform any post-processing
//-------------------------------------------------
-void device_state_interface::state_string_export(const device_state_entry &entry, std::string &str)
+void device_state_interface::state_string_export(const device_state_entry &entry, std::string &str) const
{
// do nothing by default
}
@@ -615,7 +614,7 @@ void device_state_interface::interface_post_start()
// state entry for the given index
//-------------------------------------------------
-const device_state_entry *device_state_interface::state_find_entry(int index)
+const device_state_entry *device_state_interface::state_find_entry(int index) const
{
// use fast lookup if possible
if (index >= FAST_STATE_MIN && index <= FAST_STATE_MAX)
diff --git a/src/emu/distate.h b/src/emu/distate.h
index f762bd9fb13..67734fefa4b 100644
--- a/src/emu/distate.h
+++ b/src/emu/distate.h
@@ -87,7 +87,7 @@ protected:
// return the current value -- only for our friends who handle export
bool needs_export() const { return ((m_flags & DSF_EXPORT) != 0); }
UINT64 value() const;
- std::string &format(std::string &dest, const char *string, bool maxout = false) const;
+ std::string format(const char *string, bool maxout = false) const;
// set the current value -- only for our friends who handle import
bool needs_import() const { return ((m_flags & DSF_IMPORT) != 0); }
@@ -128,7 +128,7 @@ public:
// state getters
UINT64 state_int(int index);
- std::string &state_string(int index, std::string &dest);
+ std::string state_string(int index) const;
int state_string_max_length(int index);
offs_t pc() { return state_int(STATE_GENPC); }
offs_t pcbase() { return state_int(STATE_GENPCBASE); }
@@ -163,13 +163,13 @@ protected:
virtual void state_import(const device_state_entry &entry);
virtual void state_export(const device_state_entry &entry);
virtual void state_string_import(const device_state_entry &entry, std::string &str);
- virtual void state_string_export(const device_state_entry &entry, std::string &str);
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const;
// internal operation overrides
virtual void interface_post_start() override;
// find the entry for a given index
- const device_state_entry *state_find_entry(int index);
+ const device_state_entry *state_find_entry(int index) const;
// constants
static const int FAST_STATE_MIN = -4; // range for fast state
diff --git a/src/emu/drawgfx.cpp b/src/emu/drawgfx.cpp
index 2da798bfa97..30bde314664 100644
--- a/src/emu/drawgfx.cpp
+++ b/src/emu/drawgfx.cpp
@@ -43,7 +43,7 @@ static inline int readbit(const UINT8 *src, unsigned int bitnum)
than the width
-------------------------------------------------*/
-static inline INT32 normalize_xscroll(bitmap_t &bitmap, INT32 xscroll)
+static inline INT32 normalize_xscroll(const bitmap_t &bitmap, INT32 xscroll)
{
return (xscroll >= 0) ? xscroll % bitmap.width() : (bitmap.width() - (-xscroll) % bitmap.width());
}
@@ -55,7 +55,7 @@ static inline INT32 normalize_xscroll(bitmap_t &bitmap, INT32 xscroll)
than the height
-------------------------------------------------*/
-static inline INT32 normalize_yscroll(bitmap_t &bitmap, INT32 yscroll)
+static inline INT32 normalize_yscroll(const bitmap_t &bitmap, INT32 yscroll)
{
return (yscroll >= 0) ? yscroll % bitmap.height() : (bitmap.height() - (-yscroll) % bitmap.height());
}
@@ -86,6 +86,7 @@ gfxdecode_device::gfxdecode_device(const machine_config &mconfig, const char *ta
// gfx_element - constructor
//-------------------------------------------------
+#ifdef UNUSED_FUNCTION
gfx_element::gfx_element()
: m_palette(nullptr),
m_width(0),
@@ -110,9 +111,10 @@ gfx_element::gfx_element()
m_layout_charincrement(0)
{
}
+#endif
-gfx_element::gfx_element(palette_device *palette, UINT8 *base, UINT32 width, UINT32 height, UINT32 rowbytes, UINT32 total_colors, UINT32 color_base, UINT32 color_granularity)
- : m_palette(palette),
+gfx_element::gfx_element(palette_device &palette, UINT8 *base, UINT32 width, UINT32 height, UINT32 rowbytes, UINT32 total_colors, UINT32 color_base, UINT32 color_granularity)
+ : m_palette(&palette),
m_width(width),
m_height(height),
m_startx(0),
@@ -136,8 +138,8 @@ gfx_element::gfx_element(palette_device *palette, UINT8 *base, UINT32 width, UIN
{
}
-gfx_element::gfx_element(palette_device *palette, const gfx_layout &gl, const UINT8 *srcdata, UINT32 xormask, UINT32 total_colors, UINT32 color_base)
- : m_palette(palette),
+gfx_element::gfx_element(palette_device &palette, const gfx_layout &gl, const UINT8 *srcdata, UINT32 xormask, UINT32 total_colors, UINT32 color_base)
+ : m_palette(&palette),
m_width(0),
m_height(0),
m_startx(0),
@@ -1855,12 +1857,12 @@ void draw_scanline32(bitmap_rgb32 &bitmap, INT32 destx, INT32 desty, INT32 lengt
scanline of a bitmap to an 8bpp buffer
-------------------------------------------------*/
-void extract_scanline8(bitmap_ind16 &bitmap, INT32 srcx, INT32 srcy, INT32 length, UINT8 *destptr)
+void extract_scanline8(const bitmap_ind16 &bitmap, INT32 srcx, INT32 srcy, INT32 length, UINT8 *destptr)
{
EXTRACTSCANLINE_CORE(UINT16);
}
-void extract_scanline8(bitmap_rgb32 &bitmap, INT32 srcx, INT32 srcy, INT32 length, UINT8 *destptr)
+void extract_scanline8(const bitmap_rgb32 &bitmap, INT32 srcx, INT32 srcy, INT32 length, UINT8 *destptr)
{
EXTRACTSCANLINE_CORE(UINT32);
}
@@ -1871,12 +1873,12 @@ void extract_scanline8(bitmap_rgb32 &bitmap, INT32 srcx, INT32 srcy, INT32 lengt
scanline of a bitmap to a 16bpp buffer
-------------------------------------------------*/
-void extract_scanline16(bitmap_ind16 &bitmap, INT32 srcx, INT32 srcy, INT32 length, UINT16 *destptr)
+void extract_scanline16(const bitmap_ind16 &bitmap, INT32 srcx, INT32 srcy, INT32 length, UINT16 *destptr)
{
EXTRACTSCANLINE_CORE(UINT16);
}
-void extract_scanline16(bitmap_rgb32 &bitmap, INT32 srcx, INT32 srcy, INT32 length, UINT16 *destptr)
+void extract_scanline16(const bitmap_rgb32 &bitmap, INT32 srcx, INT32 srcy, INT32 length, UINT16 *destptr)
{
EXTRACTSCANLINE_CORE(UINT32);
}
@@ -1887,12 +1889,12 @@ void extract_scanline16(bitmap_rgb32 &bitmap, INT32 srcx, INT32 srcy, INT32 leng
scanline of a bitmap to a 32bpp buffer
-------------------------------------------------*/
-void extract_scanline32(bitmap_ind16 &bitmap, INT32 srcx, INT32 srcy, INT32 length, UINT32 *destptr)
+void extract_scanline32(const bitmap_ind16 &bitmap, INT32 srcx, INT32 srcy, INT32 length, UINT32 *destptr)
{
EXTRACTSCANLINE_CORE(UINT16);
}
-void extract_scanline32(bitmap_rgb32 &bitmap, INT32 srcx, INT32 srcy, INT32 length, UINT32 *destptr)
+void extract_scanline32(const bitmap_rgb32 &bitmap, INT32 srcx, INT32 srcy, INT32 length, UINT32 *destptr)
{
EXTRACTSCANLINE_CORE(UINT32);
}
@@ -1908,13 +1910,13 @@ void extract_scanline32(bitmap_rgb32 &bitmap, INT32 srcx, INT32 srcy, INT32 leng
copying all unclipped pixels
-------------------------------------------------*/
-void copybitmap(bitmap_ind16 &dest, bitmap_ind16 &src, int flipx, int flipy, INT32 destx, INT32 desty, const rectangle &cliprect)
+void copybitmap(bitmap_ind16 &dest, const bitmap_ind16 &src, int flipx, int flipy, INT32 destx, INT32 desty, const rectangle &cliprect)
{
DECLARE_NO_PRIORITY;
COPYBITMAP_CORE(UINT16, PIXEL_OP_COPY_OPAQUE, NO_PRIORITY);
}
-void copybitmap(bitmap_rgb32 &dest, bitmap_rgb32 &src, int flipx, int flipy, INT32 destx, INT32 desty, const rectangle &cliprect)
+void copybitmap(bitmap_rgb32 &dest, const bitmap_rgb32 &src, int flipx, int flipy, INT32 destx, INT32 desty, const rectangle &cliprect)
{
DECLARE_NO_PRIORITY;
COPYBITMAP_CORE(UINT32, PIXEL_OP_COPY_OPAQUE, NO_PRIORITY);
@@ -1927,7 +1929,7 @@ void copybitmap(bitmap_rgb32 &dest, bitmap_rgb32 &src, int flipx, int flipy, INT
those that match transpen
-------------------------------------------------*/
-void copybitmap_trans(bitmap_ind16 &dest, bitmap_ind16 &src, int flipx, int flipy, INT32 destx, INT32 desty, const rectangle &cliprect, UINT32 trans_pen)
+void copybitmap_trans(bitmap_ind16 &dest, const bitmap_ind16 &src, int flipx, int flipy, INT32 destx, INT32 desty, const rectangle &cliprect, UINT32 trans_pen)
{
DECLARE_NO_PRIORITY;
if (trans_pen > 0xffff)
@@ -1936,7 +1938,7 @@ void copybitmap_trans(bitmap_ind16 &dest, bitmap_ind16 &src, int flipx, int flip
COPYBITMAP_CORE(UINT16, PIXEL_OP_COPY_TRANSPEN, NO_PRIORITY);
}
-void copybitmap_trans(bitmap_rgb32 &dest, bitmap_rgb32 &src, int flipx, int flipy, INT32 destx, INT32 desty, const rectangle &cliprect, UINT32 trans_pen)
+void copybitmap_trans(bitmap_rgb32 &dest, const bitmap_rgb32 &src, int flipx, int flipy, INT32 destx, INT32 desty, const rectangle &cliprect, UINT32 trans_pen)
{
DECLARE_NO_PRIORITY;
if (trans_pen == 0xffffffff)
@@ -1957,14 +1959,14 @@ void copybitmap_trans(bitmap_rgb32 &dest, bitmap_rgb32 &src, int flipx, int flip
applying scrolling to one or more rows/columns
-------------------------------------------------*/
-void copyscrollbitmap(bitmap_ind16 &dest, bitmap_ind16 &src, UINT32 numrows, const INT32 *rowscroll, UINT32 numcols, const INT32 *colscroll, const rectangle &cliprect)
+void copyscrollbitmap(bitmap_ind16 &dest, const bitmap_ind16 &src, UINT32 numrows, const INT32 *rowscroll, UINT32 numcols, const INT32 *colscroll, const rectangle &cliprect)
{
// just call through to the transparent case as the underlying copybitmap will
// optimize for pen == 0xffffffff
copyscrollbitmap_trans(dest, src, numrows, rowscroll, numcols, colscroll, cliprect, 0xffffffff);
}
-void copyscrollbitmap(bitmap_rgb32 &dest, bitmap_rgb32 &src, UINT32 numrows, const INT32 *rowscroll, UINT32 numcols, const INT32 *colscroll, const rectangle &cliprect)
+void copyscrollbitmap(bitmap_rgb32 &dest, const bitmap_rgb32 &src, UINT32 numrows, const INT32 *rowscroll, UINT32 numcols, const INT32 *colscroll, const rectangle &cliprect)
{
// just call through to the transparent case as the underlying copybitmap will
// optimize for pen == 0xffffffff
@@ -1980,7 +1982,7 @@ void copyscrollbitmap(bitmap_rgb32 &dest, bitmap_rgb32 &src, UINT32 numrows, con
-------------------------------------------------*/
template<class _BitmapClass>
-static inline void copyscrollbitmap_trans_common(_BitmapClass &dest, _BitmapClass &src, UINT32 numrows, const INT32 *rowscroll, UINT32 numcols, const INT32 *colscroll, const rectangle &cliprect, UINT32 trans_pen)
+static inline void copyscrollbitmap_trans_common(_BitmapClass &dest, const _BitmapClass &src, UINT32 numrows, const INT32 *rowscroll, UINT32 numcols, const INT32 *colscroll, const rectangle &cliprect, UINT32 trans_pen)
{
// no rowscroll and no colscroll means no scroll
if (numrows == 0 && numcols == 0)
@@ -2078,10 +2080,10 @@ static inline void copyscrollbitmap_trans_common(_BitmapClass &dest, _BitmapClas
}
}
-void copyscrollbitmap_trans(bitmap_ind16 &dest, bitmap_ind16 &src, UINT32 numrows, const INT32 *rowscroll, UINT32 numcols, const INT32 *colscroll, const rectangle &cliprect, UINT32 trans_pen)
+void copyscrollbitmap_trans(bitmap_ind16 &dest, const bitmap_ind16 &src, UINT32 numrows, const INT32 *rowscroll, UINT32 numcols, const INT32 *colscroll, const rectangle &cliprect, UINT32 trans_pen)
{ copyscrollbitmap_trans_common(dest, src, numrows, rowscroll, numcols, colscroll, cliprect, trans_pen); }
-void copyscrollbitmap_trans(bitmap_rgb32 &dest, bitmap_rgb32 &src, UINT32 numrows, const INT32 *rowscroll, UINT32 numcols, const INT32 *colscroll, const rectangle &cliprect, UINT32 trans_pen)
+void copyscrollbitmap_trans(bitmap_rgb32 &dest, const bitmap_rgb32 &src, UINT32 numrows, const INT32 *rowscroll, UINT32 numcols, const INT32 *colscroll, const rectangle &cliprect, UINT32 trans_pen)
{ copyscrollbitmap_trans_common(dest, src, numrows, rowscroll, numcols, colscroll, cliprect, trans_pen); }
@@ -2096,13 +2098,13 @@ void copyscrollbitmap_trans(bitmap_rgb32 &dest, bitmap_rgb32 &src, UINT32 numrow
pixels
-------------------------------------------------*/
-void copyrozbitmap(bitmap_ind16 &dest, const rectangle &cliprect, bitmap_ind16 &src, INT32 startx, INT32 starty, INT32 incxx, INT32 incxy, INT32 incyx, INT32 incyy, int wraparound)
+void copyrozbitmap(bitmap_ind16 &dest, const rectangle &cliprect, const bitmap_ind16 &src, INT32 startx, INT32 starty, INT32 incxx, INT32 incxy, INT32 incyx, INT32 incyy, int wraparound)
{
DECLARE_NO_PRIORITY;
COPYROZBITMAP_CORE(UINT16, PIXEL_OP_COPY_OPAQUE, NO_PRIORITY);
}
-void copyrozbitmap(bitmap_rgb32 &dest, const rectangle &cliprect, bitmap_rgb32 &src, INT32 startx, INT32 starty, INT32 incxx, INT32 incxy, INT32 incyx, INT32 incyy, int wraparound)
+void copyrozbitmap(bitmap_rgb32 &dest, const rectangle &cliprect, const bitmap_rgb32 &src, INT32 startx, INT32 starty, INT32 incxx, INT32 incxy, INT32 incyx, INT32 incyy, int wraparound)
{
DECLARE_NO_PRIORITY;
COPYROZBITMAP_CORE(UINT32, PIXEL_OP_COPY_OPAQUE, NO_PRIORITY);
@@ -2116,13 +2118,13 @@ void copyrozbitmap(bitmap_rgb32 &dest, const rectangle &cliprect, bitmap_rgb32 &
transpen
-------------------------------------------------*/
-void copyrozbitmap_trans(bitmap_ind16 &dest, const rectangle &cliprect, bitmap_ind16 &src, INT32 startx, INT32 starty, INT32 incxx, INT32 incxy, INT32 incyx, INT32 incyy, int wraparound, UINT32 trans_pen)
+void copyrozbitmap_trans(bitmap_ind16 &dest, const rectangle &cliprect, const bitmap_ind16 &src, INT32 startx, INT32 starty, INT32 incxx, INT32 incxy, INT32 incyx, INT32 incyy, int wraparound, UINT32 trans_pen)
{
DECLARE_NO_PRIORITY;
COPYROZBITMAP_CORE(UINT16, PIXEL_OP_COPY_TRANSPEN, NO_PRIORITY);
}
-void copyrozbitmap_trans(bitmap_rgb32 &dest, const rectangle &cliprect, bitmap_rgb32 &src, INT32 startx, INT32 starty, INT32 incxx, INT32 incxy, INT32 incyx, INT32 incyy, int wraparound, UINT32 trans_pen)
+void copyrozbitmap_trans(bitmap_rgb32 &dest, const rectangle &cliprect, const bitmap_rgb32 &src, INT32 startx, INT32 starty, INT32 incxx, INT32 incxy, INT32 incyx, INT32 incyy, int wraparound, UINT32 trans_pen)
{
DECLARE_NO_PRIORITY;
COPYROZBITMAP_CORE(UINT32, PIXEL_OP_COPY_TRANSPEN, NO_PRIORITY);
diff --git a/src/emu/drawgfx.h b/src/emu/drawgfx.h
index a8be4a5f286..cebf2cb6e4c 100644
--- a/src/emu/drawgfx.h
+++ b/src/emu/drawgfx.h
@@ -148,12 +148,14 @@ class gfx_element
{
public:
// construction/destruction
+#ifdef UNUSED_FUNCTION
gfx_element();
- gfx_element(palette_device *palette, const gfx_layout &gl, const UINT8 *srcdata, UINT32 xormask, UINT32 total_colors, UINT32 color_base);
- gfx_element(palette_device *palette, UINT8 *base, UINT32 width, UINT32 height, UINT32 rowbytes, UINT32 total_colors, UINT32 color_base, UINT32 color_granularity);
+#endif
+ gfx_element(palette_device &palette, const gfx_layout &gl, const UINT8 *srcdata, UINT32 xormask, UINT32 total_colors, UINT32 color_base);
+ gfx_element(palette_device &palette, UINT8 *base, UINT32 width, UINT32 height, UINT32 rowbytes, UINT32 total_colors, UINT32 color_base, UINT32 color_granularity);
// getters
- palette_device *palette() const { return m_palette; }
+ palette_device &palette() const { return *m_palette; }
UINT16 width() const { return m_width; }
UINT16 height() const { return m_height; }
UINT32 elements() const { return m_total_elements; }
@@ -173,7 +175,7 @@ public:
void set_source(const UINT8 *source);
void set_source_and_total(const UINT8 *source, UINT32 total);
void set_xormask(UINT32 xormask) { m_layout_xormask = xormask; }
- void set_palette(palette_device *palette) { m_palette = palette; }
+ void set_palette(palette_device &palette) { m_palette = &palette; }
void set_colors(UINT32 colors) { m_total_colors = colors; }
void set_colorbase(UINT16 colorbase) { m_color_base = colorbase; }
void set_granularity(UINT16 granularity) { m_color_granularity = granularity; }
@@ -326,28 +328,28 @@ void draw_scanline32(bitmap_rgb32 &bitmap, INT32 destx, INT32 desty, INT32 lengt
// ----- scanline extraction -----
// copy pixels from a single scanline of a bitmap to an 8bpp buffer
-void extract_scanline8(bitmap_ind16 &bitmap, INT32 srcx, INT32 srcy, INT32 length, UINT8 *destptr);
-void extract_scanline8(bitmap_rgb32 &bitmap, INT32 srcx, INT32 srcy, INT32 length, UINT8 *destptr);
+void extract_scanline8(const bitmap_ind16 &bitmap, INT32 srcx, INT32 srcy, INT32 length, UINT8 *destptr);
+void extract_scanline8(const bitmap_rgb32 &bitmap, INT32 srcx, INT32 srcy, INT32 length, UINT8 *destptr);
// copy pixels from a single scanline of a bitmap to a 16bpp buffer
-void extract_scanline16(bitmap_ind16 &bitmap, INT32 srcx, INT32 srcy, INT32 length, UINT16 *destptr);
-void extract_scanline16(bitmap_rgb32 &bitmap, INT32 srcx, INT32 srcy, INT32 length, UINT16 *destptr);
+void extract_scanline16(const bitmap_ind16 &bitmap, INT32 srcx, INT32 srcy, INT32 length, UINT16 *destptr);
+void extract_scanline16(const bitmap_rgb32 &bitmap, INT32 srcx, INT32 srcy, INT32 length, UINT16 *destptr);
// copy pixels from a single scanline of a bitmap to a 32bpp buffer
-void extract_scanline32(bitmap_ind16 &bitmap, INT32 srcx, INT32 srcy, INT32 length, UINT32 *destptr);
-void extract_scanline32(bitmap_rgb32 &bitmap, INT32 srcx, INT32 srcy, INT32 length, UINT32 *destptr);
+void extract_scanline32(const bitmap_ind16 &bitmap, INT32 srcx, INT32 srcy, INT32 length, UINT32 *destptr);
+void extract_scanline32(const bitmap_rgb32 &bitmap, INT32 srcx, INT32 srcy, INT32 length, UINT32 *destptr);
// ----- bitmap copying -----
// copy from one bitmap to another, copying all unclipped pixels
-void copybitmap(bitmap_ind16 &dest, bitmap_ind16 &src, int flipx, int flipy, INT32 destx, INT32 desty, const rectangle &cliprect);
-void copybitmap(bitmap_rgb32 &dest, bitmap_rgb32 &src, int flipx, int flipy, INT32 destx, INT32 desty, const rectangle &cliprect);
+void copybitmap(bitmap_ind16 &dest, const bitmap_ind16 &src, int flipx, int flipy, INT32 destx, INT32 desty, const rectangle &cliprect);
+void copybitmap(bitmap_rgb32 &dest, const bitmap_rgb32 &src, int flipx, int flipy, INT32 destx, INT32 desty, const rectangle &cliprect);
// copy from one bitmap to another, copying all unclipped pixels except those that match transpen
-void copybitmap_trans(bitmap_ind16 &dest, bitmap_ind16 &src, int flipx, int flipy, INT32 destx, INT32 desty, const rectangle &cliprect, UINT32 transpen);
-void copybitmap_trans(bitmap_rgb32 &dest, bitmap_rgb32 &src, int flipx, int flipy, INT32 destx, INT32 desty, const rectangle &cliprect, UINT32 transpen);
+void copybitmap_trans(bitmap_ind16 &dest, const bitmap_ind16 &src, int flipx, int flipy, INT32 destx, INT32 desty, const rectangle &cliprect, UINT32 transpen);
+void copybitmap_trans(bitmap_rgb32 &dest, const bitmap_rgb32 &src, int flipx, int flipy, INT32 destx, INT32 desty, const rectangle &cliprect, UINT32 transpen);
/*
Copy a bitmap onto another with scroll and wraparound.
@@ -362,12 +364,12 @@ void copybitmap_trans(bitmap_rgb32 &dest, bitmap_rgb32 &src, int flipx, int flip
*/
// copy from one bitmap to another, copying all unclipped pixels, and applying scrolling to one or more rows/columns
-void copyscrollbitmap(bitmap_ind16 &dest, bitmap_ind16 &src, UINT32 numrows, const INT32 *rowscroll, UINT32 numcols, const INT32 *colscroll, const rectangle &cliprect);
-void copyscrollbitmap(bitmap_rgb32 &dest, bitmap_rgb32 &src, UINT32 numrows, const INT32 *rowscroll, UINT32 numcols, const INT32 *colscroll, const rectangle &cliprect);
+void copyscrollbitmap(bitmap_ind16 &dest, const bitmap_ind16 &src, UINT32 numrows, const INT32 *rowscroll, UINT32 numcols, const INT32 *colscroll, const rectangle &cliprect);
+void copyscrollbitmap(bitmap_rgb32 &dest, const bitmap_rgb32 &src, UINT32 numrows, const INT32 *rowscroll, UINT32 numcols, const INT32 *colscroll, const rectangle &cliprect);
// copy from one bitmap to another, copying all unclipped pixels except those that match transpen, and applying scrolling to one or more rows/columns
-void copyscrollbitmap_trans(bitmap_ind16 &dest, bitmap_ind16 &src, UINT32 numrows, const INT32 *rowscroll, UINT32 numcols, const INT32 *colscroll, const rectangle &cliprect, UINT32 transpen);
-void copyscrollbitmap_trans(bitmap_rgb32 &dest, bitmap_rgb32 &src, UINT32 numrows, const INT32 *rowscroll, UINT32 numcols, const INT32 *colscroll, const rectangle &cliprect, UINT32 transpen);
+void copyscrollbitmap_trans(bitmap_ind16 &dest, const bitmap_ind16 &src, UINT32 numrows, const INT32 *rowscroll, UINT32 numcols, const INT32 *colscroll, const rectangle &cliprect, UINT32 transpen);
+void copyscrollbitmap_trans(bitmap_rgb32 &dest, const bitmap_rgb32 &src, UINT32 numrows, const INT32 *rowscroll, UINT32 numcols, const INT32 *colscroll, const rectangle &cliprect, UINT32 transpen);
/*
Copy a bitmap applying rotation, zooming, and arbitrary distortion.
@@ -399,12 +401,12 @@ void copyscrollbitmap_trans(bitmap_rgb32 &dest, bitmap_rgb32 &src, UINT32 numrow
*/
// copy from one bitmap to another, with zoom and rotation, copying all unclipped pixels
-void copyrozbitmap(bitmap_ind16 &dest, const rectangle &cliprect, bitmap_ind16 &src, INT32 startx, INT32 starty, INT32 incxx, INT32 incxy, INT32 incyx, INT32 incyy, int wraparound);
-void copyrozbitmap(bitmap_rgb32 &dest, const rectangle &cliprect, bitmap_rgb32 &src, INT32 startx, INT32 starty, INT32 incxx, INT32 incxy, INT32 incyx, INT32 incyy, int wraparound);
+void copyrozbitmap(bitmap_ind16 &dest, const rectangle &cliprect, const bitmap_ind16 &src, INT32 startx, INT32 starty, INT32 incxx, INT32 incxy, INT32 incyx, INT32 incyy, int wraparound);
+void copyrozbitmap(bitmap_rgb32 &dest, const rectangle &cliprect, const bitmap_rgb32 &src, INT32 startx, INT32 starty, INT32 incxx, INT32 incxy, INT32 incyx, INT32 incyy, int wraparound);
// copy from one bitmap to another, with zoom and rotation, copying all unclipped pixels whose values do not match transpen
-void copyrozbitmap_trans(bitmap_ind16 &dest, const rectangle &cliprect, bitmap_ind16 &src, INT32 startx, INT32 starty, INT32 incxx, INT32 incxy, INT32 incyx, INT32 incyy, int wraparound, UINT32 transparent_color);
-void copyrozbitmap_trans(bitmap_rgb32 &dest, const rectangle &cliprect, bitmap_rgb32 &src, INT32 startx, INT32 starty, INT32 incxx, INT32 incxy, INT32 incyx, INT32 incyy, int wraparound, UINT32 transparent_color);
+void copyrozbitmap_trans(bitmap_ind16 &dest, const rectangle &cliprect, const bitmap_ind16 &src, INT32 startx, INT32 starty, INT32 incxx, INT32 incxy, INT32 incyx, INT32 incyy, int wraparound, UINT32 transparent_color);
+void copyrozbitmap_trans(bitmap_rgb32 &dest, const rectangle &cliprect, const bitmap_rgb32 &src, INT32 startx, INT32 starty, INT32 incxx, INT32 incxy, INT32 incyx, INT32 incyy, int wraparound, UINT32 transparent_color);
diff --git a/src/emu/drivenum.h b/src/emu/drivenum.h
index e3bf3117861..faaf685304a 100644
--- a/src/emu/drivenum.h
+++ b/src/emu/drivenum.h
@@ -120,7 +120,7 @@ private:
void release_current() const;
static const int CONFIG_CACHE_COUNT = 100;
-
+
// internal state
int m_current;
int m_filtered_count;
diff --git a/src/emu/driver.cpp b/src/emu/driver.cpp
index ee4ec8bebdb..7d61c40e582 100644
--- a/src/emu/driver.cpp
+++ b/src/emu/driver.cpp
@@ -211,7 +211,7 @@ void driver_device::device_start()
(*m_system->driver_init)(machine());
// finish image devices init process
- image_postdevice_init(machine());
+ machine().image().postdevice_init();
// start the various pieces
driver_start();
@@ -565,6 +565,23 @@ void driver_device::flip_screen_y_set(UINT32 on)
}
+/***************************************************************************
+PORT READING HELPERS
+***************************************************************************/
+
+/*-------------------------------------------------
+custom_port_read - act like input_port_read
+but it is a custom port, it is useful for
+e.g. input ports which expect the same port
+repeated both in the upper and lower half
+-------------------------------------------------*/
+
+CUSTOM_INPUT_MEMBER(driver_device::custom_port_read)
+{
+ const char *tag = (const char *)param;
+ return ioport(tag)->read();
+}
+
//**************************************************************************
// MISC READ/WRITE HANDLERS
diff --git a/src/emu/driver.h b/src/emu/driver.h
index 9a122bbdf42..20d4036dc43 100644
--- a/src/emu/driver.h
+++ b/src/emu/driver.h
@@ -137,6 +137,9 @@ public:
// memory helpers
address_space &generic_space() const { return space(AS_PROGRAM); }
+ // output heler
+ output_manager &output() const { return machine().output(); }
+
// generic interrupt generators
void generic_pulse_irq_line(device_execute_interface &exec, int irqline, int cycles);
void generic_pulse_irq_line_and_vector(device_execute_interface &exec, int irqline, int vector, int cycles);
@@ -284,7 +287,7 @@ device_t *driver_device_creator(const machine_config &mconfig, const char *tag,
{
assert(owner == nullptr);
assert(clock == 0);
- return global_alloc_clear(_DriverClass(mconfig, &driver_device_creator<_DriverClass>, tag));
+ return global_alloc_clear<_DriverClass>(mconfig, &driver_device_creator<_DriverClass>, tag);
}
diff --git a/src/emu/emu.h b/src/emu/emu.h
index 24de3559ab2..4e78d67282f 100644
--- a/src/emu/emu.h
+++ b/src/emu/emu.h
@@ -15,8 +15,6 @@
***************************************************************************/
-#pragma once
-
#ifndef __EMU_H__
#define __EMU_H__
@@ -112,7 +110,7 @@ typedef device_t * (*machine_config_constructor)(machine_config &config, device_
#include "devcb.h"
#include "dispatch.h"
#include "drivers/xtal.h"
-#include "machine/generic.h"
+#include "bookkeeping.h"
#include "video/generic.h"
#endif /* __EMU_H__ */
diff --git a/src/emu/emualloc.h b/src/emu/emualloc.h
index 192f1fca85e..4571762054f 100644
--- a/src/emu/emualloc.h
+++ b/src/emu/emualloc.h
@@ -17,32 +17,15 @@
#include "osdcore.h"
#include "coretmpl.h"
-
-//**************************************************************************
-// DEBUGGING
-//**************************************************************************
-
-// set to 1 to track memory allocated by emualloc.h itself as well
-#define TRACK_SELF_MEMORY (0)
-
-
-
//**************************************************************************
// MACROS
//**************************************************************************
-// self-allocation helpers
-#if TRACK_SELF_MEMORY
-#define EMUALLOC_SELF_NEW new(__FILE__, __LINE__)
-#else
-#define EMUALLOC_SELF_NEW new
-#endif
-
// pool allocation helpers
-#define pool_alloc(_pool, _type) (_pool).add_object(new(__FILE__, __LINE__) _type)
-#define pool_alloc_clear(_pool, _type) (_pool).add_object(new(__FILE__, __LINE__, zeromem) _type)
-#define pool_alloc_array(_pool, _type, _num) (_pool).add_array(new(__FILE__, __LINE__) _type[_num], (_num))
-#define pool_alloc_array_clear(_pool, _type, _num) (_pool).add_array(new(__FILE__, __LINE__, zeromem) _type[_num], (_num))
+#define pool_alloc(_pool, _type) (_pool).add_object(global_alloc(_type))
+#define pool_alloc_clear(_pool, _type) (_pool).add_object(global_alloc_clear _type)
+#define pool_alloc_array(_pool, _type, _num) (_pool).add_array(global_alloc_array(_type,_num), (_num))
+#define pool_alloc_array_clear(_pool, _type, _num) (_pool).add_array(global_alloc_array_clear<_type>(_num), (_num))
#define pool_free(_pool, v) (_pool).remove(v)
@@ -136,8 +119,8 @@ public:
bool contains(void *ptrstart, void *ptrend);
void clear();
- template<class _ObjectClass> _ObjectClass *add_object(_ObjectClass* object) { add(*EMUALLOC_SELF_NEW resource_pool_object<_ObjectClass>(object), sizeof(_ObjectClass), typeid(_ObjectClass).name()); return object; }
- template<class _ObjectClass> _ObjectClass *add_array(_ObjectClass* array, int count) { add(*EMUALLOC_SELF_NEW resource_pool_array<_ObjectClass>(array, count), sizeof(_ObjectClass), typeid(_ObjectClass).name()); return array; }
+ template<class _ObjectClass> _ObjectClass *add_object(_ObjectClass* object) { add(*new resource_pool_object<_ObjectClass>(object), sizeof(_ObjectClass), typeid(_ObjectClass).name()); return object; }
+ template<class _ObjectClass> _ObjectClass *add_array(_ObjectClass* array, int count) { add(*new resource_pool_array<_ObjectClass>(array, count), sizeof(_ObjectClass), typeid(_ObjectClass).name()); return array; }
private:
int m_hash_size;
diff --git a/src/emu/emuopts.cpp b/src/emu/emuopts.cpp
index 11938000fe7..aa1b0482edc 100644
--- a/src/emu/emuopts.cpp
+++ b/src/emu/emuopts.cpp
@@ -185,6 +185,7 @@ const options_entry emu_options::s_option_entries[] =
{ OPTION_AUTOBOOT_COMMAND ";ab", nullptr, OPTION_STRING, "command to execute after machine boot" },
{ OPTION_AUTOBOOT_DELAY, "2", OPTION_INTEGER, "timer delay in sec to trigger command execution on autoboot" },
{ OPTION_AUTOBOOT_SCRIPT ";script", nullptr, OPTION_STRING, "lua script to execute after machine boot" },
+ { OPTION_CONSOLE, "0", OPTION_BOOLEAN, "enable emulator LUA console" },
{ nullptr }
};
@@ -280,8 +281,7 @@ void emu_options::update_slot_options()
const char *name = slot->device().tag() + 1;
if (exists(name) && slot->first_option() != nullptr)
{
- std::string defvalue;
- slot->get_default_card_software(defvalue);
+ std::string defvalue = slot->get_default_card_software();
if (defvalue.length() > 0)
{
set_default_value(name, defvalue.c_str());
@@ -469,11 +469,10 @@ void emu_options::parse_standard_inis(std::string &error_string)
}
// next parse "source/<sourcefile>.ini"; if that doesn't exist, try <sourcefile>.ini
- std::string sourcename;
- core_filename_extract_base(sourcename, cursystem->source_file, true).insert(0, "source" PATH_SEPARATOR);
+ std::string sourcename = core_filename_extract_base(cursystem->source_file, true).insert(0, "source" PATH_SEPARATOR);
if (!parse_one_ini(sourcename.c_str(), OPTION_PRIORITY_SOURCE_INI, &error_string))
{
- core_filename_extract_base(sourcename, cursystem->source_file, true);
+ sourcename = core_filename_extract_base(cursystem->source_file, true);
parse_one_ini(sourcename.c_str(), OPTION_PRIORITY_SOURCE_INI, &error_string);
}
@@ -500,8 +499,7 @@ void emu_options::parse_standard_inis(std::string &error_string)
const game_driver *emu_options::system() const
{
- std::string tempstr;
- int index = driver_list::find(core_filename_extract_base(tempstr, system_name(), true).c_str());
+ int index = driver_list::find(core_filename_extract_base(system_name(), true).c_str());
return (index != -1) ? &driver_list::driver(index) : nullptr;
}
@@ -567,19 +565,19 @@ bool emu_options::parse_one_ini(const char *basename, int priority, std::string
}
-const char *emu_options::main_value(std::string &buffer, const char *name) const
+std::string emu_options::main_value(const char *name) const
{
- buffer = value(name);
+ std::string buffer = value(name);
int pos = buffer.find_first_of(',');
if (pos != -1)
buffer = buffer.substr(0, pos);
- return buffer.c_str();
+ return buffer;
}
-const char *emu_options::sub_value(std::string &buffer, const char *name, const char *subname) const
+std::string emu_options::sub_value(const char *name, const char *subname) const
{
std::string tmp = std::string(",").append(subname).append("=");
- buffer = value(name);
+ std::string buffer = value(name);
int pos = buffer.find(tmp);
if (pos != -1)
{
@@ -590,7 +588,7 @@ const char *emu_options::sub_value(std::string &buffer, const char *name, const
}
else
buffer.clear();
- return buffer.c_str();
+ return buffer;
}
diff --git a/src/emu/emuopts.h b/src/emu/emuopts.h
index 3bd7cd8afd6..14597d0e67d 100644
--- a/src/emu/emuopts.h
+++ b/src/emu/emuopts.h
@@ -189,6 +189,8 @@ enum
#define OPTION_AUTOBOOT_DELAY "autoboot_delay"
#define OPTION_AUTOBOOT_SCRIPT "autoboot_script"
+#define OPTION_CONSOLE "console"
+
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -361,11 +363,13 @@ public:
int autoboot_delay() const { return int_value(OPTION_AUTOBOOT_DELAY); }
const char *autoboot_script() const { return value(OPTION_AUTOBOOT_SCRIPT); }
+ bool console() const { return bool_value(OPTION_CONSOLE); }
+
// FIXME: Couriersud: This should be in image_device_exit
void remove_device_options();
- const char *main_value(std::string &buffer, const char *option) const;
- const char *sub_value(std::string &buffer, const char *name, const char *subname) const;
+ std::string main_value(const char *option) const;
+ std::string sub_value(const char *name, const char *subname) const;
bool add_slot_options(bool isfirst);
private:
diff --git a/src/emu/fileio.cpp b/src/emu/fileio.cpp
index 8c982d03f19..0de5e021800 100644
--- a/src/emu/fileio.cpp
+++ b/src/emu/fileio.cpp
@@ -219,8 +219,7 @@ emu_file::operator core_file &()
hash_collection &emu_file::hashes(const char *types)
{
// determine the hashes we already have
- std::string already_have;
- m_hashes.hash_types(already_have);
+ std::string already_have = m_hashes.hash_types();
// determine which hashes we need
std::string needed;
diff --git a/src/emu/gamedrv.h b/src/emu/gamedrv.h
index db5e02f31cc..7fdcaf9e1c4 100644
--- a/src/emu/gamedrv.h
+++ b/src/emu/gamedrv.h
@@ -44,6 +44,7 @@ const UINT32 MACHINE_TYPE_COMPUTER = 0x00100000; // any kind of co
const UINT32 MACHINE_TYPE_OTHER = 0x00200000; // any other emulated system that doesn't fit above (ex. clock, satelite receiver,...)
const UINT32 MACHINE_IMPERFECT_KEYBOARD = 0x00400000; // keyboard is known to be wrong
const UINT32 MACHINE_CLICKABLE_ARTWORK = 0x00800000; // marking that artwork is clickable and require mouse cursor
+const UINT32 MACHINE_IS_INCOMPLETE = 0x01000000; // any official game/system with blantantly incomplete HW or SW should be marked with this
// useful combinations of flags
const UINT32 MACHINE_IS_SKELETON = MACHINE_NO_SOUND | MACHINE_NOT_WORKING; // mask for skelly games
diff --git a/src/emu/hash.cpp b/src/emu/hash.cpp
index 20894f4fa3e..20fd59ecab6 100644
--- a/src/emu/hash.cpp
+++ b/src/emu/hash.cpp
@@ -115,14 +115,14 @@ bool hash_collection::operator==(const hash_collection &rhs) const
// a string
//-------------------------------------------------
-const char *hash_collection::hash_types(std::string &buffer) const
+std::string hash_collection::hash_types() const
{
- buffer.clear();
+ std::string buffer;
if (m_has_crc32)
buffer.push_back(HASH_CRC);
if (m_has_sha1)
buffer.push_back(HASH_SHA1);
- return buffer.c_str();
+ return buffer;
}
@@ -190,24 +190,24 @@ bool hash_collection::remove(char type)
// format
//-------------------------------------------------
-const char *hash_collection::internal_string(std::string &buffer) const
+std::string hash_collection::internal_string() const
{
- buffer.clear();
+ std::string buffer;
// handle CRCs
- std::string temp;
if (m_has_crc32) {
buffer.push_back(HASH_CRC);
- buffer.append(m_crc32.as_string(temp));
+ buffer.append(m_crc32.as_string());
}
// handle SHA1s
if (m_has_sha1) {
buffer.push_back(HASH_SHA1);
- buffer.append(m_sha1.as_string(temp));
+ buffer.append(m_sha1.as_string());
}
// append flags
- return buffer.append(m_flags).c_str();
+ buffer.append(m_flags);
+ return buffer;
}
@@ -216,18 +216,17 @@ const char *hash_collection::internal_string(std::string &buffer) const
// flags to a string in the macroized format
//-------------------------------------------------
-const char *hash_collection::macro_string(std::string &buffer) const
+std::string hash_collection::macro_string() const
{
- buffer.clear();
+ std::string buffer;
// handle CRCs
- std::string temp;
if (m_has_crc32)
- buffer.append("CRC(").append(m_crc32.as_string(temp)).append(") ");
+ buffer.append("CRC(").append(m_crc32.as_string()).append(") ");
// handle SHA1s
if (m_has_sha1)
- buffer.append("SHA1(").append(m_sha1.as_string(temp)).append(") ");
+ buffer.append("SHA1(").append(m_sha1.as_string()).append(") ");
// append flags
if (flag(FLAG_NO_DUMP))
@@ -235,7 +234,7 @@ const char *hash_collection::macro_string(std::string &buffer) const
if (flag(FLAG_BAD_DUMP))
buffer.append("BAD_DUMP ");
strtrimspace(buffer);
- return buffer.c_str();
+ return buffer;
}
@@ -244,18 +243,17 @@ const char *hash_collection::macro_string(std::string &buffer) const
// flags to a string in XML attribute format
//-------------------------------------------------
-const char *hash_collection::attribute_string(std::string &buffer) const
+std::string hash_collection::attribute_string() const
{
- buffer.clear();
+ std::string buffer;
// handle CRCs
- std::string temp;
if (m_has_crc32)
- buffer.append("crc=\"").append(m_crc32.as_string(temp)).append("\" ");
+ buffer.append("crc=\"").append(m_crc32.as_string()).append("\" ");
// handle SHA1s
if (m_has_sha1)
- buffer.append("sha1=\"").append(m_sha1.as_string(temp)).append("\" ");
+ buffer.append("sha1=\"").append(m_sha1.as_string()).append("\" ");
// append flags
if (flag(FLAG_NO_DUMP))
@@ -263,7 +261,7 @@ const char *hash_collection::attribute_string(std::string &buffer) const
if (flag(FLAG_BAD_DUMP))
buffer.append("status=\"baddump\"");
strtrimspace(buffer);
- return buffer.c_str();
+ return buffer;
}
diff --git a/src/emu/hash.h b/src/emu/hash.h
index 52d5c6bf3b6..f225c7827a3 100644
--- a/src/emu/hash.h
+++ b/src/emu/hash.h
@@ -67,7 +67,7 @@ public:
// getters
bool flag(char flag) const { return (m_flags.find_first_of(flag) != std::string::npos); }
- const char *hash_types(std::string &buffer) const;
+ std::string hash_types() const;
// hash manipulators
void reset();
@@ -83,9 +83,9 @@ public:
void add_sha1(sha1_t sha1) { m_has_sha1 = true; m_sha1 = sha1; }
// string conversion
- const char *internal_string(std::string &buffer) const;
- const char *macro_string(std::string &buffer) const;
- const char *attribute_string(std::string &buffer) const;
+ std::string internal_string() const;
+ std::string macro_string() const;
+ std::string attribute_string() const;
bool from_internal_string(const char *string);
// creation
diff --git a/src/emu/hashfile.cpp b/src/emu/hashfile.cpp
index 374a09f5176..557d9c28d5f 100644
--- a/src/emu/hashfile.cpp
+++ b/src/emu/hashfile.cpp
@@ -604,13 +604,13 @@ bool hashfile_extrainfo(device_image_interface &image, std::string &result)
static void *expat_malloc(size_t size)
{
- return global_alloc_array_clear(UINT8,size);
+ return global_alloc_array_clear<UINT8>(size);
}
static void *expat_realloc(void *ptr, size_t size)
{
if (ptr) global_free_array((UINT8 *)ptr);
- return global_alloc_array_clear(UINT8,size);
+ return global_alloc_array_clear<UINT8>(size);
}
static void expat_free(void *ptr)
diff --git a/src/emu/image.cpp b/src/emu/image.cpp
index ab7f7406854..76de04714fb 100644
--- a/src/emu/image.cpp
+++ b/src/emu/image.cpp
@@ -15,61 +15,80 @@
#include "image.h"
#include "config.h"
#include "xmlfile.h"
-#include "formats/ioprocs.h"
-/* ----------------------------------------------------------------------- */
+//**************************************************************************
+// IMAGE MANAGER
+//**************************************************************************
-static int image_fseek_thunk(void *file, INT64 offset, int whence)
-{
- device_image_interface *image = (device_image_interface *) file;
- return image->fseek(offset, whence);
-}
+//-------------------------------------------------
+// image_manager - constructor
+//-------------------------------------------------
-static size_t image_fread_thunk(void *file, void *buffer, size_t length)
+image_manager::image_manager(running_machine &machine)
+ : m_machine(machine)
{
- device_image_interface *image = (device_image_interface *) file;
- return image->fread(buffer, length);
-}
+ const char *image_name;
-static size_t image_fwrite_thunk(void *file, const void *buffer, size_t length)
-{
- device_image_interface *image = (device_image_interface *) file;
- return image->fwrite(buffer, length);
-}
+ /* make sure that any required devices have been allocated */
+ image_interface_iterator iter(machine.root_device());
+ for (device_image_interface *image = iter.first(); image != nullptr; image = iter.next())
+ {
+ /* is an image specified for this image */
+ image_name = machine.options().value(image->instance_name());
-static UINT64 image_fsize_thunk(void *file)
-{
- device_image_interface *image = (device_image_interface *) file;
- return image->length();
-}
+ if ((image_name != nullptr) && (image_name[0] != '\0'))
+ {
+ /* mark init state */
+ image->set_init_phase();
-/* ----------------------------------------------------------------------- */
+ /* try to load this image */
+ bool result = image->load(image_name);
-struct io_procs image_ioprocs =
-{
- nullptr,
- image_fseek_thunk,
- image_fread_thunk,
- image_fwrite_thunk,
- image_fsize_thunk
-};
+ /* did the image load fail? */
+ if (result)
+ {
+ /* retrieve image error message */
+ std::string image_err = std::string(image->error());
+ std::string image_basename(image_name);
-/***************************************************************************
- INITIALIZATION HELPERS
-***************************************************************************/
+ /* unload all images */
+ unload_all();
-/*-------------------------------------------------
- image_dirs_load - loads image device directory
- configuration items
--------------------------------------------------*/
+ fatalerror_exitcode(machine, MAMERR_DEVICE, "Device %s load (%s) failed: %s",
+ image->device().name(),
+ image_basename.c_str(),
+ image_err.c_str());
+ }
+ }
+ }
+
+ machine.configuration().config_register("image_directories", config_saveload_delegate(FUNC(image_manager::config_load), this), config_saveload_delegate(FUNC(image_manager::config_save), this));
+}
+
+//-------------------------------------------------
+// unload_all - unload all images and
+// extract options
+//-------------------------------------------------
+void image_manager::unload_all()
+{
+ // extract the options
+ options_extract();
+
+ image_interface_iterator iter(machine().root_device());
+ for (device_image_interface *image = iter.first(); image != nullptr; image = iter.next())
+ {
+ // unload this image
+ image->unload();
+ }
+}
-static void image_dirs_load(running_machine &machine, int config_type, xml_data_node *parentnode)
+void image_manager::config_load(config_type cfg_type, xml_data_node *parentnode)
{
xml_data_node *node;
const char *dev_instance;
const char *working_directory;
- if ((config_type == CONFIG_TYPE_GAME) && (parentnode != nullptr))
+ if ((cfg_type == config_type::CONFIG_TYPE_GAME) && (parentnode != nullptr))
{
for (node = xml_get_sibling(parentnode->child, "device"); node; node = xml_get_sibling(node->next, "device"))
{
@@ -77,7 +96,7 @@ static void image_dirs_load(running_machine &machine, int config_type, xml_data_
if ((dev_instance != nullptr) && (dev_instance[0] != '\0'))
{
- image_interface_iterator iter(machine.root_device());
+ image_interface_iterator iter(machine().root_device());
for (device_image_interface *image = iter.first(); image != nullptr; image = iter.next())
{
if (!strcmp(dev_instance, image->instance_name())) {
@@ -91,22 +110,20 @@ static void image_dirs_load(running_machine &machine, int config_type, xml_data_
}
}
-
-
/*-------------------------------------------------
- image_dirs_save - saves out image device
+ config_save - saves out image device
directories to the configuration file
-------------------------------------------------*/
-static void image_dirs_save(running_machine &machine, int config_type, xml_data_node *parentnode)
+void image_manager::config_save(config_type cfg_type, xml_data_node *parentnode)
{
xml_data_node *node;
const char *dev_instance;
/* only care about game-specific data */
- if (config_type == CONFIG_TYPE_GAME)
+ if (cfg_type == config_type::CONFIG_TYPE_GAME)
{
- image_interface_iterator iter(machine.root_device());
+ image_interface_iterator iter(machine().root_device());
for (device_image_interface *image = iter.first(); image != nullptr; image = iter.next())
{
dev_instance = image->instance_name();
@@ -126,7 +143,7 @@ static void image_dirs_save(running_machine &machine, int config_type, xml_data_
INI files
-------------------------------------------------*/
-static int write_config(emu_options &options, const char *filename, const game_driver *gamedrv)
+int image_manager::write_config(emu_options &options, const char *filename, const game_driver *gamedrv)
{
char buffer[128];
int retval = 1;
@@ -141,8 +158,7 @@ static int write_config(emu_options &options, const char *filename, const game_d
file_error filerr = file.open(filename);
if (filerr == FILERR_NONE)
{
- std::string inistring;
- options.output_ini(inistring);
+ std::string inistring = options.output_ini();
file.puts(inistring.c_str());
retval = 0;
}
@@ -150,105 +166,46 @@ static int write_config(emu_options &options, const char *filename, const game_d
}
/*-------------------------------------------------
- image_options_extract - extract device options
+ options_extract - extract device options
out of core into the options
-------------------------------------------------*/
-static void image_options_extract(running_machine &machine)
+void image_manager::options_extract()
{
/* only extract the device options if we've added them
no need to assert in case they are missing */
{
int index = 0;
- image_interface_iterator iter(machine.root_device());
+ image_interface_iterator iter(machine().root_device());
for (device_image_interface *image = iter.first(); image != nullptr; image = iter.next())
{
const char *filename = image->filename();
/* and set the option */
std::string error;
- machine.options().set_value(image->instance_name(), filename ? filename : "", OPTION_PRIORITY_CMDLINE, error);
+ machine().options().set_value(image->instance_name(), filename ? filename : "", OPTION_PRIORITY_CMDLINE, error);
index++;
}
}
/* write the config, if appropriate */
- if (machine.options().write_config())
- write_config(machine.options(), nullptr, &machine.system());
-}
-
-/*-------------------------------------------------
- image_unload_all - unload all images and
- extract options
--------------------------------------------------*/
-
-void image_unload_all(running_machine &machine)
-{
- // extract the options
- image_options_extract(machine);
-
- image_interface_iterator iter(machine.root_device());
- for (device_image_interface *image = iter.first(); image != nullptr; image = iter.next())
- {
- // unload this image
- image->unload();
- }
+ if (machine().options().write_config())
+ write_config(machine().options(), nullptr, &machine().system());
}
-/*-------------------------------------------------
- image_device_init - initialize devices for a specific
- running_machine
--------------------------------------------------*/
-
-void image_device_init(running_machine &machine)
-{
- const char *image_name;
-
- /* make sure that any required devices have been allocated */
- image_interface_iterator iter(machine.root_device());
- for (device_image_interface *image = iter.first(); image != nullptr; image = iter.next())
- {
- /* is an image specified for this image */
- image_name = machine.options().value(image->instance_name());
-
- if ((image_name != nullptr) && (image_name[0] != '\0'))
- {
- /* mark init state */
- image->set_init_phase();
-
- /* try to load this image */
- bool result = image->load(image_name);
-
- /* did the image load fail? */
- if (result)
- {
- /* retrieve image error message */
- std::string image_err = std::string(image->error());
- std::string image_basename(image_name);
- /* unload all images */
- image_unload_all(machine);
-
- fatalerror_exitcode(machine, MAMERR_DEVICE, "Device %s load (%s) failed: %s",
- image->device().name(),
- image_basename.c_str(),
- image_err.c_str());
- }
- }
- }
-}
/*-------------------------------------------------
image_mandatory_scan - search for devices which
need an image to be loaded
-------------------------------------------------*/
-std::string &image_mandatory_scan(running_machine &machine, std::string &mandatory)
+std::string &image_manager::mandatory_scan(std::string &mandatory)
{
mandatory.clear();
// make sure that any required image has a mounted file
- image_interface_iterator iter(machine.root_device());
+ image_interface_iterator iter(machine().root_device());
for (device_image_interface *image = iter.first(); image != nullptr; image = iter.next())
{
if (image->filename() == nullptr && image->must_be_loaded())
@@ -258,14 +215,14 @@ std::string &image_mandatory_scan(running_machine &machine, std::string &mandato
}
/*-------------------------------------------------
- image_postdevice_init - initialize devices for a specific
+ postdevice_init - initialize devices for a specific
running_machine
-------------------------------------------------*/
-void image_postdevice_init(running_machine &machine)
+void image_manager::postdevice_init()
{
/* make sure that any required devices have been allocated */
- image_interface_iterator iter(machine.root_device());
+ image_interface_iterator iter(machine().root_device());
for (device_image_interface *image = iter.first(); image != nullptr; image = iter.next())
{
int result = image->finish_load();
@@ -276,98 +233,13 @@ void image_postdevice_init(running_machine &machine)
std::string image_err = std::string(image->error());
/* unload all images */
- image_unload_all(machine);
+ unload_all();
- fatalerror_exitcode(machine, MAMERR_DEVICE, "Device %s load failed: %s",
+ fatalerror_exitcode(machine(), MAMERR_DEVICE, "Device %s load failed: %s",
image->device().name(),
image_err.c_str());
}
}
-
/* add a callback for when we shut down */
- machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(image_unload_all), &machine));
-}
-/***************************************************************************
- INITIALIZATION
-***************************************************************************/
-
-/*-------------------------------------------------
- image_init - start up the image system
--------------------------------------------------*/
-
-void image_init(running_machine &machine)
-{
- image_device_init(machine);
- config_register(machine, "image_directories", config_saveload_delegate(FUNC(image_dirs_load), &machine), config_saveload_delegate(FUNC(image_dirs_save), &machine));
-}
-
-
-/****************************************************************************
- Battery functions
-
- These functions provide transparent access to battery-backed RAM on an
- image; typically for cartridges.
-****************************************************************************/
-
-/*-------------------------------------------------
- image_battery_load_by_name - retrieves the battery
- backed RAM for an image. A filename may be supplied
- to the function.
-
- The function comes in two flavors, depending on
- what should happen when no battery is available:
- we could fill the memory with a given value, or
- pass a default battery (for a pre-initialized
- battery from factory)
--------------------------------------------------*/
-
-void image_battery_load_by_name(emu_options &options, const char *filename, void *buffer, int length, int fill)
-{
- file_error filerr;
- int bytes_read = 0;
-
- assert_always(buffer && (length > 0), "Must specify sensical buffer/length");
-
- /* try to open the battery file and read it in, if possible */
- emu_file file(options.nvram_directory(), OPEN_FLAG_READ);
- filerr = file.open(filename);
- if (filerr == FILERR_NONE)
- bytes_read = file.read(buffer, length);
-
- /* fill remaining bytes (if necessary) */
- memset(((char *) buffer) + bytes_read, fill, length - bytes_read);
-}
-
-void image_battery_load_by_name(emu_options &options, const char *filename, void *buffer, int length, void *def_buffer)
-{
- file_error filerr;
- int bytes_read = 0;
-
- assert_always(buffer && (length > 0), "Must specify sensical buffer/length");
-
- /* try to open the battery file and read it in, if possible */
- emu_file file(options.nvram_directory(), OPEN_FLAG_READ);
- filerr = file.open(filename);
- if (filerr == FILERR_NONE)
- bytes_read = file.read(buffer, length);
-
- /* if no file was present, copy the default battery */
- if (bytes_read == 0 && def_buffer)
- memcpy((char *) buffer, (char *) def_buffer, length);
-}
-
-/*-------------------------------------------------
- image_battery_save_by_name - stores the battery
- backed RAM for an image. A filename may be supplied
- to the function.
--------------------------------------------------*/
-void image_battery_save_by_name(emu_options &options, const char *filename, const void *buffer, int length)
-{
- assert_always(buffer && (length > 0), "Must specify sensical buffer/length");
-
- /* try to open the battery file and write it out, if possible */
- emu_file file(options.nvram_directory(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
- file_error filerr = file.open(filename);
- if (filerr == FILERR_NONE)
- file.write(buffer, length);
+ machine().add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(image_manager::unload_all), this));
}
diff --git a/src/emu/image.h b/src/emu/image.h
index 592ed4e0f19..32b8035d14d 100644
--- a/src/emu/image.h
+++ b/src/emu/image.h
@@ -13,14 +13,29 @@
#ifndef __IMAGE_H__
#define __IMAGE_H__
-void image_init(running_machine &machine);
-void image_postdevice_init(running_machine &machine);
-std::string &image_mandatory_scan(running_machine &machine, std::string &mandatory);
-
-extern struct io_procs image_ioprocs;
-
-void image_battery_load_by_name(emu_options &options, const char *filename, void *buffer, int length, int fill);
-void image_battery_load_by_name(emu_options &options, const char *filename, void *buffer, int length, void *def_buffer);
-void image_battery_save_by_name(emu_options &options, const char *filename, const void *buffer, int length);
+// ======================> image_manager
+
+class image_manager
+{
+public:
+ // construction/destruction
+ image_manager(running_machine &machine);
+
+ void unload_all();
+ void postdevice_init();
+ std::string &mandatory_scan(std::string &mandatory);
+
+ // getters
+ running_machine &machine() const { return m_machine; }
+private:
+ void config_load(config_type cfg_type, xml_data_node *parentnode);
+ void config_save(config_type cfg_type, xml_data_node *parentnode);
+
+ void options_extract();
+ int write_config(emu_options &options, const char *filename, const game_driver *gamedrv);
+
+ // internal state
+ running_machine & m_machine; // reference to our machine
+};
#endif /* __IMAGE_H__ */
diff --git a/src/emu/info.cpp b/src/emu/info.cpp
index f09fba8fe94..4bae0daf37a 100644
--- a/src/emu/info.cpp
+++ b/src/emu/info.cpp
@@ -394,7 +394,7 @@ void info_xml_creator::output_devices()
device_iterator deviter(m_drivlist.config().root_device());
for (device_t *device = deviter.first(); device != nullptr; device = deviter.next())
{
- if (device->owner() != nullptr && device->shortname()!= nullptr && strlen(device->shortname())!=0)
+ if (device->owner() != nullptr && device->shortname()!= nullptr && device->shortname()[0]!='\0')
{
if (shortnames.insert(device->shortname()).second)
output_one_device(*device, device->tag());
@@ -424,7 +424,7 @@ void info_xml_creator::output_devices()
device_iterator deviter2(*dev);
for (device_t *device = deviter2.first(); device != nullptr; device = deviter2.next())
{
- if (device->owner() == dev && device->shortname()!= nullptr && strlen(device->shortname())!=0)
+ if (device->owner() == dev && device->shortname()!= nullptr && device->shortname()[0]!='\0')
{
if (shortnames.insert(device->shortname()).second)
output_one_device(*device, device->tag());
@@ -447,7 +447,7 @@ void info_xml_creator::output_device_roms()
{
device_iterator deviter(m_drivlist.config().root_device());
for (device_t *device = deviter.first(); device != nullptr; device = deviter.next())
- if (device->owner() != nullptr && device->shortname()!= nullptr && strlen(device->shortname())!=0)
+ if (device->owner() != nullptr && device->shortname()!= nullptr && device->shortname()[0]!='\0')
fprintf(m_output, "\t\t<device_ref name=\"%s\"/>\n", xml_normalize_string(device->shortname()));
}
@@ -572,8 +572,7 @@ void info_xml_creator::output_rom(device_t &device)
if (!hashes.flag(hash_collection::FLAG_NO_DUMP))
{
// iterate over hash function types and print m_output their values
- std::string tempstr;
- strcatprintf(output," %s", hashes.attribute_string(tempstr));
+ output.append(" ").append(hashes.attribute_string());
}
else
output.append(" status=\"nodump\"");
@@ -620,7 +619,7 @@ void info_xml_creator::output_sample(device_t &device)
for (const char *samplename = iter.first(); samplename != nullptr; samplename = iter.next())
{
// filter out duplicates
- if (already_printed.insert(samplename).second)
+ if (!already_printed.insert(samplename).second)
continue;
// output the sample name
@@ -1306,11 +1305,8 @@ void info_xml_creator::output_slots(device_t &device, const char *root_tag)
fprintf(m_output, "\t\t\t<slotoption");
fprintf(m_output, " name=\"%s\"", xml_normalize_string(option->name()));
fprintf(m_output, " devname=\"%s\"", xml_normalize_string(dev->shortname()));
- if (slot->default_option())
- {
- if (strcmp(slot->default_option(),option->name())==0)
- fprintf(m_output, " default=\"yes\"");
- }
+ if (slot->default_option() != nullptr && strcmp(slot->default_option(),option->name())==0)
+ fprintf(m_output, " default=\"yes\"");
fprintf(m_output, "/>\n");
const_cast<machine_config &>(m_drivlist.config()).device_remove(&m_drivlist.config().root_device(), "dummy");
}
diff --git a/src/emu/inpttype.h b/src/emu/inpttype.h
index 79843fdff34..7a07ea777b6 100644
--- a/src/emu/inpttype.h
+++ b/src/emu/inpttype.h
@@ -21,8 +21,10 @@
/* These input port macros expand to a great deal of code and break compilers */
#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && (__GNUC_MINOR__ > 4 || (__GNUC_MINOR__ == 4 && __GNUC_PATCHLEVEL__ >= 4))))
+#if not(defined(__arm__) || defined(__ARMEL__))
#pragma GCC push_options
#pragma GCC optimize ("O1")
+#endif
#elif defined(_MSC_VER)
#pragma optimize("", off)
#endif
@@ -830,7 +832,9 @@ void construct_core_types(simple_list<input_type_entry> &typelist)
construct_core_types_invalid(typelist);
}
#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && (__GNUC_MINOR__ > 4 || (__GNUC_MINOR__ == 4 && __GNUC_PATCHLEVEL__ >= 4))))
+#if not(defined(__arm__) || defined(__ARMEL__))
#pragma GCC pop_options
+#endif
#elif defined(_MSC_VER)
#pragma optimize("", on)
#endif
diff --git a/src/emu/input.cpp b/src/emu/input.cpp
index 2d19e6b1bf4..474680a7409 100644
--- a/src/emu/input.cpp
+++ b/src/emu/input.cpp
@@ -529,9 +529,10 @@ bool joystick_map::parse(const char *mapstring)
// friendly display
//-------------------------------------------------
-const char *joystick_map::to_string(std::string &str) const
+std::string joystick_map::to_string() const
{
- strprintf(str, "%s\n", m_origstring.c_str());
+ std::string str(m_origstring);
+ str.append("\n");
for (auto & elem : m_map)
{
str.append(" ");
@@ -553,7 +554,7 @@ const char *joystick_map::to_string(std::string &str) const
str.append("\n");
}
- return str.c_str();
+ return str;
}
@@ -676,7 +677,7 @@ bool input_seq::is_valid() const
for (auto code : m_code)
{
// invalid codes are never permitted
-
+
if (code == INPUT_CODE_INVALID)
return false;
@@ -808,14 +809,13 @@ input_device::input_device(input_class &_class, int devindex, const char *name,
mapstring = joystick_map_8way;
// parse it
- std::string tempstr;
if (!m_joymap.parse(mapstring))
{
osd_printf_error("Invalid joystick map: %s\n", mapstring);
m_joymap.parse(joystick_map_8way);
}
else if (mapstring != joystick_map_8way)
- osd_printf_verbose("Input: Default joystick map = %s\n", m_joymap.to_string(tempstr));
+ osd_printf_verbose("Input: Default joystick map = %s\n", m_joymap.to_string().c_str());
}
}
@@ -1460,21 +1460,18 @@ input_code input_manager::code_from_itemid(input_item_id itemid) const
// friendly name
//-------------------------------------------------
-const char *input_manager::code_name(std::string &str, input_code code) const
+std::string input_manager::code_name(input_code code) const
{
- str.clear();
-
// if nothing there, return an empty string
input_device_item *item = item_from_code(code);
if (item == nullptr)
- return str.c_str();
+ return std::string();
// determine the devclass part
const char *devclass = (*devclass_string_table)[code.device_class()];
// determine the devindex part
- std::string devindex;
- strprintf(devindex, "%d", code.device_index() + 1);
+ std::string devindex = strformat("%d", code.device_index() + 1);
// if we're unifying all devices, don't display a number
if (!m_class[code.device_class()]->multi())
@@ -1500,7 +1497,7 @@ const char *input_manager::code_name(std::string &str, input_code code) const
devcode = "";
// concatenate the strings
- str.assign(devclass);
+ std::string str(devclass);
if (!devindex.empty())
str.append(" ").append(devindex);
if (devcode[0] != 0)
@@ -1510,7 +1507,7 @@ const char *input_manager::code_name(std::string &str, input_code code) const
// delete any leading spaces
strtrimspace(str);
- return str.c_str();
+ return str;
}
@@ -1518,14 +1515,13 @@ const char *input_manager::code_name(std::string &str, input_code code) const
// code_to_token - create a token for a given code
//-------------------------------------------------
-const char *input_manager::code_to_token(std::string &str, input_code code) const
+std::string input_manager::code_to_token(input_code code) const
{
// determine the devclass part
const char *devclass = (*devclass_token_table)[code.device_class()];
// determine the devindex part; keyboard 0 doesn't show an index
- std::string devindex;
- strprintf(devindex, "%d", code.device_index() + 1);
+ std::string devindex = strformat("%d", code.device_index() + 1);
if (code.device_class() == DEVICE_CLASS_KEYBOARD && code.device_index() == 0)
devindex.clear();
@@ -1542,7 +1538,7 @@ const char *input_manager::code_to_token(std::string &str, input_code code) cons
itemclass = (*itemclass_token_table)[code.item_class()];
// concatenate the strings
- str.assign(devclass);
+ std::string str(devclass);
if (!devindex.empty())
str.append("_").append(devindex);
if (devcode[0] != 0)
@@ -1551,7 +1547,7 @@ const char *input_manager::code_to_token(std::string &str, input_code code) cons
str.append("_").append(modifier);
if (itemclass[0] != 0)
str.append("_").append(itemclass);
- return str.c_str();
+ return str;
}
@@ -1925,17 +1921,16 @@ bool input_manager::seq_poll()
// sequence
//-------------------------------------------------
-const char *input_manager::seq_name(std::string &str, const input_seq &seq) const
+std::string input_manager::seq_name(const input_seq &seq) const
{
// make a copy of our sequence, removing any invalid bits
input_code clean_codes[sizeof(seq) / sizeof(input_code)];
int clean_index = 0;
- std::string codestr;
for (int codenum = 0; seq[codenum] != input_seq::end_code; codenum++)
{
// if this is a code item which is not valid, don't copy it and remove any preceding ORs/NOTs
input_code code = seq[codenum];
- if (!code.internal() && *(code_name(codestr, code)) == 0)
+ if (!code.internal() && code_name(code).empty())
{
while (clean_index > 0 && clean_codes[clean_index - 1].internal())
clean_index--;
@@ -1946,10 +1941,10 @@ const char *input_manager::seq_name(std::string &str, const input_seq &seq) cons
// special case: empty
if (clean_index == 0)
- return str.assign((seq.length() == 0) ? "None" : "n/a").c_str();
+ return std::string((seq.length() == 0) ? "None" : "n/a");
// start with an empty buffer
- str.clear();
+ std::string str;
// loop until we hit the end
for (int codenum = 0; codenum < clean_index; codenum++)
@@ -1967,9 +1962,9 @@ const char *input_manager::seq_name(std::string &str, const input_seq &seq) cons
// otherwise, assume it is an input code and ask the input system to generate it
else
- str.append(code_name(codestr, code));
+ str.append(code_name(code));
}
- return str.c_str();
+ return str;
}
@@ -1978,13 +1973,12 @@ const char *input_manager::seq_name(std::string &str, const input_seq &seq) cons
// a sequence
//-------------------------------------------------
-const char *input_manager::seq_to_tokens(std::string &str, const input_seq &seq) const
+std::string input_manager::seq_to_tokens(const input_seq &seq) const
{
// start with an empty buffer
- str.clear();
+ std::string str;
// loop until we hit the end
- std::string codestr;
for (int codenum = 0; seq[codenum] != input_seq::end_code; codenum++)
{
// append a space if not the first code
@@ -2002,9 +1996,9 @@ const char *input_manager::seq_to_tokens(std::string &str, const input_seq &seq)
// otherwise, assume it is an input code and ask the input system to generate it
else
- str.append(code_to_token(codestr, code));
+ str.append(code_to_token(code));
}
- return str.c_str();
+ return str;
}
@@ -2072,8 +2066,7 @@ bool input_manager::set_global_joystick_map(const char *mapstring)
if (!map.parse(mapstring))
return false;
- std::string tempstr;
- osd_printf_verbose("Input: Changing default joystick map = %s\n", map.to_string(tempstr));
+ osd_printf_verbose("Input: Changing default joystick map = %s\n", map.to_string().c_str());
// iterate over joysticks and set the map
for (int joynum = 0; joynum <= m_joystick_class.maxindex(); joynum++)
diff --git a/src/emu/input.h b/src/emu/input.h
index b0f006d3fd9..a14f08099c0 100644
--- a/src/emu/input.h
+++ b/src/emu/input.h
@@ -365,7 +365,7 @@ public:
bool parse(const char *mapstring);
// create a friendly string
- const char *to_string(std::string &str) const;
+ std::string to_string() const;
// update the state of a live map
UINT8 update(INT32 xaxisval, INT32 yaxisval);
@@ -654,8 +654,8 @@ public:
input_device *device_from_code(input_code code) const;
input_device_item *item_from_code(input_code code) const;
input_code code_from_itemid(input_item_id itemid) const;
- const char *code_name(std::string &str, input_code code) const;
- const char *code_to_token(std::string &str, input_code code) const;
+ std::string code_name(input_code code) const;
+ std::string code_to_token(input_code code) const;
input_code code_from_token(const char *_token);
// input sequence readers
@@ -668,8 +668,8 @@ public:
const input_seq &seq_poll_final() const { return m_poll_seq; }
// input sequence helpers
- const char *seq_name(std::string &str, const input_seq &seq) const;
- const char *seq_to_tokens(std::string &str, const input_seq &seq) const;
+ std::string seq_name(const input_seq &seq) const;
+ std::string seq_to_tokens(const input_seq &seq) const;
void seq_from_tokens(input_seq &seq, const char *_token);
// misc
diff --git a/src/emu/ioport.cpp b/src/emu/ioport.cpp
index 9bb43f0c4ec..282cc5c256c 100644
--- a/src/emu/ioport.cpp
+++ b/src/emu/ioport.cpp
@@ -897,8 +897,7 @@ void natural_keyboard::post(unicode_char ch)
if (LOG_NATURAL_KEYBOARD)
{
const keycode_map_entry *code = find_code(ch);
- std::string tempstr;
- machine().logerror("natural_keyboard::post(): code=%i (%s) field->name='%s'\n", int(ch), unicode_to_string(tempstr, ch), (code != nullptr && code->field[0] != nullptr) ? code->field[0]->name() : "<null>");
+ machine().logerror("natural_keyboard::post(): code=%i (%s) field->name='%s'\n", int(ch), unicode_to_string(ch).c_str(), (code != nullptr && code->field[0] != nullptr) ? code->field[0]->name() : "<null>");
}
// can we post this key in the queue directly?
@@ -1101,8 +1100,7 @@ void natural_keyboard::build_codes(ioport_manager &manager)
if (LOG_NATURAL_KEYBOARD)
{
- std::string tempstr;
- machine().logerror("natural_keyboard: code=%i (%s) port=%p field->name='%s'\n", int(code), unicode_to_string(tempstr, code), (void *)port, field->name());
+ machine().logerror("natural_keyboard: code=%i (%s) port=%p field->name='%s'\n", int(code), unicode_to_string(code).c_str(), (void *)port, field->name());
}
}
}
@@ -1234,9 +1232,9 @@ void natural_keyboard::timer(void *ptr, int param)
// logging and debugging
//-------------------------------------------------
-const char *natural_keyboard::unicode_to_string(std::string &buffer, unicode_char ch)
+std::string natural_keyboard::unicode_to_string(unicode_char ch)
{
- buffer.clear();
+ std::string buffer;
switch (ch)
{
// check some magic values
@@ -1256,15 +1254,15 @@ const char *natural_keyboard::unicode_to_string(std::string &buffer, unicode_cha
{
// try to obtain a codename with code_name(); this can result in an empty string
input_code code(DEVICE_CLASS_KEYBOARD, 0, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, input_item_id(ch - UCHAR_MAMEKEY_BEGIN));
- machine().input().code_name(buffer, code);
+ buffer = machine().input().code_name(code);
}
// did we fail to resolve? if so, we have a last resort
- if (buffer.length() == 0)
+ if (buffer.empty())
strprintf(buffer,"U+%04X", unsigned(ch));
break;
}
- return buffer.c_str();
+ return buffer;
}
@@ -1307,8 +1305,10 @@ void natural_keyboard::frame_update(ioport_port &port, ioport_value &digital)
// key_name - returns the name of a specific key
//-------------------------------------------------
-const char *natural_keyboard::key_name(std::string &str, unicode_char ch)
+std::string natural_keyboard::key_name(unicode_char ch) const
{
+ std::string str;
+
// attempt to get the string from the character info table
const char_info *ci = char_info::find(ch);
const char *result = (ci != nullptr) ? ci->name : nullptr;
@@ -1327,7 +1327,7 @@ const char *natural_keyboard::key_name(std::string &str, unicode_char ch)
// otherwise, opt for question marks
else
str.assign("???");
- return str.c_str();
+ return str;
}
@@ -1337,15 +1337,15 @@ const char *natural_keyboard::key_name(std::string &str, unicode_char ch)
std::string natural_keyboard::dump()
{
- std::string buffer, tempstr;
+ std::string buffer;
const size_t left_column_width = 24;
// loop through all codes
for (auto & code : m_keycode_map)
{
// describe the character code
-
- strcatprintf(buffer,"%08X (%s) ", code.ch, unicode_to_string(tempstr, code.ch));
+
+ strcatprintf(buffer,"%08X (%s) ", code.ch, unicode_to_string(code.ch).c_str());
// pad with spaces
while (buffer.length() < left_column_width)
@@ -1965,7 +1965,7 @@ void ioport_field::frame_update(ioport_value &result, bool mouse_down)
}
// skip locked-out coin inputs
- if (curstate && m_type >= IPT_COIN1 && m_type <= IPT_COIN12 && coin_lockout_get_state(machine(), m_type - IPT_COIN1))
+ if (curstate && m_type >= IPT_COIN1 && m_type <= IPT_COIN12 && machine().bookkeeping().coin_lockout_get_state(m_type - IPT_COIN1))
{
bool verbose = machine().options().verbose();
#ifdef MAME_DEBUG
@@ -2173,20 +2173,19 @@ ioport_field_live::ioport_field_live(ioport_field &field, analog_field *analog)
if (field.type_class() == INPUT_CLASS_KEYBOARD && field.specific_name() == nullptr)
{
// loop through each character on the field
- std::string tempstr;
for (int which = 0; ; which++)
{
unicode_char ch = field.keyboard_code(which);
if (ch == 0)
break;
- strcatprintf(name, "%-*s ", MAX(SPACE_COUNT - 1, 0), field.manager().natkeyboard().key_name(tempstr, ch));
+ strcatprintf(name, "%-*s ", MAX(SPACE_COUNT - 1, 0), field.manager().natkeyboard().key_name(ch).c_str());
}
// trim extra spaces
strtrimspace(name);
// special case
- if (name.length() == 0)
+ if (name.empty())
name.assign("Unnamed Key");
}
}
@@ -2535,7 +2534,7 @@ time_t ioport_manager::initialize()
m_natkeyboard.initialize();
// register callbacks for when we load configurations
- config_register(machine(), "input", config_saveload_delegate(FUNC(ioport_manager::load_config), this), config_saveload_delegate(FUNC(ioport_manager::save_config), this));
+ machine().configuration().config_register("input", config_saveload_delegate(FUNC(ioport_manager::load_config), this), config_saveload_delegate(FUNC(ioport_manager::save_config), this));
// calculate "has..." values
{
@@ -2900,7 +2899,7 @@ g_profiler.start(PROFILER_INPUT);
// perform mouse hit testing
INT32 mouse_target_x, mouse_target_y;
bool mouse_button;
- render_target *mouse_target = ui_input_find_mouse(machine(), &mouse_target_x, &mouse_target_y, &mouse_button);
+ render_target *mouse_target = machine().ui_input().find_mouse(&mouse_target_x, &mouse_target_y, &mouse_button);
// if the button is pressed, map the point and determine what was hit
ioport_field *mouse_field = nullptr;
@@ -2958,10 +2957,10 @@ INT32 ioport_manager::frame_interpolate(INT32 oldval, INT32 newval)
// data from the XML nodes
//-------------------------------------------------
-void ioport_manager::load_config(int config_type, xml_data_node *parentnode)
+void ioport_manager::load_config(config_type cfg_type, xml_data_node *parentnode)
{
// in the completion phase, we finish the initialization with the final ports
- if (config_type == CONFIG_TYPE_FINAL)
+ if (cfg_type == config_type::CONFIG_TYPE_FINAL)
{
m_safe_to_read = true;
frame_update();
@@ -2972,7 +2971,7 @@ void ioport_manager::load_config(int config_type, xml_data_node *parentnode)
return;
// iterate over all the remap nodes for controller configs only
- if (config_type == CONFIG_TYPE_CONTROLLER)
+ if (cfg_type == config_type::CONFIG_TYPE_CONTROLLER)
load_remap_table(parentnode);
// iterate over all the port nodes
@@ -3002,7 +3001,7 @@ void ioport_manager::load_config(int config_type, xml_data_node *parentnode)
}
// if we're loading default ports, apply to the defaults
- if (config_type != CONFIG_TYPE_GAME)
+ if (cfg_type != config_type::CONFIG_TYPE_GAME)
load_default_config(portnode, type, player, newseq);
else
load_game_config(portnode, type, player, newseq);
@@ -3010,7 +3009,7 @@ void ioport_manager::load_config(int config_type, xml_data_node *parentnode)
// after applying the controller config, push that back into the backup, since that is
// what we will diff against
- if (config_type == CONFIG_TYPE_CONTROLLER)
+ if (cfg_type == config_type::CONFIG_TYPE_CONTROLLER)
for (input_type_entry *entry = m_typelist.first(); entry != nullptr; entry = entry->next())
for (input_seq_type seqtype = SEQ_TYPE_STANDARD; seqtype < SEQ_TYPE_TOTAL; ++seqtype)
entry->defseq(seqtype) = entry->seq(seqtype);
@@ -3149,14 +3148,14 @@ bool ioport_manager::load_game_config(xml_data_node *portnode, int type, int pla
// port configuration
//-------------------------------------------------
-void ioport_manager::save_config(int config_type, xml_data_node *parentnode)
+void ioport_manager::save_config(config_type cfg_type, xml_data_node *parentnode)
{
// if no parentnode, ignore
if (parentnode == nullptr)
return;
// default ports save differently
- if (config_type == CONFIG_TYPE_DEFAULT)
+ if (cfg_type == config_type::CONFIG_TYPE_DEFAULT)
save_default_inputs(parentnode);
else
save_game_inputs(parentnode);
@@ -3175,7 +3174,7 @@ void ioport_manager::save_sequence(xml_data_node *parentnode, input_seq_type typ
if (seq.length() == 0)
seqstring.assign("NONE");
else
- machine().input().seq_to_tokens(seqstring, seq);
+ seqstring = machine().input().seq_to_tokens(seq);
// add the new node
xml_data_node *seqnode = xml_add_child(parentnode, "newseq", seqstring.c_str());
@@ -3233,8 +3232,7 @@ void ioport_manager::save_default_inputs(xml_data_node *parentnode)
if (portnode != nullptr)
{
// add the port information and attributes
- std::string tempstr;
- xml_set_attribute(portnode, "type", input_type_to_token(tempstr, entry->type(), entry->player()));
+ xml_set_attribute(portnode, "type", input_type_to_token(entry->type(), entry->player()).c_str());
// add only the sequences that have changed from the defaults
for (input_seq_type type = SEQ_TYPE_STANDARD; type < SEQ_TYPE_TOTAL; ++type)
@@ -3288,9 +3286,8 @@ void ioport_manager::save_game_inputs(xml_data_node *parentnode)
if (portnode != nullptr)
{
// add the identifying information and attributes
- std::string tempstr;
xml_set_attribute(portnode, "tag", port->tag());
- xml_set_attribute(portnode, "type", input_type_to_token(tempstr, field->type(), field->player()));
+ xml_set_attribute(portnode, "type", input_type_to_token(field->type(), field->player()).c_str());
xml_set_attribute_int(portnode, "mask", field->mask());
xml_set_attribute_int(portnode, "defvalue", field->defvalue() & field->mask());
@@ -4399,15 +4396,15 @@ ioport_type ioport_manager::token_to_input_type(const char *string, int &player)
// type and player to a string token
//-------------------------------------------------
-const char *ioport_manager::input_type_to_token(std::string &str, ioport_type type, int player)
+std::string ioport_manager::input_type_to_token(ioport_type type, int player)
{
// look up the port and return the token
input_type_entry *entry = m_type_to_entry[type][player];
if (entry != nullptr)
- return str.assign(entry->token()).c_str();
+ return std::string(entry->token());
// if that fails, carry on
- return strformat(str, "TYPE_OTHER(%d,%d)", type, player).c_str();
+ return strformat("TYPE_OTHER(%d,%d)", type, player);
}
diff --git a/src/emu/ioport.h b/src/emu/ioport.h
index ddb653b5926..89bd9e6964e 100644
--- a/src/emu/ioport.h
+++ b/src/emu/ioport.h
@@ -830,7 +830,7 @@ public:
void post_coded(const char *text, size_t length = 0, const attotime &rate = attotime::zero);
void frame_update(ioport_port &port, ioport_value &digital);
- const char *key_name(std::string &str, unicode_char ch);
+ std::string key_name(unicode_char ch) const;
// debugging
std::string dump();
@@ -850,7 +850,7 @@ private:
attotime choose_delay(unicode_char ch);
void internal_post(unicode_char ch);
void timer(void *ptr, int param);
- const char *unicode_to_string(std::string &buffer, unicode_char ch);
+ std::string unicode_to_string(unicode_char ch);
const keycode_map_entry *find_code(unicode_char ch) const;
// internal state
@@ -1353,6 +1353,8 @@ struct ioport_port_live
};
+enum class config_type;
+
// ======================> ioport_manager
// private input port state
@@ -1396,7 +1398,7 @@ public:
bool has_keyboard() const;
INT32 frame_interpolate(INT32 oldval, INT32 newval);
ioport_type token_to_input_type(const char *string, int &player) const;
- const char *input_type_to_token(std::string &str, ioport_type type, int player);
+ std::string input_type_to_token(ioport_type type, int player);
private:
// internal helpers
@@ -1411,12 +1413,12 @@ private:
input_seq_type token_to_seq_type(const char *string);
void update_defaults();
- void load_config(int config_type, xml_data_node *parentnode);
+ void load_config(config_type cfg_type, xml_data_node *parentnode);
void load_remap_table(xml_data_node *parentnode);
bool load_default_config(xml_data_node *portnode, int type, int player, const input_seq *newseq);
bool load_game_config(xml_data_node *portnode, int type, int player, const input_seq *newseq);
- void save_config(int config_type, xml_data_node *parentnode);
+ void save_config(config_type cfg_type, xml_data_node *parentnode);
void save_sequence(xml_data_node *parentnode, input_seq_type type, ioport_type porttype, const input_seq &seq);
bool save_this_input_field_type(ioport_type type);
void save_default_inputs(xml_data_node *parentnode);
diff --git a/src/emu/luaengine.cpp b/src/emu/luaengine.cpp
index 0aa4b45deb1..733c99537c7 100644
--- a/src/emu/luaengine.cpp
+++ b/src/emu/luaengine.cpp
@@ -9,6 +9,7 @@
***************************************************************************/
#include <limits>
+#include <thread>
#include "lua.hpp"
#include "luabridge/Source/LuaBridge/LuaBridge.h"
#include <signal.h>
@@ -330,7 +331,7 @@ void lua_engine::emu_hook_output(lua_State *L)
hook_output_cb.set(L, 1);
if (!output_notifier_set) {
- output_set_notifier(nullptr, s_output_notifier, this);
+ machine().output().set_notifier(nullptr, s_output_notifier, this);
output_notifier_set = true;
}
}
@@ -356,7 +357,7 @@ void lua_engine::emu_set_hook(lua_State *L)
if (strcmp(hookname, "output") == 0) {
hook_output_cb.set(L, 1);
if (!output_notifier_set) {
- output_set_notifier(nullptr, s_output_notifier, this);
+ machine().output().set_notifier(nullptr, s_output_notifier, this);
output_notifier_set = true;
}
} else if (strcmp(hookname, "frame") == 0) {
@@ -812,7 +813,7 @@ osd_lock *lock;
void lua_engine::serve_lua()
{
osd_sleep(osd_ticks_per_second() / 1000 * 50);
- printf("%s v%s - %s\n%s\n%s\n\n", emulator_info::get_applongname(),build_version,emulator_info::get_fulllongname(),emulator_info::get_copyright_info(),LUA_COPYRIGHT);
+ printf("%s v%s\n%s\n%s\n\n", emulator_info::get_appname(),build_version,emulator_info::get_copyright_info(),LUA_COPYRIGHT);
fflush(stdout);
char buff[LUA_MAXINPUT];
std::string oldbuff;
@@ -860,14 +861,12 @@ void lua_engine::serve_lua()
} while (1);
}
-/*
static void *serve_lua(void *param)
{
- lua_engine *engine = (lua_engine *)param;
- engine->serve_lua();
- return NULL;
+ lua_engine *engine = (lua_engine *)param;
+ engine->serve_lua();
+ return NULL;
}
-*/
//-------------------------------------------------
// lua_engine - constructor
@@ -1024,6 +1023,8 @@ void lua_engine::initialize()
void lua_engine::start_console()
{
+ std::thread th(::serve_lua, this);
+ th.detach();
}
//-------------------------------------------------
diff --git a/src/emu/machine.cpp b/src/emu/machine.cpp
index c2f0a2c85e3..a80a9c1aa74 100644
--- a/src/emu/machine.cpp
+++ b/src/emu/machine.cpp
@@ -118,10 +118,7 @@ running_machine::running_machine(const machine_config &_config, machine_manager
: firstcpu(nullptr),
primary_screen(nullptr),
debug_flags(0),
- romload_data(nullptr),
- ui_input_data(nullptr),
debugcpu_data(nullptr),
- generic_machine_data(nullptr),
m_config(_config),
m_system(_config.gamedrv()),
m_manager(manager),
@@ -217,15 +214,18 @@ TIMER_CALLBACK_MEMBER(running_machine::autoboot_callback)
void running_machine::start()
{
// initialize basic can't-fail systems here
- config_init(*this);
+ m_configuration = std::make_unique<configuration_manager>(*this);
m_input = std::make_unique<input_manager>(*this);
- output_init(*this);
+ m_output = std::make_unique<output_manager>(*this);
m_render = std::make_unique<render_manager>(*this);
- generic_machine_init(*this);
+ m_bookkeeping = std::make_unique<bookkeeping_manager>(*this);
// allocate a soft_reset timer
m_soft_reset_timer = m_scheduler.timer_alloc(timer_expired_delegate(FUNC(running_machine::soft_reset), this));
+ // intialize UI input
+ m_ui_input = make_unique_clear<ui_input_manager>(*this);
+
// init the osd layer
m_manager.osd().init(*this);
@@ -243,15 +243,12 @@ void running_machine::start()
if (newbase != 0)
m_base_time = newbase;
- // intialize UI input
- ui_input_init(*this);
-
// initialize the streams engine before the sound devices start
m_sound = std::make_unique<sound_manager>(*this);
// first load ROMs, then populate memory, and finally initialize CPUs
// these operations must proceed in this order
- rom_init(*this);
+ m_rom_load = make_unique_clear<rom_load_manager>(*this);
m_memory.initialize();
// initialize the watchdog
@@ -266,14 +263,18 @@ void running_machine::start()
save().save_item(NAME(m_rand_seed));
// initialize image devices
- image_init(*this);
+ m_image = std::make_unique<image_manager>(*this);
m_tilemap = std::make_unique<tilemap_manager>(*this);
- crosshair_init(*this);
- network_init(*this);
+ m_crosshair = make_unique_clear<crosshair_manager>(*this);
+ m_network = std::make_unique<network_manager>(*this);
// initialize the debugger
if ((debug_flags & DEBUG_FLAG_ENABLED) != 0)
- debugger_init(*this);
+ {
+ m_debug_view = std::make_unique<debug_view_manager>(*this);
+ m_debugger = std::make_unique<debugger_manager>(*this);
+ m_debugger->initialize();
+ }
m_render->resolve_tags();
@@ -335,7 +336,7 @@ int running_machine::run(bool firstrun)
start();
// load the configuration settings and NVRAM
- config_load_settings(*this);
+ m_configuration->load_settings();
// disallow save state registrations starting here.
// Don't do it earlier, config load can create network
@@ -390,7 +391,7 @@ int running_machine::run(bool firstrun)
// save the NVRAM and configuration
sound().ui_mute(true);
nvram_save();
- config_save_settings(*this);
+ m_configuration->save_settings();
}
catch (emu_fatalerror &fatal)
{
@@ -495,7 +496,7 @@ void running_machine::schedule_soft_reset()
// software
//-------------------------------------------------
-std::string running_machine::get_statename(const char *option)
+std::string running_machine::get_statename(const char *option) const
{
std::string statename_str("");
if (option == nullptr || option[0] == 0)
@@ -1173,42 +1174,35 @@ void running_machine::postload_all_devices()
NVRAM MANAGEMENT
***************************************************************************/
-const char *running_machine::image_parent_basename(device_t *device)
-{
- device_t *dev = device;
- while(dev != &root_device())
- {
- device_image_interface *intf = nullptr;
- if (dev!=nullptr && dev->interface(intf))
- {
- return intf->basename_noext();
- }
- dev = dev->owner();
- }
- return nullptr;
-}
-
/*-------------------------------------------------
nvram_filename - returns filename of system's
NVRAM depending of selected BIOS
-------------------------------------------------*/
-std::string &running_machine::nvram_filename(std::string &result, device_t &device)
+std::string running_machine::nvram_filename(device_t &device) const
{
// start with either basename or basename_biosnum
- result.assign(basename());
+ std::string result(basename());
if (root_device().system_bios() != 0 && root_device().default_bios() != root_device().system_bios())
strcatprintf(result, "_%d", root_device().system_bios() - 1);
// device-based NVRAM gets its own name in a subdirectory
- if (&device != &root_device())
+ if (device.owner() != nullptr)
{
// add per software nvrams into one folder
- const char *software = image_parent_basename(&device);
- if (software!=nullptr && strlen(software)>0)
+ const char *software = nullptr;
+ for (device_t *dev = &device; dev->owner() != nullptr; dev = dev->owner())
{
- result.append(PATH_SEPARATOR).append(software);
+ device_image_interface *intf;
+ if (dev->interface(intf))
+ {
+ software = intf->basename_noext();
+ break;
+ }
}
+ if (software != nullptr && *software != '\0')
+ result.append(PATH_SEPARATOR).append(software);
+
std::string tag(device.tag());
tag.erase(0, 1);
strreplacechr(tag,':', '_');
@@ -1226,9 +1220,8 @@ void running_machine::nvram_load()
nvram_interface_iterator iter(root_device());
for (device_nvram_interface *nvram = iter.first(); nvram != nullptr; nvram = iter.next())
{
- std::string filename;
emu_file file(options().nvram_directory(), OPEN_FLAG_READ);
- if (file.open(nvram_filename(filename, nvram->device()).c_str()) == FILERR_NONE)
+ if (file.open(nvram_filename(nvram->device()).c_str()) == FILERR_NONE)
{
nvram->nvram_load(file);
file.close();
@@ -1248,9 +1241,8 @@ void running_machine::nvram_save()
nvram_interface_iterator iter(root_device());
for (device_nvram_interface *nvram = iter.first(); nvram != nullptr; nvram = iter.next())
{
- std::string filename;
emu_file file(options().nvram_directory(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
- if (file.open(nvram_filename(filename, nvram->device()).c_str()) == FILERR_NONE)
+ if (file.open(nvram_filename(nvram->device()).c_str()) == FILERR_NONE)
{
nvram->nvram_save(file);
file.close();
diff --git a/src/emu/machine.h b/src/emu/machine.h
index 755e8466384..24b0840c93d 100644
--- a/src/emu/machine.h
+++ b/src/emu/machine.h
@@ -73,13 +73,6 @@ const int DEBUG_FLAG_OSD_ENABLED = 0x00001000; // The OSD debugger is e
#define auto_alloc_array_clear(m, t, c) pool_alloc_array_clear(static_cast<running_machine &>(m).respool(), t, c)
#define auto_free(m, v) pool_free(static_cast<running_machine &>(m).respool(), v)
-#define auto_bitmap_ind8_alloc(m, w, h) auto_alloc(m, bitmap_ind8(w, h))
-#define auto_bitmap_ind16_alloc(m, w, h) auto_alloc(m, bitmap_ind16(w, h))
-#define auto_bitmap_ind32_alloc(m, w, h) auto_alloc(m, bitmap_ind32(w, h))
-#define auto_bitmap_rgb32_alloc(m, w, h) auto_alloc(m, bitmap_rgb32(w, h))
-
-
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -92,12 +85,19 @@ class video_manager;
class ui_manager;
class tilemap_manager;
class debug_view_manager;
+class network_manager;
+class bookkeeping_manager;
+class configuration_manager;
+class output_manager;
+class ui_input_manager;
+class crosshair_manager;
+class image_manager;
+class rom_load_manager;
+class debugger_manager;
class osd_interface;
+enum class config_type;
-struct romload_private;
-struct ui_input_private;
struct debugcpu_private;
-struct generic_machine_private;
// ======================> system_time
@@ -140,7 +140,6 @@ class running_machine
{
DISABLE_COPYING(running_machine);
- friend void debugger_init(running_machine &machine);
friend class sound_manager;
typedef void (*logerror_callback)(const running_machine &machine, const char *string);
@@ -170,9 +169,18 @@ public:
input_manager &input() const { assert(m_input != nullptr); return *m_input; }
sound_manager &sound() const { assert(m_sound != nullptr); return *m_sound; }
video_manager &video() const { assert(m_video != nullptr); return *m_video; }
+ network_manager &network() const { assert(m_network != nullptr); return *m_network; }
+ bookkeeping_manager &bookkeeping() const { assert(m_network != nullptr); return *m_bookkeeping; }
+ configuration_manager &configuration() const { assert(m_configuration != nullptr); return *m_configuration; }
+ output_manager &output() const { assert(m_output != nullptr); return *m_output; }
ui_manager &ui() const { assert(m_ui != nullptr); return *m_ui; }
+ ui_input_manager &ui_input() const { assert(m_ui_input != nullptr); return *m_ui_input; }
+ crosshair_manager &crosshair() const { assert(m_crosshair != nullptr); return *m_crosshair; }
+ image_manager &image() const { assert(m_image != nullptr); return *m_image; }
+ rom_load_manager &rom_load() const { assert(m_rom_load != nullptr); return *m_rom_load; }
tilemap_manager &tilemap() const { assert(m_tilemap != nullptr); return *m_tilemap; }
debug_view_manager &debug_view() const { assert(m_debug_view != nullptr); return *m_debug_view; }
+ debugger_manager &debugger() const { assert(m_debugger != nullptr); return *m_debugger; }
driver_device *driver_data() const { return &downcast<driver_device &>(root_device()); }
template<class _DriverClass> _DriverClass *driver_data() const { return &downcast<_DriverClass &>(root_device()); }
machine_phase phase() const { return m_current_phase; }
@@ -221,7 +229,7 @@ public:
// watchdog control
void watchdog_reset();
void watchdog_enable(bool enable = true);
- INT32 get_vblank_watchdog_counter() { return m_watchdog_counter; }
+ INT32 get_vblank_watchdog_counter() const { return m_watchdog_counter; }
// misc
void popmessage(const char *format, ...) const;
@@ -242,22 +250,18 @@ public:
UINT32 debug_flags; // the current debug flags
// internal core information
- romload_private * romload_data; // internal data from romload.c
- ui_input_private * ui_input_data; // internal data from uiinput.c
debugcpu_private * debugcpu_data; // internal data from debugcpu.c
- generic_machine_private *generic_machine_data; // internal data from machine/generic.c
private:
// internal helpers
void start();
void set_saveload_filename(const char *filename);
- std::string get_statename(const char *statename_opt);
+ std::string get_statename(const char *statename_opt) const;
void handle_saveload();
void soft_reset(void *ptr = nullptr, INT32 param = 0);
void watchdog_fired(void *ptr = nullptr, INT32 param = 0);
void watchdog_vblank(screen_device &screen, bool vblank_state);
- const char *image_parent_basename(device_t *device);
- std::string &nvram_filename(std::string &result, device_t &device);
+ std::string nvram_filename(device_t &device) const;
void nvram_load();
void nvram_save();
@@ -278,14 +282,23 @@ private:
const game_driver & m_system; // reference to the definition of the game machine
machine_manager & m_manager; // reference to machine manager system
// managers
- std::unique_ptr<cheat_manager> m_cheat; // internal data from cheat.c
- std::unique_ptr<render_manager> m_render; // internal data from render.c
- std::unique_ptr<input_manager> m_input; // internal data from input.c
- std::unique_ptr<sound_manager> m_sound; // internal data from sound.c
- std::unique_ptr<video_manager> m_video; // internal data from video.c
- std::unique_ptr<ui_manager> m_ui; // internal data from ui.c
- std::unique_ptr<tilemap_manager> m_tilemap; // internal data from tilemap.c
- std::unique_ptr<debug_view_manager> m_debug_view; // internal data from debugvw.c
+ std::unique_ptr<cheat_manager> m_cheat; // internal data from cheat.cpp
+ std::unique_ptr<render_manager> m_render; // internal data from render.cpp
+ std::unique_ptr<input_manager> m_input; // internal data from input.cpp
+ std::unique_ptr<sound_manager> m_sound; // internal data from sound.cpp
+ std::unique_ptr<video_manager> m_video; // internal data from video.cpp
+ std::unique_ptr<ui_manager> m_ui; // internal data from ui.cpp
+ std::unique_ptr<ui_input_manager> m_ui_input; // internal data from uiinput.cpp
+ std::unique_ptr<tilemap_manager> m_tilemap; // internal data from tilemap.cpp
+ std::unique_ptr<debug_view_manager> m_debug_view; // internal data from debugvw.cpp
+ std::unique_ptr<network_manager> m_network; // internal data from network.cpp
+ std::unique_ptr<bookkeeping_manager> m_bookkeeping;// internal data from bookkeeping.cpp
+ std::unique_ptr<configuration_manager> m_configuration; // internal data from config.cpp
+ std::unique_ptr<output_manager> m_output; // internal data from output.cpp
+ std::unique_ptr<crosshair_manager> m_crosshair; // internal data from crsshair.cpp
+ std::unique_ptr<image_manager> m_image; // internal data from image.cpp
+ std::unique_ptr<rom_load_manager> m_rom_load; // internal data from romload.cpp
+ std::unique_ptr<debugger_manager> m_debugger; // internal data from debugger.cpp
// system state
machine_phase m_current_phase; // current execution phase
diff --git a/src/emu/machine/generic.cpp b/src/emu/machine/generic.cpp
deleted file mode 100644
index 2f4b94fb718..00000000000
--- a/src/emu/machine/generic.cpp
+++ /dev/null
@@ -1,289 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Nicola Salmoria
-/*********************************************************************
-
- generic.c
-
- Generic simple machine functions.
-
-*********************************************************************/
-
-#include "emu.h"
-#include "config.h"
-
-
-
-/***************************************************************************
- FUNCTION PROTOTYPES
-***************************************************************************/
-
-static void counters_load(running_machine &machine, int config_type, xml_data_node *parentnode);
-static void counters_save(running_machine &machine, int config_type, xml_data_node *parentnode);
-
-
-
-/***************************************************************************
- TYPE DEFINITIONS
-***************************************************************************/
-
-struct generic_machine_private
-{
- /* tickets and coin counters */
- UINT32 dispensed_tickets;
- UINT32 coin_count[COIN_COUNTERS];
- UINT32 coinlockedout[COIN_COUNTERS];
- UINT32 lastcoin[COIN_COUNTERS];
-};
-
-
-
-/***************************************************************************
- INITIALIZATION
-***************************************************************************/
-
-/*-------------------------------------------------
- generic_machine_init - initialize globals and
- register for save states
--------------------------------------------------*/
-
-void generic_machine_init(running_machine &machine)
-{
- generic_machine_private *state;
- int counternum;
-
- /* allocate our state */
- machine.generic_machine_data = auto_alloc_clear(machine, generic_machine_private);
- state = machine.generic_machine_data;
-
- /* reset coin counters */
- for (counternum = 0; counternum < COIN_COUNTERS; counternum++)
- {
- state->lastcoin[counternum] = 0;
- state->coinlockedout[counternum] = 0;
- }
-
- /* register coin save state */
- machine.save().save_item(NAME(state->coin_count));
- machine.save().save_item(NAME(state->coinlockedout));
- machine.save().save_item(NAME(state->lastcoin));
-
- /* register for configuration */
- config_register(machine, "counters", config_saveload_delegate(FUNC(counters_load), &machine), config_saveload_delegate(FUNC(counters_save), &machine));
-}
-
-
-
-/***************************************************************************
- TICKETS
-***************************************************************************/
-
-/*-------------------------------------------------
- get_dispensed_tickets - return the number of
- tickets dispensed
--------------------------------------------------*/
-
-int get_dispensed_tickets(running_machine &machine)
-{
- generic_machine_private *state = machine.generic_machine_data;
- return state->dispensed_tickets;
-}
-
-
-/*-------------------------------------------------
- increment_dispensed_tickets - increment the
- number of dispensed tickets
--------------------------------------------------*/
-
-void increment_dispensed_tickets(running_machine &machine, int delta)
-{
- generic_machine_private *state = machine.generic_machine_data;
- state->dispensed_tickets += delta;
-}
-
-
-
-/***************************************************************************
- COIN COUNTERS
-***************************************************************************/
-
-/*-------------------------------------------------
- counters_load - load the state of the counters
- and tickets
--------------------------------------------------*/
-
-static void counters_load(running_machine &machine, int config_type, xml_data_node *parentnode)
-{
- generic_machine_private *state = machine.generic_machine_data;
- xml_data_node *coinnode, *ticketnode;
-
- /* on init, reset the counters */
- if (config_type == CONFIG_TYPE_INIT)
- {
- memset(state->coin_count, 0, sizeof(state->coin_count));
- state->dispensed_tickets = 0;
- }
-
- /* only care about game-specific data */
- if (config_type != CONFIG_TYPE_GAME)
- return;
-
- /* might not have any data */
- if (parentnode == nullptr)
- return;
-
- /* iterate over coins nodes */
- for (coinnode = xml_get_sibling(parentnode->child, "coins"); coinnode; coinnode = xml_get_sibling(coinnode->next, "coins"))
- {
- int index = xml_get_attribute_int(coinnode, "index", -1);
- if (index >= 0 && index < COIN_COUNTERS)
- state->coin_count[index] = xml_get_attribute_int(coinnode, "number", 0);
- }
-
- /* get the single tickets node */
- ticketnode = xml_get_sibling(parentnode->child, "tickets");
- if (ticketnode != nullptr)
- state->dispensed_tickets = xml_get_attribute_int(ticketnode, "number", 0);
-}
-
-
-/*-------------------------------------------------
- counters_save - save the state of the counters
- and tickets
--------------------------------------------------*/
-
-static void counters_save(running_machine &machine, int config_type, xml_data_node *parentnode)
-{
- generic_machine_private *state = machine.generic_machine_data;
- int i;
-
- /* only care about game-specific data */
- if (config_type != CONFIG_TYPE_GAME)
- return;
-
- /* iterate over coin counters */
- for (i = 0; i < COIN_COUNTERS; i++)
- if (state->coin_count[i] != 0)
- {
- xml_data_node *coinnode = xml_add_child(parentnode, "coins", nullptr);
- if (coinnode != nullptr)
- {
- xml_set_attribute_int(coinnode, "index", i);
- xml_set_attribute_int(coinnode, "number", state->coin_count[i]);
- }
- }
-
- /* output tickets */
- if (state->dispensed_tickets != 0)
- {
- xml_data_node *tickets = xml_add_child(parentnode, "tickets", nullptr);
- if (tickets != nullptr)
- xml_set_attribute_int(tickets, "number", state->dispensed_tickets);
- }
-}
-
-
-/*-------------------------------------------------
- coin_counter_w - sets input for coin counter
--------------------------------------------------*/
-
-void coin_counter_w(running_machine &machine, int num, int on)
-{
- generic_machine_private *state = machine.generic_machine_data;
- if (num >= ARRAY_LENGTH(state->coin_count))
- return;
-
- /* Count it only if the data has changed from 0 to non-zero */
- if (on && (state->lastcoin[num] == 0))
- state->coin_count[num]++;
- state->lastcoin[num] = on;
-}
-
-
-/*-------------------------------------------------
- coin_counter_get_count - return the coin count
- for a given coin
--------------------------------------------------*/
-
-int coin_counter_get_count(running_machine &machine, int num)
-{
- generic_machine_private *state = machine.generic_machine_data;
- if (num >= ARRAY_LENGTH(state->coin_count))
- return 0;
- return state->coin_count[num];
-}
-
-
-/*-------------------------------------------------
- coin_lockout_w - locks out one coin input
--------------------------------------------------*/
-
-void coin_lockout_w(running_machine &machine, int num,int on)
-{
- generic_machine_private *state = machine.generic_machine_data;
- if (num >= ARRAY_LENGTH(state->coinlockedout))
- return;
- state->coinlockedout[num] = on;
-}
-
-
-/*-------------------------------------------------
- coin_lockout_get_state - return current lockout
- state for a particular coin
--------------------------------------------------*/
-
-int coin_lockout_get_state(running_machine &machine, int num)
-{
- generic_machine_private *state = machine.generic_machine_data;
- if (num >= ARRAY_LENGTH(state->coinlockedout))
- return FALSE;
- return state->coinlockedout[num];
-}
-
-
-/*-------------------------------------------------
- coin_lockout_global_w - locks out all the coin
- inputs
--------------------------------------------------*/
-
-void coin_lockout_global_w(running_machine &machine, int on)
-{
- generic_machine_private *state = machine.generic_machine_data;
- int i;
-
- for (i = 0; i < ARRAY_LENGTH(state->coinlockedout); i++)
- coin_lockout_w(machine, i, on);
-}
-
-
-/***************************************************************************
- LED CODE
-***************************************************************************/
-
-/*-------------------------------------------------
- set_led_status - set the state of a given LED
--------------------------------------------------*/
-
-void set_led_status(running_machine &machine, int num, int on)
-{
- output_set_led_value(num, on);
-}
-
-
-
-
-/***************************************************************************
- PORT READING HELPERS
-***************************************************************************/
-
-/*-------------------------------------------------
- custom_port_read - act like input_port_read
- but it is a custom port, it is useful for
- e.g. input ports which expect the same port
- repeated both in the upper and lower half
--------------------------------------------------*/
-
-CUSTOM_INPUT_MEMBER( driver_device::custom_port_read )
-{
- const char *tag = (const char *)param;
- return ioport(tag)->read();
-}
diff --git a/src/emu/machine/generic.h b/src/emu/machine/generic.h
deleted file mode 100644
index b724a598a9d..00000000000
--- a/src/emu/machine/generic.h
+++ /dev/null
@@ -1,69 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Nicola Salmoria
-/*********************************************************************
-
- generic.h
-
- Generic simple machine functions.
-
-*********************************************************************/
-
-#pragma once
-
-#ifndef __MACHINE_GENERIC_H__
-#define __MACHINE_GENERIC_H__
-
-
-
-/***************************************************************************
- CONSTANTS
-***************************************************************************/
-
-/* total # of coin counters */
-#define COIN_COUNTERS 8
-
-/***************************************************************************
- FUNCTION PROTOTYPES
-***************************************************************************/
-
-
-/* ----- initialization ----- */
-
-/* set up all the common systems */
-void generic_machine_init(running_machine &machine);
-
-
-
-/* ----- tickets ----- */
-
-/* return the number of tickets dispensed */
-int get_dispensed_tickets(running_machine &machine);
-
-/* increment the number of dispensed tickets */
-void increment_dispensed_tickets(running_machine &machine, int delta);
-
-
-
-/* ----- coin counters ----- */
-
-/* write to a particular coin counter (clocks on active high edge) */
-void coin_counter_w(running_machine &machine, int num, int on);
-
-/* return the coin count for a given coin */
-int coin_counter_get_count(running_machine &machine, int num);
-
-/* enable/disable coin lockout for a particular coin */
-void coin_lockout_w(running_machine &machine, int num, int on);
-
-/* return current lockout state for a particular coin */
-int coin_lockout_get_state(running_machine &machine, int num);
-
-/* enable/disable global coin lockout */
-void coin_lockout_global_w(running_machine &machine, int on);
-
-/* ----- miscellaneous bits & pieces ----- */
-
-/* set the status of an LED */
-void set_led_status(running_machine &machine, int num, int value);
-
-#endif /* __MACHINE_GENERIC_H__ */
diff --git a/src/emu/mame.cpp b/src/emu/mame.cpp
index f3ca9059a8d..e18e41329ad 100644
--- a/src/emu/mame.cpp
+++ b/src/emu/mame.cpp
@@ -167,6 +167,9 @@ int machine_manager::execute()
int error = MAMERR_NONE;
m_lua->initialize();
+ if (m_options.console()) {
+ m_lua->start_console();
+ }
while (error == MAMERR_NONE && !exit_pending)
{
m_new_driver_pending = nullptr;
@@ -194,6 +197,7 @@ int machine_manager::execute()
if (system != nullptr)
{
validity_checker valid(m_options);
+ valid.set_verbose(false);
valid.check_shared_source(*system);
}
diff --git a/src/emu/mame.h b/src/emu/mame.h
index 88be67e3eb7..eb2f510c114 100644
--- a/src/emu/mame.h
+++ b/src/emu/mame.h
@@ -55,8 +55,6 @@ public:
static const char * get_appname();
static const char * get_appname_lower();
static const char * get_configname();
- static const char * get_applongname();
- static const char * get_fulllongname();
static const char * get_capgamenoun();
static const char * get_capstartgamenoun();
static const char * get_gamenoun();
diff --git a/src/emu/mconfig.cpp b/src/emu/mconfig.cpp
index 1d3b5a2effd..6c052d7ce23 100644
--- a/src/emu/mconfig.cpp
+++ b/src/emu/mconfig.cpp
@@ -39,15 +39,16 @@ machine_config::machine_config(const game_driver &gamedrv, emu_options &options)
for (device_slot_interface *slot = slotiter.first(); slot != nullptr; slot = slotiter.next())
{
device_t &owner = slot->device();
- std::string temp;
- const char *selval = options.main_value(temp, owner.tag()+1);
+ std::string selval;
bool isdefault = (options.priority(owner.tag()+1)==OPTION_PRIORITY_DEFAULT);
- if (!is_selected_driver || !options.exists(owner.tag()+1))
- selval = slot->default_option();
+ if (is_selected_driver && options.exists(owner.tag()+1))
+ selval = options.main_value(owner.tag()+1);
+ else if (slot->default_option() != nullptr)
+ selval.assign(slot->default_option());
- if (selval != nullptr && *selval != 0)
+ if (!selval.empty())
{
- const device_slot_option *option = slot->option(selval);
+ const device_slot_option *option = slot->option(selval.c_str());
if (option && (isdefault || option->selectable()))
{
@@ -66,7 +67,7 @@ machine_config::machine_config(const game_driver &gamedrv, emu_options &options)
device_t::static_set_input_default(*new_dev, input_device_defaults);
}
else
- throw emu_fatalerror("Unknown slot option '%s' in slot '%s'", selval, owner.tag()+1);
+ throw emu_fatalerror("Unknown slot option '%s' in slot '%s'", selval.c_str(), owner.tag()+1);
}
}
diff --git a/src/emu/memory.h b/src/emu/memory.h
index e04ac52f1b4..3b46ac33449 100644
--- a/src/emu/memory.h
+++ b/src/emu/memory.h
@@ -641,9 +641,7 @@ public:
// getters
memory_share *next() const { return m_next; }
- // NOTE: this being NULL in a C++ member function can lead to undefined behavior.
- // However, it is relied on throughout MAME, so will remain for now.
- void *ptr() const { if (this == nullptr) return nullptr; return m_ptr; }
+ void *ptr() const { return m_ptr; }
size_t bytes() const { return m_bytes; }
endianness_t endianness() const { return m_endianness; }
UINT8 bitwidth() const { return m_bitwidth; }
@@ -682,9 +680,9 @@ public:
// getters
running_machine &machine() const { return m_machine; }
memory_region *next() const { return m_next; }
- UINT8 *base() { return (this != nullptr) ? &m_buffer[0] : nullptr; }
- UINT8 *end() { return (this != nullptr) ? base() + m_buffer.size() : nullptr; }
- UINT32 bytes() const { return (this != nullptr) ? m_buffer.size() : 0; }
+ UINT8 *base() { return &m_buffer[0]; }
+ UINT8 *end() { return base() + m_buffer.size(); }
+ UINT32 bytes() const { return m_buffer.size(); }
const char *name() const { return m_name.c_str(); }
// flag expansion
diff --git a/src/emu/network.cpp b/src/emu/network.cpp
index 5bcd8173618..0f5db2fd703 100644
--- a/src/emu/network.cpp
+++ b/src/emu/network.cpp
@@ -13,14 +13,29 @@
#include "config.h"
#include "xmlfile.h"
-/***************************************************************************
- INITIALIZATION HELPERS
-***************************************************************************/
+//**************************************************************************
+// NETWORK MANAGER
+//**************************************************************************
+
+//-------------------------------------------------
+// network_manager - constructor
+//-------------------------------------------------
+
+network_manager::network_manager(running_machine &machine)
+ : m_machine(machine)
+{
+ machine.configuration().config_register("network", config_saveload_delegate(FUNC(network_manager::config_load), this), config_saveload_delegate(FUNC(network_manager::config_save), this));
+}
+
+//-------------------------------------------------
+// config_load - read and apply data from the
+// configuration file
+//-------------------------------------------------
-static void network_load(running_machine &machine, int config_type, xml_data_node *parentnode)
+void network_manager::config_load(config_type cfg_type, xml_data_node *parentnode)
{
xml_data_node *node;
- if ((config_type == CONFIG_TYPE_GAME) && (parentnode != nullptr))
+ if ((cfg_type == config_type::CONFIG_TYPE_GAME) && (parentnode != nullptr))
{
for (node = xml_get_sibling(parentnode->child, "device"); node; node = xml_get_sibling(node->next, "device"))
{
@@ -28,18 +43,18 @@ static void network_load(running_machine &machine, int config_type, xml_data_nod
if ((tag != nullptr) && (tag[0] != '\0'))
{
- network_interface_iterator iter(machine.root_device());
+ network_interface_iterator iter(machine().root_device());
for (device_network_interface *network = iter.first(); network != nullptr; network = iter.next())
{
if (!strcmp(tag, network->device().tag())) {
int interface = xml_get_attribute_int(node, "interface", 0);
network->set_interface(interface);
const char *mac_addr = xml_get_attribute_string(node, "mac", nullptr);
- if (mac_addr != nullptr && strlen(mac_addr)==17) {
+ if (mac_addr != nullptr && strlen(mac_addr) == 17) {
char mac[7];
unsigned int mac_num[6];
- sscanf (mac_addr,"%02x:%02x:%02x:%02x:%02x:%02x",&mac_num[0],&mac_num[1],&mac_num[2],&mac_num[3],&mac_num[4],&mac_num[5]);
- for (int i=0;i<6;i++) mac[i]=mac_num[i];
+ sscanf(mac_addr, "%02x:%02x:%02x:%02x:%02x:%02x", &mac_num[0], &mac_num[1], &mac_num[2], &mac_num[3], &mac_num[4], &mac_num[5]);
+ for (int i = 0; i<6; i++) mac[i] = mac_num[i];
network->set_mac(mac);
}
@@ -49,15 +64,19 @@ static void network_load(running_machine &machine, int config_type, xml_data_nod
}
}
}
+//-------------------------------------------------
+// config_save - save data to the configuration
+// file
+//-------------------------------------------------
-static void network_save(running_machine &machine, int config_type, xml_data_node *parentnode)
+void network_manager::config_save(config_type cfg_type, xml_data_node *parentnode)
{
xml_data_node *node;
/* only care about game-specific data */
- if (config_type == CONFIG_TYPE_GAME)
+ if (cfg_type == config_type::CONFIG_TYPE_GAME)
{
- network_interface_iterator iter(machine.root_device());
+ network_interface_iterator iter(machine().root_device());
for (device_network_interface *network = iter.first(); network != nullptr; network = iter.next())
{
node = xml_add_child(parentnode, "device", nullptr);
@@ -66,23 +85,10 @@ static void network_save(running_machine &machine, int config_type, xml_data_nod
xml_set_attribute(node, "tag", network->device().tag());
xml_set_attribute_int(node, "interface", network->get_interface());
const char *mac = network->get_mac();
- char mac_addr[6*3];
- sprintf(mac_addr,"%02x:%02x:%02x:%02x:%02x:%02x",(UINT8)mac[0],(UINT8)mac[1],(UINT8)mac[2],(UINT8)mac[3],(UINT8)mac[4],(UINT8)mac[5]);
+ char mac_addr[6 * 3];
+ sprintf(mac_addr, "%02x:%02x:%02x:%02x:%02x:%02x", (UINT8)mac[0], (UINT8)mac[1], (UINT8)mac[2], (UINT8)mac[3], (UINT8)mac[4], (UINT8)mac[5]);
xml_set_attribute(node, "mac", mac_addr);
}
}
}
}
-
-/***************************************************************************
- INITIALIZATION
-***************************************************************************/
-
-/*-------------------------------------------------
- network_init - start up the network system
--------------------------------------------------*/
-
-void network_init(running_machine &machine)
-{
- config_register(machine, "network", config_saveload_delegate(FUNC(network_load), &machine), config_saveload_delegate(FUNC(network_save), &machine));
-}
diff --git a/src/emu/network.h b/src/emu/network.h
index fe1fec01016..41ed328c37d 100644
--- a/src/emu/network.h
+++ b/src/emu/network.h
@@ -12,6 +12,22 @@
#ifndef __NETWORK_H__
#define __NETWORK_H__
-void network_init(running_machine &machine);
+// ======================> network_manager
+
+class network_manager
+{
+public:
+ // construction/destruction
+ network_manager(running_machine &machine);
+
+ // getters
+ running_machine &machine() const { return m_machine; }
+private:
+ void config_load(config_type cfg_type, xml_data_node *parentnode);
+ void config_save(config_type cfg_type, xml_data_node *parentnode);
+
+ // internal state
+ running_machine & m_machine; // reference to our machine
+};
#endif /* __NETWORK_H__ */
diff --git a/src/emu/output.cpp b/src/emu/output.cpp
index 3977c0e809b..25d37dd4c43 100644
--- a/src/emu/output.cpp
+++ b/src/emu/output.cpp
@@ -10,93 +10,33 @@
#include "emu.h"
#include "coreutil.h"
-/***************************************************************************
- CONSTANTS
-***************************************************************************/
-
-#define HASH_SIZE 53
-
-
-
-/***************************************************************************
- TYPE DEFINITIONS
-***************************************************************************/
-
-class output_notify
-{
-public:
- output_notify(output_notifier_func callback, void *param)
- : m_next(nullptr),
- m_notifier(callback),
- m_param(param) { }
-
- output_notify *next() const { return m_next; }
-
- output_notify * m_next; /* link to next item */
- output_notifier_func m_notifier; /* callback to call */
- void * m_param; /* parameter to pass the callback */
-};
-
-
-struct output_item
-{
- output_item * next; /* next item in list */
- std::string name; /* string name of the item */
- UINT32 hash; /* hash for this item name */
- UINT32 id; /* unique ID for this item */
- INT32 value; /* current value */
- simple_list<output_notify> notifylist; /* list of notifier callbacks */
-};
-
-
-
-/***************************************************************************
- GLOBAL VARIABLES
-***************************************************************************/
-
-static output_item *itemtable[HASH_SIZE];
-static simple_list<output_notify> global_notifylist;
-static UINT32 uniqueid = 12345;
-
-
-
-/***************************************************************************
- FUNCTION PROTOTYPES
-***************************************************************************/
-
-static void output_pause(running_machine &machine);
-static void output_resume(running_machine &machine);
-static void output_exit(running_machine &machine);
-
-
-
-/***************************************************************************
- INLINE FUNCTIONS
-***************************************************************************/
+//**************************************************************************
+// OUTPUT MANAGER
+//**************************************************************************
-/*-------------------------------------------------
- get_hash - return the hash of an output value
--------------------------------------------------*/
+//-------------------------------------------------
+// output_manager - constructor
+//-------------------------------------------------
-static inline UINT32 get_hash(const char *string)
+output_manager::output_manager(running_machine &machine)
+ : m_machine(machine),
+ m_uniqueid(12345)
{
- return core_crc32(0, (UINT8 *)string, (UINT32)strlen(string));
+ /* add pause callback */
+ machine.add_notifier(MACHINE_NOTIFY_PAUSE, machine_notify_delegate(FUNC(output_manager::pause), this));
+ machine.add_notifier(MACHINE_NOTIFY_RESUME, machine_notify_delegate(FUNC(output_manager::resume), this));
}
-
/*-------------------------------------------------
find_item - find an item based on a string
-------------------------------------------------*/
-static inline output_item *find_item(const char *string)
+output_manager::output_item* output_manager::find_item(const char *string)
{
- UINT32 hash = get_hash(string);
- output_item *item;
-
/* use the hash as a starting point and find an entry */
- for (item = itemtable[hash % HASH_SIZE]; item != nullptr; item = item->next)
- if (item->hash == hash && strcmp(string, item->name.c_str()) == 0)
- return item;
+ for (auto &item : m_itemtable)
+ if (strcmp(string, item.second.name.c_str()) == 0)
+ return &item.second;
return nullptr;
}
@@ -106,85 +46,32 @@ static inline output_item *find_item(const char *string)
create_new_item - create a new item
-------------------------------------------------*/
-static inline output_item *create_new_item(const char *outname, INT32 value)
+output_manager::output_item *output_manager::create_new_item(const char *outname, INT32 value)
{
- auto item = global_alloc(output_item);
- UINT32 hash = get_hash(outname);
+ output_item item;
/* fill in the data */
- item->next = itemtable[hash % HASH_SIZE];
- item->name.assign(outname);
- item->hash = hash;
- item->id = uniqueid++;
- item->value = value;
+ item.name = outname;
+ item.id = m_uniqueid++;
+ item.value = value;
/* add us to the hash table */
- itemtable[hash % HASH_SIZE] = item;
- return item;
+ m_itemtable.insert(std::pair<std::string, output_item>(outname, item));
+ return &m_itemtable.find(outname)->second;
}
-
-
-/***************************************************************************
- CORE IMPLEMENTATION
-***************************************************************************/
-
-/*-------------------------------------------------
- output_init - initialize everything
--------------------------------------------------*/
-
-void output_init(running_machine &machine)
-{
- /* add pause callback */
- machine.add_notifier(MACHINE_NOTIFY_PAUSE, machine_notify_delegate(FUNC(output_pause), &machine));
- machine.add_notifier(MACHINE_NOTIFY_RESUME, machine_notify_delegate(FUNC(output_resume), &machine));
-
- /* get a callback when done */
- machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(output_exit), &machine));
-
- /* reset the lists */
- memset(itemtable, 0, sizeof(itemtable));
- global_notifylist.reset();
-}
-
-
/*-------------------------------------------------
output_pause - send pause message
-------------------------------------------------*/
-static void output_pause(running_machine &machine)
+void output_manager::pause()
{
- output_set_value("pause", 1);
+ set_value("pause", 1);
}
-static void output_resume(running_machine &machine)
+void output_manager::resume()
{
- output_set_value("pause", 0);
-}
-
-
-/*-------------------------------------------------
- output_exit - cleanup on exit
--------------------------------------------------*/
-
-static void output_exit(running_machine &machine)
-{
- output_item *item;
- int hash;
-
- /* remove all items */
- for (hash = 0; hash < HASH_SIZE; hash++)
- for (item = itemtable[hash]; item != nullptr; )
- {
- output_item *next = item->next;
-
- /* free the name and the item */
- global_free(item);
- item = next;
- }
-
- /* remove all global notifiers */
- global_notifylist.reset();
+ set_value("pause", 0);
}
@@ -192,7 +79,7 @@ static void output_exit(running_machine &machine)
output_set_value - set the value of an output
-------------------------------------------------*/
-void output_set_value(const char *outname, INT32 value)
+void output_manager::set_value(const char *outname, INT32 value)
{
output_item *item = find_item(outname);
INT32 oldval;
@@ -215,12 +102,12 @@ void output_set_value(const char *outname, INT32 value)
if (oldval != value)
{
/* call the local notifiers first */
- for (output_notify *notify = item->notifylist.first(); notify != nullptr; notify = notify->next())
- (*notify->m_notifier)(outname, value, notify->m_param);
+ for (auto notify : item->notifylist)
+ (*notify.m_notifier)(outname, value, notify.m_param);
/* call the global notifiers next */
- for (output_notify *notify = global_notifylist.first(); notify != nullptr; notify = notify->next())
- (*notify->m_notifier)(outname, value, notify->m_param);
+ for (auto notify : m_global_notifylist)
+ (*notify.m_notifier)(outname, value, notify.m_param);
}
}
@@ -230,7 +117,7 @@ void output_set_value(const char *outname, INT32 value)
indexed output
-------------------------------------------------*/
-void output_set_indexed_value(const char *basename, int index, int value)
+void output_manager::set_indexed_value(const char *basename, int index, int value)
{
char buffer[100];
char *dest = buffer;
@@ -247,7 +134,7 @@ void output_set_indexed_value(const char *basename, int index, int value)
*dest++ = 0;
/* set the value */
- output_set_value(buffer, value);
+ set_value(buffer, value);
}
@@ -256,7 +143,7 @@ void output_set_indexed_value(const char *basename, int index, int value)
output
-------------------------------------------------*/
-INT32 output_get_value(const char *outname)
+INT32 output_manager::get_value(const char *outname)
{
output_item *item = find_item(outname);
@@ -272,7 +159,7 @@ INT32 output_get_value(const char *outname)
indexed output
-------------------------------------------------*/
-INT32 output_get_indexed_value(const char *basename, int index)
+INT32 output_manager::get_indexed_value(const char *basename, int index)
{
char buffer[100];
char *dest = buffer;
@@ -289,7 +176,7 @@ INT32 output_get_indexed_value(const char *basename, int index)
*dest++ = 0;
/* set the value */
- return output_get_value(buffer);
+ return get_value(buffer);
}
@@ -299,8 +186,9 @@ INT32 output_get_indexed_value(const char *basename, int index)
if NULL is specified
-------------------------------------------------*/
-void output_set_notifier(const char *outname, output_notifier_func callback, void *param)
+void output_manager::set_notifier(const char *outname, output_notifier_func callback, void *param)
{
+ output_notify notify(callback, param);
/* if an item is specified, find it */
if (outname != nullptr)
{
@@ -309,10 +197,11 @@ void output_set_notifier(const char *outname, output_notifier_func callback, voi
/* if no item of that name, create a new one */
if (item == nullptr)
item = create_new_item(outname, 0);
- item->notifylist.append(*global_alloc(output_notify(callback, param)));
+
+ item->notifylist.push_back(notify);
}
else
- global_notifylist.append(*global_alloc(output_notify(callback, param)));
+ m_global_notifylist.push_back(notify);
}
@@ -321,15 +210,10 @@ void output_set_notifier(const char *outname, output_notifier_func callback, voi
notifier for all outputs
-------------------------------------------------*/
-void output_notify_all(output_notifier_func callback, void *param)
+void output_manager::notify_all(output_notifier_func callback, void *param)
{
- output_item *item;
- int hash;
-
- /* remove all items */
- for (hash = 0; hash < HASH_SIZE; hash++)
- for (item = itemtable[hash]; item != nullptr; item = item->next)
- (*callback)(item->name.c_str(), item->value, param);
+ for (auto &item : m_itemtable)
+ (*callback)(item.second.name.c_str(), item.second.value, param);
}
@@ -338,7 +222,7 @@ void output_notify_all(output_notifier_func callback, void *param)
a given name
-------------------------------------------------*/
-UINT32 output_name_to_id(const char *outname)
+UINT32 output_manager::name_to_id(const char *outname)
{
output_item *item = find_item(outname);
@@ -354,17 +238,12 @@ UINT32 output_name_to_id(const char *outname)
to a given unique ID
-------------------------------------------------*/
-const char *output_id_to_name(UINT32 id)
+const char *output_manager::id_to_name(UINT32 id)
{
- output_item *item;
- int hash;
-
- /* remove all items */
- for (hash = 0; hash < HASH_SIZE; hash++)
- for (item = itemtable[hash]; item != nullptr; item = item->next)
- if (item->id == id)
- return item->name.c_str();
+ for (auto &item : m_itemtable)
+ if (item.second.id == id)
+ return item.second.name.c_str();
- /* nothing found, return NULL */
+ /* nothing found, return nullptr */
return nullptr;
}
diff --git a/src/emu/output.h b/src/emu/output.h
index 95f8e40d821..77798c1eaf1 100644
--- a/src/emu/output.h
+++ b/src/emu/output.h
@@ -23,75 +23,83 @@
typedef void (*output_notifier_func)(const char *outname, INT32 value, void *param);
+// ======================> output_manager
-
-/***************************************************************************
- FUNCTION PROTOTYPES
-***************************************************************************/
-
-/* core initialization */
-void output_init(running_machine &machine);
-
-/* set the value for a given output */
-void output_set_value(const char *outname, INT32 value);
-
-/* set an indexed value for an output (concatenates basename + index) */
-void output_set_indexed_value(const char *basename, int index, int value);
-
-/* return the current value for a given output */
-INT32 output_get_value(const char *outname);
-
-/* return the current value for a given indexed output */
-INT32 output_get_indexed_value(const char *outname, int index);
-
-/* set a notifier on a particular output, or globally if NULL */
-void output_set_notifier(const char *outname, output_notifier_func callback, void *param);
-
-/* set a notifier on a particular output, or globally if NULL */
-void output_notify_all(output_notifier_func callback, void *param);
-
-/* map a name to a unique ID */
-UINT32 output_name_to_id(const char *outname);
-
-/* map a unique ID back to a name */
-const char *output_id_to_name(UINT32 id);
-
-
-
-/***************************************************************************
- INLINES
-***************************************************************************/
-
-static inline void output_set_led_value(int index, int value)
-{
- output_set_indexed_value("led", index, value ? 1 : 0);
-}
-
-static inline void output_set_lamp_value(int index, int value)
+class output_manager
{
- output_set_indexed_value("lamp", index, value);
-}
-
-static inline void output_set_digit_value(int index, int value)
-{
- output_set_indexed_value("digit", index, value);
-}
-
-
-static inline INT32 output_get_led_value(int index)
-{
- return output_get_indexed_value("led", index);
-}
-
-static inline INT32 output_get_lamp_value(int index)
-{
- return output_get_indexed_value("lamp", index);
-}
-
-static inline INT32 output_get_digit_value(int index)
-{
- return output_get_indexed_value("digit", index);
-}
-
-
-#endif /* __OUTPUT_H__ */
+ class output_notify
+ {
+ public:
+ output_notify(output_notifier_func callback, void *param)
+ : m_notifier(callback),
+ m_param(param) { }
+
+ output_notifier_func m_notifier; // callback to call
+ void * m_param; // parameter to pass the callback
+ };
+
+
+ class output_item
+ {
+ public:
+ std::string name; // string name of the item
+ UINT32 hash; // hash for this item name
+ UINT32 id; // unique ID for this item
+ INT32 value; // current value
+ std::vector<output_notify> notifylist; // list of notifier callbacks
+ };
+
+public:
+ // construction/destruction
+ output_manager(running_machine &machine);
+
+ // getters
+ running_machine &machine() const { return m_machine; }
+
+ // set the value for a given output
+ void set_value(const char *outname, INT32 value);
+
+ // set an indexed value for an output (concatenates basename + index)
+ void set_indexed_value(const char *basename, int index, int value);
+
+ // return the current value for a given output
+ INT32 get_value(const char *outname);
+
+ // return the current value for a given indexed output
+ INT32 get_indexed_value(const char *outname, int index);
+
+ // set a notifier on a particular output, or globally if NULL
+ void set_notifier(const char *outname, output_notifier_func callback, void *param);
+
+ // set a notifier on a particular output, or globally if NULL
+ void notify_all(output_notifier_func callback, void *param);
+
+ // map a name to a unique ID
+ UINT32 name_to_id(const char *outname);
+
+ // map a unique ID back to a name
+ const char *id_to_name(UINT32 id);
+
+
+ // helpers
+ void set_led_value(int index, int value) { set_indexed_value("led", index, value ? 1 : 0); }
+ void set_lamp_value(int index, int value) { set_indexed_value("lamp", index, value); }
+ void set_digit_value(int index, int value) { set_indexed_value("digit", index, value); }
+ INT32 get_led_value(int index) { return get_indexed_value("led", index); }
+ INT32 get_lamp_value(int index) { return get_indexed_value("lamp", index); }
+ INT32 get_digit_value(int index) { return get_indexed_value("digit", index); }
+
+ void pause();
+ void resume();
+private:
+ output_item *find_item(const char *string);
+ output_item *create_new_item(const char *outname, INT32 value);
+
+ // internal state
+ running_machine & m_machine; // reference to our machine
+ std::unordered_map<std::string,output_item> m_itemtable;
+ std::vector<output_notify> m_global_notifylist;
+ UINT32 m_uniqueid;
+};
+
+#endif // __OUTPUT_H__
diff --git a/src/emu/render.cpp b/src/emu/render.cpp
index 0f9bc97d77d..baa5aa8db1b 100644
--- a/src/emu/render.cpp
+++ b/src/emu/render.cpp
@@ -1423,8 +1423,6 @@ void render_target::invalidate_all(void *refptr)
// iterate through all our primitive lists
for (auto & list : m_primlist)
{
-
-
// if we have a reference to this object, release our list
list.acquire_lock();
if (list.has_reference(refptr))
@@ -1456,13 +1454,13 @@ void render_target::debug_free(render_container &container)
//-------------------------------------------------
-// debug_top - move a debug view container to
-// the top of the list
+// debug_append - move a debug view container to
+// the end of the list
//-------------------------------------------------
-void render_target::debug_top(render_container &container)
+void render_target::debug_append(render_container &container)
{
- m_debug_containers.prepend(m_debug_containers.detach(container));
+ m_debug_containers.append(m_debug_containers.detach(container));
}
@@ -2405,7 +2403,7 @@ render_manager::render_manager(running_machine &machine)
m_ui_container(global_alloc(render_container(*this)))
{
// register callbacks
- config_register(machine, "video", config_saveload_delegate(FUNC(render_manager::config_load), this), config_saveload_delegate(FUNC(render_manager::config_save), this));
+ machine.configuration().config_register("video", config_saveload_delegate(FUNC(render_manager::config_load), this), config_saveload_delegate(FUNC(render_manager::config_save), this));
// create one container per screen
screen_device_iterator iter(machine.root_device());
@@ -2652,10 +2650,10 @@ void render_manager::container_free(render_container *container)
// configuration file
//-------------------------------------------------
-void render_manager::config_load(int config_type, xml_data_node *parentnode)
+void render_manager::config_load(config_type cfg_type, xml_data_node *parentnode)
{
// we only care about game files
- if (config_type != CONFIG_TYPE_GAME)
+ if (cfg_type != config_type::CONFIG_TYPE_GAME)
return;
// might not have any data
@@ -2711,10 +2709,10 @@ void render_manager::config_load(int config_type, xml_data_node *parentnode)
// file
//-------------------------------------------------
-void render_manager::config_save(int config_type, xml_data_node *parentnode)
+void render_manager::config_save(config_type cfg_type, xml_data_node *parentnode)
{
// we only care about game files
- if (config_type != CONFIG_TYPE_GAME)
+ if (cfg_type != config_type::CONFIG_TYPE_GAME)
return;
// write out the interface target
diff --git a/src/emu/render.h b/src/emu/render.h
index e4136ded0d1..df8896b712b 100644
--- a/src/emu/render.h
+++ b/src/emu/render.h
@@ -942,7 +942,7 @@ public:
// debug containers
render_container *debug_alloc();
void debug_free(render_container &container);
- void debug_top(render_container &container);
+ void debug_append(render_container &container);
// resolve tag lookups
void resolve_tags();
@@ -1057,8 +1057,8 @@ private:
void container_free(render_container *container);
// config callbacks
- void config_load(int config_type, xml_data_node *parentnode);
- void config_save(int config_type, xml_data_node *parentnode);
+ void config_load(config_type cfg_type, xml_data_node *parentnode);
+ void config_save(config_type cfg_type, xml_data_node *parentnode);
// internal state
running_machine & m_machine; // reference back to the machine
diff --git a/src/emu/rendlay.cpp b/src/emu/rendlay.cpp
index 582ed75fef2..a69ea831e44 100644
--- a/src/emu/rendlay.cpp
+++ b/src/emu/rendlay.cpp
@@ -2364,7 +2364,7 @@ layout_view::item::item(running_machine &machine, xml_data_node &itemnode, simpl
}
m_input_mask = xml_get_attribute_int_with_subst(machine, itemnode, "inputmask", 0);
if (m_output_name[0] != 0 && m_element != nullptr)
- output_set_value(m_output_name.c_str(), m_element->default_state());
+ machine.output().set_value(m_output_name.c_str(), m_element->default_state());
parse_bounds(machine, xml_get_sibling(itemnode.child, "bounds"), m_rawbounds);
parse_color(machine, xml_get_sibling(itemnode.child, "color"), m_color);
parse_orientation(machine, xml_get_sibling(itemnode.child, "orientation"), m_orientation);
@@ -2420,7 +2420,7 @@ int layout_view::item::state() const
// if configured to an output, fetch the output value
if (m_output_name[0] != 0)
- state = output_get_value(m_output_name.c_str());
+ state = m_element->machine().output().get_value(m_output_name.c_str());
// if configured to an input, fetch the input value
else if (m_input_tag[0] != 0)
diff --git a/src/emu/romload.cpp b/src/emu/romload.cpp
index c5de902a482..28cc994402c 100644
--- a/src/emu/romload.cpp
+++ b/src/emu/romload.cpp
@@ -10,7 +10,6 @@
#include "emu.h"
#include "emuopts.h"
#include "drivenum.h"
-#include "chd.h"
#include "softlist.h"
#include "ui/ui.h"
@@ -25,71 +24,11 @@
#define TEMPBUFFER_MAX_SIZE (1024 * 1024 * 1024)
-
-
/***************************************************************************
- TYPE DEFINITIONS
-***************************************************************************/
-
-class open_chd
-{
- friend class simple_list<open_chd>;
-
-public:
- open_chd(const char *region)
- : m_next(nullptr),
- m_region(region) { }
-
- open_chd *next() const { return m_next; }
- const char *region() const { return m_region.c_str(); }
- chd_file &chd() { return m_diffchd.opened() ? m_diffchd : m_origchd; }
- chd_file &orig_chd() { return m_origchd; }
- chd_file &diff_chd() { return m_diffchd; }
-
-private:
- open_chd * m_next; /* pointer to next in the list */
- std::string m_region; /* disk region we came from */
- chd_file m_origchd; /* handle to the original CHD */
- chd_file m_diffchd; /* handle to the diff CHD */
-};
-
-
-struct romload_private
-{
- running_machine &machine() const { assert(m_machine != nullptr); return *m_machine; }
-
- running_machine *m_machine; /* machine object where needed */
-
- int warnings; /* warning count during processing */
- int knownbad; /* BAD_DUMP/NO_DUMP count during processing */
- int errors; /* error count during processing */
-
- int romsloaded; /* current ROMs loaded count */
- int romstotal; /* total number of ROMs to read */
- UINT32 romsloadedsize; /* total size of ROMs loaded so far */
- UINT32 romstotalsize; /* total size of ROMs to read */
-
- emu_file * file; /* current file */
- simple_list<open_chd> chd_list; /* disks */
-
- memory_region * region; /* info about current region */
-
- std::string errorstring; /* error string */
- std::string softwarningstring; /* software warning string */
-};
-
-
-/***************************************************************************
- FUNCTION PROTOTYPES
-***************************************************************************/
-
-static void rom_exit(running_machine &machine);
-
-/***************************************************************************
- HELPERS (also used by devimage.c)
+ HELPERS (also used by diimage.cpp)
***************************************************************************/
-file_error common_process_file(emu_options &options, const char *location, const char *ext, const rom_entry *romp, emu_file &image_file)
+static file_error common_process_file(emu_options &options, const char *location, const char *ext, const rom_entry *romp, emu_file &image_file)
{
file_error filerr;
@@ -101,61 +40,22 @@ file_error common_process_file(emu_options &options, const char *location, const
return filerr;
}
-file_error common_process_file(emu_options &options, const char *location, bool has_crc, UINT32 crc, const rom_entry *romp, emu_file **image_file)
+std::unique_ptr<emu_file> common_process_file(emu_options &options, const char *location, bool has_crc, UINT32 crc, const rom_entry *romp, file_error &filerr)
{
- *image_file = global_alloc(emu_file(options.media_path(), OPEN_FLAG_READ));
- file_error filerr;
+ auto image_file = std::make_unique<emu_file>(options.media_path(), OPEN_FLAG_READ);
if (has_crc)
- filerr = (*image_file)->open(location, PATH_SEPARATOR, ROM_GETNAME(romp), crc);
+ filerr = image_file->open(location, PATH_SEPARATOR, ROM_GETNAME(romp), crc);
else
- filerr = (*image_file)->open(location, PATH_SEPARATOR, ROM_GETNAME(romp));
+ filerr = image_file->open(location, PATH_SEPARATOR, ROM_GETNAME(romp));
if (filerr != FILERR_NONE)
{
- global_free(*image_file);
- *image_file = nullptr;
+ image_file = nullptr;
}
- return filerr;
+ return image_file;
}
-
-/***************************************************************************
- HARD DISK HANDLING
-***************************************************************************/
-
-/*-------------------------------------------------
- get_disk_handle - return a pointer to the
- CHD file associated with the given region
--------------------------------------------------*/
-
-chd_file *get_disk_handle(running_machine &machine, const char *region)
-{
- for (open_chd *curdisk = machine.romload_data->chd_list.first(); curdisk != nullptr; curdisk = curdisk->next())
- if (strcmp(curdisk->region(), region) == 0)
- return &curdisk->chd();
- return nullptr;
-}
-
-
-/*-------------------------------------------------
- set_disk_handle - set a pointer to the CHD
- file associated with the given region
--------------------------------------------------*/
-
-int set_disk_handle(running_machine &machine, const char *region, const char *fullpath)
-{
- auto chd = global_alloc(open_chd(region));
- chd_error err = chd->orig_chd().open(fullpath);
- if (err == CHDERR_NONE)
- machine.romload_data->chd_list.append(*chd);
- else
- global_free(chd);
- return err;
-}
-
-
-
/***************************************************************************
ROM LOADING
***************************************************************************/
@@ -328,12 +228,44 @@ static void CLIB_DECL ATTR_PRINTF(1,2) debugload(const char *string, ...)
}
+/***************************************************************************
+ HARD DISK HANDLING
+***************************************************************************/
+
+/*-------------------------------------------------
+ get_disk_handle - return a pointer to the
+ CHD file associated with the given region
+-------------------------------------------------*/
+
+chd_file *rom_load_manager::get_disk_handle(const char *region)
+{
+ for (auto &curdisk : m_chd_list)
+ if (strcmp(curdisk->region(), region) == 0)
+ return &curdisk->chd();
+ return nullptr;
+}
+
+
+/*-------------------------------------------------
+ set_disk_handle - set a pointer to the CHD
+ file associated with the given region
+-------------------------------------------------*/
+
+int rom_load_manager::set_disk_handle(const char *region, const char *fullpath)
+{
+ auto chd = std::make_unique<open_chd>(region);
+ auto err = chd->orig_chd().open(fullpath);
+ if (err == CHDERR_NONE)
+ m_chd_list.push_back(std::move(chd));
+ return err;
+}
+
/*-------------------------------------------------
determine_bios_rom - determine system_bios
from SystemBios structure and OPTION_BIOS
-------------------------------------------------*/
-static void determine_bios_rom(romload_private *romdata, device_t *device, const char *specbios)
+void rom_load_manager::determine_bios_rom(device_t *device, const char *specbios)
{
const char *defaultname = nullptr;
const rom_entry *rom;
@@ -368,10 +300,10 @@ static void determine_bios_rom(romload_private *romdata, device_t *device, const
if (device->system_bios() == 0 && bios_count > 0)
{
/* if we got neither an empty string nor 'default' then warn the user */
- if (specbios[0] != 0 && strcmp(specbios, "default") != 0 && romdata != nullptr)
+ if (specbios[0] != 0 && strcmp(specbios, "default") != 0)
{
- strcatprintf(romdata->errorstring, "%s: invalid bios\n", specbios);
- romdata->errors++;
+ strcatprintf(m_errorstring, "%s: invalid bios\n", specbios);
+ m_errors++;
}
/* set to default */
@@ -387,23 +319,23 @@ static void determine_bios_rom(romload_private *romdata, device_t *device, const
that will need to be loaded
-------------------------------------------------*/
-static void count_roms(romload_private *romdata)
+void rom_load_manager::count_roms()
{
const rom_entry *region, *rom;
/* start with 0 */
- romdata->romstotal = 0;
- romdata->romstotalsize = 0;
+ m_romstotal = 0;
+ m_romstotalsize = 0;
/* loop over regions, then over files */
- device_iterator deviter(romdata->machine().config().root_device());
+ device_iterator deviter(machine().config().root_device());
for (device_t *device = deviter.first(); device != nullptr; device = deviter.next())
for (region = rom_first_region(*device); region != nullptr; region = rom_next_region(region))
for (rom = rom_first_file(region); rom != nullptr; rom = rom_next_file(rom))
if (ROM_GETBIOSFLAGS(rom) == 0 || ROM_GETBIOSFLAGS(rom) == device->system_bios())
{
- romdata->romstotal++;
- romdata->romstotalsize += rom_file_size(rom);
+ m_romstotal++;
+ m_romstotalsize += rom_file_size(rom);
}
}
@@ -413,10 +345,10 @@ static void count_roms(romload_private *romdata)
random data
-------------------------------------------------*/
-static void fill_random(running_machine &machine, UINT8 *base, UINT32 length)
+void rom_load_manager::fill_random(UINT8 *base, UINT32 length)
{
while (length--)
- *base++ = machine.rand();
+ *base++ = machine().rand();
}
@@ -425,7 +357,7 @@ static void fill_random(running_machine &machine, UINT8 *base, UINT32 length)
for missing files
-------------------------------------------------*/
-static void handle_missing_file(romload_private *romdata, const rom_entry *romp, std::string tried_file_names, chd_error chderr)
+void rom_load_manager::handle_missing_file(const rom_entry *romp, std::string tried_file_names, chd_error chderr)
{
if(tried_file_names.length() != 0)
tried_file_names = " (tried in " + tried_file_names + ")";
@@ -438,30 +370,30 @@ static void handle_missing_file(romload_private *romdata, const rom_entry *romp,
bool is_chd_error = (is_chd && chderr != CHDERR_FILE_NOT_FOUND);
if (is_chd_error)
- strcatprintf(romdata->errorstring, "%s CHD ERROR: %s\n", name.c_str(), chd_file::error_string(chderr));
+ strcatprintf(m_errorstring, "%s CHD ERROR: %s\n", name.c_str(), chd_file::error_string(chderr));
/* optional files are okay */
if (ROM_ISOPTIONAL(romp))
{
if (!is_chd_error)
- strcatprintf(romdata->errorstring, "OPTIONAL %s NOT FOUND%s\n", name.c_str(), tried_file_names.c_str());
- romdata->warnings++;
+ strcatprintf(m_errorstring, "OPTIONAL %s NOT FOUND%s\n", name.c_str(), tried_file_names.c_str());
+ m_warnings++;
}
/* no good dumps are okay */
else if (hash_collection(ROM_GETHASHDATA(romp)).flag(hash_collection::FLAG_NO_DUMP))
{
if (!is_chd_error)
- strcatprintf(romdata->errorstring, "%s NOT FOUND (NO GOOD DUMP KNOWN)%s\n", name.c_str(), tried_file_names.c_str());
- romdata->knownbad++;
+ strcatprintf(m_errorstring, "%s NOT FOUND (NO GOOD DUMP KNOWN)%s\n", name.c_str(), tried_file_names.c_str());
+ m_knownbad++;
}
/* anything else is bad */
else
{
if (!is_chd_error)
- strcatprintf(romdata->errorstring, "%s NOT FOUND%s\n", name.c_str(), tried_file_names.c_str());
- romdata->errors++;
+ strcatprintf(m_errorstring, "%s NOT FOUND%s\n", name.c_str(), tried_file_names.c_str());
+ m_errors++;
}
}
@@ -472,11 +404,10 @@ static void handle_missing_file(romload_private *romdata, const rom_entry *romp,
correct checksums for a given ROM
-------------------------------------------------*/
-static void dump_wrong_and_correct_checksums(romload_private *romdata, const hash_collection &hashes, const hash_collection &acthashes)
+void rom_load_manager::dump_wrong_and_correct_checksums(const hash_collection &hashes, const hash_collection &acthashes)
{
- std::string tempstr;
- strcatprintf(romdata->errorstring, " EXPECTED: %s\n", hashes.macro_string(tempstr));
- strcatprintf(romdata->errorstring, " FOUND: %s\n", acthashes.macro_string(tempstr));
+ strcatprintf(m_errorstring, " EXPECTED: %s\n", hashes.macro_string().c_str());
+ strcatprintf(m_errorstring, " FOUND: %s\n", acthashes.macro_string().c_str());
}
@@ -485,41 +416,40 @@ static void dump_wrong_and_correct_checksums(romload_private *romdata, const has
and hash signatures of a file
-------------------------------------------------*/
-static void verify_length_and_hash(romload_private *romdata, const char *name, UINT32 explength, const hash_collection &hashes)
+void rom_load_manager::verify_length_and_hash(const char *name, UINT32 explength, const hash_collection &hashes)
{
/* we've already complained if there is no file */
- if (romdata->file == nullptr)
+ if (m_file == nullptr)
return;
/* verify length */
- UINT32 actlength = romdata->file->size();
+ UINT32 actlength = m_file->size();
if (explength != actlength)
{
- strcatprintf(romdata->errorstring, "%s WRONG LENGTH (expected: %08x found: %08x)\n", name, explength, actlength);
- romdata->warnings++;
+ strcatprintf(m_errorstring, "%s WRONG LENGTH (expected: %08x found: %08x)\n", name, explength, actlength);
+ m_warnings++;
}
/* If there is no good dump known, write it */
- std::string tempstr;
- hash_collection &acthashes = romdata->file->hashes(hashes.hash_types(tempstr));
+ hash_collection &acthashes = m_file->hashes(hashes.hash_types().c_str());
if (hashes.flag(hash_collection::FLAG_NO_DUMP))
{
- strcatprintf(romdata->errorstring, "%s NO GOOD DUMP KNOWN\n", name);
- romdata->knownbad++;
+ strcatprintf(m_errorstring, "%s NO GOOD DUMP KNOWN\n", name);
+ m_knownbad++;
}
/* verify checksums */
else if (hashes != acthashes)
{
/* otherwise, it's just bad */
- strcatprintf(romdata->errorstring, "%s WRONG CHECKSUMS:\n", name);
- dump_wrong_and_correct_checksums(romdata, hashes, acthashes);
- romdata->warnings++;
+ strcatprintf(m_errorstring, "%s WRONG CHECKSUMS:\n", name);
+ dump_wrong_and_correct_checksums(hashes, acthashes);
+ m_warnings++;
}
/* If it matches, but it is actually a bad dump, write it */
else if (hashes.flag(hash_collection::FLAG_BAD_DUMP))
{
- strcatprintf(romdata->errorstring, "%s ROM NEEDS REDUMP\n",name);
- romdata->knownbad++;
+ strcatprintf(m_errorstring, "%s ROM NEEDS REDUMP\n",name);
+ m_knownbad++;
}
}
@@ -529,17 +459,17 @@ static void verify_length_and_hash(romload_private *romdata, const char *name, U
messages about ROM loading to the user
-------------------------------------------------*/
-static void display_loading_rom_message(romload_private *romdata, const char *name, bool from_list)
+void rom_load_manager::display_loading_rom_message(const char *name, bool from_list)
{
char buffer[200];
if (name != nullptr)
- sprintf(buffer, "Loading %s (%d%%)", from_list ? "Software" : emulator_info::get_capstartgamenoun(), (UINT32)(100 * (UINT64)romdata->romsloadedsize / (UINT64)romdata->romstotalsize));
+ sprintf(buffer, "Loading %s (%d%%)", from_list ? "Software" : emulator_info::get_capstartgamenoun(), (UINT32)(100 * (UINT64)m_romsloadedsize / (UINT64)m_romstotalsize));
else
sprintf(buffer, "Loading Complete");
- if (!romdata->machine().ui().is_menu_active())
- romdata->machine().ui().set_startup_text(buffer, false);
+ if (!machine().ui().is_menu_active())
+ machine().ui().set_startup_text(buffer, false);
}
@@ -548,26 +478,26 @@ static void display_loading_rom_message(romload_private *romdata, const char *na
results of ROM loading
-------------------------------------------------*/
-static void display_rom_load_results(romload_private *romdata, bool from_list)
+void rom_load_manager::display_rom_load_results(bool from_list)
{
/* final status display */
- display_loading_rom_message(romdata, nullptr, from_list);
+ display_loading_rom_message(nullptr, from_list);
/* if we had errors, they are fatal */
- if (romdata->errors != 0)
+ if (m_errors != 0)
{
/* create the error message and exit fatally */
- osd_printf_error("%s", romdata->errorstring.c_str());
- fatalerror_exitcode(romdata->machine(), MAMERR_MISSING_FILES, "Required files are missing, the %s cannot be run.",emulator_info::get_gamenoun());
+ osd_printf_error("%s", m_errorstring.c_str());
+ fatalerror_exitcode(machine(), MAMERR_MISSING_FILES, "Required files are missing, the %s cannot be run.",emulator_info::get_gamenoun());
}
/* if we had warnings, output them, but continue */
- if ((romdata-> warnings) || (romdata->knownbad))
+ if ((m_warnings) || (m_knownbad))
{
- romdata->errorstring.append("WARNING: the ");
- romdata->errorstring.append(emulator_info::get_gamenoun());
- romdata->errorstring.append(" might not run correctly.");
- osd_printf_warning("%s\n", romdata->errorstring.c_str());
+ m_errorstring.append("WARNING: the ");
+ m_errorstring.append(emulator_info::get_gamenoun());
+ m_errorstring.append(" might not run correctly.");
+ osd_printf_warning("%s\n", m_errorstring.c_str());
}
}
@@ -577,9 +507,9 @@ static void display_rom_load_results(romload_private *romdata, bool from_list)
byte swapping and inverting data as necessary
-------------------------------------------------*/
-static void region_post_process(romload_private *romdata, const char *rgntag, bool invert)
+void rom_load_manager::region_post_process(const char *rgntag, bool invert)
{
- memory_region *region = romdata->machine().root_device().memregion(rgntag);
+ memory_region *region = machine().root_device().memregion(rgntag);
UINT8 *base;
int i, j;
@@ -619,14 +549,14 @@ static void region_post_process(romload_private *romdata, const char *rgntag, bo
up the parent and loading by checksum
-------------------------------------------------*/
-static int open_rom_file(romload_private *romdata, const char *regiontag, const rom_entry *romp, std::string &tried_file_names, bool from_list)
+int rom_load_manager::open_rom_file(const char *regiontag, const rom_entry *romp, std::string &tried_file_names, bool from_list)
{
file_error filerr = FILERR_NOT_FOUND;
UINT32 romsize = rom_file_size(romp);
tried_file_names = "";
/* update status display */
- display_loading_rom_message(romdata, ROM_GETNAME(romp), from_list);
+ display_loading_rom_message(ROM_GETNAME(romp), from_list);
/* extract CRC to use for searching */
UINT32 crc = 0;
@@ -634,16 +564,16 @@ static int open_rom_file(romload_private *romdata, const char *regiontag, const
/* attempt reading up the chain through the parents. It automatically also
attempts any kind of load by checksum supported by the archives. */
- romdata->file = nullptr;
- for (int drv = driver_list::find(romdata->machine().system()); romdata->file == nullptr && drv != -1; drv = driver_list::clone(drv)) {
+ m_file = nullptr;
+ for (int drv = driver_list::find(machine().system()); m_file == nullptr && drv != -1; drv = driver_list::clone(drv)) {
if (tried_file_names.length() != 0)
tried_file_names += " ";
tried_file_names += driver_list::driver(drv).name;
- filerr = common_process_file(romdata->machine().options(), driver_list::driver(drv).name, has_crc, crc, romp, &romdata->file);
+ m_file = common_process_file(machine().options(), driver_list::driver(drv).name, has_crc, crc, romp, filerr);
}
/* if the region is load by name, load the ROM from there */
- if (romdata->file == nullptr && regiontag != nullptr)
+ if (m_file == nullptr && regiontag != nullptr)
{
// check if we are dealing with softwarelists. if so, locationtag
// is actually a concatenation of: listname + setname + parentname
@@ -692,40 +622,40 @@ static int open_rom_file(romload_private *romdata, const char *regiontag, const
if (!is_list)
{
tried_file_names += " " + tag1;
- filerr = common_process_file(romdata->machine().options(), tag1.c_str(), has_crc, crc, romp, &romdata->file);
+ m_file = common_process_file(machine().options(), tag1.c_str(), has_crc, crc, romp, filerr);
}
else
{
// try to load from list/setname
- if ((romdata->file == nullptr) && (tag2.c_str() != nullptr))
+ if ((m_file == nullptr) && (tag2.c_str() != nullptr))
{
tried_file_names += " " + tag2;
- filerr = common_process_file(romdata->machine().options(), tag2.c_str(), has_crc, crc, romp, &romdata->file);
+ m_file = common_process_file(machine().options(), tag2.c_str(), has_crc, crc, romp, filerr);
}
// try to load from list/parentname
- if ((romdata->file == nullptr) && has_parent && (tag3.c_str() != nullptr))
+ if ((m_file == nullptr) && has_parent && (tag3.c_str() != nullptr))
{
tried_file_names += " " + tag3;
- filerr = common_process_file(romdata->machine().options(), tag3.c_str(), has_crc, crc, romp, &romdata->file);
+ m_file = common_process_file(machine().options(), tag3.c_str(), has_crc, crc, romp, filerr);
}
// try to load from setname
- if ((romdata->file == nullptr) && (tag4.c_str() != nullptr))
+ if ((m_file == nullptr) && (tag4.c_str() != nullptr))
{
tried_file_names += " " + tag4;
- filerr = common_process_file(romdata->machine().options(), tag4.c_str(), has_crc, crc, romp, &romdata->file);
+ m_file = common_process_file(machine().options(), tag4.c_str(), has_crc, crc, romp, filerr);
}
// try to load from parentname
- if ((romdata->file == nullptr) && has_parent && (tag5.c_str() != nullptr))
+ if ((m_file == nullptr) && has_parent && (tag5.c_str() != nullptr))
{
tried_file_names += " " + tag5;
- filerr = common_process_file(romdata->machine().options(), tag5.c_str(), has_crc, crc, romp, &romdata->file);
+ m_file = common_process_file(machine().options(), tag5.c_str(), has_crc, crc, romp, filerr);
}
}
}
/* update counters */
- romdata->romsloaded++;
- romdata->romsloadedsize += romsize;
+ m_romsloaded++;
+ m_romsloadedsize += romsize;
/* return the result */
return (filerr == FILERR_NONE);
@@ -737,15 +667,15 @@ static int open_rom_file(romload_private *romdata, const char *regiontag, const
random data for a NULL file
-------------------------------------------------*/
-static int rom_fread(romload_private *romdata, UINT8 *buffer, int length, const rom_entry *parent_region)
+int rom_load_manager::rom_fread(UINT8 *buffer, int length, const rom_entry *parent_region)
{
/* files just pass through */
- if (romdata->file != nullptr)
- return romdata->file->read(buffer, length);
+ if (m_file != nullptr)
+ return m_file->read(buffer, length);
/* otherwise, fill with randomness unless it was already specifically erased */
else if (!ROMREGION_ISERASE(parent_region))
- fill_random(romdata->machine(), buffer, length);
+ fill_random(buffer, length);
return length;
}
@@ -756,7 +686,7 @@ static int rom_fread(romload_private *romdata, UINT8 *buffer, int length, const
entry
-------------------------------------------------*/
-static int read_rom_data(romload_private *romdata, const rom_entry *parent_region, const rom_entry *romp)
+int rom_load_manager::read_rom_data(const rom_entry *parent_region, const rom_entry *romp)
{
int datashift = ROM_GETBITSHIFT(romp);
int datamask = ((1 << ROM_GETBITWIDTH(romp)) - 1) << datashift;
@@ -765,7 +695,7 @@ static int read_rom_data(romload_private *romdata, const rom_entry *parent_regio
int skip = ROM_GETSKIPCOUNT(romp);
int reversed = ROM_ISREVERSED(romp);
int numgroups = (numbytes + groupsize - 1) / groupsize;
- UINT8 *base = romdata->region->base() + ROM_GETOFFSET(romp);
+ UINT8 *base = m_region->base() + ROM_GETOFFSET(romp);
UINT32 tempbufsize;
int i;
@@ -776,7 +706,7 @@ static int read_rom_data(romload_private *romdata, const rom_entry *parent_regio
osd_printf_warning("Warning in RomModule definition: %s length not an even multiple of group size\n", ROM_GETNAME(romp));
/* make sure we only fill within the region space */
- if (ROM_GETOFFSET(romp) + numgroups * groupsize + (numgroups - 1) * skip > romdata->region->bytes())
+ if (ROM_GETOFFSET(romp) + numgroups * groupsize + (numgroups - 1) * skip > m_region->bytes())
fatalerror("Error in RomModule definition: %s out of memory region space\n", ROM_GETNAME(romp));
/* make sure the length was valid */
@@ -785,7 +715,7 @@ static int read_rom_data(romload_private *romdata, const rom_entry *parent_regio
/* special case for simple loads */
if (datamask == 0xff && (groupsize == 1 || !reversed) && skip == 0)
- return rom_fread(romdata, base, numbytes, parent_region);
+ return rom_fread(base, numbytes, parent_region);
/* use a temporary buffer for complex loads */
tempbufsize = MIN(TEMPBUFFER_MAX_SIZE, numbytes);
@@ -801,7 +731,7 @@ static int read_rom_data(romload_private *romdata, const rom_entry *parent_regio
/* read as much as we can */
LOG((" Reading %X bytes into buffer\n", bytesleft));
- if (rom_fread(romdata, bufptr, bytesleft, parent_region) != bytesleft)
+ if (rom_fread(bufptr, bytesleft, parent_region) != bytesleft)
return 0;
numbytes -= bytesleft;
@@ -871,13 +801,13 @@ static int read_rom_data(romload_private *romdata, const rom_entry *parent_regio
fill_rom_data - fill a region of ROM space
-------------------------------------------------*/
-static void fill_rom_data(romload_private *romdata, const rom_entry *romp)
+void rom_load_manager::fill_rom_data(const rom_entry *romp)
{
UINT32 numbytes = ROM_GETLENGTH(romp);
- UINT8 *base = romdata->region->base() + ROM_GETOFFSET(romp);
+ UINT8 *base = m_region->base() + ROM_GETOFFSET(romp);
/* make sure we fill within the region space */
- if (ROM_GETOFFSET(romp) + numbytes > romdata->region->bytes())
+ if (ROM_GETOFFSET(romp) + numbytes > m_region->bytes())
fatalerror("Error in RomModule definition: FILL out of memory region space\n");
/* make sure the length was valid */
@@ -893,15 +823,15 @@ static void fill_rom_data(romload_private *romdata, const rom_entry *romp)
copy_rom_data - copy a region of ROM space
-------------------------------------------------*/
-static void copy_rom_data(romload_private *romdata, const rom_entry *romp)
+void rom_load_manager::copy_rom_data(const rom_entry *romp)
{
- UINT8 *base = romdata->region->base() + ROM_GETOFFSET(romp);
+ UINT8 *base = m_region->base() + ROM_GETOFFSET(romp);
const char *srcrgntag = ROM_GETNAME(romp);
UINT32 numbytes = ROM_GETLENGTH(romp);
UINT32 srcoffs = (FPTR)ROM_GETHASHDATA(romp); /* srcoffset in place of hashdata */
/* make sure we copy within the region space */
- if (ROM_GETOFFSET(romp) + numbytes > romdata->region->bytes())
+ if (ROM_GETOFFSET(romp) + numbytes > m_region->bytes())
fatalerror("Error in RomModule definition: COPY out of target memory region space\n");
/* make sure the length was valid */
@@ -909,7 +839,7 @@ static void copy_rom_data(romload_private *romdata, const rom_entry *romp)
fatalerror("Error in RomModule definition: COPY has an invalid length\n");
/* make sure the source was valid */
- memory_region *region = romdata->machine().root_device().memregion(srcrgntag);
+ memory_region *region = machine().root_device().memregion(srcrgntag);
if (region == nullptr)
fatalerror("Error in RomModule definition: COPY from an invalid region\n");
@@ -927,7 +857,7 @@ static void copy_rom_data(romload_private *romdata, const rom_entry *romp)
for a region
-------------------------------------------------*/
-static void process_rom_entries(romload_private *romdata, const char *regiontag, const rom_entry *parent_region, const rom_entry *romp, device_t *device, bool from_list)
+void rom_load_manager::process_rom_entries(const char *regiontag, const rom_entry *parent_region, const rom_entry *romp, device_t *device, bool from_list)
{
UINT32 lastflags = 0;
@@ -948,11 +878,11 @@ static void process_rom_entries(romload_private *romdata, const char *regiontag,
/* handle fills */
if (ROMENTRY_ISFILL(romp))
- fill_rom_data(romdata, romp++);
+ fill_rom_data(romp++);
/* handle copies */
else if (ROMENTRY_ISCOPY(romp))
- copy_rom_data(romdata, romp++);
+ copy_rom_data(romp++);
/* handle files */
else if (ROMENTRY_ISFILE(romp))
@@ -964,8 +894,8 @@ static void process_rom_entries(romload_private *romdata, const char *regiontag,
/* open the file if it is a non-BIOS or matches the current BIOS */
LOG(("Opening ROM file: %s\n", ROM_GETNAME(romp)));
std::string tried_file_names;
- if (!irrelevantbios && !open_rom_file(romdata, regiontag, romp, tried_file_names, from_list))
- handle_missing_file(romdata, romp, tried_file_names, CHDERR_NONE);
+ if (!irrelevantbios && !open_rom_file(regiontag, romp, tried_file_names, from_list))
+ handle_missing_file(romp, tried_file_names, CHDERR_NONE);
/* loop until we run out of reloads */
do
@@ -986,7 +916,7 @@ static void process_rom_entries(romload_private *romdata, const char *regiontag,
/* attempt to read using the modified entry */
if (!ROMENTRY_ISIGNORE(&modified_romp) && !irrelevantbios)
- /*readresult = */read_rom_data(romdata, parent_region, &modified_romp);
+ /*readresult = */read_rom_data(parent_region, &modified_romp);
}
while (ROMENTRY_ISCONTINUE(romp) || ROMENTRY_ISIGNORE(romp));
@@ -994,24 +924,23 @@ static void process_rom_entries(romload_private *romdata, const char *regiontag,
if (baserom)
{
LOG(("Verifying length (%X) and checksums\n", explength));
- verify_length_and_hash(romdata, ROM_GETNAME(baserom), explength, hash_collection(ROM_GETHASHDATA(baserom)));
+ verify_length_and_hash(ROM_GETNAME(baserom), explength, hash_collection(ROM_GETHASHDATA(baserom)));
LOG(("Verify finished\n"));
}
/* reseek to the start and clear the baserom so we don't reverify */
- if (romdata->file != nullptr)
- romdata->file->seek(0, SEEK_SET);
+ if (m_file != nullptr)
+ m_file->seek(0, SEEK_SET);
baserom = nullptr;
explength = 0;
}
while (ROMENTRY_ISRELOAD(romp));
/* close the file */
- if (romdata->file != nullptr)
+ if (m_file != nullptr)
{
LOG(("Closing ROM file\n"));
- global_free(romdata->file);
- romdata->file = nullptr;
+ m_file = nullptr;
}
}
else
@@ -1174,7 +1103,7 @@ int open_disk_image(emu_options &options, const game_driver *gamedrv, const rom_
open_disk_diff - open a DISK diff file
-------------------------------------------------*/
-static chd_error open_disk_diff(emu_options &options, const rom_entry *romp, chd_file &source, chd_file &diff_chd)
+chd_error rom_load_manager::open_disk_diff(emu_options &options, const rom_entry *romp, chd_file &source, chd_file &diff_chd)
{
std::string fname = std::string(ROM_GETNAME(romp)).append(".dif");
@@ -1219,7 +1148,7 @@ static chd_error open_disk_diff(emu_options &options, const rom_entry *romp, chd
for a region
-------------------------------------------------*/
-static void process_disk_entries(romload_private *romdata, const char *regiontag, const rom_entry *parent_region, const rom_entry *romp, const char *locationtag)
+void rom_load_manager::process_disk_entries(const char *regiontag, const rom_entry *parent_region, const rom_entry *romp, const char *locationtag)
{
/* loop until we hit the end of this region */
for ( ; !ROMENTRY_ISREGIONEND(romp); romp++)
@@ -1227,7 +1156,7 @@ static void process_disk_entries(romload_private *romdata, const char *regiontag
/* handle files */
if (ROMENTRY_ISFILE(romp))
{
- auto chd = global_alloc(open_chd(regiontag));
+ auto chd = std::make_unique<open_chd>(regiontag);
hash_collection hashes(ROM_GETHASHDATA(romp));
chd_error err;
@@ -1237,11 +1166,11 @@ static void process_disk_entries(romload_private *romdata, const char *regiontag
/* first open the source drive */
LOG(("Opening disk image: %s\n", filename.c_str()));
- err = chd_error(open_disk_image(romdata->machine().options(), &romdata->machine().system(), romp, chd->orig_chd(), locationtag));
+ err = chd_error(open_disk_image(machine().options(), &machine().system(), romp, chd->orig_chd(), locationtag));
if (err != CHDERR_NONE)
{
- handle_missing_file(romdata, romp, std::string(), err);
- global_free(chd);
+ handle_missing_file(romp, std::string(), err);
+ chd = nullptr;
continue;
}
@@ -1252,33 +1181,33 @@ static void process_disk_entries(romload_private *romdata, const char *regiontag
/* verify the hash */
if (hashes != acthashes)
{
- strcatprintf(romdata->errorstring, "%s WRONG CHECKSUMS:\n", filename.c_str());
- dump_wrong_and_correct_checksums(romdata, hashes, acthashes);
- romdata->warnings++;
+ strcatprintf(m_errorstring, "%s WRONG CHECKSUMS:\n", filename.c_str());
+ dump_wrong_and_correct_checksums(hashes, acthashes);
+ m_warnings++;
}
else if (hashes.flag(hash_collection::FLAG_BAD_DUMP))
{
- strcatprintf(romdata->errorstring, "%s CHD NEEDS REDUMP\n", filename.c_str());
- romdata->knownbad++;
+ strcatprintf(m_errorstring, "%s CHD NEEDS REDUMP\n", filename.c_str());
+ m_knownbad++;
}
/* if not read-only, make the diff file */
if (!DISK_ISREADONLY(romp))
{
/* try to open or create the diff */
- err = open_disk_diff(romdata->machine().options(), romp, chd->orig_chd(), chd->diff_chd());
+ err = open_disk_diff(machine().options(), romp, chd->orig_chd(), chd->diff_chd());
if (err != CHDERR_NONE)
{
- strcatprintf(romdata->errorstring, "%s DIFF CHD ERROR: %s\n", filename.c_str(), chd_file::error_string(err));
- romdata->errors++;
- global_free(chd);
+ strcatprintf(m_errorstring, "%s DIFF CHD ERROR: %s\n", filename.c_str(), chd_file::error_string(err));
+ m_errors++;
+ chd = nullptr;
continue;
}
}
/* we're okay, add to the list of disks */
LOG(("Assigning to handle %d\n", DISK_GETINDEX(romp)));
- romdata->machine().romload_data->chd_list.append(*chd);
+ m_chd_list.push_back(std::move(chd));
}
}
}
@@ -1289,7 +1218,7 @@ static void process_disk_entries(romload_private *romdata, const char *regiontag
flags for the given device
-------------------------------------------------*/
-static void normalize_flags_for_device(running_machine &machine, const char *rgntag, UINT8 &width, endianness_t &endian)
+void rom_load_manager::normalize_flags_for_device(running_machine &machine, const char *rgntag, UINT8 &width, endianness_t &endian)
{
device_t *device = machine.device(rgntag);
device_memory_interface *memory;
@@ -1330,19 +1259,18 @@ static void normalize_flags_for_device(running_machine &machine, const char *rgn
more general process_region_list.
-------------------------------------------------*/
-void load_software_part_region(device_t &device, software_list_device &swlist, const char *swname, const rom_entry *start_region)
+void rom_load_manager::load_software_part_region(device_t &device, software_list_device &swlist, const char *swname, const rom_entry *start_region)
{
std::string locationtag(swlist.list_name()), breakstr("%");
- romload_private *romdata = device.machine().romload_data;
const rom_entry *region;
std::string regiontag;
- romdata->errorstring.clear();
- romdata->softwarningstring.clear();
+ m_errorstring.clear();
+ m_softwarningstring.clear();
- romdata->romstotal = 0;
- romdata->romstotalsize = 0;
- romdata->romsloadedsize = 0;
+ m_romstotal = 0;
+ m_romstotalsize = 0;
+ m_romsloadedsize = 0;
software_info *swinfo = swlist.find(swname);
if (swinfo != nullptr)
@@ -1350,13 +1278,13 @@ void load_software_part_region(device_t &device, software_list_device &swlist, c
UINT32 supported = swinfo->supported();
if (supported == SOFTWARE_SUPPORTED_PARTIAL)
{
- strcatprintf(romdata->errorstring, "WARNING: support for software %s (in list %s) is only partial\n", swname, swlist.list_name());
- strcatprintf(romdata->softwarningstring, "Support for software %s (in list %s) is only partial\n", swname, swlist.list_name());
+ strcatprintf(m_errorstring, "WARNING: support for software %s (in list %s) is only partial\n", swname, swlist.list_name());
+ strcatprintf(m_softwarningstring, "Support for software %s (in list %s) is only partial\n", swname, swlist.list_name());
}
if (supported == SOFTWARE_SUPPORTED_NO)
{
- strcatprintf(romdata->errorstring, "WARNING: support for software %s (in list %s) is only preliminary\n", swname, swlist.list_name());
- strcatprintf(romdata->softwarningstring, "Support for software %s (in list %s) is only preliminary\n", swname, swlist.list_name());
+ strcatprintf(m_errorstring, "WARNING: support for software %s (in list %s) is only preliminary\n", swname, swlist.list_name());
+ strcatprintf(m_softwarningstring, "Support for software %s (in list %s) is only preliminary\n", swname, swlist.list_name());
}
// attempt reading up the chain through the parents and create a locationtag std::string in the format
@@ -1390,57 +1318,57 @@ void load_software_part_region(device_t &device, software_list_device &swlist, c
/* if this is a device region, override with the device width and endianness */
endianness_t endianness = ROMREGION_ISBIGENDIAN(region) ? ENDIANNESS_BIG : ENDIANNESS_LITTLE;
UINT8 width = ROMREGION_GETWIDTH(region) / 8;
- memory_region *memregion = romdata->machine().root_device().memregion(regiontag.c_str());
+ memory_region *memregion = machine().root_device().memregion(regiontag.c_str());
if (memregion != nullptr)
{
- if (romdata->machine().device(regiontag.c_str()) != nullptr)
- normalize_flags_for_device(romdata->machine(), regiontag.c_str(), width, endianness);
+ if (machine().device(regiontag.c_str()) != nullptr)
+ normalize_flags_for_device(machine(), regiontag.c_str(), width, endianness);
/* clear old region (todo: should be moved to an image unload function) */
- romdata->machine().memory().region_free(memregion->name());
+ machine().memory().region_free(memregion->name());
}
/* remember the base and length */
- romdata->region = romdata->machine().memory().region_alloc(regiontag.c_str(), regionlength, width, endianness);
- LOG(("Allocated %X bytes @ %p\n", romdata->region->bytes(), romdata->region->base()));
+ m_region = machine().memory().region_alloc(regiontag.c_str(), regionlength, width, endianness);
+ LOG(("Allocated %X bytes @ %p\n", m_region->bytes(), m_region->base()));
/* clear the region if it's requested */
if (ROMREGION_ISERASE(region))
- memset(romdata->region->base(), ROMREGION_GETERASEVAL(region), romdata->region->bytes());
+ memset(m_region->base(), ROMREGION_GETERASEVAL(region), m_region->bytes());
/* or if it's sufficiently small (<= 4MB) */
- else if (romdata->region->bytes() <= 0x400000)
- memset(romdata->region->base(), 0, romdata->region->bytes());
+ else if (m_region->bytes() <= 0x400000)
+ memset(m_region->base(), 0, m_region->bytes());
#ifdef MAME_DEBUG
/* if we're debugging, fill region with random data to catch errors */
else
- fill_random(romdata->machine(), romdata->region->base(), romdata->region->bytes());
+ fill_random(m_region->base(), m_region->bytes());
#endif
/* update total number of roms */
for (const rom_entry *rom = rom_first_file(region); rom != nullptr; rom = rom_next_file(rom))
{
- romdata->romstotal++;
- romdata->romstotalsize += rom_file_size(rom);
+ m_romstotal++;
+ m_romstotalsize += rom_file_size(rom);
}
/* now process the entries in the region */
if (ROMREGION_ISROMDATA(region))
- process_rom_entries(romdata, locationtag.c_str(), region, region + 1, &device, TRUE);
+ process_rom_entries(locationtag.c_str(), region, region + 1, &device, TRUE);
else if (ROMREGION_ISDISKDATA(region))
- process_disk_entries(romdata, regiontag.c_str(), region, region + 1, locationtag.c_str());
+ process_disk_entries(regiontag.c_str(), region, region + 1, locationtag.c_str());
}
/* now go back and post-process all the regions */
for (region = start_region; region != nullptr; region = rom_next_region(region))
{
regiontag = device.subtag(ROMREGION_GETTAG(region));
- region_post_process(romdata, regiontag.c_str(), ROMREGION_ISINVERTED(region));
+ region_post_process(regiontag.c_str(), ROMREGION_ISINVERTED(region));
}
/* display the results and exit */
- display_rom_load_results(romdata, TRUE);
+ display_rom_load_results(TRUE);
}
@@ -1448,12 +1376,12 @@ void load_software_part_region(device_t &device, software_list_device &swlist, c
process_region_list - process a region list
-------------------------------------------------*/
-static void process_region_list(romload_private *romdata)
+void rom_load_manager::process_region_list()
{
std::string regiontag;
/* loop until we hit the end */
- device_iterator deviter(romdata->machine().root_device());
+ device_iterator deviter(machine().root_device());
for (device_t *device = deviter.first(); device != nullptr; device = deviter.next())
for (const rom_entry *region = rom_first_region(*device); region != nullptr; region = rom_next_region(region))
{
@@ -1470,32 +1398,32 @@ static void process_region_list(romload_private *romdata)
/* if this is a device region, override with the device width and endianness */
UINT8 width = ROMREGION_GETWIDTH(region) / 8;
endianness_t endianness = ROMREGION_ISBIGENDIAN(region) ? ENDIANNESS_BIG : ENDIANNESS_LITTLE;
- if (romdata->machine().device(regiontag.c_str()) != nullptr)
- normalize_flags_for_device(romdata->machine(), regiontag.c_str(), width, endianness);
+ if (machine().device(regiontag.c_str()) != nullptr)
+ normalize_flags_for_device(machine(), regiontag.c_str(), width, endianness);
/* remember the base and length */
- romdata->region = romdata->machine().memory().region_alloc(regiontag.c_str(), regionlength, width, endianness);
- LOG(("Allocated %X bytes @ %p\n", romdata->region->bytes(), romdata->region->base()));
+ m_region = machine().memory().region_alloc(regiontag.c_str(), regionlength, width, endianness);
+ LOG(("Allocated %X bytes @ %p\n", m_region->bytes(), m_region->base()));
/* clear the region if it's requested */
if (ROMREGION_ISERASE(region))
- memset(romdata->region->base(), ROMREGION_GETERASEVAL(region), romdata->region->bytes());
+ memset(m_region->base(), ROMREGION_GETERASEVAL(region), m_region->bytes());
/* or if it's sufficiently small (<= 4MB) */
- else if (romdata->region->bytes() <= 0x400000)
- memset(romdata->region->base(), 0, romdata->region->bytes());
+ else if (m_region->bytes() <= 0x400000)
+ memset(m_region->base(), 0, m_region->bytes());
#ifdef MAME_DEBUG
/* if we're debugging, fill region with random data to catch errors */
else
- fill_random(romdata->machine(), romdata->region->base(), romdata->region->bytes());
+ fill_random(m_region->base(), m_region->bytes());
#endif
/* now process the entries in the region */
- process_rom_entries(romdata, device->shortname(), region, region + 1, device, FALSE);
+ process_rom_entries(device->shortname(), region, region + 1, device, FALSE);
}
else if (ROMREGION_ISDISKDATA(region))
- process_disk_entries(romdata, regiontag.c_str(), region, region + 1, nullptr);
+ process_disk_entries(regiontag.c_str(), region, region + 1, nullptr);
}
/* now go back and post-process all the regions */
@@ -1503,7 +1431,7 @@ static void process_region_list(romload_private *romdata)
for (const rom_entry *region = rom_first_region(*device); region != nullptr; region = rom_next_region(region))
{
regiontag = rom_region_name(*device, region);
- region_post_process(romdata, regiontag.c_str(), ROMREGION_ISINVERTED(region));
+ region_post_process(regiontag.c_str(), ROMREGION_ISINVERTED(region));
}
/* and finally register all per-game parameters */
@@ -1511,7 +1439,7 @@ static void process_region_list(romload_private *romdata)
for (const rom_entry *param = rom_first_parameter(*device); param != nullptr; param = rom_next_parameter(param))
{
regiontag = rom_parameter_name(*device, param);
- romdata->machine().parameters().add(regiontag, rom_parameter_value(param));
+ machine().parameters().add(regiontag, rom_parameter_value(param));
}
}
@@ -1521,87 +1449,35 @@ static void process_region_list(romload_private *romdata)
images associated with the given machine
-------------------------------------------------*/
-void rom_init(running_machine &machine)
+rom_load_manager::rom_load_manager(running_machine &machine)
+ : m_machine(machine)
{
- romload_private *romdata;
-
- /* allocate private data */
- machine.romload_data = romdata = auto_alloc_clear(machine, romload_private);
-
- /* make sure we get called back on the way out */
- machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(rom_exit), &machine));
-
- /* reset the romdata struct */
- romdata->m_machine = &machine;
-
/* figure out which BIOS we are using */
- device_iterator deviter(romdata->machine().config().root_device());
+ device_iterator deviter(machine.config().root_device());
for (device_t *device = deviter.first(); device != nullptr; device = deviter.next()) {
if (device->rom_region()) {
- const char *specbios;
- std::string temp;
- if (strcmp(device->tag(),":")==0) {
- specbios = romdata->machine().options().bios();
+ std::string specbios;
+ if (device->owner() == nullptr) {
+ specbios.assign(machine.options().bios());
} else {
- specbios = romdata->machine().options().sub_value(temp,device->owner()->tag()+1,"bios");
- if (strlen(specbios) == 0) {
- specbios = device->default_bios_tag().c_str();
+ specbios = machine.options().sub_value(device->owner()->tag()+1,"bios");
+ if (specbios.empty()) {
+ specbios = device->default_bios_tag();
}
}
- determine_bios_rom(romdata, device, specbios);
+ determine_bios_rom(device, specbios.c_str());
}
}
/* count the total number of ROMs */
- count_roms(romdata);
+ count_roms();
/* reset the disk list */
- romdata->chd_list.reset();
+ m_chd_list.clear();
/* process the ROM entries we were passed */
- process_region_list(romdata);
+ process_region_list();
/* display the results and exit */
- display_rom_load_results(romdata, FALSE);
-}
-
-
-/*-------------------------------------------------
- rom_exit - clean up after ourselves
--------------------------------------------------*/
-
-static void rom_exit(running_machine &machine)
-{
-}
-
-
-/*-------------------------------------------------
- rom_load_warnings - return the number of
- warnings we generated
--------------------------------------------------*/
-
-int rom_load_warnings(running_machine &machine)
-{
- return machine.romload_data->warnings;
-}
-
-
-/*-------------------------------------------------
- software_load_warnings_message - return the
- software load warnings we generated
--------------------------------------------------*/
-
-std::string& software_load_warnings_message(running_machine &machine)
-{
- return machine.romload_data->softwarningstring;
-}
-
-/*-------------------------------------------------
- rom_load_knownbad - return the number of
- BAD_DUMP/NO_DUMP warnings we generated
--------------------------------------------------*/
-
-int rom_load_knownbad(running_machine &machine)
-{
- return machine.romload_data->knownbad;
+ display_rom_load_results(FALSE);
}
diff --git a/src/emu/romload.h b/src/emu/romload.h
index ec0e3375cdd..c7c10e49325 100644
--- a/src/emu/romload.h
+++ b/src/emu/romload.h
@@ -16,7 +16,7 @@
#ifndef __ROMLOAD_H__
#define __ROMLOAD_H__
-
+#include "chd.h"
/***************************************************************************
CONSTANTS
@@ -254,31 +254,103 @@ struct rom_entry
#define DISK_IMAGE_READONLY_OPTIONAL(name,idx,hash) ROMX_LOAD(name, idx, 0, hash, DISK_READONLY | ROM_OPTIONAL)
-
/***************************************************************************
- FUNCTION PROTOTYPES
+TYPE DEFINITIONS
***************************************************************************/
+// ======================> rom_load_manager
-/* ----- ROM processing ----- */
-
-/* load the ROMs and open the disk images associated with the given machine */
-void rom_init(running_machine &machine);
-
-/* return the number of warnings we generated */
-int rom_load_warnings(running_machine &machine);
-std::string& software_load_warnings_message(running_machine &machine);
+class rom_load_manager
+{
+ class open_chd
+ {
+ public:
+ open_chd(const char *region)
+ : m_region(region) { }
+
+ const char *region() const { return m_region.c_str(); }
+ chd_file &chd() { return m_diffchd.opened() ? m_diffchd : m_origchd; }
+ chd_file &orig_chd() { return m_origchd; }
+ chd_file &diff_chd() { return m_diffchd; }
+
+ private:
+ std::string m_region; /* disk region we came from */
+ chd_file m_origchd; /* handle to the original CHD */
+ chd_file m_diffchd; /* handle to the diff CHD */
+ };
+
+public:
+ // construction/destruction
+ rom_load_manager(running_machine &machine);
+
+ // getters
+ running_machine &machine() const { return m_machine; }
+
+ /* return the number of warnings we generated */
+ int warnings() const { return m_warnings; }
+
+ std::string& software_load_warnings_message() { return m_softwarningstring; }
+
+ /* return the number of BAD_DUMP/NO_DUMP warnings we generated */
+ int knownbad() const { return m_knownbad; }
+
+ /* ----- disk handling ----- */
+
+ /* return a pointer to the CHD file associated with the given region */
+ chd_file *get_disk_handle(const char *region);
+
+ /* set a pointer to the CHD file associated with the given region */
+ int set_disk_handle(const char *region, const char *fullpath);
+
+ void load_software_part_region(device_t &device, software_list_device &swlist, const char *swname, const rom_entry *start_region);
+
+private:
+ void determine_bios_rom(device_t *device, const char *specbios);
+ void count_roms();
+ void fill_random(UINT8 *base, UINT32 length);
+ void handle_missing_file(const rom_entry *romp, std::string tried_file_names, chd_error chderr);
+ void dump_wrong_and_correct_checksums(const hash_collection &hashes, const hash_collection &acthashes);
+ void verify_length_and_hash(const char *name, UINT32 explength, const hash_collection &hashes);
+ void display_loading_rom_message(const char *name, bool from_list);
+ void display_rom_load_results(bool from_list);
+ void region_post_process(const char *rgntag, bool invert);
+ int open_rom_file(const char *regiontag, const rom_entry *romp, std::string &tried_file_names, bool from_list);
+ int rom_fread(UINT8 *buffer, int length, const rom_entry *parent_region);
+ int read_rom_data(const rom_entry *parent_region, const rom_entry *romp);
+ void fill_rom_data(const rom_entry *romp);
+ void copy_rom_data(const rom_entry *romp);
+ void process_rom_entries(const char *regiontag, const rom_entry *parent_region, const rom_entry *romp, device_t *device, bool from_list);
+ chd_error open_disk_diff(emu_options &options, const rom_entry *romp, chd_file &source, chd_file &diff_chd);
+ void process_disk_entries(const char *regiontag, const rom_entry *parent_region, const rom_entry *romp, const char *locationtag);
+ void normalize_flags_for_device(running_machine &machine, const char *rgntag, UINT8 &width, endianness_t &endian);
+ void process_region_list();
+
+
+ // internal state
+ running_machine & m_machine; // reference to our machine
+
+ int m_warnings; /* warning count during processing */
+ int m_knownbad; /* BAD_DUMP/NO_DUMP count during processing */
+ int m_errors; /* error count during processing */
+
+ int m_romsloaded; /* current ROMs loaded count */
+ int m_romstotal; /* total number of ROMs to read */
+ UINT32 m_romsloadedsize; /* total size of ROMs loaded so far */
+ UINT32 m_romstotalsize; /* total size of ROMs to read */
+
+ std::unique_ptr<emu_file> m_file; /* current file */
+ std::vector<std::unique_ptr<open_chd>> m_chd_list; /* disks */
+
+ memory_region * m_region; /* info about current region */
+
+ std::string m_errorstring; /* error string */
+ std::string m_softwarningstring; /* software warning string */
+};
-/* return the number of BAD_DUMP/NO_DUMP warnings we generated */
-int rom_load_knownbad(running_machine &machine);
/* ----- Helpers ----- */
-file_error common_process_file(emu_options &options, const char *location, const char *ext, const rom_entry *romp, emu_file **image_file);
-file_error common_process_file(emu_options &options, const char *location, bool has_crc, UINT32 crc, const rom_entry *romp, emu_file **image_file);
-
-
-/* ----- ROM iteration ----- */
+std::unique_ptr<emu_file> common_process_file(emu_options &options, const char *location, bool has_crc, UINT32 crc, const rom_entry *romp, file_error &filerr);
/* return pointer to the first ROM region within a source */
const rom_entry *rom_first_region(const device_t &device);
@@ -311,17 +383,7 @@ std::string rom_parameter_name(const device_t &device, const rom_entry *romp);
std::string rom_parameter_value(const rom_entry *romp);
-/* ----- disk handling ----- */
-
/* open a disk image, searching up the parent and loading by checksum */
int open_disk_image(emu_options &options, const game_driver *gamedrv, const rom_entry *romp, chd_file &image_chd, const char *locationtag);
-/* return a pointer to the CHD file associated with the given region */
-chd_file *get_disk_handle(running_machine &machine, const char *region);
-
-/* set a pointer to the CHD file associated with the given region */
-int set_disk_handle(running_machine &machine, const char *region, const char *fullpath);
-
-void load_software_part_region(device_t &device, software_list_device &swlist, const char *swname, const rom_entry *start_region);
-
#endif /* __ROMLOAD_H__ */
diff --git a/src/emu/screen.h b/src/emu/screen.h
index 31487c7d4ea..6a38b72f377 100644
--- a/src/emu/screen.h
+++ b/src/emu/screen.h
@@ -197,7 +197,8 @@ public:
// information getters
render_container &container() const { assert(m_container != nullptr); return *m_container; }
bitmap_ind8 &priority() { return m_priority; }
- palette_device *palette() { return m_palette; }
+ palette_device &palette() const { assert(m_palette.found()); return *m_palette; }
+ bool has_palette() const { return m_palette.found(); }
// dynamic configuration
void configure(int width, int height, const rectangle &visarea, attoseconds_t frame_period);
@@ -218,7 +219,7 @@ public:
attotime time_until_vblank_end() const;
attotime time_until_update() const { return (m_video_attributes & VIDEO_UPDATE_AFTER_VBLANK) ? time_until_vblank_end() : time_until_vblank_start(); }
attotime scan_period() const { return attotime(0, m_scantime); }
- attotime frame_period() const { return (this == nullptr) ? DEFAULT_FRAME_PERIOD : attotime(0, m_frame_period); };
+ attotime frame_period() const { return attotime(0, m_frame_period); }
UINT64 frame_number() const { return m_frame_number; }
// updating
diff --git a/src/emu/softlist.cpp b/src/emu/softlist.cpp
index 2a5ceaccdcc..6631fa82124 100644
--- a/src/emu/softlist.cpp
+++ b/src/emu/softlist.cpp
@@ -703,13 +703,13 @@ softlist_parser::softlist_parser(software_list_device &list, std::string &errors
void *softlist_parser::expat_malloc(size_t size)
{
- return global_alloc_array_clear(UINT8, size);
+ return global_alloc_array_clear<UINT8>(size);
}
void *softlist_parser::expat_realloc(void *ptr, size_t size)
{
if (ptr != nullptr) global_free_array((UINT8 *)ptr);
- return global_alloc_array_clear(UINT8, size);
+ return global_alloc_array_clear<UINT8>(size);
}
void softlist_parser::expat_free(void *ptr)
diff --git a/src/emu/sound.cpp b/src/emu/sound.cpp
index dbfc8813ec7..096695935d9 100644
--- a/src/emu/sound.cpp
+++ b/src/emu/sound.cpp
@@ -163,8 +163,10 @@ float sound_stream::output_gain(int outputnum) const
// on a given stream's input
//-------------------------------------------------
-const char *sound_stream::input_name(int inputnum, std::string &str) const
+std::string sound_stream::input_name(int inputnum) const
{
+ std::string str;
+
// start with our device name and tag
assert(inputnum >= 0 && inputnum < m_input.size());
strprintf(str, "%s '%s': ", m_device.name(), m_device.tag());
@@ -191,7 +193,7 @@ const char *sound_stream::input_name(int inputnum, std::string &str) const
}
}
}
- return str.c_str();
+ return str;
}
@@ -404,7 +406,6 @@ void sound_stream::update_with_accounting(bool second_tick)
if (output_bufindex > 0)
for (auto & output : m_output)
{
-
memmove(&output.m_buffer[0], &output.m_buffer[samples_to_lose], sizeof(output.m_buffer[0]) * (output_bufindex - samples_to_lose));
}
@@ -459,7 +460,6 @@ void sound_stream::recompute_sample_rate_data()
// When synchronous, pick the sample rate for the inputs, if any
for (auto & input : m_input)
{
-
if (input.m_source != nullptr)
{
if (!m_sample_rate)
@@ -486,7 +486,7 @@ void sound_stream::recompute_sample_rate_data()
for (auto & input : m_input)
{
// if we have a source, see if its sample rate changed
-
+
if (input.m_source != nullptr)
{
// okay, we have a new sample rate; recompute the latency to be the maximum
@@ -840,7 +840,7 @@ sound_manager::sound_manager(running_machine &machine)
m_wavfile = wav_open(wavfile, machine.sample_rate(), 2);
// register callbacks
- config_register(machine, "mixer", config_saveload_delegate(FUNC(sound_manager::config_load), this), config_saveload_delegate(FUNC(sound_manager::config_save), this));
+ machine.configuration().config_register("mixer", config_saveload_delegate(FUNC(sound_manager::config_load), this), config_saveload_delegate(FUNC(sound_manager::config_save), this));
machine.add_notifier(MACHINE_NOTIFY_PAUSE, machine_notify_delegate(FUNC(sound_manager::pause), this));
machine.add_notifier(MACHINE_NOTIFY_RESUME, machine_notify_delegate(FUNC(sound_manager::resume), this));
machine.add_notifier(MACHINE_NOTIFY_RESET, machine_notify_delegate(FUNC(sound_manager::reset), this));
@@ -969,10 +969,10 @@ void sound_manager::resume()
// configuration file
//-------------------------------------------------
-void sound_manager::config_load(int config_type, xml_data_node *parentnode)
+void sound_manager::config_load(config_type cfg_type, xml_data_node *parentnode)
{
// we only care about game files
- if (config_type != CONFIG_TYPE_GAME)
+ if (cfg_type != config_type::CONFIG_TYPE_GAME)
return;
// might not have any data
@@ -999,10 +999,10 @@ void sound_manager::config_load(int config_type, xml_data_node *parentnode)
// file
//-------------------------------------------------
-void sound_manager::config_save(int config_type, xml_data_node *parentnode)
+void sound_manager::config_save(config_type cfg_type, xml_data_node *parentnode)
{
// we only care about game files
- if (config_type != CONFIG_TYPE_GAME)
+ if (cfg_type != config_type::CONFIG_TYPE_GAME)
return;
// iterate over mixer channels
diff --git a/src/emu/sound.h b/src/emu/sound.h
index 50c94486eb3..b3584969284 100644
--- a/src/emu/sound.h
+++ b/src/emu/sound.h
@@ -106,7 +106,7 @@ public:
attotime sample_period() const { return attotime(0, m_attoseconds_per_sample); }
int input_count() const { return m_input.size(); }
int output_count() const { return m_output.size(); }
- const char *input_name(int inputnum, std::string &str) const;
+ std::string input_name(int inputnum) const;
device_t *input_source_device(int inputnum) const;
int input_source_outputnum(int inputnum) const;
float user_gain(int inputnum) const;
@@ -222,8 +222,8 @@ private:
void reset();
void pause();
void resume();
- void config_load(int config_type, xml_data_node *parentnode);
- void config_save(int config_type, xml_data_node *parentnode);
+ void config_load(config_type cfg_type, xml_data_node *parentnode);
+ void config_save(config_type cfg_type, xml_data_node *parentnode);
void update(void *ptr = nullptr, INT32 param = 0);
diff --git a/src/emu/sound/filter.cpp b/src/emu/sound/filter.cpp
index 9473a8b720d..b01ec7efc4b 100644
--- a/src/emu/sound/filter.cpp
+++ b/src/emu/sound/filter.cpp
@@ -1,4 +1,4 @@
-// license:???
+// license:BSD-3-Clause
// copyright-holders:Derrick Renaud, Couriersud
#include "emu.h"
#include "filter.h"
diff --git a/src/emu/sound/filter.h b/src/emu/sound/filter.h
index 7e7398a2686..ef13c45eb5f 100644
--- a/src/emu/sound/filter.h
+++ b/src/emu/sound/filter.h
@@ -1,4 +1,4 @@
-// license:???
+// license:BSD-3-Clause
// copyright-holders:Derrick Renaud, Couriersud
#pragma once
diff --git a/src/emu/tilemap.cpp b/src/emu/tilemap.cpp
index 2c7334bb068..58b9cb986d6 100644
--- a/src/emu/tilemap.cpp
+++ b/src/emu/tilemap.cpp
@@ -348,7 +348,7 @@ tilemap_t &tilemap_t::init(tilemap_manager &manager, device_gfx_interface &decod
// populate managers and devices
m_manager = &manager;
m_device = dynamic_cast<tilemap_device *>(this);
- m_palette = decoder.palette();
+ m_palette = &decoder.palette();
m_next = nullptr;
m_user_data = nullptr;
diff --git a/src/emu/tilemap.h b/src/emu/tilemap.h
index aaba8818d53..0f7dcf93c1b 100644
--- a/src/emu/tilemap.h
+++ b/src/emu/tilemap.h
@@ -497,7 +497,7 @@ public:
// getters
running_machine &machine() const;
tilemap_device *device() const { return m_device; }
- palette_device *palette() const { return m_palette; }
+ palette_device &palette() const { return *m_palette; }
tilemap_t *next() const { return m_next; }
void *user_data() const { return m_user_data; }
memory_array &basemem() { return m_basemem; }
@@ -518,7 +518,7 @@ public:
// setters
void enable(bool enable = true) { m_enable = enable; }
void set_user_data(void *user_data) { m_user_data = user_data; }
- void set_palette(palette_device *palette) { m_palette = palette; }
+ void set_palette(palette_device &palette) { m_palette = &palette; }
void set_palette_offset(UINT32 offset) { m_palette_offset = offset; }
void set_scrolldx(int dx, int dx_flipped) { m_dx = dx; m_dx_flipped = dx_flipped; }
void set_scrolldy(int dy, int dy_flipped) { m_dy = dy; m_dy_flipped = dy_flipped; }
diff --git a/src/emu/ui/filemngr.cpp b/src/emu/ui/filemngr.cpp
index ce94f437120..d277d0bd847 100644
--- a/src/emu/ui/filemngr.cpp
+++ b/src/emu/ui/filemngr.cpp
@@ -195,10 +195,10 @@ void ui_menu_file_manager::force_file_manager(running_machine &machine, render_c
ui_menu::stack_reset(machine);
// add the quit entry followed by the game select entry
- ui_menu *quit = auto_alloc_clear(machine, ui_menu_quit_game(machine, container));
+ ui_menu *quit = auto_alloc_clear(machine, <ui_menu_quit_game>(machine, container));
quit->set_special_main_menu(true);
ui_menu::stack_push(quit);
- ui_menu::stack_push(auto_alloc_clear(machine, ui_menu_file_manager(machine, container, warnings)));
+ ui_menu::stack_push(auto_alloc_clear(machine, <ui_menu_file_manager>(machine, container, warnings)));
// force the menus on
machine.ui().show_menu();
diff --git a/src/emu/ui/imgcntrl.cpp b/src/emu/ui/imgcntrl.cpp
index 11ed8c26c5c..3bb77723726 100644
--- a/src/emu/ui/imgcntrl.cpp
+++ b/src/emu/ui/imgcntrl.cpp
@@ -2,7 +2,7 @@
// copyright-holders:Nathan Woods
/***************************************************************************
- ui/imgcntrl.c
+ ui/imgcntrl.cpp
MESS's clunky built-in file manager
@@ -146,7 +146,7 @@ void ui_menu_control_device_image::load_software_part()
hook_load(temp_name, true);
else
{
- machine().popmessage("The selected game is missing one or more required ROM or CHD images. Please select a different game.");
+ machine().popmessage("The software selected is missing one or more required ROM or CHD images. Please select a different one.");
state = SELECT_SOFTLIST;
}
}
@@ -190,20 +190,20 @@ void ui_menu_control_device_image::handle()
zippath_closedir(directory);
}
submenu_result = -1;
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_file_selector(machine(), container, image, current_directory, current_file, true, image->image_interface()!=nullptr, can_create, &submenu_result)));
+ ui_menu::stack_push(auto_alloc_clear(machine(), <ui_menu_file_selector>(machine(), container, image, current_directory, current_file, true, image->image_interface()!=nullptr, can_create, &submenu_result)));
state = SELECT_FILE;
break;
}
case START_SOFTLIST:
sld = nullptr;
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_software(machine(), container, image->image_interface(), &sld)));
+ ui_menu::stack_push(auto_alloc_clear(machine(), <ui_menu_software>(machine(), container, image->image_interface(), &sld)));
state = SELECT_SOFTLIST;
break;
case START_OTHER_PART: {
submenu_result = -1;
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_software_parts(machine(), container, swi, swp->interface(), &swp, true, &submenu_result)));
+ ui_menu::stack_push(auto_alloc_clear(machine(), <ui_menu_software_parts>(machine(), container, swi, swp->interface(), &swp, true, &submenu_result)));
state = SELECT_OTHER_PART;
break;
}
@@ -214,7 +214,7 @@ void ui_menu_control_device_image::handle()
break;
}
software_info_name = "";
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_software_list(machine(), container, sld, image->image_interface(), software_info_name)));
+ ui_menu::stack_push(auto_alloc_clear(machine(), <ui_menu_software_list>(machine(), container, sld, image->image_interface(), software_info_name)));
state = SELECT_PARTLIST;
break;
@@ -226,7 +226,7 @@ void ui_menu_control_device_image::handle()
{
submenu_result = -1;
swp = nullptr;
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_software_parts(machine(), container, swi, image->image_interface(), &swp, false, &submenu_result)));
+ ui_menu::stack_push(auto_alloc_clear(machine(), <ui_menu_software_parts>(machine(), container, swi, image->image_interface(), &swp, false, &submenu_result)));
state = SELECT_ONE_PART;
}
else
@@ -290,7 +290,7 @@ void ui_menu_control_device_image::handle()
break;
case ui_menu_file_selector::R_CREATE:
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_file_create(machine(), container, image, current_directory, current_file, &create_ok)));
+ ui_menu::stack_push(auto_alloc_clear(machine(), <ui_menu_file_create>(machine(), container, image, current_directory, current_file, &create_ok)));
state = CHECK_CREATE;
break;
@@ -310,7 +310,7 @@ void ui_menu_control_device_image::handle()
test_create(can_create, need_confirm);
if(can_create) {
if(need_confirm) {
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_confirm_save_as(machine(), container, &create_confirmed)));
+ ui_menu::stack_push(auto_alloc_clear(machine(), <ui_menu_confirm_save_as>(machine(), container, &create_confirmed)));
state = CREATE_CONFIRM;
} else {
state = DO_CREATE;
diff --git a/src/emu/ui/inputmap.cpp b/src/emu/ui/inputmap.cpp
index 3474cacee75..1fc0d046e1f 100644
--- a/src/emu/ui/inputmap.cpp
+++ b/src/emu/ui/inputmap.cpp
@@ -73,7 +73,7 @@ void ui_menu_input_groups::handle()
/* process the menu */
const ui_menu_event *menu_event = process(0);
if (menu_event != nullptr && menu_event->iptkey == IPT_UI_SELECT)
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_input_general(machine(), container, int((long long)(menu_event->itemref)-1))));
+ ui_menu::stack_push(auto_alloc_clear(machine(), <ui_menu_input_general>(machine(), container, int((long long)(menu_event->itemref)-1))));
}
@@ -266,7 +266,7 @@ void ui_menu_input::handle()
input_item_data *item = pollingitem;
/* if UI_CANCEL is pressed, abort */
- if (ui_input_pressed(machine(), IPT_UI_CANCEL))
+ if (machine().ui_input().pressed(IPT_UI_CANCEL))
{
pollingitem = nullptr;
record_next = false;
@@ -434,7 +434,7 @@ void ui_menu_input::populate_and_sort(input_item_data *itemlist)
/* otherwise, generate the sequence name and invert it if different from the default */
else
{
- machine().input().seq_name(subtext, item->seq);
+ subtext = machine().input().seq_name(item->seq);
flags |= (item->seq != *item->defseq) ? MENU_FLAG_INVERT : 0;
}
diff --git a/src/emu/ui/mainmenu.cpp b/src/emu/ui/mainmenu.cpp
index 9b0e72aacad..415ad118811 100644
--- a/src/emu/ui/mainmenu.cpp
+++ b/src/emu/ui/mainmenu.cpp
@@ -125,7 +125,7 @@ void ui_menu_main::populate()
item_append("Video Options", nullptr, 0, (machine().render().target_by_index(1) != nullptr) ? (void *)VIDEO_TARGETS : (void *)VIDEO_OPTIONS);
/* add crosshair options menu */
- if (crosshair_get_usage(machine()))
+ if (machine().crosshair().get_usage())
item_append("Crosshair Options", nullptr, 0, (void *)CROSSHAIR);
/* add cheat menu */
@@ -152,91 +152,91 @@ void ui_menu_main::handle()
if (menu_event != nullptr && menu_event->iptkey == IPT_UI_SELECT) {
switch((long long)(menu_event->itemref)) {
case INPUT_GROUPS:
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_input_groups(machine(), container)));
+ ui_menu::stack_push(auto_alloc_clear(machine(), <ui_menu_input_groups>(machine(), container)));
break;
case INPUT_SPECIFIC:
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_input_specific(machine(), container)));
+ ui_menu::stack_push(auto_alloc_clear(machine(), <ui_menu_input_specific>(machine(), container)));
break;
case SETTINGS_DIP_SWITCHES:
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_settings_dip_switches(machine(), container)));
+ ui_menu::stack_push(auto_alloc_clear(machine(), <ui_menu_settings_dip_switches>(machine(), container)));
break;
case SETTINGS_DRIVER_CONFIG:
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_settings_driver_config(machine(), container)));
+ ui_menu::stack_push(auto_alloc_clear(machine(), <ui_menu_settings_driver_config>(machine(), container)));
break;
case ANALOG:
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_analog(machine(), container)));
+ ui_menu::stack_push(auto_alloc_clear(machine(), <ui_menu_analog>(machine(), container)));
break;
case BOOKKEEPING:
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_bookkeeping(machine(), container)));
+ ui_menu::stack_push(auto_alloc_clear(machine(), <ui_menu_bookkeeping>(machine(), container)));
break;
case GAME_INFO:
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_game_info(machine(), container)));
+ ui_menu::stack_push(auto_alloc_clear(machine(), <ui_menu_game_info>(machine(), container)));
break;
case IMAGE_MENU_IMAGE_INFO:
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_image_info(machine(), container)));
+ ui_menu::stack_push(auto_alloc_clear(machine(), <ui_menu_image_info>(machine(), container)));
break;
case IMAGE_MENU_FILE_MANAGER:
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_file_manager(machine(), container, nullptr)));
+ ui_menu::stack_push(auto_alloc_clear(machine(), <ui_menu_file_manager>(machine(), container, nullptr)));
break;
case TAPE_CONTROL:
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_tape_control(machine(), container, nullptr)));
+ ui_menu::stack_push(auto_alloc_clear(machine(), <ui_menu_tape_control>(machine(), container, nullptr)));
break;
case PTY_INFO:
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_pty_info(machine(), container)));
+ ui_menu::stack_push(auto_alloc_clear(machine(), <ui_menu_pty_info>(machine(), container)));
break;
case SLOT_DEVICES:
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_slot_devices(machine(), container)));
+ ui_menu::stack_push(auto_alloc_clear(machine(), <ui_menu_slot_devices>(machine(), container)));
break;
case NETWORK_DEVICES:
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_network_devices(machine(), container)));
+ ui_menu::stack_push(auto_alloc_clear(machine(), <ui_menu_network_devices>(machine(), container)));
break;
case KEYBOARD_MODE:
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_keyboard_mode(machine(), container)));
+ ui_menu::stack_push(auto_alloc_clear(machine(), <ui_menu_keyboard_mode>(machine(), container)));
break;
case SLIDERS:
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_sliders(machine(), container, false)));
+ ui_menu::stack_push(auto_alloc_clear(machine(), <ui_menu_sliders>(machine(), container, false)));
break;
case VIDEO_TARGETS:
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_video_targets(machine(), container)));
+ ui_menu::stack_push(auto_alloc_clear(machine(), <ui_menu_video_targets>(machine(), container)));
break;
case VIDEO_OPTIONS:
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_video_options(machine(), container, machine().render().first_target())));
+ ui_menu::stack_push(auto_alloc_clear(machine(), <ui_menu_video_options>(machine(), container, machine().render().first_target())));
break;
case CROSSHAIR:
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_crosshair(machine(), container)));
+ ui_menu::stack_push(auto_alloc_clear(machine(), <ui_menu_crosshair>(machine(), container)));
break;
case CHEAT:
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_cheat(machine(), container)));
+ ui_menu::stack_push(auto_alloc_clear(machine(), <ui_menu_cheat>(machine(), container)));
break;
case SELECT_GAME:
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_select_game(machine(), container, nullptr)));
+ ui_menu::stack_push(auto_alloc_clear(machine(), <ui_menu_select_game>(machine(), container, nullptr)));
break;
case BIOS_SELECTION:
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_bios_selection(machine(), container)));
+ ui_menu::stack_push(auto_alloc_clear(machine(), <ui_menu_bios_selection>(machine(), container)));
break;
case BARCODE_READ:
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_barcode_reader(machine(), container, nullptr)));
+ ui_menu::stack_push(auto_alloc_clear(machine(), <ui_menu_barcode_reader>(machine(), container, nullptr)));
break;
default:
diff --git a/src/emu/ui/menu.cpp b/src/emu/ui/menu.cpp
index 6456d425ddd..069b05aa913 100644
--- a/src/emu/ui/menu.cpp
+++ b/src/emu/ui/menu.cpp
@@ -31,7 +31,7 @@
ui_menu *ui_menu::menu_stack;
ui_menu *ui_menu::menu_free;
-bitmap_rgb32 *ui_menu::hilight_bitmap;
+std::unique_ptr<bitmap_rgb32> ui_menu::hilight_bitmap;
render_texture *ui_menu::hilight_texture;
render_texture *ui_menu::arrow_texture;
@@ -58,7 +58,7 @@ inline bool ui_menu_item::is_selectable() const
inline bool ui_menu::exclusive_input_pressed(int key, int repeat)
{
- if (menu_event.iptkey == IPT_INVALID && ui_input_pressed_repeat(machine(), key, repeat))
+ if (menu_event.iptkey == IPT_INVALID && machine().ui_input().pressed_repeat(key, repeat))
{
menu_event.iptkey = key;
return true;
@@ -84,7 +84,7 @@ void ui_menu::init(running_machine &machine)
ui_menu::stack_reset(machine);
// create a texture for hilighting items
- hilight_bitmap = auto_bitmap_rgb32_alloc(machine, 256, 1);
+ hilight_bitmap = std::make_unique<bitmap_rgb32>(256, 1);
for (x = 0; x < 256; x++)
{
int alpha = 0xff;
@@ -492,7 +492,7 @@ void ui_menu::draw(bool customonly)
mouse_button = false;
if (!customonly)
{
- mouse_target = ui_input_find_mouse(machine(), &mouse_target_x, &mouse_target_y, &mouse_button);
+ mouse_target = machine().ui_input().find_mouse(&mouse_target_x, &mouse_target_y, &mouse_button);
if (mouse_target != nullptr)
if (mouse_target->map_point_container(mouse_target_x, mouse_target_y, *container, mouse_x, mouse_y))
mouse_hit = true;
@@ -749,7 +749,7 @@ void ui_menu::handle_events()
ui_event local_menu_event;
// loop while we have interesting events
- while (!stop && ui_input_pop_event(machine(), &local_menu_event))
+ while (!stop && machine().ui_input().pop_event(&local_menu_event))
{
switch (local_menu_event.event_type)
{
@@ -901,7 +901,7 @@ void ui_menu::handle_keys(UINT32 flags)
}
// handle a toggle cheats request
- if (ui_input_pressed_repeat(machine(), IPT_UI_TOGGLE_CHEAT, 0))
+ if (machine().ui_input().pressed_repeat(IPT_UI_TOGGLE_CHEAT, 0))
machine().cheat().set_enable(!machine().cheat().enabled());
// see if any other UI keys are pressed
@@ -979,7 +979,7 @@ void ui_menu::stack_push(ui_menu *menu)
menu->parent = menu_stack;
menu_stack = menu;
menu->reset(UI_MENU_RESET_SELECT_FIRST);
- ui_input_reset(menu->machine());
+ menu->machine().ui_input().reset();
}
@@ -995,7 +995,7 @@ void ui_menu::stack_pop(running_machine &machine)
menu_stack = menu->parent;
menu->parent = menu_free;
menu_free = menu;
- ui_input_reset(machine);
+ machine.ui_input().reset();
}
}
@@ -1037,7 +1037,7 @@ UINT32 ui_menu::ui_handler(running_machine &machine, render_container *container
{
// if we have no menus stacked up, start with the main menu
if (menu_stack == nullptr)
- stack_push(auto_alloc_clear(machine, ui_menu_main(machine, container)));
+ stack_push(auto_alloc_clear(machine, <ui_menu_main>(machine, container)));
// update the menu state
if (menu_stack != nullptr)
@@ -1047,7 +1047,7 @@ UINT32 ui_menu::ui_handler(running_machine &machine, render_container *container
clear_free_list(machine);
// if the menus are to be hidden, return a cancel here
- if (machine.ui().is_menu_active() && ((ui_input_pressed(machine, IPT_UI_CONFIGURE) && !stack_has_special_main_menu()) || menu_stack == nullptr))
+ if (machine.ui().is_menu_active() && ((machine.ui_input().pressed(IPT_UI_CONFIGURE) && !stack_has_special_main_menu()) || menu_stack == nullptr))
return UI_HANDLER_CANCEL;
return 0;
diff --git a/src/emu/ui/menu.h b/src/emu/ui/menu.h
index c16add8d5c8..b52b0f90ff4 100644
--- a/src/emu/ui/menu.h
+++ b/src/emu/ui/menu.h
@@ -170,7 +170,7 @@ public:
private:
static ui_menu *menu_free;
- static bitmap_rgb32 *hilight_bitmap;
+ static std::unique_ptr<bitmap_rgb32> hilight_bitmap;
static render_texture *hilight_texture, *arrow_texture;
bool m_special_main_menu;
diff --git a/src/emu/ui/miscmenu.cpp b/src/emu/ui/miscmenu.cpp
index 9053b6cd7c1..1eaa9fe1366 100644
--- a/src/emu/ui/miscmenu.cpp
+++ b/src/emu/ui/miscmenu.cpp
@@ -124,9 +124,8 @@ void ui_menu_bios_selection::handle()
assert(error.empty());
} else {
std::string error;
- std::string value;
- std::string temp;
- strprintf(value,"%s,bios=%d",machine().options().main_value(temp,dev->owner()->tag()+1),val-1);
+ std::string value = machine().options().main_value(dev->owner()->tag()+1);
+ strcatprintf(value,",bios=%d",val-1);
machine().options().set_value(dev->owner()->tag()+1, value.c_str(), OPTION_PRIORITY_CMDLINE, error);
assert(error.empty());
}
@@ -231,7 +230,7 @@ ui_menu_bookkeeping::~ui_menu_bookkeeping()
void ui_menu_bookkeeping::populate()
{
- int tickets = get_dispensed_tickets(machine());
+ int tickets = machine().bookkeeping().get_dispensed_tickets();
std::string tempstring;
int ctrnum;
@@ -248,7 +247,7 @@ void ui_menu_bookkeeping::populate()
/* loop over coin counters */
for (ctrnum = 0; ctrnum < COIN_COUNTERS; ctrnum++)
{
- int count = coin_counter_get_count(machine(), ctrnum);
+ int count = machine().bookkeeping().coin_counter_get_count(ctrnum);
/* display the coin counter number */
strcatprintf(tempstring,"Coin %c: ", ctrnum + 'A');
@@ -260,7 +259,7 @@ void ui_menu_bookkeeping::populate()
strcatprintf(tempstring, "%d", count);
/* display whether or not we are locked out */
- if (coin_lockout_get_state(machine(), ctrnum))
+ if (machine().bookkeeping().coin_lockout_get_state(ctrnum))
tempstring.append(" (locked)");
tempstring.append("\n");
}
@@ -289,7 +288,7 @@ void ui_menu_crosshair::handle()
int newval = data->cur;
/* retreive the user settings */
- crosshair_get_user_settings(machine(), data->player, &settings);
+ machine().crosshair().get_user_settings(data->player, &settings);
switch (menu_event->iptkey)
{
@@ -361,7 +360,7 @@ void ui_menu_crosshair::handle()
if (changed)
{
/* save the user settings */
- crosshair_set_user_settings(machine(), data->player, &settings);
+ machine().crosshair().set_user_settings(data->player, &settings);
/* rebuild the menu */
reset(UI_MENU_RESET_REMEMBER_POSITION);
@@ -392,7 +391,7 @@ void ui_menu_crosshair::populate()
for (player = 0; player < MAX_PLAYERS; player++)
{
/* get the user settings */
- crosshair_get_user_settings(machine(), player, &settings);
+ machine().crosshair().get_user_settings(player, &settings);
/* add menu items for usable crosshairs */
if (settings.used)
@@ -503,7 +502,7 @@ void ui_menu_crosshair::populate()
if (use_auto)
{
/* any player can be used to get the autotime */
- crosshair_get_user_settings(machine(), 0, &settings);
+ machine().crosshair().get_user_settings(0, &settings);
/* CROSSHAIR_ITEM_AUTO_TIME - allocate a data item and fill it */
data = (crosshair_item_data *)m_pool_alloc(sizeof(*data));
diff --git a/src/emu/ui/miscmenu.h b/src/emu/ui/miscmenu.h
index 649977869f3..ea75897edde 100644
--- a/src/emu/ui/miscmenu.h
+++ b/src/emu/ui/miscmenu.h
@@ -83,8 +83,6 @@ public:
virtual ~ui_menu_bios_selection();
virtual void populate() override;
virtual void handle() override;
-
-private:
};
#endif /* __UI_MISCMENU_H__ */
diff --git a/src/emu/ui/selgame.cpp b/src/emu/ui/selgame.cpp
index a9286bcf3ee..9a080df6655 100644
--- a/src/emu/ui/selgame.cpp
+++ b/src/emu/ui/selgame.cpp
@@ -94,7 +94,7 @@ void ui_menu_select_game::build_driver_list()
void ui_menu_select_game::handle()
{
// ignore pause keys by swallowing them before we process the menu
- ui_input_pressed(machine(), IPT_UI_PAUSE);
+ machine().ui_input().pressed(IPT_UI_PAUSE);
// process the menu
const ui_menu_event *menu_event = process(0);
@@ -141,7 +141,7 @@ void ui_menu_select_game::inkey_select(const ui_menu_event *menu_event)
// special case for configure inputs
if ((FPTR)driver == 1)
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_input_groups(machine(), container)));
+ ui_menu::stack_push(auto_alloc_clear(machine(), <ui_menu_input_groups>(machine(), container)));
// anything else is a driver
else
@@ -180,7 +180,7 @@ void ui_menu_select_game::inkey_cancel(const ui_menu_event *menu_event)
if (m_search[0] != 0)
{
// since we have already been popped, we must recreate ourself from scratch
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_select_game(machine(), container, nullptr)));
+ ui_menu::stack_push(auto_alloc_clear(machine(), <ui_menu_select_game>(machine(), container, nullptr)));
}
}
@@ -325,7 +325,7 @@ void ui_menu_select_game::custom_render(void *selectedref, float top, float bott
strprintf(tempbuf[1], "%s, %-.100s", driver->year, driver->manufacturer);
// next line source path
- strprintf(tempbuf[2],"Driver: %-.100s", core_filename_extract_base(tempbuf[3], driver->source_file).c_str());
+ strprintf(tempbuf[2],"Driver: %-.100s", core_filename_extract_base(driver->source_file).c_str());
// next line is overall driver status
if (driver->flags & MACHINE_NOT_WORKING)
@@ -356,7 +356,7 @@ void ui_menu_select_game::custom_render(void *selectedref, float top, float bott
line = 0;
// first line is version string
- strprintf(tempbuf[line++], "%s %s", emulator_info::get_applongname(), build_version);
+ strprintf(tempbuf[line++], "%s %s", emulator_info::get_appname(), build_version);
// output message
while (line < ARRAY_LENGTH(tempbuf))
@@ -429,10 +429,10 @@ void ui_menu_select_game::force_game_select(running_machine &machine, render_con
ui_menu::stack_reset(machine);
// add the quit entry followed by the game select entry
- ui_menu *quit = auto_alloc_clear(machine, ui_menu_quit_game(machine, container));
+ ui_menu *quit = auto_alloc_clear(machine, <ui_menu_quit_game>(machine, container));
quit->set_special_main_menu(true);
ui_menu::stack_push(quit);
- ui_menu::stack_push(auto_alloc_clear(machine, ui_menu_select_game(machine, container, gamename)));
+ ui_menu::stack_push(auto_alloc_clear(machine, <ui_menu_select_game>(machine, container, gamename)));
// force the menus on
machine.ui().show_menu();
diff --git a/src/emu/ui/sliders.cpp b/src/emu/ui/sliders.cpp
index a7b58aeb275..26da6327202 100644
--- a/src/emu/ui/sliders.cpp
+++ b/src/emu/ui/sliders.cpp
@@ -242,7 +242,7 @@ UINT32 ui_menu_sliders::ui_handler(running_machine &machine, render_container *c
/* if this is the first call, push the sliders menu */
if (state)
- ui_menu::stack_push(auto_alloc_clear(machine, ui_menu_sliders(machine, container, true)));
+ ui_menu::stack_push(auto_alloc_clear(machine, <ui_menu_sliders>(machine, container, true)));
/* handle standard menus */
result = ui_menu::ui_handler(machine, container, state);
diff --git a/src/emu/ui/slotopt.cpp b/src/emu/ui/slotopt.cpp
index 370fe8388a7..cce17353532 100644
--- a/src/emu/ui/slotopt.cpp
+++ b/src/emu/ui/slotopt.cpp
@@ -21,18 +21,18 @@
-------------------------------------------------*/
device_slot_option *ui_menu_slot_devices::slot_get_current_option(device_slot_interface *slot)
{
- const char *current;
+ std::string current;
if (slot->fixed())
{
- current = slot->default_option();
+ if (slot->default_option() == nullptr) return nullptr;
+ current.assign(slot->default_option());
}
else
{
- std::string temp;
- current = machine().options().main_value(temp, slot->device().tag() + 1);
+ current = machine().options().main_value(slot->device().tag() + 1);
}
- return slot->option(current);
+ return slot->option(current.c_str());
}
/*-------------------------------------------------
@@ -204,7 +204,7 @@ void ui_menu_slot_devices::handle()
device_slot_interface *slot = (device_slot_interface *)menu_event->itemref;
device_slot_option *option = slot_get_current_option(slot);
if (option)
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_device_config(machine(), container, slot, option)));
+ ui_menu::stack_push(auto_alloc_clear(machine(), <ui_menu_device_config>(machine(), container, slot, option)));
}
}
}
diff --git a/src/emu/ui/swlist.cpp b/src/emu/ui/swlist.cpp
index 6155a4c5883..64eb5109fae 100644
--- a/src/emu/ui/swlist.cpp
+++ b/src/emu/ui/swlist.cpp
@@ -448,7 +448,7 @@ void ui_menu_software::handle()
const ui_menu_event *event = process(0);
if (event != nullptr && event->iptkey == IPT_UI_SELECT) {
- // ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_software_list(machine(), container, (software_list_config *)event->itemref, image)));
+ // ui_menu::stack_push(auto_alloc_clear(machine(), <ui_menu_software_list>(machine(), container, (software_list_config *)event->itemref, image)));
*m_result = (software_list_device *)event->itemref;
ui_menu::stack_pop(machine());
}
diff --git a/src/emu/ui/ui.cpp b/src/emu/ui/ui.cpp
index 3a016b25b10..3f2d252c107 100644
--- a/src/emu/ui/ui.cpp
+++ b/src/emu/ui/ui.cpp
@@ -244,7 +244,7 @@ ui_manager::ui_manager(running_machine &machine)
// more initialization
set_handler(handler_messagebox, 0);
- m_non_char_keys_down = auto_alloc_array(machine, UINT8, (ARRAY_LENGTH(non_char_keys) + 7) / 8);
+ m_non_char_keys_down = std::make_unique<UINT8[]>((ARRAY_LENGTH(non_char_keys) + 7) / 8);
m_mouse_show = machine.system().flags & MACHINE_CLICKABLE_ARTWORK ? true : false;
// request a callback upon exiting
@@ -358,7 +358,7 @@ void ui_manager::display_startup_screens(bool first_time, bool show_disclaimer)
break;
case 3:
- if (show_mandatory_fileman && image_mandatory_scan(machine(), messagebox_text).length() > 0)
+ if (show_mandatory_fileman && machine().image().mandatory_scan(messagebox_text).length() > 0)
{
std::string warning;
warning.assign("This driver requires images to be loaded in the following device(s): ").append(messagebox_text.substr(0, messagebox_text.length() - 2));
@@ -451,7 +451,7 @@ void ui_manager::update_and_render(render_container *container)
{
INT32 mouse_target_x, mouse_target_y;
bool mouse_button;
- render_target *mouse_target = ui_input_find_mouse(machine(), &mouse_target_x, &mouse_target_y, &mouse_button);
+ render_target *mouse_target = machine().ui_input().find_mouse(&mouse_target_x, &mouse_target_y, &mouse_button);
if (mouse_target != nullptr)
{
@@ -1019,16 +1019,18 @@ std::string &ui_manager::warnings_string(std::string &str)
MACHINE_IMPERFECT_SOUND | \
MACHINE_IMPERFECT_GRAPHICS | \
MACHINE_IMPERFECT_KEYBOARD | \
- MACHINE_NO_COCKTAIL)
+ MACHINE_NO_COCKTAIL| \
+ MACHINE_IS_INCOMPLETE| \
+ MACHINE_NO_SOUND_HW )
str.clear();
// if no warnings, nothing to return
- if (rom_load_warnings(machine()) == 0 && rom_load_knownbad(machine()) == 0 && !(machine().system().flags & WARNING_FLAGS) && software_load_warnings_message(machine()).length() == 0)
+ if (machine().rom_load().warnings() == 0 && machine().rom_load().knownbad() == 0 && !(machine().system().flags & WARNING_FLAGS) && machine().rom_load().software_load_warnings_message().length() == 0)
return str;
// add a warning if any ROMs were loaded with warnings
- if (rom_load_warnings(machine()) > 0)
+ if (machine().rom_load().warnings() > 0)
{
str.append("One or more ROMs/CHDs for this ");
str.append(emulator_info::get_gamenoun());
@@ -1039,20 +1041,20 @@ std::string &ui_manager::warnings_string(std::string &str)
str.append("\n");
}
- if (software_load_warnings_message(machine()).length()>0) {
- str.append(software_load_warnings_message(machine()));
+ if (machine().rom_load().software_load_warnings_message().length()>0) {
+ str.append(machine().rom_load().software_load_warnings_message());
if (machine().system().flags & WARNING_FLAGS)
str.append("\n");
}
// if we have at least one warning flag, print the general header
- if ((machine().system().flags & WARNING_FLAGS) || rom_load_knownbad(machine()) > 0)
+ if ((machine().system().flags & WARNING_FLAGS) || machine().rom_load().knownbad() > 0)
{
str.append("There are known problems with this ");
str.append(emulator_info::get_gamenoun());
str.append("\n\n");
// add a warning if any ROMs are flagged BAD_DUMP/NO_DUMP
- if (rom_load_knownbad(machine()) > 0) {
+ if (machine().rom_load().knownbad() > 0) {
str.append("One or more ROMs/CHDs for this ");
str.append(emulator_info::get_gamenoun());
str.append(" have not been correctly dumped.\n");
@@ -1083,6 +1085,20 @@ std::string &ui_manager::warnings_string(std::string &str)
str.append(" requires external artwork files\n");
}
+ if (machine().system().flags & MACHINE_IS_INCOMPLETE )
+ {
+ str.append("This ");
+ str.append(emulator_info::get_gamenoun());
+ str.append(" was never completed. It may exhibit strange behavior or missing elements that are not bugs in the emulation.\n");
+ }
+
+ if (machine().system().flags & MACHINE_NO_SOUND_HW )
+ {
+ str.append("This ");
+ str.append(emulator_info::get_gamenoun());
+ str.append(" has no sound hardware, MAME will produce no sounds, this is expected behaviour.\n");
+ }
+
// if there's a NOT WORKING, UNEMULATED PROTECTION or GAME MECHANICAL warning, make it stronger
if (machine().system().flags & (MACHINE_NOT_WORKING | MACHINE_UNEMULATED_PROTECTION | MACHINE_MECHANICAL))
{
@@ -1153,8 +1169,7 @@ std::string &ui_manager::warnings_string(std::string &str)
std::string &ui_manager::game_info_astring(std::string &str)
{
// print description, manufacturer, and CPU:
- std::string tempstr;
- strprintf(str, "%s\n%s %s\nDriver: %s\n\nCPU:\n", machine().system().description, machine().system().year, machine().system().manufacturer, core_filename_extract_base(tempstr, machine().system().source_file).c_str());
+ strprintf(str, "%s\n%s %s\nDriver: %s\n\nCPU:\n", machine().system().description, machine().system().year, machine().system().manufacturer, core_filename_extract_base(machine().system().source_file).c_str());
// loop over all CPUs
execute_interface_iterator execiter(machine().root_device());
@@ -1289,15 +1304,15 @@ UINT32 ui_manager::handler_messagebox_ok(running_machine &machine, render_contai
machine.ui().draw_text_box(container, messagebox_text.c_str(), JUSTIFY_LEFT, 0.5f, 0.5f, messagebox_backcolor);
// an 'O' or left joystick kicks us to the next state
- if (state == 0 && (machine.input().code_pressed_once(KEYCODE_O) || ui_input_pressed(machine, IPT_UI_LEFT)))
+ if (state == 0 && (machine.input().code_pressed_once(KEYCODE_O) || machine.ui_input().pressed(IPT_UI_LEFT)))
state++;
// a 'K' or right joystick exits the state
- else if (state == 1 && (machine.input().code_pressed_once(KEYCODE_K) || ui_input_pressed(machine, IPT_UI_RIGHT)))
+ else if (state == 1 && (machine.input().code_pressed_once(KEYCODE_K) || machine.ui_input().pressed(IPT_UI_RIGHT)))
state = UI_HANDLER_CANCEL;
// if the user cancels, exit out completely
- else if (ui_input_pressed(machine, IPT_UI_CANCEL))
+ else if (machine.ui_input().pressed(IPT_UI_CANCEL))
{
machine.schedule_exit();
state = UI_HANDLER_CANCEL;
@@ -1319,7 +1334,7 @@ UINT32 ui_manager::handler_messagebox_anykey(running_machine &machine, render_co
machine.ui().draw_text_box(container, messagebox_text.c_str(), JUSTIFY_LEFT, 0.5f, 0.5f, messagebox_backcolor);
// if the user cancels, exit out completely
- if (ui_input_pressed(machine, IPT_UI_CANCEL))
+ if (machine.ui_input().pressed(IPT_UI_CANCEL))
{
machine.schedule_exit();
state = UI_HANDLER_CANCEL;
@@ -1348,7 +1363,7 @@ void ui_manager::process_natural_keyboard()
UINT8 key_down_mask;
// loop while we have interesting events
- while (ui_input_pop_event(machine(), &event))
+ while (machine().ui_input().pop_event(&event))
{
// if this was a UI_EVENT_CHAR event, post it
if (event.event_type == UI_EVENT_CHAR)
@@ -1489,7 +1504,7 @@ UINT32 ui_manager::handler_ingame(running_machine &machine, render_container *co
if (machine.ui().show_fps_counter())
{
std::string tempstring;
- machine.ui().draw_text_full(container, machine.video().speed_text(tempstring).c_str(), 0.0f, 0.0f, 1.0f,
+ machine.ui().draw_text_full(container, machine.video().speed_text().c_str(), 0.0f, 0.0f, 1.0f,
JUSTIFY_RIGHT, WRAP_WORD, DRAW_OPAQUE, ARGB_WHITE, ARGB_BLACK, nullptr, nullptr);
}
@@ -1514,7 +1529,7 @@ UINT32 ui_manager::handler_ingame(running_machine &machine, render_container *co
if (machine.ioport().has_keyboard())
{
// are we toggling the UI with ScrLk?
- if (ui_input_pressed(machine, IPT_UI_TOGGLE_UI))
+ if (machine.ui_input().pressed(IPT_UI_TOGGLE_UI))
{
// toggle the UI
machine.set_ui_active(!machine.ui_active());
@@ -1550,7 +1565,7 @@ UINT32 ui_manager::handler_ingame(running_machine &machine, render_container *co
if (!ui_disabled)
{
// paste command
- if (ui_input_pressed(machine, IPT_UI_PASTE))
+ if (machine.ui_input().pressed(IPT_UI_PASTE))
machine.ui().paste();
}
@@ -1558,28 +1573,28 @@ UINT32 ui_manager::handler_ingame(running_machine &machine, render_container *co
if (ui_disabled) return ui_disabled;
- if (ui_input_pressed(machine, IPT_UI_CANCEL))
+ if (machine.ui_input().pressed(IPT_UI_CANCEL))
{
machine.ui().request_quit();
return 0;
}
// turn on menus if requested
- if (ui_input_pressed(machine, IPT_UI_CONFIGURE))
+ if (machine.ui_input().pressed(IPT_UI_CONFIGURE))
return machine.ui().set_handler(ui_menu::ui_handler, 0);
// if the on-screen display isn't up and the user has toggled it, turn it on
- if ((machine.debug_flags & DEBUG_FLAG_ENABLED) == 0 && ui_input_pressed(machine, IPT_UI_ON_SCREEN_DISPLAY))
+ if ((machine.debug_flags & DEBUG_FLAG_ENABLED) == 0 && machine.ui_input().pressed(IPT_UI_ON_SCREEN_DISPLAY))
return machine.ui().set_handler(ui_menu_sliders::ui_handler, 1);
// handle a reset request
- if (ui_input_pressed(machine, IPT_UI_RESET_MACHINE))
+ if (machine.ui_input().pressed(IPT_UI_RESET_MACHINE))
machine.schedule_hard_reset();
- if (ui_input_pressed(machine, IPT_UI_SOFT_RESET))
+ if (machine.ui_input().pressed(IPT_UI_SOFT_RESET))
machine.schedule_soft_reset();
// handle a request to display graphics/palette
- if (ui_input_pressed(machine, IPT_UI_SHOW_GFX))
+ if (machine.ui_input().pressed(IPT_UI_SHOW_GFX))
{
if (!is_paused)
machine.pause();
@@ -1587,7 +1602,7 @@ UINT32 ui_manager::handler_ingame(running_machine &machine, render_container *co
}
// handle a tape control key
- if (ui_input_pressed(machine, IPT_UI_TAPE_START))
+ if (machine.ui_input().pressed(IPT_UI_TAPE_START))
{
cassette_device_iterator cassiter(machine.root_device());
for (cassette_image_device *cass = cassiter.first(); cass != nullptr; cass = cassiter.next())
@@ -1596,7 +1611,7 @@ UINT32 ui_manager::handler_ingame(running_machine &machine, render_container *co
return 0;
}
}
- if (ui_input_pressed(machine, IPT_UI_TAPE_STOP))
+ if (machine.ui_input().pressed(IPT_UI_TAPE_STOP))
{
cassette_device_iterator cassiter(machine.root_device());
for (cassette_image_device *cass = cassiter.first(); cass != nullptr; cass = cassiter.next())
@@ -1607,25 +1622,25 @@ UINT32 ui_manager::handler_ingame(running_machine &machine, render_container *co
}
// handle a save state request
- if (ui_input_pressed(machine, IPT_UI_SAVE_STATE))
+ if (machine.ui_input().pressed(IPT_UI_SAVE_STATE))
{
machine.pause();
return machine.ui().set_handler(handler_load_save, LOADSAVE_SAVE);
}
// handle a load state request
- if (ui_input_pressed(machine, IPT_UI_LOAD_STATE))
+ if (machine.ui_input().pressed(IPT_UI_LOAD_STATE))
{
machine.pause();
return machine.ui().set_handler(handler_load_save, LOADSAVE_LOAD);
}
// handle a save snapshot request
- if (ui_input_pressed(machine, IPT_UI_SNAPSHOT))
+ if (machine.ui_input().pressed(IPT_UI_SNAPSHOT))
machine.video().save_active_screen_snapshots();
// toggle pause
- if (ui_input_pressed(machine, IPT_UI_PAUSE))
+ if (machine.ui_input().pressed(IPT_UI_PAUSE))
{
// with a shift key, it is single step
if (is_paused && (machine.input().code_pressed(KEYCODE_LSHIFT) || machine.input().code_pressed(KEYCODE_RSHIFT)))
@@ -1638,31 +1653,31 @@ UINT32 ui_manager::handler_ingame(running_machine &machine, render_container *co
}
// handle a toggle cheats request
- if (ui_input_pressed(machine, IPT_UI_TOGGLE_CHEAT))
+ if (machine.ui_input().pressed(IPT_UI_TOGGLE_CHEAT))
machine.cheat().set_enable(!machine.cheat().enabled());
// toggle movie recording
- if (ui_input_pressed(machine, IPT_UI_RECORD_MOVIE))
+ if (machine.ui_input().pressed(IPT_UI_RECORD_MOVIE))
machine.video().toggle_record_movie();
// toggle profiler display
- if (ui_input_pressed(machine, IPT_UI_SHOW_PROFILER))
+ if (machine.ui_input().pressed(IPT_UI_SHOW_PROFILER))
machine.ui().set_show_profiler(!machine.ui().show_profiler());
// toggle FPS display
- if (ui_input_pressed(machine, IPT_UI_SHOW_FPS))
+ if (machine.ui_input().pressed(IPT_UI_SHOW_FPS))
machine.ui().set_show_fps(!machine.ui().show_fps());
// increment frameskip?
- if (ui_input_pressed(machine, IPT_UI_FRAMESKIP_INC))
+ if (machine.ui_input().pressed(IPT_UI_FRAMESKIP_INC))
machine.ui().increase_frameskip();
// decrement frameskip?
- if (ui_input_pressed(machine, IPT_UI_FRAMESKIP_DEC))
+ if (machine.ui_input().pressed(IPT_UI_FRAMESKIP_DEC))
machine.ui().decrease_frameskip();
// toggle throttle?
- if (ui_input_pressed(machine, IPT_UI_THROTTLE))
+ if (machine.ui_input().pressed(IPT_UI_THROTTLE))
machine.video().toggle_throttle();
// check for fast forward
@@ -1699,7 +1714,7 @@ UINT32 ui_manager::handler_load_save(running_machine &machine, render_container
machine.ui().draw_message_window(container, "Select position to load from");
// check for cancel key
- if (ui_input_pressed(machine, IPT_UI_CANCEL))
+ if (machine.ui_input().pressed(IPT_UI_CANCEL))
{
// display a popup indicating things were cancelled
if (state == LOADSAVE_SAVE)
@@ -1767,17 +1782,13 @@ void ui_manager::request_quit()
UINT32 ui_manager::handler_confirm_quit(running_machine &machine, render_container *container, UINT32 state)
{
// get the text for 'UI Select'
- std::string ui_select_text;
- machine.input().seq_name(ui_select_text, machine.ioport().type_seq(IPT_UI_SELECT, 0, SEQ_TYPE_STANDARD));
+ std::string ui_select_text = machine.input().seq_name(machine.ioport().type_seq(IPT_UI_SELECT, 0, SEQ_TYPE_STANDARD));
// get the text for 'UI Cancel'
- std::string ui_cancel_text;
- machine.input().seq_name(ui_cancel_text, machine.ioport().type_seq(IPT_UI_CANCEL, 0, SEQ_TYPE_STANDARD));
+ std::string ui_cancel_text = machine.input().seq_name(machine.ioport().type_seq(IPT_UI_CANCEL, 0, SEQ_TYPE_STANDARD));
// assemble the quit message
- std::string quit_message;
- strprintf(quit_message,
- "Are you sure you want to quit?\n\n"
+ std::string quit_message = strformat("Are you sure you want to quit?\n\n"
"Press ''%s'' to quit,\n"
"Press ''%s'' to return to emulation.",
ui_select_text.c_str(),
@@ -1787,11 +1798,11 @@ UINT32 ui_manager::handler_confirm_quit(running_machine &machine, render_contain
machine.pause();
// if the user press ENTER, quit the game
- if (ui_input_pressed(machine, IPT_UI_SELECT))
+ if (machine.ui_input().pressed(IPT_UI_SELECT))
machine.schedule_exit();
// if the user press ESC, just continue
- else if (ui_input_pressed(machine, IPT_UI_CANCEL))
+ else if (machine.ui_input().pressed(IPT_UI_CANCEL))
{
machine.resume();
state = UI_HANDLER_CANCEL;
@@ -1861,7 +1872,7 @@ static slider_state *slider_init(running_machine &machine)
INT32 maxval = 2000;
INT32 defval = 1000;
- info.stream->input_name(info.inputnum, str);
+ str.assign(info.stream->input_name(info.inputnum));
str.append(" Volume");
*tailptr = slider_alloc(machine, str.c_str(), 0, defval, maxval, 20, slider_mixervol, (void *)(FPTR)item);
tailptr = &(*tailptr)->next;
diff --git a/src/emu/ui/ui.h b/src/emu/ui/ui.h
index 987cf2b8976..ac68a2fb773 100644
--- a/src/emu/ui/ui.h
+++ b/src/emu/ui/ui.h
@@ -179,7 +179,7 @@ private:
bool m_show_profiler;
osd_ticks_t m_popup_text_end;
bool m_use_natural_keyboard;
- UINT8 * m_non_char_keys_down;
+ std::unique_ptr<UINT8[]> m_non_char_keys_down;
render_texture * m_mouse_arrow_texture;
bool m_mouse_show;
diff --git a/src/emu/ui/videoopt.cpp b/src/emu/ui/videoopt.cpp
index c3427004008..e76c27305c8 100644
--- a/src/emu/ui/videoopt.cpp
+++ b/src/emu/ui/videoopt.cpp
@@ -24,7 +24,7 @@ void ui_menu_video_targets::handle()
/* process the menu */
const ui_menu_event *menu_event = process(0);
if (menu_event != nullptr && menu_event->iptkey == IPT_UI_SELECT)
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_video_options(machine(), container, static_cast<render_target *>(menu_event->itemref))));
+ ui_menu::stack_push(auto_alloc_clear(machine(), <ui_menu_video_options>(machine(), container, static_cast<render_target *>(menu_event->itemref))));
}
diff --git a/src/emu/ui/viewgfx.cpp b/src/emu/ui/viewgfx.cpp
index c59be16b199..326e67779c9 100644
--- a/src/emu/ui/viewgfx.cpp
+++ b/src/emu/ui/viewgfx.cpp
@@ -301,13 +301,13 @@ again:
}
// handle keys
- if (ui_input_pressed(machine, IPT_UI_SELECT))
+ if (machine.ui_input().pressed(IPT_UI_SELECT))
{
state.mode = (state.mode + 1) % 3;
state.bitmap_dirty = true;
}
- if (ui_input_pressed(machine, IPT_UI_PAUSE))
+ if (machine.ui_input().pressed(IPT_UI_PAUSE))
{
if (machine.paused())
machine.resume();
@@ -315,7 +315,7 @@ again:
machine.pause();
}
- if (ui_input_pressed(machine, IPT_UI_CANCEL) || ui_input_pressed(machine, IPT_UI_SHOW_GFX))
+ if (machine.ui_input().pressed(IPT_UI_CANCEL) || machine.ui_input().pressed(IPT_UI_SHOW_GFX))
goto cancel;
return uistate;
@@ -481,9 +481,9 @@ static void palette_handle_keys(running_machine &machine, ui_gfx_state &state)
int total;
// handle zoom (minus,plus)
- if (ui_input_pressed(machine, IPT_UI_ZOOM_OUT))
+ if (machine.ui_input().pressed(IPT_UI_ZOOM_OUT))
state.palette.columns /= 2;
- if (ui_input_pressed(machine, IPT_UI_ZOOM_IN))
+ if (machine.ui_input().pressed(IPT_UI_ZOOM_IN))
state.palette.columns *= 2;
// clamp within range
@@ -493,7 +493,7 @@ static void palette_handle_keys(running_machine &machine, ui_gfx_state &state)
state.palette.columns = 64;
// handle colormap selection (open bracket,close bracket)
- if (ui_input_pressed(machine, IPT_UI_PREV_GROUP))
+ if (machine.ui_input().pressed(IPT_UI_PREV_GROUP))
{
if (state.palette.which)
state.palette.which = 0;
@@ -505,7 +505,7 @@ static void palette_handle_keys(running_machine &machine, ui_gfx_state &state)
state.palette.which = (palette->indirect_entries() > 0);
}
}
- if (ui_input_pressed(machine, IPT_UI_NEXT_GROUP))
+ if (machine.ui_input().pressed(IPT_UI_NEXT_GROUP))
{
if (!state.palette.which && palette->indirect_entries() > 0)
state.palette.which = 1;
@@ -526,17 +526,17 @@ static void palette_handle_keys(running_machine &machine, ui_gfx_state &state)
screencount = rowcount * rowcount;
// handle keyboard navigation
- if (ui_input_pressed_repeat(machine, IPT_UI_UP, 4))
+ if (machine.ui_input().pressed_repeat(IPT_UI_UP, 4))
state.palette.offset -= rowcount;
- if (ui_input_pressed_repeat(machine, IPT_UI_DOWN, 4))
+ if (machine.ui_input().pressed_repeat(IPT_UI_DOWN, 4))
state.palette.offset += rowcount;
- if (ui_input_pressed_repeat(machine, IPT_UI_PAGE_UP, 6))
+ if (machine.ui_input().pressed_repeat(IPT_UI_PAGE_UP, 6))
state.palette.offset -= screencount;
- if (ui_input_pressed_repeat(machine, IPT_UI_PAGE_DOWN, 6))
+ if (machine.ui_input().pressed_repeat(IPT_UI_PAGE_DOWN, 6))
state.palette.offset += screencount;
- if (ui_input_pressed_repeat(machine, IPT_UI_HOME, 4))
+ if (machine.ui_input().pressed_repeat(IPT_UI_HOME, 4))
state.palette.offset = 0;
- if (ui_input_pressed_repeat(machine, IPT_UI_END, 4))
+ if (machine.ui_input().pressed_repeat(IPT_UI_END, 4))
state.palette.offset = total;
// clamp within range
@@ -731,7 +731,7 @@ static void gfxset_handler(running_machine &machine, render_container *container
static void gfxset_handle_keys(running_machine &machine, ui_gfx_state &state, int xcells, int ycells)
{
// handle gfxset selection (open bracket,close bracket)
- if (ui_input_pressed(machine, IPT_UI_PREV_GROUP))
+ if (machine.ui_input().pressed(IPT_UI_PREV_GROUP))
{
if (state.gfxset.set > 0)
state.gfxset.set--;
@@ -742,7 +742,7 @@ static void gfxset_handle_keys(running_machine &machine, ui_gfx_state &state, in
}
state.bitmap_dirty = true;
}
- if (ui_input_pressed(machine, IPT_UI_NEXT_GROUP))
+ if (machine.ui_input().pressed(IPT_UI_NEXT_GROUP))
{
if (state.gfxset.set < state.gfxdev[state.gfxset.devindex].setcount - 1)
state.gfxset.set++;
@@ -761,10 +761,10 @@ static void gfxset_handle_keys(running_machine &machine, ui_gfx_state &state, in
gfx_element &gfx = *info.interface->gfx(set);
// handle cells per line (minus,plus)
- if (ui_input_pressed(machine, IPT_UI_ZOOM_OUT))
+ if (machine.ui_input().pressed(IPT_UI_ZOOM_OUT))
{ info.columns[set] = xcells - 1; state.bitmap_dirty = true; }
- if (ui_input_pressed(machine, IPT_UI_ZOOM_IN))
+ if (machine.ui_input().pressed(IPT_UI_ZOOM_IN))
{ info.columns[set] = xcells + 1; state.bitmap_dirty = true; }
// clamp within range
@@ -774,24 +774,24 @@ static void gfxset_handle_keys(running_machine &machine, ui_gfx_state &state, in
{ info.columns[set] = 128; state.bitmap_dirty = true; }
// handle rotation (R)
- if (ui_input_pressed(machine, IPT_UI_ROTATE))
+ if (machine.ui_input().pressed(IPT_UI_ROTATE))
{
info.rotate[set] = orientation_add(ROT90, info.rotate[set]);
state.bitmap_dirty = true;
}
// handle navigation within the cells (up,down,pgup,pgdown)
- if (ui_input_pressed_repeat(machine, IPT_UI_UP, 4))
+ if (machine.ui_input().pressed_repeat(IPT_UI_UP, 4))
{ info.offset[set] -= xcells; state.bitmap_dirty = true; }
- if (ui_input_pressed_repeat(machine, IPT_UI_DOWN, 4))
+ if (machine.ui_input().pressed_repeat(IPT_UI_DOWN, 4))
{ info.offset[set] += xcells; state.bitmap_dirty = true; }
- if (ui_input_pressed_repeat(machine, IPT_UI_PAGE_UP, 6))
+ if (machine.ui_input().pressed_repeat(IPT_UI_PAGE_UP, 6))
{ info.offset[set] -= xcells * ycells; state.bitmap_dirty = true; }
- if (ui_input_pressed_repeat(machine, IPT_UI_PAGE_DOWN, 6))
+ if (machine.ui_input().pressed_repeat(IPT_UI_PAGE_DOWN, 6))
{ info.offset[set] += xcells * ycells; state.bitmap_dirty = true; }
- if (ui_input_pressed_repeat(machine, IPT_UI_HOME, 4))
+ if (machine.ui_input().pressed_repeat(IPT_UI_HOME, 4))
{ info.offset[set] = 0; state.bitmap_dirty = true; }
- if (ui_input_pressed_repeat(machine, IPT_UI_END, 4))
+ if (machine.ui_input().pressed_repeat(IPT_UI_END, 4))
{ info.offset[set] = gfx.elements(); state.bitmap_dirty = true; }
// clamp within range
@@ -804,9 +804,9 @@ static void gfxset_handle_keys(running_machine &machine, ui_gfx_state &state, in
{ info.offset[set] = 0; state.bitmap_dirty = true; }
// handle color selection (left,right)
- if (ui_input_pressed_repeat(machine, IPT_UI_LEFT, 4))
+ if (machine.ui_input().pressed_repeat(IPT_UI_LEFT, 4))
{ info.color[set] -= 1; state.bitmap_dirty = true; }
- if (ui_input_pressed_repeat(machine, IPT_UI_RIGHT, 4))
+ if (machine.ui_input().pressed_repeat(IPT_UI_RIGHT, 4))
{ info.color[set] += 1; state.bitmap_dirty = true; }
// clamp within range
@@ -904,7 +904,7 @@ static void gfxset_draw_item(running_machine &machine, gfx_element &gfx, int ind
{
int width = (rotate & ORIENTATION_SWAP_XY) ? gfx.height() : gfx.width();
int height = (rotate & ORIENTATION_SWAP_XY) ? gfx.width() : gfx.height();
- const rgb_t *palette = gfx.palette()->palette()->entry_list_raw() + gfx.colorbase() + color * gfx.granularity();
+ const rgb_t *palette = gfx.palette().palette()->entry_list_raw() + gfx.colorbase() + color * gfx.granularity();
int x, y;
// loop over rows in the cell
@@ -1073,9 +1073,9 @@ static void tilemap_handle_keys(running_machine &machine, ui_gfx_state &state, i
int step;
// handle tilemap selection (open bracket,close bracket)
- if (ui_input_pressed(machine, IPT_UI_PREV_GROUP) && state.tilemap.which > 0)
+ if (machine.ui_input().pressed(IPT_UI_PREV_GROUP) && state.tilemap.which > 0)
{ state.tilemap.which--; state.bitmap_dirty = true; }
- if (ui_input_pressed(machine, IPT_UI_NEXT_GROUP) && state.tilemap.which < machine.tilemap().count() - 1)
+ if (machine.ui_input().pressed(IPT_UI_NEXT_GROUP) && state.tilemap.which < machine.tilemap().count() - 1)
{ state.tilemap.which++; state.bitmap_dirty = true; }
// cache some info in locals
@@ -1084,7 +1084,7 @@ static void tilemap_handle_keys(running_machine &machine, ui_gfx_state &state, i
mapheight = tilemap->height();
// handle zoom (minus,plus)
- if (ui_input_pressed(machine, IPT_UI_ZOOM_OUT) && state.tilemap.zoom > 0)
+ if (machine.ui_input().pressed(IPT_UI_ZOOM_OUT) && state.tilemap.zoom > 0)
{
state.tilemap.zoom--;
state.bitmap_dirty = true;
@@ -1093,7 +1093,7 @@ static void tilemap_handle_keys(running_machine &machine, ui_gfx_state &state, i
else
machine.popmessage("Zoom Auto");
}
- if (ui_input_pressed(machine, IPT_UI_ZOOM_IN) && state.tilemap.zoom < 8)
+ if (machine.ui_input().pressed(IPT_UI_ZOOM_IN) && state.tilemap.zoom < 8)
{
state.tilemap.zoom++;
state.bitmap_dirty = true;
@@ -1101,7 +1101,7 @@ static void tilemap_handle_keys(running_machine &machine, ui_gfx_state &state, i
}
// handle rotation (R)
- if (ui_input_pressed(machine, IPT_UI_ROTATE))
+ if (machine.ui_input().pressed(IPT_UI_ROTATE))
{
state.tilemap.rotate = orientation_add(ROT90, state.tilemap.rotate);
state.bitmap_dirty = true;
@@ -1111,13 +1111,13 @@ static void tilemap_handle_keys(running_machine &machine, ui_gfx_state &state, i
step = 8;
if (machine.input().code_pressed(KEYCODE_LSHIFT)) step = 1;
if (machine.input().code_pressed(KEYCODE_LCONTROL)) step = 64;
- if (ui_input_pressed_repeat(machine, IPT_UI_UP, 4))
+ if (machine.ui_input().pressed_repeat(IPT_UI_UP, 4))
{ state.tilemap.yoffs -= step; state.bitmap_dirty = true; }
- if (ui_input_pressed_repeat(machine, IPT_UI_DOWN, 4))
+ if (machine.ui_input().pressed_repeat(IPT_UI_DOWN, 4))
{ state.tilemap.yoffs += step; state.bitmap_dirty = true; }
- if (ui_input_pressed_repeat(machine, IPT_UI_LEFT, 6))
+ if (machine.ui_input().pressed_repeat(IPT_UI_LEFT, 6))
{ state.tilemap.xoffs -= step; state.bitmap_dirty = true; }
- if (ui_input_pressed_repeat(machine, IPT_UI_RIGHT, 6))
+ if (machine.ui_input().pressed_repeat(IPT_UI_RIGHT, 6))
{ state.tilemap.xoffs += step; state.bitmap_dirty = true; }
// clamp within range
diff --git a/src/emu/uiinput.cpp b/src/emu/uiinput.cpp
index 8ec5c8b91cc..6b26bb323b5 100644
--- a/src/emu/uiinput.cpp
+++ b/src/emu/uiinput.cpp
@@ -16,8 +16,6 @@
CONSTANTS
***************************************************************************/
-#define EVENT_QUEUE_SIZE 128
-
enum
{
SEQ_PRESSED_FALSE = 0, /* not pressed */
@@ -26,58 +24,27 @@ enum
};
+//**************************************************************************
+// NETWORK MANAGER
+//**************************************************************************
-/***************************************************************************
- TYPE DEFINITIONS
-***************************************************************************/
+//-------------------------------------------------
+// network_manager - constructor
+//-------------------------------------------------
-/* private input port state */
-struct ui_input_private
-{
- /* pressed states; retrieved with ui_input_pressed() */
- osd_ticks_t next_repeat[IPT_COUNT];
- UINT8 seqpressed[IPT_COUNT];
-
- /* mouse position/info */
- render_target * current_mouse_target;
- INT32 current_mouse_x;
- INT32 current_mouse_y;
- bool current_mouse_down;
-
- /* popped states; ring buffer of ui_events */
- ui_event events[EVENT_QUEUE_SIZE];
- int events_start;
- int events_end;
-};
-
-
-
-/***************************************************************************
- FUNCTION PROTOYPES
-***************************************************************************/
-
-//static void ui_input_frame_update(running_machine &machine);
-
-
-
-/***************************************************************************
- INITIALIZATION
-***************************************************************************/
-
-/*-------------------------------------------------
- ui_input_init - initializes the UI input
- system
--------------------------------------------------*/
-
-void ui_input_init(running_machine &machine)
+ui_input_manager::ui_input_manager(running_machine &machine)
+ : m_machine(machine),
+ m_current_mouse_target(nullptr),
+ m_current_mouse_down(false),
+ m_events_start(0),
+ m_events_end(0)
{
/* create the private data */
- machine.ui_input_data = auto_alloc_clear(machine, ui_input_private);
- machine.ui_input_data->current_mouse_x = -1;
- machine.ui_input_data->current_mouse_y = -1;
+ m_current_mouse_x = -1;
+ m_current_mouse_y = -1;
/* add a frame callback to poll inputs */
- machine.add_notifier(MACHINE_NOTIFY_FRAME, machine_notify_delegate(FUNC(ui_input_frame_update), &machine));
+ machine.add_notifier(MACHINE_NOTIFY_FRAME, machine_notify_delegate(FUNC(ui_input_manager::frame_update), this));
}
@@ -87,62 +54,54 @@ void ui_input_init(running_machine &machine)
***************************************************************************/
/*-------------------------------------------------
- ui_input_frame_update - looks through pressed
+ frame_update - looks through pressed
input as per events pushed our way and posts
corresponding IPT_UI_* events
-------------------------------------------------*/
-void ui_input_frame_update(running_machine &machine)
+void ui_input_manager::frame_update()
{
- ui_input_private *uidata = machine.ui_input_data;
-
/* update the state of all the UI keys */
for (ioport_type code = ioport_type(IPT_UI_FIRST + 1); code < IPT_UI_LAST; ++code)
{
- bool pressed = machine.ioport().type_pressed(code);
- if (!pressed || uidata->seqpressed[code] != SEQ_PRESSED_RESET)
- uidata->seqpressed[code] = pressed;
+ bool pressed = machine().ioport().type_pressed(code);
+ if (!pressed || m_seqpressed[code] != SEQ_PRESSED_RESET)
+ m_seqpressed[code] = pressed;
}
}
/*-------------------------------------------------
- ui_input_push_event - pushes a single event
+ push_event - pushes a single event
onto the queue
-------------------------------------------------*/
-bool ui_input_push_event(running_machine &machine, ui_event evt)
+bool ui_input_manager::push_event(ui_event evt)
{
- ui_input_private *uidata = machine.ui_input_data;
-
- /* we may be called before the UI is initialized */
- if (uidata == nullptr)
- return false;
-
/* some pre-processing (this is an icky place to do this stuff!) */
switch (evt.event_type)
{
case UI_EVENT_MOUSE_MOVE:
- uidata->current_mouse_target = evt.target;
- uidata->current_mouse_x = evt.mouse_x;
- uidata->current_mouse_y = evt.mouse_y;
+ m_current_mouse_target = evt.target;
+ m_current_mouse_x = evt.mouse_x;
+ m_current_mouse_y = evt.mouse_y;
break;
case UI_EVENT_MOUSE_LEAVE:
- if (uidata->current_mouse_target == evt.target)
+ if (m_current_mouse_target == evt.target)
{
- uidata->current_mouse_target = nullptr;
- uidata->current_mouse_x = -1;
- uidata->current_mouse_y = -1;
+ m_current_mouse_target = nullptr;
+ m_current_mouse_x = -1;
+ m_current_mouse_y = -1;
}
break;
case UI_EVENT_MOUSE_DOWN:
- uidata->current_mouse_down = true;
+ m_current_mouse_down = true;
break;
case UI_EVENT_MOUSE_UP:
- uidata->current_mouse_down = false;
+ m_current_mouse_down = false;
break;
default:
@@ -151,28 +110,27 @@ bool ui_input_push_event(running_machine &machine, ui_event evt)
}
/* is the queue filled up? */
- if ((uidata->events_end + 1) % ARRAY_LENGTH(uidata->events) == uidata->events_start)
+ if ((m_events_end + 1) % ARRAY_LENGTH(m_events) == m_events_start)
return false;
- uidata->events[uidata->events_end++] = evt;
- uidata->events_end %= ARRAY_LENGTH(uidata->events);
+ m_events[m_events_end++] = evt;
+ m_events_end %= ARRAY_LENGTH(m_events);
return true;
}
/*-------------------------------------------------
- ui_input_pop_event - pops an event off of the queue
+ pop_event - pops an event off of the queue
-------------------------------------------------*/
-bool ui_input_pop_event(running_machine &machine, ui_event *evt)
+bool ui_input_manager::pop_event(ui_event *evt)
{
- ui_input_private *uidata = machine.ui_input_data;
bool result;
- if (uidata->events_start != uidata->events_end)
+ if (m_events_start != m_events_end)
{
- *evt = uidata->events[uidata->events_start++];
- uidata->events_start %= ARRAY_LENGTH(uidata->events);
+ *evt = m_events[m_events_start++];
+ m_events_start %= ARRAY_LENGTH(m_events);
result = true;
}
else
@@ -185,40 +143,38 @@ bool ui_input_pop_event(running_machine &machine, ui_event *evt)
/*-------------------------------------------------
- ui_input_reset - clears all outstanding events
+ reset - clears all outstanding events
and resets the sequence states
-------------------------------------------------*/
-void ui_input_reset(running_machine &machine)
+void ui_input_manager::reset()
{
- ui_input_private *uidata = machine.ui_input_data;
int code;
- uidata->events_start = 0;
- uidata->events_end = 0;
+ m_events_start = 0;
+ m_events_end = 0;
for (code = IPT_UI_FIRST + 1; code < IPT_UI_LAST; code++)
{
- uidata->seqpressed[code] = SEQ_PRESSED_RESET;
- uidata->next_repeat[code] = 0;
+ m_seqpressed[code] = SEQ_PRESSED_RESET;
+ m_next_repeat[code] = 0;
}
}
/*-------------------------------------------------
- ui_input_find_mouse - retrieves the current
+ find_mouse - retrieves the current
location of the mouse
-------------------------------------------------*/
-render_target *ui_input_find_mouse(running_machine &machine, INT32 *x, INT32 *y, bool *button)
+render_target *ui_input_manager::find_mouse(INT32 *x, INT32 *y, bool *button)
{
- ui_input_private *uidata = machine.ui_input_data;
if (x != nullptr)
- *x = uidata->current_mouse_x;
+ *x = m_current_mouse_x;
if (y != nullptr)
- *y = uidata->current_mouse_y;
+ *y = m_current_mouse_y;
if (button != nullptr)
- *button = uidata->current_mouse_down;
- return uidata->current_mouse_target;
+ *button = m_current_mouse_down;
+ return m_current_mouse_target;
}
@@ -228,34 +184,33 @@ render_target *ui_input_find_mouse(running_machine &machine, INT32 *x, INT32 *y,
***************************************************************************/
/*-------------------------------------------------
- ui_input_pressed - return TRUE if a key down
+ pressed - return TRUE if a key down
for the given user interface sequence is
detected
-------------------------------------------------*/
-bool ui_input_pressed(running_machine &machine, int code)
+bool ui_input_manager::pressed(int code)
{
- return ui_input_pressed_repeat(machine, code, 0);
+ return pressed_repeat(code, 0);
}
/*-------------------------------------------------
- ui_input_pressed_repeat - return TRUE if a key
+ pressed_repeat - return TRUE if a key
down for the given user interface sequence is
detected, or if autorepeat at the given speed
is triggered
-------------------------------------------------*/
-bool ui_input_pressed_repeat(running_machine &machine, int code, int speed)
+bool ui_input_manager::pressed_repeat(int code, int speed)
{
- ui_input_private *uidata = machine.ui_input_data;
int pressed;
g_profiler.start(PROFILER_INPUT);
/* get the status of this key (assumed to be only in the defaults) */
assert(code >= IPT_UI_CONFIGURE && code <= IPT_OSD_16);
- pressed = (uidata->seqpressed[code] == SEQ_PRESSED_TRUE);
+ pressed = (m_seqpressed[code] == SEQ_PRESSED_TRUE);
/* if down, handle it specially */
if (pressed)
@@ -263,12 +218,12 @@ g_profiler.start(PROFILER_INPUT);
osd_ticks_t tps = osd_ticks_per_second();
/* if this is the first press, set a 3x delay and leave pressed = 1 */
- if (uidata->next_repeat[code] == 0)
- uidata->next_repeat[code] = osd_ticks() + 3 * speed * tps / 60;
+ if (m_next_repeat[code] == 0)
+ m_next_repeat[code] = osd_ticks() + 3 * speed * tps / 60;
/* if this is an autorepeat case, set a 1x delay and leave pressed = 1 */
- else if (speed > 0 && (osd_ticks() + tps - uidata->next_repeat[code]) >= tps)
- uidata->next_repeat[code] += 1 * speed * tps / 60;
+ else if (speed > 0 && (osd_ticks() + tps - m_next_repeat[code]) >= tps)
+ m_next_repeat[code] += 1 * speed * tps / 60;
/* otherwise, reset pressed = 0 */
else
@@ -277,9 +232,95 @@ g_profiler.start(PROFILER_INPUT);
/* if we're not pressed, reset the memory field */
else
- uidata->next_repeat[code] = 0;
+ m_next_repeat[code] = 0;
g_profiler.stop();
return pressed;
}
+
+/*-------------------------------------------------
+ push_mouse_move_event - pushes a mouse
+ move event to the specified render_target
+-------------------------------------------------*/
+
+void ui_input_manager::push_mouse_move_event(render_target* target, INT32 x, INT32 y)
+{
+ ui_event event = { UI_EVENT_NONE };
+ event.event_type = UI_EVENT_MOUSE_MOVE;
+ event.target = target;
+ event.mouse_x = x;
+ event.mouse_y = y;
+ push_event(event);
+}
+
+/*-------------------------------------------------
+ push_mouse_leave_event - pushes a
+ mouse leave event to the specified render_target
+-------------------------------------------------*/
+
+void ui_input_manager::push_mouse_leave_event(render_target* target)
+{
+ ui_event event = { UI_EVENT_NONE };
+ event.event_type = UI_EVENT_MOUSE_LEAVE;
+ event.target = target;
+ push_event(event);
+}
+
+/*-------------------------------------------------
+ push_mouse_down_event - pushes a mouse
+ down event to the specified render_target
+-------------------------------------------------*/
+
+void ui_input_manager::push_mouse_down_event(render_target* target, INT32 x, INT32 y)
+{
+ ui_event event = { UI_EVENT_NONE };
+ event.event_type = UI_EVENT_MOUSE_DOWN;
+ event.target = target;
+ event.mouse_x = x;
+ event.mouse_y = y;
+ push_event(event);
+}
+
+/*-------------------------------------------------
+ push_mouse_down_event - pushes a mouse
+ down event to the specified render_target
+-------------------------------------------------*/
+
+void ui_input_manager::push_mouse_up_event(render_target* target, INT32 x, INT32 y)
+{
+ ui_event event = { UI_EVENT_NONE };
+ event.event_type = UI_EVENT_MOUSE_UP;
+ event.target = target;
+ event.mouse_x = x;
+ event.mouse_y = y;
+ push_event(event);
+}
+
+/*-------------------------------------------------
+ push_mouse_double_click_event - pushes
+ a mouse double-click event to the specified
+ render_target
+-------------------------------------------------*/
+void ui_input_manager::push_mouse_double_click_event(render_target* target, INT32 x, INT32 y)
+{
+ ui_event event = { UI_EVENT_NONE };
+ event.event_type = UI_EVENT_MOUSE_DOUBLE_CLICK;
+ event.target = target;
+ event.mouse_x = x;
+ event.mouse_y = y;
+ push_event(event);
+}
+
+/*-------------------------------------------------
+ push_char_event - pushes a char event
+ to the specified render_target
+-------------------------------------------------*/
+void ui_input_manager::push_char_event(render_target* target, unicode_char ch)
+{
+ ui_event event = { UI_EVENT_NONE };
+ event.event_type = UI_EVENT_CHAR;
+ event.target = target;
+ event.ch = ch;
+ push_event(event);
+}
diff --git a/src/emu/uiinput.h b/src/emu/uiinput.h
index 3b7a63d420d..2e89a0c413a 100644
--- a/src/emu/uiinput.h
+++ b/src/emu/uiinput.h
@@ -16,6 +16,12 @@
/***************************************************************************
+ CONSTANTS
+***************************************************************************/
+
+#define EVENT_QUEUE_SIZE 128
+
+/***************************************************************************
TYPE DEFINITIONS
***************************************************************************/
@@ -30,7 +36,6 @@ enum ui_event_type
UI_EVENT_CHAR
};
-
struct ui_event
{
ui_event_type event_type;
@@ -41,145 +46,65 @@ struct ui_event
unicode_char ch;
};
+// ======================> ui_input_manager
+class ui_input_manager
+{
+public:
+ // construction/destruction
+ ui_input_manager(running_machine &machine);
-/***************************************************************************
- FUNCTION PROTOTYPES
-***************************************************************************/
-
-
-/* ----- core system management ----- */
-
-/* initialization */
-void ui_input_init(running_machine &machine);
-
-
-
-/* ----- event handling ----- */
-
-void ui_input_frame_update(running_machine &machine);
-
-/* pushes a single event onto the queue */
-bool ui_input_push_event(running_machine &machine, ui_event event);
-
-/* pops an event off of the queue */
-bool ui_input_pop_event(running_machine &machine, ui_event *event);
-
-/* clears all outstanding events */
-void ui_input_reset(running_machine &machine);
-
-/* retrieves the current location of the mouse */
-render_target *ui_input_find_mouse(running_machine &machine, INT32 *x, INT32 *y, bool *button);
-
-
-
-/* ----- user interface sequence reading ----- */
-
-/* return TRUE if a key down for the given user interface sequence is detected */
-bool ui_input_pressed(running_machine &machine, int code);
-
-/* return TRUE if a key down for the given user interface sequence is detected, or if
- autorepeat at the given speed is triggered */
-bool ui_input_pressed_repeat(running_machine &machine, int code, int speed);
-
-
-
-/***************************************************************************
- INLINE FUNCTIONS
-***************************************************************************/
-
-/*-------------------------------------------------
- ui_input_push_mouse_move_event - pushes a mouse
- move event to the specified render_target
--------------------------------------------------*/
+ void frame_update();
-static inline void ui_input_push_mouse_move_event(running_machine &machine, render_target *target, INT32 x, INT32 y)
-{
- ui_event event = { UI_EVENT_NONE };
- event.event_type = UI_EVENT_MOUSE_MOVE;
- event.target = target;
- event.mouse_x = x;
- event.mouse_y = y;
- ui_input_push_event(machine, event);
-}
+ /* pushes a single event onto the queue */
+ bool push_event(ui_event event);
+ /* pops an event off of the queue */
+ bool pop_event(ui_event *event);
-/*-------------------------------------------------
- ui_input_push_mouse_leave_event - pushes a
- mouse leave event to the specified render_target
--------------------------------------------------*/
+ /* clears all outstanding events */
+ void reset();
-static inline void ui_input_push_mouse_leave_event(running_machine &machine, render_target *target)
-{
- ui_event event = { UI_EVENT_NONE };
- event.event_type = UI_EVENT_MOUSE_LEAVE;
- event.target = target;
- ui_input_push_event(machine, event);
-}
+ /* retrieves the current location of the mouse */
+ render_target *find_mouse(INT32 *x, INT32 *y, bool *button);
+ /* return TRUE if a key down for the given user interface sequence is detected */
+ bool pressed(int code);
-/*-------------------------------------------------
- ui_input_push_mouse_down_event - pushes a mouse
- down event to the specified render_target
--------------------------------------------------*/
+ /* return TRUE if a key down for the given user interface sequence is detected, or if
+ autorepeat at the given speed is triggered */
+ bool pressed_repeat(int code, int speed);
-static inline void ui_input_push_mouse_down_event(running_machine &machine, render_target *target, INT32 x, INT32 y)
-{
- ui_event event = { UI_EVENT_NONE };
- event.event_type = UI_EVENT_MOUSE_DOWN;
- event.target = target;
- event.mouse_x = x;
- event.mouse_y = y;
- ui_input_push_event(machine, event);
-}
+ // getters
+ running_machine &machine() const { return m_machine; }
-/*-------------------------------------------------
- ui_input_push_mouse_down_event - pushes a mouse
- down event to the specified render_target
--------------------------------------------------*/
+ void push_mouse_move_event(render_target* target, INT32 x, INT32 y);
+ void push_mouse_leave_event(render_target* target);
+ void push_mouse_down_event(render_target* target, INT32 x, INT32 y);
+ void push_mouse_up_event(render_target* target, INT32 x, INT32 y);
+ void push_mouse_double_click_event(render_target* target, INT32 x, INT32 y);
+ void push_char_event(render_target* target, unicode_char ch);
-static inline void ui_input_push_mouse_up_event(running_machine &machine, render_target *target, INT32 x, INT32 y)
-{
- ui_event event = { UI_EVENT_NONE };
- event.event_type = UI_EVENT_MOUSE_UP;
- event.target = target;
- event.mouse_x = x;
- event.mouse_y = y;
- ui_input_push_event(machine, event);
-}
-
-
-/*-------------------------------------------------
- ui_input_push_mouse_double_click_event - pushes
- a mouse double-click event to the specified
- render_target
--------------------------------------------------*/
-
-static inline void ui_input_push_mouse_double_click_event(running_machine &machine, render_target *target, INT32 x, INT32 y)
-{
- ui_event event = { UI_EVENT_NONE };
- event.event_type = UI_EVENT_MOUSE_DOUBLE_CLICK;
- event.target = target;
- event.mouse_x = x;
- event.mouse_y = y;
- ui_input_push_event(machine, event);
-}
+private:
+ // internal state
+ running_machine & m_machine; // reference to our machine
-/*-------------------------------------------------
- ui_input_push_char_event - pushes a char event
- to the specified render_target
--------------------------------------------------*/
+ /* pressed states; retrieved with ui_input_pressed() */
+ osd_ticks_t m_next_repeat[IPT_COUNT];
+ UINT8 m_seqpressed[IPT_COUNT];
-static inline void ui_input_push_char_event(running_machine &machine, render_target *target, unicode_char ch)
-{
- ui_event event = { UI_EVENT_NONE };
- event.event_type = UI_EVENT_CHAR;
- event.target = target;
- event.ch = ch;
- ui_input_push_event(machine, event);
-}
+ /* mouse position/info */
+ render_target * m_current_mouse_target;
+ INT32 m_current_mouse_x;
+ INT32 m_current_mouse_y;
+ bool m_current_mouse_down;
+ /* popped states; ring buffer of ui_events */
+ ui_event m_events[EVENT_QUEUE_SIZE];
+ int m_events_start;
+ int m_events_end;
+};
#endif /* __UIINPUT_H__ */
diff --git a/src/emu/validity.cpp b/src/emu/validity.cpp
index 345b47d010c..4acc8d991ad 100644
--- a/src/emu/validity.cpp
+++ b/src/emu/validity.cpp
@@ -125,6 +125,7 @@ validity_checker::validity_checker(emu_options &options)
: m_drivlist(options),
m_errors(0),
m_warnings(0),
+ m_print_verbose(options.verbose()),
m_current_driver(nullptr),
m_current_config(nullptr),
m_current_device(nullptr),
@@ -183,10 +184,11 @@ void validity_checker::check_shared_source(const game_driver &driver)
//-------------------------------------------------
-// check_all - check all drivers
+// check_all_matching - check all drivers whose
+// names match the given string
//-------------------------------------------------
-bool validity_checker::check_all()
+bool validity_checker::check_all_matching(const char *string)
{
// start by checking core stuff
validate_begin();
@@ -194,26 +196,23 @@ bool validity_checker::check_all()
validate_inlines();
// if we had warnings or errors, output
- if (m_errors > 0 || m_warnings > 0)
+ if (m_errors > 0 || m_warnings > 0 || !m_verbose_text.empty())
{
output_via_delegate(OSD_OUTPUT_CHANNEL_ERROR, "Core: %d errors, %d warnings\n", m_errors, m_warnings);
if (m_errors > 0)
- {
- strreplace(m_error_text, "\n", "\n ");
- output_via_delegate(OSD_OUTPUT_CHANNEL_ERROR, "Errors:\n %s", m_error_text.c_str());
- }
+ output_indented_errors(m_error_text, "Errors");
if (m_warnings > 0)
- {
- strreplace(m_warning_text, "\n", "\n ");
- output_via_delegate(OSD_OUTPUT_CHANNEL_ERROR, "Warnings:\n %s", m_warning_text.c_str());
- }
+ output_indented_errors(m_warning_text, "Warnings");
+ if (!m_verbose_text.empty())
+ output_indented_errors(m_verbose_text, "Messages");
output_via_delegate(OSD_OUTPUT_CHANNEL_ERROR, "\n");
}
// then iterate over all drivers and check them
m_drivlist.reset();
while (m_drivlist.next())
- validate_one(m_drivlist.driver());
+ if (m_drivlist.matches(string, m_drivlist.driver().name))
+ validate_one(m_drivlist.driver());
// cleanup
validate_end();
@@ -277,6 +276,7 @@ void validity_checker::validate_one(const game_driver &driver)
int start_warnings = m_warnings;
m_error_text.clear();
m_warning_text.clear();
+ m_verbose_text.clear();
// wrap in try/except to catch fatalerrors
try
@@ -295,20 +295,15 @@ void validity_checker::validate_one(const game_driver &driver)
}
// if we had warnings or errors, output
- if (m_errors > start_errors || m_warnings > start_warnings)
+ if (m_errors > start_errors || m_warnings > start_warnings || !m_verbose_text.empty())
{
- std::string tempstr;
- output_via_delegate(OSD_OUTPUT_CHANNEL_ERROR, "Driver %s (file %s): %d errors, %d warnings\n", driver.name, core_filename_extract_base(tempstr, driver.source_file).c_str(), m_errors - start_errors, m_warnings - start_warnings);
+ output_via_delegate(OSD_OUTPUT_CHANNEL_ERROR, "Driver %s (file %s): %d errors, %d warnings\n", driver.name, core_filename_extract_base(driver.source_file).c_str(), m_errors - start_errors, m_warnings - start_warnings);
if (m_errors > start_errors)
- {
- strreplace(m_error_text, "\n", "\n ");
- output_via_delegate(OSD_OUTPUT_CHANNEL_ERROR, "Errors:\n %s", m_error_text.c_str());
- }
+ output_indented_errors(m_error_text, "Errors");
if (m_warnings > start_warnings)
- {
- strreplace(m_warning_text, "\n", "\n ");
- output_via_delegate(OSD_OUTPUT_CHANNEL_ERROR, "Warnings:\n %s", m_warning_text.c_str());
- }
+ output_indented_errors(m_warning_text, "Warnings");
+ if (!m_verbose_text.empty())
+ output_indented_errors(m_verbose_text, "Messages");
output_via_delegate(OSD_OUTPUT_CHANNEL_ERROR, "\n");
}
@@ -530,18 +525,17 @@ void validity_checker::validate_inlines()
void validity_checker::validate_driver()
{
// check for duplicate names
- std::string tempstr;
if (!m_names_map.insert(std::make_pair(m_current_driver->name, m_current_driver)).second)
{
const game_driver *match = m_names_map.find(m_current_driver->name)->second;
- osd_printf_error("Driver name is a duplicate of %s(%s)\n", core_filename_extract_base(tempstr, match->source_file).c_str(), match->name);
+ osd_printf_error("Driver name is a duplicate of %s(%s)\n", core_filename_extract_base(match->source_file).c_str(), match->name);
}
// check for duplicate descriptions
if (!m_descriptions_map.insert(std::make_pair(m_current_driver->description, m_current_driver)).second)
{
const game_driver *match = m_descriptions_map.find(m_current_driver->description)->second;
- osd_printf_error("Driver description is a duplicate of %s(%s)\n", core_filename_extract_base(tempstr, match->source_file).c_str(), match->name);
+ osd_printf_error("Driver description is a duplicate of %s(%s)\n", core_filename_extract_base(match->source_file).c_str(), match->name);
}
// determine if we are a clone
@@ -615,8 +609,8 @@ void validity_checker::validate_roms()
device_iterator deviter(m_current_config->root_device());
for (device_t *device = deviter.first(); device != nullptr; device = deviter.next())
{
- // for non-root devices, track the current device
- m_current_device = (device->owner() == nullptr) ? nullptr : device;
+ // track the current device
+ m_current_device = device;
// scan the ROM entries for this device
const char *last_region_name = "???";
@@ -880,8 +874,8 @@ void validity_checker::validate_inputs()
if (device->input_ports() == nullptr)
continue;
- // for non-root devices, track the current device
- m_current_device = (device == &m_current_config->root_device()) ? nullptr : device;
+ // track the current device
+ m_current_device = device;
// allocate the input ports
ioport_list portlist;
@@ -976,15 +970,11 @@ void validity_checker::validate_devices()
device_iterator iter_find(m_current_config->root_device());
for (const device_t *device = iter_find.first(); device != nullptr; device = iter_find.next())
{
- device->findit(true);
- }
+ // track the current device
+ m_current_device = device;
- // iterate over devices
- device_iterator iter(m_current_config->root_device());
- for (const device_t *device = iter.first(); device != nullptr; device = iter.next())
- {
- // for non-root devices, track the current device
- m_current_device = (device == &m_current_config->root_device()) ? nullptr : device;
+ // validate auto-finders
+ device->findit(true);
// validate the device tag
validate_tag(device->basetag());
@@ -1048,9 +1038,9 @@ void validity_checker::build_output_prefix(std::string &str)
// start empty
str.clear();
- // if we have a current device, indicate that
- if (m_current_device != nullptr)
- str.append(m_current_device->name()).append(" device '").append(m_current_device->tag()).append("': ");
+ // if we have a current (non-root) device, indicate that
+ if (m_current_device != nullptr && m_current_device->owner() != nullptr)
+ str.append(m_current_device->name()).append(" device '").append(m_current_device->tag()+1).append("': ");
// if we have a current port, indicate that as well
if (m_current_ioport != nullptr)
@@ -1089,6 +1079,17 @@ void validity_checker::output_callback(osd_output_channel channel, const char *m
strcatvprintf(output, msg, args);
m_warning_text.append(output);
break;
+ case OSD_OUTPUT_CHANNEL_VERBOSE:
+ // if we're not verbose, skip it
+ if (!m_print_verbose) break;
+
+ // output the source(driver) device 'tag'
+ build_output_prefix(output);
+
+ // generate the string and output to the original target
+ strcatvprintf(output, msg, args);
+ m_verbose_text.append(output);
+ break;
default:
chain_output(channel, msg, args);
break;
@@ -1110,3 +1111,16 @@ void validity_checker::output_via_delegate(osd_output_channel channel, const cha
this->chain_output(channel, format, argptr);
va_end(argptr);
}
+
+//-------------------------------------------------
+// output_indented_errors - helper to output error
+// and warning messages with header and indents
+//-------------------------------------------------
+void validity_checker::output_indented_errors(std::string &text, const char *header)
+{
+ // remove trailing newline
+ if (text[text.size()-1] == '\n')
+ text.erase(text.size()-1, 1);
+ strreplace(text, "\n", "\n ");
+ output_via_delegate(OSD_OUTPUT_CHANNEL_ERROR, "%s:\n %s\n", header, text.c_str());
+}
diff --git a/src/emu/validity.h b/src/emu/validity.h
index fa38bb20f93..66eaffd533b 100644
--- a/src/emu/validity.h
+++ b/src/emu/validity.h
@@ -40,10 +40,13 @@ public:
int errors() const { return m_errors; }
int warnings() const { return m_warnings; }
+ // setter
+ void set_verbose(bool verbose) { m_print_verbose = verbose; }
+
// operations
void check_driver(const game_driver &driver);
void check_shared_source(const game_driver &driver);
- bool check_all();
+ bool check_all_matching(const char *string = "*");
// helpers for devices
void validate_tag(const char *tag);
@@ -81,6 +84,7 @@ private:
// output helpers
void build_output_prefix(std::string &str);
void output_via_delegate(osd_output_channel channel, const char *format, ...) ATTR_PRINTF(3,4);
+ void output_indented_errors(std::string &text, const char *header);
// internal driver list
driver_enumerator m_drivlist;
@@ -88,8 +92,10 @@ private:
// error tracking
int m_errors;
int m_warnings;
+ bool m_print_verbose;
std::string m_error_text;
std::string m_warning_text;
+ std::string m_verbose_text;
// maps for finding duplicates
game_driver_map m_names_map;
diff --git a/src/emu/video.cpp b/src/emu/video.cpp
index 1d7c9096b3a..41fb5e1726e 100644
--- a/src/emu/video.cpp
+++ b/src/emu/video.cpp
@@ -164,7 +164,7 @@ video_manager::video_manager(running_machine &machine)
{
m_screenless_frame_timer = machine.scheduler().timer_alloc(timer_expired_delegate(FUNC(video_manager::screenless_update_callback), this));
m_screenless_frame_timer->adjust(screen_device::DEFAULT_FRAME_PERIOD, 0, screen_device::DEFAULT_FRAME_PERIOD);
- output_set_notifier(nullptr, video_notifier_callback, this);
+ machine.output().set_notifier(nullptr, video_notifier_callback, this);
}
}
@@ -247,8 +247,9 @@ void video_manager::frame_update(bool debug)
if (phase == MACHINE_PHASE_RUNNING)
{
// reset partial updates if we're paused or if the debugger is active
- if (machine().first_screen() != nullptr && (machine().paused() || debug || debugger_within_instruction_hook(machine())))
- machine().first_screen()->reset_partial_updates();
+ screen_device *screen = machine().first_screen();
+ if (screen != nullptr && (machine().paused() || debug || debugger_within_instruction_hook(machine())))
+ screen->reset_partial_updates();
}
}
@@ -258,9 +259,9 @@ void video_manager::frame_update(bool debug)
// into a string buffer
//-------------------------------------------------
-std::string &video_manager::speed_text(std::string &str)
+std::string video_manager::speed_text()
{
- str.clear();
+ std::string str;
// if we're paused, just display Paused
bool paused = machine().paused();
@@ -316,8 +317,8 @@ void video_manager::save_snapshot(screen_device *screen, emu_file &file)
png_add_text(&pnginfo, "System", text2.c_str());
// now do the actual work
- const rgb_t *palette = (screen !=nullptr && screen->palette() != nullptr) ? screen->palette()->palette()->entry_list_adjusted() : nullptr;
- int entries = (screen !=nullptr && screen->palette() != nullptr) ? screen->palette()->entries() : 0;
+ const rgb_t *palette = (screen != nullptr && screen->has_palette()) ? screen->palette().palette()->entry_list_adjusted() : nullptr;
+ int entries = (screen != nullptr && screen->has_palette()) ? screen->palette().entries() : 0;
png_error error = png_write_bitmap(file, &pnginfo, m_snap_bitmap, entries, palette);
if (error != PNGERR_NONE)
osd_printf_error("Error generating PNG for snapshot: png_error = %d\n", error);
@@ -380,9 +381,10 @@ void video_manager::begin_recording(const char *name, movie_format format)
m_avi_next_frame_time = machine().time();
// build up information about this new movie
+ screen_device *screen = machine().first_screen();
avi_movie_info info;
info.video_format = 0;
- info.video_timescale = 1000 * ((machine().first_screen() != nullptr) ? ATTOSECONDS_TO_HZ(machine().first_screen()->frame_period().attoseconds()) : screen_device::DEFAULT_FRAME_RATE);
+ info.video_timescale = 1000 * ((screen != nullptr) ? ATTOSECONDS_TO_HZ(screen->frame_period().attoseconds()) : screen_device::DEFAULT_FRAME_RATE);
info.video_sampletime = 1000;
info.video_numsamples = 0;
info.video_width = m_snap_bitmap.width();
@@ -448,7 +450,8 @@ void video_manager::begin_recording(const char *name, movie_format format)
if (filerr == FILERR_NONE)
{
// start the capture
- int rate = (machine().first_screen() != nullptr) ? ATTOSECONDS_TO_HZ(machine().first_screen()->frame_period().attoseconds()) : screen_device::DEFAULT_FRAME_RATE;
+ screen_device *screen = machine().first_screen();
+ int rate = (screen != nullptr) ? ATTOSECONDS_TO_HZ(screen->frame_period().attoseconds()) : screen_device::DEFAULT_FRAME_RATE;
png_error pngerr = mng_capture_start(*m_mng_file, m_snap_bitmap, rate);
if (pngerr != PNGERR_NONE)
{
@@ -676,7 +679,7 @@ bool video_manager::finish_screen_updates()
// draw any crosshairs
for (screen_device *screen = iter.first(); screen != nullptr; screen = iter.next())
- crosshair_render(*screen);
+ machine().crosshair().render(*screen);
return anything_changed;
}
@@ -1037,13 +1040,14 @@ void video_manager::recompute_speed(const attotime &emutime)
// if we're past the "time-to-execute" requested, signal an exit
if (m_seconds_to_run != 0 && emutime.seconds() >= m_seconds_to_run)
{
- if (machine().first_screen() != nullptr)
+ screen_device *screen = machine().first_screen();
+ if (screen != nullptr)
{
// create a final screenshot
emu_file file(machine().options().snapshot_directory(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
file_error filerr = file.open(machine().basename(), PATH_SEPARATOR "final.png");
if (filerr == FILERR_NONE)
- save_snapshot(machine().first_screen(), file);
+ save_snapshot(screen, file);
}
//printf("Scheduled exit at %f\n", emutime.as_double());
// schedule our demise
@@ -1279,8 +1283,9 @@ void video_manager::record_frame()
}
// write the next frame
- const rgb_t *palette = (machine().first_screen() !=nullptr && machine().first_screen()->palette() != nullptr) ? machine().first_screen()->palette()->palette()->entry_list_adjusted() : nullptr;
- int entries = (machine().first_screen() !=nullptr && machine().first_screen()->palette() != nullptr) ? machine().first_screen()->palette()->entries() : 0;
+ screen_device *screen = machine().first_screen();
+ const rgb_t *palette = (screen != nullptr && screen->has_palette()) ? screen->palette().palette()->entry_list_adjusted() : nullptr;
+ int entries = (screen != nullptr && screen->has_palette()) ? screen->palette().entries() : 0;
png_error error = mng_capture_frame(*m_mng_file, &pnginfo, m_snap_bitmap, entries, palette);
png_free(&pnginfo);
if (error != PNGERR_NONE)
diff --git a/src/emu/video.h b/src/emu/video.h
index 9eb67b70353..4938cf67f34 100644
--- a/src/emu/video.h
+++ b/src/emu/video.h
@@ -81,7 +81,7 @@ public:
void frame_update(bool debug = false);
// current speed helpers
- std::string &speed_text(std::string &str);
+ std::string speed_text();
double speed_percent() const { return m_speed_percent; }
// snapshots
diff --git a/src/emu/video/vector.cpp b/src/emu/video/vector.cpp
index bcc3b3604b9..36c303eda42 100644
--- a/src/emu/video/vector.cpp
+++ b/src/emu/video/vector.cpp
@@ -163,7 +163,7 @@ void vector_device::device_start()
m_vector_index = 0;
/* allocate memory for tables */
- m_vector_list = auto_alloc_array_clear(machine(), point, MAX_POINTS);
+ m_vector_list = make_unique_clear<point[]>(MAX_POINTS);
}
void vector_device::set_flicker(float newval)
@@ -306,7 +306,7 @@ UINT32 vector_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap,
int lastx = 0;
int lasty = 0;
- curpoint = m_vector_list;
+ curpoint = m_vector_list.get();
screen.container().empty();
screen.container().add_rect(0.0f, 0.0f, 1.0f, 1.0f, rgb_t(0xff,0x00,0x00,0x00), PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_VECTORBUF(1));
diff --git a/src/emu/video/vector.h b/src/emu/video/vector.h
index 37a1587d01e..9ec843b76fe 100644
--- a/src/emu/video/vector.h
+++ b/src/emu/video/vector.h
@@ -65,7 +65,7 @@ private:
static float m_beam_width_min;
static float m_beam_width_max;
static float m_beam_intensity_weight;
- point *m_vector_list;
+ std::unique_ptr<point[]> m_vector_list;
static int m_vector_index;
int m_min_intensity;
int m_max_intensity;
diff --git a/src/ldplayer/ldplayer.cpp b/src/ldplayer/ldplayer.cpp
index b1edf88d28c..bbd309dd0b9 100644
--- a/src/ldplayer/ldplayer.cpp
+++ b/src/ldplayer/ldplayer.cpp
@@ -22,8 +22,6 @@
#define APPNAME "MAME"
#define APPNAME_LOWER "mame"
#define CONFIGNAME "mame"
-#define APPLONGNAME "M.A.M.E."
-#define FULLLONGNAME "Multiple Arcade Machine Emulator"
#define CAPGAMENOUN "GAME"
#define CAPSTARTGAMENOUN "Game"
#define GAMENOUN "game"
@@ -46,8 +44,6 @@
const char * emulator_info::get_appname() { return APPNAME;}
const char * emulator_info::get_appname_lower() { return APPNAME_LOWER;}
const char * emulator_info::get_configname() { return CONFIGNAME;}
-const char * emulator_info::get_applongname() { return APPLONGNAME;}
-const char * emulator_info::get_fulllongname() { return FULLLONGNAME;}
const char * emulator_info::get_capgamenoun() { return CAPGAMENOUN;}
const char * emulator_info::get_capstartgamenoun() { return CAPSTARTGAMENOUN;}
const char * emulator_info::get_gamenoun() { return GAMENOUN;}
@@ -87,9 +83,9 @@ public:
protected:
// device overrides
- virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
- virtual void machine_start();
- virtual void machine_reset();
+ virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
// internal helpers
chd_file *get_disc();
@@ -154,12 +150,12 @@ public:
protected:
// device overrides
- virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
- virtual void machine_start();
- virtual void machine_reset();
+ virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
// command execution hook
- virtual void execute_command(int command);
+ virtual void execute_command(int command) override;
// internal helpers
inline void add_command(UINT8 command);
@@ -193,7 +189,7 @@ protected:
required_device<pioneer_ldv1000_device> m_laserdisc;
// command execution hook
- virtual void execute_command(int command);
+ virtual void execute_command(int command) override;
};
@@ -233,7 +229,7 @@ chd_file *ldplayer_state::get_disc()
// try to open the CHD
- if (set_disk_handle(machine(), "laserdisc", fullpath.c_str()) == CHDERR_NONE)
+ if (machine().rom_load().set_disk_handle("laserdisc", fullpath.c_str()) == CHDERR_NONE)
{
m_filename.assign(dir->name);
found = TRUE;
@@ -247,7 +243,7 @@ chd_file *ldplayer_state::get_disc()
if (found == FALSE)
throw emu_fatalerror("No valid image file found!\n");
- return get_disk_handle(machine(), "laserdisc");
+ return machine().rom_load().get_disk_handle("laserdisc");
}
diff --git a/src/lib/formats/bbc_dsk.cpp b/src/lib/formats/bbc_dsk.cpp
index 193ab435e69..8b39ed17b1f 100644
--- a/src/lib/formats/bbc_dsk.cpp
+++ b/src/lib/formats/bbc_dsk.cpp
@@ -352,7 +352,55 @@ const bbc_cpm_format::format bbc_cpm_format::formats[] =
{}
};
+
+bbc_cpn_format::bbc_cpn_format() : wd177x_format(formats)
+{
+}
+
+const char *bbc_cpn_format::name() const
+{
+ return "cpn";
+}
+
+const char *bbc_cpn_format::description() const
+{
+ return "Torch CPN disk image";
+}
+
+const char *bbc_cpn_format::extensions() const
+{
+ return "dsd";
+}
+
+int bbc_cpn_format::identify(io_generic *io, UINT32 form_factor)
+{
+ int type = find_size(io, form_factor);
+
+ if(type != -1)
+ return 50;
+ return 0;
+}
+
+int bbc_cpn_format::get_image_offset(const format &f, int head, int track)
+{
+ if (f.sector_base_id == -1)
+ return (track * f.head_count + head) * compute_track_size(f);
+ else
+ return (f.track_count * head + track) * compute_track_size(f);
+}
+
+const bbc_cpn_format::format bbc_cpn_format::formats[] =
+{
+ { // 400k 80 track double sided single density (interleaved) - gaps unverified
+ floppy_image::FF_525, floppy_image::DSQD, floppy_image::FM,
+ 4000, 10, 80, 2, 256, {}, -1, { 0,1,2,3,4,5,6,7,8,9 }, 40, 10, 10
+ },
+ {}
+};
+
+
const floppy_format_type FLOPPY_BBC_DFS_FORMAT = &floppy_image_format_creator<bbc_dfs_format>;
const floppy_format_type FLOPPY_BBC_ADFS_FORMAT = &floppy_image_format_creator<bbc_adfs_format>;
const floppy_format_type FLOPPY_BBC_DOS_FORMAT = &floppy_image_format_creator<bbc_dos_format>;
const floppy_format_type FLOPPY_BBC_CPM_FORMAT = &floppy_image_format_creator<bbc_cpm_format>;
+const floppy_format_type FLOPPY_BBC_CPN_FORMAT = &floppy_image_format_creator<bbc_cpn_format>;
diff --git a/src/lib/formats/bbc_dsk.h b/src/lib/formats/bbc_dsk.h
index 9378a25ec81..7ce8112f36c 100644
--- a/src/lib/formats/bbc_dsk.h
+++ b/src/lib/formats/bbc_dsk.h
@@ -78,10 +78,26 @@ private:
static const format formats[];
};
+class bbc_cpn_format : public wd177x_format
+{
+public:
+ bbc_cpn_format();
+
+ virtual int identify(io_generic *io, UINT32 form_factor) override;
+ virtual int get_image_offset(const format &f, int head, int track) override;
+ virtual const char *name() const override;
+ virtual const char *description() const override;
+ virtual const char *extensions() const override;
+
+private:
+ static const format formats[];
+};
+
extern const floppy_format_type FLOPPY_BBC_DFS_FORMAT;
extern const floppy_format_type FLOPPY_BBC_ADFS_FORMAT;
extern const floppy_format_type FLOPPY_BBC_DOS_FORMAT;
extern const floppy_format_type FLOPPY_BBC_CPM_FORMAT;
+extern const floppy_format_type FLOPPY_BBC_CPN_FORMAT;
#endif // __BBC_DSK_H__
diff --git a/src/lib/formats/cassimg.cpp b/src/lib/formats/cassimg.cpp
index a591de070b1..4d7aeb0a9a3 100644
--- a/src/lib/formats/cassimg.cpp
+++ b/src/lib/formats/cassimg.cpp
@@ -85,7 +85,7 @@ static cassette_image *cassette_init(const struct CassetteFormat *format, void *
{
cassette_image *cassette;
- cassette = global_alloc_clear(cassette_image);
+ cassette = global_alloc_clear<cassette_image>();
cassette->format = format;
cassette->io.file = file;
cassette->io.procs = procs;
diff --git a/src/lib/formats/cbm_crt.cpp b/src/lib/formats/cbm_crt.cpp
index d169d0c2fd7..6484dbf108c 100644
--- a/src/lib/formats/cbm_crt.cpp
+++ b/src/lib/formats/cbm_crt.cpp
@@ -122,7 +122,7 @@ static const char * CRT_C64_SLOT_NAMES[_CRT_C64_COUNT] =
// cbm_crt_get_card - get slot interface card
//-------------------------------------------------
-void cbm_crt_get_card(std::string &result, core_file *file)
+std::string cbm_crt_get_card(core_file *file)
{
// read the header
cbm_crt_header header;
@@ -132,11 +132,10 @@ void cbm_crt_get_card(std::string &result, core_file *file)
{
UINT16 hardware = pick_integer_be(header.hardware, 0, 2);
- result.assign(CRT_C64_SLOT_NAMES[hardware]);
- return;
+ return std::string(CRT_C64_SLOT_NAMES[hardware]);
}
- result.clear();
+ return std::string();
}
diff --git a/src/lib/formats/cbm_crt.h b/src/lib/formats/cbm_crt.h
index 9be37bc0740..f3cfb6bb164 100644
--- a/src/lib/formats/cbm_crt.h
+++ b/src/lib/formats/cbm_crt.h
@@ -135,7 +135,7 @@ struct cbm_crt_chip
// FUNCTION PROTOTYPES
//**************************************************************************
-void cbm_crt_get_card(std::string &result, core_file *file);
+std::string cbm_crt_get_card(core_file *file);
bool cbm_crt_read_header(core_file* file, size_t *roml_size, size_t *romh_size, int *exrom, int *game);
bool cbm_crt_read_data(core_file* file, UINT8 *roml, UINT8 *romh);
diff --git a/src/lib/formats/ipf_dsk.cpp b/src/lib/formats/ipf_dsk.cpp
index e7b8aad9137..1292ce8b354 100644
--- a/src/lib/formats/ipf_dsk.cpp
+++ b/src/lib/formats/ipf_dsk.cpp
@@ -5,7 +5,7 @@
const floppy_format_type FLOPPY_IPF_FORMAT = &floppy_image_format_creator<ipf_format>;
-ipf_format::ipf_format(): tinfos(nullptr), tcount(0), type(0), release(0), revision(0), encoder_type(0),
+ipf_format::ipf_format(): tinfos(nullptr), tcount(0), type(0), release(0), revision(0), encoder_type(0),
encoder_revision(0), origin(0), min_cylinder(0), max_cylinder(0), min_head(0), max_head(0), credit_day(0), credit_time(0)
{
}
@@ -84,7 +84,7 @@ bool ipf_format::parse(dynamic_buffer &data, floppy_image *image)
{
image->set_variant(floppy_image::DSDD); // Not handling anything else yet
tcount = 84*2+1; // Usual max
- tinfos = global_alloc_array_clear(track_info, tcount);
+ tinfos = global_alloc_array_clear<track_info>(tcount);
bool res = scan_all_tags(data);
if(res)
res = generate_tracks(image);
@@ -121,7 +121,7 @@ ipf_format::track_info *ipf_format::get_index(UINT32 idx)
if(idx > 1000)
return nullptr;
if(idx >= tcount) {
- auto ti1 = global_alloc_array_clear(track_info, idx+1);
+ auto ti1 = global_alloc_array_clear<track_info>(idx+1);
memcpy(ti1, tinfos, tcount*sizeof(tinfos));
global_free_array(tinfos);
tcount = idx+1;
diff --git a/src/lib/netlist/build/makefile b/src/lib/netlist/build/makefile
index 0f29882e8b7..19742fc9b31 100644
--- a/src/lib/netlist/build/makefile
+++ b/src/lib/netlist/build/makefile
@@ -18,7 +18,7 @@ SRC = ..
CDEFS = -DPSTANDALONE=1 -DPTR64=1
#-Werror
-CFLAGS = $(LTO) -g -O3 -std=c++98 -march=native -msse4.2 -Wall -Wpedantic -Wsign-compare -Wextra -Wno-long-long -Wno-unused-parameter -Wno-unused-result -Wno-variadic-macros -I..
+CFLAGS = $(LTO) -g -O3 -std=c++98 -Doverride="" -march=native -msse4.2 -Wall -Wpedantic -Wsign-compare -Wextra -Wno-long-long -Wno-unused-parameter -Wno-unused-result -Wno-variadic-macros -I..
LDFLAGS = $(LTO) -g -O3 -std=c++98
#CFLAGS = $(LTO) -g -O3 -std=c++11 -Wall -Wpedantic -Wsign-compare -Wextra -Isrc
#LDFLAGS = $(LTO) -g -O3 -std=c++11
@@ -52,6 +52,7 @@ POBJS := \
$(POBJ)/pparser.o \
$(POBJ)/pstate.o \
$(POBJ)/pstream.o \
+ $(POBJ)/pfmtlog.o \
NLOBJS := \
$(NLOBJ)/nl_base.o \
diff --git a/src/lib/netlist/plib/pfmtlog.cpp b/src/lib/netlist/plib/pfmtlog.cpp
index 2b08bb2fa98..d66b8f62520 100644
--- a/src/lib/netlist/plib/pfmtlog.cpp
+++ b/src/lib/netlist/plib/pfmtlog.cpp
@@ -5,13 +5,11 @@
*
*/
-#if 0
#include <cstring>
//FIXME:: pstring should be locale free
#include <cctype>
#include <cstdlib>
#include <cstdio>
-#endif
#include <algorithm>
diff --git a/src/lib/netlist/prg/nltool.cpp b/src/lib/netlist/prg/nltool.cpp
index bbe5e8b3039..3c7065897e7 100644
--- a/src/lib/netlist/prg/nltool.cpp
+++ b/src/lib/netlist/prg/nltool.cpp
@@ -395,10 +395,6 @@ static const char *pmf_verbose[] =
int main(int argc, char *argv[])
{
-#if (!PSTANDALONE)
- track_memory(true);
- {
-#endif
tool_options_t opts;
int ret;
@@ -462,9 +458,5 @@ int main(int argc, char *argv[])
}
pstring::resetmem();
-#if (!PSTANDALONE)
- }
- dump_unfreed_mem();
-#endif
return 0;
}
diff --git a/src/lib/netlist/prg/nlwav.cpp b/src/lib/netlist/prg/nlwav.cpp
index 681b0e6d79e..bba12ca1152 100644
--- a/src/lib/netlist/prg/nlwav.cpp
+++ b/src/lib/netlist/prg/nlwav.cpp
@@ -237,10 +237,6 @@ void usage(nlwav_options_t &opts)
int main(int argc, char *argv[])
{
-#if (!PSTANDALONE)
- track_memory(true);
- {
-#endif
nlwav_options_t opts;
int ret;
@@ -258,10 +254,6 @@ int main(int argc, char *argv[])
}
convert(opts);
-#if (!PSTANDALONE)
- }
- dump_unfreed_mem();
-#endif
return 0;
}
diff --git a/src/lib/util/cdrom.cpp b/src/lib/util/cdrom.cpp
index a9a60ef97bd..2235119f776 100644
--- a/src/lib/util/cdrom.cpp
+++ b/src/lib/util/cdrom.cpp
@@ -371,8 +371,8 @@ cdrom_file *cdrom_open(chd_file *chd)
chdofs += file->cdtoc.tracks[i].frames;
chdofs += file->cdtoc.tracks[i].extraframes;
logofs += file->cdtoc.tracks[i].frames;
-
-/* printf("Track %02d is format %d subtype %d datasize %d subsize %d frames %d extraframes %d pregap %d pgmode %d presize %d postgap %d logofs %d physofs %d chdofs %d\n", i+1,
+/*
+ printf("Track %02d is format %d subtype %d datasize %d subsize %d frames %d extraframes %d pregap %d pgmode %d presize %d postgap %d logofs %d physofs %d chdofs %d\n", i+1,
file->cdtoc.tracks[i].trktype,
file->cdtoc.tracks[i].subtype,
file->cdtoc.tracks[i].datasize,
@@ -447,17 +447,20 @@ void cdrom_close(cdrom_file *file)
* @return The partial sector.
*/
-chd_error read_partial_sector(cdrom_file *file, void *dest, UINT32 lbasector, UINT32 chdsector, UINT32 tracknum, UINT32 startoffs, UINT32 length)
+chd_error read_partial_sector(cdrom_file *file, void *dest, UINT32 lbasector, UINT32 chdsector, UINT32 tracknum, UINT32 startoffs, UINT32 length, bool phys=false)
{
chd_error result = CHDERR_NONE;
bool needswap = false;
// if this is pregap info that isn't actually in the file, just return blank data
- if ((file->cdtoc.tracks[tracknum].pgdatasize == 0) && (lbasector < (file->cdtoc.tracks[tracknum].logframeofs + file->cdtoc.tracks[tracknum].pregap)))
+ if (!phys)
{
-// printf("PG missing sector: LBA %d, trklog %d\n", lbasector, file->cdtoc.tracks[tracknum].logframeofs);
- memset(dest, 0, length);
- return result;
+ if ((file->cdtoc.tracks[tracknum].pgdatasize == 0) && (lbasector < (file->cdtoc.tracks[tracknum].logframeofs + file->cdtoc.tracks[tracknum].pregap)))
+ {
+ //printf("PG missing sector: LBA %d, trklog %d\n", lbasector, file->cdtoc.tracks[tracknum].logframeofs);
+ memset(dest, 0, length);
+ return result;
+ }
}
// if a CHD, just read
@@ -542,14 +545,14 @@ UINT32 cdrom_read_data(cdrom_file *file, UINT32 lbasector, void *buffer, UINT32
if ((datatype == tracktype) || (datatype == CD_TRACK_RAW_DONTCARE))
{
- return (read_partial_sector(file, buffer, lbasector, chdsector, tracknum, 0, file->cdtoc.tracks[tracknum].datasize) == CHDERR_NONE);
+ return (read_partial_sector(file, buffer, lbasector, chdsector, tracknum, 0, file->cdtoc.tracks[tracknum].datasize, phys) == CHDERR_NONE);
}
else
{
/* return 2048 bytes of mode 1 data from a 2352 byte mode 1 raw sector */
if ((datatype == CD_TRACK_MODE1) && (tracktype == CD_TRACK_MODE1_RAW))
{
- return (read_partial_sector(file, buffer, lbasector, chdsector, tracknum, 16, 2048) == CHDERR_NONE);
+ return (read_partial_sector(file, buffer, lbasector, chdsector, tracknum, 16, 2048, phys) == CHDERR_NONE);
}
/* return 2352 byte mode 1 raw sector from 2048 bytes of mode 1 data */
@@ -565,19 +568,19 @@ UINT32 cdrom_read_data(cdrom_file *file, UINT32 lbasector, void *buffer, UINT32
bufptr[14] = msf&0xff;
bufptr[15] = 1; // mode 1
LOG(("CDROM: promotion of mode1/form1 sector to mode1 raw is not complete!\n"));
- return (read_partial_sector(file, bufptr+16, lbasector, chdsector, tracknum, 0, 2048) == CHDERR_NONE);
+ return (read_partial_sector(file, bufptr+16, lbasector, chdsector, tracknum, 0, 2048, phys) == CHDERR_NONE);
}
/* return 2048 bytes of mode 1 data from a mode2 form1 or raw sector */
if ((datatype == CD_TRACK_MODE1) && ((tracktype == CD_TRACK_MODE2_FORM1)||(tracktype == CD_TRACK_MODE2_RAW)))
{
- return (read_partial_sector(file, buffer, lbasector, chdsector, tracknum, 24, 2048) == CHDERR_NONE);
+ return (read_partial_sector(file, buffer, lbasector, chdsector, tracknum, 24, 2048, phys) == CHDERR_NONE);
}
/* return mode 2 2336 byte data from a 2352 byte mode 1 or 2 raw sector (skip the header) */
if ((datatype == CD_TRACK_MODE2) && ((tracktype == CD_TRACK_MODE1_RAW) || (tracktype == CD_TRACK_MODE2_RAW)))
{
- return (read_partial_sector(file, buffer, lbasector, chdsector, tracknum, 16, 2336) == CHDERR_NONE);
+ return (read_partial_sector(file, buffer, lbasector, chdsector, tracknum, 16, 2336, phys) == CHDERR_NONE);
}
LOG(("CDROM: Conversion from type %d to type %d not supported!\n", tracktype, datatype));
diff --git a/src/lib/util/corealloc.cpp b/src/lib/util/corealloc.cpp
deleted file mode 100644
index 38f21846f96..00000000000
--- a/src/lib/util/corealloc.cpp
+++ /dev/null
@@ -1,432 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Aaron Giles
-/***************************************************************************
-
- corealloc.c
-
- Memory allocation helpers for the helper library.
-
-***************************************************************************/
-
-#include "corealloc.h"
-#include "osdcore.h"
-
-
-//**************************************************************************
-// DEBUGGING
-//**************************************************************************
-
-#define LOG_ALLOCS (0)
-#define DEBUG_MISMATCHED_ALLOCS (0)
-
-// define this to initialize allocated memory to a fixed non-0 value
-#ifdef MAME_DEBUG
-#define INITIALIZE_ALLOCATED_MEMORY
-#endif
-
-// define this to zap memory to a fixed non-0 value before freeing
-//#define OVERWRITE_FREED_MEMORY
-
-// compatibility with non-clang compilers
-#ifndef __has_feature
- #define __has_feature(x) 0
-#endif
-
-
-//**************************************************************************
-// CONSTANTS
-//**************************************************************************
-
-// number of memory_entries to allocate in a block
-const int memory_block_alloc_chunk = 256;
-
-
-
-//**************************************************************************
-// TYPE DEFINITIONS
-//**************************************************************************
-
-// this struct is allocated in pools to track memory allocations
-// it must be a POD type!!
-class memory_entry
-{
-public:
- // internal state
- memory_entry * m_next; // link to the next entry
- memory_entry * m_prev; // link to the previous entry
- size_t m_size; // size of the allocation (not including this header)
- void * m_base; // base of the allocation
- const char * m_file; // file the allocation was made from
- int m_line; // line number within that file
- UINT64 m_id; // unique id
- bool m_array; // array?
-
- // hashing prime number
- static const int k_hash_prime = 6151;
-
- // global state
- static UINT64 s_curid; // current ID
- static osd_lock * s_lock; // lock for managing the list
- static bool s_lock_alloc; // set to true temporarily during lock allocation
- static bool s_tracking; // set to true when tracking is live
- static memory_entry *s_hash[k_hash_prime];// hash table based on pointer
- static memory_entry *s_freehead; // pointer to the head of the free list
-
- // static helpers
- static memory_entry *allocate(size_t size, void *base, const char *file, int line, bool array);
- static memory_entry *find(void *ptr);
- static void release(memory_entry *entry, const char *file, int line);
- static void report_unfreed(UINT64 start);
-
-private:
- static void acquire_lock();
- static void release_lock();
-};
-
-
-
-//**************************************************************************
-// GLOBALS
-//**************************************************************************
-
-// dummy zeromem object
-const zeromem_t zeromem = { };
-
-// globals for memory_entry
-UINT64 memory_entry::s_curid = 1;
-osd_lock *memory_entry::s_lock = nullptr;
-bool memory_entry::s_lock_alloc = false;
-bool memory_entry::s_tracking = false;
-memory_entry *memory_entry::s_hash[memory_entry::k_hash_prime] = { nullptr };
-memory_entry *memory_entry::s_freehead = nullptr;
-
-//**************************************************************************
-// OPERATOR REPLACEMENTS
-//**************************************************************************
-
-#ifndef NO_MEM_TRACKING
-
-// standard new/delete operators (try to avoid using)
-void *operator new(std::size_t size) throw (std::bad_alloc) { return malloc_file_line(size, nullptr, 0, false, true, false); }
-void *operator new[](std::size_t size) throw (std::bad_alloc) { return malloc_file_line(size, nullptr, 0, true, true, false); }
-void operator delete(void *ptr) throw() { if (ptr != nullptr) free_file_line(ptr, nullptr, 0, false); }
-void operator delete[](void *ptr) throw() { if (ptr != nullptr) free_file_line(ptr, nullptr, 0, true); }
-
-void* operator new(std::size_t size,const std::nothrow_t&) throw() { return malloc_file_line(size, nullptr, 0, false, false, false); }
-void* operator new[](std::size_t size, const std::nothrow_t&) throw() { return malloc_file_line(size, nullptr, 0, true, false, false); }
-void operator delete(void* ptr, const std::nothrow_t&) throw() { if (ptr != nullptr) free_file_line(ptr, nullptr, 0, false); }
-void operator delete[](void* ptr, const std::nothrow_t&) throw() { if (ptr != nullptr) free_file_line(ptr, nullptr, 0, true); }
-
-#endif
-
-//**************************************************************************
-// OPERATOR OVERLOADS - DEFINITIONS
-//**************************************************************************
-
-// file/line new/delete operators
-void *operator new(std::size_t size, const char *file, int line) throw (std::bad_alloc) { return malloc_file_line(size, file, line, false, true, false); }
-void *operator new[](std::size_t size, const char *file, int line) throw (std::bad_alloc) { return malloc_file_line(size, file, line, true, true, false); }
-void operator delete(void *ptr, const char *file, int line) { if (ptr != nullptr) free_file_line(ptr, file, line, false); }
-void operator delete[](void *ptr, const char *file, int line) { if (ptr != nullptr) free_file_line(ptr, file, line, true); }
-
-// file/line new/delete operators with zeroing
-void *operator new(std::size_t size, const char *file, int line, const zeromem_t &) throw (std::bad_alloc) { return malloc_file_line(size, file, line, false, true, true); }
-void *operator new[](std::size_t size, const char *file, int line, const zeromem_t &) throw (std::bad_alloc) { return malloc_file_line(size, file, line, true, true, true); }
-void operator delete(void *ptr, const char *file, int line, const zeromem_t &) { if (ptr != nullptr) free_file_line(ptr, file, line, false); }
-void operator delete[](void *ptr, const char *file, int line, const zeromem_t &) { if (ptr != nullptr) free_file_line(ptr, file, line, true); }
-
-
-
-//**************************************************************************
-// GLOBAL HELPERS
-//**************************************************************************
-
-//-------------------------------------------------
-// malloc_file_line - allocate memory with file
-// and line number information
-//-------------------------------------------------
-
-void *malloc_file_line(size_t size, const char *file, int line, bool array, bool throw_on_fail, bool clear)
-{
- // allocate the memory and fail if we can't
- void *result = array ? osd_malloc_array(size) : osd_malloc(size);
- if (result == nullptr)
- {
- fprintf(stderr, "Failed to allocate %d bytes (%s:%d)\n", UINT32(size), file, line);
- osd_break_into_debugger("Failed to allocate RAM");
- if (throw_on_fail)
- throw std::bad_alloc();
- return nullptr;
- }
-
- // zap the memory if requested
- if (clear)
- memset(result, 0, size);
- else
- {
-#if !__has_feature(memory_sanitizer) && defined(INITIALIZE_ALLOCATED_MEMORY) && !defined(MAME_DEBUG_FAST)
- memset(result, 0xdd, size);
-#endif
- }
-
- // add a new entry
- memory_entry::allocate(size, result, file, line, array);
-
- return result;
-}
-
-
-//-------------------------------------------------
-// free_file_line - free memory with file
-// and line number information
-//-------------------------------------------------
-
-void free_file_line(void *memory, const char *file, int line, bool array)
-{
- // find the memory entry
- memory_entry *entry = memory_entry::find(memory);
-
- // warn about untracked frees
- if (entry == nullptr)
- {
- fprintf(stderr, "Error: attempt to free untracked memory %p in %s(%d)!\n", memory, file, line);
- osd_break_into_debugger("Error: attempt to free untracked memory");
- return;
- }
-
- // warn about mismatched arrays
- if (!array && entry->m_array)
- {
- fprintf(stderr, "Warning: attempt to free array %p with global_free in %s(%d)!\n", memory, file, line);
- if (DEBUG_MISMATCHED_ALLOCS) {
- osd_break_into_debugger("Error: attempt to free array with global_free");
- }
- }
- if (array && !entry->m_array)
- {
-#ifndef __INTEL_COMPILER // todo: fix this properly, it appears some optimization the compiler applies breaks our logic here
- fprintf(stderr, "Warning: attempt to free single object %p with global_free_array in %s(%d)!\n", memory, file, line);
- if (DEBUG_MISMATCHED_ALLOCS) {
- osd_break_into_debugger("Error: attempt to free single object with global_free_array");
- }
-#endif
- }
-
-#ifdef OVERWRITE_FREED_MEMORY
- // clear memory to a bogus value
- memset(memory, 0xfc, entry->m_size);
-#endif
-
- // free the entry and the memory
- memory_entry::release(entry, file, line);
- osd_free(memory);
-}
-
-
-//-------------------------------------------------
-// track_memory - enables or disables the memory
-// tracking
-//-------------------------------------------------
-
-void track_memory(bool track)
-{
- memory_entry::s_tracking = track;
-}
-
-
-//-------------------------------------------------
-// next_memory_id - return the ID of the next
-// allocated block
-//-------------------------------------------------
-
-UINT64 next_memory_id()
-{
- return memory_entry::s_curid;
-}
-
-
-//-------------------------------------------------
-// dump_unfreed_mem - called from the exit path
-// of any code that wants to check for unfreed
-// memory
-//-------------------------------------------------
-
-void dump_unfreed_mem(UINT64 start)
-{
- memory_entry::report_unfreed(start);
-}
-
-
-
-//**************************************************************************
-// MEMORY ENTRY
-//**************************************************************************
-
-//-------------------------------------------------
-// acquire_lock - acquire the memory entry lock,
-// creating a new one if needed
-//-------------------------------------------------
-
-void memory_entry::acquire_lock()
-{
- // allocate a lock on first usage
- // note that osd_lock_alloc() may re-enter this path, so protect against recursion!
- if (s_lock == nullptr)
- {
- if (s_lock_alloc)
- return;
- s_lock_alloc = true;
- s_lock = osd_lock_alloc();
- s_lock_alloc = false;
- }
- osd_lock_acquire(s_lock);
-}
-
-
-//-------------------------------------------------
-// release_lock - release the memory entry lock
-//-------------------------------------------------
-
-void memory_entry::release_lock()
-{
- osd_lock_release(s_lock);
-}
-
-
-//-------------------------------------------------
-// allocate - allocate a new memory entry
-//-------------------------------------------------
-
-memory_entry *memory_entry::allocate(size_t size, void *base, const char *file, int line, bool array)
-{
- acquire_lock();
-
- // if we're out of free entries, allocate a new chunk
- if (s_freehead == nullptr)
- {
- // create a new chunk, and fail if we can't
- memory_entry *entry = reinterpret_cast<memory_entry *>(osd_malloc_array(memory_block_alloc_chunk * sizeof(memory_entry)));
- if (entry == nullptr)
- {
- release_lock();
- return nullptr;
- }
-
- // add all the entries to the list
- for (int entrynum = 0; entrynum < memory_block_alloc_chunk; entrynum++)
- {
- entry->m_next = s_freehead;
- s_freehead = entry++;
- }
- }
-
- // grab a free entry
- memory_entry *entry = s_freehead;
- s_freehead = entry->m_next;
-
- // populate it
- entry->m_size = size;
- entry->m_base = base;
- entry->m_file = s_tracking ? file : nullptr;
- entry->m_line = s_tracking ? line : 0;
- entry->m_id = s_curid++;
- entry->m_array = array;
- if (LOG_ALLOCS)
- fprintf(stderr, "#%06d, alloc %d bytes (%s:%d)\n", (UINT32)entry->m_id, static_cast<UINT32>(entry->m_size), entry->m_file, (int)entry->m_line);
-
- // add it to the alloc list
- int hashval = reinterpret_cast<FPTR>(base) % k_hash_prime;
- entry->m_next = s_hash[hashval];
- if (entry->m_next != nullptr)
- entry->m_next->m_prev = entry;
- entry->m_prev = nullptr;
- s_hash[hashval] = entry;
-
- release_lock();
- return entry;
-}
-
-
-//-------------------------------------------------
-// find - find a memory entry
-//-------------------------------------------------
-
-memory_entry *memory_entry::find(void *ptr)
-{
- // NULL maps to nothing
- if (ptr == nullptr)
- return nullptr;
-
- // scan the list under the lock
- acquire_lock();
-
- int hashval = reinterpret_cast<FPTR>(ptr) % k_hash_prime;
- memory_entry *entry;
- for (entry = s_hash[hashval]; entry != nullptr; entry = entry->m_next)
- if (entry->m_base == ptr)
- break;
-
- release_lock();
- return entry;
-}
-
-
-//-------------------------------------------------
-// release - release a memory entry
-//-------------------------------------------------
-
-void memory_entry::release(memory_entry *entry, const char *file, int line)
-{
- acquire_lock();
-
- if (LOG_ALLOCS)
- fprintf(stderr, "#%06d, release %d bytes (%s:%d)\n", (UINT32)entry->m_id, static_cast<UINT32>(entry->m_size), file, line);
-
- // remove ourselves from the alloc list
- int hashval = reinterpret_cast<FPTR>(entry->m_base) % k_hash_prime;
- if (entry->m_prev != nullptr)
- entry->m_prev->m_next = entry->m_next;
- else
- s_hash[hashval] = entry->m_next;
- if (entry->m_next != nullptr)
- entry->m_next->m_prev = entry->m_prev;
-
- // add ourself to the free list
- entry->m_next = s_freehead;
- s_freehead = entry;
-
- release_lock();
-}
-
-/**
- * @fn void memory_entry::report_unfreed(UINT64 start)
- *
- * @brief -------------------------------------------------
- * report_unfreed - print a list of unfreed memory to the target file
- * -------------------------------------------------.
- *
- * @param start The start.
- */
-
-void memory_entry::report_unfreed(UINT64 start)
-{
- acquire_lock();
-
- // check for leaked memory
- UINT32 total = 0;
-
- for (auto entry : s_hash)
- for (; entry != nullptr; entry = entry->m_next)
- if (entry->m_file != nullptr && entry->m_id >= start)
- {
- if (total == 0)
- fprintf(stderr, "--- memory leak warning ---\n");
- total += entry->m_size;
- fprintf(stderr, "#%06d, nofree %d bytes (%s:%d)\n", (UINT32)entry->m_id, static_cast<UINT32>(entry->m_size), entry->m_file, (int)entry->m_line);
- }
-
- release_lock();
-
- if (total > 0)
- fprintf(stderr, "a total of %u bytes were not freed\n", total);
-}
diff --git a/src/lib/util/corealloc.h b/src/lib/util/corealloc.h
index 5cd481824ed..4f0b961eb59 100644
--- a/src/lib/util/corealloc.h
+++ b/src/lib/util/corealloc.h
@@ -15,6 +15,9 @@
#include <stdlib.h>
#include <new>
+#include <type_traits>
+#include <utility>
+#include <memory>
#include "osdcore.h"
@@ -23,82 +26,80 @@
//**************************************************************************
// global allocation helpers -- use these instead of new and delete
-#define global_alloc(_type) new(__FILE__, __LINE__) _type
-#define global_alloc_clear(_type) new(__FILE__, __LINE__, zeromem) _type
-#define global_alloc_array(_type, _num) new(__FILE__, __LINE__) _type[_num]
-#define global_alloc_array_clear(_type, _num) new(__FILE__, __LINE__, zeromem) _type[_num]
+#define global_alloc(_type) new _type
+#define global_alloc_array(_type, _num) new _type[_num]
#define global_free(_ptr) do { delete _ptr; } while (0)
#define global_free_array(_ptr) do { delete[] _ptr; } while (0)
-//**************************************************************************
-// FUNCTION PROTOTYPES
-//**************************************************************************
-
-// allocate memory with file and line number information
-void *malloc_file_line(size_t size, const char *file, int line, bool array, bool throw_on_fail, bool clear);
-
-// free memory with file and line number information
-void free_file_line(void *memory, const char *file, int line, bool array);
-inline void free_file_line(const void *memory, const char *file, int line, bool array) { free_file_line(const_cast<void *>(memory), file, line, array); }
-
-// called from the exit path of any code that wants to check for unfreed memory
-void track_memory(bool track);
-UINT64 next_memory_id();
-void dump_unfreed_mem(UINT64 start = 0);
-
-
-
-//**************************************************************************
-// OPERATOR OVERLOADS - DECLARATIONS
-//**************************************************************************
-
-// zeromem_t is a dummy class used to tell new to zero memory after allocation
-class zeromem_t { };
-
-// file/line new/delete operators
-void *operator new(std::size_t size, const char *file, int line) throw (std::bad_alloc);
-void *operator new[](std::size_t size, const char *file, int line) throw (std::bad_alloc);
-void operator delete(void *ptr, const char *file, int line);
-void operator delete[](void *ptr, const char *file, int line);
-
-// file/line new/delete operators with zeroing
-void *operator new(std::size_t size, const char *file, int line, const zeromem_t &) throw (std::bad_alloc);
-void *operator new[](std::size_t size, const char *file, int line, const zeromem_t &) throw (std::bad_alloc);
-void operator delete(void *ptr, const char *file, int line, const zeromem_t &);
-void operator delete[](void *ptr, const char *file, int line, const zeromem_t &);
-
-
-
-//**************************************************************************
-// GLOBAL VARIABLES
-//**************************************************************************
-
-// dummy objects to pass to the specialized new variants
-extern const zeromem_t zeromem;
-
-
-
-//**************************************************************************
-// ADDDITIONAL MACROS
-//**************************************************************************
-
-#ifndef NO_MEM_TRACKING
-// re-route classic malloc-style allocations
-#undef malloc
-#undef realloc
-#undef free
-
-#define malloc(x) malloc_file_line(x, __FILE__, __LINE__, true, false, false)
-#define realloc(x,y) __error_realloc_is_dangerous__
-#define free(x) free_file_line(x, __FILE__, __LINE__, true)
-
-#if !defined(_MSC_VER) || _MSC_VER < 1900 // < VS2015
-#undef calloc
-#define calloc(x,y) __error_use_auto_alloc_clear_or_global_alloc_clear_instead__
-#endif
-
-#endif
+template<typename _Tp, typename... _Args>
+inline _Tp* global_alloc_clear(_Args&&... __args)
+{
+ unsigned char * ptr = new unsigned char[sizeof(_Tp)]; // allocate memory
+ memset(ptr, 0, sizeof(_Tp));
+ return new(ptr) _Tp(std::forward<_Args>(__args)...);
+}
+
+template<typename _Tp>
+inline _Tp* global_alloc_array_clear(size_t __num)
+{
+ auto size = sizeof(_Tp) * __num;
+ unsigned char* ptr = new unsigned char[size]; // allocate memory
+ memset(ptr, 0, size);
+ return new(ptr) _Tp[__num]();
+}
+
+
+
+template<typename _Tp>
+struct _MakeUniqClear
+{
+ typedef std::unique_ptr<_Tp> __single_object;
+};
+
+template<typename _Tp>
+struct _MakeUniqClear<_Tp[]>
+{
+ typedef std::unique_ptr<_Tp[]> __array;
+};
+
+template<typename _Tp, size_t _Bound>
+struct _MakeUniqClear<_Tp[_Bound]>
+{
+ struct __invalid_type { };
+};
+
+/// make_unique_clear for single objects
+template<typename _Tp, typename... _Args>
+inline typename _MakeUniqClear<_Tp>::__single_object make_unique_clear(_Args&&... __args)
+{
+ unsigned char* ptr = new unsigned char[sizeof(_Tp)]; // allocate memory
+ memset(ptr, 0, sizeof(_Tp));
+ return std::unique_ptr<_Tp>(new(ptr) _Tp(std::forward<_Args>(__args)...));
+}
+
+/// make_unique_clear for arrays of unknown bound
+template<typename _Tp>
+inline typename _MakeUniqClear<_Tp>::__array make_unique_clear(size_t __num)
+{
+ auto size = sizeof(std::remove_extent_t<_Tp>) * __num;
+ unsigned char* ptr = new unsigned char[size]; // allocate memory
+ memset(ptr, 0, size);
+ return std::unique_ptr<_Tp>(new(ptr) std::remove_extent_t<_Tp>[__num]());
+}
+
+template<typename _Tp, unsigned char _F>
+inline typename _MakeUniqClear<_Tp>::__array make_unique_clear(size_t __num)
+{
+ auto size = sizeof(std::remove_extent_t<_Tp>) * __num;
+ unsigned char* ptr = new unsigned char[size]; // allocate memory
+ memset(ptr, _F, size);
+ return std::unique_ptr<_Tp>(new(ptr) std::remove_extent_t<_Tp>[__num]());
+}
+
+/// Disable make_unique_clear for arrays of known bound
+template<typename _Tp, typename... _Args>
+inline typename _MakeUniqClear<_Tp>::__invalid_type make_unique_clear(_Args&&...) = delete;
#endif /* __COREALLOC_H__ */
diff --git a/src/lib/util/corefile.cpp b/src/lib/util/corefile.cpp
index a2242c133c6..344a2922bfe 100644
--- a/src/lib/util/corefile.cpp
+++ b/src/lib/util/corefile.cpp
@@ -909,7 +909,7 @@ file_error core_truncate(core_file *f, UINT64 offset)
assumptions about path separators
-------------------------------------------------*/
-std::string &core_filename_extract_base(std::string &result, const char *name, bool strip_extension)
+std::string core_filename_extract_base(const char *name, bool strip_extension)
{
/* find the start of the name */
const char *start = name + strlen(name);
@@ -917,7 +917,7 @@ std::string &core_filename_extract_base(std::string &result, const char *name, b
start--;
/* copy the rest into an astring */
- result.assign(start);
+ std::string result(start);
/* chop the extension if present */
if (strip_extension)
diff --git a/src/lib/util/corefile.h b/src/lib/util/corefile.h
index eeb5a8efa22..5266832c374 100644
--- a/src/lib/util/corefile.h
+++ b/src/lib/util/corefile.h
@@ -125,7 +125,7 @@ file_error core_truncate(core_file *f, UINT64 offset);
/* ----- filename utilities ----- */
/* extract the base part of a filename (remove extensions and paths) */
-std::string &core_filename_extract_base(std::string &result, const char *name, bool strip_extension = false);
+std::string core_filename_extract_base(const char *name, bool strip_extension = false);
/* true if the given filename ends with a particular extension */
int core_filename_ends_with(const char *filename, const char *extension);
diff --git a/src/lib/util/corestr.cpp b/src/lib/util/corestr.cpp
index 336d788cabb..ce5976869d4 100644
--- a/src/lib/util/corestr.cpp
+++ b/src/lib/util/corestr.cpp
@@ -217,14 +217,13 @@ int strprintf(std::string &str, const char *format, ...)
return retVal;
}
-std::string strformat(std::string &str, const char *format, ...)
+std::string strformat(const char *format, ...)
{
std::string retVal;
va_list ap;
va_start(ap, format);
- strvprintf(str, format, ap);
+ strvprintf(retVal, format, ap);
va_end(ap);
- retVal.assign(str);
return retVal;
}
diff --git a/src/lib/util/corestr.h b/src/lib/util/corestr.h
index 519e1edc849..94f13c4061b 100644
--- a/src/lib/util/corestr.h
+++ b/src/lib/util/corestr.h
@@ -68,7 +68,7 @@ int strvprintf(std::string &str, const char *format, va_list args);
int strcatvprintf(std::string &str, const char *format, va_list args);
int strprintf(std::string &str, const char *format, ...) ATTR_PRINTF(2, 3);
int strcatprintf(std::string &str, const char *format, ...) ATTR_PRINTF(2, 3);
-std::string strformat(std::string &str, const char *format, ...) ATTR_PRINTF(2, 3);
+std::string strformat(const char *format, ...) ATTR_PRINTF(1, 2);
void strdelchr(std::string& str, char chr);
void strreplacechr(std::string& str, char ch, char newch);
diff --git a/src/lib/util/coretmpl.h b/src/lib/util/coretmpl.h
index afbd3dcf9a1..9201041b2d9 100644
--- a/src/lib/util/coretmpl.h
+++ b/src/lib/util/coretmpl.h
@@ -18,6 +18,11 @@
#include <vector>
+#if defined(_MSC_VER) && (_MSC_VER < 1900)
+#include <yvals.h>
+#define noexcept _NOEXCEPT
+#endif
+
// TEMPORARY helper to catch is_pod assertions in the debugger
#if 0
#undef assert
@@ -33,25 +38,25 @@ typedef std::vector<UINT8> dynamic_buffer;
// a simple_list is a singly-linked list whose 'next' pointer is owned
// by the object
template<class _ElementType>
-class simple_list
+class simple_list final
{
+public:
// we don't support deep copying
- simple_list(const simple_list &);
- simple_list &operator=(const simple_list &);
+ simple_list(const simple_list &) = delete;
+ simple_list &operator=(const simple_list &) = delete;
-public:
// construction/destruction
- simple_list()
+ simple_list() noexcept
: m_head(nullptr),
m_tail(nullptr),
m_count(0) { }
- virtual ~simple_list() { reset(); }
+ ~simple_list() noexcept { reset(); }
// simple getters
- _ElementType *first() const { return m_head; }
- _ElementType *last() const { return m_tail; }
- int count() const { return m_count; }
+ _ElementType *first() const noexcept { return m_head; }
+ _ElementType *last() const noexcept { return m_tail; }
+ int count() const noexcept { return m_count; }
// remove (free) all objects in the list, leaving an empty list
void reset()
@@ -72,7 +77,7 @@ public:
}
// add the given list to the head of the list
- void prepend_list(simple_list<_ElementType> &list)
+ void prepend_list(simple_list<_ElementType> &list) noexcept
{
int count = list.count();
if (count == 0)
@@ -87,7 +92,7 @@ public:
}
// add the given object to the tail of the list
- _ElementType &append(_ElementType &object)
+ _ElementType &append(_ElementType &object) noexcept
{
object.m_next = nullptr;
if (m_tail != nullptr)
@@ -99,7 +104,7 @@ public:
}
// add the given list to the tail of the list
- void append_list(simple_list<_ElementType> &list)
+ void append_list(simple_list<_ElementType> &list) noexcept
{
int count = list.count();
if (count == 0)
@@ -115,7 +120,7 @@ public:
}
// insert the given object after a particular object (NULL means prepend)
- _ElementType &insert_after(_ElementType &object, _ElementType *insert_after)
+ _ElementType &insert_after(_ElementType &object, _ElementType *insert_after) noexcept
{
if (insert_after == nullptr)
return prepend(object);
@@ -128,7 +133,7 @@ public:
}
// insert the given object before a particular object (NULL means append)
- _ElementType &insert_before(_ElementType &object, _ElementType *insert_before)
+ _ElementType &insert_before(_ElementType &object, _ElementType *insert_before) noexcept
{
if (insert_before == nullptr)
return append(object);
@@ -146,7 +151,7 @@ public:
}
// replace an item in the list at the same location, and remove it
- _ElementType &replace_and_remove(_ElementType &object, _ElementType &toreplace)
+ _ElementType &replace_and_remove(_ElementType &object, _ElementType &toreplace) noexcept
{
_ElementType *prev = nullptr;
for (_ElementType *cur = m_head; cur != nullptr; prev = cur, cur = cur->m_next)
@@ -166,7 +171,7 @@ public:
}
// detach the head item from the list, but don't free its memory
- _ElementType *detach_head()
+ _ElementType *detach_head() noexcept
{
_ElementType *result = m_head;
if (result != nullptr)
@@ -180,7 +185,7 @@ public:
}
// detach the given item from the list, but don't free its memory
- _ElementType &detach(_ElementType &object)
+ _ElementType &detach(_ElementType &object) noexcept
{
_ElementType *prev = nullptr;
for (_ElementType *cur = m_head; cur != nullptr; prev = cur, cur = cur->m_next)
@@ -199,7 +204,7 @@ public:
}
// deatch the entire list, returning the head, but don't free memory
- _ElementType *detach_all()
+ _ElementType *detach_all() noexcept
{
_ElementType *result = m_head;
m_head = m_tail = nullptr;
@@ -208,13 +213,13 @@ public:
}
// remove the given object and free its memory
- void remove(_ElementType &object)
+ void remove(_ElementType &object) noexcept
{
global_free(&detach(object));
}
// find an object by index in the list
- _ElementType *find(int index) const
+ _ElementType *find(int index) const noexcept
{
for (_ElementType *cur = m_head; cur != nullptr; cur = cur->m_next)
if (index-- == 0)
@@ -223,7 +228,7 @@ public:
}
// return the index of the given object in the list
- int indexof(const _ElementType &object) const
+ int indexof(const _ElementType &object) const noexcept
{
int index = 0;
for (_ElementType *cur = m_head; cur != nullptr; cur = cur->m_next)
diff --git a/src/lib/util/hashing.cpp b/src/lib/util/hashing.cpp
index 785127e01e8..8e85e4a42d2 100644
--- a/src/lib/util/hashing.cpp
+++ b/src/lib/util/hashing.cpp
@@ -79,12 +79,12 @@ bool sha1_t::from_string(const char *string, int length)
// as_string - convert to a string
//-------------------------------------------------
-const char *sha1_t::as_string(std::string &buffer) const
+std::string sha1_t::as_string() const
{
- buffer.clear();
+ std::string buffer;
for (auto & elem : m_raw)
strcatprintf(buffer, "%02x", elem);
- return buffer.c_str();
+ return buffer;
}
@@ -122,12 +122,12 @@ bool md5_t::from_string(const char *string, int length)
// as_string - convert to a string
//-------------------------------------------------
-const char *md5_t::as_string(std::string &buffer) const
+std::string md5_t::as_string() const
{
- buffer.clear();
+ std::string buffer;
for (auto & elem : m_raw)
strcatprintf(buffer, "%02x", elem);
- return buffer.c_str();
+ return buffer;
}
@@ -166,10 +166,9 @@ bool crc32_t::from_string(const char *string, int length)
// as_string - convert to a string
//-------------------------------------------------
-const char *crc32_t::as_string(std::string &buffer) const
+std::string crc32_t::as_string() const
{
- strprintf(buffer, "%08x", m_raw);
- return buffer.c_str();
+ return strformat("%08x", m_raw);
}
@@ -215,21 +214,18 @@ bool crc16_t::from_string(const char *string, int length)
}
/**
- * @fn const char *crc16_t::as_string(std::string &buffer) const
+ * @fn std::string crc16_t::as_string() const
*
* @brief -------------------------------------------------
* as_string - convert to a string
* -------------------------------------------------.
*
- * @param [in,out] buffer The buffer.
- *
- * @return null if it fails, else a char*.
+ * @return a std::string.
*/
-const char *crc16_t::as_string(std::string &buffer) const
+std::string crc16_t::as_string() const
{
- strprintf(buffer, "%04x", m_raw);
- return buffer.c_str();
+ return strformat("%04x", m_raw);
}
/**
diff --git a/src/lib/util/hashing.h b/src/lib/util/hashing.h
index b0de6a5c3c8..51a7da7c694 100644
--- a/src/lib/util/hashing.h
+++ b/src/lib/util/hashing.h
@@ -34,7 +34,7 @@ struct sha1_t
bool operator!=(const sha1_t &rhs) const { return memcmp(m_raw, rhs.m_raw, sizeof(m_raw)) != 0; }
operator UINT8 *() { return m_raw; }
bool from_string(const char *string, int length = -1);
- const char *as_string(std::string &buffer) const;
+ std::string as_string() const;
UINT8 m_raw[20];
static const sha1_t null;
};
@@ -85,7 +85,7 @@ struct md5_t
bool operator!=(const md5_t &rhs) const { return memcmp(m_raw, rhs.m_raw, sizeof(m_raw)) != 0; }
operator UINT8 *() { return m_raw; }
bool from_string(const char *string, int length = -1);
- const char *as_string(std::string &buffer) const;
+ std::string as_string() const;
UINT8 m_raw[16];
static const md5_t null;
};
@@ -136,7 +136,7 @@ struct crc32_t
crc32_t &operator=(const UINT32 crc) { m_raw = crc; return *this; }
operator UINT32() const { return m_raw; }
bool from_string(const char *string, int length = -1);
- const char *as_string(std::string &buffer) const;
+ std::string as_string() const;
UINT32 m_raw;
static const crc32_t null;
};
@@ -182,7 +182,7 @@ struct crc16_t
crc16_t &operator=(const UINT16 crc) { m_raw = crc; return *this; }
operator UINT16() const { return m_raw; }
bool from_string(const char *string, int length = -1);
- const char *as_string(std::string &buffer) const;
+ std::string as_string() const;
UINT16 m_raw;
static const crc16_t null;
};
diff --git a/src/lib/util/options.cpp b/src/lib/util/options.cpp
index 0e02b7dc735..d7ab454d063 100644
--- a/src/lib/util/options.cpp
+++ b/src/lib/util/options.cpp
@@ -478,10 +478,10 @@ void core_options::revert(int priority)
// the optional diff
//-------------------------------------------------
-const char *core_options::output_ini(std::string &buffer, const core_options *diff)
+std::string core_options::output_ini(const core_options *diff) const
{
// INI files are complete, so always start with a blank buffer
- buffer.clear();
+ std::string buffer;
int num_valid_headers = 0;
int unadorned_index = 0;
@@ -534,7 +534,7 @@ const char *core_options::output_ini(std::string &buffer, const core_options *di
}
}
}
- return buffer.c_str();
+ return buffer;
}
@@ -542,10 +542,10 @@ const char *core_options::output_ini(std::string &buffer, const core_options *di
// output_help - output option help to a string
//-------------------------------------------------
-const char *core_options::output_help(std::string &buffer)
+std::string core_options::output_help() const
{
// start empty
- buffer.clear();
+ std::string buffer;
// loop over all items
for (entry *curentry = m_entrylist.first(); curentry != nullptr; curentry = curentry->next())
@@ -558,7 +558,7 @@ const char *core_options::output_help(std::string &buffer)
else if (curentry->description() != nullptr)
strcatprintf(buffer,"-%-20s%s\n", curentry->name(), curentry->description());
}
- return buffer.c_str();
+ return buffer;
}
@@ -634,15 +634,13 @@ bool core_options::set_value(const char *name, const char *value, int priority,
bool core_options::set_value(const char *name, int value, int priority, std::string &error_string)
{
- std::string tempstr;
- strprintf(tempstr,"%d", value);
+ std::string tempstr = strformat("%d", value);
return set_value(name, tempstr.c_str(), priority, error_string);
}
bool core_options::set_value(const char *name, float value, int priority, std::string &error_string)
{
- std::string tempstr;
- strprintf(tempstr, "%f", (double) value);
+ std::string tempstr = strformat("%f", (double)value);
return set_value(name, tempstr.c_str(), priority, error_string);
}
diff --git a/src/lib/util/options.h b/src/lib/util/options.h
index f193d4a4976..1df89bed6c7 100644
--- a/src/lib/util/options.h
+++ b/src/lib/util/options.h
@@ -145,8 +145,8 @@ public:
void revert(int priority = OPTION_PRIORITY_MAXIMUM);
// output
- const char *output_ini(std::string &buffer, const core_options *diff = nullptr);
- const char *output_help(std::string &buffer);
+ std::string output_ini(const core_options *diff = nullptr) const;
+ std::string output_help() const;
// reading
const char *value(const char *option) const;
diff --git a/src/lib/util/tagmap.h b/src/lib/util/tagmap.h
index 4d15cbba193..cdbaf63d7fe 100644
--- a/src/lib/util/tagmap.h
+++ b/src/lib/util/tagmap.h
@@ -77,7 +77,7 @@ public:
}
// operations by tag
- void remove(const char *tag) { auto search = m_map.find(tag); if (search != m_map.end()) m_list.remove(*search->second); }
+ void remove(const char *tag) { auto search = m_map.find(tag); if (search != m_map.end()) { m_list.remove(*search->second); m_map.erase(search); } }
_ElementType *find(const char *tag) const { auto search = m_map.find(tag); return (search == m_map.end()) ? nullptr : search->second; }
private:
diff --git a/src/mame/arcade.lst b/src/mame/arcade.lst
index 5b3276468b3..90ab4bd4d2d 100644
--- a/src/mame/arcade.lst
+++ b/src/mame/arcade.lst
@@ -76,7 +76,9 @@ mspacmanbg // bootleg
mspacmanbgd // bootleg
mspacmanbcc // bootleg
mspacmanblt // bootleg
-clubpacm // Miky
+clubpacm // Miky SRL
+clubpacma // Miky SRL
+clubpacmb // Miky SRL
woodpeck // (c) 1981 Amenip (Palcom Queen River)
woodpeca // (c) 1981 Amenip Nova Games Ltd.
mspacmab // bootleg
@@ -314,6 +316,7 @@ amidars // GX337 (c) 1982 Konami
triplep // (c) 1982 KKI / made by Sanritsu?
triplepa // (c) 1982 KKI / made by Sanritsu?
knockout // (c) 1982 KKK
+knockoutb // bootleg
mariner // (c) 1981 Amenip
800fath // (c) 1981 Amenip + U.S. Billiards license
mars // (c) 1981 Artic
@@ -359,6 +362,7 @@ calipso // (c) 1982 Tago
anteater // (c) 1982 Tago
anteaterg // (c) 1983 TV-Tuning (F.E.G. license)
anteateruk // (c) 1983 Free Enterprise Games
+anteatergg // bootleg
rescue // (c) 1982 Stern
rescueb // (c) Videl Games (Rescue bootleg)
aponow // bootleg
@@ -1435,7 +1439,7 @@ pss64 // 199? Nintendo / Hudson Soft
// SNES-based hacks
kinstb // bootleg
-mk3snes // bootleg
+mk3snes // bootleg
ffight2b // bootleg
sblast2b // bootleg
iron // bootleg
@@ -1484,7 +1488,7 @@ searthie // bootleg
invadrmr // (c) 1978 Model Racing
claybust // (c) 1978 Model Racing
gunchamp // (c) 1980 Model Racing
-gunchamps // (c) 1980 Model Racing (sshot.c)
+gunchamps // (c) 1980 Model Racing (sshot.cpp)
spaceatt // (c) 1978 Video Games GmbH
spaceattbp // (c) 1978 Video Games GmbH
spaceatt2k // (c) 1978 Video Games GmbH
@@ -1534,6 +1538,7 @@ schasera // RT Taito
schaserb // RT Taito
schaserc // RT Taito
schasercv // RT Taito
+schaserm // Model Racing
lupin3 // LP (c) 1980 Taito
lupin3a // LP (c) 1980 Taito
intruder // (c) 1980 GamePlan (Taito)
@@ -2116,6 +2121,7 @@ knightb // bootleg
kicknrun // A87 (c) 1986 Taito Corporation
kicknrunu // A87 (c) 1986 Taito Corporation
mexico86 // bootleg (Micro Research)
+mexico86a // bootleg
darius // A96 (c) 1986 Taito Corporation Japan (World)
dariusu // A96 (c) 1986 Taito America Corporation (US)
dariusj // A96 (c) 1986 Taito Corporation (Japan)
@@ -2497,7 +2503,7 @@ gseeker // 1992.?? D40 (c) 1992 Taito Corporation Japan (World)
gseekerj // 1992.12 D40 (c) 1992 Taito Corporation (Japan)
gseekeru // 1992.?? D40 (c) 1992 Taito America Corporation (US)
hthero93 // 1993.03 D49 (c) 1992 Taito Corporation (Japan)
- // 1993.04 D49 (US)
+hthero93u // 1993.04 D49 (c) 1992 Taito America Corporation (US)
cupfinal // 1993.?? D49 (c) 1993 Taito Corporation Japan (World)
trstar // 1993.?? D53 (c) 1993 Taito Corporation Japan (World)
trstarj // 1993.07 D53 (c) 1993 Taito Corporation (Japan)
@@ -2604,11 +2610,13 @@ optiger // 1998.09 E63 (c) 1998 Taito
taitotz
batlgear // E68 (c) 1999 Taito
pwrshovl // E74 (c) 1999 Taito
+pwrshovla //
landhigh // E82 (c) 1999 Taito
batlgr2 // E87 (c) 2000 Taito (2.04J)
batlgr2a // E87 (c) 2000 Taito (2.01J)
styphp // E98 (c) 2000 Taito
raizpin // F14 (c) 2002 Taito
+raizpinj //
invqix // F34 (c) 2003 Taito Corporation
@@ -2709,6 +2717,7 @@ toto //
honeydol // (c) 1995 Barko Corp
twinadv // (c) 1995 Barko Corp
twinadvk // (c) 1995 Barko Corp
+multi96 // (c) 1996 Barko Corp
snowbro3 // (c) 2002 Syrmex
ballboy // bootleg
// SemiCom games on "SnowBros"-like hardware
@@ -3137,6 +3146,7 @@ daimakai // 12/1988 (c) 1988 (Japan)
daimakair // 12/1988 (c) 1988 (Japan)
strider // 3/1989 (c) 1989 (not explicitly stated but should be USA)
striderua // 3/1989 (c) 1989 (not explicitly stated but should be USA)
+strideruc // conversion
striderj // 3/1989 (c) 1989 (Japan)
striderjr // 3/1989 (c) 1989 (Japan)
dynwar // 4/1989 (c) 1989 (USA)
@@ -3251,6 +3261,7 @@ sf2v004 // hack
sf2acc // hack
sf2acca // hack
sf2ceblp // hack
+sf2cebltw // hack
sf2accp2 // hack
sf2amf // bootleg
sf2amf2 // bootleg
@@ -3363,7 +3374,7 @@ ddtodh // 12/04/1994 (c) 1993 (Hispanic)
ddtodhr1 // 25/01/1994 (c) 1993 (Hispanic)
ddtodhr2 // 13/01/1994 (c) 1993 (Hispanic)
ssf2t // 23/02/1994 (c) 1994 (World)
-ssf2th // 23/02/1994 (c) 1994 (Hispanic)
+ssf2th // 23/02/1994 (c) 1994 (Hispanic)
ssf2tu // 23/03/1994 (c) 1994 (USA)
ssf2tur1 // 23/02/1994 (c) 1994 (USA)
ssf2ta // 23/02/1994 (c) 1994 (Asia)
@@ -3385,6 +3396,7 @@ vampja // 05/07/1994 (c) 1994 (Japan)
vampjr1 // 30/06/1994 (c) 1994 (Japan)
ringdest // 02/09/1994 (c) 1994 (Euro)
ringdesta // 31/08/1994 (c) 1994 (Asia)
+ringdesth // 02/09/1994 (c) 1994 (Hispanic)
smbomb // 31/08/1994 (c) 1994 (Japan)
smbombr1 // 08/08/1994 (c) 1994 (Japan)
armwar // 24/10/1994 (c) 1994 (Euro)
@@ -3670,7 +3682,9 @@ jojobaner1 // 13/09/1999 (c) 1999 (Euro)
cps3boot // bootleg
cps3boota // bootleg
cps3booto // bootleg
-cps3bootoa // bootleg
+cps3bootao // bootleg
+cps3booto2 // bootleg
+cps3bootao2 // bootleg
cps3bs32 //
cps3bs32a //
@@ -3720,6 +3734,9 @@ shiryu2 // Strider Hiryu 2 (JAPAN 991213)
// Capcom medal games
alien // (c) 2005
+// Capcom Nintendo HW?
+tvcapcom
+
// Tecmo ZN1
tps
glpracr2 // Gallop Racer 2 (USA)
@@ -3729,7 +3746,7 @@ doapp // Dead Or Alive ++ (JAPAN)
cbaj // Cool Boaders Arcade Jam
shngmtkb // Shanghai Matekibuyuu
tondemo // Tondemo Crisis (JAPAN)
-glpracr3 // Gallop Racer 3 (Export)
+glpracr3 // Gallop Racer 3 (Export)
glpracr3j // Gallop Racer 3 (JAPAN)
flamegun // Flame Gunner (USA)
flamegunj // Flame Gunner (JAPAN)
@@ -4126,6 +4143,7 @@ tsurugij // 2001
wcombat // 2002
wcombatk // 2002
wcombatj // 2002
+wcombatu // 2002
xtrial // 2002
mfightc // 2002
mfightcc // 2002
@@ -4176,6 +4194,7 @@ wfortunea // (c) 1989 GameTek
grmatch // (c) 1989 Yankee Game Technology
stratab // (c) 1990 Strata/Incredible Technologies
stratab1 // (c) 1990 Strata/Incredible Technologies
+stratabs // (c) 1990 Strata/Incredible Technologies
sstrike // (c) 1990 Strata/Incredible Technologies
gtg // (c) 1990 Strata/Incredible Technologies
gtgt // (c) 1990 Strata/Incredible Technologies
@@ -4363,7 +4382,7 @@ sspaceatc // 139-146 (c)
sspacaho // ? epr00001.bin - epr00008.bin
headon // 163-167/192-193 (c) Gremlin
headon1 // 163-167/192-193 (c) Gremlin
-headonb // bootleg, headonb.c
+headonb // bootleg, headonb.cpp
headons // Sidam bootleg
headonsa // Sidam bootleg
headonmz // bootleg
@@ -4821,7 +4840,7 @@ mwalku // 1990.08 Micheal Jackson's Moonwalker (US, FD1094+8751)
mwalkj // 1990.08 Micheal Jackson's Moonwalker (Japan, FD1094+8751)
mwalk // 1990.?? Micheal Jackson's Moonwalker (World, FD1094+8751)
lghost // 1990.?? Laser Ghost (World, FD1094)
- // 1990.12 Laser Ghost (Japan)
+lghostj // 1990.12 Laser Ghost (Japan)
lghostu // 1991.01 Laser Ghost (US, FD1094)
cltchitr // 1991.02 Clutch Hitter (US, FD1094)
cltchitrj // 1991.05 Clutch Hitter (Japan, FD1094)
@@ -5357,7 +5376,8 @@ tfrceacj // (c) 1990 Sega / Technosoft
tfrceacb // bootleg
twinsqua // (c) 1991 Sega
soniccar // (c) 1991 Sega
-sonicpop
+wwmarine // (c) 1992 Sega
+sonicpop // (c) 1993 Sega
ribbit // (c) 1991 Sega
tantr // (c) 1992 Sega
tantrkor // (c) 1992 Sega
@@ -5492,9 +5512,9 @@ dybbnao // 1998.12 Dynamite Baseball NAOMI
crzytaxi // 1999.02 Crazy Taxi
pstone // 1999.02 Power Stone
zombrvno // 1999.02 Zombie Revenge
-zombrvn // 1999.03 Zombie Revenge (Rev A)
airlbios // 1999.03 Airline Pilots (BIOS)
alpilota // 1999.03 Airline Pilots (Rev A)
+zombrvn // 1999.03 Zombie Revenge (Rev A)
ggram2 // 1999.04 Giant Gram: All Japan Pro Wrestling 2
// 1999.05 Taisen Puzzle Kurutto Stone
ringout // 1999.06 Ring Out 4x4
@@ -5524,14 +5544,13 @@ alpiltdx // 1999.?? Airline Pilots Deluxe (Rev B)
// 1999.?? Pocket Shooting
sambap // 1999.?? Samba de Amigo (prototype)
spawn // 1999.?? Spawn In the Demon's Hand
- // 1999.?? Tokio Bus Guide
-tokyobus // 1999.?? Tokio Bus Guide (Rev A)
+tokyobus // 1999.?? Tokyo Bus Guide (Rev A)
vtennisg // 1999.?? Virtua Tennis / Power Smash (GD-ROM)
-totdo // 1999.?? The Typing of the Dead
18wheelr // 2000.01 18 Wheeler Deluxe (Rev A)
18wheels // 2000.01 18 Wheeler (Standard)
18wheelu // 2000.01 18 Wheeler (Upright)
doa2m // 2000.01 Dead or Alive 2 Millennium
+totdo // 2000.01 The Typing of the Dead
totd // 2000.01 The Typing of the Dead (Rev A)
tduno2 // 2000.02 Touch de UNO! 2
virnba // 2000.02 Virtua NBA
@@ -5584,9 +5603,9 @@ gundmgd // 2001.03 Mobile Suit Gundam: Federation Vs. Zeon (GD-ROM)
gundmct // 2001.03 Mobile Suit Gundam: Federation Vs. Zeon (cartridge)
shaktmsp // 2001.04.04 Shakatto Tambourine Motto Norinori Shinkyoku Tsuika (2K1 SPR)
dygolf // 2001.04.27 Dynamic Golf / Virtua Golf (Rev A)
+cvsgd // 2001.05 Capcom Vs. SNK Millennium Fight 2000 Pro
monkeyba // 2001.05 Monkey Ball
zerogu2 // 2001.05 Zero Gunner 2
-cvsgd // 2001.06 Capcom Vs. SNK Millennium Fight 2000 Pro
crakndj2 // 2001.06 Crackin' DJ Part 2
hmgeo // 2001.06 Heavy Metal Geomatrix (Rev B)
wsbbgd // 2001.06 Super Major League / World Series Baseball
@@ -5629,11 +5648,11 @@ mtkob2 // 2003.02 MushiKing The King Of Beetle
ggxxrlo // 2003.02 Guilty Gear XX # Reload
ggxxrl // 2003.03 Guilty Gear XX # Reload (Rev A)
// 2003.03 Sega Network Taisen Mahjong MJ
-bdrdown // 2003.04 Border Down (Rev A)
shikgam2 // 2003.04 Shikigami No Shiro II / The Castle of Shikigami II
usagiym // 2003.06 Usagi Yamashiro Mahjong Hen
// 2003.07 Sega Network Taisen Mahjong MJ (Rev A)
oinori // 2003.08 Oinori-daimyoujin Matsuri
+bdrdown // 2003.09 Border Down (Rev A)
psyvar2 // 2003.11 Psyvariar 2 - The Will To Fabricate
puyofev // 2003.11 Puyo Puyo Fever
starhrsp // 2003.12.01 Star Horse Progress (satellite) (Rev A)
@@ -5656,8 +5675,8 @@ meltybld // 2005.08 Melty Blood Act Cadenza Ver. A (Rev C)
ggxxsla // 2005.09 Guilty Gear XX Slash (Rev A)
radirgyo // 2005.10 Radirgy
undefeat // 2005.10 Under Defeat
+dragntr3 // 2005.11 Dragon Treasure 3 (Rev A)
radirgy // 2005.12.04 Radirgy (Rev A)
- // 2005.?? Dragon Treasure 3 (Rev A)
// 2005.?? ExZeus
mushi2eo // 2005.?? Mushiking The King Of Beetles II ENG (Ver. 1.001)
mushik2e // 2005.?? Mushiking The King Of Beetles II ENG (Ver. 2.001)
@@ -5684,7 +5703,7 @@ pokasuka // 2007.07 Pokasuka Ghost!
sl2007 // 2007.07 Shooting Love
asndynmt // 2007.07 Dynamite Deka EX - Asian dynamite
rhytngk // 2007.09 Rhythm Tengoku
-ausfache // 2008.02 Akatsuki Denkou Senki Ausf.Achse
+ausfache // 2008.02.20 Akatsuki Blitzkampf Ausf. Achse
illvelo // 2008.06 Illvelo (Illmatic Envelope)
mamonoro // 2008.07 Mamoru-kun wa Norowarete Shimatta!
mbaao // 2008.09 Melty Blood Actress Again
@@ -5758,24 +5777,17 @@ initdv3e // 2004.05.18 Initial D Arcade Stage Ver. 3 (Export)
vf4tuneda // 2004.09 Virtua Fighter 4 Final Tuned (Rev A)
vf4tunedd // 2004.10 Virtua Fighter 4 Final Tuned (Rev D)
vf4tuned // 2004.12 Virtua Fighter 4 Final Tuned (Rev F)
- // 2004.12 World Club Champion Football Serie A 2002-2003 Ver.2.12
- // 2004.12 World Club Champion Football Serie A 2002-2003 Ver.2.34
- // 2005.04 Menkyo no Tetsujin
- // 2005.06 World Club Champion Football European Clubs 2004-2005
- // 2005.06 World Club Champion Football European Clubs 2004-2005 Ver.1.1
+wccf212e // 2004.12 World Club Champion Football Serie A 2002-2003 Ver.2.12
+wccf234j // 2004.12 World Club Champion Football Serie A 2002-2003 Ver.2.34
+ // 2005.04 Menkyo no Tetsujin / Sega Driving Simulator
+wccf310j // 2005.06 World Club Champion Football European Clubs 2004-2005
+wccf331e // 2005.06 World Club Champion Football European Clubs 2004-2005 Ver.1.1
// 2005.06 World Club Champion Football European Clubs 2004-2005 Ver.1.2
- // 2005.11 World Club Champion Football European Clubs 2004-2005 Ver.3.22
- // 2005.12 Mobile Suit Gundam 0079 Card Builder
- // 2006.03 Mobile Suit Gundam 0079 Card Builder Ver.1.007
- // 2006.07 Mobile Suit Gundam 0079 Card Builder Ver.2.00
- // 2006.08 World Club Champion Football European Clubs 2005-2006
- // 2006.09 Mobile Suit Gundam 0079 Card Builder Ver.2.01
+wccf322e // 2005.11 World Club Champion Football European Clubs 2004-2005 Ver.3.22
+wccf420e // 2006.08 World Club Champion Football European Clubs 2005-2006
// 2006.10 World Club Champion Football European Clubs 2005-2006 bugfix
- // 2006.11 Mobile Suit Gundam 0079 Card Builder Ver.2.02
inidv3ca // 2006.?? Initial D Arcade Stage Ver. 3 Cycraft Edition (Rev A)
inidv3cy // 2006.?? Initial D Arcade Stage Ver. 3 Cycraft Edition (Rev B)
- // 2007.03 Mobile Suit Gundam 0083 Card Builder
- // 2007.10 Mobile Suit Gundam 0083 Card Builder Ryouyuu Gekitotsu
// Atomiswave (Dreamcast-based) games
@@ -5807,7 +5819,8 @@ fotns // 2005.12 Hokuto no Ken
mslug6 // 2006.02 Metal Slug 6
xtrmhnt2 // 2006.09 Extreme Hunting 2 Tournament Edition
claychal // 2008.11 Sega Clay Challenge
-basschal // 2009.02 Sega Bass Challenge
+basschalo // 2009.02 Sega Bass Challenge
+basschal // 2009.07 Sega Bass Challenge Version A
// Hikaru
hikaru // 2000.?? Hikaru BIOS
@@ -5905,6 +5918,7 @@ wangmid2 // 2005.04 Wangan Midnight Maximum Tune 2 (Japan)
// 2005.10 Sangokushi Taisen Ver.1.100
wangmd2b // 2005.10 Wangan Midnight Maximum Tune 2 (Export) (Rev A)
// 2005.11 Sangokushi Taisen Ver.1.110
+ // 2005.12 Mobile Suit Gundam 0079 Card Builder
// 2005.12 Quest of D Gofu no Keisyousya Ver.2.00
// 2005.12 Quest of D Gofu no Keisyousya Ver.2.01
// 2005.12 Sega Network Taisen Mahjong MJ 3
@@ -5918,15 +5932,21 @@ mj3 // 2005.12 Sega Network Taisen Mahjong MJ 3 (Rev F)
scg06nt // 2005.12 Sega Golf Club 2006: Next Tours (Rev A)
// 2006.02 Sangokushi Taisen Ver.1.12
// 2006.03 Quest of D Gofu no Keisyousya Ver.2.02b
+ // 2006.03 Mobile Suit Gundam 0079 Card Builder Ver.1.007
// 2006.04 Sega Network Taisen Mahjong MJ 3 Evolution
// 2006.05 Sangokushi Taisen 2
// 2006.05 Sangokushi Taisen 2 Firmware Update
+ // 2006.07 Mobile Suit Gundam 0079 Card Builder Ver.2.00
+ // 2006.09 Mobile Suit Gundam 0079 Card Builder Ver.2.01
// 2006.09 Sangokushi Taisen 2 Ver.2.007
// 2006.09 Sangokushi Taisen 2 Ver.2.01
// 2006.09 Sega Network Taisen Mahjong MJ 3 Evolution (Rev A)
// 2006.10 Quest of D Oukoku no Syugosya Ver.3.00
// 2006.11 Quest of D Oukoku no Syugosya Ver.3.01
-mj3evo // 2007.06 Sega Network Taisen Mahjong MJ 3 Evolution (Rev B)
+ // 2006.11 Mobile Suit Gundam 0079 Card Builder Ver.2.02
+ // 2007.03 Mobile Suit Gundam 0083 Card Builder
+mj3evo // 2007.06 Sega Network Taisen Mahjong MJ 3 Evolution (Rev B)
+ // 2007.10 Mobile Suit Gundam 0083 Card Builder Ryouyuu Gekitotsu
// 2007.11 Quest of D The Battle Kingdom Ver.4.00
// 2008.01 Quest of D The Battle Kingdom Ver.4.00b
// 2008.02 Quest of D The Battle Kingdom Ver.4.00c
@@ -6164,6 +6184,7 @@ hbarrelw // (c) 1987 Data East Corporation (World)
baddudes // EI (c) 1988 Data East USA (US)
drgninja // EG (c) 1988 Data East Corporation (Japan)
drgninjab // bootleg
+drgninjab2 // bootleg
birdtry // (c) 1988 Data East Corporation (Japan)
robocop // EP? (c) 1988 Data East Corporation (World)
robocopw // EP? (c) 1988 Data East Corporation (World)
@@ -6179,6 +6200,7 @@ ffantasybl // bootleg
secretag // (c) 1989 Data East Corporation (World)
secretagj // (c) 1989 Data East Corporation (Japan)
slyspy // (c) 1989 Data East USA (US)
+slyspy3 // (c) 1989 Data East USA (US)
slyspy2 // (c) 1989 Data East USA (US)
secretab // bootleg
midres // (c) 1989 Data East Corporation (World)
@@ -6359,8 +6381,9 @@ avengrgs // MCG (c) 1995 Data East Corporation (World)
avengrgsj // MCG (c) 1995 Data East Corporation (Japan)
skullfng // MCH (c) 1996 Data East Corporation (World)
skullfngj // MCH (c) 1996 Data East Corporation (Japan)
-stadhr96 // MCM (c) 1996 Data East
-stadhr96j // MCM (c) 1996 Data East
+stadhr96 // MCM (c) 1996 Data East Corporation (World)
+stadhr96u // MCM (c) 1996 Data East Corporation (USA)
+stadhr96j // MCM (c) 1996 Data East Corporation (Japan)
// SemiCom games on Tumble Pop based hardware
metlsavr // (c) 1994 First Amusements
@@ -6767,7 +6790,7 @@ xmen2pj // GX065 (c) 1992 (Japan)
xmen6p // GX065 (c) 1992 (World)
xmen6pu // GX065 (c) 1992 (US)
xexex // GX067 (c) 1991 (World)
-orius // GX067 (c) 1991 (USA)
+orius // GX067 (c) 1991 (USA)
xexexa // GX067 (c) 1991 (Asia)
xexexj // GX067 (c) 1991 (Japan)
asterix // GX068 (c) 1992 (World)
@@ -7526,7 +7549,7 @@ badlandsb // bootleg
badlandsb2 // bootleg set 2
klax // 136075 (c) 1989
klax2 // 136075 (c) 1989
-klax2bl // bootleg
+klax2bl // bootleg
klax3 // 136075 (c) 1989
klaxj // 136075 (c) 1989 (Japan)
klaxd // 136075 (c) 1989 (Germany)
@@ -7664,6 +7687,7 @@ ikaria // A5004 'IW' (c) 1986
ikarinc // A5004 'IW' (c) 1986
ikarijp // A5004 'IW' (c) 1986 (Japan)
ikarijpb // bootleg
+ikariram // bootleg
victroad // A6002 (c) 1986
dogosoke // A6002 (c) 1986
dogosokb // bootleg
@@ -8099,6 +8123,7 @@ kuniokunb // bootleg
xsleena // TA-0019 (c) 1986 + Taito license
xsleenaj // TA-0019 (c) 1986
xsleenab // bootleg
+xsleenaba // bootleg
solrwarr // TA-0019 (c) 1986 + Taito / Memetron license
battlane // -0215, -0216 (Data East part number) (c) 1986 + Taito license
battlane2 // -0215, -0216 (Data East part number) (c) 1986 + Taito license
@@ -8133,6 +8158,7 @@ vball2pjb // bootleg (of Japan set)
ddragon2 // TA-0026 (c) 1988 (World)
ddragon2u // TA-0026 (c) 1988 (US)
ddragon2j // TA-0026 (c) 1988 (Japan)
+ddragon2b // bootleg
toffy // (c) 1993 Midas
stoffy // (c) 1994 Midas
stoffyu // (c) 1994 Midas + Unico
@@ -8217,6 +8243,7 @@ jackrabts // (c) 1984
mouser // UPL-83001 (c) 1983
mouserc // UPL-83001 (c) 1983
nova2001 // UPL-83005 (c) 1983
+nova2001h // hack?
nova2001u // UPL-83005 (c) [1983] + Universal license
ninjakun // UPL-84003 (c) 1984 Taito Corporation
raiders5 // UPL-85004 (c) 1985
@@ -8227,6 +8254,7 @@ xxmissio // UPL-86001 [1986]
ninjakd2 // UPL-????? (c) 1987
ninjakd2a // UPL-????? (c) 1987
ninjakd2b // UPL-????? (c) 1987
+ninjakd2c // UPL-????? (c) 1987
rdaction // UPL-87003?(c) 1987 + World Games license
jt104 // hack?
mnight // UPL-????? (c) 1987 distributed by Kawakus
@@ -8278,17 +8306,17 @@ nouryokup // (c) 1995 Tecmo
arcadian // (c) 1994 NMK
raphero // (c) 1994 Media Trading Corp
-// nmk16.c bootlegs using the Seibu Sound System
+// nmk16.cpp bootlegs using the Seibu Sound System
mustangb // bootleg
mustangb2 // TAB Austria bootleg
tdragonb // bootleg
-// Comad games on unofficial hardware based on nmk16.c
+// Comad games on unofficial hardware based on nmk16.cpp
ssmissin // (c) 1992 Comad
airattck // (c) 1996 Comad
airattcka // (c) 1996 Comad
-// Bee-Oh games on unofficial hardware based on nmk16.c
+// Bee-Oh games on unofficial hardware based on nmk16.cpp
manybloc // (c) 1991 Bee-Oh
// Jaleco Mahjong Games, Similar Hardware to the NMK ones above?
@@ -8809,6 +8837,7 @@ weststry // bootleg
skysmash // (c) 1990 Nihon System Inc.
legionna // (c) 1992 Tad (World)
legionnau // (c) 1992 Tad + Fabtek license (US)
+legionnaj // (c) 1992 Tad (Japan)
heatbrl // (c) 1992 Tad (World version 3)
heatbrl2 // (c) 1992 Tad (World version 2)
heatbrlo // (c) 1992 Tad (World)
@@ -8865,6 +8894,7 @@ f1gpstar // (c) 1991 Jaleco
armchmp2 // (c) 1992 Jaleco
armchmp2o // (c) 1992 Jaleco
wildplt // (c) 1992 Jaleco
+captflag // (c) 1993 Jaleco
f1gpstr2 // (c) 1993 Jaleco
scudhamm // (c) 1994 Jaleco
tetrisp2 // (c) 1997 Jaleco
@@ -9134,8 +9164,8 @@ wrallya // (c) 1993 - Ref 930705
wrallyb // (c) 1993 - Ref 930217
glass // (c) 1993 - Ref 931021
glass10 // (c) 1993 - Ref 931021
-glassbrk // (c) 1993 - Ref 931021 shows "Break Edition" on a real PCB
-glass94 // (c) 1994 - Ref 931021 shows 1994 version, Anime girls, unprotected
+glass10a // (c) 1993 - Ref 931021 shows "Break Edition" on a real PCB
+glasskr // (c) 1994 - Ref 931021 shows 1994 version, Anime girls, unprotected
targeth // (c) 1994 - Ref 940531
targetha // (c) 1994 - Ref 940531
thoop2 // (c) 1994 - Ref ???
@@ -9148,7 +9178,8 @@ touchgon // (c) 1995 - Ref 950906
touchgoe // (c) 1995 - Ref 950510-1
wrally2 // (c) 1995 - Ref 950510
maniacsp // (c) 1996 - Ref 922804/2 - (prototype)
-maniacsq // (c) 1996 - Ref ??? - (unprotected)
+maniacsq // (c) 1996 - Ref 940411 - (unprotected)
+maniacsqa // (c) 1996 - Ref 940411
snowboar // (c) 1996 - Ref 960419/1
snowboara // (c) 1996 - Ref 960419/1
bang // (c) 1998 - Ref ???
@@ -9173,7 +9204,6 @@ smashdrv // (c) 2000
/*
Remaining Gaelco Games:
=======================
- 1999: Rolling Extreme
2000: Football Power
*/
@@ -9234,6 +9264,7 @@ fjbuster // (c) 1992 Kaneko
brapboys // (c) 1992 Kaneko
brapboysj // (c) 1992 Kaneko
brapboysu // (c) 1992 Kaneko
+wingforc // (c) 1993 Atlus (Japan, prototype)
bloodwar // (c) 1994 Kaneko
oedfight // (c) 1994 Kaneko
bonkadv // (c) 1994 Kaneko
@@ -9289,7 +9320,7 @@ mjyuugia // (c) 1990 Visco
ponchin // (c) 1991 Visco
ponchina // (c) 1991 Visco
-// Seta 1st Generation HW (seta.c)
+// Seta 1st Generation HW (seta.cpp)
tndrcade // UA-0 (c) 1987 Taito
tndrcadej // UA-0 (c) 1987 Taito
twineagl // UA-2 (c) 1988 + Taito license
@@ -9358,7 +9389,7 @@ crazyfgt // (c) 1998 Subsino
inttoote // (c) 1998 Coinmaster
inttootea // (c) 1998 Coinmaster
-// Seta 2nd Generation HW (seta2.c)
+// Seta 2nd Generation HW (seta2.cpp)
gundamex // (c) 1994 Banpresto
grdians // (c) 1995 Banpresto
mj4simai // (c) 1996 Maboroshi Ware
@@ -9534,6 +9565,7 @@ sparkman // (c) 1989 SunA
sparkmana // (c) 1989 SunA
starfigh // (c) 1990 SunA
hardhea2 // (c) 1991 SunA
+hardhea2b // bootleg
brickzn // (c) 1992 SunA
brickznv5 // (c) 1992 SunA
brickznv4 // (c) 1992 SunA
@@ -9549,6 +9581,7 @@ go2000 // (c) 2000 SA
gundealr // (c) 1990 Dooyong
gundealra // (c) 1990 Dooyong
gundealrt // (c) 1990 Tecmo
+gundealrbl // bootleg
yamyam // (c) 1990 Dooyong
yamyamk // (c) 1990 Dooyong
wiseguy // (c) 1990 Dooyong
@@ -9607,6 +9640,7 @@ zipzap // (c) 1995 Barko Corp
missw96 // (c) 1996 Comad
missw96a // (c) 1996 Comad
missw96b // (c) 1996 Comad
+missw96c // (c) 1996 Comad
missmw96 // (c) 1996 Comad
smissw //
fantsia2 // (c) 1997 Comad
@@ -9620,7 +9654,7 @@ galhustl // (c) 1997 ACE International
// Playmark games
sslam // (c) 1993 - hack of Namco's Super World Court
sslama // ^
-sslamb // ^
+sslamb // ^
powerbal // (c) 1994
powerbals // (c) 1994
magicstk // (c) 1995
@@ -9670,6 +9704,7 @@ trckydoca // (c) 1987
// Metro games
karatour // (c) 1992 Mitchell
+karatourj // (c) 1992 Mitchell
ladykill // (c) 1993 Yanyaka + Mitchell license - (Arcade TV Game List - P.101, Right, 2 from Bottom)
moegonta // (c) 1993 Yanyaka (Japan) (Arcade TV Game List - P.101, Right, 2 from Bottom)
pangpoms // (c) 1992
@@ -10070,6 +10105,7 @@ drgnwrldv21j // (c) 1995
drgnwrldv20j // (c) 1995
drgnwrldv10c // (c) 1995
drgnwrldv11h // (c) 1995
+drgnwrldv40k
nkishusp // (c) 1998
// IGS017 / IGS031 Games
@@ -10658,6 +10694,7 @@ driblingbr // bootleg
ace // [1976 Allied Leisure]
clayshoo // [1979 Allied Leisure]
pirates // (c) 1994 NIX
+piratesb // bootleg?
genix // (c) 199? NIX
fitfight // bootleg of Art of Fighting
histryma // bootleg of Fighter's History
@@ -10863,6 +10900,7 @@ stuntair // (c) 1983 Nuova Videotron
// Success
tonton // (c) 199? Success / Taiyo Jidoki.
kurukuru // (c) 199? Success / Taiyo Jidoki.
+ppj // (c) 199? Success / Taiyo Jidoki.
othello // (c) 1984 Success.
sothello // (c) 1986 Success / Fujiwara.
kothello // (c) 1990 Success.
@@ -11108,6 +11146,10 @@ photoply
supercrd // (c) 1992 Fun World
fruitstr // (c) 1992 Fun World
+// with 2nd set of hardware on PCB for stealth purposes
+royalcrd_nes
+royalcrd_msx
+
// Sandii'
snookr10 // (c) 1998 Sandii'
apple10 // (c) 1998 Sandii'
@@ -11170,6 +11212,7 @@ sgsafari // (c) 1996 New Impeuropex Corp.
musicsrt // (c) 1995 ABM Games
galaxi // (c) 2000 BRL S.R.L. Bologna
magjoker // (c) 2000 BRL S.R.L. Bologna
+lastfour // (c) 2001 BRL S.R.L. Bologna
dwarfd // (c) 198? Electro-Sports
dwarfda // (c) 198? Electro-Sports
quarterh // (c) 1983 Electro-Sports
@@ -11416,7 +11459,11 @@ comg905d // (c) 198? Cal Omega Inc.
// IGT Player's Edge Plus
peset001 // (c) 1987 IGT - International Game Technology
peset004 // (c) 1987 IGT - International Game Technology
+peset012 // (c) 1987 IGT - International Game Technology
+peset022 // (c) 1987 IGT - International Game Technology
peset038 // (c) 1987 IGT - International Game Technology
+peset100 // (c) 1987 IGT - International Game Technology
+peset117 // (c) 1987 IGT - International Game Technology
peivc006 // (c) 1987 IGT - International Game Technology
pepk0719 // (c) 1987 IGT - International Game Technology
pepk0719a // (c) 1987 IGT - International Game Technology
@@ -11729,7 +11776,14 @@ pex0055po // (c) 1995 IGT - International Game Technology
pex0055pp // (c) 1995 IGT - International Game Technology
pex0055pq // (c) 1995 IGT - International Game Technology
pex0055pr // (c) 1995 IGT - International Game Technology
+pex0055ps // (c) 1995 IGT - International Game Technology
+pex0055pt // (c) 1995 IGT - International Game Technology
pex0057p // (c) 1995 IGT - International Game Technology
+pex0057pa // (c) 1995 IGT - International Game Technology
+pex0057pb // (c) 1995 IGT - International Game Technology
+pex0057pc // (c) 1995 IGT - International Game Technology
+pex0057pd // (c) 1995 IGT - International Game Technology
+pex0057pe // (c) 1995 IGT - International Game Technology
pex0060p // (c) 1995 IGT - International Game Technology
pex0124p // (c) 1995 IGT - International Game Technology
pex0150p // (c) 1995 IGT - International Game Technology
@@ -11835,6 +11889,7 @@ pex2283p // (c) 1995 IGT - International Game Technology
pex2284p // (c) 1995 IGT - International Game Technology
pex2287p // (c) 1995 IGT - International Game Technology
pex2297p // (c) 1995 IGT - International Game Technology
+pex2297pa // (c) 1995 IGT - International Game Technology
pex2302p // (c) 1995 IGT - International Game Technology
pex2303p // (c) 1995 IGT - International Game Technology
pex2306p // (c) 1995 IGT - International Game Technology
@@ -11843,6 +11898,7 @@ pex2308p // (c) 1995 IGT - International Game Technology
pex2310p // (c) 1995 IGT - International Game Technology
pex2312p // (c) 1995 IGT - International Game Technology
pex2314p // (c) 1995 IGT - International Game Technology
+pex2315p // (c) 1995 IGT - International Game Technology
pex2374p // (c) 1995 IGT - International Game Technology
pex2376p // (c) 1995 IGT - International Game Technology
pex2377p // (c) 1995 IGT - International Game Technology
@@ -11867,6 +11923,7 @@ pekoc804 // (c) 1997 IGT - International Game Technology
pekoc806 // (c) 1997 IGT - International Game Technology
pekoc818 // (c) 1997 IGT - International Game Technology
pekoc819 // (c) 1997 IGT - International Game Technology
+pekoc822 // (c) 1997 IGT - International Game Technology
pekoc825 // (c) 1997 IGT - International Game Technology
pex0006k // (c) 1997 IGT - International Game Technology
pex0013k // (c) 1997 IGT - International Game Technology
@@ -11876,6 +11933,7 @@ pex0998s // (c) 1997 IGT - International Game Technology
pex1087s // (c) 1997 IGT - International Game Technology
pexm001p // (c) 1997 IGT - International Game Technology
pexm002p // (c) 1997 IGT - International Game Technology
+pexm002pa // (c) 1997 IGT - International Game Technology
pexm003p // (c) 1997 IGT - International Game Technology
pexm004p // (c) 1997 IGT - International Game Technology
pexm005p // (c) 1997 IGT - International Game Technology
@@ -11889,10 +11947,21 @@ pexmp013 // (c) 1997 IGT - International Game Technology
pexmp017 // (c) 1997 IGT - International Game Technology
pexmp017a // (c) 1997 IGT - International Game Technology
pexmp017b // (c) 1997 IGT - International Game Technology
+pexmp022 // (c) 1997 IGT - International Game Technology
pexmp026 // (c) 1997 IGT - International Game Technology
pexmp030 // (c) 1997 IGT - International Game Technology
pexmp030a // (c) 1997 IGT - International Game Technology
+// IGT Game King
+gkigt4
+gkigt4ms
+gkigt43
+gkigt43n
+gkigtez
+gkigt5p
+igtsc
+gkkey
+
elgrande // (c) 1982 Tuni Electro Service / E.T. Marketing
jjpoker // (c) 1983 Enter-Tech
jjpokerb // (c) 1983 Enter-Tech
@@ -11965,24 +12034,72 @@ paclandp // (c) 1989 Namco
ggconnie // (c) ???? Capcom
paranoia // (c) 1990 Naxat Soft
tourvis // (c) ???? Tourvision
+tvdrgnst // (c) 1988 Namcot (Tourvision bootleg)
tvlegaxe // (c) 1988 Victor Musical Industries, Inc. (Tourvision bootleg)
tvflaptw // (c) 1989 Namco (Tourvision bootleg)
+tvdensho // (c) 1989 Big Club / Wolf Team (Tourvision bootleg)
+tvshnobi // (c) 1989 Sega / Asmik Corporation (Tourvision bootleg)
+tvsdarms // (c) 1989 Capcom / Nec Avenue (Tourvision bootleg)
+tvsson2 // (c) 1989 Capcom / Nec Avenue (Tourvision bootleg)
+tvgunhed // (c) 1989 Hudson / Toho Sunrise (Tourvision bootleg)
+tvmrheli // (c) 1989 IREM Corp (Tourvision bootleg)
tvusapb // (c) 1989 Aicom (Tourvision bootleg)
tvvolfd // (c) 1989 Taito (Tourvision bootleg)
+tvdormon // (c) 1989 Hudson / Fujiko-Shogakukan-TV Asahi (Tourvision bootleg)
tvdunexp // (c) 1989 Hudson / Atlus (Tourvision bootleg)
+tvwnshot // (c) 1989 Data East Corp. (Tourvision bootleg)
tvablast // (c) 1990 Hudson / Kaneko (Tourvision bootleg)
+tvaburn // (c) 1990 Sega / Nec Avenue (Tourvision bootleg)
+tvarmedf // (c) 1990 Nichibutsu / Big Don (Tourvision bootleg)
+tvbeball // (c) 1990 Hudson (Tourvision bootleg)
+tvbomber // (c) 1990 Hudson (Tourvision bootleg)
+tvdsenpu // (c) 1990 Toaplan / Nec Avenue (Tourvision bootleg)
+tvdevilc // (c) 1990 Naxat / Red (Tourvision bootleg)
+tvdodgeb // (c) 1990 Technos Japan Corp / Naxat Soft (Tourvision bootleg)
+tvfblast // (c) 1990 Namco / Namcot (Tourvision bootleg)
+tvbrabho // (c) 1990 Namco / Namcot (Tourvision bootleg)
tvfsoc90 // (c) 1990 Human (Tourvision bootleg)
tvgomola // (c) 1990 Human (Tourvision bootleg)
+tvkaikai // (c) 1990 Taito (Tourvision bootleg)
tvsssold // (c) 1990 Hudson / Kaneko (Tourvision bootleg)
tvthbld // (c) 1990 Sega / NEC Avenue (Tourvision bootleg)
tvrs2 // (c) 1990 Taito (Tourvision bootleg)
+tvninjas // (c) 1990 IREM Corp (Tourvision bootleg)
+tvopwolf // (c) 1990 Taito / Nec Avenue (Tourvision bootleg)
+tvovride // (c) 1990 Sting / Data East Corporation (Tourvision bootleg)
+tvpchasr // (c) 1990 Naxat Soft (Tourvision bootleg)
+tvsvball // (c) 1990 Video System (Tourvision bootleg)
+tvtsboys // (c) 1990 Victor Musical Industries, Inc. (Tourvision bootleg)
+tveigues // (c) 1990 Victor Musical Industries, Inc. (Tourvision bootleg)
+tvwring // (c) 1990 Naxat Soft (Tourvision bootleg)
+tvxvious // (c) 1990 Namco Ltd. / Namcot (Tourvision bootleg)
+tv1943 // (c) 1991 Capcom / Nexat Soft (Tourvision bootleg)
+tvbalstx // (c) 1991 Psygnosis / Coconuts Japan (Tourvision bootleg)
tvcolumn // (c) 1991 Telenet Japan (Tourvision bootleg)
+tvcoryon // (c) 1991 Naxat Soft (Tourvision bootleg)
+tvdmoon // (c) 1991 T.S.S. (Tourvision bootleg)
+tvftenis // (c) 1991 Human (Tourvision bootleg)
+tvhtdaka // (c) 1991 Taito(Tourvision bootleg)
+tvtonma // (c) 1991 IREM Corp (Tourvision bootleg)
tvjchan // (c) 1991 Hudson (Tourvision bootleg)
-tvpcgen2 // (c) 1991 Hudson (Tourvision bootleg)
+tvpcgen2 // (c) 1991 Hudson Soft / Red (Tourvision bootleg)
+tvpaclnd // (c) 1991 Namco / Namcot (Tourvision bootleg)
+tvpdrift // (c) 1991 Sega / Asmik Corporation (Tourvision bootleg)
+tvpros91 // (c) 1991 Namco / Namcot (Tourvision bootleg)
tvpow11 // (c) 1991 Hudson (Tourvision bootleg)
tvpwlg4 // (c) 1991 Hudson (Tourvision bootleg)
+tvpzlboy // (c) 1991 Atlus / Telenet Japan (Tourvision bootleg)
+tvraiden // (c) 1991 Seibu Kaihatsu inc / Hudson Soft (Tourvision bootleg)
+tvrtype2 // (c) 1991 IREM (Tourvision bootleg)
+tvslmndr // (c) 1991 Konami (Tourvision bootleg)
tvsci // (c) 1991 Taito (Tourvision bootleg)
-tvsvball // (c) 1990 Video System (Tourvision bootleg)
+tvskweek // (c) 1991 Victor Musical Industries, Inc. (Tourvision bootleg)
+tvtaisen // (c) 1992 Taito (Tourvision bootleg)
+tvlqkids // (c) 1992 Taito (Tourvision bootleg)
+tvninjar // (c) 1992 Tecmo / Hudson Soft (Tourvision bootleg)
+tvpcybrg // (c) 1992 Hudson Soft / Red (Tourvision bootleg)
+tvtsujin // (c) 1992 Toaplan Co Ltd / Taito Corporation (Tourvision bootleg)
+tvtcrst2 // (c) 1992 Nichibutsu / Nihon Bussan Co., Ltd (Tourvision bootleg)
vcombat // (c) 1993 VR8 Inc.
shadfgtr // (c) 1993 DUTECH Inc.
skimaxx // (c) 1996 Kyle Hodgetts/ICE
@@ -12014,7 +12131,7 @@ ichiban // (c) 199? Excel
3x3puzzla // (c) 199? Ace
gambl186 // unknown
gambl186a // unknown
-gambl186b // unknown
+gambl186b // unknown
// InterFlip / Recreativos Franco
videopkr // (c) 1984 InterFlip
@@ -12074,6 +12191,7 @@ cfever1k // (c) 2000 High Video
girotutt // (c) 2000 High Video
nyjoker //
grancapi // (c) 2000 High Video
+galeone
magicbom // (c) 2000 High Video
// Sure games
@@ -13341,6 +13459,7 @@ tmspoker
kas89 // 1989, SFC S.R.L.
caspoker // 1987, PM / Beck Elektronik.
wildpkr // 199?, TAB Austria.
+tabpkr // 199?, TAB Austira
subhuntr // 1979 Model Racing
manohman // 199?, Merkur.
@@ -13417,6 +13536,7 @@ take5 // (c) 1975 Fun Games
bazooka // (c) 1976 PSE
bazookabr // (c) 1977 Taito do Brasil
dpatrol // (c) 1977 PSE
+dpatrola // (c) 1977 PSE / Telegames
//gametree // (c) 1978 PSE
vollyrmt // (c) 1973 Ramtek
hockyrmt // (c) 1973 Ramtek
@@ -30651,7 +30771,7 @@ spss4240
/* [BEGIN] pinball drivers */
-// allied.c
+// allied.cpp
allied
suprpick
royclark
@@ -30665,7 +30785,7 @@ erosone
circa33
starshot
-// alvg.c
+// alvg.cpp
agsoccer
@@ -30697,7 +30817,7 @@ fourx4
*/
roadrunr
-// bingo.c
+// bingo.cpp
cntinntl
goldgame
goldgkitb
@@ -30851,7 +30971,7 @@ babypac
babypac2
granny
-// by68701.c
+// by68701.cpp
flashgdnp1
flashgdnp2
eballdlxp1
@@ -30859,7 +30979,7 @@ eballdlxp2
eballdlxp3
eballdlxp4
-// capcom.c
+// capcom.cpp
abv106
abv106r
bbb109
@@ -30876,12 +30996,12 @@ pmv112r
ghv101
-// de_1.c
+// de_1.cpp
lwar_a83
lwar_e90
-// de_2.c
+// de_2.cpp
mnfb_c27
poto_a32
play_a24
@@ -30893,7 +31013,7 @@ tmac_a18
torp_e21
-// de_3.c
+// de_3.cpp
rab_320
rab_130
rab_103
@@ -30948,7 +31068,7 @@ wwfr_106
wwfr_103
-// de_3b.c
+// de_3b.cpp
batmanf
batmanf3
bmf_uk
@@ -30977,16 +31097,16 @@ detest
ctcheese
-// flicker.c
+// flicker.cpp
flicker
-// g627.c
+// g627.cpp
rotation
rota_115
rota_101
-// gp_1.c
+// gp_1.cpp
gp_110
blvelvet
camlight
@@ -30998,7 +31118,7 @@ rio
startrip
-// gp_2.c
+// gp_2.cpp
agent777
andromep
andromepa
@@ -31017,7 +31137,7 @@ suprnova
vegasgp
-// gts1.c
+// gts1.cpp
gts1
gts1s
astannie
@@ -31041,7 +31161,7 @@ hexagone
sys1test
-// gts3.c
+// gts3.cpp
barbwire
bellring
brooks
@@ -31095,7 +31215,7 @@ snspares
snspares1
-// gts80.c
+// gts80.cpp
blckhole
blckhole2
blckhols
@@ -31119,7 +31239,7 @@ vlcno_1a
s80tst
-// gts80a.c
+// gts80a.cpp
alienstr
amazonh
caveman
@@ -31144,7 +31264,7 @@ thegames
touchdn
-// gts80b.c
+// gts80b.cpp
arena
badgirls
bighouse
@@ -31172,7 +31292,7 @@ txsector
victoryp
-// hankin.c
+// hankin.cpp
fjholden
howzat
orbit1
@@ -31180,11 +31300,11 @@ shark
empsback
-// icecold.c
+// icecold.cpp
icecold
zekepeak
-// inder.c
+// inder.cpp
ind250cc
atleta
brvteam
@@ -31196,11 +31316,11 @@ pinmoonl
lapbylap
metalman
-// jeutel.c
+// jeutel.cpp
leking
olympic
-// jp.c
+// jp.cpp
america
aqualand
faeton
@@ -31213,12 +31333,12 @@ halleya
olympus
-// jvh.c
+// jvh.cpp
escape
movmastr
-// ltd.c
+// ltd.cpp
alcapone
atla_ltd
bhol_ltd
@@ -31227,15 +31347,15 @@ cowboy
pecmen
zephy
-// micropin.c
+// micropin.cpp
pentacup
pentacup2
-// mephisto.c
+// mephisto.cpp
mephistp
mephistp1
-// mrgame.c
+// mrgame.cpp
dakar
motrshow
motrshowa
@@ -31243,11 +31363,11 @@ macattck
wcup90
-// nsm.c
+// nsm.cpp
firebird
-// peyper.c
+// peyper.cpp
odisea
wolfman
odin
@@ -31259,7 +31379,7 @@ gamatros
nemesisp
sonstwr2
-// play_1.c
+// play_1.cpp
bigtown
chance
lastlap
@@ -31267,7 +31387,7 @@ spcgambl
party
-// play_2.c
+// play_2.cpp
antar
antar2
evlfight
@@ -31278,12 +31398,12 @@ madrace
zira
-// play_3.c
+// play_3.cpp
megaaton
megaatona
-// play_5.c
+// play_5.cpp
spain82
nautilus
theraid
@@ -31296,11 +31416,11 @@ trailer
fldragon
sklflite
-// rowamet.c
+// rowamet.cpp
heavymtl
-// s11.c
+// s11.cpp
gmine_l2
grand_l4
hs_l4
@@ -31315,7 +31435,7 @@ tts_l2
tts_l1
-// s11a.c
+// s11a.cpp
f14_l1
f14_p3
f14_p4
@@ -31328,7 +31448,7 @@ pb_l3
pb_p4
-// s11b.c
+// s11b.cpp
bcats_l5
bcats_l2
bnzai_l3
@@ -31378,7 +31498,7 @@ whirl_l2
whirl_lg3
-// s11c.c
+// s11c.cpp
bbnny_l2
bbnny_lu
diner_l4
@@ -31406,7 +31526,7 @@ gs_l4
strax_p7
-// s3.c
+// s3.cpp
httip_l1
lucky_l1
wldcp_l1
@@ -31414,7 +31534,7 @@ cntct_l1
disco_l1
-// s4.c
+// s4.cpp
flash_l1
flash_l2
flash_t1
@@ -31431,7 +31551,7 @@ bstrk_l1
tstrk_l1
-// s6.c
+// s6.cpp
blkou_l1
blkou_t1
blkou_f1
@@ -31450,14 +31570,14 @@ trizn_l1
trizn_t1
-// s6a.c
+// s6a.cpp
algar_l1
alpok_l6
alpok_l2
alpok_f6
-// s7.c
+// s7.cpp
vrkon_l1
barra_l1
bk_l4
@@ -31484,13 +31604,13 @@ thund_p3
ratrc_l1
-// s8.c
+// s8.cpp
pfevr_l2
pfevr_p3
scrzy_l1
-// s9.c
+// s9.cpp
comet_l4
comet_l5
sorcr_l1
@@ -31500,7 +31620,7 @@ alcat_l7
szone_l5
szone_l2
-// sam.c
+// sam.cpp
24_130
24_140
@@ -31701,15 +31821,15 @@ wpt_1400gf
wpt_1400i
wpt_1400l
-// sleic.c
+// sleic.cpp
sleicpin
-// spectra.c
+// spectra.cpp
spectra
-// spinb.c
+// spinb.cpp
bushido
bushidoa
jolypark
@@ -31717,7 +31837,7 @@ mach2
vrnwrld
-// st_mp100.c
+// st_mp100.cpp
princess
dracula
hothand
@@ -31732,7 +31852,7 @@ trident
wildfyre
-// st_mp200.c
+// st_mp200.cpp
ali
biggame
catacomp
@@ -31758,7 +31878,7 @@ blkshpsq
st_game
-// taito.c
+// taito.cpp
taitest
cavnegro
cavnegro1
@@ -31798,17 +31918,17 @@ zarza1
mrblkz80
-// techno.c
+// techno.cpp
xforce
-// vd.c
+// vd.cpp
//ator - missing most of rom
break86
papillon
-// whitestar.c
+// whitestar.cpp
apollo13
apollo13_10
aust301
@@ -31991,7 +32111,7 @@ monopred
wackadoo
-// white_mod.c
+// white_mod.cpp
elvisp
elvisp4
elvisp303
@@ -32146,11 +32266,11 @@ sopranoi_300
sopranoi_107
-// wico.c
+// wico.cpp
aftor
-// wpc_95.c
+// wpc_95.cpp
tf95_12
afm_113
afm_113b
@@ -32215,7 +32335,7 @@ cp_15
ttt_10
-// wpc_an.c
+// wpc_an.cpp
tfa_13
dd_p7
dd_p06
@@ -32235,7 +32355,7 @@ bop_l3
bop_l2
-// wpc_dcs.c
+// wpc_dcs.cpp
dm_lx4
dm_pa2
dm_px5
@@ -32270,7 +32390,7 @@ sttng_l3
afv_l4
-// wpc_dot.c
+// wpc_dot.cpp
tfdmd_l3
gi_l9
gi_l3
@@ -32291,7 +32411,7 @@ t2_l3
t2_l2
-// wpc_flip1.c
+// wpc_flip1.cpp
taf_l5
taf_p2
taf_l1
@@ -32303,7 +32423,7 @@ taf_l6
taf_h4
-// wpc_flip2.c
+// wpc_flip2.cpp
br_l4
br_p17
br_l1
@@ -32355,7 +32475,7 @@ strik_l4
lc_11
-// wpc_s.c
+// wpc_s.cpp
corv_21
corv_px4
corv_lx1
@@ -32415,7 +32535,7 @@ wcs_p3
tfs_12
-// zac_1.c
+// zac_1.cpp
ewf
firemntn
futurwld
@@ -32429,7 +32549,7 @@ stargoda
wsports
-// zac_2.c
+// zac_2.cpp
bbeltzac
clown
dvlrider
@@ -32470,7 +32590,7 @@ tmachzacf
zankor
-// zac_proto.c
+// zac_proto.cpp
skijump
spacecty
strike
@@ -32512,6 +32632,8 @@ arac6000
number1 // 1996 San Remo Games
gluck2 // 1992 Yung Yu / CYE
+sanremmg // San Remo / Elsy
+
// Valco fireball
fireball
@@ -32555,3 +32677,6 @@ ribrac // Lazer-tron Ribbit Racing
age_cand // AGE Candy Crane
clowndwn // Elwood Clown Roll Down
+
+fi6845
+fi8275
diff --git a/src/mame/audio/8080bw.cpp b/src/mame/audio/8080bw.cpp
index e9586acff61..41fd7160765 100644
--- a/src/mame/audio/8080bw.cpp
+++ b/src/mame/audio/8080bw.cpp
@@ -719,7 +719,7 @@ WRITE8_MEMBER(_8080bw_state::polaris_sh_port_2_w)
WRITE8_MEMBER(_8080bw_state::polaris_sh_port_3_w)
{
- coin_lockout_global_w(machine(), data & 0x04); /* SX8 */
+ machine().bookkeeping().coin_lockout_global_w(data & 0x04); /* SX8 */
m_flip_screen = BIT(data, 5) & BIT(ioport("IN2")->read(), 2); /* SX11 */
@@ -925,7 +925,7 @@ WRITE8_MEMBER(_8080bw_state::schaser_sh_port_2_w)
m_discrete->write(space, SCHASER_SND_EN, BIT(data, 1));
machine().sound().system_enable(BIT(data, 1));
- coin_lockout_global_w(machine(), BIT(data, 2));
+ machine().bookkeeping().coin_lockout_global_w(BIT(data, 2));
m_schaser_background_disable = BIT(data, 3);
m_schaser_background_select = BIT(data, 4);
@@ -1082,7 +1082,7 @@ WRITE8_MEMBER(_8080bw_state::lupin3_sh_port_1_w)
//machine().sound().system_enable(data & 0x20);
- //coin_lockout_global_w(machine(), data & 0x80);
+ //machine().bookkeeping().coin_lockout_global_w(data & 0x80);
m_port_1_last_extra = data;
}
diff --git a/src/mame/audio/asteroid.cpp b/src/mame/audio/asteroid.cpp
index 6593f3fd775..43900205d88 100644
--- a/src/mame/audio/asteroid.cpp
+++ b/src/mame/audio/asteroid.cpp
@@ -1,5 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders:Brad Oliver, Bernd Wiebelt, Allard van der Bas
+// copyright-holders:K.Wilkins
/*****************************************************************************
*
* Asteroids Analog Sound system interface
diff --git a/src/mame/audio/atarifb.cpp b/src/mame/audio/atarifb.cpp
index dded6d9a2da..e58c9cbbd24 100644
--- a/src/mame/audio/atarifb.cpp
+++ b/src/mame/audio/atarifb.cpp
@@ -1,5 +1,5 @@
-// license:???
-// copyright-holders:Derrick Renaud
+// license:BSD-3-Clause
+// copyright-holders:Derrick Renaud
/*************************************************************************
audio\atarifb.c
diff --git a/src/mame/audio/atarijsa.cpp b/src/mame/audio/atarijsa.cpp
index 99fe02bbdb3..6b9781c9e49 100644
--- a/src/mame/audio/atarijsa.cpp
+++ b/src/mame/audio/atarijsa.cpp
@@ -483,8 +483,8 @@ WRITE8_MEMBER( atari_jsa_oki_base_device::wrio_w )
m_cpu_bank->set_entry((data >> 6) & 3);
// coin counters
- coin_counter_w(space.machine(), 1, (data >> 5) & 1);
- coin_counter_w(space.machine(), 0, (data >> 4) & 1);
+ space.machine().bookkeeping().coin_counter_w(1, (data >> 5) & 1);
+ space.machine().bookkeeping().coin_counter_w(0, (data >> 4) & 1);
// update the OKI frequency
if (m_oki1 != nullptr)
@@ -687,8 +687,8 @@ WRITE8_MEMBER( atari_jsa_i_device::wrio_w )
m_cpu_bank->set_entry((data >> 6) & 3);
// coin counters
- coin_counter_w(machine(), 1, (data >> 5) & 1);
- coin_counter_w(machine(), 0, (data >> 4) & 1);
+ machine().bookkeeping().coin_counter_w(1, (data >> 5) & 1);
+ machine().bookkeeping().coin_counter_w(0, (data >> 4) & 1);
// handle TMS5220 I/O
if (m_tms5220 != nullptr)
diff --git a/src/mame/audio/bzone.cpp b/src/mame/audio/bzone.cpp
index 26bd5321a67..daf378e8577 100644
--- a/src/mame/audio/bzone.cpp
+++ b/src/mame/audio/bzone.cpp
@@ -389,7 +389,7 @@ WRITE8_MEMBER(bzone_state::bzone_sounds_w)
{
m_discrete->write(space, BZ_INPUT, data);
- output_set_value("startled", (data >> 6) & 1);
+ output().set_value("startled", (data >> 6) & 1);
machine().sound().system_enable(data & 0x20);
}
diff --git a/src/mame/audio/carnival.cpp b/src/mame/audio/carnival.cpp
index 2dd3cc3acb0..0fde41c2967 100644
--- a/src/mame/audio/carnival.cpp
+++ b/src/mame/audio/carnival.cpp
@@ -1,79 +1,28 @@
-// license:???
-// copyright-holders:Peter J.C.Clare
-/*****************************************************************************/
-/* */
-/* (C) Copyright Peter J.C.Clare */
-/* */
-/*****************************************************************************/
-/* */
-/* */
-/* Module name: carnival.c */
-/* */
-/* Creation date: 15/03/98 Revision date: 09/01/99 */
-/* */
-/* Produced by: Peter J.C.Clare */
-/* */
-/* */
-/* Abstract: */
-/* */
-/* MAME sound & music driver for Sega/Gremlin Carnival. */
-/* */
-/*****************************************************************************/
-/* */
-/* Acknowledgements: */
-/* */
-/* Mike Coates, for the original Carnival MAME sound driver. */
-/* Virtu-Al, for the sound samples & hardware information. */
-/* The MAME Team, for the emulator framework. */
-/* */
-/*****************************************************************************/
-/* */
-/* Revision history */
-/* ================ */
-/* */
-/* Date Vsn. Initials Description */
-/* ~~~~ ~~~~ ~~~~~~~~ ~~~~~~~~~~~ */
-/* 03/20/2007 1.1 ZV Moved structures from driver to make */
-/* file more self contained. */
-/* */
-/*****************************************************************************/
+// license:BSD-3-Clause
+// copyright-holders:Zsolt Vasvari, hap
+/*
+ * Carnival audio routines
+ */
#include "emu.h"
#include "includes/vicdual.h"
-#define PSG_CLOCK (3579545 / 3) /* Hz */
-
-
/* output port 0x01 definitions - sound effect drive outputs */
-#define OUT_PORT_1_RIFLE_SHOT 0x01
+#define OUT_PORT_1_RIFLE 0x01
#define OUT_PORT_1_CLANG 0x02
-#define OUT_PORT_1_DUCK_1 0x04
-#define OUT_PORT_1_DUCK_2 0x08
-#define OUT_PORT_1_DUCK_3 0x10
-#define OUT_PORT_1_PIPE_HIT 0x20
-#define OUT_PORT_1_BONUS_1 0x40
-#define OUT_PORT_1_BONUS_2 0x80
-
+#define OUT_PORT_1_DUCK1 0x04
+#define OUT_PORT_1_DUCK2 0x08
+#define OUT_PORT_1_DUCK3 0x10
+#define OUT_PORT_1_PIPEHIT 0x20
+#define OUT_PORT_1_BONUS1 0x40
+#define OUT_PORT_1_BONUS2 0x80
/* output port 0x02 definitions - sound effect drive outputs */
#define OUT_PORT_2_BEAR 0x04
-#define OUT_PORT_2_MUSIC_T1 0x08
-#define OUT_PORT_2_MUSIC_RESET 0x10
#define OUT_PORT_2_RANKING 0x20
-/* music CPU port definitions */
-#define MUSIC_PORT2_PSG_BDIR 0x40 /* bit 6 on P2 */
-#define MUSIC_PORT2_PSG_BC1 0x80 /* bit 7 on P2 */
-
-
-#define PSG_BC_INACTIVE 0
-#define PSG_BC_READ MUSIC_PORT2_PSG_BC1
-#define PSG_BC_WRITE MUSIC_PORT2_PSG_BDIR
-#define PSG_BC_LATCH_ADDRESS ( MUSIC_PORT2_PSG_BDIR | MUSIC_PORT2_PSG_BC1 )
-
-
#define PLAY(samp,id,loop) samp->start( id, id, loop )
#define STOP(samp,id) samp->stop( id )
@@ -95,49 +44,38 @@ static const char *const carnival_sample_names[] =
nullptr
};
+
/* sample IDs - must match sample file name table above */
enum
{
SND_BEAR = 0,
- SND_BONUS_1,
- SND_BONUS_2,
+ SND_BONUS1,
+ SND_BONUS2,
SND_CLANG,
- SND_DUCK_1,
- SND_DUCK_2,
- SND_DUCK_3,
- SND_PIPE_HIT,
+ SND_DUCK1,
+ SND_DUCK2,
+ SND_DUCK3,
+ SND_PIPEHIT,
SND_RANKING,
- SND_RIFLE_SHOT
+ SND_RIFLE
};
+
WRITE8_MEMBER( vicdual_state::carnival_audio_1_w )
{
- static int port1State = 0;
int bitsChanged;
int bitsGoneHigh;
int bitsGoneLow;
-
- /* U64 74LS374 8 bit latch */
-
- /* bit 0: connector pin 36 - rifle shot */
- /* bit 1: connector pin 35 - clang */
- /* bit 2: connector pin 33 - duck #1 */
- /* bit 3: connector pin 34 - duck #2 */
- /* bit 4: connector pin 32 - duck #3 */
- /* bit 5: connector pin 31 - pipe hit */
- /* bit 6: connector pin 30 - bonus #1 */
- /* bit 7: connector pin 29 - bonus #2 */
-
- bitsChanged = port1State ^ data;
+ bitsChanged = m_port1State ^ data;
bitsGoneHigh = bitsChanged & data;
bitsGoneLow = bitsChanged & ~data;
- port1State = data;
+ m_port1State = data;
- if ( bitsGoneLow & OUT_PORT_1_RIFLE_SHOT )
+ if ( bitsGoneLow & OUT_PORT_1_RIFLE )
{
- PLAY( m_samples, SND_RIFLE_SHOT, 0 );
+ PLAY( m_samples, SND_RIFLE, 0 );
}
if ( bitsGoneLow & OUT_PORT_1_CLANG )
@@ -145,46 +83,46 @@ WRITE8_MEMBER( vicdual_state::carnival_audio_1_w )
PLAY( m_samples, SND_CLANG, 0 );
}
- if ( bitsGoneLow & OUT_PORT_1_DUCK_1 )
+ if ( bitsGoneLow & OUT_PORT_1_DUCK1 )
{
- PLAY( m_samples, SND_DUCK_1, 1 );
+ PLAY( m_samples, SND_DUCK1, 1 );
}
- if ( bitsGoneHigh & OUT_PORT_1_DUCK_1 )
+ if ( bitsGoneHigh & OUT_PORT_1_DUCK1 )
{
- STOP( m_samples, SND_DUCK_1 );
+ STOP( m_samples, SND_DUCK1 );
}
- if ( bitsGoneLow & OUT_PORT_1_DUCK_2 )
+ if ( bitsGoneLow & OUT_PORT_1_DUCK2 )
{
- PLAY( m_samples, SND_DUCK_2, 1 );
+ PLAY( m_samples, SND_DUCK2, 1 );
}
- if ( bitsGoneHigh & OUT_PORT_1_DUCK_2 )
+ if ( bitsGoneHigh & OUT_PORT_1_DUCK2 )
{
- STOP( m_samples, SND_DUCK_2 );
+ STOP( m_samples, SND_DUCK2 );
}
- if ( bitsGoneLow & OUT_PORT_1_DUCK_3 )
+ if ( bitsGoneLow & OUT_PORT_1_DUCK3 )
{
- PLAY( m_samples, SND_DUCK_3, 1 );
+ PLAY( m_samples, SND_DUCK3, 1 );
}
- if ( bitsGoneHigh & OUT_PORT_1_DUCK_3 )
+ if ( bitsGoneHigh & OUT_PORT_1_DUCK3 )
{
- STOP( m_samples, SND_DUCK_3 );
+ STOP( m_samples, SND_DUCK3 );
}
- if ( bitsGoneLow & OUT_PORT_1_PIPE_HIT )
+ if ( bitsGoneLow & OUT_PORT_1_PIPEHIT )
{
- PLAY( m_samples, SND_PIPE_HIT, 0 );
+ PLAY( m_samples, SND_PIPEHIT, 0 );
}
- if ( bitsGoneLow & OUT_PORT_1_BONUS_1 )
+ if ( bitsGoneLow & OUT_PORT_1_BONUS1 )
{
- PLAY( m_samples, SND_BONUS_1, 0 );
+ PLAY( m_samples, SND_BONUS1, 0 );
}
- if ( bitsGoneLow & OUT_PORT_1_BONUS_2 )
+ if ( bitsGoneLow & OUT_PORT_1_BONUS2 )
{
- PLAY( m_samples, SND_BONUS_2, 0 );
+ PLAY( m_samples, SND_BONUS2, 0 );
}
}
@@ -192,106 +130,91 @@ WRITE8_MEMBER( vicdual_state::carnival_audio_1_w )
WRITE8_MEMBER( vicdual_state::carnival_audio_2_w )
{
int bitsChanged;
- int bitsGoneHigh;
+ //int bitsGoneHigh;
int bitsGoneLow;
- /* U63 74LS374 8 bit latch */
-
- /* bit 0: connector pin 48 */
- /* bit 1: connector pin 47 */
- /* bit 2: connector pin 45 - bear */
- /* bit 3: connector pin 46 - Music !T1 input */
- /* bit 4: connector pin 44 - Music reset */
- /* bit 5: connector pin 43 - ranking */
- /* bit 6: connector pin 42 */
- /* bit 7: connector pin 41 */
-
bitsChanged = m_port2State ^ data;
- bitsGoneHigh = bitsChanged & data;
+ //bitsGoneHigh = bitsChanged & data;
bitsGoneLow = bitsChanged & ~data;
m_port2State = data;
if ( bitsGoneLow & OUT_PORT_2_BEAR )
+ {
PLAY( m_samples, SND_BEAR, 0 );
+ }
if ( bitsGoneLow & OUT_PORT_2_RANKING )
+ {
PLAY( m_samples, SND_RANKING, 0 );
+ }
- if ( bitsGoneHigh & OUT_PORT_2_MUSIC_RESET )
- /* reset output is no longer asserted active low */
- m_audiocpu->set_input_line(INPUT_LINE_RESET, PULSE_LINE );
+ // d4: music board MCU reset
+ m_audiocpu->set_input_line(INPUT_LINE_RESET, (data & 0x10) ? CLEAR_LINE : ASSERT_LINE);
}
-READ8_MEMBER( vicdual_state::carnival_music_port_t1_r )
+/* Music board */
+
+void vicdual_state::carnival_psg_latch(address_space &space)
{
- /* note: 8039 T1 signal is inverted on music board */
- return ( m_port2State & OUT_PORT_2_MUSIC_T1 ) ? 0 : 1;
+ if (m_psgBus & 1)
+ {
+ // BDIR W, BC1 selects address or data
+ if (m_psgBus & 2)
+ m_psg->address_w(space, 0, m_psgData);
+ else
+ m_psg->data_w(space, 0, m_psgData);
+ }
}
-
WRITE8_MEMBER( vicdual_state::carnival_music_port_1_w )
{
+ // P1: ay8912 d0-d7
m_psgData = data;
+ carnival_psg_latch(space);
}
-
WRITE8_MEMBER( vicdual_state::carnival_music_port_2_w )
{
- static int psgSelect = 0;
- int newSelect;
-
- newSelect = data & ( MUSIC_PORT2_PSG_BDIR | MUSIC_PORT2_PSG_BC1 );
- if ( psgSelect != newSelect )
- {
- psgSelect = newSelect;
-
- switch ( psgSelect )
- {
- case PSG_BC_INACTIVE:
- /* do nowt */
- break;
-
- case PSG_BC_READ:
- /* not very sensible for a write */
- break;
+ // P2 d6: AY8912 BDIR(R/W)
+ // P2 d7: AY8912 BC1
+ m_psgBus = data >> 6 & 3;
+ carnival_psg_latch(space);
+}
- case PSG_BC_WRITE:
- m_psg->data_w(space, 0, m_psgData);
- break;
- case PSG_BC_LATCH_ADDRESS:
- m_psg->address_w(space, 0, m_psgData);
- break;
- }
- }
+READ8_MEMBER( vicdual_state::carnival_music_port_t1_r )
+{
+ // T1: comms from audio port 2 d3
+ return ~m_port2State >> 3 & 1;
}
-static ADDRESS_MAP_START( carnival_audio_map, AS_PROGRAM, 8, vicdual_state )
- AM_RANGE(0x0000, 0x07ff) AM_ROM
+static ADDRESS_MAP_START( mboard_map, AS_PROGRAM, 8, vicdual_state )
+ AM_RANGE(0x0000, 0x03ff) AM_ROM
ADDRESS_MAP_END
-static ADDRESS_MAP_START( carnival_audio_io_map, AS_IO, 8, vicdual_state )
- AM_RANGE(MCS48_PORT_T1, MCS48_PORT_T1) AM_READ(carnival_music_port_t1_r)
+static ADDRESS_MAP_START( mboard_io_map, AS_IO, 8, vicdual_state )
AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) AM_WRITE(carnival_music_port_1_w)
AM_RANGE(MCS48_PORT_P2, MCS48_PORT_P2) AM_WRITE(carnival_music_port_2_w)
+ AM_RANGE(MCS48_PORT_T1, MCS48_PORT_T1) AM_READ(carnival_music_port_t1_r)
ADDRESS_MAP_END
MACHINE_CONFIG_FRAGMENT( carnival_audio )
- MCFG_CPU_ADD("audiocpu", I8039, 3579545)
- MCFG_CPU_PROGRAM_MAP(carnival_audio_map)
- MCFG_CPU_IO_MAP(carnival_audio_io_map)
- MCFG_QUANTUM_TIME(attotime::from_hz(600))
+ /* music board */
+ MCFG_CPU_ADD("audiocpu", I8039, XTAL_3_579545MHz)
+ MCFG_CPU_PROGRAM_MAP(mboard_map)
+ MCFG_CPU_IO_MAP(mboard_io_map)
- MCFG_SOUND_ADD("psg", AY8910, PSG_CLOCK)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.10)
+ MCFG_SOUND_ADD("psg", AY8912, XTAL_3_579545MHz/3)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
+ /* samples */
MCFG_SOUND_ADD("samples", SAMPLES, 0)
MCFG_SAMPLES_CHANNELS(10)
MCFG_SAMPLES_NAMES(carnival_sample_names)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.5)
MACHINE_CONFIG_END
diff --git a/src/mame/audio/cclimber.cpp b/src/mame/audio/cclimber.cpp
index cce1cc98d36..9f6e2e76755 100644
--- a/src/mame/audio/cclimber.cpp
+++ b/src/mame/audio/cclimber.cpp
@@ -12,9 +12,11 @@
SAMPLES_START_CB_MEMBER( cclimber_audio_device::sh_start )
{
- if (machine().root_device().memregion("samples")->base())
- m_sample_buf = auto_alloc_array(machine(), INT16, 2 * machine().root_device().memregion("samples")->bytes());
- save_pointer(NAME(m_sample_buf), 2 * machine().root_device().memregion("samples")->bytes());
+ if (m_samples_region)
+ {
+ m_sample_buf = std::make_unique<INT16[]>(2 * m_samples_region.bytes());
+ save_pointer(NAME(m_sample_buf.get()), 2 * m_samples_region.bytes());
+ }
}
MACHINE_CONFIG_FRAGMENT( cclimber_audio )
@@ -49,7 +51,8 @@ cclimber_audio_device::cclimber_audio_device(const machine_config &mconfig, cons
m_sample_num(0),
m_sample_freq(0),
m_sample_volume(0),
- m_samples(*this, "samples")
+ m_samples(*this, "samples"),
+ m_samples_region(*this, "^samples")
{
}
@@ -102,25 +105,27 @@ WRITE8_MEMBER( cclimber_audio_device::sample_trigger_w )
void cclimber_audio_device::play_sample(int start,int freq,int volume)
{
int len;
- int romlen = machine().root_device().memregion("samples")->bytes();
- const UINT8 *rom = machine().root_device().memregion("samples")->base();
+ int romlen = m_samples_region.bytes();
- if (!rom) return;
+ if (m_samples_region == NULL)
+ {
+ return;
+ }
/* decode the rom samples */
len = 0;
- while (start + len < romlen && rom[start+len] != 0x70)
+ while (start + len < romlen && m_samples_region[start+len] != 0x70)
{
int sample;
- sample = (rom[start + len] & 0xf0) >> 4;
+ sample = (m_samples_region[start + len] & 0xf0) >> 4;
m_sample_buf[2*len] = SAMPLE_CONV4(sample) * volume / 31;
- sample = rom[start + len] & 0x0f;
+ sample = m_samples_region[start + len] & 0x0f;
m_sample_buf[2*len + 1] = SAMPLE_CONV4(sample) * volume / 31;
len++;
}
- m_samples->start_raw(0,m_sample_buf,2 * len,freq);
+ m_samples->start_raw(0,m_sample_buf.get(),2 * len,freq);
}
diff --git a/src/mame/audio/cclimber.h b/src/mame/audio/cclimber.h
index ef72fac26e4..65f1255e3d1 100644
--- a/src/mame/audio/cclimber.h
+++ b/src/mame/audio/cclimber.h
@@ -52,11 +52,12 @@ protected:
void play_sample(int start,int freq,int volume);
private:
- INT16 *m_sample_buf; /* buffer to decode samples at run time */
+ std::unique_ptr<INT16[]> m_sample_buf; /* buffer to decode samples at run time */
int m_sample_num;
int m_sample_freq;
int m_sample_volume;
- required_device<samples_device> m_samples;
+ optional_device<samples_device> m_samples;
+ optional_region_ptr<UINT8> m_samples_region;
};
diff --git a/src/mame/audio/cinemat.cpp b/src/mame/audio/cinemat.cpp
index 9f144915f47..3a59752f1e9 100644
--- a/src/mame/audio/cinemat.cpp
+++ b/src/mame/audio/cinemat.cpp
@@ -266,7 +266,7 @@ void cinemat_state::speedfrk_sound_w(UINT8 sound_val, UINT8 bits_changed)
m_samples->stop(0);
/* start LED is controlled by bit 0x02 */
- set_led_status(machine(), 0, ~sound_val & 0x02);
+ output().set_led_value(0, ~sound_val & 0x02);
}
SOUND_RESET_MEMBER( cinemat_state, speedfrk )
@@ -476,7 +476,7 @@ void cinemat_state::tailg_sound_w(UINT8 sound_val, UINT8 bits_changed)
m_samples->start(5, 5);
/* LED */
- set_led_status(machine(), 0, m_current_shift & 0x40);
+ output().set_led_value(0, m_current_shift & 0x40);
/* remember the previous value */
m_last_shift = m_current_shift;
diff --git a/src/mame/audio/copsnrob.cpp b/src/mame/audio/copsnrob.cpp
index eaee183f1bc..bcc85241807 100644
--- a/src/mame/audio/copsnrob.cpp
+++ b/src/mame/audio/copsnrob.cpp
@@ -1,5 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders:Zsolt Vasvari
+// copyright-holders:Derrick Renaud
/************************************************************************
* copsnrob Sound System Analog emulation
* Nov 2010, Derrick Renaud
@@ -729,7 +729,7 @@ WRITE8_MEMBER(copsnrob_state::copsnrob_misc_w)
case 0x06:
/* One Start */
- set_led_status(machine(), 0, !special_data);
+ output().set_led_value(0, !special_data);
break;
case 0x07:
diff --git a/src/mame/audio/crbaloon.cpp b/src/mame/audio/crbaloon.cpp
index d5397c39d89..9141f2465ad 100644
--- a/src/mame/audio/crbaloon.cpp
+++ b/src/mame/audio/crbaloon.cpp
@@ -1,5 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders:Nicola Salmoria
+// copyright-holders:Nicola Salmoria,Derrick Renaud
/***************************************************************************
Taito Crazy Balloon hardware
diff --git a/src/mame/audio/cyberbal.cpp b/src/mame/audio/cyberbal.cpp
index 8745be912e1..60383a64503 100644
--- a/src/mame/audio/cyberbal.cpp
+++ b/src/mame/audio/cyberbal.cpp
@@ -52,8 +52,8 @@ READ8_MEMBER(cyberbal_state::sound_6502_stat_r)
WRITE8_MEMBER(cyberbal_state::sound_bank_select_w)
{
membank("soundbank")->set_base(&m_bank_base[0x1000 * ((data >> 6) & 3)]);
- coin_counter_w(machine(), 1, (data >> 5) & 1);
- coin_counter_w(machine(), 0, (data >> 4) & 1);
+ machine().bookkeeping().coin_counter_w(1, (data >> 5) & 1);
+ machine().bookkeeping().coin_counter_w(0, (data >> 4) & 1);
m_daccpu->set_input_line(INPUT_LINE_RESET, (data & 0x08) ? CLEAR_LINE : ASSERT_LINE);
if (!(data & 0x01)) machine().device("ymsnd")->reset();
}
diff --git a/src/mame/audio/dcs.cpp b/src/mame/audio/dcs.cpp
index 356314adeee..f887d59011d 100644
--- a/src/mame/audio/dcs.cpp
+++ b/src/mame/audio/dcs.cpp
@@ -594,31 +594,32 @@ MACHINE_CONFIG_END
void dcs_audio_device::dcs_boot()
{
- UINT8 buffer[0x1000];
-// UINT32 max_banks;
- UINT16 *base;
- int i;
-
switch (m_rev)
{
/* rev 1/1.5: use the last set data bank to boot from */
case 1:
case 15:
-
+ {
/* determine the base */
-// max_banks = m_bootrom_words / 0x1000;
- base = m_bootrom + ((m_sounddata_bank * 0x1000) % m_bootrom_words);
+ // max_banks = m_bootrom_words / 0x1000;
+ UINT16* base = m_bootrom + ((m_sounddata_bank * 0x1000) % m_bootrom_words);
/* convert from 16-bit data to 8-bit data and boot */
- for (i = 0; i < 0x1000; i++)
+ UINT8 buffer[0x1000];
+ for (int i = 0; i < 0x1000; i++)
+ {
buffer[i] = base[i];
+ }
+ assert(m_internal_program_ram != NULL);
m_cpu->load_boot_data(buffer, m_internal_program_ram);
break;
+ }
/* rev 2: use the ROM page in the SDRC to boot from */
case 2:
-
+ {
/* determine the base */
+ UINT16* base;
if (m_bootrom == m_sounddata)
{
/* EPROM case: page is selected from the page register */
@@ -631,10 +632,15 @@ void dcs_audio_device::dcs_boot()
}
/* convert from 16-bit data to 8-bit data and boot */
- for (i = 0; i < 0x1000; i++)
+ UINT8 buffer[0x1000];
+ for (int i = 0; i < 0x1000; i++)
+ {
buffer[i] = base[i];
+ }
+ assert(m_internal_program_ram != NULL);
m_cpu->load_boot_data(buffer, m_internal_program_ram);
break;
+ }
/* rev 3/4: HALT the ADSP-2181 until program is downloaded via IDMA */
case 3:
@@ -665,7 +671,7 @@ TIMER_CALLBACK_MEMBER( dcs_audio_device::dcs_reset )
case 1:
case 15:
m_sounddata_bank = 0;
- membank("databank")->set_entry(0);
+ m_data_bank->set_entry(0);
break;
/* rev 2: reset the SDRC ASIC */
@@ -807,6 +813,9 @@ dcs_audio_device::dcs_audio_device(const machine_config &mconfig, device_type ty
m_sounddata_words(0),
m_sounddata_banks(0),
m_sounddata_bank(0),
+ m_data_bank(*this, "databank"),
+ m_rom_page(NULL),
+ m_dram_page(NULL),
m_auto_ack(0),
m_latch_control(0),
m_input_data(0),
@@ -845,8 +854,16 @@ void dcs_audio_device::device_start()
{
m_sram = nullptr;
- m_internal_program_ram = (UINT32 *)memshare("dcsint")->ptr();
- m_external_program_ram = (UINT32 *)memshare("dcsext")->ptr();
+ memory_share *internal_ram = memshare("dcsint");
+ if (internal_ram != NULL)
+ {
+ m_internal_program_ram = (UINT32 *)internal_ram->ptr();
+ }
+ memory_share *external_ram = memshare("dcsext");
+ if (external_ram != NULL)
+ {
+ m_external_program_ram = (UINT32 *)external_ram->ptr();
+ }
/* find the DCS CPU and the sound ROMs */
m_cpu = subdevice<adsp21xx_device>("dcs");
@@ -866,12 +883,12 @@ void dcs_audio_device::device_start()
if (m_rev == 1)
{
m_sounddata_banks = m_sounddata_words / 0x1000;
- membank("databank")->configure_entries(0, m_sounddata_banks, m_sounddata, 0x1000*2);
+ m_data_bank->configure_entries(0, m_sounddata_banks, m_sounddata, 0x1000*2);
}
else
{
m_sounddata_banks = m_sounddata_words / 0x800;
- membank("databank")->configure_entries(0, m_sounddata_banks, m_sounddata, 0x800*2);
+ m_data_bank->configure_entries(0, m_sounddata_banks, m_sounddata, 0x800*2);
}
/* create the timers */
@@ -891,8 +908,16 @@ void dcs2_audio_device::device_start()
{
int soundbank_words;
- m_internal_program_ram = (UINT32 *)memshare("dcsint")->ptr();
- m_external_program_ram = (UINT32 *)memshare("dcsext")->ptr();
+ memory_share *internal_ram = memshare("dcsint");
+ if (internal_ram != NULL)
+ {
+ m_internal_program_ram = (UINT32 *)internal_ram->ptr();
+ }
+ memory_share *external_ram = memshare("dcsext");
+ if (external_ram != NULL)
+ {
+ m_external_program_ram = (UINT32 *)external_ram->ptr();
+ }
/* find the DCS CPU and the sound ROMs */
m_cpu = subdevice<adsp21xx_device>("dcs2");
@@ -920,8 +945,12 @@ void dcs2_audio_device::device_start()
m_dmadac[1] = subdevice<dmadac_sound_device>("dac2");
/* always boot from the base of "dcs" */
- m_bootrom = (UINT16 *)machine().root_device().memregion("dcs")->base();
- m_bootrom_words = machine().root_device().memregion("dcs")->bytes() / 2;
+ memory_region *bootrom_region = machine().root_device().memregion("dcs");
+ if (bootrom_region != NULL)
+ {
+ m_bootrom = (UINT16 *)bootrom_region->base();
+ m_bootrom_words = bootrom_region->bytes() / 2;
+ }
/* supports both RAM and ROM variants */
if (m_dram_in_mb != 0)
@@ -937,7 +966,9 @@ void dcs2_audio_device::device_start()
}
m_sounddata_banks = m_sounddata_words / soundbank_words;
if (m_rev != 2)
- membank("databank")->configure_entries(0, m_sounddata_banks, m_sounddata, soundbank_words*2);
+ {
+ m_data_bank->configure_entries(0, m_sounddata_banks, m_sounddata, soundbank_words*2);
+ }
/* allocate memory for the SRAM */
m_sram = auto_alloc_array(machine(), UINT16, 0x8000*4/2);
@@ -982,12 +1013,14 @@ void dcs_audio_device::set_auto_ack(int state)
READ16_MEMBER( dcs_audio_device::dcs_dataram_r )
{
+ assert(m_external_program_ram != NULL);
return m_external_program_ram[offset] >> 8;
}
WRITE16_MEMBER( dcs_audio_device::dcs_dataram_w )
{
+ assert(m_external_program_ram != NULL);
UINT16 val = m_external_program_ram[offset] >> 8;
COMBINE_DATA(&val);
m_external_program_ram[offset] = (val << 8) | (m_external_program_ram[offset] & 0x0000ff);
@@ -1001,12 +1034,12 @@ WRITE16_MEMBER( dcs_audio_device::dcs_data_bank_select_w )
else
m_sounddata_bank = (m_sounddata_bank & 0xff00) | (data & 0xff);
- membank("databank")->set_entry(m_sounddata_bank % m_sounddata_banks);
+ m_data_bank->set_entry(m_sounddata_bank % m_sounddata_banks);
/* bit 11 = sound board led */
#if 0
if (m_rev != 15)
- set_led_status(machine(), 2, data & 0x800);
+ output().set_led_value(2, data & 0x800);
#endif
}
@@ -1014,7 +1047,7 @@ WRITE16_MEMBER( dcs_audio_device::dcs_data_bank_select2_w )
{
m_sounddata_bank = (m_sounddata_bank & 0x00ff) | ((data & 0x01) << 8) | ((data & 0xfc) << 7);
- membank("databank")->set_entry(m_sounddata_bank % m_sounddata_banks);
+ m_data_bank->set_entry(m_sounddata_bank % m_sounddata_banks);
}
/*************************************
@@ -1034,15 +1067,21 @@ void dcs_audio_device::sdrc_update_bank_pointers()
{
/* ROM-based; use the memory page to select from ROM */
if (SDRC_ROM_MS == 1 && SDRC_ROM_ST != 3)
- membank("rompage")->set_base(&m_sounddata[(SDRC_EPM_PG * pagesize) % m_sounddata_words]);
+ {
+ m_rom_page->set_base(&m_sounddata[(SDRC_EPM_PG * pagesize) % m_sounddata_words]);
+ }
}
else
{
/* RAM-based; use the ROM page to select from ROM, and the memory page to select from RAM */
if (SDRC_ROM_MS == 1 && SDRC_ROM_ST != 3)
- membank("rompage")->set_base(&m_bootrom[(SDRC_ROM_PG * 4096 /*pagesize*/) % m_bootrom_words]);
+ {
+ m_rom_page->set_base(&m_bootrom[(SDRC_ROM_PG * 4096 /*pagesize*/) % m_bootrom_words]);
+ }
if (SDRC_DM_ST != 0)
- membank("drampage")->set_base(&m_sounddata[(SDRC_DM_PG * 1024) % m_sounddata_words]);
+ {
+ m_dram_page->set_base(&m_sounddata[(SDRC_DM_PG * 1024) % m_sounddata_words]);
+ }
}
}
}
@@ -1087,6 +1126,7 @@ void dcs_audio_device::sdrc_remap_memory()
int baseaddr = (SDRC_ROM_ST == 0) ? 0x0000 : (SDRC_ROM_ST == 1) ? 0x3000 : 0x3400;
int pagesize = (SDRC_ROM_SZ == 0 && SDRC_ROM_ST != 0) ? 4096 : 1024;
m_data->install_read_bank(baseaddr, baseaddr + pagesize - 1, "rompage");
+ m_rom_page = membank("rompage");
}
/* map the DRAM page as bank 26 */
@@ -1094,6 +1134,7 @@ void dcs_audio_device::sdrc_remap_memory()
{
int baseaddr = (SDRC_DM_ST == 1) ? 0x0000 : (SDRC_DM_ST == 2) ? 0x3000 : 0x3400;
m_data->install_readwrite_bank(baseaddr, baseaddr + 0x3ff, "drampage");
+ m_dram_page = membank("drampage");
}
/* update the bank pointers */
@@ -1285,7 +1326,7 @@ WRITE16_MEMBER( dcs_audio_device::dsio_w )
/* offset 2 controls RAM pages */
case 2:
dsio.reg[2] = data;
- membank("databank")->set_entry(DSIO_DM_PG % m_sounddata_banks);
+ m_data_bank->set_entry(DSIO_DM_PG % m_sounddata_banks);
break;
}
}
@@ -1352,7 +1393,7 @@ WRITE16_MEMBER( dcs_audio_device::denver_w )
/* offset 2 controls RAM pages */
case 2:
dsio.reg[2] = data;
- membank("databank")->set_entry(DENV_DM_PG % m_sounddata_banks);
+ m_data_bank->set_entry(DENV_DM_PG % m_sounddata_banks);
break;
/* offset 3 controls FIFO reset */
diff --git a/src/mame/audio/dcs.h b/src/mame/audio/dcs.h
index 032ce6b5c8a..dd7eca582b6 100644
--- a/src/mame/audio/dcs.h
+++ b/src/mame/audio/dcs.h
@@ -48,9 +48,6 @@ public:
DECLARE_WRITE32_MEMBER( dsio_idma_data_w );
DECLARE_READ32_MEMBER( dsio_idma_data_r );
- DECLARE_READ32_MEMBER(de_r);
- DECLARE_WRITE32_MEMBER(de_w);
-
// non public
void dcs_boot();
TIMER_CALLBACK_MEMBER( dcs_reset );
@@ -59,8 +56,6 @@ public:
DECLARE_WRITE16_MEMBER( dcs_dataram_w );
DECLARE_WRITE16_MEMBER( dcs_data_bank_select_w );
DECLARE_WRITE16_MEMBER( dcs_data_bank_select2_w );
- DECLARE_READ16_MEMBER( dcs_dataram_bank_select_r );
- DECLARE_WRITE16_MEMBER( dcs_dataram_bank_select_w );
inline void sdrc_update_bank_pointers();
void sdrc_remap_memory();
void sdrc_reset();
@@ -170,6 +165,10 @@ protected:
UINT32 m_sounddata_banks;
UINT16 m_sounddata_bank;
+ optional_memory_bank m_data_bank;
+ memory_bank * m_rom_page;
+ memory_bank * m_dram_page;
+
/* I/O with the host */
UINT8 m_auto_ack;
UINT16 m_latch_control;
diff --git a/src/mame/audio/depthch.cpp b/src/mame/audio/depthch.cpp
index cdaae0ad108..d4a5bf5ca68 100644
--- a/src/mame/audio/depthch.cpp
+++ b/src/mame/audio/depthch.cpp
@@ -30,15 +30,6 @@ static const char *const depthch_sample_names[] =
};
-MACHINE_CONFIG_FRAGMENT( depthch_audio )
-
- MCFG_SOUND_ADD("samples", SAMPLES, 0)
- MCFG_SAMPLES_CHANNELS(4)
- MCFG_SAMPLES_NAMES(depthch_sample_names)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.5)
-MACHINE_CONFIG_END
-
-
/* sample IDs - must match sample file name table above */
enum
{
@@ -51,17 +42,15 @@ enum
WRITE8_MEMBER( vicdual_state::depthch_audio_w )
{
- static int port1State = 0;
int bitsChanged;
int bitsGoneHigh;
int bitsGoneLow;
-
- bitsChanged = port1State ^ data;
+ bitsChanged = m_port1State ^ data;
bitsGoneHigh = bitsChanged & data;
bitsGoneLow = bitsChanged & ~data;
- port1State = data;
+ m_port1State = data;
if ( bitsGoneHigh & OUT_PORT_1_LONGEXPL )
{
@@ -87,3 +76,13 @@ WRITE8_MEMBER( vicdual_state::depthch_audio_w )
STOP( m_samples, SND_SONAR );
}
}
+
+
+MACHINE_CONFIG_FRAGMENT( depthch_audio )
+
+ /* samples */
+ MCFG_SOUND_ADD("samples", SAMPLES, 0)
+ MCFG_SAMPLES_CHANNELS(4)
+ MCFG_SAMPLES_NAMES(depthch_sample_names)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.5)
+MACHINE_CONFIG_END
diff --git a/src/mame/audio/dkong.cpp b/src/mame/audio/dkong.cpp
index 305198e255e..8ca9f121dda 100644
--- a/src/mame/audio/dkong.cpp
+++ b/src/mame/audio/dkong.cpp
@@ -1284,10 +1284,8 @@ static ADDRESS_MAP_START( dkong_sound_map, AS_PROGRAM, 8, dkong_state )
ADDRESS_MAP_END
static ADDRESS_MAP_START( dkong_sound_io_map, AS_IO, 8, dkong_state )
- AM_RANGE(0x00, 0xFF) AM_READ(dkong_tune_r)
- AM_WRITE(dkong_voice_w)
- AM_RANGE(MCS48_PORT_BUS, MCS48_PORT_BUS) AM_READ(dkong_tune_r)
- AM_WRITE(dkong_voice_w)
+ AM_RANGE(0x00, 0xFF) AM_READWRITE(dkong_tune_r, dkong_voice_w)
+ AM_RANGE(MCS48_PORT_BUS, MCS48_PORT_BUS) AM_READWRITE(dkong_tune_r, dkong_voice_w)
AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) AM_WRITE(dkong_p1_w) /* only write to dac */
AM_RANGE(MCS48_PORT_P2, MCS48_PORT_P2) AM_LATCH8_READWRITE("virtual_p2")
AM_RANGE(MCS48_PORT_T0, MCS48_PORT_T0) AM_LATCH8_READBIT("ls259.6h", 5)
@@ -1305,8 +1303,7 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( radarscp1_sound_io_map, AS_IO, 8, dkong_state )
AM_RANGE(0x00, 0x00) AM_MIRROR(0xff) AM_DEVREAD("ls175.3d", latch8_device, read)
AM_RANGE(0x00, 0xff) AM_WRITE(dkong_p1_w) /* DAC here */
- AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) AM_LATCH8_READ("virtual_p1")
- AM_WRITE(M58817_command_w)
+ AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) AM_LATCH8_READ("virtual_p1") AM_WRITE(M58817_command_w)
AM_RANGE(MCS48_PORT_P2, MCS48_PORT_P2) AM_LATCH8_WRITE("virtual_p2")
AM_RANGE(MCS48_PORT_T0, MCS48_PORT_T0) AM_LATCH8_READBIT("ls259.6h", 5)
AM_RANGE(MCS48_PORT_T1, MCS48_PORT_T1) AM_LATCH8_READBIT("ls259.6h", 4)
@@ -1334,7 +1331,6 @@ ADDRESS_MAP_END
MACHINE_CONFIG_FRAGMENT( dkong2b_audio )
/* sound latches */
-
MCFG_LATCH8_ADD("ls175.3d") /* sound cmd latch */
MCFG_LATCH8_MASKOUT(0xf0)
MCFG_LATCH8_INVERT(0x0F)
@@ -1365,17 +1361,17 @@ MACHINE_CONFIG_FRAGMENT( dkong2b_audio )
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_DISCRETE_ADD("discrete", 0, dkong2b)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-
MACHINE_CONFIG_END
MACHINE_CONFIG_DERIVED( radarscp_audio, dkong2b_audio )
+
MCFG_DISCRETE_REPLACE("discrete", 0, radarscp)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.7)
-
MACHINE_CONFIG_END
MACHINE_CONFIG_DERIVED( radarscp1_audio, radarscp_audio )
+
MCFG_CPU_MODIFY("soundcpu")
MCFG_CPU_IO_MAP(radarscp1_sound_io_map)
@@ -1383,24 +1379,23 @@ MACHINE_CONFIG_DERIVED( radarscp1_audio, radarscp_audio )
MCFG_LATCH8_ADD( "virtual_p1" ) /* virtual latch for port A */
MCFG_LATCH8_INVERT( 0x80 ) /* signal is inverted */
MCFG_LATCH8_READ_7(DEVREAD8("ls259.6h", latch8_device, read), 3)
- MCFG_LATCH8_READ_6(READ8(dkong_state,M58817_status_r), 0)
+ MCFG_LATCH8_READ_6(READ8(dkong_state, M58817_status_r), 0)
/* tms memory controller */
MCFG_DEVICE_ADD("m58819", M58819, 0)
MCFG_SOUND_ADD("tms", M58817, XTAL_640kHz)
- MCFG_TMS5110_M0_CB(DEVWRITELINE("m58819", tms6100_device, tms6100_m0_w))
- MCFG_TMS5110_M1_CB(DEVWRITELINE("m58819", tms6100_device, tms6100_m1_w))
- MCFG_TMS5110_ADDR_CB(DEVWRITE8("m58819", tms6100_device, tms6100_addr_w))
- MCFG_TMS5110_DATA_CB(DEVREADLINE("m58819", tms6100_device, tms6100_data_r))
- MCFG_TMS5110_ROMCLK_CB(DEVWRITELINE("m58819", tms6100_device, tms6100_romclock_w))
+ MCFG_TMS5110_M0_CB(DEVWRITELINE("m58819", tms6100_device, m0_w))
+ MCFG_TMS5110_M1_CB(DEVWRITELINE("m58819", tms6100_device, m1_w))
+ MCFG_TMS5110_ADDR_CB(DEVWRITE8("m58819", tms6100_device, add_w))
+ MCFG_TMS5110_DATA_CB(DEVREADLINE("m58819", tms6100_device, data_line_r))
+ MCFG_TMS5110_ROMCLK_CB(DEVWRITELINE("m58819", tms6100_device, clk_w))
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
MACHINE_CONFIG_END
MACHINE_CONFIG_FRAGMENT( dkongjr_audio )
/* sound latches */
-
MCFG_LATCH8_ADD("ls174.3d")
MCFG_LATCH8_MASKOUT(0xE0)
@@ -1430,18 +1425,17 @@ MACHINE_CONFIG_FRAGMENT( dkongjr_audio )
MCFG_DISCRETE_ADD("discrete", 0, dkongjr)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-
MACHINE_CONFIG_END
MACHINE_CONFIG_FRAGMENT( dkong3_audio )
MCFG_CPU_ADD("n2a03a", N2A03,N2A03_DEFAULTCLOCK)
MCFG_CPU_PROGRAM_MAP(dkong3_sound1_map)
- MCFG_CPU_VBLANK_INT_DRIVER("screen", dkong_state, nmi_line_pulse)
+ MCFG_CPU_VBLANK_INT_DRIVER("screen", dkong_state, nmi_line_pulse)
MCFG_CPU_ADD("n2a03b", N2A03,N2A03_DEFAULTCLOCK)
MCFG_CPU_PROGRAM_MAP(dkong3_sound2_map)
- MCFG_CPU_VBLANK_INT_DRIVER("screen", dkong_state, nmi_line_pulse)
+ MCFG_CPU_VBLANK_INT_DRIVER("screen", dkong_state, nmi_line_pulse)
/* sound latches */
MCFG_LATCH8_ADD( "latch1")
diff --git a/src/mame/audio/dragrace.cpp b/src/mame/audio/dragrace.cpp
index 02936306373..c4de9473287 100644
--- a/src/mame/audio/dragrace.cpp
+++ b/src/mame/audio/dragrace.cpp
@@ -1,5 +1,5 @@
-// license:???
-// copyright-holders:Derrick Renaud
+// license:BSD-3-Clause
+// copyright-holders:Derrick Renaud
/*************************************************************************
audio\dragrace.c
diff --git a/src/mame/audio/dsbz80.h b/src/mame/audio/dsbz80.h
index 3e8210d8e27..fb642566245 100644
--- a/src/mame/audio/dsbz80.h
+++ b/src/mame/audio/dsbz80.h
@@ -54,7 +54,6 @@ private:
UINT32 mp_start, mp_end, mp_vol, mp_pan, mp_state, lp_start, lp_end, start, end;
int mp_pos, audio_pos, audio_avail;
int status;
- int getbit();
};
diff --git a/src/mame/audio/exidy.h b/src/mame/audio/exidy.h
index f0c3ff36d81..6f2eef49b56 100644
--- a/src/mame/audio/exidy.h
+++ b/src/mame/audio/exidy.h
@@ -132,9 +132,6 @@ protected:
// sound stream update overrides
virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) override;
-
-private:
- // internal state
};
extern const device_type EXIDY_VENTURE;
diff --git a/src/mame/audio/exidy440.cpp b/src/mame/audio/exidy440.cpp
index 626bdc5ae9c..78c122a9caf 100644
--- a/src/mame/audio/exidy440.cpp
+++ b/src/mame/audio/exidy440.cpp
@@ -128,8 +128,8 @@ void exidy440_sound_device::device_start()
reset_sound_cache();
/* allocate the mixer buffer */
- m_mixer_buffer_left = auto_alloc_array_clear(machine(), INT32, 2 * clock());
- m_mixer_buffer_right = m_mixer_buffer_left + clock();
+ m_mixer_buffer_left = make_unique_clear<INT32[]>(clock());
+ m_mixer_buffer_right = make_unique_clear<INT32[]>(clock());
if (SOUND_LOG)
m_debuglog = fopen("sound.log", "w");
@@ -197,8 +197,8 @@ void exidy440_sound_device::add_and_scale_samples(int ch, INT32 *dest, int sampl
void exidy440_sound_device::mix_to_16(int length, stream_sample_t *dest_left, stream_sample_t *dest_right)
{
- INT32 *mixer_left = m_mixer_buffer_left;
- INT32 *mixer_right = m_mixer_buffer_right;
+ INT32 *mixer_left = m_mixer_buffer_left.get();
+ INT32 *mixer_right = m_mixer_buffer_right.get();
int i, clippers = 0;
for (i = 0; i < length; i++)
@@ -804,8 +804,8 @@ void exidy440_sound_device::sound_stream_update(sound_stream &stream, stream_sam
int ch;
/* reset the mixer buffers */
- memset(m_mixer_buffer_left, 0, samples * sizeof(INT32));
- memset(m_mixer_buffer_right, 0, samples * sizeof(INT32));
+ memset(m_mixer_buffer_left.get(), 0, samples * sizeof(INT32));
+ memset(m_mixer_buffer_right.get(), 0, samples * sizeof(INT32));
/* loop over channels */
for (ch = 0; ch < 4; ch++)
@@ -824,12 +824,12 @@ void exidy440_sound_device::sound_stream_update(sound_stream &stream, stream_sam
/* get a pointer to the sample data and copy to the left */
volume = m_sound_volume[2 * ch + 0];
if (volume)
- add_and_scale_samples(ch, m_mixer_buffer_left, length, volume);
+ add_and_scale_samples(ch, m_mixer_buffer_left.get(), length, volume);
/* get a pointer to the sample data and copy to the left */
volume = m_sound_volume[2 * ch + 1];
if (volume)
- add_and_scale_samples(ch, m_mixer_buffer_right, length, volume);
+ add_and_scale_samples(ch, m_mixer_buffer_right.get(), length, volume);
/* update our counters */
channel->offset += length;
diff --git a/src/mame/audio/exidy440.h b/src/mame/audio/exidy440.h
index 2a5265c8793..0dafc17adf6 100644
--- a/src/mame/audio/exidy440.h
+++ b/src/mame/audio/exidy440.h
@@ -67,8 +67,8 @@ private:
UINT8 m_sound_banks[4];
//UINT8 m_m6844_data[0x20];
UINT8 m_sound_volume[0x10];
- INT32 *m_mixer_buffer_left;
- INT32 *m_mixer_buffer_right;
+ std::unique_ptr<INT32[]> m_mixer_buffer_left;
+ std::unique_ptr<INT32[]> m_mixer_buffer_right;
sound_cache_entry *m_sound_cache;
sound_cache_entry *m_sound_cache_end;
sound_cache_entry *m_sound_cache_max;
diff --git a/src/mame/audio/firetrk.cpp b/src/mame/audio/firetrk.cpp
index 29120fa53ef..74269247cf4 100644
--- a/src/mame/audio/firetrk.cpp
+++ b/src/mame/audio/firetrk.cpp
@@ -1,5 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders:Phil Stroffolino
+// copyright-holders:K.Wilkins,Derrick Renaud
/*************************************************************************
audio\firetrk.c
diff --git a/src/mame/audio/flower.cpp b/src/mame/audio/flower.cpp
index fcde400310d..fc8ef87b559 100644
--- a/src/mame/audio/flower.cpp
+++ b/src/mame/audio/flower.cpp
@@ -49,7 +49,7 @@ void flower_sound_device::device_start()
m_effect_timer = timer_alloc(TIMER_CLOCK_EFFECT);
m_stream = machine().sound().stream_alloc(*this, 0, 1, MIXER_SAMPLERATE);
- m_mixer_buffer = auto_alloc_array(machine(), short, MIXER_SAMPLERATE);
+ m_mixer_buffer = std::make_unique<short[]>(MIXER_SAMPLERATE);
make_mixer_table(8, MIXER_DEFGAIN);
/* extract globals from the interface */
@@ -114,10 +114,10 @@ void flower_sound_device::make_mixer_table(int voices, int gain)
int count = voices * 128;
/* allocate memory */
- m_mixer_table = auto_alloc_array(machine(), INT16, 256 * voices);
+ m_mixer_table = std::make_unique<INT16[]>(256 * voices);
/* find the middle of the table */
- m_mixer_lookup = m_mixer_table + (128 * voices);
+ m_mixer_lookup = m_mixer_table.get() + (128 * voices);
/* fill in the table - 16 bit case */
for (int i = 0; i < count; i++)
@@ -274,7 +274,7 @@ void flower_sound_device::sound_stream_update(sound_stream &stream, stream_sampl
int i;
/* zap the contents of the mixer buffer */
- memset(m_mixer_buffer, 0, samples * sizeof(short));
+ memset(m_mixer_buffer.get(), 0, samples * sizeof(short));
/* loop over each voice and add its contribution */
for (voice = m_channel_list; voice < m_last_channel; voice++)
@@ -303,7 +303,7 @@ void flower_sound_device::sound_stream_update(sound_stream &stream, stream_sampl
// bit 3: not used much, maybe pitch slide the other way?
v |= voice->voltab;
- mix = m_mixer_buffer;
+ mix = m_mixer_buffer.get();
for (i = 0; i < samples; i++)
{
@@ -331,7 +331,7 @@ void flower_sound_device::sound_stream_update(sound_stream &stream, stream_sampl
}
/* mix it down */
- mix = m_mixer_buffer;
+ mix = m_mixer_buffer.get();
for (i = 0; i < samples; i++)
*buffer++ = m_mixer_lookup[*mix++];
}
diff --git a/src/mame/audio/galaga.cpp b/src/mame/audio/galaga.cpp
index db39f8ae7af..de76a62ba13 100644
--- a/src/mame/audio/galaga.cpp
+++ b/src/mame/audio/galaga.cpp
@@ -1,4 +1,4 @@
-// license:???
+// license:BSD-3-Clause
// copyright-holders:Derrick Renaud
/***************************************************************************
galaga.c
diff --git a/src/mame/audio/geebee.cpp b/src/mame/audio/geebee.cpp
index 58103b0b7f2..d16f3c68cb5 100644
--- a/src/mame/audio/geebee.cpp
+++ b/src/mame/audio/geebee.cpp
@@ -36,7 +36,7 @@ geebee_sound_device::geebee_sound_device(const machine_config &mconfig, const ch
void geebee_sound_device::device_start()
{
- m_decay = auto_alloc_array(machine(), UINT16, 32768);
+ m_decay = std::make_unique<UINT16[]>(32768);
for (int i = 0; i < 0x8000; i++)
m_decay[0x7fff - i] = (INT16) (0x7fff/exp(1.0*i/4096));
diff --git a/src/mame/audio/gomoku.cpp b/src/mame/audio/gomoku.cpp
index 9362bc25fe1..9743ea2884e 100644
--- a/src/mame/audio/gomoku.cpp
+++ b/src/mame/audio/gomoku.cpp
@@ -59,8 +59,8 @@ void gomoku_sound_device::device_start()
m_stream = stream_alloc(0, 1, samplerate);
/* allocate a pair of buffers to mix into - 1 second's worth should be more than enough */
- m_mixer_buffer = auto_alloc_array(machine(), short, 2 * samplerate);
- m_mixer_buffer_2 = m_mixer_buffer + samplerate;
+ m_mixer_buffer = std::make_unique<short[]>(2 * samplerate);
+ m_mixer_buffer_2 = m_mixer_buffer.get() + samplerate;
/* build the mixer table */
make_mixer_table(8, defgain);
@@ -105,7 +105,7 @@ void gomoku_sound_device::sound_stream_update(sound_stream &stream, stream_sampl
}
/* zap the contents of the mixer buffer */
- memset(m_mixer_buffer, 0, samples * sizeof(short));
+ memset(m_mixer_buffer.get(), 0, samples * sizeof(short));
/* loop over each voice and add its contribution */
for (ch = 0, voice = m_channel_list; voice < m_last_channel; ch++, voice++)
@@ -124,7 +124,7 @@ void gomoku_sound_device::sound_stream_update(sound_stream &stream, stream_sampl
else
w_base = 0x100 * (m_soundregs2[0x1d] & 0x0f);
- mix = m_mixer_buffer;
+ mix = m_mixer_buffer.get();
/* add our contribution */
for (i = 0; i < samples; i++)
@@ -167,7 +167,7 @@ void gomoku_sound_device::sound_stream_update(sound_stream &stream, stream_sampl
}
/* mix it down */
- mix = m_mixer_buffer;
+ mix = m_mixer_buffer.get();
for (i = 0; i < samples; i++)
*buffer++ = m_mixer_lookup[*mix++];
}
@@ -180,10 +180,10 @@ void gomoku_sound_device::make_mixer_table(int voices, int gain)
int i;
/* allocate memory */
- m_mixer_table = auto_alloc_array(machine(), INT16, 256 * voices);
+ m_mixer_table = std::make_unique<INT16[]>(256 * voices);
/* find the middle of the table */
- m_mixer_lookup = m_mixer_table + (128 * voices);
+ m_mixer_lookup = m_mixer_table.get() + (128 * voices);
/* fill in the table - 16 bit case */
for (i = 0; i < count; i++)
diff --git a/src/mame/audio/gottlieb.cpp b/src/mame/audio/gottlieb.cpp
index 6a5eb46f0e8..38b3fc013ea 100644
--- a/src/mame/audio/gottlieb.cpp
+++ b/src/mame/audio/gottlieb.cpp
@@ -328,7 +328,7 @@ MACHINE_CONFIG_END
INPUT_PORTS_START( gottlieb_sound_r0 )
PORT_START("SB0")
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Audio Diag") PORT_CODE(KEYCODE_0) PORT_CHANGED_MEMBER(DEVICE_SELF, gottlieb_sound_r0_device, audio_nmi, 1)
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Audio Diag") PORT_CODE(KEYCODE_0) PORT_CHANGED_MEMBER(DEVICE_SELF, gottlieb_sound_r0_device, audio_nmi, nullptr)
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Attract") PORT_CODE(KEYCODE_F1) PORT_TOGGLE
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Music") PORT_CODE(KEYCODE_F2) PORT_TOGGLE
INPUT_PORTS_END
@@ -965,7 +965,7 @@ INPUT_PORTS_START( gottlieb_sound_r2 )
PORT_DIPNAME( 0x40, 0x40, "Sound Test" ) PORT_DIPLOCATION("SB2:7")
PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, gottlieb_sound_r2_device, speech_drq_custom_r, NULL)
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, gottlieb_sound_r2_device, speech_drq_custom_r, nullptr)
INPUT_PORTS_END
diff --git a/src/mame/audio/hng64.cpp b/src/mame/audio/hng64.cpp
index 220afc56240..982aa46ca70 100644
--- a/src/mame/audio/hng64.cpp
+++ b/src/mame/audio/hng64.cpp
@@ -92,7 +92,7 @@ WRITE32_MEMBER(hng64_state::hng64_soundram_w)
fp=fopen(filename, "w+b");
if (fp)
{
- fwrite((UINT8*)m_soundram, 0x80000*4, 1, fp);
+ fwrite((UINT8*)m_soundram.get(), 0x80000*4, 1, fp);
fclose(fp);
}
}
@@ -145,7 +145,7 @@ WRITE32_MEMBER( hng64_state::hng64_soundcpu_enable_w )
void hng64_state::reset_sound()
{
- UINT8 *RAM = (UINT8*)m_soundram;
+ UINT8 *RAM = (UINT8*)m_soundram.get();
membank("bank0")->set_base(&RAM[0x1f0000]);
membank("bank1")->set_base(&RAM[0x1f0000]);
membank("bank2")->set_base(&RAM[0x1f0000]);
@@ -222,7 +222,7 @@ WRITE16_MEMBER(hng64_state::hng64_sound_bank_w)
// the 2 early games don't do this.. maybe all banks actuallly default to that region tho?
// the sound code on those games seems buggier anyway.
- UINT8 *RAM = (UINT8*)m_soundram;
+ UINT8 *RAM = (UINT8*)m_soundram.get();
int bank = data & 0x1f;
diff --git a/src/mame/audio/invinco.cpp b/src/mame/audio/invinco.cpp
index 4aaed4c1f89..688cc5b9510 100644
--- a/src/mame/audio/invinco.cpp
+++ b/src/mame/audio/invinco.cpp
@@ -36,15 +36,6 @@ static const char *const invinco_sample_names[] =
};
-
-MACHINE_CONFIG_FRAGMENT( invinco_audio )
- MCFG_SOUND_ADD("samples", SAMPLES, 0)
- MCFG_SAMPLES_CHANNELS(8)
- MCFG_SAMPLES_NAMES(invinco_sample_names)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.5)
-MACHINE_CONFIG_END
-
-
/* sample IDs - must match sample file name table above */
enum
{
@@ -61,17 +52,15 @@ enum
WRITE8_MEMBER( vicdual_state::invinco_audio_w )
{
- static int port2State = 0;
int bitsChanged;
//int bitsGoneHigh;
int bitsGoneLow;
-
- bitsChanged = port2State ^ data;
+ bitsChanged = m_port2State ^ data;
//bitsGoneHigh = bitsChanged & data;
bitsGoneLow = bitsChanged & ~data;
- port2State = data;
+ m_port2State = data;
if ( bitsGoneLow & OUT_PORT_2_SAUCER )
{
@@ -102,8 +91,14 @@ WRITE8_MEMBER( vicdual_state::invinco_audio_w )
{
PLAY( m_samples, SND_SHIPHIT, 0 );
}
-
-#if 0
- logerror("Went LO: %02X %04X\n", bitsGoneLow, space.device().safe_pc());
-#endif
}
+
+
+MACHINE_CONFIG_FRAGMENT( invinco_audio )
+
+ /* samples */
+ MCFG_SOUND_ADD("samples", SAMPLES, 0)
+ MCFG_SAMPLES_CHANNELS(8)
+ MCFG_SAMPLES_NAMES(invinco_sample_names)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.5)
+MACHINE_CONFIG_END
diff --git a/src/mame/audio/laserbat.cpp b/src/mame/audio/laserbat.cpp
index 0237fd25a62..5e8ee062b45 100644
--- a/src/mame/audio/laserbat.cpp
+++ b/src/mame/audio/laserbat.cpp
@@ -1,105 +1,388 @@
// license:BSD-3-Clause
-// copyright-holders:Pierpaolo Prazzoli
-#include "emu.h"
-#include "sound/tms3615.h"
+// copyright-holders:Vas Crabb
+/*
+ Laser Battle / Lazarian (c) 1981 Zaccaria
+ Cat and Mouse (c) 1982 Zaccaria
+
+ audio emulation by Vas Crabb
+*/
+
#include "includes/laserbat.h"
-WRITE8_MEMBER(laserbat_state::laserbat_csound1_w)
+
+READ8_MEMBER(laserbat_state_base::rhsc_r)
+{
+ return m_rhsc;
+}
+
+WRITE8_MEMBER(laserbat_state_base::whsc_w)
+{
+ m_whsc = data;
+}
+
+WRITE8_MEMBER(laserbat_state_base::csound1_w)
{
m_csound1 = data;
}
-WRITE8_MEMBER(laserbat_state::laserbat_csound2_w)
+WRITE8_MEMBER(laserbat_state_base::csound2_w)
{
- int ksound = 0;
+ m_csound2 = data;
+}
- if (data & 0x01)
- {
- int noise_filter_res = 0, vco_res = 0;
- switch(m_csound1 & 0x07)
+/*
+ The Laser Battle/Lazarian sound board has a SN76477 CSG, two TMS3615
+ tone synthesisers, and a TDA1010 power amplifier. It receives
+ commands from the game board over a 16-bit unidirectional data bus.
+ The CPU cannot write all sixteen lines atomically, it write to lines
+ 1-8 as one group and 9-16 as another group.
+
+ The game board makes the the audio output from the first S2636 PVI
+ (5E) available on a pin at the sound board interface connector, but
+ it isn't routed anywhere, so you won't hear it.
+
+ The TMS3615 at 05 is clocked at 250kHz (4MHz crystal oscillator
+ divided by 16), and its divide-by-two output is used to clock the
+ TMS3615 at 04. This gives a base 16' note of C3. The combined 8'
+ or 16' outputs are selectable by jumper, allowing board to be
+ switched between two octaves. There's no indication of which octave
+ would have been selected in the Lazarian manual.
+
+ There's a filter network between the TMS3615 outputs and the power
+ amplifier with several parameters controllable from the game board.
+
+ The audio output of the SN76477 isn't actually used. Rather the
+ signal from before the output amplifier is taken and used to gate
+ distortion elements in the analog filter network.
+
+ +-----+----------------------------------------------------------+
+ | Bit | Function |
+ +-----+----------------------------------------------------------+
+ | 1 | Multiplexed data bit 1 |
+ | 2 | Multiplexed data bit 2 |
+ | 3 | Multiplexed data bit 3 |
+ | 4 | Multiplexed data bit 4 |
+ | 5 | Multiplexed data bit 5 |
+ | 6 | Multiplexed data bit 6 |
+ | 7 | Multiplexed data bit 7 |
+ | 8 | Multiplexed data bit 8 |
+ | 9 | SN76477/distortion control (positive edge trigger) |
+ | 10 | High octave key 13 |
+ | 11 | Key/SLF resistor select A |
+ | 12 | Key/SLF resistor select B |
+ | 13 | Key/SLF resistor control |
+ | 14 | Gates 22k/10nF low-pass filter and one SN-driven effect |
+ | 15 | SN76477 VCO select (inverted) |
+ | 16 | TMS3615 reset |
+ +-----+----------------------------------------------------------+
+
+ +-------+----------+-----------------------------------+
+ | 11-13 | SLF res. | Key select |
+ +-------+----------+-----------------------------------+
+ | 0 | 27k | |
+ | 1 | 22k | |
+ | 2 | 22k | |
+ | 3 | 12k | |
+ | 4 | inf. | |
+ | 5 | inf. | Low octave 1-8 |
+ | 6 | inf. | Low octave 9-13, high octave 2-4 |
+ | 7 | inf. | High octave 5-12 |
+ +-------+----------+-----------------------------------+
+
+ When bit 13 is high, no SLF control resistor is connected to the
+ CSG. When bit 13 is low, bits 11 and 12 select between 27k, 22k and
+ 12k.
+
+ When bit 13 is high, the clock input of a latch driving eight of
+ TMS3615 key inputs will be driven low, depending on bits 11 and 12.
+ These latches are positive edge triggered, and you have to beware of
+ glitches, so the safe way to set key inputs is:
+ * Ensure bit 13 is low
+ * Write desired key data pattern to CSOUND1
+ * Write CSOUND2 setting bits 11 and 12 to select keys to set
+ * Write CSOUND2 setting bit 13 high
+ * Write CSOUND2 setting bit 13 low
+ * Write CSOUND2 setting bits 11 and 12 to select SLF resistor
+
+ Note that the SLF resistor will necessarily thrash around during the
+ process of setting key data. It's a side-effect of the way control
+ lines are overloaded.
+
+ The SN76477 control bits are defined as follows:
+
+ +-----+---------------------------------------------------------+
+ | Bit | Function |
+ +-----+---------------------------------------------------------+
+ | 1 | Noise filter/VCO resistor select A |
+ | 2 | Noise filter/VCO resistor select B |
+ | 3 | Noise filter/VCO resistor select C |
+ | 4 | AB SOUND (connected to System Inhibit input) |
+ | 5 | VCO/NOISE (connected to Mixer Select B input) |
+ | 6 | DEGR (controls a distortion element in filter network) |
+ | 7 | FILT (gates 10nF capacitor across distortion elements) |
+ | 8 | A (controls a distortion element in filter network) |
+ +-----+---------------------------------------------------------+
+
+*/
+
+WRITE8_MEMBER(laserbat_state::csound2_w)
+{
+ // there are a bunch of edge-triggered things, so grab changes
+ unsigned const diff = data ^ m_csound2;
+
+ // SN76477 and distortion control
+ if (data & diff & 0x01)
+ {
+ switch (m_csound1 & 0x07)
{
case 0x00:
- noise_filter_res = RES_K(270);
- vco_res = RES_K(47);
+ m_csg->noise_filter_res_w(RES_K(270)); // R30
+ m_csg->vco_res_w(RES_K(47)); // R47
break;
case 0x01:
- noise_filter_res = RES_K(220);
- vco_res = RES_K(27);
+ m_csg->noise_filter_res_w(RES_K(220)); // R23
+ m_csg->vco_res_w(RES_K(27)); // R40
break;
case 0x02:
- noise_filter_res = RES_K(150);
- vco_res = RES_K(22);
+ m_csg->noise_filter_res_w(RES_K(150)); // R24
+ m_csg->vco_res_w(RES_K(22)); // R41
break;
case 0x03:
- noise_filter_res = RES_K(120);
- vco_res = RES_K(15);
+ m_csg->noise_filter_res_w(RES_K(120)); // R25
+ m_csg->vco_res_w(RES_K(15)); // R42
break;
case 0x04:
- noise_filter_res = RES_K(82);
- vco_res = RES_K(12);
+ m_csg->noise_filter_res_w(RES_K(82)); // R29
+ m_csg->vco_res_w(RES_K(12)); // R46
break;
case 0x05:
- noise_filter_res = RES_K(68);
- vco_res = RES_K(8.2);
+ m_csg->noise_filter_res_w(RES_K(68)); // R28
+ m_csg->vco_res_w(RES_K(8.2)); // R45
break;
case 0x06:
- noise_filter_res = RES_K(47);
- vco_res = RES_K(6.8);
+ m_csg->noise_filter_res_w(RES_K(47)); // R27
+ m_csg->vco_res_w(RES_K(6.8)); // R44
break;
case 0x07:
- noise_filter_res = RES_K(33);
- vco_res = RES_K(4.7);
+ m_csg->noise_filter_res_w(RES_K(33)); // R26
+ m_csg->vco_res_w(RES_K(4.7)); // R43
break;
}
-
- m_sn->noise_filter_res_w(noise_filter_res);
- m_sn->vco_res_w(vco_res);
-
- m_sn->enable_w((m_csound1 & 0x08) ? 1 : 0); // AB SOUND
- m_sn->mixer_b_w((m_csound1 & 0x10) ? 1 : 0); // _VCO/NOISE
-
- m_degr = (m_csound1 & 0x20) ? 1 : 0;
- m_filt = (m_csound1 & 0x40) ? 1 : 0;
- m_a = (m_csound1 & 0x80) ? 1 : 0;
- m_us = 0; // sn76477 pin 12
+ m_csg->enable_w((m_csound1 & 0x08) ? 1 : 0);
+ m_csg->mixer_b_w((m_csound1 & 0x10) ? 1 : 0);
+ // TODO: DEGR/FILT/A
}
- m_sn->vco_w((data & 0x40) ? 0 : 1);
+ // edge-triggered latches plus a dedicated bit for note control
+ m_keys = (m_keys & 0x00ffffff) | ((data & 0x02) ? 0x01000000 : 0x00000000);
+ if ((m_csound2 & 0x10) && (diff & 0x1c))
+ {
+ switch (m_csound2 & 0x0c)
+ {
+ case 0x00:
+ break;
+ case 0x04:
+ m_keys = (m_keys & 0x01ffff00) | (unsigned(m_csound1) << 0);
+ break;
+ case 0x08:
+ m_keys = (m_keys & 0x01ff00ff) | (unsigned(m_csound1) << 8);
+ break;
+ case 0x0c:
+ m_keys = (m_keys & 0x0100ffff) | (unsigned(m_csound1) << 16);
+ break;
+ }
+ }
+ m_synth_low->enable_w((m_keys >> 0) & 0x01fff);
+ m_synth_high->enable_w((m_keys >> 12) & 0x01ffe);
- switch((data & 0x1c) >> 2)
+ // bits 11-13 set the SLF control register directly
+ switch (data & 0x1c)
{
- case 0x00:
- m_sn->slf_res_w(RES_K(27));
- break;
- case 0x01:
- m_sn->slf_res_w(RES_K(22));
+ case 0x00: // R54
+ m_csg->slf_res_w(RES_K(27));
break;
- case 0x02:
- m_sn->slf_res_w(RES_K(22));
+ case 0x04: // R53
+ case 0x08: // R52
+ m_csg->slf_res_w(RES_K(22));
break;
- case 0x03:
- m_sn->slf_res_w(RES_K(12));
+ case 0x0c: // R51
+ m_csg->slf_res_w(RES_K(12));
break;
- case 0x04: // not connected
- break;
- case 0x05: // SL1
- m_ksound1 = m_csound1;
- break;
- case 0x06: // SL2
- m_ksound2 = m_csound1;
- break;
- case 0x07: // SL3
- m_ksound3 = m_csound1;
+ default: // NC
+ m_csg->slf_res_w(RES_INF);
break;
}
- ksound = ((data & 0x02) << 23) + (m_ksound3 << 16) + (m_ksound2 << 8) + m_ksound1;
+ // TODO: BIT14 filter control
+
+ // inverted VCO select
+ m_csg->vco_w((data & 0x40) ? 0 : 1);
+
+ // TODO: BIT15 TMS reset
- m_tms1->enable_w(ksound & 0x1fff);
- m_tms2->enable_w((ksound >> 13) << 1);
+ // keep for detecting changes next time
+ m_csound2 = data;
+}
+
+
+/*
+ The Cat and Mouse sound board has a 6802 processor with three ROMs,
+ a 6821 PIA, two AY-3-8910 PSGs, and some other logic and analog
+ circuitry. Unfortunately we lack a schematic, so all knowledge of
+ this board is based on tracing the sound program.
+
+ The 6821 PIA is mapped at addresses $005C..$005F. The known PIA
+ signal assignments are as follows:
+
+ +------+-----------------------+
+ | PA0 | PSG1/PSG2 DA0 |
+ | PA1 | PSG1/PSG2 DA1 |
+ | PA2 | PSG1/PSG2 DA2 |
+ | PA3 | PSG1/PSG2 DA3 |
+ | PA4 | PSG1/PSG2 DA4 |
+ | PA5 | PSG1/PSG2 DA5 |
+ | PA6 | PSG1/PSG2 DA6 |
+ | PA7 | PSG1/PSG2 DA7 |
+ | PB0 | PSG1 BC1 |
+ | PB1 | PSG1 BDIR |
+ | PB2 | PSG2 BC1 |
+ | PB3 | PSG2 BDIR |
+ | CA1 | Host interface bit 6 |
+ | CB1 | periodic IRQ source |
+ | IRQA | 6802 NMI |
+ | IRQB | 6802 IRQ |
+ +------+-----------------------+
+
+ The program makes use of I/O port A on the first PSG as outputs. At
+ a guess, it could have the same function as it does on other
+ Zaccaria sound boards.
+
+ The first PSG receives commands from the game board in the low five
+ bits of port B. Commands are processed on receiving an NMI. The
+ sound program always masks out the high three bits of the value so
+ they could be connected to anything on the board.
+
+ The I/O ports on the second PSG don't appear to be used at all.
+
+ The game board sends commands to the sound board over a 16-bit
+ unidirectional data bus. The CPU cannot write all sixteen lines
+ atomically, it write to lines 1-8 as one group and 9-16 as another
+ group. However only seven lines are actually connected to the sound
+ board:
+
+ +-----+----------+-------------+
+ | Bit | Name | Connection |
+ +-----+----------+-------------+
+ | 1 | SOUND 0 | PSG1 IOB0 |
+ | 2 | SOUND 1 | PSG1 IOB1 |
+ | 3 | SOUND 2 | PSG1 IOB2 |
+ | 4 | SOUND 3 | PSG1 IOB3 |
+ | 5 | SOUND 4 | PSG1 IOB4 |
+ | 6 | SOUND 5 | PIA CA1 |
+ | 7 | | |
+ | 8 | | |
+ | 9 | | |
+ | 10 | | |
+ | 11 | | |
+ | 12 | | |
+ | 13 | | |
+ | 14 | | |
+ | 15 | | |
+ | 16 | RESET | Unknown |
+ +-----+----------+-------------+
+
+ There could well be other connections on the sound board - these are
+ just what can be deduced by tracing the sound program.
+
+ The game board makes the the audio output from the first S2636 PVI
+ (5E) available on a pin at the sound board interface connector, but
+ it isn't routed anywhere.
+*/
+
+WRITE8_MEMBER(catnmous_state::csound1_w)
+{
+ m_pia->ca1_w((data & 0x20) ? 1 : 0);
+ m_csound1 = data;
+}
+
+WRITE8_MEMBER(catnmous_state::csound2_w)
+{
+ // the top bit is called RESET on the wiring diagram - assume it resets the sound CPU
+ m_audiocpu->set_input_line(INPUT_LINE_RESET, (data & 0x80) ? ASSERT_LINE : CLEAR_LINE);
+ m_csound2 = data;
+}
+
+READ8_MEMBER(catnmous_state::pia_porta_r)
+{
+ UINT8 const control = m_pia->b_output();
+ UINT8 data = 0xff;
+
+ if (0x01 == (control & 0x03))
+ data &= m_psg1->data_r(space, 0);
+
+ if (0x04 == (control & 0x0c))
+ data &= m_psg2->data_r(space, 0);
- m_bit14 = (data & 0x20) ? 1 : 0;
+ return data;
+}
+
+WRITE8_MEMBER(catnmous_state::pia_porta_w)
+{
+ UINT8 const control = m_pia->b_output();
+
+ if (control & 0x02)
+ m_psg1->data_address_w(space, (control >> 0) & 0x01, data);
+
+ if (control & 0x08)
+ m_psg2->data_address_w(space, (control >> 2) & 0x01, data);
+}
- // (data & 0x80) = reset
+WRITE8_MEMBER(catnmous_state::pia_portb_w)
+{
+ if (data & 0x02)
+ m_psg1->data_address_w(space, (data >> 0) & 0x01, m_pia->a_output());
+
+ if (data & 0x08)
+ m_psg2->data_address_w(space, (data >> 2) & 0x01, m_pia->a_output());
+}
+
+WRITE_LINE_MEMBER(catnmous_state::pia_irqa)
+{
+ m_audiocpu->set_input_line(INPUT_LINE_NMI, state ? ASSERT_LINE : CLEAR_LINE);
+}
+
+WRITE_LINE_MEMBER(catnmous_state::pia_irqb)
+{
+ m_audiocpu->set_input_line(INPUT_LINE_IRQ0, state ? ASSERT_LINE : CLEAR_LINE);
+}
+
+WRITE8_MEMBER(catnmous_state::psg1_porta_w)
+{
+ // similar to zaccaria.c since we have no clue how this board really works
+ // this code could be completely wrong/inappropriate for this game for all we know
+ static double const table[8] = {
+ RES_K(8.2),
+ RES_R(820),
+ RES_K(3.3),
+ RES_R(150),
+ RES_K(5.6),
+ RES_R(390),
+ RES_K(1.5),
+ RES_R(47) };
+ RES_VOLTAGE_DIVIDER(RES_K(4.7), table[data & 0x07]);
+ m_psg2->set_volume(1, 150 * RES_VOLTAGE_DIVIDER(RES_K(4.7), table[data & 0x07]));
+}
+
+READ8_MEMBER(catnmous_state::psg1_portb_r)
+{
+ // the sound program masks out the three most significant bits
+ // assume they're not connected and read high from the internal pull-ups
+ return m_csound1 | 0xe0;
+}
+
+INTERRUPT_GEN_MEMBER(catnmous_state::cb1_toggle)
+{
+ m_cb1 = !m_cb1;
+ m_pia->cb1_w(m_cb1 ? 1 : 0);
}
diff --git a/src/mame/audio/leland.cpp b/src/mame/audio/leland.cpp
index 237f17b7b64..6cf7e4740ad 100644
--- a/src/mame/audio/leland.cpp
+++ b/src/mame/audio/leland.cpp
@@ -1,5 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders:Aaron Giles
+// copyright-holders:Aaron Giles,Paul Leaman
/***************************************************************************
Cinemat/Leland driver
diff --git a/src/mame/audio/lynx.cpp b/src/mame/audio/lynx.cpp
index ba31b88ba06..2d58677f373 100644
--- a/src/mame/audio/lynx.cpp
+++ b/src/mame/audio/lynx.cpp
@@ -159,8 +159,8 @@ void lynx_sound_device::register_save()
void lynx_sound_device::init()
{
- m_shift_mask = auto_alloc_array_clear(machine(), int, 512);
- m_shift_xor = auto_alloc_array_clear(machine(), int, 4096);
+ m_shift_mask = make_unique_clear<int[]>(512);
+ m_shift_xor = make_unique_clear<int[]>(4096);
for (int i = 0; i < 512; i++)
{
diff --git a/src/mame/audio/lynx.h b/src/mame/audio/lynx.h
index a3738f271b6..8bd8bdd3067 100644
--- a/src/mame/audio/lynx.h
+++ b/src/mame/audio/lynx.h
@@ -57,8 +57,8 @@ protected:
lynx_sound_timer_delegate m_timer_delegate; // this calls lynx_timer_count_down from the driver state
float m_usec_per_sample;
- int *m_shift_mask;
- int *m_shift_xor;
+ std::unique_ptr<int[]> m_shift_mask;
+ std::unique_ptr<int[]> m_shift_xor;
UINT8 m_attenuation_enable;
UINT8 m_master_enable;
LYNX_AUDIO m_audio[4];
diff --git a/src/mame/audio/m72.cpp b/src/mame/audio/m72.cpp
index 69566d713b8..2440b42ade5 100644
--- a/src/mame/audio/m72.cpp
+++ b/src/mame/audio/m72.cpp
@@ -49,12 +49,12 @@ Shisensho II 1993 Rev 3.34 M81 Yes
const device_type M72 = &device_creator<m72_audio_device>;
m72_audio_device::m72_audio_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
- : device_t(mconfig, M72, "Irem M72 Audio Custom", tag, owner, clock, "m72_audio", __FILE__),
- device_sound_interface(mconfig, *this),
- m_irqvector(0),
- m_sample_addr(0),
- m_samples(nullptr),
- m_samples_size(0)
+ : device_t(mconfig, M72, "Irem M72 Audio Custom", tag, owner, clock, "m72_audio", __FILE__)
+ , device_sound_interface(mconfig, *this)
+ , m_irqvector(0)
+ , m_sample_addr(0)
+ , m_samples(*this, "^samples")
+ , m_samples_size(0)
{
}
@@ -74,8 +74,7 @@ void m72_audio_device::device_config_complete()
void m72_audio_device::device_start()
{
- m_samples = machine().root_device().memregion("samples")->base();
- m_samples_size = machine().root_device().memregion("samples")->bytes();
+ m_samples_size = m_samples.bytes();
m_space = &machine().device("soundcpu")->memory().space(AS_IO);
m_dac = machine().device<dac_device>("dac");
diff --git a/src/mame/audio/m72.h b/src/mame/audio/m72.h
index 71ed62fa35d..4b8e96d4d52 100644
--- a/src/mame/audio/m72.h
+++ b/src/mame/audio/m72.h
@@ -51,7 +51,7 @@ private:
// internal state
UINT8 m_irqvector;
UINT32 m_sample_addr;
- UINT8 *m_samples;
+ optional_region_ptr<UINT8> m_samples;
UINT32 m_samples_size;
address_space *m_space;
dac_device *m_dac;
diff --git a/src/mame/audio/m79amb.cpp b/src/mame/audio/m79amb.cpp
index 3d9df21221f..62285971eff 100644
--- a/src/mame/audio/m79amb.cpp
+++ b/src/mame/audio/m79amb.cpp
@@ -1,4 +1,4 @@
-// license:???
+// license:BSD-3-Clause
// copyright-holders:Derrick Renaud
/************************************************************************
* m79amb Sound System Analog emulation
@@ -336,7 +336,7 @@ WRITE8_MEMBER(m79amb_state::m79amb_8003_w)
{
/* Self Test goes low on reset and lights LED */
/* LED goes off on pass */
- output_set_value("SELF_TEST", data & 0x01);
+ output().set_value("SELF_TEST", data & 0x01);
m_discrete->write(space, M79AMB_MC_REV_EN, data & 0x02);
m_discrete->write(space, M79AMB_MC_CONTROL_EN, data & 0x04);
m_discrete->write(space, M79AMB_TANK_TRUCK_JEEP_EN, data & 0x08);
diff --git a/src/mame/audio/mac.cpp b/src/mame/audio/mac.cpp
index 57ad49aa96f..821c15a9afb 100644
--- a/src/mame/audio/mac.cpp
+++ b/src/mame/audio/mac.cpp
@@ -62,13 +62,13 @@ void mac_sound_device::device_start()
{
mac_state *mac = machine().driver_data<mac_state>();
- m_snd_cache = auto_alloc_array_clear(machine(), UINT8, SND_CACHE_SIZE);
+ m_snd_cache = make_unique_clear<UINT8[]>(SND_CACHE_SIZE);
m_mac_stream = machine().sound().stream_alloc(*this, 0, 1, MAC_SAMPLE_RATE);
m_ram = machine().device<ram_device>(RAM_TAG);
m_mac_model = mac->m_model;
- save_pointer(NAME(m_snd_cache), SND_CACHE_SIZE);
+ save_pointer(NAME(m_snd_cache.get()), SND_CACHE_SIZE);
save_item(NAME(m_sample_enable));
save_item(NAME(m_snd_cache_len));
save_item(NAME(m_snd_cache_head));
diff --git a/src/mame/audio/madalien.cpp b/src/mame/audio/madalien.cpp
index 6ef4fd2b7cd..59990445d3e 100644
--- a/src/mame/audio/madalien.cpp
+++ b/src/mame/audio/madalien.cpp
@@ -1,4 +1,4 @@
-// license:???
+// license:BSD-3-Clause
// copyright-holders:Derrick Renaud
/************************************************************************
* madalien Sound System Analog emulation
diff --git a/src/mame/audio/micro3d.cpp b/src/mame/audio/micro3d.cpp
index 4e7cea003e9..aeed7f03bdf 100644
--- a/src/mame/audio/micro3d.cpp
+++ b/src/mame/audio/micro3d.cpp
@@ -68,9 +68,9 @@ static void filter_init(running_machine &machine, lp_filter *iir, double fs)
iir->ProtoCoef[1].b1 = 1.847759;
iir->ProtoCoef[1].b2 = 1.0;
- iir->coef = (float *)auto_alloc_array_clear(machine, float, 4 * 2 + 1);
+ iir->coef = make_unique_clear<float[]>(4 * 2 + 1);
iir->fs = fs;
- iir->history = (float *)auto_alloc_array_clear(machine, float, 2 * 2);
+ iir->history = make_unique_clear<float[]>(2 * 2);
}
static void prewarp(double *a0, double *a1, double *a2,double fc, double fs)
@@ -107,7 +107,7 @@ static void recompute_filter(lp_filter *iir, double k, double q, double fc)
int nInd;
double a0, a1, a2, b0, b1, b2;
- float *coef = iir->coef + 1;
+ float *coef = iir->coef.get() + 1;
for (nInd = 0; nInd < 2; nInd++)
{
@@ -270,9 +270,9 @@ void micro3d_sound_device::sound_stream_update(sound_stream &stream, stream_samp
input += white;
input *= 200.0f;
- coef_ptr = iir->coef;
+ coef_ptr = iir->coef.get();
- hist1_ptr = iir->history;
+ hist1_ptr = iir->history.get();
hist2_ptr = hist1_ptr + 1;
/* 1st number of coefficients array is overall input scale factor, * or filter gain */
diff --git a/src/mame/audio/mw8080bw.cpp b/src/mame/audio/mw8080bw.cpp
index 3c2b7f7a43a..30e8bfe1120 100644
--- a/src/mame/audio/mw8080bw.cpp
+++ b/src/mame/audio/mw8080bw.cpp
@@ -173,7 +173,7 @@ WRITE8_MEMBER(mw8080bw_state::seawolf_audio_w)
/* if (data & 0x10) enable MINE HIT sound */
if (rising_bits & 0x10) m_samples->start(4, 4);
- coin_counter_w(machine(), 0, (data >> 5) & 0x01);
+ machine().bookkeeping().coin_counter_w(0, (data >> 5) & 0x01);
/* D6 and D7 are not connected */
@@ -218,7 +218,7 @@ WRITE8_MEMBER(mw8080bw_state::gunfight_audio_w)
{
/* D0 and D1 are just tied to 1k resistors */
- coin_counter_w(machine(), 0, (data >> 2) & 0x01);
+ machine().bookkeeping().coin_counter_w(0, (data >> 2) & 0x01);
/* the 74175 latches and inverts the top 4 bits */
switch ((~data >> 4) & 0x0f)
@@ -339,7 +339,7 @@ WRITE8_MEMBER(mw8080bw_state::tornbase_audio_w)
/* if (data & 0x40) enable WHISTLE sound */
}
- coin_counter_w(machine(), 0, (data >> 7) & 0x01);
+ machine().bookkeeping().coin_counter_w(0, (data >> 7) & 0x01);
}
@@ -380,7 +380,7 @@ WRITE8_MEMBER(mw8080bw_state::zzzap_audio_2_w)
before it appears again, not sure what
it is supposed to sound like) */
- coin_counter_w(machine(), 0, (data >> 5) & 0x01);
+ machine().bookkeeping().coin_counter_w(0, (data >> 5) & 0x01);
/* D4, D6 and D7 are not connected */
}
@@ -812,7 +812,7 @@ WRITE8_MEMBER(mw8080bw_state::boothill_audio_w)
{
/* D0 and D1 are not connected */
- coin_counter_w(machine(), 0, (data >> 2) & 0x01);
+ machine().bookkeeping().coin_counter_w(0, (data >> 2) & 0x01);
m_discrete->write(space, BOOTHILL_GAME_ON_EN, (data >> 3) & 0x01);
@@ -1043,7 +1043,7 @@ WRITE8_MEMBER(mw8080bw_state::checkmat_audio_w)
m_discrete->write(space, CHECKMAT_BOOM_EN, (data >> 1) & 0x01);
- coin_counter_w(machine(), 0, (data >> 2) & 0x01);
+ machine().bookkeeping().coin_counter_w(0, (data >> 2) & 0x01);
machine().sound().system_enable((data >> 3) & 0x01);
@@ -1252,7 +1252,7 @@ WRITE8_MEMBER(mw8080bw_state::desertgu_audio_1_w)
{
/* D0 and D1 are not connected */
- coin_counter_w(machine(), 0, (data >> 2) & 0x01);
+ machine().bookkeeping().coin_counter_w(0, (data >> 2) & 0x01);
m_discrete->write(space, DESERTGU_GAME_ON_EN, (data >> 3) & 0x01);
@@ -1272,7 +1272,7 @@ WRITE8_MEMBER(mw8080bw_state::desertgu_audio_2_w)
m_discrete->write(space, DESERTGU_TRIGGER_CLICK_EN, (data >> 1) & 0x01);
- output_set_value("Player1_Gun_Recoil", (data >> 2) & 0x01);
+ output().set_value("Player1_Gun_Recoil", (data >> 2) & 0x01);
m_desertgun_controller_select = (data >> 3) & 0x01;
@@ -1525,7 +1525,7 @@ WRITE8_MEMBER(mw8080bw_state::dplay_audio_w)
m_discrete->write(space, DPLAY_GAME_ON_EN, (data >> 4) & 0x01);
- coin_counter_w(machine(), 0, (data >> 5) & 0x01);
+ machine().bookkeeping().coin_counter_w(0, (data >> 5) & 0x01);
/* D6 and D7 are not connected */
}
@@ -1573,7 +1573,7 @@ WRITE8_MEMBER(mw8080bw_state::gmissile_audio_1_w)
/* D0 and D1 are not connected */
- coin_counter_w(machine(), 0, (data >> 2) & 0x01);
+ machine().bookkeeping().coin_counter_w(0, (data >> 2) & 0x01);
machine().sound().system_enable((data >> 3) & 0x01);
@@ -1581,14 +1581,14 @@ WRITE8_MEMBER(mw8080bw_state::gmissile_audio_1_w)
if (rising_bits & 0x10) m_samples2->start(0, 0);
/* if (data & 0x20) enable LEFT EXPLOSION sound (goes to left speaker) */
- output_set_value("L_EXP_LIGHT", (data >> 5) & 0x01);
+ output().set_value("L_EXP_LIGHT", (data >> 5) & 0x01);
if (rising_bits & 0x20) m_samples1->start(0, 1);
/* if (data & 0x40) enable LEFT MISSILE sound (goes to left speaker) */
if (rising_bits & 0x40) m_samples1->start(0, 0);
/* if (data & 0x80) enable RIGHT EXPLOSION sound (goes to right speaker) */
- output_set_value("R_EXP_LIGHT", (data >> 7) & 0x01);
+ output().set_value("R_EXP_LIGHT", (data >> 7) & 0x01);
if (rising_bits & 0x80) m_samples2->start(0, 1);
m_port_1_last = data;
@@ -1662,7 +1662,7 @@ WRITE8_MEMBER(mw8080bw_state::m4_audio_1_w)
/* D0 and D1 are not connected */
- coin_counter_w(machine(), 0, (data >> 2) & 0x01);
+ machine().bookkeeping().coin_counter_w(0, (data >> 2) & 0x01);
machine().sound().system_enable((data >> 3) & 0x01);
@@ -1912,7 +1912,7 @@ MACHINE_CONFIG_END
WRITE8_MEMBER(mw8080bw_state::clowns_audio_1_w)
{
- coin_counter_w(machine(), 0, (data >> 0) & 0x01);
+ machine().bookkeeping().coin_counter_w(0, (data >> 0) & 0x01);
m_clowns_controller_select = (data >> 1) & 0x01;
@@ -2277,7 +2277,7 @@ MACHINE_CONFIG_END
WRITE8_MEMBER(mw8080bw_state::spacwalk_audio_1_w)
{
- coin_counter_w(machine(), 0, (data >> 0) & 0x01);
+ machine().bookkeeping().coin_counter_w(0, (data >> 0) & 0x01);
m_clowns_controller_select = (data >> 1) & 0x01;
@@ -2527,7 +2527,7 @@ WRITE8_MEMBER(mw8080bw_state::shuffle_audio_2_w)
{
m_discrete->write(space, SHUFFLE_FOUL_EN, (data >> 0) & 0x01);
- coin_counter_w(machine(), 0, (data >> 1) & 0x01);
+ machine().bookkeeping().coin_counter_w(0, (data >> 1) & 0x01);
/* D2-D7 are not connected */
}
@@ -2689,7 +2689,7 @@ WRITE8_MEMBER(mw8080bw_state::dogpatch_audio_w)
{
/* D0, D1 and D7 are not used */
- coin_counter_w(machine(), 0, (data >> 2) & 0x01);
+ machine().bookkeeping().coin_counter_w(0, (data >> 2) & 0x01);
machine().sound().system_enable((data >> 3) & 0x01);
m_discrete->write(space, DOGPATCH_GAME_ON_EN, (data >> 3) & 0x01);
@@ -3242,7 +3242,7 @@ WRITE8_MEMBER(mw8080bw_state::spcenctr_audio_3_w)
m_spcenctr_strobe_state = (data >> 2) & 0x01;
- output_set_value("LAMP", (data >> 3) & 0x01);
+ output().set_value("LAMP", (data >> 3) & 0x01);
m_discrete->write(space, SPCENCTR_BONUS_EN, (data >> 4) & 0x01);
@@ -3290,7 +3290,7 @@ WRITE8_MEMBER(mw8080bw_state::phantom2_audio_1_w)
machine().sound().system_mute(!(data & 0x20));
machine().sound().system_enable((data >> 2) & 0x01);
- coin_counter_w(machine(), 0, (data >> 3) & 0x01);
+ machine().bookkeeping().coin_counter_w(0, (data >> 3) & 0x01);
/* if (data & 0x10) enable RADAR sound */
@@ -3309,7 +3309,7 @@ WRITE8_MEMBER(mw8080bw_state::phantom2_audio_2_w)
/* if (data & 0x08) enable EXPLOSION sound */
if (rising_bits & 0x08) m_samples->start(1, 1);
- output_set_value("EXPLAMP", (data >> 4) & 0x01);
+ output().set_value("EXPLAMP", (data >> 4) & 0x01);
/* set JET SOUND FREQ((data >> 5) & 0x07) 0, if no jet sound */
@@ -3410,7 +3410,7 @@ WRITE8_MEMBER(mw8080bw_state::bowler_audio_1_w)
{
/* D0 - selects controller on the cocktail PCB */
- coin_counter_w(machine(), 0, (data >> 1) & 0x01);
+ machine().bookkeeping().coin_counter_w(0, (data >> 1) & 0x01);
machine().sound().system_enable((data >> 2) & 0x01);
diff --git a/src/mame/audio/nitedrvr.cpp b/src/mame/audio/nitedrvr.cpp
index ad42b648748..e3a0c5000a7 100644
--- a/src/mame/audio/nitedrvr.cpp
+++ b/src/mame/audio/nitedrvr.cpp
@@ -1,4 +1,4 @@
-// license:???
+// license:BSD-3-Clause
// copyright-holders:Derrick Renaud
/*************************************************************************
diff --git a/src/mame/audio/norautp.cpp b/src/mame/audio/norautp.cpp
index a285e2e2e64..73eaf1fa12b 100644
--- a/src/mame/audio/norautp.cpp
+++ b/src/mame/audio/norautp.cpp
@@ -1,4 +1,4 @@
-// license:???
+// license:BSD-3-Clause
// copyright-holders:Derrick Renaud, Roberto Fresca
/************************************************************************
* Noraut/Kimble/Kramer Poker Sound System Analog emulation
diff --git a/src/mame/audio/orbit.cpp b/src/mame/audio/orbit.cpp
index 228382696d6..2deacd5afb3 100644
--- a/src/mame/audio/orbit.cpp
+++ b/src/mame/audio/orbit.cpp
@@ -1,4 +1,4 @@
-// license:???
+// license:BSD-3-Clause
// copyright-holders:Derrick Renaud
/*************************************************************************
diff --git a/src/mame/audio/phoenix.cpp b/src/mame/audio/phoenix.cpp
index 02c9cca051a..3bcd72661ea 100644
--- a/src/mame/audio/phoenix.cpp
+++ b/src/mame/audio/phoenix.cpp
@@ -1,4 +1,4 @@
-// license:???
+// license:BSD-3-Clause
// copyright-holders:Juergen Buchmueller, Derrick Renaud
/****************************************************************************
*
@@ -83,7 +83,7 @@ void phoenix_sound_device::device_start()
m_discrete = machine().device<discrete_device>("discrete");
m_tms = machine().device<tms36xx_device>("tms");
- m_poly18 = auto_alloc_array(machine(), UINT32, 1ul << (18-5));
+ m_poly18 = std::make_unique<UINT32[]>(1ul << (18-5));
shiftreg = 0;
for( i = 0; i < (1ul << (18-5)); i++ )
@@ -112,7 +112,7 @@ void phoenix_sound_device::device_start()
save_item(NAME(m_noise_state.polyoffs));
save_item(NAME(m_noise_state.lowpass_counter));
save_item(NAME(m_noise_state.lowpass_polybit));
- save_pointer(NAME(m_poly18), (1ul << (18-5)));
+ save_pointer(NAME(m_poly18.get()), (1ul << (18-5)));
}
int phoenix_sound_device::update_c24(int samplerate)
diff --git a/src/mame/audio/pleiads.cpp b/src/mame/audio/pleiads.cpp
index f5c00fc3fdf..b838998c971 100644
--- a/src/mame/audio/pleiads.cpp
+++ b/src/mame/audio/pleiads.cpp
@@ -653,7 +653,7 @@ void pleiads_sound_device::common_start()
m_tms = machine().device<tms36xx_device>("tms");
m_pc4.level = PC4_MIN;
- m_poly18 = auto_alloc_array_clear(machine(), UINT32, 1ul << (18-5));
+ m_poly18 = make_unique_clear<UINT32[]>(1ul << (18-5));
shiftreg = 0;
for( i = 0; i < (1ul << (18-5)); i++ )
@@ -715,7 +715,7 @@ void pleiads_sound_device::common_start()
save_item(NAME(m_noise.counter));
save_item(NAME(m_noise.polyoffs));
save_item(NAME(m_noise.freq));
- save_pointer(NAME(m_poly18), (1ul << (18-5)));
+ save_pointer(NAME(m_poly18.get()), (1ul << (18-5)));
}
//-------------------------------------------------
diff --git a/src/mame/audio/pleiads.h b/src/mame/audio/pleiads.h
index 3978cb6c6d1..e47b1b8e659 100644
--- a/src/mame/audio/pleiads.h
+++ b/src/mame/audio/pleiads.h
@@ -79,7 +79,7 @@ protected:
int m_sound_latch_b;
int m_sound_latch_c; /* part of the videoreg_w latch */
- UINT32 *m_poly18;
+ std::unique_ptr<UINT32[]> m_poly18;
int m_polybit;
pl_t_state m_tone1;
diff --git a/src/mame/audio/polepos.cpp b/src/mame/audio/polepos.cpp
index ac48f57574e..e3e23b2fdef 100644
--- a/src/mame/audio/polepos.cpp
+++ b/src/mame/audio/polepos.cpp
@@ -1,4 +1,4 @@
-// license:???
+// license:BSD-3-Clause
// copyright-holders:Derrick Renaud
/***************************************************************************
polepos.c
diff --git a/src/mame/audio/polyplay.cpp b/src/mame/audio/polyplay.cpp
index 3d68c601082..94340359c90 100644
--- a/src/mame/audio/polyplay.cpp
+++ b/src/mame/audio/polyplay.cpp
@@ -1,4 +1,4 @@
-// license:???
+// license:BSD-3-Clause
// copyright-holders:Martin Buchholz
/***************************************************************************
diff --git a/src/mame/audio/poolshrk.cpp b/src/mame/audio/poolshrk.cpp
index 188d072dda3..2f030135d3a 100644
--- a/src/mame/audio/poolshrk.cpp
+++ b/src/mame/audio/poolshrk.cpp
@@ -1,4 +1,4 @@
-// license:???
+// license:BSD-3-Clause
// copyright-holders:Derrick Renaud
/*************************************************************************
diff --git a/src/mame/audio/pulsar.cpp b/src/mame/audio/pulsar.cpp
index b17a4413feb..f6790efddf2 100644
--- a/src/mame/audio/pulsar.cpp
+++ b/src/mame/audio/pulsar.cpp
@@ -53,14 +53,6 @@ static const char *const pulsar_sample_names[] =
};
-MACHINE_CONFIG_FRAGMENT( pulsar_audio )
- MCFG_SOUND_ADD("samples", SAMPLES, 0)
- MCFG_SAMPLES_CHANNELS(12)
- MCFG_SAMPLES_NAMES(pulsar_sample_names)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.5)
-MACHINE_CONFIG_END
-
-
/* sample IDs - must match sample file name table above */
enum
{
@@ -85,7 +77,6 @@ WRITE8_MEMBER( vicdual_state::pulsar_audio_1_w )
//int bitsGoneHigh;
int bitsGoneLow;
-
bitsChanged = m_port1State ^ data;
//bitsGoneHigh = bitsChanged & data;
bitsGoneLow = bitsChanged & ~data;
@@ -131,17 +122,15 @@ WRITE8_MEMBER( vicdual_state::pulsar_audio_1_w )
WRITE8_MEMBER( vicdual_state::pulsar_audio_2_w )
{
- static int port2State = 0;
int bitsChanged;
int bitsGoneHigh;
int bitsGoneLow;
-
- bitsChanged = port2State ^ data;
+ bitsChanged = m_port2State ^ data;
bitsGoneHigh = bitsChanged & data;
bitsGoneLow = bitsChanged & ~data;
- port2State = data;
+ m_port2State = data;
if ( bitsGoneLow & OUT_PORT_2_SIZZLE )
{
@@ -180,3 +169,13 @@ WRITE8_MEMBER( vicdual_state::pulsar_audio_2_w )
STOP( m_samples, SND_MOVMAZE );
}
}
+
+
+MACHINE_CONFIG_FRAGMENT( pulsar_audio )
+
+ /* samples */
+ MCFG_SOUND_ADD("samples", SAMPLES, 0)
+ MCFG_SAMPLES_CHANNELS(12)
+ MCFG_SAMPLES_NAMES(pulsar_sample_names)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.5)
+MACHINE_CONFIG_END
diff --git a/src/mame/audio/qix.cpp b/src/mame/audio/qix.cpp
index 8d9f6ecb7ca..a7e0bb55a0b 100644
--- a/src/mame/audio/qix.cpp
+++ b/src/mame/audio/qix.cpp
@@ -1,5 +1,5 @@
-// license:???
-// copyright-holders:John Butler, Ed Mueller, Aaron Giles
+// license:BSD-3-Clause
+// copyright-holders:Derrick Renaud,Couriersud
/*************************************************************************
audio/qix.c
@@ -116,8 +116,8 @@ WRITE8_MEMBER(qix_state::sync_sndpia1_porta_w)
WRITE8_MEMBER(qix_state::slither_coinctl_w)
{
- coin_lockout_w(machine(), 0, (~data >> 6) & 1);
- coin_counter_w(machine(), 0, (data >> 5) & 1);
+ machine().bookkeeping().coin_lockout_w(0, (~data >> 6) & 1);
+ machine().bookkeeping().coin_counter_w(0, (data >> 5) & 1);
}
diff --git a/src/mame/audio/redbaron.cpp b/src/mame/audio/redbaron.cpp
index ff50862cf7a..b8f71f1d5f2 100644
--- a/src/mame/audio/redbaron.cpp
+++ b/src/mame/audio/redbaron.cpp
@@ -65,7 +65,7 @@ void redbaron_sound_device::device_start()
{
int i;
- m_vol_lookup = auto_alloc_array(machine(), INT16, 32768);
+ m_vol_lookup = std::make_unique<INT16[]>(32768);
for( i = 0; i < 0x8000; i++ )
m_vol_lookup[0x7fff-i] = (INT16) (0x7fff/exp(1.0*i/4096));
diff --git a/src/mame/audio/redbaron.h b/src/mame/audio/redbaron.h
index dc65f9502fa..b7d11ae2ab7 100644
--- a/src/mame/audio/redbaron.h
+++ b/src/mame/audio/redbaron.h
@@ -22,7 +22,7 @@ protected:
virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) override;
private:
- INT16 *m_vol_lookup;
+ std::unique_ptr<INT16[]> m_vol_lookup;
INT16 m_vol_crash[16];
diff --git a/src/mame/audio/seibu.cpp b/src/mame/audio/seibu.cpp
index b78e142a99a..9883e9b9a25 100644
--- a/src/mame/audio/seibu.cpp
+++ b/src/mame/audio/seibu.cpp
@@ -115,13 +115,13 @@ void seibu_sound_device::device_start()
case 1:
get_custom_decrypt();
- memcpy(m_decrypted_opcodes, rom, length);
- apply_decrypt(rom, m_decrypted_opcodes, 0x2000);
+ memcpy(m_decrypted_opcodes.get(), rom, length);
+ apply_decrypt(rom, m_decrypted_opcodes.get(), 0x2000);
break;
case 2:
get_custom_decrypt();
- apply_decrypt(rom, m_decrypted_opcodes, length);
+ apply_decrypt(rom, m_decrypted_opcodes.get(), length);
break;
}
@@ -182,18 +182,18 @@ static UINT8 decrypt_opcode(int a,int src)
UINT8 *seibu_sound_device::get_custom_decrypt()
{
if (m_decrypted_opcodes)
- return m_decrypted_opcodes;
+ return m_decrypted_opcodes.get();
int size = memregion(":audiocpu")->bytes();
- m_decrypted_opcodes = auto_alloc_array_clear(machine(), UINT8, size);
- membank(":seibu_bank0d")->set_base(m_decrypted_opcodes);
+ m_decrypted_opcodes = make_unique_clear<UINT8[]>(size);
+ membank(":seibu_bank0d")->set_base(m_decrypted_opcodes.get());
if (size > 0x10000) {
- membank(":seibu_bank1d")->configure_entries(0, (size - 0x10000) / 0x8000, m_decrypted_opcodes + 0x10000, 0x8000);
+ membank(":seibu_bank1d")->configure_entries(0, (size - 0x10000) / 0x8000, m_decrypted_opcodes.get() + 0x10000, 0x8000);
membank(":seibu_bank1d")->set_entry(0);
} else
- membank(":seibu_bank1d")->set_base(m_decrypted_opcodes + 0x8000);
+ membank(":seibu_bank1d")->set_base(m_decrypted_opcodes.get() + 0x8000);
- return m_decrypted_opcodes;
+ return m_decrypted_opcodes.get();
}
void seibu_sound_device::apply_decrypt(UINT8 *rom, UINT8 *opcodes, int length)
@@ -276,8 +276,8 @@ WRITE8_MEMBER( seibu_sound_device::bank_w )
WRITE8_MEMBER( seibu_sound_device::coin_w )
{
- coin_counter_w(space.machine(), 0, data & 1);
- coin_counter_w(space.machine(), 1, data & 2);
+ space.machine().bookkeeping().coin_counter_w(0, data & 1);
+ space.machine().bookkeeping().coin_counter_w(1, data & 2);
}
READ8_MEMBER( seibu_sound_device::soundlatch_r )
diff --git a/src/mame/audio/seibu.h b/src/mame/audio/seibu.h
index 3a83f811e58..732ab5af314 100644
--- a/src/mame/audio/seibu.h
+++ b/src/mame/audio/seibu.h
@@ -72,7 +72,7 @@ protected:
private:
int m_encryption_mode;
- UINT8 *m_decrypted_opcodes;
+ std::unique_ptr<UINT8[]> m_decrypted_opcodes;
// internal state
device_t *m_sound_cpu;
diff --git a/src/mame/audio/skydiver.cpp b/src/mame/audio/skydiver.cpp
index 706a5f63b74..33377f6fe21 100644
--- a/src/mame/audio/skydiver.cpp
+++ b/src/mame/audio/skydiver.cpp
@@ -1,4 +1,4 @@
-// license:???
+// license:BSD-3-Clause
// copyright-holders:Derrick Renaud
/*************************************************************************
diff --git a/src/mame/audio/skyraid.cpp b/src/mame/audio/skyraid.cpp
index b86e9bc64be..4a9ef30dc9c 100644
--- a/src/mame/audio/skyraid.cpp
+++ b/src/mame/audio/skyraid.cpp
@@ -1,4 +1,4 @@
-// license:???
+// license:BSD-3-Clause
// copyright-holders:Derrick Renaud
/************************************************************************
* skyraid Sound System Analog emulation
@@ -297,7 +297,7 @@ WRITE8_MEMBER(skyraid_state::skyraid_sound_w)
m_discrete->write(space, SKYRAID_PLANE_SWEEP_EN, data & 0x01);
m_discrete->write(space, SKYRAID_MISSILE_EN, data & 0x02);
m_discrete->write(space, SKYRAID_EXPLOSION_EN, data & 0x04);
- set_led_status(machine(), 0, !(data & 0x08));
+ output().set_led_value(0, !(data & 0x08));
m_discrete->write(space, SKYRAID_PLANE_ON_EN, data & 0x10);
m_discrete->write(space, SKYRAID_ATTRACT_EN, data & 0x20);
}
diff --git a/src/mame/audio/snes_snd.cpp b/src/mame/audio/snes_snd.cpp
index c37020bc504..a9295fd560c 100644
--- a/src/mame/audio/snes_snd.cpp
+++ b/src/mame/audio/snes_snd.cpp
@@ -179,7 +179,7 @@ void snes_sound_device::device_start()
{
m_channel = machine().sound().stream_alloc(*this, 0, 2, 32000);
- m_ram = auto_alloc_array_clear(machine(), UINT8, SNES_SPCRAM_SIZE);
+ m_ram = make_unique_clear<UINT8[]>(SNES_SPCRAM_SIZE);
/* put IPL image at the top of RAM */
memcpy(m_ipl_region, machine().root_device().memregion("sound_ipl")->base(), 64);
@@ -196,7 +196,7 @@ void snes_sound_device::device_start()
m_timer[2]->enable(false);
state_register();
- save_pointer(NAME(m_ram), SNES_SPCRAM_SIZE);
+ save_pointer(NAME(m_ram.get()), SNES_SPCRAM_SIZE);
}
//-------------------------------------------------
diff --git a/src/mame/audio/snes_snd.h b/src/mame/audio/snes_snd.h
index 6862f7bc231..6d4e97b14a1 100644
--- a/src/mame/audio/snes_snd.h
+++ b/src/mame/audio/snes_snd.h
@@ -97,7 +97,7 @@ private:
void state_register();
// internal state
- UINT8 *m_ram;
+ std::unique_ptr<UINT8[]> m_ram;
sound_stream *m_channel;
UINT8 m_dsp_regs[256]; /* DSP registers */
UINT8 m_ipl_region[64]; /* SPC top 64 bytes */
diff --git a/src/mame/audio/spiders.cpp b/src/mame/audio/spiders.cpp
index b632e103c5b..adfeda28361 100644
--- a/src/mame/audio/spiders.cpp
+++ b/src/mame/audio/spiders.cpp
@@ -1,5 +1,5 @@
-// license:???
-// copyright-holders:Derrick Renaud
+// license:BSD-3-Clause
+// copyright-holders:Derrick Renaud,Hans Andersson
/***************************************************************************
Sigma Spiders hardware
diff --git a/src/mame/audio/sprint2.cpp b/src/mame/audio/sprint2.cpp
index 59a56dd93d1..f0f7df6925e 100644
--- a/src/mame/audio/sprint2.cpp
+++ b/src/mame/audio/sprint2.cpp
@@ -1,4 +1,4 @@
-// license:???
+// license:BSD-3-Clause
// copyright-holders:Hans Andersson
/*************************************************************************
diff --git a/src/mame/audio/sprint4.cpp b/src/mame/audio/sprint4.cpp
index 1d594376a6f..5a8aef449e1 100644
--- a/src/mame/audio/sprint4.cpp
+++ b/src/mame/audio/sprint4.cpp
@@ -1,4 +1,4 @@
-// license:???
+// license:BSD-3-Clause
// copyright-holders:Derrick Renaud
/*************************************************************************
diff --git a/src/mame/audio/sprint4.h b/src/mame/audio/sprint4.h
index 6cd0ad700fc..855e919c725 100644
--- a/src/mame/audio/sprint4.h
+++ b/src/mame/audio/sprint4.h
@@ -1,4 +1,4 @@
-// license:???
+// license:BSD-3-Clause
// copyright-holders:Derrick Renaud
/***************************************************************************
diff --git a/src/mame/audio/sprint8.cpp b/src/mame/audio/sprint8.cpp
index 5539f54666f..182230cbd27 100644
--- a/src/mame/audio/sprint8.cpp
+++ b/src/mame/audio/sprint8.cpp
@@ -1,4 +1,4 @@
-// license:???
+// license:BSD-3-Clause
// copyright-holders:Derrick Renaud
/************************************************************************
* sprint8 Sound System Analog emulation
diff --git a/src/mame/audio/starshp1.cpp b/src/mame/audio/starshp1.cpp
index c419c364270..e36d5f8744d 100644
--- a/src/mame/audio/starshp1.cpp
+++ b/src/mame/audio/starshp1.cpp
@@ -1,4 +1,4 @@
-// license:???
+// license:BSD-3-Clause
// copyright-holders:Derrick Renaud
/************************************************************************
* starshp1 Sound System Analog emulation
diff --git a/src/mame/audio/subs.cpp b/src/mame/audio/subs.cpp
index c05ad6608a9..fe794e9f49a 100644
--- a/src/mame/audio/subs.cpp
+++ b/src/mame/audio/subs.cpp
@@ -1,4 +1,4 @@
-// license:???
+// license:BSD-3-Clause
// copyright-holders:Derrick Renaud
/*************************************************************************
diff --git a/src/mame/audio/suna8.cpp b/src/mame/audio/suna8.cpp
index 5fe1ad7cbfe..43f70119b9a 100644
--- a/src/mame/audio/suna8.cpp
+++ b/src/mame/audio/suna8.cpp
@@ -18,7 +18,7 @@ SAMPLES_START_CB_MEMBER(suna8_state::sh_start)
int i, len = memregion("samples")->bytes() * 2; // 2 samples per byte
UINT8 *ROM = memregion("samples")->base();
- m_samplebuf = auto_alloc_array(machine(), INT16, len);
+ m_samplebuf = std::make_unique<INT16[]>(len);
// Convert 4 bit to 16 bit samples
for(i = 0; i < len; i++)
diff --git a/src/mame/audio/taito_zm.cpp b/src/mame/audio/taito_zm.cpp
index 069a6536759..a23967134c3 100644
--- a/src/mame/audio/taito_zm.cpp
+++ b/src/mame/audio/taito_zm.cpp
@@ -52,12 +52,12 @@ taito_zoom_device::taito_zoom_device(const machine_config &mconfig, const char *
void taito_zoom_device::device_start()
{
- m_snd_shared_ram = auto_alloc_array_clear(machine(), UINT8, 0x100);
+ m_snd_shared_ram = make_unique_clear<UINT8[]>(0x100);
// register for savestates
save_item(NAME(m_reg_address));
save_item(NAME(m_tms_ctrl));
- save_pointer(NAME(m_snd_shared_ram), 0x100);
+ save_pointer(NAME(m_snd_shared_ram.get()), 0x100);
}
//-------------------------------------------------
diff --git a/src/mame/audio/taito_zm.h b/src/mame/audio/taito_zm.h
index d769618b0e5..610cdc807a8 100644
--- a/src/mame/audio/taito_zm.h
+++ b/src/mame/audio/taito_zm.h
@@ -42,7 +42,7 @@ private:
// internal state
UINT16 m_reg_address;
UINT8 m_tms_ctrl;
- UINT8* m_snd_shared_ram;
+ std::unique_ptr<UINT8[]> m_snd_shared_ram;
};
extern const device_type TAITO_ZOOM;
diff --git a/src/mame/audio/tank8.cpp b/src/mame/audio/tank8.cpp
index 337c078e2cc..506bded19da 100644
--- a/src/mame/audio/tank8.cpp
+++ b/src/mame/audio/tank8.cpp
@@ -1,4 +1,4 @@
-// license:???
+// license:BSD-3-Clause
// copyright-holders:Hans Andersson
/*************************************************************************
diff --git a/src/mame/audio/trackfld.h b/src/mame/audio/trackfld.h
index 03f78799c9e..e1cf446f6a8 100644
--- a/src/mame/audio/trackfld.h
+++ b/src/mame/audio/trackfld.h
@@ -16,8 +16,6 @@ public:
DECLARE_WRITE8_MEMBER(trackfld_sound_w );
DECLARE_READ8_MEMBER(hyperspt_sh_timer_r );
DECLARE_WRITE8_MEMBER(hyperspt_sound_w );
- DECLARE_WRITE8_MEMBER(konami_SN76496_latch_w );
- DECLARE_WRITE8_MEMBER(konami_SN76496_w );
protected:
// device-level overrides
diff --git a/src/mame/audio/triplhnt.cpp b/src/mame/audio/triplhnt.cpp
index f7dd84cf5e8..1055a3f821b 100644
--- a/src/mame/audio/triplhnt.cpp
+++ b/src/mame/audio/triplhnt.cpp
@@ -1,4 +1,4 @@
-// license:???
+// license:BSD-3-Clause
// copyright-holders:Derrick Renaud
/*************************************************************************
diff --git a/src/mame/audio/turbo.cpp b/src/mame/audio/turbo.cpp
index cb24f3234a9..4cbb79b78a8 100644
--- a/src/mame/audio/turbo.cpp
+++ b/src/mame/audio/turbo.cpp
@@ -129,7 +129,7 @@ WRITE8_MEMBER(turbo_state::turbo_sound_b_w)
/* ACC0-ACC5 */
m_turbo_accel = data & 0x3f;
- output_set_value("tachometer", m_turbo_accel);
+ output().set_value("tachometer", m_turbo_accel);
/* /AMBU: channel 4 */
if ((diff & 0x40) && !(data & 0x40) && !m_samples->playing(4)) m_samples->start(4, 8, true);
@@ -152,7 +152,7 @@ WRITE8_MEMBER(turbo_state::turbo_sound_c_w)
m_turbo_bsel = (data >> 2) & 3;
/* SPEED0-3 */
- output_set_value("speed", (data >> 4) & 0x0f);
+ output().set_value("speed", (data >> 4) & 0x0f);
/* update any samples */
turbo_update_samples();
diff --git a/src/mame/audio/tx1.cpp b/src/mame/audio/tx1.cpp
index b4dac235258..93de637e22d 100644
--- a/src/mame/audio/tx1.cpp
+++ b/src/mame/audio/tx1.cpp
@@ -464,8 +464,8 @@ WRITE8_MEMBER( buggyboy_sound_device::ym2_b_w )
if (!strcmp(space.machine().system().name, "buggyboyjr"))
{
- coin_counter_w(space.machine(), 0, data & 0x01);
- coin_counter_w(space.machine(), 1, data & 0x02);
+ space.machine().bookkeeping().coin_counter_w(0, data & 0x01);
+ space.machine().bookkeeping().coin_counter_w(1, data & 0x02);
}
/*
diff --git a/src/mame/audio/upd1771.cpp b/src/mame/audio/upd1771.cpp
index 96b3b2bb062..e826aafee0f 100644
--- a/src/mame/audio/upd1771.cpp
+++ b/src/mame/audio/upd1771.cpp
@@ -187,7 +187,7 @@
waveforms; the first four look as if they're playing back a piece of code as
wave data.
*/
-const char WAVEFORMS[8][32]={
+const signed char WAVEFORMS[8][32]={
{ 0, 0,-123,-123, -61, -23, 125, 107, 94, 83,-128,-128,-128, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0,-128,-128,-128, 0, 0, 0, 0, 0, 0},
{ 37, 16, 32, -21, 32, 52, 4, 4, 33, 18, 60, 56, 0, 8, 5, 16, 65, 19, 69, 16, -2, 19, 37, 16, 97, 19, 0, 87, 127, -3, 1, 2},
{ 0, 8, 1, 52, 4, 0, 0, 77, 81,-109, 47, 97, -83,-109, 38, 97, 0, 52, 4, 0, 1, 4, 1, 22, 2, -46, 33, 97, 0, 8, -85, -99},
diff --git a/src/mame/audio/vboy.h b/src/mame/audio/vboy.h
index b714999cfc7..f3d85d60c6f 100644
--- a/src/mame/audio/vboy.h
+++ b/src/mame/audio/vboy.h
@@ -88,9 +88,6 @@ protected:
virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) override;
- // inline data
- s_sreg sound_registers(void);
-
s_snd_channel snd_channel[5];
UINT16 waveFreq2LenTbl[2048];
diff --git a/src/mame/audio/vicdual.cpp b/src/mame/audio/vicdual.cpp
index a1219121101..d79843ec974 100644
--- a/src/mame/audio/vicdual.cpp
+++ b/src/mame/audio/vicdual.cpp
@@ -1,4 +1,4 @@
-// license:???
+// license:BSD-3-Clause
// copyright-holders:Derrick Renaud, Couriersud
/*************************************************************************
diff --git a/src/mame/audio/videopin.cpp b/src/mame/audio/videopin.cpp
index a2babc8635a..10d3c2c1aae 100644
--- a/src/mame/audio/videopin.cpp
+++ b/src/mame/audio/videopin.cpp
@@ -1,4 +1,4 @@
-// license:???
+// license:BSD-3-Clause
// copyright-holders:Derrick Renaud
/*************************************************************************
diff --git a/src/mame/audio/warpwarp.cpp b/src/mame/audio/warpwarp.cpp
index 728ac384e33..d0c17d54d77 100644
--- a/src/mame/audio/warpwarp.cpp
+++ b/src/mame/audio/warpwarp.cpp
@@ -48,7 +48,7 @@ warpwarp_sound_device::warpwarp_sound_device(const machine_config &mconfig, cons
void warpwarp_sound_device::device_start()
{
- m_decay = auto_alloc_array(machine(), INT16, 32768);
+ m_decay = std::make_unique<INT16[]>(32768);
for (int i = 0; i < 0x8000; i++)
m_decay[0x7fff - i] = (INT16) (0x7fff/exp(1.0*i/4096));
diff --git a/src/mame/audio/warpwarp.h b/src/mame/audio/warpwarp.h
index 4f419e8a90e..c14c61f63b5 100644
--- a/src/mame/audio/warpwarp.h
+++ b/src/mame/audio/warpwarp.h
@@ -24,7 +24,7 @@ protected:
private:
// internal state
- UINT16 *m_decay;
+ std::unique_ptr<UINT16[]> m_decay;
sound_stream *m_channel;
int m_sound_latch;
int m_sound_signal;
@@ -67,7 +67,7 @@ protected:
private:
// internal state
- INT16 *m_decay;
+ std::unique_ptr<INT16[]> m_decay;
sound_stream *m_channel;
int m_sound_latch;
int m_music1_latch;
diff --git a/src/mame/audio/wiping.cpp b/src/mame/audio/wiping.cpp
index 9fb41a4ce0c..38925e08c37 100644
--- a/src/mame/audio/wiping.cpp
+++ b/src/mame/audio/wiping.cpp
@@ -47,8 +47,8 @@ void wiping_sound_device::device_start()
m_stream = machine().sound().stream_alloc(*this, 0, 1, samplerate);
/* allocate a pair of buffers to mix into - 1 second's worth should be more than enough */
- m_mixer_buffer = auto_alloc_array_clear(machine(), short, 2 * samplerate);
- m_mixer_buffer_2 = m_mixer_buffer + samplerate;
+ m_mixer_buffer = make_unique_clear<short[]>(samplerate);
+ m_mixer_buffer_2 = make_unique_clear<short[]>(samplerate);
/* build the mixer table */
make_mixer_table(8, defgain);
@@ -91,10 +91,10 @@ void wiping_sound_device::make_mixer_table(int voices, int gain)
int i;
/* allocate memory */
- m_mixer_table = auto_alloc_array_clear(machine(), INT16, 256 * voices);
+ m_mixer_table = make_unique_clear<INT16[]>(256 * voices);
/* find the middle of the table */
- m_mixer_lookup = m_mixer_table + (128 * voices);
+ m_mixer_lookup = m_mixer_table.get() + (128 * voices);
/* fill in the table - 16 bit case */
for (i = 0; i < count; i++)
@@ -174,7 +174,7 @@ void wiping_sound_device::sound_stream_update(sound_stream &stream, stream_sampl
}
/* zap the contents of the mixer buffer */
- memset(m_mixer_buffer, 0, samples * sizeof(short));
+ memset(m_mixer_buffer.get(), 0, samples * sizeof(short));
/* loop over each voice and add its contribution */
for (voice = m_channel_list; voice < m_last_channel; voice++)
@@ -188,7 +188,7 @@ void wiping_sound_device::sound_stream_update(sound_stream &stream, stream_sampl
const UINT8 *w = voice->wave;
int c = voice->counter;
- mix = m_mixer_buffer;
+ mix = m_mixer_buffer.get();
/* add our contribution */
for (i = 0; i < samples; i++)
@@ -235,7 +235,7 @@ void wiping_sound_device::sound_stream_update(sound_stream &stream, stream_sampl
}
/* mix it down */
- mix = m_mixer_buffer;
+ mix = m_mixer_buffer.get();
for (i = 0; i < samples; i++)
*buffer++ = m_mixer_lookup[*mix++];
}
diff --git a/src/mame/audio/wiping.h b/src/mame/audio/wiping.h
index d020f326e1b..f891ae8f5d8 100644
--- a/src/mame/audio/wiping.h
+++ b/src/mame/audio/wiping.h
@@ -45,10 +45,10 @@ private:
sound_stream *m_stream;
/* mixer tables and internal buffers */
- INT16 *m_mixer_table;
+ std::unique_ptr<INT16[]> m_mixer_table;
INT16 *m_mixer_lookup;
- short *m_mixer_buffer;
- short *m_mixer_buffer_2;
+ std::unique_ptr<short[]> m_mixer_buffer;
+ std::unique_ptr<short[]> m_mixer_buffer_2;
UINT8 m_soundregs[0x4000];
diff --git a/src/mame/drivers/1942.cpp b/src/mame/drivers/1942.cpp
index b5856656097..19da9594604 100644
--- a/src/mame/drivers/1942.cpp
+++ b/src/mame/drivers/1942.cpp
@@ -1,4 +1,4 @@
-// license:???
+// license:BSD-3-Clause
// copyright-holders:Paul Leaman, Couriersud
/***************************************************************************
diff --git a/src/mame/drivers/1943.cpp b/src/mame/drivers/1943.cpp
index ee10aa4d925..c91260a9b63 100644
--- a/src/mame/drivers/1943.cpp
+++ b/src/mame/drivers/1943.cpp
@@ -1,4 +1,4 @@
-// license:???
+// license:BSD-3-Clause
// copyright-holders:Paul Leaman
/***************************************************************************
diff --git a/src/mame/drivers/20pacgal.cpp b/src/mame/drivers/20pacgal.cpp
index 00df8eaecda..ddfa3b412af 100644
--- a/src/mame/drivers/20pacgal.cpp
+++ b/src/mame/drivers/20pacgal.cpp
@@ -129,7 +129,7 @@ WRITE8_MEMBER(_20pacgal_state::timer_pulse_w)
WRITE8_MEMBER(_20pacgal_state::_20pacgal_coin_counter_w)
{
- coin_counter_w(machine(), 0, data & 1);
+ machine().bookkeeping().coin_counter_w(0, data & 1);
}
@@ -140,21 +140,10 @@ WRITE8_MEMBER(_20pacgal_state::_20pacgal_coin_counter_w)
*
*************************************/
-void _20pacgal_state::set_bankptr()
-{
- if (m_game_selected == 0)
- {
- UINT8 *rom = memregion("maincpu")->base();
- membank("bank1")->set_base(rom + 0x08000);
- }
- else
- membank("bank1")->set_base(m_ram_48000);
-}
-
WRITE8_MEMBER(_20pacgal_state::ram_bank_select_w)
{
m_game_selected = data & 1;
- set_bankptr();
+ membank("bank1")->set_entry(m_game_selected);
}
WRITE8_MEMBER(_20pacgal_state::ram_48000_w)
@@ -374,7 +363,10 @@ void _20pacgal_state::common_save_state()
void _20pacgal_state::machine_start()
{
common_save_state();
- machine().save().register_postload(save_prepost_delegate(FUNC(_20pacgal_state::set_bankptr), this)); //currently not used by 25pacman
+
+ // membank currently used only by 20pacgal
+ membank("bank1")->configure_entry(0, memregion("maincpu")->base() + 0x08000);
+ membank("bank1")->configure_entry(1, m_ram_48000);
}
void _25pacman_state::machine_start()
@@ -442,7 +434,7 @@ MACHINE_CONFIG_END
*/
ROM_START( 25pacmano ) /* Revision 2.00 */
- ROM_REGION( 0x100000, "maincpu", 0 )
+ ROM_REGION( 0x40000, "maincpu", 0 )
ROM_LOAD( "pacman_25th_rev2.0.u13", 0x00000, 0x40000, CRC(99a52784) SHA1(6222c2eb686e65ba23ca376ff4392be1bc826a03) ) /* Label printed Rev 2.0, program says Rev 2.00 */
ROM_REGION( 0x8000, "proms", 0 ) /* palette */
@@ -455,7 +447,7 @@ ROM_END
ROM_START( 25pacman ) /* Revision 3.00 */
ROM_REGION( 0x40000, "flash", 0 )
ROM_LOAD( "pacman25ver3.u1", 0x00000, 0x40000, CRC(55b0076e) SHA1(4544cc193bdd22bfc88d096083ccc4069cac4607) ) /* program says Rev 3.00 */
- ROM_REGION( 0x100000, "maincpu", ROMREGION_ERASE00 )
+ ROM_REGION( 0x40000, "maincpu", ROMREGION_ERASE00 )
ROM_REGION( 0x8000, "proms", 0 ) /* palette */
// shouldn't be loading this! must be uploaded somewhere
@@ -467,7 +459,7 @@ ROM_END
*/
ROM_START( 20pacgal ) /* Version 1.08 */
- ROM_REGION( 0x100000, "maincpu", 0 )
+ ROM_REGION( 0x40000, "maincpu", 0 )
ROM_LOAD( "ms_pac-galaga_v1.08.u13", 0x00000, 0x40000, CRC(2ea16809) SHA1(27f041bdbb590917e9dcb70c21aa6b6d6c9f04fb) ) /* Also found labeled as "V1.08 HO" */
ROM_REGION( 0x8000, "proms", 0 ) /* palette */
@@ -475,7 +467,7 @@ ROM_START( 20pacgal ) /* Version 1.08 */
ROM_END
ROM_START( 20pacgalr4 ) /* Version 1.04 */
- ROM_REGION( 0x100000, "maincpu", 0 )
+ ROM_REGION( 0x40000, "maincpu", 0 )
ROM_LOAD( "ms_pac-galaga_v1.04.u13", 0x00000, 0x40000, CRC(6c474d2d) SHA1(5a150fc9d2ed0e908385b9f9d532aa33cf80dba4) )
ROM_REGION( 0x8000, "proms", 0 ) /* palette */
@@ -483,7 +475,7 @@ ROM_START( 20pacgalr4 ) /* Version 1.04 */
ROM_END
ROM_START( 20pacgalr3 ) /* Version 1.03 */
- ROM_REGION( 0x100000, "maincpu", 0 )
+ ROM_REGION( 0x40000, "maincpu", 0 )
ROM_LOAD( "ms_pac-galaga_v1.03.u13", 0x00000, 0x40000, CRC(e13dce63) SHA1(c8943f082883c423210fc3c97323222afb00f0a2) )
ROM_REGION( 0x8000, "proms", 0 ) /* palette */
@@ -491,7 +483,7 @@ ROM_START( 20pacgalr3 ) /* Version 1.03 */
ROM_END
ROM_START( 20pacgalr2 ) /* Version 1.02 */
- ROM_REGION( 0x100000, "maincpu", 0 )
+ ROM_REGION( 0x40000, "maincpu", 0 )
ROM_LOAD( "ms_pac-galaga_v1.02.u13", 0x00000, 0x40000, CRC(b939f805) SHA1(5fe9470601156dfc2d339c94fd8f0aa4db197760) )
ROM_REGION( 0x8000, "proms", 0 ) /* palette */
@@ -499,7 +491,7 @@ ROM_START( 20pacgalr2 ) /* Version 1.02 */
ROM_END
ROM_START( 20pacgalr1 ) /* Version 1.01 */
- ROM_REGION( 0x100000, "maincpu", 0 )
+ ROM_REGION( 0x40000, "maincpu", 0 )
ROM_LOAD( "ms_pac-galaga_v1.01.u13", 0x00000, 0x40000, CRC(77159582) SHA1(c05e005a941cbdc806dcd76b315069362c792a72) )
ROM_REGION( 0x8000, "proms", 0 ) /* palette */
@@ -507,7 +499,7 @@ ROM_START( 20pacgalr1 ) /* Version 1.01 */
ROM_END
ROM_START( 20pacgalr0 ) /* Version 1.00 */
- ROM_REGION( 0x100000, "maincpu", 0 )
+ ROM_REGION( 0x40000, "maincpu", 0 )
ROM_LOAD( "ms_pac-galaga_v1.0.u13", 0x00000, 0x40000, CRC(3c92a269) SHA1(a616d912393f4e49b95231d72eec48567f46fc00) ) /* Label printed V1.0, program says v1.00 */
ROM_REGION( 0x8000, "proms", 0 ) /* palette */
diff --git a/src/mame/drivers/24cdjuke.cpp b/src/mame/drivers/24cdjuke.cpp
index 605f480542c..7a9e17d325e 100644
--- a/src/mame/drivers/24cdjuke.cpp
+++ b/src/mame/drivers/24cdjuke.cpp
@@ -118,7 +118,7 @@ WRITE8_MEMBER(midcoin24cdjuke_state::digit_w)
char_data = BITSWAP16(char_data, 13,11,9,15,14,10,12,8,7,6,5,4,3,2,1,0);
- output_set_digit_value(offset, char_data ^ 0xffff);
+ output().set_digit_value(offset, char_data ^ 0xffff);
}
diff --git a/src/mame/drivers/2mindril.cpp b/src/mame/drivers/2mindril.cpp
index 24492ebd5f3..d1f27dd46ab 100644
--- a/src/mame/drivers/2mindril.cpp
+++ b/src/mame/drivers/2mindril.cpp
@@ -116,10 +116,10 @@ WRITE16_MEMBER(_2mindril_state::drill_io_w)
switch(offset)
{
case 0x8/2:
- coin_counter_w(machine(), 0, m_iodata[offset] & 0x0400);
- coin_counter_w(machine(), 1, m_iodata[offset] & 0x0800);
- coin_lockout_w(machine(), 0, ~m_iodata[offset] & 0x0100);
- coin_lockout_w(machine(), 1, ~m_iodata[offset] & 0x0200);
+ machine().bookkeeping().coin_counter_w(0, m_iodata[offset] & 0x0400);
+ machine().bookkeeping().coin_counter_w(1, m_iodata[offset] & 0x0800);
+ machine().bookkeeping().coin_lockout_w(0, ~m_iodata[offset] & 0x0100);
+ machine().bookkeeping().coin_lockout_w(1, ~m_iodata[offset] & 0x0200);
break;
}
diff --git a/src/mame/drivers/30test.cpp b/src/mame/drivers/30test.cpp
index 61ce6d7b005..c41167a52de 100644
--- a/src/mame/drivers/30test.cpp
+++ b/src/mame/drivers/30test.cpp
@@ -80,21 +80,21 @@ static const UINT8 led_map[16] =
WRITE8_MEMBER(namco_30test_state::namco_30test_led_w)
{
- output_set_digit_value(0 + offset * 2, led_map[(data & 0xf0) >> 4]);
- output_set_digit_value(1 + offset * 2, led_map[(data & 0x0f) >> 0]);
+ output().set_digit_value(0 + offset * 2, led_map[(data & 0xf0) >> 4]);
+ output().set_digit_value(1 + offset * 2, led_map[(data & 0x0f) >> 0]);
}
WRITE8_MEMBER(namco_30test_state::namco_30test_led_rank_w)
{
- output_set_digit_value(64 + offset * 2, led_map[(data & 0xf0) >> 4]);
- output_set_digit_value(65 + offset * 2, led_map[(data & 0x0f) >> 0]);
+ output().set_digit_value(64 + offset * 2, led_map[(data & 0xf0) >> 4]);
+ output().set_digit_value(65 + offset * 2, led_map[(data & 0x0f) >> 0]);
}
WRITE8_MEMBER(namco_30test_state::namco_30test_lamps_w)
{
// d0-d5: ranking, d6: game over, d7: assume marquee lamp
for (int i = 0; i < 8; i++)
- output_set_lamp_value(i, data >> i & 1);
+ output().set_lamp_value(i, data >> i & 1);
}
READ8_MEMBER(namco_30test_state::namco_30test_mux_r)
diff --git a/src/mame/drivers/39in1.cpp b/src/mame/drivers/39in1.cpp
index fcbd59370f4..0c5bdcafc11 100644
--- a/src/mame/drivers/39in1.cpp
+++ b/src/mame/drivers/39in1.cpp
@@ -73,8 +73,6 @@ public:
DECLARE_WRITE32_MEMBER(pxa255_gpio_w);
DECLARE_READ32_MEMBER(pxa255_lcd_r);
DECLARE_WRITE32_MEMBER(pxa255_lcd_w);
- DECLARE_READ32_MEMBER(return_zero);
- DECLARE_READ32_MEMBER(unknown_r);
DECLARE_READ32_MEMBER(cpld_r);
DECLARE_WRITE32_MEMBER(cpld_w);
DECLARE_READ32_MEMBER(prot_cheater_r);
diff --git a/src/mame/drivers/4004clk.cpp b/src/mame/drivers/4004clk.cpp
index b62ec3794e9..224102e80ef 100644
--- a/src/mame/drivers/4004clk.cpp
+++ b/src/mame/drivers/4004clk.cpp
@@ -61,12 +61,12 @@ UINT8 nixieclock_state::nixie_to_num(UINT16 val)
inline void nixieclock_state::output_set_nixie_value(int index, int value)
{
- output_set_indexed_value("nixie", index, value);
+ output().set_indexed_value("nixie", index, value);
}
inline void nixieclock_state::output_set_neon_value(int index, int value)
{
- output_set_indexed_value("neon", index, value);
+ output().set_indexed_value("neon", index, value);
}
WRITE8_MEMBER(nixieclock_state::nixie_w)
diff --git a/src/mame/drivers/40love.cpp b/src/mame/drivers/40love.cpp
index a002c30a502..fe81b18233a 100644
--- a/src/mame/drivers/40love.cpp
+++ b/src/mame/drivers/40love.cpp
@@ -1,4 +1,4 @@
-// license:???
+// license:GPL-2.0+
// copyright-holders:Jarek Burczynski
/****************************************************************************
@@ -11,15 +11,12 @@
/*
TO DO:
- sprites graphics decoding could be changed to only use
- color codes 8-15 (now it decodes all 64 colors). Perhaps the same
- applies to character graphics (colors 0-7 only),
+ color codes 8-15 (now it decodes all 64 colors).
- sprite memory needs to be buffered ?
- controls may be wrong (BUTTON 3 - not used ?)
- - palette has 1024 colors, but only first 256 are used at the moment
-
- pixel layer needs priority ?
*/
@@ -272,7 +269,7 @@ WRITE8_MEMBER(fortyl_state::nmi_enable_w)
#if 0
WRITE8_MEMBER(fortyl_state::fortyl_coin_counter_w)
{
- coin_counter_w(machine(), offset,data);
+ machine().bookkeeping().coin_counter_w(offset,data);
}
#endif
@@ -649,6 +646,7 @@ static ADDRESS_MAP_START( 40love_map, AS_PROGRAM, 8, fortyl_state )
AM_RANGE(0x9880, 0x98bf) AM_READWRITE(fortyl_bg_colorram_r, fortyl_bg_colorram_w) AM_SHARE("colorram") /* background attributes (2 bytes per line) */
AM_RANGE(0x98c0, 0x98ff) AM_RAM AM_SHARE("spriteram2")/* sprites part 2 */
AM_RANGE(0xa000, 0xbfff) AM_ROMBANK("bank1")
+ //AM_RANGE(0xbf00, 0xbfff) writes here when zooms-in/out, left-over or pixel line clearance?
AM_RANGE(0xc000, 0xffff) AM_READWRITE(fortyl_pixram_r, fortyl_pixram_w) /* banked pixel layer */
ADDRESS_MAP_END
@@ -962,6 +960,8 @@ MACHINE_START_MEMBER(fortyl_state,40love)
/* video */
save_item(NAME(m_pix1));
save_item(NAME(m_pix2));
+ save_item(NAME(m_color_bank));
+ save_item(NAME(m_screen_disable));
/* sound */
save_item(NAME(m_sound_nmi_enable));
save_item(NAME(m_pending_nmi));
@@ -995,6 +995,7 @@ MACHINE_RESET_MEMBER(fortyl_state,common)
m_pix1 = 0;
m_pix2[0] = 0;
m_pix2[1] = 0;
+ m_color_bank = false;
/* sound */
m_sound_nmi_enable = 0;
diff --git a/src/mame/drivers/sgi_ip6.cpp b/src/mame/drivers/4dpi.cpp
index de1b4f6134c..7feead80bea 100644
--- a/src/mame/drivers/sgi_ip6.cpp
+++ b/src/mame/drivers/4dpi.cpp
@@ -2,7 +2,7 @@
// copyright-holders:Ryan Holtz
/****************************************************************************
- drivers/sgi_ip6.c
+ drivers/4dpi.cpp
SGI 4D/PI IP6 family skeleton driver
by Ryan Holtz
diff --git a/src/mame/drivers/4enraya.cpp b/src/mame/drivers/4enraya.cpp
index 4e5d18abc21..c75536306f1 100644
--- a/src/mame/drivers/4enraya.cpp
+++ b/src/mame/drivers/4enraya.cpp
@@ -408,9 +408,6 @@ void _4enraya_state::machine_start()
save_item(NAME(m_videoram));
save_item(NAME(m_workram));
save_item(NAME(m_soundlatch));
-
- m_prom = memregion("pal_prom")->base();
- m_rom = memregion("maincpu")->base();
}
void _4enraya_state::machine_reset()
diff --git a/src/mame/drivers/5clown.cpp b/src/mame/drivers/5clown.cpp
index a5be170dbe4..c0d07547e2d 100644
--- a/src/mame/drivers/5clown.cpp
+++ b/src/mame/drivers/5clown.cpp
@@ -650,10 +650,10 @@ WRITE8_MEMBER(_5clown_state::counters_w)
-x-- ---- Unknown (increments at start).
x--- ---- Unknown (increments at start).
*/
- coin_counter_w(machine(), 0, data & 0x10); /* Key In */
- coin_counter_w(machine(), 1, data & 0x20); /* Payout */
- coin_counter_w(machine(), 2, data & 0x40); /* unknown */
- coin_counter_w(machine(), 3, data & 0x80); /* unknown */
+ machine().bookkeeping().coin_counter_w(0, data & 0x10); /* Key In */
+ machine().bookkeeping().coin_counter_w(1, data & 0x20); /* Payout */
+ machine().bookkeeping().coin_counter_w(2, data & 0x40); /* unknown */
+ machine().bookkeeping().coin_counter_w(3, data & 0x80); /* unknown */
}
diff --git a/src/mame/drivers/8080bw.cpp b/src/mame/drivers/8080bw.cpp
index c69d365a8a9..4dfeab5b92c 100644
--- a/src/mame/drivers/8080bw.cpp
+++ b/src/mame/drivers/8080bw.cpp
@@ -1364,6 +1364,18 @@ static INPUT_PORTS_START( schaser )
PORT_ADJUSTER( 70, "VR3 - Dot Volume" )
INPUT_PORTS_END
+
+static INPUT_PORTS_START( schaserm )
+ PORT_INCLUDE( schaser )
+
+ PORT_MODIFY("IN2")
+ PORT_DIPNAME( 0x03, 0x00, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW1:1,2")
+ PORT_DIPSETTING( 0x00, "1" )
+ PORT_DIPSETTING( 0x01, "2" )
+ PORT_DIPSETTING( 0x02, "3" )
+ PORT_DIPSETTING( 0x03, "4" )
+INPUT_PORTS_END
+
MACHINE_START_MEMBER(_8080bw_state,schaser)
{
MACHINE_START_CALL_MEMBER(schaser_sh);
@@ -2297,7 +2309,7 @@ MACHINE_CONFIG_END
WRITE8_MEMBER(_8080bw_state::steelwkr_sh_port_3_w)
{
- coin_lockout_global_w(machine(), !(~data & 0x03)); /* possibly */
+ machine().bookkeeping().coin_lockout_global_w(!(~data & 0x03)); /* possibly */
}
static ADDRESS_MAP_START( steelwkr_io_map, AS_IO, 8, _8080bw_state )
@@ -3262,26 +3274,10 @@ WRITE8_MEMBER(_8080bw_state::invmulti_eeprom_w)
WRITE8_MEMBER(_8080bw_state::invmulti_bank_w)
{
- m_invmulti_bank = data; //needed to restore the bankswitch post load
-
// d0, d4, d6: bank
int bank = (data & 1) | (data >> 3 & 2) | (data >> 4 & 4);
- membank("bank1")->set_base(memregion("maincpu")->base() + bank * 0x4000 + 0x0000);
- membank("bank2")->set_base(memregion("maincpu")->base() + bank * 0x4000 + 0x2000);
-}
-
-void _8080bw_state::invmulti_bankswitch_restore()
-{
- invmulti_bank_w(m_maincpu->space(AS_PROGRAM), 0, m_invmulti_bank);
-}
-
-MACHINE_RESET_MEMBER(_8080bw_state,invmulti)
-{
- m_invmulti_bank = 0;
-
- invmulti_bank_w(m_maincpu->space(AS_PROGRAM), 0, 0);
-
- MACHINE_RESET_CALL_MEMBER(mw8080bw);
+ membank("bank1")->set_entry(bank);
+ membank("bank2")->set_entry(bank);
}
MACHINE_CONFIG_DERIVED_CLASS( invmulti, invaders, _8080bw_state )
@@ -3292,7 +3288,7 @@ MACHINE_CONFIG_DERIVED_CLASS( invmulti, invaders, _8080bw_state )
MCFG_EEPROM_SERIAL_93C46_8BIT_ADD("eeprom")
- MCFG_MACHINE_RESET_OVERRIDE(_8080bw_state,invmulti)
+ MCFG_MACHINE_RESET_OVERRIDE(_8080bw_state, mw8080bw)
MACHINE_CONFIG_END
DRIVER_INIT_MEMBER(_8080bw_state,invmulti)
@@ -3305,8 +3301,10 @@ DRIVER_INIT_MEMBER(_8080bw_state,invmulti)
for (int i = 0; i < len; i++)
dest[i] = BITSWAP8(src[(i & 0x100ff) | (BITSWAP8(i >> 8 & 0xff, 7,3,4,5,0,6,1,2) << 8)],0,6,5,7,4,3,1,2);
- save_item(NAME(m_invmulti_bank));
- machine().save().register_postload(save_prepost_delegate(FUNC(_8080bw_state::invmulti_bankswitch_restore), this));
+ membank("bank1")->configure_entries(0, 8, memregion("maincpu")->base(), 0x4000);
+ membank("bank1")->set_entry(0);
+ membank("bank2")->configure_entries(0, 8, memregion("maincpu")->base() + 0x2000, 0x4000);
+ membank("bank2")->set_entry(0);
}
@@ -4373,6 +4371,18 @@ ROM_START( schaserb )
ROM_LOAD( "rt06.ic2", 0x0000, 0x0400, CRC(950cf973) SHA1(d22df09b325835a0057ccd0d54f827b374254ac6) )
ROM_END
+ROM_START( schaserm )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD( "MR26.71", 0x0000, 0x0800, CRC(4e547879) SHA1(464fab35373d6bd6218474e7f5109425376f1db2) )
+ ROM_LOAD( "RT08.70", 0x0800, 0x0800, CRC(825fc8ac) SHA1(176ff0f4d0cd55be30efb184bd5bef62b92d0333) )
+ ROM_LOAD( "RT09.69", 0x1000, 0x0800, CRC(de9d3f85) SHA1(13a71fdd889023cfc65ed2c0a65236884b79b1f0) )
+ ROM_LOAD( "MR27.62", 0x1800, 0x0800, CRC(069ec108) SHA1(b12cd288d7e42002d01290f0572f9074adf2cdca) )
+ ROM_LOAD( "RT11.61", 0x4000, 0x0800, CRC(17a7ef7a) SHA1(1a7b3f9393dceddcd1e220cadbff7e619594f884) )
+
+ ROM_REGION( 0x0400, "proms", 0 ) /* background color map */
+ ROM_LOAD( "rt06.ic2", 0x0000, 0x0400, CRC(950cf973) SHA1(d22df09b325835a0057ccd0d54f827b374254ac6) )
+ROM_END
+
ROM_START( sflush )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "fr05.sc2", 0xd800, 0x800, CRC(c4f08f9f) SHA1(997f216f5244942fc1a19f5c1988adbfadc301fc) )
@@ -4780,32 +4790,43 @@ GAME( 1979, invadpt2br, invadpt2, invadpt2, invadpt2, driver_device, 0, ROT270
GAME( 1980, invaddlx, invadpt2, invaders, invadpt2, driver_device, 0, ROT270, "Taito (Midway license)", "Space Invaders Deluxe", MACHINE_SUPPORTS_SAVE )
GAME( 1979, moonbase, invadpt2, invadpt2, invadpt2, driver_device, 0, ROT270, "Taito / Nichibutsu", "Moon Base (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) // this has a 'Taito Corp' string hidden away in the rom - how do you get it to display?
GAME( 1979, moonbasea, invadpt2, invadpt2, invadpt2, driver_device, 0, ROT270, "Taito / Nichibutsu", "Moon Base (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) // this has the same string replaced with Nichibutsu, no other differences
+
GAME( 1980, spclaser, 0, invadpt2, spclaser, driver_device, 0, ROT270, "Taito", "Space Laser", MACHINE_WRONG_COLORS | MACHINE_SUPPORTS_SAVE )
GAME( 1980, intruder, spclaser, invadpt2, spclaser, driver_device, 0, ROT270, "Taito (Game Plan license)", "Intruder", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )
GAME( 1980, laser, spclaser, invadpt2, spclaser, driver_device, 0, ROT270, "bootleg (Leisure Time Electronics Inc.)", "Astro Laser (bootleg of Space Laser)", MACHINE_WRONG_COLORS | MACHINE_SUPPORTS_SAVE )
GAME( 1979, spcewarl, spclaser, invadpt2, spclaser, driver_device, 0, ROT270, "Leijac Corporation", "Space War (Leijac Corporation)", MACHINE_WRONG_COLORS | MACHINE_SUPPORTS_SAVE ) // Taito's version is actually a spin-off of this?
+
GAME( 1979, lrescue, 0, lrescue, lrescue, driver_device, 0, ROT270, "Taito", "Lunar Rescue", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )
GAME( 1979, grescue, lrescue, lrescue, lrescue, driver_device, 0, ROT270, "Taito (Universal license?)", "Galaxy Rescue", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )
GAME( 1980, mlander, lrescue, lrescue, lrescue, driver_device, 0, ROT270, "bootleg (Leisure Time Electronics)", "Moon Lander (bootleg of Lunar Rescue)", MACHINE_SUPPORTS_SAVE )
GAME( 1979, lrescuem, lrescue, lrescue, lrescue, driver_device, 0, ROT270, "bootleg (Model Racing)", "Lunar Rescue (Model Racing bootleg, set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )
GAME( 1979, lrescuem2, lrescue, lrescue, lrescue, driver_device, 0, ROT270, "bootleg (Model Racing)", "Lunar Rescue (Model Racing bootleg, set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )
GAME( 1979, desterth, lrescue, lrescue, lrescue, driver_device, 0, ROT270, "bootleg", "Destination Earth (bootleg of Lunar Rescue)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )
+
GAME( 1979, schaser, 0, schaser, schaser, driver_device, 0, ROT270, "Taito", "Space Chaser (set 1)", MACHINE_SUPPORTS_SAVE )
GAME( 1979, schasera, schaser, schaser, schaser, driver_device, 0, ROT270, "Taito", "Space Chaser (set 2)", MACHINE_SUPPORTS_SAVE )
GAME( 1979, schaserb, schaser, schaser, schaser, driver_device, 0, ROT270, "Taito", "Space Chaser (set 3)", MACHINE_SUPPORTS_SAVE )
GAME( 1979, schaserc, schaser, schaser, schaser, driver_device, 0, ROT270, "Taito", "Space Chaser (set 4)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_COLORS )
GAME( 1979, schasercv, schaser, schasercv, schasercv, driver_device, 0, ROT270, "Taito", "Space Chaser (CV version - set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_COLORS )
+GAME( 1979, schaserm, schaser, schaser, schaserm, driver_device, 0, ROT270, "bootleg (Model Racing)", "Space Chaser (Model Racing bootleg)", MACHINE_SUPPORTS_SAVE ) // on original Taito PCB, hacked to be harder?
+
GAME( 1979, sflush, 0, sflush, sflush, driver_device, 0, ROT270, "Taito", "Straight Flush", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND | MACHINE_IMPERFECT_COLORS | MACHINE_NO_COCKTAIL)
+
GAME( 1980, lupin3, 0, lupin3, lupin3, driver_device, 0, ROT270, "Taito", "Lupin III (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )
GAME( 1980, lupin3a, lupin3, lupin3a, lupin3a, driver_device, 0, ROT270, "Taito", "Lupin III (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )
+
GAME( 1980, polaris, 0, polaris, polaris, driver_device, 0, ROT270, "Taito", "Polaris (Latest version)", MACHINE_SUPPORTS_SAVE )
GAME( 1980, polarisa, polaris, polaris, polaris, driver_device, 0, ROT270, "Taito", "Polaris (First revision)", MACHINE_SUPPORTS_SAVE )
GAME( 1980, polariso, polaris, polaris, polaris, driver_device, 0, ROT270, "Taito", "Polaris (Original version)", MACHINE_SUPPORTS_SAVE )
GAME( 1981, polarisbr, polaris, polaris, polaris, driver_device, 0, ROT270, "Taito do Brasil", "Polaris (Brazil)", MACHINE_SUPPORTS_SAVE )
+
GAME( 1980, ballbomb, 0, ballbomb, ballbomb, driver_device, 0, ROT270, "Taito", "Balloon Bomber", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) /* missing clouds */
+
GAME( 1980, indianbt, 0, indianbt, indianbt, driver_device, 0, ROT270, "Taito", "Indian Battle", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )
GAME( 1983, indianbtbr, indianbt, indianbtbr,indianbtbr,driver_device, 0, ROT270, "Taito do Brasil", "Indian Battle (Brazil)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )
+
GAME( 1980, steelwkr, 0, steelwkr, steelwkr, driver_device, 0, ROT0 , "Taito", "Steel Worker", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )
+
GAMEL(1980?,galactic, 0, invaders, galactic, driver_device, 0, ROT270, "Taito do Brasil", "Galactica - Batalha Espacial", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND, layout_galactic )
GAMEL(1980?,spacmiss, galactic, invaders, galactic, driver_device, 0, ROT270, "bootleg?", "Space Missile - Space Fighting Game", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND, layout_galactic )
@@ -4815,25 +4836,37 @@ GAME( 1979, galxwars2, galxwars, invadpt2, galxwars, driver_device, 0, ROT270
GAME( 1979, galxwarst, galxwars, invadpt2, galxwars, driver_device, 0, ROT270, "Universal (Taito license?)", "Galaxy Wars (Taito?)" , MACHINE_WRONG_COLORS | MACHINE_SUPPORTS_SAVE ) // Copyright not displayed
GAME( 1979, starw, galxwars, invaders, galxwars, driver_device, 0, ROT270, "bootleg", "Star Wars (bootleg of Galaxy Wars, set 1)", MACHINE_SUPPORTS_SAVE )
GAME( 1979, starw1, galxwars, starw1, galxwars, driver_device, 0, ROT270, "bootleg (Yamashita)", "Star Wars (bootleg of Galaxy Wars, set 2)", MACHINE_SUPPORTS_SAVE )
+
GAME( 1979, cosmo, 0, cosmo, cosmo, driver_device, 0, ROT90, "TDS & MINTS", "Cosmo", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )
+
GAME( 1980?,invrvnge, 0, invrvnge, invrvnge, driver_device, 0, ROT270, "Zenitone-Microsec Ltd.", "Invader's Revenge (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND ) // copyright is either late-1980, or early-1981
GAME( 1980?,invrvngea, invrvnge, invrvnge, invrvnge, driver_device, 0, ROT270, "Zenitone-Microsec Ltd.", "Invader's Revenge (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND )
GAME( 1980?,invrvngeb, invrvnge, invrvnge, invrvnge, driver_device, 0, ROT270, "Zenitone-Microsec Ltd.", "Invader's Revenge (set 3)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND )
GAME( 1980?,invrvngedu, invrvnge, invrvnge, invrvnge, driver_device, 0, ROT270, "Zenitone-Microsec Ltd. (Dutchford license)", "Invader's Revenge (Dutchford, single PCB)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND )
GAME( 1980?,invrvngegw, invrvnge, invrvnge, invrvnge, driver_device, 0, ROT270, "Zenitone-Microsec Ltd. (Game World license)", "Invader's Revenge (Game World, single PCB)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND )
+
GAME( 1980, vortex, 0, vortex, vortex, _8080bw_state, vortex, ROT270, "Zilec Electronics", "Vortex", MACHINE_IMPERFECT_COLORS | MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) /* Encrypted 8080/IO */
+
GAME( 1979, rollingc, 0, rollingc, rollingc, driver_device, 0, ROT270, "Nichibutsu", "Rolling Crash / Moon Base", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_COLORS | MACHINE_SUPPORTS_SAVE )
+
GAME( 1979, ozmawars, 0, invaders, ozmawars, driver_device, 0, ROT270, "SNK", "Ozma Wars (set 1)", MACHINE_SUPPORTS_SAVE )
GAME( 1979, ozmawars2, ozmawars, invaders, ozmawars, driver_device, 0, ROT270, "SNK", "Ozma Wars (set 2)", MACHINE_SUPPORTS_SAVE ) /* Uses Taito's three board color version of Space Invaders PCB */
GAME( 1979, spaceph, ozmawars, invaders, spaceph, driver_device, 0, ROT270, "bootleg? (Zilec Games)", "Space Phantoms (bootleg of Ozma Wars)", MACHINE_SUPPORTS_SAVE )
GAME( 1979, solfight, ozmawars, invaders, ozmawars, driver_device, 0, ROT270, "bootleg", "Solar Fight (bootleg of Ozma Wars)", MACHINE_SUPPORTS_SAVE )
+
GAME( 1979, yosakdon, 0, yosakdon, yosakdon, driver_device, 0, ROT270, "Wing", "Yosaku To Donbei (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )
GAME( 1979, yosakdona, yosakdon, yosakdon, yosakdon, driver_device, 0, ROT270, "Wing", "Yosaku To Donbei (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )
+
GAMEL(1979, shuttlei, 0, shuttlei, shuttlei, driver_device, 0, ROT270, "Omori Electric Co., Ltd.", "Shuttle Invader", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND, layout_shuttlei )
+
GAMEL(1979, skylove, 0, shuttlei, skylove, driver_device, 0, ROT270, "Omori Electric Co., Ltd.", "Sky Love", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND, layout_shuttlei )
+
GAME (1978, claybust, 0, claybust, claybust, driver_device, 0, ROT0, "Model Racing", "Claybuster", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND ) // no titlescreen, Claybuster according to flyers
+
GAMEL(1980, gunchamp, 0, claybust, gunchamp, driver_device, 0, ROT0, "Model Racing", "Gun Champ", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND, layout_gunchamp ) // no titlescreen, Gun Champ according to original cab
+
GAME( 1980?,astropal, 0, astropal, astropal, driver_device, 0, ROT0, "Sidam?", "Astropal", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )
+
GAMEL(1979?,attackfc, 0, attackfc, attackfc, _8080bw_state, attackfc, ROT0, "Electronic Games Systems", "Attack Force", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND, layout_attackfc )
GAME( 2002, invmulti, 0, invmulti, invmulti, _8080bw_state, invmulti, ROT270, "hack (Braze Technologies)", "Space Invaders Multigame (M8.03D)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/88games.cpp b/src/mame/drivers/88games.cpp
index 81695376892..3aa93366913 100644
--- a/src/mame/drivers/88games.cpp
+++ b/src/mame/drivers/88games.cpp
@@ -50,8 +50,8 @@ WRITE8_MEMBER(_88games_state::bankedram_w)
WRITE8_MEMBER(_88games_state::k88games_5f84_w)
{
/* bits 0/1 coin counters */
- coin_counter_w(machine(), 0, data & 0x01);
- coin_counter_w(machine(), 1, data & 0x02);
+ machine().bookkeeping().coin_counter_w(0, data & 0x01);
+ machine().bookkeeping().coin_counter_w(1, data & 0x02);
/* bit 2 enables ROM reading from the 051316 */
/* also 5fce == 2 read roms, == 3 read ram */
diff --git a/src/mame/drivers/a2600.cpp b/src/mame/drivers/a2600.cpp
index 6c61d71b60f..fc0f9bc5cdf 100644
--- a/src/mame/drivers/a2600.cpp
+++ b/src/mame/drivers/a2600.cpp
@@ -84,7 +84,6 @@ protected:
required_device<vcs_cart_slot_device> m_cart;
required_device<tia_video_device> m_tia;
- unsigned long detect_2600controllers();
required_device<m6507_device> m_maincpu;
required_device<screen_device> m_screen;
required_ioport m_swb;
diff --git a/src/mame/drivers/a5105.cpp b/src/mame/drivers/a5105.cpp
index 44222bdb920..de95d2a33a6 100644
--- a/src/mame/drivers/a5105.cpp
+++ b/src/mame/drivers/a5105.cpp
@@ -484,7 +484,6 @@ void a5105_state::machine_reset()
{
address_space &space = m_maincpu->space(AS_PROGRAM);
a5105_ab_w(space, 0, 9); // turn motor off
- m_beep->set_frequency(500);
m_ram_base = (UINT8*)m_ram->pointer();
m_rom_base = (UINT8*)memregion("maincpu")->base();
@@ -575,7 +574,7 @@ static MACHINE_CONFIG_START( a5105, a5105_state )
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_WAVE_ADD(WAVE_TAG, "cassette")
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
- MCFG_SOUND_ADD("beeper", BEEP, 0)
+ MCFG_SOUND_ADD("beeper", BEEP, 500)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
/* Devices */
diff --git a/src/mame/drivers/a7800.cpp b/src/mame/drivers/a7800.cpp
index 62f211b078e..eda5f74ac07 100644
--- a/src/mame/drivers/a7800.cpp
+++ b/src/mame/drivers/a7800.cpp
@@ -135,11 +135,8 @@ public:
int m_bios_enabled;
DECLARE_READ8_MEMBER(bios_or_cart_r);
- DECLARE_WRITE8_MEMBER(ram0_w);
DECLARE_READ8_MEMBER(tia_r);
DECLARE_WRITE8_MEMBER(tia_w);
- DECLARE_READ8_MEMBER(maria_r);
- DECLARE_WRITE8_MEMBER(maria_w);
DECLARE_DRIVER_INIT(a7800_pal);
DECLARE_DRIVER_INIT(a7800_ntsc);
virtual void machine_start() override;
diff --git a/src/mame/drivers/ace.cpp b/src/mame/drivers/ace.cpp
index 57d96585296..46b86ba5e09 100644
--- a/src/mame/drivers/ace.cpp
+++ b/src/mame/drivers/ace.cpp
@@ -1,4 +1,4 @@
-// license:???
+// license:GPL-2.0+
// copyright-holders:Jarek Burczynski
/****************************************************************************
diff --git a/src/mame/drivers/acefruit.cpp b/src/mame/drivers/acefruit.cpp
index 336e9ff8d43..b869458ace4 100644
--- a/src/mame/drivers/acefruit.cpp
+++ b/src/mame/drivers/acefruit.cpp
@@ -274,7 +274,7 @@ WRITE8_MEMBER(acefruit_state::acefruit_lamp_w)
for( i = 0; i < 8; i++ )
{
- output_set_lamp_value( ( offset * 8 ) + i, ( data >> i ) & 1 );
+ output().set_lamp_value( ( offset * 8 ) + i, ( data >> i ) & 1 );
}
}
@@ -284,7 +284,7 @@ WRITE8_MEMBER(acefruit_state::acefruit_solenoid_w)
for( i = 0; i < 8; i++ )
{
- output_set_indexed_value( "solenoid", i, ( data >> i ) & 1 );
+ output().set_indexed_value( "solenoid", i, ( data >> i ) & 1 );
}
}
diff --git a/src/mame/drivers/aces1.cpp b/src/mame/drivers/aces1.cpp
index 765e151b034..4bc18a85aa9 100644
--- a/src/mame/drivers/aces1.cpp
+++ b/src/mame/drivers/aces1.cpp
@@ -105,7 +105,7 @@ public:
{
if (m_led_strobe != m_input_strobe)
{
- output_set_digit_value(m_input_strobe,data);
+ output().set_digit_value(m_input_strobe,data);
m_led_strobe = m_input_strobe;
}
}
@@ -122,7 +122,7 @@ public:
for (i = 0; i < 8; i++)
{
- output_set_lamp_value((8*m_input_strobe)+i, ((data & (1 << i)) !=0));
+ output().set_lamp_value((8*m_input_strobe)+i, ((data & (1 << i)) !=0));
}
m_lamp_strobe = m_input_strobe;
}
diff --git a/src/mame/drivers/acommand.cpp b/src/mame/drivers/acommand.cpp
index d08c0877b02..5da92a119ce 100644
--- a/src/mame/drivers/acommand.cpp
+++ b/src/mame/drivers/acommand.cpp
@@ -83,7 +83,7 @@ public:
required_shared_ptr<UINT16> m_ac_devram;
tilemap_t *m_tx_tilemap;
tilemap_t *m_bg_tilemap;
- UINT16 *m_ac_vregs;
+ std::unique_ptr<UINT16[]> m_ac_vregs;
UINT16 m_led0;
UINT16 m_led1;
UINT16 m_ufo_sw1;
@@ -199,7 +199,7 @@ void acommand_state::video_start()
m_tx_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(acommand_state::ac_get_tx_tile_info),this),TILEMAP_SCAN_COLS,8,8,512,32);
m_bg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(acommand_state::ac_get_bg_tile_info),this),tilemap_mapper_delegate(FUNC(acommand_state::bg_scan),this),16,16,256,16);
- m_ac_vregs = auto_alloc_array(machine(), UINT16, 0x80/2);
+ m_ac_vregs = std::make_unique<UINT16[]>(0x80/2);
m_tx_tilemap->set_transparent_pen(15);
}
diff --git a/src/mame/drivers/acrnsys1.cpp b/src/mame/drivers/acrnsys1.cpp
index 23d35f2807a..41efa342a61 100644
--- a/src/mame/drivers/acrnsys1.cpp
+++ b/src/mame/drivers/acrnsys1.cpp
@@ -151,7 +151,7 @@ WRITE8_MEMBER( acrnsys1_state::acrnsys1_led_segment_w )
{
UINT8 key_line = m_ttl74145->read();
- output_set_digit_value(key_line, data);
+ output().set_digit_value(key_line, data);
}
diff --git a/src/mame/drivers/age_candy.cpp b/src/mame/drivers/age_candy.cpp
index 355f9e85092..986b9d3771c 100644
--- a/src/mame/drivers/age_candy.cpp
+++ b/src/mame/drivers/age_candy.cpp
@@ -20,13 +20,13 @@ class age_candy_state : public driver_device
public:
age_candy_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
- // ,m_maincpu(*this, "maincpu")
+ // ,m_maincpu(*this, "maincpu")
{ }
virtual void machine_start() override;
virtual void machine_reset() override;
-// required_device<mcs51_cpu_device> m_maincpu;
+// required_device<mcs51_cpu_device> m_maincpu;
};
static INPUT_PORTS_START( age_candy )
@@ -46,9 +46,9 @@ void age_candy_state::machine_reset()
static MACHINE_CONFIG_START( age_candy, age_candy_state )
/* basic machine hardware */
-// MCFG_CPU_ADD("maincpu", ??, 8000000) // unknown (vectors at end? 6xxx ?)
-// MCFG_CPU_PROGRAM_MAP(age_candy_map)
-// MCFG_CPU_IO_MAP(age_candy_io)
+// MCFG_CPU_ADD("maincpu", ??, 8000000) // unknown (vectors at end? 6xxx ?)
+// MCFG_CPU_PROGRAM_MAP(age_candy_map)
+// MCFG_CPU_IO_MAP(age_candy_io)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
@@ -62,4 +62,3 @@ ROM_START( age_cand )
ROM_END
GAME( 19??, age_cand, 0, age_candy, age_candy, driver_device, 0, ROT0, "Advanced Game Engineering", "Candy Crane (AGE)", MACHINE_IS_SKELETON_MECHANICAL )
-
diff --git a/src/mame/drivers/airbustr.cpp b/src/mame/drivers/airbustr.cpp
index 51d80cbcf71..3a000c60c30 100644
--- a/src/mame/drivers/airbustr.cpp
+++ b/src/mame/drivers/airbustr.cpp
@@ -321,10 +321,10 @@ WRITE8_MEMBER(airbustr_state::soundcommand2_w)
WRITE8_MEMBER(airbustr_state::airbustr_coin_counter_w)
{
- coin_counter_w(machine(), 0, data & 1);
- coin_counter_w(machine(), 1, data & 2);
- coin_lockout_w(machine(), 0, ~data & 4);
- coin_lockout_w(machine(), 1, ~data & 8);
+ machine().bookkeeping().coin_counter_w(0, data & 1);
+ machine().bookkeeping().coin_counter_w(1, data & 2);
+ machine().bookkeeping().coin_lockout_w(0, ~data & 4);
+ machine().bookkeeping().coin_lockout_w(1, ~data & 8);
}
/* Memory Maps */
diff --git a/src/mame/drivers/albazc.cpp b/src/mame/drivers/albazc.cpp
index 48febfde020..febf07ebf82 100644
--- a/src/mame/drivers/albazc.cpp
+++ b/src/mame/drivers/albazc.cpp
@@ -118,11 +118,11 @@ WRITE8_MEMBER(albazc_state::hanaroku_out_0_w)
7 meter5 (start)
*/
- coin_counter_w(machine(), 0, data & 0x01);
- coin_counter_w(machine(), 1, data & 0x02);
- coin_counter_w(machine(), 2, data & 0x04);
- coin_counter_w(machine(), 3, data & 0x08);
- coin_counter_w(machine(), 4, data & 0x80);
+ machine().bookkeeping().coin_counter_w(0, data & 0x01);
+ machine().bookkeeping().coin_counter_w(1, data & 0x02);
+ machine().bookkeeping().coin_counter_w(2, data & 0x04);
+ machine().bookkeeping().coin_counter_w(3, data & 0x08);
+ machine().bookkeeping().coin_counter_w(4, data & 0x80);
}
WRITE8_MEMBER(albazc_state::hanaroku_out_1_w)
diff --git a/src/mame/drivers/albazg.cpp b/src/mame/drivers/albazg.cpp
index 0d9dc4ced1a..9666975f2f3 100644
--- a/src/mame/drivers/albazg.cpp
+++ b/src/mame/drivers/albazg.cpp
@@ -192,9 +192,9 @@ WRITE8_MEMBER(albazg_state::mux_w)
WRITE8_MEMBER(albazg_state::yumefuda_output_w)
{
- coin_counter_w(machine(), 0, ~data & 4);
- coin_counter_w(machine(), 1, ~data & 2);
- coin_lockout_global_w(machine(), data & 1);
+ machine().bookkeeping().coin_counter_w(0, ~data & 4);
+ machine().bookkeeping().coin_counter_w(1, ~data & 2);
+ machine().bookkeeping().coin_lockout_global_w(data & 1);
//data & 0x10 hopper-c (active LOW)
//data & 0x08 divider (active HIGH)
flip_screen_set(~data & 0x20);
diff --git a/src/mame/drivers/aleck64.cpp b/src/mame/drivers/aleck64.cpp
index 26499c7b9b2..c86157b6e6a 100644
--- a/src/mame/drivers/aleck64.cpp
+++ b/src/mame/drivers/aleck64.cpp
@@ -184,15 +184,18 @@ public:
m_e90_pal(*this,"e90pal"),
m_dip_read_offset(0) { }
- optional_shared_ptr<UINT32> m_e90_vram;
- optional_shared_ptr<UINT32> m_e90_pal;
DECLARE_DRIVER_INIT(aleck64);
DECLARE_WRITE32_MEMBER(aleck_dips_w);
DECLARE_READ32_MEMBER(aleck_dips_r);
DECLARE_READ16_MEMBER(e90_prot_r);
DECLARE_WRITE16_MEMBER(e90_prot_w);
+
UINT32 screen_update_e90(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+protected:
+ optional_shared_ptr<UINT32> m_e90_vram;
+ optional_shared_ptr<UINT32> m_e90_pal;
+
private:
UINT32 m_dip_read_offset;
};
diff --git a/src/mame/drivers/alesis.cpp b/src/mame/drivers/alesis.cpp
index 605305b6b64..ceda2d749d8 100644
--- a/src/mame/drivers/alesis.cpp
+++ b/src/mame/drivers/alesis.cpp
@@ -44,15 +44,15 @@ READ8_MEMBER( alesis_state::kb_r )
WRITE8_MEMBER( alesis_state::led_w )
{
- output_set_value("patt_led", data & 0x01 ? 1 : 0);
- output_set_value("song_led", data & 0x01 ? 0 : 1);
- output_set_value("play_led", data & 0x02 ? 0 : 1);
- output_set_value("record_led",data & 0x04 ? 0 : 1);
- output_set_value("voice_led", data & 0x08 ? 0 : 1);
- output_set_value("tune_led", data & 0x10 ? 0 : 1);
- output_set_value("mix_led", data & 0x20 ? 0 : 1);
- output_set_value("tempo_led", data & 0x40 ? 0 : 1);
- output_set_value("midi_led", data & 0x80 ? 0 : 1);
+ output().set_value("patt_led", data & 0x01 ? 1 : 0);
+ output().set_value("song_led", data & 0x01 ? 0 : 1);
+ output().set_value("play_led", data & 0x02 ? 0 : 1);
+ output().set_value("record_led",data & 0x04 ? 0 : 1);
+ output().set_value("voice_led", data & 0x08 ? 0 : 1);
+ output().set_value("tune_led", data & 0x10 ? 0 : 1);
+ output().set_value("mix_led", data & 0x20 ? 0 : 1);
+ output().set_value("tempo_led", data & 0x40 ? 0 : 1);
+ output().set_value("midi_led", data & 0x80 ? 0 : 1);
}
READ8_MEMBER( alesis_state::p3_r )
@@ -76,13 +76,13 @@ WRITE8_MEMBER( alesis_state::sr16_lcd_w )
WRITE8_MEMBER( alesis_state::mmt8_led_w )
{
- output_set_value("play_led", data & 0x01 ? 0 : 1);
- output_set_value("record_led" , data & 0x02 ? 0 : 1);
- output_set_value("part_led", data & 0x04 ? 0 : 1);
- output_set_value("edit_led", data & 0x08 ? 0 : 1);
- output_set_value("song_led", data & 0x10 ? 0 : 1);
- output_set_value("echo_led", data & 0x20 ? 0 : 1);
- output_set_value("loop_led", data & 0x40 ? 0 : 1);
+ output().set_value("play_led", data & 0x01 ? 0 : 1);
+ output().set_value("record_led" , data & 0x02 ? 0 : 1);
+ output().set_value("part_led", data & 0x04 ? 0 : 1);
+ output().set_value("edit_led", data & 0x08 ? 0 : 1);
+ output().set_value("song_led", data & 0x10 ? 0 : 1);
+ output().set_value("echo_led", data & 0x20 ? 0 : 1);
+ output().set_value("loop_led", data & 0x40 ? 0 : 1);
m_leds = data;
}
@@ -95,7 +95,7 @@ READ8_MEMBER( alesis_state::mmt8_led_r )
WRITE8_MEMBER( alesis_state::track_led_w )
{
for (int i=0; i<8; i++)
- output_set_indexed_value("track_led", i + 1, BIT(data, i));
+ output().set_indexed_value("track_led", i + 1, BIT(data, i));
}
READ8_MEMBER( alesis_state::mmt8_p3_r )
diff --git a/src/mame/drivers/alg.cpp b/src/mame/drivers/alg.cpp
index e3003b2c940..17ca6b176e0 100644
--- a/src/mame/drivers/alg.cpp
+++ b/src/mame/drivers/alg.cpp
@@ -56,7 +56,6 @@ public:
DECLARE_DRIVER_INIT(pal);
DECLARE_VIDEO_START(alg);
- TIMER_CALLBACK_MEMBER(response_timer);
protected:
// amiga_state overrides
@@ -214,11 +213,11 @@ ADDRESS_MAP_END
static INPUT_PORTS_START( alg )
PORT_START("joy_0_dat") /* read by Amiga core */
- PORT_BIT( 0x0303, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, alg_state,amiga_joystick_convert, 0)
+ PORT_BIT( 0x0303, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, alg_state,amiga_joystick_convert, (void *)0)
PORT_BIT( 0xfcfc, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_START("joy_1_dat") /* read by Amiga core */
- PORT_BIT( 0x0303, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, alg_state,amiga_joystick_convert, 1)
+ PORT_BIT( 0x0303, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, alg_state,amiga_joystick_convert, (void *)1)
PORT_BIT( 0xfcfc, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_START("potgo") /* read by Amiga core */
@@ -756,7 +755,7 @@ DRIVER_INIT_MEMBER(alg_state,aplatoon)
/* NOT DONE TODO FIGURE OUT THE RIGHT ORDER!!!! */
UINT8 *rom = memregion("user2")->base();
- UINT8 *decrypted = auto_alloc_array(machine(), UINT8, 0x40000);
+ std::unique_ptr<UINT8[]> decrypted = std::make_unique<UINT8[]>(0x40000);
int i;
static const int shuffle[] =
@@ -766,8 +765,8 @@ DRIVER_INIT_MEMBER(alg_state,aplatoon)
};
for (i = 0; i < 64; i++)
- memcpy(decrypted + i * 0x1000, rom + shuffle[i] * 0x1000, 0x1000);
- memcpy(rom, decrypted, 0x40000);
+ memcpy(decrypted.get() + i * 0x1000, rom + shuffle[i] * 0x1000, 0x1000);
+ memcpy(rom, decrypted.get(), 0x40000);
logerror("decrypt done\n ");
}
diff --git a/src/mame/drivers/aliens.cpp b/src/mame/drivers/aliens.cpp
index 3a059979220..907b16a65fa 100644
--- a/src/mame/drivers/aliens.cpp
+++ b/src/mame/drivers/aliens.cpp
@@ -20,8 +20,8 @@ Preliminary driver by:
WRITE8_MEMBER(aliens_state::aliens_coin_counter_w)
{
/* bits 0-1 = coin counters */
- coin_counter_w(machine(), 0, data & 0x01);
- coin_counter_w(machine(), 1, data & 0x02);
+ machine().bookkeeping().coin_counter_w(0, data & 0x01);
+ machine().bookkeeping().coin_counter_w(1, data & 0x02);
/* bit 5 = select work RAM or palette */
m_bank0000->set_bank((data & 0x20) >> 5);
diff --git a/src/mame/drivers/allied.cpp b/src/mame/drivers/allied.cpp
index c34ecd51e3d..9b96c72ab22 100644
--- a/src/mame/drivers/allied.cpp
+++ b/src/mame/drivers/allied.cpp
@@ -408,34 +408,34 @@ WRITE8_MEMBER( allied_state::ic4_b_w )
{
if (!BIT(data, i+4))
{
- output_set_digit_value(i*10, patterns[0]);
+ output().set_digit_value(i*10, patterns[0]);
segment = (m_player_score[i] >> 0) & 15;
- output_set_digit_value(i*10+1, patterns[segment]);
+ output().set_digit_value(i*10+1, patterns[segment]);
segment = (m_player_score[i] >> 4) & 15;
- output_set_digit_value(i*10+2, patterns[segment]);
+ output().set_digit_value(i*10+2, patterns[segment]);
segment = (m_player_score[i] >> 8) & 15;
- output_set_digit_value(i*10+3, patterns[segment]);
+ output().set_digit_value(i*10+3, patterns[segment]);
segment = (m_player_score[i] >> 12) & 15;
- output_set_digit_value(i*10+4, patterns[segment]);
+ output().set_digit_value(i*10+4, patterns[segment]);
segment = (m_player_score[i] >> 16) & 15;
- output_set_digit_value(i*10+5, patterns[segment]);
+ output().set_digit_value(i*10+5, patterns[segment]);
}
else
{
- output_set_digit_value(i*10, 0);
- output_set_digit_value(i*10+1, 0);
- output_set_digit_value(i*10+2, 0);
- output_set_digit_value(i*10+3, 0);
- output_set_digit_value(i*10+4, 0);
- output_set_digit_value(i*10+5, 0);
+ output().set_digit_value(i*10, 0);
+ output().set_digit_value(i*10+1, 0);
+ output().set_digit_value(i*10+2, 0);
+ output().set_digit_value(i*10+3, 0);
+ output().set_digit_value(i*10+4, 0);
+ output().set_digit_value(i*10+5, 0);
}
}
// doesn't seem to be a strobe for the credits display
segment = (m_player_score[4] >> 0) & 15;
- output_set_digit_value(40, patterns[segment]);
+ output().set_digit_value(40, patterns[segment]);
segment = (m_player_score[4] >> 4) & 15;
- output_set_digit_value(41, patterns[segment]);
+ output().set_digit_value(41, patterns[segment]);
// PB0-3 - player 1-4 LED - to do
}
@@ -569,12 +569,12 @@ WRITE8_MEMBER( allied_state::ic8_a_w )
// PB0-4 = ball 1-5 LED; PB5 = shoot again lamp
WRITE8_MEMBER( allied_state::ic8_b_w )
{
- output_set_value("led1", !BIT(data, 0));
- output_set_value("led2", !BIT(data, 1));
- output_set_value("led3", !BIT(data, 2));
- output_set_value("led4", !BIT(data, 3));
- output_set_value("led5", !BIT(data, 4));
- output_set_value("led6", !BIT(data, 5));
+ output().set_value("led1", !BIT(data, 0));
+ output().set_value("led2", !BIT(data, 1));
+ output().set_value("led3", !BIT(data, 2));
+ output().set_value("led4", !BIT(data, 3));
+ output().set_value("led5", !BIT(data, 4));
+ output().set_value("led6", !BIT(data, 5));
}
// this line not emulated in PinMAME, maybe it isn't needed
@@ -604,7 +604,7 @@ void allied_state::machine_reset()
m_ic6a2 = 0;
m_ic6b4 = 0;
m_ic6b7 = 0;
- output_set_value("led0", 1); //1=off
+ output().set_value("led0", 1); //1=off
}
static MACHINE_CONFIG_START( allied, allied_state )
diff --git a/src/mame/drivers/alpha68k.cpp b/src/mame/drivers/alpha68k.cpp
index 42ae3dc31ba..953cc63cd8d 100644
--- a/src/mame/drivers/alpha68k.cpp
+++ b/src/mame/drivers/alpha68k.cpp
@@ -202,7 +202,7 @@ DIP locations verified from manuals for:
WRITE16_MEMBER(alpha68k_state::tnextspc_coin_counters_w)
{
- coin_counter_w(machine(), offset, data & 0x01);
+ machine().bookkeeping().coin_counter_w(offset, data & 0x01);
}
WRITE16_MEMBER(alpha68k_state::tnextspc_unknown_w)
diff --git a/src/mame/drivers/alphasma.cpp b/src/mame/drivers/alphasma.cpp
index 2ef3f77f253..f7f0d58d3a5 100644
--- a/src/mame/drivers/alphasma.cpp
+++ b/src/mame/drivers/alphasma.cpp
@@ -62,7 +62,7 @@ protected:
UINT8 m_matrix[2];
UINT8 m_port_a;
UINT8 m_port_d;
- bitmap_ind16 * m_tmp_bitmap;
+ std::unique_ptr<bitmap_ind16> m_tmp_bitmap;
};
class asma2k_state : public alphasmart_state
@@ -404,7 +404,7 @@ void alphasmart_state::machine_start()
m_rambank->configure_entries(0, 4, ram, 0x8000);
m_nvram->set_base(ram, 0x8000*4);
- m_tmp_bitmap = auto_bitmap_ind16_alloc(machine(), 6*40, 9*4);
+ m_tmp_bitmap = std::make_unique<bitmap_ind16>(6 * 40, 9 * 4);
}
void alphasmart_state::machine_reset()
diff --git a/src/mame/drivers/alphatro.cpp b/src/mame/drivers/alphatro.cpp
index a5a3968d8aa..77f72f939b3 100644
--- a/src/mame/drivers/alphatro.cpp
+++ b/src/mame/drivers/alphatro.cpp
@@ -396,7 +396,6 @@ void alphatro_state::machine_reset()
m_cassold = 0;
m_usart->write_rxd(0);
m_beep->set_state(0);
- m_beep->set_frequency(950); /* piezo-device needs to be measured */
}
PALETTE_INIT_MEMBER(alphatro_state, alphatro)
@@ -465,7 +464,7 @@ static MACHINE_CONFIG_START( alphatro, alphatro_state )
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
- MCFG_SOUND_ADD("beeper", BEEP, 0)
+ MCFG_SOUND_ADD("beeper", BEEP, 950) /* piezo-device needs to be measured */
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
MCFG_SOUND_WAVE_ADD(WAVE_TAG, "cassette")
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
diff --git a/src/mame/drivers/alto2.cpp b/src/mame/drivers/alto2.cpp
index c2142b0c304..7f1884639a5 100644
--- a/src/mame/drivers/alto2.cpp
+++ b/src/mame/drivers/alto2.cpp
@@ -143,17 +143,17 @@ static INPUT_PORTS_START( alto2 )
PORT_KEY(A2_KEY_FR5, KEYCODE_F9, 0, 0, "FR5" ) //!< ADL right function key 5
PORT_START("mouseb0") // Mouse button 0
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_NAME("Mouse RED (left)") PORT_PLAYER(1) PORT_CODE(MOUSECODE_BUTTON1) PORT_CHANGED_MEMBER( ":maincpu", alto2_cpu_device, mouse_button_0, 0 )
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_NAME("Mouse RED (left)") PORT_PLAYER(1) PORT_CODE(MOUSECODE_BUTTON1) PORT_CHANGED_MEMBER( ":maincpu", alto2_cpu_device, mouse_button_0, nullptr )
PORT_START("mouseb1") // Mouse button 1
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON2) PORT_NAME("Mouse BLUE (right)") PORT_PLAYER(1) PORT_CODE(MOUSECODE_BUTTON2) PORT_CHANGED_MEMBER( ":maincpu", alto2_cpu_device, mouse_button_1, 0 )
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON2) PORT_NAME("Mouse BLUE (right)") PORT_PLAYER(1) PORT_CODE(MOUSECODE_BUTTON2) PORT_CHANGED_MEMBER( ":maincpu", alto2_cpu_device, mouse_button_1, nullptr )
PORT_START("mouseb2") // Mouse button 2
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON3) PORT_NAME("Mouse YELLOW (middle)") PORT_PLAYER(1) PORT_CODE(MOUSECODE_BUTTON3) PORT_CHANGED_MEMBER( ":maincpu", alto2_cpu_device, mouse_button_2, 0 )
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON3) PORT_NAME("Mouse YELLOW (middle)") PORT_PLAYER(1) PORT_CODE(MOUSECODE_BUTTON3) PORT_CHANGED_MEMBER( ":maincpu", alto2_cpu_device, mouse_button_2, nullptr )
PORT_START("mousex") // Mouse - X AXIS
- PORT_BIT( 0xffff, 0x00, IPT_MOUSE_X) PORT_SENSITIVITY(100) PORT_KEYDELTA(1) PORT_CHANGED_MEMBER( ":maincpu", alto2_cpu_device, mouse_motion_x, 0 )
+ PORT_BIT( 0xffff, 0x00, IPT_MOUSE_X) PORT_SENSITIVITY(100) PORT_KEYDELTA(1) PORT_CHANGED_MEMBER( ":maincpu", alto2_cpu_device, mouse_motion_x, nullptr )
PORT_START("mousey") // Mouse - Y AXIS
- PORT_BIT( 0xffff, 0x00, IPT_MOUSE_Y) PORT_SENSITIVITY(100) PORT_KEYDELTA(1) PORT_CHANGED_MEMBER( ":maincpu", alto2_cpu_device, mouse_motion_y, 0 )
+ PORT_BIT( 0xffff, 0x00, IPT_MOUSE_Y) PORT_SENSITIVITY(100) PORT_KEYDELTA(1) PORT_CHANGED_MEMBER( ":maincpu", alto2_cpu_device, mouse_motion_y, nullptr )
PORT_START("CONFIG") /* Memory switch on AIM board */
PORT_CONFNAME( 0x01, 0x01, "Memory switch")
diff --git a/src/mame/drivers/amaticmg.cpp b/src/mame/drivers/amaticmg.cpp
index 88e5c820560..3640330b2f3 100644
--- a/src/mame/drivers/amaticmg.cpp
+++ b/src/mame/drivers/amaticmg.cpp
@@ -594,10 +594,10 @@ WRITE8_MEMBER(amaticmg_state::out_a_w)
-x-- ---- HOLD4
*/
- output_set_lamp_value(0, (data >> 3) & 1); /* START */
- output_set_lamp_value(1, (data >> 4) & 1); /* BET */
- output_set_lamp_value(2, (data >> 5) & 1); /* HOLD3 */
- output_set_lamp_value(3, (data >> 6) & 1); /* HOLD4 */
+ output().set_lamp_value(0, (data >> 3) & 1); /* START */
+ output().set_lamp_value(1, (data >> 4) & 1); /* BET */
+ output().set_lamp_value(2, (data >> 5) & 1); /* HOLD3 */
+ output().set_lamp_value(3, (data >> 6) & 1); /* HOLD4 */
logerror("port A: %2X\n", data);
}
@@ -615,12 +615,12 @@ WRITE8_MEMBER(amaticmg_state::out_c_w)
x--- ---- Hopper motor
--x- x--- (unknown)
*/
- output_set_lamp_value(4, (data >> 1) & 1); /* HOLD1 */
- output_set_lamp_value(5, (data >> 4) & 1); /* HOLD2 */
- output_set_lamp_value(6, (data >> 6) & 1); /* CANCEL */
+ output().set_lamp_value(4, (data >> 1) & 1); /* HOLD1 */
+ output().set_lamp_value(5, (data >> 4) & 1); /* HOLD2 */
+ output().set_lamp_value(6, (data >> 6) & 1); /* CANCEL */
-// coin_counter_w(machine(), 0, data & 0x04); /* Coin In */
-// coin_counter_w(machine(), 1, data & 0x01); /* Coin Out */
+// machine().bookkeeping().coin_counter_w(0, data & 0x04); /* Coin In */
+// machine().bookkeeping().coin_counter_w(1, data & 0x01); /* Coin Out */
logerror("port C: %2X\n", data);
}
diff --git a/src/mame/drivers/ambush.cpp b/src/mame/drivers/ambush.cpp
index b4d9479edaa..835e601f91b 100644
--- a/src/mame/drivers/ambush.cpp
+++ b/src/mame/drivers/ambush.cpp
@@ -49,8 +49,8 @@
WRITE8_MEMBER(ambush_state::ambush_coin_counter_w)
{
- coin_counter_w(machine(), 0, data & 0x01);
- coin_counter_w(machine(), 1, data & 0x02);
+ machine().bookkeeping().coin_counter_w(0, data & 0x01);
+ machine().bookkeeping().coin_counter_w(1, data & 0x02);
}
WRITE8_MEMBER(ambush_state::flip_screen_w)
diff --git a/src/mame/drivers/amerihok.cpp b/src/mame/drivers/amerihok.cpp
index 4a558aaaefd..aa8a19ae9e2 100644
--- a/src/mame/drivers/amerihok.cpp
+++ b/src/mame/drivers/amerihok.cpp
@@ -24,13 +24,13 @@ class amerihok_state : public driver_device
public:
amerihok_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
- // ,m_maincpu(*this, "maincpu")
+ // ,m_maincpu(*this, "maincpu")
{ }
virtual void machine_start() override;
virtual void machine_reset() override;
-// required_device<mcs51_cpu_device> m_maincpu;
+// required_device<mcs51_cpu_device> m_maincpu;
};
static INPUT_PORTS_START( amerihok )
@@ -50,9 +50,9 @@ void amerihok_state::machine_reset()
static MACHINE_CONFIG_START( amerihok, amerihok_state )
/* basic machine hardware */
-// MCFG_CPU_ADD("maincpu", ??, 8000000) // unknown
-// MCFG_CPU_PROGRAM_MAP(amerihok_map)
-// MCFG_CPU_IO_MAP(amerihok_io)
+// MCFG_CPU_ADD("maincpu", ??, 8000000) // unknown
+// MCFG_CPU_PROGRAM_MAP(amerihok_map)
+// MCFG_CPU_IO_MAP(amerihok_io)
// MCFG_CPU_VBLANK_INT_DRIVER("screen", amerihok_state, irq0_line_hold)
/* sound hardware */
@@ -75,4 +75,3 @@ ROM_START( amerihok )
ROM_END
GAME( 19??, amerihok, 0, amerihok, amerihok, driver_device, 0, ROT0, "<unknown>", "Ameri-Hockey", MACHINE_IS_SKELETON_MECHANICAL )
-
diff --git a/src/mame/drivers/amico2k.cpp b/src/mame/drivers/amico2k.cpp
index 3d692b34082..0bb1952d8a3 100644
--- a/src/mame/drivers/amico2k.cpp
+++ b/src/mame/drivers/amico2k.cpp
@@ -106,7 +106,7 @@ TIMER_CALLBACK_MEMBER(amico2k_state::led_refresh)
{
if (m_ls145_p > 3)
{
- output_set_digit_value(m_ls145_p - 4, m_segment);
+ output().set_digit_value(m_ls145_p - 4, m_segment);
}
}
diff --git a/src/mame/drivers/amiga.cpp b/src/mame/drivers/amiga.cpp
index 047ef2929c8..edca3b6b9b9 100644
--- a/src/mame/drivers/amiga.cpp
+++ b/src/mame/drivers/amiga.cpp
@@ -909,7 +909,7 @@ WRITE8_MEMBER( cd32_state::akiko_cia_0_port_a_write )
m_cdda->set_output_gain(0, BIT(data, 0) ? 0.0 : 1.0);
// bit 1, power led
- set_led_status(machine(), 0, BIT(data, 1) ? 0 : 1);
+ output().set_led_value(0, BIT(data, 1) ? 0 : 1);
handle_cd32_joystick_cia(machine(), data, m_cia_0->read(space, 2));
}
@@ -1198,16 +1198,16 @@ static INPUT_PORTS_START( amiga )
PORT_CONFSETTING(0x20, DEF_STR(Joystick) )
PORT_START("cia_0_port_a")
- PORT_BIT(0x3f, IP_ACTIVE_HIGH, IPT_SPECIAL) PORT_CUSTOM_MEMBER(DEVICE_SELF, amiga_state, floppy_drive_status, 0)
+ PORT_BIT(0x3f, IP_ACTIVE_HIGH, IPT_SPECIAL) PORT_CUSTOM_MEMBER(DEVICE_SELF, amiga_state, floppy_drive_status, (void *)0)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_PLAYER(1)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_PLAYER(2)
PORT_START("joy_0_dat")
- PORT_BIT(0x0303, IP_ACTIVE_HIGH, IPT_SPECIAL) PORT_CUSTOM_MEMBER(DEVICE_SELF, amiga_state, amiga_joystick_convert, 0)
+ PORT_BIT(0x0303, IP_ACTIVE_HIGH, IPT_SPECIAL) PORT_CUSTOM_MEMBER(DEVICE_SELF, amiga_state, amiga_joystick_convert, (void *)0)
PORT_BIT(0xfcfc, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_START("joy_1_dat")
- PORT_BIT(0x0303, IP_ACTIVE_HIGH, IPT_SPECIAL) PORT_CUSTOM_MEMBER(DEVICE_SELF, amiga_state, amiga_joystick_convert, 1)
+ PORT_BIT(0x0303, IP_ACTIVE_HIGH, IPT_SPECIAL) PORT_CUSTOM_MEMBER(DEVICE_SELF, amiga_state, amiga_joystick_convert, (void *)1)
PORT_BIT(0xfcfc, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_START("potgo")
@@ -1248,19 +1248,19 @@ INPUT_PORTS_START( cd32 )
PORT_MODIFY("cia_0_port_a")
PORT_BIT( 0x3f, IP_ACTIVE_LOW, IPT_SPECIAL )
// this is the regular port for reading a single button joystick on the Amiga, many CD32 games require this to mirror the pad start button!
- PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, cd32_state, cd32_sel_mirror_input, 0)
- PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, cd32_state, cd32_sel_mirror_input, 1)
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, cd32_state, cd32_sel_mirror_input, (void *)0)
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, cd32_state, cd32_sel_mirror_input, (void *)1)
PORT_MODIFY("joy_0_dat")
- PORT_BIT( 0x0303, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, amiga_state, amiga_joystick_convert, 0)
+ PORT_BIT( 0x0303, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, amiga_state, amiga_joystick_convert, (void *)0)
PORT_BIT( 0xfcfc, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_MODIFY("joy_1_dat")
- PORT_BIT( 0x0303, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, amiga_state, amiga_joystick_convert, 1)
+ PORT_BIT( 0x0303, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, amiga_state, amiga_joystick_convert, (void *)1)
PORT_BIT( 0xfcfc, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_MODIFY("potgo")
- PORT_BIT( 0xff00, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, cd32_state, cd32_input, 0)
+ PORT_BIT( 0xff00, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, cd32_state, cd32_input, (void *)0)
PORT_BIT( 0x00ff, IP_ACTIVE_HIGH, IPT_UNUSED )
// CD32 '11' button pad (4 dpad directions + 7 buttons), not read directly
@@ -1668,6 +1668,7 @@ static MACHINE_CONFIG_DERIVED_CLASS( a1200, amiga_base, a1200_state )
MCFG_DEVICE_MODIFY("screen")
MCFG_SCREEN_UPDATE_DRIVER(amiga_state, screen_update_amiga_aga)
+ MCFG_SCREEN_NO_PALETTE
MCFG_DEVICE_REMOVE("palette")
@@ -1695,6 +1696,7 @@ static MACHINE_CONFIG_DERIVED_CLASS( a1200n, a1200, a1200_state )
MCFG_FRAGMENT_ADD(ntsc_video)
MCFG_DEVICE_MODIFY("screen")
MCFG_SCREEN_UPDATE_DRIVER(amiga_state, screen_update_amiga_aga)
+ MCFG_SCREEN_NO_PALETTE
MCFG_DEVICE_MODIFY("amiga")
MCFG_DEVICE_CLOCK(amiga_state::CLK_C1_NTSC)
MCFG_DEVICE_MODIFY("cia_0")
@@ -1719,6 +1721,7 @@ static MACHINE_CONFIG_DERIVED_CLASS( a4000, amiga_base, a4000_state )
MCFG_DEVICE_MODIFY("screen")
MCFG_SCREEN_UPDATE_DRIVER(amiga_state, screen_update_amiga_aga)
+ MCFG_SCREEN_NO_PALETTE
MCFG_DEVICE_REMOVE("palette")
@@ -1739,6 +1742,7 @@ static MACHINE_CONFIG_DERIVED_CLASS( a4000n, a4000, a4000_state )
MCFG_FRAGMENT_ADD(ntsc_video)
MCFG_DEVICE_MODIFY("screen")
MCFG_SCREEN_UPDATE_DRIVER(amiga_state, screen_update_amiga_aga)
+ MCFG_SCREEN_NO_PALETTE
MCFG_DEVICE_MODIFY("amiga")
MCFG_DEVICE_CLOCK(amiga_state::CLK_C1_NTSC)
MCFG_DEVICE_MODIFY("cia_0")
@@ -1763,6 +1767,7 @@ static MACHINE_CONFIG_DERIVED_CLASS( a400030n, a400030, a4000_state )
MCFG_FRAGMENT_ADD(ntsc_video)
MCFG_DEVICE_MODIFY("screen")
MCFG_SCREEN_UPDATE_DRIVER(amiga_state, screen_update_amiga_aga)
+ MCFG_SCREEN_NO_PALETTE
MCFG_DEVICE_MODIFY("amiga")
MCFG_DEVICE_CLOCK(amiga_state::CLK_C1_NTSC)
MCFG_DEVICE_MODIFY("cia_0")
@@ -1796,6 +1801,7 @@ static MACHINE_CONFIG_DERIVED_CLASS( cd32, amiga_base, cd32_state )
MCFG_DEVICE_MODIFY("screen")
MCFG_SCREEN_UPDATE_DRIVER(amiga_state, screen_update_amiga_aga)
+ MCFG_SCREEN_NO_PALETTE
MCFG_DEVICE_REMOVE("palette")
@@ -1822,6 +1828,7 @@ static MACHINE_CONFIG_DERIVED_CLASS( cd32n, cd32, cd32_state )
MCFG_FRAGMENT_ADD(ntsc_video)
MCFG_DEVICE_MODIFY("screen")
MCFG_SCREEN_UPDATE_DRIVER(amiga_state, screen_update_amiga_aga)
+ MCFG_SCREEN_NO_PALETTE
MCFG_DEVICE_MODIFY("amiga")
MCFG_DEVICE_CLOCK(amiga_state::CLK_C1_NTSC)
MCFG_DEVICE_MODIFY("cia_0")
@@ -1846,6 +1853,7 @@ static MACHINE_CONFIG_DERIVED_CLASS( a4000tn, a4000, a4000_state )
MCFG_FRAGMENT_ADD(ntsc_video)
MCFG_DEVICE_MODIFY("screen")
MCFG_SCREEN_UPDATE_DRIVER(amiga_state, screen_update_amiga_aga)
+ MCFG_SCREEN_NO_PALETTE
MCFG_DEVICE_MODIFY("amiga")
MCFG_DEVICE_CLOCK(amiga_state::CLK_C1_NTSC)
MCFG_DEVICE_MODIFY("cia_0")
diff --git a/src/mame/drivers/ampoker2.cpp b/src/mame/drivers/ampoker2.cpp
index 3092d7f0101..16dd4560c80 100644
--- a/src/mame/drivers/ampoker2.cpp
+++ b/src/mame/drivers/ampoker2.cpp
@@ -479,10 +479,10 @@ WRITE8_MEMBER(ampoker2_state::ampoker2_port31_w)
BIT 4 = TWL_YELL ;Tower Light YELLOW
--------------------------------------------------*/
{
- output_set_lamp_value(1, ((data >> 1) & 1)); /* Lamp 1 - BET/RED */
- output_set_lamp_value(6, ((data >> 2) & 1)); /* Lamp 6 - HOLD 4 */
- output_set_lamp_value(4, ((data >> 3) & 1)); /* Lamp 4 - HOLD 2 */
- output_set_lamp_value(8, ((data >> 4) & 1)); /* Lamp 8 - TWR.YELLOW */
+ output().set_lamp_value(1, ((data >> 1) & 1)); /* Lamp 1 - BET/RED */
+ output().set_lamp_value(6, ((data >> 2) & 1)); /* Lamp 6 - HOLD 4 */
+ output().set_lamp_value(4, ((data >> 3) & 1)); /* Lamp 4 - HOLD 2 */
+ output().set_lamp_value(8, ((data >> 4) & 1)); /* Lamp 8 - TWR.YELLOW */
}
@@ -497,7 +497,7 @@ WRITE8_MEMBER(ampoker2_state::ampoker2_port32_w)
BIT 4 =
--------------------------------------------------*/
{
- output_set_lamp_value(5, ((data >> 3) & 1)); /* Lamp 5 - HOLD 3 */
+ output().set_lamp_value(5, ((data >> 3) & 1)); /* Lamp 5 - HOLD 3 */
}
@@ -526,7 +526,7 @@ WRITE8_MEMBER(ampoker2_state::ampoker2_port34_w)
BIT 4 = LAMP_2 ;Lamp 3 (BLACK)
--------------------------------------------------*/
{
- output_set_lamp_value(2, ((data >> 4) & 1)); /* Lamp 2 - BLACK */
+ output().set_lamp_value(2, ((data >> 4) & 1)); /* Lamp 2 - BLACK */
}
@@ -555,10 +555,10 @@ WRITE8_MEMBER(ampoker2_state::ampoker2_port36_w)
BIT 4 = LAMP_3 ;Lamp 3 (HOLD1)
--------------------------------------------------*/
{
- output_set_lamp_value(9, (data & 1)); /* Lamp 9 - TWR.GREEN */
- output_set_lamp_value(7, ((data >> 2) & 1)); /* Lamp 7 - HOLD 5 */
- output_set_lamp_value(0, ((data >> 3) & 1)); /* Lamp 0 - DEAL */
- output_set_lamp_value(3, ((data >> 4) & 1)); /* Lamp 3 - HOLD 1 */
+ output().set_lamp_value(9, (data & 1)); /* Lamp 9 - TWR.GREEN */
+ output().set_lamp_value(7, ((data >> 2) & 1)); /* Lamp 7 - HOLD 5 */
+ output().set_lamp_value(0, ((data >> 3) & 1)); /* Lamp 0 - DEAL */
+ output().set_lamp_value(3, ((data >> 4) & 1)); /* Lamp 3 - HOLD 1 */
}
diff --git a/src/mame/drivers/amusco.cpp b/src/mame/drivers/amusco.cpp
index ea3092ee7ed..9ed26923a71 100644
--- a/src/mame/drivers/amusco.cpp
+++ b/src/mame/drivers/amusco.cpp
@@ -103,7 +103,6 @@ public:
MC6845_ON_UPDATE_ADDR_CHANGED(crtc_addr);
UINT32 screen_update_amusco(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- INTERRUPT_GEN_MEMBER(amusco_interrupt);
required_device<cpu_device> m_maincpu;
required_device<gfxdecode_device> m_gfxdecode;
required_device<pic8259_device> m_pic;
diff --git a/src/mame/drivers/amust.cpp b/src/mame/drivers/amust.cpp
index 4c1848fc548..7f359feabcc 100644
--- a/src/mame/drivers/amust.cpp
+++ b/src/mame/drivers/amust.cpp
@@ -369,7 +369,6 @@ MACHINE_RESET_MEMBER( amust_state, amust )
m_p_videoram = memregion("videoram")->base();
membank("bankr0")->set_entry(0); // point at rom
membank("bankw0")->set_entry(0); // always write to ram
- m_beep->set_frequency(800);
address_space &space = m_maincpu->space(AS_PROGRAM);
space.write_byte(0x38, 0xed);
space.write_byte(0x39, 0x4d);
@@ -409,7 +408,7 @@ static MACHINE_CONFIG_START( amust, amust_state )
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
- MCFG_SOUND_ADD("beeper", BEEP, 0)
+ MCFG_SOUND_ADD("beeper", BEEP, 800)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
/* Devices */
diff --git a/src/mame/drivers/apexc.cpp b/src/mame/drivers/apexc.cpp
index f20a6d29685..dd992f1a209 100644
--- a/src/mame/drivers/apexc.cpp
+++ b/src/mame/drivers/apexc.cpp
@@ -26,7 +26,7 @@ public:
be edited - the existence of this register is a personnal
guess */
- bitmap_ind16 *m_bitmap;
+ std::unique_ptr<bitmap_ind16> m_bitmap;
UINT32 m_old_edit_keys;
int m_old_control_keys;
@@ -568,7 +568,7 @@ void apexc_state::video_start()
int width = m_screen->width();
int height = m_screen->height();
- m_bitmap = auto_bitmap_ind16_alloc(machine(), width, height);
+ m_bitmap = std::make_unique<bitmap_ind16>(width, height);
m_bitmap->fill(0, /*machine().visible_area*/teletyper_window);
}
diff --git a/src/mame/drivers/apollo.cpp b/src/mame/drivers/apollo.cpp
index 2a797604051..38b1368ca32 100644
--- a/src/mame/drivers/apollo.cpp
+++ b/src/mame/drivers/apollo.cpp
@@ -905,13 +905,13 @@ void apollo_state::machine_reset()
// set configuration
omti8621_device::set_verbose(apollo_config(APOLLO_CONF_DISK_TRACE));
threecom3c505_device::set_verbose(apollo_config(APOLLO_CONF_NET_TRACE));
+#endif
if (apollo_config(APOLLO_CONF_NODE_ID))
{
// set node ID from UID of logical volume 1 of logical unit 0
m_node_id->set_node_id_from_disk();
}
-#endif
m_maincpu->set_instruction_hook(read32_delegate(FUNC(apollo_state::apollo_instruction_hook),this));
}
@@ -1053,7 +1053,7 @@ static MACHINE_CONFIG_START( dn3500, apollo_state )
/* keyboard beeper */
MCFG_SPEAKER_STANDARD_MONO("mono")
- MCFG_SOUND_ADD("beep", BEEP, 0)
+ MCFG_SOUND_ADD("beep", BEEP, 1000)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
/* internal ram */
@@ -1077,7 +1077,7 @@ static MACHINE_CONFIG_START( dsp3500, apollo_state )
/* keyboard beeper */
MCFG_SPEAKER_STANDARD_MONO("mono")
- MCFG_SOUND_ADD("beep", BEEP, 0)
+ MCFG_SOUND_ADD("beep", BEEP, 1000)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
/* internal ram */
@@ -1125,7 +1125,7 @@ static MACHINE_CONFIG_START( dsp3000, apollo_state )
/* keyboard beeper */
MCFG_SPEAKER_STANDARD_MONO("mono")
- MCFG_SOUND_ADD("beep", BEEP, 0)
+ MCFG_SOUND_ADD("beep", BEEP, 1000)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
/* internal ram */
@@ -1171,7 +1171,7 @@ static MACHINE_CONFIG_START( dsp5500, apollo_state )
/* keyboard beeper */
MCFG_SPEAKER_STANDARD_MONO("mono")
- MCFG_SOUND_ADD("beep", BEEP, 0)
+ MCFG_SOUND_ADD("beep", BEEP, 1000)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
/* terminal hardware */
diff --git a/src/mame/drivers/apple2e.cpp b/src/mame/drivers/apple2e.cpp
index 465abdc9b80..99bc10dc341 100644
--- a/src/mame/drivers/apple2e.cpp
+++ b/src/mame/drivers/apple2e.cpp
@@ -314,6 +314,8 @@ public:
DECLARE_READ8_MEMBER(c400_int_bank_r);
DECLARE_WRITE8_MEMBER(c400_w);
DECLARE_READ8_MEMBER(c800_r);
+ DECLARE_READ8_MEMBER(c800_int_r);
+ DECLARE_READ8_MEMBER(c800_b2_int_r);
DECLARE_WRITE8_MEMBER(c800_w);
DECLARE_READ8_MEMBER(inh_r);
DECLARE_WRITE8_MEMBER(inh_w);
@@ -1963,6 +1965,40 @@ READ8_MEMBER(apple2e_state::c800_r)
return read_floatingbus();
}
+READ8_MEMBER(apple2e_state::c800_int_r)
+{
+ if ((m_isiicplus) && (offset >= 0x600))
+ {
+ return m_iicplus_ce00[offset-0x600];
+ }
+
+ if (offset == 0x7ff)
+ {
+ m_cnxx_slot = CNXX_UNCLAIMED;
+ update_slotrom_banks();
+ return 0xff;
+ }
+
+ return m_rom_ptr[0x800 + offset];
+}
+
+READ8_MEMBER(apple2e_state::c800_b2_int_r)
+{
+ if ((m_isiicplus) && (offset >= 0x600))
+ {
+ return m_iicplus_ce00[offset-0x600];
+ }
+
+ if (offset == 0x7ff)
+ {
+ m_cnxx_slot = CNXX_UNCLAIMED;
+ update_slotrom_banks();
+ return 0xff;
+ }
+
+ return m_rom_ptr[0x4800 + offset];
+}
+
WRITE8_MEMBER(apple2e_state::c800_w)
{
if ((m_isiicplus) && (offset >= 0x600))
@@ -2385,8 +2421,8 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( c800bank_map, AS_PROGRAM, 8, apple2e_state )
AM_RANGE(0x0000, 0x07ff) AM_READWRITE(c800_r, c800_w)
- AM_RANGE(0x0800, 0x0fff) AM_ROM AM_REGION("maincpu", 0x800)
- AM_RANGE(0x1000, 0x17ff) AM_ROM AM_REGION("maincpu", 0x4800)
+ AM_RANGE(0x0800, 0x0fff) AM_READWRITE(c800_int_r, c800_w)
+ AM_RANGE(0x1000, 0x17ff) AM_READWRITE(c800_b2_int_r, c800_w)
ADDRESS_MAP_END
static ADDRESS_MAP_START( inhbank_map, AS_PROGRAM, 8, apple2e_state )
diff --git a/src/mame/drivers/applix.cpp b/src/mame/drivers/applix.cpp
index db72b467e7f..f2cd3a9650a 100644
--- a/src/mame/drivers/applix.cpp
+++ b/src/mame/drivers/applix.cpp
@@ -117,8 +117,6 @@ public:
DECLARE_READ16_MEMBER(fdc_stat_r);
DECLARE_WRITE16_MEMBER(fdc_data_w);
DECLARE_WRITE16_MEMBER(fdc_cmd_w);
- DECLARE_WRITE_LINE_MEMBER(kbd_clock_w);
- DECLARE_WRITE_LINE_MEMBER(kbd_data_w);
DECLARE_FLOPPY_FORMATS(floppy_formats);
DECLARE_READ8_MEMBER( internal_data_read );
DECLARE_WRITE8_MEMBER( internal_data_write );
@@ -157,7 +155,6 @@ private:
UINT8 m_p3;
UINT16 m_last_write_addr;
UINT8 m_cass_data[4];
- int m_centronics_busy;
required_device<cpu_device> m_maincpu;
required_device<mc6845_device> m_crtc;
required_device<via6522_device> m_via;
diff --git a/src/mame/drivers/aquarium.cpp b/src/mame/drivers/aquarium.cpp
index 6c665a195ce..c8f0d7fb4b1 100644
--- a/src/mame/drivers/aquarium.cpp
+++ b/src/mame/drivers/aquarium.cpp
@@ -26,7 +26,7 @@ Notes:
- A bug in the program code causes the OKI to be reset on the very
first coin inserted.
-// Sound banking + video references
+// Sound banking + video references
// https://www.youtube.com/watch?v=nyAQPrkt_a4
// https://www.youtube.com/watch?v=0gn2Kj2M46Q
@@ -74,7 +74,7 @@ WRITE8_MEMBER(aquarium_state::aquarium_z80_bank_w)
// aquarium bank 0006 00ff - correct (select) 110
// aquarium bank 0005 00ff - level 1 (correct)
// (all music seems correct w/regards the reference video)
-
+
membank("bank1")->set_entry(data & 0x7);
}
@@ -349,7 +349,7 @@ ROM_START( aquarium )
ROM_LOAD16_WORD_SWAP( "aquar3.bin", 0x000000, 0x080000, CRC(f197991e) SHA1(0a217d735e2643605dbfd6ee20f98f46b37d4838) )
ROM_REGION( 0x40000, "audiocpu", 0 ) /* z80 (sound) code */
- ROM_LOAD( "aquar5", 0x000000, 0x40000, CRC(fa555be1) SHA1(07236f2b2ba67e92984b9ddf4a8154221d535245) )
+ ROM_LOAD( "aquar5", 0x000000, 0x40000, CRC(fa555be1) SHA1(07236f2b2ba67e92984b9ddf4a8154221d535245) )
ROM_REGION( 0x100000, "gfx1", 0 ) /* BG Tiles */
ROM_LOAD( "aquar1", 0x000000, 0x080000, CRC(575df6ac) SHA1(071394273e512666fe124facdd8591a767ad0819) ) // 4bpp
@@ -378,7 +378,7 @@ ROM_START( aquariumj )
ROM_LOAD16_WORD_SWAP( "aquar3", 0x000000, 0x080000, CRC(344509a1) SHA1(9deb610732dee5066b3225cd7b1929b767579235) )
ROM_REGION( 0x40000, "audiocpu", 0 ) /* z80 (sound) code */
- ROM_LOAD( "aquar5", 0x000000, 0x40000, CRC(fa555be1) SHA1(07236f2b2ba67e92984b9ddf4a8154221d535245) )
+ ROM_LOAD( "aquar5", 0x000000, 0x40000, CRC(fa555be1) SHA1(07236f2b2ba67e92984b9ddf4a8154221d535245) )
ROM_REGION( 0x100000, "gfx1", 0 ) /* BG Tiles */
ROM_LOAD( "aquar1", 0x000000, 0x080000, CRC(575df6ac) SHA1(071394273e512666fe124facdd8591a767ad0819) ) // 4bpp
diff --git a/src/mame/drivers/arabian.cpp b/src/mame/drivers/arabian.cpp
index ef74167bab0..a2155053875 100644
--- a/src/mame/drivers/arabian.cpp
+++ b/src/mame/drivers/arabian.cpp
@@ -86,8 +86,8 @@ WRITE8_MEMBER(arabian_state::ay8910_portb_w)
m_mcu->set_input_line(INPUT_LINE_RESET, data & 0x10 ? CLEAR_LINE : ASSERT_LINE);
/* clock the coin counters */
- coin_counter_w(machine(), 1, ~data & 0x02);
- coin_counter_w(machine(), 0, ~data & 0x01);
+ machine().bookkeeping().coin_counter_w(1, ~data & 0x02);
+ machine().bookkeeping().coin_counter_w(0, ~data & 0x01);
}
diff --git a/src/mame/drivers/aristmk4.cpp b/src/mame/drivers/aristmk4.cpp
index 8bfe1535524..6d6a2b4b7e2 100644
--- a/src/mame/drivers/aristmk4.cpp
+++ b/src/mame/drivers/aristmk4.cpp
@@ -369,7 +369,7 @@ public:
int m_rtc_data_strobe;
UINT8 *m_shapeRomPtr;
UINT8 m_shapeRom[0xc000];
- UINT8 *m_nvram;
+ std::unique_ptr<UINT8[]> m_nvram;
UINT8 m_psg_data;
int m_ay8910_1;
int m_ay8910_2;
@@ -540,8 +540,8 @@ READ8_MEMBER(aristmk4_state::u3_p2)
int u3_p2_ret= ioport("5002")->read();
int u3_p3_ret= ioport("5003")->read();
- output_set_lamp_value(19, (u3_p2_ret >> 4) & 1); //auditkey light
- output_set_lamp_value(20, (u3_p3_ret >> 2) & 1); //jackpotkey light
+ output().set_lamp_value(19, (u3_p2_ret >> 4) & 1); //auditkey light
+ output().set_lamp_value(20, (u3_p3_ret >> 2) & 1); //jackpotkey light
if (m_u3_p0_w&0x20) // DOPTE on
{
@@ -695,10 +695,10 @@ WRITE8_MEMBER(aristmk4_state::mkiv_pia_outb)
switch(i+1)
{
case 4:
- output_set_value("creditspendmeter", emet[i]);
+ output().set_value("creditspendmeter", emet[i]);
break;
case 5:
- output_set_value("creditoutmeter", emet[i]);
+ output().set_value("creditoutmeter", emet[i]);
break;
default:
printf("Unhandled Mechanical meter %d pulse: %02d\n",i+1, emet[i]);
@@ -713,10 +713,10 @@ WRITE8_MEMBER(aristmk4_state::mkiv_pia_outb)
switch(i+1)
{
case 4:
- output_set_value("creditspendmeter", 0);
+ output().set_value("creditspendmeter", 0);
break;
case 5:
- output_set_value("creditoutmeter", 0);
+ output().set_value("creditoutmeter", 0);
break;
default:
break;
@@ -748,7 +748,7 @@ TIMER_CALLBACK_MEMBER(aristmk4_state::coin_input_reset)
TIMER_CALLBACK_MEMBER(aristmk4_state::hopper_reset)
{
m_hopper_motor = 0x01;
- output_set_value("hopper_motor", m_hopper_motor);
+ output().set_value("hopper_motor", m_hopper_motor);
}
// Port A read (SW1)
@@ -808,7 +808,7 @@ READ8_MEMBER(aristmk4_state::via_b_r)
ret=ret^0x40;
machine().scheduler().timer_set(attotime::from_msec(175), timer_expired_delegate(FUNC(aristmk4_state::hopper_reset),this));
m_hopper_motor=0x02;
- output_set_value("hopper_motor", m_hopper_motor);
+ output().set_value("hopper_motor", m_hopper_motor);
break;
case 0x01:
break; //default
@@ -918,42 +918,42 @@ WRITE_LINE_MEMBER(aristmk4_state::via_cb2_w)
else if (m_hopper_motor<0x02)
m_hopper_motor=state;
- output_set_value("hopper_motor", m_hopper_motor); // stop motor
+ output().set_value("hopper_motor", m_hopper_motor); // stop motor
}
// Lamp output
WRITE8_MEMBER(aristmk4_state::pblp_out)
{
- output_set_lamp_value(1, (data) & 1);
- output_set_lamp_value(5, (data >> 1) & 1);
- output_set_lamp_value(9, (data >> 2) & 1);
- output_set_lamp_value(11,(data >> 3) & 1);
- output_set_lamp_value(3, (data >> 4) & 1);
- output_set_lamp_value(4, (data >> 5) & 1);
- output_set_lamp_value(2, (data >> 6) & 1);
- output_set_lamp_value(10,(data >> 7) & 1);
+ output().set_lamp_value(1, (data) & 1);
+ output().set_lamp_value(5, (data >> 1) & 1);
+ output().set_lamp_value(9, (data >> 2) & 1);
+ output().set_lamp_value(11,(data >> 3) & 1);
+ output().set_lamp_value(3, (data >> 4) & 1);
+ output().set_lamp_value(4, (data >> 5) & 1);
+ output().set_lamp_value(2, (data >> 6) & 1);
+ output().set_lamp_value(10,(data >> 7) & 1);
//logerror("Lights port A %02X\n",data);
}
WRITE8_MEMBER(aristmk4_state::pbltlp_out)
{
- output_set_lamp_value(8, (data) & 1);
- output_set_lamp_value(12, (data >> 1) & 1);
- output_set_lamp_value(6, (data >> 2) & 1);
- output_set_lamp_value(7, (data >> 3) & 1);
- output_set_lamp_value(14, (data >> 4) & 1); // light tower
- output_set_lamp_value(15, (data >> 5) & 1); // light tower
- output_set_lamp_value(16, (data >> 6) & 1); // light tower
- output_set_lamp_value(17, (data >> 7) & 1); // light tower
+ output().set_lamp_value(8, (data) & 1);
+ output().set_lamp_value(12, (data >> 1) & 1);
+ output().set_lamp_value(6, (data >> 2) & 1);
+ output().set_lamp_value(7, (data >> 3) & 1);
+ output().set_lamp_value(14, (data >> 4) & 1); // light tower
+ output().set_lamp_value(15, (data >> 5) & 1); // light tower
+ output().set_lamp_value(16, (data >> 6) & 1); // light tower
+ output().set_lamp_value(17, (data >> 7) & 1); // light tower
//logerror("Lights port B: %02X\n",data);
}
WRITE8_MEMBER(aristmk4_state::mlamps)
{
/* TAKE WIN AND GAMBLE LAMPS */
- output_set_lamp_value(18, (data >> 5) & 1);
- output_set_lamp_value(13, (data >> 6) & 1);
+ output().set_lamp_value(18, (data >> 5) & 1);
+ output().set_lamp_value(13, (data >> 6) & 1);
}
WRITE8_MEMBER(aristmk4_state::zn434_w)
@@ -1661,12 +1661,12 @@ DRIVER_INIT_MEMBER(aristmk4_state,aristmk4)
{
m_shapeRomPtr = (UINT8 *)memregion("tile_gfx")->base();
memcpy(m_shapeRom,m_shapeRomPtr,sizeof(m_shapeRom)); // back up
- m_nvram = auto_alloc_array(machine(), UINT8, 0x1000);
+ m_nvram = std::make_unique<UINT8[]>(0x1000);
}
void aristmk4_state::machine_start()
{
- save_pointer(NAME(m_nvram), 0x1000); // m_nvram
+ save_pointer(NAME(m_nvram.get()), 0x1000); // m_nvram
}
void aristmk4_state::machine_reset()
diff --git a/src/mame/drivers/aristmk5.cpp b/src/mame/drivers/aristmk5.cpp
index 882fd175d2a..02483949fea 100644
--- a/src/mame/drivers/aristmk5.cpp
+++ b/src/mame/drivers/aristmk5.cpp
@@ -1337,45 +1337,47 @@ ROM_END
* Game Drivers *
*************************/
+#define MACHINE_FLAGS MACHINE_NOT_WORKING|MACHINE_IMPERFECT_SOUND|MACHINE_IMPERFECT_GRAPHICS
+
// YEAR NAME PARENT MACHINE INPUT STATE INIT ROT COMPANY FULLNAME FLAGS
-GAME( 1995, aristmk5, 0, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "MKV Set/Clear Chips (USA)", MACHINE_NOT_WORKING|MACHINE_IS_BIOS_ROOT )
+GAME( 1995, aristmk5, 0, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "MKV Set/Clear Chips (USA)", MACHINE_FLAGS|MACHINE_IS_BIOS_ROOT )
// Dates listed below are for the combination (reel layout), not release dates
-GAME( 1995, enchfrst, 0, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Enchanted Forest (0400122V, Local)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_SOUND ) // 570/3, E - 23/06/95
-GAME( 1995, swthrt2v, 0, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Sweet Hearts II (01J01986, Venezuela)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_SOUND ) // 577/1, C - 07/09/95
-GAME( 1996, minemine, aristmk5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Mine, Mine, Mine (Export)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_SOUND ) // 559/2, E - 14/02/96
-GAME( 1996, dolphntr, 0, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Dolphin Treasure (0200424V, NSW/ACT)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_SOUND ) // 602/1, B - 06/12/96, Rev 3
-GAME( 1996, dolphtra, dolphntr, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Dolphin Treasure (0100424V, NSW/ACT)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_SOUND ) // 602/1, B - 06/12/96, Rev 1.24.4.0
-GAME( 1996, dolphtre, aristmk5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Dolphin Treasure (Export)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_SOUND ) // 602/1, B - 06/12/96
-GAME( 1996, cashcham, aristmk5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Cash Chameleon (Export)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_SOUND ) // 603(a), B - 06/12/96
-GAME( 1997, enchfore, aristmk5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Enchanted Forest (MV4033, Export, 94.97%)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_SOUND ) // MV4033, B - 10/02/97
-GAME( 1997, mgarden, aristmk5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Magic Garden (AHG1211, Export, 88.26%)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_SOUND ) // MV4033, B - 10/02/97
-GAME( 1997, goldprmd, aristmk5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Golden Pyramids (MV4091, USA)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_SOUND ) // MV4091, B - 13/05/97
-GAME( 1997, goldpyra, aristmk5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Golden Pyramids (AHG1206-99, NSW/ACT, 87.928%)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_SOUND ) // 602/2, B - 13/05/97
-GAME( 1997, qotn, 0, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Queen of the Nile (0200439V, NSW/ACT)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_SOUND ) // 602/4, B - 13/05/97
-GAME( 1997, qotna, aristmk5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Queen of the Nile (MV4091, NSW/ACT)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_SOUND ) // MV4091, B - 13/05/97 (US-Export HW?)
-GAME( 1997, wldcougr, aristmk5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Wild Cougar (Export)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_SOUND ) // 569/8, D - 19/05/97
-GAME( 1997, dmdtouch, 0, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Diamond Touch (0400433V, Local)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_SOUND ) // 604, E - 30/06/97
-GAME( 1997, bumblbug, aristmk5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Bumble Bugs (Export, 92.691%)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_SOUND ) // 593, D - 05/07/97
-GAME( 1997, pengpays, aristmk5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Penguin Pays (Export)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_SOUND ) // 586/7(b) B - 14/07/97
-GAME( 1997, trpdlght, aristmk5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Tropical Delight (PHG0625-02, Export, 92.25%)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_SOUND ) // 577/3, D - 24/09/97
-GAME( 1998, chickena, aristmk5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Chicken (RHG0730, Export, 92.588%, touch)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_SOUND ) // 596, C - 23/02/98
-GAME( 1998, adonis, 0, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Adonis (0200751V, NSW/ACT)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_SOUND ) // 602/9, A - 25/05/98, Rev 10
-GAME( 1998, adonisa, adonis, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Adonis (0100751V, NSW/ACT)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_SOUND ) // 602/9, A - 25/05/98, Rev 9
-GAME( 1998, swheart2, aristmk5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Sweet Hearts II (PHG0742, Export, 92.252%)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_SOUND ) // MV4061, A - 29/06/98
-GAME( 1998, reelrock, 0, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Reelin-n-Rockin (0100779V, Local)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_SOUND ) // 628, A - 13/07/98
-GAME( 1998, thgamblr, aristmk5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "The Gambler (EHG0916, Export, 92.268%)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_SOUND ) // MV4084/1, A - 30/10/98
-GAME( 1998, indiandr, 0, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Indian Dreaming (0100845V, Local)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_SOUND ) // 628/1, B - 15/12/98
-GAME( 1998, chariotc, 0, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "The Chariot Challenge (04J00714, NSW/ACT)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_SOUND ) // 630, A - 10/08/98, Rev 12
-GAME( 1999, wtiger, 0, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "White Tiger Classic (0200954V, NSW/ACT)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_SOUND ) // 638/1, B - 08/07/99
-GAME( 1999, bootsctn, aristmk5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Boot Scootin' (Export, 92.767%)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_SOUND ) // MV4098, A - 25/08/99
-GAME( 2000, cuckoo, aristmk5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Cuckoo (MV4104, Export)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_SOUND ) // MV4104, C - 02/02/00
-GAME( 2000, magicmsk, aristmk5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Magic Mask (MV4115, Export, set 1)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_SOUND ) // MV4115, A - 09/05/00
-GAME( 2000, magicmska, magicmsk, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Magic Mask (MV4115, Export, set 2)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_SOUND ) // MV4115, A - 09/05/00
-GAME( 2000, margmgc, 0, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Margarita Magic (01J00101, NSW/ACT)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_SOUND ) // JB005, A - 07/07/00
-GAME( 2000, marmagic, aristmk5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Margarita Magic (EHG1559, NSW/ACT)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_SOUND ) // US003, A - 07/07/00
-GAME( 2001, prtygras, aristmk5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Party Gras (MV4115/3, Export, touch)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_SOUND ) // MV4115/3, B - 06/02/01
-GAME( 2001, geishanz, 0, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Geisha (0101408V, New Zealand)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_SOUND ) // MV4127, A - 05/03/01
-GAME( 2001, adonise, aristmk5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Adonis (MV4124/1, Export)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_SOUND ) // MV4124/1, B - 31/07/01
-GAME( 2001, koalamnt, aristmk5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Koala Mint (MV4137, Export)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_SOUND ) // MV4137, A - 12/09/01
-GAME( 2001, partygrs, aristmk5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Party Gras (MV4115/6, Export)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_SOUND ) // MV4115/6, A - 10/11/01
+GAME( 1995, enchfrst, 0, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Enchanted Forest (0400122V, Local)", MACHINE_FLAGS ) // 570/3, E - 23/06/95
+GAME( 1995, swthrt2v, 0, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Sweet Hearts II (01J01986, Venezuela)", MACHINE_FLAGS ) // 577/1, C - 07/09/95
+GAME( 1996, minemine, aristmk5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Mine, Mine, Mine (Export)", MACHINE_FLAGS ) // 559/2, E - 14/02/96
+GAME( 1996, dolphntr, 0, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Dolphin Treasure (0200424V, NSW/ACT)", MACHINE_FLAGS ) // 602/1, B - 06/12/96, Rev 3
+GAME( 1996, dolphtra, dolphntr, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Dolphin Treasure (0100424V, NSW/ACT)", MACHINE_FLAGS ) // 602/1, B - 06/12/96, Rev 1.24.4.0
+GAME( 1996, dolphtre, aristmk5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Dolphin Treasure (Export)", MACHINE_FLAGS ) // 602/1, B - 06/12/96
+GAME( 1996, cashcham, aristmk5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Cash Chameleon (Export)", MACHINE_FLAGS ) // 603(a), B - 06/12/96
+GAME( 1997, enchfore, aristmk5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Enchanted Forest (MV4033, Export, 94.97%)", MACHINE_FLAGS ) // MV4033, B - 10/02/97
+GAME( 1997, mgarden, aristmk5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Magic Garden (AHG1211, Export, 88.26%)", MACHINE_FLAGS ) // MV4033, B - 10/02/97
+GAME( 1997, goldprmd, aristmk5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Golden Pyramids (MV4091, USA)", MACHINE_FLAGS ) // MV4091, B - 13/05/97
+GAME( 1997, goldpyra, aristmk5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Golden Pyramids (AHG1206-99, NSW/ACT, 87.928%)", MACHINE_FLAGS ) // 602/2, B - 13/05/97
+GAME( 1997, qotn, 0, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Queen of the Nile (0200439V, NSW/ACT)", MACHINE_FLAGS ) // 602/4, B - 13/05/97
+GAME( 1997, qotna, aristmk5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Queen of the Nile (MV4091, NSW/ACT)", MACHINE_FLAGS ) // MV4091, B - 13/05/97 (US-Export HW?)
+GAME( 1997, wldcougr, aristmk5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Wild Cougar (Export)", MACHINE_FLAGS ) // 569/8, D - 19/05/97
+GAME( 1997, dmdtouch, 0, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Diamond Touch (0400433V, Local)", MACHINE_FLAGS ) // 604, E - 30/06/97
+GAME( 1997, bumblbug, aristmk5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Bumble Bugs (Export, 92.691%)", MACHINE_FLAGS ) // 593, D - 05/07/97
+GAME( 1997, pengpays, aristmk5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Penguin Pays (Export)", MACHINE_FLAGS ) // 586/7(b) B - 14/07/97
+GAME( 1997, trpdlght, aristmk5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Tropical Delight (PHG0625-02, Export, 92.25%)", MACHINE_FLAGS ) // 577/3, D - 24/09/97
+GAME( 1998, chickena, aristmk5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Chicken (RHG0730, Export, 92.588%, touch)", MACHINE_FLAGS ) // 596, C - 23/02/98
+GAME( 1998, adonis, 0, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Adonis (0200751V, NSW/ACT)", MACHINE_FLAGS ) // 602/9, A - 25/05/98, Rev 10
+GAME( 1998, adonisa, adonis, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Adonis (0100751V, NSW/ACT)", MACHINE_FLAGS ) // 602/9, A - 25/05/98, Rev 9
+GAME( 1998, swheart2, aristmk5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Sweet Hearts II (PHG0742, Export, 92.252%)", MACHINE_FLAGS ) // MV4061, A - 29/06/98
+GAME( 1998, reelrock, 0, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Reelin-n-Rockin (0100779V, Local)", MACHINE_FLAGS ) // 628, A - 13/07/98
+GAME( 1998, thgamblr, aristmk5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "The Gambler (EHG0916, Export, 92.268%)", MACHINE_FLAGS ) // MV4084/1, A - 30/10/98
+GAME( 1998, indiandr, 0, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Indian Dreaming (0100845V, Local)", MACHINE_FLAGS ) // 628/1, B - 15/12/98
+GAME( 1998, chariotc, 0, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "The Chariot Challenge (04J00714, NSW/ACT)", MACHINE_FLAGS ) // 630, A - 10/08/98, Rev 12
+GAME( 1999, wtiger, 0, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "White Tiger Classic (0200954V, NSW/ACT)", MACHINE_FLAGS ) // 638/1, B - 08/07/99
+GAME( 1999, bootsctn, aristmk5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Boot Scootin' (Export, 92.767%)", MACHINE_FLAGS ) // MV4098, A - 25/08/99
+GAME( 2000, cuckoo, aristmk5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Cuckoo (MV4104, Export)", MACHINE_FLAGS ) // MV4104, C - 02/02/00
+GAME( 2000, magicmsk, aristmk5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Magic Mask (MV4115, Export, set 1)", MACHINE_FLAGS ) // MV4115, A - 09/05/00
+GAME( 2000, magicmska, magicmsk, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Magic Mask (MV4115, Export, set 2)", MACHINE_FLAGS ) // MV4115, A - 09/05/00
+GAME( 2000, margmgc, 0, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Margarita Magic (01J00101, NSW/ACT)", MACHINE_FLAGS ) // JB005, A - 07/07/00
+GAME( 2000, marmagic, aristmk5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Margarita Magic (EHG1559, NSW/ACT)", MACHINE_FLAGS ) // US003, A - 07/07/00
+GAME( 2001, prtygras, aristmk5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Party Gras (MV4115/3, Export, touch)", MACHINE_FLAGS ) // MV4115/3, B - 06/02/01
+GAME( 2001, geishanz, 0, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Geisha (0101408V, New Zealand)", MACHINE_FLAGS ) // MV4127, A - 05/03/01
+GAME( 2001, adonise, aristmk5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Adonis (MV4124/1, Export)", MACHINE_FLAGS ) // MV4124/1, B - 31/07/01
+GAME( 2001, koalamnt, aristmk5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Koala Mint (MV4137, Export)", MACHINE_FLAGS ) // MV4137, A - 12/09/01
+GAME( 2001, partygrs, aristmk5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Party Gras (MV4115/6, Export)", MACHINE_FLAGS ) // MV4115/6, A - 10/11/01
diff --git a/src/mame/drivers/aristmk6.cpp b/src/mame/drivers/aristmk6.cpp
index 8351944fc8b..89b03477cb7 100644
--- a/src/mame/drivers/aristmk6.cpp
+++ b/src/mame/drivers/aristmk6.cpp
@@ -152,7 +152,7 @@ READ8_MEMBER(aristmk6_state::test_r)
default:
logerror("Unmapped read %08x\n", 0x13800000 + offset);
}
-
+
return 0;
}
diff --git a/src/mame/drivers/arkanoid.cpp b/src/mame/drivers/arkanoid.cpp
index d0a245aa029..03dedcd5c4d 100644
--- a/src/mame/drivers/arkanoid.cpp
+++ b/src/mame/drivers/arkanoid.cpp
@@ -12,18 +12,19 @@
Here are the versions we have:
arkanoid The earlier revisions. They each differ in the country byte. These
- arkanoiduo versions work fine with the current MCU rom which needs to be
- arkanoidjb verified against a genuine decapped A75-06.IC16 M68705 MCU.
+ arkanoiduo versions work fine both the bootleg a75-06 MCU rom and the
+ arkanoidjb genuine decapped Taito A75-06.IC16 M68705 MCU.
arkanoidu USA version. A later revision, code has been inserted NOT patched.
The 68705 code for this one was not available; I made it up from
the current A75-06.IC16 changing the level data pointer table.
arkanoidj Japanese version. Final revision, MCU code not dumped.
arkanoidja Japanese version. A later revision with level selector.
- The 68705 code for this one was not available; I made it up from
- the current A75-06.IC16 changing the level data pointer table.
+ The 68705 code for this one was not available; I made it up from
+ the current A75-06.IC16 changing the level data pointer table.
arkanoidjbl Bootleg of the early Japanese version. The only difference is
- that the warning text has been replaced by "WAIT"
- This version works fine with the current A75-06.IC16 MCU ROM
+ that the warning text has been replaced by "WAIT"
+ This version came with its own 68705p3 MCU ROM which is based on
+ the original Taito one.
arkatayt Another bootleg of the early Japanese one, more heavily modified
arkblock Another bootleg of the early Japanese one, more heavily modified
arkbloc2 Another bootleg
@@ -61,8 +62,8 @@ white paint.
The following MCU images were tested on an original Arkanoid PCB using sets
'arkanoid', 'arkanoidu' and 'arkanoiduo' and work as expected.
-(1) MCU image with CRC 0x389a8cfb
-(2) MCU image with CRC 0x515d77b6
+(1) MCU image with CRC 0x389a8cfb <- this is a deprotected copy of the original Taito A75__06 MCU code
+(2) MCU image with CRC 0x515d77b6 <- this is a blackbox-reverse engineered bootleg MCU written by pirates
An MCU found on a Tournament Arkanoid PCB was an unprotected type MC68705P3
and when read the CRC matched (1). So we can assume the MCUs for Arkanoid and
@@ -196,7 +197,7 @@ controller or home-made spinner built from a PC mouse will work but the player m
slowly and the game is unplayable. The Taito geared spinner moves the optical wheel *very*
fast to ensure the player moves fast enough to follow and return the ball easily. The ratio of
the control knob rotation to the optical wheel rotation is 1:20 so for one rotation of the
-control knob the optical wheel rotates 20 times.
+control knob the optical wheel rotates 20 times. The optical quadrature wheel has 24 slots.
Generally a half-turn of the control knob is enough to move the player across the full screen.
The spinner connections are....
@@ -872,15 +873,74 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( mcu_map, AS_PROGRAM, 8, arkanoid_state )
ADDRESS_MAP_GLOBAL_MASK(0x7ff)
+ ADDRESS_MAP_UNMAP_HIGH
AM_RANGE(0x0000, 0x0000) AM_READWRITE(arkanoid_68705_port_a_r, arkanoid_68705_port_a_w)
AM_RANGE(0x0001, 0x0001) AM_READ_PORT("MUX")
AM_RANGE(0x0002, 0x0002) AM_READWRITE(arkanoid_68705_port_c_r, arkanoid_68705_port_c_w)
AM_RANGE(0x0004, 0x0004) AM_WRITE(arkanoid_68705_ddr_a_w)
AM_RANGE(0x0006, 0x0006) AM_WRITE(arkanoid_68705_ddr_c_w)
+ AM_RANGE(0x0008, 0x0008) AM_READWRITE(arkanoid_68705_tdr_r, arkanoid_68705_tdr_w)
+ AM_RANGE(0x0009, 0x0009) AM_READWRITE(arkanoid_68705_tcr_r, arkanoid_68705_tcr_w)
AM_RANGE(0x0010, 0x007f) AM_RAM
AM_RANGE(0x0080, 0x07ff) AM_ROM
ADDRESS_MAP_END
+/* MCU Hookup based on 'Arkanoid_TAITO_(Japan 1986) PCB.rar' from Taro and others at http://zx-pk.ru forums
+ic5 = 74ls669
+ic6 = 74ls669
+ic9 = 74ls257
+ic21 = 74ls393 (? counter)
+ic26 = 74ls74 (two semaphore latches; latch 1 is == m_z80HasWritten and is cleared by ?; latch 2 is == m_68705HasWritten and is set by PC3 being output low, and cleared by ?)
+ic27 = 74ls374 (mcu->z80 latch)
+ic28 = 74ls374 (z80->mcu latch)
+ic31 = 74ls74
+ic32 = 74ls273
+ic43 = 74ls157
+ic45 = 74ls74
+ic46 = 74ls08
+ic87 = 74ls74
+~VCC = 'pulled to vcc through a resistor'
+icxx.y = ic xx pin y
+ +--------\_/--------+
+ GND -- = VSS(GND) -- | 1 28 | <- /RESET = <- ~VCC & ic32.9 (4Q) & ic26.13 (/reset2) & ic26.1 (/reset1)
+ ~VCC & ic26.6 (/1Q) & ic9.10 (I1C) -> = /INT -> | 2 27 | <> PA7 = -> ic27.18 (8D)
+ +5v -- = VCC -- | 3 M 26 | <> PA6 = -> ic27.17 (7D)
+ ic43.1 (select) & ic45.11 (clock2) & ...elsewhere -> = EXTAL -> | 4 C 25 | <> PA5 = -> ic27.14 (6D)
+ GND -- = XTAL -> | 5 6 24 | <> PA4 = -> ic27.13 (5D)
+ +5v -- = VPP -- | 6 8 23 | <> PA3 = -> ic27.3 (1D)
+ic46.4 (A2) & ic31.4 (/preset1) & ic21.1 (1A) & ic87.9 (2Q) -> = TIMER/BOOT -> | 7 7 22 | <> PA2 = -> ic27.4 (2D)
+ ic26.5 (1Q) -> = (NUM) PC0 <> | 8 0 21 | <> PA1 = -> ic27.7 (3D)
+ ic26.8 (/2Q) & ic9.13 (I1D) -> = PC1 <> | 9 5 20 | <> PA0 = <> ic27.8 (4D) & ic28.9 (4Q)
+ ~VCC & ic26.3 (clock1) & ic28.1 (/OE) <- = PC2 <> | 10 P 19 | <> PB7 = <- ic6.11 (QD)
+ ~VCC & ic26.10 (/preset2) & ic27.11 (EnableG) <- = PC3 <> | 11 5 18 | <> PB6 = <- ic6.12 (QC)
+ ic5.14 (QA) -> = PB0 <> | 12 17 | <> PB5 = <- ic6.13 (QB)
+ ic5.13 (QB) -> = PB1 <> | 13 16 | <> PB4 = <- ic6.14 (QA)
+ ic5.12 (QC) -> = PB2 <> | 14 15 | <> PB3 = <- ic5.11 (QD)
+ +-------------------+
+
+The ic26 semaphores and the /int line:
+ic26 is a 74ls74 with two latches with positive edge triggering:
+latch 1 aka m_z80HasWritten:
+/Reset : <- system reset generator (watchdog?)
+Data : tied to GND on an inner plane
+Clock : <- 68705 PC2, triggered on rising edge, this clears the bit and the /INT
+/Preset : from z80, somehow.
+Q : -> 68705 PC0
+/Q : -> 68705 /INT and z80, somehow
+
+latch 2 aka m_68705HasWritten:
+/Reset : <- system reset generator (watchdog?)
+Data : tied to GND on an inner plane
+Clock : from z80, somehow; also is /oe of ic27
+/Preset : <- 68705 PC3
+Q : N/C
+/Q : -> 68705 PC1 and z80, somehow
+
+Note: despite having a signal on it (possibly vblank or one of the V counter bits), the TIMER/BOOT pin is seemingly never used by the MCU in input mode, so the signal is ignored.
+
+Note2: PA0 is connected to bit 0 of both the z80->68705 latch and the 68705->z80 latch. The board trace from http://zx-pk.ru is known to be incomplete, so its likely all of the PAx bits go both ways.
+*/
+
/***************************************************************************/
@@ -1185,41 +1245,55 @@ GFXDECODE_END
void arkanoid_state::machine_start()
{
- save_item(NAME(m_bootleg_cmd));
+ save_item(NAME(m_gfxbank));
+ save_item(NAME(m_palettebank));
save_item(NAME(m_paddle_select));
- save_item(NAME(m_z80write));
+
+ save_item(NAME(m_bootleg_id));
+ save_item(NAME(m_bootleg_cmd));
+
+ save_item(NAME(m_z80HasWritten));
save_item(NAME(m_fromz80));
- save_item(NAME(m_m68705write));
+ save_item(NAME(m_68705HasWritten));
save_item(NAME(m_toz80));
save_item(NAME(m_port_a_in));
save_item(NAME(m_port_a_out));
save_item(NAME(m_ddr_a));
-
+ save_item(NAME(m_port_c_internal));
save_item(NAME(m_port_c_out));
save_item(NAME(m_ddr_c));
-
- save_item(NAME(m_gfxbank));
- save_item(NAME(m_palettebank));
+ save_item(NAME(m_tdr));
+ save_item(NAME(m_tcr));
}
void arkanoid_state::machine_reset()
{
- m_port_a_in = 0;
- m_port_a_out = 0;
- m_z80write = 0;
- m_m68705write = 0;
+ m_gfxbank = 0;
+ m_palettebank = 0;
- m_bootleg_cmd = 0;
m_paddle_select = 0;
+
+ m_bootleg_cmd = 0;
+
+ // latched data bytes
m_fromz80 = 0;
m_toz80 = 0;
+ // the following 3 are all part of the 74ls74 at ic26 and are cleared on reset
+ m_z80HasWritten = 0;
+ m_68705HasWritten = 0;
+ //if (m_bootleg_id == 0) m_mcu->set_input_line(M68705_IRQ_LINE, CLEAR_LINE); // arkatayt will crash if this line is uncommented, but without this line present, arkanoid will watchdog-reset itself as soon as a level starts after pressing f3/soft reset.
+ // TODO: this can be better dealt with by having a separate machine_reset function for the mculess vs mcu sets.
+
+ m_port_a_in = 0;
+ m_port_a_out = 0;
m_ddr_a = 0;
- m_ddr_c = 0;
+ m_port_c_internal = 0;
m_port_c_out = 0;
- m_gfxbank = 0;
- m_palettebank = 0;
+ m_ddr_c = 0;
+ m_tdr = 0xFF;
+ m_tcr = 0x7F;
}
/*
@@ -1261,10 +1335,11 @@ static MACHINE_CONFIG_START( arkanoid, arkanoid_state )
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
- MCFG_SOUND_ADD("aysnd", YM2149, XTAL_12MHz/4/2) /* YM2149 clock is 3mhz, pin 26 is low so 3mhz/2 */
+ MCFG_SOUND_ADD("aysnd", YM2149, XTAL_12MHz/4) /* YM2149 clock is 3mhz, pin 26 is low so final clock is 3mhz/2, handled inside the ay core */
+ MCFG_AY8910_OUTPUT_TYPE(AY8910_SINGLE_OUTPUT | YM2149_PIN26_LOW) // all outputs are tied together with no resistors, and pin 26 is low
MCFG_AY8910_PORT_A_READ_CB(IOPORT("UNUSED"))
MCFG_AY8910_PORT_B_READ_CB(IOPORT("DSW"))
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.33)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.66)
MACHINE_CONFIG_END
@@ -1325,7 +1400,7 @@ static MACHINE_CONFIG_START( brixian, arkanoid_state )
MCFG_CPU_VBLANK_INT_DRIVER("screen", arkanoid_state, irq0_line_hold)
/* there is a 68705 but it's only role appears to be to copy data to RAM at startup */
- /* the RAM is also battery backed, making the 68705 almost reundant as long as the battery doesn't die(!) */
+ /* the RAM is also battery backed, making the 68705 almost redundant as long as the battery doesn't die(!) */
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
@@ -1353,26 +1428,26 @@ MACHINE_CONFIG_END
/***************************************************************************/
/* ROMs */
-/* rom numbering, with guesses:
- A75 01 = Z80 code 1/2 v1.0 Japan
+/* rom numbering, with guesses for version numbers and missing roms:
+ A75 01 = Z80 code 1/2 v1.0 Japan (NOT DUMPED)
A75 01-1 = Z80 code 1/2 v1.1 Japan and USA/Romstar
A75 02 = Z80 code 2/2 v1.0 Japan
A75 03 = GFX 1/3
A75 04 = GFX 2/3
A75 05 = GFX 3/3
- A75 06 = MC68705P5 MCU code, v1.0 Japan and v1.0 USA/Romstar
+ A75 06 = MC68705P5 MCU code, v1.x Japan and v1.x USA/Romstar (verified to have crc&sha1 of 0be83647 and 625fd1e6061123df612f115ef14a06cd6009f5d1; the rom with crc&sha1 of 4e44b50a and c61e7d158dc8e2b003c8158053ec139b904599af is also probably legit as well, only differing due to a different fill in an unused area from the verified one )
A75 07 = PROM red
A75 08 = PROM green
A75 09 = PROM blue
A75 10 = Z80 code 2/2 v1.1 USA/Romstar
- A75 11 = Z80 code 2/2 v1.2 Japan (paired with 01-1 v1.1 Japan)
+ A75 11 = Z80 code 2/2 v1.2 Japan(World?) (paired with 01-1 v1.1 Japan)
(A75 12 through 17 are unknown, could be another two sets of z80 code plus mc68705p5)
A75 18 = Z80 code v2.0 2/2 USA/Romstar
A75 19 = Z80 code v2.0 1/2 USA/Romstar
A75 20 = MC68705P5 MCU code, v2.0 USA/Romstar
- A75 21 = Z80 code v2.0 1/2 Japan
- A75 22 = Z80 code v2.0 2/2 Japan
- A75 23 = MC68705P5 MCU code, v2.0 Japan
+ A75 21 = Z80 code v2.0 1/2 Japan w/level select
+ A75 22 = Z80 code v2.0 2/2 Japan w/level select
+ A75 23 = MC68705P5 MCU code, v2.0 Japan w/level select
A75 24 = Z80 code v2.1 1/2 Japan
A75 25 = Z80 code v2.1 2/2 Japan
A75 26 = MC68705P5 MCU code, v2.1 Japan
@@ -1385,16 +1460,17 @@ MACHINE_CONFIG_END
A75 33 = PROM red Tournament
A75 34 = PROM green Tournament
A75 35 = PROM blue Tournament
- (one of the 21/22/23 or 24/25/26 sets is likely 'world'? or are these really two japan sets?)
+ A75 36 = Z80 code 1/2 (Tournament v2.0?) (NOT DUMPED)
+ A75 37 = Z80 code 2/2 (Tournament v2.0?) (NOT DUMPED)
*/
-ROM_START( arkanoid )
+ROM_START( arkanoid ) // v1.2 Japan(world?)
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "a75-01-1.ic17", 0x0000, 0x8000, CRC(5bcda3b0) SHA1(52cadd38b5f8e8856f007a9c602d6b508f30be65) )
ROM_LOAD( "a75-11.ic16", 0x8000, 0x8000, CRC(eafd7191) SHA1(d2f8843b716718b1de209e97a874e8ce600f3f87) )
ROM_REGION( 0x0800, "mcu", 0 ) /* 2k for the microcontroller */
- ROM_LOAD( "a75-06.ic14", 0x0000, 0x0800, CRC(515d77b6) SHA1(a302937683d11f663abd56a2fd7c174374e4d7fb) ) // ok for this set
+ ROM_LOAD( "a75__06.ic14", 0x0000, 0x0800, CRC(0be83647) SHA1(625fd1e6061123df612f115ef14a06cd6009f5d1) ) // verified authentic v1.x MCU from Taito/Romstar Board
ROM_REGION( 0x18000, "gfx1", 0 )
ROM_LOAD( "a75-03.ic64", 0x00000, 0x8000, CRC(038b74ba) SHA1(ac053cc4908b4075f918748b89570e07a0ba5116) )
@@ -1407,20 +1483,20 @@ ROM_START( arkanoid )
ROM_LOAD( "a75-09.ic22", 0x0400, 0x0200, CRC(a7c6c277) SHA1(adaa003dcd981576ea1cc5f697d709b2d6b2ea29) ) /* blue component */
// these were decapped, sort them!
- // None of these work with any genuine Arkanoid sets!
- ROM_REGION( 0x0800, "alt_mcus", 0 ) /* 2k for the microcontroller */
- ROM_LOAD( "arkanoid1_68705p3.ic14", 0x0000, 0x0800, CRC(1b68e2d8) SHA1(f642a7cb624ee14fb0e410de5ae1fc799d2fa1c2) ) // this is close to the supported MCU, is it a bootleg?
- ROM_LOAD( "arkanoid_mcu.ic14", 0x0000, 0x0800, CRC(4e44b50a) SHA1(c61e7d158dc8e2b003c8158053ec139b904599af) ) // this has a more genuine Programmed By Yasu 1986 string in it with 0x00 fill near the end
- ROM_LOAD( "arkanoid_68705p5.ic14", 0x0000, 0x0800, CRC(0be83647) SHA1(625fd1e6061123df612f115ef14a06cd6009f5d1) ) // same as above, but with 0xff fill
+ // All of these MCUs work in place of A75 06, see comments for each.
+ ROM_REGION( 0x1800, "alt_mcus", 0 ) /* 2k for the microcontroller */
+ ROM_LOAD( "arkanoid_mcu.ic14", 0x0800, 0x0800, CRC(4e44b50a) SHA1(c61e7d158dc8e2b003c8158053ec139b904599af) ) // This matches the legitimate Taito rom, with a "Programmed By Yasu 1986" string in it, but has a 0x00 fill after the end of the code instead of 0xFF. This matches the legit rom otherwise and may itself be legit, perhaps an artifact of a 68705 programmer at Taito using a sparse s-record/ihex file and not clearing the ram in the chip programmer to 0xFF (or 0x00?) before programming the MCU.
+ ROM_LOAD( "a75-06__bootleg_68705.ic14", 0x1000, 0x0800, CRC(515d77b6) SHA1(a302937683d11f663abd56a2fd7c174374e4d7fb) ) // This was NOT decapped, it came from an unprotected bootleg, and used to be used by the main set. It is definitely a bootleg mcu with no timer or int selftest, and compltely different code altogether, probably implemented by pirates by blackbox-reverse engineering the real MCU.
+ ROM_LOAD( "arkanoid1_68705p3.ic14", 0x0000, 0x0800, CRC(1b68e2d8) SHA1(f642a7cb624ee14fb0e410de5ae1fc799d2fa1c2) ) // This is the same as the 515d77b6 rom above except the bootrom (0x785-0x7f7) is intact. No other difference.
ROM_END
-ROM_START( arkanoidu )
+ROM_START( arkanoidu ) // V2.0 US/Romstar
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "a75-19.ic17", 0x0000, 0x8000, CRC(d3ad37d7) SHA1(a172a1ef5bb83ee2d8ed2842ef8968af19ad411e) )
ROM_LOAD( "a75-18.ic16", 0x8000, 0x8000, CRC(cdc08301) SHA1(05f54353cc8333af14fa985a2764960e20e8161a) )
ROM_REGION( 0x0800, "mcu", 0 ) /* 2k for the microcontroller */
- ROM_LOAD( "a75-20.ic14", 0x0000, 0x0800, BAD_DUMP CRC(de518e47) SHA1(b8eddd1c566505fb69e3d1207c7a9720dfb9f503) ) /* Hand crafted, need the decapped data here */
+ ROM_LOAD( "a75-20.ic14", 0x0000, 0x0800, BAD_DUMP CRC(de518e47) SHA1(b8eddd1c566505fb69e3d1207c7a9720dfb9f503) ) /* Hand crafted based on the bootleg a75-06 chip, need the real data here */
ROM_REGION( 0x18000, "gfx1", 0 )
ROM_LOAD( "a75-03.ic64", 0x00000, 0x8000, CRC(038b74ba) SHA1(ac053cc4908b4075f918748b89570e07a0ba5116) )
@@ -1434,13 +1510,13 @@ ROM_START( arkanoidu )
ROM_END
/* Observed on a real TAITO J1100075A pcb (with K1100181A sticker), pcb is white painted, and has a "ROMSTAR(C) // All Rights Reserved // Serial No. // No 14128" sticker */
-ROM_START( arkanoiduo )
+ROM_START( arkanoiduo ) // V1.1 USA/Romstar
ROM_REGION( 0x10000, "maincpu", 0 ) /* Silkscreen: "IC17 27256" and "IC16 27256" */
ROM_LOAD( "a75__01-1.ic17", 0x0000, 0x8000, CRC(5bcda3b0) SHA1(52cadd38b5f8e8856f007a9c602d6b508f30be65) )
ROM_LOAD( "a75__10.ic16", 0x8000, 0x8000, CRC(a1769e15) SHA1(fbb45731246a098b29eb08de5d63074b496aaaba) )
- ROM_REGION( 0x0800, "mcu", 0 ) /* Silkscreen: "IC14 P5", 2k for the MC68705P5S protected microcontroller */
- ROM_LOAD( "a75__06.ic14", 0x0000, 0x0800, BAD_DUMP CRC(515d77b6) SHA1(a302937683d11f663abd56a2fd7c174374e4d7fb) ) /* Possible bootleg code??, need to re-verify the real decapped/extracted data here */
+ ROM_REGION( 0x0800, "mcu", 0 ) /* 2k for the microcontroller */
+ ROM_LOAD( "a75__06.ic14", 0x0000, 0x0800, CRC(0be83647) SHA1(625fd1e6061123df612f115ef14a06cd6009f5d1) ) // verified authentic v1.x MCU from Taito/Romstar Board
ROM_REGION( 0x18000, "gfx1", 0 ) /* Silkscreen: "IC62 27128/256", "IC63 27128/256", "IC64 27128/256" */
ROM_LOAD( "a75__03.ic64", 0x00000, 0x8000, CRC(038b74ba) SHA1(ac053cc4908b4075f918748b89570e07a0ba5116) )
@@ -1451,15 +1527,18 @@ ROM_START( arkanoiduo )
ROM_LOAD( "a75-07.ic24", 0x0000, 0x0200, CRC(0af8b289) SHA1(6bc589e8a609b4cf450aebedc8ce02d5d45c970f) ) /* Chip Silkscreen: "A75-07"; red component */
ROM_LOAD( "a75-08.ic23", 0x0200, 0x0200, CRC(abb002fb) SHA1(c14f56b8ef103600862e7930709d293b0aa97a73) ) /* Chip Silkscreen: "A75-08"; green component */
ROM_LOAD( "a75-09.ic22", 0x0400, 0x0200, CRC(a7c6c277) SHA1(adaa003dcd981576ea1cc5f697d709b2d6b2ea29) ) /* Chip Silkscreen: "A75-09"; blue component */
+
+ ROM_REGION( 0x8000, "altgfx", 0 )
+ ROM_LOAD( "a75__03(alternate).ic64", 0x00000, 0x8000, CRC(983d4485) SHA1(603a8798d1f531a70a527a5c6122f0ffd6adcfb6) ) // this was found on a legit v1.1 Romstar USA pcb with serial number 29342; the only difference seems to be the first 32 tiles are all 0xFF instead of 0x00. Those tiles don't seem to be used by the game at all. This is likely another incidence of "Taito forgot to clear programmer ram before burning a rom from a sparse s-record/ihex file"
ROM_END
-ROM_START( arkanoidj )
+ROM_START( arkanoidj ) // V2.1 Japan
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "a75_24.ic17", 0x0000, 0x8000, CRC(3f2b27e9) SHA1(656035f5292d6921448e74d3e1abab57b46e7d9e) )
ROM_LOAD( "a75_25.ic16", 0x8000, 0x8000, CRC(c13b2038) SHA1(0b8197b48e57ffe9ccad0ebbc24891d1da7c9880) )
ROM_REGION( 0x0800, "mcu", 0 ) /* 2k for the microcontroller */
- ROM_LOAD( "a75-26.ic14", 0x0000, 0x0800, BAD_DUMP CRC(962960d4) SHA1(64b065a54b1658364db569ac06b717eb7bdd186e) )
+ ROM_LOAD( "a75-26.ic14", 0x0000, 0x0800, BAD_DUMP CRC(962960d4) SHA1(64b065a54b1658364db569ac06b717eb7bdd186e) ) /* Hand crafted based on the bootleg a75-06 chip, need the real data here */
ROM_REGION( 0x18000, "gfx1", 0 )
ROM_LOAD( "a75-03.ic64", 0x00000, 0x8000, CRC(038b74ba) SHA1(ac053cc4908b4075f918748b89570e07a0ba5116) )
@@ -1472,14 +1551,14 @@ ROM_START( arkanoidj )
ROM_LOAD( "a75-09.ic22", 0x0400, 0x0200, CRC(a7c6c277) SHA1(adaa003dcd981576ea1cc5f697d709b2d6b2ea29) ) /* blue component */
ROM_END
-ROM_START( arkanoidja )
+ROM_START( arkanoidja ) // V2.0 Japan w/level select
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "a75-21.ic17", 0x0000, 0x8000, CRC(bf0455fc) SHA1(250522b84b9f491c3f4efc391bf6aa6124361369) )
ROM_LOAD( "a75-22.ic16", 0x8000, 0x8000, CRC(3a2688d3) SHA1(9633a661352def3d85f95ca830f6d761b0b5450e) )
ROM_REGION( 0x0800, "mcu", 0 ) /* 2k for the microcontroller */
// the handcrafted value at 0x351 (0x9ddb) seems incorrect compared to other sets? (but it appears the value is never used, and the data it would usually point to does not exist in the program rom?)
- ROM_LOAD( "a75-23.ic14", 0x0000, 0x0800, BAD_DUMP CRC(0a4abef6) SHA1(fdce0b7a2eab7fd4f1f4fc3b93120b1ebc16078e) ) /* Hand crafted, need the decapped data here */
+ ROM_LOAD( "a75-23.ic14", 0x0000, 0x0800, BAD_DUMP CRC(0a4abef6) SHA1(fdce0b7a2eab7fd4f1f4fc3b93120b1ebc16078e) ) /* Hand crafted based on the bootleg a75-06 chip, need the real data here */
ROM_REGION( 0x18000, "gfx1", 0 )
ROM_LOAD( "a75-03.ic64", 0x00000, 0x8000, CRC(038b74ba) SHA1(ac053cc4908b4075f918748b89570e07a0ba5116) )
@@ -1492,13 +1571,13 @@ ROM_START( arkanoidja )
ROM_LOAD( "a75-09.ic22", 0x0400, 0x0200, CRC(a7c6c277) SHA1(adaa003dcd981576ea1cc5f697d709b2d6b2ea29) ) /* blue component */
ROM_END
-ROM_START( arkanoidjb )
+ROM_START( arkanoidjb ) // V1.1 Japan
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "a75-01-1.ic17", 0x0000, 0x8000, CRC(5bcda3b0) SHA1(52cadd38b5f8e8856f007a9c602d6b508f30be65) )
ROM_LOAD( "a75-02.ic16", 0x8000, 0x8000, CRC(bbc33ceb) SHA1(e9b6fef98d0d20e77c7a1c25eff8e9a8c668a258) )
ROM_REGION( 0x0800, "mcu", 0 ) /* 2k for the microcontroller */
- ROM_LOAD( "a75-06.ic14", 0x0000, 0x0800, BAD_DUMP CRC(515d77b6) SHA1(a302937683d11f663abd56a2fd7c174374e4d7fb) ) /* Possible bootleg code??, need the decapped data here */
+ ROM_LOAD( "a75__06.ic14", 0x0000, 0x0800, CRC(0be83647) SHA1(625fd1e6061123df612f115ef14a06cd6009f5d1) ) // verified authentic v1.x MCU from Taito/Romstar Board
ROM_REGION( 0x18000, "gfx1", 0 )
ROM_LOAD( "a75-03.ic64", 0x00000, 0x8000, CRC(038b74ba) SHA1(ac053cc4908b4075f918748b89570e07a0ba5116) )
@@ -1512,13 +1591,13 @@ ROM_START( arkanoidjb )
ROM_END
-ROM_START( arkatour )
+ROM_START( arkatour ) // Tournament version
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "a75-27.ic17", 0x0000, 0x8000, CRC(e3b8faf5) SHA1(4c09478fa41881fa89ee6afb676aeb780f17ac2e) )
ROM_LOAD( "a75-28.ic16", 0x8000, 0x8000, CRC(326aca4d) SHA1(5a194b7a0361236d471b24905dc6434372f81252) )
ROM_REGION( 0x0800, "mcu", 0 ) /* 2k for the microcontroller */
- ROM_LOAD( "a75-32.ic14", 0x0000, 0x0800, BAD_DUMP CRC(d3249559) SHA1(b1542764450016614e9e03cedd6a2f1e59961789) ) /* Hand crafted, need the decapped data here */
+ ROM_LOAD( "a75-32.ic14", 0x0000, 0x0800, BAD_DUMP CRC(d3249559) SHA1(b1542764450016614e9e03cedd6a2f1e59961789) ) /* Hand crafted based on the bootleg a75-06 chip, need the real data here */
ROM_REGION( 0x18000, "gfx1", 0 )
ROM_LOAD( "a75-29.ic64", 0x00000, 0x8000, CRC(5ddea3cf) SHA1(58f16515898b7cc2697bf7663a60d9ca0db6da95) )
@@ -1531,14 +1610,15 @@ ROM_START( arkatour )
ROM_LOAD( "a75-35.ic22", 0x0400, 0x0200, CRC(38acfd3b) SHA1(2841e9db047aa039eff8567a518b6250b355507b) ) /* blue component */
ROM_END
-ROM_START( arkanoidjbl ) /* This set requires a MCU. The MCU code included doesn't seem to work??? See USER1 region below */
+// Everything from here on is bootlegs
+
+ROM_START( arkanoidjbl )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "e1.6d", 0x0000, 0x8000, CRC(dd4f2b72) SHA1(399a8636030a702dafc1da926f115df6f045bef1) ) /* Hacked up Notice warning text */
ROM_LOAD( "e2.6f", 0x8000, 0x8000, CRC(bbc33ceb) SHA1(e9b6fef98d0d20e77c7a1c25eff8e9a8c668a258) ) /* == A75-02.IC16 */
- /* Use the current A75-06.IC14 MCU code so the game is playable */
ROM_REGION( 0x0800, "mcu", 0 ) /* 2k for the microcontroller */
- ROM_LOAD( "a75-06.ic14", 0x0000, 0x0800, BAD_DUMP CRC(515d77b6) SHA1(a302937683d11f663abd56a2fd7c174374e4d7fb) ) /* Possible bootleg code??, need the decapped data here */
+ ROM_LOAD( "68705p3.6i", 0x0000, 0x0800, CRC(389a8cfb) SHA1(9530c051b61b5bdec7018c6fdc1ea91288a406bd) ) // This set had an unprotected mcu with a bootlegged copy of the real Taito a75__06.ic14 code, unlike the other bootlegs. It has the bootstrap code missing and the security bit cleared, the area after the rom filled with 0x00, and the verify mode disable jump removed. Otherwise it matches a75__06.ic14
ROM_REGION( 0x18000, "gfx1", 0 )
ROM_LOAD( "a75-03.rom", 0x00000, 0x8000, CRC(038b74ba) SHA1(ac053cc4908b4075f918748b89570e07a0ba5116) )
@@ -1550,9 +1630,6 @@ ROM_START( arkanoidjbl ) /* This set requires a MCU. The MCU code included doesn
ROM_LOAD( "a75-08.bpr", 0x0200, 0x0200, CRC(abb002fb) SHA1(c14f56b8ef103600862e7930709d293b0aa97a73) ) /* green component */
ROM_LOAD( "a75-09.bpr", 0x0400, 0x0200, CRC(a7c6c277) SHA1(adaa003dcd981576ea1cc5f697d709b2d6b2ea29) ) /* blue component */
- /* Until we know what this MCU is supposed to do, we put it here */
- ROM_REGION( 0x0800, "user1", 0 )
- ROM_LOAD( "68705p3.6i", 0x0000, 0x0800, CRC(389a8cfb) SHA1(9530c051b61b5bdec7018c6fdc1ea91288a406bd) ) // this has the 1986 by Yasu copyright like some of the new decaps loaded in the parent set!
ROM_END
ROM_START( arkanoidjbl2 )
@@ -1561,7 +1638,7 @@ ROM_START( arkanoidjbl2 )
ROM_LOAD( "2.ic82", 0x8000, 0x8000, CRC(bbc33ceb) SHA1(e9b6fef98d0d20e77c7a1c25eff8e9a8c668a258) ) /* == A75-02.IC16 */
ROM_REGION( 0x0800, "mcu", 0 ) /* 2k for the microcontroller */
- ROM_LOAD( "a75-06.ic14", 0x0000, 0x0800, BAD_DUMP CRC(515d77b6) SHA1(a302937683d11f663abd56a2fd7c174374e4d7fb) ) /* Possible bootleg code??, need the decapped data here */
+ ROM_LOAD( "a75-06__bootleg_68705.ic14", 0x0000, 0x0800, BAD_DUMP CRC(515d77b6) SHA1(a302937683d11f663abd56a2fd7c174374e4d7fb) ) /* Uses the bootleg MCU? Not sure what mcu is supposed to go with this set... */
ROM_REGION( 0x18000, "gfx1", 0 )
ROM_LOAD( "a75-03.ic64", 0x00000, 0x8000, CRC(038b74ba) SHA1(ac053cc4908b4075f918748b89570e07a0ba5116) )
@@ -1581,7 +1658,7 @@ ROM_START( ark1ball ) /* This set requires a MCU. No MCU rom was supplied so we
/* Use the current A75-06.IC14 MCU code so the game is playable */
ROM_REGION( 0x0800, "mcu", 0 ) /* 2k for the microcontroller */
- ROM_LOAD( "a75-06.ic14", 0x0000, 0x0800, BAD_DUMP CRC(515d77b6) SHA1(a302937683d11f663abd56a2fd7c174374e4d7fb) ) /* Possible bootleg code??, need the decapped data here */
+ ROM_LOAD( "a75-06__bootleg_68705.ic14", 0x0000, 0x0800, BAD_DUMP CRC(515d77b6) SHA1(a302937683d11f663abd56a2fd7c174374e4d7fb) ) /* Uses the bootleg MCU? Not sure what mcu is supposed to go with this set... */
ROM_REGION( 0x18000, "gfx1", 0 )
ROM_LOAD( "a-3.3a", 0x00000, 0x8000, CRC(038b74ba) SHA1(ac053cc4908b4075f918748b89570e07a0ba5116) )
@@ -2048,12 +2125,12 @@ DRIVER_INIT_MEMBER(arkanoid_state,brixian)
/* Game Drivers */
// original sets of Arkanoid
-GAME( 1986, arkanoid, 0, arkanoid, arkanoid, driver_device, 0, ROT90, "Taito Corporation Japan", "Arkanoid (World, oldest rev)", MACHINE_SUPPORTS_SAVE )
-GAME( 1986, arkanoidu, arkanoid, arkanoid, arkanoid, driver_device, 0, ROT90, "Taito America Corporation (Romstar license)", "Arkanoid (US)", MACHINE_SUPPORTS_SAVE )
-GAME( 1986, arkanoiduo, arkanoid, arkanoid, arkanoid, driver_device, 0, ROT90, "Taito America Corporation (Romstar license)", "Arkanoid (US, oldest rev)", MACHINE_SUPPORTS_SAVE )
-GAME( 1986, arkanoidj, arkanoid, arkanoid, arkanoidj, driver_device,0, ROT90, "Taito Corporation", "Arkanoid (Japan)", MACHINE_SUPPORTS_SAVE )
-GAME( 1986, arkanoidja, arkanoid, arkanoid, arkanoidj, driver_device,0, ROT90, "Taito Corporation", "Arkanoid (Japan, older rev)", MACHINE_SUPPORTS_SAVE )
-GAME( 1986, arkanoidjb, arkanoid, arkanoid, arkanoidj, driver_device,0, ROT90, "Taito Corporation", "Arkanoid (Japan, oldest rev)", MACHINE_SUPPORTS_SAVE )
+GAME( 1986, arkanoid, 0, arkanoid, arkanoid, driver_device, 0, ROT90, "Taito Corporation Japan", "Arkanoid (World, older)", MACHINE_SUPPORTS_SAVE )
+GAME( 1986, arkanoidu, arkanoid, arkanoid, arkanoid, driver_device, 0, ROT90, "Taito America Corporation (Romstar license)", "Arkanoid (US, newer)", MACHINE_SUPPORTS_SAVE )
+GAME( 1986, arkanoiduo, arkanoid, arkanoid, arkanoid, driver_device, 0, ROT90, "Taito America Corporation (Romstar license)", "Arkanoid (US, older)", MACHINE_SUPPORTS_SAVE )
+GAME( 1986, arkanoidj, arkanoid, arkanoid, arkanoidj, driver_device,0, ROT90, "Taito Corporation", "Arkanoid (Japan, newer)", MACHINE_SUPPORTS_SAVE )
+GAME( 1986, arkanoidja, arkanoid, arkanoid, arkanoidj, driver_device,0, ROT90, "Taito Corporation", "Arkanoid (Japan, newer w/level select)", MACHINE_SUPPORTS_SAVE )
+GAME( 1986, arkanoidjb, arkanoid, arkanoid, arkanoidj, driver_device,0, ROT90, "Taito Corporation", "Arkanoid (Japan, older)", MACHINE_SUPPORTS_SAVE )
// bootlegs of Arkanoid
GAME( 1986, arkanoidjbl, arkanoid, arkanoid, arkanoidj, driver_device,0, ROT90, "bootleg", "Arkanoid (bootleg with MCU, set 1)", MACHINE_SUPPORTS_SAVE )
GAME( 1986, arkanoidjbl2,arkanoid, arkanoid, arkanoidj, driver_device,0, ROT90, "bootleg (Beta)", "Arkanoid (bootleg with MCU, set 2)", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/armedf.cpp b/src/mame/drivers/armedf.cpp
index 352de671596..e2a9dd65b3a 100644
--- a/src/mame/drivers/armedf.cpp
+++ b/src/mame/drivers/armedf.cpp
@@ -319,13 +319,13 @@ Notes:
WRITE16_MEMBER(armedf_state::terraf_io_w)
{
if(data & 0x4000 && ((m_vreg & 0x4000) == 0)) //0 -> 1 transition
- m_nb1414m4->exec((m_text_videoram[0] << 8) | (m_text_videoram[1] & 0xff),m_text_videoram,m_fg_scrollx,m_fg_scrolly,m_tx_tilemap);
+ m_nb1414m4->exec((m_text_videoram[0] << 8) | (m_text_videoram[1] & 0xff),m_text_videoram.get(),m_fg_scrollx,m_fg_scrolly,m_tx_tilemap);
COMBINE_DATA(&m_vreg);
- coin_counter_w(machine(), 0, (data & 1) >> 0);
- coin_counter_w(machine(), 1, (data & 2) >> 1);
+ machine().bookkeeping().coin_counter_w(0, (data & 1) >> 0);
+ machine().bookkeeping().coin_counter_w(1, (data & 2) >> 1);
flip_screen_set(m_vreg & 0x1000);
}
@@ -337,8 +337,8 @@ WRITE16_MEMBER(armedf_state::terrafjb_io_w)
COMBINE_DATA(&m_vreg);
- coin_counter_w(machine(), 0, (data & 1) >> 0);
- coin_counter_w(machine(), 1, (data & 2) >> 1);
+ machine().bookkeeping().coin_counter_w(0, (data & 1) >> 0);
+ machine().bookkeeping().coin_counter_w(1, (data & 2) >> 1);
flip_screen_set(m_vreg & 0x1000);
}
@@ -352,8 +352,8 @@ WRITE16_MEMBER(armedf_state::bootleg_io_w)
COMBINE_DATA(&m_vreg);
- coin_counter_w(machine(), 0, (data & 1) >> 0);
- coin_counter_w(machine(), 1, (data & 2) >> 1);
+ machine().bookkeeping().coin_counter_w(0, (data & 1) >> 0);
+ machine().bookkeeping().coin_counter_w(1, (data & 2) >> 1);
flip_screen_set(m_vreg & 0x1000);
}
@@ -1265,6 +1265,10 @@ static MACHINE_CONFIG_START( terrafjb, armedf_state )
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
MACHINE_CONFIG_END
+static MACHINE_CONFIG_DERIVED( terrafb, terraf )
+ MCFG_DEVICE_REMOVE("nb1414m4")
+MACHINE_CONFIG_END
+
static MACHINE_CONFIG_START( kozure, armedf_state )
/* basic machine hardware */
@@ -2190,7 +2194,7 @@ GAME( 1987, terraf, 0, terraf, terraf, armedf_state, terrafu, RO
GAME( 1987, terrafu, terraf, terraf, terraf, armedf_state, terrafu, ROT0, "Nichibutsu USA", "Terra Force (US)", MACHINE_SUPPORTS_SAVE )
GAME( 1987, terrafj, terraf, terraf, terraf, armedf_state, terrafu, ROT0, "Nichibutsu Japan", "Terra Force (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1987, terrafjb, terraf, terrafjb, terraf, armedf_state, terrafjb, ROT0, "bootleg", "Terra Force (Japan, bootleg with additional Z80)", MACHINE_SUPPORTS_SAVE )
-GAME( 1987, terrafb, terraf, terraf, terraf, armedf_state, terraf, ROT0, "bootleg", "Terra Force (Japan, bootleg set 2)", MACHINE_SUPPORTS_SAVE )
+GAME( 1987, terrafb, terraf, terrafb, terraf, armedf_state, terraf, ROT0, "bootleg", "Terra Force (Japan, bootleg set 2)", MACHINE_SUPPORTS_SAVE )
GAME( 1987, kozure, 0, kozure, kozure, armedf_state, kozure, ROT0, "Nichibutsu", "Kozure Ookami (Japan)", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/arsystems.cpp b/src/mame/drivers/arsystems.cpp
index 3f179e9af70..2ff02959a48 100644
--- a/src/mame/drivers/arsystems.cpp
+++ b/src/mame/drivers/arsystems.cpp
@@ -62,9 +62,10 @@ class arcadia_amiga_state : public amiga_state
{
public:
arcadia_amiga_state(const machine_config &mconfig, device_type type, const char *tag)
- : amiga_state(mconfig, type, tag) { }
-
- UINT8 m_coin_counter[2];
+ : amiga_state(mconfig, type, tag)
+ , m_bios_region(*this, "user2")
+ {
+ }
DECLARE_WRITE16_MEMBER(arcadia_multibios_change_game);
DECLARE_CUSTOM_INPUT_MEMBER(coin_counter_r);
@@ -91,6 +92,10 @@ public:
protected:
virtual void machine_reset() override;
+
+ optional_memory_region m_bios_region;
+
+ UINT8 m_coin_counter[2];
};
@@ -238,15 +243,15 @@ static INPUT_PORTS_START( arcadia )
PORT_SERVICE_NO_TOGGLE( 0x02, IP_ACTIVE_LOW )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START2 )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START1 )
- PORT_BIT( 0x30, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, arcadia_amiga_state,coin_counter_r, 0)
- PORT_BIT( 0xc0, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, arcadia_amiga_state,coin_counter_r, 1)
+ PORT_BIT( 0x30, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, arcadia_amiga_state,coin_counter_r, (void *)0)
+ PORT_BIT( 0xc0, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, arcadia_amiga_state,coin_counter_r, (void *)1)
PORT_START("joy_0_dat")
- PORT_BIT( 0x0303, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, arcadia_amiga_state,amiga_joystick_convert, 0)
+ PORT_BIT( 0x0303, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, arcadia_amiga_state,amiga_joystick_convert, (void *)0)
PORT_BIT( 0xfcfc, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("joy_1_dat")
- PORT_BIT( 0x0303, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, arcadia_amiga_state,amiga_joystick_convert, 1)
+ PORT_BIT( 0x0303, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, arcadia_amiga_state,amiga_joystick_convert, (void *)1)
PORT_BIT( 0xfcfc, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("potgo")
@@ -922,12 +927,16 @@ DRIVER_INIT_MEMBER( arcadia_amiga_state, arcadia )
m_agnus_id = AGNUS_HR_NTSC;
m_denise_id = DENISE;
- /* OnePlay bios is encrypted, TenPlay is not */
- UINT16 *biosrom = (UINT16 *)memregion("user2")->base();
+ if (m_bios_region != NULL)
+ {
+ /* OnePlay bios is encrypted, TenPlay is not */
+ UINT16 *rom = (UINT16 *)m_bios_region->base();
- if (biosrom)
- if (biosrom[0] != 0x4afc)
+ if (rom[0] != 0x4afc)
+ {
generic_decode("user2", 6, 1, 0, 2, 3, 4, 5, 7);
+ }
+ }
}
diff --git a/src/mame/drivers/asteroid.cpp b/src/mame/drivers/asteroid.cpp
index b8b8720c2bb..fc1d88c7169 100644
--- a/src/mame/drivers/asteroid.cpp
+++ b/src/mame/drivers/asteroid.cpp
@@ -207,7 +207,7 @@ There is not a rev 03 known or dumped. An Asteroids rev 03 is not mentioned in a
WRITE8_MEMBER(asteroid_state::astdelux_coin_counter_w)
{
- coin_counter_w(machine(), offset,data);
+ machine().bookkeeping().coin_counter_w(offset,data);
}
@@ -226,7 +226,7 @@ WRITE8_MEMBER(asteroid_state::llander_led_w)
};
for (int i = 0; i < 5; i++)
- output_set_value(lampname[i], (data >> (4 - i)) & 1);
+ output().set_value(lampname[i], (data >> (4 - i)) & 1);
}
diff --git a/src/mame/drivers/astinvad.cpp b/src/mame/drivers/astinvad.cpp
index ba265fb9fec..f98cccb3500 100644
--- a/src/mame/drivers/astinvad.cpp
+++ b/src/mame/drivers/astinvad.cpp
@@ -68,7 +68,7 @@ public:
required_device<palette_device> m_palette;
required_shared_ptr<UINT8> m_videoram;
- UINT8 * m_colorram;
+ std::unique_ptr<UINT8[]> m_colorram;
emu_timer *m_int_timer;
UINT8 m_sound_state[2];
UINT8 m_screen_flip;
@@ -117,10 +117,10 @@ protected:
VIDEO_START_MEMBER(astinvad_state,spaceint)
{
- m_colorram = auto_alloc_array(machine(), UINT8, m_videoram.bytes());
+ m_colorram = std::make_unique<UINT8[]>(m_videoram.bytes());
save_item(NAME(m_color_latch));
- save_pointer(NAME(m_colorram), m_videoram.bytes());
+ save_pointer(NAME(m_colorram.get()), m_videoram.bytes());
}
diff --git a/src/mame/drivers/astrafr.cpp b/src/mame/drivers/astrafr.cpp
index bbf281e33ba..578ac656b8a 100644
--- a/src/mame/drivers/astrafr.cpp
+++ b/src/mame/drivers/astrafr.cpp
@@ -33,11 +33,11 @@ public:
UINT32* m_cpuregion;
int m_cpuregion_size;
- UINT32* m_mainram;
+ std::unique_ptr<UINT32[]> m_mainram;
UINT32* m_slavecpuregion;
int m_slavecpuregion_size;
- UINT32* m_slaveram;
+ std::unique_ptr<UINT32[]> m_slaveram;
@@ -270,11 +270,11 @@ MACHINE_START_MEMBER(astrafr_state,astra_common)
{
m_cpuregion = (UINT32*)memregion( "maincpu" )->base();
m_cpuregion_size = memregion( "maincpu" )->bytes()/4;
- m_mainram = (UINT32*)auto_alloc_array_clear(machine(), UINT32, 0x10000);
+ m_mainram = make_unique_clear<UINT32[]>(0x10000);
m_slavecpuregion = (UINT32*)memregion( "slavecpu" )->base();
m_slavecpuregion_size = memregion( "slavecpu" )->bytes()/4;
- m_slaveram = (UINT32*)auto_alloc_array_clear(machine(), UINT32, 0x10000);
+ m_slaveram = make_unique_clear<UINT32[]>(0x10000);
}
diff --git a/src/mame/drivers/astrcorp.cpp b/src/mame/drivers/astrcorp.cpp
index caa7bbfe118..a82199c5d06 100644
--- a/src/mame/drivers/astrcorp.cpp
+++ b/src/mame/drivers/astrcorp.cpp
@@ -223,18 +223,18 @@ WRITE16_MEMBER(astrocorp_state::showhand_outputs_w)
{
if (ACCESSING_BITS_0_7)
{
- coin_counter_w(machine(), 0, (data & 0x0004)); // coin counter
- set_led_status(machine(), 0, (data & 0x0008)); // you win
- if ((data & 0x0010)) increment_dispensed_tickets(machine(), 1); // coin out
- set_led_status(machine(), 1, (data & 0x0020)); // coin/hopper jam
+ machine().bookkeeping().coin_counter_w(0, (data & 0x0004)); // coin counter
+ output().set_led_value(0, (data & 0x0008)); // you win
+ if ((data & 0x0010)) machine().bookkeeping().increment_dispensed_tickets(1); // coin out
+ output().set_led_value(1, (data & 0x0020)); // coin/hopper jam
}
if (ACCESSING_BITS_8_15)
{
- set_led_status(machine(), 2, (data & 0x0100)); // bet
- set_led_status(machine(), 3, (data & 0x0800)); // start
- set_led_status(machine(), 4, (data & 0x1000)); // ? select/choose
- set_led_status(machine(), 5, (data & 0x2000)); // ? select/choose
- set_led_status(machine(), 6, (data & 0x4000)); // look
+ output().set_led_value(2, (data & 0x0100)); // bet
+ output().set_led_value(3, (data & 0x0800)); // start
+ output().set_led_value(4, (data & 0x1000)); // ? select/choose
+ output().set_led_value(5, (data & 0x2000)); // ? select/choose
+ output().set_led_value(6, (data & 0x4000)); // look
}
// popmessage("%04X",data);
}
@@ -259,23 +259,23 @@ WRITE16_MEMBER(astrocorp_state::skilldrp_outputs_w)
if (ACCESSING_BITS_0_7)
{
- coin_counter_w(machine(), 0, (data & 0x0001)); // key in |
- coin_counter_w(machine(), 0, (data & 0x0002)); // coin in |- manual shows 1 in- and 1 out- counter
- coin_counter_w(machine(), 1, (data & 0x0004)); // key out |
+ machine().bookkeeping().coin_counter_w(0, (data & 0x0001)); // key in |
+ machine().bookkeeping().coin_counter_w(0, (data & 0x0002)); // coin in |- manual shows 1 in- and 1 out- counter
+ machine().bookkeeping().coin_counter_w(1, (data & 0x0004)); // key out |
machine().device<ticket_dispenser_device>("hopper")->write(space, 0, (data & 0x0008)<<4); // hopper motor?
// (data & 0x0010) // hopper?
- set_led_status(machine(), 0, (data & 0x0020)); // error lamp (coin/hopper jam: "call attendant")
+ output().set_led_value(0, (data & 0x0020)); // error lamp (coin/hopper jam: "call attendant")
machine().device<ticket_dispenser_device>("ticket")->write(space, 0, data & 0x0080); // ticket motor?
}
if (ACCESSING_BITS_8_15)
{
// lamps:
- set_led_status(machine(), 1, (data & 0x0100)); // select
- set_led_status(machine(), 2, (data & 0x0400)); // take
- set_led_status(machine(), 3, (data & 0x0800)); // bet
- set_led_status(machine(), 4, (data & 0x1000)); // start
- set_led_status(machine(), 5, (data & 0x4000)); // win / test
- set_led_status(machine(), 6, (data & 0x8000)); // ticket?
+ output().set_led_value(1, (data & 0x0100)); // select
+ output().set_led_value(2, (data & 0x0400)); // take
+ output().set_led_value(3, (data & 0x0800)); // bet
+ output().set_led_value(4, (data & 0x1000)); // start
+ output().set_led_value(5, (data & 0x4000)); // win / test
+ output().set_led_value(6, (data & 0x8000)); // ticket?
}
// popmessage("%04X",data);
diff --git a/src/mame/drivers/astrocde.cpp b/src/mame/drivers/astrocde.cpp
index 9d72c9a9a5f..e9c745f1ecc 100644
--- a/src/mame/drivers/astrocde.cpp
+++ b/src/mame/drivers/astrocde.cpp
@@ -170,13 +170,13 @@ WRITE8_MEMBER(astrocde_state::seawolf2_lamps_w)
/* ------x- torpedo 3 available */
/* -------x torpedo 4 available */
- output_set_lamp_value((offset ^ 1) * 7 + 0, ( data >> 5) & 1); /* 0/7 = hit lamp */
- output_set_lamp_value((offset ^ 1) * 7 + 1, (~data >> 4) & 1); /* 1/8 = reload lamp */
- output_set_lamp_value((offset ^ 1) * 7 + 2, ( data >> 4) & 1); /* 2/9 = ready lamp */
- output_set_lamp_value((offset ^ 1) * 7 + 3, ( data >> 3) & 1); /* 3/10 = torpedo 1 lamp */
- output_set_lamp_value((offset ^ 1) * 7 + 4, ( data >> 2) & 1); /* 4/11 = torpedo 2 lamp */
- output_set_lamp_value((offset ^ 1) * 7 + 5, ( data >> 1) & 1); /* 5/12 = torpedo 3 lamp */
- output_set_lamp_value((offset ^ 1) * 7 + 6, ( data >> 0) & 1); /* 6/13 = torpedo 4 lamp */
+ output().set_lamp_value((offset ^ 1) * 7 + 0, ( data >> 5) & 1); /* 0/7 = hit lamp */
+ output().set_lamp_value((offset ^ 1) * 7 + 1, (~data >> 4) & 1); /* 1/8 = reload lamp */
+ output().set_lamp_value((offset ^ 1) * 7 + 2, ( data >> 4) & 1); /* 2/9 = ready lamp */
+ output().set_lamp_value((offset ^ 1) * 7 + 3, ( data >> 3) & 1); /* 3/10 = torpedo 1 lamp */
+ output().set_lamp_value((offset ^ 1) * 7 + 4, ( data >> 2) & 1); /* 4/11 = torpedo 2 lamp */
+ output().set_lamp_value((offset ^ 1) * 7 + 5, ( data >> 1) & 1); /* 5/12 = torpedo 3 lamp */
+ output().set_lamp_value((offset ^ 1) * 7 + 6, ( data >> 0) & 1); /* 6/13 = torpedo 4 lamp */
}
@@ -220,7 +220,7 @@ WRITE8_MEMBER(astrocde_state::seawolf2_sound_2_w)// Port 41
if (rising_bits & 0x10) m_samples->start(8, 3); /* Right Sonar */
if (rising_bits & 0x20) m_samples->start(3, 3); /* Left Sonar */
- coin_counter_w(machine(), 0, data & 0x40); /* Coin Counter */
+ machine().bookkeeping().coin_counter_w(0, data & 0x40); /* Coin Counter */
}
@@ -247,7 +247,7 @@ WRITE8_MEMBER(astrocde_state::ebases_trackball_select_w)
WRITE8_MEMBER(astrocde_state::ebases_coin_w)
{
- coin_counter_w(machine(), 0, data & 1);
+ machine().bookkeeping().coin_counter_w(0, data & 1);
}
@@ -260,8 +260,8 @@ WRITE8_MEMBER(astrocde_state::ebases_coin_w)
READ8_MEMBER(astrocde_state::spacezap_io_r)
{
- coin_counter_w(machine(), 0, (offset >> 8) & 1);
- coin_counter_w(machine(), 1, (offset >> 9) & 1);
+ machine().bookkeeping().coin_counter_w(0, (offset >> 8) & 1);
+ machine().bookkeeping().coin_counter_w(1, (offset >> 9) & 1);
return m_p3handle ? m_p3handle->read() : 0xff;
}
@@ -279,13 +279,13 @@ READ8_MEMBER(astrocde_state::wow_io_r)
switch ((offset >> 9) & 7)
{
- case 0: coin_counter_w(machine(), 0, data); break;
- case 1: coin_counter_w(machine(), 1, data); break;
+ case 0: machine().bookkeeping().coin_counter_w(0, data); break;
+ case 1: machine().bookkeeping().coin_counter_w(1, data); break;
case 2: m_sparkle[0] = data; break;
case 3: m_sparkle[1] = data; break;
case 4: m_sparkle[2] = data; break;
case 5: m_sparkle[3] = data; break;
- case 7: coin_counter_w(machine(), 2, data); break;
+ case 7: machine().bookkeeping().coin_counter_w(2, data); break;
}
return 0xff;
}
@@ -304,8 +304,8 @@ READ8_MEMBER(astrocde_state::gorf_io_1_r)
switch ((offset >> 9) & 7)
{
- case 0: coin_counter_w(machine(), 0, data); break;
- case 1: coin_counter_w(machine(), 1, data); break;
+ case 0: machine().bookkeeping().coin_counter_w(0, data); break;
+ case 1: machine().bookkeeping().coin_counter_w(1, data); break;
case 2: m_sparkle[0] = data; break;
case 3: m_sparkle[1] = data; break;
case 4: m_sparkle[2] = data; break;
@@ -330,12 +330,12 @@ READ8_MEMBER(astrocde_state::gorf_io_2_r)
switch ((offset >> 9) & 7)
{
- case 0: output_set_lamp_value(0, data); break;
- case 1: output_set_lamp_value(1, data); break;
- case 2: output_set_lamp_value(2, data); break;
- case 3: output_set_lamp_value(3, data); break;
- case 4: output_set_lamp_value(4, data); break;
- case 5: output_set_lamp_value(5, data); break;
+ case 0: output().set_lamp_value(0, data); break;
+ case 1: output().set_lamp_value(1, data); break;
+ case 2: output().set_lamp_value(2, data); break;
+ case 3: output().set_lamp_value(3, data); break;
+ case 4: output().set_lamp_value(4, data); break;
+ case 5: output().set_lamp_value(5, data); break;
case 6: /* n/c */ break;
case 7: osd_printf_debug("io_2:%d\n", data); break;
}
@@ -356,11 +356,11 @@ READ8_MEMBER(astrocde_state::robby_io_r)
switch ((offset >> 9) & 7)
{
- case 0: coin_counter_w(machine(), 0, data); break;
- case 1: coin_counter_w(machine(), 1, data); break;
- case 2: coin_counter_w(machine(), 2, data); break;
- case 6: set_led_status(machine(), 0, data); break;
- case 7: set_led_status(machine(), 1, data); break;
+ case 0: machine().bookkeeping().coin_counter_w(0, data); break;
+ case 1: machine().bookkeeping().coin_counter_w(1, data); break;
+ case 2: machine().bookkeeping().coin_counter_w(2, data); break;
+ case 6: output().set_led_value(0, data); break;
+ case 7: output().set_led_value(1, data); break;
}
return 0xff;
}
@@ -375,22 +375,22 @@ READ8_MEMBER(astrocde_state::robby_io_r)
READ8_MEMBER(astrocde_state::profpac_io_1_r)
{
- coin_counter_w(machine(), 0, (offset >> 8) & 1);
- coin_counter_w(machine(), 1, (offset >> 9) & 1);
- set_led_status(machine(), 0, (offset >> 10) & 1);
- set_led_status(machine(), 1, (offset >> 11) & 1);
+ machine().bookkeeping().coin_counter_w(0, (offset >> 8) & 1);
+ machine().bookkeeping().coin_counter_w(1, (offset >> 9) & 1);
+ output().set_led_value(0, (offset >> 10) & 1);
+ output().set_led_value(1, (offset >> 11) & 1);
return 0xff;
}
READ8_MEMBER(astrocde_state::profpac_io_2_r)
{
- output_set_lamp_value(0, (offset >> 8) & 1); /* left lamp A */
- output_set_lamp_value(1, (offset >> 9) & 1); /* left lamp B */
- output_set_lamp_value(2, (offset >> 10) & 1); /* left lamp C */
- output_set_lamp_value(3, (offset >> 12) & 1); /* right lamp A */
- output_set_lamp_value(4, (offset >> 13) & 1); /* right lamp B */
- output_set_lamp_value(5, (offset >> 14) & 1); /* right lamp C */
+ output().set_lamp_value(0, (offset >> 8) & 1); /* left lamp A */
+ output().set_lamp_value(1, (offset >> 9) & 1); /* left lamp B */
+ output().set_lamp_value(2, (offset >> 10) & 1); /* left lamp C */
+ output().set_lamp_value(3, (offset >> 12) & 1); /* right lamp A */
+ output().set_lamp_value(4, (offset >> 13) & 1); /* right lamp B */
+ output().set_lamp_value(5, (offset >> 14) & 1); /* right lamp C */
return 0xff;
}
@@ -429,10 +429,10 @@ WRITE8_MEMBER(astrocde_state::profpac_banksw_w)
READ8_MEMBER(astrocde_state::demndrgn_io_r)
{
- coin_counter_w(machine(), 0, (offset >> 8) & 1);
- coin_counter_w(machine(), 1, (offset >> 9) & 1);
- set_led_status(machine(), 0, (offset >> 10) & 1);
- set_led_status(machine(), 1, (offset >> 11) & 1);
+ machine().bookkeeping().coin_counter_w(0, (offset >> 8) & 1);
+ machine().bookkeeping().coin_counter_w(1, (offset >> 9) & 1);
+ output().set_led_value(0, (offset >> 10) & 1);
+ output().set_led_value(1, (offset >> 11) & 1);
m_input_select = (offset >> 12) & 1;
return 0xff;
}
@@ -472,26 +472,26 @@ WRITE8_MEMBER(astrocde_state::tenpindx_lamp_w)
/* lamps */
if (offset == 0)
{
- output_set_lamp_value(0, (data >> 2) & 1);
- output_set_lamp_value(1, (data >> 3) & 1);
- output_set_lamp_value(2, (data >> 4) & 1);
- output_set_lamp_value(3, (data >> 5) & 1);
- output_set_lamp_value(4, (data >> 6) & 1);
- output_set_lamp_value(5, (data >> 7) & 1);
+ output().set_lamp_value(0, (data >> 2) & 1);
+ output().set_lamp_value(1, (data >> 3) & 1);
+ output().set_lamp_value(2, (data >> 4) & 1);
+ output().set_lamp_value(3, (data >> 5) & 1);
+ output().set_lamp_value(4, (data >> 6) & 1);
+ output().set_lamp_value(5, (data >> 7) & 1);
}
else
{
- output_set_lamp_value(6, (data >> 0) & 1);
- output_set_lamp_value(7, (data >> 1) & 1);
- output_set_lamp_value(8, (data >> 2) & 1);
- output_set_lamp_value(9, (data >> 3) & 1);
+ output().set_lamp_value(6, (data >> 0) & 1);
+ output().set_lamp_value(7, (data >> 1) & 1);
+ output().set_lamp_value(8, (data >> 2) & 1);
+ output().set_lamp_value(9, (data >> 3) & 1);
}
}
WRITE8_MEMBER(astrocde_state::tenpindx_counter_w)
{
- coin_counter_w(machine(), 0, (data >> 0) & 1);
+ machine().bookkeeping().coin_counter_w(0, (data >> 0) & 1);
if (data & 0xfc) osd_printf_debug("tenpindx_counter_w = %02X\n", data);
}
@@ -501,15 +501,15 @@ WRITE8_MEMBER(astrocde_state::tenpindx_lights_w)
/* "flashlights" */
int which = data >> 4;
- output_set_lamp_value(10, (which == 1));
- output_set_lamp_value(11, (which == 2));
- output_set_lamp_value(12, (which == 3));
- output_set_lamp_value(13, (which == 4));
- output_set_lamp_value(14, (which == 5));
- output_set_lamp_value(15, (which == 6));
- output_set_lamp_value(16, (which == 7));
- output_set_lamp_value(17, (which == 8));
- output_set_lamp_value(18, (which == 9));
+ output().set_lamp_value(10, (which == 1));
+ output().set_lamp_value(11, (which == 2));
+ output().set_lamp_value(12, (which == 3));
+ output().set_lamp_value(13, (which == 4));
+ output().set_lamp_value(14, (which == 5));
+ output().set_lamp_value(15, (which == 6));
+ output().set_lamp_value(16, (which == 7));
+ output().set_lamp_value(17, (which == 8));
+ output().set_lamp_value(18, (which == 9));
}
diff --git a/src/mame/drivers/astrof.cpp b/src/mame/drivers/astrof.cpp
index 76e0dbed3f4..66d4584066f 100644
--- a/src/mame/drivers/astrof.cpp
+++ b/src/mame/drivers/astrof.cpp
@@ -106,7 +106,7 @@ INPUT_CHANGED_MEMBER(astrof_state::coin_inserted)
{
/* coin insertion causes an NMI */
m_maincpu->set_input_line(INPUT_LINE_NMI, newval ? ASSERT_LINE : CLEAR_LINE);
- coin_counter_w(machine(), 0, newval);
+ machine().bookkeeping().coin_counter_w(0, newval);
}
@@ -170,8 +170,8 @@ CUSTOM_INPUT_MEMBER(astrof_state::tomahawk_controls_r)
void astrof_state::video_start()
{
/* allocate the color RAM -- half the size of the video RAM as A0 is not connected */
- m_colorram = auto_alloc_array(machine(), UINT8, m_videoram.bytes() / 2);
- save_pointer(NAME(m_colorram), m_videoram.bytes() / 2);
+ m_colorram = std::make_unique<UINT8[]>(m_videoram.bytes() / 2);
+ save_pointer(NAME(m_colorram.get()), m_videoram.bytes() / 2);
}
diff --git a/src/mame/drivers/atari400.cpp b/src/mame/drivers/atari400.cpp
index 6be7bc28c37..17573b3bac9 100644
--- a/src/mame/drivers/atari400.cpp
+++ b/src/mame/drivers/atari400.cpp
@@ -291,8 +291,6 @@ public:
DECLARE_WRITE8_MEMBER(a130xe_low_w);
DECLARE_READ8_MEMBER(xegs_low_r);
DECLARE_WRITE8_MEMBER(xegs_low_w);
- DECLARE_READ8_MEMBER(xegs_high_r);
- DECLARE_WRITE8_MEMBER(xegs_high_w);
TIMER_DEVICE_CALLBACK_MEMBER(a400_interrupt);
TIMER_DEVICE_CALLBACK_MEMBER(a800xl_interrupt);
diff --git a/src/mame/drivers/atari_s1.cpp b/src/mame/drivers/atari_s1.cpp
index 69439f81b12..48bc91e6816 100644
--- a/src/mame/drivers/atari_s1.cpp
+++ b/src/mame/drivers/atari_s1.cpp
@@ -372,13 +372,13 @@ TIMER_DEVICE_CALLBACK_MEMBER( atari_s1_state::nmi )
// Player number
char wordnum[8];
sprintf(wordnum,"text%d",m_out_offs>>2);
- output_set_value(wordnum, !BIT(patterns[m_p_ram[m_out_offs]&15], 6)); // uses 'g' segment
+ output().set_value(wordnum, !BIT(patterns[m_p_ram[m_out_offs]&15], 6)); // uses 'g' segment
}
else
{
// Digits
- output_set_digit_value(m_out_offs << 1, patterns[m_p_ram[m_out_offs]>>4]);
- output_set_digit_value((m_out_offs << 1)+1, patterns[m_p_ram[m_out_offs]&15]);
+ output().set_digit_value(m_out_offs << 1, patterns[m_p_ram[m_out_offs]>>4]);
+ output().set_digit_value((m_out_offs << 1)+1, patterns[m_p_ram[m_out_offs]&15]);
}
}
diff --git a/src/mame/drivers/atari_s2.cpp b/src/mame/drivers/atari_s2.cpp
index 71b2c5035f4..1399a296577 100644
--- a/src/mame/drivers/atari_s2.cpp
+++ b/src/mame/drivers/atari_s2.cpp
@@ -350,7 +350,7 @@ WRITE8_MEMBER( atari_s2_state::display_w )
{
data &= 7;
for (UINT8 i = 0; i < 7; i++)
- output_set_digit_value(i * 10 + data, m_segment[i]);
+ output().set_digit_value(i * 10 + data, m_segment[i]);
}
}
diff --git a/src/mame/drivers/atarifb.cpp b/src/mame/drivers/atarifb.cpp
index 8349fdc7f7a..46b9bf81863 100644
--- a/src/mame/drivers/atarifb.cpp
+++ b/src/mame/drivers/atarifb.cpp
@@ -1,4 +1,4 @@
-// license:???
+// license:BSD-3-Clause
// copyright-holders:Mike Balfour, Patrick Lawrence, Brad Oliver
/***************************************************************************
diff --git a/src/mame/drivers/atarig1.cpp b/src/mame/drivers/atarig1.cpp
index ddb2f038808..a3ad029f96b 100644
--- a/src/mame/drivers/atarig1.cpp
+++ b/src/mame/drivers/atarig1.cpp
@@ -118,7 +118,7 @@ void atarig1_state::update_bank(int bank)
{
/* bank 0 comes from the copy we made earlier */
if (bank == 0)
- memcpy(m_bslapstic_base, m_bslapstic_bank0, 0x2000);
+ memcpy(m_bslapstic_base, m_bslapstic_bank0.get(), 0x2000);
else
memcpy(m_bslapstic_base, &m_bslapstic_base[bank * 0x1000], 0x2000);
@@ -172,8 +172,8 @@ void atarig1_state::pitfightb_cheap_slapstic_init()
m_bslapstic_base = m_maincpu->space(AS_PROGRAM).install_read_handler(0x038000, 0x03ffff, read16_delegate(FUNC(atarig1_state::pitfightb_cheap_slapstic_r),this));
/* allocate memory for a copy of bank 0 */
- m_bslapstic_bank0 = auto_alloc_array(machine(), UINT8, 0x2000);
- memcpy(m_bslapstic_bank0, m_bslapstic_base, 0x2000);
+ m_bslapstic_bank0 = std::make_unique<UINT8[]>(0x2000);
+ memcpy(m_bslapstic_bank0.get(), m_bslapstic_base, 0x2000);
/* not primed by default */
m_bslapstic_primed = false;
diff --git a/src/mame/drivers/atarigt.cpp b/src/mame/drivers/atarigt.cpp
index 4fe11fdd654..315d6e747dc 100644
--- a/src/mame/drivers/atarigt.cpp
+++ b/src/mame/drivers/atarigt.cpp
@@ -210,8 +210,8 @@ WRITE32_MEMBER(atarigt_state::latch_w)
if (ACCESSING_BITS_16_23)
{
//cage_reset_w(space, data & 0x00100000);
- coin_counter_w(machine(), 0, data & 0x00080000);
- coin_counter_w(machine(), 1, data & 0x00010000);
+ machine().bookkeeping().coin_counter_w(0, data & 0x00080000);
+ machine().bookkeeping().coin_counter_w(1, data & 0x00010000);
}
}
diff --git a/src/mame/drivers/atarist.cpp b/src/mame/drivers/atarist.cpp
index 053d68c4b61..f06e1a98ed7 100644
--- a/src/mame/drivers/atarist.cpp
+++ b/src/mame/drivers/atarist.cpp
@@ -623,7 +623,7 @@ WRITE8_MEMBER( st_state::ikbd_port3_w )
*/
// caps lock led
- set_led_status(machine(), 1, BIT(data, 0));
+ output().set_led_value(1, BIT(data, 0));
// keyboard row select
m_ikbd_keylatch = (m_ikbd_keylatch & 0xff00) | data;
diff --git a/src/mame/drivers/atarisy1.cpp b/src/mame/drivers/atarisy1.cpp
index 0d674b89268..bc643691371 100644
--- a/src/mame/drivers/atarisy1.cpp
+++ b/src/mame/drivers/atarisy1.cpp
@@ -415,7 +415,7 @@ READ8_MEMBER(atarisy1_state::via_pb_r)
WRITE8_MEMBER(atarisy1_state::led_w)
{
- set_led_status(machine(), offset, ~data & 1);
+ output().set_led_value(offset, ~data & 1);
}
diff --git a/src/mame/drivers/atarisy2.cpp b/src/mame/drivers/atarisy2.cpp
index 1486979e4f9..539e86f5a05 100644
--- a/src/mame/drivers/atarisy2.cpp
+++ b/src/mame/drivers/atarisy2.cpp
@@ -338,8 +338,8 @@ READ8_MEMBER(atarisy2_state::switch_6502_r)
WRITE8_MEMBER(atarisy2_state::switch_6502_w)
{
- set_led_status(machine(), 0, data & 0x04);
- set_led_status(machine(), 1, data & 0x08);
+ output().set_led_value(0, data & 0x04);
+ output().set_led_value(1, data & 0x08);
if (m_has_tms5220)
{
data = 12 | ((data >> 5) & 1);
@@ -736,8 +736,8 @@ WRITE8_MEMBER(atarisy2_state::tms5220_strobe_w)
WRITE8_MEMBER(atarisy2_state::coincount_w)
{
- coin_counter_w(machine(), 0, (data >> 0) & 1);
- coin_counter_w(machine(), 1, (data >> 1) & 1);
+ machine().bookkeeping().coin_counter_w(0, (data >> 0) & 1);
+ machine().bookkeeping().coin_counter_w(1, (data >> 1) & 1);
}
diff --git a/src/mame/drivers/atarisy4.cpp b/src/mame/drivers/atarisy4.cpp
index d03be4447b5..78af3c1417c 100644
--- a/src/mame/drivers/atarisy4.cpp
+++ b/src/mame/drivers/atarisy4.cpp
@@ -69,14 +69,14 @@ public:
required_memory_bank m_dsp0_bank1;
optional_memory_bank m_dsp1_bank1;
- atarisy4_renderer *m_renderer;
+ std::unique_ptr<atarisy4_renderer> m_renderer;
UINT8 m_r_color_table[256];
UINT8 m_g_color_table[256];
UINT8 m_b_color_table[256];
UINT16 m_dsp_bank[2];
UINT8 m_csr[2];
- UINT16 *m_shared_ram[2];
+ std::unique_ptr<UINT16[]> m_shared_ram[2];
DECLARE_WRITE16_MEMBER(gpu_w);
DECLARE_READ16_MEMBER(gpu_r);
@@ -179,9 +179,9 @@ atarisy4_renderer::atarisy4_renderer(atarisy4_state &state, screen_device &scree
{
}
- void atarisy4_state::video_start()
+void atarisy4_state::video_start()
{
- m_renderer = auto_alloc(machine(), atarisy4_renderer(*this, *m_screen));
+ m_renderer = std::make_unique<atarisy4_renderer>(*this, *m_screen);
}
void atarisy4_state::video_reset()
@@ -997,14 +997,14 @@ DRIVER_INIT_MEMBER(atarisy4_state,laststar)
address_space &main = m_maincpu->space(AS_PROGRAM);
/* Allocate 16kB of shared RAM */
- m_shared_ram[0] = auto_alloc_array_clear(machine(), UINT16, 0x2000);
+ m_shared_ram[0] = make_unique_clear<UINT16[]>(0x2000);
/* Populate the 68000 address space with data from the HEX files */
load_hexfile(main, memregion("code")->base());
load_hexfile(main, memregion("data")->base());
/* Set up the DSP */
- membank("dsp0_bank0")->set_base(m_shared_ram[0]);
+ membank("dsp0_bank0")->set_base(m_shared_ram[0].get());
m_dsp0_bank1->set_base(&m_shared_ram[0][0x800]);
load_ldafile(m_dsp0->space(AS_PROGRAM), memregion("dsp")->base());
}
@@ -1012,19 +1012,19 @@ DRIVER_INIT_MEMBER(atarisy4_state,laststar)
DRIVER_INIT_MEMBER(atarisy4_state,airrace)
{
/* Allocate two sets of 32kB shared RAM */
- m_shared_ram[0] = auto_alloc_array_clear(machine(), UINT16, 0x4000);
- m_shared_ram[1] = auto_alloc_array_clear(machine(), UINT16, 0x4000);
+ m_shared_ram[0] = make_unique_clear<UINT16[]>(0x4000);
+ m_shared_ram[1] = make_unique_clear<UINT16[]>(0x4000);
/* Populate RAM with data from the HEX files */
load_hexfile(m_maincpu->space(AS_PROGRAM), memregion("code")->base());
/* Set up the first DSP */
- membank("dsp0_bank0")->set_base(m_shared_ram[0]);
+ membank("dsp0_bank0")->set_base(m_shared_ram[0].get());
m_dsp0_bank1->set_base(&m_shared_ram[0][0x800]);
load_ldafile(m_dsp0->space(AS_PROGRAM), memregion("dsp")->base());
/* Set up the second DSP */
- membank("dsp1_bank0")->set_base(m_shared_ram[1]);
+ membank("dsp1_bank0")->set_base(m_shared_ram[1].get());
m_dsp1_bank1->set_base(&m_shared_ram[1][0x800]);
load_ldafile(m_dsp1->space(AS_PROGRAM), memregion("dsp")->base());
}
diff --git a/src/mame/drivers/ataxx.cpp b/src/mame/drivers/ataxx.cpp
index 17c85b40d0d..6cf04fe60aa 100644
--- a/src/mame/drivers/ataxx.cpp
+++ b/src/mame/drivers/ataxx.cpp
@@ -1,5 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders:Aaron Giles
+// copyright-holders:Aaron Giles,Paul Leaman
/***************************************************************************
Leland Ataxx-era driver
diff --git a/src/mame/drivers/atetris.cpp b/src/mame/drivers/atetris.cpp
index 76a157c57a7..61892668c33 100644
--- a/src/mame/drivers/atetris.cpp
+++ b/src/mame/drivers/atetris.cpp
@@ -157,8 +157,8 @@ READ8_MEMBER(atetris_state::slapstic_r)
WRITE8_MEMBER(atetris_state::coincount_w)
{
- coin_counter_w(machine(), 0, (data >> 5) & 1);
- coin_counter_w(machine(), 1, (data >> 4) & 1);
+ machine().bookkeeping().coin_counter_w(0, (data >> 5) & 1);
+ machine().bookkeeping().coin_counter_w(1, (data >> 4) & 1);
}
diff --git a/src/mame/drivers/atom.cpp b/src/mame/drivers/atom.cpp
index db5aa2fcddf..6952735fb9e 100644
--- a/src/mame/drivers/atom.cpp
+++ b/src/mame/drivers/atom.cpp
@@ -286,6 +286,22 @@ static ADDRESS_MAP_START( atombb_mem, AS_PROGRAM, 8, atom_state )
AM_RANGE(0xf000, 0xffff) AM_ROM AM_REGION(SY6502_TAG, 0)
ADDRESS_MAP_END
+/*-------------------------------------------------
+ ADDRESS_MAP( prophet2_mem )
+-------------------------------------------------*/
+
+//static ADDRESS_MAP_START( prophet2_mem, AS_PROGRAM, 8, atom_state )
+// AM_RANGE(0x0000, 0x09ff) AM_RAM
+// AM_RANGE(0x0a00, 0x7fff) AM_RAM
+// AM_RANGE(0x8000, 0x97ff) AM_RAM AM_SHARE("video_ram")
+// AM_RANGE(0x9800, 0x9fff) AM_RAM
+// AM_RANGE(0xb000, 0xb003) AM_MIRROR(0x3fc) AM_DEVREADWRITE(INS8255_TAG, i8255_device, read, write)
+//// AM_RANGE(0xb400, 0xb403) AM_DEVREADWRITE(MC6854_TAG, mc6854_device, read, write)
+//// AM_RANGE(0xb404, 0xb404) AM_READ_PORT("ECONET")
+// AM_RANGE(0xb800, 0xb80f) AM_MIRROR(0x3f0) AM_DEVREADWRITE(R6522_TAG, via6522_device, read, write)
+// AM_RANGE(0xc000, 0xffff) AM_ROM AM_REGION(SY6502_TAG, 0)
+//ADDRESS_MAP_END
+
/***************************************************************************
INPUT PORTS
***************************************************************************/
@@ -675,7 +691,7 @@ SLOT_INTERFACE_END
FLOPPY_FORMATS_MEMBER(atom_state::floppy_formats)
FLOPPY_ATOM_FORMAT
-FLOPPY_FORMATS_END
+FLOPPY_FORMATS_END0
/*-------------------------------------------------
MACHINE_DRIVER( atom )
@@ -715,7 +731,9 @@ static MACHINE_CONFIG_START( atom, atom_state )
MCFG_I8271_IRQ_CALLBACK(WRITELINE(atom_state, atom_8271_interrupt_callback))
MCFG_I8271_HDL_CALLBACK(WRITELINE(atom_state, motor_w))
MCFG_FLOPPY_DRIVE_ADD(I8271_TAG ":0", atom_floppies, "525sssd", atom_state::floppy_formats)
+ MCFG_FLOPPY_DRIVE_SOUND(true)
MCFG_FLOPPY_DRIVE_ADD(I8271_TAG ":1", atom_floppies, "525sssd", atom_state::floppy_formats)
+ MCFG_FLOPPY_DRIVE_SOUND(true)
MCFG_CENTRONICS_ADD(CENTRONICS_TAG, centronics_devices, "printer")
MCFG_CENTRONICS_ACK_HANDLER(DEVWRITELINE(R6522_TAG, via6522_device, write_ca1))
@@ -726,6 +744,7 @@ static MACHINE_CONFIG_START( atom, atom_state )
MCFG_CASSETTE_ADD("cassette")
MCFG_CASSETTE_FORMATS(atom_cassette_formats)
MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED)
+ MCFG_CASSETTE_INTERFACE("atom_cass")
MCFG_QUICKLOAD_ADD("quickload", atom_state, atom_atm, "atm", 0)
@@ -736,11 +755,14 @@ static MACHINE_CONFIG_START( atom, atom_state )
/* internal ram */
MCFG_RAM_ADD(RAM_TAG)
- MCFG_RAM_DEFAULT_SIZE("2K")
- MCFG_RAM_EXTRA_OPTIONS("4K,6K,8K,10K,12K,32K")
+ MCFG_RAM_DEFAULT_SIZE("32K")
+ MCFG_RAM_EXTRA_OPTIONS("2K,4K,6K,8K,10K,12K")
+ MCFG_RAM_DEFAULT_VALUE(0x00)
/* Software lists */
- MCFG_SOFTWARE_LIST_ADD("cart_list","atom")
+ MCFG_SOFTWARE_LIST_ADD("rom_list","atom_rom")
+ MCFG_SOFTWARE_LIST_ADD("cass_list","atom_cass")
+ MCFG_SOFTWARE_LIST_ADD("flop_list","atom_flop")
MACHINE_CONFIG_END
/*-------------------------------------------------
@@ -823,6 +845,7 @@ static MACHINE_CONFIG_START( atombb, atom_state )
MCFG_CASSETTE_ADD("cassette")
MCFG_CASSETTE_FORMATS(atom_cassette_formats)
MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED)
+ MCFG_CASSETTE_INTERFACE("atom_cass")
/* internal ram */
MCFG_RAM_ADD(RAM_TAG)
@@ -831,6 +854,42 @@ static MACHINE_CONFIG_START( atombb, atom_state )
MACHINE_CONFIG_END
+/*-------------------------------------------------
+ MACHINE_DRIVER( prophet2 )
+-------------------------------------------------*/
+
+//static MACHINE_CONFIG_DERIVED( prophet2, atom )
+// /* basic machine hardware */
+// MCFG_CPU_MODIFY(SY6502_TAG)
+// MCFG_CPU_PROGRAM_MAP(prophet2_mem)
+//
+// /* fdc */
+// MCFG_DEVICE_REMOVE(I8271_TAG)
+// MCFG_DEVICE_REMOVE(I8271_TAG ":0")
+// MCFG_DEVICE_REMOVE(I8271_TAG ":1")
+//
+// /* Software lists */
+// MCFG_SOFTWARE_LIST_REMOVE("flop_list")
+//MACHINE_CONFIG_END
+
+/*-------------------------------------------------
+ MACHINE_DRIVER( prophet3 )
+-------------------------------------------------*/
+
+//static MACHINE_CONFIG_DERIVED( prophet3, atom )
+//
+//MACHINE_CONFIG_END
+
+/*-------------------------------------------------
+ MACHINE_DRIVER( atommc )
+-------------------------------------------------*/
+
+//static MACHINE_CONFIG_DERIVED( atommc, atom )
+// /* Software lists */
+// MCFG_SOFTWARE_LIST_ADD("mmc_list","atom_mmc")
+// MCFG_SOFTWARE_LIST_REMOVE("flop_list")
+//MACHINE_CONFIG_END
+
/***************************************************************************
ROMS
***************************************************************************/
@@ -870,6 +929,21 @@ ROM_START( atombb )
ROM_LOAD( "bbcbasic.rom", 0x0000, 0x4000, CRC(79434781) SHA1(4a7393f3a45ea309f744441c16723e2ef447a281) )
ROM_END
+//#define rom_prophet2 rom_atom
+
+//#define rom_prophet3 rom_atom
+
+/*-------------------------------------------------
+ ROM( atommc )
+-------------------------------------------------*/
+
+//ROM_START( atommc )
+// ROM_REGION( 0x4000, SY6502_TAG, 0 )
+// ROM_LOAD( "abasic.ic20", 0x0000, 0x1000, CRC(289b7791) SHA1(0072c83458a9690a3ea1f6094f0f38cf8e96a445) )
+// ROM_CONTINUE( 0x3000, 0x1000 )
+// ROM_LOAD( "afloat.ic21", 0x1000, 0x1000, CRC(81d86af7) SHA1(ebcde5b36cb3a3344567cbba4c7b9fde015f4802) )
+// ROM_LOAD( "atommc2-2.9-a000.rom", 0x2000, 0x1000, CRC(ba73e36c) SHA1(ea9739e96f3283c90b5306288c796fc01144b771) )
+//ROM_END
DRIVER_INIT_MEMBER(atomeb_state, atomeb)
{
@@ -887,8 +961,10 @@ DRIVER_INIT_MEMBER(atomeb_state, atomeb)
SYSTEM DRIVERS
***************************************************************************/
-/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME */
-COMP( 1979, atom, 0, 0, atom, atom, driver_device, 0, "Acorn", "Atom" , 0)
-COMP( 1979, atomeb, atom, 0, atomeb, atom, atomeb_state, atomeb, "Acorn", "Atom with Eprom Box" , 0)
-COMP( 1979, atombb, atom, 0, atombb, atom, driver_device, 0, "Acorn", "Atom with BBC Basic" , 0)
-//COMP( 1983, prophet2, atom, 0, atom, atom, driver_device, 0, "Busicomputers", "Prophet 2" , 0)
+/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
+COMP( 1979, atom, 0, 0, atom, atom, driver_device, 0, "Acorn", "Atom" , 0)
+COMP( 1979, atomeb, atom, 0, atomeb, atom, atomeb_state, atomeb, "Acorn", "Atom with Eprom Box" , 0)
+COMP( 1982, atombb, atom, 0, atombb, atom, driver_device, 0, "Acorn", "Atom with BBC Basic" , 0)
+//COMP( 1983, prophet2, atom, 0, prophet2, atom, driver_device, 0, "Busicomputers", "Prophet 2" , 0)
+//COMP( 1983, prophet3, atom, 0, prophet3, atom, driver_device, 0, "Busicomputers", "Prophet 3" , 0)
+//COMP( 2011, atommc, atom, 0, atommc, atom, driver_device, 0, "Acorn", "Atom with AtoMMC2" , 0)
diff --git a/src/mame/drivers/avalnche.cpp b/src/mame/drivers/avalnche.cpp
index 6fa16e5616e..b52c51aa261 100644
--- a/src/mame/drivers/avalnche.cpp
+++ b/src/mame/drivers/avalnche.cpp
@@ -91,23 +91,23 @@ WRITE8_MEMBER(avalnche_state::avalance_video_invert_w)
WRITE8_MEMBER(avalnche_state::catch_coin_counter_w)
{
- coin_counter_w(machine(), 0, data & 1);
- coin_counter_w(machine(), 1, data & 2);
+ machine().bookkeeping().coin_counter_w(0, data & 1);
+ machine().bookkeeping().coin_counter_w(1, data & 2);
}
WRITE8_MEMBER(avalnche_state::avalance_credit_1_lamp_w)
{
- set_led_status(machine(), 0, data & 1);
+ output().set_led_value(0, data & 1);
}
WRITE8_MEMBER(avalnche_state::avalance_credit_2_lamp_w)
{
- set_led_status(machine(), 1, data & 1);
+ output().set_led_value(1, data & 1);
}
WRITE8_MEMBER(avalnche_state::avalance_start_lamp_w)
{
- set_led_status(machine(), 2, data & 1);
+ output().set_led_value(2, data & 1);
}
static ADDRESS_MAP_START( main_map, AS_PROGRAM, 8, avalnche_state )
diff --git a/src/mame/drivers/avt.cpp b/src/mame/drivers/avt.cpp
index 20ddc6ec0d1..5a752526f81 100644
--- a/src/mame/drivers/avt.cpp
+++ b/src/mame/drivers/avt.cpp
@@ -446,7 +446,6 @@ public:
tilemap_t *m_bg_tilemap;
UINT8 m_crtc_vreg[0x100],m_crtc_index;
- DECLARE_WRITE8_MEMBER(debug_w);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
virtual void video_start() override;
DECLARE_PALETTE_INIT(avt);
diff --git a/src/mame/drivers/babbage.cpp b/src/mame/drivers/babbage.cpp
index 8812456ac39..f3d9c187fc8 100644
--- a/src/mame/drivers/babbage.cpp
+++ b/src/mame/drivers/babbage.cpp
@@ -161,7 +161,7 @@ WRITE8_MEMBER( babbage_state::pio1_b_w )
for (int i = 0; i < 8; i++)
{
sprintf(ledname,"led%d",i);
- output_set_value(ledname, BIT(data, i));
+ output().set_value(ledname, BIT(data, i));
}
}
@@ -182,7 +182,7 @@ WRITE8_MEMBER( babbage_state::pio2_b_w )
m_step = true;
}
else
- output_set_digit_value(data, m_segment);
+ output().set_digit_value(data, m_segment);
}
static const z80_daisy_config babbage_daisy_chain[] =
diff --git a/src/mame/drivers/backfire.cpp b/src/mame/drivers/backfire.cpp
index 98341a9867c..9ca90c212e8 100644
--- a/src/mame/drivers/backfire.cpp
+++ b/src/mame/drivers/backfire.cpp
@@ -47,8 +47,8 @@ public:
{ }
/* memory pointers */
- UINT16 * m_spriteram_1;
- UINT16 * m_spriteram_2;
+ std::unique_ptr<UINT16[]> m_spriteram_1;
+ std::unique_ptr<UINT16[]> m_spriteram_2;
required_shared_ptr<UINT32> m_mainram;
required_shared_ptr<UINT32> m_left_priority;
required_shared_ptr<UINT32> m_right_priority;
@@ -56,8 +56,8 @@ public:
optional_device<decospr_device> m_sprgen2;
/* video related */
- bitmap_ind16 *m_left;
- bitmap_ind16 *m_right;
+ std::unique_ptr<bitmap_ind16> m_left;
+ std::unique_ptr<bitmap_ind16> m_right;
/* devices */
required_device<cpu_device> m_maincpu;
@@ -72,7 +72,6 @@ public:
UINT16 m_pf3_rowscroll[0x0800/2];
UINT16 m_pf4_rowscroll[0x0800/2];
DECLARE_READ32_MEMBER(backfire_control2_r);
- DECLARE_READ32_MEMBER(backfire_control3_r);
DECLARE_WRITE32_MEMBER(backfire_nonbuffered_palette_w);
DECLARE_READ32_MEMBER(backfire_pf1_rowscroll_r);
DECLARE_READ32_MEMBER(backfire_pf2_rowscroll_r);
@@ -87,9 +86,6 @@ public:
DECLARE_READ32_MEMBER(backfire_spriteram2_r);
DECLARE_WRITE32_MEMBER(backfire_spriteram2_w);
DECLARE_READ32_MEMBER(backfire_speedup_r);
- DECLARE_READ32_MEMBER(backfire_unknown_wheel_r);
- DECLARE_READ32_MEMBER(backfire_wheel1_r);
- DECLARE_READ32_MEMBER(backfire_wheel2_r);
DECLARE_READ32_MEMBER(backfire_eeprom_r);
DECLARE_WRITE32_MEMBER(backfire_eeprom_w);
DECLARE_DRIVER_INIT(backfire);
@@ -115,8 +111,8 @@ public:
/* I'm using the functions in deco16ic.c ... same chips, why duplicate code? */
void backfire_state::video_start()
{
- m_spriteram_1 = auto_alloc_array(machine(), UINT16, 0x2000/2);
- m_spriteram_2 = auto_alloc_array(machine(), UINT16, 0x2000/2);
+ m_spriteram_1 = std::make_unique<UINT16[]>(0x2000/2);
+ m_spriteram_2 = std::make_unique<UINT16[]>(0x2000/2);
/* and register the allocated ram so that save states still work */
save_item(NAME(m_pf1_rowscroll));
@@ -124,11 +120,11 @@ void backfire_state::video_start()
save_item(NAME(m_pf3_rowscroll));
save_item(NAME(m_pf4_rowscroll));
- m_left = auto_bitmap_ind16_alloc(machine(), 80*8, 32*8);
- m_right = auto_bitmap_ind16_alloc(machine(), 80*8, 32*8);
+ m_left = std::make_unique<bitmap_ind16>(80*8, 32*8);
+ m_right = std::make_unique<bitmap_ind16>(80*8, 32*8);
- save_pointer(NAME(m_spriteram_1), 0x2000/2);
- save_pointer(NAME(m_spriteram_2), 0x2000/2);
+ save_pointer(NAME(m_spriteram_1.get()), 0x2000/2);
+ save_pointer(NAME(m_spriteram_2.get()), 0x2000/2);
save_item(NAME(*m_left));
save_item(NAME(*m_right));
@@ -153,13 +149,13 @@ UINT32 backfire_state::screen_update_backfire_left(screen_device &screen, bitmap
{
m_deco_tilegen2->tilemap_1_draw(screen, bitmap, cliprect, 0, 1);
m_deco_tilegen1->tilemap_1_draw(screen, bitmap, cliprect, 0, 2);
- m_sprgen->draw_sprites(bitmap, cliprect, m_spriteram_1, 0x800);
+ m_sprgen->draw_sprites(bitmap, cliprect, m_spriteram_1.get(), 0x800);
}
else if (m_left_priority[0] == 2)
{
m_deco_tilegen1->tilemap_1_draw(screen, bitmap, cliprect, 0, 2);
m_deco_tilegen2->tilemap_1_draw(screen, bitmap, cliprect, 0, 4);
- m_sprgen->draw_sprites(bitmap, cliprect, m_spriteram_1, 0x800);
+ m_sprgen->draw_sprites(bitmap, cliprect, m_spriteram_1.get(), 0x800);
}
else
popmessage( "unknown left priority %08x", m_left_priority[0]);
@@ -184,13 +180,13 @@ UINT32 backfire_state::screen_update_backfire_right(screen_device &screen, bitma
{
m_deco_tilegen2->tilemap_2_draw(screen, bitmap, cliprect, 0, 1);
m_deco_tilegen1->tilemap_2_draw(screen, bitmap, cliprect, 0, 2);
- m_sprgen2->draw_sprites(bitmap, cliprect, m_spriteram_2, 0x800);
+ m_sprgen2->draw_sprites(bitmap, cliprect, m_spriteram_2.get(), 0x800);
}
else if (m_right_priority[0] == 2)
{
m_deco_tilegen1->tilemap_2_draw(screen, bitmap, cliprect, 0, 2);
m_deco_tilegen2->tilemap_2_draw(screen, bitmap, cliprect, 0, 4);
- m_sprgen2->draw_sprites(bitmap, cliprect, m_spriteram_2, 0x800);
+ m_sprgen2->draw_sprites(bitmap, cliprect, m_spriteram_2.get(), 0x800);
}
else
popmessage( "unknown right priority %08x", m_right_priority[0]);
diff --git a/src/mame/drivers/bagman.cpp b/src/mame/drivers/bagman.cpp
index 0d2f28aab57..8090f0cbc42 100644
--- a/src/mame/drivers/bagman.cpp
+++ b/src/mame/drivers/bagman.cpp
@@ -120,7 +120,7 @@ WRITE8_MEMBER(bagman_state::ls259_w)
WRITE8_MEMBER(bagman_state::coincounter_w)
{
- coin_counter_w(machine(), offset,data);
+ machine().bookkeeping().coin_counter_w(offset,data);
}
WRITE8_MEMBER(bagman_state::irq_mask_w)
@@ -622,11 +622,11 @@ ROM_START( bagman )
ROM_LOAD( "c1_b01.bin", 0x0000, 0x1000, CRC(705193b2) SHA1(ca9cfd05f9195c2a38e8854012de51b6ee6bb403) )
ROM_LOAD( "f1_b03s.bin", 0x1000, 0x1000, CRC(dba1eda7) SHA1(26d877028b3a31dd671f9e667316c8a14780ca73) )
- ROM_REGION( 0x0060, "proms", 0 )
+ ROM_REGION( 0x0040, "proms", 0 )
ROM_LOAD( "p3.bin", 0x0000, 0x0020, CRC(2a855523) SHA1(91e032233fee397c90b7c1662934aca9e0671482) )
ROM_LOAD( "r3.bin", 0x0020, 0x0020, CRC(ae6f1019) SHA1(fd711882b670380cb4bd909c840ba06277b8fbe3) )
- ROM_REGION( 0x0060, "5110ctrl", 0)
+ ROM_REGION( 0x0020, "5110ctrl", 0)
ROM_LOAD( "r6.bin", 0x0000, 0x0020, CRC(c58a4f6a) SHA1(35ef244b3e94032df2610aa594ea5670b91e1449) ) /*state machine driving TMS5110*/
ROM_REGION( 0x2000, "tmsprom", 0 ) /* data for the TMS5110 speech chip */
@@ -651,11 +651,11 @@ ROM_START( bagnard )
ROM_LOAD( "bagnard.001", 0x0000, 0x1000, CRC(060b044c) SHA1(3121f07adb661663a2303085eea1b662968f8f98) )
ROM_LOAD( "bagnard.003", 0x1000, 0x1000, CRC(8043bc1a) SHA1(bd2f3dfe26cf8d987d9ecaa41eac4bdc4e16a692) )
- ROM_REGION( 0x0060, "proms", 0 )
+ ROM_REGION( 0x0040, "proms", 0 )
ROM_LOAD( "p3.bin", 0x0000, 0x0020, CRC(2a855523) SHA1(91e032233fee397c90b7c1662934aca9e0671482) )
ROM_LOAD( "r3.bin", 0x0020, 0x0020, CRC(ae6f1019) SHA1(fd711882b670380cb4bd909c840ba06277b8fbe3) )
- ROM_REGION( 0x0060, "5110ctrl", 0)
+ ROM_REGION( 0x0020, "5110ctrl", 0)
ROM_LOAD( "r6.bin", 0x0000, 0x0020, CRC(c58a4f6a) SHA1(35ef244b3e94032df2610aa594ea5670b91e1449) ) /*state machine driving TMS5110*/
ROM_REGION( 0x2000, "tmsprom", 0 ) /* data for the TMS5110 speech chip */
@@ -680,11 +680,11 @@ ROM_START( bagnarda )
ROM_LOAD( "bagman.001", 0x0000, 0x1000, CRC(1eb56acd) SHA1(f75f6709006e78417999d423d2078ed80eae73a2) )
ROM_LOAD( "bagman.003", 0x1000, 0x1000, CRC(0ad82a39) SHA1(30ac0ff5bc63934c3eb572c7c13df324757e5e44) )
- ROM_REGION( 0x0060, "proms", 0 )
+ ROM_REGION( 0x0040, "proms", 0 )
ROM_LOAD( "p3.bin", 0x0000, 0x0020, CRC(2a855523) SHA1(91e032233fee397c90b7c1662934aca9e0671482) )
ROM_LOAD( "r3.bin", 0x0020, 0x0020, CRC(ae6f1019) SHA1(fd711882b670380cb4bd909c840ba06277b8fbe3) )
- ROM_REGION( 0x0060, "5110ctrl", 0)
+ ROM_REGION( 0x0020, "5110ctrl", 0)
ROM_LOAD( "r6.bin", 0x0000, 0x0020, CRC(c58a4f6a) SHA1(35ef244b3e94032df2610aa594ea5670b91e1449) ) /*state machine driving TMS5110*/
ROM_REGION( 0x2000, "tmsprom", 0 ) /* data for the TMS5110 speech chip */
@@ -709,11 +709,11 @@ ROM_START( bagnardi ) // based on bagnard set with mods for license text
ROM_LOAD( "bagnardi_01.c1", 0x0000, 0x1000, CRC(060b044c) SHA1(3121f07adb661663a2303085eea1b662968f8f98) ) // == bagnard.001
ROM_LOAD( "bagnardi_03.f1", 0x1000, 0x1000, CRC(8043bc1a) SHA1(bd2f3dfe26cf8d987d9ecaa41eac4bdc4e16a692) ) // == bagnard.003
- ROM_REGION( 0x0060, "proms", 0 )
+ ROM_REGION( 0x0040, "proms", 0 )
ROM_LOAD( "p3.bin", 0x0000, 0x0020, CRC(2a855523) SHA1(91e032233fee397c90b7c1662934aca9e0671482) )
ROM_LOAD( "r3.bin", 0x0020, 0x0020, CRC(ae6f1019) SHA1(fd711882b670380cb4bd909c840ba06277b8fbe3) )
- ROM_REGION( 0x0060, "5110ctrl", 0)
+ ROM_REGION( 0x0020, "5110ctrl", 0)
ROM_LOAD( "r6.bin", 0x0000, 0x0020, CRC(c58a4f6a) SHA1(35ef244b3e94032df2610aa594ea5670b91e1449) ) /*state machine driving TMS5110*/
ROM_REGION( 0x2000, "tmsprom", 0 ) /* data for the TMS5110 speech chip */
@@ -739,11 +739,11 @@ ROM_START( bagmans )
ROM_LOAD( "a2_1c.bin", 0x0000, 0x1000, CRC(f3e11bd7) SHA1(43ee00ff777008c89f619eb183e7c5e63f6c7694) )
ROM_LOAD( "a2_1f.bin", 0x1000, 0x1000, CRC(d0f7105b) SHA1(fb382703850a4ded567706e02ebb7f3e22531b7c) )
- ROM_REGION( 0x0060, "proms", 0 )
+ ROM_REGION( 0x0040, "proms", 0 )
ROM_LOAD( "p3.bin", 0x0000, 0x0020, CRC(2a855523) SHA1(91e032233fee397c90b7c1662934aca9e0671482) )
ROM_LOAD( "r3.bin", 0x0020, 0x0020, CRC(ae6f1019) SHA1(fd711882b670380cb4bd909c840ba06277b8fbe3) )
- ROM_REGION( 0x0060, "5110ctrl", 0)
+ ROM_REGION( 0x0020, "5110ctrl", 0)
ROM_LOAD( "r6.bin", 0x0000, 0x0020, CRC(c58a4f6a) SHA1(35ef244b3e94032df2610aa594ea5670b91e1449) ) /*state machine driving TMS5110*/
ROM_REGION( 0x2000, "tmsprom", 0 ) /* data for the TMS5110 speech chip */
@@ -768,11 +768,11 @@ ROM_START( bagmans2 )
ROM_LOAD( "a2_1c.bin", 0x0000, 0x1000, CRC(f3e11bd7) SHA1(43ee00ff777008c89f619eb183e7c5e63f6c7694) )
ROM_LOAD( "a2_1f.bin", 0x1000, 0x1000, CRC(d0f7105b) SHA1(fb382703850a4ded567706e02ebb7f3e22531b7c) )
- ROM_REGION( 0x0060, "proms", 0 )
+ ROM_REGION( 0x0040, "proms", 0 )
ROM_LOAD( "p3.bin", 0x0000, 0x0020, CRC(2a855523) SHA1(91e032233fee397c90b7c1662934aca9e0671482) )
ROM_LOAD( "r3.bin", 0x0020, 0x0020, CRC(ae6f1019) SHA1(fd711882b670380cb4bd909c840ba06277b8fbe3) )
- ROM_REGION( 0x0060, "5110ctrl", 0)
+ ROM_REGION( 0x0020, "5110ctrl", 0)
ROM_LOAD( "r6.bin", 0x0000, 0x0020, CRC(c58a4f6a) SHA1(35ef244b3e94032df2610aa594ea5670b91e1449) ) /*state machine driving TMS5110*/
ROM_REGION( 0x2000, "tmsprom", 0 ) /* data for the TMS5110 speech chip */
@@ -809,11 +809,11 @@ ROM_START( sbagman )
ROM_LOAD( "1.1c", 0x0000, 0x1000, CRC(a046ff44) SHA1(af319cfb74e5efe435c26e971de13bd390f4b378) )
ROM_LOAD( "3.1f", 0x1000, 0x1000, CRC(a4422da4) SHA1(3aa55ca8c99566c1c9eb097b6d645c4216e09dfb) )
- ROM_REGION( 0x0060, "proms", 0 )
+ ROM_REGION( 0x0040, "proms", 0 )
ROM_LOAD( "p3.bin", 0x0000, 0x0020, CRC(2a855523) SHA1(91e032233fee397c90b7c1662934aca9e0671482) )
ROM_LOAD( "r3.bin", 0x0020, 0x0020, CRC(ae6f1019) SHA1(fd711882b670380cb4bd909c840ba06277b8fbe3) )
- ROM_REGION( 0x0060, "5110ctrl", 0)
+ ROM_REGION( 0x0020, "5110ctrl", 0)
ROM_LOAD( "r6.bin", 0x0000, 0x0020, CRC(c58a4f6a) SHA1(35ef244b3e94032df2610aa594ea5670b91e1449) ) /*state machine driving TMS5110*/
ROM_REGION( 0x2000, "tmsprom", 0 ) /* data for the TMS5110 speech chip */
@@ -848,11 +848,11 @@ ROM_START( sbagmans )
ROM_LOAD( "sbag_1c.bin", 0x0000, 0x1000, CRC(262f870a) SHA1(90877b869a7e927cfa4f9729ec3d6eac3a95dc8f) )
ROM_LOAD( "sbag_1f.bin", 0x1000, 0x1000, CRC(350ed0fb) SHA1(c7804e9618ebc88a1e3684a92a98d9a181441a1f) )
- ROM_REGION( 0x0060, "proms", 0 )
+ ROM_REGION( 0x0040, "proms", 0 )
ROM_LOAD( "p3.bin", 0x0000, 0x0020, CRC(2a855523) SHA1(91e032233fee397c90b7c1662934aca9e0671482) )
ROM_LOAD( "r3.bin", 0x0020, 0x0020, CRC(ae6f1019) SHA1(fd711882b670380cb4bd909c840ba06277b8fbe3) )
- ROM_REGION( 0x0060, "5110ctrl", 0)
+ ROM_REGION( 0x0020, "5110ctrl", 0)
ROM_LOAD( "r6.bin", 0x0000, 0x0020, CRC(c58a4f6a) SHA1(35ef244b3e94032df2610aa594ea5670b91e1449) ) /*state machine driving TMS5110*/
ROM_REGION( 0x2000, "tmsprom", 0 ) /* data for the TMS5110 speech chip */
diff --git a/src/mame/drivers/baraduke.cpp b/src/mame/drivers/baraduke.cpp
index ff5f32bf094..16522d28f32 100644
--- a/src/mame/drivers/baraduke.cpp
+++ b/src/mame/drivers/baraduke.cpp
@@ -119,9 +119,9 @@ WRITE8_MEMBER(baraduke_state::inputport_select_w)
m_inputport_selected = data & 0x07;
else if ((data & 0xe0) == 0xc0)
{
- coin_lockout_global_w(machine(), ~data & 1);
- coin_counter_w(machine(), 0,data & 2);
- coin_counter_w(machine(), 1,data & 4);
+ machine().bookkeeping().coin_lockout_global_w(~data & 1);
+ machine().bookkeeping().coin_counter_w(0,data & 2);
+ machine().bookkeeping().coin_counter_w(1,data & 4);
}
}
@@ -150,8 +150,8 @@ READ8_MEMBER(baraduke_state::inputport_r)
WRITE8_MEMBER(baraduke_state::baraduke_lamps_w)
{
- set_led_status(machine(), 0,data & 0x08);
- set_led_status(machine(), 1,data & 0x10);
+ output().set_led_value(0,data & 0x08);
+ output().set_led_value(1,data & 0x10);
}
WRITE8_MEMBER(baraduke_state::baraduke_irq_ack_w)
diff --git a/src/mame/drivers/barata.cpp b/src/mame/drivers/barata.cpp
index 0953db8959d..e4e2b974ca5 100644
--- a/src/mame/drivers/barata.cpp
+++ b/src/mame/drivers/barata.cpp
@@ -53,6 +53,8 @@ public:
DECLARE_WRITE8_MEMBER(port0_w);
DECLARE_WRITE8_MEMBER(port2_w);
DECLARE_READ8_MEMBER(port2_r);
+ void fpga_send(unsigned char cmd);
+
required_device<cpu_device> m_maincpu;
required_device<dac_device> m_dac;
private:
@@ -153,26 +155,27 @@ const char* mode_strings[] = {
"Set counter values"
};
-static void fpga_send(device_t *device, unsigned char cmd){
+void barata_state::fpga_send(unsigned char cmd)
+{
static unsigned char byte = 0;
static unsigned char mode = FPGA_WAITING_FOR_NEW_CMD;
static unsigned char lamp_data = 0;
- device->logerror("FPGA CMD: %d\n", cmd);
+ logerror("FPGA CMD: %d\n", cmd);
if (mode == FPGA_WAITING_FOR_NEW_CMD){
if (cmd < FPGA_WAITING_FOR_NEW_CMD){
mode = cmd;
byte=1;
- device->logerror("SET FPGA MODE: %s\n", mode_strings[mode]);
+ logerror("SET FPGA MODE: %s\n", mode_strings[mode]);
if (mode == FPGA_PLAY_BGM){
- device->logerror("PLAY_BGM.\n");
+ logerror("PLAY_BGM.\n");
mode = FPGA_WAITING_FOR_NEW_CMD;
}
if (mode == FPGA_STOP_BGM){
- device->logerror("STOP_BGM.\n");
+ logerror("STOP_BGM.\n");
mode = FPGA_WAITING_FOR_NEW_CMD;
}
}
@@ -195,10 +198,10 @@ static void fpga_send(device_t *device, unsigned char cmd){
if (erase_all){
// logerror("LED: ERASE ALL\n");
for (int i=0; i<16; i++){
- output_set_led_value(i, 1);
+ output().set_led_value(i, 1);
}
} else {
- output_set_led_value(lamp_index, state ? 0 : 1);
+ output().set_led_value(lamp_index, state ? 0 : 1);
}
default:
mode = FPGA_WAITING_FOR_NEW_CMD;
@@ -226,11 +229,11 @@ static void fpga_send(device_t *device, unsigned char cmd){
counter_data = (counter_data << 3) | cmd;
if (counter_state){
- output_set_digit_value(2*counter_bank, 0);
- output_set_digit_value(2*counter_bank+1, 0);
+ output().set_digit_value(2*counter_bank, 0);
+ output().set_digit_value(2*counter_bank+1, 0);
} else {
- output_set_digit_value(2*counter_bank, dec_7seg(counter_data/10));
- output_set_digit_value(2*counter_bank+1, dec_7seg(counter_data%10));
+ output().set_digit_value(2*counter_bank, dec_7seg(counter_data/10));
+ output().set_digit_value(2*counter_bank+1, dec_7seg(counter_data%10));
}
default:
mode = FPGA_WAITING_FOR_NEW_CMD;
@@ -248,7 +251,7 @@ static void fpga_send(device_t *device, unsigned char cmd){
break;
case 2:
sample_index = (sample_index << 3) | cmd;
- device->logerror("PLAY_SAMPLE #%d.\n", sample_index);
+ logerror("PLAY_SAMPLE #%d.\n", sample_index);
default:
mode = FPGA_WAITING_FOR_NEW_CMD;
break;
@@ -263,7 +266,7 @@ WRITE8_MEMBER(barata_state::fpga_w)
static unsigned char old_data = 0;
if (!BIT(old_data, 5) && BIT(data, 5)){
//process the command sent to the FPGA
- fpga_send(this, (data >> 2) & 7);
+ fpga_send((data >> 2) & 7);
}
old_data = data;
}
diff --git a/src/mame/drivers/batman.cpp b/src/mame/drivers/batman.cpp
index 00e1c69c5e6..69b0aae9e7a 100644
--- a/src/mame/drivers/batman.cpp
+++ b/src/mame/drivers/batman.cpp
@@ -76,7 +76,7 @@ WRITE16_MEMBER(batman_state::latch_w)
if ((oldword ^ m_latch_data) & 0x7000)
{
m_screen->update_partial(m_screen->vpos());
- m_vad->alpha()->mark_all_dirty();
+ m_vad->alpha().mark_all_dirty();
m_alpha_tile_bank = (m_latch_data >> 12) & 7;
}
}
diff --git a/src/mame/drivers/battlane.cpp b/src/mame/drivers/battlane.cpp
index bacf394c722..815b8b00976 100644
--- a/src/mame/drivers/battlane.cpp
+++ b/src/mame/drivers/battlane.cpp
@@ -1,4 +1,4 @@
-// license:???
+// license:BSD-3-Clause
// copyright-holders:Paul Leaman
/***************************************************************************
diff --git a/src/mame/drivers/battlera.cpp b/src/mame/drivers/battlera.cpp
index b6c756b811f..fc008ff5351 100644
--- a/src/mame/drivers/battlera.cpp
+++ b/src/mame/drivers/battlera.cpp
@@ -7,12 +7,12 @@
Emulation by Bryan McPhail, mish@tendril.co.uk
- This board is based on the Hudson HuC6280 and Huc6270 IC's used in
+ This board is based on the Hudson HuC6280 and Huc6270 IC's used in
the NEC PC-Engine.
-
+
Differences from PC-Engine console:
Input ports are different (2 dips, 2 joysticks, 1 coin port)
- _Interface_ to palette is different (Huc6260 isn't present),
+ _Interface_ to palette is different (Huc6260 isn't present),
palette data is the same.
Extra sound chips (YM2203 & Oki M5205), and extra HuC6280 processor to drive them.
Twice as much VRAM (128kb).
@@ -20,7 +20,7 @@
Todo:
- There seems to be a bug with a stuck note from the YM2203 FM channel
at the start of scene 3 and near the ending when your characters are
- flying over a forest in a helicopter.
+ flying over a forest in a helicopter.
This is verified to NOT happen on real hardware - Guru
**********************************************************************
@@ -64,7 +64,7 @@ Notes:
DEC-01 - Hudson HuC6280 6502-based CPU with in-built Programmable Sound Generator
used as the main CPU. Clock input is 21.4772MHz and is divided internally
by 3 for the CPU (7.15906MHz) and by 6 for the PSG (3.579533MHz), although
- in this case the PSG isn't used. The Hudson markings have been scratch off
+ in this case the PSG isn't used. The Hudson markings have been scratch off
and the IC is labelled 'DEC-01'
45 - Hudson HuC6280 6502-based CPU with in-built PSG used as the sound CPU
Clock input is 21.4772MHz and is divided internally by 3 for the CPU
diff --git a/src/mame/drivers/battlnts.cpp b/src/mame/drivers/battlnts.cpp
index d3596e2d1b5..e4fa41bac78 100644
--- a/src/mame/drivers/battlnts.cpp
+++ b/src/mame/drivers/battlnts.cpp
@@ -43,8 +43,8 @@ WRITE8_MEMBER(battlnts_state::battlnts_bankswitch_w)
m_rombank->set_entry((data & 0xc0) >> 6);
/* bits 4 & 5 = coin counters */
- coin_counter_w(machine(), 0, data & 0x10);
- coin_counter_w(machine(), 1, data & 0x20);
+ machine().bookkeeping().coin_counter_w(0, data & 0x10);
+ machine().bookkeeping().coin_counter_w(1, data & 0x20);
/* other bits unknown */
}
diff --git a/src/mame/drivers/bbc.cpp b/src/mame/drivers/bbc.cpp
index 3deeebc5a1f..1450a44a654 100644
--- a/src/mame/drivers/bbc.cpp
+++ b/src/mame/drivers/bbc.cpp
@@ -32,7 +32,7 @@
Acorn Business Computer
- ABC110 - 64K, 10MB HDD, Z80, CP/M 2.2
+ ABC110 - 64K, 10MB HDD, Z80, CP/M 2.2
ABC210/ACW443 - 4096K, 20MB HDD, 32016, PanOS
ABC310 - 1024K, 10MB HDD, 80286, DOS 3.1/GEM
@@ -386,13 +386,13 @@ static INPUT_PORTS_START(bbc_keyboard)
PORT_START("COL9")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("LEFT") PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT))
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("DOWN") PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN))
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("UP") PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP))
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(UTF8_LEFT) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT))
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(UTF8_DOWN) PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN))
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(UTF8_UP) PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP))
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("RETURN") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("DELETE") PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("COPY") PORT_CODE(KEYCODE_END) PORT_CHAR(UCHAR_MAMEKEY(END))
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("RIGHT") PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT))
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(UTF8_RIGHT) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT))
PORT_START("BRK")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("BREAK") PORT_CODE(KEYCODE_F12) PORT_CHAR(UCHAR_MAMEKEY(F12)) PORT_CHANGED_MEMBER(DEVICE_SELF, bbc_state, trigger_reset, 0)
@@ -441,6 +441,49 @@ static INPUT_PORTS_START(bbc_keypad)
INPUT_PORTS_END
+static INPUT_PORTS_START(torch_keyboard)
+ PORT_MODIFY("COL9")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("MOVE LEFT") PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT))
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("LOWERCASE") PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN))
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("UPPERCASE") PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP))
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("RETURN") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("DELETE THIS") PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("MOVE PAST") PORT_CODE(KEYCODE_END) PORT_CHAR(UCHAR_MAMEKEY(END))
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("MOVE RIGHT") PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT))
+
+ PORT_MODIFY("COL10")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 6") PORT_CODE(KEYCODE_6_PAD) PORT_CHAR(UCHAR_MAMEKEY(6_PAD))
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 8") PORT_CODE(KEYCODE_8_PAD) PORT_CHAR(UCHAR_MAMEKEY(8_PAD))
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad +") PORT_CODE(KEYCODE_PLUS_PAD) PORT_CHAR(UCHAR_MAMEKEY(PLUS_PAD))
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad /") PORT_CODE(KEYCODE_SLASH_PAD) PORT_CHAR(UCHAR_MAMEKEY(SLASH_PAD))
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad #") PORT_CODE(KEYCODE_NUMLOCK) PORT_CHAR(UCHAR_MAMEKEY(NUMLOCK))
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 0") PORT_CODE(KEYCODE_0_PAD) PORT_CHAR(UCHAR_MAMEKEY(0_PAD))
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 4") PORT_CODE(KEYCODE_4_PAD) PORT_CHAR(UCHAR_MAMEKEY(4_PAD))
+
+ PORT_MODIFY("COL11")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 7") PORT_CODE(KEYCODE_7_PAD) PORT_CHAR(UCHAR_MAMEKEY(7_PAD))
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 9") PORT_CODE(KEYCODE_9_PAD) PORT_CHAR(UCHAR_MAMEKEY(9_PAD))
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad -") PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHAR(UCHAR_MAMEKEY(MINUS_PAD))
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad DELETE") PORT_CODE(KEYCODE_DEL_PAD) PORT_CHAR(UCHAR_MAMEKEY(DEL_PAD))
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad *") PORT_CODE(KEYCODE_ASTERISK) PORT_CHAR(UCHAR_MAMEKEY(ASTERISK))
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 1") PORT_CODE(KEYCODE_1_PAD) PORT_CHAR(UCHAR_MAMEKEY(1_PAD))
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 5") PORT_CODE(KEYCODE_5_PAD) PORT_CHAR(UCHAR_MAMEKEY(5_PAD))
+
+ PORT_MODIFY("COL12")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad RETURN") PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHAR(UCHAR_MAMEKEY(ENTER_PAD))
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad .") PORT_CODE(KEYCODE_STOP) PORT_CHAR(UCHAR_MAMEKEY(STOP))
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad ,") PORT_CODE(KEYCODE_COMMA) PORT_CHAR(UCHAR_MAMEKEY(COMMA))
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 3") PORT_CODE(KEYCODE_3_PAD) PORT_CHAR(UCHAR_MAMEKEY(3_PAD))
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 2") PORT_CODE(KEYCODE_2_PAD) PORT_CHAR(UCHAR_MAMEKEY(2_PAD))
+INPUT_PORTS_END
+
+
static INPUT_PORTS_START(bbc_dipswitch)
PORT_MODIFY("COL2")
PORT_DIPNAME(0x01, 0x01, "Default File System") PORT_DIPLOCATION("KBD:1")
@@ -651,6 +694,13 @@ static INPUT_PORTS_START(bbcbp)
PORT_INCLUDE(bbc_joy)
INPUT_PORTS_END
+static INPUT_PORTS_START(torch)
+ PORT_INCLUDE(bbc_keyboard)
+ PORT_INCLUDE(torch_keyboard)
+ PORT_INCLUDE(bbcb_links)
+ PORT_INCLUDE(bbc_joy)
+INPUT_PORTS_END
+
static INPUT_PORTS_START(abc)
PORT_INCLUDE(bbc_keyboard)
PORT_INCLUDE(bbc_keypad)
@@ -684,6 +734,7 @@ WRITE_LINE_MEMBER(bbc_state::bbcb_acia6850_irq_w)
FLOPPY_FORMATS_MEMBER( bbc_state::floppy_formats_bbc )
FLOPPY_BBC_DFS_FORMAT,
FLOPPY_BBC_CPM_FORMAT,
+ FLOPPY_BBC_CPN_FORMAT,
FLOPPY_FSD_FORMAT
FLOPPY_FORMATS_END
@@ -691,6 +742,7 @@ FLOPPY_FORMATS_MEMBER( bbc_state::floppy_formats_bbcm )
FLOPPY_BBC_DFS_FORMAT,
FLOPPY_BBC_ADFS_FORMAT,
FLOPPY_BBC_CPM_FORMAT,
+ FLOPPY_BBC_CPN_FORMAT,
FLOPPY_BBC_DOS_FORMAT,
FLOPPY_FSD_FORMAT
FLOPPY_FORMATS_END
@@ -879,13 +931,22 @@ static MACHINE_CONFIG_DERIVED( bbcb, bbca )
MCFG_FLOPPY_DRIVE_ADD("i8271:1", bbc_floppies_525, "qd", bbc_state::floppy_formats_bbc)
MCFG_FLOPPY_DRIVE_SOUND(true)
+ /* econet */
+ MCFG_DEVICE_ADD("mc6854", MC6854, 0)
+ MCFG_MC6854_OUT_TXD_CB(DEVWRITELINE(ECONET_TAG, econet_device, data_w))
+ MCFG_ECONET_ADD()
+ MCFG_ECONET_CLK_CALLBACK(WRITELINE(bbc_state, econet_clk_w))
+ MCFG_ECONET_DATA_CALLBACK(DEVWRITELINE("mc6854", mc6854_device, set_rx))
+ MCFG_ECONET_SLOT_ADD("econet254", 254, econet_devices, NULL)
+
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("cass_ls_b", "bbcb_cass")
- MCFG_SOFTWARE_LIST_ADD("flop_ls_b", "bbcb_flop")
- MCFG_SOFTWARE_LIST_ADD("flop_ls_b_orig", "bbcb_orig_flop")
- MCFG_SOFTWARE_LIST_ADD("flop_ls_z80", "bbc_z80_flop")
- MCFG_SOFTWARE_LIST_ADD("flop_ls_32016", "bbc_32016_flop")
- MCFG_SOFTWARE_LIST_ADD("flop_ls_68000", "bbc_68000_flop")
+ MCFG_SOFTWARE_LIST_ADD("cass_ls_b", "bbcb_cass")
+ MCFG_SOFTWARE_LIST_ADD("flop_ls_b", "bbcb_flop")
+ MCFG_SOFTWARE_LIST_ADD("flop_ls_b_orig", "bbcb_flop_orig")
+ MCFG_SOFTWARE_LIST_ADD("flop_ls_z80", "bbc_flop_z80")
+ MCFG_SOFTWARE_LIST_ADD("flop_ls_32016", "bbc_flop_32016")
+ MCFG_SOFTWARE_LIST_ADD("flop_ls_68000", "bbc_flop_68000")
+ MCFG_SOFTWARE_LIST_ADD("flop_ls_6502", "bbc_flop_6502")
MACHINE_CONFIG_END
@@ -910,7 +971,7 @@ MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( bbcb_de, bbcb )
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("flop_ls_b_de", "bbcb_de_cass")
+ MCFG_SOFTWARE_LIST_ADD("flop_ls_b_de", "bbcb_cass_de")
MACHINE_CONFIG_END
@@ -922,7 +983,7 @@ static MACHINE_CONFIG_DERIVED( bbcb_us, bbcb )
MCFG_SCREEN_REFRESH_RATE(60)
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("flop_ls_b_us", "bbcb_us_flop")
+ MCFG_SOFTWARE_LIST_ADD("flop_ls_b_us", "bbcb_flop_us")
MACHINE_CONFIG_END
@@ -960,6 +1021,47 @@ MACHINE_CONFIG_END
/***************************************************************************
+ Torch Computers
+
+****************************************************************************/
+
+
+static MACHINE_CONFIG_DERIVED( torchf, bbcb )
+ /* basic machine hardware */
+ MCFG_MACHINE_START_OVERRIDE(bbc_state, torch)
+ MCFG_MACHINE_RESET_OVERRIDE(bbc_state, torch)
+
+ /* Add Torch Z80 Communicator co-processor */
+
+ /* software lists */
+ MCFG_SOFTWARE_LIST_ADD("flop_ls_torch", "bbc_flop_torch")
+ MCFG_SOFTWARE_LIST_REMOVE("flop_ls_z80")
+ MCFG_SOFTWARE_LIST_REMOVE("flop_ls_32016")
+ MCFG_SOFTWARE_LIST_REMOVE("flop_ls_68000")
+ MCFG_SOFTWARE_LIST_REMOVE("flop_ls_6502")
+MACHINE_CONFIG_END
+
+
+static MACHINE_CONFIG_DERIVED( torchh10, torchf )
+ /* fdc */
+ MCFG_DEVICE_REMOVE("i8271:1")
+
+ /* Add 10MB HDD */
+
+MACHINE_CONFIG_END
+
+
+static MACHINE_CONFIG_DERIVED( torchh21, torchf )
+ /* fdc */
+ MCFG_DEVICE_REMOVE("i8271:1")
+
+ /* Add 21MB HDD */
+
+MACHINE_CONFIG_END
+
+
+/***************************************************************************
+
Acorn Business Computers
****************************************************************************/
@@ -982,6 +1084,7 @@ static MACHINE_CONFIG_DERIVED( abc110, bbcbp )
MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b_orig")
MCFG_SOFTWARE_LIST_REMOVE("flop_ls_32016")
MCFG_SOFTWARE_LIST_REMOVE("flop_ls_68000")
+ MCFG_SOFTWARE_LIST_REMOVE("flop_ls_6502")
MACHINE_CONFIG_END
@@ -1004,6 +1107,7 @@ static MACHINE_CONFIG_DERIVED( acw443, bbcbp )
MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b_orig")
MCFG_SOFTWARE_LIST_REMOVE("flop_ls_z80")
MCFG_SOFTWARE_LIST_REMOVE("flop_ls_68000")
+ MCFG_SOFTWARE_LIST_REMOVE("flop_ls_6502")
MACHINE_CONFIG_END
@@ -1024,6 +1128,7 @@ static MACHINE_CONFIG_DERIVED( abc310, bbcbp )
MCFG_SOFTWARE_LIST_REMOVE("flop_ls_z80")
MCFG_SOFTWARE_LIST_REMOVE("flop_ls_32016")
MCFG_SOFTWARE_LIST_REMOVE("flop_ls_68000")
+ MCFG_SOFTWARE_LIST_REMOVE("flop_ls_6502")
MACHINE_CONFIG_END
@@ -1059,6 +1164,7 @@ static MACHINE_CONFIG_DERIVED( reutapm, bbcbp )
MCFG_SOFTWARE_LIST_REMOVE("flop_ls_z80")
MCFG_SOFTWARE_LIST_REMOVE("flop_ls_32016")
MCFG_SOFTWARE_LIST_REMOVE("flop_ls_68000")
+ MCFG_SOFTWARE_LIST_REMOVE("flop_ls_6502")
MACHINE_CONFIG_END
@@ -1140,13 +1246,13 @@ static MACHINE_CONFIG_START( bbcm, bbc_state )
MCFG_SOFTWARE_LIST_ADD("cass_ls_m", "bbcm_cass")
MCFG_SOFTWARE_LIST_ADD("flop_ls_m", "bbcm_flop")
MCFG_SOFTWARE_LIST_ADD("cart_ls_m", "bbcm_cart")
- MCFG_SOFTWARE_LIST_ADD("flop_ls_z80", "bbc_z80_flop")
- MCFG_SOFTWARE_LIST_ADD("flop_ls_32016", "bbc_32016_flop")
- MCFG_SOFTWARE_LIST_ADD("flop_ls_68000", "bbc_68000_flop")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("cass_ls_a", "bbca_cass")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("cass_ls_b", "bbcb_cass")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("flop_ls_b", "bbcb_flop")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("flop_ls_b_orig", "bbcb_orig_flop")
+ MCFG_SOFTWARE_LIST_ADD("flop_ls_z80", "bbc_flop_z80")
+ MCFG_SOFTWARE_LIST_ADD("flop_ls_32016", "bbc_flop_32016")
+ MCFG_SOFTWARE_LIST_ADD("flop_ls_68000", "bbc_flop_68000")
+ MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("cass_ls_a", "bbca_cass")
+ MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("cass_ls_b", "bbcb_cass")
+ MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("flop_ls_b", "bbcb_flop")
+ MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("flop_ls_b_orig", "bbcb_flop_orig")
/* acia */
MCFG_DEVICE_ADD("acia6850", ACIA6850, 0)
@@ -1208,7 +1314,7 @@ static MACHINE_CONFIG_DERIVED( bbcmt, bbcm )
/* Add 65C102 co-processor */
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("flop_ls_65c102", "bbc_65c102_flop")
+ MCFG_SOFTWARE_LIST_ADD("flop_ls_65c102", "bbc_flop_65c102")
MACHINE_CONFIG_END
@@ -1260,7 +1366,7 @@ static MACHINE_CONFIG_DERIVED( bbcm512, bbcm )
/* Add Intel 80186 co-processor */
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("flop_ls_80186", "bbc_80186_flop")
+ MCFG_SOFTWARE_LIST_ADD("flop_ls_80186", "bbc_flop_80186")
MACHINE_CONFIG_END
@@ -1269,7 +1375,7 @@ static MACHINE_CONFIG_DERIVED( bbcmarm, bbcm )
/* Add ARM co-processor */
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("flop_ls_arm", "bbc_arm_flop")
+ MCFG_SOFTWARE_LIST_ADD("flop_ls_arm", "bbc_flop_arm")
MACHINE_CONFIG_END
@@ -1523,10 +1629,42 @@ ROM_START(bbcb_us)
ROM_DEFAULT_BIOS("os10b3")
ROM_SYSTEM_BIOS( 0, "os10b3", "OS A1.0 / BASIC3" )
ROMX_LOAD("usmos10.rom", 0x40000, 0x4000, CRC(c8e946a9) SHA1(83d91d089dca092d2c8b7c3650ff8143c9069b89), ROM_BIOS(1))
- ROMX_LOAD("usbasic3.rom", 0x3c000, 0x4000, CRC(161b9539) SHA1(b39014610a968789afd7695aa04d1277d874405c), ROM_BIOS(1)) /* rom page 15 3c000 */
+ ROMX_LOAD("usbasic3.rom", 0x38000, 0x4000, CRC(161b9539) SHA1(b39014610a968789afd7695aa04d1277d874405c), ROM_BIOS(1)) /* rom page 15 3c000 */
ROM_LOAD("viewa210.rom", 0x30000, 0x4000, CRC(4345359f) SHA1(88c93df1854f5fbe6cd6e5f0e29a8bf4ea3b5614))
- ROM_LOAD("usdnfs10.rom", 0x38000, 0x4000, CRC(7e367e8c) SHA1(161f585dc45665ea77433c84afd2f95049f7f5a0))
+ ROM_LOAD("usdnfs10.rom", 0x34000, 0x4000, CRC(7e367e8c) SHA1(161f585dc45665ea77433c84afd2f95049f7f5a0))
+
+ ROM_REGION(0x4000, "os", 0)
+ ROM_COPY("option", 0x40000, 0, 0x4000)
+
+ ROM_REGION(0x8000, "vsm", 0) /* system speech PHROM */
+ ROM_LOAD("phrom_us.bin", 0x0000, 0x4000, CRC(bf4b3b64) SHA1(66876702d1d95eecc034d20f25047f893a27cde5))
+ROM_END
+
+
+ROM_START(torchf)
+ ROM_REGION(0x08000,"maincpu",ROMREGION_ERASEFF) /* RAM */
+
+ ROM_REGION(0x44000,"option",0) /* ROM */
+ /* rom page 12 30000 IC52 BASIC */
+ /* rom page 13 34000 IC88 DNFS */
+ /* rom page 14 38000 IC100 CPN */
+ /* rom page 15 3c000 IC101 SPARE SOCKET */
+ ROM_LOAD("os12.rom", 0x40000, 0x4000, CRC(3c14fc70) SHA1(0d9bcaf6a393c9ce2359ed700ddb53c232c2c45d)) /* os */
+
+ ROM_LOAD("basic2.rom", 0x0c000, 0x4000, CRC(79434781) SHA1(4a7393f3a45ea309f744441c16723e2ef447a281))
+ ROM_LOAD("dnfs120-201666.rom", 0x34000, 0x4000, CRC(8ccd2157) SHA1(7e3c536baeae84d6498a14e8405319e01ee78232))
+
+ ROM_DEFAULT_BIOS("mcp120cbl")
+ ROM_SYSTEM_BIOS( 0, "mcp120cbl", "MCP120CBL" )
+ ROMX_LOAD("mcp120cbl.rom", 0x38000, 0x4000, CRC(851d0879) SHA1(2e54ef15692ba7dd9fcfd1ef0d660464a772b156), ROM_BIOS(1))
+ ROM_SYSTEM_BIOS( 1, "mcp101ci", "MCP101CI" )
+ ROMX_LOAD("mcp101ci.rom", 0x38000, 0x4000, NO_DUMP, ROM_BIOS(2))
+ ROM_SYSTEM_BIOS( 2, "mcp041cbl", "MCP041CBL" )
+ ROMX_LOAD("mcp041cbl.rom", 0x38000, 0x4000, CRC(b36f07f4) SHA1(bd53f09bf73357845a6f97df1ee9e5aea5cdca90), ROM_BIOS(3))
+ ROM_SYSTEM_BIOS( 3, "cpn071", "CPN71+" )
+ ROMX_LOAD("cpn071.rom", 0x38000, 0x2000, CRC(fcb1bdc8) SHA1(756e22f6d76eb26206765f92c78c7152944102b6), ROM_BIOS(4))
+ ROM_RELOAD( 0x3a000, 0x2000 )
ROM_REGION(0x4000, "os", 0)
ROM_COPY("option", 0x40000, 0, 0x4000)
@@ -1536,6 +1674,12 @@ ROM_START(bbcb_us)
ROM_END
+#define rom_torchh10 rom_torchf
+
+
+#define rom_torchh21 rom_torchf
+
+
ROM_START(bbcbp)
ROM_REGION(0x10000,"maincpu",ROMREGION_ERASEFF) /* ROM MEMORY */
@@ -1558,7 +1702,7 @@ ROM_START(bbcbp)
/* rom page 11 2c000 IC68 SPARE SOCKET */
/* rom page 12 30000 SWRAM (B+ 128K only) */
/* rom page 13 34000 SWRAM (B+ 128K only) */
- /* rom page 14 38000 32K IN PAGE 15 */
+ /* rom page 14 38000 IC71 32K IN PAGE 15 */
/* rom page 15 3C000 IC71 BASIC */
ROM_LOAD("adfs130.rom", 0x14000, 0x4000, CRC(d3855588) SHA1(301fd05c475a629c4bec70510d4507256a5b00d8))
ROM_LOAD("ddfs223.rom", 0x1c000, 0x4000, CRC(7891f9b7) SHA1(0d7ed0b0b3852cb61970ada1993244f2896896aa))
@@ -1693,11 +1837,11 @@ ROM_START(bbcm)
ROM_REGION(0x10000,"maincpu",ROMREGION_ERASEFF) /* ROM MEMORY */
ROM_REGION(0x44000,"option",0) /* ROM */
- ROM_DEFAULT_BIOS("mos350")
- ROM_SYSTEM_BIOS( 0, "mos350", "Enhanced MOS 3.50" )
- ROMX_LOAD("mos350.ic24", 0x20000, 0x20000, CRC(141027b9) SHA1(85211b5bc7c7a269952d2b063b7ec0e1f0196803), ROM_BIOS(1))
- ROM_SYSTEM_BIOS( 1, "mos320", "Original MOS 3.20" )
- ROMX_LOAD("mos320.ic24", 0x20000, 0x20000, CRC(0f747ebe) SHA1(eacacbec3892dc4809ad5800e6c8299ff9eb528f), ROM_BIOS(2))
+ ROM_DEFAULT_BIOS("mos320")
+ ROM_SYSTEM_BIOS( 0, "mos320", "Original MOS 3.20" )
+ ROMX_LOAD("mos320.ic24", 0x20000, 0x20000, CRC(0f747ebe) SHA1(eacacbec3892dc4809ad5800e6c8299ff9eb528f), ROM_BIOS(1))
+ ROM_SYSTEM_BIOS( 1, "mos350", "Enhanced MOS 3.50" )
+ ROMX_LOAD("mos350.ic24", 0x20000, 0x20000, CRC(141027b9) SHA1(85211b5bc7c7a269952d2b063b7ec0e1f0196803), ROM_BIOS(2))
ROM_COPY("option", 0x20000, 0x40000, 0x4000) /* Move loaded roms into place */
ROM_FILL(0x20000, 0x4000, 0xFFFF)
/* 00000 rom 0 SK3 Rear Cartridge bottom 16K */
@@ -1951,15 +2095,18 @@ ROM_END
/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
COMP ( 1981, bbcb, 0, bbca, bbcb, bbcb, bbc_state, bbc, "Acorn", "BBC Micro Model B w/8271 FDC", MACHINE_IMPERFECT_GRAPHICS)
COMP ( 1981, bbca, bbcb, 0, bbca, bbca, bbc_state, bbc, "Acorn", "BBC Micro Model A", MACHINE_IMPERFECT_GRAPHICS)
+COMP ( 1982, torchf, bbcb, 0, torchf, torch, bbc_state, bbc, "Torch", "Torch CF240", MACHINE_IMPERFECT_KEYBOARD | MACHINE_NOT_WORKING)
+COMP ( 1982, torchh10, bbcb, 0, torchh10, torch, bbc_state, bbc, "Torch", "Torch CH240/10", MACHINE_IMPERFECT_KEYBOARD | MACHINE_NOT_WORKING)
+COMP ( 1982, torchh21, bbcb, 0, torchh21, torch, bbc_state, bbc, "Torch", "Torch CH240/21", MACHINE_IMPERFECT_KEYBOARD | MACHINE_NOT_WORKING)
COMP ( 1982, bbcb_de, bbcb, 0, bbcb_de, bbcb, bbc_state, bbc, "Acorn", "BBC Micro Model B (German)", MACHINE_IMPERFECT_GRAPHICS)
COMP ( 1983, bbcb_us, bbcb, 0, bbcb_us, bbcb, bbc_state, bbc, "Acorn", "BBC Micro Model B (US)", MACHINE_IMPERFECT_GRAPHICS)
COMP ( 1984, bbcb1770, bbcb, 0, bbcb1770, bbcb, bbc_state, bbc, "Acorn", "BBC Micro Model B w/1770 FDC", MACHINE_IMPERFECT_GRAPHICS)
COMP ( 1985, bbcbp, 0, bbcb, bbcbp, bbcbp, bbc_state, bbc, "Acorn", "BBC Micro Model B+ 64K", MACHINE_IMPERFECT_GRAPHICS)
COMP ( 1985, bbcbp128, bbcbp, 0, bbcbp128, bbcbp, bbc_state, bbc, "Acorn", "BBC Micro Model B+ 128K", MACHINE_IMPERFECT_GRAPHICS)
-COMP ( 1985, acw443, 0, 0, acw443, abc, bbc_state, bbc, "Acorn", "ABC 210/Cambridge Workstation", MACHINE_NOT_WORKING)
-COMP ( 1985, abc110, acw443, 0, abc110, abc, bbc_state, bbc, "Acorn", "ABC 110", MACHINE_NOT_WORKING)
-COMP ( 1985, abc310, acw443, 0, abc310, abc, bbc_state, bbc, "Acorn", "ABC 310", MACHINE_NOT_WORKING)
-COMP ( 1985, reutapm, 0, 0, reutapm, bbcb, bbc_state, bbc, "Acorn", "Reuters APM", MACHINE_NO_SOUND | MACHINE_NOT_WORKING)
+COMP ( 1985, abc110, bbcbp, 0, abc110, abc, bbc_state, bbc, "Acorn", "ABC 110", MACHINE_NOT_WORKING)
+COMP ( 1985, acw443, bbcbp, 0, acw443, abc, bbc_state, bbc, "Acorn", "ABC 210/Cambridge Workstation", MACHINE_NOT_WORKING)
+COMP ( 1985, abc310, bbcbp, 0, abc310, abc, bbc_state, bbc, "Acorn", "ABC 310", MACHINE_NOT_WORKING)
+COMP ( 1985, reutapm, bbcbp, 0, reutapm, bbcb, bbc_state, bbc, "Acorn", "Reuters APM", MACHINE_NO_SOUND_HW | MACHINE_NOT_WORKING)
COMP ( 1986, bbcm, 0, bbcb, bbcm, bbcm, bbc_state, bbc, "Acorn", "BBC Master 128", MACHINE_IMPERFECT_GRAPHICS)
COMP ( 1986, bbcmt, bbcm, 0, bbcmt, bbcm, bbc_state, bbc, "Acorn", "BBC Master Turbo", MACHINE_NOT_WORKING)
COMP ( 1986, bbcmaiv, bbcm, 0, bbcmaiv, bbcm, bbc_state, bbc, "Acorn", "BBC Master AIV", MACHINE_NOT_WORKING)
diff --git a/src/mame/drivers/bbcbc.cpp b/src/mame/drivers/bbcbc.cpp
index 3c50df82697..c2d6d661d9f 100644
--- a/src/mame/drivers/bbcbc.cpp
+++ b/src/mame/drivers/bbcbc.cpp
@@ -160,5 +160,5 @@ ROM_END
***************************************************************************/
-/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS */
-CONS(1985, bbcbc, 0, 0, bbcbc, bbcbc, driver_device, 0, "BBC", "Bridge Companion", MACHINE_NO_SOUND_HW )
+/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
+CONS(1985, bbcbc, 0, 0, bbcbc, bbcbc, driver_device, 0, "BBC Enterprises Ltd.", "Bridge Companion", MACHINE_NO_SOUND_HW )
diff --git a/src/mame/drivers/bbusters.cpp b/src/mame/drivers/bbusters.cpp
index f3cde4a2359..e515416b646 100644
--- a/src/mame/drivers/bbusters.cpp
+++ b/src/mame/drivers/bbusters.cpp
@@ -292,15 +292,15 @@ WRITE16_MEMBER(bbusters_state::gun_select_w)
WRITE16_MEMBER(bbusters_state::two_gun_output_w)
{
- output_set_value("Player1_Gun_Recoil",(data & 0x01));
- output_set_value("Player2_Gun_Recoil",(data & 0x02)>>1);
+ output().set_value("Player1_Gun_Recoil",(data & 0x01));
+ output().set_value("Player2_Gun_Recoil",(data & 0x02)>>1);
}
WRITE16_MEMBER(bbusters_state::three_gun_output_w)
{
- output_set_value("Player1_Gun_Recoil",(data & 0x01));
- output_set_value("Player2_Gun_Recoil",(data & 0x02)>>1);
- output_set_value("Player3_Gun_Recoil",(data & 0x04)>>2);
+ output().set_value("Player1_Gun_Recoil",(data & 0x01));
+ output().set_value("Player2_Gun_Recoil",(data & 0x02)>>1);
+ output().set_value("Player3_Gun_Recoil",(data & 0x04)>>2);
}
READ16_MEMBER(bbusters_state::kludge_r)
diff --git a/src/mame/drivers/beathead.cpp b/src/mame/drivers/beathead.cpp
index 2f7b18f674f..79221b41aa4 100644
--- a/src/mame/drivers/beathead.cpp
+++ b/src/mame/drivers/beathead.cpp
@@ -263,7 +263,7 @@ WRITE32_MEMBER( beathead_state::sound_reset_w )
WRITE32_MEMBER( beathead_state::coin_count_w )
{
- coin_counter_w(machine(), 0, !offset);
+ machine().bookkeeping().coin_counter_w(0, !offset);
}
diff --git a/src/mame/drivers/berzerk.cpp b/src/mame/drivers/berzerk.cpp
index 81d28ee6c4c..14d87d7d4ff 100644
--- a/src/mame/drivers/berzerk.cpp
+++ b/src/mame/drivers/berzerk.cpp
@@ -31,7 +31,8 @@ public:
m_custom(*this, "exidy"),
m_screen(*this, "screen"),
m_videoram(*this, "videoram"),
- m_colorram(*this, "colorram") { }
+ m_colorram(*this, "colorram")
+ { }
required_device<cpu_device> m_maincpu;
required_device<s14001a_device> m_s14001a;
@@ -92,8 +93,6 @@ public:
};
-#define MONITOR_TYPE_PORT_TAG ("MONITOR_TYPE")
-
#define MASTER_CLOCK (XTAL_10MHz)
#define MAIN_CPU_CLOCK (MASTER_CLOCK / 4)
#define PIXEL_CLOCK (MASTER_CLOCK / 2)
@@ -124,7 +123,7 @@ static const UINT8 nmi_trigger_v256s [NMIS_PER_FRAME] = { 0x00, 0x00, 0x00, 0x00
READ8_MEMBER(berzerk_state::led_on_r)
{
- set_led_status(machine(), 0, 1);
+ output().set_led_value(0, 1);
return 0;
}
@@ -132,13 +131,13 @@ READ8_MEMBER(berzerk_state::led_on_r)
WRITE8_MEMBER(berzerk_state::led_on_w)
{
- set_led_status(machine(), 0, 1);
+ output().set_led_value(0, 1);
}
READ8_MEMBER(berzerk_state::led_off_r)
{
- set_led_status(machine(), 0, 0);
+ output().set_led_value(0, 0);
return 0;
}
@@ -146,7 +145,7 @@ READ8_MEMBER(berzerk_state::led_off_r)
WRITE8_MEMBER(berzerk_state::led_off_w)
{
- set_led_status(machine(), 0, 0);
+ output().set_led_value(0, 0);
}
@@ -355,7 +354,7 @@ void berzerk_state::machine_reset()
{
m_irq_enabled = 0;
m_nmi_enabled = 0;
- set_led_status(machine(), 0, 0);
+ output().set_led_value(0, 0);
m_magicram_control = 0;
start_irq_timer();
@@ -370,9 +369,6 @@ void berzerk_state::machine_reset()
*
*************************************/
-#define NUM_PENS (0x10)
-
-
void berzerk_state::video_start()
{
m_ls181_10c->mode_w(1);
@@ -434,7 +430,7 @@ READ8_MEMBER(berzerk_state::intercept_v256_r)
vpos_to_vsync_chain_counter(m_screen->vpos(), &counter, &v256);
- return (!m_intercept << 7) | v256;
+ return (m_intercept^1) << 7 | v256;
}
@@ -443,10 +439,9 @@ void berzerk_state::get_pens(rgb_t *pens)
static const int resistances_wg[] = { 750, 0 };
static const int resistances_el[] = { static_cast<int>(1.0 / ((1.0 / 750.0) + (1.0 / 360.0))), 0 };
- int color;
double color_weights[2];
- if (ioport(MONITOR_TYPE_PORT_TAG)->read() == 0)
+ if (ioport("MONITOR_TYPE")->read() == 0)
compute_resistor_weights(0, 0xff, -1.0,
2, resistances_wg, color_weights, 0, 270,
2, resistances_wg, color_weights, 0, 270,
@@ -457,7 +452,7 @@ void berzerk_state::get_pens(rgb_t *pens)
2, resistances_el, color_weights, 0, 270,
2, resistances_el, color_weights, 0, 270);
- for (color = 0; color < NUM_PENS; color++)
+ for (int color = 0; color < 0x10; color++)
{
UINT8 r_bit = (color >> 0) & 0x01;
UINT8 g_bit = (color >> 1) & 0x01;
@@ -475,12 +470,10 @@ void berzerk_state::get_pens(rgb_t *pens)
UINT32 berzerk_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
- rgb_t pens[NUM_PENS];
- offs_t offs;
-
+ rgb_t pens[0x10];
get_pens(pens);
- for (offs = 0; offs < m_videoram.bytes(); offs++)
+ for (int offs = 0; offs < m_videoram.bytes(); offs++)
{
int i;
@@ -522,8 +515,6 @@ UINT32 berzerk_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap,
WRITE8_MEMBER(berzerk_state::audio_w)
{
- int clock_divisor;
-
switch (offset)
{
/* offset 4 writes to the S14001A */
@@ -532,28 +523,26 @@ WRITE8_MEMBER(berzerk_state::audio_w)
{
/* write data to the S14001 */
case 0:
- /* only if not busy */
- if (!m_s14001a->bsy_r())
- {
- m_s14001a->reg_w(data & 0x3f);
+ m_s14001a->data_w(space, 0, data & 0x3f);
- /* clock the chip -- via a 555 timer */
- m_s14001a->rst_w(1);
- m_s14001a->rst_w(0);
- }
+ /* clock the chip -- via a 555 timer */
+ m_s14001a->start_w(1);
+ m_s14001a->start_w(0);
break;
case 1:
+ {
/* volume */
- m_s14001a->set_volume(((data & 0x38) >> 3) + 1);
+ m_s14001a->force_update();
+ m_s14001a->set_output_gain(0, ((data >> 3 & 0xf) + 1) / 16.0);
/* clock control - the first LS161 divides the clock by 9 to 16, the 2nd by 8,
giving a final clock from 19.5kHz to 34.7kHz */
- clock_divisor = 16 - (data & 0x07);
-
+ int clock_divisor = 16 - (data & 0x07);
m_s14001a->set_clock(S14001_CLOCK / clock_divisor / 8);
break;
+ }
default: break; /* 2 and 3 are not connected */
}
@@ -569,7 +558,6 @@ WRITE8_MEMBER(berzerk_state::audio_w)
default:
m_custom->sh6840_w(space, offset, data);
break;
-
}
}
@@ -580,7 +568,7 @@ READ8_MEMBER(berzerk_state::audio_r)
{
/* offset 4 reads from the S14001A */
case 4:
- return (!m_s14001a->bsy_r()) ? 0x40 : 0x00;
+ return (m_s14001a->busy_r()) ? 0xc0 : 0x40;
/* offset 6 is open bus */
case 6:
logerror("attempted read from berzerk audio reg 6 (sfxctrl)!\n");
@@ -720,7 +708,7 @@ static INPUT_PORTS_START( common ) // used on all games
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN1 )
/* fake port for monitor type */
- PORT_START(MONITOR_TYPE_PORT_TAG)
+ PORT_START("MONITOR_TYPE")
PORT_CONFNAME( 0x01, 0x00, "Monitor Type" )
PORT_CONFSETTING( 0x00, "Wells-Gardner" )
PORT_CONFSETTING( 0x01, "Electrohome" )
@@ -832,7 +820,6 @@ static INPUT_PORTS_START( frenzy )
/* Bit 0 does some more hardware tests. According to the manual, both bit 0 & 1 must be:
- ON for Signature Analysis (S.A.)
- OFF for game operation */
- //PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) // F2:1,2
PORT_DIPNAME( 0x03, 0x00, "Hardware Tests" ) PORT_DIPLOCATION("F2:1,2")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x01, "Color test" )
@@ -894,7 +881,7 @@ static INPUT_PORTS_START( frenzy )
PORT_START("F5")
PORT_DIPNAME( 0xff, 0x01, "Coins/Credit A" ) PORT_DIPLOCATION("F5:1,2,3,4,5,6,7,8")
- PORT_DIPSETTING( 0x00, "0 (invalid)" ) // Can't insert coins
+ PORT_DIPSETTING( 0x00, "0 (invalid)" ) // Can't insert coins
PORT_DIPSETTING( 0x01, "1" )
PORT_DIPSETTING( 0x02, "2" )
PORT_DIPSETTING( 0x03, "3" )
@@ -914,7 +901,7 @@ static INPUT_PORTS_START( frenzy )
PORT_START("F6")
PORT_DIPNAME( 0xff, 0x01, "Coins/Credit B" ) PORT_DIPLOCATION("F6:1,2,3,4,5,6,7,8")
- PORT_DIPSETTING( 0x00, "0 (invalid)" ) // Can't insert coins
+ PORT_DIPSETTING( 0x00, "0 (invalid)" ) // Can't insert coins
PORT_DIPSETTING( 0x01, "1" )
PORT_DIPSETTING( 0x02, "2" )
PORT_DIPSETTING( 0x03, "3" )
@@ -976,22 +963,22 @@ static INPUT_PORTS_START( moonwarp )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON4 ) // Hyper flip button is common for both players in cocktail mode.
PORT_START("P1")
- //PORT_BIT( 0x1f, IP_ACTIVE_HIGH, IPT_SPECIAL ) // spinner/dial
+ PORT_BIT( 0x1f, IP_ACTIVE_HIGH, IPT_SPECIAL ) // spinner/dial
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON3 )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 )
PORT_START("P1_DIAL")
- PORT_BIT( 0xff, 0x0, IPT_DIAL ) PORT_SENSITIVITY(25) PORT_KEYDELTA(4) PORT_RESET
+ PORT_BIT( 0xff, 0x00, IPT_DIAL ) PORT_SENSITIVITY(25) PORT_KEYDELTA(4) PORT_RESET
PORT_START("P2")
- //PORT_BIT( 0x1f, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_COCKTAIL // spinner/dial
+ PORT_BIT( 0x1f, IP_ACTIVE_HIGH, IPT_SPECIAL ) // spinner/dial(cocktail)
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_COCKTAIL
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL
PORT_START("P2_DIAL")
- PORT_BIT( 0xff, 0x0, IPT_DIAL ) PORT_SENSITIVITY(25) PORT_KEYDELTA(4) PORT_COCKTAIL PORT_RESET
+ PORT_BIT( 0xff, 0x00, IPT_DIAL ) PORT_SENSITIVITY(25) PORT_KEYDELTA(4) PORT_COCKTAIL PORT_RESET
PORT_START("F2")
PORT_DIPNAME( 0x03, 0x00, "Hardware Tests" ) PORT_DIPLOCATION("F2:1,2")
@@ -1104,7 +1091,6 @@ static INPUT_PORTS_START( moonwarp )
PORT_DIPSETTING( 0x40, DEF_STR( Easy ) )
PORT_DIPSETTING( 0x80, DEF_STR( Normal ) )
PORT_DIPSETTING( 0xc0, DEF_STR( Hard ) )
-
INPUT_PORTS_END
@@ -1127,7 +1113,6 @@ static MACHINE_CONFIG_START( berzerk, berzerk_state )
MCFG_TTL74181_ADD("ls181_12c")
/* video hardware */
-
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART)
MCFG_SCREEN_UPDATE_DRIVER(berzerk_state, screen_update)
@@ -1135,10 +1120,10 @@ static MACHINE_CONFIG_START( berzerk, berzerk_state )
/* audio hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
- MCFG_SOUND_ADD("speech", S14001A, 0) /* placeholder - the clock is software controllable */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ MCFG_SOUND_ADD("speech", S14001A, S14001_CLOCK/16/8) /* placeholder - the clock is software controllable */
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
MCFG_SOUND_ADD("exidy", EXIDY, 0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.33)
MACHINE_CONFIG_END
@@ -1203,8 +1188,7 @@ ROM_START( berzerk )
ROM_LOAD( "berzerk_rc31_5d.rom3.5d", 0x2000, 0x0800, CRC(fcaefa95) SHA1(07f849aa39f1e3db938187ffde4a46a588156ddc) )
ROM_LOAD( "berzerk_rc31_6d.rom4.6d", 0x2800, 0x0800, CRC(1e35b9a0) SHA1(5a5e549ec0e4803ab2d1eac6b3e7171aedf28244) )
ROM_LOAD( "berzerk_rc31_5c.rom5.5c", 0x3000, 0x0800, CRC(c8c665e5) SHA1(e9eca4b119549e0061384abf52327c14b0d56624) )
- /* rom socket ROM6 at 3C is unpopulated */
- ROM_FILL( 0x3800, 0x0800, 0xff )
+ ROM_FILL( 0x3800, 0x0800, 0xff ) /* rom socket ROM6 at 3C is unpopulated */
ROM_REGION( 0x01000, "speech", 0 ) /* voice data */
ROM_LOAD( "berzerk_r_vo_1c.1c", 0x0000, 0x0800, CRC(2cfe825d) SHA1(f12fed8712f20fa8213f606c4049a8144bfea42e) ) /* VSU-1000 board */
@@ -1219,8 +1203,7 @@ ROM_START( berzerk1 )
ROM_LOAD( "rom3.5d", 0x2000, 0x0800, CRC(6a1936b4) SHA1(f1635e9d2f25514c35559d2a247c3bc4b4034c19) )
ROM_LOAD( "rom4.6d", 0x2800, 0x0800, CRC(fa5dce40) SHA1(b3a3ee52bf65bbb3a20f905d3e4ebdf6871dcb5d) )
ROM_LOAD( "rom5.5c", 0x3000, 0x0800, CRC(2579b9f4) SHA1(890f0237afbb194166eae88c98de81989f408548) )
- /* rom socket ROM6 at 3C is unpopulated */
- ROM_FILL( 0x3800, 0x0800, 0xff )
+ ROM_FILL( 0x3800, 0x0800, 0xff ) /* rom socket ROM6 at 3C is unpopulated */
ROM_REGION( 0x01000, "speech", 0 ) /* voice data */
ROM_LOAD( "berzerk_r_vo_1c.1c", 0x0000, 0x0800, CRC(2cfe825d) SHA1(f12fed8712f20fa8213f606c4049a8144bfea42e) ) /* VSU-1000 board */
@@ -1235,8 +1218,7 @@ ROM_START( berzerkf )
ROM_LOAD( "berzerk_rc31f_5d.rom3.5d", 0x2000, 0x0800, CRC(316192b5) SHA1(50f4ba2b59423a48c1d51fc6e4d9ea098d6f3743) )
ROM_LOAD( "berzerk_rc31f_6d.rom4.6d", 0x2800, 0x0800, CRC(cd51238c) SHA1(f0b65bdd1f225c151a93ea62812b4bb64969acac) )
ROM_LOAD( "berzerk_rc31f_5c.rom5.5c", 0x3000, 0x0800, CRC(563b13b6) SHA1(f8d137cd26535efe92780560d2f69f12d3f0fa42) )
- /* rom socket ROM6 at 3C is unpopulated */
- ROM_FILL( 0x3800, 0x0800, 0xff )
+ ROM_FILL( 0x3800, 0x0800, 0xff ) /* rom socket ROM6 at 3C is unpopulated */
ROM_REGION( 0x01000, "speech", 0 ) /* voice data */
ROM_LOAD( "berzerk_rvof_1c.1c", 0x0000, 0x0800, CRC(d7bfaca2) SHA1(b8c22db0f6e86d90f3c2ac9ff9e9d0ccff314919) ) /* VSU-1000 board */
@@ -1251,8 +1233,7 @@ ROM_START( berzerkg )
ROM_LOAD( "cpu rom 03.5d", 0x2000, 0x0800, CRC(e23239a9) SHA1(a0505efdee4cb1962243638c641e94983673f70f) )
ROM_LOAD( "cpu rom 04.6d", 0x2800, 0x0800, CRC(651b31b7) SHA1(890f424a5a73a95af642435c1b0cca78a9413aae) )
ROM_LOAD( "cpu rom 05.5c", 0x3000, 0x0800, CRC(8a403bba) SHA1(686a9b58a245df6c947d14991a2e4cbaf511e2ca) )
- /* rom socket ROM6 at 3C is unpopulated */
- ROM_FILL( 0x3800, 0x0800, 0xff )
+ ROM_FILL( 0x3800, 0x0800, 0xff ) /* rom socket ROM6 at 3C is unpopulated */
ROM_REGION( 0x01000, "speech", 0 ) /* voice data */
ROM_LOAD( "berzerk_rvog_1c.1c", 0x0000, 0x0800, CRC(fc1da15f) SHA1(f759a017d9e95acf0e1d35b16d8820acee7d7e3d) ) /* VSU-1000 board */
@@ -1267,8 +1248,7 @@ ROM_START( berzerks )
ROM_LOAD( "berzerk_rc32_5d.rom3.5d", 0x2000, 0x0800, CRC(e23239a9) SHA1(a0505efdee4cb1962243638c641e94983673f70f) ) /* Same as the German set */
ROM_LOAD( "berzerk_rc32_6d.rom4.6d", 0x2800, 0x0800, CRC(959efd86) SHA1(3401f86ed6202e8790cef00c73af29cc282d322e) )
ROM_LOAD( "berzerk_rc32s_5c.rom5.5c", 0x3000, 0x0800, CRC(9ad80e4e) SHA1(f79a86dd3dee5d53c2a60eda5b5181816bd73bc3) )
- /* rom socket ROM6 at 3C is unpopulated */
- ROM_FILL( 0x3800, 0x0800, 0xff )
+ ROM_FILL( 0x3800, 0x0800, 0xff ) /* rom socket ROM6 at 3C is unpopulated */
ROM_REGION( 0x01000, "speech", 0 ) /* voice data */
ROM_LOAD( "berzerk_rvos_1c.1c", 0x0000, 0x0800, CRC(0b51409c) SHA1(75333853a82029f080e3db61441ba6091c1aab55) ) /* VSU-1000 board */
diff --git a/src/mame/drivers/beta.cpp b/src/mame/drivers/beta.cpp
index 89e0f7209d6..024a42d5c69 100644
--- a/src/mame/drivers/beta.cpp
+++ b/src/mame/drivers/beta.cpp
@@ -155,7 +155,7 @@ TIMER_CALLBACK_MEMBER(beta_state::led_refresh)
{
if (m_ls145_p < 6)
{
- output_set_digit_value(m_ls145_p, m_segment);
+ output().set_digit_value(m_ls145_p, m_segment);
}
}
@@ -253,10 +253,10 @@ WRITE8_MEMBER( beta_state::riot_pb_w )
m_speaker->level_w(!BIT(data, 4));
/* address led */
- output_set_led_value(0, BIT(data, 5));
+ output().set_led_value(0, BIT(data, 5));
/* data led */
- output_set_led_value(1, !BIT(data, 5));
+ output().set_led_value(1, !BIT(data, 5));
/* EPROM address shift */
if (!BIT(m_old_data, 5) && BIT(data, 5))
diff --git a/src/mame/drivers/bfcobra.cpp b/src/mame/drivers/bfcobra.cpp
index 9a992e15637..d26eff4d673 100644
--- a/src/mame/drivers/bfcobra.cpp
+++ b/src/mame/drivers/bfcobra.cpp
@@ -245,13 +245,14 @@ public:
m_acia6850_1(*this, "acia6850_1"),
m_acia6850_2(*this, "acia6850_2"),
m_upd7759(*this, "upd"),
- m_palette(*this, "palette")
+ m_palette(*this, "palette"),
+ m_meters(*this, "meters")
{
}
UINT8 m_bank_data[4];
- UINT8 *m_work_ram;
- UINT8 *m_video_ram;
+ std::unique_ptr<UINT8[]> m_work_ram;
+ std::unique_ptr<UINT8[]> m_video_ram;
UINT8 m_h_scroll;
UINT8 m_v_scroll;
UINT8 m_flip_8;
@@ -289,8 +290,6 @@ public:
DECLARE_WRITE8_MEMBER(meter_w);
DECLARE_READ8_MEMBER(latch_r);
DECLARE_WRITE8_MEMBER(latch_w);
- DECLARE_WRITE8_MEMBER(fd_op_w);
- DECLARE_WRITE8_MEMBER(fd_ctrl_w);
DECLARE_READ8_MEMBER(upd_r);
DECLARE_WRITE8_MEMBER(upd_w);
DECLARE_WRITE_LINE_MEMBER(z80_acia_irq);
@@ -311,8 +310,6 @@ public:
void command_phase(struct fdc_t &fdc, UINT8 data);
inline UINT8* blitter_get_addr(UINT32 addr);
inline void z80_bank(int num, int data);
- UINT8 exec_r_phase(void);
- UINT8 results_phase(void);
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
required_device<acia6850_device> m_acia6850_0;
@@ -320,6 +317,7 @@ public:
required_device<acia6850_device> m_acia6850_2;
required_device<upd7759_device> m_upd7759;
required_device<palette_device> m_palette;
+ required_device<meters_device> m_meters;
};
@@ -1424,7 +1422,7 @@ WRITE8_MEMBER(bfcobra_state::meter_w)
{
if (changed & (1 << i))
{
- MechMtr_update(i, data & (1 << i) );
+ m_meters->update(i, data & (1 << i) );
space.device().execute().set_input_line(M6809_FIRQ_LINE, HOLD_LINE);
}
}
@@ -1615,10 +1613,10 @@ INPUT_PORTS_END
void bfcobra_state::init_ram()
{
/* 768kB work RAM */
- m_work_ram = auto_alloc_array_clear(machine(), UINT8, 0xC0000);
+ m_work_ram = make_unique_clear<UINT8[]>(0xC0000);
/* 128kB video RAM */
- m_video_ram = auto_alloc_array_clear(machine(), UINT8, 0x20000);
+ m_video_ram = make_unique_clear<UINT8[]>(0x20000);
}
@@ -1708,8 +1706,8 @@ DRIVER_INIT_MEMBER(bfcobra_state,bfcobra)
save_item(NAME(m_z80_int));
save_item(NAME(m_z80_inten));
save_item(NAME(m_bank_data));
- save_pointer(NAME(m_work_ram), 0xc0000);
- save_pointer(NAME(m_video_ram), 0x20000);
+ save_pointer(NAME(m_work_ram.get()), 0xc0000);
+ save_pointer(NAME(m_video_ram.get()), 0x20000);
}
/* TODO */
@@ -1770,6 +1768,9 @@ static MACHINE_CONFIG_START( bfcobra, bfcobra_state )
MCFG_DEVICE_ADD("acia_clock", CLOCK, 31250*16) // What are the correct ACIA clocks ?
MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(bfcobra_state, write_acia_clock))
+
+ MCFG_DEVICE_ADD("meters", METERS, 0)
+ MCFG_METERS_NUMBER(8)
MACHINE_CONFIG_END
/***************************************************************************
diff --git a/src/mame/drivers/bfm_sc1.cpp b/src/mame/drivers/bfm_sc1.cpp
index b87fda1b128..49a4a89f6e7 100644
--- a/src/mame/drivers/bfm_sc1.cpp
+++ b/src/mame/drivers/bfm_sc1.cpp
@@ -108,7 +108,6 @@ class bfm_sc1_state : public driver_device
public:
bfm_sc1_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
- m_vfd0(*this, "vfd0"),
m_maincpu(*this, "maincpu"),
m_reel0(*this, "reel0"),
m_reel1(*this, "reel1"),
@@ -116,9 +115,9 @@ public:
m_reel3(*this, "reel3"),
m_reel4(*this, "reel4"),
m_reel5(*this, "reel5"),
- m_upd7759(*this, "upd") { }
-
- optional_device<bfm_bd1_t> m_vfd0;
+ m_upd7759(*this, "upd"),
+ m_vfd0(*this, "vfd0"),
+ m_meters(*this, "meters") { }
int m_mmtr_latch;
int m_triac_latch;
@@ -175,7 +174,6 @@ public:
DECLARE_WRITE8_MEMBER(triac_w);
DECLARE_READ8_MEMBER(triac_r);
DECLARE_READ8_MEMBER(nec_r);
- DECLARE_WRITE8_MEMBER(nec_reset_w);
DECLARE_WRITE8_MEMBER(nec_latch_w);
void save_state();
@@ -191,7 +189,6 @@ public:
INTERRUPT_GEN_MEMBER(timer_irq);
void sc1_common_init(int reels, int decrypt, int defaultbank);
void Scorpion1_SetSwitchState(int strobe, int data, int state);
- int Scorpion1_GetSwitchState(int strobe, int data);
int sc1_find_project_string( );
required_device<cpu_device> m_maincpu;
required_device<stepper_device> m_reel0;
@@ -201,6 +198,8 @@ public:
required_device<stepper_device> m_reel4;
required_device<stepper_device> m_reel5;
optional_device<upd7759_device> m_upd7759;
+ optional_device<bfm_bd1_t> m_vfd0;
+ required_device<meters_device> m_meters;
};
#define VFD_RESET 0x20
@@ -298,8 +297,8 @@ WRITE8_MEMBER(bfm_sc1_state::reel12_w)
m_reel0->update((data>>4)&0x0f);
m_reel1->update( data &0x0f);
}
- awp_draw_reel("reel1", m_reel0);
- awp_draw_reel("reel2", m_reel1);
+ awp_draw_reel(machine(),"reel1", m_reel0);
+ awp_draw_reel(machine(),"reel2", m_reel1);
}
///////////////////////////////////////////////////////////////////////////
@@ -315,8 +314,8 @@ WRITE8_MEMBER(bfm_sc1_state::reel34_w)
m_reel2->update((data>>4)&0x0f);
m_reel3->update( data &0x0f);
}
- awp_draw_reel("reel3", m_reel2);
- awp_draw_reel("reel4", m_reel3);
+ awp_draw_reel(machine(),"reel3", m_reel2);
+ awp_draw_reel(machine(),"reel4", m_reel3);
}
///////////////////////////////////////////////////////////////////////////
@@ -326,8 +325,8 @@ WRITE8_MEMBER(bfm_sc1_state::reel56_w)
m_reel4->update((data>>4)&0x0f);
m_reel5->update( data &0x0f);
- awp_draw_reel("reel5", m_reel4);
- awp_draw_reel("reel6", m_reel5);
+ awp_draw_reel(machine(),"reel5", m_reel4);
+ awp_draw_reel(machine(),"reel6", m_reel5);
}
///////////////////////////////////////////////////////////////////////////
@@ -351,7 +350,7 @@ WRITE8_MEMBER(bfm_sc1_state::mmtr_w)
{
if ( changed & (1 << i) )
{
- MechMtr_update(i, data & (1 << i) );
+ m_meters->update(i, data & (1 << i) );
m_maincpu->set_input_line(M6809_FIRQ_LINE, HOLD_LINE);
}
}
@@ -460,8 +459,8 @@ WRITE8_MEMBER(bfm_sc1_state::mux1latch_w)
for ( i = 0; i < 8; i++ )
{
- output_set_lamp_value(BFM_strcnv[offset ], (m_mux1_datalo & pattern?1:0) );
- output_set_lamp_value(BFM_strcnv[offset+8], (m_mux1_datahi & pattern?1:0) );
+ output().set_lamp_value(BFM_strcnv[offset ], (m_mux1_datalo & pattern?1:0) );
+ output().set_lamp_value(BFM_strcnv[offset+8], (m_mux1_datahi & pattern?1:0) );
pattern<<=1;
offset++;
}
@@ -533,8 +532,8 @@ WRITE8_MEMBER(bfm_sc1_state::mux2latch_w)
for ( i = 0; i < 8; i++ )
{
- output_set_lamp_value(BFM_strcnv[offset ], (m_mux2_datalo & pattern?1:0) );
- output_set_lamp_value(BFM_strcnv[offset+8], (m_mux2_datahi & pattern?1:0) );
+ output().set_lamp_value(BFM_strcnv[offset ], (m_mux2_datalo & pattern?1:0) );
+ output().set_lamp_value(BFM_strcnv[offset+8], (m_mux2_datahi & pattern?1:0) );
pattern<<=1;
offset++;
}
@@ -1090,6 +1089,9 @@ static MACHINE_CONFIG_START( scorpion1, bfm_sc1_state )
MCFG_STEPPER_OPTIC_CALLBACK(WRITELINE(bfm_sc1_state, reel4_optic_cb))
MCFG_STARPOINT_48STEP_ADD("reel5")
MCFG_STEPPER_OPTIC_CALLBACK(WRITELINE(bfm_sc1_state, reel5_optic_cb))
+
+ MCFG_DEVICE_ADD("meters", METERS, 0)
+ MCFG_METERS_NUMBER(8)
MACHINE_CONFIG_END
/////////////////////////////////////////////////////////////////////////////////////
@@ -1219,7 +1221,6 @@ int bfm_sc1_state::sc1_find_project_string( )
DRIVER_INIT_MEMBER(bfm_sc1_state,toppoker)
{
sc1_common_init(3,1, 3);
- MechMtr_config(machine(),8);
sc1_find_project_string();
save_state();
}
@@ -1227,7 +1228,6 @@ DRIVER_INIT_MEMBER(bfm_sc1_state,toppoker)
DRIVER_INIT_MEMBER(bfm_sc1_state,lotse)
{
sc1_common_init(6,1, 3);
- MechMtr_config(machine(),8);
sc1_find_project_string();
save_state();
}
@@ -1235,7 +1235,6 @@ DRIVER_INIT_MEMBER(bfm_sc1_state,lotse)
DRIVER_INIT_MEMBER(bfm_sc1_state,lotse_bank0)
{
sc1_common_init(6,1, 0);
- MechMtr_config(machine(),8);
sc1_find_project_string();
save_state();
}
@@ -1244,7 +1243,6 @@ DRIVER_INIT_MEMBER(bfm_sc1_state,lotse_bank0)
DRIVER_INIT_MEMBER(bfm_sc1_state,nocrypt)
{
sc1_common_init(6,0, 3);
- MechMtr_config(machine(),8);
sc1_find_project_string();
save_state();
}
@@ -1252,7 +1250,6 @@ DRIVER_INIT_MEMBER(bfm_sc1_state,nocrypt)
DRIVER_INIT_MEMBER(bfm_sc1_state,nocrypt_bank0)
{
sc1_common_init(6,0, 0);
- MechMtr_config(machine(),8);
sc1_find_project_string();
save_state();
}
@@ -1263,7 +1260,6 @@ DRIVER_INIT_MEMBER(bfm_sc1_state,nocrypt_bank0)
DRIVER_INIT_MEMBER(bfm_sc1_state,rou029)
{
sc1_common_init(6,0, 3);
- MechMtr_config(machine(),8);
sc1_find_project_string();
save_state();
}
@@ -1273,7 +1269,6 @@ DRIVER_INIT_MEMBER(bfm_sc1_state,rou029)
DRIVER_INIT_MEMBER(bfm_sc1_state,clatt)
{
sc1_common_init(6,1, 3);
- MechMtr_config(machine(),8);
Scorpion1_SetSwitchState(3,2,1);
Scorpion1_SetSwitchState(3,3,1);
diff --git a/src/mame/drivers/bfm_sc2.cpp b/src/mame/drivers/bfm_sc2.cpp
index 6ceb2a192bf..38045b108ec 100644
--- a/src/mame/drivers/bfm_sc2.cpp
+++ b/src/mame/drivers/bfm_sc2.cpp
@@ -191,7 +191,8 @@ public:
m_upd7759(*this, "upd"),
m_vfd0(*this, "vfd0"),
m_vfd1(*this, "vfd1"),
- m_dm01(*this, "dm01") { }
+ m_dm01(*this, "dm01"),
+ m_meters(*this, "meters") { }
required_device<cpu_device> m_maincpu;
optional_device<stepper_device> m_reel0;
@@ -204,6 +205,7 @@ public:
optional_device<bfm_bd1_t> m_vfd0;
optional_device<bfm_bd1_t> m_vfd1;
optional_device<bfmdm01_device> m_dm01;
+ optional_device<meters_device> m_meters; // scorpion2_vid doesn't use this (scorpion2_vidm does)
int m_sc2gui_update_mmtr; //not used?
UINT8 *m_nvram;
@@ -298,8 +300,6 @@ public:
DECLARE_WRITE8_MEMBER(vfd2_data_w);
DECLARE_WRITE8_MEMBER(e2ram_w);
DECLARE_READ8_MEMBER(direct_input_r);
- DECLARE_READ8_MEMBER(sc3_expansion_r);
- DECLARE_WRITE8_MEMBER(sc3_expansion_w);
int recdata(int changed, int data);
DECLARE_WRITE8_MEMBER(nec_reset_w);
DECLARE_WRITE8_MEMBER(nec_latch_w);
@@ -554,8 +554,8 @@ WRITE8_MEMBER(bfm_sc2_state::reel12_w)
m_reel0->update( data &0x0f);
m_reel1->update((data>>4)&0x0f);
- awp_draw_reel("reel1", m_reel0);
- awp_draw_reel("reel2", m_reel1);
+ awp_draw_reel(machine(),"reel1", m_reel0);
+ awp_draw_reel(machine(),"reel2", m_reel1);
}
WRITE8_MEMBER(bfm_sc2_state::reel34_w)
@@ -565,8 +565,8 @@ WRITE8_MEMBER(bfm_sc2_state::reel34_w)
m_reel2->update( data &0x0f);
m_reel3->update((data>>4)&0x0f);
- awp_draw_reel("reel3", m_reel2);
- awp_draw_reel("reel4", m_reel3);
+ awp_draw_reel(machine(),"reel3", m_reel2);
+ awp_draw_reel(machine(),"reel4", m_reel3);
}
///////////////////////////////////////////////////////////////////////////
@@ -578,8 +578,8 @@ WRITE8_MEMBER(bfm_sc2_state::reel56_w)
m_reel4->update( data &0x0f);
m_reel5->update((data>>4)&0x0f);
- awp_draw_reel("reel5", m_reel4);
- awp_draw_reel("reel6", m_reel5);
+ awp_draw_reel(machine(),"reel5", m_reel4);
+ awp_draw_reel(machine(),"reel6", m_reel5);
}
@@ -595,13 +595,17 @@ WRITE8_MEMBER(bfm_sc2_state::mmtr_w)
m_mmtr_latch = data;
- for (i = 0; i<8; i++)
+ if (m_meters != nullptr)
{
- if ( changed & (1 << i) )
+ for (i = 0; i<8; i++)
{
- MechMtr_update(i, data & (1 << i) );
+ if ( changed & (1 << i) )
+ {
+ m_meters->update(i, data & (1 << i) );
+ }
}
}
+
if ( data & 0x1F ) m_maincpu->set_input_line(M6809_FIRQ_LINE, ASSERT_LINE );
}
@@ -613,7 +617,7 @@ WRITE8_MEMBER(bfm_sc2_state::mux_output_w)
int off = offset<<3;
for (i=0; i<8; i++)
- output_set_lamp_value(off+i, ((data & (1 << i)) != 0));
+ output().set_lamp_value(off+i, ((data & (1 << i)) != 0));
}
@@ -841,7 +845,7 @@ WRITE8_MEMBER(bfm_sc2_state::coininhib_w)
{
if ( changed & p )
{ // this inhibit line has changed
- coin_lockout_w(machine(), i, (~data & p) ); // update lockouts
+ machine().bookkeeping().coin_lockout_w(i, (~data & p) ); // update lockouts
changed &= ~p;
}
@@ -2129,6 +2133,24 @@ static INPUT_PORTS_START( pokio )
PORT_DIPSETTING( 0x18, "3" )
INPUT_PORTS_END
+///////////////////////////////////////////////////////////////////////////
+// machine config fragments for different meters numbers //////////////////
+///////////////////////////////////////////////////////////////////////////
+
+MACHINE_CONFIG_FRAGMENT( _3meters )
+ MCFG_DEVICE_ADD("meters", METERS, 0)
+ MCFG_METERS_NUMBER(3)
+MACHINE_CONFIG_END
+
+MACHINE_CONFIG_FRAGMENT( _5meters )
+ MCFG_DEVICE_ADD("meters", METERS, 0)
+ MCFG_METERS_NUMBER(5)
+MACHINE_CONFIG_END
+
+MACHINE_CONFIG_FRAGMENT( _8meters )
+ MCFG_DEVICE_ADD("meters", METERS, 0)
+ MCFG_METERS_NUMBER(8)
+MACHINE_CONFIG_END
///////////////////////////////////////////////////////////////////////////
// machine driver for scorpion2 board + adder2 expansion //////////////////
@@ -2171,6 +2193,11 @@ static MACHINE_CONFIG_START( scorpion2_vid, bfm_sc2_state )
MACHINE_CONFIG_END
+/* machine driver for scorpion2_vid board with meters (i.e. quintoon uk). Are we really sure the other games don't?*/
+static MACHINE_CONFIG_DERIVED( scorpion2_vidm, scorpion2_vid )
+ MCFG_FRAGMENT_ADD(_8meters)
+MACHINE_CONFIG_END
+
int bfm_sc2_state::sc2_find_project_string( )
@@ -2257,11 +2284,10 @@ void bfm_sc2_state::sc2_common_init(int decrypt)
void bfm_sc2_state::adder2_common_init()
{
- UINT8 *pal;
-
- pal = memregion("proms")->base();
- if ( pal )
+ if (memregion("proms") != nullptr)
{
+ UINT8 *pal;
+ pal = memregion("proms")->base();
memcpy(m_key, pal, 8);
}
}
@@ -2271,7 +2297,6 @@ void bfm_sc2_state::adder2_common_init()
DRIVER_INIT_MEMBER(bfm_sc2_state,quintoon)
{
sc2_common_init( 1);
- MechMtr_config(machine(),8); // setup mech meters
m_has_hopper = 0;
@@ -3631,13 +3656,22 @@ static MACHINE_CONFIG_START( scorpion2, bfm_sc2_state )
MCFG_STEPPER_OPTIC_CALLBACK(WRITELINE(bfm_sc2_state, reel4_optic_cb))
MCFG_STARPOINT_48STEP_ADD("reel5")
MCFG_STEPPER_OPTIC_CALLBACK(WRITELINE(bfm_sc2_state, reel5_optic_cb))
+
+ MCFG_FRAGMENT_ADD(_8meters)
MACHINE_CONFIG_END
+static MACHINE_CONFIG_DERIVED( scorpion2_3m, scorpion2 )
+ MCFG_DEVICE_REMOVE("meters")
+ MCFG_FRAGMENT_ADD(_3meters)
+MACHINE_CONFIG_END
/* machine driver for scorpion3 board */
static MACHINE_CONFIG_DERIVED( scorpion3, scorpion2 )
MCFG_CPU_MODIFY("maincpu")
MCFG_CPU_PROGRAM_MAP(memmap_no_vid)
+
+ MCFG_DEVICE_REMOVE("meters")
+ MCFG_FRAGMENT_ADD(_5meters)
MACHINE_CONFIG_END
@@ -3681,6 +3715,18 @@ static MACHINE_CONFIG_START( scorpion2_dm01, bfm_sc2_state )
MCFG_STEPPER_OPTIC_CALLBACK(WRITELINE(bfm_sc2_state, reel4_optic_cb))
MCFG_STARPOINT_48STEP_ADD("reel5")
MCFG_STEPPER_OPTIC_CALLBACK(WRITELINE(bfm_sc2_state, reel5_optic_cb))
+
+ MCFG_FRAGMENT_ADD( _8meters)
+MACHINE_CONFIG_END
+
+static MACHINE_CONFIG_DERIVED( scorpion2_dm01_3m, scorpion2_dm01 )
+ MCFG_DEVICE_REMOVE("meters")
+ MCFG_FRAGMENT_ADD( _3meters)
+MACHINE_CONFIG_END
+
+static MACHINE_CONFIG_DERIVED( scorpion2_dm01_5m, scorpion2_dm01 )
+ MCFG_DEVICE_REMOVE("meters")
+ MCFG_FRAGMENT_ADD( _5meters)
MACHINE_CONFIG_END
void bfm_sc2_state::sc2awp_common_init(int reels, int decrypt)
@@ -3704,7 +3750,6 @@ void bfm_sc2_state::sc2awpdmd_common_init(int reels, int decrypt)
DRIVER_INIT_MEMBER(bfm_sc2_state,bbrkfst)
{
sc2awp_common_init(5, 1);
- MechMtr_config(machine(),8);
m_has_hopper = 0;
@@ -3723,8 +3768,6 @@ DRIVER_INIT_MEMBER(bfm_sc2_state,bbrkfst)
DRIVER_INIT_MEMBER(bfm_sc2_state,drwho_common)
{
- MechMtr_config(machine(),8);
-
m_has_hopper = 0;
Scorpion2_SetSwitchState(4,0, 0); /* GBP1 Low Level Switch */
@@ -3755,7 +3798,6 @@ DRIVER_INIT_MEMBER(bfm_sc2_state,drwhon)
DRIVER_INIT_MEMBER(bfm_sc2_state,focus)
{
sc2awp_common_init(6, 1);
- MechMtr_config(machine(),5);
sc2_find_project_string();
}
@@ -3763,8 +3805,6 @@ DRIVER_INIT_MEMBER(bfm_sc2_state,cpeno1)
{
sc2awpdmd_common_init(6, 1);
- MechMtr_config(machine(),5);
-
Scorpion2_SetSwitchState(3,3,1); /* 5p play */
Scorpion2_SetSwitchState(3,4,1); /* 20p play */
@@ -3818,7 +3858,6 @@ DRIVER_INIT_MEMBER(bfm_sc2_state,ofah)
Scorpion2_SetSwitchState(6,2,0);
Scorpion2_SetSwitchState(6,3,1);
- MechMtr_config(machine(),3);
sc2_find_project_string();
}
@@ -3836,14 +3875,12 @@ DRIVER_INIT_MEMBER(bfm_sc2_state,prom)
Scorpion2_SetSwitchState(6,2,0);
Scorpion2_SetSwitchState(6,3,1);
- MechMtr_config(machine(),3);
sc2_find_project_string();
}
DRIVER_INIT_MEMBER(bfm_sc2_state,bfmcgslm)
{
sc2awp_common_init(6, 1);
- MechMtr_config(machine(),8);
m_has_hopper = 0;
sc2_find_project_string();
}
@@ -3852,7 +3889,6 @@ DRIVER_INIT_MEMBER(bfm_sc2_state,luvjub)
{
sc2awpdmd_common_init(6, 1);
- MechMtr_config(machine(),8);
m_has_hopper = 0;
Scorpion2_SetSwitchState(3,0,1);
@@ -7477,9 +7513,9 @@ ROM_END
#define GAME_FLAGS MACHINE_SUPPORTS_SAVE|MACHINE_REQUIRES_ARTWORK|MACHINE_NOT_WORKING|MACHINE_MECHANICAL
-GAMEL( 1993, quintoon, 0, scorpion2_vid, quintoon, bfm_sc2_state, quintoon, 0, "BFM", "Quintoon (UK, Game Card 95-750-206)", MACHINE_SUPPORTS_SAVE|MACHINE_IMPERFECT_SOUND,layout_quintoon ) //Current samples need verification
-GAMEL( 1993, quintond, quintoon, scorpion2_vid, quintoon, bfm_sc2_state, quintoon, 0, "BFM", "Quintoon (UK, Game Card 95-751-206, Datapak)",MACHINE_SUPPORTS_SAVE|MACHINE_IMPERFECT_SOUND|MACHINE_NOT_WORKING,layout_quintoon ) //Current samples need verification
-GAMEL( 1993, quintono, quintoon, scorpion2_vid, quintoon, bfm_sc2_state, quintoon, 0, "BFM", "Quintoon (UK, Game Card 95-750-203)", MACHINE_SUPPORTS_SAVE|MACHINE_IMPERFECT_SOUND,layout_quintoon ) //Current samples need verification
+GAMEL( 1993, quintoon, 0, scorpion2_vidm, quintoon, bfm_sc2_state, quintoon, 0, "BFM", "Quintoon (UK, Game Card 95-750-206)", MACHINE_SUPPORTS_SAVE|MACHINE_IMPERFECT_SOUND,layout_quintoon ) //Current samples need verification
+GAMEL( 1993, quintond, quintoon, scorpion2_vidm, quintoon, bfm_sc2_state, quintoon, 0, "BFM", "Quintoon (UK, Game Card 95-751-206, Datapak)",MACHINE_SUPPORTS_SAVE|MACHINE_IMPERFECT_SOUND|MACHINE_NOT_WORKING,layout_quintoon ) //Current samples need verification
+GAMEL( 1993, quintono, quintoon, scorpion2_vidm, quintoon, bfm_sc2_state, quintoon, 0, "BFM", "Quintoon (UK, Game Card 95-750-203)", MACHINE_SUPPORTS_SAVE|MACHINE_IMPERFECT_SOUND,layout_quintoon ) //Current samples need verification
GAMEL( 1993, qntoond, 0, scorpion2_vid, qntoond, bfm_sc2_state, adder_dutch,0, "BFM/ELAM", "Quintoon (Dutch, Game Card 95-750-243)", MACHINE_SUPPORTS_SAVE,layout_quintoon )
GAMEL( 1993, qntoondo, qntoond, scorpion2_vid, qntoond, bfm_sc2_state, adder_dutch,0, "BFM/ELAM", "Quintoon (Dutch, Game Card 95-750-136)", MACHINE_SUPPORTS_SAVE,layout_quintoon )
@@ -7703,7 +7739,7 @@ GAME( 199?, sc2copcl , 0 , scorpion2 , drwho , bfm_sc2_st
GAME( 199?, sc2copclp , sc2copcl , scorpion2 , drwho , bfm_sc2_state, drwho , 0, "BFM", "Cops 'n' Robbers Club (Bellfruit) (set 9, UK, 250GBP Jackpot, Protocol) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-751-859
// PROJECT NUMBER PR6231 CLUB COPS AND ROBBERS 20P/#250 - 2-SEP-1996 17:26:44
GAME( 199?, sc2copcl2 , sc2copcl , scorpion2 , drwho , bfm_sc2_state, drwho , 0, "BFM", "Cops 'n' Robbers Club (Bellfruit) (set 10, UK) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-858
-GAME( 199?, sc2copcl12 , sc2copcl , scorpion2 , drwho , bfm_sc2_state, prom , 0, "BFM", "Cops 'n' Robbers Club (Bellfruit) (set 10, UK, Protocol) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-751-858
+GAME( 199?, sc2copcl12 , sc2copcl , scorpion2_3m , drwho , bfm_sc2_state, prom , 0, "BFM", "Cops 'n' Robbers Club (Bellfruit) (set 10, UK, Protocol) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-751-858
// PROJECT PR6231 CLUB COPS AND ROBBERS NPO 63% SEALINK VERSION - 5-JAN-1998 11:53:49
GAME( 199?, sc2copcl5 , sc2copcl , scorpion2 , drwho , bfm_sc2_state, drwho , 0, "BFM", "Cops 'n' Robbers Club (Bellfruit) (set 11, UK) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-752-015
GAME( 199?, sc2copcl11p , sc2copcl , scorpion2 , drwho , bfm_sc2_state, drwho , 0, "BFM", "Cops 'n' Robbers Club (Bellfruit) (set 11, UK, Protocol) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-753-015
@@ -8366,20 +8402,20 @@ GAME( 1996, sc2luvv1p , sc2luvv , scorpion2_dm01 , luvjub , bfm_sc2_st
********************************************************************************************************************************************************************************************************************/
// PROJECT NUMBER PR6331 PUBLIC ENEMY NO.1 - 26-JUL-1994 09:24:19
-GAME( 1996, sc2cpe3 , sc2cpe , scorpion2_dm01 , cpeno1 , bfm_sc2_state, cpeno1 , 0, "BFM", "Club Public Enemy No.1 (set 1, UK) (Scorpion 2/3)", MACHINE_NOT_WORKING|MACHINE_REQUIRES_ARTWORK|MACHINE_MECHANICAL) // GAME No 95-750-257
-GAME( 1996, sc2cpe3p , sc2cpe , scorpion2_dm01 , cpeno1 , bfm_sc2_state, cpeno1 , 0, "BFM", "Club Public Enemy No.1 (set 1, UK, Protocol) (Scorpion 2/3)", MACHINE_NOT_WORKING|MACHINE_REQUIRES_ARTWORK|MACHINE_MECHANICAL) // GAME No 95-751-257
+GAME( 1996, sc2cpe3 , sc2cpe , scorpion2_dm01_5m , cpeno1 , bfm_sc2_state, cpeno1 , 0, "BFM", "Club Public Enemy No.1 (set 1, UK) (Scorpion 2/3)", MACHINE_NOT_WORKING|MACHINE_REQUIRES_ARTWORK|MACHINE_MECHANICAL) // GAME No 95-750-257
+GAME( 1996, sc2cpe3p , sc2cpe , scorpion2_dm01_5m , cpeno1 , bfm_sc2_state, cpeno1 , 0, "BFM", "Club Public Enemy No.1 (set 1, UK, Protocol) (Scorpion 2/3)", MACHINE_NOT_WORKING|MACHINE_REQUIRES_ARTWORK|MACHINE_MECHANICAL) // GAME No 95-751-257
// PROJECT NUMBER PR6331 PUBLIC ENEMY NO.1 FIXED 65% - 10-AUG-1994 11:26:30
-GAME( 1996, sc2cpe4 , sc2cpe , scorpion2_dm01 , cpeno1 , bfm_sc2_state, cpeno1 , 0, "BFM", "Club Public Enemy No.1 (set 2, UK) (Scorpion 2/3)", MACHINE_NOT_WORKING|MACHINE_REQUIRES_ARTWORK|MACHINE_MECHANICAL) // GAME No 95-750-273
-GAME( 1996, sc2cpe4p , sc2cpe , scorpion2_dm01 , cpeno1 , bfm_sc2_state, cpeno1 , 0, "BFM", "Club Public Enemy No.1 (set 2, UK, Protocol) (Scorpion 2/3)", MACHINE_NOT_WORKING|MACHINE_REQUIRES_ARTWORK|MACHINE_MECHANICAL) // GAME No 95-751-273
+GAME( 1996, sc2cpe4 , sc2cpe , scorpion2_dm01_5m , cpeno1 , bfm_sc2_state, cpeno1 , 0, "BFM", "Club Public Enemy No.1 (set 2, UK) (Scorpion 2/3)", MACHINE_NOT_WORKING|MACHINE_REQUIRES_ARTWORK|MACHINE_MECHANICAL) // GAME No 95-750-273
+GAME( 1996, sc2cpe4p , sc2cpe , scorpion2_dm01_5m , cpeno1 , bfm_sc2_state, cpeno1 , 0, "BFM", "Club Public Enemy No.1 (set 2, UK, Protocol) (Scorpion 2/3)", MACHINE_NOT_WORKING|MACHINE_REQUIRES_ARTWORK|MACHINE_MECHANICAL) // GAME No 95-751-273
// PROJECT NUMBER PR6574 PUBLIC ENEMY NO.1 S+P 25P/#250 STENA SEALINK - 3-JAN-1996 12:17:33
-GAME( 1996, sc2cpe2 , sc2cpe , scorpion2_dm01 , cpeno1 , bfm_sc2_state, cpeno1 , 0, "BFM", "Club Public Enemy No.1 (set 3, UK) (Scorpion 2/3)", MACHINE_NOT_WORKING|MACHINE_REQUIRES_ARTWORK|MACHINE_MECHANICAL) // GAME No 95-750-597
-GAME( 1996, sc2cpe2p , sc2cpe , scorpion2_dm01 , cpeno1 , bfm_sc2_state, cpeno1 , 0, "BFM", "Club Public Enemy No.1 (set 3, UK, Protocol) (Scorpion 2/3)", MACHINE_NOT_WORKING|MACHINE_REQUIRES_ARTWORK|MACHINE_MECHANICAL) // GAME No 95-751-597
+GAME( 1996, sc2cpe2 , sc2cpe , scorpion2_dm01_5m , cpeno1 , bfm_sc2_state, cpeno1 , 0, "BFM", "Club Public Enemy No.1 (set 3, UK) (Scorpion 2/3)", MACHINE_NOT_WORKING|MACHINE_REQUIRES_ARTWORK|MACHINE_MECHANICAL) // GAME No 95-750-597
+GAME( 1996, sc2cpe2p , sc2cpe , scorpion2_dm01_5m , cpeno1 , bfm_sc2_state, cpeno1 , 0, "BFM", "Club Public Enemy No.1 (set 3, UK, Protocol) (Scorpion 2/3)", MACHINE_NOT_WORKING|MACHINE_REQUIRES_ARTWORK|MACHINE_MECHANICAL) // GAME No 95-751-597
// PROJECT NUMBER PR6574 PUBLIC ENEMY NO.1 S+P 25P/#250 FIXED 65% - 3-JAN-1996 12:19:01
-GAME( 1996, sc2cpe1 , sc2cpe , scorpion2_dm01 , cpeno1 , bfm_sc2_state, cpeno1 , 0, "BFM", "Club Public Enemy No.1 (set 4, UK) (Scorpion 2/3)", MACHINE_NOT_WORKING|MACHINE_REQUIRES_ARTWORK|MACHINE_MECHANICAL) // GAME No 95-750-598
-GAME( 1996, sc2cpe1p , sc2cpe , scorpion2_dm01 , cpeno1 , bfm_sc2_state, cpeno1 , 0, "BFM", "Club Public Enemy No.1 (set 4, UK, Protocol) (Scorpion 2/3)", MACHINE_NOT_WORKING|MACHINE_REQUIRES_ARTWORK|MACHINE_MECHANICAL) // GAME No 95-751-598
+GAME( 1996, sc2cpe1 , sc2cpe , scorpion2_dm01_5m , cpeno1 , bfm_sc2_state, cpeno1 , 0, "BFM", "Club Public Enemy No.1 (set 4, UK) (Scorpion 2/3)", MACHINE_NOT_WORKING|MACHINE_REQUIRES_ARTWORK|MACHINE_MECHANICAL) // GAME No 95-750-598
+GAME( 1996, sc2cpe1p , sc2cpe , scorpion2_dm01_5m , cpeno1 , bfm_sc2_state, cpeno1 , 0, "BFM", "Club Public Enemy No.1 (set 4, UK, Protocol) (Scorpion 2/3)", MACHINE_NOT_WORKING|MACHINE_REQUIRES_ARTWORK|MACHINE_MECHANICAL) // GAME No 95-751-598
// PROJECT NUMBER PR6574 PUBLIC ENEMY NO.1 S+P 25P/#250 - 20-AUG-1996 10:05:21
-GAME( 1996, sc2cpe , 0 , scorpion2_dm01 , cpeno1 , bfm_sc2_state, cpeno1 , 0, "BFM", "Club Public Enemy No.1 (set 5, UK) (Scorpion 2/3)", MACHINE_NOT_WORKING|MACHINE_REQUIRES_ARTWORK|MACHINE_MECHANICAL) // GAME No 95-750-846
-GAME( 1996, sc2cpep , sc2cpe , scorpion2_dm01 , cpeno1 , bfm_sc2_state, cpeno1 , 0, "BFM", "Club Public Enemy No.1 (set 5, UK, Protocol) (Scorpion 2/3)", MACHINE_NOT_WORKING|MACHINE_REQUIRES_ARTWORK|MACHINE_MECHANICAL) // GAME No 95-751-846
+GAME( 1996, sc2cpe , 0 , scorpion2_dm01_5m , cpeno1 , bfm_sc2_state, cpeno1 , 0, "BFM", "Club Public Enemy No.1 (set 5, UK) (Scorpion 2/3)", MACHINE_NOT_WORKING|MACHINE_REQUIRES_ARTWORK|MACHINE_MECHANICAL) // GAME No 95-750-846
+GAME( 1996, sc2cpep , sc2cpe , scorpion2_dm01_5m , cpeno1 , bfm_sc2_state, cpeno1 , 0, "BFM", "Club Public Enemy No.1 (set 5, UK, Protocol) (Scorpion 2/3)", MACHINE_NOT_WORKING|MACHINE_REQUIRES_ARTWORK|MACHINE_MECHANICAL) // GAME No 95-751-846
/********************************************************************************************************************************************************************************************************************
Cops 'n' Robbers
@@ -8387,19 +8423,19 @@ GAME( 1996, sc2cpep , sc2cpe , scorpion2_dm01 , cpeno1 , bfm_sc2_st
********************************************************************************************************************************************************************************************************************/
// PROJECT NUMBER 6012 COPS & ROBBERS #3/#6 - 29-DEC-1992 21:26:28
-GAME( 199?, sc2cops5 , sc2cops , scorpion2_dm01 , drwho , bfm_sc2_state, ofah , 0, "BFM", "Cops 'n' Robbers (Bellfruit) (set 1) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-044
+GAME( 199?, sc2cops5 , sc2cops , scorpion2_dm01_3m , drwho , bfm_sc2_state, ofah , 0, "BFM", "Cops 'n' Robbers (Bellfruit) (set 1) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-044
// PROJECT NUMBER 6012 COPS AND ROBBERS S+P 10P - 7-JUL-1993 10:17:18
-GAME( 199?, sc2cops2 , sc2cops , scorpion2_dm01 , drwho , bfm_sc2_state, ofah , 0, "BFM", "Cops 'n' Robbers (Bellfruit) (set 2) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-110
+GAME( 199?, sc2cops2 , sc2cops , scorpion2_dm01_3m , drwho , bfm_sc2_state, ofah , 0, "BFM", "Cops 'n' Robbers (Bellfruit) (set 2) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-110
// PROJECT NUMBER 6589 (6012) COPS & ROBBERS (SINGLE SITE 5P/10P/20P) - 4-DEC-1995 10:52:08
-GAME( 199?, sc2cops3 , sc2cops , scorpion2_dm01 , drwho , bfm_sc2_state, ofah , 0, "BFM", "Cops 'n' Robbers (Bellfruit) (set 3) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-577
-GAME( 199?, sc2cops3p , sc2cops , scorpion2_dm01 , drwho , bfm_sc2_state, ofah , 0, "BFM", "Cops 'n' Robbers (Bellfruit) (set 3, Protocol) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-751-577
+GAME( 199?, sc2cops3 , sc2cops , scorpion2_dm01_3m , drwho , bfm_sc2_state, ofah , 0, "BFM", "Cops 'n' Robbers (Bellfruit) (set 3) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-577
+GAME( 199?, sc2cops3p , sc2cops , scorpion2_dm01_3m , drwho , bfm_sc2_state, ofah , 0, "BFM", "Cops 'n' Robbers (Bellfruit) (set 3, Protocol) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-751-577
// PROJECT NUMBER 6589 (6012) COPS & ROBBERS (ARCADE 5P/10P/20P) - 4-DEC-1995 10:53:58
-GAME( 199?, sc2copsp , sc2cops , scorpion2_dm01 , drwho , bfm_sc2_state, ofah , 0, "BFM", "Cops 'n' Robbers (Bellfruit) (set 4, Protocol) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-751-578
+GAME( 199?, sc2copsp , sc2cops , scorpion2_dm01_3m , drwho , bfm_sc2_state, ofah , 0, "BFM", "Cops 'n' Robbers (Bellfruit) (set 4, Protocol) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-751-578
// PROJECT NUMBER 6589 (6012) COPS & ROBBERS (IRISH ALL CASH 5P/10P/20P) - 7-MAR-1996 15:07:40
-GAME( 199?, sc2cops4 , sc2cops , scorpion2_dm01 , drwho , bfm_sc2_state, ofah , 0, "BFM", "Cops 'n' Robbers (Bellfruit) (set 5) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-645
+GAME( 199?, sc2cops4 , sc2cops , scorpion2_dm01_3m , drwho , bfm_sc2_state, ofah , 0, "BFM", "Cops 'n' Robbers (Bellfruit) (set 5) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-645
// PROJECT NUMBER 6589 (6012) COPS & ROBBERS (#10 ALL CASH 20P/25P) - 15-MAR-1996 11:52:02
-GAME( 199?, sc2cops , 0 , scorpion2_dm01 , drwho , bfm_sc2_state, ofah , 0, "BFM", "Cops 'n' Robbers (Bellfruit) (set 6) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-652
-GAME( 199?, sc2cops1p , sc2cops , scorpion2_dm01 , drwho , bfm_sc2_state, ofah , 0, "BFM", "Cops 'n' Robbers (Bellfruit) (set 6, Protocol) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-751-652
+GAME( 199?, sc2cops , 0 , scorpion2_dm01_3m , drwho , bfm_sc2_state, ofah , 0, "BFM", "Cops 'n' Robbers (Bellfruit) (set 6) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-652
+GAME( 199?, sc2cops1p , sc2cops , scorpion2_dm01_3m , drwho , bfm_sc2_state, ofah , 0, "BFM", "Cops 'n' Robbers (Bellfruit) (set 6, Protocol) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-751-652
/********************************************************************************************************************************************************************************************************************
@@ -8409,12 +8445,12 @@ GAME( 199?, sc2cops1p , sc2cops , scorpion2_dm01 , drwho , bfm_sc2_st
********************************************************************************************************************************************************************************************************************/
// PROJECT NUMBER 6622 BINGO COPS N ROBBERS #8/#10 ALL CASH - 9-JUL-1996 17:08:15
-GAME( 199?, sc2copsc , sc2cops , scorpion2_dm01 , drwho , bfm_sc2_state, ofah , 0, "BFM", "Casino Cops 'n' Robbers (Bellfruit) (set 1) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-814
-GAME( 199?, sc2copscp , sc2cops , scorpion2_dm01 , drwho , bfm_sc2_state, ofah , 0, "BFM", "Casino Cops 'n' Robbers (Bellfruit) (set 1, Protocol) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-751-814
+GAME( 199?, sc2copsc , sc2cops , scorpion2_dm01_3m , drwho , bfm_sc2_state, ofah , 0, "BFM", "Casino Cops 'n' Robbers (Bellfruit) (set 1) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-814
+GAME( 199?, sc2copscp , sc2cops , scorpion2_dm01_3m , drwho , bfm_sc2_state, ofah , 0, "BFM", "Casino Cops 'n' Robbers (Bellfruit) (set 1, Protocol) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-751-814
// PROJECT NUMBER 6622 BINGO COPS N ROBBERS SWITCHABLE BINGO/ARCADE - 9-JUL-1996 17:12:33
-GAME( 199?, sc2copsc1 , sc2cops , scorpion2_dm01 , drwho , bfm_sc2_state, ofah , 0, "BFM", "Casino Cops 'n' Robbers (Bellfruit) (set 2) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-816
-GAME( 199?, sc2copsc1p , sc2cops , scorpion2_dm01 , drwho , bfm_sc2_state, ofah , 0, "BFM", "Casino Cops 'n' Robbers (Bellfruit) (set 2, Protocol) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-751-816
-GAME( 199?, sc2copsc1pa , sc2cops , scorpion2_dm01 , drwho , bfm_sc2_state, ofah , 0, "BFM", "Casino Cops 'n' Robbers (Bellfruit) (set 2, Protocol) (Scorpion 2/3) (alt matrix rom)", GAME_FLAGS) // GAME No 95-751-816
+GAME( 199?, sc2copsc1 , sc2cops , scorpion2_dm01_3m , drwho , bfm_sc2_state, ofah , 0, "BFM", "Casino Cops 'n' Robbers (Bellfruit) (set 2) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-816
+GAME( 199?, sc2copsc1p , sc2cops , scorpion2_dm01_3m , drwho , bfm_sc2_state, ofah , 0, "BFM", "Casino Cops 'n' Robbers (Bellfruit) (set 2, Protocol) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-751-816
+GAME( 199?, sc2copsc1pa , sc2cops , scorpion2_dm01_3m , drwho , bfm_sc2_state, ofah , 0, "BFM", "Casino Cops 'n' Robbers (Bellfruit) (set 2, Protocol) (Scorpion 2/3) (alt matrix rom)", GAME_FLAGS) // GAME No 95-751-816
/********************************************************************************************************************************************************************************************************************
@@ -8423,25 +8459,25 @@ GAME( 199?, sc2copsc1pa , sc2cops , scorpion2_dm01 , drwho , bfm_sc2_st
********************************************************************************************************************************************************************************************************************/
// PROJECT PR6332 CLUB COPS AND ROBBERS DELUXE - 17-NOV-1995 12:36:04
-GAME( 199?, sc2copdc5 , sc2copdc , scorpion2_dm01 , drwho , bfm_sc2_state, ofah , 0, "BFM", "Cops 'n' Robbers Club Deluxe (Bellfruit) (set 1, UK, 200GBP Jackpot) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-561
-GAME( 199?, sc2copdc5p , sc2copdc , scorpion2_dm01 , drwho , bfm_sc2_state, ofah , 0, "BFM", "Cops 'n' Robbers Club Deluxe (Bellfruit) (set 1, UK, 200GBP Jackpot, Protocol) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-751-561
+GAME( 199?, sc2copdc5 , sc2copdc , scorpion2_dm01_3m , drwho , bfm_sc2_state, ofah , 0, "BFM", "Cops 'n' Robbers Club Deluxe (Bellfruit) (set 1, UK, 200GBP Jackpot) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-561
+GAME( 199?, sc2copdc5p , sc2copdc , scorpion2_dm01_3m , drwho , bfm_sc2_state, ofah , 0, "BFM", "Cops 'n' Robbers Club Deluxe (Bellfruit) (set 1, UK, 200GBP Jackpot, Protocol) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-751-561
// PROJECT PR6588 CLUB COPS AND ROBBERS DELUXE 25P/#250 - 17-NOV-1995 13:18:57
-GAME( 199?, sc2copdc6 , sc2copdc , scorpion2_dm01 , drwho , bfm_sc2_state, ofah , 0, "BFM", "Cops 'n' Robbers Club Deluxe (Bellfruit) (set 2, UK, 250GBP Jackpot) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-562
+GAME( 199?, sc2copdc6 , sc2copdc , scorpion2_dm01_3m , drwho , bfm_sc2_state, ofah , 0, "BFM", "Cops 'n' Robbers Club Deluxe (Bellfruit) (set 2, UK, 250GBP Jackpot) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-562
// PROJECT PR6588 CLUB COPS AND ROBBERS DELUXE 25P/#250 65% - 30-NOV-1995 16:14:25
-GAME( 199?, sc2copdc1 , sc2copdc , scorpion2_dm01 , drwho , bfm_sc2_state, ofah , 0, "BFM", "Cops 'n' Robbers Club Deluxe (Bellfruit) (set 3, UK, 250GBP Jackpot) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-574
-GAME( 199?, sc2copdc1p , sc2copdc , scorpion2_dm01 , drwho , bfm_sc2_state, ofah , 0, "BFM", "Cops 'n' Robbers Club Deluxe (Bellfruit) (set 3, UK, 250GBP Jackpot, Protocol) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-751-574
+GAME( 199?, sc2copdc1 , sc2copdc , scorpion2_dm01_3m , drwho , bfm_sc2_state, ofah , 0, "BFM", "Cops 'n' Robbers Club Deluxe (Bellfruit) (set 3, UK, 250GBP Jackpot) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-574
+GAME( 199?, sc2copdc1p , sc2copdc , scorpion2_dm01_3m , drwho , bfm_sc2_state, ofah , 0, "BFM", "Cops 'n' Robbers Club Deluxe (Bellfruit) (set 3, UK, 250GBP Jackpot, Protocol) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-751-574
// PROJECT NUMBER 6588 CLUB COPS AND ROBBERS DELUXE 20P/#250 - 25-MAR-1996 13:57:23
-GAME( 199?, sc2copdc2 , sc2copdc , scorpion2_dm01 , drwho , bfm_sc2_state, ofah , 0, "BFM", "Cops 'n' Robbers Club Deluxe (Bellfruit) (set 4, UK, 250GBP Jackpot) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-658
-GAME( 199?, sc2copdc2p , sc2copdc , scorpion2_dm01 , drwho , bfm_sc2_state, ofah , 0, "BFM", "Cops 'n' Robbers Club Deluxe (Bellfruit) (set 4, UK, 250GBP Jackpot, Protocol) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-751-658
+GAME( 199?, sc2copdc2 , sc2copdc , scorpion2_dm01_3m , drwho , bfm_sc2_state, ofah , 0, "BFM", "Cops 'n' Robbers Club Deluxe (Bellfruit) (set 4, UK, 250GBP Jackpot) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-658
+GAME( 199?, sc2copdc2p , sc2copdc , scorpion2_dm01_3m , drwho , bfm_sc2_state, ofah , 0, "BFM", "Cops 'n' Robbers Club Deluxe (Bellfruit) (set 4, UK, 250GBP Jackpot, Protocol) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-751-658
// PROJECT PR6588 CLUB COPS AND ROBBERS DELUXE 25P/#250 - 13-AUG-1996 14:01:25
-GAME( 199?, sc2copdc3 , sc2copdc , scorpion2_dm01 , drwho , bfm_sc2_state, ofah , 0, "BFM", "Cops 'n' Robbers Club Deluxe (Bellfruit) (set 5, UK, 250GBP Jackpot) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-842
-GAME( 199?, sc2copdc3p , sc2copdc , scorpion2_dm01 , drwho , bfm_sc2_state, ofah , 0, "BFM", "Cops 'n' Robbers Club Deluxe (Bellfruit) (set 5, UK, 250GBP Jackpot, Protocol) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-751-842
+GAME( 199?, sc2copdc3 , sc2copdc , scorpion2_dm01_3m , drwho , bfm_sc2_state, ofah , 0, "BFM", "Cops 'n' Robbers Club Deluxe (Bellfruit) (set 5, UK, 250GBP Jackpot) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-842
+GAME( 199?, sc2copdc3p , sc2copdc , scorpion2_dm01_3m , drwho , bfm_sc2_state, ofah , 0, "BFM", "Cops 'n' Robbers Club Deluxe (Bellfruit) (set 5, UK, 250GBP Jackpot, Protocol) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-751-842
// PROJECT PR6588 CLUB COPS AND ROBBERS DELUXE 25P/#250 63% - 25-SEP-1997 08:30:05
-GAME( 199?, sc2copdc4 , sc2copdc , scorpion2_dm01 , drwho , bfm_sc2_state, ofah , 0, "BFM", "Cops 'n' Robbers Club Deluxe (Bellfruit) (set 6, UK, 250GBP Jackpot) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-993
-GAME( 199?, sc2copdc4p , sc2copdc , scorpion2_dm01 , drwho , bfm_sc2_state, ofah , 0, "BFM", "Cops 'n' Robbers Club Deluxe (Bellfruit) (set 6, UK, 250GBP Jackpot, Protocol) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-751-993
+GAME( 199?, sc2copdc4 , sc2copdc , scorpion2_dm01_3m , drwho , bfm_sc2_state, ofah , 0, "BFM", "Cops 'n' Robbers Club Deluxe (Bellfruit) (set 6, UK, 250GBP Jackpot) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-993
+GAME( 199?, sc2copdc4p , sc2copdc , scorpion2_dm01_3m , drwho , bfm_sc2_state, ofah , 0, "BFM", "Cops 'n' Robbers Club Deluxe (Bellfruit) (set 6, UK, 250GBP Jackpot, Protocol) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-751-993
// PROJECT PR6588 CLUB COPS AND ROBBERS DELUXE 25P/#250 67% - 25-SEP-1997 08:33:14
-GAME( 199?, sc2copdc , 0 , scorpion2_dm01 , drwho , bfm_sc2_state, ofah , 0, "BFM", "Cops 'n' Robbers Club Deluxe (Bellfruit) (set 7, UK, 250GBP Jackpot) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-992
-GAME( 199?, sc2copdcp , sc2copdc , scorpion2_dm01 , drwho , bfm_sc2_state, ofah , 0, "BFM", "Cops 'n' Robbers Club Deluxe (Bellfruit) (set 7, UK, 250GBP Jackpot, Protocol) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-751-992
+GAME( 199?, sc2copdc , 0 , scorpion2_dm01_3m , drwho , bfm_sc2_state, ofah , 0, "BFM", "Cops 'n' Robbers Club Deluxe (Bellfruit) (set 7, UK, 250GBP Jackpot) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-992
+GAME( 199?, sc2copdcp , sc2copdc , scorpion2_dm01_3m , drwho , bfm_sc2_state, ofah , 0, "BFM", "Cops 'n' Robbers Club Deluxe (Bellfruit) (set 7, UK, 250GBP Jackpot, Protocol) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-751-992
/********************************************************************************************************************************************************************************************************************
@@ -8451,21 +8487,21 @@ GAME( 199?, sc2copdcp , sc2copdc , scorpion2_dm01 , drwho , bfm_sc2_st
********************************************************************************************************************************************************************************************************************/
// PROJECT NUMBER 6201 ROUND THE TOWN - 4-MAR-1993 11:05:07
-GAME( 199?, sc2town4 , sc2town , scorpion2_dm01 , drwho , bfm_sc2_state, ofah , 0, "BFM", "Round The Town (Bellfruit) (set 1) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-052
+GAME( 199?, sc2town4 , sc2town , scorpion2_dm01_3m , drwho , bfm_sc2_state, ofah , 0, "BFM", "Round The Town (Bellfruit) (set 1) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-052
// PROJECT NUMBER 6201 ROUND THE TOWN IRISH ALL CASH - 1-APR-1993 14:44:50
-GAME( 199?, sc2town2 , sc2town , scorpion2_dm01 , drwho , bfm_sc2_state, ofah , 0, "BFM", "Round The Town (Bellfruit) (set 2) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-069
+GAME( 199?, sc2town2 , sc2town , scorpion2_dm01_3m , drwho , bfm_sc2_state, ofah , 0, "BFM", "Round The Town (Bellfruit) (set 2) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-069
// PROJECT NUMBER 6620 (6201) ROUND THE TOWN S&P - 15-DEC-1995 14:50:50
-GAME( 199?, sc2town3 , sc2town , scorpion2_dm01 , drwho , bfm_sc2_state, ofah , 0, "BFM", "Round The Town (Bellfruit) (set 3) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-591
-GAME( 199?, sc2town3p , sc2town , scorpion2_dm01 , drwho , bfm_sc2_state, ofah , 0, "BFM", "Round The Town (Bellfruit) (set 3, Protocol) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-751-591
+GAME( 199?, sc2town3 , sc2town , scorpion2_dm01_3m , drwho , bfm_sc2_state, ofah , 0, "BFM", "Round The Town (Bellfruit) (set 3) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-591
+GAME( 199?, sc2town3p , sc2town , scorpion2_dm01_3m , drwho , bfm_sc2_state, ofah , 0, "BFM", "Round The Town (Bellfruit) (set 3, Protocol) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-751-591
// PROJECT NUMBER 6620 (6201) ROUND THE TOWN (ARCADE/HIGH TOKEN) - 18-DEC-1995 15:59:22
-GAME( 199?, sc2town1 , sc2town , scorpion2_dm01 , drwho , bfm_sc2_state, ofah , 0, "BFM", "Round The Town (Bellfruit) (set 4) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-592
-GAME( 199?, sc2town1a , sc2town , scorpion2_dm01 , drwho , bfm_sc2_state, ofah , 0, "BFM", "Round The Town (Bellfruit) (set 4, alt) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-592
-GAME( 199?, sc2town1p , sc2town , scorpion2_dm01 , drwho , bfm_sc2_state, ofah , 0, "BFM", "Round The Town (Bellfruit) (set 4, Protocol) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-751-592
+GAME( 199?, sc2town1 , sc2town , scorpion2_dm01_3m , drwho , bfm_sc2_state, ofah , 0, "BFM", "Round The Town (Bellfruit) (set 4) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-592
+GAME( 199?, sc2town1a , sc2town , scorpion2_dm01_3m , drwho , bfm_sc2_state, ofah , 0, "BFM", "Round The Town (Bellfruit) (set 4, alt) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-592
+GAME( 199?, sc2town1p , sc2town , scorpion2_dm01_3m , drwho , bfm_sc2_state, ofah , 0, "BFM", "Round The Town (Bellfruit) (set 4, Protocol) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-751-592
// PROJECT NUMBER 6620 (6201) ROUND THE TOWN S&P IRISH AC - 5-MAR-1996 12:05:06
-GAME( 199?, sc2town5 , sc2town , scorpion2_dm01 , drwho , bfm_sc2_state, ofah , 0, "BFM", "Round The Town (Bellfruit) (set 5) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-642
+GAME( 199?, sc2town5 , sc2town , scorpion2_dm01_3m , drwho , bfm_sc2_state, ofah , 0, "BFM", "Round The Town (Bellfruit) (set 5) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-642
// PROJECT NUMBER 6620 (6201) ROUND THE TOWN #10 AC - 15-MAR-1996 12:07:18
-GAME( 199?, sc2town , 0 , scorpion2_dm01 , drwho , bfm_sc2_state, ofah , 0, "BFM", "Round The Town (Bellfruit) (set 6) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-654
-GAME( 199?, sc2townp , sc2town , scorpion2_dm01 , drwho , bfm_sc2_state, ofah , 0, "BFM", "Round The Town (Bellfruit) (set 6, Protocol) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-751-654
+GAME( 199?, sc2town , 0 , scorpion2_dm01_3m , drwho , bfm_sc2_state, ofah , 0, "BFM", "Round The Town (Bellfruit) (set 6) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-654
+GAME( 199?, sc2townp , sc2town , scorpion2_dm01_3m , drwho , bfm_sc2_state, ofah , 0, "BFM", "Round The Town (Bellfruit) (set 6, Protocol) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-751-654
// PROJECT NUMBER 6620 (6201) ROUND THE TOWN (ARCADE/HIGH TOKEN) - 18-DEC-1995 15:59:22
@@ -8474,15 +8510,15 @@ GAME( 199?, sc2townp , sc2town , scorpion2_dm01 , drwho , bfm_sc2_st
********************************************************************************************************************************************************************************************************************/
// PROJECT NUMBER 6207 ONLY FOOLS AND HORSES - 14-OCT-1993 15:28:16
-GAME( 199?, sc2ofool1 , sc2ofool , scorpion2_dm01 , drwho , bfm_sc2_state, ofah , 0, "BFM", "Only Fools & Horses (Bellfruit) (set 1) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-147
+GAME( 199?, sc2ofool1 , sc2ofool , scorpion2_dm01_3m , drwho , bfm_sc2_state, ofah , 0, "BFM", "Only Fools & Horses (Bellfruit) (set 1) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-147
// PROJECT NUMBER 6207 ONLY FOOLS AND HORSES ALL CASH - 29-OCT-1993 13:00:02
-GAME( 199?, sc2ofool3 , sc2ofool , scorpion2_dm01 , drwho , bfm_sc2_state, ofah , 0, "BFM", "Only Fools & Horses (Bellfruit) (set 2) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-151
+GAME( 199?, sc2ofool3 , sc2ofool , scorpion2_dm01_3m , drwho , bfm_sc2_state, ofah , 0, "BFM", "Only Fools & Horses (Bellfruit) (set 2) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-151
// PROJECT NUMBER 6207 ONLY FOOLS AND HORSES - 18-NOV-1993 14:32:21
-GAME( 199?, sc2ofool , 0 , scorpion2_dm01 , drwho , bfm_sc2_state, ofah , 0, "BFM", "Only Fools & Horses (Bellfruit) (set 3) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-159
+GAME( 199?, sc2ofool , 0 , scorpion2_dm01_3m , drwho , bfm_sc2_state, ofah , 0, "BFM", "Only Fools & Horses (Bellfruit) (set 3) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-159
// PROJECT NUMBER 6207 ONLY FOOLS AND HORSES ALL CASH - 18-NOV-1993 16:12:34
-GAME( 199?, sc2ofool2 , sc2ofool , scorpion2_dm01 , drwho , bfm_sc2_state, ofah , 0, "BFM", "Only Fools & Horses (Bellfruit) (set 4) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-162
+GAME( 199?, sc2ofool2 , sc2ofool , scorpion2_dm01_3m , drwho , bfm_sc2_state, ofah , 0, "BFM", "Only Fools & Horses (Bellfruit) (set 4) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-162
// PROJECT NUMBER 6207 ONLY FOOLS AND HORSES ARCADE 10P PLAY - 14-DEC-1993 14:51:34
-GAME( 199?, sc2ofool4 , sc2ofool , scorpion2_dm01 , drwho , bfm_sc2_state, ofah , 0, "BFM", "Only Fools & Horses (Bellfruit) (set 5) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-177
+GAME( 199?, sc2ofool4 , sc2ofool , scorpion2_dm01_3m , drwho , bfm_sc2_state, ofah , 0, "BFM", "Only Fools & Horses (Bellfruit) (set 5) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-177
/********************************************************************************************************************************************************************************************************************
@@ -8490,10 +8526,10 @@ GAME( 199?, sc2ofool4 , sc2ofool , scorpion2_dm01 , drwho , bfm_sc2_st
********************************************************************************************************************************************************************************************************************/
// PROJECT NUMBER 6221 PARTY TIME BINGO SCORPION 2 - 10-JUN-1993 14:26:26
-GAME( 199?, sc2ptytm1 , sc2ptytm , scorpion2_dm01 , drwho , bfm_sc2_state, ofah , 0, "BFM", "Party Time (Bellfruit) (set 1) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-092
+GAME( 199?, sc2ptytm1 , sc2ptytm , scorpion2_dm01_3m , drwho , bfm_sc2_state, ofah , 0, "BFM", "Party Time (Bellfruit) (set 1) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-092
// PROJECT NUMBER 6221 PARTY TIME BINGO SCORPION 2 #4 ALL CASH 10P PLAY - 1-JUL-1996 12:02:22
-GAME( 199?, sc2ptytm , 0 , scorpion2_dm01 , drwho , bfm_sc2_state, ofah , 0, "BFM", "Party Time (Bellfruit) (set 2) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-806
-GAME( 199?, sc2ptytmp , sc2ptytm , scorpion2_dm01 , drwho , bfm_sc2_state, ofah , 0, "BFM", "Party Time (Bellfruit) (set 2, Protocol) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-751-806
+GAME( 199?, sc2ptytm , 0 , scorpion2_dm01_3m , drwho , bfm_sc2_state, ofah , 0, "BFM", "Party Time (Bellfruit) (set 2) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-806
+GAME( 199?, sc2ptytmp , sc2ptytm , scorpion2_dm01_3m , drwho , bfm_sc2_state, ofah , 0, "BFM", "Party Time (Bellfruit) (set 2, Protocol) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-751-806
/********************************************************************************************************************************************************************************************************************
@@ -8501,7 +8537,7 @@ GAME( 199?, sc2ptytmp , sc2ptytm , scorpion2_dm01 , drwho , bfm_sc2_st
********************************************************************************************************************************************************************************************************************/
// PROJECT NUMBER 6172 ALONG THE PROM SINGLE SITE - 30-MAR-1993 12:03:27
-GAME( 199?, sc2prom , 0 , scorpion2_dm01 , drwho , bfm_sc2_state, prom , 0, "BFM", "Along The Prom (Bellfruit) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-062
+GAME( 199?, sc2prom , 0 , scorpion2_dm01_3m , drwho , bfm_sc2_state, prom , 0, "BFM", "Along The Prom (Bellfruit) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-062
/********************************************************************************************************************************************************************************************************************
@@ -8509,12 +8545,12 @@ GAME( 199?, sc2prom , 0 , scorpion2_dm01 , drwho , bfm_sc2_st
********************************************************************************************************************************************************************************************************************/
// PROJECT NUMBER PR6432 PREMIER CLUB MANAGER - 26-JAN-1996 11:52:43
-GAME( 199?, sc2prem2 , sc2prem , scorpion2_dm01 , drwho , bfm_sc2_state, prom , 0, "BFM", "Premier Club Manager (Bellfruit) (set 1, UK) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-616
+GAME( 199?, sc2prem2 , sc2prem , scorpion2_dm01_3m , drwho , bfm_sc2_state, prom , 0, "BFM", "Premier Club Manager (Bellfruit) (set 1, UK) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-616
// PROJECT NUMBER PR6432 PREMIER CLUB MANAGER 25P !250 - 13-AUG-1996 14:05:05
-GAME( 199?, sc2prem , 0 , scorpion2_dm01 , drwho , bfm_sc2_state, prom , 0, "BFM", "Premier Club Manager (Bellfruit) (set 2, UK, 250GBP Jackpot) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-848
+GAME( 199?, sc2prem , 0 , scorpion2_dm01_3m , drwho , bfm_sc2_state, prom , 0, "BFM", "Premier Club Manager (Bellfruit) (set 2, UK, 250GBP Jackpot) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-848
// PROJECT NUMBER PR6432 PREMIER CLUB MANAGER - 20-AUG-1996 10:06:44
-GAME( 199?, sc2prem1 , sc2prem , scorpion2_dm01 , drwho , bfm_sc2_state, prom , 0, "BFM", "Premier Club Manager (Bellfruit) (set 3, UK) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-847
-GAME( 199?, sc2prem1p , sc2prem , scorpion2_dm01 , drwho , bfm_sc2_state, prom , 0, "BFM", "Premier Club Manager (Bellfruit) (set 3, UK, Protocol) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-751-847
+GAME( 199?, sc2prem1 , sc2prem , scorpion2_dm01_3m , drwho , bfm_sc2_state, prom , 0, "BFM", "Premier Club Manager (Bellfruit) (set 3, UK) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-847
+GAME( 199?, sc2prem1p , sc2prem , scorpion2_dm01_3m , drwho , bfm_sc2_state, prom , 0, "BFM", "Premier Club Manager (Bellfruit) (set 3, UK, Protocol) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-751-847
/********************************************************************************************************************************************************************************************************************
Golden Casino Club
@@ -8522,14 +8558,14 @@ GAME( 199?, sc2prem1p , sc2prem , scorpion2_dm01 , drwho , bfm_sc2_st
********************************************************************************************************************************************************************************************************************/
// PROJECT NUMBER 6632 GOLDEN CASINO VAR STAKE/JACKPOT - 12-FEB-1997 15:54:10
-GAME( 199?, sc2gcclb2 , sc2gcclb , scorpion2_dm01 , drwho , bfm_sc2_state, prom , 0, "BFM", "Golden Casino Club (Bellfruit) (set 1, UK) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-927
-GAME( 199?, sc2gcclb2p , sc2gcclb , scorpion2_dm01 , drwho , bfm_sc2_state, prom , 0, "BFM", "Golden Casino Club (Bellfruit) (set 1, UK, Protocol) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-751-927
+GAME( 199?, sc2gcclb2 , sc2gcclb , scorpion2_dm01_3m , drwho , bfm_sc2_state, prom , 0, "BFM", "Golden Casino Club (Bellfruit) (set 1, UK) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-927
+GAME( 199?, sc2gcclb2p , sc2gcclb , scorpion2_dm01_3m , drwho , bfm_sc2_state, prom , 0, "BFM", "Golden Casino Club (Bellfruit) (set 1, UK, Protocol) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-751-927
// PROJECT NUMBER 6632 GOLDEN CASINO 20P STAKE/#250 JACKPOT - 12-FEB-1997 15:56:05
-GAME( 199?, sc2gcclb , 0 , scorpion2_dm01 , drwho , bfm_sc2_state, prom , 0, "BFM", "Golden Casino Club (Bellfruit) (set 2, UK, 250GBP Jackpot) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-928
-GAME( 199?, sc2gcclbp , sc2gcclb , scorpion2_dm01 , drwho , bfm_sc2_state, prom , 0, "BFM", "Golden Casino Club (Bellfruit) (set 2, UK, 250GBP Jackpot, Protocol) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-751-928
+GAME( 199?, sc2gcclb , 0 , scorpion2_dm01_3m , drwho , bfm_sc2_state, prom , 0, "BFM", "Golden Casino Club (Bellfruit) (set 2, UK, 250GBP Jackpot) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-928
+GAME( 199?, sc2gcclbp , sc2gcclb , scorpion2_dm01_3m , drwho , bfm_sc2_state, prom , 0, "BFM", "Golden Casino Club (Bellfruit) (set 2, UK, 250GBP Jackpot, Protocol) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-751-928
// PROJECT NUMBER 6632 GOLDEN CASINO 5P STAKE/#100 JACKPOT - 12-FEB-1997 15:57:23
-GAME( 199?, sc2gcclb1 , sc2gcclb , scorpion2_dm01 , drwho , bfm_sc2_state, prom , 0, "BFM", "Golden Casino Club (Bellfruit) (set 3, UK, 100GBP Jackpot) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-929
-GAME( 199?, sc2gcclb1p , sc2gcclb , scorpion2_dm01 , drwho , bfm_sc2_state, prom , 0, "BFM", "Golden Casino Club (Bellfruit) (set 3, UK, 100GBP Jackpot, Protocol) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-751-929
+GAME( 199?, sc2gcclb1 , sc2gcclb , scorpion2_dm01_3m , drwho , bfm_sc2_state, prom , 0, "BFM", "Golden Casino Club (Bellfruit) (set 3, UK, 100GBP Jackpot) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-750-929
+GAME( 199?, sc2gcclb1p , sc2gcclb , scorpion2_dm01_3m , drwho , bfm_sc2_state, prom , 0, "BFM", "Golden Casino Club (Bellfruit) (set 3, UK, 100GBP Jackpot, Protocol) (Scorpion 2/3)", GAME_FLAGS) // GAME No 95-751-929
/********************************************************************************************************************************************************************************************************************
diff --git a/src/mame/drivers/bfm_sc4.cpp b/src/mame/drivers/bfm_sc4.cpp
index a610e0097b7..1d1d2a783fe 100644
--- a/src/mame/drivers/bfm_sc4.cpp
+++ b/src/mame/drivers/bfm_sc4.cpp
@@ -46,6 +46,8 @@
#include "bfm_sc4.lh"
#include "sc4_dmd.lh"
+#define MACHINE_FLAGS MACHINE_NOT_WORKING|MACHINE_CLICKABLE_ARTWORK
+#define MACHINE_FLAGS_NOSOUND MACHINE_FLAGS|MACHINE_NO_SOUND
bool compare_mbus(UINT16* rom)
{
@@ -23459,7 +23461,7 @@ ROM_END
/* Scorpion 4 */
-GAMEL( 200?, sc4tst ,0, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Scorpion 4 Test Rig (Bellfruit) (Scorpion ?)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4tst ,0, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Scorpion 4 Test Rig (Bellfruit) (Scorpion ?)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4pstat)
{
@@ -23523,32 +23525,32 @@ INPUT_PORTS_END
// can't get past 'read meters'
// PR2516 PAYSTATIONV2.0 PAYSTATIONSND PAYSTATION
-GAMEL( 200?, sc4pstat ,0, sc4_4reel, sc4pstat, sc4_state, sc4pstat, ROT0, "QPS","Paystation (V2.0) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pstatb ,sc4pstat, sc4_4reel, sc4pstat, sc4_state, sc4pstat, ROT0, "QPS","Paystation (V2.0) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4pstat ,0, sc4_4reel, sc4pstat, sc4_state, sc4pstat, ROT0, "QPS","Paystation (V2.0) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pstatb ,sc4pstat, sc4_4reel, sc4pstat, sc4_state, sc4pstat, ROT0, "QPS","Paystation (V2.0) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2516 PAYSTATIONV2.1 PAYSTATIONSND PAYSTATION
-GAMEL( 200?, sc4pstata ,sc4pstat, sc4_4reel, sc4pstat, sc4_state, sc4pstat, ROT0, "QPS","Paystation (V2.1) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pstatc ,sc4pstat, sc4_4reel, sc4pstat, sc4_state, sc4pstat, ROT0, "QPS","Paystation (V2.1) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4pstata ,sc4pstat, sc4_4reel, sc4pstat, sc4_state, sc4pstat, ROT0, "QPS","Paystation (V2.1) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pstatc ,sc4pstat, sc4_4reel, sc4pstat, sc4_state, sc4pstat, ROT0, "QPS","Paystation (V2.1) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2516 PAYSTATIONV2.2 PAYSTATIONSND PAYSTATION
-GAMEL( 200?, sc4pstatd ,sc4pstat, sc4_4reel, sc4pstat, sc4_state, sc4pstat, ROT0, "QPS","Paystation (V2.2) (Qps) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4pstatd ,sc4pstat, sc4_4reel, sc4pstat, sc4_state, sc4pstat, ROT0, "QPS","Paystation (V2.2) (Qps) (Scorpion 4)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2516 PAYSTATIONV2.3 PAYSTATIONSND PAYSTATION
-GAMEL( 200?, sc4pstate ,sc4pstat, sc4_4reel, sc4pstat, sc4_state, sc4pstat, ROT0, "QPS","Paystation (V2.3) (Qps) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4pstate ,sc4pstat, sc4_4reel, sc4pstat, sc4_state, sc4pstat, ROT0, "QPS","Paystation (V2.3) (Qps) (Scorpion 4)", MACHINE_FLAGS, layout_bfm_sc4 )
// ones below can be 'played' (skip 'read meters' with cancel)
// PR2516 PAYSTATIONV4.0 PAYSTATIONSND PAYSTATION
-GAMEL( 200?, sc4pstath ,sc4pstat, sc4_4reel, sc4pstat, sc4_state, sc4pstat, ROT0, "QPS","Paystation (V4.0) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pstatm ,sc4pstat, sc4_4reel, sc4pstat, sc4_state, sc4pstat, ROT0, "QPS","Paystation (V4.0) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4pstath ,sc4pstat, sc4_4reel, sc4pstat, sc4_state, sc4pstat, ROT0, "QPS","Paystation (V4.0) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pstatm ,sc4pstat, sc4_4reel, sc4pstat, sc4_state, sc4pstat, ROT0, "QPS","Paystation (V4.0) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2516 PAYSTATIONV011 PAYSTATIONSND PAYSTATION
-GAMEL( 200?, sc4pstatf ,sc4pstat, sc4_4reel, sc4pstat, sc4_state, sc4pstat_mbus, ROT0, "QPS","Paystation (V011) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pstati ,sc4pstat, sc4_4reel, sc4pstat, sc4_state, sc4pstat_mbus, ROT0, "QPS","Paystation (V011) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4pstatf ,sc4pstat, sc4_4reel, sc4pstat, sc4_state, sc4pstat_mbus, ROT0, "QPS","Paystation (V011) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pstati ,sc4pstat, sc4_4reel, sc4pstat, sc4_state, sc4pstat_mbus, ROT0, "QPS","Paystation (V011) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2516 PAYSTATION 012 PAYSTATIONSND PAYSTATION
-GAMEL( 200?, sc4pstatn ,sc4pstat, sc4_4reel, sc4pstat, sc4_state, sc4pstat, ROT0, "QPS","Paystation (V012) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pstatp ,sc4pstat, sc4_4reel, sc4pstat, sc4_state, sc4pstat, ROT0, "QPS","Paystation (V012) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4pstatn ,sc4pstat, sc4_4reel, sc4pstat, sc4_state, sc4pstat, ROT0, "QPS","Paystation (V012) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pstatp ,sc4pstat, sc4_4reel, sc4pstat, sc4_state, sc4pstat, ROT0, "QPS","Paystation (V012) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2516 PAYSTATIONV041 PAYSTATIONSND PAYSTATION
-GAMEL( 200?, sc4pstatg ,sc4pstat, sc4_4reel, sc4pstat, sc4_state, sc4pstat_mbus, ROT0, "QPS","Paystation (V041) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pstatj ,sc4pstat, sc4_4reel, sc4pstat, sc4_state, sc4pstat_mbus, ROT0, "QPS","Paystation (V041) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4pstatg ,sc4pstat, sc4_4reel, sc4pstat, sc4_state, sc4pstat_mbus, ROT0, "QPS","Paystation (V041) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pstatj ,sc4pstat, sc4_4reel, sc4pstat, sc4_state, sc4pstat_mbus, ROT0, "QPS","Paystation (V041) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2516 PAYSTATION 042 PAYSTATIONSND PAYSTATION
-GAMEL( 200?, sc4pstato ,sc4pstat, sc4_4reel, sc4pstat, sc4_state, sc4pstat, ROT0, "QPS","Paystation (V042) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pstatq ,sc4pstat, sc4_4reel, sc4pstat, sc4_state, sc4pstat, ROT0, "QPS","Paystation (V042) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4pstato ,sc4pstat, sc4_4reel, sc4pstat, sc4_state, sc4pstat, ROT0, "QPS","Paystation (V042) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pstatq ,sc4pstat, sc4_4reel, sc4pstat, sc4_state, sc4pstat, ROT0, "QPS","Paystation (V042) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4cvani)
@@ -23603,16 +23605,16 @@ INPUT_PORTS_START( sc4cvani ) // this structure is generated
INPUT_PORTS_END
// PR2052 CASHLVANIA VANIASND CASH'!'VANIA
-GAMEL( 200?, sc4cvani ,0, sc4_200_4rb, sc4cvani, sc4_state, sc4cvani, ROT0, "QPS","Cashvania (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cvania ,sc4cvani, sc4_200_4rb, sc4cvani, sc4_state, sc4cvani, ROT0, "QPS","Cashvania (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cvanib ,sc4cvani, sc4_200_4rb, sc4cvani, sc4_state, sc4cvani, ROT0, "QPS","Cashvania (Qps) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cvanic ,sc4cvani, sc4_200_4rb, sc4cvani, sc4_state, sc4cvani, ROT0, "QPS","Cashvania (Qps) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cvanid ,sc4cvani, sc4_200_4rb, sc4cvani, sc4_state, sc4cvani, ROT0, "QPS","Cashvania (Qps) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cvanie ,sc4cvani, sc4_200_4rb, sc4cvani, sc4_state, sc4cvani, ROT0, "QPS","Cashvania (Qps) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cvanif ,sc4cvani, sc4_200_4rb, sc4cvani, sc4_state, sc4cvani, ROT0, "QPS","Cashvania (Qps) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cvanig ,sc4cvani, sc4_200_4rb, sc4cvani, sc4_state, sc4cvani, ROT0, "QPS","Cashvania (Qps) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cvanih ,sc4cvani, sc4_200_4rb, sc4cvani, sc4_state, sc4cvani, ROT0, "QPS","Cashvania (Qps) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cvanii ,sc4cvani, sc4_200_4rb, sc4cvani, sc4_state, sc4cvani, ROT0, "QPS","Cashvania (Qps) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cvani ,0, sc4_200_4rb, sc4cvani, sc4_state, sc4cvani, ROT0, "QPS","Cashvania (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cvania ,sc4cvani, sc4_200_4rb, sc4cvani, sc4_state, sc4cvani, ROT0, "QPS","Cashvania (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cvanib ,sc4cvani, sc4_200_4rb, sc4cvani, sc4_state, sc4cvani, ROT0, "QPS","Cashvania (Qps) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cvanic ,sc4cvani, sc4_200_4rb, sc4cvani, sc4_state, sc4cvani, ROT0, "QPS","Cashvania (Qps) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cvanid ,sc4cvani, sc4_200_4rb, sc4cvani, sc4_state, sc4cvani, ROT0, "QPS","Cashvania (Qps) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cvanie ,sc4cvani, sc4_200_4rb, sc4cvani, sc4_state, sc4cvani, ROT0, "QPS","Cashvania (Qps) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cvanif ,sc4cvani, sc4_200_4rb, sc4cvani, sc4_state, sc4cvani, ROT0, "QPS","Cashvania (Qps) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cvanig ,sc4cvani, sc4_200_4rb, sc4cvani, sc4_state, sc4cvani, ROT0, "QPS","Cashvania (Qps) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cvanih ,sc4cvani, sc4_200_4rb, sc4cvani, sc4_state, sc4cvani, ROT0, "QPS","Cashvania (Qps) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cvanii ,sc4cvani, sc4_200_4rb, sc4cvani, sc4_state, sc4cvani, ROT0, "QPS","Cashvania (Qps) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4cvclb)
@@ -23676,16 +23678,16 @@ INPUT_PORTS_START( sc4cvclb ) // this structure is generated
INPUT_PORTS_END
// PRXXXX CLUBCASHLVANIA V1.0 CLUBVANIASND CLUB CASH!VANIA
-GAMEL( 200?, sc4cvclb ,0, sc4_200_4rb, sc4cvclb, sc4_state, sc4cvclb, ROT0, "QPS","Cashvania Club (V1.0) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cvclba ,sc4cvclb, sc4_200_4rb, sc4cvclb, sc4_state, sc4cvclb, ROT0, "QPS","Cashvania Club (V1.0) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cvclbc ,sc4cvclb, sc4_200_4rb, sc4cvclb, sc4_state, sc4cvclb, ROT0, "QPS","Cashvania Club (V1.0) (Qps) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cvclbd ,sc4cvclb, sc4_200_4rb, sc4cvclb, sc4_state, sc4cvclb, ROT0, "QPS","Cashvania Club (V1.0) (Qps) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cvclb ,0, sc4_200_4rb, sc4cvclb, sc4_state, sc4cvclb, ROT0, "QPS","Cashvania Club (V1.0) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cvclba ,sc4cvclb, sc4_200_4rb, sc4cvclb, sc4_state, sc4cvclb, ROT0, "QPS","Cashvania Club (V1.0) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cvclbc ,sc4cvclb, sc4_200_4rb, sc4cvclb, sc4_state, sc4cvclb, ROT0, "QPS","Cashvania Club (V1.0) (Qps) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cvclbd ,sc4cvclb, sc4_200_4rb, sc4cvclb, sc4_state, sc4cvclb, ROT0, "QPS","Cashvania Club (V1.0) (Qps) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
// PRXXXX CLUBCASHLVANIA V2.0 CLUBVANIASND CLUB CASH!VANIA
-GAMEL( 200?, sc4cvclbb ,sc4cvclb, sc4_200_4rb, sc4cvclb, sc4_state, sc4cvclb, ROT0, "QPS","Cashvania Club (V2.0) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cvclbe ,sc4cvclb, sc4_200_4rb, sc4cvclb, sc4_state, sc4cvclb, ROT0, "QPS","Cashvania Club (V2.0) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cvclbb ,sc4cvclb, sc4_200_4rb, sc4cvclb, sc4_state, sc4cvclb, ROT0, "QPS","Cashvania Club (V2.0) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cvclbe ,sc4cvclb, sc4_200_4rb, sc4cvclb, sc4_state, sc4cvclb, ROT0, "QPS","Cashvania Club (V2.0) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PRXXXX CLUBCASHLVANIA 411 CLUBVANIASND CLUB CASH!VANIA
-GAMEL( 200?, sc4cvclbf ,sc4cvclb, sc4_200_4rb, sc4cvclb, sc4_state, sc4cvclb_mbus, ROT0, "QPS","Cashvania Club (V411) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cvclbg ,sc4cvclb, sc4_200_4rb, sc4cvclb, sc4_state, sc4cvclb_mbus, ROT0, "QPS","Cashvania Club (V411) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cvclbf ,sc4cvclb, sc4_200_4rb, sc4cvclb, sc4_state, sc4cvclb_mbus, ROT0, "QPS","Cashvania Club (V411) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cvclbg ,sc4cvclb, sc4_200_4rb, sc4cvclb, sc4_state, sc4cvclb_mbus, ROT0, "QPS","Cashvania Club (V411) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -23756,26 +23758,26 @@ INPUT_PORTS_END
// this was marked (and has the header) GRAND CASINO, and was paired with some (bad dumps) of 'Grand Casino' sound roms, but it actually
// appears to be a version of Grandslam and expects the Grandslam sounds
// PR7194 GRAND CASINO PR6934 SLM2 SOUNDS11 GRAND CASINO
-GAMEL( 200?, sc4gcclb ,0, sc4, sc4gcclbl, sc4_state, sc4gcclb, ROT0, "BFM","Grandslam Casino (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gcclba ,sc4gcclb, sc4, sc4gcclbl, sc4_state, sc4gcclb, ROT0, "BFM","Grandslam Casino (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gcclbb ,sc4gcclb, sc4, sc4gcclbl, sc4_state, sc4gcclb, ROT0, "BFM","Grandslam Casino (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gcclbc ,sc4gcclb, sc4, sc4gcclbl, sc4_state, sc4gcclb, ROT0, "BFM","Grandslam Casino (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gcclbd ,sc4gcclb, sc4, sc4gcclbl, sc4_state, sc4gcclb, ROT0, "BFM","Grandslam Casino (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gcclbe ,sc4gcclb, sc4, sc4gcclbl, sc4_state, sc4gcclb, ROT0, "BFM","Grandslam Casino (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gcclbf ,sc4gcclb, sc4, sc4gcclbl, sc4_state, sc4gcclb, ROT0, "BFM","Grandslam Casino (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gcclbg ,sc4gcclb, sc4, sc4gcclbl, sc4_state, sc4gcclb, ROT0, "BFM","Grandslam Casino (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gcclbh ,sc4gcclb, sc4, sc4gcclbl, sc4_state, sc4gcclb, ROT0, "BFM","Grandslam Casino (Bellfruit) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gcclbi ,sc4gcclb, sc4, sc4gcclbl, sc4_state, sc4gcclb, ROT0, "BFM","Grandslam Casino (Bellfruit) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gcclbj ,sc4gcclb, sc4, sc4gcclbl, sc4_state, sc4gcclb, ROT0, "BFM","Grandslam Casino (Bellfruit) (Scorpion 4) (set 11)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gcclbk ,sc4gcclb, sc4, sc4gcclbl, sc4_state, sc4gcclb, ROT0, "BFM","Grandslam Casino (Bellfruit) (Scorpion 4) (set 12)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4gcclb ,0, sc4, sc4gcclbl, sc4_state, sc4gcclb, ROT0, "BFM","Grandslam Casino (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gcclba ,sc4gcclb, sc4, sc4gcclbl, sc4_state, sc4gcclb, ROT0, "BFM","Grandslam Casino (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gcclbb ,sc4gcclb, sc4, sc4gcclbl, sc4_state, sc4gcclb, ROT0, "BFM","Grandslam Casino (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gcclbc ,sc4gcclb, sc4, sc4gcclbl, sc4_state, sc4gcclb, ROT0, "BFM","Grandslam Casino (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gcclbd ,sc4gcclb, sc4, sc4gcclbl, sc4_state, sc4gcclb, ROT0, "BFM","Grandslam Casino (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gcclbe ,sc4gcclb, sc4, sc4gcclbl, sc4_state, sc4gcclb, ROT0, "BFM","Grandslam Casino (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gcclbf ,sc4gcclb, sc4, sc4gcclbl, sc4_state, sc4gcclb, ROT0, "BFM","Grandslam Casino (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gcclbg ,sc4gcclb, sc4, sc4gcclbl, sc4_state, sc4gcclb, ROT0, "BFM","Grandslam Casino (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gcclbh ,sc4gcclb, sc4, sc4gcclbl, sc4_state, sc4gcclb, ROT0, "BFM","Grandslam Casino (Bellfruit) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gcclbi ,sc4gcclb, sc4, sc4gcclbl, sc4_state, sc4gcclb, ROT0, "BFM","Grandslam Casino (Bellfruit) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gcclbj ,sc4gcclb, sc4, sc4gcclbl, sc4_state, sc4gcclb, ROT0, "BFM","Grandslam Casino (Bellfruit) (Scorpion 4) (set 11)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gcclbk ,sc4gcclb, sc4, sc4gcclbl, sc4_state, sc4gcclb, ROT0, "BFM","Grandslam Casino (Bellfruit) (Scorpion 4) (set 12)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR7194 GRAND CASINO PR6934 SLM2 SOUNDS11 GRAND CASINO GRAND CASINO CLUB
-GAMEL( 200?, sc4gcclbl ,sc4gcclb, sc4, sc4gcclbl, sc4_state, sc4gcclb_mbus, ROT0, "BFM","Grandslam Casino (Bellfruit) (Scorpion 4) (set 13)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gcclbm ,sc4gcclb, sc4, sc4gcclbl, sc4_state, sc4gcclb_mbus, ROT0, "BFM","Grandslam Casino (Bellfruit) (Scorpion 4) (set 14)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gcclbn ,sc4gcclb, sc4, sc4gcclbl, sc4_state, sc4gcclb_mbus, ROT0, "BFM","Grandslam Casino (Bellfruit) (Scorpion 4) (set 15)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gcclbp ,sc4gcclb, sc4, sc4gcclbl, sc4_state, sc4gcclb_mbus, ROT0, "BFM","Grandslam Casino (Bellfruit) (Scorpion 4) (set 16)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4gcclbl ,sc4gcclb, sc4, sc4gcclbl, sc4_state, sc4gcclb_mbus, ROT0, "BFM","Grandslam Casino (Bellfruit) (Scorpion 4) (set 13)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gcclbm ,sc4gcclb, sc4, sc4gcclbl, sc4_state, sc4gcclb_mbus, ROT0, "BFM","Grandslam Casino (Bellfruit) (Scorpion 4) (set 14)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gcclbn ,sc4gcclb, sc4, sc4gcclbl, sc4_state, sc4gcclb_mbus, ROT0, "BFM","Grandslam Casino (Bellfruit) (Scorpion 4) (set 15)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gcclbp ,sc4gcclb, sc4, sc4gcclbl, sc4_state, sc4gcclb_mbus, ROT0, "BFM","Grandslam Casino (Bellfruit) (Scorpion 4) (set 16)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR7149 GRAND CASINO GRAND CASINO CLUB PR6934 SLM2 SOUNDS11 GRAND CASINO
-GAMEL( 200?, sc4gcclbo ,sc4gcclb, sc4, sc4gcclbl, sc4_state, sc4gcclb_mbus, ROT0, "BFM","Grandslam Casino (Bellfruit) (Scorpion 4) (set 17)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gcclbq ,sc4gcclb, sc4, sc4gcclbl, sc4_state, sc4gcclb_mbus, ROT0, "BFM","Grandslam Casino (Bellfruit) (Scorpion 4) (set 18)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4gcclbo ,sc4gcclb, sc4, sc4gcclbl, sc4_state, sc4gcclb_mbus, ROT0, "BFM","Grandslam Casino (Bellfruit) (Scorpion 4) (set 17)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gcclbq ,sc4gcclb, sc4, sc4gcclbl, sc4_state, sc4gcclb_mbus, ROT0, "BFM","Grandslam Casino (Bellfruit) (Scorpion 4) (set 18)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4botn)
@@ -23829,8 +23831,8 @@ INPUT_PORTS_START( sc4botn ) // this structure is generated
INPUT_PORTS_END
// PR2538 BACK OF THE NET V011 BACKOFTHENETSND BACK OF THE NET
-GAMEL( 200?, sc4botn ,0, sc4_4reel, sc4botn, sc4_state, sc4botn, ROT0, "Qps","Back Of The Net (Qps) (Scorpion 4) (set 1, 011)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4botna ,sc4botn, sc4_4reel, sc4botn, sc4_state, sc4botn, ROT0, "Qps","Back Of The Net (Qps) (Scorpion 4) (set 2, 011)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4botn ,0, sc4_4reel, sc4botn, sc4_state, sc4botn, ROT0, "Qps","Back Of The Net (Qps) (Scorpion 4) (set 1, 011)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4botna ,sc4botn, sc4_4reel, sc4botn, sc4_state, sc4botn, ROT0, "Qps","Back Of The Net (Qps) (Scorpion 4) (set 2, 011)", MACHINE_FLAGS, layout_bfm_sc4 )
//fourth reel is tested strangely
@@ -23893,13 +23895,13 @@ INPUT_PORTS_END
// doesn't play
// PRXXXX CLUB BANKETY BANK VER1.0 CLUBBANKSND CLUB BANKETYBANK
-GAMEL( 200?, sc4bbclb ,0, sc4_200_std, sc4bbclb, sc4_state, sc4bbclb, ROT0, "Qps","Bankety Bank Club (V1.0) (Qps) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4bbclb ,0, sc4_200_std, sc4bbclb, sc4_state, sc4bbclb, ROT0, "Qps","Bankety Bank Club (V1.0) (Qps) (Scorpion 4)", MACHINE_FLAGS, layout_bfm_sc4 )
// PRXXXX CLUB BANKETY BANK VER1.1 CLUBBANKSND CLUB BANKETYBANK
-GAMEL( 200?, sc4bbclba ,sc4bbclb, sc4_200_std, sc4bbclb, sc4_state, sc4bbclb, ROT0, "Qps","Bankety Bank Club (V1.1) (Qps) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4bbclba ,sc4bbclb, sc4_200_std, sc4bbclb, sc4_state, sc4bbclb, ROT0, "Qps","Bankety Bank Club (V1.1) (Qps) (Scorpion 4)", MACHINE_FLAGS, layout_bfm_sc4 )
// can be played
// PRXXXX CLUB BANKETY BANK 411 CLUBBANKSND CLUB BANKETYBANK
-GAMEL( 200?, sc4bbclbb ,sc4bbclb, sc4_200_std, sc4bbclb, sc4_state, sc4bbclb_mbus, ROT0, "Qps","Bankety Bank Club (V411) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bbclbc ,sc4bbclb, sc4_200_std, sc4bbclb, sc4_state, sc4bbclb_mbus, ROT0, "Qps","Bankety Bank Club (V411) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4bbclbb ,sc4bbclb, sc4_200_std, sc4bbclb, sc4_state, sc4bbclb_mbus, ROT0, "Qps","Bankety Bank Club (V411) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bbclbc ,sc4bbclb, sc4_200_std, sc4bbclb, sc4_state, sc4bbclb_mbus, ROT0, "Qps","Bankety Bank Club (V411) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4captn)
@@ -23955,14 +23957,14 @@ INPUT_PORTS_START( sc4captn ) // this structure is generated
INPUT_PORTS_END
// PR2013 CAPTAIN CASH CCASH SOUNDS CAPTAIN CASH
-GAMEL( 200?, sc4captn ,0, sc4_4reel, sc4captn, sc4_state, sc4captn, ROT0, "Qps","Captain Cash (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4captnb ,sc4captn, sc4_4reel, sc4captn, sc4_state, sc4captn, ROT0, "Qps","Captain Cash (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4captnc ,sc4captn, sc4_4reel, sc4captn, sc4_state, sc4captn, ROT0, "Qps","Captain Cash (Qps) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4captn ,0, sc4_4reel, sc4captn, sc4_state, sc4captn, ROT0, "Qps","Captain Cash (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4captnb ,sc4captn, sc4_4reel, sc4captn, sc4_state, sc4captn, ROT0, "Qps","Captain Cash (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4captnc ,sc4captn, sc4_4reel, sc4captn, sc4_state, sc4captn, ROT0, "Qps","Captain Cash (Qps) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR9999 CAPTAIN CASH CCASH SOUNDS CAPTAIN CASH (invalid project number)
-GAMEL( 200?, sc4captna ,sc4captn, sc4_4reel, sc4captn, sc4_state, sc4captn, ROT0, "Qps","Captain Cash (Qps) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4captnd ,sc4captn, sc4_4reel, sc4captn, sc4_state, sc4captn, ROT0, "Qps","Captain Cash (Qps) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4captne ,sc4captn, sc4_4reel, sc4captn, sc4_state, sc4captn, ROT0, "Qps","Captain Cash (Qps) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4captnf ,sc4captn, sc4_4reel, sc4captn, sc4_state, sc4captn, ROT0, "Qps","Captain Cash (Qps) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4captna ,sc4captn, sc4_4reel, sc4captn, sc4_state, sc4captn, ROT0, "Qps","Captain Cash (Qps) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4captnd ,sc4captn, sc4_4reel, sc4captn, sc4_state, sc4captn, ROT0, "Qps","Captain Cash (Qps) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4captne ,sc4captn, sc4_4reel, sc4captn, sc4_state, sc4captn, ROT0, "Qps","Captain Cash (Qps) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4captnf ,sc4captn, sc4_4reel, sc4captn, sc4_state, sc4captn, ROT0, "Qps","Captain Cash (Qps) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4cmous)
@@ -24017,11 +24019,11 @@ INPUT_PORTS_START( sc4cmous ) // this structure is generated
INPUT_PORTS_END
// PR2534 CASH AND MOUSE V041 CASHANDMOUSESND CASH AND MOUSE
-GAMEL( 200?, sc4cmous ,0, sc4_5reel, sc4cmous, sc4_state, sc4cmous, ROT0, "Qps","Cash & Mouse (V041) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cmousb ,sc4cmous, sc4_5reel, sc4cmous, sc4_state, sc4cmous, ROT0, "Qps","Cash & Mouse (V041) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cmous ,0, sc4_5reel, sc4cmous, sc4_state, sc4cmous, ROT0, "Qps","Cash & Mouse (V041) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cmousb ,sc4cmous, sc4_5reel, sc4cmous, sc4_state, sc4cmous, ROT0, "Qps","Cash & Mouse (V041) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2534 CASH AND MOUSE V011 CASHANDMOUSESND CASH AND MOUSE
-GAMEL( 200?, sc4cmousa ,sc4cmous, sc4_5reel, sc4cmous, sc4_state, sc4cmous, ROT0, "Qps","Cash & Mouse (V011) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cmousc ,sc4cmous, sc4_5reel, sc4cmous, sc4_state, sc4cmous, ROT0, "Qps","Cash & Mouse (V011) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cmousa ,sc4cmous, sc4_5reel, sc4cmous, sc4_state, sc4cmous, ROT0, "Qps","Cash & Mouse (V011) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cmousc ,sc4cmous, sc4_5reel, sc4cmous, sc4_state, sc4cmous, ROT0, "Qps","Cash & Mouse (V011) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -24082,31 +24084,31 @@ INPUT_PORTS_START( sc4cad ) // this structure is generated
INPUT_PORTS_END
// PR2528 CASH ADDER V1.0 CASHADDERSND CASH ADDER
-GAMEL( 200?, sc4cad ,0, sc4_5reel, sc4cad, sc4_state, sc4cad, ROT0, "Qps","Cash Adder (V1.0) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cada ,sc4cad, sc4_5reel, sc4cad, sc4_state, sc4cad, ROT0, "Qps","Cash Adder (V1.0) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cadf ,sc4cad, sc4_5reel, sc4cad, sc4_state, sc4cad, ROT0, "Qps","Cash Adder (V1.0) (Qps) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cadg ,sc4cad, sc4_5reel, sc4cad, sc4_state, sc4cad, ROT0, "Qps","Cash Adder (V1.0) (Qps) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cad ,0, sc4_5reel, sc4cad, sc4_state, sc4cad, ROT0, "Qps","Cash Adder (V1.0) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cada ,sc4cad, sc4_5reel, sc4cad, sc4_state, sc4cad, ROT0, "Qps","Cash Adder (V1.0) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cadf ,sc4cad, sc4_5reel, sc4cad, sc4_state, sc4cad, ROT0, "Qps","Cash Adder (V1.0) (Qps) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cadg ,sc4cad, sc4_5reel, sc4cad, sc4_state, sc4cad, ROT0, "Qps","Cash Adder (V1.0) (Qps) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2528 CASH ADDER 011 CASHADDERSND CASH ADDER
-GAMEL( 200?, sc4cadb ,sc4cad, sc4_5reel, sc4cad, sc4_state, sc4cad_mbus, ROT0, "Qps","Cash Adder (V011) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cadh ,sc4cad, sc4_5reel, sc4cad, sc4_state, sc4cad_mbus, ROT0, "Qps","Cash Adder (V011) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cadb ,sc4cad, sc4_5reel, sc4cad, sc4_state, sc4cad_mbus, ROT0, "Qps","Cash Adder (V011) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cadh ,sc4cad, sc4_5reel, sc4cad, sc4_state, sc4cad_mbus, ROT0, "Qps","Cash Adder (V011) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2528 CASH ADDER 041 CASHADDERSND CASH ADDER
-GAMEL( 200?, sc4cadc ,sc4cad, sc4_5reel, sc4cad, sc4_state, sc4cad_mbus, ROT0, "Qps","Cash Adder (V041) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cadi ,sc4cad, sc4_5reel, sc4cad, sc4_state, sc4cad_mbus, ROT0, "Qps","Cash Adder (V041) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cadc ,sc4cad, sc4_5reel, sc4cad, sc4_state, sc4cad_mbus, ROT0, "Qps","Cash Adder (V041) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cadi ,sc4cad, sc4_5reel, sc4cad, sc4_state, sc4cad_mbus, ROT0, "Qps","Cash Adder (V041) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2528 CASH ADDER 012 CASHADDERSND CASH ADDER
-GAMEL( 200?, sc4cadd ,sc4cad, sc4_5reel, sc4cad, sc4_state, sc4cad, ROT0, "Qps","Cash Adder (V012) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cadj ,sc4cad, sc4_5reel, sc4cad, sc4_state, sc4cad, ROT0, "Qps","Cash Adder (V012) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cadd ,sc4cad, sc4_5reel, sc4cad, sc4_state, sc4cad, ROT0, "Qps","Cash Adder (V012) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cadj ,sc4cad, sc4_5reel, sc4cad, sc4_state, sc4cad, ROT0, "Qps","Cash Adder (V012) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2528 CASH ADDER 042 CASHADDERSND CASH ADDER
-GAMEL( 200?, sc4cade ,sc4cad, sc4_5reel, sc4cad, sc4_state, sc4cad, ROT0, "Qps","Cash Adder (V042) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cadk ,sc4cad, sc4_5reel, sc4cad, sc4_state, sc4cad, ROT0, "Qps","Cash Adder (V042) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cade ,sc4cad, sc4_5reel, sc4cad, sc4_state, sc4cad, ROT0, "Qps","Cash Adder (V042) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cadk ,sc4cad, sc4_5reel, sc4cad, sc4_state, sc4cad, ROT0, "Qps","Cash Adder (V042) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2528 CASH ADDER 013 CASHADDERSND CASH ADDER
-GAMEL( 200?, sc4cadl ,sc4cad, sc4_5reel, sc4cad, sc4_state, sc4cad, ROT0, "Qps","Cash Adder (V013) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cadm ,sc4cad, sc4_5reel, sc4cad, sc4_state, sc4cad, ROT0, "Qps","Cash Adder (V013) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cadl ,sc4cad, sc4_5reel, sc4cad, sc4_state, sc4cad, ROT0, "Qps","Cash Adder (V013) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cadm ,sc4cad, sc4_5reel, sc4cad, sc4_state, sc4cad, ROT0, "Qps","Cash Adder (V013) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2528 CASH ADDER 014 CASHADDERSND CASH ADDER
-GAMEL( 200?, sc4cadn ,sc4cad, sc4_5reel, sc4cad, sc4_state, sc4cad, ROT0, "Qps","Cash Adder (V014) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cadp ,sc4cad, sc4_5reel, sc4cad, sc4_state, sc4cad, ROT0, "Qps","Cash Adder (V014) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cadn ,sc4cad, sc4_5reel, sc4cad, sc4_state, sc4cad, ROT0, "Qps","Cash Adder (V014) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cadp ,sc4cad, sc4_5reel, sc4cad, sc4_state, sc4cad, ROT0, "Qps","Cash Adder (V014) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2528 CASH ADDER 043 CASHADDERSND CASH ADDER
-GAMEL( 200?, sc4cado ,sc4cad, sc4_5reel, sc4cad, sc4_state, sc4cad, ROT0, "Qps","Cash Adder (V043) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cadq ,sc4cad, sc4_5reel, sc4cad, sc4_state, sc4cad, ROT0, "Qps","Cash Adder (V043) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cado ,sc4cad, sc4_5reel, sc4cad, sc4_state, sc4cad, ROT0, "Qps","Cash Adder (V043) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cadq ,sc4cad, sc4_5reel, sc4cad, sc4_state, sc4cad, ROT0, "Qps","Cash Adder (V043) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4cadcl)
{
@@ -24162,8 +24164,8 @@ INPUT_PORTS_START( sc4cadcl ) // this structure is generated
INPUT_PORTS_END
// PRXXXX QPS155 CLUB CASH ADDER Version 411 CLUBCASHADDERSND CLUB CASH ADDER
-GAMEL( 200?, sc4cadcl ,0, sc4_5reel, sc4cadcl, sc4_state, sc4cadcl, ROT0, "Qps","Cash Adder Club (411) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cadcla ,sc4cadcl, sc4_5reel, sc4cadcl, sc4_state, sc4cadcl, ROT0, "Qps","Cash Adder Club (411) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cadcl ,0, sc4_5reel, sc4cadcl, sc4_state, sc4cadcl, ROT0, "Qps","Cash Adder Club (411) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cadcla ,sc4cadcl, sc4_5reel, sc4cadcl, sc4_state, sc4cadcl, ROT0, "Qps","Cash Adder Club (411) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4cr)
@@ -24222,15 +24224,15 @@ INPUT_PORTS_END
// PR2061 CASHRAKER RAKERSND CASHRAKER
-GAMEL( 200?, sc4cr ,0, sc4_4reel_alt, sc4cr, sc4_state, sc4cr, ROT0, "Qps","Cash Raker (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cra ,sc4cr, sc4_4reel_alt, sc4cr, sc4_state, sc4cr, ROT0, "Qps","Cash Raker (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crb ,sc4cr, sc4_4reel_alt, sc4cr, sc4_state, sc4cr, ROT0, "Qps","Cash Raker (Qps) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cr ,0, sc4_4reel_alt, sc4cr, sc4_state, sc4cr, ROT0, "Qps","Cash Raker (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cra ,sc4cr, sc4_4reel_alt, sc4cr, sc4_state, sc4cr, ROT0, "Qps","Cash Raker (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crb ,sc4cr, sc4_4reel_alt, sc4cr, sc4_state, sc4cr, ROT0, "Qps","Cash Raker (Qps) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2061 CASHRAKER V2.1 RAKERSND CASHRAKER
-GAMEL( 200?, sc4crc ,sc4cr, sc4_4reel_alt, sc4cr, sc4_state, sc4cr, ROT0, "Qps","Cash Raker (V2.1) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cre ,sc4cr, sc4_4reel_alt, sc4cr, sc4_state, sc4cr, ROT0, "Qps","Cash Raker (V2.1) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4crc ,sc4cr, sc4_4reel_alt, sc4cr, sc4_state, sc4cr, ROT0, "Qps","Cash Raker (V2.1) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cre ,sc4cr, sc4_4reel_alt, sc4cr, sc4_state, sc4cr, ROT0, "Qps","Cash Raker (V2.1) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2061 CASHRAKER V2.2 RAKERSND CASHRAKER
-GAMEL( 200?, sc4crd ,sc4cr, sc4_4reel_alt, sc4cr, sc4_state, sc4cr, ROT0, "Qps","Cash Raker (V2.2) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crf ,sc4cr, sc4_4reel_alt, sc4cr, sc4_state, sc4cr, ROT0, "Qps","Cash Raker (V2.2) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4crd ,sc4cr, sc4_4reel_alt, sc4cr, sc4_state, sc4cr, ROT0, "Qps","Cash Raker (V2.2) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crf ,sc4cr, sc4_4reel_alt, sc4cr, sc4_state, sc4cr, ROT0, "Qps","Cash Raker (V2.2) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -24293,16 +24295,16 @@ INPUT_PORTS_START( sc4crcl ) // this structure is generated
INPUT_PORTS_END
// PR???? CLUB CASHRAKER V1.0 CLUBRAKERSND CLUB CASHRAKER
-GAMEL( 200?, sc4crcl ,0, sc4_5reel, sc4crcl, sc4_state, sc4crcl, ROT0, "Qps","Cash Raker Club (V1.0) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crclb ,sc4crcl, sc4_5reel, sc4crcl, sc4_state, sc4crcl, ROT0, "Qps","Cash Raker Club (V1.0) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4crcl ,0, sc4_5reel, sc4crcl, sc4_state, sc4crcl, ROT0, "Qps","Cash Raker Club (V1.0) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crclb ,sc4crcl, sc4_5reel, sc4crcl, sc4_state, sc4crcl, ROT0, "Qps","Cash Raker Club (V1.0) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR???? CLUB CASHRAKER V1.1 CLUBRAKERSND CLUB CASHRAKER
-GAMEL( 200?, sc4crcla ,sc4crcl, sc4_5reel, sc4crcl, sc4_state, sc4crcl, ROT0, "Qps","Cash Raker Club (V1.1) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crclc ,sc4crcl, sc4_5reel, sc4crcl, sc4_state, sc4crcl, ROT0, "Qps","Cash Raker Club (V1.1) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4crcla ,sc4crcl, sc4_5reel, sc4crcl, sc4_state, sc4crcl, ROT0, "Qps","Cash Raker Club (V1.1) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crclc ,sc4crcl, sc4_5reel, sc4crcl, sc4_state, sc4crcl, ROT0, "Qps","Cash Raker Club (V1.1) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR???? CLUB CASHRAKER V1.3 CLUBRAKERSND CLUB CASHRAKER
-GAMEL( 200?, sc4crcld ,sc4crcl, sc4_5reel, sc4crcl, sc4_state, sc4crcl, ROT0, "Qps","Cash Raker Club (V1.3) (Qps) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4crcld ,sc4crcl, sc4_5reel, sc4crcl, sc4_state, sc4crcl, ROT0, "Qps","Cash Raker Club (V1.3) (Qps) (Scorpion 4)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR???? CLUB CASHRAKER 411 CLUBRAKERSND CLUB CASHRAKER
-GAMEL( 200?, sc4crcle ,sc4crcl, sc4_5reel, sc4crcl, sc4_state, sc4crcl_mbus, ROT0, "Qps","Cash Raker Club (411) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crclf ,sc4crcl, sc4_5reel, sc4crcl, sc4_state, sc4crcl_mbus, ROT0, "Qps","Cash Raker Club (411) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4crcle ,sc4crcl, sc4_5reel, sc4crcl, sc4_state, sc4crcl_mbus, ROT0, "Qps","Cash Raker Club (411) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crclf ,sc4crcl, sc4_5reel, sc4crcl, sc4_state, sc4crcl_mbus, ROT0, "Qps","Cash Raker Club (411) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4cashm)
@@ -24351,12 +24353,12 @@ INPUT_PORTS_START( sc4cashm ) // this structure is generated
INPUT_PORTS_END
// PR2008 CASHANOVA CASH SOUNDS
-GAMEL( 200?, sc4cashm ,0, sc4_4reel, sc4cashm, sc4_state, sc4cashm, ROT0, "Mazooma","Cashanova (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cashma ,sc4cashm, sc4_4reel, sc4cashm, sc4_state, sc4cashm, ROT0, "Mazooma","Cashanova (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cashmb ,sc4cashm, sc4_4reel, sc4cashm, sc4_state, sc4cashm, ROT0, "Mazooma","Cashanova (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cashmc ,sc4cashm, sc4_4reel, sc4cashm, sc4_state, sc4cashm, ROT0, "Mazooma","Cashanova (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cashmd ,sc4cashm, sc4_4reel, sc4cashm, sc4_state, sc4cashm, ROT0, "Mazooma","Cashanova (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cashme ,sc4cashm, sc4_4reel, sc4cashm, sc4_state, sc4cashm, ROT0, "Mazooma","Cashanova (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cashm ,0, sc4_4reel, sc4cashm, sc4_state, sc4cashm, ROT0, "Mazooma","Cashanova (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cashma ,sc4cashm, sc4_4reel, sc4cashm, sc4_state, sc4cashm, ROT0, "Mazooma","Cashanova (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cashmb ,sc4cashm, sc4_4reel, sc4cashm, sc4_state, sc4cashm, ROT0, "Mazooma","Cashanova (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cashmc ,sc4cashm, sc4_4reel, sc4cashm, sc4_state, sc4cashm, ROT0, "Mazooma","Cashanova (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cashmd ,sc4cashm, sc4_4reel, sc4cashm, sc4_state, sc4cashm, ROT0, "Mazooma","Cashanova (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cashme ,sc4cashm, sc4_4reel, sc4cashm, sc4_state, sc4cashm, ROT0, "Mazooma","Cashanova (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -24434,15 +24436,15 @@ INPUT_PORTS_END
// this seems to need all the units connected to function
// PR2360 CASINO KING X BARKX SOUNDS 8 KING X
-GAMEL( 200?, sc4ckx ,0, sc4_3reel_200, sc4, sc4_state, sc4ckxtb, ROT0, "Mazooma","Casino King X (Mazooma) (Scorpion 4) (Top Box, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // Top Box
-GAMEL( 200?, sc4ckxd ,sc4ckx, sc4_3reel_200, sc4, sc4_state, sc4ckxtb, ROT0, "Mazooma","Casino King X (Mazooma) (Scorpion 4) (Top Box, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // Top Box
+GAMEL( 200?, sc4ckx ,0, sc4_3reel_200, sc4, sc4_state, sc4ckxtb, ROT0, "Mazooma","Casino King X (Mazooma) (Scorpion 4) (Top Box, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // Top Box
+GAMEL( 200?, sc4ckxd ,sc4ckx, sc4_3reel_200, sc4, sc4_state, sc4ckxtb, ROT0, "Mazooma","Casino King X (Mazooma) (Scorpion 4) (Top Box, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // Top Box
// PR2360 CASINO KING X KING X MAZ BARKX SOUNDS KING X 3P
-GAMEL( 200?, sc4ckxa ,sc4ckx, sc4_3reel_200, sc4ckxg, sc4_state, sc4ckx3p, ROT0, "Mazooma","Casino King X (Mazooma) (Scorpion 4) (Base, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ckxb ,sc4ckx, sc4_3reel_200, sc4ckxg, sc4_state, sc4ckx3p, ROT0, "Mazooma","Casino King X (Mazooma) (Scorpion 4) (Base, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ckxc ,sc4ckx, sc4_3reel_200, sc4ckxg, sc4_state, sc4ckx3p, ROT0, "Mazooma","Casino King X (Mazooma) (Scorpion 4) (Base, set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ckxe ,sc4ckx, sc4_3reel_200, sc4ckxg, sc4_state, sc4ckx3p, ROT0, "Mazooma","Casino King X (Mazooma) (Scorpion 4) (Base, set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ckxf ,sc4ckx, sc4_3reel_200, sc4ckxg, sc4_state, sc4ckx3p, ROT0, "Mazooma","Casino King X (Mazooma) (Scorpion 4) (Base, set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ckxg ,sc4ckx, sc4_3reel_200, sc4ckxg, sc4_state, sc4ckx3p, ROT0, "Mazooma","Casino King X (Mazooma) (Scorpion 4) (Base, set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4ckxa ,sc4ckx, sc4_3reel_200, sc4ckxg, sc4_state, sc4ckx3p, ROT0, "Mazooma","Casino King X (Mazooma) (Scorpion 4) (Base, set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ckxb ,sc4ckx, sc4_3reel_200, sc4ckxg, sc4_state, sc4ckx3p, ROT0, "Mazooma","Casino King X (Mazooma) (Scorpion 4) (Base, set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ckxc ,sc4ckx, sc4_3reel_200, sc4ckxg, sc4_state, sc4ckx3p, ROT0, "Mazooma","Casino King X (Mazooma) (Scorpion 4) (Base, set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ckxe ,sc4ckx, sc4_3reel_200, sc4ckxg, sc4_state, sc4ckx3p, ROT0, "Mazooma","Casino King X (Mazooma) (Scorpion 4) (Base, set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ckxf ,sc4ckx, sc4_3reel_200, sc4ckxg, sc4_state, sc4ckx3p, ROT0, "Mazooma","Casino King X (Mazooma) (Scorpion 4) (Base, set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ckxg ,sc4ckx, sc4_3reel_200, sc4ckxg, sc4_state, sc4ckx3p, ROT0, "Mazooma","Casino King X (Mazooma) (Scorpion 4) (Base, set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4chick)
@@ -24491,7 +24493,7 @@ INPUT_PORTS_START( sc4chick ) // this structure is generated
INPUT_PORTS_END
// PR7060CASINO CHICKEN DALES TTTWO SOUNDS CHICKEN DALES
-GAMEL( 200?, sc4chick ,0, sc4_3reel, sc4chick, sc4_state, sc4chick, ROT0, "Mazooma","Chickendales (Mazooma) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4chick ,0, sc4_3reel, sc4chick, sc4_state, sc4chick, ROT0, "Mazooma","Chickendales (Mazooma) (Scorpion 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4ccogs)
@@ -24546,7 +24548,7 @@ INPUT_PORTS_START( sc4ccogs ) // this structure is generated
INPUT_PORTS_END
// PR2522 CLEVERCOGS V1.0 CLEVERCOGSSND CLEVER COGS
-GAMEL( 200?, sc4ccogs ,0, sc4_4reel, sc4ccogs, sc4_state, sc4ccogs, ROT0, "Qps","Clever Cogs (Qps) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4ccogs ,0, sc4_4reel, sc4ccogs, sc4_state, sc4ccogs, ROT0, "Qps","Clever Cogs (Qps) (Scorpion 4)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -24621,29 +24623,29 @@ INPUT_PORTS_START( sc4cclime ) // this structure is generated
INPUT_PORTS_END
// PR1129 CASINO CRAZY CLIMBER PR1129 CRAZY CLIMBER SOUNDS11
-GAMEL( 200?, sc4cclim ,0, sc4_3reel, sc4cclime, sc4_state, sc4cclim, ROT0, "BFM","Casino Crazy Climber (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cclima ,sc4cclim, sc4_3reel, sc4cclime, sc4_state, sc4cclim, ROT0, "BFM","Casino Crazy Climber (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cclimb ,sc4cclim, sc4_3reel, sc4cclime, sc4_state, sc4cclim, ROT0, "BFM","Casino Crazy Climber (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cclimc ,sc4cclim, sc4_3reel, sc4cclime, sc4_state, sc4cclim, ROT0, "BFM","Casino Crazy Climber (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cclimd ,sc4cclim, sc4_3reel, sc4cclime, sc4_state, sc4cclim, ROT0, "BFM","Casino Crazy Climber (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cclimh ,sc4cclim, sc4_3reel, sc4cclime, sc4_state, sc4cclim, ROT0, "BFM","Casino Crazy Climber (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cclimi ,sc4cclim, sc4_3reel, sc4cclime, sc4_state, sc4cclim, ROT0, "BFM","Casino Crazy Climber (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cclimm ,sc4cclim, sc4_3reel, sc4cclime, sc4_state, sc4cclim, ROT0, "BFM","Casino Crazy Climber (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cclimn ,sc4cclim, sc4_3reel, sc4cclime, sc4_state, sc4cclim, ROT0, "BFM","Casino Crazy Climber (Bellfruit) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cclimo ,sc4cclim, sc4_3reel, sc4cclime, sc4_state, sc4cclim, ROT0, "BFM","Casino Crazy Climber (Bellfruit) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cclimp ,sc4cclim, sc4_3reel, sc4cclime, sc4_state, sc4cclim, ROT0, "BFM","Casino Crazy Climber (Bellfruit) (Scorpion 4) (set 11)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cclims ,sc4cclim, sc4_3reel, sc4cclime, sc4_state, sc4cclim, ROT0, "BFM","Casino Crazy Climber (Bellfruit) (Scorpion 4) (set 12)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cclim ,0, sc4_3reel, sc4cclime, sc4_state, sc4cclim, ROT0, "BFM","Casino Crazy Climber (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cclima ,sc4cclim, sc4_3reel, sc4cclime, sc4_state, sc4cclim, ROT0, "BFM","Casino Crazy Climber (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cclimb ,sc4cclim, sc4_3reel, sc4cclime, sc4_state, sc4cclim, ROT0, "BFM","Casino Crazy Climber (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cclimc ,sc4cclim, sc4_3reel, sc4cclime, sc4_state, sc4cclim, ROT0, "BFM","Casino Crazy Climber (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cclimd ,sc4cclim, sc4_3reel, sc4cclime, sc4_state, sc4cclim, ROT0, "BFM","Casino Crazy Climber (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cclimh ,sc4cclim, sc4_3reel, sc4cclime, sc4_state, sc4cclim, ROT0, "BFM","Casino Crazy Climber (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cclimi ,sc4cclim, sc4_3reel, sc4cclime, sc4_state, sc4cclim, ROT0, "BFM","Casino Crazy Climber (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cclimm ,sc4cclim, sc4_3reel, sc4cclime, sc4_state, sc4cclim, ROT0, "BFM","Casino Crazy Climber (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cclimn ,sc4cclim, sc4_3reel, sc4cclime, sc4_state, sc4cclim, ROT0, "BFM","Casino Crazy Climber (Bellfruit) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cclimo ,sc4cclim, sc4_3reel, sc4cclime, sc4_state, sc4cclim, ROT0, "BFM","Casino Crazy Climber (Bellfruit) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cclimp ,sc4cclim, sc4_3reel, sc4cclime, sc4_state, sc4cclim, ROT0, "BFM","Casino Crazy Climber (Bellfruit) (Scorpion 4) (set 11)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cclims ,sc4cclim, sc4_3reel, sc4cclime, sc4_state, sc4cclim, ROT0, "BFM","Casino Crazy Climber (Bellfruit) (Scorpion 4) (set 12)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR1129 CASINO CRAZY CLIMBER CRAZY CLIMBER S.SITE PR1129 CRAZY CLIMBER SOUNDS11
-GAMEL( 200?, sc4cclime ,sc4cclim, sc4_3reel, sc4cclime, sc4_state, sc4cclim_mbus, ROT0, "BFM","Casino Crazy Climber (Bellfruit) (Scorpion 4) (set 13)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cclimf ,sc4cclim, sc4_3reel, sc4cclime, sc4_state, sc4cclim_mbus, ROT0, "BFM","Casino Crazy Climber (Bellfruit) (Scorpion 4) (set 14)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cclimg ,sc4cclim, sc4_3reel, sc4cclime, sc4_state, sc4cclim_mbus, ROT0, "BFM","Casino Crazy Climber (Bellfruit) (Scorpion 4) (set 15)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cclimj ,sc4cclim, sc4_3reel, sc4cclime, sc4_state, sc4cclim_mbus, ROT0, "BFM","Casino Crazy Climber (Bellfruit) (Scorpion 4) (set 16)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cclimk ,sc4cclim, sc4_3reel, sc4cclime, sc4_state, sc4cclim_mbus, ROT0, "BFM","Casino Crazy Climber (Bellfruit) (Scorpion 4) (set 17)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ccliml ,sc4cclim, sc4_3reel, sc4cclime, sc4_state, sc4cclim_mbus, ROT0, "BFM","Casino Crazy Climber (Bellfruit) (Scorpion 4) (set 18)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cclimq ,sc4cclim, sc4_3reel, sc4cclime, sc4_state, sc4cclim_mbus, ROT0, "BFM","Casino Crazy Climber (Bellfruit) (Scorpion 4) (set 19)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cclimr ,sc4cclim, sc4_3reel, sc4cclime, sc4_state, sc4cclim_mbus, ROT0, "BFM","Casino Crazy Climber (Bellfruit) (Scorpion 4) (set 20)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cclimt ,sc4cclim, sc4_3reel, sc4cclime, sc4_state, sc4cclim_mbus, ROT0, "BFM","Casino Crazy Climber (Bellfruit) (Scorpion 4) (set 21)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cclimu ,sc4cclim, sc4_3reel, sc4cclime, sc4_state, sc4cclim_mbus, ROT0, "BFM","Casino Crazy Climber (Bellfruit) (Scorpion 4) (set 22)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cclime ,sc4cclim, sc4_3reel, sc4cclime, sc4_state, sc4cclim_mbus, ROT0, "BFM","Casino Crazy Climber (Bellfruit) (Scorpion 4) (set 13)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cclimf ,sc4cclim, sc4_3reel, sc4cclime, sc4_state, sc4cclim_mbus, ROT0, "BFM","Casino Crazy Climber (Bellfruit) (Scorpion 4) (set 14)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cclimg ,sc4cclim, sc4_3reel, sc4cclime, sc4_state, sc4cclim_mbus, ROT0, "BFM","Casino Crazy Climber (Bellfruit) (Scorpion 4) (set 15)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cclimj ,sc4cclim, sc4_3reel, sc4cclime, sc4_state, sc4cclim_mbus, ROT0, "BFM","Casino Crazy Climber (Bellfruit) (Scorpion 4) (set 16)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cclimk ,sc4cclim, sc4_3reel, sc4cclime, sc4_state, sc4cclim_mbus, ROT0, "BFM","Casino Crazy Climber (Bellfruit) (Scorpion 4) (set 17)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ccliml ,sc4cclim, sc4_3reel, sc4cclime, sc4_state, sc4cclim_mbus, ROT0, "BFM","Casino Crazy Climber (Bellfruit) (Scorpion 4) (set 18)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cclimq ,sc4cclim, sc4_3reel, sc4cclime, sc4_state, sc4cclim_mbus, ROT0, "BFM","Casino Crazy Climber (Bellfruit) (Scorpion 4) (set 19)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cclimr ,sc4cclim, sc4_3reel, sc4cclime, sc4_state, sc4cclim_mbus, ROT0, "BFM","Casino Crazy Climber (Bellfruit) (Scorpion 4) (set 20)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cclimt ,sc4cclim, sc4_3reel, sc4cclime, sc4_state, sc4cclim_mbus, ROT0, "BFM","Casino Crazy Climber (Bellfruit) (Scorpion 4) (set 21)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cclimu ,sc4cclim, sc4_3reel, sc4cclime, sc4_state, sc4cclim_mbus, ROT0, "BFM","Casino Crazy Climber (Bellfruit) (Scorpion 4) (set 22)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -24710,36 +24712,36 @@ INPUT_PORTS_END
// PR6813 CRAZY FRUITS PR6813 CRAZY FRUITS SOUNDS11
// these 3 have a unique attract style
-GAMEL( 200?, sc4cfqps ,0, sc4_4reel, sc4cfqpsf, sc4_state, sc4cfqps, ROT0, "Qps","Crazy Fruits (PR6813, CRFR) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfqpsb ,sc4cfqps, sc4_4reel, sc4cfqpsf, sc4_state, sc4cfqps, ROT0, "Qps","Crazy Fruits (PR6813, CRFR) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfqpsd ,sc4cfqps, sc4_4reel, sc4cfqpsf, sc4_state, sc4cfqps, ROT0, "Qps","Crazy Fruits (PR6813, CRFR) (Qps) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfqps ,0, sc4_4reel, sc4cfqpsf, sc4_state, sc4cfqps, ROT0, "Qps","Crazy Fruits (PR6813, CRFR) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfqpsb ,sc4cfqps, sc4_4reel, sc4cfqpsf, sc4_state, sc4cfqps, ROT0, "Qps","Crazy Fruits (PR6813, CRFR) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfqpsd ,sc4cfqps, sc4_4reel, sc4cfqpsf, sc4_state, sc4cfqps, ROT0, "Qps","Crazy Fruits (PR6813, CRFR) (Qps) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
// the attract style changes below
-GAMEL( 200?, sc4cfqpsa ,sc4cfqps, sc4_4reel, sc4cfqpsf, sc4_state, sc4cfqps, ROT0, "Qps","Crazy Fruits (PR6813, CRFR) (Qps) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfqpsk ,sc4cfqps, sc4_4reel, sc4cfqpsf, sc4_state, sc4cfqps, ROT0, "Qps","Crazy Fruits (PR6813, CCAS) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // why are these 2 CCAS? a mistake? or different version?
-GAMEL( 200?, sc4czfrc ,sc4cfqps, sc4_4reel, sc4cfqpsf, sc4_state, sc4cfqps, ROT0, "Qps","Crazy Fruits (PR6813, CCAS) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4czfrb ,sc4cfqps, sc4_4reel, sc4cfqpsf, sc4_state, sc4cfqps, ROT0, "BFM","Crazy Fruits (PR6813, CRFR) (BFM) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4czfre ,sc4cfqps, sc4_4reel, sc4cfqpsf, sc4_state, sc4cfqps, ROT0, "BFM","Crazy Fruits (PR6813, CRFR) (BFM) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4czfrg ,sc4cfqps, sc4_4reel, sc4cfqpsf, sc4_state, sc4cfqps, ROT0, "BFM","Crazy Fruits (PR6813, CRFR) (BFM) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4czfrh ,sc4cfqps, sc4_4reel, sc4cfqpsf, sc4_state, sc4cfqps, ROT0, "BFM","Crazy Fruits (PR6813, CRFR) (BFM) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4czfrj ,sc4cfqps, sc4_4reel, sc4cfqpsf, sc4_state, sc4cfqps, ROT0, "BFM","Crazy Fruits (PR6813, CRFR) (BFM) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4czfrk ,sc4cfqps, sc4_4reel, sc4cfqpsf, sc4_state, sc4cfqps, ROT0, "BFM","Crazy Fruits (PR6813, CRFR) (BFM) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4czfrf ,sc4cfqps, sc4_4reel, sc4cfqpsf, sc4_state, sc4cfqps, ROT0, "BFM / Whitbread","Crazy Fruits (PR6813, CRFR) (BFM + Whitbread) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4czfri ,sc4cfqps, sc4_4reel, sc4cfqpsf, sc4_state, sc4cfqps, ROT0, "BFM / Whitbread","Crazy Fruits (PR6813, CRFR) (BFM + Whitbread) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfqpsa ,sc4cfqps, sc4_4reel, sc4cfqpsf, sc4_state, sc4cfqps, ROT0, "Qps","Crazy Fruits (PR6813, CRFR) (Qps) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfqpsk ,sc4cfqps, sc4_4reel, sc4cfqpsf, sc4_state, sc4cfqps, ROT0, "Qps","Crazy Fruits (PR6813, CCAS) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // why are these 2 CCAS? a mistake? or different version?
+GAMEL( 200?, sc4czfrc ,sc4cfqps, sc4_4reel, sc4cfqpsf, sc4_state, sc4cfqps, ROT0, "Qps","Crazy Fruits (PR6813, CCAS) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4czfrb ,sc4cfqps, sc4_4reel, sc4cfqpsf, sc4_state, sc4cfqps, ROT0, "BFM","Crazy Fruits (PR6813, CRFR) (BFM) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4czfre ,sc4cfqps, sc4_4reel, sc4cfqpsf, sc4_state, sc4cfqps, ROT0, "BFM","Crazy Fruits (PR6813, CRFR) (BFM) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4czfrg ,sc4cfqps, sc4_4reel, sc4cfqpsf, sc4_state, sc4cfqps, ROT0, "BFM","Crazy Fruits (PR6813, CRFR) (BFM) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4czfrh ,sc4cfqps, sc4_4reel, sc4cfqpsf, sc4_state, sc4cfqps, ROT0, "BFM","Crazy Fruits (PR6813, CRFR) (BFM) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4czfrj ,sc4cfqps, sc4_4reel, sc4cfqpsf, sc4_state, sc4cfqps, ROT0, "BFM","Crazy Fruits (PR6813, CRFR) (BFM) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4czfrk ,sc4cfqps, sc4_4reel, sc4cfqpsf, sc4_state, sc4cfqps, ROT0, "BFM","Crazy Fruits (PR6813, CRFR) (BFM) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4czfrf ,sc4cfqps, sc4_4reel, sc4cfqpsf, sc4_state, sc4cfqps, ROT0, "BFM / Whitbread","Crazy Fruits (PR6813, CRFR) (BFM + Whitbread) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4czfri ,sc4cfqps, sc4_4reel, sc4cfqpsf, sc4_state, sc4cfqps, ROT0, "BFM / Whitbread","Crazy Fruits (PR6813, CRFR) (BFM + Whitbread) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2521 CRAZY FRUITS V1.0 PR6813 CRAZY FRUITS SOUNDS11
-GAMEL( 200?, sc4cfqpsc ,sc4cfqps, sc4_4reel, sc4cfqpsf, sc4_state, sc4cfqps, ROT0, "Qps","Crazy Fruits V1.0 (PR2521, ECRZ) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfqpse ,sc4cfqps, sc4_4reel, sc4cfqpsf, sc4_state, sc4cfqps, ROT0, "Qps","Crazy Fruits V1.0 (PR2521, ECRZ) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfqpsc ,sc4cfqps, sc4_4reel, sc4cfqpsf, sc4_state, sc4cfqps, ROT0, "Qps","Crazy Fruits V1.0 (PR2521, ECRZ) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfqpse ,sc4cfqps, sc4_4reel, sc4cfqpsf, sc4_state, sc4cfqps, ROT0, "Qps","Crazy Fruits V1.0 (PR2521, ECRZ) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// 4 sets below use reels 1,2,3,5 instead of 1,2,3,4 ?!
-GAMEL( 200?, sc4cfqpsf ,sc4cfqps, sc4_4reel_alt, sc4cfqpsf, sc4_state, sc4cfqps_alt, ROT0, "Qps","Crazy Fruits V1.0 (PR2521, ECRZ) (Qps) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfqpsg ,sc4cfqps, sc4_4reel_alt, sc4cfqpsf, sc4_state, sc4cfqps_alt, ROT0, "Qps","Crazy Fruits V1.0 (PR2521, ECRZ) (Qps) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfqpsh ,sc4cfqps, sc4_4reel_alt, sc4cfqpsf, sc4_state, sc4cfqps_alt, ROT0, "Qps","Crazy Fruits V1.0 (PR2521, ECRZ) (Qps) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfqpsi ,sc4cfqps, sc4_4reel_alt, sc4cfqpsf, sc4_state, sc4cfqps_alt, ROT0, "Qps","Crazy Fruits V1.0 (PR2521, ECRZ) (Qps) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfqpsf ,sc4cfqps, sc4_4reel_alt, sc4cfqpsf, sc4_state, sc4cfqps_alt, ROT0, "Qps","Crazy Fruits V1.0 (PR2521, ECRZ) (Qps) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfqpsg ,sc4cfqps, sc4_4reel_alt, sc4cfqpsf, sc4_state, sc4cfqps_alt, ROT0, "Qps","Crazy Fruits V1.0 (PR2521, ECRZ) (Qps) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfqpsh ,sc4cfqps, sc4_4reel_alt, sc4cfqpsf, sc4_state, sc4cfqps_alt, ROT0, "Qps","Crazy Fruits V1.0 (PR2521, ECRZ) (Qps) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfqpsi ,sc4cfqps, sc4_4reel_alt, sc4cfqpsf, sc4_state, sc4cfqps_alt, ROT0, "Qps","Crazy Fruits V1.0 (PR2521, ECRZ) (Qps) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR4613 CRAZY FRUITS SP98 PR6813 CRAZY FRUITS SOUNDS11
-GAMEL( 200?, sc4cfqpsj ,sc4cfqps, sc4_4reel, sc4cfqpsf, sc4_state, sc4cfqps, ROT0, "Qps","Crazy Fruits SP98 (PR4613) (Qps) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfqpsl ,sc4cfqps, sc4_4reel, sc4cfqpsf, sc4_state, sc4cfqps, ROT0, "BFM","Crazy Fruits SP98 (PR4613) (BFM) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfqpsn ,sc4cfqps, sc4_4reel, sc4cfqpsf, sc4_state, sc4cfqps, ROT0, "BFM","Crazy Fruits SP98 (PR4613) (BFM) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfqpsp ,sc4cfqps, sc4_4reel, sc4cfqpsf, sc4_state, sc4cfqps, ROT0, "BFM","Crazy Fruits SP98 (PR4613) (BFM) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfqpsm ,sc4cfqps, sc4_4reel, sc4cfqpsf, sc4_state, sc4cfqps, ROT0, "BFM / Whitbread","Crazy Fruits SP98 (PR4613) (BFM / Whitbread) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfqpso ,sc4cfqps, sc4_4reel, sc4cfqpsf, sc4_state, sc4cfqps, ROT0, "BFM / Whitbread","Crazy Fruits SP98 (PR4613) (BFM / Whitbread) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfqpsj ,sc4cfqps, sc4_4reel, sc4cfqpsf, sc4_state, sc4cfqps, ROT0, "Qps","Crazy Fruits SP98 (PR4613) (Qps) (Scorpion 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfqpsl ,sc4cfqps, sc4_4reel, sc4cfqpsf, sc4_state, sc4cfqps, ROT0, "BFM","Crazy Fruits SP98 (PR4613) (BFM) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfqpsn ,sc4cfqps, sc4_4reel, sc4cfqpsf, sc4_state, sc4cfqps, ROT0, "BFM","Crazy Fruits SP98 (PR4613) (BFM) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfqpsp ,sc4cfqps, sc4_4reel, sc4cfqpsf, sc4_state, sc4cfqps, ROT0, "BFM","Crazy Fruits SP98 (PR4613) (BFM) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfqpsm ,sc4cfqps, sc4_4reel, sc4cfqpsf, sc4_state, sc4cfqps, ROT0, "BFM / Whitbread","Crazy Fruits SP98 (PR4613) (BFM / Whitbread) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfqpso ,sc4cfqps, sc4_4reel, sc4cfqpsf, sc4_state, sc4cfqps, ROT0, "BFM / Whitbread","Crazy Fruits SP98 (PR4613) (BFM / Whitbread) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -24814,31 +24816,31 @@ INPUT_PORTS_START( sc4crzkyi ) // this structure is generated
INPUT_PORTS_END
// PR1128 CASINO CRAZY KEYS PR1128 CRAZY KEYS SOUNDS11
-GAMEL( 200?, sc4crzky ,0, sc4_3reel, sc4crzkyi, sc4_state, sc4crzky, ROT0, "BFM","Casino Crazy Keys (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzkya ,sc4crzky, sc4_3reel, sc4crzkyi, sc4_state, sc4crzky, ROT0, "BFM","Casino Crazy Keys (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzkyb ,sc4crzky, sc4_3reel, sc4crzkyi, sc4_state, sc4crzky, ROT0, "BFM","Casino Crazy Keys (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzkyc ,sc4crzky, sc4_3reel, sc4crzkyi, sc4_state, sc4crzky, ROT0, "BFM","Casino Crazy Keys (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzkyd ,sc4crzky, sc4_3reel, sc4crzkyi, sc4_state, sc4crzky, ROT0, "BFM","Casino Crazy Keys (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzkye ,sc4crzky, sc4_3reel, sc4crzkyi, sc4_state, sc4crzky, ROT0, "BFM","Casino Crazy Keys (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzkyf ,sc4crzky, sc4_3reel, sc4crzkyi, sc4_state, sc4crzky, ROT0, "BFM","Casino Crazy Keys (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzkyg ,sc4crzky, sc4_3reel, sc4crzkyi, sc4_state, sc4crzky, ROT0, "BFM","Casino Crazy Keys (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // incomplete pairing
-GAMEL( 200?, sc4crzkyh ,sc4crzky, sc4_3reel, sc4crzkyi, sc4_state, sc4crzky, ROT0, "BFM","Casino Crazy Keys (Bellfruit) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzkyl ,sc4crzky, sc4_3reel, sc4crzkyi, sc4_state, sc4crzky, ROT0, "BFM","Casino Crazy Keys (Bellfruit) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzkym ,sc4crzky, sc4_3reel, sc4crzkyi, sc4_state, sc4crzky, ROT0, "BFM","Casino Crazy Keys (Bellfruit) (Scorpion 4) (set 11)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzkyn ,sc4crzky, sc4_3reel, sc4crzkyi, sc4_state, sc4crzky, ROT0, "BFM","Casino Crazy Keys (Bellfruit) (Scorpion 4) (set 12)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzkyt ,sc4crzky, sc4_3reel, sc4crzkyi, sc4_state, sc4crzky, ROT0, "BFM","Casino Crazy Keys (Bellfruit) (Scorpion 4) (set 13)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzkyu ,sc4crzky, sc4_3reel, sc4crzkyi, sc4_state, sc4crzky, ROT0, "BFM","Casino Crazy Keys (Bellfruit) (Scorpion 4) (set 14)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzky ,0, sc4_3reel, sc4crzkyi, sc4_state, sc4crzky, ROT0, "BFM","Casino Crazy Keys (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzkya ,sc4crzky, sc4_3reel, sc4crzkyi, sc4_state, sc4crzky, ROT0, "BFM","Casino Crazy Keys (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzkyb ,sc4crzky, sc4_3reel, sc4crzkyi, sc4_state, sc4crzky, ROT0, "BFM","Casino Crazy Keys (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzkyc ,sc4crzky, sc4_3reel, sc4crzkyi, sc4_state, sc4crzky, ROT0, "BFM","Casino Crazy Keys (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzkyd ,sc4crzky, sc4_3reel, sc4crzkyi, sc4_state, sc4crzky, ROT0, "BFM","Casino Crazy Keys (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzkye ,sc4crzky, sc4_3reel, sc4crzkyi, sc4_state, sc4crzky, ROT0, "BFM","Casino Crazy Keys (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzkyf ,sc4crzky, sc4_3reel, sc4crzkyi, sc4_state, sc4crzky, ROT0, "BFM","Casino Crazy Keys (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzkyg ,sc4crzky, sc4_3reel, sc4crzkyi, sc4_state, sc4crzky, ROT0, "BFM","Casino Crazy Keys (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 ) // incomplete pairing
+GAMEL( 200?, sc4crzkyh ,sc4crzky, sc4_3reel, sc4crzkyi, sc4_state, sc4crzky, ROT0, "BFM","Casino Crazy Keys (Bellfruit) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzkyl ,sc4crzky, sc4_3reel, sc4crzkyi, sc4_state, sc4crzky, ROT0, "BFM","Casino Crazy Keys (Bellfruit) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzkym ,sc4crzky, sc4_3reel, sc4crzkyi, sc4_state, sc4crzky, ROT0, "BFM","Casino Crazy Keys (Bellfruit) (Scorpion 4) (set 11)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzkyn ,sc4crzky, sc4_3reel, sc4crzkyi, sc4_state, sc4crzky, ROT0, "BFM","Casino Crazy Keys (Bellfruit) (Scorpion 4) (set 12)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzkyt ,sc4crzky, sc4_3reel, sc4crzkyi, sc4_state, sc4crzky, ROT0, "BFM","Casino Crazy Keys (Bellfruit) (Scorpion 4) (set 13)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzkyu ,sc4crzky, sc4_3reel, sc4crzkyi, sc4_state, sc4crzky, ROT0, "BFM","Casino Crazy Keys (Bellfruit) (Scorpion 4) (set 14)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR1128 CASINO CRAZY KEYS CRAZY KEYS ARCADE PR1128 CRAZY KEYS SOUNDS11
-GAMEL( 200?, sc4crzkyi ,sc4crzky, sc4_3reel, sc4crzkyi, sc4_state, sc4crzky_mbus, ROT0, "BFM","Casino Crazy Keys Arcade (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzkyj ,sc4crzky, sc4_3reel, sc4crzkyi, sc4_state, sc4crzky_mbus, ROT0, "BFM","Casino Crazy Keys Arcade (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzkyk ,sc4crzky, sc4_3reel, sc4crzkyi, sc4_state, sc4crzky_mbus, ROT0, "BFM","Casino Crazy Keys Arcade (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzkyo ,sc4crzky, sc4_3reel, sc4crzkyi, sc4_state, sc4crzky_mbus, ROT0, "BFM","Casino Crazy Keys Arcade (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzkyp ,sc4crzky, sc4_3reel, sc4crzkyi, sc4_state, sc4crzky_mbus, ROT0, "BFM","Casino Crazy Keys Arcade (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzkyq ,sc4crzky, sc4_3reel, sc4crzkyi, sc4_state, sc4crzky_mbus, ROT0, "BFM","Casino Crazy Keys Arcade (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzkyr ,sc4crzky, sc4_3reel, sc4crzkyi, sc4_state, sc4crzky_mbus, ROT0, "BFM","Casino Crazy Keys Arcade (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzkys ,sc4crzky, sc4_3reel, sc4crzkyi, sc4_state, sc4crzky_mbus, ROT0, "BFM","Casino Crazy Keys Arcade (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzkyv ,sc4crzky, sc4_3reel, sc4crzkyi, sc4_state, sc4crzky_mbus, ROT0, "BFM","Casino Crazy Keys Arcade (Bellfruit) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzkyw ,sc4crzky, sc4_3reel, sc4crzkyi, sc4_state, sc4crzky_mbus, ROT0, "BFM","Casino Crazy Keys Arcade (Bellfruit) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzkyi ,sc4crzky, sc4_3reel, sc4crzkyi, sc4_state, sc4crzky_mbus, ROT0, "BFM","Casino Crazy Keys Arcade (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzkyj ,sc4crzky, sc4_3reel, sc4crzkyi, sc4_state, sc4crzky_mbus, ROT0, "BFM","Casino Crazy Keys Arcade (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzkyk ,sc4crzky, sc4_3reel, sc4crzkyi, sc4_state, sc4crzky_mbus, ROT0, "BFM","Casino Crazy Keys Arcade (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzkyo ,sc4crzky, sc4_3reel, sc4crzkyi, sc4_state, sc4crzky_mbus, ROT0, "BFM","Casino Crazy Keys Arcade (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzkyp ,sc4crzky, sc4_3reel, sc4crzkyi, sc4_state, sc4crzky_mbus, ROT0, "BFM","Casino Crazy Keys Arcade (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzkyq ,sc4crzky, sc4_3reel, sc4crzkyi, sc4_state, sc4crzky_mbus, ROT0, "BFM","Casino Crazy Keys Arcade (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzkyr ,sc4crzky, sc4_3reel, sc4crzkyi, sc4_state, sc4crzky_mbus, ROT0, "BFM","Casino Crazy Keys Arcade (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzkys ,sc4crzky, sc4_3reel, sc4crzkyi, sc4_state, sc4crzky_mbus, ROT0, "BFM","Casino Crazy Keys Arcade (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzkyv ,sc4crzky, sc4_3reel, sc4crzkyi, sc4_state, sc4crzky_mbus, ROT0, "BFM","Casino Crazy Keys Arcade (Bellfruit) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzkyw ,sc4crzky, sc4_3reel, sc4crzkyi, sc4_state, sc4crzky_mbus, ROT0, "BFM","Casino Crazy Keys Arcade (Bellfruit) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -24893,10 +24895,10 @@ INPUT_PORTS_START( sc4deepi ) // this structure is generated
INPUT_PORTS_END
// PR2099 DEEP IMPACT DIMP SOUNDS DEEP IMPACT
-GAMEL( 200?, sc4deepi ,0, sc4_5reel, sc4deepi, sc4_state, sc4deepi, ROT0, "Mazooma","Deep Impact (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4deepia ,sc4deepi, sc4_5reel, sc4deepi, sc4_state, sc4deepi, ROT0, "Mazooma","Deep Impact (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4deepib ,sc4deepi, sc4_5reel, sc4deepi, sc4_state, sc4deepi, ROT0, "Mazooma","Deep Impact (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4deepid ,sc4deepi, sc4_5reel, sc4deepi, sc4_state, sc4deepi, ROT0, "Mazooma","Deep Impact (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4deepi ,0, sc4_5reel, sc4deepi, sc4_state, sc4deepi, ROT0, "Mazooma","Deep Impact (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4deepia ,sc4deepi, sc4_5reel, sc4deepi, sc4_state, sc4deepi, ROT0, "Mazooma","Deep Impact (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4deepib ,sc4deepi, sc4_5reel, sc4deepi, sc4_state, sc4deepi, ROT0, "Mazooma","Deep Impact (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4deepid ,sc4deepi, sc4_5reel, sc4deepi, sc4_state, sc4deepi, ROT0, "Mazooma","Deep Impact (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -24942,13 +24944,13 @@ INPUT_PORTS_START( sc4dblfr ) // this structure is generated
INPUT_PORTS_END
// PR7060 DOUBLE FRENZY DFRZYSND
-GAMEL( 200?, sc4dblfr ,0, sc4_200_4r, sc4dblfr, sc4_state, sc4dblfr, ROT0, "Qps","Double Frenzy (PR7060) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4dblfra ,sc4dblfr, sc4_200_4r, sc4dblfr, sc4_state, sc4dblfr, ROT0, "Qps","Double Frenzy (PR7060) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4dblfrb ,sc4dblfr, sc4_200_4r, sc4dblfr, sc4_state, sc4dblfr, ROT0, "Qps","Double Frenzy (PR7060) (Qps) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4dblfrc ,sc4dblfr, sc4_200_4r, sc4dblfr, sc4_state, sc4dblfr, ROT0, "Qps","Double Frenzy (PR7060) (Qps) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4dblfr ,0, sc4_200_4r, sc4dblfr, sc4_state, sc4dblfr, ROT0, "Qps","Double Frenzy (PR7060) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4dblfra ,sc4dblfr, sc4_200_4r, sc4dblfr, sc4_state, sc4dblfr, ROT0, "Qps","Double Frenzy (PR7060) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4dblfrb ,sc4dblfr, sc4_200_4r, sc4dblfr, sc4_state, sc4dblfr, ROT0, "Qps","Double Frenzy (PR7060) (Qps) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4dblfrc ,sc4dblfr, sc4_200_4r, sc4dblfr, sc4_state, sc4dblfr, ROT0, "Qps","Double Frenzy (PR7060) (Qps) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2276 DOUBLE FRENZY 212 DFRZYSND
-GAMEL( 200?, sc4dblfrd ,sc4dblfr, sc4_200_4r, sc4dblfr, sc4_state, sc4dblfr, ROT0, "Qps","Double Frenzy (PR2276) (212) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4dblfre ,sc4dblfr, sc4_200_4r, sc4dblfr, sc4_state, sc4dblfr, ROT0, "Qps","Double Frenzy (PR2276) (212) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4dblfrd ,sc4dblfr, sc4_200_4r, sc4dblfr, sc4_state, sc4dblfr, ROT0, "Qps","Double Frenzy (PR2276) (212) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4dblfre ,sc4dblfr, sc4_200_4r, sc4dblfr, sc4_state, sc4dblfr, ROT0, "Qps","Double Frenzy (PR2276) (212) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4darw)
{
@@ -25002,10 +25004,10 @@ INPUT_PORTS_START( sc4darw ) // this structure is generated
INPUT_PORTS_END
// PR2026 DOUGH AND ARROW DOUGHSND DOUGH AND ARROW
-GAMEL( 200?, sc4darw ,0, sc4_4reel_alt, sc4darw, sc4_state, sc4darw, ROT0, "Qps","Dough & Arrow (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4darwa ,sc4darw, sc4_4reel_alt, sc4darw, sc4_state, sc4darw, ROT0, "Qps","Dough & Arrow (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4darwb ,sc4darw, sc4_4reel_alt, sc4darw, sc4_state, sc4darw, ROT0, "Qps","Dough & Arrow (Qps) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4darwc ,sc4darw, sc4_4reel_alt, sc4darw, sc4_state, sc4darw, ROT0, "Qps","Dough & Arrow (Qps) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4darw ,0, sc4_4reel_alt, sc4darw, sc4_state, sc4darw, ROT0, "Qps","Dough & Arrow (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4darwa ,sc4darw, sc4_4reel_alt, sc4darw, sc4_state, sc4darw, ROT0, "Qps","Dough & Arrow (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4darwb ,sc4darw, sc4_4reel_alt, sc4darw, sc4_state, sc4darw, ROT0, "Qps","Dough & Arrow (Qps) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4darwc ,sc4darw, sc4_4reel_alt, sc4darw, sc4_state, sc4darw, ROT0, "Qps","Dough & Arrow (Qps) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4duckq)
@@ -25057,8 +25059,8 @@ INPUT_PORTS_START( sc4duckq ) // this structure is generated
INPUT_PORTS_END
// PR2519 THEDUCKSOFHAZZARD V1.0 DUCKSOFHAZZARDSND DUCKS OF HAZZARD
-GAMEL( 200?, sc4duckq ,0, sc4_4reel_alt, sc4duckq, sc4_state, sc4duckq, ROT0, "Qps","Ducks Of Hazzard (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4duckqa ,sc4duckq, sc4_4reel_alt, sc4duckq, sc4_state, sc4duckq, ROT0, "Qps","Ducks Of Hazzard (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4duckq ,0, sc4_4reel_alt, sc4duckq, sc4_state, sc4duckq, ROT0, "Qps","Ducks Of Hazzard (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4duckqa ,sc4duckq, sc4_4reel_alt, sc4duckq, sc4_state, sc4duckq, ROT0, "Qps","Ducks Of Hazzard (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4eascs)
@@ -25124,18 +25126,18 @@ INPUT_PORTS_START( sc4eascs ) // this structure is generated
INPUT_PORTS_END
// PR1326 CASINO EASY STREAK PR1326 EASY STREAK SOUNDS11 (actually expects PR1326_CAS_EASY_STREAK_SOUNDS11 ? )
-GAMEL( 200?, sc4eascs ,0, sc4_3reel, sc4eascs, sc4_state, sc4eascs, ROT0, "BFM","Casino Easy Streak (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4eascsa ,sc4eascs, sc4_3reel, sc4eascs, sc4_state, sc4eascs, ROT0, "BFM","Casino Easy Streak (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4eascsb ,sc4eascs, sc4_3reel, sc4eascs, sc4_state, sc4eascs, ROT0, "BFM","Casino Easy Streak (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4eascsc ,sc4eascs, sc4_3reel, sc4eascs, sc4_state, sc4eascs, ROT0, "BFM","Casino Easy Streak (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4eascsd ,sc4eascs, sc4_3reel, sc4eascs, sc4_state, sc4eascs, ROT0, "BFM","Casino Easy Streak (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4eascse ,sc4eascs, sc4_3reel, sc4eascs, sc4_state, sc4eascs, ROT0, "BFM","Casino Easy Streak (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4eascsf ,sc4eascs, sc4_3reel, sc4eascs, sc4_state, sc4eascs, ROT0, "BFM","Casino Easy Streak (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4eascsg ,sc4eascs, sc4_3reel, sc4eascs, sc4_state, sc4eascs, ROT0, "BFM","Casino Easy Streak (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4eascsh ,sc4eascs, sc4_3reel, sc4eascs, sc4_state, sc4eascs, ROT0, "BFM","Casino Easy Streak (Bellfruit) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4eascsi ,sc4eascs, sc4_3reel, sc4eascs, sc4_state, sc4eascs, ROT0, "BFM","Casino Easy Streak (Bellfruit) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4eascsj ,sc4eascs, sc4_3reel, sc4eascs, sc4_state, sc4eascs, ROT0, "BFM","Casino Easy Streak (Bellfruit) (Scorpion 4) (set 11)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4eascsk ,sc4eascs, sc4_3reel, sc4eascs, sc4_state, sc4eascs, ROT0, "BFM","Casino Easy Streak (Bellfruit) (Scorpion 4) (set 12)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4eascs ,0, sc4_3reel, sc4eascs, sc4_state, sc4eascs, ROT0, "BFM","Casino Easy Streak (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4eascsa ,sc4eascs, sc4_3reel, sc4eascs, sc4_state, sc4eascs, ROT0, "BFM","Casino Easy Streak (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4eascsb ,sc4eascs, sc4_3reel, sc4eascs, sc4_state, sc4eascs, ROT0, "BFM","Casino Easy Streak (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4eascsc ,sc4eascs, sc4_3reel, sc4eascs, sc4_state, sc4eascs, ROT0, "BFM","Casino Easy Streak (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4eascsd ,sc4eascs, sc4_3reel, sc4eascs, sc4_state, sc4eascs, ROT0, "BFM","Casino Easy Streak (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4eascse ,sc4eascs, sc4_3reel, sc4eascs, sc4_state, sc4eascs, ROT0, "BFM","Casino Easy Streak (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4eascsf ,sc4eascs, sc4_3reel, sc4eascs, sc4_state, sc4eascs, ROT0, "BFM","Casino Easy Streak (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4eascsg ,sc4eascs, sc4_3reel, sc4eascs, sc4_state, sc4eascs, ROT0, "BFM","Casino Easy Streak (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4eascsh ,sc4eascs, sc4_3reel, sc4eascs, sc4_state, sc4eascs, ROT0, "BFM","Casino Easy Streak (Bellfruit) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4eascsi ,sc4eascs, sc4_3reel, sc4eascs, sc4_state, sc4eascs, ROT0, "BFM","Casino Easy Streak (Bellfruit) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4eascsj ,sc4eascs, sc4_3reel, sc4eascs, sc4_state, sc4eascs, ROT0, "BFM","Casino Easy Streak (Bellfruit) (Scorpion 4) (set 11)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4eascsk ,sc4eascs, sc4_3reel, sc4eascs, sc4_state, sc4eascs, ROT0, "BFM","Casino Easy Streak (Bellfruit) (Scorpion 4) (set 12)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4fastf)
@@ -25195,10 +25197,10 @@ INPUT_PORTS_START( sc4fastf ) // this structure is generated
INPUT_PORTS_END
// PR2071 FAST 'N' FURIOUS FNF SOUNDS FAST 'N' FURIOUS
-GAMEL( 200?, sc4fastf ,0, sc4_200_4rb, sc4fastf, sc4_state, sc4fastf, ROT0, "Mazooma","Fast 'n' Furious (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4fastfa ,sc4fastf, sc4_200_4rb, sc4fastf, sc4_state, sc4fastf, ROT0, "Mazooma","Fast 'n' Furious (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4fastfb ,sc4fastf, sc4_200_4rb, sc4fastf, sc4_state, sc4fastf, ROT0, "Mazooma","Fast 'n' Furious (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4fastfc ,sc4fastf, sc4_200_4rb, sc4fastf, sc4_state, sc4fastf, ROT0, "Mazooma","Fast 'n' Furious (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4fastf ,0, sc4_200_4rb, sc4fastf, sc4_state, sc4fastf, ROT0, "Mazooma","Fast 'n' Furious (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4fastfa ,sc4fastf, sc4_200_4rb, sc4fastf, sc4_state, sc4fastf, ROT0, "Mazooma","Fast 'n' Furious (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4fastfb ,sc4fastf, sc4_200_4rb, sc4fastf, sc4_state, sc4fastf, ROT0, "Mazooma","Fast 'n' Furious (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4fastfc ,sc4fastf, sc4_200_4rb, sc4fastf, sc4_state, sc4fastf, ROT0, "Mazooma","Fast 'n' Furious (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4ffru)
@@ -25255,12 +25257,12 @@ INPUT_PORTS_START( sc4ffru ) // this structure is generated
INPUT_PORTS_END
// PR7070 FAST FRUIT FFRUIT SOUNDS FAST FRUIT
-GAMEL( 200?, sc4ffru ,0, sc4_4reel, sc4ffru, sc4_state, sc4ffru, ROT0, "Qps / Mazooma","Fast Fruit (Qps / Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // has 'MAZ' game code in roms
-GAMEL( 200?, sc4ffrub ,sc4ffru, sc4_4reel, sc4ffru, sc4_state, sc4ffru, ROT0, "Qps / Mazooma","Fast Fruit (Qps / Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // has 'MAZ' game code in roms
-GAMEL( 200?, sc4ffrua ,sc4ffru, sc4_4reel, sc4ffru, sc4_state, sc4ffru, ROT0, "Qps","Fast Fruit (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ffruc ,sc4ffru, sc4_4reel, sc4ffru, sc4_state, sc4ffru, ROT0, "Qps","Fast Fruit (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ffrud ,sc4ffru, sc4_4reel, sc4ffru, sc4_state, sc4ffru, ROT0, "Qps","Fast Fruit (Qps) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ffrue ,sc4ffru, sc4_4reel, sc4ffru, sc4_state, sc4ffru, ROT0, "Qps","Fast Fruit (Qps) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4ffru ,0, sc4_4reel, sc4ffru, sc4_state, sc4ffru, ROT0, "Qps / Mazooma","Fast Fruit (Qps / Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // has 'MAZ' game code in roms
+GAMEL( 200?, sc4ffrub ,sc4ffru, sc4_4reel, sc4ffru, sc4_state, sc4ffru, ROT0, "Qps / Mazooma","Fast Fruit (Qps / Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // has 'MAZ' game code in roms
+GAMEL( 200?, sc4ffrua ,sc4ffru, sc4_4reel, sc4ffru, sc4_state, sc4ffru, ROT0, "Qps","Fast Fruit (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ffruc ,sc4ffru, sc4_4reel, sc4ffru, sc4_state, sc4ffru, ROT0, "Qps","Fast Fruit (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ffrud ,sc4ffru, sc4_4reel, sc4ffru, sc4_state, sc4ffru, ROT0, "Qps","Fast Fruit (Qps) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ffrue ,sc4ffru, sc4_4reel, sc4ffru, sc4_state, sc4ffru, ROT0, "Qps","Fast Fruit (Qps) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4fire)
@@ -25311,8 +25313,8 @@ INPUT_PORTS_START( sc4fire ) // this structure is generated
INPUT_PORTS_END
// PR2082 FIRE POWER FPOW SOUNDS FIRE POWER
-GAMEL( 200?, sc4fire ,0, sc4_4reel_alt, sc4fire, sc4_state, sc4fire, ROT0, "Mazooma","Firepower (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4firea ,sc4fire, sc4_4reel_alt, sc4fire, sc4_state, sc4fire, ROT0, "Mazooma","Firepower (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4fire ,0, sc4_4reel_alt, sc4fire, sc4_state, sc4fire, ROT0, "Mazooma","Firepower (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4firea ,sc4fire, sc4_4reel_alt, sc4fire, sc4_state, sc4fire, ROT0, "Mazooma","Firepower (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4frenz)
@@ -25381,12 +25383,12 @@ INPUT_PORTS_START( sc4frenz ) // this structure is generated
INPUT_PORTS_END
// PR1101 FRUIT FRENZY PR1101 FRUIT FRENZY SOUNDS11
-GAMEL( 200?, sc4frenz ,0, sc4_4reel_alt, sc4frenz, sc4_state, sc4frenz, ROT0, "BFM","Fruit Frenzy (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4frenza ,sc4frenz, sc4_4reel_alt, sc4frenz, sc4_state, sc4frenz, ROT0, "BFM","Fruit Frenzy (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4frenzb ,sc4frenz, sc4_4reel_alt, sc4frenz, sc4_state, sc4frenz, ROT0, "BFM","Fruit Frenzy (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4frenzc ,sc4frenz, sc4_4reel_alt, sc4frenz, sc4_state, sc4frenz, ROT0, "BFM","Fruit Frenzy (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4frenzd ,sc4frenz, sc4_4reel_alt, sc4frenz, sc4_state, sc4frenz, ROT0, "BFM","Fruit Frenzy (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4frenze ,sc4frenz, sc4_4reel_alt, sc4frenz, sc4_state, sc4frenz, ROT0, "BFM","Fruit Frenzy (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4frenz ,0, sc4_4reel_alt, sc4frenz, sc4_state, sc4frenz, ROT0, "BFM","Fruit Frenzy (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4frenza ,sc4frenz, sc4_4reel_alt, sc4frenz, sc4_state, sc4frenz, ROT0, "BFM","Fruit Frenzy (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4frenzb ,sc4frenz, sc4_4reel_alt, sc4frenz, sc4_state, sc4frenz, ROT0, "BFM","Fruit Frenzy (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4frenzc ,sc4frenz, sc4_4reel_alt, sc4frenz, sc4_state, sc4frenz, ROT0, "BFM","Fruit Frenzy (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4frenzd ,sc4frenz, sc4_4reel_alt, sc4frenz, sc4_state, sc4frenz, ROT0, "BFM","Fruit Frenzy (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4frenze ,sc4frenz, sc4_4reel_alt, sc4frenz, sc4_state, sc4frenz, ROT0, "BFM","Fruit Frenzy (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4ftopi)
{
@@ -25439,19 +25441,19 @@ INPUT_PORTS_START( sc4ftopi ) // this structure is generated
INPUT_PORTS_END
// PR2027 FRUITOPIA FRUITOPIASND FRUITOPIA
-GAMEL( 200?, sc4ftopi ,0, sc4_4reel_alt, sc4ftopi, sc4_state, sc4ftopi, ROT0, "Qps","Fruitopia (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ftopia ,sc4ftopi, sc4_4reel_alt, sc4ftopi, sc4_state, sc4ftopi, ROT0, "Qps","Fruitopia (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ftopib ,sc4ftopi, sc4_4reel_alt, sc4ftopi, sc4_state, sc4ftopi, ROT0, "Qps","Fruitopia (Qps) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ftopic ,sc4ftopi, sc4_4reel_alt, sc4ftopi, sc4_state, sc4ftopi, ROT0, "Qps","Fruitopia (Qps) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4ftopi ,0, sc4_4reel_alt, sc4ftopi, sc4_state, sc4ftopi, ROT0, "Qps","Fruitopia (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ftopia ,sc4ftopi, sc4_4reel_alt, sc4ftopi, sc4_state, sc4ftopi, ROT0, "Qps","Fruitopia (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ftopib ,sc4ftopi, sc4_4reel_alt, sc4ftopi, sc4_state, sc4ftopi, ROT0, "Qps","Fruitopia (Qps) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ftopic ,sc4ftopi, sc4_4reel_alt, sc4ftopi, sc4_state, sc4ftopi, ROT0, "Qps","Fruitopia (Qps) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2027 FRUITOPIA_17/04/03 V1.1 FRUITOPIASND FRUITOPIA
-GAMEL( 200?, sc4ftopif ,sc4ftopi, sc4_4reel_alt, sc4ftopi, sc4_state, sc4ftopi, ROT0, "Qps","Fruitopia (V1.1) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ftopii ,sc4ftopi, sc4_4reel_alt, sc4ftopi, sc4_state, sc4ftopi, ROT0, "Qps","Fruitopia (V1.1) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4ftopif ,sc4ftopi, sc4_4reel_alt, sc4ftopi, sc4_state, sc4ftopi, ROT0, "Qps","Fruitopia (V1.1) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ftopii ,sc4ftopi, sc4_4reel_alt, sc4ftopi, sc4_state, sc4ftopi, ROT0, "Qps","Fruitopia (V1.1) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2027 FRUITOPIA V2.1 FRUITOPIASND FRUITOPIA
-GAMEL( 200?, sc4ftopid ,sc4ftopi, sc4_4reel_alt, sc4ftopi, sc4_state, sc4ftopi, ROT0, "Qps","Fruitopia (V2.1) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ftopig ,sc4ftopi, sc4_4reel_alt, sc4ftopi, sc4_state, sc4ftopi, ROT0, "Qps","Fruitopia (V2.1) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4ftopid ,sc4ftopi, sc4_4reel_alt, sc4ftopi, sc4_state, sc4ftopi, ROT0, "Qps","Fruitopia (V2.1) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ftopig ,sc4ftopi, sc4_4reel_alt, sc4ftopi, sc4_state, sc4ftopi, ROT0, "Qps","Fruitopia (V2.1) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2027 FRUITOPIA V2.2 FRUITOPIASND FRUITOPIA
-GAMEL( 200?, sc4ftopie ,sc4ftopi, sc4_4reel_alt, sc4ftopi, sc4_state, sc4ftopi, ROT0, "Qps","Fruitopia (V2.2) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ftopih ,sc4ftopi, sc4_4reel_alt, sc4ftopi, sc4_state, sc4ftopi, ROT0, "Qps","Fruitopia (V2.2) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4ftopie ,sc4ftopi, sc4_4reel_alt, sc4ftopi, sc4_state, sc4ftopi, ROT0, "Qps","Fruitopia (V2.2) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ftopih ,sc4ftopi, sc4_4reel_alt, sc4ftopi, sc4_state, sc4ftopi, ROT0, "Qps","Fruitopia (V2.2) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4fullt)
{
@@ -25506,20 +25508,20 @@ INPUT_PORTS_START( sc4fullt ) // this structure is generated
INPUT_PORTS_END
// PR2537 FULL THROTTLE 011 FULLTHROTTLESND FULL THROTTLE
-GAMEL( 200?, sc4fullt ,0, sc4_5reel, sc4fullt, sc4_state, sc4fullt, ROT0, "Qps","Full Throttle (011) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4fulltb ,sc4fullt, sc4_5reel, sc4fullt, sc4_state, sc4fullt, ROT0, "Qps","Full Throttle (011) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4fullt ,0, sc4_5reel, sc4fullt, sc4_state, sc4fullt, ROT0, "Qps","Full Throttle (011) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4fulltb ,sc4fullt, sc4_5reel, sc4fullt, sc4_state, sc4fullt, ROT0, "Qps","Full Throttle (011) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2537 FULL THROTTLE 041 FULLTHROTTLESND FULL THROTTLE
-GAMEL( 200?, sc4fullta ,sc4fullt, sc4_5reel, sc4fullt, sc4_state, sc4fullt, ROT0, "Qps","Full Throttle (041) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4fulltc ,sc4fullt, sc4_5reel, sc4fullt, sc4_state, sc4fullt, ROT0, "Qps","Full Throttle (041) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4fullta ,sc4fullt, sc4_5reel, sc4fullt, sc4_state, sc4fullt, ROT0, "Qps","Full Throttle (041) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4fulltc ,sc4fullt, sc4_5reel, sc4fullt, sc4_state, sc4fullt, ROT0, "Qps","Full Throttle (041) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2537 FULL THROTTLE 012 FULLTHROTTLESND FULL THROTTLE
-GAMEL( 200?, sc4fulltd ,sc4fullt, sc4_5reel, sc4fullt, sc4_state, sc4fullt, ROT0, "Qps","Full Throttle (012) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4fulltg ,sc4fullt, sc4_5reel, sc4fullt, sc4_state, sc4fullt, ROT0, "Qps","Full Throttle (012) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4fulltd ,sc4fullt, sc4_5reel, sc4fullt, sc4_state, sc4fullt, ROT0, "Qps","Full Throttle (012) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4fulltg ,sc4fullt, sc4_5reel, sc4fullt, sc4_state, sc4fullt, ROT0, "Qps","Full Throttle (012) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2537 FULL THROTTLE 042 FULLTHROTTLESND FULL THROTTLE
-GAMEL( 200?, sc4fullte ,sc4fullt, sc4_5reel, sc4fullt, sc4_state, sc4fullt, ROT0, "Qps","Full Throttle (042) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4fullth ,sc4fullt, sc4_5reel, sc4fullt, sc4_state, sc4fullt, ROT0, "Qps","Full Throttle (042) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4fullte ,sc4fullt, sc4_5reel, sc4fullt, sc4_state, sc4fullt, ROT0, "Qps","Full Throttle (042) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4fullth ,sc4fullt, sc4_5reel, sc4fullt, sc4_state, sc4fullt, ROT0, "Qps","Full Throttle (042) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// R2537 FULL THROTTLE 013 FULLTHROTTLESND FULL THROTTLE
-GAMEL( 200?, sc4fulltf ,sc4fullt, sc4_5reel, sc4fullt, sc4_state, sc4fullt, ROT0, "Qps","Full Throttle (013) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4fullti ,sc4fullt, sc4_5reel, sc4fullt, sc4_state, sc4fullt, ROT0, "Qps","Full Throttle (013) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4fulltf ,sc4fullt, sc4_5reel, sc4fullt, sc4_state, sc4fullt, ROT0, "Qps","Full Throttle (013) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4fullti ,sc4fullt, sc4_5reel, sc4fullt, sc4_state, sc4fullt, ROT0, "Qps","Full Throttle (013) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4ziggy)
@@ -25580,14 +25582,14 @@ INPUT_PORTS_START( sc4ziggy ) // this structure is generated
INPUT_PORTS_END
// PR2162 GETTIN' ZIGGY ZIGY SOUNDS GETTIN' ZIGGY
-GAMEL( 200?, sc4ziggy ,0, sc4_200_4ra, sc4ziggy, sc4_state, sc4ziggy, ROT0, "Mazooma","Gettin Ziggy With It (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ziggya ,sc4ziggy, sc4_200_4ra, sc4ziggy, sc4_state, sc4ziggy, ROT0, "Mazooma","Gettin Ziggy With It (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ziggyb ,sc4ziggy, sc4_200_4ra, sc4ziggy, sc4_state, sc4ziggy, ROT0, "Mazooma","Gettin Ziggy With It (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ziggyc ,sc4ziggy, sc4_200_4ra, sc4ziggy, sc4_state, sc4ziggy, ROT0, "Mazooma","Gettin Ziggy With It (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ziggyd ,sc4ziggy, sc4_200_4ra, sc4ziggy, sc4_state, sc4ziggy, ROT0, "Mazooma","Gettin Ziggy With It (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ziggye ,sc4ziggy, sc4_200_4ra, sc4ziggy, sc4_state, sc4ziggy, ROT0, "Mazooma","Gettin Ziggy With It (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ziggyf ,sc4ziggy, sc4_200_4ra, sc4ziggy, sc4_state, sc4ziggy, ROT0, "Mazooma","Gettin Ziggy With It (Mazooma) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ziggyg ,sc4ziggy, sc4_200_4ra, sc4ziggy, sc4_state, sc4ziggy, ROT0, "Mazooma","Gettin Ziggy With It (Mazooma) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4ziggy ,0, sc4_200_4ra, sc4ziggy, sc4_state, sc4ziggy, ROT0, "Mazooma","Gettin Ziggy With It (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ziggya ,sc4ziggy, sc4_200_4ra, sc4ziggy, sc4_state, sc4ziggy, ROT0, "Mazooma","Gettin Ziggy With It (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ziggyb ,sc4ziggy, sc4_200_4ra, sc4ziggy, sc4_state, sc4ziggy, ROT0, "Mazooma","Gettin Ziggy With It (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ziggyc ,sc4ziggy, sc4_200_4ra, sc4ziggy, sc4_state, sc4ziggy, ROT0, "Mazooma","Gettin Ziggy With It (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ziggyd ,sc4ziggy, sc4_200_4ra, sc4ziggy, sc4_state, sc4ziggy, ROT0, "Mazooma","Gettin Ziggy With It (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ziggye ,sc4ziggy, sc4_200_4ra, sc4ziggy, sc4_state, sc4ziggy, ROT0, "Mazooma","Gettin Ziggy With It (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ziggyf ,sc4ziggy, sc4_200_4ra, sc4ziggy, sc4_state, sc4ziggy, ROT0, "Mazooma","Gettin Ziggy With It (Mazooma) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ziggyg ,sc4ziggy, sc4_200_4ra, sc4ziggy, sc4_state, sc4ziggy, ROT0, "Mazooma","Gettin Ziggy With It (Mazooma) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4gldcl)
{
@@ -25653,8 +25655,8 @@ INPUT_PORTS_START( sc4gldcl ) // this structure is generated
INPUT_PORTS_END
// PR2292 CLUB GLADIATOR CLUB GLADIATOR CLUB CLUB GLAD SOUNDS CLUB GLADIATOR
-GAMEL( 200?, sc4gldcl ,0, sc4_5reel, sc4gldcl, sc4_state, sc4gldcl, ROT0, "QPS","Gladiator Club (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gldcla ,sc4gldcl, sc4_5reel, sc4gldcl, sc4_state, sc4gldcl, ROT0, "QPS","Gladiator Club (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4gldcl ,0, sc4_5reel, sc4gldcl, sc4_state, sc4gldcl, ROT0, "QPS","Gladiator Club (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gldcla ,sc4gldcl, sc4_5reel, sc4gldcl, sc4_state, sc4gldcl, ROT0, "QPS","Gladiator Club (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -25724,16 +25726,16 @@ INPUT_PORTS_START( sc4ghost ) // this structure is generated
INPUT_PORTS_END
// PR7090 GOLDEN GHOST GOLDEN GHOST MAZ GHOST SOUNDS GOLDEN GHOST
-GAMEL( 200?, sc4ghost ,0, sc4_3reel_200, sc4ghost, sc4_state, sc4ghost, ROT0, "Mazooma","Golden Ghost (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ghostb ,sc4ghost, sc4_3reel_200, sc4ghost, sc4_state, sc4ghost, ROT0, "Mazooma","Golden Ghost (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ghostc ,sc4ghost, sc4_3reel_200, sc4ghost, sc4_state, sc4ghost, ROT0, "Mazooma","Golden Ghost (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ghoste ,sc4ghost, sc4_3reel_200, sc4ghost, sc4_state, sc4ghost, ROT0, "Mazooma","Golden Ghost (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ghostf ,sc4ghost, sc4_3reel_200, sc4ghost, sc4_state, sc4ghost, ROT0, "Mazooma","Golden Ghost (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ghostg ,sc4ghost, sc4_3reel_200, sc4ghost, sc4_state, sc4ghost, ROT0, "Mazooma","Golden Ghost (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4ghost ,0, sc4_3reel_200, sc4ghost, sc4_state, sc4ghost, ROT0, "Mazooma","Golden Ghost (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ghostb ,sc4ghost, sc4_3reel_200, sc4ghost, sc4_state, sc4ghost, ROT0, "Mazooma","Golden Ghost (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ghostc ,sc4ghost, sc4_3reel_200, sc4ghost, sc4_state, sc4ghost, ROT0, "Mazooma","Golden Ghost (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ghoste ,sc4ghost, sc4_3reel_200, sc4ghost, sc4_state, sc4ghost, ROT0, "Mazooma","Golden Ghost (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ghostf ,sc4ghost, sc4_3reel_200, sc4ghost, sc4_state, sc4ghost, ROT0, "Mazooma","Golden Ghost (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ghostg ,sc4ghost, sc4_3reel_200, sc4ghost, sc4_state, sc4ghost, ROT0, "Mazooma","Golden Ghost (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR7090 GOLD GHOST TRIPLE GHOST SOUNDS 8 GOLDEN GHOST
-GAMEL( 200?, sc4ghosta ,sc4ghost, sc4_3reel, sc4ghost, sc4_state, sc4ghosttb, ROT0, "Mazooma","Golden Ghost (Mazooma) (Scorpion 4) (Top Box, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ghostd ,sc4ghost, sc4_3reel, sc4ghost, sc4_state, sc4ghosttb, ROT0, "Mazooma","Golden Ghost (Mazooma) (Scorpion 4) (Top Box, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ghosth ,sc4ghost, sc4_3reel, sc4ghost, sc4_state, sc4ghosttb, ROT0, "Mazooma","Golden Ghost (Mazooma) (Scorpion 4) (Top Box, set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4ghosta ,sc4ghost, sc4_3reel, sc4ghost, sc4_state, sc4ghosttb, ROT0, "Mazooma","Golden Ghost (Mazooma) (Scorpion 4) (Top Box, set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ghostd ,sc4ghost, sc4_3reel, sc4ghost, sc4_state, sc4ghosttb, ROT0, "Mazooma","Golden Ghost (Mazooma) (Scorpion 4) (Top Box, set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ghosth ,sc4ghost, sc4_3reel, sc4ghost, sc4_state, sc4ghosttb, ROT0, "Mazooma","Golden Ghost (Mazooma) (Scorpion 4) (Top Box, set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -25794,26 +25796,26 @@ INPUT_PORTS_START( sc4ggrid ) // this structure is generated
INPUT_PORTS_END
// PR2518 GOLDEN GRID V1.0 GOLDENGRIDSND GOLDEN GRID
-GAMEL( 200?, sc4ggrid ,0, sc4_4reel, sc4ggrid, sc4_state, sc4ggrid, ROT0, "Qps","Golden Grid (V1.0) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ggrida ,sc4ggrid, sc4_4reel, sc4ggrid, sc4_state, sc4ggrid, ROT0, "Qps","Golden Grid (V1.0) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ggride ,sc4ggrid, sc4_4reel, sc4ggrid, sc4_state, sc4ggrid, ROT0, "Qps","Golden Grid (V1.0) (Qps) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ggridf ,sc4ggrid, sc4_4reel, sc4ggrid, sc4_state, sc4ggrid, ROT0, "Qps","Golden Grid (V1.0) (Qps) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4ggrid ,0, sc4_4reel, sc4ggrid, sc4_state, sc4ggrid, ROT0, "Qps","Golden Grid (V1.0) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ggrida ,sc4ggrid, sc4_4reel, sc4ggrid, sc4_state, sc4ggrid, ROT0, "Qps","Golden Grid (V1.0) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ggride ,sc4ggrid, sc4_4reel, sc4ggrid, sc4_state, sc4ggrid, ROT0, "Qps","Golden Grid (V1.0) (Qps) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ggridf ,sc4ggrid, sc4_4reel, sc4ggrid, sc4_state, sc4ggrid, ROT0, "Qps","Golden Grid (V1.0) (Qps) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2518 GOLDEN GRID V1.1 GOLDENGRIDSND GOLDEN GRID
-GAMEL( 200?, sc4ggridb ,sc4ggrid, sc4_4reel, sc4ggrid, sc4_state, sc4ggrid, ROT0, "Qps","Golden Grid (V1.1) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ggridc ,sc4ggrid, sc4_4reel, sc4ggrid, sc4_state, sc4ggrid, ROT0, "Qps","Golden Grid (V1.1) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ggridg ,sc4ggrid, sc4_4reel, sc4ggrid, sc4_state, sc4ggrid, ROT0, "Qps","Golden Grid (V1.1) (Qps) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ggridh ,sc4ggrid, sc4_4reel, sc4ggrid, sc4_state, sc4ggrid, ROT0, "Qps","Golden Grid (V1.1) (Qps) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4ggridb ,sc4ggrid, sc4_4reel, sc4ggrid, sc4_state, sc4ggrid, ROT0, "Qps","Golden Grid (V1.1) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ggridc ,sc4ggrid, sc4_4reel, sc4ggrid, sc4_state, sc4ggrid, ROT0, "Qps","Golden Grid (V1.1) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ggridg ,sc4ggrid, sc4_4reel, sc4ggrid, sc4_state, sc4ggrid, ROT0, "Qps","Golden Grid (V1.1) (Qps) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ggridh ,sc4ggrid, sc4_4reel, sc4ggrid, sc4_state, sc4ggrid, ROT0, "Qps","Golden Grid (V1.1) (Qps) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2518 GOLDEN GRID V1.3 GOLDENGRIDSND GOLDEN GRID
-GAMEL( 200?, sc4ggridd ,sc4ggrid, sc4_4reel, sc4ggrid, sc4_state, sc4ggrid, ROT0, "Qps","Golden Grid (V1.3) (Qps) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4ggridd ,sc4ggrid, sc4_4reel, sc4ggrid, sc4_state, sc4ggrid, ROT0, "Qps","Golden Grid (V1.3) (Qps) (Scorpion 4)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2518 GOLDEN GRID V011 GOLDENGRIDSND GOLDEN GRID
-GAMEL( 200?, sc4ggridi ,sc4ggrid, sc4_4reel, sc4ggrid, sc4_state, sc4ggrid_mbus, ROT0, "Qps","Golden Grid (V011) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ggridk ,sc4ggrid, sc4_4reel, sc4ggrid, sc4_state, sc4ggrid_mbus, ROT0, "Qps","Golden Grid (V011) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4ggridi ,sc4ggrid, sc4_4reel, sc4ggrid, sc4_state, sc4ggrid_mbus, ROT0, "Qps","Golden Grid (V011) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ggridk ,sc4ggrid, sc4_4reel, sc4ggrid, sc4_state, sc4ggrid_mbus, ROT0, "Qps","Golden Grid (V011) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2518 GOLDEN GRID V041 GOLDENGRIDSND GOLDEN GRID
-GAMEL( 200?, sc4ggridj ,sc4ggrid, sc4_4reel, sc4ggrid, sc4_state, sc4ggrid_mbus, ROT0, "Qps","Golden Grid (V041) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ggridl ,sc4ggrid, sc4_4reel, sc4ggrid, sc4_state, sc4ggrid_mbus, ROT0, "Qps","Golden Grid (V041) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4ggridj ,sc4ggrid, sc4_4reel, sc4ggrid, sc4_state, sc4ggrid_mbus, ROT0, "Qps","Golden Grid (V041) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ggridl ,sc4ggrid, sc4_4reel, sc4ggrid, sc4_state, sc4ggrid_mbus, ROT0, "Qps","Golden Grid (V041) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2518 GOLDEN GRID V012 GOLDENGRIDSND GOLDEN GRID
-GAMEL( 200?, sc4ggridm ,sc4ggrid, sc4_4reel, sc4ggrid, sc4_state, sc4ggrid_mbus, ROT0, "Qps","Golden Grid (V012) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ggridn ,sc4ggrid, sc4_4reel, sc4ggrid, sc4_state, sc4ggrid_mbus, ROT0, "Qps","Golden Grid (V012) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4ggridm ,sc4ggrid, sc4_4reel, sc4ggrid, sc4_state, sc4ggrid_mbus, ROT0, "Qps","Golden Grid (V012) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ggridn ,sc4ggrid, sc4_4reel, sc4ggrid, sc4_state, sc4ggrid_mbus, ROT0, "Qps","Golden Grid (V012) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4ggcl)
@@ -25874,13 +25876,13 @@ INPUT_PORTS_START( sc4ggcl ) // this structure is generated
INPUT_PORTS_END
// PR???? CLUB GOLDEN GRID V1.0 CLUBGOLDENGRIDSND CLUB GOLDEN GRID
-GAMEL( 200?, sc4ggcl ,0, sc4_5reel, sc4ggcl, sc4_state, sc4ggcl, ROT0, "Qps","Golden Grid Club (V1.0) (Qps) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4ggcl ,0, sc4_5reel, sc4ggcl, sc4_state, sc4ggcl, ROT0, "Qps","Golden Grid Club (V1.0) (Qps) (Scorpion 4)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR???? CLUB GOLDEN GRID 411 CLUBGOLDENGRIDSND CLUB GOLDEN GRID
-GAMEL( 200?, sc4ggcla ,sc4ggcl, sc4_5reel, sc4ggcl, sc4_state, sc4ggcl_mbus, ROT0, "Qps","Golden Grid Club (V411) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ggclb ,sc4ggcl, sc4_5reel, sc4ggcl, sc4_state, sc4ggcl_mbus, ROT0, "Qps","Golden Grid Club (V411) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4ggcla ,sc4ggcl, sc4_5reel, sc4ggcl, sc4_state, sc4ggcl_mbus, ROT0, "Qps","Golden Grid Club (V411) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ggclb ,sc4ggcl, sc4_5reel, sc4ggcl, sc4_state, sc4ggcl_mbus, ROT0, "Qps","Golden Grid Club (V411) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR???? CLUB GOLDEN GRID 412 CLUBGOLDENGRIDSND CLUB GOLDEN GRID
-GAMEL( 200?, sc4ggclc ,sc4ggcl, sc4_5reel, sc4ggcl, sc4_state, sc4ggcl_mbus, ROT0, "Qps","Golden Grid Club (V412) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ggcld ,sc4ggcl, sc4_5reel, sc4ggcl, sc4_state, sc4ggcl_mbus, ROT0, "Qps","Golden Grid Club (V412) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4ggclc ,sc4ggcl, sc4_5reel, sc4ggcl, sc4_state, sc4ggcl_mbus, ROT0, "Qps","Golden Grid Club (V412) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ggcld ,sc4ggcl, sc4_5reel, sc4ggcl, sc4_state, sc4ggcl_mbus, ROT0, "Qps","Golden Grid Club (V412) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -26004,15 +26006,15 @@ INPUT_PORTS_END
// the dot matrix calls these 'classic crazy fruits' was it not shown or is Golden Winner a subtitle?
// PR1431 GOLDEN WINNER PR1431 GOLDEN WINNER SND11
-GAMEL( 200?, sc4goldw ,0, sc4_3reel, sc4goldw, sc4_state, sc4goldw, ROT0, "BFM","Golden Winner (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4goldwa ,sc4goldw, sc4_3reel, sc4goldw, sc4_state, sc4goldw, ROT0, "BFM","Golden Winner (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4goldwb ,sc4goldw, sc4_3reel, sc4goldw, sc4_state, sc4goldw, ROT0, "BFM","Golden Winner (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4goldwc ,sc4goldw, sc4_3reel, sc4goldw, sc4_state, sc4goldw, ROT0, "BFM","Golden Winner (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4goldw ,0, sc4_3reel, sc4goldw, sc4_state, sc4goldw, ROT0, "BFM","Golden Winner (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4goldwa ,sc4goldw, sc4_3reel, sc4goldw, sc4_state, sc4goldw, ROT0, "BFM","Golden Winner (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4goldwb ,sc4goldw, sc4_3reel, sc4goldw, sc4_state, sc4goldw, ROT0, "BFM","Golden Winner (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4goldwc ,sc4goldw, sc4_3reel, sc4goldw, sc4_state, sc4goldw, ROT0, "BFM","Golden Winner (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR1437 GOLDEN WINNER PR1436 TRIPLE CASINO SOUNDS11 // these show init comms
-GAMEL( 200?, sc4goldwd ,sc4goldw, sc4, sc4goldwd, sc4_state, sc4, ROT0, "BFM","Golden Winner (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4goldwe ,sc4goldw, sc4, sc4goldwd, sc4_state, sc4, ROT0, "BFM","Golden Winner (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4goldwf ,sc4goldw, sc4, sc4goldwd, sc4_state, sc4, ROT0, "BFM","Golden Winner (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4goldwg ,sc4goldw, sc4, sc4goldwd, sc4_state, sc4, ROT0, "BFM","Golden Winner (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4goldwd ,sc4goldw, sc4, sc4goldwd, sc4_state, sc4, ROT0, "BFM","Golden Winner (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4goldwe ,sc4goldw, sc4, sc4goldwd, sc4_state, sc4, ROT0, "BFM","Golden Winner (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4goldwf ,sc4goldw, sc4, sc4goldwd, sc4_state, sc4, ROT0, "BFM","Golden Winner (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4goldwg ,sc4goldw, sc4, sc4goldwd, sc4_state, sc4, ROT0, "BFM","Golden Winner (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
INPUT_PORTS_START( sc4ggdlx ) // this structure is generated
PORT_INCLUDE( sc4_base )
@@ -26059,16 +26061,16 @@ INPUT_PORTS_END
// GGDX
// these were in the golden game sets
// PR2201 GOLDEN X GOLDEN GAME MAZ GXDX SOUNDS GOLDEN GAME DLX
-GAMEL( 200?, sc4ggdlx ,0, sc4, sc4ggdlx, sc4_state, sc4ggame, ROT0, "Mazooma","Golden Game Deluxe (Mazooma) (PR2201) (Scorpion 4) (GGDX, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ggdlxc ,sc4ggdlx, sc4, sc4ggdlx, sc4_state, sc4ggame, ROT0, "Mazooma","Golden Game Deluxe (Mazooma) (PR2201) (Scorpion 4) (GGDX, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4ggdlx ,0, sc4, sc4ggdlx, sc4_state, sc4ggame, ROT0, "Mazooma","Golden Game Deluxe (Mazooma) (PR2201) (Scorpion 4) (GGDX, set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ggdlxc ,sc4ggdlx, sc4, sc4ggdlx, sc4_state, sc4ggame, ROT0, "Mazooma","Golden Game Deluxe (Mazooma) (PR2201) (Scorpion 4) (GGDX, set 2)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
// PR2201 GOLDEN X GOLDEN GAME DLX MAZ GXDX SOUNDS GOLDEN X
-GAMEL( 200?, sc4ggdlxa ,sc4ggdlx, sc4, sc4ggdlx, sc4_state, sc4ggame, ROT0, "Mazooma","Golden Game Deluxe (Mazooma) (PR2201) (Scorpion 4) (GGDX, set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ggdlxb ,sc4ggdlx, sc4, sc4ggdlx, sc4_state, sc4ggame, ROT0, "Mazooma","Golden Game Deluxe (Mazooma) (PR2201) (Scorpion 4) (GGDX, set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
-GAMEL( 200?, sc4ggdlxd ,sc4ggdlx, sc4, sc4ggdlx, sc4_state, sc4ggame, ROT0, "Mazooma","Golden Game Deluxe (Mazooma) (PR2201) (Scorpion 4) (GGDX, set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
-GAMEL( 200?, sc4ggdlxe ,sc4ggdlx, sc4, sc4ggdlx, sc4_state, sc4ggame, ROT0, "Mazooma","Golden Game Deluxe (Mazooma) (PR2201) (Scorpion 4) (GGDX, set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4ggdlxa ,sc4ggdlx, sc4, sc4ggdlx, sc4_state, sc4ggame, ROT0, "Mazooma","Golden Game Deluxe (Mazooma) (PR2201) (Scorpion 4) (GGDX, set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ggdlxb ,sc4ggdlx, sc4, sc4ggdlx, sc4_state, sc4ggame, ROT0, "Mazooma","Golden Game Deluxe (Mazooma) (PR2201) (Scorpion 4) (GGDX, set 4)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4ggdlxd ,sc4ggdlx, sc4, sc4ggdlx, sc4_state, sc4ggame, ROT0, "Mazooma","Golden Game Deluxe (Mazooma) (PR2201) (Scorpion 4) (GGDX, set 5)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4ggdlxe ,sc4ggdlx, sc4, sc4ggdlx, sc4_state, sc4ggame, ROT0, "Mazooma","Golden Game Deluxe (Mazooma) (PR2201) (Scorpion 4) (GGDX, set 6)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
// PR2201 GOLDEN GAME DELUXE GOLDEN GAME MAZ GXDX SOUNDS GOLDEN GAME DLX
-GAMEL( 200?, sc4ggdlxf ,sc4ggdlx, sc4, sc4ggdlx, sc4_state, sc4ggame, ROT0, "Mazooma","Golden Game Deluxe (Mazooma) (PR2201) (Scorpion 4) (GGDX, set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ggdlxg ,sc4ggdlx, sc4, sc4ggdlx, sc4_state, sc4ggame, ROT0, "Mazooma","Golden Game Deluxe (Mazooma) (PR2201) (Scorpion 4) (GGDX, set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4ggdlxf ,sc4ggdlx, sc4, sc4ggdlx, sc4_state, sc4ggame, ROT0, "Mazooma","Golden Game Deluxe (Mazooma) (PR2201) (Scorpion 4) (GGDX, set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ggdlxg ,sc4ggdlx, sc4, sc4ggdlx, sc4_state, sc4ggame, ROT0, "Mazooma","Golden Game Deluxe (Mazooma) (PR2201) (Scorpion 4) (GGDX, set 8)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
@@ -26139,8 +26141,8 @@ INPUT_PORTS_START( sc4greed ) // this structure is generated
INPUT_PORTS_END
// PR1401 AWP GREEDY GONZALEZ PR1401 GREEDY GONZ SOUNDS11
-GAMEL( 200?, sc4greed ,0, sc4_4reel_alt, sc4greed, sc4_state, sc4greed, ROT0, "BFM","Greedy Gonzalez (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4greeda ,sc4greed, sc4_4reel_alt, sc4greed, sc4_state, sc4greed, ROT0, "BFM","Greedy Gonzalez (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4greed ,0, sc4_4reel_alt, sc4greed, sc4_state, sc4greed, ROT0, "BFM","Greedy Gonzalez (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4greeda ,sc4greed, sc4_4reel_alt, sc4greed, sc4_state, sc4greed, ROT0, "BFM","Greedy Gonzalez (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4hf)
@@ -26205,14 +26207,14 @@ INPUT_PORTS_START( sc4hf ) // this structure is generated
INPUT_PORTS_END
//PR1011 HAPPY FRUITS PR1011 HAPPY FRUITS SOUNDS11
-GAMEL( 200?, sc4hf ,0, sc4_4reel, sc4hf, sc4_state, sc4hf, ROT0, "BFM","Happy Fruits (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hfa ,sc4hf, sc4_4reel, sc4hf, sc4_state, sc4hf, ROT0, "BFM","Happy Fruits (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hfb ,sc4hf, sc4_4reel, sc4hf, sc4_state, sc4hf, ROT0, "BFM","Happy Fruits (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hfc ,sc4hf, sc4_4reel, sc4hf, sc4_state, sc4hf, ROT0, "BFM","Happy Fruits (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hfd ,sc4hf, sc4_4reel, sc4hf, sc4_state, sc4hf, ROT0, "BFM","Happy Fruits (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hfe ,sc4hf, sc4_4reel, sc4hf, sc4_state, sc4hf, ROT0, "BFM","Happy Fruits (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hff ,sc4hf, sc4_4reel, sc4hf, sc4_state, sc4hf, ROT0, "BFM","Happy Fruits (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hfg ,sc4hf, sc4_4reel, sc4hf, sc4_state, sc4hf, ROT0, "BFM","Happy Fruits (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4hf ,0, sc4_4reel, sc4hf, sc4_state, sc4hf, ROT0, "BFM","Happy Fruits (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hfa ,sc4hf, sc4_4reel, sc4hf, sc4_state, sc4hf, ROT0, "BFM","Happy Fruits (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hfb ,sc4hf, sc4_4reel, sc4hf, sc4_state, sc4hf, ROT0, "BFM","Happy Fruits (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hfc ,sc4hf, sc4_4reel, sc4hf, sc4_state, sc4hf, ROT0, "BFM","Happy Fruits (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hfd ,sc4hf, sc4_4reel, sc4hf, sc4_state, sc4hf, ROT0, "BFM","Happy Fruits (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hfe ,sc4hf, sc4_4reel, sc4hf, sc4_state, sc4hf, ROT0, "BFM","Happy Fruits (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hff ,sc4hf, sc4_4reel, sc4hf, sc4_state, sc4hf, ROT0, "BFM","Happy Fruits (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hfg ,sc4hf, sc4_4reel, sc4hf, sc4_state, sc4hf, ROT0, "BFM","Happy Fruits (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4himi)
@@ -26263,18 +26265,18 @@ INPUT_PORTS_START( sc4himi ) // this structure is generated
INPUT_PORTS_END
// PR2999 HIGH 'N' MIGHTY MITY SOUNDS HIGH 'N' MIGHTY
-GAMEL( 200?, sc4himi ,0, sc4_4reel_alt, sc4himi, sc4_state, sc4himi, ROT0, "Mazooma","High 'n' Mighty (PR2999) (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4himic ,sc4himi, sc4_4reel_alt, sc4himi, sc4_state, sc4himi, ROT0, "Mazooma","High 'n' Mighty (PR2999) (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4himif ,sc4himi, sc4_4reel_alt, sc4himi, sc4_state, sc4himi, ROT0, "Mazooma","High 'n' Mighty (PR2999) (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4himig ,sc4himi, sc4_4reel_alt, sc4himi, sc4_state, sc4himi, ROT0, "Mazooma","High 'n' Mighty (PR2999) (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4himih ,sc4himi, sc4_4reel_alt, sc4himi, sc4_state, sc4himi, ROT0, "Mazooma","High 'n' Mighty (PR2999) (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4himii ,sc4himi, sc4_4reel_alt, sc4himi, sc4_state, sc4himi, ROT0, "Mazooma","High 'n' Mighty (PR2999) (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4himi ,0, sc4_4reel_alt, sc4himi, sc4_state, sc4himi, ROT0, "Mazooma","High 'n' Mighty (PR2999) (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4himic ,sc4himi, sc4_4reel_alt, sc4himi, sc4_state, sc4himi, ROT0, "Mazooma","High 'n' Mighty (PR2999) (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4himif ,sc4himi, sc4_4reel_alt, sc4himi, sc4_state, sc4himi, ROT0, "Mazooma","High 'n' Mighty (PR2999) (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4himig ,sc4himi, sc4_4reel_alt, sc4himi, sc4_state, sc4himi, ROT0, "Mazooma","High 'n' Mighty (PR2999) (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4himih ,sc4himi, sc4_4reel_alt, sc4himi, sc4_state, sc4himi, ROT0, "Mazooma","High 'n' Mighty (PR2999) (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4himii ,sc4himi, sc4_4reel_alt, sc4himi, sc4_state, sc4himi, ROT0, "Mazooma","High 'n' Mighty (PR2999) (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2119 HIGH 'N' MIGHTY MITY SOUNDS HIGH 'N' MIGHTY
-GAMEL( 200?, sc4himia ,sc4himi, sc4_4reel_alt, sc4himi, sc4_state, sc4himi, ROT0, "Mazooma","High 'n' Mighty (PR2119) (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4himie ,sc4himi, sc4_4reel_alt, sc4himi, sc4_state, sc4himi, ROT0, "Mazooma","High 'n' Mighty (PR2119) (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4himia ,sc4himi, sc4_4reel_alt, sc4himi, sc4_state, sc4himi, ROT0, "Mazooma","High 'n' Mighty (PR2119) (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4himie ,sc4himi, sc4_4reel_alt, sc4himi, sc4_state, sc4himi, ROT0, "Mazooma","High 'n' Mighty (PR2119) (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2067 HIGH 'N' MIGHTY MITY SOUNDS HIGH 'N' MIGHTY
-GAMEL( 200?, sc4himib ,sc4himi, sc4_4reel_alt, sc4himi, sc4_state, sc4himi, ROT0, "Mazooma","High 'n' Mighty (PR2067) (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4himid ,sc4himi, sc4_4reel_alt, sc4himi, sc4_state, sc4himi, ROT0, "Mazooma","High 'n' Mighty (PR2067) (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4himib ,sc4himi, sc4_4reel_alt, sc4himi, sc4_state, sc4himi, ROT0, "Mazooma","High 'n' Mighty (PR2067) (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4himid ,sc4himi, sc4_4reel_alt, sc4himi, sc4_state, sc4himi, ROT0, "Mazooma","High 'n' Mighty (PR2067) (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -26341,14 +26343,14 @@ INPUT_PORTS_START( sc4hi5 ) // this structure is generated
INPUT_PORTS_END
// PR1003 HIGH FIVE PR1003 HIGH FIVE SOUNDS11
-GAMEL( 200?, sc4hi5 ,0, sc4_4reel, sc4hi5, sc4_state, sc4hi5, ROT0, "BFM","High 5 (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hi5b ,sc4hi5, sc4_4reel, sc4hi5, sc4_state, sc4hi5, ROT0, "BFM","High 5 (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hi5d ,sc4hi5, sc4_4reel, sc4hi5, sc4_state, sc4hi5, ROT0, "BFM","High 5 (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hi5f ,sc4hi5, sc4_4reel, sc4hi5, sc4_state, sc4hi5, ROT0, "BFM","High 5 (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hi5a ,sc4hi5, sc4_4reel, sc4hi5, sc4_state, sc4hi5, ROT0, "BFM / Whitbread","High 5 (Bellfruit / Whitbread) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hi5c ,sc4hi5, sc4_4reel, sc4hi5, sc4_state, sc4hi5, ROT0, "BFM / Whitbread","High 5 (Bellfruit / Whitbread) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hi5e ,sc4hi5, sc4_4reel, sc4hi5, sc4_state, sc4hi5, ROT0, "BFM / Whitbread","High 5 (Bellfruit / Whitbread) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hi5g ,sc4hi5, sc4_4reel, sc4hi5, sc4_state, sc4hi5, ROT0, "BFM / Whitbread","High 5 (Bellfruit / Whitbread) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4hi5 ,0, sc4_4reel, sc4hi5, sc4_state, sc4hi5, ROT0, "BFM","High 5 (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hi5b ,sc4hi5, sc4_4reel, sc4hi5, sc4_state, sc4hi5, ROT0, "BFM","High 5 (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hi5d ,sc4hi5, sc4_4reel, sc4hi5, sc4_state, sc4hi5, ROT0, "BFM","High 5 (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hi5f ,sc4hi5, sc4_4reel, sc4hi5, sc4_state, sc4hi5, ROT0, "BFM","High 5 (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hi5a ,sc4hi5, sc4_4reel, sc4hi5, sc4_state, sc4hi5, ROT0, "BFM / Whitbread","High 5 (Bellfruit / Whitbread) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hi5c ,sc4hi5, sc4_4reel, sc4hi5, sc4_state, sc4hi5, ROT0, "BFM / Whitbread","High 5 (Bellfruit / Whitbread) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hi5e ,sc4hi5, sc4_4reel, sc4hi5, sc4_state, sc4hi5, ROT0, "BFM / Whitbread","High 5 (Bellfruit / Whitbread) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hi5g ,sc4hi5, sc4_4reel, sc4hi5, sc4_state, sc4hi5, ROT0, "BFM / Whitbread","High 5 (Bellfruit / Whitbread) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4sprng)
@@ -26403,7 +26405,7 @@ INPUT_PORTS_START( sc4sprng ) // this structure is generated
INPUT_PORTS_END
// PR2066 HIGHLY SPRUNG HIGH SOUNDS HIGHLY SPRUNG
-GAMEL( 200?, sc4sprng ,0, sc4_4reel_alt, sc4sprng, sc4_state, sc4sprng, ROT0, "Mazooma","Highly Sprung (Mazooma) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4sprng ,0, sc4_4reel_alt, sc4sprng, sc4_state, sc4sprng, ROT0, "Mazooma","Highly Sprung (Mazooma) (Scorpion 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4hilo)
@@ -26482,18 +26484,18 @@ INPUT_PORTS_START( sc4hilo ) // this structure is generated
INPUT_PORTS_END
// PR1013 HILOWATHA PR1013 HILOWATHA SOUNDS11
-GAMEL( 200?, sc4hilo ,0, sc4_200_4ra, sc4hilo, sc4_state, sc4hilo, ROT0, "BFM","Hilowatha (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hiloa ,sc4hilo, sc4_200_4ra, sc4hilo, sc4_state, sc4hilo, ROT0, "BFM","Hilowatha (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hilob ,sc4hilo, sc4_200_4ra, sc4hilo, sc4_state, sc4hilo, ROT0, "BFM","Hilowatha (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hiloc ,sc4hilo, sc4_200_4ra, sc4hilo, sc4_state, sc4hilo, ROT0, "BFM","Hilowatha (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hilod ,sc4hilo, sc4_200_4ra, sc4hilo, sc4_state, sc4hilo, ROT0, "BFM","Hilowatha (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hiloe ,sc4hilo, sc4_200_4ra, sc4hilo, sc4_state, sc4hilo, ROT0, "BFM","Hilowatha (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hilof ,sc4hilo, sc4_200_4ra, sc4hilo, sc4_state, sc4hilo, ROT0, "BFM","Hilowatha (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hilog ,sc4hilo, sc4_200_4ra, sc4hilo, sc4_state, sc4hilo, ROT0, "BFM","Hilowatha (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hiloh ,sc4hilo, sc4_200_4ra, sc4hilo, sc4_state, sc4hilo, ROT0, "BFM","Hilowatha (Bellfruit) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hiloi ,sc4hilo, sc4_200_4ra, sc4hilo, sc4_state, sc4hilo, ROT0, "BFM","Hilowatha (Bellfruit) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hiloj ,sc4hilo, sc4_200_4ra, sc4hilo, sc4_state, sc4hilo, ROT0, "BFM","Hilowatha (Bellfruit) (Scorpion 4) (set 11)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hilok ,sc4hilo, sc4_200_4ra, sc4hilo, sc4_state, sc4hilo, ROT0, "BFM","Hilowatha (Bellfruit) (Scorpion 4) (set 12)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4hilo ,0, sc4_200_4ra, sc4hilo, sc4_state, sc4hilo, ROT0, "BFM","Hilowatha (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hiloa ,sc4hilo, sc4_200_4ra, sc4hilo, sc4_state, sc4hilo, ROT0, "BFM","Hilowatha (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hilob ,sc4hilo, sc4_200_4ra, sc4hilo, sc4_state, sc4hilo, ROT0, "BFM","Hilowatha (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hiloc ,sc4hilo, sc4_200_4ra, sc4hilo, sc4_state, sc4hilo, ROT0, "BFM","Hilowatha (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hilod ,sc4hilo, sc4_200_4ra, sc4hilo, sc4_state, sc4hilo, ROT0, "BFM","Hilowatha (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hiloe ,sc4hilo, sc4_200_4ra, sc4hilo, sc4_state, sc4hilo, ROT0, "BFM","Hilowatha (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hilof ,sc4hilo, sc4_200_4ra, sc4hilo, sc4_state, sc4hilo, ROT0, "BFM","Hilowatha (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hilog ,sc4hilo, sc4_200_4ra, sc4hilo, sc4_state, sc4hilo, ROT0, "BFM","Hilowatha (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hiloh ,sc4hilo, sc4_200_4ra, sc4hilo, sc4_state, sc4hilo, ROT0, "BFM","Hilowatha (Bellfruit) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hiloi ,sc4hilo, sc4_200_4ra, sc4hilo, sc4_state, sc4hilo, ROT0, "BFM","Hilowatha (Bellfruit) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hiloj ,sc4hilo, sc4_200_4ra, sc4hilo, sc4_state, sc4hilo, ROT0, "BFM","Hilowatha (Bellfruit) (Scorpion 4) (set 11)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hilok ,sc4hilo, sc4_200_4ra, sc4hilo, sc4_state, sc4hilo, ROT0, "BFM","Hilowatha (Bellfruit) (Scorpion 4) (set 12)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -26574,12 +26576,12 @@ INPUT_PORTS_START( sc4hitsh ) // this structure is generated
INPUT_PORTS_END
// PR1112 HIT SHOT PR1112 HIT SHOT SOUNDS11
-GAMEL( 200?, sc4hitsh ,0, sc4_200_4rb, sc4hitsh, sc4_state, sc4hitsh, ROT0, "BFM","Hit Shot (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hitsha ,sc4hitsh, sc4_200_4rb, sc4hitsh, sc4_state, sc4hitsh, ROT0, "BFM","Hit Shot (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hitshb ,sc4hitsh, sc4_200_4rb, sc4hitsh, sc4_state, sc4hitsh, ROT0, "BFM","Hit Shot (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hitshc ,sc4hitsh, sc4_200_4rb, sc4hitsh, sc4_state, sc4hitsh, ROT0, "BFM","Hit Shot (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hitshd ,sc4hitsh, sc4_200_4rb, sc4hitsh, sc4_state, sc4hitsh, ROT0, "BFM","Hit Shot (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hitshe ,sc4hitsh, sc4_200_4rb, sc4hitsh, sc4_state, sc4hitsh, ROT0, "BFM","Hit Shot (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4hitsh ,0, sc4_200_4rb, sc4hitsh, sc4_state, sc4hitsh, ROT0, "BFM","Hit Shot (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hitsha ,sc4hitsh, sc4_200_4rb, sc4hitsh, sc4_state, sc4hitsh, ROT0, "BFM","Hit Shot (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hitshb ,sc4hitsh, sc4_200_4rb, sc4hitsh, sc4_state, sc4hitsh, ROT0, "BFM","Hit Shot (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hitshc ,sc4hitsh, sc4_200_4rb, sc4hitsh, sc4_state, sc4hitsh, ROT0, "BFM","Hit Shot (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hitshd ,sc4hitsh, sc4_200_4rb, sc4hitsh, sc4_state, sc4hitsh, ROT0, "BFM","Hit Shot (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hitshe ,sc4hitsh, sc4_200_4rb, sc4hitsh, sc4_state, sc4hitsh, ROT0, "BFM","Hit Shot (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4h6cl)
{
@@ -26647,10 +26649,10 @@ INPUT_PORTS_START( sc4h6cl ) // this structure is generated
INPUT_PORTS_END
// PR1759 CLUB HOT SIX HOT SIX CLUB PR1759 HOSX SOUNDS11
-GAMEL( 200?, sc4h6cl ,0, sc4, sc4h6cl, sc4_state, sc4h6cl, ROT0, "BFM","Hot Six Club (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4h6cla ,sc4h6cl, sc4, sc4h6cl, sc4_state, sc4h6cl, ROT0, "BFM","Hot Six Club (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4h6clb ,sc4h6cl, sc4, sc4h6cl, sc4_state, sc4h6cl, ROT0, "BFM","Hot Six Club (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4h6clc ,sc4h6cl, sc4, sc4h6cl, sc4_state, sc4h6cl, ROT0, "BFM","Hot Six Club (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4h6cl ,0, sc4, sc4h6cl, sc4_state, sc4h6cl, ROT0, "BFM","Hot Six Club (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4h6cla ,sc4h6cl, sc4, sc4h6cl, sc4_state, sc4h6cl, ROT0, "BFM","Hot Six Club (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4h6clb ,sc4h6cl, sc4, sc4h6cl, sc4_state, sc4h6cl, ROT0, "BFM","Hot Six Club (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4h6clc ,sc4h6cl, sc4, sc4h6cl, sc4_state, sc4h6cl, ROT0, "BFM","Hot Six Club (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -26716,7 +26718,7 @@ INPUT_PORTS_START( sc4ijclb ) // this structure is generated
INPUT_PORTS_END
// PR2403 CLUB ITALIAN JOB CLUB ITALIAN JOB CLUB CLUB ITJB SOUNDS
-GAMEL( 200?, sc4ijclb ,0, sc4, sc4ijclb, sc4_state, sc4ijclb, ROT0, "Mazooma","Italian Job Club (Mazooma) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4ijclb ,0, sc4, sc4ijclb, sc4_state, sc4ijclb, ROT0, "Mazooma","Italian Job Club (Mazooma) (Scorpion 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4jack)
{
@@ -26771,14 +26773,14 @@ INPUT_PORTS_START( sc4jack ) // this structure is generated
INPUT_PORTS_END
// PR2078 JACK THE KIPPER JKIP SOUNDS JACK THE KIPPER
-GAMEL( 200?, sc4jack ,0, sc4_200_5ra, sc4jack, sc4_state, sc4jack, ROT0, "Mazooma","Jack The Kipper (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4jacka ,sc4jack, sc4_200_5ra, sc4jack, sc4_state, sc4jack, ROT0, "Mazooma","Jack The Kipper (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4jackb ,sc4jack, sc4_200_5ra, sc4jack, sc4_state, sc4jack, ROT0, "Mazooma","Jack The Kipper (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4jackc ,sc4jack, sc4_200_5ra, sc4jack, sc4_state, sc4jack, ROT0, "Mazooma","Jack The Kipper (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4jackd ,sc4jack, sc4_200_5ra, sc4jack, sc4_state, sc4jack, ROT0, "Mazooma","Jack The Kipper (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4jacke ,sc4jack, sc4_200_5ra, sc4jack, sc4_state, sc4jack, ROT0, "Mazooma","Jack The Kipper (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4jackf ,sc4jack, sc4_200_5ra, sc4jack, sc4_state, sc4jack, ROT0, "Mazooma","Jack The Kipper (Mazooma) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4jackg ,sc4jack, sc4_200_5ra, sc4jack, sc4_state, sc4jack, ROT0, "Mazooma","Jack The Kipper (Mazooma) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4jack ,0, sc4_200_5ra, sc4jack, sc4_state, sc4jack, ROT0, "Mazooma","Jack The Kipper (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4jacka ,sc4jack, sc4_200_5ra, sc4jack, sc4_state, sc4jack, ROT0, "Mazooma","Jack The Kipper (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4jackb ,sc4jack, sc4_200_5ra, sc4jack, sc4_state, sc4jack, ROT0, "Mazooma","Jack The Kipper (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4jackc ,sc4jack, sc4_200_5ra, sc4jack, sc4_state, sc4jack, ROT0, "Mazooma","Jack The Kipper (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4jackd ,sc4jack, sc4_200_5ra, sc4jack, sc4_state, sc4jack, ROT0, "Mazooma","Jack The Kipper (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4jacke ,sc4jack, sc4_200_5ra, sc4jack, sc4_state, sc4jack, ROT0, "Mazooma","Jack The Kipper (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4jackf ,sc4jack, sc4_200_5ra, sc4jack, sc4_state, sc4jack, ROT0, "Mazooma","Jack The Kipper (Mazooma) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4jackg ,sc4jack, sc4_200_5ra, sc4jack, sc4_state, sc4jack, ROT0, "Mazooma","Jack The Kipper (Mazooma) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -26850,16 +26852,16 @@ INPUT_PORTS_START( sc4jjunc ) // this structure is generated
INPUT_PORTS_END
// PR1304 JACKPOT JUNCTION PR1304 JACKPOT JUNCTION SOUNDS11
-GAMEL( 2002, sc4jjunc ,0, sc4, sc4jjunc, sc4_state, sc4jjunc, ROT0, "BFM","Jackpot Junction (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 2002, sc4jjunca ,sc4jjunc, sc4, sc4jjunc, sc4_state, sc4jjunc, ROT0, "BFM","Jackpot Junction (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 2002, sc4jjuncb ,sc4jjunc, sc4, sc4jjunc, sc4_state, sc4jjunc, ROT0, "BFM","Jackpot Junction (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 2002, sc4jjuncc ,sc4jjunc, sc4, sc4jjunc, sc4_state, sc4jjunc, ROT0, "BFM","Jackpot Junction (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 2002, sc4jjuncd ,sc4jjunc, sc4, sc4jjunc, sc4_state, sc4jjunc, ROT0, "BFM","Jackpot Junction (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 2002, sc4jjunce ,sc4jjunc, sc4, sc4jjunc, sc4_state, sc4jjunc, ROT0, "BFM","Jackpot Junction (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 2002, sc4jjuncf ,sc4jjunc, sc4, sc4jjunc, sc4_state, sc4jjunc, ROT0, "BFM","Jackpot Junction (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 2002, sc4jjuncg ,sc4jjunc, sc4, sc4jjunc, sc4_state, sc4jjunc, ROT0, "BFM","Jackpot Junction (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 2002, sc4jjunch ,sc4jjunc, sc4, sc4jjunc, sc4_state, sc4jjunc, ROT0, "BFM","Jackpot Junction (Bellfruit) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 2002, sc4jjunci ,sc4jjunc, sc4, sc4jjunc, sc4_state, sc4jjunc, ROT0, "BFM","Jackpot Junction (Bellfruit) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 2002, sc4jjunc ,0, sc4, sc4jjunc, sc4_state, sc4jjunc, ROT0, "BFM","Jackpot Junction (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 2002, sc4jjunca ,sc4jjunc, sc4, sc4jjunc, sc4_state, sc4jjunc, ROT0, "BFM","Jackpot Junction (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 2002, sc4jjuncb ,sc4jjunc, sc4, sc4jjunc, sc4_state, sc4jjunc, ROT0, "BFM","Jackpot Junction (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 2002, sc4jjuncc ,sc4jjunc, sc4, sc4jjunc, sc4_state, sc4jjunc, ROT0, "BFM","Jackpot Junction (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 2002, sc4jjuncd ,sc4jjunc, sc4, sc4jjunc, sc4_state, sc4jjunc, ROT0, "BFM","Jackpot Junction (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 2002, sc4jjunce ,sc4jjunc, sc4, sc4jjunc, sc4_state, sc4jjunc, ROT0, "BFM","Jackpot Junction (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 2002, sc4jjuncf ,sc4jjunc, sc4, sc4jjunc, sc4_state, sc4jjunc, ROT0, "BFM","Jackpot Junction (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 2002, sc4jjuncg ,sc4jjunc, sc4, sc4jjunc, sc4_state, sc4jjunc, ROT0, "BFM","Jackpot Junction (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 2002, sc4jjunch ,sc4jjunc, sc4, sc4jjunc, sc4_state, sc4jjunc, ROT0, "BFM","Jackpot Junction (Bellfruit) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 2002, sc4jjunci ,sc4jjunc, sc4, sc4jjunc, sc4_state, sc4jjunc, ROT0, "BFM","Jackpot Junction (Bellfruit) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
//should R6 have a reel?
@@ -26936,14 +26938,14 @@ INPUT_PORTS_END
// REEL7 ERR 27 (where does reel 7 connect?!)
// PR1422 CLUB JACKPOT JUNCTION PR1422 JACKPOT JUNCTION SOUNDS11
-GAMEL( 200?, sc4jjucl ,0, sc4_5reel, sc4jjucl, sc4_state, sc4jjucl, ROT0, "BFM","Jackpot Junction Club (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4jjuclb ,sc4jjucl, sc4_5reel, sc4jjucl, sc4_state, sc4jjucl, ROT0, "BFM","Jackpot Junction Club (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4jjucl ,0, sc4_5reel, sc4jjucl, sc4_state, sc4jjucl, ROT0, "BFM","Jackpot Junction Club (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4jjuclb ,sc4jjucl, sc4_5reel, sc4jjucl, sc4_state, sc4jjucl, ROT0, "BFM","Jackpot Junction Club (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR1422 CLUB JACKPOT JUNCTION JACKPOT JUNCTION CLUB PR1422 JACKPOT JUNCTION SOUNDS11
-GAMEL( 200?, sc4jjucld ,sc4jjucl, sc4_5reel, sc4jjucl, sc4_state, sc4jjucl_mbus, ROT0, "BFM","Jackpot Junction Club (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4jjucle ,sc4jjucl, sc4_5reel, sc4jjucl, sc4_state, sc4jjucl_mbus, ROT0, "BFM","Jackpot Junction Club (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4jjucld ,sc4jjucl, sc4_5reel, sc4jjucl, sc4_state, sc4jjucl_mbus, ROT0, "BFM","Jackpot Junction Club (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4jjucle ,sc4jjucl, sc4_5reel, sc4jjucl, sc4_state, sc4jjucl_mbus, ROT0, "BFM","Jackpot Junction Club (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR1422 CLUB JACKPOT JUNCTION FERRY PR1422 JACKPOT JUNCTION SOUNDS11
-GAMEL( 200?, sc4jjucla ,sc4jjucl, sc4_5reel, sc4jjucl, sc4_state, sc4jjucl, ROT0, "BFM","Jackpot Junction Club (Ferry) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4jjuclc ,sc4jjucl, sc4_5reel, sc4jjucl, sc4_state, sc4jjucl, ROT0, "BFM","Jackpot Junction Club (Ferry) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4jjucla ,sc4jjucl, sc4_5reel, sc4jjucl, sc4_state, sc4jjucl, ROT0, "BFM","Jackpot Junction Club (Ferry) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4jjuclc ,sc4jjucl, sc4_5reel, sc4jjucl, sc4_state, sc4jjucl, ROT0, "BFM","Jackpot Junction Club (Ferry) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4jolly)
@@ -27002,8 +27004,8 @@ INPUT_PORTS_START( sc4jolly ) // this structure is generated
INPUT_PORTS_END
// PR2054 JOLLY JOUSTINGV2.0 JJOLLSND JOLLY JOUSTING
-GAMEL( 200?, sc4jolly ,0, sc4_200_5r, sc4jolly, sc4_state, sc4jolly, ROT0, "Qps","Jolly Jousting (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4jollya ,sc4jolly, sc4_200_5r, sc4jolly, sc4_state, sc4jolly, ROT0, "Qps","Jolly Jousting (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4jolly ,0, sc4_200_5r, sc4jolly, sc4_state, sc4jolly, ROT0, "Qps","Jolly Jousting (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4jollya ,sc4jolly, sc4_200_5r, sc4jolly, sc4_state, sc4jolly, ROT0, "Qps","Jolly Jousting (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -27064,20 +27066,20 @@ INPUT_PORTS_START( sc4juicy ) // this structure is generated
INPUT_PORTS_END
// PR1136 JUICY JACKPOTS 65% FERRY PR1136 JUICY JACKPOTS SOUNDS11
-GAMEL( 200?, sc4juicy ,0, sc4_5reel, sc4juicy, sc4_state, sc4juicy, ROT0, "BFM","Juicy Jackpots Club (PR1136) (65% Ferry) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4juicyb ,sc4juicy, sc4_5reel, sc4juicy, sc4_state, sc4juicy, ROT0, "BFM","Juicy Jackpots Club (PR1136) (65% Ferry) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4juicy ,0, sc4_5reel, sc4juicy, sc4_state, sc4juicy, ROT0, "BFM","Juicy Jackpots Club (PR1136) (65% Ferry) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4juicyb ,sc4juicy, sc4_5reel, sc4juicy, sc4_state, sc4juicy, ROT0, "BFM","Juicy Jackpots Club (PR1136) (65% Ferry) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR1136 JUICY JACKPOTS PR1136 JUICY JACKPOTS SOUNDS11
-GAMEL( 200?, sc4juicyd ,sc4juicy, sc4_5reel, sc4juicy, sc4_state, sc4juicy, ROT0, "BFM","Juicy Jackpots Club (PR1136) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4juicye ,sc4juicy, sc4_5reel, sc4juicy, sc4_state, sc4juicy, ROT0, "BFM","Juicy Jackpots Club (PR1136) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4juicyf ,sc4juicy, sc4_5reel, sc4juicy, sc4_state, sc4juicy, ROT0, "BFM","Juicy Jackpots Club (PR1136) (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4juicyg ,sc4juicy, sc4_5reel, sc4juicy, sc4_state, sc4juicy, ROT0, "BFM","Juicy Jackpots Club (PR1136) (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4juicyd ,sc4juicy, sc4_5reel, sc4juicy, sc4_state, sc4juicy, ROT0, "BFM","Juicy Jackpots Club (PR1136) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4juicye ,sc4juicy, sc4_5reel, sc4juicy, sc4_state, sc4juicy, ROT0, "BFM","Juicy Jackpots Club (PR1136) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4juicyf ,sc4juicy, sc4_5reel, sc4juicy, sc4_state, sc4juicy, ROT0, "BFM","Juicy Jackpots Club (PR1136) (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4juicyg ,sc4juicy, sc4_5reel, sc4juicy, sc4_state, sc4juicy, ROT0, "BFM","Juicy Jackpots Club (PR1136) (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR1136 JUICY JACKPOTS JUICY JACKPOTS CLUB PR1136 JUICY JACKPOTS SOUNDS11
-GAMEL( 200?, sc4juicyi ,sc4juicy, sc4_5reel, sc4juicy, sc4_state, sc4juicy_mbus, ROT0, "BFM","Juicy Jackpots Club (PR1136) (Bellfruit) (Scorpion 4) (311 Club, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4juicyj ,sc4juicy, sc4_5reel, sc4juicy, sc4_state, sc4juicy_mbus, ROT0, "BFM","Juicy Jackpots Club (PR1136) (Bellfruit) (Scorpion 4) (311 Club, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4juicyi ,sc4juicy, sc4_5reel, sc4juicy, sc4_state, sc4juicy_mbus, ROT0, "BFM","Juicy Jackpots Club (PR1136) (Bellfruit) (Scorpion 4) (311 Club, set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4juicyj ,sc4juicy, sc4_5reel, sc4juicy, sc4_state, sc4juicy_mbus, ROT0, "BFM","Juicy Jackpots Club (PR1136) (Bellfruit) (Scorpion 4) (311 Club, set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// this has a different (wrong?) product ID and issues with the VFD even during startup, maybe a buggy release?
// PR1123 JUICY JACKPOTS PR1136 JUICY JACKPOTS SOUNDS11
-GAMEL( 200?, sc4juicya ,sc4juicy, sc4_5reel, sc4juicy, sc4_state, sc4juicy, ROT0, "BFM","Juicy Jackpots Club (PR1123) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4juicyc ,sc4juicy, sc4_5reel, sc4juicy, sc4_state, sc4juicy, ROT0, "BFM","Juicy Jackpots Club (PR1123) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4juicya ,sc4juicy, sc4_5reel, sc4juicy, sc4_state, sc4juicy, ROT0, "BFM","Juicy Jackpots Club (PR1123) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4juicyc ,sc4juicy, sc4_5reel, sc4juicy, sc4_state, sc4juicy, ROT0, "BFM","Juicy Jackpots Club (PR1123) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4kalei)
@@ -27133,14 +27135,14 @@ INPUT_PORTS_START( sc4kalei ) // this structure is generated
INPUT_PORTS_END
// PR2538 KALEIDOSCOPE 011 KALEIDOSCOPESND KALEIDOSCOPE
-GAMEL( 200?, sc4kalei ,0, sc4_4reel_alt, sc4kalei, sc4_state, sc4kalei, ROT0, "Qps","Kaleidoscope (011) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4kaleib ,sc4kalei, sc4_4reel_alt, sc4kalei, sc4_state, sc4kalei, ROT0, "Qps","Kaleidoscope (011) (Qps) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4kalei ,0, sc4_4reel_alt, sc4kalei, sc4_state, sc4kalei, ROT0, "Qps","Kaleidoscope (011) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4kaleib ,sc4kalei, sc4_4reel_alt, sc4kalei, sc4_state, sc4kalei, ROT0, "Qps","Kaleidoscope (011) (Qps) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2538 KALEIDOSCOPE 041 KALEIDOSCOPESND KALEIDOSCOPE
-GAMEL( 200?, sc4kaleia ,sc4kalei, sc4_4reel_alt, sc4kalei, sc4_state, sc4kalei, ROT0, "Qps","Kaleidoscope (041) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4kaleic ,sc4kalei, sc4_4reel_alt, sc4kalei, sc4_state, sc4kalei, ROT0, "Qps","Kaleidoscope (041) (Qps) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4kaleia ,sc4kalei, sc4_4reel_alt, sc4kalei, sc4_state, sc4kalei, ROT0, "Qps","Kaleidoscope (041) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4kaleic ,sc4kalei, sc4_4reel_alt, sc4kalei, sc4_state, sc4kalei, ROT0, "Qps","Kaleidoscope (041) (Qps) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2538 KALEIDOSCOPE 051 KALEIDOSCOPESND KALEIDOSCOPE
-GAMEL( 200?, sc4kaleid ,sc4kalei, sc4_4reel_alt, sc4kalei, sc4_state, sc4kalei, ROT0, "Qps","Kaleidoscope (051) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4kaleie ,sc4kalei, sc4_4reel_alt, sc4kalei, sc4_state, sc4kalei, ROT0, "Qps","Kaleidoscope (051) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4kaleid ,sc4kalei, sc4_4reel_alt, sc4kalei, sc4_state, sc4kalei, ROT0, "Qps","Kaleidoscope (051) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4kaleie ,sc4kalei, sc4_4reel_alt, sc4kalei, sc4_state, sc4kalei, ROT0, "Qps","Kaleidoscope (051) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4lir)
@@ -27193,16 +27195,16 @@ INPUT_PORTS_START( sc4lir ) // this structure is generated
INPUT_PORTS_END
// PR1001 LET IT ROLL PR1001 LETITROLL SOUNDS11
-GAMEL( 200?, sc4lir ,0, sc4_4reel, sc4lir, sc4_state, sc4lir, ROT0, "BFM","Let It Roll (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4lira ,sc4lir, sc4_4reel, sc4lir, sc4_state, sc4lir, ROT0, "BFM","Let It Roll (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4lirb ,sc4lir, sc4_4reel, sc4lir, sc4_state, sc4lir, ROT0, "BFM","Let It Roll (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4lirc ,sc4lir, sc4_4reel, sc4lir, sc4_state, sc4lir, ROT0, "BFM","Let It Roll (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4lird ,sc4lir, sc4_4reel, sc4lir, sc4_state, sc4lir, ROT0, "BFM","Let It Roll (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4lire ,sc4lir, sc4_4reel, sc4lir, sc4_state, sc4lir, ROT0, "BFM","Let It Roll (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4lirf ,sc4lir, sc4_4reel, sc4lir, sc4_state, sc4lir, ROT0, "BFM","Let It Roll (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4lirg ,sc4lir, sc4_4reel, sc4lir, sc4_state, sc4lir, ROT0, "BFM","Let It Roll (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4lirh ,sc4lir, sc4_4reel, sc4lir, sc4_state, sc4lir, ROT0, "BFM","Let It Roll (Bellfruit) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4liri ,sc4lir, sc4_4reel, sc4lir, sc4_state, sc4lir, ROT0, "BFM","Let It Roll (Bellfruit) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4lir ,0, sc4_4reel, sc4lir, sc4_state, sc4lir, ROT0, "BFM","Let It Roll (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4lira ,sc4lir, sc4_4reel, sc4lir, sc4_state, sc4lir, ROT0, "BFM","Let It Roll (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4lirb ,sc4lir, sc4_4reel, sc4lir, sc4_state, sc4lir, ROT0, "BFM","Let It Roll (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4lirc ,sc4lir, sc4_4reel, sc4lir, sc4_state, sc4lir, ROT0, "BFM","Let It Roll (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4lird ,sc4lir, sc4_4reel, sc4lir, sc4_state, sc4lir, ROT0, "BFM","Let It Roll (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4lire ,sc4lir, sc4_4reel, sc4lir, sc4_state, sc4lir, ROT0, "BFM","Let It Roll (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4lirf ,sc4lir, sc4_4reel, sc4lir, sc4_state, sc4lir, ROT0, "BFM","Let It Roll (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4lirg ,sc4lir, sc4_4reel, sc4lir, sc4_state, sc4lir, ROT0, "BFM","Let It Roll (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4lirh ,sc4lir, sc4_4reel, sc4lir, sc4_state, sc4lir, ROT0, "BFM","Let It Roll (Bellfruit) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4liri ,sc4lir, sc4_4reel, sc4lir, sc4_state, sc4lir, ROT0, "BFM","Let It Roll (Bellfruit) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -27270,7 +27272,7 @@ INPUT_PORTS_START( sc4ldvcl ) // this structure is generated
INPUT_PORTS_END
// PR2421 LITTLEDEVIL CLUB LITTLEDEVIL CLUB CLILDEV SOUNDS CLUB LITTLEDEVIL
-GAMEL( 200?, sc4ldvcl ,0, sc4_5reel, sc4ldvcl, sc4_state, sc4ldvcl, ROT0, "Mazooma","Little Devil Club (Mazooma) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4ldvcl ,0, sc4_5reel, sc4ldvcl, sc4_state, sc4ldvcl, ROT0, "Mazooma","Little Devil Club (Mazooma) (Scorpion 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4lockb)
{
@@ -27340,14 +27342,14 @@ INPUT_PORTS_START( sc4lockb ) // this structure is generated
INPUT_PORTS_END
// PR1108 LOCKBUSTER PR1108 LOCKBUSTER SOUNDS11
-GAMEL( 200?, sc4lockb ,0, sc4_4reel_alt, sc4lockb, sc4_state, sc4lockb, ROT0, "BFM","Lock Buster (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4lockba ,sc4lockb, sc4_4reel_alt, sc4lockb, sc4_state, sc4lockb, ROT0, "BFM","Lock Buster (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4lockbb ,sc4lockb, sc4_4reel_alt, sc4lockb, sc4_state, sc4lockb, ROT0, "BFM","Lock Buster (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4lockbc ,sc4lockb, sc4_4reel_alt, sc4lockb, sc4_state, sc4lockb, ROT0, "BFM","Lock Buster (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4lockbd ,sc4lockb, sc4_4reel_alt, sc4lockb, sc4_state, sc4lockb, ROT0, "BFM","Lock Buster (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4lockbe ,sc4lockb, sc4_4reel_alt, sc4lockb, sc4_state, sc4lockb, ROT0, "BFM","Lock Buster (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4lockbf ,sc4lockb, sc4_4reel_alt, sc4lockb, sc4_state, sc4lockb, ROT0, "BFM","Lock Buster (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4lockbg ,sc4lockb, sc4_4reel_alt, sc4lockb, sc4_state, sc4lockb, ROT0, "BFM","Lock Buster (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4lockb ,0, sc4_4reel_alt, sc4lockb, sc4_state, sc4lockb, ROT0, "BFM","Lock Buster (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4lockba ,sc4lockb, sc4_4reel_alt, sc4lockb, sc4_state, sc4lockb, ROT0, "BFM","Lock Buster (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4lockbb ,sc4lockb, sc4_4reel_alt, sc4lockb, sc4_state, sc4lockb, ROT0, "BFM","Lock Buster (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4lockbc ,sc4lockb, sc4_4reel_alt, sc4lockb, sc4_state, sc4lockb, ROT0, "BFM","Lock Buster (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4lockbd ,sc4lockb, sc4_4reel_alt, sc4lockb, sc4_state, sc4lockb, ROT0, "BFM","Lock Buster (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4lockbe ,sc4lockb, sc4_4reel_alt, sc4lockb, sc4_state, sc4lockb, ROT0, "BFM","Lock Buster (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4lockbf ,sc4lockb, sc4_4reel_alt, sc4lockb, sc4_state, sc4lockb, ROT0, "BFM","Lock Buster (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4lockbg ,sc4lockb, sc4_4reel_alt, sc4lockb, sc4_state, sc4lockb, ROT0, "BFM","Lock Buster (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -27420,19 +27422,19 @@ INPUT_PORTS_START( sc4lkbcl ) // this structure is generated
INPUT_PORTS_END
// PR1321 CLUB LOCKBUSTER PR1321 CLUB LOCKBUSTER SOUNDS11
-GAMEL( 200?, sc4lkbcl ,0, sc4_5reel, sc4lkbcl, sc4_state, sc4lkbcl, ROT0, "BFM","Lock Buster Club (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4lkbclb ,sc4lkbcl, sc4_5reel, sc4lkbcl, sc4_state, sc4lkbcl, ROT0, "BFM","Lock Buster Club (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4lkbcle ,sc4lkbcl, sc4_5reel, sc4lkbcl, sc4_state, sc4lkbcl, ROT0, "BFM","Lock Buster Club (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4lkbclg ,sc4lkbcl, sc4_5reel, sc4lkbcl, sc4_state, sc4lkbcl, ROT0, "BFM","Lock Buster Club (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4lkbcl ,0, sc4_5reel, sc4lkbcl, sc4_state, sc4lkbcl, ROT0, "BFM","Lock Buster Club (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4lkbclb ,sc4lkbcl, sc4_5reel, sc4lkbcl, sc4_state, sc4lkbcl, ROT0, "BFM","Lock Buster Club (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4lkbcle ,sc4lkbcl, sc4_5reel, sc4lkbcl, sc4_state, sc4lkbcl, ROT0, "BFM","Lock Buster Club (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4lkbclg ,sc4lkbcl, sc4_5reel, sc4lkbcl, sc4_state, sc4lkbcl, ROT0, "BFM","Lock Buster Club (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR1321 CLUB LOCKBUSTER CLUB LOCKBUSTER CLUB PR1321 CLUB LOCKBUSTER SOUNDS11
-GAMEL( 200?, sc4lkbclh ,sc4lkbcl, sc4_5reel, sc4lkbcl, sc4_state, sc4lkbcl_mbus, ROT0, "BFM","Lock Buster Club (Bellfruit) (Scorpion 4) (311 Club, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4lkbcli ,sc4lkbcl, sc4_5reel, sc4lkbcl, sc4_state, sc4lkbcl_mbus, ROT0, "BFM","Lock Buster Club (Bellfruit) (Scorpion 4) (311 Club, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4lkbclh ,sc4lkbcl, sc4_5reel, sc4lkbcl, sc4_state, sc4lkbcl_mbus, ROT0, "BFM","Lock Buster Club (Bellfruit) (Scorpion 4) (311 Club, set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4lkbcli ,sc4lkbcl, sc4_5reel, sc4lkbcl, sc4_state, sc4lkbcl_mbus, ROT0, "BFM","Lock Buster Club (Bellfruit) (Scorpion 4) (311 Club, set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR1321 CLUB LOCKBUSTER EURO PR1321 CLUB LOCKBUSTER SOUNDS11
-GAMEL( 200?, sc4lkbcla ,sc4lkbcl, sc4_5reel, sc4lkbcl, sc4_state, sc4lkbcl, ROT0, "BFM","Lock Buster Club (Euro) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4lkbclc ,sc4lkbcl, sc4_5reel, sc4lkbcl, sc4_state, sc4lkbcl, ROT0, "BFM","Lock Buster Club (Euro) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4lkbcla ,sc4lkbcl, sc4_5reel, sc4lkbcl, sc4_state, sc4lkbcl, ROT0, "BFM","Lock Buster Club (Euro) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4lkbclc ,sc4lkbcl, sc4_5reel, sc4lkbcl, sc4_state, sc4lkbcl, ROT0, "BFM","Lock Buster Club (Euro) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR1321 CLUB LOCKBUSTER FERRY PR1321 CLUB LOCKBUSTER SOUNDS11
-GAMEL( 200?, sc4lkbcld ,sc4lkbcl, sc4_5reel, sc4lkbcl, sc4_state, sc4lkbcl, ROT0, "BFM","Lock Buster Club (Ferry) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4lkbclf ,sc4lkbcl, sc4_5reel, sc4lkbcl, sc4_state, sc4lkbcl, ROT0, "BFM","Lock Buster Club (Ferry) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4lkbcld ,sc4lkbcl, sc4_5reel, sc4lkbcl, sc4_state, sc4lkbcl, ROT0, "BFM","Lock Buster Club (Ferry) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4lkbclf ,sc4lkbcl, sc4_5reel, sc4lkbcl, sc4_state, sc4lkbcl, ROT0, "BFM","Lock Buster Club (Ferry) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -27503,17 +27505,17 @@ INPUT_PORTS_START( sc4lotrf ) // this structure is generated
INPUT_PORTS_END
// PR1115 LORD OF THE RINGS PR1115 L O T RINGS SOUNDS11
-GAMEL( 200?, sc4lotrf ,0, sc4_4reel_alt, sc4lotrf, sc4_state, sc4lotrf, ROT0, "BFM","Lord Of The Rings - The Fellowship Of The Ring (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4lotrfa ,sc4lotrf, sc4_4reel_alt, sc4lotrf, sc4_state, sc4lotrf, ROT0, "BFM","Lord Of The Rings - The Fellowship Of The Ring (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4lotrf ,0, sc4_4reel_alt, sc4lotrf, sc4_state, sc4lotrf, ROT0, "BFM","Lord Of The Rings - The Fellowship Of The Ring (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4lotrfa ,sc4lotrf, sc4_4reel_alt, sc4lotrf, sc4_state, sc4lotrf, ROT0, "BFM","Lord Of The Rings - The Fellowship Of The Ring (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR1115 LORD OF THE RINGS ISS 2 PR1115 L O T RINGS SOUNDS11
-GAMEL( 200?, sc4lotrfb ,sc4lotrf, sc4_4reel_alt, sc4lotrf, sc4_state, sc4lotrf, ROT0, "BFM","Lord Of The Rings - The Fellowship Of The Ring (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4lotrfc ,sc4lotrf, sc4_4reel_alt, sc4lotrf, sc4_state, sc4lotrf, ROT0, "BFM","Lord Of The Rings - The Fellowship Of The Ring (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4lotrfd ,sc4lotrf, sc4_4reel_alt, sc4lotrf, sc4_state, sc4lotrf, ROT0, "BFM","Lord Of The Rings - The Fellowship Of The Ring (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4lotrfe ,sc4lotrf, sc4_4reel_alt, sc4lotrf, sc4_state, sc4lotrf, ROT0, "BFM","Lord Of The Rings - The Fellowship Of The Ring (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4lotrff ,sc4lotrf, sc4_4reel_alt, sc4lotrf, sc4_state, sc4lotrf, ROT0, "BFM","Lord Of The Rings - The Fellowship Of The Ring (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4lotrfg ,sc4lotrf, sc4_4reel_alt, sc4lotrf, sc4_state, sc4lotrf, ROT0, "BFM","Lord Of The Rings - The Fellowship Of The Ring (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4lotrt ,sc4lotrf, sc4_4reel_alt, sc4lotrf, sc4_state, sc4lotrf, ROT0, "BFM","Lord Of The Rings - The Fellowship Of The Ring (Bellfruit) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // these were marked LOTR Trilogy and paired with different (wrong, now oprhaned, sound roms)
-GAMEL( 200?, sc4lotrta ,sc4lotrf, sc4_4reel_alt, sc4lotrf, sc4_state, sc4lotrf, ROT0, "BFM","Lord Of The Rings - The Fellowship Of The Ring (Bellfruit) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4lotrfb ,sc4lotrf, sc4_4reel_alt, sc4lotrf, sc4_state, sc4lotrf, ROT0, "BFM","Lord Of The Rings - The Fellowship Of The Ring (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4lotrfc ,sc4lotrf, sc4_4reel_alt, sc4lotrf, sc4_state, sc4lotrf, ROT0, "BFM","Lord Of The Rings - The Fellowship Of The Ring (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4lotrfd ,sc4lotrf, sc4_4reel_alt, sc4lotrf, sc4_state, sc4lotrf, ROT0, "BFM","Lord Of The Rings - The Fellowship Of The Ring (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4lotrfe ,sc4lotrf, sc4_4reel_alt, sc4lotrf, sc4_state, sc4lotrf, ROT0, "BFM","Lord Of The Rings - The Fellowship Of The Ring (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4lotrff ,sc4lotrf, sc4_4reel_alt, sc4lotrf, sc4_state, sc4lotrf, ROT0, "BFM","Lord Of The Rings - The Fellowship Of The Ring (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4lotrfg ,sc4lotrf, sc4_4reel_alt, sc4lotrf, sc4_state, sc4lotrf, ROT0, "BFM","Lord Of The Rings - The Fellowship Of The Ring (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4lotrt ,sc4lotrf, sc4_4reel_alt, sc4lotrf, sc4_state, sc4lotrf, ROT0, "BFM","Lord Of The Rings - The Fellowship Of The Ring (Bellfruit) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 ) // these were marked LOTR Trilogy and paired with different (wrong, now oprhaned, sound roms)
+GAMEL( 200?, sc4lotrta ,sc4lotrf, sc4_4reel_alt, sc4lotrf, sc4_state, sc4lotrf, ROT0, "BFM","Lord Of The Rings - The Fellowship Of The Ring (Bellfruit) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -27591,21 +27593,21 @@ INPUT_PORTS_END
// PR1315 TWO TOWERS PR1313 TWO TOWERS SOUNDS11
-GAMEL( 200?, sc4lotr2 ,0, sc4_200_5r, sc4lotr2, sc4_state, sc4lotr2, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4lotr2a ,sc4lotr2, sc4_200_5r, sc4lotr2, sc4_state, sc4lotr2, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4lotr2b ,sc4lotr2, sc4_200_5r, sc4lotr2, sc4_state, sc4lotr2, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4lotr2c ,sc4lotr2, sc4_200_5r, sc4lotr2, sc4_state, sc4lotr2, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4lotr2d ,sc4lotr2, sc4_200_5r, sc4lotr2, sc4_state, sc4lotr2, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4lotr2e ,sc4lotr2, sc4_200_5r, sc4lotr2, sc4_state, sc4lotr2, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4lotr2j ,sc4lotr2, sc4_200_5r, sc4lotr2, sc4_state, sc4lotr2, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4lotr2k ,sc4lotr2, sc4_200_5r, sc4lotr2, sc4_state, sc4lotr2, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4lotr2l ,sc4lotr2, sc4_200_5r, sc4lotr2, sc4_state, sc4lotr2, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4lotr2m ,sc4lotr2, sc4_200_5r, sc4lotr2, sc4_state, sc4lotr2, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4lotr2 ,0, sc4_200_5r, sc4lotr2, sc4_state, sc4lotr2, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4lotr2a ,sc4lotr2, sc4_200_5r, sc4lotr2, sc4_state, sc4lotr2, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4lotr2b ,sc4lotr2, sc4_200_5r, sc4lotr2, sc4_state, sc4lotr2, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4lotr2c ,sc4lotr2, sc4_200_5r, sc4lotr2, sc4_state, sc4lotr2, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4lotr2d ,sc4lotr2, sc4_200_5r, sc4lotr2, sc4_state, sc4lotr2, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4lotr2e ,sc4lotr2, sc4_200_5r, sc4lotr2, sc4_state, sc4lotr2, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4lotr2j ,sc4lotr2, sc4_200_5r, sc4lotr2, sc4_state, sc4lotr2, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4lotr2k ,sc4lotr2, sc4_200_5r, sc4lotr2, sc4_state, sc4lotr2, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4lotr2l ,sc4lotr2, sc4_200_5r, sc4lotr2, sc4_state, sc4lotr2, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4lotr2m ,sc4lotr2, sc4_200_5r, sc4lotr2, sc4_state, sc4lotr2, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR1315 TWO TOWERS PR1313 TWO TOWERS SOUNDS11 TWO TOWERS S.SITE
-GAMEL( 200?, sc4lotr2f ,sc4lotr2, sc4_200_5r, sc4lotr2, sc4_state, sc4lotr2_mbus, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 11)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4lotr2g ,sc4lotr2, sc4_200_5r, sc4lotr2, sc4_state, sc4lotr2_mbus, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 12)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4lotr2h ,sc4lotr2, sc4_200_5r, sc4lotr2, sc4_state, sc4lotr2_mbus, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 13)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4lotr2i ,sc4lotr2, sc4_200_5r, sc4lotr2, sc4_state, sc4lotr2_mbus, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 14)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4lotr2f ,sc4lotr2, sc4_200_5r, sc4lotr2, sc4_state, sc4lotr2_mbus, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 11)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4lotr2g ,sc4lotr2, sc4_200_5r, sc4lotr2, sc4_state, sc4lotr2_mbus, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 12)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4lotr2h ,sc4lotr2, sc4_200_5r, sc4lotr2, sc4_state, sc4lotr2_mbus, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 13)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4lotr2i ,sc4lotr2, sc4_200_5r, sc4lotr2, sc4_state, sc4lotr2_mbus, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 14)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4ltr2c)
@@ -27677,19 +27679,19 @@ INPUT_PORTS_START( sc4ltr2c ) // this structure is generated
INPUT_PORTS_END
// PR1420 CLUB LOTR TWO TOWERS PR1420 CLUB TWOTOWERS SOUNDS11
-GAMEL( 200?, sc4ltr2c ,0, sc4_200_std, sc4ltr2c, sc4_state, sc4ltr2c, ROT0, "BFM","Lord Of The Rings - The Two Towers Club (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ltr2ca ,sc4ltr2c, sc4_200_std, sc4ltr2c, sc4_state, sc4ltr2c, ROT0, "BFM","Lord Of The Rings - The Two Towers Club (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ltr2cb ,sc4ltr2c, sc4_200_std, sc4ltr2c, sc4_state, sc4ltr2c, ROT0, "BFM","Lord Of The Rings - The Two Towers Club (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ltr2cc ,sc4ltr2c, sc4_200_std, sc4ltr2c, sc4_state, sc4ltr2c, ROT0, "BFM","Lord Of The Rings - The Two Towers Club (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ltr2cd ,sc4ltr2c, sc4_200_std, sc4ltr2c, sc4_state, sc4ltr2c, ROT0, "BFM","Lord Of The Rings - The Two Towers Club (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ltr2ce ,sc4ltr2c, sc4_200_std, sc4ltr2c, sc4_state, sc4ltr2c, ROT0, "BFM","Lord Of The Rings - The Two Towers Club (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ltr2cf ,sc4ltr2c, sc4_200_std, sc4ltr2c, sc4_state, sc4ltr2c, ROT0, "BFM","Lord Of The Rings - The Two Towers Club (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ltr2cg ,sc4ltr2c, sc4_200_std, sc4ltr2c, sc4_state, sc4ltr2c, ROT0, "BFM","Lord Of The Rings - The Two Towers Club (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4ltr2c ,0, sc4_200_std, sc4ltr2c, sc4_state, sc4ltr2c, ROT0, "BFM","Lord Of The Rings - The Two Towers Club (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ltr2ca ,sc4ltr2c, sc4_200_std, sc4ltr2c, sc4_state, sc4ltr2c, ROT0, "BFM","Lord Of The Rings - The Two Towers Club (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ltr2cb ,sc4ltr2c, sc4_200_std, sc4ltr2c, sc4_state, sc4ltr2c, ROT0, "BFM","Lord Of The Rings - The Two Towers Club (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ltr2cc ,sc4ltr2c, sc4_200_std, sc4ltr2c, sc4_state, sc4ltr2c, ROT0, "BFM","Lord Of The Rings - The Two Towers Club (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ltr2cd ,sc4ltr2c, sc4_200_std, sc4ltr2c, sc4_state, sc4ltr2c, ROT0, "BFM","Lord Of The Rings - The Two Towers Club (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ltr2ce ,sc4ltr2c, sc4_200_std, sc4ltr2c, sc4_state, sc4ltr2c, ROT0, "BFM","Lord Of The Rings - The Two Towers Club (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ltr2cf ,sc4ltr2c, sc4_200_std, sc4ltr2c, sc4_state, sc4ltr2c, ROT0, "BFM","Lord Of The Rings - The Two Towers Club (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ltr2cg ,sc4ltr2c, sc4_200_std, sc4ltr2c, sc4_state, sc4ltr2c, ROT0, "BFM","Lord Of The Rings - The Two Towers Club (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR1420 CLUB LOTR TWO TOWERS PR1420 CLUB TWOTOWERS SOUNDS11 CLUB TWO TOWERS
-GAMEL( 200?, sc4ltr2ch ,sc4ltr2c, sc4_200_std, sc4ltr2c, sc4_state, sc4ltr2c_mbus, ROT0, "BFM","Lord Of The Rings - The Two Towers Club (Bellfruit) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ltr2ci ,sc4ltr2c, sc4_200_std, sc4ltr2c, sc4_state, sc4ltr2c_mbus, ROT0, "BFM","Lord Of The Rings - The Two Towers Club (Bellfruit) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ltr2cj ,sc4ltr2c, sc4_200_std, sc4ltr2c, sc4_state, sc4ltr2c_mbus, ROT0, "BFM","Lord Of The Rings - The Two Towers Club (Bellfruit) (Scorpion 4) (set 11)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ltr2ck ,sc4ltr2c, sc4_200_std, sc4ltr2c, sc4_state, sc4ltr2c_mbus, ROT0, "BFM","Lord Of The Rings - The Two Towers Club (Bellfruit) (Scorpion 4) (set 12)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4ltr2ch ,sc4ltr2c, sc4_200_std, sc4ltr2c, sc4_state, sc4ltr2c_mbus, ROT0, "BFM","Lord Of The Rings - The Two Towers Club (Bellfruit) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ltr2ci ,sc4ltr2c, sc4_200_std, sc4ltr2c, sc4_state, sc4ltr2c_mbus, ROT0, "BFM","Lord Of The Rings - The Two Towers Club (Bellfruit) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ltr2cj ,sc4ltr2c, sc4_200_std, sc4ltr2c, sc4_state, sc4ltr2c_mbus, ROT0, "BFM","Lord Of The Rings - The Two Towers Club (Bellfruit) (Scorpion 4) (set 11)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ltr2ck ,sc4ltr2c, sc4_200_std, sc4ltr2c, sc4_state, sc4ltr2c_mbus, ROT0, "BFM","Lord Of The Rings - The Two Towers Club (Bellfruit) (Scorpion 4) (set 12)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4magic)
{
@@ -27741,10 +27743,10 @@ INPUT_PORTS_START( sc4magic ) // this structure is generated
INPUT_PORTS_END
// PR2520 MAGIC POUND ABOUT V1.0 MAGICPOUNDABOUTSND MAGIC POUNDABOUT
-GAMEL( 200?, sc4magic ,0, sc4_4reel, sc4magic, sc4_state, sc4magic, ROT0, "Qps","Magic Poundabout (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4magica ,sc4magic, sc4_4reel, sc4magic, sc4_state, sc4magic, ROT0, "Qps","Magic Poundabout (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4magicb ,sc4magic, sc4_4reel, sc4magic, sc4_state, sc4magic, ROT0, "Qps","Magic Poundabout (Qps) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4magicc ,sc4magic, sc4_4reel, sc4magic, sc4_state, sc4magic, ROT0, "Qps","Magic Poundabout (Qps) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4magic ,0, sc4_4reel, sc4magic, sc4_state, sc4magic, ROT0, "Qps","Magic Poundabout (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4magica ,sc4magic, sc4_4reel, sc4magic, sc4_state, sc4magic, ROT0, "Qps","Magic Poundabout (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4magicb ,sc4magic, sc4_4reel, sc4magic, sc4_state, sc4magic, ROT0, "Qps","Magic Poundabout (Qps) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4magicc ,sc4magic, sc4_4reel, sc4magic, sc4_state, sc4magic, ROT0, "Qps","Magic Poundabout (Qps) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4maxim)
@@ -27799,14 +27801,14 @@ INPUT_PORTS_START( sc4maxim ) // this structure is generated
INPUT_PORTS_END
// PR2019 MAXIMUS CASH MAX SOUNDS MAXIMUS CASH
-GAMEL( 200?, sc4maxim ,0, sc4_4reel, sc4maxim, sc4_state, sc4maxim, ROT0, "Mazooma","Maximus Cash (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4maxima ,sc4maxim, sc4_4reel, sc4maxim, sc4_state, sc4maxim, ROT0, "Mazooma","Maximus Cash (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4maximb ,sc4maxim, sc4_4reel, sc4maxim, sc4_state, sc4maxim, ROT0, "Mazooma","Maximus Cash (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4maximc ,sc4maxim, sc4_4reel, sc4maxim, sc4_state, sc4maxim, ROT0, "Mazooma","Maximus Cash (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4maximd ,sc4maxim, sc4_4reel, sc4maxim, sc4_state, sc4maxim, ROT0, "Mazooma","Maximus Cash (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4maxime ,sc4maxim, sc4_4reel, sc4maxim, sc4_state, sc4maxim, ROT0, "Mazooma","Maximus Cash (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4maximf ,sc4maxim, sc4_4reel, sc4maxim, sc4_state, sc4maxim, ROT0, "Mazooma","Maximus Cash (Mazooma) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4maximg ,sc4maxim, sc4_4reel, sc4maxim, sc4_state, sc4maxim, ROT0, "Mazooma","Maximus Cash (Mazooma) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4maxim ,0, sc4_4reel, sc4maxim, sc4_state, sc4maxim, ROT0, "Mazooma","Maximus Cash (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4maxima ,sc4maxim, sc4_4reel, sc4maxim, sc4_state, sc4maxim, ROT0, "Mazooma","Maximus Cash (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4maximb ,sc4maxim, sc4_4reel, sc4maxim, sc4_state, sc4maxim, ROT0, "Mazooma","Maximus Cash (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4maximc ,sc4maxim, sc4_4reel, sc4maxim, sc4_state, sc4maxim, ROT0, "Mazooma","Maximus Cash (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4maximd ,sc4maxim, sc4_4reel, sc4maxim, sc4_state, sc4maxim, ROT0, "Mazooma","Maximus Cash (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4maxime ,sc4maxim, sc4_4reel, sc4maxim, sc4_state, sc4maxim, ROT0, "Mazooma","Maximus Cash (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4maximf ,sc4maxim, sc4_4reel, sc4maxim, sc4_state, sc4maxim, ROT0, "Mazooma","Maximus Cash (Mazooma) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4maximg ,sc4maxim, sc4_4reel, sc4maxim, sc4_state, sc4maxim, ROT0, "Mazooma","Maximus Cash (Mazooma) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4monob)
@@ -27859,20 +27861,20 @@ INPUT_PORTS_START( sc4monob ) // this structure is generated
INPUT_PORTS_END
// PR2121 MONOPOLY MPLY SOUNDS MONOPOLY
-GAMEL( 200?, sc4monob ,0, sc4_4reel_alt, sc4monob, sc4_state, sc4monob, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4monoba ,sc4monob, sc4_4reel_alt, sc4monob, sc4_state, sc4monob, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4monobb ,sc4monob, sc4_4reel_alt, sc4monob, sc4_state, sc4monob, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4monobc ,sc4monob, sc4_4reel_alt, sc4monob, sc4_state, sc4monob, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4monobd ,sc4monob, sc4_4reel_alt, sc4monob, sc4_state, sc4monob, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4monobe ,sc4monob, sc4_4reel_alt, sc4monob, sc4_state, sc4monob, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4monobf ,sc4monob, sc4_4reel_alt, sc4monob, sc4_state, sc4monob, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4monobg ,sc4monob, sc4_4reel_alt, sc4monob, sc4_state, sc4monob, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4monobh ,sc4monob, sc4_4reel_alt, sc4monob, sc4_state, sc4monob, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4monobi ,sc4monob, sc4_4reel_alt, sc4monob, sc4_state, sc4monob, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4monobj ,sc4monob, sc4_4reel_alt, sc4monob, sc4_state, sc4monob, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 11)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4monobk ,sc4monob, sc4_4reel_alt, sc4monob, sc4_state, sc4monob, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 12)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4monobl ,sc4monob, sc4_4reel_alt, sc4monob, sc4_state, sc4monob, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 13)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4monobm ,sc4monob, sc4_4reel_alt, sc4monob, sc4_state, sc4monob, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 14)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4monob ,0, sc4_4reel_alt, sc4monob, sc4_state, sc4monob, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4monoba ,sc4monob, sc4_4reel_alt, sc4monob, sc4_state, sc4monob, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4monobb ,sc4monob, sc4_4reel_alt, sc4monob, sc4_state, sc4monob, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4monobc ,sc4monob, sc4_4reel_alt, sc4monob, sc4_state, sc4monob, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4monobd ,sc4monob, sc4_4reel_alt, sc4monob, sc4_state, sc4monob, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4monobe ,sc4monob, sc4_4reel_alt, sc4monob, sc4_state, sc4monob, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4monobf ,sc4monob, sc4_4reel_alt, sc4monob, sc4_state, sc4monob, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4monobg ,sc4monob, sc4_4reel_alt, sc4monob, sc4_state, sc4monob, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4monobh ,sc4monob, sc4_4reel_alt, sc4monob, sc4_state, sc4monob, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4monobi ,sc4monob, sc4_4reel_alt, sc4monob, sc4_state, sc4monob, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4monobj ,sc4monob, sc4_4reel_alt, sc4monob, sc4_state, sc4monob, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 11)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4monobk ,sc4monob, sc4_4reel_alt, sc4monob, sc4_state, sc4monob, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 12)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4monobl ,sc4monob, sc4_4reel_alt, sc4monob, sc4_state, sc4monob, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 13)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4monobm ,sc4monob, sc4_4reel_alt, sc4monob, sc4_state, sc4monob, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 14)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -27927,17 +27929,17 @@ INPUT_PORTS_END
// So which Top Box roms should thse use? Why do some play without one?
// Waits for Top Box
-GAMEL( 200?, sc4mondxd ,sc4mondx, sc4_3reel_200, sc4mondx, sc4_state, sc4mondx, ROT0, "Mazooma","Monopoly Deluxe (PR2202, MPDX 1.1) (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// PR2202 MONOPOLY DELUXE MONOPOLY DELUXE MAZ MONOPOLY TRIPLE
-GAMEL( 200?, sc4mondxg ,sc4mondx, sc4_3reel_200, sc4mondx, sc4_state, sc4mondx, ROT0, "Mazooma","Monopoly Deluxe (PR2202, MPDX 1.1) (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4mondxd ,sc4mondx, sc4_3reel_200, sc4mondx, sc4_state, sc4mondx, ROT0, "Mazooma","Monopoly Deluxe (PR2202, MPDX 1.1) (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )// PR2202 MONOPOLY DELUXE MONOPOLY DELUXE MAZ MONOPOLY TRIPLE
+GAMEL( 200?, sc4mondxg ,sc4mondx, sc4_3reel_200, sc4mondx, sc4_state, sc4mondx, ROT0, "Mazooma","Monopoly Deluxe (PR2202, MPDX 1.1) (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
// Plays without Top Box
-GAMEL( 200?, sc4mondxe ,sc4mondx, sc4_3reel_200, sc4mondx, sc4_state, sc4mondx, ROT0, "Mazooma","Monopoly Deluxe (PR2202, MPDX 1.1) (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// PR2202 MONOPOLY MONOPOLY TRIPLE MAZ MONOPOLY DELUXE
-GAMEL( 200?, sc4mondxf ,sc4mondx, sc4_3reel_200, sc4mondx, sc4_state, sc4mondx, ROT0, "Mazooma","Monopoly Deluxe (PR2202, MPDX 1.1) (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4mondxe ,sc4mondx, sc4_3reel_200, sc4mondx, sc4_state, sc4mondx, ROT0, "Mazooma","Monopoly Deluxe (PR2202, MPDX 1.1) (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )// PR2202 MONOPOLY MONOPOLY TRIPLE MAZ MONOPOLY DELUXE
+GAMEL( 200?, sc4mondxf ,sc4mondx, sc4_3reel_200, sc4mondx, sc4_state, sc4mondx, ROT0, "Mazooma","Monopoly Deluxe (PR2202, MPDX 1.1) (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
// Waits for Top Box
-GAMEL( 200?, sc4mondx ,0, sc4_3reel_200, sc4mondx, sc4_state, sc4mondx, ROT0, "Mazooma","Monopoly Deluxe (PR2202, MPDX 1.0) (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// PR2202 MONOPOLY DELUXE MONOPOLY DELUXE MAZ MPDX SOUNDS MONOPOLY
-GAMEL( 200?, sc4mondxa ,sc4mondx, sc4_3reel_200, sc4mondx, sc4_state, sc4mondx, ROT0, "Mazooma","Monopoly Deluxe (PR2202, MPDX 1.0) (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4mondx ,0, sc4_3reel_200, sc4mondx, sc4_state, sc4mondx, ROT0, "Mazooma","Monopoly Deluxe (PR2202, MPDX 1.0) (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )// PR2202 MONOPOLY DELUXE MONOPOLY DELUXE MAZ MPDX SOUNDS MONOPOLY
+GAMEL( 200?, sc4mondxa ,sc4mondx, sc4_3reel_200, sc4mondx, sc4_state, sc4mondx, ROT0, "Mazooma","Monopoly Deluxe (PR2202, MPDX 1.0) (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
// Plays without Top Box
-GAMEL( 200?, sc4mondxb ,sc4mondx, sc4_3reel_200, sc4mondx, sc4_state, sc4mondx, ROT0, "Mazooma","Monopoly Deluxe (PR2202, MPDX 1.0) (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
-GAMEL( 200?, sc4mondxc ,sc4mondx, sc4_3reel_200, sc4mondx, sc4_state, sc4mondx, ROT0, "Mazooma","Monopoly Deluxe (PR2202, MPDX 1.0) (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4mondxb ,sc4mondx, sc4_3reel_200, sc4mondx, sc4_state, sc4mondx, ROT0, "Mazooma","Monopoly Deluxe (PR2202, MPDX 1.0) (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4mondxc ,sc4mondx, sc4_3reel_200, sc4mondx, sc4_state, sc4mondx, ROT0, "Mazooma","Monopoly Deluxe (PR2202, MPDX 1.0) (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
@@ -27995,16 +27997,16 @@ DRIVER_INIT_MEMBER(sc4_state,sc4mont)
// PR2510 MONTEGO PAY LOWTECHSND MONTEGO PAY
-GAMEL( 200?, sc4mont ,0, sc4, sc4mont, sc4_state, sc4mont, ROT0, "Qps","Montego Pay (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4monta ,sc4mont, sc4, sc4mont, sc4_state, sc4mont, ROT0, "Qps","Montego Pay (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4montb ,sc4mont, sc4, sc4mont, sc4_state, sc4mont, ROT0, "Qps","Montego Pay (Qps) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4montc ,sc4mont, sc4, sc4mont, sc4_state, sc4mont, ROT0, "Qps","Montego Pay (Qps) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4montd ,sc4mont, sc4, sc4mont, sc4_state, sc4mont, ROT0, "Qps","Montego Pay (Qps) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4monte ,sc4mont, sc4, sc4mont, sc4_state, sc4mont, ROT0, "Qps","Montego Pay (Qps) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4montf ,sc4mont, sc4, sc4mont, sc4_state, sc4mont, ROT0, "Qps","Montego Pay (Qps) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4montg ,sc4mont, sc4, sc4mont, sc4_state, sc4mont, ROT0, "Qps","Montego Pay (Qps) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4month ,sc4mont, sc4, sc4mont, sc4_state, sc4mont, ROT0, "Qps","Montego Pay (Qps) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4monti ,sc4mont, sc4, sc4mont, sc4_state, sc4mont, ROT0, "Qps","Montego Pay (Qps) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4mont ,0, sc4, sc4mont, sc4_state, sc4mont, ROT0, "Qps","Montego Pay (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4monta ,sc4mont, sc4, sc4mont, sc4_state, sc4mont, ROT0, "Qps","Montego Pay (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4montb ,sc4mont, sc4, sc4mont, sc4_state, sc4mont, ROT0, "Qps","Montego Pay (Qps) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4montc ,sc4mont, sc4, sc4mont, sc4_state, sc4mont, ROT0, "Qps","Montego Pay (Qps) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4montd ,sc4mont, sc4, sc4mont, sc4_state, sc4mont, ROT0, "Qps","Montego Pay (Qps) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4monte ,sc4mont, sc4, sc4mont, sc4_state, sc4mont, ROT0, "Qps","Montego Pay (Qps) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4montf ,sc4mont, sc4, sc4mont, sc4_state, sc4mont, ROT0, "Qps","Montego Pay (Qps) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4montg ,sc4mont, sc4, sc4mont, sc4_state, sc4mont, ROT0, "Qps","Montego Pay (Qps) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4month ,sc4mont, sc4, sc4mont, sc4_state, sc4mont, ROT0, "Qps","Montego Pay (Qps) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4monti ,sc4mont, sc4, sc4mont, sc4_state, sc4mont, ROT0, "Qps","Montego Pay (Qps) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -28064,9 +28066,9 @@ INPUT_PORTS_START( sc4mou ) // this structure is generated
INPUT_PORTS_END
// PR2523 MOVE ON UP V1.0 MOVEONUPSND MOVE ON UP
-GAMEL( 200?, sc4mou ,0, sc4_4reel_alt, sc4mou, sc4_state, sc4mou, ROT0, "Qps","Move On Up (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4moua ,sc4mou, sc4_4reel_alt, sc4mou, sc4_state, sc4mou, ROT0, "Qps","Move On Up (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4moub ,sc4mou, sc4_4reel_alt, sc4mou, sc4_state, sc4mou, ROT0, "Qps","Move On Up (Qps) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4mou ,0, sc4_4reel_alt, sc4mou, sc4_state, sc4mou, ROT0, "Qps","Move On Up (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4moua ,sc4mou, sc4_4reel_alt, sc4mou, sc4_state, sc4mou, ROT0, "Qps","Move On Up (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4moub ,sc4mou, sc4_4reel_alt, sc4mou, sc4_state, sc4mou, ROT0, "Qps","Move On Up (Qps) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4nmtj)
@@ -28127,11 +28129,11 @@ INPUT_PORTS_START( sc4nmtj ) // this structure is generated
INPUT_PORTS_END
// PR2171 NEVER MIND JPS NMTJ SOUNDS NEVER MIND JPS
-GAMEL( 200?, sc4nmtj ,0, sc4_200_4ra, sc4nmtj, sc4_state, sc4nmtj, ROT0, "Mazooma","Never Mind The Jackpots (Mazooma) (Scorpion 4) (011)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4nmtja ,sc4nmtj, sc4_200_4ra, sc4nmtj, sc4_state, sc4nmtj, ROT0, "Mazooma","Never Mind The Jackpots (Mazooma) (Scorpion 4) (014, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4nmtjc ,sc4nmtj, sc4_200_4ra, sc4nmtj, sc4_state, sc4nmtj, ROT0, "Mazooma","Never Mind The Jackpots (Mazooma) (Scorpion 4) (014, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4nmtjb ,sc4nmtj, sc4_200_4ra, sc4nmtj, sc4_state, sc4nmtj, ROT0, "Mazooma","Never Mind The Jackpots (Mazooma) (Scorpion 4) (044, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4nmtjd ,sc4nmtj, sc4_200_4ra, sc4nmtj, sc4_state, sc4nmtj, ROT0, "Mazooma","Never Mind The Jackpots (Mazooma) (Scorpion 4) (044, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4nmtj ,0, sc4_200_4ra, sc4nmtj, sc4_state, sc4nmtj, ROT0, "Mazooma","Never Mind The Jackpots (Mazooma) (Scorpion 4) (011)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4nmtja ,sc4nmtj, sc4_200_4ra, sc4nmtj, sc4_state, sc4nmtj, ROT0, "Mazooma","Never Mind The Jackpots (Mazooma) (Scorpion 4) (014, set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4nmtjc ,sc4nmtj, sc4_200_4ra, sc4nmtj, sc4_state, sc4nmtj, ROT0, "Mazooma","Never Mind The Jackpots (Mazooma) (Scorpion 4) (014, set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4nmtjb ,sc4nmtj, sc4_200_4ra, sc4nmtj, sc4_state, sc4nmtj, ROT0, "Mazooma","Never Mind The Jackpots (Mazooma) (Scorpion 4) (044, set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4nmtjd ,sc4nmtj, sc4_200_4ra, sc4nmtj, sc4_state, sc4nmtj, ROT0, "Mazooma","Never Mind The Jackpots (Mazooma) (Scorpion 4) (044, set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4oyf)
@@ -28203,8 +28205,8 @@ INPUT_PORTS_START( sc4oyf ) // this structure is generated
INPUT_PORTS_END
// PR1310 AWP OFF YOUR FACE PR1310 OFF YOUR FACE SOUNDS11
-GAMEL( 200?, sc4oyf ,0, sc4_4reel_alt, sc4oyf, sc4_state, sc4oyf, ROT0, "BFM","Off Your Face (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4oyfa ,sc4oyf, sc4_4reel_alt, sc4oyf, sc4_state, sc4oyf, ROT0, "BFM","Off Your Face (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4oyf ,0, sc4_4reel_alt, sc4oyf, sc4_state, sc4oyf, ROT0, "BFM","Off Your Face (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4oyfa ,sc4oyf, sc4_4reel_alt, sc4oyf, sc4_state, sc4oyf, ROT0, "BFM","Off Your Face (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -28276,8 +28278,8 @@ INPUT_PORTS_START( sc4opses ) // this structure is generated
INPUT_PORTS_END
// PR1106 OPEN SESAME PR1106 OPEN SESAME SOUNDS11
-GAMEL( 200?, sc4opses ,0, sc4_200_5r, sc4opses, sc4_state, sc4opses, ROT0, "BFM","Open Sesame (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4opsesa ,sc4opses, sc4_200_5r, sc4opses, sc4_state, sc4opses, ROT0, "BFM","Open Sesame (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4opses ,0, sc4_200_5r, sc4opses, sc4_state, sc4opses, ROT0, "BFM","Open Sesame (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4opsesa ,sc4opses, sc4_200_5r, sc4opses, sc4_state, sc4opses, ROT0, "BFM","Open Sesame (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4paccl)
@@ -28334,10 +28336,10 @@ INPUT_PORTS_START( sc4paccl ) // this structure is generated
INPUT_PORTS_END
// PR2018 PACMAN CLUB CLUB PACMAN SOUNDS PACMAN C L U B
-GAMEL( 200?, sc4paccl ,0, sc4_5reel, sc4paccl, sc4_state, sc4paccl, ROT0, "Mazooma","Pac Man Club (PR2018, CPAC) (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4paccla ,sc4paccl, sc4_5reel, sc4paccl, sc4_state, sc4paccl, ROT0, "Mazooma","Pac Man Club (PR2018, CPAC) (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pacclb ,sc4paccl, sc4_5reel, sc4paccl, sc4_state, sc4paccl, ROT0, "Mazooma","Pac Man Club (PR2018, CPAC) (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pacclc ,sc4paccl, sc4_5reel, sc4paccl, sc4_state, sc4paccl, ROT0, "Mazooma","Pac Man Club (PR2018, CPAC) (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4paccl ,0, sc4_5reel, sc4paccl, sc4_state, sc4paccl, ROT0, "Mazooma","Pac Man Club (PR2018, CPAC) (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4paccla ,sc4paccl, sc4_5reel, sc4paccl, sc4_state, sc4paccl, ROT0, "Mazooma","Pac Man Club (PR2018, CPAC) (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pacclb ,sc4paccl, sc4_5reel, sc4paccl, sc4_state, sc4paccl, ROT0, "Mazooma","Pac Man Club (PR2018, CPAC) (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pacclc ,sc4paccl, sc4_5reel, sc4paccl, sc4_state, sc4paccl, ROT0, "Mazooma","Pac Man Club (PR2018, CPAC) (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
// REEL 4 ERR 24 (what type should be here??)
@@ -28395,8 +28397,8 @@ INPUT_PORTS_END
// REEL 4 ERR 24
// PR2031 PACMANIA ANIA SOUNDS PACMANIA
-GAMEL( 200?, sc4pmani ,0, sc4_200_4rb, sc4pmani, sc4_state, sc4pmani, ROT0, "Mazooma","Pac Mania (PR2031, ANIA) (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pmania ,sc4pmani, sc4_200_4rb, sc4pmani, sc4_state, sc4pmani, ROT0, "Mazooma","Pac Mania (PR2031, ANIA) (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4pmani ,0, sc4_200_4rb, sc4pmani, sc4_state, sc4pmani, ROT0, "Mazooma","Pac Mania (PR2031, ANIA) (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pmania ,sc4pmani, sc4_200_4rb, sc4pmani, sc4_state, sc4pmani, ROT0, "Mazooma","Pac Mania (PR2031, ANIA) (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4pgold)
@@ -28467,12 +28469,12 @@ INPUT_PORTS_START( sc4pgold ) // this structure is generated
INPUT_PORTS_END
// PR1012 PHARAOH'S GOLD PR1012 PHARAOHS GOLD SOUNDS11
-GAMEL( 200?, sc4pgold ,0, sc4_200_5r, sc4pgold, sc4_state, sc4pgold, ROT0, "BFM","Pharaoh's Gold (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pgolda ,sc4pgold, sc4_200_5r, sc4pgold, sc4_state, sc4pgold, ROT0, "BFM","Pharaoh's Gold (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pgoldb ,sc4pgold, sc4_200_5r, sc4pgold, sc4_state, sc4pgold, ROT0, "BFM","Pharaoh's Gold (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pgoldc ,sc4pgold, sc4_200_5r, sc4pgold, sc4_state, sc4pgold, ROT0, "BFM","Pharaoh's Gold (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pgoldd ,sc4pgold, sc4_200_5r, sc4pgold, sc4_state, sc4pgold, ROT0, "BFM","Pharaoh's Gold (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pgoldf ,sc4pgold, sc4_200_5r, sc4pgold, sc4_state, sc4pgold, ROT0, "BFM","Pharaoh's Gold (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4pgold ,0, sc4_200_5r, sc4pgold, sc4_state, sc4pgold, ROT0, "BFM","Pharaoh's Gold (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pgolda ,sc4pgold, sc4_200_5r, sc4pgold, sc4_state, sc4pgold, ROT0, "BFM","Pharaoh's Gold (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pgoldb ,sc4pgold, sc4_200_5r, sc4pgold, sc4_state, sc4pgold, ROT0, "BFM","Pharaoh's Gold (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pgoldc ,sc4pgold, sc4_200_5r, sc4pgold, sc4_state, sc4pgold, ROT0, "BFM","Pharaoh's Gold (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pgoldd ,sc4pgold, sc4_200_5r, sc4pgold, sc4_state, sc4pgold, ROT0, "BFM","Pharaoh's Gold (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pgoldf ,sc4pgold, sc4_200_5r, sc4pgold, sc4_state, sc4pgold, ROT0, "BFM","Pharaoh's Gold (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -28532,11 +28534,11 @@ INPUT_PORTS_START( sc4ppclb ) // this structure is generated
INPUT_PORTS_END
// PR2236 CLUB PINK PANTHER 411 CLUBPINKPANTHERSND CLUB PINKPANTHER
-GAMEL( 200?, sc4ppclb ,0, sc4, sc4ppclb, sc4_state, sc4ppclb, ROT0, "Qps","Pink Panther Club (411) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // also in a set marked 'Pink Pannther Think Pink'
-GAMEL( 200?, sc4ppclbb ,sc4ppclb, sc4, sc4ppclb, sc4_state, sc4ppclb, ROT0, "Qps","Pink Panther Club (411) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4ppclb ,0, sc4, sc4ppclb, sc4_state, sc4ppclb, ROT0, "Qps","Pink Panther Club (411) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // also in a set marked 'Pink Pannther Think Pink'
+GAMEL( 200?, sc4ppclbb ,sc4ppclb, sc4, sc4ppclb, sc4_state, sc4ppclb, ROT0, "Qps","Pink Panther Club (411) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2236 CLUB PINK PANTHER 412 CLUBPINKPANTHERSND CLUB PINKPANTHER
-GAMEL( 200?, sc4ppclba ,sc4ppclb, sc4, sc4ppclb, sc4_state, sc4ppclb, ROT0, "Qps","Pink Panther Club (412) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ppclbc ,sc4ppclb, sc4, sc4ppclb, sc4_state, sc4ppclb, ROT0, "Qps","Pink Panther Club (412) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4ppclba ,sc4ppclb, sc4, sc4ppclb, sc4_state, sc4ppclb, ROT0, "Qps","Pink Panther Club (412) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ppclbc ,sc4ppclb, sc4, sc4ppclb, sc4_state, sc4ppclb, ROT0, "Qps","Pink Panther Club (412) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4pipe)
@@ -28592,8 +28594,8 @@ INPUT_PORTS_START( sc4pipe ) // this structure is generated
INPUT_PORTS_END
// PR2110 PIPING HOT PIPE SOUNDS PIPING HOT
-GAMEL( 200?, sc4pipe ,0, sc4_4reel_alt, sc4pipe, sc4_state, sc4pipe, ROT0, "Mazooma","Piping Hot (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pipea ,sc4pipe, sc4_4reel_alt, sc4pipe, sc4_state, sc4pipe, ROT0, "Mazooma","Piping Hot (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4pipe ,0, sc4_4reel_alt, sc4pipe, sc4_state, sc4pipe, ROT0, "Mazooma","Piping Hot (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pipea ,sc4pipe, sc4_4reel_alt, sc4pipe, sc4_state, sc4pipe, ROT0, "Mazooma","Piping Hot (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4plumb)
{
@@ -28647,14 +28649,14 @@ INPUT_PORTS_START( sc4plumb ) // this structure is generated
INPUT_PORTS_END
// QPS142 CLUB PLUMB CRAZY 413 CLUBPLUMBCRAZYSND CLUB PLUMB CRAZY
-GAMEL( 200?, sc4plumb ,0, sc4_5reel, sc4plumb, sc4_state, sc4plumb, ROT0, "Qps","Plumb Crazy Club (413) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4plumba ,sc4plumb, sc4_5reel, sc4plumb, sc4_state, sc4plumb, ROT0, "Qps","Plumb Crazy Club (413) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4plumb ,0, sc4_5reel, sc4plumb, sc4_state, sc4plumb, ROT0, "Qps","Plumb Crazy Club (413) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4plumba ,sc4plumb, sc4_5reel, sc4plumb, sc4_state, sc4plumb, ROT0, "Qps","Plumb Crazy Club (413) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// QPS142 CLUB PLUMB CRAZY 411 CLUBPLUMBCRAZYSND CLUB PLUMB CRAZY
-GAMEL( 200?, sc4plumbb ,sc4plumb, sc4_5reel, sc4plumb, sc4_state, sc4plumb, ROT0, "Qps","Plumb Crazy Club (411) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4plumbc ,sc4plumb, sc4_5reel, sc4plumb, sc4_state, sc4plumb, ROT0, "Qps","Plumb Crazy Club (411) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4plumbb ,sc4plumb, sc4_5reel, sc4plumb, sc4_state, sc4plumb, ROT0, "Qps","Plumb Crazy Club (411) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4plumbc ,sc4plumb, sc4_5reel, sc4plumb, sc4_state, sc4plumb, ROT0, "Qps","Plumb Crazy Club (411) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// QPS142 CLUB PLUMB CRAZY 412 CLUBPLUMBCRAZYSND CLUB PLUMB CRAZY
-GAMEL( 200?, sc4plumbd ,sc4plumb, sc4_5reel, sc4plumb, sc4_state, sc4plumb, ROT0, "Qps","Plumb Crazy Club (412) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4plumbe ,sc4plumb, sc4_5reel, sc4plumb, sc4_state, sc4plumb, ROT0, "Qps","Plumb Crazy Club (412) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4plumbd ,sc4plumb, sc4_5reel, sc4plumb, sc4_state, sc4plumb, ROT0, "Qps","Plumb Crazy Club (412) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4plumbe ,sc4plumb, sc4_5reel, sc4plumb, sc4_state, sc4plumb, ROT0, "Qps","Plumb Crazy Club (412) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4polic)
@@ -28704,11 +28706,11 @@ INPUT_PORTS_START( sc4polic ) // this structure is generated
INPUT_PORTS_END
// PR2514 POLICE SQUID V1.0 POLICESQUIDSND POLICE SQUID
-GAMEL( 200?, sc4polic ,0, sc4_5reel, sc4polic, sc4_state, sc4polic, ROT0, "Qps","Police Squid (V1.0) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4policb ,sc4polic, sc4_5reel, sc4polic, sc4_state, sc4polic, ROT0, "Qps","Police Squid (V1.0) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4polic ,0, sc4_5reel, sc4polic, sc4_state, sc4polic, ROT0, "Qps","Police Squid (V1.0) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4policb ,sc4polic, sc4_5reel, sc4polic, sc4_state, sc4polic, ROT0, "Qps","Police Squid (V1.0) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2514 POLICE SQUID V2.0 POLICESQUIDSND POLICE SQUID
-GAMEL( 200?, sc4polica ,sc4polic, sc4_5reel, sc4polic, sc4_state, sc4polic, ROT0, "Qps","Police Squid (V2.0) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4policc ,sc4polic, sc4_5reel, sc4polic, sc4_state, sc4polic, ROT0, "Qps","Police Squid (V2.0) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4polica ,sc4polic, sc4_5reel, sc4polic, sc4_state, sc4polic, ROT0, "Qps","Police Squid (V2.0) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4policc ,sc4polic, sc4_5reel, sc4polic, sc4_state, sc4polic, ROT0, "Qps","Police Squid (V2.0) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -28761,8 +28763,8 @@ INPUT_PORTS_START( sc4potsh ) // this structure is generated
INPUT_PORTS_END
// QPS143 POT SHOT V1.0 POTSHOTSND POT SHOT
-GAMEL( 200?, sc4potsh ,0, sc4_4reel, sc4potsh, sc4_state, sc4potsh, ROT0, "Qps","Pot Shot (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4potsha ,sc4potsh, sc4_4reel, sc4potsh, sc4_state, sc4potsh, ROT0, "Qps","Pot Shot (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4potsh ,0, sc4_4reel, sc4potsh, sc4_state, sc4potsh, ROT0, "Qps","Pot Shot (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4potsha ,sc4potsh, sc4_4reel, sc4potsh, sc4_state, sc4potsh, ROT0, "Qps","Pot Shot (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4pogbl)
@@ -28826,12 +28828,12 @@ INPUT_PORTS_START( sc4pogbl ) // this structure is generated
INPUT_PORTS_END
// PR3083 CLUB POTS OF GOLD POTS OF GOLD CLUB PR3082 C POTS OF GOLD SOUNDS11 POTS OF GOLD
-GAMEL( 200?, sc4pogbl ,0, sc4_5reel, sc4pogbl, sc4_state, sc4pogbl, ROT0, "BFM","Pots Of Gold Club (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pogbla ,sc4pogbl, sc4_5reel, sc4pogbl, sc4_state, sc4pogbl, ROT0, "BFM","Pots Of Gold Club (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pogblb ,sc4pogbl, sc4_5reel, sc4pogbl, sc4_state, sc4pogbl, ROT0, "BFM","Pots Of Gold Club (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pogblc ,sc4pogbl, sc4_5reel, sc4pogbl, sc4_state, sc4pogbl, ROT0, "BFM","Pots Of Gold Club (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pogbld ,sc4pogbl, sc4_5reel, sc4pogbl, sc4_state, sc4pogbl, ROT0, "BFM","Pots Of Gold Club (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pogble ,sc4pogbl, sc4_5reel, sc4pogbl, sc4_state, sc4pogbl, ROT0, "BFM","Pots Of Gold Club (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4pogbl ,0, sc4_5reel, sc4pogbl, sc4_state, sc4pogbl, ROT0, "BFM","Pots Of Gold Club (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pogbla ,sc4pogbl, sc4_5reel, sc4pogbl, sc4_state, sc4pogbl, ROT0, "BFM","Pots Of Gold Club (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pogblb ,sc4pogbl, sc4_5reel, sc4pogbl, sc4_state, sc4pogbl, ROT0, "BFM","Pots Of Gold Club (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pogblc ,sc4pogbl, sc4_5reel, sc4pogbl, sc4_state, sc4pogbl, ROT0, "BFM","Pots Of Gold Club (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pogbld ,sc4pogbl, sc4_5reel, sc4pogbl, sc4_state, sc4pogbl, ROT0, "BFM","Pots Of Gold Club (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pogble ,sc4pogbl, sc4_5reel, sc4pogbl, sc4_state, sc4pogbl, ROT0, "BFM","Pots Of Gold Club (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4pwrsg)
{
@@ -28883,10 +28885,10 @@ INPUT_PORTS_START( sc4pwrsg ) // this structure is generated
INPUT_PORTS_END
// PR2053 POWERSURGE SURGESND POWERSURGE
-GAMEL( 200?, sc4pwrsg ,0, sc4_200_5r, sc4pwrsg, sc4_state, sc4pwrsg, ROT0, "Qps","Power Surge (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pwrsga ,sc4pwrsg, sc4_200_5r, sc4pwrsg, sc4_state, sc4pwrsg, ROT0, "Qps","Power Surge (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pwrsgb ,sc4pwrsg, sc4_200_5r, sc4pwrsg, sc4_state, sc4pwrsg, ROT0, "Qps","Power Surge (Qps) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pwrsgc ,sc4pwrsg, sc4_200_5r, sc4pwrsg, sc4_state, sc4pwrsg, ROT0, "Qps","Power Surge (Qps) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4pwrsg ,0, sc4_200_5r, sc4pwrsg, sc4_state, sc4pwrsg, ROT0, "Qps","Power Surge (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pwrsga ,sc4pwrsg, sc4_200_5r, sc4pwrsg, sc4_state, sc4pwrsg, ROT0, "Qps","Power Surge (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pwrsgb ,sc4pwrsg, sc4_200_5r, sc4pwrsg, sc4_state, sc4pwrsg, ROT0, "Qps","Power Surge (Qps) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pwrsgc ,sc4pwrsg, sc4_200_5r, sc4pwrsg, sc4_state, sc4pwrsg, ROT0, "Qps","Power Surge (Qps) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4pir)
@@ -28957,14 +28959,14 @@ INPUT_PORTS_START( sc4pir ) // this structure is generated
INPUT_PORTS_END
// PR1303 THE PRIZE IS RIGHT PR1303 T PRIZE I R SOUNDS11
-GAMEL( 200?, sc4pir ,0, sc4_200_5r, sc4pir, sc4_state, sc4pir, ROT0, "BFM","The Prize Is Right (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pira ,sc4pir, sc4_200_5r, sc4pir, sc4_state, sc4pir, ROT0, "BFM","The Prize Is Right (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pirb ,sc4pir, sc4_200_5r, sc4pir, sc4_state, sc4pir, ROT0, "BFM","The Prize Is Right (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pirc ,sc4pir, sc4_200_5r, sc4pir, sc4_state, sc4pir, ROT0, "BFM","The Prize Is Right (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pird ,sc4pir, sc4_200_5r, sc4pir, sc4_state, sc4pir, ROT0, "BFM","The Prize Is Right (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pire ,sc4pir, sc4_200_5r, sc4pir, sc4_state, sc4pir, ROT0, "BFM","The Prize Is Right (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pirf ,sc4pir, sc4_200_5r, sc4pir, sc4_state, sc4pir, ROT0, "BFM","The Prize Is Right (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pirg ,sc4pir, sc4_200_5r, sc4pir, sc4_state, sc4pir, ROT0, "BFM","The Prize Is Right (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4pir ,0, sc4_200_5r, sc4pir, sc4_state, sc4pir, ROT0, "BFM","The Prize Is Right (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pira ,sc4pir, sc4_200_5r, sc4pir, sc4_state, sc4pir, ROT0, "BFM","The Prize Is Right (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pirb ,sc4pir, sc4_200_5r, sc4pir, sc4_state, sc4pir, ROT0, "BFM","The Prize Is Right (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pirc ,sc4pir, sc4_200_5r, sc4pir, sc4_state, sc4pir, ROT0, "BFM","The Prize Is Right (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pird ,sc4pir, sc4_200_5r, sc4pir, sc4_state, sc4pir, ROT0, "BFM","The Prize Is Right (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pire ,sc4pir, sc4_200_5r, sc4pir, sc4_state, sc4pir, ROT0, "BFM","The Prize Is Right (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pirf ,sc4pir, sc4_200_5r, sc4pir, sc4_state, sc4pir, ROT0, "BFM","The Prize Is Right (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pirg ,sc4pir, sc4_200_5r, sc4pir, sc4_state, sc4pir, ROT0, "BFM","The Prize Is Right (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4qmodo)
@@ -29011,11 +29013,11 @@ INPUT_PORTS_START( sc4qmodo ) // this structure is generated
INPUT_PORTS_END
// QUAZZI MO' DOUGH..........QUAZZSND....... (no standard header)
-GAMEL( 200?, sc4qmodo , 0, sc4_4reel, sc4qmodo, sc4_state, sc4qmodo, ROT0, "Qps","Quazzi Mo' Dough (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4qmodoa ,sc4qmodo, sc4_4reel, sc4qmodo, sc4_state, sc4qmodo, ROT0, "Qps","Quazzi Mo' Dough (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4qmodob ,sc4qmodo, sc4_4reel, sc4qmodo, sc4_state, sc4qmodo, ROT0, "Qps","Quazzi Mo' Dough (Qps) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4qmodoc ,sc4qmodo, sc4_4reel, sc4qmodo, sc4_state, sc4qmodo, ROT0, "Qps","Quazzi Mo' Dough (Qps) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4qmodod ,sc4qmodo, sc4_4reel, sc4qmodo, sc4_state, sc4qmodo, ROT0, "Qps","Quazzi Mo' Dough (Qps) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4qmodo , 0, sc4_4reel, sc4qmodo, sc4_state, sc4qmodo, ROT0, "Qps","Quazzi Mo' Dough (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4qmodoa ,sc4qmodo, sc4_4reel, sc4qmodo, sc4_state, sc4qmodo, ROT0, "Qps","Quazzi Mo' Dough (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4qmodob ,sc4qmodo, sc4_4reel, sc4qmodo, sc4_state, sc4qmodo, ROT0, "Qps","Quazzi Mo' Dough (Qps) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4qmodoc ,sc4qmodo, sc4_4reel, sc4qmodo, sc4_state, sc4qmodo, ROT0, "Qps","Quazzi Mo' Dough (Qps) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4qmodod ,sc4qmodo, sc4_4reel, sc4qmodo, sc4_state, sc4qmodo, ROT0, "Qps","Quazzi Mo' Dough (Qps) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -29069,10 +29071,10 @@ INPUT_PORTS_START( sc4quidr ) // this structure is generated
// 0x0010 - "hopdmp" // standard input (expected here)
INPUT_PORTS_END
-GAMEL( 200?, sc4quidr ,0, sc4_4reel, sc4quidr, sc4_state, sc4quidr, ROT0, "Qps","Quid Rock (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4quidra ,sc4quidr, sc4_4reel, sc4quidr, sc4_state, sc4quidr, ROT0, "Qps","Quid Rock (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4quidrb ,sc4quidr, sc4_4reel, sc4quidr, sc4_state, sc4quidr, ROT0, "Qps","Quid Rock (Qps) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4quidrc ,sc4quidr, sc4_4reel, sc4quidr, sc4_state, sc4quidr, ROT0, "Qps","Quid Rock (Qps) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4quidr ,0, sc4_4reel, sc4quidr, sc4_state, sc4quidr, ROT0, "Qps","Quid Rock (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4quidra ,sc4quidr, sc4_4reel, sc4quidr, sc4_state, sc4quidr, ROT0, "Qps","Quid Rock (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4quidrb ,sc4quidr, sc4_4reel, sc4quidr, sc4_state, sc4quidr, ROT0, "Qps","Quid Rock (Qps) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4quidrc ,sc4quidr, sc4_4reel, sc4quidr, sc4_state, sc4quidr, ROT0, "Qps","Quid Rock (Qps) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4rdrag)
@@ -29127,11 +29129,11 @@ INPUT_PORTS_START( sc4rdrag ) // this structure is generated
INPUT_PORTS_END
// PR2542 RED DRAGON 011 REDDRAGONSND RED DRAGON
-GAMEL( 200?, sc4rdrag ,0, sc4_5reel, sc4rdrag, sc4_state, sc4rdrag, ROT0, "Qps","Red Dragon (011) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rdraga ,sc4rdrag, sc4_5reel, sc4rdrag, sc4_state, sc4rdrag, ROT0, "Qps","Red Dragon (011) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4rdrag ,0, sc4_5reel, sc4rdrag, sc4_state, sc4rdrag, ROT0, "Qps","Red Dragon (011) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rdraga ,sc4rdrag, sc4_5reel, sc4rdrag, sc4_state, sc4rdrag, ROT0, "Qps","Red Dragon (011) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2542 RED DRAGON 021 REDDRAGONSND RED DRAGON
-GAMEL( 200?, sc4rdragc ,sc4rdrag, sc4_5reel, sc4rdrag, sc4_state, sc4rdrag, ROT0, "Qps","Red Dragon (021) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rdragf ,sc4rdrag, sc4_5reel, sc4rdrag, sc4_state, sc4rdrag, ROT0, "Qps","Red Dragon (021) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4rdragc ,sc4rdrag, sc4_5reel, sc4rdrag, sc4_state, sc4rdrag, ROT0, "Qps","Red Dragon (021) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rdragf ,sc4rdrag, sc4_5reel, sc4rdrag, sc4_state, sc4rdrag, ROT0, "Qps","Red Dragon (021) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4rdrcl)
@@ -29187,10 +29189,10 @@ INPUT_PORTS_START( sc4rdrcl ) // this structure is generated
INPUT_PORTS_END
// QPS160 CLUB RED DRAGON 411 CLUBREDDRAGONSND CLUB RED DRAGON
-GAMEL( 200?, sc4rdrcl ,0, sc4_5reel, sc4rdrcl, sc4_state, sc4rdrcl, ROT0, "Qps","Red Dragon Club (411) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rdrclb ,sc4rdrcl, sc4_5reel, sc4rdrcl, sc4_state, sc4rdrcl, ROT0, "Qps","Red Dragon Club (411) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4rdrcl ,0, sc4_5reel, sc4rdrcl, sc4_state, sc4rdrcl, ROT0, "Qps","Red Dragon Club (411) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rdrclb ,sc4rdrcl, sc4_5reel, sc4rdrcl, sc4_state, sc4rdrcl, ROT0, "Qps","Red Dragon Club (411) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// QPS160 CLUB RED DRAGON 412 CLUBREDDRAGONSND CLUB RED DRAGON
-GAMEL( 200?, sc4rdrcla ,sc4rdrcl, sc4_5reel, sc4rdrcl, sc4_state, sc4rdrcl, ROT0, "Qps","Red Dragon Club (412) (Qps) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4rdrcla ,sc4rdrcl, sc4_5reel, sc4rdrcl, sc4_state, sc4rdrcl, ROT0, "Qps","Red Dragon Club (412) (Qps) (Scorpion 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4relcz)
@@ -29261,10 +29263,10 @@ INPUT_PORTS_START( sc4relcz ) // this structure is generated
INPUT_PORTS_END
// PR1015 REELY CRAZY PR1015 REELY CRAZY SOUNDS11
-GAMEL( 200?, sc4relcz ,0, sc4_4reel, sc4relcz, sc4_state, sc4relcz, ROT0, "BFM","Reely Crazy (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4relcza ,sc4relcz, sc4_4reel, sc4relcz, sc4_state, sc4relcz, ROT0, "BFM","Reely Crazy (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4relczb ,sc4relcz, sc4_4reel, sc4relcz, sc4_state, sc4relcz, ROT0, "BFM","Reely Crazy (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4relczc ,sc4relcz, sc4_4reel, sc4relcz, sc4_state, sc4relcz, ROT0, "BFM","Reely Crazy (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4relcz ,0, sc4_4reel, sc4relcz, sc4_state, sc4relcz, ROT0, "BFM","Reely Crazy (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4relcza ,sc4relcz, sc4_4reel, sc4relcz, sc4_state, sc4relcz, ROT0, "BFM","Reely Crazy (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4relczb ,sc4relcz, sc4_4reel, sc4relcz, sc4_state, sc4relcz, ROT0, "BFM","Reely Crazy (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4relczc ,sc4relcz, sc4_4reel, sc4relcz, sc4_state, sc4relcz, ROT0, "BFM","Reely Crazy (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4rotc)
@@ -29319,11 +29321,11 @@ INPUT_PORTS_START( sc4rotc ) // this structure is generated
INPUT_PORTS_END
// PR2132 RETURN OF THE COUNT ROTC SOUNDS THE COUNT
-GAMEL( 200?, sc4rotc ,0, sc4_4reel_alt, sc4rotc, sc4_state, sc4rotc, ROT0, "Mazooma","Return Of The Count (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rotca ,sc4rotc, sc4_4reel_alt, sc4rotc, sc4_state, sc4rotc, ROT0, "Mazooma","Return Of The Count (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rotcb ,sc4rotc, sc4_4reel_alt, sc4rotc, sc4_state, sc4rotc, ROT0, "Mazooma","Return Of The Count (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rotcc ,sc4rotc, sc4_4reel_alt, sc4rotc, sc4_state, sc4rotc, ROT0, "Mazooma","Return Of The Count (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rotcd ,sc4rotc, sc4_4reel_alt, sc4rotc, sc4_state, sc4rotc, ROT0, "Mazooma","Return Of The Count (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4rotc ,0, sc4_4reel_alt, sc4rotc, sc4_state, sc4rotc, ROT0, "Mazooma","Return Of The Count (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rotca ,sc4rotc, sc4_4reel_alt, sc4rotc, sc4_state, sc4rotc, ROT0, "Mazooma","Return Of The Count (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rotcb ,sc4rotc, sc4_4reel_alt, sc4rotc, sc4_state, sc4rotc, ROT0, "Mazooma","Return Of The Count (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rotcc ,sc4rotc, sc4_4reel_alt, sc4rotc, sc4_state, sc4rotc, ROT0, "Mazooma","Return Of The Count (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rotcd ,sc4rotc, sc4_4reel_alt, sc4rotc, sc4_state, sc4rotc, ROT0, "Mazooma","Return Of The Count (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4rttt)
@@ -29380,12 +29382,12 @@ INPUT_PORTS_START( sc4rttt ) // this structure is generated
INPUT_PORTS_END
// PR2089 RISE TO THE TOP RISE SOUNDS RISE TO THE TOP
-GAMEL( 200?, sc4rttt ,0, sc4_4reel_alt, sc4rttt, sc4_state, sc4rttt, ROT0, "Mazooma","Rise To The Top (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rttta ,sc4rttt, sc4_4reel_alt, sc4rttt, sc4_state, sc4rttt, ROT0, "Mazooma","Rise To The Top (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rtttb ,sc4rttt, sc4_4reel_alt, sc4rttt, sc4_state, sc4rttt_mbus, ROT0, "Mazooma","Rise To The Top (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rtttc ,sc4rttt, sc4_4reel_alt, sc4rttt, sc4_state, sc4rttt_mbus, ROT0, "Mazooma","Rise To The Top (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rtttd ,sc4rttt, sc4_4reel_alt, sc4rttt, sc4_state, sc4rttt_mbus, ROT0, "Mazooma","Rise To The Top (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rttte ,sc4rttt, sc4_4reel_alt, sc4rttt, sc4_state, sc4rttt_mbus, ROT0, "Mazooma","Rise To The Top (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4rttt ,0, sc4_4reel_alt, sc4rttt, sc4_state, sc4rttt, ROT0, "Mazooma","Rise To The Top (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rttta ,sc4rttt, sc4_4reel_alt, sc4rttt, sc4_state, sc4rttt, ROT0, "Mazooma","Rise To The Top (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rtttb ,sc4rttt, sc4_4reel_alt, sc4rttt, sc4_state, sc4rttt_mbus, ROT0, "Mazooma","Rise To The Top (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rtttc ,sc4rttt, sc4_4reel_alt, sc4rttt, sc4_state, sc4rttt_mbus, ROT0, "Mazooma","Rise To The Top (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rtttd ,sc4rttt, sc4_4reel_alt, sc4rttt, sc4_state, sc4rttt_mbus, ROT0, "Mazooma","Rise To The Top (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rttte ,sc4rttt, sc4_4reel_alt, sc4rttt, sc4_state, sc4rttt_mbus, ROT0, "Mazooma","Rise To The Top (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4roksc)
{
@@ -29439,11 +29441,11 @@ INPUT_PORTS_START( sc4roksc ) // this structure is generated
INPUT_PORTS_END
// PR2527 ROCKET SCIENCE V1.1 ROCKETSCIENCESND ROCKET SCIENCE
-GAMEL( 200?, sc4roksc ,0, sc4_4reel_alt, sc4roksc, sc4_state, sc4roksc, ROT0, "Qps","Rocket Science (V1.1) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rokscb ,sc4roksc, sc4_4reel_alt, sc4roksc, sc4_state, sc4roksc, ROT0, "Qps","Rocket Science (V1.1) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4roksc ,0, sc4_4reel_alt, sc4roksc, sc4_state, sc4roksc, ROT0, "Qps","Rocket Science (V1.1) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rokscb ,sc4roksc, sc4_4reel_alt, sc4roksc, sc4_state, sc4roksc, ROT0, "Qps","Rocket Science (V1.1) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2527 ROCKET SCIENCE 011 ROCKETSCIENCESND ROCKET SCIENCE
-GAMEL( 200?, sc4roksca ,sc4roksc, sc4_4reel_alt, sc4roksc, sc4_state, sc4roksc, ROT0, "Qps","Rocket Science (011) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rokscc ,sc4roksc, sc4_4reel_alt, sc4roksc, sc4_state, sc4roksc, ROT0, "Qps","Rocket Science (011) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4roksca ,sc4roksc, sc4_4reel_alt, sc4roksc, sc4_state, sc4roksc, ROT0, "Qps","Rocket Science (011) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rokscc ,sc4roksc, sc4_4reel_alt, sc4roksc, sc4_state, sc4roksc, ROT0, "Qps","Rocket Science (011) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4blast)
{
@@ -29498,14 +29500,14 @@ INPUT_PORTS_END
// only starts 2nd time (requires valid ram?)
// PR2539 BLAST OFF011 ROCKETSCIENCESND BLAST OFF
-GAMEL( 200?, sc4blast ,0, sc4_4reel_alt, sc4blast, sc4_state, sc4blast, ROT0, "Qps","Blast Off (011) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4blastb ,sc4blast, sc4_4reel_alt, sc4blast, sc4_state, sc4blast, ROT0, "Qps","Blast Off (011) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4blast ,0, sc4_4reel_alt, sc4blast, sc4_state, sc4blast, ROT0, "Qps","Blast Off (011) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4blastb ,sc4blast, sc4_4reel_alt, sc4blast, sc4_state, sc4blast, ROT0, "Qps","Blast Off (011) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2539 BLAST OFF041 ROCKETSCIENCESND BLAST OFF
-GAMEL( 200?, sc4blasta ,sc4blast, sc4_4reel_alt, sc4blast, sc4_state, sc4blast, ROT0, "Qps","Blast Off (041) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4blastc ,sc4blast, sc4_4reel_alt, sc4blast, sc4_state, sc4blast, ROT0, "Qps","Blast Off (041) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4blasta ,sc4blast, sc4_4reel_alt, sc4blast, sc4_state, sc4blast, ROT0, "Qps","Blast Off (041) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4blastc ,sc4blast, sc4_4reel_alt, sc4blast, sc4_state, sc4blast, ROT0, "Qps","Blast Off (041) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2539 BLAST OFF 042 ROCKETSCIENCESND BLAST OFF
-GAMEL( 200?, sc4blastd ,sc4blast, sc4_4reel_alt, sc4blast, sc4_state, sc4blast, ROT0, "Qps","Blast Off (042) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4blaste ,sc4blast, sc4_4reel_alt, sc4blast, sc4_state, sc4blast, ROT0, "Qps","Blast Off (042) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4blastd ,sc4blast, sc4_4reel_alt, sc4blast, sc4_state, sc4blast, ROT0, "Qps","Blast Off (042) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4blaste ,sc4blast, sc4_4reel_alt, sc4blast, sc4_state, sc4blast, ROT0, "Qps","Blast Off (042) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -29562,17 +29564,17 @@ INPUT_PORTS_END
// PR2060 ROGAN DOSH ROGANSND ROGAN DOSH
-GAMEL( 200?, sc4rogds ,0, sc4_200_4ra, sc4rogds, sc4_state, sc4rogds, ROT0, "Qps","Rogan Dosh (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rogdsa ,sc4rogds, sc4_200_4ra, sc4rogds, sc4_state, sc4rogds, ROT0, "Qps","Rogan Dosh (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rogdsb ,sc4rogds, sc4_200_4ra, sc4rogds, sc4_state, sc4rogds, ROT0, "Qps","Rogan Dosh (Qps) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rogdsc ,sc4rogds, sc4_200_4ra, sc4rogds, sc4_state, sc4rogds, ROT0, "Qps","Rogan Dosh (Qps) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4rogds ,0, sc4_200_4ra, sc4rogds, sc4_state, sc4rogds, ROT0, "Qps","Rogan Dosh (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rogdsa ,sc4rogds, sc4_200_4ra, sc4rogds, sc4_state, sc4rogds, ROT0, "Qps","Rogan Dosh (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rogdsb ,sc4rogds, sc4_200_4ra, sc4rogds, sc4_state, sc4rogds, ROT0, "Qps","Rogan Dosh (Qps) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rogdsc ,sc4rogds, sc4_200_4ra, sc4rogds, sc4_state, sc4rogds, ROT0, "Qps","Rogan Dosh (Qps) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2060 ROGAN DOSH V1.6 ROGANSND ROGAN DOSH
-GAMEL( 200?, sc4rogdse ,sc4rogds, sc4_200_4ra, sc4rogds, sc4_state, sc4rogds, ROT0, "Qps","Rogan Dosh (v1.6) (Qps) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4rogdse ,sc4rogds, sc4_200_4ra, sc4rogds, sc4_state, sc4rogds, ROT0, "Qps","Rogan Dosh (v1.6) (Qps) (Scorpion 4)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2060 ROGAN DOSH V2.0 ROGANSND ROGAN DOSH
-GAMEL( 200?, sc4rogdsd ,sc4rogds, sc4_200_4ra, sc4rogds, sc4_state, sc4rogds, ROT0, "Qps","Rogan Dosh (v2.0) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rogdsf ,sc4rogds, sc4_200_4ra, sc4rogds, sc4_state, sc4rogds, ROT0, "Qps","Rogan Dosh (v2.0) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4rogdsd ,sc4rogds, sc4_200_4ra, sc4rogds, sc4_state, sc4rogds, ROT0, "Qps","Rogan Dosh (v2.0) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rogdsf ,sc4rogds, sc4_200_4ra, sc4rogds, sc4_state, sc4rogds, ROT0, "Qps","Rogan Dosh (v2.0) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2060 ROGAN DOSH V2.1 ROGANSND ROGAN DOSH
-GAMEL( 200?, sc4rogdsg ,sc4rogds, sc4_200_4ra, sc4rogds, sc4_state, sc4rogds, ROT0, "Qps","Rogan Dosh (v2.1) (Qps) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4rogdsg ,sc4rogds, sc4_200_4ra, sc4rogds, sc4_state, sc4rogds, ROT0, "Qps","Rogan Dosh (v2.1) (Qps) (Scorpion 4)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -29632,11 +29634,11 @@ INPUT_PORTS_END
// PR2034 ROLLING THUNDER ROL SOUNDS ROLLING THUNDER
-GAMEL( 200?, sc4rt ,0, sc4_200_4ra, sc4rt, sc4_state, sc4rt, ROT0, "Mazooma","Rolling Thunder (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rta ,sc4rt, sc4_200_4ra, sc4rt, sc4_state, sc4rt, ROT0, "Mazooma","Rolling Thunder (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rtb ,sc4rt, sc4_200_4ra, sc4rt, sc4_state, sc4rt, ROT0, "Mazooma","Rolling Thunder (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rtc ,sc4rt, sc4_200_4ra, sc4rt, sc4_state, sc4rt, ROT0, "Mazooma","Rolling Thunder (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rtd ,sc4rt, sc4_200_4ra, sc4rt, sc4_state, sc4rt, ROT0, "Mazooma","Rolling Thunder (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4rt ,0, sc4_200_4ra, sc4rt, sc4_state, sc4rt, ROT0, "Mazooma","Rolling Thunder (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rta ,sc4rt, sc4_200_4ra, sc4rt, sc4_state, sc4rt, ROT0, "Mazooma","Rolling Thunder (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rtb ,sc4rt, sc4_200_4ra, sc4rt, sc4_state, sc4rt, ROT0, "Mazooma","Rolling Thunder (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rtc ,sc4rt, sc4_200_4ra, sc4rt, sc4_state, sc4rt, ROT0, "Mazooma","Rolling Thunder (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rtd ,sc4rt, sc4_200_4ra, sc4rt, sc4_state, sc4rt, ROT0, "Mazooma","Rolling Thunder (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -29691,10 +29693,10 @@ INPUT_PORTS_END
// missing sound roms, doesn't play, same game code and sound ident as Rolling Thunder?
// PR2034 BANK ROLL ROL SOUNDS BANK ROLL
-GAMEL( 200?, sc4broll ,0, sc4_200_4ra, sc4broll, sc4_state, sc4, ROT0, "Mazooma","Bank Roll (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4brolla ,sc4broll, sc4_200_4ra, sc4broll, sc4_state, sc4, ROT0, "Mazooma","Bank Roll (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4brollb ,sc4broll, sc4_200_4ra, sc4broll, sc4_state, sc4, ROT0, "Mazooma","Bank Roll (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4brollc ,sc4broll, sc4_200_4ra, sc4broll, sc4_state, sc4, ROT0, "Mazooma","Bank Roll (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4broll ,0, sc4_200_4ra, sc4broll, sc4_state, sc4, ROT0, "Mazooma","Bank Roll (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4brolla ,sc4broll, sc4_200_4ra, sc4broll, sc4_state, sc4, ROT0, "Mazooma","Bank Roll (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4brollb ,sc4broll, sc4_200_4ra, sc4broll, sc4_state, sc4, ROT0, "Mazooma","Bank Roll (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4brollc ,sc4broll, sc4_200_4ra, sc4broll, sc4_state, sc4, ROT0, "Mazooma","Bank Roll (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
@@ -29767,10 +29769,10 @@ INPUT_PORTS_START( sc4rbank ) // this structure is generated
INPUT_PORTS_END
// PR1111 ROYAL BANKER PR1111 ROYLEBANKER SOUNDS11
-GAMEL( 200?, sc4rbank ,0, sc4_200_5r, sc4rbank, sc4_state, sc4rbank, ROT0, "BFM","Royle Banker (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rbanka ,sc4rbank, sc4_200_5r, sc4rbank, sc4_state, sc4rbank, ROT0, "BFM","Royle Banker (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rbankb ,sc4rbank, sc4_200_5r, sc4rbank, sc4_state, sc4rbank, ROT0, "BFM","Royle Banker (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rbankc ,sc4rbank, sc4_200_5r, sc4rbank, sc4_state, sc4rbank, ROT0, "BFM","Royle Banker (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4rbank ,0, sc4_200_5r, sc4rbank, sc4_state, sc4rbank, ROT0, "BFM","Royle Banker (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rbanka ,sc4rbank, sc4_200_5r, sc4rbank, sc4_state, sc4rbank, ROT0, "BFM","Royle Banker (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rbankb ,sc4rbank, sc4_200_5r, sc4rbank, sc4_state, sc4rbank, ROT0, "BFM","Royle Banker (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rbankc ,sc4rbank, sc4_200_5r, sc4rbank, sc4_state, sc4rbank, ROT0, "BFM","Royle Banker (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4royle)
@@ -29849,21 +29851,21 @@ INPUT_PORTS_START( sc4royle ) // this structure is generated
INPUT_PORTS_END
// PR1102 ROYLEFAMILY PR1102 ROYLEFAMILY SOUNDS11
-GAMEL( 200?, sc4royle ,0, sc4_200_4ra, sc4royle, sc4_state, sc4royle, ROT0, "BFM","Royle Family (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4roylea ,sc4royle, sc4_200_4ra, sc4royle, sc4_state, sc4royle, ROT0, "BFM","Royle Family (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4royleb ,sc4royle, sc4_200_4ra, sc4royle, sc4_state, sc4royle, ROT0, "BFM","Royle Family (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4roylec ,sc4royle, sc4_200_4ra, sc4royle, sc4_state, sc4royle, ROT0, "BFM","Royle Family (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4royled ,sc4royle, sc4_200_4ra, sc4royle, sc4_state, sc4royle, ROT0, "BFM","Royle Family (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4roylee ,sc4royle, sc4_200_4ra, sc4royle, sc4_state, sc4royle, ROT0, "BFM","Royle Family (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4royleh ,sc4royle, sc4_200_4ra, sc4royle, sc4_state, sc4royle, ROT0, "BFM","Royle Family (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4roylei ,sc4royle, sc4_200_4ra, sc4royle, sc4_state, sc4royle, ROT0, "BFM","Royle Family (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4royle ,0, sc4_200_4ra, sc4royle, sc4_state, sc4royle, ROT0, "BFM","Royle Family (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4roylea ,sc4royle, sc4_200_4ra, sc4royle, sc4_state, sc4royle, ROT0, "BFM","Royle Family (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4royleb ,sc4royle, sc4_200_4ra, sc4royle, sc4_state, sc4royle, ROT0, "BFM","Royle Family (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4roylec ,sc4royle, sc4_200_4ra, sc4royle, sc4_state, sc4royle, ROT0, "BFM","Royle Family (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4royled ,sc4royle, sc4_200_4ra, sc4royle, sc4_state, sc4royle, ROT0, "BFM","Royle Family (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4roylee ,sc4royle, sc4_200_4ra, sc4royle, sc4_state, sc4royle, ROT0, "BFM","Royle Family (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4royleh ,sc4royle, sc4_200_4ra, sc4royle, sc4_state, sc4royle, ROT0, "BFM","Royle Family (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4roylei ,sc4royle, sc4_200_4ra, sc4royle, sc4_state, sc4royle, ROT0, "BFM","Royle Family (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR1102 ROYLEFAMILY REV2 PR1102 ROYLEFAMILY SOUNDS11
-GAMEL( 200?, sc4roylef ,sc4royle, sc4_200_4ra, sc4royle, sc4_state, sc4royle, ROT0, "BFM","Royle Family (REV 2) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4royleg ,sc4royle, sc4_200_4ra, sc4royle, sc4_state, sc4royle, ROT0, "BFM","Royle Family (REV 2) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4roylej ,sc4royle, sc4_200_4ra, sc4royle, sc4_state, sc4royle, ROT0, "BFM","Royle Family (REV 2) (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4roylek ,sc4royle, sc4_200_4ra, sc4royle, sc4_state, sc4royle, ROT0, "BFM","Royle Family (REV 2) (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4roylel ,sc4royle, sc4_200_4ra, sc4royle, sc4_state, sc4royle, ROT0, "BFM","Royle Family (REV 2) (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4roylem ,sc4royle, sc4_200_4ra, sc4royle, sc4_state, sc4royle, ROT0, "BFM","Royle Family (REV 2) (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4roylef ,sc4royle, sc4_200_4ra, sc4royle, sc4_state, sc4royle, ROT0, "BFM","Royle Family (REV 2) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4royleg ,sc4royle, sc4_200_4ra, sc4royle, sc4_state, sc4royle, ROT0, "BFM","Royle Family (REV 2) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4roylej ,sc4royle, sc4_200_4ra, sc4royle, sc4_state, sc4royle, ROT0, "BFM","Royle Family (REV 2) (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4roylek ,sc4royle, sc4_200_4ra, sc4royle, sc4_state, sc4royle, ROT0, "BFM","Royle Family (REV 2) (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4roylel ,sc4royle, sc4_200_4ra, sc4royle, sc4_state, sc4royle, ROT0, "BFM","Royle Family (REV 2) (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4roylem ,sc4royle, sc4_200_4ra, sc4royle, sc4_state, sc4royle, ROT0, "BFM","Royle Family (REV 2) (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4sidsp)
@@ -29917,10 +29919,10 @@ INPUT_PORTS_START( sc4sidsp ) // this structure is generated
INPUT_PORTS_END
// PR2117 SIDE SPLITTER SSPT SOUNDS SIDE SPLITTER
-GAMEL( 200?, sc4sidsp ,0, sc4_4reel_alt, sc4sidsp, sc4_state, sc4sidsp, ROT0, "Mazooma","Side Splitter (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4sidspa ,sc4sidsp, sc4_4reel_alt, sc4sidsp, sc4_state, sc4sidsp, ROT0, "Mazooma","Side Splitter (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4sidspb ,sc4sidsp, sc4_4reel_alt, sc4sidsp, sc4_state, sc4sidsp, ROT0, "Mazooma","Side Splitter (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4sidspc ,sc4sidsp, sc4_4reel_alt, sc4sidsp, sc4_state, sc4sidsp, ROT0, "Mazooma","Side Splitter (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4sidsp ,0, sc4_4reel_alt, sc4sidsp, sc4_state, sc4sidsp, ROT0, "Mazooma","Side Splitter (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4sidspa ,sc4sidsp, sc4_4reel_alt, sc4sidsp, sc4_state, sc4sidsp, ROT0, "Mazooma","Side Splitter (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4sidspb ,sc4sidsp, sc4_4reel_alt, sc4sidsp, sc4_state, sc4sidsp, ROT0, "Mazooma","Side Splitter (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4sidspc ,sc4sidsp, sc4_4reel_alt, sc4sidsp, sc4_state, sc4sidsp, ROT0, "Mazooma","Side Splitter (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4srr)
@@ -29991,10 +29993,10 @@ INPUT_PORTS_END
// PR1105 SNAKE RATTLE 'N' ROLL PR1105 SNAKERR SOUNDS11
-GAMEL( 200?, sc4srr ,0, sc4_4reel_alt, sc4srr, sc4_state, sc4srr, ROT0, "BFM","Snake Rattle 'n' Roll (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4srra ,sc4srr, sc4_4reel_alt, sc4srr, sc4_state, sc4srr, ROT0, "BFM","Snake Rattle 'n' Roll (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4srrb ,sc4srr, sc4_4reel_alt, sc4srr, sc4_state, sc4srr, ROT0, "BFM","Snake Rattle 'n' Roll (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4srrc ,sc4srr, sc4_4reel_alt, sc4srr, sc4_state, sc4srr, ROT0, "BFM","Snake Rattle 'n' Roll (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4srr ,0, sc4_4reel_alt, sc4srr, sc4_state, sc4srr, ROT0, "BFM","Snake Rattle 'n' Roll (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4srra ,sc4srr, sc4_4reel_alt, sc4srr, sc4_state, sc4srr, ROT0, "BFM","Snake Rattle 'n' Roll (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4srrb ,sc4srr, sc4_4reel_alt, sc4srr, sc4_state, sc4srr, ROT0, "BFM","Snake Rattle 'n' Roll (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4srrc ,sc4srr, sc4_4reel_alt, sc4srr, sc4_state, sc4srr, ROT0, "BFM","Snake Rattle 'n' Roll (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4slc)
@@ -30066,22 +30068,22 @@ INPUT_PORTS_START( sc4slc ) // this structure is generated
INPUT_PORTS_END
// PR1423 CLUB SNAKES N LADDERS PR1423 CSNK SOUNDS11 SNAKES N LADDERS
-GAMEL( 2003, sc4slc ,0, sc4_5reel, sc4slc, sc4_state, sc4slc, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 2003, sc4slcb ,sc4slc, sc4_5reel, sc4slc, sc4_state, sc4slc, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 2003, sc4slcc ,sc4slc, sc4_5reel, sc4slc, sc4_state, sc4slc, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 2003, sc4slce ,sc4slc, sc4_5reel, sc4slc, sc4_state, sc4slc, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 2003, sc4slci ,sc4slc, sc4_5reel, sc4slc, sc4_state, sc4slc, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 2003, sc4slcm ,sc4slc, sc4_5reel, sc4slc, sc4_state, sc4slc, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 2003, sc4slcn ,sc4slc, sc4_5reel, sc4slc, sc4_state, sc4slc, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 2003, sc4slc ,0, sc4_5reel, sc4slc, sc4_state, sc4slc, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 2003, sc4slcb ,sc4slc, sc4_5reel, sc4slc, sc4_state, sc4slc, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 2003, sc4slcc ,sc4slc, sc4_5reel, sc4slc, sc4_state, sc4slc, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 2003, sc4slce ,sc4slc, sc4_5reel, sc4slc, sc4_state, sc4slc, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 2003, sc4slci ,sc4slc, sc4_5reel, sc4slc, sc4_state, sc4slc, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 2003, sc4slcm ,sc4slc, sc4_5reel, sc4slc, sc4_state, sc4slc, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 2003, sc4slcn ,sc4slc, sc4_5reel, sc4slc, sc4_state, sc4slc, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR1423 CLUB SNAKES N LADDERS SNAKES N LADDERS CLUB PR1423 CSNK SOUNDS11 SNAKES N LADDERS
-GAMEL( 2003, sc4slca ,sc4slc, sc4_5reel, sc4slc, sc4_state, sc4slc_mbus, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 2003, sc4slcd ,sc4slc, sc4_5reel, sc4slc, sc4_state, sc4slc_mbus, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 2003, sc4slcf ,sc4slc, sc4_5reel, sc4slc, sc4_state, sc4slc_mbus, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 2003, sc4slcg ,sc4slc, sc4_5reel, sc4slc, sc4_state, sc4slc_mbus, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 11)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 2003, sc4slcj ,sc4slc, sc4_5reel, sc4slc, sc4_state, sc4slc_mbus, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 13)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 2003, sc4slck ,sc4slc, sc4_5reel, sc4slc, sc4_state, sc4slc_mbus, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 14)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 2003, sc4slcl ,sc4slc, sc4_5reel, sc4slc, sc4_state, sc4slc, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 15)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 2003, sc4slch ,sc4slc, sc4_5reel, sc4slc, sc4_state, sc4slc, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 12)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 2003, sc4slca ,sc4slc, sc4_5reel, sc4slc, sc4_state, sc4slc_mbus, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 2003, sc4slcd ,sc4slc, sc4_5reel, sc4slc, sc4_state, sc4slc_mbus, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 2003, sc4slcf ,sc4slc, sc4_5reel, sc4slc, sc4_state, sc4slc_mbus, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 2003, sc4slcg ,sc4slc, sc4_5reel, sc4slc, sc4_state, sc4slc_mbus, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 11)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 2003, sc4slcj ,sc4slc, sc4_5reel, sc4slc, sc4_state, sc4slc_mbus, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 13)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 2003, sc4slck ,sc4slc, sc4_5reel, sc4slc, sc4_state, sc4slc_mbus, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 14)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 2003, sc4slcl ,sc4slc, sc4_5reel, sc4slc, sc4_state, sc4slc, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 15)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 2003, sc4slch ,sc4slc, sc4_5reel, sc4slc, sc4_state, sc4slc, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 12)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -30158,10 +30160,10 @@ INPUT_PORTS_START( sc4solgl ) // this structure is generated
INPUT_PORTS_END
// PR1010 SOLID GOLD PR1010 SOLID GOLD SOUNDS11
-GAMEL( 200?, sc4solgl ,0, sc4_200_4ra, sc4solgl, sc4_state, sc4solgl, ROT0, "BFM","Solid Gold (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4solgla ,sc4solgl, sc4_200_4ra, sc4solgl, sc4_state, sc4solgl, ROT0, "BFM","Solid Gold (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4solglb ,sc4solgl, sc4_200_4ra, sc4solgl, sc4_state, sc4solgl, ROT0, "BFM","Solid Gold (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4solglc ,sc4solgl, sc4_200_4ra, sc4solgl, sc4_state, sc4solgl, ROT0, "BFM","Solid Gold (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4solgl ,0, sc4_200_4ra, sc4solgl, sc4_state, sc4solgl, ROT0, "BFM","Solid Gold (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4solgla ,sc4solgl, sc4_200_4ra, sc4solgl, sc4_state, sc4solgl, ROT0, "BFM","Solid Gold (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4solglb ,sc4solgl, sc4_200_4ra, sc4solgl, sc4_state, sc4solgl, ROT0, "BFM","Solid Gold (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4solglc ,sc4solgl, sc4_200_4ra, sc4solgl, sc4_state, sc4solgl, ROT0, "BFM","Solid Gold (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4sace)
@@ -30214,8 +30216,8 @@ INPUT_PORTS_END
// PR2509 SPACE ACE V2.2 SPACESND SPACE ACE
-GAMEL( 200?, sc4sace ,0, sc4_4reel_alt, sc4sace, sc4_state, sc4sace, ROT0, "Qps","Space Ace (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4sacea ,sc4sace, sc4_4reel_alt, sc4sace, sc4_state, sc4sace, ROT0, "Qps","Space Ace (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4sace ,0, sc4_4reel_alt, sc4sace, sc4_state, sc4sace, ROT0, "Qps","Space Ace (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4sacea ,sc4sace, sc4_4reel_alt, sc4sace, sc4_state, sc4sace, ROT0, "Qps","Space Ace (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -30268,8 +30270,8 @@ INPUT_PORTS_START( sc4sbust ) // this structure is generated
INPUT_PORTS_END
// PR2506 SPACEBUSTER BUSTERSND SPACEBUSTER
-GAMEL( 200?, sc4sbust ,0, sc4_4reel_alt, sc4sbust, sc4_state, sc4sbust, ROT0, "Qps","Space Buster (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4sbusta ,sc4sbust, sc4_4reel_alt, sc4sbust, sc4_state, sc4sbust, ROT0, "Qps","Space Buster (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4sbust ,0, sc4_4reel_alt, sc4sbust, sc4_state, sc4sbust, ROT0, "Qps","Space Buster (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4sbusta ,sc4sbust, sc4_4reel_alt, sc4sbust, sc4_state, sc4sbust, ROT0, "Qps","Space Buster (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -30327,17 +30329,17 @@ INPUT_PORTS_START( sc4stirc ) // this structure is generated
INPUT_PORTS_END
// PR2005 STIR CRAZY STIR SOUNDS STIR CRAZY
-GAMEL( 200?, sc4stirc ,0, sc4_4reel, sc4stirc, sc4_state, sc4stirc, ROT0, "Mazooma","Stir Crazy (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4stirca ,sc4stirc, sc4_4reel, sc4stirc, sc4_state, sc4stirc, ROT0, "Mazooma","Stir Crazy (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4stircb ,sc4stirc, sc4_4reel, sc4stirc, sc4_state, sc4stirc, ROT0, "Mazooma","Stir Crazy (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4stircc ,sc4stirc, sc4_4reel, sc4stirc, sc4_state, sc4stirc, ROT0, "Mazooma","Stir Crazy (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4stircd ,sc4stirc, sc4_4reel, sc4stirc, sc4_state, sc4stirc, ROT0, "Mazooma","Stir Crazy (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4stirce ,sc4stirc, sc4_4reel, sc4stirc, sc4_state, sc4stirc, ROT0, "Mazooma","Stir Crazy (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4stircf ,sc4stirc, sc4_4reel, sc4stirc, sc4_state, sc4stirc, ROT0, "Mazooma","Stir Crazy (Mazooma) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4stircg ,sc4stirc, sc4_4reel, sc4stirc, sc4_state, sc4stirc, ROT0, "Mazooma","Stir Crazy (Mazooma) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4stirch ,sc4stirc, sc4_4reel, sc4stirc, sc4_state, sc4stirc, ROT0, "Mazooma","Stir Crazy (Mazooma) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4stirci ,sc4stirc, sc4_4reel, sc4stirc, sc4_state, sc4stirc, ROT0, "Mazooma","Stir Crazy (Mazooma) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4stircj ,sc4stirc, sc4_4reel, sc4stirc, sc4_state, sc4stirc, ROT0, "Mazooma","Stir Crazy (Mazooma) (Scorpion 4) (set 11)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4stirc ,0, sc4_4reel, sc4stirc, sc4_state, sc4stirc, ROT0, "Mazooma","Stir Crazy (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4stirca ,sc4stirc, sc4_4reel, sc4stirc, sc4_state, sc4stirc, ROT0, "Mazooma","Stir Crazy (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4stircb ,sc4stirc, sc4_4reel, sc4stirc, sc4_state, sc4stirc, ROT0, "Mazooma","Stir Crazy (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4stircc ,sc4stirc, sc4_4reel, sc4stirc, sc4_state, sc4stirc, ROT0, "Mazooma","Stir Crazy (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4stircd ,sc4stirc, sc4_4reel, sc4stirc, sc4_state, sc4stirc, ROT0, "Mazooma","Stir Crazy (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4stirce ,sc4stirc, sc4_4reel, sc4stirc, sc4_state, sc4stirc, ROT0, "Mazooma","Stir Crazy (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4stircf ,sc4stirc, sc4_4reel, sc4stirc, sc4_state, sc4stirc, ROT0, "Mazooma","Stir Crazy (Mazooma) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4stircg ,sc4stirc, sc4_4reel, sc4stirc, sc4_state, sc4stirc, ROT0, "Mazooma","Stir Crazy (Mazooma) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4stirch ,sc4stirc, sc4_4reel, sc4stirc, sc4_state, sc4stirc, ROT0, "Mazooma","Stir Crazy (Mazooma) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4stirci ,sc4stirc, sc4_4reel, sc4stirc, sc4_state, sc4stirc, ROT0, "Mazooma","Stir Crazy (Mazooma) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4stircj ,sc4stirc, sc4_4reel, sc4stirc, sc4_state, sc4stirc, ROT0, "Mazooma","Stir Crazy (Mazooma) (Scorpion 4) (set 11)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -30398,9 +30400,9 @@ INPUT_PORTS_START( sc4sahed ) // this structure is generated
INPUT_PORTS_END
// PRxxxx STREAKS AHEAD V1.0 STREAKSSND STREAKS AHEAD
-GAMEL( 200?, sc4sahed ,0, sc4_200_4rb, sc4sahed, sc4_state, sc4sahed, ROT0, "Qps","Streaks Ahead (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4saheda ,sc4sahed, sc4_200_4rb, sc4sahed, sc4_state, sc4sahed, ROT0, "Qps","Streaks Ahead (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4sahedb ,sc4sahed, sc4_200_4rb, sc4sahed, sc4_state, sc4sahed, ROT0, "Qps","Streaks Ahead (Qps) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4sahed ,0, sc4_200_4rb, sc4sahed, sc4_state, sc4sahed, ROT0, "Qps","Streaks Ahead (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4saheda ,sc4sahed, sc4_200_4rb, sc4sahed, sc4_state, sc4sahed, ROT0, "Qps","Streaks Ahead (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4sahedb ,sc4sahed, sc4_200_4rb, sc4sahed, sc4_state, sc4sahed, ROT0, "Qps","Streaks Ahead (Qps) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4strx)
@@ -30471,10 +30473,10 @@ INPUT_PORTS_END
// PR1114 STRIKE X PR1114 STRIKX SOUNDS11
-GAMEL( 200?, sc4strx ,0, sc4_4reel_alt, sc4strx, sc4_state, sc4strx, ROT0, "BFM","Strike X (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4strxa ,sc4strx, sc4_4reel_alt, sc4strx, sc4_state, sc4strx, ROT0, "BFM","Strike X (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4strxb ,sc4strx, sc4_4reel_alt, sc4strx, sc4_state, sc4strx, ROT0, "BFM","Strike X (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4strxc ,sc4strx, sc4_4reel_alt, sc4strx, sc4_state, sc4strx, ROT0, "BFM","Strike X (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4strx ,0, sc4_4reel_alt, sc4strx, sc4_state, sc4strx, ROT0, "BFM","Strike X (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4strxa ,sc4strx, sc4_4reel_alt, sc4strx, sc4_state, sc4strx, ROT0, "BFM","Strike X (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4strxb ,sc4strx, sc4_4reel_alt, sc4strx, sc4_state, sc4strx, ROT0, "BFM","Strike X (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4strxc ,sc4strx, sc4_4reel_alt, sc4strx, sc4_state, sc4strx, ROT0, "BFM","Strike X (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -30543,10 +30545,10 @@ INPUT_PORTS_START( sc4suscl ) // this structure is generated
INPUT_PORTS_END
// PR2357 CLUB SUITS U SIR SUITS U SIR CLUB CLUB SUIT SOUNDS
-GAMEL( 200?, sc4suscl ,0, sc4_5reel, sc4suscl, sc4_state, sc4suscl, ROT0, "Qps","Suits U Sir Club (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4susclb ,sc4suscl, sc4_5reel, sc4suscl, sc4_state, sc4suscl, ROT0, "Qps","Suits U Sir Club (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4susclc ,sc4suscl, sc4_5reel, sc4suscl, sc4_state, sc4suscl_mbus, ROT0, "Qps","Suits U Sir Club (Qps) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4suscla ,sc4suscl, sc4_5reel, sc4suscl, sc4_state, sc4suscl_mbus, ROT0, "Qps","Suits U Sir Club (Qps) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4suscl ,0, sc4_5reel, sc4suscl, sc4_state, sc4suscl, ROT0, "Qps","Suits U Sir Club (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4susclb ,sc4suscl, sc4_5reel, sc4suscl, sc4_state, sc4suscl, ROT0, "Qps","Suits U Sir Club (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4susclc ,sc4suscl, sc4_5reel, sc4suscl, sc4_state, sc4suscl_mbus, ROT0, "Qps","Suits U Sir Club (Qps) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4suscla ,sc4suscl, sc4_5reel, sc4suscl, sc4_state, sc4suscl_mbus, ROT0, "Qps","Suits U Sir Club (Qps) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -30610,17 +30612,17 @@ INPUT_PORTS_END
// PR2515 TAE KWON DOUGH TAEKWONSND TAE KWON DOUGH
-GAMEL( 200?, sc4taekw ,0, sc4_200_4rb, sc4taekw, sc4_state, sc4taekw, ROT0, "Qps","Tae Kwon Dough (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4taekwa ,sc4taekw, sc4_200_4rb, sc4taekw, sc4_state, sc4taekw, ROT0, "Qps","Tae Kwon Dough (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4taekwb ,sc4taekw, sc4_200_4rb, sc4taekw, sc4_state, sc4taekw, ROT0, "Qps","Tae Kwon Dough (Qps) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4taekwg ,sc4taekw, sc4_200_4rb, sc4taekw, sc4_state, sc4taekw, ROT0, "Qps","Tae Kwon Dough (Qps) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4taekwh ,sc4taekw, sc4_200_4rb, sc4taekw, sc4_state, sc4taekw, ROT0, "Qps","Tae Kwon Dough (Qps) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4taekwi ,sc4taekw, sc4_200_4rb, sc4taekw, sc4_state, sc4taekw, ROT0, "Qps","Tae Kwon Dough (Qps) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4taekwj ,sc4taekw, sc4_200_4rb, sc4taekw, sc4_state, sc4taekw, ROT0, "Qps","Tae Kwon Dough (Qps) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4taekwc ,sc4taekw, sc4_200_4rb, sc4taekw, sc4_state, sc4taekw_mbus, ROT0, "Qps","Tae Kwon Dough (Qps) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4taekwd ,sc4taekw, sc4_200_4rb, sc4taekw, sc4_state, sc4taekw_mbus, ROT0, "Qps","Tae Kwon Dough (Qps) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4taekwe ,sc4taekw, sc4_200_4rb, sc4taekw, sc4_state, sc4taekw_mbus, ROT0, "Qps","Tae Kwon Dough (Qps) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4taekwf ,sc4taekw, sc4_200_4rb, sc4taekw, sc4_state, sc4taekw_mbus, ROT0, "Qps","Tae Kwon Dough (Qps) (Scorpion 4) (set 11)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4taekw ,0, sc4_200_4rb, sc4taekw, sc4_state, sc4taekw, ROT0, "Qps","Tae Kwon Dough (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4taekwa ,sc4taekw, sc4_200_4rb, sc4taekw, sc4_state, sc4taekw, ROT0, "Qps","Tae Kwon Dough (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4taekwb ,sc4taekw, sc4_200_4rb, sc4taekw, sc4_state, sc4taekw, ROT0, "Qps","Tae Kwon Dough (Qps) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4taekwg ,sc4taekw, sc4_200_4rb, sc4taekw, sc4_state, sc4taekw, ROT0, "Qps","Tae Kwon Dough (Qps) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4taekwh ,sc4taekw, sc4_200_4rb, sc4taekw, sc4_state, sc4taekw, ROT0, "Qps","Tae Kwon Dough (Qps) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4taekwi ,sc4taekw, sc4_200_4rb, sc4taekw, sc4_state, sc4taekw, ROT0, "Qps","Tae Kwon Dough (Qps) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4taekwj ,sc4taekw, sc4_200_4rb, sc4taekw, sc4_state, sc4taekw, ROT0, "Qps","Tae Kwon Dough (Qps) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4taekwc ,sc4taekw, sc4_200_4rb, sc4taekw, sc4_state, sc4taekw_mbus, ROT0, "Qps","Tae Kwon Dough (Qps) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4taekwd ,sc4taekw, sc4_200_4rb, sc4taekw, sc4_state, sc4taekw_mbus, ROT0, "Qps","Tae Kwon Dough (Qps) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4taekwe ,sc4taekw, sc4_200_4rb, sc4taekw, sc4_state, sc4taekw_mbus, ROT0, "Qps","Tae Kwon Dough (Qps) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4taekwf ,sc4taekw, sc4_200_4rb, sc4taekw, sc4_state, sc4taekw_mbus, ROT0, "Qps","Tae Kwon Dough (Qps) (Scorpion 4) (set 11)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -30693,8 +30695,8 @@ INPUT_PORTS_START( sc4taknt ) // this structure is generated
INPUT_PORTS_END
// PR1302 AWP TAKE NOTE PR1302 TAKE NOTE SOUNDS11
-GAMEL( 200?, sc4taknt ,0, sc4_4reel_alt, sc4taknt, sc4_state, sc4taknt, ROT0, "BFM","Take Note (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4taknta ,sc4taknt, sc4_4reel_alt, sc4taknt, sc4_state, sc4taknt, ROT0, "BFM","Take Note (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4taknt ,0, sc4_4reel_alt, sc4taknt, sc4_state, sc4taknt, ROT0, "BFM","Take Note (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4taknta ,sc4taknt, sc4_4reel_alt, sc4taknt, sc4_state, sc4taknt, ROT0, "BFM","Take Note (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4takcl)
{
@@ -30763,20 +30765,20 @@ INPUT_PORTS_START( sc4takcl ) // this structure is generated
INPUT_PORTS_END
// PR1323 CLUB TAKE NOTE PR1323 CNOT SOUNDS11
-GAMEL( 200?, sc4takcl ,0, sc4_5reel, sc4takcl, sc4_state, sc4takcl, ROT0, "BFM","Take Note Club (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4takcld ,sc4takcl, sc4_5reel, sc4takcl, sc4_state, sc4takcl, ROT0, "BFM","Take Note Club (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4takcli ,sc4takcl, sc4_5reel, sc4takcl, sc4_state, sc4takcl, ROT0, "BFM","Take Note Club (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4takclj ,sc4takcl, sc4_5reel, sc4takcl, sc4_state, sc4takcl, ROT0, "BFM","Take Note Club (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4takcl ,0, sc4_5reel, sc4takcl, sc4_state, sc4takcl, ROT0, "BFM","Take Note Club (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4takcld ,sc4takcl, sc4_5reel, sc4takcl, sc4_state, sc4takcl, ROT0, "BFM","Take Note Club (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4takcli ,sc4takcl, sc4_5reel, sc4takcl, sc4_state, sc4takcl, ROT0, "BFM","Take Note Club (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4takclj ,sc4takcl, sc4_5reel, sc4takcl, sc4_state, sc4takcl, ROT0, "BFM","Take Note Club (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR1323 CLUB TAKE NOTE CLUB TAKE NOTE CLUB PR1323 CNOT SOUNDS11
-GAMEL( 200?, sc4takclg ,sc4takcl, sc4_5reel, sc4takcl, sc4_state, sc4takcl_mbus, ROT0, "BFM","Take Note Club (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4takclh ,sc4takcl, sc4_5reel, sc4takcl, sc4_state, sc4takcl_mbus, ROT0, "BFM","Take Note Club (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4takclg ,sc4takcl, sc4_5reel, sc4takcl, sc4_state, sc4takcl_mbus, ROT0, "BFM","Take Note Club (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4takclh ,sc4takcl, sc4_5reel, sc4takcl, sc4_state, sc4takcl_mbus, ROT0, "BFM","Take Note Club (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR1323 CLUB TAKE NOTE 500 PR1323 CNOT SOUNDS11
-GAMEL( 200?, sc4takcla ,sc4takcl, sc4_5reel, sc4takcl, sc4_state, sc4takcl, ROT0, "BFM","Take Note Club 500 (Bellfruit) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4takcla ,sc4takcl, sc4_5reel, sc4takcl, sc4_state, sc4takcl, ROT0, "BFM","Take Note Club 500 (Bellfruit) (Scorpion 4)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR1323 CLUB TAKE NOTE FERRY PR1323 CNOT SOUNDS11
-GAMEL( 200?, sc4takclb ,sc4takcl, sc4_5reel, sc4takcl, sc4_state, sc4takcl, ROT0, "BFM","Take Note Club (Ferry) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4takclc ,sc4takcl, sc4_5reel, sc4takcl, sc4_state, sc4takcl, ROT0, "BFM","Take Note Club (Ferry) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4takcle ,sc4takcl, sc4_5reel, sc4takcl, sc4_state, sc4takcl, ROT0, "BFM","Take Note Club (Ferry) (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4takclf ,sc4takcl, sc4_5reel, sc4takcl, sc4_state, sc4takcl, ROT0, "BFM","Take Note Club (Ferry) (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4takclb ,sc4takcl, sc4_5reel, sc4takcl, sc4_state, sc4takcl, ROT0, "BFM","Take Note Club (Ferry) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4takclc ,sc4takcl, sc4_5reel, sc4takcl, sc4_state, sc4takcl, ROT0, "BFM","Take Note Club (Ferry) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4takcle ,sc4takcl, sc4_5reel, sc4takcl, sc4_state, sc4takcl, ROT0, "BFM","Take Note Club (Ferry) (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4takclf ,sc4takcl, sc4_5reel, sc4takcl, sc4_state, sc4takcl, ROT0, "BFM","Take Note Club (Ferry) (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4tetri)
{
@@ -30825,18 +30827,18 @@ INPUT_PORTS_END
// PR7077 TETRIS TETR SOUNDS
-GAMEL( 200?, sc4tetri ,0, sc4_4reel, sc4tetri, sc4_state, sc4tetri, ROT0, "Mazooma","Tetris (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tetria ,sc4tetri, sc4_4reel, sc4tetri, sc4_state, sc4tetri, ROT0, "Mazooma","Tetris (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tetrib ,sc4tetri, sc4_4reel, sc4tetri, sc4_state, sc4tetri, ROT0, "Mazooma","Tetris (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tetric ,sc4tetri, sc4_4reel, sc4tetri, sc4_state, sc4tetri, ROT0, "Mazooma","Tetris (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tetrid ,sc4tetri, sc4_4reel, sc4tetri, sc4_state, sc4tetri, ROT0, "Mazooma","Tetris (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tetrie ,sc4tetri, sc4_4reel, sc4tetri, sc4_state, sc4tetri, ROT0, "Mazooma","Tetris (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tetrif ,sc4tetri, sc4_4reel, sc4tetri, sc4_state, sc4tetri, ROT0, "Mazooma","Tetris (Mazooma) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tetrig ,sc4tetri, sc4_4reel, sc4tetri, sc4_state, sc4tetri, ROT0, "Mazooma","Tetris (Mazooma) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tetrih ,sc4tetri, sc4_4reel, sc4tetri, sc4_state, sc4tetri, ROT0, "Mazooma","Tetris (Mazooma) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tetrii ,sc4tetri, sc4_4reel, sc4tetri, sc4_state, sc4tetri, ROT0, "Mazooma","Tetris (Mazooma) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tetrij ,sc4tetri, sc4_4reel, sc4tetri, sc4_state, sc4tetri, ROT0, "Mazooma","Tetris (Mazooma) (Scorpion 4) (set 11)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tetrik ,sc4tetri, sc4_4reel, sc4tetri, sc4_state, sc4tetri, ROT0, "Mazooma","Tetris (Mazooma) (Scorpion 4) (set 12)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4tetri ,0, sc4_4reel, sc4tetri, sc4_state, sc4tetri, ROT0, "Mazooma","Tetris (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tetria ,sc4tetri, sc4_4reel, sc4tetri, sc4_state, sc4tetri, ROT0, "Mazooma","Tetris (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tetrib ,sc4tetri, sc4_4reel, sc4tetri, sc4_state, sc4tetri, ROT0, "Mazooma","Tetris (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tetric ,sc4tetri, sc4_4reel, sc4tetri, sc4_state, sc4tetri, ROT0, "Mazooma","Tetris (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tetrid ,sc4tetri, sc4_4reel, sc4tetri, sc4_state, sc4tetri, ROT0, "Mazooma","Tetris (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tetrie ,sc4tetri, sc4_4reel, sc4tetri, sc4_state, sc4tetri, ROT0, "Mazooma","Tetris (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tetrif ,sc4tetri, sc4_4reel, sc4tetri, sc4_state, sc4tetri, ROT0, "Mazooma","Tetris (Mazooma) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tetrig ,sc4tetri, sc4_4reel, sc4tetri, sc4_state, sc4tetri, ROT0, "Mazooma","Tetris (Mazooma) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tetrih ,sc4tetri, sc4_4reel, sc4tetri, sc4_state, sc4tetri, ROT0, "Mazooma","Tetris (Mazooma) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tetrii ,sc4tetri, sc4_4reel, sc4tetri, sc4_state, sc4tetri, ROT0, "Mazooma","Tetris (Mazooma) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tetrij ,sc4tetri, sc4_4reel, sc4tetri, sc4_state, sc4tetri, ROT0, "Mazooma","Tetris (Mazooma) (Scorpion 4) (set 11)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tetrik ,sc4tetri, sc4_4reel, sc4tetri, sc4_state, sc4tetri, ROT0, "Mazooma","Tetris (Mazooma) (Scorpion 4) (set 12)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4tbana)
@@ -30906,8 +30908,8 @@ INPUT_PORTS_START( sc4tbana ) // this structure is generated
INPUT_PORTS_END
// PR1110 TOP BANANA PR1110 TOP BANANA SOUNDS11
-GAMEL( 200?, sc4tbana ,0, sc4_200_5rb, sc4tbana, sc4_state, sc4tbana, ROT0, "BFM","Top Banana (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tbanaa ,sc4tbana, sc4_200_5rb, sc4tbana, sc4_state, sc4tbana, ROT0, "BFM","Top Banana (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4tbana ,0, sc4_200_5rb, sc4tbana, sc4_state, sc4tbana, ROT0, "BFM","Top Banana (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tbanaa ,sc4tbana, sc4_200_5rb, sc4tbana, sc4_state, sc4tbana, ROT0, "BFM","Top Banana (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// REEL 4 ERR 24 (what should be here?)
@@ -30960,14 +30962,14 @@ INPUT_PORTS_END
// REEL 4 ERR 24
// PR7062 TOP GEARS GEARS SOUNDS TOP GEARS
-GAMEL( 200?, sc4tgear ,0, sc4_4reel, sc4tgear, sc4_state, sc4tgear, ROT0, "Mazooma","Top Gears (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tgeara ,sc4tgear, sc4_4reel, sc4tgear, sc4_state, sc4tgear, ROT0, "Mazooma","Top Gears (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tgearb ,sc4tgear, sc4_4reel, sc4tgear, sc4_state, sc4tgear, ROT0, "Mazooma","Top Gears (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tgearc ,sc4tgear, sc4_4reel, sc4tgear, sc4_state, sc4tgear, ROT0, "Mazooma","Top Gears (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tgeard ,sc4tgear, sc4_4reel, sc4tgear, sc4_state, sc4tgear, ROT0, "Mazooma","Top Gears (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tgeare ,sc4tgear, sc4_4reel, sc4tgear, sc4_state, sc4tgear, ROT0, "Mazooma","Top Gears (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tgearf ,sc4tgear, sc4_4reel, sc4tgear, sc4_state, sc4tgear, ROT0, "Mazooma","Top Gears (Mazooma) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tgearg ,sc4tgear, sc4_4reel, sc4tgear, sc4_state, sc4tgear, ROT0, "Mazooma","Top Gears (Mazooma) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4tgear ,0, sc4_4reel, sc4tgear, sc4_state, sc4tgear, ROT0, "Mazooma","Top Gears (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tgeara ,sc4tgear, sc4_4reel, sc4tgear, sc4_state, sc4tgear, ROT0, "Mazooma","Top Gears (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tgearb ,sc4tgear, sc4_4reel, sc4tgear, sc4_state, sc4tgear, ROT0, "Mazooma","Top Gears (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tgearc ,sc4tgear, sc4_4reel, sc4tgear, sc4_state, sc4tgear, ROT0, "Mazooma","Top Gears (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tgeard ,sc4tgear, sc4_4reel, sc4tgear, sc4_state, sc4tgear, ROT0, "Mazooma","Top Gears (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tgeare ,sc4tgear, sc4_4reel, sc4tgear, sc4_state, sc4tgear, ROT0, "Mazooma","Top Gears (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tgearf ,sc4tgear, sc4_4reel, sc4tgear, sc4_state, sc4tgear, ROT0, "Mazooma","Top Gears (Mazooma) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tgearg ,sc4tgear, sc4_4reel, sc4tgear, sc4_state, sc4tgear, ROT0, "Mazooma","Top Gears (Mazooma) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -31021,7 +31023,7 @@ INPUT_PORTS_START( sc4tload ) // this structure is generated
INPUT_PORTS_END
// PR2112 TOP LOADER LOAD SOUNDS TOP LOADER
-GAMEL( 200?, sc4tload ,0, sc4_4reel_alt, sc4tload, sc4_state, sc4tload, ROT0, "Mazooma","Top Loader (Mazooma) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4tload ,0, sc4_4reel_alt, sc4tload, sc4_state, sc4tload, ROT0, "Mazooma","Top Loader (Mazooma) (Scorpion 4)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -31102,10 +31104,10 @@ INPUT_PORTS_START( sc4ttomb ) // this structure is generated
INPUT_PORTS_END
// PR1305 TREASURE TOMB PR1305 TRES TOMB SOUNDS11 / HIT SHOT
-GAMEL( 200?, sc4ttomb ,0, sc4_200_4rb, sc4ttomb, sc4_state, sc4ttomb, ROT0, "BFM","Treasure Tomb (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ttomba ,sc4ttomb, sc4_200_4rb, sc4ttomb, sc4_state, sc4ttomb, ROT0, "BFM","Treasure Tomb (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ttombb ,sc4ttomb, sc4_200_4rb, sc4ttomb, sc4_state, sc4ttomb, ROT0, "BFM","Treasure Tomb (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ttombc ,sc4ttomb, sc4_200_4rb, sc4ttomb, sc4_state, sc4ttomb, ROT0, "BFM","Treasure Tomb (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4ttomb ,0, sc4_200_4rb, sc4ttomb, sc4_state, sc4ttomb, ROT0, "BFM","Treasure Tomb (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ttomba ,sc4ttomb, sc4_200_4rb, sc4ttomb, sc4_state, sc4ttomb, ROT0, "BFM","Treasure Tomb (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ttombb ,sc4ttomb, sc4_200_4rb, sc4ttomb, sc4_state, sc4ttomb, ROT0, "BFM","Treasure Tomb (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ttombc ,sc4ttomb, sc4_200_4rb, sc4ttomb, sc4_state, sc4ttomb, ROT0, "BFM","Treasure Tomb (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -31155,8 +31157,8 @@ INPUT_PORTS_START( sc4tridn ) // this structure is generated
INPUT_PORTS_END
// PR2103 THE TRIDENT TRID SOUNDS THE TRIDENT
-GAMEL( 200?, sc4tridn ,0, sc4_5reel, sc4tridn, sc4_state, sc4tridn, ROT0, "Mazooma","The Trident (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tridna ,sc4tridn, sc4_5reel, sc4tridn, sc4_state, sc4tridn, ROT0, "Mazooma","The Trident (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4tridn ,0, sc4_5reel, sc4tridn, sc4_state, sc4tridn, ROT0, "Mazooma","The Trident (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tridna ,sc4tridn, sc4_5reel, sc4tridn, sc4_state, sc4tridn, ROT0, "Mazooma","The Trident (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -31237,17 +31239,17 @@ INPUT_PORTS_START( sc4vrgcl ) // this structure is generated
INPUT_PORTS_END
// PR1037 CLUB VERY RICH GEEZER PR1037 RICH SOUNDS11 VERY RICH GEEZER
-GAMEL( 200?, sc4vrgcl ,0, sc4_200_5rb, sc4vrgcl, sc4_state, sc4vrgcl, ROT0, "BFM","Very Rich Geezer Club (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4vrgcla ,sc4vrgcl, sc4_200_5rb, sc4vrgcl, sc4_state, sc4vrgcl, ROT0, "BFM","Very Rich Geezer Club (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4vrgclb ,sc4vrgcl, sc4_200_5rb, sc4vrgcl, sc4_state, sc4vrgcl, ROT0, "BFM","Very Rich Geezer Club (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4vrgclc ,sc4vrgcl, sc4_200_5rb, sc4vrgcl, sc4_state, sc4vrgcl, ROT0, "BFM","Very Rich Geezer Club (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4vrgcld ,sc4vrgcl, sc4_200_5rb, sc4vrgcl, sc4_state, sc4vrgcl, ROT0, "BFM","Very Rich Geezer Club (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4vrgcle ,sc4vrgcl, sc4_200_5rb, sc4vrgcl, sc4_state, sc4vrgcl, ROT0, "BFM","Very Rich Geezer Club (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4vrgclf ,sc4vrgcl, sc4_200_5rb, sc4vrgcl, sc4_state, sc4vrgcl, ROT0, "BFM","Very Rich Geezer Club (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4vrgclg ,sc4vrgcl, sc4_200_5rb, sc4vrgcl, sc4_state, sc4vrgcl, ROT0, "BFM","Very Rich Geezer Club (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4vrgcl ,0, sc4_200_5rb, sc4vrgcl, sc4_state, sc4vrgcl, ROT0, "BFM","Very Rich Geezer Club (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4vrgcla ,sc4vrgcl, sc4_200_5rb, sc4vrgcl, sc4_state, sc4vrgcl, ROT0, "BFM","Very Rich Geezer Club (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4vrgclb ,sc4vrgcl, sc4_200_5rb, sc4vrgcl, sc4_state, sc4vrgcl, ROT0, "BFM","Very Rich Geezer Club (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4vrgclc ,sc4vrgcl, sc4_200_5rb, sc4vrgcl, sc4_state, sc4vrgcl, ROT0, "BFM","Very Rich Geezer Club (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4vrgcld ,sc4vrgcl, sc4_200_5rb, sc4vrgcl, sc4_state, sc4vrgcl, ROT0, "BFM","Very Rich Geezer Club (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4vrgcle ,sc4vrgcl, sc4_200_5rb, sc4vrgcl, sc4_state, sc4vrgcl, ROT0, "BFM","Very Rich Geezer Club (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4vrgclf ,sc4vrgcl, sc4_200_5rb, sc4vrgcl, sc4_state, sc4vrgcl, ROT0, "BFM","Very Rich Geezer Club (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4vrgclg ,sc4vrgcl, sc4_200_5rb, sc4vrgcl, sc4_state, sc4vrgcl, ROT0, "BFM","Very Rich Geezer Club (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR1037 CLUB VERY RICH GEEZER VERY RICH GEEZER CLUB PR1037 RICH SOUNDS11 VERY RICH GEEZER
-GAMEL( 200?, sc4vrgclh ,sc4vrgcl, sc4_200_5rb, sc4vrgcl, sc4_state, sc4vrgcl_mbus, ROT0, "BFM","Very Rich Geezer Club (Bellfruit) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4vrgcli ,sc4vrgcl, sc4_200_5rb, sc4vrgcl, sc4_state, sc4vrgcl_mbus, ROT0, "BFM","Very Rich Geezer Club (Bellfruit) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4vrgclh ,sc4vrgcl, sc4_200_5rb, sc4vrgcl, sc4_state, sc4vrgcl_mbus, ROT0, "BFM","Very Rich Geezer Club (Bellfruit) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4vrgcli ,sc4vrgcl, sc4_200_5rb, sc4vrgcl, sc4_state, sc4vrgcl_mbus, ROT0, "BFM","Very Rich Geezer Club (Bellfruit) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4leg)
@@ -31320,16 +31322,16 @@ INPUT_PORTS_START( sc4leg ) // this structure is generated
INPUT_PORTS_END
// PR7120 WHO WANTS TO BE A LEGIONNAIRE PR7120 LEGIONNAIRE SOUNDS11
-GAMEL( 200?, sc4leg ,0, sc4_200_5rb, sc4leg, sc4_state, sc4leg, ROT0, "BFM","Who Wants To Be A Legionnaire (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4lega ,sc4leg, sc4_200_5rb, sc4leg, sc4_state, sc4leg, ROT0, "BFM","Who Wants To Be A Legionnaire (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4legb ,sc4leg, sc4_200_5rb, sc4leg, sc4_state, sc4leg, ROT0, "BFM","Who Wants To Be A Legionnaire (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4legc ,sc4leg, sc4_200_5rb, sc4leg, sc4_state, sc4leg, ROT0, "BFM","Who Wants To Be A Legionnaire (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4legd ,sc4leg, sc4_200_5rb, sc4leg, sc4_state, sc4leg, ROT0, "BFM","Who Wants To Be A Legionnaire (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4lege ,sc4leg, sc4_200_5rb, sc4leg, sc4_state, sc4leg, ROT0, "BFM","Who Wants To Be A Legionnaire (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4legf ,sc4leg, sc4_200_5rb, sc4leg, sc4_state, sc4leg, ROT0, "BFM","Who Wants To Be A Legionnaire (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4legg ,sc4leg, sc4_200_5rb, sc4leg, sc4_state, sc4leg, ROT0, "BFM","Who Wants To Be A Legionnaire (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4leg ,0, sc4_200_5rb, sc4leg, sc4_state, sc4leg, ROT0, "BFM","Who Wants To Be A Legionnaire (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4lega ,sc4leg, sc4_200_5rb, sc4leg, sc4_state, sc4leg, ROT0, "BFM","Who Wants To Be A Legionnaire (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4legb ,sc4leg, sc4_200_5rb, sc4leg, sc4_state, sc4leg, ROT0, "BFM","Who Wants To Be A Legionnaire (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4legc ,sc4leg, sc4_200_5rb, sc4leg, sc4_state, sc4leg, ROT0, "BFM","Who Wants To Be A Legionnaire (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4legd ,sc4leg, sc4_200_5rb, sc4leg, sc4_state, sc4leg, ROT0, "BFM","Who Wants To Be A Legionnaire (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4lege ,sc4leg, sc4_200_5rb, sc4leg, sc4_state, sc4leg, ROT0, "BFM","Who Wants To Be A Legionnaire (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4legf ,sc4leg, sc4_200_5rb, sc4leg, sc4_state, sc4leg, ROT0, "BFM","Who Wants To Be A Legionnaire (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4legg ,sc4leg, sc4_200_5rb, sc4leg, sc4_state, sc4leg, ROT0, "BFM","Who Wants To Be A Legionnaire (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
-GAMEL( 200?, sc4legh ,sc4leg, sc4_200_5rb, sc4leg, sc4_state, sc4leg, ROT0, "BFM","Who Wants To Be A Legionnaire (Bellfruit) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // doesn't do anything?
+GAMEL( 200?, sc4legh ,sc4leg, sc4_200_5rb, sc4leg, sc4_state, sc4leg, ROT0, "BFM","Who Wants To Be A Legionnaire (Bellfruit) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 ) // doesn't do anything?
DRIVER_INIT_MEMBER(sc4_state,sc4cleg)
@@ -31405,14 +31407,14 @@ INPUT_PORTS_START( sc4legcb ) // this structure is generated
INPUT_PORTS_END
// PR1038 CLUB WHO WANTS TO BE A LEGIONNAIRE PR1038 CLUB WWTBAL SOUNDS11
-GAMEL( 200?, sc4legcb ,0, sc4_200_std, sc4legcb, sc4_state, sc4cleg, ROT0, "BFM","Who Wants To Be A Legionnaire Club (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4legcba ,sc4legcb, sc4_200_std, sc4legcb, sc4_state, sc4cleg, ROT0, "BFM","Who Wants To Be A Legionnaire Club (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4legcbb ,sc4legcb, sc4_200_std, sc4legcb, sc4_state, sc4cleg, ROT0, "BFM","Who Wants To Be A Legionnaire Club (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4legcbc ,sc4legcb, sc4_200_std, sc4legcb, sc4_state, sc4cleg, ROT0, "BFM","Who Wants To Be A Legionnaire Club (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4legcb ,0, sc4_200_std, sc4legcb, sc4_state, sc4cleg, ROT0, "BFM","Who Wants To Be A Legionnaire Club (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4legcba ,sc4legcb, sc4_200_std, sc4legcb, sc4_state, sc4cleg, ROT0, "BFM","Who Wants To Be A Legionnaire Club (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4legcbb ,sc4legcb, sc4_200_std, sc4legcb, sc4_state, sc4cleg, ROT0, "BFM","Who Wants To Be A Legionnaire Club (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4legcbc ,sc4legcb, sc4_200_std, sc4legcb, sc4_state, sc4cleg, ROT0, "BFM","Who Wants To Be A Legionnaire Club (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
// Alarms through startup, doesn't start game
// PR1038 CLUB WHO WANTS TO BE A LEGIONNAIRE WWTB LEGIONNAIRE CLUB PR1038 CLUB WWTBAL SOUNDS11
-GAMEL( 200?, sc4legcbd ,sc4legcb, sc4_200_std, sc4legcb, sc4_state, sc4cleg_mbus, ROT0, "BFM","Who Wants To Be A Legionnaire Club (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4legcbe ,sc4legcb, sc4_200_std, sc4legcb, sc4_state, sc4cleg_mbus, ROT0, "BFM","Who Wants To Be A Legionnaire Club (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4legcbd ,sc4legcb, sc4_200_std, sc4legcb, sc4_state, sc4cleg_mbus, ROT0, "BFM","Who Wants To Be A Legionnaire Club (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4legcbe ,sc4legcb, sc4_200_std, sc4legcb, sc4_state, sc4cleg_mbus, ROT0, "BFM","Who Wants To Be A Legionnaire Club (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4wspin)
@@ -31462,11 +31464,11 @@ INPUT_PORTS_START( sc4wspin ) // this structure is generated
INPUT_PORTS_END
// QPS162 WIN SPINNER Arcade Version 011 WINSPINNERSND WIN SPINNER
-GAMEL( 200?, sc4wspin ,0, sc4_200_4rb, sc4wspin, sc4_state, sc4wspin, ROT0, "Qps","Win Spinner Arcade (011) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wspinc ,sc4wspin, sc4_200_4rb, sc4wspin, sc4_state, sc4wspin, ROT0, "Qps","Win Spinner Arcade (011) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4wspin ,0, sc4_200_4rb, sc4wspin, sc4_state, sc4wspin, ROT0, "Qps","Win Spinner Arcade (011) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4wspinc ,sc4wspin, sc4_200_4rb, sc4wspin, sc4_state, sc4wspin, ROT0, "Qps","Win Spinner Arcade (011) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// QPS162 WIN SPINNER SP Arcade Version 011 WINSPINNERSND WIN SPINNER
-GAMEL( 200?, sc4wspinb ,sc4wspin, sc4_200_4rb, sc4wspin, sc4_state, sc4wspin, ROT0, "Qps","Win Spinner SP Arcade (011) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wspind ,sc4wspin, sc4_200_4rb, sc4wspin, sc4_state, sc4wspin, ROT0, "Qps","Win Spinner SP Arcade (011) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4wspinb ,sc4wspin, sc4_200_4rb, sc4wspin, sc4_state, sc4wspin, ROT0, "Qps","Win Spinner SP Arcade (011) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4wspind ,sc4wspin, sc4_200_4rb, sc4wspin, sc4_state, sc4wspin, ROT0, "Qps","Win Spinner SP Arcade (011) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4wwys)
@@ -31542,8 +31544,8 @@ INPUT_PORTS_START( sc4wwys ) // this structure is generated
INPUT_PORTS_END
// PR1301 WIN WHEN YOUR SPINNING PR1301 WIN W Y S SOUNDS11
-GAMEL( 200?, sc4wwys ,0, sc4_200_5ra, sc4wwys, sc4_state, sc4wwys, ROT0, "BFM","Win When Your Spinning (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wwysa ,sc4wwys, sc4_200_5ra, sc4wwys, sc4_state, sc4wwys, ROT0, "BFM","Win When Your Spinning (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4wwys ,0, sc4_200_5ra, sc4wwys, sc4_state, sc4wwys, ROT0, "BFM","Win When Your Spinning (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4wwysa ,sc4wwys, sc4_200_5ra, sc4wwys, sc4_state, sc4wwys, ROT0, "BFM","Win When Your Spinning (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4winsptb)
@@ -31600,47 +31602,47 @@ INPUT_PORTS_START( sc4winspa ) // this structure is generated
INPUT_PORTS_END
// PR2526 WINNING SPIN TOP BOX WINNINGSPINSND WINNING SPIN
-GAMEL( 200?, sc4winsp ,0, sc4_3reel, sc4, sc4_state, sc4winsptb, ROT0, "Qps","Winning Spin Top Box (PR2526, WSPT) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4winsp ,0, sc4_3reel, sc4, sc4_state, sc4winsptb, ROT0, "Qps","Winning Spin Top Box (PR2526, WSPT) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2526 WINNING SPIN TOP BOX WINNINGSPINSND WINNING SPIN
-GAMEL( 200?, sc4winsp0 ,sc4winsp, sc4_3reel, sc4, sc4_state, sc4winsptb, ROT0, "Qps","Winning Spin Top Box (PR2526, WSPT) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // was in a Win Spinner set, but probably belongs here
+GAMEL( 200?, sc4winsp0 ,sc4winsp, sc4_3reel, sc4, sc4_state, sc4winsptb, ROT0, "Qps","Winning Spin Top Box (PR2526, WSPT) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // was in a Win Spinner set, but probably belongs here
// PR2546 WINNING SPIN Bingo Version011 WINNINGSPINSND WINNING SPIN
-GAMEL( 200?, sc4winspa ,sc4winsp, sc4_200_4r, sc4winspa, sc4_state, sc4winsp, ROT0, "Qps","Winning Spin (Bingo V011) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4winsph ,sc4winsp, sc4_200_4r, sc4winspa, sc4_state, sc4winsp, ROT0, "Qps","Winning Spin (Bingo V011) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4winspa ,sc4winsp, sc4_200_4r, sc4winspa, sc4_state, sc4winsp, ROT0, "Qps","Winning Spin (Bingo V011) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4winsph ,sc4winsp, sc4_200_4r, sc4winspa, sc4_state, sc4winsp, ROT0, "Qps","Winning Spin (Bingo V011) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2546 WINNING SPIN Bingo Version 012 WINNINGSPINSND WINNING SPIN
-GAMEL( 200?, sc4winspe ,sc4winsp, sc4_200_4r, sc4winspa, sc4_state, sc4winsp, ROT0, "Qps","Winning Spin (Bingo V012) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4winspl ,sc4winsp, sc4_200_4r, sc4winspa, sc4_state, sc4winsp, ROT0, "Qps","Winning Spin (Bingo V012) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4winspq ,sc4winsp, sc4_200_4r, sc4winspa, sc4_state, sc4winsp, ROT0, "Qps","Winning Spin (Bingo V012) (Qps) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4winspw ,sc4winsp, sc4_200_4r, sc4winspa, sc4_state, sc4winsp, ROT0, "Qps","Winning Spin (Bingo V012) (Qps) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4winspe ,sc4winsp, sc4_200_4r, sc4winspa, sc4_state, sc4winsp, ROT0, "Qps","Winning Spin (Bingo V012) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4winspl ,sc4winsp, sc4_200_4r, sc4winspa, sc4_state, sc4winsp, ROT0, "Qps","Winning Spin (Bingo V012) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4winspq ,sc4winsp, sc4_200_4r, sc4winspa, sc4_state, sc4winsp, ROT0, "Qps","Winning Spin (Bingo V012) (Qps) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4winspw ,sc4winsp, sc4_200_4r, sc4winspa, sc4_state, sc4winsp, ROT0, "Qps","Winning Spin (Bingo V012) (Qps) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2546 WINNING SPIN Arcade Version011 WINNINGSPINSND WINNING SPIN
-GAMEL( 200?, sc4winspd ,sc4winsp, sc4_200_4r, sc4winspa, sc4_state, sc4winsp, ROT0, "Qps","Winning Spin (Arcade V011) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4winspk ,sc4winsp, sc4_200_4r, sc4winspa, sc4_state, sc4winsp, ROT0, "Qps","Winning Spin (Arcade V011) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4winspd ,sc4winsp, sc4_200_4r, sc4winspa, sc4_state, sc4winsp, ROT0, "Qps","Winning Spin (Arcade V011) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4winspk ,sc4winsp, sc4_200_4r, sc4winspa, sc4_state, sc4winsp, ROT0, "Qps","Winning Spin (Arcade V011) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2546 WINNING SPIN Arcade Version 012 WINNINGSPINSND WINNING SPIN
-GAMEL( 200?, sc4winspt ,sc4winsp, sc4_200_4r, sc4winspa, sc4_state, sc4winsp, ROT0, "Qps","Winning Spin (Arcade V012) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4winspz ,sc4winsp, sc4_200_4r, sc4winspa, sc4_state, sc4winsp, ROT0, "Qps","Winning Spin (Arcade V012) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4winspt ,sc4winsp, sc4_200_4r, sc4winspa, sc4_state, sc4winsp, ROT0, "Qps","Winning Spin (Arcade V012) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4winspz ,sc4winsp, sc4_200_4r, sc4winspa, sc4_state, sc4winsp, ROT0, "Qps","Winning Spin (Arcade V012) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2546 WINNING SPIN Version 021 WINNINGSPINSND WINNING SPIN
-GAMEL( 200?, sc4winspb ,sc4winsp, sc4_200_4r, sc4winspa, sc4_state, sc4winsp, ROT0, "Qps","Winning Spin (V021) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4winspi ,sc4winsp, sc4_200_4r, sc4winspa, sc4_state, sc4winsp, ROT0, "Qps","Winning Spin (V021) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4winspb ,sc4winsp, sc4_200_4r, sc4winspa, sc4_state, sc4winsp, ROT0, "Qps","Winning Spin (V021) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4winspi ,sc4winsp, sc4_200_4r, sc4winspa, sc4_state, sc4winsp, ROT0, "Qps","Winning Spin (V021) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2546 WINNING SPIN Version 022 WINNINGSPINSND WINNING SPIN
-GAMEL( 200?, sc4winspf ,sc4winsp, sc4_200_4r, sc4winspa, sc4_state, sc4winsp, ROT0, "Qps","Winning Spin (V022) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4winspm ,sc4winsp, sc4_200_4r, sc4winspa, sc4_state, sc4winsp, ROT0, "Qps","Winning Spin (V022) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4winspr ,sc4winsp, sc4_200_4r, sc4winspa, sc4_state, sc4winsp, ROT0, "Qps","Winning Spin (V022) (Qps) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4winspx ,sc4winsp, sc4_200_4r, sc4winspa, sc4_state, sc4winsp, ROT0, "Qps","Winning Spin (V022) (Qps) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4winspf ,sc4winsp, sc4_200_4r, sc4winspa, sc4_state, sc4winsp, ROT0, "Qps","Winning Spin (V022) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4winspm ,sc4winsp, sc4_200_4r, sc4winspa, sc4_state, sc4winsp, ROT0, "Qps","Winning Spin (V022) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4winspr ,sc4winsp, sc4_200_4r, sc4winspa, sc4_state, sc4winsp, ROT0, "Qps","Winning Spin (V022) (Qps) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4winspx ,sc4winsp, sc4_200_4r, sc4winspa, sc4_state, sc4winsp, ROT0, "Qps","Winning Spin (V022) (Qps) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2546 WINNING SPIN Version 031 WINNINGSPINSND WINNING SPIN
-GAMEL( 200?, sc4winspc ,sc4winsp, sc4_200_4r, sc4winspa, sc4_state, sc4winsp, ROT0, "Qps","Winning Spin (V031) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4winspj ,sc4winsp, sc4_200_4r, sc4winspa, sc4_state, sc4winsp, ROT0, "Qps","Winning Spin (V031) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4winspc ,sc4winsp, sc4_200_4r, sc4winspa, sc4_state, sc4winsp, ROT0, "Qps","Winning Spin (V031) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4winspj ,sc4winsp, sc4_200_4r, sc4winspa, sc4_state, sc4winsp, ROT0, "Qps","Winning Spin (V031) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2546 WINNING SPIN Version 032 WINNINGSPINSND WINNING SPIN
-GAMEL( 200?, sc4winspg ,sc4winsp, sc4_200_4r, sc4winspa, sc4_state, sc4winsp, ROT0, "Qps","Winning Spin (V032) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4winspn ,sc4winsp, sc4_200_4r, sc4winspa, sc4_state, sc4winsp, ROT0, "Qps","Winning Spin (V032) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4winsps ,sc4winsp, sc4_200_4r, sc4winspa, sc4_state, sc4winsp, ROT0, "Qps","Winning Spin (V032) (Qps) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4winspy ,sc4winsp, sc4_200_4r, sc4winspa, sc4_state, sc4winsp, ROT0, "Qps","Winning Spin (V032) (Qps) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4winspg ,sc4winsp, sc4_200_4r, sc4winspa, sc4_state, sc4winsp, ROT0, "Qps","Winning Spin (V032) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4winspn ,sc4winsp, sc4_200_4r, sc4winspa, sc4_state, sc4winsp, ROT0, "Qps","Winning Spin (V032) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4winsps ,sc4winsp, sc4_200_4r, sc4winspa, sc4_state, sc4winsp, ROT0, "Qps","Winning Spin (V032) (Qps) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4winspy ,sc4winsp, sc4_200_4r, sc4winspa, sc4_state, sc4winsp, ROT0, "Qps","Winning Spin (V032) (Qps) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2546 WINNING SPIN Arcade Version 061 WINNINGSPINSND WINNING SPIN
// these can be booted
-GAMEL( 200?, sc4winspo ,sc4winsp, sc4_200_4r, sc4winspa, sc4_state, sc4winsp, ROT0, "Qps","Winning Spin (Arcade V061) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4winspu ,sc4winsp, sc4_200_4r, sc4winspa, sc4_state, sc4winsp, ROT0, "Qps","Winning Spin (Arcade V061) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4winspo ,sc4winsp, sc4_200_4r, sc4winspa, sc4_state, sc4winsp, ROT0, "Qps","Winning Spin (Arcade V061) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4winspu ,sc4winsp, sc4_200_4r, sc4winspa, sc4_state, sc4winsp, ROT0, "Qps","Winning Spin (Arcade V061) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2546 WINNING SPIN Arcade Version 062 WINNINGSPINSND WINNING SPIN
// these can be booted
-GAMEL( 200?, sc4winspp ,sc4winsp, sc4_200_4r, sc4winspa, sc4_state, sc4winsp, ROT0, "Qps","Winning Spin (Arcade V062) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4winspv ,sc4winsp, sc4_200_4r, sc4winspa, sc4_state, sc4winsp, ROT0, "Qps","Winning Spin (Arcade V062) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4winspp ,sc4winsp, sc4_200_4r, sc4winspa, sc4_state, sc4winsp, ROT0, "Qps","Winning Spin (Arcade V062) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4winspv ,sc4winsp, sc4_200_4r, sc4winspa, sc4_state, sc4winsp, ROT0, "Qps","Winning Spin (Arcade V062) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4wondw)
@@ -31708,8 +31710,8 @@ INPUT_PORTS_START( sc4wondw ) // this structure is generated
INPUT_PORTS_END
// PR1318 WONDER WHEEL PR1314 WONDER WHEEL SOUNDS11
-GAMEL( 200?, sc4wondw ,0, sc4_200_5ra, sc4wondw, sc4_state, sc4wondw, ROT0, "BFM","Wonder Wheel (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wondwa ,sc4wondw, sc4_200_5ra, sc4wondw, sc4_state, sc4wondw, ROT0, "BFM","Wonder Wheel (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4wondw ,0, sc4_200_5ra, sc4wondw, sc4_state, sc4wondw, ROT0, "BFM","Wonder Wheel (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4wondwa ,sc4wondw, sc4_200_5ra, sc4wondw, sc4_state, sc4wondw, ROT0, "BFM","Wonder Wheel (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4xmark)
{
@@ -31788,8 +31790,8 @@ INPUT_PORTS_START( sc4xmark ) // this structure is generated
INPUT_PORTS_END
// PR1116 X MARKS THE SPOT PR1116 X MARKS THE SPOT SOUNDS11
-GAMEL( 200?, sc4xmark ,0, sc4_200_4rb, sc4xmark, sc4_state, sc4xmark, ROT0, "BFM","X Marks The Spot (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4xmarka ,sc4xmark, sc4_200_4rb, sc4xmark, sc4_state, sc4xmark, ROT0, "BFM","X Marks The Spot (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4xmark ,0, sc4_200_4rb, sc4xmark, sc4_state, sc4xmark, ROT0, "BFM","X Marks The Spot (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4xmarka ,sc4xmark, sc4_200_4rb, sc4xmark, sc4_state, sc4xmark, ROT0, "BFM","X Marks The Spot (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -31853,14 +31855,14 @@ INPUT_PORTS_START( sc4blokq ) // this structure is generated
INPUT_PORTS_END
// PR2025 BLOCK BUSTER BUSTERSND BLOCK BUSTER
-GAMEL( 200?, sc4blokq ,0, sc4_200_4ra, sc4blokq, sc4_state, sc4blokq, ROT0, "Qps","Blockbuster (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4blokqa ,sc4blokq, sc4_200_4ra, sc4blokq, sc4_state, sc4blokq, ROT0, "Qps","Blockbuster (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4blokqb ,sc4blokq, sc4_200_4ra, sc4blokq, sc4_state, sc4blokq, ROT0, "Qps","Blockbuster (Qps) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4blokqc ,sc4blokq, sc4_200_4ra, sc4blokq, sc4_state, sc4blokq, ROT0, "Qps","Blockbuster (Qps) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4blokqd ,sc4blokq, sc4_200_4ra, sc4blokq, sc4_state, sc4blokq, ROT0, "Qps","Blockbuster (Qps) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4blokqe ,sc4blokq, sc4_200_4ra, sc4blokq, sc4_state, sc4blokq, ROT0, "Qps","Blockbuster (Qps) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4blokq ,0, sc4_200_4ra, sc4blokq, sc4_state, sc4blokq, ROT0, "Qps","Blockbuster (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4blokqa ,sc4blokq, sc4_200_4ra, sc4blokq, sc4_state, sc4blokq, ROT0, "Qps","Blockbuster (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4blokqb ,sc4blokq, sc4_200_4ra, sc4blokq, sc4_state, sc4blokq, ROT0, "Qps","Blockbuster (Qps) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4blokqc ,sc4blokq, sc4_200_4ra, sc4blokq, sc4_state, sc4blokq, ROT0, "Qps","Blockbuster (Qps) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4blokqd ,sc4blokq, sc4_200_4ra, sc4blokq, sc4_state, sc4blokq, ROT0, "Qps","Blockbuster (Qps) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4blokqe ,sc4blokq, sc4_200_4ra, sc4blokq, sc4_state, sc4blokq, ROT0, "Qps","Blockbuster (Qps) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2025 BLOCK BUSTER BUSTERSND BLOCK BUSTER (same as sc4blokq ?)
-GAMEL( 200?, sc4bbust ,sc4blokq, sc4_200_4ra, sc4blokq, sc4_state, sc4blokq, ROT0, "Mazooma","Blockbuster (Mazooma) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4bbust ,sc4blokq, sc4_200_4ra, sc4blokq, sc4_state, sc4blokq, ROT0, "Mazooma","Blockbuster (Mazooma) (Scorpion 4)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -31920,8 +31922,8 @@ INPUT_PORTS_START( sc4onup ) // this structure is generated
INPUT_PORTS_END
// PR2076 ON THE UP HYPE SOUNDS ON THE UP
-GAMEL( 200?, sc4onup ,0, sc4_200_5r, sc4onup, sc4_state, sc4onup, ROT0, "BFM","On The Up (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4onupa ,sc4onup, sc4_200_5r, sc4onup, sc4_state, sc4onup, ROT0, "BFM","On The Up (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4onup ,0, sc4_200_5r, sc4onup, sc4_state, sc4onup, ROT0, "BFM","On The Up (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4onupa ,sc4onup, sc4_200_5r, sc4onup, sc4_state, sc4onup, ROT0, "BFM","On The Up (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4hyper)
@@ -31979,8 +31981,8 @@ INPUT_PORTS_START( sc4hyper ) // this structure is generated
INPUT_PORTS_END
// PR2053 HYPERACTIVEL HYPE SOUNDS HYPERACTIVE
-GAMEL( 200?, sc4hyper ,0, sc4_5reel, sc4hyper, sc4_state, sc4hyper, ROT0, "Mazooma","Hyperactive (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hypera ,sc4hyper, sc4_5reel, sc4hyper, sc4_state, sc4hyper, ROT0, "Mazooma","Hyperactive (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4hyper ,0, sc4_5reel, sc4hyper, sc4_state, sc4hyper, ROT0, "Mazooma","Hyperactive (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hypera ,sc4hyper, sc4_5reel, sc4hyper, sc4_state, sc4hyper, ROT0, "Mazooma","Hyperactive (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4pglcl)
@@ -32035,15 +32037,15 @@ INPUT_PORTS_START( sc4pglcl ) // this structure is generated
INPUT_PORTS_END
// PR1623 PHARAOHS GOLD PHARAOHS GOLD CLUB PR1623 CLASS PHAR GOLD SOUNDS11
-GAMEL( 200?, sc4pglcl ,0, sc4_5reel, sc4pglcl, sc4_state, sc4pglcl, ROT0, "BFM","Pharaoh's Gold Club (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // PAY UNIT ERR 17
-GAMEL( 200?, sc4pglcla ,sc4pglcl, sc4_5reel, sc4pglcl, sc4_state, sc4pglcl, ROT0, "BFM","Pharaoh's Gold Club (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pglclb ,sc4pglcl, sc4_5reel, sc4pglcl, sc4_state, sc4pglcl, ROT0, "BFM","Pharaoh's Gold Club (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pglclc ,sc4pglcl, sc4_5reel, sc4pglcl, sc4_state, sc4pglcl, ROT0, "BFM","Pharaoh's Gold Club (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pglcld ,sc4pglcl, sc4_5reel, sc4pglcl, sc4_state, sc4pglcl, ROT0, "BFM","Pharaoh's Gold Club (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pglcle ,sc4pglcl, sc4_5reel, sc4pglcl, sc4_state, sc4pglcl, ROT0, "BFM","Pharaoh's Gold Club (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pglclf ,sc4pglcl, sc4_5reel, sc4pglcl, sc4_state, sc4pglcl, ROT0, "BFM","Pharaoh's Gold Club (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pglclg ,sc4pglcl, sc4_5reel, sc4pglcl, sc4_state, sc4pglcl, ROT0, "BFM","Pharaoh's Gold Club (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pglclh ,sc4pglcl, sc4_5reel, sc4pglcl, sc4_state, sc4pglcl, ROT0, "BFM","Pharaoh's Gold Club (Bellfruit) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4pglcl ,0, sc4_5reel, sc4pglcl, sc4_state, sc4pglcl, ROT0, "BFM","Pharaoh's Gold Club (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // PAY UNIT ERR 17
+GAMEL( 200?, sc4pglcla ,sc4pglcl, sc4_5reel, sc4pglcl, sc4_state, sc4pglcl, ROT0, "BFM","Pharaoh's Gold Club (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pglclb ,sc4pglcl, sc4_5reel, sc4pglcl, sc4_state, sc4pglcl, ROT0, "BFM","Pharaoh's Gold Club (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pglclc ,sc4pglcl, sc4_5reel, sc4pglcl, sc4_state, sc4pglcl, ROT0, "BFM","Pharaoh's Gold Club (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pglcld ,sc4pglcl, sc4_5reel, sc4pglcl, sc4_state, sc4pglcl, ROT0, "BFM","Pharaoh's Gold Club (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pglcle ,sc4pglcl, sc4_5reel, sc4pglcl, sc4_state, sc4pglcl, ROT0, "BFM","Pharaoh's Gold Club (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pglclf ,sc4pglcl, sc4_5reel, sc4pglcl, sc4_state, sc4pglcl, ROT0, "BFM","Pharaoh's Gold Club (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pglclg ,sc4pglcl, sc4_5reel, sc4pglcl, sc4_state, sc4pglcl, ROT0, "BFM","Pharaoh's Gold Club (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pglclh ,sc4pglcl, sc4_5reel, sc4pglcl, sc4_state, sc4pglcl, ROT0, "BFM","Pharaoh's Gold Club (Bellfruit) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4po8)
{
@@ -32102,26 +32104,26 @@ INPUT_PORTS_START( sc4po8 ) // this structure is generated
INPUT_PORTS_END
// PR2530 PIECES OF EIGHT V1.0 PIECESOFEIGHTSND PIECES OF EIGHT
-GAMEL( 200?, sc4po8 ,0, sc4_4reel, sc4po8, sc4_state, sc4po8, ROT0, "Qps","Pieces Of Eight (V1.0) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4po8e ,sc4po8, sc4_4reel, sc4po8, sc4_state, sc4po8, ROT0, "Qps","Pieces Of Eight (V1.0) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4po8f ,sc4po8, sc4_4reel, sc4po8, sc4_state, sc4po8, ROT0, "Qps","Pieces Of Eight (V1.0) (Qps) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4po8 ,0, sc4_4reel, sc4po8, sc4_state, sc4po8, ROT0, "Qps","Pieces Of Eight (V1.0) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4po8e ,sc4po8, sc4_4reel, sc4po8, sc4_state, sc4po8, ROT0, "Qps","Pieces Of Eight (V1.0) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4po8f ,sc4po8, sc4_4reel, sc4po8, sc4_state, sc4po8, ROT0, "Qps","Pieces Of Eight (V1.0) (Qps) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2530 PIECES OF EIGHT V1.1 PIECESOFEIGHTSND PIECES OF EIGHT
-GAMEL( 200?, sc4po8a ,sc4po8, sc4_4reel, sc4po8, sc4_state, sc4po8, ROT0, "Qps","Pieces Of Eight (V1.1) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4po8b ,sc4po8, sc4_4reel, sc4po8, sc4_state, sc4po8, ROT0, "Qps","Pieces Of Eight (V1.1) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4po8g ,sc4po8, sc4_4reel, sc4po8, sc4_state, sc4po8, ROT0, "Qps","Pieces Of Eight (V1.1) (Qps) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4po8h ,sc4po8, sc4_4reel, sc4po8, sc4_state, sc4po8, ROT0, "Qps","Pieces Of Eight (V1.1) (Qps) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4po8a ,sc4po8, sc4_4reel, sc4po8, sc4_state, sc4po8, ROT0, "Qps","Pieces Of Eight (V1.1) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4po8b ,sc4po8, sc4_4reel, sc4po8, sc4_state, sc4po8, ROT0, "Qps","Pieces Of Eight (V1.1) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4po8g ,sc4po8, sc4_4reel, sc4po8, sc4_state, sc4po8, ROT0, "Qps","Pieces Of Eight (V1.1) (Qps) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4po8h ,sc4po8, sc4_4reel, sc4po8, sc4_state, sc4po8, ROT0, "Qps","Pieces Of Eight (V1.1) (Qps) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2530 PIECES OF EIGHT 011 PIECESOFEIGHTSND PIECES OF EIGHT
-GAMEL( 200?, sc4po8c ,sc4po8, sc4_4reel, sc4po8, sc4_state, sc4po8_mbus, ROT0, "Qps","Pieces Of Eight (011) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4po8m ,sc4po8, sc4_4reel, sc4po8, sc4_state, sc4po8_mbus, ROT0, "QPS","Pieces Of Eight (011) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4po8c ,sc4po8, sc4_4reel, sc4po8, sc4_state, sc4po8_mbus, ROT0, "Qps","Pieces Of Eight (011) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4po8m ,sc4po8, sc4_4reel, sc4po8, sc4_state, sc4po8_mbus, ROT0, "QPS","Pieces Of Eight (011) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2530 PIECES OF EIGHT 012 PIECESOFEIGHTSND PIECES OF EIGHT
-GAMEL( 200?, sc4po8i ,sc4po8, sc4_4reel, sc4po8, sc4_state, sc4po8, ROT0, "Qps","Pieces Of Eight (012) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4po8k ,sc4po8, sc4_4reel, sc4po8, sc4_state, sc4po8, ROT0, "Qps","Pieces Of Eight (012) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4po8i ,sc4po8, sc4_4reel, sc4po8, sc4_state, sc4po8, ROT0, "Qps","Pieces Of Eight (012) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4po8k ,sc4po8, sc4_4reel, sc4po8, sc4_state, sc4po8, ROT0, "Qps","Pieces Of Eight (012) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2530 PIECES OF EIGHT 041 PIECESOFEIGHTSND PIECES OF EIGHT
-GAMEL( 200?, sc4po8d ,sc4po8, sc4_4reel, sc4po8, sc4_state, sc4po8_mbus, ROT0, "Qps","Pieces Of Eight (041) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4po8n ,sc4po8, sc4_4reel, sc4po8, sc4_state, sc4po8_mbus, ROT0, "QPS","Pieces Of Eight (041) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4po8d ,sc4po8, sc4_4reel, sc4po8, sc4_state, sc4po8_mbus, ROT0, "Qps","Pieces Of Eight (041) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4po8n ,sc4po8, sc4_4reel, sc4po8, sc4_state, sc4po8_mbus, ROT0, "QPS","Pieces Of Eight (041) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2530 PIECES OF EIGHT 042 PIECESOFEIGHTSND PIECES OF EIGHT
-GAMEL( 200?, sc4po8j ,sc4po8, sc4_4reel, sc4po8, sc4_state, sc4po8, ROT0, "Qps","Pieces Of Eight (042) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4po8l ,sc4po8, sc4_4reel, sc4po8, sc4_state, sc4po8, ROT0, "Qps","Pieces Of Eight (042) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4po8j ,sc4po8, sc4_4reel, sc4po8, sc4_state, sc4po8, ROT0, "Qps","Pieces Of Eight (042) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4po8l ,sc4po8, sc4_4reel, sc4po8, sc4_state, sc4po8, ROT0, "Qps","Pieces Of Eight (042) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -32197,16 +32199,16 @@ INPUT_PORTS_START( sc4adjb ) // this structure is generated
INPUT_PORTS_END
// PR3039 AWP ANT N DECS JIGGY BANK S4 PR3009 JIGGY BANK SOUNDS11 JIGGY BANK S.SITE
-GAMEL( 200?, sc4adjb ,0, sc4_5reel_alt, sc4adjb, sc4_state, sc4adjb, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4adjba ,sc4adjb, sc4_5reel_alt, sc4adjb, sc4_state, sc4adjb, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 4) (Set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4adjbb ,sc4adjb, sc4_5reel_alt, sc4adjb, sc4_state, sc4adjb, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 4) (Set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4adjbc ,sc4adjb, sc4_5reel_alt, sc4adjb, sc4_state, sc4adjb, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 4) (Set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4adjbd ,sc4adjb, sc4_5reel_alt, sc4adjb, sc4_state, sc4adjb, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 4) (Set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4adjbe ,sc4adjb, sc4_5reel_alt, sc4adjb, sc4_state, sc4adjb, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 4) (Set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4adjbf ,sc4adjb, sc4_5reel_alt, sc4adjb, sc4_state, sc4adjb, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 4) (Set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4adjbg ,sc4adjb, sc4_5reel_alt, sc4adjb, sc4_state, sc4adjb, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 4) (Set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4adjbh ,sc4adjb, sc4_5reel_alt, sc4adjb, sc4_state, sc4adjb, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 4) (Set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4adjbi ,sc4adjb, sc4_5reel_alt, sc4adjb, sc4_state, sc4adjb, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 4) (Set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4adjb ,0, sc4_5reel_alt, sc4adjb, sc4_state, sc4adjb, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4adjba ,sc4adjb, sc4_5reel_alt, sc4adjb, sc4_state, sc4adjb, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 4) (Set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4adjbb ,sc4adjb, sc4_5reel_alt, sc4adjb, sc4_state, sc4adjb, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 4) (Set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4adjbc ,sc4adjb, sc4_5reel_alt, sc4adjb, sc4_state, sc4adjb, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 4) (Set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4adjbd ,sc4adjb, sc4_5reel_alt, sc4adjb, sc4_state, sc4adjb, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 4) (Set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4adjbe ,sc4adjb, sc4_5reel_alt, sc4adjb, sc4_state, sc4adjb, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 4) (Set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4adjbf ,sc4adjb, sc4_5reel_alt, sc4adjb, sc4_state, sc4adjb, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 4) (Set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4adjbg ,sc4adjb, sc4_5reel_alt, sc4adjb, sc4_state, sc4adjb, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 4) (Set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4adjbh ,sc4adjb, sc4_5reel_alt, sc4adjb, sc4_state, sc4adjb, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 4) (Set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4adjbi ,sc4adjb, sc4_5reel_alt, sc4adjb, sc4_state, sc4adjb, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 4) (Set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4adwta)
@@ -32279,8 +32281,8 @@ INPUT_PORTS_START( sc4adwta ) // this structure is generated
INPUT_PORTS_END
// PR1940 AWP ANT N DECS WTAD S4 PR1940 ADSNT SHOWTIME SOUNDS11 ANTNDECSWTAD S.SITE
-GAMEL( 200?, sc4adwta ,0, sc4_5reel, sc4adwta, sc4_state, sc4adwta, ROT0, "BFM","Ant & Dec's Saturday Night Takeaway Win The Ads (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4adwtaa ,sc4adwta, sc4_5reel, sc4adwta, sc4_state, sc4adwta, ROT0, "BFM","Ant & Dec's Saturday Night Takeaway Win The Ads (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4adwta ,0, sc4_5reel, sc4adwta, sc4_state, sc4adwta, ROT0, "BFM","Ant & Dec's Saturday Night Takeaway Win The Ads (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4adwtaa ,sc4adwta, sc4_5reel, sc4adwta, sc4_state, sc4adwta, ROT0, "BFM","Ant & Dec's Saturday Night Takeaway Win The Ads (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4a40)
@@ -32336,10 +32338,10 @@ INPUT_PORTS_START( sc4a40 ) // this structure is generated
INPUT_PORTS_END
// PR2200 AROUND THE BOARD AROU SOUNDS AROUND THE BOARD
-GAMEL( 200?, sc4a40 ,0, sc4_5reel, sc4a40, sc4_state, sc4a40, ROT0, "Mazooma","Around The Board In 40 Days (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4a40a ,sc4a40, sc4_5reel, sc4a40, sc4_state, sc4a40, ROT0, "Mazooma","Around The Board In 40 Days (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4a40b ,sc4a40, sc4_5reel, sc4a40, sc4_state, sc4a40, ROT0, "Mazooma","Around The Board In 40 Days (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4a40c ,sc4a40, sc4_5reel, sc4a40, sc4_state, sc4a40, ROT0, "Mazooma","Around The Board In 40 Days (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4a40 ,0, sc4_5reel, sc4a40, sc4_state, sc4a40, ROT0, "Mazooma","Around The Board In 40 Days (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4a40a ,sc4a40, sc4_5reel, sc4a40, sc4_state, sc4a40, ROT0, "Mazooma","Around The Board In 40 Days (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4a40b ,sc4a40, sc4_5reel, sc4a40, sc4_state, sc4a40, ROT0, "Mazooma","Around The Board In 40 Days (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4a40c ,sc4a40, sc4_5reel, sc4a40, sc4_state, sc4a40, ROT0, "Mazooma","Around The Board In 40 Days (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4a40cl)
{
@@ -32404,10 +32406,10 @@ INPUT_PORTS_START( sc4a40cl ) // this structure is generated
INPUT_PORTS_END
// PR2154 CLUB AROUND BOAR CLB AROUND BOARD CLUB AROU SOUNDS
-GAMEL( 200?, sc4a40cl ,0, sc4_5reel, sc4a40cl, sc4_state, sc4a40cl, ROT0, "Mazooma","Around The Board In 40 Days Club (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4a40cla ,sc4a40cl, sc4_5reel, sc4a40cl, sc4_state, sc4a40cl, ROT0, "Mazooma","Around The Board In 40 Days Club (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4a40clb ,sc4a40cl, sc4_5reel, sc4a40cl, sc4_state, sc4a40cl, ROT0, "Mazooma","Around The Board In 40 Days Club (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4a40clc ,sc4a40cl, sc4_5reel, sc4a40cl, sc4_state, sc4a40cl, ROT0, "Mazooma","Around The Board In 40 Days Club (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4a40cl ,0, sc4_5reel, sc4a40cl, sc4_state, sc4a40cl, ROT0, "Mazooma","Around The Board In 40 Days Club (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4a40cla ,sc4a40cl, sc4_5reel, sc4a40cl, sc4_state, sc4a40cl, ROT0, "Mazooma","Around The Board In 40 Days Club (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4a40clb ,sc4a40cl, sc4_5reel, sc4a40cl, sc4_state, sc4a40cl, ROT0, "Mazooma","Around The Board In 40 Days Club (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4a40clc ,sc4a40cl, sc4_5reel, sc4a40cl, sc4_state, sc4a40cl, ROT0, "Mazooma","Around The Board In 40 Days Club (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4bantm)
@@ -32483,10 +32485,10 @@ INPUT_PORTS_START( sc4bantm ) // this structure is generated
INPUT_PORTS_END
// PR2301 BANTAM OF THE OPERA BANTAM SOUNDS BANTAMOFTHEOPERA
-GAMEL( 200?, sc4bantm ,0, sc4_200_4ra, sc4bantm, sc4_state, sc4bantm, ROT0, "Mazooma","Bantam Of The Opera (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bantma ,sc4bantm, sc4_200_4ra, sc4bantm, sc4_state, sc4bantm, ROT0, "Mazooma","Bantam Of The Opera (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bantmb ,sc4bantm, sc4_200_4ra, sc4bantm, sc4_state, sc4bantm, ROT0, "Mazooma","Bantam Of The Opera (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bantmc ,sc4bantm, sc4_200_4ra, sc4bantm, sc4_state, sc4bantm, ROT0, "Mazooma","Bantam Of The Opera (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4bantm ,0, sc4_200_4ra, sc4bantm, sc4_state, sc4bantm, ROT0, "Mazooma","Bantam Of The Opera (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bantma ,sc4bantm, sc4_200_4ra, sc4bantm, sc4_state, sc4bantm, ROT0, "Mazooma","Bantam Of The Opera (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bantmb ,sc4bantm, sc4_200_4ra, sc4bantm, sc4_state, sc4bantm, ROT0, "Mazooma","Bantam Of The Opera (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bantmc ,sc4bantm, sc4_200_4ra, sc4bantm, sc4_state, sc4bantm, ROT0, "Mazooma","Bantam Of The Opera (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -32608,14 +32610,14 @@ INPUT_PORTS_START( sc4bar7b ) // this structure is generated
INPUT_PORTS_END
// PR1433 BAR7S PR1433 BAR SEVENS SOUNDS11
-GAMEL( 200?, sc4bar7 ,0, sc4_3reel, sc4bar7, sc4_state, sc4bar7, ROT0, "BFM","Bar 7's (PR1433) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bar7a ,sc4bar7, sc4_3reel, sc4bar7, sc4_state, sc4bar7, ROT0, "BFM","Bar 7's (PR1433) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4bar7 ,0, sc4_3reel, sc4bar7, sc4_state, sc4bar7, ROT0, "BFM","Bar 7's (PR1433) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bar7a ,sc4bar7, sc4_3reel, sc4bar7, sc4_state, sc4bar7, ROT0, "BFM","Bar 7's (PR1433) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// INIT COMMS (optional top box for above maybe?)
// PR1438 BAR7S PR1436 TRIPLE CASINO SOUNDS11
-GAMEL( 200?, sc4bar7b ,sc4bar7, sc4_3reel, sc4bar7b, sc4_state, sc4, ROT0, "BFM","Bar 7's (PR1438) (Bellfruit) (Scorpion 4) (Top Box?, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bar7c ,sc4bar7, sc4_3reel, sc4bar7b, sc4_state, sc4, ROT0, "BFM","Bar 7's (PR1438) (Bellfruit) (Scorpion 4) (Top Box?, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bar7d ,sc4bar7, sc4_3reel, sc4bar7b, sc4_state, sc4, ROT0, "BFM","Bar 7's (PR1438) (Bellfruit) (Scorpion 4) (Top Box?, set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bar7e ,sc4bar7, sc4_3reel, sc4bar7b, sc4_state, sc4, ROT0, "BFM","Bar 7's (PR1438) (Bellfruit) (Scorpion 4) (Top Box?, set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4bar7b ,sc4bar7, sc4_3reel, sc4bar7b, sc4_state, sc4, ROT0, "BFM","Bar 7's (PR1438) (Bellfruit) (Scorpion 4) (Top Box?, set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bar7c ,sc4bar7, sc4_3reel, sc4bar7b, sc4_state, sc4, ROT0, "BFM","Bar 7's (PR1438) (Bellfruit) (Scorpion 4) (Top Box?, set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bar7d ,sc4bar7, sc4_3reel, sc4bar7b, sc4_state, sc4, ROT0, "BFM","Bar 7's (PR1438) (Bellfruit) (Scorpion 4) (Top Box?, set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bar7e ,sc4bar7, sc4_3reel, sc4bar7b, sc4_state, sc4, ROT0, "BFM","Bar 7's (PR1438) (Bellfruit) (Scorpion 4) (Top Box?, set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4batl)
@@ -32686,8 +32688,8 @@ INPUT_PORTS_START( sc4batl ) // this structure is generated
INPUT_PORTS_END
// PR1724 AWP BATTLESHIPS AND CRUISERS S4 PR1704 B AND C SOUNDS11 BATTLESHIPSCRUIS S.SITE
-GAMEL( 200?, sc4batl ,0, sc4, sc4batl, sc4_state, sc4batl, ROT0, "BFM","Battleships & Cruisers (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4batla ,sc4batl, sc4, sc4batl, sc4_state, sc4batl, ROT0, "BFM","Battleships & Cruisers (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4batl ,0, sc4, sc4batl, sc4_state, sc4batl, ROT0, "BFM","Battleships & Cruisers (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4batla ,sc4batl, sc4, sc4batl, sc4_state, sc4batl, ROT0, "BFM","Battleships & Cruisers (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -32760,10 +32762,10 @@ INPUT_PORTS_START( sc4bull ) // this structure is generated
INPUT_PORTS_END
// PR1722 AWP BULLSEYE SCORP4 PR1702 BULLSEYE SOUNDS11 BULLSEYE S.SITE
-GAMEL( 200?, sc4bull ,0, sc4_200_4ra, sc4bull, sc4_state, sc4bull, ROT0, "BFM","Bullseye (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bulla ,sc4bull, sc4_200_4ra, sc4bull, sc4_state, sc4bull, ROT0, "BFM","Bullseye (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bullb ,sc4bull, sc4_200_4ra, sc4bull, sc4_state, sc4bull, ROT0, "BFM","Bullseye (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bullc ,sc4bull, sc4_200_4ra, sc4bull, sc4_state, sc4bull, ROT0, "BFM","Bullseye (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4bull ,0, sc4_200_4ra, sc4bull, sc4_state, sc4bull, ROT0, "BFM","Bullseye (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bulla ,sc4bull, sc4_200_4ra, sc4bull, sc4_state, sc4bull, ROT0, "BFM","Bullseye (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bullb ,sc4bull, sc4_200_4ra, sc4bull, sc4_state, sc4bull, ROT0, "BFM","Bullseye (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bullc ,sc4bull, sc4_200_4ra, sc4bull, sc4_state, sc4bull, ROT0, "BFM","Bullseye (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4bullcs)
@@ -32834,10 +32836,10 @@ INPUT_PORTS_START( sc4bulcs ) // this structure is generated
INPUT_PORTS_END
// PR1740 AWP BULLSEYE CLASSIC SCORP4 PR1702 BULLSEYE SOUNDS11 BULLSEYE CLASSIC S.SITE
-GAMEL( 200?, sc4bulcs ,0, sc4_200_4ra, sc4bulcs, sc4_state, sc4bullcs, ROT0, "BFM","Bullseye Classic (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bulcsa ,sc4bulcs, sc4_200_4ra, sc4bulcs, sc4_state, sc4bullcs, ROT0, "BFM","Bullseye Classic (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bulcsb ,sc4bulcs, sc4_200_4ra, sc4bulcs, sc4_state, sc4bullcs, ROT0, "BFM","Bullseye Classic (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bulcsc ,sc4bulcs, sc4_200_4ra, sc4bulcs, sc4_state, sc4bullcs, ROT0, "BFM","Bullseye Classic (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4bulcs ,0, sc4_200_4ra, sc4bulcs, sc4_state, sc4bullcs, ROT0, "BFM","Bullseye Classic (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bulcsa ,sc4bulcs, sc4_200_4ra, sc4bulcs, sc4_state, sc4bullcs, ROT0, "BFM","Bullseye Classic (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bulcsb ,sc4bulcs, sc4_200_4ra, sc4bulcs, sc4_state, sc4bullcs, ROT0, "BFM","Bullseye Classic (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bulcsc ,sc4bulcs, sc4_200_4ra, sc4bulcs, sc4_state, sc4bullcs, ROT0, "BFM","Bullseye Classic (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4butch)
@@ -32912,14 +32914,14 @@ INPUT_PORTS_START( sc4butch ) // this structure is generated
INPUT_PORTS_END
// PR1930 AWP BUTCH CASHIDY AND THE SUNDANCE QUID S4 PR1910 B C AND THE S Q SOUNDS11 BUTCH N SUNDANCE S.SITE
-GAMEL( 200?, sc4butch ,0, sc4_4reel_alt, sc4butch, sc4_state, sc4butch, ROT0, "BFM","Butch Cashidy & The Sundance Quid (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4butcha ,sc4butch, sc4_4reel_alt, sc4butch, sc4_state, sc4butch, ROT0, "BFM","Butch Cashidy & The Sundance Quid (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4butchb ,sc4butch, sc4_4reel_alt, sc4butch, sc4_state, sc4butch, ROT0, "BFM","Butch Cashidy & The Sundance Quid (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4butchc ,sc4butch, sc4_4reel_alt, sc4butch, sc4_state, sc4butch, ROT0, "BFM","Butch Cashidy & The Sundance Quid (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4butchd ,sc4butch, sc4_4reel_alt, sc4butch, sc4_state, sc4butch, ROT0, "BFM","Butch Cashidy & The Sundance Quid (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4butche ,sc4butch, sc4_4reel_alt, sc4butch, sc4_state, sc4butch, ROT0, "BFM","Butch Cashidy & The Sundance Quid (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4butchf ,sc4butch, sc4_4reel_alt, sc4butch, sc4_state, sc4butch, ROT0, "BFM","Butch Cashidy & The Sundance Quid (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4butchg ,sc4butch, sc4_4reel_alt, sc4butch, sc4_state, sc4butch, ROT0, "BFM","Butch Cashidy & The Sundance Quid (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4butch ,0, sc4_4reel_alt, sc4butch, sc4_state, sc4butch, ROT0, "BFM","Butch Cashidy & The Sundance Quid (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4butcha ,sc4butch, sc4_4reel_alt, sc4butch, sc4_state, sc4butch, ROT0, "BFM","Butch Cashidy & The Sundance Quid (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4butchb ,sc4butch, sc4_4reel_alt, sc4butch, sc4_state, sc4butch, ROT0, "BFM","Butch Cashidy & The Sundance Quid (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4butchc ,sc4butch, sc4_4reel_alt, sc4butch, sc4_state, sc4butch, ROT0, "BFM","Butch Cashidy & The Sundance Quid (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4butchd ,sc4butch, sc4_4reel_alt, sc4butch, sc4_state, sc4butch, ROT0, "BFM","Butch Cashidy & The Sundance Quid (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4butche ,sc4butch, sc4_4reel_alt, sc4butch, sc4_state, sc4butch, ROT0, "BFM","Butch Cashidy & The Sundance Quid (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4butchf ,sc4butch, sc4_4reel_alt, sc4butch, sc4_state, sc4butch, ROT0, "BFM","Butch Cashidy & The Sundance Quid (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4butchg ,sc4butch, sc4_4reel_alt, sc4butch, sc4_state, sc4butch, ROT0, "BFM","Butch Cashidy & The Sundance Quid (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
//was sc4_200_4ra, but that spins forever, so wrong
@@ -32981,20 +32983,20 @@ INPUT_PORTS_START( sc4cabin ) // this structure is generated
INPUT_PORTS_END
// PR2209 CABIN FEVER CABF SOUNDS CABIN FEVER
-GAMEL( 200?, sc4cabin ,0, sc4, sc4cabin, sc4_state, sc4cabin, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cabina ,sc4cabin, sc4, sc4cabin, sc4_state, sc4cabin, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cabinb ,sc4cabin, sc4, sc4cabin, sc4_state, sc4cabin, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cabinc ,sc4cabin, sc4, sc4cabin, sc4_state, sc4cabin, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cabind ,sc4cabin, sc4, sc4cabin, sc4_state, sc4cabin, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cabine ,sc4cabin, sc4, sc4cabin, sc4_state, sc4cabin, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cabinf ,sc4cabin, sc4, sc4cabin, sc4_state, sc4cabin, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cabing ,sc4cabin, sc4, sc4cabin, sc4_state, sc4cabin, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cabinh ,sc4cabin, sc4, sc4cabin, sc4_state, sc4cabin, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cabini ,sc4cabin, sc4, sc4cabin, sc4_state, sc4cabin, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cabinj ,sc4cabin, sc4, sc4cabin, sc4_state, sc4cabin, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 11)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cabink ,sc4cabin, sc4, sc4cabin, sc4_state, sc4cabin, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 12)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cabinl ,sc4cabin, sc4, sc4cabin, sc4_state, sc4cabin, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 13)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cabinm ,sc4cabin, sc4, sc4cabin, sc4_state, sc4cabin, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 14)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cabin ,0, sc4, sc4cabin, sc4_state, sc4cabin, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cabina ,sc4cabin, sc4, sc4cabin, sc4_state, sc4cabin, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cabinb ,sc4cabin, sc4, sc4cabin, sc4_state, sc4cabin, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cabinc ,sc4cabin, sc4, sc4cabin, sc4_state, sc4cabin, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cabind ,sc4cabin, sc4, sc4cabin, sc4_state, sc4cabin, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cabine ,sc4cabin, sc4, sc4cabin, sc4_state, sc4cabin, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cabinf ,sc4cabin, sc4, sc4cabin, sc4_state, sc4cabin, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cabing ,sc4cabin, sc4, sc4cabin, sc4_state, sc4cabin, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cabinh ,sc4cabin, sc4, sc4cabin, sc4_state, sc4cabin, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cabini ,sc4cabin, sc4, sc4cabin, sc4_state, sc4cabin, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cabinj ,sc4cabin, sc4, sc4cabin, sc4_state, sc4cabin, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 11)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cabink ,sc4cabin, sc4, sc4cabin, sc4_state, sc4cabin, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 12)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cabinl ,sc4cabin, sc4, sc4cabin, sc4_state, sc4cabin, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 13)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cabinm ,sc4cabin, sc4, sc4cabin, sc4_state, sc4cabin, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 14)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4cari)
@@ -33056,12 +33058,12 @@ INPUT_PORTS_START( sc4cari ) // this structure is generated
INPUT_PORTS_END
// PR2326 CARIBBEAN CASH CABC SOUNDS CARIBBEAN CASH
-GAMEL( 200?, sc4cari ,0, sc4_200_4ra, sc4cari, sc4_state, sc4cari, ROT0, "Mazooma","Caribbean Cash (PR2326) (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4caria ,sc4cari, sc4_200_4ra, sc4cari, sc4_state, sc4cari, ROT0, "Mazooma","Caribbean Cash (PR2326) (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4carib ,sc4cari, sc4_200_4ra, sc4cari, sc4_state, sc4cari, ROT0, "Mazooma","Caribbean Cash (PR2326) (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4caric ,sc4cari, sc4_200_4ra, sc4cari, sc4_state, sc4cari, ROT0, "Mazooma","Caribbean Cash (PR2326) (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4carid ,sc4cari, sc4_200_4ra, sc4cari, sc4_state, sc4cari, ROT0, "Mazooma","Caribbean Cash (PR2326) (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4carie ,sc4cari, sc4_200_4ra, sc4cari, sc4_state, sc4cari, ROT0, "Mazooma","Caribbean Cash (PR2326) (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cari ,0, sc4_200_4ra, sc4cari, sc4_state, sc4cari, ROT0, "Mazooma","Caribbean Cash (PR2326) (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4caria ,sc4cari, sc4_200_4ra, sc4cari, sc4_state, sc4cari, ROT0, "Mazooma","Caribbean Cash (PR2326) (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4carib ,sc4cari, sc4_200_4ra, sc4cari, sc4_state, sc4cari, ROT0, "Mazooma","Caribbean Cash (PR2326) (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4caric ,sc4cari, sc4_200_4ra, sc4cari, sc4_state, sc4cari, ROT0, "Mazooma","Caribbean Cash (PR2326) (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4carid ,sc4cari, sc4_200_4ra, sc4cari, sc4_state, sc4cari, ROT0, "Mazooma","Caribbean Cash (PR2326) (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4carie ,sc4cari, sc4_200_4ra, sc4cari, sc4_state, sc4cari, ROT0, "Mazooma","Caribbean Cash (PR2326) (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4cariq)
@@ -33119,14 +33121,14 @@ INPUT_PORTS_START( sc4cariq ) // this structure is generated
INPUT_PORTS_END
// these lack identification strings, and it's not the same game as above
-GAMEL( 200?, sc4cariq ,0, sc4_4reel, sc4cariq, sc4_state, sc4cariq, ROT0, "Qps","Caribbean Cash (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cariqa ,sc4cariq, sc4_4reel, sc4cariq, sc4_state, sc4cariq, ROT0, "Qps","Caribbean Cash (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cariqb ,sc4cariq, sc4_4reel, sc4cariq, sc4_state, sc4cariq, ROT0, "Qps","Caribbean Cash (Qps) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cariqc ,sc4cariq, sc4_4reel, sc4cariq, sc4_state, sc4cariq, ROT0, "Qps","Caribbean Cash (Qps) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cariqd ,sc4cariq, sc4_4reel, sc4cariq, sc4_state, sc4cariq, ROT0, "Qps","Caribbean Cash (Qps) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cariqe ,sc4cariq, sc4_4reel, sc4cariq, sc4_state, sc4cariq, ROT0, "Qps","Caribbean Cash (Qps) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cariqf ,sc4cariq, sc4_4reel, sc4cariq, sc4_state, sc4cariq, ROT0, "Qps","Caribbean Cash (Qps) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cariqg ,sc4cariq, sc4_4reel, sc4cariq, sc4_state, sc4cariq, ROT0, "Qps","Caribbean Cash (Qps) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cariq ,0, sc4_4reel, sc4cariq, sc4_state, sc4cariq, ROT0, "Qps","Caribbean Cash (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cariqa ,sc4cariq, sc4_4reel, sc4cariq, sc4_state, sc4cariq, ROT0, "Qps","Caribbean Cash (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cariqb ,sc4cariq, sc4_4reel, sc4cariq, sc4_state, sc4cariq, ROT0, "Qps","Caribbean Cash (Qps) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cariqc ,sc4cariq, sc4_4reel, sc4cariq, sc4_state, sc4cariq, ROT0, "Qps","Caribbean Cash (Qps) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cariqd ,sc4cariq, sc4_4reel, sc4cariq, sc4_state, sc4cariq, ROT0, "Qps","Caribbean Cash (Qps) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cariqe ,sc4cariq, sc4_4reel, sc4cariq, sc4_state, sc4cariq, ROT0, "Qps","Caribbean Cash (Qps) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cariqf ,sc4cariq, sc4_4reel, sc4cariq, sc4_state, sc4cariq, ROT0, "Qps","Caribbean Cash (Qps) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cariqg ,sc4cariq, sc4_4reel, sc4cariq, sc4_state, sc4cariq, ROT0, "Qps","Caribbean Cash (Qps) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4cblas)
@@ -33199,8 +33201,8 @@ INPUT_PORTS_START( sc4cblas ) // this structure is generated
INPUT_PORTS_END
// PR1683 BLAS14
-GAMEL( 200?, sc4cblas ,0, sc4_4reel_alt, sc4cblas, sc4_state, sc4cblas, ROT0, "Voodoo Games","Cash Blast (Voodoo Games) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cblasa ,sc4cblas, sc4_4reel_alt, sc4cblas, sc4_state, sc4cblas, ROT0, "Voodoo Games","Cash Blast (Voodoo Games) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cblas ,0, sc4_4reel_alt, sc4cblas, sc4_state, sc4cblas, ROT0, "Voodoo Games","Cash Blast (Voodoo Games) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cblasa ,sc4cblas, sc4_4reel_alt, sc4cblas, sc4_state, sc4cblas, ROT0, "Voodoo Games","Cash Blast (Voodoo Games) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -33267,12 +33269,12 @@ INPUT_PORTS_START( sc4casxt ) // this structure is generated
INPUT_PORTS_END
// PR2338 XTRAVAGANZA XTRV SOUNDS XTRAVAGANZA
-GAMEL( 200?, sc4casxt ,0, sc4_3reel_200_48, sc4casxt, sc4_state, sc4casxt, ROT0, "Mazooma","Casino Xtravaganza (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4casxta ,sc4casxt, sc4_3reel_200_48, sc4casxt, sc4_state, sc4casxt, ROT0, "Mazooma","Casino Xtravaganza (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4casxtb ,sc4casxt, sc4_3reel_200_48, sc4casxt, sc4_state, sc4casxt, ROT0, "Mazooma","Casino Xtravaganza (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4casxtc ,sc4casxt, sc4_3reel_200_48, sc4casxt, sc4_state, sc4casxt, ROT0, "Mazooma","Casino Xtravaganza (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4casxtd ,sc4casxt, sc4_3reel_200_48, sc4casxt, sc4_state, sc4casxt, ROT0, "Mazooma","Casino Xtravaganza (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4casxte ,sc4casxt, sc4_3reel_200_48, sc4casxt, sc4_state, sc4casxt, ROT0, "Mazooma","Casino Xtravaganza (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4casxt ,0, sc4_3reel_200_48, sc4casxt, sc4_state, sc4casxt, ROT0, "Mazooma","Casino Xtravaganza (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4casxta ,sc4casxt, sc4_3reel_200_48, sc4casxt, sc4_state, sc4casxt, ROT0, "Mazooma","Casino Xtravaganza (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4casxtb ,sc4casxt, sc4_3reel_200_48, sc4casxt, sc4_state, sc4casxt, ROT0, "Mazooma","Casino Xtravaganza (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4casxtc ,sc4casxt, sc4_3reel_200_48, sc4casxt, sc4_state, sc4casxt, ROT0, "Mazooma","Casino Xtravaganza (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4casxtd ,sc4casxt, sc4_3reel_200_48, sc4casxt, sc4_state, sc4casxt, ROT0, "Mazooma","Casino Xtravaganza (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4casxte ,sc4casxt, sc4_3reel_200_48, sc4casxt, sc4_state, sc4casxt, ROT0, "Mazooma","Casino Xtravaganza (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4chavi)
@@ -33338,14 +33340,14 @@ INPUT_PORTS_START( sc4chavi ) // this structure is generated
INPUT_PORTS_END
// PR1731 AWP CHAV IT SCORP4 PR1711 CHAV IT SOUNDS11 CHAV IT S.SITE
-GAMEL( 200?, sc4chavi ,0, sc4, sc4chavi, sc4_state, sc4chavi, ROT0, "BFM","Chav It (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4chavia ,sc4chavi, sc4, sc4chavi, sc4_state, sc4chavi, ROT0, "BFM","Chav It (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4chavib ,sc4chavi, sc4, sc4chavi, sc4_state, sc4chavi, ROT0, "BFM","Chav It (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4chavic ,sc4chavi, sc4, sc4chavi, sc4_state, sc4chavi, ROT0, "BFM","Chav It (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4chavid ,sc4chavi, sc4, sc4chavi, sc4_state, sc4chavi, ROT0, "BFM","Chav It (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4chavie ,sc4chavi, sc4, sc4chavi, sc4_state, sc4chavi, ROT0, "BFM","Chav It (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4chavif ,sc4chavi, sc4, sc4chavi, sc4_state, sc4chavi, ROT0, "BFM","Chav It (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4chavig ,sc4chavi, sc4, sc4chavi, sc4_state, sc4chavi, ROT0, "BFM","Chav It (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4chavi ,0, sc4, sc4chavi, sc4_state, sc4chavi, ROT0, "BFM","Chav It (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4chavia ,sc4chavi, sc4, sc4chavi, sc4_state, sc4chavi, ROT0, "BFM","Chav It (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4chavib ,sc4chavi, sc4, sc4chavi, sc4_state, sc4chavi, ROT0, "BFM","Chav It (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4chavic ,sc4chavi, sc4, sc4chavi, sc4_state, sc4chavi, ROT0, "BFM","Chav It (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4chavid ,sc4chavi, sc4, sc4chavi, sc4_state, sc4chavi, ROT0, "BFM","Chav It (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4chavie ,sc4chavi, sc4, sc4chavi, sc4_state, sc4chavi, ROT0, "BFM","Chav It (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4chavif ,sc4chavi, sc4, sc4chavi, sc4_state, sc4chavi, ROT0, "BFM","Chav It (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4chavig ,sc4chavi, sc4, sc4chavi, sc4_state, sc4chavi, ROT0, "BFM","Chav It (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4chavy)
@@ -33402,14 +33404,14 @@ INPUT_PORTS_START( sc4chavy ) // this structure is generated
INPUT_PORTS_END
// PR2305 CHAVVY CHASE CHVY SOUNDS
-GAMEL( 200?, sc4chavy ,0, sc4_5reel_alt, sc4chavy, sc4_state, sc4chavy, ROT0, "Mazooma","Chavy Chase (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4chavya ,sc4chavy, sc4_5reel_alt, sc4chavy, sc4_state, sc4chavy, ROT0, "Mazooma","Chavy Chase (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4chavyb ,sc4chavy, sc4_5reel_alt, sc4chavy, sc4_state, sc4chavy, ROT0, "Mazooma","Chavy Chase (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4chavyc ,sc4chavy, sc4_5reel_alt, sc4chavy, sc4_state, sc4chavy, ROT0, "Mazooma","Chavy Chase (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4chavyd ,sc4chavy, sc4_5reel_alt, sc4chavy, sc4_state, sc4chavy, ROT0, "Mazooma","Chavy Chase (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4chavye ,sc4chavy, sc4_5reel_alt, sc4chavy, sc4_state, sc4chavy, ROT0, "Mazooma","Chavy Chase (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4chavyf ,sc4chavy, sc4_5reel_alt, sc4chavy, sc4_state, sc4chavy, ROT0, "Mazooma","Chavy Chase (Mazooma) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4chavyg ,sc4chavy, sc4_5reel_alt, sc4chavy, sc4_state, sc4chavy, ROT0, "Mazooma","Chavy Chase (Mazooma) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4chavy ,0, sc4_5reel_alt, sc4chavy, sc4_state, sc4chavy, ROT0, "Mazooma","Chavy Chase (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4chavya ,sc4chavy, sc4_5reel_alt, sc4chavy, sc4_state, sc4chavy, ROT0, "Mazooma","Chavy Chase (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4chavyb ,sc4chavy, sc4_5reel_alt, sc4chavy, sc4_state, sc4chavy, ROT0, "Mazooma","Chavy Chase (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4chavyc ,sc4chavy, sc4_5reel_alt, sc4chavy, sc4_state, sc4chavy, ROT0, "Mazooma","Chavy Chase (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4chavyd ,sc4chavy, sc4_5reel_alt, sc4chavy, sc4_state, sc4chavy, ROT0, "Mazooma","Chavy Chase (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4chavye ,sc4chavy, sc4_5reel_alt, sc4chavy, sc4_state, sc4chavy, ROT0, "Mazooma","Chavy Chase (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4chavyf ,sc4chavy, sc4_5reel_alt, sc4chavy, sc4_state, sc4chavy, ROT0, "Mazooma","Chavy Chase (Mazooma) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4chavyg ,sc4chavy, sc4_5reel_alt, sc4chavy, sc4_state, sc4chavy, ROT0, "Mazooma","Chavy Chase (Mazooma) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4cmani)
@@ -33489,8 +33491,8 @@ INPUT_PORTS_START( sc4cmani ) // this structure is generated
INPUT_PORTS_END
// PR1308 COLOUR MANIA PR1308 COLOUR MAN SOUNDS11
-GAMEL( 200?, sc4cmani ,0, sc4_200_4rb, sc4cmani, sc4_state, sc4cmani, ROT0, "BFM","Colour Mania (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cmania ,sc4cmani, sc4_200_4rb, sc4cmani, sc4_state, sc4cmani, ROT0, "BFM","Colour Mania (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cmani ,0, sc4_200_4rb, sc4cmani, sc4_state, sc4cmani, ROT0, "BFM","Colour Mania (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cmania ,sc4cmani, sc4_200_4rb, sc4cmani, sc4_state, sc4cmani, ROT0, "BFM","Colour Mania (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4ctl)
@@ -33562,12 +33564,12 @@ INPUT_PORTS_END
// PR1109 AWP COP THE LOT PR1109 CTLOT SOUNDS11
-GAMEL( 200?, sc4ctl ,0, sc4_200_5r, sc4ctl, sc4_state, sc4ctl, ROT0, "BFM","Cop The Lot (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ctla ,sc4ctl, sc4_200_5r, sc4ctl, sc4_state, sc4ctl, ROT0, "BFM","Cop The Lot (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ctlb ,sc4ctl, sc4_200_5r, sc4ctl, sc4_state, sc4ctl, ROT0, "BFM","Cop The Lot (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ctlc ,sc4ctl, sc4_200_5r, sc4ctl, sc4_state, sc4ctl, ROT0, "BFM","Cop The Lot (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ctld ,sc4ctl, sc4_200_5r, sc4ctl, sc4_state, sc4ctl, ROT0, "BFM","Cop The Lot (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ctle ,sc4ctl, sc4_200_5r, sc4ctl, sc4_state, sc4ctl, ROT0, "BFM","Cop The Lot (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4ctl ,0, sc4_200_5r, sc4ctl, sc4_state, sc4ctl, ROT0, "BFM","Cop The Lot (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ctla ,sc4ctl, sc4_200_5r, sc4ctl, sc4_state, sc4ctl, ROT0, "BFM","Cop The Lot (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ctlb ,sc4ctl, sc4_200_5r, sc4ctl, sc4_state, sc4ctl, ROT0, "BFM","Cop The Lot (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ctlc ,sc4ctl, sc4_200_5r, sc4ctl, sc4_state, sc4ctl, ROT0, "BFM","Cop The Lot (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ctld ,sc4ctl, sc4_200_5r, sc4ctl, sc4_state, sc4ctl, ROT0, "BFM","Cop The Lot (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ctle ,sc4ctl, sc4_200_5r, sc4ctl, sc4_state, sc4ctl, ROT0, "BFM","Cop The Lot (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
INPUT_PORTS_START( sc4crsc ) // this structure is generated
@@ -33634,14 +33636,14 @@ INPUT_PORTS_START( sc4crsc ) // this structure is generated
INPUT_PORTS_END
// PR3035 AWP COPS AND ROBBERS SAFE CRACKER S4 PR3005 SAFE CRACKER SOUNDS11 SAFE CRACKER S.SITE
-GAMEL( 200?, sc4crsc ,0, sc4, sc4crsc, sc4_state, sc4mbus, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crsca ,sc4crsc, sc4, sc4crsc, sc4_state, sc4mbus, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crscb ,sc4crsc, sc4, sc4crsc, sc4_state, sc4mbus, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crscc ,sc4crsc, sc4, sc4crsc, sc4_state, sc4mbus, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crscd ,sc4crsc, sc4, sc4crsc, sc4_state, sc4mbus, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crsce ,sc4crsc, sc4, sc4crsc, sc4_state, sc4mbus, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crscf ,sc4crsc, sc4, sc4crsc, sc4_state, sc4mbus, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crscg ,sc4crsc, sc4, sc4crsc, sc4_state, sc4mbus, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4crsc ,0, sc4, sc4crsc, sc4_state, sc4mbus, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crsca ,sc4crsc, sc4, sc4crsc, sc4_state, sc4mbus, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crscb ,sc4crsc, sc4, sc4crsc, sc4_state, sc4mbus, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crscc ,sc4crsc, sc4, sc4crsc, sc4_state, sc4mbus, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crscd ,sc4crsc, sc4, sc4crsc, sc4_state, sc4mbus, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crsce ,sc4crsc, sc4, sc4crsc, sc4_state, sc4mbus, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crscf ,sc4crsc, sc4, sc4crsc, sc4_state, sc4mbus, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crscg ,sc4crsc, sc4, sc4crsc, sc4_state, sc4mbus, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4coro)
@@ -33701,14 +33703,14 @@ INPUT_PORTS_START( sc4coro ) // this structure is generated
INPUT_PORTS_END
// PR2252 CORONATION ST CORRY SOUNDS CORONATION ST
-GAMEL( 200?, sc4coro ,0, sc4_4reel_alt, sc4coro, sc4_state, sc4coro, ROT0, "Mazooma","Coronation Street (PR2252) (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4coroa ,sc4coro, sc4_4reel_alt, sc4coro, sc4_state, sc4coro, ROT0, "Mazooma","Coronation Street (PR2252) (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4corof ,sc4coro, sc4_4reel_alt, sc4coro, sc4_state, sc4coro, ROT0, "Mazooma","Coronation Street (PR2252) (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4corog ,sc4coro, sc4_4reel_alt, sc4coro, sc4_state, sc4coro, ROT0, "Mazooma","Coronation Street (PR2252) (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4coroj ,sc4coro, sc4_4reel_alt, sc4coro, sc4_state, sc4coro, ROT0, "Mazooma","Coronation Street (PR2252) (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4corok ,sc4coro, sc4_4reel_alt, sc4coro, sc4_state, sc4coro, ROT0, "Mazooma","Coronation Street (PR2252) (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4corol ,sc4coro, sc4_4reel_alt, sc4coro, sc4_state, sc4coro, ROT0, "Mazooma","Coronation Street (PR2252) (Mazooma) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4corom ,sc4coro, sc4_4reel_alt, sc4coro, sc4_state, sc4coro, ROT0, "Mazooma","Coronation Street (PR2252) (Mazooma) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4coro ,0, sc4_4reel_alt, sc4coro, sc4_state, sc4coro, ROT0, "Mazooma","Coronation Street (PR2252) (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4coroa ,sc4coro, sc4_4reel_alt, sc4coro, sc4_state, sc4coro, ROT0, "Mazooma","Coronation Street (PR2252) (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4corof ,sc4coro, sc4_4reel_alt, sc4coro, sc4_state, sc4coro, ROT0, "Mazooma","Coronation Street (PR2252) (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4corog ,sc4coro, sc4_4reel_alt, sc4coro, sc4_state, sc4coro, ROT0, "Mazooma","Coronation Street (PR2252) (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4coroj ,sc4coro, sc4_4reel_alt, sc4coro, sc4_state, sc4coro, ROT0, "Mazooma","Coronation Street (PR2252) (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4corok ,sc4coro, sc4_4reel_alt, sc4coro, sc4_state, sc4coro, ROT0, "Mazooma","Coronation Street (PR2252) (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4corol ,sc4coro, sc4_4reel_alt, sc4coro, sc4_state, sc4coro, ROT0, "Mazooma","Coronation Street (PR2252) (Mazooma) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4corom ,sc4coro, sc4_4reel_alt, sc4coro, sc4_state, sc4coro, ROT0, "Mazooma","Coronation Street (PR2252) (Mazooma) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4corod)
@@ -33826,16 +33828,16 @@ INPUT_PORTS_END
// PR2249 CORONATION ST Arcade Version 012 COROST_TRIPLE SOUNDS CORONATION ST
// PAY UINT ERR 17
-GAMEL( 200?, sc4coroc ,0, sc4, sc4coroc, sc4_state, sc4, ROT0, "Mazooma","Coronation Street Triple (Arcade Version 012) (PR2249) (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4coroh ,sc4coroc, sc4, sc4coroc, sc4_state, sc4, ROT0, "Mazooma","Coronation Street Triple (Arcade Version 012) (PR2249) (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4coroc ,0, sc4, sc4coroc, sc4_state, sc4, ROT0, "Mazooma","Coronation Street Triple (Arcade Version 012) (PR2249) (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4coroh ,sc4coroc, sc4, sc4coroc, sc4_state, sc4, ROT0, "Mazooma","Coronation Street Triple (Arcade Version 012) (PR2249) (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// P_2_4_ _O_O_A_I_N_S_ _i_g_ _e_s_o_ _1_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _O_O_T_T_I_L_ _O_N_S_ _ _ _ _ _ _ _C_R_N_T_O_ _S_ _ _ _
-GAMEL( 200?, sc4coron ,sc4coroc, sc4, sc4coroc, sc4_state, sc4, ROT0, "Mazooma","Coronation Street Triple (Bingo Version ?1) (PR2?4?) (Mazooma) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // incomplete pair, was in 'show me the money' set 'Bingo Version' is a guess
+GAMEL( 200?, sc4coron ,sc4coroc, sc4, sc4coroc, sc4_state, sc4, ROT0, "Mazooma","Coronation Street Triple (Bingo Version ?1) (PR2?4?) (Mazooma) (Scorpion 4)", MACHINE_FLAGS, layout_bfm_sc4 ) // incomplete pair, was in 'show me the money' set 'Bingo Version' is a guess
// PR2249 CORONATION STREET CORS MAZ COROST_TRIPLE SOUNDS
-GAMEL( 200?, sc4corod ,sc4coroc, sc4_4reel, sc4corod, sc4_state, sc4corod, ROT0, "Mazooma","Coronation Street Triple (PR2249) (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4coroi ,sc4coroc, sc4_4reel, sc4corod, sc4_state, sc4corod, ROT0, "Mazooma","Coronation Street Triple (PR2249) (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4corod ,sc4coroc, sc4_4reel, sc4corod, sc4_state, sc4corod, ROT0, "Mazooma","Coronation Street Triple (PR2249) (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4coroi ,sc4coroc, sc4_4reel, sc4corod, sc4_state, sc4corod, ROT0, "Mazooma","Coronation Street Triple (PR2249) (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// PR2526 CORONATION ST TOP BOX COROST_TRIPLE SOUNDS CORONATION ST
-GAMEL( 200?, sc4corotb ,sc4coroc, sc4_4reel_alt, sc4, sc4_state, sc4corotb, ROT0, "Mazooma","Coronation Street Triple Top Box (PR2526, CSTB) (Mazooma) (Scorpion 4) (Top Box, set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4corotba ,sc4coroc, sc4_4reel_alt, sc4, sc4_state, sc4corotb, ROT0, "Mazooma","Coronation Street Triple Top Box (PR2526, CSTB) (Mazooma) (Scorpion 4) (Top Box, set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4corotb ,sc4coroc, sc4_4reel_alt, sc4, sc4_state, sc4corotb, ROT0, "Mazooma","Coronation Street Triple Top Box (PR2526, CSTB) (Mazooma) (Scorpion 4) (Top Box, set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4corotba ,sc4coroc, sc4_4reel_alt, sc4, sc4_state, sc4corotb, ROT0, "Mazooma","Coronation Street Triple Top Box (PR2526, CSTB) (Mazooma) (Scorpion 4) (Top Box, set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4corcl)
{
@@ -33905,8 +33907,8 @@ INPUT_PORTS_START( sc4corcl ) // this structure is generated
INPUT_PORTS_END
// PR2383 CLUBCORONATIONSTREET CLUBCORONATIONST CLUB CCORO SOUNDS CLUB CORO ST
-GAMEL( 200?, sc4corcl ,0, sc4_5reel, sc4corcl, sc4_state, sc4corcl, ROT0, "Mazooma","Coronation Street Club (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4corcla ,sc4corcl, sc4_5reel, sc4corcl, sc4_state, sc4corcl, ROT0, "Mazooma","Coronation Street Club (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4corcl ,0, sc4_5reel, sc4corcl, sc4_state, sc4corcl, ROT0, "Mazooma","Coronation Street Club (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4corcla ,sc4corcl, sc4_5reel, sc4corcl, sc4_state, sc4corcl, ROT0, "Mazooma","Coronation Street Club (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4count)
@@ -33975,8 +33977,8 @@ INPUT_PORTS_START( sc4count ) // this structure is generated
INPUT_PORTS_END
// PR1929 AWP COUNTDOWN S4 PR1909 COUNTDOWN SOUNDS11 COUNTDOWN S.SITE
-GAMEL( 200?, sc4count ,0, sc4_200_5ra, sc4count, sc4_state, sc4count, ROT0, "BFM","Countdown (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4counta ,sc4count, sc4_200_5ra, sc4count, sc4_state, sc4count, ROT0, "BFM","Countdown (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4count ,0, sc4_200_5ra, sc4count, sc4_state, sc4count, ROT0, "BFM","Countdown (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4counta ,sc4count, sc4_200_5ra, sc4count, sc4_state, sc4count, ROT0, "BFM","Countdown (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -34065,22 +34067,22 @@ INPUT_PORTS_START( sc4dnd35 )
INPUT_PORTS_END
// PR1927 AWP DEAL OR NO DEAL S4 PR1907 DEAL OR NO DEAL SOUNDS11
-GAMEL( 200?, sc4dnd ,0, sc4, sc4dnd25, sc4_state, sc4dnd, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (DONL016, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4dnd ) // DONL 016
-GAMEL( 200?, sc4dndb ,sc4dnd, sc4, sc4dnd25, sc4_state, sc4dnd, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (DONL016, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4dnd ) // DONL 016
-GAMEL( 200?, sc4dnde ,sc4dnd, sc4, sc4dnd25, sc4_state, sc4dnd, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (DONL017, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4dnd ) // DONL 017
-GAMEL( 200?, sc4dndh ,sc4dnd, sc4, sc4dnd25, sc4_state, sc4dnd, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (DONL017, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4dnd ) // DONL 017
-GAMEL( 200?, sc4dndf ,sc4dnd, sc4, sc4dnd25, sc4_state, sc4dnd, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (DONL018, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4dnd ) // DONL 018
-GAMEL( 200?, sc4dndi ,sc4dnd, sc4, sc4dnd25, sc4_state, sc4dnd, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (DONL018, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4dnd )// DONL 018
-GAMEL( 200?, sc4dndd ,sc4dnd, sc4, sc4dnd35, sc4_state, sc4dnd, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (DONL402, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4dnd ) // DONL 402
-GAMEL( 200?, sc4dndg ,sc4dnd, sc4, sc4dnd35, sc4_state, sc4dnd, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (DONL402, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4dnd ) // DONL 402
-GAMEL( 200?, sc4dndj ,sc4dnd, sc4, sc4dnd35, sc4_state, sc4dnd, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (DONL406, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4dnd )// DONL 406
-GAMEL( 200?, sc4dndl ,sc4dnd, sc4, sc4dnd35, sc4_state, sc4dnd, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (DONL406, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4dnd )// DONL 406
-GAMEL( 200?, sc4dndc ,sc4dnd, sc4, sc4dnd35, sc4_state, sc4dnd, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (DONL422, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4dnd ) // DONL 422
-GAMEL( 200?, sc4dnda ,sc4dnd, sc4, sc4dnd35, sc4_state, sc4dnd, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (DONL422, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4dnd ) // DONL 422, incomplete pairing
-GAMEL( 200?, sc4dndn ,sc4dnd, sc4, sc4dnd35, sc4_state, sc4dnd, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (DONL424, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4dnd )// DONL 424
-GAMEL( 200?, sc4dndo ,sc4dnd, sc4, sc4dnd35, sc4_state, sc4dnd, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (DONL424, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4dnd )// DONL 424
-GAMEL( 200?, sc4dndk ,sc4dnd, sc4, sc4dnd35, sc4_state, sc4dnd, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (DONL428, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4dnd )// DONL 428
-GAMEL( 200?, sc4dndm ,sc4dnd, sc4, sc4dnd35, sc4_state, sc4dnd, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (DONL428, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4dnd )// DONL 428
+GAMEL( 200?, sc4dnd ,0, sc4, sc4dnd25, sc4_state, sc4dnd, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (DONL016, set 1)", MACHINE_FLAGS, layout_sc4dnd ) // DONL 016
+GAMEL( 200?, sc4dndb ,sc4dnd, sc4, sc4dnd25, sc4_state, sc4dnd, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (DONL016, set 2)", MACHINE_FLAGS, layout_sc4dnd ) // DONL 016
+GAMEL( 200?, sc4dnde ,sc4dnd, sc4, sc4dnd25, sc4_state, sc4dnd, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (DONL017, set 1)", MACHINE_FLAGS, layout_sc4dnd ) // DONL 017
+GAMEL( 200?, sc4dndh ,sc4dnd, sc4, sc4dnd25, sc4_state, sc4dnd, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (DONL017, set 2)", MACHINE_FLAGS, layout_sc4dnd ) // DONL 017
+GAMEL( 200?, sc4dndf ,sc4dnd, sc4, sc4dnd25, sc4_state, sc4dnd, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (DONL018, set 1)", MACHINE_FLAGS, layout_sc4dnd ) // DONL 018
+GAMEL( 200?, sc4dndi ,sc4dnd, sc4, sc4dnd25, sc4_state, sc4dnd, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (DONL018, set 2)", MACHINE_FLAGS, layout_sc4dnd )// DONL 018
+GAMEL( 200?, sc4dndd ,sc4dnd, sc4, sc4dnd35, sc4_state, sc4dnd, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (DONL402, set 1)", MACHINE_FLAGS, layout_sc4dnd ) // DONL 402
+GAMEL( 200?, sc4dndg ,sc4dnd, sc4, sc4dnd35, sc4_state, sc4dnd, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (DONL402, set 2)", MACHINE_FLAGS, layout_sc4dnd ) // DONL 402
+GAMEL( 200?, sc4dndj ,sc4dnd, sc4, sc4dnd35, sc4_state, sc4dnd, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (DONL406, set 1)", MACHINE_FLAGS, layout_sc4dnd )// DONL 406
+GAMEL( 200?, sc4dndl ,sc4dnd, sc4, sc4dnd35, sc4_state, sc4dnd, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (DONL406, set 2)", MACHINE_FLAGS, layout_sc4dnd )// DONL 406
+GAMEL( 200?, sc4dndc ,sc4dnd, sc4, sc4dnd35, sc4_state, sc4dnd, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (DONL422, set 1)", MACHINE_FLAGS, layout_sc4dnd ) // DONL 422
+GAMEL( 200?, sc4dnda ,sc4dnd, sc4, sc4dnd35, sc4_state, sc4dnd, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (DONL422, set 2)", MACHINE_FLAGS, layout_sc4dnd ) // DONL 422, incomplete pairing
+GAMEL( 200?, sc4dndn ,sc4dnd, sc4, sc4dnd35, sc4_state, sc4dnd, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (DONL424, set 1)", MACHINE_FLAGS, layout_sc4dnd )// DONL 424
+GAMEL( 200?, sc4dndo ,sc4dnd, sc4, sc4dnd35, sc4_state, sc4dnd, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (DONL424, set 2)", MACHINE_FLAGS, layout_sc4dnd )// DONL 424
+GAMEL( 200?, sc4dndk ,sc4dnd, sc4, sc4dnd35, sc4_state, sc4dnd, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (DONL428, set 1)", MACHINE_FLAGS, layout_sc4dnd )// DONL 428
+GAMEL( 200?, sc4dndm ,sc4dnd, sc4, sc4dnd35, sc4_state, sc4dnd, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (DONL428, set 2)", MACHINE_FLAGS, layout_sc4dnd )// DONL 428
DRIVER_INIT_MEMBER(sc4_state,sc4dndcs)
@@ -34158,12 +34160,12 @@ INPUT_PORTS_START( sc4dndcs5 )
INPUT_PORTS_END
// PR1967 AWP CLASSIC DEAL OR NO DEAL S4 PR1907 DEAL OR NO DEAL SOUNDS11
-GAMEL( 200?, sc4dndcs ,0, sc4, sc4dndcs5, sc4_state, sc4dndcs, ROT0, "BFM","Deal Or No Deal Classic (Bellfruit) (Scorpion 4) (CLDD211, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // CLDD 211
-GAMEL( 200?, sc4dndcsb ,sc4dndcs, sc4, sc4dndcs5, sc4_state, sc4dndcs, ROT0, "BFM","Deal Or No Deal Classic (Bellfruit) (Scorpion 4) (CLDD211, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // CLDD 211
-GAMEL( 200?, sc4dndcsa ,sc4dndcs, sc4, sc4dndcs5, sc4_state, sc4dndcs, ROT0, "BFM","Deal Or No Deal Classic (Bellfruit) (Scorpion 4) (CLDD212, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // CLDD 212
-GAMEL( 200?, sc4dndcsc ,sc4dndcs, sc4, sc4dndcs5, sc4_state, sc4dndcs, ROT0, "BFM","Deal Or No Deal Classic (Bellfruit) (Scorpion 4) (CLDD212, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // CLDD 212
-GAMEL( 200?, sc4dndcsd ,sc4dndcs, sc4, sc4dndcs5, sc4_state, sc4dndcs, ROT0, "BFM","Deal Or No Deal Classic (Bellfruit) (Scorpion 4) (CLDD215, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // CLDD 215
-GAMEL( 200?, sc4dndcse ,sc4dndcs, sc4, sc4dndcs5, sc4_state, sc4dndcs, ROT0, "BFM","Deal Or No Deal Classic (Bellfruit) (Scorpion 4) (CLDD215, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // CLDD 215
+GAMEL( 200?, sc4dndcs ,0, sc4, sc4dndcs5, sc4_state, sc4dndcs, ROT0, "BFM","Deal Or No Deal Classic (Bellfruit) (Scorpion 4) (CLDD211, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // CLDD 211
+GAMEL( 200?, sc4dndcsb ,sc4dndcs, sc4, sc4dndcs5, sc4_state, sc4dndcs, ROT0, "BFM","Deal Or No Deal Classic (Bellfruit) (Scorpion 4) (CLDD211, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // CLDD 211
+GAMEL( 200?, sc4dndcsa ,sc4dndcs, sc4, sc4dndcs5, sc4_state, sc4dndcs, ROT0, "BFM","Deal Or No Deal Classic (Bellfruit) (Scorpion 4) (CLDD212, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // CLDD 212
+GAMEL( 200?, sc4dndcsc ,sc4dndcs, sc4, sc4dndcs5, sc4_state, sc4dndcs, ROT0, "BFM","Deal Or No Deal Classic (Bellfruit) (Scorpion 4) (CLDD212, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // CLDD 212
+GAMEL( 200?, sc4dndcsd ,sc4dndcs, sc4, sc4dndcs5, sc4_state, sc4dndcs, ROT0, "BFM","Deal Or No Deal Classic (Bellfruit) (Scorpion 4) (CLDD215, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // CLDD 215
+GAMEL( 200?, sc4dndcse ,sc4dndcs, sc4, sc4dndcs5, sc4_state, sc4dndcs, ROT0, "BFM","Deal Or No Deal Classic (Bellfruit) (Scorpion 4) (CLDD215, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // CLDD 215
DRIVER_INIT_MEMBER(sc4_state,sc4dndbb)
@@ -34254,16 +34256,16 @@ INPUT_PORTS_END
// PR3229 AWP DEAL OR NO DEAL BREAK THE BANK SCORP4 PR3209 BREAK THE BANK SOUNDS11
-GAMEL( 200?, sc4dndbb ,0, sc4_5reel_alt, sc4dndbb35, sc4_state, sc4dndbb, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 4) (CRBE471, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // CRBE 471
-GAMEL( 200?, sc4dndbbb ,sc4dndbb, sc4_5reel_alt, sc4dndbb35, sc4_state, sc4dndbb, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 4) (CRBE471, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // CRBE 471
-GAMEL( 200?, sc4dndbba ,sc4dndbb, sc4_5reel_alt, sc4dndbb35, sc4_state, sc4dndbb, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 4) (CRBE472, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // CRBE 472
-GAMEL( 200?, sc4dndbbc ,sc4dndbb, sc4_5reel_alt, sc4dndbb35, sc4_state, sc4dndbb, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 4) (CRBE472, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // CRBE 472
-GAMEL( 200?, sc4dndbbd ,sc4dndbb, sc4_5reel_alt, sc4dndbb35, sc4_state, sc4dndbb, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 4) (CRBE473, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // CRBE 473
-GAMEL( 200?, sc4dndbbg ,sc4dndbb, sc4_5reel_alt, sc4dndbb35, sc4_state, sc4dndbb, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 4) (CRBE473, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // CRBE 473
-GAMEL( 200?, sc4dndbbe ,sc4dndbb, sc4_5reel_alt, sc4dndbb70, sc4_state, sc4dndbb, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 4) (CRBE571, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // CRBE 571
-GAMEL( 200?, sc4dndbbh ,sc4dndbb, sc4_5reel_alt, sc4dndbb70, sc4_state, sc4dndbb, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 4) (CRBE571, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // CRBE 571
-GAMEL( 200?, sc4dndbbf ,sc4dndbb, sc4_5reel_alt, sc4dndbb70, sc4_state, sc4dndbb, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 4) (CRBE572, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // CRBE 572
-GAMEL( 200?, sc4dndbbi ,sc4dndbb, sc4_5reel_alt, sc4dndbb70, sc4_state, sc4dndbb, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 4) (CRBE572, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// CRBE 572
+GAMEL( 200?, sc4dndbb ,0, sc4_5reel_alt, sc4dndbb35, sc4_state, sc4dndbb, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 4) (CRBE471, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // CRBE 471
+GAMEL( 200?, sc4dndbbb ,sc4dndbb, sc4_5reel_alt, sc4dndbb35, sc4_state, sc4dndbb, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 4) (CRBE471, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // CRBE 471
+GAMEL( 200?, sc4dndbba ,sc4dndbb, sc4_5reel_alt, sc4dndbb35, sc4_state, sc4dndbb, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 4) (CRBE472, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // CRBE 472
+GAMEL( 200?, sc4dndbbc ,sc4dndbb, sc4_5reel_alt, sc4dndbb35, sc4_state, sc4dndbb, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 4) (CRBE472, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // CRBE 472
+GAMEL( 200?, sc4dndbbd ,sc4dndbb, sc4_5reel_alt, sc4dndbb35, sc4_state, sc4dndbb, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 4) (CRBE473, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // CRBE 473
+GAMEL( 200?, sc4dndbbg ,sc4dndbb, sc4_5reel_alt, sc4dndbb35, sc4_state, sc4dndbb, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 4) (CRBE473, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // CRBE 473
+GAMEL( 200?, sc4dndbbe ,sc4dndbb, sc4_5reel_alt, sc4dndbb70, sc4_state, sc4dndbb, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 4) (CRBE571, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // CRBE 571
+GAMEL( 200?, sc4dndbbh ,sc4dndbb, sc4_5reel_alt, sc4dndbb70, sc4_state, sc4dndbb, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 4) (CRBE571, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // CRBE 571
+GAMEL( 200?, sc4dndbbf ,sc4dndbb, sc4_5reel_alt, sc4dndbb70, sc4_state, sc4dndbb, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 4) (CRBE572, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // CRBE 572
+GAMEL( 200?, sc4dndbbi ,sc4dndbb, sc4_5reel_alt, sc4dndbb70, sc4_state, sc4dndbb, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 4) (CRBE572, set 2)", MACHINE_FLAGS, layout_bfm_sc4 )// CRBE 572
@@ -34347,14 +34349,14 @@ INPUT_PORTS_START( sc4dndcl500 )
INPUT_PORTS_END
// PR1949 CLUB DEAL OR NO DEAL DEAL OR NO DEAL CLUB PR1949 DEAL O N D SOUNDS11
-GAMEL( 200?, sc4dndclc ,sc4dndcl, sc4, sc4dndcl, sc4_state, sc4dndcl, ROT0, "BFM","Deal Or No Deal Club (Bellfruit) (Scorpion 4) (DNDL181, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // DNDL 181 CLUB $500 (no key req?)
-GAMEL( 200?, sc4dndclg ,sc4dndcl, sc4, sc4dndcl, sc4_state, sc4dndcl, ROT0, "BFM","Deal Or No Deal Club (Bellfruit) (Scorpion 4) (DNDL181, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // DNDL 181 CLUB $500 (no key req?)
-GAMEL( 200?, sc4dndcla ,sc4dndcl, sc4, sc4dndcl500, sc4_state, sc4dndcl, ROT0, "BFM","Deal Or No Deal Club (Bellfruit) (Scorpion 4) (DNDL212, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // DNDL 212 CLUB ?500
-GAMEL( 200?, sc4dndcle ,sc4dndcl, sc4, sc4dndcl500, sc4_state, sc4dndcl, ROT0, "BFM","Deal Or No Deal Club (Bellfruit) (Scorpion 4) (DNDL212, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // DNDL 212 CLUB ?500
-GAMEL( 200?, sc4dndcl ,0, sc4, sc4dndcl250, sc4_state, sc4dndcl, ROT0, "BFM","Deal Or No Deal Club (Bellfruit) (Scorpion 4) (DNDL313, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // DNDL 313 CLUB ?250
-GAMEL( 200?, sc4dndcld ,sc4dndcl, sc4, sc4dndcl250, sc4_state, sc4dndcl, ROT0, "BFM","Deal Or No Deal Club (Bellfruit) (Scorpion 4) (DNDL313, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // DNDL 313 CLUB ?250
-GAMEL( 200?, sc4dndclb ,sc4dndcl, sc4, sc4dndcl250, sc4_state, sc4dndcl, ROT0, "BFM","Deal Or No Deal Club (Bellfruit) (Scorpion 4) (DNDL391, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // DNDL 391 CLUB ?250
-GAMEL( 200?, sc4dndclf ,sc4dndcl, sc4, sc4dndcl250, sc4_state, sc4dndcl, ROT0, "BFM","Deal Or No Deal Club (Bellfruit) (Scorpion 4) (DNDL391, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // DNDL 391 CLUB ?250
+GAMEL( 200?, sc4dndclc ,sc4dndcl, sc4, sc4dndcl, sc4_state, sc4dndcl, ROT0, "BFM","Deal Or No Deal Club (Bellfruit) (Scorpion 4) (DNDL181, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // DNDL 181 CLUB $500 (no key req?)
+GAMEL( 200?, sc4dndclg ,sc4dndcl, sc4, sc4dndcl, sc4_state, sc4dndcl, ROT0, "BFM","Deal Or No Deal Club (Bellfruit) (Scorpion 4) (DNDL181, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // DNDL 181 CLUB $500 (no key req?)
+GAMEL( 200?, sc4dndcla ,sc4dndcl, sc4, sc4dndcl500, sc4_state, sc4dndcl, ROT0, "BFM","Deal Or No Deal Club (Bellfruit) (Scorpion 4) (DNDL212, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // DNDL 212 CLUB ?500
+GAMEL( 200?, sc4dndcle ,sc4dndcl, sc4, sc4dndcl500, sc4_state, sc4dndcl, ROT0, "BFM","Deal Or No Deal Club (Bellfruit) (Scorpion 4) (DNDL212, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // DNDL 212 CLUB ?500
+GAMEL( 200?, sc4dndcl ,0, sc4, sc4dndcl250, sc4_state, sc4dndcl, ROT0, "BFM","Deal Or No Deal Club (Bellfruit) (Scorpion 4) (DNDL313, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // DNDL 313 CLUB ?250
+GAMEL( 200?, sc4dndcld ,sc4dndcl, sc4, sc4dndcl250, sc4_state, sc4dndcl, ROT0, "BFM","Deal Or No Deal Club (Bellfruit) (Scorpion 4) (DNDL313, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // DNDL 313 CLUB ?250
+GAMEL( 200?, sc4dndclb ,sc4dndcl, sc4, sc4dndcl250, sc4_state, sc4dndcl, ROT0, "BFM","Deal Or No Deal Club (Bellfruit) (Scorpion 4) (DNDL391, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // DNDL 391 CLUB ?250
+GAMEL( 200?, sc4dndclf ,sc4dndcl, sc4, sc4dndcl250, sc4_state, sc4dndcl, ROT0, "BFM","Deal Or No Deal Club (Bellfruit) (Scorpion 4) (DNDL391, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // DNDL 391 CLUB ?250
DRIVER_INIT_MEMBER(sc4_state,sc4dnddd)
@@ -34441,14 +34443,14 @@ INPUT_PORTS_END
// PR3235 AWP DEAL OR NO DEAL DOUBLE S4 PR3215 DOND DOUBLE SOUNDS11 DOUBLE DOND S.SITE
-GAMEL( 200?, sc4dnddd ,0, sc4_5reel_alt, sc4dnddd35, sc4_state, sc4dnddd, ROT0, "BFM","Deal Or No Deal Double Deal Or No Deal (Bellfruit) (Scorpion 4) (DDNO471, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // DDNO 471
-GAMEL( 200?, sc4dndddd ,sc4dnddd, sc4_5reel_alt, sc4dnddd35, sc4_state, sc4dnddd, ROT0, "BFM","Deal Or No Deal Double Deal Or No Deal (Bellfruit) (Scorpion 4) (DDNO471, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // DDNO 471
-GAMEL( 200?, sc4dnddda ,sc4dnddd, sc4_5reel_alt, sc4dnddd70, sc4_state, sc4dnddd, ROT0, "BFM","Deal Or No Deal Double Deal Or No Deal (Bellfruit) (Scorpion 4) (DDNO571, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // DDNO 571
-GAMEL( 200?, sc4dnddde ,sc4dnddd, sc4_5reel_alt, sc4dnddd70, sc4_state, sc4dnddd, ROT0, "BFM","Deal Or No Deal Double Deal Or No Deal (Bellfruit) (Scorpion 4) (DDNO571, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // DDNO 571
-GAMEL( 200?, sc4dndddb ,sc4dnddd, sc4_5reel_alt, sc4dnddd70, sc4_state, sc4dnddd, ROT0, "BFM","Deal Or No Deal Double Deal Or No Deal (Bellfruit) (Scorpion 4) (DDNO572, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // DDNO 572
-GAMEL( 200?, sc4dndddf ,sc4dnddd, sc4_5reel_alt, sc4dnddd70, sc4_state, sc4dnddd, ROT0, "BFM","Deal Or No Deal Double Deal Or No Deal (Bellfruit) (Scorpion 4) (DDNO572, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // DDNO 572
-GAMEL( 200?, sc4dndddc ,sc4dnddd, sc4_5reel_alt, sc4dnddd70, sc4_state, sc4dnddd, ROT0, "BFM","Deal Or No Deal Double Deal Or No Deal (Bellfruit) (Scorpion 4) (DDNO573, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // DDNO 573
-GAMEL( 200?, sc4dndddg ,sc4dnddd, sc4_5reel_alt, sc4dnddd70, sc4_state, sc4dnddd, ROT0, "BFM","Deal Or No Deal Double Deal Or No Deal (Bellfruit) (Scorpion 4) (DDNO573, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // DDNO 573
+GAMEL( 200?, sc4dnddd ,0, sc4_5reel_alt, sc4dnddd35, sc4_state, sc4dnddd, ROT0, "BFM","Deal Or No Deal Double Deal Or No Deal (Bellfruit) (Scorpion 4) (DDNO471, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // DDNO 471
+GAMEL( 200?, sc4dndddd ,sc4dnddd, sc4_5reel_alt, sc4dnddd35, sc4_state, sc4dnddd, ROT0, "BFM","Deal Or No Deal Double Deal Or No Deal (Bellfruit) (Scorpion 4) (DDNO471, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // DDNO 471
+GAMEL( 200?, sc4dnddda ,sc4dnddd, sc4_5reel_alt, sc4dnddd70, sc4_state, sc4dnddd, ROT0, "BFM","Deal Or No Deal Double Deal Or No Deal (Bellfruit) (Scorpion 4) (DDNO571, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // DDNO 571
+GAMEL( 200?, sc4dnddde ,sc4dnddd, sc4_5reel_alt, sc4dnddd70, sc4_state, sc4dnddd, ROT0, "BFM","Deal Or No Deal Double Deal Or No Deal (Bellfruit) (Scorpion 4) (DDNO571, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // DDNO 571
+GAMEL( 200?, sc4dndddb ,sc4dnddd, sc4_5reel_alt, sc4dnddd70, sc4_state, sc4dnddd, ROT0, "BFM","Deal Or No Deal Double Deal Or No Deal (Bellfruit) (Scorpion 4) (DDNO572, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // DDNO 572
+GAMEL( 200?, sc4dndddf ,sc4dnddd, sc4_5reel_alt, sc4dnddd70, sc4_state, sc4dnddd, ROT0, "BFM","Deal Or No Deal Double Deal Or No Deal (Bellfruit) (Scorpion 4) (DDNO572, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // DDNO 572
+GAMEL( 200?, sc4dndddc ,sc4dnddd, sc4_5reel_alt, sc4dnddd70, sc4_state, sc4dnddd, ROT0, "BFM","Deal Or No Deal Double Deal Or No Deal (Bellfruit) (Scorpion 4) (DDNO573, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // DDNO 573
+GAMEL( 200?, sc4dndddg ,sc4dnddd, sc4_5reel_alt, sc4dnddd70, sc4_state, sc4dnddd, ROT0, "BFM","Deal Or No Deal Double Deal Or No Deal (Bellfruit) (Scorpion 4) (DDNO573, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // DDNO 573
@@ -34536,19 +34538,19 @@ INPUT_PORTS_START( sc4dndhf70 )
INPUT_PORTS_END
// PR3038 DEAL OR NO DEAL HALL OF FAME SCORP4 PR3008 HALL OF FAME SOUNDS11 HALL OF FAME S.SITE
-GAMEL( 200?, sc4dndhff ,sc4dndhf, sc4_5reel_alt, sc4dndhf35, sc4_state, sc4dndhf, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 4) (DNHA471, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // DNHA 471
-GAMEL( 200?, sc4dndhfh ,sc4dndhf, sc4_5reel_alt, sc4dndhf35, sc4_state, sc4dndhf, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 4) (DNHA471, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // DNHA 471
-GAMEL( 200?, sc4dndhfg ,sc4dndhf, sc4_5reel_alt, sc4dndhf35, sc4_state, sc4dndhf, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 4) (DNHA472, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // DNHA 472
-GAMEL( 200?, sc4dndhfi ,sc4dndhf, sc4_5reel_alt, sc4dndhf35, sc4_state, sc4dndhf, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 4) (DNHA472, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // DNHA 472
-GAMEL( 200?, sc4dndhf ,0, sc4_5reel_alt, sc4dndhf35, sc4_state, sc4dndhf, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 4) (DNHA473, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // DNHA 473
-GAMEL( 200?, sc4dndhfa ,sc4dndhf, sc4_5reel_alt, sc4dndhf35, sc4_state, sc4dndhf, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 4) (DNHA473, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // DNHA 473
-GAMEL( 200?, sc4dndhfj ,sc4dndhf, sc4_5reel_alt, sc4dndhf35, sc4_state, sc4dndhf, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 4) (DNHA476)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // DNHA 476
-GAMEL( 200?, sc4dndhfb ,sc4dndhf, sc4_5reel_alt, sc4dndhf35, sc4_state, sc4dndhf, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 4) (DNHA477, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // DNHA 477
-GAMEL( 200?, sc4dndhfd ,sc4dndhf, sc4_5reel_alt, sc4dndhf35, sc4_state, sc4dndhf, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 4) (DNHA477, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // DNHA 477
-GAMEL( 200?, sc4dndhfc ,sc4dndhf, sc4_5reel_alt, sc4dndhf70, sc4_state, sc4dndhf, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 4) (DNHA571, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // DNHA 571
-GAMEL( 200?, sc4dndhfe ,sc4dndhf, sc4_5reel_alt, sc4dndhf70, sc4_state, sc4dndhf, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 4) (DNHA571, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // DNHA 571
-GAMEL( 200?, sc4dndhfk ,sc4dndhf, sc4_5reel_alt, sc4dndhf70, sc4_state, sc4dndhf, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 4) (DNHA572, set 1, bad?)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // error 51 (bad rom?)
-GAMEL( 200?, sc4dndhfl ,sc4dndhf, sc4_5reel_alt, sc4dndhf70, sc4_state, sc4dndhf, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 4) (DNHA572, set 2, bad?)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // error 51 (bad rom?)
+GAMEL( 200?, sc4dndhff ,sc4dndhf, sc4_5reel_alt, sc4dndhf35, sc4_state, sc4dndhf, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 4) (DNHA471, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // DNHA 471
+GAMEL( 200?, sc4dndhfh ,sc4dndhf, sc4_5reel_alt, sc4dndhf35, sc4_state, sc4dndhf, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 4) (DNHA471, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // DNHA 471
+GAMEL( 200?, sc4dndhfg ,sc4dndhf, sc4_5reel_alt, sc4dndhf35, sc4_state, sc4dndhf, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 4) (DNHA472, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // DNHA 472
+GAMEL( 200?, sc4dndhfi ,sc4dndhf, sc4_5reel_alt, sc4dndhf35, sc4_state, sc4dndhf, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 4) (DNHA472, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // DNHA 472
+GAMEL( 200?, sc4dndhf ,0, sc4_5reel_alt, sc4dndhf35, sc4_state, sc4dndhf, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 4) (DNHA473, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // DNHA 473
+GAMEL( 200?, sc4dndhfa ,sc4dndhf, sc4_5reel_alt, sc4dndhf35, sc4_state, sc4dndhf, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 4) (DNHA473, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // DNHA 473
+GAMEL( 200?, sc4dndhfj ,sc4dndhf, sc4_5reel_alt, sc4dndhf35, sc4_state, sc4dndhf, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 4) (DNHA476)", MACHINE_FLAGS, layout_bfm_sc4 ) // DNHA 476
+GAMEL( 200?, sc4dndhfb ,sc4dndhf, sc4_5reel_alt, sc4dndhf35, sc4_state, sc4dndhf, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 4) (DNHA477, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // DNHA 477
+GAMEL( 200?, sc4dndhfd ,sc4dndhf, sc4_5reel_alt, sc4dndhf35, sc4_state, sc4dndhf, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 4) (DNHA477, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // DNHA 477
+GAMEL( 200?, sc4dndhfc ,sc4dndhf, sc4_5reel_alt, sc4dndhf70, sc4_state, sc4dndhf, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 4) (DNHA571, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // DNHA 571
+GAMEL( 200?, sc4dndhfe ,sc4dndhf, sc4_5reel_alt, sc4dndhf70, sc4_state, sc4dndhf, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 4) (DNHA571, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // DNHA 571
+GAMEL( 200?, sc4dndhfk ,sc4dndhf, sc4_5reel_alt, sc4dndhf70, sc4_state, sc4dndhf, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 4) (DNHA572, set 1, bad?)", MACHINE_FLAGS, layout_bfm_sc4 ) // error 51 (bad rom?)
+GAMEL( 200?, sc4dndhfl ,sc4dndhf, sc4_5reel_alt, sc4dndhf70, sc4_state, sc4dndhf, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 4) (DNHA572, set 2, bad?)", MACHINE_FLAGS, layout_bfm_sc4 ) // error 51 (bad rom?)
DRIVER_INIT_MEMBER(sc4_state,sc4dndys)
{
@@ -34645,10 +34647,10 @@ INPUT_PORTS_END
// PR3227 AWP DEAL OR NO DEAL ITS YOUR SHOW SCORP4 PR3207 ITS YOUR SHOW SOUNDS11 ITS YOUR SHOW S.SITE
-GAMEL( 200?, sc4dndys ,0, sc4_200_5rc, sc4dndys70, sc4_state, sc4dndys, ROT0, "BFM","Deal Or No Deal It's Your Show (Bellfruit) (Scorpion 4) (DOBO571, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // DOBO 571
-GAMEL( 200?, sc4dndysb ,sc4dndys, sc4_200_5rc, sc4dndys70, sc4_state, sc4dndys, ROT0, "BFM","Deal Or No Deal It's Your Show (Bellfruit) (Scorpion 4) (DOBO571, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // DOBO 571
-GAMEL( 200?, sc4dndysa ,sc4dndys, sc4_200_5rc, sc4dndys35, sc4_state, sc4dndys, ROT0, "BFM","Deal Or No Deal It's Your Show (Bellfruit) (Scorpion 4) (DOBO474, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // DOBO 474
-GAMEL( 200?, sc4dndysc ,sc4dndys, sc4_200_5rc, sc4dndys35, sc4_state, sc4dndys, ROT0, "BFM","Deal Or No Deal It's Your Show (Bellfruit) (Scorpion 4) (DOBO474, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // DOBO 474
+GAMEL( 200?, sc4dndys ,0, sc4_200_5rc, sc4dndys70, sc4_state, sc4dndys, ROT0, "BFM","Deal Or No Deal It's Your Show (Bellfruit) (Scorpion 4) (DOBO571, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // DOBO 571
+GAMEL( 200?, sc4dndysb ,sc4dndys, sc4_200_5rc, sc4dndys70, sc4_state, sc4dndys, ROT0, "BFM","Deal Or No Deal It's Your Show (Bellfruit) (Scorpion 4) (DOBO571, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // DOBO 571
+GAMEL( 200?, sc4dndysa ,sc4dndys, sc4_200_5rc, sc4dndys35, sc4_state, sc4dndys, ROT0, "BFM","Deal Or No Deal It's Your Show (Bellfruit) (Scorpion 4) (DOBO474, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // DOBO 474
+GAMEL( 200?, sc4dndysc ,sc4dndys, sc4_200_5rc, sc4dndys35, sc4_state, sc4dndys, ROT0, "BFM","Deal Or No Deal It's Your Show (Bellfruit) (Scorpion 4) (DOBO474, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // DOBO 474
DRIVER_INIT_MEMBER(sc4_state,sc4dndlp)
{
@@ -34737,12 +34739,12 @@ INPUT_PORTS_END
// PR3212 AWP DEAL OR NO DEAL LETS PLAY DEAL OR NO DEAL SCORP4 PR3212 LETS PLAY DOND SOUNDS11 LETS PLAY DOND S.SITE
-GAMEL( 200?, sc4dndlp ,0, sc4_5reel, sc4dndlp70, sc4_state, sc4dndlp, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 4) (LPDN571, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// LPDN 571
-GAMEL( 200?, sc4dndlpc ,sc4dndlp, sc4_5reel, sc4dndlp70, sc4_state, sc4dndlp, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 4) (LPDN571, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// LPDN 571
-GAMEL( 200?, sc4dndlpa ,sc4dndlp, sc4_5reel, sc4dndlp70, sc4_state, sc4dndlp, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 4) (LPDN572, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// LPDN 572
-GAMEL( 200?, sc4dndlpd ,sc4dndlp, sc4_5reel, sc4dndlp70, sc4_state, sc4dndlp, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 4) (LPDN572, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// LPDN 572
-GAMEL( 200?, sc4dndlpb ,sc4dndlp, sc4_5reel, sc4dndlp70, sc4_state, sc4dndlp, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 4) (LPDN573, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// LPDN 573
-GAMEL( 200?, sc4dndlpe ,sc4dndlp, sc4_5reel, sc4dndlp70, sc4_state, sc4dndlp, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 4) (LPDN573, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// LPDN 573
+GAMEL( 200?, sc4dndlp ,0, sc4_5reel, sc4dndlp70, sc4_state, sc4dndlp, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 4) (LPDN571, set 1)", MACHINE_FLAGS, layout_bfm_sc4 )// LPDN 571
+GAMEL( 200?, sc4dndlpc ,sc4dndlp, sc4_5reel, sc4dndlp70, sc4_state, sc4dndlp, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 4) (LPDN571, set 2)", MACHINE_FLAGS, layout_bfm_sc4 )// LPDN 571
+GAMEL( 200?, sc4dndlpa ,sc4dndlp, sc4_5reel, sc4dndlp70, sc4_state, sc4dndlp, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 4) (LPDN572, set 1)", MACHINE_FLAGS, layout_bfm_sc4 )// LPDN 572
+GAMEL( 200?, sc4dndlpd ,sc4dndlp, sc4_5reel, sc4dndlp70, sc4_state, sc4dndlp, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 4) (LPDN572, set 2)", MACHINE_FLAGS, layout_bfm_sc4 )// LPDN 572
+GAMEL( 200?, sc4dndlpb ,sc4dndlp, sc4_5reel, sc4dndlp70, sc4_state, sc4dndlp, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 4) (LPDN573, set 1)", MACHINE_FLAGS, layout_bfm_sc4 )// LPDN 573
+GAMEL( 200?, sc4dndlpe ,sc4dndlp, sc4_5reel, sc4dndlp70, sc4_state, sc4dndlp, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 4) (LPDN573, set 2)", MACHINE_FLAGS, layout_bfm_sc4 )// LPDN 573
DRIVER_INIT_MEMBER(sc4_state,sc4dndra)
{
@@ -34830,12 +34832,12 @@ INPUT_PORTS_START( sc4dndra70 )
INPUT_PORTS_END
// PR3221 AWP DEAL OR NO DEAL RED ALERT SCORP4 PR3201 DOND RED ALERT SOUNDS11 RED ALERT S.SITE
-GAMEL( 200?, sc4dndra ,0, sc4_5reel_alt, sc4dndra35, sc4_state, sc4dndra, ROT0, "BFM","Deal Or No Deal Red Alert (Bellfruit) (Scorpion 4) (REDT471, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // REDT 471
-GAMEL( 200?, sc4dndraa ,sc4dndra, sc4_5reel_alt, sc4dndra35, sc4_state, sc4dndra, ROT0, "BFM","Deal Or No Deal Red Alert (Bellfruit) (Scorpion 4) (REDT471, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // REDT 471
-GAMEL( 200?, sc4dndrab ,sc4dndra, sc4_5reel_alt, sc4dndra35, sc4_state, sc4dndra, ROT0, "BFM","Deal Or No Deal Red Alert (Bellfruit) (Scorpion 4) (REDT474, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // REDT 474
-GAMEL( 200?, sc4dndrad ,sc4dndra, sc4_5reel_alt, sc4dndra35, sc4_state, sc4dndra, ROT0, "BFM","Deal Or No Deal Red Alert (Bellfruit) (Scorpion 4) (REDT474, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // REDT 474
-GAMEL( 200?, sc4dndrac ,sc4dndra, sc4_5reel_alt, sc4dndra70, sc4_state, sc4dndra, ROT0, "BFM","Deal Or No Deal Red Alert (Bellfruit) (Scorpion 4) (REDT572, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // REDT 572
-GAMEL( 200?, sc4dndrae ,sc4dndra, sc4_5reel_alt, sc4dndra70, sc4_state, sc4dndra, ROT0, "BFM","Deal Or No Deal Red Alert (Bellfruit) (Scorpion 4) (REDT572, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // REDT 572
+GAMEL( 200?, sc4dndra ,0, sc4_5reel_alt, sc4dndra35, sc4_state, sc4dndra, ROT0, "BFM","Deal Or No Deal Red Alert (Bellfruit) (Scorpion 4) (REDT471, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // REDT 471
+GAMEL( 200?, sc4dndraa ,sc4dndra, sc4_5reel_alt, sc4dndra35, sc4_state, sc4dndra, ROT0, "BFM","Deal Or No Deal Red Alert (Bellfruit) (Scorpion 4) (REDT471, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // REDT 471
+GAMEL( 200?, sc4dndrab ,sc4dndra, sc4_5reel_alt, sc4dndra35, sc4_state, sc4dndra, ROT0, "BFM","Deal Or No Deal Red Alert (Bellfruit) (Scorpion 4) (REDT474, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // REDT 474
+GAMEL( 200?, sc4dndrad ,sc4dndra, sc4_5reel_alt, sc4dndra35, sc4_state, sc4dndra, ROT0, "BFM","Deal Or No Deal Red Alert (Bellfruit) (Scorpion 4) (REDT474, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // REDT 474
+GAMEL( 200?, sc4dndrac ,sc4dndra, sc4_5reel_alt, sc4dndra70, sc4_state, sc4dndra, ROT0, "BFM","Deal Or No Deal Red Alert (Bellfruit) (Scorpion 4) (REDT572, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // REDT 572
+GAMEL( 200?, sc4dndrae ,sc4dndra, sc4_5reel_alt, sc4dndra70, sc4_state, sc4dndra, ROT0, "BFM","Deal Or No Deal Red Alert (Bellfruit) (Scorpion 4) (REDT572, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // REDT 572
DRIVER_INIT_MEMBER(sc4_state,sc4dndbd)
@@ -34926,12 +34928,12 @@ INPUT_PORTS_END
// PR3230 AWP DEAL OR NO DEAL THE BIG DEAL SCORP4 PR3210 THE BIG DEAL SOUNDS11 THE BIG DEAL S.SITE
-GAMEL( 200?, sc4dndbd ,0, sc4_5reel, sc4dndbd35, sc4_state, sc4dndbd, ROT0, "BFM","Deal Or No Deal The Big Deal (Bellfruit) (Scorpion 4) (BGDA471, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // BGDA 471
-GAMEL( 200?, sc4dndbda ,sc4dndbd, sc4_5reel, sc4dndbd35, sc4_state, sc4dndbd, ROT0, "BFM","Deal Or No Deal The Big Deal (Bellfruit) (Scorpion 4) (BGDA471, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // BGDA 471
-GAMEL( 200?, sc4dndbdb ,sc4dndbd, sc4_5reel, sc4dndbd35, sc4_state, sc4dndbd, ROT0, "BFM","Deal Or No Deal The Big Deal (Bellfruit) (Scorpion 4) (BGDA472, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // BGDA 472
-GAMEL( 200?, sc4dndbdd ,sc4dndbd, sc4_5reel, sc4dndbd35, sc4_state, sc4dndbd, ROT0, "BFM","Deal Or No Deal The Big Deal (Bellfruit) (Scorpion 4) (BGDA472, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // BGDA 472
-GAMEL( 200?, sc4dndbdc ,sc4dndbd, sc4_5reel, sc4dndbd70, sc4_state, sc4dndbd, ROT0, "BFM","Deal Or No Deal The Big Deal (Bellfruit) (Scorpion 4) (BGDA571, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // BGDA 571
-GAMEL( 200?, sc4dndbde ,sc4dndbd, sc4_5reel, sc4dndbd70, sc4_state, sc4dndbd, ROT0, "BFM","Deal Or No Deal The Big Deal (Bellfruit) (Scorpion 4) (BGDA571, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // BGDA 571
+GAMEL( 200?, sc4dndbd ,0, sc4_5reel, sc4dndbd35, sc4_state, sc4dndbd, ROT0, "BFM","Deal Or No Deal The Big Deal (Bellfruit) (Scorpion 4) (BGDA471, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // BGDA 471
+GAMEL( 200?, sc4dndbda ,sc4dndbd, sc4_5reel, sc4dndbd35, sc4_state, sc4dndbd, ROT0, "BFM","Deal Or No Deal The Big Deal (Bellfruit) (Scorpion 4) (BGDA471, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // BGDA 471
+GAMEL( 200?, sc4dndbdb ,sc4dndbd, sc4_5reel, sc4dndbd35, sc4_state, sc4dndbd, ROT0, "BFM","Deal Or No Deal The Big Deal (Bellfruit) (Scorpion 4) (BGDA472, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // BGDA 472
+GAMEL( 200?, sc4dndbdd ,sc4dndbd, sc4_5reel, sc4dndbd35, sc4_state, sc4dndbd, ROT0, "BFM","Deal Or No Deal The Big Deal (Bellfruit) (Scorpion 4) (BGDA472, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // BGDA 472
+GAMEL( 200?, sc4dndbdc ,sc4dndbd, sc4_5reel, sc4dndbd70, sc4_state, sc4dndbd, ROT0, "BFM","Deal Or No Deal The Big Deal (Bellfruit) (Scorpion 4) (BGDA571, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // BGDA 571
+GAMEL( 200?, sc4dndbde ,sc4dndbd, sc4_5reel, sc4dndbd70, sc4_state, sc4dndbd, ROT0, "BFM","Deal Or No Deal The Big Deal (Bellfruit) (Scorpion 4) (BGDA571, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // BGDA 571
DRIVER_INIT_MEMBER(sc4_state,sc4dndbr)
@@ -35019,14 +35021,14 @@ INPUT_PORTS_END
// PR3041 AWP DEAL OR NO DEAL THE BIG REDS S4 PR3011 THE BIG REDS SOUNDS11 THE BIG REDS S.SITE
-GAMEL( 200?, sc4dndbr ,0, sc4_5reel_alt, sc4dndbr35, sc4_state, sc4dndbr, ROT0, "BFM","Deal Or No Deal The Big Reds (Bellfruit) (Scorpion 4) (BIGD471, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // BIGD 471
-GAMEL( 200?, sc4dndbrb ,sc4dndbr, sc4_5reel_alt, sc4dndbr35, sc4_state, sc4dndbr, ROT0, "BFM","Deal Or No Deal The Big Reds (Bellfruit) (Scorpion 4) (BIGD471, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // BIGD 471
-GAMEL( 200?, sc4dndbra ,sc4dndbr, sc4_5reel_alt, sc4dndbr35, sc4_state, sc4dndbr, ROT0, "BFM","Deal Or No Deal The Big Reds (Bellfruit) (Scorpion 4) (BIGD472, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // BIGD 472
-GAMEL( 200?, sc4dndbrc ,sc4dndbr, sc4_5reel_alt, sc4dndbr35, sc4_state, sc4dndbr, ROT0, "BFM","Deal Or No Deal The Big Reds (Bellfruit) (Scorpion 4) (BIGD472, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // BIGD 472
-GAMEL( 200?, sc4dndbrd ,sc4dndbr, sc4_5reel_alt, sc4dndbr35, sc4_state, sc4dndbr, ROT0, "BFM","Deal Or No Deal The Big Reds (Bellfruit) (Scorpion 4) (BIGD475, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // BIGD 475
-GAMEL( 200?, sc4dndbrf ,sc4dndbr, sc4_5reel_alt, sc4dndbr35, sc4_state, sc4dndbr, ROT0, "BFM","Deal Or No Deal The Big Reds (Bellfruit) (Scorpion 4) (BIGD475, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // BIGD 475
-GAMEL( 200?, sc4dndbre ,sc4dndbr, sc4_5reel_alt, sc4dndbr70, sc4_state, sc4dndbr, ROT0, "BFM","Deal Or No Deal The Big Reds (Bellfruit) (Scorpion 4) (BIGD571, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // BIGD 571
-GAMEL( 200?, sc4dndbrg ,sc4dndbr, sc4_5reel_alt, sc4dndbr70, sc4_state, sc4dndbr, ROT0, "BFM","Deal Or No Deal The Big Reds (Bellfruit) (Scorpion 4) (BIGD571, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // BIGD 571
+GAMEL( 200?, sc4dndbr ,0, sc4_5reel_alt, sc4dndbr35, sc4_state, sc4dndbr, ROT0, "BFM","Deal Or No Deal The Big Reds (Bellfruit) (Scorpion 4) (BIGD471, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // BIGD 471
+GAMEL( 200?, sc4dndbrb ,sc4dndbr, sc4_5reel_alt, sc4dndbr35, sc4_state, sc4dndbr, ROT0, "BFM","Deal Or No Deal The Big Reds (Bellfruit) (Scorpion 4) (BIGD471, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // BIGD 471
+GAMEL( 200?, sc4dndbra ,sc4dndbr, sc4_5reel_alt, sc4dndbr35, sc4_state, sc4dndbr, ROT0, "BFM","Deal Or No Deal The Big Reds (Bellfruit) (Scorpion 4) (BIGD472, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // BIGD 472
+GAMEL( 200?, sc4dndbrc ,sc4dndbr, sc4_5reel_alt, sc4dndbr35, sc4_state, sc4dndbr, ROT0, "BFM","Deal Or No Deal The Big Reds (Bellfruit) (Scorpion 4) (BIGD472, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // BIGD 472
+GAMEL( 200?, sc4dndbrd ,sc4dndbr, sc4_5reel_alt, sc4dndbr35, sc4_state, sc4dndbr, ROT0, "BFM","Deal Or No Deal The Big Reds (Bellfruit) (Scorpion 4) (BIGD475, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // BIGD 475
+GAMEL( 200?, sc4dndbrf ,sc4dndbr, sc4_5reel_alt, sc4dndbr35, sc4_state, sc4dndbr, ROT0, "BFM","Deal Or No Deal The Big Reds (Bellfruit) (Scorpion 4) (BIGD475, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // BIGD 475
+GAMEL( 200?, sc4dndbre ,sc4dndbr, sc4_5reel_alt, sc4dndbr70, sc4_state, sc4dndbr, ROT0, "BFM","Deal Or No Deal The Big Reds (Bellfruit) (Scorpion 4) (BIGD571, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // BIGD 571
+GAMEL( 200?, sc4dndbrg ,sc4dndbr, sc4_5reel_alt, sc4dndbr70, sc4_state, sc4dndbr, ROT0, "BFM","Deal Or No Deal The Big Reds (Bellfruit) (Scorpion 4) (BIGD571, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // BIGD 571
DRIVER_INIT_MEMBER(sc4_state,sc4dndcc)
@@ -35117,13 +35119,13 @@ INPUT_PORTS_END
// PR3047 AWP DEAL OR NO DEAL THE CRAZY CHAIR SCORP4 PR3017 CRAZY CHAIR SOUNDS11 CRAZY CHAIR S.SITE
-GAMEL( 200?, sc4dndcc ,0, sc4_5reel, sc4dndcc35, sc4_state, sc4dndcc, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 4) (CRZR471, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // CRZR 471
-GAMEL( 200?, sc4dndccb ,sc4dndcc, sc4_5reel, sc4dndcc35, sc4_state, sc4dndcc, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 4) (CRZR471, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // CRZR 471, incomplete pairing
-GAMEL( 200?, sc4dndcca ,sc4dndcc, sc4_5reel, sc4dndcc35, sc4_state, sc4dndcc, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 4) (CRZR474)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // CRZR 474
-GAMEL( 200?, sc4dndccc ,sc4dndcc, sc4_5reel, sc4dndcc35, sc4_state, sc4dndcc, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 4) (CRZR475, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // CRZR 475
-GAMEL( 200?, sc4dndcce ,sc4dndcc, sc4_5reel, sc4dndcc35, sc4_state, sc4dndcc, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 4) (CRZR475, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // CRZR 475
-GAMEL( 200?, sc4dndccd ,sc4dndcc, sc4_5reel, sc4dndcc70, sc4_state, sc4dndcc, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 4) (CRZR571, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // CRZR 571
-GAMEL( 200?, sc4dndccf ,sc4dndcc, sc4_5reel, sc4dndcc70, sc4_state, sc4dndcc, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 4) (CRZR571, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // CRZR 571
+GAMEL( 200?, sc4dndcc ,0, sc4_5reel, sc4dndcc35, sc4_state, sc4dndcc, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 4) (CRZR471, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // CRZR 471
+GAMEL( 200?, sc4dndccb ,sc4dndcc, sc4_5reel, sc4dndcc35, sc4_state, sc4dndcc, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 4) (CRZR471, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // CRZR 471, incomplete pairing
+GAMEL( 200?, sc4dndcca ,sc4dndcc, sc4_5reel, sc4dndcc35, sc4_state, sc4dndcc, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 4) (CRZR474)", MACHINE_FLAGS, layout_bfm_sc4 ) // CRZR 474
+GAMEL( 200?, sc4dndccc ,sc4dndcc, sc4_5reel, sc4dndcc35, sc4_state, sc4dndcc, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 4) (CRZR475, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // CRZR 475
+GAMEL( 200?, sc4dndcce ,sc4dndcc, sc4_5reel, sc4dndcc35, sc4_state, sc4dndcc, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 4) (CRZR475, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // CRZR 475
+GAMEL( 200?, sc4dndccd ,sc4dndcc, sc4_5reel, sc4dndcc70, sc4_state, sc4dndcc, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 4) (CRZR571, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // CRZR 571
+GAMEL( 200?, sc4dndccf ,sc4dndcc, sc4_5reel, sc4dndcc70, sc4_state, sc4dndcc, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 4) (CRZR571, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // CRZR 571
DRIVER_INIT_MEMBER(sc4_state,sc4dnddw)
{
@@ -35212,14 +35214,14 @@ INPUT_PORTS_START( sc4dnddw70 )
INPUT_PORTS_END
// PR3043 AWP THE DEAL WHEEL S4 PR3202 THE DEAL WHEEL SOUNDS11 THE DEAL WHEEL S.SITE
-GAMEL( 200?, sc4dnddw ,0, sc4_200_5ra, sc4dnddw35, sc4_state, sc4dnddw, ROT0, "BFM","Deal Or No Deal The Deal Wheel (Bellfruit) (Scorpion 4) (DOFN471, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4dnddw ) // DOFN 471
-GAMEL( 200?, sc4dnddwb ,sc4dnddw, sc4_200_5ra, sc4dnddw35, sc4_state, sc4dnddw, ROT0, "BFM","Deal Or No Deal The Deal Wheel (Bellfruit) (Scorpion 4) (DOFN471, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4dnddw ) // DOFN 471
-GAMEL( 200?, sc4dnddwa ,sc4dnddw, sc4_200_5ra, sc4dnddw35, sc4_state, sc4dnddw, ROT0, "BFM","Deal Or No Deal The Deal Wheel (Bellfruit) (Scorpion 4) (DOFN473, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4dnddw ) // DOFN 473
-GAMEL( 200?, sc4dnddwc ,sc4dnddw, sc4_200_5ra, sc4dnddw35, sc4_state, sc4dnddw, ROT0, "BFM","Deal Or No Deal The Deal Wheel (Bellfruit) (Scorpion 4) (DOFN473, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4dnddw ) // DOFN 473
-GAMEL( 200?, sc4dnddwd ,sc4dnddw, sc4_200_5ra, sc4dnddw35, sc4_state, sc4dnddw, ROT0, "BFM","Deal Or No Deal The Deal Wheel (Bellfruit) (Scorpion 4) (DOFN475, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4dnddw ) // DOFN 475
-GAMEL( 200?, sc4dnddwf ,sc4dnddw, sc4_200_5ra, sc4dnddw35, sc4_state, sc4dnddw, ROT0, "BFM","Deal Or No Deal The Deal Wheel (Bellfruit) (Scorpion 4) (DOFN475, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4dnddw ) // DOFN 475
-GAMEL( 200?, sc4dnddwe ,sc4dnddw, sc4_200_5ra, sc4dnddw70, sc4_state, sc4dnddw, ROT0, "BFM","Deal Or No Deal The Deal Wheel (Bellfruit) (Scorpion 4) (DOFN572, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4dnddw ) // DOFN 572
-GAMEL( 200?, sc4dnddwg ,sc4dnddw, sc4_200_5ra, sc4dnddw70, sc4_state, sc4dnddw, ROT0, "BFM","Deal Or No Deal The Deal Wheel (Bellfruit) (Scorpion 4) (DOFN572, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4dnddw ) // DOFN 572
+GAMEL( 200?, sc4dnddw ,0, sc4_200_5ra, sc4dnddw35, sc4_state, sc4dnddw, ROT0, "BFM","Deal Or No Deal The Deal Wheel (Bellfruit) (Scorpion 4) (DOFN471, set 1)", MACHINE_FLAGS, layout_sc4dnddw ) // DOFN 471
+GAMEL( 200?, sc4dnddwb ,sc4dnddw, sc4_200_5ra, sc4dnddw35, sc4_state, sc4dnddw, ROT0, "BFM","Deal Or No Deal The Deal Wheel (Bellfruit) (Scorpion 4) (DOFN471, set 2)", MACHINE_FLAGS, layout_sc4dnddw ) // DOFN 471
+GAMEL( 200?, sc4dnddwa ,sc4dnddw, sc4_200_5ra, sc4dnddw35, sc4_state, sc4dnddw, ROT0, "BFM","Deal Or No Deal The Deal Wheel (Bellfruit) (Scorpion 4) (DOFN473, set 1)", MACHINE_FLAGS, layout_sc4dnddw ) // DOFN 473
+GAMEL( 200?, sc4dnddwc ,sc4dnddw, sc4_200_5ra, sc4dnddw35, sc4_state, sc4dnddw, ROT0, "BFM","Deal Or No Deal The Deal Wheel (Bellfruit) (Scorpion 4) (DOFN473, set 2)", MACHINE_FLAGS, layout_sc4dnddw ) // DOFN 473
+GAMEL( 200?, sc4dnddwd ,sc4dnddw, sc4_200_5ra, sc4dnddw35, sc4_state, sc4dnddw, ROT0, "BFM","Deal Or No Deal The Deal Wheel (Bellfruit) (Scorpion 4) (DOFN475, set 1)", MACHINE_FLAGS, layout_sc4dnddw ) // DOFN 475
+GAMEL( 200?, sc4dnddwf ,sc4dnddw, sc4_200_5ra, sc4dnddw35, sc4_state, sc4dnddw, ROT0, "BFM","Deal Or No Deal The Deal Wheel (Bellfruit) (Scorpion 4) (DOFN475, set 2)", MACHINE_FLAGS, layout_sc4dnddw ) // DOFN 475
+GAMEL( 200?, sc4dnddwe ,sc4dnddw, sc4_200_5ra, sc4dnddw70, sc4_state, sc4dnddw, ROT0, "BFM","Deal Or No Deal The Deal Wheel (Bellfruit) (Scorpion 4) (DOFN572, set 1)", MACHINE_FLAGS, layout_sc4dnddw ) // DOFN 572
+GAMEL( 200?, sc4dnddwg ,sc4dnddw, sc4_200_5ra, sc4dnddw70, sc4_state, sc4dnddw, ROT0, "BFM","Deal Or No Deal The Deal Wheel (Bellfruit) (Scorpion 4) (DOFN572, set 2)", MACHINE_FLAGS, layout_sc4dnddw ) // DOFN 572
DRIVER_INIT_MEMBER(sc4_state,sc4dnddf)
{
@@ -35305,12 +35307,12 @@ INPUT_PORTS_START( sc4dnddf70 )
INPUT_PORTS_END
// PR3044 AWP DEAL OR NO DEAL THE DREAM FACTORY SCORP4 PR3014 DREAM FACTORY SOUNDS11 DREAM FACTORY S.SITE
-GAMEL( 200?, sc4dnddf ,0, sc4_200_alt, sc4dnddf35, sc4_state, sc4dnddf, ROT0, "BFM","Deal Or No Deal The Dream Factory (Bellfruit) (Scorpion 4) (TDFC471, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // TDFC 471
-GAMEL( 200?, sc4dnddfa ,sc4dnddf, sc4_200_alt, sc4dnddf35, sc4_state, sc4dnddf, ROT0, "BFM","Deal Or No Deal The Dream Factory (Bellfruit) (Scorpion 4) (TDFC471, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // TDFC 471, incomplete pairing
-GAMEL( 200?, sc4dnddfb ,sc4dnddf, sc4_200_alt, sc4dnddf35, sc4_state, sc4dnddf, ROT0, "BFM","Deal Or No Deal The Dream Factory (Bellfruit) (Scorpion 4) (TDFC475, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // TDFC 475
-GAMEL( 200?, sc4dnddfd ,sc4dnddf, sc4_200_alt, sc4dnddf35, sc4_state, sc4dnddf, ROT0, "BFM","Deal Or No Deal The Dream Factory (Bellfruit) (Scorpion 4) (TDFC475, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // TDFC 475
-GAMEL( 200?, sc4dnddfc ,sc4dnddf, sc4_200_alt, sc4dnddf70, sc4_state, sc4dnddf, ROT0, "BFM","Deal Or No Deal The Dream Factory (Bellfruit) (Scorpion 4) (TDFC571, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // TDFC 571
-GAMEL( 200?, sc4dnddfe ,sc4dnddf, sc4_200_alt, sc4dnddf70, sc4_state, sc4dnddf, ROT0, "BFM","Deal Or No Deal The Dream Factory (Bellfruit) (Scorpion 4) (TDFC571, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // TDFC 571
+GAMEL( 200?, sc4dnddf ,0, sc4_200_alt, sc4dnddf35, sc4_state, sc4dnddf, ROT0, "BFM","Deal Or No Deal The Dream Factory (Bellfruit) (Scorpion 4) (TDFC471, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // TDFC 471
+GAMEL( 200?, sc4dnddfa ,sc4dnddf, sc4_200_alt, sc4dnddf35, sc4_state, sc4dnddf, ROT0, "BFM","Deal Or No Deal The Dream Factory (Bellfruit) (Scorpion 4) (TDFC471, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // TDFC 471, incomplete pairing
+GAMEL( 200?, sc4dnddfb ,sc4dnddf, sc4_200_alt, sc4dnddf35, sc4_state, sc4dnddf, ROT0, "BFM","Deal Or No Deal The Dream Factory (Bellfruit) (Scorpion 4) (TDFC475, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // TDFC 475
+GAMEL( 200?, sc4dnddfd ,sc4dnddf, sc4_200_alt, sc4dnddf35, sc4_state, sc4dnddf, ROT0, "BFM","Deal Or No Deal The Dream Factory (Bellfruit) (Scorpion 4) (TDFC475, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // TDFC 475
+GAMEL( 200?, sc4dnddfc ,sc4dnddf, sc4_200_alt, sc4dnddf70, sc4_state, sc4dnddf, ROT0, "BFM","Deal Or No Deal The Dream Factory (Bellfruit) (Scorpion 4) (TDFC571, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // TDFC 571
+GAMEL( 200?, sc4dnddfe ,sc4dnddf, sc4_200_alt, sc4dnddf70, sc4_state, sc4dnddf, ROT0, "BFM","Deal Or No Deal The Dream Factory (Bellfruit) (Scorpion 4) (TDFC571, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // TDFC 571
DRIVER_INIT_MEMBER(sc4_state,sc4dndpg)
@@ -35401,12 +35403,12 @@ INPUT_PORTS_END
// PR3240 AWP DEAL OR NO DEAL THE PERFECT GAME SCORP4 PR3220 DOND PERFECT SOUNDS11 THE PERFECT GAME S.SITE
-GAMEL( 200?, sc4dndpg ,0, sc4_5reel, sc4dndpg35, sc4_state, sc4dndpg, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 4) (TPBG471, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // TPGB 471
-GAMEL( 200?, sc4dndpgc ,sc4dndpg, sc4_5reel, sc4dndpg35, sc4_state, sc4dndpg, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 4) (TPBG471, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // TPBG 471
-GAMEL( 200?, sc4dndpga ,sc4dndpg, sc4_5reel, sc4dndpg70, sc4_state, sc4dndpg, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 4) (TPBG571, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // TPGB 571
-GAMEL( 200?, sc4dndpgd ,sc4dndpg, sc4_5reel, sc4dndpg70, sc4_state, sc4dndpg, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 4) (TPGB571, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // TPGB 571
-GAMEL( 200?, sc4dndpgb ,sc4dndpg, sc4_5reel, sc4dndpg70, sc4_state, sc4dndpg, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 4) (TPBG572, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // TPGB 572
-GAMEL( 200?, sc4dndpge ,sc4dndpg, sc4_5reel, sc4dndpg70, sc4_state, sc4dndpg, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 4) (TPGB572, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // TPGB 572
+GAMEL( 200?, sc4dndpg ,0, sc4_5reel, sc4dndpg35, sc4_state, sc4dndpg, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 4) (TPBG471, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // TPGB 471
+GAMEL( 200?, sc4dndpgc ,sc4dndpg, sc4_5reel, sc4dndpg35, sc4_state, sc4dndpg, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 4) (TPBG471, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // TPBG 471
+GAMEL( 200?, sc4dndpga ,sc4dndpg, sc4_5reel, sc4dndpg70, sc4_state, sc4dndpg, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 4) (TPBG571, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // TPGB 571
+GAMEL( 200?, sc4dndpgd ,sc4dndpg, sc4_5reel, sc4dndpg70, sc4_state, sc4dndpg, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 4) (TPGB571, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // TPGB 571
+GAMEL( 200?, sc4dndpgb ,sc4dndpg, sc4_5reel, sc4dndpg70, sc4_state, sc4dndpg, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 4) (TPBG572, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // TPGB 572
+GAMEL( 200?, sc4dndpge ,sc4dndpg, sc4_5reel, sc4dndpg70, sc4_state, sc4dndpg, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 4) (TPGB572, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // TPGB 572
DRIVER_INIT_MEMBER(sc4_state,sc4dndtp)
@@ -35483,20 +35485,20 @@ INPUT_PORTS_START( sc4dndtp35 )
INPUT_PORTS_END
// PR3033 AWP DOND THE POWER 5 SCORP4 PR3033 POWER FIVE SOUNDS11 DOND THE POWER 5 S.SITE
-GAMEL( 200?, sc4dndtp ,0, sc4_5reel, sc4dndtp35, sc4_state, sc4dndtp, ROT0, "BFM","Deal Or No Deal The Power 5 (Bellfruit) (Scorpion 4) (TPRV411, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4dndtp ) // TPRV 411
-GAMEL( 200?, sc4dndtpe ,sc4dndtp, sc4_5reel, sc4dndtp35, sc4_state, sc4dndtp, ROT0, "BFM","Deal Or No Deal The Power 5 (Bellfruit) (Scorpion 4) (TPRV411, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4dndtp ) // TPRV 411
-GAMEL( 200?, sc4dndtpa ,sc4dndtp, sc4_5reel, sc4dndtp35, sc4_state, sc4dndtp, ROT0, "BFM","Deal Or No Deal The Power 5 (Bellfruit) (Scorpion 4) (TPRV412, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4dndtp ) // TPRV 412
-GAMEL( 200?, sc4dndtpf ,sc4dndtp, sc4_5reel, sc4dndtp35, sc4_state, sc4dndtp, ROT0, "BFM","Deal Or No Deal The Power 5 (Bellfruit) (Scorpion 4) (TPRV412, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4dndtp ) // TPRV 412
-GAMEL( 200?, sc4dndtpb ,sc4dndtp, sc4_5reel, sc4dndtp35, sc4_state, sc4dndtp, ROT0, "BFM","Deal Or No Deal The Power 5 (Bellfruit) (Scorpion 4) (TPRV413, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4dndtp ) // TPRV 413
-GAMEL( 200?, sc4dndtpg ,sc4dndtp, sc4_5reel, sc4dndtp35, sc4_state, sc4dndtp, ROT0, "BFM","Deal Or No Deal The Power 5 (Bellfruit) (Scorpion 4) (TPRV413, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4dndtp ) // TPRV 413
-GAMEL( 200?, sc4dndtpc ,sc4dndtp, sc4_5reel, sc4dndtp35, sc4_state, sc4dndtp, ROT0, "BFM","Deal Or No Deal The Power 5 (Bellfruit) (Scorpion 4) (TPRV414, set 1, bad)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4dndtp ) // TPRV 414 EEPROM error (bad rom?) (botched release?)
-GAMEL( 200?, sc4dndtph ,sc4dndtp, sc4_5reel, sc4dndtp35, sc4_state, sc4dndtp, ROT0, "BFM","Deal Or No Deal The Power 5 (Bellfruit) (Scorpion 4) (TPRV414, set 2, bad)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4dndtp ) // TPRV 414 EEPROM error (bad rom?) (botched release?)
-GAMEL( 200?, sc4dndtpd ,sc4dndtp, sc4_5reel, sc4dndtp35, sc4_state, sc4dndtp, ROT0, "BFM","Deal Or No Deal The Power 5 (Bellfruit) (Scorpion 4) (TPRV415, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4dndtp ) // TPRV 415
-GAMEL( 200?, sc4dndtpi ,sc4dndtp, sc4_5reel, sc4dndtp35, sc4_state, sc4dndtp, ROT0, "BFM","Deal Or No Deal The Power 5 (Bellfruit) (Scorpion 4) (TPRV415, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4dndtp )// TPRV 415
-GAMEL( 200?, sc4dndtpl ,sc4dndtp, sc4_5reel, sc4dndtp35, sc4_state, sc4dndtp, ROT0, "BFM","Deal Or No Deal The Power 5 (Bellfruit) (Scorpion 4) (TPRV416, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4dndtp )// TPRV 416
-GAMEL( 200?, sc4dndtpm ,sc4dndtp, sc4_5reel, sc4dndtp35, sc4_state, sc4dndtp, ROT0, "BFM","Deal Or No Deal The Power 5 (Bellfruit) (Scorpion 4) (TPRV416, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4dndtp )// TPRV 416
-GAMEL( 200?, sc4dndtpj ,sc4dndtp, sc4_5reel, sc4dndtp35, sc4_state, sc4dndtp, ROT0, "BFM","Deal Or No Deal The Power 5 (Bellfruit) (Scorpion 4) (TPRV41A, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4dndtp )// TPRV 41A
-GAMEL( 200?, sc4dndtpk ,sc4dndtp, sc4_5reel, sc4dndtp35, sc4_state, sc4dndtp, ROT0, "BFM","Deal Or No Deal The Power 5 (Bellfruit) (Scorpion 4) (TPRV41A, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4dndtp )// TPRV 41A
+GAMEL( 200?, sc4dndtp ,0, sc4_5reel, sc4dndtp35, sc4_state, sc4dndtp, ROT0, "BFM","Deal Or No Deal The Power 5 (Bellfruit) (Scorpion 4) (TPRV411, set 1)", MACHINE_FLAGS, layout_sc4dndtp ) // TPRV 411
+GAMEL( 200?, sc4dndtpe ,sc4dndtp, sc4_5reel, sc4dndtp35, sc4_state, sc4dndtp, ROT0, "BFM","Deal Or No Deal The Power 5 (Bellfruit) (Scorpion 4) (TPRV411, set 2)", MACHINE_FLAGS, layout_sc4dndtp ) // TPRV 411
+GAMEL( 200?, sc4dndtpa ,sc4dndtp, sc4_5reel, sc4dndtp35, sc4_state, sc4dndtp, ROT0, "BFM","Deal Or No Deal The Power 5 (Bellfruit) (Scorpion 4) (TPRV412, set 1)", MACHINE_FLAGS, layout_sc4dndtp ) // TPRV 412
+GAMEL( 200?, sc4dndtpf ,sc4dndtp, sc4_5reel, sc4dndtp35, sc4_state, sc4dndtp, ROT0, "BFM","Deal Or No Deal The Power 5 (Bellfruit) (Scorpion 4) (TPRV412, set 2)", MACHINE_FLAGS, layout_sc4dndtp ) // TPRV 412
+GAMEL( 200?, sc4dndtpb ,sc4dndtp, sc4_5reel, sc4dndtp35, sc4_state, sc4dndtp, ROT0, "BFM","Deal Or No Deal The Power 5 (Bellfruit) (Scorpion 4) (TPRV413, set 1)", MACHINE_FLAGS, layout_sc4dndtp ) // TPRV 413
+GAMEL( 200?, sc4dndtpg ,sc4dndtp, sc4_5reel, sc4dndtp35, sc4_state, sc4dndtp, ROT0, "BFM","Deal Or No Deal The Power 5 (Bellfruit) (Scorpion 4) (TPRV413, set 2)", MACHINE_FLAGS, layout_sc4dndtp ) // TPRV 413
+GAMEL( 200?, sc4dndtpc ,sc4dndtp, sc4_5reel, sc4dndtp35, sc4_state, sc4dndtp, ROT0, "BFM","Deal Or No Deal The Power 5 (Bellfruit) (Scorpion 4) (TPRV414, set 1, bad)", MACHINE_FLAGS, layout_sc4dndtp ) // TPRV 414 EEPROM error (bad rom?) (botched release?)
+GAMEL( 200?, sc4dndtph ,sc4dndtp, sc4_5reel, sc4dndtp35, sc4_state, sc4dndtp, ROT0, "BFM","Deal Or No Deal The Power 5 (Bellfruit) (Scorpion 4) (TPRV414, set 2, bad)", MACHINE_FLAGS, layout_sc4dndtp ) // TPRV 414 EEPROM error (bad rom?) (botched release?)
+GAMEL( 200?, sc4dndtpd ,sc4dndtp, sc4_5reel, sc4dndtp35, sc4_state, sc4dndtp, ROT0, "BFM","Deal Or No Deal The Power 5 (Bellfruit) (Scorpion 4) (TPRV415, set 1)", MACHINE_FLAGS, layout_sc4dndtp ) // TPRV 415
+GAMEL( 200?, sc4dndtpi ,sc4dndtp, sc4_5reel, sc4dndtp35, sc4_state, sc4dndtp, ROT0, "BFM","Deal Or No Deal The Power 5 (Bellfruit) (Scorpion 4) (TPRV415, set 2)", MACHINE_FLAGS, layout_sc4dndtp )// TPRV 415
+GAMEL( 200?, sc4dndtpl ,sc4dndtp, sc4_5reel, sc4dndtp35, sc4_state, sc4dndtp, ROT0, "BFM","Deal Or No Deal The Power 5 (Bellfruit) (Scorpion 4) (TPRV416, set 1)", MACHINE_FLAGS, layout_sc4dndtp )// TPRV 416
+GAMEL( 200?, sc4dndtpm ,sc4dndtp, sc4_5reel, sc4dndtp35, sc4_state, sc4dndtp, ROT0, "BFM","Deal Or No Deal The Power 5 (Bellfruit) (Scorpion 4) (TPRV416, set 2)", MACHINE_FLAGS, layout_sc4dndtp )// TPRV 416
+GAMEL( 200?, sc4dndtpj ,sc4dndtp, sc4_5reel, sc4dndtp35, sc4_state, sc4dndtp, ROT0, "BFM","Deal Or No Deal The Power 5 (Bellfruit) (Scorpion 4) (TPRV41A, set 1)", MACHINE_FLAGS, layout_sc4dndtp )// TPRV 41A
+GAMEL( 200?, sc4dndtpk ,sc4dndtp, sc4_5reel, sc4dndtp35, sc4_state, sc4dndtp, ROT0, "BFM","Deal Or No Deal The Power 5 (Bellfruit) (Scorpion 4) (TPRV41A, set 2)", MACHINE_FLAGS, layout_sc4dndtp )// TPRV 41A
@@ -35584,12 +35586,12 @@ INPUT_PORTS_END
// PR3006 AWP DEAL OR NO DEAL THE WALK OF WEALTH SCORP4 PR3006 WALK OF WEALTH SOUNDS11 WALK OF WEALTH S.SITE
-GAMEL( 200?, sc4dndww ,0, sc4, sc4dndww35, sc4_state, sc4dndww, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 4) (TWOH411, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // TWOH 411
-GAMEL( 200?, sc4dndwwb ,sc4dndww, sc4, sc4dndww35, sc4_state, sc4dndww, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 4) (TWOH411, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // TWOH 411
-GAMEL( 200?, sc4dndwwa ,sc4dndww, sc4, sc4dndww35, sc4_state, sc4dndww, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 4) (TWOH412, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // TWOH 412
-GAMEL( 200?, sc4dndwwe ,sc4dndww, sc4, sc4dndww35, sc4_state, sc4dndww, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 4) (TWOH412, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // TWOH 412
-GAMEL( 200?, sc4dndwwc ,sc4dndww, sc4, sc4dndww35, sc4_state, sc4dndww, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 4) (TWOH415, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // TWOH 415
-GAMEL( 200?, sc4dndwwd ,sc4dndww, sc4, sc4dndww35, sc4_state, sc4dndww, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 4) (TWOH415, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // TWOH 415
+GAMEL( 200?, sc4dndww ,0, sc4, sc4dndww35, sc4_state, sc4dndww, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 4) (TWOH411, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // TWOH 411
+GAMEL( 200?, sc4dndwwb ,sc4dndww, sc4, sc4dndww35, sc4_state, sc4dndww, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 4) (TWOH411, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // TWOH 411
+GAMEL( 200?, sc4dndwwa ,sc4dndww, sc4, sc4dndww35, sc4_state, sc4dndww, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 4) (TWOH412, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // TWOH 412
+GAMEL( 200?, sc4dndwwe ,sc4dndww, sc4, sc4dndww35, sc4_state, sc4dndww, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 4) (TWOH412, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // TWOH 412
+GAMEL( 200?, sc4dndwwc ,sc4dndww, sc4, sc4dndww35, sc4_state, sc4dndww, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 4) (TWOH415, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // TWOH 415
+GAMEL( 200?, sc4dndwwd ,sc4dndww, sc4, sc4dndww35, sc4_state, sc4dndww, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 4) (TWOH415, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // TWOH 415
DRIVER_INIT_MEMBER(sc4_state,sc4dndcw)
{
@@ -35674,10 +35676,10 @@ INPUT_PORTS_END
// PR3027 AWP CLASSIC DEAL OR NO DEAL THE WALK OF WEALTH SCORP4 PR3006 WALK OF WEALTH SOUNDS11 WALK OF WEALTH S.SITE
-GAMEL( 200?, sc4dndcw ,0, sc4, sc4dndcw5, sc4_state, sc4dndcw, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth Classic (Bellfruit) (Scorpion 4) (CWOH271, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // CWOH 271
-GAMEL( 200?, sc4dndcwb ,sc4dndcw, sc4, sc4dndcw5, sc4_state, sc4dndcw, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth Classic (Bellfruit) (Scorpion 4) (CWOH271, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // CWOH 271
-GAMEL( 200?, sc4dndcwa ,sc4dndcw, sc4, sc4dndcw5, sc4_state, sc4dndcw, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth Classic (Bellfruit) (Scorpion 4) (CWOH272, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // CWOH 272
-GAMEL( 200?, sc4dndcwc ,sc4dndcw, sc4, sc4dndcw5, sc4_state, sc4dndcw, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth Classic (Bellfruit) (Scorpion 4) (CWOH272, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // CWOH 272
+GAMEL( 200?, sc4dndcw ,0, sc4, sc4dndcw5, sc4_state, sc4dndcw, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth Classic (Bellfruit) (Scorpion 4) (CWOH271, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // CWOH 271
+GAMEL( 200?, sc4dndcwb ,sc4dndcw, sc4, sc4dndcw5, sc4_state, sc4dndcw, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth Classic (Bellfruit) (Scorpion 4) (CWOH271, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // CWOH 271
+GAMEL( 200?, sc4dndcwa ,sc4dndcw, sc4, sc4dndcw5, sc4_state, sc4dndcw, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth Classic (Bellfruit) (Scorpion 4) (CWOH272, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // CWOH 272
+GAMEL( 200?, sc4dndcwc ,sc4dndcw, sc4, sc4dndcw5, sc4_state, sc4dndcw, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth Classic (Bellfruit) (Scorpion 4) (CWOH272, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // CWOH 272
DRIVER_INIT_MEMBER(sc4_state,sc4dndtr)
@@ -35758,8 +35760,8 @@ INPUT_PORTS_END
// PR3329 DOND THINK RED S4 PR3304 THINK RED SOUNDS11 THINK RED S.SITE
-GAMEL( 200?, sc4dndtr ,0, sc4_5reel_alt, sc4dndtr70, sc4_state, sc4dndtr, ROT0, "BFM","Deal Or No Deal Think Red (Bellfruit) (Scorpion 4) (THRE571, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // THRE 571
-GAMEL( 200?, sc4dndtra ,sc4dndtr, sc4_5reel_alt, sc4dndtr70, sc4_state, sc4dndtr, ROT0, "BFM","Deal Or No Deal Think Red (Bellfruit) (Scorpion 4) (THRE571, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // THRE 571
+GAMEL( 200?, sc4dndtr ,0, sc4_5reel_alt, sc4dndtr70, sc4_state, sc4dndtr, ROT0, "BFM","Deal Or No Deal Think Red (Bellfruit) (Scorpion 4) (THRE571, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // THRE 571
+GAMEL( 200?, sc4dndtra ,sc4dndtr, sc4_5reel_alt, sc4dndtr70, sc4_state, sc4dndtr, ROT0, "BFM","Deal Or No Deal Think Red (Bellfruit) (Scorpion 4) (THRE571, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // THRE 571
DRIVER_INIT_MEMBER(sc4_state,sc4dndwb)
{
@@ -35844,14 +35846,14 @@ INPUT_PORTS_START( sc4dndwb35 )
INPUT_PORTS_END
// PR1982 AWP DEAL OR NO DEAL WHATS IN YOUR BOX SCORP4 PR1962 WHATS IN Y BOX SOUNDS11 WHATS IN YOUR BX S.SITE
-GAMEL( 200?, sc4dndwb ,0, sc4_200_5ra, sc4dndwb35, sc4_state, sc4dndwb, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 4) (WIYX412, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // WIYX 412
-GAMEL( 200?, sc4dndwbb ,sc4dndwb, sc4_200_5ra, sc4dndwb35, sc4_state, sc4dndwb, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 4) (WIYX412, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // WIYX 412
-GAMEL( 200?, sc4dndwba ,sc4dndwb, sc4_200_5ra, sc4dndwb35, sc4_state, sc4dndwb, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 4) (WIYX414, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // WIYX 414
-GAMEL( 200?, sc4dndwbc ,sc4dndwb, sc4_200_5ra, sc4dndwb35, sc4_state, sc4dndwb, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 4) (WIYX414, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // WIYX 414
-GAMEL( 200?, sc4dndwbd ,sc4dndwb, sc4_200_5ra, sc4dndwb35, sc4_state, sc4dndwb, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 4) (WIYX415, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // WIYX 415
-GAMEL( 200?, sc4dndwbe ,sc4dndwb, sc4_200_5ra, sc4dndwb35, sc4_state, sc4dndwb, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 4) (WIYX415, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // WIYX 415
-GAMEL( 200?, sc4dndwbf ,sc4dndwb, sc4_200_5ra, sc4dndwb35, sc4_state, sc4dndwb, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 4) (WIYX419, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // WIYX 419
-GAMEL( 200?, sc4dndwbg ,sc4dndwb, sc4_200_5ra, sc4dndwb35, sc4_state, sc4dndwb, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 4) (WIYX419, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // WIYX 419
+GAMEL( 200?, sc4dndwb ,0, sc4_200_5ra, sc4dndwb35, sc4_state, sc4dndwb, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 4) (WIYX412, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // WIYX 412
+GAMEL( 200?, sc4dndwbb ,sc4dndwb, sc4_200_5ra, sc4dndwb35, sc4_state, sc4dndwb, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 4) (WIYX412, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // WIYX 412
+GAMEL( 200?, sc4dndwba ,sc4dndwb, sc4_200_5ra, sc4dndwb35, sc4_state, sc4dndwb, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 4) (WIYX414, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // WIYX 414
+GAMEL( 200?, sc4dndwbc ,sc4dndwb, sc4_200_5ra, sc4dndwb35, sc4_state, sc4dndwb, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 4) (WIYX414, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // WIYX 414
+GAMEL( 200?, sc4dndwbd ,sc4dndwb, sc4_200_5ra, sc4dndwb35, sc4_state, sc4dndwb, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 4) (WIYX415, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // WIYX 415
+GAMEL( 200?, sc4dndwbe ,sc4dndwb, sc4_200_5ra, sc4dndwb35, sc4_state, sc4dndwb, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 4) (WIYX415, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // WIYX 415
+GAMEL( 200?, sc4dndwbf ,sc4dndwb, sc4_200_5ra, sc4dndwb35, sc4_state, sc4dndwb, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 4) (WIYX419, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // WIYX 419
+GAMEL( 200?, sc4dndwbg ,sc4dndwb, sc4_200_5ra, sc4dndwb35, sc4_state, sc4dndwb, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 4) (WIYX419, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // WIYX 419
DRIVER_INIT_MEMBER(sc4_state,sc4dndbe)
{
@@ -35936,20 +35938,20 @@ INPUT_PORTS_START( sc4dndbe35 )
INPUT_PORTS_END
// PR1935 AWP DEAL OR NO DEAL BEAT THE BANKER S4 PR1915 BEAT THE BANKER SOUNDS11 BEAT THE BANKER S.SITE
-GAMEL( 200?, sc4dndbe ,0, sc4_5reel_alt, sc4dndbe25, sc4_state, sc4dndbe, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (DBTK012, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // DBTK 012
-GAMEL( 200?, sc4dndbec ,sc4dndbe, sc4_5reel_alt, sc4dndbe25, sc4_state, sc4dndbe, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (DBTK012, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // DBTK 012
-GAMEL( 200?, sc4dndbeg ,sc4dndbe, sc4_5reel_alt, sc4dndbe25, sc4_state, sc4dndbe, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (DBTK013, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // DBTK 013
-GAMEL( 200?, sc4dndbek ,sc4dndbe, sc4_5reel_alt, sc4dndbe25, sc4_state, sc4dndbe, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (DBTK013, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // DBTK 013
-GAMEL( 200?, sc4dndbeh ,sc4dndbe, sc4_5reel_alt, sc4dndbe25, sc4_state, sc4dndbe, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (DBTK014, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // DBTK 014
-GAMEL( 200?, sc4dndbel ,sc4dndbe, sc4_5reel_alt, sc4dndbe25, sc4_state, sc4dndbe, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (DBTK014, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // DBTK 014
-GAMEL( 200?, sc4dndbeb ,sc4dndbe, sc4_5reel_alt, sc4dndbe35, sc4_state, sc4dndbe, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (DBTK422, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // DBTK 422
-GAMEL( 200?, sc4dndbed ,sc4dndbe, sc4_5reel_alt, sc4dndbe35, sc4_state, sc4dndbe, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (DBTK422, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // DBTK 422
-GAMEL( 200?, sc4dndbee ,sc4dndbe, sc4_5reel_alt, sc4dndbe35, sc4_state, sc4dndbe, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (DBTK423, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // DBTK 423
-GAMEL( 200?, sc4dndbei ,sc4dndbe, sc4_5reel_alt, sc4dndbe35, sc4_state, sc4dndbe, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (DBTK423, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // DBTK 423
-GAMEL( 200?, sc4dndbef ,sc4dndbe, sc4_5reel_alt, sc4dndbe35, sc4_state, sc4dndbe, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (DBTK425, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // DBTK 425
-GAMEL( 200?, sc4dndbej ,sc4dndbe, sc4_5reel_alt, sc4dndbe35, sc4_state, sc4dndbe, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (DBTK425, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // DBTK 425
-GAMEL( 200?, sc4dndbem ,sc4dndbe, sc4_5reel_alt, sc4dndbe35, sc4_state, sc4dndbe, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (DBTK426, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // DBTK 426
-GAMEL( 200?, sc4dndben ,sc4dndbe, sc4_5reel_alt, sc4dndbe35, sc4_state, sc4dndbe, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (DBTK426, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // DBTK 426
+GAMEL( 200?, sc4dndbe ,0, sc4_5reel_alt, sc4dndbe25, sc4_state, sc4dndbe, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (DBTK012, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // DBTK 012
+GAMEL( 200?, sc4dndbec ,sc4dndbe, sc4_5reel_alt, sc4dndbe25, sc4_state, sc4dndbe, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (DBTK012, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // DBTK 012
+GAMEL( 200?, sc4dndbeg ,sc4dndbe, sc4_5reel_alt, sc4dndbe25, sc4_state, sc4dndbe, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (DBTK013, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // DBTK 013
+GAMEL( 200?, sc4dndbek ,sc4dndbe, sc4_5reel_alt, sc4dndbe25, sc4_state, sc4dndbe, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (DBTK013, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // DBTK 013
+GAMEL( 200?, sc4dndbeh ,sc4dndbe, sc4_5reel_alt, sc4dndbe25, sc4_state, sc4dndbe, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (DBTK014, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // DBTK 014
+GAMEL( 200?, sc4dndbel ,sc4dndbe, sc4_5reel_alt, sc4dndbe25, sc4_state, sc4dndbe, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (DBTK014, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // DBTK 014
+GAMEL( 200?, sc4dndbeb ,sc4dndbe, sc4_5reel_alt, sc4dndbe35, sc4_state, sc4dndbe, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (DBTK422, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // DBTK 422
+GAMEL( 200?, sc4dndbed ,sc4dndbe, sc4_5reel_alt, sc4dndbe35, sc4_state, sc4dndbe, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (DBTK422, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // DBTK 422
+GAMEL( 200?, sc4dndbee ,sc4dndbe, sc4_5reel_alt, sc4dndbe35, sc4_state, sc4dndbe, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (DBTK423, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // DBTK 423
+GAMEL( 200?, sc4dndbei ,sc4dndbe, sc4_5reel_alt, sc4dndbe35, sc4_state, sc4dndbe, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (DBTK423, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // DBTK 423
+GAMEL( 200?, sc4dndbef ,sc4dndbe, sc4_5reel_alt, sc4dndbe35, sc4_state, sc4dndbe, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (DBTK425, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // DBTK 425
+GAMEL( 200?, sc4dndbej ,sc4dndbe, sc4_5reel_alt, sc4dndbe35, sc4_state, sc4dndbe, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (DBTK425, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // DBTK 425
+GAMEL( 200?, sc4dndbem ,sc4dndbe, sc4_5reel_alt, sc4dndbe35, sc4_state, sc4dndbe, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (DBTK426, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // DBTK 426
+GAMEL( 200?, sc4dndben ,sc4dndbe, sc4_5reel_alt, sc4dndbe35, sc4_state, sc4dndbe, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (DBTK426, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // DBTK 426
DRIVER_INIT_MEMBER(sc4_state,sc4dndbc)
@@ -36034,8 +36036,8 @@ INPUT_PORTS_END
// PR3337 AWP DEAL OR NO DEAL BOX CLEVER SCORP4 PR3312 DOND BOXCLEVER SOUNDS11 BOX CLEVER S.SITE
-GAMEL( 200?, sc4dndbc ,0, sc4_5reel, sc4dndbc70, sc4_state, sc4dndbc, ROT0, "BFM","Deal Or No Deal Box Clever (Bellfruit) (Scorpion 4) (BOXR571, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // BOXR 571
-GAMEL( 200?, sc4dndbca ,sc4dndbc, sc4_5reel, sc4dndbc70, sc4_state, sc4dndbc, ROT0, "BFM","Deal Or No Deal Box Clever (Bellfruit) (Scorpion 4) (BOXR571, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // BOXR 571
+GAMEL( 200?, sc4dndbc ,0, sc4_5reel, sc4dndbc70, sc4_state, sc4dndbc, ROT0, "BFM","Deal Or No Deal Box Clever (Bellfruit) (Scorpion 4) (BOXR571, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // BOXR 571
+GAMEL( 200?, sc4dndbca ,sc4dndbc, sc4_5reel, sc4dndbc70, sc4_state, sc4dndbc, ROT0, "BFM","Deal Or No Deal Box Clever (Bellfruit) (Scorpion 4) (BOXR571, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // BOXR 571
DRIVER_INIT_MEMBER(sc4_state,sc4dmine)
@@ -36106,12 +36108,12 @@ INPUT_PORTS_START( sc4dmine ) // this structure is generated
INPUT_PORTS_END
// PR1307 AWP DIAMOND MINE PR1307 DIAM MINE SOUNDS11
-GAMEL( 200?, sc4dmine ,0, sc4_5reel, sc4dmine, sc4_state, sc4dmine, ROT0, "BFM","Diamond Mine (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4dminea ,sc4dmine, sc4_5reel, sc4dmine, sc4_state, sc4dmine, ROT0, "BFM","Diamond Mine (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4dmineb ,sc4dmine, sc4_5reel, sc4dmine, sc4_state, sc4dmine, ROT0, "BFM","Diamond Mine (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4dminec ,sc4dmine, sc4_5reel, sc4dmine, sc4_state, sc4dmine, ROT0, "BFM","Diamond Mine (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4dmined ,sc4dmine, sc4_5reel, sc4dmine, sc4_state, sc4dmine, ROT0, "BFM","Diamond Mine (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4dminee ,sc4dmine, sc4_5reel, sc4dmine, sc4_state, sc4dmine, ROT0, "BFM","Diamond Mine (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4dmine ,0, sc4_5reel, sc4dmine, sc4_state, sc4dmine, ROT0, "BFM","Diamond Mine (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4dminea ,sc4dmine, sc4_5reel, sc4dmine, sc4_state, sc4dmine, ROT0, "BFM","Diamond Mine (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4dmineb ,sc4dmine, sc4_5reel, sc4dmine, sc4_state, sc4dmine, ROT0, "BFM","Diamond Mine (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4dminec ,sc4dmine, sc4_5reel, sc4dmine, sc4_state, sc4dmine, ROT0, "BFM","Diamond Mine (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4dmined ,sc4dmine, sc4_5reel, sc4dmine, sc4_state, sc4dmine, ROT0, "BFM","Diamond Mine (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4dminee ,sc4dmine, sc4_5reel, sc4dmine, sc4_state, sc4dmine, ROT0, "BFM","Diamond Mine (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -36191,23 +36193,23 @@ INPUT_PORTS_END
// saw a crash on exit with this game, why?
// PR1309 AWP DOCTOR DOSH PR1309 DOCTOR DOSH SOUNDS11
-GAMEL( 200?, sc4ddosh ,0, sc4_200_4r, sc4ddosh, sc4_state, sc4ddosh, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ddosha ,sc4ddosh, sc4_200_4r, sc4ddosh, sc4_state, sc4ddosh, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ddoshb ,sc4ddosh, sc4_200_4r, sc4ddosh, sc4_state, sc4ddosh, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ddoshc ,sc4ddosh, sc4_200_4r, sc4ddosh, sc4_state, sc4ddosh, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ddoshd ,sc4ddosh, sc4_200_4r, sc4ddosh, sc4_state, sc4ddosh, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ddoshe ,sc4ddosh, sc4_200_4r, sc4ddosh, sc4_state, sc4ddosh, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ddoshl ,sc4ddosh, sc4_200_4r, sc4ddosh, sc4_state, sc4ddosh, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ddoshm ,sc4ddosh, sc4_200_4r, sc4ddosh, sc4_state, sc4ddosh, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ddoshn ,sc4ddosh, sc4_200_4r, sc4ddosh, sc4_state, sc4ddosh, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ddosho ,sc4ddosh, sc4_200_4r, sc4ddosh, sc4_state, sc4ddosh, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4ddosh ,0, sc4_200_4r, sc4ddosh, sc4_state, sc4ddosh, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ddosha ,sc4ddosh, sc4_200_4r, sc4ddosh, sc4_state, sc4ddosh, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ddoshb ,sc4ddosh, sc4_200_4r, sc4ddosh, sc4_state, sc4ddosh, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ddoshc ,sc4ddosh, sc4_200_4r, sc4ddosh, sc4_state, sc4ddosh, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ddoshd ,sc4ddosh, sc4_200_4r, sc4ddosh, sc4_state, sc4ddosh, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ddoshe ,sc4ddosh, sc4_200_4r, sc4ddosh, sc4_state, sc4ddosh, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ddoshl ,sc4ddosh, sc4_200_4r, sc4ddosh, sc4_state, sc4ddosh, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ddoshm ,sc4ddosh, sc4_200_4r, sc4ddosh, sc4_state, sc4ddosh, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ddoshn ,sc4ddosh, sc4_200_4r, sc4ddosh, sc4_state, sc4ddosh, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ddosho ,sc4ddosh, sc4_200_4r, sc4ddosh, sc4_state, sc4ddosh, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR1309 AWP DOCTOR DOSH PR1309 DOCTOR DOSH SOUNDS11 DOCTOR DOSH S.SITE
-GAMEL( 200?, sc4ddoshf ,sc4ddosh, sc4_200_4r, sc4ddosh, sc4_state, sc4ddosh_mbus, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 11)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ddoshg ,sc4ddosh, sc4_200_4r, sc4ddosh, sc4_state, sc4ddosh_mbus, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 12)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ddoshh ,sc4ddosh, sc4_200_4r, sc4ddosh, sc4_state, sc4ddosh_mbus, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 13)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ddoshi ,sc4ddosh, sc4_200_4r, sc4ddosh, sc4_state, sc4ddosh_mbus, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 14)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ddoshj ,sc4ddosh, sc4_200_4r, sc4ddosh, sc4_state, sc4ddosh_mbus, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 15)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ddoshk ,sc4ddosh, sc4_200_4r, sc4ddosh, sc4_state, sc4ddosh_mbus, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 16)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4ddoshf ,sc4ddosh, sc4_200_4r, sc4ddosh, sc4_state, sc4ddosh_mbus, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 11)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ddoshg ,sc4ddosh, sc4_200_4r, sc4ddosh, sc4_state, sc4ddosh_mbus, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 12)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ddoshh ,sc4ddosh, sc4_200_4r, sc4ddosh, sc4_state, sc4ddosh_mbus, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 13)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ddoshi ,sc4ddosh, sc4_200_4r, sc4ddosh, sc4_state, sc4ddosh_mbus, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 14)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ddoshj ,sc4ddosh, sc4_200_4r, sc4ddosh, sc4_state, sc4ddosh_mbus, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 15)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ddoshk ,sc4ddosh, sc4_200_4r, sc4ddosh, sc4_state, sc4ddosh_mbus, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 16)", MACHINE_FLAGS, layout_bfm_sc4 )
INPUT_PORTS_START( sc4dhh ) // this structure is generated
PORT_INCLUDE( sc4_base )
@@ -36277,12 +36279,12 @@ INPUT_PORTS_END
// board positions & steppa feature don't light anything, investigate (might only be a problem in demo mode?)
// PR1736 AWP DOUGH HO HO S4 PR1716 DOUGH HO HO SOUNDS11 DOUGH HO HO S.SITE
-GAMEL( 200?, sc4dhh ,0, sc4, sc4dhh, sc4_state, sc4mbus, ROT0, "BFM","Dough Ho Ho (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4dhha ,sc4dhh, sc4, sc4dhh, sc4_state, sc4mbus, ROT0, "BFM","Dough Ho Ho (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4dhhb ,sc4dhh, sc4, sc4dhh, sc4_state, sc4mbus, ROT0, "BFM","Dough Ho Ho (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4dhhc ,sc4dhh, sc4, sc4dhh, sc4_state, sc4mbus, ROT0, "BFM","Dough Ho Ho (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4dhhd ,sc4dhh, sc4, sc4dhh, sc4_state, sc4mbus, ROT0, "BFM","Dough Ho Ho (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4dhhe ,sc4dhh, sc4, sc4dhh, sc4_state, sc4mbus, ROT0, "BFM","Dough Ho Ho (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4dhh ,0, sc4, sc4dhh, sc4_state, sc4mbus, ROT0, "BFM","Dough Ho Ho (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4dhha ,sc4dhh, sc4, sc4dhh, sc4_state, sc4mbus, ROT0, "BFM","Dough Ho Ho (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4dhhb ,sc4dhh, sc4, sc4dhh, sc4_state, sc4mbus, ROT0, "BFM","Dough Ho Ho (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4dhhc ,sc4dhh, sc4, sc4dhh, sc4_state, sc4mbus, ROT0, "BFM","Dough Ho Ho (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4dhhd ,sc4dhh, sc4, sc4dhh, sc4_state, sc4mbus, ROT0, "BFM","Dough Ho Ho (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4dhhe ,sc4dhh, sc4, sc4dhh, sc4_state, sc4mbus, ROT0, "BFM","Dough Ho Ho (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4dough)
{
@@ -36353,8 +36355,8 @@ INPUT_PORTS_START( sc4dough ) // this structure is generated
INPUT_PORTS_END
// PR1615 AWP DOUGH SELECTA SCORP4 PR1615 DOUGH SELECTA SOUNDS11 DOUGH SELECTA S.SITE
-GAMEL( 200?, sc4dough ,0, sc4_4reel_alt, sc4dough, sc4_state, sc4dough, ROT0, "BFM","Dough Selecta (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4dougha ,sc4dough, sc4_4reel_alt, sc4dough, sc4_state, sc4dough, ROT0, "BFM","Dough Selecta (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4dough ,0, sc4_4reel_alt, sc4dough, sc4_state, sc4dough, ROT0, "BFM","Dough Selecta (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4dougha ,sc4dough, sc4_4reel_alt, sc4dough, sc4_state, sc4dough, ROT0, "BFM","Dough Selecta (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4emmer)
@@ -36424,10 +36426,10 @@ INPUT_PORTS_START( sc4emmer ) // this structure is generated
INPUT_PORTS_END
// PR2313 EMMERDALE EMMR SOUNDS EMMERDALE
-GAMEL( 200?, sc4emmer ,0, sc4_4reel_alt, sc4emmer, sc4_state, sc4emmer, ROT0, "Mazooma","Emmerdale (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4emmera ,sc4emmer, sc4_4reel_alt, sc4emmer, sc4_state, sc4emmer, ROT0, "Mazooma","Emmerdale (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4emmerb ,sc4emmer, sc4_4reel_alt, sc4emmer, sc4_state, sc4emmer, ROT0, "Mazooma","Emmerdale (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4emmerc ,sc4emmer, sc4_4reel_alt, sc4emmer, sc4_state, sc4emmer, ROT0, "Mazooma","Emmerdale (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4emmer ,0, sc4_4reel_alt, sc4emmer, sc4_state, sc4emmer, ROT0, "Mazooma","Emmerdale (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4emmera ,sc4emmer, sc4_4reel_alt, sc4emmer, sc4_state, sc4emmer, ROT0, "Mazooma","Emmerdale (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4emmerb ,sc4emmer, sc4_4reel_alt, sc4emmer, sc4_state, sc4emmer, ROT0, "Mazooma","Emmerdale (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4emmerc ,sc4emmer, sc4_4reel_alt, sc4emmer, sc4_state, sc4emmer, ROT0, "Mazooma","Emmerdale (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4evol)
{
@@ -36479,14 +36481,14 @@ INPUT_PORTS_START( sc4evol ) // this structure is generated
INPUT_PORTS_END
// PR2135 EVOLUTION EVOL SOUNDS EVOLUTION
-GAMEL( 200?, sc4evol ,0, sc4_4reel_alt, sc4evol, sc4_state, sc4evol, ROT0, "Qps","Evolution (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4evola ,sc4evol, sc4_4reel_alt, sc4evol, sc4_state, sc4evol, ROT0, "Qps","Evolution (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4evolb ,sc4evol, sc4_4reel_alt, sc4evol, sc4_state, sc4evol, ROT0, "Qps","Evolution (Qps) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4evolc ,sc4evol, sc4_4reel_alt, sc4evol, sc4_state, sc4evol, ROT0, "Qps","Evolution (Qps) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4evold ,sc4evol, sc4_4reel_alt, sc4evol, sc4_state, sc4evol, ROT0, "Qps","Evolution (Qps) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4evole ,sc4evol, sc4_4reel_alt, sc4evol, sc4_state, sc4evol, ROT0, "Qps","Evolution (Qps) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4evolf ,sc4evol, sc4_4reel_alt, sc4evol, sc4_state, sc4evol, ROT0, "Qps","Evolution (Qps) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4evolg ,sc4evol, sc4_4reel_alt, sc4evol, sc4_state, sc4evol, ROT0, "Qps","Evolution (Qps) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4evol ,0, sc4_4reel_alt, sc4evol, sc4_state, sc4evol, ROT0, "Qps","Evolution (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4evola ,sc4evol, sc4_4reel_alt, sc4evol, sc4_state, sc4evol, ROT0, "Qps","Evolution (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4evolb ,sc4evol, sc4_4reel_alt, sc4evol, sc4_state, sc4evol, ROT0, "Qps","Evolution (Qps) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4evolc ,sc4evol, sc4_4reel_alt, sc4evol, sc4_state, sc4evol, ROT0, "Qps","Evolution (Qps) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4evold ,sc4evol, sc4_4reel_alt, sc4evol, sc4_state, sc4evol, ROT0, "Qps","Evolution (Qps) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4evole ,sc4evol, sc4_4reel_alt, sc4evol, sc4_state, sc4evol, ROT0, "Qps","Evolution (Qps) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4evolf ,sc4evol, sc4_4reel_alt, sc4evol, sc4_state, sc4evol, ROT0, "Qps","Evolution (Qps) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4evolg ,sc4evol, sc4_4reel_alt, sc4evol, sc4_state, sc4evol, ROT0, "Qps","Evolution (Qps) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4fguy)
{
@@ -36572,12 +36574,12 @@ INPUT_PORTS_START( sc4fguy70 )
INPUT_PORTS_END
// PR3233 AWP FAMILY GUY S4 PR3213 FAMILY GUY SOUNDS11 FAMILY GUY S.SITE
-GAMEL( 200?, sc4fguy ,0, sc4_5reel_alt, sc4fguy35, sc4_state, sc4fguy, ROT0, "BFM","Family Guy (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // FAMY 471
-GAMEL( 200?, sc4fguyb ,sc4fguy, sc4_5reel_alt, sc4fguy35, sc4_state, sc4fguy, ROT0, "BFM","Family Guy (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // FAMY 471
-GAMEL( 200?, sc4fguya ,sc4fguy, sc4_5reel_alt, sc4fguy70, sc4_state, sc4fguy, ROT0, "BFM","Family Guy (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // FAMY 572
-GAMEL( 200?, sc4fguyc ,sc4fguy, sc4_5reel_alt, sc4fguy70, sc4_state, sc4fguy, ROT0, "BFM","Family Guy (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // FAMY 572
-GAMEL( 200?, sc4fguyd ,sc4fguy, sc4_5reel_alt, sc4fguy, sc4_state, sc4fguy, ROT0, "BFM","Family Guy (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4fguye ,sc4fguy, sc4_5reel_alt, sc4fguy, sc4_state, sc4fguy, ROT0, "BFM","Family Guy (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4fguy ,0, sc4_5reel_alt, sc4fguy35, sc4_state, sc4fguy, ROT0, "BFM","Family Guy (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // FAMY 471
+GAMEL( 200?, sc4fguyb ,sc4fguy, sc4_5reel_alt, sc4fguy35, sc4_state, sc4fguy, ROT0, "BFM","Family Guy (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 ) // FAMY 471
+GAMEL( 200?, sc4fguya ,sc4fguy, sc4_5reel_alt, sc4fguy70, sc4_state, sc4fguy, ROT0, "BFM","Family Guy (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // FAMY 572
+GAMEL( 200?, sc4fguyc ,sc4fguy, sc4_5reel_alt, sc4fguy70, sc4_state, sc4fguy, ROT0, "BFM","Family Guy (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 ) // FAMY 572
+GAMEL( 200?, sc4fguyd ,sc4fguy, sc4_5reel_alt, sc4fguy, sc4_state, sc4fguy, ROT0, "BFM","Family Guy (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4fguye ,sc4fguy, sc4_5reel_alt, sc4fguy, sc4_state, sc4fguy, ROT0, "BFM","Family Guy (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4fbspn)
{
@@ -36643,10 +36645,10 @@ INPUT_PORTS_START( sc4fbspn ) // this structure is generated
INPUT_PORTS_END
// PR1721 AWP FAT BOY SPIN SCORP4 PR1701 FAT BOY SPIN SOUNDS11 FAT BOY SPIN S.SITE
-GAMEL( 200?, sc4fbspn ,0, sc4_5reel, sc4fbspn, sc4_state, sc4fbspn, ROT0, "BFM","Fat Boy Spin (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4fbspna ,sc4fbspn, sc4_5reel, sc4fbspn, sc4_state, sc4fbspn, ROT0, "BFM","Fat Boy Spin (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4fbspnb ,sc4fbspn, sc4_5reel, sc4fbspn, sc4_state, sc4fbspn, ROT0, "BFM","Fat Boy Spin (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4fbspnc ,sc4fbspn, sc4_5reel, sc4fbspn, sc4_state, sc4fbspn, ROT0, "BFM","Fat Boy Spin (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4fbspn ,0, sc4_5reel, sc4fbspn, sc4_state, sc4fbspn, ROT0, "BFM","Fat Boy Spin (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4fbspna ,sc4fbspn, sc4_5reel, sc4fbspn, sc4_state, sc4fbspn, ROT0, "BFM","Fat Boy Spin (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4fbspnb ,sc4fbspn, sc4_5reel, sc4fbspn, sc4_state, sc4fbspn, ROT0, "BFM","Fat Boy Spin (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4fbspnc ,sc4fbspn, sc4_5reel, sc4fbspn, sc4_state, sc4fbspn, ROT0, "BFM","Fat Boy Spin (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -36716,10 +36718,10 @@ INPUT_PORTS_START( sc4fmj ) // this structure is generated
INPUT_PORTS_END
// PR2328 FULL METAL JACKPOT FULLM SOUNDS F METAL JACKPOT
-GAMEL( 200?, sc4fmj ,0, sc4_4reel_alt, sc4fmj, sc4_state, sc4fmj, ROT0, "QPS / Mazooma","Full Metal Jackpot (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4fmja ,sc4fmj, sc4_4reel_alt, sc4fmj, sc4_state, sc4fmj, ROT0, "QPS / Mazooma","Full Metal Jackpot (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4fmjb ,sc4fmj, sc4_4reel_alt, sc4fmj, sc4_state, sc4fmj, ROT0, "QPS / Mazooma","Full Metal Jackpot (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4fmjc ,sc4fmj, sc4_4reel_alt, sc4fmj, sc4_state, sc4fmj, ROT0, "QPS / Mazooma","Full Metal Jackpot (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4fmj ,0, sc4_4reel_alt, sc4fmj, sc4_state, sc4fmj, ROT0, "QPS / Mazooma","Full Metal Jackpot (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4fmja ,sc4fmj, sc4_4reel_alt, sc4fmj, sc4_state, sc4fmj, ROT0, "QPS / Mazooma","Full Metal Jackpot (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4fmjb ,sc4fmj, sc4_4reel_alt, sc4fmj, sc4_state, sc4fmj, ROT0, "QPS / Mazooma","Full Metal Jackpot (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4fmjc ,sc4fmj, sc4_4reel_alt, sc4fmj, sc4_state, sc4fmj, ROT0, "QPS / Mazooma","Full Metal Jackpot (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -36791,14 +36793,14 @@ INPUT_PORTS_START( sc4gd ) // this structure is generated
INPUT_PORTS_END
// PR1016 GOLD DIGGER PR1016 GOLD DIGGER SOUNDS11
-GAMEL( 200?, sc4gd ,0, sc4_200_4r, sc4gd, sc4_state, sc4gd, ROT0, "BFM","Gold Digger (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gda ,sc4gd, sc4_200_4r, sc4gd, sc4_state, sc4gd, ROT0, "BFM","Gold Digger (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gdb ,sc4gd, sc4_200_4r, sc4gd, sc4_state, sc4gd, ROT0, "BFM","Gold Digger (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gdc ,sc4gd, sc4_200_4r, sc4gd, sc4_state, sc4gd, ROT0, "BFM","Gold Digger (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gdd ,sc4gd, sc4_200_4r, sc4gd, sc4_state, sc4gd, ROT0, "BFM","Gold Digger (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gde ,sc4gd, sc4_200_4r, sc4gd, sc4_state, sc4gd, ROT0, "BFM","Gold Digger (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gdf ,sc4gd, sc4_200_4r, sc4gd, sc4_state, sc4gd, ROT0, "BFM","Gold Digger (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gdg ,sc4gd, sc4_200_4r, sc4gd, sc4_state, sc4gd, ROT0, "BFM","Gold Digger (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4gd ,0, sc4_200_4r, sc4gd, sc4_state, sc4gd, ROT0, "BFM","Gold Digger (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gda ,sc4gd, sc4_200_4r, sc4gd, sc4_state, sc4gd, ROT0, "BFM","Gold Digger (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gdb ,sc4gd, sc4_200_4r, sc4gd, sc4_state, sc4gd, ROT0, "BFM","Gold Digger (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gdc ,sc4gd, sc4_200_4r, sc4gd, sc4_state, sc4gd, ROT0, "BFM","Gold Digger (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gdd ,sc4gd, sc4_200_4r, sc4gd, sc4_state, sc4gd, ROT0, "BFM","Gold Digger (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gde ,sc4gd, sc4_200_4r, sc4gd, sc4_state, sc4gd, ROT0, "BFM","Gold Digger (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gdf ,sc4gd, sc4_200_4r, sc4gd, sc4_state, sc4gd, ROT0, "BFM","Gold Digger (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gdg ,sc4gd, sc4_200_4r, sc4gd, sc4_state, sc4gd, ROT0, "BFM","Gold Digger (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4gdclb)
{
@@ -36861,18 +36863,18 @@ INPUT_PORTS_START( sc4gdclb ) // this structure is generated
INPUT_PORTS_END
// PR1137 CLUB GOLD DIGGER PR1137 GOLDD CL SOUNDS11
-GAMEL( 200?, sc4gdclb ,0, sc4_200_std, sc4gdclb, sc4_state, sc4gdclb, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gdclba ,sc4gdclb, sc4_200_std, sc4gdclb, sc4_state, sc4gdclb, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gdclbb ,sc4gdclb, sc4_200_std, sc4gdclb, sc4_state, sc4gdclb, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gdclbc ,sc4gdclb, sc4_200_std, sc4gdclb, sc4_state, sc4gdclb, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gdclbd ,sc4gdclb, sc4_200_std, sc4gdclb, sc4_state, sc4gdclb, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gdclbe ,sc4gdclb, sc4_200_std, sc4gdclb, sc4_state, sc4gdclb, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gdclbf ,sc4gdclb, sc4_200_std, sc4gdclb, sc4_state, sc4gdclb, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gdclbg ,sc4gdclb, sc4_200_std, sc4gdclb, sc4_state, sc4gdclb, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gdclbh ,sc4gdclb, sc4_200_std, sc4gdclb, sc4_state, sc4gdclb, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gdclbi ,sc4gdclb, sc4_200_std, sc4gdclb, sc4_state, sc4gdclb, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gdclbj ,sc4gdclb, sc4_200_std, sc4gdclb, sc4_state, sc4gdclb, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 4) (set 11)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gdclbk ,sc4gdclb, sc4_200_std, sc4gdclb, sc4_state, sc4gdclb, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 4) (set 12)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4gdclb ,0, sc4_200_std, sc4gdclb, sc4_state, sc4gdclb, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gdclba ,sc4gdclb, sc4_200_std, sc4gdclb, sc4_state, sc4gdclb, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gdclbb ,sc4gdclb, sc4_200_std, sc4gdclb, sc4_state, sc4gdclb, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gdclbc ,sc4gdclb, sc4_200_std, sc4gdclb, sc4_state, sc4gdclb, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gdclbd ,sc4gdclb, sc4_200_std, sc4gdclb, sc4_state, sc4gdclb, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gdclbe ,sc4gdclb, sc4_200_std, sc4gdclb, sc4_state, sc4gdclb, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gdclbf ,sc4gdclb, sc4_200_std, sc4gdclb, sc4_state, sc4gdclb, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gdclbg ,sc4gdclb, sc4_200_std, sc4gdclb, sc4_state, sc4gdclb, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gdclbh ,sc4gdclb, sc4_200_std, sc4gdclb, sc4_state, sc4gdclb, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gdclbi ,sc4gdclb, sc4_200_std, sc4gdclb, sc4_state, sc4gdclb, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gdclbj ,sc4gdclb, sc4_200_std, sc4gdclb, sc4_state, sc4gdclb, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 4) (set 11)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gdclbk ,sc4gdclb, sc4_200_std, sc4gdclb, sc4_state, sc4gdclb, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 4) (set 12)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4gball)
@@ -36941,10 +36943,10 @@ INPUT_PORTS_END
// this is a football themed game... completely different to golden balls casino
// PR1604 AWP GOLDEN BALLS PR1604 GOLDEN BALLS SOUNDS12 GOLDEN BALLS S.SITE
-GAMEL( 200?, sc4gball ,0, sc4_4reel_alt, sc4gball, sc4_state, sc4gball, ROT0, "BFM","Golden Balls (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gballa ,sc4gball, sc4_4reel_alt, sc4gball, sc4_state, sc4gball, ROT0, "BFM","Golden Balls (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gballb ,sc4gball, sc4_4reel_alt, sc4gball, sc4_state, sc4gball, ROT0, "BFM","Golden Balls (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gballc ,sc4gball, sc4_4reel_alt, sc4gball, sc4_state, sc4gball, ROT0, "BFM","Golden Balls (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4gball ,0, sc4_4reel_alt, sc4gball, sc4_state, sc4gball, ROT0, "BFM","Golden Balls (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gballa ,sc4gball, sc4_4reel_alt, sc4gball, sc4_state, sc4gball, ROT0, "BFM","Golden Balls (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gballb ,sc4gball, sc4_4reel_alt, sc4gball, sc4_state, sc4gball, ROT0, "BFM","Golden Balls (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gballc ,sc4gball, sc4_4reel_alt, sc4gball, sc4_state, sc4gball, ROT0, "BFM","Golden Balls (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4gunp)
@@ -37017,14 +37019,14 @@ INPUT_PORTS_START( sc4gunp ) // this structure is generated
INPUT_PORTS_END
// PR3046 AWP THE GUNPOWDER SLOT S4 PR3016 GUNPOWDER SLOT SOUNDS11 GUNPOWDER SLOT S.SITE
-GAMEL( 200?, sc4gunp ,0, sc4_5reel_alt, sc4gunp, sc4_state, sc4gunp, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gunpa ,sc4gunp, sc4_5reel_alt, sc4gunp, sc4_state, sc4gunp, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gunpb ,sc4gunp, sc4_5reel_alt, sc4gunp, sc4_state, sc4gunp, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gunpc ,sc4gunp, sc4_5reel_alt, sc4gunp, sc4_state, sc4gunp, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gunpd ,sc4gunp, sc4_5reel_alt, sc4gunp, sc4_state, sc4gunp, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gunpe ,sc4gunp, sc4_5reel_alt, sc4gunp, sc4_state, sc4gunp, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gunpf ,sc4gunp, sc4_5reel_alt, sc4gunp, sc4_state, sc4gunp, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gunpg ,sc4gunp, sc4_5reel_alt, sc4gunp, sc4_state, sc4gunp, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4gunp ,0, sc4_5reel_alt, sc4gunp, sc4_state, sc4gunp, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gunpa ,sc4gunp, sc4_5reel_alt, sc4gunp, sc4_state, sc4gunp, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gunpb ,sc4gunp, sc4_5reel_alt, sc4gunp, sc4_state, sc4gunp, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gunpc ,sc4gunp, sc4_5reel_alt, sc4gunp, sc4_state, sc4gunp, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gunpd ,sc4gunp, sc4_5reel_alt, sc4gunp, sc4_state, sc4gunp, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gunpe ,sc4gunp, sc4_5reel_alt, sc4gunp, sc4_state, sc4gunp, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gunpf ,sc4gunp, sc4_5reel_alt, sc4gunp, sc4_state, sc4gunp, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gunpg ,sc4gunp, sc4_5reel_alt, sc4gunp, sc4_state, sc4gunp, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4hapnt)
{
@@ -37088,12 +37090,12 @@ INPUT_PORTS_START( sc4hapnt ) // this structure is generated
INPUT_PORTS_END
// PR1306 AWP HAPPY NOTES PR1306 HAPPY NOTES SOUNDS11
-GAMEL( 200?, sc4hapnt ,0, sc4_4reel_alt, sc4hapnt, sc4_state, sc4hapnt, ROT0, "BFM","Happy Notes (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hapnta ,sc4hapnt, sc4_4reel_alt, sc4hapnt, sc4_state, sc4hapnt, ROT0, "BFM","Happy Notes (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hapntb ,sc4hapnt, sc4_4reel_alt, sc4hapnt, sc4_state, sc4hapnt, ROT0, "BFM","Happy Notes (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hapntc ,sc4hapnt, sc4_4reel_alt, sc4hapnt, sc4_state, sc4hapnt, ROT0, "BFM","Happy Notes (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hapntd ,sc4hapnt, sc4_4reel_alt, sc4hapnt, sc4_state, sc4hapnt, ROT0, "BFM","Happy Notes (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hapnte ,sc4hapnt, sc4_4reel_alt, sc4hapnt, sc4_state, sc4hapnt, ROT0, "BFM","Happy Notes (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4hapnt ,0, sc4_4reel_alt, sc4hapnt, sc4_state, sc4hapnt, ROT0, "BFM","Happy Notes (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hapnta ,sc4hapnt, sc4_4reel_alt, sc4hapnt, sc4_state, sc4hapnt, ROT0, "BFM","Happy Notes (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hapntb ,sc4hapnt, sc4_4reel_alt, sc4hapnt, sc4_state, sc4hapnt, ROT0, "BFM","Happy Notes (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hapntc ,sc4hapnt, sc4_4reel_alt, sc4hapnt, sc4_state, sc4hapnt, ROT0, "BFM","Happy Notes (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hapntd ,sc4hapnt, sc4_4reel_alt, sc4hapnt, sc4_state, sc4hapnt, ROT0, "BFM","Happy Notes (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hapnte ,sc4hapnt, sc4_4reel_alt, sc4hapnt, sc4_state, sc4hapnt, ROT0, "BFM","Happy Notes (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
INPUT_PORTS_START( sc4hellb ) // this structure is generated
@@ -37156,18 +37158,18 @@ INPUT_PORTS_START( sc4hellb ) // this structure is generated
INPUT_PORTS_END
// PR1419 AWP HELLS BELLS PR1402 HELLS BELLS SOUNDS11
-GAMEL( 200?, sc4hellb ,0, sc4, sc4hellb, sc4_state, sc4, ROT0, "BFM","Hells Bells (PR1419) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hellbb ,sc4hellb, sc4, sc4hellb, sc4_state, sc4, ROT0, "BFM","Hells Bells (PR1419) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hellbc ,sc4hellb, sc4, sc4hellb, sc4_state, sc4, ROT0, "BFM","Hells Bells (PR1419) (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hellbd ,sc4hellb, sc4, sc4hellb, sc4_state, sc4, ROT0, "BFM","Hells Bells (PR1419) (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hellbe ,sc4hellb, sc4, sc4hellb, sc4_state, sc4, ROT0, "BFM","Hells Bells (PR1419) (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hellbf ,sc4hellb, sc4, sc4hellb, sc4_state, sc4, ROT0, "BFM","Hells Bells (PR1419) (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4hellb ,0, sc4, sc4hellb, sc4_state, sc4, ROT0, "BFM","Hells Bells (PR1419) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hellbb ,sc4hellb, sc4, sc4hellb, sc4_state, sc4, ROT0, "BFM","Hells Bells (PR1419) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hellbc ,sc4hellb, sc4, sc4hellb, sc4_state, sc4, ROT0, "BFM","Hells Bells (PR1419) (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hellbd ,sc4hellb, sc4, sc4hellb, sc4_state, sc4, ROT0, "BFM","Hells Bells (PR1419) (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hellbe ,sc4hellb, sc4, sc4hellb, sc4_state, sc4, ROT0, "BFM","Hells Bells (PR1419) (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hellbf ,sc4hellb, sc4, sc4hellb, sc4_state, sc4, ROT0, "BFM","Hells Bells (PR1419) (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
// PAY UINT ERR 17
// PR1419 AWP HELLS BELLS PR1402 HELLS BELLS SOUNDS11 HELLS BELLS S.SITE
-GAMEL( 200?, sc4hellbg ,sc4hellb, sc4, sc4hellb, sc4_state, sc4mbus, ROT0, "BFM","Hells Bells (PR1419) (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hellbh ,sc4hellb, sc4, sc4hellb, sc4_state, sc4mbus, ROT0, "BFM","Hells Bells (PR1419) (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hellbi ,sc4hellb, sc4, sc4hellb, sc4_state, sc4mbus, ROT0, "BFM","Hells Bells (PR1419) (Bellfruit) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hellbj ,sc4hellb, sc4, sc4hellb, sc4_state, sc4mbus, ROT0, "BFM","Hells Bells (PR1419) (Bellfruit) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4hellbg ,sc4hellb, sc4, sc4hellb, sc4_state, sc4mbus, ROT0, "BFM","Hells Bells (PR1419) (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hellbh ,sc4hellb, sc4, sc4hellb, sc4_state, sc4mbus, ROT0, "BFM","Hells Bells (PR1419) (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hellbi ,sc4hellb, sc4, sc4hellb, sc4_state, sc4mbus, ROT0, "BFM","Hells Bells (PR1419) (Bellfruit) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hellbj ,sc4hellb, sc4, sc4hellb, sc4_state, sc4mbus, ROT0, "BFM","Hells Bells (PR1419) (Bellfruit) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
// seem to be issues with reel 4
DRIVER_INIT_MEMBER(sc4_state,sc4hill)
@@ -37244,8 +37246,8 @@ INPUT_PORTS_START( sc4hill ) // this structure is generated
INPUT_PORTS_END
// PR1643 AWP HILLBILLIONAIRE SCORP4 PR1613 HILLBILLIONAIRE SOUNDS11 HILLBILLIONAIRE S.SITE
-GAMEL( 200?, sc4hill ,0, sc4, sc4hill, sc4_state, sc4hill, ROT0, "BFM","Hill Billionaire (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hilla ,sc4hill, sc4, sc4hill, sc4_state, sc4hill, ROT0, "BFM","Hill Billionaire (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4hill ,0, sc4, sc4hill, sc4_state, sc4hill, ROT0, "BFM","Hill Billionaire (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hilla ,sc4hill, sc4, sc4hill, sc4_state, sc4hill, ROT0, "BFM","Hill Billionaire (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -37307,14 +37309,14 @@ INPUT_PORTS_START( sc4hiss ) // this structure is generated
INPUT_PORTS_END
// PR2176 HISSING QUID VIPA SOUNDS HISSING QUID
-GAMEL( 200?, sc4hiss ,0, sc4_200_4r, sc4hiss, sc4_state, sc4hiss, ROT0, "Qps","Hissing Quid (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hissa ,sc4hiss, sc4_200_4r, sc4hiss, sc4_state, sc4hiss, ROT0, "Qps","Hissing Quid (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hissb ,sc4hiss, sc4_200_4r, sc4hiss, sc4_state, sc4hiss, ROT0, "Qps","Hissing Quid (Qps) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hissc ,sc4hiss, sc4_200_4r, sc4hiss, sc4_state, sc4hiss, ROT0, "Qps","Hissing Quid (Qps) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hissd ,sc4hiss, sc4_200_4r, sc4hiss, sc4_state, sc4hiss, ROT0, "Qps","Hissing Quid (Qps) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hisse ,sc4hiss, sc4_200_4r, sc4hiss, sc4_state, sc4hiss, ROT0, "Qps","Hissing Quid (Qps) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hissf ,sc4hiss, sc4_200_4r, sc4hiss, sc4_state, sc4hiss, ROT0, "Qps","Hissing Quid (Qps) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hissg ,sc4hiss, sc4_200_4r, sc4hiss, sc4_state, sc4hiss, ROT0, "Qps","Hissing Quid (Qps) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4hiss ,0, sc4_200_4r, sc4hiss, sc4_state, sc4hiss, ROT0, "Qps","Hissing Quid (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hissa ,sc4hiss, sc4_200_4r, sc4hiss, sc4_state, sc4hiss, ROT0, "Qps","Hissing Quid (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hissb ,sc4hiss, sc4_200_4r, sc4hiss, sc4_state, sc4hiss, ROT0, "Qps","Hissing Quid (Qps) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hissc ,sc4hiss, sc4_200_4r, sc4hiss, sc4_state, sc4hiss, ROT0, "Qps","Hissing Quid (Qps) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hissd ,sc4hiss, sc4_200_4r, sc4hiss, sc4_state, sc4hiss, ROT0, "Qps","Hissing Quid (Qps) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hisse ,sc4hiss, sc4_200_4r, sc4hiss, sc4_state, sc4hiss, ROT0, "Qps","Hissing Quid (Qps) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hissf ,sc4hiss, sc4_200_4r, sc4hiss, sc4_state, sc4hiss, ROT0, "Qps","Hissing Quid (Qps) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hissg ,sc4hiss, sc4_200_4r, sc4hiss, sc4_state, sc4hiss, ROT0, "Qps","Hissing Quid (Qps) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -37389,8 +37391,8 @@ INPUT_PORTS_START( sc4hotrd ) // this structure is generated
INPUT_PORTS_END
// PR1733 AWP HOT ROD SCORP4 PR1713 HOT ROD SOUNDS11 HOT ROD S.SITE
-GAMEL( 200?, sc4hotrd ,0, sc4_4reel, sc4hotrd, sc4_state, sc4hotrd, ROT0, "BFM","Hot Rod (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hotrda ,sc4hotrd, sc4_4reel, sc4hotrd, sc4_state, sc4hotrd, ROT0, "BFM","Hot Rod (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4hotrd ,0, sc4_4reel, sc4hotrd, sc4_state, sc4hotrd, ROT0, "BFM","Hot Rod (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hotrda ,sc4hotrd, sc4_4reel, sc4hotrd, sc4_state, sc4hotrd, ROT0, "BFM","Hot Rod (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4hotsh)
@@ -37467,8 +37469,8 @@ INPUT_PORTS_START( sc4hotsh ) // this structure is generated
INPUT_PORTS_END
// PR3231 AWP HOT SHOT SCORP4 PR3211 HOT SHOT SOUNDS11 HOT SHOT S.SITE
-GAMEL( 200?, sc4hotsh ,0, sc4, sc4hotsh, sc4_state, sc4hotsh, ROT0, "BFM","Hot Shot (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hotsha ,sc4hotsh, sc4, sc4hotsh, sc4_state, sc4hotsh, ROT0, "BFM","Hot Shot (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4hotsh ,0, sc4, sc4hotsh, sc4_state, sc4hotsh, ROT0, "BFM","Hot Shot (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hotsha ,sc4hotsh, sc4, sc4hotsh, sc4_state, sc4hotsh, ROT0, "BFM","Hot Shot (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4hotwd)
@@ -37538,14 +37540,14 @@ INPUT_PORTS_START( sc4hotwd ) // this structure is generated
INPUT_PORTS_END
// PR1311 HOT WAD PR1311 HOT WAD SOUNDS11
-GAMEL( 200?, sc4hotwd ,0, sc4_4reel_alt, sc4hotwd, sc4_state, sc4hotwd, ROT0, "BFM","Hot Wad (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hotwda ,sc4hotwd, sc4_4reel_alt, sc4hotwd, sc4_state, sc4hotwd, ROT0, "BFM","Hot Wad (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4hotwd ,0, sc4_4reel_alt, sc4hotwd, sc4_state, sc4hotwd, ROT0, "BFM","Hot Wad (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hotwda ,sc4hotwd, sc4_4reel_alt, sc4hotwd, sc4_state, sc4hotwd, ROT0, "BFM","Hot Wad (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PAY UNIT ERR 17
// PR1311 HOT WAD PR1311 HOT WAD SOUNDS11 2 HOT WAD S.SITE
-GAMEL( 200?, sc4hotwdb ,sc4hotwd, sc4_4reel_alt, sc4hotwd, sc4_state, sc4hotwd, ROT0, "BFM","Hot Wad (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hotwdc ,sc4hotwd, sc4_4reel_alt, sc4hotwd, sc4_state, sc4hotwd, ROT0, "BFM","Hot Wad (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hotwdd ,sc4hotwd, sc4_4reel_alt, sc4hotwd, sc4_state, sc4hotwd, ROT0, "BFM","Hot Wad (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hotwde ,sc4hotwd, sc4_4reel_alt, sc4hotwd, sc4_state, sc4hotwd, ROT0, "BFM","Hot Wad (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4hotwdb ,sc4hotwd, sc4_4reel_alt, sc4hotwd, sc4_state, sc4hotwd, ROT0, "BFM","Hot Wad (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hotwdc ,sc4hotwd, sc4_4reel_alt, sc4hotwd, sc4_state, sc4hotwd, ROT0, "BFM","Hot Wad (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hotwdd ,sc4hotwd, sc4_4reel_alt, sc4hotwd, sc4_state, sc4hotwd, ROT0, "BFM","Hot Wad (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hotwde ,sc4hotwd, sc4_4reel_alt, sc4hotwd, sc4_state, sc4hotwd, ROT0, "BFM","Hot Wad (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4celeb)
@@ -37615,11 +37617,11 @@ INPUT_PORTS_START( sc4celeb ) // this structure is generated
INPUT_PORTS_END
// PR1603 AWP IM A CELEBRITY PR1603 IM A CELEB SOUNDS11 IM A CELEBRITY S.SITE
-GAMEL( 200?, sc4celeb ,0, sc4_4reel_alt, sc4celeb, sc4_state, sc4celeb, ROT0, "BFM","I'm A Celebrity (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4celeba ,sc4celeb, sc4_4reel_alt, sc4celeb, sc4_state, sc4celeb, ROT0, "BFM","I'm A Celebrity (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4celebb ,sc4celeb, sc4_4reel_alt, sc4celeb, sc4_state, sc4celeb, ROT0, "BFM","I'm A Celebrity (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4celebc ,sc4celeb, sc4_4reel_alt, sc4celeb, sc4_state, sc4celeb, ROT0, "BFM","I'm A Celebrity (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4celebd ,sc4celeb, sc4_4reel_alt, sc4celeb, sc4_state, sc4celeb, ROT0, "BFM","I'm A Celebrity (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4celeb ,0, sc4_4reel_alt, sc4celeb, sc4_state, sc4celeb, ROT0, "BFM","I'm A Celebrity (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4celeba ,sc4celeb, sc4_4reel_alt, sc4celeb, sc4_state, sc4celeb, ROT0, "BFM","I'm A Celebrity (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4celebb ,sc4celeb, sc4_4reel_alt, sc4celeb, sc4_state, sc4celeb, ROT0, "BFM","I'm A Celebrity (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4celebc ,sc4celeb, sc4_4reel_alt, sc4celeb, sc4_state, sc4celeb, ROT0, "BFM","I'm A Celebrity (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4celebd ,sc4celeb, sc4_4reel_alt, sc4celeb, sc4_state, sc4celeb, ROT0, "BFM","I'm A Celebrity (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4inspn)
@@ -37672,8 +37674,8 @@ INPUT_PORTS_START( sc4inspn ) // this structure is generated
INPUT_PORTS_END
// PR2555 INNER SPIN V013 INNERSPINSND INNER SPIN
-GAMEL( 200?, sc4inspn ,0, sc4_200_5ra, sc4inspn, sc4_state, sc4inspn, ROT0, "Mazooma","Inner Spin (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4inspna ,sc4inspn, sc4_200_5ra, sc4inspn, sc4_state, sc4inspn, ROT0, "Mazooma","Inner Spin (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4inspn ,0, sc4_200_5ra, sc4inspn, sc4_state, sc4inspn, ROT0, "Mazooma","Inner Spin (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4inspna ,sc4inspn, sc4_200_5ra, sc4inspn, sc4_state, sc4inspn, ROT0, "Mazooma","Inner Spin (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -37747,20 +37749,20 @@ INPUT_PORTS_END
// PR2366 AWP THE ITALIAN JOB S4 PR2366 THE ITALIAN JOB SOUNDS11 ITALIAN JOB S.SITE
-GAMEL( 200?, sc4ijob ,0, sc4_5reel_alt, sc4ijob, sc4_state, sc4ijob, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ijoba ,sc4ijob, sc4_5reel_alt, sc4ijob, sc4_state, sc4ijob, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ijobb ,sc4ijob, sc4_5reel_alt, sc4ijob, sc4_state, sc4ijob, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ijobc ,sc4ijob, sc4_5reel_alt, sc4ijob, sc4_state, sc4ijob, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ijobd ,sc4ijob, sc4_5reel_alt, sc4ijob, sc4_state, sc4ijob, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ijobe ,sc4ijob, sc4_5reel_alt, sc4ijob, sc4_state, sc4ijob, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ijobf ,sc4ijob, sc4_5reel_alt, sc4ijob, sc4_state, sc4ijob, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ijobg ,sc4ijob, sc4_5reel_alt, sc4ijob, sc4_state, sc4ijob, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ijobh ,sc4ijob, sc4_5reel_alt, sc4ijob, sc4_state, sc4ijob, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ijobi ,sc4ijob, sc4_5reel_alt, sc4ijob, sc4_state, sc4ijob, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ijobj ,sc4ijob, sc4_5reel_alt, sc4ijob, sc4_state, sc4ijob, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 4) (set 11)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ijobk ,sc4ijob, sc4_5reel_alt, sc4ijob, sc4_state, sc4ijob, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 4) (set 12)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ijobl ,sc4ijob, sc4_5reel_alt, sc4ijob, sc4_state, sc4ijob, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 4) (set 13)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ijobm ,sc4ijob, sc4_5reel_alt, sc4ijob, sc4_state, sc4ijob, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 4) (set 14)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4ijob ,0, sc4_5reel_alt, sc4ijob, sc4_state, sc4ijob, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ijoba ,sc4ijob, sc4_5reel_alt, sc4ijob, sc4_state, sc4ijob, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ijobb ,sc4ijob, sc4_5reel_alt, sc4ijob, sc4_state, sc4ijob, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ijobc ,sc4ijob, sc4_5reel_alt, sc4ijob, sc4_state, sc4ijob, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ijobd ,sc4ijob, sc4_5reel_alt, sc4ijob, sc4_state, sc4ijob, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ijobe ,sc4ijob, sc4_5reel_alt, sc4ijob, sc4_state, sc4ijob, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ijobf ,sc4ijob, sc4_5reel_alt, sc4ijob, sc4_state, sc4ijob, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ijobg ,sc4ijob, sc4_5reel_alt, sc4ijob, sc4_state, sc4ijob, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ijobh ,sc4ijob, sc4_5reel_alt, sc4ijob, sc4_state, sc4ijob, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ijobi ,sc4ijob, sc4_5reel_alt, sc4ijob, sc4_state, sc4ijob, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ijobj ,sc4ijob, sc4_5reel_alt, sc4ijob, sc4_state, sc4ijob, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 4) (set 11)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ijobk ,sc4ijob, sc4_5reel_alt, sc4ijob, sc4_state, sc4ijob, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 4) (set 12)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ijobl ,sc4ijob, sc4_5reel_alt, sc4ijob, sc4_state, sc4ijob, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 4) (set 13)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ijobm ,sc4ijob, sc4_5reel_alt, sc4ijob, sc4_state, sc4ijob, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 4) (set 14)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4ldvl)
@@ -37831,10 +37833,10 @@ INPUT_PORTS_START( sc4ldvl ) // this structure is generated
INPUT_PORTS_END
// PR2376 LITTLE DEVIL LDEVIL SOUNDS LITTLE DEVIL
-GAMEL( 200?, sc4ldvl ,0, sc4_4reel_alt, sc4ldvl, sc4_state, sc4ldvl, ROT0, "Mazooma","Little Devil (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ldvla ,sc4ldvl, sc4_4reel_alt, sc4ldvl, sc4_state, sc4ldvl, ROT0, "Mazooma","Little Devil (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ldvlb ,sc4ldvl, sc4_4reel_alt, sc4ldvl, sc4_state, sc4ldvl, ROT0, "Mazooma","Little Devil (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ldvlc ,sc4ldvl, sc4_4reel_alt, sc4ldvl, sc4_state, sc4ldvl, ROT0, "Mazooma","Little Devil (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4ldvl ,0, sc4_4reel_alt, sc4ldvl, sc4_state, sc4ldvl, ROT0, "Mazooma","Little Devil (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ldvla ,sc4ldvl, sc4_4reel_alt, sc4ldvl, sc4_state, sc4ldvl, ROT0, "Mazooma","Little Devil (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ldvlb ,sc4ldvl, sc4_4reel_alt, sc4ldvl, sc4_state, sc4ldvl, ROT0, "Mazooma","Little Devil (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ldvlc ,sc4ldvl, sc4_4reel_alt, sc4ldvl, sc4_state, sc4ldvl, ROT0, "Mazooma","Little Devil (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -37903,13 +37905,13 @@ INPUT_PORTS_START( sc4lotrr ) // this structure is generated
INPUT_PORTS_END
// PR1427 AWP RETURN OF THE KING PR1413 RETURN OF THE SOUNDS11 RETURN OF KING S.SITE
-GAMEL( 200?, sc4lotrr ,0, sc4_4reel_alt, sc4lotrr, sc4_state, sc4lotrr, ROT0, "BFM","Lord Of The Rings - Return Of The King (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4lotrra ,sc4lotrr, sc4_4reel_alt, sc4lotrr, sc4_state, sc4lotrr, ROT0, "BFM","Lord Of The Rings - Return Of The King (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4lotrrb ,sc4lotrr, sc4_4reel_alt, sc4lotrr, sc4_state, sc4lotrr, ROT0, "BFM","Lord Of The Rings - Return Of The King (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4lotrrc ,sc4lotrr, sc4_4reel_alt, sc4lotrr, sc4_state, sc4lotrr, ROT0, "BFM","Lord Of The Rings - Return Of The King (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4lotrr ,0, sc4_4reel_alt, sc4lotrr, sc4_state, sc4lotrr, ROT0, "BFM","Lord Of The Rings - Return Of The King (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4lotrra ,sc4lotrr, sc4_4reel_alt, sc4lotrr, sc4_state, sc4lotrr, ROT0, "BFM","Lord Of The Rings - Return Of The King (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4lotrrb ,sc4lotrr, sc4_4reel_alt, sc4lotrr, sc4_state, sc4lotrr, ROT0, "BFM","Lord Of The Rings - Return Of The King (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4lotrrc ,sc4lotrr, sc4_4reel_alt, sc4lotrr, sc4_state, sc4lotrr, ROT0, "BFM","Lord Of The Rings - Return Of The King (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
// PAY UNIT ERR 17
-GAMEL( 200?, sc4lotrrd ,sc4lotrr, sc4_4reel_alt, sc4lotrr, sc4_state, sc4lotrr, ROT0, "BFM","Lord Of The Rings - Return Of The King (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4lotrre ,sc4lotrr, sc4_4reel_alt, sc4lotrr, sc4_state, sc4lotrr, ROT0, "BFM","Lord Of The Rings - Return Of The King (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4lotrrd ,sc4lotrr, sc4_4reel_alt, sc4lotrr, sc4_state, sc4lotrr, ROT0, "BFM","Lord Of The Rings - Return Of The King (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4lotrre ,sc4lotrr, sc4_4reel_alt, sc4lotrr, sc4_state, sc4lotrr, ROT0, "BFM","Lord Of The Rings - Return Of The King (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4manic)
{
@@ -37979,14 +37981,14 @@ INPUT_PORTS_START( sc4manic ) // this structure is generated
INPUT_PORTS_END
// PR3034 AWP MANIC MINER SCORP4 PR3004 MANIC MINER SOUNDS11 MANIC MINER S.SITE
-GAMEL( 200?, sc4manic ,0, sc4_200_5ra, sc4manic, sc4_state, sc4manic, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4manica ,sc4manic, sc4_200_5ra, sc4manic, sc4_state, sc4manic, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4manicb ,sc4manic, sc4_200_5ra, sc4manic, sc4_state, sc4manic, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4manicc ,sc4manic, sc4_200_5ra, sc4manic, sc4_state, sc4manic, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4manicd ,sc4manic, sc4_200_5ra, sc4manic, sc4_state, sc4manic, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4manice ,sc4manic, sc4_200_5ra, sc4manic, sc4_state, sc4manic, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4manicf ,sc4manic, sc4_200_5ra, sc4manic, sc4_state, sc4manic, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4manicg ,sc4manic, sc4_200_5ra, sc4manic, sc4_state, sc4manic, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4manic ,0, sc4_200_5ra, sc4manic, sc4_state, sc4manic, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4manica ,sc4manic, sc4_200_5ra, sc4manic, sc4_state, sc4manic, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4manicb ,sc4manic, sc4_200_5ra, sc4manic, sc4_state, sc4manic, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4manicc ,sc4manic, sc4_200_5ra, sc4manic, sc4_state, sc4manic, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4manicd ,sc4manic, sc4_200_5ra, sc4manic, sc4_state, sc4manic, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4manice ,sc4manic, sc4_200_5ra, sc4manic, sc4_state, sc4manic, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4manicf ,sc4manic, sc4_200_5ra, sc4manic, sc4_state, sc4manic, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4manicg ,sc4manic, sc4_200_5ra, sc4manic, sc4_state, sc4manic, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4mmm)
{
@@ -38057,14 +38059,14 @@ INPUT_PORTS_END
// PR2282 MENTALMONEYMONSTERS MMMO SOUNDS MONEY MONSTERS
-GAMEL( 200?, sc4mmm ,0, sc4_4reel_alt, sc4mmm, sc4_state, sc4mmm, ROT0, "Mazooma","Mental Money Monsters (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mmma ,sc4mmm, sc4_4reel_alt, sc4mmm, sc4_state, sc4mmm, ROT0, "Mazooma","Mental Money Monsters (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mmmb ,sc4mmm, sc4_4reel_alt, sc4mmm, sc4_state, sc4mmm, ROT0, "Mazooma","Mental Money Monsters (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mmmc ,sc4mmm, sc4_4reel_alt, sc4mmm, sc4_state, sc4mmm, ROT0, "Mazooma","Mental Money Monsters (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mmmd ,sc4mmm, sc4_4reel_alt, sc4mmm, sc4_state, sc4mmm, ROT0, "Mazooma","Mental Money Monsters (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mmme ,sc4mmm, sc4_4reel_alt, sc4mmm, sc4_state, sc4mmm, ROT0, "Mazooma","Mental Money Monsters (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mmmf ,sc4mmm, sc4_4reel_alt, sc4mmm, sc4_state, sc4mmm, ROT0, "Mazooma","Mental Money Monsters (Mazooma) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mmmg ,sc4mmm, sc4_4reel_alt, sc4mmm, sc4_state, sc4mmm, ROT0, "Mazooma","Mental Money Monsters (Mazooma) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4mmm ,0, sc4_4reel_alt, sc4mmm, sc4_state, sc4mmm, ROT0, "Mazooma","Mental Money Monsters (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mmma ,sc4mmm, sc4_4reel_alt, sc4mmm, sc4_state, sc4mmm, ROT0, "Mazooma","Mental Money Monsters (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mmmb ,sc4mmm, sc4_4reel_alt, sc4mmm, sc4_state, sc4mmm, ROT0, "Mazooma","Mental Money Monsters (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mmmc ,sc4mmm, sc4_4reel_alt, sc4mmm, sc4_state, sc4mmm, ROT0, "Mazooma","Mental Money Monsters (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mmmd ,sc4mmm, sc4_4reel_alt, sc4mmm, sc4_state, sc4mmm, ROT0, "Mazooma","Mental Money Monsters (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mmme ,sc4mmm, sc4_4reel_alt, sc4mmm, sc4_state, sc4mmm, ROT0, "Mazooma","Mental Money Monsters (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mmmf ,sc4mmm, sc4_4reel_alt, sc4mmm, sc4_state, sc4mmm, ROT0, "Mazooma","Mental Money Monsters (Mazooma) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mmmg ,sc4mmm, sc4_4reel_alt, sc4mmm, sc4_state, sc4mmm, ROT0, "Mazooma","Mental Money Monsters (Mazooma) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4mmad)
{
@@ -38127,15 +38129,15 @@ INPUT_PORTS_START( sc4mmad ) // this structure is generated
INPUT_PORTS_END
// PR2533 MONEY MADNESS MONM SOUNDS MONEY MADNESS
-GAMEL( 200?, sc4mmad ,0, sc4_200_5rc, sc4mmad, sc4_state, sc4mmad, ROT0, "Mazooma","Money Madness (PR2533) (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mmada ,sc4mmad, sc4_200_5rc, sc4mmad, sc4_state, sc4mmad, ROT0, "Mazooma","Money Madness (PR2533) (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mmadb ,sc4mmad, sc4_200_5rc, sc4mmad, sc4_state, sc4mmad, ROT0, "Mazooma","Money Madness (PR2533) (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mmadc ,sc4mmad, sc4_200_5rc, sc4mmad, sc4_state, sc4mmad, ROT0, "Mazooma","Money Madness (PR2533) (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4mmad ,0, sc4_200_5rc, sc4mmad, sc4_state, sc4mmad, ROT0, "Mazooma","Money Madness (PR2533) (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mmada ,sc4mmad, sc4_200_5rc, sc4mmad, sc4_state, sc4mmad, ROT0, "Mazooma","Money Madness (PR2533) (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mmadb ,sc4mmad, sc4_200_5rc, sc4mmad, sc4_state, sc4mmad, ROT0, "Mazooma","Money Madness (PR2533) (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mmadc ,sc4mmad, sc4_200_5rc, sc4mmad, sc4_state, sc4mmad, ROT0, "Mazooma","Money Madness (PR2533) (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR0000 MONEY MADNESS MONM SOUNDS MONEY MADNESS (did Mazooma mess up this release? it has an invalid project code of PR0000, and 3 of the sets are missing their other half)
-GAMEL( 200?, sc4mmadd ,sc4mmad, sc4_200_5rc, sc4mmad, sc4_state, sc4mmad, ROT0, "Mazooma","Money Madness (PR0000) (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mmade ,sc4mmad, sc4_200_5rc, sc4mmad, sc4_state, sc4mmad, ROT0, "Mazooma","Money Madness (PR0000) (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // incomplete pairing
-GAMEL( 200?, sc4mmadf ,sc4mmad, sc4_200_5rc, sc4mmad, sc4_state, sc4mmad, ROT0, "Mazooma","Money Madness (PR0000) (Mazooma) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // incomplete pairing
-GAMEL( 200?, sc4mmadg ,sc4mmad, sc4_200_5rc, sc4mmad, sc4_state, sc4mmad, ROT0, "Mazooma","Money Madness (PR0000) (Mazooma) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // incomplete pairing
+GAMEL( 200?, sc4mmadd ,sc4mmad, sc4_200_5rc, sc4mmad, sc4_state, sc4mmad, ROT0, "Mazooma","Money Madness (PR0000) (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mmade ,sc4mmad, sc4_200_5rc, sc4mmad, sc4_state, sc4mmad, ROT0, "Mazooma","Money Madness (PR0000) (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 ) // incomplete pairing
+GAMEL( 200?, sc4mmadf ,sc4mmad, sc4_200_5rc, sc4mmad, sc4_state, sc4mmad, ROT0, "Mazooma","Money Madness (PR0000) (Mazooma) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 ) // incomplete pairing
+GAMEL( 200?, sc4mmadg ,sc4mmad, sc4_200_5rc, sc4mmad, sc4_state, sc4mmad, ROT0, "Mazooma","Money Madness (PR0000) (Mazooma) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 ) // incomplete pairing
@@ -38209,8 +38211,8 @@ INPUT_PORTS_START( sc4mdm ) // this structure is generated
INPUT_PORTS_END
// PR3333 AWP MONOPOLY DOUBLE MONEY S4 PR3308 MPOLY D MONEY SOUNDS11 DOUBLE MONEY S.SITE
-GAMEL( 200?, sc4mdm ,0, sc4_5reel_alt, sc4mdm, sc4_state, sc4mdm, ROT0, "BFM","Monopoly Double Money (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mdma ,sc4mdm, sc4_5reel_alt, sc4mdm, sc4_state, sc4mdm, ROT0, "BFM","Monopoly Double Money (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4mdm ,0, sc4_5reel_alt, sc4mdm, sc4_state, sc4mdm, ROT0, "BFM","Monopoly Double Money (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mdma ,sc4mdm, sc4_5reel_alt, sc4mdm, sc4_state, sc4mdm, ROT0, "BFM","Monopoly Double Money (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4mhn)
{
@@ -38285,8 +38287,8 @@ INPUT_PORTS_START( sc4mhn ) // this structure is generated
INPUT_PORTS_END
// PR2380 MONOPOLY HERE AND NOW MR2R SOUNDS NITH
-GAMEL( 200?, sc4mhn ,0, sc4_200_4r, sc4mhn, sc4_state, sc4mhn, ROT0, "Mazooma","Monopoly Here & Now (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mhna ,sc4mhn, sc4_200_4r, sc4mhn, sc4_state, sc4mhn, ROT0, "Mazooma","Monopoly Here & Now (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4mhn ,0, sc4_200_4r, sc4mhn, sc4_state, sc4mhn, ROT0, "Mazooma","Monopoly Here & Now (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mhna ,sc4mhn, sc4_200_4r, sc4mhn, sc4_state, sc4mhn, ROT0, "Mazooma","Monopoly Here & Now (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4mhp)
@@ -38358,22 +38360,22 @@ INPUT_PORTS_START( sc4mhp ) // this structure is generated
INPUT_PORTS_END
// PR2345 AWP MONOPOLY HOT PROPERTY S4 PR2345 HOT PROPERTY SOUNDS11 HOT PROPERTY S.SITE
-GAMEL( 200?, sc4mhp ,0, sc4_5reel_alt, sc4mhp, sc4_state, sc4mhp, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // 471
-GAMEL( 200?, sc4mhpa ,sc4mhp, sc4_5reel_alt, sc4mhp, sc4_state, sc4mhp, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // 472
-GAMEL( 200?, sc4mhpb ,sc4mhp, sc4_5reel_alt, sc4mhp, sc4_state, sc4mhp, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // 271
-GAMEL( 200?, sc4mhpc ,sc4mhp, sc4_5reel_alt, sc4mhp, sc4_state, sc4mhp, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // 471
-GAMEL( 200?, sc4mhpd ,sc4mhp, sc4_5reel_alt, sc4mhp, sc4_state, sc4mhp, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // 472
-GAMEL( 200?, sc4mhpe ,sc4mhp, sc4_5reel_alt, sc4mhp, sc4_state, sc4mhp, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // 271
-GAMEL( 200?, sc4mhpf ,sc4mhp, sc4_5reel_alt, sc4mhp, sc4_state, sc4mhp, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // 475
-GAMEL( 200?, sc4mhpg ,sc4mhp, sc4_5reel_alt, sc4mhp, sc4_state, sc4mhp, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // 571
-GAMEL( 200?, sc4mhph ,sc4mhp, sc4_5reel_alt, sc4mhp, sc4_state, sc4mhp, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // 572
-GAMEL( 200?, sc4mhpi ,sc4mhp, sc4_5reel_alt, sc4mhp, sc4_state, sc4mhp, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // 475
-GAMEL( 200?, sc4mhpj ,sc4mhp, sc4_5reel_alt, sc4mhp, sc4_state, sc4mhp, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 11)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // 571
-GAMEL( 200?, sc4mhpk ,sc4mhp, sc4_5reel_alt, sc4mhp, sc4_state, sc4mhp, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 12)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // 572
-GAMEL( 200?, sc4mhpl ,sc4mhp, sc4_5reel_alt, sc4mhp, sc4_state, sc4mhp, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 13)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // 411
-GAMEL( 200?, sc4mhpm ,sc4mhp, sc4_5reel_alt, sc4mhp, sc4_state, sc4mhp, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 14)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // 272
-GAMEL( 200?, sc4mhpn ,sc4mhp, sc4_5reel_alt, sc4mhp, sc4_state, sc4mhp, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 15)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // 272
-GAMEL( 200?, sc4mhpo ,sc4mhp, sc4_5reel_alt, sc4mhp, sc4_state, sc4mhp, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 16)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4mhp ,0, sc4_5reel_alt, sc4mhp, sc4_state, sc4mhp, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // 471
+GAMEL( 200?, sc4mhpa ,sc4mhp, sc4_5reel_alt, sc4mhp, sc4_state, sc4mhp, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // 472
+GAMEL( 200?, sc4mhpb ,sc4mhp, sc4_5reel_alt, sc4mhp, sc4_state, sc4mhp, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 ) // 271
+GAMEL( 200?, sc4mhpc ,sc4mhp, sc4_5reel_alt, sc4mhp, sc4_state, sc4mhp, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 ) // 471
+GAMEL( 200?, sc4mhpd ,sc4mhp, sc4_5reel_alt, sc4mhp, sc4_state, sc4mhp, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 ) // 472
+GAMEL( 200?, sc4mhpe ,sc4mhp, sc4_5reel_alt, sc4mhp, sc4_state, sc4mhp, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 ) // 271
+GAMEL( 200?, sc4mhpf ,sc4mhp, sc4_5reel_alt, sc4mhp, sc4_state, sc4mhp, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 ) // 475
+GAMEL( 200?, sc4mhpg ,sc4mhp, sc4_5reel_alt, sc4mhp, sc4_state, sc4mhp, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 ) // 571
+GAMEL( 200?, sc4mhph ,sc4mhp, sc4_5reel_alt, sc4mhp, sc4_state, sc4mhp, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 ) // 572
+GAMEL( 200?, sc4mhpi ,sc4mhp, sc4_5reel_alt, sc4mhp, sc4_state, sc4mhp, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 ) // 475
+GAMEL( 200?, sc4mhpj ,sc4mhp, sc4_5reel_alt, sc4mhp, sc4_state, sc4mhp, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 11)", MACHINE_FLAGS, layout_bfm_sc4 ) // 571
+GAMEL( 200?, sc4mhpk ,sc4mhp, sc4_5reel_alt, sc4mhp, sc4_state, sc4mhp, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 12)", MACHINE_FLAGS, layout_bfm_sc4 ) // 572
+GAMEL( 200?, sc4mhpl ,sc4mhp, sc4_5reel_alt, sc4mhp, sc4_state, sc4mhp, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 13)", MACHINE_FLAGS, layout_bfm_sc4 ) // 411
+GAMEL( 200?, sc4mhpm ,sc4mhp, sc4_5reel_alt, sc4mhp, sc4_state, sc4mhp, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 14)", MACHINE_FLAGS, layout_bfm_sc4 ) // 272
+GAMEL( 200?, sc4mhpn ,sc4mhp, sc4_5reel_alt, sc4mhp, sc4_state, sc4mhp, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 15)", MACHINE_FLAGS, layout_bfm_sc4 ) // 272
+GAMEL( 200?, sc4mhpo ,sc4mhp, sc4_5reel_alt, sc4mhp, sc4_state, sc4mhp, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 16)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4mmb)
{
@@ -38440,8 +38442,8 @@ INPUT_PORTS_START( sc4mmb ) // this structure is generated
INPUT_PORTS_END
// PR1931 AWP MONOLOLY MONEY BAGS SCORP4 PR1911 MPOLY MONEYBAGS SOUNDS11 MONEYBAGS S.SITE
-GAMEL( 200?, sc4mmb ,0, sc4_4reel_alt, sc4mmb, sc4_state, sc4mmb, ROT0, "BFM","Monopoly Money Bags (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mmba ,sc4mmb, sc4_4reel_alt, sc4mmb, sc4_state, sc4mmb, ROT0, "BFM","Monopoly Money Bags (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4mmb ,0, sc4_4reel_alt, sc4mmb, sc4_state, sc4mmb, ROT0, "BFM","Monopoly Money Bags (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mmba ,sc4mmb, sc4_4reel_alt, sc4mmb, sc4_state, sc4mmb, ROT0, "BFM","Monopoly Money Bags (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4mrh)
{
@@ -38506,12 +38508,12 @@ INPUT_PORTS_START( sc4mrh ) // this structure is generated
INPUT_PORTS_END
// PR2363 RED HOT MONOP MONOPOLY ARCADE MONO SOUNDS MONOPOLY
-GAMEL( 200?, sc4mrh ,0, sc4_3reel_200_48, sc4mrh, sc4_state, sc4mrh, ROT0, "Mazooma","Monopoly Red Hot (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mrha ,sc4mrh, sc4_3reel_200_48, sc4mrh, sc4_state, sc4mrh, ROT0, "Mazooma","Monopoly Red Hot (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mrhb ,sc4mrh, sc4_3reel_200_48, sc4mrh, sc4_state, sc4mrh, ROT0, "Mazooma","Monopoly Red Hot (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mrhc ,sc4mrh, sc4_3reel_200_48, sc4mrh, sc4_state, sc4mrh, ROT0, "Mazooma","Monopoly Red Hot (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mrhd ,sc4mrh, sc4_3reel_200_48, sc4mrh, sc4_state, sc4mrh, ROT0, "Mazooma","Monopoly Red Hot (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mrhe ,sc4mrh, sc4_3reel_200_48, sc4mrh, sc4_state, sc4mrh, ROT0, "Mazooma","Monopoly Red Hot (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4mrh ,0, sc4_3reel_200_48, sc4mrh, sc4_state, sc4mrh, ROT0, "Mazooma","Monopoly Red Hot (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mrha ,sc4mrh, sc4_3reel_200_48, sc4mrh, sc4_state, sc4mrh, ROT0, "Mazooma","Monopoly Red Hot (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mrhb ,sc4mrh, sc4_3reel_200_48, sc4mrh, sc4_state, sc4mrh, ROT0, "Mazooma","Monopoly Red Hot (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mrhc ,sc4mrh, sc4_3reel_200_48, sc4mrh, sc4_state, sc4mrh, ROT0, "Mazooma","Monopoly Red Hot (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mrhd ,sc4mrh, sc4_3reel_200_48, sc4mrh, sc4_state, sc4mrh, ROT0, "Mazooma","Monopoly Red Hot (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mrhe ,sc4mrh, sc4_3reel_200_48, sc4mrh, sc4_state, sc4mrh, ROT0, "Mazooma","Monopoly Red Hot (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4mr2r)
@@ -38582,12 +38584,12 @@ INPUT_PORTS_START( sc4mr2r ) // this structure is generated
INPUT_PORTS_END
// PR2329 MONOPOLY ROAD TO RICHES MR2R SOUNDS ROAD TO RICHES
-GAMEL( 200?, sc4mr2r ,0, sc4_4reel_alt, sc4mr2r, sc4_state, sc4mr2r, ROT0, "Mazooma","Monopoly Road To Riches (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mr2ra ,sc4mr2r, sc4_4reel_alt, sc4mr2r, sc4_state, sc4mr2r, ROT0, "Mazooma","Monopoly Road To Riches (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mr2rb ,sc4mr2r, sc4_4reel_alt, sc4mr2r, sc4_state, sc4mr2r, ROT0, "Mazooma","Monopoly Road To Riches (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mr2rc ,sc4mr2r, sc4_4reel_alt, sc4mr2r, sc4_state, sc4mr2r, ROT0, "Mazooma","Monopoly Road To Riches (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mr2rd ,sc4mr2r, sc4_4reel_alt, sc4mr2r, sc4_state, sc4mr2r, ROT0, "Mazooma","Monopoly Road To Riches (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mr2re ,sc4mr2r, sc4_4reel_alt, sc4mr2r, sc4_state, sc4mr2r, ROT0, "Mazooma","Monopoly Road To Riches (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4mr2r ,0, sc4_4reel_alt, sc4mr2r, sc4_state, sc4mr2r, ROT0, "Mazooma","Monopoly Road To Riches (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mr2ra ,sc4mr2r, sc4_4reel_alt, sc4mr2r, sc4_state, sc4mr2r, ROT0, "Mazooma","Monopoly Road To Riches (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mr2rb ,sc4mr2r, sc4_4reel_alt, sc4mr2r, sc4_state, sc4mr2r, ROT0, "Mazooma","Monopoly Road To Riches (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mr2rc ,sc4mr2r, sc4_4reel_alt, sc4mr2r, sc4_state, sc4mr2r, ROT0, "Mazooma","Monopoly Road To Riches (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mr2rd ,sc4mr2r, sc4_4reel_alt, sc4mr2r, sc4_state, sc4mr2r, ROT0, "Mazooma","Monopoly Road To Riches (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mr2re ,sc4mr2r, sc4_4reel_alt, sc4mr2r, sc4_state, sc4mr2r, ROT0, "Mazooma","Monopoly Road To Riches (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4nmare)
@@ -38661,10 +38663,10 @@ INPUT_PORTS_START( sc4nmare ) // this structure is generated
INPUT_PORTS_END
// PR3032 AWP NIGHTMARE ON ELM STREET S4 PR3002 ELM STREET SOUNDS11 NIGHTMARE ELM ST S.SITE
-GAMEL( 200?, sc4nmare ,0, sc4_5reel, sc4nmare, sc4_state, sc4nmare, ROT0, "BFM","A Nightmare On Elm Street (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4nmarea ,sc4nmare, sc4_5reel, sc4nmare, sc4_state, sc4nmare, ROT0, "BFM","A Nightmare On Elm Street (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4nmareb ,sc4nmare, sc4_5reel, sc4nmare, sc4_state, sc4nmare, ROT0, "BFM","A Nightmare On Elm Street (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4nmarec ,sc4nmare, sc4_5reel, sc4nmare, sc4_state, sc4nmare, ROT0, "BFM","A Nightmare On Elm Street (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4nmare ,0, sc4_5reel, sc4nmare, sc4_state, sc4nmare, ROT0, "BFM","A Nightmare On Elm Street (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4nmarea ,sc4nmare, sc4_5reel, sc4nmare, sc4_state, sc4nmare, ROT0, "BFM","A Nightmare On Elm Street (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4nmareb ,sc4nmare, sc4_5reel, sc4nmare, sc4_state, sc4nmare, ROT0, "BFM","A Nightmare On Elm Street (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4nmarec ,sc4nmare, sc4_5reel, sc4nmare, sc4_state, sc4nmare, ROT0, "BFM","A Nightmare On Elm Street (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4potp)
@@ -38735,8 +38737,8 @@ INPUT_PORTS_START( sc4potp ) // this structure is generated
INPUT_PORTS_END
// PR1612 PICK OF THE PACK PR1612 PICK OF THE PACK SOUNDS11 PICK OF THE PACK S.SITE
-GAMEL( 200?, sc4potp ,0, sc4_4reel_alt, sc4potp, sc4_state, sc4potp, ROT0, "BFM","Pick Of The Pack (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4potpa ,sc4potp, sc4_4reel_alt, sc4potp, sc4_state, sc4potp, ROT0, "BFM","Pick Of The Pack (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4potp ,0, sc4_4reel_alt, sc4potp, sc4_state, sc4potp, ROT0, "BFM","Pick Of The Pack (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4potpa ,sc4potp, sc4_4reel_alt, sc4potp, sc4_state, sc4potp, ROT0, "BFM","Pick Of The Pack (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
INPUT_PORTS_START( sc4ppcr ) // this structure is generated
@@ -38795,18 +38797,18 @@ INPUT_PORTS_START( sc4ppcr ) // this structure is generated
INPUT_PORTS_END
// PR2279 PINK PANTHER CLOUSEAUS REVENGE REVENGE QPS REVENGE SOUNDS
-GAMEL( 200?, sc4ppcr ,0, sc4, sc4ppcr, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Clouseau's Revenge (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ppcra ,sc4ppcr, sc4, sc4ppcr, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Clouseau's Revenge (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ppcrb ,sc4ppcr, sc4, sc4ppcr, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Clouseau's Revenge (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ppcrd ,sc4ppcr, sc4, sc4ppcr, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Clouseau's Revenge (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ppcre ,sc4ppcr, sc4, sc4ppcr, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Clouseau's Revenge (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ppcrf ,sc4ppcr, sc4, sc4ppcr, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Clouseau's Revenge (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ppcrg ,sc4ppcr, sc4, sc4ppcr, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Clouseau's Revenge (Mazooma) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ppcrh ,sc4ppcr, sc4, sc4ppcr, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Clouseau's Revenge (Mazooma) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ppcri ,sc4ppcr, sc4, sc4ppcr, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Clouseau's Revenge (Mazooma) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ppcrj ,sc4ppcr, sc4, sc4ppcr, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Clouseau's Revenge (Mazooma) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4ppcr ,0, sc4, sc4ppcr, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Clouseau's Revenge (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ppcra ,sc4ppcr, sc4, sc4ppcr, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Clouseau's Revenge (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ppcrb ,sc4ppcr, sc4, sc4ppcr, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Clouseau's Revenge (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ppcrd ,sc4ppcr, sc4, sc4ppcr, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Clouseau's Revenge (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ppcre ,sc4ppcr, sc4, sc4ppcr, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Clouseau's Revenge (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ppcrf ,sc4ppcr, sc4, sc4ppcr, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Clouseau's Revenge (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ppcrg ,sc4ppcr, sc4, sc4ppcr, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Clouseau's Revenge (Mazooma) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ppcrh ,sc4ppcr, sc4, sc4ppcr, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Clouseau's Revenge (Mazooma) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ppcri ,sc4ppcr, sc4, sc4ppcr, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Clouseau's Revenge (Mazooma) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ppcrj ,sc4ppcr, sc4, sc4ppcr, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Clouseau's Revenge (Mazooma) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2279 CLOUSEAU TOP BOX COROST_TRIPLE SOUNDS REVENGE TIME
-GAMEL( 200?, sc4ppcrtb ,sc4ppcr, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Clouseau's Revenge Top Box (Mazooma) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4ppcrtb ,sc4ppcr, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Clouseau's Revenge Top Box (Mazooma) (Scorpion 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4ppctc)
@@ -38885,14 +38887,14 @@ INPUT_PORTS_START( sc4ppctc ) // this structure is generated
INPUT_PORTS_END
// PR2407 AWP PINK PANTHER CRACK THE CODE SCORP4 PR2407 CRACK THE CODE SOUNDS11 CRACK THE CODE S.SITE
-GAMEL( 200?, sc4ppctc ,0, sc4, sc4ppctc, sc4_state, sc4ppctc, ROT0, "BFM","Pink Panther Crack The Code (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ppctca ,sc4ppctc, sc4, sc4ppctc, sc4_state, sc4ppctc, ROT0, "BFM","Pink Panther Crack The Code (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ppctcb ,sc4ppctc, sc4, sc4ppctc, sc4_state, sc4ppctc, ROT0, "BFM","Pink Panther Crack The Code (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ppctcc ,sc4ppctc, sc4, sc4ppctc, sc4_state, sc4ppctc, ROT0, "BFM","Pink Panther Crack The Code (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ppctcd ,sc4ppctc, sc4, sc4ppctc, sc4_state, sc4ppctc, ROT0, "BFM","Pink Panther Crack The Code (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ppctce ,sc4ppctc, sc4, sc4ppctc, sc4_state, sc4ppctc, ROT0, "BFM","Pink Panther Crack The Code (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ppctcf ,sc4ppctc, sc4, sc4ppctc, sc4_state, sc4ppctc, ROT0, "BFM","Pink Panther Crack The Code (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ppctcg ,sc4ppctc, sc4, sc4ppctc, sc4_state, sc4ppctc, ROT0, "BFM","Pink Panther Crack The Code (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4ppctc ,0, sc4, sc4ppctc, sc4_state, sc4ppctc, ROT0, "BFM","Pink Panther Crack The Code (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ppctca ,sc4ppctc, sc4, sc4ppctc, sc4_state, sc4ppctc, ROT0, "BFM","Pink Panther Crack The Code (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ppctcb ,sc4ppctc, sc4, sc4ppctc, sc4_state, sc4ppctc, ROT0, "BFM","Pink Panther Crack The Code (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ppctcc ,sc4ppctc, sc4, sc4ppctc, sc4_state, sc4ppctc, ROT0, "BFM","Pink Panther Crack The Code (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ppctcd ,sc4ppctc, sc4, sc4ppctc, sc4_state, sc4ppctc, ROT0, "BFM","Pink Panther Crack The Code (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ppctce ,sc4ppctc, sc4, sc4ppctc, sc4_state, sc4ppctc, ROT0, "BFM","Pink Panther Crack The Code (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ppctcf ,sc4ppctc, sc4, sc4ppctc, sc4_state, sc4ppctc, ROT0, "BFM","Pink Panther Crack The Code (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ppctcg ,sc4ppctc, sc4, sc4ppctc, sc4_state, sc4ppctc, ROT0, "BFM","Pink Panther Crack The Code (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
INPUT_PORTS_START( sc4ppdym ) // this structure is generated
@@ -38952,17 +38954,17 @@ INPUT_PORTS_START( sc4ppdym ) // this structure is generated
INPUT_PORTS_END
// PR2330 PINK PANTHER DYM PINK PANTHER DYM QPS DYMT SOUNDS PINK PANTHER DYM -
-GAMEL( 200?, sc4ppdym ,0, sc4, sc4ppdym, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Double Your Money (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ppdymb ,sc4ppdym, sc4, sc4ppdym, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Double Your Money (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ppdymc ,sc4ppdym, sc4, sc4ppdym, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Double Your Money (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ppdymd ,sc4ppdym, sc4, sc4ppdym, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Double Your Money (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ppdymf ,sc4ppdym, sc4, sc4ppdym, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Double Your Money (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ppdymg ,sc4ppdym, sc4, sc4ppdym, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Double Your Money (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ppdymh ,sc4ppdym, sc4, sc4ppdym, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Double Your Money (Mazooma) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ppdymi ,sc4ppdym, sc4, sc4ppdym, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Double Your Money (Mazooma) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4ppdym ,0, sc4, sc4ppdym, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Double Your Money (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ppdymb ,sc4ppdym, sc4, sc4ppdym, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Double Your Money (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ppdymc ,sc4ppdym, sc4, sc4ppdym, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Double Your Money (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ppdymd ,sc4ppdym, sc4, sc4ppdym, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Double Your Money (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ppdymf ,sc4ppdym, sc4, sc4ppdym, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Double Your Money (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ppdymg ,sc4ppdym, sc4, sc4ppdym, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Double Your Money (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ppdymh ,sc4ppdym, sc4, sc4ppdym, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Double Your Money (Mazooma) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ppdymi ,sc4ppdym, sc4, sc4ppdym, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Double Your Money (Mazooma) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2333 PINK PANTHER TOP BOX DYMT SOUNDS ALL YOUR BASE
-GAMEL( 200?, sc4ppdymtb ,sc4ppdym, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Double Your Money Top Box (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ppdymtba ,sc4ppdym, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Double Your Money Top Box (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4ppdymtb ,sc4ppdym, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Double Your Money Top Box (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ppdymtba ,sc4ppdym, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Double Your Money Top Box (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4pony)
{
@@ -39031,12 +39033,12 @@ INPUT_PORTS_START( sc4pony ) // this structure is generated
INPUT_PORTS_END
// PR1408 PONY EXPRESS PR1408 PONY EXPRESS SOUNDS11 PONY EXPRESS S.SITE
-GAMEL( 200?, sc4pony ,0, sc4_200_5r, sc4pony, sc4_state, sc4pony, ROT0, "BFM","Pony Express (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ponya ,sc4pony, sc4_200_5r, sc4pony, sc4_state, sc4pony, ROT0, "BFM","Pony Express (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ponyb ,sc4pony, sc4_200_5r, sc4pony, sc4_state, sc4pony, ROT0, "BFM","Pony Express (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ponyc ,sc4pony, sc4_200_5r, sc4pony, sc4_state, sc4pony, ROT0, "BFM","Pony Express (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ponyd ,sc4pony, sc4_200_5r, sc4pony, sc4_state, sc4pony, ROT0, "BFM","Pony Express (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ponye ,sc4pony, sc4_200_5r, sc4pony, sc4_state, sc4pony, ROT0, "BFM","Pony Express (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // incomplete pairing
+GAMEL( 200?, sc4pony ,0, sc4_200_5r, sc4pony, sc4_state, sc4pony, ROT0, "BFM","Pony Express (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ponya ,sc4pony, sc4_200_5r, sc4pony, sc4_state, sc4pony, ROT0, "BFM","Pony Express (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ponyb ,sc4pony, sc4_200_5r, sc4pony, sc4_state, sc4pony, ROT0, "BFM","Pony Express (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ponyc ,sc4pony, sc4_200_5r, sc4pony, sc4_state, sc4pony, ROT0, "BFM","Pony Express (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ponyd ,sc4pony, sc4_200_5r, sc4pony, sc4_state, sc4pony, ROT0, "BFM","Pony Express (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ponye ,sc4pony, sc4_200_5r, sc4pony, sc4_state, sc4pony, ROT0, "BFM","Pony Express (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 ) // incomplete pairing
DRIVER_INIT_MEMBER(sc4_state,sc4popey)
@@ -39108,12 +39110,12 @@ INPUT_PORTS_START( sc4popey ) // this structure is generated
INPUT_PORTS_END
// PR2417 AWP POPEYE S4 PR2417 POPEYE SOUNDS11 POPEYE S.SITE
-GAMEL( 200?, sc4popey ,0, sc4_5reel_alt, sc4popey, sc4_state, sc4popey, ROT0, "Mazooma","Popeye (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4popeya ,sc4popey, sc4_5reel_alt, sc4popey, sc4_state, sc4popey, ROT0, "Mazooma","Popeye (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4popeyb ,sc4popey, sc4_5reel_alt, sc4popey, sc4_state, sc4popey, ROT0, "Mazooma","Popeye (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4popeyc ,sc4popey, sc4_5reel_alt, sc4popey, sc4_state, sc4popey, ROT0, "Mazooma","Popeye (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4popeyd ,sc4popey, sc4_5reel_alt, sc4popey, sc4_state, sc4popey, ROT0, "Mazooma","Popeye (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4popeye ,sc4popey, sc4_5reel_alt, sc4popey, sc4_state, sc4popey, ROT0, "Mazooma","Popeye (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4popey ,0, sc4_5reel_alt, sc4popey, sc4_state, sc4popey, ROT0, "Mazooma","Popeye (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4popeya ,sc4popey, sc4_5reel_alt, sc4popey, sc4_state, sc4popey, ROT0, "Mazooma","Popeye (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4popeyb ,sc4popey, sc4_5reel_alt, sc4popey, sc4_state, sc4popey, ROT0, "Mazooma","Popeye (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4popeyc ,sc4popey, sc4_5reel_alt, sc4popey, sc4_state, sc4popey, ROT0, "Mazooma","Popeye (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4popeyd ,sc4popey, sc4_5reel_alt, sc4popey, sc4_state, sc4popey, ROT0, "Mazooma","Popeye (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4popeye ,sc4popey, sc4_5reel_alt, sc4popey, sc4_state, sc4popey, ROT0, "Mazooma","Popeye (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4pwrbl)
@@ -39195,8 +39197,8 @@ INPUT_PORTS_END
// sequel to gamball, mechanical?
// PR1614 AWP POWERBALL POWERBALL S.SITE PR1614 POWERBALL SOUNDS11
-GAMEL( 200?, sc4pwrbl ,0, sc4_4reel, sc4pwrbl, sc4_state, sc4pwrbl, ROT0, "BFM","Powerball (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pwrbla ,sc4pwrbl, sc4_4reel, sc4pwrbl, sc4_state, sc4pwrbl, ROT0, "BFM","Powerball (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4pwrbl ,0, sc4_4reel, sc4pwrbl, sc4_state, sc4pwrbl, ROT0, "BFM","Powerball (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pwrbla ,sc4pwrbl, sc4_4reel, sc4pwrbl, sc4_state, sc4pwrbl, ROT0, "BFM","Powerball (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4quidv)
{
@@ -39264,10 +39266,10 @@ INPUT_PORTS_START( sc4quidv ) // this structure is generated
INPUT_PORTS_END
// PR2342 QUID VICIOUS QUIDV SOUNDS QUID VICIOUS
-GAMEL( 200?, sc4quidv ,0, sc4_4reel_alt, sc4quidv, sc4_state, sc4quidv, ROT0, "Mazooma","Quid Vicious (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4quidva ,sc4quidv, sc4_4reel_alt, sc4quidv, sc4_state, sc4quidv, ROT0, "Mazooma","Quid Vicious (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4quidvb ,sc4quidv, sc4_4reel_alt, sc4quidv, sc4_state, sc4quidv, ROT0, "Mazooma","Quid Vicious (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4quidvc ,sc4quidv, sc4_4reel_alt, sc4quidv, sc4_state, sc4quidv, ROT0, "Mazooma","Quid Vicious (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4quidv ,0, sc4_4reel_alt, sc4quidv, sc4_state, sc4quidv, ROT0, "Mazooma","Quid Vicious (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4quidva ,sc4quidv, sc4_4reel_alt, sc4quidv, sc4_state, sc4quidv, ROT0, "Mazooma","Quid Vicious (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4quidvb ,sc4quidv, sc4_4reel_alt, sc4quidv, sc4_state, sc4quidv, ROT0, "Mazooma","Quid Vicious (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4quidvc ,sc4quidv, sc4_4reel_alt, sc4quidv, sc4_state, sc4quidv, ROT0, "Mazooma","Quid Vicious (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4rhxcs)
{
@@ -39332,12 +39334,12 @@ INPUT_PORTS_START( sc4rhxcs ) // this structure is generated
INPUT_PORTS_END
// PR2364 CASINO RED HOT X RED HOT X CRHX SOUNDS RED HOT X
-GAMEL( 200?, sc4rhxcs ,0, sc4_3reel_200_48, sc4rhxcs, sc4_state, sc4rhxcs, ROT0, "Mazooma","Red Hot X Casino (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rhxcsa ,sc4rhxcs, sc4_3reel_200_48, sc4rhxcs, sc4_state, sc4rhxcs, ROT0, "Mazooma","Red Hot X Casino (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rhxcsb ,sc4rhxcs, sc4_3reel_200_48, sc4rhxcs, sc4_state, sc4rhxcs, ROT0, "Mazooma","Red Hot X Casino (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rhxcsc ,sc4rhxcs, sc4_3reel_200_48, sc4rhxcs, sc4_state, sc4rhxcs, ROT0, "Mazooma","Red Hot X Casino (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rhxcsd ,sc4rhxcs, sc4_3reel_200_48, sc4rhxcs, sc4_state, sc4rhxcs, ROT0, "Mazooma","Red Hot X Casino (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rhxcse ,sc4rhxcs, sc4_3reel_200_48, sc4rhxcs, sc4_state, sc4rhxcs, ROT0, "Mazooma","Red Hot X Casino (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4rhxcs ,0, sc4_3reel_200_48, sc4rhxcs, sc4_state, sc4rhxcs, ROT0, "Mazooma","Red Hot X Casino (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rhxcsa ,sc4rhxcs, sc4_3reel_200_48, sc4rhxcs, sc4_state, sc4rhxcs, ROT0, "Mazooma","Red Hot X Casino (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rhxcsb ,sc4rhxcs, sc4_3reel_200_48, sc4rhxcs, sc4_state, sc4rhxcs, ROT0, "Mazooma","Red Hot X Casino (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rhxcsc ,sc4rhxcs, sc4_3reel_200_48, sc4rhxcs, sc4_state, sc4rhxcs, ROT0, "Mazooma","Red Hot X Casino (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rhxcsd ,sc4rhxcs, sc4_3reel_200_48, sc4rhxcs, sc4_state, sc4rhxcs, ROT0, "Mazooma","Red Hot X Casino (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rhxcse ,sc4rhxcs, sc4_3reel_200_48, sc4rhxcs, sc4_state, sc4rhxcs, ROT0, "Mazooma","Red Hot X Casino (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -39398,10 +39400,10 @@ INPUT_PORTS_END
// PR2557 RED SQUARE REDS SOUNDS RED SQUARE
-GAMEL( 200?, sc4redsq ,0, sc4_4reel, sc4redsq, sc4_state, sc4redsq, ROT0, "Mazooma","Red Square (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4redsqa ,sc4redsq, sc4_4reel, sc4redsq, sc4_state, sc4redsq, ROT0, "Mazooma","Red Square (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4redsqb ,sc4redsq, sc4_4reel, sc4redsq, sc4_state, sc4redsq, ROT0, "Mazooma","Red Square (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4redsqc ,sc4redsq, sc4_4reel, sc4redsq, sc4_state, sc4redsq, ROT0, "Mazooma","Red Square (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4redsq ,0, sc4_4reel, sc4redsq, sc4_state, sc4redsq, ROT0, "Mazooma","Red Square (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4redsqa ,sc4redsq, sc4_4reel, sc4redsq, sc4_state, sc4redsq, ROT0, "Mazooma","Red Square (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4redsqb ,sc4redsq, sc4_4reel, sc4redsq, sc4_state, sc4redsq, ROT0, "Mazooma","Red Square (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4redsqc ,sc4redsq, sc4_4reel, sc4redsq, sc4_state, sc4redsq, ROT0, "Mazooma","Red Square (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -39468,14 +39470,14 @@ INPUT_PORTS_START( sc4rosts ) // this structure is generated
INPUT_PORTS_END
// PR3256 CLUB RONNIE O SULLIVANS TOURNAMENT SCORP4 RONNIE OSULLIVAN CLUB PR3256 RONNIE O SOUNDS11 RONNIE SULLIVAN
-GAMEL( 200?, sc4rosts ,0, sc4_5reel, sc4rosts, sc4_state, sc4rosts, ROT0, "BFM","Ronnie O'Sullivan's Tournament Snooker (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rostsa ,sc4rosts, sc4_5reel, sc4rosts, sc4_state, sc4rosts, ROT0, "BFM","Ronnie O'Sullivan's Tournament Snooker (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rostsb ,sc4rosts, sc4_5reel, sc4rosts, sc4_state, sc4rosts, ROT0, "BFM","Ronnie O'Sullivan's Tournament Snooker (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rostsc ,sc4rosts, sc4_5reel, sc4rosts, sc4_state, sc4rosts, ROT0, "BFM","Ronnie O'Sullivan's Tournament Snooker (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rostsd ,sc4rosts, sc4_5reel, sc4rosts, sc4_state, sc4rosts, ROT0, "BFM","Ronnie O'Sullivan's Tournament Snooker (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rostse ,sc4rosts, sc4_5reel, sc4rosts, sc4_state, sc4rosts, ROT0, "BFM","Ronnie O'Sullivan's Tournament Snooker (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rostsf ,sc4rosts, sc4_5reel, sc4rosts, sc4_state, sc4rosts, ROT0, "BFM","Ronnie O'Sullivan's Tournament Snooker (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rostsg ,sc4rosts, sc4_5reel, sc4rosts, sc4_state, sc4rosts, ROT0, "BFM","Ronnie O'Sullivan's Tournament Snooker (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4rosts ,0, sc4_5reel, sc4rosts, sc4_state, sc4rosts, ROT0, "BFM","Ronnie O'Sullivan's Tournament Snooker (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rostsa ,sc4rosts, sc4_5reel, sc4rosts, sc4_state, sc4rosts, ROT0, "BFM","Ronnie O'Sullivan's Tournament Snooker (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rostsb ,sc4rosts, sc4_5reel, sc4rosts, sc4_state, sc4rosts, ROT0, "BFM","Ronnie O'Sullivan's Tournament Snooker (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rostsc ,sc4rosts, sc4_5reel, sc4rosts, sc4_state, sc4rosts, ROT0, "BFM","Ronnie O'Sullivan's Tournament Snooker (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rostsd ,sc4rosts, sc4_5reel, sc4rosts, sc4_state, sc4rosts, ROT0, "BFM","Ronnie O'Sullivan's Tournament Snooker (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rostse ,sc4rosts, sc4_5reel, sc4rosts, sc4_state, sc4rosts, ROT0, "BFM","Ronnie O'Sullivan's Tournament Snooker (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rostsf ,sc4rosts, sc4_5reel, sc4rosts, sc4_state, sc4rosts, ROT0, "BFM","Ronnie O'Sullivan's Tournament Snooker (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rostsg ,sc4rosts, sc4_5reel, sc4rosts, sc4_state, sc4rosts, ROT0, "BFM","Ronnie O'Sullivan's Tournament Snooker (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4rovrt)
@@ -39551,12 +39553,12 @@ INPUT_PORTS_START( sc4rovrt ) // this structure is generated
INPUT_PORTS_END
// PR2311 ROVERS RETURN ROVERS RETURN SOUNDS ROVERS RETURN
-GAMEL( 200?, sc4rovrt ,0, sc4_200_4ra, sc4rovrt, sc4_state, sc4rovrt, ROT0, "Mazooma","Rovers Return (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rovrta ,sc4rovrt, sc4_200_4ra, sc4rovrt, sc4_state, sc4rovrt, ROT0, "Mazooma","Rovers Return (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rovrtb ,sc4rovrt, sc4_200_4ra, sc4rovrt, sc4_state, sc4rovrt, ROT0, "Mazooma","Rovers Return (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rovrtc ,sc4rovrt, sc4_200_4ra, sc4rovrt, sc4_state, sc4rovrt, ROT0, "Mazooma","Rovers Return (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rovrtd ,sc4rovrt, sc4_200_4ra, sc4rovrt, sc4_state, sc4rovrt, ROT0, "Mazooma","Rovers Return (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rovrte ,sc4rovrt, sc4_200_4ra, sc4rovrt, sc4_state, sc4rovrt, ROT0, "Mazooma","Rovers Return (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4rovrt ,0, sc4_200_4ra, sc4rovrt, sc4_state, sc4rovrt, ROT0, "Mazooma","Rovers Return (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rovrta ,sc4rovrt, sc4_200_4ra, sc4rovrt, sc4_state, sc4rovrt, ROT0, "Mazooma","Rovers Return (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rovrtb ,sc4rovrt, sc4_200_4ra, sc4rovrt, sc4_state, sc4rovrt, ROT0, "Mazooma","Rovers Return (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rovrtc ,sc4rovrt, sc4_200_4ra, sc4rovrt, sc4_state, sc4rovrt, ROT0, "Mazooma","Rovers Return (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rovrtd ,sc4rovrt, sc4_200_4ra, sc4rovrt, sc4_state, sc4rovrt, ROT0, "Mazooma","Rovers Return (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rovrte ,sc4rovrt, sc4_200_4ra, sc4rovrt, sc4_state, sc4rovrt, ROT0, "Mazooma","Rovers Return (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4showt)
{
@@ -39629,13 +39631,13 @@ INPUT_PORTS_START( sc4showt ) // this structure is generated
INPUT_PORTS_END
// PR3043 AWP SHOW TIME S4 PR3013 SHOWTIME SOUNDS11 SHOW TIME S.SITE
-GAMEL( 200?, sc4showt ,0, sc4_200_5rc, sc4showt, sc4_state, sc4showt, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4showta ,sc4showt, sc4_200_5rc, sc4showt, sc4_state, sc4showt, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4showtb ,sc4showt, sc4_200_5rc, sc4showt, sc4_state, sc4showt, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4showtc ,sc4showt, sc4_200_5rc, sc4showt, sc4_state, sc4showt, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4showtd ,sc4showt, sc4_200_5rc, sc4showt, sc4_state, sc4showt, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4showte ,sc4showt, sc4_200_5rc, sc4showt, sc4_state, sc4showt, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4showtf ,sc4showt, sc4_200_5rc, sc4showt, sc4_state, sc4showt, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4showt ,0, sc4_200_5rc, sc4showt, sc4_state, sc4showt, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4showta ,sc4showt, sc4_200_5rc, sc4showt, sc4_state, sc4showt, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4showtb ,sc4showt, sc4_200_5rc, sc4showt, sc4_state, sc4showt, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4showtc ,sc4showt, sc4_200_5rc, sc4showt, sc4_state, sc4showt, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4showtd ,sc4showt, sc4_200_5rc, sc4showt, sc4_state, sc4showt, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4showte ,sc4showt, sc4_200_5rc, sc4showt, sc4_state, sc4showt, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4showtf ,sc4showt, sc4_200_5rc, sc4showt, sc4_state, sc4showt, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4spice)
@@ -39698,10 +39700,10 @@ INPUT_PORTS_START( sc4spice ) // this structure is generated
INPUT_PORTS_END
// PR1921 AWP SPICE IT UP SCORP4 PR1901 SPICE IT UP SOUNDS11 SPICE IT UP S.SITE
-GAMEL( 200?, sc4spice ,0, sc4_4reel_alt, sc4spice, sc4_state, sc4spice, ROT0, "BFM","Spice It Up (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4spicea ,sc4spice, sc4_4reel_alt, sc4spice, sc4_state, sc4spice, ROT0, "BFM","Spice It Up (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4spiceb ,sc4spice, sc4_4reel_alt, sc4spice, sc4_state, sc4spice, ROT0, "BFM","Spice It Up (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4spicec ,sc4spice, sc4_4reel_alt, sc4spice, sc4_state, sc4spice, ROT0, "BFM","Spice It Up (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4spice ,0, sc4_4reel_alt, sc4spice, sc4_state, sc4spice, ROT0, "BFM","Spice It Up (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4spicea ,sc4spice, sc4_4reel_alt, sc4spice, sc4_state, sc4spice, ROT0, "BFM","Spice It Up (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4spiceb ,sc4spice, sc4_4reel_alt, sc4spice, sc4_state, sc4spice, ROT0, "BFM","Spice It Up (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4spicec ,sc4spice, sc4_4reel_alt, sc4spice, sc4_state, sc4spice, ROT0, "BFM","Spice It Up (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4sus)
{
@@ -39769,14 +39771,14 @@ INPUT_PORTS_START( sc4sus ) // this structure is generated
INPUT_PORTS_END
// PR2255 SUITUSIR SUIT SOUNDS SUITS U SIR
-GAMEL( 200?, sc4sus ,0, sc4_4reel_alt, sc4sus, sc4_state, sc4sus, ROT0, "Qps","Suits U Sir (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4susc ,sc4sus, sc4_4reel_alt, sc4sus, sc4_state, sc4sus, ROT0, "Qps","Suits U Sir (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4susf ,sc4sus, sc4_4reel_alt, sc4sus, sc4_state, sc4sus, ROT0, "Qps","Suits U Sir (Qps) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4susg ,sc4sus, sc4_4reel_alt, sc4sus, sc4_state, sc4sus, ROT0, "Qps","Suits U Sir (Qps) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4sush ,sc4sus, sc4_4reel_alt, sc4sus, sc4_state, sc4sus, ROT0, "Qps","Suits U Sir (Qps) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4susi ,sc4sus, sc4_4reel_alt, sc4sus, sc4_state, sc4sus, ROT0, "Qps","Suits U Sir (Qps) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4susj ,sc4sus, sc4_4reel_alt, sc4sus, sc4_state, sc4sus, ROT0, "Qps","Suits U Sir (Qps) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4susk ,sc4sus, sc4_4reel_alt, sc4sus, sc4_state, sc4sus, ROT0, "Qps","Suits U Sir (Qps) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4sus ,0, sc4_4reel_alt, sc4sus, sc4_state, sc4sus, ROT0, "Qps","Suits U Sir (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4susc ,sc4sus, sc4_4reel_alt, sc4sus, sc4_state, sc4sus, ROT0, "Qps","Suits U Sir (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4susf ,sc4sus, sc4_4reel_alt, sc4sus, sc4_state, sc4sus, ROT0, "Qps","Suits U Sir (Qps) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4susg ,sc4sus, sc4_4reel_alt, sc4sus, sc4_state, sc4sus, ROT0, "Qps","Suits U Sir (Qps) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4sush ,sc4sus, sc4_4reel_alt, sc4sus, sc4_state, sc4sus, ROT0, "Qps","Suits U Sir (Qps) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4susi ,sc4sus, sc4_4reel_alt, sc4sus, sc4_state, sc4sus, ROT0, "Qps","Suits U Sir (Qps) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4susj ,sc4sus, sc4_4reel_alt, sc4sus, sc4_state, sc4sus, ROT0, "Qps","Suits U Sir (Qps) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4susk ,sc4sus, sc4_4reel_alt, sc4sus, sc4_state, sc4sus, ROT0, "Qps","Suits U Sir (Qps) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4sslam)
@@ -39838,8 +39840,8 @@ INPUT_PORTS_START( sc4sslam ) // this structure is generated
INPUT_PORTS_END
// PR3081 CLUB SUPER SLAM SUPER SLAM CLUB PR3080 SUPER SLAM SOUNDS11
-GAMEL( 200?, sc4sslam ,0, sc4_5reel, sc4sslam, sc4_state, sc4sslam, ROT0, "BFM","Super Slam (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4sslama ,sc4sslam, sc4_5reel, sc4sslam, sc4_state, sc4sslam, ROT0, "BFM","Super Slam (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4sslam ,0, sc4_5reel, sc4sslam, sc4_state, sc4sslam, ROT0, "BFM","Super Slam (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4sslama ,sc4sslam, sc4_5reel, sc4sslam, sc4_state, sc4sslam, ROT0, "BFM","Super Slam (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// reel setup NOT correct, this will spin forever on some things
@@ -39909,10 +39911,10 @@ INPUT_PORTS_START( sc4swbak ) // this structure is generated
INPUT_PORTS_END
// PR2235 SWITCHBACK SWBK SOUNDS SWITCHBACK
-GAMEL( 200?, sc4swbak ,0, sc4_200_5ra, sc4swbak, sc4_state, sc4swbak, ROT0, "QPS","Switch Back (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4swbaka ,sc4swbak, sc4_200_5ra, sc4swbak, sc4_state, sc4swbak, ROT0, "QPS","Switch Back (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4swbakb ,sc4swbak, sc4_200_5ra, sc4swbak, sc4_state, sc4swbak, ROT0, "QPS","Switch Back (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4swbakc ,sc4swbak, sc4_200_5ra, sc4swbak, sc4_state, sc4swbak, ROT0, "QPS","Switch Back (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4swbak ,0, sc4_200_5ra, sc4swbak, sc4_state, sc4swbak, ROT0, "QPS","Switch Back (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4swbaka ,sc4swbak, sc4_200_5ra, sc4swbak, sc4_state, sc4swbak, ROT0, "QPS","Switch Back (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4swbakb ,sc4swbak, sc4_200_5ra, sc4swbak, sc4_state, sc4swbak, ROT0, "QPS","Switch Back (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4swbakc ,sc4swbak, sc4_200_5ra, sc4swbak, sc4_state, sc4swbak, ROT0, "QPS","Switch Back (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4ttpie)
@@ -39981,15 +39983,15 @@ INPUT_PORTS_START( sc4ttpie ) // this structure is generated
INPUT_PORTS_END
// PR1714 AWP TAKE THE PIECE S4 PR1714 TAKE THE PIECE SOUNDS11 TAKETHEPIECE S.SITE
-GAMEL( 200?, sc4ttpie ,0, sc4_5reel, sc4ttpie, sc4_state, sc4ttpie, ROT0, "BFM","Take The Piece (Bellfruit) (PR1714) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ttpiec ,sc4ttpie, sc4_5reel, sc4ttpie, sc4_state, sc4ttpie, ROT0, "BFM","Take The Piece (Bellfruit) (PR1714) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4ttpie ,0, sc4_5reel, sc4ttpie, sc4_state, sc4ttpie, ROT0, "BFM","Take The Piece (Bellfruit) (PR1714) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ttpiec ,sc4ttpie, sc4_5reel, sc4ttpie, sc4_state, sc4ttpie, ROT0, "BFM","Take The Piece (Bellfruit) (PR1714) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR1734 AWP TAKE THE PIECE S4 PR1714 TAKE THE PIECE SOUNDS11 TAKETHEPIECE S.SITE
-GAMEL( 200?, sc4ttpiea ,sc4ttpie, sc4_5reel, sc4ttpie, sc4_state, sc4ttpie, ROT0, "BFM","Take The Piece (Bellfruit) (PR1734) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ttpieb ,sc4ttpie, sc4_5reel, sc4ttpie, sc4_state, sc4ttpie, ROT0, "BFM","Take The Piece (Bellfruit) (PR1734) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ttpied ,sc4ttpie, sc4_5reel, sc4ttpie, sc4_state, sc4ttpie, ROT0, "BFM","Take The Piece (Bellfruit) (PR1734) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ttpiee ,sc4ttpie, sc4_5reel, sc4ttpie, sc4_state, sc4ttpie, ROT0, "BFM","Take The Piece (Bellfruit) (PR1734) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ttpief ,sc4ttpie, sc4_5reel, sc4ttpie, sc4_state, sc4ttpie, ROT0, "BFM","Take The Piece (Bellfruit) (PR1734) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ttpieg ,sc4ttpie, sc4_5reel, sc4ttpie, sc4_state, sc4ttpie, ROT0, "BFM","Take The Piece (Bellfruit) (PR1734) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4ttpiea ,sc4ttpie, sc4_5reel, sc4ttpie, sc4_state, sc4ttpie, ROT0, "BFM","Take The Piece (Bellfruit) (PR1734) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ttpieb ,sc4ttpie, sc4_5reel, sc4ttpie, sc4_state, sc4ttpie, ROT0, "BFM","Take The Piece (Bellfruit) (PR1734) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ttpied ,sc4ttpie, sc4_5reel, sc4ttpie, sc4_state, sc4ttpie, ROT0, "BFM","Take The Piece (Bellfruit) (PR1734) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ttpiee ,sc4ttpie, sc4_5reel, sc4ttpie, sc4_state, sc4ttpie, ROT0, "BFM","Take The Piece (Bellfruit) (PR1734) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ttpief ,sc4ttpie, sc4_5reel, sc4ttpie, sc4_state, sc4ttpie, ROT0, "BFM","Take The Piece (Bellfruit) (PR1734) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ttpieg ,sc4ttpie, sc4_5reel, sc4ttpie, sc4_state, sc4ttpie, ROT0, "BFM","Take The Piece (Bellfruit) (PR1734) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4typ)
@@ -40062,10 +40064,10 @@ INPUT_PORTS_START( sc4typ ) // this structure is generated
INPUT_PORTS_END
// PR3031 AWP TAKE YOUR PICK S4 PR3001 TAKE YOUR PICK SOUNDS11 TAKE YOUR PICK S.SITE
-GAMEL( 200?, sc4typ ,0, sc4, sc4typ, sc4_state, sc4typ, ROT0, "BFM","Take Your Pick (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4typa ,sc4typ, sc4, sc4typ, sc4_state, sc4typ, ROT0, "BFM","Take Your Pick (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4typb ,sc4typ, sc4, sc4typ, sc4_state, sc4typ, ROT0, "BFM","Take Your Pick (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4typc ,sc4typ, sc4, sc4typ, sc4_state, sc4typ, ROT0, "BFM","Take Your Pick (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4typ ,0, sc4, sc4typ, sc4_state, sc4typ, ROT0, "BFM","Take Your Pick (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4typa ,sc4typ, sc4, sc4typ, sc4_state, sc4typ, ROT0, "BFM","Take Your Pick (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4typb ,sc4typ, sc4, sc4typ, sc4_state, sc4typ, ROT0, "BFM","Take Your Pick (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4typc ,sc4typ, sc4, sc4typ, sc4_state, sc4typ, ROT0, "BFM","Take Your Pick (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4trail)
{
@@ -40119,10 +40121,10 @@ INPUT_PORTS_START( sc4trail ) // this structure is generated
INPUT_PORTS_END
// PR2170 TRAIL BLAZER TRAB SOUNDS TRAIL BLAZER
-GAMEL( 200?, sc4trail ,0, sc4_4reel_alt, sc4trail, sc4_state, sc4trail, ROT0, "Mazooma","Trailblazer (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4traila ,sc4trail, sc4_4reel_alt, sc4trail, sc4_state, sc4trail, ROT0, "Mazooma","Trailblazer (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4trailb ,sc4trail, sc4_4reel_alt, sc4trail, sc4_state, sc4trail, ROT0, "Mazooma","Trailblazer (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4trailc ,sc4trail, sc4_4reel_alt, sc4trail, sc4_state, sc4trail, ROT0, "Mazooma","Trailblazer (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4trail ,0, sc4_4reel_alt, sc4trail, sc4_state, sc4trail, ROT0, "Mazooma","Trailblazer (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4traila ,sc4trail, sc4_4reel_alt, sc4trail, sc4_state, sc4trail, ROT0, "Mazooma","Trailblazer (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4trailb ,sc4trail, sc4_4reel_alt, sc4trail, sc4_state, sc4trail, ROT0, "Mazooma","Trailblazer (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4trailc ,sc4trail, sc4_4reel_alt, sc4trail, sc4_state, sc4trail, ROT0, "Mazooma","Trailblazer (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -40194,13 +40196,13 @@ INPUT_PORTS_START( sc4bpb ) // this structure is generated
INPUT_PORTS_END
// PR1728 AWP BULLY'S PRIZE BOARD PR1708 B PRIZE BOARD SOUNDS11 BULLYSPRIZEBOARD S.SITE
-GAMEL( 200?, sc4bpb ,0, sc4_5reel, sc4bpb, sc4_state, sc4bpb, ROT0, "BFM","Bully's Prize Board (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bpbc ,sc4bpb, sc4_5reel, sc4bpb, sc4_state, sc4bpb, ROT0, "BFM","Bully's Prize Board (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4bpb ,0, sc4_5reel, sc4bpb, sc4_state, sc4bpb, ROT0, "BFM","Bully's Prize Board (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bpbc ,sc4bpb, sc4_5reel, sc4bpb, sc4_state, sc4bpb, ROT0, "BFM","Bully's Prize Board (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR1728 AWP BULLY'S PRIZE BOARD S4 PR1708 B PRIZE BOARD SOUNDS11 BULLYSPRIZEBOARD S.SITE
-GAMEL( 200?, sc4bpba ,sc4bpb, sc4_5reel, sc4bpb, sc4_state, sc4bpb, ROT0, "BFM","Bully's Prize Board (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bpbb ,sc4bpb, sc4_5reel, sc4bpb, sc4_state, sc4bpb, ROT0, "BFM","Bully's Prize Board (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bpbd ,sc4bpb, sc4_5reel, sc4bpb, sc4_state, sc4bpb, ROT0, "BFM","Bully's Prize Board (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bpbe ,sc4bpb, sc4_5reel, sc4bpb, sc4_state, sc4bpb, ROT0, "BFM","Bully's Prize Board (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4bpba ,sc4bpb, sc4_5reel, sc4bpb, sc4_state, sc4bpb, ROT0, "BFM","Bully's Prize Board (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bpbb ,sc4bpb, sc4_5reel, sc4bpb, sc4_state, sc4bpb, ROT0, "BFM","Bully's Prize Board (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bpbd ,sc4bpb, sc4_5reel, sc4bpb, sc4_state, sc4bpb, ROT0, "BFM","Bully's Prize Board (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bpbe ,sc4bpb, sc4_5reel, sc4bpb, sc4_state, sc4bpb, ROT0, "BFM","Bully's Prize Board (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4bsp)
@@ -40271,15 +40273,15 @@ INPUT_PORTS_START( sc4bsp ) // this structure is generated
INPUT_PORTS_END
// PR3040 AWP BULLYS STAR PRIZE SCORP4 PR3012 BULLYS STAR P SOUNDS11 BULLYS STARPRIZE S.SITE
-GAMEL( 200?, sc4bsp ,0, sc4_200_5ra, sc4bsp, sc4_state, sc4bsp, ROT0, "BFM","Bully's Star Prize (PR3040) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bspa ,sc4bsp, sc4_200_5ra, sc4bsp, sc4_state, sc4bsp, ROT0, "BFM","Bully's Star Prize (PR3040) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bspb ,sc4bsp, sc4_200_5ra, sc4bsp, sc4_state, sc4bsp, ROT0, "BFM","Bully's Star Prize (PR3040) (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bspc ,sc4bsp, sc4_200_5ra, sc4bsp, sc4_state, sc4bsp, ROT0, "BFM","Bully's Star Prize (PR3040) (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bspd ,sc4bsp, sc4_200_5ra, sc4bsp, sc4_state, sc4bsp, ROT0, "BFM","Bully's Star Prize (PR3040) (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bspg ,sc4bsp, sc4_200_5ra, sc4bsp, sc4_state, sc4bsp, ROT0, "BFM","Bully's Star Prize (PR3040) (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4bsp ,0, sc4_200_5ra, sc4bsp, sc4_state, sc4bsp, ROT0, "BFM","Bully's Star Prize (PR3040) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bspa ,sc4bsp, sc4_200_5ra, sc4bsp, sc4_state, sc4bsp, ROT0, "BFM","Bully's Star Prize (PR3040) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bspb ,sc4bsp, sc4_200_5ra, sc4bsp, sc4_state, sc4bsp, ROT0, "BFM","Bully's Star Prize (PR3040) (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bspc ,sc4bsp, sc4_200_5ra, sc4bsp, sc4_state, sc4bsp, ROT0, "BFM","Bully's Star Prize (PR3040) (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bspd ,sc4bsp, sc4_200_5ra, sc4bsp, sc4_state, sc4bsp, ROT0, "BFM","Bully's Star Prize (PR3040) (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bspg ,sc4bsp, sc4_200_5ra, sc4bsp, sc4_state, sc4bsp, ROT0, "BFM","Bully's Star Prize (PR3040) (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR3042 AWP BULLYS STAR PRIZE SCORP4 PR3012 BULLYS STAR P SOUNDS11 BULLYS STARPRIZE S.SITE
-GAMEL( 200?, sc4bspe ,sc4bsp, sc4_200_5ra, sc4bsp, sc4_state, sc4bsp, ROT0, "BFM","Bully's Star Prize (PR3042) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bspf ,sc4bsp, sc4_200_5ra, sc4bsp, sc4_state, sc4bsp, ROT0, "BFM","Bully's Star Prize (PR3042) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4bspe ,sc4bsp, sc4_200_5ra, sc4bsp, sc4_state, sc4bsp, ROT0, "BFM","Bully's Star Prize (PR3042) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bspf ,sc4bsp, sc4_200_5ra, sc4bsp, sc4_state, sc4bsp, ROT0, "BFM","Bully's Star Prize (PR3042) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4chain)
@@ -40356,10 +40358,10 @@ INPUT_PORTS_START( sc4chain ) // this structure is generated
INPUT_PORTS_END
// PR1316 AWP CHAIN REACTION PR1312 CHAIN REACT SOUNDS11
-GAMEL( 200?, sc4chain ,0, sc4_5reel_alt, sc4chain, sc4_state, sc4chain, ROT0, "BFM","Chain Reaction (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4chaina ,sc4chain, sc4_5reel_alt, sc4chain, sc4_state, sc4chain, ROT0, "BFM","Chain Reaction (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4chainb ,sc4chain, sc4_5reel_alt, sc4chain, sc4_state, sc4chain, ROT0, "BFM","Chain Reaction (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4chainc ,sc4chain, sc4_5reel_alt, sc4chain, sc4_state, sc4chain, ROT0, "BFM","Chain Reaction (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4chain ,0, sc4_5reel_alt, sc4chain, sc4_state, sc4chain, ROT0, "BFM","Chain Reaction (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4chaina ,sc4chain, sc4_5reel_alt, sc4chain, sc4_state, sc4chain, ROT0, "BFM","Chain Reaction (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4chainb ,sc4chain, sc4_5reel_alt, sc4chain, sc4_state, sc4chain, ROT0, "BFM","Chain Reaction (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4chainc ,sc4chain, sc4_5reel_alt, sc4chain, sc4_state, sc4chain, ROT0, "BFM","Chain Reaction (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4clown)
@@ -40435,14 +40437,14 @@ INPUT_PORTS_START( sc4clown ) // this structure is generated
INPUT_PORTS_END
// PR1727 AWP CLOWN AROUND SCORP4 PR1707 CLOWN AROUND SOUNDS11 CLOWN AROUND S.SITE
-GAMEL( 200?, sc4clown ,0, sc4_200_5rc, sc4clown, sc4_state, sc4clown, ROT0, "BFM","Clown Around (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4clowna ,sc4clown, sc4_200_5rc, sc4clown, sc4_state, sc4clown, ROT0, "BFM","Clown Around (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4clownb ,sc4clown, sc4_200_5rc, sc4clown, sc4_state, sc4clown, ROT0, "BFM","Clown Around (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4clownc ,sc4clown, sc4_200_5rc, sc4clown, sc4_state, sc4clown, ROT0, "BFM","Clown Around (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4clownd ,sc4clown, sc4_200_5rc, sc4clown, sc4_state, sc4clown, ROT0, "BFM","Clown Around (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4clowne ,sc4clown, sc4_200_5rc, sc4clown, sc4_state, sc4clown, ROT0, "BFM","Clown Around (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4clownf ,sc4clown, sc4_200_5rc, sc4clown, sc4_state, sc4clown, ROT0, "BFM","Clown Around (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4clowng ,sc4clown, sc4_200_5rc, sc4clown, sc4_state, sc4clown, ROT0, "BFM","Clown Around (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4clown ,0, sc4_200_5rc, sc4clown, sc4_state, sc4clown, ROT0, "BFM","Clown Around (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4clowna ,sc4clown, sc4_200_5rc, sc4clown, sc4_state, sc4clown, ROT0, "BFM","Clown Around (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4clownb ,sc4clown, sc4_200_5rc, sc4clown, sc4_state, sc4clown, ROT0, "BFM","Clown Around (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4clownc ,sc4clown, sc4_200_5rc, sc4clown, sc4_state, sc4clown, ROT0, "BFM","Clown Around (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4clownd ,sc4clown, sc4_200_5rc, sc4clown, sc4_state, sc4clown, ROT0, "BFM","Clown Around (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4clowne ,sc4clown, sc4_200_5rc, sc4clown, sc4_state, sc4clown, ROT0, "BFM","Clown Around (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4clownf ,sc4clown, sc4_200_5rc, sc4clown, sc4_state, sc4clown, ROT0, "BFM","Clown Around (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4clowng ,sc4clown, sc4_200_5rc, sc4clown, sc4_state, sc4clown, ROT0, "BFM","Clown Around (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
INPUT_PORTS_START( sc4mowow ) // this structure is generated
PORT_INCLUDE( sc4_base )
@@ -40492,16 +40494,16 @@ INPUT_PORTS_START( sc4mowow ) // this structure is generated
INPUT_PORTS_END
/* wrong sound roms */
-GAMEL( 200?, sc4mowow ,0, sc4, sc4mowow, sc4_state, sc4, ROT0, "Mazooma","Monopoly Wheel Of Wealth (Mazooma) (PR2118) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // PR2118 MONOPOLY WOTW WOTW SOUNDS MONOPOLY WOTW 8P
-GAMEL( 200?, sc4mowowa ,sc4mowow, sc4, sc4mowow, sc4_state, sc4, ROT0, "Mazooma","Monopoly Wheel Of Wealth (Mazooma) (PR2118) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // ^^
-GAMEL( 200?, sc4mowowb ,sc4mowow, sc4, sc4mowow, sc4_state, sc4, ROT0, "Mazooma","Monopoly Wheel Of Wealth (Mazooma) (PR2118) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // ^^
-GAMEL( 200?, sc4mowowc ,sc4mowow, sc4, sc4mowow, sc4_state, sc4, ROT0, "Mazooma","Monopoly Wheel Of Wealth (Mazooma) (PR2118) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // ^^
+GAMEL( 200?, sc4mowow ,0, sc4, sc4mowow, sc4_state, sc4, ROT0, "Mazooma","Monopoly Wheel Of Wealth (Mazooma) (PR2118) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // PR2118 MONOPOLY WOTW WOTW SOUNDS MONOPOLY WOTW 8P
+GAMEL( 200?, sc4mowowa ,sc4mowow, sc4, sc4mowow, sc4_state, sc4, ROT0, "Mazooma","Monopoly Wheel Of Wealth (Mazooma) (PR2118) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // ^^
+GAMEL( 200?, sc4mowowb ,sc4mowow, sc4, sc4mowow, sc4_state, sc4, ROT0, "Mazooma","Monopoly Wheel Of Wealth (Mazooma) (PR2118) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 ) // ^^
+GAMEL( 200?, sc4mowowc ,sc4mowow, sc4, sc4mowow, sc4_state, sc4, ROT0, "Mazooma","Monopoly Wheel Of Wealth (Mazooma) (PR2118) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 ) // ^^
-GAMEL( 200?, sc4mwwtb ,0, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly Wheel Of Wealth (Mazooma) (PR2389, Top Box) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // PR2389 WHEEL OF WEALTH WOWT SOUNDS WHEEL OF WEAL
-GAMEL( 200?, sc4mwwtba ,sc4mwwtb, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly Wheel Of Wealth (Mazooma) (PR2389, Top Box) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // ^^
-GAMEL( 200?, sc4mwwtbb ,sc4mwwtb, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly Wheel Of Wealth (Mazooma) (PR2389, Top Box) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // ^^
-GAMEL( 200?, sc4mwwtbc ,sc4mwwtb, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly Wheel Of Wealth (Mazooma) (PR2389, Top Box) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
-GAMEL( 200?, sc4mwwtbd ,sc4mwwtb, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly Wheel Of Wealth (Mazooma) (PR2389, Top Box) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4mwwtb ,0, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly Wheel Of Wealth (Mazooma) (PR2389, Top Box) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // PR2389 WHEEL OF WEALTH WOWT SOUNDS WHEEL OF WEAL
+GAMEL( 200?, sc4mwwtba ,sc4mwwtb, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly Wheel Of Wealth (Mazooma) (PR2389, Top Box) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // ^^
+GAMEL( 200?, sc4mwwtbb ,sc4mwwtb, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly Wheel Of Wealth (Mazooma) (PR2389, Top Box) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 ) // ^^
+GAMEL( 200?, sc4mwwtbc ,sc4mwwtb, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly Wheel Of Wealth (Mazooma) (PR2389, Top Box) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4mwwtbd ,sc4mwwtb, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly Wheel Of Wealth (Mazooma) (PR2389, Top Box) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
DRIVER_INIT_MEMBER(sc4_state,sc4bwow)
@@ -40571,8 +40573,8 @@ INPUT_PORTS_START( sc4bwow ) // this structure is generated
// 0x0010 - "hopdmp" // standard input (expected here)
INPUT_PORTS_END
-GAMEL( 200?, sc4bwow ,0, sc4_200_5ra, sc4bwow, sc4_state, sc4bwow, ROT0, "BFM","Wheel Of Wealth (Bellfruit) (PR1726) (Scorpion 4) (WHEL013, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // PR1726 AWP WHEEL OF WEALTH PR1706 WHEEL OF WEALTH SOUNDS11 WHEEL OF WEALTH S.SITE
-GAMEL( 200?, sc4bwowa ,sc4bwow, sc4_200_5ra, sc4bwow, sc4_state, sc4bwow, ROT0, "BFM","Wheel Of Wealth (Bellfruit) (PR1726) (Scorpion 4) (WHEL013, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // ^^
+GAMEL( 200?, sc4bwow ,0, sc4_200_5ra, sc4bwow, sc4_state, sc4bwow, ROT0, "BFM","Wheel Of Wealth (Bellfruit) (PR1726) (Scorpion 4) (WHEL013, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // PR1726 AWP WHEEL OF WEALTH PR1706 WHEEL OF WEALTH SOUNDS11 WHEEL OF WEALTH S.SITE
+GAMEL( 200?, sc4bwowa ,sc4bwow, sc4_200_5ra, sc4bwow, sc4_state, sc4bwow, ROT0, "BFM","Wheel Of Wealth (Bellfruit) (PR1726) (Scorpion 4) (WHEL013, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // ^^
DRIVER_INIT_MEMBER(sc4_state,sc4nunsm)
@@ -40634,16 +40636,16 @@ INPUT_PORTS_START( sc4nunsm ) // this structure is generated
INPUT_PORTS_END
// PR2166 NUN N ROSES NANR SOUNDS NUNS N ROSES
-GAMEL( 200?, sc4nunsm ,0, sc4_200_4ra, sc4nunsm, sc4_state, sc4nunsm, ROT0, "Mazooma","Nuns 'n' Roses (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4nunsmb ,sc4nunsm, sc4_200_4ra, sc4nunsm, sc4_state, sc4nunsm, ROT0, "Mazooma","Nuns 'n' Roses (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4nunsmc ,sc4nunsm, sc4_200_4ra, sc4nunsm, sc4_state, sc4nunsm, ROT0, "Mazooma","Nuns 'n' Roses (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4nunsmd ,sc4nunsm, sc4_200_4ra, sc4nunsm, sc4_state, sc4nunsm, ROT0, "Mazooma","Nuns 'n' Roses (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4nunsme ,sc4nunsm, sc4_200_4ra, sc4nunsm, sc4_state, sc4nunsm, ROT0, "Mazooma","Nuns 'n' Roses (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4nunsmf ,sc4nunsm, sc4_200_4ra, sc4nunsm, sc4_state, sc4nunsm, ROT0, "Mazooma","Nuns 'n' Roses (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4nunsmg ,sc4nunsm, sc4_200_4ra, sc4nunsm, sc4_state, sc4nunsm, ROT0, "Mazooma","Nuns 'n' Roses (Mazooma) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4nunsmh ,sc4nunsm, sc4_200_4ra, sc4nunsm, sc4_state, sc4nunsm, ROT0, "Mazooma","Nuns 'n' Roses (Mazooma) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4nunsmi ,sc4nunsm, sc4_200_4ra, sc4nunsm, sc4_state, sc4nunsm, ROT0, "Mazooma","Nuns 'n' Roses (Mazooma) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4nunsmj ,sc4nunsm, sc4_200_4ra, sc4nunsm, sc4_state, sc4nunsm, ROT0, "Mazooma","Nuns 'n' Roses (Mazooma) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4nunsm ,0, sc4_200_4ra, sc4nunsm, sc4_state, sc4nunsm, ROT0, "Mazooma","Nuns 'n' Roses (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4nunsmb ,sc4nunsm, sc4_200_4ra, sc4nunsm, sc4_state, sc4nunsm, ROT0, "Mazooma","Nuns 'n' Roses (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4nunsmc ,sc4nunsm, sc4_200_4ra, sc4nunsm, sc4_state, sc4nunsm, ROT0, "Mazooma","Nuns 'n' Roses (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4nunsmd ,sc4nunsm, sc4_200_4ra, sc4nunsm, sc4_state, sc4nunsm, ROT0, "Mazooma","Nuns 'n' Roses (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4nunsme ,sc4nunsm, sc4_200_4ra, sc4nunsm, sc4_state, sc4nunsm, ROT0, "Mazooma","Nuns 'n' Roses (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4nunsmf ,sc4nunsm, sc4_200_4ra, sc4nunsm, sc4_state, sc4nunsm, ROT0, "Mazooma","Nuns 'n' Roses (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4nunsmg ,sc4nunsm, sc4_200_4ra, sc4nunsm, sc4_state, sc4nunsm, ROT0, "Mazooma","Nuns 'n' Roses (Mazooma) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4nunsmh ,sc4nunsm, sc4_200_4ra, sc4nunsm, sc4_state, sc4nunsm, ROT0, "Mazooma","Nuns 'n' Roses (Mazooma) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4nunsmi ,sc4nunsm, sc4_200_4ra, sc4nunsm, sc4_state, sc4nunsm, ROT0, "Mazooma","Nuns 'n' Roses (Mazooma) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4nunsmj ,sc4nunsm, sc4_200_4ra, sc4nunsm, sc4_state, sc4nunsm, ROT0, "Mazooma","Nuns 'n' Roses (Mazooma) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4acesh)
@@ -40695,10 +40697,10 @@ INPUT_PORTS_START( sc4acesh ) // this structure is generated
INPUT_PORTS_END
// PR2070 ACES HIGH ACEHI SOUNDS ACES HIGH
-GAMEL( 200?, sc4acesh ,0, sc4_200_5rc, sc4acesh, sc4_state, sc4acesh, ROT0, "Mazooma","Aces High (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4acesha ,sc4acesh, sc4_200_5rc, sc4acesh, sc4_state, sc4acesh, ROT0, "Mazooma","Aces High (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4aceshb ,sc4acesh, sc4_200_5rc, sc4acesh, sc4_state, sc4acesh, ROT0, "Mazooma","Aces High (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4aceshc ,sc4acesh, sc4_200_5rc, sc4acesh, sc4_state, sc4acesh, ROT0, "Mazooma","Aces High (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4acesh ,0, sc4_200_5rc, sc4acesh, sc4_state, sc4acesh, ROT0, "Mazooma","Aces High (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4acesha ,sc4acesh, sc4_200_5rc, sc4acesh, sc4_state, sc4acesh, ROT0, "Mazooma","Aces High (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4aceshb ,sc4acesh, sc4_200_5rc, sc4acesh, sc4_state, sc4acesh, ROT0, "Mazooma","Aces High (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4aceshc ,sc4acesh, sc4_200_5rc, sc4acesh, sc4_state, sc4acesh, ROT0, "Mazooma","Aces High (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4bed)
@@ -40757,12 +40759,12 @@ INPUT_PORTS_START( sc4bed ) // this structure is generated
INPUT_PORTS_END
// PR2094 BEDAZZLED BEDZ SOUNDS BEDAZZLED
-GAMEL( 200?, sc4bed ,0, sc4_4reel_alt, sc4bed, sc4_state, sc4bed, ROT0, "Mazooma","Bedazzled (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4beda ,sc4bed, sc4_4reel_alt, sc4bed, sc4_state, sc4bed, ROT0, "Mazooma","Bedazzled (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bedb ,sc4bed, sc4_4reel_alt, sc4bed, sc4_state, sc4bed, ROT0, "Mazooma","Bedazzled (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bedc ,sc4bed, sc4_4reel_alt, sc4bed, sc4_state, sc4bed, ROT0, "Mazooma","Bedazzled (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bedd ,sc4bed, sc4_4reel_alt, sc4bed, sc4_state, sc4bed, ROT0, "Mazooma","Bedazzled (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bede ,sc4bed, sc4_4reel_alt, sc4bed, sc4_state, sc4bed, ROT0, "Mazooma","Bedazzled (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4bed ,0, sc4_4reel_alt, sc4bed, sc4_state, sc4bed, ROT0, "Mazooma","Bedazzled (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4beda ,sc4bed, sc4_4reel_alt, sc4bed, sc4_state, sc4bed, ROT0, "Mazooma","Bedazzled (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bedb ,sc4bed, sc4_4reel_alt, sc4bed, sc4_state, sc4bed, ROT0, "Mazooma","Bedazzled (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bedc ,sc4bed, sc4_4reel_alt, sc4bed, sc4_state, sc4bed, ROT0, "Mazooma","Bedazzled (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bedd ,sc4bed, sc4_4reel_alt, sc4bed, sc4_state, sc4bed, ROT0, "Mazooma","Bedazzled (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bede ,sc4bed, sc4_4reel_alt, sc4bed, sc4_state, sc4bed, ROT0, "Mazooma","Bedazzled (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4bedcl)
@@ -40829,12 +40831,12 @@ INPUT_PORTS_START( sc4bedcl ) // this structure is generated
INPUT_PORTS_END
// PR2102 CLUB BEDAZZLED CBED SOUNDS CLUB BEDAZZLED
-GAMEL( 200?, sc4bedcl ,0, sc4_5reel, sc4bedcl, sc4_state, sc4bedcl, ROT0, "Mazooma","Bedazzled Club (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4bedcl ,0, sc4_5reel, sc4bedcl, sc4_state, sc4bedcl, ROT0, "Mazooma","Bedazzled Club (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2102 CLUB BEDAZZLED CLUB BEDAZZLED CLUB CBED SOUNDS CLUB BEDAZZLED
-GAMEL( 200?, sc4bedcla ,sc4bedcl, sc4_5reel, sc4bedcl, sc4_state, sc4bedcl, ROT0, "Mazooma","Bedazzled Club (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bedclb ,sc4bedcl, sc4_5reel, sc4bedcl, sc4_state, sc4bedcl, ROT0, "Mazooma","Bedazzled Club (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bedclc ,sc4bedcl, sc4_5reel, sc4bedcl, sc4_state, sc4bedcl, ROT0, "Mazooma","Bedazzled Club (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bedcld ,sc4bedcl, sc4_5reel, sc4bedcl, sc4_state, sc4bedcl, ROT0, "Mazooma","Bedazzled Club (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4bedcla ,sc4bedcl, sc4_5reel, sc4bedcl, sc4_state, sc4bedcl, ROT0, "Mazooma","Bedazzled Club (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bedclb ,sc4bedcl, sc4_5reel, sc4bedcl, sc4_state, sc4bedcl, ROT0, "Mazooma","Bedazzled Club (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bedclc ,sc4bedcl, sc4_5reel, sc4bedcl, sc4_state, sc4bedcl, ROT0, "Mazooma","Bedazzled Club (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bedcld ,sc4bedcl, sc4_5reel, sc4bedcl, sc4_state, sc4bedcl, ROT0, "Mazooma","Bedazzled Club (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4bblas)
{
@@ -40891,13 +40893,13 @@ INPUT_PORTS_START( sc4bblas ) // this structure is generated
INPUT_PORTS_END
// PR2083 BIG BLASTER BBST SOUNDS BIG BLASTER
-GAMEL( 200?, sc4bblas ,0, sc4_4reel_alt, sc4bblas, sc4_state, sc4bblas, ROT0, "Mazooma","Big Blaster (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bblasa ,sc4bblas, sc4_4reel_alt, sc4bblas, sc4_state, sc4bblas, ROT0, "Mazooma","Big Blaster (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bblasb ,sc4bblas, sc4_4reel_alt, sc4bblas, sc4_state, sc4bblas, ROT0, "Mazooma","Big Blaster (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bblasc ,sc4bblas, sc4_4reel_alt, sc4bblas, sc4_state, sc4bblas_mbus, ROT0, "Mazooma","Big Blaster (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bblasd ,sc4bblas, sc4_4reel_alt, sc4bblas, sc4_state, sc4bblas_mbus, ROT0, "Mazooma","Big Blaster (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bblase ,sc4bblas, sc4_4reel_alt, sc4bblas, sc4_state, sc4bblas_mbus, ROT0, "Mazooma","Big Blaster (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bblasf ,sc4bblas, sc4_4reel_alt, sc4bblas, sc4_state, sc4bblas_mbus, ROT0, "Mazooma","Big Blaster (Mazooma) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4bblas ,0, sc4_4reel_alt, sc4bblas, sc4_state, sc4bblas, ROT0, "Mazooma","Big Blaster (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bblasa ,sc4bblas, sc4_4reel_alt, sc4bblas, sc4_state, sc4bblas, ROT0, "Mazooma","Big Blaster (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bblasb ,sc4bblas, sc4_4reel_alt, sc4bblas, sc4_state, sc4bblas, ROT0, "Mazooma","Big Blaster (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bblasc ,sc4bblas, sc4_4reel_alt, sc4bblas, sc4_state, sc4bblas_mbus, ROT0, "Mazooma","Big Blaster (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bblasd ,sc4bblas, sc4_4reel_alt, sc4bblas, sc4_state, sc4bblas_mbus, ROT0, "Mazooma","Big Blaster (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bblase ,sc4bblas, sc4_4reel_alt, sc4bblas, sc4_state, sc4bblas_mbus, ROT0, "Mazooma","Big Blaster (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bblasf ,sc4bblas, sc4_4reel_alt, sc4bblas, sc4_state, sc4bblas_mbus, ROT0, "Mazooma","Big Blaster (Mazooma) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4bankb)
{
@@ -40950,11 +40952,11 @@ INPUT_PORTS_START( sc4bankb ) // this structure is generated
INPUT_PORTS_END
// PR???? BANKETYBANK V1.0 BANKETYBANKSND BANKETY BANK
-GAMEL( 200?, sc4bankb ,0, sc4_200_5r, sc4bankb, sc4_state, sc4bankb, ROT0, "Qps","Bankety Bank (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bankba ,sc4bankb, sc4_200_5r, sc4bankb, sc4_state, sc4bankb, ROT0, "Qps","Bankety Bank (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4bankb ,0, sc4_200_5r, sc4bankb, sc4_state, sc4bankb, ROT0, "Qps","Bankety Bank (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bankba ,sc4bankb, sc4_200_5r, sc4bankb, sc4_state, sc4bankb, ROT0, "Qps","Bankety Bank (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR???? BANKETYBANK 011 BANKETYBANKSND BANKETY BANK
-GAMEL( 200?, sc4bb ,sc4bankb, sc4_200_5r, sc4bankb, sc4_state, sc4bankb, ROT0, "Qps","Bankety Bank (Qps) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bba ,sc4bankb, sc4_200_5r, sc4bankb, sc4_state, sc4bankb, ROT0, "Qps","Bankety Bank (Qps) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4bb ,sc4bankb, sc4_200_5r, sc4bankb, sc4_state, sc4bankb, ROT0, "Qps","Bankety Bank (Qps) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bba ,sc4bankb, sc4_200_5r, sc4bankb, sc4_state, sc4bankb, ROT0, "Qps","Bankety Bank (Qps) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4bobcl)
{
@@ -41024,8 +41026,8 @@ INPUT_PORTS_START( sc4bobcl ) // this structure is generated
INPUT_PORTS_END
// PR2298 CLUB BOBBY DAZZLER CLUB BOB DAZZLER CLUB CLUBBOBD SOUNDS
-GAMEL( 200?, sc4bobcl ,0, sc4_5reel, sc4bobcl, sc4_state, sc4bobcl, ROT0, "Mazooma","Bobby Dazzler Club (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bobcla ,sc4bobcl, sc4_5reel, sc4bobcl, sc4_state, sc4bobcl, ROT0, "Mazooma","Bobby Dazzler Club (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4bobcl ,0, sc4_5reel, sc4bobcl, sc4_state, sc4bobcl, ROT0, "Mazooma","Bobby Dazzler Club (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bobcla ,sc4bobcl, sc4_5reel, sc4bobcl, sc4_state, sc4bobcl, ROT0, "Mazooma","Bobby Dazzler Club (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4brksp)
{
@@ -41080,8 +41082,8 @@ INPUT_PORTS_START( sc4brksp ) // this structure is generated
INPUT_PORTS_END
// PR2033 BREAK THE SPELL SPELL SOUNDS BREAK THE SPELL
-GAMEL( 200?, sc4brksp ,0, sc4_5reel, sc4brksp, sc4_state, sc4brksp, ROT0, "Mazooma","Break The Spell (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4brkspa ,sc4brksp, sc4_5reel, sc4brksp, sc4_state, sc4brksp, ROT0, "Mazooma","Break The Spell (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4brksp ,0, sc4_5reel, sc4brksp, sc4_state, sc4brksp, ROT0, "Mazooma","Break The Spell (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4brkspa ,sc4brksp, sc4_5reel, sc4brksp, sc4_state, sc4brksp, ROT0, "Mazooma","Break The Spell (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4bulcl)
{
@@ -41147,16 +41149,16 @@ INPUT_PORTS_START( sc4bulcl ) // this structure is generated
INPUT_PORTS_END
// PR1753 CLUB BULLSEYE BULLSEYE CLUB PR1751 BULLSEYE SOUNDS11 BULLSYE
-GAMEL( 200?, sc4bulcl ,0, sc4_5reel, sc4bulcl, sc4_state, sc4bulcl, ROT0, "BFM","Bullseye Club (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bulcla ,sc4bulcl, sc4_5reel, sc4bulcl, sc4_state, sc4bulcl, ROT0, "BFM","Bullseye Club (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bulclb ,sc4bulcl, sc4_5reel, sc4bulcl, sc4_state, sc4bulcl, ROT0, "BFM","Bullseye Club (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bulclc ,sc4bulcl, sc4_5reel, sc4bulcl, sc4_state, sc4bulcl, ROT0, "BFM","Bullseye Club (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bulcld ,sc4bulcl, sc4_5reel, sc4bulcl, sc4_state, sc4bulcl, ROT0, "BFM","Bullseye Club (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bulcle ,sc4bulcl, sc4_5reel, sc4bulcl, sc4_state, sc4bulcl, ROT0, "BFM","Bullseye Club (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bulclf ,sc4bulcl, sc4_5reel, sc4bulcl, sc4_state, sc4bulcl, ROT0, "BFM","Bullseye Club (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bulclg ,sc4bulcl, sc4_5reel, sc4bulcl, sc4_state, sc4bulcl, ROT0, "BFM","Bullseye Club (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bulclh ,sc4bulcl, sc4_5reel, sc4bulcl, sc4_state, sc4bulcl, ROT0, "BFM","Bullseye Club (Bellfruit) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bulcli ,sc4bulcl, sc4_5reel, sc4bulcl, sc4_state, sc4bulcl, ROT0, "BFM","Bullseye Club (Bellfruit) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4bulcl ,0, sc4_5reel, sc4bulcl, sc4_state, sc4bulcl, ROT0, "BFM","Bullseye Club (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bulcla ,sc4bulcl, sc4_5reel, sc4bulcl, sc4_state, sc4bulcl, ROT0, "BFM","Bullseye Club (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bulclb ,sc4bulcl, sc4_5reel, sc4bulcl, sc4_state, sc4bulcl, ROT0, "BFM","Bullseye Club (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bulclc ,sc4bulcl, sc4_5reel, sc4bulcl, sc4_state, sc4bulcl, ROT0, "BFM","Bullseye Club (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bulcld ,sc4bulcl, sc4_5reel, sc4bulcl, sc4_state, sc4bulcl, ROT0, "BFM","Bullseye Club (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bulcle ,sc4bulcl, sc4_5reel, sc4bulcl, sc4_state, sc4bulcl, ROT0, "BFM","Bullseye Club (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bulclf ,sc4bulcl, sc4_5reel, sc4bulcl, sc4_state, sc4bulcl, ROT0, "BFM","Bullseye Club (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bulclg ,sc4bulcl, sc4_5reel, sc4bulcl, sc4_state, sc4bulcl, ROT0, "BFM","Bullseye Club (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bulclh ,sc4bulcl, sc4_5reel, sc4bulcl, sc4_state, sc4bulcl, ROT0, "BFM","Bullseye Club (Bellfruit) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bulcli ,sc4bulcl, sc4_5reel, sc4bulcl, sc4_state, sc4bulcl, ROT0, "BFM","Bullseye Club (Bellfruit) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4carry)
{
@@ -41222,8 +41224,8 @@ INPUT_PORTS_START( sc4carry ) // this structure is generated
INPUT_PORTS_END
// PR1113 CARRY ON WINNING PR1113 CARRY ON WINNING SOUNDS11
-GAMEL( 200?, sc4carry ,0, sc4_4reel_alt, sc4carry, sc4_state, sc4carry, ROT0, "BFM","Carry On Winning (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4carrya ,sc4carry, sc4_4reel_alt, sc4carry, sc4_state, sc4carry, ROT0, "BFM","Carry On Winning (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4carry ,0, sc4_4reel_alt, sc4carry, sc4_state, sc4carry, ROT0, "BFM","Carry On Winning (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4carrya ,sc4carry, sc4_4reel_alt, sc4carry, sc4_state, sc4carry, ROT0, "BFM","Carry On Winning (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
INPUT_PORTS_START( sc4cbaz ) // this structure is generated
PORT_INCLUDE( sc4_base )
@@ -41285,20 +41287,20 @@ INPUT_PORTS_START( sc4cbaz ) // this structure is generated
INPUT_PORTS_END
// PR1349 CLUB CASH BAZAAR PR1349 CLUB CASH BAZAAR SOUNDS11
-GAMEL( 200?, sc4cbaz ,0, sc4, sc4cbaz, sc4_state, sc4, ROT0, "BFM","Cash Bazaar Club (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cbaza ,sc4cbaz, sc4, sc4cbaz, sc4_state, sc4, ROT0, "BFM","Cash Bazaar Club (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cbazb ,sc4cbaz, sc4, sc4cbaz, sc4_state, sc4, ROT0, "BFM","Cash Bazaar Club (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cbazc ,sc4cbaz, sc4, sc4cbaz, sc4_state, sc4, ROT0, "BFM","Cash Bazaar Club (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cbazd ,sc4cbaz, sc4, sc4cbaz, sc4_state, sc4, ROT0, "BFM","Cash Bazaar Club (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cbaze ,sc4cbaz, sc4, sc4cbaz, sc4_state, sc4, ROT0, "BFM","Cash Bazaar Club (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cbazf ,sc4cbaz, sc4, sc4cbaz, sc4_state, sc4, ROT0, "BFM","Cash Bazaar Club (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cbazg ,sc4cbaz, sc4, sc4cbaz, sc4_state, sc4, ROT0, "BFM","Cash Bazaar Club (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cbazh ,sc4cbaz, sc4, sc4cbaz, sc4_state, sc4, ROT0, "BFM","Cash Bazaar Club (Bellfruit) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cbazi ,sc4cbaz, sc4, sc4cbaz, sc4_state, sc4, ROT0, "BFM","Cash Bazaar Club (Bellfruit) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cbaz ,0, sc4, sc4cbaz, sc4_state, sc4, ROT0, "BFM","Cash Bazaar Club (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cbaza ,sc4cbaz, sc4, sc4cbaz, sc4_state, sc4, ROT0, "BFM","Cash Bazaar Club (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cbazb ,sc4cbaz, sc4, sc4cbaz, sc4_state, sc4, ROT0, "BFM","Cash Bazaar Club (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cbazc ,sc4cbaz, sc4, sc4cbaz, sc4_state, sc4, ROT0, "BFM","Cash Bazaar Club (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cbazd ,sc4cbaz, sc4, sc4cbaz, sc4_state, sc4, ROT0, "BFM","Cash Bazaar Club (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cbaze ,sc4cbaz, sc4, sc4cbaz, sc4_state, sc4, ROT0, "BFM","Cash Bazaar Club (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cbazf ,sc4cbaz, sc4, sc4cbaz, sc4_state, sc4, ROT0, "BFM","Cash Bazaar Club (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cbazg ,sc4cbaz, sc4, sc4cbaz, sc4_state, sc4, ROT0, "BFM","Cash Bazaar Club (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cbazh ,sc4cbaz, sc4, sc4cbaz, sc4_state, sc4, ROT0, "BFM","Cash Bazaar Club (Bellfruit) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cbazi ,sc4cbaz, sc4, sc4cbaz, sc4_state, sc4, ROT0, "BFM","Cash Bazaar Club (Bellfruit) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
// These alarm through startup and don't boot, are they missing something like a DMD?
// PR1349 CLUB CASH BAZAAR CLUB CASH BAZAAR CLUB PR1349 CLUB CASH BAZAAR SOUNDS11
-GAMEL( 200?, sc4cbazj ,sc4cbaz, sc4, sc4cbaz, sc4_state, sc4mbus, ROT0, "BFM","Cash Bazaar Club (Bellfruit) (Scorpion 4) (set 11)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cbazk ,sc4cbaz, sc4, sc4cbaz, sc4_state, sc4mbus, ROT0, "BFM","Cash Bazaar Club (Bellfruit) (Scorpion 4) (set 12)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cbazj ,sc4cbaz, sc4, sc4cbaz, sc4_state, sc4mbus, ROT0, "BFM","Cash Bazaar Club (Bellfruit) (Scorpion 4) (set 11)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cbazk ,sc4cbaz, sc4, sc4cbaz, sc4_state, sc4mbus, ROT0, "BFM","Cash Bazaar Club (Bellfruit) (Scorpion 4) (set 12)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -41349,14 +41351,14 @@ INPUT_PORTS_START( sc4clash ) // this structure is generated
INPUT_PORTS_END
// PR2118 CASH ON THE LASH COTL SOUNDS CASH ON THE LASH
-GAMEL( 200?, sc4clash ,0, sc4, sc4clash, sc4_state, sc4mbus, ROT0, "Mazooma","Cash On The Lash (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4clasha ,sc4clash, sc4, sc4clash, sc4_state, sc4mbus, ROT0, "Mazooma","Cash On The Lash (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4clashb ,sc4clash, sc4, sc4clash, sc4_state, sc4mbus, ROT0, "Mazooma","Cash On The Lash (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4clashc ,sc4clash, sc4, sc4clash, sc4_state, sc4mbus, ROT0, "Mazooma","Cash On The Lash (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4clashd ,sc4clash, sc4, sc4clash, sc4_state, sc4, ROT0, "Mazooma","Cash On The Lash (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4clashe ,sc4clash, sc4, sc4clash, sc4_state, sc4, ROT0, "Mazooma","Cash On The Lash (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4clashf ,sc4clash, sc4, sc4clash, sc4_state, sc4, ROT0, "Mazooma","Cash On The Lash (Mazooma) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4clashg ,sc4clash, sc4, sc4clash, sc4_state, sc4, ROT0, "Mazooma","Cash On The Lash (Mazooma) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4clash ,0, sc4, sc4clash, sc4_state, sc4mbus, ROT0, "Mazooma","Cash On The Lash (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4clasha ,sc4clash, sc4, sc4clash, sc4_state, sc4mbus, ROT0, "Mazooma","Cash On The Lash (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4clashb ,sc4clash, sc4, sc4clash, sc4_state, sc4mbus, ROT0, "Mazooma","Cash On The Lash (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4clashc ,sc4clash, sc4, sc4clash, sc4_state, sc4mbus, ROT0, "Mazooma","Cash On The Lash (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4clashd ,sc4clash, sc4, sc4clash, sc4_state, sc4, ROT0, "Mazooma","Cash On The Lash (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4clashe ,sc4clash, sc4, sc4clash, sc4_state, sc4, ROT0, "Mazooma","Cash On The Lash (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4clashf ,sc4clash, sc4, sc4clash, sc4_state, sc4, ROT0, "Mazooma","Cash On The Lash (Mazooma) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4clashg ,sc4clash, sc4, sc4clash, sc4_state, sc4, ROT0, "Mazooma","Cash On The Lash (Mazooma) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
INPUT_PORTS_START( sc4cckey ) // this structure is generated
@@ -41416,22 +41418,22 @@ INPUT_PORTS_START( sc4cckey ) // this structure is generated
INPUT_PORTS_END
// PR1426 CASINO CRAZY FRUITS GOLD PR1426 CRAZY F GOLD SOUNDS11 CRAZY FRUIT GOLD S.SITE (set was marked as Casino Crazy Keys)
-GAMEL( 200?, sc4cckey ,0, sc4, sc4cckey, sc4_state, sc4, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cckeya ,sc4cckey, sc4, sc4cckey, sc4_state, sc4, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cckeyb ,sc4cckey, sc4, sc4cckey, sc4_state, sc4, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cckeyc ,sc4cckey, sc4, sc4cckey, sc4_state, sc4, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cckeyd ,sc4cckey, sc4, sc4cckey, sc4_state, sc4, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cckeye ,sc4cckey, sc4, sc4cckey, sc4_state, sc4, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cckeyf ,sc4cckey, sc4, sc4cckey, sc4_state, sc4, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cckeyg ,sc4cckey, sc4, sc4cckey, sc4_state, sc4, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cckeyh ,sc4cckey, sc4, sc4cckey, sc4_state, sc4, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cckeyj ,sc4cckey, sc4, sc4cckey, sc4_state, sc4, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cckeyi ,sc4cckey, sc4, sc4cckey, sc4_state, sc4mbus, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 11)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cckeyk ,sc4cckey, sc4, sc4cckey, sc4_state, sc4mbus, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 12)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cckeyl ,sc4cckey, sc4, sc4cckey, sc4_state, sc4mbus, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 13)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cckeym ,sc4cckey, sc4, sc4cckey, sc4_state, sc4mbus, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 14)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cckeyn ,sc4cckey, sc4, sc4cckey, sc4_state, sc4mbus, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 15)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cckeyo ,sc4cckey, sc4, sc4cckey, sc4_state, sc4mbus, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 16)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cckey ,0, sc4, sc4cckey, sc4_state, sc4, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cckeya ,sc4cckey, sc4, sc4cckey, sc4_state, sc4, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cckeyb ,sc4cckey, sc4, sc4cckey, sc4_state, sc4, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cckeyc ,sc4cckey, sc4, sc4cckey, sc4_state, sc4, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cckeyd ,sc4cckey, sc4, sc4cckey, sc4_state, sc4, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cckeye ,sc4cckey, sc4, sc4cckey, sc4_state, sc4, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cckeyf ,sc4cckey, sc4, sc4cckey, sc4_state, sc4, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cckeyg ,sc4cckey, sc4, sc4cckey, sc4_state, sc4, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cckeyh ,sc4cckey, sc4, sc4cckey, sc4_state, sc4, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cckeyj ,sc4cckey, sc4, sc4cckey, sc4_state, sc4, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cckeyi ,sc4cckey, sc4, sc4cckey, sc4_state, sc4mbus, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 11)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cckeyk ,sc4cckey, sc4, sc4cckey, sc4_state, sc4mbus, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 12)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cckeyl ,sc4cckey, sc4, sc4cckey, sc4_state, sc4mbus, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 13)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cckeym ,sc4cckey, sc4, sc4cckey, sc4_state, sc4mbus, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 14)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cckeyn ,sc4cckey, sc4, sc4cckey, sc4_state, sc4mbus, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 15)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cckeyo ,sc4cckey, sc4, sc4cckey, sc4_state, sc4mbus, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 16)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4clclo)
{
@@ -41497,7 +41499,7 @@ INPUT_PORTS_START( sc4clclo ) // this structure is generated
INPUT_PORTS_END
// PR2383 CLUBCLOUSEAU CLUBCLOUSEAU CLUB CCLOU SOUNDS CLUB CLOSEAU
-GAMEL( 200?, sc4clclo ,0, sc4_5reel, sc4clclo, sc4_state, sc4clclo, ROT0, "QPS","Club Clouseau (QPS) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4clclo ,0, sc4_5reel, sc4clclo, sc4_state, sc4clclo, ROT0, "QPS","Club Clouseau (QPS) (Scorpion 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4cjcl)
@@ -41567,13 +41569,13 @@ INPUT_PORTS_START( sc4cjcl ) // this structure is generated
INPUT_PORTS_END
// PR1621 CLUB COOL JEWELS PR1621 COOL SOUNDS11 CLUB COOL JEWELS CLUB
-GAMEL( 200?, sc4cjcl ,0, sc4_5reel, sc4cjcl, sc4_state, sc4cjcl, ROT0, "BFM","Cool Jewels Club (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cjcla ,sc4cjcl, sc4_5reel, sc4cjcl, sc4_state, sc4cjcl, ROT0, "BFM","Cool Jewels Club (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cjclb ,sc4cjcl, sc4_5reel, sc4cjcl, sc4_state, sc4cjcl, ROT0, "BFM","Cool Jewels Club (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cjclc ,sc4cjcl, sc4_5reel, sc4cjcl, sc4_state, sc4cjcl, ROT0, "BFM","Cool Jewels Club (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cjcld ,sc4cjcl, sc4_5reel, sc4cjcl, sc4_state, sc4cjcl, ROT0, "BFM","Cool Jewels Club (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cjcle ,sc4cjcl, sc4_5reel, sc4cjcl, sc4_state, sc4cjcl, ROT0, "BFM","Cool Jewels Club (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cjclf ,sc4cjcl, sc4_5reel, sc4cjcl, sc4_state, sc4cjcl, ROT0, "BFM","Cool Jewels Club (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cjcl ,0, sc4_5reel, sc4cjcl, sc4_state, sc4cjcl, ROT0, "BFM","Cool Jewels Club (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cjcla ,sc4cjcl, sc4_5reel, sc4cjcl, sc4_state, sc4cjcl, ROT0, "BFM","Cool Jewels Club (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cjclb ,sc4cjcl, sc4_5reel, sc4cjcl, sc4_state, sc4cjcl, ROT0, "BFM","Cool Jewels Club (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cjclc ,sc4cjcl, sc4_5reel, sc4cjcl, sc4_state, sc4cjcl, ROT0, "BFM","Cool Jewels Club (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cjcld ,sc4cjcl, sc4_5reel, sc4cjcl, sc4_state, sc4cjcl, ROT0, "BFM","Cool Jewels Club (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cjcle ,sc4cjcl, sc4_5reel, sc4cjcl, sc4_state, sc4cjcl, ROT0, "BFM","Cool Jewels Club (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cjclf ,sc4cjcl, sc4_5reel, sc4cjcl, sc4_state, sc4cjcl, ROT0, "BFM","Cool Jewels Club (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
INPUT_PORTS_START( sc4crcp ) // this structure is generated
@@ -41634,16 +41636,16 @@ INPUT_PORTS_START( sc4crcp ) // this structure is generated
INPUT_PORTS_END
// PR3241 CLUB COPS AND ROBBERS PLATINUM SCORP4 COPS & ROBRS PLT CLUB PR3241 C N R PLATINUM SOUNDS11 COPS AND ROBBERS
-GAMEL( 200?, sc4crcp ,0, sc4, sc4crcp, sc4_state, sc4mbus, ROT0, "BFM","Cops 'n' Robbers Club Platinum (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crcpa ,sc4crcp, sc4, sc4crcp, sc4_state, sc4mbus, ROT0, "BFM","Cops 'n' Robbers Club Platinum (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crcpc ,sc4crcp, sc4, sc4crcp, sc4_state, sc4mbus, ROT0, "BFM","Cops 'n' Robbers Club Platinum (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crcpd ,sc4crcp, sc4, sc4crcp, sc4_state, sc4mbus, ROT0, "BFM","Cops 'n' Robbers Club Platinum (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crcpe ,sc4crcp, sc4, sc4crcp, sc4_state, sc4mbus, ROT0, "BFM","Cops 'n' Robbers Club Platinum (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crcpf ,sc4crcp, sc4, sc4crcp, sc4_state, sc4mbus, ROT0, "BFM","Cops 'n' Robbers Club Platinum (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crcpg ,sc4crcp, sc4, sc4crcp, sc4_state, sc4mbus, ROT0, "BFM","Cops 'n' Robbers Club Platinum (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crcph ,sc4crcp, sc4, sc4crcp, sc4_state, sc4mbus, ROT0, "BFM","Cops 'n' Robbers Club Platinum (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crcpi ,sc4crcp, sc4, sc4crcp, sc4_state, sc4mbus, ROT0, "BFM","Cops 'n' Robbers Club Platinum (Bellfruit) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crcpj ,sc4crcp, sc4, sc4crcp, sc4_state, sc4mbus, ROT0, "BFM","Cops 'n' Robbers Club Platinum (Bellfruit) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4crcp ,0, sc4, sc4crcp, sc4_state, sc4mbus, ROT0, "BFM","Cops 'n' Robbers Club Platinum (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crcpa ,sc4crcp, sc4, sc4crcp, sc4_state, sc4mbus, ROT0, "BFM","Cops 'n' Robbers Club Platinum (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crcpc ,sc4crcp, sc4, sc4crcp, sc4_state, sc4mbus, ROT0, "BFM","Cops 'n' Robbers Club Platinum (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crcpd ,sc4crcp, sc4, sc4crcp, sc4_state, sc4mbus, ROT0, "BFM","Cops 'n' Robbers Club Platinum (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crcpe ,sc4crcp, sc4, sc4crcp, sc4_state, sc4mbus, ROT0, "BFM","Cops 'n' Robbers Club Platinum (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crcpf ,sc4crcp, sc4, sc4crcp, sc4_state, sc4mbus, ROT0, "BFM","Cops 'n' Robbers Club Platinum (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crcpg ,sc4crcp, sc4, sc4crcp, sc4_state, sc4mbus, ROT0, "BFM","Cops 'n' Robbers Club Platinum (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crcph ,sc4crcp, sc4, sc4crcp, sc4_state, sc4mbus, ROT0, "BFM","Cops 'n' Robbers Club Platinum (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crcpi ,sc4crcp, sc4, sc4crcp, sc4_state, sc4mbus, ROT0, "BFM","Cops 'n' Robbers Club Platinum (Bellfruit) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crcpj ,sc4crcp, sc4, sc4crcp, sc4_state, sc4mbus, ROT0, "BFM","Cops 'n' Robbers Club Platinum (Bellfruit) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
INPUT_PORTS_START( sc4crgc ) // this structure is generated
PORT_INCLUDE( sc4_base )
@@ -41703,32 +41705,32 @@ INPUT_PORTS_START( sc4crgc ) // this structure is generated
INPUT_PORTS_END
// PR1348 CLUB COPS AND ROBBERS GOLD PR1348 CCRG SOUNDS11 COPS AND ROBBERS
-GAMEL( 2003, sc4crgc ,0, sc4, sc4crgc, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 2003, sc4crgca ,sc4crgc, sc4, sc4crgc, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 2003, sc4crgcb ,sc4crgc, sc4, sc4crgc, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 2003, sc4crgcc ,sc4crgc, sc4, sc4crgc, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 2003, sc4crgcd ,sc4crgc, sc4, sc4crgc, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 2003, sc4crgce ,sc4crgc, sc4, sc4crgc, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 2003, sc4crgcf ,sc4crgc, sc4, sc4crgc, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 2003, sc4crgcg ,sc4crgc, sc4, sc4crgc, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 2003, sc4crgch ,sc4crgc, sc4, sc4crgc, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 2003, sc4crgci ,sc4crgc, sc4, sc4crgc, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 2003, sc4crgcj ,sc4crgc, sc4, sc4crgc, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 11)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 2003, sc4crgck ,sc4crgc, sc4, sc4crgc, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 12)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 2003, sc4crgcl ,sc4crgc, sc4, sc4crgc, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 13)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 2003, sc4crgcm ,sc4crgc, sc4, sc4crgc, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 14)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 2003, sc4crgco ,sc4crgc, sc4, sc4crgc, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 15)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 2003, sc4crgcq ,sc4crgc, sc4, sc4crgc, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 16)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 2003, sc4crgct ,sc4crgc, sc4, sc4crgc, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 17)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 2003, sc4crgcw ,sc4crgc, sc4, sc4crgc, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 18)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 2003, sc4crgc ,0, sc4, sc4crgc, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 2003, sc4crgca ,sc4crgc, sc4, sc4crgc, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 2003, sc4crgcb ,sc4crgc, sc4, sc4crgc, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 2003, sc4crgcc ,sc4crgc, sc4, sc4crgc, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 2003, sc4crgcd ,sc4crgc, sc4, sc4crgc, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 2003, sc4crgce ,sc4crgc, sc4, sc4crgc, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 2003, sc4crgcf ,sc4crgc, sc4, sc4crgc, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 2003, sc4crgcg ,sc4crgc, sc4, sc4crgc, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 2003, sc4crgch ,sc4crgc, sc4, sc4crgc, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 2003, sc4crgci ,sc4crgc, sc4, sc4crgc, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 2003, sc4crgcj ,sc4crgc, sc4, sc4crgc, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 11)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 2003, sc4crgck ,sc4crgc, sc4, sc4crgc, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 12)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 2003, sc4crgcl ,sc4crgc, sc4, sc4crgc, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 13)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 2003, sc4crgcm ,sc4crgc, sc4, sc4crgc, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 14)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 2003, sc4crgco ,sc4crgc, sc4, sc4crgc, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 15)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 2003, sc4crgcq ,sc4crgc, sc4, sc4crgc, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 16)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 2003, sc4crgct ,sc4crgc, sc4, sc4crgc, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 17)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 2003, sc4crgcw ,sc4crgc, sc4, sc4crgc, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 18)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR1348 CLUB COPS AND ROBBERS GOLD COPS & ROBRS GLD CLUB PR1348 CCRG SOUNDS11 COPS AND ROBBERS
-GAMEL( 2003, sc4crgcr ,sc4crgc, sc4, sc4crgc, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 21)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 2003, sc4crgcu ,sc4crgc, sc4, sc4crgc, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 22)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 2003, sc4crgcn ,sc4crgc, sc4, sc4crgc, sc4_state, sc4mbus, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 19)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 2003, sc4crgcp ,sc4crgc, sc4, sc4crgc, sc4_state, sc4mbus, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 20)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 2003, sc4crgcr ,sc4crgc, sc4, sc4crgc, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 21)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 2003, sc4crgcu ,sc4crgc, sc4, sc4crgc, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 22)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 2003, sc4crgcn ,sc4crgc, sc4, sc4crgc, sc4_state, sc4mbus, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 19)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 2003, sc4crgcp ,sc4crgc, sc4, sc4crgc, sc4_state, sc4mbus, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 20)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR1348 !500 CLUB COPS AND ROBBERS GOLD COPS & ROBRS GLD CLUB PR1348 CCRG SOUNDS11 COPS AND ROBBERS
-GAMEL( 2003, sc4crgcs ,sc4crgc, sc4, sc4crgc, sc4_state, sc4mbus, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 23)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 2003, sc4crgcv ,sc4crgc, sc4, sc4crgc, sc4_state, sc4mbus, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 24)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 2003, sc4crgcs ,sc4crgc, sc4, sc4crgc, sc4_state, sc4mbus, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 23)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 2003, sc4crgcv ,sc4crgc, sc4, sc4crgc, sc4_state, sc4mbus, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 24)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -41795,12 +41797,12 @@ INPUT_PORTS_START( sc4cfcla ) // this structure is generated
INPUT_PORTS_END
// PR1396 CLASSIC CRAZY FRUITS PR1396 CLSIC CRAZY FRUITS SND11
-GAMEL( 200?, sc4cfcla ,0, sc4_3reel, sc4cfcla, sc4_state, sc4cfcla, ROT0, "BFM","Crazy Fruits Classic (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfclab ,sc4cfcla, sc4_3reel, sc4cfcla, sc4_state, sc4cfcla, ROT0, "BFM","Crazy Fruits Classic (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfclac ,sc4cfcla, sc4_3reel, sc4cfcla, sc4_state, sc4cfcla, ROT0, "BFM","Crazy Fruits Classic (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfclad ,sc4cfcla, sc4_3reel, sc4cfcla, sc4_state, sc4cfcla, ROT0, "BFM","Crazy Fruits Classic (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfclae ,sc4cfcla, sc4_3reel, sc4cfcla, sc4_state, sc4cfcla, ROT0, "BFM","Crazy Fruits Classic (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfclaf ,sc4cfcla, sc4_3reel, sc4cfcla, sc4_state, sc4cfcla, ROT0, "BFM","Crazy Fruits Classic (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfcla ,0, sc4_3reel, sc4cfcla, sc4_state, sc4cfcla, ROT0, "BFM","Crazy Fruits Classic (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfclab ,sc4cfcla, sc4_3reel, sc4cfcla, sc4_state, sc4cfcla, ROT0, "BFM","Crazy Fruits Classic (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfclac ,sc4cfcla, sc4_3reel, sc4cfcla, sc4_state, sc4cfcla, ROT0, "BFM","Crazy Fruits Classic (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfclad ,sc4cfcla, sc4_3reel, sc4cfcla, sc4_state, sc4cfcla, ROT0, "BFM","Crazy Fruits Classic (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfclae ,sc4cfcla, sc4_3reel, sc4cfcla, sc4_state, sc4cfcla, ROT0, "BFM","Crazy Fruits Classic (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfclaf ,sc4cfcla, sc4_3reel, sc4cfcla, sc4_state, sc4cfcla, ROT0, "BFM","Crazy Fruits Classic (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4cfdu)
@@ -41865,10 +41867,10 @@ INPUT_PORTS_START( sc4cfdu ) // this structure is generated
INPUT_PORTS_END
// PR1107 CRAZY FRUITS DOWNUNDER PR1107 DOWN UNDER SOUNDS11
-GAMEL( 200?, sc4cfdu ,0, sc4_4reel_alt, sc4cfdu, sc4_state, sc4cfdu, ROT0, "BFM","Crazy Fruits Down Under (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfdua ,sc4cfdu, sc4_4reel_alt, sc4cfdu, sc4_state, sc4cfdu, ROT0, "BFM","Crazy Fruits Down Under (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfdub ,sc4cfdu, sc4_4reel_alt, sc4cfdu, sc4_state, sc4cfdu, ROT0, "BFM","Crazy Fruits Down Under (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfduc ,sc4cfdu, sc4_4reel_alt, sc4cfdu, sc4_state, sc4cfdu, ROT0, "BFM","Crazy Fruits Down Under (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfdu ,0, sc4_4reel_alt, sc4cfdu, sc4_state, sc4cfdu, ROT0, "BFM","Crazy Fruits Down Under (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfdua ,sc4cfdu, sc4_4reel_alt, sc4cfdu, sc4_state, sc4cfdu, ROT0, "BFM","Crazy Fruits Down Under (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfdub ,sc4cfdu, sc4_4reel_alt, sc4cfdu, sc4_state, sc4cfdu, ROT0, "BFM","Crazy Fruits Down Under (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfduc ,sc4cfdu, sc4_4reel_alt, sc4cfdu, sc4_state, sc4cfdu, ROT0, "BFM","Crazy Fruits Down Under (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4cfgcl)
@@ -41938,10 +41940,10 @@ INPUT_PORTS_START( sc4cfgcl ) // this structure is generated
INPUT_PORTS_END
// PR1620 CLUB CRAZY FRUITS GOLD PR1620 CRAZY SOUNDS11 CRAZY FRUITS CLUB
-GAMEL( 200?, sc4cfgcl ,0, sc4_5reel, sc4cfgcl, sc4_state, sc4cfgcl, ROT0, "BFM","Crazy Fruits Gold Club (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfgcla ,sc4cfgcl, sc4_5reel, sc4cfgcl, sc4_state, sc4cfgcl, ROT0, "BFM","Crazy Fruits Gold Club (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfgclb ,sc4cfgcl, sc4_5reel, sc4cfgcl, sc4_state, sc4cfgcl, ROT0, "BFM","Crazy Fruits Gold Club (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfgclc ,sc4cfgcl, sc4_5reel, sc4cfgcl, sc4_state, sc4cfgcl, ROT0, "BFM","Crazy Fruits Gold Club (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfgcl ,0, sc4_5reel, sc4cfgcl, sc4_state, sc4cfgcl, ROT0, "BFM","Crazy Fruits Gold Club (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfgcla ,sc4cfgcl, sc4_5reel, sc4cfgcl, sc4_state, sc4cfgcl, ROT0, "BFM","Crazy Fruits Gold Club (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfgclb ,sc4cfgcl, sc4_5reel, sc4cfgcl, sc4_state, sc4cfgcl, ROT0, "BFM","Crazy Fruits Gold Club (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfgclc ,sc4cfgcl, sc4_5reel, sc4cfgcl, sc4_state, sc4cfgcl, ROT0, "BFM","Crazy Fruits Gold Club (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4derby)
@@ -42012,12 +42014,12 @@ INPUT_PORTS_START( sc4derby ) // this structure is generated
INPUT_PORTS_END
// PR1006 DEMOLITION DERBY PR1006 DEMDERBY SOUNDS11
-GAMEL( 200?, sc4derby ,0, sc4_200_5r, sc4derby, sc4_state, sc4derby, ROT0, "BFM","Demolition Derby (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4derbya ,sc4derby, sc4_200_5r, sc4derby, sc4_state, sc4derby, ROT0, "BFM","Demolition Derby (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4derbyb ,sc4derby, sc4_200_5r, sc4derby, sc4_state, sc4derby, ROT0, "BFM","Demolition Derby (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4derbyc ,sc4derby, sc4_200_5r, sc4derby, sc4_state, sc4derby, ROT0, "BFM","Demolition Derby (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4derbyd ,sc4derby, sc4_200_5r, sc4derby, sc4_state, sc4derby, ROT0, "BFM","Demolition Derby (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4derbye ,sc4derby, sc4_200_5r, sc4derby, sc4_state, sc4derby, ROT0, "BFM","Demolition Derby (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4derby ,0, sc4_200_5r, sc4derby, sc4_state, sc4derby, ROT0, "BFM","Demolition Derby (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4derbya ,sc4derby, sc4_200_5r, sc4derby, sc4_state, sc4derby, ROT0, "BFM","Demolition Derby (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4derbyb ,sc4derby, sc4_200_5r, sc4derby, sc4_state, sc4derby, ROT0, "BFM","Demolition Derby (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4derbyc ,sc4derby, sc4_200_5r, sc4derby, sc4_state, sc4derby, ROT0, "BFM","Demolition Derby (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4derbyd ,sc4derby, sc4_200_5r, sc4derby, sc4_state, sc4derby, ROT0, "BFM","Demolition Derby (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4derbye ,sc4derby, sc4_200_5r, sc4derby, sc4_state, sc4derby, ROT0, "BFM","Demolition Derby (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
INPUT_PORTS_START( sc4dbldm ) // this structure is generated
PORT_INCLUDE( sc4_base )
@@ -42069,7 +42071,7 @@ INPUT_PORTS_START( sc4dbldm ) // this structure is generated
INPUT_PORTS_END
// PR2558 DOUBLE DIAMOND 011 DOUBLEDIAMONDSND DOUBLE DIAMOND
-GAMEL( 200?, sc4dbldm ,0, sc4, sc4dbldm, sc4_state, sc4, ROT0, "Qps","Double Diamond (Qps) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4dbldm ,0, sc4, sc4dbldm, sc4_state, sc4, ROT0, "Qps","Double Diamond (Qps) (Scorpion 4)", MACHINE_FLAGS, layout_bfm_sc4 )
INPUT_PORTS_START( sc4dyna ) // this structure is generated
PORT_INCLUDE( sc4_base )
@@ -42116,8 +42118,8 @@ INPUT_PORTS_START( sc4dyna ) // this structure is generated
INPUT_PORTS_END
// PR1104 DYNAMITE PR1104 DYNAMITE SOUNDS11
-GAMEL( 200?, sc4dyna ,0, sc4, sc4dyna, sc4_state, sc4, ROT0, "BFM","Dynamite (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4dynaa ,sc4dyna, sc4, sc4dyna, sc4_state, sc4, ROT0, "BFM","Dynamite (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4dyna ,0, sc4, sc4dyna, sc4_state, sc4, ROT0, "BFM","Dynamite (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4dynaa ,sc4dyna, sc4, sc4dyna, sc4_state, sc4, ROT0, "BFM","Dynamite (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
INPUT_PORTS_START( sc4easy ) // this structure is generated
PORT_INCLUDE( sc4_base )
@@ -42182,13 +42184,13 @@ INPUT_PORTS_START( sc4easy ) // this structure is generated
INPUT_PORTS_END
// PR1017 EASY STREAK PR1017 EASY STREAK SOUNDS11 EASY STREAK
-GAMEL( 200?, sc4easy ,0, sc4, sc4easy, sc4_state, sc4, ROT0, "BFM","Easy Streak (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4easya ,sc4easy, sc4, sc4easy, sc4_state, sc4, ROT0, "BFM","Easy Streak (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4easyb ,sc4easy, sc4, sc4easy, sc4_state, sc4, ROT0, "BFM","Easy Streak (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4easyc ,sc4easy, sc4, sc4easy, sc4_state, sc4, ROT0, "BFM","Easy Streak (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4easyd ,sc4easy, sc4, sc4easy, sc4_state, sc4, ROT0, "BFM","Easy Streak (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4easye ,sc4easy, sc4, sc4easy, sc4_state, sc4, ROT0, "BFM","Easy Streak (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4easyf ,sc4easy, sc4, sc4easy, sc4_state, sc4, ROT0, "BFM","Easy Streak (Bellfruit) (Scorpion 4) (set 11)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4easy ,0, sc4, sc4easy, sc4_state, sc4, ROT0, "BFM","Easy Streak (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4easya ,sc4easy, sc4, sc4easy, sc4_state, sc4, ROT0, "BFM","Easy Streak (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4easyb ,sc4easy, sc4, sc4easy, sc4_state, sc4, ROT0, "BFM","Easy Streak (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4easyc ,sc4easy, sc4, sc4easy, sc4_state, sc4, ROT0, "BFM","Easy Streak (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4easyd ,sc4easy, sc4, sc4easy, sc4_state, sc4, ROT0, "BFM","Easy Streak (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4easye ,sc4easy, sc4, sc4easy, sc4_state, sc4, ROT0, "BFM","Easy Streak (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4easyf ,sc4easy, sc4, sc4easy, sc4_state, sc4, ROT0, "BFM","Easy Streak (Bellfruit) (Scorpion 4) (set 11)", MACHINE_FLAGS, layout_bfm_sc4 )
INPUT_PORTS_START( sc4clbmn ) // this structure is generated
PORT_INCLUDE( sc4_base )
@@ -42250,10 +42252,10 @@ INPUT_PORTS_START( sc4clbmn ) // this structure is generated
INPUT_PORTS_END
//PROJECT NUMBER PR1955 CLUB MONEYBAGS MONEY BAGS CLUB PR1955 C M MONEYBAGS SOUNDS11 DEAL OR NO DEAL 5-10-20 10-20-30 20-30-50 30-50-100
-GAMEL( 200?, sc4clbmn ,0, sc4, sc4clbmn, sc4_state, sc4mbus, ROT0, "BFM","Club Moneybags (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4clbmna ,sc4clbmn, sc4, sc4clbmn, sc4_state, sc4mbus, ROT0, "BFM","Club Moneybags (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4clbmnb ,sc4clbmn, sc4, sc4clbmn, sc4_state, sc4mbus, ROT0, "BFM","Club Moneybags (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4clbmnc ,sc4clbmn, sc4, sc4clbmn, sc4_state, sc4mbus, ROT0, "BFM","Club Moneybags (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4clbmn ,0, sc4, sc4clbmn, sc4_state, sc4mbus, ROT0, "BFM","Club Moneybags (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4clbmna ,sc4clbmn, sc4, sc4clbmn, sc4_state, sc4mbus, ROT0, "BFM","Club Moneybags (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4clbmnb ,sc4clbmn, sc4, sc4clbmn, sc4_state, sc4mbus, ROT0, "BFM","Club Moneybags (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4clbmnc ,sc4clbmn, sc4, sc4clbmn, sc4_state, sc4mbus, ROT0, "BFM","Club Moneybags (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4boomb)
@@ -42325,8 +42327,8 @@ INPUT_PORTS_START( sc4boomb ) // this structure is generated
INPUT_PORTS_END
//PROJECT NUMBER PR3332 AWP MONOPOLY BOOM OR BUST S4 PR3307 MPOLY BOOM OR B SOUNDS11 BOOM OR BUST S.SITE
-GAMEL( 200?, sc4boomb ,0, sc4_5reel_alt, sc4boomb, sc4_state, sc4boomb, ROT0, "BFM","Monopoly Boom Or Bust (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4boomba ,sc4boomb, sc4_5reel_alt, sc4boomb, sc4_state, sc4boomb, ROT0, "BFM","Monopoly Boom Or Bust (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4boomb ,0, sc4_5reel_alt, sc4boomb, sc4_state, sc4boomb, ROT0, "BFM","Monopoly Boom Or Bust (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4boomba ,sc4boomb, sc4_5reel_alt, sc4boomb, sc4_state, sc4boomb, ROT0, "BFM","Monopoly Boom Or Bust (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4fever)
@@ -42399,16 +42401,16 @@ INPUT_PORTS_END
// we have FEVER SOUNDS12 but it accepts those?
// PR1007 FEVER PR1007 FEVER SOUNDS11
-GAMEL( 200?, sc4fever ,0, sc4_200_alta, sc4fever, sc4_state, sc4fever, ROT0, "BFM","Fever (PR1007) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4fevera ,sc4fever, sc4_200_alta, sc4fever, sc4_state, sc4fever, ROT0, "BFM","Fever (PR1007) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4feverb ,sc4fever, sc4_200_alta, sc4fever, sc4_state, sc4fever, ROT0, "BFM","Fever (PR1007) (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4feverc ,sc4fever, sc4_200_alta, sc4fever, sc4_state, sc4fever, ROT0, "BFM","Fever (PR1007) (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4feverd ,sc4fever, sc4_200_alta, sc4fever, sc4_state, sc4fever, ROT0, "BFM","Fever (PR1007) (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4fevere ,sc4fever, sc4_200_alta, sc4fever, sc4_state, sc4fever, ROT0, "BFM","Fever (PR1007) (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4feverf ,sc4fever, sc4_200_alta, sc4fever, sc4_state, sc4fever, ROT0, "BFM","Fever (PR1007) (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4feverg ,sc4fever, sc4_200_alta, sc4fever, sc4_state, sc4fever, ROT0, "BFM","Fever (PR1007) (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4feverh ,sc4fever, sc4_200_alta, sc4fever, sc4_state, sc4fever, ROT0, "BFM","Fever (PR1007) (Bellfruit) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4feverk ,sc4fever, sc4_200_alta, sc4fever, sc4_state, sc4fever, ROT0, "BFM","Fever (PR1007) (Bellfruit) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4fever ,0, sc4_200_alta, sc4fever, sc4_state, sc4fever, ROT0, "BFM","Fever (PR1007) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4fevera ,sc4fever, sc4_200_alta, sc4fever, sc4_state, sc4fever, ROT0, "BFM","Fever (PR1007) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4feverb ,sc4fever, sc4_200_alta, sc4fever, sc4_state, sc4fever, ROT0, "BFM","Fever (PR1007) (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4feverc ,sc4fever, sc4_200_alta, sc4fever, sc4_state, sc4fever, ROT0, "BFM","Fever (PR1007) (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4feverd ,sc4fever, sc4_200_alta, sc4fever, sc4_state, sc4fever, ROT0, "BFM","Fever (PR1007) (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4fevere ,sc4fever, sc4_200_alta, sc4fever, sc4_state, sc4fever, ROT0, "BFM","Fever (PR1007) (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4feverf ,sc4fever, sc4_200_alta, sc4fever, sc4_state, sc4fever, ROT0, "BFM","Fever (PR1007) (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4feverg ,sc4fever, sc4_200_alta, sc4fever, sc4_state, sc4fever, ROT0, "BFM","Fever (PR1007) (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4feverh ,sc4fever, sc4_200_alta, sc4fever, sc4_state, sc4fever, ROT0, "BFM","Fever (PR1007) (Bellfruit) (Scorpion 4) (set 9)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4feverk ,sc4fever, sc4_200_alta, sc4fever, sc4_state, sc4fever, ROT0, "BFM","Fever (PR1007) (Bellfruit) (Scorpion 4) (set 10)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
@@ -42474,8 +42476,8 @@ INPUT_PORTS_START( sc4aztec ) // this structure is generated
// 0x0010 - "boekho" // standard input (expected here)
INPUT_PORTS_END
-GAMEL( 200?, sc4aztec ,0, sc4, sc4aztec, sc4_state, sc4aztec, ROT0, "BFG / Eurocoin","Aztec Casino (Dutch) (Bellfruit) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// PR1225 AZTEC CASINO
-GAMEL( 200?, sc4azteca ,sc4aztec, sc4, sc4, sc4_state, sc4aztec, ROT0, "BFG / Eurocoin","Aztec (Dutch) (Bellfruit) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // PR1215 AZTEC EURO
+GAMEL( 200?, sc4aztec ,0, sc4, sc4aztec, sc4_state, sc4aztec, ROT0, "BFG / Eurocoin","Aztec Casino (Dutch) (Bellfruit) (Scorpion 4)", MACHINE_FLAGS, layout_bfm_sc4 )// PR1225 AZTEC CASINO
+GAMEL( 200?, sc4azteca ,sc4aztec, sc4, sc4, sc4_state, sc4aztec, ROT0, "BFG / Eurocoin","Aztec (Dutch) (Bellfruit) (Scorpion 4)", MACHINE_FLAGS, layout_bfm_sc4 ) // PR1215 AZTEC EURO
DRIVER_INIT_MEMBER(sc4_state,sc4helrd)
@@ -42538,8 +42540,8 @@ INPUT_PORTS_START( sc4helrd ) // this structure is generated
INPUT_PORTS_END
// PR1254 HELLRAISER ART12 95004326 HELLRAISER PR1254
-GAMEL( 200?, sc4helrd ,0, sc4_4reel, sc4helrd, sc4_state, sc4helrd, ROT0, "BFM","Hellraiser (Dutch) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4helrs ,sc4helrd, sc4_4reel, sc4helrd, sc4_state, sc4helrd, ROT0, "BFM","Hellraiser (Dutch) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4helrd ,0, sc4_4reel, sc4helrd, sc4_state, sc4helrd, ROT0, "BFM","Hellraiser (Dutch) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4helrs ,sc4helrd, sc4_4reel, sc4helrd, sc4_state, sc4helrd, ROT0, "BFM","Hellraiser (Dutch) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4heatw)
@@ -42601,7 +42603,7 @@ INPUT_PORTS_START( sc4heatw ) // this structure is generated
INPUT_PORTS_END
// PR1216 HEATWAVE ART 12 95004287 HEATWAVE PR1156
-GAMEL( 200?, sc4heatw ,0, sc4, sc4heatw, sc4_state, sc4heatw, ROT0, "BFM","Heatwave (Dutch) (Bellfruit) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4heatw ,0, sc4, sc4heatw, sc4_state, sc4heatw, ROT0, "BFM","Heatwave (Dutch) (Bellfruit) (Scorpion 4)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -42666,7 +42668,7 @@ INPUT_PORTS_START( sc4colos ) // this structure is generated
INPUT_PORTS_END
// PR1208 COLOSSUS 95004235 COLOSSUS PR7155 COLOSSUS
-GAMEL( 200?, sc4colos ,0, sc4, sc4colos, sc4_state, sc4colos, ROT0, "BFM","Colossus (Dutch) (Bellfruit) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4colos ,0, sc4, sc4colos, sc4_state, sc4colos, ROT0, "BFM","Colossus (Dutch) (Bellfruit) (Scorpion 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4fevdt)
{
@@ -42727,9 +42729,9 @@ INPUT_PORTS_START( sc4fevdt ) // this structure is generated
INPUT_PORTS_END
// PR1202 FEVER 95004239 FEVER PR7157
-GAMEL( 200?, sc4fevdt ,0, sc4, sc4fevdt, sc4_state, sc4fevdt, ROT0, "BFM","Fever (PR1202) (Dutch) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4fevdta ,sc4fevdt, sc4, sc4fevdt, sc4_state, sc4fevdt, ROT0, "BFM","Fever (PR1202) (Dutch) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4fevdtb ,sc4fevdt, sc4, sc4fevdt, sc4_state, sc4fevdt, ROT0, "BFM","Fever (PR1202) (Dutch) (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4fevdt ,0, sc4, sc4fevdt, sc4_state, sc4fevdt, ROT0, "BFM","Fever (PR1202) (Dutch) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4fevdta ,sc4fevdt, sc4, sc4fevdt, sc4_state, sc4fevdt, ROT0, "BFM","Fever (PR1202) (Dutch) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4fevdtb ,sc4fevdt, sc4, sc4fevdt, sc4_state, sc4fevdt, ROT0, "BFM","Fever (PR1202) (Dutch) (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4fevnx)
@@ -42792,8 +42794,8 @@ INPUT_PORTS_START( sc4fevnx ) // this structure is generated
INPUT_PORTS_END
// PR1216 FEVER ART12 95004318 FEVER T N PR1251
-GAMEL( 200?, sc4fevnx ,0, sc4, sc4fevnx, sc4_state, sc4fevnx, ROT0, "BFM","Fever The Next (Dutch) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4fevnxa ,sc4fevnx, sc4, sc4fevnx, sc4_state, sc4fevnx, ROT0, "BFM","Fever The Next (Dutch) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4fevnx ,0, sc4, sc4fevnx, sc4_state, sc4fevnx, ROT0, "BFM","Fever The Next (Dutch) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4fevnxa ,sc4fevnx, sc4, sc4fevnx, sc4_state, sc4fevnx, ROT0, "BFM","Fever The Next (Dutch) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4game)
{
@@ -42903,8 +42905,8 @@ INPUT_PORTS_START( sc4game ) // this structure is generated
// 0x0010 - "boekho" // standard input (expected here)
INPUT_PORTS_END
-GAMEL( 200?, sc4gamcs ,0, sc4_3reel, sc4gamcs, sc4_state, sc4game, ROT0, "BFM","The Game Casino (Dutch) (Bellfruit) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // PR1224 THE GAME CASINO 95004285 THEGAME PR1153
-GAMEL( 200?, sc4game ,sc4gamcs, sc4_3reel, sc4game, sc4_state, sc4game, ROT0, "BFM","The Game (Dutch) (Bellfruit) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // PR1213 THE GAME 95004285 THEGAME PR1153
+GAMEL( 200?, sc4gamcs ,0, sc4_3reel, sc4gamcs, sc4_state, sc4game, ROT0, "BFM","The Game Casino (Dutch) (Bellfruit) (Scorpion 4)", MACHINE_FLAGS, layout_bfm_sc4 ) // PR1224 THE GAME CASINO 95004285 THEGAME PR1153
+GAMEL( 200?, sc4game ,sc4gamcs, sc4_3reel, sc4game, sc4_state, sc4game, ROT0, "BFM","The Game (Dutch) (Bellfruit) (Scorpion 4)", MACHINE_FLAGS, layout_bfm_sc4 ) // PR1213 THE GAME 95004285 THEGAME PR1153
DRIVER_INIT_MEMBER(sc4_state,sc4goud)
{
@@ -42975,7 +42977,7 @@ INPUT_PORTS_END
// PR1211 GOUDKOORTS 95004288 GOUDKOORTS PR1151
-GAMEL( 200?, sc4goud ,0, sc4_200_5r, sc4goud, sc4_state, sc4goud, ROT0, "BFM","Goudkoorts (Dutch) (Bellfruit) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4goud ,0, sc4_200_5r, sc4goud, sc4_state, sc4goud, ROT0, "BFM","Goudkoorts (Dutch) (Bellfruit) (Scorpion 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4lasv)
{
@@ -43027,8 +43029,8 @@ INPUT_PORTS_START( sc4lasv ) // this structure is generated
INPUT_PORTS_END
// PR1209 LAS VEGAS 95004261 LASVEGAS PR7159
-GAMEL( 200?, sc4lasv ,0, sc4, sc4lasv, sc4_state, sc4lasv, ROT0, "BFM","Las Vegas (Dutch) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4lasva ,sc4lasv, sc4, sc4lasv, sc4_state, sc4lasv, ROT0, "BFM","Las Vegas (Dutch) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4lasv ,0, sc4, sc4lasv, sc4_state, sc4lasv, ROT0, "BFM","Las Vegas (Dutch) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4lasva ,sc4lasv, sc4, sc4lasv, sc4_state, sc4lasv, ROT0, "BFM","Las Vegas (Dutch) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4miljo)
{
@@ -43142,8 +43144,8 @@ INPUT_PORTS_START( sc4milja ) // this structure is generated
// 0x0010 - "boekho" // standard input (expected here)
INPUT_PORTS_END
-GAMEL( 200?, sc4miljo ,0, sc4, sc4miljo, sc4_state, sc4miljo, ROT0, "BFM","Miljonairs (Dutch) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // PR1217 MILJONAIRSART12 95004305 MILJONAIRE PR1157
-GAMEL( 200?, sc4milja ,sc4miljo, sc4, sc4milja, sc4_state, sc4miljo, ROT0, "BFM","Miljonairs Arcade (Dutch) (Bellfruit) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // PR1223 MILJONAIRS 95004305 MILJONAIRE PR1157
+GAMEL( 200?, sc4miljo ,0, sc4, sc4miljo, sc4_state, sc4miljo, ROT0, "BFM","Miljonairs (Dutch) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // PR1217 MILJONAIRSART12 95004305 MILJONAIRE PR1157
+GAMEL( 200?, sc4milja ,sc4miljo, sc4, sc4milja, sc4_state, sc4miljo, ROT0, "BFM","Miljonairs Arcade (Dutch) (Bellfruit) (Scorpion 4)", MACHINE_FLAGS, layout_bfm_sc4 ) // PR1223 MILJONAIRS 95004305 MILJONAIRE PR1157
DRIVER_INIT_MEMBER(sc4_state,sc4paytm)
{
@@ -43205,7 +43207,7 @@ INPUT_PORTS_START( sc4paytm ) // this structure is generated
INPUT_PORTS_END
// PR1205 PAY TIME 95004224 PAYTIME PR7156 PAY TIME
-GAMEL( 200?, sc4paytm ,0, sc4, sc4paytm, sc4_state, sc4paytm, ROT0, "BFM","Pay Time (Dutch) (Bellfruit) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4paytm ,0, sc4, sc4paytm, sc4_state, sc4paytm, ROT0, "BFM","Pay Time (Dutch) (Bellfruit) (Scorpion 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4pglcs)
@@ -43263,9 +43265,9 @@ INPUT_PORTS_START( sc4pglcs ) // this structure is generated
INPUT_PORTS_END
// PR1261 PHARAOH'S GOLD 95004316 CAS PHAR GOLD PR1261
-GAMEL( 200?, sc4pglcs ,0, sc4_3reel, sc4pglcs, sc4_state, sc4pglcs, ROT0, "BFM","Pharaoh's Gold Casino (Dutch) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pglcsa ,sc4pglcs, sc4_3reel, sc4pglcs, sc4_state, sc4pglcs, ROT0, "BFM","Pharaoh's Gold Casino (Dutch) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pglcsb ,sc4pglcs, sc4_3reel, sc4pglcs, sc4_state, sc4pglcs, ROT0, "BFM","Pharaoh's Gold Casino (Dutch) (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4pglcs ,0, sc4_3reel, sc4pglcs, sc4_state, sc4pglcs, ROT0, "BFM","Pharaoh's Gold Casino (Dutch) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pglcsa ,sc4pglcs, sc4_3reel, sc4pglcs, sc4_state, sc4pglcs, ROT0, "BFM","Pharaoh's Gold Casino (Dutch) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pglcsb ,sc4pglcs, sc4_3reel, sc4pglcs, sc4_state, sc4pglcs, ROT0, "BFM","Pharaoh's Gold Casino (Dutch) (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4redad)
@@ -43328,8 +43330,8 @@ INPUT_PORTS_START( sc4redad ) // this structure is generated
INPUT_PORTS_END
// PR1206 RED ALERT 95004266 REDALERT PR1051
-GAMEL( 200?, sc4redad ,0, sc4, sc4redad, sc4_state, sc4redad, ROT0, "BFM","Red Alert (Dutch) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4redada ,sc4redad, sc4, sc4redad, sc4_state, sc4redad, ROT0, "BFM","Red Alert (Dutch) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4redad ,0, sc4, sc4redad, sc4_state, sc4redad, ROT0, "BFM","Red Alert (Dutch) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4redada ,sc4redad, sc4, sc4redad, sc4_state, sc4redad, ROT0, "BFM","Red Alert (Dutch) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4rvlnx)
@@ -43390,7 +43392,7 @@ INPUT_PORTS_START( sc4rvlnx ) // this structure is generated
INPUT_PORTS_END
// PR1252 REVOLUTION NEXT 95004320 REVOLUTIONTN PR1252
-GAMEL( 200?, sc4rvlnx ,0, sc4_200_5r, sc4rvlnx, sc4_state, sc4rvlnx, ROT0, "BFM","Revolution The Next (Dutch) (Bellfruit) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4rvlnx ,0, sc4_200_5r, sc4rvlnx, sc4_state, sc4rvlnx, ROT0, "BFM","Revolution The Next (Dutch) (Bellfruit) (Scorpion 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4rvl)
{
@@ -43453,7 +43455,7 @@ INPUT_PORTS_START( sc4rvl ) // this structure is generated
INPUT_PORTS_END
// PR1203 REVOLUTION 95004259 REVOLUTION PR7158
-GAMEL( 200?, sc4rvl ,0, sc4_200_5r, sc4rvl, sc4_state, sc4rvl, ROT0, "BFM","Revolution (Dutch) (Bellfruit) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4rvl ,0, sc4_200_5r, sc4rvl, sc4_state, sc4rvl, ROT0, "BFM","Revolution (Dutch) (Bellfruit) (Scorpion 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4rio)
{
@@ -43515,7 +43517,7 @@ INPUT_PORTS_START( sc4rio ) // this structure is generated
INPUT_PORTS_END
// PR1222 RIO GRANDE 95004309 RIO GRANDE SOUNDS11
-GAMEL( 200?, sc4rio ,0, sc4, sc4rio, sc4_state, sc4rio, ROT0, "BFM","Rio Grande (Dutch) (Bellfruit) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4rio ,0, sc4, sc4rio, sc4_state, sc4rio, ROT0, "BFM","Rio Grande (Dutch) (Bellfruit) (Scorpion 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4strbr)
@@ -43633,12 +43635,12 @@ INPUT_PORTS_START( sc4strbra ) // this structure is generated
INPUT_PORTS_END
// PR1219 STARS 'N BARS 95004290 STARSNBARS PR1159
-GAMEL( 200?, sc4strbr ,0, sc4, sc4strbr, sc4_state, sc4strbr, ROT0, "BFM","Stars 'n' Bars (PR1219) (Dutch) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4strbrb ,sc4strbr, sc4, sc4strbr, sc4_state, sc4strbr, ROT0, "BFM","Stars 'n' Bars (PR1219) (Dutch) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4strbr ,0, sc4, sc4strbr, sc4_state, sc4strbr, ROT0, "BFM","Stars 'n' Bars (PR1219) (Dutch) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4strbrb ,sc4strbr, sc4, sc4strbr, sc4_state, sc4strbr, ROT0, "BFM","Stars 'n' Bars (PR1219) (Dutch) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR1263 SNBA ART13 STARS 'N' BARS ARCADE - ART13 95004290 STARSNBARS PR1159
-GAMEL( 200?, sc4strbra ,sc4strbr, sc4, sc4strbra, sc4_state, sc4strbr, ROT0, "BFM","Stars 'n' Bars Arcade (PR1263) (Dutch) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4strbrc ,sc4strbr, sc4, sc4strbra, sc4_state, sc4strbr, ROT0, "BFM","Stars 'n' Bars Arcade (PR1263) (Dutch) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4strbrd ,sc4strbr, sc4, sc4strbra, sc4_state, sc4strbr, ROT0, "BFM","Stars 'n' Bars Arcade (PR1263) (Dutch) (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4strbra ,sc4strbr, sc4, sc4strbra, sc4_state, sc4strbr, ROT0, "BFM","Stars 'n' Bars Arcade (PR1263) (Dutch) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4strbrc ,sc4strbr, sc4, sc4strbra, sc4_state, sc4strbr, ROT0, "BFM","Stars 'n' Bars Arcade (PR1263) (Dutch) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4strbrd ,sc4strbr, sc4, sc4strbra, sc4_state, sc4strbr, ROT0, "BFM","Stars 'n' Bars Arcade (PR1263) (Dutch) (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4twilt)
@@ -43702,7 +43704,7 @@ INPUT_PORTS_START( sc4twilt ) // this structure is generated
INPUT_PORTS_END
// PR1214 TWILIGHT 95004299 TWILIGHT PR1154
-GAMEL( 200?, sc4twilt ,0, sc4_4reel, sc4twilt, sc4_state, sc4twilt, ROT0, "BFM","Twilight (Dutch) (Bellfruit) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4twilt ,0, sc4_4reel, sc4twilt, sc4_state, sc4twilt, ROT0, "BFM","Twilight (Dutch) (Bellfruit) (Scorpion 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4monsp)
@@ -43765,7 +43767,7 @@ INPUT_PORTS_START( sc4monsp ) // this structure is generated
INPUT_PORTS_END
// PR1218 MONEY SPINNER ART12 95004291 MONEYSPINNER PR1158
-GAMEL( 200?, sc4monsp ,0, sc4_200_5r, sc4monsp, sc4_state, sc4monsp, ROT0, "BFM","Money Spinner (Dutch) (Bellfruit) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4monsp ,0, sc4_200_5r, sc4monsp, sc4_state, sc4monsp, ROT0, "BFM","Money Spinner (Dutch) (Bellfruit) (Scorpion 4)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -43831,7 +43833,7 @@ INPUT_PORTS_END
// PR1227 4PLAY ART13 95004313 4PLAY PR1227
-GAMEL( 200?, sc4ivply ,0, sc4_4reel, sc4ivply, sc4_state, sc4ivply, ROT0, "BFM","4 Play (Dutch) (Bellfruit) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4ivply ,0, sc4_4reel, sc4ivply, sc4_state, sc4ivply, ROT0, "BFM","4 Play (Dutch) (Bellfruit) (Scorpion 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4ccc)
@@ -43896,7 +43898,7 @@ INPUT_PORTS_START( sc4ccc ) // this structure is generated
INPUT_PORTS_END
// PR1221 CRISSCROSSCRAZY ART13 95004282 CRISSCROSS PR1161
-GAMEL( 200?, sc4ccc ,0, sc4_4reel, sc4ccc, sc4_state, sc4ccc, ROT0, "BFM","Criss Cross Crazy (Dutch) (Bellfruit) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4ccc ,0, sc4_4reel, sc4ccc, sc4_state, sc4ccc, ROT0, "BFM","Criss Cross Crazy (Dutch) (Bellfruit) (Scorpion 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4valqp)
@@ -43958,7 +43960,7 @@ INPUT_PORTS_START( sc4valqp ) // this structure is generated
INPUT_PORTS_END
// PR2040E VALHALLA...PR2040 SOUNDS V1.... (non-standard header)
-GAMEL( 200?, sc4valqp ,0, sc4_3reel, sc4valqp, sc4_state, sc4valqp, ROT0, "Qps / Eurocoin","Valhalla (Dutch) (Qps) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4valqp ,0, sc4_3reel, sc4valqp, sc4_state, sc4valqp, ROT0, "Qps / Eurocoin","Valhalla (Dutch) (Qps) (Scorpion 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4winxp)
@@ -44021,7 +44023,7 @@ INPUT_PORTS_START( sc4winxp ) // this structure is generated
INPUT_PORTS_END
// PR1207 WIN XPLOSION 95004265 WINXPLOSION PR1053
-GAMEL( 200?, sc4winxp ,0, sc4_4reel, sc4winxp, sc4_state, sc4winxp, ROT0, "BFM","Win X-plosion (Dutch) (Bellfruit) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4winxp ,0, sc4_4reel, sc4winxp, sc4_state, sc4winxp, ROT0, "BFM","Win X-plosion (Dutch) (Bellfruit) (Scorpion 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4xcash)
@@ -44079,7 +44081,7 @@ INPUT_PORTS_START( sc4xcash ) // this structure is generated
INPUT_PORTS_END
// PR1264 XTRA CASH ART13 XTRA CASH CASINO (LOTECH) - ART13 95004321 XTRACASH PR1264
-GAMEL( 200?, sc4xcash ,0, sc4_3reel, sc4xcash, sc4_state, sc4xcash, ROT0, "BFM","Xtra Cash Casino (Dutch) (Bellfruit) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4xcash ,0, sc4_3reel, sc4xcash, sc4_state, sc4xcash, ROT0, "BFM","Xtra Cash Casino (Dutch) (Bellfruit) (Scorpion 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4helld)
{
@@ -44141,7 +44143,7 @@ INPUT_PORTS_START( sc4helld ) // this structure is generated
INPUT_PORTS_END
// PR1201 HELLS BELLS 95004211 HELLS BELLS PR6945 HELLS BELLS (non english?)
-GAMEL( 200?, sc4helld ,0, sc4_3reel, sc4helld, sc4_state, sc4helld, ROT0, "BFM / Eurocoin","Hells Bells (PR1201) (Dutch) (Bellfruit) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4helld ,0, sc4_3reel, sc4helld, sc4_state, sc4helld, ROT0, "BFM / Eurocoin","Hells Bells (PR1201) (Dutch) (Bellfruit) (Scorpion 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4cashn)
{
@@ -44202,7 +44204,7 @@ INPUT_PORTS_END
// PR2038E Dutch12 Cashanova (not a standard string)
-GAMEL( 200?, sc4cashn ,0, sc4_3reel, sc4cashn, sc4_state, sc4cashn, ROT0, "Mazooma / Eurocoin","Cashanova (Dutch) (Mazooma / Eurocoin) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cashn ,0, sc4_3reel, sc4cashn, sc4_state, sc4cashn, ROT0, "Mazooma / Eurocoin","Cashanova (Dutch) (Mazooma / Eurocoin) (Scorpion 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4czfra)
@@ -44266,7 +44268,7 @@ INPUT_PORTS_START( sc4czfra ) // this structure is generated
INPUT_PORTS_END
// PR1212 CRAZY FRUITS PR1152 CRAZY FRUITS SOUNDS11
-GAMEL( 200?, sc4czfra ,0, sc4_5reel, sc4czfra, sc4_state, sc4czfra, ROT0, "BFM","Crazy Fruits (Dutch) (PR1212, CRAZ) (Bellfruit) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4czfra ,0, sc4_5reel, sc4czfra, sc4_state, sc4czfra, ROT0, "BFM","Crazy Fruits (Dutch) (PR1212, CRAZ) (Bellfruit) (Scorpion 4)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -44339,8 +44341,8 @@ INPUT_PORTS_END
// PAY UNIT ERR 17
// PR1611 AWP ANT AND DECS PR1611 ANT AND DECS SOUNDS11 ANT AND DECS S.SITE
-GAMEL( 200?, sc4adsnt ,0, sc4, sc4adsnt, sc4_state, sc4, ROT0, "BFM","Ant & Dec's Saturday Night Takeaway (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4adsnta ,sc4adsnt, sc4, sc4adsnt, sc4_state, sc4, ROT0, "BFM","Ant & Dec's Saturday Night Takeaway (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4adsnt ,0, sc4, sc4adsnt, sc4_state, sc4, ROT0, "BFM","Ant & Dec's Saturday Night Takeaway (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4adsnta ,sc4adsnt, sc4, sc4adsnt, sc4_state, sc4, ROT0, "BFM","Ant & Dec's Saturday Night Takeaway (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
INPUT_PORTS_START( sc4slad ) // this structure is generated
PORT_INCLUDE( sc4_base )
@@ -44400,15 +44402,15 @@ INPUT_PORTS_END
// PAY UNIT ERR 17
// PR1411 AWP SNAKES AND LADDERS PR1411 SNAKES A L SOUNDS11 SNAKES & LADDERS S.SITE
-GAMEL( 200?, sc4slad ,0, sc4, sc4slad, sc4_state, sc4, ROT0, "BFM","Snakes & Ladders (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4slada ,sc4slad, sc4, sc4slad, sc4_state, sc4, ROT0, "BFM","Snakes & Ladders (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4sladb ,sc4slad, sc4, sc4slad, sc4_state, sc4, ROT0, "BFM","Snakes & Ladders (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4sladc ,sc4slad, sc4, sc4slad, sc4_state, sc4, ROT0, "BFM","Snakes & Ladders (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4sladd ,sc4slad, sc4, sc4slad, sc4_state, sc4, ROT0, "BFM","Snakes & Ladders (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4slade ,sc4slad, sc4, sc4slad, sc4_state, sc4, ROT0, "BFM","Snakes & Ladders (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4sladf ,sc4slad, sc4, sc4slad, sc4_state, sc4, ROT0, "BFM","Snakes & Ladders (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4sladg ,sc4slad, sc4, sc4slad, sc4_state, sc4, ROT0, "BFM","Snakes & Ladders (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4sladh ,sc4slad, sc4, sc4slad, sc4_state, sc4, ROT0, "BFM","Snakes & Ladders (Bellfruit) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4slad ,0, sc4, sc4slad, sc4_state, sc4, ROT0, "BFM","Snakes & Ladders (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4slada ,sc4slad, sc4, sc4slad, sc4_state, sc4, ROT0, "BFM","Snakes & Ladders (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4sladb ,sc4slad, sc4, sc4slad, sc4_state, sc4, ROT0, "BFM","Snakes & Ladders (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4sladc ,sc4slad, sc4, sc4slad, sc4_state, sc4, ROT0, "BFM","Snakes & Ladders (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4sladd ,sc4slad, sc4, sc4slad, sc4_state, sc4, ROT0, "BFM","Snakes & Ladders (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4slade ,sc4slad, sc4, sc4slad, sc4_state, sc4, ROT0, "BFM","Snakes & Ladders (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4sladf ,sc4slad, sc4, sc4slad, sc4_state, sc4, ROT0, "BFM","Snakes & Ladders (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4sladg ,sc4slad, sc4, sc4slad, sc4_state, sc4, ROT0, "BFM","Snakes & Ladders (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4sladh ,sc4slad, sc4, sc4slad, sc4_state, sc4, ROT0, "BFM","Snakes & Ladders (Bellfruit) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
INPUT_PORTS_START( sc4magci ) // this structure is generated
PORT_INCLUDE( sc4_base )
@@ -44453,37 +44455,37 @@ INPUT_PORTS_END
// PAY UNIT ERR 17
// PR2535 MAGIC CIRCLE STANDARD 011 MAGICSND
-GAMEL( 200?, sc4magci ,0, sc4, sc4magci, sc4_state, sc4, ROT0, "Qps","Magic Circle (011) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4magcik ,sc4magci, sc4, sc4magci, sc4_state, sc4, ROT0, "Qps","Magic Circle (011) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4magci ,0, sc4, sc4magci, sc4_state, sc4, ROT0, "Qps","Magic Circle (011) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4magcik ,sc4magci, sc4, sc4magci, sc4_state, sc4, ROT0, "Qps","Magic Circle (011) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2535 MAGIC CIRCLE STANDARD 021 MAGICSND
-GAMEL( 200?, sc4magcia ,sc4magci, sc4, sc4magci, sc4_state, sc4, ROT0, "Qps","Magic Circle (021) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4magcil ,sc4magci, sc4, sc4magci, sc4_state, sc4, ROT0, "Qps","Magic Circle (021) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4magcia ,sc4magci, sc4, sc4magci, sc4_state, sc4, ROT0, "Qps","Magic Circle (021) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4magcil ,sc4magci, sc4, sc4magci, sc4_state, sc4, ROT0, "Qps","Magic Circle (021) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2535 MAGIC CIRCLE STANDARD 031 MAGICSND
-GAMEL( 200?, sc4magcib ,sc4magci, sc4, sc4magci, sc4_state, sc4, ROT0, "Qps","Magic Circle (031) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4magcim ,sc4magci, sc4, sc4magci, sc4_state, sc4, ROT0, "Qps","Magic Circle (031) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4magcib ,sc4magci, sc4, sc4magci, sc4_state, sc4, ROT0, "Qps","Magic Circle (031) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4magcim ,sc4magci, sc4, sc4magci, sc4_state, sc4, ROT0, "Qps","Magic Circle (031) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2535 MAGIC CIRCLE STANDARD 012 MAGICSND
-GAMEL( 200?, sc4magcic ,sc4magci, sc4, sc4magci, sc4_state, sc4, ROT0, "Qps","Magic Circle (012) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4magcin ,sc4magci, sc4, sc4magci, sc4_state, sc4, ROT0, "Qps","Magic Circle (012) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4magcid ,sc4magci, sc4, sc4magci, sc4_state, sc4, ROT0, "Qps","Magic Circle (012) (Qps) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4magcio ,sc4magci, sc4, sc4magci, sc4_state, sc4, ROT0, "Qps","Magic Circle (012) (Qps) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4magcic ,sc4magci, sc4, sc4magci, sc4_state, sc4, ROT0, "Qps","Magic Circle (012) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4magcin ,sc4magci, sc4, sc4magci, sc4_state, sc4, ROT0, "Qps","Magic Circle (012) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4magcid ,sc4magci, sc4, sc4magci, sc4_state, sc4, ROT0, "Qps","Magic Circle (012) (Qps) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4magcio ,sc4magci, sc4, sc4magci, sc4_state, sc4, ROT0, "Qps","Magic Circle (012) (Qps) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
//P R2535 MAGIC CIRCLE STANDARD 022 MAGICSND
-GAMEL( 200?, sc4magcie ,sc4magci, sc4, sc4magci, sc4_state, sc4, ROT0, "Qps","Magic Circle (022) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4magcip ,sc4magci, sc4, sc4magci, sc4_state, sc4, ROT0, "Qps","Magic Circle (022) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4magcie ,sc4magci, sc4, sc4magci, sc4_state, sc4, ROT0, "Qps","Magic Circle (022) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4magcip ,sc4magci, sc4, sc4magci, sc4_state, sc4, ROT0, "Qps","Magic Circle (022) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2535 MAGIC CIRCLE STANDARD 032 MAGICSND
-GAMEL( 200?, sc4magcif ,sc4magci, sc4, sc4magci, sc4_state, sc4, ROT0, "Qps","Magic Circle (032) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4magciq ,sc4magci, sc4, sc4magci, sc4_state, sc4, ROT0, "Qps","Magic Circle (032) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4magcif ,sc4magci, sc4, sc4magci, sc4_state, sc4, ROT0, "Qps","Magic Circle (032) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4magciq ,sc4magci, sc4, sc4magci, sc4_state, sc4, ROT0, "Qps","Magic Circle (032) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2535 MAGIC CIRCLE STANDARD 013 MAGICSND
-GAMEL( 200?, sc4magcig ,sc4magci, sc4, sc4magci, sc4_state, sc4, ROT0, "Qps","Magic Circle (013) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4magcir ,sc4magci, sc4, sc4magci, sc4_state, sc4, ROT0, "Qps","Magic Circle (013) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4magcig ,sc4magci, sc4, sc4magci, sc4_state, sc4, ROT0, "Qps","Magic Circle (013) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4magcir ,sc4magci, sc4, sc4magci, sc4_state, sc4, ROT0, "Qps","Magic Circle (013) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2535 MAGIC CIRCLE STANDARD 014 MAGICSND
-GAMEL( 200?, sc4magcih ,sc4magci, sc4, sc4magci, sc4_state, sc4, ROT0, "Qps","Magic Circle (014) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4magcis ,sc4magci, sc4, sc4magci, sc4_state, sc4, ROT0, "Qps","Magic Circle (014) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4magcih ,sc4magci, sc4, sc4magci, sc4_state, sc4, ROT0, "Qps","Magic Circle (014) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4magcis ,sc4magci, sc4, sc4magci, sc4_state, sc4, ROT0, "Qps","Magic Circle (014) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2535 MAGIC CIRCLE STANDARD 024 MAGICSND
-GAMEL( 200?, sc4magcii ,sc4magci, sc4, sc4magci, sc4_state, sc4, ROT0, "Qps","Magic Circle (024) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4magcit ,sc4magci, sc4, sc4magci, sc4_state, sc4, ROT0, "Qps","Magic Circle (024) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4magcii ,sc4magci, sc4, sc4magci, sc4_state, sc4, ROT0, "Qps","Magic Circle (024) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4magcit ,sc4magci, sc4, sc4magci, sc4_state, sc4, ROT0, "Qps","Magic Circle (024) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2535 MAGIC CIRCLE STANDARD 034 MAGICSND
-GAMEL( 200?, sc4magcij ,sc4magci, sc4, sc4magci, sc4_state, sc4, ROT0, "Qps","Magic Circle (034) (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4magciu ,sc4magci, sc4, sc4magci, sc4_state, sc4, ROT0, "Qps","Magic Circle (034) (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4magcij ,sc4magci, sc4, sc4magci, sc4_state, sc4, ROT0, "Qps","Magic Circle (034) (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4magciu ,sc4magci, sc4, sc4magci, sc4_state, sc4, ROT0, "Qps","Magic Circle (034) (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
INPUT_PORTS_START( sc4dcrls ) // this structure is generated
PORT_INCLUDE( sc4_base )
@@ -44528,23 +44530,23 @@ INPUT_PORTS_END
// PAY UNIT ERR 17
// PR2544 DOUBLE CRAZY REELS 021 DCRZYSND
-GAMEL( 200?, sc4dcrls ,0, sc4, sc4dcrls, sc4_state, sc4, ROT0, "Mazooma","Double Crazy Reels (021) (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4dcrlsf ,sc4dcrls, sc4, sc4dcrls, sc4_state, sc4, ROT0, "Mazooma","Double Crazy Reels (021) (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4dcrls ,0, sc4, sc4dcrls, sc4_state, sc4, ROT0, "Mazooma","Double Crazy Reels (021) (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4dcrlsf ,sc4dcrls, sc4, sc4dcrls, sc4_state, sc4, ROT0, "Mazooma","Double Crazy Reels (021) (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2544 DOUBLE CRAZY REELS 031 DCRZYSND
-GAMEL( 200?, sc4dcrlsa ,sc4dcrls, sc4, sc4dcrls, sc4_state, sc4, ROT0, "Mazooma","Double Crazy Reels (031) (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4dcrlsg ,sc4dcrls, sc4, sc4dcrls, sc4_state, sc4, ROT0, "Mazooma","Double Crazy Reels (031) (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4dcrlsa ,sc4dcrls, sc4, sc4dcrls, sc4_state, sc4, ROT0, "Mazooma","Double Crazy Reels (031) (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4dcrlsg ,sc4dcrls, sc4, sc4dcrls, sc4_state, sc4, ROT0, "Mazooma","Double Crazy Reels (031) (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2544 DOUBLE CRAZY REELS 022 DCRZYSND
-GAMEL( 200?, sc4dcrlsb ,sc4dcrls, sc4, sc4dcrls, sc4_state, sc4, ROT0, "Mazooma","Double Crazy Reels (022) (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4dcrlsh ,sc4dcrls, sc4, sc4dcrls, sc4_state, sc4, ROT0, "Mazooma","Double Crazy Reels (022) (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4dcrlsb ,sc4dcrls, sc4, sc4dcrls, sc4_state, sc4, ROT0, "Mazooma","Double Crazy Reels (022) (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4dcrlsh ,sc4dcrls, sc4, sc4dcrls, sc4_state, sc4, ROT0, "Mazooma","Double Crazy Reels (022) (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2544 DOUBLE CRAZY REELS 032 DCRZYSND
-GAMEL( 200?, sc4dcrlsc ,sc4dcrls, sc4, sc4dcrls, sc4_state, sc4, ROT0, "Mazooma","Double Crazy Reels (032) (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4dcrlsi ,sc4dcrls, sc4, sc4dcrls, sc4_state, sc4, ROT0, "Mazooma","Double Crazy Reels (032) (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4dcrlsc ,sc4dcrls, sc4, sc4dcrls, sc4_state, sc4, ROT0, "Mazooma","Double Crazy Reels (032) (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4dcrlsi ,sc4dcrls, sc4, sc4dcrls, sc4_state, sc4, ROT0, "Mazooma","Double Crazy Reels (032) (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2544 DOUBLE CRAZY REELS 023 DCRZYSND
-GAMEL( 200?, sc4dcrlsd ,sc4dcrls, sc4, sc4dcrls, sc4_state, sc4, ROT0, "Mazooma","Double Crazy Reels (023) (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4dcrlsj ,sc4dcrls, sc4, sc4dcrls, sc4_state, sc4, ROT0, "Mazooma","Double Crazy Reels (023) (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4dcrlsd ,sc4dcrls, sc4, sc4dcrls, sc4_state, sc4, ROT0, "Mazooma","Double Crazy Reels (023) (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4dcrlsj ,sc4dcrls, sc4, sc4dcrls, sc4_state, sc4, ROT0, "Mazooma","Double Crazy Reels (023) (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2544 DOUBLE CRAZY REELS 033 DCRZYSND
-GAMEL( 200?, sc4dcrlse ,sc4dcrls, sc4, sc4dcrls, sc4_state, sc4, ROT0, "Mazooma","Double Crazy Reels (033) (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4dcrlsk ,sc4dcrls, sc4, sc4dcrls, sc4_state, sc4, ROT0, "Mazooma","Double Crazy Reels (033) (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4dcrlse ,sc4dcrls, sc4, sc4dcrls, sc4_state, sc4, ROT0, "Mazooma","Double Crazy Reels (033) (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4dcrlsk ,sc4dcrls, sc4, sc4dcrls, sc4_state, sc4, ROT0, "Mazooma","Double Crazy Reels (033) (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
INPUT_PORTS_START( sc4gshot ) // this structure is generated
PORT_INCLUDE( sc4_base )
@@ -44589,11 +44591,11 @@ INPUT_PORTS_END
// PAY UNIT ERR 17
// PR2564 GOLDEN SHOT Standard Version GOLDENSHOTLOTECHSND
-GAMEL( 200?, sc4gshot ,0, sc4, sc4gshot, sc4_state, sc4, ROT0, "Qps","Golden Shot (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gshotb ,sc4gshot, sc4, sc4gshot, sc4_state, sc4, ROT0, "Qps","Golden Shot (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4gshot ,0, sc4, sc4gshot, sc4_state, sc4, ROT0, "Qps","Golden Shot (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gshotb ,sc4gshot, sc4, sc4gshot, sc4_state, sc4, ROT0, "Qps","Golden Shot (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2564 GOLDEN SHOT Arcade Version GOLDENSHOTLOTECHSND
-GAMEL( 200?, sc4gshota ,sc4gshot, sc4, sc4gshot, sc4_state, sc4, ROT0, "Qps","Golden Shot Arcade (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gshotc ,sc4gshot, sc4, sc4gshot, sc4_state, sc4, ROT0, "Qps","Golden Shot Arcade (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4gshota ,sc4gshot, sc4, sc4gshot, sc4_state, sc4, ROT0, "Qps","Golden Shot Arcade (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gshotc ,sc4gshot, sc4, sc4gshot, sc4_state, sc4, ROT0, "Qps","Golden Shot Arcade (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
INPUT_PORTS_START( sc4cj ) // this structure is generated
PORT_INCLUDE( sc4_base )
@@ -44660,11 +44662,11 @@ INPUT_PORTS_END
// PAY UNIT ERR 17
// PR1416 COOL JEWELS PR1416 COOL JEWELS SOUNDS11 COOL JEWELS S.SITE
-GAMEL( 200?, sc4cj ,0, sc4, sc4cj, sc4_state, sc4, ROT0, "BFM","Cool Jewels (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cja ,sc4cj, sc4, sc4cj, sc4_state, sc4, ROT0, "BFM","Cool Jewels (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cjb ,sc4cj, sc4, sc4cj, sc4_state, sc4, ROT0, "BFM","Cool Jewels (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cjc ,sc4cj, sc4, sc4cj, sc4_state, sc4, ROT0, "BFM","Cool Jewels (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cjd ,sc4cj, sc4, sc4cj, sc4_state, sc4, ROT0, "BFM","Cool Jewels (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // incomplete pairing
+GAMEL( 200?, sc4cj ,0, sc4, sc4cj, sc4_state, sc4, ROT0, "BFM","Cool Jewels (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cja ,sc4cj, sc4, sc4cj, sc4_state, sc4, ROT0, "BFM","Cool Jewels (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cjb ,sc4cj, sc4, sc4cj, sc4_state, sc4, ROT0, "BFM","Cool Jewels (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cjc ,sc4cj, sc4, sc4cj, sc4_state, sc4, ROT0, "BFM","Cool Jewels (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cjd ,sc4cj, sc4, sc4cj, sc4_state, sc4, ROT0, "BFM","Cool Jewels (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 ) // incomplete pairing
INPUT_PORTS_START( sc4crnjw ) // this structure is generated
PORT_INCLUDE( sc4_base )
@@ -44733,8 +44735,8 @@ INPUT_PORTS_END
// PAY UNIT ERROR 17
// PR1638 AWP CROWN JEWELS PR1608 CROWN JEWELS SOUNDS11 CROWN JEWELS S.SITE
-GAMEL( 200?, sc4crnjw ,0, sc4, sc4crnjw, sc4_state, sc4, ROT0, "BFM","Crown Jewels (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crnjwa ,sc4crnjw, sc4, sc4crnjw, sc4_state, sc4, ROT0, "BFM","Crown Jewels (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4crnjw ,0, sc4, sc4crnjw, sc4_state, sc4, ROT0, "BFM","Crown Jewels (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crnjwa ,sc4crnjw, sc4, sc4crnjw, sc4_state, sc4, ROT0, "BFM","Crown Jewels (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
INPUT_PORTS_START( sc4jjok ) // this structure is generated
PORT_INCLUDE( sc4_base )
@@ -44805,8 +44807,8 @@ INPUT_PORTS_END
// PAY UNIT ERR 17
// PR1609 JACKPOT JOKERS PR1609 JACKPOT JOKERS SOUNDS11 JACKPOT JOKERS S.SITE
-GAMEL( 200?, sc4jjok ,0, sc4, sc4jjok, sc4_state, sc4, ROT0, "BFM","Jackpot Jokers (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4jjoka ,sc4jjok, sc4, sc4jjok, sc4_state, sc4, ROT0, "BFM","Jackpot Jokers (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4jjok ,0, sc4, sc4jjok, sc4_state, sc4, ROT0, "BFM","Jackpot Jokers (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4jjoka ,sc4jjok, sc4, sc4jjok, sc4_state, sc4, ROT0, "BFM","Jackpot Jokers (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
INPUT_PORTS_START( sc4copsr ) // this structure is generated
@@ -44867,16 +44869,16 @@ INPUT_PORTS_END
// PAY UNIT ERR 17
// PR1412 AWP COPS AND ROBBERS PR1412 COPS AND ROBBERS SOUNDS11 COPS AND ROBBERS S.SITE
-GAMEL( 200?, sc4copsr ,0, sc4, sc4copsr, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4copsra ,sc4copsr, sc4, sc4copsr, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4copsrb ,sc4copsr, sc4, sc4copsr, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4copsrc ,sc4copsr, sc4, sc4copsr, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4copsrd ,sc4copsr, sc4, sc4copsr, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4copsre ,sc4copsr, sc4, sc4copsr, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4copsrf ,sc4copsr, sc4, sc4copsr, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4copsrg ,sc4copsr, sc4, sc4copsr, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4copsrh ,sc4copsr, sc4, sc4copsr, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4copsri ,sc4copsr, sc4, sc4copsr, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4copsr ,0, sc4, sc4copsr, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4copsra ,sc4copsr, sc4, sc4copsr, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4copsrb ,sc4copsr, sc4, sc4copsr, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4copsrc ,sc4copsr, sc4, sc4copsr, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4copsrd ,sc4copsr, sc4, sc4copsr, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4copsre ,sc4copsr, sc4, sc4copsr, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4copsrf ,sc4copsr, sc4, sc4copsr, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4copsrg ,sc4copsr, sc4, sc4copsr, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4copsrh ,sc4copsr, sc4, sc4copsr, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4copsri ,sc4copsr, sc4, sc4copsr, sc4_state, sc4, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
INPUT_PORTS_START( sc4druby ) // this structure is generated
PORT_INCLUDE( sc4_base )
@@ -44936,11 +44938,11 @@ INPUT_PORTS_END
// gives an 'init comms' countdown
// PR1439 DIAMONDS & RUBIES PR1436 TRIPLE CASINO SOUNDS11
-GAMEL( 200?, sc4druby ,0, sc4, sc4druby, sc4_state, sc4, ROT0, "BFM","Diamonds & Rubies (Bellfruit) (Scorpion 4) (Top Box?, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4drubya ,sc4druby, sc4, sc4druby, sc4_state, sc4, ROT0, "BFM","Diamonds & Rubies (Bellfruit) (Scorpion 4) (Top Box?, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4drubyb ,sc4druby, sc4, sc4druby, sc4_state, sc4, ROT0, "BFM","Diamonds & Rubies (Bellfruit) (Scorpion 4) (Top Box?, set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // incomplete pairing
-GAMEL( 200?, sc4drubyc ,sc4druby, sc4, sc4druby, sc4_state, sc4, ROT0, "BFM","Diamonds & Rubies (Bellfruit) (Scorpion 4) (Top Box?, set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4drubyd ,sc4druby, sc4, sc4druby, sc4_state, sc4, ROT0, "BFM","Diamonds & Rubies (Bellfruit) (Scorpion 4) (Top Box?, set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4druby ,0, sc4, sc4druby, sc4_state, sc4, ROT0, "BFM","Diamonds & Rubies (Bellfruit) (Scorpion 4) (Top Box?, set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4drubya ,sc4druby, sc4, sc4druby, sc4_state, sc4, ROT0, "BFM","Diamonds & Rubies (Bellfruit) (Scorpion 4) (Top Box?, set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4drubyb ,sc4druby, sc4, sc4druby, sc4_state, sc4, ROT0, "BFM","Diamonds & Rubies (Bellfruit) (Scorpion 4) (Top Box?, set 3)", MACHINE_FLAGS, layout_bfm_sc4 ) // incomplete pairing
+GAMEL( 200?, sc4drubyc ,sc4druby, sc4, sc4druby, sc4_state, sc4, ROT0, "BFM","Diamonds & Rubies (Bellfruit) (Scorpion 4) (Top Box?, set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4drubyd ,sc4druby, sc4, sc4druby, sc4_state, sc4, ROT0, "BFM","Diamonds & Rubies (Bellfruit) (Scorpion 4) (Top Box?, set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
/****************************************************************************************************************************************************************************************************************/
@@ -45013,12 +45015,12 @@ INPUT_PORTS_END
// missing sound roms
// PR2540 ABRACADABRA ABRA SOUNDS ABRACADABRA
-GAMEL( 200?, sc4abra ,0, sc4_200_4r, sc4abra, sc4_state, sc4abra, ROT0, "Qps","Abracadabra (Qps) (Scorpion 4) (set 1, 041)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4abraa ,sc4abra, sc4_200_4r, sc4abra, sc4_state, sc4abra, ROT0, "Qps","Abracadabra (Qps) (Scorpion 4) (set 2, 041)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4abrab ,sc4abra, sc4_200_4r, sc4abra, sc4_state, sc4abra, ROT0, "Qps","Abracadabra (Qps) (Scorpion 4) (set 3, 044)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4abrac ,sc4abra, sc4_200_4r, sc4abra, sc4_state, sc4abra, ROT0, "Qps","Abracadabra (Qps) (Scorpion 4) (set 4, 044)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4abrad ,sc4abra, sc4_200_4r, sc4abra, sc4_state, sc4abra, ROT0, "Qps","Abracadabra (Qps) (Scorpion 4) (set 5, 014)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4abrae ,sc4abra, sc4_200_4r, sc4abra, sc4_state, sc4abra, ROT0, "Qps","Abracadabra (Qps) (Scorpion 4) (set 6, 014)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4abra ,0, sc4_200_4r, sc4abra, sc4_state, sc4abra, ROT0, "Qps","Abracadabra (Qps) (Scorpion 4) (set 1, 041)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4abraa ,sc4abra, sc4_200_4r, sc4abra, sc4_state, sc4abra, ROT0, "Qps","Abracadabra (Qps) (Scorpion 4) (set 2, 041)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4abrab ,sc4abra, sc4_200_4r, sc4abra, sc4_state, sc4abra, ROT0, "Qps","Abracadabra (Qps) (Scorpion 4) (set 3, 044)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4abrac ,sc4abra, sc4_200_4r, sc4abra, sc4_state, sc4abra, ROT0, "Qps","Abracadabra (Qps) (Scorpion 4) (set 4, 044)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4abrad ,sc4abra, sc4_200_4r, sc4abra, sc4_state, sc4abra, ROT0, "Qps","Abracadabra (Qps) (Scorpion 4) (set 5, 014)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4abrae ,sc4abra, sc4_200_4r, sc4abra, sc4_state, sc4abra, ROT0, "Qps","Abracadabra (Qps) (Scorpion 4) (set 6, 014)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
INPUT_PORTS_START( sc4alad ) // this structure is generated
@@ -45063,8 +45065,8 @@ INPUT_PORTS_END
// bad / missing sound roms
// PR7068 ALADDIN'S CAVE CAVE SOUNDS
-GAMEL( 200?, sc4alad ,0, sc4, sc4alad, sc4_state, sc4, ROT0, "Mazooma","Aladdin's Cave (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4alada ,sc4alad, sc4, sc4alad, sc4_state, sc4, ROT0, "Mazooma","Aladdin's Cave (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4alad ,0, sc4, sc4alad, sc4_state, sc4, ROT0, "Mazooma","Aladdin's Cave (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4alada ,sc4alad, sc4, sc4alad, sc4_state, sc4, ROT0, "Mazooma","Aladdin's Cave (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
@@ -45121,8 +45123,8 @@ INPUT_PORTS_END
// missing sound roms, doesn't play
// PR2501 BIG DEAL BIGDEALSND BIG DEAL
-GAMEL( 200?, sc4bigdl ,0, sc4_200_5r, sc4bigdl, sc4_state, sc4bigdl, ROT0, "Qps","Big Deal (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bigdla ,sc4bigdl, sc4_200_5r, sc4bigdl, sc4_state, sc4bigdl, ROT0, "Qps","Big Deal (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4bigdl ,0, sc4_200_5r, sc4bigdl, sc4_state, sc4bigdl, ROT0, "Qps","Big Deal (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4bigdla ,sc4bigdl, sc4_200_5r, sc4bigdl, sc4_state, sc4bigdl, ROT0, "Qps","Big Deal (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
@@ -45188,11 +45190,11 @@ INPUT_PORTS_END
// no sound roms
// PR7038 CASH CONNEXION MTOM SOUNDS
-GAMEL( 200?, sc4cconx ,0, sc4_4reel, sc4, sc4_state, sc4cconx, ROT0, "Mazooma","Cash Connexion (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cconxa ,sc4cconx, sc4_4reel, sc4, sc4_state, sc4cconx, ROT0, "Mazooma","Cash Connexion (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cconxb ,sc4cconx, sc4_4reel, sc4, sc4_state, sc4cconx, ROT0, "Mazooma","Cash Connexion (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cconxc ,sc4cconx, sc4_4reel, sc4, sc4_state, sc4cconx, ROT0, "Mazooma","Cash Connexion (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cconxd ,sc4cconx, sc4_200_4r, sc4cconxd, sc4_state, sc4cconxd, ROT0, "Mazooma","Cash Connexion (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // this one won't init without a 200 step reel
+GAMEL( 200?, sc4cconx ,0, sc4_4reel, sc4, sc4_state, sc4cconx, ROT0, "Mazooma","Cash Connexion (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4cconxa ,sc4cconx, sc4_4reel, sc4, sc4_state, sc4cconx, ROT0, "Mazooma","Cash Connexion (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4cconxb ,sc4cconx, sc4_4reel, sc4, sc4_state, sc4cconx, ROT0, "Mazooma","Cash Connexion (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4cconxc ,sc4cconx, sc4_4reel, sc4, sc4_state, sc4cconx, ROT0, "Mazooma","Cash Connexion (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4cconxd ,sc4cconx, sc4_200_4r, sc4cconxd, sc4_state, sc4cconxd, ROT0, "Mazooma","Cash Connexion (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 ) // this one won't init without a 200 step reel
DRIVER_INIT_MEMBER(sc4_state,sc4ccrus)
{
@@ -45252,9 +45254,9 @@ INPUT_PORTS_END
// no sound roms (probably doesn't want cashanova, but check)
// PR2006 CASH CRUSADERS CASH SOUNDS CASH CRUSADERS
-GAMEL( 200?, sc4ccrus ,0, sc4_4reel, sc4ccrus, sc4_state, sc4ccrus, ROT0, "Mazooma","Cash Crusaders (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ccrusa ,sc4ccrus, sc4_4reel, sc4ccrus, sc4_state, sc4ccrus, ROT0, "Mazooma","Cash Crusaders (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ccrusb ,sc4ccrus, sc4_4reel, sc4ccrus, sc4_state, sc4ccrus, ROT0, "Mazooma","Cash Crusaders (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4ccrus ,0, sc4_4reel, sc4ccrus, sc4_state, sc4ccrus, ROT0, "Mazooma","Cash Crusaders (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4ccrusa ,sc4ccrus, sc4_4reel, sc4ccrus, sc4_state, sc4ccrus, ROT0, "Mazooma","Cash Crusaders (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4ccrusb ,sc4ccrus, sc4_4reel, sc4ccrus, sc4_state, sc4ccrus, ROT0, "Mazooma","Cash Crusaders (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
@@ -45315,16 +45317,16 @@ INPUT_PORTS_START( sc4jjc ) // this structure is generated
INPUT_PORTS_END
// PR2152 JUMPIN JACK CASH JACK SOUNDS JUMPIN JACK CASH
-GAMEL( 200?, sc4jjc ,0, sc4_200_4ra, sc4jjc, sc4_state, sc4jjc, ROT0, "Mazooma","Jumping Jack Cash (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4jjca ,sc4jjc, sc4_200_4ra, sc4jjc, sc4_state, sc4jjc, ROT0, "Mazooma","Jumping Jack Cash (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4jjcb ,sc4jjc, sc4_200_4ra, sc4jjc, sc4_state, sc4jjc, ROT0, "Mazooma","Jumping Jack Cash (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4jjcc ,sc4jjc, sc4_200_4ra, sc4jjc, sc4_state, sc4jjc, ROT0, "Mazooma","Jumping Jack Cash (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4jjcd ,sc4jjc, sc4_200_4ra, sc4jjc, sc4_state, sc4jjc, ROT0, "Mazooma","Jumping Jack Cash (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4jjce ,sc4jjc, sc4_200_4ra, sc4jjc, sc4_state, sc4jjc, ROT0, "Mazooma","Jumping Jack Cash (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4jjcf ,sc4jjc, sc4_200_4ra, sc4jjc, sc4_state, sc4jjc, ROT0, "Mazooma","Jumping Jack Cash (Mazooma) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4jjcg ,sc4jjc, sc4_200_4ra, sc4jjc, sc4_state, sc4jjc, ROT0, "Mazooma","Jumping Jack Cash (Mazooma) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4jjch ,sc4jjc, sc4_200_4ra, sc4jjc, sc4_state, sc4jjc, ROT0, "Mazooma","Jumping Jack Cash (Mazooma) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4jjci ,sc4jjc, sc4_200_4ra, sc4jjc, sc4_state, sc4jjc, ROT0, "Mazooma","Jumping Jack Cash (Mazooma) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4jjc ,0, sc4_200_4ra, sc4jjc, sc4_state, sc4jjc, ROT0, "Mazooma","Jumping Jack Cash (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4jjca ,sc4jjc, sc4_200_4ra, sc4jjc, sc4_state, sc4jjc, ROT0, "Mazooma","Jumping Jack Cash (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4jjcb ,sc4jjc, sc4_200_4ra, sc4jjc, sc4_state, sc4jjc, ROT0, "Mazooma","Jumping Jack Cash (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4jjcc ,sc4jjc, sc4_200_4ra, sc4jjc, sc4_state, sc4jjc, ROT0, "Mazooma","Jumping Jack Cash (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4jjcd ,sc4jjc, sc4_200_4ra, sc4jjc, sc4_state, sc4jjc, ROT0, "Mazooma","Jumping Jack Cash (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4jjce ,sc4jjc, sc4_200_4ra, sc4jjc, sc4_state, sc4jjc, ROT0, "Mazooma","Jumping Jack Cash (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4jjcf ,sc4jjc, sc4_200_4ra, sc4jjc, sc4_state, sc4jjc, ROT0, "Mazooma","Jumping Jack Cash (Mazooma) (Scorpion 4) (set 7)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4jjcg ,sc4jjc, sc4_200_4ra, sc4jjc, sc4_state, sc4jjc, ROT0, "Mazooma","Jumping Jack Cash (Mazooma) (Scorpion 4) (set 8)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4jjch ,sc4jjc, sc4_200_4ra, sc4jjc, sc4_state, sc4jjc, ROT0, "Mazooma","Jumping Jack Cash (Mazooma) (Scorpion 4) (set 9)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4jjci ,sc4jjc, sc4_200_4ra, sc4jjc, sc4_state, sc4jjc, ROT0, "Mazooma","Jumping Jack Cash (Mazooma) (Scorpion 4) (set 10)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
INPUT_PORTS_START( sc4kkong ) // this structure is generated
@@ -45375,17 +45377,17 @@ INPUT_PORTS_START( sc4kkong ) // this structure is generated
INPUT_PORTS_END
// PR2161 KING KONG CASH 000 KKCSH SOUNDS KING KONG CASH
-GAMEL( 200?, sc4kkong ,0, sc4, sc4kkong, sc4_state, sc4, ROT0, "Mazooma","King Kong Cash (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4kkonga ,sc4kkong, sc4, sc4kkong, sc4_state, sc4, ROT0, "Mazooma","King Kong Cash (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4kkongb ,sc4kkong, sc4, sc4kkong, sc4_state, sc4, ROT0, "Mazooma","King Kong Cash (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4kkongc ,sc4kkong, sc4, sc4kkong, sc4_state, sc4, ROT0, "Mazooma","King Kong Cash (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4kkongd ,sc4kkong, sc4, sc4kkong, sc4_state, sc4, ROT0, "Mazooma","King Kong Cash (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4kkonge ,sc4kkong, sc4, sc4kkong, sc4_state, sc4, ROT0, "Mazooma","King Kong Cash (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4kkongf ,sc4kkong, sc4, sc4kkong, sc4_state, sc4, ROT0, "Mazooma","King Kong Cash (Mazooma) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4kkongg ,sc4kkong, sc4, sc4kkong, sc4_state, sc4, ROT0, "Mazooma","King Kong Cash (Mazooma) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4kkongh ,sc4kkong, sc4, sc4kkong, sc4_state, sc4, ROT0, "Mazooma","King Kong Cash (Mazooma) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4kkongi ,sc4kkong, sc4, sc4kkong, sc4_state, sc4, ROT0, "Mazooma","King Kong Cash (Mazooma) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4kkongj ,sc4kkong, sc4, sc4kkong, sc4_state, sc4, ROT0, "Mazooma","King Kong Cash (Mazooma) (Scorpion 4) (set 11)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4kkong ,0, sc4, sc4kkong, sc4_state, sc4, ROT0, "Mazooma","King Kong Cash (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4kkonga ,sc4kkong, sc4, sc4kkong, sc4_state, sc4, ROT0, "Mazooma","King Kong Cash (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4kkongb ,sc4kkong, sc4, sc4kkong, sc4_state, sc4, ROT0, "Mazooma","King Kong Cash (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4kkongc ,sc4kkong, sc4, sc4kkong, sc4_state, sc4, ROT0, "Mazooma","King Kong Cash (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4kkongd ,sc4kkong, sc4, sc4kkong, sc4_state, sc4, ROT0, "Mazooma","King Kong Cash (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4kkonge ,sc4kkong, sc4, sc4kkong, sc4_state, sc4, ROT0, "Mazooma","King Kong Cash (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4kkongf ,sc4kkong, sc4, sc4kkong, sc4_state, sc4, ROT0, "Mazooma","King Kong Cash (Mazooma) (Scorpion 4) (set 7)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4kkongg ,sc4kkong, sc4, sc4kkong, sc4_state, sc4, ROT0, "Mazooma","King Kong Cash (Mazooma) (Scorpion 4) (set 8)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4kkongh ,sc4kkong, sc4, sc4kkong, sc4_state, sc4, ROT0, "Mazooma","King Kong Cash (Mazooma) (Scorpion 4) (set 9)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4kkongi ,sc4kkong, sc4, sc4kkong, sc4_state, sc4, ROT0, "Mazooma","King Kong Cash (Mazooma) (Scorpion 4) (set 10)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4kkongj ,sc4kkong, sc4, sc4kkong, sc4_state, sc4, ROT0, "Mazooma","King Kong Cash (Mazooma) (Scorpion 4) (set 11)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4knok)
@@ -45442,8 +45444,8 @@ INPUT_PORTS_END
// PR7061 KNOCKOUT KOUT SOUNDS
-GAMEL( 200?, sc4knok ,0, sc4_4reel, sc4knok, sc4_state, sc4knok, ROT0, "Mazooma","Knockout (PR7061, KOUT) (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4knoka ,sc4knok, sc4_4reel, sc4knok, sc4_state, sc4knok, ROT0, "Mazooma","Knockout (PR7061, KOUT) (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4knok ,0, sc4_4reel, sc4knok, sc4_state, sc4knok, ROT0, "Mazooma","Knockout (PR7061, KOUT) (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4knoka ,sc4knok, sc4_4reel, sc4knok, sc4_state, sc4knok, ROT0, "Mazooma","Knockout (PR7061, KOUT) (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
INPUT_PORTS_START( sc4knokb ) // this structure is generated
@@ -45491,8 +45493,8 @@ INPUT_PORTS_END
// This is a different game
// PR2057 KNOCK OUT PKOT SOUNDS KNOCK OUT
-GAMEL( 200?, sc4knokb ,0, sc4_200_5r, sc4knokb, sc4_state, sc4knokb, ROT0, "Mazooma","Knock Out (PR2057, PKOT) (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4knokc ,sc4knokb, sc4_200_5r, sc4knokb, sc4_state, sc4knokb, ROT0, "Mazooma","Knock Out (PR2057, PKOT) (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4knokb ,0, sc4_200_5r, sc4knokb, sc4_state, sc4knokb, ROT0, "Mazooma","Knock Out (PR2057, PKOT) (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4knokc ,sc4knokb, sc4_200_5r, sc4knokb, sc4_state, sc4knokb, ROT0, "Mazooma","Knock Out (PR2057, PKOT) (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4maxcc)
@@ -45565,10 +45567,10 @@ INPUT_PORTS_START( sc4maxcc ) // this structure is generated
INPUT_PORTS_END
// PR2130 CLUB MAXIMUS CASH MAXIMUS CASH CLUB CMAX SOUNDS MAXIMUS CASH
-GAMEL( 200?, sc4maxcc ,0, sc4_200_5r, sc4maxcc, sc4_state, sc4maxcc, ROT0, "Mazooma","Maximus Cash Club (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4maxcca ,sc4maxcc, sc4_200_5r, sc4maxcc, sc4_state, sc4maxcc, ROT0, "Mazooma","Maximus Cash Club (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4maxccb ,sc4maxcc, sc4_200_5r, sc4maxcc, sc4_state, sc4maxcc, ROT0, "Mazooma","Maximus Cash Club (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4maxccc ,sc4maxcc, sc4_200_5r, sc4maxcc, sc4_state, sc4maxcc, ROT0, "Mazooma","Maximus Cash Club (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4maxcc ,0, sc4_200_5r, sc4maxcc, sc4_state, sc4maxcc, ROT0, "Mazooma","Maximus Cash Club (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4maxcca ,sc4maxcc, sc4_200_5r, sc4maxcc, sc4_state, sc4maxcc, ROT0, "Mazooma","Maximus Cash Club (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4maxccb ,sc4maxcc, sc4_200_5r, sc4maxcc, sc4_state, sc4maxcc, ROT0, "Mazooma","Maximus Cash Club (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4maxccc ,sc4maxcc, sc4_200_5r, sc4maxcc, sc4_state, sc4maxcc, ROT0, "Mazooma","Maximus Cash Club (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4wadzl)
@@ -45625,8 +45627,8 @@ INPUT_PORTS_START( sc4wadzl ) // this structure is generated
INPUT_PORTS_END
// PR2052 WADZILLA WADZ SOUNDS WADZILLA
-GAMEL( 200?, sc4wadzl ,0, sc4_200_5r, sc4wadzl, sc4_state, sc4wadzl, ROT0, "Mazooma","Wadzilla (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wadzla ,sc4wadzl, sc4_200_5r, sc4wadzl, sc4_state, sc4wadzl, ROT0, "Mazooma","Wadzilla (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4wadzl ,0, sc4_200_5r, sc4wadzl, sc4_state, sc4wadzl, ROT0, "Mazooma","Wadzilla (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4wadzla ,sc4wadzl, sc4_200_5r, sc4wadzl, sc4_state, sc4wadzl, ROT0, "Mazooma","Wadzilla (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
INPUT_PORTS_START( sc4s16 ) // this structure is generated
@@ -45676,8 +45678,8 @@ INPUT_PORTS_END
// RNG ERR 99
// PR21xx SECTION 16 SECT SOUNDS SECTION 16
-GAMEL( 200?, sc4s16 ,0, sc4, sc4s16, sc4_state, sc4, ROT0, "Mazooma","Section 16 (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4s16a ,sc4s16, sc4, sc4s16, sc4_state, sc4, ROT0, "Mazooma","Section 16 (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4s16 ,0, sc4, sc4s16, sc4_state, sc4, ROT0, "Mazooma","Section 16 (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4s16a ,sc4s16, sc4, sc4s16, sc4_state, sc4, ROT0, "Mazooma","Section 16 (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
INPUT_PORTS_START( sc4bob ) // this structure is generated
@@ -45732,16 +45734,16 @@ INPUT_PORTS_START( sc4bob ) // this structure is generated
INPUT_PORTS_END
// PR2170 BOBBY DAZZLER BOBD SOUNDS BOBBY DAZZLER
-GAMEL( 200?, sc4bob ,0, sc4, sc4bob, sc4_state, sc4, ROT0, "Mazooma","Bobby Dazzler (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4boba ,sc4bob, sc4, sc4bob, sc4_state, sc4, ROT0, "Mazooma","Bobby Dazzler (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bobb ,sc4bob, sc4, sc4bob, sc4_state, sc4, ROT0, "Mazooma","Bobby Dazzler (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bobc ,sc4bob, sc4, sc4bob, sc4_state, sc4, ROT0, "Mazooma","Bobby Dazzler (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bobd ,sc4bob, sc4, sc4bob, sc4_state, sc4, ROT0, "Mazooma","Bobby Dazzler (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bobe ,sc4bob, sc4, sc4bob, sc4_state, sc4, ROT0, "Mazooma","Bobby Dazzler (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bobf ,sc4bob, sc4, sc4bob, sc4_state, sc4, ROT0, "Mazooma","Bobby Dazzler (Mazooma) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bobg ,sc4bob, sc4, sc4bob, sc4_state, sc4, ROT0, "Mazooma","Bobby Dazzler (Mazooma) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bobh ,sc4bob, sc4, sc4bob, sc4_state, sc4, ROT0, "Mazooma","Bobby Dazzler (Mazooma) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bobi ,sc4bob, sc4, sc4bob, sc4_state, sc4, ROT0, "Mazooma","Bobby Dazzler (Mazooma) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4bob ,0, sc4, sc4bob, sc4_state, sc4, ROT0, "Mazooma","Bobby Dazzler (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4boba ,sc4bob, sc4, sc4bob, sc4_state, sc4, ROT0, "Mazooma","Bobby Dazzler (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4bobb ,sc4bob, sc4, sc4bob, sc4_state, sc4, ROT0, "Mazooma","Bobby Dazzler (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4bobc ,sc4bob, sc4, sc4bob, sc4_state, sc4, ROT0, "Mazooma","Bobby Dazzler (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4bobd ,sc4bob, sc4, sc4bob, sc4_state, sc4, ROT0, "Mazooma","Bobby Dazzler (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4bobe ,sc4bob, sc4, sc4bob, sc4_state, sc4, ROT0, "Mazooma","Bobby Dazzler (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4bobf ,sc4bob, sc4, sc4bob, sc4_state, sc4, ROT0, "Mazooma","Bobby Dazzler (Mazooma) (Scorpion 4) (set 7)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4bobg ,sc4bob, sc4, sc4bob, sc4_state, sc4, ROT0, "Mazooma","Bobby Dazzler (Mazooma) (Scorpion 4) (set 8)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4bobh ,sc4bob, sc4, sc4bob, sc4_state, sc4, ROT0, "Mazooma","Bobby Dazzler (Mazooma) (Scorpion 4) (set 9)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4bobi ,sc4bob, sc4, sc4bob, sc4_state, sc4, ROT0, "Mazooma","Bobby Dazzler (Mazooma) (Scorpion 4) (set 10)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
INPUT_PORTS_START( sc4clue ) // this structure is generated
PORT_INCLUDE( sc4_base )
@@ -45807,14 +45809,14 @@ INPUT_PORTS_START( sc4clue ) // this structure is generated
INPUT_PORTS_END
// PR2230 CLUEDO CLUE SOUNDS CLUEDO
-GAMEL( 200?, sc4clue ,0, sc4, sc4clue, sc4_state, sc4, ROT0, "Mazooma","Cluedo (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cluea ,sc4clue, sc4, sc4clue, sc4_state, sc4, ROT0, "Mazooma","Cluedo (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4clueb ,sc4clue, sc4, sc4clue, sc4_state, sc4, ROT0, "Mazooma","Cluedo (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cluec ,sc4clue, sc4, sc4clue, sc4_state, sc4, ROT0, "Mazooma","Cluedo (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4clued ,sc4clue, sc4, sc4clue, sc4_state, sc4, ROT0, "Mazooma","Cluedo (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cluee ,sc4clue, sc4, sc4clue, sc4_state, sc4, ROT0, "Mazooma","Cluedo (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cluef ,sc4clue, sc4, sc4clue, sc4_state, sc4, ROT0, "Mazooma","Cluedo (Mazooma) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4clueg ,sc4clue, sc4, sc4clue, sc4_state, sc4, ROT0, "Mazooma","Cluedo (Mazooma) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4clue ,0, sc4, sc4clue, sc4_state, sc4, ROT0, "Mazooma","Cluedo (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4cluea ,sc4clue, sc4, sc4clue, sc4_state, sc4, ROT0, "Mazooma","Cluedo (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4clueb ,sc4clue, sc4, sc4clue, sc4_state, sc4, ROT0, "Mazooma","Cluedo (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4cluec ,sc4clue, sc4, sc4clue, sc4_state, sc4, ROT0, "Mazooma","Cluedo (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4clued ,sc4clue, sc4, sc4clue, sc4_state, sc4, ROT0, "Mazooma","Cluedo (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4cluee ,sc4clue, sc4, sc4clue, sc4_state, sc4, ROT0, "Mazooma","Cluedo (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4cluef ,sc4clue, sc4, sc4clue, sc4_state, sc4, ROT0, "Mazooma","Cluedo (Mazooma) (Scorpion 4) (set 7)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4clueg ,sc4clue, sc4, sc4clue, sc4_state, sc4, ROT0, "Mazooma","Cluedo (Mazooma) (Scorpion 4) (set 8)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
INPUT_PORTS_START( sc4ducks ) // this structure is generated
PORT_INCLUDE( sc4_base )
@@ -45862,10 +45864,10 @@ INPUT_PORTS_START( sc4ducks ) // this structure is generated
INPUT_PORTS_END
// PR2118 DUCKS OF HAZZARD DUCKSOFHAZZARDSND DUCKS OF HAZZARD
-GAMEL( 200?, sc4ducks ,0, sc4, sc4ducks, sc4_state, sc4, ROT0, "Mazooma","Ducks Of Hazzard (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ducksa ,sc4ducks, sc4, sc4ducks, sc4_state, sc4, ROT0, "Mazooma","Ducks Of Hazzard (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ducksb ,sc4ducks, sc4, sc4ducks, sc4_state, sc4, ROT0, "Mazooma","Ducks Of Hazzard (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ducksc ,sc4ducks, sc4, sc4ducks, sc4_state, sc4, ROT0, "Mazooma","Ducks Of Hazzard (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4ducks ,0, sc4, sc4ducks, sc4_state, sc4, ROT0, "Mazooma","Ducks Of Hazzard (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4ducksa ,sc4ducks, sc4, sc4ducks, sc4_state, sc4, ROT0, "Mazooma","Ducks Of Hazzard (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4ducksb ,sc4ducks, sc4, sc4ducks, sc4_state, sc4, ROT0, "Mazooma","Ducks Of Hazzard (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4ducksc ,sc4ducks, sc4, sc4ducks, sc4_state, sc4, ROT0, "Mazooma","Ducks Of Hazzard (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4glad)
{
@@ -45937,14 +45939,14 @@ INPUT_PORTS_START( sc4glad ) // this structure is generated
INPUT_PORTS_END
// PR2255 GLADIATOR GLAD SOUNDS GLADIATOR
-GAMEL( 200?, sc4glad ,0, sc4_200_4rb, sc4glad, sc4_state, sc4glad, ROT0, "QPS / Mazooma","Gladiator (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4glada ,sc4glad, sc4_200_4rb, sc4glad, sc4_state, sc4glad, ROT0, "QPS / Mazooma","Gladiator (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gladb ,sc4glad, sc4_200_4rb, sc4glad, sc4_state, sc4glad, ROT0, "QPS / Mazooma","Gladiator (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gladc ,sc4glad, sc4_200_4rb, sc4glad, sc4_state, sc4glad, ROT0, "QPS / Mazooma","Gladiator (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gladd ,sc4glad, sc4_200_4rb, sc4glad, sc4_state, sc4glad, ROT0, "QPS / Mazooma","Gladiator (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4glade ,sc4glad, sc4_200_4rb, sc4glad, sc4_state, sc4glad, ROT0, "QPS / Mazooma","Gladiator (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gladf ,sc4glad, sc4_200_4rb, sc4glad, sc4_state, sc4glad, ROT0, "QPS / Mazooma","Gladiator (Mazooma) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gladg ,sc4glad, sc4_200_4rb, sc4glad, sc4_state, sc4glad, ROT0, "QPS / Mazooma","Gladiator (Mazooma) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4glad ,0, sc4_200_4rb, sc4glad, sc4_state, sc4glad, ROT0, "QPS / Mazooma","Gladiator (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4glada ,sc4glad, sc4_200_4rb, sc4glad, sc4_state, sc4glad, ROT0, "QPS / Mazooma","Gladiator (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4gladb ,sc4glad, sc4_200_4rb, sc4glad, sc4_state, sc4glad, ROT0, "QPS / Mazooma","Gladiator (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4gladc ,sc4glad, sc4_200_4rb, sc4glad, sc4_state, sc4glad, ROT0, "QPS / Mazooma","Gladiator (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4gladd ,sc4glad, sc4_200_4rb, sc4glad, sc4_state, sc4glad, ROT0, "QPS / Mazooma","Gladiator (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4glade ,sc4glad, sc4_200_4rb, sc4glad, sc4_state, sc4glad, ROT0, "QPS / Mazooma","Gladiator (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4gladf ,sc4glad, sc4_200_4rb, sc4glad, sc4_state, sc4glad, ROT0, "QPS / Mazooma","Gladiator (Mazooma) (Scorpion 4) (set 7)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4gladg ,sc4glad, sc4_200_4rb, sc4glad, sc4_state, sc4glad, ROT0, "QPS / Mazooma","Gladiator (Mazooma) (Scorpion 4) (set 8)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
INPUT_PORTS_START( sc4hotdg ) // this structure is generated
@@ -46006,10 +46008,10 @@ INPUT_PORTS_START( sc4hotdg ) // this structure is generated
INPUT_PORTS_END
// PR1936 AWP HOT DOG SCORP4 PR1916 HOT DOG SOUNDS11 HOT DOG S.SITE
-GAMEL( 200?, sc4hotdg ,0, sc4, sc4hotdg, sc4_state, sc4mbus, ROT0, "BFM","Hot Dog (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hotdga ,sc4hotdg, sc4, sc4hotdg, sc4_state, sc4mbus, ROT0, "BFM","Hot Dog (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // incomplete pairing
-GAMEL( 200?, sc4hotdgb ,sc4hotdg, sc4, sc4hotdg, sc4_state, sc4mbus, ROT0, "BFM","Hot Dog (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hotdgc ,sc4hotdg, sc4, sc4hotdg, sc4_state, sc4mbus, ROT0, "BFM","Hot Dog (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4hotdg ,0, sc4, sc4hotdg, sc4_state, sc4mbus, ROT0, "BFM","Hot Dog (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4hotdga ,sc4hotdg, sc4, sc4hotdg, sc4_state, sc4mbus, ROT0, "BFM","Hot Dog (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 ) // incomplete pairing
+GAMEL( 200?, sc4hotdgb ,sc4hotdg, sc4, sc4hotdg, sc4_state, sc4mbus, ROT0, "BFM","Hot Dog (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4hotdgc ,sc4hotdg, sc4, sc4hotdg, sc4_state, sc4mbus, ROT0, "BFM","Hot Dog (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4pp)
{
@@ -46085,11 +46087,11 @@ INPUT_PORTS_END
// doesn't like any of the sound roms we have
// PR2562 PINK PANTHER PINK SOUNDS PINK PANTHER
-GAMEL( 200?, sc4pp ,0, sc4_200_4ra, sc4pp, sc4_state, sc4pp, ROT0, "Mazooma","Pink Panther (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ppa ,sc4pp, sc4_200_4ra, sc4pp, sc4_state, sc4pp, ROT0, "Mazooma","Pink Panther (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ppb ,sc4pp, sc4_200_4ra, sc4pp, sc4_state, sc4pp, ROT0, "Mazooma","Pink Panther (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ppc ,sc4pp, sc4_200_4ra, sc4pp, sc4_state, sc4pp, ROT0, "Mazooma","Pink Panther (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ppd ,sc4pp, sc4_200_4ra, sc4pp, sc4_state, sc4pp, ROT0, "Mazooma","Pink Panther (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4pp ,0, sc4_200_4ra, sc4pp, sc4_state, sc4pp, ROT0, "Mazooma","Pink Panther (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4ppa ,sc4pp, sc4_200_4ra, sc4pp, sc4_state, sc4pp, ROT0, "Mazooma","Pink Panther (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4ppb ,sc4pp, sc4_200_4ra, sc4pp, sc4_state, sc4pp, ROT0, "Mazooma","Pink Panther (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4ppc ,sc4pp, sc4_200_4ra, sc4pp, sc4_state, sc4pp, ROT0, "Mazooma","Pink Panther (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4ppd ,sc4pp, sc4_200_4ra, sc4pp, sc4_state, sc4pp, ROT0, "Mazooma","Pink Panther (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
INPUT_PORTS_START( sc4ppsag ) // this structure is generated
@@ -46145,16 +46147,16 @@ INPUT_PORTS_START( sc4ppsag ) // this structure is generated
INPUT_PORTS_END
// PR2303 STRIKES AGAIN PPSA SOUNDS STRIKES AGAIN
-GAMEL( 200?, sc4ppsag ,0, sc4, sc4ppsag, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Strikes Again (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ppsaga ,sc4ppsag, sc4, sc4ppsag, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Strikes Again (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ppsagb ,sc4ppsag, sc4, sc4ppsag, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Strikes Again (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ppsagc ,sc4ppsag, sc4, sc4ppsag, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Strikes Again (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ppsagd ,sc4ppsag, sc4, sc4ppsag, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Strikes Again (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ppsage ,sc4ppsag, sc4, sc4ppsag, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Strikes Again (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ppsagf ,sc4ppsag, sc4, sc4ppsag, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Strikes Again (Mazooma) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ppsagg ,sc4ppsag, sc4, sc4ppsag, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Strikes Again (Mazooma) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ppsagh ,sc4ppsag, sc4, sc4ppsag, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Strikes Again (Mazooma) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ppsagi ,sc4ppsag, sc4, sc4ppsag, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Strikes Again (Mazooma) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4ppsag ,0, sc4, sc4ppsag, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Strikes Again (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4ppsaga ,sc4ppsag, sc4, sc4ppsag, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Strikes Again (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4ppsagb ,sc4ppsag, sc4, sc4ppsag, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Strikes Again (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4ppsagc ,sc4ppsag, sc4, sc4ppsag, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Strikes Again (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4ppsagd ,sc4ppsag, sc4, sc4ppsag, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Strikes Again (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4ppsage ,sc4ppsag, sc4, sc4ppsag, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Strikes Again (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4ppsagf ,sc4ppsag, sc4, sc4ppsag, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Strikes Again (Mazooma) (Scorpion 4) (set 7)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4ppsagg ,sc4ppsag, sc4, sc4ppsag, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Strikes Again (Mazooma) (Scorpion 4) (set 8)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4ppsagh ,sc4ppsag, sc4, sc4ppsag, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Strikes Again (Mazooma) (Scorpion 4) (set 9)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4ppsagi ,sc4ppsag, sc4, sc4ppsag, sc4_state, sc4, ROT0, "Mazooma","Pink Panther Strikes Again (Mazooma) (Scorpion 4) (set 10)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
INPUT_PORTS_START( sc4pog ) // this structure is generated
PORT_INCLUDE( sc4_base )
@@ -46222,16 +46224,16 @@ INPUT_PORTS_START( sc4pog ) // this structure is generated
INPUT_PORTS_END
// PR1938 AWP POTS OF GOLD SCORP4 PR1918 POTS OF GOLD SOUNDS11 POTS OF GOLD S.SITE
-GAMEL( 200?, sc4pog ,0, sc4, sc4pog, sc4_state, sc4mbus, ROT0, "BFM","Pots Of Gold (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4poga ,sc4pog, sc4, sc4pog, sc4_state, sc4mbus, ROT0, "BFM","Pots Of Gold (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pogb ,sc4pog, sc4, sc4pog, sc4_state, sc4mbus, ROT0, "BFM","Pots Of Gold (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pogc ,sc4pog, sc4, sc4pog, sc4_state, sc4mbus, ROT0, "BFM","Pots Of Gold (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pogd ,sc4pog, sc4, sc4pog, sc4_state, sc4mbus, ROT0, "BFM","Pots Of Gold (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4poge ,sc4pog, sc4, sc4pog, sc4_state, sc4mbus, ROT0, "BFM","Pots Of Gold (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pogf ,sc4pog, sc4, sc4pog, sc4_state, sc4mbus, ROT0, "BFM","Pots Of Gold (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pogg ,sc4pog, sc4, sc4pog, sc4_state, sc4mbus, ROT0, "BFM","Pots Of Gold (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pogh ,sc4pog, sc4, sc4pog, sc4_state, sc4mbus, ROT0, "BFM","Pots Of Gold (Bellfruit) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pogi ,sc4pog, sc4, sc4pog, sc4_state, sc4mbus, ROT0, "BFM","Pots Of Gold (Bellfruit) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4pog ,0, sc4, sc4pog, sc4_state, sc4mbus, ROT0, "BFM","Pots Of Gold (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4poga ,sc4pog, sc4, sc4pog, sc4_state, sc4mbus, ROT0, "BFM","Pots Of Gold (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4pogb ,sc4pog, sc4, sc4pog, sc4_state, sc4mbus, ROT0, "BFM","Pots Of Gold (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4pogc ,sc4pog, sc4, sc4pog, sc4_state, sc4mbus, ROT0, "BFM","Pots Of Gold (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4pogd ,sc4pog, sc4, sc4pog, sc4_state, sc4mbus, ROT0, "BFM","Pots Of Gold (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4poge ,sc4pog, sc4, sc4pog, sc4_state, sc4mbus, ROT0, "BFM","Pots Of Gold (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4pogf ,sc4pog, sc4, sc4pog, sc4_state, sc4mbus, ROT0, "BFM","Pots Of Gold (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4pogg ,sc4pog, sc4, sc4pog, sc4_state, sc4mbus, ROT0, "BFM","Pots Of Gold (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4pogh ,sc4pog, sc4, sc4pog, sc4_state, sc4mbus, ROT0, "BFM","Pots Of Gold (Bellfruit) (Scorpion 4) (set 9)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4pogi ,sc4pog, sc4, sc4pog, sc4_state, sc4mbus, ROT0, "BFM","Pots Of Gold (Bellfruit) (Scorpion 4) (set 10)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
INPUT_PORTS_START( sc4pwrpl ) // this structure is generated
PORT_INCLUDE( sc4_base )
@@ -46281,10 +46283,10 @@ INPUT_PORTS_START( sc4pwrpl ) // this structure is generated
INPUT_PORTS_END
// PR2272 POWER PLAY PPLY SOUNDS
-GAMEL( 200?, sc4pwrpl ,0, sc4, sc4pwrpl, sc4_state, sc4, ROT0, "Mazooma","Power Play (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pwrpla ,sc4pwrpl, sc4, sc4pwrpl, sc4_state, sc4, ROT0, "Mazooma","Power Play (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pwrplb ,sc4pwrpl, sc4, sc4pwrpl, sc4_state, sc4, ROT0, "Mazooma","Power Play (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pwrplc ,sc4pwrpl, sc4, sc4pwrpl, sc4_state, sc4, ROT0, "Mazooma","Power Play (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4pwrpl ,0, sc4, sc4pwrpl, sc4_state, sc4, ROT0, "Mazooma","Power Play (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4pwrpla ,sc4pwrpl, sc4, sc4pwrpl, sc4_state, sc4, ROT0, "Mazooma","Power Play (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4pwrplb ,sc4pwrpl, sc4, sc4pwrpl, sc4_state, sc4, ROT0, "Mazooma","Power Play (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4pwrplc ,sc4pwrpl, sc4, sc4pwrpl, sc4_state, sc4, ROT0, "Mazooma","Power Play (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4swywm)
@@ -46341,14 +46343,14 @@ INPUT_PORTS_END
// PR2232 SPIN WHEN YOU'RE WINNING SPIN SOUNDS
-GAMEL( 200?, sc4swywm ,0, sc4_200_5ra, sc4swywm, sc4_state, sc4swywm, ROT0, "Mazooma","Spin When Your Winning (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4swywma ,sc4swywm, sc4_200_5ra, sc4swywm, sc4_state, sc4swywm, ROT0, "Mazooma","Spin When Your Winning (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4swywmb ,sc4swywm, sc4_200_5ra, sc4swywm, sc4_state, sc4swywm, ROT0, "Mazooma","Spin When Your Winning (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4swywmc ,sc4swywm, sc4_200_5ra, sc4swywm, sc4_state, sc4swywm, ROT0, "Mazooma","Spin When Your Winning (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4swywmd ,sc4swywm, sc4_200_5ra, sc4swywm, sc4_state, sc4swywm, ROT0, "Mazooma","Spin When Your Winning (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4swywme ,sc4swywm, sc4_200_5ra, sc4swywm, sc4_state, sc4swywm, ROT0, "Mazooma","Spin When Your Winning (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4swywmf ,sc4swywm, sc4_200_5ra, sc4swywm, sc4_state, sc4swywm, ROT0, "Mazooma","Spin When Your Winning (Mazooma) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4swywmg ,sc4swywm, sc4_200_5ra, sc4swywm, sc4_state, sc4swywm, ROT0, "Mazooma","Spin When Your Winning (Mazooma) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4swywm ,0, sc4_200_5ra, sc4swywm, sc4_state, sc4swywm, ROT0, "Mazooma","Spin When Your Winning (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4swywma ,sc4swywm, sc4_200_5ra, sc4swywm, sc4_state, sc4swywm, ROT0, "Mazooma","Spin When Your Winning (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4swywmb ,sc4swywm, sc4_200_5ra, sc4swywm, sc4_state, sc4swywm, ROT0, "Mazooma","Spin When Your Winning (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4swywmc ,sc4swywm, sc4_200_5ra, sc4swywm, sc4_state, sc4swywm, ROT0, "Mazooma","Spin When Your Winning (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4swywmd ,sc4swywm, sc4_200_5ra, sc4swywm, sc4_state, sc4swywm, ROT0, "Mazooma","Spin When Your Winning (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4swywme ,sc4swywm, sc4_200_5ra, sc4swywm, sc4_state, sc4swywm, ROT0, "Mazooma","Spin When Your Winning (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4swywmf ,sc4swywm, sc4_200_5ra, sc4swywm, sc4_state, sc4swywm, ROT0, "Mazooma","Spin When Your Winning (Mazooma) (Scorpion 4) (set 7)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4swywmg ,sc4swywm, sc4_200_5ra, sc4swywm, sc4_state, sc4swywm, ROT0, "Mazooma","Spin When Your Winning (Mazooma) (Scorpion 4) (set 8)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4sumit)
{
@@ -46423,10 +46425,10 @@ INPUT_PORTS_START( sc4sumit ) // this structure is generated
INPUT_PORTS_END
// PR2176 SUMMIT UP SUMMIT SOUNDS SUMMIT UP (was in the Suits U Sir set)
-GAMEL( 200?, sc4sumit ,0, sc4_200_4ra, sc4sumit, sc4_state, sc4sumit, ROT0, "Mazooma","Summit Up (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4sumita ,sc4sus, sc4_200_4ra, sc4sumit, sc4_state, sc4sumit, ROT0, "Mazooma","Summit Up (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4sumitb ,sc4sus, sc4_200_4ra, sc4sumit, sc4_state, sc4sumit, ROT0, "Mazooma","Summit Up (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4sumitc ,sc4sus, sc4_200_4ra, sc4sumit, sc4_state, sc4sumit, ROT0, "Mazooma","Summit Up (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4sumit ,0, sc4_200_4ra, sc4sumit, sc4_state, sc4sumit, ROT0, "Mazooma","Summit Up (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4sumita ,sc4sus, sc4_200_4ra, sc4sumit, sc4_state, sc4sumit, ROT0, "Mazooma","Summit Up (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4sumitb ,sc4sus, sc4_200_4ra, sc4sumit, sc4_state, sc4sumit, ROT0, "Mazooma","Summit Up (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4sumitc ,sc4sus, sc4_200_4ra, sc4sumit, sc4_state, sc4sumit, ROT0, "Mazooma","Summit Up (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
INPUT_PORTS_START( sc4tpsht ) // this structure is generated
PORT_INCLUDE( sc4_base )
@@ -46475,14 +46477,14 @@ INPUT_PORTS_START( sc4tpsht ) // this structure is generated
INPUT_PORTS_END
// PR2211 TOP OF THE SHOTS TOTS SOUNDS TOP OF THE SHOTS
-GAMEL( 200?, sc4tpsht ,0, sc4, sc4tpsht, sc4_state, sc4, ROT0, "Mazooma","Top Of The Shots (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tpshta ,sc4tpsht, sc4, sc4tpsht, sc4_state, sc4, ROT0, "Mazooma","Top Of The Shots (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tpshtb ,sc4tpsht, sc4, sc4tpsht, sc4_state, sc4, ROT0, "Mazooma","Top Of The Shots (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tpshtc ,sc4tpsht, sc4, sc4tpsht, sc4_state, sc4, ROT0, "Mazooma","Top Of The Shots (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tpshtd ,sc4tpsht, sc4, sc4tpsht, sc4_state, sc4, ROT0, "Mazooma","Top Of The Shots (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tpshte ,sc4tpsht, sc4, sc4tpsht, sc4_state, sc4, ROT0, "Mazooma","Top Of The Shots (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tpshtf ,sc4tpsht, sc4, sc4tpsht, sc4_state, sc4, ROT0, "Mazooma","Top Of The Shots (Mazooma) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tpshtg ,sc4tpsht, sc4, sc4tpsht, sc4_state, sc4, ROT0, "Mazooma","Top Of The Shots (Mazooma) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4tpsht ,0, sc4, sc4tpsht, sc4_state, sc4, ROT0, "Mazooma","Top Of The Shots (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4tpshta ,sc4tpsht, sc4, sc4tpsht, sc4_state, sc4, ROT0, "Mazooma","Top Of The Shots (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4tpshtb ,sc4tpsht, sc4, sc4tpsht, sc4_state, sc4, ROT0, "Mazooma","Top Of The Shots (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4tpshtc ,sc4tpsht, sc4, sc4tpsht, sc4_state, sc4, ROT0, "Mazooma","Top Of The Shots (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4tpshtd ,sc4tpsht, sc4, sc4tpsht, sc4_state, sc4, ROT0, "Mazooma","Top Of The Shots (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4tpshte ,sc4tpsht, sc4, sc4tpsht, sc4_state, sc4, ROT0, "Mazooma","Top Of The Shots (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4tpshtf ,sc4tpsht, sc4, sc4tpsht, sc4_state, sc4, ROT0, "Mazooma","Top Of The Shots (Mazooma) (Scorpion 4) (set 7)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4tpshtg ,sc4tpsht, sc4, sc4tpsht, sc4_state, sc4, ROT0, "Mazooma","Top Of The Shots (Mazooma) (Scorpion 4) (set 8)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
INPUT_PORTS_START( sc4adren ) // this structure is generated
@@ -46531,10 +46533,10 @@ INPUT_PORTS_END
// does not want the 'COTL SOUNDS' from Cash On The Lash
// PR2118 ADRENALIN COTL SOUNDS ADRENALIN
-GAMEL( 200?, sc4adren ,0, sc4, sc4adren, sc4_state, sc4, ROT0, "Mazooma","Adrenalin (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4adrena ,sc4adren, sc4, sc4adren, sc4_state, sc4, ROT0, "Mazooma","Adrenalin (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4adrenb ,sc4adren, sc4, sc4adren, sc4_state, sc4, ROT0, "Mazooma","Adrenalin (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4adrenc ,sc4adren, sc4, sc4adren, sc4_state, sc4, ROT0, "Mazooma","Adrenalin (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4adren ,0, sc4, sc4adren, sc4_state, sc4, ROT0, "Mazooma","Adrenalin (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4adrena ,sc4adren, sc4, sc4adren, sc4_state, sc4, ROT0, "Mazooma","Adrenalin (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4adrenb ,sc4adren, sc4, sc4adren, sc4_state, sc4, ROT0, "Mazooma","Adrenalin (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4adrenc ,sc4adren, sc4, sc4adren, sc4_state, sc4, ROT0, "Mazooma","Adrenalin (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
INPUT_PORTS_START( sc4bingb ) // this structure is generated
@@ -46589,8 +46591,8 @@ INPUT_PORTS_END
// check if Side Splitter sound is correct
// RNG ERROR 99
// PR21xx BINGO BELLE SSPT SOUNDS BINGO BELLE
-GAMEL( 200?, sc4bingb ,0, sc4, sc4bingb, sc4_state, sc4, ROT0, "Mazooma","Bingo Belle (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bingba ,sc4bingb, sc4, sc4bingb, sc4_state, sc4, ROT0, "Mazooma","Bingo Belle (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4bingb ,0, sc4, sc4bingb, sc4_state, sc4, ROT0, "Mazooma","Bingo Belle (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4bingba ,sc4bingb, sc4, sc4bingb, sc4_state, sc4, ROT0, "Mazooma","Bingo Belle (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
INPUT_PORTS_START( sc4cerup ) // this structure is generated
PORT_INCLUDE( sc4_base )
@@ -46641,7 +46643,7 @@ INPUT_PORTS_END
// PR2020 CASH ERUPTION ERUP SOUNDS CASH ERUPTION
-GAMEL( 200?, sc4cerup ,0, sc4, sc4cerup, sc4_state, sc4, ROT0, "Mazooma","Cash Eruption (Mazooma) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cerup ,0, sc4, sc4cerup, sc4_state, sc4, ROT0, "Mazooma","Cash Eruption (Mazooma) (Scorpion 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
INPUT_PORTS_START( sc4cexpl ) // this structure is generated
PORT_INCLUDE( sc4_base )
@@ -46693,22 +46695,22 @@ INPUT_PORTS_START( sc4cexpl ) // this structure is generated
INPUT_PORTS_END
// PR2076 CASH EXPLOSION CEXP SOUNDS CASH EXPLSION
-GAMEL( 200?, sc4cexpl ,0, sc4, sc4cexpl, sc4_state, sc4, ROT0, "Mazooma","Cash Explosion (PR2076) (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cexpla ,sc4cexpl, sc4, sc4cexpl, sc4_state, sc4, ROT0, "Mazooma","Cash Explosion (PR2076) (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cexplb ,sc4cexpl, sc4, sc4cexpl, sc4_state, sc4, ROT0, "Mazooma","Cash Explosion (PR2076) (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cexplc ,sc4cexpl, sc4, sc4cexpl, sc4_state, sc4, ROT0, "Mazooma","Cash Explosion (PR2076) (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cexplf ,sc4cexpl, sc4, sc4cexpl, sc4_state, sc4, ROT0, "Mazooma","Cash Explosion (PR2076) (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cexplg ,sc4cexpl, sc4, sc4cexpl, sc4_state, sc4, ROT0, "Mazooma","Cash Explosion (PR2076) (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cexpl ,0, sc4, sc4cexpl, sc4_state, sc4, ROT0, "Mazooma","Cash Explosion (PR2076) (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4cexpla ,sc4cexpl, sc4, sc4cexpl, sc4_state, sc4, ROT0, "Mazooma","Cash Explosion (PR2076) (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4cexplb ,sc4cexpl, sc4, sc4cexpl, sc4_state, sc4, ROT0, "Mazooma","Cash Explosion (PR2076) (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4cexplc ,sc4cexpl, sc4, sc4cexpl, sc4_state, sc4, ROT0, "Mazooma","Cash Explosion (PR2076) (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4cexplf ,sc4cexpl, sc4, sc4cexpl, sc4_state, sc4, ROT0, "Mazooma","Cash Explosion (PR2076) (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4cexplg ,sc4cexpl, sc4, sc4cexpl, sc4_state, sc4, ROT0, "Mazooma","Cash Explosion (PR2076) (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// PR2120 CASH EXPLOSION CEXP SOUNDS CASH EXPLSION
-GAMEL( 200?, sc4cexpld ,sc4cexpl, sc4, sc4cexpl, sc4_state, sc4, ROT0, "Mazooma","Cash Explosion (PR2120) (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cexple ,sc4cexpl, sc4, sc4cexpl, sc4_state, sc4, ROT0, "Mazooma","Cash Explosion (PR2120) (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cexpld ,sc4cexpl, sc4, sc4cexpl, sc4_state, sc4, ROT0, "Mazooma","Cash Explosion (PR2120) (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4cexple ,sc4cexpl, sc4, sc4cexpl, sc4_state, sc4, ROT0, "Mazooma","Cash Explosion (PR2120) (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// PR2062 CASINO ROYALE CROY SOUNDS CASINO ROYALE
-GAMEL( 200?, sc4casry ,0, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Casino Royale (PR2062) (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4casryc ,sc4casry, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Casino Royale (PR2062) (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4casry ,0, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Casino Royale (PR2062) (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4casryc ,sc4casry, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Casino Royale (PR2062) (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// PR2075 CASINO ROYALE DUCRV46 CROY CROY SOUNDS CASINO ROYALE (Jumping Bean copyright?)
-GAMEL( 200?, sc4casryd ,sc4casry, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Casino Royale (PR2075) (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4casrye ,sc4casry, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Casino Royale (PR2075) (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4casryd ,sc4casry, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Casino Royale (PR2075) (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4casrye ,sc4casry, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Casino Royale (PR2075) (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// I guess this isn't a fruit machine
INPUT_PORTS_START( sc4casrya ) // this structure is generated
@@ -46753,8 +46755,8 @@ INPUT_PORTS_START( sc4casrya ) // this structure is generated
INPUT_PORTS_END
// PR2073, CZECH CASINO ROYALE.......................CROY SOUNDS... (not standard header)
-GAMEL( 200?, sc4casrya ,sc4casry, sc4, sc4casrya, sc4_state, sc4, ROT0, "Mazooma","Casino Royale (PR2073) (Czech) (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4casryb ,sc4casry, sc4, sc4casrya, sc4_state, sc4, ROT0, "Mazooma","Casino Royale (PR2073) (Czech) (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4casrya ,sc4casry, sc4, sc4casrya, sc4_state, sc4, ROT0, "Mazooma","Casino Royale (PR2073) (Czech) (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4casryb ,sc4casry, sc4, sc4casrya, sc4_state, sc4, ROT0, "Mazooma","Casino Royale (PR2073) (Czech) (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
INPUT_PORTS_START( sc4clucl ) // this structure is generated
PORT_INCLUDE( sc4_base )
@@ -46814,8 +46816,8 @@ INPUT_PORTS_START( sc4clucl ) // this structure is generated
INPUT_PORTS_END
// PR2237 CLUB CLUEDO CLUB CLUEDO CLUB CCLU SOUNDS CLUB CLUEDO
-GAMEL( 200?, sc4clucl ,0, sc4, sc4clucl, sc4_state, sc4, ROT0, "Mazooma","Cluedo Club (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4clucla ,sc4clucl, sc4, sc4clucl, sc4_state, sc4, ROT0, "Mazooma","Cluedo Club (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4clucl ,0, sc4, sc4clucl, sc4_state, sc4, ROT0, "Mazooma","Cluedo Club (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4clucla ,sc4clucl, sc4, sc4clucl, sc4_state, sc4, ROT0, "Mazooma","Cluedo Club (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
INPUT_PORTS_START( sc4cyc ) // this structure is generated
PORT_INCLUDE( sc4_base )
@@ -46881,11 +46883,11 @@ INPUT_PORTS_END
// half size sound rom, or missing a rom
// PR2058 COUNT YER CASH PR2058 COUNT YER CASH SOUNDS11
-GAMEL( 200?, sc4cyc ,0, sc4, sc4cyc, sc4_state, sc4, ROT0, "Mazooma","Count Yer Cash (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cyca ,sc4cyc, sc4, sc4cyc, sc4_state, sc4, ROT0, "Mazooma","Count Yer Cash (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cycb ,sc4cyc, sc4, sc4cyc, sc4_state, sc4, ROT0, "Mazooma","Count Yer Cash (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cycc ,sc4cyc, sc4, sc4cyc, sc4_state, sc4, ROT0, "Mazooma","Count Yer Cash (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cycd ,sc4cyc, sc4, sc4cyc, sc4_state, sc4, ROT0, "Mazooma","Count Yer Cash (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cyc ,0, sc4, sc4cyc, sc4_state, sc4, ROT0, "Mazooma","Count Yer Cash (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4cyca ,sc4cyc, sc4, sc4cyc, sc4_state, sc4, ROT0, "Mazooma","Count Yer Cash (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4cycb ,sc4cyc, sc4, sc4cyc, sc4_state, sc4, ROT0, "Mazooma","Count Yer Cash (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4cycc ,sc4cyc, sc4, sc4cyc, sc4_state, sc4, ROT0, "Mazooma","Count Yer Cash (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4cycd ,sc4cyc, sc4, sc4cyc, sc4_state, sc4, ROT0, "Mazooma","Count Yer Cash (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
INPUT_PORTS_START( sc4cyccl ) // this structure is generated
PORT_INCLUDE( sc4_base )
@@ -46951,10 +46953,10 @@ INPUT_PORTS_END
// half size sound rom, or missing a rom
// PR2092 CLUB COUNT YER CASH COUNT YER CASH CLUB CLCC SOUNDS
-GAMEL( 200?, sc4cyccl ,0, sc4, sc4cyccl, sc4_state, sc4, ROT0, "Mazooma","Count Yer Cash Club (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cyccla ,sc4cyccl, sc4, sc4cyccl, sc4_state, sc4, ROT0, "Mazooma","Count Yer Cash Club (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cycclb ,sc4cyccl, sc4, sc4cyccl, sc4_state, sc4, ROT0, "Mazooma","Count Yer Cash Club (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cycclc ,sc4cyccl, sc4, sc4cyccl, sc4_state, sc4, ROT0, "Mazooma","Count Yer Cash Club (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cyccl ,0, sc4, sc4cyccl, sc4_state, sc4, ROT0, "Mazooma","Count Yer Cash Club (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4cyccla ,sc4cyccl, sc4, sc4cyccl, sc4_state, sc4, ROT0, "Mazooma","Count Yer Cash Club (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4cycclb ,sc4cyccl, sc4, sc4cyccl, sc4_state, sc4, ROT0, "Mazooma","Count Yer Cash Club (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4cycclc ,sc4cyccl, sc4, sc4cyccl, sc4_state, sc4, ROT0, "Mazooma","Count Yer Cash Club (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
INPUT_PORTS_START( sc4supst ) // this structure is generated
PORT_INCLUDE( sc4_base )
@@ -46998,8 +47000,8 @@ INPUT_PORTS_START( sc4supst ) // this structure is generated
INPUT_PORTS_END
// PR2206 STREAKX STRX SOUNDS SUPER STREAX
-GAMEL( 200?, sc4supst ,0, sc4, sc4supst, sc4_state, sc4, ROT0, "Mazooma","Super Streax (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4supsta ,sc4supst, sc4, sc4supst, sc4_state, sc4, ROT0, "Mazooma","Super Streax (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4supst ,0, sc4, sc4supst, sc4_state, sc4, ROT0, "Mazooma","Super Streax (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4supsta ,sc4supst, sc4, sc4supst, sc4_state, sc4, ROT0, "Mazooma","Super Streax (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
INPUT_PORTS_START( sc4sf ) // this structure is generated
PORT_INCLUDE( sc4_base )
@@ -47049,11 +47051,11 @@ INPUT_PORTS_START( sc4sf ) // this structure is generated
INPUT_PORTS_END
// NUMBER PR2024 STREET FIGHTER STRF SOUNDS STREET FIGHTER
-GAMEL( 200?, sc4sf ,0, sc4, sc4sf, sc4_state, sc4, ROT0, "Mazooma","Street Fighter (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4sfa ,sc4sf, sc4, sc4sf, sc4_state, sc4, ROT0, "Mazooma","Street Fighter (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4sfb ,sc4sf, sc4, sc4sf, sc4_state, sc4, ROT0, "Mazooma","Street Fighter (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4sfc ,sc4sf, sc4, sc4sf, sc4_state, sc4, ROT0, "Mazooma","Street Fighter (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4sfd ,sc4sf, sc4, sc4sf, sc4_state, sc4, ROT0, "Mazooma","Street Fighter (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4sf ,0, sc4, sc4sf, sc4_state, sc4, ROT0, "Mazooma","Street Fighter (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4sfa ,sc4sf, sc4, sc4sf, sc4_state, sc4, ROT0, "Mazooma","Street Fighter (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4sfb ,sc4sf, sc4, sc4sf, sc4_state, sc4, ROT0, "Mazooma","Street Fighter (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4sfc ,sc4sf, sc4, sc4sf, sc4_state, sc4, ROT0, "Mazooma","Street Fighter (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4sfd ,sc4sf, sc4, sc4sf, sc4_state, sc4, ROT0, "Mazooma","Street Fighter (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
INPUT_PORTS_START( sc4hyde ) // this structure is generated
PORT_INCLUDE( sc4_base )
@@ -47106,10 +47108,10 @@ INPUT_PORTS_START( sc4hyde ) // this structure is generated
INPUT_PORTS_END
// PR2036 HYDE & STREAK HYDE SOUNDS HYDE & STREAK
-GAMEL( 200?, sc4hyde ,0, sc4, sc4hyde, sc4_state, sc4, ROT0, "Mazooma","Hyde & Streak (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hydea ,sc4hyde, sc4, sc4hyde, sc4_state, sc4, ROT0, "Mazooma","Hyde & Streak (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hydeb ,sc4hyde, sc4, sc4hyde, sc4_state, sc4, ROT0, "Mazooma","Hyde & Streak (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hydec ,sc4hyde, sc4, sc4hyde, sc4_state, sc4, ROT0, "Mazooma","Hyde & Streak (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4hyde ,0, sc4, sc4hyde, sc4_state, sc4, ROT0, "Mazooma","Hyde & Streak (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4hydea ,sc4hyde, sc4, sc4hyde, sc4_state, sc4, ROT0, "Mazooma","Hyde & Streak (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4hydeb ,sc4hyde, sc4, sc4hyde, sc4_state, sc4, ROT0, "Mazooma","Hyde & Streak (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4hydec ,sc4hyde, sc4, sc4hyde, sc4_state, sc4, ROT0, "Mazooma","Hyde & Streak (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
INPUT_PORTS_START( sc4rtclb ) // this structure is generated
PORT_INCLUDE( sc4_base )
@@ -47176,19 +47178,19 @@ INPUT_PORTS_START( sc4rtclb ) // this structure is generated
INPUT_PORTS_END
// PR2051 CLUB ROLLING THUNDER CLRT SOUNDS ROLLING THUNDER
-GAMEL( 200?, sc4rtclb ,0, sc4, sc4rtclb, sc4_state, sc4, ROT0, "Mazooma","Rolling Thunder Club (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rtclba ,sc4rtclb, sc4, sc4rtclb, sc4_state, sc4, ROT0, "Mazooma","Rolling Thunder Club (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4rtclb ,0, sc4, sc4rtclb, sc4_state, sc4, ROT0, "Mazooma","Rolling Thunder Club (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4rtclba ,sc4rtclb, sc4, sc4rtclb, sc4_state, sc4, ROT0, "Mazooma","Rolling Thunder Club (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// doesn't like the sound roms we have (WILDJACK SOUNDS)
// PR0000 WILD JACKPOTS WJPT SOUNDS WILD JACKPOTS
-GAMEL( 200?, sc4wldjk ,0, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Wild Jackpots (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wldjka ,sc4wldjk, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Wild Jackpots (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wldjkb ,sc4wldjk, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Wild Jackpots (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wldjkc ,sc4wldjk, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Wild Jackpots (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wldjkd ,sc4wldjk, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Wild Jackpots (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wldjke ,sc4wldjk, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Wild Jackpots (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wldjkf ,sc4wldjk, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Wild Jackpots (Mazooma) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wldjkg ,sc4wldjk, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Wild Jackpots (Mazooma) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4wldjk ,0, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Wild Jackpots (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4wldjka ,sc4wldjk, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Wild Jackpots (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4wldjkb ,sc4wldjk, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Wild Jackpots (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4wldjkc ,sc4wldjk, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Wild Jackpots (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4wldjkd ,sc4wldjk, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Wild Jackpots (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4wldjke ,sc4wldjk, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Wild Jackpots (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4wldjkf ,sc4wldjk, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Wild Jackpots (Mazooma) (Scorpion 4) (set 7)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4wldjkg ,sc4wldjk, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Wild Jackpots (Mazooma) (Scorpion 4) (set 8)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// only sc4jive has this structure intact
INPUT_PORTS_START( sc4jive ) // this structure is generated
@@ -47239,12 +47241,12 @@ INPUT_PORTS_START( sc4jive ) // this structure is generated
INPUT_PORTS_END
// PR2096 JIVE MONEY JIVE SOUNDS JIVE MONEY
-GAMEL( 200?, sc4jive ,0, sc4, sc4jive, sc4_state, sc4, ROT0, "Mazooma","Jive Money (PR2096) (Mazooma) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4jive ,0, sc4, sc4jive, sc4_state, sc4, ROT0, "Mazooma","Jive Money (PR2096) (Mazooma) (Scorpion 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// PR2160 JIVE MONEY JMON SOUNDS JIVE MONEY
-GAMEL( 200?, sc4jivea ,sc4jive, sc4, sc4jive, sc4_state, sc4, ROT0, "Mazooma","Jive Money (PR2160) (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4jiveb ,sc4jive, sc4, sc4jive, sc4_state, sc4, ROT0, "Mazooma","Jive Money (PR2160) (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4jivec ,sc4jive, sc4, sc4jive, sc4_state, sc4, ROT0, "Mazooma","Jive Money (PR2160) (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4jived ,sc4jive, sc4, sc4jive, sc4_state, sc4, ROT0, "Mazooma","Jive Money (PR2160) (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4jivea ,sc4jive, sc4, sc4jive, sc4_state, sc4, ROT0, "Mazooma","Jive Money (PR2160) (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4jiveb ,sc4jive, sc4, sc4jive, sc4_state, sc4, ROT0, "Mazooma","Jive Money (PR2160) (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4jivec ,sc4jive, sc4, sc4jive, sc4_state, sc4, ROT0, "Mazooma","Jive Money (PR2160) (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4jived ,sc4jive, sc4, sc4jive, sc4_state, sc4, ROT0, "Mazooma","Jive Money (PR2160) (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
INPUT_PORTS_START( sc4mclb ) // this structure is generated
PORT_INCLUDE( sc4_base )
@@ -47305,12 +47307,12 @@ INPUT_PORTS_END
// no sound roms
// PR2164 CLUB MONOPOLY CLB MONOPOLY WOW CLUB CWOW SOUNDS CLUB MONOPOLOY
-GAMEL( 200?, sc4mclb ,0, sc4, sc4mclb, sc4_state, sc4, ROT0, "Mazooma","Monopoly Club (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mclba ,sc4mclb, sc4, sc4mclb, sc4_state, sc4, ROT0, "Mazooma","Monopoly Club (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mclbb ,sc4mclb, sc4, sc4mclb, sc4_state, sc4, ROT0, "Mazooma","Monopoly Club (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mclbc ,sc4mclb, sc4, sc4mclb, sc4_state, sc4, ROT0, "Mazooma","Monopoly Club (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mclbd ,sc4mclb, sc4, sc4mclb, sc4_state, sc4, ROT0, "Mazooma","Monopoly Club (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mclbe ,sc4mclb, sc4, sc4mclb, sc4_state, sc4, ROT0, "Mazooma","Monopoly Club (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4mclb ,0, sc4, sc4mclb, sc4_state, sc4, ROT0, "Mazooma","Monopoly Club (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4mclba ,sc4mclb, sc4, sc4mclb, sc4_state, sc4, ROT0, "Mazooma","Monopoly Club (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4mclbb ,sc4mclb, sc4, sc4mclb, sc4_state, sc4, ROT0, "Mazooma","Monopoly Club (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4mclbc ,sc4mclb, sc4, sc4mclb, sc4_state, sc4, ROT0, "Mazooma","Monopoly Club (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4mclbd ,sc4mclb, sc4, sc4mclb, sc4_state, sc4, ROT0, "Mazooma","Monopoly Club (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4mclbe ,sc4mclb, sc4, sc4mclb, sc4_state, sc4, ROT0, "Mazooma","Monopoly Club (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
INPUT_PORTS_START( sc4monot ) // this structure is generated
@@ -47353,10 +47355,10 @@ INPUT_PORTS_START( sc4monot ) // this structure is generated
// 0x0010 - "deflt" // standard input (expected here)
INPUT_PORTS_END
-GAMEL( 200?, sc4monot ,0, sc4, sc4monot, sc4_state, sc4, ROT0, "Mazooma","Monopoly TTT (PR2133) (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // PR2133MONOPOLY TTT MONOPOLY TTT MAZ MONL SOUNDS MONOPOLY
-GAMEL( 200?, sc4monota ,sc4monot, sc4, sc4monot, sc4_state, sc4, ROT0, "Mazooma","Monopoly TTT (PR2133) (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // ^^
-GAMEL( 200?, sc4monotb ,sc4monot, sc4, sc4monot, sc4_state, sc4, ROT0, "Mazooma","Monopoly TTT (PR2133) (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // ^^
-GAMEL( 200?, sc4monotc ,sc4monot, sc4, sc4monot, sc4_state, sc4, ROT0, "Mazooma","Monopoly TTT (PR2133) (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // PR2133MONOPOLY TTT MONOPOLY TTT ARCADE MONL SOUNDS MONOPOLY
+GAMEL( 200?, sc4monot ,0, sc4, sc4monot, sc4_state, sc4, ROT0, "Mazooma","Monopoly TTT (PR2133) (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 ) // PR2133MONOPOLY TTT MONOPOLY TTT MAZ MONL SOUNDS MONOPOLY
+GAMEL( 200?, sc4monota ,sc4monot, sc4, sc4monot, sc4_state, sc4, ROT0, "Mazooma","Monopoly TTT (PR2133) (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 ) // ^^
+GAMEL( 200?, sc4monotb ,sc4monot, sc4, sc4monot, sc4_state, sc4, ROT0, "Mazooma","Monopoly TTT (PR2133) (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 ) // ^^
+GAMEL( 200?, sc4monotc ,sc4monot, sc4, sc4monot, sc4_state, sc4, ROT0, "Mazooma","Monopoly TTT (PR2133) (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 ) // PR2133MONOPOLY TTT MONOPOLY TTT ARCADE MONL SOUNDS MONOPOLY
INPUT_PORTS_START( sc4r2r ) // this structure is generated
PORT_INCLUDE( sc4_base )
@@ -47410,10 +47412,10 @@ INPUT_PORTS_START( sc4r2r ) // this structure is generated
INPUT_PORTS_END
// PR2037 REEL TO REEL RTOR SOUNDS REEL 2 REEL
-GAMEL( 200?, sc4r2r ,0, sc4, sc4r2r, sc4_state, sc4, ROT0, "Mazooma","Reel To Reel (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4r2ra ,sc4r2r, sc4, sc4r2r, sc4_state, sc4, ROT0, "Mazooma","Reel To Reel (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4r2rb ,sc4r2r, sc4, sc4r2r, sc4_state, sc4, ROT0, "Mazooma","Reel To Reel (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4r2rc ,sc4r2r, sc4, sc4r2r, sc4_state, sc4, ROT0, "Mazooma","Reel To Reel (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4r2r ,0, sc4, sc4r2r, sc4_state, sc4, ROT0, "Mazooma","Reel To Reel (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4r2ra ,sc4r2r, sc4, sc4r2r, sc4_state, sc4, ROT0, "Mazooma","Reel To Reel (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4r2rb ,sc4r2r, sc4, sc4r2r, sc4_state, sc4, ROT0, "Mazooma","Reel To Reel (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4r2rc ,sc4r2r, sc4, sc4r2r, sc4_state, sc4, ROT0, "Mazooma","Reel To Reel (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
INPUT_PORTS_START( sc4revo ) // this structure is generated
PORT_INCLUDE( sc4_base )
@@ -47466,12 +47468,12 @@ INPUT_PORTS_START( sc4revo ) // this structure is generated
INPUT_PORTS_END
// PR2020 REVOLVER REV SOUNDS REVOLVER
-GAMEL( 200?, sc4revo ,0, sc4, sc4revo, sc4_state, sc4, ROT0, "Mazooma","Revolver (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4revoa ,sc4revo, sc4, sc4revo, sc4_state, sc4, ROT0, "Mazooma","Revolver (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4revob ,sc4revo, sc4, sc4revo, sc4_state, sc4, ROT0, "Mazooma","Revolver (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4revoc ,sc4revo, sc4, sc4revo, sc4_state, sc4, ROT0, "Mazooma","Revolver (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4revod ,sc4revo, sc4, sc4revo, sc4_state, sc4, ROT0, "Mazooma","Revolver (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4revoe ,sc4revo, sc4, sc4revo, sc4_state, sc4, ROT0, "Mazooma","Revolver (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4revo ,0, sc4, sc4revo, sc4_state, sc4, ROT0, "Mazooma","Revolver (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4revoa ,sc4revo, sc4, sc4revo, sc4_state, sc4, ROT0, "Mazooma","Revolver (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4revob ,sc4revo, sc4, sc4revo, sc4_state, sc4, ROT0, "Mazooma","Revolver (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4revoc ,sc4revo, sc4, sc4revo, sc4_state, sc4, ROT0, "Mazooma","Revolver (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4revod ,sc4revo, sc4, sc4revo, sc4_state, sc4, ROT0, "Mazooma","Revolver (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4revoe ,sc4revo, sc4, sc4revo, sc4_state, sc4, ROT0, "Mazooma","Revolver (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
INPUT_PORTS_START( sc4slih ) // this structure is generated
PORT_INCLUDE( sc4_base )
@@ -47521,12 +47523,12 @@ INPUT_PORTS_END
// half size sound roms
// PR2145 SOME LIKE IT HOT SLIH SOUNDS SOME LIKE IT HOT
-GAMEL( 200?, sc4slih ,0, sc4, sc4slih, sc4_state, sc4, ROT0, "Mazooma","Some Like It Hot (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4sliha ,sc4slih, sc4, sc4slih, sc4_state, sc4, ROT0, "Mazooma","Some Like It Hot (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4slihb ,sc4slih, sc4, sc4slih, sc4_state, sc4, ROT0, "Mazooma","Some Like It Hot (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4slihc ,sc4slih, sc4, sc4slih, sc4_state, sc4, ROT0, "Mazooma","Some Like It Hot (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4slihd ,sc4slih, sc4, sc4slih, sc4_state, sc4, ROT0, "Mazooma","Some Like It Hot (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4slihe ,sc4slih, sc4, sc4slih, sc4_state, sc4, ROT0, "Mazooma","Some Like It Hot (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4slih ,0, sc4, sc4slih, sc4_state, sc4, ROT0, "Mazooma","Some Like It Hot (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4sliha ,sc4slih, sc4, sc4slih, sc4_state, sc4, ROT0, "Mazooma","Some Like It Hot (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4slihb ,sc4slih, sc4, sc4slih, sc4_state, sc4, ROT0, "Mazooma","Some Like It Hot (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4slihc ,sc4slih, sc4, sc4slih, sc4_state, sc4, ROT0, "Mazooma","Some Like It Hot (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4slihd ,sc4slih, sc4, sc4slih, sc4_state, sc4, ROT0, "Mazooma","Some Like It Hot (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4slihe ,sc4slih, sc4, sc4slih, sc4_state, sc4, ROT0, "Mazooma","Some Like It Hot (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
INPUT_PORTS_START( sc4gcb ) // this structure is generated
PORT_INCLUDE( sc4_base )
@@ -47581,17 +47583,17 @@ INPUT_PORTS_END
// no sound roms
// PR2125 GRAND BLASTER CASH GRAN SOUNDS GRAND BLASTER
-GAMEL( 200?, sc4gcb ,0, sc4, sc4gcb, sc4_state, sc4, ROT0, "Mazooma","Grand Blaster Cash (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gcba ,sc4gcb, sc4, sc4gcb, sc4_state, sc4, ROT0, "Mazooma","Grand Blaster Cash (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gcbb ,sc4gcb, sc4, sc4gcb, sc4_state, sc4, ROT0, "Mazooma","Grand Blaster Cash (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gcbc ,sc4gcb, sc4, sc4gcb, sc4_state, sc4, ROT0, "Mazooma","Grand Blaster Cash (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gcbd ,sc4gcb, sc4, sc4gcb, sc4_state, sc4, ROT0, "Mazooma","Grand Blaster Cash (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gcbe ,sc4gcb, sc4, sc4gcb, sc4_state, sc4, ROT0, "Mazooma","Grand Blaster Cash (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gcbf ,sc4gcb, sc4, sc4gcb, sc4_state, sc4, ROT0, "Mazooma","Grand Blaster Cash (Mazooma) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gcbg ,sc4gcb, sc4, sc4gcb, sc4_state, sc4, ROT0, "Mazooma","Grand Blaster Cash (Mazooma) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gcbh ,sc4gcb, sc4, sc4gcb, sc4_state, sc4, ROT0, "Mazooma","Grand Blaster Cash (Mazooma) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gcbi ,sc4gcb, sc4, sc4gcb, sc4_state, sc4, ROT0, "Mazooma","Grand Blaster Cash (Mazooma) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gcbj ,sc4gcb, sc4, sc4gcb, sc4_state, sc4, ROT0, "Mazooma","Grand Blaster Cash (Mazooma) (Scorpion 4) (set 11)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4gcb ,0, sc4, sc4gcb, sc4_state, sc4, ROT0, "Mazooma","Grand Blaster Cash (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gcba ,sc4gcb, sc4, sc4gcb, sc4_state, sc4, ROT0, "Mazooma","Grand Blaster Cash (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gcbb ,sc4gcb, sc4, sc4gcb, sc4_state, sc4, ROT0, "Mazooma","Grand Blaster Cash (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gcbc ,sc4gcb, sc4, sc4gcb, sc4_state, sc4, ROT0, "Mazooma","Grand Blaster Cash (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gcbd ,sc4gcb, sc4, sc4gcb, sc4_state, sc4, ROT0, "Mazooma","Grand Blaster Cash (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gcbe ,sc4gcb, sc4, sc4gcb, sc4_state, sc4, ROT0, "Mazooma","Grand Blaster Cash (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gcbf ,sc4gcb, sc4, sc4gcb, sc4_state, sc4, ROT0, "Mazooma","Grand Blaster Cash (Mazooma) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gcbg ,sc4gcb, sc4, sc4gcb, sc4_state, sc4, ROT0, "Mazooma","Grand Blaster Cash (Mazooma) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gcbh ,sc4gcb, sc4, sc4gcb, sc4_state, sc4, ROT0, "Mazooma","Grand Blaster Cash (Mazooma) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gcbi ,sc4gcb, sc4, sc4gcb, sc4_state, sc4, ROT0, "Mazooma","Grand Blaster Cash (Mazooma) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gcbj ,sc4gcb, sc4, sc4gcb, sc4_state, sc4, ROT0, "Mazooma","Grand Blaster Cash (Mazooma) (Scorpion 4) (set 11)", MACHINE_FLAGS, layout_bfm_sc4 )
/****************************************************************************************************************************************************************************************************************/
@@ -47614,12 +47616,12 @@ DRIVER_INIT_MEMBER(sc4_state,sc4spark)
// PR6912 SOUTH PARK PR6912 SOUTH PARK SOUNDS11 SOUTH PARK
-GAMEL( 200?, sc4spark ,0, sc4_4reel, sc4, sc4_state, sc4spark, ROT0, "BFM","South Park (BFM) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4sparka ,sc4spark, sc4_4reel, sc4, sc4_state, sc4spark, ROT0, "BFM","South Park (BFM) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4sparkb ,sc4spark, sc4_4reel, sc4, sc4_state, sc4spark, ROT0, "BFM","South Park (BFM) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4sparkc ,sc4spark, sc4_4reel, sc4, sc4_state, sc4spark, ROT0, "BFM","South Park (BFM) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4sparkd ,sc4spark, sc4_4reel, sc4, sc4_state, sc4spark, ROT0, "BFM","South Park (BFM) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4sparke ,sc4spark, sc4_4reel, sc4, sc4_state, sc4spark, ROT0, "BFM","South Park (BFM) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4spark ,0, sc4_4reel, sc4, sc4_state, sc4spark, ROT0, "BFM","South Park (BFM) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4sparka ,sc4spark, sc4_4reel, sc4, sc4_state, sc4spark, ROT0, "BFM","South Park (BFM) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4sparkb ,sc4spark, sc4_4reel, sc4, sc4_state, sc4spark, ROT0, "BFM","South Park (BFM) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4sparkc ,sc4spark, sc4_4reel, sc4, sc4_state, sc4spark, ROT0, "BFM","South Park (BFM) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4sparkd ,sc4spark, sc4_4reel, sc4, sc4_state, sc4spark, ROT0, "BFM","South Park (BFM) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4sparke ,sc4spark, sc4_4reel, sc4, sc4_state, sc4spark, ROT0, "BFM","South Park (BFM) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -47630,10 +47632,10 @@ DRIVER_INIT_MEMBER(sc4_state,sc4brkfs)
// PR6910 BIG BREAKFAST PR6910 BRKF SOUNDS11 BIG BREAKFAST
-GAMEL( 200?, sc4brkfs ,0, sc4_4reel, sc4, sc4_state, sc4brkfs, ROT0, "BFM","The Big Breakfast (BFM) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4brkfsa ,sc4brkfs, sc4_4reel, sc4, sc4_state, sc4brkfs, ROT0, "BFM","The Big Breakfast (BFM) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4brkfsb ,sc4brkfs, sc4_4reel, sc4, sc4_state, sc4brkfs, ROT0, "BFM","The Big Breakfast (BFM) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4brkfsc ,sc4brkfs, sc4_4reel, sc4, sc4_state, sc4brkfs, ROT0, "BFM","The Big Breakfast (BFM) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4brkfs ,0, sc4_4reel, sc4, sc4_state, sc4brkfs, ROT0, "BFM","The Big Breakfast (BFM) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4brkfsa ,sc4brkfs, sc4_4reel, sc4, sc4_state, sc4brkfs, ROT0, "BFM","The Big Breakfast (BFM) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4brkfsb ,sc4brkfs, sc4_4reel, sc4, sc4_state, sc4brkfs, ROT0, "BFM","The Big Breakfast (BFM) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4brkfsc ,sc4brkfs, sc4_4reel, sc4, sc4_state, sc4brkfs, ROT0, "BFM","The Big Breakfast (BFM) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -47643,13 +47645,13 @@ DRIVER_INIT_MEMBER(sc4_state,sc4gslam)
}
// PR6934 GRAND SLAM PR6934 SLM2 SOUNDS11 GRAND SLAM
-GAMEL( 200?, sc4gslam ,0, sc4, sc4, sc4_state, sc4gslam, ROT0, "BFM","Grandslam Club (BFM) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gslama ,sc4gslam, sc4, sc4, sc4_state, sc4gslam, ROT0, "BFM","Grandslam Club (BFM) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gslamb ,sc4gslam, sc4, sc4, sc4_state, sc4gslam, ROT0, "BFM","Grandslam Club (BFM) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gslamc ,sc4gslam, sc4, sc4, sc4_state, sc4gslam, ROT0, "BFM","Grandslam Club (BFM) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gslamd ,sc4gslam, sc4, sc4, sc4_state, sc4gslam, ROT0, "BFM","Grandslam Club (BFM) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gslame ,sc4gslam, sc4, sc4, sc4_state, sc4gslam, ROT0, "BFM","Grandslam Club (BFM) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gslamf ,sc4gslam, sc4, sc4, sc4_state, sc4gslam, ROT0, "BFM","Grandslam Club (BFM) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4gslam ,0, sc4, sc4, sc4_state, sc4gslam, ROT0, "BFM","Grandslam Club (BFM) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gslama ,sc4gslam, sc4, sc4, sc4_state, sc4gslam, ROT0, "BFM","Grandslam Club (BFM) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gslamb ,sc4gslam, sc4, sc4, sc4_state, sc4gslam, ROT0, "BFM","Grandslam Club (BFM) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gslamc ,sc4gslam, sc4, sc4, sc4_state, sc4gslam, ROT0, "BFM","Grandslam Club (BFM) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gslamd ,sc4gslam, sc4, sc4, sc4_state, sc4gslam, ROT0, "BFM","Grandslam Club (BFM) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gslame ,sc4gslam, sc4, sc4, sc4_state, sc4gslam, ROT0, "BFM","Grandslam Club (BFM) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gslamf ,sc4gslam, sc4, sc4, sc4_state, sc4gslam, ROT0, "BFM","Grandslam Club (BFM) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -47661,10 +47663,10 @@ DRIVER_INIT_MEMBER(sc4_state,sc4canca)
}
// PR7017CASINO CAN CAN CASH PR7017,Casino CAN CAN CASH, LINE SOUNDS CAN CAN CASH
-GAMEL( 200?, sc4canca ,0, sc4_4reel, sc4, sc4_state, sc4canca, ROT0, "Mazooma","Can Can Cash Casino (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cancaa ,sc4canca, sc4_4reel, sc4, sc4_state, sc4canca, ROT0, "Mazooma","Can Can Cash Casino (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cancab ,sc4canca, sc4_4reel, sc4, sc4_state, sc4canca, ROT0, "Mazooma","Can Can Cash Casino (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cancac ,sc4canca, sc4_4reel, sc4, sc4_state, sc4canca, ROT0, "Mazooma","Can Can Cash Casino (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4canca ,0, sc4_4reel, sc4, sc4_state, sc4canca, ROT0, "Mazooma","Can Can Cash Casino (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cancaa ,sc4canca, sc4_4reel, sc4, sc4_state, sc4canca, ROT0, "Mazooma","Can Can Cash Casino (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cancab ,sc4canca, sc4_4reel, sc4, sc4_state, sc4canca, ROT0, "Mazooma","Can Can Cash Casino (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cancac ,sc4canca, sc4_4reel, sc4, sc4_state, sc4canca, ROT0, "Mazooma","Can Can Cash Casino (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -47674,17 +47676,17 @@ DRIVER_INIT_MEMBER(sc4_state,sc4hotpr)
}
// PR6911 HOT PROPERTY PR6911 HOT PROPERTY SOUNDS11 HOT PROPERTY
-GAMEL( 200?, sc4hotpr ,0, sc4_4reel, sc4, sc4_state, sc4hotpr, ROT0, "BFM", "Hot Property (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hotprb ,sc4hotpr, sc4_4reel, sc4, sc4_state, sc4hotpr, ROT0, "BFM", "Hot Property (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hotprd ,sc4hotpr, sc4_4reel, sc4, sc4_state, sc4hotpr, ROT0, "BFM", "Hot Property (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hotpre ,sc4hotpr, sc4_4reel, sc4, sc4_state, sc4hotpr, ROT0, "BFM", "Hot Property (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hotpra ,sc4hotpr, sc4_4reel, sc4, sc4_state, sc4hotpr, ROT0, "BFM / Whitbread", "Hot Property (Bellfruit) (Scorpion 4) (Whitbread, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hotprc ,sc4hotpr, sc4_4reel, sc4, sc4_state, sc4hotpr, ROT0, "BFM / Whitbread", "Hot Property (Bellfruit) (Scorpion 4) (Whitbread, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4hotpr ,0, sc4_4reel, sc4, sc4_state, sc4hotpr, ROT0, "BFM", "Hot Property (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hotprb ,sc4hotpr, sc4_4reel, sc4, sc4_state, sc4hotpr, ROT0, "BFM", "Hot Property (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hotprd ,sc4hotpr, sc4_4reel, sc4, sc4_state, sc4hotpr, ROT0, "BFM", "Hot Property (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hotpre ,sc4hotpr, sc4_4reel, sc4, sc4_state, sc4hotpr, ROT0, "BFM", "Hot Property (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hotpra ,sc4hotpr, sc4_4reel, sc4, sc4_state, sc4hotpr, ROT0, "BFM / Whitbread", "Hot Property (Bellfruit) (Scorpion 4) (Whitbread, set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hotprc ,sc4hotpr, sc4_4reel, sc4, sc4_state, sc4hotpr, ROT0, "BFM / Whitbread", "Hot Property (Bellfruit) (Scorpion 4) (Whitbread, set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// is this some kind of reworked / licensed version of Hot Property?
// PR6911 HOT PROPERTY PR6911 HOT PROPERTY SOUNDS11 $$ CASH 'N' BURN
-GAMEL( 200?, sc4cburn ,sc4hotpr, sc4_4reel, sc4, sc4_state, sc4hotpr, ROT0, "Qps","Cash 'n' Burn (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cburn ,sc4hotpr, sc4_4reel, sc4, sc4_state, sc4hotpr, ROT0, "Qps","Cash 'n' Burn (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR6911 HOT PROPERTY V4.0 PR6911 HOT PROPERTY SOUNDS11 $ CASH 'N' BURN
-GAMEL( 200?, sc4cburna ,sc4hotpr, sc4_4reel, sc4, sc4_state, sc4hotpr, ROT0, "Qps","Cash 'n' Burn (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cburna ,sc4hotpr, sc4_4reel, sc4, sc4_state, sc4hotpr, ROT0, "Qps","Cash 'n' Burn (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -47696,17 +47698,17 @@ DRIVER_INIT_MEMBER(sc4_state,sc4cnfr)
// PR6815 CASH N FRUIT PR6815 CASH N FRUIT SOUNDS11
-GAMEL( 200?, sc4cnfr ,0, sc4_4reel, sc4, sc4_state, sc4cnfr, ROT0, "BFM","Cash 'n' Fruit (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cnfra ,sc4cnfr, sc4_4reel, sc4, sc4_state, sc4cnfr, ROT0, "BFM","Cash 'n' Fruit (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cnfrb ,sc4cnfr, sc4_4reel, sc4, sc4_state, sc4cnfr, ROT0, "BFM","Cash 'n' Fruit (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cnfre ,sc4cnfr, sc4_4reel, sc4, sc4_state, sc4cnfr, ROT0, "BFM","Cash 'n' Fruit (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cnfrf ,sc4cnfr, sc4_4reel, sc4, sc4_state, sc4cnfr, ROT0, "BFM","Cash 'n' Fruit (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cnfrg ,sc4cnfr, sc4_4reel, sc4, sc4_state, sc4cnfr, ROT0, "BFM","Cash 'n' Fruit (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cnfr ,0, sc4_4reel, sc4, sc4_state, sc4cnfr, ROT0, "BFM","Cash 'n' Fruit (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cnfra ,sc4cnfr, sc4_4reel, sc4, sc4_state, sc4cnfr, ROT0, "BFM","Cash 'n' Fruit (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cnfrb ,sc4cnfr, sc4_4reel, sc4, sc4_state, sc4cnfr, ROT0, "BFM","Cash 'n' Fruit (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cnfre ,sc4cnfr, sc4_4reel, sc4, sc4_state, sc4cnfr, ROT0, "BFM","Cash 'n' Fruit (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cnfrf ,sc4cnfr, sc4_4reel, sc4, sc4_state, sc4cnfr, ROT0, "BFM","Cash 'n' Fruit (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cnfrg ,sc4cnfr, sc4_4reel, sc4, sc4_state, sc4cnfr, ROT0, "BFM","Cash 'n' Fruit (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR4615 CASH N FRUIT S+P98 PR6815 CASH N FRUIT SOUNDS11
-GAMEL( 200?, sc4cnfrc ,sc4cnfr, sc4_4reel, sc4, sc4_state, sc4cnfr, ROT0, "BFM","Cash 'n' Fruit S+P98 (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cnfrd ,sc4cnfr, sc4_4reel, sc4, sc4_state, sc4cnfr, ROT0, "BFM","Cash 'n' Fruit S+P98 (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cnfrh ,sc4cnfr, sc4_4reel, sc4, sc4_state, sc4cnfr, ROT0, "BFM","Cash 'n' Fruit S+P98 (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cnfri ,sc4cnfr, sc4_4reel, sc4, sc4_state, sc4cnfr, ROT0, "BFM","Cash 'n' Fruit S+P98 (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cnfrc ,sc4cnfr, sc4_4reel, sc4, sc4_state, sc4cnfr, ROT0, "BFM","Cash 'n' Fruit S+P98 (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cnfrd ,sc4cnfr, sc4_4reel, sc4, sc4_state, sc4cnfr, ROT0, "BFM","Cash 'n' Fruit S+P98 (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cnfrh ,sc4cnfr, sc4_4reel, sc4, sc4_state, sc4cnfr, ROT0, "BFM","Cash 'n' Fruit S+P98 (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cnfri ,sc4cnfr, sc4_4reel, sc4, sc4_state, sc4cnfr, ROT0, "BFM","Cash 'n' Fruit S+P98 (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -47716,10 +47718,10 @@ DRIVER_INIT_MEMBER(sc4_state,sc4cla7)
}
// PR2111 CLASSIC 7'S CLASS SOUNDS CLASSIC 7'S
-GAMEL( 200?, sc4cla7 ,0, sc4_200_altb, sc4, sc4_state, sc4cla7, ROT0, "Mazooma","Classic 7s (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cla7a ,sc4cla7, sc4_200_altb, sc4, sc4_state, sc4cla7, ROT0, "Mazooma","Classic 7s (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cla7b ,sc4cla7, sc4_200_altb, sc4, sc4_state, sc4cla7, ROT0, "Mazooma","Classic 7s (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cla7c ,sc4cla7, sc4_200_altb, sc4, sc4_state, sc4cla7, ROT0, "Mazooma","Classic 7s (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cla7 ,0, sc4_200_altb, sc4, sc4_state, sc4cla7, ROT0, "Mazooma","Classic 7s (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cla7a ,sc4cla7, sc4_200_altb, sc4, sc4_state, sc4cla7, ROT0, "Mazooma","Classic 7s (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cla7b ,sc4cla7, sc4_200_altb, sc4, sc4_state, sc4cla7, ROT0, "Mazooma","Classic 7s (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cla7c ,sc4cla7, sc4_200_altb, sc4, sc4_state, sc4cla7, ROT0, "Mazooma","Classic 7s (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4cclas)
@@ -47733,40 +47735,40 @@ DRIVER_INIT_MEMBER(sc4_state,sc4cclas_mbus)
}
// PR7148 CLUB CLASS PR7148 CLUB CLASS SOUNDS11 CLUB CLASS
-GAMEL( 200?, sc4cclas ,0, sc4, sc4, sc4_state, sc4cclas, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cclasa ,sc4cclas, sc4, sc4, sc4_state, sc4cclas, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cclasb ,sc4cclas, sc4, sc4, sc4_state, sc4cclas, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cclasc ,sc4cclas, sc4, sc4, sc4_state, sc4cclas, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cclasd ,sc4cclas, sc4, sc4, sc4_state, sc4cclas, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cclasf ,sc4cclas, sc4, sc4, sc4_state, sc4cclas, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cclasi ,sc4cclas, sc4, sc4, sc4_state, sc4cclas, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cclasj ,sc4cclas, sc4, sc4, sc4_state, sc4cclas, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cclask ,sc4cclas, sc4, sc4, sc4_state, sc4cclas, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cclasl ,sc4cclas, sc4, sc4, sc4_state, sc4cclas, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cclasm ,sc4cclas, sc4, sc4, sc4_state, sc4cclas, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 11)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cclasn ,sc4cclas, sc4, sc4, sc4_state, sc4cclas, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 12)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cclaso ,sc4cclas, sc4, sc4, sc4_state, sc4cclas, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 13)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cclasq ,sc4cclas, sc4, sc4, sc4_state, sc4cclas, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 14)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cclasr ,sc4cclas, sc4, sc4, sc4_state, sc4cclas, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 15)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cclass ,sc4cclas, sc4, sc4, sc4_state, sc4cclas, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 16)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cclast ,sc4cclas, sc4, sc4, sc4_state, sc4cclas, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 17)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cclasu ,sc4cclas, sc4, sc4, sc4_state, sc4cclas, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 18)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cclasv ,sc4cclas, sc4, sc4, sc4_state, sc4cclas, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 19)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cclasw ,sc4cclas, sc4, sc4, sc4_state, sc4cclas, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 20)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cclas ,0, sc4, sc4, sc4_state, sc4cclas, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cclasa ,sc4cclas, sc4, sc4, sc4_state, sc4cclas, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cclasb ,sc4cclas, sc4, sc4, sc4_state, sc4cclas, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cclasc ,sc4cclas, sc4, sc4, sc4_state, sc4cclas, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cclasd ,sc4cclas, sc4, sc4, sc4_state, sc4cclas, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cclasf ,sc4cclas, sc4, sc4, sc4_state, sc4cclas, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cclasi ,sc4cclas, sc4, sc4, sc4_state, sc4cclas, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cclasj ,sc4cclas, sc4, sc4, sc4_state, sc4cclas, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cclask ,sc4cclas, sc4, sc4, sc4_state, sc4cclas, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cclasl ,sc4cclas, sc4, sc4, sc4_state, sc4cclas, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cclasm ,sc4cclas, sc4, sc4, sc4_state, sc4cclas, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 11)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cclasn ,sc4cclas, sc4, sc4, sc4_state, sc4cclas, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 12)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cclaso ,sc4cclas, sc4, sc4, sc4_state, sc4cclas, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 13)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cclasq ,sc4cclas, sc4, sc4, sc4_state, sc4cclas, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 14)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cclasr ,sc4cclas, sc4, sc4, sc4_state, sc4cclas, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 15)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cclass ,sc4cclas, sc4, sc4, sc4_state, sc4cclas, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 16)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cclast ,sc4cclas, sc4, sc4, sc4_state, sc4cclas, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 17)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cclasu ,sc4cclas, sc4, sc4, sc4_state, sc4cclas, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 18)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cclasv ,sc4cclas, sc4, sc4, sc4_state, sc4cclas, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 19)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cclasw ,sc4cclas, sc4, sc4, sc4_state, sc4cclas, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 20)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR7148 CLUB CLASS CLUB CLASS CLUB PR7148 CLUB CLASS SOUNDS11 CLUB CLASS
-GAMEL( 200?, sc4cclasx ,sc4cclas, sc4, sc4, sc4_state, sc4cclas_mbus, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 21)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cclasy ,sc4cclas, sc4, sc4, sc4_state, sc4cclas_mbus, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 22)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cclasz ,sc4cclas, sc4, sc4, sc4_state, sc4cclas_mbus, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 23)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cclas0 ,sc4cclas, sc4, sc4, sc4_state, sc4cclas_mbus, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 24)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cclas1 ,sc4cclas, sc4, sc4, sc4_state, sc4cclas_mbus, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 25)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cclas2 ,sc4cclas, sc4, sc4, sc4_state, sc4cclas_mbus, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 26)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cclas3 ,sc4cclas, sc4, sc4, sc4_state, sc4cclas_mbus, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 27)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cclas4 ,sc4cclas, sc4, sc4, sc4_state, sc4cclas_mbus, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 28)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cclasx ,sc4cclas, sc4, sc4, sc4_state, sc4cclas_mbus, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 21)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cclasy ,sc4cclas, sc4, sc4, sc4_state, sc4cclas_mbus, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 22)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cclasz ,sc4cclas, sc4, sc4, sc4_state, sc4cclas_mbus, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 23)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cclas0 ,sc4cclas, sc4, sc4, sc4_state, sc4cclas_mbus, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 24)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cclas1 ,sc4cclas, sc4, sc4, sc4_state, sc4cclas_mbus, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 25)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cclas2 ,sc4cclas, sc4, sc4, sc4_state, sc4cclas_mbus, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 26)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cclas3 ,sc4cclas, sc4, sc4, sc4_state, sc4cclas_mbus, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 27)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cclas4 ,sc4cclas, sc4, sc4, sc4_state, sc4cclas_mbus, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 28)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR7148 CLUB CLASS 65% FERRY PR7148 CLUB CLASS SOUNDS11 CLUB CLASS
-GAMEL( 200?, sc4cclase ,sc4cclas, sc4, sc4, sc4_state, sc4cclas, ROT0, "BFM","Club Class (65% Ferry) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cclasg ,sc4cclas, sc4, sc4, sc4_state, sc4cclas, ROT0, "BFM","Club Class (65% Ferry) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cclash ,sc4cclas, sc4, sc4, sc4_state, sc4cclas, ROT0, "BFM","Club Class (65% Ferry) (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cclasp ,sc4cclas, sc4, sc4, sc4_state, sc4cclas, ROT0, "BFM","Club Class (65% Ferry) (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cclase ,sc4cclas, sc4, sc4, sc4_state, sc4cclas, ROT0, "BFM","Club Class (65% Ferry) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cclasg ,sc4cclas, sc4, sc4, sc4_state, sc4cclas, ROT0, "BFM","Club Class (65% Ferry) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cclash ,sc4cclas, sc4, sc4, sc4_state, sc4cclas, ROT0, "BFM","Club Class (65% Ferry) (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cclasp ,sc4cclas, sc4, sc4, sc4_state, sc4cclas, ROT0, "BFM","Club Class (65% Ferry) (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4crcc)
@@ -47776,12 +47778,12 @@ DRIVER_INIT_MEMBER(sc4_state,sc4crcc)
// PR6837 CLASSIC CLUB COPS AND ROBBERS PR6837 COPS SOUNDS11 COPS AND ROBBERS
-GAMEL( 200?, sc4crcc ,0, sc4dmd, sc4, sc4_state, sc4crcc, ROT0, "BFM","Cops 'n' Robbers Club Classic (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4_dmd )
-GAMEL( 200?, sc4crcca ,sc4crcc, sc4dmd, sc4, sc4_state, sc4crcc, ROT0, "BFM","Cops 'n' Robbers Club Classic (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4_dmd )
+GAMEL( 200?, sc4crcc ,0, sc4dmd, sc4, sc4_state, sc4crcc, ROT0, "BFM","Cops 'n' Robbers Club Classic (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_sc4_dmd )
+GAMEL( 200?, sc4crcca ,sc4crcc, sc4dmd, sc4, sc4_state, sc4crcc, ROT0, "BFM","Cops 'n' Robbers Club Classic (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_sc4_dmd )
// PR6837 CLASSIC CLUB COPS AND ROBBERS 65% PR6837 COPS SOUNDS11
// the roms are a weird size, and the code is invalid, bad dumps? can they be fixed?
-GAMEL( 200?, sc4crccb ,sc4crcc, sc4dmd, sc4, sc4_state, sc4crcc, ROT0, "BFM","Cops 'n' Robbers Club Classic (65%) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4_dmd )
-GAMEL( 200?, sc4crccc ,sc4crcc, sc4dmd, sc4, sc4_state, sc4crcc, ROT0, "BFM","Cops 'n' Robbers Club Classic (65%) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4_dmd )
+GAMEL( 200?, sc4crccb ,sc4crcc, sc4dmd, sc4, sc4_state, sc4crcc, ROT0, "BFM","Cops 'n' Robbers Club Classic (65%) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_sc4_dmd )
+GAMEL( 200?, sc4crccc ,sc4crcc, sc4dmd, sc4, sc4_state, sc4crcc, ROT0, "BFM","Cops 'n' Robbers Club Classic (65%) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_sc4_dmd )
@@ -47793,9 +47795,9 @@ DRIVER_INIT_MEMBER(sc4_state,sc4czfr)
// the unusual sound rom numbering suggests a non-English market version, although the startup messages are in English
// PR6982 CRAZY FRUITS 1.02 95004150 CRAZY FRUITS PR6982 CRAZY FRUITS
-GAMEL( 200?, sc4czfr ,0, sc4_4reel, sc4, sc4_state, sc4czfr, ROT0, "BFM","Crazy Fruits (Germany?) (PR6982, GCRF, 1.02) (Bellfruit) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // German set?
+GAMEL( 200?, sc4czfr ,0, sc4_4reel, sc4, sc4_state, sc4czfr, ROT0, "BFM","Crazy Fruits (Germany?) (PR6982, GCRF, 1.02) (Bellfruit) (Scorpion 4)", MACHINE_FLAGS, layout_bfm_sc4 ) // German set?
// P_6_8_ _R_Z_ _R_I_S_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _5_0_1_0_C_A_Y_F_U_T_ _R_9_2_ _
-GAMEL( 200?, sc4czfrd ,sc4czfr, sc4_4reel, sc4, sc4_state, sc4czfr, ROT0, "BFM","Crazy Fruits (Germany?) (PR6982, GCRF) (Bellfruit) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // incomplete pairing (in 'up for it' set)
+GAMEL( 200?, sc4czfrd ,sc4czfr, sc4_4reel, sc4, sc4_state, sc4czfr, ROT0, "BFM","Crazy Fruits (Germany?) (PR6982, GCRF) (Bellfruit) (Scorpion 4)", MACHINE_FLAGS, layout_bfm_sc4 ) // incomplete pairing (in 'up for it' set)
DRIVER_INIT_MEMBER(sc4_state,sc4cfcas)
@@ -47809,58 +47811,58 @@ DRIVER_INIT_MEMBER(sc4_state,sc4cfcas_mbus)
}
// PR6923 CASINO CRAZY FRUITS PR6923 CRAZY FRUITS SOUNDS11
-GAMEL( 200?, sc4cfcas ,0, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfcasa ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfcasb ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfcase ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfcasf ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfcask ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfcasm ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfcasp ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfcasq ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfcass ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfcast ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 11)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfcasu ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 12)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfcasv ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 13)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfcasw ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 14)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfcasx ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 15)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfcasy ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 16)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfcasz ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 17)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfcas0 ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 18)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfcas1 ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 19)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfcas2 ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 20)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfcas6 ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 21)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfcas7 ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 22)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfcas8 ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 23)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfcasaa ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 24)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfcasaf ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 25)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfcasag ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 26)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfcasah ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 27)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfcasai ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 28)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfcasaj ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 29)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfcasak ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 30)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfcasal ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 31)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfcasam ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 32)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfcas ,0, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfcasa ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfcasb ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfcase ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfcasf ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfcask ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfcasm ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfcasp ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfcasq ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfcass ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfcast ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 11)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfcasu ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 12)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfcasv ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 13)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfcasw ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 14)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfcasx ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 15)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfcasy ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 16)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfcasz ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 17)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfcas0 ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 18)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfcas1 ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 19)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfcas2 ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 20)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfcas6 ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 21)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfcas7 ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 22)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfcas8 ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 23)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfcasaa ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 24)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfcasaf ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 25)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfcasag ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 26)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfcasah ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 27)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfcasai ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 28)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfcasaj ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 29)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfcasak ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 30)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfcasal ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 31)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfcasam ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas, ROT0, "BFM","Casino Crazy Fruits (Bellfruit) (Scorpion 4) (set 32)", MACHINE_FLAGS, layout_bfm_sc4 )
// OK
-GAMEL( 200?, sc4cfcasr ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas_mbus, ROT0, "BFM","Casino Crazy Fruits (ZYPF) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfcasl ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas_mbus, ROT0, "BFM","Casino Crazy Fruits (ZYPF) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfcasi ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas_mbus, ROT0, "BFM","Casino Crazy Fruits (ZYFR) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfcasj ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas_mbus, ROT0, "BFM","Casino Crazy Fruits (ZYFR) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfcasn ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas_mbus, ROT0, "BFM","Casino Crazy Fruits (ZYFR) (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfcaso ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas_mbus, ROT0, "BFM","Casino Crazy Fruits (ZYFR) (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfcasr ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas_mbus, ROT0, "BFM","Casino Crazy Fruits (ZYPF) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfcasl ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas_mbus, ROT0, "BFM","Casino Crazy Fruits (ZYPF) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfcasi ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas_mbus, ROT0, "BFM","Casino Crazy Fruits (ZYFR) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfcasj ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas_mbus, ROT0, "BFM","Casino Crazy Fruits (ZYFR) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfcasn ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas_mbus, ROT0, "BFM","Casino Crazy Fruits (ZYFR) (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfcaso ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas_mbus, ROT0, "BFM","Casino Crazy Fruits (ZYFR) (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
// PAY UNIT ERR 17
-GAMEL( 200?, sc4cfcasc ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas_mbus, ROT0, "BFM","Casino Crazy Fruits (ZYFR) (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfcasd ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas_mbus, ROT0, "BFM","Casino Crazy Fruits (ZYFR) (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfcasg ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas_mbus, ROT0, "BFM","Casino Crazy Fruits (ZYFR) (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfcash ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas_mbus, ROT0, "BFM","Casino Crazy Fruits (ZYFR) (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfcas3 ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas_mbus, ROT0, "BFM","Casino Crazy Fruits (ZYFR) (Bellfruit) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfcas9 ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas_mbus, ROT0, "BFM","Casino Crazy Fruits (ZYFR) (Bellfruit) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfcasab ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas_mbus, ROT0, "BFM","Casino Crazy Fruits (ZYFR) (Bellfruit) (Scorpion 4) (set 11)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfcasac ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas_mbus, ROT0, "BFM","Casino Crazy Fruits (ZYFR) (Bellfruit) (Scorpion 4) (set 12)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfcas4 ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas_mbus, ROT0, "BFM","Casino Crazy Fruits (CCFR) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfcas5 ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas_mbus, ROT0, "BFM","Casino Crazy Fruits (CCFR) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfcasad ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas_mbus, ROT0, "BFM","Casino Crazy Fruits (CCFR) (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfcasae ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas_mbus, ROT0, "BFM","Casino Crazy Fruits (CCFR) (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfcasc ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas_mbus, ROT0, "BFM","Casino Crazy Fruits (ZYFR) (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfcasd ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas_mbus, ROT0, "BFM","Casino Crazy Fruits (ZYFR) (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfcasg ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas_mbus, ROT0, "BFM","Casino Crazy Fruits (ZYFR) (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfcash ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas_mbus, ROT0, "BFM","Casino Crazy Fruits (ZYFR) (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfcas3 ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas_mbus, ROT0, "BFM","Casino Crazy Fruits (ZYFR) (Bellfruit) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfcas9 ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas_mbus, ROT0, "BFM","Casino Crazy Fruits (ZYFR) (Bellfruit) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfcasab ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas_mbus, ROT0, "BFM","Casino Crazy Fruits (ZYFR) (Bellfruit) (Scorpion 4) (set 11)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfcasac ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas_mbus, ROT0, "BFM","Casino Crazy Fruits (ZYFR) (Bellfruit) (Scorpion 4) (set 12)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfcas4 ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas_mbus, ROT0, "BFM","Casino Crazy Fruits (CCFR) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfcas5 ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas_mbus, ROT0, "BFM","Casino Crazy Fruits (CCFR) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfcasad ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas_mbus, ROT0, "BFM","Casino Crazy Fruits (CCFR) (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfcasae ,sc4cfcas, sc4_3reel, sc4, sc4_state, sc4cfcas_mbus, ROT0, "BFM","Casino Crazy Fruits (CCFR) (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -47870,52 +47872,52 @@ DRIVER_INIT_MEMBER(sc4_state,sc4cfclb)
}
// PR6931 CLUB CRAZY FRUITS PR6931 CRZY SOUNDS11
-GAMEL( 200?, sc4cfclb ,0, sc4_5reel, sc4, sc4_state, sc4cfclb, ROT0, "BFM","Crazy Fruits Club (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfclba ,sc4cfclb, sc4_5reel, sc4, sc4_state, sc4cfclb, ROT0, "BFM","Crazy Fruits Club (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cfclbb ,sc4cfclb, sc4_5reel, sc4, sc4_state, sc4cfclb, ROT0, "BFM","Crazy Fruits Club (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfclb ,0, sc4_5reel, sc4, sc4_state, sc4cfclb, ROT0, "BFM","Crazy Fruits Club (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfclba ,sc4cfclb, sc4_5reel, sc4, sc4_state, sc4cfclb, ROT0, "BFM","Crazy Fruits Club (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cfclbb ,sc4cfclb, sc4_5reel, sc4, sc4_state, sc4cfclb, ROT0, "BFM","Crazy Fruits Club (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR7141 CRAZY GANG PR7141 CRAZY GANG SOUNDS11 CRAZY GANG
-GAMEL( 200?, sc4crzgn ,0, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 1, Top Box)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // Top Box
-GAMEL( 200?, sc4crzgnb ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 2, Top Box)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // Top Box
-GAMEL( 200?, sc4crzgng ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 3, Top Box)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // Top Box
-GAMEL( 200?, sc4crzgnj ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 4, Top Box)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // Top Box
+GAMEL( 200?, sc4crzgn ,0, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 1, Top Box)", MACHINE_FLAGS, layout_bfm_sc4 ) // Top Box
+GAMEL( 200?, sc4crzgnb ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 2, Top Box)", MACHINE_FLAGS, layout_bfm_sc4 ) // Top Box
+GAMEL( 200?, sc4crzgng ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 3, Top Box)", MACHINE_FLAGS, layout_bfm_sc4 ) // Top Box
+GAMEL( 200?, sc4crzgnj ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 4, Top Box)", MACHINE_FLAGS, layout_bfm_sc4 ) // Top Box
// none of these do anything with the reels, probably waiting for the Top Box?
-GAMEL( 200?, sc4crzgna ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzgnc ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzgnd ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzgne ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzgnf ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzgnh ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzgni ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzgnk ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzgnl ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzgnm ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzgnn ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 11)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzgno ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 12)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzgnp ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 13)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzgnq ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 14)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzgnx ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 15)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // incomplete pairing
-GAMEL( 200?, sc4crzgny ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 16)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzgnz ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 17)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzgn0 ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 18)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzgn1 ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 19)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzgn2 ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 20)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzgna ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzgnc ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzgnd ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzgne ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzgnf ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzgnh ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzgni ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzgnk ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzgnl ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzgnm ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzgnn ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 11)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzgno ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 12)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzgnp ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 13)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzgnq ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 14)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzgnx ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 15)", MACHINE_FLAGS, layout_bfm_sc4 ) // incomplete pairing
+GAMEL( 200?, sc4crzgny ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 16)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzgnz ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 17)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzgn0 ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 18)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzgn1 ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 19)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzgn2 ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 20)", MACHINE_FLAGS, layout_bfm_sc4 )
// NUMBER PR7141 CRAZY GANG PR7141 CRAZY GANG SOUNDS11 CRAZY GANG ARCADE
-GAMEL( 200?, sc4crzgnr ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang Arcade (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzgns ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang Arcade (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzgnt ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang Arcade (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzgnu ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang Arcade (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzgnv ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang Arcade (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzgnw ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang Arcade (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzgn3 ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang Arcade (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzgn4 ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang Arcade (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzgn5 ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang Arcade (Bellfruit) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzgn6 ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang Arcade (Bellfruit) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzgn7 ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang Arcade (Bellfruit) (Scorpion 4) (set 11)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzgn8 ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang Arcade (Bellfruit) (Scorpion 4) (set 12)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzgnr ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang Arcade (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzgns ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang Arcade (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzgnt ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang Arcade (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzgnu ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang Arcade (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzgnv ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang Arcade (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzgnw ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang Arcade (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzgn3 ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang Arcade (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzgn4 ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang Arcade (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzgn5 ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang Arcade (Bellfruit) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzgn6 ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang Arcade (Bellfruit) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzgn7 ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang Arcade (Bellfruit) (Scorpion 4) (set 11)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzgn8 ,sc4crzgn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Gang Arcade (Bellfruit) (Scorpion 4) (set 12)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -47927,12 +47929,12 @@ DRIVER_INIT_MEMBER(sc4_state,sc4cccsh)
// SWP, different buttons to most games, no reels
// PR7023 CRISS CROSS CASH CCC SOUNDS
-GAMEL( 200?, sc4cccsh ,0, sc4_no_reels, sc4, sc4_state, sc4cccsh, ROT0, "Mazooma","Criss Cross Cash (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cccsha ,sc4cccsh, sc4_no_reels, sc4, sc4_state, sc4cccsh, ROT0, "Mazooma","Criss Cross Cash (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cccshb ,sc4cccsh, sc4_no_reels, sc4, sc4_state, sc4cccsh, ROT0, "Mazooma","Criss Cross Cash (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cccshc ,sc4cccsh, sc4_no_reels, sc4, sc4_state, sc4cccsh, ROT0, "Mazooma","Criss Cross Cash (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cccshd ,sc4cccsh, sc4_no_reels, sc4, sc4_state, sc4cccsh, ROT0, "Mazooma","Criss Cross Cash (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cccshe ,sc4cccsh, sc4_no_reels, sc4, sc4_state, sc4cccsh, ROT0, "Mazooma","Criss Cross Cash (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cccsh ,0, sc4_no_reels, sc4, sc4_state, sc4cccsh, ROT0, "Mazooma","Criss Cross Cash (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cccsha ,sc4cccsh, sc4_no_reels, sc4, sc4_state, sc4cccsh, ROT0, "Mazooma","Criss Cross Cash (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cccshb ,sc4cccsh, sc4_no_reels, sc4, sc4_state, sc4cccsh, ROT0, "Mazooma","Criss Cross Cash (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cccshc ,sc4cccsh, sc4_no_reels, sc4, sc4_state, sc4cccsh, ROT0, "Mazooma","Criss Cross Cash (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cccshd ,sc4cccsh, sc4_no_reels, sc4, sc4_state, sc4cccsh, ROT0, "Mazooma","Criss Cross Cash (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4cccshe ,sc4cccsh, sc4_no_reels, sc4, sc4_state, sc4cccsh, ROT0, "Mazooma","Criss Cross Cash (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4daylt)
@@ -47943,21 +47945,21 @@ DRIVER_INIT_MEMBER(sc4_state,sc4daylt)
// PR6801 DAYLIGHT ROBBERY PR6801 DAYLIGHT SOUNDS
-GAMEL( 200?, sc4daylt ,0, sc4_4reel_200, sc4, sc4_state, sc4daylt, ROT0, "BFM","Daylight Robbery (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4daylta ,sc4daylt, sc4_4reel_200, sc4, sc4_state, sc4daylt, ROT0, "BFM","Daylight Robbery (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4dayltb ,sc4daylt, sc4_4reel_200, sc4, sc4_state, sc4daylt, ROT0, "BFM","Daylight Robbery (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4dayltc ,sc4daylt, sc4_4reel_200, sc4, sc4_state, sc4daylt, ROT0, "BFM","Daylight Robbery (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4dayltg ,sc4daylt, sc4_4reel_200, sc4, sc4_state, sc4daylt, ROT0, "BFM","Daylight Robbery (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4daylth ,sc4daylt, sc4_4reel_200, sc4, sc4_state, sc4daylt, ROT0, "BFM","Daylight Robbery (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4daylti ,sc4daylt, sc4_4reel_200, sc4, sc4_state, sc4daylt, ROT0, "BFM","Daylight Robbery (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4dayltj ,sc4daylt, sc4_4reel_200, sc4, sc4_state, sc4daylt, ROT0, "BFM","Daylight Robbery (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4daylt ,0, sc4_4reel_200, sc4, sc4_state, sc4daylt, ROT0, "BFM","Daylight Robbery (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4daylta ,sc4daylt, sc4_4reel_200, sc4, sc4_state, sc4daylt, ROT0, "BFM","Daylight Robbery (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4dayltb ,sc4daylt, sc4_4reel_200, sc4, sc4_state, sc4daylt, ROT0, "BFM","Daylight Robbery (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4dayltc ,sc4daylt, sc4_4reel_200, sc4, sc4_state, sc4daylt, ROT0, "BFM","Daylight Robbery (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4dayltg ,sc4daylt, sc4_4reel_200, sc4, sc4_state, sc4daylt, ROT0, "BFM","Daylight Robbery (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4daylth ,sc4daylt, sc4_4reel_200, sc4, sc4_state, sc4daylt, ROT0, "BFM","Daylight Robbery (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4daylti ,sc4daylt, sc4_4reel_200, sc4, sc4_state, sc4daylt, ROT0, "BFM","Daylight Robbery (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4dayltj ,sc4daylt, sc4_4reel_200, sc4, sc4_state, sc4daylt, ROT0, "BFM","Daylight Robbery (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR4601 DAYLIGHT ROBBERY SP98 PR6801 DAYLIGHT SOUNDS
-GAMEL( 200?, sc4dayltd ,sc4daylt, sc4_4reel_200, sc4, sc4_state, sc4daylt, ROT0, "BFM","Daylight Robbery SP98 (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4daylte ,sc4daylt, sc4_4reel_200, sc4, sc4_state, sc4daylt, ROT0, "BFM","Daylight Robbery SP98 (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4dayltf ,sc4daylt, sc4_4reel_200, sc4, sc4_state, sc4daylt, ROT0, "BFM","Daylight Robbery SP98 (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4dayltk ,sc4daylt, sc4_4reel_200, sc4, sc4_state, sc4daylt, ROT0, "BFM","Daylight Robbery SP98 (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4dayltl ,sc4daylt, sc4_4reel_200, sc4, sc4_state, sc4daylt, ROT0, "BFM","Daylight Robbery SP98 (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4dayltm ,sc4daylt, sc4_4reel_200, sc4, sc4_state, sc4daylt, ROT0, "BFM","Daylight Robbery SP98 (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4dayltd ,sc4daylt, sc4_4reel_200, sc4, sc4_state, sc4daylt, ROT0, "BFM","Daylight Robbery SP98 (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4daylte ,sc4daylt, sc4_4reel_200, sc4, sc4_state, sc4daylt, ROT0, "BFM","Daylight Robbery SP98 (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4dayltf ,sc4daylt, sc4_4reel_200, sc4, sc4_state, sc4daylt, ROT0, "BFM","Daylight Robbery SP98 (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4dayltk ,sc4daylt, sc4_4reel_200, sc4, sc4_state, sc4daylt, ROT0, "BFM","Daylight Robbery SP98 (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4dayltl ,sc4daylt, sc4_4reel_200, sc4, sc4_state, sc4daylt, ROT0, "BFM","Daylight Robbery SP98 (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4dayltm ,sc4daylt, sc4_4reel_200, sc4, sc4_state, sc4daylt, ROT0, "BFM","Daylight Robbery SP98 (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -47968,11 +47970,11 @@ DRIVER_INIT_MEMBER(sc4_state,sc4disco)
}
// PR7048 DISCO INFERNO DISCO SOUNDS DISCO INFERNO
-GAMEL( 200?, sc4disco ,0, sc4_200_4r, sc4, sc4_state, sc4disco, ROT0, "Mazooma","Disco Inferno (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4discob ,sc4disco, sc4_200_4r, sc4, sc4_state, sc4disco, ROT0, "Mazooma","Disco Inferno (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4discoa ,sc4disco, sc4_200_4r, sc4, sc4_state, sc4disco, ROT0, "Mazooma","Disco Inferno (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4discoc ,sc4disco, sc4_200_4r, sc4, sc4_state, sc4disco, ROT0, "Mazooma","Disco Inferno (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4discod ,sc4disco, sc4_200_4r, sc4, sc4_state, sc4disco, ROT0, "Mazooma","Disco Inferno (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4disco ,0, sc4_200_4r, sc4, sc4_state, sc4disco, ROT0, "Mazooma","Disco Inferno (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4discob ,sc4disco, sc4_200_4r, sc4, sc4_state, sc4disco, ROT0, "Mazooma","Disco Inferno (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4discoa ,sc4disco, sc4_200_4r, sc4, sc4_state, sc4disco, ROT0, "Mazooma","Disco Inferno (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4discoc ,sc4disco, sc4_200_4r, sc4, sc4_state, sc4disco, ROT0, "Mazooma","Disco Inferno (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4discod ,sc4disco, sc4_200_4r, sc4, sc4_state, sc4disco, ROT0, "Mazooma","Disco Inferno (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -47983,9 +47985,9 @@ DRIVER_INIT_MEMBER(sc4_state,sc4sstep)
// SUPER STEP..........................................................................................SUPERSTEPSND. (non-standard header)
-GAMEL( 200?, sc4sstep ,0, sc4, sc4, sc4_state, sc4sstep, ROT0, "Qps","Super Step (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // Dough & Arrow clone? Super Step in header
-GAMEL( 200?, sc4sstepa ,sc4sstep, sc4, sc4, sc4_state, sc4sstep, ROT0, "Qps","Super Step (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // Dough & Arrow clone? Super Step in header
-GAMEL( 200?, sc4sstepb ,sc4sstep, sc4, sc4, sc4_state, sc4sstep, ROT0, "Qps / 21 Casino","Super Step (Qps / 21 Casino) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // This one contains 21-Casino and Super Step strings
+GAMEL( 200?, sc4sstep ,0, sc4, sc4, sc4_state, sc4sstep, ROT0, "Qps","Super Step (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // Dough & Arrow clone? Super Step in header
+GAMEL( 200?, sc4sstepa ,sc4sstep, sc4, sc4, sc4_state, sc4sstep, ROT0, "Qps","Super Step (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // Dough & Arrow clone? Super Step in header
+GAMEL( 200?, sc4sstepb ,sc4sstep, sc4, sc4, sc4_state, sc4sstep, ROT0, "Qps / 21 Casino","Super Step (Qps / 21 Casino) (Scorpion 4)", MACHINE_FLAGS, layout_bfm_sc4 ) // This one contains 21-Casino and Super Step strings
@@ -47995,19 +47997,19 @@ DRIVER_INIT_MEMBER(sc4_state,sc4fpitc)
}
// PR7119 FEVER_PITCH PR7119 FEVER PITCH SOUNDS11
-GAMEL( 200?, sc4fpitc ,0, sc4_4reel, sc4, sc4_state, sc4fpitc, ROT0, "BFM","Fever Pitch (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4fpitca ,sc4fpitc, sc4_4reel, sc4, sc4_state, sc4fpitc, ROT0, "BFM","Fever Pitch (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4fpitcb ,sc4fpitc, sc4_4reel, sc4, sc4_state, sc4fpitc, ROT0, "BFM","Fever Pitch (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4fpitcd ,sc4fpitc, sc4_4reel, sc4, sc4_state, sc4fpitc, ROT0, "BFM","Fever Pitch (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4fpitce ,sc4fpitc, sc4_4reel, sc4, sc4_state, sc4fpitc, ROT0, "BFM","Fever Pitch (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4fpitcf ,sc4fpitc, sc4_4reel, sc4, sc4_state, sc4fpitc, ROT0, "BFM","Fever Pitch (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4fpitch ,sc4fpitc, sc4_4reel, sc4, sc4_state, sc4fpitc, ROT0, "BFM","Fever Pitch (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4fpitci ,sc4fpitc, sc4_4reel, sc4, sc4_state, sc4fpitc, ROT0, "BFM","Fever Pitch (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4fpitcj ,sc4fpitc, sc4_4reel, sc4, sc4_state, sc4fpitc, ROT0, "BFM","Fever Pitch (Bellfruit) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4fpitck ,sc4fpitc, sc4_4reel, sc4, sc4_state, sc4fpitc, ROT0, "BFM","Fever Pitch (Bellfruit) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4fpitc ,0, sc4_4reel, sc4, sc4_state, sc4fpitc, ROT0, "BFM","Fever Pitch (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4fpitca ,sc4fpitc, sc4_4reel, sc4, sc4_state, sc4fpitc, ROT0, "BFM","Fever Pitch (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4fpitcb ,sc4fpitc, sc4_4reel, sc4, sc4_state, sc4fpitc, ROT0, "BFM","Fever Pitch (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4fpitcd ,sc4fpitc, sc4_4reel, sc4, sc4_state, sc4fpitc, ROT0, "BFM","Fever Pitch (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4fpitce ,sc4fpitc, sc4_4reel, sc4, sc4_state, sc4fpitc, ROT0, "BFM","Fever Pitch (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4fpitcf ,sc4fpitc, sc4_4reel, sc4, sc4_state, sc4fpitc, ROT0, "BFM","Fever Pitch (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4fpitch ,sc4fpitc, sc4_4reel, sc4, sc4_state, sc4fpitc, ROT0, "BFM","Fever Pitch (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4fpitci ,sc4fpitc, sc4_4reel, sc4, sc4_state, sc4fpitc, ROT0, "BFM","Fever Pitch (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4fpitcj ,sc4fpitc, sc4_4reel, sc4, sc4_state, sc4fpitc, ROT0, "BFM","Fever Pitch (Bellfruit) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4fpitck ,sc4fpitc, sc4_4reel, sc4, sc4_state, sc4fpitc, ROT0, "BFM","Fever Pitch (Bellfruit) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
// these 2 fail to show anything
-GAMEL( 200?, sc4fpitcc ,sc4fpitc, sc4_4reel, sc4, sc4_state, sc4fpitc, ROT0, "BFM","Fever Pitch (Bellfruit) (Scorpion 4) (set 11)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4fpitcg ,sc4fpitc, sc4_4reel, sc4, sc4_state, sc4fpitc, ROT0, "BFM","Fever Pitch (Bellfruit) (Scorpion 4) (set 12)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4fpitcc ,sc4fpitc, sc4_4reel, sc4, sc4_state, sc4fpitc, ROT0, "BFM","Fever Pitch (Bellfruit) (Scorpion 4) (set 11)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4fpitcg ,sc4fpitc, sc4_4reel, sc4, sc4_state, sc4fpitc, ROT0, "BFM","Fever Pitch (Bellfruit) (Scorpion 4) (set 12)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -48018,10 +48020,10 @@ DRIVER_INIT_MEMBER(sc4_state,sc4fcc)
}
// PR6835 FIRE CRACKER PR6835 FIRE SOUNDS11
-GAMEL( 200?, sc4fcc ,0, sc4dmd, sc4, sc4_state, sc4fcc, ROT0, "BFM","Firecracker Club (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4_dmd )
-GAMEL( 200?, sc4fcca ,sc4fcc, sc4dmd, sc4, sc4_state, sc4fcc, ROT0, "BFM","Firecracker Club (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4_dmd )
-GAMEL( 200?, sc4fccb ,sc4fcc, sc4dmd, sc4, sc4_state, sc4fcc, ROT0, "BFM","Firecracker Club (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4_dmd )
-GAMEL( 200?, sc4fccc ,sc4fcc, sc4dmd, sc4, sc4_state, sc4fcc, ROT0, "BFM","Firecracker Club (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4_dmd )
+GAMEL( 200?, sc4fcc ,0, sc4dmd, sc4, sc4_state, sc4fcc, ROT0, "BFM","Firecracker Club (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_sc4_dmd )
+GAMEL( 200?, sc4fcca ,sc4fcc, sc4dmd, sc4, sc4_state, sc4fcc, ROT0, "BFM","Firecracker Club (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_sc4_dmd )
+GAMEL( 200?, sc4fccb ,sc4fcc, sc4dmd, sc4, sc4_state, sc4fcc, ROT0, "BFM","Firecracker Club (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_sc4_dmd )
+GAMEL( 200?, sc4fccc ,sc4fcc, sc4dmd, sc4, sc4_state, sc4fcc, ROT0, "BFM","Firecracker Club (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_sc4_dmd )
@@ -48033,13 +48035,13 @@ DRIVER_INIT_MEMBER(sc4_state,sc4fwp)
// PR2016 WAYSPAYS PR2016,5WAYSPAYS, FWAY SOUNDS 5 WAYS PAYS
-GAMEL( 200?, sc4fwp ,0, sc4_4reel, sc4, sc4_state, sc4fwp, ROT0, "Mazooma","Five Ways Pays (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4fwpa ,sc4fwp, sc4_4reel, sc4, sc4_state, sc4fwp, ROT0, "Mazooma","Five Ways Pays (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4fwpb ,sc4fwp, sc4_4reel, sc4, sc4_state, sc4fwp, ROT0, "Mazooma","Five Ways Pays (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4fwpc ,sc4fwp, sc4_4reel, sc4, sc4_state, sc4fwp, ROT0, "Mazooma","Five Ways Pays (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4fwpcs ,sc4fwp, sc4_4reel, sc4, sc4_state, sc4fwp, ROT0, "Mazooma","Five Ways Pays (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // marked as 'casino'
-GAMEL( 200?, sc4fwpcsa ,sc4fwp, sc4_4reel, sc4, sc4_state, sc4fwp, ROT0, "Mazooma","Five Ways Pays (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4fwpcsb ,sc4fwp, sc4_4reel, sc4, sc4_state, sc4fwp, ROT0, "Mazooma","Five Ways Pays (Mazooma) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4fwp ,0, sc4_4reel, sc4, sc4_state, sc4fwp, ROT0, "Mazooma","Five Ways Pays (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4fwpa ,sc4fwp, sc4_4reel, sc4, sc4_state, sc4fwp, ROT0, "Mazooma","Five Ways Pays (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4fwpb ,sc4fwp, sc4_4reel, sc4, sc4_state, sc4fwp, ROT0, "Mazooma","Five Ways Pays (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4fwpc ,sc4fwp, sc4_4reel, sc4, sc4_state, sc4fwp, ROT0, "Mazooma","Five Ways Pays (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4fwpcs ,sc4fwp, sc4_4reel, sc4, sc4_state, sc4fwp, ROT0, "Mazooma","Five Ways Pays (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 ) // marked as 'casino'
+GAMEL( 200?, sc4fwpcsa ,sc4fwp, sc4_4reel, sc4, sc4_state, sc4fwp, ROT0, "Mazooma","Five Ways Pays (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4fwpcsb ,sc4fwp, sc4_4reel, sc4, sc4_state, sc4fwp, ROT0, "Mazooma","Five Ways Pays (Mazooma) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -48051,17 +48053,17 @@ DRIVER_INIT_MEMBER(sc4_state,sc4fd7th)
// PR6804 FRANKIE DETTORI PR6804 FRANKIE SOUNDS
-GAMEL( 200?, sc4fd7th ,0, sc4_4reel, sc4, sc4_state, sc4fd7th, ROT0, "BFM","Frankie Dettori's 7th Heaven (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4fd7tha ,sc4fd7th, sc4_4reel, sc4, sc4_state, sc4fd7th, ROT0, "BFM","Frankie Dettori's 7th Heaven (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4fd7thb ,sc4fd7th, sc4_4reel, sc4, sc4_state, sc4fd7th, ROT0, "BFM","Frankie Dettori's 7th Heaven (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4fd7the ,sc4fd7th, sc4_4reel, sc4, sc4_state, sc4fd7th, ROT0, "BFM","Frankie Dettori's 7th Heaven (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4fd7thf ,sc4fd7th, sc4_4reel, sc4, sc4_state, sc4fd7th, ROT0, "BFM","Frankie Dettori's 7th Heaven (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4fd7thg ,sc4fd7th, sc4_4reel, sc4, sc4_state, sc4fd7th, ROT0, "BFM","Frankie Dettori's 7th Heaven (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4fd7th ,0, sc4_4reel, sc4, sc4_state, sc4fd7th, ROT0, "BFM","Frankie Dettori's 7th Heaven (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4fd7tha ,sc4fd7th, sc4_4reel, sc4, sc4_state, sc4fd7th, ROT0, "BFM","Frankie Dettori's 7th Heaven (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4fd7thb ,sc4fd7th, sc4_4reel, sc4, sc4_state, sc4fd7th, ROT0, "BFM","Frankie Dettori's 7th Heaven (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4fd7the ,sc4fd7th, sc4_4reel, sc4, sc4_state, sc4fd7th, ROT0, "BFM","Frankie Dettori's 7th Heaven (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4fd7thf ,sc4fd7th, sc4_4reel, sc4, sc4_state, sc4fd7th, ROT0, "BFM","Frankie Dettori's 7th Heaven (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4fd7thg ,sc4fd7th, sc4_4reel, sc4, sc4_state, sc4fd7th, ROT0, "BFM","Frankie Dettori's 7th Heaven (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR6804 FRANKIE DETTORI SP98 PR6804 FRANKIE SOUNDS
-GAMEL( 200?, sc4fd7thc ,sc4fd7th, sc4_4reel, sc4, sc4_state, sc4fd7th, ROT0, "BFM","Frankie Dettori's 7th Heaven SP98 (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4fd7thd ,sc4fd7th, sc4_4reel, sc4, sc4_state, sc4fd7th, ROT0, "BFM","Frankie Dettori's 7th Heaven SP98 (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4fd7thh ,sc4fd7th, sc4_4reel, sc4, sc4_state, sc4fd7th, ROT0, "BFM","Frankie Dettori's 7th Heaven SP98 (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4fd7thi ,sc4fd7th, sc4_4reel, sc4, sc4_state, sc4fd7th, ROT0, "BFM","Frankie Dettori's 7th Heaven SP98 (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4fd7thc ,sc4fd7th, sc4_4reel, sc4, sc4_state, sc4fd7th, ROT0, "BFM","Frankie Dettori's 7th Heaven SP98 (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4fd7thd ,sc4fd7th, sc4_4reel, sc4, sc4_state, sc4fd7th, ROT0, "BFM","Frankie Dettori's 7th Heaven SP98 (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4fd7thh ,sc4fd7th, sc4_4reel, sc4, sc4_state, sc4fd7th, ROT0, "BFM","Frankie Dettori's 7th Heaven SP98 (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4fd7thi ,sc4fd7th, sc4_4reel, sc4, sc4_state, sc4fd7th, ROT0, "BFM","Frankie Dettori's 7th Heaven SP98 (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4frsu)
@@ -48070,14 +48072,14 @@ DRIVER_INIT_MEMBER(sc4_state,sc4frsu)
}
// PR6928 CASINO FRUIT N SUITS PR6928 FRUIT N SUITS SOUNDS11
-GAMEL( 200?, sc4frsu ,0, sc4, sc4, sc4_state, sc4frsu, ROT0, "BFM","Casino Fruits 'n' Suits (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4frsua ,sc4frsu, sc4, sc4, sc4_state, sc4frsu, ROT0, "BFM","Casino Fruits 'n' Suits (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4frsub ,sc4frsu, sc4, sc4, sc4_state, sc4frsu, ROT0, "BFM","Casino Fruits 'n' Suits (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4frsuc ,sc4frsu, sc4, sc4, sc4_state, sc4frsu, ROT0, "BFM","Casino Fruits 'n' Suits (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4frsud ,sc4frsu, sc4, sc4, sc4_state, sc4frsu, ROT0, "BFM","Casino Fruits 'n' Suits (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4frsue ,sc4frsu, sc4, sc4, sc4_state, sc4frsu, ROT0, "BFM","Casino Fruits 'n' Suits (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4frsuf ,sc4frsu, sc4, sc4, sc4_state, sc4frsu, ROT0, "BFM","Casino Fruits 'n' Suits (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4frsug ,sc4frsu, sc4, sc4, sc4_state, sc4frsu, ROT0, "BFM","Casino Fruits 'n' Suits (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4frsu ,0, sc4, sc4, sc4_state, sc4frsu, ROT0, "BFM","Casino Fruits 'n' Suits (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4frsua ,sc4frsu, sc4, sc4, sc4_state, sc4frsu, ROT0, "BFM","Casino Fruits 'n' Suits (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4frsub ,sc4frsu, sc4, sc4, sc4_state, sc4frsu, ROT0, "BFM","Casino Fruits 'n' Suits (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4frsuc ,sc4frsu, sc4, sc4, sc4_state, sc4frsu, ROT0, "BFM","Casino Fruits 'n' Suits (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4frsud ,sc4frsu, sc4, sc4, sc4_state, sc4frsu, ROT0, "BFM","Casino Fruits 'n' Suits (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4frsue ,sc4frsu, sc4, sc4, sc4_state, sc4frsu, ROT0, "BFM","Casino Fruits 'n' Suits (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4frsuf ,sc4frsu, sc4, sc4, sc4_state, sc4frsu, ROT0, "BFM","Casino Fruits 'n' Suits (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4frsug ,sc4frsu, sc4, sc4, sc4_state, sc4frsu, ROT0, "BFM","Casino Fruits 'n' Suits (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -48089,12 +48091,12 @@ DRIVER_INIT_MEMBER(sc4_state,sc4goldo)
// PR7024 GOLDEN OLDIE OLDIE SOUNDS
-GAMEL( 200?, sc4goldo ,0, sc4_4reel, sc4, sc4_state, sc4goldo, ROT0, "Mazooma","Casino Golden Oldie (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4goldoa ,sc4goldo, sc4_4reel, sc4, sc4_state, sc4goldo, ROT0, "Mazooma","Casino Golden Oldie (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4goldob ,sc4goldo, sc4_4reel, sc4, sc4_state, sc4goldo, ROT0, "Mazooma","Casino Golden Oldie (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4goldoc ,sc4goldo, sc4_4reel, sc4, sc4_state, sc4goldo, ROT0, "Mazooma","Casino Golden Oldie (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gocas ,sc4goldo, sc4_4reel, sc4, sc4_state, sc4goldo, ROT0, "Mazooma","Casino Golden Oldie (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gocasa ,sc4goldo, sc4_4reel, sc4, sc4_state, sc4goldo, ROT0, "Mazooma","Casino Golden Oldie (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4goldo ,0, sc4_4reel, sc4, sc4_state, sc4goldo, ROT0, "Mazooma","Casino Golden Oldie (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4goldoa ,sc4goldo, sc4_4reel, sc4, sc4_state, sc4goldo, ROT0, "Mazooma","Casino Golden Oldie (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4goldob ,sc4goldo, sc4_4reel, sc4, sc4_state, sc4goldo, ROT0, "Mazooma","Casino Golden Oldie (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4goldoc ,sc4goldo, sc4_4reel, sc4, sc4_state, sc4goldo, ROT0, "Mazooma","Casino Golden Oldie (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gocas ,sc4goldo, sc4_4reel, sc4, sc4_state, sc4goldo, ROT0, "Mazooma","Casino Golden Oldie (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gocasa ,sc4goldo, sc4_4reel, sc4, sc4_state, sc4goldo, ROT0, "Mazooma","Casino Golden Oldie (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -48124,31 +48126,31 @@ DRIVER_INIT_MEMBER(sc4_state,sc4gx)
// Listed as Bonus Bar X, what's the correct title?
// PR7036GOLDEN X GOLDEN X ARCADE BARX SOUNDS GOLDEN X
-GAMEL( 200?, sc4bonbx ,0, sc4_3reel_200, sc4bonbx4, sc4_state, sc4bonbxm, ROT0, "Mazooma","Bar X (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bonbxc ,sc4bonbx, sc4_3reel_200, sc4, sc4_state, sc4bonbxm, ROT0, "Mazooma","Bar X (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bonbxd ,sc4bonbx, sc4_3reel_200, sc4, sc4_state, sc4bonbxm, ROT0, "Mazooma","Bar X (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bonbxe ,sc4bonbx, sc4_3reel_200, sc4, sc4_state, sc4bonbxm, ROT0, "Mazooma","Bar X (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bonbxf ,sc4bonbx, sc4_3reel_200, sc4, sc4_state, sc4bonbxm, ROT0, "Mazooma","Bar X (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4bonbx ,0, sc4_3reel_200, sc4bonbx4, sc4_state, sc4bonbxm, ROT0, "Mazooma","Bar X (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bonbxc ,sc4bonbx, sc4_3reel_200, sc4, sc4_state, sc4bonbxm, ROT0, "Mazooma","Bar X (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bonbxd ,sc4bonbx, sc4_3reel_200, sc4, sc4_state, sc4bonbxm, ROT0, "Mazooma","Bar X (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bonbxe ,sc4bonbx, sc4_3reel_200, sc4, sc4_state, sc4bonbxm, ROT0, "Mazooma","Bar X (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bonbxf ,sc4bonbx, sc4_3reel_200, sc4, sc4_state, sc4bonbxm, ROT0, "Mazooma","Bar X (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR7036GOLDEN X BARX SOUNDS GOLDEN X
-GAMEL( 200?, sc4bonbxa ,sc4bonbx, sc4_3reel_200, sc4, sc4_state, sc4bonbx, ROT0, "Mazooma","Bar X (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bonbxb ,sc4bonbx, sc4_3reel_200, sc4, sc4_state, sc4bonbx, ROT0, "Mazooma","Bar X (Mazooma) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bonbxg ,sc4bonbx, sc4_3reel_200, sc4, sc4_state, sc4bonbx, ROT0, "Mazooma","Bar X (Mazooma) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bonbxh ,sc4bonbx, sc4_3reel_200, sc4, sc4_state, sc4bonbx, ROT0, "Mazooma","Bar X (Mazooma) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bonbxi ,sc4bonbx, sc4_3reel_200, sc4, sc4_state, sc4bonbx, ROT0, "Mazooma","Bar X (Mazooma) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bonbxj ,sc4bonbx, sc4_3reel_200, sc4, sc4_state, sc4bonbx, ROT0, "Mazooma","Bar X (Mazooma) (Scorpion 4) (set 11)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bonbxk ,sc4bonbx, sc4_3reel_200, sc4, sc4_state, sc4bonbx, ROT0, "Mazooma","Bar X (Mazooma) (Scorpion 4) (set 12)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bonbxl ,sc4bonbx, sc4_3reel_200, sc4, sc4_state, sc4bonbx, ROT0, "Mazooma","Bar X (Mazooma) (Scorpion 4) (set 13)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4bonbxa ,sc4bonbx, sc4_3reel_200, sc4, sc4_state, sc4bonbx, ROT0, "Mazooma","Bar X (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bonbxb ,sc4bonbx, sc4_3reel_200, sc4, sc4_state, sc4bonbx, ROT0, "Mazooma","Bar X (Mazooma) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bonbxg ,sc4bonbx, sc4_3reel_200, sc4, sc4_state, sc4bonbx, ROT0, "Mazooma","Bar X (Mazooma) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bonbxh ,sc4bonbx, sc4_3reel_200, sc4, sc4_state, sc4bonbx, ROT0, "Mazooma","Bar X (Mazooma) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bonbxi ,sc4bonbx, sc4_3reel_200, sc4, sc4_state, sc4bonbx, ROT0, "Mazooma","Bar X (Mazooma) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bonbxj ,sc4bonbx, sc4_3reel_200, sc4, sc4_state, sc4bonbx, ROT0, "Mazooma","Bar X (Mazooma) (Scorpion 4) (set 11)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bonbxk ,sc4bonbx, sc4_3reel_200, sc4, sc4_state, sc4bonbx, ROT0, "Mazooma","Bar X (Mazooma) (Scorpion 4) (set 12)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4bonbxl ,sc4bonbx, sc4_3reel_200, sc4, sc4_state, sc4bonbx, ROT0, "Mazooma","Bar X (Mazooma) (Scorpion 4) (set 13)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR7036 GOLDEN X BARX SOUNDS (these were listed as Golden X Casino but seem to be Bar X / Bonus Bar X)
-GAMEL( 200?, sc4gx ,sc4bonbx, sc4_3reel_200, sc4, sc4_state, sc4gx, ROT0, "Mazooma","Bar X (Mazooma) (Scorpion 4) (BARX, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gxcasa ,sc4bonbx, sc4_3reel_200, sc4, sc4_state, sc4gx, ROT0, "Mazooma","Bar X (Mazooma) (Scorpion 4) (BARX, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gxcasb ,sc4bonbx, sc4_3reel_200, sc4, sc4_state, sc4gx, ROT0, "Mazooma","Bar X (Mazooma) (Scorpion 4) (BARX, set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gxcasc ,sc4bonbx, sc4_3reel_200, sc4, sc4_state, sc4gx, ROT0, "Mazooma","Bar X (Mazooma) (Scorpion 4) (BARX, set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gxcasd ,sc4bonbx, sc4_3reel_200, sc4, sc4_state, sc4gx, ROT0, "Mazooma","Bar X (Mazooma) (Scorpion 4) (BARX, set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4gx ,sc4bonbx, sc4_3reel_200, sc4, sc4_state, sc4gx, ROT0, "Mazooma","Bar X (Mazooma) (Scorpion 4) (BARX, set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gxcasa ,sc4bonbx, sc4_3reel_200, sc4, sc4_state, sc4gx, ROT0, "Mazooma","Bar X (Mazooma) (Scorpion 4) (BARX, set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gxcasb ,sc4bonbx, sc4_3reel_200, sc4, sc4_state, sc4gx, ROT0, "Mazooma","Bar X (Mazooma) (Scorpion 4) (BARX, set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gxcasc ,sc4bonbx, sc4_3reel_200, sc4, sc4_state, sc4gx, ROT0, "Mazooma","Bar X (Mazooma) (Scorpion 4) (BARX, set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gxcasd ,sc4bonbx, sc4_3reel_200, sc4, sc4_state, sc4gx, ROT0, "Mazooma","Bar X (Mazooma) (Scorpion 4) (BARX, set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR7036GOLDEN X BARX SOUNDS GOLDEN
-GAMEL( 200?, sc4gxcase ,sc4bonbx, sc4_3reel_200, sc4, sc4_state, sc4gx, ROT0, "Mazooma","Bar X (Mazooma) (Scorpion 4) (BARX, set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gxcasf ,sc4bonbx, sc4_3reel_200, sc4, sc4_state, sc4gx, ROT0, "Mazooma","Bar X (Mazooma) (Scorpion 4) (BARX, set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gxa ,sc4bonbx, sc4_3reel_200, sc4, sc4_state, sc4gx, ROT0, "Mazooma","Bar X (Mazooma) (Scorpion 4) (BARX, set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // wasn't marked as Casino
-GAMEL( 200?, sc4gxb ,sc4bonbx, sc4_3reel_200, sc4, sc4_state, sc4gx, ROT0, "Mazooma","Bar X (Mazooma) (Scorpion 4) (BARX, set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // wasn't marked as Casino
+GAMEL( 200?, sc4gxcase ,sc4bonbx, sc4_3reel_200, sc4, sc4_state, sc4gx, ROT0, "Mazooma","Bar X (Mazooma) (Scorpion 4) (BARX, set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gxcasf ,sc4bonbx, sc4_3reel_200, sc4, sc4_state, sc4gx, ROT0, "Mazooma","Bar X (Mazooma) (Scorpion 4) (BARX, set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gxa ,sc4bonbx, sc4_3reel_200, sc4, sc4_state, sc4gx, ROT0, "Mazooma","Bar X (Mazooma) (Scorpion 4) (BARX, set 8)", MACHINE_FLAGS, layout_bfm_sc4 ) // wasn't marked as Casino
+GAMEL( 200?, sc4gxb ,sc4bonbx, sc4_3reel_200, sc4, sc4_state, sc4gx, ROT0, "Mazooma","Bar X (Mazooma) (Scorpion 4) (BARX, set 9)", MACHINE_FLAGS, layout_bfm_sc4 ) // wasn't marked as Casino
@@ -48162,14 +48164,14 @@ DRIVER_INIT_MEMBER(sc4_state,sc4gggtb)
// TBOX
// PR2056 GOLD X TRIPLE BARX SOUNDS GOLD X TRIPLE
-GAMEL( 200?, sc4ggtb ,0, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Golden X (Mazooma) (PR2056, TBOX) (Scorpion 4) (Top Box, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // PR2056 GOLD X TRIPLE BARX SOUNDS GOLD X TRIPLE
-GAMEL( 200?, sc4ggtba ,sc4ggtb, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Golden X (Mazooma) (PR2056, TBOX) (Scorpion 4) (Top Box, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // ^^
-GAMEL( 200?, sc4ggtbb ,sc4ggtb, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Golden X (Mazooma) (PR2056, TBOX) (Scorpion 4) (Top Box, set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // ^^
+GAMEL( 200?, sc4ggtb ,0, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Golden X (Mazooma) (PR2056, TBOX) (Scorpion 4) (Top Box, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // PR2056 GOLD X TRIPLE BARX SOUNDS GOLD X TRIPLE
+GAMEL( 200?, sc4ggtba ,sc4ggtb, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Golden X (Mazooma) (PR2056, TBOX) (Scorpion 4) (Top Box, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // ^^
+GAMEL( 200?, sc4ggtbb ,sc4ggtb, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Golden X (Mazooma) (PR2056, TBOX) (Scorpion 4) (Top Box, set 3)", MACHINE_FLAGS, layout_bfm_sc4 ) // ^^
// PR2056 GOLD X TRIPLE BARX SOUNDS J GOLD X TRIPLE (this was in a set just called 'top box')
-GAMEL( 200?, sc4tbox ,sc4ggtb, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Golden X (Mazooma) (PR2056, TBOX) (Scorpion 4) (Top Box, set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4tbox ,sc4ggtb, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Golden X (Mazooma) (PR2056, TBOX) (Scorpion 4) (Top Box, set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2056 GOLD X TRIPLE BARX SOUNDS GOLD X TRIPLE (these were in a Monopoly set, did it use the same top box code?, could be for Monopoly Deluxe?)
-GAMEL( 200?, sc4monog ,sc4ggtb, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Golden X (Mazooma) (PR2056, TBOX) (Scorpion 4) (Top Box, set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// PR2056 GOLD X TRIPLE BARX SOUNDS GOLD X TRIPLE
-GAMEL( 200?, sc4monoga ,sc4ggtb, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Golden X (Mazooma) (PR2056, TBOX) (Scorpion 4) (Top Box, set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// PR2056 GOLD X TRIPLE BARX SOUNDS GOLD X TRIPLE
+GAMEL( 200?, sc4monog ,sc4ggtb, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Golden X (Mazooma) (PR2056, TBOX) (Scorpion 4) (Top Box, set 5)", MACHINE_FLAGS, layout_bfm_sc4 )// PR2056 GOLD X TRIPLE BARX SOUNDS GOLD X TRIPLE
+GAMEL( 200?, sc4monoga ,sc4ggtb, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Golden X (Mazooma) (PR2056, TBOX) (Scorpion 4) (Top Box, set 6)", MACHINE_FLAGS, layout_bfm_sc4 )// PR2056 GOLD X TRIPLE BARX SOUNDS GOLD X TRIPLE
@@ -48192,79 +48194,79 @@ DRIVER_INIT_MEMBER(sc4_state,sc4gx3)
// GLDX
// 25GBP sets
// PR2056 GOLDEN X GOLDEN GAME ARCADE BARX SOUNDS GOLDEN X
-GAMEL( 200?, sc4ggame ,0, sc4_3reel_200, sc4, sc4_state, sc4ggamem, ROT0, "Mazooma","Golden X (Mazooma) (PR2056, newer?) (Scorpion 4) (GLDX, 25GBP, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ggamei ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggamem, ROT0, "Mazooma","Golden X (Mazooma) (PR2056, newer?) (Scorpion 4) (GLDX, 25GBP, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
-GAMEL( 200?, sc4ggamep ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggamem, ROT0, "Mazooma","Golden X (Mazooma) (PR2056, newer?) (Scorpion 4) (GLDX, 25GBP, set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
-GAMEL( 200?, sc4ggameq ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggamem, ROT0, "Mazooma","Golden X (Mazooma) (PR2056, newer?) (Scorpion 4) (GLDX, 25GBP, set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
-GAMEL( 200?, sc4ggamer ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggamem, ROT0, "Mazooma","Golden X (Mazooma) (PR2056, newer?) (Scorpion 4) (GLDX, 25GBP, set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4ggame ,0, sc4_3reel_200, sc4, sc4_state, sc4ggamem, ROT0, "Mazooma","Golden X (Mazooma) (PR2056, newer?) (Scorpion 4) (GLDX, 25GBP, set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ggamei ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggamem, ROT0, "Mazooma","Golden X (Mazooma) (PR2056, newer?) (Scorpion 4) (GLDX, 25GBP, set 2)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4ggamep ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggamem, ROT0, "Mazooma","Golden X (Mazooma) (PR2056, newer?) (Scorpion 4) (GLDX, 25GBP, set 3)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4ggameq ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggamem, ROT0, "Mazooma","Golden X (Mazooma) (PR2056, newer?) (Scorpion 4) (GLDX, 25GBP, set 4)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4ggamer ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggamem, ROT0, "Mazooma","Golden X (Mazooma) (PR2056, newer?) (Scorpion 4) (GLDX, 25GBP, set 5)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
// 35GBP sets
-GAMEL( 200?, sc4ggame7 ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggamem, ROT0, "Mazooma","Golden X (Mazooma) (PR2056, newer?) (Scorpion 4) (GLDX, 35GBP, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
-GAMEL( 200?, sc4ggame8 ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggamem, ROT0, "Mazooma","Golden X (Mazooma) (PR2056, newer?) (Scorpion 4) (GLDX, 35GBP, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
-GAMEL( 200?, sc4ggame9 ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggamem, ROT0, "Mazooma","Golden X (Mazooma) (PR2056, newer?) (Scorpion 4) (GLDX, 35GBP, set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
-GAMEL( 200?, sc4ggameaa ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggamem, ROT0, "Mazooma","Golden X (Mazooma) (PR2056, newer?) (Scorpion 4) (GLDX, 35GBP, set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
-GAMEL( 200?, sc4ggameab ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggamem, ROT0, "Mazooma","Golden X (Mazooma) (PR2056, newer?) (Scorpion 4) (GLDX, 35GBP, set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
-GAMEL( 200?, sc4ggameac ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggamem, ROT0, "Mazooma","Golden X (Mazooma) (PR2056, newer?) (Scorpion 4) (GLDX, 35GBP, set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
-GAMEL( 200?, sc4ggamead ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggamem, ROT0, "Mazooma","Golden X (Mazooma) (PR2056, newer?) (Scorpion 4) (GLDX, 35GBP, set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
-GAMEL( 200?, sc4ggameae ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggamem, ROT0, "Mazooma","Golden X (Mazooma) (PR2056, newer?) (Scorpion 4) (GLDX, 35GBP, set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4ggame7 ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggamem, ROT0, "Mazooma","Golden X (Mazooma) (PR2056, newer?) (Scorpion 4) (GLDX, 35GBP, set 1)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4ggame8 ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggamem, ROT0, "Mazooma","Golden X (Mazooma) (PR2056, newer?) (Scorpion 4) (GLDX, 35GBP, set 2)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4ggame9 ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggamem, ROT0, "Mazooma","Golden X (Mazooma) (PR2056, newer?) (Scorpion 4) (GLDX, 35GBP, set 3)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4ggameaa ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggamem, ROT0, "Mazooma","Golden X (Mazooma) (PR2056, newer?) (Scorpion 4) (GLDX, 35GBP, set 4)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4ggameab ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggamem, ROT0, "Mazooma","Golden X (Mazooma) (PR2056, newer?) (Scorpion 4) (GLDX, 35GBP, set 5)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4ggameac ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggamem, ROT0, "Mazooma","Golden X (Mazooma) (PR2056, newer?) (Scorpion 4) (GLDX, 35GBP, set 6)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4ggamead ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggamem, ROT0, "Mazooma","Golden X (Mazooma) (PR2056, newer?) (Scorpion 4) (GLDX, 35GBP, set 7)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4ggameae ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggamem, ROT0, "Mazooma","Golden X (Mazooma) (PR2056, newer?) (Scorpion 4) (GLDX, 35GBP, set 8)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
// pay unit error
-GAMEL( 200?, sc4ggamel ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggamem, ROT0, "Mazooma","Golden X (Mazooma) (PR2056, newer?) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
-GAMEL( 200?, sc4ggamem ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggamem, ROT0, "Mazooma","Golden X (Mazooma) (PR2056, newer?) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
-GAMEL( 200?, sc4ggamew ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggamem, ROT0, "Mazooma","Golden X (Mazooma) (PR2056, newer?) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
-GAMEL( 200?, sc4ggamex ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggamem, ROT0, "Mazooma","Golden X (Mazooma) (PR2056, newer?) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
-GAMEL( 200?, sc4ggamey ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggamem, ROT0, "Mazooma","Golden X (Mazooma) (PR2056, newer?) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
-GAMEL( 200?, sc4ggamez ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggamem, ROT0, "Mazooma","Golden X (Mazooma) (PR2056, newer?) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
-GAMEL( 200?, sc4ggame1 ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggamem, ROT0, "Mazooma","Golden X (Mazooma) (PR2056, newer?) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
-GAMEL( 200?, sc4ggame2 ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggamem, ROT0, "Mazooma","Golden X (Mazooma) (PR2056, newer?) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4ggamel ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggamem, ROT0, "Mazooma","Golden X (Mazooma) (PR2056, newer?) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4ggamem ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggamem, ROT0, "Mazooma","Golden X (Mazooma) (PR2056, newer?) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4ggamew ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggamem, ROT0, "Mazooma","Golden X (Mazooma) (PR2056, newer?) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4ggamex ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggamem, ROT0, "Mazooma","Golden X (Mazooma) (PR2056, newer?) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4ggamey ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggamem, ROT0, "Mazooma","Golden X (Mazooma) (PR2056, newer?) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4ggamez ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggamem, ROT0, "Mazooma","Golden X (Mazooma) (PR2056, newer?) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4ggame1 ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggamem, ROT0, "Mazooma","Golden X (Mazooma) (PR2056, newer?) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4ggame2 ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggamem, ROT0, "Mazooma","Golden X (Mazooma) (PR2056, newer?) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
// 25GBP, no 41 check
// PR2056 GOLDEN X BARX SOUNDS GOLDEN X
-GAMEL( 200?, sc4ggamea ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggame, ROT0, "Mazooma","Golden X (Mazooma) (PR2056) (Scorpion 4) (GLDX, 25GBP, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ggameb ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggame, ROT0, "Mazooma","Golden X (Mazooma) (PR2056) (Scorpion 4) (GLDX, 25GBP, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // ^^
-GAMEL( 200?, sc4ggamec ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggame, ROT0, "Mazooma","Golden X (Mazooma) (PR2056) (Scorpion 4) (GLDX, 25GBP, set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // ^^
-GAMEL( 200?, sc4ggamed ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggame, ROT0, "Mazooma","Golden X (Mazooma) (PR2056) (Scorpion 4) (GLDX, 25GBP, set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // ^^
-GAMEL( 200?, sc4ggames ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggame, ROT0, "Mazooma","Golden X (Mazooma) (PR2056) (Scorpion 4) (GLDX, 25GBP, set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
-GAMEL( 200?, sc4ggamet ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggame, ROT0, "Mazooma","Golden X (Mazooma) (PR2056) (Scorpion 4) (GLDX, 25GBP, set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
-GAMEL( 200?, sc4ggameu ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggame, ROT0, "Mazooma","Golden X (Mazooma) (PR2056) (Scorpion 4) (GLDX, 25GBP, set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4ggamea ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggame, ROT0, "Mazooma","Golden X (Mazooma) (PR2056) (Scorpion 4) (GLDX, 25GBP, set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ggameb ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggame, ROT0, "Mazooma","Golden X (Mazooma) (PR2056) (Scorpion 4) (GLDX, 25GBP, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // ^^
+GAMEL( 200?, sc4ggamec ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggame, ROT0, "Mazooma","Golden X (Mazooma) (PR2056) (Scorpion 4) (GLDX, 25GBP, set 3)", MACHINE_FLAGS, layout_bfm_sc4 ) // ^^
+GAMEL( 200?, sc4ggamed ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggame, ROT0, "Mazooma","Golden X (Mazooma) (PR2056) (Scorpion 4) (GLDX, 25GBP, set 4)", MACHINE_FLAGS, layout_bfm_sc4 ) // ^^
+GAMEL( 200?, sc4ggames ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggame, ROT0, "Mazooma","Golden X (Mazooma) (PR2056) (Scorpion 4) (GLDX, 25GBP, set 5)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4ggamet ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggame, ROT0, "Mazooma","Golden X (Mazooma) (PR2056) (Scorpion 4) (GLDX, 25GBP, set 6)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4ggameu ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggame, ROT0, "Mazooma","Golden X (Mazooma) (PR2056) (Scorpion 4) (GLDX, 25GBP, set 7)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
// 30GBP, no 41 check
-GAMEL( 200?, sc4ggamef ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggame, ROT0, "Mazooma","Golden X (Mazooma) (PR2056) (Scorpion 4) (GLDX, 30GBP, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // ^^
-GAMEL( 200?, sc4ggameg ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggame, ROT0, "Mazooma","Golden X (Mazooma) (PR2056) (Scorpion 4) (GLDX, 30GBP, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // ^^
-GAMEL( 200?, sc4ggamej ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggame, ROT0, "Mazooma","Golden X (Mazooma) (PR2056) (Scorpion 4) (GLDX, 30GBP, set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
-GAMEL( 200?, sc4ggamek ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggame, ROT0, "Mazooma","Golden X (Mazooma) (PR2056) (Scorpion 4) (GLDX, 30GBP, set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
-GAMEL( 200?, sc4ggamev ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggame, ROT0, "Mazooma","Golden X (Mazooma) (PR2056) (Scorpion 4) (GLDX, 30GBP, set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
-GAMEL( 200?, sc4ggame3 ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggame, ROT0, "Mazooma","Golden X (Mazooma) (PR2056) (Scorpion 4) (GLDX, 30GBP, set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
-GAMEL( 200?, sc4ggame4 ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggame, ROT0, "Mazooma","Golden X (Mazooma) (PR2056) (Scorpion 4) (GLDX, 30GBP, set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
-GAMEL( 200?, sc4ggame5 ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggame, ROT0, "Mazooma","Golden X (Mazooma) (PR2056) (Scorpion 4) (GLDX, 30GBP, set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
-GAMEL( 200?, sc4ggame6 ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggame, ROT0, "Mazooma","Golden X (Mazooma) (PR2056) (Scorpion 4) (GLDX, 30GBP, set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4ggamef ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggame, ROT0, "Mazooma","Golden X (Mazooma) (PR2056) (Scorpion 4) (GLDX, 30GBP, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // ^^
+GAMEL( 200?, sc4ggameg ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggame, ROT0, "Mazooma","Golden X (Mazooma) (PR2056) (Scorpion 4) (GLDX, 30GBP, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // ^^
+GAMEL( 200?, sc4ggamej ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggame, ROT0, "Mazooma","Golden X (Mazooma) (PR2056) (Scorpion 4) (GLDX, 30GBP, set 3)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4ggamek ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggame, ROT0, "Mazooma","Golden X (Mazooma) (PR2056) (Scorpion 4) (GLDX, 30GBP, set 4)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4ggamev ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggame, ROT0, "Mazooma","Golden X (Mazooma) (PR2056) (Scorpion 4) (GLDX, 30GBP, set 5)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4ggame3 ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggame, ROT0, "Mazooma","Golden X (Mazooma) (PR2056) (Scorpion 4) (GLDX, 30GBP, set 6)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4ggame4 ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggame, ROT0, "Mazooma","Golden X (Mazooma) (PR2056) (Scorpion 4) (GLDX, 30GBP, set 7)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4ggame5 ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggame, ROT0, "Mazooma","Golden X (Mazooma) (PR2056) (Scorpion 4) (GLDX, 30GBP, set 8)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4ggame6 ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggame, ROT0, "Mazooma","Golden X (Mazooma) (PR2056) (Scorpion 4) (GLDX, 30GBP, set 9)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
// pay unit error
-GAMEL( 200?, sc4ggamen ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggame, ROT0, "Mazooma","Golden X (Mazooma) (PR2056) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
-GAMEL( 200?, sc4ggame0 ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggame, ROT0, "Mazooma","Golden X (Mazooma) (PR2056) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4ggamen ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggame, ROT0, "Mazooma","Golden X (Mazooma) (PR2056) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4ggame0 ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggame, ROT0, "Mazooma","Golden X (Mazooma) (PR2056) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
// PR2056 GOLDEN X BARX SOUNDS GOLDEN X (are these really Gold Diggers?)
-GAMEL( 200?, sc4gdmz ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggame, ROT0, "Mazooma","Golden X (Mazooma) (PR2056) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // GLDX
-GAMEL( 200?, sc4gdmza ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggame, ROT0, "Mazooma","Golden X (Mazooma) (PR2056) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // GLDX
+GAMEL( 200?, sc4gdmz ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggame, ROT0, "Mazooma","Golden X (Mazooma) (PR2056) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 ) // GLDX
+GAMEL( 200?, sc4gdmza ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4ggame, ROT0, "Mazooma","Golden X (Mazooma) (PR2056) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 ) // GLDX
// boot as GLDX, not happy with this sound rom..
// PR2056 GOLDEN X BARX SOUNDS GOLDEN X
-GAMEL( 200?, sc4gx3 ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4gx3, ROT0, "Mazooma","Golden X (Mazooma) (Scorpion 4) (GLDX, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gx3a ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4gx3, ROT0, "Mazooma","Golden X (Mazooma) (Scorpion 4) (GLDX, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gx3b ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4gx3, ROT0, "Mazooma","Golden X (Mazooma) (Scorpion 4) (GLDX, set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gx3c ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4gx3, ROT0, "Mazooma","Golden X (Mazooma) (Scorpion 4) (GLDX, set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gx3d ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4gx3, ROT0, "Mazooma","Golden X (Mazooma) (Scorpion 4) (GLDX, set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gx3e ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4gx3, ROT0, "Mazooma","Golden X (Mazooma) (Scorpion 4) (GLDX, set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gx3f ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4gx3, ROT0, "Mazooma","Golden X (Mazooma) (Scorpion 4) (GLDX, set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gx3g ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4gx3, ROT0, "Mazooma","Golden X (Mazooma) (Scorpion 4) (GLDX, set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4gx3 ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4gx3, ROT0, "Mazooma","Golden X (Mazooma) (Scorpion 4) (GLDX, set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gx3a ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4gx3, ROT0, "Mazooma","Golden X (Mazooma) (Scorpion 4) (GLDX, set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gx3b ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4gx3, ROT0, "Mazooma","Golden X (Mazooma) (Scorpion 4) (GLDX, set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gx3c ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4gx3, ROT0, "Mazooma","Golden X (Mazooma) (Scorpion 4) (GLDX, set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gx3d ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4gx3, ROT0, "Mazooma","Golden X (Mazooma) (Scorpion 4) (GLDX, set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gx3e ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4gx3, ROT0, "Mazooma","Golden X (Mazooma) (Scorpion 4) (GLDX, set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gx3f ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4gx3, ROT0, "Mazooma","Golden X (Mazooma) (Scorpion 4) (GLDX, set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gx3g ,sc4ggame, sc4_3reel_200, sc4, sc4_state, sc4gx3, ROT0, "Mazooma","Golden X (Mazooma) (Scorpion 4) (GLDX, set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
// GLDX
// PR2056 GOLDEN X BARX SOUNDS GOLDEN X (was Golden Game Casino)
-GAMEL( 200?, sc4ggcas ,sc4ggame, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Golden X (Mazooma) (Scorpion 4) (GLDX, set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ggcasa ,sc4ggame, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Golden X (Mazooma) (Scorpion 4) (GLDX, set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ggcasb ,sc4ggame, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Golden X (Mazooma) (Scorpion 4) (GLDX, set 11)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ggcasc ,sc4ggame, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Golden X (Mazooma) (Scorpion 4) (GLDX, set 12)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4ggcas ,sc4ggame, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Golden X (Mazooma) (Scorpion 4) (GLDX, set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ggcasa ,sc4ggame, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Golden X (Mazooma) (Scorpion 4) (GLDX, set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ggcasb ,sc4ggame, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Golden X (Mazooma) (Scorpion 4) (GLDX, set 11)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ggcasc ,sc4ggame, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Golden X (Mazooma) (Scorpion 4) (GLDX, set 12)", MACHINE_FLAGS, layout_bfm_sc4 )
// GLDC
// PR2056 GOLDEN X BARX SOUNDS GOLDEN X
-GAMEL( 200?, sc4gnc ,0, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Golden Game Club (Mazooma) (Scorpion 4) (GLDC, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gnca ,sc4gnc, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Golden Game Club (Mazooma) (Scorpion 4) (GLDC, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gncb ,sc4gnc, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Golden Game Club (Mazooma) (Scorpion 4) (GLDC, set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gncc ,sc4gnc, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Golden Game Club (Mazooma) (Scorpion 4) (GLDC, set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gncd ,sc4gnc, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Golden Game Club (Mazooma) (Scorpion 4) (GLDC, set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gnce ,sc4gnc, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Golden Game Club (Mazooma) (Scorpion 4) (GLDC, set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4gnc ,0, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Golden Game Club (Mazooma) (Scorpion 4) (GLDC, set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gnca ,sc4gnc, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Golden Game Club (Mazooma) (Scorpion 4) (GLDC, set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gncb ,sc4gnc, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Golden Game Club (Mazooma) (Scorpion 4) (GLDC, set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gncc ,sc4gnc, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Golden Game Club (Mazooma) (Scorpion 4) (GLDC, set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gncd ,sc4gnc, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Golden Game Club (Mazooma) (Scorpion 4) (GLDC, set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gnce ,sc4gnc, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Golden Game Club (Mazooma) (Scorpion 4) (GLDC, set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4ggg)
@@ -48274,29 +48276,29 @@ DRIVER_INIT_MEMBER(sc4_state,sc4ggg)
// do these sets have the wrong project name / ID strings? they boot at GGGB (Grand Golden Game) but their product ID in the header suggests standard Golden Game, looks like they forgot to update it at first, the topbox has the same issue
// PR2056 GOLDEN X GOLDEN GAME ARCADE BARX SOUNDS GOLDEN X
-GAMEL( 200?, sc4ggg ,0, sc4_3reel_200, sc4, sc4_state, sc4ggg, ROT0, "Mazooma","Grand Golden Game (Mazooma) (PR2056) (Scorpion 4) (GGGB, 35GBP, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gggb ,sc4ggg, sc4_3reel_200, sc4, sc4_state, sc4ggg, ROT0, "Mazooma","Grand Golden Game (Mazooma) (PR2056) (Scorpion 4) (GGGB, 35GBP, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // ^^
-GAMEL( 200?, sc4gggc ,sc4ggg, sc4_3reel_200, sc4, sc4_state, sc4ggg, ROT0, "Mazooma","Grand Golden Game (Mazooma) (PR2056) (Scorpion 4) (GGGB, 35GBP, set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // ^^
-GAMEL( 200?, sc4gggd ,sc4ggg, sc4_3reel_200, sc4, sc4_state, sc4ggg, ROT0, "Mazooma","Grand Golden Game (Mazooma) (PR2056) (Scorpion 4) (GGGB, 35GBP, set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // ^^
-GAMEL( 200?, sc4ggge ,sc4ggg, sc4_3reel_200, sc4, sc4_state, sc4ggg, ROT0, "Mazooma","Grand Golden Game (Mazooma) (PR2056) (Scorpion 4) (GGGB, 35GBP, set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // ^^
-GAMEL( 200?, sc4gggf ,sc4ggg, sc4_3reel_200, sc4, sc4_state, sc4ggg, ROT0, "Mazooma","Grand Golden Game (Mazooma) (PR2056) (Scorpion 4) (GGGB, 35GBP, set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // ^^
-GAMEL( 200?, sc4gggk ,sc4ggg, sc4_3reel_200, sc4, sc4_state, sc4ggg, ROT0, "Mazooma","Grand Golden Game (Mazooma) (PR2056) (Scorpion 4) (GGGB, 35GBP, set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
-GAMEL( 200?, sc4gggl ,sc4ggg, sc4_3reel_200, sc4, sc4_state, sc4ggg, ROT0, "Mazooma","Grand Golden Game (Mazooma) (PR2056) (Scorpion 4) (GGGB, 35GBP, set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
-GAMEL( 200?, sc4gggm ,sc4ggg, sc4_3reel_200, sc4, sc4_state, sc4ggg, ROT0, "Mazooma","Grand Golden Game (Mazooma) (PR2056) (Scorpion 4) (GGGB, 35GBP, set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
-GAMEL( 200?, sc4gggn ,sc4ggg, sc4_3reel_200, sc4, sc4_state, sc4ggg, ROT0, "Mazooma","Grand Golden Game (Mazooma) (PR2056) (Scorpion 4) (GGGB, 35GBP, set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
-GAMEL( 200?, sc4gggo ,sc4ggg, sc4_3reel_200, sc4, sc4_state, sc4ggg, ROT0, "Mazooma","Grand Golden Game (Mazooma) (PR2056) (Scorpion 4) (GGGB, 35GBP, set 11)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
-GAMEL( 200?, sc4gggp ,sc4ggg, sc4_3reel_200, sc4, sc4_state, sc4ggg, ROT0, "Mazooma","Grand Golden Game (Mazooma) (PR2056) (Scorpion 4) (GGGB, 35GBP, set 12)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
-GAMEL( 200?, sc4gggg ,sc4ggg, sc4_3reel_200, sc4, sc4_state, sc4ggg, ROT0, "Mazooma","Grand Golden Game (Mazooma) (PR2056) (Scorpion 4) (GGGB, 35GBP, set 13)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4ggg ,0, sc4_3reel_200, sc4, sc4_state, sc4ggg, ROT0, "Mazooma","Grand Golden Game (Mazooma) (PR2056) (Scorpion 4) (GGGB, 35GBP, set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gggb ,sc4ggg, sc4_3reel_200, sc4, sc4_state, sc4ggg, ROT0, "Mazooma","Grand Golden Game (Mazooma) (PR2056) (Scorpion 4) (GGGB, 35GBP, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // ^^
+GAMEL( 200?, sc4gggc ,sc4ggg, sc4_3reel_200, sc4, sc4_state, sc4ggg, ROT0, "Mazooma","Grand Golden Game (Mazooma) (PR2056) (Scorpion 4) (GGGB, 35GBP, set 3)", MACHINE_FLAGS, layout_bfm_sc4 ) // ^^
+GAMEL( 200?, sc4gggd ,sc4ggg, sc4_3reel_200, sc4, sc4_state, sc4ggg, ROT0, "Mazooma","Grand Golden Game (Mazooma) (PR2056) (Scorpion 4) (GGGB, 35GBP, set 4)", MACHINE_FLAGS, layout_bfm_sc4 ) // ^^
+GAMEL( 200?, sc4ggge ,sc4ggg, sc4_3reel_200, sc4, sc4_state, sc4ggg, ROT0, "Mazooma","Grand Golden Game (Mazooma) (PR2056) (Scorpion 4) (GGGB, 35GBP, set 5)", MACHINE_FLAGS, layout_bfm_sc4 ) // ^^
+GAMEL( 200?, sc4gggf ,sc4ggg, sc4_3reel_200, sc4, sc4_state, sc4ggg, ROT0, "Mazooma","Grand Golden Game (Mazooma) (PR2056) (Scorpion 4) (GGGB, 35GBP, set 6)", MACHINE_FLAGS, layout_bfm_sc4 ) // ^^
+GAMEL( 200?, sc4gggk ,sc4ggg, sc4_3reel_200, sc4, sc4_state, sc4ggg, ROT0, "Mazooma","Grand Golden Game (Mazooma) (PR2056) (Scorpion 4) (GGGB, 35GBP, set 7)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4gggl ,sc4ggg, sc4_3reel_200, sc4, sc4_state, sc4ggg, ROT0, "Mazooma","Grand Golden Game (Mazooma) (PR2056) (Scorpion 4) (GGGB, 35GBP, set 8)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4gggm ,sc4ggg, sc4_3reel_200, sc4, sc4_state, sc4ggg, ROT0, "Mazooma","Grand Golden Game (Mazooma) (PR2056) (Scorpion 4) (GGGB, 35GBP, set 9)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4gggn ,sc4ggg, sc4_3reel_200, sc4, sc4_state, sc4ggg, ROT0, "Mazooma","Grand Golden Game (Mazooma) (PR2056) (Scorpion 4) (GGGB, 35GBP, set 10)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4gggo ,sc4ggg, sc4_3reel_200, sc4, sc4_state, sc4ggg, ROT0, "Mazooma","Grand Golden Game (Mazooma) (PR2056) (Scorpion 4) (GGGB, 35GBP, set 11)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4gggp ,sc4ggg, sc4_3reel_200, sc4, sc4_state, sc4ggg, ROT0, "Mazooma","Grand Golden Game (Mazooma) (PR2056) (Scorpion 4) (GGGB, 35GBP, set 12)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4gggg ,sc4ggg, sc4_3reel_200, sc4, sc4_state, sc4ggg, ROT0, "Mazooma","Grand Golden Game (Mazooma) (PR2056) (Scorpion 4) (GGGB, 35GBP, set 13)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2353 GRAND GOLDEN GAME GRAND GOLDEN GAME MAZ BARX SOUNDS GOLDEN GAME
-GAMEL( 200?, sc4gggh ,sc4ggg, sc4_3reel_200, sc4, sc4_state, sc4ggg, ROT0, "Mazooma","Grand Golden Game (Mazooma) (PR2353) (Scorpion 4) (GGGB, 35GBP, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // ^^
-GAMEL( 200?, sc4gggi ,sc4ggg, sc4_3reel_200, sc4, sc4_state, sc4ggg, ROT0, "Mazooma","Grand Golden Game (Mazooma) (PR2353) (Scorpion 4) (GGGB, 35GBP, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
-GAMEL( 200?, sc4gggq ,sc4ggg, sc4_3reel_200, sc4, sc4_state, sc4ggg, ROT0, "Mazooma","Grand Golden Game (Mazooma) (PR2353) (Scorpion 4) (GGGB, 35GBP, set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
-GAMEL( 200?, sc4gggr ,sc4ggg, sc4_3reel_200, sc4, sc4_state, sc4ggg, ROT0, "Mazooma","Grand Golden Game (Mazooma) (PR2353) (Scorpion 4) (GGGB, 35GBP, set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
-GAMEL( 200?, sc4gggs ,sc4ggg, sc4_3reel_200, sc4, sc4_state, sc4ggg, ROT0, "Mazooma","Grand Golden Game (Mazooma) (PR2353) (Scorpion 4) (GGGB, 35GBP, set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4gggh ,sc4ggg, sc4_3reel_200, sc4, sc4_state, sc4ggg, ROT0, "Mazooma","Grand Golden Game (Mazooma) (PR2353) (Scorpion 4) (GGGB, 35GBP, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // ^^
+GAMEL( 200?, sc4gggi ,sc4ggg, sc4_3reel_200, sc4, sc4_state, sc4ggg, ROT0, "Mazooma","Grand Golden Game (Mazooma) (PR2353) (Scorpion 4) (GGGB, 35GBP, set 2)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4gggq ,sc4ggg, sc4_3reel_200, sc4, sc4_state, sc4ggg, ROT0, "Mazooma","Grand Golden Game (Mazooma) (PR2353) (Scorpion 4) (GGGB, 35GBP, set 3)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4gggr ,sc4ggg, sc4_3reel_200, sc4, sc4_state, sc4ggg, ROT0, "Mazooma","Grand Golden Game (Mazooma) (PR2353) (Scorpion 4) (GGGB, 35GBP, set 4)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4gggs ,sc4ggg, sc4_3reel_200, sc4, sc4_state, sc4ggg, ROT0, "Mazooma","Grand Golden Game (Mazooma) (PR2353) (Scorpion 4) (GGGB, 35GBP, set 5)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
// PR2056 GOLD X TRIPLE BARX SOUNDS 0 GOLD X TRIPLE (these were in a Grand Golden Game set)
-GAMEL( 200?, sc4gggtb ,sc4ggg, sc4_3reel_200, sc4, sc4_state, sc4gggtb, ROT0, "Mazooma","Grand Golden Game (Mazooma) (PR2056, GGGT) (Scorpion 4) (Top Box, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // PR2056 GOLD X TRIPLE BARX SOUNDS GOLD X TRIPLE
-GAMEL( 200?, sc4gggtba ,sc4ggg, sc4_3reel_200, sc4, sc4_state, sc4gggtb, ROT0, "Mazooma","Grand Golden Game (Mazooma) (PR2056, GGGT) (Scorpion 4) (Top Box, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4gggtb ,sc4ggg, sc4_3reel_200, sc4, sc4_state, sc4gggtb, ROT0, "Mazooma","Grand Golden Game (Mazooma) (PR2056, GGGT) (Scorpion 4) (Top Box, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // PR2056 GOLD X TRIPLE BARX SOUNDS GOLD X TRIPLE
+GAMEL( 200?, sc4gggtba ,sc4ggg, sc4_3reel_200, sc4, sc4_state, sc4gggtb, ROT0, "Mazooma","Grand Golden Game (Mazooma) (PR2056, GGGT) (Scorpion 4) (Top Box, set 2)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
@@ -48308,10 +48310,10 @@ DRIVER_INIT_MEMBER(sc4_state,sc4gag)
// the (PR7019, GRAN) sets requires 3:2 and 3:3 ON to boot, (PR7019, GRAB) I'm not sure
// PR7019 GRAB A GRANNY GRANNY SOUNDS
-GAMEL( 200?, sc4gag ,0, sc4_4reel, sc4, sc4_state, sc4gag, ROT0, "Mazooma","Grab A Granny (PR7019, GRAB) (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gagb ,sc4gag, sc4_4reel, sc4, sc4_state, sc4gag, ROT0, "Mazooma","Grab A Granny (PR7019, GRAB) (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gaga ,sc4gag, sc4_4reel, sc4, sc4_state, sc4gag, ROT0, "Mazooma","Grab A Granny (PR7019, GRAN) (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gagc ,sc4gag, sc4_4reel, sc4, sc4_state, sc4gag, ROT0, "Mazooma","Grab A Granny (PR7019, GRAN) (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4gag ,0, sc4_4reel, sc4, sc4_state, sc4gag, ROT0, "Mazooma","Grab A Granny (PR7019, GRAB) (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gagb ,sc4gag, sc4_4reel, sc4, sc4_state, sc4gag, ROT0, "Mazooma","Grab A Granny (PR7019, GRAB) (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gaga ,sc4gag, sc4_4reel, sc4, sc4_state, sc4gag, ROT0, "Mazooma","Grab A Granny (PR7019, GRAN) (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gagc ,sc4gag, sc4_4reel, sc4, sc4_state, sc4gag, ROT0, "Mazooma","Grab A Granny (PR7019, GRAN) (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -48324,8 +48326,8 @@ DRIVER_INIT_MEMBER(sc4_state,sc4hfcl)
// PR1021 CLUB HAPPY FRUITS PR1021 HAPPY SOUNDS11 HAPPY FRUITS
-GAMEL( 200?, sc4hfcl ,0, sc4_5reel, sc4, sc4_state, sc4hfcl, ROT0, "BFM","Happy Fruits Club (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hfcla ,sc4hfcl, sc4_5reel, sc4, sc4_state, sc4hfcl, ROT0, "BFM","Happy Fruits Club (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4hfcl ,0, sc4_5reel, sc4, sc4_state, sc4hfcl, ROT0, "BFM","Happy Fruits Club (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hfcla ,sc4hfcl, sc4_5reel, sc4, sc4_state, sc4hfcl, ROT0, "BFM","Happy Fruits Club (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -48335,10 +48337,10 @@ DRIVER_INIT_MEMBER(sc4_state,sc4holyw)
}
// PR7115 HOLLYWOOD PR7115 HOLLYWOOD SOUNDS11
-GAMEL( 200?, sc4holyw ,0, sc4_4reel, sc4, sc4_state, sc4holyw, ROT0, "BFM","Hollywood (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4holywb ,sc4holyw, sc4_4reel, sc4, sc4_state, sc4holyw, ROT0, "BFM","Hollywood (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4holywa ,sc4holyw, sc4_4reel, sc4, sc4_state, sc4holyw, ROT0, "BFM / Whitbread","Hollywood (Bellfruit / Whitbread) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4holywc ,sc4holyw, sc4_4reel, sc4, sc4_state, sc4holyw, ROT0, "BFM / Whitbread","Hollywood (Bellfruit / Whitbread) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4holyw ,0, sc4_4reel, sc4, sc4_state, sc4holyw, ROT0, "BFM","Hollywood (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4holywb ,sc4holyw, sc4_4reel, sc4, sc4_state, sc4holyw, ROT0, "BFM","Hollywood (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4holywa ,sc4holyw, sc4_4reel, sc4, sc4_state, sc4holyw, ROT0, "BFM / Whitbread","Hollywood (Bellfruit / Whitbread) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4holywc ,sc4holyw, sc4_4reel, sc4, sc4_state, sc4holyw, ROT0, "BFM / Whitbread","Hollywood (Bellfruit / Whitbread) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -48349,21 +48351,21 @@ DRIVER_INIT_MEMBER(sc4_state,sc4jjf)
// PR6807 JUMPING JACK FLASH PR6807 JUMP SOUNDS11
-GAMEL( 200?, sc4jjf ,0, sc4_4reel, sc4, sc4_state, sc4jjf, ROT0, "BFM","Jumping Jack Flash (PR6807) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4jjfa ,sc4jjf, sc4_4reel, sc4, sc4_state, sc4jjf, ROT0, "BFM","Jumping Jack Flash (PR6807) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4jjfb ,sc4jjf, sc4_4reel, sc4, sc4_state, sc4jjf, ROT0, "BFM","Jumping Jack Flash (PR6807) (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4jjfg ,sc4jjf, sc4_4reel, sc4, sc4_state, sc4jjf, ROT0, "BFM","Jumping Jack Flash (PR6807) (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4jjfh ,sc4jjf, sc4_4reel, sc4, sc4_state, sc4jjf, ROT0, "BFM","Jumping Jack Flash (PR6807) (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4jjfi ,sc4jjf, sc4_4reel, sc4, sc4_state, sc4jjf, ROT0, "BFM","Jumping Jack Flash (PR6807) (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4jjf ,0, sc4_4reel, sc4, sc4_state, sc4jjf, ROT0, "BFM","Jumping Jack Flash (PR6807) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4jjfa ,sc4jjf, sc4_4reel, sc4, sc4_state, sc4jjf, ROT0, "BFM","Jumping Jack Flash (PR6807) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4jjfb ,sc4jjf, sc4_4reel, sc4, sc4_state, sc4jjf, ROT0, "BFM","Jumping Jack Flash (PR6807) (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4jjfg ,sc4jjf, sc4_4reel, sc4, sc4_state, sc4jjf, ROT0, "BFM","Jumping Jack Flash (PR6807) (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4jjfh ,sc4jjf, sc4_4reel, sc4, sc4_state, sc4jjf, ROT0, "BFM","Jumping Jack Flash (PR6807) (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4jjfi ,sc4jjf, sc4_4reel, sc4, sc4_state, sc4jjf, ROT0, "BFM","Jumping Jack Flash (PR6807) (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR4607 JUMPING JACK FLASH SP98 PR6807 JUMP SOUNDS11
-GAMEL( 200?, sc4jjfc ,sc4jjf, sc4_4reel, sc4, sc4_state, sc4jjf, ROT0, "BFM","Jumping Jack Flash SP98 (PR4607) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4jjfd ,sc4jjf, sc4_4reel, sc4, sc4_state, sc4jjf, ROT0, "BFM","Jumping Jack Flash SP98 (PR4607) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4jjfe ,sc4jjf, sc4_4reel, sc4, sc4_state, sc4jjf, ROT0, "BFM","Jumping Jack Flash SP98 (PR4607) (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4jjff ,sc4jjf, sc4_4reel, sc4, sc4_state, sc4jjf, ROT0, "BFM","Jumping Jack Flash SP98 (PR4607) (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4jjfj ,sc4jjf, sc4_4reel, sc4, sc4_state, sc4jjf, ROT0, "BFM","Jumping Jack Flash SP98 (PR4607) (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4jjfk ,sc4jjf, sc4_4reel, sc4, sc4_state, sc4jjf, ROT0, "BFM","Jumping Jack Flash SP98 (PR4607) (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4jjfl ,sc4jjf, sc4_4reel, sc4, sc4_state, sc4jjf, ROT0, "BFM","Jumping Jack Flash SP98 (PR4607) (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4jjfm ,sc4jjf, sc4_4reel, sc4, sc4_state, sc4jjf, ROT0, "BFM","Jumping Jack Flash SP98 (PR4607) (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4jjfc ,sc4jjf, sc4_4reel, sc4, sc4_state, sc4jjf, ROT0, "BFM","Jumping Jack Flash SP98 (PR4607) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4jjfd ,sc4jjf, sc4_4reel, sc4, sc4_state, sc4jjf, ROT0, "BFM","Jumping Jack Flash SP98 (PR4607) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4jjfe ,sc4jjf, sc4_4reel, sc4, sc4_state, sc4jjf, ROT0, "BFM","Jumping Jack Flash SP98 (PR4607) (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4jjff ,sc4jjf, sc4_4reel, sc4, sc4_state, sc4jjf, ROT0, "BFM","Jumping Jack Flash SP98 (PR4607) (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4jjfj ,sc4jjf, sc4_4reel, sc4, sc4_state, sc4jjf, ROT0, "BFM","Jumping Jack Flash SP98 (PR4607) (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4jjfk ,sc4jjf, sc4_4reel, sc4, sc4_state, sc4jjf, ROT0, "BFM","Jumping Jack Flash SP98 (PR4607) (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4jjfl ,sc4jjf, sc4_4reel, sc4, sc4_state, sc4jjf, ROT0, "BFM","Jumping Jack Flash SP98 (PR4607) (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4jjfm ,sc4jjf, sc4_4reel, sc4, sc4_state, sc4jjf, ROT0, "BFM","Jumping Jack Flash SP98 (PR4607) (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -48378,27 +48380,27 @@ DRIVER_INIT_MEMBER(sc4_state,sc4lined_mbus)
}
// PR7067CASINO LINE DANCER LINE SOUNDS LINE DANCER
-GAMEL( 200?, sc4lined ,0, sc4_3reel, sc4, sc4_state, sc4lined, ROT0, "Mazooma","Line Dancer (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4lineda ,sc4lined, sc4_3reel, sc4, sc4_state, sc4lined, ROT0, "Mazooma","Line Dancer (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4lined ,0, sc4_3reel, sc4, sc4_state, sc4lined, ROT0, "Mazooma","Line Dancer (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4lineda ,sc4lined, sc4_3reel, sc4, sc4_state, sc4lined, ROT0, "Mazooma","Line Dancer (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PAY UNIT ERR 17 alarm during startup
-GAMEL( 200?, sc4linedb ,sc4lined, sc4_3reel, sc4, sc4_state, sc4lined, ROT0, "Mazooma","Line Dancer (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4linedc ,sc4lined, sc4_3reel, sc4, sc4_state, sc4lined, ROT0, "Mazooma","Line Dancer (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4linedb ,sc4lined, sc4_3reel, sc4, sc4_state, sc4lined, ROT0, "Mazooma","Line Dancer (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4linedc ,sc4lined, sc4_3reel, sc4, sc4_state, sc4lined, ROT0, "Mazooma","Line Dancer (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR7067CASINO LINE DANCER LINE DANCER ARCADE LINE SOUNDS LINE DANCER
// PAY UNIT ERR 17 alarm during startup
-GAMEL( 200?, sc4linedd ,sc4lined, sc4_3reel, sc4, sc4_state, sc4lined_mbus, ROT0, "Mazooma","Line Dancer Arcade (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4linede ,sc4lined, sc4_3reel, sc4, sc4_state, sc4lined_mbus, ROT0, "Mazooma","Line Dancer Arcade (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4linedd ,sc4lined, sc4_3reel, sc4, sc4_state, sc4lined_mbus, ROT0, "Mazooma","Line Dancer Arcade (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4linede ,sc4lined, sc4_3reel, sc4, sc4_state, sc4lined_mbus, ROT0, "Mazooma","Line Dancer Arcade (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// ok
-GAMEL( 200?, sc4linedf ,sc4lined, sc4_3reel, sc4, sc4_state, sc4lined, ROT0, "Mazooma","Line Dancer Arcade (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4linedg ,sc4lined, sc4_3reel, sc4, sc4_state, sc4lined, ROT0, "Mazooma","Line Dancer Arcade (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4linedh ,sc4lined, sc4_3reel, sc4, sc4_state, sc4lined, ROT0, "Mazooma","Line Dancer Arcade (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4linedi ,sc4lined, sc4_3reel, sc4, sc4_state, sc4lined, ROT0, "Mazooma","Line Dancer Arcade (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4linedf ,sc4lined, sc4_3reel, sc4, sc4_state, sc4lined, ROT0, "Mazooma","Line Dancer Arcade (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4linedg ,sc4lined, sc4_3reel, sc4, sc4_state, sc4lined, ROT0, "Mazooma","Line Dancer Arcade (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4linedh ,sc4lined, sc4_3reel, sc4, sc4_state, sc4lined, ROT0, "Mazooma","Line Dancer Arcade (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4linedi ,sc4lined, sc4_3reel, sc4, sc4_state, sc4lined, ROT0, "Mazooma","Line Dancer Arcade (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR7067CASINO LINE DANCER LINE SOUNDS LINE DANCER (same as above?)
-GAMEL( 200?, sc4ldcas ,sc4lined, sc4_3reel, sc4, sc4_state, sc4lined, ROT0, "Mazooma","Line Dancer Casino (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ldcasa ,sc4lined, sc4_3reel, sc4, sc4_state, sc4lined, ROT0, "Mazooma","Line Dancer Casino (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ldcasb ,sc4lined, sc4_3reel, sc4, sc4_state, sc4lined, ROT0, "Mazooma","Line Dancer Casino (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ldcasc ,sc4lined, sc4_3reel, sc4, sc4_state, sc4lined, ROT0, "Mazooma","Line Dancer Casino (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ldcasd ,sc4lined, sc4_3reel, sc4, sc4_state, sc4lined, ROT0, "Mazooma","Line Dancer Casino (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ldcase ,sc4lined, sc4_3reel, sc4, sc4_state, sc4lined, ROT0, "Mazooma","Line Dancer Casino (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4ldcas ,sc4lined, sc4_3reel, sc4, sc4_state, sc4lined, ROT0, "Mazooma","Line Dancer Casino (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ldcasa ,sc4lined, sc4_3reel, sc4, sc4_state, sc4lined, ROT0, "Mazooma","Line Dancer Casino (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ldcasb ,sc4lined, sc4_3reel, sc4, sc4_state, sc4lined, ROT0, "Mazooma","Line Dancer Casino (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ldcasc ,sc4lined, sc4_3reel, sc4, sc4_state, sc4lined, ROT0, "Mazooma","Line Dancer Casino (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ldcasd ,sc4lined, sc4_3reel, sc4, sc4_state, sc4lined, ROT0, "Mazooma","Line Dancer Casino (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ldcase ,sc4lined, sc4_3reel, sc4, sc4_state, sc4lined, ROT0, "Mazooma","Line Dancer Casino (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -48415,13 +48417,13 @@ DRIVER_INIT_MEMBER(sc4_state,sc4luck7)
// PR2085 LUCKY SEVENS LUCKY SOUNDS
-GAMEL( 200?, sc4luck7 ,0, sc4_3reel, sc4, sc4_state, sc4luck7tb, ROT0, "Mazooma","Lucky 7s (Mazooma) (Scorpion 4) (Top Box)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4luck7 ,0, sc4_3reel, sc4, sc4_state, sc4luck7tb, ROT0, "Mazooma","Lucky 7s (Mazooma) (Scorpion 4) (Top Box)", MACHINE_FLAGS, layout_bfm_sc4 )
// PAY UNIT ERR 17
-GAMEL( 200?, sc4luck7a ,sc4luck7, sc4_3reel_200, sc4, sc4_state, sc4luck7, ROT0, "Mazooma","Lucky 7s (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4luck7b ,sc4luck7, sc4_3reel_200, sc4, sc4_state, sc4luck7, ROT0, "Mazooma","Lucky 7s (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4luck7c ,sc4luck7, sc4_3reel_200, sc4, sc4_state, sc4luck7, ROT0, "Mazooma","Lucky 7s (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4luck7a ,sc4luck7, sc4_3reel_200, sc4, sc4_state, sc4luck7, ROT0, "Mazooma","Lucky 7s (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4luck7b ,sc4luck7, sc4_3reel_200, sc4, sc4_state, sc4luck7, ROT0, "Mazooma","Lucky 7s (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4luck7c ,sc4luck7, sc4_3reel_200, sc4, sc4_state, sc4luck7, ROT0, "Mazooma","Lucky 7s (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2085 LUCKY SEVENS LUCKY SEVENS ARCADE LUCKY SOUNDS LUCKY SEVENS
-GAMEL( 200?, sc4luck7d ,sc4luck7, sc4_3reel_200, sc4, sc4_state, sc4luck7, ROT0, "Mazooma","Lucky 7s (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4luck7d ,sc4luck7, sc4_3reel_200, sc4, sc4_state, sc4luck7, ROT0, "Mazooma","Lucky 7s (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -48436,40 +48438,40 @@ DRIVER_INIT_MEMBER(sc4_state,sc4luckb_mbus)
}
// PR1033 CASINO LUCKY BALLS PR1033 LUCKY BALLS SOUNDS11
-GAMEL( 200?, sc4luckb ,0, sc4_200_4r, sc4, sc4_state, sc4luckb, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4luckba ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4luckbb ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4luckbc ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4luckbd ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4luckbe ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4luckbf ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4luckbg ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4luckbh ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4luckbi ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4luckbj ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 11)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4luckbk ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 12)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4luckbl ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 13)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4luckbm ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 14)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4luckbn ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 15)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4luckbo ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 16)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4luckbp ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 17)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4luckbt ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 18)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4luckbu ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 19)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4luckbv ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 20)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4luckbw ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 21)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4luckbx ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 22)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4luckb1 ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 23)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4luckb2 ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 24)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4luckb3 ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 25)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4luckb4 ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 26)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4luckb ,0, sc4_200_4r, sc4, sc4_state, sc4luckb, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4luckba ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4luckbb ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4luckbc ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4luckbd ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4luckbe ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4luckbf ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4luckbg ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4luckbh ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4luckbi ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4luckbj ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 11)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4luckbk ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 12)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4luckbl ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 13)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4luckbm ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 14)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4luckbn ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 15)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4luckbo ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 16)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4luckbp ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 17)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4luckbt ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 18)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4luckbu ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 19)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4luckbv ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 20)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4luckbw ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 21)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4luckbx ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 22)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4luckb1 ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 23)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4luckb2 ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 24)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4luckb3 ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 25)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4luckb4 ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 26)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR1033 CASINO LUCKY BALLS PR1033 LUCKY BALLS SOUNDS11 LUCKY BALLS ARCADE
-GAMEL( 200?, sc4luckbq ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb_mbus, ROT0, "BFM","Lucky Balls Casino Arcade (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4luckbr ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb_mbus, ROT0, "BFM","Lucky Balls Casino Arcade (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4luckbs ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb_mbus, ROT0, "BFM","Lucky Balls Casino Arcade (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4luckby ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb_mbus, ROT0, "BFM","Lucky Balls Casino Arcade (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4luckbz ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb_mbus, ROT0, "BFM","Lucky Balls Casino Arcade (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // incomplete pairing
-GAMEL( 200?, sc4luckb0 ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb_mbus, ROT0, "BFM","Lucky Balls Casino Arcade (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4luckbq ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb_mbus, ROT0, "BFM","Lucky Balls Casino Arcade (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4luckbr ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb_mbus, ROT0, "BFM","Lucky Balls Casino Arcade (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4luckbs ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb_mbus, ROT0, "BFM","Lucky Balls Casino Arcade (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4luckby ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb_mbus, ROT0, "BFM","Lucky Balls Casino Arcade (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4luckbz ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb_mbus, ROT0, "BFM","Lucky Balls Casino Arcade (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 ) // incomplete pairing
+GAMEL( 200?, sc4luckb0 ,sc4luckb, sc4_200_4r, sc4, sc4_state, sc4luckb_mbus, ROT0, "BFM","Lucky Balls Casino Arcade (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -48485,21 +48487,21 @@ DRIVER_INIT_MEMBER(sc4_state,sc4mgrm)
}
// PR1132 CASINO MONEY GO ROUND PR1132 MONEY GO ROUND SOUNDS11
-GAMEL( 200?, sc4mgr ,0, sc4_200_4r, sc4, sc4_state, sc4mgr, ROT0, "BFM","Money Go Round Casino (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mgra ,sc4mgr, sc4_200_4r, sc4, sc4_state, sc4mgr, ROT0, "BFM","Money Go Round Casino (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mgrh ,sc4mgr, sc4_200_4r, sc4, sc4_state, sc4mgr, ROT0, "BFM","Money Go Round Casino (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mgri ,sc4mgr, sc4_200_4r, sc4, sc4_state, sc4mgr, ROT0, "BFM","Money Go Round Casino (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4mgr ,0, sc4_200_4r, sc4, sc4_state, sc4mgr, ROT0, "BFM","Money Go Round Casino (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mgra ,sc4mgr, sc4_200_4r, sc4, sc4_state, sc4mgr, ROT0, "BFM","Money Go Round Casino (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mgrh ,sc4mgr, sc4_200_4r, sc4, sc4_state, sc4mgr, ROT0, "BFM","Money Go Round Casino (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mgri ,sc4mgr, sc4_200_4r, sc4, sc4_state, sc4mgr, ROT0, "BFM","Money Go Round Casino (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR1132 CASINO MONEY GO ROUND PR1132 MONEY GO ROUND SOUNDS11 MONEY GO ROUND S.SITE
-GAMEL( 200?, sc4mgrb ,sc4mgr, sc4_200_4r, sc4, sc4_state, sc4mgrm, ROT0, "BFM","Money Go Round Casino (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mgrc ,sc4mgr, sc4_200_4r, sc4, sc4_state, sc4mgrm, ROT0, "BFM","Money Go Round Casino (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mgrd ,sc4mgr, sc4_200_4r, sc4, sc4_state, sc4mgrm, ROT0, "BFM","Money Go Round Casino (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mgre ,sc4mgr, sc4_200_4r, sc4, sc4_state, sc4mgrm, ROT0, "BFM","Money Go Round Casino (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mgrf ,sc4mgr, sc4_200_4r, sc4, sc4_state, sc4mgrm, ROT0, "BFM","Money Go Round Casino (Bellfruit) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mgrg ,sc4mgr, sc4_200_4r, sc4, sc4_state, sc4mgrm, ROT0, "BFM","Money Go Round Casino (Bellfruit) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mgrj ,sc4mgr, sc4_200_4r, sc4, sc4_state, sc4mgrm, ROT0, "BFM","Money Go Round Casino (Bellfruit) (Scorpion 4) (set 11)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mgrk ,sc4mgr, sc4_200_4r, sc4, sc4_state, sc4mgrm, ROT0, "BFM","Money Go Round Casino (Bellfruit) (Scorpion 4) (set 12)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mgrl ,sc4mgr, sc4_200_4r, sc4, sc4_state, sc4mgrm, ROT0, "BFM","Money Go Round Casino (Bellfruit) (Scorpion 4) (set 13)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mgrm ,sc4mgr, sc4_200_4r, sc4, sc4_state, sc4mgrm, ROT0, "BFM","Money Go Round Casino (Bellfruit) (Scorpion 4) (set 14)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4mgrb ,sc4mgr, sc4_200_4r, sc4, sc4_state, sc4mgrm, ROT0, "BFM","Money Go Round Casino (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mgrc ,sc4mgr, sc4_200_4r, sc4, sc4_state, sc4mgrm, ROT0, "BFM","Money Go Round Casino (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mgrd ,sc4mgr, sc4_200_4r, sc4, sc4_state, sc4mgrm, ROT0, "BFM","Money Go Round Casino (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mgre ,sc4mgr, sc4_200_4r, sc4, sc4_state, sc4mgrm, ROT0, "BFM","Money Go Round Casino (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mgrf ,sc4mgr, sc4_200_4r, sc4, sc4_state, sc4mgrm, ROT0, "BFM","Money Go Round Casino (Bellfruit) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mgrg ,sc4mgr, sc4_200_4r, sc4, sc4_state, sc4mgrm, ROT0, "BFM","Money Go Round Casino (Bellfruit) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mgrj ,sc4mgr, sc4_200_4r, sc4, sc4_state, sc4mgrm, ROT0, "BFM","Money Go Round Casino (Bellfruit) (Scorpion 4) (set 11)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mgrk ,sc4mgr, sc4_200_4r, sc4, sc4_state, sc4mgrm, ROT0, "BFM","Money Go Round Casino (Bellfruit) (Scorpion 4) (set 12)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mgrl ,sc4mgr, sc4_200_4r, sc4, sc4_state, sc4mgrm, ROT0, "BFM","Money Go Round Casino (Bellfruit) (Scorpion 4) (set 13)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mgrm ,sc4mgr, sc4_200_4r, sc4, sc4_state, sc4mgrm, ROT0, "BFM","Money Go Round Casino (Bellfruit) (Scorpion 4) (set 14)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -48515,21 +48517,21 @@ DRIVER_INIT_MEMBER(sc4_state,sc4mspid_mbus)
}
// PR1325 CASINO MONEY SPIDER PR1325 MONEYSPIDER SOUNDS11
-GAMEL( 200?, sc4mspid ,0, sc4_200_4r, sc4, sc4_state, sc4mspid, ROT0, "BFM","Casino Money Spider (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mspida ,sc4mspid, sc4_200_4r, sc4, sc4_state, sc4mspid, ROT0, "BFM","Casino Money Spider (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mspidb ,sc4mspid, sc4_200_4r, sc4, sc4_state, sc4mspid, ROT0, "BFM","Casino Money Spider (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mspidc ,sc4mspid, sc4_200_4r, sc4, sc4_state, sc4mspid, ROT0, "BFM","Casino Money Spider (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mspidd ,sc4mspid, sc4_200_4r, sc4, sc4_state, sc4mspid, ROT0, "BFM","Casino Money Spider (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mspide ,sc4mspid, sc4_200_4r, sc4, sc4_state, sc4mspid, ROT0, "BFM","Casino Money Spider (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mspidf ,sc4mspid, sc4_200_4r, sc4, sc4_state, sc4mspid, ROT0, "BFM","Casino Money Spider (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mspidg ,sc4mspid, sc4_200_4r, sc4, sc4_state, sc4mspid, ROT0, "BFM","Casino Money Spider (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mspidj ,sc4mspid, sc4_200_4r, sc4, sc4_state, sc4mspid, ROT0, "BFM","Casino Money Spider (Bellfruit) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mspidk ,sc4mspid, sc4_200_4r, sc4, sc4_state, sc4mspid, ROT0, "BFM","Casino Money Spider (Bellfruit) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mspidl ,sc4mspid, sc4_200_4r, sc4, sc4_state, sc4mspid, ROT0, "BFM","Casino Money Spider (Bellfruit) (Scorpion 4) (set 11)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mspidm ,sc4mspid, sc4_200_4r, sc4, sc4_state, sc4mspid, ROT0, "BFM","Casino Money Spider (Bellfruit) (Scorpion 4) (set 12)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4mspid ,0, sc4_200_4r, sc4, sc4_state, sc4mspid, ROT0, "BFM","Casino Money Spider (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mspida ,sc4mspid, sc4_200_4r, sc4, sc4_state, sc4mspid, ROT0, "BFM","Casino Money Spider (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mspidb ,sc4mspid, sc4_200_4r, sc4, sc4_state, sc4mspid, ROT0, "BFM","Casino Money Spider (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mspidc ,sc4mspid, sc4_200_4r, sc4, sc4_state, sc4mspid, ROT0, "BFM","Casino Money Spider (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mspidd ,sc4mspid, sc4_200_4r, sc4, sc4_state, sc4mspid, ROT0, "BFM","Casino Money Spider (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mspide ,sc4mspid, sc4_200_4r, sc4, sc4_state, sc4mspid, ROT0, "BFM","Casino Money Spider (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mspidf ,sc4mspid, sc4_200_4r, sc4, sc4_state, sc4mspid, ROT0, "BFM","Casino Money Spider (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mspidg ,sc4mspid, sc4_200_4r, sc4, sc4_state, sc4mspid, ROT0, "BFM","Casino Money Spider (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mspidj ,sc4mspid, sc4_200_4r, sc4, sc4_state, sc4mspid, ROT0, "BFM","Casino Money Spider (Bellfruit) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mspidk ,sc4mspid, sc4_200_4r, sc4, sc4_state, sc4mspid, ROT0, "BFM","Casino Money Spider (Bellfruit) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mspidl ,sc4mspid, sc4_200_4r, sc4, sc4_state, sc4mspid, ROT0, "BFM","Casino Money Spider (Bellfruit) (Scorpion 4) (set 11)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mspidm ,sc4mspid, sc4_200_4r, sc4, sc4_state, sc4mspid, ROT0, "BFM","Casino Money Spider (Bellfruit) (Scorpion 4) (set 12)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR1325 CASINO MONEY SPIDER MONEY SPIDER ARCADE PR1325 MONEYSPIDER SOUNDS11
-GAMEL( 200?, sc4mspidh ,sc4mspid, sc4_200_4r, sc4, sc4_state, sc4mspid_mbus, ROT0, "BFM","Casino Money Spider (Bellfruit) (Scorpion 4) (set 13)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mspidi ,sc4mspid, sc4_200_4r, sc4, sc4_state, sc4mspid_mbus, ROT0, "BFM","Casino Money Spider (Bellfruit) (Scorpion 4) (set 14)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4mspidh ,sc4mspid, sc4_200_4r, sc4, sc4_state, sc4mspid_mbus, ROT0, "BFM","Casino Money Spider (Bellfruit) (Scorpion 4) (set 13)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mspidi ,sc4mspid, sc4_200_4r, sc4, sc4_state, sc4mspid_mbus, ROT0, "BFM","Casino Money Spider (Bellfruit) (Scorpion 4) (set 14)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -48539,14 +48541,14 @@ DRIVER_INIT_MEMBER(sc4_state,sc4msclb)
}
// PR1040 MONEY SPINNER PR1040 MON S CLUB SOUNDS11
-GAMEL( 200?, sc4msclb ,0, sc4_200_4r, sc4, sc4_state, sc4msclb, ROT0, "BFM","Money Spinner Club (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4msclba ,sc4msclb, sc4_200_4r, sc4, sc4_state, sc4msclb, ROT0, "BFM","Money Spinner Club (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4msclbb ,sc4msclb, sc4_200_4r, sc4, sc4_state, sc4msclb, ROT0, "BFM","Money Spinner Club (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4msclbc ,sc4msclb, sc4_200_4r, sc4, sc4_state, sc4msclb, ROT0, "BFM","Money Spinner Club (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4msclbd ,sc4msclb, sc4_200_4r, sc4, sc4_state, sc4msclb, ROT0, "BFM","Money Spinner Club (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4msclbe ,sc4msclb, sc4_200_4r, sc4, sc4_state, sc4msclb, ROT0, "BFM","Money Spinner Club (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4msclbf ,sc4msclb, sc4_200_4r, sc4, sc4_state, sc4msclb, ROT0, "BFM","Money Spinner Club (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4msclbg ,sc4msclb, sc4_200_4r, sc4, sc4_state, sc4msclb, ROT0, "BFM","Money Spinner Club (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4msclb ,0, sc4_200_4r, sc4, sc4_state, sc4msclb, ROT0, "BFM","Money Spinner Club (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4msclba ,sc4msclb, sc4_200_4r, sc4, sc4_state, sc4msclb, ROT0, "BFM","Money Spinner Club (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4msclbb ,sc4msclb, sc4_200_4r, sc4, sc4_state, sc4msclb, ROT0, "BFM","Money Spinner Club (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4msclbc ,sc4msclb, sc4_200_4r, sc4, sc4_state, sc4msclb, ROT0, "BFM","Money Spinner Club (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4msclbd ,sc4msclb, sc4_200_4r, sc4, sc4_state, sc4msclb, ROT0, "BFM","Money Spinner Club (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4msclbe ,sc4msclb, sc4_200_4r, sc4, sc4_state, sc4msclb, ROT0, "BFM","Money Spinner Club (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4msclbf ,sc4msclb, sc4_200_4r, sc4, sc4_state, sc4msclb, ROT0, "BFM","Money Spinner Club (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4msclbg ,sc4msclb, sc4_200_4r, sc4, sc4_state, sc4msclb, ROT0, "BFM","Money Spinner Club (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -48557,18 +48559,18 @@ DRIVER_INIT_MEMBER(sc4_state,sc4mtb)
}
// PR6803 MONEY TO BURN PR6803 BURN SOUNDS11
-GAMEL( 200?, sc4mtb ,0, sc4_4reel, sc4, sc4_state, sc4mtb, ROT0, "BFM","Money To Burn (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mtba ,sc4mtb, sc4_4reel, sc4, sc4_state, sc4mtb, ROT0, "BFM","Money To Burn (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mtbb ,sc4mtb, sc4_4reel, sc4, sc4_state, sc4mtb, ROT0, "BFM","Money To Burn (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mtbe ,sc4mtb, sc4_4reel, sc4, sc4_state, sc4mtb, ROT0, "BFM","Money To Burn (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mtbf ,sc4mtb, sc4_4reel, sc4, sc4_state, sc4mtb, ROT0, "BFM","Money To Burn (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mtbg ,sc4mtb, sc4_4reel, sc4, sc4_state, sc4mtb, ROT0, "BFM","Money To Burn (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mtbj ,sc4mtb, sc4_4reel, sc4, sc4_state, sc4mtb, ROT0, "BFM","Money To Burn (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4mtb ,0, sc4_4reel, sc4, sc4_state, sc4mtb, ROT0, "BFM","Money To Burn (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mtba ,sc4mtb, sc4_4reel, sc4, sc4_state, sc4mtb, ROT0, "BFM","Money To Burn (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mtbb ,sc4mtb, sc4_4reel, sc4, sc4_state, sc4mtb, ROT0, "BFM","Money To Burn (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mtbe ,sc4mtb, sc4_4reel, sc4, sc4_state, sc4mtb, ROT0, "BFM","Money To Burn (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mtbf ,sc4mtb, sc4_4reel, sc4, sc4_state, sc4mtb, ROT0, "BFM","Money To Burn (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mtbg ,sc4mtb, sc4_4reel, sc4, sc4_state, sc4mtb, ROT0, "BFM","Money To Burn (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mtbj ,sc4mtb, sc4_4reel, sc4, sc4_state, sc4mtb, ROT0, "BFM","Money To Burn (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR4603 MONEY TO BURN SP98 PR6803 BURN SOUNDS11
-GAMEL( 200?, sc4mtbc ,sc4mtb, sc4_4reel, sc4, sc4_state, sc4mtb, ROT0, "BFM","Money To Burn SP98 (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mtbd ,sc4mtb, sc4_4reel, sc4, sc4_state, sc4mtb, ROT0, "BFM","Money To Burn SP98 (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mtbh ,sc4mtb, sc4_4reel, sc4, sc4_state, sc4mtb, ROT0, "BFM","Money To Burn SP98 (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mtbi ,sc4mtb, sc4_4reel, sc4, sc4_state, sc4mtb, ROT0, "BFM","Money To Burn SP98 (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4mtbc ,sc4mtb, sc4_4reel, sc4, sc4_state, sc4mtb, ROT0, "BFM","Money To Burn SP98 (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mtbd ,sc4mtb, sc4_4reel, sc4, sc4_state, sc4mtb, ROT0, "BFM","Money To Burn SP98 (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mtbh ,sc4mtb, sc4_4reel, sc4, sc4_state, sc4mtb, ROT0, "BFM","Money To Burn SP98 (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mtbi ,sc4mtb, sc4_4reel, sc4, sc4_state, sc4mtb, ROT0, "BFM","Money To Burn SP98 (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4mtbcl)
@@ -48578,22 +48580,22 @@ DRIVER_INIT_MEMBER(sc4_state,sc4mtbcl)
// PR6932 CLUB MONEY TO BURN PR6932 BURN SOUNDS11
-GAMEL( 200?, sc4mtbcl ,0, sc4_5reel, sc4, sc4_state, sc4mtbcl, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mtbcla ,sc4mtbcl, sc4_5reel, sc4, sc4_state, sc4mtbcl, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mtbclb ,sc4mtbcl, sc4_5reel, sc4, sc4_state, sc4mtbcl, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mtbclc ,sc4mtbcl, sc4_5reel, sc4, sc4_state, sc4mtbcl, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mtbcld ,sc4mtbcl, sc4_5reel, sc4, sc4_state, sc4mtbcl, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mtbcle ,sc4mtbcl, sc4_5reel, sc4, sc4_state, sc4mtbcl, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mtbclf ,sc4mtbcl, sc4_5reel, sc4, sc4_state, sc4mtbcl, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mtbclg ,sc4mtbcl, sc4_5reel, sc4, sc4_state, sc4mtbcl, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mtbclh ,sc4mtbcl, sc4_5reel, sc4, sc4_state, sc4mtbcl, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mtbcli ,sc4mtbcl, sc4_5reel, sc4, sc4_state, sc4mtbcl, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mtbclj ,sc4mtbcl, sc4_5reel, sc4, sc4_state, sc4mtbcl, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 11)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mtbclk ,sc4mtbcl, sc4_5reel, sc4, sc4_state, sc4mtbcl, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 12)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mtbcll ,sc4mtbcl, sc4_5reel, sc4, sc4_state, sc4mtbcl, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 13)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mtbclm ,sc4mtbcl, sc4_5reel, sc4, sc4_state, sc4mtbcl, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 14)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mtbcln ,sc4mtbcl, sc4_5reel, sc4, sc4_state, sc4mtbcl, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 15)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mtbclo ,sc4mtbcl, sc4_5reel, sc4, sc4_state, sc4mtbcl, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 16)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4mtbcl ,0, sc4_5reel, sc4, sc4_state, sc4mtbcl, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mtbcla ,sc4mtbcl, sc4_5reel, sc4, sc4_state, sc4mtbcl, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mtbclb ,sc4mtbcl, sc4_5reel, sc4, sc4_state, sc4mtbcl, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mtbclc ,sc4mtbcl, sc4_5reel, sc4, sc4_state, sc4mtbcl, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mtbcld ,sc4mtbcl, sc4_5reel, sc4, sc4_state, sc4mtbcl, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mtbcle ,sc4mtbcl, sc4_5reel, sc4, sc4_state, sc4mtbcl, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mtbclf ,sc4mtbcl, sc4_5reel, sc4, sc4_state, sc4mtbcl, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mtbclg ,sc4mtbcl, sc4_5reel, sc4, sc4_state, sc4mtbcl, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mtbclh ,sc4mtbcl, sc4_5reel, sc4, sc4_state, sc4mtbcl, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mtbcli ,sc4mtbcl, sc4_5reel, sc4, sc4_state, sc4mtbcl, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mtbclj ,sc4mtbcl, sc4_5reel, sc4, sc4_state, sc4mtbcl, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 11)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mtbclk ,sc4mtbcl, sc4_5reel, sc4, sc4_state, sc4mtbcl, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 12)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mtbcll ,sc4mtbcl, sc4_5reel, sc4, sc4_state, sc4mtbcl, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 13)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mtbclm ,sc4mtbcl, sc4_5reel, sc4, sc4_state, sc4mtbcl, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 14)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mtbcln ,sc4mtbcl, sc4_5reel, sc4, sc4_state, sc4mtbcl, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 15)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4mtbclo ,sc4mtbcl, sc4_5reel, sc4, sc4_state, sc4mtbcl, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 16)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -48604,8 +48606,8 @@ DRIVER_INIT_MEMBER(sc4_state,sc4mono5)
DRIVER_INIT_CALL(sc4);
}
-GAMEL( 200?, sc4mono5 ,0, sc4_3reel_200, sc4, sc4_state, sc4mono5, ROT0, "Mazooma","Monopoly 5 (PR7089, MONF) (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // PR7089 MONO 5 MONO SOUNDS MONOPOLY
-GAMEL( 200?, sc4mono5a ,sc4mono5, sc4_3reel_200, sc4, sc4_state, sc4mono5, ROT0, "Mazooma","Monopoly 5 (PR7089, MONF) (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // PR7089 MONO 5 MONO SOUNDS MONOPOLY
+GAMEL( 200?, sc4mono5 ,0, sc4_3reel_200, sc4, sc4_state, sc4mono5, ROT0, "Mazooma","Monopoly 5 (PR7089, MONF) (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // PR7089 MONO 5 MONO SOUNDS MONOPOLY
+GAMEL( 200?, sc4mono5a ,sc4mono5, sc4_3reel_200, sc4, sc4_state, sc4mono5, ROT0, "Mazooma","Monopoly 5 (PR7089, MONF) (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // PR7089 MONO 5 MONO SOUNDS MONOPOLY
@@ -48621,26 +48623,26 @@ DRIVER_INIT_MEMBER(sc4_state,sc4monoa_mbus)
DRIVER_INIT_CALL(sc4mbus);
}
-GAMEL( 200?, sc4monoa ,0, sc4_3reel_200, sc4, sc4_state, sc4monoa_mbus, ROT0, "Mazooma","Monopoly Triple (PR2122, MOTR) (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // PR2122 MONOPOLY MONOPOLY TRIPLE ARCADE MONO SOUNDS MONOPOLY
-GAMEL( 200?, sc4monoaa ,sc4monoa, sc4_3reel_200, sc4, sc4_state, sc4monoa_mbus, ROT0, "Mazooma","Monopoly Triple (PR2122, MOTR) (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // ^^
-GAMEL( 200?, sc4monoad ,sc4monoa, sc4_3reel_200, sc4, sc4_state, sc4monoa_mbus, ROT0, "Mazooma","Monopoly Triple (PR2122, MOTR) (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // ^^
-GAMEL( 200?, sc4monoae ,sc4monoa, sc4_3reel_200, sc4, sc4_state, sc4monoa_mbus, ROT0, "Mazooma","Monopoly Triple (PR2122, MOTR) (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // ^^
-GAMEL( 200?, sc4monoaf ,sc4monoa, sc4_3reel_200, sc4, sc4_state, sc4monoa_mbus, ROT0, "Mazooma","Monopoly Triple (PR2122, MOTR) (Mazooma) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // ^^
-GAMEL( 200?, sc4monoag ,sc4monoa, sc4_3reel_200, sc4, sc4_state, sc4monoa_mbus, ROT0, "Mazooma","Monopoly Triple (PR2122, MOTR) (Mazooma) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // ^^
+GAMEL( 200?, sc4monoa ,0, sc4_3reel_200, sc4, sc4_state, sc4monoa_mbus, ROT0, "Mazooma","Monopoly Triple (PR2122, MOTR) (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // PR2122 MONOPOLY MONOPOLY TRIPLE ARCADE MONO SOUNDS MONOPOLY
+GAMEL( 200?, sc4monoaa ,sc4monoa, sc4_3reel_200, sc4, sc4_state, sc4monoa_mbus, ROT0, "Mazooma","Monopoly Triple (PR2122, MOTR) (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // ^^
+GAMEL( 200?, sc4monoad ,sc4monoa, sc4_3reel_200, sc4, sc4_state, sc4monoa_mbus, ROT0, "Mazooma","Monopoly Triple (PR2122, MOTR) (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 ) // ^^
+GAMEL( 200?, sc4monoae ,sc4monoa, sc4_3reel_200, sc4, sc4_state, sc4monoa_mbus, ROT0, "Mazooma","Monopoly Triple (PR2122, MOTR) (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 ) // ^^
+GAMEL( 200?, sc4monoaf ,sc4monoa, sc4_3reel_200, sc4, sc4_state, sc4monoa_mbus, ROT0, "Mazooma","Monopoly Triple (PR2122, MOTR) (Mazooma) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 ) // ^^
+GAMEL( 200?, sc4monoag ,sc4monoa, sc4_3reel_200, sc4, sc4_state, sc4monoa_mbus, ROT0, "Mazooma","Monopoly Triple (PR2122, MOTR) (Mazooma) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 ) // ^^
// PAY UNIT ERR 17
-GAMEL( 200?, sc4monoab ,sc4monoa, sc4_3reel_200, sc4, sc4_state, sc4monoa, ROT0, "Mazooma","Monopoly Triple (PR2122, MOTR) (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // ^^
-GAMEL( 200?, sc4monoac ,sc4monoa, sc4_3reel_200, sc4, sc4_state, sc4monoa, ROT0, "Mazooma","Monopoly Triple (PR2122, MOTR) (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // ^^
-GAMEL( 200?, sc4monoah ,sc4monoa, sc4_3reel_200, sc4, sc4_state, sc4monoa, ROT0, "Mazooma","Monopoly Triple (PR2122, MOTR) (Mazooma) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // ^^
-GAMEL( 200?, sc4monoai ,sc4monoa, sc4_3reel_200, sc4, sc4_state, sc4monoa, ROT0, "Mazooma","Monopoly Triple (PR2122, MOTR) (Mazooma) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
-GAMEL( 200?, sc4monoaj ,sc4monoa, sc4_3reel_200, sc4, sc4_state, sc4monoa, ROT0, "Mazooma","Monopoly Triple (PR2122, MOTR) (Mazooma) (Scorpion 4) (set 11)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
-GAMEL( 200?, sc4monoak ,sc4monoa, sc4_3reel_200, sc4, sc4_state, sc4monoa, ROT0, "Mazooma","Monopoly Triple (PR2122, MOTR) (Mazooma) (Scorpion 4) (set 12)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4monoab ,sc4monoa, sc4_3reel_200, sc4, sc4_state, sc4monoa, ROT0, "Mazooma","Monopoly Triple (PR2122, MOTR) (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 ) // ^^
+GAMEL( 200?, sc4monoac ,sc4monoa, sc4_3reel_200, sc4, sc4_state, sc4monoa, ROT0, "Mazooma","Monopoly Triple (PR2122, MOTR) (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 ) // ^^
+GAMEL( 200?, sc4monoah ,sc4monoa, sc4_3reel_200, sc4, sc4_state, sc4monoa, ROT0, "Mazooma","Monopoly Triple (PR2122, MOTR) (Mazooma) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 ) // ^^
+GAMEL( 200?, sc4monoai ,sc4monoa, sc4_3reel_200, sc4, sc4_state, sc4monoa, ROT0, "Mazooma","Monopoly Triple (PR2122, MOTR) (Mazooma) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4monoaj ,sc4monoa, sc4_3reel_200, sc4, sc4_state, sc4monoa, ROT0, "Mazooma","Monopoly Triple (PR2122, MOTR) (Mazooma) (Scorpion 4) (set 11)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4monoak ,sc4monoa, sc4_3reel_200, sc4, sc4_state, sc4monoa, ROT0, "Mazooma","Monopoly Triple (PR2122, MOTR) (Mazooma) (Scorpion 4) (set 12)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
-GAMEL( 200?, sc4monoal ,sc4monoa, sc4_3reel_200, sc4, sc4_state, sc4monoa, ROT0, "Mazooma","Monopoly Triple (PR2122, MOTR) (Mazooma) (Scorpion 4) (set 13)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// PR2122 MONOPOLY MONOPOLY TRIPLE ARCADE MONOPOLY TRIPLE
-GAMEL( 200?, sc4monoam ,sc4monoa, sc4_3reel_200, sc4, sc4_state, sc4monoa, ROT0, "Mazooma","Monopoly Triple (PR2122, MOTR) (Mazooma) (Scorpion 4) (set 14)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
-GAMEL( 200?, sc4monoan ,sc4monoa, sc4_3reel_200, sc4, sc4_state, sc4monoa, ROT0, "Mazooma","Monopoly Triple (PR2122, MOTR) (Mazooma) (Scorpion 4) (set 15)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// PR2122 MONOPOLY MONO SOUNDS MONOPOLY
-GAMEL( 200?, sc4monoao ,sc4monoa, sc4_3reel_200, sc4, sc4_state, sc4monoa, ROT0, "Mazooma","Monopoly Triple (PR2122, MOTR) (Mazooma) (Scorpion 4) (set 16)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
-GAMEL( 200?, sc4monoap ,sc4monoa, sc4_3reel_200, sc4, sc4_state, sc4monoa, ROT0, "Mazooma","Monopoly Triple (PR2122, MOTR) (Mazooma) (Scorpion 4) (set 17)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
-GAMEL( 200?, sc4monoaq ,sc4monoa, sc4_3reel_200, sc4, sc4_state, sc4monoa, ROT0, "Mazooma","Monopoly Triple (PR2122, MOTR) (Mazooma) (Scorpion 4) (set 18)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4monoal ,sc4monoa, sc4_3reel_200, sc4, sc4_state, sc4monoa, ROT0, "Mazooma","Monopoly Triple (PR2122, MOTR) (Mazooma) (Scorpion 4) (set 13)", MACHINE_FLAGS, layout_bfm_sc4 )// PR2122 MONOPOLY MONOPOLY TRIPLE ARCADE MONOPOLY TRIPLE
+GAMEL( 200?, sc4monoam ,sc4monoa, sc4_3reel_200, sc4, sc4_state, sc4monoa, ROT0, "Mazooma","Monopoly Triple (PR2122, MOTR) (Mazooma) (Scorpion 4) (set 14)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4monoan ,sc4monoa, sc4_3reel_200, sc4, sc4_state, sc4monoa, ROT0, "Mazooma","Monopoly Triple (PR2122, MOTR) (Mazooma) (Scorpion 4) (set 15)", MACHINE_FLAGS, layout_bfm_sc4 )// PR2122 MONOPOLY MONO SOUNDS MONOPOLY
+GAMEL( 200?, sc4monoao ,sc4monoa, sc4_3reel_200, sc4, sc4_state, sc4monoa, ROT0, "Mazooma","Monopoly Triple (PR2122, MOTR) (Mazooma) (Scorpion 4) (set 16)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4monoap ,sc4monoa, sc4_3reel_200, sc4, sc4_state, sc4monoa, ROT0, "Mazooma","Monopoly Triple (PR2122, MOTR) (Mazooma) (Scorpion 4) (set 17)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4monoaq ,sc4monoa, sc4_3reel_200, sc4, sc4_state, sc4monoa, ROT0, "Mazooma","Monopoly Triple (PR2122, MOTR) (Mazooma) (Scorpion 4) (set 18)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
DRIVER_INIT_MEMBER(sc4_state,sc4monop)
@@ -48648,34 +48650,34 @@ DRIVER_INIT_MEMBER(sc4_state,sc4monop)
DRIVER_INIT_CALL(sc4);
}
-GAMEL( 200?, sc4monop ,sc4monoa, sc4_3reel, sc4, sc4_state, sc4monop, ROT0, "Mazooma","Monopoly Triple (PR2056, TBOX) (Mazooma) (Scorpion 4) (Top Box, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // PR2056 MONOP TRIPLE MONO SOUNDS MONOP TRIPLE
-GAMEL( 200?, sc4monopa ,sc4monoa, sc4_3reel, sc4, sc4_state, sc4monop, ROT0, "Mazooma","Monopoly Triple (PR2056, TBOX) (Mazooma) (Scorpion 4) (Top Box, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // PR2056 MONOP TRIPLE MONO SOUNDS MONOP TRIPLE
+GAMEL( 200?, sc4monop ,sc4monoa, sc4_3reel, sc4, sc4_state, sc4monop, ROT0, "Mazooma","Monopoly Triple (PR2056, TBOX) (Mazooma) (Scorpion 4) (Top Box, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // PR2056 MONOP TRIPLE MONO SOUNDS MONOP TRIPLE
+GAMEL( 200?, sc4monopa ,sc4monoa, sc4_3reel, sc4, sc4_state, sc4monop, ROT0, "Mazooma","Monopoly Triple (PR2056, TBOX) (Mazooma) (Scorpion 4) (Top Box, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // PR2056 MONOP TRIPLE MONO SOUNDS MONOP TRIPLE
// I think this is different to the above, this is GM** (Grand Monopoly?)
-GAMEL( 200?, sc4mcas ,0, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (GMBU, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // PR2354 MONOPOLY CASINO MONOPOLY TRIPLE MAZ MONO SOUNDS MONOPOLY
-GAMEL( 200?, sc4mcasm ,sc4mcas, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (GMBU, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // ^^
-GAMEL( 200?, sc4mcasn ,sc4mcas, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (GMBU, set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // ^^
-GAMEL( 200?, sc4mcaso ,sc4mcas, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (GMBU, set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // ^^
-GAMEL( 200?, sc4mcasp ,sc4mcas, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (GMBU, set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // ^^
-GAMEL( 200?, sc4mcasq ,sc4mcas, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (GMBU, set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // ^^
-GAMEL( 200?, sc4mcasr ,sc4mcas, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (GMBU, set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // ^^
-GAMEL( 200?, sc4mcass ,sc4mcas, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (GMBU, set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // ^^
-GAMEL( 200?, sc4mcast ,sc4mcas, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (GMBU, set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // ^^
-GAMEL( 200?, sc4mcasv ,sc4mcas, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (GMBU, set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
-GAMEL( 200?, sc4mcasw ,sc4mcas, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (GMBU, set 11)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
-GAMEL( 200?, sc4mcasx ,sc4mcas, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (GMBU, set 12)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
-GAMEL( 200?, sc4mcasy ,sc4mcas, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (GMBU, set 13)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
-GAMEL( 200?, sc4mcasz ,sc4mcas, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (GMBU, set 14)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
-GAMEL( 200?, sc4mcas0 ,sc4mcas, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (GMBU, set 15)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
-GAMEL( 200?, sc4mcas1 ,sc4mcas, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (GMBU, set 16)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
-GAMEL( 200?, sc4mcas2 ,sc4mcas, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (GMBU, set 17)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
-GAMEL( 200?, sc4mcas3 ,sc4mcas, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (GMBU, set 18)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4mcas ,0, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (GMBU, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // PR2354 MONOPOLY CASINO MONOPOLY TRIPLE MAZ MONO SOUNDS MONOPOLY
+GAMEL( 200?, sc4mcasm ,sc4mcas, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (GMBU, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // ^^
+GAMEL( 200?, sc4mcasn ,sc4mcas, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (GMBU, set 3)", MACHINE_FLAGS, layout_bfm_sc4 ) // ^^
+GAMEL( 200?, sc4mcaso ,sc4mcas, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (GMBU, set 4)", MACHINE_FLAGS, layout_bfm_sc4 ) // ^^
+GAMEL( 200?, sc4mcasp ,sc4mcas, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (GMBU, set 5)", MACHINE_FLAGS, layout_bfm_sc4 ) // ^^
+GAMEL( 200?, sc4mcasq ,sc4mcas, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (GMBU, set 6)", MACHINE_FLAGS, layout_bfm_sc4 ) // ^^
+GAMEL( 200?, sc4mcasr ,sc4mcas, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (GMBU, set 7)", MACHINE_FLAGS, layout_bfm_sc4 ) // ^^
+GAMEL( 200?, sc4mcass ,sc4mcas, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (GMBU, set 8)", MACHINE_FLAGS, layout_bfm_sc4 ) // ^^
+GAMEL( 200?, sc4mcast ,sc4mcas, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (GMBU, set 9)", MACHINE_FLAGS, layout_bfm_sc4 ) // ^^
+GAMEL( 200?, sc4mcasv ,sc4mcas, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (GMBU, set 10)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4mcasw ,sc4mcas, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (GMBU, set 11)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4mcasx ,sc4mcas, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (GMBU, set 12)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4mcasy ,sc4mcas, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (GMBU, set 13)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4mcasz ,sc4mcas, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (GMBU, set 14)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4mcas0 ,sc4mcas, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (GMBU, set 15)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4mcas1 ,sc4mcas, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (GMBU, set 16)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4mcas2 ,sc4mcas, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (GMBU, set 17)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
+GAMEL( 200?, sc4mcas3 ,sc4mcas, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (GMBU, set 18)", MACHINE_FLAGS, layout_bfm_sc4 )// ^^
// these have a different internal code compared to the PR2056 sets above which strongly indicates they're for the 'GMBU' sets above
-GAMEL( 200?, sc4mcask ,sc4mcas, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly Casino (PR2056) (Mazooma) (Scorpion 4) (GMTB, Top Box, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // PR2056 MONOP TRIPLE MONO SOUNDS MONOP TRIPLE
-GAMEL( 200?, sc4mcasu ,sc4mcas, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly Casino (PR2056) (Mazooma) (Scorpion 4) (GMTB, Top Box, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // ^^
-GAMEL( 200?, sc4mcas4 ,sc4mcas, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly Casino (PR2056) (Mazooma) (Scorpion 4) (GMTB, Top Box, set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // ^^
+GAMEL( 200?, sc4mcask ,sc4mcas, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly Casino (PR2056) (Mazooma) (Scorpion 4) (GMTB, Top Box, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // PR2056 MONOP TRIPLE MONO SOUNDS MONOP TRIPLE
+GAMEL( 200?, sc4mcasu ,sc4mcas, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly Casino (PR2056) (Mazooma) (Scorpion 4) (GMTB, Top Box, set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // ^^
+GAMEL( 200?, sc4mcas4 ,sc4mcas, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly Casino (PR2056) (Mazooma) (Scorpion 4) (GMTB, Top Box, set 3)", MACHINE_FLAGS, layout_bfm_sc4 ) // ^^
@@ -48687,9 +48689,9 @@ DRIVER_INIT_MEMBER(sc4_state,sc4pacqp)
// PR7072 PAC MAN PACP SOUNDS PAC-MAN
-GAMEL( 200?, sc4pacqp ,0, sc4_4reel, sc4, sc4_state, sc4pacqp, ROT0, "QPS","Pac Man (PR7072, QPAC) (QPS) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pacqpa ,sc4pacqp, sc4_4reel, sc4, sc4_state, sc4pacqp, ROT0, "QPS","Pac Man (PR7072, QPAC) (QPS) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pacqpb ,sc4pacqp, sc4_4reel, sc4, sc4_state, sc4pacqp, ROT0, "QPS","Pac Man (PR7072, QPAC) (QPS) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4pacqp ,0, sc4_4reel, sc4, sc4_state, sc4pacqp, ROT0, "QPS","Pac Man (PR7072, QPAC) (QPS) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pacqpa ,sc4pacqp, sc4_4reel, sc4, sc4_state, sc4pacqp, ROT0, "QPS","Pac Man (PR7072, QPAC) (QPS) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pacqpb ,sc4pacqp, sc4_4reel, sc4, sc4_state, sc4pacqp, ROT0, "QPS","Pac Man (PR7072, QPAC) (QPS) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -48699,9 +48701,9 @@ DRIVER_INIT_MEMBER(sc4_state,sc4pacmn)
}
// PR7026 PACMAN PACMAN SOUNDS
-GAMEL( 200?, sc4pacmn ,0, sc4_4reel, sc4, sc4_state, sc4pacmn, ROT0, "Mazooma","Pac Man (PR7026, PMAN) (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // this set doesn't start, CPU ends up dead? - needs valid jackpot / stake keys
-GAMEL( 200?, sc4pacmna ,sc4pacmn, sc4_4reel, sc4, sc4_state, sc4pacmn, ROT0, "Mazooma","Pac Man (PR7026, PMAN) (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pacmnb ,sc4pacmn, sc4_4reel, sc4, sc4_state, sc4pacmn, ROT0, "Mazooma","Pac Man (PR7026, PMAN) (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4pacmn ,0, sc4_4reel, sc4, sc4_state, sc4pacmn, ROT0, "Mazooma","Pac Man (PR7026, PMAN) (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // this set doesn't start, CPU ends up dead? - needs valid jackpot / stake keys
+GAMEL( 200?, sc4pacmna ,sc4pacmn, sc4_4reel, sc4, sc4_state, sc4pacmn, ROT0, "Mazooma","Pac Man (PR7026, PMAN) (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pacmnb ,sc4pacmn, sc4_4reel, sc4, sc4_state, sc4pacmn, ROT0, "Mazooma","Pac Man (PR7026, PMAN) (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -48717,19 +48719,19 @@ DRIVER_INIT_MEMBER(sc4_state,sc4paccs_mbus)
}
// PR7049CASINO PACMAN PACMAN SOUNDS
-GAMEL( 200?, sc4paccs ,0, sc4_4reel, sc4, sc4_state, sc4paccs, ROT0, "Mazooma","Pac Man Casino (PR7049, PACL) (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4paccsa ,sc4paccs, sc4_4reel, sc4, sc4_state, sc4paccs, ROT0, "Mazooma","Pac Man Casino (PR7049, PACL) (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4paccsb ,sc4paccs, sc4_4reel, sc4, sc4_state, sc4paccs, ROT0, "Mazooma","Pac Man Casino (PR7049, PACL) (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4paccsc ,sc4paccs, sc4_4reel, sc4, sc4_state, sc4paccs, ROT0, "Mazooma","Pac Man Casino (PR7049, PACL) (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4paccsd ,sc4paccs, sc4_4reel, sc4, sc4_state, sc4paccs, ROT0, "Mazooma","Pac Man Casino (PR7049, PACL) (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4paccse ,sc4paccs, sc4_4reel, sc4, sc4_state, sc4paccs, ROT0, "Mazooma","Pac Man Casino (PR7049, PACL) (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4paccsf ,sc4paccs, sc4_4reel, sc4, sc4_state, sc4paccs, ROT0, "Mazooma","Pac Man Casino (PR7049, PACL) (Mazooma) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4paccsg ,sc4paccs, sc4_4reel, sc4, sc4_state, sc4paccs, ROT0, "Mazooma","Pac Man Casino (PR7049, PACL) (Mazooma) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4paccsj ,sc4paccs, sc4_4reel, sc4, sc4_state, sc4paccs, ROT0, "Mazooma","Pac Man Casino (PR7049, PACL) (Mazooma) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4paccsk ,sc4paccs, sc4_4reel, sc4, sc4_state, sc4paccs, ROT0, "Mazooma","Pac Man Casino (PR7049, PACL) (Mazooma) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4paccsl ,sc4paccs, sc4_4reel, sc4, sc4_state, sc4paccs, ROT0, "Mazooma","Pac Man Casino (PR7049, PACL) (Mazooma) (Scorpion 4) (set 11)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4paccsh ,sc4paccs, sc4_4reel, sc4, sc4_state, sc4paccs_mbus, ROT0, "Mazooma","Pac Man Casino (PR7049, PACL) (Mazooma) (Scorpion 4) (set 12)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4paccsi ,sc4paccs, sc4_4reel, sc4, sc4_state, sc4paccs_mbus, ROT0, "Mazooma","Pac Man Casino (PR7049, PACL) (Mazooma) (Scorpion 4) (set 13)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4paccs ,0, sc4_4reel, sc4, sc4_state, sc4paccs, ROT0, "Mazooma","Pac Man Casino (PR7049, PACL) (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4paccsa ,sc4paccs, sc4_4reel, sc4, sc4_state, sc4paccs, ROT0, "Mazooma","Pac Man Casino (PR7049, PACL) (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4paccsb ,sc4paccs, sc4_4reel, sc4, sc4_state, sc4paccs, ROT0, "Mazooma","Pac Man Casino (PR7049, PACL) (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4paccsc ,sc4paccs, sc4_4reel, sc4, sc4_state, sc4paccs, ROT0, "Mazooma","Pac Man Casino (PR7049, PACL) (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4paccsd ,sc4paccs, sc4_4reel, sc4, sc4_state, sc4paccs, ROT0, "Mazooma","Pac Man Casino (PR7049, PACL) (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4paccse ,sc4paccs, sc4_4reel, sc4, sc4_state, sc4paccs, ROT0, "Mazooma","Pac Man Casino (PR7049, PACL) (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4paccsf ,sc4paccs, sc4_4reel, sc4, sc4_state, sc4paccs, ROT0, "Mazooma","Pac Man Casino (PR7049, PACL) (Mazooma) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4paccsg ,sc4paccs, sc4_4reel, sc4, sc4_state, sc4paccs, ROT0, "Mazooma","Pac Man Casino (PR7049, PACL) (Mazooma) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4paccsj ,sc4paccs, sc4_4reel, sc4, sc4_state, sc4paccs, ROT0, "Mazooma","Pac Man Casino (PR7049, PACL) (Mazooma) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4paccsk ,sc4paccs, sc4_4reel, sc4, sc4_state, sc4paccs, ROT0, "Mazooma","Pac Man Casino (PR7049, PACL) (Mazooma) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4paccsl ,sc4paccs, sc4_4reel, sc4, sc4_state, sc4paccs, ROT0, "Mazooma","Pac Man Casino (PR7049, PACL) (Mazooma) (Scorpion 4) (set 11)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4paccsh ,sc4paccs, sc4_4reel, sc4, sc4_state, sc4paccs_mbus, ROT0, "Mazooma","Pac Man Casino (PR7049, PACL) (Mazooma) (Scorpion 4) (set 12)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4paccsi ,sc4paccs, sc4_4reel, sc4, sc4_state, sc4paccs_mbus, ROT0, "Mazooma","Pac Man Casino (PR7049, PACL) (Mazooma) (Scorpion 4) (set 13)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -48740,15 +48742,15 @@ DRIVER_INIT_MEMBER(sc4_state,sc4pacpl)
}
// PR7058 PACMAN PACP SOUNDS PACMAN PLUS
-GAMEL( 200?, sc4pacpl ,0, sc4_5reel, sc4, sc4_state, sc4pacpl, ROT0, "Mazooma","Pac Man Plus (PR7058, PACP) (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pacpla ,sc4pacpl, sc4_5reel, sc4, sc4_state, sc4pacpl, ROT0, "Mazooma","Pac Man Plus (PR7058, PACP) (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pacplb ,sc4pacpl, sc4_5reel, sc4, sc4_state, sc4pacpl, ROT0, "Mazooma","Pac Man Plus (PR7058, PACP) (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pacplc ,sc4pacpl, sc4_5reel, sc4, sc4_state, sc4pacpl, ROT0, "Mazooma","Pac Man Plus (PR7058, PACP) (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pacpld ,sc4pacpl, sc4_5reel, sc4, sc4_state, sc4pacpl, ROT0, "Mazooma","Pac Man Plus (PR7058, PACP) (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pacple ,sc4pacpl, sc4_5reel, sc4, sc4_state, sc4pacpl, ROT0, "Mazooma","Pac Man Plus (PR7058, PACP) (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pacplf ,sc4pacpl, sc4_5reel, sc4, sc4_state, sc4pacpl, ROT0, "Mazooma","Pac Man Plus (PR7058, PACP) (Mazooma) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pacplg ,sc4pacpl, sc4_5reel, sc4, sc4_state, sc4pacpl, ROT0, "Mazooma","Pac Man Plus (PR7058, PACP) (Mazooma) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pacplh ,sc4pacpl, sc4_5reel, sc4, sc4_state, sc4pacpl, ROT0, "Mazooma","Pac Man Plus (PR7058, PACP) (Mazooma) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4pacpl ,0, sc4_5reel, sc4, sc4_state, sc4pacpl, ROT0, "Mazooma","Pac Man Plus (PR7058, PACP) (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pacpla ,sc4pacpl, sc4_5reel, sc4, sc4_state, sc4pacpl, ROT0, "Mazooma","Pac Man Plus (PR7058, PACP) (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pacplb ,sc4pacpl, sc4_5reel, sc4, sc4_state, sc4pacpl, ROT0, "Mazooma","Pac Man Plus (PR7058, PACP) (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pacplc ,sc4pacpl, sc4_5reel, sc4, sc4_state, sc4pacpl, ROT0, "Mazooma","Pac Man Plus (PR7058, PACP) (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pacpld ,sc4pacpl, sc4_5reel, sc4, sc4_state, sc4pacpl, ROT0, "Mazooma","Pac Man Plus (PR7058, PACP) (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pacple ,sc4pacpl, sc4_5reel, sc4, sc4_state, sc4pacpl, ROT0, "Mazooma","Pac Man Plus (PR7058, PACP) (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pacplf ,sc4pacpl, sc4_5reel, sc4, sc4_state, sc4pacpl, ROT0, "Mazooma","Pac Man Plus (PR7058, PACP) (Mazooma) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pacplg ,sc4pacpl, sc4_5reel, sc4, sc4_state, sc4pacpl, ROT0, "Mazooma","Pac Man Plus (PR7058, PACP) (Mazooma) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pacplh ,sc4pacpl, sc4_5reel, sc4, sc4_state, sc4pacpl, ROT0, "Mazooma","Pac Man Plus (PR7058, PACP) (Mazooma) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -48759,7 +48761,7 @@ DRIVER_INIT_MEMBER(sc4_state,sc4party)
}
// PR7151 PARTY TIME 1.02 95008113 G PARTYTIME SOUNDS11
-GAMEL( 200?, sc4party ,0, sc4_4reel, sc4, sc4_state, sc4party, ROT0, "Nova","Party Time (German) (PR7151, GPTM) (Nova) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4party ,0, sc4_4reel, sc4, sc4_state, sc4party, ROT0, "Nova","Party Time (German) (PR7151, GPTM) (Nova) (Scorpion 4)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -48772,11 +48774,11 @@ DRIVER_INIT_MEMBER(sc4_state,sc4polem)
// these are sensitive to the inputs, eg for sc4polemd 3:2 and 3:3 MUST be on or the CPU will crash again even if you reset after the initial MEMORY RESET
// I don't know how to boot the other sets, they also show different codes for each set (buggy startup code?)
// PR7009 POLE POSITION POLE POSITION SOUNDS
-GAMEL( 200?, sc4polem ,0, sc4_4reel, sc4, sc4_state, sc4polem, ROT0, "Mazooma","Pole Position (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4polema ,sc4polem, sc4_4reel, sc4, sc4_state, sc4polem, ROT0, "Mazooma","Pole Position (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4polemb ,sc4polem, sc4_4reel, sc4, sc4_state, sc4polem, ROT0, "Mazooma","Pole Position (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4polemc ,sc4polem, sc4_4reel, sc4, sc4_state, sc4polem, ROT0, "Mazooma","Pole Position (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4polemd ,sc4polem, sc4_4reel, sc4, sc4_state, sc4polem, ROT0, "Mazooma","Pole Position (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4polem ,0, sc4_4reel, sc4, sc4_state, sc4polem, ROT0, "Mazooma","Pole Position (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4polema ,sc4polem, sc4_4reel, sc4, sc4_state, sc4polem, ROT0, "Mazooma","Pole Position (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4polemb ,sc4polem, sc4_4reel, sc4, sc4_state, sc4polem, ROT0, "Mazooma","Pole Position (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4polemc ,sc4polem, sc4_4reel, sc4, sc4_state, sc4polem, ROT0, "Mazooma","Pole Position (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4polemd ,sc4polem, sc4_4reel, sc4, sc4_state, sc4polem, ROT0, "Mazooma","Pole Position (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -48790,11 +48792,11 @@ DRIVER_INIT_MEMBER(sc4_state,sc4pen1)
// PR6914 PUBLIC ENEMY PR6914 PUBLIC ENEMY SOUNDS11 PUBLIC ENEMY
-GAMEL( 200?, sc4pen1 ,0, sc4_4reel, sc4, sc4_state, sc4pen1, ROT0, "BFM","Public Enemy No1 (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pen1a ,sc4pen1, sc4_4reel, sc4, sc4_state, sc4pen1, ROT0, "BFM","Public Enemy No1 (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pen1b ,sc4pen1, sc4_4reel, sc4, sc4_state, sc4pen1, ROT0, "BFM","Public Enemy No1 (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pen1c ,sc4pen1, sc4_4reel, sc4, sc4_state, sc4pen1, ROT0, "BFM","Public Enemy No1 (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pen1d ,sc4pen1, sc4_4reel, sc4, sc4_state, sc4pen1, ROT0, "BFM","Public Enemy No1 (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4pen1 ,0, sc4_4reel, sc4, sc4_state, sc4pen1, ROT0, "BFM","Public Enemy No1 (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pen1a ,sc4pen1, sc4_4reel, sc4, sc4_state, sc4pen1, ROT0, "BFM","Public Enemy No1 (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pen1b ,sc4pen1, sc4_4reel, sc4, sc4_state, sc4pen1, ROT0, "BFM","Public Enemy No1 (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pen1c ,sc4pen1, sc4_4reel, sc4, sc4_state, sc4pen1, ROT0, "BFM","Public Enemy No1 (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pen1d ,sc4pen1, sc4_4reel, sc4, sc4_state, sc4pen1, ROT0, "BFM","Public Enemy No1 (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4rich)
@@ -48803,19 +48805,19 @@ DRIVER_INIT_MEMBER(sc4_state,sc4rich)
}
// PR7118 RICH GEEZER PR7118 RICH GEEZER SOUNDS11
-GAMEL( 200?, sc4rich ,0, sc4_200_5r, sc4, sc4_state, sc4rich, ROT0, "BFM","Rich Geezer (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4richa ,sc4rich, sc4_200_5r, sc4, sc4_state, sc4rich, ROT0, "BFM","Rich Geezer (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4richb ,sc4rich, sc4_200_5r, sc4, sc4_state, sc4rich, ROT0, "BFM","Rich Geezer (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4richc ,sc4rich, sc4_200_5r, sc4, sc4_state, sc4rich, ROT0, "BFM","Rich Geezer (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4richd ,sc4rich, sc4_200_5r, sc4, sc4_state, sc4rich, ROT0, "BFM","Rich Geezer (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4riche ,sc4rich, sc4_200_5r, sc4, sc4_state, sc4rich, ROT0, "BFM","Rich Geezer (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4richf ,sc4rich, sc4_200_5r, sc4, sc4_state, sc4rich, ROT0, "BFM","Rich Geezer (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4richg ,sc4rich, sc4_200_5r, sc4, sc4_state, sc4rich, ROT0, "BFM","Rich Geezer (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4richh ,sc4rich, sc4_200_5r, sc4, sc4_state, sc4rich, ROT0, "BFM","Rich Geezer (Bellfruit) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4richi ,sc4rich, sc4_200_5r, sc4, sc4_state, sc4rich, ROT0, "BFM","Rich Geezer (Bellfruit) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4richj ,sc4rich, sc4_200_5r, sc4, sc4_state, sc4rich, ROT0, "BFM","Rich Geezer (Bellfruit) (Scorpion 4) (set 11)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4richk ,sc4rich, sc4_200_5r, sc4, sc4_state, sc4rich, ROT0, "BFM","Rich Geezer (Bellfruit) (Scorpion 4) (set 12)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4richl ,sc4rich, sc4_200_5r, sc4, sc4_state, sc4rich, ROT0, "BFM","Rich Geezer (Bellfruit) (Scorpion 4) (set 13)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4rich ,0, sc4_200_5r, sc4, sc4_state, sc4rich, ROT0, "BFM","Rich Geezer (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4richa ,sc4rich, sc4_200_5r, sc4, sc4_state, sc4rich, ROT0, "BFM","Rich Geezer (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4richb ,sc4rich, sc4_200_5r, sc4, sc4_state, sc4rich, ROT0, "BFM","Rich Geezer (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4richc ,sc4rich, sc4_200_5r, sc4, sc4_state, sc4rich, ROT0, "BFM","Rich Geezer (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4richd ,sc4rich, sc4_200_5r, sc4, sc4_state, sc4rich, ROT0, "BFM","Rich Geezer (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4riche ,sc4rich, sc4_200_5r, sc4, sc4_state, sc4rich, ROT0, "BFM","Rich Geezer (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4richf ,sc4rich, sc4_200_5r, sc4, sc4_state, sc4rich, ROT0, "BFM","Rich Geezer (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4richg ,sc4rich, sc4_200_5r, sc4, sc4_state, sc4rich, ROT0, "BFM","Rich Geezer (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4richh ,sc4rich, sc4_200_5r, sc4, sc4_state, sc4rich, ROT0, "BFM","Rich Geezer (Bellfruit) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4richi ,sc4rich, sc4_200_5r, sc4, sc4_state, sc4rich, ROT0, "BFM","Rich Geezer (Bellfruit) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4richj ,sc4rich, sc4_200_5r, sc4, sc4_state, sc4rich, ROT0, "BFM","Rich Geezer (Bellfruit) (Scorpion 4) (set 11)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4richk ,sc4rich, sc4_200_5r, sc4, sc4_state, sc4rich, ROT0, "BFM","Rich Geezer (Bellfruit) (Scorpion 4) (set 12)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4richl ,sc4rich, sc4_200_5r, sc4, sc4_state, sc4rich, ROT0, "BFM","Rich Geezer (Bellfruit) (Scorpion 4) (set 13)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -48830,29 +48832,29 @@ DRIVER_INIT_MEMBER(sc4_state,sc4srrmz_mbus)
}
// PR7141 SHAKE RATTLE ROLL LINE SOUNDS * SHAKE RATT ROLL
-GAMEL( 200?, sc4srrmz ,0, sc4_3reel, sc4, sc4_state, sc4srrmz, ROT0, "Mazooma","Shake Rattle Roll (Mazooma) (Scorpion 4) (Top Box)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4srrmz ,0, sc4_3reel, sc4, sc4_state, sc4srrmz, ROT0, "Mazooma","Shake Rattle Roll (Mazooma) (Scorpion 4) (Top Box)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR7079CASINO SHAKE RATTLE AND ROL PR7079,Casino SHAKE RATTLE AND ROLL, LINE SOUNDS ROCK AND ROLL
-GAMEL( 200?, sc4srrmza ,sc4srrmz, sc4_3reel, sc4, sc4_state, sc4srrmz, ROT0, "Mazooma","Shake Rattle Roll Casino (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4srrmzb ,sc4srrmz, sc4_3reel, sc4, sc4_state, sc4srrmz, ROT0, "Mazooma","Shake Rattle Roll Casino (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4srrmzc ,sc4srrmz, sc4_3reel, sc4, sc4_state, sc4srrmz, ROT0, "Mazooma","Shake Rattle Roll Casino (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4srrmze ,sc4srrmz, sc4_3reel, sc4, sc4_state, sc4srrmz, ROT0, "Mazooma","Shake Rattle Roll Casino (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4srrmza ,sc4srrmz, sc4_3reel, sc4, sc4_state, sc4srrmz, ROT0, "Mazooma","Shake Rattle Roll Casino (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4srrmzb ,sc4srrmz, sc4_3reel, sc4, sc4_state, sc4srrmz, ROT0, "Mazooma","Shake Rattle Roll Casino (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4srrmzc ,sc4srrmz, sc4_3reel, sc4, sc4_state, sc4srrmz, ROT0, "Mazooma","Shake Rattle Roll Casino (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4srrmze ,sc4srrmz, sc4_3reel, sc4, sc4_state, sc4srrmz, ROT0, "Mazooma","Shake Rattle Roll Casino (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR7079CASINO SHAKE RATTLE AND ROL PR7079,Casino SHAKE RATTLE AND ROLL, LINE SOUNDS ROCK AND ROLL (the same as some of the above.. )
-GAMEL( 200?, sc4srrca ,sc4srrmz, sc4_3reel, sc4, sc4_state, sc4srrmz, ROT0, "Mazooma","Shake Rattle Roll Casino (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4srrcaa ,sc4srrmz, sc4_3reel, sc4, sc4_state, sc4srrmz, ROT0, "Mazooma","Shake Rattle Roll Casino (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4srrcab ,sc4srrmz, sc4_3reel, sc4, sc4_state, sc4srrmz, ROT0, "Mazooma","Shake Rattle Roll Casino (Mazooma) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4srrcac ,sc4srrmz, sc4_3reel, sc4, sc4_state, sc4srrmz, ROT0, "Mazooma","Shake Rattle Roll Casino (Mazooma) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4srrcad ,sc4srrmz, sc4_3reel, sc4, sc4_state, sc4srrmz, ROT0, "Mazooma","Shake Rattle Roll Casino (Mazooma) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4srrcae ,sc4srrmz, sc4_3reel, sc4, sc4_state, sc4srrmz, ROT0, "Mazooma","Shake Rattle Roll Casino (Mazooma) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4srrca ,sc4srrmz, sc4_3reel, sc4, sc4_state, sc4srrmz, ROT0, "Mazooma","Shake Rattle Roll Casino (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4srrcaa ,sc4srrmz, sc4_3reel, sc4, sc4_state, sc4srrmz, ROT0, "Mazooma","Shake Rattle Roll Casino (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4srrcab ,sc4srrmz, sc4_3reel, sc4, sc4_state, sc4srrmz, ROT0, "Mazooma","Shake Rattle Roll Casino (Mazooma) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4srrcac ,sc4srrmz, sc4_3reel, sc4, sc4_state, sc4srrmz, ROT0, "Mazooma","Shake Rattle Roll Casino (Mazooma) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4srrcad ,sc4srrmz, sc4_3reel, sc4, sc4_state, sc4srrmz, ROT0, "Mazooma","Shake Rattle Roll Casino (Mazooma) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4srrcae ,sc4srrmz, sc4_3reel, sc4, sc4_state, sc4srrmz, ROT0, "Mazooma","Shake Rattle Roll Casino (Mazooma) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR7079CASINO SHAKE RATTLE AND ROL SHAK RATTLE ROLL ARCADE PR7079,Casino SHAKE RATTLE AND ROLL, LINE SOUNDS
-GAMEL( 200?, sc4srrmzd ,sc4srrmz, sc4_3reel, sc4, sc4_state, sc4srrmz_mbus, ROT0, "Mazooma","Shake Rattle Roll Arcade (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4srrmzf ,sc4srrmz, sc4_3reel, sc4, sc4_state, sc4srrmz_mbus, ROT0, "Mazooma","Shake Rattle Roll Arcade (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4srrmzg ,sc4srrmz, sc4_3reel, sc4, sc4_state, sc4srrmz_mbus, ROT0, "Mazooma","Shake Rattle Roll Arcade (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4srrmzh ,sc4srrmz, sc4_3reel, sc4, sc4_state, sc4srrmz_mbus, ROT0, "Mazooma","Shake Rattle Roll Arcade (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4srrmzi ,sc4srrmz, sc4_3reel, sc4, sc4_state, sc4srrmz_mbus, ROT0, "Mazooma","Shake Rattle Roll Arcade (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4srrmzj ,sc4srrmz, sc4_3reel, sc4, sc4_state, sc4srrmz_mbus, ROT0, "Mazooma","Shake Rattle Roll Arcade (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4srrmzk ,sc4srrmz, sc4_3reel, sc4, sc4_state, sc4srrmz_mbus, ROT0, "Mazooma","Shake Rattle Roll Arcade (Mazooma) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4srrmzl ,sc4srrmz, sc4_3reel, sc4, sc4_state, sc4srrmz_mbus, ROT0, "Mazooma","Shake Rattle Roll Arcade (Mazooma) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4srrmzm ,sc4srrmz, sc4_3reel, sc4, sc4_state, sc4srrmz_mbus, ROT0, "Mazooma","Shake Rattle Roll Arcade (Mazooma) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4srrmzd ,sc4srrmz, sc4_3reel, sc4, sc4_state, sc4srrmz_mbus, ROT0, "Mazooma","Shake Rattle Roll Arcade (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4srrmzf ,sc4srrmz, sc4_3reel, sc4, sc4_state, sc4srrmz_mbus, ROT0, "Mazooma","Shake Rattle Roll Arcade (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4srrmzg ,sc4srrmz, sc4_3reel, sc4, sc4_state, sc4srrmz_mbus, ROT0, "Mazooma","Shake Rattle Roll Arcade (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4srrmzh ,sc4srrmz, sc4_3reel, sc4, sc4_state, sc4srrmz_mbus, ROT0, "Mazooma","Shake Rattle Roll Arcade (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4srrmzi ,sc4srrmz, sc4_3reel, sc4, sc4_state, sc4srrmz_mbus, ROT0, "Mazooma","Shake Rattle Roll Arcade (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4srrmzj ,sc4srrmz, sc4_3reel, sc4, sc4_state, sc4srrmz_mbus, ROT0, "Mazooma","Shake Rattle Roll Arcade (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4srrmzk ,sc4srrmz, sc4_3reel, sc4, sc4_state, sc4srrmz_mbus, ROT0, "Mazooma","Shake Rattle Roll Arcade (Mazooma) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4srrmzl ,sc4srrmz, sc4_3reel, sc4, sc4_state, sc4srrmz_mbus, ROT0, "Mazooma","Shake Rattle Roll Arcade (Mazooma) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4srrmzm ,sc4srrmz, sc4_3reel, sc4, sc4_state, sc4srrmz_mbus, ROT0, "Mazooma","Shake Rattle Roll Arcade (Mazooma) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4sirpz)
@@ -48862,10 +48864,10 @@ DRIVER_INIT_MEMBER(sc4_state,sc4sirpz)
// PR2004CASINO SIR PRIZE LINE SOUNDS SIR PRIZE 8 +
-GAMEL( 200?, sc4sirpz ,0, sc4_3reel, sc4, sc4_state, sc4sirpz, ROT0, "Mazooma","Sir Prize (PR2004, SIRV) (Mazooma) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // 7:0 and 7:1 must be turned ON to boot this
+GAMEL( 200?, sc4sirpz ,0, sc4_3reel, sc4, sc4_state, sc4sirpz, ROT0, "Mazooma","Sir Prize (PR2004, SIRV) (Mazooma) (Scorpion 4)", MACHINE_FLAGS, layout_bfm_sc4 ) // 7:0 and 7:1 must be turned ON to boot this
// PR7079CASINO SIR PRIZE PR7079,Casino SIR PRIZE, LINE SOUNDS SIR PRIZE
-GAMEL( 200?, sc4sirpza ,sc4sirpz, sc4_3reel, sc4, sc4_state, sc4sirpz, ROT0, "Mazooma","Sir Prize (PR7079, SIRP) (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4sirpzb ,sc4sirpz, sc4_3reel, sc4, sc4_state, sc4sirpz, ROT0, "Mazooma","Sir Prize (PR7079, SIRP) (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4sirpza ,sc4sirpz, sc4_3reel, sc4, sc4_state, sc4sirpz, ROT0, "Mazooma","Sir Prize (PR7079, SIRP) (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4sirpzb ,sc4sirpz, sc4_3reel, sc4, sc4_state, sc4sirpz, ROT0, "Mazooma","Sir Prize (PR7079, SIRP) (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -48876,7 +48878,7 @@ DRIVER_INIT_MEMBER(sc4_state,sc4smk7)
// PR6924 SMOKIN SEVENS PR6924 SMOKIN SEVENS SOUNDS11
-GAMEL( 200?, sc4smk7 ,0, sc4_3reel, sc4, sc4_state, sc4smk7, ROT0, "BFM","Smoking 7's (Bellfruit) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4smk7 ,0, sc4_3reel, sc4, sc4_state, sc4smk7, ROT0, "BFM","Smoking 7's (Bellfruit) (Scorpion 4)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -48888,18 +48890,18 @@ DRIVER_INIT_MEMBER(sc4_state,sc4starp)
// PR6805 STARPRIZE PR6805 STARPRIZE SOUNDS
-GAMEL( 200?, sc4starp ,0, sc4_4reel, sc4, sc4_state, sc4starp, ROT0, "BFM","Starprize (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4starpa ,sc4starp, sc4_4reel, sc4, sc4_state, sc4starp, ROT0, "BFM","Starprize (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4starpb ,sc4starp, sc4_4reel, sc4, sc4_state, sc4starp, ROT0, "BFM","Starprize (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4starpc ,sc4starp, sc4_4reel, sc4, sc4_state, sc4starp, ROT0, "BFM","Starprize (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4starpd ,sc4starp, sc4_4reel, sc4, sc4_state, sc4starp, ROT0, "BFM","Starprize (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4starpe ,sc4starp, sc4_4reel, sc4, sc4_state, sc4starp, ROT0, "BFM","Starprize (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4starpf ,sc4starp, sc4_4reel, sc4, sc4_state, sc4starp, ROT0, "BFM","Starprize (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4starpg ,sc4starp, sc4_4reel, sc4, sc4_state, sc4starp, ROT0, "BFM","Starprize (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4starph ,sc4starp, sc4_4reel, sc4, sc4_state, sc4starp, ROT0, "BFM","Starprize (Bellfruit) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4starpi ,sc4starp, sc4_4reel, sc4, sc4_state, sc4starp, ROT0, "BFM","Starprize (Bellfruit) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4starpj ,sc4starp, sc4_4reel, sc4, sc4_state, sc4starp, ROT0, "BFM","Starprize (Bellfruit) (Scorpion 4) (set 11)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4starpk ,sc4starp, sc4_4reel, sc4, sc4_state, sc4starp, ROT0, "BFM","Starprize (Bellfruit) (Scorpion 4) (set 12)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4starp ,0, sc4_4reel, sc4, sc4_state, sc4starp, ROT0, "BFM","Starprize (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4starpa ,sc4starp, sc4_4reel, sc4, sc4_state, sc4starp, ROT0, "BFM","Starprize (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4starpb ,sc4starp, sc4_4reel, sc4, sc4_state, sc4starp, ROT0, "BFM","Starprize (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4starpc ,sc4starp, sc4_4reel, sc4, sc4_state, sc4starp, ROT0, "BFM","Starprize (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4starpd ,sc4starp, sc4_4reel, sc4, sc4_state, sc4starp, ROT0, "BFM","Starprize (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4starpe ,sc4starp, sc4_4reel, sc4, sc4_state, sc4starp, ROT0, "BFM","Starprize (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4starpf ,sc4starp, sc4_4reel, sc4, sc4_state, sc4starp, ROT0, "BFM","Starprize (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4starpg ,sc4starp, sc4_4reel, sc4, sc4_state, sc4starp, ROT0, "BFM","Starprize (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4starph ,sc4starp, sc4_4reel, sc4, sc4_state, sc4starp, ROT0, "BFM","Starprize (Bellfruit) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4starpi ,sc4starp, sc4_4reel, sc4, sc4_state, sc4starp, ROT0, "BFM","Starprize (Bellfruit) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4starpj ,sc4starp, sc4_4reel, sc4, sc4_state, sc4starp, ROT0, "BFM","Starprize (Bellfruit) (Scorpion 4) (set 11)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4starpk ,sc4starp, sc4_4reel, sc4, sc4_state, sc4starp, ROT0, "BFM","Starprize (Bellfruit) (Scorpion 4) (set 12)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -48910,18 +48912,18 @@ DRIVER_INIT_MEMBER(sc4_state,sc4strk)
}
// PR2167CASINO THE STREAK PR7017,CASINO STREAK, STRK SOUNDS THE STREAK
-GAMEL( 200?, sc4strk ,0, sc4_3reel, sc4, sc4_state, sc4strk, ROT0, "Mazooma","The Streak (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4strka ,sc4strk, sc4_3reel, sc4, sc4_state, sc4strk, ROT0, "Mazooma","The Streak (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4strkb ,sc4strk, sc4_3reel, sc4, sc4_state, sc4strk, ROT0, "Mazooma","The Streak (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4strkc ,sc4strk, sc4_3reel, sc4, sc4_state, sc4strk, ROT0, "Mazooma","The Streak (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4strkd ,sc4strk, sc4_3reel, sc4, sc4_state, sc4strk, ROT0, "Mazooma","The Streak (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4strke ,sc4strk, sc4_3reel, sc4, sc4_state, sc4strk, ROT0, "Mazooma","The Streak (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4strkf ,sc4strk, sc4_3reel, sc4, sc4_state, sc4strk, ROT0, "Mazooma","The Streak (Mazooma) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4strkg ,sc4strk, sc4_3reel, sc4, sc4_state, sc4strk, ROT0, "Mazooma","The Streak (Mazooma) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4strkh ,sc4strk, sc4_3reel, sc4, sc4_state, sc4strk, ROT0, "Mazooma","The Streak (Mazooma) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4strki ,sc4strk, sc4_3reel, sc4, sc4_state, sc4strk, ROT0, "Mazooma","The Streak (Mazooma) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4strkj ,sc4strk, sc4_3reel, sc4, sc4_state, sc4strk, ROT0, "Mazooma","The Streak (Mazooma) (Scorpion 4) (set 11)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4strkk ,sc4strk, sc4_3reel, sc4, sc4_state, sc4strk, ROT0, "Mazooma","The Streak (Mazooma) (Scorpion 4) (set 12)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4strk ,0, sc4_3reel, sc4, sc4_state, sc4strk, ROT0, "Mazooma","The Streak (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4strka ,sc4strk, sc4_3reel, sc4, sc4_state, sc4strk, ROT0, "Mazooma","The Streak (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4strkb ,sc4strk, sc4_3reel, sc4, sc4_state, sc4strk, ROT0, "Mazooma","The Streak (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4strkc ,sc4strk, sc4_3reel, sc4, sc4_state, sc4strk, ROT0, "Mazooma","The Streak (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4strkd ,sc4strk, sc4_3reel, sc4, sc4_state, sc4strk, ROT0, "Mazooma","The Streak (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4strke ,sc4strk, sc4_3reel, sc4, sc4_state, sc4strk, ROT0, "Mazooma","The Streak (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4strkf ,sc4strk, sc4_3reel, sc4, sc4_state, sc4strk, ROT0, "Mazooma","The Streak (Mazooma) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4strkg ,sc4strk, sc4_3reel, sc4, sc4_state, sc4strk, ROT0, "Mazooma","The Streak (Mazooma) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4strkh ,sc4strk, sc4_3reel, sc4, sc4_state, sc4strk, ROT0, "Mazooma","The Streak (Mazooma) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4strki ,sc4strk, sc4_3reel, sc4, sc4_state, sc4strk, ROT0, "Mazooma","The Streak (Mazooma) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4strkj ,sc4strk, sc4_3reel, sc4, sc4_state, sc4strk, ROT0, "Mazooma","The Streak (Mazooma) (Scorpion 4) (set 11)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4strkk ,sc4strk, sc4_3reel, sc4, sc4_state, sc4strk, ROT0, "Mazooma","The Streak (Mazooma) (Scorpion 4) (set 12)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -48936,33 +48938,33 @@ DRIVER_INIT_MEMBER(sc4_state,sc4trist)
}
// PR2188 TRIPLE STREAK STR3 SOUNDS " THE STREAK
-GAMEL( 200?, sc4trist ,0, sc4_3reel, sc4, sc4_state, sc4tristtb, ROT0, "Mazooma","Triple Streak (PR2188) (Mazooma) (Scorpion 4) (Top Box, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4trista ,sc4trist, sc4_3reel, sc4, sc4_state, sc4tristtb, ROT0, "Mazooma","Triple Streak (PR2188) (Mazooma) (Scorpion 4) (Top Box, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4trist ,0, sc4_3reel, sc4, sc4_state, sc4tristtb, ROT0, "Mazooma","Triple Streak (PR2188) (Mazooma) (Scorpion 4) (Top Box, set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4trista ,sc4trist, sc4_3reel, sc4, sc4_state, sc4tristtb, ROT0, "Mazooma","Triple Streak (PR2188) (Mazooma) (Scorpion 4) (Top Box, set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2167CASINO THE STREAK PR7017,CASINO STREAK, STR3 SOUNDS THE STREAK
-GAMEL( 200?, sc4tristb ,sc4trist, sc4_3reel, sc4, sc4_state, sc4trist, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tristc ,sc4trist, sc4_3reel, sc4, sc4_state, sc4trist, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tristd ,sc4trist, sc4_3reel, sc4, sc4_state, sc4trist, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4triste ,sc4trist, sc4_3reel, sc4, sc4_state, sc4trist, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tristf ,sc4trist, sc4_3reel, sc4, sc4_state, sc4trist, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tristg ,sc4trist, sc4_3reel, sc4, sc4_state, sc4trist, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tristh ,sc4trist, sc4_3reel, sc4, sc4_state, sc4trist, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tristi ,sc4trist, sc4_3reel, sc4, sc4_state, sc4trist, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tristj ,sc4trist, sc4_3reel, sc4, sc4_state, sc4trist, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tristk ,sc4trist, sc4_3reel, sc4, sc4_state, sc4trist, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tristl ,sc4trist, sc4_3reel, sc4, sc4_state, sc4trist, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 11)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tristm ,sc4trist, sc4_3reel, sc4, sc4_state, sc4trist, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 12)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tristn ,sc4trist, sc4_3reel, sc4, sc4_state, sc4trist, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 13)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tristo ,sc4trist, sc4_3reel, sc4, sc4_state, sc4trist, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 14)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tristp ,sc4trist, sc4_3reel, sc4, sc4_state, sc4trist, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 15)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tristq ,sc4trist, sc4_3reel, sc4, sc4_state, sc4trist, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 16)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tristr ,sc4trist, sc4_3reel, sc4, sc4_state, sc4trist, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 17)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4trists ,sc4trist, sc4_3reel, sc4, sc4_state, sc4trist, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 18)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tristt ,sc4trist, sc4_3reel, sc4, sc4_state, sc4trist, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 19)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tristu ,sc4trist, sc4_3reel, sc4, sc4_state, sc4trist, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 20)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tristv ,sc4trist, sc4_3reel, sc4, sc4_state, sc4trist, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 21)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tristw ,sc4trist, sc4_3reel, sc4, sc4_state, sc4trist, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 22)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tristx ,sc4trist, sc4_3reel, sc4, sc4_state, sc4trist, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 23)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tristy ,sc4trist, sc4_3reel, sc4, sc4_state, sc4trist, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 24)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4tristb ,sc4trist, sc4_3reel, sc4, sc4_state, sc4trist, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tristc ,sc4trist, sc4_3reel, sc4, sc4_state, sc4trist, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tristd ,sc4trist, sc4_3reel, sc4, sc4_state, sc4trist, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4triste ,sc4trist, sc4_3reel, sc4, sc4_state, sc4trist, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tristf ,sc4trist, sc4_3reel, sc4, sc4_state, sc4trist, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tristg ,sc4trist, sc4_3reel, sc4, sc4_state, sc4trist, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tristh ,sc4trist, sc4_3reel, sc4, sc4_state, sc4trist, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tristi ,sc4trist, sc4_3reel, sc4, sc4_state, sc4trist, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tristj ,sc4trist, sc4_3reel, sc4, sc4_state, sc4trist, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tristk ,sc4trist, sc4_3reel, sc4, sc4_state, sc4trist, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tristl ,sc4trist, sc4_3reel, sc4, sc4_state, sc4trist, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 11)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tristm ,sc4trist, sc4_3reel, sc4, sc4_state, sc4trist, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 12)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tristn ,sc4trist, sc4_3reel, sc4, sc4_state, sc4trist, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 13)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tristo ,sc4trist, sc4_3reel, sc4, sc4_state, sc4trist, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 14)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tristp ,sc4trist, sc4_3reel, sc4, sc4_state, sc4trist, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 15)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tristq ,sc4trist, sc4_3reel, sc4, sc4_state, sc4trist, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 16)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tristr ,sc4trist, sc4_3reel, sc4, sc4_state, sc4trist, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 17)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4trists ,sc4trist, sc4_3reel, sc4, sc4_state, sc4trist, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 18)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tristt ,sc4trist, sc4_3reel, sc4, sc4_state, sc4trist, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 19)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tristu ,sc4trist, sc4_3reel, sc4, sc4_state, sc4trist, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 20)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tristv ,sc4trist, sc4_3reel, sc4, sc4_state, sc4trist, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 21)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tristw ,sc4trist, sc4_3reel, sc4, sc4_state, sc4trist, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 22)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tristx ,sc4trist, sc4_3reel, sc4, sc4_state, sc4trist, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 23)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tristy ,sc4trist, sc4_3reel, sc4, sc4_state, sc4trist, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 24)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4s6c)
@@ -48971,15 +48973,15 @@ DRIVER_INIT_MEMBER(sc4_state,sc4s6c)
}
// PR6834 SUPER 6 FIXED 65% PR6834 SSIX SOUNDS11
-GAMEL( 200?, sc4s6c ,0, sc4, sc4, sc4_state, sc4s6c, ROT0, "BFM","Super 6 Club (65% Fixed) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4s6cb ,sc4s6c, sc4, sc4, sc4_state, sc4s6c, ROT0, "BFM","Super 6 Club (65% Fixed) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4s6c ,0, sc4, sc4, sc4_state, sc4s6c, ROT0, "BFM","Super 6 Club (65% Fixed) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4s6cb ,sc4s6c, sc4, sc4, sc4_state, sc4s6c, ROT0, "BFM","Super 6 Club (65% Fixed) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR6834 SUPER 6 PR6834 SSIX SOUNDS11
-GAMEL( 200?, sc4s6ca ,sc4s6c, sc4, sc4, sc4_state, sc4s6c, ROT0, "BFM","Super 6 Club (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4s6cc ,sc4s6c, sc4, sc4, sc4_state, sc4s6c, ROT0, "BFM","Super 6 Club (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4s6cd ,sc4s6c, sc4, sc4, sc4_state, sc4s6c, ROT0, "BFM","Super 6 Club (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4s6ce ,sc4s6c, sc4, sc4, sc4_state, sc4s6c, ROT0, "BFM","Super 6 Club (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4s6ca ,sc4s6c, sc4, sc4, sc4_state, sc4s6c, ROT0, "BFM","Super 6 Club (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4s6cc ,sc4s6c, sc4, sc4, sc4_state, sc4s6c, ROT0, "BFM","Super 6 Club (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4s6cd ,sc4s6c, sc4, sc4, sc4_state, sc4s6c, ROT0, "BFM","Super 6 Club (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4s6ce ,sc4s6c, sc4, sc4, sc4_state, sc4s6c, ROT0, "BFM","Super 6 Club (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
-GAMEL( 200?, sc4s6cf ,sc4s6c, sc4, sc4, sc4_state, sc4s6c, ROT0, "BFM","Super 6 Club (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4s6cf ,sc4s6c, sc4, sc4, sc4_state, sc4s6c, ROT0, "BFM","Super 6 Club (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -48996,23 +48998,23 @@ DRIVER_INIT_MEMBER(sc4_state,sc4tic2_mbus)
// PR7060CASINO TICTACTWO TTTWO SOUNDS TIC TAC TWO
-GAMEL( 200?, sc4tic2 ,0, sc4_3reel, sc4, sc4_state, sc4tic2, ROT0, "Mazooma","Tic Tac Two Casino (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tic2a ,sc4tic2, sc4_3reel, sc4, sc4_state, sc4tic2, ROT0, "Mazooma","Tic Tac Two Casino (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tic2b ,sc4tic2, sc4_3reel, sc4, sc4_state, sc4tic2, ROT0, "Mazooma","Tic Tac Two Casino (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tic2c ,sc4tic2, sc4_3reel, sc4, sc4_state, sc4tic2, ROT0, "Mazooma","Tic Tac Two Casino (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tic2d ,sc4tic2, sc4_3reel, sc4, sc4_state, sc4tic2, ROT0, "Mazooma","Tic Tac Two Casino (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tic2e ,sc4tic2, sc4_3reel, sc4, sc4_state, sc4tic2, ROT0, "Mazooma","Tic Tac Two Casino (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tic2f ,sc4tic2, sc4_3reel, sc4, sc4_state, sc4tic2, ROT0, "Mazooma","Tic Tac Two Casino (Mazooma) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tic2g ,sc4tic2, sc4_3reel, sc4, sc4_state, sc4tic2, ROT0, "Mazooma","Tic Tac Two Casino (Mazooma) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tic2n ,sc4tic2, sc4_3reel, sc4, sc4_state, sc4tic2, ROT0, "Mazooma","Tic Tac Two Casino (Mazooma) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tic2o ,sc4tic2, sc4_3reel, sc4, sc4_state, sc4tic2, ROT0, "Mazooma","Tic Tac Two Casino (Mazooma) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4tic2 ,0, sc4_3reel, sc4, sc4_state, sc4tic2, ROT0, "Mazooma","Tic Tac Two Casino (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tic2a ,sc4tic2, sc4_3reel, sc4, sc4_state, sc4tic2, ROT0, "Mazooma","Tic Tac Two Casino (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tic2b ,sc4tic2, sc4_3reel, sc4, sc4_state, sc4tic2, ROT0, "Mazooma","Tic Tac Two Casino (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tic2c ,sc4tic2, sc4_3reel, sc4, sc4_state, sc4tic2, ROT0, "Mazooma","Tic Tac Two Casino (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tic2d ,sc4tic2, sc4_3reel, sc4, sc4_state, sc4tic2, ROT0, "Mazooma","Tic Tac Two Casino (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tic2e ,sc4tic2, sc4_3reel, sc4, sc4_state, sc4tic2, ROT0, "Mazooma","Tic Tac Two Casino (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tic2f ,sc4tic2, sc4_3reel, sc4, sc4_state, sc4tic2, ROT0, "Mazooma","Tic Tac Two Casino (Mazooma) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tic2g ,sc4tic2, sc4_3reel, sc4, sc4_state, sc4tic2, ROT0, "Mazooma","Tic Tac Two Casino (Mazooma) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tic2n ,sc4tic2, sc4_3reel, sc4, sc4_state, sc4tic2, ROT0, "Mazooma","Tic Tac Two Casino (Mazooma) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tic2o ,sc4tic2, sc4_3reel, sc4, sc4_state, sc4tic2, ROT0, "Mazooma","Tic Tac Two Casino (Mazooma) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR7060CASINO TICTACTWO TIC TAC TWO ARCADE TTTWO SOUNDS TIC TAC TWO
-GAMEL( 200?, sc4tic2i ,sc4tic2, sc4_3reel, sc4, sc4_state, sc4tic2_mbus, ROT0, "Mazooma","Tic Tac Two Casino Arcade (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tic2j ,sc4tic2, sc4_3reel, sc4, sc4_state, sc4tic2_mbus, ROT0, "Mazooma","Tic Tac Two Casino Arcade (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tic2k ,sc4tic2, sc4_3reel, sc4, sc4_state, sc4tic2_mbus, ROT0, "Mazooma","Tic Tac Two Casino Arcade (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tic2h ,sc4tic2, sc4_3reel, sc4, sc4_state, sc4tic2, ROT0, "Mazooma","Tic Tac Two Casino Arcade (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tic2l ,sc4tic2, sc4_3reel, sc4, sc4_state, sc4tic2, ROT0, "Mazooma","Tic Tac Two Casino Arcade (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tic2m ,sc4tic2, sc4_3reel, sc4, sc4_state, sc4tic2, ROT0, "Mazooma","Tic Tac Two Casino Arcade (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4tic2i ,sc4tic2, sc4_3reel, sc4, sc4_state, sc4tic2_mbus, ROT0, "Mazooma","Tic Tac Two Casino Arcade (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tic2j ,sc4tic2, sc4_3reel, sc4, sc4_state, sc4tic2_mbus, ROT0, "Mazooma","Tic Tac Two Casino Arcade (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tic2k ,sc4tic2, sc4_3reel, sc4, sc4_state, sc4tic2_mbus, ROT0, "Mazooma","Tic Tac Two Casino Arcade (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tic2h ,sc4tic2, sc4_3reel, sc4, sc4_state, sc4tic2, ROT0, "Mazooma","Tic Tac Two Casino Arcade (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tic2l ,sc4tic2, sc4_3reel, sc4, sc4_state, sc4tic2, ROT0, "Mazooma","Tic Tac Two Casino Arcade (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tic2m ,sc4tic2, sc4_3reel, sc4, sc4_state, sc4tic2, ROT0, "Mazooma","Tic Tac Two Casino Arcade (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -49022,13 +49024,13 @@ DRIVER_INIT_MEMBER(sc4_state,sc4ticlb)
}
// PR6832 TREASURE ISLAND FIXED 65% PR6832 TRES SOUNDS11
-GAMEL( 200?, sc4ticlb ,0, sc4dmd, sc4, sc4_state, sc4ticlb, ROT0, "BFM","Treasure Island Club (Fixed 65%) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4_dmd )
-GAMEL( 200?, sc4ticlbb ,sc4ticlb, sc4dmd, sc4, sc4_state, sc4ticlb, ROT0, "BFM","Treasure Island Club (Fixed 65%) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4_dmd )
+GAMEL( 200?, sc4ticlb ,0, sc4dmd, sc4, sc4_state, sc4ticlb, ROT0, "BFM","Treasure Island Club (Fixed 65%) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_sc4_dmd )
+GAMEL( 200?, sc4ticlbb ,sc4ticlb, sc4dmd, sc4, sc4_state, sc4ticlb, ROT0, "BFM","Treasure Island Club (Fixed 65%) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_sc4_dmd )
// PR6832 TREASURE ISLAND PR6832 TRES SOUNDS11
-GAMEL( 200?, sc4ticlba ,sc4ticlb, sc4dmd, sc4, sc4_state, sc4ticlb, ROT0, "BFM","Treasure Island Club (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4_dmd )
-GAMEL( 200?, sc4ticlbc ,sc4ticlb, sc4dmd, sc4, sc4_state, sc4ticlb, ROT0, "BFM","Treasure Island Club (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4_dmd )
+GAMEL( 200?, sc4ticlba ,sc4ticlb, sc4dmd, sc4, sc4_state, sc4ticlb, ROT0, "BFM","Treasure Island Club (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_sc4_dmd )
+GAMEL( 200?, sc4ticlbc ,sc4ticlb, sc4dmd, sc4, sc4_state, sc4ticlb, ROT0, "BFM","Treasure Island Club (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_sc4_dmd )
-GAMEL( 200?, sc4ticlbd ,sc4ticlb, sc4dmd, sc4, sc4_state, sc4ticlb, ROT0, "BFM","Treasure Island Club (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4_dmd )
+GAMEL( 200?, sc4ticlbd ,sc4ticlb, sc4dmd, sc4, sc4_state, sc4ticlb, ROT0, "BFM","Treasure Island Club (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_sc4_dmd )
@@ -49050,31 +49052,31 @@ DRIVER_INIT_MEMBER(sc4_state,sc4tri7_mbus)
// PR1328 TRIPLE 7'S PR1328 TRIPLE 7S SOUNDS11 TRIPLE 7'S ABOVE
-GAMEL( 200?, sc4tri7 ,0, sc4_3reel, sc4, sc4_state, sc4tri7tb, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (Top Box, set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // ABUV
-GAMEL( 200?, sc4tri7a ,sc4tri7, sc4_3reel, sc4, sc4_state, sc4tri7tb, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (Top Box, set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tri7m ,sc4tri7, sc4_3reel, sc4, sc4_state, sc4tri7tb, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (Top Box, set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tri7n ,sc4tri7, sc4_3reel, sc4, sc4_state, sc4tri7tb, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (Top Box, set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tri7v ,sc4tri7, sc4_3reel, sc4, sc4_state, sc4tri7tb, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (Top Box, set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tri7w ,sc4tri7, sc4_3reel, sc4, sc4_state, sc4tri7tb, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (Top Box, set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tri7f ,sc4tri7, sc4_3reel, sc4, sc4_state, sc4tri7, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // SEVN
-GAMEL( 200?, sc4tri7g ,sc4tri7, sc4_3reel, sc4, sc4_state, sc4tri7, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tri7h ,sc4tri7, sc4_3reel, sc4, sc4_state, sc4tri7, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tri7i ,sc4tri7, sc4_3reel, sc4, sc4_state, sc4tri7, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tri7j ,sc4tri7, sc4_3reel, sc4, sc4_state, sc4tri7, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tri7k ,sc4tri7, sc4_3reel, sc4, sc4_state, sc4tri7, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tri7l ,sc4tri7, sc4_3reel, sc4, sc4_state, sc4tri7, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tri7o ,sc4tri7, sc4_3reel, sc4, sc4_state, sc4tri7, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tri7p ,sc4tri7, sc4_3reel, sc4, sc4_state, sc4tri7, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tri7q ,sc4tri7, sc4_3reel, sc4, sc4_state, sc4tri7, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tri7r ,sc4tri7, sc4_3reel, sc4, sc4_state, sc4tri7, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 11)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tri7s ,sc4tri7, sc4_3reel, sc4, sc4_state, sc4tri7, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 12)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tri7t ,sc4tri7, sc4_3reel, sc4, sc4_state, sc4tri7, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 13)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tri7u ,sc4tri7, sc4_3reel, sc4, sc4_state, sc4tri7, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 14)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4tri7 ,0, sc4_3reel, sc4, sc4_state, sc4tri7tb, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (Top Box, set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // ABUV
+GAMEL( 200?, sc4tri7a ,sc4tri7, sc4_3reel, sc4, sc4_state, sc4tri7tb, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (Top Box, set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tri7m ,sc4tri7, sc4_3reel, sc4, sc4_state, sc4tri7tb, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (Top Box, set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tri7n ,sc4tri7, sc4_3reel, sc4, sc4_state, sc4tri7tb, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (Top Box, set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tri7v ,sc4tri7, sc4_3reel, sc4, sc4_state, sc4tri7tb, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (Top Box, set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tri7w ,sc4tri7, sc4_3reel, sc4, sc4_state, sc4tri7tb, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (Top Box, set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tri7f ,sc4tri7, sc4_3reel, sc4, sc4_state, sc4tri7, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // SEVN
+GAMEL( 200?, sc4tri7g ,sc4tri7, sc4_3reel, sc4, sc4_state, sc4tri7, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tri7h ,sc4tri7, sc4_3reel, sc4, sc4_state, sc4tri7, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tri7i ,sc4tri7, sc4_3reel, sc4, sc4_state, sc4tri7, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tri7j ,sc4tri7, sc4_3reel, sc4, sc4_state, sc4tri7, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tri7k ,sc4tri7, sc4_3reel, sc4, sc4_state, sc4tri7, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tri7l ,sc4tri7, sc4_3reel, sc4, sc4_state, sc4tri7, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tri7o ,sc4tri7, sc4_3reel, sc4, sc4_state, sc4tri7, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tri7p ,sc4tri7, sc4_3reel, sc4, sc4_state, sc4tri7, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tri7q ,sc4tri7, sc4_3reel, sc4, sc4_state, sc4tri7, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tri7r ,sc4tri7, sc4_3reel, sc4, sc4_state, sc4tri7, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 11)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tri7s ,sc4tri7, sc4_3reel, sc4, sc4_state, sc4tri7, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 12)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tri7t ,sc4tri7, sc4_3reel, sc4, sc4_state, sc4tri7, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 13)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tri7u ,sc4tri7, sc4_3reel, sc4, sc4_state, sc4tri7, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 14)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR1328 TRIPLE 7'S PR1328 TRIPLE 7S SOUNDS11 SEVENS ABOVE ARCADE TRIPLE 7'S ABOVE
-GAMEL( 200?, sc4tri7b ,sc4tri7, sc4_3reel, sc4, sc4_state, sc4tri7_mbus, ROT0, "BFM","Triple 7's Arcade (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tri7c ,sc4tri7, sc4_3reel, sc4, sc4_state, sc4tri7_mbus, ROT0, "BFM","Triple 7's Arcade (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tri7d ,sc4tri7, sc4_3reel, sc4, sc4_state, sc4tri7_mbus, ROT0, "BFM","Triple 7's Arcade (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tri7e ,sc4tri7, sc4_3reel, sc4, sc4_state, sc4tri7_mbus, ROT0, "BFM","Triple 7's Arcade (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4tri7b ,sc4tri7, sc4_3reel, sc4, sc4_state, sc4tri7_mbus, ROT0, "BFM","Triple 7's Arcade (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tri7c ,sc4tri7, sc4_3reel, sc4, sc4_state, sc4tri7_mbus, ROT0, "BFM","Triple 7's Arcade (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tri7d ,sc4tri7, sc4_3reel, sc4, sc4_state, sc4tri7_mbus, ROT0, "BFM","Triple 7's Arcade (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tri7e ,sc4tri7, sc4_3reel, sc4, sc4_state, sc4tri7_mbus, ROT0, "BFM","Triple 7's Arcade (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4tub)
@@ -49084,10 +49086,10 @@ DRIVER_INIT_MEMBER(sc4_state,sc4tub)
// PR1103 TUBULAR BELLS PR1103 TUBULAR BELLS SOUNDS11
-GAMEL( 200?, sc4tub ,0, sc4_200_4ra, sc4, sc4_state, sc4tub, ROT0, "BFM","Tubular Bells (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tuba ,sc4tub, sc4_200_4ra, sc4, sc4_state, sc4tub, ROT0, "BFM","Tubular Bells (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tubb ,sc4tub, sc4_200_4ra, sc4, sc4_state, sc4tub, ROT0, "BFM","Tubular Bells (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tubc ,sc4tub, sc4_200_4ra, sc4, sc4_state, sc4tub, ROT0, "BFM","Tubular Bells (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4tub ,0, sc4_200_4ra, sc4, sc4_state, sc4tub, ROT0, "BFM","Tubular Bells (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tuba ,sc4tub, sc4_200_4ra, sc4, sc4_state, sc4tub, ROT0, "BFM","Tubular Bells (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tubb ,sc4tub, sc4_200_4ra, sc4, sc4_state, sc4tub, ROT0, "BFM","Tubular Bells (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4tubc ,sc4tub, sc4_200_4ra, sc4, sc4_state, sc4tub, ROT0, "BFM","Tubular Bells (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -49098,9 +49100,9 @@ DRIVER_INIT_MEMBER(sc4_state,sc4vmclb)
// / PR7132 CLUB VIVA MEXICO PR7132 VIVA SOUNDS11 VIVA MEXICO
-GAMEL( 200?, sc4vmclb ,0, sc4_5reel, sc4, sc4_state, sc4vmclb, ROT0, "BFM","Viva Mexico Club (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4vmclba ,sc4vmclb, sc4_5reel, sc4, sc4_state, sc4vmclb, ROT0, "BFM","Viva Mexico Club (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4vmclbb ,sc4vmclb, sc4_5reel, sc4, sc4_state, sc4vmclb, ROT0, "BFM","Viva Mexico Club (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4vmclb ,0, sc4_5reel, sc4, sc4_state, sc4vmclb, ROT0, "BFM","Viva Mexico Club (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4vmclba ,sc4vmclb, sc4_5reel, sc4, sc4_state, sc4vmclb, ROT0, "BFM","Viva Mexico Club (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4vmclbb ,sc4vmclb, sc4_5reel, sc4, sc4_state, sc4vmclb, ROT0, "BFM","Viva Mexico Club (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -49111,13 +49113,13 @@ DRIVER_INIT_MEMBER(sc4_state,sc4waw)
// Reel 4 is strange ERR24
// PR7065 WET 'N' WILD WILD SOUNDS WET 'N' WILD
-GAMEL( 200?, sc4waw ,0, sc4_4reel, sc4, sc4_state, sc4waw, ROT0, "Mazooma","Wet & Wild (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wawa ,sc4waw, sc4_4reel, sc4, sc4_state, sc4waw, ROT0, "Mazooma","Wet & Wild (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wawb ,sc4waw, sc4_4reel, sc4, sc4_state, sc4waw, ROT0, "Mazooma","Wet & Wild (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wawc ,sc4waw, sc4_4reel, sc4, sc4_state, sc4waw, ROT0, "Mazooma","Wet & Wild (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wawd ,sc4waw, sc4_4reel, sc4, sc4_state, sc4waw, ROT0, "Mazooma","Wet & Wild (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wawe ,sc4waw, sc4_4reel, sc4, sc4_state, sc4waw, ROT0, "Mazooma","Wet & Wild (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wawf ,sc4waw, sc4_4reel, sc4, sc4_state, sc4waw, ROT0, "Mazooma","Wet & Wild (Mazooma) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4waw ,0, sc4_4reel, sc4, sc4_state, sc4waw, ROT0, "Mazooma","Wet & Wild (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4wawa ,sc4waw, sc4_4reel, sc4, sc4_state, sc4waw, ROT0, "Mazooma","Wet & Wild (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4wawb ,sc4waw, sc4_4reel, sc4, sc4_state, sc4waw, ROT0, "Mazooma","Wet & Wild (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4wawc ,sc4waw, sc4_4reel, sc4, sc4_state, sc4waw, ROT0, "Mazooma","Wet & Wild (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4wawd ,sc4waw, sc4_4reel, sc4, sc4_state, sc4waw, ROT0, "Mazooma","Wet & Wild (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4wawe ,sc4waw, sc4_4reel, sc4, sc4_state, sc4waw, ROT0, "Mazooma","Wet & Wild (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4wawf ,sc4waw, sc4_4reel, sc4, sc4_state, sc4waw, ROT0, "Mazooma","Wet & Wild (Mazooma) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4clbtm)
@@ -49127,12 +49129,12 @@ DRIVER_INIT_MEMBER(sc4_state,sc4clbtm)
// PR7131 CLUB TEMPTATION PR7131 TEMPTATION SOUNDS11
-GAMEL( 200?, sc4clbtm ,0, sc4dmd, sc4, sc4_state, sc4clbtm, ROT0, "BFM","Club Temptation (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4_dmd )
-GAMEL( 200?, sc4clbtma ,sc4clbtm, sc4dmd, sc4, sc4_state, sc4clbtm, ROT0, "BFM","Club Temptation (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4_dmd )
-GAMEL( 200?, sc4clbtmb ,sc4clbtm, sc4dmd, sc4, sc4_state, sc4clbtm, ROT0, "BFM","Club Temptation (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4_dmd )
-GAMEL( 200?, sc4clbtmc ,sc4clbtm, sc4dmd, sc4, sc4_state, sc4clbtm, ROT0, "BFM","Club Temptation (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4_dmd )
-GAMEL( 200?, sc4clbtmd ,sc4clbtm, sc4dmd, sc4, sc4_state, sc4clbtm, ROT0, "BFM","Club Temptation (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4_dmd )
-GAMEL( 200?, sc4clbtme ,sc4clbtm, sc4dmd, sc4, sc4_state, sc4clbtm, ROT0, "BFM","Club Temptation (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_sc4_dmd )
+GAMEL( 200?, sc4clbtm ,0, sc4dmd, sc4, sc4_state, sc4clbtm, ROT0, "BFM","Club Temptation (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_sc4_dmd )
+GAMEL( 200?, sc4clbtma ,sc4clbtm, sc4dmd, sc4, sc4_state, sc4clbtm, ROT0, "BFM","Club Temptation (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_sc4_dmd )
+GAMEL( 200?, sc4clbtmb ,sc4clbtm, sc4dmd, sc4, sc4_state, sc4clbtm, ROT0, "BFM","Club Temptation (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_sc4_dmd )
+GAMEL( 200?, sc4clbtmc ,sc4clbtm, sc4dmd, sc4, sc4_state, sc4clbtm, ROT0, "BFM","Club Temptation (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_sc4_dmd )
+GAMEL( 200?, sc4clbtmd ,sc4clbtm, sc4dmd, sc4, sc4_state, sc4clbtm, ROT0, "BFM","Club Temptation (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_sc4_dmd )
+GAMEL( 200?, sc4clbtme ,sc4clbtm, sc4dmd, sc4, sc4_state, sc4clbtm, ROT0, "BFM","Club Temptation (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_sc4_dmd )
@@ -49145,10 +49147,10 @@ DRIVER_INIT_MEMBER(sc4_state,sc4gbcas)
// this one is a variation of lucky balls
// PR1034 CASINO GOLDEN BALLS PR1034 GOLDEN BALLS SOUNDS11
-GAMEL( 200?, sc4gbcas ,0, sc4_200_4r, sc4, sc4_state, sc4gbcas, ROT0, "BFM","Casino Golden Balls (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gbcasa ,sc4gbcas, sc4_200_4r, sc4, sc4_state, sc4gbcas, ROT0, "BFM","Casino Golden Balls (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gbcasb ,sc4gbcas, sc4_200_4r, sc4, sc4_state, sc4gbcas, ROT0, "BFM","Casino Golden Balls (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4gbcasc ,sc4gbcas, sc4_200_4r, sc4, sc4_state, sc4gbcas, ROT0, "BFM","Casino Golden Balls (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4gbcas ,0, sc4_200_4r, sc4, sc4_state, sc4gbcas, ROT0, "BFM","Casino Golden Balls (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gbcasa ,sc4gbcas, sc4_200_4r, sc4, sc4_state, sc4gbcas, ROT0, "BFM","Casino Golden Balls (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gbcasb ,sc4gbcas, sc4_200_4r, sc4, sc4_state, sc4gbcas, ROT0, "BFM","Casino Golden Balls (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4gbcasc ,sc4gbcas, sc4_200_4r, sc4, sc4_state, sc4gbcas, ROT0, "BFM","Casino Golden Balls (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4hntcsm)
@@ -49163,27 +49165,27 @@ DRIVER_INIT_MEMBER(sc4_state,sc4hntcs)
}
// PR1327 CASINO HAPPY NOTES HAPPY NOTES S.SITE PR1327 CAS_HAPPY_NOTES SOUNDS11
-GAMEL( 200?, sc4hntcs ,0, sc4_4reel, sc4, sc4_state, sc4hntcsm, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hntcsa ,sc4hntcs, sc4_4reel, sc4, sc4_state, sc4hntcsm, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hntcsb ,sc4hntcs, sc4_4reel, sc4, sc4_state, sc4hntcsm, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hntcsc ,sc4hntcs, sc4_4reel, sc4, sc4_state, sc4hntcsm, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4hntcs ,0, sc4_4reel, sc4, sc4_state, sc4hntcsm, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hntcsa ,sc4hntcs, sc4_4reel, sc4, sc4_state, sc4hntcsm, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hntcsb ,sc4hntcs, sc4_4reel, sc4, sc4_state, sc4hntcsm, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hntcsc ,sc4hntcs, sc4_4reel, sc4, sc4_state, sc4hntcsm, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR1327 CASINO HAPPY NOTES PR1327 CAS_HAPPY_NOTES SOUNDS11
-GAMEL( 200?, sc4hntcsd ,sc4hntcs, sc4_4reel, sc4, sc4_state, sc4hntcs, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hntcse ,sc4hntcs, sc4_4reel, sc4, sc4_state, sc4hntcs, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hntcsf ,sc4hntcs, sc4_4reel, sc4, sc4_state, sc4hntcs, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hntcsg ,sc4hntcs, sc4_4reel, sc4, sc4_state, sc4hntcs, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hntcsh ,sc4hntcs, sc4_4reel, sc4, sc4_state, sc4hntcs, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hntcsi ,sc4hntcs, sc4_4reel, sc4, sc4_state, sc4hntcs, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hntcsj ,sc4hntcs, sc4_4reel, sc4, sc4_state, sc4hntcs, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 11)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hntcsk ,sc4hntcs, sc4_4reel, sc4, sc4_state, sc4hntcs, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 12)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hntcsl ,sc4hntcs, sc4_4reel, sc4, sc4_state, sc4hntcs, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 13)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hntcsm ,sc4hntcs, sc4_4reel, sc4, sc4_state, sc4hntcs, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 14)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hntcsn ,sc4hntcs, sc4_4reel, sc4, sc4_state, sc4hntcs, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 15)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hntcso ,sc4hntcs, sc4_4reel, sc4, sc4_state, sc4hntcs, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 16)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hntcsp ,sc4hntcs, sc4_4reel, sc4, sc4_state, sc4hntcs, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 17)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hntcsq ,sc4hntcs, sc4_4reel, sc4, sc4_state, sc4hntcs, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 18)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hntcsr ,sc4hntcs, sc4_4reel, sc4, sc4_state, sc4hntcs, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 19)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hntcss ,sc4hntcs, sc4_4reel, sc4, sc4_state, sc4hntcs, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 20)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4hntcsd ,sc4hntcs, sc4_4reel, sc4, sc4_state, sc4hntcs, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hntcse ,sc4hntcs, sc4_4reel, sc4, sc4_state, sc4hntcs, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hntcsf ,sc4hntcs, sc4_4reel, sc4, sc4_state, sc4hntcs, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hntcsg ,sc4hntcs, sc4_4reel, sc4, sc4_state, sc4hntcs, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hntcsh ,sc4hntcs, sc4_4reel, sc4, sc4_state, sc4hntcs, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hntcsi ,sc4hntcs, sc4_4reel, sc4, sc4_state, sc4hntcs, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hntcsj ,sc4hntcs, sc4_4reel, sc4, sc4_state, sc4hntcs, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 11)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hntcsk ,sc4hntcs, sc4_4reel, sc4, sc4_state, sc4hntcs, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 12)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hntcsl ,sc4hntcs, sc4_4reel, sc4, sc4_state, sc4hntcs, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 13)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hntcsm ,sc4hntcs, sc4_4reel, sc4, sc4_state, sc4hntcs, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 14)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hntcsn ,sc4hntcs, sc4_4reel, sc4, sc4_state, sc4hntcs, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 15)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hntcso ,sc4hntcs, sc4_4reel, sc4, sc4_state, sc4hntcs, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 16)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hntcsp ,sc4hntcs, sc4_4reel, sc4, sc4_state, sc4hntcs, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 17)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hntcsq ,sc4hntcs, sc4_4reel, sc4, sc4_state, sc4hntcs, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 18)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hntcsr ,sc4hntcs, sc4_4reel, sc4, sc4_state, sc4hntcs, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 19)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4hntcss ,sc4hntcs, sc4_4reel, sc4, sc4_state, sc4hntcs, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 20)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4rhx)
@@ -49197,38 +49199,38 @@ DRIVER_INIT_MEMBER(sc4_state,sc4rhx_mbus)
}
// PR2077 RED HOT X REDX SOUNDS RED HOT X
-GAMEL( 200?, sc4rhx ,0, sc4_200_altb, sc4, sc4_state, sc4rhx, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rhxa ,sc4rhx, sc4_200_altb, sc4, sc4_state, sc4rhx, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rhxd ,sc4rhx, sc4_200_altb, sc4, sc4_state, sc4rhx, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rhxe ,sc4rhx, sc4_200_altb, sc4, sc4_state, sc4rhx, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rhxj ,sc4rhx, sc4_200_altb, sc4, sc4_state, sc4rhx, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rhxk ,sc4rhx, sc4_200_altb, sc4, sc4_state, sc4rhx, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // incomplete pairing
-GAMEL( 200?, sc4rhxl ,sc4rhx, sc4_200_altb, sc4, sc4_state, sc4rhx, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rhxm ,sc4rhx, sc4_200_altb, sc4, sc4_state, sc4rhx, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4rhx ,0, sc4_200_altb, sc4, sc4_state, sc4rhx, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rhxa ,sc4rhx, sc4_200_altb, sc4, sc4_state, sc4rhx, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rhxd ,sc4rhx, sc4_200_altb, sc4, sc4_state, sc4rhx, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rhxe ,sc4rhx, sc4_200_altb, sc4, sc4_state, sc4rhx, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rhxj ,sc4rhx, sc4_200_altb, sc4, sc4_state, sc4rhx, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rhxk ,sc4rhx, sc4_200_altb, sc4, sc4_state, sc4rhx, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 ) // incomplete pairing
+GAMEL( 200?, sc4rhxl ,sc4rhx, sc4_200_altb, sc4, sc4_state, sc4rhx, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rhxm ,sc4rhx, sc4_200_altb, sc4, sc4_state, sc4rhx, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2077 RED HOT X RED HOT X ARCADE REDX SOUNDS RED HOT X
-GAMEL( 200?, sc4rhxb ,sc4rhx, sc4_200_altb, sc4, sc4_state, sc4rhx_mbus, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rhxc ,sc4rhx, sc4_200_altb, sc4, sc4_state, sc4rhx_mbus, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rhxh ,sc4rhx, sc4_200_altb, sc4, sc4_state, sc4rhx_mbus, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 13)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rhxi ,sc4rhx, sc4_200_altb, sc4, sc4_state, sc4rhx_mbus, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 14)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rhxf ,sc4rhx, sc4_200_altb, sc4, sc4_state, sc4rhx, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 11)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rhxg ,sc4rhx, sc4_200_altb, sc4, sc4_state, sc4rhx, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 12)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rhxn ,sc4rhx, sc4_200_altb, sc4, sc4_state, sc4rhx, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 15)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rhxo ,sc4rhx, sc4_200_altb, sc4, sc4_state, sc4rhx, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 16)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rhxp ,sc4rhx, sc4_200_altb, sc4, sc4_state, sc4rhx, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 17)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rhxq ,sc4rhx, sc4_200_altb, sc4, sc4_state, sc4rhx, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 18)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rhxr ,sc4rhx, sc4_200_altb, sc4, sc4_state, sc4rhx, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 19)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rhxs ,sc4rhx, sc4_200_altb, sc4, sc4_state, sc4rhx, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 20)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rhxt ,sc4rhx, sc4_200_altb, sc4, sc4_state, sc4rhx, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 21)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rhxu ,sc4rhx, sc4_200_altb, sc4, sc4_state, sc4rhx, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 22)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rhxv ,sc4rhx, sc4_200_altb, sc4, sc4_state, sc4rhx, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 23)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rhxw ,sc4rhx, sc4_200_altb, sc4, sc4_state, sc4rhx, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 24)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4rhxb ,sc4rhx, sc4_200_altb, sc4, sc4_state, sc4rhx_mbus, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 9)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rhxc ,sc4rhx, sc4_200_altb, sc4, sc4_state, sc4rhx_mbus, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 10)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rhxh ,sc4rhx, sc4_200_altb, sc4, sc4_state, sc4rhx_mbus, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 13)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rhxi ,sc4rhx, sc4_200_altb, sc4, sc4_state, sc4rhx_mbus, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 14)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rhxf ,sc4rhx, sc4_200_altb, sc4, sc4_state, sc4rhx, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 11)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rhxg ,sc4rhx, sc4_200_altb, sc4, sc4_state, sc4rhx, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 12)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rhxn ,sc4rhx, sc4_200_altb, sc4, sc4_state, sc4rhx, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 15)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rhxo ,sc4rhx, sc4_200_altb, sc4, sc4_state, sc4rhx, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 16)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rhxp ,sc4rhx, sc4_200_altb, sc4, sc4_state, sc4rhx, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 17)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rhxq ,sc4rhx, sc4_200_altb, sc4, sc4_state, sc4rhx, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 18)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rhxr ,sc4rhx, sc4_200_altb, sc4, sc4_state, sc4rhx, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 19)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rhxs ,sc4rhx, sc4_200_altb, sc4, sc4_state, sc4rhx, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 20)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rhxt ,sc4rhx, sc4_200_altb, sc4, sc4_state, sc4rhx, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 21)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rhxu ,sc4rhx, sc4_200_altb, sc4, sc4_state, sc4rhx, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 22)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rhxv ,sc4rhx, sc4_200_altb, sc4, sc4_state, sc4rhx, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 23)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rhxw ,sc4rhx, sc4_200_altb, sc4, sc4_state, sc4rhx, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 24)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR2056 RED HOT X CLUB REDX SOUNDS RED HOT X CLUB
-GAMEL( 200?, sc4rhxcl ,0, sc4, sc4, sc4_state, sc4rhx, ROT0, "Mazooma","Red Hot X Club (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rhxcla ,sc4rhxcl, sc4, sc4, sc4_state, sc4rhx, ROT0, "Mazooma","Red Hot X Club (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rhxclb ,sc4rhxcl, sc4, sc4, sc4_state, sc4rhx, ROT0, "Mazooma","Red Hot X Club (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rhxclc ,sc4rhxcl, sc4, sc4, sc4_state, sc4rhx, ROT0, "Mazooma","Red Hot X Club (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4rhxcl ,0, sc4, sc4, sc4_state, sc4rhx, ROT0, "Mazooma","Red Hot X Club (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rhxcla ,sc4rhxcl, sc4, sc4, sc4_state, sc4rhx, ROT0, "Mazooma","Red Hot X Club (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rhxclb ,sc4rhxcl, sc4, sc4, sc4_state, sc4rhx, ROT0, "Mazooma","Red Hot X Club (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4rhxclc ,sc4rhxcl, sc4, sc4, sc4_state, sc4rhx, ROT0, "Mazooma","Red Hot X Club (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -49239,10 +49241,10 @@ DRIVER_INIT_MEMBER(sc4_state,sc4vivam)
// PR6907 VIVA MEXICO PR6907 VIVA MEXICO SOUNDS11
-GAMEL( 200?, sc4vivam ,0, sc4_4reel, sc4, sc4_state, sc4vivam, ROT0, "BFM","Viva Mexico (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4vivama ,sc4vivam, sc4_4reel, sc4, sc4_state, sc4vivam, ROT0, "BFM","Viva Mexico (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4vivamb ,sc4vivam, sc4_4reel, sc4, sc4_state, sc4vivam, ROT0, "BFM","Viva Mexico (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4vivamc ,sc4vivam, sc4_4reel, sc4, sc4_state, sc4vivam, ROT0, "BFM","Viva Mexico (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4vivam ,0, sc4_4reel, sc4, sc4_state, sc4vivam, ROT0, "BFM","Viva Mexico (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4vivama ,sc4vivam, sc4_4reel, sc4, sc4_state, sc4vivam, ROT0, "BFM","Viva Mexico (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4vivamb ,sc4vivam, sc4_4reel, sc4, sc4_state, sc4vivam, ROT0, "BFM","Viva Mexico (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4vivamc ,sc4vivam, sc4_4reel, sc4, sc4_state, sc4vivam, ROT0, "BFM","Viva Mexico (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4vivcs)
@@ -49254,40 +49256,40 @@ DRIVER_INIT_MEMBER(sc4_state,sc4vivcs)
// PR6927 CASINO VIVA MEXICO PR6927 VIVAMEXICO SOUNDS11
// these do nothing..
-GAMEL( 200?, sc4vivcs ,0, sc4_3reel, sc4, sc4_state, sc4vivcs, ROT0, "BFM","Casino Viva Mexico (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4vivcsa ,sc4vivcs, sc4_3reel, sc4, sc4_state, sc4vivcs, ROT0, "BFM","Casino Viva Mexico (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4vivcs ,0, sc4_3reel, sc4, sc4_state, sc4vivcs, ROT0, "BFM","Casino Viva Mexico (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4vivcsa ,sc4vivcs, sc4_3reel, sc4, sc4_state, sc4vivcs, ROT0, "BFM","Casino Viva Mexico (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR6927 CASINO VIVA MEXICO PR6927 VIVAMEXICO SOUNDS21
// these boot
-GAMEL( 200?, sc4vivcsb ,sc4vivcs, sc4_3reel, sc4, sc4_state, sc4vivcs, ROT0, "BFM","Casino Viva Mexico (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4vivcsc ,sc4vivcs, sc4_3reel, sc4, sc4_state, sc4vivcs, ROT0, "BFM","Casino Viva Mexico (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4vivcsd ,sc4vivcs, sc4_3reel, sc4, sc4_state, sc4vivcs, ROT0, "BFM","Casino Viva Mexico (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4vivcse ,sc4vivcs, sc4_3reel, sc4, sc4_state, sc4vivcs, ROT0, "BFM","Casino Viva Mexico (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4vivcsf ,sc4vivcs, sc4_3reel, sc4, sc4_state, sc4vivcs, ROT0, "BFM","Casino Viva Mexico (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4vivcsg ,sc4vivcs, sc4_3reel, sc4, sc4_state, sc4vivcs, ROT0, "BFM","Casino Viva Mexico (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4vivcsb ,sc4vivcs, sc4_3reel, sc4, sc4_state, sc4vivcs, ROT0, "BFM","Casino Viva Mexico (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4vivcsc ,sc4vivcs, sc4_3reel, sc4, sc4_state, sc4vivcs, ROT0, "BFM","Casino Viva Mexico (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4vivcsd ,sc4vivcs, sc4_3reel, sc4, sc4_state, sc4vivcs, ROT0, "BFM","Casino Viva Mexico (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4vivcse ,sc4vivcs, sc4_3reel, sc4, sc4_state, sc4vivcs, ROT0, "BFM","Casino Viva Mexico (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4vivcsf ,sc4vivcs, sc4_3reel, sc4, sc4_state, sc4vivcs, ROT0, "BFM","Casino Viva Mexico (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4vivcsg ,sc4vivcs, sc4_3reel, sc4, sc4_state, sc4vivcs, ROT0, "BFM","Casino Viva Mexico (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR7054 POWER BALL POWERBALL SOUNDS
-GAMEL( 200?, sc4pwrbq ,0, sc4, sc4, sc4_state, sc4, ROT0, "Qps","Power Ball (Qps) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pwrbqa ,sc4pwrbq, sc4, sc4, sc4_state, sc4, ROT0, "Qps","Power Ball (Qps) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4pwrbq ,0, sc4, sc4, sc4_state, sc4, ROT0, "Qps","Power Ball (Qps) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4pwrbqa ,sc4pwrbq, sc4, sc4, sc4_state, sc4, ROT0, "Qps","Power Ball (Qps) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// fails to boot, like many of the Pole Position sets, probably needs some specific dips setting due to buggy code?
// PR7008 CHUBBY DOES VEGAS VEGAS SOUNDS11
-GAMEL( 200?, sc4chub ,0, sc4_4reel, sc4, sc4_state, sc4, ROT0, "Mazooma","Chubby Does Vegas (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4chuba ,sc4chub, sc4_4reel, sc4, sc4_state, sc4, ROT0, "Mazooma","Chubby Does Vegas (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4chubb ,sc4chub, sc4_4reel, sc4, sc4_state, sc4, ROT0, "Mazooma","Chubby Does Vegas (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4chub ,0, sc4_4reel, sc4, sc4_state, sc4, ROT0, "Mazooma","Chubby Does Vegas (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4chuba ,sc4chub, sc4_4reel, sc4, sc4_state, sc4, ROT0, "Mazooma","Chubby Does Vegas (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4chubb ,sc4chub, sc4_4reel, sc4, sc4_state, sc4, ROT0, "Mazooma","Chubby Does Vegas (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
// no sound roms, doesn't init properly (doesn't even attempt reel test)
// PR7011 BLUE RINSE BRINSE SOUNDS
-GAMEL( 200?, sc4blue ,0, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Blue Rinse (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bluea ,sc4blue, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Blue Rinse (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4blueb ,sc4blue, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Blue Rinse (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bluec ,sc4blue, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Blue Rinse (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4blued ,sc4blue, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Blue Rinse (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bluee ,sc4blue, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Blue Rinse (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4blue ,0, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Blue Rinse (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4bluea ,sc4blue, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Blue Rinse (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4blueb ,sc4blue, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Blue Rinse (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4bluec ,sc4blue, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Blue Rinse (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4blued ,sc4blue, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Blue Rinse (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4bluee ,sc4blue, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Blue Rinse (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
DRIVER_INIT_MEMBER(sc4_state,sc4bugs)
@@ -49298,15 +49300,15 @@ DRIVER_INIT_MEMBER(sc4_state,sc4bugs)
// no sound roms
// PR7109 BUGS MONEY PR7109 BUGS MONEY SOUNDS11 BUGS MONEY
-GAMEL( 200?, sc4bugs ,0, sc4, sc4, sc4_state, sc4bugs, ROT0, "BFM","Bugs Money (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bugsa ,sc4bugs, sc4, sc4, sc4_state, sc4bugs, ROT0, "BFM","Bugs Money (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bugsb ,sc4bugs, sc4, sc4, sc4_state, sc4bugs, ROT0, "BFM","Bugs Money (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4bugsc ,sc4bugs, sc4, sc4, sc4_state, sc4bugs, ROT0, "BFM","Bugs Money (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4bugs ,0, sc4, sc4, sc4_state, sc4bugs, ROT0, "BFM","Bugs Money (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4bugsa ,sc4bugs, sc4, sc4, sc4_state, sc4bugs, ROT0, "BFM","Bugs Money (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4bugsb ,sc4bugs, sc4, sc4, sc4_state, sc4bugs, ROT0, "BFM","Bugs Money (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4bugsc ,sc4bugs, sc4, sc4, sc4_state, sc4bugs, ROT0, "BFM","Bugs Money (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// PR7029 MONEY TO MONEY MTOM SOUNDS
-GAMEL( 200?, sc4m2m ,0, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Money To Money (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4m2ma ,sc4m2m, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Money To Money (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4m2m ,0, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Money To Money (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4m2ma ,sc4m2m, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Money To Money (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
@@ -49317,10 +49319,10 @@ DRIVER_INIT_MEMBER(sc4_state,sc4chand)
// no sound roms
// PR7108 CASH IN HAND PR7108 CASH IN HAND SOUNDS11 CASH IN HAND
-GAMEL( 200?, sc4chand ,0, sc4_4reel, sc4, sc4_state, sc4chand, ROT0, "BFM","Cash In Hand (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4chanda ,sc4chand, sc4_4reel, sc4, sc4_state, sc4chand, ROT0, "BFM","Cash In Hand (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4chandb ,sc4chand, sc4_4reel, sc4, sc4_state, sc4chand, ROT0, "BFM","Cash In Hand (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4chandc ,sc4chand, sc4_4reel, sc4, sc4_state, sc4chand, ROT0, "BFM","Cash In Hand (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4chand ,0, sc4_4reel, sc4, sc4_state, sc4chand, ROT0, "BFM","Cash In Hand (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4chanda ,sc4chand, sc4_4reel, sc4, sc4_state, sc4chand, ROT0, "BFM","Cash In Hand (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4chandb ,sc4chand, sc4_4reel, sc4, sc4_state, sc4chand, ROT0, "BFM","Cash In Hand (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4chandc ,sc4chand, sc4_4reel, sc4, sc4_state, sc4chand, ROT0, "BFM","Cash In Hand (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
@@ -49332,349 +49334,349 @@ DRIVER_INIT_MEMBER(sc4_state,sc4cinv)
// no sound roms
// PR6809 CASHINVADERS PR6809 CASHINVADERS SOUNDS
-GAMEL( 200?, sc4cinv ,0, sc4_4reel, sc4, sc4_state, sc4cinv, ROT0, "BFM","Cash Invaders (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cinva ,sc4cinv, sc4_4reel, sc4, sc4_state, sc4cinv, ROT0, "BFM","Cash Invaders (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cinvb ,sc4cinv, sc4_4reel, sc4, sc4_state, sc4cinv, ROT0, "BFM","Cash Invaders (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cinvc ,sc4cinv, sc4_4reel, sc4, sc4_state, sc4cinv, ROT0, "BFM","Cash Invaders (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cinvd ,sc4cinv, sc4_4reel, sc4, sc4_state, sc4cinv, ROT0, "BFM","Cash Invaders (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cinve ,sc4cinv, sc4_4reel, sc4, sc4_state, sc4cinv, ROT0, "BFM","Cash Invaders (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cinvf ,sc4cinv, sc4_4reel, sc4, sc4_state, sc4cinv, ROT0, "BFM","Cash Invaders (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cinvg ,sc4cinv, sc4_4reel, sc4, sc4_state, sc4cinv, ROT0, "BFM","Cash Invaders (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cinvh ,sc4cinv, sc4_4reel, sc4, sc4_state, sc4cinv, ROT0, "BFM","Cash Invaders (Bellfruit) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4cinvi ,sc4cinv, sc4_4reel, sc4, sc4_state, sc4cinv, ROT0, "BFM","Cash Invaders (Bellfruit) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cinv ,0, sc4_4reel, sc4, sc4_state, sc4cinv, ROT0, "BFM","Cash Invaders (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4cinva ,sc4cinv, sc4_4reel, sc4, sc4_state, sc4cinv, ROT0, "BFM","Cash Invaders (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4cinvb ,sc4cinv, sc4_4reel, sc4, sc4_state, sc4cinv, ROT0, "BFM","Cash Invaders (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4cinvc ,sc4cinv, sc4_4reel, sc4, sc4_state, sc4cinv, ROT0, "BFM","Cash Invaders (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4cinvd ,sc4cinv, sc4_4reel, sc4, sc4_state, sc4cinv, ROT0, "BFM","Cash Invaders (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4cinve ,sc4cinv, sc4_4reel, sc4, sc4_state, sc4cinv, ROT0, "BFM","Cash Invaders (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4cinvf ,sc4cinv, sc4_4reel, sc4, sc4_state, sc4cinv, ROT0, "BFM","Cash Invaders (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4cinvg ,sc4cinv, sc4_4reel, sc4, sc4_state, sc4cinv, ROT0, "BFM","Cash Invaders (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4cinvh ,sc4cinv, sc4_4reel, sc4, sc4_state, sc4cinv, ROT0, "BFM","Cash Invaders (Bellfruit) (Scorpion 4) (set 9)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4cinvi ,sc4cinv, sc4_4reel, sc4, sc4_state, sc4cinv, ROT0, "BFM","Cash Invaders (Bellfruit) (Scorpion 4) (set 10)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// PR7103 JUNGLE BUCKS PR7103 JUNGLEBUCKS SOUNDS11 JUNGLE BUCKS
-GAMEL( 200?, sc4jbuck ,0, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Jungle Bucks (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4jbucka ,sc4jbuck, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Jungle Bucks (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4jbuckb ,sc4jbuck, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Jungle Bucks (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4jbuckc ,sc4jbuck, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Jungle Bucks (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4jbuckd ,sc4jbuck, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Jungle Bucks (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4jbuck ,0, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Jungle Bucks (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4jbucka ,sc4jbuck, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Jungle Bucks (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4jbuckb ,sc4jbuck, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Jungle Bucks (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4jbuckc ,sc4jbuck, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Jungle Bucks (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4jbuckd ,sc4jbuck, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Jungle Bucks (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// PR6904 MONEY BAGS PR6904 MONEY BAGS SOUNDS11
-GAMEL( 200?, sc4mbags ,0, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Money Bags (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mbagsa ,sc4mbags, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Money Bags (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mbagsb ,sc4mbags, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Money Bags (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4mbagsc ,sc4mbags, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Money Bags (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4mbags ,0, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Money Bags (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4mbagsa ,sc4mbags, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Money Bags (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4mbagsb ,sc4mbags, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Money Bags (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4mbagsc ,sc4mbags, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Money Bags (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// sound roms are bad, missing first 0x10000 bytes with header
// PR6938 TUTTI FRUTTI PR6938 FRUT SOUNDS11 TUTTI FRUTTI
-GAMEL( 200?, sc4tfclb ,0, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Tutti Frutti Club (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tfclba ,sc4tfclb, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Tutti Frutti Club (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4tfclb ,0, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Tutti Frutti Club (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4tfclba ,sc4tfclb, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Tutti Frutti Club (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// doesn't like the sound rom we have even if the ID is right
// PR7022 UP FOR GRABS GRAB SOUNDS
-GAMEL( 200?, sc4ufg ,0, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Up For Grabs (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ufga ,sc4ufg, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Up For Grabs (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4ufg ,0, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Up For Grabs (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4ufga ,sc4ufg, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Up For Grabs (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// PR6819 UP FOT IT PR6819 UP FOR IT SOUNDS11
-GAMEL( 200?, sc4ufi ,0, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Up For It (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ufia ,sc4ufi, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Up For It (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ufib ,sc4ufi, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Up For It (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ufic ,sc4ufi, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Up For It (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ufid ,sc4ufi, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Up For It (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ufie ,sc4ufi, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Up For It (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // incomplete pairing
+GAMEL( 200?, sc4ufi ,0, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Up For It (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4ufia ,sc4ufi, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Up For It (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4ufib ,sc4ufi, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Up For It (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4ufic ,sc4ufi, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Up For It (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4ufid ,sc4ufi, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Up For It (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4ufie ,sc4ufi, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Up For It (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 ) // incomplete pairing
// PR6812 WHO DARES WINS PR6812 WHO DARES WINS SOUNDS
-GAMEL( 200?, sc4wdw ,0, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Who Dares Wins (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wdwa ,sc4wdw, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Who Dares Wins (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wdwb ,sc4wdw, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Who Dares Wins (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wdwc ,sc4wdw, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Who Dares Wins (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wdwd ,sc4wdw, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Who Dares Wins (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wdwe ,sc4wdw, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Who Dares Wins (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wdwf ,sc4wdw, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Who Dares Wins (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wdwg ,sc4wdw, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Who Dares Wins (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wdwh ,sc4wdw, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Who Dares Wins (Bellfruit) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wdwi ,sc4wdw, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Who Dares Wins (Bellfruit) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wdwj ,sc4wdw, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Who Dares Wins (Bellfruit) (Scorpion 4) (set 11)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4wdw ,0, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Who Dares Wins (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4wdwa ,sc4wdw, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Who Dares Wins (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4wdwb ,sc4wdw, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Who Dares Wins (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4wdwc ,sc4wdw, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Who Dares Wins (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4wdwd ,sc4wdw, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Who Dares Wins (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4wdwe ,sc4wdw, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Who Dares Wins (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4wdwf ,sc4wdw, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Who Dares Wins (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4wdwg ,sc4wdw, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Who Dares Wins (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4wdwh ,sc4wdw, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Who Dares Wins (Bellfruit) (Scorpion 4) (set 9)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4wdwi ,sc4wdw, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Who Dares Wins (Bellfruit) (Scorpion 4) (set 10)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4wdwj ,sc4wdw, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Who Dares Wins (Bellfruit) (Scorpion 4) (set 11)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// PR7144 WILD BUNCH PR7144 CRAZY FRUITS SOUNDS11
-GAMEL( 200?, sc4wldbn ,0, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Wild Bunch (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wldbna ,sc4wldbn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Wild Bunch (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wldbnb ,sc4wldbn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Wild Bunch (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wldbnc ,sc4wldbn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Wild Bunch (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wldbnd ,sc4wldbn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Wild Bunch (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wldbne ,sc4wldbn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Wild Bunch (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wldbnf ,sc4wldbn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Wild Bunch (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wldbni ,sc4wldbn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Wild Bunch (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wldbnj ,sc4wldbn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Wild Bunch (Bellfruit) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wldbnk ,sc4wldbn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Wild Bunch (Bellfruit) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wldbnn ,sc4wldbn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Wild Bunch (Bellfruit) (Scorpion 4) (set 11)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wldbno ,sc4wldbn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Wild Bunch (Bellfruit) (Scorpion 4) (set 12)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wldbnp ,sc4wldbn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Wild Bunch (Bellfruit) (Scorpion 4) (set 13)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wldbnq ,sc4wldbn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Wild Bunch (Bellfruit) (Scorpion 4) (set 14)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4wldbn ,0, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Wild Bunch (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4wldbna ,sc4wldbn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Wild Bunch (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4wldbnb ,sc4wldbn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Wild Bunch (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4wldbnc ,sc4wldbn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Wild Bunch (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4wldbnd ,sc4wldbn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Wild Bunch (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4wldbne ,sc4wldbn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Wild Bunch (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4wldbnf ,sc4wldbn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Wild Bunch (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4wldbni ,sc4wldbn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Wild Bunch (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4wldbnj ,sc4wldbn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Wild Bunch (Bellfruit) (Scorpion 4) (set 9)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4wldbnk ,sc4wldbn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Wild Bunch (Bellfruit) (Scorpion 4) (set 10)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4wldbnn ,sc4wldbn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Wild Bunch (Bellfruit) (Scorpion 4) (set 11)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4wldbno ,sc4wldbn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Wild Bunch (Bellfruit) (Scorpion 4) (set 12)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4wldbnp ,sc4wldbn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Wild Bunch (Bellfruit) (Scorpion 4) (set 13)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4wldbnq ,sc4wldbn, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Wild Bunch (Bellfruit) (Scorpion 4) (set 14)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// PR7144 WILD BUNCH PR7144 WILD BUNCH SOUNDS11 CAS WILD BUNCH S.SITE
-GAMEL( 200?, sc4wldbng ,sc4wldbn, sc4, sc4, sc4_state, sc4mbus, ROT0, "BFM","Wild Bunch Casino (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wldbnh ,sc4wldbn, sc4, sc4, sc4_state, sc4mbus, ROT0, "BFM","Wild Bunch Casino (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wldbnl ,sc4wldbn, sc4, sc4, sc4_state, sc4mbus, ROT0, "BFM","Wild Bunch Casino (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wldbnm ,sc4wldbn, sc4, sc4, sc4_state, sc4mbus, ROT0, "BFM","Wild Bunch Casino (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4wldbng ,sc4wldbn, sc4, sc4, sc4_state, sc4mbus, ROT0, "BFM","Wild Bunch Casino (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4wldbnh ,sc4wldbn, sc4, sc4, sc4_state, sc4mbus, ROT0, "BFM","Wild Bunch Casino (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4wldbnl ,sc4wldbn, sc4, sc4, sc4_state, sc4mbus, ROT0, "BFM","Wild Bunch Casino (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4wldbnm ,sc4wldbn, sc4, sc4, sc4_state, sc4mbus, ROT0, "BFM","Wild Bunch Casino (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// PR7110 WILD THING PR7110 WILD THING SOUNDS11
-GAMEL( 200?, sc4wthng ,0, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Wild Thing (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wthnga ,sc4wthng, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Wild Thing (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wthngb ,sc4wthng, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Wild Thing (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wthngc ,sc4wthng, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Wild Thing (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4wthng ,0, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Wild Thing (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4wthnga ,sc4wthng, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Wild Thing (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4wthngb ,sc4wthng, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Wild Thing (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4wthngc ,sc4wthng, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Wild Thing (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// does NOT want 'WILD SOUNDS' from 'PR7065 WET 'N' WILD'
// PR7060CASINO WILDTHING WILD THING ARCADE WILD SOUNDS WILD THING
-GAMEL( 200?, sc4wthnm ,0, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Wild Thing Casino Arcade (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wthnma ,sc4wthnm, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Wild Thing Casino Arcade (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wthnmb ,sc4wthnm, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Wild Thing Casino Arcade (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wthnmc ,sc4wthnm, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Wild Thing Casino Arcade (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wthnmd ,sc4wthnm, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Wild Thing Casino Arcade (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wthnme ,sc4wthnm, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Wild Thing Casino Arcade (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wthnmf ,sc4wthnm, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Wild Thing Casino Arcade (Mazooma) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4wthnm ,0, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Wild Thing Casino Arcade (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4wthnma ,sc4wthnm, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Wild Thing Casino Arcade (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4wthnmb ,sc4wthnm, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Wild Thing Casino Arcade (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4wthnmc ,sc4wthnm, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Wild Thing Casino Arcade (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4wthnmd ,sc4wthnm, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Wild Thing Casino Arcade (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4wthnme ,sc4wthnm, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Wild Thing Casino Arcade (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4wthnmf ,sc4wthnm, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Wild Thing Casino Arcade (Mazooma) (Scorpion 4) (set 7)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// PR7060CASINO WILDTHING WILD SOUNDS WILD THING
-GAMEL( 200?, sc4wtc ,0, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Wild Thing Casino (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wtca ,sc4wtc, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Wild Thing Casino (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wtcb ,sc4wtc, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Wild Thing Casino (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wtcc ,sc4wtc, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Wild Thing Casino (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wtcd ,sc4wtc, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Wild Thing Casino (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wtce ,sc4wtc, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Wild Thing Casino (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wtcf ,sc4wtc, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Wild Thing Casino (Mazooma) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4wtc ,0, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Wild Thing Casino (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4wtca ,sc4wtc, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Wild Thing Casino (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4wtcb ,sc4wtc, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Wild Thing Casino (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4wtcc ,sc4wtc, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Wild Thing Casino (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4wtcd ,sc4wtc, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Wild Thing Casino (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4wtce ,sc4wtc, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Wild Thing Casino (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4wtcf ,sc4wtc, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Wild Thing Casino (Mazooma) (Scorpion 4) (set 7)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// half size sound rom, or missing a rom
// PR7017 THREE LIONS LION SOUNDS
-GAMEL( 200?, sc4lions ,0, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Three Lions (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4lionsa ,sc4lions, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Three Lions (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4lionsb ,sc4lions, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Three Lions (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4lionsc ,sc4lions, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Three Lions (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4lionsd ,sc4lions, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Three Lions (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4lionse ,sc4lions, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Three Lions (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4lionsf ,sc4lions, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Three Lions (Mazooma) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4lions ,0, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Three Lions (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4lionsa ,sc4lions, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Three Lions (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4lionsb ,sc4lions, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Three Lions (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4lionsc ,sc4lions, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Three Lions (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4lionsd ,sc4lions, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Three Lions (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4lionse ,sc4lions, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Three Lions (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4lionsf ,sc4lions, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Three Lions (Mazooma) (Scorpion 4) (set 7)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// wrong sound roms
// PROJECT NUMBER PR7113 TEMPTATION PR7113 TEMPTATION SOUNDS11
-GAMEL( 200?, sc4tempt ,0, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Temptation (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tempta ,sc4tempt, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Temptation (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4temptb ,sc4tempt, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Temptation (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4temptc ,sc4tempt, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Temptation (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4temptd ,sc4tempt, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Temptation (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4tempte ,sc4tempt, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Temptation (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4temptf ,sc4tempt, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Temptation (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4temptg ,sc4tempt, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Temptation (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4tempt ,0, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Temptation (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4tempta ,sc4tempt, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Temptation (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4temptb ,sc4tempt, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Temptation (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4temptc ,sc4tempt, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Temptation (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4temptd ,sc4tempt, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Temptation (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4tempte ,sc4tempt, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Temptation (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4temptf ,sc4tempt, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Temptation (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4temptg ,sc4tempt, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Temptation (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// half size sound rom, or missing a rom
// PR7016 TAKE THE PISTE PISTE SOUNDS
-GAMEL( 200?, sc4ttp ,0, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Take The Piste (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ttpa ,sc4ttp, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Take The Piste (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ttpb ,sc4ttp, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Take The Piste (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ttpc ,sc4ttp, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Take The Piste (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ttpd ,sc4ttp, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Take The Piste (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ttpe ,sc4ttp, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Take The Piste (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ttpf ,sc4ttp, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Take The Piste (Mazooma) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4ttp ,0, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Take The Piste (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4ttpa ,sc4ttp, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Take The Piste (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4ttpb ,sc4ttp, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Take The Piste (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4ttpc ,sc4ttp, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Take The Piste (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4ttpd ,sc4ttp, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Take The Piste (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4ttpe ,sc4ttp, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Take The Piste (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4ttpf ,sc4ttp, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Take The Piste (Mazooma) (Scorpion 4) (set 7)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// PR6806 MOTORWAY MAYHEM PR6806 MAYH SOUNDS11
-GAMEL( 200?, sc4motor ,0, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Motorway Mania (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4motora ,sc4motor, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Motorway Mania (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4motorb ,sc4motor, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Motorway Mania (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4motorc ,sc4motor, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Motorway Mania (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4motord ,sc4motor, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Motorway Mania (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4motore ,sc4motor, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Motorway Mania (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4motorf ,sc4motor, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Motorway Mania (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4motorg ,sc4motor, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Motorway Mania (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4motorh ,sc4motor, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Motorway Mania (Bellfruit) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4motor ,0, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Motorway Mania (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4motora ,sc4motor, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Motorway Mania (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4motorb ,sc4motor, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Motorway Mania (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4motorc ,sc4motor, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Motorway Mania (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4motord ,sc4motor, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Motorway Mania (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4motore ,sc4motor, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Motorway Mania (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4motorf ,sc4motor, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Motorway Mania (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4motorg ,sc4motor, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Motorway Mania (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4motorh ,sc4motor, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Motorway Mania (Bellfruit) (Scorpion 4) (set 9)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// sound roms are bad dumps
// PR6915 stag night PR6915 STAG NIGHT SOUNDS11
-GAMEL( 200?, sc4stag ,0, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Stag Night (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4staga ,sc4stag, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Stag Night (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4stag ,0, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Stag Night (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4staga ,sc4stag, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Stag Night (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// PR7016 HICKORY DICKORY DOSH HICKORY SOUNDS
-GAMEL( 200?, sc4hdd ,0, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Hickory Dickory Dosh (PR7016) (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hddc ,sc4hdd, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Hickory Dickory Dosh (PR7016) (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hddd ,sc4hdd, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Hickory Dickory Dosh (PR7016) (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4hdd ,0, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Hickory Dickory Dosh (PR7016) (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4hddc ,sc4hdd, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Hickory Dickory Dosh (PR7016) (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4hddd ,sc4hdd, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Hickory Dickory Dosh (PR7016) (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// PR7045 HICKORY DICKORY DOSH HICKORY SOUNDS
-GAMEL( 200?, sc4hdda ,sc4hdd, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Hickory Dickory Dosh (PR7045) (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hddb ,sc4hdd, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Hickory Dickory Dosh (PR7045) (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hdde ,sc4hdd, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Hickory Dickory Dosh (PR7045) (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4hddf ,sc4hdd, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Hickory Dickory Dosh (PR7045) (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4hdda ,sc4hdd, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Hickory Dickory Dosh (PR7045) (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4hddb ,sc4hdd, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Hickory Dickory Dosh (PR7045) (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4hdde ,sc4hdd, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Hickory Dickory Dosh (PR7045) (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4hddf ,sc4hdd, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Hickory Dickory Dosh (PR7045) (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// // does NOT want 'WILD SOUNDS' from 'PR7065 WET 'N' WILD'
// PR2043 NUDGE IT WILD SOUNDS NUDGE IT
-GAMEL( 200?, sc4nudit ,0, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Nudge It (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4nudit ,0, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Nudge It (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// PR2043 NUDGE IT NGIT SOUNDS NUDGE IT
-GAMEL( 200?, sc4nudita ,sc4nudit, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Nudge It (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4nuditb ,sc4nudit, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Nudge It (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4nudita ,sc4nudit, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Nudge It (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4nuditb ,sc4nudit, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Nudge It (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR6908 OUTLAW PR6908 OUTLAW SOUNDS11
-GAMEL( 200?, sc4outlw ,0, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Outlaw (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4outlwa ,sc4outlw, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Outlaw (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4outlwb ,sc4outlw, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Outlaw (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4outlwc ,sc4outlw, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Outlaw (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4outlw ,0, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Outlaw (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4outlwa ,sc4outlw, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Outlaw (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4outlwb ,sc4outlw, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Outlaw (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4outlwc ,sc4outlw, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Outlaw (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// PR7002 ROLLOVER JACKPOT PR7002 ROLLOVER SOUNDS
-GAMEL( 200?, sc4rollo ,0, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Rollover Jackpot (PR7002) (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rolloa ,sc4rollo, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Rollover Jackpot (PR7002) (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rolloc ,sc4rollo, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Rollover Jackpot (PR7002) (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rollod ,sc4rollo, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Rollover Jackpot (PR7002) (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4rollo ,0, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Rollover Jackpot (PR7002) (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4rolloa ,sc4rollo, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Rollover Jackpot (PR7002) (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4rolloc ,sc4rollo, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Rollover Jackpot (PR7002) (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4rollod ,sc4rollo, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Rollover Jackpot (PR7002) (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// PR7032 ROLLOVER JACKPOT PR7002 ROLLOVER SOUNDS
-GAMEL( 200?, sc4rollob ,sc4rollo, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Rollover Jackpot (PR7032) (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rolloe ,sc4rollo, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Rollover Jackpot (PR7032) (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rollof ,sc4rollo, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Rollover Jackpot (PR7032) (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4rollob ,sc4rollo, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Rollover Jackpot (PR7032) (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4rolloe ,sc4rollo, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Rollover Jackpot (PR7032) (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4rollof ,sc4rollo, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Rollover Jackpot (PR7032) (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// PR2086 ROUTE66 RT66 SOUNDS ROUTE 66
-GAMEL( 200?, sc4r66 ,0, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Route 66 (Mazooma) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4r66 ,0, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Route 66 (Mazooma) (Scorpion 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// PR1031 CASINO ROLL ME OVER PR1031 ROLL ME OVER SOUNDS11
-GAMEL( 200?, sc4rmo ,0, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Roll Me Over Casino (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4rmoa ,sc4rmo, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Roll Me Over Casino (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4rmo ,0, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Roll Me Over Casino (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4rmoa ,sc4rmo, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Roll Me Over Casino (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// missing sound roms
// PR7021 JIGGERY POKERY PR7021 SOUNDS
-GAMEL( 200?, sc4jiggr ,0, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Jiggery Pokery (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4jiggra ,sc4jiggr, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Jiggery Pokery (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4jiggrb ,sc4jiggr, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Jiggery Pokery (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4jiggrc ,sc4jiggr, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Jiggery Pokery (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4jiggr ,0, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Jiggery Pokery (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4jiggra ,sc4jiggr, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Jiggery Pokery (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4jiggrb ,sc4jiggr, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Jiggery Pokery (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4jiggrc ,sc4jiggr, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Jiggery Pokery (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// WRONG SOUNDS, PAY UNIT ERR 17
-GAMEL( 200?, sc4cmon ,0, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Casino Monopoly (PR2133) (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // PR2133 CASINO MONOPOLY MONOPOLY ARCADE MONL SOUNDS MONOPOLY
-GAMEL( 200?, sc4cmona ,sc4cmon, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Casino Monopoly (PR2133) (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // ^^
-GAMEL( 200?, sc4cmonb ,sc4cmon, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Casino Monopoly (PR2133) (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // ^^
-GAMEL( 200?, sc4cmonc ,sc4cmon, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Casino Monopoly (PR2133) (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // ^^
-GAMEL( 200?, sc4cmond ,sc4cmon, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Casino Monopoly (PR2133) (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // ^^
-GAMEL( 200?, sc4cmone ,sc4cmon, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Casino Monopoly (PR2133) (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // ^^
-GAMEL( 200?, sc4cmonf ,sc4cmon, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Casino Monopoly (PR2133) (Mazooma) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // ^^
-GAMEL( 200?, sc4cmong ,sc4cmon, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Casino Monopoly (PR2133) (Mazooma) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // ^^
-GAMEL( 200?, sc4cmonh ,sc4cmon, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Casino Monopoly (PR2133) (Mazooma) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // ^^
-GAMEL( 200?, sc4cmoni ,sc4cmon, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Casino Monopoly (PR2133) (Mazooma) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // ^^
+GAMEL( 200?, sc4cmon ,0, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Casino Monopoly (PR2133) (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 ) // PR2133 CASINO MONOPOLY MONOPOLY ARCADE MONL SOUNDS MONOPOLY
+GAMEL( 200?, sc4cmona ,sc4cmon, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Casino Monopoly (PR2133) (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 ) // ^^
+GAMEL( 200?, sc4cmonb ,sc4cmon, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Casino Monopoly (PR2133) (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 ) // ^^
+GAMEL( 200?, sc4cmonc ,sc4cmon, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Casino Monopoly (PR2133) (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 ) // ^^
+GAMEL( 200?, sc4cmond ,sc4cmon, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Casino Monopoly (PR2133) (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 ) // ^^
+GAMEL( 200?, sc4cmone ,sc4cmon, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Casino Monopoly (PR2133) (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 ) // ^^
+GAMEL( 200?, sc4cmonf ,sc4cmon, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Casino Monopoly (PR2133) (Mazooma) (Scorpion 4) (set 7)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 ) // ^^
+GAMEL( 200?, sc4cmong ,sc4cmon, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Casino Monopoly (PR2133) (Mazooma) (Scorpion 4) (set 8)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 ) // ^^
+GAMEL( 200?, sc4cmonh ,sc4cmon, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Casino Monopoly (PR2133) (Mazooma) (Scorpion 4) (set 9)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 ) // ^^
+GAMEL( 200?, sc4cmoni ,sc4cmon, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Casino Monopoly (PR2133) (Mazooma) (Scorpion 4) (set 10)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 ) // ^^
// PR6810 POWER CRAZY PR6810 POWER SOUNDS11
-GAMEL( 200?, sc4pwcrz ,0, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Power Crazy (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pwcrza ,sc4pwcrz, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Power Crazy (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pwcrzb ,sc4pwcrz, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Power Crazy (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pwcrze ,sc4pwcrz, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Power Crazy (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pwcrzf ,sc4pwcrz, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Power Crazy (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // incomplete pairing
-GAMEL( 200?, sc4pwcrzg ,sc4pwcrz, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Power Crazy (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4pwcrz ,0, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Power Crazy (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4pwcrza ,sc4pwcrz, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Power Crazy (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4pwcrzb ,sc4pwcrz, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Power Crazy (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4pwcrze ,sc4pwcrz, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Power Crazy (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4pwcrzf ,sc4pwcrz, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Power Crazy (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 ) // incomplete pairing
+GAMEL( 200?, sc4pwcrzg ,sc4pwcrz, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Power Crazy (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// PR4610 POWER CRAZY SP98 PR6810 POWER SOUNDS11
-GAMEL( 200?, sc4pwcrzc ,sc4pwcrz, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Power Crazy SP98 (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pwcrzd ,sc4pwcrz, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Power Crazy SP98 (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pwcrzh ,sc4pwcrz, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Power Crazy SP98 (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4pwcrzi ,sc4pwcrz, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Power Crazy SP98 (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4pwcrzc ,sc4pwcrz, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Power Crazy SP98 (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4pwcrzd ,sc4pwcrz, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Power Crazy SP98 (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4pwcrzh ,sc4pwcrz, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Power Crazy SP98 (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4pwcrzi ,sc4pwcrz, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Power Crazy SP98 (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// some of the italian / german sets have input structures, but not fruit machine ones
// PR1191 QUARTERBACK QBCK SOUNDS QUARTERBACK
-GAMEL( 200?, sc4quart ,0, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Quaterback (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4quarta ,sc4quart, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Quaterback (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4quart ,0, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Quaterback (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4quarta ,sc4quart, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Quaterback (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// QUARTERBACK .PR2072.ITALIAN QUARTERBACK.. (non-standard header)
-GAMEL( 200?, sc4quartb ,sc4quart, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Quaterback (PR2072) (Italian) (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4quarte ,sc4quart, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Quaterback (PR2072) (Italian) (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4quarti ,sc4quart, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Quaterback (PR2072) (Italian) (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4quartk ,sc4quart, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Quaterback (PR2072) (Italian) (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4quartb ,sc4quart, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Quaterback (PR2072) (Italian) (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4quarte ,sc4quart, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Quaterback (PR2072) (Italian) (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4quarti ,sc4quart, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Quaterback (PR2072) (Italian) (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4quartk ,sc4quart, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Quaterback (PR2072) (Italian) (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// QUARTERBACK .PR2064.GERMAN QUARTERBACK.. (non-standard header)
-GAMEL( 200?, sc4quartc ,sc4quart, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Quaterback (PR2064) (German) (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4quartd ,sc4quart, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Quaterback (PR2064) (German) (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4quartf ,sc4quart, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Quaterback (PR2064) (German) (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4quartg ,sc4quart, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Quaterback (PR2064) (German) (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4quarth ,sc4quart, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Quaterback (PR2064) (German) (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4quartj ,sc4quart, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Quaterback (PR2064) (German) (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4quartl ,sc4quart, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Quaterback (PR2064) (German) (Mazooma) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4quartm ,sc4quart, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Quaterback (PR2064) (German) (Mazooma) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4quartc ,sc4quart, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Quaterback (PR2064) (German) (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4quartd ,sc4quart, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Quaterback (PR2064) (German) (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4quartf ,sc4quart, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Quaterback (PR2064) (German) (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4quartg ,sc4quart, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Quaterback (PR2064) (German) (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4quarth ,sc4quart, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Quaterback (PR2064) (German) (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4quartj ,sc4quart, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Quaterback (PR2064) (German) (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4quartl ,sc4quart, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Quaterback (PR2064) (German) (Mazooma) (Scorpion 4) (set 7)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4quartm ,sc4quart, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Quaterback (PR2064) (German) (Mazooma) (Scorpion 4) (set 8)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// PR6902 RED HOT IBIZA PR6902 IBIZ SOUNDS11
-GAMEL( 200?, sc4ibiza ,0, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Red Hot Ibiza (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ibizaa ,sc4ibiza, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Red Hot Ibiza (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ibizab ,sc4ibiza, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Red Hot Ibiza (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ibizac ,sc4ibiza, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Red Hot Ibiza (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ibizad ,sc4ibiza, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Red Hot Ibiza (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ibizae ,sc4ibiza, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Red Hot Ibiza (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ibizaf ,sc4ibiza, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Red Hot Ibiza (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ibizag ,sc4ibiza, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Red Hot Ibiza (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ibizah ,sc4ibiza, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Red Hot Ibiza (Bellfruit) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ibizai ,sc4ibiza, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Red Hot Ibiza (Bellfruit) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4ibiza ,0, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Red Hot Ibiza (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4ibizaa ,sc4ibiza, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Red Hot Ibiza (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4ibizab ,sc4ibiza, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Red Hot Ibiza (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4ibizac ,sc4ibiza, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Red Hot Ibiza (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4ibizad ,sc4ibiza, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Red Hot Ibiza (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4ibizae ,sc4ibiza, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Red Hot Ibiza (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4ibizaf ,sc4ibiza, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Red Hot Ibiza (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4ibizag ,sc4ibiza, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Red Hot Ibiza (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4ibizah ,sc4ibiza, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Red Hot Ibiza (Bellfruit) (Scorpion 4) (set 9)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4ibizai ,sc4ibiza, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Red Hot Ibiza (Bellfruit) (Scorpion 4) (set 10)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// half size sound roms
// PR6905 SKY'S THE LIMIT PR6905 SKY'S THE LIMIT SOUNDS11
-GAMEL( 200?, sc4stl ,0, sc4, sc4, sc4_state, sc4, ROT0, "BFM","The Sky's The Limit (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4stla ,sc4stl, sc4, sc4, sc4_state, sc4, ROT0, "BFM","The Sky's The Limit (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4stlb ,sc4stl, sc4, sc4, sc4_state, sc4, ROT0, "BFM","The Sky's The Limit (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4stlc ,sc4stl, sc4, sc4, sc4_state, sc4, ROT0, "BFM","The Sky's The Limit (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4stld ,sc4stl, sc4, sc4, sc4_state, sc4, ROT0, "BFM","The Sky's The Limit (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4stle ,sc4stl, sc4, sc4, sc4_state, sc4, ROT0, "BFM","The Sky's The Limit (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4stlf ,sc4stl, sc4, sc4, sc4_state, sc4, ROT0, "BFM","The Sky's The Limit (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4stlg ,sc4stl, sc4, sc4, sc4_state, sc4, ROT0, "BFM","The Sky's The Limit (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4stl ,0, sc4, sc4, sc4_state, sc4, ROT0, "BFM","The Sky's The Limit (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4stla ,sc4stl, sc4, sc4, sc4_state, sc4, ROT0, "BFM","The Sky's The Limit (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4stlb ,sc4stl, sc4, sc4, sc4_state, sc4, ROT0, "BFM","The Sky's The Limit (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4stlc ,sc4stl, sc4, sc4, sc4_state, sc4, ROT0, "BFM","The Sky's The Limit (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4stld ,sc4stl, sc4, sc4, sc4_state, sc4, ROT0, "BFM","The Sky's The Limit (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4stle ,sc4stl, sc4, sc4, sc4_state, sc4, ROT0, "BFM","The Sky's The Limit (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4stlf ,sc4stl, sc4, sc4, sc4_state, sc4, ROT0, "BFM","The Sky's The Limit (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4stlg ,sc4stl, sc4, sc4, sc4_state, sc4, ROT0, "BFM","The Sky's The Limit (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// PR7055 SPLASH N GRAB GRAB SOUNDS
-GAMEL( 200?, sc4splgb ,0, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Splash & Grab (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4splgba ,sc4splgb, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Splash & Grab (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4splgb ,0, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Splash & Grab (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4splgba ,sc4splgb, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Splash & Grab (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// PR2044 CASINO SPREAD YOUR BET SBET SOUNDS SPREAD YOUR BET
-GAMEL( 200?, sc4spred ,0, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Spread Your Bet (Mazooma) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4spred ,0, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Spread Your Bet (Mazooma) (Scorpion 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// PR6921 DIAMONDS AND RUBIES PR6921 DARB SOUNDS11
-GAMEL( 200?, sc4sdr ,0, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Super Diamonds & Rubies (PR6921) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4sdrb ,sc4sdr, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Super Diamonds & Rubies (PR6921) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4sdr ,0, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Super Diamonds & Rubies (PR6921) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4sdrb ,sc4sdr, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Super Diamonds & Rubies (PR6921) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// PR6921 DIAMONDS AND RUBIES SP98 PR6921 DARB SOUNDS11
-GAMEL( 200?, sc4sdra ,sc4sdr, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Super Diamonds & Rubies SP98 (PR6921) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4sdrc ,sc4sdr, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Super Diamonds & Rubies SP98 (PR6921) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4sdra ,sc4sdr, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Super Diamonds & Rubies SP98 (PR6921) (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4sdrc ,sc4sdr, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Super Diamonds & Rubies SP98 (PR6921) (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// bad sound roms
// PR6906 CRAZY CASINO SP98 PR6906 CRCS SOUNDS11
-GAMEL( 200?, sc4crzcs ,0, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Casino SP98 (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzcsa ,sc4crzcs, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Casino SP98 (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzcsb ,sc4crzcs, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Casino SP98 (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzcsc ,sc4crzcs, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Casino SP98 (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzcs ,0, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Casino SP98 (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzcsa ,sc4crzcs, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Casino SP98 (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzcsb ,sc4crzcs, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Casino SP98 (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzcsc ,sc4crzcs, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Crazy Casino SP98 (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// PR7001 IT'S A CRAZY WORLD CRAZY WORLD SOUNDS
-GAMEL( 200?, sc4crzwl ,0, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Crazy World (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzwla ,sc4crzwl, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Crazy World (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzwlb ,sc4crzwl, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Crazy World (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzwlc ,sc4crzwl, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Crazy World (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzwld ,sc4crzwl, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Crazy World (Mazooma) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzwle ,sc4crzwl, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Crazy World (Mazooma) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzwlf ,sc4crzwl, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Crazy World (Mazooma) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4crzwlg ,sc4crzwl, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Crazy World (Mazooma) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzwl ,0, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Crazy World (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzwla ,sc4crzwl, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Crazy World (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzwlb ,sc4crzwl, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Crazy World (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzwlc ,sc4crzwl, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Crazy World (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzwld ,sc4crzwl, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Crazy World (Mazooma) (Scorpion 4) (set 5)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzwle ,sc4crzwl, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Crazy World (Mazooma) (Scorpion 4) (set 6)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzwlf ,sc4crzwl, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Crazy World (Mazooma) (Scorpion 4) (set 7)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4crzwlg ,sc4crzwl, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Crazy World (Mazooma) (Scorpion 4) (set 8)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// no sound roms
// PR6814 FOOTBALL CRAZY PR6814 FOOTBALL CRAZY SOUNDS
-GAMEL( 200?, sc4fbcrz ,0, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Football Crazy (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4fbcrza ,sc4fbcrz, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Football Crazy (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4fbcrzb ,sc4fbcrz, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Football Crazy (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4fbcrzc ,sc4fbcrz, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Football Crazy (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4fbcrzd ,sc4fbcrz, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Football Crazy (Bellfruit) (Scorpion 4) (set 5)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4fbcrze ,sc4fbcrz, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Football Crazy (Bellfruit) (Scorpion 4) (set 6)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4fbcrzf ,sc4fbcrz, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Football Crazy (Bellfruit) (Scorpion 4) (set 7)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4fbcrzg ,sc4fbcrz, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Football Crazy (Bellfruit) (Scorpion 4) (set 8)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4fbcrzh ,sc4fbcrz, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Football Crazy (Bellfruit) (Scorpion 4) (set 9)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4fbcrzi ,sc4fbcrz, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Football Crazy (Bellfruit) (Scorpion 4) (set 10)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4fbcrz ,0, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Football Crazy (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4fbcrza ,sc4fbcrz, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Football Crazy (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4fbcrzb ,sc4fbcrz, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Football Crazy (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4fbcrzc ,sc4fbcrz, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Football Crazy (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4fbcrzd ,sc4fbcrz, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Football Crazy (Bellfruit) (Scorpion 4) (set 5)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4fbcrze ,sc4fbcrz, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Football Crazy (Bellfruit) (Scorpion 4) (set 6)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4fbcrzf ,sc4fbcrz, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Football Crazy (Bellfruit) (Scorpion 4) (set 7)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4fbcrzg ,sc4fbcrz, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Football Crazy (Bellfruit) (Scorpion 4) (set 8)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4fbcrzh ,sc4fbcrz, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Football Crazy (Bellfruit) (Scorpion 4) (set 9)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4fbcrzi ,sc4fbcrz, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Football Crazy (Bellfruit) (Scorpion 4) (set 10)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// no sound roms
// PR6916 FROOTY BOOTY PR6916 FROOTY BOOTY SOUNDS11 FROOTY BOOTY
-GAMEL( 200?, sc4frboo ,0, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Frooty Booty (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4frbooa ,sc4frboo, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Frooty Booty (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4frboob ,sc4frboo, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Frooty Booty (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4frbooc ,sc4frboo, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Frooty Booty (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4frboo ,0, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Frooty Booty (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4frbooa ,sc4frboo, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Frooty Booty (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4frboob ,sc4frboo, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Frooty Booty (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4frbooc ,sc4frboo, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Frooty Booty (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// no sound roms
// not a fruit machine? coin pusher?
-GAMEL( 200?, sc4gfev ,0, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Gold Fever (Mazooma) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // PR20XX GOLD FEVER PUSHER GOLDFEVER SOUNDS GOLD FEVER
-GAMEL( 200?, sc4gfeva ,sc4gfev, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Gold Fever (Mazooma) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // PR2142 GOLD FEVER PUSHER USA GOLDFEVER SOUNDS GOLD FEVER
-GAMEL( 200?, sc4gfevb ,sc4gfev, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Gold Fever (Mazooma) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // ^^
-GAMEL( 200?, sc4db ,sc4gfev, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Gold Fever (Mazooma) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // PR2142 GOLD FEVER PUSHER USA GOLDFEVER SOUNDS GOLD FEVER
+GAMEL( 200?, sc4gfev ,0, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Gold Fever (Mazooma) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // PR20XX GOLD FEVER PUSHER GOLDFEVER SOUNDS GOLD FEVER
+GAMEL( 200?, sc4gfeva ,sc4gfev, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Gold Fever (Mazooma) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // PR2142 GOLD FEVER PUSHER USA GOLDFEVER SOUNDS GOLD FEVER
+GAMEL( 200?, sc4gfevb ,sc4gfev, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Gold Fever (Mazooma) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 ) // ^^
+GAMEL( 200?, sc4db ,sc4gfev, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Gold Fever (Mazooma) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 ) // PR2142 GOLD FEVER PUSHER USA GOLDFEVER SOUNDS GOLD FEVER
/**********************************************************************************************************************************/
/* Games below are German versions, and seem to be build on very different code even when titles match other games */
@@ -49689,7 +49691,7 @@ DRIVER_INIT_MEMBER(sc4_state,sc4polen)
}
// PR7012 GERMAN POLE POSITION PR7012 SOUNDS
-GAMEL( 200?, sc4polen ,0, sc4_4reel, sc4, sc4_state, sc4polen, ROT0, "Nova","Pole Position (German) (PR7012, GPOS) (Nova) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4polen ,0, sc4_4reel, sc4, sc4_state, sc4polen, ROT0, "Nova","Pole Position (German) (PR7012, GPOS) (Nova) (Scorpion 4)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -49700,7 +49702,7 @@ DRIVER_INIT_MEMBER(sc4_state,sc4valnv)
// PR7025 GERMAN VALHALLA 7025 VER1 SOUNDS
-GAMEL( 200?, sc4valnv ,0, sc4, sc4, sc4_state, sc4valnv, ROT0, "Nova","Valhalla (German) (PR7025, GVAL) (Nova) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4valnv ,0, sc4, sc4, sc4_state, sc4valnv, ROT0, "Nova","Valhalla (German) (PR7025, GVAL) (Nova) (Scorpion 4)", MACHINE_FLAGS, layout_bfm_sc4 )
@@ -49710,45 +49712,45 @@ DRIVER_INIT_MEMBER(sc4_state,sc4wernr)
}
// PR7027 GERMAN WERNER PR7027 SOUNDS V1
-GAMEL( 200?, sc4wernr ,0, sc4_4reel, sc4, sc4_state, sc4wernr, ROT0, "Nova","Werner (German) (PR7027, GWER) (Nova) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4wrnlt ,sc4wernr, sc4_4reel, sc4, sc4_state, sc4wernr, ROT0, "Nova","Werner (German) (PR7027, GWER) (Nova) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4wernr ,0, sc4_4reel, sc4, sc4_state, sc4wernr, ROT0, "Nova","Werner (German) (PR7027, GWER) (Nova) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4wrnlt ,sc4wernr, sc4_4reel, sc4, sc4_state, sc4wernr, ROT0, "Nova","Werner (German) (PR7027, GWER) (Nova) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// no sound roms
// PR2023.GERMAN BRIX...........PR2023,German BRIX,......PR2023 SOUNDS V1 (non-standard header)
-GAMEL( 200?, sc4brix ,0, sc4_4reel_alt, sc4, sc4_state, sc4brix, ROT0, "Nova","Brix (German) (Nova) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4brixa ,sc4brix, sc4_4reel_alt, sc4, sc4_state, sc4brix, ROT0, "Nova","Brix (German) (Nova) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4brixb ,sc4brix, sc4_4reel_alt, sc4, sc4_state, sc4brix, ROT0, "Nova","Brix (German) (Nova) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4brix ,0, sc4_4reel_alt, sc4, sc4_state, sc4brix, ROT0, "Nova","Brix (German) (Nova) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4brixa ,sc4brix, sc4_4reel_alt, sc4, sc4_state, sc4brix, ROT0, "Nova","Brix (German) (Nova) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4brixb ,sc4brix, sc4_4reel_alt, sc4, sc4_state, sc4brix, ROT0, "Nova","Brix (German) (Nova) (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// both of these are incomplete
// P_O_E_T_N_M_E_ _R_0_1_B_A_K_G_L_ _._0_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _9_0_8_6_ _L_C_ _O_D_G_S_U_D_1_
-GAMEL( 200?, sc4bgold ,0, sc4, sc4, sc4_state, sc4, ROT0, "Nova","Black Gold (Nova) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // incomplete pairing
-GAMEL( 200?, sc4bgolda ,sc4bgold, sc4, sc4, sc4_state, sc4, ROT0, "Nova","Black Gold (Nova) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // incomplete pairing
+GAMEL( 200?, sc4bgold ,0, sc4, sc4, sc4_state, sc4, ROT0, "Nova","Black Gold (Nova) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 ) // incomplete pairing
+GAMEL( 200?, sc4bgolda ,sc4bgold, sc4, sc4, sc4_state, sc4, ROT0, "Nova","Black Gold (Nova) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 ) // incomplete pairing
// no identifiaction string
-GAMEL( 200?, sc4wag ,0, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma/Nova","WIN-10-Gain (German) (Nova) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4wag ,0, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma/Nova","WIN-10-Gain (German) (Nova) (Scorpion 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// PR6984 VIVA MEXICO 1.30 95008095 VIVA MEXICO PR6984
-GAMEL( 200?, sc4vmnv ,0, sc4, sc4, sc4_state, sc4, ROT0, "Nova","Viva Mexico (Nova) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4vmnv ,0, sc4, sc4, sc4_state, sc4, ROT0, "Nova","Viva Mexico (Nova) (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// PR6984 VIVA MEXICO 1.00 95008095 VIVA MEXICO PR6984
-GAMEL( 200?, sc4vmnva ,sc4vmnv, sc4, sc4, sc4_state, sc4, ROT0, "Nova","Viva Mexico (Nova) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4vmnva ,sc4vmnv, sc4, sc4, sc4_state, sc4, ROT0, "Nova","Viva Mexico (Nova) (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// PR2055.GERMAN MONOPOLY... (non-standard header)
-GAMEL( 200?, sc4monod ,0, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly (Mazooma) [German] (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4monoda ,sc4monod, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly (Mazooma) [German] (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4monodb ,sc4monod, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly (Mazooma) [German] (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4monod ,0, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly (Mazooma) [German] (Scorpion 4) (set 1)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4monoda ,sc4monod, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly (Mazooma) [German] (Scorpion 4) (set 2)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
+GAMEL( 200?, sc4monodb ,sc4monod, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma","Monopoly (Mazooma) [German] (Scorpion 4) (set 3)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// doesn't like the sound rom (not sure why, they look OK and have correct header)
// PR7044 GERMAN JIGGERY POKERY PR7044SND
-GAMEL( 200?, sc4jiggn ,0, sc4, sc4, sc4_state, sc4, ROT0, "Nova","Jiggery Pockery (German) (Nova) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4jiggn ,0, sc4, sc4, sc4_state, sc4, ROT0, "Nova","Jiggery Pockery (German) (Nova) (Scorpion 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// PR7076 GERMAN SINBAD2001 PR7076,German SINBAD2001, PR7076 SOUNDS V1
-GAMEL( 200?, sc4s2k ,0, sc4, sc4, sc4_state, sc4, ROT0, "Nova","Sinbad 2000 (German) (Nova) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4s2k ,0, sc4, sc4, sc4_state, sc4, ROT0, "Nova","Sinbad 2000 (German) (Nova) (Scorpion 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
// PR2022 GERMAN CASHANOVA (not a standard string)
-GAMEL( 200?, sc4cashg ,0, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma / Nova","Cashanova (German) (Mazooma / Nova) (Scorpion 4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4cashg ,0, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma / Nova","Cashanova (German) (Mazooma / Nova) (Scorpion 4)", MACHINE_FLAGS_NOSOUND, layout_bfm_sc4 )
@@ -49766,19 +49768,19 @@ GAMEL( 200?, sc4cashg ,0, sc4, sc4, sc4_state, sc4, ROT0, "Mazooma /
/****************************************************************************************************************************************************************************************************************/
-GAMEL( 200?, ad4skill ,0, sc4_adder4, sc4, sc4_state, sc4, ROT0, "BFM","Skill Dice (BFM) (Scorpion 4 + Adder 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, ad4film ,0, sc4_adder4, sc4, sc4_state, sc4, ROT0, "BFM","Film Premiere (Video?) (Bellfruit) (Adder 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // the 68k vectors differ from usual, but it contains the expected strings for an Adder 4 title. No main program roms tho? :/
-GAMEL( 200?, ad4filma ,ad4film, sc4_adder4, sc4, sc4_state, sc4, ROT0, "BFM","Film Premiere (Video?) (Bellfruit) (Adder 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 ) // ^^
-GAMEL( 200?, ad4ctl ,0, sc4_adder4, sc4, sc4_state, sc4, ROT0, "BFM","Cop The Lot Club (Video) (Bellfruit) (Adder 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, ad4ctla ,ad4ctl, sc4_adder4, sc4, sc4_state, sc4, ROT0, "BFM","Cop The Lot Club (Video) (Bellfruit) (Adder 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, ad4skill ,0, sc4_adder4, sc4, sc4_state, sc4, ROT0, "BFM","Skill Dice (BFM) (Scorpion 4 + Adder 4)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, ad4film ,0, sc4_adder4, sc4, sc4_state, sc4, ROT0, "BFM","Film Premiere (Video?) (Bellfruit) (Adder 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 ) // the 68k vectors differ from usual, but it contains the expected strings for an Adder 4 title. No main program roms tho? :/
+GAMEL( 200?, ad4filma ,ad4film, sc4_adder4, sc4, sc4_state, sc4, ROT0, "BFM","Film Premiere (Video?) (Bellfruit) (Adder 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 ) // ^^
+GAMEL( 200?, ad4ctl ,0, sc4_adder4, sc4, sc4_state, sc4, ROT0, "BFM","Cop The Lot Club (Video) (Bellfruit) (Adder 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, ad4ctla ,ad4ctl, sc4_adder4, sc4, sc4_state, sc4, ROT0, "BFM","Cop The Lot Club (Video) (Bellfruit) (Adder 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR1036 CLUB COP THE LOT PR1036 CLOT SOUNDS11 COP THE LOT
// shows nothing on the VFD, but boots (to very little)
-GAMEL( 200?, sc4ctlcl ,0, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Cop The Lot Club (Bellfruit) (Scorpion 4) (set 1)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ctlcla ,sc4ctlcl, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Cop The Lot Club (Bellfruit) (Scorpion 4) (set 2)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4ctlcl ,0, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Cop The Lot Club (Bellfruit) (Scorpion 4) (set 1)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ctlcla ,sc4ctlcl, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Cop The Lot Club (Bellfruit) (Scorpion 4) (set 2)", MACHINE_FLAGS, layout_bfm_sc4 )
// PR1036 CLUB COP THE LOT COP THE LOT CLUB PR1036 CLOT SOUNDS11 COP THE LOT
// shows nothing, but alarms, do these go with the ad4 video roms?
-GAMEL( 200?, sc4ctlclb ,sc4ctlcl, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Cop The Lot Club (Bellfruit) (Scorpion 4) (set 3)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
-GAMEL( 200?, sc4ctlclc ,sc4ctlcl, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Cop The Lot Club (Bellfruit) (Scorpion 4) (set 4)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4ctlclb ,sc4ctlcl, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Cop The Lot Club (Bellfruit) (Scorpion 4) (set 3)", MACHINE_FLAGS, layout_bfm_sc4 )
+GAMEL( 200?, sc4ctlclc ,sc4ctlcl, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Cop The Lot Club (Bellfruit) (Scorpion 4) (set 4)", MACHINE_FLAGS, layout_bfm_sc4 )
// not sure this is SC4, it crashes MAME and the addresses it accesses look strange
-GAMEL( 200?, sc4milro ,0, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Millionaires Row (Scorpion 4?)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK, layout_bfm_sc4 )
+GAMEL( 200?, sc4milro ,0, sc4, sc4, sc4_state, sc4, ROT0, "BFM","Millionaires Row (Scorpion 4?)", MACHINE_FLAGS, layout_bfm_sc4 )
diff --git a/src/mame/drivers/bfm_sc45_helper.cpp b/src/mame/drivers/bfm_sc45_helper.cpp
index 264f9dbe71f..d49c449a230 100644
--- a/src/mame/drivers/bfm_sc45_helper.cpp
+++ b/src/mame/drivers/bfm_sc45_helper.cpp
@@ -155,10 +155,7 @@ int find_input_strings(running_machine &machine)
{
for (int j = 0; j < 16; j++)
{
- char tempstr[32];
- sprintf(tempstr, "IN%d-%d", i, j);
-
- sc4inputs[i][j].name = tempstr;
+ sc4inputs[i][j].name = strformat("IN%d-%d", i, j);
sc4inputs[i][j].used = false;
}
}
diff --git a/src/mame/drivers/bfm_sc4h.cpp b/src/mame/drivers/bfm_sc4h.cpp
index f6298442371..d2d7394306d 100644
--- a/src/mame/drivers/bfm_sc4h.cpp
+++ b/src/mame/drivers/bfm_sc4h.cpp
@@ -255,10 +255,10 @@ WRITE8_MEMBER(bfm_sc45_state::mux_output_w)
int off = offset<<3;
for (i=0; i<8; i++)
- output_set_lamp_value(off+i, ((data & (1 << i)) != 0));
+ output().set_lamp_value(off+i, ((data & (1 << i)) != 0));
- output_set_indexed_value("matrix", off+i, ((data & (1 << i)) != 0));
+ output().set_indexed_value("matrix", off+i, ((data & (1 << i)) != 0));
}
WRITE8_MEMBER(bfm_sc45_state::mux_output2_w)
@@ -269,14 +269,14 @@ WRITE8_MEMBER(bfm_sc45_state::mux_output2_w)
// some games use this as a matrix port (luckb etc.)
for (i=0; i<8; i++)
{
- output_set_indexed_value("matrix", off+i, ((data & (1 << i)) != 0));
+ output().set_indexed_value("matrix", off+i, ((data & (1 << i)) != 0));
}
// others drive 7-segs with it.. so rendering it there as well in our debug layouts
// todo: reorder properly!
UINT8 bf7segdata = BITSWAP8(data,7,6,5,4,3,2,1,0);
- output_set_digit_value(offset, bf7segdata);
+ output().set_digit_value(offset, bf7segdata);
}
WRITE16_MEMBER(sc4_state::sc4_mem_w)
@@ -518,13 +518,13 @@ void sc4_state::bfm_sc4_68307_porta_w(address_space &space, bool dedicated, UINT
if(m_reel1)
{
m_reel1->update( data &0x0f);
- awp_draw_reel("reel1", m_reel1);
+ awp_draw_reel(machine(),"reel1", m_reel1);
}
if (m_reel2)
{
m_reel2->update((data>>4)&0x0f);
- awp_draw_reel("reel2", m_reel2);
+ awp_draw_reel(machine(),"reel2", m_reel2);
}
}
@@ -535,7 +535,7 @@ WRITE8_MEMBER( sc4_state::bfm_sc4_reel3_w )
if(m_reel3)
{
m_reel3->update( data &0x0f);
- awp_draw_reel("reel3", m_reel3);
+ awp_draw_reel(machine(),"reel3", m_reel3);
}
}
@@ -546,7 +546,7 @@ WRITE8_MEMBER( sc4_state::bfm_sc4_reel4_w )
if(m_reel4)
{
m_reel4->update( data &0x0f);
- awp_draw_reel("reel4", m_reel4);
+ awp_draw_reel(machine(),"reel4", m_reel4);
}
}
@@ -640,13 +640,13 @@ WRITE8_MEMBER(sc4_state::bfm_sc4_duart_output_w)
if(m_reel5)
{
m_reel5->update( data &0x0f);
- awp_draw_reel("reel5", m_reel5);
+ awp_draw_reel(machine(),"reel5", m_reel5);
}
if (m_reel6)
{
m_reel6->update((data>>4)&0x0f);
- awp_draw_reel("reel6", m_reel6);
+ awp_draw_reel(machine(),"reel6", m_reel6);
}
}
@@ -1031,7 +1031,7 @@ MACHINE_CONFIG_END
MACHINE_START_MEMBER(sc4_adder4_state,adder4)
{
m_adder4cpuregion = (UINT32*)memregion( "adder4" )->base();
- m_adder4ram = (UINT32*)auto_alloc_array_clear(machine(), UINT32, 0x10000);
+ m_adder4ram = make_unique_clear<UINT32[]>(0x10000);
MACHINE_START_CALL_MEMBER(sc4);
}
diff --git a/src/mame/drivers/bfm_swp.cpp b/src/mame/drivers/bfm_swp.cpp
index 62c7405f489..5198984a975 100644
--- a/src/mame/drivers/bfm_swp.cpp
+++ b/src/mame/drivers/bfm_swp.cpp
@@ -114,7 +114,7 @@ public:
{ }
UINT32* m_cpuregion;
- UINT32* m_mainram;
+ std::unique_ptr<UINT32[]> m_mainram;
DECLARE_READ32_MEMBER(bfm_swp_mem_r);
DECLARE_WRITE32_MEMBER(bfm_swp_mem_w);
@@ -191,7 +191,7 @@ INPUT_PORTS_END
void bfm_swp_state::machine_start()
{
m_cpuregion = (UINT32*)memregion( "maincpu" )->base();
- m_mainram = (UINT32*)auto_alloc_array_clear(machine(), UINT32, 0x10000);
+ m_mainram = make_unique_clear<UINT32[]>(0x10000);
}
diff --git a/src/mame/drivers/bfmsys85.cpp b/src/mame/drivers/bfmsys85.cpp
index 370166c4e5b..c0517ae2742 100644
--- a/src/mame/drivers/bfmsys85.cpp
+++ b/src/mame/drivers/bfmsys85.cpp
@@ -80,11 +80,11 @@ public:
m_reel1(*this, "reel1"),
m_reel2(*this, "reel2"),
m_reel3(*this, "reel3"),
- m_acia6850_0(*this, "acia6850_0")
+ m_acia6850_0(*this, "acia6850_0"),
+ m_meters(*this, "meters")
{
}
- optional_device<roc10937_t> m_vfd;
int m_mmtr_latch;
int m_triac_latch;
int m_alpha_clock;
@@ -117,7 +117,6 @@ public:
DECLARE_WRITE8_MEMBER(mux_enable_w);
DECLARE_WRITE8_MEMBER(triac_w);
DECLARE_READ8_MEMBER(triac_r);
- DECLARE_READ_LINE_MEMBER(sys85_data_r);
DECLARE_WRITE_LINE_MEMBER(sys85_data_w);
DECLARE_WRITE_LINE_MEMBER(write_acia_clock);
DECLARE_DRIVER_INIT(decode);
@@ -126,12 +125,14 @@ public:
virtual void machine_reset() override;
INTERRUPT_GEN_MEMBER(timer_irq);
int b85_find_project_string( );
+ optional_device<roc10937_t> m_vfd;
required_device<cpu_device> m_maincpu;
required_device<stepper_device> m_reel0;
required_device<stepper_device> m_reel1;
required_device<stepper_device> m_reel2;
required_device<stepper_device> m_reel3;
required_device<acia6850_device> m_acia6850_0;
+ required_device<meters_device> m_meters;
};
#define MASTER_CLOCK (XTAL_4MHz)
@@ -210,8 +211,8 @@ WRITE8_MEMBER(bfmsys85_state::reel12_w)
m_reel0->update((data>>4)&0x0f);
m_reel1->update( data &0x0f);
- awp_draw_reel("reel1", m_reel0);
- awp_draw_reel("reel2", m_reel1);
+ awp_draw_reel(machine(),"reel1", m_reel0);
+ awp_draw_reel(machine(),"reel2", m_reel1);
}
///////////////////////////////////////////////////////////////////////////
@@ -221,8 +222,8 @@ WRITE8_MEMBER(bfmsys85_state::reel34_w)
m_reel2->update((data>>4)&0x0f);
m_reel3->update( data &0x0f);
- awp_draw_reel("reel3", m_reel2);
- awp_draw_reel("reel4", m_reel3);
+ awp_draw_reel(machine(),"reel3", m_reel2);
+ awp_draw_reel(machine(),"reel4", m_reel3);
}
///////////////////////////////////////////////////////////////////////////
@@ -231,13 +232,13 @@ WRITE8_MEMBER(bfmsys85_state::reel34_w)
WRITE8_MEMBER(bfmsys85_state::mmtr_w)
{
- int i;
int changed = m_mmtr_latch ^ data;
m_mmtr_latch = data;
- for (i=0; i<8; i++)
- if ( changed & (1 << i) ) MechMtr_update(i, data & (1 << i) );
+ for (int i=0; i<8; i++)
+ if ( changed & (1 << i) )
+ m_meters->update(i, data & (1 << i) );
if ( data ) m_maincpu->set_input_line(M6809_FIRQ_LINE, HOLD_LINE);
}
@@ -311,7 +312,7 @@ WRITE8_MEMBER(bfmsys85_state::mux_data_w)
for ( i = 0; i < 8; i++ )
{
- output_set_lamp_value(off, (data & pattern ? 1 : 0));
+ output().set_lamp_value(off, (data & pattern ? 1 : 0));
pattern <<= 1;
off++;
}
@@ -413,6 +414,9 @@ static MACHINE_CONFIG_START( bfmsys85, bfmsys85_state )
MCFG_STARPOINT_48STEP_ADD("reel3")
MCFG_STEPPER_OPTIC_CALLBACK(WRITELINE(bfmsys85_state, reel3_optic_cb))
+ MCFG_DEVICE_ADD("meters", METERS, 0)
+ MCFG_METERS_NUMBER(8)
+
MCFG_DEFAULT_LAYOUT(layout_bfmsys85)
MACHINE_CONFIG_END
@@ -750,99 +754,102 @@ DRIVER_INIT_MEMBER(bfmsys85_state,nodecode)
b85_find_project_string();
}
+#define MACHINE_FLAGS MACHINE_NOT_WORKING|MACHINE_SUPPORTS_SAVE|MACHINE_REQUIRES_ARTWORK
+#define MACHINE_FLAGS_MECHANICAL MACHINE_FLAGS|MACHINE_MECHANICAL
+
// PROJECT NUMBER 5539 2P CASH EXPLOSION GAME No 39-350-190 - 29-MAR-1989 11:45:25
-GAME( 1989, b85cexpl , 0 , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "Cash Explosion (System 85)", MACHINE_NOT_WORKING|MACHINE_SUPPORTS_SAVE|MACHINE_REQUIRES_ARTWORK )
+GAME( 1989, b85cexpl , 0 , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "Cash Explosion (System 85)", MACHINE_FLAGS )
// PROJECT NUMBER 5150 THE ROYAL 10P PLAY GAME No 39-350-128 - 21-JAN-1988 12:42:53
-GAME( 1988, b85royal , 0 , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "The Royal (System 85)", MACHINE_NOT_WORKING|MACHINE_SUPPORTS_SAVE|MACHINE_REQUIRES_ARTWORK ) // 'The Royal' ?? hack of the Ritz or Big Deal Club?
+GAME( 1988, b85royal , 0 , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "The Royal (System 85)", MACHINE_FLAGS ) // 'The Royal' ?? hack of the Ritz or Big Deal Club?
// PROJECT NUMBER 4957 BIGDEAL 5P PLAY GAME No 39-350-055 - 9-MAR-1987 11:12:05
-GAME( 1987, b85bdclb , 0 , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "Big Deal Club (System 85, set 1)", MACHINE_NOT_WORKING|MACHINE_SUPPORTS_SAVE|MACHINE_REQUIRES_ARTWORK )
+GAME( 1987, b85bdclb , 0 , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "Big Deal Club (System 85, set 1)", MACHINE_FLAGS )
// PROJECT NUMBER 5035 BIGDEAL 5P PLAY GAME No 39-350-045 - 25-FEB-1987 14:19:41
-GAME( 1987, b85bdclba , b85bdclb , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "Big Deal Club (System 85, set 2)", MACHINE_NOT_WORKING|MACHINE_SUPPORTS_SAVE|MACHINE_REQUIRES_ARTWORK )
+GAME( 1987, b85bdclba , b85bdclb , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "Big Deal Club (System 85, set 2)", MACHINE_FLAGS )
// PROJECT NUMBER 5034 BIGDEAL 20P PLAY GAME No 39-350-047 - 25-FEB-1987 12:44:21
-GAME( 1987, b85bdclbb , b85bdclb , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "Big Deal Club (System 85, set 3)", MACHINE_NOT_WORKING|MACHINE_SUPPORTS_SAVE|MACHINE_REQUIRES_ARTWORK )
+GAME( 1987, b85bdclbb , b85bdclb , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "Big Deal Club (System 85, set 3)", MACHINE_FLAGS )
// PROJECT NUMBER 5145 CASH BLITZ GAME No 39-351-091 - 13-AUG-1987 11:25:29
-GAME( 1987, b85cblit , 0 , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "Cash Blitz (System 85, set 1)", MACHINE_NOT_WORKING|MACHINE_SUPPORTS_SAVE|MACHINE_REQUIRES_ARTWORK )
+GAME( 1987, b85cblit , 0 , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "Cash Blitz (System 85, set 1)", MACHINE_FLAGS )
// PROJECT NUMBER 5145 CASH BLITZ GAME No 39-350-091 - 13-AUG-1987 11:08:54
-GAME( 1987, b85cblita , b85cblit , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "Cash Blitz (System 85, set 2)", MACHINE_NOT_WORKING|MACHINE_SUPPORTS_SAVE|MACHINE_REQUIRES_ARTWORK )
+GAME( 1987, b85cblita , b85cblit , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "Cash Blitz (System 85, set 2)", MACHINE_FLAGS )
// PROJECT NUMBER 5145 CASH BLITZ GAME No 39-350-102 - 3-NOV-1987 16:24:39
-GAME( 1987, b85cblitb , b85cblit , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "Cash Blitz (System 85, set 3)", MACHINE_NOT_WORKING|MACHINE_SUPPORTS_SAVE|MACHINE_REQUIRES_ARTWORK )
+GAME( 1987, b85cblitb , b85cblit , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "Cash Blitz (System 85, set 3)", MACHINE_FLAGS )
// PROJECT NUMBER 5495 CLUB PREMIER 5P,10P AND 20P PLAY GAME No 39-350-187 - 28-FEB-1989 15:26:47
-GAME( 1989, b85clbpm , 0 , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "Club Premier (System 85)", MACHINE_NOT_WORKING|MACHINE_SUPPORTS_SAVE|MACHINE_REQUIRES_ARTWORK )
+GAME( 1989, b85clbpm , 0 , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "Club Premier (System 85)", MACHINE_FLAGS )
// PROJECT NUMBER 5116 HI LO SILVER DX GAME No 39-350-049 - 27-FEB-1987 10:49:08
-GAME( 1987, b85hilo , 0 , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "Hi Lo Silver (System 85, set 1)", MACHINE_NOT_WORKING|MACHINE_SUPPORTS_SAVE|MACHINE_REQUIRES_ARTWORK )
+GAME( 1987, b85hilo , 0 , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "Hi Lo Silver (System 85, set 1)", MACHINE_FLAGS )
// PROJECT NUMBER 5407 HI LO SILVER 2P GAME No 39-350-142 - 12-OCT-1988 09:39:26
-GAME( 1988, b85hiloa , b85hilo , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "Hi Lo Silver (System 85, set 2)", MACHINE_NOT_WORKING|MACHINE_SUPPORTS_SAVE|MACHINE_REQUIRES_ARTWORK )
+GAME( 1988, b85hiloa , b85hilo , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "Hi Lo Silver (System 85, set 2)", MACHINE_FLAGS )
// PROJECT NUMBER 5104 THE RITZ 10P PLAY GAME No 39-350-084 - 28-AUG-1987 08:44:30
-GAME( 1987, b85ritzd , b85ritz , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "The Ritz (System 85, set 5)", MACHINE_NOT_WORKING|MACHINE_SUPPORTS_SAVE|MACHINE_REQUIRES_ARTWORK )
+GAME( 1987, b85ritzd , b85ritz , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "The Ritz (System 85, set 5)", MACHINE_FLAGS )
// PROJECT NUMBER 5184 THE RITZ 5P PLAY GAME No 39-350-137 - 25-FEB-1988 11:07:18
-GAME( 1988, b85ritz , 0 , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "The Ritz (System 85, set 1)", MACHINE_NOT_WORKING|MACHINE_SUPPORTS_SAVE|MACHINE_REQUIRES_ARTWORK ) // alt version of Big Deal Club?
+GAME( 1988, b85ritz , 0 , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "The Ritz (System 85, set 1)", MACHINE_FLAGS ) // alt version of Big Deal Club?
// PROJECT NUMBER 5183 THE RITZ 20P PLAY GAME No 39-350-136 - 25-FEB-1988 11:25:52
-GAME( 1988, b85ritzb , b85ritz , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "The Ritz (System 85, set 3)", MACHINE_NOT_WORKING|MACHINE_SUPPORTS_SAVE|MACHINE_REQUIRES_ARTWORK )
+GAME( 1988, b85ritzb , b85ritz , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "The Ritz (System 85, set 3)", MACHINE_FLAGS )
// PROJECT NUMBER 5183 THE RITZ 20P PLAY GAME No 39-350-138 - 16-MAR-1988 10:46:30
-GAME( 1988, b85ritza , b85ritz , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "The Ritz (System 85, set 2)", MACHINE_NOT_WORKING|MACHINE_SUPPORTS_SAVE|MACHINE_REQUIRES_ARTWORK )
+GAME( 1988, b85ritza , b85ritz , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "The Ritz (System 85, set 2)", MACHINE_FLAGS )
// PROJECT NUMBER 5104 THE RITZ 10P PLAY GAME No 39-350-139 - 16-MAR-1988 11:04:27
-GAME( 1988, b85ritzc , b85ritz , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "The Ritz (System 85, set 4)", MACHINE_NOT_WORKING|MACHINE_SUPPORTS_SAVE|MACHINE_REQUIRES_ARTWORK )
+GAME( 1988, b85ritzc , b85ritz , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "The Ritz (System 85, set 4)", MACHINE_FLAGS )
// PROJECT NUMBER 5137 V2 10P PLAY GAME No 39-350-115 - 9-DEC-1987 12:39:16
-GAME( 1987, b85jpclb , 0 , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "Jackpot Club (System 85, set 1)", MACHINE_NOT_WORKING|MACHINE_SUPPORTS_SAVE|MACHINE_REQUIRES_ARTWORK )
+GAME( 1987, b85jpclb , 0 , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "Jackpot Club (System 85, set 1)", MACHINE_FLAGS )
// PROJECT NUMBER 5357 V2 20P PLAY GAME No 39-350-112 - 7-DEC-1987 14:32:31
-GAME( 1987, b85jpclba , b85jpclb , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "Jackpot Club (System 85, set 2)", MACHINE_NOT_WORKING|MACHINE_SUPPORTS_SAVE|MACHINE_REQUIRES_ARTWORK )
+GAME( 1987, b85jpclba , b85jpclb , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "Jackpot Club (System 85, set 2)", MACHINE_FLAGS )
// PROJECT NUMBER 5137 V2 10P PLAY GAME No 39-350-141 - 16-MAR-1988 11:46:48
-GAME( 1988, b85jpclbb , b85jpclb , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "Jackpot Club (System 85, set 3)", MACHINE_NOT_WORKING|MACHINE_SUPPORTS_SAVE|MACHINE_REQUIRES_ARTWORK )
+GAME( 1988, b85jpclbb , b85jpclb , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "Jackpot Club (System 85, set 3)", MACHINE_FLAGS )
// PROJECT NUMBER 5357 V2 20P PLAY GAME No 39-350-140 - 16-MAR-1988 11:21:43
-GAME( 1988, b85jpclbc , b85jpclb , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "Jackpot Club (System 85, set 4)", MACHINE_NOT_WORKING|MACHINE_SUPPORTS_SAVE|MACHINE_REQUIRES_ARTWORK )
+GAME( 1988, b85jpclbc , b85jpclb , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "Jackpot Club (System 85, set 4)", MACHINE_FLAGS )
// PROJECT NUMBER 5368 SUPER NUDGE GAMBLER #4.00 GAME No 39-340-230 - 27-JAN-1988 14:20:43
-GAME( 1988, b85sngam , 0 , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "Super Nudge Gambler (System 85)", MACHINE_NOT_WORKING|MACHINE_SUPPORTS_SAVE|MACHINE_REQUIRES_ARTWORK )
+GAME( 1988, b85sngam , 0 , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "Super Nudge Gambler (System 85)", MACHINE_FLAGS )
// PROJECT NUMBER 4766 10P KING OF CLUBS GAME No 39-340-026 - 25-NOV-1985 08:49:11
-GAME( 199?, b85koc , 0 , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "King of Clubs (Bellfruit) (System 85, set 1)", MACHINE_SUPPORTS_SAVE|MACHINE_REQUIRES_ARTWORK|MACHINE_NOT_WORKING|MACHINE_MECHANICAL) // this has valid strings in it BEFORE the bfm decode, but decodes to valid code, does it use some funky mapping, or did they just fill unused space with valid looking data?
+GAME( 199?, b85koc , 0 , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "King of Clubs (Bellfruit) (System 85, set 1)", MACHINE_FLAGS_MECHANICAL) // this has valid strings in it BEFORE the bfm decode, but decodes to valid code, does it use some funky mapping, or did they just fill unused space with valid looking data?
// PROJECT NUMBER 4766 10P KING OF CLUBS GAME No 39340002 - 16-AUG-1985 15:53:13
-GAME( 199?, b85koca , b85koc , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "King of Clubs (Bellfruit) (System 85, set 2)", MACHINE_SUPPORTS_SAVE|MACHINE_REQUIRES_ARTWORK|MACHINE_NOT_WORKING|MACHINE_MECHANICAL) // this has valid strings in it BEFORE the bfm decode, but decodes to valid code, does it use some funky mapping, or did they just fill unused space with valid looking data?
+GAME( 199?, b85koca , b85koc , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "King of Clubs (Bellfruit) (System 85, set 2)", MACHINE_FLAGS_MECHANICAL) // this has valid strings in it BEFORE the bfm decode, but decodes to valid code, does it use some funky mapping, or did they just fill unused space with valid looking data?
// PROJECT NUMBER 5425 BAR SEVEN ARCADE GAME No 39-341-236 - 11-APR-1988 11:30:33
-GAME( 199?, b85cb7p , 0 , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "Bar Sevens (Bellfruit) (Protocol) (System 85)", MACHINE_NOT_WORKING|MACHINE_SUPPORTS_SAVE|MACHINE_REQUIRES_ARTWORK) // seems to work better here than in sc1
+GAME( 199?, b85cb7p , 0 , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "Bar Sevens (Bellfruit) (Protocol) (System 85)", MACHINE_FLAGS) // seems to work better here than in sc1
// PROJECT NUMBER 5596 DISCOVERY 85 - 06-APR-1990 08:57:39
-GAME( 199?, b85disc , 0 , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM/ELAM", "Discovey (Dutch) (Bellfruit) (System 85)", MACHINE_SUPPORTS_SAVE|MACHINE_REQUIRES_ARTWORK|MACHINE_NOT_WORKING|MACHINE_MECHANICAL ) // GAME No 39-350-251
+GAME( 199?, b85disc , 0 , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM/ELAM", "Discovey (Dutch) (Bellfruit) (System 85)", MACHINE_FLAGS_MECHANICAL ) // GAME No 39-350-251
// PROJECT NUMBER 5452 DUTCH SUPER CARDS GAME No 39-340-271 - 04-JAN-1989 14:39:00
-GAME( 1989, b85scard , 0 , bfmsys85, bfmsys85, bfmsys85_state, nodecode, 0, "BFM/ELAM", "Supercards (Dutch, Game Card 39-340-271?) (System 85)", MACHINE_NOT_WORKING|MACHINE_SUPPORTS_SAVE|MACHINE_REQUIRES_ARTWORK )
+GAME( 1989, b85scard , 0 , bfmsys85, bfmsys85, bfmsys85_state, nodecode, 0, "BFM/ELAM", "Supercards (Dutch, Game Card 39-340-271?) (System 85)", MACHINE_FLAGS )
// PROJECT NUMBER 4840 DUTCH JOKERS WILD PO GAME No 39-340-345 - 31-JUL-1992 20:01:55
-GAME( 1992, b85jkwld , 0 , bfmsys85, bfmsys85, bfmsys85_state, nodecode, 0, "BFM/ELAM", "Jokers Wild (Dutch) (System 85)", MACHINE_NOT_WORKING|MACHINE_SUPPORTS_SAVE|MACHINE_REQUIRES_ARTWORK )
+GAME( 1992, b85jkwld , 0 , bfmsys85, bfmsys85, bfmsys85_state, nodecode, 0, "BFM/ELAM", "Jokers Wild (Dutch) (System 85)", MACHINE_FLAGS )
// PROJECT NUMBER 4823 LUCKY CARDS 200 PO GAME No 39-332-217 - 2-DEC-1986 15:57:19
-GAME( 1986, b85lucky , 0 , bfmsys85, bfmsys85, bfmsys85_state, nodecode, 0, "BFM/ELAM", "Lucky Cards (Dutch) (System 85)", MACHINE_NOT_WORKING|MACHINE_SUPPORTS_SAVE|MACHINE_REQUIRES_ARTWORK )
+GAME( 1986, b85lucky , 0 , bfmsys85, bfmsys85, bfmsys85_state, nodecode, 0, "BFM/ELAM", "Lucky Cards (Dutch) (System 85)", MACHINE_FLAGS )
// PROJECT NUMBER 4902 DUTCH LUCKY DICE PO GAME No 39-340-346 - 03-AUG-1992 16:30:00
-GAME( 1992, b85luckd , 0 , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM/ELAM", "Lucky Dice (Dutch) (System 85)", MACHINE_NOT_WORKING|MACHINE_SUPPORTS_SAVE|MACHINE_REQUIRES_ARTWORK )
+GAME( 1992, b85luckd , 0 , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM/ELAM", "Lucky Dice (Dutch) (System 85)", MACHINE_FLAGS )
// PROJECT NUMBER 4758 DUTCH C+R 200 PO GAME No 39-332-215 - 2-DEC-1986 15:50:43
-GAME( 199?, b85cops , 0 , bfmsys85, bfmsys85, bfmsys85_state, nodecode, 0, "BFM/ELAM", "Cops 'n' Robbers (Dutch) (Bellfruit) (System 85)", MACHINE_SUPPORTS_SAVE|MACHINE_REQUIRES_ARTWORK|MACHINE_NOT_WORKING|MACHINE_MECHANICAL)
+GAME( 199?, b85cops , 0 , bfmsys85, bfmsys85, bfmsys85_state, nodecode, 0, "BFM/ELAM", "Cops 'n' Robbers (Dutch) (Bellfruit) (System 85)", MACHINE_FLAGS_MECHANICAL)
// this might be system 85 or sc1, the rom config is 0x2000 + 0x8000, and it writes to the AY address we map on S85 for the alarm
// however it still gives the same error message in both, has offset alpha text in s85 and appears to attempt to communicate with something we don't map, maybe it's some video based board / game with bits missing?
// PROJECT NUMBER 5464 V3 10P/20P PLAY GAME No 39-350-173 - 24-JAN-1989 10:48:53
-GAME( 1989, b85dbldl , 0 , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "Double Dealer (System 85, set 1)", MACHINE_NOT_WORKING|MACHINE_SUPPORTS_SAVE|MACHINE_REQUIRES_ARTWORK )
+GAME( 1989, b85dbldl , 0 , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "Double Dealer (System 85, set 1)", MACHINE_FLAGS )
// PROJECT NUMBER 5464 V3 10P/20P PLAY GAME No 39-350-181 - 02-FEB-1989 15:19:20
-GAME( 1985, b85dbldla , b85dbldl , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "Double Dealer (System 85, set 2)", MACHINE_NOT_WORKING|MACHINE_SUPPORTS_SAVE|MACHINE_REQUIRES_ARTWORK )
+GAME( 1985, b85dbldla , b85dbldl , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "Double Dealer (System 85, set 2)", MACHINE_FLAGS )
// PROJECT NUMBER 5464 V3 10P/20P PLAY GAME No 39-350-166 - 17-OCT-1988 14:56:38
-GAME( 199?, b85dbldlb , b85dbldl , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "Double Dealer (System 85, set 3)", MACHINE_NOT_WORKING|MACHINE_SUPPORTS_SAVE|MACHINE_REQUIRES_ARTWORK ) // found in a sc4 potp set ...
+GAME( 199?, b85dbldlb , b85dbldl , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "Double Dealer (System 85, set 3)", MACHINE_FLAGS ) // found in a sc4 potp set ...
// appears to be the same as above with a different title
// PROJECT NUMBER 5165 V1 10P PLAY GAME No 39-350-179 - 02-FEB-1989 14:42:57
-GAME( 199?, b85potp , 0 , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "Pick Of The Pack (System 85)", MACHINE_NOT_WORKING|MACHINE_SUPPORTS_SAVE|MACHINE_REQUIRES_ARTWORK ) // found in a sc4 potp set ...
+GAME( 199?, b85potp , 0 , bfmsys85, bfmsys85, bfmsys85_state, decode , 0, "BFM", "Pick Of The Pack (System 85)", MACHINE_FLAGS ) // found in a sc4 potp set ...
diff --git a/src/mame/drivers/bigbord2.cpp b/src/mame/drivers/bigbord2.cpp
index 1427618e00b..013e53c92e5 100644
--- a/src/mame/drivers/bigbord2.cpp
+++ b/src/mame/drivers/bigbord2.cpp
@@ -126,8 +126,6 @@ public:
DECLARE_READ8_MEMBER(portc4_r);
DECLARE_READ8_MEMBER(portd0_r);
DECLARE_WRITE8_MEMBER(bigbord2_kbd_put);
- DECLARE_WRITE_LINE_MEMBER(intrq_w);
- DECLARE_WRITE_LINE_MEMBER(drq_w);
DECLARE_WRITE_LINE_MEMBER(frame);
DECLARE_DRIVER_INIT(bigbord2);
TIMER_DEVICE_CALLBACK_MEMBER(ctc_tick);
@@ -147,8 +145,6 @@ private:
virtual void machine_start() override;
virtual void machine_reset() override;
virtual void video_start() override;
- void fdc_intrq_w(bool state);
- void fdc_drq_w(bool state);
address_space *m_mem;
address_space *m_io;
required_device<cpu_device> m_maincpu;
@@ -475,7 +471,6 @@ void bigbord2_state::machine_reset()
for (i = 0; i < 8; i++)
m_c8[i] = 0;
m_beeper->set_state(0);
- m_beeper->set_frequency(950); // actual frequency is unknown
m_bankr->set_entry(0);
m_bankv->set_entry(0);
m_banka->set_entry(0);
@@ -599,7 +594,7 @@ static MACHINE_CONFIG_START( bigbord2, bigbord2_state )
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
- MCFG_SOUND_ADD("beeper", BEEP, 0)
+ MCFG_SOUND_ADD("beeper", BEEP, 950) // actual frequency is unknown
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
MACHINE_CONFIG_END
diff --git a/src/mame/drivers/bigevglf.cpp b/src/mame/drivers/bigevglf.cpp
index c0d18524ba2..a5b6fe662b6 100644
--- a/src/mame/drivers/bigevglf.cpp
+++ b/src/mame/drivers/bigevglf.cpp
@@ -1,4 +1,4 @@
-// license:???
+// license:GPL-2.0+
// copyright-holders:Jarek Burczynski, Tomasz Slanina
/***************************************************************************
Big Event Golf (c) Taito 1986
diff --git a/src/mame/drivers/bingoc.cpp b/src/mame/drivers/bingoc.cpp
index 267156611e7..868fd3c3563 100644
--- a/src/mame/drivers/bingoc.cpp
+++ b/src/mame/drivers/bingoc.cpp
@@ -47,7 +47,6 @@ public:
UINT8 m_x;
DECLARE_READ16_MEMBER(unknown_r);
- DECLARE_READ8_MEMBER(sound_test_r);
DECLARE_WRITE16_MEMBER(main_sound_latch_w);
DECLARE_WRITE8_MEMBER(sound_play_w);
virtual void video_start() override;
diff --git a/src/mame/drivers/bionicc.cpp b/src/mame/drivers/bionicc.cpp
index 7b50e17bbe7..9b5cff65089 100644
--- a/src/mame/drivers/bionicc.cpp
+++ b/src/mame/drivers/bionicc.cpp
@@ -1,5 +1,6 @@
-// license:???
-// copyright-holders:Steven Frew, Phil Stroffolino, Paul Leaman
+// license:BSD-3-Clause
+// copyright-holders:Phil Stroffolino, Paul Leaman
+// thanks-to: Steven Frew (the author of Slutte)
/******************************************************************************************
Bionic Commando
diff --git a/src/mame/drivers/bitgraph.cpp b/src/mame/drivers/bitgraph.cpp
index 3a2f6a0c26e..511f4fb2a1b 100644
--- a/src/mame/drivers/bitgraph.cpp
+++ b/src/mame/drivers/bitgraph.cpp
@@ -116,8 +116,6 @@ public:
DECLARE_WRITE8_MEMBER( pia_pa_w );
DECLARE_WRITE8_MEMBER( pia_pb_w );
DECLARE_READ_LINE_MEMBER( pia_ca1_r );
- DECLARE_READ_LINE_MEMBER( pia_cb1_r );
- DECLARE_WRITE_LINE_MEMBER( pia_ca2_w );
DECLARE_WRITE_LINE_MEMBER( pia_cb2_w );
DECLARE_WRITE16_MEMBER( baud_write );
diff --git a/src/mame/drivers/bladestl.cpp b/src/mame/drivers/bladestl.cpp
index 14f8fc0a641..565ba8b3fab 100644
--- a/src/mame/drivers/bladestl.cpp
+++ b/src/mame/drivers/bladestl.cpp
@@ -65,12 +65,12 @@ READ8_MEMBER(bladestl_state::trackball_r)
WRITE8_MEMBER(bladestl_state::bladestl_bankswitch_w)
{
/* bits 0 & 1 = coin counters */
- coin_counter_w(machine(), 0,data & 0x01);
- coin_counter_w(machine(), 1,data & 0x02);
+ machine().bookkeeping().coin_counter_w(0,data & 0x01);
+ machine().bookkeeping().coin_counter_w(1,data & 0x02);
/* bits 2 & 3 = lamps */
- set_led_status(machine(), 0,data & 0x04);
- set_led_status(machine(), 1,data & 0x08);
+ output().set_led_value(0,data & 0x04);
+ output().set_led_value(1,data & 0x08);
/* bit 4 = relay (???) */
diff --git a/src/mame/drivers/blitz.cpp b/src/mame/drivers/blitz.cpp
index ab634220cec..b4a5eb325f0 100644
--- a/src/mame/drivers/blitz.cpp
+++ b/src/mame/drivers/blitz.cpp
@@ -419,16 +419,16 @@ WRITE8_MEMBER(blitz_state::mux_w)
WRITE8_MEMBER(blitz_state::lamps_a_w)
{
-// output_set_lamp_value(0, 1 - ((data) & 1)); /* Lamp 0 */
-// output_set_lamp_value(1, 1 - ((data >> 1) & 1)); /* Lamp 1 */
-// output_set_lamp_value(2, 1 - ((data >> 2) & 1)); /* Lamp 2 */
-// output_set_lamp_value(3, 1 - ((data >> 3) & 1)); /* Lamp 3 */
-// output_set_lamp_value(4, 1 - ((data >> 4) & 1)); /* Lamp 4 */
+// output().set_lamp_value(0, 1 - ((data) & 1)); /* Lamp 0 */
+// output().set_lamp_value(1, 1 - ((data >> 1) & 1)); /* Lamp 1 */
+// output().set_lamp_value(2, 1 - ((data >> 2) & 1)); /* Lamp 2 */
+// output().set_lamp_value(3, 1 - ((data >> 3) & 1)); /* Lamp 3 */
+// output().set_lamp_value(4, 1 - ((data >> 4) & 1)); /* Lamp 4 */
// popmessage("written : %02X", data);
-// coin_counter_w(machine(), 0, data & 0x40); /* counter1 */
-// coin_counter_w(machine(), 1, data & 0x80); /* counter2 */
-// coin_counter_w(machine(), 2, data & 0x20); /* counter3 */
+// machine().bookkeeping().coin_counter_w(0, data & 0x40); /* counter1 */
+// machine().bookkeeping().coin_counter_w(1, data & 0x80); /* counter2 */
+// machine().bookkeeping().coin_counter_w(2, data & 0x20); /* counter3 */
}
diff --git a/src/mame/drivers/blitz68k.cpp b/src/mame/drivers/blitz68k.cpp
index e236de0c4ad..ffa7d6215c8 100644
--- a/src/mame/drivers/blitz68k.cpp
+++ b/src/mame/drivers/blitz68k.cpp
@@ -73,7 +73,7 @@ public:
m_palette(*this, "palette") { }
optional_shared_ptr<UINT16> m_nvram;
- UINT8 *m_blit_buffer;
+ std::unique_ptr<UINT8[]> m_blit_buffer;
optional_shared_ptr<UINT16> m_frame_buffer;
optional_shared_ptr<UINT16> m_blit_romaddr;
optional_shared_ptr<UINT16> m_blit_attr1_ram;
@@ -116,8 +116,6 @@ public:
DECLARE_READ16_MEMBER(blitter_status_r);
DECLARE_WRITE16_MEMBER(lamps_w);
DECLARE_READ16_MEMBER(test_r);
- DECLARE_WRITE16_MEMBER(irq_callback_w);
- DECLARE_WRITE16_MEMBER(sound_write_w);
DECLARE_READ8_MEMBER(bankrob_mcu1_r);
DECLARE_READ8_MEMBER(bankrob_mcu2_r);
DECLARE_READ8_MEMBER(bankrob_mcu_status_read_r);
@@ -206,7 +204,7 @@ struct blit_t
VIDEO_START_MEMBER(blitz68k_state,blitz68k)
{
- m_blit_buffer = auto_alloc_array(machine(), UINT8, 512*256);
+ m_blit_buffer = std::make_unique<UINT8[]>(512*256);
blit.addr_factor = 2;
}
@@ -220,7 +218,7 @@ UINT32 blitz68k_state::screen_update_blitz68k(screen_device &screen, bitmap_rgb3
{
int x,y;
- UINT8 *src = m_blit_buffer;
+ UINT8 *src = m_blit_buffer.get();
for(y = 0; y < 256; y++)
{
@@ -844,14 +842,14 @@ WRITE16_MEMBER(blitz68k_state::cjffruit_leds1_w)
data = COMBINE_DATA(m_leds0);
if (ACCESSING_BITS_8_15)
{
- coin_counter_w(machine(), 0, data & 0x0100); // coin in
- set_led_status(machine(), 0, data & 0x0200); // win???
+ machine().bookkeeping().coin_counter_w(0, data & 0x0100); // coin in
+ output().set_led_value(0, data & 0x0200); // win???
// 1 data & 0x0400 // win???
- set_led_status(machine(), 2, data & 0x0800); // small
- set_led_status(machine(), 3, data & 0x1000); // big
- set_led_status(machine(), 4, data & 0x2000); // take
- set_led_status(machine(), 5, data & 0x4000); // double up
- set_led_status(machine(), 6, data & 0x8000); // cancel
+ output().set_led_value(2, data & 0x0800); // small
+ output().set_led_value(3, data & 0x1000); // big
+ output().set_led_value(4, data & 0x2000); // take
+ output().set_led_value(5, data & 0x4000); // double up
+ output().set_led_value(6, data & 0x8000); // cancel
show_leds123();
}
}
@@ -861,14 +859,14 @@ WRITE16_MEMBER(blitz68k_state::cjffruit_leds2_w)
data = COMBINE_DATA(m_leds1);
if (ACCESSING_BITS_8_15)
{
- set_led_status(machine(), 7, data & 0x0100); // start
- set_led_status(machine(), 8, data & 0x0200); // bet
- set_led_status(machine(), 9, data & 0x0400); // hold 5
- set_led_status(machine(), 10, data & 0x0800); // hold 4
- set_led_status(machine(), 11, data & 0x1000); // hold 3
- set_led_status(machine(), 12, data & 0x2000); // hold 2
- set_led_status(machine(), 13, data & 0x4000); // collect
- set_led_status(machine(), 14, data & 0x8000); // call attendant
+ output().set_led_value( 7, data & 0x0100); // start
+ output().set_led_value( 8, data & 0x0200); // bet
+ output().set_led_value( 9, data & 0x0400); // hold 5
+ output().set_led_value(10, data & 0x0800); // hold 4
+ output().set_led_value(11, data & 0x1000); // hold 3
+ output().set_led_value(12, data & 0x2000); // hold 2
+ output().set_led_value(13, data & 0x4000); // collect
+ output().set_led_value(14, data & 0x8000); // call attendant
show_leds123();
}
}
@@ -878,8 +876,8 @@ WRITE16_MEMBER(blitz68k_state::cjffruit_leds3_w)
data = COMBINE_DATA(m_leds2);
if (ACCESSING_BITS_8_15)
{
- set_led_status(machine(), 15, data & 0x0100); // hopper coins?
- set_led_status(machine(), 16, data & 0x0400); // coin out?
+ output().set_led_value(15, data & 0x0100); // hopper coins?
+ output().set_led_value(16, data & 0x0400); // coin out?
show_leds123();
}
}
@@ -984,14 +982,14 @@ WRITE16_MEMBER(blitz68k_state::deucesw2_leds1_w)
data = COMBINE_DATA(m_leds0);
if (ACCESSING_BITS_8_15)
{
- coin_counter_w(machine(), 0, data & 0x0100); // coin in
- set_led_status(machine(), 0, data & 0x0200); // win???
+ machine().bookkeeping().coin_counter_w(0, data & 0x0100); // coin in
+ output().set_led_value(0, data & 0x0200); // win???
// 1 data & 0x0400 // win???
- set_led_status(machine(), 2, data & 0x0800); // small
- set_led_status(machine(), 3, data & 0x1000); // big
- set_led_status(machine(), 4, data & 0x2000); // take
- set_led_status(machine(), 5, data & 0x4000); // double up
- set_led_status(machine(), 6, data & 0x8000); // cancel
+ output().set_led_value(2, data & 0x0800); // small
+ output().set_led_value(3, data & 0x1000); // big
+ output().set_led_value(4, data & 0x2000); // take
+ output().set_led_value(5, data & 0x4000); // double up
+ output().set_led_value(6, data & 0x8000); // cancel
show_leds123();
}
}
@@ -1001,14 +999,14 @@ WRITE16_MEMBER(blitz68k_state::deucesw2_leds2_w)
data = COMBINE_DATA(m_leds1);
if (ACCESSING_BITS_8_15)
{
- set_led_status(machine(), 7, data & 0x0100); // start
- set_led_status(machine(), 8, data & 0x0200); // bet
- set_led_status(machine(), 9, data & 0x0400); // hold 5
- set_led_status(machine(), 10, data & 0x0800); // hold 4
- set_led_status(machine(), 11, data & 0x1000); // hold 3
- set_led_status(machine(), 12, data & 0x2000); // hold 2
- set_led_status(machine(), 13, data & 0x4000); // hold 1
- set_led_status(machine(), 14, data & 0x8000); // call attendant
+ output().set_led_value( 7, data & 0x0100); // start
+ output().set_led_value( 8, data & 0x0200); // bet
+ output().set_led_value( 9, data & 0x0400); // hold 5
+ output().set_led_value(10, data & 0x0800); // hold 4
+ output().set_led_value(11, data & 0x1000); // hold 3
+ output().set_led_value(12, data & 0x2000); // hold 2
+ output().set_led_value(13, data & 0x4000); // hold 1
+ output().set_led_value(14, data & 0x8000); // call attendant
show_leds123();
}
}
@@ -1018,8 +1016,8 @@ WRITE16_MEMBER(blitz68k_state::deucesw2_leds3_w)
data = COMBINE_DATA(m_leds2);
if (ACCESSING_BITS_8_15)
{
- set_led_status(machine(), 15, data & 0x0100); // hopper coins?
- set_led_status(machine(), 16, data & 0x0400); // coin out?
+ output().set_led_value(15, data & 0x0100); // hopper coins?
+ output().set_led_value(16, data & 0x0400); // coin out?
show_leds123();
}
}
@@ -1174,7 +1172,7 @@ WRITE16_MEMBER(blitz68k_state::hermit_leds1_w)
data = COMBINE_DATA(m_leds0);
if (ACCESSING_BITS_8_15)
{
- coin_counter_w(machine(), 0, data & 0x0100); // coin in
+ machine().bookkeeping().coin_counter_w(0, data & 0x0100); // coin in
show_leds12();
}
}
@@ -1184,7 +1182,7 @@ WRITE16_MEMBER(blitz68k_state::hermit_leds2_w)
data = COMBINE_DATA(m_leds1);
if (ACCESSING_BITS_8_15)
{
- set_led_status(machine(), 7, data & 0x0100); // button
+ output().set_led_value( 7, data & 0x0100); // button
show_leds12();
}
}
diff --git a/src/mame/drivers/blktiger.cpp b/src/mame/drivers/blktiger.cpp
index f79c4adac3c..869195e3a6d 100644
--- a/src/mame/drivers/blktiger.cpp
+++ b/src/mame/drivers/blktiger.cpp
@@ -1,4 +1,4 @@
-// license:???
+// license:BSD-3-Clause
// copyright-holders:Paul Leaman
/***************************************************************************
@@ -63,8 +63,8 @@ WRITE8_MEMBER(blktiger_state::blktiger_coinlockout_w)
{
if (ioport("COIN_LOCKOUT")->read() & 0x01)
{
- coin_lockout_w(machine(), 0,~data & 0x01);
- coin_lockout_w(machine(), 1,~data & 0x02);
+ machine().bookkeeping().coin_lockout_w(0,~data & 0x01);
+ machine().bookkeeping().coin_lockout_w(1,~data & 0x02);
}
}
diff --git a/src/mame/drivers/blockhl.cpp b/src/mame/drivers/blockhl.cpp
index 3d288cc5849..8cca358e26a 100644
--- a/src/mame/drivers/blockhl.cpp
+++ b/src/mame/drivers/blockhl.cpp
@@ -188,8 +188,8 @@ WRITE8_MEMBER( blockhl_state::banking_callback )
// bit 2, unknown (always 0)
// bits 3/4 = coin counters
- coin_counter_w(machine(), 0, data & 0x08);
- coin_counter_w(machine(), 1, data & 0x10);
+ machine().bookkeeping().coin_counter_w(0, data & 0x08);
+ machine().bookkeeping().coin_counter_w(1, data & 0x10);
// bit 5 = select palette RAM or work RAM at 5800-5fff
m_bank5800->set_bank(BIT(data, 5));
diff --git a/src/mame/drivers/blueprnt.cpp b/src/mame/drivers/blueprnt.cpp
index 03d71b8fcd2..1c21a0ca56d 100644
--- a/src/mame/drivers/blueprnt.cpp
+++ b/src/mame/drivers/blueprnt.cpp
@@ -85,8 +85,8 @@ WRITE8_MEMBER(blueprnt_state::blueprnt_sound_command_w)
WRITE8_MEMBER(blueprnt_state::blueprnt_coin_counter_w)
{
- coin_counter_w(machine(), 0, data & 0x01);
- coin_counter_w(machine(), 1, data & 0x02);
+ machine().bookkeeping().coin_counter_w(0, data & 0x01);
+ machine().bookkeeping().coin_counter_w(1, data & 0x02);
}
/*************************************
diff --git a/src/mame/drivers/bmcpokr.cpp b/src/mame/drivers/bmcpokr.cpp
index 6a645bc9fcf..6bd9d2c6ce8 100644
--- a/src/mame/drivers/bmcpokr.cpp
+++ b/src/mame/drivers/bmcpokr.cpp
@@ -81,11 +81,10 @@ public:
tilemap_t *m_tilemap_2;
TILE_GET_INFO_MEMBER(get_t1_tile_info);
TILE_GET_INFO_MEMBER(get_t2_tile_info);
- TILE_GET_INFO_MEMBER(get_t3_tile_info);
DECLARE_WRITE16_MEMBER(videoram_1_w);
DECLARE_WRITE16_MEMBER(videoram_2_w);
- bitmap_ind16 *m_pixbitmap;
+ std::unique_ptr<bitmap_ind16> m_pixbitmap;
void pixbitmap_redraw();
UINT16 m_pixpal;
DECLARE_WRITE16_MEMBER(pixram_w);
@@ -149,7 +148,7 @@ void bmcpokr_state::video_start()
m_tilemap_1->set_scroll_cols(1);
m_tilemap_2->set_scroll_cols(1);
- m_pixbitmap = auto_bitmap_ind16_alloc(machine(), 0x400, 0x200);
+ m_pixbitmap = std::make_unique<bitmap_ind16>(0x400, 0x200);
save_state();
}
@@ -328,8 +327,8 @@ WRITE16_MEMBER(bmcpokr_state::mux_w)
if (ACCESSING_BITS_0_7)
{
m_hopper->write(space, 0, (data & 0x0001) ? 0x80 : 0x00); // hopper motor
- coin_counter_w(machine(), 1, data & 0x0002); // coin-in / key-in
- coin_counter_w(machine(), 2, data & 0x0004); // pay-out
+ machine().bookkeeping().coin_counter_w(1, data & 0x0002); // coin-in / key-in
+ machine().bookkeeping().coin_counter_w(2, data & 0x0004); // pay-out
// data & 0x0060 // DSW mux
// data & 0x0080 // ? always on
}
diff --git a/src/mame/drivers/bmjr.cpp b/src/mame/drivers/bmjr.cpp
index 9778a751434..cf198f4e7a5 100644
--- a/src/mame/drivers/bmjr.cpp
+++ b/src/mame/drivers/bmjr.cpp
@@ -325,7 +325,6 @@ GFXDECODE_END
void bmjr_state::machine_start()
{
- m_beep->set_frequency(1200); //guesswork
m_beep->set_state(0);
}
@@ -356,7 +355,7 @@ static MACHINE_CONFIG_START( bmjr, bmjr_state )
/* Audio */
MCFG_SPEAKER_STANDARD_MONO("mono")
- MCFG_SOUND_ADD("beeper", BEEP, 0)
+ MCFG_SOUND_ADD("beeper", BEEP, 1200) // guesswork
MCFG_SOUND_ROUTE(ALL_OUTPUTS,"mono",0.50)
MCFG_SOUND_WAVE_ADD(WAVE_TAG, "cassette")
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
diff --git a/src/mame/drivers/bml3.cpp b/src/mame/drivers/bml3.cpp
index b0421009ec1..a2e405950c6 100644
--- a/src/mame/drivers/bml3.cpp
+++ b/src/mame/drivers/bml3.cpp
@@ -145,7 +145,7 @@ private:
virtual void machine_start() override;
void m6845_change_clock(UINT8 setting);
UINT8 m_crtc_index;
- UINT8 *m_extram;
+ std::unique_ptr<UINT8[]> m_extram;
UINT8 m_firq_mask;
UINT8 m_firq_status;
required_device<cpu_device> m_maincpu;
@@ -762,7 +762,7 @@ INTERRUPT_GEN_MEMBER(bml3_state::bml3_timer_firq)
void bml3_state::machine_start()
{
- m_extram = auto_alloc_array(machine(),UINT8,0x10000);
+ m_extram = std::make_unique<UINT8[]>(0x10000);
m_p_chargen = memregion("chargen")->base();
m_p_videoram = memregion("vram")->base();
m_psg_latch = 0;
diff --git a/src/mame/drivers/bnstars.cpp b/src/mame/drivers/bnstars.cpp
index 7172817b195..a8675045a6d 100644
--- a/src/mame/drivers/bnstars.cpp
+++ b/src/mame/drivers/bnstars.cpp
@@ -546,7 +546,7 @@ UINT32 bnstars_state::screen_update_bnstars_right(screen_device &screen, bitmap_
static INPUT_PORTS_START( bnstars )
PORT_START("P1")
- PORT_BIT( 0x000000ff, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, bnstars_state, mahjong_ctrl_r, (void *)nullptr)
+ PORT_BIT( 0x000000ff, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, bnstars_state, mahjong_ctrl_r, (void *)0)
PORT_BIT( 0x0000ff00, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x00010000, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_BIT( 0x00020000, IP_ACTIVE_LOW, IPT_UNKNOWN )
@@ -708,7 +708,7 @@ GFXDECODE_END
CUSTOM_INPUT_MEMBER(bnstars_state::mahjong_ctrl_r)
{
- required_ioport_array<4> &keys = (param == nullptr) ? m_p1_keys : m_p2_keys;
+ required_ioport_array<4> &keys = (((int)(FPTR)param) == 0) ? m_p1_keys : m_p2_keys;
switch (m_bnstars1_mahjong_select & 0x2080)
{
diff --git a/src/mame/drivers/bob85.cpp b/src/mame/drivers/bob85.cpp
index 71f28bd5ad4..d0c1eb88965 100644
--- a/src/mame/drivers/bob85.cpp
+++ b/src/mame/drivers/bob85.cpp
@@ -137,7 +137,7 @@ READ8_MEMBER(bob85_state::bob85_keyboard_r)
WRITE8_MEMBER(bob85_state::bob85_7seg_w)
{
- output_set_digit_value(offset, BITSWAP8( data,3,2,1,0,7,6,5,4 ));
+ output().set_digit_value(offset, BITSWAP8( data,3,2,1,0,7,6,5,4 ));
}
static ADDRESS_MAP_START( bob85_mem, AS_PROGRAM, 8, bob85_state )
diff --git a/src/mame/drivers/bottom9.cpp b/src/mame/drivers/bottom9.cpp
index d5e1fa3479c..7d3e5d9a61f 100644
--- a/src/mame/drivers/bottom9.cpp
+++ b/src/mame/drivers/bottom9.cpp
@@ -108,8 +108,8 @@ WRITE8_MEMBER(bottom9_state::bankswitch_w)
WRITE8_MEMBER(bottom9_state::bottom9_1f90_w)
{
/* bits 0/1 = coin counters */
- coin_counter_w(machine(), 0, data & 0x01);
- coin_counter_w(machine(), 1, data & 0x02);
+ machine().bookkeeping().coin_counter_w(0, data & 0x01);
+ machine().bookkeeping().coin_counter_w(1, data & 0x02);
/* bit 2 = enable char ROM reading through the video RAM */
m_k052109->set_rmrd_line((data & 0x04) ? ASSERT_LINE : CLEAR_LINE);
diff --git a/src/mame/drivers/boxer.cpp b/src/mame/drivers/boxer.cpp
index d8300fc9dde..eb31c5dc174 100644
--- a/src/mame/drivers/boxer.cpp
+++ b/src/mame/drivers/boxer.cpp
@@ -1,4 +1,4 @@
-// license:???
+// license:BSD-3-Clause
// copyright-holders:Stefan Jokisch
/***************************************************************************
@@ -316,14 +316,14 @@ WRITE8_MEMBER(boxer_state::boxer_crowd_w)
/* BIT2 => CROWD-2 */
/* BIT3 => CROWD-3 */
- coin_lockout_global_w(machine(), data & 1);
+ machine().bookkeeping().coin_lockout_global_w(data & 1);
}
WRITE8_MEMBER(boxer_state::boxer_led_w)
{
- set_led_status(machine(), 1, !(data & 1));
- set_led_status(machine(), 0, !(data & 2));
+ output().set_led_value(1, !(data & 1));
+ output().set_led_value(0, !(data & 2));
}
diff --git a/src/mame/drivers/br8641.cpp b/src/mame/drivers/br8641.cpp
index df76c9ee91b..ce8e204e4ee 100644
--- a/src/mame/drivers/br8641.cpp
+++ b/src/mame/drivers/br8641.cpp
@@ -46,7 +46,6 @@ public:
DECLARE_READ8_MEMBER(port08_r);
DECLARE_WRITE8_MEMBER(port08_w);
DECLARE_WRITE8_MEMBER(port09_w);
- DECLARE_MACHINE_RESET(br8641);
private:
UINT8 m_port08;
@@ -142,11 +141,6 @@ WRITE8_MEMBER( brandt8641_state::port09_w )
m_port09 = data ^ 0xff;
}
-MACHINE_RESET_MEMBER( brandt8641_state, br8641 )
-{
- m_beep->set_frequency(2000);
-}
-
static const z80_daisy_config daisy_chain_intf[] =
{
{ "pio1" },
@@ -165,11 +159,9 @@ static MACHINE_CONFIG_START( brandt8641, brandt8641_state )
MCFG_CPU_IO_MAP(brandt8641_io)
MCFG_CPU_CONFIG(daisy_chain_intf)
- MCFG_MACHINE_RESET_OVERRIDE(brandt8641_state, br8641)
-
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
- MCFG_SOUND_ADD("beeper", BEEP, 0)
+ MCFG_SOUND_ADD("beeper", BEEP, 2000)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
// Z80APIO U9
diff --git a/src/mame/drivers/buster.cpp b/src/mame/drivers/buster.cpp
index b7048f13bbc..f08a32eeb0a 100644
--- a/src/mame/drivers/buster.cpp
+++ b/src/mame/drivers/buster.cpp
@@ -25,7 +25,6 @@ public:
m_palette(*this, "palette") { }
required_shared_ptr<UINT8> m_vram;
- DECLARE_READ8_MEMBER(test_r);
virtual void video_start() override;
UINT32 screen_update_buster(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
required_device<cpu_device> m_maincpu;
diff --git a/src/mame/drivers/bw12.cpp b/src/mame/drivers/bw12.cpp
index 3f2db33ab16..fb9e1ce66c2 100644
--- a/src/mame/drivers/bw12.cpp
+++ b/src/mame/drivers/bw12.cpp
@@ -123,7 +123,7 @@ void bw12_state::ls259_w(int address, int data)
break;
case 4: /* CAP LOCK */
- output_set_led_value(0, data);
+ output().set_led_value(0, data);
break;
case 5: /* MOTOR 0 */
@@ -646,6 +646,9 @@ static MACHINE_CONFIG_DERIVED( bw14, common )
MCFG_FLOPPY_DRIVE_ADD(UPD765_TAG ":1", bw14_floppies, "525dd", bw12_state::bw14_floppy_formats)
MCFG_FLOPPY_DRIVE_ADD(UPD765_TAG ":2", bw14_floppies, "525dd", bw12_state::bw14_floppy_formats)
+ // software lists
+ MCFG_SOFTWARE_LIST_ADD("flop_list", "bw14")
+
/* internal ram */
MCFG_RAM_ADD(RAM_TAG)
MCFG_RAM_DEFAULT_SIZE("128K")
diff --git a/src/mame/drivers/bwidow.cpp b/src/mame/drivers/bwidow.cpp
index afe5c9654d7..ad21a0444be 100644
--- a/src/mame/drivers/bwidow.cpp
+++ b/src/mame/drivers/bwidow.cpp
@@ -333,24 +333,24 @@ WRITE8_MEMBER(bwidow_state::bwidow_misc_w)
*/
if (data == m_lastdata) return;
- set_led_status(machine(), 0,~data & 0x10);
- set_led_status(machine(), 1,~data & 0x20);
- coin_counter_w(machine(), 0, data & 0x01);
- coin_counter_w(machine(), 1, data & 0x02);
+ output().set_led_value(0,~data & 0x10);
+ output().set_led_value(1,~data & 0x20);
+ machine().bookkeeping().coin_counter_w(0, data & 0x01);
+ machine().bookkeeping().coin_counter_w(1, data & 0x02);
m_lastdata = data;
}
WRITE8_MEMBER(bwidow_state::spacduel_coin_counter_w)
{
if (data == m_lastdata) return;
- set_led_status(machine(), 0, !BIT(data,5)); // start lamp
- set_led_status(machine(), 1, !BIT(data,4)); // select lamp
- coin_lockout_w(machine(), 0, !BIT(data,3));
- coin_lockout_w(machine(), 1, !BIT(data,3));
- coin_lockout_w(machine(), 2, !BIT(data,3));
- coin_counter_w(machine(), 0, BIT(data,0));
- coin_counter_w(machine(), 1, BIT(data,1));
- coin_counter_w(machine(), 2, BIT(data,2));
+ output().set_led_value(0, !BIT(data,5)); // start lamp
+ output().set_led_value(1, !BIT(data,4)); // select lamp
+ machine().bookkeeping().coin_lockout_w(0, !BIT(data,3));
+ machine().bookkeeping().coin_lockout_w(1, !BIT(data,3));
+ machine().bookkeeping().coin_lockout_w(2, !BIT(data,3));
+ machine().bookkeeping().coin_counter_w(0, BIT(data,0));
+ machine().bookkeeping().coin_counter_w(1, BIT(data,1));
+ machine().bookkeeping().coin_counter_w(2, BIT(data,2));
m_lastdata = data;
}
diff --git a/src/mame/drivers/by17.cpp b/src/mame/drivers/by17.cpp
index 9d2fec2ace3..690409b5c13 100644
--- a/src/mame/drivers/by17.cpp
+++ b/src/mame/drivers/by17.cpp
@@ -533,11 +533,11 @@ WRITE_LINE_MEMBER( by17_state::u10_ca2_w )
for (digit=1; digit<=8; digit++)
{
- output_set_digit_value(10+digit, 0);
- output_set_digit_value(20+digit, 0);
- output_set_digit_value(30+digit, 0);
- output_set_digit_value(40+digit, 0);
- output_set_digit_value(50+digit, 0);
+ output().set_digit_value(10+digit, 0);
+ output().set_digit_value(20+digit, 0);
+ output().set_digit_value(30+digit, 0);
+ output().set_digit_value(40+digit, 0);
+ output().set_digit_value(50+digit, 0);
}
}
#endif
@@ -557,7 +557,7 @@ WRITE_LINE_MEMBER( by17_state::u10_cb2_w )
WRITE_LINE_MEMBER( by17_state::u11_ca2_w )
{
- output_set_value("led0", state);
+ output().set_value("led0", state);
}
READ_LINE_MEMBER( by17_state::u11_ca1_r )
@@ -605,10 +605,10 @@ WRITE8_MEMBER( by17_state::u10_a_w )
{
if ((m_lamp_decode & 0x0f) < 0x0f)
{
- if (output_get_indexed_value("lamp", ((m_lamp_decode & 0x0f)+00) ) ==0 ) output_set_indexed_value("lamp", ((m_lamp_decode & 0x0f)+00), ((data & 0x10) ? FALSE : TRUE));
- if (output_get_indexed_value("lamp", ((m_lamp_decode & 0x0f)+15) ) ==0 ) output_set_indexed_value("lamp", ((m_lamp_decode & 0x0f)+15), ((data & 0x20) ? FALSE : TRUE));
- if (output_get_indexed_value("lamp", ((m_lamp_decode & 0x0f)+30) ) ==0 ) output_set_indexed_value("lamp", ((m_lamp_decode & 0x0f)+30), ((data & 0x40) ? FALSE : TRUE));
- if (output_get_indexed_value("lamp", ((m_lamp_decode & 0x0f)+45) ) ==0 ) output_set_indexed_value("lamp", ((m_lamp_decode & 0x0f)+45), ((data & 0x80) ? FALSE : TRUE));
+ if (output().get_indexed_value("lamp", ((m_lamp_decode & 0x0f)+00) ) ==0 ) output().set_indexed_value("lamp", ((m_lamp_decode & 0x0f)+00), ((data & 0x10) ? FALSE : TRUE));
+ if (output().get_indexed_value("lamp", ((m_lamp_decode & 0x0f)+15) ) ==0 ) output().set_indexed_value("lamp", ((m_lamp_decode & 0x0f)+15), ((data & 0x20) ? FALSE : TRUE));
+ if (output().get_indexed_value("lamp", ((m_lamp_decode & 0x0f)+30) ) ==0 ) output().set_indexed_value("lamp", ((m_lamp_decode & 0x0f)+30), ((data & 0x40) ? FALSE : TRUE));
+ if (output().get_indexed_value("lamp", ((m_lamp_decode & 0x0f)+45) ) ==0 ) output().set_indexed_value("lamp", ((m_lamp_decode & 0x0f)+45), ((data & 0x80) ? FALSE : TRUE));
}
else
{
@@ -698,11 +698,11 @@ WRITE8_MEMBER( by17_state::u11_a_w )
{
static const UINT8 patterns[16] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0,0,0,0,0,0 }; // MC14543 - BCD to 7 Segment Display Decoder
- output_set_digit_value(10+m_digit, patterns[m_segment[1]]);
- output_set_digit_value(20+m_digit, patterns[m_segment[2]]);
- output_set_digit_value(30+m_digit, patterns[m_segment[3]]);
- output_set_digit_value(40+m_digit, patterns[m_segment[4]]);
- output_set_digit_value(50+m_digit, patterns[m_segment[5]]);
+ output().set_digit_value(10+m_digit, patterns[m_segment[1]]);
+ output().set_digit_value(20+m_digit, patterns[m_segment[2]]);
+ output().set_digit_value(30+m_digit, patterns[m_segment[3]]);
+ output().set_digit_value(40+m_digit, patterns[m_segment[4]]);
+ output().set_digit_value(50+m_digit, patterns[m_segment[5]]);
}
@@ -715,7 +715,7 @@ WRITE8_MEMBER( by17_state::u11_b_w )
{
if ((data & 0x0f) < 0x0f) // Momentary Solenoids
{
- output_set_indexed_value( "solenoid", (data & 0x0f), TRUE);
+ output().set_indexed_value( "solenoid", (data & 0x0f), TRUE);
if (m_solenoid_features[(data & 0x0f)][3]) // Reset/release relevant switch after firing Solenoid
m_io_hold_x[(m_solenoid_features[(data & 0x0f)][2])] &= (m_solenoid_features[(data & 0x0f)][3]);
@@ -727,7 +727,7 @@ WRITE8_MEMBER( by17_state::u11_b_w )
{
for (int i=0; i<15; i++)
{
- output_set_indexed_value( "solenoid", i, FALSE);
+ output().set_indexed_value( "solenoid", i, FALSE);
}
}
}
@@ -735,49 +735,49 @@ WRITE8_MEMBER( by17_state::u11_b_w )
if ((m_u11b & 0x10) && ((data & 0x10)==0))
{
- output_set_value("solenoid16", TRUE);
+ output().set_value("solenoid16", TRUE);
if (m_solenoid_features[16][0] != 0xff)
m_samples->start(m_solenoid_features[16][0], m_solenoid_features[16][1]);
}
else if ((data & 0x10) && ((m_u11b & 0x10)==0))
{
- output_set_value("solenoid16", FALSE);
+ output().set_value("solenoid16", FALSE);
if (m_solenoid_features[16][0] != 0xff)
m_samples->start(m_solenoid_features[16][0], m_solenoid_features[16][2]);
}
if ((m_u11b & 0x20) && ((data & 0x20)==0))
{
- output_set_value("solenoid17", TRUE); // Coin Lockout Coil engage
+ output().set_value("solenoid17", TRUE); // Coin Lockout Coil engage
if (m_solenoid_features[17][0] != 0xff)
m_samples->start(m_solenoid_features[17][0], m_solenoid_features[17][1]);
}
else if ((data & 0x20) && ((m_u11b & 0x20)==0))
{
- output_set_value("solenoid17", FALSE); // Coin Lockout Coil release
+ output().set_value("solenoid17", FALSE); // Coin Lockout Coil release
if (m_solenoid_features[17][0] != 0xff)
m_samples->start(m_solenoid_features[17][0], m_solenoid_features[17][2]);
}
if ((m_u11b & 0x40) && ((data & 0x40)==0))
{
- output_set_value("solenoid18", TRUE); // Flipper Enable Relay engage
+ output().set_value("solenoid18", TRUE); // Flipper Enable Relay engage
if (m_solenoid_features[18][0] != 0xff)
m_samples->start(m_solenoid_features[18][0], m_solenoid_features[18][1]);
}
else if ((data & 0x40) && ((m_u11b & 0x40)==0))
{
- output_set_value("solenoid18", FALSE); // Flipper Enable Relay release
+ output().set_value("solenoid18", FALSE); // Flipper Enable Relay release
if (m_solenoid_features[18][0] != 0xff)
m_samples->start(m_solenoid_features[18][0], m_solenoid_features[18][2]);
}
if ((m_u11b & 0x80) && ((data & 0x80)==0))
{
- output_set_value("solenoid19", TRUE);
+ output().set_value("solenoid19", TRUE);
if (m_solenoid_features[19][0] != 0xff)
m_samples->start(m_solenoid_features[19][0], m_solenoid_features[19][1]);
}
else if ((data & 0x80) && ((m_u11b & 0x80)==0))
{
- output_set_value("solenoid19", FALSE);
+ output().set_value("solenoid19", FALSE);
if (m_solenoid_features[19][0] != 0xff)
m_samples->start(m_solenoid_features[19][0], m_solenoid_features[19][2]);
}
@@ -809,7 +809,7 @@ TIMER_DEVICE_CALLBACK_MEMBER( by17_state::timer_z_freq )
for (int i=0; i<60; i++)
{
- output_set_indexed_value( "lamp", i, 0 );
+ output().set_indexed_value( "lamp", i, 0 );
}
}
diff --git a/src/mame/drivers/by35.cpp b/src/mame/drivers/by35.cpp
index 923b11470fb..476804d398b 100644
--- a/src/mame/drivers/by35.cpp
+++ b/src/mame/drivers/by35.cpp
@@ -521,11 +521,11 @@ WRITE_LINE_MEMBER( by35_state::u10_ca2_w )
for (digit=1; digit<=8; digit++)
{
- output_set_digit_value(10+digit, 0);
- output_set_digit_value(20+digit, 0);
- output_set_digit_value(30+digit, 0);
- output_set_digit_value(40+digit, 0);
- output_set_digit_value(50+digit, 0);
+ output().set_digit_value(10+digit, 0);
+ output().set_digit_value(20+digit, 0);
+ output().set_digit_value(30+digit, 0);
+ output().set_digit_value(40+digit, 0);
+ output().set_digit_value(50+digit, 0);
}
}
#endif
@@ -545,7 +545,7 @@ WRITE_LINE_MEMBER( by35_state::u10_cb2_w )
WRITE_LINE_MEMBER( by35_state::u11_ca2_w )
{
- output_set_value("led0", state);
+ output().set_value("led0", state);
}
READ_LINE_MEMBER( by35_state::u11_ca1_r )
@@ -609,10 +609,10 @@ WRITE8_MEMBER( by35_state::u10_a_w )
{
if ((m_lamp_decode & 0x0f) < 0x0f)
{
- if (output_get_indexed_value("lamp", ((m_lamp_decode & 0x0f)+00) ) ==0 ) output_set_indexed_value("lamp", ((m_lamp_decode & 0x0f)+00), ((data & 0x10) ? FALSE : TRUE));
- if (output_get_indexed_value("lamp", ((m_lamp_decode & 0x0f)+15) ) ==0 ) output_set_indexed_value("lamp", ((m_lamp_decode & 0x0f)+15), ((data & 0x20) ? FALSE : TRUE));
- if (output_get_indexed_value("lamp", ((m_lamp_decode & 0x0f)+30) ) ==0 ) output_set_indexed_value("lamp", ((m_lamp_decode & 0x0f)+30), ((data & 0x40) ? FALSE : TRUE));
- if (output_get_indexed_value("lamp", ((m_lamp_decode & 0x0f)+45) ) ==0 ) output_set_indexed_value("lamp", ((m_lamp_decode & 0x0f)+45), ((data & 0x80) ? FALSE : TRUE));
+ if (output().get_indexed_value("lamp", ((m_lamp_decode & 0x0f)+00) ) ==0 ) output().set_indexed_value("lamp", ((m_lamp_decode & 0x0f)+00), ((data & 0x10) ? FALSE : TRUE));
+ if (output().get_indexed_value("lamp", ((m_lamp_decode & 0x0f)+15) ) ==0 ) output().set_indexed_value("lamp", ((m_lamp_decode & 0x0f)+15), ((data & 0x20) ? FALSE : TRUE));
+ if (output().get_indexed_value("lamp", ((m_lamp_decode & 0x0f)+30) ) ==0 ) output().set_indexed_value("lamp", ((m_lamp_decode & 0x0f)+30), ((data & 0x40) ? FALSE : TRUE));
+ if (output().get_indexed_value("lamp", ((m_lamp_decode & 0x0f)+45) ) ==0 ) output().set_indexed_value("lamp", ((m_lamp_decode & 0x0f)+45), ((data & 0x80) ? FALSE : TRUE));
}
else
{
@@ -705,11 +705,11 @@ WRITE8_MEMBER( by35_state::u11_a_w )
{
static const UINT8 patterns[16] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0,0,0,0,0,0 }; // MC14543 - BCD to 7 Segment Display Decoder
- output_set_digit_value(10+m_digit, patterns[m_segment[1]]);
- output_set_digit_value(20+m_digit, patterns[m_segment[2]]);
- output_set_digit_value(30+m_digit, patterns[m_segment[3]]);
- output_set_digit_value(40+m_digit, patterns[m_segment[4]]);
- output_set_digit_value(50+m_digit, patterns[m_segment[5]]);
+ output().set_digit_value(10+m_digit, patterns[m_segment[1]]);
+ output().set_digit_value(20+m_digit, patterns[m_segment[2]]);
+ output().set_digit_value(30+m_digit, patterns[m_segment[3]]);
+ output().set_digit_value(40+m_digit, patterns[m_segment[4]]);
+ output().set_digit_value(50+m_digit, patterns[m_segment[5]]);
}
@@ -723,11 +723,11 @@ WRITE8_MEMBER( by35_state::u11_b_w )
if ((data & 0x0f) < 0x0f) // Momentary Solenoids
{
if (m_solenoid_features[(data & 0x0f)][0] != 0xff) { // Play solenoid audio sample
- if (output_get_indexed_value("solenoid", (data & 0x0f)) == FALSE)
+ if (output().get_indexed_value("solenoid", (data & 0x0f)) == FALSE)
m_samples->start(m_solenoid_features[(data & 0x0f)][0], m_solenoid_features[(data & 0x0f)][1]);
}
- output_set_indexed_value( "solenoid", (data & 0x0f), TRUE);
+ output().set_indexed_value( "solenoid", (data & 0x0f), TRUE);
if (m_solenoid_features[(data & 0x0f)][3]) // Reset/release relevant switch after firing Solenoid
m_io_hold_x[(m_solenoid_features[(data & 0x0f)][2])] &= (m_solenoid_features[(data & 0x0f)][3]);
@@ -736,7 +736,7 @@ WRITE8_MEMBER( by35_state::u11_b_w )
{
for (int i=0; i<15; i++)
{
- output_set_indexed_value( "solenoid", i, FALSE);
+ output().set_indexed_value( "solenoid", i, FALSE);
}
}
}
@@ -744,49 +744,49 @@ WRITE8_MEMBER( by35_state::u11_b_w )
if ((m_u11b & 0x10) && ((data & 0x10)==0))
{
- output_set_value("solenoid16", TRUE);
+ output().set_value("solenoid16", TRUE);
if (m_solenoid_features[16][0] != 0xff)
m_samples->start(m_solenoid_features[16][0], m_solenoid_features[16][1]);
}
else if ((data & 0x10) && ((m_u11b & 0x10)==0))
{
- output_set_value("solenoid16", FALSE);
+ output().set_value("solenoid16", FALSE);
if (m_solenoid_features[16][0] != 0xff)
m_samples->start(m_solenoid_features[16][0], m_solenoid_features[16][2]);
}
if ((m_u11b & 0x20) && ((data & 0x20)==0))
{
- output_set_value("solenoid17", TRUE); // Coin Lockout Coil engage
+ output().set_value("solenoid17", TRUE); // Coin Lockout Coil engage
if (m_solenoid_features[17][0] != 0xff)
m_samples->start(m_solenoid_features[17][0], m_solenoid_features[17][1]);
}
else if ((data & 0x20) && ((m_u11b & 0x20)==0))
{
- output_set_value("solenoid17", FALSE); // Coin Lockout Coil release
+ output().set_value("solenoid17", FALSE); // Coin Lockout Coil release
if (m_solenoid_features[17][0] != 0xff)
m_samples->start(m_solenoid_features[17][0], m_solenoid_features[17][2]);
}
if ((m_u11b & 0x40) && ((data & 0x40)==0))
{
- output_set_value("solenoid18", TRUE); // Flipper Enable Relay engage
+ output().set_value("solenoid18", TRUE); // Flipper Enable Relay engage
if (m_solenoid_features[18][0] != 0xff)
m_samples->start(m_solenoid_features[18][0], m_solenoid_features[18][1]);
}
else if ((data & 0x40) && ((m_u11b & 0x40)==0))
{
- output_set_value("solenoid18", FALSE); // Flipper Enable Relay release
+ output().set_value("solenoid18", FALSE); // Flipper Enable Relay release
if (m_solenoid_features[18][0] != 0xff)
m_samples->start(m_solenoid_features[18][0], m_solenoid_features[18][2]);
}
if ((m_u11b & 0x80) && ((data & 0x80)==0))
{
- output_set_value("solenoid19", TRUE);
+ output().set_value("solenoid19", TRUE);
if (m_solenoid_features[19][0] != 0xff)
m_samples->start(m_solenoid_features[19][0], m_solenoid_features[19][1]);
}
else if ((data & 0x80) && ((m_u11b & 0x80)==0))
{
- output_set_value("solenoid19", FALSE);
+ output().set_value("solenoid19", FALSE);
if (m_solenoid_features[19][0] != 0xff)
m_samples->start(m_solenoid_features[19][0], m_solenoid_features[19][2]);
}
@@ -823,7 +823,7 @@ TIMER_DEVICE_CALLBACK_MEMBER( by35_state::timer_z_freq )
for (int i=0; i<60; i++)
{
- output_set_indexed_value( "lamp", i, 0 );
+ output().set_indexed_value( "lamp", i, 0 );
}
}
diff --git a/src/mame/drivers/by6803.cpp b/src/mame/drivers/by6803.cpp
index e2a9e1da262..bc7ce7e9f14 100644
--- a/src/mame/drivers/by6803.cpp
+++ b/src/mame/drivers/by6803.cpp
@@ -186,7 +186,7 @@ READ8_MEMBER( by6803_state::port2_r )
WRITE8_MEMBER( by6803_state::port2_w )
{
m_port2 = data;
- output_set_value("led0", BIT(data, 2)); // P22 drives LED
+ output().set_value("led0", BIT(data, 2)); // P22 drives LED
}
// display latch strobes; display blanking
@@ -222,19 +222,19 @@ WRITE8_MEMBER( by6803_state::pia0_a_w )
switch (m_pia0_a)
{
case 0x10: // wrong
- output_set_digit_value(m_digit, m_segment);
+ output().set_digit_value(m_digit, m_segment);
break;
case 0x1d:
- output_set_digit_value(8+m_digit, m_segment);
+ output().set_digit_value(8+m_digit, m_segment);
break;
case 0x1b:
- output_set_digit_value(16+m_digit, m_segment);
+ output().set_digit_value(16+m_digit, m_segment);
break;
case 0x07:
- output_set_digit_value(24+m_digit, m_segment);
+ output().set_digit_value(24+m_digit, m_segment);
break;
case 0x0f:
- output_set_digit_value(32+m_digit, m_segment);
+ output().set_digit_value(32+m_digit, m_segment);
break;
default:
break;
diff --git a/src/mame/drivers/byvid.cpp b/src/mame/drivers/byvid.cpp
index bd1b267a62d..939c7dbed81 100644
--- a/src/mame/drivers/byvid.cpp
+++ b/src/mame/drivers/byvid.cpp
@@ -559,7 +559,7 @@ READ8_MEMBER( by133_state::m6803_port2_r )
WRITE8_MEMBER( by133_state::m6803_port2_w )
{
//m_u7_b = data >> 1;
- m_beep->set_frequency(600);
+ m_beep->set_clock(600);
m_beep->set_state(BIT(data, 0));
}
@@ -581,7 +581,7 @@ WRITE_LINE_MEMBER( by133_state::u11_ca2_w )
WRITE_LINE_MEMBER( by133_state::u7_cb2_w )
{
// red led
- m_beep->set_frequency(950);
+ m_beep->set_clock(950);
m_beep->set_state(state);
}
@@ -796,7 +796,7 @@ static MACHINE_CONFIG_START( babypac, by133_state )
MCFG_DAC_ADD("dac")
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
MCFG_SPEAKER_STANDARD_MONO("beee")
- MCFG_SOUND_ADD("beeper", BEEP, 0)
+ MCFG_SOUND_ADD("beeper", BEEP, 600)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "beee", 0.10)
MACHINE_CONFIG_END
diff --git a/src/mame/drivers/bzone.cpp b/src/mame/drivers/bzone.cpp
index 03601f5cb6e..e3b43d4d4cf 100644
--- a/src/mame/drivers/bzone.cpp
+++ b/src/mame/drivers/bzone.cpp
@@ -266,7 +266,7 @@ CUSTOM_INPUT_MEMBER(bzone_state::clock_r)
WRITE8_MEMBER(bzone_state::bzone_coin_counter_w)
{
- coin_counter_w(machine(), offset,data);
+ machine().bookkeeping().coin_counter_w(offset,data);
}
diff --git a/src/mame/drivers/c80.cpp b/src/mame/drivers/c80.cpp
index 028bcb5c803..b1dfb1263aa 100644
--- a/src/mame/drivers/c80.cpp
+++ b/src/mame/drivers/c80.cpp
@@ -202,7 +202,7 @@ WRITE8_MEMBER( c80_state::pio1_pb_w )
if (!m_pio1_a5)
{
- output_set_digit_value(m_digit, data);
+ output().set_digit_value(m_digit, data);
}
m_keylatch = data;
diff --git a/src/mame/drivers/cabal.cpp b/src/mame/drivers/cabal.cpp
index 304d42390db..d60976bc679 100644
--- a/src/mame/drivers/cabal.cpp
+++ b/src/mame/drivers/cabal.cpp
@@ -175,8 +175,8 @@ READ8_MEMBER(cabal_state::cabalbl_snd1_r)
WRITE8_MEMBER(cabal_state::cabalbl_coin_w)
{
- coin_counter_w(machine(), 0, data & 1);
- coin_counter_w(machine(), 1, data & 2);
+ machine().bookkeeping().coin_counter_w(0, data & 1);
+ machine().bookkeeping().coin_counter_w(1, data & 2);
//data & 0x40? video enable?
}
diff --git a/src/mame/drivers/cabaret.cpp b/src/mame/drivers/cabaret.cpp
index 8f9df7a020d..bdaf1aef465 100644
--- a/src/mame/drivers/cabaret.cpp
+++ b/src/mame/drivers/cabaret.cpp
@@ -154,12 +154,12 @@ WRITE8_MEMBER(cabaret_state::cabaret_nmi_and_coins_w)
// popmessage("%02x",data);
}
- coin_counter_w(machine(), 0, data & 0x01); // coin_a
- coin_counter_w(machine(), 1, data & 0x04); // coin_c
- coin_counter_w(machine(), 2, data & 0x08); // key in
- coin_counter_w(machine(), 3, data & 0x10); // coin m_out mech
+ machine().bookkeeping().coin_counter_w(0, data & 0x01); // coin_a
+ machine().bookkeeping().coin_counter_w(1, data & 0x04); // coin_c
+ machine().bookkeeping().coin_counter_w(2, data & 0x08); // key in
+ machine().bookkeeping().coin_counter_w(3, data & 0x10); // coin m_out mech
- set_led_status(machine(), 6, data & 0x40); // led for coin m_out / hopper active
+ output().set_led_value(6, data & 0x40); // led for coin m_out / hopper active
m_nmi_enable = data; // data & 0x80 // nmi enable?
diff --git a/src/mame/drivers/calchase.cpp b/src/mame/drivers/calchase.cpp
index 6b446ae47d2..18354d8e5dc 100644
--- a/src/mame/drivers/calchase.cpp
+++ b/src/mame/drivers/calchase.cpp
@@ -149,8 +149,8 @@ public:
{
}
- UINT32 *m_bios_ram;
- UINT32 *m_bios_ext_ram;
+ std::unique_ptr<UINT32[]> m_bios_ram;
+ std::unique_ptr<UINT32[]> m_bios_ext_ram;
UINT8 m_mtxc_config_reg[256];
UINT8 m_piix4_config_reg[4][256];
@@ -204,11 +204,11 @@ static void mtxc_config_w(device_t *busdevice, device_t *device, int function, i
if (reg == 0x63)
{
if (data & 0x20) // enable RAM access to region 0xf0000 - 0xfffff
- state->membank("bios_bank")->set_base(state->m_bios_ram);
+ state->membank("bios_bank")->set_base(state->m_bios_ram.get());
else // disable RAM access (reads go to BIOS ROM)
state->membank("bios_bank")->set_base(state->memregion("bios")->base() + 0x10000);
if (data & 0x80) // enable RAM access to region 0xe0000 - 0xeffff
- state->membank("bios_ext")->set_base(state->m_bios_ext_ram);
+ state->membank("bios_ext")->set_base(state->m_bios_ext_ram.get());
else
state->membank("bios_ext")->set_base(state->memregion("bios")->base() + 0);
}
@@ -339,7 +339,7 @@ WRITE32_MEMBER(calchase_state::bios_ram_w)
{
if (m_mtxc_config_reg[0x63] & 0x10) // write to RAM if this region is write-enabled
{
- COMBINE_DATA(m_bios_ram + offset);
+ COMBINE_DATA(m_bios_ram.get() + offset);
}
}
@@ -347,7 +347,7 @@ WRITE32_MEMBER(calchase_state::bios_ext_ram_w)
{
if (m_mtxc_config_reg[0x63] & 0x40) // write to RAM if this region is write-enabled
{
- COMBINE_DATA(m_bios_ext_ram + offset);
+ COMBINE_DATA(m_bios_ext_ram.get() + offset);
}
}
@@ -641,8 +641,8 @@ INPUT_PORTS_END
void calchase_state::machine_start()
{
- m_bios_ram = auto_alloc_array(machine(), UINT32, 0x10000/4);
- m_bios_ext_ram = auto_alloc_array(machine(), UINT32, 0x10000/4);
+ m_bios_ram = std::make_unique<UINT32[]>(0x10000/4);
+ m_bios_ext_ram = std::make_unique<UINT32[]>(0x10000/4);
}
void calchase_state::machine_reset()
@@ -725,7 +725,7 @@ WRITE32_MEMBER(calchase_state::calchase_idle_skip_w)
DRIVER_INIT_MEMBER(calchase_state,calchase)
{
- m_bios_ram = auto_alloc_array(machine(), UINT32, 0x20000/4);
+ m_bios_ram = std::make_unique<UINT32[]>(0x20000/4);
intel82439tx_init();
@@ -734,7 +734,7 @@ DRIVER_INIT_MEMBER(calchase_state,calchase)
DRIVER_INIT_MEMBER(calchase_state, hostinv)
{
- m_bios_ram = auto_alloc_array(machine(), UINT32, 0x20000/4);
+ m_bios_ram = std::make_unique<UINT32[]>(0x20000/4);
intel82439tx_init();
}
diff --git a/src/mame/drivers/calomega.cpp b/src/mame/drivers/calomega.cpp
index 553d8b0d2e6..4143ff318d1 100644
--- a/src/mame/drivers/calomega.cpp
+++ b/src/mame/drivers/calomega.cpp
@@ -784,33 +784,33 @@ WRITE8_MEMBER(calomega_state::pia1_bout_w)
WRITE8_MEMBER(calomega_state::lamps_903a_w)
{
/* First 5 bits of PIA0 port B */
- output_set_lamp_value(1, 1-((data) & 1)); /* L1 (Hold 1) */
- output_set_lamp_value(2, 1-((data >> 1) & 1)); /* L2 (Hold 2) */
- output_set_lamp_value(3, 1-((data >> 2) & 1)); /* L3 (Hold 3) */
- output_set_lamp_value(4, 1-((data >> 3) & 1)); /* L4 (Hold 4) */
- output_set_lamp_value(5, 1-((data >> 4) & 1)); /* L5 (Hold 5) */
+ output().set_lamp_value(1, 1-((data) & 1)); /* L1 (Hold 1) */
+ output().set_lamp_value(2, 1-((data >> 1) & 1)); /* L2 (Hold 2) */
+ output().set_lamp_value(3, 1-((data >> 2) & 1)); /* L3 (Hold 3) */
+ output().set_lamp_value(4, 1-((data >> 3) & 1)); /* L4 (Hold 4) */
+ output().set_lamp_value(5, 1-((data >> 4) & 1)); /* L5 (Hold 5) */
}
WRITE8_MEMBER(calomega_state::lamps_903b_w)
{
/* First 4 bits of PIA1 port A */
- output_set_lamp_value(6, 1-((data) & 1)); /* L6 (Cancel) */
- output_set_lamp_value(7, 1-((data >> 1) & 1)); /* L7 (Bet) */
- output_set_lamp_value(8, 1-((data >> 2) & 1)); /* L8 (Take) */
- output_set_lamp_value(9, 1-((data >> 3) & 1)); /* L9 (Door?) */
+ output().set_lamp_value(6, 1-((data) & 1)); /* L6 (Cancel) */
+ output().set_lamp_value(7, 1-((data >> 1) & 1)); /* L7 (Bet) */
+ output().set_lamp_value(8, 1-((data >> 2) & 1)); /* L8 (Take) */
+ output().set_lamp_value(9, 1-((data >> 3) & 1)); /* L9 (Door?) */
}
WRITE8_MEMBER(calomega_state::lamps_905_w)
{
/* Whole 8 bits of PIA0 port B */
- output_set_lamp_value(1, 1-((data) & 1)); /* L1 (Hold 1) */
- output_set_lamp_value(2, 1-((data >> 1) & 1)); /* L2 (Hold 2) */
- output_set_lamp_value(3, 1-((data >> 2) & 1)); /* L3 (Hold 3) */
- output_set_lamp_value(4, 1-((data >> 3) & 1)); /* L4 (Hold 4) */
- output_set_lamp_value(5, 1-((data >> 4) & 1)); /* L5 (Hold 5) */
- output_set_lamp_value(6, 1-((data >> 5) & 1)); /* L6 (unknown) */
- output_set_lamp_value(7, 1-((data >> 6) & 1)); /* L7 (unknown) */
- output_set_lamp_value(8, 1-((data >> 7) & 1)); /* L8 (unknown) */
+ output().set_lamp_value(1, 1-((data) & 1)); /* L1 (Hold 1) */
+ output().set_lamp_value(2, 1-((data >> 1) & 1)); /* L2 (Hold 2) */
+ output().set_lamp_value(3, 1-((data >> 2) & 1)); /* L3 (Hold 3) */
+ output().set_lamp_value(4, 1-((data >> 3) & 1)); /* L4 (Hold 4) */
+ output().set_lamp_value(5, 1-((data >> 4) & 1)); /* L5 (Hold 5) */
+ output().set_lamp_value(6, 1-((data >> 5) & 1)); /* L6 (unknown) */
+ output().set_lamp_value(7, 1-((data >> 6) & 1)); /* L7 (unknown) */
+ output().set_lamp_value(8, 1-((data >> 7) & 1)); /* L8 (unknown) */
}
diff --git a/src/mame/drivers/canyon.cpp b/src/mame/drivers/canyon.cpp
index 1e08018a616..41a9fe0bbad 100644
--- a/src/mame/drivers/canyon.cpp
+++ b/src/mame/drivers/canyon.cpp
@@ -95,7 +95,7 @@ READ8_MEMBER(canyon_state::canyon_options_r)
WRITE8_MEMBER(canyon_state::canyon_led_w)
{
- set_led_status(machine(), offset & 0x01, offset & 0x02);
+ output().set_led_value(offset & 0x01, offset & 0x02);
}
diff --git a/src/mame/drivers/cardline.cpp b/src/mame/drivers/cardline.cpp
index ae58b74824b..740fb7e28f4 100644
--- a/src/mame/drivers/cardline.cpp
+++ b/src/mame/drivers/cardline.cpp
@@ -196,14 +196,14 @@ READ8_MEMBER(cardline_state::hsync_r)
WRITE8_MEMBER(cardline_state::lamps_w)
{
/* button lamps 1-8 (collect, card 1-5, bet, start) */
- output_set_lamp_value(5,(data >> 0) & 1);
- output_set_lamp_value(0,(data >> 1) & 1);
- output_set_lamp_value(1,(data >> 2) & 1);
- output_set_lamp_value(2,(data >> 3) & 1);
- output_set_lamp_value(3,(data >> 4) & 1);
- output_set_lamp_value(4,(data >> 5) & 1);
- output_set_lamp_value(6,(data >> 6) & 1);
- output_set_lamp_value(7,(data >> 7) & 1);
+ output().set_lamp_value(5,(data >> 0) & 1);
+ output().set_lamp_value(0,(data >> 1) & 1);
+ output().set_lamp_value(1,(data >> 2) & 1);
+ output().set_lamp_value(2,(data >> 3) & 1);
+ output().set_lamp_value(3,(data >> 4) & 1);
+ output().set_lamp_value(4,(data >> 5) & 1);
+ output().set_lamp_value(6,(data >> 6) & 1);
+ output().set_lamp_value(7,(data >> 7) & 1);
}
static ADDRESS_MAP_START( mem_prg, AS_PROGRAM, 8, cardline_state )
diff --git a/src/mame/drivers/casloopy.cpp b/src/mame/drivers/casloopy.cpp
index 2b5f60f3a41..d01b81163a2 100644
--- a/src/mame/drivers/casloopy.cpp
+++ b/src/mame/drivers/casloopy.cpp
@@ -175,9 +175,9 @@ public:
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
- UINT16 *m_paletteram;
- UINT8 *m_vram;
- UINT8 *m_bitmap_vram;
+ std::unique_ptr<UINT16[]> m_paletteram;
+ std::unique_ptr<UINT8[]> m_vram;
+ std::unique_ptr<UINT8[]> m_bitmap_vram;
UINT16 sh7021_regs[0x100];
int m_gfx_index;
DECLARE_DRIVER_INIT(casloopy);
@@ -225,9 +225,9 @@ static const gfx_layout casloopy_8bpp_layout =
void casloopy_state::video_start()
{
/* TODO: proper sizes */
- m_paletteram = auto_alloc_array_clear(machine(), UINT16, 0x1000);
- m_vram = auto_alloc_array_clear(machine(), UINT8, 0x10000);
- m_bitmap_vram = auto_alloc_array_clear(machine(), UINT8, 0x20000);
+ m_paletteram = make_unique_clear<UINT16[]>(0x1000);
+ m_vram = make_unique_clear<UINT8[]>(0x10000);
+ m_bitmap_vram = make_unique_clear<UINT8[]>(0x20000);
for (m_gfx_index = 0; m_gfx_index < MAX_GFX_ELEMENTS; m_gfx_index++)
if (m_gfxdecode->gfx(m_gfx_index) == nullptr)
@@ -236,8 +236,8 @@ void casloopy_state::video_start()
for(int i=0;i<0x10000;i++)
m_vram[i] = i & 0xff;
- m_gfxdecode->set_gfx(m_gfx_index, global_alloc(gfx_element(m_palette, casloopy_4bpp_layout, m_vram, 0, 0x10, 0)));
- m_gfxdecode->set_gfx(m_gfx_index+1, global_alloc(gfx_element(m_palette, casloopy_8bpp_layout, m_vram, 0, 1, 0)));
+ m_gfxdecode->set_gfx(m_gfx_index, std::make_unique<gfx_element>(m_palette, casloopy_4bpp_layout, m_vram.get(), 0, 0x10, 0));
+ m_gfxdecode->set_gfx(m_gfx_index+1, std::make_unique<gfx_element>(m_palette, casloopy_8bpp_layout, m_vram.get(), 0, 1, 0));
}
UINT32 casloopy_state::screen_update_casloopy(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
@@ -320,8 +320,8 @@ READ16_MEMBER(casloopy_state::vregs_r)
WRITE16_MEMBER(casloopy_state::vregs_w)
{
- if(offset != 6/2)
- printf("%08x %08x\n",offset*2,data);
+// if(offset != 6/2)
+// printf("%08x %08x\n",offset*2,data);
}
READ16_MEMBER(casloopy_state::pal_r)
@@ -422,10 +422,10 @@ static ADDRESS_MAP_START( casloopy_map, AS_PROGRAM, 32, casloopy_state )
AM_RANGE(0x0405b000, 0x0405b00f) AM_RAM AM_SHARE("vregs") // RGB555 brightness control plus scrolling
// AM_RANGE(0x05ffff00, 0x05ffffff) AM_READWRITE16(sh7021_r, sh7021_w, 0xffffffff)
// AM_RANGE(0x05ffff00, 0x05ffffff) - SH7021 internal i/o
- AM_RANGE(0x06000000, 0x061fffff) AM_READ(cart_r)
+ AM_RANGE(0x06000000, 0x062fffff) AM_READ(cart_r)
AM_RANGE(0x07000000, 0x070003ff) AM_RAM AM_SHARE("oram")// on-chip RAM, actually at 0xf000000 (1 kb)
AM_RANGE(0x09000000, 0x0907ffff) AM_RAM AM_SHARE("wram")
- AM_RANGE(0x0e000000, 0x0e1fffff) AM_READ(cart_r)
+ AM_RANGE(0x0e000000, 0x0e2fffff) AM_READ(cart_r)
AM_RANGE(0x0f000000, 0x0f0003ff) AM_RAM AM_SHARE("oram")
ADDRESS_MAP_END
@@ -479,7 +479,7 @@ DEVICE_IMAGE_LOAD_MEMBER( casloopy_state, loopy_cart )
UINT32 size = m_cart->common_get_size("rom");
UINT8 *SRC, *DST;
dynamic_buffer temp;
- temp.resize(0x200000);
+ temp.resize(size);
m_cart->rom_alloc(size, GENERIC_ROM32_WIDTH, ENDIANNESS_LITTLE);
@@ -488,7 +488,7 @@ DEVICE_IMAGE_LOAD_MEMBER( casloopy_state, loopy_cart )
m_cart->common_load_rom(&temp[0], size, "rom");
// fix endianness
- for (int i = 0; i < 0x200000; i += 4)
+ for (int i = 0; i < size; i += 4)
{
UINT8 tempa = SRC[i + 0];
UINT8 tempb = SRC[i + 1];
diff --git a/src/mame/drivers/caswin.cpp b/src/mame/drivers/caswin.cpp
index fa8b3420104..f774057fd73 100644
--- a/src/mame/drivers/caswin.cpp
+++ b/src/mame/drivers/caswin.cpp
@@ -163,11 +163,11 @@ READ8_MEMBER(caswin_state::vvillage_rng_r)
WRITE8_MEMBER(caswin_state::vvillage_output_w)
{
- coin_counter_w(machine(), 0,data & 1);
- coin_counter_w(machine(), 1,data & 1);
+ machine().bookkeeping().coin_counter_w(0,data & 1);
+ machine().bookkeeping().coin_counter_w(1,data & 1);
// data & 4 payout counter
- coin_lockout_w(machine(), 0,data & 0x20);
- coin_lockout_w(machine(), 1,data & 0x20);
+ machine().bookkeeping().coin_lockout_w(0,data & 0x20);
+ machine().bookkeeping().coin_lockout_w(1,data & 0x20);
}
WRITE8_MEMBER(caswin_state::vvillage_lamps_w)
@@ -179,11 +179,11 @@ WRITE8_MEMBER(caswin_state::vvillage_lamps_w)
---- --x- lamp button 2
---- ---x lamp button 1
*/
- set_led_status(machine(), 0, data & 0x01);
- set_led_status(machine(), 1, data & 0x02);
- set_led_status(machine(), 2, data & 0x04);
- set_led_status(machine(), 3, data & 0x08);
- set_led_status(machine(), 4, data & 0x10);
+ output().set_led_value(0, data & 0x01);
+ output().set_led_value(1, data & 0x02);
+ output().set_led_value(2, data & 0x04);
+ output().set_led_value(3, data & 0x08);
+ output().set_led_value(4, data & 0x10);
}
static ADDRESS_MAP_START( vvillage_mem, AS_PROGRAM, 8, caswin_state )
diff --git a/src/mame/drivers/cave.cpp b/src/mame/drivers/cave.cpp
index 5e333578c03..0a4b3447626 100644
--- a/src/mame/drivers/cave.cpp
+++ b/src/mame/drivers/cave.cpp
@@ -298,10 +298,10 @@ WRITE16_MEMBER(cave_state::cave_eeprom_msb_w)
if (ACCESSING_BITS_8_15) // even address
{
- coin_lockout_w(machine(), 1,~data & 0x8000);
- coin_lockout_w(machine(), 0,~data & 0x4000);
- coin_counter_w(machine(), 1, data & 0x2000);
- coin_counter_w(machine(), 0, data & 0x1000);
+ machine().bookkeeping().coin_lockout_w(1,~data & 0x8000);
+ machine().bookkeeping().coin_lockout_w(0,~data & 0x4000);
+ machine().bookkeeping().coin_counter_w(1, data & 0x2000);
+ machine().bookkeeping().coin_counter_w(0, data & 0x1000);
// latch the bit
m_eeprom->di_write((data & 0x0800) >> 11);
@@ -363,10 +363,10 @@ WRITE16_MEMBER(cave_state::cave_eeprom_lsb_w)
if (ACCESSING_BITS_0_7) // odd address
{
- coin_lockout_w(machine(), 1, ~data & 0x0008);
- coin_lockout_w(machine(), 0, ~data & 0x0004);
- coin_counter_w(machine(), 1, data & 0x0002);
- coin_counter_w(machine(), 0, data & 0x0001);
+ machine().bookkeeping().coin_lockout_w(1, ~data & 0x0008);
+ machine().bookkeeping().coin_lockout_w(0, ~data & 0x0004);
+ machine().bookkeeping().coin_counter_w(1, data & 0x0002);
+ machine().bookkeeping().coin_counter_w(0, data & 0x0001);
// latch the bit
m_eeprom->di_write((data & 0x80) >> 7);
@@ -384,8 +384,8 @@ WRITE16_MEMBER(cave_state::gaia_coin_lsb_w)
{
if (ACCESSING_BITS_0_7) // odd address
{
- coin_counter_w(machine(), 1, data & 0x0002);
- coin_counter_w(machine(), 0, data & 0x0001);
+ machine().bookkeeping().coin_counter_w(1, data & 0x0002);
+ machine().bookkeeping().coin_counter_w(0, data & 0x0001);
}
}
@@ -398,8 +398,8 @@ WRITE16_MEMBER(cave_state::metmqstr_eeprom_msb_w)
if (ACCESSING_BITS_8_15) // even address
{
- coin_counter_w(machine(), 1, data & 0x2000);
- coin_counter_w(machine(), 0, data & 0x1000);
+ machine().bookkeeping().coin_counter_w(1, data & 0x2000);
+ machine().bookkeeping().coin_counter_w(0, data & 0x1000);
if (~data & 0x0100)
{
@@ -640,21 +640,21 @@ WRITE16_MEMBER(cave_state::korokoro_leds_w)
{
COMBINE_DATA(&m_leds[0]);
- set_led_status(machine(), 0, data & 0x8000);
- set_led_status(machine(), 1, data & 0x4000);
- set_led_status(machine(), 2, data & 0x1000); // square button
- set_led_status(machine(), 3, data & 0x0800); // round button
-// coin_lockout_w(machine(), 1, ~data & 0x0200); // coin lockouts?
-// coin_lockout_w(machine(), 0, ~data & 0x0100);
+ output().set_led_value(0, data & 0x8000);
+ output().set_led_value(1, data & 0x4000);
+ output().set_led_value(2, data & 0x1000); // square button
+ output().set_led_value(3, data & 0x0800); // round button
+// machine().bookkeeping().coin_lockout_w(1, ~data & 0x0200); // coin lockouts?
+// machine().bookkeeping().coin_lockout_w(0, ~data & 0x0100);
-// coin_counter_w(machine(), 2, data & 0x0080);
-// coin_counter_w(machine(), 1, data & 0x0020);
- coin_counter_w(machine(), 0, data & 0x0010);
+// machine().bookkeeping().coin_counter_w(2, data & 0x0080);
+// machine().bookkeeping().coin_counter_w(1, data & 0x0020);
+ machine().bookkeeping().coin_counter_w(0, data & 0x0010);
- set_led_status(machine(), 5, data & 0x0008);
- set_led_status(machine(), 6, data & 0x0004);
- set_led_status(machine(), 7, data & 0x0002);
- set_led_status(machine(), 8, data & 0x0001);
+ output().set_led_value(5, data & 0x0008);
+ output().set_led_value(6, data & 0x0004);
+ output().set_led_value(7, data & 0x0002);
+ output().set_led_value(8, data & 0x0001);
show_leds();
}
@@ -843,19 +843,19 @@ WRITE16_MEMBER(cave_state::ppsatan_out_w)
{
if (ACCESSING_BITS_0_7)
{
- coin_counter_w(machine(), 0, data & 0x0001);
+ machine().bookkeeping().coin_counter_w(0, data & 0x0001);
- set_led_status(machine(), 0, data & 0x0010);
- set_led_status(machine(), 1, data & 0x0020);
- set_led_status(machine(), 2, data & 0x0040);
- set_led_status(machine(), 3, data & 0x0080);
+ output().set_led_value(0, data & 0x0010);
+ output().set_led_value(1, data & 0x0020);
+ output().set_led_value(2, data & 0x0040);
+ output().set_led_value(3, data & 0x0080);
}
if (ACCESSING_BITS_8_15)
{
- set_led_status(machine(), 4, data & 0x0100);
- set_led_status(machine(), 5, data & 0x0200);
- set_led_status(machine(), 6, data & 0x0400); // not tested in service mode
- set_led_status(machine(), 7, data & 0x0800); // not tested in service mode
+ output().set_led_value(4, data & 0x0100);
+ output().set_led_value(5, data & 0x0200);
+ output().set_led_value(6, data & 0x0400); // not tested in service mode
+ output().set_led_value(7, data & 0x0800); // not tested in service mode
m_oki->set_bank_base((data & 0x8000) ? 0x40000 : 0);
}
@@ -1027,14 +1027,14 @@ WRITE16_MEMBER(cave_state::tjumpman_leds_w)
{
if (ACCESSING_BITS_0_7)
{
- set_led_status(machine(), 0, data & 0x0001); // suru
- set_led_status(machine(), 1, data & 0x0002); // shinai
- set_led_status(machine(), 2, data & 0x0004); // payout
- set_led_status(machine(), 3, data & 0x0008); // go
- set_led_status(machine(), 4, data & 0x0010); // 1 bet
- set_led_status(machine(), 5, data & 0x0020); // medal
+ output().set_led_value(0, data & 0x0001); // suru
+ output().set_led_value(1, data & 0x0002); // shinai
+ output().set_led_value(2, data & 0x0004); // payout
+ output().set_led_value(3, data & 0x0008); // go
+ output().set_led_value(4, data & 0x0010); // 1 bet
+ output().set_led_value(5, data & 0x0020); // medal
m_hopper = data & 0x0040; // hopper
- set_led_status(machine(), 6, data & 0x0080); // 3 bet
+ output().set_led_value(6, data & 0x0080); // 3 bet
}
// popmessage("led %04X", data);
@@ -1073,12 +1073,12 @@ WRITE16_MEMBER(cave_state::pacslot_leds_w)
{
if (ACCESSING_BITS_0_7)
{
- set_led_status(machine(), 0, data & 0x0001); // pac-man
- set_led_status(machine(), 1, data & 0x0002); // ms. pac-man
- set_led_status(machine(), 2, data & 0x0004); // payout
- set_led_status(machine(), 3, data & 0x0008); // start
- set_led_status(machine(), 4, data & 0x0010); // bet
- set_led_status(machine(), 5, data & 0x0020); // medal
+ output().set_led_value(0, data & 0x0001); // pac-man
+ output().set_led_value(1, data & 0x0002); // ms. pac-man
+ output().set_led_value(2, data & 0x0004); // payout
+ output().set_led_value(3, data & 0x0008); // start
+ output().set_led_value(4, data & 0x0010); // bet
+ output().set_led_value(5, data & 0x0020); // medal
m_hopper = data & 0x0040; // hopper
}
@@ -1994,12 +1994,11 @@ static MACHINE_CONFIG_START( dfeveron, cave_state )
MCFG_VIDEO_START_OVERRIDE(cave_state,cave_2_layers)
/* sound hardware */
- MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
+ MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD("ymz", YMZ280B, XTAL_16_9344MHz)
MCFG_YMZ280B_IRQ_HANDLER(WRITELINE(cave_state, sound_irq_gen))
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
MACHINE_CONFIG_END
@@ -2036,12 +2035,11 @@ static MACHINE_CONFIG_START( ddonpach, cave_state )
MCFG_VIDEO_START_OVERRIDE(cave_state,cave_3_layers)
/* sound hardware */
- MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
+ MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD("ymz", YMZ280B, XTAL_16_9344MHz)
MCFG_YMZ280B_IRQ_HANDLER(WRITELINE(cave_state, sound_irq_gen))
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
MACHINE_CONFIG_END
@@ -2077,15 +2075,13 @@ static MACHINE_CONFIG_START( donpachi, cave_state )
MCFG_VIDEO_START_OVERRIDE(cave_state,cave_3_layers)
/* sound hardware */
- MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
+ MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_OKIM6295_ADD("oki1", XTAL_4_224MHz/4, OKIM6295_PIN7_HIGH) // pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.60)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.60)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.60)
MCFG_OKIM6295_ADD("oki2", XTAL_4_224MHz/2, OKIM6295_PIN7_HIGH) // pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
MCFG_DEVICE_ADD("nmk112", NMK112, 0)
MCFG_NMK112_ROM0("oki1")
@@ -2126,12 +2122,11 @@ static MACHINE_CONFIG_START( esprade, cave_state )
MCFG_VIDEO_START_OVERRIDE(cave_state,cave_3_layers)
/* sound hardware */
- MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
+ MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD("ymz", YMZ280B, XTAL_16_9344MHz)
MCFG_YMZ280B_IRQ_HANDLER(WRITELINE(cave_state, sound_irq_gen))
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
MACHINE_CONFIG_END
@@ -2166,12 +2161,11 @@ static MACHINE_CONFIG_START( gaia, cave_state )
MCFG_VIDEO_START_OVERRIDE(cave_state,cave_3_layers)
/* sound hardware */
- MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
+ MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD("ymz", YMZ280B, XTAL_16_9344MHz)
MCFG_YMZ280B_IRQ_HANDLER(WRITELINE(cave_state, sound_irq_gen))
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
MACHINE_CONFIG_END
@@ -2207,12 +2201,11 @@ static MACHINE_CONFIG_START( guwange, cave_state )
MCFG_VIDEO_START_OVERRIDE(cave_state,cave_3_layers)
/* sound hardware */
- MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
+ MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD("ymz", YMZ280B, XTAL_16_9344MHz)
MCFG_YMZ280B_IRQ_HANDLER(WRITELINE(cave_state, sound_irq_gen))
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
MACHINE_CONFIG_END
/***************************************************************************
@@ -2251,22 +2244,17 @@ static MACHINE_CONFIG_START( hotdogst, cave_state )
MCFG_VIDEO_START_OVERRIDE(cave_state,cave_3_layers)
/* sound hardware */
- MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
+ MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD("ymsnd", YM2203, XTAL_32MHz/8)
MCFG_YM2203_IRQ_HANDLER(WRITELINE(cave_state, irqhandler))
- MCFG_SOUND_ROUTE(0, "lspeaker", 0.20)
- MCFG_SOUND_ROUTE(0, "rspeaker", 0.20)
- MCFG_SOUND_ROUTE(1, "lspeaker", 0.20)
- MCFG_SOUND_ROUTE(1, "rspeaker", 0.20)
- MCFG_SOUND_ROUTE(2, "lspeaker", 0.20)
- MCFG_SOUND_ROUTE(2, "rspeaker", 0.20)
- MCFG_SOUND_ROUTE(3, "lspeaker", 0.80)
- MCFG_SOUND_ROUTE(3, "rspeaker", 0.80)
+ MCFG_SOUND_ROUTE(0, "mono", 0.20)
+ MCFG_SOUND_ROUTE(1, "mono", 0.20)
+ MCFG_SOUND_ROUTE(2, "mono", 0.20)
+ MCFG_SOUND_ROUTE(3, "mono", 0.80)
MCFG_OKIM6295_ADD("oki", XTAL_32MHz/16, OKIM6295_PIN7_HIGH) // pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
MCFG_DEVICE_ADDRESS_MAP(AS_0, oki_map)
MACHINE_CONFIG_END
@@ -2303,12 +2291,11 @@ static MACHINE_CONFIG_START( korokoro, cave_state )
MCFG_VIDEO_START_OVERRIDE(cave_state,cave_1_layer)
/* sound hardware */
- MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
+ MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD("ymz", YMZ280B, XTAL_16_9344MHz)
MCFG_YMZ280B_IRQ_HANDLER(WRITELINE(cave_state, sound_irq_gen))
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( crusherm, korokoro )
@@ -2357,22 +2344,17 @@ static MACHINE_CONFIG_START( mazinger, cave_state )
MCFG_VIDEO_START_OVERRIDE(cave_state,cave_2_layers)
/* sound hardware */
- MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
+ MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD("ymsnd", YM2203, XTAL_4MHz)
MCFG_YM2203_IRQ_HANDLER(WRITELINE(cave_state, irqhandler))
- MCFG_SOUND_ROUTE(0, "lspeaker", 0.20)
- MCFG_SOUND_ROUTE(0, "rspeaker", 0.20)
- MCFG_SOUND_ROUTE(1, "lspeaker", 0.20)
- MCFG_SOUND_ROUTE(1, "rspeaker", 0.20)
- MCFG_SOUND_ROUTE(2, "lspeaker", 0.20)
- MCFG_SOUND_ROUTE(2, "rspeaker", 0.20)
- MCFG_SOUND_ROUTE(3, "lspeaker", 0.60)
- MCFG_SOUND_ROUTE(3, "rspeaker", 0.60)
+ MCFG_SOUND_ROUTE(0, "mono", 0.20)
+ MCFG_SOUND_ROUTE(1, "mono", 0.20)
+ MCFG_SOUND_ROUTE(2, "mono", 0.20)
+ MCFG_SOUND_ROUTE(3, "mono", 0.60)
MCFG_OKIM6295_ADD("oki", XTAL_1_056MHz, OKIM6295_PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 2.0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 2.0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 2.0)
MCFG_DEVICE_ADDRESS_MAP(AS_0, oki_map)
MACHINE_CONFIG_END
@@ -2415,21 +2397,18 @@ static MACHINE_CONFIG_START( metmqstr, cave_state )
MCFG_VIDEO_START_OVERRIDE(cave_state,cave_3_layers)
/* sound hardware */
- MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
+ MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_YM2151_ADD("ymsnd", XTAL_16MHz / 4)
MCFG_YM2151_IRQ_HANDLER(INPUTLINE("audiocpu", 0))
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.20)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.20)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.6)
MCFG_OKIM6295_ADD("oki1", XTAL_32MHz / 16 , OKIM6295_PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.5)
MCFG_DEVICE_ADDRESS_MAP(AS_0, oki_map)
MCFG_OKIM6295_ADD("oki2", XTAL_32MHz / 16 , OKIM6295_PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.5)
MCFG_DEVICE_ADDRESS_MAP(AS_0, oki2_map)
MACHINE_CONFIG_END
@@ -2588,26 +2567,20 @@ static MACHINE_CONFIG_START( pwrinst2, cave_state )
MCFG_VIDEO_START_OVERRIDE(cave_state,cave_4_layers)
/* sound hardware */
- MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
+ MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD("ymsnd", YM2203, XTAL_16MHz / 4)
MCFG_YM2203_IRQ_HANDLER(WRITELINE(cave_state, irqhandler))
- MCFG_SOUND_ROUTE(0, "lspeaker", 0.40)
- MCFG_SOUND_ROUTE(0, "rspeaker", 0.40)
- MCFG_SOUND_ROUTE(1, "lspeaker", 0.40)
- MCFG_SOUND_ROUTE(1, "rspeaker", 0.40)
- MCFG_SOUND_ROUTE(2, "lspeaker", 0.40)
- MCFG_SOUND_ROUTE(2, "rspeaker", 0.40)
- MCFG_SOUND_ROUTE(3, "lspeaker", 0.80)
- MCFG_SOUND_ROUTE(3, "rspeaker", 0.80)
+ MCFG_SOUND_ROUTE(0, "mono", 0.40)
+ MCFG_SOUND_ROUTE(1, "mono", 0.40)
+ MCFG_SOUND_ROUTE(2, "mono", 0.40)
+ MCFG_SOUND_ROUTE(3, "mono", 0.80)
MCFG_OKIM6295_ADD("oki1", XTAL_3MHz , OKIM6295_PIN7_LOW)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.80)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.80)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
MCFG_OKIM6295_ADD("oki2", XTAL_3MHz , OKIM6295_PIN7_LOW)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.00)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.00)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
MCFG_DEVICE_ADD("nmk112", NMK112, 0)
MCFG_NMK112_ROM0("oki1")
@@ -2653,20 +2626,17 @@ static MACHINE_CONFIG_START( sailormn, cave_state )
MCFG_VIDEO_START_OVERRIDE(cave_state,sailormn_3_layers) /* Layer 2 has 1 banked ROM */
/* sound hardware */
- MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
+ MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_YM2151_ADD("ymsnd", XTAL_16MHz/4)
MCFG_YM2151_IRQ_HANDLER(INPUTLINE("audiocpu", 0))
- MCFG_SOUND_ROUTE(0, "lspeaker", 0.30)
- MCFG_SOUND_ROUTE(1, "rspeaker", 0.30)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30)
MCFG_OKIM6295_ADD("oki1", 2112000, OKIM6295_PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
MCFG_DEVICE_ADDRESS_MAP(AS_0, oki_map)
MCFG_OKIM6295_ADD("oki2", 2112000, OKIM6295_PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
MCFG_DEVICE_ADDRESS_MAP(AS_0, oki2_map)
MACHINE_CONFIG_END
@@ -2750,12 +2720,11 @@ static MACHINE_CONFIG_START( uopoko, cave_state )
MCFG_VIDEO_START_OVERRIDE(cave_state,cave_1_layer)
/* sound hardware */
- MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
+ MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD("ymz", YMZ280B, XTAL_16_9344MHz)
MCFG_YMZ280B_IRQ_HANDLER(WRITELINE(cave_state, sound_irq_gen))
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
MACHINE_CONFIG_END
diff --git a/src/mame/drivers/cb2001.cpp b/src/mame/drivers/cb2001.cpp
index 8690bf0be8f..10fc8bb527a 100644
--- a/src/mame/drivers/cb2001.cpp
+++ b/src/mame/drivers/cb2001.cpp
@@ -860,7 +860,7 @@ ROM_START( scherrym )
ROM_LOAD16_WORD( "f11.bin", 0x000000, 0x40000, CRC(8967f58d) SHA1(eb01a16b7d108f5fbe5de8f611b4f77869aedbf1) )
ROM_REGION( 0x080000, "gfx", ROMREGION_ERASEFF )
-// ROM_LOAD( "12a.bin", 0x000000, 0x80000,NO_DUMP ) // missing on PCB - 2 PCBs have been found this way, it probably uploads the GFX.
+ ROM_LOAD( "gfx.12c", 0x000000, 0x80000,NO_DUMP ) // this board uses an unmarked MASK rom at 12c, 12a is unpopulated. Size unknown.
ROM_REGION( 0x400, "proms", 0 )
ROM_LOAD( "n82s135-1.bin", 0x000, 0x100, CRC(66ed363f) SHA1(65bd37842c441c2e712844b07c0cfe37ef16d0ef) )
diff --git a/src/mame/drivers/cball.cpp b/src/mame/drivers/cball.cpp
index fb192cc7155..ecb12c186d3 100644
--- a/src/mame/drivers/cball.cpp
+++ b/src/mame/drivers/cball.cpp
@@ -1,4 +1,4 @@
-// license:???
+// license:BSD-3-Clause
// copyright-holders:Stefan Jokisch
/***************************************************************************
diff --git a/src/mame/drivers/cbasebal.cpp b/src/mame/drivers/cbasebal.cpp
index 7ae08b20537..beca2e9a642 100644
--- a/src/mame/drivers/cbasebal.cpp
+++ b/src/mame/drivers/cbasebal.cpp
@@ -78,10 +78,10 @@ WRITE8_MEMBER(cbasebal_state::bankedram_w)
WRITE8_MEMBER(cbasebal_state::cbasebal_coinctrl_w)
{
- coin_lockout_w(machine(), 0, ~data & 0x04);
- coin_lockout_w(machine(), 1, ~data & 0x08);
- coin_counter_w(machine(), 0, data & 0x01);
- coin_counter_w(machine(), 1, data & 0x02);
+ machine().bookkeeping().coin_lockout_w(0, ~data & 0x04);
+ machine().bookkeeping().coin_lockout_w(1, ~data & 0x08);
+ machine().bookkeeping().coin_counter_w(0, data & 0x01);
+ machine().bookkeeping().coin_counter_w(1, data & 0x02);
}
@@ -337,11 +337,11 @@ DRIVER_INIT_MEMBER(cbasebal_state,cbasebal)
{
UINT8 *src = memregion("maincpu")->base();
int size = memregion("maincpu")->bytes();
- UINT8 *dst = auto_alloc_array(machine(), UINT8, size);
- pang_decode(src, dst, size);
+ m_decoded = std::make_unique<UINT8[]>(size);
+ pang_decode(src, m_decoded.get(), size);
membank("bank1")->configure_entries(0, 32, src + 0x10000, 0x4000);
- membank("bank0d")->set_base(dst);
- membank("bank1d")->configure_entries(0, 32, dst + 0x10000, 0x4000);
+ membank("bank0d")->set_base(m_decoded.get());
+ membank("bank1d")->configure_entries(0, 32, m_decoded.get() + 0x10000, 0x4000);
}
diff --git a/src/mame/drivers/cc40.cpp b/src/mame/drivers/cc40.cpp
index 16dcead7cde..d36d5dce934 100644
--- a/src/mame/drivers/cc40.cpp
+++ b/src/mame/drivers/cc40.cpp
@@ -116,7 +116,7 @@ public:
UINT8 m_clock_divider;
UINT8 m_key_select;
- UINT8 *m_sysram[2];
+ std::unique_ptr<UINT8[]> m_sysram[2];
UINT16 m_sysram_size[2];
UINT16 m_sysram_end[2];
UINT16 m_sysram_mask[2];
@@ -195,7 +195,7 @@ void cc40_state::update_lcd_indicator(UINT8 y, UINT8 x, int state)
// ---- raw lcd screen here ----
// under | ERROR v v v v v v _LOW
// output# | 60 61 62 63 50 51 52 53
- output_set_lamp_value(y * 10 + x, state);
+ output().set_lamp_value(y * 10 + x, state);
}
static HD44780_PIXEL_UPDATE(cc40_pixel_update)
@@ -402,7 +402,7 @@ INPUT_CHANGED_MEMBER(cc40_state::sysram_size_changed)
static INPUT_PORTS_START( cc40 )
PORT_START("RAMSIZE")
- PORT_CONFNAME( 0x07, 0x01, "RAM Chip 1") PORT_CHANGED_MEMBER(DEVICE_SELF, cc40_state, sysram_size_changed, (void *)nullptr)
+ PORT_CONFNAME( 0x07, 0x01, "RAM Chip 1") PORT_CHANGED_MEMBER(DEVICE_SELF, cc40_state, sysram_size_changed, (void *)0)
PORT_CONFSETTING( 0x00, "None" )
PORT_CONFSETTING( 0x01, "2KB" )
PORT_CONFSETTING( 0x04, "8KB" )
@@ -523,15 +523,15 @@ void cc40_state::init_sysram(int chip, UINT16 size)
if (m_sysram[chip] == nullptr)
{
// init to largest possible
- m_sysram[chip] = auto_alloc_array(machine(), UINT8, 0x2000);
- save_pointer(NAME(m_sysram[chip]), 0x2000, chip);
+ m_sysram[chip] = std::make_unique<UINT8[]>(0x2000);
+ save_pointer(NAME(m_sysram[chip].get()), 0x2000, chip);
save_item(NAME(m_sysram_size[chip]), chip);
save_item(NAME(m_sysram_end[chip]), chip);
save_item(NAME(m_sysram_mask[chip]), chip);
}
- m_nvram[chip]->set_base(m_sysram[chip], size);
+ m_nvram[chip]->set_base(m_sysram[chip].get(), size);
m_sysram_size[chip] = size;
}
diff --git a/src/mame/drivers/ccastles.cpp b/src/mame/drivers/ccastles.cpp
index 7e6ee7c0f27..42bac5ccc00 100644
--- a/src/mame/drivers/ccastles.cpp
+++ b/src/mame/drivers/ccastles.cpp
@@ -1,11 +1,9 @@
-// license:???
-// copyright-holders:Patrick Lawrence, Aaron Giles
+// license:BSD-3-Clause
+// copyright-holders:Aaron Giles
/***************************************************************************
Atari Crystal Castles hardware
- driver by Patrick Lawrence
-
Games supported:
* Crystal Castles (1983) [8 sets]
@@ -249,13 +247,13 @@ WRITE8_MEMBER(ccastles_state::irq_ack_w)
WRITE8_MEMBER(ccastles_state::led_w)
{
- set_led_status(machine(), offset, ~data & 1);
+ output().set_led_value(offset, ~data & 1);
}
WRITE8_MEMBER(ccastles_state::ccounter_w)
{
- coin_counter_w(machine(), offset, data & 1);
+ machine().bookkeeping().coin_counter_w(offset, data & 1);
}
diff --git a/src/mame/drivers/cchance.cpp b/src/mame/drivers/cchance.cpp
index 0fd606a3051..0283cf99df9 100644
--- a/src/mame/drivers/cchance.cpp
+++ b/src/mame/drivers/cchance.cpp
@@ -58,9 +58,9 @@ public:
WRITE8_MEMBER(cchance_state::output_0_w)
{
//---- --x- divider?
- coin_lockout_w(machine(), 0, ~data & 1);
+ machine().bookkeeping().coin_lockout_w(0, ~data & 1);
-// coin_counter_w(machine(), 0, ~data & 1);
+// machine().bookkeeping().coin_counter_w(0, ~data & 1);
}
diff --git a/src/mame/drivers/cclimber.cpp b/src/mame/drivers/cclimber.cpp
index c7e624d30ce..bc924df4980 100644
--- a/src/mame/drivers/cclimber.cpp
+++ b/src/mame/drivers/cclimber.cpp
@@ -2483,11 +2483,11 @@ DRIVER_INIT_MEMBER(cclimber_state,toprollr)
{ 0x20,0xa0,0x28,0xa8 }, { 0x00,0x08,0x20,0x28 } /* ...1...1...1...1 */
};
- UINT8 *opcodes = auto_alloc_array(machine(), UINT8, 0x6000*3);
- sega_decode(memregion("user1")->base(), opcodes, 0, convtable, 3, 0x6000);
+ m_opcodes = std::make_unique<UINT8[]>(0x6000*3);
+ sega_decode(memregion("user1")->base(), m_opcodes.get(), 0, convtable, 3, 0x6000);
membank("bank1")->configure_entries(0, 3, memregion("user1")->base(), 0x6000);
- membank("bank1d")->configure_entries(0, 3, opcodes, 0x6000);
+ membank("bank1d")->configure_entries(0, 3, m_opcodes.get(), 0x6000);
membank("bank1")->set_entry(0);
membank("bank1d")->set_entry(0);
diff --git a/src/mame/drivers/ccs2810.cpp b/src/mame/drivers/ccs2810.cpp
index 54be00bab5b..ab38592295a 100644
--- a/src/mame/drivers/ccs2810.cpp
+++ b/src/mame/drivers/ccs2810.cpp
@@ -101,8 +101,6 @@ private:
bool m_dsize;
UINT8 m_ds;
floppy_image_device *m_floppy;
- void fdc_intrq_w(bool state);
- void fdc_drq_w(bool state);
required_device<cpu_device> m_maincpu;
required_device<generic_terminal_device> m_terminal;
optional_device<mb8877_t> m_fdc;
diff --git a/src/mame/drivers/cd2650.cpp b/src/mame/drivers/cd2650.cpp
index ae40d4deaa3..03cde2f4d6c 100644
--- a/src/mame/drivers/cd2650.cpp
+++ b/src/mame/drivers/cd2650.cpp
@@ -114,7 +114,6 @@ INPUT_PORTS_END
void cd2650_state::machine_reset()
{
m_term_data = 0x80;
- m_beep->set_frequency(950); /* guess */
m_beep->set_state(0);
}
@@ -287,7 +286,7 @@ static MACHINE_CONFIG_START( cd2650, cd2650_state )
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_WAVE_ADD(WAVE_TAG, "cassette")
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
- MCFG_SOUND_ADD("beeper", BEEP, 0)
+ MCFG_SOUND_ADD("beeper", BEEP, 950) // guess
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
/* Devices */
diff --git a/src/mame/drivers/cdi.cpp b/src/mame/drivers/cdi.cpp
index 8b1e60376aa..e2c984228e6 100644
--- a/src/mame/drivers/cdi.cpp
+++ b/src/mame/drivers/cdi.cpp
@@ -18,9 +18,11 @@ Quizard does not work for unknown reasons.
TODO:
-- Proper handling of the 68070's internal devices (UART,DMA,Timers etc.)
-
-- Full emulation of the CDIC, SLAVE and/or MCD212 customs
+- Proper abstraction of the 68070's internal devices (UART,DMA,Timers etc.)
+- Mono-I: Full emulation of the CDIC, SLAVE and/or MCD212 customs
+- Mono-II: SERVO and SLAVE I/O device hookup
+- Mono-II: DSP56k hookup
+- Mono-II: Move 68HC05 I/O device hookup into CPU core
*******************************************************************************/
@@ -29,6 +31,7 @@ TODO:
#include "emu.h"
#include "cpu/m68000/m68000.h"
+#include "cpu/m6805/m6805.h"
#include "includes/cdi.h"
#include "machine/timekpr.h"
#include "sound/cdda.h"
@@ -38,7 +41,7 @@ TODO:
#include "softlist.h"
#if ENABLE_VERBOSE_LOG
-static inline void ATTR_PRINTF(3,4) verboselog(running_machine &machine, int n_level, const char *s_fmt, ...)
+static inline void ATTR_PRINTF(3,4) verboselog(device_t& device, int n_level, const char *s_fmt, ...)
{
if( VERBOSE_LEVEL >= n_level )
{
@@ -47,7 +50,7 @@ static inline void ATTR_PRINTF(3,4) verboselog(running_machine &machine, int n_l
va_start( v, s_fmt );
vsprintf( buf, s_fmt, v );
va_end( v );
- logerror( "%08x: %s", machine.device("maincpu")->safe_pc(), buf );
+ device.logerror("%s: %s", device.machine().describe_context(), buf );
}
}
#else
@@ -66,7 +69,26 @@ static ADDRESS_MAP_START( cdimono1_mem, AS_PROGRAM, 16, cdi_state )
#endif
AM_RANGE(0x00300000, 0x00303bff) AM_DEVREADWRITE("cdic", cdicdic_device, ram_r, ram_w)
AM_RANGE(0x00303c00, 0x00303fff) AM_DEVREADWRITE("cdic", cdicdic_device, regs_r, regs_w)
- AM_RANGE(0x00310000, 0x00317fff) AM_DEVREADWRITE("slave", cdislave_device, slave_r, slave_w)
+ AM_RANGE(0x00310000, 0x00317fff) AM_DEVREADWRITE("slave_hle", cdislave_device, slave_r, slave_w)
+ AM_RANGE(0x00318000, 0x0031ffff) AM_NOP
+ AM_RANGE(0x00320000, 0x00323fff) AM_DEVREADWRITE8("mk48t08", timekeeper_device, read, write, 0xff00) /* nvram (only low bytes used) */
+ AM_RANGE(0x00400000, 0x0047ffff) AM_ROM AM_REGION("maincpu", 0)
+ AM_RANGE(0x004fffe0, 0x004fffff) AM_DEVREADWRITE("mcd212", mcd212_device, regs_r, regs_w)
+ AM_RANGE(0x00500000, 0x0057ffff) AM_RAM
+ AM_RANGE(0x00500000, 0x00ffffff) AM_NOP
+ AM_RANGE(0x00e00000, 0x00efffff) AM_RAM // DVC
+ AM_RANGE(0x80000000, 0x8000807f) AM_DEVREADWRITE("scc68070", cdi68070_device, periphs_r, periphs_w)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( cdimono2_mem, AS_PROGRAM, 16, cdi_state )
+ AM_RANGE(0x00000000, 0x0007ffff) AM_RAM AM_SHARE("planea")
+ AM_RANGE(0x00200000, 0x0027ffff) AM_RAM AM_SHARE("planeb")
+#if ENABLE_UART_PRINTING
+ AM_RANGE(0x00301400, 0x00301403) AM_DEVREAD("scc68070", cdi68070_device, uart_loopback_enable)
+#endif
+ //AM_RANGE(0x00300000, 0x00303bff) AM_DEVREADWRITE("cdic", cdicdic_device, ram_r, ram_w)
+ //AM_RANGE(0x00303c00, 0x00303fff) AM_DEVREADWRITE("cdic", cdicdic_device, regs_r, regs_w)
+ //AM_RANGE(0x00310000, 0x00317fff) AM_DEVREADWRITE("slave", cdislave_device, slave_r, slave_w)
//AM_RANGE(0x00318000, 0x0031ffff) AM_NOP
AM_RANGE(0x00320000, 0x00323fff) AM_DEVREADWRITE8("mk48t08", timekeeper_device, read, write, 0xff00) /* nvram (only low bytes used) */
AM_RANGE(0x00400000, 0x0047ffff) AM_ROM AM_REGION("maincpu", 0)
@@ -77,6 +99,39 @@ static ADDRESS_MAP_START( cdimono1_mem, AS_PROGRAM, 16, cdi_state )
AM_RANGE(0x80000000, 0x8000807f) AM_DEVREADWRITE("scc68070", cdi68070_device, periphs_r, periphs_w)
ADDRESS_MAP_END
+static ADDRESS_MAP_START( cdi910_mem, AS_PROGRAM, 16, cdi_state )
+ AM_RANGE(0x00000000, 0x0007ffff) AM_RAM AM_SHARE("planea")
+ AM_RANGE(0x00180000, 0x001fffff) AM_ROM AM_REGION("maincpu", 0) // boot vectors point here
+
+ AM_RANGE(0x00200000, 0x0027ffff) AM_RAM AM_SHARE("planeb")
+#if ENABLE_UART_PRINTING
+ AM_RANGE(0x00301400, 0x00301403) AM_DEVREAD("scc68070", cdi68070_device, uart_loopback_enable)
+#endif
+// AM_RANGE(0x00300000, 0x00303bff) AM_DEVREADWRITE("cdic", cdicdic_device, ram_r, ram_w)
+// AM_RANGE(0x00303c00, 0x00303fff) AM_DEVREADWRITE("cdic", cdicdic_device, regs_r, regs_w)
+// AM_RANGE(0x00310000, 0x00317fff) AM_DEVREADWRITE("slave_hle", cdislave_device, slave_r, slave_w)
+// AM_RANGE(0x00318000, 0x0031ffff) AM_NOP
+ AM_RANGE(0x00320000, 0x00323fff) AM_DEVREADWRITE8("mk48t08", timekeeper_device, read, write, 0xff00) /* nvram (only low bytes used) */
+ AM_RANGE(0x004fffe0, 0x004fffff) AM_DEVREADWRITE("mcd212", mcd212_device, regs_r, regs_w)
+// AM_RANGE(0x00500000, 0x0057ffff) AM_RAM
+ AM_RANGE(0x00500000, 0x00ffffff) AM_NOP
+// AM_RANGE(0x00e00000, 0x00efffff) AM_RAM // DVC
+ AM_RANGE(0x80000000, 0x8000807f) AM_DEVREADWRITE("scc68070", cdi68070_device, periphs_r, periphs_w)
+ADDRESS_MAP_END
+
+
+static ADDRESS_MAP_START( cdimono2_servo_mem, AS_PROGRAM, 8, cdi_state )
+ AM_RANGE(0x0000, 0x001f) AM_READWRITE(servo_io_r, servo_io_w)
+ AM_RANGE(0x0050, 0x00ff) AM_RAM
+ AM_RANGE(0x0100, 0x1fff) AM_ROM AM_REGION("servo", 0x100)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( cdimono2_slave_mem, AS_PROGRAM, 8, cdi_state )
+ AM_RANGE(0x0000, 0x001f) AM_READWRITE(slave_io_r, slave_io_w)
+ AM_RANGE(0x0050, 0x00ff) AM_RAM
+ AM_RANGE(0x0100, 0x1fff) AM_ROM AM_REGION("slave", 0x100)
+ADDRESS_MAP_END
+
/*************************
* Input ports *
*************************/
@@ -129,14 +184,55 @@ INPUT_CHANGED_MEMBER(cdi_state::mcu_input)
static INPUT_PORTS_START( cdi )
PORT_START("MOUSEX")
- PORT_BIT(0x3ff, 0x000, IPT_MOUSE_X) PORT_SENSITIVITY(100) PORT_MINMAX(0x000, 0x3ff) PORT_KEYDELTA(2) PORT_CHANGED_MEMBER("slave", cdislave_device, mouse_update, 0)
+ PORT_BIT(0x3ff, 0x000, IPT_MOUSE_X) PORT_SENSITIVITY(100) PORT_MINMAX(0x000, 0x3ff) PORT_KEYDELTA(2) PORT_CHANGED_MEMBER("slave_hle", cdislave_device, mouse_update, 0)
+
+ PORT_START("MOUSEY")
+ PORT_BIT(0x3ff, 0x000, IPT_MOUSE_Y) PORT_SENSITIVITY(100) PORT_MINMAX(0x000, 0x3ff) PORT_KEYDELTA(2) PORT_CHANGED_MEMBER("slave_hle", cdislave_device, mouse_update, 0)
+
+ PORT_START("MOUSEBTN")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_CODE(MOUSECODE_BUTTON1) PORT_NAME("Mouse Button 1") PORT_CHANGED_MEMBER("slave_hle", cdislave_device, mouse_update, 0)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_BUTTON2) PORT_CODE(MOUSECODE_BUTTON2) PORT_NAME("Mouse Button 2") PORT_CHANGED_MEMBER("slave_hle", cdislave_device, mouse_update, 0)
+ PORT_BIT(0xfc, IP_ACTIVE_HIGH, IPT_UNUSED)
+
+ PORT_START("DEBUG")
+ PORT_CONFNAME( 0x01, 0x00, "Plane A Disable")
+ PORT_CONFSETTING( 0x00, DEF_STR( Off ) )
+ PORT_CONFSETTING( 0x01, DEF_STR( On ) )
+ PORT_CONFNAME( 0x02, 0x00, "Plane B Disable")
+ PORT_CONFSETTING( 0x00, DEF_STR( Off ) )
+ PORT_CONFSETTING( 0x02, DEF_STR( On ) )
+ PORT_CONFNAME( 0x04, 0x00, "Force Backdrop Color")
+ PORT_CONFSETTING( 0x00, DEF_STR( Off ) )
+ PORT_CONFSETTING( 0x04, DEF_STR( On ) )
+ PORT_CONFNAME( 0xf0, 0x00, "Backdrop Color")
+ PORT_CONFSETTING( 0x00, "Black" )
+ PORT_CONFSETTING( 0x10, "Half-Bright Blue" )
+ PORT_CONFSETTING( 0x20, "Half-Bright Green" )
+ PORT_CONFSETTING( 0x30, "Half-Bright Cyan" )
+ PORT_CONFSETTING( 0x40, "Half-Bright Red" )
+ PORT_CONFSETTING( 0x50, "Half-Bright Magenta" )
+ PORT_CONFSETTING( 0x60, "Half-Bright Yellow" )
+ PORT_CONFSETTING( 0x70, "Half-Bright White" )
+ PORT_CONFSETTING( 0x80, "Black (Alternate)" )
+ PORT_CONFSETTING( 0x90, "Blue" )
+ PORT_CONFSETTING( 0xa0, "Green" )
+ PORT_CONFSETTING( 0xb0, "Cyan" )
+ PORT_CONFSETTING( 0xc0, "Red" )
+ PORT_CONFSETTING( 0xd0, "Magenta" )
+ PORT_CONFSETTING( 0xe0, "Yellow" )
+ PORT_CONFSETTING( 0xf0, "White" )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( cdimono2 )
+ PORT_START("MOUSEX")
+ PORT_BIT(0x3ff, 0x000, IPT_MOUSE_X) PORT_SENSITIVITY(100) PORT_MINMAX(0x000, 0x3ff) PORT_KEYDELTA(2) //PORT_CHANGED_MEMBER("slave_hle", cdislave_device, mouse_update, 0)
PORT_START("MOUSEY")
- PORT_BIT(0x3ff, 0x000, IPT_MOUSE_Y) PORT_SENSITIVITY(100) PORT_MINMAX(0x000, 0x3ff) PORT_KEYDELTA(2) PORT_CHANGED_MEMBER("slave", cdislave_device, mouse_update, 0)
+ PORT_BIT(0x3ff, 0x000, IPT_MOUSE_Y) PORT_SENSITIVITY(100) PORT_MINMAX(0x000, 0x3ff) PORT_KEYDELTA(2) //PORT_CHANGED_MEMBER("slave_hle", cdislave_device, mouse_update, 0)
PORT_START("MOUSEBTN")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_CODE(MOUSECODE_BUTTON1) PORT_NAME("Mouse Button 1") PORT_CHANGED_MEMBER("slave", cdislave_device, mouse_update, 0)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_BUTTON2) PORT_CODE(MOUSECODE_BUTTON2) PORT_NAME("Mouse Button 2") PORT_CHANGED_MEMBER("slave", cdislave_device, mouse_update, 0)
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_CODE(MOUSECODE_BUTTON1) PORT_NAME("Mouse Button 1") //PORT_CHANGED_MEMBER("slave_hle", cdislave_device, mouse_update, 0)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_BUTTON2) PORT_CODE(MOUSECODE_BUTTON2) PORT_NAME("Mouse Button 2") //PORT_CHANGED_MEMBER("slave_hle", cdislave_device, mouse_update, 0)
PORT_BIT(0xfc, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_START("DEBUG")
@@ -190,20 +286,29 @@ static INPUT_PORTS_START( quizard )
INPUT_PORTS_END
-void cdi_state::machine_start()
+INTERRUPT_GEN_MEMBER( cdi_state::mcu_frame )
{
+ m_scc->mcu_frame();
}
-INTERRUPT_GEN_MEMBER( cdi_state::mcu_frame )
+MACHINE_RESET_MEMBER( cdi_state, cdimono1 )
{
- m_scc->mcu_frame();
+ UINT16 *src = (UINT16*)memregion("maincpu")->base();
+ UINT16 *dst = m_planea;
+ memcpy(dst, src, 0x8);
+ memset(m_servo_io_regs, 0, 0x20);
+ memset(m_slave_io_regs, 0, 0x20);
+
+ m_maincpu->reset();
+
+ m_dmadac[0] = machine().device<dmadac_sound_device>("dac1");
+ m_dmadac[1] = machine().device<dmadac_sound_device>("dac2");
}
-MACHINE_RESET_MEMBER(cdi_state,cdi)
+MACHINE_RESET_MEMBER( cdi_state, cdimono2 )
{
UINT16 *src = (UINT16*)memregion("maincpu")->base();
UINT16 *dst = m_planea;
- //device_t *cdrom_dev = machine().device("cdrom");
memcpy(dst, src, 0x8);
m_maincpu->reset();
@@ -212,34 +317,34 @@ MACHINE_RESET_MEMBER(cdi_state,cdi)
m_dmadac[1] = machine().device<dmadac_sound_device>("dac2");
}
-MACHINE_RESET_MEMBER(cdi_state,quizard12)
+MACHINE_RESET_MEMBER( cdi_state, quizard12 )
{
- MACHINE_RESET_CALL_MEMBER( cdi );
+ MACHINE_RESET_CALL_MEMBER( cdimono1 );
m_scc->set_quizard_mcu_value(0x021f);
m_scc->set_quizard_mcu_ack(0x5a);
}
-MACHINE_RESET_MEMBER(cdi_state,quizard17)
+MACHINE_RESET_MEMBER( cdi_state, quizard17 )
{
- MACHINE_RESET_CALL_MEMBER( cdi );
+ MACHINE_RESET_CALL_MEMBER( cdimono1 );
m_scc->set_quizard_mcu_value(0x021f);
m_scc->set_quizard_mcu_ack(0x5a);
}
/* Untested - copied from quizard17 */
-MACHINE_RESET_MEMBER(cdi_state,quizard18)
+MACHINE_RESET_MEMBER( cdi_state, quizard18 )
{
- MACHINE_RESET_CALL_MEMBER( cdi );
+ MACHINE_RESET_CALL_MEMBER( cdimono1 );
m_scc->set_quizard_mcu_value(0x021f);
m_scc->set_quizard_mcu_ack(0x5a);
}
-MACHINE_RESET_MEMBER(cdi_state,quizard22)
+MACHINE_RESET_MEMBER( cdi_state, quizard22 )
{
- MACHINE_RESET_CALL_MEMBER( cdi );
+ MACHINE_RESET_CALL_MEMBER( cdimono1 );
// 0x2b1: Italian
// 0x001: French
@@ -250,9 +355,9 @@ MACHINE_RESET_MEMBER(cdi_state,quizard22)
}
/* Untested - copied from quizard22 */
-MACHINE_RESET_MEMBER(cdi_state,quizard23)
+MACHINE_RESET_MEMBER( cdi_state, quizard23 )
{
- MACHINE_RESET_CALL_MEMBER( cdi );
+ MACHINE_RESET_CALL_MEMBER( cdimono1 );
// 0x2b1: Italian
// 0x001: French
@@ -262,56 +367,457 @@ MACHINE_RESET_MEMBER(cdi_state,quizard23)
m_scc->set_quizard_mcu_ack(0x59);
}
-MACHINE_RESET_MEMBER(cdi_state,quizard32)
+MACHINE_RESET_MEMBER( cdi_state, quizard32 )
{
- MACHINE_RESET_CALL_MEMBER( cdi );
+ MACHINE_RESET_CALL_MEMBER( cdimono1 );
m_scc->set_quizard_mcu_value(0x00ae);
m_scc->set_quizard_mcu_ack(0x58);
}
/* Untested - copied from quizard32 */
-MACHINE_RESET_MEMBER(cdi_state,quizard34)
+MACHINE_RESET_MEMBER( cdi_state, quizard34 )
{
- MACHINE_RESET_CALL_MEMBER( cdi );
+ MACHINE_RESET_CALL_MEMBER( cdimono1 );
m_scc->set_quizard_mcu_value(0x00ae);
m_scc->set_quizard_mcu_ack(0x58);
}
/* Untested - copied from quizard4r41 */
-MACHINE_RESET_MEMBER(cdi_state,quizard4r40)
+MACHINE_RESET_MEMBER( cdi_state, quizard4r40 )
{
- MACHINE_RESET_CALL_MEMBER( cdi );
+ MACHINE_RESET_CALL_MEMBER( cdimono1 );
//m_scc->set_quizard_mcu_value(0x0139);
m_scc->set_quizard_mcu_value(0x011f);
m_scc->set_quizard_mcu_ack(0x57);
}
-MACHINE_RESET_MEMBER(cdi_state,quizard4r41)
+MACHINE_RESET_MEMBER( cdi_state, quizard4r41 )
{
- MACHINE_RESET_CALL_MEMBER( cdi );
+ MACHINE_RESET_CALL_MEMBER( cdimono1 );
//m_scc->set_quizard_mcu_value(0x0139);
m_scc->set_quizard_mcu_value(0x011f);
m_scc->set_quizard_mcu_ack(0x57);
}
-MACHINE_RESET_MEMBER(cdi_state,quizard4r42)
+MACHINE_RESET_MEMBER( cdi_state, quizard4r42 )
{
- MACHINE_RESET_CALL_MEMBER( cdi );
+ MACHINE_RESET_CALL_MEMBER( cdimono1 );
m_scc->set_quizard_mcu_value(0x01ae);
m_scc->set_quizard_mcu_ack(0x57);
}
+/**************************
+* 68HC05 Handlers *
+**************************/
+
+READ8_MEMBER( cdi_state::servo_io_r )
+{
+ if (space.debugger_access())
+ {
+ return 0;
+ }
+
+ UINT8 ret = m_servo_io_regs[offset];
+
+ switch(offset)
+ {
+ case m68hc05eg_io_reg_t::PORT_A_DATA:
+ verboselog(*this, 1, "SERVO Port A Data read (%02x)\n", ret);
+ break;
+ case m68hc05eg_io_reg_t::PORT_B_DATA:
+ ret = 0x08;
+ verboselog(*this, 1, "SERVO Port B Data read (%02x)\n", ret);
+ break;
+ case m68hc05eg_io_reg_t::PORT_C_DATA:
+ ret |= INV_CADDYSWITCH_IN;
+ verboselog(*this, 1, "SERVO Port C Data read (%02x)\n", ret);
+ break;
+ case m68hc05eg_io_reg_t::PORT_D_INPUT:
+ verboselog(*this, 1, "SERVO Port D Input read (%02x)\n", ret);
+ break;
+ case m68hc05eg_io_reg_t::PORT_A_DDR:
+ verboselog(*this, 1, "SERVO Port A DDR read (%02x)\n", ret);
+ break;
+ case m68hc05eg_io_reg_t::PORT_B_DDR:
+ verboselog(*this, 1, "SERVO Port B DDR read (%02x)\n", ret);
+ break;
+ case m68hc05eg_io_reg_t::PORT_C_DDR:
+ verboselog(*this, 1, "SERVO Port C DDR read (%02x)\n", ret);
+ break;
+ case m68hc05eg_io_reg_t::SPI_CTRL:
+ verboselog(*this, 1, "SERVO SPI Control read (%02x)\n", ret);
+ break;
+ case m68hc05eg_io_reg_t::SPI_STATUS:
+ verboselog(*this, 1, "SERVO SPI Status read (%02x)\n", ret);
+ break;
+ case m68hc05eg_io_reg_t::SPI_DATA:
+ verboselog(*this, 1, "SERVO SPI Data read (%02x)\n", ret);
+ break;
+ case m68hc05eg_io_reg_t::SCC_BAUD:
+ verboselog(*this, 1, "SERVO SCC Baud Rate read (%02x)\n", ret);
+ break;
+ case m68hc05eg_io_reg_t::SCC_CTRL1:
+ verboselog(*this, 1, "SERVO SCC Control 1 read (%02x)\n", ret);
+ break;
+ case m68hc05eg_io_reg_t::SCC_CTRL2:
+ verboselog(*this, 1, "SERVO SCC Control 2 read (%02x)\n", ret);
+ break;
+ case m68hc05eg_io_reg_t::SCC_STATUS:
+ verboselog(*this, 1, "SERVO SCC Status read (%02x)\n", ret);
+ break;
+ case m68hc05eg_io_reg_t::SCC_DATA:
+ verboselog(*this, 1, "SERVO SCC Data read (%02x)\n", ret);
+ break;
+ case m68hc05eg_io_reg_t::TIMER_CTRL:
+ verboselog(*this, 1, "SERVO Timer Control read (%02x)\n", ret);
+ break;
+ case m68hc05eg_io_reg_t::TIMER_STATUS:
+ verboselog(*this, 1, "SERVO Timer Status read (%02x)\n", ret);
+ break;
+ case m68hc05eg_io_reg_t::ICAP_HI:
+ verboselog(*this, 1, "SERVO Input Capture Hi read (%02x)\n", ret);
+ break;
+ case m68hc05eg_io_reg_t::ICAP_LO:
+ verboselog(*this, 1, "SERVO Input Capture Lo read (%02x)\n", ret);
+ break;
+ case m68hc05eg_io_reg_t::OCMP_HI:
+ verboselog(*this, 1, "SERVO Output Compare Hi read (%02x)\n", ret);
+ break;
+ case m68hc05eg_io_reg_t::OCMP_LO:
+ verboselog(*this, 1, "SERVO Output Compare Lo read (%02x)\n", ret);
+ break;
+ case m68hc05eg_io_reg_t::COUNT_HI:
+ {
+ const UINT16 count = (m_servo->total_cycles() / 4) & 0x0000ffff;
+ ret = count >> 8;
+ verboselog(*this, 1, "SERVO Count Hi read (%02x)\n", ret);
+ break;
+ }
+ case m68hc05eg_io_reg_t::COUNT_LO:
+ {
+ const UINT16 count = (m_servo->total_cycles() / 4) & 0x0000ffff;
+ ret = count & 0x00ff;
+ verboselog(*this, 1, "SERVO Count Lo read (%02x)\n", ret);
+ break;
+ }
+ case m68hc05eg_io_reg_t::ACOUNT_HI:
+ {
+ const UINT16 count = (m_servo->total_cycles() / 4) & 0x0000ffff;
+ ret = count >> 8;
+ verboselog(*this, 1, "SERVO Alternate Count Hi read (%02x)\n", ret);
+ break;
+ }
+ case m68hc05eg_io_reg_t::ACOUNT_LO:
+ {
+ const UINT16 count = (m_servo->total_cycles() / 4) & 0x0000ffff;
+ ret = count & 0x00ff;
+ verboselog(*this, 1, "SERVO Alternate Count Lo read (%02x)\n", ret);
+ break;
+ }
+ default:
+ verboselog(*this, 0, "Unknown SERVO I/O read (%02x)\n", offset);
+ break;
+ }
+
+ return ret;
+}
+
+
+WRITE8_MEMBER( cdi_state::servo_io_w )
+{
+ switch(offset)
+ {
+ case m68hc05eg_io_reg_t::PORT_A_DATA:
+ verboselog(*this, 1, "SERVO Port A Data write (%02x)\n", data);
+ return;
+ case m68hc05eg_io_reg_t::PORT_B_DATA:
+ verboselog(*this, 1, "SERVO Port B Data write (%02x)\n", data);
+ return;
+ case m68hc05eg_io_reg_t::PORT_C_DATA:
+ verboselog(*this, 1, "SERVO Port C Data write (%02x)\n", data);
+ return;
+ case m68hc05eg_io_reg_t::PORT_D_INPUT:
+ verboselog(*this, 1, "SERVO Port D Input write (%02x)\n", data);
+ return;
+ case m68hc05eg_io_reg_t::PORT_A_DDR:
+ verboselog(*this, 1, "SERVO Port A DDR write (%02x)\n", data);
+ break;
+ case m68hc05eg_io_reg_t::PORT_B_DDR:
+ verboselog(*this, 1, "SERVO Port B DDR write (%02x)\n", data);
+ break;
+ case m68hc05eg_io_reg_t::PORT_C_DDR:
+ verboselog(*this, 1, "SERVO Port C DDR write (%02x)\n", data);
+ break;
+ case m68hc05eg_io_reg_t::SPI_CTRL:
+ verboselog(*this, 1, "SERVO SPI Control write (%02x)\n", data);
+ break;
+ case m68hc05eg_io_reg_t::SPI_STATUS:
+ verboselog(*this, 1, "SERVO SPI Status write (%02x)\n", data);
+ break;
+ case m68hc05eg_io_reg_t::SPI_DATA:
+ verboselog(*this, 1, "SERVO SPI Data write (%02x)\n", data);
+ break;
+ case m68hc05eg_io_reg_t::SCC_BAUD:
+ verboselog(*this, 1, "SERVO SCC Baud Rate write (%02x)\n", data);
+ break;
+ case m68hc05eg_io_reg_t::SCC_CTRL1:
+ verboselog(*this, 1, "SERVO SCC Control 1 write (%02x)\n", data);
+ break;
+ case m68hc05eg_io_reg_t::SCC_CTRL2:
+ verboselog(*this, 1, "SERVO SCC Control 2 write (%02x)\n", data);
+ break;
+ case m68hc05eg_io_reg_t::SCC_STATUS:
+ verboselog(*this, 1, "SERVO SCC Status write (%02x)\n", data);
+ break;
+ case m68hc05eg_io_reg_t::SCC_DATA:
+ verboselog(*this, 1, "SERVO SCC Data write (%02x)\n", data);
+ break;
+ case m68hc05eg_io_reg_t::TIMER_CTRL:
+ verboselog(*this, 1, "SERVO Timer Control write (%02x)\n", data);
+ break;
+ case m68hc05eg_io_reg_t::TIMER_STATUS:
+ verboselog(*this, 1, "SERVO Timer Status write (%02x)\n", data);
+ break;
+ case m68hc05eg_io_reg_t::ICAP_HI:
+ verboselog(*this, 1, "SERVO Input Capture Hi write (%02x)\n", data);
+ break;
+ case m68hc05eg_io_reg_t::ICAP_LO:
+ verboselog(*this, 1, "SERVO Input Capture Lo write (%02x)\n", data);
+ break;
+ case m68hc05eg_io_reg_t::OCMP_HI:
+ verboselog(*this, 1, "SERVO Output Compare Hi write (%02x)\n", data);
+ break;
+ case m68hc05eg_io_reg_t::OCMP_LO:
+ verboselog(*this, 1, "SERVO Output Compare Lo write (%02x)\n", data);
+ break;
+ case m68hc05eg_io_reg_t::COUNT_HI:
+ verboselog(*this, 1, "SERVO Count Hi write (%02x)\n", data);
+ break;
+ case m68hc05eg_io_reg_t::COUNT_LO:
+ verboselog(*this, 1, "SERVO Count Lo write (%02x)\n", data);
+ break;
+ case m68hc05eg_io_reg_t::ACOUNT_HI:
+ verboselog(*this, 1, "SERVO Alternate Count Hi write (%02x)\n", data);
+ break;
+ case m68hc05eg_io_reg_t::ACOUNT_LO:
+ verboselog(*this, 1, "SERVO Alternate Count Lo write (%02x)\n", data);
+ break;
+ default:
+ verboselog(*this, 0, "Unknown SERVO I/O write (%02x = %02x)\n", offset, data);
+ break;
+ }
+
+ m_servo_io_regs[offset] = data;
+}
+
+READ8_MEMBER( cdi_state::slave_io_r )
+{
+ if (space.debugger_access())
+ {
+ return 0;
+ }
+
+ UINT8 ret = m_slave_io_regs[offset];
+
+ switch(offset)
+ {
+ case m68hc05eg_io_reg_t::PORT_A_DATA:
+ verboselog(*this, 1, "SLAVE Port A Data read (%02x)\n", ret);
+ break;
+ case m68hc05eg_io_reg_t::PORT_B_DATA:
+ verboselog(*this, 1, "SLAVE Port B Data read (%02x)\n", ret);
+ break;
+ case m68hc05eg_io_reg_t::PORT_C_DATA:
+ verboselog(*this, 1, "SLAVE Port C Data read (%02x)\n", ret);
+ break;
+ case m68hc05eg_io_reg_t::PORT_D_INPUT:
+ verboselog(*this, 1, "SLAVE Port D Input read (%02x)\n", ret);
+ break;
+ case m68hc05eg_io_reg_t::PORT_A_DDR:
+ verboselog(*this, 1, "SLAVE Port A DDR read (%02x)\n", ret);
+ break;
+ case m68hc05eg_io_reg_t::PORT_B_DDR:
+ verboselog(*this, 1, "SLAVE Port B DDR read (%02x)\n", ret);
+ break;
+ case m68hc05eg_io_reg_t::PORT_C_DDR:
+ verboselog(*this, 1, "SLAVE Port C DDR read (%02x)\n", ret);
+ break;
+ case m68hc05eg_io_reg_t::SPI_CTRL:
+ verboselog(*this, 1, "SLAVE SPI Control read (%02x)\n", ret);
+ break;
+ case m68hc05eg_io_reg_t::SPI_STATUS:
+ verboselog(*this, 1, "SLAVE SPI Status read (%02x)\n", ret);
+ break;
+ case m68hc05eg_io_reg_t::SPI_DATA:
+ verboselog(*this, 1, "SLAVE SPI Data read (%02x)\n", ret);
+ break;
+ case m68hc05eg_io_reg_t::SCC_BAUD:
+ verboselog(*this, 1, "SLAVE SCC Baud Rate read (%02x)\n", ret);
+ break;
+ case m68hc05eg_io_reg_t::SCC_CTRL1:
+ verboselog(*this, 1, "SLAVE SCC Control 1 read (%02x)\n", ret);
+ break;
+ case m68hc05eg_io_reg_t::SCC_CTRL2:
+ verboselog(*this, 1, "SLAVE SCC Control 2 read (%02x)\n", ret);
+ break;
+ case m68hc05eg_io_reg_t::SCC_STATUS:
+ verboselog(*this, 1, "SLAVE SCC Status read (%02x)\n", ret);
+ break;
+ case m68hc05eg_io_reg_t::SCC_DATA:
+ verboselog(*this, 1, "SLAVE SCC Data read (%02x)\n", ret);
+ break;
+ case m68hc05eg_io_reg_t::TIMER_CTRL:
+ verboselog(*this, 1, "SLAVE Timer Control read (%02x)\n", ret);
+ break;
+ case m68hc05eg_io_reg_t::TIMER_STATUS:
+ verboselog(*this, 1, "SLAVE Timer Status read (%02x)\n", ret);
+ break;
+ case m68hc05eg_io_reg_t::ICAP_HI:
+ verboselog(*this, 1, "SLAVE Input Capture Hi read (%02x)\n", ret);
+ break;
+ case m68hc05eg_io_reg_t::ICAP_LO:
+ verboselog(*this, 1, "SLAVE Input Capture Lo read (%02x)\n", ret);
+ break;
+ case m68hc05eg_io_reg_t::OCMP_HI:
+ verboselog(*this, 1, "SLAVE Output Compare Hi read (%02x)\n", ret);
+ break;
+ case m68hc05eg_io_reg_t::OCMP_LO:
+ verboselog(*this, 1, "SLAVE Output Compare Lo read (%02x)\n", ret);
+ break;
+ case m68hc05eg_io_reg_t::COUNT_HI:
+ {
+ const UINT16 count = (m_slave->total_cycles() / 4) & 0x0000ffff;
+ ret = count >> 8;
+ verboselog(*this, 1, "SLAVE Count Hi read (%02x)\n", ret);
+ break;
+ }
+ case m68hc05eg_io_reg_t::COUNT_LO:
+ {
+ const UINT16 count = (m_slave->total_cycles() / 4) & 0x0000ffff;
+ ret = count & 0x00ff;
+ verboselog(*this, 1, "SLAVE Count Lo read (%02x)\n", ret);
+ break;
+ }
+ case m68hc05eg_io_reg_t::ACOUNT_HI:
+ {
+ const UINT16 count = (m_slave->total_cycles() / 4) & 0x0000ffff;
+ ret = count >> 8;
+ verboselog(*this, 1, "SLAVE Alternate Count Hi read (%02x)\n", ret);
+ break;
+ }
+ case m68hc05eg_io_reg_t::ACOUNT_LO:
+ {
+ const UINT16 count = (m_slave->total_cycles() / 4) & 0x0000ffff;
+ ret = count & 0x00ff;
+ verboselog(*this, 1, "SLAVE Alternate Count Lo read (%02x)\n", ret);
+ break;
+ }
+ default:
+ verboselog(*this, 0, "Unknown SLAVE I/O read (%02x)\n", offset);
+ break;
+ }
+
+ return ret;
+}
+
+WRITE8_MEMBER( cdi_state::slave_io_w )
+{
+ switch(offset)
+ {
+ case m68hc05eg_io_reg_t::PORT_A_DATA:
+ verboselog(*this, 1, "SLAVE Port A Data write (%02x)\n", data);
+ return;
+ case m68hc05eg_io_reg_t::PORT_B_DATA:
+ verboselog(*this, 1, "SLAVE Port B Data write (%02x)\n", data);
+ return;
+ case m68hc05eg_io_reg_t::PORT_C_DATA:
+ verboselog(*this, 1, "SLAVE Port C Data write (%02x)\n", data);
+ return;
+ case m68hc05eg_io_reg_t::PORT_D_INPUT:
+ verboselog(*this, 1, "SLAVE Port D Input write (%02x)\n", data);
+ return;
+ case m68hc05eg_io_reg_t::PORT_A_DDR:
+ verboselog(*this, 1, "SLAVE Port A DDR write (%02x)\n", data);
+ break;
+ case m68hc05eg_io_reg_t::PORT_B_DDR:
+ verboselog(*this, 1, "SLAVE Port B DDR write (%02x)\n", data);
+ break;
+ case m68hc05eg_io_reg_t::PORT_C_DDR:
+ verboselog(*this, 1, "SLAVE Port C DDR write (%02x)\n", data);
+ break;
+ case m68hc05eg_io_reg_t::SPI_CTRL:
+ verboselog(*this, 1, "SLAVE SPI Control write (%02x)\n", data);
+ break;
+ case m68hc05eg_io_reg_t::SPI_STATUS:
+ verboselog(*this, 1, "SLAVE SPI Status write (%02x)\n", data);
+ break;
+ case m68hc05eg_io_reg_t::SPI_DATA:
+ verboselog(*this, 1, "SLAVE SPI Data write (%02x)\n", data);
+ break;
+ case m68hc05eg_io_reg_t::SCC_BAUD:
+ verboselog(*this, 1, "SLAVE SCC Baud Rate write (%02x)\n", data);
+ break;
+ case m68hc05eg_io_reg_t::SCC_CTRL1:
+ verboselog(*this, 1, "SLAVE SCC Control 1 write (%02x)\n", data);
+ break;
+ case m68hc05eg_io_reg_t::SCC_CTRL2:
+ verboselog(*this, 1, "SLAVE SCC Control 2 write (%02x)\n", data);
+ break;
+ case m68hc05eg_io_reg_t::SCC_STATUS:
+ verboselog(*this, 1, "SLAVE SCC Status write (%02x)\n", data);
+ break;
+ case m68hc05eg_io_reg_t::SCC_DATA:
+ verboselog(*this, 1, "SLAVE SCC Data write (%02x)\n", data);
+ break;
+ case m68hc05eg_io_reg_t::TIMER_CTRL:
+ verboselog(*this, 1, "SLAVE Timer Control write (%02x)\n", data);
+ break;
+ case m68hc05eg_io_reg_t::TIMER_STATUS:
+ verboselog(*this, 1, "SLAVE Timer Status write (%02x)\n", data);
+ break;
+ case m68hc05eg_io_reg_t::ICAP_HI:
+ verboselog(*this, 1, "SLAVE Input Capture Hi write (%02x)\n", data);
+ break;
+ case m68hc05eg_io_reg_t::ICAP_LO:
+ verboselog(*this, 1, "SLAVE Input Capture Lo write (%02x)\n", data);
+ break;
+ case m68hc05eg_io_reg_t::OCMP_HI:
+ verboselog(*this, 1, "SLAVE Output Compare Hi write (%02x)\n", data);
+ break;
+ case m68hc05eg_io_reg_t::OCMP_LO:
+ verboselog(*this, 1, "SLAVE Output Compare Lo write (%02x)\n", data);
+ break;
+ case m68hc05eg_io_reg_t::COUNT_HI:
+ verboselog(*this, 1, "SLAVE Count Hi write (%02x)\n", data);
+ break;
+ case m68hc05eg_io_reg_t::COUNT_LO:
+ verboselog(*this, 1, "SLAVE Count Lo write (%02x)\n", data);
+ break;
+ case m68hc05eg_io_reg_t::ACOUNT_HI:
+ verboselog(*this, 1, "SLAVE Alternate Count Hi write (%02x)\n", data);
+ break;
+ case m68hc05eg_io_reg_t::ACOUNT_LO:
+ verboselog(*this, 1, "SLAVE Alternate Count Lo write (%02x)\n", data);
+ break;
+ default:
+ verboselog(*this, 0, "Unknown SLAVE I/O write (%02x = %02x)\n", offset, data);
+ break;
+ }
+
+ m_slave_io_regs[offset] = data;
+}
+
/*************************
* Machine Drivers *
*************************/
-static MACHINE_CONFIG_START( cdi, cdi_state )
-
+// CD-i Mono-I system base
+static MACHINE_CONFIG_START( cdimono1_base, cdi_state )
MCFG_CPU_ADD("maincpu", SCC68070, CLOCK_A/2)
MCFG_CPU_PROGRAM_MAP(cdimono1_mem)
@@ -322,7 +828,7 @@ static MACHINE_CONFIG_START( cdi, cdi_state )
MCFG_SCREEN_REFRESH_RATE(60)
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
MCFG_SCREEN_SIZE(384, 302)
- MCFG_SCREEN_VISIBLE_AREA(0, 384-1, 22, 302-1) //dynamic resolution,TODO
+ MCFG_SCREEN_VISIBLE_AREA(0, 384-1, 22, 302-1) // TODO: dynamic resolution
MCFG_SCREEN_UPDATE_DRIVER(cdi_state, screen_update_cdimono1)
MCFG_SCREEN_ADD("lcd", RASTER)
@@ -338,7 +844,62 @@ static MACHINE_CONFIG_START( cdi, cdi_state )
MCFG_CDI68070_ADD("scc68070")
MCFG_CDICDIC_ADD("cdic")
- MCFG_CDISLAVE_ADD("slave")
+ MCFG_CDISLAVE_ADD("slave_hle")
+
+ /* sound hardware */
+ MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
+
+ MCFG_SOUND_ADD( "dac1", DMADAC, 0 )
+ MCFG_SOUND_ROUTE( ALL_OUTPUTS, "lspeaker", 1.0 )
+
+ MCFG_SOUND_ADD( "dac2", DMADAC, 0 )
+ MCFG_SOUND_ROUTE( ALL_OUTPUTS, "rspeaker", 1.0 )
+
+ MCFG_SOUND_ADD( "cdda", CDDA, 0 )
+ MCFG_SOUND_ROUTE( ALL_OUTPUTS, "lspeaker", 1.0 )
+ MCFG_SOUND_ROUTE( ALL_OUTPUTS, "rspeaker", 1.0 )
+
+ MCFG_MK48T08_ADD( "mk48t08" )
+MACHINE_CONFIG_END
+
+// CD-i model 220 (Mono-II, NTSC)
+static MACHINE_CONFIG_START( cdimono2, cdi_state )
+ MCFG_CPU_ADD("maincpu", SCC68070, CLOCK_A/2)
+ MCFG_CPU_PROGRAM_MAP(cdimono2_mem)
+
+ MCFG_MCD212_ADD("mcd212")
+ MCFG_MCD212_SET_SCREEN("screen")
+
+ MCFG_SCREEN_ADD("screen", RASTER)
+ MCFG_SCREEN_REFRESH_RATE(60)
+ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
+ MCFG_SCREEN_SIZE(384, 302)
+ MCFG_SCREEN_VISIBLE_AREA(0, 384-1, 22, 302-1) // TODO: dynamic resolution
+ MCFG_SCREEN_UPDATE_DRIVER(cdi_state, screen_update_cdimono1)
+
+ MCFG_SCREEN_ADD("lcd", RASTER)
+ MCFG_SCREEN_REFRESH_RATE(60)
+ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
+ MCFG_SCREEN_SIZE(192, 22)
+ MCFG_SCREEN_VISIBLE_AREA(0, 192-1, 0, 22-1)
+ MCFG_SCREEN_UPDATE_DRIVER(cdi_state, screen_update_cdimono1_lcd)
+
+ MCFG_PALETTE_ADD("palette", 0x100)
+
+ MCFG_DEFAULT_LAYOUT(layout_cdi)
+
+ MCFG_MACHINE_RESET_OVERRIDE( cdi_state, cdimono2 )
+
+ MCFG_CDI68070_ADD("scc68070")
+ MCFG_CPU_ADD("servo", M68HC05EG, 2000000) /* Unknown clock speed, docs say 2MHz internal clock */
+ MCFG_CPU_PROGRAM_MAP(cdimono2_servo_mem)
+ MCFG_CPU_ADD("slave", M68HC05EG, 2000000) /* Unknown clock speed, docs say 2MHz internal clock */
+ MCFG_CPU_PROGRAM_MAP(cdimono2_slave_mem)
+
+ MCFG_CDROM_ADD( "cdrom" )
+ MCFG_CDROM_INTERFACE("cdi_cdrom")
+ MCFG_SOFTWARE_LIST_ADD("cd_list","cdi")
+ MCFG_SOFTWARE_LIST_FILTER("cd_list","!DVC")
/* sound hardware */
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
@@ -356,19 +917,71 @@ static MACHINE_CONFIG_START( cdi, cdi_state )
MCFG_MK48T08_ADD( "mk48t08" )
MACHINE_CONFIG_END
-// Standard CD-i system, with CD-ROM image device (MESS) and Software List (MESS)
-static MACHINE_CONFIG_DERIVED( cdi_base, cdi )
- MCFG_MACHINE_RESET_OVERRIDE(cdi_state, cdi )
+static MACHINE_CONFIG_START( cdi910, cdi_state )
+ MCFG_CPU_ADD("maincpu", SCC68070, CLOCK_A/2)
+ MCFG_CPU_PROGRAM_MAP(cdi910_mem)
+
+ MCFG_MCD212_ADD("mcd212")
+ MCFG_MCD212_SET_SCREEN("screen")
+
+ MCFG_SCREEN_ADD("screen", RASTER)
+ MCFG_SCREEN_REFRESH_RATE(60)
+ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
+ MCFG_SCREEN_SIZE(384, 302)
+ MCFG_SCREEN_VISIBLE_AREA(0, 384-1, 22, 302-1) // TODO: dynamic resolution
+ MCFG_SCREEN_UPDATE_DRIVER(cdi_state, screen_update_cdimono1)
+
+ MCFG_SCREEN_ADD("lcd", RASTER)
+ MCFG_SCREEN_REFRESH_RATE(60)
+ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
+ MCFG_SCREEN_SIZE(192, 22)
+ MCFG_SCREEN_VISIBLE_AREA(0, 192-1, 0, 22-1)
+ MCFG_SCREEN_UPDATE_DRIVER(cdi_state, screen_update_cdimono1_lcd)
+
+ MCFG_PALETTE_ADD("palette", 0x100)
+
+ MCFG_DEFAULT_LAYOUT(layout_cdi)
+
+ MCFG_MACHINE_RESET_OVERRIDE( cdi_state, cdimono2 )
+
+ MCFG_CDI68070_ADD("scc68070")
+ MCFG_CPU_ADD("servo", M68HC05EG, 2000000) /* Unknown clock speed, docs say 2MHz internal clock */
+ MCFG_CPU_PROGRAM_MAP(cdimono2_servo_mem)
+ MCFG_CPU_ADD("slave", M68HC05EG, 2000000) /* Unknown clock speed, docs say 2MHz internal clock */
+ MCFG_CPU_PROGRAM_MAP(cdimono2_slave_mem)
+
+ MCFG_CDROM_ADD( "cdrom" )
+ MCFG_CDROM_INTERFACE("cdi_cdrom")
+ MCFG_SOFTWARE_LIST_ADD("cd_list","cdi")
+ MCFG_SOFTWARE_LIST_FILTER("cd_list","!DVC")
+
+ /* sound hardware */
+ MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
+
+ MCFG_SOUND_ADD( "dac1", DMADAC, 0 )
+ MCFG_SOUND_ROUTE( ALL_OUTPUTS, "lspeaker", 1.0 )
+
+ MCFG_SOUND_ADD( "dac2", DMADAC, 0 )
+ MCFG_SOUND_ROUTE( ALL_OUTPUTS, "rspeaker", 1.0 )
+
+ MCFG_SOUND_ADD( "cdda", CDDA, 0 )
+ MCFG_SOUND_ROUTE( ALL_OUTPUTS, "lspeaker", 1.0 )
+ MCFG_SOUND_ROUTE( ALL_OUTPUTS, "rspeaker", 1.0 )
+
+ MCFG_MK48T08_ADD( "mk48t08" )
MACHINE_CONFIG_END
-static MACHINE_CONFIG_DERIVED( cdimono1, cdi_base )
+// CD-i Mono-I, with CD-ROM image device (MESS) and Software List (MESS)
+static MACHINE_CONFIG_DERIVED( cdimono1, cdimono1_base )
+ MCFG_MACHINE_RESET_OVERRIDE(cdi_state, cdimono1)
+
MCFG_CDROM_ADD( "cdrom" )
MCFG_CDROM_INTERFACE("cdi_cdrom")
MCFG_SOFTWARE_LIST_ADD("cd_list","cdi")
MCFG_SOFTWARE_LIST_FILTER("cd_list","!DVC")
MACHINE_CONFIG_END
-static MACHINE_CONFIG_DERIVED( quizard, cdi_base )
+static MACHINE_CONFIG_DERIVED( quizard, cdimono1_base )
MCFG_CPU_MODIFY("maincpu")
MCFG_CPU_PROGRAM_MAP(cdimono1_mem)
MCFG_CPU_VBLANK_INT_DRIVER("screen", cdi_state, mcu_frame)
@@ -422,17 +1035,13 @@ MACHINE_CONFIG_END
*************************/
ROM_START( cdimono1 )
- ROM_REGION(0x80000, "maincpu", 0)
+ ROM_REGION(0x80000, "maincpu", 0) // these roms need byteswapping
ROM_SYSTEM_BIOS( 0, "mcdi200", "Magnavox CD-i 200" )
ROMX_LOAD( "cdi200.rom", 0x000000, 0x80000, CRC(40c4e6b9) SHA1(d961de803c89b3d1902d656ceb9ce7c02dccb40a), ROM_BIOS(1) )
ROM_SYSTEM_BIOS( 1, "pcdi220", "Philips CD-i 220 F2" )
ROMX_LOAD( "cdi220b.rom", 0x000000, 0x80000, CRC(279683ca) SHA1(53360a1f21ddac952e95306ced64186a3fc0b93e), ROM_BIOS(2) )
- // This one is a Mono-IV board, needs to be a separate driver
- //ROM_SYSTEM_BIOS( 2, "pcdi490", "Philips CD-i 490" )
- //ROMX_LOAD( "cdi490.rom", 0x000000, 0x80000, CRC(e115f45b) SHA1(f71be031a5dfa837de225081b2ddc8dcb74a0552), ROM_BIOS(3) )
- // This one is a Mini-MMC board, needs to be a separate driver
- //ROM_SYSTEM_BIOS( 3, "pcdi910m", "Philips CD-i 910" )
- //ROMX_LOAD( "cdi910.rom", 0x000000, 0x80000, CRC(8ee44ed6) SHA1(3fcdfa96f862b0cb7603fb6c2af84cac59527b05), ROM_BIOS(4) )
+ ROM_SYSTEM_BIOS( 2, "pcdi220_alt", "Philips CD-i 220?" ) // doesn't boot
+ ROMX_LOAD( "cdi220.rom", 0x000000, 0x80000, CRC(584c0af8) SHA1(5d757ab46b8c8fc36361555d978d7af768342d47), ROM_BIOS(3) )
ROM_REGION(0x2000, "cdic", 0)
ROM_LOAD( "cdic.bin", 0x0000, 0x2000, NO_DUMP ) // Undumped 68HC05 microcontroller, might need decapping
@@ -442,18 +1051,58 @@ ROM_START( cdimono1 )
ROM_END
-ROM_START( cdibios )
+
+ROM_START( cdi910 )
+ ROM_REGION(0x80000, "maincpu", 0)
+ ROM_SYSTEM_BIOS( 0, "cdi910", "CD-I 910-17P Mini-MMC" )
+ ROMX_LOAD( "philips__cd-i_2.1__mb834200b-15__26b_aa__9224_z01.tc574200.7211", 0x000000, 0x80000, CRC(4ae3bee3) SHA1(9729b4ee3ce0c17172d062339c47b1ab822b222b), ROM_BIOS(1) | ROM_GROUPWORD | ROM_REVERSE )
+ ROM_SYSTEM_BIOS( 1, "cdi910_alt", "alt" )
+ ROMX_LOAD( "cdi910.rom", 0x000000, 0x80000, CRC(2f3048d2) SHA1(11c4c3e602060518b52e77156345fa01f619e793), ROM_BIOS(2) | ROM_GROUPWORD | ROM_REVERSE )
+
+ // cdic
+
+ ROM_REGION(0x2000, "servo", 0)
+ ROM_LOAD( "zx405037p__cdi_servo_2.1__b43t__llek9215.mc68hc705c8a_withtestrom.7201", 0x0000, 0x2000, CRC(7a3af407) SHA1(fdf8d78d6a0df4a56b5b963d72eabd39fcec163f) )
+
+ ROM_REGION(0x2000, "slave", 0)
+ ROM_LOAD( "zx405042p__cdi_slave_2.0__b43t__zzmk9213.mc68hc705c8a_withtestrom.7206", 0x0000, 0x2000, CRC(688cda63) SHA1(56d0acd7caad51c7de703247cd6d842b36173079) )
+
+ ROM_REGION(0x2000, "pals", 0)
+ ROM_LOAD( "ti_portugal_206xf__tibpal20l8-15cnt__m7205n.7205.bin", 0x0000, 0x144, CRC(dd167e0d) SHA1(2ba82a4619d7a0f19e62e02a2841afd4d45d56ba) )
+ ROM_LOAD( "ti_portugal_774_206xf__tibpal16l8-10cn_m7204n.7204.bin", 0x0000, 0x104, CRC(04e6bd37) SHA1(153d1a977291bedb7420484a9f889325dbd3628e) )
+ROM_END
+
+ROM_START( cdimono2 )
+ ROM_REGION(0x80000, "maincpu", 0)
+ ROM_LOAD16_WORD_SWAP( "philips__cdi-220_ph3_r1.2__mb834200b-15__02f_aa__9402_z04.tc574200-le._1.7211", 0x000000, 0x80000, CRC(17d723e7) SHA1(6c317a82e35d60ca5e7a74fc99f665055693169d) )
+
+ ROM_REGION(0x2000, "servo", 0)
+ ROM_LOAD( "zc405351p__servo_cdi_4.1__0d67p__lluk9404.mc68hc705c8a.7490", 0x0000, 0x2000, CRC(2bc8e4e9) SHA1(8cd052b532fc052d6b0077261c12f800e8655bb1) )
+
+ ROM_REGION(0x2000, "slave", 0)
+ ROM_LOAD( "zc405352p__slave_cdi_4.1__0d67p__lltr9403.mc68hc705c8a.7206", 0x0000, 0x2000, CRC(5b19da07) SHA1(cf02d84977050c71e87a38f1249e83c43a93949b) )
+ROM_END
+
+
+ROM_START( cdi490a )
+ ROM_REGION(0x80000, "maincpu", 0)
+ ROM_SYSTEM_BIOS( 0, "cdi490", "CD-i 490" )
+ ROMX_LOAD( "cdi490a.rom", 0x000000, 0x80000, CRC(e2f200f6) SHA1(c9bf3c4c7e4fe5cbec3fe3fc993c77a4522ca547), ROM_BIOS(1) | ROM_GROUPWORD | ROM_REVERSE )
+
+ ROM_REGION(0x40000, "mpegs", 0) // keep these somewhere
+ ROM_LOAD( "impega.rom", 0x0000, 0x40000, CRC(84d6f6aa) SHA1(02526482a0851ea2a7b582d8afaa8ef14a8bd914) )
+ ROM_LOAD( "vmpega.rom", 0x0000, 0x40000, CRC(db264e8b) SHA1(be407fbc102f1731a0862554855e963e5a47c17b) )
+ROM_END
+
+
+
+
+ROM_START( cdibios ) // for the quizard sets
ROM_REGION(0x80000, "maincpu", 0)
ROM_SYSTEM_BIOS( 0, "mcdi200", "Magnavox CD-i 200" )
ROMX_LOAD( "cdi200.rom", 0x000000, 0x80000, CRC(40c4e6b9) SHA1(d961de803c89b3d1902d656ceb9ce7c02dccb40a), ROM_BIOS(1) )
ROM_SYSTEM_BIOS( 1, "pcdi220", "Philips CD-i 220 F2" )
ROMX_LOAD( "cdi220b.rom", 0x000000, 0x80000, CRC(279683ca) SHA1(53360a1f21ddac952e95306ced64186a3fc0b93e), ROM_BIOS(2) )
- // This one is a Mono-IV board, needs to be a separate driver
- //ROM_SYSTEM_BIOS( 2, "pcdi490", "Philips CD-i 490" )
- //ROMX_LOAD( "cdi490.rom", 0x000000, 0x80000, CRC(e115f45b) SHA1(f71be031a5dfa837de225081b2ddc8dcb74a0552), ROM_BIOS(3) )
- // This one is a Mini-MMC board, needs to be a separate driver
- //ROM_SYSTEM_BIOS( 3, "pcdi910m", "Philips CD-i 910" )
- //ROMX_LOAD( "cdi910.rom", 0x000000, 0x80000, CRC(8ee44ed6) SHA1(3fcdfa96f862b0cb7603fb6c2af84cac59527b05), ROM_BIOS(4) )
ROM_REGION(0x2000, "cdic", 0)
ROM_LOAD( "cdic.bin", 0x0000, 0x2000, NO_DUMP ) // Undumped 68HC05 microcontroller, might need decapping
@@ -632,12 +1281,17 @@ ROM_END
* Game driver(s) *
*************************/
+/* YEAR NAME PARENT COMPAT MACHINE INPUT DEVICE INIT COMPANY FULLNAME */
+
// BIOS / System
CONS( 1991, cdimono1, 0, 0, cdimono1, cdi, driver_device, 0, "Philips", "CD-i (Mono-I) (PAL)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
+CONS( 1991, cdimono2, 0, 0, cdimono2, cdimono2, driver_device, 0, "Philips", "CD-i (Mono-II) (NTSC)", MACHINE_NOT_WORKING )
+CONS( 1991, cdi910, 0, 0, cdi910, cdimono2, driver_device, 0, "Philips", "CD-i 910-17P Mini-MMC (PAL)", MACHINE_NOT_WORKING )
+CONS( 1991, cdi490a, 0, 0, cdimono1, cdi, driver_device, 0, "Philips", "CD-i 490", MACHINE_NOT_WORKING )
// The Quizard games are RETAIL CD-i units, with additional JAMMA adapters & dongles for protection, hence being 'clones' of the system.
-GAME( 1995, cdibios, 0, cdi_base, quizard, driver_device, 0, ROT0, "Philips", "CD-i Bios", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IS_BIOS_ROOT )
+GAME( 1995, cdibios, 0, cdimono1_base, quizard, driver_device, 0, ROT0, "Philips", "CD-i (Mono-I) (PAL) BIOS", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IS_BIOS_ROOT )
GAME( 1995, quizard, cdibios, quizard18, quizard, driver_device, 0, ROT0, "TAB Austria", "Quizard (v1.8)", MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION )
GAME( 1995, quizard_17, quizard, quizard17, quizard, driver_device, 0, ROT0, "TAB Austria", "Quizard (v1.7)", MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION )
diff --git a/src/mame/drivers/centiped.cpp b/src/mame/drivers/centiped.cpp
index e69467346a9..9f8b5a21fcc 100644
--- a/src/mame/drivers/centiped.cpp
+++ b/src/mame/drivers/centiped.cpp
@@ -617,7 +617,7 @@ READ8_MEMBER(centiped_state::bullsdrt_data_port_r)
WRITE8_MEMBER(centiped_state::led_w)
{
- set_led_status(machine(), offset, ~data & 0x80);
+ output().set_led_value(offset, ~data & 0x80);
}
@@ -629,13 +629,13 @@ READ8_MEMBER(centiped_state::caterplr_unknown_r)
WRITE8_MEMBER(centiped_state::coin_count_w)
{
- coin_counter_w(machine(), offset, data);
+ machine().bookkeeping().coin_counter_w(offset, data);
}
WRITE8_MEMBER(centiped_state::bullsdrt_coin_count_w)
{
- coin_counter_w(machine(), 0, data);
+ machine().bookkeeping().coin_counter_w(0, data);
}
diff --git a/src/mame/drivers/cesclass.cpp b/src/mame/drivers/cesclass.cpp
index 53a53b1882a..28f85f089e3 100644
--- a/src/mame/drivers/cesclass.cpp
+++ b/src/mame/drivers/cesclass.cpp
@@ -115,7 +115,7 @@ WRITE16_MEMBER( cesclassic_state::outputs_w )
---- --x- coin counter
*/
m_oki->set_bank_base((data & 0x40) ? 0x40000 : 0);
- coin_counter_w(machine(), 0, data & 2);
+ machine().bookkeeping().coin_counter_w(0, data & 2);
if(data & ~0x62)
logerror("Output: %02x\n",data);
}
diff --git a/src/mame/drivers/cham24.cpp b/src/mame/drivers/cham24.cpp
index 15a0758538e..0fc42e73776 100644
--- a/src/mame/drivers/cham24.cpp
+++ b/src/mame/drivers/cham24.cpp
@@ -72,7 +72,7 @@ public:
required_device<cpu_device> m_maincpu;
required_device<ppu2c0x_device> m_ppu;
- UINT8* m_nt_ram;
+ std::unique_ptr<UINT8[]> m_nt_ram;
UINT8* m_nt_page[4];
UINT32 m_in_0;
UINT32 m_in_1;
@@ -102,29 +102,29 @@ void cham24_state::cham24_set_mirroring( int mirroring )
switch(mirroring)
{
case PPU_MIRROR_LOW:
- m_nt_page[0] = m_nt_page[1] = m_nt_page[2] = m_nt_page[3] = m_nt_ram;
+ m_nt_page[0] = m_nt_page[1] = m_nt_page[2] = m_nt_page[3] = m_nt_ram.get();
break;
case PPU_MIRROR_HIGH:
- m_nt_page[0] = m_nt_page[1] = m_nt_page[2] = m_nt_page[3] = m_nt_ram + 0x400;
+ m_nt_page[0] = m_nt_page[1] = m_nt_page[2] = m_nt_page[3] = m_nt_ram.get() + 0x400;
break;
case PPU_MIRROR_HORZ:
- m_nt_page[0] = m_nt_ram;
- m_nt_page[1] = m_nt_ram;
- m_nt_page[2] = m_nt_ram + 0x400;
- m_nt_page[3] = m_nt_ram + 0x400;
+ m_nt_page[0] = m_nt_ram.get();
+ m_nt_page[1] = m_nt_ram.get();
+ m_nt_page[2] = m_nt_ram.get() + 0x400;
+ m_nt_page[3] = m_nt_ram.get() + 0x400;
break;
case PPU_MIRROR_VERT:
- m_nt_page[0] = m_nt_ram;
- m_nt_page[1] = m_nt_ram + 0x400;
- m_nt_page[2] = m_nt_ram;
- m_nt_page[3] = m_nt_ram + 0x400;
+ m_nt_page[0] = m_nt_ram.get();
+ m_nt_page[1] = m_nt_ram.get() + 0x400;
+ m_nt_page[2] = m_nt_ram.get();
+ m_nt_page[3] = m_nt_ram.get() + 0x400;
break;
case PPU_MIRROR_NONE:
default:
- m_nt_page[0] = m_nt_ram;
- m_nt_page[1] = m_nt_ram + 0x400;
- m_nt_page[2] = m_nt_ram + 0x800;
- m_nt_page[3] = m_nt_ram + 0xc00;
+ m_nt_page[0] = m_nt_ram.get();
+ m_nt_page[1] = m_nt_ram.get() + 0x400;
+ m_nt_page[2] = m_nt_ram.get() + 0x800;
+ m_nt_page[3] = m_nt_ram.get() + 0xc00;
break;
}
}
@@ -289,11 +289,11 @@ void cham24_state::machine_start()
membank("bank1")->set_base(memregion("gfx1")->base());
/* need nametable ram, though. I doubt this uses more than 2k, but it starts up configured for 4 */
- m_nt_ram = auto_alloc_array(machine(), UINT8, 0x1000);
- m_nt_page[0] = m_nt_ram;
- m_nt_page[1] = m_nt_ram + 0x400;
- m_nt_page[2] = m_nt_ram + 0x800;
- m_nt_page[3] = m_nt_ram + 0xc00;
+ m_nt_ram = std::make_unique<UINT8[]>(0x1000);
+ m_nt_page[0] = m_nt_ram.get();
+ m_nt_page[1] = m_nt_ram.get() + 0x400;
+ m_nt_page[2] = m_nt_ram.get() + 0x800;
+ m_nt_page[3] = m_nt_ram.get() + 0xc00;
/* and read/write handlers */
m_ppu->space(AS_PROGRAM).install_readwrite_handler(0x2000, 0x3eff,read8_delegate(FUNC(cham24_state::nt_r), this), write8_delegate(FUNC(cham24_state::nt_w), this));
diff --git a/src/mame/drivers/champbwl.cpp b/src/mame/drivers/champbwl.cpp
index 709cd463600..745870f02bc 100644
--- a/src/mame/drivers/champbwl.cpp
+++ b/src/mame/drivers/champbwl.cpp
@@ -218,11 +218,11 @@ READ8_MEMBER(champbwl_state::trackball_r)
WRITE8_MEMBER(champbwl_state::champbwl_misc_w)
{
- coin_counter_w(machine(), 0, data & 1);
- coin_counter_w(machine(), 1, data & 2);
+ machine().bookkeeping().coin_counter_w(0, data & 1);
+ machine().bookkeeping().coin_counter_w(1, data & 2);
- coin_lockout_w(machine(), 0, ~data & 8);
- coin_lockout_w(machine(), 1, ~data & 4);
+ machine().bookkeeping().coin_lockout_w(0, ~data & 8);
+ machine().bookkeeping().coin_lockout_w(1, ~data & 4);
membank("bank1")->set_entry((data & 0x30) >> 4);
}
@@ -255,10 +255,10 @@ ADDRESS_MAP_END
WRITE8_MEMBER(champbwl_state::doraemon_outputs_w)
{
- coin_counter_w(machine(), 0, data & 1); // coin in counter
- coin_counter_w(machine(), 1, data & 2); // gift out counter
+ machine().bookkeeping().coin_counter_w(0, data & 1); // coin in counter
+ machine().bookkeeping().coin_counter_w(1, data & 2); // gift out counter
- coin_lockout_w(machine(), 0, ~data & 8); // coin lockout
+ machine().bookkeeping().coin_lockout_w(0, ~data & 8); // coin lockout
machine().device<ticket_dispenser_device>("hopper")->write(space, 0, (data & 0x04) ? 0x00 : 0x80); // gift out motor
membank("bank1")->set_entry((data & 0x30) >> 4);
diff --git a/src/mame/drivers/chance32.cpp b/src/mame/drivers/chance32.cpp
index 7c49c0125ec..b7831f8f159 100644
--- a/src/mame/drivers/chance32.cpp
+++ b/src/mame/drivers/chance32.cpp
@@ -168,13 +168,13 @@ WRITE8_MEMBER(chance32_state::muxout_w)
if (data & 1) // bit 0 is the mux selector.
{
- output_set_lamp_value(0, (data >> 1) & 1); /* Lamp 0 - Small / Big */
- output_set_lamp_value(1, (data >> 2) & 1); /* Lamp 1 - Big / Small */
- output_set_lamp_value(2, (data >> 3) & 1); /* Lamp 2 - Hold 5 */
- output_set_lamp_value(3, (data >> 4) & 1); /* Lamp 3 - Hold 4 */
- output_set_lamp_value(4, (data >> 5) & 1); /* Lamp 4 - Hold 3 */
- output_set_lamp_value(5, (data >> 6) & 1); /* Lamp 5 - Hold 2 */
- output_set_lamp_value(6, (data >> 7) & 1); /* Lamp 6 - Hold 1 */
+ output().set_lamp_value(0, (data >> 1) & 1); /* Lamp 0 - Small / Big */
+ output().set_lamp_value(1, (data >> 2) & 1); /* Lamp 1 - Big / Small */
+ output().set_lamp_value(2, (data >> 3) & 1); /* Lamp 2 - Hold 5 */
+ output().set_lamp_value(3, (data >> 4) & 1); /* Lamp 3 - Hold 4 */
+ output().set_lamp_value(4, (data >> 5) & 1); /* Lamp 4 - Hold 3 */
+ output().set_lamp_value(5, (data >> 6) & 1); /* Lamp 5 - Hold 2 */
+ output().set_lamp_value(6, (data >> 7) & 1); /* Lamp 6 - Hold 1 */
logerror("Lamps A: %02x\n", data);
}
@@ -182,12 +182,12 @@ WRITE8_MEMBER(chance32_state::muxout_w)
else
{
// bit 1 is unknown...
- output_set_lamp_value(7, (data >> 2) & 1); /* Lamp 7 - Fever! */
- output_set_lamp_value(8, (data >> 3) & 1); /* Lamp 8 - Cancel */
- output_set_lamp_value(9, (data >> 4) & 1); /* Lamp 9 - D-Up / Take */
- output_set_lamp_value(10, (data >> 5) & 1); /* Lamp 10 - Take / D-Up */
- output_set_lamp_value(11, (data >> 6) & 1); /* Lamp 11 - Deal */
- output_set_lamp_value(12, (data >> 7) & 1); /* Lamp 12 - Bet */
+ output().set_lamp_value(7, (data >> 2) & 1); /* Lamp 7 - Fever! */
+ output().set_lamp_value(8, (data >> 3) & 1); /* Lamp 8 - Cancel */
+ output().set_lamp_value(9, (data >> 4) & 1); /* Lamp 9 - D-Up / Take */
+ output().set_lamp_value(10, (data >> 5) & 1); /* Lamp 10 - Take / D-Up */
+ output().set_lamp_value(11, (data >> 6) & 1); /* Lamp 11 - Deal */
+ output().set_lamp_value(12, (data >> 7) & 1); /* Lamp 12 - Bet */
logerror("Lamps B: %02x\n", data);
}
diff --git a/src/mame/drivers/changela.cpp b/src/mame/drivers/changela.cpp
index 4c9cb8909ca..377c9ff0e10 100644
--- a/src/mame/drivers/changela.cpp
+++ b/src/mame/drivers/changela.cpp
@@ -1,4 +1,4 @@
-// license:???
+// license:GPL-2.0+
// copyright-holders:Jarek Burczynski, Phil Stroffolino, Tomasz Slanina
/**************************************************************************
Change Lanes
@@ -198,7 +198,7 @@ WRITE8_MEMBER(changela_state::changela_collision_reset_1)
WRITE8_MEMBER(changela_state::changela_coin_counter_w)
{
- coin_counter_w(machine(), offset, data);
+ machine().bookkeeping().coin_counter_w(offset, data);
}
diff --git a/src/mame/drivers/chaos.cpp b/src/mame/drivers/chaos.cpp
index 01245e83d7f..b03531bc362 100644
--- a/src/mame/drivers/chaos.cpp
+++ b/src/mame/drivers/chaos.cpp
@@ -50,7 +50,6 @@ public:
DECLARE_WRITE8_MEMBER(port1f_w);
DECLARE_READ8_MEMBER(port90_r);
DECLARE_READ8_MEMBER(port91_r);
- DECLARE_WRITE8_MEMBER(port92_w);
DECLARE_WRITE8_MEMBER(kbd_put);
UINT8 m_term_data;
virtual void machine_reset() override;
diff --git a/src/mame/drivers/chessmst.cpp b/src/mame/drivers/chessmst.cpp
index bb844e64b12..e92d94056dc 100644
--- a/src/mame/drivers/chessmst.cpp
+++ b/src/mame/drivers/chessmst.cpp
@@ -170,25 +170,25 @@ WRITE8_MEMBER( chessmst_state::pio1_port_a_w )
for (int row=1; row<=8; row++)
{
if (m_led_sel & 0x01)
- output_set_indexed_value("led_a", row, BIT(data, 8-row));
+ output().set_indexed_value("led_a", row, BIT(data, 8-row));
if (m_led_sel & 0x02)
- output_set_indexed_value("led_b", row, BIT(data, 8-row));
+ output().set_indexed_value("led_b", row, BIT(data, 8-row));
if (m_led_sel & 0x04)
- output_set_indexed_value("led_c", row, BIT(data, 8-row));
+ output().set_indexed_value("led_c", row, BIT(data, 8-row));
if (m_led_sel & 0x08)
- output_set_indexed_value("led_d", row, BIT(data, 8-row));
+ output().set_indexed_value("led_d", row, BIT(data, 8-row));
if (m_led_sel & 0x10)
- output_set_indexed_value("led_e", row, BIT(data, 8-row));
+ output().set_indexed_value("led_e", row, BIT(data, 8-row));
if (m_led_sel & 0x20)
- output_set_indexed_value("led_f", row, BIT(data, 8-row));
+ output().set_indexed_value("led_f", row, BIT(data, 8-row));
if (m_led_sel & 0x40)
- output_set_indexed_value("led_g", row, BIT(data, 8-row));
+ output().set_indexed_value("led_g", row, BIT(data, 8-row));
if (m_led_sel & 0x80)
- output_set_indexed_value("led_h", row, BIT(data, 8-row));
+ output().set_indexed_value("led_h", row, BIT(data, 8-row));
if (m_led_sel & 0x100)
- output_set_indexed_value("led_i", row, BIT(data, 8-row));
+ output().set_indexed_value("led_i", row, BIT(data, 8-row));
if (m_led_sel & 0x200)
- output_set_indexed_value("led_j", row, BIT(data, 8-row));
+ output().set_indexed_value("led_j", row, BIT(data, 8-row));
}
m_led_sel = 0;
diff --git a/src/mame/drivers/chesstrv.cpp b/src/mame/drivers/chesstrv.cpp
index 3fb8de7a40d..e34954a6af0 100644
--- a/src/mame/drivers/chesstrv.cpp
+++ b/src/mame/drivers/chesstrv.cpp
@@ -66,13 +66,13 @@ WRITE8_MEMBER( chesstrv_state::display_w )
UINT8 seg_data = BITSWAP8(data,0,1,2,3,4,5,6,7);
if(!(m_matrix & 0x01))
- output_set_digit_value( 3, seg_data );
+ output().set_digit_value( 3, seg_data );
if(!(m_matrix & 0x02))
- output_set_digit_value( 2, seg_data );
+ output().set_digit_value( 2, seg_data );
if(!(m_matrix & 0x04))
- output_set_digit_value( 1, seg_data );
+ output().set_digit_value( 1, seg_data );
if(!(m_matrix & 0x08))
- output_set_digit_value( 0, seg_data );
+ output().set_digit_value( 0, seg_data );
}
WRITE8_MEMBER( chesstrv_state::matrix_w )
@@ -98,7 +98,7 @@ READ8_MEMBER( chesstrv_state::keypad_r )
WRITE8_MEMBER( chesstrv_state::diplomat_display_w )
{
- output_set_digit_value( m_matrix & 7, data ^ 0xff );
+ output().set_digit_value( m_matrix & 7, data ^ 0xff );
}
READ8_MEMBER( chesstrv_state::diplomat_keypad_r )
diff --git a/src/mame/drivers/chexx.cpp b/src/mame/drivers/chexx.cpp
index 2f9a85abe7b..f32da626237 100644
--- a/src/mame/drivers/chexx.cpp
+++ b/src/mame/drivers/chexx.cpp
@@ -107,7 +107,7 @@ WRITE8_MEMBER(chexx_state::via_b_out)
digitalker_set_bank(data & 3);
m_digitalker->set_output_gain(0, BIT(data,2) ? 1.0f : 0.0f); // bit 2 controls the Digitalker output
- coin_counter_w(machine(), 0, BIT(~data,3));
+ machine().bookkeeping().coin_counter_w(0, BIT(~data,3));
// bit 4 is EJECT
// bit 7 is related to speaker out
@@ -133,16 +133,16 @@ WRITE_LINE_MEMBER(chexx_state::via_cb2_out)
// 7segs (score)
static const UINT8 patterns[16] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7c, 0x07, 0x7f, 0x67, 0, 0, 0, 0, 0, 0 }; // 4511
- output_set_digit_value(0, patterns[(m_shift >> (16+4)) & 0xf]);
- output_set_digit_value(1, patterns[(m_shift >> (16+0)) & 0xf]);
+ output().set_digit_value(0, patterns[(m_shift >> (16+4)) & 0xf]);
+ output().set_digit_value(1, patterns[(m_shift >> (16+0)) & 0xf]);
- output_set_digit_value(2, patterns[(m_shift >> (8+4)) & 0xf]);
- output_set_digit_value(3, patterns[(m_shift >> (8+0)) & 0xf]);
+ output().set_digit_value(2, patterns[(m_shift >> (8+4)) & 0xf]);
+ output().set_digit_value(3, patterns[(m_shift >> (8+0)) & 0xf]);
// Leds (period being played)
- output_set_led_value(0, BIT(m_shift,2));
- output_set_led_value(1, BIT(m_shift,1));
- output_set_led_value(2, BIT(m_shift,0));
+ output().set_led_value(0, BIT(m_shift,2));
+ output().set_led_value(1, BIT(m_shift,1));
+ output().set_led_value(2, BIT(m_shift,0));
// logerror("%s: VIA write CB2 = %02X\n", machine().describe_context(), state);
}
@@ -178,8 +178,8 @@ ADDRESS_MAP_END
WRITE8_MEMBER(chexx_state::lamp_w)
{
m_lamp = data;
- output_set_lamp_value(0, BIT(m_lamp,0));
- output_set_lamp_value(1, BIT(m_lamp,1));
+ output().set_lamp_value(0, BIT(m_lamp,0));
+ output().set_lamp_value(1, BIT(m_lamp,1));
}
WRITE8_MEMBER(chexx_state::ay_w)
diff --git a/src/mame/drivers/chihiro.cpp b/src/mame/drivers/chihiro.cpp
index 624c58b7b95..366ef73c704 100644
--- a/src/mame/drivers/chihiro.cpp
+++ b/src/mame/drivers/chihiro.cpp
@@ -61,6 +61,7 @@ Games on this system include....
|*| 2005 | Sangokushi Taisen | Sega | DVDROM | CDV-10022 | |
|*| 2006 | Sangokushi Taisen 2 Firmware Update | Sega | DVDROM | CDV-10023 | |
|*| 2006 | Sangokushi Taisen 2 | Sega | DVDROM | CDV-10029 | |
+|*| 2007 | Mobile Suit Gundam 0083 Card Builder | Dimps - Banpresto | DVDROM | CDV-10030 | |
|*| 2008 | Sangokushi Taisen 3 | Sega | DVDROM | CDV-10036 | |
|*| 2008 | Sangokushi Taisen 3 (Ver.J) | Sega | DVDROM | CDV-10036J | |
|*| 2008 | Sangokushi Taisen 3 War Begins (Ver.3.59) | Sega | DVDROM | CDV-10041 | |
@@ -364,14 +365,11 @@ Thanks to Alex, Mr Mudkips, and Philip Burke for this info.
#include "emu.h"
#include "cpu/i386/i386.h"
-#include "machine/lpci.h"
#include "machine/pic8259.h"
-#include "machine/pit8253.h"
#include "machine/idectrl.h"
#include "machine/idehd.h"
#include "machine/naomigd.h"
#include "video/poly.h"
-#include "bitmap.h"
#include "debug/debugcon.h"
#include "debug/debugcmd.h"
#include "debug/debugcpu.h"
diff --git a/src/mame/drivers/chinsan.cpp b/src/mame/drivers/chinsan.cpp
index c0f51e3cea8..49d8e3e4adf 100644
--- a/src/mame/drivers/chinsan.cpp
+++ b/src/mame/drivers/chinsan.cpp
@@ -87,7 +87,7 @@ public:
required_device<msm5205_device> m_adpcm;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
- UINT8 *m_decrypted_opcodes;
+ std::unique_ptr<UINT8[]> m_decrypted_opcodes;
};
@@ -572,8 +572,8 @@ WRITE_LINE_MEMBER(chinsan_state::chin_adpcm_int)
void chinsan_state::machine_start()
{
membank("bank1")->configure_entries(0, 4, memregion("maincpu")->base() + 0x8000, 0x4000);
- membank("bank0d")->set_base(m_decrypted_opcodes);
- membank("bank1d")->configure_entries(0, 4, m_decrypted_opcodes + 0x8000, 0x4000);
+ membank("bank0d")->set_base(m_decrypted_opcodes.get());
+ membank("bank1d")->configure_entries(0, 4, m_decrypted_opcodes.get() + 0x8000, 0x4000);
save_item(NAME(m_adpcm_idle));
save_item(NAME(m_port_select));
@@ -677,8 +677,8 @@ ROM_END
DRIVER_INIT_MEMBER(chinsan_state,chinsan)
{
- m_decrypted_opcodes = auto_alloc_array(machine(), UINT8, 0x18000);
- mc8123_decode(memregion("maincpu")->base(), m_decrypted_opcodes, memregion("user1")->base(), 0x18000);
+ m_decrypted_opcodes = std::make_unique<UINT8[]>(0x18000);
+ mc8123_decode(memregion("maincpu")->base(), m_decrypted_opcodes.get(), memregion("user1")->base(), 0x18000);
}
diff --git a/src/mame/drivers/chqflag.cpp b/src/mame/drivers/chqflag.cpp
index 20dd8ac7958..052e2916a2a 100644
--- a/src/mame/drivers/chqflag.cpp
+++ b/src/mame/drivers/chqflag.cpp
@@ -56,8 +56,8 @@ WRITE8_MEMBER(chqflag_state::chqflag_bankswitch_w)
WRITE8_MEMBER(chqflag_state::chqflag_vreg_w)
{
/* bits 0 & 1 = coin counters */
- coin_counter_w(machine(), 1, data & 0x01);
- coin_counter_w(machine(), 0, data & 0x02);
+ machine().bookkeeping().coin_counter_w(1, data & 0x01);
+ machine().bookkeeping().coin_counter_w(0, data & 0x02);
/* bit 4 = enable rom reading through K051316 #1 & #2 */
m_k051316_readroms = (data & 0x10);
diff --git a/src/mame/drivers/chsuper.cpp b/src/mame/drivers/chsuper.cpp
index 91391054baf..226cf66514d 100644
--- a/src/mame/drivers/chsuper.cpp
+++ b/src/mame/drivers/chsuper.cpp
@@ -42,7 +42,7 @@ public:
int m_tilexor;
UINT8 m_blacklamp;
UINT8 m_redlamp;
- UINT8 *m_vram;
+ std::unique_ptr<UINT8[]> m_vram;
required_device<z180_device> m_maincpu;
required_device<gfxdecode_device> m_gfxdecode;
@@ -65,7 +65,7 @@ public:
void chsuper_state::video_start()
{
- m_vram = auto_alloc_array_clear(machine(), UINT8, 1 << 14);
+ m_vram = make_unique_clear<UINT8[]>(1 << 14);
}
UINT32 chsuper_state::screen_update( screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect )
@@ -137,12 +137,12 @@ WRITE8_MEMBER( chsuper_state::chsuper_vram_w )
WRITE8_MEMBER( chsuper_state::chsuper_outporta_w ) // Port EEh
{
- coin_counter_w(machine(), 0, data & 0x01); // Coin counter
- output_set_lamp_value(0, (data >> 1) & 1); // Hold 1 / Black (Nero) lamp.
- coin_counter_w(machine(), 1, data & 0x04); // Payout / Ticket Out pulse
- output_set_lamp_value(1, (data >> 3) & 1); // Hold 2 / Low (Bassa) lamp.
+ machine().bookkeeping().coin_counter_w(0, data & 0x01); // Coin counter
+ output().set_lamp_value(0, (data >> 1) & 1); // Hold 1 / Black (Nero) lamp.
+ machine().bookkeeping().coin_counter_w(1, data & 0x04); // Payout / Ticket Out pulse
+ output().set_lamp_value(1, (data >> 3) & 1); // Hold 2 / Low (Bassa) lamp.
// D4: unused...
- output_set_lamp_value(5, (data >> 5) & 1); // BET lamp
+ output().set_lamp_value(5, (data >> 5) & 1); // BET lamp
// D6: ticket motor...
// D7: unused...
@@ -153,11 +153,11 @@ WRITE8_MEMBER( chsuper_state::chsuper_outporta_w ) // Port EEh
if ((m_blacklamp == 1) & (m_redlamp == 1)) // if both are ON...
{
- output_set_lamp_value(2, 1); // HOLD 3 ON
+ output().set_lamp_value(2, 1); // HOLD 3 ON
}
else
{
- output_set_lamp_value(2, 0); // otherwise HOLD 3 OFF
+ output().set_lamp_value(2, 0); // otherwise HOLD 3 OFF
}
}
@@ -165,11 +165,11 @@ WRITE8_MEMBER( chsuper_state::chsuper_outportb_w ) // Port EFh
{
// D0: unknown...
// D1: unused...
- output_set_lamp_value(3, (data >> 2) & 1); // Hold 4 / High (Alta) lamp.
+ output().set_lamp_value(3, (data >> 2) & 1); // Hold 4 / High (Alta) lamp.
// D3: unused...
// D4: unused...
- output_set_lamp_value(4, (data >> 5) & 1); // Hold 5 / Red (Rosso) / Gamble (Raddoppio) lamp.
- output_set_lamp_value(6, (data >> 6) & 1); // Start / Gamble (Raddoppio) lamp.
+ output().set_lamp_value(4, (data >> 5) & 1); // Hold 5 / Red (Rosso) / Gamble (Raddoppio) lamp.
+ output().set_lamp_value(6, (data >> 6) & 1); // Start / Gamble (Raddoppio) lamp.
// D7: unused...
/* Workaround to get the HOLD 3 lamp line active,
@@ -179,11 +179,11 @@ WRITE8_MEMBER( chsuper_state::chsuper_outportb_w ) // Port EFh
if ((m_blacklamp == 1) & (m_redlamp == 1)) // if both are ON...
{
- output_set_lamp_value(2, 1); // Hold 3 ON
+ output().set_lamp_value(2, 1); // Hold 3 ON
}
else
{
- output_set_lamp_value(2, 0); // Hold 3 OFF
+ output().set_lamp_value(2, 0); // Hold 3 OFF
}
}
@@ -399,13 +399,13 @@ ROM_END
DRIVER_INIT_MEMBER(chsuper_state,chsuper2)
{
- UINT8 *buffer;
+ std::unique_ptr<UINT8[]> buffer;
UINT8 *rom = memregion("gfx1")->base();
int i;
m_tilexor = 0x7f00;
- buffer = auto_alloc_array(machine(), UINT8, 0x100000);
+ buffer = std::make_unique<UINT8[]>(0x100000);
for (i=0;i<0x100000;i++)
{
@@ -416,18 +416,18 @@ DRIVER_INIT_MEMBER(chsuper_state,chsuper2)
buffer[j] = rom[i];
}
- memcpy(rom,buffer,0x100000);
+ memcpy(rom,buffer.get(),0x100000);
}
DRIVER_INIT_MEMBER(chsuper_state,chsuper3)
{
- UINT8 *buffer;
+ std::unique_ptr<UINT8[]> buffer;
UINT8 *rom = memregion("gfx1")->base();
int i;
m_tilexor = 0x0e00;
- buffer = auto_alloc_array(machine(), UINT8, 0x100000);
+ buffer = std::make_unique<UINT8[]>(0x100000);
for (i=0;i<0x100000;i++)
{
@@ -438,18 +438,18 @@ DRIVER_INIT_MEMBER(chsuper_state,chsuper3)
buffer[j] = rom[i];
}
- memcpy(rom,buffer,0x100000);
+ memcpy(rom,buffer.get(),0x100000);
}
DRIVER_INIT_MEMBER(chsuper_state,chmpnum)
{
- UINT8 *buffer;
+ std::unique_ptr<UINT8[]> buffer;
UINT8 *rom = memregion("gfx1")->base();
int i;
m_tilexor = 0x1800;
- buffer = auto_alloc_array(machine(), UINT8, 0x100000);
+ buffer = std::make_unique<UINT8[]>(0x100000);
for (i=0;i<0x100000;i++)
{
@@ -464,7 +464,7 @@ DRIVER_INIT_MEMBER(chsuper_state,chmpnum)
buffer[j] = rom[i];
}
- memcpy(rom,buffer,0x100000);
+ memcpy(rom,buffer.get(),0x100000);
}
diff --git a/src/mame/drivers/cidelsa.cpp b/src/mame/drivers/cidelsa.cpp
index 7417b063e17..6d2d91c21b1 100644
--- a/src/mame/drivers/cidelsa.cpp
+++ b/src/mame/drivers/cidelsa.cpp
@@ -113,9 +113,9 @@ WRITE8_MEMBER( cidelsa_state::altair_out1_w )
7 CONT. M1
*/
- set_led_status(machine(), 0, data & 0x08); // 1P
- set_led_status(machine(), 1, data & 0x10); // 2P
- set_led_status(machine(), 2, data & 0x20); // FIRE
+ output().set_led_value(0, data & 0x08); // 1P
+ output().set_led_value(1, data & 0x10); // 2P
+ output().set_led_value(2, data & 0x20); // FIRE
}
WRITE8_MEMBER( draco_state::out1_w )
diff --git a/src/mame/drivers/circusc.cpp b/src/mame/drivers/circusc.cpp
index 64a19ac1392..f0955c0f396 100644
--- a/src/mame/drivers/circusc.cpp
+++ b/src/mame/drivers/circusc.cpp
@@ -97,7 +97,7 @@ WRITE8_MEMBER(circusc_state::circusc_sh_irqtrigger_w)
WRITE8_MEMBER(circusc_state::circusc_coin_counter_w)
{
- coin_counter_w(machine(), offset, data);
+ machine().bookkeeping().coin_counter_w(offset, data);
}
WRITE8_MEMBER(circusc_state::circusc_sound_w)
diff --git a/src/mame/drivers/cischeat.cpp b/src/mame/drivers/cischeat.cpp
index cc74b05727f..6c8426c16ba 100644
--- a/src/mame/drivers/cischeat.cpp
+++ b/src/mame/drivers/cischeat.cpp
@@ -178,6 +178,7 @@ Cisco Heat.
#include "cischeat.lh"
#include "f1gpstar.lh"
+#include "captflag.lh"
/**************************************************************************
@@ -383,15 +384,15 @@ WRITE16_MEMBER(cischeat_state::scudhamm_leds_w)
{
if (ACCESSING_BITS_8_15)
{
- set_led_status(machine(), 0, data & 0x0100); // 3 buttons
- set_led_status(machine(), 1, data & 0x0200);
- set_led_status(machine(), 2, data & 0x0400);
+ output().set_led_value(0, data & 0x0100); // 3 buttons
+ output().set_led_value(1, data & 0x0200);
+ output().set_led_value(2, data & 0x0400);
}
if (ACCESSING_BITS_0_7)
{
-// set_led_status(machine(), 3, data & 0x0010); // if we had more leds..
-// set_led_status(machine(), 4, data & 0x0020);
+// output().set_led_value(3, data & 0x0010); // if we had more leds..
+// output().set_led_value(4, data & 0x0020);
}
}
@@ -482,16 +483,16 @@ WRITE16_MEMBER(cischeat_state::armchmp2_leds_w)
{
if (ACCESSING_BITS_8_15)
{
- set_led_status(machine(), 0, data & 0x0100);
- set_led_status(machine(), 1, data & 0x1000);
- set_led_status(machine(), 2, data & 0x2000);
- set_led_status(machine(), 3, data & 0x4000);
+ output().set_led_value(0, data & 0x0100);
+ output().set_led_value(1, data & 0x1000);
+ output().set_led_value(2, data & 0x2000);
+ output().set_led_value(3, data & 0x4000);
}
if (ACCESSING_BITS_0_7)
{
- coin_counter_w(machine(), 0, data & 0x0040);
- coin_counter_w(machine(), 1, data & 0x0080);
+ machine().bookkeeping().coin_counter_w(0, data & 0x0040);
+ machine().bookkeeping().coin_counter_w(1, data & 0x0080);
}
}
@@ -513,6 +514,160 @@ ADDRESS_MAP_END
/**************************************************************************
+ Captain Flag
+**************************************************************************/
+
+#define RIGHT 0
+#define LEFT 1
+
+WRITE16_MEMBER(cischeat_state::captflag_leds_w)
+{
+ COMBINE_DATA( &m_captflag_leds );
+ if (ACCESSING_BITS_8_15)
+ {
+ machine().bookkeeping().coin_counter_w(1, data & 0x0100); // coin 2
+ output().set_led_value(0, data & 0x0200); // decide
+ machine().bookkeeping().coin_counter_w(0, data & 0x0400); // coin 1
+ output().set_led_value(1, data & 0x2000); // select
+
+ int power = (data & 0x1000);
+ m_captflag_hopper->write(space, 0, power ? 0x80 : 0x00); // prize motor
+ if (!power)
+ m_captflag_hopper->reset();
+ }
+}
+
+WRITE16_MEMBER(cischeat_state::captflag_oki_bank_w)
+{
+ if (ACCESSING_BITS_0_7)
+ {
+ m_oki1_bank->set_entry(((data >> 0) + 1) & 0x7);
+ m_oki2_bank->set_entry(((data >> 4) + 1) & 0x7);
+ }
+}
+
+// Motors
+
+WRITE16_MEMBER(cischeat_state::captflag_motor_command_right_w)
+{
+ // Output check:
+ // e09a up
+ // 80b9 - (when not busy)
+ // 0088 - (when busy)
+ // e0ba down
+ data = COMBINE_DATA( &m_captflag_motor_command[RIGHT] );
+ captflag_motor_move(RIGHT, data);
+}
+WRITE16_MEMBER(cischeat_state::captflag_motor_command_left_w)
+{
+ // Output check:
+ // e0ba up
+ // 8099 - (when not busy)
+ // 0088 - (when busy)
+ // e09a down
+ data = COMBINE_DATA( &m_captflag_motor_command[LEFT] );
+ captflag_motor_move(LEFT, data);
+}
+
+void cischeat_state::captflag_motor_move(int side, UINT16 data)
+{
+ UINT16 & pos = m_captflag_motor_pos[side];
+
+ timer_device & dev = ((side == RIGHT) ? m_captflag_motor_right : m_captflag_motor_left);
+
+// bool busy = !(dev.time_left() == attotime::never);
+ bool busy = false;
+
+ if (data & 0x0010)
+ {
+ if (!busy)
+ {
+ bool down = (data & 0x0020);
+
+ int inc;
+ switch (data >> 8)
+ {
+ case 0xf5: inc = +2; break; // -5 -6
+ case 0xf8: inc = +1; break; // -5 -3
+ case 0xfe: inc = -1; break; // -5 +3
+ case 0x01: inc = -2; break; // -5 +6
+ default:
+ if ((data >> 8) + 5 >= 0x100)
+ inc = -1;
+ else
+ inc = +1;
+ }
+
+ if (data & 0x0001)
+ inc = 1;
+
+ if (down)
+ inc *= -1;
+
+ int new_pos = pos + inc;
+ if (new_pos > 3)
+ new_pos = 3;
+ else if (new_pos < 0)
+ new_pos = 0;
+ busy = (new_pos != pos);
+ pos = new_pos;
+
+ if (busy)
+ dev.adjust(attotime::from_msec(100));
+ }
+ }
+ else
+ {
+ dev.reset();
+ }
+
+ output().set_value((side == RIGHT) ? "right" : "left", pos);
+}
+
+CUSTOM_INPUT_MEMBER(cischeat_state::captflag_motor_pos_r)
+{
+ const UINT8 pos[4] = {1,0,2,3}; // -> 2,3,1,0 offsets -> 0123
+ return ~pos[m_captflag_motor_pos[(FPTR)param]];
+}
+
+CUSTOM_INPUT_MEMBER(cischeat_state::captflag_motor_busy_r)
+{
+// timer_device & dev = ((side == RIGHT) ? m_captflag_motor_right : m_captflag_motor_left);
+// return (dev.time_left() == attotime::never) ? 0 : 1;
+ return 0;
+}
+
+static ADDRESS_MAP_START( captflag_map, AS_PROGRAM, 16, cischeat_state )
+ AM_RANGE(0x000000, 0x07ffff) AM_ROM // ROM
+ AM_RANGE(0x082000, 0x082fff) AM_RAM_WRITE(scudhamm_vregs_w) AM_SHARE("vregs") // Video Registers + RAM
+ AM_RANGE(0x090008, 0x090009) AM_WRITENOP // 0?
+ AM_RANGE(0x0a0000, 0x0a3fff) AM_RAM_WRITE(cischeat_scrollram_0_w) AM_SHARE("scrollram.0") // Scroll RAM 0
+ AM_RANGE(0x0b0000, 0x0b3fff) AM_RAM_WRITE(cischeat_scrollram_2_w) AM_SHARE("scrollram.2") // Scroll RAM 2
+ AM_RANGE(0x0b8000, 0x0bffff) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette") // Palette
+ AM_RANGE(0x0f0000, 0x0fffff) AM_RAM AM_SHARE("ram") // Work RAM + Spriteram
+ AM_RANGE(0x100000, 0x100001) AM_READ_PORT("SW1_2") AM_WRITE(captflag_oki_bank_w) // 2 x DSW + Sound
+ AM_RANGE(0x100008, 0x100009) AM_READ_PORT("Buttons") AM_WRITE(captflag_leds_w) // Buttons + Leds
+ AM_RANGE(0x100014, 0x100015) AM_DEVREADWRITE8("oki1", okim6295_device, read, write, 0x00ff) // Sound
+ AM_RANGE(0x100018, 0x100019) AM_DEVREADWRITE8("oki2", okim6295_device, read, write, 0x00ff) //
+ AM_RANGE(0x10001c, 0x10001d) AM_WRITE(scudhamm_enable_w) // ?
+ AM_RANGE(0x100040, 0x100041) AM_READ_PORT("SW01") // DSW + Motor
+ AM_RANGE(0x100044, 0x100045) AM_WRITE(captflag_motor_command_left_w) // Motor Command (Left)
+ AM_RANGE(0x100048, 0x100049) AM_WRITE(captflag_motor_command_right_w) // Motor Command (Right)
+ AM_RANGE(0x100060, 0x10007d) AM_RAM // 7-seg? NVRAM?
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( captflag_oki1_map, AS_0, 8, cischeat_state )
+ AM_RANGE(0x00000, 0x1ffff) AM_ROM
+ AM_RANGE(0x20000, 0x3ffff) AM_ROMBANK("oki1_bank")
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( captflag_oki2_map, AS_0, 8, cischeat_state )
+ AM_RANGE(0x00000, 0x1ffff) AM_ROM
+ AM_RANGE(0x20000, 0x3ffff) AM_ROMBANK("oki2_bank")
+ADDRESS_MAP_END
+
+
+/**************************************************************************
Memory Maps - Road CPUs (#2 & #3)
@@ -1323,6 +1478,97 @@ INPUT_PORTS_END
/**************************************************************************
+ Captain Flag
+**************************************************************************/
+
+static INPUT_PORTS_START( captflag )
+ PORT_START("Buttons")
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2) // up left
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) // down left
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1) // up right
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) // down right
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_IMPULSE(1) // coin 2
+ PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_BUTTON1 ) // decide
+ PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(1) // coin 1
+ PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_SERVICE1 ) // service
+ PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_SERVICE ) // test
+ PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON2 ) // select
+ PORT_BIT( 0x4000, IP_ACTIVE_HIGH,IPT_OUTPUT ) PORT_READ_LINE_DEVICE_MEMBER("hopper", ticket_dispenser_device, line_r) // prize sensor
+ PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN ) // potery on schems?
+
+ PORT_START("SW1_2")
+ PORT_DIPNAME( 0x0007, 0x0007, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW1:1,2,3")
+ PORT_DIPSETTING( 0x0001, DEF_STR( 4C_1C ) )
+ PORT_DIPSETTING( 0x0002, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x0003, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x0007, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x0006, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x0005, DEF_STR( 1C_3C ) )
+ PORT_DIPSETTING( 0x0004, DEF_STR( 1C_4C ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Free_Play ) )
+ PORT_DIPNAME( 0x0038, 0x0038, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SW1:4,5,6")
+ PORT_DIPSETTING( 0x0008, DEF_STR( 4C_1C ) )
+ PORT_DIPSETTING( 0x0010, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x0018, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x0038, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x0030, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x0028, DEF_STR( 1C_3C ) )
+ PORT_DIPSETTING( 0x0020, DEF_STR( 1C_4C ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Free_Play ) )
+ PORT_DIPNAME( 0x00c0, 0x00c0, "Qualify" ) PORT_DIPLOCATION("SW1:7,8")
+ PORT_DIPSETTING( 0x0000, "30/40" )
+ PORT_DIPSETTING( 0x00c0, "30/50" )
+ PORT_DIPSETTING( 0x0080, "40/50" )
+ PORT_DIPSETTING( 0x0040, "50/50" )
+
+ PORT_DIPUNKNOWN_DIPLOC( 0x0100, 0x0100, "SW2:1" )
+ PORT_DIPUNKNOWN_DIPLOC( 0x0200, 0x0200, "SW2:2" )
+ PORT_DIPUNKNOWN_DIPLOC( 0x0400, 0x0400, "SW2:3" )
+ PORT_DIPUNKNOWN_DIPLOC( 0x0800, 0x0800, "SW2:4" )
+ PORT_DIPUNKNOWN_DIPLOC( 0x1000, 0x1000, "SW2:5" )
+ PORT_DIPUNKNOWN_DIPLOC( 0x2000, 0x2000, "SW2:6" )
+ PORT_DIPUNKNOWN_DIPLOC( 0x4000, 0x4000, "SW2:7" )
+ PORT_DIPUNKNOWN_DIPLOC( 0x8000, 0x8000, "SW2:8" )
+
+ PORT_START("SW01")
+ PORT_BIT( 0x0003, IP_ACTIVE_LOW, IPT_SPECIAL) PORT_CUSTOM_MEMBER(DEVICE_SELF, cischeat_state, captflag_motor_pos_r, (void *)LEFT)
+ PORT_BIT( 0x000c, IP_ACTIVE_LOW, IPT_SPECIAL) PORT_CUSTOM_MEMBER(DEVICE_SELF, cischeat_state, captflag_motor_pos_r, (void *)RIGHT)
+
+ PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_SPECIAL) PORT_CUSTOM_MEMBER(DEVICE_SELF, cischeat_state, captflag_motor_busy_r, (void *)LEFT)
+ PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_SPECIAL) PORT_CUSTOM_MEMBER(DEVICE_SELF, cischeat_state, captflag_motor_busy_r, (void *)RIGHT)
+
+ PORT_DIPNAME( 0x0300, 0x0300, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW01:1,2")
+ PORT_DIPSETTING( 0x0000, DEF_STR( Easy ) )
+ PORT_DIPSETTING( 0x0300, DEF_STR( Normal ) )
+ PORT_DIPSETTING( 0x0200, DEF_STR( Hard ) )
+ PORT_DIPSETTING( 0x0100, DEF_STR( Hardest ) )
+ PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW01:3")
+ PORT_DIPSETTING( 0x0400, "3/4" )
+ PORT_DIPSETTING( 0x0000, "4/5" )
+ PORT_DIPNAME( 0x0800, 0x0800, "BGM Volume" ) PORT_DIPLOCATION("SW01:4")
+ PORT_DIPSETTING( 0x0000, "Low" )
+ PORT_DIPSETTING( 0x0800, DEF_STR( Normal ) )
+ PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW01:5")
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x1000, DEF_STR( On ) )
+ PORT_DIPNAME( 0xe000, 0xe000, "Capsule Payout" ) PORT_DIPLOCATION("SW01:6,7,8")
+ PORT_DIPSETTING( 0x0000, "Nothing" )
+ PORT_DIPSETTING( 0xc000, "05%" )
+ PORT_DIPSETTING( 0xe000, "10%" )
+ PORT_DIPSETTING( 0xa000, "15%" )
+ PORT_DIPSETTING( 0x8000, "20%" )
+ PORT_DIPSETTING( 0x6000, "30%" )
+ PORT_DIPSETTING( 0x4000, "50%" )
+ PORT_DIPSETTING( 0x2000, "All" )
+INPUT_PORTS_END
+
+
+/**************************************************************************
Gfx Layouts
@@ -1690,6 +1936,76 @@ static MACHINE_CONFIG_DERIVED( armchmp2, scudhamm )
MACHINE_CONFIG_END
+/**************************************************************************
+ Captain Flag
+**************************************************************************/
+
+/*
+ 1] no-op
+ 2] copy text buffer to tilemap, sound (~50 scanlines at 30Hz)
+ 3] I/O, sound (~5 scanlines at 30Hz). Sets a flag to update text buffer and sprites
+ 4-7] rte
+*/
+
+TIMER_DEVICE_CALLBACK_MEMBER(cischeat_state::captflag_scanline)
+{
+ int scanline = param;
+
+ if(scanline == 240) // vblank: draw screen
+ m_maincpu->set_input_line(2, HOLD_LINE);
+
+ if(scanline == 50)
+ m_maincpu->set_input_line(3, HOLD_LINE);
+}
+
+static MACHINE_CONFIG_START( captflag, cischeat_state )
+
+ /* basic machine hardware */
+ MCFG_CPU_ADD("maincpu",M68000, XTAL_24MHz / 2) // TMP68000P-12
+ MCFG_CPU_PROGRAM_MAP(captflag_map)
+ MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", cischeat_state, captflag_scanline, "screen", 0, 1)
+
+ MCFG_TICKET_DISPENSER_ADD("hopper", attotime::from_msec(2000), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH )
+
+ /* video hardware */
+ MCFG_SCREEN_ADD("screen", RASTER)
+// MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_AFTER_VBLANK)
+ MCFG_SCREEN_REFRESH_RATE(30) //TODO: wrong!
+// MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500 * 3) /* not accurate */)
+ MCFG_SCREEN_SIZE(256, 256)
+ MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0 +16, 256-1 -16)
+ MCFG_SCREEN_UPDATE_DRIVER(cischeat_state, screen_update_scudhamm)
+ MCFG_SCREEN_PALETTE("palette")
+
+ MCFG_GFXDECODE_ADD("gfxdecode", "palette", scudhamm)
+ MCFG_PALETTE_ADD("palette", 0x8000/2)
+ MCFG_PALETTE_FORMAT(RRRRGGGGBBBBRGBx)
+ MCFG_PALETTE_ENABLE_SHADOWS()
+
+ MCFG_VIDEO_START_OVERRIDE(cischeat_state,f1gpstar)
+
+ // Motors
+ MCFG_TIMER_ADD_NONE("motor_left")
+ MCFG_TIMER_ADD_NONE("motor_right")
+
+ // Layout
+ MCFG_DEFAULT_LAYOUT(layout_captflag)
+
+ /* sound hardware */
+ MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
+
+ MCFG_OKIM6295_ADD("oki1", 2112000, OKIM6295_PIN7_HIGH) // clock frequency & pin 7 not verified
+ MCFG_DEVICE_ADDRESS_MAP(AS_0, captflag_oki1_map)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.5)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.5)
+
+ MCFG_OKIM6295_ADD("oki2", 2112000, OKIM6295_PIN7_HIGH) // clock frequency & pin 7 not verified
+ MCFG_DEVICE_ADDRESS_MAP(AS_0, captflag_oki2_map)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.5)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.5)
+MACHINE_CONFIG_END
+
+
/***************************************************************************
@@ -2922,6 +3238,68 @@ ROM_END
/***************************************************************************
+ Captain Flag
+
+**************************************************************************/
+
+ROM_START( captflag )
+ ROM_REGION( 0x80000, "maincpu", 0 ) /* Main CPU Code */
+ ROM_LOAD16_BYTE( "cf-92128a_3_ver1.4.ic40", 0x000000, 0x020000, CRC(e62af6ae) SHA1(38eb581def468860e4705f25088550799303a9aa) )
+ ROM_LOAD16_BYTE( "cf-92128_4_ver1.4.ic46", 0x000001, 0x020000, CRC(e773f87f) SHA1(cf9d72b0df256b69b96f1cd6b5f86282801873e3) )
+
+ ROM_REGION( 0x80000, "gfx1", 0 ) /* Scroll 0 */
+ ROM_LOAD( "mr92027-11_w89.ic54", 0x000000, 0x080000, CRC(d34cae3c) SHA1(622ad4645df12d34e55bbfb7194508957bb2198b) ) // 5 on the PCB
+
+// ROM_REGION( 0x080000, "gfx2", 0 ) /* Scroll 1 */
+// UNUSED
+
+ ROM_REGION( 0x20000, "gfx3", 0 ) /* Scroll 2 */
+ ROM_LOAD( "cf-92128_6.ic55", 0x000000, 0x020000, CRC(12debfc2) SHA1(f28d3f63a3c8965fcd838eedad4ef3682a28da0d) ) // 6 on the PCB
+
+ ROM_REGION( 0x400000, "gfx4", 0 ) /* Sprites */
+ ROM_LOAD16_BYTE( "gp-9189_1.ic1", 0x000000, 0x080000, CRC(03d69f0f) SHA1(97a0552d94ca1e9c76896903c02c3f005752e5db) )
+ ROM_LOAD16_BYTE( "gp-9189_2.ic2", 0x000001, 0x080000, CRC(fbfba282) SHA1(65735d8f6abdb5816b8b26ce2969959a0f2e2c7d) )
+ ROM_LOAD16_BYTE( "mr92027-08_w85.ic5", 0x100000, 0x080000, CRC(1e02abff) SHA1(497aeab40c778ef6d8a76b005530fea5f4f68ab8) )
+ ROM_LOAD16_BYTE( "mr92027-04_w86.ic6", 0x100001, 0x080000, CRC(89dfe3e8) SHA1(f069cf55d08e5901699e7ee7c6b2b5cdba031cf2) )
+ ROM_LOAD16_BYTE( "gp-9189_5.ic11", 0x200000, 0x080000, CRC(edc33285) SHA1(a23f9a1877108eaaef6d467ae21433fe5f24261f) )
+ ROM_LOAD16_BYTE( "gp-9189_6.ic12", 0x200001, 0x080000, CRC(99b8f6d8) SHA1(e01c85861d5a131bb31908460cb3bc9eb0ea045c) )
+ ROM_LOAD16_BYTE( "mr92027-07_w87.ic15", 0x300000, 0x080000, CRC(07e49754) SHA1(c9fcd394badba104508e4c5ec5cf5513ecb2d69e) )
+ ROM_LOAD16_BYTE( "mr92027-08_w88.ic16", 0x300001, 0x080000, CRC(fb080dd6) SHA1(49eceba8cdce76dec3f6a85327135125bb0910f0) )
+
+ ROM_REGION( 0x80000, "user2", 0 ) /* ? Unused ROMs ? */
+ ROM_LOAD( "pr91042.ic86", 0x000000, 0x000100, CRC(e71de4aa) SHA1(d06e5a35ad2127df2d6328cce153073380ee7819) ) // FIXED BITS (00000xxx0000xxxx)
+ ROM_LOAD( "pr88004q.ic88", 0x000000, 0x000200, CRC(9327dc37) SHA1(cfe7b144cdcd76170d47f1c4e0f72b6d4fca0c8d) ) // FIXED BITS (1xxxxxxx1111x1xx)
+ ROM_LOAD( "pr92027a.ic16", 0x000000, 0x000020, CRC(bee7adc6) SHA1(cd11a3dae0317d06a69b5707a653b8997c1eb97f) ) // FIXED BITS (0000000000000xxx), 1xxx0 = 0x00
+ ROM_LOAD( "pr92027a.ic17", 0x000000, 0x000020, CRC(bee7adc6) SHA1(cd11a3dae0317d06a69b5707a653b8997c1eb97f) ) // ""
+ ROM_LOAD( "pr92027b.ic32.bin", 0x000000, 0x000113, CRC(483f4fb5) SHA1(84bb0300a106261634c921a37858482d3233c05a) )
+ ROM_LOAD( "pr92027b.ic32.jedec", 0x000000, 0x000bd0, CRC(f0ed1845) SHA1(203438fdee05810b2265624e1a1fdd55d360f833) )
+ ROM_LOAD( "pr92027b.ic36.bin", 0x000000, 0x000113, CRC(483f4fb5) SHA1(84bb0300a106261634c921a37858482d3233c05a) )
+ ROM_LOAD( "pr92027b.ic36.jedec", 0x000000, 0x000bd0, CRC(f0ed1845) SHA1(203438fdee05810b2265624e1a1fdd55d360f833) )
+
+ ROM_LOAD( "ch9072_4.ic39", 0x000000, 0x002000, CRC(b45b4dc0) SHA1(b9fae0c9ac2d40f0a202c538d866d5f2941ba8dd) ) // FIXED BITS (0000000x), 1ST AND 2ND HALF IDENTICAL
+ ROM_LOAD( "ch9072_5.ic33", 0x000000, 0x001000, CRC(a8025dc1) SHA1(c9bb7ea59bba3041c687b449ff1560d7d1ce2ec9) ) // FIXED BITS (xxxx0xxx)
+ ROM_LOAD( "ch9072_6.ic35", 0x000000, 0x001000, CRC(5cc9c561) SHA1(10866fd0707498fe4d4415bf755c07b55af4ae18) )
+ ROM_LOAD( "ch9072_8.ic59", 0x000000, 0x001000, CRC(6c99523b) SHA1(cc00b326b69a97b5bd2e2d741ab41692a14eae35) ) // FIXED BITS (0xxx0xxx)
+
+ ROM_LOAD( "mr90015-35_w33.ic54", 0x000000, 0x080000, CRC(9d428fb7) SHA1(02f72938d73db932bd217620a175a05215f6016a) ) // not dumped yet (taken from the other games)
+ ROM_LOAD( "mr90015-35_w33.ic67", 0x000000, 0x080000, CRC(9d428fb7) SHA1(02f72938d73db932bd217620a175a05215f6016a) ) // ""
+
+ ROM_REGION( 0x100000, "oki1", 0 ) /* Samples (8x20000) */
+ ROM_LOAD( "mr92027-10_w27.ic19", 0x000000, 0x100000, CRC(04bd729e) SHA1(92bcedf16554f33cc3d0dbdd8807b0e2fafe5d7c) ) // 2 on the PCB
+
+ ROM_REGION( 0x100000, "oki2", 0 ) /* Samples (8x20000) */
+ ROM_LOAD( "mr92027-09_w26.ic18", 0x000000, 0x100000, CRC(3aaa332a) SHA1(6c19364069e0b077a07ac4f9c4b0cf0c0985a42a) ) // 1 on the PCB
+ROM_END
+
+DRIVER_INIT_MEMBER(cischeat_state, captflag)
+{
+ m_oki1_bank->configure_entries(0, 0x100000 / 0x20000, memregion("oki1")->base(), 0x20000);
+ m_oki2_bank->configure_entries(0, 0x100000 / 0x20000, memregion("oki2")->base(), 0x20000);
+}
+
+
+/***************************************************************************
+
Game Drivers
@@ -2931,8 +3309,9 @@ ROM_END
GAMEL( 1989, bigrun, 0, bigrun, bigrun, cischeat_state, bigrun, ROT0, "Jaleco", "Big Run (11th Rallye version)", MACHINE_IMPERFECT_GRAPHICS, layout_cischeat ) // there's a 13th Rallye version (1991) (only on the SNES?)
GAMEL( 1990, cischeat, 0, cischeat, cischeat, cischeat_state, cischeat, ROT0, "Jaleco", "Cisco Heat", MACHINE_IMPERFECT_GRAPHICS, layout_cischeat )
GAMEL( 1991, f1gpstar, 0, f1gpstar, f1gpstar, cischeat_state, f1gpstar, ROT0, "Jaleco", "Grand Prix Star", MACHINE_IMPERFECT_GRAPHICS, layout_f1gpstar )
-GAME ( 1992, armchmp2, 0, armchmp2, armchmp2, driver_device, 0, ROT270, "Jaleco", "Arm Champs II v2.6", MACHINE_IMPERFECT_GRAPHICS )
-GAME ( 1992, armchmp2o,armchmp2, armchmp2, armchmp2, driver_device, 0, ROT270, "Jaleco", "Arm Champs II v1.7", MACHINE_IMPERFECT_GRAPHICS )
+GAME ( 1992, armchmp2, 0, armchmp2, armchmp2, driver_device, 0, ROT270, "Jaleco", "Arm Champs II v2.6", MACHINE_IMPERFECT_GRAPHICS )
+GAME ( 1992, armchmp2o,armchmp2, armchmp2, armchmp2, driver_device, 0, ROT270, "Jaleco", "Arm Champs II v1.7", MACHINE_IMPERFECT_GRAPHICS )
GAME ( 1992, wildplt, 0, f1gpstr2, wildplt, cischeat_state, wildplt, ROT0, "Jaleco", "Wild Pilot", MACHINE_IMPERFECT_GRAPHICS )
GAMEL( 1993, f1gpstr2, 0, f1gpstr2, f1gpstar, cischeat_state, f1gpstar, ROT0, "Jaleco", "F-1 Grand Prix Star II", MACHINE_IMPERFECT_GRAPHICS, layout_f1gpstar )
-GAME ( 1994, scudhamm, 0, scudhamm, scudhamm, driver_device, 0, ROT270, "Jaleco", "Scud Hammer", MACHINE_IMPERFECT_GRAPHICS )
+GAME ( 1993, captflag, 0, captflag, captflag, cischeat_state, captflag, ROT270, "Jaleco", "Captain Flag (Japan)", MACHINE_IMPERFECT_GRAPHICS )
+GAME ( 1994, scudhamm, 0, scudhamm, scudhamm, driver_device, 0, ROT270, "Jaleco", "Scud Hammer", MACHINE_IMPERFECT_GRAPHICS )
diff --git a/src/mame/drivers/cliffhgr.cpp b/src/mame/drivers/cliffhgr.cpp
index 3d59e1456da..c9cfe5f40b1 100644
--- a/src/mame/drivers/cliffhgr.cpp
+++ b/src/mame/drivers/cliffhgr.cpp
@@ -128,7 +128,7 @@ public:
WRITE8_MEMBER(cliffhgr_state::cliff_test_led_w)
{
- set_led_status(machine(), 0, offset ^ 1);
+ output().set_led_value(0, offset ^ 1);
}
WRITE8_MEMBER(cliffhgr_state::cliff_port_bank_w)
@@ -165,7 +165,7 @@ WRITE8_MEMBER(cliffhgr_state::cliff_phillips_clear_w)
WRITE8_MEMBER(cliffhgr_state::cliff_coin_counter_w)
{
- coin_counter_w(machine(), 0, (data & 0x40) ? 1 : 0 );
+ machine().bookkeeping().coin_counter_w(0, (data & 0x40) ? 1 : 0 );
}
READ8_MEMBER(cliffhgr_state::cliff_irq_ack_r)
diff --git a/src/mame/drivers/cloak.cpp b/src/mame/drivers/cloak.cpp
index 0190b1860e9..ff2c8aab3c3 100644
--- a/src/mame/drivers/cloak.cpp
+++ b/src/mame/drivers/cloak.cpp
@@ -130,12 +130,12 @@
WRITE8_MEMBER(cloak_state::cloak_led_w)
{
- set_led_status(machine(), 1 - offset, ~data & 0x80);
+ output().set_led_value(1 - offset, ~data & 0x80);
}
WRITE8_MEMBER(cloak_state::cloak_coin_counter_w)
{
- coin_counter_w(machine(), 1 - offset, data & 0x80);
+ machine().bookkeeping().coin_counter_w(1 - offset, data & 0x80);
}
WRITE8_MEMBER(cloak_state::cloak_custom_w)
diff --git a/src/mame/drivers/cloud9.cpp b/src/mame/drivers/cloud9.cpp
index 745e5c402c5..17d12c4b268 100644
--- a/src/mame/drivers/cloud9.cpp
+++ b/src/mame/drivers/cloud9.cpp
@@ -215,13 +215,13 @@ WRITE8_MEMBER(cloud9_state::irq_ack_w)
WRITE8_MEMBER(cloud9_state::cloud9_led_w)
{
- set_led_status(machine(), offset, ~data & 0x80);
+ output().set_led_value(offset, ~data & 0x80);
}
WRITE8_MEMBER(cloud9_state::cloud9_coin_counter_w)
{
- coin_counter_w(machine(), offset, data & 0x80);
+ machine().bookkeeping().coin_counter_w(offset, data & 0x80);
}
diff --git a/src/mame/drivers/clowndwn.cpp b/src/mame/drivers/clowndwn.cpp
index 5299fff61f8..2eacdadfc44 100644
--- a/src/mame/drivers/clowndwn.cpp
+++ b/src/mame/drivers/clowndwn.cpp
@@ -17,13 +17,13 @@ class clowndwn_state : public driver_device
public:
clowndwn_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
- // ,m_maincpu(*this, "maincpu")
+ // ,m_maincpu(*this, "maincpu")
{ }
virtual void machine_start() override;
virtual void machine_reset() override;
-// required_device<mcs51_cpu_device> m_maincpu;
+// required_device<mcs51_cpu_device> m_maincpu;
};
static INPUT_PORTS_START( clowndwn )
@@ -43,9 +43,9 @@ void clowndwn_state::machine_reset()
static MACHINE_CONFIG_START( clowndwn, clowndwn_state )
/* basic machine hardware */
-// MCFG_CPU_ADD("maincpu", ??, 8000000) // unknown (vectors at end? 6xxx ?)
-// MCFG_CPU_PROGRAM_MAP(clowndwn_map)
-// MCFG_CPU_IO_MAP(clowndwn_io)
+// MCFG_CPU_ADD("maincpu", ??, 8000000) // unknown (vectors at end? 6xxx ?)
+// MCFG_CPU_PROGRAM_MAP(clowndwn_map)
+// MCFG_CPU_IO_MAP(clowndwn_io)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
@@ -63,4 +63,3 @@ ROM_START( clowndwn )
ROM_END
GAME( 1987, clowndwn, 0, clowndwn, clowndwn, driver_device, 0, ROT0, "Elwood Electronics", "Clown Roll Down (Elwood)", MACHINE_IS_SKELETON_MECHANICAL )
-
diff --git a/src/mame/drivers/cobra.cpp b/src/mame/drivers/cobra.cpp
index a1e90713cb9..c7b749278e5 100644
--- a/src/mame/drivers/cobra.cpp
+++ b/src/mame/drivers/cobra.cpp
@@ -358,15 +358,15 @@ public:
cobra_renderer(screen_device &screen)
: poly_manager<float, cobra_polydata, 8, 10000>(screen)
{
- m_texture_ram = auto_alloc_array(machine(), UINT32, 0x100000);
+ m_texture_ram = std::make_unique<UINT32[]>(0x100000);
- m_framebuffer = auto_bitmap_rgb32_alloc(machine(), 1024, 1024);
- m_backbuffer = auto_bitmap_rgb32_alloc(machine(), 1024, 1024);
- m_overlay = auto_bitmap_rgb32_alloc(machine(), 1024, 1024);
- m_zbuffer = auto_bitmap_ind32_alloc(machine(), 1024, 1024);
- m_stencil = auto_bitmap_ind32_alloc(machine(), 1024, 1024);
+ m_framebuffer = std::make_unique<bitmap_rgb32>( 1024, 1024);
+ m_backbuffer = std::make_unique<bitmap_rgb32>( 1024, 1024);
+ m_overlay = std::make_unique<bitmap_rgb32>( 1024, 1024);
+ m_zbuffer = std::make_unique<bitmap_ind32>(1024, 1024);
+ m_stencil = std::make_unique<bitmap_ind32>(1024, 1024);
- m_gfx_regmask = auto_alloc_array(machine(), UINT32, 0x100);
+ m_gfx_regmask = std::make_unique<UINT32[]>(0x100);
for (int i=0; i < 0x100; i++)
{
UINT32 mask = 0;
@@ -400,19 +400,19 @@ public:
void display(bitmap_rgb32 *bitmap, const rectangle &cliprect);
inline rgb_t texture_fetch(UINT32 *texture, int u, int v, int width, int format);
private:
- bitmap_rgb32 *m_framebuffer;
- bitmap_rgb32 *m_backbuffer;
- bitmap_rgb32 *m_overlay;
- bitmap_ind32 *m_zbuffer;
- bitmap_ind32 *m_stencil;
+ std::unique_ptr<bitmap_rgb32> m_framebuffer;
+ std::unique_ptr<bitmap_rgb32> m_backbuffer;
+ std::unique_ptr<bitmap_rgb32> m_overlay;
+ std::unique_ptr<bitmap_ind32> m_zbuffer;
+ std::unique_ptr<bitmap_ind32> m_stencil;
- UINT32 *m_texture_ram;
+ std::unique_ptr<UINT32[]> m_texture_ram;
- UINT32 *m_gfx_gram;
- UINT32 *m_gfx_regmask;
+ std::unique_ptr<UINT32[]> m_gfx_gram;
+ std::unique_ptr<UINT32[]> m_gfx_regmask;
UINT32 m_gfx_register_select;
- UINT64 *m_gfx_register;
+ std::unique_ptr<UINT64[]> m_gfx_register;
UINT32 m_texram_ptr;
@@ -451,7 +451,7 @@ public:
cobra_fifo(running_machine &machine, int capacity, const char *name, bool verbose, event_delegate event_callback)
{
- m_data = auto_alloc_array(machine, UINT64, capacity);
+ m_data = std::make_unique<UINT64[]>(capacity);
m_name = name;
m_size = capacity;
@@ -481,7 +481,7 @@ private:
int m_num;
bool m_verbose;
const char *m_name;
- UINT64 *m_data;
+ std::unique_ptr<UINT64[]> m_data;
event_delegate m_event_callback;
};
@@ -493,9 +493,16 @@ class cobra_jvs : public jvs_device
public:
cobra_jvs(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+ DECLARE_WRITE_LINE_MEMBER(coin_1_w);
+ DECLARE_WRITE_LINE_MEMBER(coin_2_w);
+
protected:
virtual bool switches(UINT8 *&buf, UINT8 count_players, UINT8 bytes_per_switch) override;
virtual bool coin_counters(UINT8 *&buf, UINT8 count) override;
+ virtual void function_list(UINT8 *&buf) override;
+
+private:
+ int m_coin_counter[2];
};
const device_type COBRA_JVS = &device_creator<cobra_jvs>;
@@ -503,6 +510,35 @@ const device_type COBRA_JVS = &device_creator<cobra_jvs>;
cobra_jvs::cobra_jvs(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: jvs_device(mconfig, COBRA_JVS, "JVS (COBRA)", tag, owner, clock, "cobra_jvs", __FILE__)
{
+ m_coin_counter[0] = 0;
+ m_coin_counter[1] = 0;
+}
+
+WRITE_LINE_MEMBER(cobra_jvs::coin_1_w)
+{
+ if(state)
+ m_coin_counter[0]++;
+}
+
+WRITE_LINE_MEMBER(cobra_jvs::coin_2_w)
+{
+ if(state)
+ m_coin_counter[1]++;
+}
+
+void cobra_jvs::function_list(UINT8 *&buf)
+{
+ // SW input - 2 players, 13 bits
+ *buf++ = 0x01; *buf++ = 2; *buf++ = 13; *buf++ = 0;
+
+ // Coin input - 2 slots
+ *buf++ = 0x02; *buf++ = 2; *buf++ = 0; *buf++ = 0;
+
+ // Analog input - 8 channels
+ *buf++ = 0x03; *buf++ = 8; *buf++ = 16; *buf++ = 0;
+
+ // Driver out - 6 channels
+ *buf++ = 0x12; *buf++ = 6; *buf++ = 0; *buf++ = 0;
}
bool cobra_jvs::switches(UINT8 *&buf, UINT8 count_players, UINT8 bytes_per_switch)
@@ -538,8 +574,10 @@ bool cobra_jvs::coin_counters(UINT8 *&buf, UINT8 count)
if (count > 2)
return false;
- *buf++ = 0x00;
- *buf++ = 0x01;
+ *buf++ = m_coin_counter[0] >> 8; *buf++ = m_coin_counter[0];
+
+ if(count > 1)
+ *buf++ = m_coin_counter[1] >> 8; *buf++ = m_coin_counter[1];
return true;
}
@@ -647,8 +685,6 @@ public:
DECLARE_READ32_MEMBER(sub_comram_r);
DECLARE_WRITE32_MEMBER(sub_comram_w);
- DECLARE_READ32_MEMBER(sub_sound_r);
- DECLARE_WRITE32_MEMBER(sub_sound_w);
DECLARE_READ32_MEMBER(sub_unk7e_r);
DECLARE_WRITE32_MEMBER(sub_debug_w);
DECLARE_READ32_MEMBER(sub_unk1_r);
@@ -680,7 +716,7 @@ public:
DECLARE_WRITE_LINE_MEMBER(ide_interrupt);
- cobra_renderer *m_renderer;
+ std::unique_ptr<cobra_renderer> m_renderer;
cobra_fifo *m_gfxfifo_in;
cobra_fifo *m_gfxfifo_out;
@@ -708,7 +744,7 @@ public:
UINT8 m_main_int_active;
- UINT32 *m_comram[2];
+ std::unique_ptr<UINT32[]> m_comram[2];
int m_comram_page;
int m_main_debug_state;
@@ -737,8 +773,8 @@ public:
bool m_has_psac;
- INT16 *m_sound_dma_buffer_l;
- INT16 *m_sound_dma_buffer_r;
+ std::unique_ptr<INT16[]> m_sound_dma_buffer_l;
+ std::unique_ptr<INT16[]> m_sound_dma_buffer_r;
UINT32 m_sound_dma_ptr;
dmadac_sound_device *m_dmadac[2];
@@ -746,6 +782,7 @@ public:
DECLARE_DRIVER_INIT(racjamdx);
DECLARE_DRIVER_INIT(bujutsu);
DECLARE_DRIVER_INIT(cobra);
+ virtual void machine_start() override;
virtual void machine_reset() override;
virtual void video_start() override;
UINT32 screen_update_cobra(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
@@ -1020,7 +1057,7 @@ void cobra_state::video_start()
{
machine().add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(cobra_state::cobra_video_exit), this));
- m_renderer = auto_alloc(machine(), cobra_renderer(*m_screen));
+ m_renderer = std::make_unique<cobra_renderer>(*m_screen);
m_renderer->gfx_init();
}
@@ -1895,7 +1932,7 @@ WRITE32_MEMBER(cobra_state::sub_comram_w)
{
int page = m_comram_page ^ 1;
- COMBINE_DATA(m_comram[page] + offset);
+ COMBINE_DATA(m_comram[page].get() + offset);
}
WRITE32_MEMBER(cobra_state::sub_psac_palette_w)
@@ -1946,8 +1983,8 @@ WRITE32_MEMBER(cobra_state::sub_sound_dma_w)
{
m_sound_dma_ptr = 0;
- dmadac_transfer(&m_dmadac[0], 1, 0, 1, DMA_SOUND_BUFFER_SIZE, m_sound_dma_buffer_l);
- dmadac_transfer(&m_dmadac[1], 1, 0, 1, DMA_SOUND_BUFFER_SIZE, m_sound_dma_buffer_r);
+ dmadac_transfer(&m_dmadac[0], 1, 0, 1, DMA_SOUND_BUFFER_SIZE, m_sound_dma_buffer_l.get());
+ dmadac_transfer(&m_dmadac[1], 1, 0, 1, DMA_SOUND_BUFFER_SIZE, m_sound_dma_buffer_r.get());
}
}
@@ -2052,9 +2089,9 @@ void cobra_renderer::gfx_init()
{
const rectangle& visarea = screen().visible_area();
- m_gfx_gram = auto_alloc_array(machine(), UINT32, 0x40000);
+ m_gfx_gram = std::make_unique<UINT32[]>(0x40000);
- m_gfx_register = auto_alloc_array(machine(), UINT64, 0x3000);
+ m_gfx_register = std::make_unique<UINT64[]>(0x3000);
m_gfx_register_select = 0;
float zvalue = 10000000.0f;
@@ -2251,13 +2288,13 @@ void cobra_renderer::gfx_fifo_exec()
// GFX register select
m_gfx_register_select = w[3];
- printf("GFX: register select %08X\n", m_gfx_register_select);
+ // printf("GFX: register select %08X\n", m_gfx_register_select);
}
else if (w2 == 0x10500018)
{
// register write to the register selected above?
// 64-bit registers, top 32-bits in word 2, low 32-bit in word 3
- printf("GFX: register write %08X: %08X %08X\n", m_gfx_register_select, w[2], w[3]);
+ // printf("GFX: register write %08X: %08X %08X\n", m_gfx_register_select, w[2], w[3]);
gfx_write_reg(((UINT64)(w[2]) << 32) | w[3]);
}
@@ -3098,50 +3135,54 @@ ADDRESS_MAP_END
INPUT_PORTS_START( cobra )
PORT_START("TEST")
- PORT_SERVICE_NO_TOGGLE( 0x80, IP_ACTIVE_LOW) /* Test Button */
- PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Service") PORT_CODE(KEYCODE_7)
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_SERVICE2 )
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN )
- PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_SERVICE_NO_TOGGLE( 0x80, IP_ACTIVE_HIGH) /* Test Button */
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("P1")
- PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_START1 )
- PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_PLAYER(1)
- PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1)
- PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1)
- PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1)
- PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1)
- PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1)
- PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1)
- PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1)
- PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(1)
- PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_PLAYER(1)
- PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_PLAYER(1)
+ PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_START1 )
+ PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_SERVICE ) PORT_NAME("P1 Service") PORT_CODE(KEYCODE_7)
+ PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1)
+ PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1)
+ PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_PLAYER(1)
+ PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(1)
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_PLAYER(1)
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_PLAYER(1)
PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_PLAYER(1)
PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_PLAYER(1)
PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_PLAYER(1)
PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_PLAYER(1)
PORT_START("P2")
- PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_START2 )
- PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_PLAYER(2)
- PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2)
- PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2)
- PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2)
- PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2)
- PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
- PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
- PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2)
- PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(2)
- PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_PLAYER(2)
- PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_PLAYER(2)
- PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_PLAYER(2)
- PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_PLAYER(2)
- PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_PLAYER(2)
- PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_PLAYER(2)
+ PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_START2 )
+ PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_SERVICE ) PORT_NAME("P2 Service") PORT_CODE(KEYCODE_8)
+ PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2)
+ PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2)
+ PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_PLAYER(2)
+ PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(2)
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_PLAYER(2)
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_PLAYER(2)
+ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_PLAYER(2)
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_PLAYER(2)
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_PLAYER(2)
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_PLAYER(2)
+
+ PORT_START("COINS")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_COIN1) PORT_WRITE_LINE_DEVICE_MEMBER("cobra_jvs1", cobra_jvs, coin_1_w)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_COIN2) PORT_WRITE_LINE_DEVICE_MEMBER("cobra_jvs1", cobra_jvs, coin_2_w)
INPUT_PORTS_END
WRITE_LINE_MEMBER(cobra_state::ide_interrupt)
@@ -3166,6 +3207,17 @@ INTERRUPT_GEN_MEMBER(cobra_state::cobra_vblank)
}
}
+void cobra_state::machine_start()
+{
+ /* configure fast RAM regions for DRC */
+ m_maincpu->ppcdrc_add_fastram(0x00000000, 0x003fffff, FALSE, m_main_ram);
+
+ m_subcpu->ppcdrc_add_fastram(0x00000000, 0x003fffff, FALSE, m_sub_ram);
+
+ m_gfxcpu->ppcdrc_add_fastram(0x00000000, 0x003fffff, FALSE, m_gfx_ram0);
+ m_gfxcpu->ppcdrc_add_fastram(0x07c00000, 0x07ffffff, FALSE, m_gfx_ram1);
+}
+
void cobra_state::machine_reset()
{
m_sub_interrupt = 0xff;
@@ -3248,7 +3300,9 @@ static MACHINE_CONFIG_START( cobra, cobra_state )
MCFG_K001604_PALETTE("palette")
MCFG_DEVICE_ADD("cobra_jvs_host", COBRA_JVS_HOST, 4000000)
- MCFG_JVS_DEVICE_ADD("cobra_jvs", COBRA_JVS, "cobra_jvs_host")
+ MCFG_JVS_DEVICE_ADD("cobra_jvs1", COBRA_JVS, "cobra_jvs_host")
+ MCFG_JVS_DEVICE_ADD("cobra_jvs2", COBRA_JVS, "cobra_jvs_host")
+ MCFG_JVS_DEVICE_ADD("cobra_jvs3", COBRA_JVS, "cobra_jvs_host")
MACHINE_CONFIG_END
@@ -3298,13 +3352,13 @@ DRIVER_INIT_MEMBER(cobra_state, cobra)
m_subcpu->ppc4xx_spu_set_tx_handler(write8_delegate(FUNC(cobra_state::sub_jvs_w), this));
- m_comram[0] = auto_alloc_array(machine(), UINT32, 0x40000/4);
- m_comram[1] = auto_alloc_array(machine(), UINT32, 0x40000/4);
+ m_comram[0] = std::make_unique<UINT32[]>(0x40000/4);
+ m_comram[1] = std::make_unique<UINT32[]>(0x40000/4);
m_comram_page = 0;
- m_sound_dma_buffer_l = auto_alloc_array(machine(), INT16, DMA_SOUND_BUFFER_SIZE);
- m_sound_dma_buffer_r = auto_alloc_array(machine(), INT16, DMA_SOUND_BUFFER_SIZE);
+ m_sound_dma_buffer_l = std::make_unique<INT16[]>(DMA_SOUND_BUFFER_SIZE);
+ m_sound_dma_buffer_r = std::make_unique<INT16[]>(DMA_SOUND_BUFFER_SIZE);
// setup fake pagetable until we figure out what really maps there...
//m_gfx_pagetable[0x80 / 8] = U64(0x800001001e0001a8);
diff --git a/src/mame/drivers/cocoloco.cpp b/src/mame/drivers/cocoloco.cpp
index 7cb6dec9d94..3111a461866 100644
--- a/src/mame/drivers/cocoloco.cpp
+++ b/src/mame/drivers/cocoloco.cpp
@@ -195,7 +195,7 @@ public:
required_device<cpu_device> m_maincpu;
required_device<palette_device> m_palette;
- UINT8 *m_videoram;
+ std::unique_ptr<UINT8[]> m_videoram;
UINT8 m_videobank;
DECLARE_READ8_MEMBER(vram_r);
@@ -290,9 +290,9 @@ PALETTE_INIT_MEMBER(cocoloco_state, cocoloco)
void cocoloco_state::video_start()
{
- m_videoram = auto_alloc_array(machine(), UINT8, 0x2000 * 8);
+ m_videoram = std::make_unique<UINT8[]>(0x2000 * 8);
- save_pointer(NAME(m_videoram), 0x2000 * 8);
+ save_pointer(NAME(m_videoram.get()), 0x2000 * 8);
save_item(NAME(m_videobank));
}
@@ -367,7 +367,7 @@ WRITE8_MEMBER( cocoloco_state::coincounter_w )
They explain in a sheet that the coin in for 50 pesetas
behaves like 2x 25 pesetas (1 duro) coins, so has sense.
*/
- coin_counter_w(machine(), 0, data & 0x08);
+ machine().bookkeeping().coin_counter_w(0, data & 0x08);
}
diff --git a/src/mame/drivers/coinmstr.cpp b/src/mame/drivers/coinmstr.cpp
index c60626bbfad..ea5b3edf2aa 100644
--- a/src/mame/drivers/coinmstr.cpp
+++ b/src/mame/drivers/coinmstr.cpp
@@ -162,8 +162,6 @@ public:
DECLARE_WRITE8_MEMBER(quizmstr_attr1_w);
DECLARE_WRITE8_MEMBER(quizmstr_attr2_w);
DECLARE_WRITE8_MEMBER(quizmstr_attr3_w);
- DECLARE_WRITE8_MEMBER(jpcoin2_attr1_w);
- DECLARE_WRITE8_MEMBER(jpcoin2_attr2_w);
DECLARE_READ8_MEMBER(question_r);
DECLARE_WRITE8_MEMBER(question_w);
DECLARE_READ8_MEMBER(ff_r);
@@ -344,16 +342,6 @@ static ADDRESS_MAP_START( jpcoin_map, AS_PROGRAM, 8, coinmstr_state )
AM_RANGE(0xf800, 0xffff) AM_RAM_WRITE(quizmstr_attr3_w) AM_SHARE("attr_ram3")
ADDRESS_MAP_END
-/* 3x 6116 hardware E000-E800, E800-EFFF & F000-F7FF */
-static ADDRESS_MAP_START( jpcoin2_map, AS_PROGRAM, 8, coinmstr_state )
- AM_RANGE(0x0000, 0xbfff) AM_ROM
- AM_RANGE(0xc000, 0xdfff) AM_RAM /* only for the 2x 6462 hardware */
- AM_RANGE(0xe000, 0xe7ff) AM_RAM_WRITE(quizmstr_bg_w) AM_SHARE("videoram")
- AM_RANGE(0xe800, 0xefff) AM_RAM_WRITE(quizmstr_attr1_w) AM_SHARE("attr_ram1")
- AM_RANGE(0xf000, 0xf7ff) AM_RAM_WRITE(quizmstr_attr2_w) AM_SHARE("attr_ram2")
- AM_RANGE(0xf800, 0xffff) AM_RAM_WRITE(quizmstr_attr3_w) AM_SHARE("attr_ram3")
-ADDRESS_MAP_END
-
// Different I/O mappping for every game
static ADDRESS_MAP_START( quizmstr_io_map, AS_IO, 8, coinmstr_state )
@@ -492,17 +480,6 @@ E0-E1 CRTC
AM_RANGE(0xc4, 0xc4) AM_READ(ff_r) /* needed to boot */
ADDRESS_MAP_END
-static ADDRESS_MAP_START( jpcoin2_io_map, AS_IO, 8, coinmstr_state )
- ADDRESS_MAP_GLOBAL_MASK(0xff)
- AM_RANGE(0xe0, 0xe0) AM_DEVWRITE("crtc", mc6845_device, address_w) /* confirmed */
- AM_RANGE(0xe1, 0xe1) AM_DEVWRITE("crtc", mc6845_device, register_w) /* confirmed */
- AM_RANGE(0xc0, 0xc1) AM_DEVWRITE("aysnd", ay8910_device, address_data_w) /* confirmed */
- AM_RANGE(0xc1, 0xc1) AM_DEVREAD("aysnd", ay8910_device, data_r) /* confirmed */
- AM_RANGE(0xc8, 0xcb) AM_DEVREADWRITE("pia0", pia6821_device, read, write) /* confirmed */
- AM_RANGE(0xd0, 0xd3) AM_DEVREADWRITE("pia1", pia6821_device, read, write) /* confirmed */
- AM_RANGE(0xd8, 0xdb) AM_DEVREADWRITE("pia2", pia6821_device, read, write) /* confirmed */
-ADDRESS_MAP_END
-
static INPUT_PORTS_START( quizmstr )
PORT_START("PIA0.A")
@@ -1060,191 +1037,6 @@ INPUT_PORTS_END
static INPUT_PORTS_START( jpcoin )
PORT_START("PIA0.A")
- PORT_DIPNAME( 0x01, 0x01, "PIA0.A" )
- PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
-
- PORT_START("PIA0.B")
- PORT_DIPNAME( 0x01, 0x01, "PIA0.B" )
- PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
-
- PORT_START("PIA1.A")
- PORT_DIPNAME( 0x01, 0x01, "PIA1.A" )
- PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
-
- PORT_START("PIA1.B")
- PORT_DIPNAME( 0x01, 0x01, "PIA1.B" )
- PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
-
- PORT_START("PIA2.A")
- PORT_DIPNAME( 0x01, 0x01, "PIA2.A" )
- PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
-
- PORT_START("PIA2.B")
- PORT_DIPNAME( 0x01, 0x01, "PIA2.B" )
- PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
-
- PORT_START("DSW1")
- PORT_DIPNAME( 0x01, 0x01, "Minimal Hand" )
- PORT_DIPSETTING( 0x01, "Jacks or Better" )
- PORT_DIPSETTING( 0x00, "Pair of Aces" )
- PORT_DIPNAME( 0x02, 0x02, "DSW1" )
- PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
-
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( jpcoin2 )
- PORT_START("PIA0.A")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POKER_HOLD1 ) PORT_NAME("Hold 1")
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_GAMBLE_BOOK ) PORT_NAME("Bookkeeping") PORT_TOGGLE
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN3 ) PORT_NAME("credits x10") // credits x10
@@ -1507,13 +1299,6 @@ static MACHINE_CONFIG_DERIVED( jpcoin, coinmstr )
// MCFG_NVRAM_ADD_0FILL("attr_ram3")
MACHINE_CONFIG_END
-static MACHINE_CONFIG_DERIVED( jpcoin2, coinmstr )
- MCFG_CPU_MODIFY("maincpu")
- MCFG_CPU_PROGRAM_MAP(jpcoin2_map)
- MCFG_CPU_IO_MAP(jpcoin2_io_map)
-// MCFG_NVRAM_ADD_0FILL("attr_ram3")
-MACHINE_CONFIG_END
-
/*
Quizmaster
@@ -1694,11 +1479,11 @@ ROM_END
ROM_START( jpcoin )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "2.bin", 0x0000, 0x2000, CRC(67e1aa60) SHA1(32301f60a7325f23047d84bb1e9416ea05753493) )
- ROM_LOAD( "1.bin", 0x2000, 0x2000, CRC(6c79e430) SHA1(56e026329ea6aba122d1f66c375bf4c3cc829feb) )
+ ROM_LOAD( "1.bin", 0x4000, 0x2000, CRC(6c79e430) SHA1(56e026329ea6aba122d1f66c375bf4c3cc829feb) )
ROM_REGION( 0x8000, "gfx1", 0 )
- ROM_LOAD( "3.bin", 0x0000, 0x4000, CRC(4984053e) SHA1(e0f7c56160f48f7b1c2c407f448c13a191770adc) ) // 1ST AND 2ND HALF IDENTICAL
- ROM_LOAD( "4.bin", 0x4000, 0x4000, CRC(2bac1c0b) SHA1(3e45fc38ed6d332e1d49b2b66bf8001610f914c5) ) // 1ST AND 2ND HALF IDENTICAL
+ ROM_LOAD( "4.bin", 0x0000, 0x4000, CRC(2bac1c0b) SHA1(3e45fc38ed6d332e1d49b2b66bf8001610f914c5) ) // 1ST AND 2ND HALF IDENTICAL
+ ROM_LOAD( "3.bin", 0x4000, 0x4000, CRC(4984053e) SHA1(e0f7c56160f48f7b1c2c407f448c13a191770adc) ) // 1ST AND 2ND HALF IDENTICAL
ROM_END
/*
@@ -1767,5 +1552,5 @@ GAME( 1985, quizmstr, 0, quizmstr, quizmstr, coinmstr_state, coinmstr, RO
GAME( 1987, trailblz, 0, trailblz, trailblz, coinmstr_state, coinmstr, ROT0, "Coinmaster", "Trail Blazer", MACHINE_UNEMULATED_PROTECTION | MACHINE_NOT_WORKING ) // or Trail Blazer 2 ?
GAME( 1989, supnudg2, 0, supnudg2, supnudg2, coinmstr_state, coinmstr, ROT0, "Coinmaster", "Super Nudger II - P173 (Version 5.21)", MACHINE_UNEMULATED_PROTECTION | MACHINE_NOT_WORKING )
GAME( 1990, pokeroul, 0, pokeroul, pokeroul, driver_device, 0, ROT0, "Coinmaster", "Poker Roulette (Version 8.22)", MACHINE_NOT_WORKING )
-GAME( 1985, jpcoin, 0, jpcoin , jpcoin, driver_device, 0, ROT0, "Coinmaster", "Joker Poker (Coinmaster set 1)", MACHINE_NOT_WORKING ) // io stuff is different at least
-GAME( 1990, jpcoin2, 0, jpcoin2, jpcoin2, driver_device, 0, ROT0, "Coinmaster", "Joker Poker (Coinmaster, Amusement Only)", 0 )
+GAME( 1985, jpcoin, 0, jpcoin, jpcoin, driver_device, 0, ROT0, "Coinmaster", "Joker Poker (Coinmaster set 1)", 0 )
+GAME( 1990, jpcoin2, 0, jpcoin, jpcoin, driver_device, 0, ROT0, "Coinmaster", "Joker Poker (Coinmaster, Amusement Only)", 0 )
diff --git a/src/mame/drivers/coinmvga.cpp b/src/mame/drivers/coinmvga.cpp
index 6d59758b421..9b0993bca4b 100644
--- a/src/mame/drivers/coinmvga.cpp
+++ b/src/mame/drivers/coinmvga.cpp
@@ -241,8 +241,6 @@ public:
m_palette2(*this, "palette2") { }
required_shared_ptr<UINT16> m_vram;
- DECLARE_WRITE8_MEMBER(debug_w);
- DECLARE_READ16_MEMBER(test_r);
DECLARE_DRIVER_INIT(colorama);
DECLARE_DRIVER_INIT(cmrltv75);
virtual void video_start() override;
diff --git a/src/mame/drivers/combatsc.cpp b/src/mame/drivers/combatsc.cpp
index 2d9323791ef..a0ca9509c9d 100644
--- a/src/mame/drivers/combatsc.cpp
+++ b/src/mame/drivers/combatsc.cpp
@@ -258,8 +258,8 @@ WRITE8_MEMBER(combatsc_state::combatsc_coin_counter_w)
/* b1: coin counter 2 */
/* b0: coin counter 1 */
- coin_counter_w(machine(), 0, data & 0x01);
- coin_counter_w(machine(), 1, data & 0x02);
+ machine().bookkeeping().coin_counter_w(0, data & 0x01);
+ machine().bookkeeping().coin_counter_w(1, data & 0x02);
}
READ8_MEMBER(combatsc_state::trackball_r)
diff --git a/src/mame/drivers/compis.cpp b/src/mame/drivers/compis.cpp
index 5286bbe7707..7432eba2781 100644
--- a/src/mame/drivers/compis.cpp
+++ b/src/mame/drivers/compis.cpp
@@ -1,13 +1,11 @@
-// license:???
-// copyright-holders:Per Ola Ingvarsson, Tomas Karlsson
+// license:BSD-3-Clause
+// copyright-holders:Curt Coder
+// thanks-to:Per Ola Ingvarsson, Tomas Karlsson
/******************************************************************************
drivers/compis.c
machine driver
- Per Ola Ingvarsson
- Tomas Karlsson
-
Hardware:
- Intel 80186 CPU 8MHz, integrated DMA(8237?), PIC(8259?), PIT(8253?)
- Intel 80130 OSP Operating system processor (PIC 8259, PIT 8254)
diff --git a/src/mame/drivers/contra.cpp b/src/mame/drivers/contra.cpp
index e10f10ca5e6..868741667dd 100644
--- a/src/mame/drivers/contra.cpp
+++ b/src/mame/drivers/contra.cpp
@@ -46,10 +46,10 @@ WRITE8_MEMBER(contra_state::contra_sh_irqtrigger_w)
WRITE8_MEMBER(contra_state::contra_coin_counter_w)
{
if (data & 0x01)
- coin_counter_w(machine(), 0, data & 0x01);
+ machine().bookkeeping().coin_counter_w(0, data & 0x01);
if (data & 0x02)
- coin_counter_w(machine(), 1, (data & 0x02) >> 1);
+ machine().bookkeeping().coin_counter_w(1, (data & 0x02) >> 1);
}
WRITE8_MEMBER(contra_state::cpu_sound_command_w)
diff --git a/src/mame/drivers/coolpool.cpp b/src/mame/drivers/coolpool.cpp
index c54ec39c031..cfdc7f36027 100644
--- a/src/mame/drivers/coolpool.cpp
+++ b/src/mame/drivers/coolpool.cpp
@@ -206,8 +206,8 @@ WRITE16_MEMBER(coolpool_state::amerdart_misc_w)
{
logerror("%08x:IOP_system_w %04x\n",space.device().safe_pc(),data);
- coin_counter_w(machine(), 0, ~data & 0x0001);
- coin_counter_w(machine(), 1, ~data & 0x0002);
+ machine().bookkeeping().coin_counter_w(0, ~data & 0x0001);
+ machine().bookkeeping().coin_counter_w(1, ~data & 0x0002);
/* bits 10-15 are counted down over time */
@@ -420,8 +420,8 @@ WRITE16_MEMBER(coolpool_state::coolpool_misc_w)
{
logerror("%08x:IOP_system_w %04x\n",space.device().safe_pc(),data);
- coin_counter_w(machine(), 0, ~data & 0x0001);
- coin_counter_w(machine(), 1, ~data & 0x0002);
+ machine().bookkeeping().coin_counter_w(0, ~data & 0x0001);
+ machine().bookkeeping().coin_counter_w(1, ~data & 0x0002);
m_dsp->set_input_line(INPUT_LINE_RESET, (data & 0x0400) ? ASSERT_LINE : CLEAR_LINE);
}
diff --git a/src/mame/drivers/coolridr.cpp b/src/mame/drivers/coolridr.cpp
index 2e5b1263a32..b6d0b5a83fd 100644
--- a/src/mame/drivers/coolridr.cpp
+++ b/src/mame/drivers/coolridr.cpp
@@ -390,16 +390,14 @@ public:
UINT8 sound_data, sound_fifo;
UINT8* m_compressedgfx;
- UINT16* m_expanded_10bit_gfx;
- UINT16* m_rearranged_16bit_gfx;
+ std::unique_ptr<UINT16[]> m_expanded_10bit_gfx;
+ std::unique_ptr<UINT16[]> m_rearranged_16bit_gfx;
UINT32 get_20bit_data(UINT32 romoffset, int _20bitwordnum);
UINT16 get_10bit_data(UINT32 romoffset, int _10bitwordnum);
DECLARE_READ32_MEMBER(sysh1_sound_dma_r);
DECLARE_WRITE32_MEMBER(sysh1_sound_dma_w);
- DECLARE_READ32_MEMBER(sysh1_ioga_r);
- DECLARE_WRITE32_MEMBER(sysh1_ioga_w);
DECLARE_READ32_MEMBER(sysh1_unk_blit_r);
DECLARE_WRITE32_MEMBER(sysh1_unk_blit_w);
DECLARE_WRITE32_MEMBER(sysh1_blit_mode_w);
@@ -407,9 +405,7 @@ public:
DECLARE_WRITE32_MEMBER(sysh1_fb_mode_w);
DECLARE_WRITE32_MEMBER(sysh1_fb_data_w);
- DECLARE_WRITE32_MEMBER(sysh1_pal_w);
DECLARE_WRITE32_MEMBER(sysh1_dma_w);
- DECLARE_WRITE32_MEMBER(sysh1_char_w);
DECLARE_READ32_MEMBER(coolridr_hack2_r);
DECLARE_READ32_MEMBER(aquastge_hack_r);
DECLARE_READ16_MEMBER(h1_soundram_r);
@@ -442,7 +438,6 @@ public:
UINT32 screen_update_coolridr1(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
UINT32 screen_update_coolridr2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void blit_current_sprite(address_space &space);
- INTERRUPT_GEN_MEMBER(system_h1);
TIMER_DEVICE_CALLBACK_MEMBER(system_h1_main);
TIMER_DEVICE_CALLBACK_MEMBER(system_h1_sub);
DECLARE_WRITE8_MEMBER(scsp_irq);
@@ -451,9 +446,9 @@ public:
int debug_randompal;
- UINT16 *m_h1_vram;
- UINT8 *m_h1_pcg;
- UINT16 *m_h1_pal;
+ std::unique_ptr<UINT16[]> m_h1_vram;
+ std::unique_ptr<UINT8[]> m_h1_pcg;
+ std::unique_ptr<UINT16[]> m_h1_pal;
int m_gfx_index;
int m_color_bank;
struct {
@@ -481,8 +476,6 @@ public:
int colbase;
};
- static int comp_sprite_z(const void *q1, const void *q2);
-
struct cool_render_object **m_cool_render_object_list1;
struct cool_render_object **m_cool_render_object_list2;
@@ -573,7 +566,7 @@ void coolridr_state::video_start()
m_screen->register_screen_bitmap(m_screen1_bitmap);
m_screen->register_screen_bitmap(m_screen2_bitmap);
- m_gfxdecode->set_gfx(m_gfx_index, global_alloc(gfx_element(m_palette, h1_tile_layout, m_h1_pcg, 0, 8, 0)));
+ m_gfxdecode->set_gfx(m_gfx_index, std::make_unique<gfx_element>(m_palette, h1_tile_layout, m_h1_pcg.get(), 0, 8, 0));
}
/*
@@ -1319,8 +1312,8 @@ void *coolridr_state::draw_object_threaded(void *param, int threadid)
- UINT16* rearranged_16bit_gfx = object->state->m_rearranged_16bit_gfx;
- UINT16* expanded_10bit_gfx = object->state->m_expanded_10bit_gfx;
+ UINT16* rearranged_16bit_gfx = object->state->m_rearranged_16bit_gfx.get();
+ UINT16* expanded_10bit_gfx = object->state->m_expanded_10bit_gfx.get();
INT16 clipminX = CLIPMINX_FULL;
INT16 clipmaxX = CLIPMAXX_FULL;
@@ -3621,7 +3614,7 @@ void coolridr_state::machine_start()
size_t size = memregion( "compressedgfx" )->bytes();
// we're expanding 10bit packed data to 16bits(10 used)
- m_expanded_10bit_gfx = auto_alloc_array(machine(), UINT16, ((size/10)*16)/2);
+ m_expanded_10bit_gfx = std::make_unique<UINT16[]>(((size/10)*16)/2);
for (int i=0;i<(0x800000*8)/2;i++)
{
@@ -3630,7 +3623,7 @@ void coolridr_state::machine_start()
// do a rearranged version too with just the 16-bit words in a different order, palettes seem to
// be referenced this way?!
- m_rearranged_16bit_gfx = auto_alloc_array(machine(), UINT16, size/2);
+ m_rearranged_16bit_gfx = std::make_unique<UINT16[]>(size/2);
UINT16* compressed = (UINT16*)memregion( "compressedgfx" )->base();
int count = 0;
@@ -3660,16 +3653,16 @@ void coolridr_state::machine_start()
{
for (int i=0;i<(0x800000*8);i++)
{
- fwrite((UINT8*)m_expanded_10bit_gfx+(i^1), 1, 1, fp);
+ fwrite((UINT8*)m_expanded_10bit_gfx.get()+(i^1), 1, 1, fp);
}
fclose(fp);
}
}
- m_h1_vram = auto_alloc_array_clear(machine(), UINT16, VRAM_SIZE);
- m_h1_pcg = auto_alloc_array_clear(machine(), UINT8, VRAM_SIZE);
- m_h1_pal = auto_alloc_array_clear(machine(), UINT16, VRAM_SIZE);
+ m_h1_vram = make_unique_clear<UINT16[]>(VRAM_SIZE);
+ m_h1_pcg = make_unique_clear<UINT8[]>(VRAM_SIZE);
+ m_h1_pal = make_unique_clear<UINT16[]>(VRAM_SIZE);
m_cool_render_object_list1 = auto_alloc_array_clear(machine(), struct cool_render_object*, 1000000);
m_listcount1 = 0;
@@ -3683,9 +3676,9 @@ void coolridr_state::machine_start()
decode[1].current_object = 0;
debug_randompal = 9;
- save_pointer(NAME(m_h1_vram), VRAM_SIZE);
- save_pointer(NAME(m_h1_pcg), VRAM_SIZE);
- save_pointer(NAME(m_h1_pal), VRAM_SIZE);
+ save_pointer(NAME(m_h1_vram.get()), VRAM_SIZE);
+ save_pointer(NAME(m_h1_pcg.get()), VRAM_SIZE);
+ save_pointer(NAME(m_h1_pal.get()), VRAM_SIZE);
}
void coolridr_state::machine_reset()
diff --git a/src/mame/drivers/cops.cpp b/src/mame/drivers/cops.cpp
index 1f3797f8d72..44529d40ae3 100644
--- a/src/mame/drivers/cops.cpp
+++ b/src/mame/drivers/cops.cpp
@@ -569,7 +569,7 @@ WRITE8_MEMBER(cops_state::io1_w)
sprintf(output_name, "digit%d", i);
display_data = m_lcd_data_l | (m_lcd_data_h << 8);
display_data = BITSWAP16(display_data, 4, 5, 12, 1, 0, 11, 10, 6, 7, 2, 9, 3, 15, 8, 14, 13);
- output_set_value(output_name, display_data);
+ output().set_value(output_name, display_data);
}
}
break;
@@ -580,23 +580,23 @@ WRITE8_MEMBER(cops_state::io1_w)
m_lcd_data_h = data;
break;
case 0x04: /* WOP4 */
- output_set_value("Offroad Right 4 Lamp", data & 0x80);
- output_set_value("Offroad Right 3 Lamp", data & 0x40);
- output_set_value("Offroad Right 2 Lamp", data & 0x20);
- output_set_value("Offroad Right 1 Lamp", data & 0x10);
- output_set_value("Offroad Left 4 Lamp", data & 0x08);
- output_set_value("Offroad Left 3 Lamp", data & 0x04);
- output_set_value("Offroad Left 2 Lamp", data & 0x02);
- output_set_value("Offroad Left 1 Lamp", data & 0x01);
+ output().set_value("Offroad Right 4 Lamp", data & 0x80);
+ output().set_value("Offroad Right 3 Lamp", data & 0x40);
+ output().set_value("Offroad Right 2 Lamp", data & 0x20);
+ output().set_value("Offroad Right 1 Lamp", data & 0x10);
+ output().set_value("Offroad Left 4 Lamp", data & 0x08);
+ output().set_value("Offroad Left 3 Lamp", data & 0x04);
+ output().set_value("Offroad Left 2 Lamp", data & 0x02);
+ output().set_value("Offroad Left 1 Lamp", data & 0x01);
break;
case 0x05: /* WOP5 */
- output_set_value("Damage Lamp", data & 0x80);
- output_set_value("Stop Lamp", data & 0x40);
- output_set_value("Gun Active Right Lamp", data & 0x20);
- output_set_value("Vest Hit 2 Lamp", data & 0x10);
- output_set_value("Vest Hit 3 Lamp", data & 0x04);
- output_set_value("Gun Active Left Lamp", data & 0x02);
- output_set_value("Vest Hit 1 Lamp", data & 0x01);
+ output().set_value("Damage Lamp", data & 0x80);
+ output().set_value("Stop Lamp", data & 0x40);
+ output().set_value("Gun Active Right Lamp", data & 0x20);
+ output().set_value("Vest Hit 2 Lamp", data & 0x10);
+ output().set_value("Vest Hit 3 Lamp", data & 0x04);
+ output().set_value("Gun Active Left Lamp", data & 0x02);
+ output().set_value("Vest Hit 1 Lamp", data & 0x01);
break;
case 0x06: /* WOP6 */
logerror("WOP6: data = %02x\n", data);
@@ -630,17 +630,17 @@ WRITE8_MEMBER(cops_state::io2_w)
switch( offset & 0x0f )
{
case 0x02:
- output_set_value("Flash Red Lamp", data & 0x01);
- output_set_value("Flash Blue Lamp", data & 0x80);
+ output().set_value("Flash Red Lamp", data & 0x01);
+ output().set_value("Flash Blue Lamp", data & 0x80);
if ( data & ~0x91 ) logerror("Unknown io2_w, offset = %02x, data = %02x\n", offset, data);
break;
case 0x04:
- output_set_value("Bullet Lamp 6", data & 0x20);
- output_set_value("Bullet Lamp 5", data & 0x10);
- output_set_value("Bullet Lamp 4", data & 0x08);
- output_set_value("Bullet Lamp 3", data & 0x04);
- output_set_value("Bullet Lamp 2", data & 0x02);
- output_set_value("Bullet Lamp 1", data & 0x01);
+ output().set_value("Bullet Lamp 6", data & 0x20);
+ output().set_value("Bullet Lamp 5", data & 0x10);
+ output().set_value("Bullet Lamp 4", data & 0x08);
+ output().set_value("Bullet Lamp 3", data & 0x04);
+ output().set_value("Bullet Lamp 2", data & 0x02);
+ output().set_value("Bullet Lamp 1", data & 0x01);
if ( data & ~0x3f ) logerror("Unknown io2_w, offset = %02x, data = %02x\n", offset, data);
break;
default:
diff --git a/src/mame/drivers/copsnrob.cpp b/src/mame/drivers/copsnrob.cpp
index d31c1d7d5b9..c53c4e8ecec 100644
--- a/src/mame/drivers/copsnrob.cpp
+++ b/src/mame/drivers/copsnrob.cpp
@@ -77,7 +77,7 @@ WRITE8_MEMBER(copsnrob_state::copsnrob_misc2_w)
{
m_misc = data & 0x7f;
/* Multi Player Start */
- set_led_status(machine(), 1, !((data >> 6) & 0x01));
+ output().set_led_value(1, !((data >> 6) & 0x01));
}
diff --git a/src/mame/drivers/corona.cpp b/src/mame/drivers/corona.cpp
index b2f752c08f7..b4037863bf3 100644
--- a/src/mame/drivers/corona.cpp
+++ b/src/mame/drivers/corona.cpp
@@ -330,7 +330,7 @@ public:
UINT8 m_blitter_y_reg;
UINT8 m_blitter_aux_reg;
UINT8 m_blitter_unk_reg;
- UINT8 *m_videobuf;
+ std::unique_ptr<UINT8[]> m_videobuf;
UINT8 m_lamp;
UINT8 m_lamp_old;
int m_input_selector;
@@ -462,7 +462,7 @@ WRITE8_MEMBER(corona_state::blitter_trig_wdht_w)
void corona_state::video_start()
{
- m_videobuf = auto_alloc_array_clear(machine(), UINT8, VIDEOBUF_SIZE);
+ m_videobuf = make_unique_clear<UINT8[]>(VIDEOBUF_SIZE);
}
UINT32 corona_state::screen_update_winner(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
@@ -509,8 +509,8 @@ WRITE8_MEMBER(corona_state::ball_w)
{
m_lamp = data;
- output_set_lamp_value(data, 1);
- output_set_lamp_value(m_lamp_old, 0);
+ output().set_lamp_value(data, 1);
+ output().set_lamp_value(m_lamp_old, 0);
m_lamp_old = m_lamp;
}
@@ -545,8 +545,8 @@ WRITE8_MEMBER(corona_state::mux_port_w)
*/
m_input_selector = (data ^ 0xff) & 0x3f; /* Input Selector, */
- coin_counter_w(machine(), 0, (data ^ 0xff) & 0x40); /* Credits In (mechanical meters) */
- coin_counter_w(machine(), 1, (data ^ 0xff) & 0x80); /* Credits Out (mechanical meters) */
+ machine().bookkeeping().coin_counter_w(0, (data ^ 0xff) & 0x40); /* Credits In (mechanical meters) */
+ machine().bookkeeping().coin_counter_w(1, (data ^ 0xff) & 0x80); /* Credits Out (mechanical meters) */
// logerror("muxsel: %02x \n", m_input_selector);
}
@@ -564,9 +564,9 @@ WRITE8_MEMBER(corona_state::wc_meters_w)
Data is written inverted.
*/
- coin_counter_w(machine(), 0, (data ^ 0xff) & 0x01); /* Credits In */
- coin_counter_w(machine(), 1, (data ^ 0xff) & 0x02); /* Credits In (through Coin 3) */
- coin_counter_w(machine(), 2, (data ^ 0xff) & 0x04); /* Credits Out */
+ machine().bookkeeping().coin_counter_w(0, (data ^ 0xff) & 0x01); /* Credits In */
+ machine().bookkeeping().coin_counter_w(1, (data ^ 0xff) & 0x02); /* Credits In (through Coin 3) */
+ machine().bookkeeping().coin_counter_w(2, (data ^ 0xff) & 0x04); /* Credits Out */
// popmessage("meters: %02x", (data ^ 0xff));
}
diff --git a/src/mame/drivers/cosmicos.cpp b/src/mame/drivers/cosmicos.cpp
index 8ec2903c821..dd84a091687 100644
--- a/src/mame/drivers/cosmicos.cpp
+++ b/src/mame/drivers/cosmicos.cpp
@@ -158,7 +158,7 @@ WRITE8_MEMBER( cosmicos_state::segment_w )
if ((m_counter > 0) && (m_counter < 9))
{
- output_set_digit_value(10 - m_counter, data);
+ output().set_digit_value(10 - m_counter, data);
}
}
@@ -201,7 +201,7 @@ INPUT_CHANGED_MEMBER( cosmicos_state::data )
if (!BIT(data, i))
{
m_data |= (1 << i);
- output_set_led_value(LED_D0 - i, 1);
+ output().set_led_value(LED_D0 - i, 1);
}
}
}
@@ -221,29 +221,29 @@ INPUT_CHANGED_MEMBER( cosmicos_state::single_step )
void cosmicos_state::set_cdp1802_mode(int mode)
{
- output_set_led_value(LED_RUN, 0);
- output_set_led_value(LED_LOAD, 0);
- output_set_led_value(LED_PAUSE, 0);
- output_set_led_value(LED_RESET, 0);
+ output().set_led_value(LED_RUN, 0);
+ output().set_led_value(LED_LOAD, 0);
+ output().set_led_value(LED_PAUSE, 0);
+ output().set_led_value(LED_RESET, 0);
switch (mode)
{
case MODE_RUN:
- output_set_led_value(LED_RUN, 1);
+ output().set_led_value(LED_RUN, 1);
m_wait = 1;
m_clear = 1;
break;
case MODE_LOAD:
- output_set_led_value(LED_LOAD, 1);
+ output().set_led_value(LED_LOAD, 1);
m_wait = 0;
m_clear = 0;
break;
case MODE_PAUSE:
- output_set_led_value(LED_PAUSE, 1);
+ output().set_led_value(LED_PAUSE, 1);
m_wait = 1;
m_clear = 0;
@@ -257,7 +257,7 @@ void cosmicos_state::set_cdp1802_mode(int mode)
m_clear = 0;
m_boot = 1;
- output_set_led_value(LED_RESET, 1);
+ output().set_led_value(LED_RESET, 1);
break;
}
}
@@ -275,7 +275,7 @@ void cosmicos_state::clear_input_data()
for (i = 0; i < 8; i++)
{
- output_set_led_value(LED_D0 - i, 0);
+ output().set_led_value(LED_D0 - i, 0);
}
}
@@ -353,7 +353,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(cosmicos_state::digit_tick)
{
m_digit = !m_digit;
- output_set_digit_value(m_digit, m_segment);
+ output().set_digit_value(m_digit, m_segment);
}
TIMER_DEVICE_CALLBACK_MEMBER(cosmicos_state::int_tick)
@@ -395,7 +395,7 @@ READ_LINE_MEMBER( cosmicos_state::ef2_r )
UINT8 special = m_special->read();
int casin = (m_cassette)->input() < 0.0;
- output_set_led_value(LED_CASSETTE, casin);
+ output().set_led_value(LED_CASSETTE, casin);
return BIT(special, 1) | BIT(special, 3) | casin;
}
diff --git a/src/mame/drivers/cp1.cpp b/src/mame/drivers/cp1.cpp
index 825b39e36c0..bf7e382819e 100644
--- a/src/mame/drivers/cp1.cpp
+++ b/src/mame/drivers/cp1.cpp
@@ -185,12 +185,12 @@ WRITE8_MEMBER(cp1_state::i8155_porta_w)
if (m_7seg)
{
- if (!(m_matrix & 0x01)) output_set_digit_value(5, data);
- if (!(m_matrix & 0x02)) output_set_digit_value(4, data);
- if (!(m_matrix & 0x04)) output_set_digit_value(3, data);
- if (!(m_matrix & 0x08)) output_set_digit_value(2, data | 0x80); // this digit has always the dot active
- if (!(m_matrix & 0x10)) output_set_digit_value(1, data);
- if (!(m_matrix & 0x20)) output_set_digit_value(0, data);
+ if (!(m_matrix & 0x01)) output().set_digit_value(5, data);
+ if (!(m_matrix & 0x02)) output().set_digit_value(4, data);
+ if (!(m_matrix & 0x04)) output().set_digit_value(3, data);
+ if (!(m_matrix & 0x08)) output().set_digit_value(2, data | 0x80); // this digit has always the dot active
+ if (!(m_matrix & 0x10)) output().set_digit_value(1, data);
+ if (!(m_matrix & 0x20)) output().set_digit_value(0, data);
}
m_7seg ^= 0x01;
diff --git a/src/mame/drivers/cps1.cpp b/src/mame/drivers/cps1.cpp
index 2380fe10eb5..d0aefe36539 100644
--- a/src/mame/drivers/cps1.cpp
+++ b/src/mame/drivers/cps1.cpp
@@ -1,4 +1,4 @@
-// license:???
+// license:BSD-3-Clause
// copyright-holders:Paul Leaman
/***************************************************************************
@@ -331,10 +331,10 @@ WRITE16_MEMBER(cps_state::cps1_coinctrl_w)
{
if (ACCESSING_BITS_8_15)
{
- coin_counter_w(machine(), 0, data & 0x0100);
- coin_counter_w(machine(), 1, data & 0x0200);
- coin_lockout_w(machine(), 0, ~data & 0x0400);
- coin_lockout_w(machine(), 1, ~data & 0x0800);
+ machine().bookkeeping().coin_counter_w(0, data & 0x0100);
+ machine().bookkeeping().coin_counter_w(1, data & 0x0200);
+ machine().bookkeeping().coin_lockout_w(0, ~data & 0x0400);
+ machine().bookkeeping().coin_lockout_w(1, ~data & 0x0800);
// bit 15 = CPS-A custom reset?
}
@@ -344,10 +344,10 @@ WRITE16_MEMBER(cps_state::cpsq_coinctrl2_w)
{
if (ACCESSING_BITS_0_7)
{
- coin_counter_w(machine(), 2, data & 0x01);
- coin_lockout_w(machine(), 2, ~data & 0x02);
- coin_counter_w(machine(), 3, data & 0x04);
- coin_lockout_w(machine(), 3, ~data & 0x08);
+ machine().bookkeeping().coin_counter_w(2, data & 0x01);
+ machine().bookkeeping().coin_lockout_w(2, ~data & 0x02);
+ machine().bookkeeping().coin_counter_w(3, data & 0x04);
+ machine().bookkeeping().coin_lockout_w(3, ~data & 0x08);
}
}
@@ -4004,6 +4004,50 @@ ROM_START( striderua )
ROM_LOAD( "lwio.11e", 0x0000, 0x0117, CRC(ad52b90c) SHA1(f0fd6aeea515ee449320fe15684e6b3ab7f97bf4) )
ROM_END
+// 90629B-3 PCB - Converted from an SF2 'inhouse' (but with no official labels etc.)
+// actually an incomplete conversion, layer enables are wrong in a number of places which causes the game to break even on real hardware.
+// this is essentially a Capcom made bootleg of a Capcom game.
+ROM_START( strideruc )
+ ROM_REGION( CODE_SIZE, "maincpu", 0 ) /* 68000 code */
+ ROM_LOAD16_WORD_SWAP( "34.8f", 0x000000, 0x80000, CRC(e0fb5657) SHA1(6c7f668220de80169feea35371aff363f67f7b0c) )
+ ROM_LOAD16_WORD_SWAP( "33.6f", 0x080000, 0x80000, CRC(9b3cfc08) SHA1(a7d7f270a097437affa845d80bed82a1fa874878) )
+
+ ROM_REGION( 0x400000, "gfx", 0 )
+ ROMX_LOAD( "6.8a", 0x000000, 0x80000, CRC(4eee9aea) SHA1(5e619fd5f3f1181e32a8fd9dbb4661d74ff8a484) , ROM_GROUPWORD | ROM_SKIP(6) )
+ ROMX_LOAD( "8.10a", 0x000002, 0x80000, CRC(2d7f21e4) SHA1(593cec513de40ff802084d54313bb25a4561e25d) , ROM_GROUPWORD | ROM_SKIP(6) )
+ ROMX_LOAD( "5.7a", 0x000004, 0x80000, CRC(7705aa46) SHA1(6cbfa30b2852fd117d117beefba434ce41d24c2f) , ROM_GROUPWORD | ROM_SKIP(6) )
+ ROMX_LOAD( "7.9a", 0x000006, 0x80000, CRC(5b18b722) SHA1(cf71c62348ca6b404279e87a6686cb3a842eb381) , ROM_GROUPWORD | ROM_SKIP(6) )
+ ROMX_LOAD( "15.8c", 0x200000, 0x80000, CRC(005f000b) SHA1(e6f65af7cc3295be9efaaded352e7ae6320b4133) , ROM_GROUPWORD | ROM_SKIP(6) )
+ ROMX_LOAD( "17.10c", 0x200002, 0x80000, CRC(b9441519) SHA1(bb0926dc484dae4f64c5e5a6bce20afdc7aeba55) , ROM_GROUPWORD | ROM_SKIP(6) )
+ ROMX_LOAD( "14.7c", 0x200004, 0x80000, CRC(b7d04e8b) SHA1(5c5a079baa694927c33d0e0c23e5ff09d6c9d985) , ROM_GROUPWORD | ROM_SKIP(6) )
+ ROMX_LOAD( "16.9c", 0x200006, 0x80000, CRC(6b4713b4) SHA1(759b8b1fc7a5c4b00d74a27c2dd11667db44b09e) , ROM_GROUPWORD | ROM_SKIP(6) )
+
+ ROM_REGION( 0x18000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */
+ ROM_LOAD( "9.12a", 0x00000, 0x08000, CRC(08d63519) SHA1(c120ecfe25c3c50bc51bc7d5a9ef1c8ca6591240) )
+ ROM_CONTINUE( 0x10000, 0x08000 )
+
+ ROM_REGION( 0x40000, "oki", 0 ) /* Samples */
+ ROM_LOAD( "18.11c", 0x00000, 0x20000, CRC(4386bc80) SHA1(fb2b261995aeacfa13e7ee40b1a973dfb178f015) )
+ ROM_LOAD( "19.12c", 0x20000, 0x20000, CRC(444536d7) SHA1(a14f5de2f6b5b29ae5161dca1f8c08c566301a91) )
+
+ // which of these should we be using?
+ /*
+ ROM_REGION( 0x0200, "aboardplds", ROMREGION_ERASE00 )
+ ROM_LOAD( "buf1", 0x0000, 0x0117, CRC(eb122de7) SHA1(b26b5bfe258e3e184f069719f9fd008d6b8f6b9b) )
+ ROM_LOAD( "ioa1", 0x0000, 0x0117, CRC(59c7ee3b) SHA1(fbb887c5b4f5cb8df77cec710eaac2985bc482a6) )
+ ROM_LOAD( "prg1", 0x0000, 0x0117, CRC(f1129744) SHA1(a5300f301c1a08a7da768f0773fa0fe3f683b237) )
+ ROM_LOAD( "rom1", 0x0000, 0x0117, CRC(41dc73b9) SHA1(7d4c9f1693c821fbf84e32dd6ef62ddf14967845) )
+ ROM_LOAD( "sou1", 0x0000, 0x0117, CRC(84f4b2fe) SHA1(dcc9e86cc36316fe42eace02d6df75d08bc8bb6d) )
+
+ ROM_REGION( 0x0200, "bboardplds", ROMREGION_ERASE00 )
+ ROM_LOAD( "stf29.1a", 0x0000, 0x0117, CRC(043309c5) SHA1(f6b9610c9f896c495041ba56a654776a521c356b) )
+ ROM_LOAD( "iob1.11d", 0x0000, 0x0117, CRC(3abc0700) SHA1(973043aa46ec6d5d1db20dc9d5937005a0f9f6ae) )
+
+ ROM_REGION( 0x0200, "cboardplds", ROMREGION_ERASE00 )
+ ROM_LOAD( "c632.ic1", 0x0000, 0x0117, CRC(0fbd9270) SHA1(d7e737b20c44d41e29ca94be56114b31934dde81) )
+ */
+ROM_END
+
/* B-Board 88622B-3 */
ROM_START( striderj )
ROM_REGION( CODE_SIZE, "maincpu", 0 ) /* 68000 code */
@@ -9001,6 +9045,48 @@ ROM_START( sf2ceblp )
ROM_LOAD( "pic16c55", 0x00000, 0x2000, BAD_DUMP CRC(f22e2311) SHA1(320edfba140728599e91c01e863a8b6d071e4bbf) )
ROM_END
+
+
+ROM_START( sf2cebltw )
+ ROM_REGION( CODE_SIZE, "maincpu", 0 ) /* 68000 code */
+ ROM_LOAD16_BYTE( "27.12e", 0x000000, 0x20000, CRC(035ee5d9) SHA1(9d268333db96dc6d1539ea938d3b213482e276c6) )
+ ROM_LOAD16_BYTE( "31.12f", 0x000001, 0x20000, CRC(353dbde1) SHA1(039785f8863fda945267fc8b9cf640d954ea9803) )
+ ROM_LOAD16_BYTE( "24.9e", 0x040000, 0x20000, CRC(005b54cc) SHA1(3d3d7742c11f31cc62d81931dc970cd1f4a26835) )
+ ROM_LOAD16_BYTE( "28.9f", 0x040001, 0x20000, CRC(c184d26d) SHA1(b1011e869d0b84c1ab609fcf193b46c7d9cc3b28) )
+ ROM_LOAD16_BYTE( "25.10e", 0x080000, 0x20000, CRC(524f5c55) SHA1(67adfd36bb325c4a6d3e1e5b668c4dc983ac0a62) )
+ ROM_LOAD16_BYTE( "29.10f", 0x080001, 0x20000, CRC(f06a12f2) SHA1(ddc431ce01392d4a7562760743abd9ea73b06cf3) )
+ ROM_LOAD16_BYTE( "26.11e", 0x0c0000, 0x20000, CRC(8312d055) SHA1(e36c23c197096d50d71ceefbf93205d5758153e0) )
+ ROM_LOAD16_BYTE( "30.11f", 0x0c0001, 0x20000, CRC(d0580ff2) SHA1(1b2e4c4abbe90a68283c86e7cb5328b242be5683) )
+ ROM_LOAD16_WORD_SWAP( "s92_21a.5f", 0x100000, 0x80000, CRC(925a7877) SHA1(1960dca35f0ca6f2b399a9fccfbc0132ac6425d1) )
+
+ ROM_REGION( 0x40000, "pal", 0 )
+ ROM_LOAD( "bruteforce.palce16v8h-25.11d", 0x00000, 0x40000, CRC(430f722d) SHA1(b0c0570057c782b1114819fae907f45a01c55065) )
+
+ ROM_REGION( 0x600000, "gfx", 0 )
+ ROMX_LOAD( "s92_01.bin", 0x000000, 0x80000, CRC(03b0d852) SHA1(f370f25c96ad2b94f8c53d6b7139100285a25bef) , ROM_GROUPWORD | ROM_SKIP(6) )
+ ROMX_LOAD( "s92_02.bin", 0x000002, 0x80000, CRC(840289ec) SHA1(2fb42a242f60ba7e74009b5a90eb26e035ba1e82) , ROM_GROUPWORD | ROM_SKIP(6) )
+ ROMX_LOAD( "s92_03.bin", 0x000004, 0x80000, CRC(cdb5f027) SHA1(4c7d944fef200fdfcaf57758b901b5511188ed2e) , ROM_GROUPWORD | ROM_SKIP(6) )
+ ROMX_LOAD( "s92_04.bin", 0x000006, 0x80000, CRC(e2799472) SHA1(27d3796429338d82a8de246a0ea06dd487a87768) , ROM_GROUPWORD | ROM_SKIP(6) )
+ ROMX_LOAD( "s92_05.bin", 0x200000, 0x80000, CRC(ba8a2761) SHA1(4b696d66c51611e43522bed752654314e76d33b6) , ROM_GROUPWORD | ROM_SKIP(6) )
+ ROMX_LOAD( "s92_06.bin", 0x200002, 0x80000, CRC(e584bfb5) SHA1(ebdf1f5e2638eed3a65dda82b1ed9151a355f4c9) , ROM_GROUPWORD | ROM_SKIP(6) )
+ ROMX_LOAD( "s92_07.bin", 0x200004, 0x80000, CRC(21e3f87d) SHA1(4a4961bb68c3a1ce15f9d393d9c03ecb2466cc29) , ROM_GROUPWORD | ROM_SKIP(6) )
+ ROMX_LOAD( "s92_08.bin", 0x200006, 0x80000, CRC(befc47df) SHA1(520390420da3a0271ba90b0a933e65143265e5cf) , ROM_GROUPWORD | ROM_SKIP(6) )
+ ROMX_LOAD( "s92_10.bin", 0x400000, 0x80000, CRC(960687d5) SHA1(2868c31121b1c7564e9767b9a19cdbf655c7ed1d) , ROM_GROUPWORD | ROM_SKIP(6) )
+ ROMX_LOAD( "s92_11.bin", 0x400002, 0x80000, CRC(978ecd18) SHA1(648a59706b93c84b4206a968ecbdc3e834c476f6) , ROM_GROUPWORD | ROM_SKIP(6) )
+ ROMX_LOAD( "s92_12.bin", 0x400004, 0x80000, CRC(d6ec9a0a) SHA1(ed6143f8737013b6ef1684e37c05e037e7a80dae) , ROM_GROUPWORD | ROM_SKIP(6) )
+ ROMX_LOAD( "s92_13.bin", 0x400006, 0x80000, CRC(ed2c67f6) SHA1(0083c0ffaf6fe7659ff0cf822be4346cd6e61329) , ROM_GROUPWORD | ROM_SKIP(6) )
+
+ ROM_REGION( 0x18000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */
+ ROM_LOAD( "s92_09.bin", 0x00000, 0x08000, CRC(08f6b60e) SHA1(8258fcaca4ac419312531eec67079b97f471179c) )
+ ROM_CONTINUE( 0x10000, 0x08000 )
+
+ ROM_REGION( 0x40000, "oki", 0 ) /* Samples */
+ ROM_LOAD( "s92_18.bin", 0x00000, 0x20000, CRC(7f162009) SHA1(346bf42992b4c36c593e21901e22c87ae4a7d86d) )
+ ROM_LOAD( "s92_19.bin", 0x20000, 0x20000, CRC(beade53f) SHA1(277c397dc12752719ec6b47d2224750bd1c07f79) )
+ROM_END
+
+
+
ROM_START( sf2amf )
/* the PCB is not working on real hardware */
ROM_REGION( CODE_SIZE, "maincpu", 0 ) /* 68000 code */
@@ -11809,10 +11895,10 @@ DRIVER_INIT_MEMBER( cps_state, sf2m8 )
void cps_state::kabuki_setup(void (*decode)(UINT8 *src, UINT8 *dst))
{
- UINT8 *decrypt = auto_alloc_array(machine(), UINT8, 0x8000);
+ m_decrypt_kabuki = std::make_unique<UINT8[]>(0x8000);
UINT8 *rom = memregion("audiocpu")->base();
- decode(rom, decrypt);
- membank("decrypted")->set_base(decrypt);
+ decode(rom, m_decrypt_kabuki.get());
+ membank("decrypted")->set_base(m_decrypt_kabuki.get());
}
DRIVER_INIT_MEMBER(cps_state,wof)
@@ -11941,6 +12027,7 @@ GAME( 1988, daimakai, ghouls, cps1_10MHz, daimakai, cps_state, cps1,
GAME( 1988, daimakair, ghouls, cps1_12MHz, daimakai, cps_state, cps1, ROT0, "Capcom", "Daimakaimura (Japan Resale Ver.)", MACHINE_SUPPORTS_SAVE ) // Wed.26.10.1988 in the ROMs // 12MHz verified
GAME( 1989, strider, 0, cps1_10MHz, strider, cps_state, cps1, ROT0, "Capcom", "Strider (USA, B-Board 89624B-2)", MACHINE_SUPPORTS_SAVE )
GAME( 1989, striderua, strider, cps1_10MHz, stridrua, cps_state, cps1, ROT0, "Capcom", "Strider (USA, B-Board 89624B-3)", MACHINE_SUPPORTS_SAVE )
+GAME( 1989, strideruc, strider, cps1_10MHz, stridrua, cps_state, cps1, ROT0, "bootleg (Capcom)", "Strider (USA, B-Board 90629B-3, buggy Street Fighter II conversion)", MACHINE_SUPPORTS_SAVE ) // various bugs even on PCB, see rom load
GAME( 1989, striderj, strider, cps1_10MHz, strider, cps_state, cps1, ROT0, "Capcom", "Strider Hiryu (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1989, striderjr, strider, cps1_12MHz, strider, cps_state, cps1, ROT0, "Capcom", "Strider Hiryu (Japan Resale Ver.)", MACHINE_SUPPORTS_SAVE ) // 12MHz verified
GAME( 1989, dynwar, 0, cps1_10MHz, dynwar, cps_state, cps1, ROT0, "Capcom", "Dynasty Wars (USA, B-Board 89624B-?)", MACHINE_SUPPORTS_SAVE ) // (c) Capcom U.S.A.
@@ -12055,6 +12142,7 @@ GAME( 1992, sf2amf, sf2ce, cps1_12MHz, sf2amf, cps_state, sf2hack,
GAME( 1992, sf2amf2, sf2ce, cps1_12MHz, sf2hack, cps_state, sf2hack, ROT0, "bootleg", "Street Fighter II': Champion Edition (L735 Test Rom, bootleg)", MACHINE_SUPPORTS_SAVE ) // 920313 - based on World version
GAME( 1992, sf2dkot2, sf2ce, cps1_12MHz, sf2, cps_state, cps1, ROT0, "bootleg", "Street Fighter II': Champion Edition (Double K.O. Turbo II, bootleg)", MACHINE_SUPPORTS_SAVE ) // 902140 !!! - based on USA version
GAME( 1992, sf2ceblp, sf2ce, cps1_10MHz, sf2, cps_state, sf2ceblp, ROT0, "bootleg", "Street Fighter II': Champion Edition (protected bootleg on non-dash board)", MACHINE_SUPPORTS_SAVE ) // 920313 - based on USA version
+GAME( 1992, sf2cebltw, sf2ce, cps1_12MHz, sf2, cps_state, cps1, ROT0, "bootleg", "Street Fighter II': Champion Edition ('Taiwan' bootleg with PAL)", MACHINE_SUPPORTS_SAVE ) // 'Taiwan'
GAME( 1992, sf2m2, sf2ce, cps1_12MHz, sf2m2, cps_state, sf2hack, ROT0, "bootleg", "Street Fighter II': Champion Edition (M2, bootleg)", MACHINE_SUPPORTS_SAVE ) // 920313 - based on World version
GAME( 1992, sf2m3, sf2ce, sf2m3, sf2, cps_state, cps1, ROT0, "bootleg", "Street Fighter II': Champion Edition (M3, bootleg)", MACHINE_SUPPORTS_SAVE ) // 920313 - based on USA version
GAME( 1992, sf2m4, sf2ce, cps1_12MHz, sf2m4, cps_state, sf2hack, ROT0, "bootleg", "Street Fighter II': Champion Edition (M4, bootleg)", MACHINE_SUPPORTS_SAVE ) // 920322 - based on Japan version
@@ -12062,7 +12150,7 @@ GAME( 1992, sf2m5, sf2ce, cps1_12MHz, sf2hack, cps_state, sf2hack,
GAME( 1992, sf2m6, sf2ce, cps1_12MHz, sf2hack, cps_state, sf2hack, ROT0, "bootleg", "Street Fighter II': Champion Edition (M6, bootleg)", MACHINE_SUPPORTS_SAVE ) // 811102 !!! - based on World version
GAME( 1992, sf2m7, sf2ce, cps1_12MHz, sf2hack, cps_state, sf2hack, ROT0, "bootleg", "Street Fighter II': Champion Edition (M7, bootleg)", MACHINE_SUPPORTS_SAVE ) // 920313 - based on World version
GAME( 1992, sf2m8, sf2ce, sf2m3, sf2, cps_state, sf2m8, ROT0, "bootleg", "Street Fighter II': Champion Edition (M8, bootleg)", MACHINE_SUPPORTS_SAVE ) // 920313 - based on USA version
-GAME( 1992, sf2m10, sf2ce, sf2m10, sf2, cps_state, cps1, ROT0, "bootleg", "Street Fighter II': Champion Edition (M10, bootleg)", MACHINE_SUPPORTS_SAVE )
+GAME( 1992, sf2m10, sf2ce, sf2m10, sf2hack, cps_state, cps1, ROT0, "bootleg", "Street Fighter II': Champion Edition (M10, bootleg)", MACHINE_SUPPORTS_SAVE )
GAME( 1992, sf2yyc, sf2ce, cps1_12MHz, sf2hack, cps_state, sf2hack, ROT0, "bootleg", "Street Fighter II': Champion Edition (YYC, bootleg)", MACHINE_SUPPORTS_SAVE ) // 920313 - based on World version
GAME( 1992, sf2koryu, sf2ce, cps1_12MHz, sf2hack, cps_state, sf2hack, ROT0, "bootleg", "Street Fighter II': Champion Edition (Xiang Long, Chinese bootleg)", MACHINE_SUPPORTS_SAVE ) // 811102 !!! - based on World version
GAME( 1992, sf2dongb, sf2ce, cps1_12MHz, sf2, cps_state, sf2dongb, ROT0, "bootleg", "Street Fighter II': Champion Edition (Dongfang Bubai protection, bootleg)", MACHINE_SUPPORTS_SAVE ) // 920313 - based on World version
diff --git a/src/mame/drivers/cps2.cpp b/src/mame/drivers/cps2.cpp
index 248160d3134..c6719a958e7 100644
--- a/src/mame/drivers/cps2.cpp
+++ b/src/mame/drivers/cps2.cpp
@@ -1,4 +1,4 @@
-// license:???
+// license:BSD-3-Clause
// copyright-holders:Paul Leaman, Andreas Naive, Nicola Salmoria
/***************************************************************************
@@ -749,7 +749,7 @@ WRITE16_MEMBER( cps_state::cps2_eeprom_port_w )
if (m_audiocpu != nullptr)
m_audiocpu->set_input_line(INPUT_LINE_RESET, (data & 0x0008) ? CLEAR_LINE : ASSERT_LINE);
- coin_counter_w(machine(), 0, data & 0x0001);
+ machine().bookkeeping().coin_counter_w(0, data & 0x0001);
if (m_cps2_dial_type == 1) // pzloop2
{
// Puzz Loop 2 uses coin counter 2 input to switch between stick and paddle controls
@@ -757,28 +757,28 @@ WRITE16_MEMBER( cps_state::cps2_eeprom_port_w )
}
else
{
- coin_counter_w(machine(), 1, data & 0x0002);
+ machine().bookkeeping().coin_counter_w(1, data & 0x0002);
}
if (strncmp(machine().system().name, "mmatrix", 7) == 0) // Mars Matrix seems to require the coin lockout bit to be reversed
{
- coin_lockout_w(machine(), 0, data & 0x0010);
- coin_lockout_w(machine(), 1, data & 0x0020);
- coin_lockout_w(machine(), 2, data & 0x0040);
- coin_lockout_w(machine(), 3, data & 0x0080);
+ machine().bookkeeping().coin_lockout_w(0, data & 0x0010);
+ machine().bookkeeping().coin_lockout_w(1, data & 0x0020);
+ machine().bookkeeping().coin_lockout_w(2, data & 0x0040);
+ machine().bookkeeping().coin_lockout_w(3, data & 0x0080);
}
else
{
- coin_lockout_w(machine(), 0, ~data & 0x0010);
- coin_lockout_w(machine(), 1, ~data & 0x0020);
- coin_lockout_w(machine(), 2, ~data & 0x0040);
- coin_lockout_w(machine(), 3, ~data & 0x0080);
+ machine().bookkeeping().coin_lockout_w(0, ~data & 0x0010);
+ machine().bookkeeping().coin_lockout_w(1, ~data & 0x0020);
+ machine().bookkeeping().coin_lockout_w(2, ~data & 0x0040);
+ machine().bookkeeping().coin_lockout_w(3, ~data & 0x0080);
}
/*
- set_led_status(machine(), 0, data & 0x01);
- set_led_status(machine(), 1, data & 0x10);
- set_led_status(machine(), 2, data & 0x20);
+ output().set_led_value(0, data & 0x01);
+ output().set_led_value(1, data & 0x10);
+ output().set_led_value(2, data & 0x20);
*/
}
}
@@ -910,7 +910,7 @@ READ16_MEMBER(cps_state::joy_or_paddle_ecofghtr_r)
else if ((dial1 & 0x800) < (m_ecofghtr_dial_last1 & 0x800)) // value gone from 0xfff to 0x000
{
m_ecofghtr_dial_direction1 = 1;
- }
+ }
m_ecofghtr_dial_last0 = dial0;
m_ecofghtr_dial_last1 = dial1;
@@ -5857,6 +5857,41 @@ ROM_START( ringdesta )
RINGDEST_ASIA_KEY
ROM_END
+ROM_START( ringdesth )
+ ROM_REGION( CODE_SIZE, "maincpu", 0 ) /* 68000 code */
+ ROM_LOAD16_WORD_SWAP( "smbh.03b", 0x000000, 0x80000, CRC(2e316584) SHA1(7a7c2ec21bd46d784c2971e1dbb8d8312362371a) )
+ ROM_LOAD16_WORD_SWAP( "smbh.04b", 0x080000, 0x80000, CRC(9950a23a) SHA1(5afd12ae7f3e7283ba42f844f2ee5a96875dc74e) )
+ ROM_LOAD16_WORD_SWAP( "smbh.05b", 0x100000, 0x80000, CRC(41e0b3fc) SHA1(67fea6e194650c2a45cc0408ab1b0c2743ec6efa) )
+ ROM_LOAD16_WORD_SWAP( "smbh.06b", 0x180000, 0x80000, CRC(89c80007) SHA1(4c85aa5b224fdbb64f719a7b8b5b2e7413107c70) )
+ ROM_LOAD16_WORD_SWAP( "smbh.07b", 0x200000, 0x80000, CRC(b9a11577) SHA1(e9b58ef8acd1fedd3c9e0a3489593c7e931106c0) )
+ ROM_LOAD16_WORD_SWAP( "smbh.08b", 0x280000, 0x80000, CRC(f931b76b) SHA1(0b7e8d1278dcba89f0063bd09cda96d6ae1bc282) )
+
+ ROM_REGION( 0x1200000, "gfx", 0 )
+ ROMX_LOAD( "smb.13m", 0x0000000, 0x200000, CRC(d9b2d1de) SHA1(e8658983070dadcd1300a680a42c8431579e2b4f) , ROM_GROUPWORD | ROM_SKIP(6) )
+ ROMX_LOAD( "smb.15m", 0x0000002, 0x200000, CRC(9a766d92) SHA1(afdf88afbec527268d63c11ea32f861b52e11489) , ROM_GROUPWORD | ROM_SKIP(6) )
+ ROMX_LOAD( "smb.17m", 0x0000004, 0x200000, CRC(51800f0f) SHA1(9526cd69a23340a81841271b51de03d9bf2b979f) , ROM_GROUPWORD | ROM_SKIP(6) )
+ ROMX_LOAD( "smb.19m", 0x0000006, 0x200000, CRC(35757e96) SHA1(c915f3b9e4fdec3defc7eecb2c1f7377e6072228) , ROM_GROUPWORD | ROM_SKIP(6) )
+ ROMX_LOAD( "smb.14m", 0x0800000, 0x200000, CRC(e5bfd0e7) SHA1(327e626df4c2152f921f15535c01dda6c4437527) , ROM_GROUPWORD | ROM_SKIP(6) )
+ ROMX_LOAD( "smb.16m", 0x0800002, 0x200000, CRC(c56c0866) SHA1(1e2218e852ae72a9a95861dd37129fe78d4b1329) , ROM_GROUPWORD | ROM_SKIP(6) )
+ ROMX_LOAD( "smb.18m", 0x0800004, 0x200000, CRC(4ded3910) SHA1(d883541ce4d83f4e7ab095f2ef273408d9911f9a) , ROM_GROUPWORD | ROM_SKIP(6) )
+ ROMX_LOAD( "smb.20m", 0x0800006, 0x200000, CRC(26ea1ec5) SHA1(22be249b1f73272feacf4026f09fc877f5d86353) , ROM_GROUPWORD | ROM_SKIP(6) )
+ ROMX_LOAD( "smb.21m", 0x1000000, 0x080000, CRC(0a08c5fc) SHA1(ff3fad4fbc98e3013291c7ba7ee5e057a2628b36) , ROM_GROUPWORD | ROM_SKIP(6) )
+ ROMX_LOAD( "smb.23m", 0x1000002, 0x080000, CRC(0911b6c4) SHA1(e7a7061b192658724d98cae8693f63dd5bc40c00) , ROM_GROUPWORD | ROM_SKIP(6) )
+ ROMX_LOAD( "smb.25m", 0x1000004, 0x080000, CRC(82d6c4ec) SHA1(ed8ed02a00f59a048b9891ec2a77720bb6a5e03d) , ROM_GROUPWORD | ROM_SKIP(6) )
+ ROMX_LOAD( "smb.27m", 0x1000006, 0x080000, CRC(9b48678b) SHA1(4fa300d356c538947983ae85bb5c5cfd1fb835e7) , ROM_GROUPWORD | ROM_SKIP(6) )
+
+ ROM_REGION( QSOUND_SIZE, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */
+ ROM_LOAD( "smb.01", 0x00000, 0x08000, CRC(0abc229a) SHA1(967f574e6358dfc1b01e6a4a4df1a8f34eb3d814) )
+ ROM_CONTINUE( 0x10000, 0x18000 )
+ ROM_LOAD( "smb.02", 0x28000, 0x20000, CRC(d051679a) SHA1(583c2521a30db1740d95dd94a38751fbeff3aae5) )
+
+ ROM_REGION( 0x400000, "qsound", 0 ) /* QSound samples */
+ ROM_LOAD16_WORD_SWAP( "smb.11m", 0x000000, 0x200000, CRC(c56935f9) SHA1(ca1705e48e31ddc13505e6297bceca2bec1bb209) )
+ ROM_LOAD16_WORD_SWAP( "smb.12m", 0x200000, 0x200000, CRC(955b0782) SHA1(ee09500e7b44e923126533613bfe26cdabc7ab5f) )
+
+ RINGDEST_HISPANIC_KEY
+ROM_END
+
ROM_START( mmancp2u )
ROM_REGION(CODE_SIZE, "maincpu", 0 ) /* 68000 code */
ROM_LOAD16_WORD_SWAP( "rcmu.03b", 0x000000, 0x80000, CRC(c39f037f) SHA1(eefc5aa0fde322c6f895a37399424060c702a459) )
@@ -9368,8 +9403,8 @@ DRIVER_INIT_MEMBER(cps_state,gigaman2)
DRIVER_INIT_CALL(cps2nc);
- m_gigaman2_dummyqsound_ram = auto_alloc_array(machine(), UINT16, 0x20000 / 2);
- save_pointer(NAME(m_gigaman2_dummyqsound_ram), 0x20000 / 2);
+ m_gigaman2_dummyqsound_ram = std::make_unique<UINT16[]>(0x20000 / 2);
+ save_pointer(NAME(m_gigaman2_dummyqsound_ram.get()), 0x20000 / 2);
space.install_readwrite_handler(0x618000, 0x619fff, read16_delegate(FUNC(cps_state::gigaman2_dummyqsound_r),this), write16_delegate(FUNC(cps_state::gigaman2_dummyqsound_w), this)); // no qsound..
@@ -9453,6 +9488,7 @@ GAME( 1994, vampja, dstlk, cps2, cps2_2p6b, cps_state, cps2, ROT0,
GAME( 1994, vampjr1, dstlk, cps2, cps2_2p6b, cps_state, cps2, ROT0, "Capcom", "Vampire: The Night Warriors (Japan 940630)", MACHINE_SUPPORTS_SAVE )
GAME( 1994, ringdest, 0, cps2, cps2_2p6b, cps_state, cps2, ROT0, "Capcom", "Ring of Destruction: Slammasters II (Euro 940902)", MACHINE_SUPPORTS_SAVE )
GAME( 1994, ringdesta, ringdest, cps2, cps2_2p6b, cps_state, cps2, ROT0, "Capcom", "Ring of Destruction: Slammasters II (Asia 940831)", MACHINE_SUPPORTS_SAVE )
+GAME( 1994, ringdesth, ringdest, cps2, cps2_2p6b, cps_state, cps2, ROT0, "Capcom", "Ring of Destruction: Slammasters II (Hispanic 940902)", MACHINE_SUPPORTS_SAVE )
GAME( 1994, smbomb, ringdest, cps2, cps2_2p6b, cps_state, cps2, ROT0, "Capcom", "Super Muscle Bomber: The International Blowout (Japan 940831)", MACHINE_SUPPORTS_SAVE )
GAME( 1994, smbombr1, ringdest, cps2, cps2_2p6b, cps_state, cps2, ROT0, "Capcom", "Super Muscle Bomber: The International Blowout (Japan 940808)", MACHINE_SUPPORTS_SAVE )
GAME( 1994, armwar, 0, cps2, cps2_3p3b, cps_state, cps2, ROT0, "Capcom", "Armored Warriors (Euro 941024)", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/cps3.cpp b/src/mame/drivers/cps3.cpp
index aeb038e8199..8ec2c17c68a 100644
--- a/src/mame/drivers/cps3.cpp
+++ b/src/mame/drivers/cps3.cpp
@@ -771,19 +771,13 @@ void cps3_state::cps3_decrypt_bios()
void cps3_state::init_common(void)
{
- /* just some NOPs for the game to execute if it crashes and starts executing unmapped addresses
- - this prevents MAME from crashing */
- m_nops = auto_alloc(machine(), UINT32);
- m_nops[0] = 0x00090009;
-
// flash roms
- std::string tempstr;
for (int simmnum = 0; simmnum < 7; simmnum++)
for (int chipnum = 0; chipnum < 8; chipnum++)
- m_simm[simmnum][chipnum] = machine().device<fujitsu_29f016a_device>(strformat(tempstr,"simm%d.%d", simmnum + 1, chipnum).c_str());
+ m_simm[simmnum][chipnum] = machine().device<fujitsu_29f016a_device>(strformat("simm%d.%d", simmnum + 1, chipnum).c_str());
- m_eeprom = auto_alloc_array(machine(), UINT32, 0x400/4);
- machine().device<nvram_device>("eeprom")->set_base(m_eeprom, 0x400);
+ m_eeprom = std::make_unique<UINT32[]>(0x400/4);
+ machine().device<nvram_device>("eeprom")->set_base(m_eeprom.get(), 0x400);
}
@@ -794,12 +788,25 @@ void cps3_state::init_crypt(UINT32 key1, UINT32 key2, int altEncryption)
m_altEncryption = altEncryption;
// cache pointers to regions
- m_user4region = memregion("user4")->base();
- m_user5region = memregion("user5")->base();
+ if (m_user4_region)
+ {
+ m_user4 = m_user4_region->base();
+ }
+ else
+ {
+ m_user4 = auto_alloc_array(machine(), UINT8, USER4REGION_LENGTH);
+ }
+
+ if (m_user5_region)
+ {
+ m_user5 = m_user5_region->base();
+ }
+ else
+ {
+ m_user5 = auto_alloc_array(machine(), UINT8, USER5REGION_LENGTH);
+ }
- if (!m_user4region) m_user4region = auto_alloc_array(machine(), UINT8, USER4REGION_LENGTH);
- if (!m_user5region) m_user5region = auto_alloc_array(machine(), UINT8, USER5REGION_LENGTH);
- m_cps3sound->set_base((INT8*)m_user5region);
+ m_cps3sound->set_base((INT8*)m_user5);
// set strict verify
m_maincpu->sh2drc_set_options(SH2DRC_STRICT_VERIFY);
@@ -894,27 +901,27 @@ void cps3_state::cps3_set_mame_colours(int colournum, UINT16 data, UINT32 fadeva
void cps3_state::video_start()
{
- m_ss_ram = auto_alloc_array(machine(), UINT32, 0x10000/4);
- memset(m_ss_ram, 0x00, 0x10000);
- save_pointer(NAME(m_ss_ram), 0x10000/4);
+ m_ss_ram = std::make_unique<UINT32[]>(0x10000/4);
+ memset(m_ss_ram.get(), 0x00, 0x10000);
+ save_pointer(NAME(m_ss_ram.get()), 0x10000/4);
- m_char_ram = auto_alloc_array(machine(), UINT32, 0x800000/4);
- memset(m_char_ram, 0x00, 0x800000);
- save_pointer(NAME(m_char_ram), 0x800000 /4);
+ m_char_ram = std::make_unique<UINT32[]>(0x800000/4);
+ memset(m_char_ram.get(), 0x00, 0x800000);
+ save_pointer(NAME(m_char_ram.get()), 0x800000 /4);
/* create the char set (gfx will then be updated dynamically from RAM) */
- m_gfxdecode->set_gfx(0, global_alloc(gfx_element(m_palette, cps3_tiles8x8_layout, (UINT8 *)m_ss_ram, 0, m_palette->entries() / 16, 0)));
+ m_gfxdecode->set_gfx(0, std::make_unique<gfx_element>(m_palette, cps3_tiles8x8_layout, (UINT8 *)m_ss_ram.get(), 0, m_palette->entries() / 16, 0));
//decode_ssram();
/* create the char set (gfx will then be updated dynamically from RAM) */
- m_gfxdecode->set_gfx(1, global_alloc(gfx_element(m_palette, cps3_tiles16x16_layout, (UINT8 *)m_char_ram, 0, m_palette->entries() / 64, 0)));
+ m_gfxdecode->set_gfx(1, std::make_unique<gfx_element>(m_palette, cps3_tiles16x16_layout, (UINT8 *)m_char_ram.get(), 0, m_palette->entries() / 64, 0));
m_gfxdecode->gfx(1)->set_granularity(64);
//decode_charram();
- m_mame_colours = auto_alloc_array(machine(), UINT32, 0x80000/4);
- memset(m_mame_colours, 0x00, 0x80000);
+ m_mame_colours = std::make_unique<UINT32[]>(0x80000/4);
+ memset(m_mame_colours.get(), 0x00, 0x80000);
m_screenwidth = 384;
@@ -1474,7 +1481,7 @@ WRITE32_MEMBER(cps3_state::cps3_gfxflash_w)
/* make a copy in the linear memory region we actually use for drawing etc. having it stored in interleaved flash roms isnt' very useful */
{
- UINT32* romdata = (UINT32*)m_user5region;
+ UINT32* romdata = (UINT32*)m_user5;
int real_offset = 0;
UINT32 newdata;
@@ -1581,7 +1588,7 @@ void cps3_state::cps3_flashmain_w(int which, UINT32 offset, UINT32 data, UINT32
/* copy data into regions to execute from */
{
- UINT32* romdata = (UINT32*)m_user4region;
+ UINT32* romdata = (UINT32*)m_user4;
UINT32* romdata2 = (UINT32*)m_decrypted_gamerom;
int real_offset = 0;
UINT32 newdata;
@@ -1805,7 +1812,7 @@ WRITE32_MEMBER(cps3_state::cps3_palettedma_w)
if (data & 0x0002)
{
int i;
- UINT16* src = (UINT16*)m_user5region;
+ UINT16* src = (UINT16*)m_user5;
// if(DEBUG_PRINTF) printf("CPS3 pal dma start %08x (real: %08x) dest %08x fade %08x other2 %08x (length %04x)\n", m_paldma_source, m_paldma_realsource, m_paldma_dest, m_paldma_fade, m_paldma_other2, m_paldma_length);
for (i=0;i<m_paldma_length;i++)
@@ -1835,7 +1842,7 @@ WRITE32_MEMBER(cps3_state::cps3_palettedma_w)
UINT32 cps3_state::process_byte( UINT8 real_byte, UINT32 destination, int max_length )
{
- UINT8* dest = (UINT8*)m_char_ram;
+ UINT8* dest = (UINT8*)m_char_ram.get();
//printf("process byte for destination %08x\n", destination);
@@ -1879,7 +1886,7 @@ UINT32 cps3_state::process_byte( UINT8 real_byte, UINT32 destination, int max_le
void cps3_state::cps3_do_char_dma( UINT32 real_source, UINT32 real_destination, UINT32 real_length )
{
- UINT8* sourcedata = (UINT8*)m_user5region;
+ UINT8* sourcedata = (UINT8*)m_user5;
int length_remaining;
m_last_normal_byte = 0;
@@ -1930,7 +1937,7 @@ void cps3_state::cps3_do_char_dma( UINT32 real_source, UINT32 real_destination,
UINT32 cps3_state::ProcessByte8(UINT8 b,UINT32 dst_offset)
{
- UINT8* destRAM = (UINT8*)m_char_ram;
+ UINT8* destRAM = (UINT8*)m_char_ram.get();
int l=0;
if(m_lastb==m_lastb2) //rle
@@ -1962,7 +1969,7 @@ UINT32 cps3_state::ProcessByte8(UINT8 b,UINT32 dst_offset)
void cps3_state::cps3_do_alt_char_dma( UINT32 src, UINT32 real_dest, UINT32 real_length )
{
- UINT8* px = (UINT8*)m_user5region;
+ UINT8* px = (UINT8*)m_user5;
UINT32 start = real_dest;
UINT32 ds = real_dest;
@@ -2305,7 +2312,7 @@ void cps3_state::machine_reset()
// make a copy in the regions we execute code / draw gfx from
void cps3_state::copy_from_nvram()
{
- UINT32* romdata = (UINT32*)m_user4region;
+ UINT32* romdata = (UINT32*)m_user4;
UINT32* romdata2 = (UINT32*)m_decrypted_gamerom;
int i;
/* copy + decrypt program roms which have been loaded from flashroms/nvram */
@@ -2342,7 +2349,7 @@ void cps3_state::copy_from_nvram()
int flashnum = 0;
int countoffset = 0;
- romdata = (UINT32*)m_user5region;
+ romdata = (UINT32*)m_user5;
for (thebase = 0;thebase < len/2; thebase+=0x200000)
{
// printf("flashnums %d. %d\n",flashnum, flashnum+1);
@@ -3651,7 +3658,7 @@ ROM_START( cps3boot ) // for cart with standard SH2
ROM_LOAD( "no-battery_bios_29f400_for_hd6417095_sh2.u2", 0x000000, 0x080000, CRC(cb9bd5b0) SHA1(ea7ecb3deb69f5307a62d8f0d7d8e68d49013d07))
DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" )
- DISK_IMAGE_READONLY( "no-battery_multi-game_bootleg_cd_for_hd6417095_sh2", 0, SHA1(6057cc3ec7991c0c00a7ab9da6ac2f92c9fb1aed) )
+ DISK_IMAGE_READONLY( "UniCD-CPS3_for_standard_SH2_V4", 0, SHA1(099c52bd38753f0f4876243e7aa87ca482a2dcb7) )
ROM_END
ROM_START( cps3booto ) // for cart with standard SH2
@@ -3659,6 +3666,14 @@ ROM_START( cps3booto ) // for cart with standard SH2
ROM_LOAD( "no-battery_bios_29f400_for_hd6417095_sh2.u2", 0x000000, 0x080000, CRC(cb9bd5b0) SHA1(ea7ecb3deb69f5307a62d8f0d7d8e68d49013d07))
DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" )
+ DISK_IMAGE_READONLY( "no-battery_multi-game_bootleg_cd_for_hd6417095_sh2", 0, SHA1(6057cc3ec7991c0c00a7ab9da6ac2f92c9fb1aed) )
+ROM_END
+
+ROM_START( cps3booto2 ) // for cart with standard SH2
+ ROM_REGION32_BE( 0x080000, "bios", 0 ) /* bios region */
+ ROM_LOAD( "no-battery_bios_29f400_for_hd6417095_sh2.u2", 0x000000, 0x080000, CRC(cb9bd5b0) SHA1(ea7ecb3deb69f5307a62d8f0d7d8e68d49013d07))
+
+ DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" )
DISK_IMAGE_READONLY( "no-battery_multi-game_bootleg_cd_for_hd6417095_sh2_older", 0, SHA1(123f2fcb0f3dd3d6b859e82a51d0127e46763776) )
ROM_END
@@ -3683,11 +3698,19 @@ ROM_START( cps3boota ) // for cart with dead custom SH2 (or 2nd Impact CPU which
ROM_LOAD( "no-battery_bios_29f400_for_dead_security_cart.u2", 0x000000, 0x080000, CRC(0fd56fb3) SHA1(5a8bffc07eb7da73cf4bca6718df72e471296bfd) )
DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" )
+ DISK_IMAGE_READONLY( "UniCD-CPS3_for_custom_SH2_V5", 0, SHA1(50a5b2845d3dd3de3bce15c4f1b58500db80cabe) )
+ROM_END
+
+ROM_START( cps3bootao ) // for cart with dead custom SH2 (or 2nd Impact CPU which is the same as a dead one)
+ ROM_REGION32_BE( 0x080000, "bios", 0 ) /* bios region */
+ ROM_LOAD( "no-battery_bios_29f400_for_dead_security_cart.u2", 0x000000, 0x080000, CRC(0fd56fb3) SHA1(5a8bffc07eb7da73cf4bca6718df72e471296bfd) )
+
+ DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" )
DISK_IMAGE_READONLY( "no-battery_multi-game_bootleg_cd_for_dead_security_cart", 0, SHA1(1ede2f1ba197ee787208358a13eae7185a5ae3b2) )
ROM_END
-ROM_START( cps3bootoa ) // for cart with dead custom SH2 (or 2nd Impact CPU which is the same as a dead one)
+ROM_START( cps3bootao2 ) // for cart with dead custom SH2 (or 2nd Impact CPU which is the same as a dead one)
ROM_REGION32_BE( 0x080000, "bios", 0 ) /* bios region */
ROM_LOAD( "no-battery_bios_29f400_for_dead_security_cart.u2", 0x000000, 0x080000, CRC(0fd56fb3) SHA1(5a8bffc07eb7da73cf4bca6718df72e471296bfd) )
@@ -3914,12 +3937,17 @@ GAME( 1999, jojobanr1, jojoba, jojoba, cps3_jojo, cps3_state, jojoba, ROT0
GAME( 1999, jojobaner1,jojoba, jojoba, cps3_jojo, cps3_state, jojoba, ROT0, "Capcom", "JoJo's Bizarre Adventure (Euro 990913, NO CD)", MACHINE_IMPERFECT_GRAPHICS )
// bootlegs, hold START1 during bootup to change games
-GAME( 1999, cps3boot, 0, sfiii3, cps3_jojo, cps3_state, cps3boot, ROT0, "bootleg", "CPS3 Multi-game bootleg for HD6417095 type SH2", MACHINE_IMPERFECT_GRAPHICS )
-GAME( 1999, cps3boota, cps3boot, sfiii3, cps3_jojo, cps3_state, sfiii2, ROT0, "bootleg", "CPS3 Multi-game bootleg for dead security cart", MACHINE_IMPERFECT_GRAPHICS )
+
+// newest revision, fixes some issues with Warzard decryption.
+GAME( 1999, cps3boot, 0, sfiii3, cps3_jojo, cps3_state, cps3boot, ROT0, "bootleg", "CPS3 Multi-game bootleg for HD6417095 type SH2 (V4)", MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1999, cps3boota, cps3boot, sfiii3, cps3_jojo, cps3_state, sfiii2, ROT0, "bootleg", "CPS3 Multi-game bootleg for dead security cart (V5)", MACHINE_IMPERFECT_GRAPHICS )
+
+GAME( 1999, cps3booto, cps3boot, sfiii3, cps3_jojo, cps3_state, cps3boot, ROT0, "bootleg", "CPS3 Multi-game bootleg for HD6417095 type SH2 (older)", MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1999, cps3bootao, cps3boot, sfiii3, cps3_jojo, cps3_state, sfiii2, ROT0, "bootleg", "CPS3 Multi-game bootleg for dead security cart (older)", MACHINE_IMPERFECT_GRAPHICS )
// this doesn't play 2nd Impact despite it being listed. 2nd Impact uses separate data/code encryption and can't be decrypted cleanly for a standard SH2. Selecting it just flashes in a copy of 3rd Strike with the 2nd Impact loading screen
-GAME( 1999, cps3booto, cps3boot, sfiii3, cps3_jojo, cps3_state, cps3boot, ROT0, "bootleg", "CPS3 Multi-game bootleg for HD6417095 type SH2 (older) (New Generation, 3rd Strike, JoJo's Venture, JoJo's Bizarre Adventure and Red Earth only)", MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1999, cps3booto2, cps3boot, sfiii3, cps3_jojo, cps3_state, cps3boot, ROT0, "bootleg", "CPS3 Multi-game bootleg for HD6417095 type SH2 (oldest) (New Generation, 3rd Strike, JoJo's Venture, JoJo's Bizarre Adventure and Red Earth only)", MACHINE_IMPERFECT_GRAPHICS )
// this does not play Red Earth or the 2 Jojo games. New Generation and 3rd Strike have been heavily modified to work with the separate code/data encryption a dead cart / 2nd Impact cart has. Selecting the other games will give an 'invalid CD' message.
-GAME( 1999, cps3bootoa, cps3boot, sfiii3, cps3_jojo, cps3_state, sfiii2, ROT0, "bootleg", "CPS3 Multi-game bootleg for dead security cart (older) (New Generation, 2nd Impact and 3rd Strike only)", MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1999, cps3bootao2, cps3boot, sfiii3, cps3_jojo, cps3_state, sfiii2, ROT0, "bootleg", "CPS3 Multi-game bootleg for dead security cart (oldest) (New Generation, 2nd Impact and 3rd Strike only)", MACHINE_IMPERFECT_GRAPHICS )
// these are test bootleg CDs for running 2nd Impact on a standard SH2
GAME( 1999, cps3bs32, cps3boot, sfiii3, cps3_jojo, cps3_state, cps3boot, ROT0, "bootleg", "Street Fighter III 2nd Impact: Giant Attack (USA 970930, bootleg for HD6417095 type SH2, V3)", MACHINE_IMPERFECT_GRAPHICS )
GAME( 1999, cps3bs32a, cps3boot, sfiii3, cps3_jojo, cps3_state, cps3boot, ROT0, "bootleg", "Street Fighter III 2nd Impact: Giant Attack (USA 970930, bootleg for HD6417095 type SH2, older)", MACHINE_IMPERFECT_GRAPHICS ) // older / buggier hack
diff --git a/src/mame/drivers/crimfght.cpp b/src/mame/drivers/crimfght.cpp
index febda7d58ff..460e133caa6 100644
--- a/src/mame/drivers/crimfght.cpp
+++ b/src/mame/drivers/crimfght.cpp
@@ -23,8 +23,8 @@
WRITE8_MEMBER(crimfght_state::crimfght_coin_w)
{
- coin_counter_w(machine(), 0, data & 1);
- coin_counter_w(machine(), 1, data & 2);
+ machine().bookkeeping().coin_counter_w(0, data & 1);
+ machine().bookkeeping().coin_counter_w(1, data & 2);
}
READ8_MEMBER(crimfght_state::k052109_051960_r)
@@ -175,7 +175,7 @@ static INPUT_PORTS_START( crimfght )
PORT_DIPUNUSED_DIPLOC(0x02, IP_ACTIVE_LOW, "SW3:2")
PORT_SERVICE_DIPLOC( 0x04, IP_ACTIVE_LOW, "SW3:3")
PORT_DIPUNUSED_DIPLOC(0x08, IP_ACTIVE_LOW, "SW3:4")
- PORT_BIT(0xf0, IP_ACTIVE_HIGH, IPT_SPECIAL) PORT_CUSTOM_MEMBER(DEVICE_SELF, crimfght_state, system_r, 0)
+ PORT_BIT(0xf0, IP_ACTIVE_HIGH, IPT_SPECIAL) PORT_CUSTOM_MEMBER(DEVICE_SELF, crimfght_state, system_r, NULL)
PORT_START("P1")
KONAMI8_B12_UNK(1)
diff --git a/src/mame/drivers/csc.cpp b/src/mame/drivers/csc.cpp
index 50e0ef39c61..11dcf7763b6 100644
--- a/src/mame/drivers/csc.cpp
+++ b/src/mame/drivers/csc.cpp
@@ -2,9 +2,14 @@
// copyright-holders:Kevin Horton,Jonathan Gevaryahu,Sandro Ronco
/******************************************************************************
+WIP: plan to move to main fidelity chess driver
+
+
+
+
Fidelity Champion Chess Challenger (model CSC)
- See fidelz80.c for hardware description
+ See drivers/fidelz80.cpp for hardware description
TODO:
- speech doesn't work
@@ -17,20 +22,19 @@
#include "machine/6821pia.h"
#include "sound/s14001a.h"
-#include "debugger.h"
-
// same layout of Sensory Chess Challenger
-extern const char layout_vsc[];
+//extern const char layout_vsc[];
class csc_state : public driver_device
{
public:
csc_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
- m_speech(*this, "speech")
- ,
- m_maincpu(*this, "maincpu") { }
+ m_maincpu(*this, "maincpu"),
+ m_speech(*this, "speech")
+ { }
+ required_device<cpu_device> m_maincpu;
required_device<s14001a_device> m_speech;
virtual void machine_start() override;
@@ -50,7 +54,6 @@ public:
UINT8 m_selector;
TIMER_DEVICE_CALLBACK_MEMBER(irq_timer);
- required_device<cpu_device> m_maincpu;
};
@@ -58,8 +61,8 @@ UINT16 csc_state::input_read(int index)
{
static const char *const col_tag[] =
{
- "COL_A", "COL_B", "COL_C", "COL_D", "COL_E",
- "COL_F", "COL_G", "COL_H", "COL_I"
+ "IN.0", "IN.1", "IN.2", "IN.3", "IN.4",
+ "IN.5", "IN.6", "IN.7", "IN.8"
};
return ioport(col_tag[index])->read();
@@ -73,19 +76,19 @@ WRITE8_MEMBER( csc_state::pia0_pa_w )
switch (m_selector)
{
case 0:
- output_set_digit_value(0, out_digit & 0x7f);
- output_set_value("pm_led", BIT(out_digit, 7));
+ output().set_digit_value(0, out_digit & 0x7f);
+ output().set_value("pm_led", BIT(out_digit, 7));
break;
case 1:
- output_set_digit_value(1, out_digit & 0x7f);
+ output().set_digit_value(1, out_digit & 0x7f);
break;
case 2:
- output_set_digit_value(2, out_digit & 0x7f);
- output_set_value("up_dot", BIT(out_digit, 7));
+ output().set_digit_value(2, out_digit & 0x7f);
+ output().set_value("up_dot", BIT(out_digit, 7));
break;
case 3:
- output_set_digit_value(3, out_digit & 0x7f);
- output_set_value("low_dot", BIT(out_digit, 7));
+ output().set_digit_value(3, out_digit & 0x7f);
+ output().set_value("low_dot", BIT(out_digit, 7));
break;
}
@@ -134,7 +137,7 @@ WRITE8_MEMBER( csc_state::pia1_pb_w )
if (m_selector < 8)
for (int i=0; i<8; i++)
- output_set_indexed_value(row_tag[m_selector], i+1, BIT(data, 7-i));
+ output().set_indexed_value(row_tag[m_selector], i+1, BIT(data, 7-i));
}
READ8_MEMBER( csc_state::pia1_pa_r )
@@ -197,7 +200,7 @@ ADDRESS_MAP_END
/* Input ports */
static INPUT_PORTS_START( csc )
- PORT_START("COL_A")
+ PORT_START("IN.0")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYPAD)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD)
@@ -207,7 +210,7 @@ static INPUT_PORTS_START( csc )
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYPAD)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYPAD)
PORT_BIT(0x100,IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("Speak") PORT_CODE(KEYCODE_SPACE)
- PORT_START("COL_B")
+ PORT_START("IN.1")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYPAD)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD)
@@ -217,7 +220,7 @@ static INPUT_PORTS_START( csc )
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYPAD)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYPAD)
PORT_BIT(0x100,IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("RV") PORT_CODE(KEYCODE_V)
- PORT_START("COL_C")
+ PORT_START("IN.2")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYPAD)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD)
@@ -227,7 +230,7 @@ static INPUT_PORTS_START( csc )
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYPAD)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYPAD)
PORT_BIT(0x100,IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("TM") PORT_CODE(KEYCODE_T)
- PORT_START("COL_D")
+ PORT_START("IN.3")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYPAD)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD)
@@ -237,7 +240,7 @@ static INPUT_PORTS_START( csc )
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYPAD)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYPAD)
PORT_BIT(0x100,IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("LV") PORT_CODE(KEYCODE_L)
- PORT_START("COL_E")
+ PORT_START("IN.4")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYPAD)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD)
@@ -247,7 +250,7 @@ static INPUT_PORTS_START( csc )
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYPAD)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYPAD)
PORT_BIT(0x100,IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("DM") PORT_CODE(KEYCODE_M)
- PORT_START("COL_F")
+ PORT_START("IN.5")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYPAD)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD)
@@ -257,7 +260,7 @@ static INPUT_PORTS_START( csc )
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYPAD)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYPAD)
PORT_BIT(0x100,IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("ST") PORT_CODE(KEYCODE_S)
- PORT_START("COL_G")
+ PORT_START("IN.6")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYPAD)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD)
@@ -267,7 +270,7 @@ static INPUT_PORTS_START( csc )
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYPAD)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYPAD)
PORT_BIT(0x100,IP_ACTIVE_LOW, IPT_UNUSED) PORT_UNUSED
- PORT_START("COL_H")
+ PORT_START("IN.7")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYPAD)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD)
@@ -277,7 +280,7 @@ static INPUT_PORTS_START( csc )
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYPAD)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYPAD)
PORT_BIT(0x100,IP_ACTIVE_LOW, IPT_UNUSED) PORT_UNUSED
- PORT_START("COL_I")
+ PORT_START("IN.8")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("Pawn") PORT_CODE(KEYCODE_1)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("Rook") PORT_CODE(KEYCODE_2)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("Knight") PORT_CODE(KEYCODE_3)
@@ -301,7 +304,7 @@ static MACHINE_CONFIG_START( csc, csc_state )
MCFG_CPU_ADD("maincpu", M6502, 3900000/2)
MCFG_CPU_PROGRAM_MAP(csc_mem)
- MCFG_DEFAULT_LAYOUT(layout_vsc)
+ //MCFG_DEFAULT_LAYOUT(layout_vsc)
MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_timer", csc_state, irq_timer, attotime::from_hz(38400/64))
@@ -343,4 +346,4 @@ ROM_END
/* Driver */
/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS */
-COMP( 198?, csc, 0, 0, csc, csc, driver_device, 0, "Fidelity Electronics", "Champion Chess Challenger (model CSC)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK)
+COMP( 1981, csc, 0, 0, csc, csc, driver_device, 0, "Fidelity Electronics", "Champion Chess Challenger (model CSC)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK)
diff --git a/src/mame/drivers/csplayh5.cpp b/src/mame/drivers/csplayh5.cpp
index c9ea1186ec6..fa87c2f7a02 100644
--- a/src/mame/drivers/csplayh5.cpp
+++ b/src/mame/drivers/csplayh5.cpp
@@ -65,7 +65,6 @@ public:
DECLARE_READ16_MEMBER(csplayh5_mux_r);
DECLARE_WRITE16_MEMBER(csplayh5_mux_w);
DECLARE_WRITE16_MEMBER(csplayh5_sound_w);
- DECLARE_READ16_MEMBER(test_r);
DECLARE_READ8_MEMBER(csplayh5_sound_r);
DECLARE_WRITE8_MEMBER(csplayh5_soundclr_w);
diff --git a/src/mame/drivers/cubeqst.cpp b/src/mame/drivers/cubeqst.cpp
index 7cb464c2e45..6c084f3b897 100644
--- a/src/mame/drivers/cubeqst.cpp
+++ b/src/mame/drivers/cubeqst.cpp
@@ -39,7 +39,7 @@ public:
m_screen(*this, "screen"),
m_generic_paletteram_16(*this, "paletteram") { }
- UINT8 *m_depth_buffer;
+ std::unique_ptr<UINT8[]> m_depth_buffer;
int m_video_field;
UINT8 m_io_latch;
UINT8 m_reset_latch;
@@ -49,7 +49,7 @@ public:
required_device<cquestsnd_cpu_device> m_soundcpu;
required_device<screen_device> m_screen;
required_shared_ptr<UINT16> m_generic_paletteram_16;
- rgb_t *m_colormap;
+ std::unique_ptr<rgb_t[]> m_colormap;
DECLARE_WRITE16_MEMBER(palette_w);
DECLARE_READ16_MEMBER(line_r);
DECLARE_WRITE16_MEMBER(laserdisc_w);
@@ -96,7 +96,7 @@ public:
void cubeqst_state::video_start()
{
m_video_field = 0;
- m_depth_buffer = auto_alloc_array(machine(), UINT8, 512);
+ m_depth_buffer = std::make_unique<UINT8[]>(512);
}
WRITE16_MEMBER(cubeqst_state::palette_w)
@@ -130,7 +130,7 @@ UINT32 cubeqst_state::screen_update_cubeqst(screen_device &screen, bitmap_rgb32
UINT32 pen;
/* Zap the depth buffer */
- memset(m_depth_buffer, 0xff, 512);
+ memset(m_depth_buffer.get(), 0xff, 512);
/* Process all the spans on this scanline */
if (y < 256)
@@ -444,7 +444,7 @@ void cubeqst_state::machine_start()
/* TODO: Use resistor values */
int i;
- m_colormap = auto_alloc_array(machine(), rgb_t, 65536);
+ m_colormap = std::make_unique<rgb_t[]>(65536);
for (i = 0; i < 65536; ++i)
{
UINT8 a, r, g, b, y;
@@ -532,7 +532,6 @@ static MACHINE_CONFIG_START( cubeqst, cubeqst_state )
MCFG_LASERDISC_OVERLAY_CLIP(0, 320-1, 0, 256-8)
MCFG_LASERDISC_OVERLAY_POSITION(0.002f, -0.018f)
MCFG_LASERDISC_OVERLAY_SCALE(1.0f, 1.030f)
- MCFG_LASERDISC_OVERLAY_PALETTE("palette")
MCFG_LASERDISC_SCREEN_ADD_NTSC("screen", "laserdisc")
diff --git a/src/mame/drivers/cubo.cpp b/src/mame/drivers/cubo.cpp
index 678137cf6dd..8e27e26e864 100644
--- a/src/mame/drivers/cubo.cpp
+++ b/src/mame/drivers/cubo.cpp
@@ -399,7 +399,7 @@ WRITE8_MEMBER( cubo_state::akiko_cia_0_port_a_write )
m_cdda->set_output_gain( 0, ( data & 1 ) ? 0.0 : 1.0 );
/* bit 2 = Power Led on Amiga */
- set_led_status(machine(), 0, (data & 2) ? 0 : 1);
+ output().set_led_value(0, (data & 2) ? 0 : 1);
handle_cd32_joystick_cia(machine(), data, m_cia_0->read(space, 2));
}
@@ -541,22 +541,22 @@ static INPUT_PORTS_START( cubo )
PORT_START("CIA0PORTA")
PORT_BIT( 0x3f, IP_ACTIVE_LOW, IPT_SPECIAL )
/* this is the regular port for reading a single button joystick on the Amiga, many CD32 games require this to mirror the pad start button! */
- PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, cubo_state,cd32_sel_mirror_input, 1)
- PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, cubo_state,cd32_sel_mirror_input, 0)
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, cubo_state,cd32_sel_mirror_input, (void *)1)
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, cubo_state,cd32_sel_mirror_input, (void *)0)
PORT_START("CIA0PORTB")
PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_START("joy_0_dat")
- PORT_BIT( 0x0303, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, cubo_state, amiga_joystick_convert, 1)
+ PORT_BIT( 0x0303, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, cubo_state, amiga_joystick_convert, (void *)1)
PORT_BIT( 0xfcfc, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("joy_1_dat")
- PORT_BIT( 0x0303, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, cubo_state, amiga_joystick_convert, 0)
+ PORT_BIT( 0x0303, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, cubo_state, amiga_joystick_convert, (void *)0)
PORT_BIT( 0xfcfc, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("potgo")
- PORT_BIT( 0xff00, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, cubo_state,cubo_input, 0)
+ PORT_BIT( 0xff00, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, cubo_state,cubo_input, NULL)
PORT_BIT( 0x00ff, IP_ACTIVE_HIGH, IPT_UNUSED )
@@ -1051,6 +1051,7 @@ static MACHINE_CONFIG_START( cubo, cubo_state )
MCFG_FRAGMENT_ADD(pal_video)
MCFG_DEVICE_MODIFY("screen")
MCFG_SCREEN_UPDATE_DRIVER(amiga_state, screen_update_amiga_aga)
+ MCFG_SCREEN_NO_PALETTE
MCFG_VIDEO_START_OVERRIDE(amiga_state, amiga_aga)
diff --git a/src/mame/drivers/cultures.cpp b/src/mame/drivers/cultures.cpp
index a27bfe2b492..f9d58e31d57 100644
--- a/src/mame/drivers/cultures.cpp
+++ b/src/mame/drivers/cultures.cpp
@@ -177,7 +177,7 @@ WRITE8_MEMBER(cultures_state::bg_bank_w)
m_bg2_bank = (data & 0xc) >> 2;
m_bg2_tilemap->mark_all_dirty();
}
- coin_counter_w(machine(), 0, data & 0x10);
+ machine().bookkeeping().coin_counter_w(0, data & 0x10);
}
diff --git a/src/mame/drivers/cvicny.cpp b/src/mame/drivers/cvicny.cpp
index 416309d78d0..8939702099d 100644
--- a/src/mame/drivers/cvicny.cpp
+++ b/src/mame/drivers/cvicny.cpp
@@ -56,7 +56,7 @@ public:
WRITE8_MEMBER( cvicny_state::segment_w ) // output segments on the selected digit
{
if (m_digit != m_digit_last)
- output_set_digit_value(m_digit, data);
+ output().set_digit_value(m_digit, data);
m_digit_last = m_digit;
}
diff --git a/src/mame/drivers/cvs.cpp b/src/mame/drivers/cvs.cpp
index f3ec7e6ed80..e67e3899f12 100644
--- a/src/mame/drivers/cvs.cpp
+++ b/src/mame/drivers/cvs.cpp
@@ -155,7 +155,7 @@ READ8_MEMBER(cvs_state::cvs_s2636_0_or_character_ram_r)
if (m_s2650_flag)
return m_character_ram[(0 * 0x800) | 0x400 | m_character_ram_page_start | offset];
else
- return m_s2636_0->read(space, offset);
+ return m_s2636_0->read_data(space, offset);
}
WRITE8_MEMBER(cvs_state::cvs_s2636_0_or_character_ram_w)
@@ -167,7 +167,7 @@ WRITE8_MEMBER(cvs_state::cvs_s2636_0_or_character_ram_w)
m_gfxdecode->gfx(1)->mark_dirty((offset / 8) % 256);
}
else
- m_s2636_0->write(space, offset, data);
+ m_s2636_0->write_data(space, offset, data);
}
@@ -176,7 +176,7 @@ READ8_MEMBER(cvs_state::cvs_s2636_1_or_character_ram_r)
if (m_s2650_flag)
return m_character_ram[(1 * 0x800) | 0x400 | m_character_ram_page_start | offset];
else
- return m_s2636_1->read(space, offset);
+ return m_s2636_1->read_data(space, offset);
}
WRITE8_MEMBER(cvs_state::cvs_s2636_1_or_character_ram_w)
@@ -188,7 +188,7 @@ WRITE8_MEMBER(cvs_state::cvs_s2636_1_or_character_ram_w)
m_gfxdecode->gfx(1)->mark_dirty((offset / 8) % 256);
}
else
- m_s2636_1->write(space, offset, data);
+ m_s2636_1->write_data(space, offset, data);
}
@@ -197,7 +197,7 @@ READ8_MEMBER(cvs_state::cvs_s2636_2_or_character_ram_r)
if (m_s2650_flag)
return m_character_ram[(2 * 0x800) | 0x400 | m_character_ram_page_start | offset];
else
- return m_s2636_2->read(space, offset);
+ return m_s2636_2->read_data(space, offset);
}
WRITE8_MEMBER(cvs_state::cvs_s2636_2_or_character_ram_w)
@@ -209,7 +209,7 @@ WRITE8_MEMBER(cvs_state::cvs_s2636_2_or_character_ram_w)
m_gfxdecode->gfx(1)->mark_dirty((offset / 8) % 256);
}
else
- m_s2636_2->write(space, offset, data);
+ m_s2636_2->write_data(space, offset, data);
}
diff --git a/src/mame/drivers/d6800.cpp b/src/mame/drivers/d6800.cpp
index 79c9ecab945..03e9c0f94ce 100644
--- a/src/mame/drivers/d6800.cpp
+++ b/src/mame/drivers/d6800.cpp
@@ -281,7 +281,7 @@ WRITE8_MEMBER( d6800_state::d6800_cassette_w )
are in progress (DMA/CB2 line low).
*/
- m_beeper->set_frequency(BIT(data, 0) ? 2400 : 1200);
+ m_beeper->set_clock(BIT(data, 0) ? 2400 : 1200);
m_beeper->set_state(BIT(data, 6) & (m_cb2 ? 1 : 0));
m_portb = data & 0x7f;
@@ -397,7 +397,7 @@ static MACHINE_CONFIG_START( d6800, d6800_state )
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_WAVE_ADD(WAVE_TAG, "cassette")
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
- MCFG_SOUND_ADD("beeper", BEEP, 0)
+ MCFG_SOUND_ADD("beeper", BEEP, 1200)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
/* devices */
diff --git a/src/mame/drivers/dacholer.cpp b/src/mame/drivers/dacholer.cpp
index 000140a5407..9179640f006 100644
--- a/src/mame/drivers/dacholer.cpp
+++ b/src/mame/drivers/dacholer.cpp
@@ -208,11 +208,11 @@ WRITE8_MEMBER(dacholer_state::bg_bank_w)
WRITE8_MEMBER(dacholer_state::coins_w)
{
- coin_counter_w(machine(), 0, data & 1);
- coin_counter_w(machine(), 1, data & 2);
+ machine().bookkeeping().coin_counter_w(0, data & 1);
+ machine().bookkeeping().coin_counter_w(1, data & 2);
- set_led_status(machine(), 0, data & 4);
- set_led_status(machine(), 1, data & 8);
+ output().set_led_value(0, data & 4);
+ output().set_led_value(1, data & 8);
}
WRITE8_MEMBER(dacholer_state::snd_w)
diff --git a/src/mame/drivers/dai3wksi.cpp b/src/mame/drivers/dai3wksi.cpp
index 979385a4f65..08bfc4febc7 100644
--- a/src/mame/drivers/dai3wksi.cpp
+++ b/src/mame/drivers/dai3wksi.cpp
@@ -1,5 +1,5 @@
// license:???
-// copyright-holders:Derrick Renaud
+// copyright-holders:Hau,Derrick Renaud
/*
-Galaxy Force
diff --git a/src/mame/drivers/darius.cpp b/src/mame/drivers/darius.cpp
index 80202aa2645..aa8734d4c01 100644
--- a/src/mame/drivers/darius.cpp
+++ b/src/mame/drivers/darius.cpp
@@ -1,4 +1,4 @@
-// license:???
+// license:GPL-2.0+
// copyright-holders:David Graves, Jarek Burczynski
// thanks-to:Richard Bush
/***************************************************************************
@@ -219,10 +219,10 @@ WRITE16_MEMBER(darius_state::darius_ioc_w)
case 0x30: /* coin control */
/* bits 7,5,4,0 used on reset */
/* bit 4 used whenever bg is blanked ? */
- coin_lockout_w(machine(), 0, ~data & 0x02);
- coin_lockout_w(machine(), 1, ~data & 0x04);
- coin_counter_w(machine(), 0, data & 0x08);
- coin_counter_w(machine(), 1, data & 0x40);
+ machine().bookkeeping().coin_lockout_w(0, ~data & 0x02);
+ machine().bookkeeping().coin_lockout_w(1, ~data & 0x04);
+ machine().bookkeeping().coin_counter_w(0, data & 0x08);
+ machine().bookkeeping().coin_counter_w(1, data & 0x40);
m_coin_word = data & 0xffff;
//popmessage(" address %04x value %04x",offset,data);
return;
diff --git a/src/mame/drivers/dassault.cpp b/src/mame/drivers/dassault.cpp
index c3a3557e889..5df8e0e002c 100644
--- a/src/mame/drivers/dassault.cpp
+++ b/src/mame/drivers/dassault.cpp
@@ -241,7 +241,7 @@ READ16_MEMBER(dassault_state::dassault_control_r)
WRITE16_MEMBER(dassault_state::dassault_control_w)
{
- coin_counter_w(machine(), 0, data & 1);
+ machine().bookkeeping().coin_counter_w(0, data & 1);
if (data & 0xfffe)
logerror("Coin cointrol %04x\n", data);
}
diff --git a/src/mame/drivers/dblcrown.cpp b/src/mame/drivers/dblcrown.cpp
index f3d1119ae95..ed23cd2b96b 100644
--- a/src/mame/drivers/dblcrown.cpp
+++ b/src/mame/drivers/dblcrown.cpp
@@ -72,8 +72,8 @@ public:
UINT8 m_bank;
UINT8 m_irq_src;
- UINT8 *m_pal_ram;
- UINT8 *m_vram;
+ std::unique_ptr<UINT8[]> m_pal_ram;
+ std::unique_ptr<UINT8[]> m_vram;
UINT8 m_vram_bank[2];
UINT8 m_mux_data;
UINT8 m_lamps_data;
@@ -110,10 +110,10 @@ protected:
void dblcrown_state::video_start()
{
- m_pal_ram = auto_alloc_array(machine(), UINT8, 0x200 * 2);
- m_vram = auto_alloc_array(machine(), UINT8, 0x1000 * 0x10);
+ m_pal_ram = std::make_unique<UINT8[]>(0x200 * 2);
+ m_vram = std::make_unique<UINT8[]>(0x1000 * 0x10);
- save_pointer(NAME(m_vram), 0x1000 * 0x10);
+ save_pointer(NAME(m_vram.get()), 0x1000 * 0x10);
}
UINT32 dblcrown_state::screen_update( screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect )
@@ -298,8 +298,8 @@ WRITE8_MEMBER( dblcrown_state::output_w )
x-x- --xx unknown
*/
- coin_counter_w(machine(), 0, data & 0x10); /* Coin In counter pulse */
- coin_counter_w(machine(), 1 ,data & 0x08); /* Payout counter pulse */
+ machine().bookkeeping().coin_counter_w(0, data & 0x10); /* Coin In counter pulse */
+ machine().bookkeeping().coin_counter_w(1 ,data & 0x08); /* Payout counter pulse */
// popmessage("out: %02x", data);
}
@@ -322,14 +322,14 @@ WRITE8_MEMBER( dblcrown_state::lamps_w )
-x-- ---- Hold 2
x--- ---- Hold 1
*/
- output_set_lamp_value(0, (data) & 1); /* Deal */
- output_set_lamp_value(1, (data >> 1) & 1); /* Bet */
- output_set_lamp_value(2, (data >> 2) & 1); /* Cancel */
- output_set_lamp_value(3, (data >> 3) & 1); /* Hold 5 */
- output_set_lamp_value(4, (data >> 4) & 1); /* Hold 4 */
- output_set_lamp_value(5, (data >> 5) & 1); /* Hold 3 */
- output_set_lamp_value(6, (data >> 6) & 1); /* Hold 2 */
- output_set_lamp_value(7, (data >> 7) & 1); /* Hold 1 */
+ output().set_lamp_value(0, (data) & 1); /* Deal */
+ output().set_lamp_value(1, (data >> 1) & 1); /* Bet */
+ output().set_lamp_value(2, (data >> 2) & 1); /* Cancel */
+ output().set_lamp_value(3, (data >> 3) & 1); /* Hold 5 */
+ output().set_lamp_value(4, (data >> 4) & 1); /* Hold 4 */
+ output().set_lamp_value(5, (data >> 5) & 1); /* Hold 3 */
+ output().set_lamp_value(6, (data >> 6) & 1); /* Hold 2 */
+ output().set_lamp_value(7, (data >> 7) & 1); /* Hold 1 */
m_lamps_data = data;
}
diff --git a/src/mame/drivers/dblewing.cpp b/src/mame/drivers/dblewing.cpp
index f6c74cb331c..9076254e457 100644
--- a/src/mame/drivers/dblewing.cpp
+++ b/src/mame/drivers/dblewing.cpp
@@ -109,8 +109,6 @@ public:
required_device<deco16ic_device> m_deco_tilegen1;
required_shared_ptr<UINT16> m_decrypted_opcodes;
DECLARE_WRITE_LINE_MEMBER(sound_irq);
- DECLARE_READ16_MEMBER(dblewing_prot_r);
- DECLARE_WRITE16_MEMBER(dblewing_prot_w);
DECLARE_READ8_MEMBER(irq_latch_r);
DECLARE_DRIVER_INIT(dblewing);
virtual void machine_start() override;
diff --git a/src/mame/drivers/dbz.cpp b/src/mame/drivers/dbz.cpp
index d2e05b7181d..6372c089fb1 100644
--- a/src/mame/drivers/dbz.cpp
+++ b/src/mame/drivers/dbz.cpp
@@ -89,8 +89,8 @@ WRITE16_MEMBER(dbz_state::dbzcontrol_w)
else
m_k053246->k053246_set_objcha_line( CLEAR_LINE);
- coin_counter_w(machine(), 0, data & 1);
- coin_counter_w(machine(), 1, data & 2);
+ machine().bookkeeping().coin_counter_w(0, data & 1);
+ machine().bookkeeping().coin_counter_w(1, data & 2);
}
WRITE16_MEMBER(dbz_state::dbz_sound_command_w)
diff --git a/src/mame/drivers/dccons.cpp b/src/mame/drivers/dccons.cpp
index fbb92009889..9772ad3ba8c 100644
--- a/src/mame/drivers/dccons.cpp
+++ b/src/mame/drivers/dccons.cpp
@@ -658,103 +658,72 @@ static MACHINE_CONFIG_START( dc, dc_cons_state )
MCFG_SLOT_DEFAULT_OPTION("gdrom")
MACHINE_CONFIG_END
-/*
-PsyMan notes:
-
-Here's a basic report on the Dreamcast boot files used in MAME (BIOS+Flash pairs):
-
------
-
-"dc101d_us.bin", 0x000000, 0x200000, CRC(89f2b1a1) SHA1(8951d1bb219ab2ff8583033d2119c899cc81f18c) ) // BIOS
-This is a proper European and USA BIOS. It's even possible that it was used at a later point for Japanese systems.
-It only has minor differences compared to BIOS 1.01c.
-
-
-"dcus_ntsc.bin", 0x000000, 0x020000, BAD_DUMP CRC(c611b498) SHA1(94d44d7f9529ec1642ba3771ed3c5f756d5bc872) ) // Flash
-Checking at 0x0001A000 and the mirrored data at 0x0001A0A0 gives away that this is hacked from a PAL/European flash file.
-The broadcast (0x0001A004) is also set at 50Hz which is a PAL standard.
-
-
-"dc101d_eu.bin", 0x000000, 0x200000, CRC(a2564fad) SHA1(edc5d3d70a93c935703d26119b37731fd317d2bf),ROM_BIOS(1)) // BIOS
-This BIOS has Chinese language added. So either this is a bad BIOS or Dreamcast was actually officially released there.
-
-
-"dc101c_eu.bin", 0x000000, 0x200000, CRC(2f551bc5) SHA1(1ede8d5be49116a4c6f3fe0961175469537a0434),ROM_BIOS(2)) // BIOS
-This seems to be a proper European and USA BIOS. It's even possible that it was used at a later point for Japanese systems.
-It only has minor differences compared to BIOS 1.01d.
-
-
-
-"dceu_pal.bin", 0x000000, 0x020000, BAD_DUMP CRC(b7e5aeeb) SHA1(11e02433e13b793ec7ffe0ae2356750bb8a575b4) ) // Flash
-This appears to be a valid PAL/European flash. It's unknown if the data at 0x0001A0A0 (from 0x0001A000) should be mirrored there.
-Maybe a game does this mirroring or maybe it's there by default. It's certain that some games wrote to this flash though.
-
-"dc1004jp.bin", 0x000000, 0x200000, CRC(5454841f) SHA1(1ea132c0fbbf07ef76789eadc07908045c089bd6) ) // BIOS
-This seems to be a proper Japanese BIOS. This BIOS was used at least by early Japanese Dreamcast models.
-Code-wise, it has major differences compared to later BIOS versions.
+#define ROM_LOAD_BIOS(bios,name,offset,length,hash) \
+ ROMX_LOAD(name, offset, length, hash, ROM_GROUPWORD | ROM_BIOS(bios+1))
+// actual mask rom labels can have -X1 or -X2 added, presumable depending on mobo revision and/or type of rom used (5v or 3.3v), contents is the same
+// known to exists undumped MPR-21086 (VA0 NTSC-J 3010) and MPR-21933 (VA0 US) boot roms
-"dcjp_ntsc.bin", 0x000000, 0x020000, CRC(5f92bf76) SHA1(be78b834f512ab2cf3d67b96e377c9f3093ff82a) ) // Flash
-Checking at 0x0001A000 and the mirrored data at 0x0001A0A0 gives away that this is hacked from a PAL/European flash file.
-The broadcast (0x0001A004) is also set at 50Hz which is a PAL standard.
-
------
-
-
-From all the aforementioned files the only personally verified one is "dc101d_us.bin", CRC(89f2b1a1).
-The resulting file was dumped twice, once from an NTSC/USA system and once from a PAL/EUR system. Both files had a side by side byte match.
-*/
+#define DREAMCAST_COMMON_BIOS \
+ ROM_REGION(0x200000, "maincpu", 0) \
+ ROM_SYSTEM_BIOS(0, "101d", "v1.01d (World)") \
+ ROM_LOAD_BIOS(0, "mpr-21931.ic501", 0x000000, 0x200000, CRC(89f2b1a1) SHA1(8951d1bb219ab2ff8583033d2119c899cc81f18c) ) \
+ ROM_SYSTEM_BIOS(1, "1022", "v1.022 (World)") \
+ ROM_LOAD_BIOS(1, "mpr-23588.ic501", 0x000000, 0x200000, CRC(786168f9) SHA1(ba8bbb90fdb29525f24f17055dc2c7b2d7674437) ) \
+ ROM_SYSTEM_BIOS(2, "101c", "v1.01c (World)") \
+ ROM_LOAD_BIOS(2, "mpr-21871.ic501", 0x000000, 0x200000, CRC(2f551bc5) SHA1(1ede8d5be49116a4c6f3fe0961175469537a0434) ) \
+ ROM_SYSTEM_BIOS(3, "101dch", "v1.01d (Chinese hack)") \
+ ROM_LOAD_BIOS(3, "dc101d_ch.bin", 0x000000, 0x200000, CRC(a2564fad) SHA1(edc5d3d70a93c935703d26119b37731fd317d2bf) )
+// ^^^ dc101d_eu.bin ^^^ is selfmade chinese translation, doesn't work on real hardware, does it must be here at all ?
ROM_START(dc)
- ROM_REGION(0x200000, "maincpu", 0)
- ROM_LOAD( "dc101d_us.bin", 0x000000, 0x200000, CRC(89f2b1a1) SHA1(8951d1bb219ab2ff8583033d2119c899cc81f18c) ) // BIOS
+ DREAMCAST_COMMON_BIOS
ROM_REGION(0x020000, "dcflash", 0)
- ROM_LOAD( "dcus_ntsc.bin", 0x000000, 0x020000, BAD_DUMP CRC(c611b498) SHA1(94d44d7f9529ec1642ba3771ed3c5f756d5bc872) ) // Flash
- ROM_FILL( 0x1a004, 1, 0x30 ) // patch broadcast back to NTSC
+ ROM_LOAD( "dcus_ntsc.bin", 0x000000, 0x020000, BAD_DUMP CRC(e6862dd0) SHA1(24875ce85c011600e73b1c3fd2b341824cbf8544) ) // dumped from VA2.4 mobo with 1.022 BIOS
ROM_END
ROM_START( dceu )
- ROM_REGION(0x200000, "maincpu", 0)
- ROM_SYSTEM_BIOS(0, "101d", "v1.01d")
- ROMX_LOAD( "dc101d_eu.bin", 0x000000, 0x200000, CRC(a2564fad) SHA1(edc5d3d70a93c935703d26119b37731fd317d2bf),ROM_BIOS(1)) // BIOS
- ROM_SYSTEM_BIOS(1, "101c", "v1.01c")
- ROMX_LOAD( "dc101c_eu.bin", 0x000000, 0x200000, CRC(2f551bc5) SHA1(1ede8d5be49116a4c6f3fe0961175469537a0434),ROM_BIOS(2)) // BIOS
+ DREAMCAST_COMMON_BIOS
ROM_REGION(0x020000, "dcflash", 0)
- ROM_LOAD( "dceu_pal.bin", 0x000000, 0x020000, BAD_DUMP CRC(b7e5aeeb) SHA1(11e02433e13b793ec7ffe0ae2356750bb8a575b4) ) // Flash
+ ROM_LOAD( "dceu_pal.bin", 0x000000, 0x020000, BAD_DUMP CRC(b7e5aeeb) SHA1(11e02433e13b793ec7ffe0ae2356750bb8a575b4) )
ROM_END
ROM_START( dcjp )
- ROM_REGION(0x200000, "maincpu", 0)
- ROM_LOAD( "dc1004jp.bin", 0x000000, 0x200000, CRC(5454841f) SHA1(1ea132c0fbbf07ef76789eadc07908045c089bd6) ) // BIOS
+ DREAMCAST_COMMON_BIOS
+ ROM_SYSTEM_BIOS(4, "1004", "v1.004 (Japan)") // oldest known mass production version, supports Japan region only
+ ROM_LOAD_BIOS(4, "mpr-21068.ic501", 0x000000, 0x200000, CRC(5454841f) SHA1(1ea132c0fbbf07ef76789eadc07908045c089bd6) )
ROM_REGION(0x020000, "dcflash", 0)
/* ROM_LOAD( "dcjp_ntsc.bad", 0x000000, 0x020000, BAD_DUMP CRC(307a7035) SHA1(1411423a9d071340ea52c56e19c1aafc4e1309ee) ) // Hacked Flash */
- ROM_LOAD( "dcjp_ntsc.bin", 0x000000, 0x020000, BAD_DUMP CRC(5f92bf76) SHA1(be78b834f512ab2cf3d67b96e377c9f3093ff82a) ) // Flash
+ ROM_LOAD( "dcjp_ntsc.bin", 0x000000, 0x020000, BAD_DUMP CRC(5f92bf76) SHA1(be78b834f512ab2cf3d67b96e377c9f3093ff82a) ) // hacked PAL flash
ROM_FILL( 0x1a004, 1, 0x30 ) // patch broadcast back to NTSC
ROM_END
+// normally, with DIP switch 4 off, HKT-100/110/120 AKA "Katana Set 5.xx", will be booted from flash ROM IC507 (first 2 dumps below)
+// otherwise it boots from EPROM which contain system checker software (last dump)
ROM_START( dcdev )
ROM_REGION(0x200000, "maincpu", 0)
- ROM_LOAD( "hkt-0120.bin", 0x000000, 0x200000, CRC(2186e0e5) SHA1(6bd18fb83f8fdb56f1941e079580e5dd672a6dad) ) // BIOS
-
- ROM_REGION(0x020000, "dcflash", 0)
- ROM_LOAD( "hkt-0120-flash.bin", 0x000000, 0x020000, CRC(7784c304) SHA1(31ef57f550d8cd13e40263cbc657253089e53034) ) // Flash
-ROM_END
-
-ROM_START( dcprt )
- ROM_REGION(0x200000, "maincpu", 0)
- ROM_LOAD( "katana-set5-v0.41-98-08-27.bin", 0x000000, 0x200000, CRC(485877bd) SHA1(dc1af1f1248ffa87d57bc5ef2ea41aac95ecfc5e) ) // BIOS
+ ROM_SYSTEM_BIOS(0, "1011", "Katana Set5 v1.011 (World)") // BOOT flash rom update from Katana SDK R9-R11, WinCE SDK v2.1
+ ROM_LOAD_BIOS(0, "set5v1.011.ic507", 0x000000, 0x200000, CRC(2186e0e5) SHA1(6bd18fb83f8fdb56f1941e079580e5dd672a6dad) )
+ ROM_SYSTEM_BIOS(1, "1001", "Katana Set5 v1.001 (Japan)") // BOOT flash rom update from WinCE SDK v1.0
+ ROM_LOAD_BIOS(1, "set5v1.001.ic507", 0x000000, 0x200000, CRC(5702d38f) SHA1(ea7a3ae1de73683008dd795c252941a4fc81b42e) )
+
+ // 27C160 EPROM (DIP42) IC??? labeled
+ // SET5 FC52
+ // V0.41 98/08/27
+ // also known to exists v0.71 98/11/13
+ ROM_SYSTEM_BIOS(2, "041", "Katana Set5 Checker v0.41")
+ ROM_LOAD_BIOS(2, "set5v0.41.bin", 0x000000, 0x200000, CRC(485877bd) SHA1(dc1af1f1248ffa87d57bc5ef2ea41aac95ecfc5e) )
ROM_REGION(0x020000, "dcflash", 0)
- ROM_LOAD( "dcjp_ntsc.bin", 0x000000, 0x020000, CRC(5f92bf76) SHA1(be78b834f512ab2cf3d67b96e377c9f3093ff82a) ) // Flash
+ ROM_LOAD( "hkt-0120-flash.bin", 0x000000, 0x020000, CRC(7784c304) SHA1(31ef57f550d8cd13e40263cbc657253089e53034) )
ROM_END
/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME */
CONS( 1999, dc, dcjp, 0, dc, dc, dc_cons_state, dcus, "Sega", "Dreamcast (USA, NTSC)", MACHINE_NOT_WORKING )
CONS( 1998, dcjp, 0, 0, dc, dc, dc_cons_state, dcjp, "Sega", "Dreamcast (Japan, NTSC)", MACHINE_NOT_WORKING )
CONS( 1999, dceu, dcjp, 0, dc, dc, dc_cons_state, dcus, "Sega", "Dreamcast (Europe, PAL)", MACHINE_NOT_WORKING )
-CONS( 1998, dcdev, dcjp, 0, dc, dc, dc_cons_state, dc, "Sega", "HKT-0120 Sega Dreamcast Development Box", MACHINE_NOT_WORKING )
-CONS( 1998, dcprt, dcjp, 0, dc, dc, dc_cons_state, dcjp, "Sega", "Katana Set 5 Prototype", MACHINE_NOT_WORKING )
+CONS( 1998, dcdev, 0, 0, dc, dc, dc_cons_state, dc, "Sega", "HKT-0120 Sega Dreamcast Development Box", MACHINE_NOT_WORKING )
diff --git a/src/mame/drivers/ddenlovr.cpp b/src/mame/drivers/ddenlovr.cpp
index 519ed10af03..af2113dc8a4 100644
--- a/src/mame/drivers/ddenlovr.cpp
+++ b/src/mame/drivers/ddenlovr.cpp
@@ -168,7 +168,7 @@ public:
optional_shared_ptr<UINT16> m_protection2;
- UINT8 * m_ddenlovr_pixmap[8];
+ std::unique_ptr<UINT8[]> m_ddenlovr_pixmap[8];
/* blitter (TODO: merge with the dynax.h, where possible) */
int m_extra_layers;
@@ -461,7 +461,7 @@ VIDEO_START_MEMBER(ddenlovr_state,ddenlovr)
for (i = 0; i < 8; i++)
{
- m_ddenlovr_pixmap[i] = auto_alloc_array(machine(), UINT8, 512 * 512);
+ m_ddenlovr_pixmap[i] = std::make_unique<UINT8[]>(512 * 512);
m_ddenlovr_scroll[i * 2 + 0] = m_ddenlovr_scroll[i * 2 + 1] = 0;
}
@@ -542,14 +542,14 @@ VIDEO_START_MEMBER(ddenlovr_state,ddenlovr)
save_item(NAME(m_ddenlovr_blit_pen_mask));
save_item(NAME(m_ddenlovr_blit_regs));
- save_pointer(NAME(m_ddenlovr_pixmap[0]), 512 * 512);
- save_pointer(NAME(m_ddenlovr_pixmap[1]), 512 * 512);
- save_pointer(NAME(m_ddenlovr_pixmap[2]), 512 * 512);
- save_pointer(NAME(m_ddenlovr_pixmap[3]), 512 * 512);
- save_pointer(NAME(m_ddenlovr_pixmap[4]), 512 * 512);
- save_pointer(NAME(m_ddenlovr_pixmap[5]), 512 * 512);
- save_pointer(NAME(m_ddenlovr_pixmap[6]), 512 * 512);
- save_pointer(NAME(m_ddenlovr_pixmap[7]), 512 * 512);
+ save_pointer(NAME(m_ddenlovr_pixmap[0].get()), 512 * 512);
+ save_pointer(NAME(m_ddenlovr_pixmap[1].get()), 512 * 512);
+ save_pointer(NAME(m_ddenlovr_pixmap[2].get()), 512 * 512);
+ save_pointer(NAME(m_ddenlovr_pixmap[3].get()), 512 * 512);
+ save_pointer(NAME(m_ddenlovr_pixmap[4].get()), 512 * 512);
+ save_pointer(NAME(m_ddenlovr_pixmap[5].get()), 512 * 512);
+ save_pointer(NAME(m_ddenlovr_pixmap[6].get()), 512 * 512);
+ save_pointer(NAME(m_ddenlovr_pixmap[7].get()), 512 * 512);
}
VIDEO_START_MEMBER(ddenlovr_state,mmpanic)
@@ -872,17 +872,17 @@ void ddenlovr_state::blit_rect_yh()
if (start + length > 512 * 512)
length = 512 * 512 - start;
- if (m_ddenlovr_dest_layer & 0x0001) memset(m_ddenlovr_pixmap[0] + start, m_ddenlovr_blit_pen, length);
- if (m_ddenlovr_dest_layer & 0x0002) memset(m_ddenlovr_pixmap[1] + start, m_ddenlovr_blit_pen, length);
- if (m_ddenlovr_dest_layer & 0x0004) memset(m_ddenlovr_pixmap[2] + start, m_ddenlovr_blit_pen, length);
- if (m_ddenlovr_dest_layer & 0x0008) memset(m_ddenlovr_pixmap[3] + start, m_ddenlovr_blit_pen, length);
+ if (m_ddenlovr_dest_layer & 0x0001) memset(m_ddenlovr_pixmap[0].get() + start, m_ddenlovr_blit_pen, length);
+ if (m_ddenlovr_dest_layer & 0x0002) memset(m_ddenlovr_pixmap[1].get() + start, m_ddenlovr_blit_pen, length);
+ if (m_ddenlovr_dest_layer & 0x0004) memset(m_ddenlovr_pixmap[2].get() + start, m_ddenlovr_blit_pen, length);
+ if (m_ddenlovr_dest_layer & 0x0008) memset(m_ddenlovr_pixmap[3].get() + start, m_ddenlovr_blit_pen, length);
if (!m_extra_layers) return;
- if (m_ddenlovr_dest_layer & 0x0100) memset(m_ddenlovr_pixmap[4] + start, m_ddenlovr_blit_pen, length);
- if (m_ddenlovr_dest_layer & 0x0200) memset(m_ddenlovr_pixmap[5] + start, m_ddenlovr_blit_pen, length);
- if (m_ddenlovr_dest_layer & 0x0400) memset(m_ddenlovr_pixmap[6] + start, m_ddenlovr_blit_pen, length);
- if (m_ddenlovr_dest_layer & 0x0800) memset(m_ddenlovr_pixmap[7] + start, m_ddenlovr_blit_pen, length);
+ if (m_ddenlovr_dest_layer & 0x0100) memset(m_ddenlovr_pixmap[4].get() + start, m_ddenlovr_blit_pen, length);
+ if (m_ddenlovr_dest_layer & 0x0200) memset(m_ddenlovr_pixmap[5].get() + start, m_ddenlovr_blit_pen, length);
+ if (m_ddenlovr_dest_layer & 0x0400) memset(m_ddenlovr_pixmap[6].get() + start, m_ddenlovr_blit_pen, length);
+ if (m_ddenlovr_dest_layer & 0x0800) memset(m_ddenlovr_pixmap[7].get() + start, m_ddenlovr_blit_pen, length);
}
}
@@ -905,17 +905,17 @@ void ddenlovr_state::blit_fill_xy( int x, int y )
// popmessage("FILL command X %03x Y %03x", x, y);
#endif
- if (m_ddenlovr_dest_layer & 0x0001) memset(m_ddenlovr_pixmap[0] + start, m_ddenlovr_blit_pen, 512 * 512 - start);
- if (m_ddenlovr_dest_layer & 0x0002) memset(m_ddenlovr_pixmap[1] + start, m_ddenlovr_blit_pen, 512 * 512 - start);
- if (m_ddenlovr_dest_layer & 0x0004) memset(m_ddenlovr_pixmap[2] + start, m_ddenlovr_blit_pen, 512 * 512 - start);
- if (m_ddenlovr_dest_layer & 0x0008) memset(m_ddenlovr_pixmap[3] + start, m_ddenlovr_blit_pen, 512 * 512 - start);
+ if (m_ddenlovr_dest_layer & 0x0001) memset(m_ddenlovr_pixmap[0].get() + start, m_ddenlovr_blit_pen, 512 * 512 - start);
+ if (m_ddenlovr_dest_layer & 0x0002) memset(m_ddenlovr_pixmap[1].get() + start, m_ddenlovr_blit_pen, 512 * 512 - start);
+ if (m_ddenlovr_dest_layer & 0x0004) memset(m_ddenlovr_pixmap[2].get() + start, m_ddenlovr_blit_pen, 512 * 512 - start);
+ if (m_ddenlovr_dest_layer & 0x0008) memset(m_ddenlovr_pixmap[3].get() + start, m_ddenlovr_blit_pen, 512 * 512 - start);
if (!m_extra_layers) return;
- if (m_ddenlovr_dest_layer & 0x0100) memset(m_ddenlovr_pixmap[4] + start, m_ddenlovr_blit_pen, 512 * 512 - start);
- if (m_ddenlovr_dest_layer & 0x0200) memset(m_ddenlovr_pixmap[5] + start, m_ddenlovr_blit_pen, 512 * 512 - start);
- if (m_ddenlovr_dest_layer & 0x0400) memset(m_ddenlovr_pixmap[6] + start, m_ddenlovr_blit_pen, 512 * 512 - start);
- if (m_ddenlovr_dest_layer & 0x0800) memset(m_ddenlovr_pixmap[7] + start, m_ddenlovr_blit_pen, 512 * 512 - start);
+ if (m_ddenlovr_dest_layer & 0x0100) memset(m_ddenlovr_pixmap[4].get() + start, m_ddenlovr_blit_pen, 512 * 512 - start);
+ if (m_ddenlovr_dest_layer & 0x0200) memset(m_ddenlovr_pixmap[5].get() + start, m_ddenlovr_blit_pen, 512 * 512 - start);
+ if (m_ddenlovr_dest_layer & 0x0400) memset(m_ddenlovr_pixmap[6].get() + start, m_ddenlovr_blit_pen, 512 * 512 - start);
+ if (m_ddenlovr_dest_layer & 0x0800) memset(m_ddenlovr_pixmap[7].get() + start, m_ddenlovr_blit_pen, 512 * 512 - start);
}
@@ -1701,12 +1701,12 @@ CUSTOM_INPUT_MEMBER(ddenlovr_state::ddenlovr_blitter_irq_r)
WRITE16_MEMBER(ddenlovr_state::ddenlovr_coincounter_0_w)
{
if (ACCESSING_BITS_0_7)
- coin_counter_w(machine(), 0, data & 1);
+ machine().bookkeeping().coin_counter_w(0, data & 1);
}
WRITE16_MEMBER(ddenlovr_state::ddenlovr_coincounter_1_w)
{
if (ACCESSING_BITS_0_7)
- coin_counter_w(machine(), 1, data & 1);
+ machine().bookkeeping().coin_counter_w(1, data & 1);
}
@@ -1936,8 +1936,8 @@ WRITE16_MEMBER(ddenlovr_state::quiz365_coincounter_w)
{
if (m_input_sel == 0x1c)
{
- coin_counter_w(machine(), 0, ~data & 1);
- coin_counter_w(machine(), 1, ~data & 4);
+ machine().bookkeeping().coin_counter_w(0, ~data & 1);
+ machine().bookkeeping().coin_counter_w(1, ~data & 4);
}
}
}
@@ -2012,8 +2012,8 @@ WRITE16_MEMBER(ddenlovr_state::ddenlovj_coincounter_w)
{
if (ACCESSING_BITS_0_7)
{
- coin_counter_w(machine(), 0, data & 0x01);
- coin_counter_w(machine(), 1, data & 0x04);
+ machine().bookkeeping().coin_counter_w(0, data & 0x01);
+ machine().bookkeeping().coin_counter_w(1, data & 0x04);
// data & 0x80 ?
}
}
@@ -2186,8 +2186,8 @@ WRITE16_MEMBER(ddenlovr_state::nettoqc_coincounter_w)
{
if (ACCESSING_BITS_0_7)
{
- coin_counter_w(machine(), 0, data & 0x01);
- coin_counter_w(machine(), 1, data & 0x04);
+ machine().bookkeeping().coin_counter_w(0, data & 0x01);
+ machine().bookkeeping().coin_counter_w(1, data & 0x04);
// data & 0x80 ?
}
}
@@ -2430,7 +2430,7 @@ WRITE8_MEMBER(ddenlovr_state::mmpanic_blitter2_w)
void ddenlovr_state::mmpanic_update_leds()
{
- set_led_status(machine(), 0, m_mmpanic_leds);
+ output().set_led_value(0, m_mmpanic_leds);
}
/* leds 1-8 */
@@ -2451,9 +2451,9 @@ WRITE8_MEMBER(ddenlovr_state::mmpanic_lockout_w)
{
if (m_dsw_sel == 0x0c)
{
- coin_counter_w(machine(), 0, (~data) & 0x01);
- coin_lockout_w(machine(), 0, (~data) & 0x02);
- set_led_status(machine(), 1, (~data) & 0x04);
+ machine().bookkeeping().coin_counter_w(0, (~data) & 0x01);
+ machine().bookkeeping().coin_lockout_w(0, (~data) & 0x02);
+ output().set_led_value(1, (~data) & 0x04);
}
}
@@ -2609,8 +2609,8 @@ WRITE8_MEMBER(ddenlovr_state::funkyfig_lockout_w)
{
case 0x2c:
m_funkyfig_lockout = data;
- coin_counter_w(machine(), 0, data & 0x01);
- coin_lockout_w(machine(), 0, (~data) & 0x02);
+ machine().bookkeeping().coin_counter_w(0, data & 0x01);
+ machine().bookkeeping().coin_lockout_w(0, (~data) & 0x02);
if (data & ~0x03)
logerror("%06x: warning, unknown bits written, lockout = %02x\n", space.device().safe_pc(), data);
break;
@@ -2757,8 +2757,8 @@ WRITE8_MEMBER(ddenlovr_state::hanakanz_coincounter_w)
// bit 2 = hopper (if bet on)
// bit 3 = 1 if bet off
- coin_counter_w(machine(), 0, data & 1);
- coin_counter_w(machine(), 1, data & 2);
+ machine().bookkeeping().coin_counter_w(0, data & 1);
+ machine().bookkeeping().coin_counter_w(1, data & 2);
if (data & 0xf0)
logerror("%04x: warning, coin counter = %02x\n", space.device().safe_pc(), data);
@@ -3001,8 +3001,8 @@ WRITE8_MEMBER(ddenlovr_state::mjchuuka_coincounter_w)
// bit 3 = lockout
// bit 8?
- coin_counter_w(machine(), 0, data & 0x01);
- coin_lockout_w(machine(), 0, (~data) & 0x08);
+ machine().bookkeeping().coin_counter_w(0, data & 0x01);
+ machine().bookkeeping().coin_lockout_w(0, (~data) & 0x08);
if (data & 0x74)
logerror("%04x: warning, coin counter = %02x\n", space.device().safe_pc(), data);
@@ -3180,8 +3180,8 @@ WRITE8_MEMBER(ddenlovr_state::mjmyster_coincounter_w)
switch (m_input_sel)
{
case 0x0c:
- coin_counter_w(machine(), 0, (~data) & 0x01); // coin in
- coin_counter_w(machine(), 0, (~data) & 0x02); // coin out actually
+ machine().bookkeeping().coin_counter_w(0, (~data) & 0x01); // coin in
+ machine().bookkeeping().coin_counter_w(0, (~data) & 0x02); // coin out actually
#ifdef MAME_DEBUG
// popmessage("cc: %02x",data);
#endif
@@ -3304,8 +3304,8 @@ WRITE8_MEMBER(ddenlovr_state::hginga_coins_w)
// bit 2 = hopper (if bet on)
// bit 3 = 1 if bet on
// bit 7?
- coin_counter_w(machine(), 0, data & 1);
- coin_counter_w(machine(), 1, data & 2);
+ machine().bookkeeping().coin_counter_w(0, data & 1);
+ machine().bookkeeping().coin_counter_w(1, data & 2);
#ifdef MAME_DEBUG
// popmessage("COINS %02x", data);
#endif
@@ -3439,8 +3439,8 @@ WRITE8_MEMBER(ddenlovr_state::hgokou_input_w)
// bit 1 = out counter
// bit 2 = hopper
// bit 7 = ?
- coin_counter_w(machine(), 0, data & 1);
- coin_counter_w(machine(), 1, data & 2);
+ machine().bookkeeping().coin_counter_w(0, data & 1);
+ machine().bookkeeping().coin_counter_w(1, data & 2);
m_hopper = data & 0x04;
#ifdef MAME_DEBUG
// popmessage("COINS %02x",data);
@@ -3607,7 +3607,7 @@ WRITE8_MEMBER(ddenlovr_state::hparadis_coin_w)
{
switch (m_input_sel)
{
- case 0x0c: coin_counter_w(machine(), 0, data & 1); break;
+ case 0x0c: machine().bookkeeping().coin_counter_w(0, data & 1); break;
case 0x0d: break;
default:
logerror("%04x: coins_w with select = %02x, data = %02x\n",space.device().safe_pc(), m_input_sel, data);
@@ -3836,7 +3836,7 @@ WRITE8_MEMBER(ddenlovr_state::mjflove_blitter_w)
WRITE8_MEMBER(ddenlovr_state::mjflove_coincounter_w)
{
// bit 0 = in counter
- coin_counter_w(machine(), 0, data & 0x01);
+ machine().bookkeeping().coin_counter_w(0, data & 0x01);
if (data & 0xfe)
{
@@ -3923,10 +3923,10 @@ WRITE8_MEMBER(ddenlovr_state::mjgnight_coincounter_w)
{
m_prot_val = data;
- set_led_status(machine(), 0, data & 0x01); // led? 1 in-game, 0 in service mode / while booting
+ output().set_led_value(0, data & 0x01); // led? 1 in-game, 0 in service mode / while booting
- coin_counter_w(machine(), 0, data & 0x04); // coin-out
- coin_counter_w(machine(), 1, data & 0x08); // coin-in
+ machine().bookkeeping().coin_counter_w(0, data & 0x04); // coin-out
+ machine().bookkeeping().coin_counter_w(1, data & 0x08); // coin-in
if (data & 0xf2)
logerror("%04x: warning, coin counter = %02x\n", space.device().safe_pc(), data);
@@ -4008,8 +4008,8 @@ WRITE8_MEMBER(ddenlovr_state::sryudens_coincounter_w)
// bit 4 = ? on except during boot or test mode
// bit 7 = ? mostly on
- coin_counter_w(machine(), 0, data & 1);
- coin_counter_w(machine(), 1, data & 2);
+ machine().bookkeeping().coin_counter_w(0, data & 1);
+ machine().bookkeeping().coin_counter_w(1, data & 2);
m_hopper = data & 0x04;
if (data & 0x68)
@@ -4069,8 +4069,8 @@ WRITE8_MEMBER(ddenlovr_state::janshinp_coincounter_w)
// bit 3 = ? on except during boot or test mode
// bit 7 = ? mostly on
- coin_counter_w(machine(), 0, data & 1);
- coin_counter_w(machine(), 1, data & 2);
+ machine().bookkeeping().coin_counter_w(0, data & 1);
+ machine().bookkeeping().coin_counter_w(1, data & 2);
if (data & ~0x8b)
logerror("%04x: warning, coin counter = %02x\n", space.device().safe_pc(), data);
@@ -4272,7 +4272,7 @@ WRITE8_MEMBER(ddenlovr_state::htengoku_coin_w)
// bit 0 = coin counter
// bit 1 = out counter
// bit 2 = hopper
- coin_counter_w(machine(), 0, data & 1);
+ machine().bookkeeping().coin_counter_w(0, data & 1);
m_hopper = data & 0x04;
#ifdef MAME_DEBUG
// popmessage("COINS %02x",data);
diff --git a/src/mame/drivers/ddragon.cpp b/src/mame/drivers/ddragon.cpp
index f5b8b590e44..b422887971d 100644
--- a/src/mame/drivers/ddragon.cpp
+++ b/src/mame/drivers/ddragon.cpp
@@ -1750,6 +1750,51 @@ ROM_START( ddragon2u )
ROM_LOAD( "prom.16", 0x0000, 0x0200, CRC(46339529) SHA1(64f4c42a826d67b7cbaa8a23a45ebc4eb6248891) ) /* sprite timing (same as ddragon) */
ROM_END
+ROM_START( ddragon2b )
+ ROM_REGION( 0x30000, "maincpu", 0 )
+ ROM_LOAD( "3", 0x08000, 0x8000, CRC(5cc38bad) SHA1(8ebbb998cce48b5baa4a738c2d4c2e481e2637fb) )
+ ROM_LOAD( "4", 0x10000, 0x8000, CRC(78750947) SHA1(6b8349c3cd27c37a4329cea213b6ff0167c4edee) )
+ ROM_LOAD( "5", 0x18000, 0x8000, CRC(49ddddcd) SHA1(91dc53718d04718b313f23d86e241027c89d1a03) )
+ ROM_LOAD( "6", 0x20000, 0x8000, CRC(097eaf26) SHA1(60504abd30fec44c45197cdf3832c87d05ef577d) )
+
+ ROM_REGION( 0x10000, "sub", 0 ) /* sprite CPU 64kb (Upper 16kb = 0) */
+ ROM_LOAD( "2", 0x00000, 0x10000, CRC(ea437867) SHA1(cd910203af0565f981b9bdef51ea6e9c33ee82d3) )
+
+ ROM_REGION( 0x10000, "soundcpu", 0 ) /* music CPU, 64kb */
+ ROM_LOAD( "11", 0x00000, 0x8000, CRC(75e36cd6) SHA1(f24805f4f6925b3ac508e66a6fc25c275b05f3b9) )
+
+ ROM_REGION( 0x10000, "gfx1", 0 )
+ ROM_LOAD( "1", 0x00000, 0x10000, CRC(3ad1049c) SHA1(11d9544a56f8e6a84beb307a5c8a9ff8afc55c66) ) /* chars */
+
+ ROM_REGION( 0xc0000, "gfx2", 0 )
+ ROM_LOAD( "27", 0x00000, 0x10000, CRC(fe42df5d) SHA1(aab801346c2db04263cb61c97c6e086387675586) ) /* sprites */
+ ROM_LOAD( "26", 0x10000, 0x10000, CRC(42f582c6) SHA1(bb269f677321f706043aa33a12bd3ddda4c32e55) )
+ ROM_LOAD( "23", 0x20000, 0x10000, CRC(e157319f) SHA1(8b898fa20329b12293e7cb7ffc2e1b17304f826f) )
+ ROM_LOAD( "22", 0x30000, 0x10000, CRC(82e952c9) SHA1(d340262c11f3c0ef3640c487e6a78745a2fe97d4) )
+ ROM_LOAD( "25", 0x40000, 0x10000, CRC(4a4a085d) SHA1(80786c6fda135af1f9e9d8191879ab27baf36167) )
+ ROM_LOAD( "24", 0x50000, 0x10000, CRC(c9d52536) SHA1(54f9236c4d22e3fd79d66c3f45b134f1fc9a1d32) )
+ ROM_LOAD( "21", 0x60000, 0x10000, CRC(32ab0897) SHA1(f992dc3876621896b6e1fd6518f576b48d54a631) )
+ ROM_LOAD( "20", 0x70000, 0x10000, CRC(a68e168f) SHA1(6ae596c097d7d435b767207012de1d23316d86d4) )
+ ROM_LOAD( "17", 0x80000, 0x10000, CRC(882f99b1) SHA1(2fbb9171a2c9ddab177efe1e89e96426643d382b) )
+ ROM_LOAD( "16", 0x90000, 0x10000, CRC(e2fe3eca) SHA1(bfd2e91261b9a002a99998486a2b606d4ee2e59b) )
+ ROM_LOAD( "18", 0xa0000, 0x10000, CRC(0e1c6c63) SHA1(506e43161992c41d9b77c1df11228117f0587cbd) )
+ ROM_LOAD( "19", 0xb0000, 0x10000, CRC(0e21eae0) SHA1(0cde9cdc6dbe2015e7f38b391c78cf3f16658e5c) )
+
+ ROM_REGION( 0x40000, "gfx3", 0 )
+ ROM_LOAD( "15", 0x00000, 0x10000, CRC(3c3f16f6) SHA1(2fccbf1dd072c59b5923631fc1c6d40f7ea63996))
+ ROM_LOAD( "13", 0x10000, 0x10000, CRC(7c21be72) SHA1(9935c983d0f7613ee192758ddcd8d8592e8bf78a) )
+ ROM_LOAD( "14", 0x20000, 0x10000, CRC(e92f91f4) SHA1(4351b2b117c1104dcdb6f48531ddad385691c945) )
+ ROM_LOAD( "12", 0x30000, 0x10000, CRC(6896e2f7) SHA1(d230d2406ae451f59d1d0783b1d670a0d3e28d8c) )
+
+ ROM_REGION( 0x40000, "oki", 0 ) /* adpcm samples */
+ ROM_LOAD( "7", 0x00000, 0x10000, CRC(6d9e3f0f) SHA1(5c3e7fb2e46939dd3c540b9e1af9591dbfd15b19) )
+ ROM_LOAD( "9", 0x10000, 0x10000, CRC(0c15dec9) SHA1(b0a6bb13216f4321b5fc01a649ea84d2d1d51088) )
+ ROM_LOAD( "8", 0x20000, 0x10000, CRC(151b22b4) SHA1(3b0470df9b719dd76115d8c549010ec92e28d0d0) )
+ ROM_LOAD( "10", 0x30000, 0x10000, CRC(ae2fc028) SHA1(94fea9088b7b412706b6aaf7aac856709649fb63) )
+
+ ROM_REGION( 0x0200, "proms", 0 ) // wasn't in this set, is it still present?
+ ROM_LOAD( "prom.16", 0x0000, 0x0200, CRC(46339529) SHA1(64f4c42a826d67b7cbaa8a23a45ebc4eb6248891) ) /* sprite timing (same as ddragon) */
+ROM_END
ROM_START( tstrike )
ROM_REGION( 0x30000, "maincpu", 0 ) /* 64k for code + bankswitched memory */
@@ -2145,6 +2190,7 @@ GAME( 1987, ddragon6809a,ddragon, ddragon6809, ddragon, ddragon_state, ddragon
GAME( 1988, ddragon2, 0, ddragon2, ddragon2, ddragon_state, ddragon2, ROT0, "Technos Japan", "Double Dragon II - The Revenge (World)", MACHINE_SUPPORTS_SAVE )
GAME( 1988, ddragon2u, ddragon2, ddragon2, ddragon2, ddragon_state, ddragon2, ROT0, "Technos Japan", "Double Dragon II - The Revenge (US)", MACHINE_SUPPORTS_SAVE )
GAME( 1988, ddragon2j, ddragon2, ddragon2, ddragon2, ddragon_state, ddragon2, ROT0, "Technos Japan", "Double Dragon II - The Revenge (Japan)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // bad dump
+GAME( 1988, ddragon2b, ddragon2, ddragon2, ddragon2, ddragon_state, ddragon2, ROT0, "Technos Japan", "Double Dragon II - The Revenge (US, bootleg)", MACHINE_SUPPORTS_SAVE )
/* these were conversions of double dragon */
GAME( 1991, tstrike, 0, darktowr, tstrike, ddragon_state, darktowr, ROT0, "East Coast Coin Company", "Thunder Strike (set 1)", MACHINE_SUPPORTS_SAVE ) // same manufacturer as The Game Room?
diff --git a/src/mame/drivers/ddribble.cpp b/src/mame/drivers/ddribble.cpp
index 40e2df29ee6..4000dd166af 100644
--- a/src/mame/drivers/ddribble.cpp
+++ b/src/mame/drivers/ddribble.cpp
@@ -63,8 +63,8 @@ WRITE8_MEMBER(ddribble_state::ddribble_coin_counter_w)
/* b2-b3: unknown */
/* b1: coin counter 2 */
/* b0: coin counter 1 */
- coin_counter_w(machine(), 0,(data) & 0x01);
- coin_counter_w(machine(), 1,(data >> 1) & 0x01);
+ machine().bookkeeping().coin_counter_w(0,(data) & 0x01);
+ machine().bookkeeping().coin_counter_w(1,(data >> 1) & 0x01);
}
READ8_MEMBER(ddribble_state::ddribble_vlm5030_busy_r)
diff --git a/src/mame/drivers/de_2.cpp b/src/mame/drivers/de_2.cpp
index 6f4ce3fb2ec..d51d3d5f4a3 100644
--- a/src/mame/drivers/de_2.cpp
+++ b/src/mame/drivers/de_2.cpp
@@ -77,13 +77,10 @@ public:
DECLARE_WRITE8_MEMBER(lamp1_w) { };
DECLARE_WRITE_LINE_MEMBER(ym2151_irq_w);
DECLARE_WRITE_LINE_MEMBER(msm5205_irq_w);
- DECLARE_WRITE_LINE_MEMBER(pia_irq);
DECLARE_WRITE8_MEMBER(sol2_w) { }; // solenoids 8-15
DECLARE_WRITE8_MEMBER(sol3_w);
DECLARE_WRITE8_MEMBER(sound_w);
DECLARE_WRITE_LINE_MEMBER(pia21_ca2_w);
- DECLARE_INPUT_CHANGED_MEMBER(main_nmi);
- DECLARE_INPUT_CHANGED_MEMBER(audio_nmi);
DECLARE_READ8_MEMBER(sound_latch_r);
DECLARE_WRITE8_MEMBER(sample_bank_w);
@@ -276,7 +273,7 @@ WRITE8_MEMBER( de_2_state::dig0_w )
data &= 0x7f;
m_strobe = data & 15;
m_diag = (data & 0x70) >> 4;
- output_set_digit_value(60, patterns[data>>4]); // diag digit
+ output().set_digit_value(60, patterns[data>>4]); // diag digit
m_segment1 = 0;
m_segment2 = 0;
}
@@ -287,7 +284,7 @@ WRITE8_MEMBER( de_2_state::dig1_w )
m_segment2 |= 0x30000;
if ((m_segment2 & 0x70000) == 0x30000)
{
- output_set_digit_value(m_strobe+16, BITSWAP16(m_segment2, 11, 15, 12, 10, 8, 14, 13, 9, 7, 6, 5, 4, 3, 2, 1, 0));
+ output().set_digit_value(m_strobe+16, BITSWAP16(m_segment2, 11, 15, 12, 10, 8, 14, 13, 9, 7, 6, 5, 4, 3, 2, 1, 0));
m_segment2 |= 0x40000;
}
}
@@ -298,7 +295,7 @@ WRITE8_MEMBER( de_2_state::type2alpha3_dig1_w )
m_segment2 |= 0x20000;
if ((m_segment2 & 0x70000) == 0x30000)
{
- output_set_digit_value(m_strobe+16, BITSWAP16(m_segment2, 11, 15, 12, 10, 8, 14, 13, 9, 7, 6, 5, 4, 3, 2, 1, 0));
+ output().set_digit_value(m_strobe+16, BITSWAP16(m_segment2, 11, 15, 12, 10, 8, 14, 13, 9, 7, 6, 5, 4, 3, 2, 1, 0));
m_segment2 |= 0x40000;
}
}
@@ -309,7 +306,7 @@ WRITE8_MEMBER( de_2_state::alpha3_dig1_w )
m_segment2 |= 0x20000;
if ((m_segment2 & 0x70000) == 0x30000)
{
- output_set_digit_value(m_strobe+16, BITSWAP16(m_segment2, 7, 15, 12, 10, 8, 14, 13, 9, 11, 6, 5, 4, 3, 2, 1, 0));
+ output().set_digit_value(m_strobe+16, BITSWAP16(m_segment2, 7, 15, 12, 10, 8, 14, 13, 9, 11, 6, 5, 4, 3, 2, 1, 0));
m_segment2 |= 0x40000;
}
}
@@ -331,7 +328,7 @@ WRITE8_MEMBER( de_2_state::pia2c_pa_w )
m_segment1 |= 0x10000;
if ((m_segment1 & 0x70000) == 0x30000)
{
- output_set_digit_value(m_strobe, BITSWAP16(m_segment1, 7, 15, 12, 10, 8, 14, 13, 9, 11, 6, 5, 4, 3, 2, 1, 0));
+ output().set_digit_value(m_strobe, BITSWAP16(m_segment1, 7, 15, 12, 10, 8, 14, 13, 9, 11, 6, 5, 4, 3, 2, 1, 0));
m_segment1 |= 0x40000;
}
}
@@ -342,7 +339,7 @@ WRITE8_MEMBER( de_2_state::pia2c_pb_w )
m_segment1 |= 0x20000;
if ((m_segment1 & 0x70000) == 0x30000)
{
- output_set_digit_value(m_strobe, BITSWAP16(m_segment1, 7, 15, 12, 10, 8, 14, 13, 9, 11, 6, 5, 4, 3, 2, 1, 0));
+ output().set_digit_value(m_strobe, BITSWAP16(m_segment1, 7, 15, 12, 10, 8, 14, 13, 9, 11, 6, 5, 4, 3, 2, 1, 0));
m_segment1 |= 0x40000;
}
}
@@ -382,7 +379,7 @@ WRITE8_MEMBER( de_2_state::type2alpha3_pia34_pa_w )
m_segment2 |= 0x10000;
if ((m_segment2 & 0x70000) == 0x30000)
{
- output_set_digit_value(m_strobe+16, BITSWAP16(m_segment2, 7, 15, 12, 10, 8, 14, 13, 9, 11, 6, 5, 4, 3, 2, 1, 0));
+ output().set_digit_value(m_strobe+16, BITSWAP16(m_segment2, 7, 15, 12, 10, 8, 14, 13, 9, 11, 6, 5, 4, 3, 2, 1, 0));
m_segment2 |= 0x40000;
}
}
@@ -393,7 +390,7 @@ WRITE8_MEMBER( de_2_state::alpha3_pia34_pa_w )
m_segment2 |= 0x10000;
if ((m_segment2 & 0x70000) == 0x30000)
{
- output_set_digit_value(m_strobe+16, BITSWAP16(m_segment2, 11, 15, 12, 10, 8, 14, 13, 9, 7, 6, 5, 4, 3, 2, 1, 0));
+ output().set_digit_value(m_strobe+16, BITSWAP16(m_segment2, 11, 15, 12, 10, 8, 14, 13, 9, 7, 6, 5, 4, 3, 2, 1, 0));
m_segment2 |= 0x40000;
}
}
diff --git a/src/mame/drivers/de_3.cpp b/src/mame/drivers/de_3.cpp
index 4110d423d49..24793a2058b 100644
--- a/src/mame/drivers/de_3.cpp
+++ b/src/mame/drivers/de_3.cpp
@@ -59,14 +59,11 @@ public:
DECLARE_WRITE8_MEMBER(lamp1_w) { };
//DECLARE_WRITE_LINE_MEMBER(ym2151_irq_w);
//DECLARE_WRITE_LINE_MEMBER(msm5205_irq_w);
- DECLARE_WRITE_LINE_MEMBER(pia_irq);
DECLARE_WRITE8_MEMBER(sol2_w) { }; // solenoids 8-15
DECLARE_WRITE8_MEMBER(sol3_w);
DECLARE_WRITE8_MEMBER(sound_w);
DECLARE_WRITE8_MEMBER(dac_w) { };
DECLARE_WRITE_LINE_MEMBER(pia21_ca2_w);
- DECLARE_INPUT_CHANGED_MEMBER(main_nmi);
- DECLARE_INPUT_CHANGED_MEMBER(audio_nmi);
DECLARE_READ8_MEMBER(dmd_status_r);
// DECLARE_READ8_MEMBER(sound_latch_r);
@@ -91,7 +88,6 @@ private:
UINT8 m_kbdrow;
UINT8 m_diag;
bool m_ca1;
- bool m_irq_active;
UINT8 m_sound_data;
public:
@@ -203,7 +199,7 @@ WRITE8_MEMBER( de_3_state::dig0_w )
// data &= 0x7f;
// m_strobe = data & 15;
// m_diag = (data & 0x70) >> 4;
-// output_set_digit_value(60, patterns[data>>4]); // diag digit
+// output().set_digit_value(60, patterns[data>>4]); // diag digit
// m_segment1 = 0;
// m_segment2 = 0;
}
@@ -215,9 +211,9 @@ WRITE8_MEMBER( de_3_state::dig1_w )
// if ((m_segment2 & 0x70000) == 0x30000)
// {
// if(m_is_alpha3) // Alphanumeric type 2 uses 7 segment LEDs on the bottom row, type 3 uses 14 segment LEDs
-// output_set_digit_value(m_strobe+16, BITSWAP16(m_segment2, 7, 15, 12, 10, 8, 14, 13, 9, 11, 6, 5, 4, 3, 2, 1, 0));
+// output().set_digit_value(m_strobe+16, BITSWAP16(m_segment2, 7, 15, 12, 10, 8, 14, 13, 9, 11, 6, 5, 4, 3, 2, 1, 0));
// else
-// output_set_digit_value(m_strobe+16, BITSWAP16(m_segment2, 11, 15, 12, 10, 8, 14, 13, 9, 7, 6, 5, 4, 3, 2, 1, 0));
+// output().set_digit_value(m_strobe+16, BITSWAP16(m_segment2, 11, 15, 12, 10, 8, 14, 13, 9, 7, 6, 5, 4, 3, 2, 1, 0));
// m_segment2 |= 0x40000;
// }
}
@@ -250,7 +246,7 @@ WRITE8_MEMBER( de_3_state::pia2c_pa_w )
// m_segment1 |= 0x10000;
// if ((m_segment1 & 0x70000) == 0x30000)
// {
-// output_set_digit_value(m_strobe, BITSWAP16(m_segment1, 7, 15, 12, 10, 8, 14, 13, 9, 11, 6, 5, 4, 3, 2, 1, 0));
+// output().set_digit_value(m_strobe, BITSWAP16(m_segment1, 7, 15, 12, 10, 8, 14, 13, 9, 11, 6, 5, 4, 3, 2, 1, 0));
// m_segment1 |= 0x40000;
// }
}
@@ -282,7 +278,7 @@ WRITE8_MEMBER( de_3_state::pia2c_pb_w )
// m_segment1 |= 0x20000;
// if ((m_segment1 & 0x70000) == 0x30000)
// {
-// output_set_digit_value(m_strobe, BITSWAP16(m_segment1, 7, 15, 12, 10, 8, 14, 13, 9, 11, 6, 5, 4, 3, 2, 1, 0));
+// output().set_digit_value(m_strobe, BITSWAP16(m_segment1, 7, 15, 12, 10, 8, 14, 13, 9, 11, 6, 5, 4, 3, 2, 1, 0));
// m_segment1 |= 0x40000;
// }
}
@@ -316,7 +312,7 @@ WRITE8_MEMBER( de_3_state::pia34_pa_w )
// m_segment2 |= 0x10000;
// if ((m_segment2 & 0x70000) == 0x30000)
// {
-// output_set_digit_value(m_strobe+16, BITSWAP16(m_segment2, 7, 15, 12, 10, 8, 14, 13, 9, 11, 6, 5, 4, 3, 2, 1, 0));
+// output().set_digit_value(m_strobe+16, BITSWAP16(m_segment2, 7, 15, 12, 10, 8, 14, 13, 9, 11, 6, 5, 4, 3, 2, 1, 0));
// m_segment2 |= 0x40000;
// }
}
diff --git a/src/mame/drivers/dec0.cpp b/src/mame/drivers/dec0.cpp
index 98f7dee7861..0c8bba5ffb1 100644
--- a/src/mame/drivers/dec0.cpp
+++ b/src/mame/drivers/dec0.cpp
@@ -1887,6 +1887,103 @@ ROM_START( drgninjab )
ROM_LOAD( "eg08.2c", 0x0000, 0x10000, CRC(92f2c916) SHA1(38b4ed81edcc2069b096591bdc5baab8b9edfa9a) ) // different to baddudes
ROM_END
+
+
+/*
+
+ CPUs
+QTY Type clock position function
+1x SCN68000CAN64 main PCB 9h 16/32-bit Microprocessor - main
+1x UM6502 main PCB 7d 8-bit Microprocessor - sound
+1x MC3403 main PCB 14e Quad Operational Amplifier - sound
+1x GL358 main PCB 13b Dual Operational Amplifier - sound
+1x YM2203C main PCB 12a FM Operator Type-M (OPM) - sound
+2x YM3014B main PCB 13d, 13e D/A Converter (DAC) - sound
+1x YM3812 main PCB 9b FM Operator Type-L II (OPL II) - sound
+1x MC68705R3P ROMs PCB 1l 8-bit EPROM Microcomputer Unit - main (not dumped)
+1x M5205 ROMs PCB 12c ADPCM Speech Syntesis IC - sound
+1x oscillator 24.000MHz main PCB 2a
+1x oscillator 16.0000 main PCB 12n
+1x blu resonator CSB-400P ROMs PCB 12b
+ROMs
+QTY Type position status
+4x 27256 main PCB 1-4 dumped
+4x 27512 main PCB 5-8 dumped
+7x 27256 ROMs PCB 15,20-23,28,29 dumped
+9x 27512 ROMs PCB 9-14,27-30 dumped
+2x N82S129AN main PCB 2q,3p not dumped yet
+1x N82S131N main PCB 5q not dumped yet
+1x N82S137N main PCB 8u not dumped yet
+1x N82S129AN ROMs PCB 12c not dumped yet
+RAMs
+QTY Type position
+2x HY6264 main PCB 12c,12d
+14x TMM2018 main PCB 1e,2e,5k,5l,5m,5n,5o,5p,7m,7n,8b,11s,11t,11u
+2x TMM2064 ROMs PCB 8n,8o
+4x TMM2018 ROMs PCB 8f,8g,8j,8k
+PLDs
+QTY Type position status
+Others
+
+1x 28x2 edge connector
+3x 50 pins flat cable connector from main board to roms board
+1x trimmer (volume)
+1x 8x2 switches DIP
+
+*/
+
+ROM_START( drgninjab2 )
+ ROM_REGION( 0x60000, "maincpu", 0 )
+ ROM_LOAD16_BYTE( "a14.3e", 0x00000, 0x10000, CRC(c4b9f4e7) SHA1(4a8176cce8c7909aace8ece4f97b1a199617938e) ) // 99.978638%
+ ROM_LOAD16_BYTE( "a11.3b", 0x00001, 0x10000, CRC(e4cc7c60) SHA1(63aeab4e20420f28a947438f2d7079c92a43d2df) ) // 99.978638%
+ ROM_LOAD16_BYTE( "a12.2e", 0x40000, 0x10000, CRC(2b81faf7) SHA1(6d10c29f5ee06856843d83e77ba24c2b6e00a9cb) )
+ ROM_LOAD16_BYTE( "a9.2b", 0x40001, 0x10000, CRC(c52c2e9d) SHA1(399f2b7df9d558c8f33bf1a7c8048c62e0f54cec) )
+
+ ROM_REGION( 0x10000, "audiocpu", 0 ) /* Sound CPU */
+ ROM_LOAD( "a15.7b", 0x8000, 0x8000, CRC(82007af2) SHA1(f0db1b1dab199df402a7590e56d4d5ab4baca803) ) // 99.612427%
+
+ ROM_REGION( 0x1000, "mcu", 0 ) /* 68705 microcontroller */
+ ROM_LOAD( "mc68705r3p", 0x0000, 0x1000, NO_DUMP )
+
+ ROM_REGION( 0x10000, "gfx1", 0 ) /* chars */
+ ROM_LOAD( "a22.9m", 0x00000, 0x08000, CRC(6791bc20) SHA1(7240b2688cda04ee9ea331472a84fbffc85b8e90) ) // 99.996948%
+ ROM_LOAD( "a23.9n", 0x08000, 0x08000, CRC(5d75fc8f) SHA1(92947dd78bfe8067fb5f645fa1ef212e48b69c70) )
+
+ ROM_REGION( 0x40000, "gfx2", 0 ) /* tiles */ // identical but split into 4 roms
+ ROM_LOAD( "a25.10f", 0x00000, 0x10000, CRC(05cfc3e5) SHA1(a0163921c77dc9706463a402c3dd45ec4341cd21) )
+ ROM_LOAD( "a27.10h", 0x10000, 0x10000, CRC(e11e988f) SHA1(0c59f0d8d1abe414c7e1ebd49d454179fed2cd00) )
+ ROM_LOAD( "a24.10e", 0x20000, 0x10000, CRC(b893d880) SHA1(99e228174677f2e3e96154f77bfa9bf0f1c0a6a5) )
+ ROM_LOAD( "a26.10g", 0x30000, 0x10000, CRC(6f226dda) SHA1(65ebb16a292c57d49c135fce7ed7537146226eb5) )
+
+ ROM_REGION( 0x20000, "gfx3", 0 ) /* tiles */
+ ROM_LOAD( "a29.10k", 0x00000, 0x08000, CRC(4bf80966) SHA1(de4d83bac16f161a43678c2b2ae71f8fcac7212d) )
+ ROM_LOAD( "a21.9k", 0x08000, 0x08000, CRC(b2e989fc) SHA1(492c1f3b18a4059c87254e0cba01ad9848e8b553) )
+ ROM_LOAD( "a28.10j", 0x10000, 0x08000, CRC(2d38032d) SHA1(833ebff370825e5c8b8fc59fbe663b8998884353) )
+ ROM_LOAD( "a20.9j", 0x18000, 0x08000, CRC(e71c0793) SHA1(e42a8192c772da1d6c93f9f9e89c553d712e18f7) )
+
+ ROM_REGION( 0x80000, "gfx4", 0 ) /* sprites */
+ ROM_LOAD( "a6.4g", 0x00000, 0x10000, CRC(5617d67f) SHA1(8f684de27ae79c4d35720706cdd2733af0e0a9cc) )
+ ROM_LOAD( "a2.4c", 0x10000, 0x08000, CRC(17e42633) SHA1(405f5296a741901677cca978a1b287d894eb1e54) )
+ ROM_LOAD( "a8.5g", 0x20000, 0x10000, CRC(ba83e8d8) SHA1(63092a5d0da0c9228a72a83b43a67a47b1388724) )
+ ROM_LOAD( "a4.5c", 0x30000, 0x08000, CRC(fea2a134) SHA1(525dd5f48993db1fe1e3c095442884178f75e8e0) )
+ ROM_LOAD( "a5.3g", 0x40000, 0x10000, CRC(fd91e08e) SHA1(8998f020791c8830e963096dc7b8fcb430d041d4) )
+ ROM_LOAD( "a1.3c", 0x50000, 0x08000, CRC(e83c760a) SHA1(d08db381658b8b3288c5eaa9048a906126e0f712) )
+ ROM_LOAD( "a7.4-5g", 0x60000, 0x10000, CRC(601b7b23) SHA1(c1c665614f1377bc47720382b25c965266a2593f) )
+ ROM_LOAD( "a3.4-5c", 0x70000, 0x08000, CRC(eeee8a1a) SHA1(2bf8378ff38f6a7c7cbd4cbd489de25cb1f0fe71) )
+
+ ROM_REGION( 0x40000, "oki", 0 ) /* ADPCM samples */
+ ROM_LOAD( "a30.10b", 0x0000, 0x10000, CRC(f6806826) SHA1(e2c6a0682f34d30c63dab8715729151cc3657387) ) // 99.218750%
+
+ ROM_REGION( 0x40000, "proms", 0 ) /* proms */
+ ROM_LOAD( "n82s129an.12c", 0x0000, 0x100, CRC(78994fdb) SHA1(cd52bff11b81f19eeb2683ed94b236f1464a5ea9) )
+ ROM_LOAD( "n82s129an.2q", 0x0000, 0x100, CRC(af46d1ee) SHA1(281bcc61d9d67b007c1399e228ec6baf6ab5d4ff) )
+ ROM_LOAD( "n82s129an.3p", 0x0000, 0x100, CRC(9f6aa3e5) SHA1(518247d4581eee3a078269fcf0c86d182cf622cd) )
+ ROM_LOAD( "n82s131n.5q", 0x0000, 0x200, CRC(86e775f8) SHA1(e8dee3d56fb5ca0fd7f9ce05a84674abb139d008) )
+ ROM_LOAD( "n82s137n.8u", 0x0000, 0x400, CRC(a5cda23e) SHA1(d6c8534ae3c95b47a0701047fef67f15dd71f3fe) )
+ROM_END
+
+
+
ROM_START( birdtry )
ROM_REGION( 0x60000, "maincpu", 0 ) /* 6*64k for 68000 code */
ROM_LOAD16_BYTE( "ek-04.bin", 0x00000, 0x10000, CRC(5f0f4686) SHA1(5eea74f5626339ebd50e623029f21f1cd0f93135) )
@@ -2584,6 +2681,49 @@ ROM_END
ROM_START( slyspy )
ROM_REGION( 0x60000, "maincpu", 0 ) /* 68000 code */
+ ROM_LOAD16_BYTE( "fa14-4.17l", 0x00000, 0x10000, CRC(60f16e31) SHA1(b2359fe8ecbed63b7d56c9962fab16b354a14305) )
+ ROM_LOAD16_BYTE( "fa12-4.9l", 0x00001, 0x10000, CRC(b9b9fdcf) SHA1(fdd91b9bc8f0228078bb50323531808076180fe7) )
+ ROM_LOAD16_BYTE( "fa15.19l", 0x20000, 0x10000, CRC(04a79266) SHA1(69d256ffb1c89721f8b1e929c581f187e047b977) )
+ ROM_LOAD16_BYTE( "fa13.11l", 0x20001, 0x10000, CRC(641cc4b3) SHA1(ce0ccd14d201f411cfc02ec988b2ad4fcb0d8f5d) )
+
+ ROM_REGION( 0x10000, "audiocpu", 0 ) /* Sound CPU */
+ ROM_LOAD( "fa10.5h", 0x00000, 0x10000, CRC(dfd2ff25) SHA1(3dcd6d50b92b49daae4b51581abe9c95f764e848) ) // == FB counterpart from World set
+
+ ROM_REGION( 0x10000, "gfx1", 0 ) /* chars */
+ ROM_LOAD( "fa05.11a", 0x04000, 0x04000, CRC(09802924) SHA1(d9bc5fe7f053afa15cd39400aae993866d1b0226) ) // == FB counterpart from World set
+ ROM_CONTINUE( 0x00000, 0x04000 ) /* the two halves are swapped */
+ ROM_LOAD( "fa04.9a", 0x0c000, 0x04000, CRC(ec25b895) SHA1(8c1d2b9a2487fd7114d37fe9dc271183c4cc1613) ) // == FB counterpart from World set
+ ROM_CONTINUE( 0x08000, 0x04000 )
+
+ ROM_REGION( 0x20000, "gfx2", 0 ) /* tiles */
+ ROM_LOAD( "fa07.17a", 0x00000, 0x10000, CRC(e932268b) SHA1(ee8ed29affa951e725cf19a5f56d3beac24420c9) ) // == FB counterpart from World set
+ ROM_LOAD( "fa06.15a", 0x10000, 0x10000, CRC(c4dd38c0) SHA1(267dbbdd5df6b13662cd307c5c95fdf643d64f45) ) // == FB counterpart from World set
+
+ ROM_REGION( 0x40000, "gfx3", 0 ) /* tiles */
+ ROM_LOAD( "fa09.22a", 0x00000, 0x20000, CRC(1395e9be) SHA1(60693ac6236ffe1e0933d81771cfad32e14514c3) ) // == FB counterpart from World set
+ ROM_LOAD( "fa08.21a", 0x20000, 0x20000, CRC(4d7464db) SHA1(82e2a3c3d78447985968220d52c7c1f1ff625d83) )
+
+ ROM_REGION( 0x80000, "gfx4", 0 ) /* sprites */
+ ROM_LOAD( "fa01.4a", 0x00000, 0x20000, CRC(99b0cd92) SHA1(2729e874730391b5fa93e9a28142c02c00eb5068) ) // == FB counterpart from World set
+ ROM_LOAD( "fa03.7a", 0x20000, 0x20000, CRC(0e7ea74d) SHA1(22078a2856933af2d31750a4a506b993fe309e9a) ) // == FB counterpart from World set
+ ROM_LOAD( "fa00.2a", 0x40000, 0x20000, CRC(f7df3fd7) SHA1(ed9e4649e0b1fcca61cf4d159b3f8a35f06102ce) ) // == FB counterpart from World set
+ ROM_LOAD( "fa02.5a", 0x60000, 0x20000, CRC(84e8da9d) SHA1(41da6042f80ea3562aa350f4f466b16db29e2aca) ) // == FB counterpart from World set
+
+ ROM_REGION( 0x40000, "oki", 0 ) /* ADPCM samples */
+ ROM_LOAD( "fa11.11k", 0x00000, 0x20000, CRC(4e547bad) SHA1(655eda4d00f8846957ed40dcbf750fba3ce19f4e) ) // == FB counterpart from World set
+
+ ROM_REGION( 0x0100, "proms", 0 )
+ ROM_LOAD( "mb7114h.21k", 0x0000, 0x0100, CRC(ad26e8d4) SHA1(827337aeb8904429a1c050279240ae38aa6ce064) ) /* Priority (not used) */
+
+ ROM_REGION( 0x0800, "plds", 0 )
+ ROM_LOAD( "pal16l8b-ta-1.15k", 0x0000, 0x0104, CRC(79a87527) SHA1(3c6ad20d5a7c41c020e671d462c0b1e4a5dda7f8) )
+ ROM_LOAD( "pal16r4a-ta-2.16k", 0x0200, 0x0104, CRC(eca31311) SHA1(a87b2721e13767f7448236d0bbb3355583fe88bb) )
+ ROM_LOAD( "pal16l8a-ta-3.17k", 0x0400, 0x0104, CRC(6c324919) SHA1(83bba4634d7ab7c4ad3083c063804fd1e7c9c10b) )
+ ROM_LOAD( "pal16l8a-ta-4.11m", 0x0600, 0x0104, CRC(116177fa) SHA1(f63802578b6f743e2d3a64e4805488d44361dcb2) )
+ROM_END
+
+ROM_START( slyspy3 )
+ ROM_REGION( 0x60000, "maincpu", 0 ) /* 68000 code */
ROM_LOAD16_BYTE( "fa14-3.17l", 0x00000, 0x10000, CRC(54353a84) SHA1(899559f17705a8222fd56e9304e9b802eac8f6db) )
ROM_LOAD16_BYTE( "fa12-2.9l", 0x00001, 0x10000, CRC(1b534294) SHA1(cf7badea6604c47d9f3ff8a0ef326e09de1974a0) )
ROM_LOAD16_BYTE( "fa15.19l", 0x20000, 0x10000, CRC(04a79266) SHA1(69d256ffb1c89721f8b1e929c581f187e047b977) )
@@ -3127,7 +3267,8 @@ GAME( 1989, ffantasy, hippodrm, hippodrm, ffantasy, dec0_state, hippodrm, ROT0
GAME( 1989, ffantasya, hippodrm, hippodrm, ffantasy, dec0_state, hippodrm, ROT0, "Data East Corporation", "Fighting Fantasy (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1989, secretag, 0, slyspy, slyspy, dec0_state, slyspy, ROT0, "Data East Corporation", "Secret Agent (World revision 3)", MACHINE_SUPPORTS_SAVE )
GAME( 1989, secretagj, secretag, slyspy, slyspy, dec0_state, slyspy, ROT0, "Data East Corporation", "Secret Agent (Japan revision 2)", MACHINE_SUPPORTS_SAVE )
-GAME( 1989, slyspy, secretag, slyspy, slyspy, dec0_state, slyspy, ROT0, "Data East USA", "Sly Spy (US revision 3)", MACHINE_SUPPORTS_SAVE )
+GAME( 1989, slyspy, secretag, slyspy, slyspy, dec0_state, slyspy, ROT0, "Data East USA", "Sly Spy (US revision 4)", MACHINE_SUPPORTS_SAVE )
+GAME( 1989, slyspy3, secretag, slyspy, slyspy, dec0_state, slyspy, ROT0, "Data East USA", "Sly Spy (US revision 3)", MACHINE_SUPPORTS_SAVE )
GAME( 1989, slyspy2, secretag, slyspy, slyspy, dec0_state, slyspy, ROT0, "Data East USA", "Sly Spy (US revision 2)", MACHINE_SUPPORTS_SAVE )
GAME( 1989, midres, 0, midres, midres, driver_device, 0, ROT0, "Data East Corporation", "Midnight Resistance (World)", MACHINE_SUPPORTS_SAVE )
GAME( 1989, midresu, midres, midres, midresu, driver_device, 0, ROT0, "Data East USA", "Midnight Resistance (US)", MACHINE_SUPPORTS_SAVE )
@@ -3141,11 +3282,14 @@ GAME( 1990, bouldashj, bouldash, slyspy, bouldash, dec0_state, slyspy, ROT0
GAME( 1988, robocopb, robocop, robocopb, robocop, dec0_state, robocop, ROT0, "bootleg", "Robocop (World bootleg)", MACHINE_SUPPORTS_SAVE )
GAME( 1988, drgninjab, baddudes, baddudes, drgninja, dec0_state, baddudes, ROT0, "bootleg", "Dragonninja (bootleg)", MACHINE_SUPPORTS_SAVE )
+
+
+
// this is a common bootleg board
GAME( 1989, midresb, midres, midresb, midresb, dec0_state, midresb, ROT0, "bootleg", "Midnight Resistance (bootleg with 68705)", MACHINE_SUPPORTS_SAVE ) // need to hook up 68705? (probably unused)
GAME( 1989, midresbj, midres, midresb, midresb, dec0_state, midresb, ROT0, "bootleg", "Midnight Resistance (Joystick bootleg)", MACHINE_SUPPORTS_SAVE )
GAME( 1989, ffantasybl, hippodrm, ffantasybl, ffantasybl, dec0_state, ffantasybl, ROT0, "bootleg", "Fighting Fantasy (bootleg with 68705)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) // 68705 not dumped, might be the same as midresb
-/* A Bad Dudes bootleg with 68705 like the midres and ffantasy ones exists, but is not dumped */
+GAME( 1988, drgninjab2, baddudes, baddudes, drgninja, dec0_state, baddudes, ROT0, "bootleg", "Dragonninja (bootleg with 68705)", MACHINE_SUPPORTS_SAVE ) // is this the same board as above? (region warning hacked to World, but still shows Japanese text)
// these are different to the above but quite similar to each other
GAME( 1988, automat, robocop, automat, robocop, dec0_state, robocop, ROT0, "bootleg", "Automat (bootleg of Robocop)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // sound rom / music from section z with mods for ADPCM?
diff --git a/src/mame/drivers/deco156.cpp b/src/mame/drivers/deco156.cpp
index 9200ac4d862..faa0f3bb6a5 100644
--- a/src/mame/drivers/deco156.cpp
+++ b/src/mame/drivers/deco156.cpp
@@ -51,7 +51,7 @@ public:
/* memory */
UINT16 m_pf1_rowscroll[0x800/2];
UINT16 m_pf2_rowscroll[0x800/2];
- UINT16* m_spriteram;
+ std::unique_ptr<UINT16[]> m_spriteram;
DECLARE_WRITE32_MEMBER(hvysmsh_eeprom_w);
DECLARE_WRITE32_MEMBER(wcvol95_nonbuffered_palette_w);
DECLARE_WRITE32_MEMBER(deco156_nonbuffered_palette_w);
@@ -75,12 +75,12 @@ public:
void deco156_state::video_start()
{
- m_spriteram = auto_alloc_array(machine(), UINT16, 0x2000/2);
+ m_spriteram = std::make_unique<UINT16[]>(0x2000/2);
/* and register the allocated ram so that save states still work */
save_item(NAME(m_pf1_rowscroll));
save_item(NAME(m_pf2_rowscroll));
- save_pointer(NAME(m_spriteram), 0x2000/2);
+ save_pointer(NAME(m_spriteram.get()), 0x2000/2);
}
@@ -95,7 +95,7 @@ UINT32 deco156_state::screen_update_wcvol95(screen_device &screen, bitmap_rgb32
m_deco_tilegen1->pf_update(m_pf1_rowscroll, m_pf2_rowscroll);
m_deco_tilegen1->tilemap_2_draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0);
- m_sprgen->draw_sprites(bitmap, cliprect, m_spriteram, 0x800);
+ m_sprgen->draw_sprites(bitmap, cliprect, m_spriteram.get(), 0x800);
m_deco_tilegen1->tilemap_1_draw(screen, bitmap, cliprect, 0, 0);
return 0;
}
diff --git a/src/mame/drivers/deco_ld.cpp b/src/mame/drivers/deco_ld.cpp
index 9de5ee54313..13beeaf905c 100644
--- a/src/mame/drivers/deco_ld.cpp
+++ b/src/mame/drivers/deco_ld.cpp
@@ -144,11 +144,9 @@ public:
UINT8 m_laserdisc_data;
int m_nmimask;
- DECLARE_WRITE8_MEMBER(rblaster_sound_w);
DECLARE_READ8_MEMBER(laserdisc_r);
DECLARE_WRITE8_MEMBER(laserdisc_w);
DECLARE_READ8_MEMBER(sound_status_r);
- DECLARE_WRITE8_MEMBER(nmimask_w);
DECLARE_WRITE8_MEMBER(decold_sound_cmd_w);
DECLARE_WRITE8_MEMBER(decold_palette_w);
DECLARE_CUSTOM_INPUT_MEMBER(begas_vblank_r);
diff --git a/src/mame/drivers/deco_mlc.cpp b/src/mame/drivers/deco_mlc.cpp
index d8b10793324..a92dcc55393 100644
--- a/src/mame/drivers/deco_mlc.cpp
+++ b/src/mame/drivers/deco_mlc.cpp
@@ -637,8 +637,8 @@ ROM_END
ROM_START( stadhr96 )
ROM_REGION( 0x100000, "maincpu", 0 )
- ROM_LOAD32_WORD( "sh-eaj.2a", 0x000000, 0x80000, CRC(10d1496a) SHA1(1dc151547463a38d717159b3dfce7ffd78a943ad) )
- ROM_LOAD32_WORD( "sh-eaj.2b", 0x000002, 0x80000, CRC(608a9144) SHA1(15e2fa99dc96e8ebd9868713ae7708cb824fc6c5) )
+ ROM_LOAD32_WORD( "sh-eaj.2a", 0x000000, 0x80000, CRC(10d1496a) SHA1(1dc151547463a38d717159b3dfce7ffd78a943ad) ) /* FRI SEP 20 14:32:35 JST 1996 */
+ ROM_LOAD32_WORD( "sh-eaj.2b", 0x000002, 0x80000, CRC(608a9144) SHA1(15e2fa99dc96e8ebd9868713ae7708cb824fc6c5) ) /* EUROPE (DISTRIBUTED) */
ROM_REGION( 0x1800000, "gfx1", 0 )
ROM_LOAD16_BYTE( "mcm-00.2e", 0x0000001, 0x400000, CRC(c1919c3c) SHA1(168000ff1512a147d7029ee8878dd70de680fb08) )
@@ -658,10 +658,33 @@ ROM_START( stadhr96 )
ROM_LOAD( "eeprom-stadhr96.bin", 0x00, 0x80, CRC(77861793) SHA1(df43b3ee55b7eb840cd6d3e5c5e04c68ce64bb57) )
ROM_END
+ROM_START( stadhr96u )
+ ROM_REGION( 0x100000, "maincpu", 0 )
+ ROM_LOAD32_WORD( "eah00-0.2a", 0x000000, 0x80000, CRC(f45b2ca0) SHA1(442dbfea97abb98451b323986878504ac0370e85) ) /* FRI SEP 20 14:01:45 JST 1996 */
+ ROM_LOAD32_WORD( "eah01-0.2b", 0x000002, 0x80000, CRC(328a2bca) SHA1(7e398b48719e5d71b2212d5b65be667e20663589) ) /* U.S.A. */
+
+ ROM_REGION( 0x1800000, "gfx1", 0 )
+ ROM_LOAD16_BYTE( "mcm-00.2e", 0x0000001, 0x400000, CRC(c1919c3c) SHA1(168000ff1512a147d7029ee8878dd70de680fb08) )
+ ROM_LOAD16_BYTE( "mcm-01.8m", 0x0000000, 0x400000, CRC(2255d47d) SHA1(ba3298e781fce1c84f68290bc464f2bc991382c0) )
+ ROM_LOAD16_BYTE( "mcm-02.4e", 0x0800001, 0x400000, CRC(38c39822) SHA1(393d2c1c3c0bcb99df706d32ee3f8b681891dcac) )
+ ROM_LOAD16_BYTE( "mcm-03.10m",0x0800000, 0x400000, CRC(4bd84ca7) SHA1(43dad8ced344f8d629d36f30ab2332879ba067d2) )
+ ROM_LOAD16_BYTE( "mcm-04.6e", 0x1000001, 0x400000, CRC(7c0bd84c) SHA1(730b085a893d3c70592a8b4aecaeeaf4aceede56) )
+ ROM_LOAD16_BYTE( "mcm-05.11m",0x1000000, 0x400000, CRC(476f03d7) SHA1(5c58ab4fc0e29f76619827bc27fa64cce2627e48) )
+
+ ROM_REGION( 0x80000, "gfx2", 0 )
+ ROM_LOAD( "eaf02-0.6h", 0x000000, 0x80000, CRC(f95ad7ce) SHA1(878dcc1d5f76c8523c788e66bb4a8c5740d515e5) )
+
+ ROM_REGION( 0x800000, "ymz", 0 )
+ ROM_LOAD( "mcm-06.6a", 0x000000, 0x400000, CRC(fbc178f3) SHA1(f44cb913177b6552b30c139505c3284bc445ba13) )
+
+ ROM_REGION16_BE( 0x80, "eeprom", ROMREGION_ERASE00 )
+ ROM_LOAD( "eeprom-stadhr96u.bin", 0x00, 0x80, CRC(71d796ba) SHA1(dc23117e24a8e79ca04f60a7cd23e22922ec9846) )
+ROM_END
+
ROM_START( stadhr96j )
ROM_REGION( 0x100000, "maincpu", 0 )
- ROM_LOAD32_WORD( "ead00-4.2a", 0x000000, 0x80000, CRC(b0adfc39) SHA1(3094dfb7c7f8fa9d7e10d98dff8fb8aba285d710) )
- ROM_LOAD32_WORD( "ead01-4.2b", 0x000002, 0x80000, CRC(0b332820) SHA1(28b757fe529250711fcb82424ba63c222a9329b9) )
+ ROM_LOAD32_WORD( "ead00-4.2a", 0x000000, 0x80000, CRC(b0adfc39) SHA1(3094dfb7c7f8fa9d7e10d98dff8fb8aba285d710) ) /* WED SEP 5 00:00:00 JST 1996 (FINAL) */
+ ROM_LOAD32_WORD( "ead01-4.2b", 0x000002, 0x80000, CRC(0b332820) SHA1(28b757fe529250711fcb82424ba63c222a9329b9) ) /* JAPAN */
ROM_REGION( 0x1800000, "gfx1", 0 )
ROM_LOAD16_BYTE( "mcm-00.2e", 0x0000001, 0x400000, CRC(c1919c3c) SHA1(168000ff1512a147d7029ee8878dd70de680fb08) )
@@ -762,7 +785,7 @@ ROM_START( skullfng )
ROM_LOAD16_BYTE( "mch-05.11m",0x800000, 0x200000, CRC(ef0b54ba) SHA1(3be56c064ac81686096be5f31ad2aad948ba6701) )
ROM_REGION( 0x80000, "gfx2", 0 )
- ROM_LOAD( "sh02-0.6h", 0x000000, 0x80000, CRC(0d3ae757) SHA1(480fc3855d330380b75a47a271f3571a59aee10c) ) /* Labeld SW 02-0, but same contents */
+ ROM_LOAD( "sw02-0.6h", 0x000000, 0x80000, CRC(0d3ae757) SHA1(480fc3855d330380b75a47a271f3571a59aee10c) )
ROM_REGION( 0x800000, "ymz", ROMREGION_ERASE00 )
ROM_LOAD( "mch-06.6a", 0x200000, 0x200000, CRC(b2efe4ae) SHA1(5a9dab74c2ba73a65e8f1419b897467804734fa2) )
@@ -869,6 +892,7 @@ DRIVER_INIT_MEMBER(deco_mlc_state,mlc)
GAME( 1995, avengrgs, 0, avengrgs, mlc, deco_mlc_state, avengrgs, ROT0, "Data East Corporation", "Avengers In Galactic Storm (US)", 0 )
GAME( 1995, avengrgsj,avengrgs, avengrgs, mlc, deco_mlc_state, avengrgs, ROT0, "Data East Corporation", "Avengers In Galactic Storm (Japan)", 0 )
GAME( 1996, stadhr96, 0, mlc_6bpp, mlc, deco_mlc_state, mlc, ROT0, "Data East Corporation", "Stadium Hero '96 (World, EAJ)", MACHINE_IMPERFECT_GRAPHICS ) // Rom labels are EAJ ^^
+GAME( 1996, stadhr96u,stadhr96, mlc_6bpp, mlc, deco_mlc_state, mlc, ROT0, "Data East Corporation", "Stadium Hero '96 (USA, EAH)", MACHINE_IMPERFECT_GRAPHICS ) // Rom labels are EAH ^^
GAME( 1996, stadhr96j,stadhr96, mlc_6bpp, mlc, deco_mlc_state, mlc, ROT0, "Data East Corporation", "Stadium Hero '96 (Japan, EAD)", MACHINE_IMPERFECT_GRAPHICS ) // Rom labels are EAD (this isn't a Konami region code!)
GAME( 1996, skullfng, 0, mlc_6bpp, mlc, deco_mlc_state, mlc, ROT270, "Data East Corporation", "Skull Fang (World)", 0 ) /* Version 1.13, Europe, Master 96.02.19 */
GAME( 1996, skullfngj,skullfng, mlc_6bpp, mlc, deco_mlc_state, mlc, ROT270, "Data East Corporation", "Skull Fang (Japan)", 0 ) /* Version 1.09, Japan, Master 96.02.08 */
diff --git a/src/mame/drivers/decwritr.cpp b/src/mame/drivers/decwritr.cpp
index 5c476bb9c1a..539b6768e03 100644
--- a/src/mame/drivers/decwritr.cpp
+++ b/src/mame/drivers/decwritr.cpp
@@ -291,15 +291,14 @@ INPUT_PORTS_END
void decwriter_state::machine_start()
{
- m_speaker->set_frequency(786); // TODO: LA120 speaker is controlled by asic; VT100 has: 7.945us per serial clock = ~125865.324hz, / 160 clocks per char = ~ 786 hz
#if 0
- output_set_value("online_led",1);
- output_set_value("local_led", 0);
- output_set_value("noscroll_led",1);
- output_set_value("basic_led", 1);
- output_set_value("hardcopy_led", 1);
- output_set_value("l1_led", 1);
- output_set_value("l2_led", 1);
+ output().set_value("online_led",1);
+ output().set_value("local_led", 0);
+ output().set_value("noscroll_led",1);
+ output().set_value("basic_led", 1);
+ output().set_value("hardcopy_led", 1);
+ output().set_value("l1_led", 1);
+ output().set_value("l2_led", 1);
#endif
char kbdcol[8];
// look up all 16 tags 'the slow way' but only once on reset
@@ -341,7 +340,7 @@ static MACHINE_CONFIG_START( la120, decwriter_state )
/* audio hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
- MCFG_SOUND_ADD("beeper", BEEP, 0)
+ MCFG_SOUND_ADD("beeper", BEEP, 786) // TODO: LA120 speaker is controlled by asic; VT100 has: 7.945us per serial clock = ~125865.324hz, / 160 clocks per char = ~ 786 hz
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
/* i8251 */
diff --git a/src/mame/drivers/deshoros.cpp b/src/mame/drivers/deshoros.cpp
index fc96684c779..b1884ab9265 100644
--- a/src/mame/drivers/deshoros.cpp
+++ b/src/mame/drivers/deshoros.cpp
@@ -135,7 +135,7 @@ WRITE8_MEMBER(destiny_state::display_w)
WRITE8_MEMBER(destiny_state::out_w)
{
// d0: coin blocker
- coin_lockout_w(machine(), 0, ~data & 1);
+ machine().bookkeeping().coin_lockout_w(0, ~data & 1);
// d1: paper cutter 1
// d2: paper cutter 2
@@ -156,7 +156,7 @@ INPUT_CHANGED_MEMBER(destiny_state::coin_inserted)
// coincounter on coin insert
if (((int)(FPTR)param) == 0)
- coin_counter_w(machine(), 0, newval);
+ machine().bookkeeping().coin_counter_w(0, newval);
}
WRITE8_MEMBER(destiny_state::sound_w)
@@ -235,7 +235,7 @@ static INPUT_PORTS_START( destiny )
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, destiny_state, coin_inserted, (void *)nullptr)
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, destiny_state, coin_inserted, (void *)0)
PORT_START("SERVICE")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_CHANGED_MEMBER(DEVICE_SELF, destiny_state, coin_inserted, (void *)1)
@@ -251,8 +251,6 @@ INPUT_PORTS_END
void destiny_state::machine_start()
{
- m_beeper->set_frequency(800); // TODO: determine exact frequency thru schematics
- m_beeper->set_state(0);
}
void destiny_state::machine_reset()
@@ -265,7 +263,7 @@ static MACHINE_CONFIG_START( destiny, destiny_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", M6809, XTAL_4MHz/2)
MCFG_CPU_PROGRAM_MAP(main_map)
- MCFG_CPU_PERIODIC_INT_DRIVER(destiny_state, irq0_line_hold, 60) // timer irq controls update speed, frequency needs to be determined yet (2MHz through three 74LS390)
+ MCFG_CPU_PERIODIC_INT_DRIVER(destiny_state, irq0_line_hold, 60) // timer irq controls update speed, frequency needs to be determined yet (2MHz through three 74LS390)
/* video hardware (dummy) */
MCFG_SCREEN_ADD("screen", RASTER)
@@ -278,10 +276,9 @@ static MACHINE_CONFIG_START( destiny, destiny_state )
MCFG_PALETTE_ADD("palette", 16)
-
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
- MCFG_SOUND_ADD("beeper", BEEP, 0)
+ MCFG_SOUND_ADD("beeper", BEEP, 800) // TODO: determine exact frequency thru schematics
MCFG_SOUND_ROUTE(ALL_OUTPUTS,"mono",0.50)
MACHINE_CONFIG_END
diff --git a/src/mame/drivers/destroyr.cpp b/src/mame/drivers/destroyr.cpp
index 25e2d0367ca..026e057f14b 100644
--- a/src/mame/drivers/destroyr.cpp
+++ b/src/mame/drivers/destroyr.cpp
@@ -1,4 +1,4 @@
-// license:???
+// license:BSD-3-Clause
// copyright-holders:Stefan Jokisch
/***************************************************************************
@@ -222,8 +222,8 @@ WRITE8_MEMBER(destroyr_state::misc_w)
m_wavemod = data & 0x10;
m_potmask[1] = data & 0x20;
- coin_lockout_w(machine(), 0, !m_attract);
- coin_lockout_w(machine(), 1, !m_attract);
+ machine().bookkeeping().coin_lockout_w(0, !m_attract);
+ machine().bookkeeping().coin_lockout_w(1, !m_attract);
}
@@ -247,10 +247,10 @@ WRITE8_MEMBER(destroyr_state::output_w)
else switch (offset & 7)
{
case 0:
- set_led_status(machine(), 0, data & 1);
+ output().set_led_value(0, data & 1);
break;
case 1:
- set_led_status(machine(), 1, data & 1); /* no second LED present on cab */
+ output().set_led_value(1, data & 1); /* no second LED present on cab */
break;
case 2:
/* bit 0 => songate */
diff --git a/src/mame/drivers/dgpix.cpp b/src/mame/drivers/dgpix.cpp
index c9bd8abe3e2..d3a3f8d270e 100644
--- a/src/mame/drivers/dgpix.cpp
+++ b/src/mame/drivers/dgpix.cpp
@@ -167,7 +167,7 @@ public:
required_device<cpu_device> m_maincpu;
required_ioport m_vblank;
- UINT32 *m_vram;
+ std::unique_ptr<UINT32[]> m_vram;
int m_vbuffer;
int m_flash_roms;
int m_old_vbuf;
@@ -309,8 +309,8 @@ WRITE32_MEMBER(dgpix_state::vbuffer_w)
WRITE32_MEMBER(dgpix_state::coin_w)
{
- coin_counter_w(machine(), 0, data & 1);
- coin_counter_w(machine(), 1, data & 2);
+ machine().bookkeeping().coin_counter_w(0, data & 1);
+ machine().bookkeeping().coin_counter_w(1, data & 2);
}
READ32_MEMBER(dgpix_state::vblank_r)
@@ -376,9 +376,9 @@ INPUT_PORTS_END
void dgpix_state::video_start()
{
- m_vram = auto_alloc_array(machine(), UINT32, 0x40000*2/4);
+ m_vram = std::make_unique<UINT32[]>(0x40000*2/4);
- save_pointer(NAME(m_vram), 0x40000*2/4);
+ save_pointer(NAME(m_vram.get()), 0x40000*2/4);
}
UINT32 dgpix_state::screen_update_dgpix(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
diff --git a/src/mame/drivers/didact.cpp b/src/mame/drivers/didact.cpp
new file mode 100644
index 00000000000..e5f74d458de
--- /dev/null
+++ b/src/mame/drivers/didact.cpp
@@ -0,0 +1,720 @@
+// license:BSD-3-Clause
+// copyright-holders:Joakim Larsson Edstrom
+/*
+ *__________________________________________________________________________________________________________
+ * The Didact Esselte 100 CPU board |
+ *__________________________________________________________________________________________________________|
+ *
+ * ___________________________________________________________________________________________________________ _____________________________________________________
+ * | The Didact Mp68A CPU board, by Anders Andersson 1979 | |The Didact Mp68A keypad/display PB6 +oooo+ |
+ * | +------+ +-------+ +--+ | | by Anders Andersson 1979 +-------+ |cass| |
+ * | | 7402 | | 74490 | | | +-------+ +--+ | | +--+ | 9368 | +----+ +--+|
+ * | +-------+ +------+ +-------+ | | | | | | | |+-------+ 2x5082-|B | +-------+ | ||
+ * | | | 2112 2112 | | | EXP | | | | || 74132 | 7433|CD| 145 PA0-PA3 |E ||
+ * | | ROM | +--+ +--+ +--+ | ANS | |P | | |+-------+ |DI| +--+ 132 |X ||
+ * | | 7641 | | | | | | ION | |I | | |+------+------+ | S| | | +--+ |P ||
+ * | | | |A | |B | +-----+ | BUSES | |A | | || |SHIFT | | P| | | PA4-PA6 | | |A ||
+ * | | 512x8 | | | | | | | | (2 x) | | | | || RES |(led) | +--+ | | | | |N ||
+ * | | | +--+ +--+ | | | FOR | |A | | || | * | +--+ | | |S ||
+ * | +-------+ RAMS 4x256x4 | | | | | | | |+------+------+------+------+ +--+ |I ||
+ * | ROMS 2x512x8 2112 2112 | | | KEY | |E | | || | | | | |O ||
+ * | +-------+ +--+ +--+ |CPU | | BOARD | +------+ |X | | || ADR | RUN | SST | REG | |N ||
+ * | | | | | | | |6800 | | | | | |P | | || 0 | 4 | 8 | C | | ||
+ * | | ROM | |A | |B | | | | AND | | | |A | | |+------+------+------+------+ |C ||
+ * | | 7641 | | | | | | | | | | | |N | | || | | | | |O ||
+ * | | | +--+ +--+ | | | I/O | | 6820 | |S | | || STA | STO | BPR | BPS | |N ||
+ * | | 512x8 | 512 bytes RAM | | | BOARDS| | PIA | |I | | || 1 | 5 | 9 | D | |N ||
+ * | +-------+ | | | | | #1 | |O | +-----+ |+------+------+------+------+ +------+ |E ||
+ * | 1024 bytes ROM | | | | | | |N | | | || | | | | | | |C ||
+ * | +-----+ | | | | | | PIA A | | || EXF | EXB | MOV | PRM | | | |T ||
+ * | 7402 7412 | | | | |B | EXPANSION| | || 2 | 6 | A | E | | | |O ||
+ * | +--+ +--+ | | | | |U | CONNECTOR| | |+------+------+------+------+ | 6820 | |R ||
+ * | | | | | | | | | |S | | _| || | | | | | PIA | | ||
+ * | | | | | | | | | | | J4 | | || CLR | REL | REC | PLA | | #2 | | ||
+ * | | | | | | | +------+ | | | |_ || 3 | 7 | B | F | | | | ||
+ * | +--+ +--+ +--------+ | | | | | | |+------+------+------+------+ | | | ||
+ * | +-+ | 96LS02 | | | | | | | | +-------+ +-------+ +------+ | | | ||
+ * | R * * * R |T| +--------+ | | | | | | | | 74148 | | 74148 | | 7400 | | | | ||
+ * | O X A |R| | | | | | | | +-------+ +-------+ +------+ | | +--+|
+ * | M * * * M |M| Oscillator circuits +-------+ +--+ | | | PB3 PB0-PB2 | | |
+ * | |_| J1 J2 J3 +-----+ | +---------+ +------+ J1 |
+ * |____________________________________________________________________________________________________________| |______ | _|||_ |___________________________________|
+ *
+ * _____________________________________________________________________________________________ ___________________________________________________________________________
+ * |The Didact Mikrodator 6802 CPU board by Lars Bjorklund 1983 ( ) | |The Didact Mikrodator 6802 TB16 board by Lars Bj??rklund 1983 |
+ * | +----= | | +-|||||||-+ ______ |
+ * | | = | | CA2 Tx |terminal | | () | |
+ * | | = | | PA7 Rx +---------+ +----------+ C1nF,<=R18k| | |
+ * | Photo of CPU board mainly covered by TB16 Keypad/Display board +--- = | | CA1 DTR +-----------+ | | CB2->CB1 | E | |
+ * | | | PA4-PA6 | | 1 | BCD | +----+ | X | |
+ * | | | ------->| 74LS145 | | digit 5 | |LS | | P | |
+ * | | | +-----------+ |----------| | 122| | A | |
+ * | +-----=| | | | | | | | N | |
+ * | +-------+ | =| |------ +--------+ | 2 | BCD | | | | S | |
+ * | | | | =| | RES* | SHIFT | LED( ) | | digit 4 | | | | I | |
+ * | | | | =| | | '*' | CA2 v |----------| +----+ | O | |
+ * | | 6821 | | =| | PA3 |PA7 PA2 | PA1 PA0 | | +----| N | |
+ * | | PIA | | =| |----|--+-----|--+--|-----+--|---+ 3 | | PB0-|LS | | |
+ * | | | | =| | v | v | v | v | | BCD | PB7| 244| C | |
+ * | | | | =| | ADR | RUN | SST | CON | 1 | digit 3 | --->| | O | |
+ * | | | | =| | 0 | 4 | 8 | C | |----------| | | N | |
+ * | | | | =| |-------+--------+--------+------+ | |<-------| | N | |
+ * | | | | =| | | | | | 4 | | +----| E | |
+ * | | | | =| | STA | BPS | USERV | | 2 | BCD | | C | |
+ * | | | | =| | 1 | 5 | 9 | D | | digit 2 | | T | |
+ * | | | | =| |-------+--------+--------+------+ |----------| | O | |
+ * | | | | =| | | | | | | | | R | |
+ * | | | | =| | EXF | EXB | MOV | LOAD | 3 5 | BCD | | | |
+ * | | | | =| | 2 | 6 | A | E | | digit 1 | | | |
+ * | +-------+ | =| |-------+--------+--------+------+ |----------| | | |
+ * | | =| | | | | | | | | | |
+ * | +-----=| | CLR | SP | USERJ | FLAG | 4 6 | BCD | | | |
+ * | | | 3 | 7 | B | F | | digit 0 | | () | |
+ * | | |-------+--------+--------+------+ +----------+ +------+ |
+ * | | | |
+ * | | | |
+ * |____________________________________________________________________________________________| |___________________________________________________________________________|
+ *
+ * History of Didact
+ *------------------
+ * Didact Laromedelsproduktion was started in Linkoping in Sweden by Anders Andersson, Arne Kullbjer and
+ * Lars Bjorklund. They constructed a series of microcomputers for educational purposes such as "Mikrodator 6802",
+ * Esselte 100 and the Candela computer for the swedish schools to educate the students in assembly programming
+ * and BASIC for electro mechanical applications such as stepper motors, simple process control, buttons
+ * and LED:s. Didact designs were marketed by Esselte Studium to the swedish schools. The Candela computer
+ * was designed to be the big breakthough and was based on OS9 but lost the battle of the swedish schools to
+ * the Compis computer by TeleNova which was based on CP/M initially but later both lost to IBM PC.
+ *
+ * Misc links about the boards supported by this driver.
+ *-----------------------------------------------------
+ * http://elektronikforumet.com/forum/viewtopic.php?f=11&t=51424
+ * http://kilroy71.fastmail.fm/gallery/Miscellaneous/20120729_019.jpg
+ * http://elektronikforumet.com/forum/download/file.php?id=63988&mode=view
+ * http://elektronikforumet.com/forum/viewtopic.php?f=2&t=79576&start=150#p1203915
+ *
+ * TODO:
+ * Didact designs: mp68a, md6802, md6802v3, Esselte 100, Candela
+ * --------------------------------------------------------------------------
+ * - Add PCB layouts OK OK
+ * - Dump ROM:s, OK OK
+ * - Keyboard OK OK
+ * - Display/CRT OK OK
+ * - Clickable Artwork RQ RQ
+ * - Sound NA NA
+ * - Cassette i/f
+ * - Expansion bus
+ * - Expansion overlay
+ *
+ ****************************************************************************/
+
+#include "emu.h"
+#include "cpu/m6800/m6800.h"
+#include "machine/6821pia.h" // For all boards
+#include "video/dm9368.h" // For the mp68a
+#include "machine/74145.h" // For the md6802
+// Generated artwork includes
+#include "mp68a.lh"
+#include "md6802.lh"
+
+#define VERBOSE 0
+
+#define LOG(x) do { if (VERBOSE) logerror x; } while (0)
+#if VERBOSE >= 2
+#define logerror printf
+#endif
+
+#ifdef _MSC_VER
+#define FUNCNAME __func__
+#else
+#define FUNCNAME __PRETTY_FUNCTION__
+#endif
+
+/* Didact base class */
+class didact_state : public driver_device
+{
+ public:
+ didact_state(const machine_config &mconfig, device_type type, const char * tag)
+ : driver_device(mconfig, type, tag)
+ ,m_io_line0(*this, "LINE0")
+ ,m_io_line1(*this, "LINE1")
+ ,m_io_line2(*this, "LINE2")
+ ,m_io_line3(*this, "LINE3")
+ ,m_io_line4(*this, "LINE4")
+ ,m_line0(0)
+ ,m_line1(0)
+ ,m_line2(0)
+ ,m_line3(0)
+ ,m_reset(0)
+ ,m_shift(0)
+ ,m_led(0)
+ { }
+ required_ioport m_io_line0;
+ required_ioport m_io_line1;
+ required_ioport m_io_line2;
+ required_ioport m_io_line3;
+ required_ioport m_io_line4;
+ UINT8 m_line0;
+ UINT8 m_line1;
+ UINT8 m_line2;
+ UINT8 m_line3;
+ UINT8 m_reset;
+ UINT8 m_shift;
+ UINT8 m_led;
+ TIMER_DEVICE_CALLBACK_MEMBER(scan_artwork);
+};
+
+/* Esselte 100 driver class */
+class e100_state : public didact_state
+{
+ public:
+ e100_state(const machine_config &mconfig, device_type type, const char * tag)
+ : didact_state(mconfig, type, tag),
+ m_maincpu(*this, "maincpu"),
+ m_pia1(*this, "pia1"),
+ m_pia2(*this, "pia2")
+ { }
+ required_device<m6802_cpu_device> m_maincpu;
+ virtual void machine_reset() override { m_maincpu->reset(); LOG(("--->%s()\n", FUNCNAME)); };
+protected:
+ required_device<pia6821_device> m_pia1;
+ required_device<pia6821_device> m_pia2;
+};
+
+/* Mikrodator 6802 driver class */
+class md6802_state : public didact_state
+{
+ public:
+ md6802_state(const machine_config &mconfig, device_type type, const char * tag)
+ : didact_state(mconfig, type, tag)
+ ,m_maincpu(*this, "maincpu")
+ ,m_tb16_74145(*this, "tb16_74145")
+ ,m_segments(0)
+ ,m_pia1(*this, "pia1")
+ ,m_pia2(*this, "pia2")
+ { }
+ required_device<m6802_cpu_device> m_maincpu;
+ required_device<ttl74145_device> m_tb16_74145;
+ UINT8 m_segments;
+ DECLARE_READ8_MEMBER( pia2_kbA_r );
+ DECLARE_WRITE8_MEMBER( pia2_kbA_w );
+ DECLARE_READ8_MEMBER( pia2_kbB_r );
+ DECLARE_WRITE8_MEMBER( pia2_kbB_w );
+ DECLARE_WRITE_LINE_MEMBER( pia2_ca2_w);
+
+ virtual void machine_reset() override;
+ virtual void machine_start() override;
+protected:
+ required_device<pia6821_device> m_pia1;
+ required_device<pia6821_device> m_pia2;
+};
+
+/* Keyboard */
+READ8_MEMBER( md6802_state::pia2_kbA_r )
+{
+ UINT8 ls145;
+ UINT8 pa = 0xff;
+
+ // Read out the selected column
+ ls145 = m_tb16_74145->read() & 0x0f;
+
+ // read out the artwork, line04 is handled by the timer
+ m_line0 = m_io_line0->read();
+ m_line1 = m_io_line1->read();
+ m_line2 = m_io_line2->read();
+ m_line3 = m_io_line3->read();
+
+#if VERBOSE > 2
+ if ((m_line0 | m_line1 | m_line2 | m_line3) != 0)
+ LOG(("%s()-->%02x %02x %02x %02x modified by %02x displaying %02x\n", FUNCNAME, m_line0, m_line1, m_line2, m_line3, m_shift, ls145));
+#endif
+
+ // Mask out those rows that has a button pressed
+ pa &= ~(((~m_line0 & ls145 ) != 0) ? 1 : 0);
+ pa &= ~(((~m_line1 & ls145 ) != 0) ? 2 : 0);
+ pa &= ~(((~m_line2 & ls145 ) != 0) ? 4 : 0);
+ pa &= ~(((~m_line3 & ls145 ) != 0) ? 8 : 0);
+
+ if (m_shift)
+ {
+ pa &= 0x7f; // Clear shift bit if button being pressed (PA7) to ground (internal pullup)
+ LOG( ("SHIFT is pressed\n") );
+ }
+
+#if VERBOSE > 2
+ if ((m_line0 | m_line1 | m_line2 | m_line3) != 0)
+ LOG(("%s()-->LINE: 0:%02x 1:%02x 2:%02x 3:%02x SHIFT:%02x LS145:%02x PA:%02x\n", FUNCNAME, m_line0, m_line1, m_line2, m_line3, m_shift, ls145, pa));
+#endif
+
+ return pa;
+}
+
+/* Pull the cathodes low enabling the correct digit and lit the segments held by port B */
+WRITE8_MEMBER( md6802_state::pia2_kbA_w )
+{
+ UINT8 digit_nbr;
+
+// LOG(("--->%s(%02x)\n", FUNCNAME, data));
+
+ digit_nbr = (data >> 4) & 0x07;
+ m_tb16_74145->write( digit_nbr );
+ if (digit_nbr < 6)
+ {
+ output().set_digit_value( digit_nbr, m_segments);
+ }
+}
+
+/* PIA 2 Port B is all outputs to drive the display so it is very unlikelly that this function is called */
+READ8_MEMBER( md6802_state::pia2_kbB_r )
+{
+ LOG( ("Warning, trying to read from Port B designated to drive the display, please check why\n") );
+ logerror("Warning, trying to read from Port B designated to drive the display, please check why\n");
+ return 0;
+}
+
+/* Port B is fully used ouputting the segment pattern to the display */
+WRITE8_MEMBER( md6802_state::pia2_kbB_w )
+{
+// LOG(("--->%s(%02x)\n", FUNCNAME, data));
+
+ /* Store the segment pattern but do not lit up the digit here, done by pulling the correct cathode low on Port A */
+ m_segments = BITSWAP8(data, 0, 4, 5, 3, 2, 1, 7, 6);
+}
+
+WRITE_LINE_MEMBER( md6802_state::pia2_ca2_w )
+{
+ LOG(("--->%s(%02x) LED is connected through resisitor to +5v so logical 0 will lit it\n", FUNCNAME, state));
+ output().set_led_value(m_led, !state);
+ m_shift = !state;
+}
+
+void md6802_state::machine_start()
+{
+ LOG(("--->%s()\n", FUNCNAME));
+ save_item(NAME(m_shift));
+ save_item(NAME(m_led));
+ save_item(NAME(m_reset));
+}
+
+void md6802_state::machine_reset()
+{
+ LOG(("--->%s()\n", FUNCNAME));
+ m_led = 1;
+ m_maincpu->reset();
+}
+
+/* Didact mp68a driver class */
+
+// Just a statement that the real mp68a hardware was designed with 6820 and not 6821
+// They are functional equivalents BUT has different electrical characteristics.
+#define pia6820_device pia6821_device
+#define PIA6820 PIA6821
+class mp68a_state : public didact_state
+{
+ public:
+ mp68a_state(const machine_config &mconfig, device_type type, const char * tag)
+ : didact_state(mconfig, type, tag)
+ ,m_maincpu(*this, "maincpu")
+ ,m_digit0(*this, "digit0")
+ ,m_digit1(*this, "digit1")
+ ,m_digit2(*this, "digit2")
+ ,m_digit3(*this, "digit3")
+ ,m_digit4(*this, "digit4")
+ ,m_digit5(*this, "digit5")
+ ,m_pia1(*this, "pia1")
+ ,m_pia2(*this, "pia2")
+ { }
+
+ required_device<m6800_cpu_device> m_maincpu;
+
+ // The display segment driver device (there is actually just one, needs rewrite to be correct)
+ required_device<dm9368_device> m_digit0;
+ required_device<dm9368_device> m_digit1;
+ required_device<dm9368_device> m_digit2;
+ required_device<dm9368_device> m_digit3;
+ required_device<dm9368_device> m_digit4;
+ required_device<dm9368_device> m_digit5;
+
+ DECLARE_READ8_MEMBER( pia2_kbA_r );
+ DECLARE_WRITE8_MEMBER( pia2_kbA_w );
+ DECLARE_READ8_MEMBER( pia2_kbB_r );
+ DECLARE_WRITE8_MEMBER( pia2_kbB_w );
+ DECLARE_READ_LINE_MEMBER( pia2_cb1_r );
+
+ virtual void machine_reset() override;
+ virtual void machine_start() override;
+protected:
+ required_device<pia6820_device> m_pia1;
+ required_device<pia6820_device> m_pia2;
+};
+
+READ8_MEMBER( mp68a_state::pia2_kbA_r )
+{
+ LOG(("--->%s\n", FUNCNAME));
+
+ return 0;
+}
+
+WRITE8_MEMBER( mp68a_state::pia2_kbA_w )
+{
+ UINT8 digit_nbr;
+
+#if VERBOSE > 1
+ static UINT8 display[] = {' ',' ',' ',' ',' ',' ',' ',' ','\0'};
+ const UINT8 hex[] = {' ','0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
+#endif
+
+ /* Display memory is at $702 to $708 in AAAADD format (A=address digit, D=Data digit)
+ but we are using data read from the port. */
+ digit_nbr = (data >> 4) & 0x07;
+
+ /* There is actually only one 9368 and a 74145 to drive the cathode of the right digit low */
+ /* This can be emulated by prentending there are one 9368 per digit, at least for now */
+ switch (digit_nbr)
+ {
+ case 0: m_digit0->a_w(data & 0x0f); break;
+ case 1: m_digit1->a_w(data & 0x0f); break;
+ case 2: m_digit2->a_w(data & 0x0f); break;
+ case 3: m_digit3->a_w(data & 0x0f); break;
+ case 4: m_digit4->a_w(data & 0x0f); break;
+ case 5: m_digit5->a_w(data & 0x0f); break;
+ case 7: break; // used as an 'unselect' by the ROM between digit accesses.
+ default: logerror("Invalid digit index %d\n", digit_nbr);
+ }
+
+#if VERBOSE > 1
+ display[(data >> 4) & 0x07] = hex[data & 0x0f];
+ LOG(("--->%s(%02x) ==> %s\n", FUNCNAME, data, display));
+#endif
+}
+
+READ8_MEMBER( mp68a_state::pia2_kbB_r )
+{
+ UINT8 a012, line, pb;
+
+ LOG(("--->%s %02x %02x %02x %02x %02x => ", FUNCNAME, m_line0, m_line1, m_line2, m_line3, m_shift));
+
+ a012 = 0;
+ if ((line = (m_line0 | m_line1)) != 0)
+ {
+ a012 = 8;
+ while (a012 > 0 && !(line & (1 << --a012)));
+ a012 += 8;
+ }
+ if ( a012 == 0 && (line = ((m_line2) | m_line3)) != 0)
+ {
+ a012 = 8;
+ while (a012 > 0 && !(line & (1 << --a012)));
+ }
+
+ pb = a012; // A0-A2 -> PB0-PB3
+
+ if (m_shift)
+ {
+ pb |= 0x80; // Set shift bit (PB7)
+ m_shift = 0; // Reset flip flop
+ output().set_led_value(m_led, m_shift);
+ LOG( ("SHIFT is released\n") );
+ }
+
+ LOG(("%02x\n", pb));
+
+ return pb;
+}
+
+WRITE8_MEMBER( mp68a_state::pia2_kbB_w )
+{
+ LOG(("--->%s(%02x)\n", FUNCNAME, data));
+}
+
+READ_LINE_MEMBER( mp68a_state::pia2_cb1_r )
+{
+ m_line0 = m_io_line0->read();
+ m_line1 = m_io_line1->read();
+ m_line2 = m_io_line2->read();
+ m_line3 = m_io_line3->read();
+
+#if VERBOSE
+ if ((m_line0 | m_line1 | m_line2 | m_line3) != 0)
+ LOG(("%s()-->%02x %02x %02x %02x\n", FUNCNAME, m_line0, m_line1, m_line2, m_line3));
+#endif
+
+ return (m_line0 | m_line1 | m_line2 | m_line3) != 0 ? 0 : 1;
+}
+
+void mp68a_state::machine_reset()
+{
+ LOG(("--->%s()\n", FUNCNAME));
+ m_maincpu->reset();
+}
+
+void mp68a_state::machine_start()
+{
+ LOG(("--->%s()\n", FUNCNAME));
+
+ /* register for state saving */
+ save_item(NAME(m_shift));
+ save_item(NAME(m_led));
+ save_item(NAME(m_reset));
+}
+
+// This map is derived from info in "TEMAL 100 - teknisk manual Esselte 100"
+static ADDRESS_MAP_START( e100_map, AS_PROGRAM, 8, e100_state )
+ AM_RANGE(0x0000, 0x1fff) AM_RAM
+ AM_RANGE(0xc000, 0xc3ff) AM_RAM AM_SHARE("videoram")
+ AM_RANGE(0xc808, 0xc80b) AM_DEVREADWRITE("pia1", pia6821_device, read, write)
+ AM_RANGE(0xc810, 0xc813) AM_DEVREADWRITE("pia2", pia6821_device, read, write)
+ AM_RANGE(0xd000, 0xffff) AM_ROM AM_REGION("maincpu", 0xd000)
+ADDRESS_MAP_END
+
+// This address map is traced from schema
+static ADDRESS_MAP_START( md6802_map, AS_PROGRAM, 8, md6802_state )
+ AM_RANGE(0x0000, 0x1fff) AM_RAM AM_MIRROR(0x1800)
+ AM_RANGE(0xa000, 0xa003) AM_DEVREADWRITE("pia1", pia6821_device, read, write) AM_MIRROR(0x1ffc)
+ AM_RANGE(0xc000, 0xc003) AM_DEVREADWRITE("pia2", pia6821_device, read, write) AM_MIRROR(0x1ffc)
+ AM_RANGE(0xe000, 0xffff) AM_ROM AM_MIRROR(0x1800) AM_REGION("maincpu", 0xe000)
+ADDRESS_MAP_END
+
+// This address map is traced from pcb
+static ADDRESS_MAP_START( mp68a_map, AS_PROGRAM, 8, mp68a_state )
+ AM_RANGE(0x0000, 0x00ff) AM_RAM AM_MIRROR(0xf000)
+ AM_RANGE(0x0500, 0x0503) AM_DEVREADWRITE("pia1", pia6820_device, read, write) AM_MIRROR(0xf0fc)
+ AM_RANGE(0x0600, 0x0603) AM_DEVREADWRITE("pia2", pia6820_device, read, write) AM_MIRROR(0xf0fc)
+ AM_RANGE(0x0700, 0x07ff) AM_RAM AM_MIRROR(0xf000)
+ AM_RANGE(0x0800, 0x0bff) AM_ROM AM_MIRROR(0xf400) AM_REGION("maincpu", 0x0800)
+ADDRESS_MAP_END
+
+/* Input ports */
+static INPUT_PORTS_START( e100 )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( md6802 )
+ PORT_START("LINE0") /* KEY ROW 0 */
+ PORT_BIT(0x01, 0x01, IPT_KEYBOARD) PORT_NAME("0") PORT_CODE(KEYCODE_0) PORT_CHAR('0')
+ PORT_BIT(0x02, 0x02, IPT_KEYBOARD) PORT_NAME("1") PORT_CODE(KEYCODE_1) PORT_CHAR('1')
+ PORT_BIT(0x04, 0x04, IPT_KEYBOARD) PORT_NAME("2") PORT_CODE(KEYCODE_2) PORT_CHAR('2')
+ PORT_BIT(0x08, 0x08, IPT_KEYBOARD) PORT_NAME("3") PORT_CODE(KEYCODE_3) PORT_CHAR('3')
+ PORT_BIT(0xf0, 0x00, IPT_UNUSED )
+
+ PORT_START("LINE1") /* KEY ROW 1 */
+ PORT_BIT(0x01, 0x01, IPT_KEYBOARD) PORT_NAME("4") PORT_CODE(KEYCODE_4) PORT_CHAR('4')
+ PORT_BIT(0x02, 0x02, IPT_KEYBOARD) PORT_NAME("5") PORT_CODE(KEYCODE_5) PORT_CHAR('5')
+ PORT_BIT(0x04, 0x04, IPT_KEYBOARD) PORT_NAME("6") PORT_CODE(KEYCODE_6) PORT_CHAR('6')
+ PORT_BIT(0x08, 0x08, IPT_KEYBOARD) PORT_NAME("7") PORT_CODE(KEYCODE_7) PORT_CHAR('7')
+ PORT_BIT(0xf0, 0x00, IPT_UNUSED )
+
+ PORT_START("LINE2") /* KEY ROW 2 */
+ PORT_BIT(0x01, 0x01, IPT_KEYBOARD) PORT_NAME("8") PORT_CODE(KEYCODE_8) PORT_CHAR('8')
+ PORT_BIT(0x02, 0x02, IPT_KEYBOARD) PORT_NAME("9") PORT_CODE(KEYCODE_9) PORT_CHAR('9')
+ PORT_BIT(0x04, 0x04, IPT_KEYBOARD) PORT_NAME("A") PORT_CODE(KEYCODE_A) PORT_CHAR('A')
+ PORT_BIT(0x08, 0x08, IPT_KEYBOARD) PORT_NAME("B") PORT_CODE(KEYCODE_B) PORT_CHAR('B')
+ PORT_BIT(0xf0, 0x00, IPT_UNUSED )
+
+ PORT_START("LINE3") /* KEY ROW 3 */
+ PORT_BIT(0x01, 0x01, IPT_KEYBOARD) PORT_NAME("C") PORT_CODE(KEYCODE_C) PORT_CHAR('C')
+ PORT_BIT(0x02, 0x02, IPT_KEYBOARD) PORT_NAME("D") PORT_CODE(KEYCODE_D) PORT_CHAR('D')
+ PORT_BIT(0x04, 0x04, IPT_KEYBOARD) PORT_NAME("E") PORT_CODE(KEYCODE_E) PORT_CHAR('E')
+ PORT_BIT(0x08, 0x08, IPT_KEYBOARD) PORT_NAME("F") PORT_CODE(KEYCODE_F) PORT_CHAR('F')
+ PORT_BIT(0xf0, 0x00, IPT_UNUSED )
+
+ PORT_START("LINE4") /* Special KEY ROW for reset and Shift/'*' keys */
+ PORT_BIT(0x08, 0x00, IPT_KEYBOARD) PORT_NAME("*") PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR('*')
+ PORT_BIT(0x04, 0x00, IPT_KEYBOARD) PORT_NAME("Reset") PORT_CODE(KEYCODE_F12)
+ PORT_BIT(0xf3, 0x00, IPT_UNUSED )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( mp68a )
+ PORT_START("LINE0") /* KEY ROW 0 */
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("C") PORT_CODE(KEYCODE_C) PORT_CHAR('C')
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("D") PORT_CODE(KEYCODE_D) PORT_CHAR('D')
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("E") PORT_CODE(KEYCODE_E) PORT_CHAR('E')
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F") PORT_CODE(KEYCODE_F) PORT_CHAR('F')
+ PORT_BIT(0x0f, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("LINE1") /* KEY ROW 1 */
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("8") PORT_CODE(KEYCODE_8) PORT_CHAR('8')
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("9") PORT_CODE(KEYCODE_9) PORT_CHAR('9')
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("A") PORT_CODE(KEYCODE_A) PORT_CHAR('A')
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("B") PORT_CODE(KEYCODE_B) PORT_CHAR('B')
+ PORT_BIT(0xf0, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("LINE2") /* KEY ROW 2 */
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("4") PORT_CODE(KEYCODE_4) PORT_CHAR('4')
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("5") PORT_CODE(KEYCODE_5) PORT_CHAR('5')
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("6") PORT_CODE(KEYCODE_6) PORT_CHAR('6')
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("7") PORT_CODE(KEYCODE_7) PORT_CHAR('7')
+ PORT_BIT(0x0f, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("LINE3") /* KEY ROW 3 */
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("0") PORT_CODE(KEYCODE_0) PORT_CHAR('0')
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("1") PORT_CODE(KEYCODE_1) PORT_CHAR('1')
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("2") PORT_CODE(KEYCODE_2) PORT_CHAR('2')
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("3") PORT_CODE(KEYCODE_3) PORT_CHAR('3')
+ PORT_BIT(0xf0, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("LINE4") /* Special KEY ROW for reset and Shift/'*' keys */
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("*") PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR('*')
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Reset") PORT_CODE(KEYCODE_F12)
+ PORT_BIT(0xf3, IP_ACTIVE_HIGH, IPT_UNUSED )
+INPUT_PORTS_END
+
+TIMER_DEVICE_CALLBACK_MEMBER(didact_state::scan_artwork)
+{
+ // LOG(("--->%s()\n", FUNCNAME));
+
+ // Poll the artwork Reset key
+ if ( (m_io_line4->read() & 0x04) )
+ {
+ LOG( ("RESET is pressed, resetting the CPU\n") );
+ m_shift = 0;
+ output().set_led_value(m_led, m_shift); // For mp68a only
+ if (m_reset == 0)
+ {
+ machine_reset();
+ }
+ m_reset = 1; // Inhibit multiple resets
+ }
+
+ // Poll the artwork SHIFT/* key
+ else if ( (m_io_line4->read() & 0x08) )
+ {
+ LOG( ("%s", !m_shift ? "SHIFT is set\n" : "") );
+ m_shift = 1;
+ output().set_led_value(m_led, m_shift); // For mp68a only
+ }
+ else
+ {
+ if (m_reset == 1)
+ {
+ m_reset = 0; // Enable reset again
+ }
+ }
+}
+
+static MACHINE_CONFIG_START( e100, e100_state )
+ MCFG_CPU_ADD("maincpu", M6802, XTAL_4MHz)
+ MCFG_CPU_PROGRAM_MAP(e100_map)
+
+ /* devices */
+ MCFG_DEVICE_ADD("pia1", PIA6821, 0)
+ MCFG_DEVICE_ADD("pia2", PIA6821, 0)
+MACHINE_CONFIG_END
+
+static MACHINE_CONFIG_START( md6802, md6802_state )
+ MCFG_CPU_ADD("maincpu", M6802, XTAL_4MHz)
+ MCFG_CPU_PROGRAM_MAP(md6802_map)
+ MCFG_DEFAULT_LAYOUT(layout_md6802)
+
+ /* Devices */
+ MCFG_DEVICE_ADD("tb16_74145", TTL74145, 0)
+ /* PIA #1 0xA000-0xA003 - used differently by laborations and loaded software */
+ MCFG_DEVICE_ADD("pia1", PIA6821, 0)
+
+ /* PIA #2 Keyboard & Display 0xC000-0xC003 */
+ MCFG_DEVICE_ADD("pia2", PIA6821, 0)
+ /* --init----------------------- */
+ /* 0xE007 0xC002 (DDR B) = 0xFF - Port B all outputs and set to 0 (zero) */
+ /* 0xE00B 0xC000 (DDR A) = 0x70 - Port A three outputs and set to 0 (zero) */
+ /* 0xE00F 0xC001 (Control A) = 0x3C - */
+ /* 0xE013 0xC003 (Control B) = 0x3C - */
+ /* --execution-wait for key loop-- */
+ /* 0xE026 0xC000 = (Reading Port A) */
+ /* 0xE033 0xC000 = (Reading Port A) */
+ /* 0xE068 0xC000 (Port A) = 0x60 */
+ /* 0xE08A 0xC002 (Port B) = 0xEE - updating display */
+ /* 0xE090 0xC000 (Port A) = 0x00 - looping in 0x10,0x20,0x30,0x40,0x50 */
+ MCFG_PIA_WRITEPA_HANDLER(WRITE8(md6802_state, pia2_kbA_w))
+ MCFG_PIA_READPA_HANDLER(READ8(md6802_state, pia2_kbA_r))
+ MCFG_PIA_WRITEPB_HANDLER(WRITE8(md6802_state, pia2_kbB_w))
+ MCFG_PIA_READPB_HANDLER(READ8(md6802_state, pia2_kbB_r))
+ MCFG_PIA_CA2_HANDLER(WRITELINE(md6802_state, pia2_ca2_w))
+ MCFG_TIMER_DRIVER_ADD_PERIODIC("artwork_timer", md6802_state, scan_artwork, attotime::from_hz(10))
+MACHINE_CONFIG_END
+
+static MACHINE_CONFIG_START( mp68a, mp68a_state )
+ // Clock source is based on a N9602N Dual Retriggerable Resettable Monostable Multivibrator oscillator at aprox 505KHz.
+ // Trimpot seems broken/stuck at 5K Ohm thu. ROM code 1Ms delay loops suggest 1MHz+
+ MCFG_CPU_ADD("maincpu", M6800, 505000)
+ MCFG_CPU_PROGRAM_MAP(mp68a_map)
+ MCFG_DEFAULT_LAYOUT(layout_mp68a)
+
+ /* Devices */
+ /* PIA #1 0x500-0x503 - used differently by laborations and loaded software */
+ MCFG_DEVICE_ADD("pia1", PIA6820, 0)
+
+ /* PIA #2 Keyboard & Display 0x600-0x603 */
+ MCFG_DEVICE_ADD("pia2", PIA6820, 0)
+ /* --init----------------------- */
+ /* 0x0BAF 0x601 (Control A) = 0x30 - CA2 is low and enable DDRA */
+ /* 0x0BB1 0x603 (Control B) = 0x30 - CB2 is low and enable DDRB */
+ /* 0x0BB5 0x600 (DDR A) = 0xFF - Port A all outputs and set to 0 (zero) */
+ /* 0x0BB9 0x602 (DDR B) = 0x50 - Port B two outputs and set to 0 (zero) */
+ /* 0x0BBD 0x601 (Control A) = 0x34 - CA2 is low and lock DDRA */
+ /* 0x0BBF 0x603 (Control B) = 0x34 - CB2 is low and lock DDRB */
+ /* 0x0BC3 0x602 (Port B) = 0x40 - Turn on display via RBI* on */
+ /* --execution-wait for key loop-- */
+ /* 0x086B Update display sequnc, see below */
+ /* 0x0826 CB1 read = 0x603 (Control B) - is a key presssed? */
+ MCFG_PIA_WRITEPA_HANDLER(WRITE8(mp68a_state, pia2_kbA_w))
+ MCFG_PIA_READPA_HANDLER(READ8(mp68a_state, pia2_kbA_r))
+ MCFG_PIA_WRITEPB_HANDLER(WRITE8(mp68a_state, pia2_kbB_w))
+ MCFG_PIA_READPB_HANDLER(READ8(mp68a_state, pia2_kbB_r))
+ MCFG_PIA_READCB1_HANDLER(READLINE(mp68a_state, pia2_cb1_r))
+ MCFG_PIA_IRQA_HANDLER(DEVWRITELINE("maincpu", m6800_cpu_device, irq_line)) /* Not used by ROM. Combined trace to CPU IRQ with IRQB */
+ MCFG_PIA_IRQB_HANDLER(DEVWRITELINE("maincpu", m6800_cpu_device, irq_line)) /* Not used by ROM. Combined trace to CPU IRQ with IRQA */
+
+ /* Display - sequence outputting all '0':s at start */
+ /* 0x086B 0x600 (Port A) = 0x00 */
+ /* 0x086B 0x600 (Port A) = 0x70 */
+ /* 0x086B 0x600 (Port A) = 0x10 */
+ /* 0x086B 0x600 (Port A) = 0x70 */
+ /* 0x086B 0x600 (Port A) = 0x20 */
+ /* 0x086B 0x600 (Port A) = 0x70 */
+ /* 0x086B 0x600 (Port A) = 0x30 */
+ /* 0x086B 0x600 (Port A) = 0x70 */
+ /* 0x086B 0x600 (Port A) = 0x40 */
+ /* 0x086B 0x600 (Port A) = 0x70 */
+ /* 0x086B 0x600 (Port A) = 0x50 */
+ /* 0x086B 0x600 (Port A) = 0x70 */
+ MCFG_DEVICE_ADD("digit0", DM9368, 0)
+ MCFG_OUTPUT_INDEX(0)
+ MCFG_DEVICE_ADD("digit1", DM9368, 0)
+ MCFG_OUTPUT_INDEX(1)
+ MCFG_DEVICE_ADD("digit2", DM9368, 0)
+ MCFG_OUTPUT_INDEX(2)
+ MCFG_DEVICE_ADD("digit3", DM9368, 0)
+ MCFG_OUTPUT_INDEX(3)
+ MCFG_DEVICE_ADD("digit4", DM9368, 0)
+ MCFG_OUTPUT_INDEX(4)
+ MCFG_DEVICE_ADD("digit5", DM9368, 0)
+ MCFG_OUTPUT_INDEX(5)
+
+ MCFG_TIMER_DRIVER_ADD_PERIODIC("artwork_timer", mp68a_state, scan_artwork, attotime::from_hz(10))
+MACHINE_CONFIG_END
+
+// TODO: Get a ROM set
+ROM_START( e100 )
+ ROM_REGION(0x10000, "maincpu", 0)
+ ROM_LOAD( "e100U201.bin", 0xd000, 0x0800, CRC(0ff53e1f) SHA1(52002ee22c032775dac383d408c44abe9244724f) )
+ ROM_LOAD( "e100U202.bin", 0xd800, 0x0800, CRC(0ff53e1f) SHA1(52002ee22c032775dac383d408c44abe9244724f) )
+ ROM_LOAD( "e100U203.bin", 0xe000, 0x0800, CRC(0ff53e1f) SHA1(52002ee22c032775dac383d408c44abe9244724f) )
+ ROM_LOAD( "e100U204.bin", 0xe800, 0x0800, CRC(0ff53e1f) SHA1(52002ee22c032775dac383d408c44abe9244724f) )
+ ROM_LOAD( "e100U205.bin", 0xf000, 0x0800, CRC(0ff53e1f) SHA1(52002ee22c032775dac383d408c44abe9244724f) )
+ ROM_LOAD( "e100U206.bin", 0xf800, 0x0800, CRC(0ff53e1f) SHA1(52002ee22c032775dac383d408c44abe9244724f) )
+ROM_END
+
+// TODO split ROM image into proper ROM set
+ROM_START( md6802 ) // ROM image from http://elektronikforumet.com/forum/viewtopic.php?f=2&t=79576&start=135#p1203640
+ ROM_REGION(0x10000, "maincpu", 0)
+ ROM_LOAD( "DIDACT.bin", 0xe000, 0x0800, CRC(50430b1d) SHA1(8e2172a9ae95b04f20aa14177df2463a286c8465) )
+ROM_END
+
+ROM_START( mp68a ) // ROM image from http://elektronikforumet.com/forum/viewtopic.php?f=2&t=79576&start=135#p1203640
+ ROM_REGION(0x10000, "maincpu", 0)
+ ROM_LOAD( "didactA.bin", 0x0800, 0x0200, CRC(aa05e1ce) SHA1(9ce8223efd274045b43ceca3529e037e16e99fdf) )
+ ROM_LOAD( "didactB.bin", 0x0a00, 0x0200, CRC(592898dc) SHA1(2962f4817712cae97f3ab37b088fc73e66535ff8) )
+ROM_END
+
+// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
+COMP( 1979, mp68a, 0, 0, mp68a, mp68a, driver_device, 0, "Didact AB", "mp68a", MACHINE_NO_SOUND_HW )
+COMP( 1982, e100, 0, 0, e100, e100, driver_device, 0, "Didact AB", "Esselte 100", MACHINE_IS_SKELETON )
+COMP( 1983, md6802, 0, 0, md6802, md6802, driver_device, 0, "Didact AB", "Mikrodator 6802", MACHINE_NO_SOUND_HW )
diff --git a/src/mame/drivers/digel804.cpp b/src/mame/drivers/digel804.cpp
index 9aeb5d4814d..8e56c443a0f 100644
--- a/src/mame/drivers/digel804.cpp
+++ b/src/mame/drivers/digel804.cpp
@@ -332,12 +332,12 @@ WRITE8_MEMBER( digel804_state::op46 )
//popmessage("LEDS: %s %s %s Func: %s%d\n", (data&0x80)?"INPUT":"-----", (data&0x40)?"BUSY":"----", (data&0x20)?"ERROR":"-----", (data&0x10)?"None":"", (data&0x10)?-1:(~data&0xF));
//fprintf("LEDS: %s %s %s Func: %s%d\n", (data&0x80)?"INPUT":"-----", (data&0x40)?"BUSY":"----", (data&0x20)?"ERROR":"-----", (data&0x10)?"None":"", (data&0x10)?-1:(~data&0xF));
- output_set_value("input_led", BIT(data,7));
- output_set_value("busy_led", BIT(data,6));
- output_set_value("error_led", BIT(data,5));
+ output().set_value("input_led", BIT(data,7));
+ output().set_value("busy_led", BIT(data,6));
+ output().set_value("error_led", BIT(data,5));
for(int i=0; i<16; i++)
- output_set_indexed_value("func_led", i, (!(data & 0x10) && ((~data & 0x0f) == i)) ? 1 : 0);
+ output().set_indexed_value("func_led", i, (!(data & 0x10) && ((~data & 0x0f) == i)) ? 1 : 0);
}
WRITE8_MEMBER( digel804_state::op47 ) // eprom timing/power and control write
diff --git a/src/mame/drivers/dim68k.cpp b/src/mame/drivers/dim68k.cpp
index ccbfe695144..57ca5cba7d1 100644
--- a/src/mame/drivers/dim68k.cpp
+++ b/src/mame/drivers/dim68k.cpp
@@ -39,7 +39,7 @@
#include "video/mc6845.h"
#include "machine/keyboard.h"
#include "machine/upd765.h"
-
+#include "softlist.h"
class dim68k_state : public driver_device
{
@@ -335,6 +335,9 @@ static MACHINE_CONFIG_START( dim68k, dim68k_state )
MCFG_DEVICE_ADD("keyboard", GENERIC_KEYBOARD, 0)
MCFG_GENERIC_KEYBOARD_CB(WRITE8(dim68k_state, kbd_put))
+
+ // software lists
+ MCFG_SOFTWARE_LIST_ADD("flop_list", "dim68k")
MACHINE_CONFIG_END
/*
diff --git a/src/mame/drivers/discoboy.cpp b/src/mame/drivers/discoboy.cpp
index 41f7a720071..f127c4554e2 100644
--- a/src/mame/drivers/discoboy.cpp
+++ b/src/mame/drivers/discoboy.cpp
@@ -95,7 +95,6 @@ public:
virtual void video_start() override;
UINT32 screen_update_discoboy(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect );
- void discoboy_setrombank( UINT8 data );
DECLARE_WRITE_LINE_MEMBER(yunsung8_adpcm_int);
required_device<cpu_device> m_maincpu;
required_device<msm5205_device> m_msm;
diff --git a/src/mame/drivers/djboy.cpp b/src/mame/drivers/djboy.cpp
index 0b0fdfb7045..ae0efeed0ee 100644
--- a/src/mame/drivers/djboy.cpp
+++ b/src/mame/drivers/djboy.cpp
@@ -222,8 +222,8 @@ WRITE8_MEMBER(djboy_state::cpu1_bankswitch_w)
WRITE8_MEMBER(djboy_state::coin_count_w)
{
- coin_counter_w(machine(), 0, data & 1);
- coin_counter_w(machine(), 1, data & 2);
+ machine().bookkeeping().coin_counter_w(0, data & 1);
+ machine().bookkeeping().coin_counter_w(1, data & 2);
}
/******************************************************************************/
diff --git a/src/mame/drivers/djmain.cpp b/src/mame/drivers/djmain.cpp
index aa47b3e4f02..3037b06723c 100644
--- a/src/mame/drivers/djmain.cpp
+++ b/src/mame/drivers/djmain.cpp
@@ -291,10 +291,10 @@ WRITE32_MEMBER(djmain_state::light_ctrl_1_w)
{
if (ACCESSING_BITS_16_31)
{
- output_set_value("right-red-hlt", !(data & 0x08000000)); // Right red HIGHLIGHT
- output_set_value("left-red-hlt", !(data & 0x04000000)); // Left red HIGHLIGHT
- output_set_value("left-blue-hlt", !(data & 0x02000000)); // Left blue HIGHLIGHT
- output_set_value("right-blue-hlt", !(data & 0x00200000)); // Right blue HIGHLIGHT
+ output().set_value("right-red-hlt", !(data & 0x08000000)); // Right red HIGHLIGHT
+ output().set_value("left-red-hlt", !(data & 0x04000000)); // Left red HIGHLIGHT
+ output().set_value("left-blue-hlt", !(data & 0x02000000)); // Left blue HIGHLIGHT
+ output().set_value("right-blue-hlt", !(data & 0x00200000)); // Right blue HIGHLIGHT
}
}
@@ -302,11 +302,11 @@ WRITE32_MEMBER(djmain_state::light_ctrl_2_w)
{
if (ACCESSING_BITS_16_31)
{
- output_set_value("left-ssr", !!(data & 0x08000000)); // SSR
- output_set_value("right-ssr", !!(data & 0x08000000)); // SSR
- set_led_status(machine(), 0, data & 0x00010000); // 1P START
- set_led_status(machine(), 1, data & 0x00020000); // 2P START
- set_led_status(machine(), 2, data & 0x00040000); // EFFECT
+ output().set_value("left-ssr", !!(data & 0x08000000)); // SSR
+ output().set_value("right-ssr", !!(data & 0x08000000)); // SSR
+ output().set_led_value(0, data & 0x00010000); // 1P START
+ output().set_led_value(1, data & 0x00020000); // 2P START
+ output().set_led_value(2, data & 0x00040000); // EFFECT
}
}
@@ -1364,9 +1364,9 @@ void djmain_state::machine_reset()
sndram_set_bank();
/* reset LEDs */
- set_led_status(machine(), 0, 1);
- set_led_status(machine(), 1, 1);
- set_led_status(machine(), 2, 1);
+ output().set_led_value(0, 1);
+ output().set_led_value(1, 1);
+ output().set_led_value(2, 1);
}
diff --git a/src/mame/drivers/dkong.cpp b/src/mame/drivers/dkong.cpp
index e6d81e7d2a6..546ef915830 100644
--- a/src/mame/drivers/dkong.cpp
+++ b/src/mame/drivers/dkong.cpp
@@ -439,8 +439,6 @@ MACHINE_START_MEMBER(dkong_state,dkong2b)
{
m_hardware_type = HARDWARE_TKG04;
- m_snd_rom = memregion("soundcpu")->base();
-
save_item(NAME(m_decrypt_counter));
save_item(NAME(m_dma_latch));
}
@@ -578,7 +576,7 @@ WRITE8_MEMBER(dkong_state::p8257_ctl_w)
WRITE8_MEMBER(dkong_state::dkong3_coin_counter_w)
{
- coin_counter_w(machine(), offset, data & 0x01);
+ machine().bookkeeping().coin_counter_w(offset, data & 0x01);
}
WRITE8_MEMBER(dkong_state::p8257_drq_w)
@@ -596,7 +594,7 @@ READ8_MEMBER(dkong_state::dkong_in2_r)
UINT8 r;
r = (ioport("IN2")->read() & 0xBF) | (mcustatus << 6);
- coin_counter_w(machine(), offset, r >> 7);
+ machine().bookkeeping().coin_counter_w(offset, r >> 7);
if (r & 0x10)
r = (r & ~0x10) | 0x80; /* service ==> coin */
return r;
@@ -609,7 +607,7 @@ READ8_MEMBER(dkong_state::dkongjr_in2_r)
UINT8 r;
r = (ioport("IN2")->read() & 0xBF) | 0x40;
- coin_counter_w(machine(), offset, r >> 7);
+ machine().bookkeeping().coin_counter_w(offset, r >> 7);
if (r & 0x10)
r = (r & ~0x10) | 0x80; /* service ==> coin */
return r;
@@ -1880,7 +1878,7 @@ MACHINE_CONFIG_END
*
*************************************/
-ROM_START( radarscp )
+ROM_START( radarscp ) /* unclear which boardset this comes from; there existed a 5 pcb stack with trs-03 (no voice) sound board on top, and a 4 board as well as a 2 board pcb stack */
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "trs2c5fc", 0x0000, 0x1000, CRC(40949e0d) SHA1(94717b9d027600e25b863e89900df41325875961) )
ROM_LOAD( "trs2c5gc", 0x1000, 0x1000, CRC(afa8c49f) SHA1(25880e9dcf2dc8862f7f3c38687f01dfe2424293) )
@@ -1913,7 +1911,7 @@ ROM_START( radarscp )
ROM_LOAD( "rs2-v.1hc", 0x0200, 0x0100, CRC(1b828315) SHA1(00c9f8c5ae86b68d38c66f9071b5f1ef421c1005) ) /* character color codes on a per-column basis */
ROM_END
-ROM_START( radarscp1 )
+ROM_START( radarscp1 ) /* TRS01 5-pcb stack with TRS01 "Voice" pcb on top containing the sound cpu and the m58817 speech chip and the m58819 speech serial rom emulator chip */
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "trs01_5f", 0x0000, 0x1000, CRC(40949e0d) SHA1(94717b9d027600e25b863e89900df41325875961) )
ROM_LOAD( "trs01_5g", 0x1000, 0x1000, CRC(afa8c49f) SHA1(25880e9dcf2dc8862f7f3c38687f01dfe2424293) )
@@ -1922,12 +1920,12 @@ ROM_START( radarscp1 )
/* space for diagnostic ROM */
ROM_REGION( 0x1800, "soundcpu", 0 ) /* sound */
- ROM_LOAD( "trs015aa.bin", 0x0000, 0x0800, CRC(5166554c) SHA1(00bf501ca448929f6187598da6fdbc1ea488745a) )
+ ROM_LOAD( "trs-s__5a.5a", 0x0000, 0x0800, CRC(5166554c) SHA1(00bf501ca448929f6187598da6fdbc1ea488745a) ) // 5A on the 'voice' board on top of the 5-pcb stack; eprom label is "TRS-S ['S' overstrikes a '1'] // 5A [stamped '8' or 'a' in red ink]"
ROM_RELOAD( 0x0800, 0x0800 )
ROM_FILL( 0x1000, 0x0800, 0xFF )
ROM_REGION( 0x0800, "m58819", 0 ) /* speech rom */
- ROM_LOAD( "trs014ha.bin", 0x0000, 0x0800, CRC(d1f1b48c) SHA1(ee5584368d2e9f7bde271f5004585b53f5ff5c3f) ) /* speech rom */
+ ROM_LOAD( "trs-s__4h.4h", 0x0000, 0x0800, CRC(d1f1b48c) SHA1(ee5584368d2e9f7bde271f5004585b53f5ff5c3f) ) // 4H on the 'voice' board on top of the 5-pcb stack; eprom label is "TRS-S ['S' overstrikes a '1'] // 4H [stamped '8' or 'a' in red ink]"
ROM_REGION( 0x1000, "gfx1", 0 )
ROM_LOAD( "trs01v3f", 0x0000, 0x0800, CRC(f095330e) SHA1(dd3de744f28ff108630d3336bd246d3323fa34af) )
@@ -3271,10 +3269,9 @@ DRIVER_INIT_MEMBER(dkong_state,strtheat)
DRIVER_INIT_MEMBER(dkong_state,dkongx)
{
- UINT8 *decrypted;
address_space &space = m_maincpu->space(AS_PROGRAM);
- decrypted = auto_alloc_array(machine(), UINT8, 0x10000);
+ m_decrypted = std::make_unique<UINT8[]>(0x10000);
m_maincpu->space(AS_PROGRAM).install_read_bank(0x0000, 0x5fff, "bank1" );
m_maincpu->space(AS_PROGRAM).install_read_bank(0x8000, 0xffff, "bank2" );
@@ -3284,11 +3281,11 @@ DRIVER_INIT_MEMBER(dkong_state,dkongx)
space.install_read_handler(0xc800, 0xc800, read8_delegate(FUNC(dkong_state::braze_eeprom_r),this));
space.install_write_handler(0xc800, 0xc800, write8_delegate(FUNC(dkong_state::braze_eeprom_w),this));
- braze_decrypt_rom(decrypted);
+ braze_decrypt_rom(m_decrypted.get());
- membank("bank1")->configure_entries(0, 2, &decrypted[0], 0x8000);
+ membank("bank1")->configure_entries(0, 2, m_decrypted.get(), 0x8000);
membank("bank1")->set_entry(0);
- membank("bank2")->configure_entries(0, 2, &decrypted[0], 0x8000);
+ membank("bank2")->configure_entries(0, 2, m_decrypted.get(), 0x8000);
membank("bank2")->set_entry(0);
}
diff --git a/src/mame/drivers/dlair.cpp b/src/mame/drivers/dlair.cpp
index 54d89029efb..016e71a5358 100644
--- a/src/mame/drivers/dlair.cpp
+++ b/src/mame/drivers/dlair.cpp
@@ -265,7 +265,7 @@ WRITE8_MEMBER(dlair_state::misc_w)
UINT8 diff = data ^ m_last_misc;
m_last_misc = data;
- coin_counter_w(machine(), 0, (~data >> 4) & 1);
+ machine().bookkeeping().coin_counter_w(0, (~data >> 4) & 1);
/* on bit 5 going low, push the data out to the laserdisc player */
if ((diff & 0x20) && !(data & 0x20))
@@ -291,8 +291,8 @@ WRITE8_MEMBER(dlair_state::dleuro_misc_w)
UINT8 diff = data ^ m_last_misc;
m_last_misc = data;
- coin_counter_w(machine(), 1, (~data >> 3) & 1);
- coin_counter_w(machine(), 0, (~data >> 4) & 1);
+ machine().bookkeeping().coin_counter_w(1, (~data >> 3) & 1);
+ machine().bookkeeping().coin_counter_w(0, (~data >> 4) & 1);
/* on bit 5 going low, push the data out to the laserdisc player */
if ((diff & 0x20) && !(data & 0x20))
@@ -305,13 +305,13 @@ WRITE8_MEMBER(dlair_state::dleuro_misc_w)
WRITE8_MEMBER(dlair_state::led_den1_w)
{
- output_set_digit_value(0 + (offset & 7), led_map[data & 0x0f]);
+ output().set_digit_value(0 + (offset & 7), led_map[data & 0x0f]);
}
WRITE8_MEMBER(dlair_state::led_den2_w)
{
- output_set_digit_value(8 + (offset & 7), led_map[data & 0x0f]);
+ output().set_digit_value(8 + (offset & 7), led_map[data & 0x0f]);
}
diff --git a/src/mame/drivers/dmv.cpp b/src/mame/drivers/dmv.cpp
index cbe084fe0f4..8940c1263fa 100644
--- a/src/mame/drivers/dmv.cpp
+++ b/src/mame/drivers/dmv.cpp
@@ -202,7 +202,7 @@ WRITE8_MEMBER(dmv_state::leds_w)
*/
for(int i=0; i<8; i++)
- output_set_led_value(8-i, BIT(data, i));
+ output().set_led_value(8-i, BIT(data, i));
}
READ8_MEMBER(dmv_state::ramsel_r)
diff --git a/src/mame/drivers/dolphunk.cpp b/src/mame/drivers/dolphunk.cpp
index 8ee69d20042..329c14b446f 100644
--- a/src/mame/drivers/dolphunk.cpp
+++ b/src/mame/drivers/dolphunk.cpp
@@ -127,7 +127,7 @@ WRITE_LINE_MEMBER( dauphin_state::cass_w )
WRITE8_MEMBER( dauphin_state::port00_w )
{
- output_set_digit_value(offset, data);
+ output().set_digit_value(offset, data);
}
WRITE8_MEMBER( dauphin_state::port06_w )
diff --git a/src/mame/drivers/dooyong.cpp b/src/mame/drivers/dooyong.cpp
index 11eac2c0f8e..9e439ded0a1 100644
--- a/src/mame/drivers/dooyong.cpp
+++ b/src/mame/drivers/dooyong.cpp
@@ -69,12 +69,7 @@ Pollux:
Many (all? at least pollux, primella and flying tiger) use some kind of
banked palette ram. Bit 1 at address 0xf008 controls banking (both palettes
are almost identical, except for much darker BG layer colors).
-There's also significant gfx problem on title screen - gfx over left pilot's
-shoulder (right part of the screen) should be - according to pics from flyer -
-blue with orange/red flame (palette 2 instead palette 1). Also some explosions
-and stars should be red instead blue (also pal 2 instead pal 1). I have no
-idea how to fix it without breaking other parts of game. Title screen should
-be verified on real PCB.
+
***************************************************************************/
@@ -95,7 +90,7 @@ WRITE8_MEMBER(dooyong_z80_state::bankswitch_w)
MACHINE_START_MEMBER(dooyong_z80_state, cpu_z80)
{
- membank("bank1")->configure_entries(0, 8, memregion("maincpu")->base() + 0x10000, 0x4000);
+ membank("bank1")->configure_entries(0, 8, memregion("maincpu")->base(), 0x4000);
}
WRITE8_MEMBER(dooyong_z80_state::flip_screen_w)
@@ -149,7 +144,7 @@ static ADDRESS_MAP_START( pollux_map, AS_PROGRAM, 8, dooyong_z80_ym2203_state )
AM_RANGE(0xf010, 0xf010) AM_WRITE(soundlatch_byte_w)
AM_RANGE(0xf018, 0xf01f) AM_WRITE(bgscroll_w)
AM_RANGE(0xf020, 0xf027) AM_WRITE(fgscroll_w)
- AM_RANGE(0xf800, 0xffff) AM_RAM_WRITE(paletteram_flytiger_w)
+ AM_RANGE(0xf800, 0xffff) AM_READWRITE(paletteram_flytiger_r, paletteram_flytiger_w)
ADDRESS_MAP_END
static ADDRESS_MAP_START( gulfstrm_map, AS_PROGRAM, 8, dooyong_z80_ym2203_state )
@@ -206,7 +201,7 @@ static ADDRESS_MAP_START( flytiger_map, AS_PROGRAM, 8, dooyong_z80_state )
AM_RANGE(0xe020, 0xe020) AM_WRITE(soundlatch_byte_w)
AM_RANGE(0xe030, 0xe037) AM_WRITE(bgscroll_w)
AM_RANGE(0xe040, 0xe047) AM_WRITE(fgscroll_w)
- AM_RANGE(0xe800, 0xefff) AM_RAM_WRITE(paletteram_flytiger_w)
+ AM_RANGE(0xe800, 0xefff) AM_READWRITE(paletteram_flytiger_r, paletteram_flytiger_w)
AM_RANGE(0xf000, 0xffff) AM_RAM_WRITE(txvideoram_w) AM_SHARE("txvideoram")
ADDRESS_MAP_END
@@ -550,7 +545,7 @@ static INPUT_PORTS_START( pollux )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE1 )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_VBLANK("screen") // palette cycle effects need this to work (read near code that also writes to the output ports) - currently can't see them due to wrong palette selection tho
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_START1 )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START2 )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
@@ -567,6 +562,9 @@ static INPUT_PORTS_START( flytiger )
PORT_DIPNAME( 0x40, 0x40, "Auto Fire" ) PORT_DIPLOCATION("SWB:7") /* Mainly (only?) for 3-way charge */
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x40, DEF_STR( On ) )
+
+ PORT_MODIFY("SYSTEM")
+// PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_VBLANK("screen") // allows title screen + ending screen colours to cycle (but I'm not sure they're meant to, reference shots suggest not, maybe a debug port?)
INPUT_PORTS_END
static INPUT_PORTS_START( sadari )
@@ -731,17 +729,17 @@ static const gfx_layout popbingo_tilelayout =
};
static GFXDECODE_START( lastday )
- GFXDECODE_ENTRY( "gfx1", 0, lastday_charlayout, 0, 16 )
- GFXDECODE_ENTRY( "gfx2", 0, spritelayout, 256, 16 )
- GFXDECODE_ENTRY( "gfx3", 0, tilelayout, 768, 16 )
- GFXDECODE_ENTRY( "gfx4", 0, tilelayout, 512, 16 )
+ GFXDECODE_ENTRY( "gfx1", 0, lastday_charlayout, 0, 16+64 )
+ GFXDECODE_ENTRY( "gfx2", 0, spritelayout, 256, 16+64 )
+ GFXDECODE_ENTRY( "gfx3", 0, tilelayout, 768, 16+64 )
+ GFXDECODE_ENTRY( "gfx4", 0, tilelayout, 512, 16+64 )
GFXDECODE_END
static GFXDECODE_START( flytiger )
- GFXDECODE_ENTRY( "gfx1", 0, lastday_charlayout, 0, 16 )
- GFXDECODE_ENTRY( "gfx2", 0, spritelayout, 256, 16 )
- GFXDECODE_ENTRY( "gfx3", 0, tilelayout, 768, 16 )
- GFXDECODE_ENTRY( "gfx4", 0, tilelayout, 512, 32 )
+ GFXDECODE_ENTRY( "gfx1", 0, lastday_charlayout, 0, 16+64 )
+ GFXDECODE_ENTRY( "gfx2", 0, spritelayout, 256, 16+64 )
+ GFXDECODE_ENTRY( "gfx3", 0, tilelayout, 768, 16+64 )
+ GFXDECODE_ENTRY( "gfx4", 0, tilelayout, 512, 32+64 )
GFXDECODE_END
static GFXDECODE_START( bluehawk )
@@ -855,7 +853,7 @@ static MACHINE_CONFIG_START( lastday, dooyong_z80_ym2203_state )
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
+ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
MCFG_SCREEN_SIZE(64*8, 32*8)
MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 1*8, 31*8-1 )
MCFG_SCREEN_UPDATE_DRIVER(dooyong_z80_ym2203_state, screen_update_lastday)
@@ -936,7 +934,7 @@ static MACHINE_CONFIG_START( pollux, dooyong_z80_ym2203_state )
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
+ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
MCFG_SCREEN_SIZE(64*8, 32*8)
MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 1*8, 31*8-1 )
MCFG_SCREEN_UPDATE_DRIVER(dooyong_z80_ym2203_state, screen_update_pollux)
@@ -970,7 +968,7 @@ static MACHINE_CONFIG_START( bluehawk, dooyong_z80_state )
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
+ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
MCFG_SCREEN_SIZE(64*8, 32*8)
MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 1*8, 31*8-1 )
MCFG_SCREEN_UPDATE_DRIVER(dooyong_z80_state, screen_update_bluehawk)
@@ -1004,7 +1002,7 @@ static MACHINE_CONFIG_START( flytiger, dooyong_z80_state )
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
+ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
MCFG_SCREEN_SIZE(64*8, 32*8)
MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 1*8, 31*8-1 )
MCFG_SCREEN_UPDATE_DRIVER(dooyong_z80_state, screen_update_flytiger)
@@ -1036,7 +1034,7 @@ static MACHINE_CONFIG_START( primella, dooyong_z80_state )
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
+ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
MCFG_SCREEN_SIZE(64*8, 32*8)
MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 0*8, 32*8-1 )
MCFG_SCREEN_UPDATE_DRIVER(dooyong_z80_state, screen_update_primella)
@@ -1080,7 +1078,7 @@ static MACHINE_CONFIG_START( rshark, dooyong_68k_state )
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
+ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
MCFG_SCREEN_SIZE(64*8, 32*8)
MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 1*8, 31*8-1 )
MCFG_SCREEN_UPDATE_DRIVER(dooyong_68k_state, screen_update_rshark)
@@ -1112,7 +1110,7 @@ static MACHINE_CONFIG_START( superx, dooyong_68k_state ) // dif mem map
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
+ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
MCFG_SCREEN_SIZE(64*8, 32*8)
MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 1*8, 31*8-1 )
MCFG_SCREEN_UPDATE_DRIVER(dooyong_68k_state, screen_update_rshark)
@@ -1144,7 +1142,7 @@ static MACHINE_CONFIG_START( popbingo, dooyong_68k_state )
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
+ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
MCFG_SCREEN_SIZE(64*8, 32*8)
MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 1*8, 31*8-1 )
MCFG_SCREEN_UPDATE_DRIVER(dooyong_68k_state, screen_update_popbingo)
@@ -1168,10 +1166,9 @@ MACHINE_CONFIG_END
***************************************************************************/
ROM_START( lastday ) /* 90030003 PCB */
- ROM_REGION( 0x30000, "maincpu", 0 ) /* 64k for code + 128k for banks */
+ ROM_REGION( 0x20000, "maincpu", 0 ) /* 64k for code + 128k for banks */
ROM_LOAD( "lday3.s5", 0x00000, 0x10000, CRC(a06dfb1e) SHA1(c6220eda8c01d55862700e369db7291dbbedc8c8) )
- ROM_RELOAD( 0x10000, 0x10000 ) /* banked at 0x8000-0xbfff */
- ROM_LOAD( "4.u5", 0x20000, 0x10000, CRC(70961ea6) SHA1(245d3da67abb4a511a024f030de461b9a2b4804e) ) /* banked at 0x8000-0xbfff */
+ ROM_LOAD( "4.u5", 0x10000, 0x10000, CRC(70961ea6) SHA1(245d3da67abb4a511a024f030de461b9a2b4804e) ) /* banked at 0x8000-0xbfff */
ROM_REGION( 0x10000, "audiocpu", 0 ) /* sound */
ROM_LOAD( "1.d3", 0x0000, 0x8000, CRC(dd4316fd) SHA1(496e6657bb76d91f488a2464d1af1be095ab9105) ) /* empty */
@@ -1204,10 +1201,9 @@ ROM_START( lastday ) /* 90030003 PCB */
ROM_LOAD16_BYTE( "13.r14", 0x00001, 0x10000, CRC(6bdbd887) SHA1(a54f26f9ddd72b8b8f7a030610c1c4a5f94a3358) )ROM_END
ROM_START( lastdaya ) /* 90030003 PCB */
- ROM_REGION( 0x30000, "maincpu", 0 ) /* 64k for code + 128k for banks */
+ ROM_REGION( 0x20000, "maincpu", 0 ) /* 64k for code + 128k for banks */
ROM_LOAD( "lday3.s5", 0x00000, 0x10000, CRC(a06dfb1e) SHA1(c6220eda8c01d55862700e369db7291dbbedc8c8) )
- ROM_RELOAD( 0x10000, 0x10000 ) /* banked at 0x8000-0xbfff */
- ROM_LOAD( "4.u5", 0x20000, 0x10000, CRC(70961ea6) SHA1(245d3da67abb4a511a024f030de461b9a2b4804e) ) /* banked at 0x8000-0xbfff */
+ ROM_LOAD( "4.u5", 0x10000, 0x10000, CRC(70961ea6) SHA1(245d3da67abb4a511a024f030de461b9a2b4804e) ) /* banked at 0x8000-0xbfff */
ROM_REGION( 0x10000, "audiocpu", 0 ) /* sound */
ROM_LOAD( "e1.d3", 0x0000, 0x8000, CRC(ce96e106) SHA1(5ef1f221618abd757e02db79c3d7016100f30c07) ) /* empty */
@@ -1241,10 +1237,9 @@ ROM_START( lastdaya ) /* 90030003 PCB */
ROM_END
ROM_START( ddaydoo ) /* 90030003 PCB */
- ROM_REGION( 0x30000, "maincpu", 0 ) /* 64k for code + 128k for banks */
+ ROM_REGION( 0x20000, "maincpu", 0 ) /* 64k for code + 128k for banks */
ROM_LOAD( "3.s5", 0x00000, 0x10000, CRC(7817d4f3) SHA1(b85db234c04f248fd2927a2224380783780673f5)) /* closest to 'lastday' set */
- ROM_RELOAD( 0x10000, 0x10000 ) /* banked at 0x8000-0xbfff */
- ROM_LOAD( "4.u5", 0x20000, 0x10000, CRC(70961ea6) SHA1(245d3da67abb4a511a024f030de461b9a2b4804e) ) /* banked at 0x8000-0xbfff */
+ ROM_LOAD( "4.u5", 0x10000, 0x10000, CRC(70961ea6) SHA1(245d3da67abb4a511a024f030de461b9a2b4804e) ) /* banked at 0x8000-0xbfff */
ROM_REGION( 0x10000, "audiocpu", 0 ) /* sound */
ROM_LOAD( "1.d3", 0x0000, 0x8000, CRC(dd4316fd) SHA1(496e6657bb76d91f488a2464d1af1be095ab9105) ) /* empty */
@@ -1278,9 +1273,8 @@ ROM_START( ddaydoo ) /* 90030003 PCB */
ROM_END
ROM_START( gulfstrm )
- ROM_REGION( 0x30000, "maincpu", 0 ) /* 64k for code + 128k for banks */
+ ROM_REGION( 0x20000, "maincpu", 0 ) /* 64k for code + 128k for banks */
ROM_LOAD( "1.l4", 0x00000, 0x20000, CRC(59e0478b) SHA1(dd6e48c6e91ddb087d20336eab79bbadd968d4b1) )
- ROM_RELOAD( 0x10000, 0x20000 ) /* banked at 0x8000-0xbfff */
ROM_REGION( 0x10000, "audiocpu", 0 ) /* sound */
ROM_LOAD( "3.c5", 0x00000, 0x10000, CRC(c029b015) SHA1(86f8d4f6560cb99e25e8e8baf72dde743a7b9c4c) )
@@ -1315,9 +1309,8 @@ ROM_START( gulfstrm )
ROM_END
ROM_START( gulfstrma )
- ROM_REGION( 0x30000, "maincpu", 0 ) /* 64k for code + 128k for banks */
+ ROM_REGION( 0x20000, "maincpu", 0 ) /* 64k for code + 128k for banks */
ROM_LOAD( "1.bin", 0x00000, 0x20000, CRC(d04fb06b) SHA1(bdf09ab692f90e3dea815605998f75b6478c8047) )
- ROM_RELOAD( 0x10000, 0x20000 ) /* banked at 0x8000-0xbfff */
ROM_REGION( 0x10000, "audiocpu", 0 ) /* sound */
ROM_LOAD( "3.c5", 0x00000, 0x10000, CRC(c029b015) SHA1(86f8d4f6560cb99e25e8e8baf72dde743a7b9c4c) )
@@ -1352,9 +1345,8 @@ ROM_START( gulfstrma )
ROM_END
ROM_START( gulfstrmb )
- ROM_REGION( 0x30000, "maincpu", 0 ) /* 64k for code + 128k for banks */
+ ROM_REGION( 0x20000, "maincpu", 0 ) /* 64k for code + 128k for banks */
ROM_LOAD( "1.l4", 0x00000, 0x20000, CRC(aabd95a5) SHA1(f1d3ade952e96b288e2cd4b172931862b16b4af9) ) // sldh
- ROM_RELOAD( 0x10000, 0x20000 ) /* banked at 0x8000-0xbfff */
ROM_REGION( 0x10000, "audiocpu", 0 ) /* sound */
ROM_LOAD( "3.c5", 0x00000, 0x10000, CRC(c029b015) SHA1(86f8d4f6560cb99e25e8e8baf72dde743a7b9c4c) )
@@ -1389,9 +1381,8 @@ ROM_START( gulfstrmb )
ROM_END
ROM_START( gulfstrmm )
- ROM_REGION( 0x30000, "maincpu", 0 ) /* 64k for code + 128k for banks */
+ ROM_REGION( 0x20000, "maincpu", 0 ) /* 64k for code + 128k for banks */
ROM_LOAD( "18.l4", 0x00000, 0x20000, CRC(d38e2667) SHA1(3690d708c7be85871d6bb32a774d711a30782126) )
- ROM_RELOAD( 0x10000, 0x20000 ) /* banked at 0x8000-0xbfff */
ROM_REGION( 0x10000, "audiocpu", 0 ) /* sound */
ROM_LOAD( "3.c5", 0x00000, 0x10000, CRC(c029b015) SHA1(86f8d4f6560cb99e25e8e8baf72dde743a7b9c4c) )
@@ -1426,9 +1417,8 @@ ROM_START( gulfstrmm )
ROM_END
ROM_START( pollux )
- ROM_REGION( 0x30000, "maincpu", 0 ) /* 64k for code + 128k for banks */
+ ROM_REGION( 0x20000, "maincpu", 0 ) /* 64k for code + 128k for banks */
ROM_LOAD( "pollux2.bin", 0x00000, 0x10000, CRC(45e10d4e) SHA1(ece25fcc0acda9a8cfc00f3132a87469037b5a4e) )
- ROM_RELOAD( 0x10000, 0x10000 ) /* banked at 0x8000-0xbfff */
ROM_REGION( 0x10000, "audiocpu", 0 ) /* sound */
ROM_LOAD( "pollux3.bin", 0x00000, 0x10000, CRC(85a9dc98) SHA1(a349bfb05d870ba920469066ce5c007363aca348) )
@@ -1458,9 +1448,8 @@ ROM_START( pollux )
ROM_END
ROM_START( polluxa )
- ROM_REGION( 0x30000, "maincpu", 0 ) /* 64k for code + 128k for banks */
+ ROM_REGION( 0x20000, "maincpu", 0 ) /* 64k for code + 128k for banks */
ROM_LOAD( "dooyong2.bin", 0x00000, 0x10000, CRC(e4ea8dbd) SHA1(19652261981672fae896e3065f1f5078f7ae93b6) )
- ROM_RELOAD( 0x10000, 0x10000 ) /* banked at 0x8000-0xbfff */
ROM_REGION( 0x10000, "audiocpu", 0 ) /* sound */
ROM_LOAD( "pollux3.bin", 0x00000, 0x10000, CRC(85a9dc98) SHA1(a349bfb05d870ba920469066ce5c007363aca348) )
@@ -1490,9 +1479,8 @@ ROM_START( polluxa )
ROM_END
ROM_START( polluxa2 )
- ROM_REGION( 0x30000, "maincpu", 0 ) /* 64k for code + 128k for banks */
+ ROM_REGION( 0x20000, "maincpu", 0 ) /* 64k for code + 128k for banks */
ROM_LOAD( "dooyong16_tms27c512.bin", 0x00000, 0x10000, CRC(dffe5173) SHA1(fec9b8198ae8a1b7c9b798b9317ed6d986c11e35) )
- ROM_RELOAD( 0x10000, 0x10000 ) /* banked at 0x8000-0xbfff */
ROM_REGION( 0x10000, "audiocpu", 0 ) /* sound */
ROM_LOAD( "pollux3.bin", 0x00000, 0x10000, CRC(85a9dc98) SHA1(a349bfb05d870ba920469066ce5c007363aca348) )
@@ -1522,9 +1510,8 @@ ROM_START( polluxa2 )
ROM_END
ROM_START( polluxn )
- ROM_REGION( 0x30000, "maincpu", 0 ) /* 64k for code + 128k for banks */
+ ROM_REGION( 0x20000, "maincpu", 0 ) /* 64k for code + 128k for banks */
ROM_LOAD( "polluxntc_2.3g", 0x00000, 0x10000, CRC(96d3e3af) SHA1(fc0e7a60bee0ed74c28d403a97a852eb677f8189) )
- ROM_RELOAD( 0x10000, 0x10000 ) /* banked at 0x8000-0xbfff */
ROM_REGION( 0x10000, "audiocpu", 0 ) /* sound */
ROM_LOAD( "polluxntc_3.6t", 0x00000, 0x10000, CRC(85a9dc98) SHA1(a349bfb05d870ba920469066ce5c007363aca348) )
@@ -1555,9 +1542,8 @@ ROM_END
ROM_START( bluehawk )
- ROM_REGION( 0x30000, "maincpu", 0 ) /* 64k for code + 128k for banks */
+ ROM_REGION( 0x20000, "maincpu", 0 ) /* 64k for code + 128k for banks */
ROM_LOAD( "rom19", 0x00000, 0x20000, CRC(24149246) SHA1(458fd429a895353b8636c717dcd58d57b8723012) )
- ROM_RELOAD( 0x10000, 0x20000 ) /* banked at 0x8000-0xbfff */
ROM_REGION( 0x10000, "audiocpu", 0 ) /* sound */
ROM_LOAD( "rom1", 0x00000, 0x10000, CRC(eef22920) SHA1(a3295ae7524df8c4d00ac3da422bbf66c959bf4f) )
@@ -1583,9 +1569,8 @@ ROM_START( bluehawk )
ROM_END
ROM_START( bluehawkn )
- ROM_REGION( 0x30000, "maincpu", 0 ) /* 64k for code + 128k for banks */
+ ROM_REGION( 0x20000, "maincpu", 0 ) /* 64k for code + 128k for banks */
ROM_LOAD( "rom19", 0x00000, 0x20000, CRC(24149246) SHA1(458fd429a895353b8636c717dcd58d57b8723012) ) // ROM2
- ROM_RELOAD( 0x10000, 0x20000 ) /* banked at 0x8000-0xbfff */
ROM_REGION( 0x10000, "audiocpu", 0 ) /* sound */
ROM_LOAD( "rom1", 0x00000, 0x10000, CRC(eef22920) SHA1(a3295ae7524df8c4d00ac3da422bbf66c959bf4f) )
@@ -1680,9 +1665,8 @@ Top Board
*/
ROM_START( flytiger )
- ROM_REGION( 0x30000, "maincpu", 0 ) /* 64k for code + 128k for banks */
+ ROM_REGION( 0x20000, "maincpu", 0 ) /* 64k for code + 128k for banks */
ROM_LOAD( "1.3c", 0x00000, 0x20000, CRC(2d634c8e) SHA1(012ad31c0edc67d727d216e2ede321c1d1f27226) )
- ROM_RELOAD( 0x10000, 0x20000 ) /* banked at 0x8000-0xbfff */
ROM_REGION( 0x10000, "audiocpu", 0 ) /* sound */
ROM_LOAD( "3.6p", 0x00000, 0x10000, CRC(d238df5e) SHA1(428fd7abd78238089c0c0fd73de57102f4f65a74))
@@ -1708,9 +1692,8 @@ ROM_START( flytiger )
ROM_END
ROM_START( flytigera ) // alt pcb type
- ROM_REGION( 0x30000, "maincpu", 0 ) /* 64k for code + 128k for banks */
+ ROM_REGION( 0x20000, "maincpu", 0 ) /* 64k for code + 128k for banks */
ROM_LOAD( "ftiger_1.3c", 0x00000, 0x20000, CRC(02acd1ce) SHA1(48167a317d3785bfe688bdda01ff344e72d3b138) )
- ROM_RELOAD( 0x10000, 0x20000 ) /* banked at 0x8000-0xbfff */
ROM_REGION( 0x10000, "audiocpu", 0 ) /* sound */
ROM_LOAD( "ftiger_11.6p", 0x00000, 0x10000, CRC(d238df5e) SHA1(428fd7abd78238089c0c0fd73de57102f4f65a74))
@@ -1742,9 +1725,8 @@ ROM_START( flytigera ) // alt pcb type
ROM_END
ROM_START( sadari )
- ROM_REGION( 0x30000, "maincpu", 0 ) /* 64k for code + 128k for banks */
+ ROM_REGION( 0x20000, "maincpu", 0 ) /* 64k for code + 128k for banks */
ROM_LOAD( "1.3d", 0x00000, 0x20000, CRC(bd953217) SHA1(6e230103ea01744761ab8a194d0dde6921bee92e) )
- ROM_RELOAD( 0x10000, 0x20000 ) /* banked at 0x8000-0xbfff */
ROM_REGION( 0x10000, "audiocpu", 0 ) /* sound */
ROM_LOAD( "3.6r", 0x0000, 0x10000, CRC(4786fca6) SHA1(b2347e2f6bbe3dd9d1cc8d8a4af40e7997d5ab74) )
@@ -1771,9 +1753,8 @@ ROM_START( sadari )
ROM_END
ROM_START( gundl94 )
- ROM_REGION( 0x30000, "maincpu", 0 ) /* 64k for code + 128k for banks */
+ ROM_REGION( 0x20000, "maincpu", 0 ) /* 64k for code + 128k for banks */
ROM_LOAD( "gd94_001.d3", 0x00000, 0x20000, CRC(3a5cc045) SHA1(182743458c36bb6254a39cf9a371fd2b0d72d145) )
- ROM_RELOAD( 0x10000, 0x20000 ) /* banked at 0x8000-0xbfff */
ROM_REGION( 0x10000, "audiocpu", 0 ) /* sound */
ROM_LOAD( "gd94_003.r6", 0x0000, 0x10000, CRC(ea41c4ad) SHA1(e39e0507f4f370432ef0ca11dbecef176716cec4) )
@@ -1804,9 +1785,8 @@ ROM_START( gundl94 )
ROM_END
ROM_START( primella )
- ROM_REGION( 0x30000, "maincpu", 0 ) /* 64k for code + 128k for banks */
+ ROM_REGION( 0x20000, "maincpu", 0 ) /* 64k for code + 128k for banks */
ROM_LOAD( "1_d3.bin", 0x00000, 0x20000, CRC(82fea4e0) SHA1(3603c0edda29868d5e282465880e1ad341365f6f) )
- ROM_RELOAD( 0x10000, 0x20000 ) /* banked at 0x8000-0xbfff */
ROM_REGION( 0x10000, "audiocpu", 0 ) /* sound */
ROM_LOAD( "gd94_003.r6", 0x0000, 0x10000, CRC(ea41c4ad) SHA1(e39e0507f4f370432ef0ca11dbecef176716cec4) )
@@ -2081,13 +2061,13 @@ GAME( 1991, gulfstrma,gulfstrm, gulfstrm, gulfstrm, driver_device, 0, ROT270, "D
GAME( 1991, gulfstrmb,gulfstrm, gulfstrm, gulfstrm, driver_device, 0, ROT270, "Dooyong", "Gulf Storm (set 3)", MACHINE_SUPPORTS_SAVE )
GAME( 1991, gulfstrmm,gulfstrm, gulfstrm, gulfstrm, driver_device, 0, ROT270, "Dooyong (Media Shoji license)", "Gulf Storm (Media Shoji)", MACHINE_SUPPORTS_SAVE )
-GAME( 1991, pollux, 0, pollux, pollux, driver_device, 0, ROT270, "Dooyong", "Pollux (set 1)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
-GAME( 1991, polluxa, pollux, pollux, pollux, driver_device, 0, ROT270, "Dooyong", "Pollux (set 2)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
-GAME( 1991, polluxa2, pollux, pollux, pollux, driver_device, 0, ROT270, "Dooyong", "Pollux (set 3)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) /* Original Dooyong Board distributed by TCH */
-GAME( 1991, polluxn, pollux, pollux, pollux, driver_device, 0, ROT270, "Dooyong (NTC / Atlus license)", "Pollux (Japan, NTC license, distributed by Atlus)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
+GAME( 1991, pollux, 0, pollux, pollux, driver_device, 0, ROT270, "Dooyong", "Pollux (set 1)", MACHINE_SUPPORTS_SAVE )
+GAME( 1991, polluxa, pollux, pollux, pollux, driver_device, 0, ROT270, "Dooyong", "Pollux (set 2)", MACHINE_SUPPORTS_SAVE )
+GAME( 1991, polluxa2, pollux, pollux, pollux, driver_device, 0, ROT270, "Dooyong", "Pollux (set 3)", MACHINE_SUPPORTS_SAVE ) /* Original Dooyong Board distributed by TCH */
+GAME( 1991, polluxn, pollux, pollux, pollux, driver_device, 0, ROT270, "Dooyong (NTC / Atlus license)", "Pollux (Japan, NTC license, distributed by Atlus)", MACHINE_SUPPORTS_SAVE )
-GAME( 1992, flytiger, 0, flytiger, flytiger, driver_device, 0, ROT270, "Dooyong", "Flying Tiger (set 1)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
-GAME( 1992, flytigera,flytiger, flytiger, flytiger, driver_device, 0, ROT270, "Dooyong", "Flying Tiger (set 2)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
+GAME( 1992, flytiger, 0, flytiger, flytiger, driver_device, 0, ROT270, "Dooyong", "Flying Tiger (set 1)", MACHINE_SUPPORTS_SAVE )
+GAME( 1992, flytigera,flytiger, flytiger, flytiger, driver_device, 0, ROT270, "Dooyong", "Flying Tiger (set 2)", MACHINE_SUPPORTS_SAVE )
GAME( 1993, bluehawk, 0, bluehawk, bluehawk, driver_device, 0, ROT270, "Dooyong", "Blue Hawk", MACHINE_SUPPORTS_SAVE )
GAME( 1993, bluehawkn,bluehawk, bluehawk, bluehawk, driver_device, 0, ROT270, "Dooyong (NTC license)", "Blue Hawk (NTC)", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/dragrace.cpp b/src/mame/drivers/dragrace.cpp
index fc5d0f6e5a7..5e53f685474 100644
--- a/src/mame/drivers/dragrace.cpp
+++ b/src/mame/drivers/dragrace.cpp
@@ -1,4 +1,4 @@
-// license:???
+// license:BSD-3-Clause
// copyright-holders:Stefan Jokisch
/***************************************************************************
@@ -29,8 +29,8 @@ TIMER_DEVICE_CALLBACK_MEMBER(dragrace_state::dragrace_frame_callback)
case 0x10: m_gear[i] = 0; break;
}
}
- output_set_value("P1gear", m_gear[0]);
- output_set_value("P2gear", m_gear[1]);
+ output().set_value("P1gear", m_gear[0]);
+ output().set_value("P2gear", m_gear[1]);
/* watchdog is disabled during service mode */
machine().watchdog_enable(ioport("IN0")->read() & 0x20);
@@ -70,8 +70,8 @@ void dragrace_state::dragrace_update_misc_flags( address_space &space )
* 0x091f = set Player 2 Start Lamp 0x80000000
* 0x0938 = clear 0x0918 - 0x091f
*/
- set_led_status(machine(), 0, m_misc_flags & 0x00008000);
- set_led_status(machine(), 1, m_misc_flags & 0x80000000);
+ output().set_led_value(0, m_misc_flags & 0x00008000);
+ output().set_led_value(1, m_misc_flags & 0x80000000);
m_discrete->write(space, DRAGRACE_MOTOR1_DATA, ~m_misc_flags & 0x0000001f); // Speed1 data*
m_discrete->write(space, DRAGRACE_EXPLODE1_EN, (m_misc_flags & 0x00000020) ? 1: 0); // Explosion1 enable
@@ -90,8 +90,8 @@ void dragrace_state::dragrace_update_misc_flags( address_space &space )
m_discrete->write(space, DRAGRACE_HITONE_EN, (m_misc_flags & 0x20000000) ? 1: 0); // HiTone enable
// the tachometers are driven from the same frequency generator that creates the engine sound
- output_set_value("tachometer", ~m_misc_flags & 0x0000001f);
- output_set_value("tachometer2", (~m_misc_flags & 0x001f0000) >> 0x10);
+ output().set_value("tachometer", ~m_misc_flags & 0x0000001f);
+ output().set_value("tachometer2", (~m_misc_flags & 0x001f0000) >> 0x10);
}
WRITE8_MEMBER(dragrace_state::dragrace_misc_w)
diff --git a/src/mame/drivers/dreamwld.cpp b/src/mame/drivers/dreamwld.cpp
index 7f4d26beb9b..85725dd36ab 100644
--- a/src/mame/drivers/dreamwld.cpp
+++ b/src/mame/drivers/dreamwld.cpp
@@ -122,7 +122,7 @@ public:
required_shared_ptr<UINT32> m_vregs;
required_shared_ptr<UINT32> m_workram;
- UINT16* m_lineram16;
+ std::unique_ptr<UINT16[]> m_lineram16;
DECLARE_READ16_MEMBER(lineram16_r) { return m_lineram16[offset]; }
DECLARE_WRITE16_MEMBER(lineram16_w) { COMBINE_DATA(&m_lineram16[offset]); }
@@ -133,8 +133,8 @@ public:
int m_tilebank[2];
int m_tilebankold[2];
- UINT32* m_spritebuf1;
- UINT32* m_spritebuf2;
+ std::unique_ptr<UINT32[]> m_spritebuf1;
+ std::unique_ptr<UINT32[]> m_spritebuf2;
/* misc */
int m_protindex;
@@ -161,8 +161,8 @@ public:
void dreamwld_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect )
{
gfx_element *gfx = m_gfxdecode->gfx(0);
- UINT32 *source = m_spritebuf1;
- UINT32 *finish = m_spritebuf1 + 0x1000 / 4;
+ UINT32 *source = m_spritebuf1.get();
+ UINT32 *finish = m_spritebuf1.get() + 0x1000 / 4;
UINT16 *redirect = (UINT16 *)memregion("spritelut")->base();
int xoffset = 4;
@@ -271,11 +271,11 @@ void dreamwld_state::video_start()
m_bg2_tilemap->set_scroll_rows(64*16); // line scrolling
m_bg2_tilemap->set_scroll_cols(1);
- m_spritebuf1 = auto_alloc_array(machine(), UINT32, 0x2000 / 4);
- m_spritebuf2 = auto_alloc_array(machine(), UINT32, 0x2000 / 4);
+ m_spritebuf1 = std::make_unique<UINT32[]>(0x2000 / 4);
+ m_spritebuf2 = std::make_unique<UINT32[]>(0x2000 / 4);
- m_lineram16 = (UINT16*)auto_alloc_array_clear(this->machine(), UINT16, 0x400 / 2);
- save_pointer(NAME(m_lineram16), 0x400/2);
+ m_lineram16 = make_unique_clear<UINT16[]>(0x400 / 2);
+ save_pointer(NAME(m_lineram16.get()), 0x400/2);
}
@@ -284,8 +284,8 @@ void dreamwld_state::screen_eof_dreamwld(screen_device &screen, bool state)
// rising edge
if (state)
{
- memcpy(m_spritebuf2, m_spritebuf1, 0x2000);
- memcpy(m_spritebuf1, m_spriteram, 0x2000);
+ memcpy(m_spritebuf2.get(), m_spritebuf1.get(), 0x2000);
+ memcpy(m_spritebuf1.get(), m_spriteram, 0x2000);
}
}
diff --git a/src/mame/drivers/drgnmst.cpp b/src/mame/drivers/drgnmst.cpp
index 357477e03c4..4ecbee712d5 100644
--- a/src/mame/drivers/drgnmst.cpp
+++ b/src/mame/drivers/drgnmst.cpp
@@ -45,9 +45,9 @@ Notes:
WRITE16_MEMBER(drgnmst_state::drgnmst_coin_w)
{
- coin_counter_w(machine(), 0, data & 0x100);
- coin_lockout_w(machine(), 0, ~data & 0x400);
- coin_lockout_w(machine(), 1, ~data & 0x800);
+ machine().bookkeeping().coin_counter_w(0, data & 0x100);
+ machine().bookkeeping().coin_lockout_w(0, ~data & 0x400);
+ machine().bookkeeping().coin_lockout_w(1, ~data & 0x800);
}
WRITE16_MEMBER(drgnmst_state::drgnmst_snd_command_w)
diff --git a/src/mame/drivers/dunhuang.cpp b/src/mame/drivers/dunhuang.cpp
index 438affcd623..44c44c38510 100644
--- a/src/mame/drivers/dunhuang.cpp
+++ b/src/mame/drivers/dunhuang.cpp
@@ -121,7 +121,6 @@ public:
DECLARE_READ8_MEMBER(dunhuang_service_r);
DECLARE_READ8_MEMBER(dunhuang_input_r);
DECLARE_WRITE8_MEMBER(dunhuang_rombank_w);
- DECLARE_WRITE8_MEMBER(dunhuang_82_w);
DECLARE_READ8_MEMBER(dunhuang_dsw_r);
TILE_GET_INFO_MEMBER(get_tile_info);
TILE_GET_INFO_MEMBER(get_tile_info2);
@@ -480,7 +479,7 @@ WRITE8_MEMBER(dunhuang_state::dunhuang_rombank_w)
membank("bank1")->set_entry(((data >> 2) & 0x7));
// COIN OUT: data & 0x20
- coin_counter_w(machine(), 0, data & 0x40);
+ machine().bookkeeping().coin_counter_w(0, data & 0x40);
m_hopper = data & 0x80;
}
diff --git a/src/mame/drivers/dvk_kcgd.cpp b/src/mame/drivers/dvk_kcgd.cpp
index a95755fac8a..eb2236cee5d 100644
--- a/src/mame/drivers/dvk_kcgd.cpp
+++ b/src/mame/drivers/dvk_kcgd.cpp
@@ -76,9 +76,6 @@ public:
};
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
- DECLARE_WRITE_LINE_MEMBER(write_keyboard_clock);
- DECLARE_WRITE_LINE_MEMBER(write_line_clock);
-
DECLARE_READ16_MEMBER(vram_addr_r);
DECLARE_READ16_MEMBER(vram_data_r);
DECLARE_READ16_MEMBER(vram_mmap_r);
@@ -107,7 +104,7 @@ private:
int palette_index, vram_addr;
UINT8 palette[16];
} m_video;
- UINT32 *m_videoram;
+ std::unique_ptr<UINT32[]> m_videoram;
protected:
required_device<cpu_device> m_maincpu;
@@ -158,7 +155,7 @@ void kcgd_state::video_start()
// screen_device *screen = machine().device<screen_device>("screen");
// 64 kwords, word size is 17 bits
- m_videoram = auto_alloc_array(machine(), UINT32, 65536);
+ m_videoram = std::make_unique<UINT32[]>(65536);
m_tmpclip = rectangle(0, KCGD_DISP_HORZ-1, 0, KCGD_DISP_VERT-1);
m_tmpbmp.allocate(KCGD_DISP_HORZ, KCGD_DISP_VERT);
diff --git a/src/mame/drivers/dynax.cpp b/src/mame/drivers/dynax.cpp
index 591a1530e7f..e09b4e22c24 100644
--- a/src/mame/drivers/dynax.cpp
+++ b/src/mame/drivers/dynax.cpp